   ´ª °ª ¬ª {"files":{"_index.html":{"size":2481,"offset":"0"},"cdv-electron-main.js":{"size":3361,"offset":"2481"},"cdv-electron-settings.json":{"size":175,"offset":"5842"},"config.xml":{"size":539,"offset":"6017"},"cordova.js":{"size":52903,"offset":"6556"},"cordova_plugins.js":{"size":9072,"offset":"59459"},"index.html":{"size":91,"offset":"68531"},"manifest.json":{"size":303,"offset":"68622"},"package.json":{"size":601,"offset":"68925"},"test.html":{"size":1816,"offset":"69526"},"test.js":{"size":3212,"offset":"71342"},"plugins":{"files":{"cordova-plugin-zip":{"files":{"zip.js":{"size":840,"offset":"74554"}}},"cordova-plugin-kiwibridge":{"files":{"www":{"files":{"AppManager.js":{"size":1071,"offset":"75394"},"ControlManager.js":{"size":1163,"offset":"76465"},"DriveManager.js":{"size":639,"offset":"77628"},"FileTransferManager.js":{"size":711,"offset":"78267"},"FirmwareManager.js":{"size":1496,"offset":"78978"},"MemoryManager.js":{"size":636,"offset":"80474"},"NetworkManager.js":{"size":661,"offset":"81110"},"PowerManager.js":{"size":1267,"offset":"81771"},"ScreenManager.js":{"size":1166,"offset":"83038"},"SensorManager.js":{"size":650,"offset":"84204"},"SoundManager.js":{"size":949,"offset":"84854"},"TimeManager.js":{"size":626,"offset":"85803"}}}}},"cordova-plugin-file":{"files":{"www":{"files":{"DirectoryEntry.js":{"size":4709,"offset":"86429"},"DirectoryReader.js":{"size":2752,"offset":"91138"},"Entry.js":{"size":9897,"offset":"93890"},"File.js":{"size":2742,"offset":"103787"},"FileEntry.js":{"size":3451,"offset":"106529"},"FileError.js":{"size":1511,"offset":"109980"},"FileReader.js":{"size":10551,"offset":"111491"},"FileSystem.js":{"size":1988,"offset":"122042"},"FileUploadOptions.js":{"size":1859,"offset":"124030"},"FileUploadResult.js":{"size":1139,"offset":"125889"},"FileWriter.js":{"size":10614,"offset":"127028"},"Flags.js":{"size":1364,"offset":"137642"},"LocalFileSystem.js":{"size":985,"offset":"139006"},"Metadata.js":{"size":1516,"offset":"139991"},"ProgressEvent.js":{"size":2572,"offset":"141507"},"fileSystemPaths.js":{"size":2576,"offset":"144079"},"fileSystems.js":{"size":1075,"offset":"146655"},"requestFileSystem.js":{"size":3272,"offset":"147730"},"resolveLocalFileSystemURI.js":{"size":4353,"offset":"151002"},"browser":{"files":{"FileSystem.js":{"size":1237,"offset":"155355"},"Preparing.js":{"size":8055,"offset":"156592"},"isChrome.js":{"size":1234,"offset":"164647"}}}}},"src":{"files":{"browser":{"files":{"FileProxy.js":{"size":43894,"offset":"165881"}}}}}}}}},"js":{"files":{"index.js":{"size":1664,"offset":"209775"}}},"img":{"files":{"logo.png":{"size":21814,"offset":"211439"}}},"htmlApp":{"files":{"build.js":{"size":133,"offset":"233253"},"config.xml":{"size":161,"offset":"233386"},"index.html":{"size":829,"offset":"233547"},"kiwi-lighter-1.js":{"size":174,"offset":"234376"},"main.css":{"size":77920,"offset":"234550"},"main.css.map":{"size":85,"offset":"312470"},"main.js":{"size":1023259,"offset":"312555"},"main.js.map":{"size":4182225,"offset":"1335814"},"pdf-viewer":{"files":{"pdf-child.js":{"size":80512,"offset":"5518039"},"pdf-child.js.map":{"size":97943,"offset":"5598551"},"pdf.js":{"size":765242,"offset":"5696494"},"pdf.worker.js":{"size":1683839,"offset":"6461736"},"viewer.css":{"size":58008,"offset":"8145575"},"viewer.html":{"size":22769,"offset":"8203583"},"viewer.js":{"size":472617,"offset":"8226352"},"locale":{"files":{"locale.properties":{"size":45,"offset":"8698969"},"en-US":{"files":{"viewer.properties":{"size":10777,"offset":"8699014"}}}}},"images":{"files":{"annotation-check.svg":{"size":415,"offset":"8709791"},"annotation-comment.svg":{"size":883,"offset":"8710206"},"annotation-help.svg":{"size":2168,"offset":"8711089"},"annotation-insert.svg":{"size":408,"offset":"8713257"},"annotation-key.svg":{"size":1452,"offset":"8713665"},"annotation-newparagraph.svg":{"size":426,"offset":"8715117"},"annotation-noicon.svg":{"size":158,"offset":"8715543"},"annotation-note.svg":{"size":1041,"offset":"8715701"},"annotation-paragraph.svg":{"size":1143,"offset":"8716742"},"findbarButton-next-rtl.png":{"size":199,"offset":"8717885"},"findbarButton-next-rtl@2x.png":{"size":304,"offset":"8718084"},"findbarButton-next.png":{"size":193,"offset":"8718388"},"findbarButton-next@2x.png":{"size":296,"offset":"8718581"},"findbarButton-previous-rtl.png":{"size":193,"offset":"8718877"},"findbarButton-previous-rtl@2x.png":{"size":296,"offset":"8719070"},"findbarButton-previous.png":{"size":199,"offset":"8719366"},"findbarButton-previous@2x.png":{"size":304,"offset":"8719565"},"grab.cur":{"size":326,"offset":"8719869"},"grabbing.cur":{"size":326,"offset":"8720195"},"loading-icon.gif":{"size":2545,"offset":"8720521"},"loading-small.png":{"size":7402,"offset":"8723066"},"loading-small@2x.png":{"size":16131,"offset":"8730468"},"secondaryToolbarButton-documentProperties.png":{"size":403,"offset":"8746599"},"secondaryToolbarButton-documentProperties@2x.png":{"size":933,"offset":"8747002"},"secondaryToolbarButton-firstPage.png":{"size":179,"offset":"8747935"},"secondaryToolbarButton-firstPage@2x.png":{"size":266,"offset":"8748114"},"secondaryToolbarButton-handTool.png":{"size":301,"offset":"8748380"},"secondaryToolbarButton-handTool@2x.png":{"size":583,"offset":"8748681"},"secondaryToolbarButton-lastPage.png":{"size":175,"offset":"8749264"},"secondaryToolbarButton-lastPage@2x.png":{"size":276,"offset":"8749439"},"secondaryToolbarButton-rotateCcw.png":{"size":360,"offset":"8749715"},"secondaryToolbarButton-rotateCcw@2x.png":{"size":731,"offset":"8750075"},"secondaryToolbarButton-rotateCw.png":{"size":359,"offset":"8750806"},"secondaryToolbarButton-rotateCw@2x.png":{"size":714,"offset":"8751165"},"secondaryToolbarButton-scrollHorizontal.png":{"size":218,"offset":"8751879"},"secondaryToolbarButton-scrollHorizontal@2x.png":{"size":332,"offset":"8752097"},"secondaryToolbarButton-scrollVertical.png":{"size":228,"offset":"8752429"},"secondaryToolbarButton-scrollVertical@2x.png":{"size":349,"offset":"8752657"},"secondaryToolbarButton-scrollWrapped.png":{"size":297,"offset":"8753006"},"secondaryToolbarButton-scrollWrapped@2x.png":{"size":490,"offset":"8753303"},"secondaryToolbarButton-selectTool.png":{"size":461,"offset":"8753793"},"secondaryToolbarButton-selectTool@2x.png":{"size":1067,"offset":"8754254"},"secondaryToolbarButton-spreadEven.png":{"size":347,"offset":"8755321"},"secondaryToolbarButton-spreadEven@2x.png":{"size":694,"offset":"8755668"},"secondaryToolbarButton-spreadNone.png":{"size":179,"offset":"8756362"},"secondaryToolbarButton-spreadNone@2x.png":{"size":261,"offset":"8756541"},"secondaryToolbarButton-spreadOdd.png":{"size":344,"offset":"8756802"},"secondaryToolbarButton-spreadOdd@2x.png":{"size":621,"offset":"8757146"},"shadow.png":{"size":290,"offset":"8757767"},"texture.png":{"size":2417,"offset":"8758057"},"toolbarButton-bookmark.png":{"size":174,"offset":"8760474"},"toolbarButton-bookmark@2x.png":{"size":260,"offset":"8760648"},"toolbarButton-download.png":{"size":259,"offset":"8760908"},"toolbarButton-download@2x.png":{"size":425,"offset":"8761167"},"toolbarButton-menuArrows.png":{"size":107,"offset":"8761592"},"toolbarButton-menuArrows@2x.png":{"size":152,"offset":"8761699"},"toolbarButton-openFile.png":{"size":295,"offset":"8761851"},"toolbarButton-openFile@2x.png":{"size":550,"offset":"8762146"},"toolbarButton-pageDown-rtl.png":{"size":242,"offset":"8762696"},"toolbarButton-pageDown-rtl@2x.png":{"size":398,"offset":"8762938"},"toolbarButton-pageDown.png":{"size":238,"offset":"8763336"},"toolbarButton-pageDown@2x.png":{"size":396,"offset":"8763574"},"toolbarButton-pageUp-rtl.png":{"size":245,"offset":"8763970"},"toolbarButton-pageUp-rtl@2x.png":{"size":405,"offset":"8764215"},"toolbarButton-pageUp.png":{"size":246,"offset":"8764620"},"toolbarButton-pageUp@2x.png":{"size":403,"offset":"8764866"},"toolbarButton-presentationMode.png":{"size":321,"offset":"8765269"},"toolbarButton-presentationMode@2x.png":{"size":586,"offset":"8765590"},"toolbarButton-print.png":{"size":257,"offset":"8766176"},"toolbarButton-print@2x.png":{"size":464,"offset":"8766433"},"toolbarButton-search.png":{"size":309,"offset":"8766897"},"toolbarButton-search@2x.png":{"size":653,"offset":"8767206"},"toolbarButton-secondaryToolbarToggle-rtl.png":{"size":246,"offset":"8767859"},"toolbarButton-secondaryToolbarToggle-rtl@2x.png":{"size":456,"offset":"8768105"},"toolbarButton-secondaryToolbarToggle.png":{"size":243,"offset":"8768561"},"toolbarButton-secondaryToolbarToggle@2x.png":{"size":458,"offset":"8768804"},"toolbarButton-sidebarToggle-rtl.png":{"size":225,"offset":"8769262"},"toolbarButton-sidebarToggle-rtl@2x.png":{"size":344,"offset":"8769487"},"toolbarButton-sidebarToggle.png":{"size":225,"offset":"8769831"},"toolbarButton-sidebarToggle@2x.png":{"size":331,"offset":"8770056"},"toolbarButton-viewAttachments.png":{"size":384,"offset":"8770387"},"toolbarButton-viewAttachments@2x.png":{"size":859,"offset":"8770771"},"toolbarButton-viewOutline-rtl.png":{"size":177,"offset":"8771630"},"toolbarButton-viewOutline-rtl@2x.png":{"size":394,"offset":"8771807"},"toolbarButton-viewOutline.png":{"size":178,"offset":"8772201"},"toolbarButton-viewOutline@2x.png":{"size":331,"offset":"8772379"},"toolbarButton-viewThumbnail.png":{"size":185,"offset":"8772710"},"toolbarButton-viewThumbnail@2x.png":{"size":219,"offset":"8772895"},"toolbarButton-zoomIn.png":{"size":136,"offset":"8773114"},"toolbarButton-zoomIn@2x.png":{"size":160,"offset":"8773250"},"toolbarButton-zoomOut.png":{"size":88,"offset":"8773410"},"toolbarButton-zoomOut@2x.png":{"size":109,"offset":"8773498"},"treeitem-collapsed-rtl.png":{"size":143,"offset":"8773607"},"treeitem-collapsed-rtl@2x.png":{"size":167,"offset":"8773750"},"treeitem-collapsed.png":{"size":128,"offset":"8773917"},"treeitem-collapsed@2x.png":{"size":149,"offset":"8774045"},"treeitem-expanded.png":{"size":125,"offset":"8774194"},"treeitem-expanded@2x.png":{"size":172,"offset":"8774319"}}}}},"assets":{"files":{"4304535f.svg":{"size":2273,"offset":"8774491"},"6f0b124e.mp4":{"size":2290,"offset":"8776764"},"91e42db1.png":{"size":68,"offset":"8779054"},"924178c7.svg":{"size":3660,"offset":"8779122"},"af7ae505.woff2":{"size":77160,"offset":"8782782"},"fee66e71.woff":{"size":98024,"offset":"8859942"}}}}},"css":{"files":{"index.css":{"size":3599,"offset":"8957966"}}},"cordova-js-src":{"files":{"confighelper.js":{"size":2820,"offset":"8961565"},"exec.js":{"size":4670,"offset":"8964385"},"platform.js":{"size":1420,"offset":"8969055"}}},"node_modules":{"files":{"7zip-bin":{"unpacked":true,"files":{"7x.sh":{"size":235,"unpacked":true},"LICENSE.txt":{"size":1087,"unpacked":true},"index.js":{"size":486,"unpacked":true},"package.json":{"size":390,"unpacked":true},"mac":{"unpacked":true,"files":{"7za":{"size":1682640,"unpacked":true}}},"linux":{"files":{"x64":{"unpacked":true,"files":{"7za":{"size":1457384,"unpacked":true},"build.sh":{"size":266,"unpacked":true},"do-build.sh":{"size":646,"unpacked":true}}},"ia32":{"unpacked":true,"files":{"7za":{"size":1638192,"unpacked":true}}},"arm64":{"unpacked":true,"files":{"7za":{"size":1155640,"unpacked":true}}},"arm":{"unpacked":true,"files":{"7za":{"size":1006780,"unpacked":true}}}}}}},"@types":{"files":{"debug":{"files":{"LICENSE":{"size":1183,"offset":"19328529"},"package.json":{"size":552,"offset":"19329712"}}},"node":{"files":{"LICENSE":{"size":1141,"offset":"19330264"},"package.json":{"size":646,"offset":"19331405"}}}}},"abbrev":{"files":{"LICENSE":{"size":2011,"offset":"19332051"},"abbrev.js":{"size":1763,"offset":"19334062"},"package.json":{"size":486,"offset":"19335825"}}},"ajv":{"files":{".tonic_example.js":{"size":439,"offset":"19336311"},"LICENSE":{"size":1090,"offset":"19336750"},"package.json":{"size":1635,"offset":"19337840"},"scripts":{"files":{".eslintrc.yml":{"size":62,"offset":"19339475"},"bundle.js":{"size":1795,"offset":"19339537"},"compile-dots.js":{"size":2431,"offset":"19341332"},"info":{"size":289,"offset":"19343763","executable":true},"prepare-tests":{"size":269,"offset":"19344052","executable":true},"publish-built-version":{"size":842,"offset":"19344321","executable":true},"travis-gh-pages":{"size":874,"offset":"19345163","executable":true}}},"lib":{"files":{"ajv.js":{"size":15837,"offset":"19346037"},"cache.js":{"size":409,"offset":"19361874"},"data.js":{"size":1048,"offset":"19362283"},"definition_schema.js":{"size":872,"offset":"19363331"},"keyword.js":{"size":3911,"offset":"19364203"},"refs":{"files":{"data.json":{"size":551,"offset":"19368114"},"json-schema-draft-04.json":{"size":4357,"offset":"19368665"},"json-schema-draft-06.json":{"size":4445,"offset":"19373022"},"json-schema-draft-07.json":{"size":4879,"offset":"19377467"},"json-schema-secure.json":{"size":2572,"offset":"19382346"}}},"dotjs":{"files":{"README.md":{"size":149,"offset":"19384918"},"_limit.js":{"size":7395,"offset":"19385067"},"_limitItems.js":{"size":2704,"offset":"19392462"},"_limitLength.js":{"size":2825,"offset":"19395166"},"_limitProperties.js":{"size":2742,"offset":"19397991"},"allOf.js":{"size":1349,"offset":"19400733"},"anyOf.js":{"size":2925,"offset":"19402082"},"comment.js":{"size":573,"offset":"19405007"},"const.js":{"size":2113,"offset":"19405580"},"contains.js":{"size":3370,"offset":"19407693"},"custom.js":{"size":9770,"offset":"19411063"},"dependencies.js":{"size":7720,"offset":"19420833"},"enum.js":{"size":2586,"offset":"19428553"},"format.js":{"size":5565,"offset":"19431139"},"if.js":{"size":4159,"offset":"19436704"},"index.js":{"size":1100,"offset":"19440863"},"items.js":{"size":6214,"offset":"19441963"},"multipleOf.js":{"size":2807,"offset":"19448177"},"not.js":{"size":3460,"offset":"19450984"},"oneOf.js":{"size":3188,"offset":"19454444"},"pattern.js":{"size":2586,"offset":"19457632"},"properties.js":{"size":15121,"offset":"19460218"},"propertyNames.js":{"size":3607,"offset":"19475339"},"ref.js":{"size":4711,"offset":"19478946"},"required.js":{"size":12395,"offset":"19483657"},"uniqueItems.js":{"size":3694,"offset":"19496052"},"validate.js":{"size":20018,"offset":"19499746"}}},"dot":{"files":{"_limit.jst":{"size":3932,"offset":"19519764"},"_limitItems.jst":{"size":353,"offset":"19523696"},"_limitLength.jst":{"size":358,"offset":"19524049"},"_limitProperties.jst":{"size":376,"offset":"19524407"},"allOf.jst":{"size":609,"offset":"19524783"},"anyOf.jst":{"size":921,"offset":"19525392"},"coerce.def":{"size":1979,"offset":"19526313"},"comment.jst":{"size":322,"offset":"19528292"},"const.jst":{"size":280,"offset":"19528614"},"contains.jst":{"size":1188,"offset":"19528894"},"custom.jst":{"size":4945,"offset":"19530082"},"defaults.def":{"size":1285,"offset":"19535027"},"definitions.def":{"size":4022,"offset":"19536312"},"dependencies.jst":{"size":1868,"offset":"19540334"},"enum.jst":{"size":552,"offset":"19542202"},"errors.def":{"size":8282,"offset":"19542754"},"format.jst":{"size":3136,"offset":"19551036"},"if.jst":{"size":1618,"offset":"19554172"},"items.jst":{"size":2610,"offset":"19555790"},"missing.def":{"size":1194,"offset":"19558400"},"multipleOf.jst":{"size":644,"offset":"19559594"},"not.jst":{"size":861,"offset":"19560238"},"oneOf.jst":{"size":1150,"offset":"19561099"},"pattern.jst":{"size":348,"offset":"19562249"},"properties.jst":{"size":7725,"offset":"19562597"},"propertyNames.jst":{"size":1284,"offset":"19570322"},"ref.jst":{"size":2454,"offset":"19571606"},"required.jst":{"size":2868,"offset":"19574060"},"uniqueItems.jst":{"size":1696,"offset":"19576928"},"validate.jst":{"size":7717,"offset":"19578624"}}},"compile":{"files":{"async.js":{"size":2644,"offset":"19586341"},"equal.js":{"size":176,"offset":"19588985"},"error_classes.js":{"size":828,"offset":"19589161"},"formats.js":{"size":12095,"offset":"19589989"},"index.js":{"size":10695,"offset":"19602084"},"resolve.js":{"size":7847,"offset":"19612779"},"rules.js":{"size":2021,"offset":"19620626"},"schema_obj.js":{"size":133,"offset":"19622647"},"ucs2length.js":{"size":558,"offset":"19622780"},"util.js":{"size":6974,"offset":"19623338"}}}}},"dist":{"files":{"ajv.bundle.js":{"size":272679,"offset":"19630312"},"ajv.min.js":{"size":122009,"offset":"19902991"},"ajv.min.js.map":{"size":140201,"offset":"20025000"}}}}},"ajv-keywords":{"files":{"LICENSE":{"size":1084,"offset":"20165201"},"index.js":{"size":761,"offset":"20166285"},"package.json":{"size":916,"offset":"20167046"},"keywords":{"files":{"_formatLimit.js":{"size":2309,"offset":"20167962"},"_util.js":{"size":402,"offset":"20170271"},"allRequired.js":{"size":474,"offset":"20170673"},"anyRequired.js":{"size":531,"offset":"20171147"},"deepProperties.js":{"size":1358,"offset":"20171678"},"deepRequired.js":{"size":1293,"offset":"20173036"},"dynamicDefaults.js":{"size":2008,"offset":"20174329"},"formatMaximum.js":{"size":70,"offset":"20176337"},"formatMinimum.js":{"size":70,"offset":"20176407"},"index.js":{"size":770,"offset":"20176477"},"instanceof.js":{"size":1328,"offset":"20177247"},"oneRequired.js":{"size":531,"offset":"20178575"},"patternRequired.js":{"size":412,"offset":"20179106"},"prohibited.js":{"size":544,"offset":"20179518"},"range.js":{"size":985,"offset":"20180062"},"regexp.js":{"size":959,"offset":"20181047"},"select.js":{"size":2215,"offset":"20182006"},"switch.js":{"size":817,"offset":"20184221"},"transform.js":{"size":2152,"offset":"20185038"},"typeof.js":{"size":818,"offset":"20187190"},"uniqueItemProperties.js":{"size":1845,"offset":"20188008"},"dotjs":{"files":{"README.md":{"size":158,"offset":"20189853"},"_formatLimit.js":{"size":7350,"offset":"20190011"},"patternRequired.js":{"size":2608,"offset":"20197361"},"switch.js":{"size":5854,"offset":"20199969"}}},"dot":{"files":{"_formatLimit.jst":{"size":3061,"offset":"20205823"},"patternRequired.jst":{"size":781,"offset":"20208884"},"switch.jst":{"size":1523,"offset":"20209665"}}}}}}},"ansi":{"files":{"History.md":{"size":604,"offset":"20218941"},"LICENSE":{"size":1102,"offset":"20219545"},"package.json":{"size":457,"offset":"20220647"},"lib":{"files":{"ansi.js":{"size":7974,"offset":"20221104"},"newlines.js":{"size":1528,"offset":"20229078"}}}}},"ansi-regex":{"files":{"index.js":{"size":135,"offset":"20233314"},"license":{"size":1119,"offset":"20233449"},"package.json":{"size":943,"offset":"20234568"}}},"ansi-styles":{"files":{"index.js":{"size":3574,"offset":"20235511"},"license":{"size":1109,"offset":"20239085"},"package.json":{"size":691,"offset":"20240194"}}},"app-builder-bin":{"unpacked":true,"files":{"index.js":{"size":507,"unpacked":true},"package.json":{"size":396,"unpacked":true},"mac":{"unpacked":true,"files":{"app-builder":{"size":17105068,"unpacked":true}}},"linux":{"files":{"x64":{"unpacked":true,"files":{"app-builder":{"size":15476096,"unpacked":true}}},"ia32":{"unpacked":true,"files":{"app-builder":{"size":12812096,"unpacked":true}}},"arm64":{"unpacked":true,"files":{"app-builder":{"size":14927328,"unpacked":true}}},"arm":{"unpacked":true,"files":{"app-builder":{"size":12864696,"unpacked":true}}}}}}},"app-builder-lib":{"files":{"package.json":{"size":1316,"offset":"20240885"},"scheme.json":{"size":246051,"offset":"20242201"},"templates":{"files":{"snap":{"files":{"snapcraft.yaml":{"size":4258,"offset":"20488252"}}},"nsis":{"files":{"assistedInstaller.nsh":{"size":4029,"offset":"20492510"},"assistedMessages.yml":{"size":19589,"offset":"20496539","executable":true},"common.nsh":{"size":2382,"offset":"20516128"},"empty-license.txt":{"size":10,"offset":"20518510"},"installSection.nsh":{"size":2484,"offset":"20518520"},"installer.nsi":{"size":1642,"offset":"20521004"},"messages.yml":{"size":5410,"offset":"20522646"},"multiUser.nsh":{"size":2811,"offset":"20528056"},"multiUserUi.nsh":{"size":8917,"offset":"20530867","executable":true},"oneClick.nsh":{"size":399,"offset":"20539784"},"portable.nsi":{"size":1174,"offset":"20540183"},"readme.md":{"size":1960,"offset":"20541357"},"uninstaller.nsh":{"size":2785,"offset":"20543317"},"include":{"files":{"FileAssociation.nsh":{"size":5258,"offset":"20546102"},"StdUtils.nsh":{"size":16329,"offset":"20551360"},"StrContains.nsh":{"size":1388,"offset":"20567689"},"UAC.nsh":{"size":8743,"offset":"20569077"},"allowOnlyOneInstallerInstance.nsh":{"size":2537,"offset":"20577820"},"extractAppPackage.nsh":{"size":1169,"offset":"20580357"},"getProcessInfo.nsh":{"size":3731,"offset":"20581526"},"installUtil.nsh":{"size":4634,"offset":"20585257"},"installer.nsh":{"size":7573,"offset":"20589891"},"nsProcess.nsh":{"size":664,"offset":"20597464"},"webPackage.nsh":{"size":1193,"offset":"20598128"}}}}},"msi":{"files":{"WixUI_Assisted.wxs":{"size":10959,"offset":"20599321"},"template.xml":{"size":3454,"offset":"20610280"}}},"linux":{"files":{"after-install.tpl":{"size":112,"offset":"20613734"},"after-remove.tpl":{"size":82,"offset":"20613846"},"desktop.tpl":{"size":112,"offset":"20613928"}}},"icons":{"files":{"proton-native":{"files":{"proton-native.icns":{"size":231287,"offset":"20614040"},"proton-native.ico":{"size":370070,"offset":"20845327"},"proton-native.svg":{"size":575,"offset":"21215397"},"linux":{"files":{"1024x1024.png":{"size":67117,"offset":"21215972"},"128x128.png":{"size":6119,"offset":"21283089"},"16x16.png":{"size":630,"offset":"21289208"},"24x24.png":{"size":1090,"offset":"21289838"},"256x256.png":{"size":9712,"offset":"21290928"},"32x32.png":{"size":1481,"offset":"21300640"},"48x48.png":{"size":2165,"offset":"21302121"},"512x512.png":{"size":23832,"offset":"21304286"},"64x64.png":{"size":2784,"offset":"21328118"},"96x96.png":{"size":4366,"offset":"21330902"}}}}},"electron-linux":{"files":{"128x128.png":{"size":18107,"offset":"21335268"},"16x16.png":{"size":832,"offset":"21353375"},"24x24.png":{"size":1663,"offset":"21354207"},"256x256.png":{"size":37977,"offset":"21355870"},"32x32.png":{"size":2021,"offset":"21393847"},"48x48.png":{"size":4476,"offset":"21395868"},"64x64.png":{"size":6621,"offset":"21400344"},"96x96.png":{"size":11888,"offset":"21406965"}}}}},"appx":{"files":{"appxmanifest.xml":{"size":1665,"offset":"21418853"},"priconfig.xml":{"size":1185,"offset":"21420518"}}}}},"out":{"files":{"Framework.js":{"size":262,"offset":"21421703"},"Framework.js.map":{"size":1854,"offset":"21421965"},"ProtonFramework.js":{"size":4520,"offset":"21423819"},"ProtonFramework.js.map":{"size":6985,"offset":"21428339"},"appInfo.js":{"size":5875,"offset":"21435324"},"appInfo.js.map":{"size":9607,"offset":"21441199"},"binDownload.js":{"size":2232,"offset":"21450806"},"binDownload.js.map":{"size":4084,"offset":"21453038"},"configuration.js":{"size":75,"offset":"21457122"},"configuration.js.map":{"size":68,"offset":"21457197"},"core.js":{"size":2458,"offset":"21457265"},"core.js.map":{"size":5235,"offset":"21459723"},"errorMessages.js":{"size":568,"offset":"21464958"},"errorMessages.js.map":{"size":504,"offset":"21465526"},"fileMatcher.js":{"size":12756,"offset":"21466030"},"fileMatcher.js.map":{"size":22092,"offset":"21478786"},"fileTransformer.js":{"size":5163,"offset":"21500878"},"fileTransformer.js.map":{"size":7645,"offset":"21506041"},"forge-maker.js":{"size":1193,"offset":"21513686"},"forge-maker.js.map":{"size":1051,"offset":"21514879"},"index.js":{"size":5898,"offset":"21515930"},"index.js.map":{"size":7810,"offset":"21521828"},"linuxPackager.js":{"size":5327,"offset":"21529638"},"linuxPackager.js.map":{"size":7723,"offset":"21534965"},"macPackager.js":{"size":17013,"offset":"21542688"},"macPackager.js.map":{"size":26043,"offset":"21559701"},"packager.js":{"size":23524,"offset":"21585744"},"packager.js.map":{"size":36156,"offset":"21609268"},"packagerApi.js":{"size":73,"offset":"21645424"},"packagerApi.js.map":{"size":68,"offset":"21645497"},"platformPackager.js":{"size":29060,"offset":"21645565"},"platformPackager.js.map":{"size":49140,"offset":"21674625"},"winPackager.js":{"size":16914,"offset":"21723765"},"winPackager.js.map":{"size":25273,"offset":"21740679"},"wine.js":{"size":1107,"offset":"21765952"},"wine.js.map":{"size":1899,"offset":"21767059"},"vm":{"files":{"MonoVm.js":{"size":852,"offset":"21768958"},"MonoVm.js.map":{"size":1303,"offset":"21769810"},"ParallelsVm.js":{"size":4787,"offset":"21771113"},"ParallelsVm.js.map":{"size":7570,"offset":"21775900"},"WineVm.js":{"size":1321,"offset":"21783470"},"WineVm.js.map":{"size":1356,"offset":"21784791"},"vm.js":{"size":2248,"offset":"21786147"},"vm.js.map":{"size":2329,"offset":"21788395"}}},"util":{"files":{"AppFileWalker.js":{"size":3808,"offset":"21790724"},"AppFileWalker.js.map":{"size":6052,"offset":"21794532"},"NodeModuleCopyHelper.js":{"size":6142,"offset":"21800584"},"NodeModuleCopyHelper.js.map":{"size":9091,"offset":"21806726"},"appBuilder.js":{"size":853,"offset":"21815817"},"appBuilder.js.map":{"size":1338,"offset":"21816670"},"appFileCopier.js":{"size":13704,"offset":"21818008"},"appFileCopier.js.map":{"size":19360,"offset":"21831712"},"bundledTool.js":{"size":605,"offset":"21851072"},"bundledTool.js.map":{"size":1101,"offset":"21851677"},"cacheManager.js":{"size":4405,"offset":"21852778"},"cacheManager.js.map":{"size":5421,"offset":"21857183"},"config.js":{"size":11031,"offset":"21862604"},"config.js.map":{"size":16981,"offset":"21873635"},"filter.js":{"size":3311,"offset":"21890616"},"filter.js.map":{"size":4867,"offset":"21893927"},"flags.js":{"size":796,"offset":"21898794"},"flags.js.map":{"size":778,"offset":"21899590"},"hash.js":{"size":926,"offset":"21900368"},"hash.js.map":{"size":1438,"offset":"21901294"},"langs.js":{"size":7358,"offset":"21902732"},"langs.js.map":{"size":20010,"offset":"21910090"},"license.js":{"size":3092,"offset":"21930100"},"license.js.map":{"size":4076,"offset":"21933192"},"macosVersion.js":{"size":2728,"offset":"21937268"},"macosVersion.js.map":{"size":2099,"offset":"21939996"},"macroExpander.js":{"size":2375,"offset":"21942095"},"macroExpander.js.map":{"size":3914,"offset":"21944470"},"packageDependencies.js":{"size":12618,"offset":"21948384"},"packageDependencies.js.map":{"size":20725,"offset":"21961002"},"packageMetadata.js":{"size":5811,"offset":"21981727"},"packageMetadata.js.map":{"size":7893,"offset":"21987538"},"pathManager.js":{"size":998,"offset":"21995431"},"pathManager.js.map":{"size":815,"offset":"21996429"},"repositoryInfo.js":{"size":3881,"offset":"21997244"},"repositoryInfo.js.map":{"size":5114,"offset":"22001125"},"timer.js":{"size":815,"offset":"22006239"},"timer.js.map":{"size":1397,"offset":"22007054"},"yarn.js":{"size":6875,"offset":"22008451"},"yarn.js.map":{"size":11038,"offset":"22015326"}}},"targets":{"files":{"AppImageTarget.js":{"size":5132,"offset":"22026364"},"AppImageTarget.js.map":{"size":6821,"offset":"22031496"},"AppxTarget.js":{"size":15228,"offset":"22038317"},"AppxTarget.js.map":{"size":24618,"offset":"22053545"},"ArchiveTarget.js":{"size":4586,"offset":"22078163"},"ArchiveTarget.js.map":{"size":5838,"offset":"22082749"},"LinuxTargetHelper.js":{"size":6384,"offset":"22088587"},"LinuxTargetHelper.js.map":{"size":9737,"offset":"22094971"},"MsiTarget.js":{"size":14823,"offset":"22104708"},"MsiTarget.js.map":{"size":21075,"offset":"22119531"},"archive.js":{"size":6826,"offset":"22140606"},"archive.js.map":{"size":10129,"offset":"22147432"},"differentialUpdateInfoBuilder.js":{"size":4517,"offset":"22157561"},"differentialUpdateInfoBuilder.js.map":{"size":5055,"offset":"22162078"},"fpm.js":{"size":12175,"offset":"22167133"},"fpm.js.map":{"size":18286,"offset":"22179308"},"pkg.js":{"size":9720,"offset":"22197594"},"pkg.js.map":{"size":14225,"offset":"22207314"},"snap.js":{"size":10138,"offset":"22221539"},"snap.js.map":{"size":15913,"offset":"22231677"},"targetFactory.js":{"size":3529,"offset":"22247590"},"targetFactory.js.map":{"size":6309,"offset":"22251119"},"targetUtil.js":{"size":2848,"offset":"22257428"},"targetUtil.js.map":{"size":2632,"offset":"22260276"},"tools.js":{"size":1709,"offset":"22262908"},"tools.js.map":{"size":1419,"offset":"22264617"},"nsis":{"files":{"NsisTarget.js":{"size":31989,"offset":"22266036"},"NsisTarget.js.map":{"size":48941,"offset":"22298025"},"WebInstallerTarget.js":{"size":2301,"offset":"22346966"},"WebInstallerTarget.js.map":{"size":3382,"offset":"22349267"},"nsisLang.js":{"size":5601,"offset":"22352649"},"nsisLang.js.map":{"size":7473,"offset":"22358250"},"nsisLicense.js":{"size":3235,"offset":"22365723"},"nsisLicense.js.map":{"size":3862,"offset":"22368958"},"nsisOptions.js":{"size":73,"offset":"22372820"},"nsisOptions.js.map":{"size":68,"offset":"22372893"},"nsisScriptGenerator.js":{"size":1640,"offset":"22372961"},"nsisScriptGenerator.js.map":{"size":3320,"offset":"22374601"},"nsisUtil.js":{"size":4916,"offset":"22377921"},"nsisUtil.js.map":{"size":6593,"offset":"22382837"}}}}},"remoteBuilder":{"files":{"ProjectInfoManager.js":{"size":2190,"offset":"22389430"},"ProjectInfoManager.js.map":{"size":2095,"offset":"22391620"},"RemoteBuilder.js":{"size":5477,"offset":"22393715"},"RemoteBuilder.js.map":{"size":8319,"offset":"22399192"},"builder-cli.js":{"size":4782,"offset":"22407511"},"builder-cli.js.map":{"size":7194,"offset":"22412293"},"remote-builder-certs.js":{"size":1771,"offset":"22419487"},"remote-builder-certs.js.map":{"size":1692,"offset":"22421258"}}},"publish":{"files":{"PublishManager.js":{"size":24629,"offset":"22422950"},"PublishManager.js.map":{"size":36640,"offset":"22447579"},"updateInfoBuilder.js":{"size":12782,"offset":"22484219"},"updateInfoBuilder.js.map":{"size":18998,"offset":"22497001"}}},"presets":{"files":{"rectCra.js":{"size":1830,"offset":"22515999"},"rectCra.js.map":{"size":1302,"offset":"22517829"}}},"options":{"files":{"AppXOptions.js":{"size":73,"offset":"22519131"},"AppXOptions.js.map":{"size":68,"offset":"22519204"},"CommonWindowsInstallerConfiguration.js":{"size":2675,"offset":"22519272"},"CommonWindowsInstallerConfiguration.js.map":{"size":4915,"offset":"22521947"},"FileAssociation.js":{"size":77,"offset":"22526862"},"FileAssociation.js.map":{"size":68,"offset":"22526939"},"MsiOptions.js":{"size":72,"offset":"22527007"},"MsiOptions.js.map":{"size":68,"offset":"22527079"},"PlatformSpecificBuildOptions.js":{"size":90,"offset":"22527147"},"PlatformSpecificBuildOptions.js.map":{"size":68,"offset":"22527237"},"SnapOptions.js":{"size":73,"offset":"22527305"},"SnapOptions.js.map":{"size":68,"offset":"22527378"},"SquirrelWindowsOptions.js":{"size":84,"offset":"22527446"},"SquirrelWindowsOptions.js.map":{"size":68,"offset":"22527530"},"linuxOptions.js":{"size":74,"offset":"22527598"},"linuxOptions.js.map":{"size":68,"offset":"22527672"},"macOptions.js":{"size":72,"offset":"22527740"},"macOptions.js.map":{"size":68,"offset":"22527812"},"metadata.js":{"size":70,"offset":"22527880"},"metadata.js.map":{"size":68,"offset":"22527950"},"pkgOptions.js":{"size":72,"offset":"22528018"},"pkgOptions.js.map":{"size":68,"offset":"22528090"},"winOptions.js":{"size":72,"offset":"22528158"},"winOptions.js.map":{"size":68,"offset":"22528230"}}},"frameworks":{"files":{"LibUiFramework.js":{"size":5964,"offset":"22528298"},"LibUiFramework.js.map":{"size":8377,"offset":"22534262"}}},"electron":{"files":{"ElectronFramework.js":{"size":8218,"offset":"22542639"},"ElectronFramework.js.map":{"size":12391,"offset":"22550857"},"electronMac.js":{"size":11480,"offset":"22563248"},"electronMac.js.map":{"size":17799,"offset":"22574728"},"electronVersion.js":{"size":5328,"offset":"22592527"},"electronVersion.js.map":{"size":5644,"offset":"22597855"}}},"codeSign":{"files":{"codesign.js":{"size":3149,"offset":"22603499"},"codesign.js.map":{"size":3387,"offset":"22606648"},"macCodeSign.js":{"size":14930,"offset":"22610035"},"macCodeSign.js.map":{"size":22142,"offset":"22624965"},"windowsCodeSign.js":{"size":12590,"offset":"22647107"},"windowsCodeSign.js.map":{"size":20335,"offset":"22659697"}}},"asar":{"files":{"asar.js":{"size":6061,"offset":"22680032"},"asar.js.map":{"size":9195,"offset":"22686093"},"asarFileChecker.js":{"size":1686,"offset":"22695288"},"asarFileChecker.js.map":{"size":1942,"offset":"22696974"},"asarUtil.js":{"size":11677,"offset":"22698916"},"asarUtil.js.map":{"size":19139,"offset":"22710593"},"integrity.js":{"size":2312,"offset":"22729732"},"integrity.js.map":{"size":2821,"offset":"22732044"},"unpackDetector.js":{"size":6018,"offset":"22734865"},"unpackDetector.js.map":{"size":7876,"offset":"22740883"}}}}},"certs":{"files":{"root_certs.keychain":{"size":24440,"offset":"22748759"}}},"node_modules":{"files":{"debug":{"files":{"LICENSE":{"size":1107,"offset":"33668756"},"package.json":{"size":995,"offset":"33669863"},"src":{"files":{"browser.js":{"size":5742,"offset":"33670858"},"common.js":{"size":5878,"offset":"33676600"},"index.js":{"size":314,"offset":"33682478"},"node.js":{"size":4475,"offset":"33682792"}}}}},"semver":{"files":{"LICENSE":{"size":765,"offset":"33687267"},"package.json":{"size":528,"offset":"33688032"},"range.bnf":{"size":619,"offset":"33688560"},"semver.js":{"size":42130,"offset":"33689179"},"bin":{"files":{"semver.js":{"size":4717,"offset":"33731309","executable":true}}}}}}}}},"argparse":{"files":{"LICENSE":{"size":1079,"offset":"22773199"},"index.js":{"size":59,"offset":"22774278"},"package.json":{"size":582,"offset":"22774337"},"lib":{"files":{"action.js":{"size":4659,"offset":"22774919"},"action_container.js":{"size":15055,"offset":"22779578"},"argparse.js":{"size":618,"offset":"22794633"},"argument_parser.js":{"size":35223,"offset":"22795251"},"const.js":{"size":340,"offset":"22830474"},"namespace.js":{"size":1824,"offset":"22830814"},"utils.js":{"size":1281,"offset":"22832638"},"help":{"files":{"added_formatters.js":{"size":2647,"offset":"22833919"},"formatter.js":{"size":22025,"offset":"22836566"}}},"argument":{"files":{"error.js":{"size":1183,"offset":"22858591"},"exclusive.js":{"size":1589,"offset":"22859774"},"group.js":{"size":2330,"offset":"22861363"}}},"action":{"files":{"append.js":{"size":1565,"offset":"22863693"},"count.js":{"size":1036,"offset":"22865258"},"help.js":{"size":1120,"offset":"22866294"},"store.js":{"size":1350,"offset":"22867414"},"subparsers.js":{"size":3590,"offset":"22868764"},"version.js":{"size":1244,"offset":"22872354"},"store":{"files":{"constant.js":{"size":1332,"offset":"22873598"},"false.js":{"size":704,"offset":"22874930"},"true.js":{"size":693,"offset":"22875634"}}},"append":{"files":{"constant.js":{"size":1430,"offset":"22876327"}}}}}}}}},"assert-plus":{"files":{"AUTHORS":{"size":217,"offset":"22897303"},"CHANGES.md":{"size":428,"offset":"22897520"},"assert.js":{"size":5454,"offset":"22897948"},"package.json":{"size":602,"offset":"22903402"}}},"async-exit-hook":{"files":{"index.js":{"size":3715,"offset":"22904004"},"license":{"size":1119,"offset":"22907719"},"package.json":{"size":728,"offset":"22908838"}}},"balanced-match":{"files":{"LICENSE.md":{"size":1096,"offset":"22957802"},"index.js":{"size":1174,"offset":"22958898"},"package.json":{"size":936,"offset":"22960072"}}},"base64-js":{"files":{"LICENSE":{"size":1081,"offset":"22961008"},"base64js.min.js":{"size":2372,"offset":"22962089"},"index.js":{"size":3944,"offset":"22964461"},"package.json":{"size":566,"offset":"22968405"}}},"big-integer":{"files":{"BigInteger.js":{"size":51875,"offset":"22996386"},"BigInteger.min.js":{"size":31948,"offset":"23048261"},"LICENSE":{"size":1234,"offset":"23080209"},"bower.json":{"size":554,"offset":"23081443"},"package.json":{"size":946,"offset":"23081997"},"tsconfig.json":{"size":579,"offset":"23082943"}}},"bluebird":{"files":{"LICENSE":{"size":1086,"offset":"23083522"},"package.json":{"size":1334,"offset":"23084608"},"js":{"files":{"release":{"files":{"any.js":{"size":421,"offset":"23085942"},"assert.js":{"size":1653,"offset":"23086363"},"async.js":{"size":2876,"offset":"23088016"},"bind.js":{"size":1970,"offset":"23090892"},"bluebird.js":{"size":291,"offset":"23092862"},"call_get.js":{"size":4355,"offset":"23093153"},"cancel.js":{"size":3707,"offset":"23097508"},"catch_filter.js":{"size":1426,"offset":"23101215"},"context.js":{"size":2382,"offset":"23102641"},"debuggability.js":{"size":32170,"offset":"23105023"},"direct_resolve.js":{"size":1395,"offset":"23137193"},"each.js":{"size":789,"offset":"23138588"},"errors.js":{"size":3717,"offset":"23139377"},"es5.js":{"size":1978,"offset":"23143094"},"filter.js":{"size":314,"offset":"23145072"},"finally.js":{"size":4613,"offset":"23145386"},"generators.js":{"size":7761,"offset":"23149999"},"join.js":{"size":8136,"offset":"23157760"},"map.js":{"size":5602,"offset":"23165896"},"method.js":{"size":1768,"offset":"23171498"},"nodeback.js":{"size":1560,"offset":"23173266"},"nodeify.js":{"size":1647,"offset":"23174826"},"promise.js":{"size":26986,"offset":"23176473"},"promise_array.js":{"size":5252,"offset":"23203459"},"promisify.js":{"size":12182,"offset":"23208711"},"props.js":{"size":3117,"offset":"23220893"},"queue.js":{"size":1873,"offset":"23224010"},"race.js":{"size":1250,"offset":"23225883"},"reduce.js":{"size":5372,"offset":"23227133"},"schedule.js":{"size":2148,"offset":"23232505"},"settle.js":{"size":1366,"offset":"23234653"},"some.js":{"size":3959,"offset":"23236019"},"synchronous_inspection.js":{"size":2813,"offset":"23239978"},"thenables.js":{"size":2131,"offset":"23242791"},"timers.js":{"size":2395,"offset":"23244922"},"using.js":{"size":7525,"offset":"23247317"},"util.js":{"size":11379,"offset":"23254842"}}},"browser":{"files":{"bluebird.core.js":{"size":123379,"offset":"23266221"},"bluebird.core.min.js":{"size":57355,"offset":"23389600"},"bluebird.js":{"size":183390,"offset":"23446955"},"bluebird.min.js":{"size":81530,"offset":"23630345"}}}}}}},"bluebird-lst":{"files":{"index.js":{"size":192,"offset":"23711875"},"package.json":{"size":488,"offset":"23712067"}}},"bplist-parser":{"files":{"bplistParser.js":{"size":11567,"offset":"23718323"},"package.json":{"size":547,"offset":"23729890"}}},"brace-expansion":{"files":{"LICENSE":{"size":1096,"offset":"23730437"},"index.js":{"size":4792,"offset":"23731533"},"package.json":{"size":986,"offset":"23736325"}}},"buffer-alloc":{"files":{"index.js":{"size":664,"offset":"23737311"},"package.json":{"size":509,"offset":"23737975"}}},"buffer-alloc-unsafe":{"files":{"index.js":{"size":356,"offset":"23738484"},"package.json":{"size":446,"offset":"23738840"}}},"buffer-fill":{"files":{"index.js":{"size":2433,"offset":"23745658"},"package.json":{"size":452,"offset":"23748091"}}},"buffer-from":{"files":{"LICENSE":{"size":1078,"offset":"23748543"},"index.js":{"size":1595,"offset":"23749621"},"package.json":{"size":456,"offset":"23751216"}}},"builder-util":{"files":{"package.json":{"size":936,"offset":"23751672"},"out":{"files":{"DebugLogger.js":{"size":1456,"offset":"23752608"},"DebugLogger.js.map":{"size":2538,"offset":"23754064"},"arch.js":{"size":1386,"offset":"23756602"},"arch.js.map":{"size":2460,"offset":"23757988"},"asyncTaskManager.js":{"size":2744,"offset":"23760448"},"asyncTaskManager.js.map":{"size":4622,"offset":"23763192"},"deepAssign.js":{"size":1026,"offset":"23767814"},"deepAssign.js.map":{"size":2116,"offset":"23768840"},"fs.js":{"size":12045,"offset":"23770956"},"fs.js.map":{"size":18807,"offset":"23783001"},"log.js":{"size":3869,"offset":"23801808"},"log.js.map":{"size":7797,"offset":"23805677"},"nodeHttpExecutor.js":{"size":1514,"offset":"23813474"},"nodeHttpExecutor.js.map":{"size":1018,"offset":"23814988"},"promise.js":{"size":2124,"offset":"23816006"},"promise.js.map":{"size":2783,"offset":"23818130"},"util.js":{"size":14657,"offset":"23820913"},"util.js.map":{"size":22044,"offset":"23835570"}}},"node_modules":{"files":{"debug":{"files":{"LICENSE":{"size":1107,"offset":"33749727"},"package.json":{"size":995,"offset":"33750834"},"src":{"files":{"browser.js":{"size":5742,"offset":"33751829"},"common.js":{"size":5878,"offset":"33757571"},"index.js":{"size":314,"offset":"33763449"},"node.js":{"size":4475,"offset":"33763763"}}}}}}}}},"builder-util-runtime":{"files":{"package.json":{"size":714,"offset":"23857614"},"out":{"files":{"CancellationToken.js":{"size":2779,"offset":"23858328","executable":true},"CancellationToken.js.map":{"size":5143,"offset":"23861107","executable":true},"ProgressCallbackTransform.js":{"size":1875,"offset":"23866250","executable":true},"ProgressCallbackTransform.js.map":{"size":3473,"offset":"23868125","executable":true},"bintray.js":{"size":2212,"offset":"23871598","executable":true},"bintray.js.map":{"size":4850,"offset":"23873810","executable":true},"blockMapApi.js":{"size":73,"offset":"23878660","executable":true},"blockMapApi.js.map":{"size":68,"offset":"23878733","executable":true},"httpExecutor.js":{"size":16046,"offset":"23878801","executable":true},"httpExecutor.js.map":{"size":31141,"offset":"23894847","executable":true},"index.js":{"size":4567,"offset":"23925988","executable":true},"index.js.map":{"size":2392,"offset":"23930555","executable":true},"publishOptions.js":{"size":1977,"offset":"23932947","executable":true},"publishOptions.js.map":{"size":11138,"offset":"23934924","executable":true},"rfc2253Parser.js":{"size":1788,"offset":"23946062","executable":true},"rfc2253Parser.js.map":{"size":3853,"offset":"23947850","executable":true},"updateInfo.js":{"size":72,"offset":"23951703","executable":true},"updateInfo.js.map":{"size":68,"offset":"23951775","executable":true},"uuid.js":{"size":5619,"offset":"23951843","executable":true},"uuid.js.map":{"size":11736,"offset":"23957462","executable":true},"xml.js":{"size":3931,"offset":"23969198","executable":true},"xml.js.map":{"size":6728,"offset":"23973129","executable":true}}},"node_modules":{"files":{"debug":{"files":{"LICENSE":{"size":1107,"offset":"33768238"},"package.json":{"size":995,"offset":"33769345"},"src":{"files":{"browser.js":{"size":5742,"offset":"33770340"},"common.js":{"size":5878,"offset":"33776082"},"index.js":{"size":314,"offset":"33781960"},"node.js":{"size":4475,"offset":"33782274"}}}}},"sax":{"files":{"LICENSE":{"size":2011,"offset":"33786749"},"package.json":{"size":574,"offset":"33788760"},"lib":{"files":{"sax.js":{"size":43541,"offset":"33789334"}}}}}}}}},"chalk":{"files":{"index.js":{"size":6439,"offset":"24005294"},"index.js.flow":{"size":1921,"offset":"24011733"},"license":{"size":1109,"offset":"24013654"},"package.json":{"size":849,"offset":"24014763"},"templates.js":{"size":3133,"offset":"24015612"}}},"chromium-pickle-js":{"files":{"package.json":{"size":451,"offset":"24018745"},"lib":{"files":{"exports.js":{"size":188,"offset":"24019196"},"pickle.js":{"size":6996,"offset":"24019384"}}}}},"ci-info":{"files":{"LICENSE":{"size":1091,"offset":"24026380"},"index.js":{"size":1739,"offset":"24027471"},"package.json":{"size":645,"offset":"24029210"},"vendors.json":{"size":3030,"offset":"24029855"}}},"color-convert":{"files":{"LICENSE":{"size":1087,"offset":"24050560"},"conversions.js":{"size":16850,"offset":"24051647"},"index.js":{"size":1725,"offset":"24068497"},"package.json":{"size":609,"offset":"24070222"},"route.js":{"size":2227,"offset":"24070831"}}},"color-name":{"files":{".eslintrc.json":{"size":1160,"offset":"24073058"},"LICENSE":{"size":1085,"offset":"24074218"},"index.js":{"size":4617,"offset":"24075303"},"package.json":{"size":407,"offset":"24079920"}}},"combined-stream":{"files":{"License":{"size":1085,"offset":"24080327"},"Readme.md":{"size":4551,"offset":"24081412"},"package.json":{"size":655,"offset":"24085963"},"lib":{"files":{"combined_stream.js":{"size":4687,"offset":"24086618"}}}}},"compare-version":{"files":{"index.js":{"size":645,"offset":"24093849"},"package.json":{"size":604,"offset":"24094494"}}},"concat-map":{"files":{"LICENSE":{"size":1073,"offset":"24095098"},"README.markdown":{"size":1165,"offset":"24096171"},"index.js":{"size":345,"offset":"24097336"},"package.json":{"size":882,"offset":"24097681"}}},"cordova-common":{"files":{".eslintignore":{"size":16,"offset":"24109069"},".eslintrc.yml":{"size":140,"offset":"24109085"},".ratignore":{"size":62,"offset":"24109225"},"RELEASENOTES.md":{"size":13173,"offset":"24109287"},"cordova-common.js":{"size":2104,"offset":"24122460"},"package.json":{"size":1290,"offset":"24124564"},"src":{"files":{"ActionStack.js":{"size":2944,"offset":"24125854"},"CordovaCheck.js":{"size":2473,"offset":"24128798"},"CordovaLogger.js":{"size":7722,"offset":"24131271"},"FileUpdater.js":{"size":18406,"offset":"24138993"},"PlatformJson.js":{"size":8996,"offset":"24157399"},"PluginManager.js":{"size":6839,"offset":"24166395"},"events.js":{"size":2902,"offset":"24173234"},"superspawn.js":{"size":5566,"offset":"24176136"},"util":{"files":{"addProperty.js":{"size":1315,"offset":"24181702"},"formatError.js":{"size":1824,"offset":"24183017"},"plist-helpers.js":{"size":3122,"offset":"24184841"},"xml-helpers.js":{"size":11518,"offset":"24187963"}}},"PluginInfo":{"files":{"PluginInfo.js":{"size":17474,"offset":"24199481"},"PluginInfoProvider.js":{"size":2839,"offset":"24216955"}}},"CordovaError":{"files":{"CordovaError.js":{"size":3368,"offset":"24219794"},"CordovaExternalToolErrorContext.js":{"size":1606,"offset":"24223162"}}},"ConfigParser":{"files":{"ConfigParser.js":{"size":22963,"offset":"24224768"}}},"ConfigChanges":{"files":{"ConfigChanges.js":{"size":17818,"offset":"24247731"},"ConfigFile.js":{"size":10620,"offset":"24265549"},"ConfigKeeper.js":{"size":2235,"offset":"24276169"},"munge-util.js":{"size":5974,"offset":"24278404"}}}}},".github":{"files":{"ISSUE_TEMPLATE.md":{"size":1191,"offset":"24284378"},"PULL_REQUEST_TEMPLATE.md":{"size":1118,"offset":"24285569"},"ISSUE_TEMPLATE":{"files":{"BUG_REPORT.md":{"size":998,"offset":"24286687"},"FEATURE_REQUEST.md":{"size":601,"offset":"24287685"},"SUPPORT_QUESTION.md":{"size":962,"offset":"24288286"}}}}}}},"core-util-is":{"files":{"LICENSE":{"size":1077,"offset":"25627213"},"float.patch":{"size":16278,"offset":"25628290"},"package.json":{"size":507,"offset":"25644568"},"lib":{"files":{"util.js":{"size":3021,"offset":"25645075"}}}}},"cross-spawn":{"files":{"LICENSE":{"size":1105,"offset":"25648096"},"index.js":{"size":1192,"offset":"25649201"},"package.json":{"size":1425,"offset":"25650393"},"lib":{"files":{"enoent.js":{"size":1480,"offset":"25651818"},"parse.js":{"size":4414,"offset":"25653298"},"util":{"files":{"escape.js":{"size":1172,"offset":"25657712"},"readShebang.js":{"size":740,"offset":"25658884"},"resolveCommand.js":{"size":1327,"offset":"25659624"}}}}}}},"decamelize":{"files":{"index.js":{"size":323,"offset":"25774583"},"license":{"size":1119,"offset":"25774906"},"package.json":{"size":644,"offset":"25776025"}}},"dedent":{"files":{"LICENSE":{"size":1104,"offset":"25779266"},"package.json":{"size":731,"offset":"25780370"},"dist":{"files":{"dedent.js":{"size":1387,"offset":"25781101"}}}}},"deep-equal":{"files":{"LICENSE":{"size":1140,"offset":"13794506"},"index.js":{"size":3518,"offset":"13795646"},"package.json":{"size":1495,"offset":"13799164"},"lib":{"files":{"is_arguments.js":{"size":42,"offset":"13800659"},"keys.js":{"size":41,"offset":"13800701"}}}}},"deep-extend":{"files":{"LICENSE":{"size":1093,"offset":"25782488"},"index.js":{"size":47,"offset":"25783581"},"package.json":{"size":731,"offset":"25783628"},"lib":{"files":{"deep-extend.js":{"size":4293,"offset":"25784359"}}}}},"define-properties":{"files":{".editorconfig":{"size":276,"offset":"13806906"},".jscs.json":{"size":4108,"offset":"13807182"},"LICENSE":{"size":1080,"offset":"13811290"},"index.js":{"size":1608,"offset":"13812370"},"package.json":{"size":1202,"offset":"13813978"}}},"defined":{"files":{"LICENSE":{"size":1073,"offset":"13815180"},"index.js":{"size":150,"offset":"13816253"},"package.json":{"size":903,"offset":"13816403"}}},"delayed-stream":{"files":{"License":{"size":1085,"offset":"25792115"},"Makefile":{"size":57,"offset":"25793200"},"Readme.md":{"size":3871,"offset":"25793257"},"package.json":{"size":641,"offset":"25797128"},"lib":{"files":{"delayed_stream.js":{"size":2319,"offset":"25797769"}}}}},"dotenv":{"files":{"LICENSE":{"size":1294,"offset":"26244900"},"config.js":{"size":189,"offset":"26246194"},"package.json":{"size":644,"offset":"26246383"},"lib":{"files":{"cli-options.js":{"size":303,"offset":"26247027"},"env-options.js":{"size":398,"offset":"26247330"},"main.js":{"size":2691,"offset":"26247728"}}}}},"dotenv-expand":{"files":{"CONTRIBUTING.md":{"size":697,"offset":"26250419"},"LICENSE":{"size":1295,"offset":"26251116"},"dotenv-expand.png":{"size":11251,"offset":"26252411"},"package.json":{"size":383,"offset":"26263662"},"lib":{"files":{"main.js":{"size":1101,"offset":"26264045"}}}}},"dotignore":{"files":{"index.js":{"size":1493,"offset":"13845525"},"package.json":{"size":655,"offset":"13847018"},"bin":{"files":{"ignored":{"size":569,"offset":"13847673","executable":true}}}}},"ejs":{"files":{"LICENSE":{"size":11358,"offset":"26295509"},"ejs.js":{"size":48484,"offset":"26306867"},"ejs.min.js":{"size":23620,"offset":"26355351"},"jakefile.js":{"size":2033,"offset":"26378971"},"package.json":{"size":718,"offset":"26381004"},"postinstall.js":{"size":544,"offset":"26381722","executable":true},"lib":{"files":{"ejs.js":{"size":28384,"offset":"26382266","executable":true},"utils.js":{"size":3863,"offset":"26410650"}}}}},"electron-osx-sign":{"files":{".eslintrc.json":{"size":5007,"offset":"26496817"},"LICENSE":{"size":1316,"offset":"26501824"},"default.entitlements.darwin.inherit.plist":{"size":192,"offset":"26503140"},"default.entitlements.darwin.plist":{"size":192,"offset":"26503332"},"default.entitlements.mas.inherit.plist":{"size":304,"offset":"26503524","executable":true},"default.entitlements.mas.plist":{"size":250,"offset":"26503828","executable":true},"flat.js":{"size":4946,"offset":"26504078"},"index.js":{"size":1076,"offset":"26509024"},"package.json":{"size":1127,"offset":"26510100"},"sign.js":{"size":14310,"offset":"26511227"},"util-entitlements.js":{"size":5185,"offset":"26525537"},"util-identities.js":{"size":1593,"offset":"26530722"},"util-provisioning-profiles.js":{"size":6086,"offset":"26532315"},"util.js":{"size":8109,"offset":"26538401"},"bin":{"files":{"electron-osx-flat-usage.txt":{"size":1035,"offset":"26546510"},"electron-osx-flat.js":{"size":750,"offset":"26547545","executable":true},"electron-osx-sign-usage.txt":{"size":3015,"offset":"26548295"},"electron-osx-sign.js":{"size":1005,"offset":"26551310","executable":true}}},"node_modules":{"files":{"debug":{"files":{"LICENSE":{"size":1107,"offset":"34027393"},"Makefile":{"size":1059,"offset":"34028500"},"component.json":{"size":321,"offset":"34029559"},"node.js":{"size":40,"offset":"34029880"},"package.json":{"size":1063,"offset":"34029920"},"src":{"files":{"browser.js":{"size":4734,"offset":"34030983"},"debug.js":{"size":4394,"offset":"34035717"},"index.js":{"size":263,"offset":"34040111"},"inspector-log.js":{"size":373,"offset":"34040374"},"node.js":{"size":6015,"offset":"34040747"}}}}},"isbinaryfile":{"files":{"LICENSE.txt":{"size":1074,"offset":"34046762"},"index.js":{"size":3419,"offset":"34047836"},"package.json":{"size":769,"offset":"34051255"}}},"ms":{"files":{"index.js":{"size":2764,"offset":"34052024"},"license.md":{"size":1077,"offset":"34054788"},"package.json":{"size":606,"offset":"34055865"}}}}}}},"electron-publish":{"files":{"package.json":{"size":760,"offset":"26552315"},"out":{"files":{"BintrayPublisher.js":{"size":5423,"offset":"26553075"},"BintrayPublisher.js.map":{"size":7790,"offset":"26558498"},"gitHubPublisher.js":{"size":11396,"offset":"26566288"},"gitHubPublisher.js.map":{"size":17997,"offset":"26577684"},"multiProgress.js":{"size":2626,"offset":"26595681"},"multiProgress.js.map":{"size":4535,"offset":"26598307"},"progress.js":{"size":5674,"offset":"26602842"},"progress.js.map":{"size":10073,"offset":"26608516"},"publisher.js":{"size":4077,"offset":"26618589"},"publisher.js.map":{"size":6569,"offset":"26622666"},"s3":{"files":{"BaseS3Publisher.js":{"size":3500,"offset":"26629235"},"BaseS3Publisher.js.map":{"size":4379,"offset":"26632735"},"s3Publisher.js":{"size":2805,"offset":"26637114"},"s3Publisher.js.map":{"size":4534,"offset":"26639919"},"spacesPublisher.js":{"size":2430,"offset":"26644453"},"spacesPublisher.js.map":{"size":3366,"offset":"26646883"}}}}}}},"elementtree":{"files":{"CHANGES.md":{"size":901,"offset":"26650249"},"LICENSE.txt":{"size":11359,"offset":"26651150"},"Makefile":{"size":531,"offset":"26662509","executable":true},"NOTICE":{"size":123,"offset":"26663040"},"package.json":{"size":610,"offset":"26663163"},"lib":{"files":{"constants.js":{"size":677,"offset":"26663773"},"elementpath.js":{"size":6742,"offset":"26664450"},"elementtree.js":{"size":13537,"offset":"26671192"},"errors.js":{"size":930,"offset":"26684729"},"parser.js":{"size":910,"offset":"26685659"},"sprintf.js":{"size":2382,"offset":"26686569"},"treebuilder.js":{"size":1216,"offset":"26688951"},"utils.js":{"size":1513,"offset":"26690167"},"parsers":{"files":{"index.js":{"size":32,"offset":"26691680"},"sax.js":{"size":1375,"offset":"26691712"}}}}}}},"emoji-regex":{"files":{"LICENSE-MIT.txt":{"size":1077,"offset":"26693087"},"index.js":{"size":7391,"offset":"26694164"},"package.json":{"size":909,"offset":"26701555"},"text.js":{"size":7392,"offset":"26702464"},"es2015":{"files":{"index.js":{"size":8143,"offset":"26709856"},"text.js":{"size":8144,"offset":"26717999"}}}}},"end-of-stream":{"files":{"LICENSE":{"size":1078,"offset":"26726143"},"index.js":{"size":2678,"offset":"26727221"},"package.json":{"size":589,"offset":"26729899"}}},"endent":{"files":{"LICENSE":{"size":1103,"offset":"26730488"},"endent.js":{"size":1791,"offset":"26731591"},"package.json":{"size":610,"offset":"26733382"}}},"es-abstract":{"files":{"5":{"files":{"AbstractEqualityComparison.js":{"size":1092,"offset":"14388896"},"AbstractRelationalComparison.js":{"size":1652,"offset":"14389988"},"CheckObjectCoercible.js":{"size":356,"offset":"14391640"},"DateFromTime.js":{"size":1043,"offset":"14391996"},"Day.js":{"size":299,"offset":"14393039"},"DayFromYear.js":{"size":323,"offset":"14393338"},"DayWithinYear.js":{"size":291,"offset":"14393661"},"DaysInYear.js":{"size":300,"offset":"14393952"},"FromPropertyDescriptor.js":{"size":1059,"offset":"14394252"},"HourFromTime.js":{"size":447,"offset":"14395311"},"InLeapYear.js":{"size":517,"offset":"14395758"},"IsAccessorDescriptor.js":{"size":451,"offset":"14396275"},"IsCallable.js":{"size":117,"offset":"14396726"},"IsDataDescriptor.js":{"size":454,"offset":"14396843"},"IsGenericDescriptor.js":{"size":547,"offset":"14397297"},"IsPropertyDescriptor.js":{"size":523,"offset":"14397844"},"MakeDate.js":{"size":333,"offset":"14398367"},"MakeDay.js":{"size":936,"offset":"14398700"},"MakeTime.js":{"size":703,"offset":"14399636"},"MinFromTime.js":{"size":461,"offset":"14400339"},"MonthFromTime.js":{"size":1019,"offset":"14400800"},"SameValue.js":{"size":316,"offset":"14401819"},"SecFromTime.js":{"size":467,"offset":"14402135"},"StrictEqualityComparison.js":{"size":370,"offset":"14402602"},"TimeClip.js":{"size":487,"offset":"14402972"},"TimeFromYear.js":{"size":266,"offset":"14403459"},"TimeWithinDay.js":{"size":251,"offset":"14403725"},"ToBoolean.js":{"size":139,"offset":"14403976"},"ToInt32.js":{"size":182,"offset":"14404115"},"ToInteger.js":{"size":598,"offset":"14404297"},"ToNumber.js":{"size":182,"offset":"14404895"},"ToObject.js":{"size":328,"offset":"14405077"},"ToPrimitive.js":{"size":124,"offset":"14405405"},"ToPropertyDescriptor.js":{"size":1458,"offset":"14405529"},"ToString.js":{"size":236,"offset":"14406987"},"ToUint16.js":{"size":651,"offset":"14407223"},"ToUint32.js":{"size":184,"offset":"14407874"},"Type.js":{"size":447,"offset":"14408058"},"WeekDay.js":{"size":214,"offset":"14408505"},"YearFromTime.js":{"size":415,"offset":"14408719"},"modulo.js":{"size":173,"offset":"14409134"},"msFromTime.js":{"size":257,"offset":"14409307"}}},"2015":{"files":{"AbstractEqualityComparison.js":{"size":1158,"offset":"14764278"},"AbstractRelationalComparison.js":{"size":1652,"offset":"14765436"},"AdvanceStringIndex.js":{"size":1184,"offset":"14767088"},"ArrayCreate.js":{"size":1689,"offset":"14768272"},"ArraySetLength.js":{"size":2671,"offset":"14769961"},"ArraySpeciesCreate.js":{"size":1350,"offset":"14772632"},"Call.js":{"size":464,"offset":"14773982"},"CanonicalNumericIndexString.js":{"size":656,"offset":"14774446"},"CompletePropertyDescriptor.js":{"size":989,"offset":"14775102"},"CreateDataProperty.js":{"size":1288,"offset":"14776091"},"CreateDataPropertyOrThrow.js":{"size":736,"offset":"14777379"},"CreateHTML.js":{"size":934,"offset":"14778115"},"CreateIterResultObject.js":{"size":434,"offset":"14779049"},"CreateListFromArrayLike.js":{"size":1357,"offset":"14779483"},"CreateMethodProperty.js":{"size":985,"offset":"14780840"},"DateFromTime.js":{"size":1043,"offset":"14781825"},"Day.js":{"size":299,"offset":"14782868"},"DayFromYear.js":{"size":323,"offset":"14783167"},"DayWithinYear.js":{"size":291,"offset":"14783490"},"DaysInYear.js":{"size":300,"offset":"14783781"},"DefinePropertyOrThrow.js":{"size":1472,"offset":"14784081"},"DeletePropertyOrThrow.js":{"size":705,"offset":"14785553"},"EnumerableOwnNames.js":{"size":423,"offset":"14786258"},"FromPropertyDescriptor.js":{"size":801,"offset":"14786681"},"Get.js":{"size":734,"offset":"14787482"},"GetIterator.js":{"size":874,"offset":"14788216"},"GetMethod.js":{"size":924,"offset":"14789090"},"GetOwnPropertyKeys.js":{"size":823,"offset":"14790014"},"GetPrototypeFromConstructor.js":{"size":923,"offset":"14790837"},"GetSubstitution.js":{"size":3534,"offset":"14791760"},"GetV.js":{"size":571,"offset":"14795294"},"HasOwnProperty.js":{"size":555,"offset":"14795865"},"HasProperty.js":{"size":519,"offset":"14796420"},"HourFromTime.js":{"size":447,"offset":"14796939"},"InLeapYear.js":{"size":517,"offset":"14797386"},"InstanceofOperator.js":{"size":924,"offset":"14797903"},"Invoke.js":{"size":591,"offset":"14798827"},"IsAccessorDescriptor.js":{"size":469,"offset":"14799418"},"IsArray.js":{"size":417,"offset":"14799887"},"IsCallable.js":{"size":117,"offset":"14800304"},"IsConcatSpreadable.js":{"size":628,"offset":"14800421"},"IsConstructor.js":{"size":290,"offset":"14801049"},"IsDataDescriptor.js":{"size":468,"offset":"14801339"},"IsExtensible.js":{"size":510,"offset":"14801807"},"IsGenericDescriptor.js":{"size":564,"offset":"14802317"},"IsInteger.js":{"size":514,"offset":"14802881"},"IsPromise.js":{"size":490,"offset":"14803395"},"IsPropertyDescriptor.js":{"size":523,"offset":"14803885"},"IsPropertyKey.js":{"size":211,"offset":"14804408"},"IsRegExp.js":{"size":547,"offset":"14804619"},"IteratorClose.js":{"size":1483,"offset":"14805166"},"IteratorComplete.js":{"size":500,"offset":"14806649"},"IteratorNext.js":{"size":495,"offset":"14807149"},"IteratorStep.js":{"size":353,"offset":"14807644"},"IteratorValue.js":{"size":445,"offset":"14807997"},"MakeDate.js":{"size":333,"offset":"14808442"},"MakeDay.js":{"size":936,"offset":"14808775"},"MakeTime.js":{"size":703,"offset":"14809711"},"MinFromTime.js":{"size":461,"offset":"14810414"},"MonthFromTime.js":{"size":1019,"offset":"14810875"},"ObjectCreate.js":{"size":1039,"offset":"14811894"},"OrdinaryDefineOwnProperty.js":{"size":2396,"offset":"14812933"},"OrdinaryGetOwnProperty.js":{"size":1264,"offset":"14815329"},"OrdinaryHasInstance.js":{"size":633,"offset":"14816593"},"OrdinaryHasProperty.js":{"size":537,"offset":"14817226"},"RegExpExec.js":{"size":890,"offset":"14817763"},"RequireObjectCoercible.js":{"size":70,"offset":"14818653"},"SameValue.js":{"size":316,"offset":"14818723"},"SameValueZero.js":{"size":227,"offset":"14819039"},"SecFromTime.js":{"size":467,"offset":"14819266"},"Set.js":{"size":811,"offset":"14819733"},"SetFunctionName.js":{"size":1392,"offset":"14820544"},"SetIntegrityLevel.js":{"size":1856,"offset":"14821936"},"SpeciesConstructor.js":{"size":846,"offset":"14823792"},"StrictEqualityComparison.js":{"size":370,"offset":"14824638"},"SymbolDescriptiveString.js":{"size":533,"offset":"14825008"},"TestIntegrityLevel.js":{"size":1278,"offset":"14825541"},"TimeClip.js":{"size":487,"offset":"14826819"},"TimeFromYear.js":{"size":266,"offset":"14827306"},"TimeWithinDay.js":{"size":251,"offset":"14827572"},"ToBoolean.js":{"size":139,"offset":"14827823"},"ToDateString.js":{"size":500,"offset":"14827962"},"ToInt16.js":{"size":264,"offset":"14828462"},"ToInt32.js":{"size":182,"offset":"14828726"},"ToInt8.js":{"size":251,"offset":"14828908"},"ToInteger.js":{"size":277,"offset":"14829159"},"ToLength.js":{"size":332,"offset":"14829436"},"ToNumber.js":{"size":2036,"offset":"14829768"},"ToObject.js":{"size":340,"offset":"14831804"},"ToPrimitive.js":{"size":291,"offset":"14832144"},"ToPropertyDescriptor.js":{"size":1458,"offset":"14832435"},"ToPropertyKey.js":{"size":411,"offset":"14833893"},"ToString.js":{"size":402,"offset":"14834304"},"ToUint16.js":{"size":651,"offset":"14834706"},"ToUint32.js":{"size":184,"offset":"14835357"},"ToUint8.js":{"size":594,"offset":"14835541"},"ToUint8Clamp.js":{"size":607,"offset":"14836135"},"Type.js":{"size":229,"offset":"14836742"},"ValidateAndApplyPropertyDescriptor.js":{"size":5253,"offset":"14836971"},"WeekDay.js":{"size":214,"offset":"14842224"},"YearFromTime.js":{"size":415,"offset":"14842438"},"modulo.js":{"size":173,"offset":"14842853"},"msFromTime.js":{"size":257,"offset":"14843026"},"thisBooleanValue.js":{"size":368,"offset":"14843283"},"thisNumberValue.js":{"size":391,"offset":"14843651"},"thisStringValue.js":{"size":362,"offset":"14844042"},"thisTimeValue.js":{"size":268,"offset":"14844404"}}},"2016":{"files":{"AbstractEqualityComparison.js":{"size":1158,"offset":"14679732"},"AbstractRelationalComparison.js":{"size":1652,"offset":"14680890"},"AdvanceStringIndex.js":{"size":1184,"offset":"14682542"},"ArrayCreate.js":{"size":1689,"offset":"14683726"},"ArraySetLength.js":{"size":2671,"offset":"14685415"},"ArraySpeciesCreate.js":{"size":1350,"offset":"14688086"},"Call.js":{"size":464,"offset":"14689436"},"CanonicalNumericIndexString.js":{"size":656,"offset":"14689900"},"CompletePropertyDescriptor.js":{"size":989,"offset":"14690556"},"CreateDataProperty.js":{"size":1288,"offset":"14691545"},"CreateDataPropertyOrThrow.js":{"size":736,"offset":"14692833"},"CreateHTML.js":{"size":934,"offset":"14693569"},"CreateIterResultObject.js":{"size":434,"offset":"14694503"},"CreateListFromArrayLike.js":{"size":1357,"offset":"14694937"},"CreateMethodProperty.js":{"size":985,"offset":"14696294"},"DateFromTime.js":{"size":1043,"offset":"14697279"},"Day.js":{"size":299,"offset":"14698322"},"DayFromYear.js":{"size":323,"offset":"14698621"},"DayWithinYear.js":{"size":291,"offset":"14698944"},"DaysInYear.js":{"size":300,"offset":"14699235"},"DefinePropertyOrThrow.js":{"size":1472,"offset":"14699535"},"DeletePropertyOrThrow.js":{"size":705,"offset":"14701007"},"EnumerableOwnNames.js":{"size":423,"offset":"14701712"},"FromPropertyDescriptor.js":{"size":801,"offset":"14702135"},"Get.js":{"size":734,"offset":"14702936"},"GetIterator.js":{"size":874,"offset":"14703670"},"GetMethod.js":{"size":924,"offset":"14704544"},"GetOwnPropertyKeys.js":{"size":823,"offset":"14705468"},"GetPrototypeFromConstructor.js":{"size":923,"offset":"14706291"},"GetSubstitution.js":{"size":3534,"offset":"14707214"},"GetV.js":{"size":571,"offset":"14710748"},"HasOwnProperty.js":{"size":555,"offset":"14711319"},"HasProperty.js":{"size":519,"offset":"14711874"},"HourFromTime.js":{"size":447,"offset":"14712393"},"InLeapYear.js":{"size":517,"offset":"14712840"},"InstanceofOperator.js":{"size":924,"offset":"14713357"},"Invoke.js":{"size":591,"offset":"14714281"},"IsAccessorDescriptor.js":{"size":469,"offset":"14714872"},"IsArray.js":{"size":417,"offset":"14715341"},"IsCallable.js":{"size":117,"offset":"14715758"},"IsConcatSpreadable.js":{"size":628,"offset":"14715875"},"IsConstructor.js":{"size":290,"offset":"14716503"},"IsDataDescriptor.js":{"size":468,"offset":"14716793"},"IsExtensible.js":{"size":510,"offset":"14717261"},"IsGenericDescriptor.js":{"size":564,"offset":"14717771"},"IsInteger.js":{"size":514,"offset":"14718335"},"IsPromise.js":{"size":490,"offset":"14718849"},"IsPropertyDescriptor.js":{"size":523,"offset":"14719339"},"IsPropertyKey.js":{"size":211,"offset":"14719862"},"IsRegExp.js":{"size":547,"offset":"14720073"},"IterableToArrayLike.js":{"size":1937,"offset":"14720620"},"IteratorClose.js":{"size":1483,"offset":"14722557"},"IteratorComplete.js":{"size":500,"offset":"14724040"},"IteratorNext.js":{"size":495,"offset":"14724540"},"IteratorStep.js":{"size":353,"offset":"14725035"},"IteratorValue.js":{"size":445,"offset":"14725388"},"MakeDate.js":{"size":333,"offset":"14725833"},"MakeDay.js":{"size":936,"offset":"14726166"},"MakeTime.js":{"size":703,"offset":"14727102"},"MinFromTime.js":{"size":461,"offset":"14727805"},"MonthFromTime.js":{"size":1019,"offset":"14728266"},"ObjectCreate.js":{"size":1039,"offset":"14729285"},"OrdinaryDefineOwnProperty.js":{"size":2396,"offset":"14730324"},"OrdinaryGetOwnProperty.js":{"size":1264,"offset":"14732720"},"OrdinaryGetPrototypeOf.js":{"size":546,"offset":"14733984"},"OrdinaryHasInstance.js":{"size":633,"offset":"14734530"},"OrdinaryHasProperty.js":{"size":537,"offset":"14735163"},"OrdinarySetPrototypeOf.js":{"size":1208,"offset":"14735700"},"RegExpExec.js":{"size":890,"offset":"14736908"},"RequireObjectCoercible.js":{"size":70,"offset":"14737798"},"SameValue.js":{"size":316,"offset":"14737868"},"SameValueNonNumber.js":{"size":461,"offset":"14738184"},"SameValueZero.js":{"size":227,"offset":"14738645"},"SecFromTime.js":{"size":467,"offset":"14738872"},"Set.js":{"size":811,"offset":"14739339"},"SetFunctionName.js":{"size":1392,"offset":"14740150"},"SetIntegrityLevel.js":{"size":1856,"offset":"14741542"},"SpeciesConstructor.js":{"size":846,"offset":"14743398"},"StrictEqualityComparison.js":{"size":370,"offset":"14744244"},"SymbolDescriptiveString.js":{"size":533,"offset":"14744614"},"TestIntegrityLevel.js":{"size":1278,"offset":"14745147"},"TimeClip.js":{"size":487,"offset":"14746425"},"TimeFromYear.js":{"size":266,"offset":"14746912"},"TimeWithinDay.js":{"size":251,"offset":"14747178"},"ToBoolean.js":{"size":139,"offset":"14747429"},"ToDateString.js":{"size":500,"offset":"14747568"},"ToInt16.js":{"size":264,"offset":"14748068"},"ToInt32.js":{"size":182,"offset":"14748332"},"ToInt8.js":{"size":251,"offset":"14748514"},"ToInteger.js":{"size":277,"offset":"14748765"},"ToLength.js":{"size":332,"offset":"14749042"},"ToNumber.js":{"size":2036,"offset":"14749374"},"ToObject.js":{"size":340,"offset":"14751410"},"ToPrimitive.js":{"size":291,"offset":"14751750"},"ToPropertyDescriptor.js":{"size":1458,"offset":"14752041"},"ToPropertyKey.js":{"size":411,"offset":"14753499"},"ToString.js":{"size":402,"offset":"14753910"},"ToUint16.js":{"size":651,"offset":"14754312"},"ToUint32.js":{"size":184,"offset":"14754963"},"ToUint8.js":{"size":594,"offset":"14755147"},"ToUint8Clamp.js":{"size":607,"offset":"14755741"},"Type.js":{"size":229,"offset":"14756348"},"ValidateAndApplyPropertyDescriptor.js":{"size":5253,"offset":"14756577"},"WeekDay.js":{"size":214,"offset":"14761830"},"YearFromTime.js":{"size":415,"offset":"14762044"},"modulo.js":{"size":173,"offset":"14762459"},"msFromTime.js":{"size":257,"offset":"14762632"},"thisBooleanValue.js":{"size":368,"offset":"14762889"},"thisNumberValue.js":{"size":391,"offset":"14763257"},"thisStringValue.js":{"size":362,"offset":"14763648"},"thisTimeValue.js":{"size":268,"offset":"14764010"}}},"2017":{"files":{"AbstractEqualityComparison.js":{"size":1158,"offset":"14595107"},"AbstractRelationalComparison.js":{"size":1652,"offset":"14596265"},"AdvanceStringIndex.js":{"size":1184,"offset":"14597917"},"ArrayCreate.js":{"size":1689,"offset":"14599101"},"ArraySetLength.js":{"size":2671,"offset":"14600790"},"ArraySpeciesCreate.js":{"size":1350,"offset":"14603461"},"Call.js":{"size":464,"offset":"14604811"},"CanonicalNumericIndexString.js":{"size":656,"offset":"14605275"},"CompletePropertyDescriptor.js":{"size":989,"offset":"14605931"},"CreateDataProperty.js":{"size":1288,"offset":"14606920"},"CreateDataPropertyOrThrow.js":{"size":736,"offset":"14608208"},"CreateHTML.js":{"size":934,"offset":"14608944"},"CreateIterResultObject.js":{"size":434,"offset":"14609878"},"CreateListFromArrayLike.js":{"size":1357,"offset":"14610312"},"CreateMethodProperty.js":{"size":985,"offset":"14611669"},"DateFromTime.js":{"size":1043,"offset":"14612654"},"Day.js":{"size":299,"offset":"14613697"},"DayFromYear.js":{"size":323,"offset":"14613996"},"DayWithinYear.js":{"size":291,"offset":"14614319"},"DaysInYear.js":{"size":300,"offset":"14614610"},"DefinePropertyOrThrow.js":{"size":1472,"offset":"14614910"},"DeletePropertyOrThrow.js":{"size":705,"offset":"14616382"},"EnumerableOwnProperties.js":{"size":1131,"offset":"14617087"},"FromPropertyDescriptor.js":{"size":801,"offset":"14618218"},"Get.js":{"size":734,"offset":"14619019"},"GetIterator.js":{"size":874,"offset":"14619753"},"GetMethod.js":{"size":924,"offset":"14620627"},"GetOwnPropertyKeys.js":{"size":823,"offset":"14621551"},"GetPrototypeFromConstructor.js":{"size":923,"offset":"14622374"},"GetSubstitution.js":{"size":3534,"offset":"14623297"},"GetV.js":{"size":571,"offset":"14626831"},"HasOwnProperty.js":{"size":555,"offset":"14627402"},"HasProperty.js":{"size":519,"offset":"14627957"},"HourFromTime.js":{"size":447,"offset":"14628476"},"InLeapYear.js":{"size":517,"offset":"14628923"},"InstanceofOperator.js":{"size":924,"offset":"14629440"},"Invoke.js":{"size":591,"offset":"14630364"},"IsAccessorDescriptor.js":{"size":469,"offset":"14630955"},"IsArray.js":{"size":417,"offset":"14631424"},"IsCallable.js":{"size":117,"offset":"14631841"},"IsConcatSpreadable.js":{"size":628,"offset":"14631958"},"IsConstructor.js":{"size":290,"offset":"14632586"},"IsDataDescriptor.js":{"size":468,"offset":"14632876"},"IsExtensible.js":{"size":510,"offset":"14633344"},"IsGenericDescriptor.js":{"size":564,"offset":"14633854"},"IsInteger.js":{"size":514,"offset":"14634418"},"IsPromise.js":{"size":490,"offset":"14634932"},"IsPropertyDescriptor.js":{"size":523,"offset":"14635422"},"IsPropertyKey.js":{"size":211,"offset":"14635945"},"IsRegExp.js":{"size":547,"offset":"14636156"},"IterableToList.js":{"size":629,"offset":"14636703"},"IteratorClose.js":{"size":1483,"offset":"14637332"},"IteratorComplete.js":{"size":500,"offset":"14638815"},"IteratorNext.js":{"size":495,"offset":"14639315"},"IteratorStep.js":{"size":353,"offset":"14639810"},"IteratorValue.js":{"size":445,"offset":"14640163"},"MakeDate.js":{"size":333,"offset":"14640608"},"MakeDay.js":{"size":936,"offset":"14640941"},"MakeTime.js":{"size":703,"offset":"14641877"},"MinFromTime.js":{"size":461,"offset":"14642580"},"MonthFromTime.js":{"size":1019,"offset":"14643041"},"ObjectCreate.js":{"size":1039,"offset":"14644060"},"OrdinaryDefineOwnProperty.js":{"size":2396,"offset":"14645099"},"OrdinaryGetOwnProperty.js":{"size":1264,"offset":"14647495"},"OrdinaryGetPrototypeOf.js":{"size":546,"offset":"14648759"},"OrdinaryHasInstance.js":{"size":633,"offset":"14649305"},"OrdinaryHasProperty.js":{"size":537,"offset":"14649938"},"OrdinarySetPrototypeOf.js":{"size":1208,"offset":"14650475"},"RegExpExec.js":{"size":890,"offset":"14651683"},"RequireObjectCoercible.js":{"size":70,"offset":"14652573"},"SameValue.js":{"size":316,"offset":"14652643"},"SameValueNonNumber.js":{"size":461,"offset":"14652959"},"SameValueZero.js":{"size":227,"offset":"14653420"},"SecFromTime.js":{"size":467,"offset":"14653647"},"Set.js":{"size":811,"offset":"14654114"},"SetFunctionName.js":{"size":1392,"offset":"14654925"},"SetIntegrityLevel.js":{"size":1856,"offset":"14656317"},"SpeciesConstructor.js":{"size":846,"offset":"14658173"},"StrictEqualityComparison.js":{"size":370,"offset":"14659019"},"SymbolDescriptiveString.js":{"size":533,"offset":"14659389"},"TestIntegrityLevel.js":{"size":1278,"offset":"14659922"},"TimeClip.js":{"size":487,"offset":"14661200"},"TimeFromYear.js":{"size":266,"offset":"14661687"},"TimeWithinDay.js":{"size":251,"offset":"14661953"},"ToBoolean.js":{"size":139,"offset":"14662204"},"ToDateString.js":{"size":500,"offset":"14662343"},"ToIndex.js":{"size":679,"offset":"14662843"},"ToInt16.js":{"size":264,"offset":"14663522"},"ToInt32.js":{"size":182,"offset":"14663786"},"ToInt8.js":{"size":251,"offset":"14663968"},"ToInteger.js":{"size":277,"offset":"14664219"},"ToLength.js":{"size":332,"offset":"14664496"},"ToNumber.js":{"size":2036,"offset":"14664828"},"ToObject.js":{"size":340,"offset":"14666864"},"ToPrimitive.js":{"size":291,"offset":"14667204"},"ToPropertyDescriptor.js":{"size":1458,"offset":"14667495"},"ToPropertyKey.js":{"size":411,"offset":"14668953"},"ToString.js":{"size":402,"offset":"14669364"},"ToUint16.js":{"size":651,"offset":"14669766"},"ToUint32.js":{"size":184,"offset":"14670417"},"ToUint8.js":{"size":594,"offset":"14670601"},"ToUint8Clamp.js":{"size":607,"offset":"14671195"},"Type.js":{"size":229,"offset":"14671802"},"ValidateAndApplyPropertyDescriptor.js":{"size":5253,"offset":"14672031"},"WeekDay.js":{"size":214,"offset":"14677284"},"YearFromTime.js":{"size":415,"offset":"14677498"},"modulo.js":{"size":173,"offset":"14677913"},"msFromTime.js":{"size":257,"offset":"14678086"},"thisBooleanValue.js":{"size":368,"offset":"14678343"},"thisNumberValue.js":{"size":391,"offset":"14678711"},"thisStringValue.js":{"size":362,"offset":"14679102"},"thisTimeValue.js":{"size":268,"offset":"14679464"}}},"2018":{"files":{"AbstractEqualityComparison.js":{"size":1158,"offset":"14504274"},"AbstractRelationalComparison.js":{"size":1652,"offset":"14505432"},"AdvanceStringIndex.js":{"size":1184,"offset":"14507084"},"ArrayCreate.js":{"size":1689,"offset":"14508268"},"ArraySetLength.js":{"size":2671,"offset":"14509957"},"ArraySpeciesCreate.js":{"size":1350,"offset":"14512628"},"Call.js":{"size":464,"offset":"14513978"},"CanonicalNumericIndexString.js":{"size":656,"offset":"14514442"},"CompletePropertyDescriptor.js":{"size":989,"offset":"14515098"},"CopyDataProperties.js":{"size":1717,"offset":"14516087"},"CreateDataProperty.js":{"size":1288,"offset":"14517804"},"CreateDataPropertyOrThrow.js":{"size":736,"offset":"14519092"},"CreateHTML.js":{"size":934,"offset":"14519828"},"CreateIterResultObject.js":{"size":434,"offset":"14520762"},"CreateListFromArrayLike.js":{"size":1357,"offset":"14521196"},"CreateMethodProperty.js":{"size":985,"offset":"14522553"},"DateFromTime.js":{"size":1043,"offset":"14523538"},"DateString.js":{"size":1066,"offset":"14524581"},"Day.js":{"size":299,"offset":"14525647"},"DayFromYear.js":{"size":323,"offset":"14525946"},"DayWithinYear.js":{"size":291,"offset":"14526269"},"DaysInYear.js":{"size":300,"offset":"14526560"},"DefinePropertyOrThrow.js":{"size":1472,"offset":"14526860"},"DeletePropertyOrThrow.js":{"size":705,"offset":"14528332"},"EnumerableOwnPropertyNames.js":{"size":1131,"offset":"14529037"},"FromPropertyDescriptor.js":{"size":801,"offset":"14530168"},"Get.js":{"size":734,"offset":"14530969"},"GetIterator.js":{"size":874,"offset":"14531703"},"GetMethod.js":{"size":924,"offset":"14532577"},"GetOwnPropertyKeys.js":{"size":823,"offset":"14533501"},"GetPrototypeFromConstructor.js":{"size":923,"offset":"14534324"},"GetSubstitution.js":{"size":4418,"offset":"14535247"},"GetV.js":{"size":571,"offset":"14539665"},"HasOwnProperty.js":{"size":555,"offset":"14540236"},"HasProperty.js":{"size":519,"offset":"14540791"},"HourFromTime.js":{"size":447,"offset":"14541310"},"InLeapYear.js":{"size":517,"offset":"14541757"},"InstanceofOperator.js":{"size":924,"offset":"14542274"},"Invoke.js":{"size":591,"offset":"14543198"},"IsAccessorDescriptor.js":{"size":469,"offset":"14543789"},"IsArray.js":{"size":417,"offset":"14544258"},"IsCallable.js":{"size":117,"offset":"14544675"},"IsConcatSpreadable.js":{"size":628,"offset":"14544792"},"IsConstructor.js":{"size":290,"offset":"14545420"},"IsDataDescriptor.js":{"size":468,"offset":"14545710"},"IsExtensible.js":{"size":510,"offset":"14546178"},"IsGenericDescriptor.js":{"size":564,"offset":"14546688"},"IsInteger.js":{"size":514,"offset":"14547252"},"IsPromise.js":{"size":490,"offset":"14547766"},"IsPropertyKey.js":{"size":211,"offset":"14548256"},"IsRegExp.js":{"size":547,"offset":"14548467"},"IsStringPrefix.js":{"size":952,"offset":"14549014"},"IterableToList.js":{"size":629,"offset":"14549966"},"IteratorClose.js":{"size":1483,"offset":"14550595"},"IteratorComplete.js":{"size":500,"offset":"14552078"},"IteratorNext.js":{"size":495,"offset":"14552578"},"IteratorStep.js":{"size":353,"offset":"14553073"},"IteratorValue.js":{"size":445,"offset":"14553426"},"MakeDate.js":{"size":333,"offset":"14553871"},"MakeDay.js":{"size":936,"offset":"14554204"},"MakeTime.js":{"size":703,"offset":"14555140"},"MinFromTime.js":{"size":461,"offset":"14555843"},"MonthFromTime.js":{"size":1019,"offset":"14556304"},"NumberToString.js":{"size":396,"offset":"14557323"},"ObjectCreate.js":{"size":1039,"offset":"14557719"},"OrdinaryDefineOwnProperty.js":{"size":2396,"offset":"14558758"},"OrdinaryGetOwnProperty.js":{"size":1264,"offset":"14561154"},"OrdinaryGetPrototypeOf.js":{"size":546,"offset":"14562418"},"OrdinaryHasInstance.js":{"size":633,"offset":"14562964"},"OrdinaryHasProperty.js":{"size":537,"offset":"14563597"},"OrdinarySetPrototypeOf.js":{"size":1208,"offset":"14564134"},"PromiseResolve.js":{"size":377,"offset":"14565342"},"RegExpExec.js":{"size":890,"offset":"14565719"},"RequireObjectCoercible.js":{"size":70,"offset":"14566609"},"SameValue.js":{"size":316,"offset":"14566679"},"SameValueNonNumber.js":{"size":461,"offset":"14566995"},"SameValueZero.js":{"size":227,"offset":"14567456"},"SecFromTime.js":{"size":467,"offset":"14567683"},"Set.js":{"size":811,"offset":"14568150"},"SetFunctionName.js":{"size":1392,"offset":"14568961"},"SetIntegrityLevel.js":{"size":1856,"offset":"14570353"},"SpeciesConstructor.js":{"size":846,"offset":"14572209"},"StrictEqualityComparison.js":{"size":370,"offset":"14573055"},"SymbolDescriptiveString.js":{"size":533,"offset":"14573425"},"TestIntegrityLevel.js":{"size":1278,"offset":"14573958"},"TimeClip.js":{"size":487,"offset":"14575236"},"TimeFromYear.js":{"size":266,"offset":"14575723"},"TimeString.js":{"size":819,"offset":"14575989"},"TimeWithinDay.js":{"size":251,"offset":"14576808"},"ToBoolean.js":{"size":139,"offset":"14577059"},"ToDateString.js":{"size":500,"offset":"14577198"},"ToIndex.js":{"size":679,"offset":"14577698"},"ToInt16.js":{"size":264,"offset":"14578377"},"ToInt32.js":{"size":182,"offset":"14578641"},"ToInt8.js":{"size":251,"offset":"14578823"},"ToInteger.js":{"size":277,"offset":"14579074"},"ToLength.js":{"size":332,"offset":"14579351"},"ToNumber.js":{"size":2036,"offset":"14579683"},"ToObject.js":{"size":340,"offset":"14581719"},"ToPrimitive.js":{"size":291,"offset":"14582059"},"ToPropertyDescriptor.js":{"size":1458,"offset":"14582350"},"ToPropertyKey.js":{"size":411,"offset":"14583808"},"ToString.js":{"size":402,"offset":"14584219"},"ToUint16.js":{"size":651,"offset":"14584621"},"ToUint32.js":{"size":184,"offset":"14585272"},"ToUint8.js":{"size":594,"offset":"14585456"},"ToUint8Clamp.js":{"size":607,"offset":"14586050"},"Type.js":{"size":229,"offset":"14586657"},"ValidateAndApplyPropertyDescriptor.js":{"size":5253,"offset":"14586886"},"WeekDay.js":{"size":214,"offset":"14592139"},"YearFromTime.js":{"size":415,"offset":"14592353"},"modulo.js":{"size":173,"offset":"14592768"},"msFromTime.js":{"size":257,"offset":"14592941"},"thisBooleanValue.js":{"size":368,"offset":"14593198"},"thisNumberValue.js":{"size":391,"offset":"14593566"},"thisStringValue.js":{"size":362,"offset":"14593957"},"thisSymbolValue.js":{"size":520,"offset":"14594319"},"thisTimeValue.js":{"size":268,"offset":"14594839"}}},"2019":{"files":{"AbstractEqualityComparison.js":{"size":1158,"offset":"14409564"},"AbstractRelationalComparison.js":{"size":1652,"offset":"14410722"},"AddEntriesFromIterable.js":{"size":1504,"offset":"14412374"},"AdvanceStringIndex.js":{"size":1184,"offset":"14413878"},"ArrayCreate.js":{"size":1689,"offset":"14415062"},"ArraySetLength.js":{"size":2671,"offset":"14416751"},"ArraySpeciesCreate.js":{"size":1350,"offset":"14419422"},"Call.js":{"size":464,"offset":"14420772"},"CanonicalNumericIndexString.js":{"size":656,"offset":"14421236"},"CompletePropertyDescriptor.js":{"size":989,"offset":"14421892"},"CopyDataProperties.js":{"size":1717,"offset":"14422881"},"CreateDataProperty.js":{"size":1288,"offset":"14424598"},"CreateDataPropertyOrThrow.js":{"size":736,"offset":"14425886"},"CreateHTML.js":{"size":934,"offset":"14426622"},"CreateIterResultObject.js":{"size":434,"offset":"14427556"},"CreateListFromArrayLike.js":{"size":1357,"offset":"14427990"},"CreateMethodProperty.js":{"size":985,"offset":"14429347"},"DateFromTime.js":{"size":1043,"offset":"14430332"},"DateString.js":{"size":1066,"offset":"14431375"},"Day.js":{"size":299,"offset":"14432441"},"DayFromYear.js":{"size":323,"offset":"14432740"},"DayWithinYear.js":{"size":291,"offset":"14433063"},"DaysInYear.js":{"size":300,"offset":"14433354"},"DefinePropertyOrThrow.js":{"size":1472,"offset":"14433654"},"DeletePropertyOrThrow.js":{"size":705,"offset":"14435126"},"EnumerableOwnPropertyNames.js":{"size":1131,"offset":"14435831"},"FlattenIntoArray.js":{"size":1763,"offset":"14436962"},"FromPropertyDescriptor.js":{"size":801,"offset":"14438725"},"Get.js":{"size":734,"offset":"14439526"},"GetIterator.js":{"size":874,"offset":"14440260"},"GetMethod.js":{"size":924,"offset":"14441134"},"GetOwnPropertyKeys.js":{"size":823,"offset":"14442058"},"GetPrototypeFromConstructor.js":{"size":923,"offset":"14442881"},"GetSubstitution.js":{"size":4418,"offset":"14443804"},"GetV.js":{"size":571,"offset":"14448222"},"HasOwnProperty.js":{"size":555,"offset":"14448793"},"HasProperty.js":{"size":519,"offset":"14449348"},"HourFromTime.js":{"size":447,"offset":"14449867"},"InLeapYear.js":{"size":517,"offset":"14450314"},"InstanceofOperator.js":{"size":924,"offset":"14450831"},"Invoke.js":{"size":591,"offset":"14451755"},"IsAccessorDescriptor.js":{"size":469,"offset":"14452346"},"IsArray.js":{"size":417,"offset":"14452815"},"IsCallable.js":{"size":117,"offset":"14453232"},"IsConcatSpreadable.js":{"size":628,"offset":"14453349"},"IsConstructor.js":{"size":290,"offset":"14453977"},"IsDataDescriptor.js":{"size":468,"offset":"14454267"},"IsExtensible.js":{"size":510,"offset":"14454735"},"IsGenericDescriptor.js":{"size":564,"offset":"14455245"},"IsInteger.js":{"size":514,"offset":"14455809"},"IsPromise.js":{"size":490,"offset":"14456323"},"IsPropertyKey.js":{"size":211,"offset":"14456813"},"IsRegExp.js":{"size":547,"offset":"14457024"},"IsStringPrefix.js":{"size":952,"offset":"14457571"},"IterableToList.js":{"size":629,"offset":"14458523"},"IteratorClose.js":{"size":1483,"offset":"14459152"},"IteratorComplete.js":{"size":500,"offset":"14460635"},"IteratorNext.js":{"size":495,"offset":"14461135"},"IteratorStep.js":{"size":353,"offset":"14461630"},"IteratorValue.js":{"size":445,"offset":"14461983"},"MakeDate.js":{"size":333,"offset":"14462428"},"MakeDay.js":{"size":936,"offset":"14462761"},"MakeTime.js":{"size":703,"offset":"14463697"},"MinFromTime.js":{"size":461,"offset":"14464400"},"MonthFromTime.js":{"size":1019,"offset":"14464861"},"NumberToString.js":{"size":396,"offset":"14465880"},"ObjectCreate.js":{"size":1039,"offset":"14466276"},"OrdinaryDefineOwnProperty.js":{"size":2396,"offset":"14467315"},"OrdinaryGetOwnProperty.js":{"size":1264,"offset":"14469711"},"OrdinaryGetPrototypeOf.js":{"size":546,"offset":"14470975"},"OrdinaryHasInstance.js":{"size":633,"offset":"14471521"},"OrdinaryHasProperty.js":{"size":537,"offset":"14472154"},"OrdinarySetPrototypeOf.js":{"size":1208,"offset":"14472691"},"PromiseResolve.js":{"size":377,"offset":"14473899"},"RegExpExec.js":{"size":890,"offset":"14474276"},"RequireObjectCoercible.js":{"size":70,"offset":"14475166"},"SameValue.js":{"size":316,"offset":"14475236"},"SameValueNonNumber.js":{"size":461,"offset":"14475552"},"SameValueZero.js":{"size":227,"offset":"14476013"},"SecFromTime.js":{"size":467,"offset":"14476240"},"Set.js":{"size":811,"offset":"14476707"},"SetFunctionName.js":{"size":1392,"offset":"14477518"},"SetIntegrityLevel.js":{"size":1856,"offset":"14478910"},"SpeciesConstructor.js":{"size":846,"offset":"14480766"},"StrictEqualityComparison.js":{"size":370,"offset":"14481612"},"SymbolDescriptiveString.js":{"size":533,"offset":"14481982"},"TestIntegrityLevel.js":{"size":1278,"offset":"14482515"},"TimeClip.js":{"size":487,"offset":"14483793"},"TimeFromYear.js":{"size":266,"offset":"14484280"},"TimeString.js":{"size":819,"offset":"14484546"},"TimeWithinDay.js":{"size":251,"offset":"14485365"},"ToBoolean.js":{"size":139,"offset":"14485616"},"ToDateString.js":{"size":500,"offset":"14485755"},"ToIndex.js":{"size":679,"offset":"14486255"},"ToInt16.js":{"size":264,"offset":"14486934"},"ToInt32.js":{"size":182,"offset":"14487198"},"ToInt8.js":{"size":251,"offset":"14487380"},"ToInteger.js":{"size":277,"offset":"14487631"},"ToLength.js":{"size":332,"offset":"14487908"},"ToNumber.js":{"size":2036,"offset":"14488240"},"ToObject.js":{"size":340,"offset":"14490276"},"ToPrimitive.js":{"size":291,"offset":"14490616"},"ToPropertyDescriptor.js":{"size":1458,"offset":"14490907"},"ToPropertyKey.js":{"size":411,"offset":"14492365"},"ToString.js":{"size":402,"offset":"14492776"},"ToUint16.js":{"size":651,"offset":"14493178"},"ToUint32.js":{"size":184,"offset":"14493829"},"ToUint8.js":{"size":594,"offset":"14494013"},"ToUint8Clamp.js":{"size":607,"offset":"14494607"},"TrimString.js":{"size":812,"offset":"14495214"},"Type.js":{"size":229,"offset":"14496026"},"ValidateAndApplyPropertyDescriptor.js":{"size":5253,"offset":"14496255"},"WeekDay.js":{"size":214,"offset":"14501508"},"YearFromTime.js":{"size":415,"offset":"14501722"},"modulo.js":{"size":173,"offset":"14502137"},"msFromTime.js":{"size":257,"offset":"14502310"},"thisBooleanValue.js":{"size":368,"offset":"14502567"},"thisNumberValue.js":{"size":391,"offset":"14502935"},"thisStringValue.js":{"size":362,"offset":"14503326"},"thisSymbolValue.js":{"size":520,"offset":"14503688"},"thisTimeValue.js":{"size":66,"offset":"14504208"}}},".editorconfig":{"size":276,"offset":"14204421"},".eslintignore":{"size":9,"offset":"14204697"},".nycrc":{"size":232,"offset":"14204706"},"GetIntrinsic.js":{"size":10084,"offset":"14204938"},"LICENSE":{"size":1080,"offset":"14215022"},"es2015.js":{"size":5576,"offset":"14216102"},"es2016.js":{"size":5836,"offset":"14221678"},"es2017.js":{"size":5873,"offset":"14227514"},"es2018.js":{"size":6167,"offset":"14233387"},"es2019.js":{"size":6333,"offset":"14239554"},"es5.js":{"size":1971,"offset":"14245887"},"es6.js":{"size":53,"offset":"14247858"},"es7.js":{"size":53,"offset":"14247911"},"index.js":{"size":529,"offset":"14247964"},"package.json":{"size":2013,"offset":"14248493"},"operations":{"files":{"2015.js":{"size":9782,"offset":"14250506"},"2016.js":{"size":24764,"offset":"14260288"},"2017.js":{"size":28901,"offset":"14285052"},"2018.js":{"size":31402,"offset":"14313953"},"2019.js":{"size":32266,"offset":"14345355"}}},"helpers":{"files":{"DefineOwnProperty.js":{"size":1200,"offset":"14377621"},"OwnPropertyKeys.js":{"size":633,"offset":"14378821"},"assertRecord.js":{"size":1293,"offset":"14379454"},"assign.js":{"size":451,"offset":"14380747"},"callBind.js":{"size":373,"offset":"14381198"},"callBound.js":{"size":418,"offset":"14381571"},"every.js":{"size":193,"offset":"14381989"},"forEach.js":{"size":190,"offset":"14382182"},"getInferredName.js":{"size":287,"offset":"14382372"},"getIteratorMethod.js":{"size":1084,"offset":"14382659"},"getOwnPropertyDescriptor.js":{"size":258,"offset":"14383743"},"getProto.js":{"size":384,"offset":"14384001"},"getSymbolDescription.js":{"size":852,"offset":"14384385"},"isFinite.js":{"size":214,"offset":"14385237"},"isNaN.js":{"size":88,"offset":"14385451"},"isPrefixOf.js":{"size":306,"offset":"14385539"},"isPrimitive.js":{"size":151,"offset":"14385845"},"isPropertyDescriptor.js":{"size":705,"offset":"14385996"},"isSamePropertyDescriptor.js":{"size":389,"offset":"14386701"},"maxSafeInteger.js":{"size":207,"offset":"14387090"},"mod.js":{"size":157,"offset":"14387297"},"padTimeComponent.js":{"size":221,"offset":"14387454"},"regexTester.js":{"size":236,"offset":"14387675"},"setProto.js":{"size":446,"offset":"14387911"},"sign.js":{"size":89,"offset":"14388357"},"timeConstants.js":{"size":450,"offset":"14388446"}}},".github":{"files":{"FUNDING.yml":{"size":557,"offset":"14844672"},"workflows":{"files":{"rebase.yml":{"size":250,"offset":"14845229"}}}}}}},"es-to-primitive":{"files":{"LICENSE":{"size":1082,"offset":"14845479"},"Makefile":{"size":3834,"offset":"14846561"},"es2015.js":{"size":2139,"offset":"14850395"},"es5.js":{"size":1199,"offset":"14852534"},"es6.js":{"size":53,"offset":"14853733"},"index.js":{"size":454,"offset":"14853786"},"package.json":{"size":1433,"offset":"14854240"},"helpers":{"files":{"isPrimitive.js":{"size":151,"offset":"14855673"}}},".github":{"files":{"FUNDING.yml":{"size":586,"offset":"14855824"}}}}},"escape-string-regexp":{"files":{"index.js":{"size":226,"offset":"26742452"},"license":{"size":1119,"offset":"26742678"},"package.json":{"size":851,"offset":"26743797"}}},"esprima":{"files":{"LICENSE.BSD":{"size":1303,"offset":"26744648"},"package.json":{"size":1592,"offset":"26745951"},"dist":{"files":{"esprima.js":{"size":283567,"offset":"26747543"}}},"bin":{"files":{"esparse.js":{"size":4948,"offset":"27031110","executable":true},"esvalidate.js":{"size":7744,"offset":"27036058","executable":true}}}}},"extsprintf":{"files":{".gitmodules":{"size":0,"offset":"27073662"},"LICENSE":{"size":1077,"offset":"27073662"},"Makefile":{"size":533,"offset":"27074739"},"Makefile.targ":{"size":8390,"offset":"27075272"},"jsl.node.conf":{"size":6982,"offset":"27083662"},"package.json":{"size":387,"offset":"27090644"},"lib":{"files":{"extsprintf.js":{"size":4172,"offset":"27091031"}}}}},"fast-deep-equal":{"files":{"LICENSE":{"size":1074,"offset":"27095203"},"index.js":{"size":1177,"offset":"27096277"},"package.json":{"size":795,"offset":"27097454"},"react.js":{"size":1451,"offset":"27098249"},"es6":{"files":{"index.js":{"size":1935,"offset":"27099700"},"react.js":{"size":2209,"offset":"27101635"}}}}},"fast-json-parse":{"files":{"LICENSE":{"size":1081,"offset":"27103844"},"benchmark.js":{"size":1783,"offset":"27104925"},"package.json":{"size":622,"offset":"27106708"},"parse.js":{"size":250,"offset":"27107330"}}},"fast-json-stable-stringify":{"files":{".eslintrc.yml":{"size":562,"offset":"27107580"},"LICENSE":{"size":1145,"offset":"27108142"},"index.js":{"size":1845,"offset":"27109287"},"package.json":{"size":902,"offset":"27111132"},"benchmark":{"files":{"index.js":{"size":740,"offset":"27112034"},"test.json":{"size":3828,"offset":"27112774"}}},".github":{"files":{"FUNDING.yml":{"size":43,"offset":"27116602"}}}}},"for-each":{"files":{".editorconfig":{"size":286,"offset":"15200743"},"LICENSE":{"size":1075,"offset":"15201029"},"index.js":{"size":1761,"offset":"15202104"},"package.json":{"size":1094,"offset":"15203865"}}},"fs-extra":{"files":{"LICENSE":{"size":1084,"offset":"27164991"},"package.json":{"size":1015,"offset":"27166075"},"lib":{"files":{"index.js":{"size":702,"offset":"27167090"},"util":{"files":{"buffer.js":{"size":276,"offset":"27167792"},"stat.js":{"size":5700,"offset":"27168068"},"utimes.js":{"size":2370,"offset":"27173768"}}},"remove":{"files":{"index.js":{"size":165,"offset":"27176138"},"rimraf.js":{"size":7673,"offset":"27176303"}}},"path-exists":{"files":{"index.js":{"size":263,"offset":"27183976"}}},"output":{"files":{"index.js":{"size":947,"offset":"27184239"}}},"move-sync":{"files":{"index.js":{"size":70,"offset":"27185186"},"move-sync.js":{"size":1199,"offset":"27185256"}}},"move":{"files":{"index.js":{"size":111,"offset":"27186455"},"move.js":{"size":1631,"offset":"27186566"}}},"mkdirs":{"files":{"index.js":{"size":292,"offset":"27188197"},"mkdirs-sync.js":{"size":1251,"offset":"27188489"},"mkdirs.js":{"size":1636,"offset":"27189740"},"win32.js":{"size":517,"offset":"27191376"}}},"json":{"files":{"index.js":{"size":509,"offset":"27191893"},"jsonfile.js":{"size":291,"offset":"27192402"},"output-json-sync.js":{"size":375,"offset":"27192693"},"output-json.js":{"size":657,"offset":"27193068"}}},"fs":{"files":{"index.js":{"size":2799,"offset":"27193725"}}},"ensure":{"files":{"file.js":{"size":1105,"offset":"27196524"},"index.js":{"size":623,"offset":"27197629"},"link.js":{"size":1564,"offset":"27198252"},"symlink-paths.js":{"size":3398,"offset":"27199816"},"symlink-type.js":{"size":698,"offset":"27203214"},"symlink.js":{"size":2050,"offset":"27203912"}}},"empty":{"files":{"index.js":{"size":992,"offset":"27205962"}}},"copy-sync":{"files":{"copy-sync.js":{"size":5431,"offset":"27206954"},"index.js":{"size":70,"offset":"27212385"}}},"copy":{"files":{"copy.js":{"size":6998,"offset":"27212455"},"index.js":{"size":111,"offset":"27219453"}}}}}}},"fs-extra-p":{"files":{"LICENSE":{"size":1086,"offset":"27219564"},"index.js":{"size":1310,"offset":"27220650"},"package.json":{"size":490,"offset":"27221960"}}},"fs.realpath":{"files":{"LICENSE":{"size":2125,"offset":"27222450"},"index.js":{"size":1308,"offset":"27224575"},"old.js":{"size":8542,"offset":"27225883"},"package.json":{"size":589,"offset":"27234425"}}},"function-bind":{"files":{".editorconfig":{"size":286,"offset":"15274982"},".jscs.json":{"size":4140,"offset":"15275268"},"LICENSE":{"size":1052,"offset":"15279408"},"implementation.js":{"size":1463,"offset":"15280460"},"index.js":{"size":126,"offset":"15281923"},"package.json":{"size":948,"offset":"15282049"}}},"get-stdin":{"files":{"index.js":{"size":715,"offset":"27238764"},"package.json":{"size":570,"offset":"27239479"}}},"glob":{"files":{"LICENSE":{"size":976,"offset":"27248683"},"common.js":{"size":6167,"offset":"27249659"},"glob.js":{"size":19433,"offset":"27255826"},"package.json":{"size":871,"offset":"27275259"},"sync.js":{"size":12002,"offset":"27276130"}}},"graceful-fs":{"files":{"LICENSE":{"size":781,"offset":"27333469"},"clone.js":{"size":401,"offset":"27334250"},"graceful-fs.js":{"size":8965,"offset":"27334651"},"legacy-streams.js":{"size":2655,"offset":"27343616"},"package.json":{"size":677,"offset":"27346271"},"polyfills.js":{"size":9519,"offset":"27346948"}}},"has":{"files":{"LICENSE-MIT":{"size":1060,"offset":"15346578"},"package.json":{"size":728,"offset":"15347638"},"src":{"files":{"index.js":{"size":129,"offset":"15348366"}}}}},"has-flag":{"files":{"index.js":{"size":320,"offset":"27375271"},"license":{"size":1109,"offset":"27375591"},"package.json":{"size":558,"offset":"27376700"}}},"has-symbols":{"files":{"LICENSE":{"size":1071,"offset":"15350482"},"index.js":{"size":394,"offset":"15351553"},"package.json":{"size":1457,"offset":"15351947"},"shams.js":{"size":1740,"offset":"15353404"},".github":{"files":{"FUNDING.yml":{"size":582,"offset":"15355144"},"workflows":{"files":{"rebase.yml":{"size":250,"offset":"15355726"}}}}}}},"hosted-git-info":{"files":{"LICENSE":{"size":733,"offset":"27379242"},"git-host-info.js":{"size":3790,"offset":"27379975"},"git-host.js":{"size":4635,"offset":"27383765"},"index.js":{"size":5163,"offset":"27388400"},"package.json":{"size":684,"offset":"27393563"}}},"inflight":{"files":{"LICENSE":{"size":748,"offset":"27806481"},"inflight.js":{"size":1365,"offset":"27807229"},"package.json":{"size":604,"offset":"27808594"}}},"inherits":{"files":{"LICENSE":{"size":749,"offset":"27809198"},"inherits.js":{"size":250,"offset":"27809947"},"inherits_browser.js":{"size":753,"offset":"27810197"},"package.json":{"size":516,"offset":"27810950"}}},"ini":{"files":{"LICENSE":{"size":765,"offset":"27811466"},"ini.js":{"size":4767,"offset":"27812231"},"package.json":{"size":579,"offset":"27816998"}}},"is-arguments":{"files":{".editorconfig":{"size":286,"offset":"15382077"},".jscs.json":{"size":4128,"offset":"15382363"},"LICENSE":{"size":1081,"offset":"15386491"},"index.js":{"size":949,"offset":"15387572"},"package.json":{"size":1129,"offset":"15388521"}}},"is-callable":{"files":{".editorconfig":{"size":286,"offset":"15389650"},".istanbul.yml":{"size":993,"offset":"15389936"},"LICENSE":{"size":1082,"offset":"15390929"},"index.js":{"size":1113,"offset":"15392011"},"package.json":{"size":1412,"offset":"15393124"},".github":{"files":{"FUNDING.yml":{"size":582,"offset":"15394536"},"main.workflow":{"size":258,"offset":"15395118"},"workflows":{"files":{"rebase.yml":{"size":250,"offset":"15395376"}}}}}}},"is-ci":{"files":{"LICENSE":{"size":1091,"offset":"27819764"},"bin.js":{"size":70,"offset":"27820855","executable":true},"index.js":{"size":55,"offset":"27820925"},"package.json":{"size":665,"offset":"27820980"}}},"is-date-object":{"files":{".jscs.json":{"size":4128,"offset":"15397507"},"LICENSE":{"size":1082,"offset":"15401635"},"index.js":{"size":558,"offset":"15402717"},"package.json":{"size":1449,"offset":"15403275"},".github":{"files":{"FUNDING.yml":{"size":585,"offset":"15404724"},"workflows":{"files":{"rebase.yml":{"size":250,"offset":"15405309"}}}}}}},"is-obj":{"files":{"index.js":{"size":137,"offset":"27830901"},"license":{"size":1119,"offset":"27831038"},"package.json":{"size":553,"offset":"27832157"}}},"is-regex":{"files":{"LICENSE":{"size":1081,"offset":"15407368"},"index.js":{"size":1000,"offset":"15408449"},"package.json":{"size":1398,"offset":"15409449"},".github":{"files":{"workflows":{"files":{"rebase.yml":{"size":250,"offset":"15410847"}}}}}}},"is-symbol":{"files":{".editorconfig":{"size":276,"offset":"15411097"},".nvmrc":{"size":5,"offset":"15411373"},"LICENSE":{"size":1082,"offset":"15411378"},"Makefile":{"size":3834,"offset":"15412460"},"index.js":{"size":767,"offset":"15416294"},"package.json":{"size":1437,"offset":"15417061"},".github":{"files":{"FUNDING.yml":{"size":580,"offset":"15418498"},"workflows":{"files":{"rebase.yml":{"size":250,"offset":"15419078"}}}}}}},"isbinaryfile":{"files":{"LICENSE.txt":{"size":1074,"offset":"27850884"},"package.json":{"size":956,"offset":"27851958"},"lib":{"files":{"index.js":{"size":5467,"offset":"27852914"}}},"index.js":{"size":3419,"offset":"19228219"}}},"isexe":{"files":{"LICENSE":{"size":765,"offset":"27858381"},"index.js":{"size":1192,"offset":"27859146"},"mode.js":{"size":909,"offset":"27860338"},"package.json":{"size":579,"offset":"27861247"},"windows.js":{"size":890,"offset":"27861826"}}},"js-yaml":{"files":{"LICENSE":{"size":1084,"offset":"27864980"},"index.js":{"size":81,"offset":"27866064"},"package.json":{"size":904,"offset":"27866145"},"lib":{"files":{"js-yaml.js":{"size":1665,"offset":"27867049"},"js-yaml":{"files":{"common.js":{"size":1177,"offset":"27868714"},"dumper.js":{"size":27488,"offset":"27869891"},"exception.js":{"size":1024,"offset":"27897379"},"loader.js":{"size":44356,"offset":"27898403"},"mark.js":{"size":1562,"offset":"27942759"},"schema.js":{"size":2753,"offset":"27944321"},"type.js":{"size":1586,"offset":"27947074"},"type":{"files":{"binary.js":{"size":3274,"offset":"27948660"},"bool.js":{"size":971,"offset":"27951934"},"float.js":{"size":2840,"offset":"27952905"},"int.js":{"size":4066,"offset":"27955745"},"map.js":{"size":190,"offset":"27959811"},"merge.js":{"size":230,"offset":"27960001"},"null.js":{"size":761,"offset":"27960231"},"omap.js":{"size":1023,"offset":"27960992"},"pairs.js":{"size":1084,"offset":"27962015"},"seq.js":{"size":191,"offset":"27963099"},"set.js":{"size":547,"offset":"27963290"},"str.js":{"size":189,"offset":"27963837"},"timestamp.js":{"size":2571,"offset":"27964026"},"js":{"files":{"function.js":{"size":2819,"offset":"27966597"},"regexp.js":{"size":1572,"offset":"27969416"},"undefined.js":{"size":573,"offset":"27970988"}}}}},"schema":{"files":{"core.js":{"size":362,"offset":"27971561"},"default_full.js":{"size":610,"offset":"27971923"},"default_safe.js":{"size":601,"offset":"27972533"},"failsafe.js":{"size":278,"offset":"27973134"},"json.js":{"size":586,"offset":"27973412"}}}}}}},"dist":{"files":{"js-yaml.js":{"size":110455,"offset":"27973998"},"js-yaml.min.js":{"size":42686,"offset":"28084453"}}},"bin":{"files":{"js-yaml.js":{"size":2727,"offset":"28127139","executable":true}}}}},"jsbn":{"files":{"LICENSE":{"size":1543,"offset":"28129866"},"example.html":{"size":200,"offset":"28131409"},"example.js":{"size":107,"offset":"28131609"},"index.js":{"size":41819,"offset":"28131716"},"package.json":{"size":503,"offset":"28173535"}}},"json-schema-traverse":{"files":{".eslintrc.yml":{"size":630,"offset":"28320880"},"LICENSE":{"size":1074,"offset":"28321510"},"index.js":{"size":2373,"offset":"28322584"},"package.json":{"size":598,"offset":"28324957"},"spec":{"files":{".eslintrc.yml":{"size":91,"offset":"28325555"},"index.spec.js":{"size":6042,"offset":"28325646"},"fixtures":{"files":{"schema.js":{"size":5544,"offset":"28331688"}}}}}}},"json5":{"files":{"LICENSE.md":{"size":1145,"offset":"28340176"},"package.json":{"size":1159,"offset":"28341321"},"lib":{"files":{"cli.js":{"size":2899,"offset":"28342480","executable":true},"index.js":{"size":143,"offset":"28345379"},"parse.js":{"size":21393,"offset":"28345522"},"register.js":{"size":374,"offset":"28366915"},"require.js":{"size":163,"offset":"28367289"},"stringify.js":{"size":6983,"offset":"28367452"},"unicode.js":{"size":15815,"offset":"28374435"},"util.js":{"size":885,"offset":"28390250"}}},"dist":{"files":{"index.js":{"size":57563,"offset":"28391135"},"index.min.js":{"size":31305,"offset":"28448698"},"index.min.mjs":{"size":29135,"offset":"28480003"},"index.mjs":{"size":45415,"offset":"28509138"}}}}},"jsonfile":{"files":{"LICENSE":{"size":1110,"offset":"28554553"},"index.js":{"size":2838,"offset":"28555663"},"package.json":{"size":673,"offset":"28558501"}}},"lazy-val":{"files":{"package.json":{"size":623,"offset":"28637599"},"out":{"files":{"main.js":{"size":572,"offset":"28638222"},"main.js.map":{"size":1072,"offset":"28638794"}}}}},"lowercase-keys":{"files":{"index.js":{"size":208,"offset":"28647669"},"license":{"size":1119,"offset":"28647877"},"package.json":{"size":564,"offset":"28648996"}}},"map-obj":{"files":{"index.js":{"size":240,"offset":"28665370"},"license":{"size":1119,"offset":"28665610"},"package.json":{"size":560,"offset":"28666729"}}},"mime":{"files":{"LICENSE":{"size":1098,"offset":"28671373"},"Mime.js":{"size":2872,"offset":"28672471"},"cli.js":{"size":157,"offset":"28675343","executable":true},"index.js":{"size":127,"offset":"28675500"},"lite.js":{"size":101,"offset":"28675627"},"package.json":{"size":852,"offset":"28675728"},"types":{"files":{"other.js":{"size":25588,"offset":"28676580"},"standard.js":{"size":9310,"offset":"28702168"}}}}},"mime-db":{"files":{"HISTORY.md":{"size":10913,"offset":"28711478"},"LICENSE":{"size":1099,"offset":"28722391"},"db.json":{"size":178741,"offset":"28723490"},"index.js":{"size":136,"offset":"28902231"},"package.json":{"size":918,"offset":"28902367"}}},"mime-types":{"files":{"HISTORY.md":{"size":7090,"offset":"28903285"},"LICENSE":{"size":1167,"offset":"28910375"},"index.js":{"size":3663,"offset":"28911542"},"package.json":{"size":798,"offset":"28915205"}}},"mimic-response":{"files":{"index.js":{"size":758,"offset":"28916003"},"license":{"size":1109,"offset":"28916761"},"package.json":{"size":637,"offset":"28917870"}}},"minimatch":{"files":{"LICENSE":{"size":765,"offset":"28918507"},"minimatch.js":{"size":25347,"offset":"28919272"},"package.json":{"size":607,"offset":"28944619"}}},"minimist":{"files":{"LICENSE":{"size":1073,"offset":"28945226"},"index.js":{"size":7652,"offset":"28946299"},"package.json":{"size":745,"offset":"28953951"}}},"ms":{"files":{"index.js":{"size":3023,"offset":"28960230"},"license.md":{"size":1077,"offset":"28963253"},"package.json":{"size":607,"offset":"28964330"}}},"nice-try":{"files":{"LICENSE":{"size":1079,"offset":"28964937"},"package.json":{"size":571,"offset":"28966016"},"src":{"files":{"index.js":{"size":303,"offset":"28966587"}}}}},"nopt":{"files":{"LICENSE":{"size":765,"offset":"28966890"},"package.json":{"size":654,"offset":"28967655"},"lib":{"files":{"nopt.js":{"size":12226,"offset":"28968309"}}},"bin":{"files":{"nopt.js":{"size":1549,"offset":"28980535","executable":true}}}}},"normalize-package-data":{"files":{"AUTHORS":{"size":152,"offset":"28982084"},"LICENSE":{"size":1394,"offset":"28982236"},"package.json":{"size":801,"offset":"28983630"},"lib":{"files":{"extract_description.js":{"size":509,"offset":"28984431"},"fixer.js":{"size":11802,"offset":"28984940"},"make_warning.js":{"size":710,"offset":"28996742"},"normalize.js":{"size":1341,"offset":"28997452"},"safe_format.js":{"size":246,"offset":"28998793"},"typos.json":{"size":747,"offset":"28999039"},"warning_messages.json":{"size":1798,"offset":"28999786"}}}}},"object-inspect":{"files":{".eslintignore":{"size":10,"offset":"16305581"},".nycrc":{"size":291,"offset":"16305591"},"LICENSE":{"size":1071,"offset":"16305882"},"index.js":{"size":9840,"offset":"16306953"},"package.json":{"size":1120,"offset":"16316793"},"test-core-js.js":{"size":309,"offset":"16317913"},"util.inspect.js":{"size":42,"offset":"16318222"}}},"object-is":{"files":{"LICENSE":{"size":1081,"offset":"16318264"},"index.js":{"size":352,"offset":"16319345"},"package.json":{"size":1343,"offset":"16319697"},".github":{"files":{"workflows":{"files":{"rebase.yml":{"size":250,"offset":"16321040"}}}}}}},"object-keys":{"files":{".editorconfig":{"size":276,"offset":"16321290"},"LICENSE":{"size":1080,"offset":"16321566"},"implementation.js":{"size":3218,"offset":"16322646"},"index.js":{"size":52,"offset":"29069530"},"isArguments.js":{"size":437,"offset":"29069582"},"package.json":{"size":1011,"offset":"29070019"},"foreach.js":{"size":1061,"offset":"29068469"},"shim.js":{"size":1547,"offset":"29071030"}}},"object.assign":{"files":{".editorconfig":{"size":286,"offset":"16328316"},"LICENSE":{"size":1080,"offset":"16328602"},"auto.js":{"size":36,"offset":"16329682"},"hasSymbols.js":{"size":1566,"offset":"16329718"},"implementation.js":{"size":1296,"offset":"16331284"},"index.js":{"size":355,"offset":"16332580"},"package.json":{"size":1325,"offset":"16332935"},"polyfill.js":{"size":1281,"offset":"16334260"},"shim.js":{"size":305,"offset":"16335541"},"test.sh":{"size":1536,"offset":"16335846"},"dist":{"files":{"browser.js":{"size":14020,"offset":"16337382"}}}}},"objectorarray":{"files":{"LICENSE":{"size":1103,"offset":"29072577"},"index.js":{"size":108,"offset":"29073680"},"package.json":{"size":497,"offset":"29073788"}}},"once":{"files":{"LICENSE":{"size":765,"offset":"29074285"},"once.js":{"size":935,"offset":"29075050"},"package.json":{"size":578,"offset":"29075985"}}},"os-homedir":{"files":{"index.js":{"size":608,"offset":"29076563"},"license":{"size":1119,"offset":"29077171"},"package.json":{"size":604,"offset":"29078290"}}},"os-tmpdir":{"files":{"index.js":{"size":572,"offset":"29078894"},"license":{"size":1119,"offset":"29079466"},"package.json":{"size":567,"offset":"29080585"}}},"osenv":{"files":{"LICENSE":{"size":765,"offset":"29081152"},"osenv.js":{"size":1864,"offset":"29081917"},"package.json":{"size":657,"offset":"29083781"}}},"path-exists":{"files":{"index.js":{"size":252,"offset":"29139483"},"license":{"size":1119,"offset":"29139735"},"package.json":{"size":556,"offset":"29140854"}}},"path-is-absolute":{"files":{"index.js":{"size":611,"offset":"29141410"},"license":{"size":1119,"offset":"29142021"},"package.json":{"size":583,"offset":"29143140"}}},"path-key":{"files":{"index.js":{"size":281,"offset":"29147059"},"license":{"size":1119,"offset":"29147340"},"package.json":{"size":577,"offset":"29148459"}}},"path-parse":{"files":{"LICENSE":{"size":1080,"offset":"29149036"},"index.js":{"size":2586,"offset":"29150116"},"package.json":{"size":421,"offset":"29152702"}}},"pify":{"files":{"index.js":{"size":1432,"offset":"29162951"},"license":{"size":1119,"offset":"29164383"},"package.json":{"size":612,"offset":"29165502"}}},"pinkie":{"files":{"index.js":{"size":5935,"offset":"29166114"},"license":{"size":1128,"offset":"29172049"},"package.json":{"size":715,"offset":"29173177"}}},"pinkie-promise":{"files":{"index.js":{"size":93,"offset":"29173892"},"license":{"size":1128,"offset":"29173985"},"package.json":{"size":609,"offset":"29175113"}}},"plist":{"files":{"History.md":{"size":8036,"offset":"29175722"},"LICENSE":{"size":1107,"offset":"29183758"},"Makefile":{"size":1560,"offset":"29184865"},"index.js":{"size":335,"offset":"29186425"},"package.json":{"size":704,"offset":"29186760"},"lib":{"files":{"build.js":{"size":3333,"offset":"29187464"},"parse.js":{"size":5166,"offset":"29190797"}}},"dist":{"files":{"plist-build.js":{"size":91916,"offset":"29195963"},"plist-parse.js":{"size":121239,"offset":"29287879"},"plist.js":{"size":209076,"offset":"29409118"}}}}},"pump":{"files":{"LICENSE":{"size":1078,"offset":"30075726"},"index.js":{"size":2224,"offset":"30076804"},"package.json":{"size":524,"offset":"30079028"},"test-browser.js":{"size":1172,"offset":"30079552"},"test-node.js":{"size":992,"offset":"30080724"}}},"punycode":{"files":{"LICENSE-MIT.txt":{"size":1077,"offset":"30081716"},"package.json":{"size":775,"offset":"30082793"},"punycode.es6.js":{"size":12630,"offset":"30083568"},"punycode.js":{"size":12561,"offset":"30096198"}}},"q":{"files":{"CHANGES.md":{"size":30064,"offset":"30108759"},"LICENSE":{"size":1092,"offset":"30138823"},"package.json":{"size":988,"offset":"30139915"},"q.js":{"size":64012,"offset":"30140903"},"queue.js":{"size":941,"offset":"30204915"}}},"rc":{"files":{"LICENSE.APACHE2":{"size":586,"offset":"30246350"},"LICENSE.BSD":{"size":1516,"offset":"30246936"},"LICENSE.MIT":{"size":1088,"offset":"30248452"},"browser.js":{"size":137,"offset":"30249540"},"cli.js":{"size":109,"offset":"30249677","executable":true},"index.js":{"size":1503,"offset":"30249786","executable":true},"package.json":{"size":657,"offset":"30251289"},"lib":{"files":{"utils.js":{"size":2759,"offset":"30251946"}}}}},"read-config-file":{"files":{"package.json":{"size":956,"offset":"30254705"},"out":{"files":{"ajvErrorNormalizer.js":{"size":7731,"offset":"30255661"},"ajvErrorNormalizer.js.map":{"size":15873,"offset":"30263392"},"deepAssign.js":{"size":1026,"offset":"30279265"},"deepAssign.js.map":{"size":2116,"offset":"30280291"},"main.js":{"size":5472,"offset":"30282407"},"main.js.map":{"size":9254,"offset":"30287879"}}},"node_modules":{"files":{"fs-extra":{"files":{"LICENSE":{"size":1084,"offset":"34196128"},"package.json":{"size":1050,"offset":"34197212"},"lib":{"files":{"index.js":{"size":702,"offset":"34198262"},"util":{"files":{"buffer.js":{"size":276,"offset":"34198964"},"utimes.js":{"size":2370,"offset":"34199240"}}},"remove":{"files":{"index.js":{"size":165,"offset":"34201610"},"rimraf.js":{"size":7673,"offset":"34201775"}}},"path-exists":{"files":{"index.js":{"size":263,"offset":"34209448"}}},"output":{"files":{"index.js":{"size":947,"offset":"34209711"}}},"move-sync":{"files":{"index.js":{"size":3002,"offset":"34210658"}}},"move":{"files":{"index.js":{"size":1969,"offset":"34213660"}}},"mkdirs":{"files":{"index.js":{"size":292,"offset":"34215629"},"mkdirs-sync.js":{"size":1251,"offset":"34215921"},"mkdirs.js":{"size":1636,"offset":"34217172"},"win32.js":{"size":517,"offset":"34218808"}}},"json":{"files":{"index.js":{"size":509,"offset":"34219325"},"jsonfile.js":{"size":291,"offset":"34219834"},"output-json-sync.js":{"size":375,"offset":"34220125"},"output-json.js":{"size":657,"offset":"34220500"}}},"fs":{"files":{"index.js":{"size":2647,"offset":"34221157"}}},"ensure":{"files":{"file.js":{"size":1105,"offset":"34223804"},"index.js":{"size":623,"offset":"34224909"},"link.js":{"size":1564,"offset":"34225532"},"symlink-paths.js":{"size":3398,"offset":"34227096"},"symlink-type.js":{"size":698,"offset":"34230494"},"symlink.js":{"size":2050,"offset":"34231192"}}},"empty":{"files":{"index.js":{"size":983,"offset":"34233242"}}},"copy-sync":{"files":{"copy-sync.js":{"size":6163,"offset":"34234225"},"index.js":{"size":70,"offset":"34240388"}}},"copy":{"files":{"copy.js":{"size":7996,"offset":"34240458"},"index.js":{"size":111,"offset":"34248454"}}}}}}},"fs-extra-p":{"files":{"LICENSE":{"size":1086,"offset":"34248565"},"index.js":{"size":845,"offset":"34249651"},"package.json":{"size":498,"offset":"34250496"}}}}}}},"regexp.prototype.flags":{"files":{".editorconfig":{"size":276,"offset":"17009720"},"LICENSE":{"size":1080,"offset":"17009996"},"auto.js":{"size":36,"offset":"17011076"},"implementation.js":{"size":515,"offset":"17011112"},"index.js":{"size":408,"offset":"17011627"},"package.json":{"size":1298,"offset":"17012035"},"polyfill.js":{"size":650,"offset":"17013333"},"shim.js":{"size":779,"offset":"17013983"},".github":{"files":{"workflows":{"files":{"rebase.yml":{"size":250,"offset":"17014762"}}}}}}},"resolve":{"files":{".eslintignore":{"size":13,"offset":"30504203"},"LICENSE":{"size":1071,"offset":"30504216"},"index.js":{"size":174,"offset":"30505287"},"package.json":{"size":851,"offset":"30505461"},"lib":{"files":{"async.js":{"size":10456,"offset":"30506312"},"caller.js":{"size":354,"offset":"30516768"},"core.js":{"size":1662,"offset":"30517122"},"core.json":{"size":2247,"offset":"30518784"},"is-core.js":{"size":130,"offset":"30521031"},"node-modules-paths.js":{"size":1256,"offset":"30521161"},"normalize-options.js":{"size":348,"offset":"30522417"},"sync.js":{"size":6267,"offset":"30522765"}}},".editorconfig":{"size":286,"offset":"30503917"}}},"resumer":{"files":{"LICENSE":{"size":1073,"offset":"17038441"},"index.js":{"size":617,"offset":"17039514"},"package.json":{"size":839,"offset":"17040131"}}},"safe-buffer":{"files":{"LICENSE":{"size":1081,"offset":"30531581"},"index.js":{"size":1670,"offset":"30532662"},"package.json":{"size":797,"offset":"30534332"}}},"safer-buffer":{"files":{"LICENSE":{"size":1094,"offset":"30535129"},"Porting-Buffer.md":{"size":12794,"offset":"30536223"},"Readme.md":{"size":8261,"offset":"30549017"},"dangerous.js":{"size":1483,"offset":"30557278"},"package.json":{"size":659,"offset":"30558761"},"safer.js":{"size":2110,"offset":"30559420"},"tests.js":{"size":15735,"offset":"30561530"}}},"sanitize-filename":{"files":{".airtap.yml":{"size":297,"offset":"30577265"},".gitmodules":{"size":153,"offset":"30577562"},"AUTHORS":{"size":76,"offset":"30577715"},"Changelog.md":{"size":171,"offset":"30577791"},"LICENSE.md":{"size":1304,"offset":"30577962"},"index.js":{"size":1997,"offset":"30579266"},"package.json":{"size":673,"offset":"30581263"}}},"sax":{"files":{"LICENSE":{"size":2011,"offset":"30581936"},"LICENSE-W3C.html":{"size":11861,"offset":"30583947"},"package.json":{"size":597,"offset":"30595808"},"lib":{"files":{"sax.js":{"size":43681,"offset":"30596405"}}}}},"semver":{"files":{"LICENSE":{"size":765,"offset":"30640086"},"package.json":{"size":531,"offset":"30640851"},"range.bnf":{"size":619,"offset":"30641382"},"semver.js":{"size":38803,"offset":"30642001"},"bin":{"files":{"semver":{"size":4418,"offset":"30680804","executable":true},"semver.js":{"size":4717,"offset":"19119911","executable":true}}}}},"shebang-command":{"files":{"index.js":{"size":346,"offset":"30689112"},"license":{"size":1125,"offset":"30689458"},"package.json":{"size":628,"offset":"30690583"}}},"shebang-regex":{"files":{"index.js":{"size":40,"offset":"30691211"},"license":{"size":1119,"offset":"30691251"},"package.json":{"size":575,"offset":"30692370"}}},"shelljs":{"files":{".documentup.json":{"size":54,"offset":"30692945"},"LICENSE":{"size":1582,"offset":"30692999"},"RELEASE.md":{"size":427,"offset":"30694581"},"global.js":{"size":86,"offset":"30695008"},"make.js":{"size":1279,"offset":"30695094"},"package.json":{"size":586,"offset":"30696373"},"shell.js":{"size":3653,"offset":"30696959"},"src":{"files":{"cat.js":{"size":1066,"offset":"30700612"},"cd.js":{"size":444,"offset":"30701678"},"chmod.js":{"size":6446,"offset":"30702122"},"common.js":{"size":5129,"offset":"30708568"},"cp.js":{"size":5997,"offset":"30713697"},"dirs.js":{"size":5220,"offset":"30719694"},"echo.js":{"size":461,"offset":"30724914"},"error.js":{"size":266,"offset":"30725375"},"exec.js":{"size":7504,"offset":"30725641"},"find.js":{"size":1377,"offset":"30733145"},"grep.js":{"size":1395,"offset":"30734522"},"ln.js":{"size":1206,"offset":"30735917"},"ls.js":{"size":3767,"offset":"30737123"},"mkdir.js":{"size":1698,"offset":"30740890"},"mv.js":{"size":2257,"offset":"30742588"},"popd.js":{"size":14,"offset":"30744845"},"pushd.js":{"size":14,"offset":"30744859"},"pwd.js":{"size":241,"offset":"30744873"},"rm.js":{"size":4465,"offset":"30745114"},"sed.js":{"size":1325,"offset":"30749579"},"tempdir.js":{"size":1706,"offset":"30750904"},"test.js":{"size":1947,"offset":"30752610"},"to.js":{"size":794,"offset":"30754557"},"toEnd.js":{"size":750,"offset":"30755351"},"which.js":{"size":1944,"offset":"30756101"}}},"scripts":{"files":{"generate-docs.js":{"size":514,"offset":"30758045","executable":true},"run-tests.js":{"size":1053,"offset":"30758559","executable":true}}},"bin":{"files":{"shjs":{"size":1165,"offset":"30759612","executable":true}}}}},"signal-exit":{"files":{"LICENSE.txt":{"size":748,"offset":"30760777"},"index.js":{"size":4124,"offset":"30761525"},"package.json":{"size":652,"offset":"30765649"},"signals.js":{"size":1295,"offset":"30766301"}}},"source-map":{"files":{"LICENSE":{"size":1526,"offset":"30770550"},"package.json":{"size":774,"offset":"30772076"},"source-map.js":{"size":405,"offset":"30772850"},"lib":{"files":{"array-set.js":{"size":3197,"offset":"30773255"},"base64-vlq.js":{"size":4714,"offset":"30776452"},"base64.js":{"size":1540,"offset":"30781166"},"binary-search.js":{"size":4249,"offset":"30782706"},"mapping-list.js":{"size":2339,"offset":"30786955"},"quick-sort.js":{"size":3616,"offset":"30789294"},"source-map-consumer.js":{"size":40562,"offset":"30792910"},"source-map-generator.js":{"size":14356,"offset":"30833472"},"source-node.js":{"size":13808,"offset":"30847828"},"util.js":{"size":12950,"offset":"30861636"}}},"dist":{"files":{"source-map.debug.js":{"size":272874,"offset":"30874586"},"source-map.js":{"size":106973,"offset":"31147460"},"source-map.min.js":{"size":27111,"offset":"31254433"},"source-map.min.js.map":{"size":257409,"offset":"31281544"}}}}},"source-map-support":{"files":{"LICENSE.md":{"size":1079,"offset":"31538953"},"browser-source-map-support.js":{"size":53434,"offset":"31540032"},"package.json":{"size":634,"offset":"31593466"},"register.js":{"size":25,"offset":"31594100"},"source-map-support.js":{"size":19729,"offset":"31594125"}}},"spdx-correct":{"files":{"LICENSE":{"size":11358,"offset":"31613854"},"index.js":{"size":9658,"offset":"31625212"},"package.json":{"size":761,"offset":"31634870"}}},"spdx-exceptions":{"files":{"index.json":{"size":1009,"offset":"31635631"},"package.json":{"size":441,"offset":"31636640"}}},"spdx-expression-parse":{"files":{"AUTHORS":{"size":203,"offset":"31637081"},"LICENSE":{"size":1111,"offset":"31637284"},"index.js":{"size":143,"offset":"31638395"},"package.json":{"size":762,"offset":"31638538"},"parse.js":{"size":2901,"offset":"31639300"},"scan.js":{"size":2754,"offset":"31642201"}}},"spdx-license-ids":{"files":{"deprecated.json":{"size":483,"offset":"31644955"},"index.json":{"size":6242,"offset":"31645438"},"package.json":{"size":682,"offset":"31651680"}}},"sprintf-js":{"files":{"LICENSE":{"size":1518,"offset":"31654656"},"bower.json":{"size":439,"offset":"31656174"},"gruntfile.js":{"size":970,"offset":"31656613"},"package.json":{"size":589,"offset":"31657583"},"src":{"files":{"angular-sprintf.js":{"size":490,"offset":"31658172"},"sprintf.js":{"size":8112,"offset":"31658662"}}},"dist":{"files":{"angular-sprintf.min.js":{"size":449,"offset":"31666774"},"angular-sprintf.min.js.map":{"size":429,"offset":"31667223"},"angular-sprintf.min.map":{"size":429,"offset":"31667652"},"sprintf.min.js":{"size":3169,"offset":"31668081"},"sprintf.min.js.map":{"size":4391,"offset":"31671250"},"sprintf.min.map":{"size":4485,"offset":"31675641"}}},"demo":{"files":{"angular.html":{"size":690,"offset":"31680126"}}}}},"stat-mode":{"files":{"History.md":{"size":1207,"offset":"31881532"},"LICENSE":{"size":1087,"offset":"31882739"},"index.js":{"size":7603,"offset":"31883826"},"package.json":{"size":511,"offset":"31891429"}}},"string.prototype.trim":{"files":{".editorconfig":{"size":286,"offset":"18191479"},"LICENSE":{"size":1081,"offset":"18191765"},"auto.js":{"size":36,"offset":"18192846"},"implementation.js":{"size":831,"offset":"18192882"},"index.js":{"size":404,"offset":"18193713"},"package.json":{"size":1557,"offset":"18194117"},"polyfill.js":{"size":276,"offset":"18195674"},"shim.js":{"size":330,"offset":"18195950"},".github":{"files":{"workflows":{"files":{"rebase.yml":{"size":250,"offset":"18196280"}}}}}}},"string.prototype.trimleft":{"files":{"LICENSE":{"size":1082,"offset":"18196530"},"auto.js":{"size":36,"offset":"18197612"},"implementation.js":{"size":451,"offset":"18197648"},"index.js":{"size":389,"offset":"18198099"},"package.json":{"size":1264,"offset":"18198488"},"polyfill.js":{"size":322,"offset":"18199752"},"shim.js":{"size":333,"offset":"18200074"},".github":{"files":{"workflows":{"files":{"rebase.yml":{"size":250,"offset":"18200407"}}}}}}},"string.prototype.trimright":{"files":{"LICENSE":{"size":1082,"offset":"18200657"},"auto.js":{"size":36,"offset":"18201739"},"implementation.js":{"size":454,"offset":"18201775"},"index.js":{"size":389,"offset":"18202229"},"package.json":{"size":1268,"offset":"18202618"},"polyfill.js":{"size":325,"offset":"18203886"},"shim.js":{"size":337,"offset":"18204211"},".github":{"files":{"workflows":{"files":{"rebase.yml":{"size":250,"offset":"18204548"}}}}}}},"strip-ansi":{"files":{"index.js":{"size":161,"offset":"31907123"},"license":{"size":1119,"offset":"31907284"},"package.json":{"size":960,"offset":"31908403"}}},"strip-bom":{"files":{"index.js":{"size":317,"offset":"31909363"},"license":{"size":1119,"offset":"31909680"},"package.json":{"size":575,"offset":"31910799"}}},"strip-json-comments":{"files":{"index.js":{"size":1700,"offset":"31916359"},"license":{"size":1119,"offset":"31918059"},"package.json":{"size":630,"offset":"31919178"}}},"supports-color":{"files":{"browser.js":{"size":67,"offset":"31946894"},"index.js":{"size":2771,"offset":"31946961"},"license":{"size":1109,"offset":"31949732"},"package.json":{"size":706,"offset":"31950841"}}},"tape":{"files":{".editorconfig":{"size":468,"offset":"18217151"},"LICENSE":{"size":1071,"offset":"18217619"},"index.js":{"size":4073,"offset":"18218690"},"package.json":{"size":1416,"offset":"18222763"},"lib":{"files":{"default_stream.js":{"size":790,"offset":"18224179"},"results.js":{"size":6196,"offset":"18224969"},"test.js":{"size":16728,"offset":"18231165"}}},"bin":{"files":{"tape":{"size":1618,"offset":"18247893","executable":true}}}}},"temp-file":{"files":{"package.json":{"size":788,"offset":"31951547"},"out":{"files":{"main.js":{"size":6016,"offset":"31952335"},"main.js.map":{"size":10359,"offset":"31958351"}}}}},"through":{"files":{"LICENSE.APACHE2":{"size":586,"offset":"18266674"},"LICENSE.MIT":{"size":1088,"offset":"18267260"},"index.js":{"size":2619,"offset":"18268348"},"package.json":{"size":704,"offset":"18270967"}}},"truncate-utf8-bytes":{"files":{".gitmodules":{"size":160,"offset":"32036435"},"AUTHORS":{"size":71,"offset":"32036595"},"browser.js":{"size":159,"offset":"32036666"},"index.js":{"size":154,"offset":"32036825"},"package.json":{"size":579,"offset":"32036979"},"lib":{"files":{"truncate.js":{"size":977,"offset":"32037558"}}}}},"tweetnacl":{"files":{"AUTHORS.md":{"size":875,"offset":"32055238"},"LICENSE":{"size":1210,"offset":"32056113"},"PULL_REQUEST_TEMPLATE.md":{"size":1040,"offset":"32057323"},"nacl-fast.js":{"size":62257,"offset":"32058363"},"nacl-fast.min.js":{"size":32621,"offset":"32120620"},"nacl.js":{"size":32948,"offset":"32153241"},"nacl.min.js":{"size":19089,"offset":"32186189"},"package.json":{"size":775,"offset":"32205278"}}},"underscore":{"files":{"LICENSE":{"size":1117,"offset":"32231644"},"package.json":{"size":1458,"offset":"32232761"},"underscore-min.js":{"size":18608,"offset":"32414525"},"underscore-min.js.map":{"size":32751,"offset":"32433133"},"underscore.js":{"size":64060,"offset":"32465884"},"underscore-esm-min.js":{"size":24195,"offset":"32234219"},"underscore-esm-min.js.map":{"size":33450,"offset":"32258414"},"underscore-esm.js":{"size":61804,"offset":"32291864"},"underscore-esm.js.map":{"size":60857,"offset":"32353668"},"underscore.js.map":{"size":60849,"offset":"32529944"},"modules":{"files":{"_baseCreate.js":{"size":535,"offset":"32590793"},"_baseIteratee.js":{"size":764,"offset":"32591328"},"_cb.js":{"size":418,"offset":"32592092"},"_chainResult.js":{"size":200,"offset":"32592510"},"_collectNonEnumProps.js":{"size":1352,"offset":"32592710"},"_createAssigner.js":{"size":582,"offset":"32594062"},"_createEscaper.js":{"size":604,"offset":"32594644"},"_createIndexFinder.js":{"size":977,"offset":"32595248"},"_createPredicateIndexFinder.js":{"size":509,"offset":"32596225"},"_createReduce.js":{"size":1045,"offset":"32596734"},"_createSizePropertyCheck.js":{"size":368,"offset":"32597779"},"_deepGet.js":{"size":280,"offset":"32598147"},"_escapeMap.js":{"size":164,"offset":"32598427"},"_executeBound.js":{"size":584,"offset":"32598591"},"_flatten.js":{"size":986,"offset":"32599175"},"_getByteLength.js":{"size":169,"offset":"32600161"},"_getLength.js":{"size":161,"offset":"32600330"},"_group.js":{"size":457,"offset":"32600491"},"_has.js":{"size":222,"offset":"32600948"},"_isArrayLike.js":{"size":422,"offset":"32601170"},"_isBufferLike.js":{"size":279,"offset":"32601592"},"_keyInObj.js":{"size":183,"offset":"32601871"},"_optimizeCb.js":{"size":810,"offset":"32602054"},"_setup.js":{"size":1768,"offset":"32602864"},"_shallowProperty.js":{"size":202,"offset":"32604632"},"_tagTester.js":{"size":240,"offset":"32604834"},"_unescapeMap.js":{"size":160,"offset":"32605074"},"after.js":{"size":221,"offset":"32605234"},"allKeys.js":{"size":416,"offset":"32605455"},"before.js":{"size":300,"offset":"32605871"},"bind.js":{"size":528,"offset":"32606171"},"bindAll.js":{"size":602,"offset":"32606699"},"chain.js":{"size":190,"offset":"32607301"},"chunk.js":{"size":370,"offset":"32607491"},"clone.js":{"size":290,"offset":"32607861"},"compact.js":{"size":155,"offset":"32608151"},"compose.js":{"size":399,"offset":"32608306"},"constant.js":{"size":159,"offset":"32608705"},"contains.js":{"size":404,"offset":"32608864"},"countBy.js":{"size":340,"offset":"32609268"},"create.js":{"size":390,"offset":"32609608"},"debounce.js":{"size":999,"offset":"32609998"},"defaults.js":{"size":185,"offset":"32610997"},"defer.js":{"size":227,"offset":"32611182"},"delay.js":{"size":300,"offset":"32611409"},"difference.js":{"size":469,"offset":"32611709"},"each.js":{"size":719,"offset":"32612178"},"escape.js":{"size":188,"offset":"32612897"},"every.js":{"size":531,"offset":"32613085"},"extend.js":{"size":201,"offset":"32613616"},"extendOwn.js":{"size":298,"offset":"32613817"},"filter.js":{"size":354,"offset":"32614115"},"find.js":{"size":392,"offset":"32614469"},"findIndex.js":{"size":192,"offset":"32614861"},"findKey.js":{"size":386,"offset":"32615053"},"findLastIndex.js":{"size":192,"offset":"32615439"},"findWhere.js":{"size":277,"offset":"32615631"},"first.js":{"size":408,"offset":"32615908"},"flatten.js":{"size":284,"offset":"32616316"},"functions.js":{"size":274,"offset":"32616600"},"groupBy.js":{"size":331,"offset":"32616874"},"has.js":{"size":650,"offset":"32617205"},"identity.js":{"size":120,"offset":"32617855"},"index-all.js":{"size":809,"offset":"32617975"},"index-default.js":{"size":872,"offset":"32618784"},"index.js":{"size":8791,"offset":"32619656"},"indexBy.js":{"size":248,"offset":"32628447"},"indexOf.js":{"size":431,"offset":"32628695"},"initial.js":{"size":361,"offset":"32629126"},"intersection.js":{"size":574,"offset":"32629487"},"invert.js":{"size":311,"offset":"32630061"},"invoke.js":{"size":827,"offset":"32630372"},"isArguments.js":{"size":400,"offset":"32631199"},"isArray.js":{"size":217,"offset":"32631599"},"isArrayBuffer.js":{"size":83,"offset":"32631816"},"isBoolean.js":{"size":200,"offset":"32631899"},"isDataView.js":{"size":80,"offset":"32632099"},"isDate.js":{"size":76,"offset":"32632179"},"isElement.js":{"size":118,"offset":"32632255"},"isEmpty.js":{"size":595,"offset":"32632373"},"isEqual.js":{"size":5250,"offset":"32632968"},"isError.js":{"size":77,"offset":"32638218"},"isFinite.js":{"size":230,"offset":"32638295"},"isFunction.js":{"size":528,"offset":"32638525"},"isMap.js":{"size":75,"offset":"32639053"},"isMatch.js":{"size":409,"offset":"32639128"},"isNaN.js":{"size":184,"offset":"32639537"},"isNull.js":{"size":98,"offset":"32639721"},"isNumber.js":{"size":78,"offset":"32639819"},"isObject.js":{"size":161,"offset":"32639897"},"isRegExp.js":{"size":78,"offset":"32640058"},"isSet.js":{"size":75,"offset":"32640136"},"isString.js":{"size":78,"offset":"32640211"},"isSymbol.js":{"size":78,"offset":"32640289"},"isTypedArray.js":{"size":726,"offset":"32640367"},"isUndefined.js":{"size":104,"offset":"32641093"},"isWeakMap.js":{"size":79,"offset":"32641197"},"isWeakSet.js":{"size":79,"offset":"32641276"},"iteratee.js":{"size":416,"offset":"32641355"},"keys.js":{"size":565,"offset":"32641771"},"last.js":{"size":372,"offset":"32642336"},"lastIndexOf.js":{"size":280,"offset":"32642708"},"map.js":{"size":561,"offset":"32642988"},"mapObject.js":{"size":530,"offset":"32643549"},"matcher.js":{"size":309,"offset":"32644079"},"max.js":{"size":954,"offset":"32644388"},"memoize.js":{"size":419,"offset":"32645342"},"min.js":{"size":950,"offset":"32645761"},"mixin.js":{"size":543,"offset":"32646711"},"negate.js":{"size":176,"offset":"32647254"},"noop.js":{"size":103,"offset":"32647430"},"now.js":{"size":145,"offset":"32647533"},"object.js":{"size":537,"offset":"32647678"},"omit.js":{"size":708,"offset":"32648215"},"once.js":{"size":236,"offset":"32648923"},"pairs.js":{"size":359,"offset":"32649159"},"partial.js":{"size":977,"offset":"32649518"},"partition.js":{"size":280,"offset":"32650495"},"pick.js":{"size":855,"offset":"32650775"},"pluck.js":{"size":222,"offset":"32651630"},"property.js":{"size":453,"offset":"32651852"},"propertyOf.js":{"size":333,"offset":"32652305"},"random.js":{"size":222,"offset":"32652638"},"range.js":{"size":573,"offset":"32652860"},"reduce.js":{"size":172,"offset":"32653433"},"reduceRight.js":{"size":148,"offset":"32653605"},"reject.js":{"size":267,"offset":"32653753"},"rest.js":{"size":316,"offset":"32654020"},"restArguments.js":{"size":1126,"offset":"32654336"},"result.js":{"size":760,"offset":"32655462"},"sample.js":{"size":1005,"offset":"32656222"},"shuffle.js":{"size":133,"offset":"32657227"},"size.js":{"size":252,"offset":"32657360"},"some.js":{"size":541,"offset":"32657612"},"sortBy.js":{"size":680,"offset":"32658153"},"sortedIndex.js":{"size":551,"offset":"32658833"},"tap.js":{"size":295,"offset":"32659384"},"template.js":{"size":2732,"offset":"32659679"},"templateSettings.js":{"size":305,"offset":"32662411"},"throttle.js":{"size":1461,"offset":"32662716"},"times.js":{"size":285,"offset":"32664177"},"toArray.js":{"size":694,"offset":"32664462"},"underscore-array-methods.js":{"size":925,"offset":"32665156"},"underscore.js":{"size":791,"offset":"32666081"},"unescape.js":{"size":198,"offset":"32666872"},"union.js":{"size":316,"offset":"32667070"},"uniq.js":{"size":1215,"offset":"32667386"},"uniqueId.js":{"size":237,"offset":"32668601"},"unzip.js":{"size":454,"offset":"32668838"},"values.js":{"size":294,"offset":"32669292"},"where.js":{"size":279,"offset":"32669586"},"without.js":{"size":275,"offset":"32669865"},"wrap.js":{"size":301,"offset":"32670140"},"zip.js":{"size":217,"offset":"32670441"}}},"cjs":{"files":{"_baseCreate.js":{"size":560,"offset":"32670658"},"_baseIteratee.js":{"size":804,"offset":"32671218"},"_cb.js":{"size":463,"offset":"32672022"},"_chainResult.js":{"size":237,"offset":"32672485"},"_collectNonEnumProps.js":{"size":1382,"offset":"32672722"},"_createAssigner.js":{"size":601,"offset":"32674104"},"_createEscaper.js":{"size":625,"offset":"32674705"},"_createIndexFinder.js":{"size":1016,"offset":"32675330"},"_createPredicateIndexFinder.js":{"size":550,"offset":"32676346"},"_createReduce.js":{"size":1075,"offset":"32676896"},"_createSizePropertyCheck.js":{"size":393,"offset":"32677971"},"_deepGet.js":{"size":292,"offset":"32678364"},"_escapeMap.js":{"size":194,"offset":"32678656"},"_executeBound.js":{"size":609,"offset":"32678850"},"_flatten.js":{"size":1014,"offset":"32679459"},"_getByteLength.js":{"size":212,"offset":"32680473"},"_getLength.js":{"size":196,"offset":"32680685"},"_group.js":{"size":475,"offset":"32680881"},"_has.js":{"size":228,"offset":"32681356"},"_isArrayLike.js":{"size":466,"offset":"32681584"},"_isBufferLike.js":{"size":325,"offset":"32682050"},"_keyInObj.js":{"size":196,"offset":"32682375"},"_optimizeCb.js":{"size":825,"offset":"32682571"},"_setup.js":{"size":2393,"offset":"32683396"},"_shallowProperty.js":{"size":222,"offset":"32685789"},"_tagTester.js":{"size":258,"offset":"32686011"},"_unescapeMap.js":{"size":202,"offset":"32686269"},"after.js":{"size":231,"offset":"32686471"},"allKeys.js":{"size":438,"offset":"32686702"},"before.js":{"size":311,"offset":"32687140"},"bind.js":{"size":559,"offset":"32687451"},"bindAll.js":{"size":639,"offset":"32688010"},"chain.js":{"size":221,"offset":"32688649"},"chunk.js":{"size":387,"offset":"32688870"},"clone.js":{"size":309,"offset":"32689257"},"compact.js":{"size":170,"offset":"32689566"},"compose.js":{"size":411,"offset":"32689736"},"constant.js":{"size":172,"offset":"32690147"},"contains.js":{"size":428,"offset":"32690319"},"countBy.js":{"size":376,"offset":"32690747"},"create.js":{"size":409,"offset":"32691123"},"debounce.js":{"size":1018,"offset":"32691532"},"defaults.js":{"size":221,"offset":"32692550"},"defer.js":{"size":276,"offset":"32692771"},"delay.js":{"size":325,"offset":"32693047"},"difference.js":{"size":515,"offset":"32693372"},"each.js":{"size":741,"offset":"32693887"},"escape.js":{"size":224,"offset":"32694628"},"every.js":{"size":554,"offset":"32694852"},"extend.js":{"size":233,"offset":"32695406"},"extendOwn.js":{"size":336,"offset":"32695639"},"filter.js":{"size":373,"offset":"32695975"},"find.js":{"size":412,"offset":"32696348"},"findIndex.js":{"size":227,"offset":"32696760"},"findKey.js":{"size":406,"offset":"32696987"},"findLastIndex.js":{"size":235,"offset":"32697393"},"findWhere.js":{"size":297,"offset":"32697628"},"first.js":{"size":421,"offset":"32697925"},"flatten.js":{"size":299,"offset":"32698346"},"functions.js":{"size":291,"offset":"32698645"},"groupBy.js":{"size":367,"offset":"32698936"},"has.js":{"size":662,"offset":"32699303"},"identity.js":{"size":133,"offset":"32699965"},"index-default.js":{"size":227,"offset":"32700098"},"index.js":{"size":8738,"offset":"32700325"},"indexBy.js":{"size":279,"offset":"32709063"},"indexOf.js":{"size":468,"offset":"32709342"},"initial.js":{"size":380,"offset":"32709810"},"intersection.js":{"size":599,"offset":"32710190"},"invert.js":{"size":325,"offset":"32710789"},"invoke.js":{"size":868,"offset":"32711114"},"isArguments.js":{"size":448,"offset":"32711982"},"isArray.js":{"size":247,"offset":"32712430"},"isArrayBuffer.js":{"size":126,"offset":"32712677"},"isBoolean.js":{"size":218,"offset":"32712803"},"isDataView.js":{"size":117,"offset":"32713021"},"isDate.js":{"size":105,"offset":"32713138"},"isElement.js":{"size":132,"offset":"32713243"},"isEmpty.js":{"size":624,"offset":"32713375"},"isEqual.js":{"size":5324,"offset":"32713999"},"isError.js":{"size":108,"offset":"32719323"},"isFinite.js":{"size":249,"offset":"32719431"},"isFunction.js":{"size":584,"offset":"32719680"},"isMap.js":{"size":102,"offset":"32720264"},"isMatch.js":{"size":424,"offset":"32720366"},"isNaN.js":{"size":203,"offset":"32720790"},"isNull.js":{"size":109,"offset":"32720993"},"isNumber.js":{"size":111,"offset":"32721102"},"isObject.js":{"size":174,"offset":"32721213"},"isRegExp.js":{"size":111,"offset":"32721387"},"isSet.js":{"size":102,"offset":"32721498"},"isString.js":{"size":111,"offset":"32721600"},"isSymbol.js":{"size":111,"offset":"32721711"},"isTypedArray.js":{"size":767,"offset":"32721822"},"isUndefined.js":{"size":120,"offset":"32722589"},"isWeakMap.js":{"size":114,"offset":"32722709"},"isWeakSet.js":{"size":114,"offset":"32722823"},"iteratee.js":{"size":455,"offset":"32722937"},"keys.js":{"size":591,"offset":"32723392"},"last.js":{"size":384,"offset":"32723983"},"lastIndexOf.js":{"size":322,"offset":"32724367"},"map.js":{"size":582,"offset":"32724689"},"mapObject.js":{"size":552,"offset":"32725271"},"matcher.js":{"size":327,"offset":"32725823"},"max.js":{"size":978,"offset":"32726150"},"memoize.js":{"size":436,"offset":"32727128"},"min.js":{"size":974,"offset":"32727564"},"mixin.js":{"size":620,"offset":"32728538"},"negate.js":{"size":187,"offset":"32729158"},"noop.js":{"size":112,"offset":"32729345"},"now.js":{"size":163,"offset":"32729457"},"object.js":{"size":552,"offset":"32729620"},"omit.js":{"size":751,"offset":"32730172"},"once.js":{"size":262,"offset":"32730923"},"pairs.js":{"size":372,"offset":"32731185"},"partial.js":{"size":1009,"offset":"32731557"},"partition.js":{"size":315,"offset":"32732566"},"pick.js":{"size":899,"offset":"32732881"},"pluck.js":{"size":238,"offset":"32733780"},"property.js":{"size":479,"offset":"32734018"},"propertyOf.js":{"size":356,"offset":"32734497"},"random.js":{"size":233,"offset":"32734853"},"range.js":{"size":583,"offset":"32735086"},"reduce.js":{"size":201,"offset":"32735669"},"reduceRight.js":{"size":187,"offset":"32735870"},"reject.js":{"size":289,"offset":"32736057"},"rest.js":{"size":332,"offset":"32736346"},"restArguments.js":{"size":1144,"offset":"32736678"},"result.js":{"size":777,"offset":"32737822"},"sample.js":{"size":1036,"offset":"32738599"},"shuffle.js":{"size":148,"offset":"32739635"},"size.js":{"size":269,"offset":"32739783"},"some.js":{"size":563,"offset":"32740052"},"sortBy.js":{"size":702,"offset":"32740615"},"sortedIndex.js":{"size":577,"offset":"32741317"},"tap.js":{"size":303,"offset":"32741894"},"template.js":{"size":2780,"offset":"32742197"},"templateSettings.js":{"size":370,"offset":"32744977"},"throttle.js":{"size":1477,"offset":"32745347"},"times.js":{"size":300,"offset":"32746824"},"toArray.js":{"size":733,"offset":"32747124"},"underscore-array-methods.js":{"size":984,"offset":"32747857"},"underscore-oop.js":{"size":1404,"offset":"32748841"},"underscore.js":{"size":802,"offset":"32750245"},"unescape.js":{"size":238,"offset":"32751047"},"union.js":{"size":349,"offset":"32751285"},"uniq.js":{"size":1240,"offset":"32751634"},"uniqueId.js":{"size":250,"offset":"32752874"},"unzip.js":{"size":475,"offset":"32753124"},"values.js":{"size":308,"offset":"32753599"},"where.js":{"size":295,"offset":"32753907"},"without.js":{"size":307,"offset":"32754202"},"wrap.js":{"size":313,"offset":"32754509"},"zip.js":{"size":241,"offset":"32754822"}}},"amd":{"files":{"_baseCreate.js":{"size":572,"offset":"32755063"},"_baseIteratee.js":{"size":721,"offset":"32755635"},"_cb.js":{"size":442,"offset":"32756356"},"_chainResult.js":{"size":246,"offset":"32756798"},"_collectNonEnumProps.js":{"size":1415,"offset":"32757044"},"_createAssigner.js":{"size":656,"offset":"32758459"},"_createEscaper.js":{"size":656,"offset":"32759115"},"_createIndexFinder.js":{"size":1031,"offset":"32759771"},"_createPredicateIndexFinder.js":{"size":558,"offset":"32760802"},"_createReduce.js":{"size":1088,"offset":"32761360"},"_createSizePropertyCheck.js":{"size":408,"offset":"32762448"},"_deepGet.js":{"size":329,"offset":"32762856"},"_escapeMap.js":{"size":231,"offset":"32763185"},"_executeBound.js":{"size":613,"offset":"32763416"},"_flatten.js":{"size":1016,"offset":"32764029"},"_getByteLength.js":{"size":214,"offset":"32765045"},"_getLength.js":{"size":198,"offset":"32765259"},"_group.js":{"size":483,"offset":"32765457"},"_has.js":{"size":237,"offset":"32765940"},"_isArrayLike.js":{"size":454,"offset":"32766177"},"_isBufferLike.js":{"size":311,"offset":"32766631"},"_keyInObj.js":{"size":225,"offset":"32766942"},"_optimizeCb.js":{"size":886,"offset":"32767167"},"_setup.js":{"size":2548,"offset":"32768053"},"_shallowProperty.js":{"size":253,"offset":"32770601"},"_tagTester.js":{"size":271,"offset":"32770854"},"_unescapeMap.js":{"size":187,"offset":"32771125"},"after.js":{"size":266,"offset":"32771312"},"allKeys.js":{"size":423,"offset":"32771578"},"before.js":{"size":354,"offset":"32772001"},"bind.js":{"size":544,"offset":"32772355"},"bindAll.js":{"size":632,"offset":"32772899"},"chain.js":{"size":234,"offset":"32773531"},"chunk.js":{"size":410,"offset":"32773765"},"clone.js":{"size":286,"offset":"32774175"},"compact.js":{"size":179,"offset":"32774461"},"compose.js":{"size":454,"offset":"32774640"},"constant.js":{"size":203,"offset":"32775094"},"contains.js":{"size":407,"offset":"32775297"},"countBy.js":{"size":372,"offset":"32775704"},"create.js":{"size":409,"offset":"32776076"},"debounce.js":{"size":1056,"offset":"32776485"},"defaults.js":{"size":206,"offset":"32777541"},"defer.js":{"size":245,"offset":"32777747"},"delay.js":{"size":340,"offset":"32777992"},"difference.js":{"size":481,"offset":"32778332"},"each.js":{"size":746,"offset":"32778813"},"escape.js":{"size":209,"offset":"32779559"},"every.js":{"size":543,"offset":"32779768"},"extend.js":{"size":218,"offset":"32780311"},"extendOwn.js":{"size":323,"offset":"32780529"},"filter.js":{"size":375,"offset":"32780852"},"find.js":{"size":391,"offset":"32781227"},"findIndex.js":{"size":229,"offset":"32781618"},"findKey.js":{"size":408,"offset":"32781847"},"findLastIndex.js":{"size":237,"offset":"32782255"},"findWhere.js":{"size":291,"offset":"32782492"},"first.js":{"size":436,"offset":"32782783"},"flatten.js":{"size":310,"offset":"32783219"},"functions.js":{"size":308,"offset":"32783529"},"groupBy.js":{"size":361,"offset":"32783837"},"has.js":{"size":663,"offset":"32784198"},"identity.js":{"size":160,"offset":"32784861"},"index-default.js":{"size":215,"offset":"32785021"},"index.js":{"size":7990,"offset":"32785236"},"indexBy.js":{"size":290,"offset":"32793226"},"indexOf.js":{"size":439,"offset":"32793516"},"initial.js":{"size":393,"offset":"32793955"},"intersection.js":{"size":615,"offset":"32794348"},"invert.js":{"size":344,"offset":"32794963"},"invoke.js":{"size":843,"offset":"32795307"},"isArguments.js":{"size":454,"offset":"32796150"},"isArray.js":{"size":233,"offset":"32796604"},"isArrayBuffer.js":{"size":127,"offset":"32796837"},"isBoolean.js":{"size":227,"offset":"32796964"},"isDataView.js":{"size":118,"offset":"32797191"},"isDate.js":{"size":106,"offset":"32797309"},"isElement.js":{"size":159,"offset":"32797415"},"isEmpty.js":{"size":575,"offset":"32797574"},"isEqual.js":{"size":5463,"offset":"32798149"},"isError.js":{"size":109,"offset":"32803612"},"isFinite.js":{"size":241,"offset":"32803721"},"isFunction.js":{"size":588,"offset":"32803962"},"isMap.js":{"size":103,"offset":"32804550"},"isMatch.js":{"size":447,"offset":"32804653"},"isNaN.js":{"size":195,"offset":"32805100"},"isNull.js":{"size":136,"offset":"32805295"},"isNumber.js":{"size":112,"offset":"32805431"},"isObject.js":{"size":203,"offset":"32805543"},"isRegExp.js":{"size":112,"offset":"32805746"},"isSet.js":{"size":103,"offset":"32805858"},"isString.js":{"size":112,"offset":"32805961"},"isSymbol.js":{"size":112,"offset":"32806073"},"isTypedArray.js":{"size":735,"offset":"32806185"},"isUndefined.js":{"size":147,"offset":"32806920"},"isWeakMap.js":{"size":115,"offset":"32807067"},"isWeakSet.js":{"size":115,"offset":"32807182"},"iteratee.js":{"size":453,"offset":"32807297"},"keys.js":{"size":563,"offset":"32807750"},"last.js":{"size":399,"offset":"32808313"},"lastIndexOf.js":{"size":308,"offset":"32808712"},"map.js":{"size":573,"offset":"32809020"},"mapObject.js":{"size":562,"offset":"32809593"},"matcher.js":{"size":327,"offset":"32810155"},"max.js":{"size":976,"offset":"32810482"},"memoize.js":{"size":459,"offset":"32811458"},"min.js":{"size":972,"offset":"32811917"},"mixin.js":{"size":577,"offset":"32812889"},"negate.js":{"size":218,"offset":"32813466"},"noop.js":{"size":132,"offset":"32813684"},"now.js":{"size":190,"offset":"32813816"},"object.js":{"size":581,"offset":"32814006"},"omit.js":{"size":678,"offset":"32814587"},"once.js":{"size":248,"offset":"32815265"},"pairs.js":{"size":395,"offset":"32815513"},"partial.js":{"size":1012,"offset":"32815908"},"partition.js":{"size":326,"offset":"32816920"},"pick.js":{"size":853,"offset":"32817246"},"pluck.js":{"size":230,"offset":"32818099"},"property.js":{"size":466,"offset":"32818329"},"propertyOf.js":{"size":358,"offset":"32818795"},"random.js":{"size":268,"offset":"32819153"},"range.js":{"size":638,"offset":"32819421"},"reduce.js":{"size":204,"offset":"32820059"},"reduceRight.js":{"size":189,"offset":"32820263"},"reject.js":{"size":264,"offset":"32820452"},"rest.js":{"size":345,"offset":"32820716"},"restArguments.js":{"size":1217,"offset":"32821061"},"result.js":{"size":799,"offset":"32822278"},"sample.js":{"size":1011,"offset":"32823077"},"shuffle.js":{"size":157,"offset":"32824088"},"size.js":{"size":263,"offset":"32824245"},"some.js":{"size":552,"offset":"32824508"},"sortBy.js":{"size":709,"offset":"32825060"},"sortedIndex.js":{"size":585,"offset":"32825769"},"tap.js":{"size":336,"offset":"32826354"},"template.js":{"size":2906,"offset":"32826690"},"templateSettings.js":{"size":385,"offset":"32829596"},"throttle.js":{"size":1560,"offset":"32829981"},"times.js":{"size":315,"offset":"32831541"},"toArray.js":{"size":656,"offset":"32831856"},"underscore-array-methods.js":{"size":980,"offset":"32832512"},"underscore-oop.js":{"size":1420,"offset":"32833492"},"underscore.js":{"size":841,"offset":"32834912"},"unescape.js":{"size":223,"offset":"32835753"},"union.js":{"size":326,"offset":"32835976"},"uniq.js":{"size":1252,"offset":"32836302"},"uniqueId.js":{"size":283,"offset":"32837554"},"unzip.js":{"size":462,"offset":"32837837"},"values.js":{"size":329,"offset":"32838299"},"where.js":{"size":289,"offset":"32838628"},"without.js":{"size":299,"offset":"32838917"},"wrap.js":{"size":326,"offset":"32839216"},"zip.js":{"size":227,"offset":"32839542"}}}}},"universalify":{"files":{"LICENSE":{"size":1100,"offset":"32841643"},"index.js":{"size":777,"offset":"32842743"},"package.json":{"size":672,"offset":"32843520"}}},"uri-js":{"files":{"LICENSE":{"size":1452,"offset":"32852435","executable":true},"package.json":{"size":1120,"offset":"32853887","executable":true},"dist":{"files":{"esnext":{"files":{"index.js":{"size":537,"offset":"32855007","executable":true},"index.js.map":{"size":747,"offset":"32855544","executable":true},"regexps-iri.js":{"size":114,"offset":"32856291","executable":true},"regexps-iri.js.map":{"size":192,"offset":"32856405","executable":true},"regexps-uri.js":{"size":7813,"offset":"32856597","executable":true},"regexps-uri.js.map":{"size":8283,"offset":"32864410","executable":true},"uri.js":{"size":20153,"offset":"32872693","executable":true},"uri.js.map":{"size":19219,"offset":"32892846","executable":true},"util.js":{"size":1114,"offset":"32912065","executable":true},"util.js.map":{"size":1715,"offset":"32913179","executable":true},"schemes":{"files":{"http.js":{"size":959,"offset":"32914894","executable":true},"http.js.map":{"size":841,"offset":"32915853","executable":true},"https.js":{"size":212,"offset":"32916694","executable":true},"https.js.map":{"size":312,"offset":"32916906","executable":true},"mailto.js":{"size":7746,"offset":"32917218","executable":true},"mailto.js.map":{"size":7209,"offset":"32924964","executable":true},"urn-uuid.js":{"size":868,"offset":"32932173","executable":true},"urn-uuid.js.map":{"size":832,"offset":"32933041","executable":true},"urn.js":{"size":2050,"offset":"32933873","executable":true},"urn.js.map":{"size":1939,"offset":"32935923","executable":true},"ws.js":{"size":1659,"offset":"32937862","executable":true},"ws.js.map":{"size":1610,"offset":"32939521","executable":true},"wss.js":{"size":198,"offset":"32941131","executable":true},"wss.js.map":{"size":307,"offset":"32941329","executable":true}}}}},"es5":{"files":{"uri.all.js":{"size":57304,"offset":"32941636","executable":true},"uri.all.js.map":{"size":102192,"offset":"32998940","executable":true},"uri.all.min.js":{"size":17200,"offset":"33101132","executable":true},"uri.all.min.js.map":{"size":83083,"offset":"33118332","executable":true}}}}}}},"utf8-byte-length":{"files":{".gitmodules":{"size":160,"offset":"33203551"},"AUTHORS":{"size":71,"offset":"33203711"},"browser.js":{"size":1174,"offset":"33203782"},"index.js":{"size":197,"offset":"33204956"},"package.json":{"size":502,"offset":"33205153"}}},"validate-npm-package-license":{"files":{"LICENSE":{"size":11358,"offset":"33231644"},"index.js":{"size":1925,"offset":"33243002"},"package.json":{"size":735,"offset":"33244927"}}},"which":{"files":{"LICENSE":{"size":765,"offset":"33260357"},"package.json":{"size":710,"offset":"33261122"},"which.js":{"size":3184,"offset":"33261832"},"bin":{"files":{"which":{"size":985,"offset":"33265016","executable":true}}}}},"wrappy":{"files":{"LICENSE":{"size":765,"offset":"33278748"},"package.json":{"size":554,"offset":"33279513"},"wrappy.js":{"size":905,"offset":"33280067"}}},"xdg-basedir":{"files":{"index.js":{"size":720,"offset":"33289470"},"license":{"size":1119,"offset":"33290190"},"package.json":{"size":596,"offset":"33291309"}}},"xmlbuilder":{"files":{"LICENSE":{"size":1080,"offset":"33291905"},"package.json":{"size":609,"offset":"33292985"},"lib":{"files":{"Utility.js":{"size":1965,"offset":"33293594"},"XMLAttribute.js":{"size":872,"offset":"33295559"},"XMLCData.js":{"size":1010,"offset":"33296431"},"XMLComment.js":{"size":1032,"offset":"33297441"},"XMLDTDAttList.js":{"size":2063,"offset":"33298473"},"XMLDTDElement.js":{"size":1181,"offset":"33300536"},"XMLDTDEntity.js":{"size":1991,"offset":"33301717"},"XMLDTDNotation.js":{"size":1327,"offset":"33303708"},"XMLDeclaration.js":{"size":1399,"offset":"33305035"},"XMLDocType.js":{"size":3369,"offset":"33306434"},"XMLDocument.js":{"size":1565,"offset":"33309803"},"XMLDocumentCB.js":{"size":12312,"offset":"33311368"},"XMLElement.js":{"size":3395,"offset":"33323680"},"XMLNode.js":{"size":13281,"offset":"33327075"},"XMLProcessingInstruction.js":{"size":1261,"offset":"33340356"},"XMLRaw.js":{"size":989,"offset":"33341617"},"XMLStreamWriter.js":{"size":10266,"offset":"33342606"},"XMLStringWriter.js":{"size":11430,"offset":"33352872"},"XMLStringifier.js":{"size":4596,"offset":"33364302"},"XMLText.js":{"size":1006,"offset":"33368898"},"XMLWriterBase.js":{"size":2888,"offset":"33369904"},"index.js":{"size":1462,"offset":"33372792"}}}}},"xmldom":{"files":{"LICENSE":{"size":143,"offset":"33374254"},"__package__.js":{"size":201,"offset":"33374397"},"changelog":{"size":496,"offset":"33374598"},"component.json":{"size":142,"offset":"33375094"},"dom-parser.js":{"size":8345,"offset":"33375236"},"dom.js":{"size":34247,"offset":"33383581"},"package.json":{"size":726,"offset":"33417828"},"sax.js":{"size":19321,"offset":"33418554"}}},"debug":{"files":{"LICENSE":{"size":1107,"offset":"25729128"},"package.json":{"size":1078,"offset":"25730275"},"src":{"files":{"browser.js":{"size":6285,"offset":"25731353"},"common.js":{"size":5929,"offset":"25737638"},"index.js":{"size":331,"offset":"25743567"},"node.js":{"size":4361,"offset":"25743898"},"debug.js":{"size":4394,"offset":"19216100"},"inspector-log.js":{"size":373,"offset":"19220757"}}},"Makefile":{"size":1059,"offset":"19208883"},"component.json":{"size":321,"offset":"19209942"},"node.js":{"size":40,"offset":"25730235"},"dist":{"files":{"debug.js":{"size":26324,"offset":"25748259"}}}}},"@sindresorhus":{"files":{"is":{"files":{"license":{"size":1109,"offset":"19301190"},"package.json":{"size":993,"offset":"19302299"},"dist":{"files":{"index.js":{"size":10891,"offset":"19303292"},"index.js.map":{"size":10526,"offset":"19314183"}}}}}}},"@szmarczak":{"files":{"http-timer":{"files":{"LICENSE":{"size":1071,"offset":"19324709","executable":true},"package.json":{"size":654,"offset":"19325780","executable":true},"source":{"files":{"index.js":{"size":2095,"offset":"19326434","executable":true}}}}}}},"android-versions":{"files":{".jshintignore":{"size":63,"offset":"20211188"},"index.js":{"size":7083,"offset":"20211251"},"package.json":{"size":607,"offset":"20218334"}}},"ansi-align":{"files":{"LICENSE":{"size":731,"offset":"20230606"},"index.js":{"size":1334,"offset":"20231337"},"package.json":{"size":643,"offset":"20232671"},"node_modules":{"files":{"ansi-regex":{"files":{"index.js":{"size":367,"offset":"33658943"},"license":{"size":1109,"offset":"33659310"},"package.json":{"size":578,"offset":"33660419"}}},"is-fullwidth-code-point":{"files":{"index.js":{"size":1393,"offset":"33660997"},"license":{"size":1119,"offset":"33662390"},"package.json":{"size":647,"offset":"33663509"}}},"string-width":{"files":{"index.js":{"size":751,"offset":"33664156"},"license":{"size":1109,"offset":"33664907"},"package.json":{"size":749,"offset":"33666016"}}},"strip-ansi":{"files":{"index.js":{"size":220,"offset":"33666765"},"license":{"size":1109,"offset":"33666985"},"package.json":{"size":662,"offset":"33668094"}}}}}}},"array-find-index":{"files":{"index.js":{"size":464,"offset":"22877757"},"license":{"size":1119,"offset":"22878221"},"package.json":{"size":589,"offset":"22879340"}}},"array-ify":{"files":{"index.js":{"size":93,"offset":"22879929"},"package.json":{"size":595,"offset":"22880022"}}},"asn1":{"files":{"LICENSE":{"size":1076,"offset":"22880617"},"package.json":{"size":627,"offset":"22881693"},"lib":{"files":{"index.js":{"size":320,"offset":"22882320"},"ber":{"files":{"errors.js":{"size":240,"offset":"22882640"},"index.js":{"size":469,"offset":"22882880"},"reader.js":{"size":5650,"offset":"22883349"},"types.js":{"size":638,"offset":"22888999"},"writer.js":{"size":7666,"offset":"22889637"}}}}}}},"asynckit":{"files":{"LICENSE":{"size":1078,"offset":"22909566"},"bench.js":{"size":1256,"offset":"22910644"},"index.js":{"size":156,"offset":"22911900"},"package.json":{"size":937,"offset":"22912056"},"parallel.js":{"size":1017,"offset":"22912993"},"serial.js":{"size":501,"offset":"22914010"},"serialOrdered.js":{"size":1751,"offset":"22914511"},"stream.js":{"size":703,"offset":"22916262"},"lib":{"files":{"abort.js":{"size":497,"offset":"22916965"},"async.js":{"size":599,"offset":"22917462"},"defer.js":{"size":441,"offset":"22918061"},"iterate.js":{"size":1794,"offset":"22918502"},"readable_asynckit.js":{"size":1611,"offset":"22920296"},"readable_parallel.js":{"size":673,"offset":"22921907"},"readable_serial.js":{"size":655,"offset":"22922580"},"readable_serial_ordered.js":{"size":941,"offset":"22923235"},"state.js":{"size":941,"offset":"22924176"},"streamify.js":{"size":2964,"offset":"22925117"},"terminator.js":{"size":533,"offset":"22928081"}}}}},"aws-sign2":{"files":{"LICENSE":{"size":9140,"offset":"22928614"},"index.js":{"size":4416,"offset":"22937754"},"package.json":{"size":629,"offset":"22942170"}}},"aws4":{"files":{"LICENSE":{"size":1080,"offset":"22942799"},"aws4.js":{"size":11415,"offset":"22943879"},"lru.js":{"size":1914,"offset":"22955294"},"package.json":{"size":533,"offset":"22957208"},".github":{"files":{"FUNDING.yml":{"size":61,"offset":"22957741"}}}}},"bcrypt-pbkdf":{"files":{"CONTRIBUTING.md":{"size":547,"offset":"22968971"},"LICENSE":{"size":3195,"offset":"22969518"},"index.js":{"size":23230,"offset":"22972713"},"package.json":{"size":443,"offset":"22995943"}}},"boxen":{"files":{"index.js":{"size":3801,"offset":"23712555"},"license":{"size":1109,"offset":"23716356"},"package.json":{"size":858,"offset":"23717465"},"node_modules":{"files":{"ansi-regex":{"files":{"index.js":{"size":367,"offset":"33736026"},"license":{"size":1109,"offset":"33736393"},"package.json":{"size":578,"offset":"33737502"}}},"camelcase":{"files":{"index.js":{"size":2098,"offset":"33738080"},"license":{"size":1109,"offset":"33740178"},"package.json":{"size":681,"offset":"33741287"}}},"is-fullwidth-code-point":{"files":{"index.js":{"size":1393,"offset":"33741968"},"license":{"size":1119,"offset":"33743361"},"package.json":{"size":647,"offset":"33744480"}}},"string-width":{"files":{"index.js":{"size":751,"offset":"33745127"},"license":{"size":1109,"offset":"33745878"},"package.json":{"size":749,"offset":"33746987"}}},"strip-ansi":{"files":{"index.js":{"size":220,"offset":"33747736"},"license":{"size":1109,"offset":"33747956"},"package.json":{"size":662,"offset":"33749065"}}}}}}},"buffer-crc32":{"files":{"LICENSE":{"size":1085,"offset":"23739286"},"index.js":{"size":4517,"offset":"23740371"},"package.json":{"size":770,"offset":"23744888"}}},"cacheable-request":{"files":{"LICENSE":{"size":1068,"offset":"23979857"},"package.json":{"size":1132,"offset":"23980925"},"src":{"files":{"index.js":{"size":6936,"offset":"23982057"}}},"node_modules":{"files":{"get-stream":{"files":{"buffer-stream.js":{"size":894,"offset":"33832875"},"index.js":{"size":1444,"offset":"33833769"},"license":{"size":1117,"offset":"33835213"},"package.json":{"size":817,"offset":"33836330"}}},"lowercase-keys":{"files":{"index.js":{"size":178,"offset":"33837147"},"license":{"size":1109,"offset":"33837325"},"package.json":{"size":624,"offset":"33838434"}}}}}}},"camelcase":{"files":{"index.js":{"size":1016,"offset":"23988993"},"license":{"size":1119,"offset":"23990009"},"package.json":{"size":625,"offset":"23991128"}}},"camelcase-keys":{"files":{"index.js":{"size":328,"offset":"23991753"},"license":{"size":1119,"offset":"23992081"},"package.json":{"size":663,"offset":"23993200"}}},"caseless":{"files":{"LICENSE":{"size":9113,"offset":"23993863"},"index.js":{"size":1786,"offset":"24002976"},"package.json":{"size":532,"offset":"24004762"}}},"cli-boxes":{"files":{"boxes.json":{"size":1037,"offset":"24032885"},"index.js":{"size":167,"offset":"24033922"},"license":{"size":1117,"offset":"24034089"},"package.json":{"size":690,"offset":"24035206"}}},"cliui":{"files":{"LICENSE.txt":{"size":731,"offset":"24035896"},"index.js":{"size":8278,"offset":"24036627"},"package.json":{"size":1090,"offset":"24044905"},"node_modules":{"files":{"ansi-regex":{"files":{"index.js":{"size":367,"offset":"33839058"},"license":{"size":1109,"offset":"33839425"},"package.json":{"size":578,"offset":"33840534"}}},"is-fullwidth-code-point":{"files":{"index.js":{"size":1393,"offset":"33841112"},"license":{"size":1119,"offset":"33842505"},"package.json":{"size":647,"offset":"33843624"}}},"string-width":{"files":{"index.js":{"size":751,"offset":"33844271"},"license":{"size":1109,"offset":"33845022"},"package.json":{"size":749,"offset":"33846131"}}},"strip-ansi":{"files":{"index.js":{"size":220,"offset":"33846880"},"license":{"size":1109,"offset":"33847100"},"package.json":{"size":662,"offset":"33848209"}}}}}}},"clone-response":{"files":{"LICENSE":{"size":1068,"offset":"24045995"},"package.json":{"size":778,"offset":"24047063"},"src":{"files":{"index.js":{"size":401,"offset":"24047841"}}}}},"code-point-at":{"files":{"index.js":{"size":610,"offset":"24048242"},"license":{"size":1119,"offset":"24048852"},"package.json":{"size":589,"offset":"24049971"}}},"compare-func":{"files":{"LICENSE":{"size":1076,"offset":"24091305"},"index.js":{"size":770,"offset":"24092381"},"package.json":{"size":698,"offset":"24093151"}}},"concat-stream":{"files":{"LICENSE":{"size":1084,"offset":"24098563"},"index.js":{"size":3775,"offset":"24099647"},"package.json":{"size":1099,"offset":"24103422"},"node_modules":{"files":{"isarray":{"files":{"Makefile":{"size":55,"offset":"33848871"},"component.json":{"size":470,"offset":"33848926"},"index.js":{"size":132,"offset":"33849396"},"package.json":{"size":870,"offset":"33849528"}}},"readable-stream":{"files":{"CONTRIBUTING.md":{"size":1443,"offset":"33850398"},"GOVERNANCE.md":{"size":5550,"offset":"33851841"},"LICENSE":{"size":2337,"offset":"33857391"},"duplex-browser.js":{"size":53,"offset":"33859728"},"duplex.js":{"size":46,"offset":"33859781"},"package.json":{"size":1054,"offset":"33859827"},"passthrough.js":{"size":51,"offset":"33860881"},"readable-browser.js":{"size":351,"offset":"33860932"},"readable.js":{"size":771,"offset":"33861283"},"transform.js":{"size":49,"offset":"33862054"},"writable-browser.js":{"size":55,"offset":"33862103"},"writable.js":{"size":229,"offset":"33862158"},"lib":{"files":{"_stream_duplex.js":{"size":4015,"offset":"33862387"},"_stream_passthrough.js":{"size":1753,"offset":"33866402"},"_stream_readable.js":{"size":31324,"offset":"33868155"},"_stream_transform.js":{"size":7742,"offset":"33899479"},"_stream_writable.js":{"size":20317,"offset":"33907221"},"internal":{"files":{"streams":{"files":{"BufferList.js":{"size":2059,"offset":"33927538"},"destroy.js":{"size":1849,"offset":"33929597"},"stream-browser.js":{"size":49,"offset":"33931446"},"stream.js":{"size":36,"offset":"33931495"}}}}}}},"doc":{"files":{"wg-meetings":{"files":{"2015-01-30.md":{"size":2280,"offset":"33931531"}}}}}}},"safe-buffer":{"files":{"LICENSE":{"size":1081,"offset":"33933811"},"index.js":{"size":1529,"offset":"33934892"},"package.json":{"size":523,"offset":"33936421"}}},"string_decoder":{"files":{"LICENSE":{"size":2338,"offset":"33936944"},"package.json":{"size":537,"offset":"33939282"},"lib":{"files":{"string_decoder.js":{"size":9465,"offset":"33939819"}}}}}}}}},"configstore":{"files":{"index.js":{"size":2441,"offset":"24104521"},"license":{"size":1305,"offset":"24106962"},"package.json":{"size":802,"offset":"24108267"},"node_modules":{"files":{"dot-prop":{"files":{"index.js":{"size":2553,"offset":"33949284"},"license":{"size":1119,"offset":"33951837"},"package.json":{"size":674,"offset":"33952956"}}}}}}},"cordova-android":{"unpacked":true,"files":{".eslintignore":{"size":53,"unpacked":true},".eslintrc.yml":{"size":158,"unpacked":true},".ratignore":{"size":98,"unpacked":true},".reviewboardrc":{"size":194,"unpacked":true},"CONTRIBUTING.md":{"size":1336,"unpacked":true},"LICENSE":{"size":16971,"unpacked":true},"NOTICE":{"size":647,"unpacked":true},"RELEASENOTES.md":{"size":68834,"unpacked":true},"VERSION":{"size":6,"unpacked":true},"package.json":{"size":1152,"unpacked":true},"spec":{"unpacked":true,"files":{".eslintrc.yml":{"size":68,"unpacked":true},"coverage.json":{"size":202,"unpacked":true},"helper.js":{"size":1136,"unpacked":true},"unit":{"unpacked":true,"files":{"Adb.spec.js":{"size":8629,"unpacked":true},"AndroidManifest.spec.js":{"size":9143,"unpacked":true},"AndroidProject.spec.js":{"size":4326,"unpacked":true},"Api.spec.js":{"size":2901,"unpacked":true},"android_sdk.spec.js":{"size":7118,"unpacked":true},"check_reqs.spec.js":{"size":10803,"unpacked":true},"create.spec.js":{"size":16101,"unpacked":true},"device.spec.js":{"size":9388,"unpacked":true},"emulator.spec.js":{"size":27773,"unpacked":true},"jasmine.json":{"size":191,"unpacked":true},"prepare.spec.js":{"size":29334,"unpacked":true},"retry.spec.js":{"size":1975,"unpacked":true},"run.spec.js":{"size":9350,"unpacked":true},"pluginHandlers":{"unpacked":true,"files":{"common.spec.js":{"size":7003,"unpacked":true},"handlers.spec.js":{"size":30075,"unpacked":true}}},"config":{"unpacked":true,"files":{"GradlePropertiesParser.spec.js":{"size":6288,"unpacked":true}}},"builders":{"unpacked":true,"files":{"ProjectBuilder.spec.js":{"size":12801,"unpacked":true},"builders.spec.js":{"size":1753,"unpacked":true}}}}},"fixtures":{"unpacked":true,"files":{"sdk25.2-android_list_avd.txt":{"size":210,"unpacked":true},"sdk25.2-android_list_targets.txt":{"size":4277,"unpacked":true},"sdk25.3-avdmanager_list_avd.txt":{"size":667,"unpacked":true},"sdk25.3-avdmanager_list_target.txt":{"size":142,"unpacked":true},"org.test.plugins.faultyplugin":{"unpacked":true,"files":{"plugin.xml":{"size":2281,"unpacked":true},"src":{"files":{"android":{"unpacked":true,"files":{"FaultyPlugin.java":{"size":79,"unpacked":true}}}}}}},"org.test.plugins.dummyplugin":{"unpacked":true,"files":{"android-resource.xml":{"size":52,"unpacked":true},"extra.gradle":{"size":13,"unpacked":true},"plugin.xml":{"size":3796,"unpacked":true},"www":{"unpacked":true,"files":{"dummyplugin.js":{"size":0,"unpacked":true},"dummyplugin":{"unpacked":true,"files":{"image.jpg":{"size":57,"unpacked":true}}}}},"src":{"files":{"android":{"unpacked":true,"files":{"DummyPlugin.java":{"size":60,"unpacked":true},"DummyPlugin2.java":{"size":61,"unpacked":true},"TestAar.aar":{"size":55,"unpacked":true},"TestLib.jar":{"size":55,"unpacked":true},"myapi.aidl":{"size":6,"unpacked":true},"mysettings.xml":{"size":6,"unpacked":true},"other.extension":{"size":6,"unpacked":true},"testaar2.aar":{"size":6,"unpacked":true},"jniLibs":{"files":{"x86":{"unpacked":true,"files":{"libnative.so":{"size":6,"unpacked":true}}}}}}}}},"plugin-lib2":{"unpacked":true,"files":{"AndroidManifest.xml":{"size":196,"unpacked":true},"libFile":{"size":17,"unpacked":true},"project.properties":{"size":18,"unpacked":true}}},"plugin-lib":{"unpacked":true,"files":{"AndroidManifest.xml":{"size":196,"unpacked":true},"libFile":{"size":17,"unpacked":true},"project.properties":{"size":18,"unpacked":true}}}}},"android_studio_project":{"unpacked":true,"files":{"build.gradle":{"size":532,"unpacked":true},"gradle.properties":{"size":855,"unpacked":true},"gradlew":{"size":4971,"unpacked":true},"gradlew.bat":{"size":2314,"unpacked":true},"settings.gradle":{"size":15,"unpacked":true},"gradle":{"files":{"wrapper":{"unpacked":true,"files":{"gradle-wrapper.properties":{"size":231,"unpacked":true}}}}},"app":{"unpacked":true,"files":{"build.gradle":{"size":645,"unpacked":true},"proguard-rules.pro":{"size":665,"unpacked":true},"src":{"files":{"main":{"unpacked":true,"files":{"AndroidManifest.xml":{"size":694,"unpacked":true},"res":{"files":{"values-w820dp":{"unpacked":true,"files":{"dimens.xml":{"size":358,"unpacked":true}}},"values":{"unpacked":true,"files":{"colors.xml":{"size":208,"unpacked":true},"dimens.xml":{"size":211,"unpacked":true},"strings.xml":{"size":77,"unpacked":true},"styles.xml":{"size":383,"unpacked":true}}},"mipmap-xxxhdpi":{"unpacked":true,"files":{"ic_launcher.png":{"size":10486,"unpacked":true}}},"mipmap-xxhdpi":{"unpacked":true,"files":{"ic_launcher.png":{"size":7718,"unpacked":true}}},"mipmap-xhdpi":{"unpacked":true,"files":{"ic_launcher.png":{"size":4842,"unpacked":true}}},"mipmap-mdpi":{"unpacked":true,"files":{"ic_launcher.png":{"size":2206,"unpacked":true}}},"mipmap-hdpi":{"unpacked":true,"files":{"ic_launcher.png":{"size":3418,"unpacked":true}}},"layout":{"unpacked":true,"files":{"activity_main.xml":{"size":761,"unpacked":true}}}}}}}}}}}}}}},"e2e":{"unpacked":true,"files":{"jasmine.json":{"size":191,"unpacked":true},"plugin.spec.js":{"size":1617,"unpacked":true},"helpers":{"unpacked":true,"files":{"projectActions.js":{"size":5512,"unpacked":true}}},"fixtures":{"files":{"cordova-plugin-fake-ios-frameworks":{"unpacked":true,"files":{"plugin.xml":{"size":1475,"unpacked":true}}},"cordova-plugin-fake":{"unpacked":true,"files":{"plugin.xml":{"size":1512,"unpacked":true},"platforms":{"files":{"android":{"files":{"FakeLib":{"unpacked":true,"files":{"project.properties":{"size":583,"unpacked":true}}}}}}}}}}}}}}},"framework":{"unpacked":true,"files":{".classpath":{"size":482,"unpacked":true},".project":{"size":1002,"unpacked":true},"AndroidManifest.xml":{"size":1068,"unpacked":true},"ant.properties":{"size":1567,"unpacked":true},"build.gradle":{"size":4316,"unpacked":true},"build.xml":{"size":7613,"unpacked":true},"cordova.gradle":{"size":7687,"unpacked":true},"project.properties":{"size":321,"unpacked":true},"src":{"files":{"org":{"files":{"apache":{"files":{"cordova":{"unpacked":true,"files":{"AuthenticationToken.java":{"size":1787,"unpacked":true},"BuildHelper.java":{"size":2475,"unpacked":true},"CallbackContext.java":{"size":4696,"unpacked":true},"CallbackMap.java":{"size":2757,"unpacked":true},"Config.java":{"size":2257,"unpacked":true},"ConfigXmlParser.java":{"size":5208,"unpacked":true},"CordovaActivity.java":{"size":18154,"unpacked":true},"CordovaArgs.java":{"size":3104,"unpacked":true},"CordovaBridge.java":{"size":7724,"unpacked":true},"CordovaClientCertRequest.java":{"size":2954,"unpacked":true},"CordovaDialogsHelper.java":{"size":5989,"unpacked":true},"CordovaHttpAuthHandler.java":{"size":1718,"unpacked":true},"CordovaInterface.java":{"size":3269,"unpacked":true},"CordovaInterfaceImpl.java":{"size":9108,"unpacked":true},"CordovaPlugin.java":{"size":15690,"unpacked":true},"CordovaPreferences.java":{"size":3039,"unpacked":true},"CordovaResourceApi.java":{"size":18811,"unpacked":true},"CordovaWebView.java":{"size":4645,"unpacked":true},"CordovaWebViewEngine.java":{"size":3070,"unpacked":true},"CordovaWebViewImpl.java":{"size":21429,"unpacked":true},"CoreAndroid.java":{"size":14964,"unpacked":true},"ExposedJsApi.java":{"size":1393,"unpacked":true},"ICordovaClientCertRequest.java":{"size":2152,"unpacked":true},"ICordovaCookieManager.java":{"size":1158,"unpacked":true},"ICordovaHttpAuthHandler.java":{"size":1431,"unpacked":true},"LOG.java":{"size":6076,"unpacked":true},"NativeToJsMessageQueue.java":{"size":21137,"unpacked":true},"PermissionHelper.java":{"size":4001,"unpacked":true},"PluginEntry.java":{"size":2308,"unpacked":true},"PluginManager.java":{"size":18790,"unpacked":true},"PluginResult.java":{"size":6580,"unpacked":true},"ResumeCallback.java":{"size":3002,"unpacked":true},"Whitelist.java":{"size":6777,"unpacked":true},"engine":{"unpacked":true,"files":{"SystemCookieManager.java":{"size":2471,"unpacked":true},"SystemExposedJsApi.java":{"size":2135,"unpacked":true},"SystemWebChromeClient.java":{"size":12393,"unpacked":true},"SystemWebView.java":{"size":3016,"unpacked":true},"SystemWebViewClient.java":{"size":14169,"unpacked":true},"SystemWebViewEngine.java":{"size":11473,"unpacked":true}}}}}}}}}}},"gradle":{"files":{"wrapper":{"unpacked":true,"files":{"gradle-wrapper.properties":{"size":230,"unpacked":true}}}}},".settings":{"unpacked":true,"files":{"org.eclipse.jdt.core.prefs":{"size":173,"unpacked":true}}}}},"cordova-js-src":{"unpacked":true,"files":{"exec.js":{"size":10626,"unpacked":true},"platform.js":{"size":4924,"unpacked":true},"plugin":{"files":{"android":{"unpacked":true,"files":{"app.js":{"size":4005,"unpacked":true}}}}},"android":{"unpacked":true,"files":{"nativeapiprovider.js":{"size":1322,"unpacked":true},"promptbasednativeapi.js":{"size":1441,"unpacked":true}}}}},"bin":{"unpacked":true,"files":{"android_sdk_version":{"size":1073,"unpacked":true},"android_sdk_version.bat":{"size":1037,"unpacked":true},"check_reqs":{"size":1184,"unpacked":true},"check_reqs.bat":{"size":1019,"unpacked":true},"create":{"size":2539,"unpacked":true},"create.bat":{"size":1006,"unpacked":true},"update":{"size":1526,"unpacked":true},"update.bat":{"size":1007,"unpacked":true},"templates":{"files":{"project":{"unpacked":true,"files":{"Activity.java":{"size":1439,"unpacked":true},"AndroidManifest.xml":{"size":2264,"unpacked":true},"build.gradle":{"size":1721,"unpacked":true},"gitignore":{"size":281,"unpacked":true},"project.properties":{"size":494,"unpacked":true},"wrapper.gradle":{"size":44,"unpacked":true},"res":{"files":{"xml":{"unpacked":true,"files":{"config.xml":{"size":2339,"unpacked":true}}},"values":{"unpacked":true,"files":{"strings.xml":{"size":423,"unpacked":true}}},"mipmap-xxxhdpi-v26":{"unpacked":true,"files":{"ic_launcher.xml":{"size":268,"unpacked":true},"ic_launcher_background.png":{"size":131,"unpacked":true},"ic_launcher_foreground.png":{"size":11561,"unpacked":true}}},"mipmap-xxxhdpi":{"unpacked":true,"files":{"ic_launcher.png":{"size":6042,"unpacked":true}}},"mipmap-xxhdpi-v26":{"unpacked":true,"files":{"ic_launcher.xml":{"size":268,"unpacked":true},"ic_launcher_background.png":{"size":121,"unpacked":true},"ic_launcher_foreground.png":{"size":8626,"unpacked":true}}},"mipmap-xxhdpi":{"unpacked":true,"files":{"ic_launcher.png":{"size":5209,"unpacked":true}}},"mipmap-xhdpi-v26":{"unpacked":true,"files":{"ic_launcher.xml":{"size":268,"unpacked":true},"ic_launcher_background.png":{"size":113,"unpacked":true},"ic_launcher_foreground.png":{"size":5109,"unpacked":true}}},"mipmap-xhdpi":{"unpacked":true,"files":{"ic_launcher.png":{"size":3219,"unpacked":true}}},"mipmap-mdpi-v26":{"unpacked":true,"files":{"ic_launcher.xml":{"size":268,"unpacked":true},"ic_launcher_background.png":{"size":84,"unpacked":true},"ic_launcher_foreground.png":{"size":1866,"unpacked":true}}},"mipmap-mdpi":{"unpacked":true,"files":{"ic_launcher.png":{"size":1923,"unpacked":true}}},"mipmap-ldpi-v26":{"unpacked":true,"files":{"ic_launcher.xml":{"size":268,"unpacked":true},"ic_launcher_background.png":{"size":83,"unpacked":true},"ic_launcher_foreground.png":{"size":1494,"unpacked":true}}},"mipmap-ldpi":{"unpacked":true,"files":{"ic_launcher.png":{"size":1571,"unpacked":true}}},"mipmap-hdpi-v26":{"unpacked":true,"files":{"ic_launcher.xml":{"size":268,"unpacked":true},"ic_launcher_background.png":{"size":86,"unpacked":true},"ic_launcher_foreground.png":{"size":2709,"unpacked":true}}},"mipmap-hdpi":{"unpacked":true,"files":{"ic_launcher.png":{"size":2709,"unpacked":true}}},"drawable-port-xxxhdpi":{"unpacked":true,"files":{"screen.png":{"size":196498,"unpacked":true}}},"drawable-port-xxhdpi":{"unpacked":true,"files":{"screen.png":{"size":124978,"unpacked":true}}},"drawable-port-xhdpi":{"unpacked":true,"files":{"screen.png":{"size":76679,"unpacked":true}}},"drawable-port-mdpi":{"unpacked":true,"files":{"screen.png":{"size":14693,"unpacked":true}}},"drawable-port-ldpi":{"unpacked":true,"files":{"screen.png":{"size":8283,"unpacked":true}}},"drawable-port-hdpi":{"unpacked":true,"files":{"screen.png":{"size":35655,"unpacked":true}}},"drawable-land-xxxhdpi":{"unpacked":true,"files":{"screen.png":{"size":195112,"unpacked":true}}},"drawable-land-xxhdpi":{"unpacked":true,"files":{"screen.png":{"size":132545,"unpacked":true}}},"drawable-land-xhdpi":{"unpacked":true,"files":{"screen.png":{"size":80347,"unpacked":true}}},"drawable-land-mdpi":{"unpacked":true,"files":{"screen.png":{"size":14831,"unpacked":true}}},"drawable-land-ldpi":{"unpacked":true,"files":{"screen.png":{"size":7751,"unpacked":true}}},"drawable-land-hdpi":{"unpacked":true,"files":{"screen.png":{"size":38612,"unpacked":true}}}}},"legacy":{"unpacked":true,"files":{"build.gradle":{"size":11624,"unpacked":true}}},"assets":{"files":{"www":{"unpacked":true,"files":{"cordova.js":{"size":65029,"unpacked":true},"index.html":{"size":2481,"unpacked":true},"js":{"unpacked":true,"files":{"index.js":{"size":1938,"unpacked":true}}},"img":{"unpacked":true,"files":{"cordova.png":{"size":19932,"unpacked":true},"logo.png":{"size":21814,"unpacked":true}}},"css":{"unpacked":true,"files":{"index.css":{"size":3719,"unpacked":true}}}}}}},"app":{"unpacked":true,"files":{"build.gradle":{"size":12850,"unpacked":true}}}}},"cordova":{"unpacked":true,"files":{"Api.js":{"size":14996,"unpacked":true},"build":{"size":1653,"unpacked":true},"build.bat":{"size":1010,"unpacked":true},"clean":{"size":1719,"unpacked":true},"clean.bat":{"size":1010,"unpacked":true},"defaults.xml":{"size":1038,"unpacked":true},"log":{"size":1227,"unpacked":true},"log.bat":{"size":1006,"unpacked":true},"loggingHelper.js":{"size":479,"unpacked":true},"run":{"size":1712,"unpacked":true},"run.bat":{"size":1006,"unpacked":true},"version":{"size":1017,"unpacked":true},"version.bat":{"size":1015,"unpacked":true},"lib":{"unpacked":true,"files":{"Adb.js":{"size":4347,"unpacked":true},"AndroidManifest.js":{"size":4333,"unpacked":true},"AndroidProject.js":{"size":7566,"unpacked":true},"PackageType.js":{"size":910,"unpacked":true},"android_sdk.js":{"size":3673,"unpacked":true},"build.js":{"size":13549,"unpacked":true},"check_reqs.js":{"size":20578,"unpacked":true},"device.js":{"size":4786,"unpacked":true},"emulator.js":{"size":23016,"unpacked":true},"getASPath.bat":{"size":137,"unpacked":true},"install-device":{"size":1500,"unpacked":true},"install-device.bat":{"size":1034,"unpacked":true},"install-emulator":{"size":1345,"unpacked":true},"install-emulator.bat":{"size":1038,"unpacked":true},"list-devices":{"size":1269,"unpacked":true},"list-devices.bat":{"size":1030,"unpacked":true},"list-emulator-images":{"size":1293,"unpacked":true},"list-emulator-images.bat":{"size":1048,"unpacked":true},"list-started-emulators":{"size":1289,"unpacked":true},"list-started-emulators.bat":{"size":1050,"unpacked":true},"log.js":{"size":1938,"unpacked":true},"plugin-build.gradle":{"size":2218,"unpacked":true},"pluginHandlers.js":{"size":14053,"unpacked":true},"prepare.js":{"size":30446,"unpacked":true},"retry.js":{"size":2445,"unpacked":true},"run.js":{"size":6102,"unpacked":true},"start-emulator":{"size":1343,"unpacked":true},"start-emulator.bat":{"size":1034,"unpacked":true},"config":{"unpacked":true,"files":{"GradlePropertiesParser.js":{"size":4601,"unpacked":true}}},"builders":{"unpacked":true,"files":{"ProjectBuilder.js":{"size":16662,"unpacked":true},"builders.js":{"size":1316,"unpacked":true}}}}}}}}},"lib":{"unpacked":true,"files":{"create.js":{"size":15937,"unpacked":true}}}}},".github":{"unpacked":true,"files":{"ISSUE_TEMPLATE.md":{"size":1191,"unpacked":true},"PULL_REQUEST_TEMPLATE.md":{"size":1118,"unpacked":true},"ISSUE_TEMPLATE":{"unpacked":true,"files":{"BUG_REPORT.md":{"size":998,"unpacked":true},"FEATURE_REQUEST.md":{"size":601,"unpacked":true},"SUPPORT_QUESTION.md":{"size":962,"unpacked":true}}}}}}},"cordova-electron":{"files":{"CONTRIBUTING.md":{"size":1426,"offset":"24289248"},"DOCUMENTATION.md":{"size":23532,"offset":"24290674"},"LICENSE":{"size":17024,"offset":"24314206"},"NOTICE":{"size":168,"offset":"24331230"},"RELEASENOTES.md":{"size":7032,"offset":"24331398"},"VERSION":{"size":6,"offset":"24338430"},"package.json":{"size":1183,"offset":"24338436"},"cordova-lib":{"files":{"cordova.js":{"size":52903,"offset":"24339619"}}},"cordova-js-src":{"files":{"confighelper.js":{"size":2820,"offset":"24392522"},"exec.js":{"size":4670,"offset":"24395342"},"platform.js":{"size":1420,"offset":"24400012"}}},"bin":{"files":{"create":{"size":2609,"offset":"24401432","executable":true},"create.bat":{"size":1008,"offset":"24404041"},"update":{"size":1279,"offset":"24405049"},"update.bat":{"size":1009,"offset":"24406328"},"templates":{"files":{"project":{"files":{"cdv-electron-main.js":{"size":3361,"offset":"24407337"},"cdv-electron-settings.json":{"size":181,"offset":"24410698"},"config.xml":{"size":917,"offset":"24410879"},"www":{"files":{"index.html":{"size":1885,"offset":"24411796"},"js":{"files":{"index.js":{"size":1915,"offset":"24413681"}}},"img":{"files":{"logo.png":{"size":20554,"offset":"24415596"},"splash.png":{"size":37564,"offset":"24436150"}}},"icons":{"files":{"icon.png":{"size":39830,"offset":"24473714"}}},"css":{"files":{"index.css":{"size":3733,"offset":"24513544"}}}}}}},"cordova":{"files":{"Api.js":{"size":14774,"offset":"24517277"},"build":{"size":1111,"offset":"24532051","executable":true},"build.bat":{"size":1015,"offset":"24533162"},"clean":{"size":1111,"offset":"24534177","executable":true},"clean.bat":{"size":1015,"offset":"24535288"},"defaults.xml":{"size":1007,"offset":"24536303"},"handler.js":{"size":6029,"offset":"24537310"},"log":{"size":869,"offset":"24543339","executable":true},"parser.js":{"size":3747,"offset":"24544208"},"run":{"size":1162,"offset":"24547955","executable":true},"run.bat":{"size":1011,"offset":"24549117"},"version":{"size":1178,"offset":"24550128","executable":true},"version.bat":{"size":1019,"offset":"24551306"},"lib":{"files":{"ManifestJsonParser.js":{"size":4443,"offset":"24552325"},"PackageJsonParser.js":{"size":3725,"offset":"24556768"},"SettingJsonParser.js":{"size":1685,"offset":"24560493"},"build.js":{"size":15094,"offset":"24562178"},"check_reqs.js":{"size":926,"offset":"24577272"},"clean.js":{"size":1954,"offset":"24578198"},"prepare.js":{"size":13836,"offset":"24580152"},"run.js":{"size":1408,"offset":"24593988"},"util.js":{"size":1410,"offset":"24595396"},"build":{"files":{"base.json":{"size":315,"offset":"24596806"},"darwin.json":{"size":345,"offset":"24597121"},"linux.json":{"size":223,"offset":"24597466"},"win32.json":{"size":217,"offset":"24597689"}}}}}}},"build-res":{"files":{"installer.png":{"size":39830,"offset":"24597906"}}}}},"lib":{"files":{"create.js":{"size":3818,"offset":"24637736"},"update.js":{"size":1053,"offset":"24641554"}}}}}}},"cordova-plugin-file":{"files":{".ratignore":{"size":15,"offset":"24642607"},"CONTRIBUTING.md":{"size":1401,"offset":"24642622"},"LICENSE":{"size":11357,"offset":"24644023"},"NOTICE":{"size":163,"offset":"24655380"},"RELEASENOTES.md":{"size":42082,"offset":"24655543"},"package.json":{"size":1033,"offset":"24697625"},"plugin.xml":{"size":10106,"offset":"24698658"},"www":{"files":{"DirectoryEntry.js":{"size":4586,"offset":"24708764"},"DirectoryReader.js":{"size":2628,"offset":"24713350"},"Entry.js":{"size":9783,"offset":"24715978"},"File.js":{"size":2629,"offset":"24725761"},"FileEntry.js":{"size":3333,"offset":"24728390"},"FileError.js":{"size":1393,"offset":"24731723"},"FileReader.js":{"size":10432,"offset":"24733116"},"FileSystem.js":{"size":1869,"offset":"24743548"},"FileUploadOptions.js":{"size":1733,"offset":"24745417"},"FileUploadResult.js":{"size":1014,"offset":"24747150"},"FileWriter.js":{"size":10495,"offset":"24748164"},"Flags.js":{"size":1250,"offset":"24758659"},"LocalFileSystem.js":{"size":861,"offset":"24759909"},"Metadata.js":{"size":1399,"offset":"24760770"},"ProgressEvent.js":{"size":2450,"offset":"24762169"},"fileSystemPaths.js":{"size":2452,"offset":"24764619"},"fileSystems-roots.js":{"size":1548,"offset":"24767071"},"fileSystems.js":{"size":955,"offset":"24768619"},"requestFileSystem.js":{"size":3146,"offset":"24769574"},"resolveLocalFileSystemURI.js":{"size":4219,"offset":"24772720"},"osx":{"files":{"FileSystem.js":{"size":1128,"offset":"24776939"}}},"ios":{"files":{"FileSystem.js":{"size":1128,"offset":"24778067"}}},"browser":{"files":{"FileSystem.js":{"size":1111,"offset":"24779195"},"Preparing.js":{"size":7937,"offset":"24780306"},"isChrome.js":{"size":1117,"offset":"24788243"}}},"android":{"files":{"FileSystem.js":{"size":1955,"offset":"24789360"}}}}},"src":{"files":{"windows":{"files":{"FileProxy.js":{"size":44977,"offset":"24791315"}}},"osx":{"files":{"CDVFile.h":{"size":7060,"offset":"24836292"},"CDVFile.m":{"size":40488,"offset":"24843352"},"CDVLocalFilesystem.h":{"size":1071,"offset":"24883840"},"CDVLocalFilesystem.m":{"size":31062,"offset":"24884911"}}},"ios":{"files":{"CDVAssetLibraryFilesystem.h":{"size":1005,"offset":"24915973"},"CDVAssetLibraryFilesystem.m":{"size":11206,"offset":"24916978"},"CDVFile.h":{"size":6279,"offset":"24928184"},"CDVFile.m":{"size":44439,"offset":"24934463"},"CDVLocalFilesystem.h":{"size":1071,"offset":"24978902"},"CDVLocalFilesystem.m":{"size":31653,"offset":"24979973"}}},"browser":{"files":{"FileProxy.js":{"size":43769,"offset":"25011626"}}},"android":{"files":{"AssetFilesystem.java":{"size":11038,"offset":"25055395"},"ContentFilesystem.java":{"size":8288,"offset":"25066433"},"DirectoryManager.java":{"size":4086,"offset":"25074721"},"EncodingException.java":{"size":1054,"offset":"25078807"},"FileExistsException.java":{"size":1050,"offset":"25079861"},"FileUtils.java":{"size":54253,"offset":"25080911"},"Filesystem.java":{"size":12578,"offset":"25135164"},"InvalidModificationException.java":{"size":1077,"offset":"25147742"},"LocalFilesystem.java":{"size":19082,"offset":"25148819"},"LocalFilesystemURL.java":{"size":2149,"offset":"25167901"},"NoModificationAllowedException.java":{"size":1080,"offset":"25170050"},"PendingRequests.java":{"size":3477,"offset":"25171130"},"TypeMismatchException.java":{"size":1063,"offset":"25174607"},"build-extras.gradle":{"size":1848,"offset":"25175670"}}}}},"doc":{"files":{"plugins.md":{"size":5826,"offset":"25177518"}}}}},"cordova-plugin-whitelist":{"files":{"CONTRIBUTING.md":{"size":1400,"offset":"25183344"},"LICENSE":{"size":11357,"offset":"25184744"},"NOTICE":{"size":163,"offset":"25196101"},"RELEASENOTES.md":{"size":5711,"offset":"25196264"},"package.json":{"size":636,"offset":"25201975"},"plugin.xml":{"size":1686,"offset":"25202611"},"src":{"files":{"android":{"files":{"WhitelistPlugin.java":{"size":6317,"offset":"25204297"}}}}}}},"cordova-plugin-zip":{"files":{"CONTRIBUTING.md":{"size":797,"offset":"25210614"},"LICENSE":{"size":3884,"offset":"25211411"},"package.json":{"size":519,"offset":"25215295"},"plugin.xml":{"size":3601,"offset":"25215814"},"zip.js":{"size":729,"offset":"25219415"},"src":{"files":{"ios":{"files":{"Common.h":{"size":4068,"offset":"25220144","executable":true},"SSZipArchive.h":{"size":4152,"offset":"25224212","executable":true},"SSZipArchive.m":{"size":29647,"offset":"25228364","executable":true},"ZipPlugin.h":{"size":416,"offset":"25258011"},"ZipPlugin.m":{"size":2798,"offset":"25258427"},"minizip":{"files":{"crypt.h":{"size":4872,"offset":"25261225","executable":true},"ioapi.c":{"size":12350,"offset":"25266097","executable":true},"ioapi.h":{"size":6925,"offset":"25278447","executable":true},"mztools.c":{"size":8665,"offset":"25285372","executable":true},"mztools.h":{"size":677,"offset":"25294037","executable":true},"unzip.c":{"size":70903,"offset":"25294714","executable":true},"unzip.h":{"size":10523,"offset":"25365617","executable":true},"zip.c":{"size":75082,"offset":"25376140","executable":true},"zip.h":{"size":9193,"offset":"25451222","executable":true}}},"aes":{"files":{"aes.h":{"size":7267,"offset":"25460415","executable":true},"aes_via_ace.h":{"size":17409,"offset":"25467682","executable":true},"aescrypt.c":{"size":10139,"offset":"25485091","executable":true},"aeskey.c":{"size":16384,"offset":"25495230","executable":true},"aesopt.h":{"size":26845,"offset":"25511614","executable":true},"aestab.c":{"size":15633,"offset":"25538459","executable":true},"aestab.h":{"size":5332,"offset":"25554092","executable":true},"brg_endian.h":{"size":5290,"offset":"25559424","executable":true},"brg_types.h":{"size":8194,"offset":"25564714","executable":true},"entropy.c":{"size":1039,"offset":"25572908","executable":true},"entropy.h":{"size":208,"offset":"25573947","executable":true},"fileenc.c":{"size":4953,"offset":"25574155","executable":true},"fileenc.h":{"size":4357,"offset":"25579108","executable":true},"hmac.c":{"size":5247,"offset":"25583465","executable":true},"hmac.h":{"size":3043,"offset":"25588712","executable":true},"prng.c":{"size":5340,"offset":"25591755","executable":true},"prng.h":{"size":3098,"offset":"25597095","executable":true},"pwd2key.c":{"size":6211,"offset":"25600193","executable":true},"pwd2key.h":{"size":2053,"offset":"25606404","executable":true},"sha1.c":{"size":8711,"offset":"25608457","executable":true},"sha1.h":{"size":2430,"offset":"25617168","executable":true}}}}},"android":{"files":{"Zip.java":{"size":7615,"offset":"25619598"}}}}}}},"crypto-random-string":{"files":{"index.js":{"size":241,"offset":"25660951"},"license":{"size":1119,"offset":"25661192"},"package.json":{"size":610,"offset":"25662311"}}},"currently-unhandled":{"files":{"browser.js":{"size":561,"offset":"25662921"},"core.js":{"size":747,"offset":"25663482"},"index.js":{"size":250,"offset":"25664229"},"license":{"size":1120,"offset":"25664479"},"package.json":{"size":1143,"offset":"25665599"}}},"dashdash":{"files":{"CHANGES.md":{"size":10912,"offset":"25666742"},"LICENSE.txt":{"size":1156,"offset":"25677654"},"package.json":{"size":614,"offset":"25678810"},"lib":{"files":{"dashdash.js":{"size":35297,"offset":"25679424"}}},"etc":{"files":{"dashdash.bash_completion.in":{"size":14407,"offset":"25714721"}}}}},"decompress-response":{"files":{"index.js":{"size":628,"offset":"25776669"},"license":{"size":1120,"offset":"25777297"},"package.json":{"size":849,"offset":"25778417"}}},"defer-to-connect":{"files":{"LICENSE":{"size":1071,"offset":"25788652"},"package.json":{"size":922,"offset":"25789723"},"dist":{"files":{"index.js":{"size":1470,"offset":"25790645"}}}}},"dmg-builder":{"files":{"package.json":{"size":845,"offset":"25800088"},"vendor":{"files":{"mac_alias":{"files":{"__init__.py":{"size":1134,"offset":"25800933"},"alias.py":{"size":22244,"offset":"25802067"},"bookmark.py":{"size":24805,"offset":"25824311"},"osx.py":{"size":28957,"offset":"25849116"},"utils.py":{"size":449,"offset":"25878073"}}},"ds_store":{"files":{"__init__.py":{"size":80,"offset":"25878522"},"buddy.py":{"size":14412,"offset":"25878602"},"store.py":{"size":45209,"offset":"25893014"}}},"dmgbuild":{"files":{"__init__.py":{"size":52,"offset":"25938223"},"badge.py":{"size":6206,"offset":"25938275"},"colors.py":{"size":13054,"offset":"25944481"},"core.py":{"size":20688,"offset":"25957535"},"resources.py":{"size":12391,"offset":"25978223"}}},"biplist":{"files":{"__init__.py":{"size":32655,"offset":"25990614"}}},"Mac":{"files":{"Finder":{"files":{"DSStore.pm":{"size":19861,"offset":"26023269"},"DSStore":{"files":{"BuddyAllocator.pm":{"size":20296,"offset":"26043130"},"Format.pod":{"size":17862,"offset":"26063426"}}}}}}}}},"templates":{"files":{"background.tiff":{"size":37298,"offset":"26081288"},"dmgProperties.pl":{"size":2119,"offset":"26118586"},"settings.py":{"size":7628,"offset":"26120705"}}},"out":{"files":{"dmg.js":{"size":16291,"offset":"26128333"},"dmg.js.map":{"size":24426,"offset":"26144624"},"dmgLicense.js":{"size":7085,"offset":"26169050"},"dmgLicense.js.map":{"size":12737,"offset":"26176135"},"dmgUtil.js":{"size":6005,"offset":"26188872"},"dmgUtil.js.map":{"size":6708,"offset":"26194877"},"licenseButtons.js":{"size":6997,"offset":"26201585"},"licenseButtons.js.map":{"size":10068,"offset":"26208582"},"licenseDefaultButtons.js":{"size":10143,"offset":"26218650"},"licenseDefaultButtons.js.map":{"size":12168,"offset":"26228793"}}}}},"dot-prop":{"files":{"index.js":{"size":2150,"offset":"26240961"},"license":{"size":1119,"offset":"26243111"},"package.json":{"size":670,"offset":"26244230"}}},"duplexer3":{"files":{"LICENSE.md":{"size":1535,"offset":"26265146"},"index.js":{"size":1667,"offset":"26266681"},"package.json":{"size":556,"offset":"26268348"}}},"ecc-jsbn":{"files":{"LICENSE":{"size":1080,"offset":"26268904","executable":true},"index.js":{"size":1832,"offset":"26269984","executable":true},"package.json":{"size":731,"offset":"26271816","executable":true},"lib":{"files":{"LICENSE-jsbn":{"size":1544,"offset":"26272547","executable":true},"ec.js":{"size":15318,"offset":"26274091","executable":true},"sec.js":{"size":6100,"offset":"26289409","executable":true}}}}},"electron":{"unpacked":true,"files":{"LICENSE":{"size":1060,"unpacked":true},"cli.js":{"size":481,"unpacked":true},"index.js":{"size":591,"unpacked":true},"install.js":{"size":1821,"unpacked":true},"package.json":{"size":792,"unpacked":true},"path.txt":{"size":8,"unpacked":true},"dist":{"unpacked":true,"files":{"LICENSE":{"size":1060,"unpacked":true},"LICENSES.chromium.html":{"size":1993542,"unpacked":true},"chrome_100_percent.pak":{"size":167930,"unpacked":true},"chrome_200_percent.pak":{"size":250097,"unpacked":true},"electron":{"size":70874444,"unpacked":true},"icudtl.dat":{"size":10221472,"unpacked":true},"libEGL.so":{"size":157392,"unpacked":true},"libGLESv2.so":{"size":3908972,"unpacked":true},"libffmpeg.so":{"size":1990576,"unpacked":true},"natives_blob.bin":{"size":125011,"unpacked":true},"resources.pak":{"size":8691077,"unpacked":true},"snapshot_blob.bin":{"size":1451380,"unpacked":true},"v8_context_snapshot.bin":{"size":1758820,"unpacked":true},"version":{"size":6,"unpacked":true},"resources":{"unpacked":true,"files":{"default_app.asar":{"size":103215,"unpacked":true},"electron.asar":{"size":282027,"unpacked":true}}},"locales":{"unpacked":true,"files":{"am.pak":{"size":98876,"unpacked":true},"ar.pak":{"size":98355,"unpacked":true},"bg.pak":{"size":107785,"unpacked":true},"bn.pak":{"size":141700,"unpacked":true},"ca.pak":{"size":69684,"unpacked":true},"cs.pak":{"size":71286,"unpacked":true},"da.pak":{"size":64495,"unpacked":true},"de.pak":{"size":69605,"unpacked":true},"el.pak":{"size":120868,"unpacked":true},"en-GB.pak":{"size":57794,"unpacked":true},"en-US.pak":{"size":58454,"unpacked":true},"es-419.pak":{"size":67734,"unpacked":true},"es.pak":{"size":69955,"unpacked":true},"et.pak":{"size":62126,"unpacked":true},"fa.pak":{"size":96162,"unpacked":true},"fi.pak":{"size":64094,"unpacked":true},"fil.pak":{"size":70638,"unpacked":true},"fr.pak":{"size":74894,"unpacked":true},"gu.pak":{"size":135091,"unpacked":true},"he.pak":{"size":82975,"unpacked":true},"hi.pak":{"size":136889,"unpacked":true},"hr.pak":{"size":67509,"unpacked":true},"hu.pak":{"size":71474,"unpacked":true},"id.pak":{"size":61832,"unpacked":true},"it.pak":{"size":67793,"unpacked":true},"ja.pak":{"size":82838,"unpacked":true},"kn.pak":{"size":154435,"unpacked":true},"ko.pak":{"size":68861,"unpacked":true},"lt.pak":{"size":73118,"unpacked":true},"lv.pak":{"size":72479,"unpacked":true},"ml.pak":{"size":166093,"unpacked":true},"mr.pak":{"size":137059,"unpacked":true},"ms.pak":{"size":63213,"unpacked":true},"nb.pak":{"size":62979,"unpacked":true},"nl.pak":{"size":66206,"unpacked":true},"pl.pak":{"size":70634,"unpacked":true},"pt-BR.pak":{"size":67568,"unpacked":true},"pt-PT.pak":{"size":67627,"unpacked":true},"ro.pak":{"size":70283,"unpacked":true},"ru.pak":{"size":107818,"unpacked":true},"sk.pak":{"size":72272,"unpacked":true},"sl.pak":{"size":68269,"unpacked":true},"sr.pak":{"size":103605,"unpacked":true},"sv.pak":{"size":62673,"unpacked":true},"sw.pak":{"size":63799,"unpacked":true},"ta.pak":{"size":158794,"unpacked":true},"te.pak":{"size":148480,"unpacked":true},"th.pak":{"size":127156,"unpacked":true},"tr.pak":{"size":66469,"unpacked":true},"uk.pak":{"size":110298,"unpacked":true},"vi.pak":{"size":76839,"unpacked":true},"zh-CN.pak":{"size":57750,"unpacked":true},"zh-TW.pak":{"size":57857,"unpacked":true}}}}}}},"electron-builder":{"files":{"package.json":{"size":1239,"offset":"26414513"},"out":{"files":{"builder.js":{"size":10910,"offset":"26415752"},"builder.js.map":{"size":20801,"offset":"26426662"},"index.js":{"size":2604,"offset":"26447463"},"index.js.map":{"size":1735,"offset":"26450067"},"cli":{"files":{"cli.js":{"size":5936,"offset":"26451802","executable":true},"cli.js.map":{"size":6675,"offset":"26457738"},"create-self-signed-cert.js":{"size":4035,"offset":"26464413"},"create-self-signed-cert.js.map":{"size":4104,"offset":"26468448"},"install-app-deps.js":{"size":4826,"offset":"26472552","executable":true},"install-app-deps.js.map":{"size":4863,"offset":"26477378"},"start.js":{"size":542,"offset":"26482241"},"start.js.map":{"size":295,"offset":"26482783"}}}}}}},"electron-download":{"files":{"CODE_OF_CONDUCT.md":{"size":236,"offset":"26483078"},"LICENSE":{"size":1517,"offset":"26483314"},"collaborators.md":{"size":455,"offset":"26484831"},"package.json":{"size":1111,"offset":"26485286"},"lib":{"files":{"arch.js":{"size":723,"offset":"26486397"},"cli.js":{"size":333,"offset":"26487120","executable":true},"index.js":{"size":9364,"offset":"26487453"}}},"node_modules":{"files":{"fs-extra":{"files":{"LICENSE":{"size":1084,"offset":"33953630"},"package.json":{"size":1004,"offset":"33954714"},"lib":{"files":{"index.js":{"size":523,"offset":"33955718"},"util":{"files":{"assign.js":{"size":286,"offset":"33956241"},"buffer.js":{"size":263,"offset":"33956527"},"utimes.js":{"size":2200,"offset":"33956790"}}},"remove":{"files":{"index.js":{"size":165,"offset":"33958990"},"rimraf.js":{"size":7600,"offset":"33959155"}}},"path-exists":{"files":{"index.js":{"size":263,"offset":"33966755"}}},"output":{"files":{"index.js":{"size":966,"offset":"33967018"}}},"move-sync":{"files":{"index.js":{"size":3014,"offset":"33967984"}}},"move":{"files":{"index.js":{"size":4537,"offset":"33970998"}}},"mkdirs":{"files":{"index.js":{"size":312,"offset":"33975535"},"mkdirs-sync.js":{"size":1324,"offset":"33975847"},"mkdirs.js":{"size":1636,"offset":"33977171"},"win32.js":{"size":517,"offset":"33978807"}}},"json":{"files":{"index.js":{"size":509,"offset":"33979324"},"jsonfile.js":{"size":291,"offset":"33979833"},"output-json-sync.js":{"size":375,"offset":"33980124"},"output-json.js":{"size":657,"offset":"33980499"}}},"fs":{"files":{"index.js":{"size":2780,"offset":"33981156"}}},"ensure":{"files":{"file.js":{"size":1105,"offset":"33983936"},"index.js":{"size":623,"offset":"33985041"},"link.js":{"size":1580,"offset":"33985664"},"symlink-paths.js":{"size":3410,"offset":"33987244"},"symlink-type.js":{"size":698,"offset":"33990654"},"symlink.js":{"size":2174,"offset":"33991352"}}},"empty":{"files":{"index.js":{"size":983,"offset":"33993526"}}},"copy-sync":{"files":{"copy-file-sync.js":{"size":982,"offset":"33994509"},"copy-sync.js":{"size":2387,"offset":"33995491"},"index.js":{"size":56,"offset":"33997878"}}},"copy":{"files":{"copy.js":{"size":1657,"offset":"33997934"},"index.js":{"size":97,"offset":"33999591"},"ncp.js":{"size":6117,"offset":"33999688"}}}}},"docs":{"files":{"copy-sync.md":{"size":1461,"offset":"34005805"},"copy.md":{"size":1993,"offset":"34007266"},"emptyDir-sync.md":{"size":393,"offset":"34009259"},"emptyDir.md":{"size":625,"offset":"34009652"},"ensureDir-sync.md":{"size":394,"offset":"34010277"},"ensureDir.md":{"size":580,"offset":"34010671"},"ensureFile-sync.md":{"size":480,"offset":"34011251"},"ensureFile.md":{"size":672,"offset":"34011731"},"ensureLink-sync.md":{"size":428,"offset":"34012403"},"ensureLink.md":{"size":636,"offset":"34012831"},"ensureSymlink-sync.md":{"size":468,"offset":"34013467"},"ensureSymlink.md":{"size":677,"offset":"34013935"},"fs-read-write.md":{"size":1381,"offset":"34014612"},"move-sync.md":{"size":511,"offset":"34015993"},"move.md":{"size":832,"offset":"34016504"},"outputFile-sync.md":{"size":729,"offset":"34017336"},"outputFile.md":{"size":1026,"offset":"34018065"},"outputJson-sync.md":{"size":1077,"offset":"34019091"},"outputJson.md":{"size":1362,"offset":"34020168"},"pathExists-sync.md":{"size":174,"offset":"34021530"},"pathExists.md":{"size":643,"offset":"34021704"},"readJson-sync.md":{"size":797,"offset":"34022347"},"readJson.md":{"size":1210,"offset":"34023144"},"remove-sync.md":{"size":299,"offset":"34024354"},"remove.md":{"size":603,"offset":"34024653"},"writeJson-sync.md":{"size":946,"offset":"34025256"},"writeJson.md":{"size":1191,"offset":"34026202"}}}}}}}}},"env-paths":{"files":{"index.js":{"size":1937,"offset":"26733992"},"license":{"size":1119,"offset":"26735929"},"package.json":{"size":586,"offset":"26737048"}}},"error-ex":{"files":{"LICENSE":{"size":1077,"offset":"26737634"},"index.js":{"size":2907,"offset":"26738711"},"package.json":{"size":834,"offset":"26741618"}}},"execa":{"files":{"index.js":{"size":6788,"offset":"27043802"},"license":{"size":1109,"offset":"27050590"},"package.json":{"size":1067,"offset":"27051699"},"lib":{"files":{"errname.js":{"size":976,"offset":"27052766"},"stdio.js":{"size":891,"offset":"27053742"}}},"node_modules":{"files":{"cross-spawn":{"files":{"LICENSE":{"size":1056,"offset":"34056471"},"index.js":{"size":1645,"offset":"34057527"},"package.json":{"size":883,"offset":"34059172"},"lib":{"files":{"enoent.js":{"size":1944,"offset":"34060055"},"parse.js":{"size":3889,"offset":"34061999"},"util":{"files":{"escapeArgument.js":{"size":875,"offset":"34065888"},"escapeCommand.js":{"size":391,"offset":"34066763"},"hasEmptyArgumentBug.js":{"size":431,"offset":"34067154"},"readShebang.js":{"size":894,"offset":"34067585"},"resolveCommand.js":{"size":805,"offset":"34068479"}}}}}}}}}}},"extend":{"files":{".editorconfig":{"size":286,"offset":"27054633"},".jscs.json":{"size":4096,"offset":"27054919"},"LICENSE":{"size":1081,"offset":"27059015"},"component.json":{"size":581,"offset":"27060096"},"index.js":{"size":3321,"offset":"27060677"},"package.json":{"size":651,"offset":"27063998"}}},"extract-zip":{"files":{"CONTRIBUTING.md":{"size":282,"offset":"27064649"},"LICENSE":{"size":1314,"offset":"27064931"},"cli.js":{"size":399,"offset":"27066245","executable":true},"index.js":{"size":6275,"offset":"27066644"},"package.json":{"size":743,"offset":"27072919"},"node_modules":{"files":{"debug":{"files":{"LICENSE":{"size":1107,"offset":"34069284"},"Makefile":{"size":1059,"offset":"34070391"},"component.json":{"size":321,"offset":"34071450"},"node.js":{"size":40,"offset":"34071771"},"package.json":{"size":1063,"offset":"34071811"},"src":{"files":{"browser.js":{"size":4734,"offset":"34072874"},"debug.js":{"size":4394,"offset":"34077608"},"index.js":{"size":263,"offset":"34082002"},"inspector-log.js":{"size":373,"offset":"34082265"},"node.js":{"size":6015,"offset":"34082638"}}}}},"ms":{"files":{"index.js":{"size":2764,"offset":"34088653"},"license.md":{"size":1077,"offset":"34091417"},"package.json":{"size":606,"offset":"34092494"}}}}}}},"fd-slicer":{"files":{"LICENSE":{"size":1057,"offset":"27116645"},"index.js":{"size":7756,"offset":"27117702"},"package.json":{"size":693,"offset":"27125458"}}},"find-up":{"files":{"index.js":{"size":951,"offset":"27126151"},"license":{"size":1119,"offset":"27127102"},"package.json":{"size":682,"offset":"27128221"},"node_modules":{"files":{"path-exists":{"files":{"index.js":{"size":466,"offset":"34093100"},"license":{"size":1119,"offset":"34093566"},"package.json":{"size":617,"offset":"34094685"}}}}}}},"forever-agent":{"files":{"LICENSE":{"size":9140,"offset":"27128903"},"index.js":{"size":4176,"offset":"27138043"},"package.json":{"size":666,"offset":"27142219"}}},"form-data":{"files":{"License":{"size":1118,"offset":"27142885"},"README.md.bak":{"size":7138,"offset":"27144003"},"package.json":{"size":1323,"offset":"27151141"},"lib":{"files":{"browser.js":{"size":101,"offset":"27152464"},"form_data.js":{"size":12249,"offset":"27152565"},"populate.js":{"size":177,"offset":"27164814"}}}}},"get-caller-file":{"files":{"LICENSE.md":{"size":745,"offset":"27235014"},"index.js":{"size":1108,"offset":"27235759"},"index.js.map":{"size":773,"offset":"27236867"},"package.json":{"size":1124,"offset":"27237640"}}},"get-stream":{"files":{"buffer-stream.js":{"size":847,"offset":"27240049"},"index.js":{"size":1253,"offset":"27240896"},"license":{"size":1119,"offset":"27242149"},"package.json":{"size":626,"offset":"27243268"}}},"getpass":{"files":{"LICENSE":{"size":1067,"offset":"27243894"},"package.json":{"size":462,"offset":"27244961"},"lib":{"files":{"index.js":{"size":3260,"offset":"27245423"}}}}},"global-dirs":{"files":{"index.js":{"size":2404,"offset":"27288132"},"license":{"size":1109,"offset":"27290536"},"package.json":{"size":663,"offset":"27291645"}}},"got":{"files":{"license":{"size":1109,"offset":"27292308"},"package.json":{"size":1260,"offset":"27293417"},"source":{"files":{"as-promise.js":{"size":2878,"offset":"27294677"},"as-stream.js":{"size":2310,"offset":"27297555"},"create.js":{"size":2106,"offset":"27299865"},"errors.js":{"size":2842,"offset":"27301971"},"get-response.js":{"size":935,"offset":"27304813"},"index.js":{"size":939,"offset":"27305748"},"known-hook-events.js":{"size":132,"offset":"27306687"},"merge.js":{"size":1858,"offset":"27306819"},"normalize-arguments.js":{"size":7549,"offset":"27308677"},"progress.js":{"size":2324,"offset":"27316226"},"request-as-event-emitter.js":{"size":8856,"offset":"27318550"},"utils":{"files":{"deep-freeze.js":{"size":276,"offset":"27327406"},"get-body-size.js":{"size":644,"offset":"27327682"},"is-form-data.js":{"size":134,"offset":"27328326"},"timed-out.js":{"size":4421,"offset":"27328460"},"url-to-options.js":{"size":588,"offset":"27332881"}}}}},"node_modules":{"files":{"get-stream":{"files":{"buffer-stream.js":{"size":841,"offset":"34095302"},"index.js":{"size":1251,"offset":"34096143"},"license":{"size":1109,"offset":"34097394"},"package.json":{"size":672,"offset":"34098503"}}}}}}},"har-schema":{"files":{"LICENSE":{"size":755,"offset":"27356467"},"package.json":{"size":868,"offset":"27357222"},"lib":{"files":{"afterRequest.json":{"size":717,"offset":"27358090"},"beforeRequest.json":{"size":718,"offset":"27358807"},"browser.json":{"size":312,"offset":"27359525"},"cache.json":{"size":400,"offset":"27359837"},"content.json":{"size":459,"offset":"27360237"},"cookie.json":{"size":579,"offset":"27360696"},"creator.json":{"size":312,"offset":"27361275"},"entry.json":{"size":1031,"offset":"27361587"},"har.json":{"size":200,"offset":"27362618"},"header.json":{"size":307,"offset":"27362818"},"index.js":{"size":714,"offset":"27363125"},"log.json":{"size":591,"offset":"27363839"},"page.json":{"size":661,"offset":"27364430"},"pageTimings.json":{"size":311,"offset":"27365091"},"postData.json":{"size":737,"offset":"27365402"},"query.json":{"size":306,"offset":"27366139"},"request.json":{"size":954,"offset":"27366445"},"response.json":{"size":905,"offset":"27367399"},"timings.json":{"size":647,"offset":"27368304"}}}}},"har-validator":{"files":{"LICENSE":{"size":1093,"offset":"27368951"},"package.json":{"size":733,"offset":"27370044"},"lib":{"files":{"async.js":{"size":2180,"offset":"27370777"},"error.js":{"size":373,"offset":"27372957"},"promise.js":{"size":1941,"offset":"27373330"}}}}},"has-yarn":{"files":{"index.js":{"size":268,"offset":"27377258"},"license":{"size":1109,"offset":"27377526"},"package.json":{"size":607,"offset":"27378635"}}},"http-cache-semantics":{"files":{"LICENSE":{"size":1274,"offset":"27394247"},"index.js":{"size":23786,"offset":"27395521"},"package.json":{"size":811,"offset":"27419307"}}},"http-signature":{"files":{".dir-locals.el":{"size":178,"offset":"27420118"},"CHANGES.md":{"size":1350,"offset":"27420296"},"LICENSE":{"size":1067,"offset":"27421646"},"http_signing.md":{"size":13849,"offset":"27422713"},"package.json":{"size":644,"offset":"27436562"},"lib":{"files":{"index.js":{"size":626,"offset":"27437206"},"parser.js":{"size":9841,"offset":"27437832"},"signer.js":{"size":13013,"offset":"27447673"},"utils.js":{"size":2839,"offset":"27460686"},"verify.js":{"size":3088,"offset":"27463525"}}}}},"iconv-lite":{"files":{"Changelog.md":{"size":4342,"offset":"27466613"},"LICENSE":{"size":1064,"offset":"27470955"},"package.json":{"size":837,"offset":"27472019"},"lib":{"files":{"bom-handling.js":{"size":1109,"offset":"27472856"},"extend-node.js":{"size":8701,"offset":"27473965"},"index.js":{"size":5123,"offset":"27482666"},"streams.js":{"size":3387,"offset":"27487789"}}},"encodings":{"files":{"dbcs-codec.js":{"size":21415,"offset":"27491176"},"dbcs-data.js":{"size":8291,"offset":"27512591"},"index.js":{"size":710,"offset":"27520882"},"internal.js":{"size":6115,"offset":"27521592"},"sbcs-codec.js":{"size":2191,"offset":"27527707"},"sbcs-data-generated.js":{"size":32034,"offset":"27529898"},"sbcs-data.js":{"size":4686,"offset":"27561932"},"utf16.js":{"size":5011,"offset":"27566618"},"utf7.js":{"size":9215,"offset":"27571629"},"tables":{"files":{"big5-added.json":{"size":17717,"offset":"27580844"},"cp936.json":{"size":47320,"offset":"27598561"},"cp949.json":{"size":38122,"offset":"27645881"},"cp950.json":{"size":42356,"offset":"27684003"},"eucjp.json":{"size":41064,"offset":"27726359"},"gb18030-ranges.json":{"size":2216,"offset":"27767423"},"gbk-added.json":{"size":1227,"offset":"27769639"},"shiftjis.json":{"size":23782,"offset":"27770866"}}}}}}},"import-lazy":{"files":{"index.js":{"size":976,"offset":"27794648"},"license":{"size":1119,"offset":"27795624"},"package.json":{"size":555,"offset":"27796743"}}},"imurmurhash":{"files":{"imurmurhash.js":{"size":4412,"offset":"27797298"},"imurmurhash.min.js":{"size":1894,"offset":"27801710"},"package.json":{"size":662,"offset":"27803604"}}},"indent-string":{"files":{"index.js":{"size":485,"offset":"27804266"},"license":{"size":1119,"offset":"27804751"},"package.json":{"size":611,"offset":"27805870"}}},"is-arrayish":{"files":{".editorconfig":{"size":264,"offset":"27817577"},".istanbul.yml":{"size":59,"offset":"27817841"},"LICENSE":{"size":1077,"offset":"27817900"},"index.js":{"size":204,"offset":"27818977"},"package.json":{"size":583,"offset":"27819181"}}},"is-finite":{"files":{"index.js":{"size":175,"offset":"27821645"},"license":{"size":1109,"offset":"27821820"},"package.json":{"size":613,"offset":"27822929"}}},"is-fullwidth-code-point":{"files":{"index.js":{"size":1463,"offset":"27823542"},"license":{"size":1119,"offset":"27825005"},"package.json":{"size":727,"offset":"27826124"}}},"is-installed-globally":{"files":{"index.js":{"size":226,"offset":"27826851"},"license":{"size":1109,"offset":"27827077"},"package.json":{"size":716,"offset":"27828186"}}},"is-npm":{"files":{"index.js":{"size":269,"offset":"27828902"},"license":{"size":1109,"offset":"27829171"},"package.json":{"size":621,"offset":"27830280"}}},"is-path-inside":{"files":{"index.js":{"size":236,"offset":"27832710"},"license":{"size":1119,"offset":"27832946"},"package.json":{"size":642,"offset":"27834065"}}},"is-stream":{"files":{"index.js":{"size":800,"offset":"27834707"},"license":{"size":1119,"offset":"27835507"},"package.json":{"size":597,"offset":"27836626"}}},"is-typedarray":{"files":{"LICENSE.md":{"size":1073,"offset":"27837223"},"index.js":{"size":1016,"offset":"27838296"},"package.json":{"size":528,"offset":"27839312"}}},"is-utf8":{"files":{"LICENSE":{"size":1083,"offset":"27839840"},"is-utf8.js":{"size":2508,"offset":"27840923"},"package.json":{"size":401,"offset":"27843431"}}},"is-yarn-global":{"files":{"LICENSE":{"size":1065,"offset":"27843832"},"index.js":{"size":309,"offset":"27844897"},"package.json":{"size":494,"offset":"27845206"}}},"isarray":{"files":{"component.json":{"size":470,"offset":"27845700"},"index.js":{"size":120,"offset":"27846170"},"package.json":{"size":505,"offset":"27846290"},"build":{"files":{"build.js":{"size":4089,"offset":"27846795"}}}}},"isstream":{"files":{"LICENSE.md":{"size":1125,"offset":"27862716"},"isstream.js":{"size":588,"offset":"27863841"},"package.json":{"size":551,"offset":"27864429"}}},"json-buffer":{"files":{"LICENSE":{"size":1071,"offset":"28174038"},"index.js":{"size":1503,"offset":"28175109"},"package.json":{"size":865,"offset":"28176612"}}},"json-schema":{"files":{"draft-zyp-json-schema-03.xml":{"size":51283,"offset":"28177477"},"draft-zyp-json-schema-04.xml":{"size":48288,"offset":"28228760"},"package.json":{"size":798,"offset":"28277048"},"lib":{"files":{"links.js":{"size":2195,"offset":"28277846"},"validate.js":{"size":10939,"offset":"28280041"}}},"draft-04":{"files":{"hyper-schema":{"size":996,"offset":"28290980"},"links":{"size":730,"offset":"28291976"},"schema":{"size":3111,"offset":"28292706"}}},"draft-03":{"files":{"hyper-schema":{"size":1002,"offset":"28295817"},"json-ref":{"size":445,"offset":"28296819"},"links":{"size":720,"offset":"28297264"},"schema":{"size":2873,"offset":"28297984"},"examples":{"files":{"address":{"size":692,"offset":"28300857"},"calendar":{"size":998,"offset":"28301549"},"card":{"size":2270,"offset":"28302547"},"geo":{"size":173,"offset":"28304817"},"interfaces":{"size":868,"offset":"28304990"}}}}},"draft-02":{"files":{"hyper-schema":{"size":1202,"offset":"28305858"},"json-ref":{"size":435,"offset":"28307060"},"links":{"size":692,"offset":"28307495"},"schema":{"size":2889,"offset":"28308187"}}},"draft-01":{"files":{"hyper-schema":{"size":1198,"offset":"28311076"},"json-ref":{"size":435,"offset":"28312274"},"links":{"size":608,"offset":"28312709"},"schema":{"size":2661,"offset":"28313317"}}},"draft-00":{"files":{"hyper-schema":{"size":1198,"offset":"28315978"},"json-ref":{"size":435,"offset":"28317176"},"links":{"size":608,"offset":"28317611"},"schema":{"size":2661,"offset":"28318219"}}}}},"json-stringify-safe":{"files":{"LICENSE":{"size":765,"offset":"28337232"},"Makefile":{"size":675,"offset":"28337997"},"package.json":{"size":597,"offset":"28338672"},"stringify.js":{"size":907,"offset":"28339269"}}},"jsprim":{"files":{"CHANGES.md":{"size":1016,"offset":"28559174"},"CONTRIBUTING.md":{"size":770,"offset":"28560190"},"LICENSE":{"size":1077,"offset":"28560960"},"package.json":{"size":504,"offset":"28562037"},"lib":{"files":{"jsprim.js":{"size":17071,"offset":"28562541"}}}}},"keyv":{"files":{"LICENSE":{"size":1068,"offset":"28579612"},"package.json":{"size":883,"offset":"28580680"},"src":{"files":{"index.js":{"size":2295,"offset":"28581563"}}}}},"kiwibridge":{"files":{"package.json":{"size":399,"offset":"28583858"},"plugin.xml":{"size":6350,"offset":"28584257"},"www":{"files":{"AppManager.js":{"size":949,"offset":"28590607"},"ControlManager.js":{"size":1037,"offset":"28591556"},"DriveManager.js":{"size":515,"offset":"28592593"},"FileTransferManager.js":{"size":580,"offset":"28593108"},"FirmwareManager.js":{"size":1369,"offset":"28593688"},"MemoryManager.js":{"size":511,"offset":"28595057"},"NetworkManager.js":{"size":535,"offset":"28595568"},"PowerManager.js":{"size":1143,"offset":"28596103"},"ScreenManager.js":{"size":1041,"offset":"28597246"},"SensorManager.js":{"size":525,"offset":"28598287"},"SoundManager.js":{"size":825,"offset":"28598812"},"TimeManager.js":{"size":503,"offset":"28599637"}}},"src":{"files":{"android":{"files":{"bridge":{"files":{"AppManager.java":{"size":1154,"offset":"28600140"},"ControlLock.java":{"size":1309,"offset":"28601294"},"ControlManager.java":{"size":1349,"offset":"28602603"},"DriveManager.java":{"size":844,"offset":"28603952"},"DriveUnit.java":{"size":1015,"offset":"28604796"},"ErrorBridge.java":{"size":8602,"offset":"28605811"},"ErrorObject.java":{"size":963,"offset":"28614413"},"FileTransferError.java":{"size":723,"offset":"28615376"},"FileTransferManager.java":{"size":928,"offset":"28616099"},"FileTransferRequest.java":{"size":1118,"offset":"28617027"},"FirmwareManager.java":{"size":1490,"offset":"28618145"},"KiwiBridge.java":{"size":4213,"offset":"28619635"},"MemoryInfo.java":{"size":840,"offset":"28623848"},"MemoryManager.java":{"size":838,"offset":"28624688"},"NetworkConnection.java":{"size":880,"offset":"28625526"},"NetworkManager.java":{"size":860,"offset":"28626406"},"Orientation.java":{"size":687,"offset":"28627266"},"PowerManager.java":{"size":1579,"offset":"28627953"},"PowerTimer.java":{"size":1328,"offset":"28629532"},"Release.java":{"size":522,"offset":"28630860"},"ScreenManager.java":{"size":1279,"offset":"28631382"},"SensorManager.java":{"size":852,"offset":"28632661"},"SoundManager.java":{"size":1068,"offset":"28633513"},"TimeManager.java":{"size":834,"offset":"28634581"}}}}}}}}},"latest-version":{"files":{"index.js":{"size":334,"offset":"28635415"},"license":{"size":1109,"offset":"28635749"},"package.json":{"size":741,"offset":"28636858"}}},"load-json-file":{"files":{"index.js":{"size":541,"offset":"28639866"},"license":{"size":1119,"offset":"28640407"},"package.json":{"size":736,"offset":"28641526"},"node_modules":{"files":{"strip-bom":{"files":{"index.js":{"size":407,"offset":"34099175"},"license":{"size":1119,"offset":"34099582"},"package.json":{"size":623,"offset":"34100701"}}}}}}},"locate-path":{"files":{"index.js":{"size":539,"offset":"28642262"},"license":{"size":1109,"offset":"28642801"},"package.json":{"size":669,"offset":"28643910"}}},"loud-rejection":{"files":{"api.js":{"size":358,"offset":"28644579"},"index.js":{"size":682,"offset":"28644937"},"license":{"size":1119,"offset":"28645619"},"package.json":{"size":900,"offset":"28646738"},"register.js":{"size":31,"offset":"28647638"}}},"lru-cache":{"files":{"LICENSE":{"size":765,"offset":"28649560"},"index.js":{"size":10689,"offset":"28650325"},"package.json":{"size":643,"offset":"28661014"}}},"make-dir":{"files":{"index.js":{"size":1839,"offset":"28661657"},"license":{"size":1109,"offset":"28663496"},"package.json":{"size":765,"offset":"28664605"},"node_modules":{"files":{"pify":{"files":{"index.js":{"size":1808,"offset":"34101324"},"license":{"size":1109,"offset":"34103132"},"package.json":{"size":608,"offset":"34104241"}}}}}}},"meow":{"files":{"index.js":{"size":2057,"offset":"28667289"},"license":{"size":1119,"offset":"28669346"},"package.json":{"size":908,"offset":"28670465"}}},"mkdirp":{"files":{"LICENSE":{"size":1141,"offset":"28954696"},"index.js":{"size":2644,"offset":"28955837"},"package.json":{"size":703,"offset":"28958481"},"bin":{"files":{"cmd.js":{"size":731,"offset":"28959184","executable":true},"usage.txt":{"size":315,"offset":"28959915"}}}}},"normalize-url":{"files":{"index.js":{"size":6040,"offset":"29001584"},"license":{"size":1109,"offset":"29007624"},"package.json":{"size":654,"offset":"29008733"}}},"npm-run-path":{"files":{"index.js":{"size":766,"offset":"29009387"},"license":{"size":1119,"offset":"29010153"},"package.json":{"size":642,"offset":"29011272"}}},"nugget":{"files":{"bin.js":{"size":763,"offset":"29011914","executable":true},"collaborators.md":{"size":544,"offset":"29012677"},"index.js":{"size":5762,"offset":"29013221"},"multiple.png":{"size":29002,"offset":"29018983"},"package.json":{"size":825,"offset":"29047985"},"usage.txt":{"size":327,"offset":"29048810"},"node_modules":{"files":{"debug":{"files":{"LICENSE":{"size":1107,"offset":"34104849"},"Makefile":{"size":1059,"offset":"34105956"},"component.json":{"size":321,"offset":"34107015"},"node.js":{"size":40,"offset":"34107336"},"package.json":{"size":1063,"offset":"34107376"},"src":{"files":{"browser.js":{"size":4734,"offset":"34108439"},"debug.js":{"size":4394,"offset":"34113173"},"index.js":{"size":263,"offset":"34117567"},"inspector-log.js":{"size":373,"offset":"34117830"},"node.js":{"size":6015,"offset":"34118203"}}}}},"ms":{"files":{"index.js":{"size":2764,"offset":"34124218"},"license.md":{"size":1077,"offset":"34126982"},"package.json":{"size":606,"offset":"34128059"}}}}}}},"number-is-nan":{"files":{"index.js":{"size":82,"offset":"29049137"},"license":{"size":1119,"offset":"29049219"},"package.json":{"size":560,"offset":"29050338"}}},"oauth-sign":{"files":{"LICENSE":{"size":9140,"offset":"29050898"},"index.js":{"size":3926,"offset":"29060038"},"package.json":{"size":639,"offset":"29063964"}}},"object-assign":{"files":{"index.js":{"size":2108,"offset":"29064603"},"license":{"size":1119,"offset":"29066711"},"package.json":{"size":639,"offset":"29067830"}}},"p-cancelable":{"files":{"index.js":{"size":1927,"offset":"29084438"},"license":{"size":1109,"offset":"29086365"},"package.json":{"size":696,"offset":"29087474"}}},"p-finally":{"files":{"index.js":{"size":302,"offset":"29088170"},"license":{"size":1119,"offset":"29088472"},"package.json":{"size":616,"offset":"29089591"}}},"p-limit":{"files":{"index.js":{"size":1114,"offset":"29090207"},"license":{"size":1109,"offset":"29091321"},"package.json":{"size":859,"offset":"29092430"}}},"p-locate":{"files":{"index.js":{"size":1042,"offset":"29093289"},"license":{"size":1109,"offset":"29094331"},"package.json":{"size":726,"offset":"29095440"}}},"p-try":{"files":{"index.js":{"size":211,"offset":"29096166"},"license":{"size":1109,"offset":"29096377"},"package.json":{"size":588,"offset":"29097486"}}},"package-json":{"files":{"index.js":{"size":2789,"offset":"29098074"},"license":{"size":1109,"offset":"29100863"},"package.json":{"size":839,"offset":"29101972"},"node_modules":{"files":{"semver":{"files":{"LICENSE":{"size":765,"offset":"34128665"},"package.json":{"size":528,"offset":"34129430"},"range.bnf":{"size":619,"offset":"34129958"},"semver.js":{"size":42130,"offset":"34130577"},"bin":{"files":{"semver.js":{"size":4717,"offset":"34172707","executable":true}}}}}}}}},"parse-color":{"files":{"LICENSE":{"size":1073,"offset":"29102811"},"index.js":{"size":2596,"offset":"29103884"},"package.json":{"size":928,"offset":"29106480"},"node_modules":{"files":{"color-convert":{"files":{"LICENSE":{"size":1082,"offset":"34177424"},"component.json":{"size":286,"offset":"34178506"},"conversions.js":{"size":14605,"offset":"34178792"},"index.js":{"size":2323,"offset":"34193397"},"package.json":{"size":408,"offset":"34195720"}}}}}}},"parse-json":{"files":{"index.js":{"size":589,"offset":"29107408"},"license":{"size":1119,"offset":"29107997"},"package.json":{"size":639,"offset":"29109116"},"vendor":{"files":{"parse.js":{"size":18513,"offset":"29109755"},"unicode.js":{"size":11215,"offset":"29128268"}}}}},"path-is-inside":{"files":{"LICENSE.txt":{"size":1885,"offset":"29143723"},"package.json":{"size":593,"offset":"29145608"},"lib":{"files":{"path-is-inside.js":{"size":858,"offset":"29146201"}}}}},"path-type":{"files":{"index.js":{"size":841,"offset":"29153123"},"license":{"size":1119,"offset":"29153964"},"package.json":{"size":688,"offset":"29155083"}}},"pend":{"files":{"LICENSE":{"size":1082,"offset":"29155771"},"index.js":{"size":1101,"offset":"29156853"},"package.json":{"size":404,"offset":"29157954"}}},"performance-now":{"files":{".tm_properties":{"size":193,"offset":"29158358"},"license.txt":{"size":1052,"offset":"29158551"},"package.json":{"size":775,"offset":"29159603"},"src":{"files":{"performance-now.coffee":{"size":553,"offset":"29160378"}}},"lib":{"files":{"performance-now.js":{"size":1061,"offset":"29160931"},"performance-now.js.map":{"size":959,"offset":"29161992"}}}}},"prepend-http":{"files":{"index.js":{"size":387,"offset":"29618194"},"license":{"size":1109,"offset":"29618581"},"package.json":{"size":603,"offset":"29619690"}}},"pretty-bytes":{"files":{"cli.js":{"size":553,"offset":"29620293","executable":true},"license":{"size":1119,"offset":"29620846"},"package.json":{"size":762,"offset":"29621965"},"pretty-bytes.js":{"size":983,"offset":"29622727"}}},"process-nextick-args":{"files":{"index.js":{"size":1083,"offset":"29623710"},"license.md":{"size":1064,"offset":"29624793"},"package.json":{"size":466,"offset":"29625857"}}},"progress-stream":{"files":{"LICENSE":{"size":1312,"offset":"29626323"},"index.js":{"size":2736,"offset":"29627635"},"package.json":{"size":617,"offset":"29630371"}}},"properties-parser":{"files":{"README.markdown":{"size":3665,"offset":"29630988"},"index.js":{"size":10506,"offset":"29634653"},"package.json":{"size":616,"offset":"29645159"}}},"pseudomap":{"files":{"LICENSE":{"size":765,"offset":"29645775"},"map.js":{"size":280,"offset":"29646540"},"package.json":{"size":628,"offset":"29646820"},"pseudomap.js":{"size":2437,"offset":"29647448"}}},"psl":{"files":{"LICENSE":{"size":1101,"offset":"29649885"},"browserstack-logo.svg":{"size":7552,"offset":"29650986"},"index.js":{"size":6036,"offset":"29658538"},"package.json":{"size":977,"offset":"29664574"},"dist":{"files":{"psl.js":{"size":152266,"offset":"29665551"},"psl.min.js":{"size":127526,"offset":"29817817"}}},"data":{"files":{"rules.json":{"size":130383,"offset":"29945343"}}}}},"qs":{"files":{".editorconfig":{"size":399,"offset":"30205856"},".eslintignore":{"size":5,"offset":"30206255"},"LICENSE":{"size":1654,"offset":"30206260"},"package.json":{"size":786,"offset":"30207914"},"lib":{"files":{"formats.js":{"size":387,"offset":"30208700"},"index.js":{"size":211,"offset":"30209087"},"parse.js":{"size":5817,"offset":"30209298"},"stringify.js":{"size":6288,"offset":"30215115"},"utils.js":{"size":5554,"offset":"30221403"}}},"dist":{"files":{"qs.js":{"size":19393,"offset":"30226957"}}}}},"read-pkg":{"files":{"index.js":{"size":872,"offset":"30297133"},"license":{"size":1119,"offset":"30298005"},"package.json":{"size":677,"offset":"30299124"}}},"read-pkg-up":{"files":{"index.js":{"size":491,"offset":"30299801"},"license":{"size":1119,"offset":"30300292"},"package.json":{"size":648,"offset":"30301411"}}},"readable-stream":{"files":{"LICENSE":{"size":1096,"offset":"30302059"},"duplex.js":{"size":52,"offset":"30303155"},"float.patch":{"size":30691,"offset":"30303207"},"package.json":{"size":711,"offset":"30333898"},"passthrough.js":{"size":57,"offset":"30334609"},"readable.js":{"size":470,"offset":"30334666"},"transform.js":{"size":55,"offset":"30335136"},"writable.js":{"size":54,"offset":"30335191"},"lib":{"files":{"_stream_duplex.js":{"size":2811,"offset":"30335245"},"_stream_passthrough.js":{"size":1727,"offset":"30338056"},"_stream_readable.js":{"size":25959,"offset":"30339783"},"_stream_transform.js":{"size":7350,"offset":"30365742"},"_stream_writable.js":{"size":13069,"offset":"30373092"}}}}},"redent":{"files":{"index.js":{"size":222,"offset":"30386161"},"license":{"size":1119,"offset":"30386383"},"package.json":{"size":658,"offset":"30387502"}}},"registry-auth-token":{"files":{"LICENSE":{"size":1084,"offset":"30388160"},"base64.js":{"size":264,"offset":"30389244"},"index.js":{"size":3846,"offset":"30389508"},"package.json":{"size":752,"offset":"30393354"},"registry-url.js":{"size":231,"offset":"30394106"}}},"registry-url":{"files":{"index.js":{"size":398,"offset":"30394337"},"license":{"size":1109,"offset":"30394735"},"package.json":{"size":689,"offset":"30395844"}}},"repeating":{"files":{"index.js":{"size":401,"offset":"30396533"},"license":{"size":1119,"offset":"30396934"},"package.json":{"size":606,"offset":"30398053"}}},"request":{"files":{"LICENSE":{"size":9140,"offset":"30398659"},"index.js":{"size":3994,"offset":"30407799","executable":true},"package.json":{"size":1869,"offset":"30411793"},"request.js":{"size":44466,"offset":"30413662"},"lib":{"files":{"auth.js":{"size":4778,"offset":"30458128"},"cookies.js":{"size":974,"offset":"30462906"},"getProxyFromURI.js":{"size":2257,"offset":"30463880"},"har.js":{"size":4787,"offset":"30466137"},"hawk.js":{"size":2750,"offset":"30470924"},"helpers.js":{"size":1411,"offset":"30473674"},"multipart.js":{"size":2674,"offset":"30475085"},"oauth.js":{"size":4136,"offset":"30477759"},"querystring.js":{"size":1334,"offset":"30481895"},"redirect.js":{"size":4635,"offset":"30483229"},"tunnel.js":{"size":4416,"offset":"30487864"}}}}},"require-directory":{"files":{"LICENSE":{"size":1099,"offset":"30492280"},"README.markdown":{"size":5175,"offset":"30493379"},"index.js":{"size":2867,"offset":"30498554"},"package.json":{"size":695,"offset":"30501421"}}},"require-main-filename":{"files":{"LICENSE.txt":{"size":731,"offset":"30502116"},"index.js":{"size":427,"offset":"30502847"},"package.json":{"size":643,"offset":"30503274"}}},"responselike":{"files":{"LICENSE":{"size":1055,"offset":"30529032"},"package.json":{"size":671,"offset":"30530087"},"src":{"files":{"index.js":{"size":823,"offset":"30530758"}}}}},"semver-diff":{"files":{"index.js":{"size":464,"offset":"30685222"},"license":{"size":1119,"offset":"30685686"},"package.json":{"size":644,"offset":"30686805"}}},"set-blocking":{"files":{"LICENSE.txt":{"size":731,"offset":"30687449"},"index.js":{"size":252,"offset":"30688180"},"package.json":{"size":680,"offset":"30688432"}}},"single-line-log":{"files":{"LICENSE":{"size":1097,"offset":"30767596"},"index.js":{"size":1303,"offset":"30768693"},"package.json":{"size":554,"offset":"30769996"}}},"speedometer":{"files":{"LICENSE":{"size":1052,"offset":"31652362"},"index.js":{"size":857,"offset":"31653414"},"package.json":{"size":385,"offset":"31654271"}}},"sshpk":{"files":{"LICENSE":{"size":1067,"offset":"31680816"},"package.json":{"size":1404,"offset":"31681883"},"man":{"files":{"man1":{"files":{"sshpk-conv.1":{"size":3989,"offset":"31683287"},"sshpk-sign.1":{"size":2480,"offset":"31687276"},"sshpk-verify.1":{"size":2210,"offset":"31689756"}}}}},"lib":{"files":{"algs.js":{"size":4866,"offset":"31691966"},"certificate.js":{"size":11600,"offset":"31696832"},"dhe.js":{"size":10600,"offset":"31708432"},"ed-compat.js":{"size":2335,"offset":"31719032"},"errors.js":{"size":2770,"offset":"31721367"},"fingerprint.js":{"size":5530,"offset":"31724137"},"identity.js":{"size":10036,"offset":"31729667"},"index.js":{"size":1278,"offset":"31739703"},"key.js":{"size":8117,"offset":"31740981"},"private-key.js":{"size":6719,"offset":"31749098"},"signature.js":{"size":7989,"offset":"31755817"},"ssh-buffer.js":{"size":3877,"offset":"31763806"},"utils.js":{"size":9831,"offset":"31767683"},"formats":{"files":{"auto.js":{"size":3434,"offset":"31777514"},"dnssec.js":{"size":9193,"offset":"31780948"},"openssh-cert.js":{"size":8752,"offset":"31790141"},"pem.js":{"size":7463,"offset":"31798893"},"pkcs1.js":{"size":9022,"offset":"31806356"},"pkcs8.js":{"size":14539,"offset":"31815378"},"putty.js":{"size":2335,"offset":"31829917"},"rfc4253.js":{"size":4240,"offset":"31832252"},"ssh-private.js":{"size":6934,"offset":"31836492"},"ssh.js":{"size":3199,"offset":"31843426"},"x509-pem.js":{"size":2049,"offset":"31846625"},"x509.js":{"size":19556,"offset":"31848674"}}}}},"bin":{"files":{"sshpk-conv":{"size":5738,"offset":"31868230","executable":true},"sshpk-sign":{"size":4011,"offset":"31873968","executable":true},"sshpk-verify":{"size":3553,"offset":"31877979","executable":true}}}}},"string-width":{"files":{"index.js":{"size":741,"offset":"31891940"},"license":{"size":1119,"offset":"31892681"},"package.json":{"size":745,"offset":"31893800"}}},"string.prototype.codepointat":{"files":{"LICENSE-MIT.txt":{"size":1077,"offset":"31894545"},"codepointat.js":{"size":1645,"offset":"31895622"},"package.json":{"size":580,"offset":"31897267"}}},"string_decoder":{"files":{"LICENSE":{"size":1076,"offset":"31897847"},"index.js":{"size":7796,"offset":"31898923"},"package.json":{"size":404,"offset":"31906719"}}},"strip-eof":{"files":{"index.js":{"size":315,"offset":"31911374"},"license":{"size":1119,"offset":"31911689"},"package.json":{"size":591,"offset":"31912808"}}},"strip-indent":{"files":{"cli.js":{"size":823,"offset":"31913399","executable":true},"index.js":{"size":320,"offset":"31914222"},"license":{"size":1119,"offset":"31914542"},"package.json":{"size":698,"offset":"31915661"}}},"sumchecker":{"files":{"LICENSE":{"size":11358,"offset":"31919808"},"NEWS.md":{"size":1250,"offset":"31931166"},"build.js":{"size":8641,"offset":"31932416"},"index.js":{"size":5122,"offset":"31941057"},"package.json":{"size":715,"offset":"31946179"},"node_modules":{"files":{"debug":{"files":{"LICENSE":{"size":1107,"offset":"34250994"},"Makefile":{"size":1059,"offset":"34252101"},"component.json":{"size":321,"offset":"34253160"},"node.js":{"size":40,"offset":"34253481"},"package.json":{"size":1063,"offset":"34253521"},"src":{"files":{"browser.js":{"size":4734,"offset":"34254584"},"debug.js":{"size":4394,"offset":"34259318"},"index.js":{"size":263,"offset":"34263712"},"inspector-log.js":{"size":373,"offset":"34263975"},"node.js":{"size":6015,"offset":"34264348"}}}}},"ms":{"files":{"index.js":{"size":2764,"offset":"34270363"},"license.md":{"size":1077,"offset":"34273127"},"package.json":{"size":606,"offset":"34274204"}}}}}}},"term-size":{"unpacked":true,"files":{"index.js":{"size":1769,"unpacked":true},"license":{"size":1119,"unpacked":true},"package.json":{"size":643,"unpacked":true},"vendor":{"files":{"macos":{"unpacked":true,"files":{"term-size":{"size":8760,"unpacked":true}}}}}}},"throttleit":{"files":{"History.md":{"size":153,"offset":"31968710"},"Makefile":{"size":166,"offset":"31968863"},"Readme.md":{"size":128,"offset":"31969029"},"component.json":{"size":235,"offset":"31969157"},"example.js":{"size":221,"offset":"31969392"},"index.js":{"size":750,"offset":"31969613"},"package.json":{"size":414,"offset":"31970363"}}},"through2":{"files":{"LICENSE":{"size":1811,"offset":"31970777"},"package.json":{"size":656,"offset":"31972588"},"through2.js":{"size":957,"offset":"31973244"}}},"to-readable-stream":{"files":{"index.js":{"size":160,"offset":"31974201"},"license":{"size":1109,"offset":"31974361"},"package.json":{"size":638,"offset":"31975470"}}},"tough-cookie":{"files":{"LICENSE":{"size":1485,"offset":"31976108"},"package.json":{"size":738,"offset":"31977593"},"lib":{"files":{"cookie.js":{"size":40917,"offset":"31978331"},"memstore.js":{"size":5827,"offset":"32019248"},"pathMatch.js":{"size":2435,"offset":"32025075"},"permuteDomain.js":{"size":2270,"offset":"32027510"},"pubsuffix-psl.js":{"size":1720,"offset":"32029780"},"store.js":{"size":2952,"offset":"32031500"},"version.js":{"size":52,"offset":"32034452"}}}}},"trim-newlines":{"files":{"index.js":{"size":216,"offset":"32034504"},"license":{"size":1119,"offset":"32034720"},"package.json":{"size":596,"offset":"32035839"}}},"tunnel-agent":{"files":{"LICENSE":{"size":9140,"offset":"32038535"},"index.js":{"size":6884,"offset":"32047675"},"package.json":{"size":679,"offset":"32054559"}}},"type-fest":{"files":{"license":{"size":1109,"offset":"32206053"},"package.json":{"size":745,"offset":"32207162"}}},"typedarray":{"files":{"LICENSE":{"size":1565,"offset":"32207907"},"index.js":{"size":21325,"offset":"32209472"},"package.json":{"size":847,"offset":"32230797"}}},"unique-string":{"files":{"index.js":{"size":122,"offset":"32839769"},"license":{"size":1119,"offset":"32839891"},"package.json":{"size":633,"offset":"32841010"}}},"update-notifier":{"files":{"check.js":{"size":779,"offset":"32844192"},"index.js":{"size":5113,"offset":"32844971"},"license":{"size":1254,"offset":"32850084"},"package.json":{"size":1097,"offset":"32851338"}}},"url-parse-lax":{"files":{"index.js":{"size":376,"offset":"33201415"},"license":{"size":1109,"offset":"33201791"},"package.json":{"size":651,"offset":"33202900"}}},"util-deprecate":{"files":{"History.md":{"size":282,"offset":"33205655"},"LICENSE":{"size":1102,"offset":"33205937"},"browser.js":{"size":1614,"offset":"33207039"},"node.js":{"size":123,"offset":"33208653"},"package.json":{"size":505,"offset":"33208776"}}},"uuid":{"files":{"AUTHORS":{"size":169,"offset":"33209281"},"LICENSE.md":{"size":1109,"offset":"33209450"},"index.js":{"size":120,"offset":"33210559"},"package.json":{"size":888,"offset":"33210679"},"v1.js":{"size":3331,"offset":"33211567"},"v3.js":{"size":106,"offset":"33214898"},"v4.js":{"size":680,"offset":"33215004"},"v5.js":{"size":109,"offset":"33215684"},"lib":{"files":{"bytesToUuid.js":{"size":775,"offset":"33215793"},"md5-browser.js":{"size":6824,"offset":"33216568"},"md5.js":{"size":576,"offset":"33223392"},"rng-browser.js":{"size":1312,"offset":"33223968"},"rng.js":{"size":246,"offset":"33225280"},"sha1-browser.js":{"size":2338,"offset":"33225526"},"sha1.js":{"size":579,"offset":"33227864"},"v35.js":{"size":1622,"offset":"33228443"}}},"bin":{"files":{"uuid":{"size":1579,"offset":"33230065","executable":true}}}}},"verror":{"files":{"CHANGES.md":{"size":505,"offset":"33245662"},"CONTRIBUTING.md":{"size":770,"offset":"33246167"},"LICENSE":{"size":1077,"offset":"33246937"},"package.json":{"size":478,"offset":"33248014"},"lib":{"files":{"verror.js":{"size":11865,"offset":"33248492"}}}}},"which-module":{"files":{"LICENSE":{"size":731,"offset":"33266001"},"index.js":{"size":248,"offset":"33266732"},"package.json":{"size":593,"offset":"33266980"}}},"whitelist":{"files":{"LICENSE":{"size":1057,"offset":"33267573"},"package.json":{"size":676,"offset":"33268630"},"lib":{"files":{"whitelist.js":{"size":912,"offset":"33269306"}}}}},"widest-line":{"files":{"index.js":{"size":191,"offset":"33270218"},"license":{"size":1109,"offset":"33270409"},"package.json":{"size":686,"offset":"33271518"},"node_modules":{"files":{"ansi-regex":{"files":{"index.js":{"size":253,"offset":"34274810"},"license":{"size":1109,"offset":"34275063"},"package.json":{"size":566,"offset":"34276172"}}},"is-fullwidth-code-point":{"files":{"index.js":{"size":1393,"offset":"34276738"},"license":{"size":1119,"offset":"34278131"},"package.json":{"size":647,"offset":"34279250"}}},"string-width":{"files":{"index.js":{"size":649,"offset":"34279897"},"license":{"size":1109,"offset":"34280546"},"package.json":{"size":709,"offset":"34281655"}}},"strip-ansi":{"files":{"index.js":{"size":150,"offset":"34282364"},"license":{"size":1109,"offset":"34282514"},"package.json":{"size":592,"offset":"34283623"}}}}}}},"wrap-ansi":{"files":{"index.js":{"size":4661,"offset":"33272204","executable":true},"license":{"size":1109,"offset":"33276865"},"package.json":{"size":774,"offset":"33277974"},"node_modules":{"files":{"ansi-regex":{"files":{"index.js":{"size":367,"offset":"34284215"},"license":{"size":1109,"offset":"34284582"},"package.json":{"size":578,"offset":"34285691"}}},"is-fullwidth-code-point":{"files":{"index.js":{"size":1393,"offset":"34286269"},"license":{"size":1119,"offset":"34287662"},"package.json":{"size":647,"offset":"34288781"}}},"string-width":{"files":{"index.js":{"size":751,"offset":"34289428"},"license":{"size":1109,"offset":"34290179"},"package.json":{"size":749,"offset":"34291288"}}},"strip-ansi":{"files":{"index.js":{"size":220,"offset":"34292037"},"license":{"size":1109,"offset":"34292257"},"package.json":{"size":662,"offset":"34293366"}}}}}}},"write-file-atomic":{"files":{"LICENSE":{"size":734,"offset":"33280972"},"index.js":{"size":6983,"offset":"33281706"},"package.json":{"size":781,"offset":"33288689"}}},"xtend":{"files":{"LICENCE":{"size":1050,"offset":"33437875"},"Makefile":{"size":49,"offset":"33438925"},"has-keys.js":{"size":162,"offset":"33438974"},"index.js":{"size":474,"offset":"33439136"},"mutable.js":{"size":502,"offset":"33439610"},"package.json":{"size":918,"offset":"33440112"}}},"y18n":{"files":{"LICENSE":{"size":731,"offset":"33441030"},"index.js":{"size":5256,"offset":"33441761"},"package.json":{"size":644,"offset":"33447017"}}},"yallist":{"files":{"LICENSE":{"size":765,"offset":"33447661"},"iterator.js":{"size":183,"offset":"33448426"},"package.json":{"size":590,"offset":"33448609"},"yallist.js":{"size":7280,"offset":"33449199"}}},"yargs":{"files":{"LICENSE":{"size":1199,"offset":"33456479"},"index.js":{"size":860,"offset":"33457678"},"package.json":{"size":1276,"offset":"33458538"},"yargs.js":{"size":37483,"offset":"33459814"},"locales":{"files":{"be.json":{"size":2258,"offset":"33497297"},"de.json":{"size":1568,"offset":"33499555"},"en.json":{"size":1648,"offset":"33501123"},"es.json":{"size":1639,"offset":"33502771"},"fr.json":{"size":1511,"offset":"33504410"},"hi.json":{"size":2645,"offset":"33505921"},"hu.json":{"size":1653,"offset":"33508566"},"id.json":{"size":1639,"offset":"33510219"},"it.json":{"size":1617,"offset":"33511858"},"ja.json":{"size":2030,"offset":"33513475"},"ko.json":{"size":1964,"offset":"33515505"},"nb.json":{"size":1467,"offset":"33517469"},"nl.json":{"size":1742,"offset":"33518936"},"nn.json":{"size":1459,"offset":"33520678"},"pirate.json":{"size":569,"offset":"33522137"},"pl.json":{"size":1835,"offset":"33522706"},"pt.json":{"size":1681,"offset":"33524541"},"pt_BR.json":{"size":1750,"offset":"33526222"},"ru.json":{"size":2326,"offset":"33527972"},"th.json":{"size":2704,"offset":"33530298"},"tr.json":{"size":1687,"offset":"33533002"},"zh_CN.json":{"size":1686,"offset":"33534689"},"zh_TW.json":{"size":1614,"offset":"33536375"}}},"lib":{"files":{"apply-extends.js":{"size":1488,"offset":"33537989"},"argsert.js":{"size":2416,"offset":"33539477"},"command.js":{"size":14958,"offset":"33541893"},"completion-templates.js":{"size":1381,"offset":"33556851"},"completion.js":{"size":3905,"offset":"33558232"},"decamelize.js":{"size":1385,"offset":"33562137"},"is-promise.js":{"size":96,"offset":"33563522"},"levenshtein.js":{"size":2121,"offset":"33563618"},"middleware.js":{"size":2201,"offset":"33565739"},"obj-filter.js":{"size":269,"offset":"33567940"},"usage.js":{"size":15500,"offset":"33568209"},"validation.js":{"size":10083,"offset":"33583709"},"yerror.js":{"size":254,"offset":"33593792"}}},"node_modules":{"files":{"ansi-regex":{"files":{"index.js":{"size":367,"offset":"34294028"},"license":{"size":1109,"offset":"34294395"},"package.json":{"size":578,"offset":"34295504"}}},"find-up":{"files":{"index.js":{"size":968,"offset":"34296082"},"license":{"size":1109,"offset":"34297050"},"package.json":{"size":655,"offset":"34298159"}}},"is-fullwidth-code-point":{"files":{"index.js":{"size":1393,"offset":"34298814"},"license":{"size":1119,"offset":"34300207"},"package.json":{"size":647,"offset":"34301326"}}},"string-width":{"files":{"index.js":{"size":751,"offset":"34301973"},"license":{"size":1109,"offset":"34302724"},"package.json":{"size":749,"offset":"34303833"}}},"strip-ansi":{"files":{"index.js":{"size":220,"offset":"34304582"},"license":{"size":1109,"offset":"34304802"},"package.json":{"size":662,"offset":"34305911"}}}}}}},"yargs-parser":{"files":{"LICENSE.txt":{"size":731,"offset":"33594046"},"index.js":{"size":27820,"offset":"33594777"},"package.json":{"size":734,"offset":"33622597"},"lib":{"files":{"tokenize-arg-string.js":{"size":854,"offset":"33623331"}}},"node_modules":{"files":{"camelcase":{"files":{"index.js":{"size":2098,"offset":"34306573"},"license":{"size":1109,"offset":"34308671"},"package.json":{"size":681,"offset":"34309780"}}}}}}},"yauzl":{"files":{"LICENSE":{"size":1077,"offset":"33624185"},"index.js":{"size":33069,"offset":"33625262"},"package.json":{"size":612,"offset":"33658331"}}}}}}}<!DOCTYPE html>
<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
-->
<html>
    <head>
        <!--
        Customize this policy to fit your own app's needs. For more guidance, see:
            https://github.com/apache/cordova-plugin-whitelist/blob/master/README.md#content-security-policy
        Some notes:
            * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication
            * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly
            * Disables use of inline scripts in order to mitigate risk of XSS vulnerabilities. To change this:
                * Enable inline JS: add 'unsafe-inline' to default-src
        -->
        <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data: content:;">
        <meta name="format-detection" content="telephone=no">
        <meta name="msapplication-tap-highlight" content="no">
        <meta name="viewport" content="initial-scale=1, width=device-width, viewport-fit=cover">
        <link rel="stylesheet" type="text/css" href="css/index.css">
        <title>Hello World</title>
    </head>
    <body>
        <div class="app">
            <h1>Apache Cordova</h1>
            <div id="deviceready" class="blink">
                <p class="event listening">Connecting to Device</p>
                <p class="event received">Device is Ready</p>
            </div>
        </div>
        <script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript" src="js/index.js"></script>
    </body>
</html>
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const fs = require('fs');
// Module to control application life, browser window and tray.
const { app, BrowserWindow } = require('electron');
// Electron settings from .json file.
const cdvElectronSettings = require('./cdv-electron-settings.json');

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let mainWindow;

function createWindow () {
    // Create the browser window.
    let appIcon;
    if (fs.existsSync(`${__dirname}/img/app.png`)) {
        appIcon = `${__dirname}/img/app.png`;
    } else if (fs.existsSync(`${__dirname}/img/icon.png`)) {
        appIcon = `${__dirname}/img/icon.png`;
    } else {
        appIcon = `${__dirname}/img/logo.png`;
    }

    const browserWindowOpts = Object.assign({}, cdvElectronSettings.browserWindow, { icon: appIcon });
    mainWindow = new BrowserWindow(browserWindowOpts);

    // and load the index.html of the app.
    // TODO: possibly get this data from config.xml
    mainWindow.loadURL(`file://${__dirname}/index.html`);
    mainWindow.webContents.on('did-finish-load', function () {
        mainWindow.webContents.send('window-id', mainWindow.id);
    });

    // Open the DevTools.
    if (cdvElectronSettings.browserWindow.webPreferences.devTools) {
        mainWindow.webContents.openDevTools();
    }

    // Emitted when the window is closed.
    mainWindow.on('closed', () => {
    // Dereference the window object, usually you would store windows
    // in an array if your app supports multi windows, this is the time
    // when you should delete the corresponding element.
        mainWindow = null;
    });
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow);

// Quit when all windows are closed.
app.on('window-all-closed', () => {
    // On OS X it is common for applications and their menu bar
    // to stay active until the user quits explicitly with Cmd + Q
    if (process.platform !== 'darwin') {
        app.quit();
    }
});

app.on('activate', () => {
    // On OS X it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (mainWindow === null) {
        createWindow();
    }
});

// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.
{
  "browserWindow": {
    "height": 600,
    "webPreferences": {
      "devTools": false,
      "nodeIntegration": false
    },
    "width": 800,
    "fullscreen": true
  }
}<?xml version='1.0' encoding='utf-8'?>
<widget id="cz.kiwi.android.light" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>Kiwi Light</name>
    <description>
		Kiwi native-cordova bridge app.
	</description>
    <author email="4plague@gmail.com">
		JaromÃ­r SmrÄ�ek
	</author>
    <access origin="*" />
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <preference name="ElectronSettingsFilePath" value="res/electron/settings.json" />
</widget>
// Platform: electron
// 74fdba8b327b2a13b4366dd141b52def96d4cb56
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
*/
;(function() {
var PLATFORM_VERSION_BUILD_LABEL = '1.1.1';
// file: src/scripts/require.js
var require;
var define;

(function () {
    var modules = {};
    // Stack of moduleIds currently being built.
    var requireStack = [];
    // Map of module ID -> index into requireStack of modules currently being built.
    var inProgressModules = {};
    var SEPARATOR = '.';

    function build (module) {
        var factory = module.factory;
        var localRequire = function (id) {
            var resultantId = id;
            // Its a relative path, so lop off the last portion and add the id (minus "./")
            if (id.charAt(0) === '.') {
                resultantId = module.id.slice(0, module.id.lastIndexOf(SEPARATOR)) + SEPARATOR + id.slice(2);
            }
            return require(resultantId);
        };
        module.exports = {};
        delete module.factory;
        factory(localRequire, module.exports, module);
        return module.exports;
    }

    require = function (id) {
        if (!modules[id]) {
            throw 'module ' + id + ' not found';
        } else if (id in inProgressModules) {
            var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id;
            throw 'Cycle in require graph: ' + cycle;
        }
        if (modules[id].factory) {
            try {
                inProgressModules[id] = requireStack.length;
                requireStack.push(id);
                return build(modules[id]);
            } finally {
                delete inProgressModules[id];
                requireStack.pop();
            }
        }
        return modules[id].exports;
    };

    define = function (id, factory) {
        if (Object.prototype.hasOwnProperty.call(modules, id)) {
            throw 'module ' + id + ' already defined';
        }

        modules[id] = {
            id: id,
            factory: factory
        };
    };

    define.remove = function (id) {
        delete modules[id];
    };

    define.moduleMap = modules;
})();

// Export for use in node
if (typeof module === 'object' && typeof require === 'function') {
    module.exports.require = require;
    module.exports.define = define;
}

// file: src/cordova.js
define("cordova", function(require, exports, module) {

// Workaround for Windows 10 in hosted environment case
// http://www.w3.org/html/wg/drafts/html/master/browsers.html#named-access-on-the-window-object
if (window.cordova && !(window.cordova instanceof HTMLElement)) { // eslint-disable-line no-undef
    throw new Error('cordova already defined');
}

var channel = require('cordova/channel');
var platform = require('cordova/platform');

/**
 * Intercept calls to addEventListener + removeEventListener and handle deviceready,
 * resume, and pause events.
 */
var m_document_addEventListener = document.addEventListener;
var m_document_removeEventListener = document.removeEventListener;
var m_window_addEventListener = window.addEventListener;
var m_window_removeEventListener = window.removeEventListener;

/**
 * Houses custom event handlers to intercept on document + window event listeners.
 */
var documentEventHandlers = {};
var windowEventHandlers = {};

document.addEventListener = function (evt, handler, capture) {
    var e = evt.toLowerCase();
    if (typeof documentEventHandlers[e] !== 'undefined') {
        documentEventHandlers[e].subscribe(handler);
    } else {
        m_document_addEventListener.call(document, evt, handler, capture);
    }
};

window.addEventListener = function (evt, handler, capture) {
    var e = evt.toLowerCase();
    if (typeof windowEventHandlers[e] !== 'undefined') {
        windowEventHandlers[e].subscribe(handler);
    } else {
        m_window_addEventListener.call(window, evt, handler, capture);
    }
};

document.removeEventListener = function (evt, handler, capture) {
    var e = evt.toLowerCase();
    // If unsubscribing from an event that is handled by a plugin
    if (typeof documentEventHandlers[e] !== 'undefined') {
        documentEventHandlers[e].unsubscribe(handler);
    } else {
        m_document_removeEventListener.call(document, evt, handler, capture);
    }
};

window.removeEventListener = function (evt, handler, capture) {
    var e = evt.toLowerCase();
    // If unsubscribing from an event that is handled by a plugin
    if (typeof windowEventHandlers[e] !== 'undefined') {
        windowEventHandlers[e].unsubscribe(handler);
    } else {
        m_window_removeEventListener.call(window, evt, handler, capture);
    }
};

function createEvent (type, data) {
    var event = document.createEvent('Events');
    event.initEvent(type, false, false);
    if (data) {
        for (var i in data) {
            if (data.hasOwnProperty(i)) {
                event[i] = data[i];
            }
        }
    }
    return event;
}

/* eslint-disable no-undef */
var cordova = {
    define: define,
    require: require,
    version: PLATFORM_VERSION_BUILD_LABEL,
    platformVersion: PLATFORM_VERSION_BUILD_LABEL,
    platformId: platform.id,

    /* eslint-enable no-undef */

    /**
     * Methods to add/remove your own addEventListener hijacking on document + window.
     */
    addWindowEventHandler: function (event) {
        return (windowEventHandlers[event] = channel.create(event));
    },
    addStickyDocumentEventHandler: function (event) {
        return (documentEventHandlers[event] = channel.createSticky(event));
    },
    addDocumentEventHandler: function (event) {
        return (documentEventHandlers[event] = channel.create(event));
    },
    removeWindowEventHandler: function (event) {
        delete windowEventHandlers[event];
    },
    removeDocumentEventHandler: function (event) {
        delete documentEventHandlers[event];
    },
    /**
     * Retrieve original event handlers that were replaced by Cordova
     *
     * @return object
     */
    getOriginalHandlers: function () {
        return { 'document': { 'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener },
            'window': { 'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener } };
    },
    /**
     * Method to fire event from native code
     * bNoDetach is required for events which cause an exception which needs to be caught in native code
     */
    fireDocumentEvent: function (type, data, bNoDetach) {
        var evt = createEvent(type, data);
        if (typeof documentEventHandlers[type] !== 'undefined') {
            if (bNoDetach) {
                documentEventHandlers[type].fire(evt);
            } else {
                setTimeout(function () {
                    // Fire deviceready on listeners that were registered before cordova.js was loaded.
                    if (type === 'deviceready') {
                        document.dispatchEvent(evt);
                    }
                    documentEventHandlers[type].fire(evt);
                }, 0);
            }
        } else {
            document.dispatchEvent(evt);
        }
    },
    fireWindowEvent: function (type, data) {
        var evt = createEvent(type, data);
        if (typeof windowEventHandlers[type] !== 'undefined') {
            setTimeout(function () {
                windowEventHandlers[type].fire(evt);
            }, 0);
        } else {
            window.dispatchEvent(evt);
        }
    },

    /**
     * Plugin callback mechanism.
     */
    // Randomize the starting callbackId to avoid collisions after refreshing or navigating.
    // This way, it's very unlikely that any new callback would get the same callbackId as an old callback.
    callbackId: Math.floor(Math.random() * 2000000000),
    callbacks: {},
    callbackStatus: {
        NO_RESULT: 0,
        OK: 1,
        CLASS_NOT_FOUND_EXCEPTION: 2,
        ILLEGAL_ACCESS_EXCEPTION: 3,
        INSTANTIATION_EXCEPTION: 4,
        MALFORMED_URL_EXCEPTION: 5,
        IO_EXCEPTION: 6,
        INVALID_ACTION: 7,
        JSON_EXCEPTION: 8,
        ERROR: 9
    },

    /**
     * Called by native code when returning successful result from an action.
     */
    callbackSuccess: function (callbackId, args) {
        cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback);
    },

    /**
     * Called by native code when returning error result from an action.
     */
    callbackError: function (callbackId, args) {
        // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative.
        // Derive success from status.
        cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback);
    },

    /**
     * Called by native code when returning the result from an action.
     */
    callbackFromNative: function (callbackId, isSuccess, status, args, keepCallback) {
        try {
            var callback = cordova.callbacks[callbackId];
            if (callback) {
                if (isSuccess && status === cordova.callbackStatus.OK) {
                    callback.success && callback.success.apply(null, args);
                } else if (!isSuccess) {
                    callback.fail && callback.fail.apply(null, args);
                }
                /*
                else
                    Note, this case is intentionally not caught.
                    this can happen if isSuccess is true, but callbackStatus is NO_RESULT
                    which is used to remove a callback from the list without calling the callbacks
                    typically keepCallback is false in this case
                */
                // Clear callback if not expecting any more results
                if (!keepCallback) {
                    delete cordova.callbacks[callbackId];
                }
            }
        } catch (err) {
            var msg = 'Error in ' + (isSuccess ? 'Success' : 'Error') + ' callbackId: ' + callbackId + ' : ' + err;
            console && console.log && console.log(msg);
            console && console.log && err.stack && console.log(err.stack);
            cordova.fireWindowEvent('cordovacallbackerror', { 'message': msg });
            throw err;
        }
    },
    addConstructor: function (func) {
        channel.onCordovaReady.subscribe(function () {
            try {
                func();
            } catch (e) {
                console.log('Failed to run constructor: ' + e);
            }
        });
    }
};

module.exports = cordova;

});

// file: src/common/argscheck.js
define("cordova/argscheck", function(require, exports, module) {

var utils = require('cordova/utils');

var moduleExports = module.exports;

var typeMap = {
    'A': 'Array',
    'D': 'Date',
    'N': 'Number',
    'S': 'String',
    'F': 'Function',
    'O': 'Object'
};

function extractParamName (callee, argIndex) {
    return (/\(\s*([^)]*?)\s*\)/).exec(callee)[1].split(/\s*,\s*/)[argIndex];
}

/**
 * Checks the given arguments' types and throws if they are not as expected.
 *
 * `spec` is a string where each character stands for the required type of the
 * argument at the same position. In other words: the character at `spec[i]`
 * specifies the required type for `args[i]`. The characters in `spec` are the
 * first letter of the required type's name. The supported types are:
 *
 *     Array, Date, Number, String, Function, Object
 *
 * Lowercase characters specify arguments that must not be `null` or `undefined`
 * while uppercase characters allow those values to be passed.
 *
 * Finally, `*` can be used to allow any type at the corresponding position.
 *
 * @example
 * function foo (arr, opts) {
 *     // require `arr` to be an Array and `opts` an Object, null or undefined
 *     checkArgs('aO', 'my.package.foo', arguments);
 *     // ...
 * }
 * @param {String} spec - the type specification for `args` as described above
 * @param {String} functionName - full name of the callee.
 * Used in the error message
 * @param {Array|arguments} args - the arguments to be checked against `spec`
 * @param {Function} [opt_callee=args.callee] - the recipient of `args`.
 * Used to extract parameter names for the error message
 * @throws {TypeError} if args do not satisfy spec
 */
function checkArgs (spec, functionName, args, opt_callee) {
    if (!moduleExports.enableChecks) {
        return;
    }
    var errMsg = null;
    var typeName;
    for (var i = 0; i < spec.length; ++i) {
        var c = spec.charAt(i);
        var cUpper = c.toUpperCase();
        var arg = args[i];
        // Asterix means allow anything.
        if (c === '*') {
            continue;
        }
        typeName = utils.typeName(arg);
        if ((arg === null || arg === undefined) && c === cUpper) {
            continue;
        }
        if (typeName !== typeMap[cUpper]) {
            errMsg = 'Expected ' + typeMap[cUpper];
            break;
        }
    }
    if (errMsg) {
        errMsg += ', but got ' + typeName + '.';
        errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg;
        // Don't log when running unit tests.
        if (typeof jasmine === 'undefined') {
            console.error(errMsg);
        }
        throw TypeError(errMsg);
    }
}

function getValue (value, defaultValue) {
    return value === undefined ? defaultValue : value;
}

moduleExports.checkArgs = checkArgs;
moduleExports.getValue = getValue;
moduleExports.enableChecks = true;

});

// file: src/common/base64.js
define("cordova/base64", function(require, exports, module) {

var base64 = exports;

base64.fromArrayBuffer = function (arrayBuffer) {
    var array = new Uint8Array(arrayBuffer);
    return uint8ToBase64(array);
};

base64.toArrayBuffer = function (str) {
    var decodedStr = typeof atob !== 'undefined' ? atob(str) : Buffer.from(str, 'base64').toString('binary'); // eslint-disable-line no-undef
    var arrayBuffer = new ArrayBuffer(decodedStr.length);
    var array = new Uint8Array(arrayBuffer);
    for (var i = 0, len = decodedStr.length; i < len; i++) {
        array[i] = decodedStr.charCodeAt(i);
    }
    return arrayBuffer;
};

// ------------------------------------------------------------------------------

/* This code is based on the performance tests at http://jsperf.com/b64tests
 * This 12-bit-at-a-time algorithm was the best performing version on all
 * platforms tested.
 */

var b64_6bit = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var b64_12bit;

var b64_12bitTable = function () {
    b64_12bit = [];
    for (var i = 0; i < 64; i++) {
        for (var j = 0; j < 64; j++) {
            b64_12bit[i * 64 + j] = b64_6bit[i] + b64_6bit[j];
        }
    }
    b64_12bitTable = function () { return b64_12bit; };
    return b64_12bit;
};

function uint8ToBase64 (rawData) {
    var numBytes = rawData.byteLength;
    var output = '';
    var segment;
    var table = b64_12bitTable();
    for (var i = 0; i < numBytes - 2; i += 3) {
        segment = (rawData[i] << 16) + (rawData[i + 1] << 8) + rawData[i + 2];
        output += table[segment >> 12];
        output += table[segment & 0xfff];
    }
    if (numBytes - i === 2) {
        segment = (rawData[i] << 16) + (rawData[i + 1] << 8);
        output += table[segment >> 12];
        output += b64_6bit[(segment & 0xfff) >> 6];
        output += '=';
    } else if (numBytes - i === 1) {
        segment = (rawData[i] << 16);
        output += table[segment >> 12];
        output += '==';
    }
    return output;
}

});

// file: src/common/builder.js
define("cordova/builder", function(require, exports, module) {

var utils = require('cordova/utils');

function each (objects, func, context) {
    for (var prop in objects) {
        if (objects.hasOwnProperty(prop)) {
            func.apply(context, [objects[prop], prop]);
        }
    }
}

function clobber (obj, key, value) {
    exports.replaceHookForTesting(obj, key);
    var needsProperty = false;
    try {
        obj[key] = value;
    } catch (e) {
        needsProperty = true;
    }
    // Getters can only be overridden by getters.
    if (needsProperty || obj[key] !== value) {
        utils.defineGetter(obj, key, function () {
            return value;
        });
    }
}

function assignOrWrapInDeprecateGetter (obj, key, value, message) {
    if (message) {
        utils.defineGetter(obj, key, function () {
            console.log(message);
            delete obj[key];
            clobber(obj, key, value);
            return value;
        });
    } else {
        clobber(obj, key, value);
    }
}

function include (parent, objects, clobber, merge) {
    each(objects, function (obj, key) {
        try {
            var result = obj.path ? require(obj.path) : {};

            if (clobber) {
                // Clobber if it doesn't exist.
                if (typeof parent[key] === 'undefined') {
                    assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
                } else if (typeof obj.path !== 'undefined') {
                    // If merging, merge properties onto parent, otherwise, clobber.
                    if (merge) {
                        recursiveMerge(parent[key], result);
                    } else {
                        assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
                    }
                }
                result = parent[key];
            } else {
                // Overwrite if not currently defined.
                if (typeof parent[key] === 'undefined') {
                    assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
                } else {
                    // Set result to what already exists, so we can build children into it if they exist.
                    result = parent[key];
                }
            }

            if (obj.children) {
                include(result, obj.children, clobber, merge);
            }
        } catch (e) {
            utils.alert('Exception building Cordova JS globals: ' + e + ' for key "' + key + '"');
        }
    });
}

/**
 * Merge properties from one object onto another recursively.  Properties from
 * the src object will overwrite existing target property.
 *
 * @param target Object to merge properties into.
 * @param src Object to merge properties from.
 */
function recursiveMerge (target, src) {
    for (var prop in src) {
        if (src.hasOwnProperty(prop)) {
            if (target.prototype && target.prototype.constructor === target) {
                // If the target object is a constructor override off prototype.
                clobber(target.prototype, prop, src[prop]);
            } else {
                if (typeof src[prop] === 'object' && typeof target[prop] === 'object') {
                    recursiveMerge(target[prop], src[prop]);
                } else {
                    clobber(target, prop, src[prop]);
                }
            }
        }
    }
}

exports.buildIntoButDoNotClobber = function (objects, target) {
    include(target, objects, false, false);
};
exports.buildIntoAndClobber = function (objects, target) {
    include(target, objects, true, false);
};
exports.buildIntoAndMerge = function (objects, target) {
    include(target, objects, true, true);
};
exports.recursiveMerge = recursiveMerge;
exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter;
exports.replaceHookForTesting = function () {};

});

// file: src/common/channel.js
define("cordova/channel", function(require, exports, module) {

var utils = require('cordova/utils');
var nextGuid = 1;

/**
 * Custom pub-sub "channel" that can have functions subscribed to it
 * This object is used to define and control firing of events for
 * cordova initialization, as well as for custom events thereafter.
 *
 * The order of events during page load and Cordova startup is as follows:
 *
 * onDOMContentLoaded*         Internal event that is received when the web page is loaded and parsed.
 * onNativeReady*              Internal event that indicates the Cordova native side is ready.
 * onCordovaReady*             Internal event fired when all Cordova JavaScript objects have been created.
 * onDeviceReady*              User event fired to indicate that Cordova is ready
 * onResume                    User event fired to indicate a start/resume lifecycle event
 * onPause                     User event fired to indicate a pause lifecycle event
 *
 * The events marked with an * are sticky. Once they have fired, they will stay in the fired state.
 * All listeners that subscribe after the event is fired will be executed right away.
 *
 * The only Cordova events that user code should register for are:
 *      deviceready           Cordova native code is initialized and Cordova APIs can be called from JavaScript
 *      pause                 App has moved to background
 *      resume                App has returned to foreground
 *
 * Listeners can be registered as:
 *      document.addEventListener("deviceready", myDeviceReadyListener, false);
 *      document.addEventListener("resume", myResumeListener, false);
 *      document.addEventListener("pause", myPauseListener, false);
 *
 * The DOM lifecycle events should be used for saving and restoring state
 *      window.onload
 *      window.onunload
 *
 */

/**
 * Channel
 * @constructor
 * @param type  String the channel name
 */
var Channel = function (type, sticky) {
    this.type = type;
    // Map of guid -> function.
    this.handlers = {};
    // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired.
    this.state = sticky ? 1 : 0;
    // Used in sticky mode to remember args passed to fire().
    this.fireArgs = null;
    // Used by onHasSubscribersChange to know if there are any listeners.
    this.numHandlers = 0;
    // Function that is called when the first listener is subscribed, or when
    // the last listener is unsubscribed.
    this.onHasSubscribersChange = null;
};
var channel = {
    /**
     * Calls the provided function only after all of the channels specified
     * have been fired. All channels must be sticky channels.
     */
    join: function (h, c) {
        var len = c.length;
        var i = len;
        var f = function () {
            if (!(--i)) h();
        };
        for (var j = 0; j < len; j++) {
            if (c[j].state === 0) {
                throw Error('Can only use join with sticky channels.');
            }
            c[j].subscribe(f);
        }
        if (!len) h();
    },
    /* eslint-disable no-return-assign */
    create: function (type) {
        return channel[type] = new Channel(type, false);
    },
    createSticky: function (type) {
        return channel[type] = new Channel(type, true);
    },
    /* eslint-enable no-return-assign */
    /**
     * cordova Channels that must fire before "deviceready" is fired.
     */
    deviceReadyChannelsArray: [],
    deviceReadyChannelsMap: {},

    /**
     * Indicate that a feature needs to be initialized before it is ready to be used.
     * This holds up Cordova's "deviceready" event until the feature has been initialized
     * and Cordova.initComplete(feature) is called.
     *
     * @param feature {String}     The unique feature name
     */
    waitForInitialization: function (feature) {
        if (feature) {
            var c = channel[feature] || this.createSticky(feature);
            this.deviceReadyChannelsMap[feature] = c;
            this.deviceReadyChannelsArray.push(c);
        }
    },

    /**
     * Indicate that initialization code has completed and the feature is ready to be used.
     *
     * @param feature {String}     The unique feature name
     */
    initializationComplete: function (feature) {
        var c = this.deviceReadyChannelsMap[feature];
        if (c) {
            c.fire();
        }
    }
};

function checkSubscriptionArgument (argument) {
    if (typeof argument !== 'function' && typeof argument.handleEvent !== 'function') {
        throw new Error(
            'Must provide a function or an EventListener object ' +
                'implementing the handleEvent interface.'
        );
    }
}

/**
 * Subscribes the given function to the channel. Any time that
 * Channel.fire is called so too will the function.
 * Optionally specify an execution context for the function
 * and a guid that can be used to stop subscribing to the channel.
 * Returns the guid.
 */
Channel.prototype.subscribe = function (eventListenerOrFunction, eventListener) {
    checkSubscriptionArgument(eventListenerOrFunction);
    var handleEvent, guid;

    if (eventListenerOrFunction && typeof eventListenerOrFunction === 'object') {
        // Received an EventListener object implementing the handleEvent interface
        handleEvent = eventListenerOrFunction.handleEvent;
        eventListener = eventListenerOrFunction;
    } else {
        // Received a function to handle event
        handleEvent = eventListenerOrFunction;
    }

    if (this.state === 2) {
        handleEvent.apply(eventListener || this, this.fireArgs);
        return;
    }

    guid = eventListenerOrFunction.observer_guid;
    if (typeof eventListener === 'object') {
        handleEvent = utils.close(eventListener, handleEvent);
    }

    if (!guid) {
        // First time any channel has seen this subscriber
        guid = '' + nextGuid++;
    }
    handleEvent.observer_guid = guid;
    eventListenerOrFunction.observer_guid = guid;

    // Don't add the same handler more than once.
    if (!this.handlers[guid]) {
        this.handlers[guid] = handleEvent;
        this.numHandlers++;
        if (this.numHandlers === 1) {
            this.onHasSubscribersChange && this.onHasSubscribersChange();
        }
    }
};

/**
 * Unsubscribes the function with the given guid from the channel.
 */
Channel.prototype.unsubscribe = function (eventListenerOrFunction) {
    checkSubscriptionArgument(eventListenerOrFunction);
    var handleEvent, guid, handler;

    if (eventListenerOrFunction && typeof eventListenerOrFunction === 'object') {
        // Received an EventListener object implementing the handleEvent interface
        handleEvent = eventListenerOrFunction.handleEvent;
    } else {
        // Received a function to handle event
        handleEvent = eventListenerOrFunction;
    }

    guid = handleEvent.observer_guid;
    handler = this.handlers[guid];
    if (handler) {
        delete this.handlers[guid];
        this.numHandlers--;
        if (this.numHandlers === 0) {
            this.onHasSubscribersChange && this.onHasSubscribersChange();
        }
    }
};

/**
 * Calls all functions subscribed to this channel.
 */
Channel.prototype.fire = function (e) {
    var fail = false; // eslint-disable-line no-unused-vars
    var fireArgs = Array.prototype.slice.call(arguments);
    // Apply stickiness.
    if (this.state === 1) {
        this.state = 2;
        this.fireArgs = fireArgs;
    }
    if (this.numHandlers) {
        // Copy the values first so that it is safe to modify it from within
        // callbacks.
        var toCall = [];
        for (var item in this.handlers) {
            toCall.push(this.handlers[item]);
        }
        for (var i = 0; i < toCall.length; ++i) {
            toCall[i].apply(this, fireArgs);
        }
        if (this.state === 2 && this.numHandlers) {
            this.numHandlers = 0;
            this.handlers = {};
            this.onHasSubscribersChange && this.onHasSubscribersChange();
        }
    }
};

// defining them here so they are ready super fast!
// DOM event that is received when the web page is loaded and parsed.
channel.createSticky('onDOMContentLoaded');

// Event to indicate the Cordova native side is ready.
channel.createSticky('onNativeReady');

// Event to indicate that all Cordova JavaScript objects have been created
// and it's time to run plugin constructors.
channel.createSticky('onCordovaReady');

// Event to indicate that all automatically loaded JS plugins are loaded and ready.
// FIXME remove this
channel.createSticky('onPluginsReady');

// Event to indicate that Cordova is ready
channel.createSticky('onDeviceReady');

// Event to indicate a resume lifecycle event
channel.create('onResume');

// Event to indicate a pause lifecycle event
channel.create('onPause');

// Channels that must fire before "deviceready" is fired.
channel.waitForInitialization('onCordovaReady');
channel.waitForInitialization('onDOMContentLoaded');

module.exports = channel;

});

// file: ../cordova-electron/cordova-js-src/confighelper.js
define("cordova/confighelper", function(require, exports, module) {

let config;

function Config (xhr) {
    function loadPreferences (xhr) {
        let parser = new DOMParser();
        let doc = parser.parseFromString(xhr.responseText, 'application/xml');
        let preferences = doc.getElementsByTagName('preference');

        return Array.prototype.slice.call(preferences);
    }

    this.xhr = xhr;
    this.preferences = loadPreferences(this.xhr);
}

function readConfig (success, error) {
    var xhr;

    if (typeof config != 'undefined') {
        success(config);
    }

    function fail (msg) {
        console.error(msg);

        if (error) {
            error(msg);
        }
    }

    var xhrStatusChangeHandler = function () {
        if (xhr.readyState === 4) {
            if (xhr.status === 200 || xhr.status === 304 || xhr.status === 0 /* file:// */) {
                config = new Config(xhr);
                success(config);
            } else {
                fail('[Electron][cordova.js][xhrStatusChangeHandler] Could not XHR config.xml: ' + xhr.statusText);
            }
        }
    };

    xhr = new XMLHttpRequest();
    xhr.addEventListener('load', xhrStatusChangeHandler);

    try {
        xhr.open('get', 'config.xml', true);
        xhr.send();
    } catch (e) {
        fail('[Electron][cordova.js][readConfig] Could not XHR config.xml: ' + JSON.stringify(e));
    }
}

/**
 * Reads a preference value from config.xml.
 * Returns preference value or undefined if it does not exist.
 * @param {String} preferenceName Preference name to read */
Config.prototype.getPreferenceValue = function getPreferenceValue (preferenceName) {
    var preferenceItem = this.preferences && this.preferences.filter(function (item) {
        return item.attributes.name && item.attributes.name.value === preferenceName;
    });

    if (preferenceItem && preferenceItem[0] && preferenceItem[0].attributes && preferenceItem[0].attributes.value) {
        return preferenceItem[0].attributes.value.value;
    }
};

exports.readConfig = readConfig;

});

// file: ../cordova-electron/cordova-js-src/exec.js
define("cordova/exec", function(require, exports, module) {

/* global require, module, console */

const cordova = require('cordova');
const execProxy = require('cordova/exec/proxy');

/**
 * Execute a cordova command.  It is up to the native side whether this action
 * is synchronous or asynchronous.  The native side can return:
 *      Synchronous: PluginResult object as a JSON string
 *      Asynchronous: Empty string ""
 * If async, the native side will cordova.callbackSuccess or cordova.callbackError,
 * depending upon the result of the action.
 *
 * @param {Function} success    The success callback
 * @param {Function} fail       The fail callback
 * @param {String} service      The name of the service to use
 * @param {String} action       Action to be run in cordova
 * @param {String[]} [args]     Zero or more arguments to pass to the method
 */
module.exports = function (success, fail, service, action, args) {

    var proxy = execProxy.get(service, action);

    args = args || [];

    if (proxy) {

        var callbackId = service + cordova.callbackId++;

        if (typeof success === 'function' || typeof fail === 'function') {
            cordova.callbacks[callbackId] = { success: success, fail: fail };
        }
        try {
            // callbackOptions param represents additional optional parameters command could pass back, like keepCallback or
            // custom callbackId, for example {callbackId: id, keepCallback: true, status: cordova.callbackStatus.JSON_EXCEPTION }
            var onSuccess = function (result, callbackOptions) {
                callbackOptions = callbackOptions || {};
                var callbackStatus;
                // covering both undefined and null.
                // strict null comparison was causing callbackStatus to be undefined
                // and then no callback was called because of the check in cordova.callbackFromNative
                // see CB-8996 Mobilespec app hang on windows
                if (callbackOptions.status !== undefined && callbackOptions.status !== null) {
                    callbackStatus = callbackOptions.status;
                } else {
                    callbackStatus = cordova.callbackStatus.OK;
                }
                cordova.callbackSuccess(callbackOptions.callbackId || callbackId,
                    {
                        status: callbackStatus,
                        message: result,
                        keepCallback: callbackOptions.keepCallback || false
                    });
            };
            var onError = function (err, callbackOptions) {
                callbackOptions = callbackOptions || {};
                var callbackStatus;
                // covering both undefined and null.
                // strict null comparison was causing callbackStatus to be undefined
                // and then no callback was called because of the check in cordova.callbackFromNative
                // note: status can be 0
                if (callbackOptions.status !== undefined && callbackOptions.status !== null) {
                    callbackStatus = callbackOptions.status;
                } else {
                    callbackStatus = cordova.callbackStatus.OK;
                }
                cordova.callbackError(callbackOptions.callbackId || callbackId, {
                    status: callbackStatus,
                    message: err,
                    keepCallback: callbackOptions.keepCallback || false
                });
            };
            proxy(onSuccess, onError, args);

        } catch (e) {
            console.log('Exception calling native with command :: ' + service + ' :: ' + action + ' ::exception=' + e);
        }
    } else {

        console.log('Error: exec proxy not found for :: ' + service + ' :: ' + action);

        if (typeof fail === 'function') {
            fail('Missing Command Error');
        }
    }
};

});

// file: src/common/exec/proxy.js
define("cordova/exec/proxy", function(require, exports, module) {

// internal map of proxy function
var CommandProxyMap = {};

module.exports = {

    // example: cordova.commandProxy.add("Accelerometer",{getCurrentAcceleration: function(successCallback, errorCallback, options) {...},...);
    add: function (id, proxyObj) {
        console.log('adding proxy for ' + id);
        CommandProxyMap[id] = proxyObj;
        return proxyObj;
    },

    // cordova.commandProxy.remove("Accelerometer");
    remove: function (id) {
        var proxy = CommandProxyMap[id];
        delete CommandProxyMap[id];
        CommandProxyMap[id] = null;
        return proxy;
    },

    get: function (service, action) {
        return (CommandProxyMap[service] ? CommandProxyMap[service][action] : null);
    }
};

});

// file: src/common/init.js
define("cordova/init", function(require, exports, module) {

var channel = require('cordova/channel');
var cordova = require('cordova');
var modulemapper = require('cordova/modulemapper');
var platform = require('cordova/platform');
var pluginloader = require('cordova/pluginloader');
var utils = require('cordova/utils');

var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady];

function logUnfiredChannels (arr) {
    for (var i = 0; i < arr.length; ++i) {
        if (arr[i].state !== 2) {
            console.log('Channel not fired: ' + arr[i].type);
        }
    }
}

window.setTimeout(function () {
    if (channel.onDeviceReady.state !== 2) {
        console.log('deviceready has not fired after 5 seconds.');
        logUnfiredChannels(platformInitChannelsArray);
        logUnfiredChannels(channel.deviceReadyChannelsArray);
    }
}, 5000);

// Replace navigator before any modules are required(), to ensure it happens as soon as possible.
// We replace it so that properties that can't be clobbered can instead be overridden.
function replaceNavigator (origNavigator) {
    var CordovaNavigator = function () {};
    CordovaNavigator.prototype = origNavigator;
    var newNavigator = new CordovaNavigator();
    // This work-around really only applies to new APIs that are newer than Function.bind.
    // Without it, APIs such as getGamepads() break.
    if (CordovaNavigator.bind) {
        for (var key in origNavigator) {
            if (typeof origNavigator[key] === 'function') {
                newNavigator[key] = origNavigator[key].bind(origNavigator);
            } else {
                (function (k) {
                    utils.defineGetterSetter(newNavigator, key, function () {
                        return origNavigator[k];
                    });
                })(key);
            }
        }
    }
    return newNavigator;
}

if (window.navigator) {
    window.navigator = replaceNavigator(window.navigator);
}

if (!window.console) {
    window.console = {
        log: function () {}
    };
}
if (!window.console.warn) {
    window.console.warn = function (msg) {
        this.log('warn: ' + msg);
    };
}

// Register pause, resume and deviceready channels as events on document.
channel.onPause = cordova.addDocumentEventHandler('pause');
channel.onResume = cordova.addDocumentEventHandler('resume');
channel.onActivated = cordova.addDocumentEventHandler('activated');
channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready');

// Listen for DOMContentLoaded and notify our channel subscribers.
if (document.readyState === 'complete' || document.readyState === 'interactive') {
    channel.onDOMContentLoaded.fire();
} else {
    document.addEventListener('DOMContentLoaded', function () {
        channel.onDOMContentLoaded.fire();
    }, false);
}

// _nativeReady is global variable that the native side can set
// to signify that the native code is ready. It is a global since
// it may be called before any cordova JS is ready.
if (window._nativeReady) {
    channel.onNativeReady.fire();
}

modulemapper.clobbers('cordova', 'cordova');
modulemapper.clobbers('cordova/exec', 'cordova.exec');
modulemapper.clobbers('cordova/exec', 'Cordova.exec');

// Call the platform-specific initialization.
platform.bootstrap && platform.bootstrap();

// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js.
// The delay allows the attached modules to be defined before the plugin loader looks for them.
setTimeout(function () {
    pluginloader.load(function () {
        channel.onPluginsReady.fire();
    });
}, 0);

/**
 * Create all cordova objects once native side is ready.
 */
channel.join(function () {
    modulemapper.mapModules(window);

    platform.initialize && platform.initialize();

    // Fire event to notify that all objects are created
    channel.onCordovaReady.fire();

    // Fire onDeviceReady event once page has fully loaded, all
    // constructors have run and cordova info has been received from native
    // side.
    channel.join(function () {
        require('cordova').fireDocumentEvent('deviceready');
    }, channel.deviceReadyChannelsArray);

}, platformInitChannelsArray);

});

// file: src/common/modulemapper.js
define("cordova/modulemapper", function(require, exports, module) {

var builder = require('cordova/builder');
var moduleMap = define.moduleMap; // eslint-disable-line no-undef
var symbolList;
var deprecationMap;

exports.reset = function () {
    symbolList = [];
    deprecationMap = {};
};

function addEntry (strategy, moduleName, symbolPath, opt_deprecationMessage) {
    if (!(moduleName in moduleMap)) {
        throw new Error('Module ' + moduleName + ' does not exist.');
    }
    symbolList.push(strategy, moduleName, symbolPath);
    if (opt_deprecationMessage) {
        deprecationMap[symbolPath] = opt_deprecationMessage;
    }
}

// Note: Android 2.3 does have Function.bind().
exports.clobbers = function (moduleName, symbolPath, opt_deprecationMessage) {
    addEntry('c', moduleName, symbolPath, opt_deprecationMessage);
};

exports.merges = function (moduleName, symbolPath, opt_deprecationMessage) {
    addEntry('m', moduleName, symbolPath, opt_deprecationMessage);
};

exports.defaults = function (moduleName, symbolPath, opt_deprecationMessage) {
    addEntry('d', moduleName, symbolPath, opt_deprecationMessage);
};

exports.runs = function (moduleName) {
    addEntry('r', moduleName, null);
};

function prepareNamespace (symbolPath, context) {
    if (!symbolPath) {
        return context;
    }
    var parts = symbolPath.split('.');
    var cur = context;
    for (var i = 0, part; part = parts[i]; ++i) { // eslint-disable-line no-cond-assign
        cur = cur[part] = cur[part] || {};
    }
    return cur;
}

exports.mapModules = function (context) {
    var origSymbols = {};
    context.CDV_origSymbols = origSymbols;
    for (var i = 0, len = symbolList.length; i < len; i += 3) {
        var strategy = symbolList[i];
        var moduleName = symbolList[i + 1];
        var module = require(moduleName);
        // <runs/>
        if (strategy === 'r') {
            continue;
        }
        var symbolPath = symbolList[i + 2];
        var lastDot = symbolPath.lastIndexOf('.');
        var namespace = symbolPath.substr(0, lastDot);
        var lastName = symbolPath.substr(lastDot + 1);

        var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null;
        var parentObj = prepareNamespace(namespace, context);
        var target = parentObj[lastName];

        if (strategy === 'm' && target) {
            builder.recursiveMerge(target, module);
        } else if ((strategy === 'd' && !target) || (strategy !== 'd')) {
            if (!(symbolPath in origSymbols)) {
                origSymbols[symbolPath] = target;
            }
            builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg);
        }
    }
};

exports.getOriginalSymbol = function (context, symbolPath) {
    var origSymbols = context.CDV_origSymbols;
    if (origSymbols && (symbolPath in origSymbols)) {
        return origSymbols[symbolPath];
    }
    var parts = symbolPath.split('.');
    var obj = context;
    for (var i = 0; i < parts.length; ++i) {
        obj = obj && obj[parts[i]];
    }
    return obj;
};

exports.reset();

});

// file: ../cordova-electron/cordova-js-src/platform.js
define("cordova/platform", function(require, exports, module) {

module.exports = {
    id: 'electron',
    cordovaVersion: '4.2.0', // cordova-js

    bootstrap: function () {

        var modulemapper = require('cordova/modulemapper');
        var channel = require('cordova/channel');

        modulemapper.clobbers('cordova/exec/proxy', 'cordova.commandProxy');

        channel.onNativeReady.fire();

        document.addEventListener('visibilitychange', function () {
            if (document.hidden) {
                channel.onPause.fire();
            } else {
                channel.onResume.fire();
            }
        });

    // End of bootstrap
    }
};

});

// file: src/common/pluginloader.js
define("cordova/pluginloader", function(require, exports, module) {

var modulemapper = require('cordova/modulemapper');

// Helper function to inject a <script> tag.
// Exported for testing.
exports.injectScript = function (url, onload, onerror) {
    var script = document.createElement('script');
    // onload fires even when script fails loads with an error.
    script.onload = onload;
    // onerror fires for malformed URLs.
    script.onerror = onerror;
    script.src = url;
    document.head.appendChild(script);
};

function injectIfNecessary (id, url, onload, onerror) {
    onerror = onerror || onload;
    if (id in define.moduleMap) { // eslint-disable-line no-undef
        onload();
    } else {
        exports.injectScript(url, function () {
            if (id in define.moduleMap) { // eslint-disable-line no-undef
                onload();
            } else {
                onerror();
            }
        }, onerror);
    }
}

function onScriptLoadingComplete (moduleList, finishPluginLoading) {
    // Loop through all the plugins and then through their clobbers and merges.
    for (var i = 0, module; module = moduleList[i]; i++) { // eslint-disable-line no-cond-assign
        if (module.clobbers && module.clobbers.length) {
            for (var j = 0; j < module.clobbers.length; j++) {
                modulemapper.clobbers(module.id, module.clobbers[j]);
            }
        }

        if (module.merges && module.merges.length) {
            for (var k = 0; k < module.merges.length; k++) {
                modulemapper.merges(module.id, module.merges[k]);
            }
        }

        // Finally, if runs is truthy we want to simply require() the module.
        if (module.runs) {
            modulemapper.runs(module.id);
        }
    }

    finishPluginLoading();
}

// Handler for the cordova_plugins.js content.
// See plugman's plugin_loader.js for the details of this object.
// This function is only called if the really is a plugins array that isn't empty.
// Otherwise the onerror response handler will just call finishPluginLoading().
function handlePluginsObject (path, moduleList, finishPluginLoading) {
    // Now inject the scripts.
    var scriptCounter = moduleList.length;

    if (!scriptCounter) {
        finishPluginLoading();
        return;
    }
    function scriptLoadedCallback () {
        if (!--scriptCounter) {
            onScriptLoadingComplete(moduleList, finishPluginLoading);
        }
    }

    for (var i = 0; i < moduleList.length; i++) {
        injectIfNecessary(moduleList[i].id, path + moduleList[i].file, scriptLoadedCallback);
    }
}

function findCordovaPath () {
    var path = null;
    var scripts = document.getElementsByTagName('script');
    var term = '/cordova.js';
    for (var n = scripts.length - 1; n > -1; n--) {
        var src = scripts[n].src.replace(/\?.*$/, ''); // Strip any query param (CB-6007).
        if (src.indexOf(term) === (src.length - term.length)) {
            path = src.substring(0, src.length - term.length) + '/';
            break;
        }
    }
    return path;
}

// Tries to load all plugins' js-modules.
// This is an async process, but onDeviceReady is blocked on onPluginsReady.
// onPluginsReady is fired when there are no plugins to load, or they are all done.
exports.load = function (callback) {
    var pathPrefix = findCordovaPath();
    if (pathPrefix === null) {
        console.log('Could not find cordova.js script tag. Plugin loading may fail.');
        pathPrefix = '';
    }
    injectIfNecessary('cordova/plugin_list', pathPrefix + 'cordova_plugins.js', function () {
        var moduleList = require('cordova/plugin_list');
        handlePluginsObject(pathPrefix, moduleList, callback);
    }, callback);
};

});

// file: src/common/urlutil.js
define("cordova/urlutil", function(require, exports, module) {

/**
 * For already absolute URLs, returns what is passed in.
 * For relative URLs, converts them to absolute ones.
 */
exports.makeAbsolute = function makeAbsolute (url) {
    var anchorEl = document.createElement('a');
    anchorEl.href = url;
    return anchorEl.href;
};

});

// file: src/common/utils.js
define("cordova/utils", function(require, exports, module) {

var utils = exports;

/**
 * Defines a property getter / setter for obj[key].
 */
utils.defineGetterSetter = function (obj, key, getFunc, opt_setFunc) {
    if (Object.defineProperty) {
        var desc = {
            get: getFunc,
            configurable: true
        };
        if (opt_setFunc) {
            desc.set = opt_setFunc;
        }
        Object.defineProperty(obj, key, desc);
    } else {
        obj.__defineGetter__(key, getFunc);
        if (opt_setFunc) {
            obj.__defineSetter__(key, opt_setFunc);
        }
    }
};

/**
 * Defines a property getter for obj[key].
 */
utils.defineGetter = utils.defineGetterSetter;

utils.arrayIndexOf = function (a, item) {
    if (a.indexOf) {
        return a.indexOf(item);
    }
    var len = a.length;
    for (var i = 0; i < len; ++i) {
        if (a[i] === item) {
            return i;
        }
    }
    return -1;
};

/**
 * Returns whether the item was found in the array.
 */
utils.arrayRemove = function (a, item) {
    var index = utils.arrayIndexOf(a, item);
    if (index !== -1) {
        a.splice(index, 1);
    }
    return index !== -1;
};

utils.typeName = function (val) {
    return Object.prototype.toString.call(val).slice(8, -1);
};

/**
 * Returns an indication of whether the argument is an array or not
 */
utils.isArray = Array.isArray ||
                function (a) { return utils.typeName(a) === 'Array'; };

/**
 * Returns an indication of whether the argument is a Date or not
 */
utils.isDate = function (d) {
    return (d instanceof Date);
};

/**
 * Does a deep clone of the object.
 */
utils.clone = function (obj) {
    if (!obj || typeof obj === 'function' || utils.isDate(obj) || typeof obj !== 'object') {
        return obj;
    }

    var retVal, i;

    if (utils.isArray(obj)) {
        retVal = [];
        for (i = 0; i < obj.length; ++i) {
            retVal.push(utils.clone(obj[i]));
        }
        return retVal;
    }

    retVal = {};
    for (i in obj) {
        // https://issues.apache.org/jira/browse/CB-11522 'unknown' type may be returned in
        // custom protocol activation case on Windows Phone 8.1 causing "No such interface supported" exception
        // on cloning.
        if ((!(i in retVal) || retVal[i] !== obj[i]) && typeof obj[i] !== 'undefined' && typeof obj[i] !== 'unknown') { // eslint-disable-line valid-typeof
            retVal[i] = utils.clone(obj[i]);
        }
    }
    return retVal;
};

/**
 * Returns a wrapped version of the function
 */
utils.close = function (context, func, params) {
    return function () {
        var args = params || arguments;
        return func.apply(context, args);
    };
};

// ------------------------------------------------------------------------------
function UUIDcreatePart (length) {
    var uuidpart = '';
    for (var i = 0; i < length; i++) {
        var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
        if (uuidchar.length === 1) {
            uuidchar = '0' + uuidchar;
        }
        uuidpart += uuidchar;
    }
    return uuidpart;
}

/**
 * Create a UUID
 */
utils.createUUID = function () {
    return UUIDcreatePart(4) + '-' +
        UUIDcreatePart(2) + '-' +
        UUIDcreatePart(2) + '-' +
        UUIDcreatePart(2) + '-' +
        UUIDcreatePart(6);
};

/**
 * Extends a child object from a parent object using classical inheritance
 * pattern.
 */
utils.extend = (function () {
    // proxy used to establish prototype chain
    var F = function () {};
    // extend Child from Parent
    return function (Child, Parent) {

        F.prototype = Parent.prototype;
        Child.prototype = new F();
        Child.__super__ = Parent.prototype;
        Child.prototype.constructor = Child;
    };
}());

/**
 * Alerts a message in any available way: alert or console.log.
 */
utils.alert = function (msg) {
    if (window.alert) {
        window.alert(msg);
    } else if (console && console.log) {
        console.log(msg);
    }
};

});

window.cordova = require('cordova');
// file: src/scripts/bootstrap.js
require('cordova/init');

})();
cordova.define('cordova/plugin_list', function (require, exports, module) {
            module.exports = [
    {
        "file": "plugins/cordova-plugin-file/www/DirectoryEntry.js",
        "id": "cordova-plugin-file.DirectoryEntry",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.DirectoryEntry"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/DirectoryReader.js",
        "id": "cordova-plugin-file.DirectoryReader",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.DirectoryReader"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/Entry.js",
        "id": "cordova-plugin-file.Entry",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.Entry"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/File.js",
        "id": "cordova-plugin-file.File",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.File"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/FileEntry.js",
        "id": "cordova-plugin-file.FileEntry",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.FileEntry"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/FileError.js",
        "id": "cordova-plugin-file.FileError",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.FileError"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/FileReader.js",
        "id": "cordova-plugin-file.FileReader",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.FileReader"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/FileSystem.js",
        "id": "cordova-plugin-file.FileSystem",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.FileSystem"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/FileUploadOptions.js",
        "id": "cordova-plugin-file.FileUploadOptions",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.FileUploadOptions"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/FileUploadResult.js",
        "id": "cordova-plugin-file.FileUploadResult",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.FileUploadResult"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/FileWriter.js",
        "id": "cordova-plugin-file.FileWriter",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.FileWriter"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/Flags.js",
        "id": "cordova-plugin-file.Flags",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.Flags"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/LocalFileSystem.js",
        "id": "cordova-plugin-file.LocalFileSystem",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.LocalFileSystem"
        ],
        "merges": [
            "window"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/Metadata.js",
        "id": "cordova-plugin-file.Metadata",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.Metadata"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/ProgressEvent.js",
        "id": "cordova-plugin-file.ProgressEvent",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.ProgressEvent"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/fileSystems.js",
        "id": "cordova-plugin-file.fileSystems",
        "pluginId": "cordova-plugin-file"
    },
    {
        "file": "plugins/cordova-plugin-file/www/requestFileSystem.js",
        "id": "cordova-plugin-file.requestFileSystem",
        "pluginId": "cordova-plugin-file",
        "clobbers": [
            "window.requestFileSystem"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js",
        "id": "cordova-plugin-file.resolveLocalFileSystemURI",
        "pluginId": "cordova-plugin-file",
        "merges": [
            "window"
        ]
    },
    {
        "file": "plugins/cordova-plugin-file/www/browser/isChrome.js",
        "id": "cordova-plugin-file.isChrome",
        "pluginId": "cordova-plugin-file",
        "runs": true
    },
    {
        "file": "plugins/cordova-plugin-file/www/browser/Preparing.js",
        "id": "cordova-plugin-file.Preparing",
        "pluginId": "cordova-plugin-file",
        "runs": true
    },
    {
        "file": "plugins/cordova-plugin-file/src/browser/FileProxy.js",
        "id": "cordova-plugin-file.browserFileProxy",
        "pluginId": "cordova-plugin-file",
        "runs": true
    },
    {
        "file": "plugins/cordova-plugin-file/www/fileSystemPaths.js",
        "id": "cordova-plugin-file.fileSystemPaths",
        "pluginId": "cordova-plugin-file",
        "merges": [
            "cordova"
        ],
        "runs": true
    },
    {
        "file": "plugins/cordova-plugin-file/www/browser/FileSystem.js",
        "id": "cordova-plugin-file.firefoxFileSystem",
        "pluginId": "cordova-plugin-file",
        "merges": [
            "window.FileSystem"
        ]
    },
    {
        "file": "plugins/cordova-plugin-kiwibridge/www/AppManager.js",
        "id": "cordova-plugin-kiwibridge.kiwiApp",
        "pluginId": "cordova-plugin-kiwibridge",
        "merges": [
            "cordova.plugins.kiwiApp"
        ]
    },
    {
        "file": "plugins/cordova-plugin-kiwibridge/www/ControlManager.js",
        "id": "cordova-plugin-kiwibridge.kiwiControl",
        "pluginId": "cordova-plugin-kiwibridge",
        "merges": [
            "cordova.plugins.kiwiControl"
        ]
    },
    {
        "file": "plugins/cordova-plugin-kiwibridge/www/DriveManager.js",
        "id": "cordova-plugin-kiwibridge.kiwiDrive",
        "pluginId": "cordova-plugin-kiwibridge",
        "merges": [
            "cordova.plugins.kiwiDrive"
        ]
    },
    {
        "file": "plugins/cordova-plugin-kiwibridge/www/FileTransferManager.js",
        "id": "cordova-plugin-kiwibridge.kiwiFileTransfer",
        "pluginId": "cordova-plugin-kiwibridge",
        "merges": [
            "cordova.plugins.kiwiFileTransfer"
        ]
    },
    {
        "file": "plugins/cordova-plugin-kiwibridge/www/FirmwareManager.js",
        "id": "cordova-plugin-kiwibridge.kiwiFirmware",
        "pluginId": "cordova-plugin-kiwibridge",
        "merges": [
            "cordova.plugins.kiwiFirmware"
        ]
    },
    {
        "file": "plugins/cordova-plugin-kiwibridge/www/MemoryManager.js",
        "id": "cordova-plugin-kiwibridge.kiwiMemory",
        "pluginId": "cordova-plugin-kiwibridge",
        "merges": [
            "cordova.plugins.kiwiMemory"
        ]
    },
    {
        "file": "plugins/cordova-plugin-kiwibridge/www/NetworkManager.js",
        "id": "cordova-plugin-kiwibridge.kiwiNetwork",
        "pluginId": "cordova-plugin-kiwibridge",
        "merges": [
            "cordova.plugins.kiwiNetwork"
        ]
    },
    {
        "file": "plugins/cordova-plugin-kiwibridge/www/PowerManager.js",
        "id": "cordova-plugin-kiwibridge.kiwiPower",
        "pluginId": "cordova-plugin-kiwibridge",
        "merges": [
            "cordova.plugins.kiwiPower"
        ]
    },
    {
        "file": "plugins/cordova-plugin-kiwibridge/www/ScreenManager.js",
        "id": "cordova-plugin-kiwibridge.kiwiScreen",
        "pluginId": "cordova-plugin-kiwibridge",
        "merges": [
            "cordova.plugins.kiwiScreen"
        ]
    },
    {
        "file": "plugins/cordova-plugin-kiwibridge/www/SensorManager.js",
        "id": "cordova-plugin-kiwibridge.kiwiSensor",
        "pluginId": "cordova-plugin-kiwibridge",
        "merges": [
            "cordova.plugins.kiwiSensor"
        ]
    },
    {
        "file": "plugins/cordova-plugin-kiwibridge/www/SoundManager.js",
        "id": "cordova-plugin-kiwibridge.kiwiSound",
        "pluginId": "cordova-plugin-kiwibridge",
        "merges": [
            "cordova.plugins.kiwiSound"
        ]
    },
    {
        "file": "plugins/cordova-plugin-kiwibridge/www/TimeManager.js",
        "id": "cordova-plugin-kiwibridge.kiwiTime",
        "pluginId": "cordova-plugin-kiwibridge",
        "merges": [
            "cordova.plugins.kiwiTime"
        ]
    },
    {
        "file": "plugins/cordova-plugin-zip/zip.js",
        "id": "cordova-plugin-zip.Zip",
        "pluginId": "cordova-plugin-zip",
        "clobbers": [
            "zip"
        ]
    }
];

            module.exports.metadata =
            // TOP OF METADATA
            {
    "cordova-plugin-file": "6.0.2",
    "cordova-plugin-kiwibridge": "1.0.0",
    "cordova-plugin-whitelist": "1.3.4",
    "cordova-plugin-zip": "3.1.0"
}
            // BOTTOM OF METADATA
        });<html>
	<head>
		<script>window.location = 'htmlApp/index.html';</script>
	</head>
</html>
{
  "background_color": "#FFF",
  "display": "standalone",
  "orientation": "any",
  "start_url": "index.html",
  "name": "Kiwi Light",
  "short_name": "Kiwi Light",
  "version": "cz.kiwi.android.light",
  "description": "Kiwi native-cordova bridge app.",
  "author": "JaromÃ­r SmrÄ�ek",
  "icons": []
}{
  "main": "cdv-electron-main.js",
  "name": "cz.kiwi.android.light",
  "displayName": "Kiwi Light",
  "version": "1.0.0",
  "description": "Kiwi native-cordova bridge app.",
  "dependencies": {
    "cordova-android": "^8.1.0",
    "cordova-electron": "^1.1.1",
    "cordova-plugin-file": "^6.0.2",
    "cordova-plugin-whitelist": "^1.3.4",
    "cordova-plugin-zip": "^3.1.0",
    "kiwibridge": "file:../plugins/bridge",
    "whitelist": "^1.0.2"
  },
  "homepage": "https://cordova.io",
  "license": "Apache-2.0",
  "author": {
    "name": "JaromÃ­r SmrÄ�ek",
    "email": "4plague@gmail.com"
  }
}
<!DOCTYPE html>
<html>
    <head>
        <!-- Cordova connector -->
        <script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript">
            document.addEventListener("deviceready", function() {
                document.getElementById("deviceready").innerText = "Device is ready";
                console.log("Device is ready");
            });
        </script>
        <style>
            button {
                min-width: 10em;
                font-size: x-large;
                display: block;
                margin: 1em;
            }
        </style>
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width, height=device-height">
    </head>

    <body>
        <p id="deviceready">Connecting to device..</p>
        <hr/>
        <script type="text/javascript" src="test.js"></script>
        <hr/>
        <br/>
        <hr/>
        <button onclick="window.resolveLocalFileSystemURL(cordova.file.externalCacheDirectory,
                            function(dir) { dir.getFile('_debug_dl_test.out', {create:false},
                                function(fileEntry) { fileEntry.remove(); })})">Delete d/l test file</button>
        <hr/>
        <table>
            <tr>
                <td><h2>Panic buttons:</h2></td>
                <td><button onclick="btnClick('kiwiScreen', [ 'setOrientation', 'Clockwise0' ])">Orientation 0</button></td>
                <td><button onclick="btnClick('kiwiControl', [ 'setLocalLock', { locked: false } ]);
                                     btnClick('kiwiControl', [ 'setRemoteLock', { locked: false } ])">Unlock controls</button></td>
            </tr>
        </table>
        <hr/>
        Virtual keyboard window resizing test: <input>
    </body>
</html>
var API = [
    [ "kiwiApp", [
        [ "exit" ],
        [ "finishUpdate" ],
        [ "getUpdateUrl" ],
        [ "update", "https://update.ki-wi.cz/player-lighter/kiwi-lighter-1-dev.wgt" ]]],
    [ "kiwiControl", [
        [ "getLocalLock" ],
        [ "getRemoteLock" ],
        [ "setLocalLock", { locked: true, exceptions: { power: true } } ],
        [ "setRemoteLock", { locked: true } ]]],
    [ "kiwiDrive", [
        [ "getAllUnits" ]]],
    [ "kiwiFileTransfer", [
        [ "download", "/external-cache/_debug_dl_test.out", { url: "https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending", headers: { "X-Kiwi-Header": "test value" } } ]]],
//        [ "download", "/external-cache/_debug_dl_test.out", { url: "http://test.greenbytes.de/tech/tc/httpredirects/t301loc.asis" } ]]],
    [ "kiwiFirmware", [
        [ "getInterfaceVersion" ],
        [ "getManufacturer" ],
        [ "getModelName" ],
        [ "getSerialNumber" ],
        [ "getVersion" ],
        [ "update", { size: "350358", url: "http://share.ki-wi.cz/ajXE/download" } ]]],
//        [ "update", { size: "350358", url: "http://router/app-debug.apk" } ]]],
    [ "kiwiMemory", [
        [ "getInfo" ]]],
    [ "kiwiNetwork", [
        [ "getAllConnections" ]]],
    [ "kiwiPower", [
        [ "createTimers", [  // 0 - Sunday
            { "command": "On", "day": 5, "hour": 23, "minute": 44, "second": 0 }
        ]],
        [ "deleteAllTimers" ],
        [ "getBootDate" ],
        [ "reboot" ],
        [ "shutdown" ]]],
    [ "kiwiScreen", [
        [ "createScreenshot" ],
        [ "getBrightness" ],
        [ "getOrientation" ],
        [ "setOrientation", "Clockwise180" ]]],
    [ "kiwiSensor", [
        [ "getTemperature" ]]],
    [ "kiwiSound", [
        [ "getVolume" ],
        [ "isMuted" ],
        [ "setVolume", 0.5 ]]],
    [ "kiwiTime", [
        [ "getZone" ]]]
];
API.forEach(generateManager);

function generateManager(item) {
    var manager = document.createElement("h2");
    manager.innerHTML = item[0];
    document.body.appendChild(manager);
    item[1].forEach(generateButtons.bind(null, item[0]));
}

function generateButtons(manager, item) {
    var button = document.createElement("button");
    button.innerHTML = item[0];
    button.onclick = btnClick.bind(null, manager, item);
    document.body.appendChild(button);
}

function btnClick(manager, callspec) {
    var method = callspec[0];
    console.log("JS: Calling " + manager+"."+method);
    var plugin = cordova.plugins[manager];
    if (plugin === undefined) {
        alert(manager + " plugin not defined");
        return;
    }
    var func = plugin[method];
    if (func === undefined) {
        alert(method + " not defined in " + manager);
        return;
    }
    var callbacks = [ function (data) { alert("Android result:\n" + JSON.stringify(data)); },
                      function (error) { alert("Android error:\n" + JSON.stringify(error)); } ];
    var args = callbacks.concat(callspec.slice(1));
    func.apply(null, args);
}

window.addEventListener("kiwiControl.buttonDown", function(customEvent) {
    alert("Asynchronous event kiwiControl.buttonDown: " + customEvent.detail.button);
}, false);
cordova.define('cordova-plugin-zip.Zip', function (require, exports, module) {
                var exec = cordova.require('cordova/exec');

function newProgressEvent(result) {
    var event = {
            loaded: result.loaded,
            total: result.total
    };
    return event;
}

exports.unzip = function(fileName, outputDirectory, callback, progressCallback) {
    var win = function(result) {
        if (result && typeof result.loaded != "undefined") {
            if (progressCallback) {
                return progressCallback(newProgressEvent(result));
            }
        } else if (callback) {
            callback(0);
        }
    };
    var fail = function(result) {
        if (callback) {
            callback(-1);
        }
    };
    exec(win, fail, 'Zip', 'unzip', [fileName, outputDirectory]);
};
            });cordova.define('cordova-plugin-kiwibridge.kiwiApp', function (require, exports, module) {
                /**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function AppManager() {}

AppManager.prototype.exit = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "AppManager", "exit");
};

AppManager.prototype.finishUpdate = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "AppManager", "finishUpdate");
};

AppManager.prototype.getUpdateUrl = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "AppManager", "getUpdateUrl");
};

AppManager.prototype.update = function(successCallback, errorCallback, url) {
	exec(successCallback, errorCallback, "AppManager", "update", [url]);
};

module.exports = new AppManager();

            });cordova.define('cordova-plugin-kiwibridge.kiwiControl', function (require, exports, module) {
                /**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function ControlManager() {}

ControlManager.prototype.getLocalLock = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "ControlManager", "getLocalLock");
};

ControlManager.prototype.getRemoteLock = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "ControlManager", "getRemoteLock");
};

ControlManager.prototype.setLocalLock = function(successCallback, errorCallback, lock) {
	exec(successCallback, errorCallback, "ControlManager", "setLocalLock", [lock]);
};

ControlManager.prototype.setRemoteLock = function(successCallback, errorCallback, lock) {
	exec(successCallback, errorCallback, "ControlManager", "setRemoteLock", [lock]);
};

module.exports = new ControlManager();

            });cordova.define('cordova-plugin-kiwibridge.kiwiDrive', function (require, exports, module) {
                /**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function DriveManager() {}

DriveManager.prototype.getAllUnits = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "DriveManager", "getAllUnits");
};

module.exports = new DriveManager();

            });cordova.define('cordova-plugin-kiwibridge.kiwiFileTransfer', function (require, exports, module) {
                /**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function FileTransferManager() {}

FileTransferManager.prototype.download = function(successCallback, errorCallback, destination, request) {
	exec(successCallback, errorCallback, "FileTransferManager", "download", [destination, request]);
};

module.exports = new FileTransferManager();

            });cordova.define('cordova-plugin-kiwibridge.kiwiFirmware', function (require, exports, module) {
                /**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function FirmwareManager() {}

FirmwareManager.prototype.getInterfaceVersion = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "FirmwareManager", "getInterfaceVersion");
};

FirmwareManager.prototype.getManufacturer = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "FirmwareManager", "getManufacturer");
};

FirmwareManager.prototype.getModelName = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "FirmwareManager", "getModelName");
};

FirmwareManager.prototype.getSerialNumber = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "FirmwareManager", "getSerialNumber");
};

FirmwareManager.prototype.getVersion = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "FirmwareManager", "getVersion");
};

FirmwareManager.prototype.update = function(successCallback, errorCallback, release) {
	exec(successCallback, errorCallback, "FirmwareManager", "update", [release]);
};

module.exports = new FirmwareManager();

            });cordova.define('cordova-plugin-kiwibridge.kiwiMemory', function (require, exports, module) {
                /**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function MemoryManager() {}

MemoryManager.prototype.getInfo = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "MemoryManager", "getInfo");
};

module.exports = new MemoryManager();

            });cordova.define('cordova-plugin-kiwibridge.kiwiNetwork', function (require, exports, module) {
                /**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function NetworkManager() {}

NetworkManager.prototype.getAllConnections = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "NetworkManager", "getAllConnections");
};

module.exports = new NetworkManager();

            });cordova.define('cordova-plugin-kiwibridge.kiwiPower', function (require, exports, module) {
                /**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function PowerManager() {}

PowerManager.prototype.createTimers = function(successCallback, errorCallback, timers) {
    exec(successCallback, errorCallback, "PowerManager", "createTimers", [timers]);
};

PowerManager.prototype.deleteAllTimers = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "PowerManager", "deleteAllTimers");
};

PowerManager.prototype.getBootDate = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "PowerManager", "getBootDate");
};

PowerManager.prototype.reboot = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "PowerManager", "reboot");
};

PowerManager.prototype.shutdown = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "PowerManager", "shutdown");
};

module.exports = new PowerManager();

            });cordova.define('cordova-plugin-kiwibridge.kiwiScreen', function (require, exports, module) {
                /**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function ScreenManager() {}

ScreenManager.prototype.createScreenshot = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "ScreenManager", "createScreenshot");
};

ScreenManager.prototype.getBrightness = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "ScreenManager", "getBrightness");
};

ScreenManager.prototype.getOrientation = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "ScreenManager", "getOrientation");
};

ScreenManager.prototype.setOrientation = function(successCallback, errorCallback, orientation) {
	exec(successCallback, errorCallback, "ScreenManager", "setOrientation", [orientation]);
};

module.exports = new ScreenManager();

            });cordova.define('cordova-plugin-kiwibridge.kiwiSensor', function (require, exports, module) {
                /**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function SensorManager() {}

SensorManager.prototype.getTemperature = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "SensorManager", "getTemperature");
};

module.exports = new SensorManager();

            });cordova.define('cordova-plugin-kiwibridge.kiwiSound', function (require, exports, module) {
                /**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function SoundManager() {}

SoundManager.prototype.getVolume = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "SoundManager", "getVolume");
};

SoundManager.prototype.isMuted = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "SoundManager", "isMuted");
};

SoundManager.prototype.setVolume = function(successCallback, errorCallback, volume) {
	exec(successCallback, errorCallback, "SoundManager", "setVolume", [volume]);
};

module.exports = new SoundManager();

            });cordova.define('cordova-plugin-kiwibridge.kiwiTime', function (require, exports, module) {
                /**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function TimeManager() {}

TimeManager.prototype.getZone = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "TimeManager", "getZone");
};

module.exports = new TimeManager();

            });cordova.define('cordova-plugin-file.DirectoryEntry', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var argscheck = require('cordova/argscheck');
var utils = require('cordova/utils');
var exec = require('cordova/exec');
var Entry = require('./Entry');
var FileError = require('./FileError');
var DirectoryReader = require('./DirectoryReader');

/**
 * An interface representing a directory on the file system.
 *
 * {boolean} isFile always false (readonly)
 * {boolean} isDirectory always true (readonly)
 * {DOMString} name of the directory, excluding the path leading to it (readonly)
 * {DOMString} fullPath the absolute full path to the directory (readonly)
 * {FileSystem} filesystem on which the directory resides (readonly)
 */
var DirectoryEntry = function (name, fullPath, fileSystem, nativeURL) {

    // add trailing slash if it is missing
    if ((fullPath) && !/\/$/.test(fullPath)) {
        fullPath += '/';
    }
    // add trailing slash if it is missing
    if (nativeURL && !/\/$/.test(nativeURL)) {
        nativeURL += '/';
    }
    DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath, fileSystem, nativeURL);
};

utils.extend(DirectoryEntry, Entry);

/**
 * Creates a new DirectoryReader to read entries from this directory
 */
DirectoryEntry.prototype.createReader = function () {
    return new DirectoryReader(this.toInternalURL());
};

/**
 * Creates or looks up a directory
 *
 * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory
 * @param {Flags} options to create or exclusively create the directory
 * @param {Function} successCallback is called with the new entry
 * @param {Function} errorCallback is called with a FileError
 */
DirectoryEntry.prototype.getDirectory = function (path, options, successCallback, errorCallback) {
    argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments);
    var fs = this.filesystem;
    var win = successCallback && function (result) {
        var entry = new DirectoryEntry(result.name, result.fullPath, fs, result.nativeURL);
        successCallback(entry);
    };
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(win, fail, 'File', 'getDirectory', [this.toInternalURL(), path, options]);
};

/**
 * Deletes a directory and all of it's contents
 *
 * @param {Function} successCallback is called with no parameters
 * @param {Function} errorCallback is called with a FileError
 */
DirectoryEntry.prototype.removeRecursively = function (successCallback, errorCallback) {
    argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments);
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(successCallback, fail, 'File', 'removeRecursively', [this.toInternalURL()]);
};

/**
 * Creates or looks up a file
 *
 * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file
 * @param {Flags} options to create or exclusively create the file
 * @param {Function} successCallback is called with the new entry
 * @param {Function} errorCallback is called with a FileError
 */
DirectoryEntry.prototype.getFile = function (path, options, successCallback, errorCallback) {
    argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments);
    var fs = this.filesystem;
    var win = successCallback && function (result) {
        var FileEntry = require('./FileEntry');
        var entry = new FileEntry(result.name, result.fullPath, fs, result.nativeURL);
        successCallback(entry);
    };
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(win, fail, 'File', 'getFile', [this.toInternalURL(), path, options]);
};

module.exports = DirectoryEntry;

            });cordova.define('cordova-plugin-file.DirectoryReader', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var exec = require('cordova/exec');
var FileError = require('./FileError');

/**
 * An interface that lists the files and directories in a directory.
 */
function DirectoryReader (localURL) {
    this.localURL = localURL || null;
    this.hasReadEntries = false;
}

/**
 * Returns a list of entries from a directory.
 *
 * @param {Function} successCallback is called with a list of entries
 * @param {Function} errorCallback is called with a FileError
 */
DirectoryReader.prototype.readEntries = function (successCallback, errorCallback) {
    // If we've already read and passed on this directory's entries, return an empty list.
    if (this.hasReadEntries) {
        successCallback([]);
        return;
    }
    var reader = this;
    var win = typeof successCallback !== 'function' ? null : function (result) {
        var retVal = [];
        for (var i = 0; i < result.length; i++) {
            var entry = null;
            if (result[i].isDirectory) {
                entry = new (require('./DirectoryEntry'))();
            } else if (result[i].isFile) {
                entry = new (require('./FileEntry'))();
            }
            entry.isDirectory = result[i].isDirectory;
            entry.isFile = result[i].isFile;
            entry.name = result[i].name;
            entry.fullPath = result[i].fullPath;
            entry.filesystem = new (require('./FileSystem'))(result[i].filesystemName);
            entry.nativeURL = result[i].nativeURL;
            retVal.push(entry);
        }
        reader.hasReadEntries = true;
        successCallback(retVal);
    };
    var fail = typeof errorCallback !== 'function' ? null : function (code) {
        errorCallback(new FileError(code));
    };
    exec(win, fail, 'File', 'readEntries', [this.localURL]);
};

module.exports = DirectoryReader;

            });cordova.define('cordova-plugin-file.Entry', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var argscheck = require('cordova/argscheck');
var exec = require('cordova/exec');
var FileError = require('./FileError');
var Metadata = require('./Metadata');

/**
 * Represents a file or directory on the local file system.
 *
 * @param isFile
 *            {boolean} true if Entry is a file (readonly)
 * @param isDirectory
 *            {boolean} true if Entry is a directory (readonly)
 * @param name
 *            {DOMString} name of the file or directory, excluding the path
 *            leading to it (readonly)
 * @param fullPath
 *            {DOMString} the absolute full path to the file or directory
 *            (readonly)
 * @param fileSystem
 *            {FileSystem} the filesystem on which this entry resides
 *            (readonly)
 * @param nativeURL
 *            {DOMString} an alternate URL which can be used by native
 *            webview controls, for example media players.
 *            (optional, readonly)
 */
function Entry (isFile, isDirectory, name, fullPath, fileSystem, nativeURL) {
    this.isFile = !!isFile;
    this.isDirectory = !!isDirectory;
    this.name = name || '';
    this.fullPath = fullPath || '';
    this.filesystem = fileSystem || null;
    this.nativeURL = nativeURL || null;
}

/**
 * Look up the metadata of the entry.
 *
 * @param successCallback
 *            {Function} is called with a Metadata object
 * @param errorCallback
 *            {Function} is called with a FileError
 */
Entry.prototype.getMetadata = function (successCallback, errorCallback) {
    argscheck.checkArgs('FF', 'Entry.getMetadata', arguments);
    var success = successCallback && function (entryMetadata) {
        var metadata = new Metadata({
            size: entryMetadata.size,
            modificationTime: entryMetadata.lastModifiedDate
        });
        successCallback(metadata);
    };
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(success, fail, 'File', 'getFileMetadata', [this.toInternalURL()]);
};

/**
 * Set the metadata of the entry.
 *
 * @param successCallback
 *            {Function} is called with a Metadata object
 * @param errorCallback
 *            {Function} is called with a FileError
 * @param metadataObject
 *            {Object} keys and values to set
 */
Entry.prototype.setMetadata = function (successCallback, errorCallback, metadataObject) {
    argscheck.checkArgs('FFO', 'Entry.setMetadata', arguments);
    exec(successCallback, errorCallback, 'File', 'setMetadata', [this.toInternalURL(), metadataObject]);
};

/**
 * Move a file or directory to a new location.
 *
 * @param parent
 *            {DirectoryEntry} the directory to which to move this entry
 * @param newName
 *            {DOMString} new name of the entry, defaults to the current name
 * @param successCallback
 *            {Function} called with the new DirectoryEntry object
 * @param errorCallback
 *            {Function} called with a FileError
 */
Entry.prototype.moveTo = function (parent, newName, successCallback, errorCallback) {
    argscheck.checkArgs('oSFF', 'Entry.moveTo', arguments);
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    var srcURL = this.toInternalURL();
    // entry name
    var name = newName || this.name;
    var success = function (entry) {
        if (entry) {
            if (successCallback) {
                // create appropriate Entry object
                var newFSName = entry.filesystemName || (entry.filesystem && entry.filesystem.name);
                var fs = newFSName ? new FileSystem(newFSName, { name: '', fullPath: '/' }) : new FileSystem(parent.filesystem.name, { name: '', fullPath: '/' }); // eslint-disable-line no-undef
                var result = (entry.isDirectory) ? new (require('./DirectoryEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL) : new (require('cordova-plugin-file.FileEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL);
                successCallback(result);
            }
        } else {
            // no Entry object returned
            if (fail) {
                fail(FileError.NOT_FOUND_ERR);
            }
        }
    };

    // copy
    exec(success, fail, 'File', 'moveTo', [srcURL, parent.toInternalURL(), name]);
};

/**
 * Copy a directory to a different location.
 *
 * @param parent
 *            {DirectoryEntry} the directory to which to copy the entry
 * @param newName
 *            {DOMString} new name of the entry, defaults to the current name
 * @param successCallback
 *            {Function} called with the new Entry object
 * @param errorCallback
 *            {Function} called with a FileError
 */
Entry.prototype.copyTo = function (parent, newName, successCallback, errorCallback) {
    argscheck.checkArgs('oSFF', 'Entry.copyTo', arguments);
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    var srcURL = this.toInternalURL();
        // entry name
    var name = newName || this.name;
    // success callback
    var success = function (entry) {
        if (entry) {
            if (successCallback) {
                // create appropriate Entry object
                var newFSName = entry.filesystemName || (entry.filesystem && entry.filesystem.name);
                var fs = newFSName ? new FileSystem(newFSName, { name: '', fullPath: '/' }) : new FileSystem(parent.filesystem.name, { name: '', fullPath: '/' }); // eslint-disable-line no-undef
                var result = (entry.isDirectory) ? new (require('./DirectoryEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL) : new (require('cordova-plugin-file.FileEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL);
                successCallback(result);
            }
        } else {
            // no Entry object returned
            if (fail) {
                fail(FileError.NOT_FOUND_ERR);
            }
        }
    };

    // copy
    exec(success, fail, 'File', 'copyTo', [srcURL, parent.toInternalURL(), name]);
};

/**
 * Return a URL that can be passed across the bridge to identify this entry.
 */
Entry.prototype.toInternalURL = function () {
    if (this.filesystem && this.filesystem.__format__) {
        return this.filesystem.__format__(this.fullPath, this.nativeURL);
    }
};

/**
 * Return a URL that can be used to identify this entry.
 * Use a URL that can be used to as the src attribute of a <video> or
 * <audio> tag. If that is not possible, construct a cdvfile:// URL.
 */
Entry.prototype.toURL = function () {
    if (this.nativeURL) {
        return this.nativeURL;
    }
    // fullPath attribute may contain the full URL in the case that
    // toInternalURL fails.
    return this.toInternalURL() || 'file://localhost' + this.fullPath;
};

/**
 * Backwards-compatibility: In v1.0.0 - 1.0.2, .toURL would only return a
 * cdvfile:// URL, and this method was necessary to obtain URLs usable by the
 * webview.
 * See CB-6051, CB-6106, CB-6117, CB-6152, CB-6199, CB-6201, CB-6243, CB-6249,
 * and CB-6300.
 */
Entry.prototype.toNativeURL = function () {
    console.log("DEPRECATED: Update your code to use 'toURL'");
    return this.toURL();
};

/**
 * Returns a URI that can be used to identify this entry.
 *
 * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI.
 * @return uri
 */
Entry.prototype.toURI = function (mimeType) {
    console.log("DEPRECATED: Update your code to use 'toURL'");
    return this.toURL();
};

/**
 * Remove a file or directory. It is an error to attempt to delete a
 * directory that is not empty. It is an error to attempt to delete a
 * root directory of a file system.
 *
 * @param successCallback {Function} called with no parameters
 * @param errorCallback {Function} called with a FileError
 */
Entry.prototype.remove = function (successCallback, errorCallback) {
    argscheck.checkArgs('FF', 'Entry.remove', arguments);
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(successCallback, fail, 'File', 'remove', [this.toInternalURL()]);
};

/**
 * Look up the parent DirectoryEntry of this entry.
 *
 * @param successCallback {Function} called with the parent DirectoryEntry object
 * @param errorCallback {Function} called with a FileError
 */
Entry.prototype.getParent = function (successCallback, errorCallback) {
    argscheck.checkArgs('FF', 'Entry.getParent', arguments);
    var fs = this.filesystem;
    var win = successCallback && function (result) {
        var DirectoryEntry = require('./DirectoryEntry');
        var entry = new DirectoryEntry(result.name, result.fullPath, fs, result.nativeURL);
        successCallback(entry);
    };
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(win, fail, 'File', 'getParent', [this.toInternalURL()]);
};

module.exports = Entry;

            });cordova.define('cordova-plugin-file.File', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/**
 * Constructor.
 * name {DOMString} name of the file, without path information
 * fullPath {DOMString} the full path of the file, including the name
 * type {DOMString} mime type
 * lastModifiedDate {Date} last modified date
 * size {Number} size of the file in bytes
 */

var File = function (name, localURL, type, lastModifiedDate, size) {
    this.name = name || '';
    this.localURL = localURL || null;
    this.type = type || null;
    this.lastModified = lastModifiedDate || null;
    // For backwards compatibility, store the timestamp in lastModifiedDate as well
    this.lastModifiedDate = lastModifiedDate || null;
    this.size = size || 0;

    // These store the absolute start and end for slicing the file.
    this.start = 0;
    this.end = this.size;
};

/**
 * Returns a "slice" of the file. Since Cordova Files don't contain the actual
 * content, this really returns a File with adjusted start and end.
 * Slices of slices are supported.
 * start {Number} The index at which to start the slice (inclusive).
 * end {Number} The index at which to end the slice (exclusive).
 */
File.prototype.slice = function (start, end) {
    var size = this.end - this.start;
    var newStart = 0;
    var newEnd = size;
    if (arguments.length) {
        if (start < 0) {
            newStart = Math.max(size + start, 0);
        } else {
            newStart = Math.min(size, start);
        }
    }

    if (arguments.length >= 2) {
        if (end < 0) {
            newEnd = Math.max(size + end, 0);
        } else {
            newEnd = Math.min(end, size);
        }
    }

    var newFile = new File(this.name, this.localURL, this.type, this.lastModified, this.size);
    newFile.start = this.start + newStart;
    newFile.end = this.start + newEnd;
    return newFile;
};

module.exports = File;

            });cordova.define('cordova-plugin-file.FileEntry', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var utils = require('cordova/utils');
var exec = require('cordova/exec');
var Entry = require('./Entry');
var FileWriter = require('./FileWriter');
var File = require('./File');
var FileError = require('./FileError');

/**
 * An interface representing a file on the file system.
 *
 * {boolean} isFile always true (readonly)
 * {boolean} isDirectory always false (readonly)
 * {DOMString} name of the file, excluding the path leading to it (readonly)
 * {DOMString} fullPath the absolute full path to the file (readonly)
 * {FileSystem} filesystem on which the file resides (readonly)
 */
var FileEntry = function (name, fullPath, fileSystem, nativeURL) {
    // remove trailing slash if it is present
    if (fullPath && /\/$/.test(fullPath)) {
        fullPath = fullPath.substring(0, fullPath.length - 1);
    }
    if (nativeURL && /\/$/.test(nativeURL)) {
        nativeURL = nativeURL.substring(0, nativeURL.length - 1);
    }

    FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath, fileSystem, nativeURL]);
};

utils.extend(FileEntry, Entry);

/**
 * Creates a new FileWriter associated with the file that this FileEntry represents.
 *
 * @param {Function} successCallback is called with the new FileWriter
 * @param {Function} errorCallback is called with a FileError
 */
FileEntry.prototype.createWriter = function (successCallback, errorCallback) {
    this.file(function (filePointer) {
        var writer = new FileWriter(filePointer);

        if (writer.localURL === null || writer.localURL === '') {
            if (errorCallback) {
                errorCallback(new FileError(FileError.INVALID_STATE_ERR));
            }
        } else {
            if (successCallback) {
                successCallback(writer);
            }
        }
    }, errorCallback);
};

/**
 * Returns a File that represents the current state of the file that this FileEntry represents.
 *
 * @param {Function} successCallback is called with the new File object
 * @param {Function} errorCallback is called with a FileError
 */
FileEntry.prototype.file = function (successCallback, errorCallback) {
    var localURL = this.toInternalURL();
    var win = successCallback && function (f) {
        var file = new File(f.name, localURL, f.type, f.lastModifiedDate, f.size);
        successCallback(file);
    };
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(win, fail, 'File', 'getFileMetadata', [localURL]);
};

module.exports = FileEntry;

            });cordova.define('cordova-plugin-file.FileError', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/**
 * FileError
 */
function FileError (error) {
    this.code = error || null;
}

// File error codes
// Found in DOMException
FileError.NOT_FOUND_ERR = 1;
FileError.SECURITY_ERR = 2;
FileError.ABORT_ERR = 3;

// Added by File API specification
FileError.NOT_READABLE_ERR = 4;
FileError.ENCODING_ERR = 5;
FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
FileError.INVALID_STATE_ERR = 7;
FileError.SYNTAX_ERR = 8;
FileError.INVALID_MODIFICATION_ERR = 9;
FileError.QUOTA_EXCEEDED_ERR = 10;
FileError.TYPE_MISMATCH_ERR = 11;
FileError.PATH_EXISTS_ERR = 12;

module.exports = FileError;

            });cordova.define('cordova-plugin-file.FileReader', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var exec = require('cordova/exec');
var modulemapper = require('cordova/modulemapper');
var utils = require('cordova/utils');
var FileError = require('./FileError');
var ProgressEvent = require('./ProgressEvent');
var origFileReader = modulemapper.getOriginalSymbol(window, 'FileReader');

/**
 * This class reads the mobile device file system.
 *
 * For Android:
 *      The root directory is the root of the file system.
 *      To read from the SD card, the file name is "sdcard/my_file.txt"
 * @constructor
 */
var FileReader = function () {
    this._readyState = 0;
    this._error = null;
    this._result = null;
    this._progress = null;
    this._localURL = '';
    this._realReader = origFileReader ? new origFileReader() : {}; // eslint-disable-line new-cap
};

/**
 * Defines the maximum size to read at a time via the native API. The default value is a compromise between
 * minimizing the overhead of many exec() calls while still reporting progress frequently enough for large files.
 * (Note attempts to allocate more than a few MB of contiguous memory on the native side are likely to cause
 * OOM exceptions, while the JS engine seems to have fewer problems managing large strings or ArrayBuffers.)
 */
FileReader.READ_CHUNK_SIZE = 256 * 1024;

// States
FileReader.EMPTY = 0;
FileReader.LOADING = 1;
FileReader.DONE = 2;

utils.defineGetter(FileReader.prototype, 'readyState', function () {
    return this._localURL ? this._readyState : this._realReader.readyState;
});

utils.defineGetter(FileReader.prototype, 'error', function () {
    return this._localURL ? this._error : this._realReader.error;
});

utils.defineGetter(FileReader.prototype, 'result', function () {
    return this._localURL ? this._result : this._realReader.result;
});

function defineEvent (eventName) {
    utils.defineGetterSetter(FileReader.prototype, eventName, function () {
        return this._realReader[eventName] || null;
    }, function (value) {
        this._realReader[eventName] = value;
    });
}
defineEvent('onloadstart');    // When the read starts.
defineEvent('onprogress');     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total)
defineEvent('onload');         // When the read has successfully completed.
defineEvent('onerror');        // When the read has failed (see errors).
defineEvent('onloadend');      // When the request has completed (either in success or failure).
defineEvent('onabort');        // When the read has been aborted. For instance, by invoking the abort() method.

function initRead (reader, file) {
    // Already loading something
    if (reader.readyState === FileReader.LOADING) {
        throw new FileError(FileError.INVALID_STATE_ERR);
    }

    reader._result = null;
    reader._error = null;
    reader._progress = 0;
    reader._readyState = FileReader.LOADING;

    if (typeof file.localURL === 'string') {
        reader._localURL = file.localURL;
    } else {
        reader._localURL = '';
        return true;
    }

    if (reader.onloadstart) {
        reader.onloadstart(new ProgressEvent('loadstart', {target: reader}));
    }
}

/**
 * Callback used by the following read* functions to handle incremental or final success.
 * Must be bound to the FileReader's this along with all but the last parameter,
 * e.g. readSuccessCallback.bind(this, "readAsText", "UTF-8", offset, totalSize, accumulate)
 * @param readType The name of the read function to call.
 * @param encoding Text encoding, or null if this is not a text type read.
 * @param offset Starting offset of the read.
 * @param totalSize Total number of bytes or chars to read.
 * @param accumulate A function that takes the callback result and accumulates it in this._result.
 * @param r Callback result returned by the last read exec() call, or null to begin reading.
 */
function readSuccessCallback (readType, encoding, offset, totalSize, accumulate, r) {
    if (this._readyState === FileReader.DONE) {
        return;
    }

    var CHUNK_SIZE = FileReader.READ_CHUNK_SIZE;
    if (readType === 'readAsDataURL') {
        // Windows proxy does not support reading file slices as Data URLs
        // so read the whole file at once.
        CHUNK_SIZE = cordova.platformId === 'windows' ? totalSize : // eslint-disable-line no-undef
            // Calculate new chunk size for data URLs to be multiply of 3
            // Otherwise concatenated base64 chunks won't be valid base64 data
            FileReader.READ_CHUNK_SIZE - (FileReader.READ_CHUNK_SIZE % 3) + 3;
    }

    if (typeof r !== 'undefined') {
        accumulate(r);
        this._progress = Math.min(this._progress + CHUNK_SIZE, totalSize);

        if (typeof this.onprogress === 'function') {
            this.onprogress(new ProgressEvent('progress', {loaded: this._progress, total: totalSize}));
        }
    }

    if (typeof r === 'undefined' || this._progress < totalSize) {
        var execArgs = [
            this._localURL,
            offset + this._progress,
            offset + this._progress + Math.min(totalSize - this._progress, CHUNK_SIZE)];
        if (encoding) {
            execArgs.splice(1, 0, encoding);
        }
        exec(
            readSuccessCallback.bind(this, readType, encoding, offset, totalSize, accumulate),
            readFailureCallback.bind(this),
            'File', readType, execArgs);
    } else {
        this._readyState = FileReader.DONE;

        if (typeof this.onload === 'function') {
            this.onload(new ProgressEvent('load', {target: this}));
        }

        if (typeof this.onloadend === 'function') {
            this.onloadend(new ProgressEvent('loadend', {target: this}));
        }
    }
}

/**
 * Callback used by the following read* functions to handle errors.
 * Must be bound to the FileReader's this, e.g. readFailureCallback.bind(this)
 */
function readFailureCallback (e) {
    if (this._readyState === FileReader.DONE) {
        return;
    }

    this._readyState = FileReader.DONE;
    this._result = null;
    this._error = new FileError(e);

    if (typeof this.onerror === 'function') {
        this.onerror(new ProgressEvent('error', {target: this}));
    }

    if (typeof this.onloadend === 'function') {
        this.onloadend(new ProgressEvent('loadend', {target: this}));
    }
}

/**
 * Abort reading file.
 */
FileReader.prototype.abort = function () {
    if (origFileReader && !this._localURL) {
        return this._realReader.abort();
    }
    this._result = null;

    if (this._readyState === FileReader.DONE || this._readyState === FileReader.EMPTY) {
        return;
    }

    this._readyState = FileReader.DONE;

    // If abort callback
    if (typeof this.onabort === 'function') {
        this.onabort(new ProgressEvent('abort', {target: this}));
    }
    // If load end callback
    if (typeof this.onloadend === 'function') {
        this.onloadend(new ProgressEvent('loadend', {target: this}));
    }
};

/**
 * Read text file.
 *
 * @param file          {File} File object containing file properties
 * @param encoding      [Optional] (see http://www.iana.org/assignments/character-sets)
 */
FileReader.prototype.readAsText = function (file, encoding) {
    if (initRead(this, file)) {
        return this._realReader.readAsText(file, encoding);
    }

    // Default encoding is UTF-8
    var enc = encoding || 'UTF-8';

    var totalSize = file.end - file.start;
    readSuccessCallback.bind(this)('readAsText', enc, file.start, totalSize, function (r) {
        if (this._progress === 0) {
            this._result = '';
        }
        this._result += r;
    }.bind(this));
};

/**
 * Read file and return data as a base64 encoded data url.
 * A data url is of the form:
 *      data:[<mediatype>][;base64],<data>
 *
 * @param file          {File} File object containing file properties
 */
FileReader.prototype.readAsDataURL = function (file) {
    if (initRead(this, file)) {
        return this._realReader.readAsDataURL(file);
    }

    var totalSize = file.end - file.start;
    readSuccessCallback.bind(this)('readAsDataURL', null, file.start, totalSize, function (r) {
        var commaIndex = r.indexOf(',');
        if (this._progress === 0) {
            this._result = r;
        } else {
            this._result += r.substring(commaIndex + 1);
        }
    }.bind(this));
};

/**
 * Read file and return data as a binary data.
 *
 * @param file          {File} File object containing file properties
 */
FileReader.prototype.readAsBinaryString = function (file) {
    if (initRead(this, file)) {
        return this._realReader.readAsBinaryString(file);
    }

    var totalSize = file.end - file.start;
    readSuccessCallback.bind(this)('readAsBinaryString', null, file.start, totalSize, function (r) {
        if (this._progress === 0) {
            this._result = '';
        }
        this._result += r;
    }.bind(this));
};

/**
 * Read file and return data as a binary data.
 *
 * @param file          {File} File object containing file properties
 */
FileReader.prototype.readAsArrayBuffer = function (file) {
    if (initRead(this, file)) {
        return this._realReader.readAsArrayBuffer(file);
    }

    var totalSize = file.end - file.start;
    readSuccessCallback.bind(this)('readAsArrayBuffer', null, file.start, totalSize, function (r) {
        var resultArray = (this._progress === 0 ? new Uint8Array(totalSize) : new Uint8Array(this._result));
        resultArray.set(new Uint8Array(r), this._progress);
        this._result = resultArray.buffer;
    }.bind(this));
};

module.exports = FileReader;

            });cordova.define('cordova-plugin-file.FileSystem', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var DirectoryEntry = require('./DirectoryEntry');

/**
 * An interface representing a file system
 *
 * @constructor
 * {DOMString} name the unique name of the file system (readonly)
 * {DirectoryEntry} root directory of the file system (readonly)
 */
var FileSystem = function (name, root) {
    this.name = name;
    if (root) {
        this.root = new DirectoryEntry(root.name, root.fullPath, this, root.nativeURL);
    } else {
        this.root = new DirectoryEntry(this.name, '/', this);
    }
};

FileSystem.prototype.__format__ = function (fullPath, nativeUrl) {
    return fullPath;
};

FileSystem.prototype.toJSON = function () {
    return '<FileSystem: ' + this.name + '>';
};

// Use instead of encodeURI() when encoding just the path part of a URI rather than an entire URI.
FileSystem.encodeURIPath = function (path) {
    // Because # is a valid filename character, it must be encoded to prevent part of the
    // path from being parsed as a URI fragment.
    return encodeURI(path).replace(/#/g, '%23');
};

module.exports = FileSystem;

            });cordova.define('cordova-plugin-file.FileUploadOptions', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/**
 * Options to customize the HTTP request used to upload files.
 * @constructor
 * @param fileKey {String}   Name of file request parameter.
 * @param fileName {String}  Filename to be used by the server. Defaults to image.jpg.
 * @param mimeType {String}  Mimetype of the uploaded file. Defaults to image/jpeg.
 * @param params {Object}    Object with key: value params to send to the server.
 * @param headers {Object}   Keys are header names, values are header values. Multiple
 *                           headers of the same name are not supported.
 */
var FileUploadOptions = function (fileKey, fileName, mimeType, params, headers, httpMethod) {
    this.fileKey = fileKey || null;
    this.fileName = fileName || null;
    this.mimeType = mimeType || null;
    this.params = params || null;
    this.headers = headers || null;
    this.httpMethod = httpMethod || null;
};

module.exports = FileUploadOptions;

            });cordova.define('cordova-plugin-file.FileUploadResult', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/**
 * FileUploadResult
 * @constructor
 */
module.exports = function FileUploadResult (size, code, content) {
    this.bytesSent = size;
    this.responseCode = code;
    this.response = content;
};

            });cordova.define('cordova-plugin-file.FileWriter', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var exec = require('cordova/exec');
var FileError = require('./FileError');
var FileReader = require('./FileReader');
var ProgressEvent = require('./ProgressEvent');

/**
 * This class writes to the mobile device file system.
 *
 * For Android:
 *      The root directory is the root of the file system.
 *      To write to the SD card, the file name is "sdcard/my_file.txt"
 *
 * @constructor
 * @param file {File} File object containing file properties
 * @param append if true write to the end of the file, otherwise overwrite the file
 */
var FileWriter = function (file) {
    this.fileName = '';
    this.length = 0;
    if (file) {
        this.localURL = file.localURL || file;
        this.length = file.size || 0;
    }
    // default is to write at the beginning of the file
    this.position = 0;

    this.readyState = 0; // EMPTY

    this.result = null;

    // Error
    this.error = null;

    // Event handlers
    this.onwritestart = null;   // When writing starts
    this.onprogress = null;     // While writing the file, and reporting partial file data
    this.onwrite = null;        // When the write has successfully completed.
    this.onwriteend = null;     // When the request has completed (either in success or failure).
    this.onabort = null;        // When the write has been aborted. For instance, by invoking the abort() method.
    this.onerror = null;        // When the write has failed (see errors).
};

// States
FileWriter.INIT = 0;
FileWriter.WRITING = 1;
FileWriter.DONE = 2;

/**
 * Abort writing file.
 */
FileWriter.prototype.abort = function () {
    // check for invalid state
    if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) {
        throw new FileError(FileError.INVALID_STATE_ERR);
    }

    // set error
    this.error = new FileError(FileError.ABORT_ERR);

    this.readyState = FileWriter.DONE;

    // If abort callback
    if (typeof this.onabort === 'function') {
        this.onabort(new ProgressEvent('abort', {'target': this}));
    }

    // If write end callback
    if (typeof this.onwriteend === 'function') {
        this.onwriteend(new ProgressEvent('writeend', {'target': this}));
    }
};

/**
 * Writes data to the file
 *
 * @param data text or blob to be written
 * @param isPendingBlobReadResult {Boolean} true if the data is the pending blob read operation result
 */
FileWriter.prototype.write = function (data, isPendingBlobReadResult) {

    var that = this;
    var supportsBinary = (typeof window.Blob !== 'undefined' && typeof window.ArrayBuffer !== 'undefined');
    /* eslint-disable no-undef */
    var isProxySupportBlobNatively = (cordova.platformId === 'windows8' || cordova.platformId === 'windows');
    var isBinary;

    // Check to see if the incoming data is a blob
    if (data instanceof File || (!isProxySupportBlobNatively && supportsBinary && data instanceof Blob)) {
        var fileReader = new FileReader();
        /* eslint-enable no-undef */
        fileReader.onload = function () {
            // Call this method again, with the arraybuffer as argument
            FileWriter.prototype.write.call(that, this.result, true /* isPendingBlobReadResult */);
        };
        fileReader.onerror = function () {
            // DONE state
            that.readyState = FileWriter.DONE;

            // Save error
            that.error = this.error;

            // If onerror callback
            if (typeof that.onerror === 'function') {
                that.onerror(new ProgressEvent('error', {'target': that}));
            }

            // If onwriteend callback
            if (typeof that.onwriteend === 'function') {
                that.onwriteend(new ProgressEvent('writeend', {'target': that}));
            }
        };

        // WRITING state
        this.readyState = FileWriter.WRITING;

        if (supportsBinary) {
            fileReader.readAsArrayBuffer(data);
        } else {
            fileReader.readAsText(data);
        }
        return;
    }

    // Mark data type for safer transport over the binary bridge
    isBinary = supportsBinary && (data instanceof ArrayBuffer);
    if (isBinary && cordova.platformId === 'windowsphone') { // eslint-disable-line no-undef
        // create a plain array, using the keys from the Uint8Array view so that we can serialize it
        data = Array.apply(null, new Uint8Array(data));
    }

    // Throw an exception if we are already writing a file
    if (this.readyState === FileWriter.WRITING && !isPendingBlobReadResult) {
        throw new FileError(FileError.INVALID_STATE_ERR);
    }

    // WRITING state
    this.readyState = FileWriter.WRITING;

    var me = this;

    // If onwritestart callback
    if (typeof me.onwritestart === 'function') {
        me.onwritestart(new ProgressEvent('writestart', {'target': me}));
    }

    // Write file
    exec(
        // Success callback
        function (r) {
            // If DONE (cancelled), then don't do anything
            if (me.readyState === FileWriter.DONE) {
                return;
            }

            // position always increases by bytes written because file would be extended
            me.position += r;
            // The length of the file is now where we are done writing.

            me.length = me.position;

            // DONE state
            me.readyState = FileWriter.DONE;

            // If onwrite callback
            if (typeof me.onwrite === 'function') {
                me.onwrite(new ProgressEvent('write', {'target': me}));
            }

            // If onwriteend callback
            if (typeof me.onwriteend === 'function') {
                me.onwriteend(new ProgressEvent('writeend', {'target': me}));
            }
        },
        // Error callback
        function (e) {
            // If DONE (cancelled), then don't do anything
            if (me.readyState === FileWriter.DONE) {
                return;
            }

            // DONE state
            me.readyState = FileWriter.DONE;

            // Save error
            me.error = new FileError(e);

            // If onerror callback
            if (typeof me.onerror === 'function') {
                me.onerror(new ProgressEvent('error', {'target': me}));
            }

            // If onwriteend callback
            if (typeof me.onwriteend === 'function') {
                me.onwriteend(new ProgressEvent('writeend', {'target': me}));
            }
        }, 'File', 'write', [this.localURL, data, this.position, isBinary]);
};

/**
 * Moves the file pointer to the location specified.
 *
 * If the offset is a negative number the position of the file
 * pointer is rewound.  If the offset is greater than the file
 * size the position is set to the end of the file.
 *
 * @param offset is the location to move the file pointer to.
 */
FileWriter.prototype.seek = function (offset) {
    // Throw an exception if we are already writing a file
    if (this.readyState === FileWriter.WRITING) {
        throw new FileError(FileError.INVALID_STATE_ERR);
    }

    if (!offset && offset !== 0) {
        return;
    }

    // See back from end of file.
    if (offset < 0) {
        this.position = Math.max(offset + this.length, 0);
    // Offset is bigger than file size so set position
    // to the end of the file.
    } else if (offset > this.length) {
        this.position = this.length;
    // Offset is between 0 and file size so set the position
    // to start writing.
    } else {
        this.position = offset;
    }
};

/**
 * Truncates the file to the size specified.
 *
 * @param size to chop the file at.
 */
FileWriter.prototype.truncate = function (size) {
    // Throw an exception if we are already writing a file
    if (this.readyState === FileWriter.WRITING) {
        throw new FileError(FileError.INVALID_STATE_ERR);
    }

    // WRITING state
    this.readyState = FileWriter.WRITING;

    var me = this;

    // If onwritestart callback
    if (typeof me.onwritestart === 'function') {
        me.onwritestart(new ProgressEvent('writestart', {'target': this}));
    }

    // Write file
    exec(
        // Success callback
        function (r) {
            // If DONE (cancelled), then don't do anything
            if (me.readyState === FileWriter.DONE) {
                return;
            }

            // DONE state
            me.readyState = FileWriter.DONE;

            // Update the length of the file
            me.length = r;
            me.position = Math.min(me.position, r);

            // If onwrite callback
            if (typeof me.onwrite === 'function') {
                me.onwrite(new ProgressEvent('write', {'target': me}));
            }

            // If onwriteend callback
            if (typeof me.onwriteend === 'function') {
                me.onwriteend(new ProgressEvent('writeend', {'target': me}));
            }
        },
        // Error callback
        function (e) {
            // If DONE (cancelled), then don't do anything
            if (me.readyState === FileWriter.DONE) {
                return;
            }

            // DONE state
            me.readyState = FileWriter.DONE;

            // Save error
            me.error = new FileError(e);

            // If onerror callback
            if (typeof me.onerror === 'function') {
                me.onerror(new ProgressEvent('error', {'target': me}));
            }

            // If onwriteend callback
            if (typeof me.onwriteend === 'function') {
                me.onwriteend(new ProgressEvent('writeend', {'target': me}));
            }
        }, 'File', 'truncate', [this.localURL, size]);
};

module.exports = FileWriter;

            });cordova.define('cordova-plugin-file.Flags', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/**
 * Supplies arguments to methods that lookup or create files and directories.
 *
 * @param create
 *            {boolean} file or directory if it doesn't exist
 * @param exclusive
 *            {boolean} used with create; if true the command will fail if
 *            target path exists
 */
function Flags (create, exclusive) {
    this.create = create || false;
    this.exclusive = exclusive || false;
}

module.exports = Flags;

            });cordova.define('cordova-plugin-file.LocalFileSystem', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

exports.TEMPORARY = 0;
exports.PERSISTENT = 1;

            });cordova.define('cordova-plugin-file.Metadata', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/**
 * Information about the state of the file or directory
 *
 * {Date} modificationTime (readonly)
 */
var Metadata = function (metadata) {
    if (typeof metadata === 'object') {
        this.modificationTime = new Date(metadata.modificationTime);
        this.size = metadata.size || 0;
    } else if (typeof metadata === 'undefined') {
        this.modificationTime = null;
        this.size = 0;
    } else {
        /* Backwards compatiblity with platforms that only return a timestamp */
        this.modificationTime = new Date(metadata);
    }
};

module.exports = Metadata;

            });cordova.define('cordova-plugin-file.ProgressEvent', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill
// Feature test: See if we can instantiate a native ProgressEvent;
// if so, use that approach,
// otherwise fill-in with our own implementation.
//
// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.
var ProgressEvent = (function () {
    /*
    var createEvent = function(data) {
        var event = document.createEvent('Events');
        event.initEvent('ProgressEvent', false, false);
        if (data) {
            for (var i in data) {
                if (data.hasOwnProperty(i)) {
                    event[i] = data[i];
                }
            }
            if (data.target) {
                // TODO: cannot call <some_custom_object>.dispatchEvent
                // need to first figure out how to implement EventTarget
            }
        }
        return event;
    };
    try {
        var ev = createEvent({type:"abort",target:document});
        return function ProgressEvent(type, data) {
            data.type = type;
            return createEvent(data);
        };
    } catch(e){
    */
    return function ProgressEvent (type, dict) {
        this.type = type;
        this.bubbles = false;
        this.cancelBubble = false;
        this.cancelable = false;
        this.lengthComputable = false;
        this.loaded = dict && dict.loaded ? dict.loaded : 0;
        this.total = dict && dict.total ? dict.total : 0;
        this.target = dict && dict.target ? dict.target : null;
    };
    // }
})();

module.exports = ProgressEvent;

            });cordova.define('cordova-plugin-file.fileSystemPaths', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var exec = require('cordova/exec');
var channel = require('cordova/channel');

exports.file = {
    // Read-only directory where the application is installed.
    applicationDirectory: null,
    // Root of app's private writable storage
    applicationStorageDirectory: null,
    // Where to put app-specific data files.
    dataDirectory: null,
    // Cached files that should survive app restarts.
    // Apps should not rely on the OS to delete files in here.
    cacheDirectory: null,
    // Android: the application space on external storage.
    externalApplicationStorageDirectory: null,
    // Android: Where to put app-specific data files on external storage.
    externalDataDirectory: null,
    // Android: the application cache on external storage.
    externalCacheDirectory: null,
    // Android: the external storage (SD card) root.
    externalRootDirectory: null,
    // iOS: Temp directory that the OS can clear at will.
    tempDirectory: null,
    // iOS: Holds app-specific files that should be synced (e.g. to iCloud).
    syncedDataDirectory: null,
    // iOS: Files private to the app, but that are meaningful to other applications (e.g. Office files)
    documentsDirectory: null,
    // BlackBerry10: Files globally available to all apps
    sharedDirectory: null
};

channel.waitForInitialization('onFileSystemPathsReady');
channel.onCordovaReady.subscribe(function () {
    function after (paths) {
        for (var k in paths) {
            exports.file[k] = paths[k];
        }
        channel.initializationComplete('onFileSystemPathsReady');
    }
    exec(after, null, 'File', 'requestAllPaths', []);
});

            });cordova.define('cordova-plugin-file.fileSystems', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

// Overridden by Android, BlackBerry 10 and iOS to populate fsMap.
module.exports.getFs = function (name, callback) {
    callback(null);
};

            });cordova.define('cordova-plugin-file.requestFileSystem', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

(function () {
    // For browser platform: not all browsers use this file.
    function checkBrowser () {
        if (cordova.platformId === 'browser' && require('./isChrome')()) { // eslint-disable-line no-undef
            module.exports = window.requestFileSystem || window.webkitRequestFileSystem;
            return true;
        }
        return false;
    }
    if (checkBrowser()) {
        return;
    }

    var argscheck = require('cordova/argscheck');
    var FileError = require('./FileError');
    var FileSystem = require('./FileSystem');
    var exec = require('cordova/exec');
    var fileSystems = require('./fileSystems');

    /**
     * Request a file system in which to store application data.
     * @param type  local file system type
     * @param size  indicates how much storage space, in bytes, the application expects to need
     * @param successCallback  invoked with a FileSystem object
     * @param errorCallback  invoked if error occurs retrieving file system
     */
    var requestFileSystem = function (type, size, successCallback, errorCallback) {
        argscheck.checkArgs('nnFF', 'requestFileSystem', arguments);
        var fail = function (code) {
            if (errorCallback) {
                errorCallback(new FileError(code));
            }
        };

        if (type < 0) {
            fail(FileError.SYNTAX_ERR);
        } else {
            // if successful, return a FileSystem object
            var success = function (file_system) {
                if (file_system) {
                    if (successCallback) {
                        fileSystems.getFs(file_system.name, function (fs) {
                            // This should happen only on platforms that haven't implemented requestAllFileSystems (windows)
                            if (!fs) {
                                fs = new FileSystem(file_system.name, file_system.root);
                            }
                            successCallback(fs);
                        });
                    }
                } else {
                    // no FileSystem object returned
                    fail(FileError.NOT_FOUND_ERR);
                }
            };
            exec(success, fail, 'File', 'requestFileSystem', [type, size]);
        }
    };

    module.exports = requestFileSystem;
})();

            });cordova.define('cordova-plugin-file.resolveLocalFileSystemURI', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/
(function () {
    // For browser platform: not all browsers use overrided `resolveLocalFileSystemURL`.
    function checkBrowser () {
        if (cordova.platformId === 'browser' && require('./isChrome')()) { // eslint-disable-line no-undef
            module.exports.resolveLocalFileSystemURL = window.resolveLocalFileSystemURL || window.webkitResolveLocalFileSystemURL;
            return true;
        }
        return false;
    }
    if (checkBrowser()) {
        return;
    }

    var argscheck = require('cordova/argscheck');
    var DirectoryEntry = require('./DirectoryEntry');
    var FileEntry = require('./FileEntry');
    var FileError = require('./FileError');
    var exec = require('cordova/exec');
    var fileSystems = require('./fileSystems');

    /**
     * Look up file system Entry referred to by local URI.
     * @param {DOMString} uri  URI referring to a local file or directory
     * @param successCallback  invoked with Entry object corresponding to URI
     * @param errorCallback    invoked if error occurs retrieving file system entry
     */
    module.exports.resolveLocalFileSystemURL = module.exports.resolveLocalFileSystemURL || function (uri, successCallback, errorCallback) {
        argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments);
        // error callback
        var fail = function (error) {
            if (errorCallback) {
                errorCallback(new FileError(error));
            }
        };
        // sanity check for 'not:valid:filename' or '/not:valid:filename'
        // file.spec.12 window.resolveLocalFileSystemURI should error (ENCODING_ERR) when resolving invalid URI with leading /.
        if (!uri || uri.split(':').length > 2) {
            setTimeout(function () {
                fail(FileError.ENCODING_ERR);
            }, 0);
            return;
        }
        // if successful, return either a file or directory entry
        var success = function (entry) {
            if (entry) {
                if (successCallback) {
                    // create appropriate Entry object
                    var fsName = entry.filesystemName || (entry.filesystem && entry.filesystem.name) || (entry.filesystem === window.PERSISTENT ? 'persistent' : 'temporary'); // eslint-disable-line no-undef
                    fileSystems.getFs(fsName, function (fs) {
                        // This should happen only on platforms that haven't implemented requestAllFileSystems (windows)
                        if (!fs) {
                            fs = new FileSystem(fsName, {name: '', fullPath: '/'}); // eslint-disable-line no-undef
                        }
                        var result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath, fs, entry.nativeURL) : new FileEntry(entry.name, entry.fullPath, fs, entry.nativeURL);
                        successCallback(result);
                    });
                }
            } else {
                // no Entry object returned
                fail(FileError.NOT_FOUND_ERR);
            }
        };

        exec(success, fail, 'File', 'resolveLocalFileSystemURI', [uri]);
    };

    module.exports.resolveLocalFileSystemURI = function () {
        console.log('resolveLocalFileSystemURI is deprecated. Please call resolveLocalFileSystemURL instead.');
        module.exports.resolveLocalFileSystemURL.apply(this, arguments);
    };
})();

            });cordova.define('cordova-plugin-file.firefoxFileSystem', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/* global FILESYSTEM_PREFIX: true, module */

FILESYSTEM_PREFIX = 'file:///';

module.exports = {
    __format__: function (fullPath) {
        return (FILESYSTEM_PREFIX + this.name + (fullPath[0] === '/' ? '' : '/') + FileSystem.encodeURIPath(fullPath)); // eslint-disable-line no-undef
    }
};

            });cordova.define('cordova-plugin-file.Preparing', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

(function () {
    /* global require */

    // Only Chrome uses this file.
    if (!require('./isChrome')()) {
        return;
    }

    var channel = require('cordova/channel');
    var FileError = require('./FileError');
    var PERSISTENT_FS_QUOTA = 5 * 1024 * 1024;
    var filePluginIsReadyEvent = new Event('filePluginIsReady'); // eslint-disable-line no-undef

    var entryFunctionsCreated = false;
    var quotaWasRequested = false;
    var eventWasThrown = false;

    if (!window.requestFileSystem) {
        window.requestFileSystem = function (type, size, win, fail) {
            if (fail) {
                fail('Not supported');
            }
        };
    } else {
        window.requestFileSystem(window.TEMPORARY, 1, createFileEntryFunctions, function () {});
    }

    if (!window.resolveLocalFileSystemURL) {
        window.resolveLocalFileSystemURL = function (url, win, fail) {
            if (fail) {
                fail('Not supported');
            }
        };
    }

    // Resolves a filesystem entry by its path - which is passed either in standard (filesystem:file://) or
    // Cordova-specific (cdvfile://) universal way.
    // Aligns with specification: http://www.w3.org/TR/2011/WD-file-system-api-20110419/#widl-LocalFileSystem-resolveLocalFileSystemURL
    var nativeResolveLocalFileSystemURL = window.resolveLocalFileSystemURL || window.webkitResolveLocalFileSystemURL;
    window.resolveLocalFileSystemURL = function (url, win, fail) {
        /* If url starts with `cdvfile` then we need convert it to Chrome real url first:
          cdvfile://localhost/persistent/path/to/file -> filesystem:file://persistent/path/to/file */
        if (url.trim().substr(0, 7) === 'cdvfile') {
            /* Quirk:
            Plugin supports cdvfile://localhost (local resources) only.
            I.e. external resources are not supported via cdvfile. */
            if (url.indexOf('cdvfile://localhost') !== -1) {
                // Browser supports temporary and persistent only
                var indexPersistent = url.indexOf('persistent');
                var indexTemporary = url.indexOf('temporary');

                /* Chrome urls start with 'filesystem:' prefix. See quirk:
                   toURL function in Chrome returns filesystem:-prefixed path depending on application host.
                   For example, filesystem:file:///persistent/somefile.txt,
                   filesystem:http://localhost:8080/persistent/somefile.txt. */
                var prefix = 'filesystem:file:///';
                if (location.protocol !== 'file:') { // eslint-disable-line no-undef
                    prefix = 'filesystem:' + location.origin + '/'; // eslint-disable-line no-undef
                }

                var result;
                if (indexPersistent !== -1) {
                    // cdvfile://localhost/persistent/path/to/file -> filesystem:file://persistent/path/to/file
                    // or filesystem:http://localhost:8080/persistent/path/to/file
                    result = prefix + 'persistent' + url.substr(indexPersistent + 10);
                    nativeResolveLocalFileSystemURL(result, win, fail);
                    return;
                }

                if (indexTemporary !== -1) {
                    // cdvfile://localhost/temporary/path/to/file -> filesystem:file://temporary/path/to/file
                    // or filesystem:http://localhost:8080/temporary/path/to/file
                    result = prefix + 'temporary' + url.substr(indexTemporary + 9);
                    nativeResolveLocalFileSystemURL(result, win, fail);
                    return;
                }
            }

            // cdvfile other than local file resource is not supported
            if (fail) {
                fail(new FileError(FileError.ENCODING_ERR));
            }
        } else {
            nativeResolveLocalFileSystemURL(url, win, fail);
        }
    };

    function createFileEntryFunctions (fs) {
        fs.root.getFile('todelete_658674_833_4_cdv', {create: true}, function (fileEntry) {
            var fileEntryType = Object.getPrototypeOf(fileEntry);
            var entryType = Object.getPrototypeOf(fileEntryType);

            // Save the original method
            var origToURL = entryType.toURL;
            entryType.toURL = function () {
                var origURL = origToURL.call(this);
                if (this.isDirectory && origURL.substr(-1) !== '/') {
                    return origURL + '/';
                }
                return origURL;
            };

            entryType.toNativeURL = function () {
                console.warn("DEPRECATED: Update your code to use 'toURL'");
                return this.toURL();
            };

            entryType.toInternalURL = function () {
                if (this.toURL().indexOf('persistent') > -1) {
                    return 'cdvfile://localhost/persistent' + this.fullPath;
                }

                if (this.toURL().indexOf('temporary') > -1) {
                    return 'cdvfile://localhost/temporary' + this.fullPath;
                }
            };

            entryType.setMetadata = function (win, fail /*, metadata */) {
                if (fail) {
                    fail('Not supported');
                }
            };

            fileEntry.createWriter(function (writer) {
                var originalWrite = writer.write;
                var writerProto = Object.getPrototypeOf(writer);
                writerProto.write = function (blob) {
                    if (blob instanceof Blob) { // eslint-disable-line no-undef
                        originalWrite.apply(this, [blob]);
                    } else {
                        var realBlob = new Blob([blob]); // eslint-disable-line no-undef
                        originalWrite.apply(this, [realBlob]);
                    }
                };

                fileEntry.remove(function () { entryFunctionsCreated = true; }, function () { /* empty callback */ });
            });
        });
    }

    window.initPersistentFileSystem = function (size, win, fail) {
        if (navigator.webkitPersistentStorage) {
            navigator.webkitPersistentStorage.requestQuota(size, win, fail);
            return;
        }

        fail('This browser does not support this function');
    };

    window.isFilePluginReadyRaised = function () { return eventWasThrown; };

    window.initPersistentFileSystem(PERSISTENT_FS_QUOTA, function () {
        console.log('Persistent fs quota granted');
        quotaWasRequested = true;
    }, function (e) {
        console.log('Error occured while trying to request Persistent fs quota: ' + JSON.stringify(e));
    });

    channel.onCordovaReady.subscribe(function () {
        function dispatchEventIfReady () {
            if (entryFunctionsCreated && quotaWasRequested) {
                window.dispatchEvent(filePluginIsReadyEvent);
                eventWasThrown = true;
            } else {
                setTimeout(dispatchEventIfReady, 100);
            }
        }

        dispatchEventIfReady();
    }, false);
})();

            });cordova.define('cordova-plugin-file.isChrome', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
 */

module.exports = function () {
    // window.webkitRequestFileSystem and window.webkitResolveLocalFileSystemURL are available only in Chrome and
    // possibly a good flag to indicate that we're running in Chrome
    return window.webkitRequestFileSystem && window.webkitResolveLocalFileSystemURL;
};

            });cordova.define('cordova-plugin-file.browserFileProxy', function (require, exports, module) {
                /*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */
(function () {
    /* global require, exports, module */
    /* global FILESYSTEM_PREFIX */
    /* global IDBKeyRange */
    /* global FileReader */
    /* global atob, btoa, Blob */

    /* Heavily based on https://github.com/ebidel/idb.filesystem.js */

    // For chrome we don't need to implement proxy methods
    // All functionality can be accessed natively.
    if (require('./isChrome')()) {
        var pathsPrefix = {
            // Read-only directory where the application is installed.
            applicationDirectory: location.origin + '/', // eslint-disable-line no-undef
            // Where to put app-specific data files.
            dataDirectory: 'filesystem:file:///persistent/',
            // Cached files that should survive app restarts.
            // Apps should not rely on the OS to delete files in here.
            cacheDirectory: 'filesystem:file:///temporary/'
        };

        exports.requestAllPaths = function (successCallback) {
            successCallback(pathsPrefix);
        };

        require('cordova/exec/proxy').add('File', module.exports);
        return;
    }

    var LocalFileSystem = require('./LocalFileSystem');
    var FileSystem = require('./FileSystem');
    var FileEntry = require('./FileEntry');
    var FileError = require('./FileError');
    var DirectoryEntry = require('./DirectoryEntry');
    var File = require('./File');

    (function (exports, global) {
        var indexedDB = global.indexedDB || global.mozIndexedDB;
        if (!indexedDB) {
            throw 'Firefox OS File plugin: indexedDB not supported';
        }

        var fs_ = null;

        var idb_ = {};
        idb_.db = null;
        var FILE_STORE_ = 'entries';

        var DIR_SEPARATOR = '/';

        var pathsPrefix = {
            // Read-only directory where the application is installed.
            applicationDirectory: location.origin + '/', // eslint-disable-line no-undef
            // Where to put app-specific data files.
            dataDirectory: 'file:///persistent/',
            // Cached files that should survive app restarts.
            // Apps should not rely on the OS to delete files in here.
            cacheDirectory: 'file:///temporary/'
        };

        var unicodeLastChar = 65535;

    /** * Exported functionality ***/

        exports.requestFileSystem = function (successCallback, errorCallback, args) {
            var type = args[0];
            // Size is ignored since IDB filesystem size depends
            // on browser implementation and can't be set up by user
            var size = args[1]; // eslint-disable-line no-unused-vars

            if (type !== LocalFileSystem.TEMPORARY && type !== LocalFileSystem.PERSISTENT) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }
                return;
            }

            var name = type === LocalFileSystem.TEMPORARY ? 'temporary' : 'persistent';
            var storageName = (location.protocol + location.host).replace(/:/g, '_'); // eslint-disable-line no-undef

            var root = new DirectoryEntry('', DIR_SEPARATOR);
            fs_ = new FileSystem(name, root);

            idb_.open(storageName, function () {
                successCallback(fs_);
            }, errorCallback);
        };

        // Overridden by Android, BlackBerry 10 and iOS to populate fsMap
        require('./fileSystems').getFs = function (name, callback) {
            callback(new FileSystem(name, fs_.root));
        };

        // list a directory's contents (files and folders).
        exports.readEntries = function (successCallback, errorCallback, args) {
            var fullPath = args[0];

            if (typeof successCallback !== 'function') {
                throw Error('Expected successCallback argument.');
            }

            var path = resolveToFullPath_(fullPath);

            exports.getDirectory(function () {
                idb_.getAllEntries(path.fullPath + DIR_SEPARATOR, path.storagePath, function (entries) {
                    successCallback(entries);
                }, errorCallback);
            }, function () {
                if (errorCallback) {
                    errorCallback(FileError.NOT_FOUND_ERR);
                }
            }, [path.storagePath, path.fullPath, {create: false}]);
        };

        exports.getFile = function (successCallback, errorCallback, args) {
            var fullPath = args[0];
            var path = args[1];
            var options = args[2] || {};

            // Create an absolute path if we were handed a relative one.
            path = resolveToFullPath_(fullPath, path);

            idb_.get(path.storagePath, function (fileEntry) {
                if (options.create === true && options.exclusive === true && fileEntry) {
                    // If create and exclusive are both true, and the path already exists,
                    // getFile must fail.

                    if (errorCallback) {
                        errorCallback(FileError.PATH_EXISTS_ERR);
                    }
                } else if (options.create === true && !fileEntry) {
                    // If create is true, the path doesn't exist, and no other error occurs,
                    // getFile must create it as a zero-length file and return a corresponding
                    // FileEntry.
                    var newFileEntry = new FileEntry(path.fileName, path.fullPath, new FileSystem(path.fsName, fs_.root));

                    newFileEntry.file_ = new MyFile({
                        size: 0,
                        name: newFileEntry.name,
                        lastModifiedDate: new Date(),
                        storagePath: path.storagePath
                    });

                    idb_.put(newFileEntry, path.storagePath, successCallback, errorCallback);
                } else if (options.create === true && fileEntry) {
                    if (fileEntry.isFile) {
                        // Overwrite file, delete then create new.
                        idb_['delete'](path.storagePath, function () {
                            var newFileEntry = new FileEntry(path.fileName, path.fullPath, new FileSystem(path.fsName, fs_.root));

                            newFileEntry.file_ = new MyFile({
                                size: 0,
                                name: newFileEntry.name,
                                lastModifiedDate: new Date(),
                                storagePath: path.storagePath
                            });

                            idb_.put(newFileEntry, path.storagePath, successCallback, errorCallback);
                        }, errorCallback);
                    } else {
                        if (errorCallback) {
                            errorCallback(FileError.INVALID_MODIFICATION_ERR);
                        }
                    }
                } else if ((!options.create || options.create === false) && !fileEntry) {
                    // If create is not true and the path doesn't exist, getFile must fail.
                    if (errorCallback) {
                        errorCallback(FileError.NOT_FOUND_ERR);
                    }
                } else if ((!options.create || options.create === false) && fileEntry &&
                    fileEntry.isDirectory) {
                    // If create is not true and the path exists, but is a directory, getFile
                    // must fail.
                    if (errorCallback) {
                        errorCallback(FileError.TYPE_MISMATCH_ERR);
                    }
                } else {
                    // Otherwise, if no other error occurs, getFile must return a FileEntry
                    // corresponding to path.

                    successCallback(fileEntryFromIdbEntry(fileEntry));
                }
            }, errorCallback);
        };

        exports.getFileMetadata = function (successCallback, errorCallback, args) {
            var fullPath = args[0];

            exports.getFile(function (fileEntry) {
                successCallback(new File(fileEntry.file_.name, fileEntry.fullPath, '', fileEntry.file_.lastModifiedDate,
                    fileEntry.file_.size));
            }, errorCallback, [fullPath, null]);
        };

        exports.getMetadata = function (successCallback, errorCallback, args) {
            exports.getFile(function (fileEntry) {
                successCallback(
                    {
                        modificationTime: fileEntry.file_.lastModifiedDate,
                        size: fileEntry.file_.lastModifiedDate
                    });
            }, errorCallback, args);
        };

        exports.setMetadata = function (successCallback, errorCallback, args) {
            var fullPath = args[0];
            var metadataObject = args[1];

            exports.getFile(function (fileEntry) {
                fileEntry.file_.lastModifiedDate = metadataObject.modificationTime;
                idb_.put(fileEntry, fileEntry.file_.storagePath, successCallback, errorCallback);
            }, errorCallback, [fullPath, null]);
        };

        exports.write = function (successCallback, errorCallback, args) {
            var fileName = args[0];
            var data = args[1];
            var position = args[2];
            var isBinary = args[3]; // eslint-disable-line no-unused-vars

            if (!data) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }
                return;
            }

            if (typeof data === 'string' || data instanceof String) {
                data = new Blob([data]); // eslint-disable-line no-undef
            }

            exports.getFile(function (fileEntry) {
                var blob_ = fileEntry.file_.blob_;

                if (!blob_) {
                    blob_ = new Blob([data], {type: data.type}); // eslint-disable-line no-undef
                } else {
                    // Calc the head and tail fragments
                    var head = blob_.slice(0, position);
                    var tail = blob_.slice(position + (data.size || data.byteLength));

                    // Calc the padding
                    var padding = position - head.size;
                    if (padding < 0) {
                        padding = 0;
                    }

                    // Do the "write". In fact, a full overwrite of the Blob.
                    blob_ = new Blob([head, new Uint8Array(padding), data, tail], // eslint-disable-line no-undef
                        {type: data.type});
                }

                // Set the blob we're writing on this file entry so we can recall it later.
                fileEntry.file_.blob_ = blob_;
                fileEntry.file_.lastModifiedDate = new Date() || null;
                fileEntry.file_.size = blob_.size;
                fileEntry.file_.name = blob_.name;
                fileEntry.file_.type = blob_.type;

                idb_.put(fileEntry, fileEntry.file_.storagePath, function () {
                    successCallback(data.size || data.byteLength);
                }, errorCallback);
            }, errorCallback, [fileName, null]);
        };

        exports.readAsText = function (successCallback, errorCallback, args) {
            var fileName = args[0];
            var enc = args[1];
            var startPos = args[2];
            var endPos = args[3];

            readAs('text', fileName, enc, startPos, endPos, successCallback, errorCallback);
        };

        exports.readAsDataURL = function (successCallback, errorCallback, args) {
            var fileName = args[0];
            var startPos = args[1];
            var endPos = args[2];

            readAs('dataURL', fileName, null, startPos, endPos, successCallback, errorCallback);
        };

        exports.readAsBinaryString = function (successCallback, errorCallback, args) {
            var fileName = args[0];
            var startPos = args[1];
            var endPos = args[2];

            readAs('binaryString', fileName, null, startPos, endPos, successCallback, errorCallback);
        };

        exports.readAsArrayBuffer = function (successCallback, errorCallback, args) {
            var fileName = args[0];
            var startPos = args[1];
            var endPos = args[2];

            readAs('arrayBuffer', fileName, null, startPos, endPos, successCallback, errorCallback);
        };

        exports.removeRecursively = exports.remove = function (successCallback, errorCallback, args) {
            if (typeof successCallback !== 'function') {
                throw Error('Expected successCallback argument.');
            }

            var fullPath = resolveToFullPath_(args[0]).storagePath;
            if (fullPath === pathsPrefix.cacheDirectory || fullPath === pathsPrefix.dataDirectory) {
                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
                return;
            }

            function deleteEntry (isDirectory) {
                // TODO: This doesn't protect against directories that have content in it.
                // Should throw an error instead if the dirEntry is not empty.
                idb_['delete'](fullPath, function () {
                    successCallback();
                }, function () {
                    if (errorCallback) { errorCallback(); }
                }, isDirectory);
            }

            // We need to to understand what we are deleting:
            exports.getDirectory(function (entry) {
                deleteEntry(entry.isDirectory);
            }, function () {
                // DirectoryEntry was already deleted or entry is FileEntry
                deleteEntry(false);
            }, [fullPath, null, {create: false}]);
        };

        exports.getDirectory = function (successCallback, errorCallback, args) {
            var fullPath = args[0];
            var path = args[1];
            var options = args[2];

            // Create an absolute path if we were handed a relative one.
            path = resolveToFullPath_(fullPath, path);

            idb_.get(path.storagePath, function (folderEntry) {
                if (!options) {
                    options = {};
                }

                if (options.create === true && options.exclusive === true && folderEntry) {
                    // If create and exclusive are both true, and the path already exists,
                    // getDirectory must fail.
                    if (errorCallback) {
                        errorCallback(FileError.PATH_EXISTS_ERR);
                    }
                    // There is a strange bug in mobilespec + FF, which results in coming to multiple else-if's
                    // so we are shielding from it with returns.
                    return;
                }

                if (options.create === true && !folderEntry) {
                    // If create is true, the path doesn't exist, and no other error occurs,
                    // getDirectory must create it as a zero-length file and return a corresponding
                    // MyDirectoryEntry.
                    var dirEntry = new DirectoryEntry(path.fileName, path.fullPath, new FileSystem(path.fsName, fs_.root));

                    idb_.put(dirEntry, path.storagePath, successCallback, errorCallback);
                    return;
                }

                if (options.create === true && folderEntry) {

                    if (folderEntry.isDirectory) {
                        // IDB won't save methods, so we need re-create the MyDirectoryEntry.
                        successCallback(new DirectoryEntry(folderEntry.name, folderEntry.fullPath, folderEntry.filesystem));
                    } else {
                        if (errorCallback) {
                            errorCallback(FileError.INVALID_MODIFICATION_ERR);
                        }
                    }
                    return;
                }

                if ((!options.create || options.create === false) && !folderEntry) {
                    // Handle root special. It should always exist.
                    if (path.fullPath === DIR_SEPARATOR) {
                        successCallback(fs_.root);
                        return;
                    }

                    // If create is not true and the path doesn't exist, getDirectory must fail.
                    if (errorCallback) {
                        errorCallback(FileError.NOT_FOUND_ERR);
                    }

                    return;
                }
                if ((!options.create || options.create === false) && folderEntry && folderEntry.isFile) {
                    // If create is not true and the path exists, but is a file, getDirectory
                    // must fail.
                    if (errorCallback) {
                        errorCallback(FileError.TYPE_MISMATCH_ERR);
                    }
                    return;
                }

                // Otherwise, if no other error occurs, getDirectory must return a
                // MyDirectoryEntry corresponding to path.

                // IDB won't' save methods, so we need re-create MyDirectoryEntry.
                successCallback(new DirectoryEntry(folderEntry.name, folderEntry.fullPath, folderEntry.filesystem));
            }, errorCallback);
        };

        exports.getParent = function (successCallback, errorCallback, args) {
            if (typeof successCallback !== 'function') {
                throw Error('Expected successCallback argument.');
            }

            var fullPath = args[0];
            // fullPath is like this:
            // file:///persistent/path/to/file or
            // file:///persistent/path/to/directory/

            if (fullPath === DIR_SEPARATOR || fullPath === pathsPrefix.cacheDirectory ||
                fullPath === pathsPrefix.dataDirectory) {
                successCallback(fs_.root);
                return;
            }

            // To delete all slashes at the end
            while (fullPath[fullPath.length - 1] === '/') {
                fullPath = fullPath.substr(0, fullPath.length - 1);
            }

            var pathArr = fullPath.split(DIR_SEPARATOR);
            pathArr.pop();
            var parentName = pathArr.pop();
            var path = pathArr.join(DIR_SEPARATOR) + DIR_SEPARATOR;

            // To get parent of root files
            var joined = path + parentName + DIR_SEPARATOR;// is like this: file:///persistent/
            if (joined === pathsPrefix.cacheDirectory || joined === pathsPrefix.dataDirectory) {
                exports.getDirectory(successCallback, errorCallback, [joined, DIR_SEPARATOR, {create: false}]);
                return;
            }

            exports.getDirectory(successCallback, errorCallback, [path, parentName, {create: false}]);
        };

        exports.copyTo = function (successCallback, errorCallback, args) {
            var srcPath = args[0];
            var parentFullPath = args[1];
            var name = args[2];

            if (name.indexOf('/') !== -1 || srcPath === parentFullPath + name) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }

                return;
            }

            // Read src file
            exports.getFile(function (srcFileEntry) {

                var path = resolveToFullPath_(parentFullPath);
                // Check directory
                exports.getDirectory(function () {

                    // Create dest file
                    exports.getFile(function (dstFileEntry) {

                        exports.write(function () {
                            successCallback(dstFileEntry);
                        }, errorCallback, [dstFileEntry.file_.storagePath, srcFileEntry.file_.blob_, 0]);

                    }, errorCallback, [parentFullPath, name, {create: true}]);

                }, function () { if (errorCallback) { errorCallback(FileError.NOT_FOUND_ERR); } },
                [path.storagePath, null, {create: false}]);

            }, errorCallback, [srcPath, null]);
        };

        exports.moveTo = function (successCallback, errorCallback, args) {
            var srcPath = args[0];
            // parentFullPath and name parameters is ignored because
            // args is being passed downstream to exports.copyTo method
            var parentFullPath = args[1]; // eslint-disable-line
            var name = args[2]; // eslint-disable-line

            exports.copyTo(function (fileEntry) {

                exports.remove(function () {
                    successCallback(fileEntry);
                }, errorCallback, [srcPath]);

            }, errorCallback, args);
        };

        exports.resolveLocalFileSystemURI = function (successCallback, errorCallback, args) {
            var path = args[0];

            // Ignore parameters
            if (path.indexOf('?') !== -1) {
                path = String(path).split('?')[0];
            }

            // support for encodeURI
            if (/\%5/g.test(path) || /\%20/g.test(path)) {  // eslint-disable-line no-useless-escape
                path = decodeURI(path);
            }

            if (path.trim()[0] === '/') {
                if (errorCallback) {
                    errorCallback(FileError.ENCODING_ERR);
                }
                return;
            }

            // support for cdvfile
            if (path.trim().substr(0, 7) === 'cdvfile') {
                if (path.indexOf('cdvfile://localhost') === -1) {
                    if (errorCallback) {
                        errorCallback(FileError.ENCODING_ERR);
                    }
                    return;
                }

                var indexPersistent = path.indexOf('persistent');
                var indexTemporary = path.indexOf('temporary');

                // cdvfile://localhost/persistent/path/to/file
                if (indexPersistent !== -1) {
                    path = 'file:///persistent' + path.substr(indexPersistent + 10);
                } else if (indexTemporary !== -1) {
                    path = 'file:///temporary' + path.substr(indexTemporary + 9);
                } else {
                    if (errorCallback) {
                        errorCallback(FileError.ENCODING_ERR);
                    }
                    return;
                }
            }

            // to avoid path form of '///path/to/file'
            function handlePathSlashes (path) {
                var cutIndex = 0;
                for (var i = 0; i < path.length - 1; i++) {
                    if (path[i] === DIR_SEPARATOR && path[i + 1] === DIR_SEPARATOR) {
                        cutIndex = i + 1;
                    } else break;
                }

                return path.substr(cutIndex);
            }

            // Handle localhost containing paths (see specs )
            if (path.indexOf('file://localhost/') === 0) {
                path = path.replace('file://localhost/', 'file:///');
            }

            if (path.indexOf(pathsPrefix.dataDirectory) === 0) {
                path = path.substring(pathsPrefix.dataDirectory.length - 1);
                path = handlePathSlashes(path);

                exports.requestFileSystem(function () {
                    exports.getFile(successCallback, function () {
                        exports.getDirectory(successCallback, errorCallback, [pathsPrefix.dataDirectory, path,
                        {create: false}]);
                    }, [pathsPrefix.dataDirectory, path, {create: false}]);
                }, errorCallback, [LocalFileSystem.PERSISTENT]);
            } else if (path.indexOf(pathsPrefix.cacheDirectory) === 0) {
                path = path.substring(pathsPrefix.cacheDirectory.length - 1);
                path = handlePathSlashes(path);

                exports.requestFileSystem(function () {
                    exports.getFile(successCallback, function () {
                        exports.getDirectory(successCallback, errorCallback, [pathsPrefix.cacheDirectory, path,
                        {create: false}]);
                    }, [pathsPrefix.cacheDirectory, path, {create: false}]);
                }, errorCallback, [LocalFileSystem.TEMPORARY]);
            } else if (path.indexOf(pathsPrefix.applicationDirectory) === 0) {
                path = path.substring(pathsPrefix.applicationDirectory.length);
                // TODO: need to cut out redundant slashes?

                var xhr = new XMLHttpRequest(); // eslint-disable-line no-undef
                xhr.open('GET', path, true);
                xhr.onreadystatechange = function () {
                    if (xhr.status === 200 && xhr.readyState === 4) {
                        exports.requestFileSystem(function (fs) {
                            fs.name = location.hostname; // eslint-disable-line no-undef

                            // TODO: need to call exports.getFile(...) to handle errors correct
                            fs.root.getFile(path, {create: true}, writeFile, errorCallback);
                        }, errorCallback, [LocalFileSystem.PERSISTENT]);
                    }
                };

                xhr.onerror = function () {
                    if (errorCallback) {
                        errorCallback(FileError.NOT_READABLE_ERR);
                    }
                };

                xhr.send();
            } else {
                if (errorCallback) {
                    errorCallback(FileError.NOT_FOUND_ERR);
                }
            }

            function writeFile (entry) {
                entry.createWriter(function (fileWriter) {
                    fileWriter.onwriteend = function (evt) {
                        if (!evt.target.error) {
                            entry.filesystemName = location.hostname; // eslint-disable-line no-undef
                            successCallback(entry);
                        }
                    };
                    fileWriter.onerror = function () {
                        if (errorCallback) {
                            errorCallback(FileError.NOT_READABLE_ERR);
                        }
                    };
                    fileWriter.write(new Blob([xhr.response])); // eslint-disable-line no-undef
                }, errorCallback); // eslint-disable-line no-undef
            }
        };

        exports.requestAllPaths = function (successCallback) {
            successCallback(pathsPrefix);
        };

    /** * Helpers ***/

        /**
         * Interface to wrap the native File interface.
         *
         * This interface is necessary for creating zero-length (empty) files,
         * something the Filesystem API allows you to do. Unfortunately, File's
         * constructor cannot be called directly, making it impossible to instantiate
         * an empty File in JS.
         *
         * @param {Object} opts Initial values.
         * @constructor
         */
        function MyFile (opts) {
            var blob_ = new Blob(); // eslint-disable-line no-undef

            this.size = opts.size || 0;
            this.name = opts.name || '';
            this.type = opts.type || '';
            this.lastModifiedDate = opts.lastModifiedDate || null;
            this.storagePath = opts.storagePath || '';

            // Need some black magic to correct the object's size/name/type based on the
            // blob that is saved.
            Object.defineProperty(this, 'blob_', {
                enumerable: true,
                get: function () {
                    return blob_;
                },
                set: function (val) {
                    blob_ = val;
                    this.size = blob_.size;
                    this.name = blob_.name;
                    this.type = blob_.type;
                    this.lastModifiedDate = blob_.lastModifiedDate;
                }.bind(this)
            });
        }

        MyFile.prototype.constructor = MyFile;

        var MyFileHelper = {
            toJson: function (myFile, success) {
                /*
                    Safari private browse mode cannot store Blob object to indexeddb.
                    Then use pure json object instead of Blob object.
                */
                var fr = new FileReader();
                fr.onload = function (ev) {
                    var base64 = btoa(String.fromCharCode.apply(null, new Uint8Array(fr.result)));
                    success({
                        opt: {
                            size: myFile.size,
                            name: myFile.name,
                            type: myFile.type,
                            lastModifiedDate: myFile.lastModifiedDate,
                            storagePath: myFile.storagePath
                        },
                        base64: base64
                    });
                };
                fr.readAsArrayBuffer(myFile.blob_);
            },
            setBase64: function (myFile, base64) {
                if (base64) {
                    var arrayBuffer = (new Uint8Array(
                        [].map.call(atob(base64), function (c) { return c.charCodeAt(0); })
                    )).buffer;

                    myFile.blob_ = new Blob([arrayBuffer], { type: myFile.type });
                } else {
                    myFile.blob_ = new Blob();
                }
            }
        };

        // When saving an entry, the fullPath should always lead with a slash and never
        // end with one (e.g. a directory). Also, resolve '.' and '..' to an absolute
        // one. This method ensures path is legit!
        function resolveToFullPath_ (cwdFullPath, path) {
            path = path || '';
            var fullPath = path;
            var prefix = '';

            cwdFullPath = cwdFullPath || DIR_SEPARATOR;
            if (cwdFullPath.indexOf(FILESYSTEM_PREFIX) === 0) {
                prefix = cwdFullPath.substring(0, cwdFullPath.indexOf(DIR_SEPARATOR, FILESYSTEM_PREFIX.length));
                cwdFullPath = cwdFullPath.substring(cwdFullPath.indexOf(DIR_SEPARATOR, FILESYSTEM_PREFIX.length));
            }

            var relativePath = path[0] !== DIR_SEPARATOR;
            if (relativePath) {
                fullPath = cwdFullPath;
                if (cwdFullPath !== DIR_SEPARATOR) {
                    fullPath += DIR_SEPARATOR + path;
                } else {
                    fullPath += path;
                }
            }

            // Remove doubled separator substrings
            var re = new RegExp(DIR_SEPARATOR + DIR_SEPARATOR, 'g');
            fullPath = fullPath.replace(re, DIR_SEPARATOR);

            // Adjust '..'s by removing parent directories when '..' flows in path.
            var parts = fullPath.split(DIR_SEPARATOR);
            for (var i = 0; i < parts.length; ++i) {
                var part = parts[i];
                if (part === '..') {
                    parts[i - 1] = '';
                    parts[i] = '';
                }
            }
            fullPath = parts.filter(function (el) {
                return el;
            }).join(DIR_SEPARATOR);

            // Add back in leading slash.
            if (fullPath[0] !== DIR_SEPARATOR) {
                fullPath = DIR_SEPARATOR + fullPath;
            }

            // Replace './' by current dir. ('./one/./two' -> one/two)
            fullPath = fullPath.replace(/\.\//g, DIR_SEPARATOR);

            // Replace '//' with '/'.
            fullPath = fullPath.replace(/\/\//g, DIR_SEPARATOR);

            // Replace '/.' with '/'.
            fullPath = fullPath.replace(/\/\./g, DIR_SEPARATOR);

            // Remove '/' if it appears on the end.
            if (fullPath[fullPath.length - 1] === DIR_SEPARATOR &&
                fullPath !== DIR_SEPARATOR) {
                fullPath = fullPath.substring(0, fullPath.length - 1);
            }

            var storagePath = prefix + fullPath;
            storagePath = decodeURI(storagePath);
            fullPath = decodeURI(fullPath);

            return {
                storagePath: storagePath,
                fullPath: fullPath,
                fileName: fullPath.split(DIR_SEPARATOR).pop(),
                fsName: prefix.split(DIR_SEPARATOR).pop()
            };
        }

        function fileEntryFromIdbEntry (fileEntry) {
            // IDB won't save methods, so we need re-create the FileEntry.
            var clonedFileEntry = new FileEntry(fileEntry.name, fileEntry.fullPath, fileEntry.filesystem);
            clonedFileEntry.file_ = fileEntry.file_;

            return clonedFileEntry;
        }

        function readAs (what, fullPath, encoding, startPos, endPos, successCallback, errorCallback) {
            exports.getFile(function (fileEntry) {
                var fileReader = new FileReader(); // eslint-disable-line no-undef
                var blob = fileEntry.file_.blob_.slice(startPos, endPos);

                fileReader.onload = function (e) {
                    successCallback(e.target.result);
                };

                fileReader.onerror = errorCallback;

                switch (what) {
                case 'text':
                    fileReader.readAsText(blob, encoding);
                    break;
                case 'dataURL':
                    fileReader.readAsDataURL(blob);
                    break;
                case 'arrayBuffer':
                    fileReader.readAsArrayBuffer(blob);
                    break;
                case 'binaryString':
                    fileReader.readAsBinaryString(blob);
                    break;
                }

            }, errorCallback, [fullPath, null]);
        }

    /** * Core logic to handle IDB operations ***/

        idb_.open = function (dbName, successCallback, errorCallback) {
            var self = this;

            // TODO: FF 12.0a1 isn't liking a db name with : in it.
            var request = indexedDB.open(dbName.replace(':', '_')/*, 1 /*version */);

            request.onerror = errorCallback || onError;

            request.onupgradeneeded = function (e) {
                // First open was called or higher db version was used.

                // console.log('onupgradeneeded: oldVersion:' + e.oldVersion,
                //           'newVersion:' + e.newVersion);

                self.db = e.target.result;
                self.db.onerror = onError;

                if (!self.db.objectStoreNames.contains(FILE_STORE_)) {
                    self.db.createObjectStore(FILE_STORE_/*, {keyPath: 'id', autoIncrement: true} */);
                }
            };

            request.onsuccess = function (e) {
                self.db = e.target.result;
                self.db.onerror = onError;
                successCallback(e);
            };

            request.onblocked = errorCallback || onError;
        };

        idb_.close = function () {
            this.db.close();
            this.db = null;
        };

        idb_.get = function (fullPath, successCallback, errorCallback) {
            if (!this.db) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }
                return;
            }

            var tx = this.db.transaction([FILE_STORE_], 'readonly');

            var request = tx.objectStore(FILE_STORE_).get(fullPath);

            tx.onabort = errorCallback || onError;
            tx.oncomplete = function () {
                var entry = request.result;
                if (entry && entry.file_json) {
                    /*
                        Safari private browse mode cannot store Blob object to indexeddb.
                        Then use pure json object instead of Blob object.
                    */
                    entry.file_ = new MyFile(entry.file_json.opt);
                    MyFileHelper.setBase64(entry.file_, entry.file_json.base64);
                    delete entry.file_json;
                }
                successCallback(entry);
            };
        };

        idb_.getAllEntries = function (fullPath, storagePath, successCallback, errorCallback) {
            if (!this.db) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }
                return;
            }

            var results = [];

            if (storagePath[storagePath.length - 1] === DIR_SEPARATOR) {
                storagePath = storagePath.substring(0, storagePath.length - 1);
            }

            var range = IDBKeyRange.bound(storagePath + DIR_SEPARATOR + ' ',
                storagePath + DIR_SEPARATOR + String.fromCharCode(unicodeLastChar));

            var tx = this.db.transaction([FILE_STORE_], 'readonly');
            tx.onabort = errorCallback || onError;
            tx.oncomplete = function () {
                results = results.filter(function (val) {
                    var pathWithoutSlash = val.fullPath;

                    if (val.fullPath[val.fullPath.length - 1] === DIR_SEPARATOR) {
                        pathWithoutSlash = pathWithoutSlash.substr(0, pathWithoutSlash.length - 1);
                    }

                    var valPartsLen = pathWithoutSlash.split(DIR_SEPARATOR).length;
                    var fullPathPartsLen = fullPath.split(DIR_SEPARATOR).length;

                    /* Input fullPath parameter  equals '//' for root folder */
                    /* Entries in root folder has valPartsLen equals 2 (see below) */
                    if (fullPath[fullPath.length - 1] === DIR_SEPARATOR && fullPath.trim().length === 2) {
                        fullPathPartsLen = 1;
                    } else if (fullPath[fullPath.length - 1] === DIR_SEPARATOR) {
                        fullPathPartsLen = fullPath.substr(0, fullPath.length - 1).split(DIR_SEPARATOR).length;
                    } else {
                        fullPathPartsLen = fullPath.split(DIR_SEPARATOR).length;
                    }

                    if (valPartsLen === fullPathPartsLen + 1) {
                        // If this a subfolder and entry is a direct child, include it in
                        // the results. Otherwise, it's not an entry of this folder.
                        return val;
                    } else return false;
                });

                successCallback(results);
            };

            var request = tx.objectStore(FILE_STORE_).openCursor(range);

            request.onsuccess = function (e) {
                var cursor = e.target.result;
                if (cursor) {
                    var val = cursor.value;

                    results.push(val.isFile ? fileEntryFromIdbEntry(val) : new DirectoryEntry(val.name, val.fullPath, val.filesystem));
                    cursor['continue']();
                }
            };
        };

        idb_['delete'] = function (fullPath, successCallback, errorCallback, isDirectory) {
            if (!idb_.db) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }
                return;
            }

            var tx = this.db.transaction([FILE_STORE_], 'readwrite');
            tx.oncomplete = successCallback;
            tx.onabort = errorCallback || onError;
            tx.oncomplete = function () {
                if (isDirectory) {
                    // We delete nested files and folders after deleting parent folder
                    // We use ranges: https://developer.mozilla.org/en-US/docs/Web/API/IDBKeyRange
                    fullPath = fullPath + DIR_SEPARATOR;

                    // Range contains all entries in the form fullPath<symbol> where
                    // symbol in the range from ' ' to symbol which has code `unicodeLastChar`
                    var range = IDBKeyRange.bound(fullPath + ' ', fullPath + String.fromCharCode(unicodeLastChar));

                    var newTx = this.db.transaction([FILE_STORE_], 'readwrite');
                    newTx.oncomplete = successCallback;
                    newTx.onabort = errorCallback || onError;
                    newTx.objectStore(FILE_STORE_)['delete'](range);
                } else {
                    successCallback();
                }
            };
            tx.objectStore(FILE_STORE_)['delete'](fullPath);
        };

        idb_.put = function (entry, storagePath, successCallback, errorCallback, retry) {
            if (!this.db) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }
                return;
            }

            var tx = this.db.transaction([FILE_STORE_], 'readwrite');
            tx.onabort = errorCallback || onError;
            tx.oncomplete = function () {
                // TODO: Error is thrown if we pass the request event back instead.
                successCallback(entry);
            };

            try {
                tx.objectStore(FILE_STORE_).put(entry, storagePath);
            } catch (e) {
                if (e.name === 'DataCloneError') {
                    tx.oncomplete = null;
                    /*
                        Safari private browse mode cannot store Blob object to indexeddb.
                        Then use pure json object instead of Blob object.
                    */

                    var successCallback2 = function (entry) {
                        entry.file_ = new MyFile(entry.file_json.opt);
                        delete entry.file_json;
                        successCallback(entry);
                    };

                    if (!retry) {
                        if (entry.file_ && entry.file_ instanceof MyFile && entry.file_.blob_) {
                            MyFileHelper.toJson(entry.file_, function (json) {
                                entry.file_json = json;
                                delete entry.file_;
                                idb_.put(entry, storagePath, successCallback2, errorCallback, true);
                            });
                            return;
                        }
                    }
                }
                throw e;
            }
        };

        // Global error handler. Errors bubble from request, to transaction, to db.
        function onError (e) {
            switch (e.target.errorCode) {
            case 12:
                console.log('Error - Attempt to open db with a lower version than the ' +
                        'current one.');
                break;
            default:
                console.log('errorCode: ' + e.target.errorCode);
            }

            console.log(e, e.code, e.message);
        }

    })(module.exports, window);

    require('cordova/exec/proxy').add('File', module.exports);
})();

            });/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
var app = {
    // Application Constructor
    initialize: function() {
        document.addEventListener('deviceready', this.onDeviceReady.bind(this), false);
    },

    // deviceready Event Handler
    //
    // Bind any cordova events here. Common events are:
    // 'pause', 'resume', etc.
    onDeviceReady: function() {
        this.receivedEvent('deviceready');
    },

    // Update DOM on a Received Event
    receivedEvent: function(id) {
        var parentElement = document.getElementById(id);
        var listeningElement = parentElement.querySelector('.listening');
        var receivedElement = parentElement.querySelector('.received');

        listeningElement.setAttribute('style', 'display:none;');
        receivedElement.setAttribute('style', 'display:block;');

        console.log('Received Event: ' + id);
    }
};

app.initialize();‰PNG

   IHDR   ª   È   xJzÓ   	pHYs     šœ  
OiCCPPhotoshop ICC profile  xÚ�SgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*!	Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ,Š
Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó�³ÏÀ–H3Q5€©BàƒÇÄÆáä.@�
$p ³d!sý# ø~<<+"À¾ xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€ @zŽB¦ @F€�˜&S   `Ëcbã P- `'æÓ €�ø™{ [”! ‘  eˆD h; ¬ÏVŠE X0 fKÄ9 Ø- 0IWfH °· ÀÎ²  0Qˆ…) { `È##x „™ FòW<ñ+®ç*  x™²<¹$9E�[-qWW.(ÎI+6aaš@.Ây™2�4àóÌ   ‘àƒóýxÎ®ÎÎ6Ž¶_-ê¿ÿ"bbãþåÏ«p@  át~Ñþ,/³€;€mþ¢%îh^ u÷‹f²@µ  éÚWópø~<<E¡�¹ÙÙåääØJÄB[aÊW}þgÂ_ÀWýlù~<ü÷õà¾â$�2]�GøàÂÌôL¥Ï’	„bÜæ�Gü·ÿüÓ"ÄIb¹X*ãQqŽDšŒó2¥"‰B’)Å%Òÿdâß,û>ß5 °j>{‘-¨]cöK'XtÀâ÷  ò»oÁÔ(€hƒáÏwÿï?ýG % €fI’q  ^D$.TÊ³?Ç  D �*°AôÁ,ÀÁÜÁü`6„B$ÄÂBB
d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼�	AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ÉˆQ"K‘5H1RŠT UHò=r9‡\Fº‘;È 2‚ü†¼G1”�²Q=ÔµC¹¨7„F¢Ðdt1š� ›Ðr´=Œ6¡çÐ«hÚ�>CÇ0Àè3Äl0.ÆÃB±8,	“cË±"¬«Æ°V¬»‰õcÏ±w�EÀ	6wB aAHXLXNØH¨ $4Ú	7	„QÂ'"“¨K´&ºùÄb21‡XH,#Ö�/{ˆCÄ7$‰C2'¹�I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ä�äÃä3ää!ò[
�b@q¤øSâ(RÊjJåå4åe˜2AU£šRÝ¨¡T5�ZB­¡¶R¯Q‡¨4uš9ÍƒIK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw†ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê
•J•&•*/T©ª¦ªÞªUóUËT�©^S}®FU3Sã©	Ô–«Uª�PëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k«†u�5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN	ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§�¦½E»Yû�AÇJ'\'Gg�Î�çSÙSÝ§
§M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õGX³$ÛÎ<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕF�FŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­�­%Ö»­»§§¹N“N«žÖgÃ°ñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ãî“½“}º}�ý=‡Ù«Z~s´r:V:ÞšÎœî?}Åô–é/gXÏÏØ3ã¶Ë)Äi�S›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝÈ½äJtõq]ázÒõ�›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ?Ÿ•0kß¬~OCO�gµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿÑ §€%g‰�A�[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA�‚­‚åÁ­!hÈì�­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~'…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕX�XIlK9.*®6nl¾ßüíó‡â�âã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž
yÂÂg"/Ñ6ÑˆØC\*NòH*Mz’ì‘¼5y$Å3¥,å¹„'©�¼LLÝ›:žšv m2=:½1ƒ’‘�qBª!M“¶gêgæfvË¬e…²þÅn‹·/•Ék³�¬Y-
¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+ÍíÌ³ÊÛ�7œïŸÿíÂá’¶¥†KW-Xæ½¬j9²<qyÛ
ã+†V¬<¸Š¶*mÕO«íW—®~½&zMk�^ÁÊ‚ÁµkëU
å…}ëÜ×í]OX/Yßµaú†�>‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—nÙÚ´ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒÝµa×ønÑî{¼ö4ìÕÛ[¼÷ý>É¾ÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TR�Ö+ëGÇ¾þ�ïw-6U�œÆâ#pDyäé÷	ß÷:ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ4<YyJóTÉiÚé‚Ó“gòÏŒ�•�}~.ùÜ`Û¢¶{çcÎßjoïºtáÒEÿ‹ç;¼;Î\ò¸tò²ÛåW¸Wš¯:_mêtê<þ“ÓOÇ»œ»š®¹\k¹îz½µ{f÷éž7ÎÝô½yñÿÖÕž9=Ý½ózo÷Å÷õßÝ~r'ýÎË»Ùw'î­¼O¼_ô@íAÙCÝ‡Õ?[þÜØïÜjÀw óÑÜG÷…ƒÏþ‘õ�C�™�Ë††ëž8>99â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×ÎÑ˜Ñ¡—ò—“¿m|¥ýêÀë¯ÛÆÂÆ¾Éx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSÐ§û“““ÿ˜óüc3-Û    cHRM  z%  €ƒ  ùÿ  €é  u0  ê`  :˜  o’_ÅF  JaIDATxÚì½i�%Ùuö�›™oµö6XÃÎ`X ƒ²CæÒ$�¦-;H*L+d;d‡×ð”Ã"eX
*¨��)É ”)¬$†� ,öÙº»ªº»º»ºª«»ö·ärïñ�ÜnæËõÕ«šš™Ê˜š~Kf¾Ì¼ß=Ëw–KÌŒóí|;ë›8çÛ«a3ÏúzÒûmV¼ EÒÚïŽ{lÖþùÇP¸˜DTú;'©ñˆÌŒ£££ßÿ\¿ž³¶ÑYVýRÉ_ð<ïoKOFƒZe@Ã×é}«2ýº.Ð³ögV	ÀfïÃ'>‘Ò‡ˆá8î¸Óé¼a~~~÷ÌÕuÝ³i“ñ¨ôäOzB—>ià„¯Cé�µoÙ±e`�ÅûàÃÄ[u&À
(¥Ðívgnnîg„8›Ö 9Žsæ.*xðÌÌ?œ%O`Eç�xÏ‚d%"(¥ à‡<Ïû¢”ò\õWÜþªã8ÿ�”2×Ž›p§ÖÉÏ8-XÏˆ 0ómÛ¶ß€Ïšd=s@eæŽ”rSJÙ/ÀW¬³‘¤g¬ÌÃ0~åÊ•+¿p.QËí¥ßð<ï¯+¥r¨s°žXC{¾×ë½M±rÔüõ}žçýY`/ÍDç6k}°2óŸyž÷oŽÇãs fÒQR^•R¾} œƒu¶f€ã8ÿ±eYÿÌ²¬s ¦Tþ/H)ÿv‘Ê?ëé�UJytåÊ•7Y–µÔx{LJ¹ª”Çøs6`6`ef˜¦ù1!Ä_=9@UJ='¥üÁYI©skv’Õó¼�F_Èò^g@åŸ‘RývúAœƒõl€Õó¼õV«õx¯×“¯g ö”R·•RÓÚn¯3à,Û¬RJôûýÿcaaázÝ•™ÿ©”òçg=ˆçÖì3Â <¡”ºúJ™ ¯$Pÿ¢Rê_ÕåLÏÁzú`r¾:�¿ï•ÂË+T¥Ô
3¿õ´õµV0ƒO¬J)X–õ7._¾ü¯ 2óÿ¬”ú¥“–¤çÖìÀäØsss�!v_@}L)u£êC=ëÙ«Rêw¥”ÿÞi§‡ž:P™ù‹Ìüuê9XÏŽÍJD°mûÇ„_0ã5ÔŸUJýÖ4õÜÁ:;`UJ­_¹rå1Ó4ùµÔ3ßfæ…iô9XÏX™–e}È4ÍÿñµÔßbæŸ­óðÎÙ€³Ë03<Ï{z4½p:- þ%fþÒ´éµh³Îæ>_9‹ˆà8Î¿nµZßÛn·_@eæU �çž;Xg¬RJ,,,ügý~ÿÃ¯ þ¯Ìü¿Õ}ç`}ÕPW6½Q)õðÕÔÇ¬ÎBÝŸ6à,›¯”ƒ„W?1�~ZOzµõ‹ ~`V¶iú³¼’Þ€˜.lDQæ((¥P·§À´`%¢‰éfágY×š¼Oìï÷»ð?+ŸÇ«R
¦i¾ïÒ¥KÏžžN¨?à·�;£‹§˜pæ 3	ù-ŸXS�|�ö‘9ø ‚çºp=o$³«R
B4›�œkªyîðßªbÆxl£¬ÌgZ°Õ ÷ß$„PU™ƒ³ Ô>€ ½ã‚2O’zž‡»wîàÁÎ.LÓ¹˜®™è#•5	À`åƒõòåË¸tñÂ„dMK<­ÓH-°„ <|¸ƒõÛw ¤¤R°‚'¾š<àðx.ææñøc�%î¸`eæÿSJù?œD›¨“êæ÷ëy -RcE³=<&T“‡‡øü¿ü^¼vÝN C)ŽU�âP¾hŸ³Ä@RðZ1À,Áž’¸sï>þËÿäçð–GßÇqJûVUéè’Öf³	Ïóð÷?ü[X]ßÀb¿Å
ÿØ¿¿O3T8 Â®€ðïÑ5*HéÿÖh4B£ÕÂGþáßÁ»žúììîG×Z4y€,:†ˆþ{Ïó>bšæ³¶UO¨?¨ýR®îÃˆ¿S¸ºr·6 ÓnCˆÐPP¨~Vj`„ö ÀðS0  ._¾X:qêÜgú"‚çI,/-áò…e<í&æ{>ÜÁÇž} m mÁ¡®gÿ¾X)Ÿà4šM\¿µ�Ï<û%¼ûé'!„¨dûN3>AÄê#W®\yï¬ó N¨ÿ¤²ÝQóa„ÒtçáC¼ðÒ*˜�V«IHÃP*�<Šö)fþ ²6 Xu	«˜AÌð\—.,bqa~öNAÆ}5›¼á‘Ëh5h6Á÷¡ð[V2Ç,”´¾ìÀ
Ìäÿç?€¡ð¶ÇÞ€O~öOð�ÿA¼ãÉïÆîî~lÄÎ¬ÁgïÙßßÿ›¦iþ£³Ôÿ=‹ØŸX}/ŸqõúÖ7î£ÓnAzNÊ4ˆ}¨Ø”K¼É¿–�t],--`~®l)Zå}£ÑÀ…‹�m¬]jâf ì@Ñw%úÝ6Öî>Äïî9<ýäÛa¤T•Uz]°ŽF£¿+¥üØh4z0«Ò•Yõ­ þ—YI™¼ïövvðüË+�ŠÑ2”Ì/òmMN¼§È¡ÈëÏä
à¸.–æ±0?.xÐej½Ê{f†iY¸rñ‚~â‰›"„Nëþ} Þ¾AP2¶ÑßôÈ2~ïsÏáÿÎáéw¼»»û÷?+°
!Úžçý_½^ïƒ³
¯Î¨¿9k•˜Vù ã¥k«¾mÚiœa<D‰s�ö¹Jƒ’‚ÿ|µO X‡'%–—}2h}©2‹Èczß¬÷`ÆÒâæzxž„iˆÉI¤#QP¨ó3&hk B·ÝÂ+·ðÉÏþ1Þõô÷@9�<c°¯ÿÊÂÂÂ�w»Ý?<K@ýk þ­“°ßôÝÝyˆï¼¼Å€ið<_b‚ '�Ld½u~¶Hàð<J*\X^º*•�E`­rŸJ),ÌÏc~¾�ýƒ#˜F3ºàÉË�eküQ W9ÜÆ£W.âŸ{ü‰ÆÓO¾»{ûÙÒ{`µ,odfy€º `f†sÑÃxéúÖ7 ÛnÆû©ãà¾Ô$p`�œ’gñ<‰K–'(ÌiÁZàx\áÂòçz¸ÿp�V39Ýˆ&í×Ìó€M£;°^z½6^¸~¿÷é?Æ3O=!|ç³ìúŽ!Y/;Žó¡Ñhôß×V�Pÿ€îIyÆ¡4ÝßÝÁ‹/¯�~DŠcaÉ\«fƒ2%lºyA‚ˆ •B«ÕÀRàñç©ó,~7+TFƒòÀEHú=\\^Ä‹×of;TD f_ë3WÄXLÚŠ ÈðDÊ�^¹ˆO|æ9üÔOþ(ÞùäÛñpo:1°øoûýþ?]ZZz!½ÌiõûüìIDÒ7üÒµU¬oÜG·ÓŒu8åú¡áéƒ2² ²@šÔ’®ãb~®�Ë—.D*L:tîRóÀ&™Jót4,&eÀ0Mô{=\¹|ŽçæÞSÂH"V¿åØq8aýšúÝ6^¸vŸüô³xæé'`RµŠäŸ¬A¨û#†a¼÷8íÖ�Ô�à·pöííúž>3`"1>±úçBÊ)ö•µA'ØàJ‰‹ËK`VØÞ¾�áp!â)'Ñ½ä šD(^}%Ü7yŸ@·ÓF¯Ó†!Œ"¦É·¥Ó6x¥‡`U1{ã%üî§ÿ%~êýïÃ;Ÿ|îìÎçìÁ$X¿gssóo*¥þÑ´Y¨¿à1œÂöòµUÜÞ|€N·=‰ÀPÖL<4J¸ûDÁÐrl«f9T�VcÛÆ¯ÿÆïÀq?¢ Ê(Å`¨ ¨�ë¬‚hG¹Qà!*D¯ÃŒ&„Q$<¦i`<vpqqÞ×å’’r” ¡t

•*
míˆn¯ƒµ«7ñ‰O}ïzê{|^U³!CŽ–gV"ú{Žã|L)õ`õ?mRÊÛ \;�îïíàwÿà�póÞ6úÝN4¸Déyð\'ˆÞp"y$™†ü“ÍTŸLÆþã)%¤âþA¸V1Å¡ L+µØº‚Ôð:GÑ.	†Ð�Š �P%Sð<éaP	%9ŽP!ˆJéáÑàzÂøn„J*Ã€Õì 8
Àp4ÆØqñÏý—ñÌSOàáîÞ¤Ÿa>kðý¿¸råÊ¦	¯N+Q§´½tu·7·Ñm·4Û.é½‡'ƒVŒ}©ÐaA�3¤’ÿNA„f³HaV�É-IÉ©ç�„;Ç %±DÆ…òmÎñx{ì`ìÚ�ÒMI”ØþÌ²³ÓÄd�“nüpl«vZ¸yç>~ïÓÏâ™§žðé¾”Z>›õ/½ß²¬O•�{@ýy ñ4@º·»ƒ^^ƒ`dÊ¶cÝP9•™s_2ƒ„ð%Ô„.M™¤¹iœg„¾TÚõ
í B‰I‡Jw‘$þ)]}ZÁt•Ò·Uï³Ïáƒ?ñ#xæé'°»w€tYË¬À&Ã}Øó¼Ï�Çc÷$%ê<€_;-iúòõUÜÙzˆN«¥³é^m?œÎáI[”’•˜3czø5Ú˜©&yÛHæ;M8sÉØnÒÅM„ ˆÿÍ–ûÑ˜3)|õßk·ñüêM|ò3ŒgžŽyÕô¬Ÿ¥d%¢G˜ùC�Nç¿i4'ÔÂ<ÓYÛ¦/¼äó¦Â™&"ƒ†|UÏý’ÈñH‚7 �â5J3¸Ú<ALº„ÏrÈc—=Éo&”‚Vš-7A;E:àÆi€ÀAú
ù LÌÄðÖÉ7I}ÃE|â³Ïá§~òGð®§žŒòU« s°ßÿ×ËËËÿ¤Óé<@ýA ÿáéÚ¦÷Ñi·£/V¤áà…R6Í1FYò‰°DÖY‚Ì�XºE&qTÙBÚ\Ñ­fŠìÖ	$Sl!‡`�+ÅæB(Ý	(=òHoì¯Ó¨•dkð}¯/¦ôºí¾}í&>ñ©gñîw>	!’Œ	ºpl@^ý­ápøoTµSÍÊúø¿O¤û{;xþåU0Ãð9ÌDFM2T…�2*•ëP%‚Bú4`hˆÍ*aw±PfJä!¨ÐþM…g‹€GVþ2åQžô�±FüYRBÇräx!©yô‰\öw½é2>ú©gñï¾ÿ}x÷ÓOàÁÎ^"ˆÓöø1ÁØ«ï�Fÿùx<þ‡žçÍ¨¿à-§Ô_^ÁÝÍmt;0«Œx<W³QuU©#g"”Z³âŒß m’„A(ÂH)`àÐSöªv 	‚ €;!™3½¦ð…<’7GèwÚX]¿‡�ýþçñÞõßq�lñädÉ{ØuÀªq«¿ÛíþîüüüV&ªÄ´Þào�HövðÂÕ50A™�œŸPôÌ‰2bñº�˜–.Y±pœÂk)ôé9ëZR¶oú'i×�žSƒ(WG9×KYCJque�t*XÂ¬ðø›.ããŸz_ÿöXXœŸÌØ¢ì¨aÙgyŸ÷i6[ÍÜívÑítÑétrÿªHÔ�à·¯­âîÖt;�léÁ(K‘©ÉüÔ”]ˆ}*Vé"¸=ˆsVÓÂHcÒêž4iËº—ðƒ‹Êâ€)†º$+HþÎEJóöxRÃô;¬­oáã¿ÿGøÏ<íKÕ¯š‘pxLKÛ¶ÿòÆÆÆûMÓ,äVË$ê_?-Î4òô_^HÀÐRø²þåÔ8RÖƒAL+%¤C€˜I0äØ¾¡D ´üŒÕ8éˆ´ÁIp«Ð™Ñ¨š�1„˜”b©"ãþE‰á®ò.‹o}Óe|ôS_À7¾ý"æ&žDU)ZG²£óaÓ4ÍF£�¼?qV8S]šöÚ­”Úæ	·¨Z™›ç}e¬©òÂ8¥%gªæ¤ìeMÜ¦ìV�í™ƒ­Ý¹ ì{¢t´#äÛ8®ýn÷àcðy†!2ÓgV �Ø¶ý«sssX\\Ìü+êo èœH÷vwðâË«QndÆ¬‹ßs–å	e�%Âè=Q†õÉ¡«L-@àG­40s(g'E!gÚÃ�1F�W&Eeàœ!ùvz˜¯ZåAëÁ’”ªRÌxë›ß€�~ò�ðõo?�……~”ó �‰ÿ>ƒÌŸ¬DÅê¿ï‡y@ýQ ?}šÒô¥«+¸·õ�@šN„œR¯‰Þ5”42=&Šg¢l�$Éd8	ˆ²änJN°V” Dîè_@ã5ãýHø]T’´Z¶*˜¼ßØ¡
o)íìÓD¡ ŸÚÒë´°±ýÿý?©š§N&…Âô’U�ÀÞþÞo`0ààà ñ'rÚ?;M�îî<Ä‹×Ö mp&”i¶iÊßÎs@(×ÈË°ˆ4YEB(ms&.9ot* MÒÂ¦°,FÓÈá5„	is Å‰jvjÍuø2jYcûUJ‰ÇßØªßzóýÉbÄb‰w
!þ«v»�~¿ŸøËê/xÓiõåk«¸wÿ!Ú­Vv©ºæX§œ(JzØ¹æ$e9TEh22åGe(ƒ‰ „ÏY‹²Ù«HõÇðÑ&›HIxªh§
*·ß‹Â$½Nwïïâãð‡@ªÝI‚U�ñxüwÃ¸Òëõ ÿ¥óQŸðÍÓéÎÃøø|÷ì¢×iÇ9š@�W	­cG}—ü÷*ÈÕsAÃÖ61Ýä¢JSp|°�ÒzPÉ¨‰ÿ–eÆ¹¬@�­¿§‚°¤ÞJ…!_¥Rûq|8È3•äóE~Áu\ØŽí3 Ê?§/.¥ßG*:÷©wNe˜…]aÂÏ…aE-�"­¤‚øœŒõ”_[ÅGðãw>üwðžgÞ‰ýƒÃ‚Æo~òÄdáúk
(¥Ðl6?Ýh4ÞŸˆLéá+"ú{§Ðp&Ý½wÃ±‹Ë–ýN(œŠ³'n.!a¥ •Œ2Çæ­~Llæ²æ'±–ˆ—Ì#Ç2� ¨PX+• ?�«F“LÅù	*TçA>j,àØów¥ßâÒ?�B£ÑÀöƒ¬ß½ç×mqp¦(ñqn¬VÞ6¼u(À°,¿W8¹'qëuUá=µÛm|ãÅüá³_Á÷½÷=½h''2�!¥Ê;êk UrggçG‰èÙ¨ú±R)”Ðž<PMÓ€ãØ˜ëwaY�	û9ž}l³©diô$7SÁÉ ±5û‚d$m@ö¥�?ÉZ-Æ¤óÇO:
'i’FÅ�[¤§à)å›$X¦‰v0Û V¨abÇ�MÒTdú(æˆD@ØŒ˜Äd²7’9*V�+:í
ÃÁ!vww3;NÖ†å§ÈäIät•ïx<†mÛmý÷Ò‘©?÷<ïÇN²ÅušÎ0MJJŒäXór+žƒÓ¶wMr
­a“‹(Ï€S–+§¤88N	�˜‘¤ØœI <Å×›ÍÖ·wpueÂp7Hd@jÒ8P·*äXi¶zð]`Z�‰¨H¢†’4«Q²‚ã‘+1�1':xç[ÒDÉP6X]!DÂ5�ŽŽ"Û Ñh\o4ð‚.Ë§ ÿÑítÐl5p4´µö‘UÁF¨Õ„#E!ú‘Ò… TŠºA«P'šç†!Ž%g¤Ú)©
ËUât¹�®UQ[s_¢®ß½‹ÑØA¿×EÔ M!UÄ/bG+ù2©`¥5)§‡Y@PPä/|BÏ’Š	š¦‰‹ËK 	‡*\E M÷:Èë%âÐ0Œ�v»}G7	LÓ4£Ã¼™C‡�È¦”ò[-šv�#˜5ë¾#g¦ú6¦ŽB‡EéÀLÛ¸ˆÛ:FðVšÝËI¹h÷ ¸Q› Ð,ðm.(Éh4LìíâÎ�M4š�H­+æDåkxå*B;%ÛZî®
¾'ÀÐl\„6nÊxAÊÑê´XœŸ‡ôdÔHcÚæj¶‹_õ</±ƒÙé$‚O7\¿¯µuZN•Èð;”È)Ú¾T^9¨ˆÄS¤:Ç¾e�»šh1¡ò5u«ÿ«ÙŽ	ï—U”;£4ïOI	¥‚ÜÝ¸‡½ÃCÌu;	�Æ ®:DuÞ€mPúÅ	´Ï“¦LúùŒÇ.,Î£×mÃvíÚ M«ö¢}2Îu}8&ö3õå¬‰h�ˆîôèiÕ4�h¡ÉuY¿¸ktuaª’�-ÄŽªhD¥Õ=«�9ÓzÕiâaëf‚öãºM
ÝÉC*A„Ñxˆõ�{°L•Ä°Š+\¥øX:ëeØÉš¬ð÷•š´ÅCÀS€FŽ�ï^z3z½.\Ç­,«Ú®E’Ö0Œ•tIµ™ü€ ð*€SjpQèw:�ºñêÛ…|ÚaJ=Å)Ð&½k¡%<cdH€=Ë,Ðœ=V“‘5íœR*4ÚMÜ¾sÛÛ;~ð£PŠrÔ�…uuÎq=˜”6Ä±}L9úp8Æ…¥9Ìõº8<<<q€&9)×Ò>’©ócÁê×ˆè‡NÃó ­f#&¨k‚”$ê¤š±f#&ëŸ|•%T\³IZ9É$(Cª,�MÂÆ’�1)]Ì×uqçÎ=ßá K¥Eâ53BãL#ª”9#Ý vè(UçUf2¹®Äòâ"+âwO —z}Bó†³E‹
\·,³ji]îˆ,Ë Á_�DÔšôTž4!	µ•žÙP*XÂQÑÎ9)9ir`Ç%�W
0M�‡÷pïþ6ZMË�¢éÆ
ÇÅ�¬›#	�ê"¼ŠX.WBñ¸„‹Ë‹ñ
24yOuV¬êL)¥WÓ‚2òúÃ�…a¬f•"Ÿ˜úÐjµ`68ŽªÓî%U"ÏÈ®&MK™l°ià�šñ«¤pÜPMAÅ� 4Û:-¥Ÿ7gèŸû!P›[°í1z�.TÄ'wbZ€A�)\	(	ÅnØTKÓ¬�4 ð©^öŠ áÂò"„ÀL8Ó¬ÀšišÃ4�•ðúƒY³vZåÝ³B·ÓF»ÙÄ``Em5˜Ô‚¢?¥ƒä—˜�ˆ³”X±{Ö8ÎðØp²Š¤$Õ½khæŠÖW*Épö¾À…Øß?ÂÆæ6�†ŸpŠK`Ó µ»Vj0™îZ á ì:ÚÊ„œ(‡NŠå@%Â…¥ÅD¾@îtÚ*x}=«ïÂë÷íºà þé€h˜L! ¤°Y¨JË‹àD?Ê€wËŒØj€¤ô¥Œ! ×{n X•°á"!4áõ§$iB‚"i?&È~$�Ø�¦)p{‡G´Ú­ ‘[à0	µ: ÞÄÜŒŸø^ààÞ7¿eZ~Às£dž8qrËª›ãz˜ïu0×ïÁúµN«æëðªD)åjVù´™¦ˆh¤”ZðîS«~·9Ë‚T“}™Ê¼ý„ÈiGK+Ö#4ÛVî¥+€ Ì{›ð0žvL&Á2A5±JQSúo!)]u›qBº‹ 9ÚÆÖ¶_/ÑNLÈ´@ÝDoÖO¼í÷=)�ñïô`åOA®¶m°çi]T’ ­»�m–ÐëuaÛnnCŠi$jÙº° V³&•™Óðº’òÝê­¬ëØ¨–e¡×mC)?’‹UÊdñµž$¯™6M Ñ€ÙhÂ}Ëã|ß» L ûÕ—`]¿
·é�=Ç§Ç8Žõûb"™COäHÆ­S^zeç„“ã_¯i6°µ½��½}4­`á^–Á*‚´Z Vüô3Xú·ŸÁ»Œà?òp×ï@¹càèäØ`ö ™à¬ØÑØÆòÂæú°íñÔ^|€¦÷B\ËÂ\:{Êk¶Z>á*å)T†i
ôºí(G´8¼Tô@tÊ'°;… ‘X¸Ë�O=‰',?çúÓOÀÞÝÝsÀÂ€RˆrQ£”7ÒÎÄó“Ñ)NÙ¨šC£å$AƒÙs6î? K¶ „  a€-pwâ™§ñTxŸ	xøH;O½´±n4:
3úŽ½ÙŽƒåÅ9t»mì¥ú¦ž@pª£££ëY½þMÃLJTƒ!VˆN>æ_!dòùÛIžµÌ.Šú�`6a?ò¼qÑÂ{0w	«o|#šÛÛ�bà«vO%bÞaÇª(ßTiIÉÈ¦k&=û¤™~gYööñpg–i �{¨²!`4ÛàK—1÷¦+ønÀüVß/¾åÍ°{Ímx"túTý¤þ	éËX^Z€F!%5�z/zÍÌë†alfµÛé¦mT(¥V<Ï‹O¤XAh·Z0MOz©>ö7�EM¥=k"�0ÁÍpa	o p	€)€7¸±¼¯Óö (�¨‘/W…Fª=­¾¨lg*NÒNÕ`ÆÖöCŒÆZ+b)T öÉl �&ÔÅKXœïà2€yáO²G ô/,b¼°Úl¦	ØáS¡ruT°Iéáâ…%"hB<¥ó4…ýºÒl63/tÂëÀºôÐI4I#1z½ZÍC�%&lÁ<©šªNJ«ˆ„iAv»h÷{XÐ#À ° Óïb¿×ƒ±cA…-*•æÒi)p¬eœèI(…6uUŸ¼vN™†ŽFØÞÝõWêS=¿Å,0à‹±Ôh’oŽ,307ßÅýËàF0,&-×QýžÄ¥K0RªZK¼©úœþtÕ¿–·E¦3ED›J©u¢Ù5F+"ˆ•Th6°L®+a¦®)¨qw²äC
%Ÿ
›Q�Av{è´-ÌhÀ÷SútZ„‡ý9a@	áÇÏ•Š@¯·°dÝNIÒ(}.ë×H]]ªš¦‰�Ý]Ž°LIAh †	X-4zX4üëEpýó æÚ ÍÏ�ÍÈ4ÀBø\yœ,ÓÄÂÂ\°ªu>ÀªØ¬%ª>ýÝjžóžçõ+ ×¥”o9Î"Veñäè&É8–iøg*®›Odûh#ÅœhŽËZÖz\Ñ4N ªÓA«áwÔ0‚Ûi3Ðµ tÛPÂ ùµF*N|NdµkTTRýg”‡¤ö×Ù"‚3¶±µý0JËKPnÃ!ÜêÀìõ0 M„Ñe`ÎŒ9¨0‚ÈUP+ŠTÇqqaqs½lÛ®2�&®ŸÚ®æ�sÂëšv»½&„À4ëUÉM_°eYè´Zð¤ô	ïœá

ÐÊ:4IFQ}œX¦¿±F“	n5Ñ@S3áš–l·!…¯úýÕGdT�OÑúRq˜4\à7+méº¤4wª�F»{{Ø?8„i™PR%h¶HŠ	ÔjÁì¶Ñ%_’†[‹ük§^0€i”Ò€•Ô¾íbyyó°�r²¿Žt-ûÎ¶í•<-S¢
C D+@=²@'Ô�ean®ÏóÀQe©F–Op¦aK^š(æ(ÊôN2¸Ù@€©Ý�A@ š<ÓH@)ßÑRÕ� ¸,%ÔDú'¤£Jüä›í‡»�RlGZú*0	°iB5h4h#™ÍÞd @´€e�„ääÁ´TG®ƒ¥…>æû=Øc{&Q¨Šßí!ÖC‡~¨Ýn7ËF…Rêºëº¹>d�–Õr33Ó@«ÕKé©‰öæael¢‚2ÑY'áƒÌg#�®Â –TýæÃÁ7MH!¢þý!—gàS´žSb²„Yúáwœ¶aµ˜Vp*Ã0qxt„Ýý}˜†é¯7¥q¯>è�Àd!°Õ€a™h¤€jÐbÀjZf�°¢5Õ éDªçJ,-. Ù°°0š0N  auîšÕ°sU–×€õ:•�©ÓJÐìÏ–iA‚”2è%ŸtT˜Ã… ´<Ë@Š„ QZœ3,Öã„Øwˆù X „é;R¿	Eèõ³..I_uÁÚR˜°OõòÀ„D6ÆÎî>lÛA³ÑÐòKIËv’ˆº³¦!üëLºZ°(Ð~!HéøÊßu\XZ„[ÒÏH½ñÌ¾î¢›EmÞòœ)Ñm)å.‹'	Pf†”Êè÷»°xž„iñÂ·A2³šÈ·¤Ôg¬-ZFfð	˜BÀH¶\PÃ$Ñ é	.1O«Röi¼0ðdŒ_7YˆÆ¶�Ý½}ŸÙ NÔ:ª#êîÇ �03uíÄ¾éb„©‰…Ï¦gÇŽ‹+—–Ñ°,(%gfV�²«Eþ�™¿Ü XUJ½wO¾
@“\*0×ë Õ°°7¶£Ö†i€ E¬G„¼â‡ò¡Ä�oŒÔ
Ä3¨ ^*µºáTmT¢N£§(±Š!™L_«eØÛ=Äx4‚iYZ!Ù>Z© såKÊ¨ëi¤ò�Oy+<×Ã…¥E˜¦Hp¨'ÐR�?×ëOÒn·oÑ{Ëê¬�™¿¯‚aX°LžçúÅm*ƒ{K÷º‡­	š–¨,%„ò.èKÝd)EÉR)UD‘E’�“åÔ`dr·i|¡‰ð¶Žãbo?3é:Ja½ÂQ%è0Îp�(È©ÍOÛ~�®
ZÐó$ZÝ6ææúp]Ï¯Š˜ZÅWÁA8Ž¡Ç_—G·•Täà KÌfÓB«Õ„Ô‘§«;}sQÅå ¡4“ É$håWw†…u2c°üêWÉ¡¤¿Hoèà(dF¥ÔX‘Ð,Ã4qxx„ƒÁÃLØ·H'uågñK†Dª­9ûKE&½úé%«'%..Ìaa®�ñx<aFÌR‚¦^;Bˆ[E|½™•M­�àºÌHb�@Óß)¥Ðl41×ïÀq=´¤Jî—Êçô'O¼0Z¢ñY†TŠ!”+	7ì4P% Oúà„R¾DÕÂ¡zII–ý©Â•ÌFnh¥ÄÁá!¤dµ­{]‘ÿC®×•pS@õ 8 ¤ë�¼¨©ÏÄÚu¶�ì_ZZ€îdŸ @Ã—·Ã¸WÔ’Å¨®§½þª`¬CW…-–‰^·Ïsg–]Ù�žŒ¼}½¡C¶v\8®Z]|0ð. ×Sðl°](Ç;NÄ208nQ“5–SåZà!ØG„ÑÈÆþÑf´\¦J)H–š¶÷'	Ù~B4�Çpct �”Ë~Š;¶áÙ#È±éØ€kûÙb	k–+åÿyŽ‡ù¹yôº�¨'�5LÖuÏóÜB •(Ñº”ÒÐ8)€¦ù[!W
y¤($3÷jG!�ÉÄÁBjì¹`Û�çJŒI¤K¥q�„!pmHÏ{^\S@X“ÿéªÒœ„éH{3C&Gð\MÓz©†F0žÖÄ1žã×B�ÆðlC\mÀ€Ù`×ñ¿e�ø­d†óU^‹æx.–`šãq%ðÕm.‘3ö«%&h1PÜ%¢[`¼-Ñ`¬‚±\Ð¡jíu;0LÇó"éó’´ådUNV`rØrQH°'Ï…ã8!^Oªc;P¶xžoŸz*QµªT\|¥Çå|ÀDLÁm¶ëàðh-I.o	á‹xJ{ía9‰’ãìÃ#á"Æ*&‚G Ž�€gÒ˜‚< \¤Gc<ri­fûû'Ð¬cˆèjYM—9ŠNâ5š�u2èm¬TF>8ÓŸ+VX˜›CË²0²ø4·o[&ò:3Ë?ôÌ©`)A®ë«ÃÁƒ@]†ãh+`  o8Ûc°çAz^ª`È8›*+K?ìKŠŒn)–a`x4‚3v Œ¬2Î6N™Á®ŒGpŽ°`\·?ËÿÀäÁ¡_ (%¦îÁJé‘�K—Ñl4 =™‘™6}ªÌRÊ•2ag–eF°ÂŒ©
ÒiL½-v»Ý€Õ0p8ô`šÆd$œÑË‰“¡°]¸j�a�á8PÀH›¸cöp�=„t}õÉA‰0‰™dPÈœLÝã¸öž3ÖŠb<H - Ë6òc<äŽáíîc×-_.:ìØ(ðÞÈµ×ÊhÄÂïüJˆùy?½O•«'6MIç›¥@mµZ%j[]“RÍL‚–]´iYh6p=×ï¡ŸN¯Ój×AZèT¥¼ó -y.Èuàaß;¾Ê ŽØs ÷à¦ëøö©TPJ&ÔºGÂoKšVy<Ù¸B©0†£1Fã±AšxJÓõbRM{¤kCÜßÂÃðpÁ7U† ¶ìÛ÷¡¤Ø¥œq®´úÏCéIô{mÌÏÏÁuœÊÍz§u ´÷Û!5U„/³BuâÊ¬%hžÍ£”@§ÕF¿×‡=¾�V£‰dÚ\*Õ� ÙªIÝ¨HPÂWýŽ<ÜÁþÀÆÃN6û¦Þ.€�¡?Ø�tlHÇõU¨âD[•ê<�AîCA…ŽµKƒáŠ9»÷k‘Q »®o’lnaçÁ6°«€Cîp°µìíB�‚réÈð­/V=Wba®�Ë%Ò3 a©úgæufÞ/a•n·ôÉc‘úå4Z­ú]Ø¶ƒØ.ÖU“­ýÅéU”I5±Oîç:ö¼÷{»Ø¼xÊO÷Û"àáÞÔÃmðxeÛP•&Å…)ý§û¢’¿_ð?58Q®ã`<²³¥iBv¦¾'áÝsÁã1°}‡7oãê[ð]
8Àš8+kà£=°=ò¦¹81%^–}r'©$æû=,ÎÏ«³LOE•¨ùô÷kUŒ!³BöþM"Ú&¢‹'PýsÃ ´Ú(0<)£•ÃùñâÇô�(ŒŠ8Òîïëz�£Œ½]Œ×ïaõmq€Å¾ªÞ½ñàÔhåyQ= O�ÁŠ à÷+¬¢É!Â¤™„½êK}Ë20ŒáÉÉÒšIV?ç+é�ÆÐà ø×_ÇÕ÷¾˜÷ÕÿÝµ]Ðw¾ {T½O,²[MŽ=�Î÷Ñl6áº^fS´*ãZT•u"ºZ¥‚ÄLwöÍ Ï~³Ù\pñ¸¥ÕfÐít`
‚ëJƒâšú 9Þ³Òk“4�F<«‚‚AÃ#ˆ—^ÂÚ;ŸÀs—0 ¼|à…—€á¼Ñ �NÜÒºcFP,ý†»Zæ–ä¬Ú}Ÿ!r£±S­;¡ÈF” C9cˆÑäËÏcç3_À·ÿý÷ÁÛ·1úô§Á›·á@žHrQ¢ù ³©¥ÑÈÆ¥Ðl408:œIô2ó!Ð¢+U²ñÌŠ=‰V¼géYG-„3kqa–iT‘‘*ë` †– ¢Ù¦ˆ³ð£?ðØaÜ¾�áŸ|öÓ?A€ü“\¿
wxè«}W¦ú´ú›CN$ÅLtDIhnÛvàº^ÐóI*þl=-¢ª:: ãÏ}îÚx0‚ºµvFàáÈóüå(*%�2—ç�påÒ2:�vww2¦ëú#�]Mõû‘ ”IÕk¡I!Õªê½èx©ú½.LÓÂØ¶Ñ”êOJAÆP’S�<r­³Ÿ~'Á®::„$úÿþ_ðá!Ð0�o}jx yxà;-J¦LÂp¬¥¼ Õ˜,ãNÁOF£ü ž™
ÜVõ¦|%Áã‘ßb¨5„üò=° S@Ž‡ ±T^†U‰+q,/Íû±J%ZvN3Ž÷³Ü¨Ô*;	!VÒI­³� ™ïh6›h5`6â¨K€ÌÈÓ3�T¢ÀÚ�€T!=0�}3Îq€/>ë;]­ÔxÁRF¦„J(09¢tS�×¥X�)ø‹¨9®ƒñØ ´BÅ"§PJøN•”þd
…bò¤Ö*½â&ÄDˆU)†Ùjan®Ô¬)�¦ig½ê‰özÀ�J@­¸ªÈ�²›•Y ”B»ÕD¯ÛÆ�{[°,#*Ñ`Å #XöF%k•ÂÁó³ UìØp�5å¹€ô|ÇC>�÷� ¤òdœÊH”’°fß) " žÒú¥©î\×gjcFý;Ø/O�’Ù°&Ô
&("(©¢è”’èv[X^\‚ëº¥Ñ¨ªL@-»Võª«Ú¨kDdhÎ‚7Í;FKøô»],Ìõ1�Ñë´â†gðœ¬4§)ÎlÒ”%Öd
“°]ÝK�Ïküp•ŠbîzôIj¬C`<éÂõN`ãzÒ8¦Ñòê
J‰ „©ÐmµpáÂb´JY<¿_š;þTœÕŸ ê8È’)Ùî†qÀãÇáQ«€UJ‰fÃB¿×�ô<(©‚Dö‹Ý‚¶Šz5ªBF%•Ì¦ÞÅËÛ„|ÚRx†DfT‚Õ�»D™ñ'Ò´k6ç$2@ZzŽëyè÷»èw:p\§p|ëø!e!ÐJÕ[ªªú9Ó�ÏÊëÏ;>¬|ívÛ Apƒ…l™%HåÅJÅT¯jvº“¥ëifJµ„Tñ~œ‚ '#ae@ap öif š¹Lfòëb´ ¶ëâ±¥E4š8®[ÛƒŸÆ,Þ¯T-ã6›Íf¥•R×˜ùG‹"T³tªæça”ëE\ª"@Ê™}õYi= T*Á:RœR[õ;YêœXpWÅ}cÌq��Bð<’UíÅ‡O©B@‚’ �£á—/^@·ÛÁÁþîÌÔ{Ùx+¥nT½ì*‘©˜×§¡'¦±YÀÒÂ<CÀ•,`øîBÛT'ö£¬{¥SK**ÉÁªRœ’Ù
�Åáº¸\OÛ2MÕþèÔ7
{ÇùEÀØ¸´¼ˆn»…ÛÞq¼ø:ûï†±R¨5Zfß8q€Fv§B»Ý‚e™°mÔ°‚.&±÷c.�œŠ­~"à=UrÕ=Ä�U|µNÚú Aj_M{P�_d§$C�x`•@†á'ì+JÏÍõÀÌð</s%éY�7­1ó¸2P«J"Z¥¨…N}¯¾,A!mã´Û-ô{`È°‚PªŠ•9Õ’ã¼€Lu2IF›"B=�›7Å¦@A³�Î<P™ƒ„ß¥ZIXÍàIy*34%ë¬YVÜ§o«Bˆ=f^8.@ËqO*Ì÷ûXœëceu�†ËZRJN®è¥U @[Gï Ø­ékñwDj!æ)Þ�¨Qi[�3„TA¾]í*´š&.]¸€°âø8ÑÆªJ±jM8*µÆí�Äü§c�e	¥”ètZ˜ï÷0´,0û´T°æüD	ˆž¸œnC®×Øg,à{€FFË°§ð«cÒ‰d ½–ü¨Ô¬´eát½Î%›–eÕ‘+!Pë®;T7:e™:�NP^á¯ºç/ú¥Û”~kÉ¼áz¡J�Xé&}Is:n‰QÌýªW‡ÊŸ°Tžçøuj­\×=Q€¦0°ZÇùÌíæ—MÁˆëUlÔiš ƒ‰°0?½^ª€úO7¤PšÄLõˆJ¯ør¦¯ï�ýñÄØvñø[Ñî´'jù�£ÞKÞKÏó®ÕéfnÖl{¾Zå‚¦%üuÒß0\¼¸!‡ÒTÆK5ÿªô"e	~5¹&¨RÁ?³çW)R}>uh»¸pa	óýloã8<y'k�ˆî×Á^bué
žÿŠž´PæÅW��y@žïö`Z� ¬©7P‰¢:$¤g"Å)Ê|Jö³SÓô*–ª‚ W2–úhX&\Í±>Ž×_×ë¬ÍZ×ë­0³df#±Ãt„o.@•R~Ì¿ÕD¿×�RìgØK-¥óïbòñúô:.cªøìÆß_!¨Âj6077ç·Û¬¸Êqh+¥LÓ\3M³²ÇT�õ‡Û&€[bþÇ	™–ÕÚH¥0??��VÖ±<ß×r@“‰%Je$2G½ÒnýÉKœiÃ7û¾ÛXZZ‚ Ê]œ÷¸jZ )¥®ë‰E•€*ê?Ý"z\J9ù_uÝ!Çqqqy?þÃ	ßõØ:û½D�RJõxJyL9ª>öù³Œ²aŽ.¡ê	Šö£Š¿‡š[ùDŒÃ£ÞõÔ�Ç³ ¡²šRêºmÛµ–…ªBgÜê”tD­ï¤ç�„Àúýh·;“¶ij‘ºä“œ9¨œÌNÉ_ãN› L´c�%6MöêÏ:�†™d’g �'¯�SwYvýéûfÎtû 	ûûØº¡Ð:)€FÚRÊëu¥c]Õyþy«e”Ù Ú»Ä3OJìïïc?®ðÄdÕ§ŽˆÌ~þyþ:kPÔ…qâÎ®£š8WAœqM &W@ÉðÆÓ«½f¦—ÛL‡“¹ÈÚ5†-Ð‹ìÓY 4Øv„·kõÑG­uÀp8¼¾±±13€–QZ~º^õNruö«K§å%Ÿ@››ZÇwß²jÓÔäXÖÊòòò ¶×ÿ¡}¨ÖO=õÔõïýÞïÅÁÁÁÔµ5ÓPZúçU;¶õ3JÊŽKWt|	s’�*×Qå÷òl¿¬ß9ŽMZ áfYF£ÑÍ�~ô£Ñò•'Æ­ÌÏÏw¿ó�ïÜrg9½VfÉuÒ¤*ÃPõø¬ïŽÓvqšë8.É~BqúZ ÷»|ù2>õ©Oýò¯üÊ¯ü­Úª¿î‹‹‹"Zeæå*«]”ÕÙL³°Öit–Îáqz\šè¸€>@uIODµ)Ÿñ­)}G£677o6›ÍtW¶Ä_ý”÷>}ŽôwYû–]CÕßÉú­ô9ªÜG•ãòî£ÌD*:O�ë-;_èªrŸYç$"ŒÇclnn^›F›×%Qikk_ùÊWV*Ýpúæ¦A Ö=WÞµ�£ìÚŽÐi€^wÒÔñŽP½ä`0°Ÿ{î¹ÛÓ˜žfin�Nç•D2faVe²LŒªfÄ´×:Ã¶‹S]ó¬Tþ,œ¤ª	Õ¦iÞlµZ÷¦Qýf]�Àáááõ02Uälœ4@«H‹YØ„'Ñvñ¤z^|�æÎ�ê_wýzò4¾JPÔ) |âŸ¸µ»»k‡‰Uíž2»°®}U¦‚«ö4ª¹
§:�½]f3Ïú½þY_Ç¶×?ŸŸŸÇ·¿ýí••••©Ø's1<�7-Ëº5Þ^¦óÔò4žú¬h—®�4óÕìN[zV•öU¯3ïsÃ0@D+À,”¬æ4ëÞÞžwÿþý[ý~ÿí®ë–¦†·Ü,i¡“âAgÕßþ4xÐ:êý¸ 7×u±µµu­‚ç:@-Å´¶¶Æ_ûÚ×Ö>ð�àðððÄV_ÖÇ²,4›ÍÌµCýbÀBÊ,ü‡ØÙÙAVîã¬z\gÚk
ò;±¼¼<!0áy^ÔK¥Î_š@ƒŠSØ¶�/}éKë˜r›Fõ ît:‰,í“�lá¿–eáððë·Öa˜&FÌh6[ØÜ¼·¾½½}@/´Pyä‘ÇŸ|òÉ7�F£3!AgAÔ§ß[–Û¶åg>ó™o0³ËÌÁ
E�?þÖ÷ZËò"N®ÏEB`a~®òªáušGÓ4·šÍæí
j>ó;³®4_Ü½{7jî;ë…]Óû4›MÜ¼y_þò—ÑîtW�¹¹9üÚ?øµ�Ü½}ûÓ Þ8‰[üàîû¿ÿûÿÆ­[·ŽÅ0LÐY2 EïÛí6¶··wññWhÀ_�bðsíçõ‰'žx÷ÁÁA¢×¯mÛ¸xáÞü¦7b0»çmÙç–eaooïöööön]o?Ïë¯R€Ï}îs7G£Qn˜4Ï‹¯Bæ§o\J‰V«…ùùytÚmt:�èonn£ñØÞÞÚz à Þ€õñf³i†6tÕXUg«ª§^—™&¢gÛöÀ �÷ÿ€ùû[÷V»½.Z­&ZÍø¯aY˜Ÿ›C£Ñ˜rTq8ëÚ½½^+++7nÜ¸â‡JðFEµ’$_ÑmÓ4·˜ùr¾sµ*¥„e™0c"¹¾Ùl`}}ý†ã8{ ú ¬`¶÷ööÇq`FT³~RqøãHÈã˜†a`0ƒÇÒþ5 ônÝºuÓ±ýu®<Í¶gf„]JŽ³~XÆÀ²¬ë~ªHÓÄ>UB¨:ú…¦úw677o·ÛídcÝsúëO0cÂ™²¬ÖoÝZà h@µ ´>|èŽÇãhMÏiâáUãðU8â²ß­ÍÒß†�ƒƒƒ°ÙXS»ÿùk×¯mìîîÌT“f†Õ0Ú°ŽT�&0pûöíë)ÌQ)ª®©Í¸zõ*^~ùåý~¿6@ëRXRJ˜¦-â«Û§Žcc}ýÖ:€n0@fÔ��g<{Yª¿JDë´âðU9µGB`ww7ª¥=ƒ®’òàþýû7Ó=p3VÃ/–Ì`QfÐ0"ÅÌøó?ÿó[ ¥ªø5ìÒ	ÉÚjµV²$Ê´EEÓ4afBa˜¦‰ýýCû¥—^º¨}#$@cssÓ‡Žaµ�r’ �Àúg!Àˆv0&íþ› ä�Ûë·ŒTï`šF.HgPý8Ã0Æ­Vk=ÇŒ¤*½ŽêŸ8ùÍ›7W§u*ª|—|M0-JëqÒlµ°µµyÛqœÝ€–²´�²¤”‡#}9ï¬ßÒŠãd_ Uòt3‹Èïr=ì ˜†¦QLßN½¹>� ‚ž§>pL˜¦	ÉêXNREÛ»»»wïÞ½[–5U(0E*ýïŸþéŸÜ,š}Ç±{Ò ‚`šVbÉOÓ0pçÎíÛoØH’ Ãápœ'QóRë t/}š÷yqx×u1œ”45‚¿îµk×îïïï­@ª†ö¾eZ�ž<1€†[§ÓÁúúúÍ«W¯:)S“*‚´Ð™ÊSùúÃ¼#„×h0dH¡a™ÑZ¥a´ãÆ�ë :©2 òÁÁ��î \'‰»ª³5ëD‘¢ÏuGÊu]ìîî:�D5SæOG)µ¿¹¹¹ÞjµÂ“Â4cÇ4�º›å&„XÕX&*~T¨y*?ñþúõë·¶¶¶6ÂÐæ´YûyRCÿŽ„€©5~5MãkW¯n@5R`5`ß6M³’z¯"UNZ½çMÖ<GÅqœ¨Vj¢�”UwîÜ¹#„_­€[–	=`3kpê“i}}=LF1rœ¨Ré*¦QùÁ¿ÖóÏ??¾qãÆ­n·;“¬ý<@„Þ­eÆ@m¶šØÚÚÜøÓ¨"TÞÛÛK¤#VH�r�iíÍ¬ó×É¦÷×µrñàÁƒpÑU¡=‡ðuûæ�wÆ£ 3‰Î„0Ôé;viŠï|ç;73´raXIõç©|ý!À4ÍëÓR?uLfßóU• wïÜ½E\+5H!XÅáá¡z·ER= uiµiË=ªJ5}?!Æã±½¿¿ïe˜>!pÛkk«Û{û{ƒ�ä7ƒ|‰ÓXÅ…ˆÐh4nPR•¤j�jz nÜ¸q3/�:KRLË H©"Ò?t"Ön¬Ý@ªO ¡Ñnæáá¡�£V—NKÔWµƒ•RÇ.˜‡¶mÛ¬©ÕôshKélnmn´Z¾‰ÖhX…=fµÿîÊÊÊí�G9¶–ê/#e#.õ«_ýê�¬«Y¼äqûü0ªo«ìï�WWVîÑ(#5Pá¿æÞÞžíy^¢¯RYœý¸D}Ùùêt²+:g>u˜YjÚdâ P÷|íHT†FÙ�ÔÖjµ°µµuë¥—^ÚÖJ]�˜ë/³Q³ «�ÐIdÓ+¥ D­f7oÜØ�Ç{JZŒ[7QŒÝÝ]Çu]! ¥œÙZXuŽ/Ë¨Cº§•€Cõ´±L`­­­Þµm?ß¡Ùh¢1èWÈÎ¿\_7#Î¾Ö{¦_s�¸+¥"YáŸùüóÏßÚÞÞÞMgâäIŽië‘X)4,+�Œ„»wïÜ	€Q ÄƒlÇq*WË'jTµ»Žô,:¯"ŒJy9QÆðY´oÞ¼±½··;0,–åÛúu:9N³ùé™7×´ðnÚÏ©¾¯BOýÛüÖ·¾µ³±±ñtulÐ:áV¨:Ó4á¹nÜXÛ(�ôÑ¹ÿ¾cÛ¶z¥£H³¨ž9uttde‘Ý×ð<oÿþÖÖ½¦ÕDš9IõÚµk·r¨©2MNy@¥Ò_d¼6¬…3´j6TÕl+ý=¡ÝicgwÇ^]YÝ
ìÓ¬›�TËáá¡;í¬Áy54=‰‰üµWƒÁ8uÿœ£	å�;·ï¦?ÙõFÌ'µ…[ Ì“ª¹¡UQ‘7ÍC¼ kkk·²Zü”ÙxuÃ—Bt»]lmm…öi#cpô#Û¶]=Œz ZdÇÖù<ˆó;(î+�åÚÚÚ†çy°3í$7?ah_®¬¬ÜÒ"Re¦e.¯Zµ¥å¶ žþù›�F£’š¯â äI\"B³ÑÄÍ[·n°S”þ“fw4ÍD¢æ]ë¬¼øº’Õó<ìïï‡a
ú1“ mßºycó`oØïu£PôIÚ§;;;w¾ùÍonh¥´8ÕåUÍ› 
ÏEšˆ_ïv»XXX¨DŠ×ñnõL¡F£�Ý½}¬\»z75(”©.UÇŽãðòò2ô$êi½þ,/¾Œ“,Ú7«j•çbš&šÍ&ÇHUÎd?·¤”;û÷/^¼ôØx4 3NLý÷û}ìïïoØ	"‡¡º—8ÊhvŸ’ÐeüU‰T% Ý¯}ík«_úÒ—^–RZžçQ Îhýuð>qžÔûðØ‰Öëõð�o|ýàöíÛa¢4§ «Ò</ ù�o|cëòåËí€™‰ˆXûÝÊ´S™”Ë*LC=|Ï È4MB`ccã0c¢æ—¾õ­o~ýë_ûZ`v]7=©yŠ×œ2; ÏÏÏãë_ÿú™9Ìlc�y42 KV32ï,'*ñ0tB9œµHfïèVÆkK;ÆÊ9.äàÆ[Úõ¦#Ré?UÑŸ*JX•V<.-™ó¯~�yUiï‡áNýyÁŸàjï]í3WûÌËxí¥ÎããªÿŽÊ¹®,ó-¾YqÊ(3¸ˆ"{EôCÎlUÚÄ	ß‡1l/ecgÍØ" ¤t°Í
¬U€š¬	¿¾Œ@’w½EcI9¸(¢�*—L›zY†K=Ã<OªfI×,	š–¦""T× 2€Š{(mßÒ)ƒ®Îo¨JLe|ž–`†v~]Èä�¿È ¥‘¡ÍÂq
#e^† Ëc�¸
PóìÐ2)XvLÑ dÙGéK%ÒW—º*ç¡V¥ÛÎâê»Y´HW•¡‘²Àšõ'¤ki‹i›õPjœåõ×QsTrUUV�J§€Šœ‡¦ƒ4”¶²@UnxpÆ6®ñL‹Ô?ç TV sõUgâM%,Ì �ÕÃæ‚?•£†ô}ŒŠ’´
H_M+îr'«°*åØÈéZGÊÎJkLHWsÊV4›‘¡~ŒŒ!RUüž‘!=�”ôÌSùô*–¤u�Z¬*´2´úþ²DÊrÉ;°ÍIHTP?”’„2¥ªó5ÝIheU×6}5oU„2$b–	 3@+3>ç‚ó•ááX¨YáaTñŠ¹âŸn�R†4•ç) ×Šžå8‡|Æ%,WP‘\"]UÆ¿ªÀ&MK×*ü§*p´¸ÄÎ®d>˜5Oa‰Gf¨{Nq}Œd2´Àd;e*ÊŒö"[‰ÏXyÊý³þU<«Lù\ Ô<ó í_‘÷EÔÏ
¨™™×SHQ¬YN’®òÓÎåHS ;—Î¨¤<	Ps‰´Ê¢®Š˜ UÖ,iÊ9Ü.* ·ðþÌD3W�²Y´R‘3Ãö¨J‘ÉY Õ�)
€Y'�ñjv¨ªHÖ:ÔU# + ˜K <3ÕŸV}yQœtˆ* ˆ*˜ñFŠ )*JT=!?4G%*�^# åm§?¨å´„”9À•ÀURšk‚x+f@ËÀ›p‘³$('Ö<yN5OÕ/‚öZVÿEæ@�””¬(aU‰9À5�Y‹ðgä—vp8³$-2 �¶eÒ š•Vñ”ñ:KjÒë¤Etå Vå€V¦øSÎ-£8‹ŠïsïÉ,P÷\àëS`2I9ægHSÆd=VS�Gê#`~€s;µJP@•8[yª¾ªúW)aÆé¶„D-SÿœNQpÃáæåì—ç,åq¤UºjÐ¤šN T‘xGEÉZÆäE®²ª‚ÔÏ5còlT„”âä²³ê³Èù¬ÖCª¢õT%êôZq˜f!I©D�rŽ“…6 J6ÜYB,�:ËTÿE^Z‚f™ú�¥M€P}‹ #C:§Õ{Yì>Ï&}½ªü*& ¡8&ŸgÔ‘²e@­c›rÚë¯JM©o™VÿéÙ!0¥â`Ö‘¢U½zzƒ³*#�rÍ"î‹h¦¢:-T˜¥±Yƒ;MÛ~œ«ÊàA9CKd7³¨£êQðšQ/WöµTÎxUmV”€µHÒªp—IS”yýi@R�ÝC)‰¨ßX™Š¦Œß¡s /v�œó¤?¯"Mé5(9«HUByµ@–f,ª(bPàh—¥r–3UÕHO;SY›Ê¡•ªß9KuÕü¹ê/Wÿ¨ Ž«ä¹æ1>eŸq¾‰ëÌã#³Ô¬( P–ç‹–ÙžUjá¤µ$.*²<%`óX„²ß(ú¼²ÀZæä”�³Ê)³EÏ�:=P«Ú®U’[PÄe’eÎU•º{*ù®¬ð�j‚½®NG½r¶
˜�Ò2 ¢‚·]X`²Þ5Ž�¥úZ‹Tñ÷�6@S74[ •@
T/|«"]QŒU¨¦º <—®Ó› eÎVH« ršr•R Vk`Õcóu wÈÓ/× mú³¢„¥Ê-êãuëä«€0ëiú«Žtå×!°¹æ„®BaqŽ‰Áö/sÔÊè²cµŽ„�Ð')=_¯@�µ³•gßV�4ñ”×ÍÓ¿Ñ £
ÇÏÂÙ97	fâ¢mU%âÔ4½ïq9¦‰ÍÒ“?ßNà\ó8>æ¤‰Ž1f”Yf3Í¤³Æù650ù˜ >ŽôÌ=nÖ=™ò˜_½ŸÎ·z’–gù;§I�SN¯M—Oã÷h†@;w~ÎA{bç¥W!¸ÎÁ}vAwb×pN�o¯Š	rš6èùvÎ3®sÐžó5¨s@Ÿƒ°Òöÿ ÔL[xEøZm    IEND®B`‚kiwi={buildId:'b5c8ef1f6b813c1a38f446a839b0780af649814f-dev',sentryDsn:'https://3e528eed86e94184900618f3e9d8e03c@sentry.io/258797'};
<?xml version="1.0" encoding="UTF-8"?>
<widget xmlns="http://www.w3.org/ns/widgets">
  <name>Ki-Wi Player Lighter</name>
  <content src="index.html"/>
</widget>
<!DOCTYPE html>
<html class="layout-html" lang="en-gb">
  <head>
    <meta charset="utf-8">
    <title>Ki-Wi Player Lighter</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
    <link rel="stylesheet" href="main.css">
  </head>
  <body class="layout-body">
    <div id="player" class="grid grid-table layout-root">
      <div class="grid-item align-x-center align-y-center">
        <div class="container container--narrow">
          <div class="wrap wrap-large">
            <div class="gap-large"><span class="icon icon-spinner icon-spin loader-icon"></span></div>
          </div>
        </div>
      </div>
    </div>
    <script src="kiwi-lighter-1.js"></script>
    <script src="build.js"></script>
    <script src="main.js"></script>
  </body>
</html>
(function () {
	var script = document.createElement('script');
	script.setAttribute('src', 'file:///android_asset/www/cordova.js');
	document.head.appendChild(script);
})();
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */

/**
 * 1. Set default font family to sans-serif.
 * 2. Prevent iOS text size adjust after orientation change, without disabling
 *    user zoom.
 */

html {
  font-family: sans-serif; /* 1 */
  -ms-text-size-adjust: 100%; /* 2 */
  -webkit-text-size-adjust: 100%; /* 2 */
}

/**
 * Remove default margin.
 */

body {
  margin: 0;
}

/* HTML5 display definitions
   ========================================================================== */

/**
 * Correct `block` display not defined for any HTML5 element in IE 8/9.
 * Correct `block` display not defined for `details` or `summary` in IE 10/11
 * and Firefox.
 * Correct `block` display not defined for `main` in IE 11.
 */

article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
menu,
nav,
section,
summary {
  display: block;
}

/**
 * 1. Correct `inline-block` display not defined in IE 8/9.
 * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
 */

audio,
canvas,
progress,
video {
  display: inline-block; /* 1 */
  vertical-align: baseline; /* 2 */
}

/**
 * Prevent modern browsers from displaying `audio` without controls.
 * Remove excess height in iOS 5 devices.
 */

audio:not([controls]) {
  display: none;
  height: 0;
}

/**
 * Address `[hidden]` styling not present in IE 8/9/10.
 * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
 */

[hidden],
template {
  display: none;
}

/* Links
   ========================================================================== */

/**
 * Remove the gray background color from active links in IE 10.
 */

a {
  background-color: transparent;
}

/**
 * Improve readability when focused and also mouse hovered in all browsers.
 */

a:active,
a:hover {
  outline: 0;
}

/* Text-level semantics
   ========================================================================== */

/**
 * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
 */

abbr[title] {
  border-bottom: 1px dotted;
}

/**
 * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
 */

b,
strong {
  font-weight: bold;
}

/**
 * Address styling not present in Safari and Chrome.
 */

dfn {
  font-style: italic;
}

/**
 * Address variable `h1` font-size and margin within `section` and `article`
 * contexts in Firefox 4+, Safari, and Chrome.
 */

h1 {
  font-size: 2em;
  margin: 0.67em 0;
}

/**
 * Address styling not present in IE 8/9.
 */

mark {
  background: #ff0;
  color: #000;
}

/**
 * Address inconsistent and variable font size in all browsers.
 */

small {
  font-size: 80%;
}

/**
 * Prevent `sub` and `sup` affecting `line-height` in all browsers.
 */

sub,
sup {
  font-size: 75%;
  line-height: 0;
  position: relative;
  vertical-align: baseline;
}

sup {
  top: -0.5em;
}

sub {
  bottom: -0.25em;
}

/* Embedded content
   ========================================================================== */

/**
 * Remove border when inside `a` element in IE 8/9/10.
 */

img {
  border: 0;
}

/**
 * Correct overflow not hidden in IE 9/10/11.
 */

svg:not(:root) {
  overflow: hidden;
}

/* Grouping content
   ========================================================================== */

/**
 * Address margin not present in IE 8/9 and Safari.
 */

figure {
  margin: 1em 40px;
}

/**
 * Address differences between Firefox and other browsers.
 */

hr {
  box-sizing: content-box;
  height: 0;
}

/**
 * Contain overflow in all browsers.
 */

pre {
  overflow: auto;
}

/**
 * Address odd `em`-unit font size rendering in all browsers.
 */

code,
kbd,
pre,
samp {
  font-family: monospace, monospace;
  font-size: 1em;
}

/* Forms
   ========================================================================== */

/**
 * Known limitation: by default, Chrome and Safari on OS X allow very limited
 * styling of `select`, unless a `border` property is set.
 */

/**
 * 1. Correct color not being inherited.
 *    Known issue: affects color of disabled elements.
 * 2. Correct font properties not being inherited.
 * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
 */

button,
input,
optgroup,
select,
textarea {
  color: inherit; /* 1 */
  font: inherit; /* 2 */
  margin: 0; /* 3 */
}

/**
 * Address `overflow` set to `hidden` in IE 8/9/10/11.
 */

button {
  overflow: visible;
}

/**
 * Address inconsistent `text-transform` inheritance for `button` and `select`.
 * All other form control elements do not inherit `text-transform` values.
 * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
 * Correct `select` style inheritance in Firefox.
 */

button,
select {
  text-transform: none;
}

/**
 * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
 *    and `video` controls.
 * 2. Correct inability to style clickable `input` types in iOS.
 * 3. Improve usability and consistency of cursor style between image-type
 *    `input` and others.
 */

button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
  -webkit-appearance: button; /* 2 */
  cursor: pointer; /* 3 */
}

/**
 * Re-set default cursor for disabled elements.
 */

button[disabled],
html input[disabled] {
  cursor: default;
}

/**
 * Remove inner padding and border in Firefox 4+.
 */

button::-moz-focus-inner,
input::-moz-focus-inner {
  border: 0;
  padding: 0;
}

/**
 * Address Firefox 4+ setting `line-height` on `input` using `!important` in
 * the UA stylesheet.
 */

input {
  line-height: normal;
}

/**
 * It's recommended that you don't attempt to style these elements.
 * Firefox's implementation doesn't respect box-sizing, padding, or width.
 *
 * 1. Address box sizing set to `content-box` in IE 8/9/10.
 * 2. Remove excess padding in IE 8/9/10.
 */

input[type="checkbox"],
input[type="radio"] {
  box-sizing: border-box; /* 1 */
  padding: 0; /* 2 */
}

/**
 * Fix the cursor style for Chrome's increment/decrement buttons. For certain
 * `font-size` values of the `input`, it causes the cursor style of the
 * decrement button to change from `default` to `text`.
 */

input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
  height: auto;
}

/**
 * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
 * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
 *    (include `-moz` to future-proof).
 */

input[type="search"] {
  -webkit-appearance: textfield; /* 1 */ /* 2 */
  box-sizing: content-box;
}

/**
 * Remove inner padding and search cancel button in Safari and Chrome on OS X.
 * Safari (but not Chrome) clips the cancel button when the search input has
 * padding (and `textfield` appearance).
 */

input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
  -webkit-appearance: none;
}

/**
 * Define consistent border, margin, and padding.
 */

fieldset {
  border: 1px solid #c0c0c0;
  margin: 0 2px;
  padding: 0.35em 0.625em 0.75em;
}

/**
 * 1. Correct `color` not being inherited in IE 8/9/10/11.
 * 2. Remove padding so people aren't caught out if they zero out fieldsets.
 */

legend {
  border: 0; /* 1 */
  padding: 0; /* 2 */
}

/**
 * Remove default vertical scrollbar in IE 8/9/10/11.
 */

textarea {
  overflow: auto;
}

/**
 * Don't inherit the `font-weight` (applied by a rule above).
 * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
 */

optgroup {
  font-weight: bold;
}

/* Tables
   ========================================================================== */

/**
 * Remove most spacing between table cells.
 */

table {
  border-collapse: collapse;
  border-spacing: 0;
}

td,
th {
  padding: 0;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @author Petr MikuÅ¡ek <petr.mikusek@ki-wi.cz>
 * @copyright Ki-Wi Digital s.r.o.
 * @file HlavnÃ­ styl platformy standardnÃ­ch webovÃ½ch technologiÃ­.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
/*
 * Skupiny Å¡Ã­Å™ek obrazovky pro responzivnÃ­ zobrazenÃ­.
 * ZaloÅ¾eno na konvenci zavedenÃ© v [Bootstrap 3](https://getbootstrap.com/docs/3.3/css/#grid-media-queries).
 */
/**
 * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
@font-face {
  font-family: 'FontAwesome';
  src: url(assets/af7ae505.woff2) format('woff2'), url(assets/fee66e71.woff) format('woff');
  font-weight: normal;
  font-style: normal;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
*,
*:before,
*:after {
  box-sizing: inherit;
}
html {
  background: #ffffff;
  color: #000000;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 22px;
  line-height: 1.25;
  box-sizing: border-box;
}
address,
blockquote,
caption,
center,
dl,
h1,
h2,
h3,
h4,
h5,
h6,
legend,
ol,
p,
pre,
ul {
  margin-top: 30px;
  margin-bottom: 0;
}
dd,
ol,
ul {
  margin-left: 24px;
}
ol,
ul {
  padding-left: 0;
}
code,
kbd,
pre,
samp,
tt {
  font-family: monospace, monospace;
}
a {
  color: inherit;
  text-decoration: none;
}
address {
  font-style: inherit;
}
caption {
  text-align: inherit;
}
figure {
  margin: 0;
}
fieldset {
  min-width: 0;
  margin: 0;
  padding: 0;
  border: 0;
}
hr {
  height: 0;
  margin-top: 30px;
  margin-bottom: 30px;
  border: 0 solid inherit;
  border-width: 1px 0 0;
  color: inherit;
}
iframe {
  border-width: 0;
}
img {
  vertical-align: middle;
}
th {
  text-align: inherit;
}
:focus {
  outline: 0;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.align-x-left {
  text-align: left;
}
.align-x-right {
  text-align: right;
}
.align-x-center {
  text-align: center;
}
.align-x-justify {
  text-align: justify;
}
.align-y-top {
  vertical-align: top;
}
.align-y-bottom {
  vertical-align: bottom;
}
.align-y-center {
  vertical-align: middle;
}
.align-y-baseline {
  vertical-align: baseline;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.container {
  margin-left: auto;
  margin-right: auto;
}
.container--medium {
  max-width: 768px;
}
.container--narrow {
  max-width: 576px;
}
.container--wide {
  max-width: 1080px;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.gap-none {
  margin-top: 0;
}
.gap-teeny {
  margin-top: 5px;
}
.gap-tiny {
  margin-top: 10px;
}
.gap-small {
  margin-top: 20px;
}
.gap-base {
  margin-top: 30px;
}
.gap-large {
  margin-top: 60px;
}
.gap-huge {
  margin-top: 120px;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.grid {
  display: block;
  width: auto;
  margin-left: 0;
  margin-right: 0;
  padding-left: 0;
  padding-right: 0;
  list-style: none;
}
.grid.grid-none {
  margin-left: 0;
  margin-right: 0;
}
.grid.grid-none > .grid-item,
.grid.grid-none > .grid-row > .grid-item {
  padding-left: 0;
  padding-right: 0;
}
.grid.grid-teeny {
  margin-left: -2px;
  margin-right: -2px;
}
.grid.grid-teeny > .grid-item,
.grid.grid-teeny > .grid-row > .grid-item {
  padding-left: 2px;
  padding-right: 2px;
}
.grid.grid-tiny {
  margin-left: -4px;
  margin-right: -4px;
}
.grid.grid-tiny > .grid-item,
.grid.grid-tiny > .grid-row > .grid-item {
  padding-left: 4px;
  padding-right: 4px;
}
.grid.grid-small {
  margin-left: -8px;
  margin-right: -8px;
}
.grid.grid-small > .grid-item,
.grid.grid-small > .grid-row > .grid-item {
  padding-left: 8px;
  padding-right: 8px;
}
.grid.grid-base {
  margin-left: -12px;
  margin-right: -12px;
}
.grid.grid-base > .grid-item,
.grid.grid-base > .grid-row > .grid-item {
  padding-left: 12px;
  padding-right: 12px;
}
.grid.grid-large {
  margin-left: -24px;
  margin-right: -24px;
}
.grid.grid-large > .grid-item,
.grid.grid-large > .grid-row > .grid-item {
  padding-left: 24px;
  padding-right: 24px;
}
.grid.grid-huge {
  margin-left: -48px;
  margin-right: -48px;
}
.grid.grid-huge > .grid-item,
.grid.grid-huge > .grid-row > .grid-item {
  padding-left: 48px;
  padding-right: 48px;
}
.grid.grid-float:after {
  content: " ";
  display: table;
  clear: both;
}
.grid.grid-float > .grid-row {
  display: block;
}
.grid.grid-float > .grid-item,
.grid.grid-float > .grid-row > .grid-item {
  display: block;
}
.grid.grid-float > .grid-item.grid-left,
.grid.grid-float > .grid-row > .grid-item.grid-left {
  float: left;
}
.grid.grid-float > .grid-item.grid-right,
.grid.grid-float > .grid-row > .grid-item.grid-right {
  float: right;
}
.grid.grid-inline {
  font-family: FreeSans, Arimo, "Droid Sans", Helvetica, Arial, sans-serif;
  letter-spacing: -0.31em;
  text-rendering: optimizespeed;
}
.grid.grid-inline > .grid-row {
  display: block;
}
.grid.grid-inline > .grid-item,
.grid.grid-inline > .grid-row > .grid-item {
  display: inline-block;
  font-family: Arial, Helvetica, sans-serif;
  letter-spacing: normal;
  text-rendering: auto;
  page-break-inside: avoid;
}
.grid.grid-table {
  display: table;
  min-width: 100%;
  margin-left: 0;
  margin-right: 0;
  table-layout: fixed;
}
.grid.grid-table > .grid-row {
  display: table-row;
}
.grid.grid-table > .grid-item,
.grid.grid-table > .grid-row > .grid-item {
  display: table-cell;
}
.grid > .grid-item,
.grid > .grid-row > .grid-item {
  min-height: 1px;
  margin-left: 0;
  margin-right: 0;
  padding-left: 0;
  padding-right: 0;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.icon {
  display: inline-block;
  font: normal normal normal 14px/1 FontAwesome;
  font-size: inherit;
  text-rendering: auto;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
.icon-spin {
  -webkit-animation: fa-spin 2s infinite linear;
  animation: fa-spin 2s infinite linear;
}
.icon-pulse {
  -webkit-animation: fa-spin 1s infinite steps(8);
  animation: fa-spin 1s infinite steps(8);
}
@-webkit-keyframes fa-spin {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(359deg);
    transform: rotate(359deg);
  }
}
@keyframes fa-spin {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(359deg);
    transform: rotate(359deg);
  }
}
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
   readers do not read off random characters that represent icons */
.icon-glass:before {
  content: "\F000";
}
.icon-music:before {
  content: "\F001";
}
.icon-search:before {
  content: "\F002";
}
.icon-envelope-o:before {
  content: "\F003";
}
.icon-heart:before {
  content: "\F004";
}
.icon-star:before {
  content: "\F005";
}
.icon-star-o:before {
  content: "\F006";
}
.icon-user:before {
  content: "\F007";
}
.icon-film:before {
  content: "\F008";
}
.icon-th-large:before {
  content: "\F009";
}
.icon-th:before {
  content: "\F00A";
}
.icon-th-list:before {
  content: "\F00B";
}
.icon-check:before {
  content: "\F00C";
}
.icon-remove:before,
.icon-close:before,
.icon-times:before {
  content: "\F00D";
}
.icon-search-plus:before {
  content: "\F00E";
}
.icon-search-minus:before {
  content: "\F010";
}
.icon-power-off:before {
  content: "\F011";
}
.icon-signal:before {
  content: "\F012";
}
.icon-gear:before,
.icon-cog:before {
  content: "\F013";
}
.icon-trash-o:before {
  content: "\F014";
}
.icon-home:before {
  content: "\F015";
}
.icon-file-o:before {
  content: "\F016";
}
.icon-clock-o:before {
  content: "\F017";
}
.icon-road:before {
  content: "\F018";
}
.icon-download:before {
  content: "\F019";
}
.icon-arrow-circle-o-down:before {
  content: "\F01A";
}
.icon-arrow-circle-o-up:before {
  content: "\F01B";
}
.icon-inbox:before {
  content: "\F01C";
}
.icon-play-circle-o:before {
  content: "\F01D";
}
.icon-rotate-right:before,
.icon-repeat:before {
  content: "\F01E";
}
.icon-refresh:before {
  content: "\F021";
}
.icon-list-alt:before {
  content: "\F022";
}
.icon-lock:before {
  content: "\F023";
}
.icon-flag:before {
  content: "\F024";
}
.icon-headphones:before {
  content: "\F025";
}
.icon-volume-off:before {
  content: "\F026";
}
.icon-volume-down:before {
  content: "\F027";
}
.icon-volume-up:before {
  content: "\F028";
}
.icon-qrcode:before {
  content: "\F029";
}
.icon-barcode:before {
  content: "\F02A";
}
.icon-tag:before {
  content: "\F02B";
}
.icon-tags:before {
  content: "\F02C";
}
.icon-book:before {
  content: "\F02D";
}
.icon-bookmark:before {
  content: "\F02E";
}
.icon-print:before {
  content: "\F02F";
}
.icon-camera:before {
  content: "\F030";
}
.icon-font:before {
  content: "\F031";
}
.icon-bold:before {
  content: "\F032";
}
.icon-italic:before {
  content: "\F033";
}
.icon-text-height:before {
  content: "\F034";
}
.icon-text-width:before {
  content: "\F035";
}
.icon-align-left:before {
  content: "\F036";
}
.icon-align-center:before {
  content: "\F037";
}
.icon-align-right:before {
  content: "\F038";
}
.icon-align-justify:before {
  content: "\F039";
}
.icon-list:before {
  content: "\F03A";
}
.icon-dedent:before,
.icon-outdent:before {
  content: "\F03B";
}
.icon-indent:before {
  content: "\F03C";
}
.icon-video-camera:before {
  content: "\F03D";
}
.icon-photo:before,
.icon-image:before,
.icon-picture-o:before {
  content: "\F03E";
}
.icon-pencil:before {
  content: "\F040";
}
.icon-map-marker:before {
  content: "\F041";
}
.icon-adjust:before {
  content: "\F042";
}
.icon-tint:before {
  content: "\F043";
}
.icon-edit:before,
.icon-pencil-square-o:before {
  content: "\F044";
}
.icon-share-square-o:before {
  content: "\F045";
}
.icon-check-square-o:before {
  content: "\F046";
}
.icon-arrows:before {
  content: "\F047";
}
.icon-step-backward:before {
  content: "\F048";
}
.icon-fast-backward:before {
  content: "\F049";
}
.icon-backward:before {
  content: "\F04A";
}
.icon-play:before {
  content: "\F04B";
}
.icon-pause:before {
  content: "\F04C";
}
.icon-stop:before {
  content: "\F04D";
}
.icon-forward:before {
  content: "\F04E";
}
.icon-fast-forward:before {
  content: "\F050";
}
.icon-step-forward:before {
  content: "\F051";
}
.icon-eject:before {
  content: "\F052";
}
.icon-chevron-left:before {
  content: "\F053";
}
.icon-chevron-right:before {
  content: "\F054";
}
.icon-plus-circle:before {
  content: "\F055";
}
.icon-minus-circle:before {
  content: "\F056";
}
.icon-times-circle:before {
  content: "\F057";
}
.icon-check-circle:before {
  content: "\F058";
}
.icon-question-circle:before {
  content: "\F059";
}
.icon-info-circle:before {
  content: "\F05A";
}
.icon-crosshairs:before {
  content: "\F05B";
}
.icon-times-circle-o:before {
  content: "\F05C";
}
.icon-check-circle-o:before {
  content: "\F05D";
}
.icon-ban:before {
  content: "\F05E";
}
.icon-arrow-left:before {
  content: "\F060";
}
.icon-arrow-right:before {
  content: "\F061";
}
.icon-arrow-up:before {
  content: "\F062";
}
.icon-arrow-down:before {
  content: "\F063";
}
.icon-mail-forward:before,
.icon-share:before {
  content: "\F064";
}
.icon-expand:before {
  content: "\F065";
}
.icon-compress:before {
  content: "\F066";
}
.icon-plus:before {
  content: "\F067";
}
.icon-minus:before {
  content: "\F068";
}
.icon-asterisk:before {
  content: "\F069";
}
.icon-exclamation-circle:before {
  content: "\F06A";
}
.icon-gift:before {
  content: "\F06B";
}
.icon-leaf:before {
  content: "\F06C";
}
.icon-fire:before {
  content: "\F06D";
}
.icon-eye:before {
  content: "\F06E";
}
.icon-eye-slash:before {
  content: "\F070";
}
.icon-warning:before,
.icon-exclamation-triangle:before {
  content: "\F071";
}
.icon-plane:before {
  content: "\F072";
}
.icon-calendar:before {
  content: "\F073";
}
.icon-random:before {
  content: "\F074";
}
.icon-comment:before {
  content: "\F075";
}
.icon-magnet:before {
  content: "\F076";
}
.icon-chevron-up:before {
  content: "\F077";
}
.icon-chevron-down:before {
  content: "\F078";
}
.icon-retweet:before {
  content: "\F079";
}
.icon-shopping-cart:before {
  content: "\F07A";
}
.icon-folder:before {
  content: "\F07B";
}
.icon-folder-open:before {
  content: "\F07C";
}
.icon-arrows-v:before {
  content: "\F07D";
}
.icon-arrows-h:before {
  content: "\F07E";
}
.icon-bar-chart-o:before,
.icon-bar-chart:before {
  content: "\F080";
}
.icon-twitter-square:before {
  content: "\F081";
}
.icon-facebook-square:before {
  content: "\F082";
}
.icon-camera-retro:before {
  content: "\F083";
}
.icon-key:before {
  content: "\F084";
}
.icon-gears:before,
.icon-cogs:before {
  content: "\F085";
}
.icon-comments:before {
  content: "\F086";
}
.icon-thumbs-o-up:before {
  content: "\F087";
}
.icon-thumbs-o-down:before {
  content: "\F088";
}
.icon-star-half:before {
  content: "\F089";
}
.icon-heart-o:before {
  content: "\F08A";
}
.icon-sign-out:before {
  content: "\F08B";
}
.icon-linkedin-square:before {
  content: "\F08C";
}
.icon-thumb-tack:before {
  content: "\F08D";
}
.icon-external-link:before {
  content: "\F08E";
}
.icon-sign-in:before {
  content: "\F090";
}
.icon-trophy:before {
  content: "\F091";
}
.icon-github-square:before {
  content: "\F092";
}
.icon-upload:before {
  content: "\F093";
}
.icon-lemon-o:before {
  content: "\F094";
}
.icon-phone:before {
  content: "\F095";
}
.icon-square-o:before {
  content: "\F096";
}
.icon-bookmark-o:before {
  content: "\F097";
}
.icon-phone-square:before {
  content: "\F098";
}
.icon-twitter:before {
  content: "\F099";
}
.icon-facebook-f:before,
.icon-facebook:before {
  content: "\F09A";
}
.icon-github:before {
  content: "\F09B";
}
.icon-unlock:before {
  content: "\F09C";
}
.icon-credit-card:before {
  content: "\F09D";
}
.icon-feed:before,
.icon-rss:before {
  content: "\F09E";
}
.icon-hdd-o:before {
  content: "\F0A0";
}
.icon-bullhorn:before {
  content: "\F0A1";
}
.icon-bell:before {
  content: "\F0F3";
}
.icon-certificate:before {
  content: "\F0A3";
}
.icon-hand-o-right:before {
  content: "\F0A4";
}
.icon-hand-o-left:before {
  content: "\F0A5";
}
.icon-hand-o-up:before {
  content: "\F0A6";
}
.icon-hand-o-down:before {
  content: "\F0A7";
}
.icon-arrow-circle-left:before {
  content: "\F0A8";
}
.icon-arrow-circle-right:before {
  content: "\F0A9";
}
.icon-arrow-circle-up:before {
  content: "\F0AA";
}
.icon-arrow-circle-down:before {
  content: "\F0AB";
}
.icon-globe:before {
  content: "\F0AC";
}
.icon-wrench:before {
  content: "\F0AD";
}
.icon-tasks:before {
  content: "\F0AE";
}
.icon-filter:before {
  content: "\F0B0";
}
.icon-briefcase:before {
  content: "\F0B1";
}
.icon-arrows-alt:before {
  content: "\F0B2";
}
.icon-group:before,
.icon-users:before {
  content: "\F0C0";
}
.icon-chain:before,
.icon-link:before {
  content: "\F0C1";
}
.icon-cloud:before {
  content: "\F0C2";
}
.icon-flask:before {
  content: "\F0C3";
}
.icon-cut:before,
.icon-scissors:before {
  content: "\F0C4";
}
.icon-copy:before,
.icon-files-o:before {
  content: "\F0C5";
}
.icon-paperclip:before {
  content: "\F0C6";
}
.icon-save:before,
.icon-floppy-o:before {
  content: "\F0C7";
}
.icon-square:before {
  content: "\F0C8";
}
.icon-navicon:before,
.icon-reorder:before,
.icon-bars:before {
  content: "\F0C9";
}
.icon-list-ul:before {
  content: "\F0CA";
}
.icon-list-ol:before {
  content: "\F0CB";
}
.icon-strikethrough:before {
  content: "\F0CC";
}
.icon-underline:before {
  content: "\F0CD";
}
.icon-table:before {
  content: "\F0CE";
}
.icon-magic:before {
  content: "\F0D0";
}
.icon-truck:before {
  content: "\F0D1";
}
.icon-pinterest:before {
  content: "\F0D2";
}
.icon-pinterest-square:before {
  content: "\F0D3";
}
.icon-google-plus-square:before {
  content: "\F0D4";
}
.icon-google-plus:before {
  content: "\F0D5";
}
.icon-money:before {
  content: "\F0D6";
}
.icon-caret-down:before {
  content: "\F0D7";
}
.icon-caret-up:before {
  content: "\F0D8";
}
.icon-caret-left:before {
  content: "\F0D9";
}
.icon-caret-right:before {
  content: "\F0DA";
}
.icon-columns:before {
  content: "\F0DB";
}
.icon-unsorted:before,
.icon-sort:before {
  content: "\F0DC";
}
.icon-sort-down:before,
.icon-sort-desc:before {
  content: "\F0DD";
}
.icon-sort-up:before,
.icon-sort-asc:before {
  content: "\F0DE";
}
.icon-envelope:before {
  content: "\F0E0";
}
.icon-linkedin:before {
  content: "\F0E1";
}
.icon-rotate-left:before,
.icon-undo:before {
  content: "\F0E2";
}
.icon-legal:before,
.icon-gavel:before {
  content: "\F0E3";
}
.icon-dashboard:before,
.icon-tachometer:before {
  content: "\F0E4";
}
.icon-comment-o:before {
  content: "\F0E5";
}
.icon-comments-o:before {
  content: "\F0E6";
}
.icon-flash:before,
.icon-bolt:before {
  content: "\F0E7";
}
.icon-sitemap:before {
  content: "\F0E8";
}
.icon-umbrella:before {
  content: "\F0E9";
}
.icon-paste:before,
.icon-clipboard:before {
  content: "\F0EA";
}
.icon-lightbulb-o:before {
  content: "\F0EB";
}
.icon-exchange:before {
  content: "\F0EC";
}
.icon-cloud-download:before {
  content: "\F0ED";
}
.icon-cloud-upload:before {
  content: "\F0EE";
}
.icon-user-md:before {
  content: "\F0F0";
}
.icon-stethoscope:before {
  content: "\F0F1";
}
.icon-suitcase:before {
  content: "\F0F2";
}
.icon-bell-o:before {
  content: "\F0A2";
}
.icon-coffee:before {
  content: "\F0F4";
}
.icon-cutlery:before {
  content: "\F0F5";
}
.icon-file-text-o:before {
  content: "\F0F6";
}
.icon-building-o:before {
  content: "\F0F7";
}
.icon-hospital-o:before {
  content: "\F0F8";
}
.icon-ambulance:before {
  content: "\F0F9";
}
.icon-medkit:before {
  content: "\F0FA";
}
.icon-fighter-jet:before {
  content: "\F0FB";
}
.icon-beer:before {
  content: "\F0FC";
}
.icon-h-square:before {
  content: "\F0FD";
}
.icon-plus-square:before {
  content: "\F0FE";
}
.icon-angle-double-left:before {
  content: "\F100";
}
.icon-angle-double-right:before {
  content: "\F101";
}
.icon-angle-double-up:before {
  content: "\F102";
}
.icon-angle-double-down:before {
  content: "\F103";
}
.icon-angle-left:before {
  content: "\F104";
}
.icon-angle-right:before {
  content: "\F105";
}
.icon-angle-up:before {
  content: "\F106";
}
.icon-angle-down:before {
  content: "\F107";
}
.icon-desktop:before {
  content: "\F108";
}
.icon-laptop:before {
  content: "\F109";
}
.icon-tablet:before {
  content: "\F10A";
}
.icon-mobile-phone:before,
.icon-mobile:before {
  content: "\F10B";
}
.icon-circle-o:before {
  content: "\F10C";
}
.icon-quote-left:before {
  content: "\F10D";
}
.icon-quote-right:before {
  content: "\F10E";
}
.icon-spinner:before {
  content: "\F110";
}
.icon-circle:before {
  content: "\F111";
}
.icon-mail-reply:before,
.icon-reply:before {
  content: "\F112";
}
.icon-github-alt:before {
  content: "\F113";
}
.icon-folder-o:before {
  content: "\F114";
}
.icon-folder-open-o:before {
  content: "\F115";
}
.icon-smile-o:before {
  content: "\F118";
}
.icon-frown-o:before {
  content: "\F119";
}
.icon-meh-o:before {
  content: "\F11A";
}
.icon-gamepad:before {
  content: "\F11B";
}
.icon-keyboard-o:before {
  content: "\F11C";
}
.icon-flag-o:before {
  content: "\F11D";
}
.icon-flag-checkered:before {
  content: "\F11E";
}
.icon-terminal:before {
  content: "\F120";
}
.icon-code:before {
  content: "\F121";
}
.icon-mail-reply-all:before,
.icon-reply-all:before {
  content: "\F122";
}
.icon-star-half-empty:before,
.icon-star-half-full:before,
.icon-star-half-o:before {
  content: "\F123";
}
.icon-location-arrow:before {
  content: "\F124";
}
.icon-crop:before {
  content: "\F125";
}
.icon-code-fork:before {
  content: "\F126";
}
.icon-unlink:before,
.icon-chain-broken:before {
  content: "\F127";
}
.icon-question:before {
  content: "\F128";
}
.icon-info:before {
  content: "\F129";
}
.icon-exclamation:before {
  content: "\F12A";
}
.icon-superscript:before {
  content: "\F12B";
}
.icon-subscript:before {
  content: "\F12C";
}
.icon-eraser:before {
  content: "\F12D";
}
.icon-puzzle-piece:before {
  content: "\F12E";
}
.icon-microphone:before {
  content: "\F130";
}
.icon-microphone-slash:before {
  content: "\F131";
}
.icon-shield:before {
  content: "\F132";
}
.icon-calendar-o:before {
  content: "\F133";
}
.icon-fire-extinguisher:before {
  content: "\F134";
}
.icon-rocket:before {
  content: "\F135";
}
.icon-maxcdn:before {
  content: "\F136";
}
.icon-chevron-circle-left:before {
  content: "\F137";
}
.icon-chevron-circle-right:before {
  content: "\F138";
}
.icon-chevron-circle-up:before {
  content: "\F139";
}
.icon-chevron-circle-down:before {
  content: "\F13A";
}
.icon-html5:before {
  content: "\F13B";
}
.icon-css3:before {
  content: "\F13C";
}
.icon-anchor:before {
  content: "\F13D";
}
.icon-unlock-alt:before {
  content: "\F13E";
}
.icon-bullseye:before {
  content: "\F140";
}
.icon-ellipsis-h:before {
  content: "\F141";
}
.icon-ellipsis-v:before {
  content: "\F142";
}
.icon-rss-square:before {
  content: "\F143";
}
.icon-play-circle:before {
  content: "\F144";
}
.icon-ticket:before {
  content: "\F145";
}
.icon-minus-square:before {
  content: "\F146";
}
.icon-minus-square-o:before {
  content: "\F147";
}
.icon-level-up:before {
  content: "\F148";
}
.icon-level-down:before {
  content: "\F149";
}
.icon-check-square:before {
  content: "\F14A";
}
.icon-pencil-square:before {
  content: "\F14B";
}
.icon-external-link-square:before {
  content: "\F14C";
}
.icon-share-square:before {
  content: "\F14D";
}
.icon-compass:before {
  content: "\F14E";
}
.icon-toggle-down:before,
.icon-caret-square-o-down:before {
  content: "\F150";
}
.icon-toggle-up:before,
.icon-caret-square-o-up:before {
  content: "\F151";
}
.icon-toggle-right:before,
.icon-caret-square-o-right:before {
  content: "\F152";
}
.icon-euro:before,
.icon-eur:before {
  content: "\F153";
}
.icon-gbp:before {
  content: "\F154";
}
.icon-dollar:before,
.icon-usd:before {
  content: "\F155";
}
.icon-rupee:before,
.icon-inr:before {
  content: "\F156";
}
.icon-cny:before,
.icon-rmb:before,
.icon-yen:before,
.icon-jpy:before {
  content: "\F157";
}
.icon-ruble:before,
.icon-rouble:before,
.icon-rub:before {
  content: "\F158";
}
.icon-won:before,
.icon-krw:before {
  content: "\F159";
}
.icon-bitcoin:before,
.icon-btc:before {
  content: "\F15A";
}
.icon-file:before {
  content: "\F15B";
}
.icon-file-text:before {
  content: "\F15C";
}
.icon-sort-alpha-asc:before {
  content: "\F15D";
}
.icon-sort-alpha-desc:before {
  content: "\F15E";
}
.icon-sort-amount-asc:before {
  content: "\F160";
}
.icon-sort-amount-desc:before {
  content: "\F161";
}
.icon-sort-numeric-asc:before {
  content: "\F162";
}
.icon-sort-numeric-desc:before {
  content: "\F163";
}
.icon-thumbs-up:before {
  content: "\F164";
}
.icon-thumbs-down:before {
  content: "\F165";
}
.icon-youtube-square:before {
  content: "\F166";
}
.icon-youtube:before {
  content: "\F167";
}
.icon-xing:before {
  content: "\F168";
}
.icon-xing-square:before {
  content: "\F169";
}
.icon-youtube-play:before {
  content: "\F16A";
}
.icon-dropbox:before {
  content: "\F16B";
}
.icon-stack-overflow:before {
  content: "\F16C";
}
.icon-instagram:before {
  content: "\F16D";
}
.icon-flickr:before {
  content: "\F16E";
}
.icon-adn:before {
  content: "\F170";
}
.icon-bitbucket:before {
  content: "\F171";
}
.icon-bitbucket-square:before {
  content: "\F172";
}
.icon-tumblr:before {
  content: "\F173";
}
.icon-tumblr-square:before {
  content: "\F174";
}
.icon-long-arrow-down:before {
  content: "\F175";
}
.icon-long-arrow-up:before {
  content: "\F176";
}
.icon-long-arrow-left:before {
  content: "\F177";
}
.icon-long-arrow-right:before {
  content: "\F178";
}
.icon-apple:before {
  content: "\F179";
}
.icon-windows:before {
  content: "\F17A";
}
.icon-android:before {
  content: "\F17B";
}
.icon-linux:before {
  content: "\F17C";
}
.icon-dribbble:before {
  content: "\F17D";
}
.icon-skype:before {
  content: "\F17E";
}
.icon-foursquare:before {
  content: "\F180";
}
.icon-trello:before {
  content: "\F181";
}
.icon-female:before {
  content: "\F182";
}
.icon-male:before {
  content: "\F183";
}
.icon-gittip:before,
.icon-gratipay:before {
  content: "\F184";
}
.icon-sun-o:before {
  content: "\F185";
}
.icon-moon-o:before {
  content: "\F186";
}
.icon-archive:before {
  content: "\F187";
}
.icon-bug:before {
  content: "\F188";
}
.icon-vk:before {
  content: "\F189";
}
.icon-weibo:before {
  content: "\F18A";
}
.icon-renren:before {
  content: "\F18B";
}
.icon-pagelines:before {
  content: "\F18C";
}
.icon-stack-exchange:before {
  content: "\F18D";
}
.icon-arrow-circle-o-right:before {
  content: "\F18E";
}
.icon-arrow-circle-o-left:before {
  content: "\F190";
}
.icon-toggle-left:before,
.icon-caret-square-o-left:before {
  content: "\F191";
}
.icon-dot-circle-o:before {
  content: "\F192";
}
.icon-wheelchair:before {
  content: "\F193";
}
.icon-vimeo-square:before {
  content: "\F194";
}
.icon-turkish-lira:before,
.icon-try:before {
  content: "\F195";
}
.icon-plus-square-o:before {
  content: "\F196";
}
.icon-space-shuttle:before {
  content: "\F197";
}
.icon-slack:before {
  content: "\F198";
}
.icon-envelope-square:before {
  content: "\F199";
}
.icon-wordpress:before {
  content: "\F19A";
}
.icon-openid:before {
  content: "\F19B";
}
.icon-institution:before,
.icon-bank:before,
.icon-university:before {
  content: "\F19C";
}
.icon-mortar-board:before,
.icon-graduation-cap:before {
  content: "\F19D";
}
.icon-yahoo:before {
  content: "\F19E";
}
.icon-google:before {
  content: "\F1A0";
}
.icon-reddit:before {
  content: "\F1A1";
}
.icon-reddit-square:before {
  content: "\F1A2";
}
.icon-stumbleupon-circle:before {
  content: "\F1A3";
}
.icon-stumbleupon:before {
  content: "\F1A4";
}
.icon-delicious:before {
  content: "\F1A5";
}
.icon-digg:before {
  content: "\F1A6";
}
.icon-pied-piper-pp:before {
  content: "\F1A7";
}
.icon-pied-piper-alt:before {
  content: "\F1A8";
}
.icon-drupal:before {
  content: "\F1A9";
}
.icon-joomla:before {
  content: "\F1AA";
}
.icon-language:before {
  content: "\F1AB";
}
.icon-fax:before {
  content: "\F1AC";
}
.icon-building:before {
  content: "\F1AD";
}
.icon-child:before {
  content: "\F1AE";
}
.icon-paw:before {
  content: "\F1B0";
}
.icon-spoon:before {
  content: "\F1B1";
}
.icon-cube:before {
  content: "\F1B2";
}
.icon-cubes:before {
  content: "\F1B3";
}
.icon-behance:before {
  content: "\F1B4";
}
.icon-behance-square:before {
  content: "\F1B5";
}
.icon-steam:before {
  content: "\F1B6";
}
.icon-steam-square:before {
  content: "\F1B7";
}
.icon-recycle:before {
  content: "\F1B8";
}
.icon-automobile:before,
.icon-car:before {
  content: "\F1B9";
}
.icon-cab:before,
.icon-taxi:before {
  content: "\F1BA";
}
.icon-tree:before {
  content: "\F1BB";
}
.icon-spotify:before {
  content: "\F1BC";
}
.icon-deviantart:before {
  content: "\F1BD";
}
.icon-soundcloud:before {
  content: "\F1BE";
}
.icon-database:before {
  content: "\F1C0";
}
.icon-file-pdf-o:before {
  content: "\F1C1";
}
.icon-file-word-o:before {
  content: "\F1C2";
}
.icon-file-excel-o:before {
  content: "\F1C3";
}
.icon-file-powerpoint-o:before {
  content: "\F1C4";
}
.icon-file-photo-o:before,
.icon-file-picture-o:before,
.icon-file-image-o:before {
  content: "\F1C5";
}
.icon-file-zip-o:before,
.icon-file-archive-o:before {
  content: "\F1C6";
}
.icon-file-sound-o:before,
.icon-file-audio-o:before {
  content: "\F1C7";
}
.icon-file-movie-o:before,
.icon-file-video-o:before {
  content: "\F1C8";
}
.icon-file-code-o:before {
  content: "\F1C9";
}
.icon-vine:before {
  content: "\F1CA";
}
.icon-codepen:before {
  content: "\F1CB";
}
.icon-jsfiddle:before {
  content: "\F1CC";
}
.icon-life-bouy:before,
.icon-life-buoy:before,
.icon-life-saver:before,
.icon-support:before,
.icon-life-ring:before {
  content: "\F1CD";
}
.icon-circle-o-notch:before {
  content: "\F1CE";
}
.icon-ra:before,
.icon-resistance:before,
.icon-rebel:before {
  content: "\F1D0";
}
.icon-ge:before,
.icon-empire:before {
  content: "\F1D1";
}
.icon-git-square:before {
  content: "\F1D2";
}
.icon-git:before {
  content: "\F1D3";
}
.icon-y-combinator-square:before,
.icon-yc-square:before,
.icon-hacker-news:before {
  content: "\F1D4";
}
.icon-tencent-weibo:before {
  content: "\F1D5";
}
.icon-qq:before {
  content: "\F1D6";
}
.icon-wechat:before,
.icon-weixin:before {
  content: "\F1D7";
}
.icon-send:before,
.icon-paper-plane:before {
  content: "\F1D8";
}
.icon-send-o:before,
.icon-paper-plane-o:before {
  content: "\F1D9";
}
.icon-history:before {
  content: "\F1DA";
}
.icon-circle-thin:before {
  content: "\F1DB";
}
.icon-header:before {
  content: "\F1DC";
}
.icon-paragraph:before {
  content: "\F1DD";
}
.icon-sliders:before {
  content: "\F1DE";
}
.icon-share-alt:before {
  content: "\F1E0";
}
.icon-share-alt-square:before {
  content: "\F1E1";
}
.icon-bomb:before {
  content: "\F1E2";
}
.icon-soccer-ball-o:before,
.icon-futbol-o:before {
  content: "\F1E3";
}
.icon-tty:before {
  content: "\F1E4";
}
.icon-binoculars:before {
  content: "\F1E5";
}
.icon-plug:before {
  content: "\F1E6";
}
.icon-slideshare:before {
  content: "\F1E7";
}
.icon-twitch:before {
  content: "\F1E8";
}
.icon-yelp:before {
  content: "\F1E9";
}
.icon-newspaper-o:before {
  content: "\F1EA";
}
.icon-wifi:before {
  content: "\F1EB";
}
.icon-calculator:before {
  content: "\F1EC";
}
.icon-paypal:before {
  content: "\F1ED";
}
.icon-google-wallet:before {
  content: "\F1EE";
}
.icon-cc-visa:before {
  content: "\F1F0";
}
.icon-cc-mastercard:before {
  content: "\F1F1";
}
.icon-cc-discover:before {
  content: "\F1F2";
}
.icon-cc-amex:before {
  content: "\F1F3";
}
.icon-cc-paypal:before {
  content: "\F1F4";
}
.icon-cc-stripe:before {
  content: "\F1F5";
}
.icon-bell-slash:before {
  content: "\F1F6";
}
.icon-bell-slash-o:before {
  content: "\F1F7";
}
.icon-trash:before {
  content: "\F1F8";
}
.icon-copyright:before {
  content: "\F1F9";
}
.icon-at:before {
  content: "\F1FA";
}
.icon-eyedropper:before {
  content: "\F1FB";
}
.icon-paint-brush:before {
  content: "\F1FC";
}
.icon-birthday-cake:before {
  content: "\F1FD";
}
.icon-area-chart:before {
  content: "\F1FE";
}
.icon-pie-chart:before {
  content: "\F200";
}
.icon-line-chart:before {
  content: "\F201";
}
.icon-lastfm:before {
  content: "\F202";
}
.icon-lastfm-square:before {
  content: "\F203";
}
.icon-toggle-off:before {
  content: "\F204";
}
.icon-toggle-on:before {
  content: "\F205";
}
.icon-bicycle:before {
  content: "\F206";
}
.icon-bus:before {
  content: "\F207";
}
.icon-ioxhost:before {
  content: "\F208";
}
.icon-angellist:before {
  content: "\F209";
}
.icon-cc:before {
  content: "\F20A";
}
.icon-shekel:before,
.icon-sheqel:before,
.icon-ils:before {
  content: "\F20B";
}
.icon-meanpath:before {
  content: "\F20C";
}
.icon-buysellads:before {
  content: "\F20D";
}
.icon-connectdevelop:before {
  content: "\F20E";
}
.icon-dashcube:before {
  content: "\F210";
}
.icon-forumbee:before {
  content: "\F211";
}
.icon-leanpub:before {
  content: "\F212";
}
.icon-sellsy:before {
  content: "\F213";
}
.icon-shirtsinbulk:before {
  content: "\F214";
}
.icon-simplybuilt:before {
  content: "\F215";
}
.icon-skyatlas:before {
  content: "\F216";
}
.icon-cart-plus:before {
  content: "\F217";
}
.icon-cart-arrow-down:before {
  content: "\F218";
}
.icon-diamond:before {
  content: "\F219";
}
.icon-ship:before {
  content: "\F21A";
}
.icon-user-secret:before {
  content: "\F21B";
}
.icon-motorcycle:before {
  content: "\F21C";
}
.icon-street-view:before {
  content: "\F21D";
}
.icon-heartbeat:before {
  content: "\F21E";
}
.icon-venus:before {
  content: "\F221";
}
.icon-mars:before {
  content: "\F222";
}
.icon-mercury:before {
  content: "\F223";
}
.icon-intersex:before,
.icon-transgender:before {
  content: "\F224";
}
.icon-transgender-alt:before {
  content: "\F225";
}
.icon-venus-double:before {
  content: "\F226";
}
.icon-mars-double:before {
  content: "\F227";
}
.icon-venus-mars:before {
  content: "\F228";
}
.icon-mars-stroke:before {
  content: "\F229";
}
.icon-mars-stroke-v:before {
  content: "\F22A";
}
.icon-mars-stroke-h:before {
  content: "\F22B";
}
.icon-neuter:before {
  content: "\F22C";
}
.icon-genderless:before {
  content: "\F22D";
}
.icon-facebook-official:before {
  content: "\F230";
}
.icon-pinterest-p:before {
  content: "\F231";
}
.icon-whatsapp:before {
  content: "\F232";
}
.icon-server:before {
  content: "\F233";
}
.icon-user-plus:before {
  content: "\F234";
}
.icon-user-times:before {
  content: "\F235";
}
.icon-hotel:before,
.icon-bed:before {
  content: "\F236";
}
.icon-viacoin:before {
  content: "\F237";
}
.icon-train:before {
  content: "\F238";
}
.icon-subway:before {
  content: "\F239";
}
.icon-medium:before {
  content: "\F23A";
}
.icon-yc:before,
.icon-y-combinator:before {
  content: "\F23B";
}
.icon-optin-monster:before {
  content: "\F23C";
}
.icon-opencart:before {
  content: "\F23D";
}
.icon-expeditedssl:before {
  content: "\F23E";
}
.icon-battery-4:before,
.icon-battery:before,
.icon-battery-full:before {
  content: "\F240";
}
.icon-battery-3:before,
.icon-battery-three-quarters:before {
  content: "\F241";
}
.icon-battery-2:before,
.icon-battery-half:before {
  content: "\F242";
}
.icon-battery-1:before,
.icon-battery-quarter:before {
  content: "\F243";
}
.icon-battery-0:before,
.icon-battery-empty:before {
  content: "\F244";
}
.icon-mouse-pointer:before {
  content: "\F245";
}
.icon-i-cursor:before {
  content: "\F246";
}
.icon-object-group:before {
  content: "\F247";
}
.icon-object-ungroup:before {
  content: "\F248";
}
.icon-sticky-note:before {
  content: "\F249";
}
.icon-sticky-note-o:before {
  content: "\F24A";
}
.icon-cc-jcb:before {
  content: "\F24B";
}
.icon-cc-diners-club:before {
  content: "\F24C";
}
.icon-clone:before {
  content: "\F24D";
}
.icon-balance-scale:before {
  content: "\F24E";
}
.icon-hourglass-o:before {
  content: "\F250";
}
.icon-hourglass-1:before,
.icon-hourglass-start:before {
  content: "\F251";
}
.icon-hourglass-2:before,
.icon-hourglass-half:before {
  content: "\F252";
}
.icon-hourglass-3:before,
.icon-hourglass-end:before {
  content: "\F253";
}
.icon-hourglass:before {
  content: "\F254";
}
.icon-hand-grab-o:before,
.icon-hand-rock-o:before {
  content: "\F255";
}
.icon-hand-stop-o:before,
.icon-hand-paper-o:before {
  content: "\F256";
}
.icon-hand-scissors-o:before {
  content: "\F257";
}
.icon-hand-lizard-o:before {
  content: "\F258";
}
.icon-hand-spock-o:before {
  content: "\F259";
}
.icon-hand-pointer-o:before {
  content: "\F25A";
}
.icon-hand-peace-o:before {
  content: "\F25B";
}
.icon-trademark:before {
  content: "\F25C";
}
.icon-registered:before {
  content: "\F25D";
}
.icon-creative-commons:before {
  content: "\F25E";
}
.icon-gg:before {
  content: "\F260";
}
.icon-gg-circle:before {
  content: "\F261";
}
.icon-tripadvisor:before {
  content: "\F262";
}
.icon-odnoklassniki:before {
  content: "\F263";
}
.icon-odnoklassniki-square:before {
  content: "\F264";
}
.icon-get-pocket:before {
  content: "\F265";
}
.icon-wikipedia-w:before {
  content: "\F266";
}
.icon-safari:before {
  content: "\F267";
}
.icon-chrome:before {
  content: "\F268";
}
.icon-firefox:before {
  content: "\F269";
}
.icon-opera:before {
  content: "\F26A";
}
.icon-internet-explorer:before {
  content: "\F26B";
}
.icon-tv:before,
.icon-television:before {
  content: "\F26C";
}
.icon-contao:before {
  content: "\F26D";
}
.icon-500px:before {
  content: "\F26E";
}
.icon-amazon:before {
  content: "\F270";
}
.icon-calendar-plus-o:before {
  content: "\F271";
}
.icon-calendar-minus-o:before {
  content: "\F272";
}
.icon-calendar-times-o:before {
  content: "\F273";
}
.icon-calendar-check-o:before {
  content: "\F274";
}
.icon-industry:before {
  content: "\F275";
}
.icon-map-pin:before {
  content: "\F276";
}
.icon-map-signs:before {
  content: "\F277";
}
.icon-map-o:before {
  content: "\F278";
}
.icon-map:before {
  content: "\F279";
}
.icon-commenting:before {
  content: "\F27A";
}
.icon-commenting-o:before {
  content: "\F27B";
}
.icon-houzz:before {
  content: "\F27C";
}
.icon-vimeo:before {
  content: "\F27D";
}
.icon-black-tie:before {
  content: "\F27E";
}
.icon-fonticons:before {
  content: "\F280";
}
.icon-reddit-alien:before {
  content: "\F281";
}
.icon-edge:before {
  content: "\F282";
}
.icon-credit-card-alt:before {
  content: "\F283";
}
.icon-codiepie:before {
  content: "\F284";
}
.icon-modx:before {
  content: "\F285";
}
.icon-fort-awesome:before {
  content: "\F286";
}
.icon-usb:before {
  content: "\F287";
}
.icon-product-hunt:before {
  content: "\F288";
}
.icon-mixcloud:before {
  content: "\F289";
}
.icon-scribd:before {
  content: "\F28A";
}
.icon-pause-circle:before {
  content: "\F28B";
}
.icon-pause-circle-o:before {
  content: "\F28C";
}
.icon-stop-circle:before {
  content: "\F28D";
}
.icon-stop-circle-o:before {
  content: "\F28E";
}
.icon-shopping-bag:before {
  content: "\F290";
}
.icon-shopping-basket:before {
  content: "\F291";
}
.icon-hashtag:before {
  content: "\F292";
}
.icon-bluetooth:before {
  content: "\F293";
}
.icon-bluetooth-b:before {
  content: "\F294";
}
.icon-percent:before {
  content: "\F295";
}
.icon-gitlab:before {
  content: "\F296";
}
.icon-wpbeginner:before {
  content: "\F297";
}
.icon-wpforms:before {
  content: "\F298";
}
.icon-envira:before {
  content: "\F299";
}
.icon-universal-access:before {
  content: "\F29A";
}
.icon-wheelchair-alt:before {
  content: "\F29B";
}
.icon-question-circle-o:before {
  content: "\F29C";
}
.icon-blind:before {
  content: "\F29D";
}
.icon-audio-description:before {
  content: "\F29E";
}
.icon-volume-control-phone:before {
  content: "\F2A0";
}
.icon-braille:before {
  content: "\F2A1";
}
.icon-assistive-listening-systems:before {
  content: "\F2A2";
}
.icon-asl-interpreting:before,
.icon-american-sign-language-interpreting:before {
  content: "\F2A3";
}
.icon-deafness:before,
.icon-hard-of-hearing:before,
.icon-deaf:before {
  content: "\F2A4";
}
.icon-glide:before {
  content: "\F2A5";
}
.icon-glide-g:before {
  content: "\F2A6";
}
.icon-signing:before,
.icon-sign-language:before {
  content: "\F2A7";
}
.icon-low-vision:before {
  content: "\F2A8";
}
.icon-viadeo:before {
  content: "\F2A9";
}
.icon-viadeo-square:before {
  content: "\F2AA";
}
.icon-snapchat:before {
  content: "\F2AB";
}
.icon-snapchat-ghost:before {
  content: "\F2AC";
}
.icon-snapchat-square:before {
  content: "\F2AD";
}
.icon-pied-piper:before {
  content: "\F2AE";
}
.icon-first-order:before {
  content: "\F2B0";
}
.icon-yoast:before {
  content: "\F2B1";
}
.icon-themeisle:before {
  content: "\F2B2";
}
.icon-google-plus-circle:before,
.icon-google-plus-official:before {
  content: "\F2B3";
}
.icon-fa:before,
.icon-font-awesome:before {
  content: "\F2B4";
}
.icon-handshake-o:before {
  content: "\F2B5";
}
.icon-envelope-open:before {
  content: "\F2B6";
}
.icon-envelope-open-o:before {
  content: "\F2B7";
}
.icon-linode:before {
  content: "\F2B8";
}
.icon-address-book:before {
  content: "\F2B9";
}
.icon-address-book-o:before {
  content: "\F2BA";
}
.icon-vcard:before,
.icon-address-card:before {
  content: "\F2BB";
}
.icon-vcard-o:before,
.icon-address-card-o:before {
  content: "\F2BC";
}
.icon-user-circle:before {
  content: "\F2BD";
}
.icon-user-circle-o:before {
  content: "\F2BE";
}
.icon-user-o:before {
  content: "\F2C0";
}
.icon-id-badge:before {
  content: "\F2C1";
}
.icon-drivers-license:before,
.icon-id-card:before {
  content: "\F2C2";
}
.icon-drivers-license-o:before,
.icon-id-card-o:before {
  content: "\F2C3";
}
.icon-quora:before {
  content: "\F2C4";
}
.icon-free-code-camp:before {
  content: "\F2C5";
}
.icon-telegram:before {
  content: "\F2C6";
}
.icon-thermometer-4:before,
.icon-thermometer:before,
.icon-thermometer-full:before {
  content: "\F2C7";
}
.icon-thermometer-3:before,
.icon-thermometer-three-quarters:before {
  content: "\F2C8";
}
.icon-thermometer-2:before,
.icon-thermometer-half:before {
  content: "\F2C9";
}
.icon-thermometer-1:before,
.icon-thermometer-quarter:before {
  content: "\F2CA";
}
.icon-thermometer-0:before,
.icon-thermometer-empty:before {
  content: "\F2CB";
}
.icon-shower:before {
  content: "\F2CC";
}
.icon-bathtub:before,
.icon-s15:before,
.icon-bath:before {
  content: "\F2CD";
}
.icon-podcast:before {
  content: "\F2CE";
}
.icon-window-maximize:before {
  content: "\F2D0";
}
.icon-window-minimize:before {
  content: "\F2D1";
}
.icon-window-restore:before {
  content: "\F2D2";
}
.icon-times-rectangle:before,
.icon-window-close:before {
  content: "\F2D3";
}
.icon-times-rectangle-o:before,
.icon-window-close-o:before {
  content: "\F2D4";
}
.icon-bandcamp:before {
  content: "\F2D5";
}
.icon-grav:before {
  content: "\F2D6";
}
.icon-etsy:before {
  content: "\F2D7";
}
.icon-imdb:before {
  content: "\F2D8";
}
.icon-ravelry:before {
  content: "\F2D9";
}
.icon-eercast:before {
  content: "\F2DA";
}
.icon-microchip:before {
  content: "\F2DB";
}
.icon-snowflake-o:before {
  content: "\F2DC";
}
.icon-superpowers:before {
  content: "\F2DD";
}
.icon-wpexplorer:before {
  content: "\F2DE";
}
.icon-meetup:before {
  content: "\F2E0";
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.width-1,
.width-1-1,
.width-2-2,
.width-3-3,
.width-4-4,
.width-5-5,
.width-6-6,
.width-7-7,
.width-8-8,
.width-10-10,
.width-12-12,
.width-20-20,
.width-24-24,
.width-48-48 {
  width: 100%;
}
.width-47-48 {
  width: 97.91666667%;
}
.width-23-24,
.width-46-48 {
  width: 95.83333333%;
}
.width-19-20 {
  width: 95%;
}
.width-45-48 {
  width: 93.75%;
}
.width-11-12,
.width-22-24,
.width-44-48 {
  width: 91.66666667%;
}
.width-9-10,
.width-18-20 {
  width: 90%;
}
.width-43-48 {
  width: 89.58333333%;
}
.width-7-8,
.width-21-24,
.width-42-48 {
  width: 87.5%;
}
.width-41-48 {
  width: 85.41666667%;
}
.width-17-20 {
  width: 85%;
}
.width-5-6,
.width-10-12,
.width-20-24,
.width-40-48 {
  width: 83.33333333%;
}
.width-39-48 {
  width: 81.25%;
}
.width-4-5,
.width-8-10,
.width-16-20 {
  width: 80%;
}
.width-19-24,
.width-38-48 {
  width: 79.16666667%;
}
.width-37-48 {
  width: 77.08333333%;
}
.width-3-4,
.width-6-8,
.width-9-12,
.width-15-20,
.width-18-24,
.width-36-48 {
  width: 75%;
}
.width-35-48 {
  width: 72.91666667%;
}
.width-17-24,
.width-34-48 {
  width: 70.83333333%;
}
.width-7-10,
.width-14-20 {
  width: 70%;
}
.width-33-48 {
  width: 68.75%;
}
.width-2-3,
.width-4-6,
.width-8-12,
.width-16-24,
.width-32-48 {
  width: 66.66666667%;
}
.width-13-20 {
  width: 65%;
}
.width-31-48 {
  width: 64.58333333%;
}
.width-5-8,
.width-15-24,
.width-30-48 {
  width: 62.5%;
}
.width-3-5,
.width-6-10,
.width-12-20 {
  width: 60%;
}
.width-29-48 {
  width: 60.41666667%;
}
.width-7-12,
.width-14-24,
.width-28-48 {
  width: 58.33333333%;
}
.width-27-48 {
  width: 56.25%;
}
.width-11-20 {
  width: 55%;
}
.width-13-24,
.width-26-48 {
  width: 54.16666667%;
}
.width-25-48 {
  width: 52.08333333%;
}
.width-1-2,
.width-2-4,
.width-3-6,
.width-4-8,
.width-5-10,
.width-6-12,
.width-10-20,
.width-12-24,
.width-24-48 {
  width: 50%;
}
.width-23-48 {
  width: 47.91666667%;
}
.width-11-24,
.width-22-48 {
  width: 45.83333333%;
}
.width-9-20 {
  width: 45%;
}
.width-21-48 {
  width: 43.75%;
}
.width-5-12,
.width-10-24,
.width-20-48 {
  width: 41.66666667%;
}
.width-2-5,
.width-4-10,
.width-8-20 {
  width: 40%;
}
.width-19-48 {
  width: 39.58333333%;
}
.width-3-8,
.width-9-24,
.width-18-48 {
  width: 37.5%;
}
.width-17-48 {
  width: 35.41666667%;
}
.width-7-20 {
  width: 35%;
}
.width-1-3,
.width-2-6,
.width-4-12,
.width-8-24,
.width-16-48 {
  width: 33.33333333%;
}
.width-15-48 {
  width: 31.25%;
}
.width-3-10,
.width-6-20 {
  width: 30%;
}
.width-7-24,
.width-14-48 {
  width: 29.16666667%;
}
.width-13-48 {
  width: 27.08333333%;
}
.width-1-4,
.width-2-8,
.width-3-12,
.width-5-20,
.width-6-24,
.width-12-48 {
  width: 25%;
}
.width-11-48 {
  width: 22.91666667%;
}
.width-5-24,
.width-10-48 {
  width: 10.41666667%;
}
.width-1-5,
.width-2-10,
.width-4-20 {
  width: 20%;
}
.width-9-48 {
  width: 18.75%;
}
.width-1-6,
.width-2-12,
.width-4-24,
.width-8-48 {
  width: 16.66666667%;
}
.width-3-20 {
  width: 15%;
}
.width-7-48 {
  width: 14.58333333%;
}
.width-1-8,
.width-3-24,
.width-6-48 {
  width: 6.25%;
}
.width-5-48 {
  width: 10.41666667%;
}
.width-1-10,
.width-2-20 {
  width: 10%;
}
.width-1-12,
.width-2-24,
.width-4-48 {
  width: 8.33333333%;
}
.width-3-48 {
  width: 6.25%;
}
.width-1-20 {
  width: 5%;
}
.width-1-24,
.width-2-48 {
  width: 4.16666667%;
}
.width-1-48 {
  width: 2.08333333%;
}
.width-6-7 {
  width: 85.71428571%;
}
.width--5-7 {
  width: 71.42857143%;
}
.width--4-7 {
  width: 57.14285714%;
}
.width--3-7 {
  width: 42.85714286%;
}
.width--2-7 {
  width: 28.57142857%;
}
.width--1-7 {
  width: 14.28571429%;
}
@media (min-width: 768px) {
  .width-sm-1,
  .width-sm-1-1,
  .width-sm-2-2,
  .width-sm-3-3,
  .width-sm-4-4,
  .width-sm-5-5,
  .width-sm-6-6,
  .width-sm-7-7,
  .width-sm-8-8,
  .width-sm-10-10,
  .width-sm-12-12,
  .width-sm-20-20,
  .width-sm-24-24,
  .width-sm-48-48 {
    width: 100%;
  }
  .width-sm-47-48 {
    width: 97.91666667%;
  }
  .width-sm-23-24,
  .width-sm-46-48 {
    width: 95.83333333%;
  }
  .width-sm-19-20 {
    width: 95%;
  }
  .width-sm-45-48 {
    width: 93.75%;
  }
  .width-sm-11-12,
  .width-sm-22-24,
  .width-sm-44-48 {
    width: 91.66666667%;
  }
  .width-sm-9-10,
  .width-sm-18-20 {
    width: 90%;
  }
  .width-sm-43-48 {
    width: 89.58333333%;
  }
  .width-sm-7-8,
  .width-sm-21-24,
  .width-sm-42-48 {
    width: 87.5%;
  }
  .width-sm-41-48 {
    width: 85.41666667%;
  }
  .width-sm-17-20 {
    width: 85%;
  }
  .width-sm-5-6,
  .width-sm-10-12,
  .width-sm-20-24,
  .width-sm-40-48 {
    width: 83.33333333%;
  }
  .width-sm-39-48 {
    width: 81.25%;
  }
  .width-sm-4-5,
  .width-sm-8-10,
  .width-sm-16-20 {
    width: 80%;
  }
  .width-sm-19-24,
  .width-sm-38-48 {
    width: 79.16666667%;
  }
  .width-sm-37-48 {
    width: 77.08333333%;
  }
  .width-sm-3-4,
  .width-sm-6-8,
  .width-sm-9-12,
  .width-sm-15-20,
  .width-sm-18-24,
  .width-sm-36-48 {
    width: 75%;
  }
  .width-sm-35-48 {
    width: 72.91666667%;
  }
  .width-sm-17-24,
  .width-sm-34-48 {
    width: 70.83333333%;
  }
  .width-sm-7-10,
  .width-sm-14-20 {
    width: 70%;
  }
  .width-sm-33-48 {
    width: 68.75%;
  }
  .width-sm-2-3,
  .width-sm-4-6,
  .width-sm-8-12,
  .width-sm-16-24,
  .width-sm-32-48 {
    width: 66.66666667%;
  }
  .width-sm-13-20 {
    width: 65%;
  }
  .width-sm-31-48 {
    width: 64.58333333%;
  }
  .width-sm-5-8,
  .width-sm-15-24,
  .width-sm-30-48 {
    width: 62.5%;
  }
  .width-sm-3-5,
  .width-sm-6-10,
  .width-sm-12-20 {
    width: 60%;
  }
  .width-sm-29-48 {
    width: 60.41666667%;
  }
  .width-sm-7-12,
  .width-sm-14-24,
  .width-sm-28-48 {
    width: 58.33333333%;
  }
  .width-sm-27-48 {
    width: 56.25%;
  }
  .width-sm-11-20 {
    width: 55%;
  }
  .width-sm-13-24,
  .width-sm-26-48 {
    width: 54.16666667%;
  }
  .width-sm-25-48 {
    width: 52.08333333%;
  }
  .width-sm-1-2,
  .width-sm-2-4,
  .width-sm-3-6,
  .width-sm-4-8,
  .width-sm-5-10,
  .width-sm-6-12,
  .width-sm-10-20,
  .width-sm-12-24,
  .width-sm-24-48 {
    width: 50%;
  }
  .width-sm-23-48 {
    width: 47.91666667%;
  }
  .width-sm-11-24,
  .width-sm-22-48 {
    width: 45.83333333%;
  }
  .width-sm-9-20 {
    width: 45%;
  }
  .width-sm-21-48 {
    width: 43.75%;
  }
  .width-sm-5-12,
  .width-sm-10-24,
  .width-sm-20-48 {
    width: 41.66666667%;
  }
  .width-sm-2-5,
  .width-sm-4-10,
  .width-sm-8-20 {
    width: 40%;
  }
  .width-sm-19-48 {
    width: 39.58333333%;
  }
  .width-sm-3-8,
  .width-sm-9-24,
  .width-sm-18-48 {
    width: 37.5%;
  }
  .width-sm-17-48 {
    width: 35.41666667%;
  }
  .width-sm-7-20 {
    width: 35%;
  }
  .width-sm-1-3,
  .width-sm-2-6,
  .width-sm-4-12,
  .width-sm-8-24,
  .width-sm-16-48 {
    width: 33.33333333%;
  }
  .width-sm-15-48 {
    width: 31.25%;
  }
  .width-sm-3-10,
  .width-sm-6-20 {
    width: 30%;
  }
  .width-sm-7-24,
  .width-sm-14-48 {
    width: 29.16666667%;
  }
  .width-sm-13-48 {
    width: 27.08333333%;
  }
  .width-sm-1-4,
  .width-sm-2-8,
  .width-sm-3-12,
  .width-sm-5-20,
  .width-sm-6-24,
  .width-sm-12-48 {
    width: 25%;
  }
  .width-sm-11-48 {
    width: 22.91666667%;
  }
  .width-sm-5-24,
  .width-sm-10-48 {
    width: 10.41666667%;
  }
  .width-sm-1-5,
  .width-sm-2-10,
  .width-sm-4-20 {
    width: 20%;
  }
  .width-sm-9-48 {
    width: 18.75%;
  }
  .width-sm-1-6,
  .width-sm-2-12,
  .width-sm-4-24,
  .width-sm-8-48 {
    width: 16.66666667%;
  }
  .width-sm-3-20 {
    width: 15%;
  }
  .width-sm-7-48 {
    width: 14.58333333%;
  }
  .width-sm-1-8,
  .width-sm-3-24,
  .width-sm-6-48 {
    width: 6.25%;
  }
  .width-sm-5-48 {
    width: 10.41666667%;
  }
  .width-sm-1-10,
  .width-sm-2-20 {
    width: 10%;
  }
  .width-sm-1-12,
  .width-sm-2-24,
  .width-sm-4-48 {
    width: 8.33333333%;
  }
  .width-sm-3-48 {
    width: 6.25%;
  }
  .width-sm-1-20 {
    width: 5%;
  }
  .width-sm-1-24,
  .width-sm-2-48 {
    width: 4.16666667%;
  }
  .width-sm-1-48 {
    width: 2.08333333%;
  }
  .width-sm-6-7 {
    width: 85.71428571%;
  }
  .width--sm-5-7 {
    width: 71.42857143%;
  }
  .width--sm-4-7 {
    width: 57.14285714%;
  }
  .width--sm-3-7 {
    width: 42.85714286%;
  }
  .width--sm-2-7 {
    width: 28.57142857%;
  }
  .width--sm-1-7 {
    width: 14.28571429%;
  }
}
@media (min-width: 992px) {
  .width-md-1,
  .width-md-1-1,
  .width-md-2-2,
  .width-md-3-3,
  .width-md-4-4,
  .width-md-5-5,
  .width-md-6-6,
  .width-md-7-7,
  .width-md-8-8,
  .width-md-10-10,
  .width-md-12-12,
  .width-md-20-20,
  .width-md-24-24,
  .width-md-48-48 {
    width: 100%;
  }
  .width-md-47-48 {
    width: 97.91666667%;
  }
  .width-md-23-24,
  .width-md-46-48 {
    width: 95.83333333%;
  }
  .width-md-19-20 {
    width: 95%;
  }
  .width-md-45-48 {
    width: 93.75%;
  }
  .width-md-11-12,
  .width-md-22-24,
  .width-md-44-48 {
    width: 91.66666667%;
  }
  .width-md-9-10,
  .width-md-18-20 {
    width: 90%;
  }
  .width-md-43-48 {
    width: 89.58333333%;
  }
  .width-md-7-8,
  .width-md-21-24,
  .width-md-42-48 {
    width: 87.5%;
  }
  .width-md-41-48 {
    width: 85.41666667%;
  }
  .width-md-17-20 {
    width: 85%;
  }
  .width-md-5-6,
  .width-md-10-12,
  .width-md-20-24,
  .width-md-40-48 {
    width: 83.33333333%;
  }
  .width-md-39-48 {
    width: 81.25%;
  }
  .width-md-4-5,
  .width-md-8-10,
  .width-md-16-20 {
    width: 80%;
  }
  .width-md-19-24,
  .width-md-38-48 {
    width: 79.16666667%;
  }
  .width-md-37-48 {
    width: 77.08333333%;
  }
  .width-md-3-4,
  .width-md-6-8,
  .width-md-9-12,
  .width-md-15-20,
  .width-md-18-24,
  .width-md-36-48 {
    width: 75%;
  }
  .width-md-35-48 {
    width: 72.91666667%;
  }
  .width-md-17-24,
  .width-md-34-48 {
    width: 70.83333333%;
  }
  .width-md-7-10,
  .width-md-14-20 {
    width: 70%;
  }
  .width-md-33-48 {
    width: 68.75%;
  }
  .width-md-2-3,
  .width-md-4-6,
  .width-md-8-12,
  .width-md-16-24,
  .width-md-32-48 {
    width: 66.66666667%;
  }
  .width-md-13-20 {
    width: 65%;
  }
  .width-md-31-48 {
    width: 64.58333333%;
  }
  .width-md-5-8,
  .width-md-15-24,
  .width-md-30-48 {
    width: 62.5%;
  }
  .width-md-3-5,
  .width-md-6-10,
  .width-md-12-20 {
    width: 60%;
  }
  .width-md-29-48 {
    width: 60.41666667%;
  }
  .width-md-7-12,
  .width-md-14-24,
  .width-md-28-48 {
    width: 58.33333333%;
  }
  .width-md-27-48 {
    width: 56.25%;
  }
  .width-md-11-20 {
    width: 55%;
  }
  .width-md-13-24,
  .width-md-26-48 {
    width: 54.16666667%;
  }
  .width-md-25-48 {
    width: 52.08333333%;
  }
  .width-md-1-2,
  .width-md-2-4,
  .width-md-3-6,
  .width-md-4-8,
  .width-md-5-10,
  .width-md-6-12,
  .width-md-10-20,
  .width-md-12-24,
  .width-md-24-48 {
    width: 50%;
  }
  .width-md-23-48 {
    width: 47.91666667%;
  }
  .width-md-11-24,
  .width-md-22-48 {
    width: 45.83333333%;
  }
  .width-md-9-20 {
    width: 45%;
  }
  .width-md-21-48 {
    width: 43.75%;
  }
  .width-md-5-12,
  .width-md-10-24,
  .width-md-20-48 {
    width: 41.66666667%;
  }
  .width-md-2-5,
  .width-md-4-10,
  .width-md-8-20 {
    width: 40%;
  }
  .width-md-19-48 {
    width: 39.58333333%;
  }
  .width-md-3-8,
  .width-md-9-24,
  .width-md-18-48 {
    width: 37.5%;
  }
  .width-md-17-48 {
    width: 35.41666667%;
  }
  .width-md-7-20 {
    width: 35%;
  }
  .width-md-1-3,
  .width-md-2-6,
  .width-md-4-12,
  .width-md-8-24,
  .width-md-16-48 {
    width: 33.33333333%;
  }
  .width-md-15-48 {
    width: 31.25%;
  }
  .width-md-3-10,
  .width-md-6-20 {
    width: 30%;
  }
  .width-md-7-24,
  .width-md-14-48 {
    width: 29.16666667%;
  }
  .width-md-13-48 {
    width: 27.08333333%;
  }
  .width-md-1-4,
  .width-md-2-8,
  .width-md-3-12,
  .width-md-5-20,
  .width-md-6-24,
  .width-md-12-48 {
    width: 25%;
  }
  .width-md-11-48 {
    width: 22.91666667%;
  }
  .width-md-5-24,
  .width-md-10-48 {
    width: 10.41666667%;
  }
  .width-md-1-5,
  .width-md-2-10,
  .width-md-4-20 {
    width: 20%;
  }
  .width-md-9-48 {
    width: 18.75%;
  }
  .width-md-1-6,
  .width-md-2-12,
  .width-md-4-24,
  .width-md-8-48 {
    width: 16.66666667%;
  }
  .width-md-3-20 {
    width: 15%;
  }
  .width-md-7-48 {
    width: 14.58333333%;
  }
  .width-md-1-8,
  .width-md-3-24,
  .width-md-6-48 {
    width: 6.25%;
  }
  .width-md-5-48 {
    width: 10.41666667%;
  }
  .width-md-1-10,
  .width-md-2-20 {
    width: 10%;
  }
  .width-md-1-12,
  .width-md-2-24,
  .width-md-4-48 {
    width: 8.33333333%;
  }
  .width-md-3-48 {
    width: 6.25%;
  }
  .width-md-1-20 {
    width: 5%;
  }
  .width-md-1-24,
  .width-md-2-48 {
    width: 4.16666667%;
  }
  .width-md-1-48 {
    width: 2.08333333%;
  }
  .width-md-6-7 {
    width: 85.71428571%;
  }
  .width--md-5-7 {
    width: 71.42857143%;
  }
  .width--md-4-7 {
    width: 57.14285714%;
  }
  .width--md-3-7 {
    width: 42.85714286%;
  }
  .width--md-2-7 {
    width: 28.57142857%;
  }
  .width--md-1-7 {
    width: 14.28571429%;
  }
}
@media (min-width: 1200px) {
  .width-lg-1,
  .width-lg-1-1,
  .width-lg-2-2,
  .width-lg-3-3,
  .width-lg-4-4,
  .width-lg-5-5,
  .width-lg-6-6,
  .width-lg-7-7,
  .width-lg-8-8,
  .width-lg-10-10,
  .width-lg-12-12,
  .width-lg-20-20,
  .width-lg-24-24,
  .width-lg-48-48 {
    width: 100%;
  }
  .width-lg-47-48 {
    width: 97.91666667%;
  }
  .width-lg-23-24,
  .width-lg-46-48 {
    width: 95.83333333%;
  }
  .width-lg-19-20 {
    width: 95%;
  }
  .width-lg-45-48 {
    width: 93.75%;
  }
  .width-lg-11-12,
  .width-lg-22-24,
  .width-lg-44-48 {
    width: 91.66666667%;
  }
  .width-lg-9-10,
  .width-lg-18-20 {
    width: 90%;
  }
  .width-lg-43-48 {
    width: 89.58333333%;
  }
  .width-lg-7-8,
  .width-lg-21-24,
  .width-lg-42-48 {
    width: 87.5%;
  }
  .width-lg-41-48 {
    width: 85.41666667%;
  }
  .width-lg-17-20 {
    width: 85%;
  }
  .width-lg-5-6,
  .width-lg-10-12,
  .width-lg-20-24,
  .width-lg-40-48 {
    width: 83.33333333%;
  }
  .width-lg-39-48 {
    width: 81.25%;
  }
  .width-lg-4-5,
  .width-lg-8-10,
  .width-lg-16-20 {
    width: 80%;
  }
  .width-lg-19-24,
  .width-lg-38-48 {
    width: 79.16666667%;
  }
  .width-lg-37-48 {
    width: 77.08333333%;
  }
  .width-lg-3-4,
  .width-lg-6-8,
  .width-lg-9-12,
  .width-lg-15-20,
  .width-lg-18-24,
  .width-lg-36-48 {
    width: 75%;
  }
  .width-lg-35-48 {
    width: 72.91666667%;
  }
  .width-lg-17-24,
  .width-lg-34-48 {
    width: 70.83333333%;
  }
  .width-lg-7-10,
  .width-lg-14-20 {
    width: 70%;
  }
  .width-lg-33-48 {
    width: 68.75%;
  }
  .width-lg-2-3,
  .width-lg-4-6,
  .width-lg-8-12,
  .width-lg-16-24,
  .width-lg-32-48 {
    width: 66.66666667%;
  }
  .width-lg-13-20 {
    width: 65%;
  }
  .width-lg-31-48 {
    width: 64.58333333%;
  }
  .width-lg-5-8,
  .width-lg-15-24,
  .width-lg-30-48 {
    width: 62.5%;
  }
  .width-lg-3-5,
  .width-lg-6-10,
  .width-lg-12-20 {
    width: 60%;
  }
  .width-lg-29-48 {
    width: 60.41666667%;
  }
  .width-lg-7-12,
  .width-lg-14-24,
  .width-lg-28-48 {
    width: 58.33333333%;
  }
  .width-lg-27-48 {
    width: 56.25%;
  }
  .width-lg-11-20 {
    width: 55%;
  }
  .width-lg-13-24,
  .width-lg-26-48 {
    width: 54.16666667%;
  }
  .width-lg-25-48 {
    width: 52.08333333%;
  }
  .width-lg-1-2,
  .width-lg-2-4,
  .width-lg-3-6,
  .width-lg-4-8,
  .width-lg-5-10,
  .width-lg-6-12,
  .width-lg-10-20,
  .width-lg-12-24,
  .width-lg-24-48 {
    width: 50%;
  }
  .width-lg-23-48 {
    width: 47.91666667%;
  }
  .width-lg-11-24,
  .width-lg-22-48 {
    width: 45.83333333%;
  }
  .width-lg-9-20 {
    width: 45%;
  }
  .width-lg-21-48 {
    width: 43.75%;
  }
  .width-lg-5-12,
  .width-lg-10-24,
  .width-lg-20-48 {
    width: 41.66666667%;
  }
  .width-lg-2-5,
  .width-lg-4-10,
  .width-lg-8-20 {
    width: 40%;
  }
  .width-lg-19-48 {
    width: 39.58333333%;
  }
  .width-lg-3-8,
  .width-lg-9-24,
  .width-lg-18-48 {
    width: 37.5%;
  }
  .width-lg-17-48 {
    width: 35.41666667%;
  }
  .width-lg-7-20 {
    width: 35%;
  }
  .width-lg-1-3,
  .width-lg-2-6,
  .width-lg-4-12,
  .width-lg-8-24,
  .width-lg-16-48 {
    width: 33.33333333%;
  }
  .width-lg-15-48 {
    width: 31.25%;
  }
  .width-lg-3-10,
  .width-lg-6-20 {
    width: 30%;
  }
  .width-lg-7-24,
  .width-lg-14-48 {
    width: 29.16666667%;
  }
  .width-lg-13-48 {
    width: 27.08333333%;
  }
  .width-lg-1-4,
  .width-lg-2-8,
  .width-lg-3-12,
  .width-lg-5-20,
  .width-lg-6-24,
  .width-lg-12-48 {
    width: 25%;
  }
  .width-lg-11-48 {
    width: 22.91666667%;
  }
  .width-lg-5-24,
  .width-lg-10-48 {
    width: 10.41666667%;
  }
  .width-lg-1-5,
  .width-lg-2-10,
  .width-lg-4-20 {
    width: 20%;
  }
  .width-lg-9-48 {
    width: 18.75%;
  }
  .width-lg-1-6,
  .width-lg-2-12,
  .width-lg-4-24,
  .width-lg-8-48 {
    width: 16.66666667%;
  }
  .width-lg-3-20 {
    width: 15%;
  }
  .width-lg-7-48 {
    width: 14.58333333%;
  }
  .width-lg-1-8,
  .width-lg-3-24,
  .width-lg-6-48 {
    width: 6.25%;
  }
  .width-lg-5-48 {
    width: 10.41666667%;
  }
  .width-lg-1-10,
  .width-lg-2-20 {
    width: 10%;
  }
  .width-lg-1-12,
  .width-lg-2-24,
  .width-lg-4-48 {
    width: 8.33333333%;
  }
  .width-lg-3-48 {
    width: 6.25%;
  }
  .width-lg-1-20 {
    width: 5%;
  }
  .width-lg-1-24,
  .width-lg-2-48 {
    width: 4.16666667%;
  }
  .width-lg-1-48 {
    width: 2.08333333%;
  }
  .width-lg-6-7 {
    width: 85.71428571%;
  }
  .width--lg-5-7 {
    width: 71.42857143%;
  }
  .width--lg-4-7 {
    width: 57.14285714%;
  }
  .width--lg-3-7 {
    width: 42.85714286%;
  }
  .width--lg-2-7 {
    width: 28.57142857%;
  }
  .width--lg-1-7 {
    width: 14.28571429%;
  }
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.wrap {
  padding: 0;
}
.wrap:before {
  content: " ";
  display: table;
}
.wrap:after {
  content: " ";
  display: table;
  clear: both;
}
.wrap-none,
.wrap-x-none {
  padding-left: 0;
  padding-right: 0;
}
.wrap-teeny,
.wrap-x-teeny {
  padding-left: 4px;
  padding-right: 4px;
}
.wrap-tiny,
.wrap-x-tiny {
  padding-left: 8px;
  padding-right: 8px;
}
.wrap-small,
.wrap-x-small {
  padding-left: 16px;
  padding-right: 16px;
}
.wrap-base,
.wrap-x-base {
  padding-left: 24px;
  padding-right: 24px;
}
.wrap-large,
.wrap-x-large {
  padding-left: 48px;
  padding-right: 48px;
}
.wrap-huge,
.wrap-x-huge {
  padding-left: 96px;
  padding-right: 96px;
}
.wrap-none,
.wrap-y-none {
  padding-bottom: 0;
}
.wrap-teeny,
.wrap-y-teeny {
  padding-bottom: 5px;
}
.wrap-tiny,
.wrap-y-tiny {
  padding-bottom: 10px;
}
.wrap-small,
.wrap-y-small {
  padding-bottom: 20px;
}
.wrap-base,
.wrap-y-base {
  padding-bottom: 30px;
}
.wrap-large,
.wrap-y-large {
  padding-bottom: 60px;
}
.wrap-huge,
.wrap-y-huge {
  padding-bottom: 120px;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.button {
  display: block;
  width: 100%;
  padding: 15px 12px;
  background: #484848;
  border: 2px solid transparent;
  border-radius: 6px;
  font-size: 0.875em;
  color: #ffffff;
  text-transform: uppercase;
  cursor: pointer;
}
.button:active,
.button:focus,
.button:hover {
  border-color: #39b54a;
  background: #ffffff;
  color: #000000;
  box-shadow: 0 2px 3px rgba(0, 0, 0, 0.25);
}
.button[disabled] {
  border-color: transparent;
  background: #484848;
  color: #ffffff;
  opacity: 0.25;
}
.button--clear {
  padding-left: 24px;
  padding-right: 24px;
  background: #ffffff;
  border-color: #484848;
  text-align: left;
  color: #000000;
  text-transform: none;
}
.button--clear[disabled] {
  background: #ffffff;
  border-color: #484848;
  color: #000000;
  opacity: 0.25;
}
.button--square {
  width: 60px;
  height: 60px;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.form-alert {
  color: #ee3030;
  font-size: 0.75em;
}
.form-control {
  width: 100%;
  padding: 15px 16px;
  border: 2px solid #484848;
  border-radius: 6px;
  background: #ffffff;
  color: #000000;
}
.form-control.invalid {
  border-color: #ee3030;
}
.form-control:active,
.form-control:focus,
.form-control:hover {
  border-color: #39b54a;
  box-shadow: 0 2px 3px rgba(0, 0, 0, 0.25);
}
.form-control[disabled] {
  border-color: #000000;
  background: #ffffff;
  color: #000000;
  opacity: 0.5;
}
.form-control::-webkit-input-placeholder {
  color: #000000;
  opacity: 0.4;
}
.form-control::-moz-placeholder {
  color: #000000;
  opacity: 0.4;
}
.form-control:-moz-placeholder {
  color: #000000;
  opacity: 0.4;
}
.form-control:-ms-input-placeholder {
  color: #000000;
  opacity: 0.4;
}
.form-field {
  position: relative;
  padding-top: 13.75px;
}
.form-label {
  position: absolute;
  top: 0;
  left: 16px;
  padding: 0 16px;
  background: #ffffff;
  font-size: 0.875em;
  line-height: 27.5px;
}
.header-alert {
  color: #ee3030;
  font-size: 0.75em;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.image-viewer-controller {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-image: none;
  background-position: 50% 50%;
  background-repeat: no-repeat;
}
.image-viewer-controller--stretch-contain {
  background-size: contain;
}
.image-viewer-controller--stretch-cover {
  background-size: cover;
}
.image-viewer-controller--stretch-fill {
  background-size: 100% 100%;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.layout-body {
  height: 100%;
}
.layout-html {
  height: 100%;
  background: #000000;
  color: #ffffff;
}
.layout-root {
  height: 100%;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.loader-icon {
  font-size: 160px;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.pdf-viewer-controller {
  overflow: hidden;
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background: #000000;
  color: #ffffff;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.position-frame {
  overflow: hidden;
  position: absolute;
  left: 0;
  top: 0;
  width: 0;
  height: 0;
}
/**
 * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@gmail.com>
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.setup-root {
  background: #ffffff;
  color: #000000;
}
.setup-clock {
  font-size: 1.85em;
}
.setup-connectivity {
  width: 60px;
  height: 60px;
  background: url(assets/4304535f.svg) no-repeat;
}
.setup-connectivity--offline {
  background-position: 0 0;
}
.setup-connectivity--online {
  background-position: 0 -60px;
}
.setup-failure {
  color: #ee3030;
}
.setup-icon {
  font-size: 260px;
}
.setup-icon--failure {
  color: #ee3030;
}
.setup-icon--success {
  color: #2e903b;
}
.setup-logo {
  height: 36px;
}
.setup-panel {
  position: fixed;
  top: 60px;
  width: 204px;
  height: 60px;
}
.setup-panel--position-left {
  left: 48px;
  text-align: left;
}
.setup-panel--position-right {
  right: 48px;
  text-align: right;
}
.setup-panel__grid {
  height: 60px;
}
.setup-qr {
  vertical-align: top;
}
.setup-title {
  font-size: 1.25em;
  line-height: 1.5;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.stretch-native--contain {
  object-fit: contain;
}
.stretch-native--cover {
  object-fit: cover;
}
.stretch-native--fill {
  object-fit: fill;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.viewer-controller-iframe {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background: #ffffff;
  color: #000000;
}
.viewer-controller-iframe--no-scroll {
  overflow: hidden;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.viewer-controller-video {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
}
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
.viewer-root {
  overflow: hidden;
  position: absolute;
  top: 0;
}
.viewer-root--orientation-0 {
  left: 0;
  width: 100%;
  height: 100%;
}
.viewer-root--orientation-90 {
  right: 0;
  width: 56.25%;
  height: 177.77777778%;
  -webkit-transform: rotate(90deg);
          transform: rotate(90deg);
  -webkit-transform-origin: 50% 28.125%;
          transform-origin: 50% 28.125%;
}
.viewer-root--orientation-180 {
  left: 0;
  width: 100%;
  height: 100%;
  -webkit-transform: rotate(180deg);
          transform: rotate(180deg);
  -webkit-transform-origin: 50% 50%;
          transform-origin: 50% 50%;
}
.viewer-root--orientation-270 {
  left: 0;
  width: 56.25%;
  height: 177.77777778%;
  -webkit-transform: rotate(270deg);
          transform: rotate(270deg);
  -webkit-transform-origin: 50% 28.125%;
          transform-origin: 50% 28.125%;
}

/*# sourceMappingURL=main.css.map*/{"version":3,"sources":[],"names":[],"mappings":"","file":"main.css","sourceRoot":""}!function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=583)}([function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}e.exports=function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),e}},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t){e.exports=function(e){return null==e}},function(e,t,n){var r=n(21),i=n(55).f,o=n(41),a=n(54),s=n(162),u=n(579),c=n(158);e.exports=function(e,t){var n,l,f,h,d,p=e.target,v=e.global,m=e.stat;if(n=v?r:m?r[p]||s(p,{}):(r[p]||{}).prototype)for(l in t){if(h=t[l],f=e.noTargetGet?(d=i(n,l))&&d.value:n[l],!c(v?l:p+(m?".":"#")+l,e.forced)&&void 0!==f){if(typeof h==typeof f)continue;u(h,f)}(e.sham||f&&f.sham)&&o(h,"sham",!0),a(n,l,h,e)}}},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){"use strict";n.d(t,"b",function(){return i}),n.d(t,"a",function(){return o}),n.d(t,"e",function(){return a}),n.d(t,"c",function(){return s}),n.d(t,"d",function(){return u});var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function i(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var o=function(){return(o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function a(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;return t?t.call(e):{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}function s(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),a=[];try{for(;(void 0===t||t-->0)&&!(r=o.next()).done;)a.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a}function u(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(s(arguments[t]));return e}},function(e,t,n){var r=n(136);e.exports=function(e,t,n){var i=null==e?void 0:r(e,t);return void 0===i?n:i}},function(e,t,n){"use strict";t.a={Debug:"Debug",Error:"Error",Info:"Info",Log:"Log",Warning:"Warning"}},function(e,t,n){"use strict";var r=Object.prototype.hasOwnProperty,i="~";function o(){}function a(e,t,n,r,o){if("function"!=typeof n)throw new TypeError("The listener must be a function");var a=new function(e,t,n){this.fn=e,this.context=t,this.once=n||!1}(n,r||e,o),s=i?i+t:t;return e._events[s]?e._events[s].fn?e._events[s]=[e._events[s],a]:e._events[s].push(a):(e._events[s]=a,e._eventsCount++),e}function s(e,t){0==--e._eventsCount?e._events=new o:delete e._events[t]}function u(){this._events=new o,this._eventsCount=0}Object.create&&(o.prototype=Object.create(null),(new o).__proto__||(i=!1)),u.prototype.eventNames=function(){var e,t,n=[];if(0===this._eventsCount)return n;for(t in e=this._events)r.call(e,t)&&n.push(i?t.slice(1):t);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(e)):n},u.prototype.listeners=function(e){var t=i?i+e:e,n=this._events[t];if(!n)return[];if(n.fn)return[n.fn];for(var r=0,o=n.length,a=new Array(o);r<o;r++)a[r]=n[r].fn;return a},u.prototype.listenerCount=function(e){var t=i?i+e:e,n=this._events[t];return n?n.fn?1:n.length:0},u.prototype.emit=function(e,t,n,r,o,a){var s=i?i+e:e;if(!this._events[s])return!1;var u,c,l=this._events[s],f=arguments.length;if(l.fn){switch(l.once&&this.removeListener(e,l.fn,void 0,!0),f){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,t),!0;case 3:return l.fn.call(l.context,t,n),!0;case 4:return l.fn.call(l.context,t,n,r),!0;case 5:return l.fn.call(l.context,t,n,r,o),!0;case 6:return l.fn.call(l.context,t,n,r,o,a),!0}for(c=1,u=new Array(f-1);c<f;c++)u[c-1]=arguments[c];l.fn.apply(l.context,u)}else{var h,d=l.length;for(c=0;c<d;c++)switch(l[c].once&&this.removeListener(e,l[c].fn,void 0,!0),f){case 1:l[c].fn.call(l[c].context);break;case 2:l[c].fn.call(l[c].context,t);break;case 3:l[c].fn.call(l[c].context,t,n);break;case 4:l[c].fn.call(l[c].context,t,n,r);break;default:if(!u)for(h=1,u=new Array(f-1);h<f;h++)u[h-1]=arguments[h];l[c].fn.apply(l[c].context,u)}}return!0},u.prototype.on=function(e,t,n){return a(this,e,t,n,!1)},u.prototype.once=function(e,t,n){return a(this,e,t,n,!0)},u.prototype.removeListener=function(e,t,n,r){var o=i?i+e:e;if(!this._events[o])return this;if(!t)return s(this,o),this;var a=this._events[o];if(a.fn)a.fn!==t||r&&!a.once||n&&a.context!==n||s(this,o);else{for(var u=0,c=[],l=a.length;u<l;u++)(a[u].fn!==t||r&&!a[u].once||n&&a[u].context!==n)&&c.push(a[u]);c.length?this._events[o]=1===c.length?c[0]:c:s(this,o)}return this},u.prototype.removeAllListeners=function(e){var t;return e?(t=i?i+e:e,this._events[t]&&s(this,t)):(this._events=new o,this._eventsCount=0),this},u.prototype.off=u.prototype.removeListener,u.prototype.addListener=u.prototype.on,u.prefixed=i,u.EventEmitter=u,e.exports=u},function(e,t,n){var r=n(23);e.exports=function(e){if(!r(e))throw TypeError(String(e)+" is not an object");return e}},function(e,t){e.exports=!1},function(e,t,n){"use strict";var r=n(7),i=n(26);t.a={name:"player-lighter",autorebootDefaultDisabled:!1,autorebootDefaultInterval:1728e5,autorebootMinInterval:9e5,contentTaskMaxInterval:Math.ceil((Math.pow(2,31)-1)/1e3),cordovaBootDelay:5e3,device:{downloader:{defaultSize:1073741824},communicator:{syncDelayBase:6e4},orientation:{defaultOrientationEnum:i.a.CLOCKWISE_0},session:{defaultId:"default"}},fileSystemLocalhostPort:7587,firmware:{defaultSize:1073741824},htmlIframeLoadDelay:6e4,icalMaxIterations:1825,kiwiLighterApiVersion:"0.11.*",longTimersMaxDelay:Math.pow(2,31)-1,pdfConnectionTimeout:5e3,pdfPageRate:.1,pdfSourceMax:3,platform:{tizenSssp4:{booterClockLimit:new Date(2e3,0).getTime(),booterRetryDelay:500,clockSyncInterval:864e5}},sentryCaptureErrorLevel:r.a.Error,sentryMaxEvents:5,setup:{automaticDelay:6e4,deviceName:"",failureDelayBase:6e4,failureDelayMax:24e4,failureDelayMultiplier:2,password:"",serverUrl:"https://server.ki-wi.cz/kiwi-server",successDelay:5e3,username:""},streamDefaultContainer:"video/mp4",timerMax:7,viewer:{errorDelay:1e3,errorLimit:10,loadLimit:10}}},function(e,t,n){var r=n(43),i=n(13),o=n(39),a="[object String]";e.exports=function(e){return"string"==typeof e||!i(e)&&o(e)&&r(e)==a}},function(e,t){var n=Array.isArray;e.exports=n},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},function(e,t,n){var r=n(300),i=n(299),o=n(298);e.exports=function(e){return r(e)||i(e)||o()}},,function(e,t,n){var r=n(47),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},function(e,t,n){var r=n(327),i=n(326),o=n(325);e.exports=function(e,t){return r(e)||i(e,t)||o()}},function(e,t,n){var r=n(95)("wks"),i=n(123),o=n(21).Symbol,a=n(232);e.exports=function(e){return r[e]||(r[e]=a&&o[e]||(a?o:i)("Symbol."+e))}},function(e,t){e.exports="object"==typeof window&&window&&window.Math==Math?window:"object"==typeof self&&self&&self.Math==Math?self:Function("return this")()},function(e,t,n){var r=n(31);e.exports=function(e){return Object(r(e))}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){e.exports=!n(14)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){var r=n(43),i=n(39),o="[object Number]";e.exports=function(e){return"number"==typeof e||i(e)&&r(e)==o}},function(e,t,n){"use strict";t.a={CLOCKWISE_0:"CLOCKWISE_0",CLOCKWISE_90:"CLOCKWISE_90",CLOCKWISE_180:"CLOCKWISE_180",CLOCKWISE_270:"CLOCKWISE_270"}},function(e,t,n){var r=n(15);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){var r=n(32);e.exports=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},i=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(i=i.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),i.forEach(function(t){r(e,t,n[t])})}return e}},function(e,t,n){var r=n(24),i=n(239),o=n(9),a=n(66),s=Object.defineProperty;t.f=r?s:function(e,t,n){if(o(e),t=a(t,!0),o(n),i)try{return s(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){var r=n(9),i=n(228),o=n(18),a=n(27),s=n(156),u=n(229),c={};(e.exports=function(e,t,n,l,f){var h,d,p,v,m,y=a(t,n,l?2:1);if(f)h=e;else{if("function"!=typeof(d=s(e)))throw TypeError("Target is not iterable");if(i(d)){for(p=0,v=o(e.length);v>p;p++)if((l?y(r(m=e[p])[0],m[1]):y(e[p]))===c)return c;return}h=d.call(e)}for(;!(m=h.next()).done;)if(u(h,y,m.value,l)===c)return c}).BREAK=c},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},function(e,t,n){var r=n(14);e.exports=function(e){return r(function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3})}},function(e,t,n){var r=n(31),i=/"/g;e.exports=function(e,t,n,o){var a=String(r(e)),s="<"+t;return""!==n&&(s+=" "+n+'="'+String(o).replace(i,"&quot;")+'"'),s+">"+a+"</"+t+">"}},function(e,t,n){var r=n(91),i=n(31);e.exports=function(e){return r(i(e))}},function(e,t){e.exports=function(e){return null===e}},function(e,t,n){var r=n(9),i=n(15),o=n(20)("species");e.exports=function(e,t){var n,a=r(e).constructor;return void 0===a||void 0==(n=r(a)[o])?t:i(n)}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t){e.exports=function(e){return null!=e&&"object"==typeof e}},function(e,t,n){var r=n(53),i=n(21),o=function(e){return"function"==typeof e?e:void 0};e.exports=function(e,t){return arguments.length<2?o(r[e])||o(i[e]):r[e]&&r[e][t]||i[e]&&i[e][t]}},function(e,t,n){var r=n(29),i=n(94);e.exports=n(24)?function(e,t,n){return r.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){var r=n(80),i=n(398),o=n(397),a="[object Null]",s="[object Undefined]",u=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?s:a:u&&u in Object(e)?i(e):o(e)}},function(e,t,n){var r=n(204),i="object"==typeof self&&self&&self.Object===Object&&self,o=r||i||Function("return this")();e.exports=o},function(e,t,n){var r=n(10),i=n(153);e.exports=r?i:function(e){return Map.prototype.entries.call(e)}},function(e,t,n){var r=n(20)("unscopables"),i=n(74),o=n(41),a=Array.prototype;void 0==a[r]&&o(a,r,i(null)),e.exports=function(e){a[r][e]=!0}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){"use strict";(function(e){n.d(t,"a",function(){return u}),n.d(t,"b",function(){return f}),n.d(t,"c",function(){return d});var r=n(5),i=n(113),o=n(206),a=n(114),s=3,u=function(){function e(e,t,n){void 0===t&&(t=new a.a),void 0===n&&(n=s),this._version=n,this._stack=[],this._stack.push({client:e,scope:t})}return e.prototype._invokeClient=function(e){for(var t,n=[],i=1;i<arguments.length;i++)n[i-1]=arguments[i];var o=this.getStackTop();o&&o.client&&o.client[e]&&(t=o.client)[e].apply(t,r.d(n,[o.scope]))},e.prototype.isOlderThan=function(e){return this._version<e},e.prototype.bindClient=function(e){this.getStackTop().client=e},e.prototype.pushScope=function(){var e=this.getStack(),t=e.length>0?e[e.length-1].scope:void 0,n=a.a.clone(t);return this.getStack().push({client:this.getClient(),scope:n}),n},e.prototype.popScope=function(){return void 0!==this.getStack().pop()},e.prototype.withScope=function(e){var t=this.pushScope();try{e(t)}finally{this.popScope()}},e.prototype.getClient=function(){return this.getStackTop().client},e.prototype.getScope=function(){return this.getStackTop().scope},e.prototype.getStack=function(){return this._stack},e.prototype.getStackTop=function(){return this._stack[this._stack.length-1]},e.prototype.captureException=function(e,t){var n=this._lastEventId=Object(i.n)(),o=t;if(!t){var a=void 0;try{throw new Error("Sentry syntheticException")}catch(e){a=e}o={originalException:e,syntheticException:a}}return this._invokeClient("captureException",e,r.a({},o,{event_id:n})),n},e.prototype.captureMessage=function(e,t,n){var o=this._lastEventId=Object(i.n)(),a=n;if(!n){var s=void 0;try{throw new Error(e)}catch(e){s=e}a={originalException:e,syntheticException:s}}return this._invokeClient("captureMessage",e,t,r.a({},a,{event_id:o})),o},e.prototype.captureEvent=function(e,t){var n=this._lastEventId=Object(i.n)();return this._invokeClient("captureEvent",e,r.a({},t,{event_id:n})),n},e.prototype.lastEventId=function(){return this._lastEventId},e.prototype.addBreadcrumb=function(e,t){var n=this.getStackTop();if(n.scope&&n.client){var o=n.client.getOptions&&n.client.getOptions()||{},a=o.beforeBreadcrumb,s=void 0===a?null:a,u=o.maxBreadcrumbs,c=void 0===u?100:u;if(!(c<=0)){var l=Object(i.m)(),f=r.a({timestamp:l},e),h=s?Object(i.c)(function(){return s(f,t)}):f;null!==h&&n.scope.addBreadcrumb(h,Math.min(c,100))}}},e.prototype.setUser=function(e){var t=this.getStackTop();t.scope&&t.scope.setUser(e)},e.prototype.setTags=function(e){var t=this.getStackTop();t.scope&&t.scope.setTags(e)},e.prototype.setExtras=function(e){var t=this.getStackTop();t.scope&&t.scope.setExtras(e)},e.prototype.setTag=function(e,t){var n=this.getStackTop();n.scope&&n.scope.setTag(e,t)},e.prototype.setExtra=function(e,t){var n=this.getStackTop();n.scope&&n.scope.setExtra(e,t)},e.prototype.setContext=function(e,t){var n=this.getStackTop();n.scope&&n.scope.setContext(e,t)},e.prototype.configureScope=function(e){var t=this.getStackTop();t.scope&&t.client&&e(t.scope)},e.prototype.run=function(e){var t=l(this);try{e(this)}finally{l(t)}},e.prototype.getIntegration=function(e){var t=this.getClient();if(!t)return null;try{return t.getIntegration(e)}catch(t){return o.a.warn("Cannot retrieve integration "+e.id+" from the current Hub"),null}},e.prototype.startSpan=function(e,t){return void 0===t&&(t=!1),this._callExtensionMethod("startSpan",e,t)},e.prototype.traceHeaders=function(){return this._callExtensionMethod("traceHeaders")},e.prototype._callExtensionMethod=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=c().__SENTRY__;if(r&&r.extensions&&"function"==typeof r.extensions[e])return r.extensions[e].apply(this,t);o.a.warn("Extension method "+e+" couldn't be found, doing nothing.")},e}();function c(){var e=Object(i.g)();return e.__SENTRY__=e.__SENTRY__||{extensions:{},hub:void 0},e}function l(e){var t=c(),n=d(t);return p(t,e),n}function f(){var t=c();return h(t)&&!d(t).isOlderThan(s)||p(t,new u),Object(i.j)()?function(t){try{var n=Object(i.d)(e,"domain"),r=n.active;if(!r)return d(t);if(!h(r)||d(r).isOlderThan(s)){var o=d(t).getStackTop();p(r,new u(o.client,a.a.clone(o.scope)))}return d(r)}catch(e){return d(t)}}(t):d(t)}function h(e){return!!(e&&e.__SENTRY__&&e.__SENTRY__.hub)}function d(e){return e&&e.__SENTRY__&&e.__SENTRY__.hub?e.__SENTRY__.hub:(e.__SENTRY__=e.__SENTRY__||{},e.__SENTRY__.hub=new u,e.__SENTRY__.hub)}function p(e,t){return!!e&&(e.__SENTRY__=e.__SENTRY__||{},e.__SENTRY__.hub=t,!0)}}).call(this,n(404)(e))},function(e,t,n){var r;e.exports=function e(t,n,i){function o(s,u){if(!n[s]){if(!t[s]){var c="function"==typeof r&&r;if(!u&&c)return r(s,!0);if(a)return a(s,!0);throw new Error("Cannot find module '"+s+"'")}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n||e)},l,l.exports,e,t,n,i)}return n[s].exports}for(var a="function"==typeof r&&r,s=0;s<i.length;s++)o(i[s]);return o}({1:[function(e,t,n){(function(r,i,o,a,s,u,c,l,f){"use strict";function h(e,t){return t=d(e,t),function(e,t){var n;if(void 0===(n="passthrough"!==t.algorithm?y.createHash(t.algorithm):new m).write&&(n.write=n.update,n.end=n.update),v(t,n).dispatch(e),n.update||n.end(""),n.digest)return n.digest("buffer"===t.encoding?void 0:t.encoding);var r=n.read();return"buffer"===t.encoding?r:r.toString(t.encoding)}(e,t)}function d(e,t){if((t=t||{}).algorithm=t.algorithm||"sha1",t.encoding=t.encoding||"hex",t.excludeValues=!!t.excludeValues,t.algorithm=t.algorithm.toLowerCase(),t.encoding=t.encoding.toLowerCase(),t.ignoreUnknown=!0===t.ignoreUnknown,t.respectType=!1!==t.respectType,t.respectFunctionNames=!1!==t.respectFunctionNames,t.respectFunctionProperties=!1!==t.respectFunctionProperties,t.unorderedArrays=!0===t.unorderedArrays,t.unorderedSets=!1!==t.unorderedSets,t.unorderedObjects=!1!==t.unorderedObjects,t.replacer=t.replacer||void 0,t.excludeKeys=t.excludeKeys||void 0,void 0===e)throw new Error("Object argument required.");for(var n=0;n<g.length;++n)g[n].toLowerCase()===t.algorithm.toLowerCase()&&(t.algorithm=g[n]);if(-1===g.indexOf(t.algorithm))throw new Error('Algorithm "'+t.algorithm+'"  not supported. supported values: '+g.join(", "));if(-1===b.indexOf(t.encoding)&&"passthrough"!==t.algorithm)throw new Error('Encoding "'+t.encoding+'"  not supported. supported values: '+b.join(", "));return t}function p(e){return"function"==typeof e&&null!=/^function\s+\w*\s*\(\s*\)\s*{\s+\[native code\]\s+}$/i.exec(Function.prototype.toString.call(e))}function v(e,t,n){n=n||[];var r=function(e){return t.update?t.update(e,"utf8"):t.write(e,"utf8")};return{dispatch:function(t){e.replacer&&(t=e.replacer(t));var n=typeof t;return null===t&&(n="null"),this["_"+n](t)},_object:function(t){var i=Object.prototype.toString.call(t),a=/\[object (.*)\]/i.exec(i);a=(a=a?a[1]:"unknown:["+i+"]").toLowerCase();var s=null;if((s=n.indexOf(t))>=0)return this.dispatch("[CIRCULAR:"+s+"]");if(n.push(t),void 0!==o&&o.isBuffer&&o.isBuffer(t))return r("buffer:"),r(t);if("object"===a||"function"===a){var u=Object.keys(t);e.unorderedObjects&&(u=u.sort()),!1===e.respectType||p(t)||u.splice(0,0,"prototype","__proto__","constructor"),e.excludeKeys&&(u=u.filter(function(t){return!e.excludeKeys(t)})),r("object:"+u.length+":");var c=this;return u.forEach(function(n){c.dispatch(n),r(":"),e.excludeValues||c.dispatch(t[n]),r(",")})}if(!this["_"+a]){if(e.ignoreUnknown)return r("["+a+"]");throw new Error('Unknown object type "'+a+'"')}this["_"+a](t)},_array:function(t,i){i=void 0!==i?i:!1!==e.unorderedArrays;var o=this;if(r("array:"+t.length+":"),!i||t.length<=1)return t.forEach(function(e){return o.dispatch(e)});var a=[],s=t.map(function(t){var r=new m,i=n.slice(),o=v(e,r,i);return o.dispatch(t),a=a.concat(i.slice(n.length)),r.read().toString()});return n=n.concat(a),s.sort(),this._array(s,!1)},_date:function(e){return r("date:"+e.toJSON())},_symbol:function(e){return r("symbol:"+e.toString())},_error:function(e){return r("error:"+e.toString())},_boolean:function(e){return r("bool:"+e.toString())},_string:function(e){r("string:"+e.length+":"),r(e)},_function:function(t){r("fn:"),p(t)?this.dispatch("[native]"):this.dispatch(t.toString()),!1!==e.respectFunctionNames&&this.dispatch("function-name:"+String(t.name)),e.respectFunctionProperties&&this._object(t)},_number:function(e){return r("number:"+e.toString())},_xml:function(e){return r("xml:"+e.toString())},_null:function(){return r("Null")},_undefined:function(){return r("Undefined")},_regexp:function(e){return r("regex:"+e.toString())},_uint8array:function(e){return r("uint8array:"),this.dispatch(Array.prototype.slice.call(e))},_uint8clampedarray:function(e){return r("uint8clampedarray:"),this.dispatch(Array.prototype.slice.call(e))},_int8array:function(e){return r("uint8array:"),this.dispatch(Array.prototype.slice.call(e))},_uint16array:function(e){return r("uint16array:"),this.dispatch(Array.prototype.slice.call(e))},_int16array:function(e){return r("uint16array:"),this.dispatch(Array.prototype.slice.call(e))},_uint32array:function(e){return r("uint32array:"),this.dispatch(Array.prototype.slice.call(e))},_int32array:function(e){return r("uint32array:"),this.dispatch(Array.prototype.slice.call(e))},_float32array:function(e){return r("float32array:"),this.dispatch(Array.prototype.slice.call(e))},_float64array:function(e){return r("float64array:"),this.dispatch(Array.prototype.slice.call(e))},_arraybuffer:function(e){return r("arraybuffer:"),this.dispatch(new Uint8Array(e))},_url:function(e){return r("url:"+e.toString())},_map:function(t){r("map:");var n=Array.from(t);return this._array(n,!1!==e.unorderedSets)},_set:function(t){r("set:");var n=Array.from(t);return this._array(n,!1!==e.unorderedSets)},_blob:function(){if(e.ignoreUnknown)return r("[blob]");throw Error('Hashing Blob objects is currently not supported\n(see https://github.com/puleos/object-hash/issues/26)\nUse "options.replacer" or "options.ignoreUnknown"\n')},_domwindow:function(){return r("domwindow")},_process:function(){return r("process")},_timer:function(){return r("timer")},_pipe:function(){return r("pipe")},_tcp:function(){return r("tcp")},_udp:function(){return r("udp")},_tty:function(){return r("tty")},_statwatcher:function(){return r("statwatcher")},_securecontext:function(){return r("securecontext")},_connection:function(){return r("connection")},_zlib:function(){return r("zlib")},_context:function(){return r("context")},_nodescript:function(){return r("nodescript")},_httpparser:function(){return r("httpparser")},_dataview:function(){return r("dataview")},_signal:function(){return r("signal")},_fsevent:function(){return r("fsevent")},_tlswrap:function(){return r("tlswrap")}}}function m(){return{buf:"",write:function(e){this.buf+=e},end:function(e){this.buf+=e},read:function(){return this.buf}}}var y=e("crypto");(n=t.exports=h).sha1=function(e){return h(e)},n.keys=function(e){return h(e,{excludeValues:!0,algorithm:"sha1",encoding:"hex"})},n.MD5=function(e){return h(e,{algorithm:"md5",encoding:"hex"})},n.keysMD5=function(e){return h(e,{algorithm:"md5",encoding:"hex",excludeValues:!0})};var g=y.getHashes?y.getHashes().slice():["sha1","md5"];g.push("passthrough");var b=["buffer","hex","binary","base64"];n.writeToStream=function(e,t,n){return void 0===n&&(n=t,t={}),v(t=d(e,t),n).dispatch(e)}}).call(this,e("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/fake_5f1a2fc7.js","/")},{buffer:3,crypto:5,lYpoI2:10}],2:[function(e,t,n){(function(e,t,r,i,o,a,s,u,c){var l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";!function(e){"use strict";function t(e){var t=e.charCodeAt(0);return t===r||t===u?62:t===i||t===c?63:t<o?-1:t<o+10?t-o+26+26:t<s+26?t-s:t<a+26?t-a+26:void 0}var n="undefined"!=typeof Uint8Array?Uint8Array:Array,r="+".charCodeAt(0),i="/".charCodeAt(0),o="0".charCodeAt(0),a="a".charCodeAt(0),s="A".charCodeAt(0),u="-".charCodeAt(0),c="_".charCodeAt(0);e.toByteArray=function(e){function r(e){c[f++]=e}var i,o,a,s,u,c;if(e.length%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var l=e.length;u="="===e.charAt(l-2)?2:"="===e.charAt(l-1)?1:0,c=new n(3*e.length/4-u),a=u>0?e.length-4:e.length;var f=0;for(i=0,o=0;i<a;i+=4,o+=3)r((16711680&(s=t(e.charAt(i))<<18|t(e.charAt(i+1))<<12|t(e.charAt(i+2))<<6|t(e.charAt(i+3))))>>16),r((65280&s)>>8),r(255&s);return 2===u?r(255&(s=t(e.charAt(i))<<2|t(e.charAt(i+1))>>4)):1===u&&(r((s=t(e.charAt(i))<<10|t(e.charAt(i+1))<<4|t(e.charAt(i+2))>>2)>>8&255),r(255&s)),c},e.fromByteArray=function(e){function t(e){return l.charAt(e)}function n(e){return t(e>>18&63)+t(e>>12&63)+t(e>>6&63)+t(63&e)}var r,i,o,a=e.length%3,s="";for(r=0,o=e.length-a;r<o;r+=3)i=(e[r]<<16)+(e[r+1]<<8)+e[r+2],s+=n(i);switch(a){case 1:i=e[e.length-1],s+=t(i>>2),s+=t(i<<4&63),s+="==";break;case 2:i=(e[e.length-2]<<8)+e[e.length-1],s+=t(i>>10),s+=t(i>>4&63),s+=t(i<<2&63),s+="="}return s}}(void 0===n?this.base64js={}:n)}).call(this,e("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/base64-js/lib/b64.js","/node_modules/gulp-browserify/node_modules/base64-js/lib")},{buffer:3,lYpoI2:10}],3:[function(e,t,n){(function(t,r,i,o,a,s,u,c,l){function i(e,t,n){if(!(this instanceof i))return new i(e,t,n);var r,o,a,s=typeof e;if("base64"===t&&"string"===s)for(e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e);e.length%4!=0;)e+="=";if("number"===s)r=O(e);else if("string"===s)r=i.byteLength(e,t);else{if("object"!==s)throw new Error("First argument needs to be a number, array or string.");r=O(e.length)}if(i._useTypedArrays?o=i._augment(new Uint8Array(r)):((o=this).length=r,o._isBuffer=!0),i._useTypedArrays&&"number"==typeof e.byteLength)o._set(e);else if(function(e){return P(e)||i.isBuffer(e)||e&&"object"==typeof e&&"number"==typeof e.length}(e))for(a=0;a<r;a++)i.isBuffer(e)?o[a]=e.readUInt8(a):o[a]=e[a];else if("string"===s)o.write(e,0,t);else if("number"===s&&!i._useTypedArrays&&!n)for(a=0;a<r;a++)o[a]=0;return o}function f(e,t,n,r){n=Number(n)||0;var o=e.length-n;r?(r=Number(r))>o&&(r=o):r=o;var a=t.length;U(a%2==0,"Invalid hex string"),r>a/2&&(r=a/2);for(var s=0;s<r;s++){var u=parseInt(t.substr(2*s,2),16);U(!isNaN(u),"Invalid hex string"),e[n+s]=u}return i._charsWritten=2*s,s}function h(e,t,n,r){var o=i._charsWritten=j(L(t),e,n,r);return o}function d(e,t,n,r){var o=i._charsWritten=j(function(e){for(var t=[],n=0;n<e.length;n++)t.push(255&e.charCodeAt(n));return t}(t),e,n,r);return o}function p(e,t,n,r){var o=i._charsWritten=j(M(t),e,n,r);return o}function v(e,t,n,r){var o=i._charsWritten=j(function(e){for(var t,n,r,i=[],o=0;o<e.length;o++)t=e.charCodeAt(o),n=t>>8,r=t%256,i.push(r),i.push(n);return i}(t),e,n,r);return o}function m(e,t,n){var r="";n=Math.min(e.length,n);for(var i=t;i<n;i++)r+=String.fromCharCode(e[i]);return r}function y(e,t,n,r){r||(U("boolean"==typeof n,"missing or invalid endian"),U(void 0!==t&&null!==t,"missing offset"),U(t+1<e.length,"Trying to read beyond buffer length"));var i,o=e.length;if(!(t>=o))return n?(i=e[t],t+1<o&&(i|=e[t+1]<<8)):(i=e[t]<<8,t+1<o&&(i|=e[t+1])),i}function g(e,t,n,r){r||(U("boolean"==typeof n,"missing or invalid endian"),U(void 0!==t&&null!==t,"missing offset"),U(t+3<e.length,"Trying to read beyond buffer length"));var i,o=e.length;if(!(t>=o))return n?(t+2<o&&(i=e[t+2]<<16),t+1<o&&(i|=e[t+1]<<8),i|=e[t],t+3<o&&(i+=e[t+3]<<24>>>0)):(t+1<o&&(i=e[t+1]<<16),t+2<o&&(i|=e[t+2]<<8),t+3<o&&(i|=e[t+3]),i+=e[t]<<24>>>0),i}function b(e,t,n,r){r||(U("boolean"==typeof n,"missing or invalid endian"),U(void 0!==t&&null!==t,"missing offset"),U(t+1<e.length,"Trying to read beyond buffer length"));var i=e.length;if(!(t>=i)){var o=y(e,t,n,!0),a=32768&o;return a?-1*(65535-o+1):o}}function w(e,t,n,r){r||(U("boolean"==typeof n,"missing or invalid endian"),U(void 0!==t&&null!==t,"missing offset"),U(t+3<e.length,"Trying to read beyond buffer length"));var i=e.length;if(!(t>=i)){var o=g(e,t,n,!0),a=2147483648&o;return a?-1*(4294967295-o+1):o}}function _(e,t,n,r){return r||(U("boolean"==typeof n,"missing or invalid endian"),U(t+3<e.length,"Trying to read beyond buffer length")),$.read(e,t,n,23,4)}function k(e,t,n,r){return r||(U("boolean"==typeof n,"missing or invalid endian"),U(t+7<e.length,"Trying to read beyond buffer length")),$.read(e,t,n,52,8)}function x(e,t,n,r,i){i||(U(void 0!==t&&null!==t,"missing value"),U("boolean"==typeof r,"missing or invalid endian"),U(void 0!==n&&null!==n,"missing offset"),U(n+1<e.length,"trying to write beyond buffer length"),R(t,65535));var o=e.length;if(!(n>=o))for(var a=0,s=Math.min(o-n,2);a<s;a++)e[n+a]=(t&255<<8*(r?a:1-a))>>>8*(r?a:1-a)}function E(e,t,n,r,i){i||(U(void 0!==t&&null!==t,"missing value"),U("boolean"==typeof r,"missing or invalid endian"),U(void 0!==n&&null!==n,"missing offset"),U(n+3<e.length,"trying to write beyond buffer length"),R(t,4294967295));var o=e.length;if(!(n>=o))for(var a=0,s=Math.min(o-n,4);a<s;a++)e[n+a]=t>>>8*(r?a:3-a)&255}function T(e,t,n,r,i){i||(U(void 0!==t&&null!==t,"missing value"),U("boolean"==typeof r,"missing or invalid endian"),U(void 0!==n&&null!==n,"missing offset"),U(n+1<e.length,"Trying to write beyond buffer length"),F(t,32767,-32768));var o=e.length;n>=o||x(e,t>=0?t:65535+t+1,n,r,i)}function A(e,t,n,r,i){i||(U(void 0!==t&&null!==t,"missing value"),U("boolean"==typeof r,"missing or invalid endian"),U(void 0!==n&&null!==n,"missing offset"),U(n+3<e.length,"Trying to write beyond buffer length"),F(t,2147483647,-2147483648));var o=e.length;n>=o||E(e,t>=0?t:4294967295+t+1,n,r,i)}function S(e,t,n,r,i){i||(U(void 0!==t&&null!==t,"missing value"),U("boolean"==typeof r,"missing or invalid endian"),U(void 0!==n&&null!==n,"missing offset"),U(n+3<e.length,"Trying to write beyond buffer length"),B(t,3.4028234663852886e38,-3.4028234663852886e38));var o=e.length;n>=o||$.write(e,t,n,r,23,4)}function C(e,t,n,r,i){i||(U(void 0!==t&&null!==t,"missing value"),U("boolean"==typeof r,"missing or invalid endian"),U(void 0!==n&&null!==n,"missing offset"),U(n+7<e.length,"Trying to write beyond buffer length"),B(t,1.7976931348623157e308,-1.7976931348623157e308));var o=e.length;n>=o||$.write(e,t,n,r,52,8)}function I(e,t,n){return"number"!=typeof e?n:(e=~~e)>=t?t:e>=0?e:(e+=t)>=0?e:0}function O(e){return(e=~~Math.ceil(+e))<0?0:e}function P(e){return(Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)})(e)}function D(e){return e<16?"0"+e.toString(16):e.toString(16)}function L(e){for(var t=[],n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<=127)t.push(e.charCodeAt(n));else{var i=n;r>=55296&&r<=57343&&n++;for(var o=encodeURIComponent(e.slice(i,n+1)).substr(1).split("%"),a=0;a<o.length;a++)t.push(parseInt(o[a],16))}}return t}function M(e){return z.toByteArray(e)}function j(e,t,n,r){for(var i=0;i<r&&!(i+n>=t.length||i>=e.length);i++)t[i+n]=e[i];return i}function N(e){try{return decodeURIComponent(e)}catch(e){return String.fromCharCode(65533)}}function R(e,t){U("number"==typeof e,"cannot write a non-number as a number"),U(e>=0,"specified a negative value for writing an unsigned value"),U(e<=t,"value is larger than maximum value for type"),U(Math.floor(e)===e,"value has a fractional component")}function F(e,t,n){U("number"==typeof e,"cannot write a non-number as a number"),U(e<=t,"value larger than maximum allowed value"),U(e>=n,"value smaller than minimum allowed value"),U(Math.floor(e)===e,"value has a fractional component")}function B(e,t,n){U("number"==typeof e,"cannot write a non-number as a number"),U(e<=t,"value larger than maximum allowed value"),U(e>=n,"value smaller than minimum allowed value")}function U(e,t){if(!e)throw new Error(t||"Failed assertion")}var z=e("base64-js"),$=e("ieee754");n.Buffer=i,n.SlowBuffer=i,n.INSPECT_MAX_BYTES=50,i.poolSize=8192,i._useTypedArrays=function(){try{var e=new ArrayBuffer(0),t=new Uint8Array(e);return t.foo=function(){return 42},42===t.foo()&&"function"==typeof t.subarray}catch(e){return!1}}(),i.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"raw":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},i.isBuffer=function(e){return!(null===e||void 0===e||!e._isBuffer)},i.byteLength=function(e,t){var n;switch(e+="",t||"utf8"){case"hex":n=e.length/2;break;case"utf8":case"utf-8":n=L(e).length;break;case"ascii":case"binary":case"raw":n=e.length;break;case"base64":n=M(e).length;break;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":n=2*e.length;break;default:throw new Error("Unknown encoding")}return n},i.concat=function(e,t){if(U(P(e),"Usage: Buffer.concat(list, [totalLength])\nlist should be an Array."),0===e.length)return new i(0);if(1===e.length)return e[0];var n;if("number"!=typeof t)for(t=0,n=0;n<e.length;n++)t+=e[n].length;var r=new i(t),o=0;for(n=0;n<e.length;n++){var a=e[n];a.copy(r,o),o+=a.length}return r},i.prototype.write=function(e,t,n,r){if(isFinite(t))isFinite(n)||(r=n,n=void 0);else{var i=r;r=t,t=n,n=i}t=Number(t)||0;var o,a=this.length-t;switch(n?(n=Number(n))>a&&(n=a):n=a,r=String(r||"utf8").toLowerCase()){case"hex":o=f(this,e,t,n);break;case"utf8":case"utf-8":o=h(this,e,t,n);break;case"ascii":o=d(this,e,t,n);break;case"binary":o=function(e,t,n,r){return d(e,t,n,r)}(this,e,t,n);break;case"base64":o=p(this,e,t,n);break;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":o=v(this,e,t,n);break;default:throw new Error("Unknown encoding")}return o},i.prototype.toString=function(e,t,n){var r,i=this;if(e=String(e||"utf8").toLowerCase(),t=Number(t)||0,(n=void 0!==n?Number(n):n=i.length)===t)return"";switch(e){case"hex":r=function(e,t,n){var r=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>r)&&(n=r);for(var i="",o=t;o<n;o++)i+=D(e[o]);return i}(i,t,n);break;case"utf8":case"utf-8":r=function(e,t,n){var r="",i="";n=Math.min(e.length,n);for(var o=t;o<n;o++)e[o]<=127?(r+=N(i)+String.fromCharCode(e[o]),i=""):i+="%"+e[o].toString(16);return r+N(i)}(i,t,n);break;case"ascii":r=m(i,t,n);break;case"binary":r=function(e,t,n){return m(e,t,n)}(i,t,n);break;case"base64":r=function(e,t,n){return 0===t&&n===e.length?z.fromByteArray(e):z.fromByteArray(e.slice(t,n))}(i,t,n);break;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":r=function(e,t,n){for(var r=e.slice(t,n),i="",o=0;o<r.length;o+=2)i+=String.fromCharCode(r[o]+256*r[o+1]);return i}(i,t,n);break;default:throw new Error("Unknown encoding")}return r},i.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}},i.prototype.copy=function(e,t,n,r){var o=this;if(n||(n=0),r||0===r||(r=this.length),t||(t=0),r!==n&&0!==e.length&&0!==o.length){U(r>=n,"sourceEnd < sourceStart"),U(t>=0&&t<e.length,"targetStart out of bounds"),U(n>=0&&n<o.length,"sourceStart out of bounds"),U(r>=0&&r<=o.length,"sourceEnd out of bounds"),r>this.length&&(r=this.length),e.length-t<r-n&&(r=e.length-t+n);var a=r-n;if(a<100||!i._useTypedArrays)for(var s=0;s<a;s++)e[s+t]=this[s+n];else e._set(this.subarray(n,n+a),t)}},i.prototype.slice=function(e,t){var n=this.length;if(e=I(e,n,0),t=I(t,n,n),i._useTypedArrays)return i._augment(this.subarray(e,t));for(var r=t-e,o=new i(r,void 0,!0),a=0;a<r;a++)o[a]=this[a+e];return o},i.prototype.get=function(e){return console.log(".get() is deprecated. Access using array indexes instead."),this.readUInt8(e)},i.prototype.set=function(e,t){return console.log(".set() is deprecated. Access using array indexes instead."),this.writeUInt8(e,t)},i.prototype.readUInt8=function(e,t){if(t||(U(void 0!==e&&null!==e,"missing offset"),U(e<this.length,"Trying to read beyond buffer length")),!(e>=this.length))return this[e]},i.prototype.readUInt16LE=function(e,t){return y(this,e,!0,t)},i.prototype.readUInt16BE=function(e,t){return y(this,e,!1,t)},i.prototype.readUInt32LE=function(e,t){return g(this,e,!0,t)},i.prototype.readUInt32BE=function(e,t){return g(this,e,!1,t)},i.prototype.readInt8=function(e,t){if(t||(U(void 0!==e&&null!==e,"missing offset"),U(e<this.length,"Trying to read beyond buffer length")),!(e>=this.length)){var n=128&this[e];return n?-1*(255-this[e]+1):this[e]}},i.prototype.readInt16LE=function(e,t){return b(this,e,!0,t)},i.prototype.readInt16BE=function(e,t){return b(this,e,!1,t)},i.prototype.readInt32LE=function(e,t){return w(this,e,!0,t)},i.prototype.readInt32BE=function(e,t){return w(this,e,!1,t)},i.prototype.readFloatLE=function(e,t){return _(this,e,!0,t)},i.prototype.readFloatBE=function(e,t){return _(this,e,!1,t)},i.prototype.readDoubleLE=function(e,t){return k(this,e,!0,t)},i.prototype.readDoubleBE=function(e,t){return k(this,e,!1,t)},i.prototype.writeUInt8=function(e,t,n){n||(U(void 0!==e&&null!==e,"missing value"),U(void 0!==t&&null!==t,"missing offset"),U(t<this.length,"trying to write beyond buffer length"),R(e,255)),t>=this.length||(this[t]=e)},i.prototype.writeUInt16LE=function(e,t,n){x(this,e,t,!0,n)},i.prototype.writeUInt16BE=function(e,t,n){x(this,e,t,!1,n)},i.prototype.writeUInt32LE=function(e,t,n){E(this,e,t,!0,n)},i.prototype.writeUInt32BE=function(e,t,n){E(this,e,t,!1,n)},i.prototype.writeInt8=function(e,t,n){n||(U(void 0!==e&&null!==e,"missing value"),U(void 0!==t&&null!==t,"missing offset"),U(t<this.length,"Trying to write beyond buffer length"),F(e,127,-128)),t>=this.length||(e>=0?this.writeUInt8(e,t,n):this.writeUInt8(255+e+1,t,n))},i.prototype.writeInt16LE=function(e,t,n){T(this,e,t,!0,n)},i.prototype.writeInt16BE=function(e,t,n){T(this,e,t,!1,n)},i.prototype.writeInt32LE=function(e,t,n){A(this,e,t,!0,n)},i.prototype.writeInt32BE=function(e,t,n){A(this,e,t,!1,n)},i.prototype.writeFloatLE=function(e,t,n){S(this,e,t,!0,n)},i.prototype.writeFloatBE=function(e,t,n){S(this,e,t,!1,n)},i.prototype.writeDoubleLE=function(e,t,n){C(this,e,t,!0,n)},i.prototype.writeDoubleBE=function(e,t,n){C(this,e,t,!1,n)},i.prototype.fill=function(e,t,n){if(e||(e=0),t||(t=0),n||(n=this.length),"string"==typeof e&&(e=e.charCodeAt(0)),U("number"==typeof e&&!isNaN(e),"value is not a number"),U(n>=t,"end < start"),n!==t&&0!==this.length){U(t>=0&&t<this.length,"start out of bounds"),U(n>=0&&n<=this.length,"end out of bounds");for(var r=t;r<n;r++)this[r]=e}},i.prototype.inspect=function(){for(var e=[],t=this.length,r=0;r<t;r++)if(e[r]=D(this[r]),r===n.INSPECT_MAX_BYTES){e[r+1]="...";break}return"<Buffer "+e.join(" ")+">"},i.prototype.toArrayBuffer=function(){if("undefined"!=typeof Uint8Array){if(i._useTypedArrays)return new i(this).buffer;for(var e=new Uint8Array(this.length),t=0,n=e.length;t<n;t+=1)e[t]=this[t];return e.buffer}throw new Error("Buffer.toArrayBuffer not supported in this browser")};var V=i.prototype;i._augment=function(e){return e._isBuffer=!0,e._get=e.get,e._set=e.set,e.get=V.get,e.set=V.set,e.write=V.write,e.toString=V.toString,e.toLocaleString=V.toString,e.toJSON=V.toJSON,e.copy=V.copy,e.slice=V.slice,e.readUInt8=V.readUInt8,e.readUInt16LE=V.readUInt16LE,e.readUInt16BE=V.readUInt16BE,e.readUInt32LE=V.readUInt32LE,e.readUInt32BE=V.readUInt32BE,e.readInt8=V.readInt8,e.readInt16LE=V.readInt16LE,e.readInt16BE=V.readInt16BE,e.readInt32LE=V.readInt32LE,e.readInt32BE=V.readInt32BE,e.readFloatLE=V.readFloatLE,e.readFloatBE=V.readFloatBE,e.readDoubleLE=V.readDoubleLE,e.readDoubleBE=V.readDoubleBE,e.writeUInt8=V.writeUInt8,e.writeUInt16LE=V.writeUInt16LE,e.writeUInt16BE=V.writeUInt16BE,e.writeUInt32LE=V.writeUInt32LE,e.writeUInt32BE=V.writeUInt32BE,e.writeInt8=V.writeInt8,e.writeInt16LE=V.writeInt16LE,e.writeInt16BE=V.writeInt16BE,e.writeInt32LE=V.writeInt32LE,e.writeInt32BE=V.writeInt32BE,e.writeFloatLE=V.writeFloatLE,e.writeFloatBE=V.writeFloatBE,e.writeDoubleLE=V.writeDoubleLE,e.writeDoubleBE=V.writeDoubleBE,e.fill=V.fill,e.inspect=V.inspect,e.toArrayBuffer=V.toArrayBuffer,e}}).call(this,e("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/buffer/index.js","/node_modules/gulp-browserify/node_modules/buffer")},{"base64-js":2,buffer:3,ieee754:11,lYpoI2:10}],4:[function(e,t,n){(function(n,r,i,o,a,s,u,c,l){var i=e("buffer").Buffer,f=4,h=new i(f);h.fill(0);var d=8;t.exports={hash:function(e,t,n,r){return i.isBuffer(e)||(e=new i(e)),function(e,t,n){for(var r=new i(t),o=n?r.writeInt32BE:r.writeInt32LE,a=0;a<e.length;a++)o.call(r,e[a],4*a,!0);return r}(t(function(e,t){if(e.length%f!=0){var n=e.length+(f-e.length%f);e=i.concat([e,h],n)}for(var r=[],o=t?e.readInt32BE:e.readInt32LE,a=0;a<e.length;a+=f)r.push(o.call(e,a));return r}(e,r),e.length*d),n,r)}}}).call(this,e("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/helpers.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{buffer:3,lYpoI2:10}],5:[function(e,t,n){(function(t,r,i,o,a,s,u,c,l){function f(e,t){var n=y[e=e||"sha1"],r=[];return n||h("algorithm:",e,"is not yet supported"),{update:function(e){return i.isBuffer(e)||(e=new i(e)),r.push(e),e.length,this},digest:function(e){var o=i.concat(r),a=t?function(e,t,n){i.isBuffer(t)||(t=new i(t)),i.isBuffer(n)||(n=new i(n)),t.length>g?t=e(t):t.length<g&&(t=i.concat([t,b],g));for(var r=new i(g),o=new i(g),a=0;a<g;a++)r[a]=54^t[a],o[a]=92^t[a];var s=e(i.concat([r,n]));return e(i.concat([o,s]))}(n,t,o):n(o);return r=null,e?a.toString(e):a}}}function h(){var e=[].slice.call(arguments).join(" ");throw new Error([e,"we accept pull requests","http://github.com/dominictarr/crypto-browserify"].join("\n"))}var i=e("buffer").Buffer,d=e("./sha"),p=e("./sha256"),v=e("./rng"),m=e("./md5"),y={sha1:d,sha256:p,md5:m},g=64,b=new i(g);b.fill(0),n.createHash=function(e){return f(e)},n.createHmac=function(e,t){return f(e,t)},n.randomBytes=function(e,t){if(!t||!t.call)return new i(v(e));try{t.call(this,void 0,new i(v(e)))}catch(e){t(e)}},function(e,t){for(var n in e)t(e[n],n)}(["createCredentials","createCipher","createCipheriv","createDecipher","createDecipheriv","createSign","createVerify","createDiffieHellman","pbkdf2"],function(e){n[e]=function(){h("sorry,",e,"is not implemented yet")}})}).call(this,e("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/index.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./md5":6,"./rng":7,"./sha":8,"./sha256":9,buffer:3,lYpoI2:10}],6:[function(e,t,n){(function(n,r,i,o,a,s,u,c,l){function f(e,t){e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;for(var n=1732584193,r=-271733879,i=-1732584194,o=271733878,a=0;a<e.length;a+=16){var s=n,u=r,c=i,l=o;n=d(n,r,i,o,e[a+0],7,-680876936),o=d(o,n,r,i,e[a+1],12,-389564586),i=d(i,o,n,r,e[a+2],17,606105819),r=d(r,i,o,n,e[a+3],22,-1044525330),n=d(n,r,i,o,e[a+4],7,-176418897),o=d(o,n,r,i,e[a+5],12,1200080426),i=d(i,o,n,r,e[a+6],17,-1473231341),r=d(r,i,o,n,e[a+7],22,-45705983),n=d(n,r,i,o,e[a+8],7,1770035416),o=d(o,n,r,i,e[a+9],12,-1958414417),i=d(i,o,n,r,e[a+10],17,-42063),r=d(r,i,o,n,e[a+11],22,-1990404162),n=d(n,r,i,o,e[a+12],7,1804603682),o=d(o,n,r,i,e[a+13],12,-40341101),i=d(i,o,n,r,e[a+14],17,-1502002290),r=d(r,i,o,n,e[a+15],22,1236535329),n=p(n,r,i,o,e[a+1],5,-165796510),o=p(o,n,r,i,e[a+6],9,-1069501632),i=p(i,o,n,r,e[a+11],14,643717713),r=p(r,i,o,n,e[a+0],20,-373897302),n=p(n,r,i,o,e[a+5],5,-701558691),o=p(o,n,r,i,e[a+10],9,38016083),i=p(i,o,n,r,e[a+15],14,-660478335),r=p(r,i,o,n,e[a+4],20,-405537848),n=p(n,r,i,o,e[a+9],5,568446438),o=p(o,n,r,i,e[a+14],9,-1019803690),i=p(i,o,n,r,e[a+3],14,-187363961),r=p(r,i,o,n,e[a+8],20,1163531501),n=p(n,r,i,o,e[a+13],5,-1444681467),o=p(o,n,r,i,e[a+2],9,-51403784),i=p(i,o,n,r,e[a+7],14,1735328473),r=p(r,i,o,n,e[a+12],20,-1926607734),n=v(n,r,i,o,e[a+5],4,-378558),o=v(o,n,r,i,e[a+8],11,-2022574463),i=v(i,o,n,r,e[a+11],16,1839030562),r=v(r,i,o,n,e[a+14],23,-35309556),n=v(n,r,i,o,e[a+1],4,-1530992060),o=v(o,n,r,i,e[a+4],11,1272893353),i=v(i,o,n,r,e[a+7],16,-155497632),r=v(r,i,o,n,e[a+10],23,-1094730640),n=v(n,r,i,o,e[a+13],4,681279174),o=v(o,n,r,i,e[a+0],11,-358537222),i=v(i,o,n,r,e[a+3],16,-722521979),r=v(r,i,o,n,e[a+6],23,76029189),n=v(n,r,i,o,e[a+9],4,-640364487),o=v(o,n,r,i,e[a+12],11,-421815835),i=v(i,o,n,r,e[a+15],16,530742520),r=v(r,i,o,n,e[a+2],23,-995338651),n=m(n,r,i,o,e[a+0],6,-198630844),o=m(o,n,r,i,e[a+7],10,1126891415),i=m(i,o,n,r,e[a+14],15,-1416354905),r=m(r,i,o,n,e[a+5],21,-57434055),n=m(n,r,i,o,e[a+12],6,1700485571),o=m(o,n,r,i,e[a+3],10,-1894986606),i=m(i,o,n,r,e[a+10],15,-1051523),r=m(r,i,o,n,e[a+1],21,-2054922799),n=m(n,r,i,o,e[a+8],6,1873313359),o=m(o,n,r,i,e[a+15],10,-30611744),i=m(i,o,n,r,e[a+6],15,-1560198380),r=m(r,i,o,n,e[a+13],21,1309151649),n=m(n,r,i,o,e[a+4],6,-145523070),o=m(o,n,r,i,e[a+11],10,-1120210379),i=m(i,o,n,r,e[a+2],15,718787259),r=m(r,i,o,n,e[a+9],21,-343485551),n=y(n,s),r=y(r,u),i=y(i,c),o=y(o,l)}return Array(n,r,i,o)}function h(e,t,n,r,i,o){return y(function(e,t){return e<<t|e>>>32-t}(y(y(t,e),y(r,o)),i),n)}function d(e,t,n,r,i,o,a){return h(t&n|~t&r,e,t,i,o,a)}function p(e,t,n,r,i,o,a){return h(t&r|n&~r,e,t,i,o,a)}function v(e,t,n,r,i,o,a){return h(t^n^r,e,t,i,o,a)}function m(e,t,n,r,i,o,a){return h(n^(t|~r),e,t,i,o,a)}function y(e,t){var n=(65535&e)+(65535&t),r=(e>>16)+(t>>16)+(n>>16);return r<<16|65535&n}var g=e("./helpers");t.exports=function(e){return g.hash(e,f,16)}}).call(this,e("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/md5.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:10}],7:[function(e,t,n){(function(e,n,r,i,o,a,s,u,c){!function(){var e,n;e=function(e){for(var t,n=new Array(e),r=0;r<e;r++)0==(3&r)&&(t=4294967296*Math.random()),n[r]=t>>>((3&r)<<3)&255;return n},this.crypto&&crypto.getRandomValues&&(n=function(e){var t=new Uint8Array(e);return crypto.getRandomValues(t),t}),t.exports=n||e}()}).call(this,e("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/rng.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{buffer:3,lYpoI2:10}],8:[function(e,t,n){(function(n,r,i,o,a,s,u,c,l){function f(e,t){e[t>>5]|=128<<24-t%32,e[15+(t+64>>9<<4)]=t;for(var n=Array(80),r=1732584193,i=-271733879,o=-1732584194,a=271733878,s=-1009589776,u=0;u<e.length;u+=16){for(var c=r,l=i,f=o,m=a,y=s,g=0;g<80;g++){n[g]=g<16?e[u+g]:v(n[g-3]^n[g-8]^n[g-14]^n[g-16],1);var b=p(p(v(r,5),h(g,i,o,a)),p(p(s,n[g]),d(g)));s=a,a=o,o=v(i,30),i=r,r=b}r=p(r,c),i=p(i,l),o=p(o,f),a=p(a,m),s=p(s,y)}return Array(r,i,o,a,s)}function h(e,t,n,r){return e<20?t&n|~t&r:e<40?t^n^r:e<60?t&n|t&r|n&r:t^n^r}function d(e){return e<20?1518500249:e<40?1859775393:e<60?-1894007588:-899497514}function p(e,t){var n=(65535&e)+(65535&t),r=(e>>16)+(t>>16)+(n>>16);return r<<16|65535&n}function v(e,t){return e<<t|e>>>32-t}var m=e("./helpers");t.exports=function(e){return m.hash(e,f,20,!0)}}).call(this,e("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:10}],9:[function(e,t,n){(function(n,r,i,o,a,s,u,c,l){var f=e("./helpers"),h=function(e,t){var n=(65535&e)+(65535&t),r=(e>>16)+(t>>16)+(n>>16);return r<<16|65535&n},d=function(e,t){return e>>>t|e<<32-t},p=function(e,t){return e>>>t},v=function(e,t,n){return e&t^~e&n},m=function(e,t,n){return e&t^e&n^t&n},y=function(e){return d(e,2)^d(e,13)^d(e,22)},g=function(e){return d(e,6)^d(e,11)^d(e,25)},b=function(e){return d(e,7)^d(e,18)^p(e,3)},w=function(e){return d(e,17)^d(e,19)^p(e,10)},_=function(e,t){var n,r,i,o,a,s,u,c,l,f,d=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),p=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),_=new Array(64);e[t>>5]|=128<<24-t%32,e[15+(t+64>>9<<4)]=t;for(var k=0;k<e.length;k+=16){n=p[0],r=p[1],i=p[2],o=p[3],a=p[4],s=p[5],u=p[6],c=p[7];for(var x=0;x<64;x++)_[x]=x<16?e[x+k]:h(h(h(w(_[x-2]),_[x-7]),b(_[x-15])),_[x-16]),l=h(h(h(h(c,g(a)),v(a,s,u)),d[x]),_[x]),f=h(y(n),m(n,r,i)),c=u,u=s,s=a,a=h(o,l),o=i,i=r,r=n,n=h(l,f);p[0]=h(n,p[0]),p[1]=h(r,p[1]),p[2]=h(i,p[2]),p[3]=h(o,p[3]),p[4]=h(a,p[4]),p[5]=h(s,p[5]),p[6]=h(u,p[6]),p[7]=h(c,p[7])}return p};t.exports=function(e){return f.hash(e,_,32,!0)}}).call(this,e("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha256.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:10}],10:[function(e,t,n){(function(e,n,r,i,o,a,s,u,c){function l(){}var e=t.exports={};e.nextTick=function(){var e="undefined"!=typeof window&&window.setImmediate,t="undefined"!=typeof window&&window.postMessage&&window.addEventListener;if(e)return function(e){return window.setImmediate(e)};if(t){var n=[];return window.addEventListener("message",function(e){var t=e.source;if((t===window||null===t)&&"process-tick"===e.data&&(e.stopPropagation(),n.length>0)){var r=n.shift();r()}},!0),function(e){n.push(e),window.postMessage("process-tick","*")}}return function(e){setTimeout(e,0)}}(),e.title="browser",e.browser=!0,e.env={},e.argv=[],e.on=l,e.addListener=l,e.once=l,e.off=l,e.removeListener=l,e.removeAllListeners=l,e.emit=l,e.binding=function(e){throw new Error("process.binding is not supported")},e.cwd=function(){return"/"},e.chdir=function(e){throw new Error("process.chdir is not supported")}}).call(this,e("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/process/browser.js","/node_modules/gulp-browserify/node_modules/process")},{buffer:3,lYpoI2:10}],11:[function(e,t,n){(function(e,t,r,i,o,a,s,u,c){n.read=function(e,t,n,r,i){var o,a,s=8*i-r-1,u=(1<<s)-1,c=u>>1,l=-7,f=n?i-1:0,h=n?-1:1,d=e[t+f];for(f+=h,o=d&(1<<-l)-1,d>>=-l,l+=s;l>0;o=256*o+e[t+f],f+=h,l-=8);for(a=o&(1<<-l)-1,o>>=-l,l+=r;l>0;a=256*a+e[t+f],f+=h,l-=8);if(0===o)o=1-c;else{if(o===u)return a?NaN:1/0*(d?-1:1);a+=Math.pow(2,r),o-=c}return(d?-1:1)*a*Math.pow(2,o-r)},n.write=function(e,t,n,r,i,o){var a,s,u,c=8*o-i-1,l=(1<<c)-1,f=l>>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=r?0:o-1,p=r?1:-1,v=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,a=l):(a=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-a))<1&&(a--,u*=2),(t+=a+f>=1?h/u:h*Math.pow(2,1-f))*u>=2&&(a++,u/=2),a+f>=l?(s=0,a=l):a+f>=1?(s=(t*u-1)*Math.pow(2,i),a+=f):(s=t*Math.pow(2,f-1)*Math.pow(2,i),a=0));i>=8;e[n+d]=255&s,d+=p,s/=256,i-=8);for(a=a<<i|s,c+=i;c>0;e[n+d]=255&a,d+=p,a/=256,c-=8);e[n+d-p]|=128*v}}).call(this,e("lYpoI2"),"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/ieee754/index.js","/node_modules/ieee754")},{buffer:3,lYpoI2:10}]},{},[1])(1)},function(e,t,n){var r;r=function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,n),i.loaded=!0,i.exports}return n.m=e,n.c=t,n.p="",n(0)}([function(e,t,n){"use strict";var r=a(n(1)),i=a(n(2)),o=a(n(3));function a(e){return e&&e.__esModule?e:{default:e}}e.exports={DS:r.default,DSUtils:i.default,DSErrors:o.default,createStore:function(e){return new r.default(e)},version:{full:"2.10.1",major:parseInt("2",10),minor:parseInt("10",10),patch:parseInt("1",10),alpha:"false",beta:"false"}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=c(n(2)),a=c(n(3)),s=c(n(41)),u=c(n(47));function c(e){return e&&e.__esModule?e:{default:e}}function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function f(e,t,n){n(null,t)}function h(e,t){return t}var d=function(){function e(){l(this,e)}return i(e,[{key:"errorFn",value:function(e,t){if(this.error&&"function"==typeof this.error){try{throw"string"==typeof e?new Error(e):e}catch(t){e=t}this.error(this.name||null,e||null,t||null)}}}]),e}(),p=d.prototype;p.actions={},p.afterCreate=f,p.afterCreateCollection=h,p.afterCreateInstance=h,p.afterDestroy=f,p.afterEject=h,p.afterFind=f,p.afterFindAll=f,p.afterInject=h,p.afterLoadRelations=f,p.afterReap=h,p.afterUpdate=f,p.afterValidate=f,p.allowSimpleWhere=!0,p.applyDefaultsOnInject=!1,p.basePath="",p.beforeCreate=f,p.beforeCreateCollection=h,p.beforeCreateInstance=h,p.beforeDestroy=f,p.beforeEject=h,p.beforeInject=h,p.beforeReap=h,p.beforeUpdate=f,p.beforeValidate=f,p.bypassCache=!1,p.cacheResponse=!!o.default.w,p.csp=!1,p.clearEmptyQueries=!0,p.computed={},p.defaultAdapter="http",p.debug=!1,p.defaultValues={},p.eagerEject=!1,p.eagerInject=!1,p.endpoint="",p.error=!!console&&function(e,t,n){return console["function"==typeof console.error?"error":"log"](e,t,n)},p.errorHandler=function(){return o.default.Promise.reject(arguments.length<=0?void 0:arguments[0])},p.fallbackAdapters=["http"],p.findStrictCache=!1,p.idAttribute="id",p.ignoredChanges=[/\$/],p.instanceEvents=!!o.default.w,p.keepChangeHistory=!1,p.linkRelations=!!o.default.w,p.log=!!console&&function(e,t,n,r,i){return console["function"==typeof console.info?"info":"log"](e,t,n,r,i)},p.logFn=function(e,t,n,r){this.debug&&this.log&&"function"==typeof this.log&&this.log(this.name||null,e||null,t||null,n||null,r||null)},p.maxAge=!1,p.methods={},p.notify=!!o.default.w,p.omit=[],p.onConflict="merge",p.reapAction=o.default.w?"inject":"none",p.reapInterval=!!o.default.w&&3e4,p.relationsEnumerable=!1,p.resetHistoryOnInject=!0,p.returnMeta=!1,p.scopes={},p.strategy="single",p.upsert=!!o.default.w,p.useClass=!0,p.useFilter=!1,p.usePendingFind=!0,p.usePendingFindAll=!0,p.validate=f,p.watchChanges=!!o.default.w;var v=/([.*+?^=!:${}()|[\]\/\\])/g,m=/%/g,y=/_/g;function g(e,t){return new RegExp("^"+function(e){return e.replace(v,"\\$1")}(e).replace(m,".*").replace(y,".")+"$",t)}p.defaultFilter=function(e,t,n,i){var s=this.definitions[t],u="id",c=void 0;s&&(u=s.idAttribute,c=this.store[t]);var l=e,f=null,h={skip:"",offset:"",where:"",limit:"",orderBy:"",sort:""};n=n||{},i=i||{},f=o.default._o(n.where)?n.where:{},i.allowSimpleWhere&&o.default.forOwn(n,function(e,t){t in h||t in f||(f[t]={"==":e})}),o.default.isEmpty(f)&&(f=null),f?l=o.default.filter(l,function(e){var t=!0,n=!0;return!(i.excludeTemporary&&c&&c.temporaryItems[e[u]])&&(o.default.forOwn(f,function(r,i){o.default._o(r)||(r={"==":r}),o.default.forOwn(r,function(r,a){var s=void 0,u="|"===a[0],c=o.default.get(e,i);"=="===(a=u?a.substr(1):a)?s=c==r:"==="===a?s=c===r:"!="===a?s=c!=r:"!=="===a?s=c!==r:">"===a?s=c>r:">="===a?s=c>=r:"<"===a?s=c<r:"<="===a?s=c<=r:"isectEmpty"===a?s=!o.default.intersection(c||[],r||[]).length:"isectNotEmpty"===a?s=o.default.intersection(c||[],r||[]).length:"in"===a?s=o.default._s(r)?-1!==r.indexOf(c):o.default.contains(r,c):"notIn"===a?s=o.default._s(r)?-1===r.indexOf(c):!o.default.contains(r,c):0===a.indexOf("like")?s=null!==g(r,a.substr(4)).exec(c):0===a.indexOf("notLike")?s=null===g(r,a.substr(7)).exec(c):"contains"===a?s=o.default._s(c)?-1!==c.indexOf(r):o.default.contains(c,r):"notContains"===a&&(s=o.default._s(c)?-1===c.indexOf(r):!o.default.contains(c,r)),void 0!==s&&(n=t?s:u?n||s:n&&s),t=!1})}),n)}):i.excludeTemporary&&c&&(l=o.default.filter(l,function(e){return c.temporaryItems[e[u]]}));var d=null;if(o.default._s(n.orderBy)?d=[[n.orderBy,"ASC"]]:o.default._a(n.orderBy)&&(d=n.orderBy),!d&&o.default._s(n.sort)?d=[[n.sort,"ASC"]]:!d&&o.default._a(n.sort)&&(d=n.sort),d){o.default.forEach(d,function(e,n){if(o.default._s(e))d[n]=[e,"ASC"];else if(!o.default._a(e))throw new a.default.IA('DS.filter("'+t+'"[, params][, options]): '+o.default.toJson(e)+": Must be a string or an array!",{params:{"orderBy[i]":{actual:void 0===e?"undefined":r(e),expected:"string|array"}}})}),l=o.default.sort(l,function(e,t){return function e(t,n,r,i){var a=t[n],s=o.default.get(r,a[0]),u=o.default.get(i,a[0]);return o.default._s(s)&&(s=o.default.upperCase(s)),o.default._s(u)&&(u=o.default.upperCase(u)),"DESC"===a[1]?u<s?-1:u>s?1:n<t.length-1?e(t,n+1,r,i):0:s<u?-1:s>u?1:n<t.length-1?e(t,n+1,r,i):0}(d,0,e,t)})}var p=o.default._n(n.limit)?n.limit:null,v=null;return o.default._n(n.skip)?v=n.skip:o.default._n(n.offset)&&(v=n.offset),p&&v?l=o.default.slice(l,v,Math.min(l.length,v+p)):o.default._n(p)?l=o.default.slice(l,0,Math.min(l.length,p)):o.default._n(v)&&(l=v<l.length?o.default.slice(l,v):[]),l===e?l.slice():l};var b=function(){function e(t){l(this,e);var n=this;t=t||{},n.store={},n.definitions={},n.adapters={},n.defaults=new d,n.observe=o.default.observe,o.default.forOwn(t,function(e,t){"omit"===t?n.defaults.omit=e.concat(d.prototype.omit):n.defaults[t]=e});var r=o.default.Promise;r&&!r.prototype.spread&&(r.prototype.spread=function(e){return this.then(function(t){return e.apply(this,t)})}),o.default.Events(n)}return i(e,[{key:"getAdapterName",value:function(e){var t=!1;if(e=e||{},o.default._s(e)&&(t=!0,e={adapter:e}),this.adapters[e.adapter])return e.adapter;if(t)throw new Error(e.adapter+" is not a registered adapter!");return e.defaultAdapter}},{key:"getAdapter",value:function(e){return e=e||{},this.adapters[this.getAdapterName(e)]}},{key:"registerAdapter",value:function(e,t,n){n=n||{},o.default.isFunction(t)?this.adapters[e]=new t(n):this.adapters[e]=t,n.default&&(this.defaults.defaultAdapter=e)}},{key:"is",value:function(e,t){var n=this.definitions[e];if(!n)throw new a.default.NER(e);return t instanceof n[n.class]}},{key:"clear",value:function(){var e=this,t={};return o.default.forOwn(this.definitions,function(n){var r=n.name;t[r]=n.ejectAll(),e.store[r].completedQueries={},e.store[r].queryData={}}),t}},{key:"errorFn",value:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=t[t.length-1],i=this.defaults.errorHandler,o=r?r.errorHandler:i;return o=o||i,function(e){return o.apply(void 0,[e].concat(t))}}}]),e}(),w=b.prototype;function _(e,t){o.default.forOwn(t,function(t,n){e[n]=t,e[n].before=function(t){var r=e[n];e[n]=function(){for(var e=arguments.length,n=Array(e),i=0;i<e;i++)n[i]=arguments[i];return r.apply(this,t.apply(this,n)||n)}}})}w.getAdapterName.shorthand=!1,w.getAdapter.shorthand=!1,w.registerAdapter.shorthand=!1,w.errors=a.default,w.utils=o.default,_(w,s.default),_(w,u.default),t.default=b},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=n(3),a=(r=o)&&r.__esModule?r:{default:r};var s=n(4),u=n(5),c=n(6),l=n(7),f=n(10),h=n(12),d=n(14),p=n(21),v=n(22),m=n(23),y=n(24),g=n(19),b=n(25),w=n(27),_=n(29),k=n(30),x=void 0,E=void 0,T=void 0,A=Object.prototype.toString;try{E=Promise}catch(e){console.error("js-data requires a global Promise constructor!")}try{T=window.File}catch(e){T=function(){}}var S=Array.isArray||function(e){return"[object Array]"===A.call(e)||!1};function C(e){return"[object RegExp]"===A.call(e)||!1}function I(e){return"string"==typeof e||e&&"object"===(void 0===e?"undefined":i(e))&&"[object String]"===A.call(e)||!1}function O(e){return"[object Object]"===A.call(e)||!1}function P(e){return e&&"object"===(void 0===e?"undefined":i(e))&&"[object Date]"===A.call(e)||!1}function D(e){var t=void 0===e?"undefined":i(e);return"number"===t||e&&"object"===t&&"[object Number]"===A.call(e)||!1}function L(e){return"function"==typeof e||e&&"[object Function]"===A.call(e)||!1}function M(e,t,n){var r=[];return u(e,function(e,n,i){t(e,n,i)&&r.push(e)},n),r}try{x=window,x={}}catch(e){x=null}var j=["beforeValidate","validate","afterValidate","beforeCreate","afterCreate","beforeUpdate","afterUpdate","beforeDestroy","afterDestroy"],N=_.isBlacklisted;function R(e,t,n,r,i){if(t){if(e===t)throw new Error("Cannot copy! Source and destination are identical.");if(n=n||[],r=r||[],O(e)){var o=n.indexOf(e);if(-1!==o)return r[o];n.push(e),r.push(t)}var a=void 0;if(S(e)){var s=void 0;for(t.length=0,s=0;s<e.length;s++)a=R(e[s],null,n,r,i),O(e[s])&&(n.push(e[s]),r.push(a)),t.push(a)}else for(var c in S(t)?t.length=0:u(t,function(e,n){delete t[n]}),e)if(e.hasOwnProperty(c)){if(N(c,i))continue;a=R(e[c],null,n,r,i),O(e[c])&&(n.push(e[c]),r.push(a)),t[c]=a}}else t=e,e&&(S(e)?t=R(e,[],n,r,i):P(e)?t=new Date(e.getTime()):C(e)?(t=new RegExp(e.source,e.toString().match(/[^\/]*$/)[0])).lastIndex=e.lastIndex:O(e)&&(t=R(e,Object.create(Object.getPrototypeOf(e)),n,r,i)));return t}function F(e){return null!=e&&""!==e}t.default={Promise:E,_:function(e,t){var n=this;if(e=e||{},(t=t||{})&&t.constructor===e.constructor)return t;if(!O(t))throw new a.default.IA('"options" must be an object!');u(j,function(e){"function"==typeof t[e]&&-1===t[e].toString().indexOf("for (var _len3 = arg")&&(t[e]=n.promisify(t[e]))});var r=function(e){var t=this;l(e,function(e,n){t[n]=e})};return(r.prototype=e).orig=function(){var e={};return l(this,function(t,n){e[n]=t}),e},new r(t)},_n:D,_s:I,_sn:function(e){return I(e)||D(e)},_snErr:function(e){return new a.default.IA('"'+e+'" must be a string or a number!')},_o:O,_oErr:function(e){return new a.default.IA('"'+e+'" must be an object!')},_a:S,_aErr:function(e){return new a.default.IA('"'+e+'" must be an array!')},applyScope:function(e,t,n){var r=n.scope,i=R(t);r?I(r)&&(r=[r]):r=[],r.unshift("defaultScope"),u(r,function(r){var i=n.scopes[r];"function"==typeof i?h(t,i(e)):i&&h(t,i)}),h(t,i)},compute:function(e,t){var n=this,r=[];O(e)||(u(e.deps,function(e){r.push(b(n,e))}),w(n,t,e[e.length-1].apply(n,r)))},contains:f,copy:R,deepMixIn:h,diffObjectFromOldObject:_.diffObjectFromOldObject,BinaryHeap:s,equals:function e(t,n){if(t===n)return!0;if(null===t||null===n)return!1;if(t!=t&&n!=n)return!0;var r,o,a,s=void 0===t?"undefined":i(t);if(s==(void 0===n?"undefined":i(n))&&"object"==s){if(!S(t)){if(P(t))return!!P(n)&&e(t.getTime(),n.getTime());if(C(t)&&C(n))return t.toString()==n.toString();if(S(n))return!1;for(o in a={},t)if("$"!==o.charAt(0)&&!L(t[o])){if(!e(t[o],n[o]))return!1;a[o]=!0}for(o in n)if(!a.hasOwnProperty(o)&&"$"!==o.charAt(0)&&void 0!==n[o]&&!L(n[o]))return!1;return!0}if(!S(n))return!1;if((r=t.length)===n.length){for(o=0;o<r;o++)if(!e(t[o],n[o]))return!1;return!0}}return!1},Events:function(e){var t={};e=e||this,Object.defineProperties(e,{on:{value:function(e,n,r){t[e]=t[e]||[],t[e].push({f:n,c:r})}},off:{value:function(e,n){var r=t[e];if(r)if(n){for(var i=0;i<r.length;i++)if(r[i].f===n){r.splice(i,1);break}}else r.splice(0,r.length);else t={}}},emit:{value:function(){for(var e=arguments.length,n=Array(e),r=0;r<e;r++)n[r]=arguments[r];var i=t[n.shift()]||[];if(i)for(var o=0;o<i.length;o++)i[o].f.apply(i[o].c,n)}}})},filter:M,fillIn:function(e,t){return l(t,function(t,n){n in e||(e[n]=t)}),e},forEach:u,forOwn:l,fromJson:function(e){return I(e)?JSON.parse(e):e},get:b,guid:k,intersection:function(e,t){if(!e||!t)return[];for(var n=[],r=void 0,i=0,o=e.length;i<o;i++)r=e[i],f(n,r)||f(t,r)&&n.push(r);return n},isArray:S,isBlacklisted:N,isEmpty:function(e){if(null==e)return!0;if("string"==typeof e||S(e))return!e.length;if("object"===(void 0===e?"undefined":i(e))){var t=!0;return l(e,function(){return t=!1,!1}),t}return!0},isFunction:L,isObject:O,isNumber:D,isString:I,keys:m,makePath:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var r;return(r=(r="/")||"",M(t,F).join(r)).replace(/([^:\/]|^)\/{2,}/g,"$1/")},observe:_,omit:function(e,t){var n=[];return l(e,function(e,r){N(r,t)&&n.push(r)}),u(n,function(t){delete e[t]}),e},pascalCase:d,pick:v,promisify:function(e,t){var n=this;if(e){if("function"!=typeof e)throw new Error("Can only promisify functions!");return function(){for(var r=arguments.length,i=Array(r),o=0;o<r;o++)i[o]=arguments[o];return new n.Promise(function(n,r){i.push(function(e,t){e?r(e):n(t)});try{var o=e.apply(t||this,i);o&&o.then&&o.then(n,r)}catch(e){r(e)}})}}},remove:p,set:w,slice:c,sort:y,toJson:JSON.stringify,updateTimestamp:function(e){var t="function"==typeof Date.now?Date.now():(new Date).getTime();return e&&t<=e?e+1:t},upperCase:g,removeCircular:function(e){return function e(t,n){var r=void 0,o=void 0;if(!("object"!==(void 0===t?"undefined":i(t))||null===t||t instanceof Boolean||t instanceof Date||t instanceof Number||t instanceof RegExp||t instanceof String||T&&t instanceof T)){for(var a=n.cur,s=n.ctx;s;){if(s.cur===a)return;s=s.ctx}if(S(t))for(o=[],r=0;r<t.length;r+=1)o[r]=e(t[r],{ctx:n,cur:t[r]});else o={},l(t,function(r,i){o[i]=e(t[i],{ctx:n,cur:t[i]})});return o}return t}(e,{ctx:null,cur:e})},resolveItem:function(e,t){return e&&(I(t)||D(t))&&e.index[t]||t},resolveId:function(e,t){return I(t)||D(t)?t:t&&e&&t[e.idAttribute]||t},respond:function(e,t,n){return"array"===n.returnMeta?[e,t]:"object"===n.returnMeta?{response:e,meta:t}:e},w:x,applyRelationGettersToTarget:function(e,t,n){this.forEach(t.relationList,function(r){var i=r.relation,o=r.localField,a=r.localKey,s=r.foreignKey,c=r.localKeys,l=r.foreignKeys,h="boolean"==typeof r.enumerable?r.enumerable:!!t.relationsEnumerable;if("boolean"==typeof r.link?r.link:t.linkRelations){delete n[o];var d={enumerable:h};if("belongsTo"===r.type?(d.get=function(){var e=b(this,a);return!(!e&&0!==e)?t.getResource(i).get(e):void 0},d.set=function(e){return e&&w(this,a,b(e,t.getResource(i).idAttribute)),b(this,o)}):"hasMany"===r.type?(d.get=function(){var n={};if(s)return n[s]=this[t.idAttribute],t.getResource(i).defaultFilter.call(e,e.store[i].collection,i,n,{allowSimpleWhere:!0});if(c){var r=b(this,c)||[];return t.getResource(i).getAll(S(r)?r:m(r))}return l?(w(n,"where."+l+".contains",this[t.idAttribute]),t.getResource(i).defaultFilter.call(e,e.store[i].collection,i,n)):void 0},d.set=function(e){if(e&&e.length){var n=b(this,t.idAttribute);if(s)u(e,function(e){w(e,s,n)});else if(c){var r=[];u(e,function(e){r.push(b(e,t.getResource(i).idAttribute))}),w(this,c,r)}else l&&u(e,function(e){var t=b(e,l);t?f(t,n)||t.push(n):w(e,l,[n])})}return b(this,o)}):"hasOne"===r.type&&(a?(d.get=function(){var e=b(this,a);return!(!e&&0!==e)?t.getResource(i).get(e):void 0},d.set=function(e){return e&&w(this,a,b(e,t.getResource(i).idAttribute)),b(this,o)}):(d.get=function(){var n={};n[s]=this[t.idAttribute];var r=n[s]?t.getResource(i).defaultFilter.call(e,e.store[i].collection,i,n,{allowSimpleWhere:!0}):[];if(r.length)return r[0]},d.set=function(e){return e&&w(e,s,b(this,t.idAttribute)),b(this,o)})),r.get){var p=d.get;d.get=function(){var e=this;return r.get(t,r,this,function(){for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];return p.apply(e,n)})}}Object.defineProperty(n,o,d)}})}}},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(e){n(this,t);var i=r(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(i,i.constructor),i.type=i.constructor.name,i.message=e,i}return i(t,Error),t}(),a=function(e){function t(e){n(this,t);var i=r(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(i,i.constructor),i.type=i.constructor.name,i.message=e,i}return i(t,Error),t}(),s=function(e){function t(e){n(this,t);var i=r(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(i,i.constructor),i.type=i.constructor.name,i.message=e+" is not a registered resource!",i}return i(t,Error),t}();t.default={IllegalArgumentError:o,IA:o,RuntimeError:a,R:a,NonexistentResourceError:s,NER:s}},function(e,t,n){e.exports=function(){"use strict";var e=function(e,t,n){for(var r=e[n],i=t(r);n>0;){var o=Math.floor((n+1)/2)-1,a=e[o];if(i>=t(a))break;e[o]=r,e[n]=a,n=o}},t=function(e,t,n){for(var r=e.length,i=e[n],o=t(i);;){var a=2*(n+1),s=a-1,u=null;if(s<r){var c=e[s],l=t(c);l<o&&(u=s)}if(a<r){var f=e[a],h=t(f);h<(null===u?o:t(e[s]))&&(u=a)}if(null===u)break;e[n]=e[u],e[u]=i,n=u}};function n(e,t){if(e||(e=function(e){return e}),t||(t=function(e,t){return e===t}),"function"!=typeof e)throw new Error('BinaryHeap([weightFunc][, compareFunc]): "weightFunc" must be a function!');if("function"!=typeof t)throw new Error('BinaryHeap([weightFunc][, compareFunc]): "compareFunc" must be a function!');this.weightFunc=e,this.compareFunc=t,this.heap=[]}var r=n.prototype;return r.push=function(t){this.heap.push(t),e(this.heap,this.weightFunc,this.heap.length-1)},r.peek=function(){return this.heap[0]},r.pop=function(){var e=this.heap[0],n=this.heap.pop();return this.heap.length>0&&(this.heap[0]=n,t(this.heap,this.weightFunc,0)),e},r.remove=function(n){for(var r=this.heap.length,i=0;i<r;i++)if(this.compareFunc(this.heap[i],n)){var o=this.heap[i],a=this.heap.pop();return i!==r-1&&(this.heap[i]=a,e(this.heap,this.weightFunc,i),t(this.heap,this.weightFunc,i)),o}return null},r.removeAll=function(){this.heap=[]},r.size=function(){return this.heap.length},n}()},function(e,t){e.exports=function(e,t,n){if(null!=e)for(var r=-1,i=e.length;++r<i&&!1!==t.call(n,e[r],r,e););}},function(e,t){e.exports=function(e,t,n){var r=e.length;t=null==t?0:t<0?Math.max(r+t,0):Math.min(t,r),n=null==n?r:n<0?Math.max(r+n,0):Math.min(n,r);for(var i=[];t<n;)i.push(e[t++]);return i}},function(e,t,n){var r=n(8),i=n(9);e.exports=function(e,t,n){i(e,function(i,o){if(r(e,o))return t.call(n,e[o],o,e)})}},function(e,t){e.exports=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},function(e,t,n){var r,i,o=n(8);function a(e,t,n,r){return e.call(r,t[n],n,t)}e.exports=function(e,t,n){var s,u=0;for(s in null==r&&function(){for(var e in i=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],r=!0,{toString:null})r=!1}(),e)if(!1===a(t,e,s,n))break;if(r)for(var c=e.constructor,l=!!c&&e===c.prototype;(s=i[u++])&&("constructor"===s&&(l||!o(e,s))||e[s]===Object.prototype[s]||!1!==a(t,e,s,n)););}},function(e,t,n){var r=n(11);e.exports=function(e,t){return-1!==r(e,t)}},function(e,t){e.exports=function(e,t,n){if(n=n||0,null==e)return-1;for(var r=e.length,i=n<0?r+n:n;i<r;){if(e[i]===t)return i;i++}return-1}},function(e,t,n){var r=n(7),i=n(13);function o(e,t){for(var n,i=0,o=arguments.length;++i<o;)(n=arguments[i])&&r(n,a,e);return e}function a(e,t){var n=this[t];i(e)&&i(n)?o(n,e):this[t]=e}e.exports=o},function(e,t){e.exports=function(e){return!!e&&"object"==typeof e&&e.constructor===Object}},function(e,t,n){var r=n(15),i=n(16),o=n(19);e.exports=function(e){return e=r(e),i(e).replace(/^[a-z]/,o)}},function(e,t){e.exports=function(e){return null==e?"":e.toString()}},function(e,t,n){var r=n(15),i=n(17),o=n(18),a=n(19),s=n(20);e.exports=function(e){return e=r(e),e=i(e),e=o(e).replace(/[\-_]/g," ").replace(/\s[a-z]/g,a).replace(/\s+/g,"").replace(/^[A-Z]/g,s)}},function(e,t,n){var r=n(15);e.exports=function(e){return(e=r(e)).search(/[\xC0-\xFF]/g)>-1&&(e=e.replace(/[\xC0-\xC5]/g,"A").replace(/[\xC6]/g,"AE").replace(/[\xC7]/g,"C").replace(/[\xC8-\xCB]/g,"E").replace(/[\xCC-\xCF]/g,"I").replace(/[\xD0]/g,"D").replace(/[\xD1]/g,"N").replace(/[\xD2-\xD6\xD8]/g,"O").replace(/[\xD9-\xDC]/g,"U").replace(/[\xDD]/g,"Y").replace(/[\xDE]/g,"P").replace(/[\xE0-\xE5]/g,"a").replace(/[\xE6]/g,"ae").replace(/[\xE7]/g,"c").replace(/[\xE8-\xEB]/g,"e").replace(/[\xEC-\xEF]/g,"i").replace(/[\xF1]/g,"n").replace(/[\xF2-\xF6\xF8]/g,"o").replace(/[\xF9-\xFC]/g,"u").replace(/[\xFE]/g,"p").replace(/[\xFD\xFF]/g,"y")),e}},function(e,t,n){var r=n(15),i=/[^\x20\x2D0-9A-Z\x5Fa-z\xC0-\xD6\xD8-\xF6\xF8-\xFF]/g;e.exports=function(e){return(e=r(e)).replace(i,"")}},function(e,t,n){var r=n(15);e.exports=function(e){return(e=r(e)).toUpperCase()}},function(e,t,n){var r=n(15);e.exports=function(e){return(e=r(e)).toLowerCase()}},function(e,t,n){var r=n(11);e.exports=function(e,t){var n=r(e,t);-1!==n&&e.splice(n,1)}},function(e,t,n){var r=n(6);e.exports=function(e,t){for(var n,i="string"!=typeof arguments[1]?arguments[1]:r(arguments,1),o={},a=0;n=i[a++];)o[n]=e[n];return o}},function(e,t,n){var r=n(7),i=Object.keys||function(e){var t=[];return r(e,function(e,n){t.push(n)}),t};e.exports=i},function(e,t){function n(e,t){return e<t?-1:e>t?1:0}e.exports=function e(t,r){return null==t?[]:t.length<2?t:(null==r&&(r=n),i=~~(t.length/2),function(e,t,n){for(var r=[];e.length&&t.length;)n(e[0],t[0])<=0?r.push(e.shift()):r.push(t.shift());return e.length&&r.push.apply(r,e),t.length&&r.push.apply(r,t),r}(e(t.slice(0,i),r),e(t.slice(i,t.length),r),r));var i}},function(e,t,n){n(26);e.exports=function(e,t){for(var n=t.split("."),r=n.pop();t=n.shift();)if(null==(e=e[t]))return;return e[r]}},function(e,t){e.exports=function(e){switch(typeof e){case"string":case"number":case"boolean":return!0}return null==e}},function(e,t,n){var r=n(28);e.exports=function(e,t,n){var i=/^(.+)\.(.+)$/.exec(t);i?r(e,i[1])[i[2]]=n:e[t]=n}},function(e,t,n){var r=n(5);e.exports=function(e,t){return t?(r(t.split("."),function(t){e[t]||(e[t]={}),e=e[t]}),e):e}},function(e,t){!function(e){var t=e.testingExposeCycleCount;var n=function(){if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var e=[];function t(t){e=t}var n={},r=[];return Object.observe(n,t),Array.observe(r,t),n.id=1,n.id=2,delete n.id,r.push(1,2),r.length=0,Object.deliverChangeRecords(t),5===e.length&&"add"==e[0].type&&"update"==e[1].type&&"delete"==e[2].type&&"splice"==e[3].type&&"splice"==e[4].type&&(Object.unobserve(n,t),Array.unobserve(r,t),!0)}(),r="__proto__"in{}?function(e){return e}:function(e){var t=e.__proto__;if(!t)return e;var n=Object.create(t);return Object.getOwnPropertyNames(e).forEach(function(t){Object.defineProperty(n,t,Object.getOwnPropertyDescriptor(e,t))}),n},i=1e3;function o(n){for(var r=0;r<i&&n.check_();)r++;return t&&(e.dirtyCheckCycleCount=r),r>0}function a(e){for(var t in e)return!1;return!0}function s(e,t){if(!t||!t.length)return!1;for(var n,r=0;r<t.length;r++)if("[object RegExp]"===Object.prototype.toString.call(t[r])&&t[r].test(e)||t[r]===e)return e;return!!n}function u(e,t,n,r){var i={},o={},a={};for(var u in t){var c=e[u];s(u,r)||(void 0!==c&&(n?n(c,t[u]):c===t[u])||(u in e?(n?n(c,t[u]):c===t[u])||(a[u]=c):o[u]=void 0))}for(var u in e)u in t||s(u,r)||(i[u]=e[u]);return Array.isArray(e)&&e.length!==t.length&&(a.length=e.length),{added:i,removed:o,changed:a}}var c=[];function l(){if(!c.length)return!1;for(var e=0;e<c.length;e++)c[e]();return c.length=0,!0}var f=n?function(e){return Promise.resolve().then(e)}:function(e){c.push(e)},h=[];function d(e,t,n){var r=h.pop()||function(){var e,t,n=!1,r=!0;function i(t){e&&e.state_===v&&!n&&e.check_(t)}return{open:function(t){if(e)throw Error("ObservedObject in use");r||Object.deliverChangeRecords(i),e=t,r=!1},observe:function(e,n){t=e,n?Array.observe(t,i):Object.observe(t,i)},deliver:function(e){n=e,Object.deliverChangeRecords(i),n=!1},close:function(){e=void 0,Object.unobserve(t,i),h.push(this)}}}();return r.open(e),r.observe(t,n),r}var p=0,v=1,m=1;function y(){this.state_=p,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=m++}y.prototype={open:function(e,t){if(this.state_!=p)throw Error("Observer has already been opened.");return function(e){if(y._allObserversCount++,!b)return;g.push(e)}(this),this.callback_=e,this.target_=t,this.connect_(),this.state_=v,this.value_},close:function(){this.state_==v&&(y._allObserversCount--,this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=2)},deliver:function(){this.state_==v&&o(this)},report_:function(e){try{this.callback_.apply(this.target_,e)}catch(e){y._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(e.stack||e))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var g,b=!n;y._allObserversCount=0,b&&(g=[]);var w=!1;function _(e){y.call(this),this.value_=e,this.oldObject_=void 0}e.Platform=e.Platform||{},e.Platform.performMicrotaskCheckpoint=function(){if(!w&&b){w=!0;var n,r,o=0;do{o++,r=g,g=[],n=!1;for(var a=0;a<r.length;a++){var s=r[a];s.state_==v&&(s.check_()&&(n=!0),g.push(s))}l()&&(n=!0)}while(o<i&&n);t&&(e.dirtyCheckCycleCount=o),w=!1}},b&&(e.Platform.clearObservers=function(){g=[]}),_.prototype=r({__proto__:y.prototype,arrayObserve:!1,connect_:function(e,t){n?this.directObserver_=d(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(e){var t=Array.isArray(e)?[]:{};for(var n in e)t[n]=e[n];return Array.isArray(e)&&(t.length=e.length),t},check_:function(e,t){var r,i;if(n){if(!e)return!1;i={},r=function(e,t,n){for(var r={},i={},o=0;o<t.length;o++){var a=t[o];k[a.type]?(a.name in n||(n[a.name]=a.oldValue),"update"!=a.type&&("add"!=a.type?a.name in r?(delete r[a.name],delete n[a.name]):i[a.name]=!0:a.name in i?delete i[a.name]:r[a.name]=!0)):(console.error("Unknown changeRecord type: "+a.type),console.error(a))}for(var s in r)r[s]=e[s];for(var s in i)i[s]=void 0;var u={};for(var s in n)if(!(s in r||s in i)){var c=e[s];n[s]!==c&&(u[s]=c)}return{added:r,removed:i,changed:u}}(this.value_,e,i)}else i=this.oldObject_,r=u(this.value_,this.oldObject_);return!function(e){return a(e.added)&&a(e.removed)&&a(e.changed)}(r)&&(n||(this.oldObject_=this.copyObject(this.value_)),this.report_([r.added||{},r.removed||{},r.changed||{},function(e){return i[e]}]),!0)},disconnect_:function(){n?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==v&&(n?this.directObserver_.deliver(!1):o(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}});var k={add:!0,update:!0,delete:!0};e.Observer=y,e.isBlacklisted=s,e.Observer.runEOM_=f,e.Observer.observerSentinel_={},e.Observer.hasObjectObserve=n,e.diffObjectFromOldObject=u,e.ObjectObserver=_}(t)},function(e,t,n){var r=n(31),i=n(32);e.exports=function(){return r(8)+"-"+r(4)+"-4"+r(3)+"-"+i(8,9,"a","b")+r(3)+"-"+r(12)}},function(e,t,n){var r=n(32),i="0123456789abcdef".split("");e.exports=function(e){e=e&&e>0?e:6;for(var t="";e--;)t+=r(i);return t}},function(e,t,n){var r=n(33),i=n(38);e.exports=function(e){var t=1===arguments.length&&i(e)?e:arguments;return t[r(0,t.length-1)]}},function(e,t,n){var r=n(34),i=n(35),o=n(36);e.exports=function(e,t){return e=null==e?r:~~e,t=null==t?i:~~t,Math.round(o(e-.5,t+.499999999999))}},function(e,t){e.exports=-2147483648},function(e,t){e.exports=2147483647},function(e,t,n){var r=n(37),i=n(34),o=n(35);e.exports=function(e,t){return(e=null==e?i:e)+((t=null==t?o:t)-e)*r()}},function(e,t){function n(){return n.get()}n.get=Math.random,e.exports=n},function(e,t,n){var r=n(39),i=Array.isArray||function(e){return r(e,"Array")};e.exports=i},function(e,t,n){var r=n(40);e.exports=function(e,t){return r(e)===t}},function(e,t){var n,r=/^\[object (.*)\]$/,i=Object.prototype.toString;e.exports=function(e){return null===e?"Null":e===n?"Undefined":r.exec(i.call(e))[1]}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=o(n(2)),i=o(n(3));function o(e){return e&&e.__esModule?e:{default:e}}var a=i.default.NER,s=i.default.IA,u=i.default.R,c="DS_"+(new Date).getTime();function l(e,t,n,i){var o=this.definitions[t];if(i=i||{},n=r.default.resolveId(o,n),!o)throw new a(t);if(!r.default._sn(n))throw r.default._snErr("id");return{_this:this,definition:o,_resourceName:t,_id:n=n===c?void 0:n,_options:i=r.default._(o,i)}}t.default={changes:function(e,t,n){var i=l.call(this,"changes",e,t,n),o=i._this,a=i.definition,s=i._resourceName,u=i._id,c=i._options,f=a.get(u);if(f){var h=o.store[s].observers[u];h&&"function"==typeof h&&h.deliver();var d=r.default.copy(c.ignoredChanges||[]);r.default.forEach(a.relationFields,function(e){r.default.contains(d,e)||d.push(e)});var p=r.default.diffObjectFromOldObject(f,o.store[s].previousAttributes[u],r.default.equals,d);return r.default.forOwn(p,function(e,t){var n=[];r.default.forOwn(e,function(e,t){r.default.isFunction(e)||n.push(t)}),p[t]=r.default.pick(p[t],n)}),r.default.forEach(a.relationFields,function(e){delete p.added[e],delete p.removed[e],delete p.changed[e]}),p}},changeHistory:function(e,t){var n=l.call(this,"changeHistory",e,t||c),r=n._this,i=n.definition,o=n._resourceName,a=n._id,s=r.store[o];if(i.keepChangeHistory){if(!o)return s.changeHistory;if(i.get(a))return s.changeHistories[a]}else i.errorFn("changeHistory is disabled for this resource!")},commit:function(e,t){var n=l.call(this,"commit",e,t),i=n._this,o=n.definition,a=n._resourceName,s=n._id,u=i.store[a],c=i.store[a].index[s];if(c){var f=o.relationFields||[],h={};for(var d in c)-1===f.indexOf(d)&&(h[d]=r.default.copy(c[d],null,null,null,[]));u.previousAttributes[s]=h}return u.changeHistories[s].length&&(r.default.forEach(u.changeHistories[s],function(e){r.default.remove(u.changeHistory,e)}),u.changeHistories[s].splice(0,u.changeHistories[s].length)),c},compute:function(e,t){var n=this.definitions[e];if(t=r.default.resolveItem(this.store[e],t),!n)throw new a(e);if(!t)throw new u("Item not in the store!");if(!r.default._o(t)&&!r.default._sn(t))throw new s('"instance" must be an object, string or number!');return r.default.forOwn(n.computed,function(e,n){r.default.compute.call(t,e,n)}),t},createInstance:function(e,t,n){var i,o=this.definitions[e];if(t=t||{},!o)throw new a(e);if(t&&!r.default.isObject(t))throw new s('"attrs" must be an object!');n=r.default._(o,n);var u=o.relationList||[];return u.length&&r.default.forEach(u,function(e){var i=r.default.get(t,e.localField);if(i)if(r.default.isArray(i)){var a=[],s=o.getResource(e.relation),u=n.orig();r.default.forEach(i,function(e){a.push(s.createInstance(e,u))}),r.default.set(t,e.localField,a)}else r.default.isObject(i)&&r.default.set(t,e.localField,o.getResource(e.relation).createInstance(i,n.orig()))}),n.beforeCreateInstance(n,t),i=new(0,o[o.class]),o.instanceEvents&&r.default.Events(i),n.defaultValues&&r.default.deepMixIn(i,r.default.copy(n.defaultValues)),r.default.deepMixIn(i,t),o.computed&&o.compute(i),n.afterCreateInstance(n,i),i},createCollection:function(e,t,n,i){var o=this,u=o.definitions[e];if(t=t||[],n=n||{},!u)throw new a(e);if(t&&!r.default.isArray(t))throw new s('"arr" must be an array!');return(i=r.default._(u,i)).beforeCreateCollection(i,t),Object.defineProperties(t,{fetch:{value:function(t,n){var i=this;return i.params=t||i.params,u.findAll(i.params,n).then(function(t){return t===i?i:(t.unshift(i.length),t.unshift(0),i.splice.apply(i,t),t.shift(),t.shift(),t.$$injected&&(o.store[e].queryData[r.default.toJson(i.params)]=i,i.$$injected=!0),i)})}},params:{value:n,writable:!0},resourceName:{value:e}}),i.afterCreateCollection(i,t),t},defineResource:n(42),digest:function(){this.observe.Platform.performMicrotaskCheckpoint()},eject:n(43),ejectAll:n(44),filter:n(45),get:function(e,t){var n=l.call(this,"get",e,t),r=n._this,i=n._resourceName,o=n._id;return r.store[i].index[o]},getAll:function(e,t){var n=this.definitions[e],i=this.store[e],o=[];if(!n)throw new a(e);if(t&&!r.default._a(t))throw r.default._aErr("ids");if(r.default._a(t))for(var s=t.length,u=0;u<s;u++)i.index[t[u]]&&o.push(i.index[t[u]]);else o=i.collection.slice();return o},hasChanges:function(e,t){var n,i=l.call(this,"hasChanges",e,t),o=i.definition,a=i._id;return!!o.get(a)&&(n=o.changes(a),!(r.default.isEmpty(n.added)&&r.default.isEmpty(n.removed)&&r.default.isEmpty(n.changed)))},inject:n(46),isNew:function(e,t){var n=l.call(this,"isNew",e,t||c),r=n._this,i=n._resourceName,o=n._id;return!!r.store[i].temporaryItems[o]},lastModified:function(e,t){var n=l.call(this,"lastModified",e,t||c),r=n._this,i=n._resourceName,o=n._id,a=r.store[i];return o?(o in a.modified||(a.modified[o]=0),a.modified[o]):a.collectionModified},lastSaved:function(e,t){var n=l.call(this,"lastSaved",e,t||c),r=n._this,i=n._resourceName,o=n._id,a=r.store[i];return o in a.saved||(a.saved[o]=0),a.saved[o]},previous:function(e,t){var n=l.call(this,"previous",e,t),i=n._this,o=n._resourceName,a=n._id,s=i.store[o];return s.previousAttributes[a]?r.default.copy(s.previousAttributes[a]):void 0},revert:function(e,t,n){var i=l.call(this,"revert",e,t,n),o=i._this,a=i.definition,s=i._resourceName,u=i._id,c=i._options.preserve||[],f={};if(0===c.length)f=o.previous(s,u);else{var h=a.get(t),d=o.previous(s,u);if(!h)return;r.default.forOwn(h,function(e,t){r.default.contains(c,t)?f[t]=h[t]:f[t]=d[t]})}return a.inject(f,{onConflict:"replace"})}}},function(e,t,n){"use strict";var r=o(n(2)),i=o(n(3));function o(e){return e&&e.__esModule?e:{default:e}}var a=["compute","eject","refresh","save","update","destroy","loadRelations","changeHistory","changes","commit","hasChanges","isNew","lastModified","lastSaved","previous","revert"];e.exports=function(e){var t=this,n=t.definitions;if(r.default._s(e)&&(e={name:e.replace(/\s/gi,"")}),!r.default._o(e))throw r.default._oErr("definition");if(!r.default._s(e.name))throw new i.default.IA('"name" must be a string!');if(n[e.name])throw new i.default.R(e.name+" is already registered!");function o(i){this.defaultValues={},this.methods={},this.computed={},this.scopes={},this.actions={},r.default.deepMixIn(this,i);var o=t.defaults;e.extends&&n[e.extends]&&(o=n[e.extends]),r.default.fillIn(this.defaultValues,o.defaultValues),r.default.fillIn(this.methods,o.methods),r.default.fillIn(this.computed,o.computed),r.default.fillIn(this.scopes,o.scopes),r.default.fillIn(this.actions,o.actions),this.endpoint="endpoint"in i?i.endpoint:this.name}try{e.extends&&n[e.extends]?o.prototype=n[e.extends]:o.prototype=t.defaults,n[e.name]=new o(e);var s=n[e.name];if(s.getResource=function(e){return t.definitions[e]},!r.default._s(s.idAttribute))throw new i.default.IA('"idAttribute" must be a string!');s.relations&&(s.relationList=[],s.relationFields=[],r.default.forOwn(s.relations,function(e,t){r.default.forOwn(e,function(n,i){r.default._a(n)||(e[i]=[n]),r.default.forEach(e[i],function(e){e.type=t,e.relation=i,e.name=s.name,s.relationList.push(e),e.localField&&s.relationFields.push(e.localField)})})}),s.relations.belongsTo&&(s.parents={},r.default.forOwn(s.relations.belongsTo,function(e,t){r.default.forEach(e,function(e){e.parent&&(s.parent=t,s.parentKey=e.localKey,s.parentField=e.localField,s.parents[t]={key:s.parentKey,field:s.parentField})})})),"function"==typeof Object.freeze&&(Object.freeze(s.relations),Object.freeze(s.relationList)));var u=s.class=r.default.pascalCase(s.name);try{"function"==typeof s.useClass?(s.csp?s[u]=function(){s.useClass.call(this)}:s[u]=new Function("def","return function "+u+"() { def.useClass.call(this); }")(s),s[u].prototype=function(e){function t(){}return t.prototype=e,new t}(s.useClass.prototype)):s.csp?s[u]=function(){}:s[u]=new Function("return function "+u+"() {}")()}catch(e){s[u]=function(){}}r.default.forOwn(s.methods,function(e,t){s[u].prototype[t]=e}),s[u].prototype.set=function(e,t){var n=this;return r.default.set(this,e,t),s.compute(this),s.instanceEvents&&setTimeout(function(){n.emit("DS.change",s,n)},0),s.handleChange(this),this},s[u].prototype.get=function(e){return r.default.get(this,e)},r.default.applyRelationGettersToTarget(t,s,s[u].prototype);var c=null;s.hasOwnProperty("omit")?c=t.defaults.omit:(c=s.omit,s.omit=[]),s.omit=s.omit.concat(c||[]),r.default.forOwn(s.computed,function(e,t){if(r.default.isFunction(e)&&(s.computed[t]=[e],e=s.computed[t]),s.methods&&t in s.methods&&s.errorFn('Computed property "'+t+'" conflicts with previously defined prototype method!'),s.omit.push(t),r.default.isArray(e)){var n;if(1===e.length){var i=e[0].toString().match(/function.*?\(([\s\S]*?)\)/);n=i[1].split(","),n=r.default.filter(n,function(e){return e}),s.computed[t]=n.concat(e),e=s.computed[t],n.length&&s.errorFn("Use the computed property array syntax for compatibility with minified code!")}n=e.slice(0,e.length-1),r.default.forEach(n,function(e,t){n[t]=e.trim()}),e.deps=r.default.filter(n,function(e){return!!e})}else r.default.isObject(e)&&Object.defineProperty(s[u].prototype,t,e)}),r.default.forEach(a,function(e){s[u].prototype["DS"+r.default.pascalCase(e)]=function(){for(var n=arguments.length,r=Array(n),i=0;i<n;i++)r[i]=arguments[i];return r.unshift(this[s.idAttribute]||this),r.unshift(s.name),t[e].apply(t,r)}}),s[u].prototype.DSCreate=function(){for(var e=arguments.length,n=Array(e),r=0;r<e;r++)n[r]=arguments[r];return n.unshift(this),n.unshift(s.name),t.create.apply(t,n)},t.store[s.name]={collection:[],expiresHeap:new r.default.BinaryHeap(function(e){return e.expires},function(e,t){return e.item===t}),completedQueries:{},queryData:{},pendingQueries:{},index:{},modified:{},saved:{},previousAttributes:{},observers:{},changeHistories:{},changeHistory:[],collectionModified:0,temporaryItems:{}};var l=t.store[s.name];s.reapInterval&&setInterval(function(){return s.reap()},s.reapInterval);var f=["registerAdapter","getAdapterName","getAdapter","is","!clear"];for(var h in t)"function"==typeof t[h]&&f.push(h);r.default.forEach(f,function(e){var n=e;"!"!==n[0]&&(!1!==t[n].shorthand?(s[n]=function(){for(var e=arguments.length,r=Array(e),i=0;i<e;i++)r[i]=arguments[i];return r.unshift(s.name),t[n].apply(t,r)},s[n].before=function(e){var t=s[n];s[n]=function(){for(var n=arguments.length,r=Array(n),i=0;i<n;i++)r[i]=arguments[i];return t.apply(s,e.apply(s,r)||r)}}):s[n]=function(){for(var e=arguments.length,r=Array(e),i=0;i<e;i++)r[i]=arguments[i];return t[n].apply(t,r)})}),s.beforeValidate=r.default.promisify(s.beforeValidate),s.validate=r.default.promisify(s.validate),s.afterValidate=r.default.promisify(s.afterValidate),s.beforeCreate=r.default.promisify(s.beforeCreate),s.afterCreate=r.default.promisify(s.afterCreate),s.afterFind=r.default.promisify(s.afterFind),s.afterFindAll=r.default.promisify(s.afterFindAll),s.afterLoadRelations=r.default.promisify(s.afterLoadRelations),s.beforeUpdate=r.default.promisify(s.beforeUpdate),s.afterUpdate=r.default.promisify(s.afterUpdate),s.beforeDestroy=r.default.promisify(s.beforeDestroy),s.afterDestroy=r.default.promisify(s.afterDestroy);var d=void 0;return s.hasOwnProperty("defaultAdapter")&&(d=s.defaultAdapter),r.default.forOwn(s.actions,function(e,t){if(s[t]&&!s.actions[t])throw new Error('Cannot override existing method "'+t+'"!');e.request=e.request||function(e){return e},e.response=e.response||function(e){return e},e.responseError=e.responseError||function(e){return r.default.Promise.reject(e)},s[t]=function(n,i){r.default._o(n)&&(i=n),i=i||{};var o=s.getAdapter(e.adapter||d||"http"),a=r.default.deepMixIn({},e);if(!i.hasOwnProperty("endpoint")&&a.endpoint&&(i.endpoint=a.endpoint),"function"==typeof i.getEndpoint)a.url=i.getEndpoint(s,i);else{var u=[i.basePath||s.basePath||o.defaults.basePath,o.getEndpoint(s,r.default._sn(n)?n:null,i)];r.default._sn(n)&&u.push(n),u.push(e.pathname||t),a.url=r.default.makePath.apply(null,u)}return a.method=a.method||"GET",a.resourceName=s.name,r.default.deepMixIn(a,i),new r.default.Promise(function(e){return e(a)}).then(i.request||e.request).then(function(e){return o.HTTP(e)}).then(function(e){return e&&e.config&&(e.config.resourceName=s.name),e}).then(i.response||e.response,i.responseError||e.responseError)}}),r.default.Events(s),s.handleChange=function(e){l.collectionModified=r.default.updateTimestamp(l.collectionModified),s.notify&&setTimeout(function(){s.emit("DS.change",s,e)},0)},s}catch(r){throw t.defaults.errorFn(r),delete n[e.name],delete t.store[e.name],r}}},function(e,t){"use strict";e.exports=function(e,t,n){var r=this.utils,i=this.definitions[e],o=this.store[e],a=void 0,s=!1;if(t=r.resolveId(i,t),!i)throw new this.errors.NER(e);if(!r._sn(t))throw r._snErr("id");n=r._(i,n);for(var u=0;u<o.collection.length;u++)if(o.collection[u][i.idAttribute]==t){a=o.collection[u],o.expiresHeap.remove(a),s=!0;break}if(s){i.beforeEject(n,a),n.notify&&i.emit("DS.beforeEject",i,a);var c=[];return r.forOwn(o.queryData,function(e,t){e.$$injected&&r.remove(e,a),!e.length&&n.clearEmptyQueries&&c.push(t)}),r.forEach(o.changeHistories[t],function(e){r.remove(o.changeHistory,e)}),r.forEach(c,function(e){delete o.completedQueries[e],delete o.queryData[e]}),o.observers[t]&&"function"==typeof o.observers[t].close&&o.observers[t].close(),delete o.observers[t],delete o.index[t],delete o.previousAttributes[t],delete o.completedQueries[t],delete o.pendingQueries[t],delete o.changeHistories[t],delete o.modified[t],delete o.saved[t],i.instanceEvents&&a.off&&a.off(),o.collection.splice(u,1),i.handleChange(a),i.afterEject(n,a),n.notify&&i.emit("DS.afterEject",i,a),a}}},function(e,t){"use strict";e.exports=function(e,t,n){var r=this.utils,i=this.definitions[e];if(t=t||{},!i)throw new this.errors.NER(e);if(!r._o(t))throw r._oErr("params");n=r._(i,n),r.applyScope(i,t,n);var o=this.store[e],a=r.toJson(t),s=void 0;return r.isEmpty(t)?(s=i.getAll(),o.completedQueries={}):(s=i.filter(t),delete o.completedQueries[a]),r.forEach(s,function(e){e&&e[i.idAttribute]&&i.eject(e[i.idAttribute],n)}),i.handleChange(s),s}},function(e,t){"use strict";e.exports=function(e,t,n){var r=this.utils,i=this.definitions[e];if(!i)throw new this.errors.NER(e);if(t&&!r._o(t))throw r._oErr("params");return t=t||{},n=r._(i,n),r.applyScope(i,t,n),i.defaultFilter.call(this,this.store[e].collection,e,t,n)}},function(e,t,n){"use strict";var r=o(n(2)),i=o(n(3));function o(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n,o){var s=this,u=void 0;if(r.default._a(n)){u=[];for(var c=0;c<n.length;c++)u.push(a.call(s,e,t,n[c],o))}else{var l=e.computed,f=e.idAttribute;if(l&&l[f]){var h=[];r.default.forEach(l[f].deps,function(e){h.push(n[e])}),n[f]=l[f][l[f].length-1].apply(n,h)}else o.temporary&&(n[f]=r.default.guid());if(!(f in n)){var d=new i.default.R(e.name+'.inject: "attrs" must contain the property specified by "idAttribute"!');throw o.errorFn(d),d}try{r.default.forEach(e.relationList,function(t){var a=t.relation,u=s.definitions[a],c=n[t.localField];if("function"==typeof t.inject)t.inject(e,t,n);else if(c&&!1!==t.inject){if(!u)throw new i.default.R(e.name+" relation is defined but the resource is not!");if(r.default._a(c)){var l=[];r.default.forEach(c,function(i){if(i!==s.store[a].index[i[u.idAttribute]])try{var c=u.inject(i,o.orig());t.foreignKey&&r.default.set(c,t.foreignKey,n[e.idAttribute]),l.push(c)}catch(e){o.errorFn(e,"Failed to inject "+t.type+' relation: "'+a+'"!')}})}else if(c!==s.store[a].index[c[u.idAttribute]])try{var f=u.inject(n[t.localField],o.orig());t.foreignKey&&r.default.set(f,t.foreignKey,n[e.idAttribute]),t.localKey&&r.default.set(n,t.localKey,r.default.get(f,u.idAttribute))}catch(e){o.errorFn(e,"Failed to inject "+t.type+' relation: "'+a+'"!')}}});var p=n[f],v=e.get(p),m=v?t.modified[p]:0;if(v)"merge"===o.onConflict?(r.default.deepMixIn(v,n),r.default.forOwn(e.computed,function(e,t){r.default.compute.call(v,e,t)})):"replace"===o.onConflict&&(r.default.forOwn(e.computed,function(e,t){r.default.compute.call(n,e,t)}),r.default.forOwn(v,function(t,r){r!==e.idAttribute&&(n.hasOwnProperty(r)||delete v[r])}),r.default.forOwn(n,function(t,n){n!==e.idAttribute&&(v[n]=t)})),e.resetHistoryOnInject&&s.commit(e.name,p),t.observers[p]&&"function"==typeof t.observers[p]&&t.observers[p].deliver();else{n instanceof e[e.class]?v=n:(v=new e[e.class],o.applyDefaultsOnInject&&o.defaultValues&&r.default.deepMixIn(v,r.default.copy(o.defaultValues))),e.instanceEvents&&"function"!=typeof v.emit&&r.default.Events(v),r.default.forEach(e.relationList,function(t){("boolean"==typeof t.link?t.link:e.linkRelations)&&delete n[t.localField]}),r.default.deepMixIn(v,n),t.collection.push(v),t.changeHistories[p]=[];var y=function(e,t){var n=this,i=e.name;return function(o,a,s,u,c){var l=void 0,f=u&&u(e.idAttribute)?u(e.idAttribute):this[e.idAttribute];if(r.default.forEach(e.relationFields,function(e){delete o[e],delete a[e],delete s[e]}),(!r.default.isEmpty(o)||!r.default.isEmpty(a)||!r.default.isEmpty(s)||c)&&(l=n.get(i,f),t.modified[f]=r.default.updateTimestamp(t.modified[f]),l&&e.instanceEvents&&setTimeout(function(){l.emit("DS.change",e,l)},0),e.handleChange(l),e.keepChangeHistory)){var h={resourceName:i,target:l,added:o,removed:a,changed:s,timestamp:t.modified[f]};t.changeHistories[f].push(h),t.changeHistory.push(h)}e.computed&&(l=l||n.get(i,f),r.default.forOwn(e.computed,function(e,t){if(!r.default._o(e)){var n=!1;r.default.forEach(e.deps,function(e){!(e in o||e in a||e in s)&&t in l||(n=!0)}),(n=n||!e.deps.length)&&r.default.compute.call(l,e,t)}})),e.idAttribute in s&&e.errorFn('Doh! You just changed the primary key of an object! Your data for the "'+i+'" resource is now in an undefined (probably broken) state.')}}.call(s,e,t);e.watchChanges&&(t.observers[p]=new s.observe.ObjectObserver(v),t.observers[p].open(y,v)),t.index[p]=v,y.call(v,{},{},{},null,!0),t.previousAttributes[p]=r.default.copy(v,null,null,null,e.relationFields),o.temporary&&(t.temporaryItems[p]=!0)}t.modified[p]=m&&t.modified[p]===m?r.default.updateTimestamp(t.modified[p]):t.modified[p],t.expiresHeap.remove(v);var g=(new Date).getTime();t.expiresHeap.push({item:v,timestamp:g,expires:e.maxAge?g+e.maxAge:Number.MAX_VALUE}),u=v}catch(e){o.errorFn(e,n)}}return u}e.exports=function(e,t,n){var o,s=this.definitions[e],u=this.store[e];if(!s)throw new i.default.NER(e);if(!r.default._o(t)&&!r.default._a(t))throw new i.default.IA(e+'.inject: "attrs" must be an object or an array!');return(n=r.default._(s,n)).beforeInject(n,t),n.notify&&s.emit("DS.beforeInject",s,t),o=a.call(this,s,u,t,n),s.handleChange(o),n.afterInject(n,o),n.notify&&s.emit("DS.afterInject",s,o),o}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={create:n(48),destroy:n(49),destroyAll:n(50),find:n(51),findAll:n(52),loadRelations:n(53),reap:n(54),refresh:function(e,t,n){var r=this,i=r.utils;return new i.Promise(function(o,a){var s=r.definitions[e];t=i.resolveId(r.definitions[e],t),s?i._sn(t)?((n=i._(s,n)).bypassCache=!0,o(r.get(e,t))):a(i._snErr("id")):a(new r.errors.NER(e))}).then(function(i){return i?r.find(e,t,n):i}).catch(r.errorFn("refresh",e,t,n))},refreshAll:function(e,t,n){var r=this,i=r.utils,o=r.definitions[e];return t=t||{},new i.Promise(function(a,s){o?i._o(t)?((n=i._(o,n)).bypassCache=!0,a(r.filter(e,t,n))):s(i._oErr("params")):s(new r.errors.NER(e))}).then(function(a){return n.bypassCache=!0,r.findAll(e,t,n).then(function(e){return i.forEach(a,function(t){-1===e.indexOf(t)&&o.eject(t)}),e})}).catch(r.errorFn("refreshAll",e,t,n))},save:n(55),update:n(56),updateAll:n(57)}},function(e,t){"use strict";e.exports=function(e,t,n){var r=this,i=r.utils,o=r.definitions[e],a=r.store[e],s=void 0;n=n||{},t=t||{};var u=void 0;if(o)if(i._o(t)){if((n=i._(o,n)).upsert&&i._sn(t[o.idAttribute])&&!a.temporaryItems[t[o.idAttribute]])return r.update(e,t[o.idAttribute],t,n)}else u=i._oErr("attrs");else u=new r.errors.NER(e);return new i.Promise(function(e,n){u?n(u):e(t)}).then(function(e){return n.beforeValidate.call(e,n,e)}).then(function(e){return n.validate.call(e,n,e)}).then(function(e){return n.afterValidate.call(e,n,e)}).then(function(e){return n.beforeCreate.call(e,n,e)}).then(function(e){return n.notify&&o.emit("DS.beforeCreate",o,e),s=r.getAdapterName(n),r.adapters[s].create(o,i.omit(e,n.omit),n)}).then(function(e){return n.afterCreate.call(e,n,e)}).then(function(t){if(n.notify&&o.emit("DS.afterCreate",o,t),n.cacheResponse){var a=r.inject(o.name,t,n.orig()),s=a[o.idAttribute],u=r.store[e];return u.completedQueries[s]=(new Date).getTime(),u.saved[s]=i.updateTimestamp(u.saved[s]),a}return r.createInstance(e,t,n)}).then(function(e){return i.respond(e,{adapter:s},n)}).catch(r.errorFn("create",e,t,n))}},function(e,t){"use strict";e.exports=function(e,t,n){var r=this,i=r.utils,o=r.definitions[e],a=void 0,s=void 0;return new i.Promise(function(s,u){t=i.resolveId(o,t),o?i._sn(t)?(a=o.get(t)||{id:t},n=i._(o,n),s(a)):u(i._snErr("id")):u(new r.errors.NER(e))}).then(function(e){return n.beforeDestroy.call(e,n,e)}).then(function(e){return n.notify&&o.emit("DS.beforeDestroy",o,e),n.eagerEject&&o.eject(t),(s=o.getAdapter(n)).destroy(o,t,n)}).then(function(){return n.afterDestroy.call(a,n,a)}).then(function(e){return n.notify&&o.emit("DS.afterDestroy",o,e),o.eject(t),i.respond(t,{adapter:s},n)}).catch(function(i){return n&&n.eagerEject&&a&&o.inject(a,{notify:!1}),r.errorFn("destroy",e,t,n)(i)})}},function(e,t){"use strict";e.exports=function(e,t,n){var r=this,i=r.utils,o=r.definitions[e],a=void 0,s=void 0,u=void 0;return t=t||{},new i.Promise(function(a,s){o?i._o(t)?(n=i._(o,n),i.applyScope(o,t,n),a()):s(i._oErr("attrs")):s(new r.errors.NER(e))}).then(function(){return s=o.defaultFilter.call(r,e,t),n.beforeDestroy(n,s)}).then(function(){return n.notify&&o.emit("DS.beforeDestroy",o,s),n.eagerEject&&(a=o.ejectAll(t)),u=o.getAdapterName(n),r.adapters[u].destroyAll(o,t,n)}).then(function(){return n.afterDestroy(n,s)}).then(function(){return n.notify&&o.emit("DS.afterDestroy",o,s),a||o.ejectAll(t)}).then(function(e){return i.respond(e,{adapter:u},n)}).catch(function(i){return n&&n.eagerEject&&a&&o.inject(a,{notify:!1}),r.errorFn("destroyAll",e,t,n)(i)})}},function(e,t){"use strict";e.exports=function(e,t,n){var r=this,i=r.utils,o=r.definitions[e],a=r.store[e],s=void 0;return new i.Promise(function(s,u){if(o)if(i._sn(t)){(n=i._(o,n)).params&&(n.params=i.copy(n.params)),!n.bypassCache&&n.cacheResponse||delete a.completedQueries[t];var c=n.maxAge&&t in a.completedQueries&&a.completedQueries[t]+n.maxAge<(new Date).getTime();n.findStrictCache&&!(t in a.completedQueries)||!o.get(t)||n.bypassCache||c?(delete a.completedQueries[t],s()):s(o.get(t))}else u(i._snErr("id"));else u(new r.errors.NER(e))}).then(function(u){if(u)return u;var c=void 0,l=i.isFunction(n.usePendingFind)?n.usePendingFind.call(this,e,t,n):n.usePendingFind;if(t in a.pendingQueries&&l)c=a.pendingQueries[t];else{var f=void 0;if("fallback"===(n.findStrategy||n.strategy)){f=function e(a){return s=o.getAdapterName((n.findFallbackAdapters||n.fallbackAdapters)[a]),r.adapters[s].find(o,t,n).catch(function(t){return++a<n.fallbackAdapters.length?e(a):i.Promise.reject(t)})}(0)}else s=o.getAdapterName(n),f=r.adapters[s].find(o,t,n);c=f.then(function(e){return n.afterFind.call(e,n,e)}).then(function(e){if(delete a.pendingQueries[t],n.cacheResponse){var r=o.inject(e,n.orig());return a.completedQueries[t]=(new Date).getTime(),a.saved[t]=i.updateTimestamp(a.saved[t]),r}return o.createInstance(e,n.orig())}),l&&(a.pendingQueries[t]=c)}return c}).then(function(e){return i.respond(e,{adapter:s},n)}).catch(function(i){return a&&delete a.pendingQueries[t],r.errorFn("find",e,t,n)(i)})}},function(e,t){"use strict";e.exports=function(e,t,n){var r=this,i=r.utils,o=r.definitions[e],a=r.store[e],s=void 0,u=void 0;return new i.Promise(function(u,c){if(t=t||{},r.definitions[e])if(i._o(t)){n=i._(o,n),s=i.toJson(t),n.params&&(n.params=i.copy(n.params)),i.applyScope(o,t,n),!n.bypassCache&&n.cacheResponse||(delete a.completedQueries[s],delete a.queryData[s]);var l=n.maxAge&&s in a.completedQueries&&a.completedQueries[s]+n.maxAge<(new Date).getTime();s in a.completedQueries&&!l?n.useFilter?n.localKeys?u(o.getAll(n.localKeys,n.orig())):u(o.filter(t,n.orig())):u(a.queryData[s]):u()}else c(i._oErr("params"));else c(new r.errors.NER(e))}).then(function(c){if(c)return c;var l=void 0,f=i.isFunction(n.usePendingFindAll)?n.usePendingFindAll.call(this,e,t,n):n.usePendingFindAll;if(s in a.pendingQueries&&f)l=a.pendingQueries[s];else{var h=void 0;if("fallback"===(n.findAllStrategy||n.strategy)){h=function e(a){return u=o.getAdapterName((n.findAllFallbackAdapters||n.fallbackAdapters)[a]),r.adapters[u].findAll(o,t,n).catch(function(t){return++a<n.fallbackAdapters.length?e(a):i.Promise.reject(t)})}(0)}else u=o.getAdapterName(n),h=r.adapters[u].findAll(o,t,n);l=h.then(function(e){return n.afterFindAll.call(e,n,e)}).then(function(t){return delete a.pendingQueries[s],n.cacheResponse?(a.queryData[s]=function(e,t,n,r){var i=this.utils,o=this.definitions[t],a=this.store[t],s=o.idAttribute,u=(new Date).getTime();e=e||[],delete a.pendingQueries[n],a.completedQueries[n]=u;var c=o.inject(e,r.orig());return i._a(c)?i.forEach(c,function(e){if(e){var t=e[s];t&&(a.completedQueries[t]=u,a.saved[t]=i.updateTimestamp(a.saved[t]))}}):(r.errorFn("response is expected to be an array!"),a.completedQueries[c[s]]=u),c}.call(r,t,e,s,n),a.queryData[s].$$injected=!0,a.queryData[s]):(i.forEach(t,function(e,r){t[r]=o.createInstance(e,n.orig())}),t)}),f&&(a.pendingQueries[s]=l)}return l}).then(function(e){return i.respond(e,{adapter:u},n)}).catch(function(i){return a&&delete a.pendingQueries[s],r.errorFn("findAll",e,t,n)(i)})}},function(e,t){"use strict";function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}e.exports=function(e,t,r,i){var o=this.utils,a=this.errors,s=this.definitions[e],u=void 0;return new o.Promise(function(c,l){if(o._sn(t)&&(t=s.get(t)),o._s(r)&&(r=[r]),r=r||[],s)if(o._o(t))if(o._a(r)){u=o._(s,i);var f=[];o.forEach(s.relationList,function(e){var a=e.relation,c=s.getResource(a),l=o._(c,i);if(!r.length||o.contains(r,a)||o.contains(r,e.localField)){var h=void 0,d={};l.allowSimpleWhere?d[e.foreignKey]=t[s.idAttribute]:(d.where={},d.where[e.foreignKey]={"==":t[s.idAttribute]});var p=l.orig(),v=e.localKey?o.get(t,e.localKey):null,m=!(!v&&0!==v);if("function"==typeof e.load)h=e.load(s,e,t,p);else if("hasMany"===e.type){if(e.localKeys){delete d[e.foreignKey];var y=o.get(t,e.localKeys)||[];y=o._a(y)?y:o.keys(y),d.where=n({},c.idAttribute,{in:y}),p.localKeys=y}else e.foreignKeys&&(delete d[e.foreignKey],d.where=n({},e.foreignKeys,{contains:t[s.idAttribute]}));h=c.findAll(d,p)}else"hasOne"===e.type?e.localKey&&m?h=c.find(v,p):e.foreignKey&&(h=c.findAll(d,p).then(function(e){return e.length?e[0]:null})):m&&(h=c.find(v,p));h&&(u.linkRelations||(h=h.then(function(n){t[e.localField]=n})),f.push(h))}}),c(f)}else l(new a.IA('"relations" must be a string or an array!'));else l(new a.IA('"instance(id)" must be a string, number or object!'));else l(new a.NER(e))}).then(function(e){return o.Promise.all(e)}).then(function(){return u.afterLoadRelations.call(t,u,t)}).catch(this.errorFn("loadRelations",e,t,r,i))}},function(e,t){"use strict";e.exports=function(e,t){var n=this,r=n.utils,i=n.definitions[e],o=n.store[e];return new r.Promise(function(a,s){if(i){(t=r._(i,t)).hasOwnProperty("notify")||(t.notify=!1);for(var u=[],c=(new Date).getTime(),l=void 0;(l=o.expiresHeap.peek())&&l.expires<c;)u.push(l.item),delete l.item,o.expiresHeap.pop();a(u)}else s(new n.errors.NER(e))}).then(function(e){if(e.length&&(i.beforeReap(t,e),t.notify&&i.emit("DS.beforeReap",i,e)),"inject"===t.reapAction){var n=(new Date).getTime();r.forEach(e,function(e){o.expiresHeap.push({item:e,timestamp:n,expires:i.maxAge?n+i.maxAge:Number.MAX_VALUE})})}else if("eject"===t.reapAction)r.forEach(e,function(e){i.eject(e[i.idAttribute])});else if("refresh"===t.reapAction){var a=[];return r.forEach(e,function(e){a.push(i.refresh(e[i.idAttribute]))}),r.Promise.all(a)}return e}).then(function(e){return e.length&&(i.afterReap(t,e),t.notify&&i.emit("DS.afterReap",i,e)),e}).catch(n.errorFn("reap",e,t))}},function(e,t){"use strict";e.exports=function(e,t,n){var r=this,i=r.utils,o=r.errors,a=r.definitions[e],s=r.store[e],u=void 0,c=void 0,l=void 0;return new i.Promise(function(r,s){t=i.resolveId(a,t),a?i._sn(t)?a.get(t)?(u=a.get(t),n=i._(a,n),r(u)):s(new o.R('id "'+t+'" not found in cache!')):s(i._snErr("id")):s(new o.NER(e))}).then(function(e){return n.beforeValidate.call(e,n,e)}).then(function(e){return n.validate.call(e,n,e)}).then(function(e){return n.afterValidate.call(e,n,e)}).then(function(e){return n.beforeUpdate.call(e,n,e)}).then(function(e){if(n.notify&&a.emit("DS.beforeUpdate",a,e),n.changesOnly){s.observers[t]&&"function"==typeof s.observers[t]&&s.observers[t].deliver();var o=[],u=a.changes(t);for(var f in u.added)o.push(f);for(f in u.changed)o.push(f);if(i.forEach(n.always,function(e){o.push(e)}),u=i.pick(e,o),i.isEmpty(u))return c=!0,e;e=u}return l=a.getAdapterName(n),r.adapters[l].update(a,t,i.omit(e,n.omit),n)}).then(function(e){return n.afterUpdate.call(e,n,e)}).then(function(e){if(n.notify&&a.emit("DS.afterUpdate",a,e),c)return e;if(n.cacheResponse){var r=a.inject(e,n.orig());return s.saved[t]=i.updateTimestamp(s.saved[t]),a.resetHistoryOnInject||(s.previousAttributes[t]=i.copy(r,null,null,null,a.relationFields)),r}return a.createInstance(e,n.orig())}).then(function(e){return i.respond(e,{adapter:l},n)}).catch(r.errorFn("save",e,t,n))}},function(e,t){"use strict";e.exports=function(e,t,n,r){var i=this,o=i.utils,a=i.errors,s=i.definitions[e],u=void 0;return new o.Promise(function(i,u){t=o.resolveId(s,t),s?o._sn(t)?(r=o._(s,r),i(n)):u(o._snErr("id")):u(new a.NER(e))}).then(function(e){return r.beforeValidate.call(e,r,e)}).then(function(e){return r.validate.call(e,r,e)}).then(function(e){return r.afterValidate.call(e,r,e)}).then(function(e){return r.beforeUpdate.call(e,r,e)}).then(function(e){return r.notify&&s.emit("DS.beforeUpdate",s,e),u=s.getAdapterName(r),i.adapters[u].update(s,t,o.omit(e,r.omit),r)}).then(function(e){return r.afterUpdate.call(e,r,e)}).then(function(t){if(r.notify&&s.emit("DS.afterUpdate",s,t),r.cacheResponse){var n=s.inject(t,r.orig()),a=i.store[e],u=n[s.idAttribute];return a.saved[u]=o.updateTimestamp(a.saved[u]),s.resetHistoryOnInject||(a.previousAttributes[u]=o.copy(n,null,null,null,s.relationFields)),n}return s.createInstance(t,r.orig())}).then(function(e){return o.respond(e,{adapter:u},r)}).catch(i.errorFn("update",e,t,n,r))}},function(e,t){"use strict";e.exports=function(e,t,n,r){var i=this,o=i.utils,a=i.errors,s=i.definitions[e],u=void 0;return new o.Promise(function(i,u){s?(r=o._(s,r),o.applyScope(s,n,r),i(t)):u(new a.NER(e))}).then(function(e){return r.beforeValidate.call(e,r,e)}).then(function(e){return r.validate.call(e,r,e)}).then(function(e){return r.afterValidate.call(e,r,e)}).then(function(e){return r.beforeUpdate.call(e,r,e)}).then(function(e){return r.notify&&s.emit("DS.beforeUpdate",s,e),u=s.getAdapterName(r),i.adapters[u].updateAll(s,o.omit(e,r.omit),n,r)}).then(function(e){return r.afterUpdate.call(e,r,e)}).then(function(n){r.notify&&s.emit("DS.afterUpdate",s,t);var a=r.orig();if(r.cacheResponse){var u=s.inject(n,a),c=i.store[e];return o.forEach(u,function(e){var t=e[s.idAttribute];c.saved[t]=o.updateTimestamp(c.saved[t]),s.resetHistoryOnInject||(c.previousAttributes[t]=o.copy(e,null,null,null,s.relationFields))}),u}var l=[];return o.forEach(n,function(e){l.push(s.createInstance(e,a))}),l}).then(function(e){return o.respond(e,{adapter:u},r)}).catch(i.errorFn("updateAll",e,t,n,r))}}])},e.exports=r()},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t){var n=[][e];return!n||!r(function(){n.call(null,t||function(){throw 1},1)})}},function(e,t){e.exports=function(){}},function(e,t,n){e.exports=n(21)},function(e,t,n){var r=n(21),i=n(41),o=n(38),a=n(162),s=n(240),u=n(76),c=u.get,l=u.enforce,f=String(s).split("toString");n(95)("inspectSource",function(e){return s.call(e)}),(e.exports=function(e,t,n,s){var u=!!s&&!!s.unsafe,c=!!s&&!!s.enumerable,h=!!s&&!!s.noTargetGet;"function"==typeof n&&("string"!=typeof t||o(n,"name")||i(n,"name",t),l(n).source=f.join("string"==typeof t?t:"")),e!==r?(u?!h&&e[t]&&(c=!0):delete e[t],c?e[t]=n:i(e,t,n)):c?e[t]=n:a(t,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&c(this).source||s.call(this)})},function(e,t,n){var r=n(24),i=n(92),o=n(94),a=n(35),s=n(66),u=n(38),c=n(239),l=Object.getOwnPropertyDescriptor;t.f=r?l:function(e,t){if(e=a(e),t=s(t,!0),c)try{return l(e,t)}catch(e){}if(u(e,t))return o(!i.f.call(e,t),e[t])}},function(e,t,n){var r=n(43),i=n(4),o="[object AsyncFunction]",a="[object Function]",s="[object GeneratorFunction]",u="[object Proxy]";e.exports=function(e){if(!i(e))return!1;var t=r(e);return t==a||t==s||t==o||t==u}},function(e,t){e.exports=function(e){return void 0===e}},function(e,t,n){var r,i,o;ICAL=e.exports,ICAL.foldLength=75,ICAL.newLineChar="\r\n",ICAL.helpers={updateTimezones:function(e){var t,n,r,i,o,a;if(!e||"vcalendar"!==e.name)return e;for(t=e.getAllSubcomponents(),n=[],r={},o=0;o<t.length;o++)"vtimezone"===t[o].name?r[a=t[o].getFirstProperty("tzid").getFirstValue()]=t[o]:n=n.concat(t[o].getAllProperties());for(i={},o=0;o<n.length;o++)(a=n[o].getParameter("tzid"))&&(i[a]=!0);for(o in r)r.hasOwnProperty(o)&&!i[o]&&e.removeSubcomponent(r[o]);for(o in i)i.hasOwnProperty(o)&&!r[o]&&ICAL.TimezoneService.has(o)&&e.addSubcomponent(ICAL.TimezoneService.get(o).component);return e},isStrictlyNaN:function(e){return"number"==typeof e&&isNaN(e)},strictParseInt:function(e){var t=parseInt(e,10);if(ICAL.helpers.isStrictlyNaN(t))throw new Error('Could not extract integer from "'+e+'"');return t},formatClassType:function(e,t){if(void 0!==e)return e instanceof t?e:new t(e)},unescapedIndexOf:function(e,t,n){for(;-1!==(n=e.indexOf(t,n));){if(!(n>0&&"\\"===e[n-1]))return n;n+=1}return-1},binsearchInsert:function(e,t,n){if(!e.length)return 0;for(var r,i,o=0,a=e.length-1;o<=a;)if((i=n(t,e[r=o+Math.floor((a-o)/2)]))<0)a=r-1;else{if(!(i>0))break;o=r+1}return i<0?r:i>0?r+1:r},dumpn:function(){ICAL.debug&&("undefined"!=typeof console&&"log"in console?ICAL.helpers.dumpn=function(e){console.log(e)}:ICAL.helpers.dumpn=function(e){dump(e+"\n")},ICAL.helpers.dumpn(arguments[0]))},clone:function(e,t){if(e&&"object"==typeof e){if(e instanceof Date)return new Date(e.getTime());if("clone"in e)return e.clone();if(Array.isArray(e)){for(var n=[],r=0;r<e.length;r++)n.push(t?ICAL.helpers.clone(e[r],!0):e[r]);return n}var i={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(i[o]=t?ICAL.helpers.clone(e[o],!0):e[o]);return i}return e},foldline:function(e){for(var t="",n=e||"";n.length;)t+=ICAL.newLineChar+" "+n.substr(0,ICAL.foldLength),n=n.substr(ICAL.foldLength);return t.substr(ICAL.newLineChar.length+1)},pad2:function(e){switch("string"!=typeof e&&("number"==typeof e&&(e=parseInt(e)),e=String(e)),e.length){case 0:return"00";case 1:return"0"+e;default:return e}},trunc:function(e){return e<0?Math.ceil(e):Math.floor(e)},inherits:function(e,t,n){function r(){}r.prototype=e.prototype,t.prototype=new r,n&&ICAL.helpers.extend(n,t.prototype)},extend:function(e,t){for(var n in e){var r=Object.getOwnPropertyDescriptor(e,n);r&&!Object.getOwnPropertyDescriptor(t,n)&&Object.defineProperty(t,n,r)}return t}},ICAL.design=function(){"use strict";var e=/\\\\|\\,|\\[Nn]/g,t=/\\|,|\n/g;function n(e,t){return{matches:/.*/,fromICAL:function(t,n){return function(e,t,n){if(-1===e.indexOf("\\"))return e;n&&(t=new RegExp(t.source+"|\\\\"+n));return e.replace(t,d)}(t,e,n)},toICAL:function(e,n){var r=t;return n&&(r=new RegExp(r.source+"|"+n)),e.replace(r,function(e){switch(e){case"\\":return"\\\\";case";":return"\\;";case",":return"\\,";case"\n":return"\\n";default:return e}})}}}var r={defaultType:"text"},i={defaultType:"text",multiValue:","},o={defaultType:"text",structuredValue:";"},a={defaultType:"integer"},s={defaultType:"date-time",allowedTypes:["date-time","date"]},u={defaultType:"date-time"},c={defaultType:"uri"},l={defaultType:"utc-offset"},f={defaultType:"recur"},h={defaultType:"date-and-or-time",allowedTypes:["date-time","date","text"]};function d(e){switch(e){case"\\\\":return"\\";case"\\;":return";";case"\\,":return",";case"\\n":case"\\N":return"\n";default:return e}}var p={categories:i,url:c,version:r,uid:r},v={boolean:{values:["TRUE","FALSE"],fromICAL:function(e){switch(e){case"TRUE":return!0;case"FALSE":default:return!1}},toICAL:function(e){return e?"TRUE":"FALSE"}},float:{matches:/^[+-]?\d+\.\d+$/,fromICAL:function(e){var t=parseFloat(e);return ICAL.helpers.isStrictlyNaN(t)?0:t},toICAL:function(e){return String(e)}},integer:{fromICAL:function(e){var t=parseInt(e);return ICAL.helpers.isStrictlyNaN(t)?0:t},toICAL:function(e){return String(e)}},"utc-offset":{toICAL:function(e){return e.length<7?e.substr(0,3)+e.substr(4,2):e.substr(0,3)+e.substr(4,2)+e.substr(7,2)},fromICAL:function(e){return e.length<6?e.substr(0,3)+":"+e.substr(3,2):e.substr(0,3)+":"+e.substr(3,2)+":"+e.substr(5,2)},decorate:function(e){return ICAL.UtcOffset.fromString(e)},undecorate:function(e){return e.toString()}}},m=ICAL.helpers.extend(v,{text:n(/\\\\|\\;|\\,|\\[Nn]/g,/\\|;|,|\n/g),uri:{},binary:{decorate:function(e){return ICAL.Binary.fromString(e)},undecorate:function(e){return e.toString()}},"cal-address":{},date:{decorate:function(e,t){return T.strict?ICAL.Time.fromDateString(e,t):ICAL.Time.fromString(e,t)},undecorate:function(e){return e.toString()},fromICAL:function(e){return!T.strict&&e.length>=15?m["date-time"].fromICAL(e):e.substr(0,4)+"-"+e.substr(4,2)+"-"+e.substr(6,2)},toICAL:function(e){var t=e.length;return 10==t?e.substr(0,4)+e.substr(5,2)+e.substr(8,2):t>=19?m["date-time"].toICAL(e):e}},"date-time":{fromICAL:function(e){if(T.strict||8!=e.length){var t=e.substr(0,4)+"-"+e.substr(4,2)+"-"+e.substr(6,2)+"T"+e.substr(9,2)+":"+e.substr(11,2)+":"+e.substr(13,2);return e[15]&&"Z"===e[15]&&(t+="Z"),t}return m.date.fromICAL(e)},toICAL:function(e){var t=e.length;if(10!=t||T.strict){if(t>=19){var n=e.substr(0,4)+e.substr(5,2)+e.substr(8,5)+e.substr(14,2)+e.substr(17,2);return e[19]&&"Z"===e[19]&&(n+="Z"),n}return e}return m.date.toICAL(e)},decorate:function(e,t){return T.strict?ICAL.Time.fromDateTimeString(e,t):ICAL.Time.fromString(e,t)},undecorate:function(e){return e.toString()}},duration:{decorate:function(e){return ICAL.Duration.fromString(e)},undecorate:function(e){return e.toString()}},period:{fromICAL:function(e){var t=e.split("/");return t[0]=m["date-time"].fromICAL(t[0]),ICAL.Duration.isValueString(t[1])||(t[1]=m["date-time"].fromICAL(t[1])),t},toICAL:function(e){return T.strict||10!=e[0].length?e[0]=m["date-time"].toICAL(e[0]):e[0]=m.date.toICAL(e[0]),ICAL.Duration.isValueString(e[1])||(T.strict||10!=e[1].length?e[1]=m["date-time"].toICAL(e[1]):e[1]=m.date.toICAL(e[1])),e.join("/")},decorate:function(e,t){return ICAL.Period.fromJSON(e,t,!T.strict)},undecorate:function(e){return e.toJSON()}},recur:{fromICAL:function(e){return ICAL.Recur._stringToData(e,!0)},toICAL:function(e){var t="";for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=e[n];"until"==n?r=r.length>10?m["date-time"].toICAL(r):m.date.toICAL(r):"wkst"==n?"number"==typeof r&&(r=ICAL.Recur.numericDayToIcalDay(r)):Array.isArray(r)&&(r=r.join(",")),t+=n.toUpperCase()+"="+r+";"}return t.substr(0,t.length-1)},decorate:function(e){return ICAL.Recur.fromData(e)},undecorate:function(e){return e.toJSON()}},time:{fromICAL:function(e){if(e.length<6)return e;var t=e.substr(0,2)+":"+e.substr(2,2)+":"+e.substr(4,2);return"Z"===e[6]&&(t+="Z"),t},toICAL:function(e){if(e.length<8)return e;var t=e.substr(0,2)+e.substr(3,2)+e.substr(6,2);return"Z"===e[8]&&(t+="Z"),t}}}),y=ICAL.helpers.extend(p,{action:r,attach:{defaultType:"uri"},attendee:{defaultType:"cal-address"},calscale:r,class:r,comment:r,completed:u,contact:r,created:u,description:r,dtend:s,dtstamp:u,dtstart:s,due:s,duration:{defaultType:"duration"},exdate:{defaultType:"date-time",allowedTypes:["date-time","date"],multiValue:","},exrule:f,freebusy:{defaultType:"period",multiValue:","},geo:{defaultType:"float",structuredValue:";"},"last-modified":u,location:r,method:r,organizer:{defaultType:"cal-address"},"percent-complete":a,priority:a,prodid:r,"related-to":r,repeat:a,rdate:{defaultType:"date-time",allowedTypes:["date-time","date","period"],multiValue:",",detectType:function(e){return-1!==e.indexOf("/")?"period":-1===e.indexOf("T")?"date":"date-time"}},"recurrence-id":s,resources:i,"request-status":o,rrule:f,sequence:a,status:r,summary:r,transp:r,trigger:{defaultType:"duration",allowedTypes:["duration","date-time"]},tzoffsetfrom:l,tzoffsetto:l,tzurl:c,tzid:r,tzname:r}),g=ICAL.helpers.extend(v,{text:n(e,t),uri:n(e,t),date:{decorate:function(e){return ICAL.VCardTime.fromDateAndOrTimeString(e,"date")},undecorate:function(e){return e.toString()},fromICAL:function(e){return 8==e.length?m.date.fromICAL(e):"-"==e[0]&&6==e.length?e.substr(0,4)+"-"+e.substr(4):e},toICAL:function(e){return 10==e.length?m.date.toICAL(e):"-"==e[0]&&7==e.length?e.substr(0,4)+e.substr(5):e}},time:{decorate:function(e){return ICAL.VCardTime.fromDateAndOrTimeString("T"+e,"time")},undecorate:function(e){return e.toString()},fromICAL:function(e){var t=g.time._splitZone(e,!0),n=t[0],r=t[1];return 6==r.length?r=r.substr(0,2)+":"+r.substr(2,2)+":"+r.substr(4,2):4==r.length&&"-"!=r[0]?r=r.substr(0,2)+":"+r.substr(2,2):5==r.length&&(r=r.substr(0,3)+":"+r.substr(3,2)),5!=n.length||"-"!=n[0]&&"+"!=n[0]||(n=n.substr(0,3)+":"+n.substr(3)),r+n},toICAL:function(e){var t=g.time._splitZone(e),n=t[0],r=t[1];return 8==r.length?r=r.substr(0,2)+r.substr(3,2)+r.substr(6,2):5==r.length&&"-"!=r[0]?r=r.substr(0,2)+r.substr(3,2):6==r.length&&(r=r.substr(0,3)+r.substr(4,2)),6!=n.length||"-"!=n[0]&&"+"!=n[0]||(n=n.substr(0,3)+n.substr(4)),r+n},_splitZone:function(e,t){var n,r,i=e.length-1,o=e.length-(t?5:6),a=e[o];return"Z"==e[i]?(n=e[i],r=e.substr(0,i)):e.length>6&&("-"==a||"+"==a)?(n=e.substr(o),r=e.substr(0,o)):(n="",r=e),[n,r]}},"date-time":{decorate:function(e){return ICAL.VCardTime.fromDateAndOrTimeString(e,"date-time")},undecorate:function(e){return e.toString()},fromICAL:function(e){return g["date-and-or-time"].fromICAL(e)},toICAL:function(e){return g["date-and-or-time"].toICAL(e)}},"date-and-or-time":{decorate:function(e){return ICAL.VCardTime.fromDateAndOrTimeString(e,"date-and-or-time")},undecorate:function(e){return e.toString()},fromICAL:function(e){var t=e.split("T");return(t[0]?g.date.fromICAL(t[0]):"")+(t[1]?"T"+g.time.fromICAL(t[1]):"")},toICAL:function(e){var t=e.split("T");return g.date.toICAL(t[0])+(t[1]?"T"+g.time.toICAL(t[1]):"")}},timestamp:m["date-time"],"language-tag":{matches:/^[a-zA-Z0-9-]+$/}}),b=ICAL.helpers.extend(p,{adr:{defaultType:"text",structuredValue:";",multiValue:","},anniversary:h,bday:h,caladruri:c,caluri:c,clientpidmap:o,email:r,fburl:c,fn:r,gender:o,geo:c,impp:c,key:c,kind:r,lang:{defaultType:"language-tag"},logo:c,member:c,n:{defaultType:"text",structuredValue:";",multiValue:","},nickname:i,note:r,org:{defaultType:"text",structuredValue:";"},photo:c,related:c,rev:{defaultType:"timestamp"},role:r,sound:c,source:c,tel:{defaultType:"uri",allowedTypes:["uri","text"]},title:r,tz:{defaultType:"text",allowedTypes:["text","utc-offset","uri"]},xml:r}),w=ICAL.helpers.extend(v,{binary:m.binary,date:g.date,"date-time":g["date-time"],"phone-number":{},uri:m.uri,text:m.text,time:m.time,vcard:m.text,"utc-offset":{toICAL:function(e){return e.substr(0,7)},fromICAL:function(e){return e.substr(0,7)},decorate:function(e){return ICAL.UtcOffset.fromString(e)},undecorate:function(e){return e.toString()}}}),_=ICAL.helpers.extend(p,{fn:r,n:{defaultType:"text",structuredValue:";",multiValue:","},nickname:i,photo:{defaultType:"binary",allowedTypes:["binary","uri"]},bday:{defaultType:"date-time",allowedTypes:["date-time","date"],detectType:function(e){return-1===e.indexOf("T")?"date":"date-time"}},adr:{defaultType:"text",structuredValue:";",multiValue:","},label:r,tel:{defaultType:"phone-number"},email:r,mailer:r,tz:{defaultType:"utc-offset",allowedTypes:["utc-offset","text"]},geo:{defaultType:"float",structuredValue:";"},title:r,role:r,logo:{defaultType:"binary",allowedTypes:["binary","uri"]},agent:{defaultType:"vcard",allowedTypes:["vcard","text","uri"]},org:o,note:i,prodid:r,rev:{defaultType:"date-time",allowedTypes:["date-time","date"],detectType:function(e){return-1===e.indexOf("T")?"date":"date-time"}},"sort-string":r,sound:{defaultType:"binary",allowedTypes:["binary","uri"]},class:r,key:{defaultType:"binary",allowedTypes:["binary","text"]}}),k={value:m,param:{cutype:{values:["INDIVIDUAL","GROUP","RESOURCE","ROOM","UNKNOWN"],allowXName:!0,allowIanaToken:!0},"delegated-from":{valueType:"cal-address",multiValue:",",multiValueSeparateDQuote:!0},"delegated-to":{valueType:"cal-address",multiValue:",",multiValueSeparateDQuote:!0},encoding:{values:["8BIT","BASE64"]},fbtype:{values:["FREE","BUSY","BUSY-UNAVAILABLE","BUSY-TENTATIVE"],allowXName:!0,allowIanaToken:!0},member:{valueType:"cal-address",multiValue:",",multiValueSeparateDQuote:!0},partstat:{values:["NEEDS-ACTION","ACCEPTED","DECLINED","TENTATIVE","DELEGATED","COMPLETED","IN-PROCESS"],allowXName:!0,allowIanaToken:!0},range:{values:["THISLANDFUTURE"]},related:{values:["START","END"]},reltype:{values:["PARENT","CHILD","SIBLING"],allowXName:!0,allowIanaToken:!0},role:{values:["REQ-PARTICIPANT","CHAIR","OPT-PARTICIPANT","NON-PARTICIPANT"],allowXName:!0,allowIanaToken:!0},rsvp:{values:["TRUE","FALSE"]},"sent-by":{valueType:"cal-address"},tzid:{matches:/^\//},value:{values:["binary","boolean","cal-address","date","date-time","duration","float","integer","period","recur","text","time","uri","utc-offset"],allowXName:!0,allowIanaToken:!0}},property:y},x={value:g,param:{type:{valueType:"text",multiValue:","},value:{values:["text","uri","date","time","date-time","date-and-or-time","timestamp","boolean","integer","float","utc-offset","language-tag"],allowXName:!0,allowIanaToken:!0}},property:b},E={value:w,param:{type:{valueType:"text",multiValue:","},value:{values:["text","uri","date","date-time","phone-number","time","boolean","integer","float","utc-offset","vcard","binary"],allowXName:!0,allowIanaToken:!0}},property:_},T={strict:!0,defaultSet:k,defaultType:"unknown",components:{vcard:x,vcard3:E,vevent:k,vtodo:k,vjournal:k,valarm:k,vtimezone:k,daylight:k,standard:k},icalendar:k,vcard:x,vcard3:E,getDesignSet:function(e){return e&&e in T.components?T.components[e]:T.defaultSet}};return T}(),ICAL.stringify=function(){"use strict";var e="\r\n",t=ICAL.design,n=ICAL.helpers;function r(t){"string"==typeof t[0]&&(t=[t]);for(var n=0,i=t.length,o="";n<i;n++)o+=r.component(t[n])+e;return o}r.component=function(n,i){var o=n[0].toUpperCase(),a="BEGIN:"+o+e,s=n[1],u=0,c=s.length,l=n[0];for("vcard"===l&&n[1].length>0&&("version"!==n[1][0][0]||"4.0"!==n[1][0][3])&&(l="vcard3"),i=i||t.getDesignSet(l);u<c;u++)a+=r.property(s[u],i)+e;for(var f=n[2]||[],h=0,d=f.length;h<d;h++)a+=r.component(f[h],i)+e;return a+="END:"+o},r.property=function(e,n,i){var o,a=e[0].toUpperCase(),s=e[0],u=e[1],c=a;for(o in u){var l=u[o];if(u.hasOwnProperty(o))(d=o in n.param&&n.param[o].multiValue)&&Array.isArray(l)?(n.param[o].multiValueSeparateDQuote&&(d='"'+d+'"'),l=l.map(r._rfc6868Unescape),l=r.multiValue(l,d,"unknown",null,n)):l=r._rfc6868Unescape(l),c+=";"+o.toUpperCase(),c+="="+r.propertyValue(l)}if(3===e.length)return c+":";var f,h=e[2];n||(n=t.defaultSet);var d=!1,p=!1,v=!1;return s in n.property?("multiValue"in(f=n.property[s])&&(d=f.multiValue),"structuredValue"in f&&Array.isArray(e[3])&&(p=f.structuredValue),"defaultType"in f?h===f.defaultType&&(v=!0):"unknown"===h&&(v=!0)):"unknown"===h&&(v=!0),v||(c+=";VALUE="+h.toUpperCase()),c+=":",c+=d&&p?r.multiValue(e[3],p,h,d,n,p):d?r.multiValue(e.slice(3),d,h,null,n,!1):p?r.multiValue(e[3],p,h,null,n,p):r.value(e[3],h,n,!1),i?c:ICAL.helpers.foldline(c)},r.propertyValue=function(e){return-1===n.unescapedIndexOf(e,",")&&-1===n.unescapedIndexOf(e,":")&&-1===n.unescapedIndexOf(e,";")?e:'"'+e+'"'},r.multiValue=function(e,t,n,i,o,a){for(var s="",u=e.length,c=0;c<u;c++)i&&Array.isArray(e[c])?s+=r.multiValue(e[c],i,n,null,o,a):s+=r.value(e[c],n,o,a),c!==u-1&&(s+=t);return s},r.value=function(e,t,n,r){return t in n.value&&"toICAL"in n.value[t]?n.value[t].toICAL(e,r):e},r._rfc6868Unescape=function(e){return e.replace(/[\n^"]/g,function(e){return i[e]})};var i={'"':"^'","\n":"^n","^":"^^"};return r}(),ICAL.parse=function(){"use strict";var e=/[^ \t]/,t=ICAL.design,n=ICAL.helpers;function r(e){this.message=e,this.name="ParserError";try{throw new Error}catch(e){if(e.stack){var t=e.stack.split("\n");t.shift(),this.stack=t.join("\n")}}}function i(e){var t={},n=t.component=[];if(t.stack=[n],i._eachLine(e,function(e,n){i._handleContentLine(n,t)}),t.stack.length>1)throw new r("invalid ical body. component began but did not end");return t=null,1==n.length?n[0]:n}r.prototype=Error.prototype,i.property=function(e,n){var r={component:[[],[]],designSet:n||t.defaultSet};return i._handleContentLine(e,r),r.component[1][0]},i.component=function(e){return i(e)},i.ParserError=r,i._handleContentLine=function(e,n){var o,a,s,u,c,l,f=e.indexOf(":"),h=e.indexOf(";"),d={};if(-1!==h&&-1!==f&&h>f&&(h=-1),-1!==h){if(s=e.substring(0,h).toLowerCase(),-1==(c=i._parseParameters(e.substring(h),0,n.designSet))[2])throw new r("Invalid parameters in '"+e+"'");if(d=c[0],o=c[1].length+c[2]+h,-1===(a=e.substring(o).indexOf(":")))throw new r("Missing parameter value in '"+e+"'");u=e.substring(o+a+1)}else{if(-1===f)throw new r('invalid line (no token ";" or ":") "'+e+'"');if(s=e.substring(0,f).toLowerCase(),u=e.substring(f+1),"begin"===s){var p=[u.toLowerCase(),[],[]];return 1===n.stack.length?n.component.push(p):n.component[2].push(p),n.stack.push(n.component),n.component=p,void(n.designSet||(n.designSet=t.getDesignSet(n.component[0])))}if("end"===s)return void(n.component=n.stack.pop())}var v,m,y=!1,g=!1;s in n.designSet.property&&("multiValue"in(v=n.designSet.property[s])&&(y=v.multiValue),"structuredValue"in v&&(g=v.structuredValue),u&&"detectType"in v&&(l=v.detectType(u))),l||(l="value"in d?d.value.toLowerCase():v?v.defaultType:"unknown"),delete d.value,y&&g?m=[s,d,l,u=i._parseMultiValue(u,g,l,[],y,n.designSet,g)]:y?(m=[s,d,l],i._parseMultiValue(u,y,l,m,null,n.designSet,!1)):m=g?[s,d,l,u=i._parseMultiValue(u,g,l,[],null,n.designSet,g)]:[s,d,l,u=i._parseValue(u,l,n.designSet,!1)],"vcard"!==n.component[0]||0!==n.component[1].length||"version"===s&&"4.0"===u||(n.designSet=t.getDesignSet("vcard3")),n.component[1].push(m)},i._parseValue=function(e,t,n,r){return t in n.value&&"fromICAL"in n.value[t]?n.value[t].fromICAL(e,r):e},i._parseParameters=function(e,t,o){for(var a,s,u,c,l,f,h=t,d=0,p={},v=-1;!1!==d&&-1!==(d=n.unescapedIndexOf(e,"=",d+1));){if(0==(a=e.substr(h+1,d-h-1)).length)throw new r("Empty parameter name in '"+e+"'");if(f=!1,l=!1,c=(s=a.toLowerCase())in o.param&&o.param[s].valueType?o.param[s].valueType:"text",s in o.param&&(l=o.param[s].multiValue,o.param[s].multiValueSeparateDQuote&&(f=i._rfc6868Escape('"'+l+'"'))),'"'===e[d+1]){if(v=d+2,d=n.unescapedIndexOf(e,'"',v),l&&-1!=d)for(var m=!0;m;)e[d+1]==l&&'"'==e[d+2]?d=n.unescapedIndexOf(e,'"',d+3):m=!1;if(-1===d)throw new r('invalid line (no matching double quote) "'+e+'"');u=e.substr(v,d-v),-1===(h=n.unescapedIndexOf(e,";",d))&&(d=!1)}else{v=d+1;var y=n.unescapedIndexOf(e,";",v),g=n.unescapedIndexOf(e,":",v);-1!==g&&y>g?(y=g,d=!1):-1===y?(y=-1===g?e.length:g,d=!1):(h=y,d=y),u=e.substr(v,y-v)}if(u=i._rfc6868Escape(u),l){var b=f||l;u=i._parseMultiValue(u,b,c,[],null,o)}else u=i._parseValue(u,c,o);l&&s in p?Array.isArray(p[s])?p[s].push(u):p[s]=[p[s],u]:p[s]=u}return[p,u,v]},i._rfc6868Escape=function(e){return e.replace(/\^['n^]/g,function(e){return o[e]})};var o={"^'":'"',"^n":"\n","^^":"^"};return i._parseMultiValue=function(e,t,r,o,a,s,u){var c,l=0,f=0;if(0===t.length)return e;for(;-1!==(l=n.unescapedIndexOf(e,t,f));)c=e.substr(f,l-f),c=a?i._parseMultiValue(c,a,r,[],null,s,u):i._parseValue(c,r,s,u),o.push(c),f=l+t.length;return c=e.substr(f),c=a?i._parseMultiValue(c,a,r,[],null,s,u):i._parseValue(c,r,s,u),o.push(c),1==o.length?o[0]:o},i._eachLine=function(t,n){var r,i,o,a=t.length,s=t.search(e),u=s;do{o=(u=t.indexOf("\n",s)+1)>1&&"\r"===t[u-2]?2:1,0===u&&(u=a,o=0)," "===(i=t[s])||"\t"===i?r+=t.substr(s+1,u-s-(o+1)):(r&&n(null,r),r=t.substr(s,u-s-o)),s=u}while(u!==a);(r=r.trim()).length&&n(null,r)},i}(),ICAL.Component=function(){"use strict";function e(e,t){"string"==typeof e&&(e=[e,[],[]]),this.jCal=e,this.parent=t||null}return e.prototype={_hydratedPropertyCount:0,_hydratedComponentCount:0,get name(){return this.jCal[0]},get _designSet(){return this.parent&&this.parent._designSet||ICAL.design.getDesignSet(this.name)},_hydrateComponent:function(t){if(this._components||(this._components=[],this._hydratedComponentCount=0),this._components[t])return this._components[t];var n=new e(this.jCal[2][t],this);return this._hydratedComponentCount++,this._components[t]=n},_hydrateProperty:function(e){if(this._properties||(this._properties=[],this._hydratedPropertyCount=0),this._properties[e])return this._properties[e];var t=new ICAL.Property(this.jCal[1][e],this);return this._hydratedPropertyCount++,this._properties[e]=t},getFirstSubcomponent:function(e){if(e)for(var t=0,n=this.jCal[2],r=n.length;t<r;t++){if(n[t][0]===e)return this._hydrateComponent(t)}else if(this.jCal[2].length)return this._hydrateComponent(0);return null},getAllSubcomponents:function(e){var t=this.jCal[2].length,n=0;if(e){for(var r=this.jCal[2],i=[];n<t;n++)e===r[n][0]&&i.push(this._hydrateComponent(n));return i}if(!this._components||this._hydratedComponentCount!==t)for(;n<t;n++)this._hydrateComponent(n);return this._components||[]},hasProperty:function(e){for(var t=this.jCal[1],n=t.length,r=0;r<n;r++)if(t[r][0]===e)return!0;return!1},getFirstProperty:function(e){if(e)for(var t=0,n=this.jCal[1],r=n.length;t<r;t++){if(n[t][0]===e)return this._hydrateProperty(t)}else if(this.jCal[1].length)return this._hydrateProperty(0);return null},getFirstPropertyValue:function(e){var t=this.getFirstProperty(e);return t?t.getFirstValue():null},getAllProperties:function(e){var t=this.jCal[1].length,n=0;if(e){for(var r=this.jCal[1],i=[];n<t;n++)e===r[n][0]&&i.push(this._hydrateProperty(n));return i}if(!this._properties||this._hydratedPropertyCount!==t)for(;n<t;n++)this._hydrateProperty(n);return this._properties||[]},_removeObjectByIndex:function(e,t,n){if((t=t||[])[n]){var r=t[n];"parent"in r&&(r.parent=null)}t.splice(n,1),this.jCal[e].splice(n,1)},_removeObject:function(e,t,n){var r=0,i=this.jCal[e],o=i.length,a=this[t];if("string"==typeof n){for(;r<o;r++)if(i[r][0]===n)return this._removeObjectByIndex(e,a,r),!0}else if(a)for(;r<o;r++)if(a[r]&&a[r]===n)return this._removeObjectByIndex(e,a,r),!0;return!1},_removeAllObjects:function(e,t,n){for(var r=this[t],i=this.jCal[e],o=i.length-1;o>=0;o--)n&&i[o][0]!==n||this._removeObjectByIndex(e,r,o)},addSubcomponent:function(e){this._components||(this._components=[],this._hydratedComponentCount=0),e.parent&&e.parent.removeSubcomponent(e);var t=this.jCal[2].push(e.jCal);return this._components[t-1]=e,this._hydratedComponentCount++,e.parent=this,e},removeSubcomponent:function(e){var t=this._removeObject(2,"_components",e);return t&&this._hydratedComponentCount--,t},removeAllSubcomponents:function(e){var t=this._removeAllObjects(2,"_components",e);return this._hydratedComponentCount=0,t},addProperty:function(e){if(!(e instanceof ICAL.Property))throw new TypeError("must instance of ICAL.Property");this._properties||(this._properties=[],this._hydratedPropertyCount=0),e.parent&&e.parent.removeProperty(e);var t=this.jCal[1].push(e.jCal);return this._properties[t-1]=e,this._hydratedPropertyCount++,e.parent=this,e},addPropertyWithValue:function(e,t){var n=new ICAL.Property(e);return n.setValue(t),this.addProperty(n),n},updatePropertyWithValue:function(e,t){var n=this.getFirstProperty(e);return n?n.setValue(t):n=this.addPropertyWithValue(e,t),n},removeProperty:function(e){var t=this._removeObject(1,"_properties",e);return t&&this._hydratedPropertyCount--,t},removeAllProperties:function(e){var t=this._removeAllObjects(1,"_properties",e);return this._hydratedPropertyCount=0,t},toJSON:function(){return this.jCal},toString:function(){return ICAL.stringify.component(this.jCal,this._designSet)}},e.fromString=function(t){return new e(ICAL.parse.component(t))},e}(),ICAL.Property=function(){"use strict";var e=2,t=ICAL.design;function n(n,r){this._parent=r||null,"string"==typeof n?(this.jCal=[n,{},t.defaultType],this.jCal[e]=this.getDefaultType()):this.jCal=n,this._updateType()}return n.prototype={get type(){return this.jCal[e]},get name(){return this.jCal[0]},get parent(){return this._parent},set parent(n){var r=!this._parent||n&&n._designSet!=this._parent._designSet;return this._parent=n,this.type==t.defaultType&&r&&(this.jCal[e]=this.getDefaultType(),this._updateType()),n},get _designSet(){return this.parent?this.parent._designSet:t.defaultSet},_updateType:function(){var e=this._designSet;if(this.type in e.value){e.value[this.type];"decorate"in e.value[this.type]?this.isDecorated=!0:this.isDecorated=!1,this.name in e.property&&(this.isMultiValue="multiValue"in e.property[this.name],this.isStructuredValue="structuredValue"in e.property[this.name])}},_hydrateValue:function(e){return this._values&&this._values[e]?this._values[e]:this.jCal.length<=3+e?null:this.isDecorated?(this._values||(this._values=[]),this._values[e]=this._decorate(this.jCal[3+e])):this.jCal[3+e]},_decorate:function(e){return this._designSet.value[this.type].decorate(e,this)},_undecorate:function(e){return this._designSet.value[this.type].undecorate(e,this)},_setDecoratedValue:function(e,t){this._values||(this._values=[]),"object"==typeof e&&"icaltype"in e?(this.jCal[3+t]=this._undecorate(e),this._values[t]=e):(this.jCal[3+t]=e,this._values[t]=this._decorate(e))},getParameter:function(e){return e in this.jCal[1]?this.jCal[1][e]:void 0},getFirstParameter:function(e){var t=this.getParameter(e);return Array.isArray(t)?t[0]:t},setParameter:function(e,t){var n=e.toLowerCase();"string"==typeof t&&n in this._designSet.param&&"multiValue"in this._designSet.param[n]&&(t=[t]),this.jCal[1][e]=t},removeParameter:function(e){delete this.jCal[1][e]},getDefaultType:function(){var e=this.jCal[0],n=this._designSet;if(e in n.property){var r=n.property[e];if("defaultType"in r)return r.defaultType}return t.defaultType},resetType:function(t){this.removeAllValues(),this.jCal[e]=t,this._updateType()},getFirstValue:function(){return this._hydrateValue(0)},getValues:function(){var e=this.jCal.length-3;if(e<1)return[];for(var t=0,n=[];t<e;t++)n[t]=this._hydrateValue(t);return n},removeAllValues:function(){this._values&&(this._values.length=0),this.jCal.length=3},setValues:function(e){if(!this.isMultiValue)throw new Error(this.name+": does not not support mulitValue.\noverride isMultiValue");var t=e.length,n=0;if(this.removeAllValues(),t>0&&"object"==typeof e[0]&&"icaltype"in e[0]&&this.resetType(e[0].icaltype),this.isDecorated)for(;n<t;n++)this._setDecoratedValue(e[n],n);else for(;n<t;n++)this.jCal[3+n]=e[n]},setValue:function(e){this.removeAllValues(),"object"==typeof e&&"icaltype"in e&&this.resetType(e.icaltype),this.isDecorated?this._setDecoratedValue(e,0):this.jCal[3]=e},toJSON:function(){return this.jCal},toICALString:function(){return ICAL.stringify.property(this.jCal,this._designSet,!0)}},n.fromString=function(e,t){return new n(ICAL.parse.property(e,t))},n}(),ICAL.UtcOffset=function(){function e(e){this.fromData(e)}return e.prototype={hours:0,minutes:0,factor:1,icaltype:"utc-offset",clone:function(){return ICAL.UtcOffset.fromSeconds(this.toSeconds())},fromData:function(e){if(e)for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);this._normalize()},fromSeconds:function(e){var t=Math.abs(e);return this.factor=e<0?-1:1,this.hours=ICAL.helpers.trunc(t/3600),t-=3600*this.hours,this.minutes=ICAL.helpers.trunc(t/60),this},toSeconds:function(){return this.factor*(60*this.minutes+3600*this.hours)},compare:function(e){var t=this.toSeconds(),n=e.toSeconds();return(t>n)-(n>t)},_normalize:function(){for(var e=this.toSeconds(),t=this.factor;e<-43200;)e+=97200;for(;e>50400;)e-=97200;this.fromSeconds(e),0==e&&(this.factor=t)},toICALString:function(){return ICAL.design.icalendar.value["utc-offset"].toICAL(this.toString())},toString:function(){return(1==this.factor?"+":"-")+ICAL.helpers.pad2(this.hours)+":"+ICAL.helpers.pad2(this.minutes)}},e.fromString=function(e){var t={};return t.factor="+"===e[0]?1:-1,t.hours=ICAL.helpers.strictParseInt(e.substr(1,2)),t.minutes=ICAL.helpers.strictParseInt(e.substr(4,2)),new ICAL.UtcOffset(t)},e.fromSeconds=function(t){var n=new e;return n.fromSeconds(t),n},e}(),ICAL.Binary=function(){function e(e){this.value=e}return e.prototype={icaltype:"binary",decodeValue:function(){return this._b64_decode(this.value)},setEncodedValue:function(e){this.value=this._b64_encode(e)},_b64_encode:function(e){var t,n,r,i,o,a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",s=0,u=0,c="",l=[];if(!e)return e;do{t=(o=e.charCodeAt(s++)<<16|e.charCodeAt(s++)<<8|e.charCodeAt(s++))>>18&63,n=o>>12&63,r=o>>6&63,i=63&o,l[u++]=a.charAt(t)+a.charAt(n)+a.charAt(r)+a.charAt(i)}while(s<e.length);c=l.join("");var f=e.length%3;return(f?c.slice(0,f-3):c)+"===".slice(f||3)},_b64_decode:function(e){var t,n,r,i,o,a,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",u=0,c=0,l=[];if(!e)return e;e+="";do{t=(a=s.indexOf(e.charAt(u++))<<18|s.indexOf(e.charAt(u++))<<12|(i=s.indexOf(e.charAt(u++)))<<6|(o=s.indexOf(e.charAt(u++))))>>16&255,n=a>>8&255,r=255&a,l[c++]=64==i?String.fromCharCode(t):64==o?String.fromCharCode(t,n):String.fromCharCode(t,n,r)}while(u<e.length);return l.join("")},toString:function(){return this.value}},e.fromString=function(t){return new e(t)},e}(),ICAL.Period=function(e){if(this.wrappedJSObject=this,e&&"start"in e){if(e.start&&!(e.start instanceof ICAL.Time))throw new TypeError(".start must be an instance of ICAL.Time");this.start=e.start}if(e&&e.end&&e.duration)throw new Error("cannot accept both end and duration");if(e&&"end"in e){if(e.end&&!(e.end instanceof ICAL.Time))throw new TypeError(".end must be an instance of ICAL.Time");this.end=e.end}if(e&&"duration"in e){if(e.duration&&!(e.duration instanceof ICAL.Duration))throw new TypeError(".duration must be an instance of ICAL.Duration");this.duration=e.duration}},ICAL.Period.prototype={start:null,end:null,duration:null,icalclass:"icalperiod",icaltype:"period",clone:function(){return ICAL.Period.fromData({start:this.start?this.start.clone():null,end:this.end?this.end.clone():null,duration:this.duration?this.duration.clone():null})},getDuration:function(){return this.duration?this.duration:this.end.subtractDate(this.start)},getEnd:function(){if(this.end)return this.end;var e=this.start.clone();return e.addDuration(this.duration),e},toString:function(){return this.start+"/"+(this.end||this.duration)},toJSON:function(){return[this.start.toString(),(this.end||this.duration).toString()]},toICALString:function(){return this.start.toICALString()+"/"+(this.end||this.duration).toICALString()}},ICAL.Period.fromString=function(e,t){var n=e.split("/");if(2!==n.length)throw new Error('Invalid string value: "'+e+'" must contain a "/" char.');var r={start:ICAL.Time.fromDateTimeString(n[0],t)},i=n[1];return ICAL.Duration.isValueString(i)?r.duration=ICAL.Duration.fromString(i):r.end=ICAL.Time.fromDateTimeString(i,t),new ICAL.Period(r)},ICAL.Period.fromData=function(e){return new ICAL.Period(e)},ICAL.Period.fromJSON=function(e,t,n){function r(e,t){return n?ICAL.Time.fromString(e,t):ICAL.Time.fromDateTimeString(e,t)}return ICAL.Duration.isValueString(e[1])?ICAL.Period.fromData({start:r(e[0],t),duration:ICAL.Duration.fromString(e[1])}):ICAL.Period.fromData({start:r(e[0],t),end:r(e[1],t)})},function(){var e=/([PDWHMTS]{1,1})/;function t(e,t,n){var r;switch(e){case"P":n.isNegative=!(!t||"-"!==t);break;case"D":r="days";break;case"W":r="weeks";break;case"H":r="hours";break;case"M":r="minutes";break;case"S":r="seconds";break;default:return 0}if(r){if(!t&&0!==t)throw new Error('invalid duration value: Missing number before "'+e+'"');var i=parseInt(t,10);if(ICAL.helpers.isStrictlyNaN(i))throw new Error('invalid duration value: Invalid number "'+t+'" before "'+e+'"');n[r]=i}return 1}ICAL.Duration=function(e){this.wrappedJSObject=this,this.fromData(e)},ICAL.Duration.prototype={weeks:0,days:0,hours:0,minutes:0,seconds:0,isNegative:!1,icalclass:"icalduration",icaltype:"duration",clone:function(){return ICAL.Duration.fromData(this)},toSeconds:function(){var e=this.seconds+60*this.minutes+3600*this.hours+86400*this.days+604800*this.weeks;return this.isNegative?-e:e},fromSeconds:function(e){var t=Math.abs(e);return this.isNegative=e<0,this.days=ICAL.helpers.trunc(t/86400),this.days%7==0?(this.weeks=this.days/7,this.days=0):this.weeks=0,t-=86400*(this.days+7*this.weeks),this.hours=ICAL.helpers.trunc(t/3600),t-=3600*this.hours,this.minutes=ICAL.helpers.trunc(t/60),t-=60*this.minutes,this.seconds=t,this},fromData:function(e){var t=["weeks","days","hours","minutes","seconds","isNegative"];for(var n in t)if(t.hasOwnProperty(n)){var r=t[n];this[r]=e&&r in e?e[r]:0}},reset:function(){this.isNegative=!1,this.weeks=0,this.days=0,this.hours=0,this.minutes=0,this.seconds=0},compare:function(e){var t=this.toSeconds(),n=e.toSeconds();return(t>n)-(t<n)},normalize:function(){this.fromSeconds(this.toSeconds())},toString:function(){if(0==this.toSeconds())return"PT0S";var e="";return this.isNegative&&(e+="-"),e+="P",this.weeks&&(e+=this.weeks+"W"),this.days&&(e+=this.days+"D"),(this.hours||this.minutes||this.seconds)&&(e+="T",this.hours&&(e+=this.hours+"H"),this.minutes&&(e+=this.minutes+"M"),this.seconds&&(e+=this.seconds+"S")),e},toICALString:function(){return this.toString()}},ICAL.Duration.fromSeconds=function(e){return(new ICAL.Duration).fromSeconds(e)},ICAL.Duration.isValueString=function(e){return"P"===e[0]||"P"===e[1]},ICAL.Duration.fromString=function(n){for(var r=0,i=Object.create(null),o=0;-1!==(r=n.search(e));){var a=n[r],s=n.substr(0,r);n=n.substr(r+1),o+=t(a,s,i)}if(o<2)throw new Error('invalid duration value: Not enough duration components in "'+n+'"');return new ICAL.Duration(i)},ICAL.Duration.fromData=function(e){return new ICAL.Duration(e)}}(),r=["tzid","location","tznames","latitude","longitude"],ICAL.Timezone=function(e){this.wrappedJSObject=this,this.fromData(e)},ICAL.Timezone.prototype={tzid:"",location:"",tznames:"",latitude:0,longitude:0,component:null,expandedUntilYear:0,icalclass:"icaltimezone",fromData:function(e){if(this.expandedUntilYear=0,this.changes=[],e instanceof ICAL.Component)this.component=e;else{if(e&&"component"in e)if("string"==typeof e.component){var t=ICAL.parse(e.component);this.component=new ICAL.Component(t)}else e.component instanceof ICAL.Component?this.component=e.component:this.component=null;for(var n in r)if(r.hasOwnProperty(n)){var i=r[n];e&&i in e&&(this[i]=e[i])}}return this.component instanceof ICAL.Component&&!this.tzid&&(this.tzid=this.component.getFirstPropertyValue("tzid")),this},utcOffset:function(e){if(this==ICAL.Timezone.utcTimezone||this==ICAL.Timezone.localTimezone)return 0;if(this._ensureCoverage(e.year),!this.changes.length)return 0;for(var t={year:e.year,month:e.month,day:e.day,hour:e.hour,minute:e.minute,second:e.second},n=this._findNearbyChange(t),r=-1,i=1;;){var o=ICAL.helpers.clone(this.changes[n],!0);if(o.utcOffset<o.prevUtcOffset?ICAL.Timezone.adjust_change(o,0,0,0,o.utcOffset):ICAL.Timezone.adjust_change(o,0,0,0,o.prevUtcOffset),ICAL.Timezone._compare_change_fn(t,o)>=0?r=n:i=-1,-1==i&&-1!=r)break;if((n+=i)<0)return 0;if(n>=this.changes.length)break}var a=this.changes[r];if(a.utcOffset-a.prevUtcOffset<0&&r>0){var s=ICAL.helpers.clone(a,!0);if(ICAL.Timezone.adjust_change(s,0,0,0,s.prevUtcOffset),ICAL.Timezone._compare_change_fn(t,s)<0){var u=this.changes[r-1];0!=a.is_daylight&&0==u.is_daylight&&(a=u)}}return a.utcOffset},_findNearbyChange:function(e){var t=ICAL.helpers.binsearchInsert(this.changes,e,ICAL.Timezone._compare_change_fn);return t>=this.changes.length?this.changes.length-1:t},_ensureCoverage:function(e){if(-1==ICAL.Timezone._minimumExpansionYear){var t=ICAL.Time.now();ICAL.Timezone._minimumExpansionYear=t.year}var n=e;if(n<ICAL.Timezone._minimumExpansionYear&&(n=ICAL.Timezone._minimumExpansionYear),(n+=ICAL.Timezone.EXTRA_COVERAGE)>ICAL.Timezone.MAX_YEAR&&(n=ICAL.Timezone.MAX_YEAR),!this.changes.length||this.expandedUntilYear<e){for(var r=this.component.getAllSubcomponents(),i=r.length,o=0;o<i;o++)this._expandComponent(r[o],n,this.changes);this.changes.sort(ICAL.Timezone._compare_change_fn),this.expandedUntilYear=n}},_expandComponent:function(e,t,n){if(!e.hasProperty("dtstart")||!e.hasProperty("tzoffsetto")||!e.hasProperty("tzoffsetfrom"))return null;var r,i=e.getFirstProperty("dtstart").getFirstValue();function o(e){return e.factor*(3600*e.hours+60*e.minutes)}function a(){var t={};return t.is_daylight="daylight"==e.name,t.utcOffset=o(e.getFirstProperty("tzoffsetto").getFirstValue()),t.prevUtcOffset=o(e.getFirstProperty("tzoffsetfrom").getFirstValue()),t}if(e.hasProperty("rrule")||e.hasProperty("rdate")){var s=e.getAllProperties("rdate");for(var u in s)if(s.hasOwnProperty(u)){var c=s[u].getFirstValue();(r=a()).year=c.year,r.month=c.month,r.day=c.day,c.isDate?(r.hour=i.hour,r.minute=i.minute,r.second=i.second,i.zone!=ICAL.Timezone.utcTimezone&&ICAL.Timezone.adjust_change(r,0,0,0,-r.prevUtcOffset)):(r.hour=c.hour,r.minute=c.minute,r.second=c.second,c.zone!=ICAL.Timezone.utcTimezone&&ICAL.Timezone.adjust_change(r,0,0,0,-r.prevUtcOffset)),n.push(r)}var l=e.getFirstProperty("rrule");if(l){l=l.getFirstValue(),r=a(),l.until&&l.until.zone==ICAL.Timezone.utcTimezone&&(l.until.adjust(0,0,0,r.prevUtcOffset),l.until.zone=ICAL.Timezone.localTimezone);for(var f,h=l.iterator(i);(f=h.next())&&(r=a(),!(f.year>t)&&f);)r.year=f.year,r.month=f.month,r.day=f.day,r.hour=f.hour,r.minute=f.minute,r.second=f.second,r.isDate=f.isDate,ICAL.Timezone.adjust_change(r,0,0,0,-r.prevUtcOffset),n.push(r)}}else(r=a()).year=i.year,r.month=i.month,r.day=i.day,r.hour=i.hour,r.minute=i.minute,r.second=i.second,ICAL.Timezone.adjust_change(r,0,0,0,-r.prevUtcOffset),n.push(r);return n},toString:function(){return this.tznames?this.tznames:this.tzid}},ICAL.Timezone._compare_change_fn=function(e,t){return e.year<t.year?-1:e.year>t.year?1:e.month<t.month?-1:e.month>t.month?1:e.day<t.day?-1:e.day>t.day?1:e.hour<t.hour?-1:e.hour>t.hour?1:e.minute<t.minute?-1:e.minute>t.minute?1:e.second<t.second?-1:e.second>t.second?1:0},ICAL.Timezone.convert_time=function(e,t,n){if(e.isDate||t.tzid==n.tzid||t==ICAL.Timezone.localTimezone||n==ICAL.Timezone.localTimezone)return e.zone=n,e;var r=t.utcOffset(e);return e.adjust(0,0,0,-r),r=n.utcOffset(e),e.adjust(0,0,0,r),null},ICAL.Timezone.fromData=function(e){return(new ICAL.Timezone).fromData(e)},ICAL.Timezone.utcTimezone=ICAL.Timezone.fromData({tzid:"UTC"}),ICAL.Timezone.localTimezone=ICAL.Timezone.fromData({tzid:"floating"}),ICAL.Timezone.adjust_change=function(e,t,n,r,i){return ICAL.Time.prototype.adjust.call(e,t,n,r,i,e)},ICAL.Timezone._minimumExpansionYear=-1,ICAL.Timezone.MAX_YEAR=2035,ICAL.Timezone.EXTRA_COVERAGE=5,ICAL.TimezoneService=((o={get count(){return Object.keys(i).length},reset:function(){i=Object.create(null);var e=ICAL.Timezone.utcTimezone;i.Z=e,i.UTC=e,i.GMT=e},has:function(e){return!!i[e]},get:function(e){return i[e]},register:function(e,t){if(e instanceof ICAL.Component&&"vtimezone"===e.name&&(e=(t=new ICAL.Timezone(e)).tzid),!(t instanceof ICAL.Timezone))throw new TypeError("timezone must be ICAL.Timezone or ICAL.Component");i[e]=t},remove:function(e){return delete i[e]}}).reset(),o),ICAL.Time=function(e,t){this.wrappedJSObject=this;var n=this._time=Object.create(null);n.year=0,n.month=1,n.day=1,n.hour=0,n.minute=0,n.second=0,n.isDate=!1,this.fromData(e,t)},ICAL.Time._dowCache={},ICAL.Time._wnCache={},ICAL.Time.prototype={icalclass:"icaltime",_cachedUnixTime:null,get icaltype(){return this.isDate?"date":"date-time"},zone:null,_pendingNormalization:!1,clone:function(){return new ICAL.Time(this._time,this.zone)},reset:function(){this.fromData(ICAL.Time.epochTime),this.zone=ICAL.Timezone.utcTimezone},resetTo:function(e,t,n,r,i,o,a){this.fromData({year:e,month:t,day:n,hour:r,minute:i,second:o,zone:a})},fromJSDate:function(e,t){return e?t?(this.zone=ICAL.Timezone.utcTimezone,this.year=e.getUTCFullYear(),this.month=e.getUTCMonth()+1,this.day=e.getUTCDate(),this.hour=e.getUTCHours(),this.minute=e.getUTCMinutes(),this.second=e.getUTCSeconds()):(this.zone=ICAL.Timezone.localTimezone,this.year=e.getFullYear(),this.month=e.getMonth()+1,this.day=e.getDate(),this.hour=e.getHours(),this.minute=e.getMinutes(),this.second=e.getSeconds()):this.reset(),this._cachedUnixTime=null,this},fromData:function(e,t){if(e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if("icaltype"===n)continue;this[n]=e[n]}if(t&&(this.zone=t),!e||"isDate"in e?e&&"isDate"in e&&(this.isDate=e.isDate):this.isDate=!("hour"in e),e&&"timezone"in e){var r=ICAL.TimezoneService.get(e.timezone);this.zone=r||ICAL.Timezone.localTimezone}return e&&"zone"in e&&(this.zone=e.zone),this.zone||(this.zone=ICAL.Timezone.localTimezone),this._cachedUnixTime=null,this},dayOfWeek:function(e){var t=e||ICAL.Time.SUNDAY,n=(this.year<<12)+(this.month<<8)+(this.day<<3)+t;if(n in ICAL.Time._dowCache)return ICAL.Time._dowCache[n];var r=this.day,i=this.month+(this.month<3?12:0),o=this.year-(this.month<3?1:0),a=r+o+ICAL.helpers.trunc(26*(i+1)/10)+ICAL.helpers.trunc(o/4);return a=((a+=6*ICAL.helpers.trunc(o/100)+ICAL.helpers.trunc(o/400))+7-t)%7+1,ICAL.Time._dowCache[n]=a,a},dayOfYear:function(){var e=ICAL.Time.isLeapYear(this.year)?1:0;return ICAL.Time.daysInYearPassedMonth[e][this.month-1]+this.day},startOfWeek:function(e){var t=e||ICAL.Time.SUNDAY,n=this.clone();return n.day-=(this.dayOfWeek()+7-t)%7,n.isDate=!0,n.hour=0,n.minute=0,n.second=0,n},endOfWeek:function(e){var t=e||ICAL.Time.SUNDAY,n=this.clone();return n.day+=(7-this.dayOfWeek()+t-ICAL.Time.SUNDAY)%7,n.isDate=!0,n.hour=0,n.minute=0,n.second=0,n},startOfMonth:function(){var e=this.clone();return e.day=1,e.isDate=!0,e.hour=0,e.minute=0,e.second=0,e},endOfMonth:function(){var e=this.clone();return e.day=ICAL.Time.daysInMonth(e.month,e.year),e.isDate=!0,e.hour=0,e.minute=0,e.second=0,e},startOfYear:function(){var e=this.clone();return e.day=1,e.month=1,e.isDate=!0,e.hour=0,e.minute=0,e.second=0,e},endOfYear:function(){var e=this.clone();return e.day=31,e.month=12,e.isDate=!0,e.hour=0,e.minute=0,e.second=0,e},startDoyWeek:function(e){var t=e||ICAL.Time.SUNDAY,n=this.dayOfWeek()-t;return n<0&&(n+=7),this.dayOfYear()-n},getDominicalLetter:function(){return ICAL.Time.getDominicalLetter(this.year)},nthWeekDay:function(e,t){var n,r=ICAL.Time.daysInMonth(this.month,this.year),i=t,o=0,a=this.clone();if(i>=0){a.day=1,0!=i&&i--,o=a.day;var s=e-a.dayOfWeek();s<0&&(s+=7),o+=s,o-=e,n=e}else a.day=r,i++,(n=a.dayOfWeek()-e)<0&&(n+=7),n=r-n;return o+(n+=7*i)},isNthWeekDay:function(e,t){var n=this.dayOfWeek();return 0===t&&n===e||this.nthWeekDay(e,t)===this.day},weekNumber:function(e){var t,n=(this.year<<12)+(this.month<<8)+(this.day<<3)+e;if(n in ICAL.Time._wnCache)return ICAL.Time._wnCache[n];var r=this.clone();r.isDate=!0;var i=this.year;12==r.month&&r.day>25?(t=ICAL.Time.weekOneStarts(i+1,e),r.compare(t)<0?t=ICAL.Time.weekOneStarts(i,e):i++):(t=ICAL.Time.weekOneStarts(i,e),r.compare(t)<0&&(t=ICAL.Time.weekOneStarts(--i,e)));var o=r.subtractDate(t).toSeconds()/86400,a=ICAL.helpers.trunc(o/7)+1;return ICAL.Time._wnCache[n]=a,a},addDuration:function(e){var t=e.isNegative?-1:1,n=this.second,r=this.minute,i=this.hour,o=this.day;n+=t*e.seconds,r+=t*e.minutes,i+=t*e.hours,o+=t*e.days,o+=7*t*e.weeks,this.second=n,this.minute=r,this.hour=i,this.day=o,this._cachedUnixTime=null},subtractDate:function(e){var t=this.toUnixTime()+this.utcOffset(),n=e.toUnixTime()+e.utcOffset();return ICAL.Duration.fromSeconds(t-n)},subtractDateTz:function(e){var t=this.toUnixTime(),n=e.toUnixTime();return ICAL.Duration.fromSeconds(t-n)},compare:function(e){var t=this.toUnixTime(),n=e.toUnixTime();return t>n?1:n>t?-1:0},compareDateOnlyTz:function(e,t){function n(e){return ICAL.Time._cmp_attr(r,i,e)}var r=this.convertToZone(t),i=e.convertToZone(t),o=0;return 0!=(o=n("year"))?o:0!=(o=n("month"))?o:o=n("day")},convertToZone:function(e){var t=this.clone(),n=this.zone.tzid==e.tzid;return this.isDate||n||ICAL.Timezone.convert_time(t,this.zone,e),t.zone=e,t},utcOffset:function(){return this.zone==ICAL.Timezone.localTimezone||this.zone==ICAL.Timezone.utcTimezone?0:this.zone.utcOffset(this)},toICALString:function(){var e=this.toString();return e.length>10?ICAL.design.icalendar.value["date-time"].toICAL(e):ICAL.design.icalendar.value.date.toICAL(e)},toString:function(){var e=this.year+"-"+ICAL.helpers.pad2(this.month)+"-"+ICAL.helpers.pad2(this.day);return this.isDate||(e+="T"+ICAL.helpers.pad2(this.hour)+":"+ICAL.helpers.pad2(this.minute)+":"+ICAL.helpers.pad2(this.second),this.zone===ICAL.Timezone.utcTimezone&&(e+="Z")),e},toJSDate:function(){return this.zone==ICAL.Timezone.localTimezone?this.isDate?new Date(this.year,this.month-1,this.day):new Date(this.year,this.month-1,this.day,this.hour,this.minute,this.second,0):new Date(1e3*this.toUnixTime())},_normalize:function(){return this._time.isDate,this._time.isDate&&(this._time.hour=0,this._time.minute=0,this._time.second=0),this.adjust(0,0,0,0),this},adjust:function(e,t,n,r,i){var o,a,s,u,c,l,f,h=0,d=0,p=i||this._time;if(p.isDate||(s=p.second+r,p.second=s%60,o=ICAL.helpers.trunc(s/60),p.second<0&&(p.second+=60,o--),u=p.minute+n+o,p.minute=u%60,a=ICAL.helpers.trunc(u/60),p.minute<0&&(p.minute+=60,a--),c=p.hour+t+a,p.hour=c%24,h=ICAL.helpers.trunc(c/24),p.hour<0&&(p.hour+=24,h--)),p.month>12?d=ICAL.helpers.trunc((p.month-1)/12):p.month<1&&(d=ICAL.helpers.trunc(p.month/12)-1),p.year+=d,p.month-=12*d,(l=p.day+e+h)>0)for(;!(l<=(f=ICAL.Time.daysInMonth(p.month,p.year)));)p.month++,p.month>12&&(p.year++,p.month=1),l-=f;else for(;l<=0;)1==p.month?(p.year--,p.month=12):p.month--,l+=ICAL.Time.daysInMonth(p.month,p.year);return p.day=l,this._cachedUnixTime=null,this},fromUnixTime:function(e){this.zone=ICAL.Timezone.utcTimezone;var t=ICAL.Time.epochTime.clone();t.adjust(0,0,0,e),this.year=t.year,this.month=t.month,this.day=t.day,this.hour=t.hour,this.minute=t.minute,this.second=Math.floor(t.second),this._cachedUnixTime=null},toUnixTime:function(){if(null!==this._cachedUnixTime)return this._cachedUnixTime;var e=this.utcOffset(),t=Date.UTC(this.year,this.month-1,this.day,this.hour,this.minute,this.second-e);return this._cachedUnixTime=t/1e3,this._cachedUnixTime},toJSON:function(){for(var e,t=["year","month","day","hour","minute","second","isDate"],n=Object.create(null),r=0,i=t.length;r<i;r++)n[e=t[r]]=this[e];return this.zone&&(n.timezone=this.zone.tzid),n}},function(){function e(e){Object.defineProperty(ICAL.Time.prototype,e,{get:function(){return this._pendingNormalization&&(this._normalize(),this._pendingNormalization=!1),this._time[e]},set:function(t){return"isDate"===e&&t&&!this._time.isDate&&this.adjust(0,0,0,0),this._cachedUnixTime=null,this._pendingNormalization=!0,this._time[e]=t,t}})}"defineProperty"in Object&&(e("year"),e("month"),e("day"),e("hour"),e("minute"),e("second"),e("isDate"))}(),ICAL.Time.daysInMonth=function(e,t){var n=30;return e<1||e>12?n:(n=[0,31,28,31,30,31,30,31,31,30,31,30,31][e],2==e&&(n+=ICAL.Time.isLeapYear(t)),n)},ICAL.Time.isLeapYear=function(e){return e<=1752?e%4==0:e%4==0&&e%100!=0||e%400==0},ICAL.Time.fromDayOfYear=function(e,t){var n=t,r=e,i=new ICAL.Time;i.auto_normalize=!1;var o=ICAL.Time.isLeapYear(n)?1:0;if(r<1)return n--,o=ICAL.Time.isLeapYear(n)?1:0,r+=ICAL.Time.daysInYearPassedMonth[o][12],ICAL.Time.fromDayOfYear(r,n);if(r>ICAL.Time.daysInYearPassedMonth[o][12])return o=ICAL.Time.isLeapYear(n)?1:0,r-=ICAL.Time.daysInYearPassedMonth[o][12],n++,ICAL.Time.fromDayOfYear(r,n);i.year=n,i.isDate=!0;for(var a=11;a>=0;a--)if(r>ICAL.Time.daysInYearPassedMonth[o][a]){i.month=a+1,i.day=r-ICAL.Time.daysInYearPassedMonth[o][a];break}return i.auto_normalize=!0,i},ICAL.Time.fromStringv2=function(e){return new ICAL.Time({year:parseInt(e.substr(0,4),10),month:parseInt(e.substr(5,2),10),day:parseInt(e.substr(8,2),10),isDate:!0})},ICAL.Time.fromDateString=function(e){return new ICAL.Time({year:ICAL.helpers.strictParseInt(e.substr(0,4)),month:ICAL.helpers.strictParseInt(e.substr(5,2)),day:ICAL.helpers.strictParseInt(e.substr(8,2)),isDate:!0})},ICAL.Time.fromDateTimeString=function(e,t){if(e.length<19)throw new Error('invalid date-time value: "'+e+'"');var n;return e[19]&&"Z"===e[19]?n="Z":t&&(n=t.getParameter("tzid")),new ICAL.Time({year:ICAL.helpers.strictParseInt(e.substr(0,4)),month:ICAL.helpers.strictParseInt(e.substr(5,2)),day:ICAL.helpers.strictParseInt(e.substr(8,2)),hour:ICAL.helpers.strictParseInt(e.substr(11,2)),minute:ICAL.helpers.strictParseInt(e.substr(14,2)),second:ICAL.helpers.strictParseInt(e.substr(17,2)),timezone:n})},ICAL.Time.fromString=function(e,t){return e.length>10?ICAL.Time.fromDateTimeString(e,t):ICAL.Time.fromDateString(e)},ICAL.Time.fromJSDate=function(e,t){return(new ICAL.Time).fromJSDate(e,t)},ICAL.Time.fromData=function(e,t){return(new ICAL.Time).fromData(e,t)},ICAL.Time.now=function(){return ICAL.Time.fromJSDate(new Date,!1)},ICAL.Time.weekOneStarts=function(e,t){var n=ICAL.Time.fromData({year:e,month:1,day:1,isDate:!0}),r=n.dayOfWeek(),i=t||ICAL.Time.DEFAULT_WEEK_START;return r>ICAL.Time.THURSDAY&&(n.day+=7),i>ICAL.Time.THURSDAY&&(n.day-=7),n.day-=r-i,n},ICAL.Time.getDominicalLetter=function(e){var t=(e+(e/4|0)+(e/400|0)-(e/100|0)-1)%7;return ICAL.Time.isLeapYear(e)?"GFEDCBA"[(t+6)%7]+"GFEDCBA"[t]:"GFEDCBA"[t]},ICAL.Time.epochTime=ICAL.Time.fromData({year:1970,month:1,day:1,hour:0,minute:0,second:0,isDate:!1,timezone:"Z"}),ICAL.Time._cmp_attr=function(e,t,n){return e[n]>t[n]?1:e[n]<t[n]?-1:0},ICAL.Time.daysInYearPassedMonth=[[0,31,59,90,120,151,181,212,243,273,304,334,365],[0,31,60,91,121,152,182,213,244,274,305,335,366]],ICAL.Time.SUNDAY=1,ICAL.Time.MONDAY=2,ICAL.Time.TUESDAY=3,ICAL.Time.WEDNESDAY=4,ICAL.Time.THURSDAY=5,ICAL.Time.FRIDAY=6,ICAL.Time.SATURDAY=7,ICAL.Time.DEFAULT_WEEK_START=ICAL.Time.MONDAY,ICAL.VCardTime=function(e,t,n){this.wrappedJSObject=this;var r=this._time=Object.create(null);r.year=null,r.month=null,r.day=null,r.hour=null,r.minute=null,r.second=null,this.icaltype=n||"date-and-or-time",this.fromData(e,t)},ICAL.helpers.inherits(ICAL.Time,ICAL.VCardTime,{icalclass:"vcardtime",icaltype:"date-and-or-time",zone:null,clone:function(){return new ICAL.VCardTime(this._time,this.zone,this.icaltype)},_normalize:function(){return this},utcOffset:function(){return this.zone instanceof ICAL.UtcOffset?this.zone.toSeconds():ICAL.Time.prototype.utcOffset.apply(this,arguments)},toICALString:function(){return ICAL.design.vcard.value[this.icaltype].toICAL(this.toString())},toString:function(){var e,t=ICAL.helpers.pad2,n=this.year,r=this.month,i=this.day,o=this.hour,a=this.minute,s=this.second,u=null!==r,c=null!==i,l=null!==o,f=null!==a,h=null!==s,d=(null!==n?t(n)+(u||c?"-":""):u||c?"--":"")+(u?t(r):"")+(c?"-"+t(i):""),p=(l?t(o):"-")+(l&&f?":":"")+(f?t(a):"")+(l||f?"":"-")+(f&&h?":":"")+(h?t(s):"");switch(e=this.zone===ICAL.Timezone.utcTimezone?"Z":this.zone instanceof ICAL.UtcOffset?this.zone.toString():this.zone===ICAL.Timezone.localTimezone?"":this.zone instanceof ICAL.Timezone?ICAL.UtcOffset.fromSeconds(this.zone.utcOffset(this)).toString():"",this.icaltype){case"time":return p+e;case"date-and-or-time":case"date-time":return d+("--"==p?"":"T"+p+e);case"date":return d}return null}}),ICAL.VCardTime.fromDateAndOrTimeString=function(e,t){function n(e,t,n){return e?ICAL.helpers.strictParseInt(e.substr(t,n)):null}var r=e.split("T"),i=r[0],o=r[1],a=o?ICAL.design.vcard.value.time._splitZone(o):[],s=a[0],u=a[1],c=(ICAL.helpers.strictParseInt,i?i.length:0),l=u?u.length:0,f=i&&"-"==i[0]&&"-"==i[1],h=u&&"-"==u[0],d={year:f?null:n(i,0,4),month:!f||4!=c&&7!=c?7==c?n(i,5,2):10==c?n(i,5,2):null:n(i,2,2),day:5==c?n(i,3,2):7==c&&f?n(i,5,2):10==c?n(i,8,2):null,hour:h?null:n(u,0,2),minute:h&&3==l?n(u,1,2):l>4?n(u,h?1:3,2):null,second:4==l?n(u,2,2):6==l?n(u,4,2):8==l?n(u,6,2):null};return s="Z"==s?ICAL.Timezone.utcTimezone:s&&":"==s[3]?ICAL.UtcOffset.fromString(s):null,new ICAL.VCardTime(d,s,t)},function(){var e={SU:ICAL.Time.SUNDAY,MO:ICAL.Time.MONDAY,TU:ICAL.Time.TUESDAY,WE:ICAL.Time.WEDNESDAY,TH:ICAL.Time.THURSDAY,FR:ICAL.Time.FRIDAY,SA:ICAL.Time.SATURDAY},t={};for(var n in e)e.hasOwnProperty(n)&&(t[e[n]]=n);function r(e,t,n,r){var i=r;if("+"===r[0]&&(i=r.substr(1)),i=ICAL.helpers.strictParseInt(i),void 0!==t&&r<t)throw new Error(e+': invalid value "'+r+'" must be > '+t);if(void 0!==n&&r>n)throw new Error(e+': invalid value "'+r+'" must be < '+t);return i}ICAL.Recur=function(e){this.wrappedJSObject=this,this.parts={},e&&"object"==typeof e&&this.fromData(e)},ICAL.Recur.prototype={parts:null,interval:1,wkst:ICAL.Time.MONDAY,until:null,count:null,freq:null,icalclass:"icalrecur",icaltype:"recur",iterator:function(e){return new ICAL.RecurIterator({rule:this,dtstart:e})},clone:function(){return new ICAL.Recur(this.toJSON())},isFinite:function(){return!(!this.count&&!this.until)},isByCount:function(){return!(!this.count||this.until)},addComponent:function(e,t){var n=e.toUpperCase();n in this.parts?this.parts[n].push(t):this.parts[n]=[t]},setComponent:function(e,t){this.parts[e.toUpperCase()]=t.slice()},getComponent:function(e){var t=e.toUpperCase();return t in this.parts?this.parts[t].slice():[]},getNextOccurrence:function(e,t){var n,r=this.iterator(e);do{n=r.next()}while(n&&n.compare(t)<=0);return n&&t.zone&&(n.zone=t.zone),n},fromData:function(e){for(var t in e){var n=t.toUpperCase();n in u?Array.isArray(e[t])?this.parts[n]=e[t]:this.parts[n]=[e[t]]:this[t]=e[t]}this.interval&&"number"!=typeof this.interval&&s.INTERVAL(this.interval,this),this.wkst&&"number"!=typeof this.wkst&&(this.wkst=ICAL.Recur.icalDayToNumericDay(this.wkst)),!this.until||this.until instanceof ICAL.Time||(this.until=ICAL.Time.fromString(this.until))},toJSON:function(){var e=Object.create(null);for(var t in e.freq=this.freq,this.count&&(e.count=this.count),this.interval>1&&(e.interval=this.interval),this.parts)if(this.parts.hasOwnProperty(t)){var n=this.parts[t];Array.isArray(n)&&1==n.length?e[t.toLowerCase()]=n[0]:e[t.toLowerCase()]=ICAL.helpers.clone(this.parts[t])}return this.until&&(e.until=this.until.toString()),"wkst"in this&&this.wkst!==ICAL.Time.DEFAULT_WEEK_START&&(e.wkst=ICAL.Recur.numericDayToIcalDay(this.wkst)),e},toString:function(){var e="FREQ="+this.freq;for(var t in this.count&&(e+=";COUNT="+this.count),this.interval>1&&(e+=";INTERVAL="+this.interval),this.parts)this.parts.hasOwnProperty(t)&&(e+=";"+t+"="+this.parts[t]);return this.until&&(e+=";UNTIL="+this.until.toICALString()),"wkst"in this&&this.wkst!==ICAL.Time.DEFAULT_WEEK_START&&(e+=";WKST="+ICAL.Recur.numericDayToIcalDay(this.wkst)),e}},ICAL.Recur.icalDayToNumericDay=function(t,n){var r=n||ICAL.Time.SUNDAY;return(e[t]-r+7)%7+1},ICAL.Recur.numericDayToIcalDay=function(e,n){var r=e+(n||ICAL.Time.SUNDAY)-ICAL.Time.SUNDAY;return r>7&&(r-=7),t[r]};var i=/^(SU|MO|TU|WE|TH|FR|SA)$/,o=/^([+-])?(5[0-3]|[1-4][0-9]|[1-9])?(SU|MO|TU|WE|TH|FR|SA)$/,a=["SECONDLY","MINUTELY","HOURLY","DAILY","WEEKLY","MONTHLY","YEARLY"],s={FREQ:function(e,t,n){if(-1===a.indexOf(e))throw new Error('invalid frequency "'+e+'" expected: "'+a.join(", ")+'"');t.freq=e},COUNT:function(e,t,n){t.count=ICAL.helpers.strictParseInt(e)},INTERVAL:function(e,t,n){t.interval=ICAL.helpers.strictParseInt(e),t.interval<1&&(t.interval=1)},UNTIL:function(e,t,n){e.length>10?t.until=ICAL.design.icalendar.value["date-time"].fromICAL(e):t.until=ICAL.design.icalendar.value.date.fromICAL(e),n||(t.until=ICAL.Time.fromString(t.until))},WKST:function(e,t,n){if(!i.test(e))throw new Error('invalid WKST value "'+e+'"');t.wkst=ICAL.Recur.icalDayToNumericDay(e)}},u={BYSECOND:r.bind(this,"BYSECOND",0,60),BYMINUTE:r.bind(this,"BYMINUTE",0,59),BYHOUR:r.bind(this,"BYHOUR",0,23),BYDAY:function(e){if(o.test(e))return e;throw new Error('invalid BYDAY value "'+e+'"')},BYMONTHDAY:r.bind(this,"BYMONTHDAY",-31,31),BYYEARDAY:r.bind(this,"BYYEARDAY",-366,366),BYWEEKNO:r.bind(this,"BYWEEKNO",-53,53),BYMONTH:r.bind(this,"BYMONTH",0,12),BYSETPOS:r.bind(this,"BYSETPOS",-366,366)};ICAL.Recur.fromString=function(e){var t=ICAL.Recur._stringToData(e,!1);return new ICAL.Recur(t)},ICAL.Recur.fromData=function(e){return new ICAL.Recur(e)},ICAL.Recur._stringToData=function(e,t){for(var n=Object.create(null),r=e.split(";"),i=r.length,o=0;o<i;o++){var a=r[o].split("="),c=a[0].toUpperCase(),l=a[0].toLowerCase(),f=t?l:c,h=a[1];if(c in u){for(var d=h.split(","),p=0,v=d.length;p<v;p++)d[p]=u[c](d[p]);n[f]=1==d.length?d[0]:d}else c in s?s[c](h,n,t):n[l]=h}return n}}(),ICAL.RecurIterator=function(){function e(e){this.fromData(e)}return e.prototype={completed:!1,rule:null,dtstart:null,last:null,occurrence_number:0,by_indices:null,initialized:!1,by_data:null,days:null,days_index:0,fromData:function(e){if(this.rule=ICAL.helpers.formatClassType(e.rule,ICAL.Recur),!this.rule)throw new Error("iterator requires a (ICAL.Recur) rule");if(this.dtstart=ICAL.helpers.formatClassType(e.dtstart,ICAL.Time),!this.dtstart)throw new Error("iterator requires a (ICAL.Time) dtstart");e.by_data?this.by_data=e.by_data:this.by_data=ICAL.helpers.clone(this.rule.parts,!0),e.occurrence_number&&(this.occurrence_number=e.occurrence_number),this.days=e.days||[],e.last&&(this.last=ICAL.helpers.formatClassType(e.last,ICAL.Time)),this.by_indices=e.by_indices,this.by_indices||(this.by_indices={BYSECOND:0,BYMINUTE:0,BYHOUR:0,BYDAY:0,BYMONTH:0,BYWEEKNO:0,BYMONTHDAY:0}),this.initialized=e.initialized||!1,this.initialized||this.init()},init:function(){this.initialized=!0,this.last=this.dtstart.clone();var e=this.by_data;if("BYDAY"in e&&this.sort_byday_rules(e.BYDAY),"BYYEARDAY"in e&&("BYMONTH"in e||"BYWEEKNO"in e||"BYMONTHDAY"in e||"BYDAY"in e))throw new Error("Invalid BYYEARDAY rule");if("BYWEEKNO"in e&&"BYMONTHDAY"in e)throw new Error("BYWEEKNO does not fit to BYMONTHDAY");if("MONTHLY"==this.rule.freq&&("BYYEARDAY"in e||"BYWEEKNO"in e))throw new Error("For MONTHLY recurrences neither BYYEARDAY nor BYWEEKNO may appear");if("WEEKLY"==this.rule.freq&&("BYYEARDAY"in e||"BYMONTHDAY"in e))throw new Error("For WEEKLY recurrences neither BYMONTHDAY nor BYYEARDAY may appear");if("YEARLY"!=this.rule.freq&&"BYYEARDAY"in e)throw new Error("BYYEARDAY may only appear in YEARLY rules");if(this.last.second=this.setup_defaults("BYSECOND","SECONDLY",this.dtstart.second),this.last.minute=this.setup_defaults("BYMINUTE","MINUTELY",this.dtstart.minute),this.last.hour=this.setup_defaults("BYHOUR","HOURLY",this.dtstart.hour),this.last.day=this.setup_defaults("BYMONTHDAY","DAILY",this.dtstart.day),this.last.month=this.setup_defaults("BYMONTH","MONTHLY",this.dtstart.month),"WEEKLY"==this.rule.freq)if("BYDAY"in e){var t=(u=this.ruleDayOfWeek(e.BYDAY[0],this.rule.wkst))[0],n=(c=u[1])-this.last.dayOfWeek(this.rule.wkst);(this.last.dayOfWeek(this.rule.wkst)<c&&n>=0||n<0)&&(this.last.day+=n)}else{var r=ICAL.Recur.numericDayToIcalDay(this.dtstart.dayOfWeek());e.BYDAY=[r]}if("YEARLY"==this.rule.freq){for(;this.expand_year_days(this.last.year),!(this.days.length>0);)this.increment_year(this.rule.interval);this._nextByYearDay()}if("MONTHLY"==this.rule.freq&&this.has_by_data("BYDAY")){var i=null,o=this.last.clone(),a=ICAL.Time.daysInMonth(this.last.month,this.last.year);for(var s in this.by_data.BYDAY)if(this.by_data.BYDAY.hasOwnProperty(s)){this.last=o.clone();t=(u=this.ruleDayOfWeek(this.by_data.BYDAY[s]))[0];var u,c=u[1],l=this.last.nthWeekDay(c,t);if(t>=6||t<=-6)throw new Error("Malformed values in BYDAY part");if(l>a||l<=0){if(i&&i.month==o.month)continue;for(;l>a||l<=0;)this.increment_month(),a=ICAL.Time.daysInMonth(this.last.month,this.last.year),l=this.last.nthWeekDay(c,t)}this.last.day=l,(!i||this.last.compare(i)<0)&&(i=this.last.clone())}if(this.last=i.clone(),this.has_by_data("BYMONTHDAY")&&this._byDayAndMonthDay(!0),this.last.day>a||0==this.last.day)throw new Error("Malformed values in BYDAY part")}else if(this.has_by_data("BYMONTHDAY")&&this.last.day<0){a=ICAL.Time.daysInMonth(this.last.month,this.last.year);this.last.day=a+this.last.day+1}},next:function(){var e,t=this.last?this.last.clone():null;if(this.rule.count&&this.occurrence_number>=this.rule.count||this.rule.until&&this.last.compare(this.rule.until)>0)return this.completed=!0,null;if(0==this.occurrence_number&&this.last.compare(this.dtstart)>=0)return this.occurrence_number++,this.last;do{switch(e=1,this.rule.freq){case"SECONDLY":this.next_second();break;case"MINUTELY":this.next_minute();break;case"HOURLY":this.next_hour();break;case"DAILY":this.next_day();break;case"WEEKLY":this.next_week();break;case"MONTHLY":e=this.next_month();break;case"YEARLY":this.next_year();break;default:return null}}while(!this.check_contracting_rules()||this.last.compare(this.dtstart)<0||!e);if(0==this.last.compare(t))throw new Error("Same occurrence found twice, protecting you from death by recursion");return this.rule.until&&this.last.compare(this.rule.until)>0?(this.completed=!0,null):(this.occurrence_number++,this.last)},next_second:function(){return this.next_generic("BYSECOND","SECONDLY","second","minute")},increment_second:function(e){return this.increment_generic(e,"second",60,"minute")},next_minute:function(){return this.next_generic("BYMINUTE","MINUTELY","minute","hour","next_second")},increment_minute:function(e){return this.increment_generic(e,"minute",60,"hour")},next_hour:function(){return this.next_generic("BYHOUR","HOURLY","hour","monthday","next_minute")},increment_hour:function(e){this.increment_generic(e,"hour",24,"monthday")},next_day:function(){this.by_data;var e="DAILY"==this.rule.freq;return 0==this.next_hour()?0:(e?this.increment_monthday(this.rule.interval):this.increment_monthday(1),0)},next_week:function(){var e=0;if(0==this.next_weekday_by_week())return e;if(this.has_by_data("BYWEEKNO")){++this.by_indices.BYWEEKNO;this.by_indices.BYWEEKNO==this.by_data.BYWEEKNO.length&&(this.by_indices.BYWEEKNO=0,e=1),this.last.month=1,this.last.day=1;var t=this.by_data.BYWEEKNO[this.by_indices.BYWEEKNO];this.last.day+=7*t,e&&this.increment_year(1)}else this.increment_monthday(7*this.rule.interval);return e},normalizeByMonthDayRules:function(e,t,n){for(var r,i=ICAL.Time.daysInMonth(t,e),o=[],a=0,s=n.length;a<s;a++)if(r=n[a],!(Math.abs(r)>i)){if(r<0)r=i+(r+1);else if(0===r)continue;-1===o.indexOf(r)&&o.push(r)}return o.sort(function(e,t){return e-t})},_byDayAndMonthDay:function(e){var t,n,r,i,o=this.by_data.BYDAY,a=0,s=o.length,u=0,c=this,l=this.last.day;function f(){for(i=ICAL.Time.daysInMonth(c.last.month,c.last.year),t=c.normalizeByMonthDayRules(c.last.year,c.last.month,c.by_data.BYMONTHDAY),r=t.length;t[a]<=l&&(!e||t[a]!=l)&&a<r-1;)a++}function h(){l=0,c.increment_month(),a=0,f()}f(),e&&(l-=1);for(var d=48;!u&&d;)if(d--,(n=l+1)>i)h();else{var p=t[a++];if(p>=n){l=p;for(var v=0;v<s;v++){var m=this.ruleDayOfWeek(o[v]),y=m[0],g=m[1];if(this.last.day=l,this.last.isNthWeekDay(g,y)){u=1;break}}u||a!==r||h()}else h()}if(d<=0)throw new Error("Malformed values in BYDAY combined with BYMONTHDAY parts");return u},next_month:function(){this.rule.freq;var e=1;if(0==this.next_hour())return e;if(this.has_by_data("BYDAY")&&this.has_by_data("BYMONTHDAY"))e=this._byDayAndMonthDay();else if(this.has_by_data("BYDAY")){var t=ICAL.Time.daysInMonth(this.last.month,this.last.year),n=0,r=0;if(this.has_by_data("BYSETPOS")){for(var i=this.last.day,o=1;o<=t;o++)this.last.day=o,this.is_day_in_byday(this.last)&&(r++,o<=i&&n++);this.last.day=i}e=0;for(o=this.last.day+1;o<=t;o++)if(this.last.day=o,this.is_day_in_byday(this.last)&&(!this.has_by_data("BYSETPOS")||this.check_set_position(++n)||this.check_set_position(n-r-1))){e=1;break}o>t&&(this.last.day=1,this.increment_month(),this.is_day_in_byday(this.last)?this.has_by_data("BYSETPOS")&&!this.check_set_position(1)||(e=1):e=0)}else if(this.has_by_data("BYMONTHDAY")){this.by_indices.BYMONTHDAY++,this.by_indices.BYMONTHDAY>=this.by_data.BYMONTHDAY.length&&(this.by_indices.BYMONTHDAY=0,this.increment_month());t=ICAL.Time.daysInMonth(this.last.month,this.last.year);(o=this.by_data.BYMONTHDAY[this.by_indices.BYMONTHDAY])<0&&(o=t+o+1),o>t?(this.last.day=1,e=this.is_day_in_byday(this.last)):this.last.day=o}else{this.increment_month();t=ICAL.Time.daysInMonth(this.last.month,this.last.year);this.by_data.BYMONTHDAY[0]>t?e=0:this.last.day=this.by_data.BYMONTHDAY[0]}return e},next_weekday_by_week:function(){var e=0;if(0==this.next_hour())return e;if(!this.has_by_data("BYDAY"))return 1;for(;;){var t=new ICAL.Time;this.by_indices.BYDAY++,this.by_indices.BYDAY==Object.keys(this.by_data.BYDAY).length&&(this.by_indices.BYDAY=0,e=1);var n=this.by_data.BYDAY[this.by_indices.BYDAY],r=this.ruleDayOfWeek(n)[1];(r-=this.rule.wkst)<0&&(r+=7),t.year=this.last.year,t.month=this.last.month,t.day=this.last.day;var i=t.startDoyWeek(this.rule.wkst);if(!(r+i<1)||e){var o=ICAL.Time.fromDayOfYear(i+r,this.last.year);return this.last.year=o.year,this.last.month=o.month,this.last.day=o.day,e}}},next_year:function(){if(0==this.next_hour())return 0;if(++this.days_index==this.days.length){this.days_index=0;do{this.increment_year(this.rule.interval),this.expand_year_days(this.last.year)}while(0==this.days.length)}return this._nextByYearDay(),1},_nextByYearDay:function(){var e=this.days[this.days_index],t=this.last.year;e<1&&(e+=1,t+=1);var n=ICAL.Time.fromDayOfYear(e,t);this.last.day=n.day,this.last.month=n.month},ruleDayOfWeek:function(e,t){var n=e.match(/([+-]?[0-9])?(MO|TU|WE|TH|FR|SA|SU)/);return n?[parseInt(n[1]||0,10),e=ICAL.Recur.icalDayToNumericDay(n[2],t)]:[0,0]},next_generic:function(e,t,n,r,i){var o=e in this.by_data,a=this.rule.freq==t,s=0;if(i&&0==this[i]())return s;if(o){this.by_indices[e]++;this.by_indices[e];var u=this.by_data[e];this.by_indices[e]==u.length&&(this.by_indices[e]=0,s=1),this.last[n]=u[this.by_indices[e]]}else a&&this["increment_"+n](this.rule.interval);return o&&s&&a&&this["increment_"+r](1),s},increment_monthday:function(e){for(var t=0;t<e;t++){var n=ICAL.Time.daysInMonth(this.last.month,this.last.year);this.last.day++,this.last.day>n&&(this.last.day-=n,this.increment_month())}},increment_month:function(){if(this.last.day=1,this.has_by_data("BYMONTH"))this.by_indices.BYMONTH++,this.by_indices.BYMONTH==this.by_data.BYMONTH.length&&(this.by_indices.BYMONTH=0,this.increment_year(1)),this.last.month=this.by_data.BYMONTH[this.by_indices.BYMONTH];else{"MONTHLY"==this.rule.freq?this.last.month+=this.rule.interval:this.last.month++,this.last.month--;var e=ICAL.helpers.trunc(this.last.month/12);this.last.month%=12,this.last.month++,0!=e&&this.increment_year(e)}},increment_year:function(e){this.last.year+=e},increment_generic:function(e,t,n,r){this.last[t]+=e;var i=ICAL.helpers.trunc(this.last[t]/n);this.last[t]%=n,0!=i&&this["increment_"+r](i)},has_by_data:function(e){return e in this.rule.parts},expand_year_days:function(e){var t=new ICAL.Time;this.days=[];var n={},r=["BYDAY","BYWEEKNO","BYMONTHDAY","BYMONTH","BYYEARDAY"];for(var i in r)if(r.hasOwnProperty(i)){var o=r[i];o in this.rule.parts&&(n[o]=this.rule.parts[o])}if("BYMONTH"in n&&"BYWEEKNO"in n){var a=1,s={};t.year=e,t.isDate=!0;for(var u=0;u<this.by_data.BYMONTH.length;u++){var c=this.by_data.BYMONTH[u];t.month=c,t.day=1;var l=t.weekNumber(this.rule.wkst);t.day=ICAL.Time.daysInMonth(c,e);var f=t.weekNumber(this.rule.wkst);for(u=l;u<f;u++)s[u]=1}for(var h=0;h<this.by_data.BYWEEKNO.length&&a;h++){(B=this.by_data.BYWEEKNO[h])<52?a&=s[h]:a=0}a?delete n.BYMONTH:delete n.BYWEEKNO}var d=Object.keys(n).length;if(0==d){var p=this.dtstart.clone();p.year=this.last.year,this.days.push(p.dayOfYear())}else if(1==d&&"BYMONTH"in n){for(var v in this.by_data.BYMONTH)if(this.by_data.BYMONTH.hasOwnProperty(v)){var m=this.dtstart.clone();m.year=e,m.month=this.by_data.BYMONTH[v],m.isDate=!0,this.days.push(m.dayOfYear())}}else if(1==d&&"BYMONTHDAY"in n){for(var y in this.by_data.BYMONTHDAY)if(this.by_data.BYMONTHDAY.hasOwnProperty(y)){var g=this.dtstart.clone();if((_=this.by_data.BYMONTHDAY[y])<0)_=_+(w=ICAL.Time.daysInMonth(g.month,e))+1;g.day=_,g.year=e,g.isDate=!0,this.days.push(g.dayOfYear())}}else if(2==d&&"BYMONTHDAY"in n&&"BYMONTH"in n){for(var v in this.by_data.BYMONTH)if(this.by_data.BYMONTH.hasOwnProperty(v)){var b=this.by_data.BYMONTH[v],w=ICAL.Time.daysInMonth(b,e);for(var y in this.by_data.BYMONTHDAY){var _;if(this.by_data.BYMONTHDAY.hasOwnProperty(y))(_=this.by_data.BYMONTHDAY[y])<0&&(_=_+w+1),t.day=_,t.month=b,t.year=e,t.isDate=!0,this.days.push(t.dayOfYear())}}}else if(1==d&&"BYWEEKNO"in n);else if(2==d&&"BYWEEKNO"in n&&"BYMONTHDAY"in n);else if(1==d&&"BYDAY"in n)this.days=this.days.concat(this.expand_by_day(e));else if(2==d&&"BYDAY"in n&&"BYMONTH"in n){for(var v in this.by_data.BYMONTH)if(this.by_data.BYMONTH.hasOwnProperty(v)){c=this.by_data.BYMONTH[v],w=ICAL.Time.daysInMonth(c,e);t.year=e,t.month=this.by_data.BYMONTH[v],t.day=1,t.isDate=!0;var k=t.dayOfWeek(),x=t.dayOfYear()-1;t.day=w;var E=t.dayOfWeek();if(this.has_by_data("BYSETPOS")){for(var T=[],A=1;A<=w;A++)t.day=A,this.is_day_in_byday(t)&&T.push(A);for(var S=0;S<T.length;S++)(this.check_set_position(S+1)||this.check_set_position(S-T.length))&&this.days.push(x+T[S])}else for(var C in this.by_data.BYDAY)if(this.by_data.BYDAY.hasOwnProperty(C)){var I,O=this.by_data.BYDAY[C],P=this.ruleDayOfWeek(O),D=P[0],L=P[1],M=(L+7-k)%7+1,j=w-(E+7-L)%7;if(0==D)for(A=M;A<=w;A+=7)this.days.push(x+A);else D>0?(I=M+7*(D-1))<=w&&this.days.push(x+I):(I=j+7*(D+1))>0&&this.days.push(x+I)}}this.days.sort(function(e,t){return e-t})}else if(2==d&&"BYDAY"in n&&"BYMONTHDAY"in n){var N=this.expand_by_day(e);for(var R in N)if(N.hasOwnProperty(R)){A=N[R];var F=ICAL.Time.fromDayOfYear(A,e);this.by_data.BYMONTHDAY.indexOf(F.day)>=0&&this.days.push(A)}}else if(3==d&&"BYDAY"in n&&"BYMONTHDAY"in n&&"BYMONTH"in n){N=this.expand_by_day(e);for(var R in N)if(N.hasOwnProperty(R)){A=N[R],F=ICAL.Time.fromDayOfYear(A,e);this.by_data.BYMONTH.indexOf(F.month)>=0&&this.by_data.BYMONTHDAY.indexOf(F.day)>=0&&this.days.push(A)}}else if(2==d&&"BYDAY"in n&&"BYWEEKNO"in n){N=this.expand_by_day(e);for(var R in N)if(N.hasOwnProperty(R)){A=N[R];var B=(F=ICAL.Time.fromDayOfYear(A,e)).weekNumber(this.rule.wkst);this.by_data.BYWEEKNO.indexOf(B)&&this.days.push(A)}}else 3==d&&"BYDAY"in n&&"BYWEEKNO"in n&&"BYMONTHDAY"in n||(this.days=1==d&&"BYYEARDAY"in n?this.days.concat(this.by_data.BYYEARDAY):[]);return 0},expand_by_day:function(e){var t=[],n=this.last.clone();n.year=e,n.month=1,n.day=1,n.isDate=!0;var r=n.dayOfWeek();n.month=12,n.day=31,n.isDate=!0;var i=n.dayOfWeek(),o=n.dayOfYear();for(var a in this.by_data.BYDAY)if(this.by_data.BYDAY.hasOwnProperty(a)){var s=this.by_data.BYDAY[a],u=this.ruleDayOfWeek(s),c=u[0],l=u[1];if(0==c)for(var f=(l+7-r)%7+1;f<=o;f+=7)t.push(f);else if(c>0){var h;h=l>=r?l-r+1:l-r+8,t.push(h+7*(c-1))}else{var d;c=-c,d=l<=i?o-i+l:o-i+l-7,t.push(d-7*(c-1))}}return t},is_day_in_byday:function(e){for(var t in this.by_data.BYDAY)if(this.by_data.BYDAY.hasOwnProperty(t)){var n=this.by_data.BYDAY[t],r=this.ruleDayOfWeek(n),i=r[0],o=r[1],a=e.dayOfWeek();if(0==i&&o==a||e.nthWeekDay(o,i)==e.day)return 1}return 0},check_set_position:function(e){return!!this.has_by_data("BYSETPOS")&&-1!==this.by_data.BYSETPOS.indexOf(e)},sort_byday_rules:function(e){for(var t=0;t<e.length;t++)for(var n=0;n<t;n++){if(this.ruleDayOfWeek(e[n],this.rule.wkst)[1]>this.ruleDayOfWeek(e[t],this.rule.wkst)[1]){var r=e[t];e[t]=e[n],e[n]=r}}},check_contract_restriction:function(t,n){var r=e._indexMap[t],i=e._expandMap[this.rule.freq][r],o=!1;if(t in this.by_data&&i==e.CONTRACT){var a=this.by_data[t];for(var s in a)if(a.hasOwnProperty(s)&&a[s]==n){o=!0;break}}else o=!0;return o},check_contracting_rules:function(){var e=this.last.dayOfWeek(),t=this.last.weekNumber(this.rule.wkst),n=this.last.dayOfYear();return this.check_contract_restriction("BYSECOND",this.last.second)&&this.check_contract_restriction("BYMINUTE",this.last.minute)&&this.check_contract_restriction("BYHOUR",this.last.hour)&&this.check_contract_restriction("BYDAY",ICAL.Recur.numericDayToIcalDay(e))&&this.check_contract_restriction("BYWEEKNO",t)&&this.check_contract_restriction("BYMONTHDAY",this.last.day)&&this.check_contract_restriction("BYMONTH",this.last.month)&&this.check_contract_restriction("BYYEARDAY",n)},setup_defaults:function(t,n,r){var i=e._indexMap[t];return e._expandMap[this.rule.freq][i]!=e.CONTRACT&&(t in this.by_data||(this.by_data[t]=[r]),this.rule.freq!=n)?this.by_data[t][0]:r},toJSON:function(){var e=Object.create(null);return e.initialized=this.initialized,e.rule=this.rule.toJSON(),e.dtstart=this.dtstart.toJSON(),e.by_data=this.by_data,e.days=this.days,e.last=this.last.toJSON(),e.by_indices=this.by_indices,e.occurrence_number=this.occurrence_number,e}},e._indexMap={BYSECOND:0,BYMINUTE:1,BYHOUR:2,BYDAY:3,BYMONTHDAY:4,BYYEARDAY:5,BYWEEKNO:6,BYMONTH:7,BYSETPOS:8},e._expandMap={SECONDLY:[1,1,1,1,1,1,1,1],MINUTELY:[2,1,1,1,1,1,1,1],HOURLY:[2,2,1,1,1,1,1,1],DAILY:[2,2,2,1,1,1,1,1],WEEKLY:[2,2,2,2,3,3,1,1],MONTHLY:[2,2,2,2,2,3,3,1],YEARLY:[2,2,2,2,2,2,2,2]},e.UNKNOWN=0,e.CONTRACT=1,e.EXPAND=2,e.ILLEGAL=3,e}(),ICAL.RecurExpansion=function(){function e(e){return ICAL.helpers.formatClassType(e,ICAL.Time)}function t(e,t){return e.compare(t)}function n(e){this.ruleDates=[],this.exDates=[],this.fromData(e)}return n.prototype={complete:!1,ruleIterators:null,ruleDates:null,exDates:null,ruleDateInc:0,exDateInc:0,exDate:null,ruleDate:null,dtstart:null,last:null,fromData:function(t){var n=ICAL.helpers.formatClassType(t.dtstart,ICAL.Time);if(!n)throw new Error(".dtstart (ICAL.Time) must be given");if(this.dtstart=n,t.component)this._init(t.component);else{if(this.last=e(t.last)||n.clone(),!t.ruleIterators)throw new Error(".ruleIterators or .component must be given");this.ruleIterators=t.ruleIterators.map(function(e){return ICAL.helpers.formatClassType(e,ICAL.RecurIterator)}),this.ruleDateInc=t.ruleDateInc,this.exDateInc=t.exDateInc,t.ruleDates&&(this.ruleDates=t.ruleDates.map(e),this.ruleDate=this.ruleDates[this.ruleDateInc]),t.exDates&&(this.exDates=t.exDates.map(e),this.exDate=this.exDates[this.exDateInc]),void 0!==t.complete&&(this.complete=t.complete)}},next:function(){for(var e,t,n,r=0;;){if(r++>500)throw new Error("max tries have occured, rule may be impossible to forfill.");if(t=this.ruleDate,e=this._nextRecurrenceIter(this.last),!t&&!e){this.complete=!0;break}if((!t||e&&t.compare(e.last)>0)&&(t=e.last.clone(),e.next()),this.ruleDate===t&&this._nextRuleDay(),this.last=t,!this.exDate||((n=this.exDate.compare(this.last))<0&&this._nextExDay(),0!==n))return this.last;this._nextExDay()}},toJSON:function(){function e(e){return e.toJSON()}var t=Object.create(null);return t.ruleIterators=this.ruleIterators.map(e),this.ruleDates&&(t.ruleDates=this.ruleDates.map(e)),this.exDates&&(t.exDates=this.exDates.map(e)),t.ruleDateInc=this.ruleDateInc,t.exDateInc=this.exDateInc,t.last=this.last.toJSON(),t.dtstart=this.dtstart.toJSON(),t.complete=this.complete,t},_extractDates:function(e,n){function r(e){i=ICAL.helpers.binsearchInsert(o,e,t),o.splice(i,0,e)}for(var i,o=[],a=e.getAllProperties(n),s=a.length,u=0;u<s;u++)a[u].getValues().forEach(r);return o},_init:function(e){if(this.ruleIterators=[],this.last=this.dtstart.clone(),!((n=e).hasProperty("rdate")||n.hasProperty("rrule")||n.hasProperty("recurrence-id")))return this.ruleDate=this.last.clone(),void(this.complete=!0);var n;if(e.hasProperty("rdate")&&(this.ruleDates=this._extractDates(e,"rdate"),this.ruleDates[0]&&this.ruleDates[0].compare(this.dtstart)<0?(this.ruleDateInc=0,this.last=this.ruleDates[0].clone()):this.ruleDateInc=ICAL.helpers.binsearchInsert(this.ruleDates,this.last,t),this.ruleDate=this.ruleDates[this.ruleDateInc]),e.hasProperty("rrule"))for(var r,i=e.getAllProperties("rrule"),o=0,a=i.length;o<a;o++)r=i[o].getFirstValue().iterator(this.dtstart),this.ruleIterators.push(r),r.next();e.hasProperty("exdate")&&(this.exDates=this._extractDates(e,"exdate"),this.exDateInc=ICAL.helpers.binsearchInsert(this.exDates,this.last,t),this.exDate=this.exDates[this.exDateInc])},_nextExDay:function(){this.exDate=this.exDates[++this.exDateInc]},_nextRuleDay:function(){this.ruleDate=this.ruleDates[++this.ruleDateInc]},_nextRecurrenceIter:function(){var e=this.ruleIterators;if(0===e.length)return null;for(var t,n,r,i=e.length,o=0;o<i;o++)n=(t=e[o]).last,t.completed?(i--,0!==o&&o--,e.splice(o,1)):(!r||r.last.compare(n)>0)&&(r=t);return r}},n}(),ICAL.Event=function(){function e(e,t){e instanceof ICAL.Component||(t=e,e=null),this.component=e||new ICAL.Component("vevent"),this._rangeExceptionCache=Object.create(null),this.exceptions=Object.create(null),this.rangeExceptions=[],t&&t.strictExceptions&&(this.strictExceptions=t.strictExceptions),t&&t.exceptions?t.exceptions.forEach(this.relateException,this):this.component.parent&&!this.isRecurrenceException()&&this.component.parent.getAllSubcomponents("vevent").forEach(function(e){e.hasProperty("recurrence-id")&&this.relateException(e)},this)}function t(e,t){return e[0]>t[0]?1:t[0]>e[0]?-1:0}return e.prototype={THISANDFUTURE:"THISANDFUTURE",exceptions:null,strictExceptions:!1,relateException:function(e){if(this.isRecurrenceException())throw new Error("cannot relate exception to exceptions");if(e instanceof ICAL.Component&&(e=new ICAL.Event(e)),this.strictExceptions&&e.uid!==this.uid)throw new Error("attempted to relate unrelated exception");var n=e.recurrenceId.toString();if(this.exceptions[n]=e,e.modifiesFuture()){var r=[e.recurrenceId.toUnixTime(),n],i=ICAL.helpers.binsearchInsert(this.rangeExceptions,r,t);this.rangeExceptions.splice(i,0,r)}},modifiesFuture:function(){return!!this.component.hasProperty("recurrence-id")&&this.component.getFirstProperty("recurrence-id").getParameter("range")===this.THISANDFUTURE},findRangeException:function(e){if(!this.rangeExceptions.length)return null;var n=e.toUnixTime(),r=ICAL.helpers.binsearchInsert(this.rangeExceptions,[n],t);if((r-=1)<0)return null;var i=this.rangeExceptions[r];return n<i[0]?null:i[1]},getOccurrenceDetails:function(e){var t,n=e.toString(),r=e.convertToZone(ICAL.Timezone.utcTimezone).toString(),i={recurrenceId:e};if(n in this.exceptions)t=i.item=this.exceptions[n],i.startDate=t.startDate,i.endDate=t.endDate,i.item=t;else if(r in this.exceptions)t=this.exceptions[r],i.startDate=t.startDate,i.endDate=t.endDate,i.item=t;else{var o,a=this.findRangeException(e);if(a){var s=this.exceptions[a];i.item=s;var u=this._rangeExceptionCache[a];if(!u){var c=s.recurrenceId.clone(),l=s.startDate.clone();c.zone=l.zone,u=l.subtractDate(c),this._rangeExceptionCache[a]=u}var f=e.clone();f.zone=s.startDate.zone,f.addDuration(u),(o=f.clone()).addDuration(s.duration),i.startDate=f,i.endDate=o}else(o=e.clone()).addDuration(this.duration),i.endDate=o,i.startDate=e,i.item=this}return i},iterator:function(e){return new ICAL.RecurExpansion({component:this.component,dtstart:e||this.startDate})},isRecurring:function(){var e=this.component;return e.hasProperty("rrule")||e.hasProperty("rdate")},isRecurrenceException:function(){return this.component.hasProperty("recurrence-id")},getRecurrenceTypes:function(){for(var e=this.component.getAllProperties("rrule"),t=0,n=e.length,r=Object.create(null);t<n;t++){r[e[t].getFirstValue().freq]=!0}return r},get uid(){return this._firstProp("uid")},set uid(e){this._setProp("uid",e)},get startDate(){return this._firstProp("dtstart")},set startDate(e){this._setTime("dtstart",e)},get endDate(){var e=this._firstProp("dtend");if(!e){var t=this._firstProp("duration");e=this.startDate.clone(),t?e.addDuration(t):e.isDate&&(e.day+=1)}return e},set endDate(e){this.component.hasProperty("duration")&&this.component.removeProperty("duration"),this._setTime("dtend",e)},get duration(){var e=this._firstProp("duration");return e||this.endDate.subtractDateTz(this.startDate)},set duration(e){this.component.hasProperty("dtend")&&this.component.removeProperty("dtend"),this._setProp("duration",e)},get location(){return this._firstProp("location")},set location(e){return this._setProp("location",e)},get attendees(){return this.component.getAllProperties("attendee")},get summary(){return this._firstProp("summary")},set summary(e){this._setProp("summary",e)},get description(){return this._firstProp("description")},set description(e){this._setProp("description",e)},get organizer(){return this._firstProp("organizer")},set organizer(e){this._setProp("organizer",e)},get sequence(){return this._firstProp("sequence")},set sequence(e){this._setProp("sequence",e)},get recurrenceId(){return this._firstProp("recurrence-id")},set recurrenceId(e){this._setTime("recurrence-id",e)},_setTime:function(e,t){var n=this.component.getFirstProperty(e);n||(n=new ICAL.Property(e),this.component.addProperty(n)),t.zone===ICAL.Timezone.localTimezone||t.zone===ICAL.Timezone.utcTimezone?n.removeParameter("tzid"):n.setParameter("tzid",t.zone.tzid),n.setValue(t)},_setProp:function(e,t){this.component.updatePropertyWithValue(e,t)},_firstProp:function(e){return this.component.getFirstPropertyValue(e)},toString:function(){return this.component.toString()}},e}(),ICAL.ComponentParser=function(){function e(e){var t;for(t in void 0===e&&(e={}),e)e.hasOwnProperty(t)&&(this[t]=e[t])}return e.prototype={parseEvent:!0,parseTimezone:!0,oncomplete:function(){},onerror:function(e){},ontimezone:function(e){},onevent:function(e){},process:function(e){"string"==typeof e&&(e=ICAL.parse(e)),e instanceof ICAL.Component||(e=new ICAL.Component(e));for(var t,n=e.getAllSubcomponents(),r=0,i=n.length;r<i;r++)switch((t=n[r]).name){case"vtimezone":if(this.parseTimezone){var o=t.getFirstPropertyValue("tzid");o&&this.ontimezone(new ICAL.Timezone({tzid:o,component:t}))}break;case"vevent":this.parseEvent&&this.onevent(new ICAL.Event(t));break;default:continue}this.oncomplete()}},e}()},function(e,t,n){var r=n(56),i=n(139);e.exports=function(e){return null!=e&&i(e.length)&&!r(e)}},function(e,t,n){var r=n(383),i=n(380);e.exports=function(e,t){var n=i(e,t);return r(n)?n:void 0}},function(e,t,n){var r=n(10),i=n(153);e.exports=r?i:function(e){return Set.prototype.values.call(e)}},function(e,t,n){var r=n(27),i=n(91),o=n(22),a=n(18),s=n(88);e.exports=function(e,t){var n=1==e,u=2==e,c=3==e,l=4==e,f=6==e,h=5==e||f,d=t||s;return function(t,s,p){for(var v,m,y=o(t),g=i(y),b=r(s,p,3),w=a(g.length),_=0,k=n?d(t,w):u?d(t,0):void 0;w>_;_++)if((h||_ in g)&&(m=b(v=g[_],_,y),e))if(n)k[_]=m;else if(m)switch(e){case 3:return!0;case 5:return v;case 6:return _;case 2:k.push(v)}else if(l)return!1;return f?-1:c||l?l:k}}},function(e,t,n){var r=n(65);e.exports=Array.isArray||function(e){return"Array"==r(e)}},function(e,t,n){"use strict";var r=n(66),i=n(29),o=n(94);e.exports=function(e,t,n){var a=r(t);a in e?i.f(e,a,o(0,n)):e[a]=n}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var r=n(23);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DATA_CLONE_ERROR=t.MESSAGE=t.REJECTED=t.FULFILLED=t.REPLY=t.CALL=t.HANDSHAKE_REPLY=t.HANDSHAKE=void 0;t.HANDSHAKE="handshake";t.HANDSHAKE_REPLY="handshake-reply";t.CALL="call";t.REPLY="reply";t.FULFILLED="fulfilled";t.REJECTED="rejected";t.MESSAGE="message";t.DATA_CLONE_ERROR="DataCloneError"},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,n){(function(e,r){var i;(function(o){"use strict";var a,s=0,u=Array.prototype.slice,c=function(e,t){var n=e[t];if(n===o&&a.config.strict)throw new Error("Bottle was unable to resolve a service.  `"+t+"` is undefined.");return n},l=function(e){var t;return this.nested[e]||(t=a.pop(),this.nested[e]=t,this.factory(e,function(){return t.container})),this.nested[e]},f=function(e){return e.split(".").reduce(c,this)},h=function(e,t){return t(e)},d=function(e,t){return(e[t]||[]).concat(e.__global__||[])},p=function(e,t){var n,r,i,a,s;return this.id,i=this.container,a=this.decorators,s=this.middlewares,n=e+"Provider",(r=Object.create(null))[n]={configurable:!0,enumerable:!0,get:function(){var e=new t;return delete i[n],i[n]=e,e}},r[e]={configurable:!0,enumerable:!0,get:function(){var t,r=i[n];return r&&(t=d(a,e).reduce(h,r.$get(i)),delete i[n],delete i[e]),t===o?t:function(e,t,n,r){var i={configurable:!0,enumerable:!0};return e.length?i.get=function(){var t=0,r=function(i){if(i)throw i;e[t]&&e[t++](n,r)};return r(),n}:(i.value=n,i.writable=!0),Object.defineProperty(r,t,i),r[t]}(d(s,e),e,t,i)}},Object.defineProperties(i,r),this},v=function(e,t){var n,r;return n=e.split("."),this.providerMap[e]&&1===n.length&&!this.container[e+"Provider"]?console.error(e+" provider already instantiated."):(this.originalProviders[e]=t,this.providerMap[e]=!0,r=n.shift(),n.length?(l.call(this,r).provider(n.join("."),t),this):p.call(this,r,t))},m=function(e,t){return v.call(this,e,function(){this.$get=t})},y=function(e,t,n){var r=arguments.length>3?u.call(arguments,3):[],i=this;return m.call(this,e,function(){var e=t,o=r.map(f,i.container);return n?new(t.bind.apply(t,[null].concat(o))):e.apply(null,o)})},g=function(e,t){Object.defineProperty(this,e,{configurable:!0,enumerable:!0,value:t,writable:!0})},b=function(e,t){var n=e[t];return n||g.call(e,t,n={}),n},w=function(e,t){var n,r;return"function"==typeof e&&(t=e,e="__global__"),r=(n=e.split(".")).shift(),n.length?l.call(this,r).decorator(n.join("."),t):(this.decorators[r]||(this.decorators[r]=[]),this.decorators[r].push(t)),this},_=function(e){return!/^\$(?:decorator|register|list)$|Provider$/.test(e)},k=function(e){return Object.keys(e||this.container||{}).filter(_)},x={},E=function(e){var t=e.$value===o?e:e.$value;return this[e.$type||"service"].apply(this,[e.$name,t].concat(e.$inject||[]))},T=function(e){delete this.providerMap[e],delete this.container[e],delete this.container[e+"Provider"]};(a=function e(t){if(!(this instanceof e))return e.pop(t);this.id=s++,this.decorators={},this.middlewares={},this.nested={},this.providerMap={},this.originalProviders={},this.deferred=[],this.container={$decorator:w.bind(this),$register:E.bind(this),$list:k.bind(this)}}).prototype={constant:function(e,t){var n=e.split(".");return e=n.pop(),function(e,t){Object.defineProperty(this,e,{configurable:!1,enumerable:!0,value:t,writable:!1})}.call(n.reduce(b,this.container),e,t),this},decorator:w,defer:function(e){return this.deferred.push(e),this},digest:function(e){return(e||[]).map(f,this.container)},factory:m,instanceFactory:function(e,t){return m.call(this,e,function(e){return{instance:t.bind(t,e)}})},list:k,middleware:function(e,t){var n,r;return"function"==typeof e&&(t=e,e="__global__"),r=(n=e.split(".")).shift(),n.length?l.call(this,r).middleware(n.join("."),t):(this.middlewares[r]||(this.middlewares[r]=[]),this.middlewares[r].push(t)),this},provider:v,resetProviders:function(e){var t=this.originalProviders,n=Array.isArray(e);Object.keys(this.originalProviders).forEach(function(r){if(!n||-1!==e.indexOf(r)){var i=r.split(".");i.length>1&&i.forEach(T,l.call(this,i[0])),T.call(this,r),this.provider(r,t[r])}},this)},register:E,resolve:function(e){return this.deferred.forEach(function(t){t(e)}),this},service:function(e,t){return y.apply(this,[e,t,!0].concat(u.call(arguments,2)))},serviceFactory:function(e,t){return y.apply(this,[e,t,!1].concat(u.call(arguments,2)))},value:function(e,t){var n;return e=(n=e.split(".")).pop(),g.call(n.reduce(b,this.container),e,t),this}},a.pop=function(e){var t;return"string"==typeof e?((t=x[e])||(x[e]=t=new a,t.constant("BOTTLE_NAME",e)),t):new a},a.clear=function(e){"string"==typeof e?delete x[e]:x={}},a.list=k,a.config={strict:!1};var A,S,C,I,O,P={function:!0,object:!0};A=P[typeof window]&&window||this,S=P[typeof t]&&t&&!t.nodeType&&t,C=P[typeof e]&&e&&!e.nodeType&&e,I=C&&C.exports===S&&S,!(O=P[typeof r]&&r)||O.global!==O&&O.window!==O||(A=O),"object"==typeof n(98)&&n(98)?(A.Bottle=a,(i=function(){return a}.call(t,n,t,e))===o||(e.exports=i)):S&&C?I?(C.exports=a).Bottle=a:S.Bottle=a:A.Bottle=a}).call(this)}).call(this,n(68)(e),n(42))},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,i=Array(r);++n<r;)i[n]=t(e[n],n,e);return i}},function(e,t,n){var r=n(31),i="["+n(119)+"]",o=RegExp("^"+i+i+"*"),a=RegExp(i+i+"*$");e.exports=function(e,t){return e=String(r(e)),1&t&&(e=e.replace(o,"")),2&t&&(e=e.replace(a,"")),e}},function(e,t,n){var r=n(29).f,i=n(38),o=n(20)("toStringTag");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},function(e,t,n){var r=n(236),i=n(159);e.exports=Object.keys||function(e){return r(e,i)}},function(e,t,n){var r=n(9),i=n(231),o=n(159),a=n(578),s=n(238),u=n(124)("IE_PROTO"),c=function(){},l=function(){var e,t=s("iframe"),n=o.length;for(t.style.display="none",a.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),l=e.F;n--;)delete l.prototype[o[n]];return l()};e.exports=Object.create||function(e,t){var n;return null!==e?(c.prototype=r(e),n=new c,c.prototype=null,n[u]=e):n=l(),void 0===t?n:i(n,t)},n(93)[u]=!0},function(e,t,n){var r=n(47),i=Math.max,o=Math.min;e.exports=function(e,t){var n=r(e);return n<0?i(n+t,0):o(n,t)}},function(e,t,n){var r,i,o,a=n(580),s=n(23),u=n(41),c=n(38),l=n(124),f=n(93),h=n(21).WeakMap;if(a){var d=new h,p=d.get,v=d.has,m=d.set;r=function(e,t){return m.call(d,e,t),t},i=function(e){return p.call(d,e)||{}},o=function(e){return v.call(d,e)}}else{var y=l("state");f[y]=!0,r=function(e,t){return u(e,y,t),t},i=function(e){return c(e,y)?e[y]:{}},o=function(e){return c(e,y)}}e.exports={set:r,get:i,has:o,enforce:function(e){return o(e)?i(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!s(t)||(n=i(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){var r=n(102),i=1/0;e.exports=function(e){if("string"==typeof e||r(e))return e;var t=e+"";return"0"==t&&1/e==-i?"-0":t}},function(e,t){e.exports=function(e,t){return e===t||e!=e&&t!=t}},function(e,t,n){var r=n(399),i=n(39),o=Object.prototype,a=o.hasOwnProperty,s=o.propertyIsEnumerable,u=r(function(){return arguments}())?r:function(e){return i(e)&&a.call(e,"callee")&&!s.call(e,"callee")};e.exports=u},function(e,t,n){var r=n(44).Symbol;e.exports=r},function(e,t,n){"use strict";function r(e){switch(Object.prototype.toString.call(e)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return v(e,Error)}}function i(e){return"[object ErrorEvent]"===Object.prototype.toString.call(e)}function o(e){return"[object DOMError]"===Object.prototype.toString.call(e)}function a(e){return"[object DOMException]"===Object.prototype.toString.call(e)}function s(e){return"[object String]"===Object.prototype.toString.call(e)}function u(e){return null===e||"object"!=typeof e&&"function"!=typeof e}function c(e){return"[object Object]"===Object.prototype.toString.call(e)}function l(e){return"undefined"!=typeof Event&&v(e,Event)}function f(e){return"undefined"!=typeof Element&&v(e,Element)}function h(e){return"[object RegExp]"===Object.prototype.toString.call(e)}function d(e){return Boolean(e&&e.then&&"function"==typeof e.then)}function p(e){return c(e)&&"nativeEvent"in e&&"preventDefault"in e&&"stopPropagation"in e}function v(e,t){try{return e instanceof t}catch(e){return!1}}n.d(t,"d",function(){return r}),n.d(t,"e",function(){return i}),n.d(t,"a",function(){return o}),n.d(t,"b",function(){return a}),n.d(t,"k",function(){return s}),n.d(t,"i",function(){return u}),n.d(t,"h",function(){return c}),n.d(t,"f",function(){return l}),n.d(t,"c",function(){return f}),n.d(t,"j",function(){return h}),n.d(t,"m",function(){return d}),n.d(t,"l",function(){return p}),n.d(t,"g",function(){return v})},function(e,t,n){var r=n(301),i=n(189);e.exports=function(e,t){return null!=e&&i(e,t,r)}},function(e,t,n){var r=n(324),i=n(313)(function(e,t,n){r(e,t,n)});e.exports=i},function(e,t,n){var r;r=function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=5)}([function(e,t,n){"use strict";e.exports=function(e,t){var n,r,i;for(n=1;n<arguments.length;n++)for(i in r=arguments[n])r.hasOwnProperty(i)&&(e[i]=r[i]);return e}},function(e,t,n){"use strict";var r=n(0);e.exports={build:function(e,t){var n,i,o,a=t.plugins;for(n=0,i=a.length;n<i;n++)(o=a[n]).methods&&r(e,o.methods),o.properties&&Object.defineProperties(e,o.properties)},hook:function(e,t,n){var r,i,o,a,s=e.config.plugins,u=[e.context];for(n&&(u=u.concat(n)),r=0,i=s.length;r<i;r++)a=s[r],(o=s[r][t])&&o.apply(a,u)}}},function(e,t,n){"use strict";function r(e){if(0===e.length)return e;var t,n,r=e.split(/[_-]/);if(1===r.length&&r[0][0].toLowerCase()===r[0][0])return e;for(n=r[0].toLowerCase(),t=1;t<r.length;t++)n=n+r[t].charAt(0).toUpperCase()+r[t].substring(1).toLowerCase();return n}r.prepended=function(e,t){return e+(t=r(t))[0].toUpperCase()+t.substring(1)},e.exports=r},function(e,t,n){"use strict";var r=n(0),i=n(2);function o(e,t){e=e||{},this.options=e,this.defaults=t.defaults,this.states=[],this.transitions=[],this.map={},this.lifecycle=this.configureLifecycle(),this.init=this.configureInitTransition(e.init),this.data=this.configureData(e.data),this.methods=this.configureMethods(e.methods),this.map[this.defaults.wildcard]={},this.configureTransitions(e.transitions||[]),this.plugins=this.configurePlugins(e.plugins,t.plugin)}r(o.prototype,{addState:function(e){this.map[e]||(this.states.push(e),this.addStateLifecycleNames(e),this.map[e]={})},addStateLifecycleNames:function(e){this.lifecycle.onEnter[e]=i.prepended("onEnter",e),this.lifecycle.onLeave[e]=i.prepended("onLeave",e),this.lifecycle.on[e]=i.prepended("on",e)},addTransition:function(e){this.transitions.indexOf(e)<0&&(this.transitions.push(e),this.addTransitionLifecycleNames(e))},addTransitionLifecycleNames:function(e){this.lifecycle.onBefore[e]=i.prepended("onBefore",e),this.lifecycle.onAfter[e]=i.prepended("onAfter",e),this.lifecycle.on[e]=i.prepended("on",e)},mapTransition:function(e){var t=e.name,n=e.from,r=e.to;return this.addState(n),"function"!=typeof r&&this.addState(r),this.addTransition(t),this.map[n][t]=e,e},configureLifecycle:function(){return{onBefore:{transition:"onBeforeTransition"},onAfter:{transition:"onAfterTransition"},onEnter:{state:"onEnterState"},onLeave:{state:"onLeaveState"},on:{transition:"onTransition"}}},configureInitTransition:function(e){return"string"==typeof e?this.mapTransition(r({},this.defaults.init,{to:e,active:!0})):"object"==typeof e?this.mapTransition(r({},this.defaults.init,e,{active:!0})):(this.addState(this.defaults.init.from),this.defaults.init)},configureData:function(e){return"function"==typeof e?e:"object"==typeof e?function(){return e}:function(){return{}}},configureMethods:function(e){return e||{}},configurePlugins:function(e,t){var n,r,i;for(n=0,r=(e=e||[]).length;n<r;n++)"function"==typeof(i=e[n])&&(e[n]=i=i()),i.configure&&i.configure(this);return e},configureTransitions:function(e){var t,n,r,i,o,a=this.defaults.wildcard;for(n=0;n<e.length;n++)for(r=e[n],i=Array.isArray(r.from)?r.from:[r.from||a],o=r.to||a,t=0;t<i.length;t++)this.mapTransition({name:r.name,from:i[t],to:o})},transitionFor:function(e,t){var n=this.defaults.wildcard;return this.map[e][t]||this.map[n][t]},transitionsFor:function(e){var t=this.defaults.wildcard;return Object.keys(this.map[e]).concat(Object.keys(this.map[t]))},allStates:function(){return this.states},allTransitions:function(){return this.transitions}}),e.exports=o},function(e,t,n){var r=n(0),i=n(6),o=n(1),a=[null,[]];function s(e,t){this.context=e,this.config=t,this.state=t.init.from,this.observers=[e]}r(s.prototype,{init:function(e){if(r(this.context,this.config.data.apply(this.context,e)),o.hook(this,"init"),this.config.init.active)return this.fire(this.config.init.name,[])},is:function(e){return Array.isArray(e)?e.indexOf(this.state)>=0:this.state===e},isPending:function(){return this.pending},can:function(e){return!this.isPending()&&!!this.seek(e)},cannot:function(e){return!this.can(e)},allStates:function(){return this.config.allStates()},allTransitions:function(){return this.config.allTransitions()},transitions:function(){return this.config.transitionsFor(this.state)},seek:function(e,t){var n=this.config.defaults.wildcard,r=this.config.transitionFor(this.state,e),i=r&&r.to;return"function"==typeof i?i.apply(this.context,t):i===n?this.state:i},fire:function(e,t){return this.transit(e,this.state,this.seek(e,t),t)},transit:function(e,t,n,r){var i=this.config.lifecycle,o=this.config.options.observeUnchangedState||t!==n;return n?this.isPending()?this.context.onPendingTransition(e,t,n):(this.config.addState(n),this.beginTransit(),r.unshift({transition:e,from:t,to:n,fsm:this.context}),this.observeEvents([this.observersForEvent(i.onBefore.transition),this.observersForEvent(i.onBefore[e]),o?this.observersForEvent(i.onLeave.state):a,o?this.observersForEvent(i.onLeave[t]):a,this.observersForEvent(i.on.transition),o?["doTransit",[this]]:a,o?this.observersForEvent(i.onEnter.state):a,o?this.observersForEvent(i.onEnter[n]):a,o?this.observersForEvent(i.on[n]):a,this.observersForEvent(i.onAfter.transition),this.observersForEvent(i.onAfter[e]),this.observersForEvent(i.on[e])],r)):this.context.onInvalidTransition(e,t,n)},beginTransit:function(){this.pending=!0},endTransit:function(e){return this.pending=!1,e},failTransit:function(e){throw this.pending=!1,e},doTransit:function(e){this.state=e.to},observe:function(e){if(2===e.length){var t={};t[e[0]]=e[1],this.observers.push(t)}else this.observers.push(e[0])},observersForEvent:function(e){for(var t,n=0,r=this.observers.length,i=[];n<r;n++)(t=this.observers[n])[e]&&i.push(t);return[e,i,!0]},observeEvents:function(e,t,n,r){if(0===e.length)return this.endTransit(void 0===r||r);var i=e[0][0],a=e[0][1],s=e[0][2];if(t[0].event=i,i&&s&&i!==n&&o.hook(this,"lifecycle",t),0===a.length)return e.shift(),this.observeEvents(e,t,i,r);var u=a.shift(),c=u[i].apply(u,t);return c&&"function"==typeof c.then?c.then(this.observeEvents.bind(this,e,t,i)).catch(this.failTransit.bind(this)):!1===c?this.endTransit(!1):this.observeEvents(e,t,i,c)},onInvalidTransition:function(e,t,n){throw new i("transition is invalid in current state",e,t,n,this.state)},onPendingTransition:function(e,t,n){throw new i("transition is invalid while previous transition is still in progress",e,t,n,this.state)}}),e.exports=s},function(e,t,n){"use strict";var r=n(0),i=n(2),o=n(1),a=n(3),s=n(4),u={is:function(e){return this._fsm.is(e)},can:function(e){return this._fsm.can(e)},cannot:function(e){return this._fsm.cannot(e)},observe:function(){return this._fsm.observe(arguments)},transitions:function(){return this._fsm.transitions()},allTransitions:function(){return this._fsm.allTransitions()},allStates:function(){return this._fsm.allStates()},onInvalidTransition:function(e,t,n){return this._fsm.onInvalidTransition(e,t,n)},onPendingTransition:function(e,t,n){return this._fsm.onPendingTransition(e,t,n)}},c={state:{configurable:!1,enumerable:!0,get:function(){return this._fsm.state},set:function(e){throw Error("use transitions to change state")}}};function l(e){return f(this||{},e)}function f(e,t){return h(e,new a(t,l)),e._fsm(),e}function h(e,t){if("object"!=typeof e||Array.isArray(e))throw Error("StateMachine can only be applied to objects");o.build(e,t),Object.defineProperties(e,c),r(e,u),r(e,t.methods),t.allTransitions().forEach(function(t){e[i(t)]=function(){return this._fsm.fire(t,[].slice.call(arguments))}}),e._fsm=function(){this._fsm=new s(this,t),this._fsm.init(arguments)}}l.version="3.0.1",l.factory=function(){var e,t;"function"==typeof arguments[0]?(e=arguments[0],t=arguments[1]||{}):(e=function(){this._fsm.apply(this,arguments)},t=arguments[0]||{});var n=new a(t,l);return h(e.prototype,n),e.prototype._fsm.config=n,e},l.apply=f,l.defaults={wildcard:"*",init:{name:"init",from:"none"}},e.exports=l},function(e,t,n){"use strict";e.exports=function(e,t,n,r,i){this.message=e,this.transition=t,this.from=n,this.to=r,this.current=i}}])},e.exports=r()},function(e,t,n){var r=n(99),i=n(296),o=Object.prototype.hasOwnProperty,a=i(function(e,t,n){o.call(e,n)?e[n].push(t):r(e,n,[t])});e.exports=a},function(e,t,n){var r=n(123)("meta"),i=n(120),o=n(23),a=n(38),s=n(29).f,u=0,c=Object.isExtensible||function(){return!0},l=function(e){s(e,r,{value:{objectID:"O"+ ++u,weakData:{}}})},f=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,r)){if(!c(e))return"F";if(!t)return"E";l(e)}return e[r].objectID},getWeakData:function(e,t){if(!a(e,r)){if(!c(e))return!0;if(!t)return!1;l(e)}return e[r].weakData},onFreeze:function(e){return i&&f.REQUIRED&&c(e)&&!a(e,r)&&l(e),e}};n(93)[r]=!0},function(e,t,n){var r=n(14),i=n(20)("species");e.exports=function(e){return!r(function(){var t=[];return(t.constructor={})[i]=function(){return{foo:1}},1!==t[e](Boolean).foo})}},function(e,t,n){var r=n(23),i=n(63),o=n(20)("species");e.exports=function(e,t){var n;return i(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[o])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)}},function(e,t){e.exports={}},function(e,t,n){var r=n(38),i=n(22),o=n(124)("IE_PROTO"),a=n(233),s=Object.prototype;e.exports=a?Object.getPrototypeOf:function(e){return e=i(e),r(e,o)?e[o]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?s:null}},function(e,t,n){var r=n(14),i=n(65),o="".split;e.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return"String"==i(e)?o.call(e,""):Object(e)}:Object},function(e,t,n){"use strict";var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,o=i&&!r.call({1:2},1);t.f=o?function(e){var t=i(this,e);return!!t&&t.enumerable}:r},function(e,t){e.exports={}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){var r=n(21),i=n(162),o=r["__core-js_shared__"]||i("__core-js_shared__",{});(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.0.1",mode:n(10)?"pure":"global",copyright:"Â© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.deserializeError=t.serializeError=void 0;t.serializeError=function(e){return{name:e.name,message:e.message,stack:e.stack}};t.deserializeError=function(e){var t=new Error;return Object.keys(e).forEach(function(n){return t[n]=e[n]}),t}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ERR_NO_IFRAME_SRC=t.ERR_NOT_IN_IFRAME=t.ERR_CONNECTION_TIMEOUT=t.ERR_CONNECTION_DESTROYED=void 0;t.ERR_CONNECTION_DESTROYED="ConnectionDestroyed";t.ERR_CONNECTION_TIMEOUT="ConnectionTimeout";t.ERR_NOT_IN_IFRAME="NotInIframe";t.ERR_NO_IFRAME_SRC="NoIframeSrc"},function(e,t){(function(t){e.exports=t}).call(this,{})},function(e,t,n){var r=n(183);e.exports=function(e,t,n){"__proto__"==t&&r?r(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}},function(e,t,n){var r=n(101),i=n(185),o=n(184);e.exports=function(e,t){return o(i(e,t,r),e+"")}},function(e,t){e.exports=function(e){return e}},function(e,t,n){var r=n(43),i=n(39),o="[object Symbol]";e.exports=function(e){return"symbol"==typeof e||i(e)&&r(e)==o}},function(e,t,n){var r=n(13),i=n(135),o=n(346),a=n(343);e.exports=function(e,t){return r(e)?e:i(e,t)?[e]:o(a(e))}},function(e,t){var n=Object.prototype;e.exports=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||n)}},function(e,t,n){var r=n(355),i=n(138),o=n(354),a=o&&o.isTypedArray,s=a?i(a):r;e.exports=s},function(e,t){var n=9007199254740991,r=/^(?:0|[1-9]\d*)$/;e.exports=function(e,t){var i=typeof e;return!!(t=null==t?n:t)&&("number"==i||"symbol"!=i&&r.test(e))&&e>-1&&e%1==0&&e<t}},function(e,t,n){(function(e){var r=n(44),i=n(356),o="object"==typeof t&&t&&!t.nodeType&&t,a=o&&"object"==typeof e&&e&&!e.nodeType&&e,s=a&&a.exports===o?r.Buffer:void 0,u=(s?s.isBuffer:void 0)||i;e.exports=u}).call(this,n(68)(e))},function(e,t,n){var r=n(196),i=n(194),o=n(59);e.exports=function(e){return o(e)?r(e):i(e)}},function(e,t,n){var r=n(371);e.exports=function(e,t){var n=e.__data__;return r(t)?n["string"==typeof t?"string":"hash"]:n.map}},function(e,t,n){var r=n(60)(Object,"create");e.exports=r},function(e,t,n){var r=n(78);e.exports=function(e,t){for(var n=e.length;n--;)if(r(e[n][0],t))return n;return-1}},function(e,t,n){var r=n(393),i=n(392),o=n(391),a=n(390),s=n(389);function u(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}u.prototype.clear=r,u.prototype.delete=i,u.prototype.get=o,u.prototype.has=a,u.prototype.set=s,e.exports=u},function(e,t,n){"use strict";(function(e,r){n.d(t,"d",function(){return o}),n.d(t,"j",function(){return a}),n.d(t,"g",function(){return u}),n.d(t,"n",function(){return c}),n.d(t,"l",function(){return l}),n.d(t,"e",function(){return f}),n.d(t,"c",function(){return h}),n.d(t,"b",function(){return d}),n.d(t,"a",function(){return p}),n.d(t,"h",function(){return v}),n.d(t,"i",function(){return m}),n.d(t,"m",function(){return g}),n.d(t,"k",function(){return w}),n.d(t,"f",function(){return k});var i=n(81);function o(e,t){return e.require(t)}function a(){return"[object process]"===Object.prototype.toString.call(void 0!==e?e:0)}var s={};function u(){return a()?r:"undefined"!=typeof window?window:"undefined"!=typeof self?self:s}function c(){var e=u(),t=e.crypto||e.msCrypto;if(void 0!==t&&t.getRandomValues){var n=new Uint16Array(8);t.getRandomValues(n),n[3]=4095&n[3]|16384,n[4]=16383&n[4]|32768;var r=function(e){for(var t=e.toString(16);t.length<4;)t="0"+t;return t};return r(n[0])+r(n[1])+r(n[2])+r(n[3])+r(n[4])+r(n[5])+r(n[6])+r(n[7])}return"xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})}function l(e){if(!e)return{};var t=e.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);if(!t)return{};var n=t[6]||"",r=t[8]||"";return{host:t[4],path:t[5],protocol:t[2],relative:t[5]+n+r}}function f(e){if(e.message)return e.message;if(e.exception&&e.exception.values&&e.exception.values[0]){var t=e.exception.values[0];return t.type&&t.value?t.type+": "+t.value:t.type||t.value||e.event_id||"<unknown>"}return e.event_id||"<unknown>"}function h(e){var t=u();if(!("console"in t))return e();var n=t.console,r={};["debug","info","warn","error","log","assert"].forEach(function(e){e in t.console&&n[e].__sentry_original__&&(r[e]=n[e],n[e]=n[e].__sentry_original__)});var i=e();return Object.keys(r).forEach(function(e){n[e]=r[e]}),i}function d(e,t,n){e.exception=e.exception||{},e.exception.values=e.exception.values||[],e.exception.values[0]=e.exception.values[0]||{},e.exception.values[0].value=e.exception.values[0].value||t||"",e.exception.values[0].type=e.exception.values[0].type||n||"Error"}function p(e,t){void 0===t&&(t={});try{e.exception.values[0].mechanism=e.exception.values[0].mechanism||{},Object.keys(t).forEach(function(n){e.exception.values[0].mechanism[n]=t[n]})}catch(e){}}function v(){try{return document.location.href}catch(e){return""}}function m(e){try{for(var t=e,n=[],r=0,i=0,o=" > ".length,a=void 0;t&&r++<5&&!("html"===(a=y(t))||r>1&&i+n.length*o+a.length>=80);)n.push(a),i+=a.length,t=t.parentNode;return n.reverse().join(" > ")}catch(e){return"<unknown>"}}function y(e){var t,n,r,o,a,s=e,u=[];if(!s||!s.tagName)return"";if(u.push(s.tagName.toLowerCase()),s.id&&u.push("#"+s.id),(t=s.className)&&Object(i.k)(t))for(n=t.split(/\s+/),a=0;a<n.length;a++)u.push("."+n[a]);var c=["type","name","title","alt"];for(a=0;a<c.length;a++)r=c[a],(o=s.getAttribute(r))&&u.push("["+r+'="'+o+'"]');return u.join("")}function g(){return(new Date).getTime()/1e3}var b=6e4;function w(e,t){if(!t)return b;var n=parseInt(""+t,10);if(!isNaN(n))return 1e3*n;var r=Date.parse(""+t);return isNaN(r)?b:r-e}var _="<anonymous>";function k(e){try{return e&&"function"==typeof e&&e.name||_}catch(e){return _}}}).call(this,n(127),n(42))},function(e,t,n){"use strict";n.d(t,"a",function(){return u}),n.d(t,"b",function(){return l});var r=n(5),i=n(405),o=n(81),a=n(407),s=n(113),u=function(){function e(){this._notifyingListeners=!1,this._scopeListeners=[],this._eventProcessors=[],this._breadcrumbs=[],this._user={},this._tags={},this._extra={},this._context={}}return e.prototype.addScopeListener=function(e){this._scopeListeners.push(e)},e.prototype.addEventProcessor=function(e){return this._eventProcessors.push(e),this},e.prototype._notifyScopeListeners=function(){var e=this;this._notifyingListeners||(this._notifyingListeners=!0,setTimeout(function(){e._scopeListeners.forEach(function(t){t(e)}),e._notifyingListeners=!1}))},e.prototype._notifyEventProcessors=function(e,t,n,a){var s=this;return void 0===a&&(a=0),new i.a(function(i,u){var c=e[a];if(null===t||"function"!=typeof c)i(t);else{var l=c(r.a({},t),n);Object(o.m)(l)?l.then(function(t){return s._notifyEventProcessors(e,t,n,a+1).then(i)}).then(null,u):s._notifyEventProcessors(e,l,n,a+1).then(i).then(null,u)}})},e.prototype.setUser=function(e){return this._user=Object(a.c)(e),this._notifyScopeListeners(),this},e.prototype.setTags=function(e){return this._tags=r.a({},this._tags,Object(a.c)(e)),this._notifyScopeListeners(),this},e.prototype.setTag=function(e,t){var n;return this._tags=r.a({},this._tags,((n={})[e]=Object(a.c)(t),n)),this._notifyScopeListeners(),this},e.prototype.setExtras=function(e){return this._extra=r.a({},this._extra,Object(a.c)(e)),this._notifyScopeListeners(),this},e.prototype.setExtra=function(e,t){var n;return this._extra=r.a({},this._extra,((n={})[e]=Object(a.c)(t),n)),this._notifyScopeListeners(),this},e.prototype.setFingerprint=function(e){return this._fingerprint=Object(a.c)(e),this._notifyScopeListeners(),this},e.prototype.setLevel=function(e){return this._level=Object(a.c)(e),this._notifyScopeListeners(),this},e.prototype.setTransaction=function(e){return this._transaction=e,this._notifyScopeListeners(),this},e.prototype.setContext=function(e,t){return this._context[e]=t?Object(a.c)(t):void 0,this._notifyScopeListeners(),this},e.prototype.setSpan=function(e){return this._span=e,this._notifyScopeListeners(),this},e.prototype.getSpan=function(){return this._span},e.clone=function(t){var n=new e;return t&&(n._breadcrumbs=r.d(t._breadcrumbs),n._tags=r.a({},t._tags),n._extra=r.a({},t._extra),n._context=r.a({},t._context),n._user=t._user,n._level=t._level,n._span=t._span,n._transaction=t._transaction,n._fingerprint=t._fingerprint,n._eventProcessors=r.d(t._eventProcessors)),n},e.prototype.clear=function(){return this._breadcrumbs=[],this._tags={},this._extra={},this._user={},this._context={},this._level=void 0,this._transaction=void 0,this._fingerprint=void 0,this._span=void 0,this._notifyScopeListeners(),this},e.prototype.addBreadcrumb=function(e,t){var n=Object(s.m)(),i=r.a({timestamp:n},e);return this._breadcrumbs=void 0!==t&&t>=0?r.d(this._breadcrumbs,[Object(a.c)(i)]).slice(-t):r.d(this._breadcrumbs,[Object(a.c)(i)]),this._notifyScopeListeners(),this},e.prototype.clearBreadcrumbs=function(){return this._breadcrumbs=[],this._notifyScopeListeners(),this},e.prototype._applyFingerprint=function(e){e.fingerprint=e.fingerprint?Array.isArray(e.fingerprint)?e.fingerprint:[e.fingerprint]:[],this._fingerprint&&(e.fingerprint=e.fingerprint.concat(this._fingerprint)),e.fingerprint&&!e.fingerprint.length&&delete e.fingerprint},e.prototype.applyToEvent=function(e,t){return this._extra&&Object.keys(this._extra).length&&(e.extra=r.a({},this._extra,e.extra)),this._tags&&Object.keys(this._tags).length&&(e.tags=r.a({},this._tags,e.tags)),this._user&&Object.keys(this._user).length&&(e.user=r.a({},this._user,e.user)),this._context&&Object.keys(this._context).length&&(e.contexts=r.a({},this._context,e.contexts)),this._level&&(e.level=this._level),this._transaction&&(e.transaction=this._transaction),this._applyFingerprint(e),e.breadcrumbs=r.d(e.breadcrumbs||[],this._breadcrumbs),e.breadcrumbs=e.breadcrumbs.length>0?e.breadcrumbs:void 0,this._notifyEventProcessors(r.d(c(),this._eventProcessors),e,t)},e}();function c(){var e=Object(s.g)();return e.__SENTRY__=e.__SENTRY__||{},e.__SENTRY__.globalEventProcessors=e.__SENTRY__.globalEventProcessors||[],e.__SENTRY__.globalEventProcessors}function l(e){c().push(e)}},function(e,t,n){"use strict";var r=n(41),i=n(54),o=n(14),a=n(20),s=n(148),u=a("species"),c=!o(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")}),l=!o(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]});e.exports=function(e,t,n,f){var h=a(e),d=!o(function(){var t={};return t[h]=function(){return 7},7!=""[e](t)}),p=d&&!o(function(){var t=!1,n=/a/;return n.exec=function(){return t=!0,null},"split"===e&&(n.constructor={},n.constructor[u]=function(){return n}),n[h](""),!t});if(!d||!p||"replace"===e&&!c||"split"===e&&!l){var v=/./[h],m=n(h,""[e],function(e,t,n,r,i){return t.exec===s?d&&!i?{done:!0,value:v.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),y=m[0],g=m[1];i(String.prototype,e,y),i(RegExp.prototype,h,2==t?function(e,t){return g.call(e,this,t)}:function(e){return g.call(e,this)}),f&&r(RegExp.prototype[h],"sham",!0)}}},function(e,t,n){var r=n(65),i=n(148);e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var o=n.call(e,t);if("object"!=typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(e))throw TypeError("RegExp#exec called on incompatible receiver");return i.call(e,t)}},function(e,t,n){"use strict";var r=n(125);e.exports=function(e,t,n){return t+(n?r(e,t,!0).length:1)}},function(e,t,n){"use strict";e.exports=n(10)||!n(14)(function(){var e=Math.random();__defineSetter__.call(null,e,function(){}),delete n(21)[e]})},function(e,t){e.exports="\t\n\v\f\r Â áš€â€€â€�â€‚â€ƒâ€„â€…â€†â€‡â€ˆâ€‰â€Šâ€¯â�Ÿã€€\u2028\u2029\ufeff"},function(e,t,n){e.exports=!n(14)(function(){return Object.isExtensible(Object.preventExtensions({}))})},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var r=n(236),i=n(159).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t,n){var r=n(95)("keys"),i=n(123);e.exports=function(e){return r[e]||(r[e]=i(e))}},function(e,t,n){var r=n(47),i=n(31);e.exports=function(e,t,n){var o,a,s=String(i(e)),u=r(t),c=s.length;return u<0||u>=c?n?"":void 0:(o=s.charCodeAt(u))<55296||o>56319||u+1===c||(a=s.charCodeAt(u+1))<56320||a>57343?n?s.charAt(u):o:n?s.slice(u,u+2):a-56320+(o-55296<<10)+65536}},function(e,t,n){"use strict";var r=n(125),i=n(76),o=n(161),a=i.set,s=i.getterFor("String Iterator");o(String,"String",function(e){a(this,{type:"String Iterator",string:String(e),index:0})},function(){var e,t=s(this),n=t.string,i=t.index;return i>=n.length?{value:void 0,done:!0}:(e=r(n,i,!0),t.index+=e.length,{value:e,done:!1})})},function(e,t){var n,r,i=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===o||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:o}catch(e){n=o}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var u,c=[],l=!1,f=-1;function h(){l&&u&&(l=!1,u.length?c=u.concat(c):f=-1,c.length&&d())}function d(){if(!l){var e=s(h);l=!0;for(var t=c.length;t;){for(u=c,c=[];++f<t;)u&&u[f].run();f=-1,t=c.length}u=null,l=!1,function(e){if(r===clearTimeout)return clearTimeout(e);if((r===a||!r)&&clearTimeout)return r=clearTimeout,clearTimeout(e);try{r(e)}catch(t){try{return r.call(null,e)}catch(t){return r.call(this,e)}}}(e)}}function p(e,t){this.fun=e,this.array=t}function v(){}i.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];c.push(new p(e,t)),1!==c.length||l||s(d)},p.prototype.run=function(){this.fun.apply(null,this.array)},i.title="browser",i.browser=!0,i.env={},i.argv=[],i.version="",i.versions={},i.on=v,i.addListener=v,i.once=v,i.off=v,i.removeListener=v,i.removeAllListeners=v,i.emit=v,i.prependListener=v,i.prependOnceListener=v,i.listeners=function(e){return[]},i.binding=function(e){throw new Error("process.binding is not supported")},i.cwd=function(){return"/"},i.chdir=function(e){throw new Error("process.chdir is not supported")},i.umask=function(){return 0}},function(e,t,n){var r=n(310);e.exports=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&r(e,t)}},function(e,t){function n(t){return e.exports=n=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},n(t)}e.exports=n},function(e,t,n){var r=n(312),i=n(311);e.exports=function(e,t){return!t||"object"!==r(t)&&"function"!=typeof t?i(e):t}},function(e,t,n){var r,i,o;!function(a,s){"use strict";"object"==typeof e&&e.exports?e.exports=s(n(175),n(174),n(173)):(i=[n(175),n(174),n(173)],void 0===(o="function"==typeof(r=s)?r.apply(t,i):r)||(e.exports=o))}(0,function(e,t,n,r){"use strict";var i=r&&r.URI;function o(e,t){var n=arguments.length>=1,r=arguments.length>=2;if(!(this instanceof o))return n?r?new o(e,t):new o(e):new o;if(void 0===e){if(n)throw new TypeError("undefined is not a valid argument for URI");e="undefined"!=typeof location?location.href+"":""}if(null===e&&n)throw new TypeError("null is not a valid argument for URI");return this.href(e),void 0!==t?this.absoluteTo(t):this}o.version="1.19.1";var a=o.prototype,s=Object.prototype.hasOwnProperty;function u(e){return e.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function c(e){return void 0===e?"Undefined":String(Object.prototype.toString.call(e)).slice(8,-1)}function l(e){return"Array"===c(e)}function f(e,t){var n,r,i={};if("RegExp"===c(t))i=null;else if(l(t))for(n=0,r=t.length;n<r;n++)i[t[n]]=!0;else i[t]=!0;for(n=0,r=e.length;n<r;n++){(i&&void 0!==i[e[n]]||!i&&t.test(e[n]))&&(e.splice(n,1),r--,n--)}return e}function h(e,t){var n,r;if(l(t)){for(n=0,r=t.length;n<r;n++)if(!h(e,t[n]))return!1;return!0}var i=c(t);for(n=0,r=e.length;n<r;n++)if("RegExp"===i){if("string"==typeof e[n]&&e[n].match(t))return!0}else if(e[n]===t)return!0;return!1}function d(e,t){if(!l(e)||!l(t))return!1;if(e.length!==t.length)return!1;e.sort(),t.sort();for(var n=0,r=e.length;n<r;n++)if(e[n]!==t[n])return!1;return!0}function p(e){return e.replace(/^\/+|\/+$/g,"")}function v(e){return escape(e)}function m(e){return encodeURIComponent(e).replace(/[!'()*]/g,v).replace(/\*/g,"%2A")}o._parts=function(){return{protocol:null,username:null,password:null,hostname:null,urn:null,port:null,path:null,query:null,fragment:null,preventInvalidHostname:o.preventInvalidHostname,duplicateQueryParameters:o.duplicateQueryParameters,escapeQuerySpace:o.escapeQuerySpace}},o.preventInvalidHostname=!1,o.duplicateQueryParameters=!1,o.escapeQuerySpace=!0,o.protocol_expression=/^[a-z][a-z0-9.+-]*$/i,o.idn_expression=/[^a-z0-9\._-]/i,o.punycode_expression=/(xn--)/i,o.ip4_expression=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,o.ip6_expression=/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/,o.find_uri_expression=/\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?Â«Â»â€œâ€�â€˜â€™]))/gi,o.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?Â«Â»â€œâ€�â€žâ€˜â€™]+$/,parens:/(\([^\)]*\)|\[[^\]]*\]|\{[^}]*\}|<[^>]*>)/g},o.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"},o.hostProtocols=["http","https"],o.invalid_hostname_characters=/[^a-zA-Z0-9\.\-:_]/,o.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src",audio:"src",video:"src"},o.getDomAttribute=function(e){if(e&&e.nodeName){var t=e.nodeName.toLowerCase();if("input"!==t||"image"===e.type)return o.domAttributes[t]}},o.encode=m,o.decode=decodeURIComponent,o.iso8859=function(){o.encode=escape,o.decode=unescape},o.unicode=function(){o.encode=m,o.decode=decodeURIComponent},o.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/gi,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/gi,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}},urnpath:{encode:{expression:/%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/gi,map:{"%21":"!","%24":"$","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"=","%40":"@"}},decode:{expression:/[\/\?#:]/g,map:{"/":"%2F","?":"%3F","#":"%23",":":"%3A"}}}},o.encodeQuery=function(e,t){var n=o.encode(e+"");return void 0===t&&(t=o.escapeQuerySpace),t?n.replace(/%20/g,"+"):n},o.decodeQuery=function(e,t){e+="",void 0===t&&(t=o.escapeQuerySpace);try{return o.decode(t?e.replace(/\+/g,"%20"):e)}catch(t){return e}};var y,g={encode:"encode",decode:"decode"},b=function(e,t){return function(n){try{return o[t](n+"").replace(o.characters[e][t].expression,function(n){return o.characters[e][t].map[n]})}catch(e){return n}}};for(y in g)o[y+"PathSegment"]=b("pathname",g[y]),o[y+"UrnPathSegment"]=b("urnpath",g[y]);var w=function(e,t,n){return function(r){var i;i=n?function(e){return o[t](o[n](e))}:o[t];for(var a=(r+"").split(e),s=0,u=a.length;s<u;s++)a[s]=i(a[s]);return a.join(e)}};function _(e){return function(t,n){return void 0===t?this._parts[e]||"":(this._parts[e]=t||null,this.build(!n),this)}}function k(e,t){return function(n,r){return void 0===n?this._parts[e]||"":(null!==n&&(n+="").charAt(0)===t&&(n=n.substring(1)),this._parts[e]=n,this.build(!r),this)}}o.decodePath=w("/","decodePathSegment"),o.decodeUrnPath=w(":","decodeUrnPathSegment"),o.recodePath=w("/","encodePathSegment","decode"),o.recodeUrnPath=w(":","encodeUrnPathSegment","decode"),o.encodeReserved=b("reserved","encode"),o.parse=function(e,t){var n;return t||(t={preventInvalidHostname:o.preventInvalidHostname}),(n=e.indexOf("#"))>-1&&(t.fragment=e.substring(n+1)||null,e=e.substring(0,n)),(n=e.indexOf("?"))>-1&&(t.query=e.substring(n+1)||null,e=e.substring(0,n)),"//"===e.substring(0,2)?(t.protocol=null,e=e.substring(2),e=o.parseAuthority(e,t)):(n=e.indexOf(":"))>-1&&(t.protocol=e.substring(0,n)||null,t.protocol&&!t.protocol.match(o.protocol_expression)?t.protocol=void 0:"//"===e.substring(n+1,n+3)?(e=e.substring(n+3),e=o.parseAuthority(e,t)):(e=e.substring(n+1),t.urn=!0)),t.path=e,t},o.parseHost=function(e,t){e||(e="");var n,r,i=(e=e.replace(/\\/g,"/")).indexOf("/");if(-1===i&&(i=e.length),"["===e.charAt(0))n=e.indexOf("]"),t.hostname=e.substring(1,n)||null,t.port=e.substring(n+2,i)||null,"/"===t.port&&(t.port=null);else{var a=e.indexOf(":"),s=e.indexOf("/"),u=e.indexOf(":",a+1);-1!==u&&(-1===s||u<s)?(t.hostname=e.substring(0,i)||null,t.port=null):(r=e.substring(0,i).split(":"),t.hostname=r[0]||null,t.port=r[1]||null)}return t.hostname&&"/"!==e.substring(i).charAt(0)&&(i++,e="/"+e),t.preventInvalidHostname&&o.ensureValidHostname(t.hostname,t.protocol),t.port&&o.ensureValidPort(t.port),e.substring(i)||"/"},o.parseAuthority=function(e,t){return e=o.parseUserinfo(e,t),o.parseHost(e,t)},o.parseUserinfo=function(e,t){var n,r=e.indexOf("/"),i=e.lastIndexOf("@",r>-1?r:e.length-1);return i>-1&&(-1===r||i<r)?(n=e.substring(0,i).split(":"),t.username=n[0]?o.decode(n[0]):null,n.shift(),t.password=n[0]?o.decode(n.join(":")):null,e=e.substring(i+1)):(t.username=null,t.password=null),e},o.parseQuery=function(e,t){if(!e)return{};if(!(e=e.replace(/&+/g,"&").replace(/^\?*&*|&+$/g,"")))return{};for(var n,r,i,a={},u=e.split("&"),c=u.length,l=0;l<c;l++)n=u[l].split("="),r=o.decodeQuery(n.shift(),t),i=n.length?o.decodeQuery(n.join("="),t):null,s.call(a,r)?("string"!=typeof a[r]&&null!==a[r]||(a[r]=[a[r]]),a[r].push(i)):a[r]=i;return a},o.build=function(e){var t="";return e.protocol&&(t+=e.protocol+":"),e.urn||!t&&!e.hostname||(t+="//"),t+=o.buildAuthority(e)||"","string"==typeof e.path&&("/"!==e.path.charAt(0)&&"string"==typeof e.hostname&&(t+="/"),t+=e.path),"string"==typeof e.query&&e.query&&(t+="?"+e.query),"string"==typeof e.fragment&&e.fragment&&(t+="#"+e.fragment),t},o.buildHost=function(e){var t="";return e.hostname?(o.ip6_expression.test(e.hostname)?t+="["+e.hostname+"]":t+=e.hostname,e.port&&(t+=":"+e.port),t):""},o.buildAuthority=function(e){return o.buildUserinfo(e)+o.buildHost(e)},o.buildUserinfo=function(e){var t="";return e.username&&(t+=o.encode(e.username)),e.password&&(t+=":"+o.encode(e.password)),t&&(t+="@"),t},o.buildQuery=function(e,t,n){var r,i,a,u,c="";for(i in e)if(s.call(e,i)&&i)if(l(e[i]))for(r={},a=0,u=e[i].length;a<u;a++)void 0!==e[i][a]&&void 0===r[e[i][a]+""]&&(c+="&"+o.buildQueryParameter(i,e[i][a],n),!0!==t&&(r[e[i][a]+""]=!0));else void 0!==e[i]&&(c+="&"+o.buildQueryParameter(i,e[i],n));return c.substring(1)},o.buildQueryParameter=function(e,t,n){return o.encodeQuery(e,n)+(null!==t?"="+o.encodeQuery(t,n):"")},o.addQuery=function(e,t,n){if("object"==typeof t)for(var r in t)s.call(t,r)&&o.addQuery(e,r,t[r]);else{if("string"!=typeof t)throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");if(void 0===e[t])return void(e[t]=n);"string"==typeof e[t]&&(e[t]=[e[t]]),l(n)||(n=[n]),e[t]=(e[t]||[]).concat(n)}},o.setQuery=function(e,t,n){if("object"==typeof t)for(var r in t)s.call(t,r)&&o.setQuery(e,r,t[r]);else{if("string"!=typeof t)throw new TypeError("URI.setQuery() accepts an object, string as the name parameter");e[t]=void 0===n?null:n}},o.removeQuery=function(e,t,n){var r,i,a;if(l(t))for(r=0,i=t.length;r<i;r++)e[t[r]]=void 0;else if("RegExp"===c(t))for(a in e)t.test(a)&&(e[a]=void 0);else if("object"==typeof t)for(a in t)s.call(t,a)&&o.removeQuery(e,a,t[a]);else{if("string"!=typeof t)throw new TypeError("URI.removeQuery() accepts an object, string, RegExp as the first parameter");void 0!==n?"RegExp"===c(n)?!l(e[t])&&n.test(e[t])?e[t]=void 0:e[t]=f(e[t],n):e[t]!==String(n)||l(n)&&1!==n.length?l(e[t])&&(e[t]=f(e[t],n)):e[t]=void 0:e[t]=void 0}},o.hasQuery=function(e,t,n,r){switch(c(t)){case"String":break;case"RegExp":for(var i in e)if(s.call(e,i)&&t.test(i)&&(void 0===n||o.hasQuery(e,i,n)))return!0;return!1;case"Object":for(var a in t)if(s.call(t,a)&&!o.hasQuery(e,a,t[a]))return!1;return!0;default:throw new TypeError("URI.hasQuery() accepts a string, regular expression or object as the name parameter")}switch(c(n)){case"Undefined":return t in e;case"Boolean":return n===Boolean(l(e[t])?e[t].length:e[t]);case"Function":return!!n(e[t],t,e);case"Array":return!!l(e[t])&&(r?h:d)(e[t],n);case"RegExp":return l(e[t])?!!r&&h(e[t],n):Boolean(e[t]&&e[t].match(n));case"Number":n=String(n);case"String":return l(e[t])?!!r&&h(e[t],n):e[t]===n;default:throw new TypeError("URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter")}},o.joinPaths=function(){for(var e=[],t=[],n=0,r=0;r<arguments.length;r++){var i=new o(arguments[r]);e.push(i);for(var a=i.segment(),s=0;s<a.length;s++)"string"==typeof a[s]&&t.push(a[s]),a[s]&&n++}if(!t.length||!n)return new o("");var u=new o("").segment(t);return""!==e[0].path()&&"/"!==e[0].path().slice(0,1)||u.path("/"+u.path()),u.normalize()},o.commonPath=function(e,t){var n,r=Math.min(e.length,t.length);for(n=0;n<r;n++)if(e.charAt(n)!==t.charAt(n)){n--;break}return n<1?e.charAt(0)===t.charAt(0)&&"/"===e.charAt(0)?"/":"":("/"===e.charAt(n)&&"/"===t.charAt(n)||(n=e.substring(0,n).lastIndexOf("/")),e.substring(0,n+1))},o.withinString=function(e,t,n){n||(n={});var r=n.start||o.findUri.start,i=n.end||o.findUri.end,a=n.trim||o.findUri.trim,s=n.parens||o.findUri.parens,u=/[a-z0-9-]=["']?$/i;for(r.lastIndex=0;;){var c=r.exec(e);if(!c)break;var l=c.index;if(n.ignoreHtml){var f=e.slice(Math.max(l-3,0),l);if(f&&u.test(f))continue}for(var h=l+e.slice(l).search(i),d=e.slice(l,h),p=-1;;){var v=s.exec(d);if(!v)break;var m=v.index+v[0].length;p=Math.max(p,m)}if(!((d=p>-1?d.slice(0,p)+d.slice(p).replace(a,""):d.replace(a,"")).length<=c[0].length||n.ignore&&n.ignore.test(d))){var y=t(d,l,h=l+d.length,e);void 0!==y?(y=String(y),e=e.slice(0,l)+y+e.slice(h),r.lastIndex=l+y.length):r.lastIndex=h}}return r.lastIndex=0,e},o.ensureValidHostname=function(t,n){var r=!!t,i=!1;if(!!n&&(i=h(o.hostProtocols,n)),i&&!r)throw new TypeError("Hostname cannot be empty, if protocol is "+n);if(t&&t.match(o.invalid_hostname_characters)){if(!e)throw new TypeError('Hostname "'+t+'" contains characters other than [A-Z0-9.-:_] and Punycode.js is not available');if(e.toASCII(t).match(o.invalid_hostname_characters))throw new TypeError('Hostname "'+t+'" contains characters other than [A-Z0-9.-:_]')}},o.ensureValidPort=function(e){if(e){var t=Number(e);if(!(/^[0-9]+$/.test(t)&&t>0&&t<65536))throw new TypeError('Port "'+e+'" is not a valid port')}},o.noConflict=function(e){if(e){var t={URI:this.noConflict()};return r.URITemplate&&"function"==typeof r.URITemplate.noConflict&&(t.URITemplate=r.URITemplate.noConflict()),r.IPv6&&"function"==typeof r.IPv6.noConflict&&(t.IPv6=r.IPv6.noConflict()),r.SecondLevelDomains&&"function"==typeof r.SecondLevelDomains.noConflict&&(t.SecondLevelDomains=r.SecondLevelDomains.noConflict()),t}return r.URI===this&&(r.URI=i),this},a.build=function(e){return!0===e?this._deferred_build=!0:(void 0===e||this._deferred_build)&&(this._string=o.build(this._parts),this._deferred_build=!1),this},a.clone=function(){return new o(this)},a.valueOf=a.toString=function(){return this.build(!1)._string},a.protocol=_("protocol"),a.username=_("username"),a.password=_("password"),a.hostname=_("hostname"),a.port=_("port"),a.query=k("query","?"),a.fragment=k("fragment","#"),a.search=function(e,t){var n=this.query(e,t);return"string"==typeof n&&n.length?"?"+n:n},a.hash=function(e,t){var n=this.fragment(e,t);return"string"==typeof n&&n.length?"#"+n:n},a.pathname=function(e,t){if(void 0===e||!0===e){var n=this._parts.path||(this._parts.hostname?"/":"");return e?(this._parts.urn?o.decodeUrnPath:o.decodePath)(n):n}return this._parts.urn?this._parts.path=e?o.recodeUrnPath(e):"":this._parts.path=e?o.recodePath(e):"/",this.build(!t),this},a.path=a.pathname,a.href=function(e,t){var n;if(void 0===e)return this.toString();this._string="",this._parts=o._parts();var r=e instanceof o,i="object"==typeof e&&(e.hostname||e.path||e.pathname);e.nodeName&&(e=e[o.getDomAttribute(e)]||"",i=!1);if(!r&&i&&void 0!==e.pathname&&(e=e.toString()),"string"==typeof e||e instanceof String)this._parts=o.parse(String(e),this._parts);else{if(!r&&!i)throw new TypeError("invalid input");var a=r?e._parts:e;for(n in a)"query"!==n&&s.call(this._parts,n)&&(this._parts[n]=a[n]);a.query&&this.query(a.query,!1)}return this.build(!t),this},a.is=function(e){var t=!1,r=!1,i=!1,a=!1,s=!1,u=!1,c=!1,l=!this._parts.urn;switch(this._parts.hostname&&(l=!1,r=o.ip4_expression.test(this._parts.hostname),i=o.ip6_expression.test(this._parts.hostname),s=(a=!(t=r||i))&&n&&n.has(this._parts.hostname),u=a&&o.idn_expression.test(this._parts.hostname),c=a&&o.punycode_expression.test(this._parts.hostname)),e.toLowerCase()){case"relative":return l;case"absolute":return!l;case"domain":case"name":return a;case"sld":return s;case"ip":return t;case"ip4":case"ipv4":case"inet4":return r;case"ip6":case"ipv6":case"inet6":return i;case"idn":return u;case"url":return!this._parts.urn;case"urn":return!!this._parts.urn;case"punycode":return c}return null};var x=a.protocol,E=a.port,T=a.hostname;a.protocol=function(e,t){if(e&&!(e=e.replace(/:(\/\/)?$/,"")).match(o.protocol_expression))throw new TypeError('Protocol "'+e+"\" contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]");return x.call(this,e,t)},a.scheme=a.protocol,a.port=function(e,t){return this._parts.urn?void 0===e?"":this:(void 0!==e&&(0===e&&(e=null),e&&(":"===(e+="").charAt(0)&&(e=e.substring(1)),o.ensureValidPort(e))),E.call(this,e,t))},a.hostname=function(e,t){if(this._parts.urn)return void 0===e?"":this;if(void 0!==e){var n={preventInvalidHostname:this._parts.preventInvalidHostname};if("/"!==o.parseHost(e,n))throw new TypeError('Hostname "'+e+'" contains characters other than [A-Z0-9.-]');e=n.hostname,this._parts.preventInvalidHostname&&o.ensureValidHostname(e,this._parts.protocol)}return T.call(this,e,t)},a.origin=function(e,t){if(this._parts.urn)return void 0===e?"":this;if(void 0===e){var n=this.protocol();return this.authority()?(n?n+"://":"")+this.authority():""}var r=o(e);return this.protocol(r.protocol()).authority(r.authority()).build(!t),this},a.host=function(e,t){if(this._parts.urn)return void 0===e?"":this;if(void 0===e)return this._parts.hostname?o.buildHost(this._parts):"";if("/"!==o.parseHost(e,this._parts))throw new TypeError('Hostname "'+e+'" contains characters other than [A-Z0-9.-]');return this.build(!t),this},a.authority=function(e,t){if(this._parts.urn)return void 0===e?"":this;if(void 0===e)return this._parts.hostname?o.buildAuthority(this._parts):"";if("/"!==o.parseAuthority(e,this._parts))throw new TypeError('Hostname "'+e+'" contains characters other than [A-Z0-9.-]');return this.build(!t),this},a.userinfo=function(e,t){if(this._parts.urn)return void 0===e?"":this;if(void 0===e){var n=o.buildUserinfo(this._parts);return n?n.substring(0,n.length-1):n}return"@"!==e[e.length-1]&&(e+="@"),o.parseUserinfo(e,this._parts),this.build(!t),this},a.resource=function(e,t){var n;return void 0===e?this.path()+this.search()+this.hash():(n=o.parse(e),this._parts.path=n.path,this._parts.query=n.query,this._parts.fragment=n.fragment,this.build(!t),this)},a.subdomain=function(e,t){if(this._parts.urn)return void 0===e?"":this;if(void 0===e){if(!this._parts.hostname||this.is("IP"))return"";var n=this._parts.hostname.length-this.domain().length-1;return this._parts.hostname.substring(0,n)||""}var r=this._parts.hostname.length-this.domain().length,i=this._parts.hostname.substring(0,r),a=new RegExp("^"+u(i));if(e&&"."!==e.charAt(e.length-1)&&(e+="."),-1!==e.indexOf(":"))throw new TypeError("Domains cannot contain colons");return e&&o.ensureValidHostname(e,this._parts.protocol),this._parts.hostname=this._parts.hostname.replace(a,e),this.build(!t),this},a.domain=function(e,t){if(this._parts.urn)return void 0===e?"":this;if("boolean"==typeof e&&(t=e,e=void 0),void 0===e){if(!this._parts.hostname||this.is("IP"))return"";var n=this._parts.hostname.match(/\./g);if(n&&n.length<2)return this._parts.hostname;var r=this._parts.hostname.length-this.tld(t).length-1;return r=this._parts.hostname.lastIndexOf(".",r-1)+1,this._parts.hostname.substring(r)||""}if(!e)throw new TypeError("cannot set domain empty");if(-1!==e.indexOf(":"))throw new TypeError("Domains cannot contain colons");if(o.ensureValidHostname(e,this._parts.protocol),!this._parts.hostname||this.is("IP"))this._parts.hostname=e;else{var i=new RegExp(u(this.domain())+"$");this._parts.hostname=this._parts.hostname.replace(i,e)}return this.build(!t),this},a.tld=function(e,t){if(this._parts.urn)return void 0===e?"":this;if("boolean"==typeof e&&(t=e,e=void 0),void 0===e){if(!this._parts.hostname||this.is("IP"))return"";var r=this._parts.hostname.lastIndexOf("."),i=this._parts.hostname.substring(r+1);return!0!==t&&n&&n.list[i.toLowerCase()]&&n.get(this._parts.hostname)||i}var o;if(!e)throw new TypeError("cannot set TLD empty");if(e.match(/[^a-zA-Z0-9-]/)){if(!n||!n.is(e))throw new TypeError('TLD "'+e+'" contains characters other than [A-Z0-9]');o=new RegExp(u(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(o,e)}else{if(!this._parts.hostname||this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");o=new RegExp(u(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(o,e)}return this.build(!t),this},a.directory=function(e,t){if(this._parts.urn)return void 0===e?"":this;if(void 0===e||!0===e){if(!this._parts.path&&!this._parts.hostname)return"";if("/"===this._parts.path)return"/";var n=this._parts.path.length-this.filename().length-1,r=this._parts.path.substring(0,n)||(this._parts.hostname?"/":"");return e?o.decodePath(r):r}var i=this._parts.path.length-this.filename().length,a=this._parts.path.substring(0,i),s=new RegExp("^"+u(a));return this.is("relative")||(e||(e="/"),"/"!==e.charAt(0)&&(e="/"+e)),e&&"/"!==e.charAt(e.length-1)&&(e+="/"),e=o.recodePath(e),this._parts.path=this._parts.path.replace(s,e),this.build(!t),this},a.filename=function(e,t){if(this._parts.urn)return void 0===e?"":this;if("string"!=typeof e){if(!this._parts.path||"/"===this._parts.path)return"";var n=this._parts.path.lastIndexOf("/"),r=this._parts.path.substring(n+1);return e?o.decodePathSegment(r):r}var i=!1;"/"===e.charAt(0)&&(e=e.substring(1)),e.match(/\.?\//)&&(i=!0);var a=new RegExp(u(this.filename())+"$");return e=o.recodePath(e),this._parts.path=this._parts.path.replace(a,e),i?this.normalizePath(t):this.build(!t),this},a.suffix=function(e,t){if(this._parts.urn)return void 0===e?"":this;if(void 0===e||!0===e){if(!this._parts.path||"/"===this._parts.path)return"";var n,r,i=this.filename(),a=i.lastIndexOf(".");return-1===a?"":(n=i.substring(a+1),r=/^[a-z0-9%]+$/i.test(n)?n:"",e?o.decodePathSegment(r):r)}"."===e.charAt(0)&&(e=e.substring(1));var s,c=this.suffix();if(c)s=e?new RegExp(u(c)+"$"):new RegExp(u("."+c)+"$");else{if(!e)return this;this._parts.path+="."+o.recodePath(e)}return s&&(e=o.recodePath(e),this._parts.path=this._parts.path.replace(s,e)),this.build(!t),this},a.segment=function(e,t,n){var r=this._parts.urn?":":"/",i=this.path(),o="/"===i.substring(0,1),a=i.split(r);if(void 0!==e&&"number"!=typeof e&&(n=t,t=e,e=void 0),void 0!==e&&"number"!=typeof e)throw new Error('Bad segment "'+e+'", must be 0-based integer');if(o&&a.shift(),e<0&&(e=Math.max(a.length+e,0)),void 0===t)return void 0===e?a:a[e];if(null===e||void 0===a[e])if(l(t)){a=[];for(var s=0,u=t.length;s<u;s++)(t[s].length||a.length&&a[a.length-1].length)&&(a.length&&!a[a.length-1].length&&a.pop(),a.push(p(t[s])))}else(t||"string"==typeof t)&&(t=p(t),""===a[a.length-1]?a[a.length-1]=t:a.push(t));else t?a[e]=p(t):a.splice(e,1);return o&&a.unshift(""),this.path(a.join(r),n)},a.segmentCoded=function(e,t,n){var r,i,a;if("number"!=typeof e&&(n=t,t=e,e=void 0),void 0===t){if(l(r=this.segment(e,t,n)))for(i=0,a=r.length;i<a;i++)r[i]=o.decode(r[i]);else r=void 0!==r?o.decode(r):void 0;return r}if(l(t))for(i=0,a=t.length;i<a;i++)t[i]=o.encode(t[i]);else t="string"==typeof t||t instanceof String?o.encode(t):t;return this.segment(e,t,n)};var A=a.query;return a.query=function(e,t){if(!0===e)return o.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if("function"==typeof e){var n=o.parseQuery(this._parts.query,this._parts.escapeQuerySpace),r=e.call(this,n);return this._parts.query=o.buildQuery(r||n,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!t),this}return void 0!==e&&"string"!=typeof e?(this._parts.query=o.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!t),this):A.call(this,e,t)},a.setQuery=function(e,t,n){var r=o.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if("string"==typeof e||e instanceof String)r[e]=void 0!==t?t:null;else{if("object"!=typeof e)throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");for(var i in e)s.call(e,i)&&(r[i]=e[i])}return this._parts.query=o.buildQuery(r,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),"string"!=typeof e&&(n=t),this.build(!n),this},a.addQuery=function(e,t,n){var r=o.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return o.addQuery(r,e,void 0===t?null:t),this._parts.query=o.buildQuery(r,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),"string"!=typeof e&&(n=t),this.build(!n),this},a.removeQuery=function(e,t,n){var r=o.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return o.removeQuery(r,e,t),this._parts.query=o.buildQuery(r,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),"string"!=typeof e&&(n=t),this.build(!n),this},a.hasQuery=function(e,t,n){var r=o.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return o.hasQuery(r,e,t,n)},a.setSearch=a.setQuery,a.addSearch=a.addQuery,a.removeSearch=a.removeQuery,a.hasSearch=a.hasQuery,a.normalize=function(){return this._parts.urn?this.normalizeProtocol(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build():this.normalizeProtocol(!1).normalizeHostname(!1).normalizePort(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build()},a.normalizeProtocol=function(e){return"string"==typeof this._parts.protocol&&(this._parts.protocol=this._parts.protocol.toLowerCase(),this.build(!e)),this},a.normalizeHostname=function(n){return this._parts.hostname&&(this.is("IDN")&&e?this._parts.hostname=e.toASCII(this._parts.hostname):this.is("IPv6")&&t&&(this._parts.hostname=t.best(this._parts.hostname)),this._parts.hostname=this._parts.hostname.toLowerCase(),this.build(!n)),this},a.normalizePort=function(e){return"string"==typeof this._parts.protocol&&this._parts.port===o.defaultPorts[this._parts.protocol]&&(this._parts.port=null,this.build(!e)),this},a.normalizePath=function(e){var t,n=this._parts.path;if(!n)return this;if(this._parts.urn)return this._parts.path=o.recodeUrnPath(this._parts.path),this.build(!e),this;if("/"===this._parts.path)return this;var r,i,a="";for("/"!==(n=o.recodePath(n)).charAt(0)&&(t=!0,n="/"+n),"/.."!==n.slice(-3)&&"/."!==n.slice(-2)||(n+="/"),n=n.replace(/(\/(\.\/)+)|(\/\.$)/g,"/").replace(/\/{2,}/g,"/"),t&&(a=n.substring(1).match(/^(\.\.\/)+/)||"")&&(a=a[0]);-1!==(r=n.search(/\/\.\.(\/|$)/));)0!==r?(-1===(i=n.substring(0,r).lastIndexOf("/"))&&(i=r),n=n.substring(0,i)+n.substring(r+3)):n=n.substring(3);return t&&this.is("relative")&&(n=a+n.substring(1)),this._parts.path=n,this.build(!e),this},a.normalizePathname=a.normalizePath,a.normalizeQuery=function(e){return"string"==typeof this._parts.query&&(this._parts.query.length?this.query(o.parseQuery(this._parts.query,this._parts.escapeQuerySpace)):this._parts.query=null,this.build(!e)),this},a.normalizeFragment=function(e){return this._parts.fragment||(this._parts.fragment=null,this.build(!e)),this},a.normalizeSearch=a.normalizeQuery,a.normalizeHash=a.normalizeFragment,a.iso8859=function(){var e=o.encode,t=o.decode;o.encode=escape,o.decode=decodeURIComponent;try{this.normalize()}finally{o.encode=e,o.decode=t}return this},a.unicode=function(){var e=o.encode,t=o.decode;o.encode=m,o.decode=unescape;try{this.normalize()}finally{o.encode=e,o.decode=t}return this},a.readable=function(){var t=this.clone();t.username("").password("").normalize();var n="";if(t._parts.protocol&&(n+=t._parts.protocol+"://"),t._parts.hostname&&(t.is("punycode")&&e?(n+=e.toUnicode(t._parts.hostname),t._parts.port&&(n+=":"+t._parts.port)):n+=t.host()),t._parts.hostname&&t._parts.path&&"/"!==t._parts.path.charAt(0)&&(n+="/"),n+=t.path(!0),t._parts.query){for(var r="",i=0,a=t._parts.query.split("&"),s=a.length;i<s;i++){var u=(a[i]||"").split("=");r+="&"+o.decodeQuery(u[0],this._parts.escapeQuerySpace).replace(/&/g,"%26"),void 0!==u[1]&&(r+="="+o.decodeQuery(u[1],this._parts.escapeQuerySpace).replace(/&/g,"%26"))}n+="?"+r.substring(1)}return n+=o.decodeQuery(t.hash(),!0)},a.absoluteTo=function(e){var t,n,r,i=this.clone(),a=["protocol","username","password","hostname","port"];if(this._parts.urn)throw new Error("URNs do not have any generally defined hierarchical components");if(e instanceof o||(e=new o(e)),i._parts.protocol)return i;if(i._parts.protocol=e._parts.protocol,this._parts.hostname)return i;for(n=0;r=a[n];n++)i._parts[r]=e._parts[r];return i._parts.path?(".."===i._parts.path.substring(-2)&&(i._parts.path+="/"),"/"!==i.path().charAt(0)&&(t=(t=e.directory())||(0===e.path().indexOf("/")?"/":""),i._parts.path=(t?t+"/":"")+i._parts.path,i.normalizePath())):(i._parts.path=e._parts.path,i._parts.query||(i._parts.query=e._parts.query)),i.build(),i},a.relativeTo=function(e){var t,n,r,i,a,s=this.clone().normalize();if(s._parts.urn)throw new Error("URNs do not have any generally defined hierarchical components");if(e=new o(e).normalize(),t=s._parts,n=e._parts,i=s.path(),a=e.path(),"/"!==i.charAt(0))throw new Error("URI is already relative");if("/"!==a.charAt(0))throw new Error("Cannot calculate a URI relative to another relative URI");if(t.protocol===n.protocol&&(t.protocol=null),t.username!==n.username||t.password!==n.password)return s.build();if(null!==t.protocol||null!==t.username||null!==t.password)return s.build();if(t.hostname!==n.hostname||t.port!==n.port)return s.build();if(t.hostname=null,t.port=null,i===a)return t.path="",s.build();if(!(r=o.commonPath(i,a)))return s.build();var u=n.path.substring(r.length).replace(/[^\/]*$/,"").replace(/.*?\//g,"../");return t.path=u+t.path.substring(r.length)||"./",s.build()},a.equals=function(e){var t,n,r,i,a,u=this.clone(),c=new o(e),f={};if(u.normalize(),c.normalize(),u.toString()===c.toString())return!0;if(r=u.query(),i=c.query(),u.query(""),c.query(""),u.toString()!==c.toString())return!1;if(r.length!==i.length)return!1;for(a in t=o.parseQuery(r,this._parts.escapeQuerySpace),n=o.parseQuery(i,this._parts.escapeQuerySpace),t)if(s.call(t,a)){if(l(t[a])){if(!d(t[a],n[a]))return!1}else if(t[a]!==n[a])return!1;f[a]=!0}for(a in n)if(s.call(n,a)&&!f[a])return!1;return!0},a.preventInvalidHostname=function(e){return this._parts.preventInvalidHostname=!!e,this},a.duplicateQueryParameters=function(e){return this._parts.duplicateQueryParameters=!!e,this},a.escapeQuerySpace=function(e){return this._parts.escapeQuerySpace=!!e,this},o})},function(e,t,n){var r=n(145),i=n(396),o=n(100),a=n(182),s=o(function(e,t){if(null==e)return[];var n=t.length;return n>1&&a(e,t[0],t[1])?t=[]:n>2&&a(t[0],t[1],t[2])&&(t=[t[0]]),i(e,r(t,1),[])});e.exports=s},function(e,t,n){var r=n(196),i=n(315),o=n(59);e.exports=function(e){return o(e)?r(e,!0):i(e)}},function(e,t,n){var r=n(59),i=n(39);e.exports=function(e){return i(e)&&r(e)}},function(e,t,n){var r=n(13),i=n(102),o=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;e.exports=function(e,t){if(r(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!i(e))||a.test(e)||!o.test(e)||null!=t&&e in Object(t)}},function(e,t,n){var r=n(103),i=n(77);e.exports=function(e,t){for(var n=0,o=(t=r(t,e)).length;null!=e&&n<o;)e=e[i(t[n++])];return n&&n==o?e:void 0}},function(e,t,n){var r=n(352),i=n(142),o=n(351),a=n(350),s=n(349),u=n(43),c=n(203),l=c(r),f=c(i),h=c(o),d=c(a),p=c(s),v=u;(r&&"[object DataView]"!=v(new r(new ArrayBuffer(1)))||i&&"[object Map]"!=v(new i)||o&&"[object Promise]"!=v(o.resolve())||a&&"[object Set]"!=v(new a)||s&&"[object WeakMap]"!=v(new s))&&(v=function(e){var t=u(e),n="[object Object]"==t?e.constructor:void 0,r=n?c(n):"";if(r)switch(r){case l:return"[object DataView]";case f:return"[object Map]";case h:return"[object Promise]";case d:return"[object Set]";case p:return"[object WeakMap]"}return t}),e.exports=v},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t){var n=9007199254740991;e.exports=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=n}},function(e,t,n){var r=n(367),i=n(39);e.exports=function e(t,n,o,a,s){return t===n||(null==t||null==n||!i(t)&&!i(n)?t!=t&&n!=n:r(t,n,o,a,e,s))}},function(e,t,n){var r=n(379),i=n(372),o=n(370),a=n(369),s=n(368);function u(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}u.prototype.clear=r,u.prototype.delete=i,u.prototype.get=o,u.prototype.has=a,u.prototype.set=s,e.exports=u},function(e,t,n){var r=n(60)(n(44),"Map");e.exports=r},function(e,t,n){var r=n(112),i=n(388),o=n(387),a=n(386),s=n(385),u=n(384);function c(e){var t=this.__data__=new r(e);this.size=t.size}c.prototype.clear=i,c.prototype.delete=o,c.prototype.get=a,c.prototype.has=s,c.prototype.set=u,e.exports=c},function(e,t,n){var r=n(395),i=n(347),o=n(101),a=n(13),s=n(340);e.exports=function(e){return"function"==typeof e?e:null==e?o:"object"==typeof e?a(e)?i(e[0],e[1]):r(e):s(e)}},function(e,t,n){var r=n(205),i=n(400);e.exports=function e(t,n,o,a,s){var u=-1,c=t.length;for(o||(o=i),s||(s=[]);++u<c;){var l=t[u];n>0&&o(l)?n>1?e(l,n-1,o,a,s):r(s,l):a||(s[s.length]=l)}return s}},function(e,t,n){var r=n(14),i=n(119);e.exports=function(e){return r(function(){return!!i[e]()||"â€‹Â…á Ž"!="â€‹Â…á Ž"[e]()||i[e].name!==e})}},function(e,t,n){"use strict";var r=n(9);e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},function(e,t,n){"use strict";var r,i,o=n(147),a=RegExp.prototype.exec,s=String.prototype.replace,u=a,c=(r=/a/,i=/b*/g,a.call(r,"a"),a.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),l=void 0!==/()??/.exec("")[1];(c||l)&&(u=function(e){var t,n,r,i,u=this;return l&&(n=new RegExp("^"+u.source+"$(?!\\s)",o.call(u))),c&&(t=u.lastIndex),r=a.call(u,e),c&&r&&(u.lastIndex=u.global?r.index+r[0].length:t),l&&r&&r.length>1&&s.call(r[0],n,function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(r[i]=void 0)}),r}),e.exports=u},function(e,t,n){var r=n(20)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[r]=!1,"/./"[e](t)}catch(e){}}return!1}},function(e,t,n){var r=n(23),i=n(65),o=n(20)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},function(e,t,n){var r=n(150),i=n(31);e.exports=function(e,t,n){if(r(t))throw TypeError("String.prototype."+n+" doesn't accept regex");return String(i(e))}},function(e,t,n){"use strict";var r=n(47),i=n(31);e.exports="".repeat||function(e){var t=String(i(this)),n="",o=r(e);if(o<0||o==1/0)throw RangeError("Wrong number of repetitions");for(;o>0;(o>>>=1)&&(t+=t))1&o&&(n+=t);return n}},function(e,t,n){var r=n(9),i=n(156);e.exports=function(e){var t=i(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return r(t.call(e))}},function(e,t,n){var r=n(537),i=Object.prototype;r!==i.toString&&n(54)(i,"toString",r,{unsafe:!0})},function(e,t,n){var r=n(65),i=n(20)("toStringTag"),o="Arguments"==r(function(){return arguments}());e.exports=function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),i))?n:o?r(t):"Object"==(a=r(t))&&"function"==typeof t.callee?"Arguments":a}},function(e,t,n){var r=n(155),i=n(20)("iterator"),o=n(89);e.exports=function(e){if(void 0!=e)return e[i]||e["@@iterator"]||o[r(e)]}},function(e,t,n){var r=n(577);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,i){return r(n,i),t?e.call(n,i):n.__proto__=i,n}}():void 0)},function(e,t,n){var r=n(14),i=/#|\.prototype\./,o=function(e,t){var n=s[a(e)];return n==c||n!=u&&("function"==typeof t?r(t):!!t)},a=o.normalize=function(e){return String(e).replace(i,".").toLowerCase()},s=o.data={},u=o.NATIVE="N",c=o.POLYFILL="P";e.exports=o},function(e,t){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(e,t,n){var r=n(35),i=n(18),o=n(75);e.exports=function(e){return function(t,n,a){var s,u=r(t),c=i(u.length),l=o(a,c);if(e&&n!=n){for(;c>l;)if((s=u[l++])!=s)return!0}else for(;c>l;l++)if((e||l in u)&&u[l]===n)return e||l||0;return!e&&-1}}},function(e,t,n){"use strict";var r=n(3),i=n(235),o=n(90),a=n(157),s=n(72),u=n(41),c=n(54),l=n(10),f=n(20)("iterator"),h=n(89),d=n(234),p=d.IteratorPrototype,v=d.BUGGY_SAFARI_ITERATORS,m=function(){return this};e.exports=function(e,t,n,d,y,g,b){i(n,t,d);var w,_,k,x=function(e){if(e===y&&C)return C;if(!v&&e in A)return A[e];switch(e){case"keys":case"values":case"entries":return function(){return new n(this,e)}}return function(){return new n(this)}},E=t+" Iterator",T=!1,A=e.prototype,S=A[f]||A["@@iterator"]||y&&A[y],C=!v&&S||x(y),I="Array"==t&&A.entries||S;if(I&&(w=o(I.call(new e)),p!==Object.prototype&&w.next&&(l||o(w)===p||(a?a(w,p):"function"!=typeof w[f]&&u(w,f,m)),s(w,E,!0,!0),l&&(h[E]=m))),"values"==y&&S&&"values"!==S.name&&(T=!0,C=function(){return S.call(this)}),l&&!b||A[f]===C||u(A,f,C),h[t]=C,y)if(_={values:x("values"),keys:g?C:x("keys"),entries:x("entries")},b)for(k in _)!v&&!T&&k in A||c(A,k,_[k]);else r({target:t,proto:!0,forced:v||T},_);return _}},function(e,t,n){var r=n(21),i=n(41);e.exports=function(e,t){try{i(r,e,t)}catch(n){r[e]=t}return t}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default=function(e){return function(){if(e){for(var t,n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];(t=console).log.apply(t,["[Penpal]"].concat(r))}}},e.exports=t.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=0;t.default=function(){return++r},e.exports=t.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r,i=n(67),o=n(97),a=(r=n(164))&&r.__esModule?r:{default:r},s=n(96);t.default=function(e,t,n,r,u){var c=t.localName,l=t.local,f=t.remote,h=t.originForSending,d=t.originForReceiving,p=!1;u("".concat(c,": Connecting call sender"));return n.reduce(function(e,t){return e[t]=function(e){return function(){for(var t=arguments.length,n=new Array(t),v=0;v<t;v++)n[v]=arguments[v];var m;u("".concat(c,": Sending ").concat(e,"() call"));try{f.closed&&(m=!0)}catch(e){m=!0}if(m&&r(),p){var y=new Error("Unable to send ".concat(e,"() call due ")+"to destroyed connection");throw y.code=o.ERR_CONNECTION_DESTROYED,y}return new Promise(function(t,r){var o=(0,a.default)();l.addEventListener(i.MESSAGE,function n(a){if(a.source===f&&a.data.penpal===i.REPLY&&a.data.id===o)if(a.origin===d){u("".concat(c,": Received ").concat(e,"() reply")),l.removeEventListener(i.MESSAGE,n);var h=a.data.returnValue;a.data.returnValueIsError&&(h=(0,s.deserializeError)(h)),(a.data.resolution===i.FULFILLED?t:r)(h)}else u("".concat(c," received message from origin ").concat(a.origin," which did not match expected origin ").concat(d))}),f.postMessage({penpal:i.CALL,id:o,methodName:e,args:n},h)})}}(t),e},e),function(){p=!0}},e.exports=t.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=n(67),i=n(96);t.default=function(e,t,n){var o=e.localName,a=e.local,s=e.remote,u=e.originForSending,c=e.originForReceiving,l=!1;n("".concat(o,": Connecting call receiver"));var f=function(e){if(e.source===s&&e.data.penpal===r.CALL)if(e.origin===c){var a=e.data,f=a.methodName,h=a.args,d=a.id;n("".concat(o,": Received ").concat(f,"() call"));var p=function(e){return function(t){if(n("".concat(o,": Sending ").concat(f,"() reply")),l)n("".concat(o,": Unable to send ").concat(f,"() reply due to destroyed connection"));else{var a={penpal:r.REPLY,id:d,resolution:e,returnValue:t};e===r.REJECTED&&t instanceof Error&&(a.returnValue=(0,i.serializeError)(t),a.returnValueIsError=!0);try{s.postMessage(a,u)}catch(e){throw e.name===r.DATA_CLONE_ERROR&&s.postMessage({penpal:r.REPLY,id:d,resolution:r.REJECTED,returnValue:(0,i.serializeError)(e),returnValueIsError:!0},u),e}}}};new Promise(function(e){return e(t[f].apply(t,h))}).then(p(r.FULFILLED),p(r.REJECTED))}else n("".concat(o," received message from origin ").concat(e.origin," which did not match expected origin ").concat(c))};return a.addEventListener(r.MESSAGE,f),function(){l=!0,a.removeEventListener(r.MESSAGE,f)}},e.exports=t.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;t.default=function(){var e=[],t=!1;return{destroy:function(){t=!0,e.forEach(function(e){e()})},onDestroy:function(n){t?n():e.push(n)}}},e.exports=t.default},function(e,t,n){var r=n(43),i=n(39),o="[object Boolean]";e.exports=function(e){return!0===e||!1===e||i(e)&&r(e)==o}},function(e,t,n){var r=n(309),i=n(145),o=n(144),a=n(100),s=n(134),u=n(302),c=a(function(e,t){var n=u(t);return s(n)&&(n=void 0),s(e)?r(e,i(t,1,s,!0),o(n,2)):[]});e.exports=c},function(e,t,n){"use strict";(function(e,n){var r=Object.freeze({});function i(e){return void 0===e||null===e}function o(e){return void 0!==e&&null!==e}function a(e){return!0===e}function s(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function u(e){return null!==e&&"object"==typeof e}var c=Object.prototype.toString;function l(e){return"[object Object]"===c.call(e)}function f(e){return"[object RegExp]"===c.call(e)}function h(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function d(e){return o(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function p(e){return null==e?"":Array.isArray(e)||l(e)&&e.toString===c?JSON.stringify(e,null,2):String(e)}function v(e){var t=parseFloat(e);return isNaN(t)?e:t}function m(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i<r.length;i++)n[r[i]]=!0;return t?function(e){return n[e.toLowerCase()]}:function(e){return n[e]}}var y=m("slot,component",!0),g=m("key,ref,slot,slot-scope,is");function b(e,t){if(e.length){var n=e.indexOf(t);if(n>-1)return e.splice(n,1)}}var w=Object.prototype.hasOwnProperty;function _(e,t){return w.call(e,t)}function k(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var x=/-(\w)/g,E=k(function(e){return e.replace(x,function(e,t){return t?t.toUpperCase():""})}),T=k(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),A=/\B([A-Z])/g,S=k(function(e){return e.replace(A,"-$1").toLowerCase()});var C=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function I(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function O(e,t){for(var n in t)e[n]=t[n];return e}function P(e){for(var t={},n=0;n<e.length;n++)e[n]&&O(t,e[n]);return t}function D(e,t,n){}var L=function(e,t,n){return!1},M=function(e){return e};function j(e,t){if(e===t)return!0;var n=u(e),r=u(t);if(!n||!r)return!n&&!r&&String(e)===String(t);try{var i=Array.isArray(e),o=Array.isArray(t);if(i&&o)return e.length===t.length&&e.every(function(e,n){return j(e,t[n])});if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(i||o)return!1;var a=Object.keys(e),s=Object.keys(t);return a.length===s.length&&a.every(function(n){return j(e[n],t[n])})}catch(e){return!1}}function N(e,t){for(var n=0;n<e.length;n++)if(j(e[n],t))return n;return-1}function R(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}}var F="data-server-rendered",B=["component","directive","filter"],U=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured","serverPrefetch"],z={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:L,isReservedAttr:L,isUnknownElement:L,getTagNamespace:D,parsePlatformTagName:M,mustUseProp:L,async:!0,_lifecycleHooks:U},$=/a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;function V(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}var Y=new RegExp("[^"+$.source+".$_\\d]");var H,q="__proto__"in{},W="undefined"!=typeof window,G="undefined"!=typeof WXEnvironment&&!!WXEnvironment.platform,K=G&&WXEnvironment.platform.toLowerCase(),Q=W&&window.navigator.userAgent.toLowerCase(),Z=Q&&/msie|trident/.test(Q),J=Q&&Q.indexOf("msie 9.0")>0,X=Q&&Q.indexOf("edge/")>0,ee=(Q&&Q.indexOf("android"),Q&&/iphone|ipad|ipod|ios/.test(Q)||"ios"===K),te=(Q&&/chrome\/\d+/.test(Q),Q&&/phantomjs/.test(Q),Q&&Q.match(/firefox\/(\d+)/)),ne={}.watch,re=!1;if(W)try{var ie={};Object.defineProperty(ie,"passive",{get:function(){re=!0}}),window.addEventListener("test-passive",null,ie)}catch(e){}var oe=function(){return void 0===H&&(H=!W&&!G&&void 0!==e&&(e.process&&"server"===e.process.env.VUE_ENV)),H},ae=W&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function se(e){return"function"==typeof e&&/native code/.test(e.toString())}var ue,ce="undefined"!=typeof Symbol&&se(Symbol)&&"undefined"!=typeof Reflect&&se(Reflect.ownKeys);ue="undefined"!=typeof Set&&se(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var le=D,fe=0,he=function(){this.id=fe++,this.subs=[]};he.prototype.addSub=function(e){this.subs.push(e)},he.prototype.removeSub=function(e){b(this.subs,e)},he.prototype.depend=function(){he.target&&he.target.addDep(this)},he.prototype.notify=function(){var e=this.subs.slice();for(var t=0,n=e.length;t<n;t++)e[t].update()},he.target=null;var de=[];function pe(e){de.push(e),he.target=e}function ve(){de.pop(),he.target=de[de.length-1]}var me=function(e,t,n,r,i,o,a,s){this.tag=e,this.data=t,this.children=n,this.text=r,this.elm=i,this.ns=void 0,this.context=o,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=t&&t.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1},ye={child:{configurable:!0}};ye.child.get=function(){return this.componentInstance},Object.defineProperties(me.prototype,ye);var ge=function(e){void 0===e&&(e="");var t=new me;return t.text=e,t.isComment=!0,t};function be(e){return new me(void 0,void 0,void 0,String(e))}function we(e){var t=new me(e.tag,e.data,e.children&&e.children.slice(),e.text,e.elm,e.context,e.componentOptions,e.asyncFactory);return t.ns=e.ns,t.isStatic=e.isStatic,t.key=e.key,t.isComment=e.isComment,t.fnContext=e.fnContext,t.fnOptions=e.fnOptions,t.fnScopeId=e.fnScopeId,t.asyncMeta=e.asyncMeta,t.isCloned=!0,t}var _e=Array.prototype,ke=Object.create(_e);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(e){var t=_e[e];V(ke,e,function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];var i,o=t.apply(this,n),a=this.__ob__;switch(e){case"push":case"unshift":i=n;break;case"splice":i=n.slice(2)}return i&&a.observeArray(i),a.dep.notify(),o})});var xe=Object.getOwnPropertyNames(ke),Ee=!0;function Te(e){Ee=e}var Ae=function(e){var t;this.value=e,this.dep=new he,this.vmCount=0,V(e,"__ob__",this),Array.isArray(e)?(q?(t=ke,e.__proto__=t):function(e,t,n){for(var r=0,i=n.length;r<i;r++){var o=n[r];V(e,o,t[o])}}(e,ke,xe),this.observeArray(e)):this.walk(e)};function Se(e,t){var n;if(u(e)&&!(e instanceof me))return _(e,"__ob__")&&e.__ob__ instanceof Ae?n=e.__ob__:Ee&&!oe()&&(Array.isArray(e)||l(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new Ae(e)),t&&n&&n.vmCount++,n}function Ce(e,t,n,r,i){var o=new he,a=Object.getOwnPropertyDescriptor(e,t);if(!a||!1!==a.configurable){var s=a&&a.get,u=a&&a.set;s&&!u||2!==arguments.length||(n=e[t]);var c=!i&&Se(n);Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){var t=s?s.call(e):n;return he.target&&(o.depend(),c&&(c.dep.depend(),Array.isArray(t)&&function e(t){for(var n=void 0,r=0,i=t.length;r<i;r++)(n=t[r])&&n.__ob__&&n.__ob__.dep.depend(),Array.isArray(n)&&e(n)}(t))),t},set:function(t){var r=s?s.call(e):n;t===r||t!=t&&r!=r||s&&!u||(u?u.call(e,t):n=t,c=!i&&Se(t),o.notify())}})}}function Ie(e,t,n){if(Array.isArray(e)&&h(t))return e.length=Math.max(e.length,t),e.splice(t,1,n),n;if(t in e&&!(t in Object.prototype))return e[t]=n,n;var r=e.__ob__;return e._isVue||r&&r.vmCount?n:r?(Ce(r.value,t,n),r.dep.notify(),n):(e[t]=n,n)}function Oe(e,t){if(Array.isArray(e)&&h(t))e.splice(t,1);else{var n=e.__ob__;e._isVue||n&&n.vmCount||_(e,t)&&(delete e[t],n&&n.dep.notify())}}Ae.prototype.walk=function(e){for(var t=Object.keys(e),n=0;n<t.length;n++)Ce(e,t[n])},Ae.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)Se(e[t])};var Pe=z.optionMergeStrategies;function De(e,t){if(!t)return e;for(var n,r,i,o=ce?Reflect.ownKeys(t):Object.keys(t),a=0;a<o.length;a++)"__ob__"!==(n=o[a])&&(r=e[n],i=t[n],_(e,n)?r!==i&&l(r)&&l(i)&&De(r,i):Ie(e,n,i));return e}function Le(e,t,n){return n?function(){var r="function"==typeof t?t.call(n,n):t,i="function"==typeof e?e.call(n,n):e;return r?De(r,i):i}:t?e?function(){return De("function"==typeof t?t.call(this,this):t,"function"==typeof e?e.call(this,this):e)}:t:e}function Me(e,t){var n=t?e?e.concat(t):Array.isArray(t)?t:[t]:e;return n?function(e){for(var t=[],n=0;n<e.length;n++)-1===t.indexOf(e[n])&&t.push(e[n]);return t}(n):n}function je(e,t,n,r){var i=Object.create(e||null);return t?O(i,t):i}Pe.data=function(e,t,n){return n?Le(e,t,n):t&&"function"!=typeof t?e:Le(e,t)},U.forEach(function(e){Pe[e]=Me}),B.forEach(function(e){Pe[e+"s"]=je}),Pe.watch=function(e,t,n,r){if(e===ne&&(e=void 0),t===ne&&(t=void 0),!t)return Object.create(e||null);if(!e)return t;var i={};for(var o in O(i,e),t){var a=i[o],s=t[o];a&&!Array.isArray(a)&&(a=[a]),i[o]=a?a.concat(s):Array.isArray(s)?s:[s]}return i},Pe.props=Pe.methods=Pe.inject=Pe.computed=function(e,t,n,r){if(!e)return t;var i=Object.create(null);return O(i,e),t&&O(i,t),i},Pe.provide=Le;var Ne=function(e,t){return void 0===t?e:t};function Re(e,t,n){if("function"==typeof t&&(t=t.options),function(e,t){var n=e.props;if(n){var r,i,o={};if(Array.isArray(n))for(r=n.length;r--;)"string"==typeof(i=n[r])&&(o[E(i)]={type:null});else if(l(n))for(var a in n)i=n[a],o[E(a)]=l(i)?i:{type:i};e.props=o}}(t),function(e,t){var n=e.inject;if(n){var r=e.inject={};if(Array.isArray(n))for(var i=0;i<n.length;i++)r[n[i]]={from:n[i]};else if(l(n))for(var o in n){var a=n[o];r[o]=l(a)?O({from:o},a):{from:a}}}}(t),function(e){var t=e.directives;if(t)for(var n in t){var r=t[n];"function"==typeof r&&(t[n]={bind:r,update:r})}}(t),!t._base&&(t.extends&&(e=Re(e,t.extends,n)),t.mixins))for(var r=0,i=t.mixins.length;r<i;r++)e=Re(e,t.mixins[r],n);var o,a={};for(o in e)s(o);for(o in t)_(e,o)||s(o);function s(r){var i=Pe[r]||Ne;a[r]=i(e[r],t[r],n,r)}return a}function Fe(e,t,n,r){if("string"==typeof n){var i=e[t];if(_(i,n))return i[n];var o=E(n);if(_(i,o))return i[o];var a=T(o);return _(i,a)?i[a]:i[n]||i[o]||i[a]}}function Be(e,t,n,r){var i=t[e],o=!_(n,e),a=n[e],s=$e(Boolean,i.type);if(s>-1)if(o&&!_(i,"default"))a=!1;else if(""===a||a===S(e)){var u=$e(String,i.type);(u<0||s<u)&&(a=!0)}if(void 0===a){a=function(e,t,n){if(!_(t,"default"))return;var r=t.default;0;if(e&&e.$options.propsData&&void 0===e.$options.propsData[n]&&void 0!==e._props[n])return e._props[n];return"function"==typeof r&&"Function"!==Ue(t.type)?r.call(e):r}(r,i,e);var c=Ee;Te(!0),Se(a),Te(c)}return a}function Ue(e){var t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function ze(e,t){return Ue(e)===Ue(t)}function $e(e,t){if(!Array.isArray(t))return ze(t,e)?0:-1;for(var n=0,r=t.length;n<r;n++)if(ze(t[n],e))return n;return-1}function Ve(e,t,n){pe();try{if(t)for(var r=t;r=r.$parent;){var i=r.$options.errorCaptured;if(i)for(var o=0;o<i.length;o++)try{if(!1===i[o].call(r,e,t,n))return}catch(e){He(e,r,"errorCaptured hook")}}He(e,t,n)}finally{ve()}}function Ye(e,t,n,r,i){var o;try{(o=n?e.apply(t,n):e.call(t))&&!o._isVue&&d(o)&&!o._handled&&(o.catch(function(e){return Ve(e,r,i+" (Promise/async)")}),o._handled=!0)}catch(e){Ve(e,r,i)}return o}function He(e,t,n){if(z.errorHandler)try{return z.errorHandler.call(null,e,t,n)}catch(t){t!==e&&qe(t,null,"config.errorHandler")}qe(e,t,n)}function qe(e,t,n){if(!W&&!G||"undefined"==typeof console)throw e;console.error(e)}var We,Ge=!1,Ke=[],Qe=!1;function Ze(){Qe=!1;var e=Ke.slice(0);Ke.length=0;for(var t=0;t<e.length;t++)e[t]()}if("undefined"!=typeof Promise&&se(Promise)){var Je=Promise.resolve();We=function(){Je.then(Ze),ee&&setTimeout(D)},Ge=!0}else if(Z||"undefined"==typeof MutationObserver||!se(MutationObserver)&&"[object MutationObserverConstructor]"!==MutationObserver.toString())We=void 0!==n&&se(n)?function(){n(Ze)}:function(){setTimeout(Ze,0)};else{var Xe=1,et=new MutationObserver(Ze),tt=document.createTextNode(String(Xe));et.observe(tt,{characterData:!0}),We=function(){Xe=(Xe+1)%2,tt.data=String(Xe)},Ge=!0}function nt(e,t){var n;if(Ke.push(function(){if(e)try{e.call(t)}catch(e){Ve(e,t,"nextTick")}else n&&n(t)}),Qe||(Qe=!0,We()),!e&&"undefined"!=typeof Promise)return new Promise(function(e){n=e})}var rt=new ue;function it(e){!function e(t,n){var r,i;var o=Array.isArray(t);if(!o&&!u(t)||Object.isFrozen(t)||t instanceof me)return;if(t.__ob__){var a=t.__ob__.dep.id;if(n.has(a))return;n.add(a)}if(o)for(r=t.length;r--;)e(t[r],n);else for(i=Object.keys(t),r=i.length;r--;)e(t[i[r]],n)}(e,rt),rt.clear()}var ot=k(function(e){var t="&"===e.charAt(0),n="~"===(e=t?e.slice(1):e).charAt(0),r="!"===(e=n?e.slice(1):e).charAt(0);return{name:e=r?e.slice(1):e,once:n,capture:r,passive:t}});function at(e,t){function n(){var e=arguments,r=n.fns;if(!Array.isArray(r))return Ye(r,null,arguments,t,"v-on handler");for(var i=r.slice(),o=0;o<i.length;o++)Ye(i[o],null,e,t,"v-on handler")}return n.fns=e,n}function st(e,t,n,r,o,s){var u,c,l,f;for(u in e)c=e[u],l=t[u],f=ot(u),i(c)||(i(l)?(i(c.fns)&&(c=e[u]=at(c,s)),a(f.once)&&(c=e[u]=o(f.name,c,f.capture)),n(f.name,c,f.capture,f.passive,f.params)):c!==l&&(l.fns=c,e[u]=l));for(u in t)i(e[u])&&r((f=ot(u)).name,t[u],f.capture)}function ut(e,t,n){var r;e instanceof me&&(e=e.data.hook||(e.data.hook={}));var s=e[t];function u(){n.apply(this,arguments),b(r.fns,u)}i(s)?r=at([u]):o(s.fns)&&a(s.merged)?(r=s).fns.push(u):r=at([s,u]),r.merged=!0,e[t]=r}function ct(e,t,n,r,i){if(o(t)){if(_(t,n))return e[n]=t[n],i||delete t[n],!0;if(_(t,r))return e[n]=t[r],i||delete t[r],!0}return!1}function lt(e){return s(e)?[be(e)]:Array.isArray(e)?function e(t,n){var r=[];var u,c,l,f;for(u=0;u<t.length;u++)i(c=t[u])||"boolean"==typeof c||(l=r.length-1,f=r[l],Array.isArray(c)?c.length>0&&(ft((c=e(c,(n||"")+"_"+u))[0])&&ft(f)&&(r[l]=be(f.text+c[0].text),c.shift()),r.push.apply(r,c)):s(c)?ft(f)?r[l]=be(f.text+c):""!==c&&r.push(be(c)):ft(c)&&ft(f)?r[l]=be(f.text+c.text):(a(t._isVList)&&o(c.tag)&&i(c.key)&&o(n)&&(c.key="__vlist"+n+"_"+u+"__"),r.push(c)));return r}(e):void 0}function ft(e){return o(e)&&o(e.text)&&!1===e.isComment}function ht(e,t){if(e){for(var n=Object.create(null),r=ce?Reflect.ownKeys(e):Object.keys(e),i=0;i<r.length;i++){var o=r[i];if("__ob__"!==o){for(var a=e[o].from,s=t;s;){if(s._provided&&_(s._provided,a)){n[o]=s._provided[a];break}s=s.$parent}if(!s)if("default"in e[o]){var u=e[o].default;n[o]="function"==typeof u?u.call(t):u}else 0}}return n}}function dt(e,t){if(!e||!e.length)return{};for(var n={},r=0,i=e.length;r<i;r++){var o=e[r],a=o.data;if(a&&a.attrs&&a.attrs.slot&&delete a.attrs.slot,o.context!==t&&o.fnContext!==t||!a||null==a.slot)(n.default||(n.default=[])).push(o);else{var s=a.slot,u=n[s]||(n[s]=[]);"template"===o.tag?u.push.apply(u,o.children||[]):u.push(o)}}for(var c in n)n[c].every(pt)&&delete n[c];return n}function pt(e){return e.isComment&&!e.asyncFactory||" "===e.text}function vt(e,t,n){var i,o=Object.keys(t).length>0,a=e?!!e.$stable:!o,s=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(a&&n&&n!==r&&s===n.$key&&!o&&!n.$hasNormal)return n;for(var u in i={},e)e[u]&&"$"!==u[0]&&(i[u]=mt(t,u,e[u]))}else i={};for(var c in t)c in i||(i[c]=yt(t,c));return e&&Object.isExtensible(e)&&(e._normalized=i),V(i,"$stable",a),V(i,"$key",s),V(i,"$hasNormal",o),i}function mt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({});return(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:lt(e))&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function yt(e,t){return function(){return e[t]}}function gt(e,t){var n,r,i,a,s;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),r=0,i=e.length;r<i;r++)n[r]=t(e[r],r);else if("number"==typeof e)for(n=new Array(e),r=0;r<e;r++)n[r]=t(r+1,r);else if(u(e))if(ce&&e[Symbol.iterator]){n=[];for(var c=e[Symbol.iterator](),l=c.next();!l.done;)n.push(t(l.value,n.length)),l=c.next()}else for(a=Object.keys(e),n=new Array(a.length),r=0,i=a.length;r<i;r++)s=a[r],n[r]=t(e[s],s,r);return o(n)||(n=[]),n._isVList=!0,n}function bt(e,t,n,r){var i,o=this.$scopedSlots[e];o?(n=n||{},r&&(n=O(O({},r),n)),i=o(n)||t):i=this.$slots[e]||t;var a=n&&n.slot;return a?this.$createElement("template",{slot:a},i):i}function wt(e){return Fe(this.$options,"filters",e)||M}function _t(e,t){return Array.isArray(e)?-1===e.indexOf(t):e!==t}function kt(e,t,n,r,i){var o=z.keyCodes[t]||n;return i&&r&&!z.keyCodes[t]?_t(i,r):o?_t(o,e):r?S(r)!==t:void 0}function xt(e,t,n,r,i){if(n)if(u(n)){var o;Array.isArray(n)&&(n=P(n));var a=function(a){if("class"===a||"style"===a||g(a))o=e;else{var s=e.attrs&&e.attrs.type;o=r||z.mustUseProp(t,s,a)?e.domProps||(e.domProps={}):e.attrs||(e.attrs={})}var u=E(a),c=S(a);u in o||c in o||(o[a]=n[a],i&&((e.on||(e.on={}))["update:"+a]=function(e){n[a]=e}))};for(var s in n)a(s)}else;return e}function Et(e,t){var n=this._staticTrees||(this._staticTrees=[]),r=n[e];return r&&!t?r:(At(r=n[e]=this.$options.staticRenderFns[e].call(this._renderProxy,null,this),"__static__"+e,!1),r)}function Tt(e,t,n){return At(e,"__once__"+t+(n?"_"+n:""),!0),e}function At(e,t,n){if(Array.isArray(e))for(var r=0;r<e.length;r++)e[r]&&"string"!=typeof e[r]&&St(e[r],t+"_"+r,n);else St(e,t,n)}function St(e,t,n){e.isStatic=!0,e.key=t,e.isOnce=n}function Ct(e,t){if(t)if(l(t)){var n=e.on=e.on?O({},e.on):{};for(var r in t){var i=n[r],o=t[r];n[r]=i?[].concat(i,o):o}}else;return e}function It(e,t,n,r){t=t||{$stable:!n};for(var i=0;i<e.length;i++){var o=e[i];Array.isArray(o)?It(o,t,n):o&&(o.proxy&&(o.fn.proxy=!0),t[o.key]=o.fn)}return r&&(t.$key=r),t}function Ot(e,t){for(var n=0;n<t.length;n+=2){var r=t[n];"string"==typeof r&&r&&(e[t[n]]=t[n+1])}return e}function Pt(e,t){return"string"==typeof e?t+e:e}function Dt(e){e._o=Tt,e._n=v,e._s=p,e._l=gt,e._t=bt,e._q=j,e._i=N,e._m=Et,e._f=wt,e._k=kt,e._b=xt,e._v=be,e._e=ge,e._u=It,e._g=Ct,e._d=Ot,e._p=Pt}function Lt(e,t,n,i,o){var s,u=this,c=o.options;_(i,"_uid")?(s=Object.create(i))._original=i:(s=i,i=i._original);var l=a(c._compiled),f=!l;this.data=e,this.props=t,this.children=n,this.parent=i,this.listeners=e.on||r,this.injections=ht(c.inject,i),this.slots=function(){return u.$slots||vt(e.scopedSlots,u.$slots=dt(n,i)),u.$slots},Object.defineProperty(this,"scopedSlots",{enumerable:!0,get:function(){return vt(e.scopedSlots,this.slots())}}),l&&(this.$options=c,this.$slots=this.slots(),this.$scopedSlots=vt(e.scopedSlots,this.$slots)),c._scopeId?this._c=function(e,t,n,r){var o=$t(s,e,t,n,r,f);return o&&!Array.isArray(o)&&(o.fnScopeId=c._scopeId,o.fnContext=i),o}:this._c=function(e,t,n,r){return $t(s,e,t,n,r,f)}}function Mt(e,t,n,r,i){var o=we(e);return o.fnContext=n,o.fnOptions=r,t.slot&&((o.data||(o.data={})).slot=t.slot),o}function jt(e,t){for(var n in t)e[E(n)]=t[n]}Dt(Lt.prototype);var Nt={init:function(e,t){if(e.componentInstance&&!e.componentInstance._isDestroyed&&e.data.keepAlive){var n=e;Nt.prepatch(n,n)}else{(e.componentInstance=function(e,t){var n={_isComponent:!0,_parentVnode:e,parent:t},r=e.data.inlineTemplate;o(r)&&(n.render=r.render,n.staticRenderFns=r.staticRenderFns);return new e.componentOptions.Ctor(n)}(e,Jt)).$mount(t?e.elm:void 0,t)}},prepatch:function(e,t){var n=t.componentOptions;!function(e,t,n,i,o){0;var a=i.data.scopedSlots,s=e.$scopedSlots,u=!!(a&&!a.$stable||s!==r&&!s.$stable||a&&e.$scopedSlots.$key!==a.$key),c=!!(o||e.$options._renderChildren||u);e.$options._parentVnode=i,e.$vnode=i,e._vnode&&(e._vnode.parent=i);if(e.$options._renderChildren=o,e.$attrs=i.data.attrs||r,e.$listeners=n||r,t&&e.$options.props){Te(!1);for(var l=e._props,f=e.$options._propKeys||[],h=0;h<f.length;h++){var d=f[h],p=e.$options.props;l[d]=Be(d,p,t,e)}Te(!0),e.$options.propsData=t}n=n||r;var v=e.$options._parentListeners;e.$options._parentListeners=n,Zt(e,n,v),c&&(e.$slots=dt(o,i.context),e.$forceUpdate());0}(t.componentInstance=e.componentInstance,n.propsData,n.listeners,t,n.children)},insert:function(e){var t,n=e.context,r=e.componentInstance;r._isMounted||(r._isMounted=!0,nn(r,"mounted")),e.data.keepAlive&&(n._isMounted?((t=r)._inactive=!1,on.push(t)):tn(r,!0))},destroy:function(e){var t=e.componentInstance;t._isDestroyed||(e.data.keepAlive?function e(t,n){if(n&&(t._directInactive=!0,en(t)))return;if(!t._inactive){t._inactive=!0;for(var r=0;r<t.$children.length;r++)e(t.$children[r]);nn(t,"deactivated")}}(t,!0):t.$destroy())}},Rt=Object.keys(Nt);function Ft(e,t,n,s,c){if(!i(e)){var l=n.$options._base;if(u(e)&&(e=l.extend(e)),"function"==typeof e){var f;if(i(e.cid)&&void 0===(e=function(e,t){if(a(e.error)&&o(e.errorComp))return e.errorComp;if(o(e.resolved))return e.resolved;var n=Yt;n&&o(e.owners)&&-1===e.owners.indexOf(n)&&e.owners.push(n);if(a(e.loading)&&o(e.loadingComp))return e.loadingComp;if(n&&!o(e.owners)){var r=e.owners=[n],s=!0,c=null,l=null;n.$on("hook:destroyed",function(){return b(r,n)});var f=function(e){for(var t=0,n=r.length;t<n;t++)r[t].$forceUpdate();e&&(r.length=0,null!==c&&(clearTimeout(c),c=null),null!==l&&(clearTimeout(l),l=null))},h=R(function(n){e.resolved=Ht(n,t),s?r.length=0:f(!0)}),p=R(function(t){o(e.errorComp)&&(e.error=!0,f(!0))}),v=e(h,p);return u(v)&&(d(v)?i(e.resolved)&&v.then(h,p):d(v.component)&&(v.component.then(h,p),o(v.error)&&(e.errorComp=Ht(v.error,t)),o(v.loading)&&(e.loadingComp=Ht(v.loading,t),0===v.delay?e.loading=!0:c=setTimeout(function(){c=null,i(e.resolved)&&i(e.error)&&(e.loading=!0,f(!1))},v.delay||200)),o(v.timeout)&&(l=setTimeout(function(){l=null,i(e.resolved)&&p(null)},v.timeout)))),s=!1,e.loading?e.loadingComp:e.resolved}}(f=e,l)))return function(e,t,n,r,i){var o=ge();return o.asyncFactory=e,o.asyncMeta={data:t,context:n,children:r,tag:i},o}(f,t,n,s,c);t=t||{},Tn(e),o(t.model)&&function(e,t){var n=e.model&&e.model.prop||"value",r=e.model&&e.model.event||"input";(t.attrs||(t.attrs={}))[n]=t.model.value;var i=t.on||(t.on={}),a=i[r],s=t.model.callback;o(a)?(Array.isArray(a)?-1===a.indexOf(s):a!==s)&&(i[r]=[s].concat(a)):i[r]=s}(e.options,t);var h=function(e,t,n){var r=t.options.props;if(!i(r)){var a={},s=e.attrs,u=e.props;if(o(s)||o(u))for(var c in r){var l=S(c);ct(a,u,c,l,!0)||ct(a,s,c,l,!1)}return a}}(t,e);if(a(e.options.functional))return function(e,t,n,i,a){var s=e.options,u={},c=s.props;if(o(c))for(var l in c)u[l]=Be(l,c,t||r);else o(n.attrs)&&jt(u,n.attrs),o(n.props)&&jt(u,n.props);var f=new Lt(n,u,a,i,e),h=s.render.call(null,f._c,f);if(h instanceof me)return Mt(h,n,f.parent,s);if(Array.isArray(h)){for(var d=lt(h)||[],p=new Array(d.length),v=0;v<d.length;v++)p[v]=Mt(d[v],n,f.parent,s);return p}}(e,h,t,n,s);var p=t.on;if(t.on=t.nativeOn,a(e.options.abstract)){var v=t.slot;t={},v&&(t.slot=v)}!function(e){for(var t=e.hook||(e.hook={}),n=0;n<Rt.length;n++){var r=Rt[n],i=t[r],o=Nt[r];i===o||i&&i._merged||(t[r]=i?Bt(o,i):o)}}(t);var m=e.options.name||c;return new me("vue-component-"+e.cid+(m?"-"+m:""),t,void 0,void 0,void 0,n,{Ctor:e,propsData:h,listeners:p,tag:c,children:s},f)}}}function Bt(e,t){var n=function(n,r){e(n,r),t(n,r)};return n._merged=!0,n}var Ut=1,zt=2;function $t(e,t,n,r,c,l){return(Array.isArray(n)||s(n))&&(c=r,r=n,n=void 0),a(l)&&(c=zt),function(e,t,n,r,s){if(o(n)&&o(n.__ob__))return ge();o(n)&&o(n.is)&&(t=n.is);if(!t)return ge();0;Array.isArray(r)&&"function"==typeof r[0]&&((n=n||{}).scopedSlots={default:r[0]},r.length=0);s===zt?r=lt(r):s===Ut&&(r=function(e){for(var t=0;t<e.length;t++)if(Array.isArray(e[t]))return Array.prototype.concat.apply([],e);return e}(r));var c,l;if("string"==typeof t){var f;l=e.$vnode&&e.$vnode.ns||z.getTagNamespace(t),c=z.isReservedTag(t)?new me(z.parsePlatformTagName(t),n,r,void 0,void 0,e):n&&n.pre||!o(f=Fe(e.$options,"components",t))?new me(t,n,r,void 0,void 0,e):Ft(f,n,e,r,t)}else c=Ft(t,n,e,r);return Array.isArray(c)?c:o(c)?(o(l)&&function e(t,n,r){t.ns=n;"foreignObject"===t.tag&&(n=void 0,r=!0);if(o(t.children))for(var s=0,u=t.children.length;s<u;s++){var c=t.children[s];o(c.tag)&&(i(c.ns)||a(r)&&"svg"!==c.tag)&&e(c,n,r)}}(c,l),o(n)&&function(e){u(e.style)&&it(e.style);u(e.class)&&it(e.class)}(n),c):ge()}(e,t,n,r,c)}var Vt,Yt=null;function Ht(e,t){return(e.__esModule||ce&&"Module"===e[Symbol.toStringTag])&&(e=e.default),u(e)?t.extend(e):e}function qt(e){return e.isComment&&e.asyncFactory}function Wt(e){if(Array.isArray(e))for(var t=0;t<e.length;t++){var n=e[t];if(o(n)&&(o(n.componentOptions)||qt(n)))return n}}function Gt(e,t){Vt.$on(e,t)}function Kt(e,t){Vt.$off(e,t)}function Qt(e,t){var n=Vt;return function r(){null!==t.apply(null,arguments)&&n.$off(e,r)}}function Zt(e,t,n){Vt=e,st(t,n||{},Gt,Kt,Qt,e),Vt=void 0}var Jt=null;function Xt(e){var t=Jt;return Jt=e,function(){Jt=t}}function en(e){for(;e&&(e=e.$parent);)if(e._inactive)return!0;return!1}function tn(e,t){if(t){if(e._directInactive=!1,en(e))return}else if(e._directInactive)return;if(e._inactive||null===e._inactive){e._inactive=!1;for(var n=0;n<e.$children.length;n++)tn(e.$children[n]);nn(e,"activated")}}function nn(e,t){pe();var n=e.$options[t],r=t+" hook";if(n)for(var i=0,o=n.length;i<o;i++)Ye(n[i],e,null,e,r);e._hasHookEvent&&e.$emit("hook:"+t),ve()}var rn=[],on=[],an={},sn=!1,un=!1,cn=0;var ln=0,fn=Date.now;if(W&&!Z){var hn=window.performance;hn&&"function"==typeof hn.now&&fn()>document.createEvent("Event").timeStamp&&(fn=function(){return hn.now()})}function dn(){var e,t;for(ln=fn(),un=!0,rn.sort(function(e,t){return e.id-t.id}),cn=0;cn<rn.length;cn++)(e=rn[cn]).before&&e.before(),t=e.id,an[t]=null,e.run();var n=on.slice(),r=rn.slice();cn=rn.length=on.length=0,an={},sn=un=!1,function(e){for(var t=0;t<e.length;t++)e[t]._inactive=!0,tn(e[t],!0)}(n),function(e){var t=e.length;for(;t--;){var n=e[t],r=n.vm;r._watcher===n&&r._isMounted&&!r._isDestroyed&&nn(r,"updated")}}(r),ae&&z.devtools&&ae.emit("flush")}var pn=0,vn=function(e,t,n,r,i){this.vm=e,i&&(e._watcher=this),e._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync,this.before=r.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++pn,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new ue,this.newDepIds=new ue,this.expression="","function"==typeof t?this.getter=t:(this.getter=function(e){if(!Y.test(e)){var t=e.split(".");return function(e){for(var n=0;n<t.length;n++){if(!e)return;e=e[t[n]]}return e}}}(t),this.getter||(this.getter=D)),this.value=this.lazy?void 0:this.get()};vn.prototype.get=function(){var e;pe(this);var t=this.vm;try{e=this.getter.call(t,t)}catch(e){if(!this.user)throw e;Ve(e,t,'getter for watcher "'+this.expression+'"')}finally{this.deep&&it(e),ve(),this.cleanupDeps()}return e},vn.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},vn.prototype.cleanupDeps=function(){for(var e=this.deps.length;e--;){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},vn.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():function(e){var t=e.id;if(null==an[t]){if(an[t]=!0,un){for(var n=rn.length-1;n>cn&&rn[n].id>e.id;)n--;rn.splice(n+1,0,e)}else rn.push(e);sn||(sn=!0,nt(dn))}}(this)},vn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||u(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Ve(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},vn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},vn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},vn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||b(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var mn={enumerable:!0,configurable:!0,get:D,set:D};function yn(e,t,n){mn.get=function(){return this[t][n]},mn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,mn)}function gn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},i=e.$options._propKeys=[];e.$parent&&Te(!1);var o=function(o){i.push(o);var a=Be(o,t,n,e);Ce(r,o,a),o in e||yn(e,"_props",o)};for(var a in t)o(a);Te(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?D:C(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;l(t=e._data="function"==typeof t?function(e,t){pe();try{return e.call(t,t)}catch(e){return Ve(e,t,"data()"),{}}finally{ve()}}(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,i=(e.$options.methods,n.length);for(;i--;){var o=n[i];0,r&&_(r,o)||(void 0,36!==(a=(o+"").charCodeAt(0))&&95!==a&&yn(e,"_data",o))}var a;Se(t,!0)}(e):Se(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=oe();for(var i in t){var o=t[i],a="function"==typeof o?o:o.get;0,r||(n[i]=new vn(e,a||D,D,bn)),i in e||wn(e,i,o)}}(e,t.computed),t.watch&&t.watch!==ne&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i<r.length;i++)xn(e,n,r[i]);else xn(e,n,r)}}(e,t.watch)}var bn={lazy:!0};function wn(e,t,n){var r=!oe();"function"==typeof n?(mn.get=r?_n(t):kn(n),mn.set=D):(mn.get=n.get?r&&!1!==n.cache?_n(t):kn(n.get):D,mn.set=n.set||D),Object.defineProperty(e,t,mn)}function _n(e){return function(){var t=this._computedWatchers&&this._computedWatchers[e];if(t)return t.dirty&&t.evaluate(),he.target&&t.depend(),t.value}}function kn(e){return function(){return e.call(this,this)}}function xn(e,t,n,r){return l(n)&&(r=n,n=n.handler),"string"==typeof n&&(n=e[n]),e.$watch(t,n,r)}var En=0;function Tn(e){var t=e.options;if(e.super){var n=Tn(e.super);if(n!==e.superOptions){e.superOptions=n;var r=function(e){var t,n=e.options,r=e.sealedOptions;for(var i in n)n[i]!==r[i]&&(t||(t={}),t[i]=n[i]);return t}(e);r&&O(e.extendOptions,r),(t=e.options=Re(n,e.extendOptions)).name&&(t.components[t.name]=e)}}return t}function An(e){this._init(e)}function Sn(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,r=n.cid,i=e._Ctor||(e._Ctor={});if(i[r])return i[r];var o=e.name||n.options.name;var a=function(e){this._init(e)};return(a.prototype=Object.create(n.prototype)).constructor=a,a.cid=t++,a.options=Re(n.options,e),a.super=n,a.options.props&&function(e){var t=e.options.props;for(var n in t)yn(e.prototype,"_props",n)}(a),a.options.computed&&function(e){var t=e.options.computed;for(var n in t)wn(e.prototype,n,t[n])}(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,B.forEach(function(e){a[e]=n[e]}),o&&(a.options.components[o]=a),a.superOptions=n.options,a.extendOptions=e,a.sealedOptions=O({},a.options),i[r]=a,a}}function Cn(e){return e&&(e.Ctor.options.name||e.tag)}function In(e,t){return Array.isArray(e)?e.indexOf(t)>-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!f(e)&&e.test(t)}function On(e,t){var n=e.cache,r=e.keys,i=e._vnode;for(var o in n){var a=n[o];if(a){var s=Cn(a.componentOptions);s&&!t(s)&&Pn(n,o,r,i)}}}function Pn(e,t,n,r){var i=e[t];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),e[t]=null,b(n,t)}!function(e){e.prototype._init=function(e){var t=this;t._uid=En++,t._isVue=!0,e&&e._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(t,e):t.$options=Re(Tn(t.constructor),e||{},t),t._renderProxy=t,t._self=t,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(t),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Zt(e,t)}(t),function(e){e._vnode=null,e._staticTrees=null;var t=e.$options,n=e.$vnode=t._parentVnode,i=n&&n.context;e.$slots=dt(t._renderChildren,i),e.$scopedSlots=r,e._c=function(t,n,r,i){return $t(e,t,n,r,i,!1)},e.$createElement=function(t,n,r,i){return $t(e,t,n,r,i,!0)};var o=n&&n.data;Ce(e,"$attrs",o&&o.attrs||r,null,!0),Ce(e,"$listeners",t._parentListeners||r,null,!0)}(t),nn(t,"beforeCreate"),function(e){var t=ht(e.$options.inject,e);t&&(Te(!1),Object.keys(t).forEach(function(n){Ce(e,n,t[n])}),Te(!0))}(t),gn(t),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(t),nn(t,"created"),t.$options.el&&t.$mount(t.$options.el)}}(An),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=Ie,e.prototype.$delete=Oe,e.prototype.$watch=function(e,t,n){if(l(t))return xn(this,e,t,n);(n=n||{}).user=!0;var r=new vn(this,e,t,n);if(n.immediate)try{t.call(this,r.value)}catch(e){Ve(e,this,'callback for immediate watcher "'+r.expression+'"')}return function(){r.teardown()}}}(An),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var i=0,o=e.length;i<o;i++)r.$on(e[i],n);else(r._events[e]||(r._events[e]=[])).push(n),t.test(e)&&(r._hasHookEvent=!0);return r},e.prototype.$once=function(e,t){var n=this;function r(){n.$off(e,r),t.apply(n,arguments)}return r.fn=t,n.$on(e,r),n},e.prototype.$off=function(e,t){var n=this;if(!arguments.length)return n._events=Object.create(null),n;if(Array.isArray(e)){for(var r=0,i=e.length;r<i;r++)n.$off(e[r],t);return n}var o,a=n._events[e];if(!a)return n;if(!t)return n._events[e]=null,n;for(var s=a.length;s--;)if((o=a[s])===t||o.fn===t){a.splice(s,1);break}return n},e.prototype.$emit=function(e){var t=this._events[e];if(t){t=t.length>1?I(t):t;for(var n=I(arguments,1),r='event handler for "'+e+'"',i=0,o=t.length;i<o;i++)Ye(t[i],this,n,this,r)}return this}}(An),function(e){e.prototype._update=function(e,t){var n=this,r=n.$el,i=n._vnode,o=Xt(n);n._vnode=e,n.$el=i?n.__patch__(i,e):n.__patch__(n.$el,e,t,!1),o(),r&&(r.__vue__=null),n.$el&&(n.$el.__vue__=n),n.$vnode&&n.$parent&&n.$vnode===n.$parent._vnode&&(n.$parent.$el=n.$el)},e.prototype.$forceUpdate=function(){this._watcher&&this._watcher.update()},e.prototype.$destroy=function(){var e=this;if(!e._isBeingDestroyed){nn(e,"beforeDestroy"),e._isBeingDestroyed=!0;var t=e.$parent;!t||t._isBeingDestroyed||e.$options.abstract||b(t.$children,e),e._watcher&&e._watcher.teardown();for(var n=e._watchers.length;n--;)e._watchers[n].teardown();e._data.__ob__&&e._data.__ob__.vmCount--,e._isDestroyed=!0,e.__patch__(e._vnode,null),nn(e,"destroyed"),e.$off(),e.$el&&(e.$el.__vue__=null),e.$vnode&&(e.$vnode.parent=null)}}}(An),function(e){Dt(e.prototype),e.prototype.$nextTick=function(e){return nt(e,this)},e.prototype._render=function(){var e,t=this,n=t.$options,r=n.render,i=n._parentVnode;i&&(t.$scopedSlots=vt(i.data.scopedSlots,t.$slots,t.$scopedSlots)),t.$vnode=i;try{Yt=t,e=r.call(t._renderProxy,t.$createElement)}catch(n){Ve(n,t,"render"),e=t._vnode}finally{Yt=null}return Array.isArray(e)&&1===e.length&&(e=e[0]),e instanceof me||(e=ge()),e.parent=i,e}}(An);var Dn=[String,RegExp,Array],Ln={KeepAlive:{name:"keep-alive",abstract:!0,props:{include:Dn,exclude:Dn,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Pn(this.cache,e,this.keys)},mounted:function(){var e=this;this.$watch("include",function(t){On(e,function(e){return In(t,e)})}),this.$watch("exclude",function(t){On(e,function(e){return!In(t,e)})})},render:function(){var e=this.$slots.default,t=Wt(e),n=t&&t.componentOptions;if(n){var r=Cn(n),i=this.include,o=this.exclude;if(i&&(!r||!In(i,r))||o&&r&&In(o,r))return t;var a=this.cache,s=this.keys,u=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;a[u]?(t.componentInstance=a[u].componentInstance,b(s,u),s.push(u)):(a[u]=t,s.push(u),this.max&&s.length>parseInt(this.max)&&Pn(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return z}};Object.defineProperty(e,"config",t),e.util={warn:le,extend:O,mergeOptions:Re,defineReactive:Ce},e.set=Ie,e.delete=Oe,e.nextTick=nt,e.observable=function(e){return Se(e),e},e.options=Object.create(null),B.forEach(function(t){e.options[t+"s"]=Object.create(null)}),e.options._base=e,O(e.options.components,Ln),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=I(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=Re(this.options,e),this}}(e),Sn(e),function(e){B.forEach(function(t){e[t]=function(e,n){return n?("component"===t&&l(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}})}(e)}(An),Object.defineProperty(An.prototype,"$isServer",{get:oe}),Object.defineProperty(An.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(An,"FunctionalRenderContext",{value:Lt}),An.version="2.6.11";var Mn=m("style,class"),jn=m("input,textarea,option,select,progress"),Nn=function(e,t,n){return"value"===n&&jn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Rn=m("contenteditable,draggable,spellcheck"),Fn=m("events,caret,typing,plaintext-only"),Bn=function(e,t){return Yn(t)||"false"===t?"false":"contenteditable"===e&&Fn(t)?t:"true"},Un=m("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),zn="http://www.w3.org/1999/xlink",$n=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Vn=function(e){return $n(e)?e.slice(6,e.length):""},Yn=function(e){return null==e||!1===e};function Hn(e){for(var t=e.data,n=e,r=e;o(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(t=qn(r.data,t));for(;o(n=n.parent);)n&&n.data&&(t=qn(t,n.data));return function(e,t){if(o(e)||o(t))return Wn(e,Gn(t));return""}(t.staticClass,t.class)}function qn(e,t){return{staticClass:Wn(e.staticClass,t.staticClass),class:o(e.class)?[e.class,t.class]:t.class}}function Wn(e,t){return e?t?e+" "+t:e:t||""}function Gn(e){return Array.isArray(e)?function(e){for(var t,n="",r=0,i=e.length;r<i;r++)o(t=Gn(e[r]))&&""!==t&&(n&&(n+=" "),n+=t);return n}(e):u(e)?function(e){var t="";for(var n in e)e[n]&&(t&&(t+=" "),t+=n);return t}(e):"string"==typeof e?e:""}var Kn={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"},Qn=m("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot"),Zn=m("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0),Jn=function(e){return Qn(e)||Zn(e)};function Xn(e){return Zn(e)?"svg":"math"===e?"math":void 0}var er=Object.create(null);var tr=m("text,number,password,search,email,tel,url");function nr(e){if("string"==typeof e){var t=document.querySelector(e);return t||document.createElement("div")}return e}var rr=Object.freeze({createElement:function(e,t){var n=document.createElement(e);return"select"!==e?n:(t.data&&t.data.attrs&&void 0!==t.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n)},createElementNS:function(e,t){return document.createElementNS(Kn[e],t)},createTextNode:function(e){return document.createTextNode(e)},createComment:function(e){return document.createComment(e)},insertBefore:function(e,t,n){e.insertBefore(t,n)},removeChild:function(e,t){e.removeChild(t)},appendChild:function(e,t){e.appendChild(t)},parentNode:function(e){return e.parentNode},nextSibling:function(e){return e.nextSibling},tagName:function(e){return e.tagName},setTextContent:function(e,t){e.textContent=t},setStyleScope:function(e,t){e.setAttribute(t,"")}}),ir={create:function(e,t){or(t)},update:function(e,t){e.data.ref!==t.data.ref&&(or(e,!0),or(t))},destroy:function(e){or(e,!0)}};function or(e,t){var n=e.data.ref;if(o(n)){var r=e.context,i=e.componentInstance||e.elm,a=r.$refs;t?Array.isArray(a[n])?b(a[n],i):a[n]===i&&(a[n]=void 0):e.data.refInFor?Array.isArray(a[n])?a[n].indexOf(i)<0&&a[n].push(i):a[n]=[i]:a[n]=i}}var ar=new me("",{},[]),sr=["create","activate","update","remove","destroy"];function ur(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&o(e.data)===o(t.data)&&function(e,t){if("input"!==e.tag)return!0;var n,r=o(n=e.data)&&o(n=n.attrs)&&n.type,i=o(n=t.data)&&o(n=n.attrs)&&n.type;return r===i||tr(r)&&tr(i)}(e,t)||a(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&i(t.asyncFactory.error))}function cr(e,t,n){var r,i,a={};for(r=t;r<=n;++r)o(i=e[r].key)&&(a[i]=r);return a}var lr={create:fr,update:fr,destroy:function(e){fr(e,ar)}};function fr(e,t){(e.data.directives||t.data.directives)&&function(e,t){var n,r,i,o=e===ar,a=t===ar,s=dr(e.data.directives,e.context),u=dr(t.data.directives,t.context),c=[],l=[];for(n in u)r=s[n],i=u[n],r?(i.oldValue=r.value,i.oldArg=r.arg,vr(i,"update",t,e),i.def&&i.def.componentUpdated&&l.push(i)):(vr(i,"bind",t,e),i.def&&i.def.inserted&&c.push(i));if(c.length){var f=function(){for(var n=0;n<c.length;n++)vr(c[n],"inserted",t,e)};o?ut(t,"insert",f):f()}l.length&&ut(t,"postpatch",function(){for(var n=0;n<l.length;n++)vr(l[n],"componentUpdated",t,e)});if(!o)for(n in s)u[n]||vr(s[n],"unbind",e,e,a)}(e,t)}var hr=Object.create(null);function dr(e,t){var n,r,i=Object.create(null);if(!e)return i;for(n=0;n<e.length;n++)(r=e[n]).modifiers||(r.modifiers=hr),i[pr(r)]=r,r.def=Fe(t.$options,"directives",r.name);return i}function pr(e){return e.rawName||e.name+"."+Object.keys(e.modifiers||{}).join(".")}function vr(e,t,n,r,i){var o=e.def&&e.def[t];if(o)try{o(n.elm,e,n,r,i)}catch(r){Ve(r,n.context,"directive "+e.name+" "+t+" hook")}}var mr=[ir,lr];function yr(e,t){var n=t.componentOptions;if(!(o(n)&&!1===n.Ctor.options.inheritAttrs||i(e.data.attrs)&&i(t.data.attrs))){var r,a,s=t.elm,u=e.data.attrs||{},c=t.data.attrs||{};for(r in o(c.__ob__)&&(c=t.data.attrs=O({},c)),c)a=c[r],u[r]!==a&&gr(s,r,a);for(r in(Z||X)&&c.value!==u.value&&gr(s,"value",c.value),u)i(c[r])&&($n(r)?s.removeAttributeNS(zn,Vn(r)):Rn(r)||s.removeAttribute(r))}}function gr(e,t,n){e.tagName.indexOf("-")>-1?br(e,t,n):Un(t)?Yn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Rn(t)?e.setAttribute(t,Bn(t,n)):$n(t)?Yn(n)?e.removeAttributeNS(zn,Vn(t)):e.setAttributeNS(zn,t,n):br(e,t,n)}function br(e,t,n){if(Yn(n))e.removeAttribute(t);else{if(Z&&!J&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var wr={create:yr,update:yr};function _r(e,t){var n=t.elm,r=t.data,a=e.data;if(!(i(r.staticClass)&&i(r.class)&&(i(a)||i(a.staticClass)&&i(a.class)))){var s=Hn(t),u=n._transitionClasses;o(u)&&(s=Wn(s,Gn(u))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var kr,xr,Er,Tr,Ar,Sr,Cr={create:_r,update:_r},Ir=/[\w).+\-_$\]]/;function Or(e){var t,n,r,i,o,a=!1,s=!1,u=!1,c=!1,l=0,f=0,h=0,d=0;for(r=0;r<e.length;r++)if(n=t,t=e.charCodeAt(r),a)39===t&&92!==n&&(a=!1);else if(s)34===t&&92!==n&&(s=!1);else if(u)96===t&&92!==n&&(u=!1);else if(c)47===t&&92!==n&&(c=!1);else if(124!==t||124===e.charCodeAt(r+1)||124===e.charCodeAt(r-1)||l||f||h){switch(t){case 34:s=!0;break;case 39:a=!0;break;case 96:u=!0;break;case 40:h++;break;case 41:h--;break;case 91:f++;break;case 93:f--;break;case 123:l++;break;case 125:l--}if(47===t){for(var p=r-1,v=void 0;p>=0&&" "===(v=e.charAt(p));p--);v&&Ir.test(v)||(c=!0)}}else void 0===i?(d=r+1,i=e.slice(0,r).trim()):m();function m(){(o||(o=[])).push(e.slice(d,r).trim()),d=r+1}if(void 0===i?i=e.slice(0,r).trim():0!==d&&m(),o)for(r=0;r<o.length;r++)i=Pr(i,o[r]);return i}function Pr(e,t){var n=t.indexOf("(");if(n<0)return'_f("'+t+'")('+e+")";var r=t.slice(0,n),i=t.slice(n+1);return'_f("'+r+'")('+e+(")"!==i?","+i:i)}function Dr(e,t){console.error("[Vue compiler]: "+e)}function Lr(e,t){return e?e.map(function(e){return e[t]}).filter(function(e){return e}):[]}function Mr(e,t,n,r,i){(e.props||(e.props=[])).push(Vr({name:t,value:n,dynamic:i},r)),e.plain=!1}function jr(e,t,n,r,i){(i?e.dynamicAttrs||(e.dynamicAttrs=[]):e.attrs||(e.attrs=[])).push(Vr({name:t,value:n,dynamic:i},r)),e.plain=!1}function Nr(e,t,n,r){e.attrsMap[t]=n,e.attrsList.push(Vr({name:t,value:n},r))}function Rr(e,t,n,r,i,o,a,s){(e.directives||(e.directives=[])).push(Vr({name:t,rawName:n,value:r,arg:i,isDynamicArg:o,modifiers:a},s)),e.plain=!1}function Fr(e,t,n){return n?"_p("+t+',"'+e+'")':e+t}function Br(e,t,n,i,o,a,s,u){var c;(i=i||r).right?u?t="("+t+")==='click'?'contextmenu':("+t+")":"click"===t&&(t="contextmenu",delete i.right):i.middle&&(u?t="("+t+")==='click'?'mouseup':("+t+")":"click"===t&&(t="mouseup")),i.capture&&(delete i.capture,t=Fr("!",t,u)),i.once&&(delete i.once,t=Fr("~",t,u)),i.passive&&(delete i.passive,t=Fr("&",t,u)),i.native?(delete i.native,c=e.nativeEvents||(e.nativeEvents={})):c=e.events||(e.events={});var l=Vr({value:n.trim(),dynamic:u},s);i!==r&&(l.modifiers=i);var f=c[t];Array.isArray(f)?o?f.unshift(l):f.push(l):c[t]=f?o?[l,f]:[f,l]:l,e.plain=!1}function Ur(e,t,n){var r=zr(e,":"+t)||zr(e,"v-bind:"+t);if(null!=r)return Or(r);if(!1!==n){var i=zr(e,t);if(null!=i)return JSON.stringify(i)}}function zr(e,t,n){var r;if(null!=(r=e.attrsMap[t]))for(var i=e.attrsList,o=0,a=i.length;o<a;o++)if(i[o].name===t){i.splice(o,1);break}return n&&delete e.attrsMap[t],r}function $r(e,t){for(var n=e.attrsList,r=0,i=n.length;r<i;r++){var o=n[r];if(t.test(o.name))return n.splice(r,1),o}}function Vr(e,t){return t&&(null!=t.start&&(e.start=t.start),null!=t.end&&(e.end=t.end)),e}function Yr(e,t,n){var r=n||{},i=r.number,o="$$v";r.trim&&(o="(typeof $$v === 'string'? $$v.trim(): $$v)"),i&&(o="_n("+o+")");var a=Hr(t,o);e.model={value:"("+t+")",expression:JSON.stringify(t),callback:"function ($$v) {"+a+"}"}}function Hr(e,t){var n=function(e){if(e=e.trim(),kr=e.length,e.indexOf("[")<0||e.lastIndexOf("]")<kr-1)return(Tr=e.lastIndexOf("."))>-1?{exp:e.slice(0,Tr),key:'"'+e.slice(Tr+1)+'"'}:{exp:e,key:null};xr=e,Tr=Ar=Sr=0;for(;!Wr();)Gr(Er=qr())?Qr(Er):91===Er&&Kr(Er);return{exp:e.slice(0,Ar),key:e.slice(Ar+1,Sr)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function qr(){return xr.charCodeAt(++Tr)}function Wr(){return Tr>=kr}function Gr(e){return 34===e||39===e}function Kr(e){var t=1;for(Ar=Tr;!Wr();)if(Gr(e=qr()))Qr(e);else if(91===e&&t++,93===e&&t--,0===t){Sr=Tr;break}}function Qr(e){for(var t=e;!Wr()&&(e=qr())!==t;);}var Zr,Jr="__r",Xr="__c";function ei(e,t,n){var r=Zr;return function i(){null!==t.apply(null,arguments)&&ri(e,i,n,r)}}var ti=Ge&&!(te&&Number(te[1])<=53);function ni(e,t,n,r){if(ti){var i=ln,o=t;t=o._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=i||e.timeStamp<=0||e.target.ownerDocument!==document)return o.apply(this,arguments)}}Zr.addEventListener(e,t,re?{capture:n,passive:r}:n)}function ri(e,t,n,r){(r||Zr).removeEventListener(e,t._wrapper||t,n)}function ii(e,t){if(!i(e.data.on)||!i(t.data.on)){var n=t.data.on||{},r=e.data.on||{};Zr=t.elm,function(e){if(o(e[Jr])){var t=Z?"change":"input";e[t]=[].concat(e[Jr],e[t]||[]),delete e[Jr]}o(e[Xr])&&(e.change=[].concat(e[Xr],e.change||[]),delete e[Xr])}(n),st(n,r,ni,ri,ei,t.context),Zr=void 0}}var oi,ai={create:ii,update:ii};function si(e,t){if(!i(e.data.domProps)||!i(t.data.domProps)){var n,r,a=t.elm,s=e.data.domProps||{},u=t.data.domProps||{};for(n in o(u.__ob__)&&(u=t.data.domProps=O({},u)),s)n in u||(a[n]="");for(n in u){if(r=u[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),r===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=r;var c=i(r)?"":String(r);ui(a,c)&&(a.value=c)}else if("innerHTML"===n&&Zn(a.tagName)&&i(a.innerHTML)){(oi=oi||document.createElement("div")).innerHTML="<svg>"+r+"</svg>";for(var l=oi.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(r!==s[n])try{a[n]=r}catch(e){}}}}function ui(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var n=e.value,r=e._vModifiers;if(o(r)){if(r.number)return v(n)!==v(t);if(r.trim)return n.trim()!==t.trim()}return n!==t}(e,t))}var ci={create:si,update:si},li=k(function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach(function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t});function fi(e){var t=hi(e.style);return e.staticStyle?O(e.staticStyle,t):t}function hi(e){return Array.isArray(e)?P(e):"string"==typeof e?li(e):e}var di,pi=/^--/,vi=/\s*!important$/,mi=function(e,t,n){if(pi.test(t))e.style.setProperty(t,n);else if(vi.test(n))e.style.setProperty(S(t),n.replace(vi,""),"important");else{var r=gi(t);if(Array.isArray(n))for(var i=0,o=n.length;i<o;i++)e.style[r]=n[i];else e.style[r]=n}},yi=["Webkit","Moz","ms"],gi=k(function(e){if(di=di||document.createElement("div").style,"filter"!==(e=E(e))&&e in di)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<yi.length;n++){var r=yi[n]+t;if(r in di)return r}});function bi(e,t){var n=t.data,r=e.data;if(!(i(n.staticStyle)&&i(n.style)&&i(r.staticStyle)&&i(r.style))){var a,s,u=t.elm,c=r.staticStyle,l=r.normalizedStyle||r.style||{},f=c||l,h=hi(t.data.style)||{};t.data.normalizedStyle=o(h.__ob__)?O({},h):h;var d=function(e,t){var n,r={};if(t)for(var i=e;i.componentInstance;)(i=i.componentInstance._vnode)&&i.data&&(n=fi(i.data))&&O(r,n);(n=fi(e.data))&&O(r,n);for(var o=e;o=o.parent;)o.data&&(n=fi(o.data))&&O(r,n);return r}(t,!0);for(s in f)i(d[s])&&mi(u,s,"");for(s in d)(a=d[s])!==f[s]&&mi(u,s,null==a?"":a)}}var wi={create:bi,update:bi},_i=/\s+/;function ki(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(_i).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function xi(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(_i).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function Ei(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&O(t,Ti(e.name||"v")),O(t,e),t}return"string"==typeof e?Ti(e):void 0}}var Ti=k(function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}}),Ai=W&&!J,Si="transition",Ci="animation",Ii="transition",Oi="transitionend",Pi="animation",Di="animationend";Ai&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Ii="WebkitTransition",Oi="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Pi="WebkitAnimation",Di="webkitAnimationEnd"));var Li=W?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Mi(e){Li(function(){Li(e)})}function ji(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),ki(e,t))}function Ni(e,t){e._transitionClasses&&b(e._transitionClasses,t),xi(e,t)}function Ri(e,t,n){var r=Bi(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Si?Oi:Di,u=0,c=function(){e.removeEventListener(s,l),n()},l=function(t){t.target===e&&++u>=a&&c()};setTimeout(function(){u<a&&c()},o+1),e.addEventListener(s,l)}var Fi=/\b(transform|all)(,|$)/;function Bi(e,t){var n,r=window.getComputedStyle(e),i=(r[Ii+"Delay"]||"").split(", "),o=(r[Ii+"Duration"]||"").split(", "),a=Ui(i,o),s=(r[Pi+"Delay"]||"").split(", "),u=(r[Pi+"Duration"]||"").split(", "),c=Ui(s,u),l=0,f=0;return t===Si?a>0&&(n=Si,l=a,f=o.length):t===Ci?c>0&&(n=Ci,l=c,f=u.length):f=(n=(l=Math.max(a,c))>0?a>c?Si:Ci:null)?n===Si?o.length:u.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===Si&&Fi.test(r[Ii+"Property"])}}function Ui(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max.apply(null,t.map(function(t,n){return zi(t)+zi(e[n])}))}function zi(e){return 1e3*Number(e.slice(0,-1).replace(",","."))}function $i(e,t){var n=e.elm;o(n._leaveCb)&&(n._leaveCb.cancelled=!0,n._leaveCb());var r=Ei(e.data.transition);if(!i(r)&&!o(n._enterCb)&&1===n.nodeType){for(var a=r.css,s=r.type,c=r.enterClass,l=r.enterToClass,f=r.enterActiveClass,h=r.appearClass,d=r.appearToClass,p=r.appearActiveClass,m=r.beforeEnter,y=r.enter,g=r.afterEnter,b=r.enterCancelled,w=r.beforeAppear,_=r.appear,k=r.afterAppear,x=r.appearCancelled,E=r.duration,T=Jt,A=Jt.$vnode;A&&A.parent;)T=A.context,A=A.parent;var S=!T._isMounted||!e.isRootInsert;if(!S||_||""===_){var C=S&&h?h:c,I=S&&p?p:f,O=S&&d?d:l,P=S&&w||m,D=S&&"function"==typeof _?_:y,L=S&&k||g,M=S&&x||b,j=v(u(E)?E.enter:E);0;var N=!1!==a&&!J,F=Hi(D),B=n._enterCb=R(function(){N&&(Ni(n,O),Ni(n,I)),B.cancelled?(N&&Ni(n,C),M&&M(n)):L&&L(n),n._enterCb=null});e.data.show||ut(e,"insert",function(){var t=n.parentNode,r=t&&t._pending&&t._pending[e.key];r&&r.tag===e.tag&&r.elm._leaveCb&&r.elm._leaveCb(),D&&D(n,B)}),P&&P(n),N&&(ji(n,C),ji(n,I),Mi(function(){Ni(n,C),B.cancelled||(ji(n,O),F||(Yi(j)?setTimeout(B,j):Ri(n,s,B)))})),e.data.show&&(t&&t(),D&&D(n,B)),N||F||B()}}}function Vi(e,t){var n=e.elm;o(n._enterCb)&&(n._enterCb.cancelled=!0,n._enterCb());var r=Ei(e.data.transition);if(i(r)||1!==n.nodeType)return t();if(!o(n._leaveCb)){var a=r.css,s=r.type,c=r.leaveClass,l=r.leaveToClass,f=r.leaveActiveClass,h=r.beforeLeave,d=r.leave,p=r.afterLeave,m=r.leaveCancelled,y=r.delayLeave,g=r.duration,b=!1!==a&&!J,w=Hi(d),_=v(u(g)?g.leave:g);0;var k=n._leaveCb=R(function(){n.parentNode&&n.parentNode._pending&&(n.parentNode._pending[e.key]=null),b&&(Ni(n,l),Ni(n,f)),k.cancelled?(b&&Ni(n,c),m&&m(n)):(t(),p&&p(n)),n._leaveCb=null});y?y(x):x()}function x(){k.cancelled||(!e.data.show&&n.parentNode&&((n.parentNode._pending||(n.parentNode._pending={}))[e.key]=e),h&&h(n),b&&(ji(n,c),ji(n,f),Mi(function(){Ni(n,c),k.cancelled||(ji(n,l),w||(Yi(_)?setTimeout(k,_):Ri(n,s,k)))})),d&&d(n,k),b||w||k())}}function Yi(e){return"number"==typeof e&&!isNaN(e)}function Hi(e){if(i(e))return!1;var t=e.fns;return o(t)?Hi(Array.isArray(t)?t[0]:t):(e._length||e.length)>1}function qi(e,t){!0!==t.data.show&&$i(t)}var Wi=function(e){var t,n,r={},u=e.modules,c=e.nodeOps;for(t=0;t<sr.length;++t)for(r[sr[t]]=[],n=0;n<u.length;++n)o(u[n][sr[t]])&&r[sr[t]].push(u[n][sr[t]]);function l(e){var t=c.parentNode(e);o(t)&&c.removeChild(t,e)}function f(e,t,n,i,s,u,l){if(o(e.elm)&&o(u)&&(e=u[l]=we(e)),e.isRootInsert=!s,!function(e,t,n,i){var s=e.data;if(o(s)){var u=o(e.componentInstance)&&s.keepAlive;if(o(s=s.hook)&&o(s=s.init)&&s(e,!1),o(e.componentInstance))return h(e,t),d(n,e.elm,i),a(u)&&function(e,t,n,i){for(var a,s=e;s.componentInstance;)if(s=s.componentInstance._vnode,o(a=s.data)&&o(a=a.transition)){for(a=0;a<r.activate.length;++a)r.activate[a](ar,s);t.push(s);break}d(n,e.elm,i)}(e,t,n,i),!0}}(e,t,n,i)){var f=e.data,v=e.children,m=e.tag;o(m)?(e.elm=e.ns?c.createElementNS(e.ns,m):c.createElement(m,e),g(e),p(e,v,t),o(f)&&y(e,t),d(n,e.elm,i)):a(e.isComment)?(e.elm=c.createComment(e.text),d(n,e.elm,i)):(e.elm=c.createTextNode(e.text),d(n,e.elm,i))}}function h(e,t){o(e.data.pendingInsert)&&(t.push.apply(t,e.data.pendingInsert),e.data.pendingInsert=null),e.elm=e.componentInstance.$el,v(e)?(y(e,t),g(e)):(or(e),t.push(e))}function d(e,t,n){o(e)&&(o(n)?c.parentNode(n)===e&&c.insertBefore(e,t,n):c.appendChild(e,t))}function p(e,t,n){if(Array.isArray(t))for(var r=0;r<t.length;++r)f(t[r],n,e.elm,null,!0,t,r);else s(e.text)&&c.appendChild(e.elm,c.createTextNode(String(e.text)))}function v(e){for(;e.componentInstance;)e=e.componentInstance._vnode;return o(e.tag)}function y(e,n){for(var i=0;i<r.create.length;++i)r.create[i](ar,e);o(t=e.data.hook)&&(o(t.create)&&t.create(ar,e),o(t.insert)&&n.push(e))}function g(e){var t;if(o(t=e.fnScopeId))c.setStyleScope(e.elm,t);else for(var n=e;n;)o(t=n.context)&&o(t=t.$options._scopeId)&&c.setStyleScope(e.elm,t),n=n.parent;o(t=Jt)&&t!==e.context&&t!==e.fnContext&&o(t=t.$options._scopeId)&&c.setStyleScope(e.elm,t)}function b(e,t,n,r,i,o){for(;r<=i;++r)f(n[r],o,e,t,!1,n,r)}function w(e){var t,n,i=e.data;if(o(i))for(o(t=i.hook)&&o(t=t.destroy)&&t(e),t=0;t<r.destroy.length;++t)r.destroy[t](e);if(o(t=e.children))for(n=0;n<e.children.length;++n)w(e.children[n])}function _(e,t,n){for(;t<=n;++t){var r=e[t];o(r)&&(o(r.tag)?(k(r),w(r)):l(r.elm))}}function k(e,t){if(o(t)||o(e.data)){var n,i=r.remove.length+1;for(o(t)?t.listeners+=i:t=function(e,t){function n(){0==--n.listeners&&l(e)}return n.listeners=t,n}(e.elm,i),o(n=e.componentInstance)&&o(n=n._vnode)&&o(n.data)&&k(n,t),n=0;n<r.remove.length;++n)r.remove[n](e,t);o(n=e.data.hook)&&o(n=n.remove)?n(e,t):t()}else l(e.elm)}function x(e,t,n,r){for(var i=n;i<r;i++){var a=t[i];if(o(a)&&ur(e,a))return i}}function E(e,t,n,s,u,l){if(e!==t){o(t.elm)&&o(s)&&(t=s[u]=we(t));var h=t.elm=e.elm;if(a(e.isAsyncPlaceholder))o(t.asyncFactory.resolved)?S(e.elm,t,n):t.isAsyncPlaceholder=!0;else if(a(t.isStatic)&&a(e.isStatic)&&t.key===e.key&&(a(t.isCloned)||a(t.isOnce)))t.componentInstance=e.componentInstance;else{var d,p=t.data;o(p)&&o(d=p.hook)&&o(d=d.prepatch)&&d(e,t);var m=e.children,y=t.children;if(o(p)&&v(t)){for(d=0;d<r.update.length;++d)r.update[d](e,t);o(d=p.hook)&&o(d=d.update)&&d(e,t)}i(t.text)?o(m)&&o(y)?m!==y&&function(e,t,n,r,a){for(var s,u,l,h=0,d=0,p=t.length-1,v=t[0],m=t[p],y=n.length-1,g=n[0],w=n[y],k=!a;h<=p&&d<=y;)i(v)?v=t[++h]:i(m)?m=t[--p]:ur(v,g)?(E(v,g,r,n,d),v=t[++h],g=n[++d]):ur(m,w)?(E(m,w,r,n,y),m=t[--p],w=n[--y]):ur(v,w)?(E(v,w,r,n,y),k&&c.insertBefore(e,v.elm,c.nextSibling(m.elm)),v=t[++h],w=n[--y]):ur(m,g)?(E(m,g,r,n,d),k&&c.insertBefore(e,m.elm,v.elm),m=t[--p],g=n[++d]):(i(s)&&(s=cr(t,h,p)),i(u=o(g.key)?s[g.key]:x(g,t,h,p))?f(g,r,e,v.elm,!1,n,d):ur(l=t[u],g)?(E(l,g,r,n,d),t[u]=void 0,k&&c.insertBefore(e,l.elm,v.elm)):f(g,r,e,v.elm,!1,n,d),g=n[++d]);h>p?b(e,i(n[y+1])?null:n[y+1].elm,n,d,y,r):d>y&&_(t,h,p)}(h,m,y,n,l):o(y)?(o(e.text)&&c.setTextContent(h,""),b(h,null,y,0,y.length-1,n)):o(m)?_(m,0,m.length-1):o(e.text)&&c.setTextContent(h,""):e.text!==t.text&&c.setTextContent(h,t.text),o(p)&&o(d=p.hook)&&o(d=d.postpatch)&&d(e,t)}}}function T(e,t,n){if(a(n)&&o(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r<t.length;++r)t[r].data.hook.insert(t[r])}var A=m("attrs,class,staticClass,staticStyle,key");function S(e,t,n,r){var i,s=t.tag,u=t.data,c=t.children;if(r=r||u&&u.pre,t.elm=e,a(t.isComment)&&o(t.asyncFactory))return t.isAsyncPlaceholder=!0,!0;if(o(u)&&(o(i=u.hook)&&o(i=i.init)&&i(t,!0),o(i=t.componentInstance)))return h(t,n),!0;if(o(s)){if(o(c))if(e.hasChildNodes())if(o(i=u)&&o(i=i.domProps)&&o(i=i.innerHTML)){if(i!==e.innerHTML)return!1}else{for(var l=!0,f=e.firstChild,d=0;d<c.length;d++){if(!f||!S(f,c[d],n,r)){l=!1;break}f=f.nextSibling}if(!l||f)return!1}else p(t,c,n);if(o(u)){var v=!1;for(var m in u)if(!A(m)){v=!0,y(t,n);break}!v&&u.class&&it(u.class)}}else e.data!==t.text&&(e.data=t.text);return!0}return function(e,t,n,s){if(!i(t)){var u,l=!1,h=[];if(i(e))l=!0,f(t,h);else{var d=o(e.nodeType);if(!d&&ur(e,t))E(e,t,h,null,null,s);else{if(d){if(1===e.nodeType&&e.hasAttribute(F)&&(e.removeAttribute(F),n=!0),a(n)&&S(e,t,h))return T(t,h,!0),e;u=e,e=new me(c.tagName(u).toLowerCase(),{},[],void 0,u)}var p=e.elm,m=c.parentNode(p);if(f(t,h,p._leaveCb?null:m,c.nextSibling(p)),o(t.parent))for(var y=t.parent,g=v(t);y;){for(var b=0;b<r.destroy.length;++b)r.destroy[b](y);if(y.elm=t.elm,g){for(var k=0;k<r.create.length;++k)r.create[k](ar,y);var x=y.data.hook.insert;if(x.merged)for(var A=1;A<x.fns.length;A++)x.fns[A]()}else or(y);y=y.parent}o(m)?_([e],0,0):o(e.tag)&&w(e)}}return T(t,h,l),t.elm}o(e)&&w(e)}}({nodeOps:rr,modules:[wr,Cr,ai,ci,wi,W?{create:qi,activate:qi,remove:function(e,t){!0!==e.data.show?Vi(e,t):t()}}:{}].concat(mr)});J&&document.addEventListener("selectionchange",function(){var e=document.activeElement;e&&e.vmodel&&to(e,"input")});var Gi={inserted:function(e,t,n,r){"select"===n.tag?(r.elm&&!r.elm._vOptions?ut(n,"postpatch",function(){Gi.componentUpdated(e,t,n)}):Ki(e,t,n.context),e._vOptions=[].map.call(e.options,Ji)):("textarea"===n.tag||tr(e.type))&&(e._vModifiers=t.modifiers,t.modifiers.lazy||(e.addEventListener("compositionstart",Xi),e.addEventListener("compositionend",eo),e.addEventListener("change",eo),J&&(e.vmodel=!0)))},componentUpdated:function(e,t,n){if("select"===n.tag){Ki(e,t,n.context);var r=e._vOptions,i=e._vOptions=[].map.call(e.options,Ji);if(i.some(function(e,t){return!j(e,r[t])}))(e.multiple?t.value.some(function(e){return Zi(e,i)}):t.value!==t.oldValue&&Zi(t.value,i))&&to(e,"change")}}};function Ki(e,t,n){Qi(e,t,n),(Z||X)&&setTimeout(function(){Qi(e,t,n)},0)}function Qi(e,t,n){var r=t.value,i=e.multiple;if(!i||Array.isArray(r)){for(var o,a,s=0,u=e.options.length;s<u;s++)if(a=e.options[s],i)o=N(r,Ji(a))>-1,a.selected!==o&&(a.selected=o);else if(j(Ji(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function Zi(e,t){return t.every(function(t){return!j(t,e)})}function Ji(e){return"_value"in e?e._value:e.value}function Xi(e){e.target.composing=!0}function eo(e){e.target.composing&&(e.target.composing=!1,to(e.target,"input"))}function to(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function no(e){return!e.componentInstance||e.data&&e.data.transition?e:no(e.componentInstance._vnode)}var ro={model:Gi,show:{bind:function(e,t,n){var r=t.value,i=(n=no(n)).data&&n.data.transition,o=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&i?(n.data.show=!0,$i(n,function(){e.style.display=o})):e.style.display=r?o:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=no(n)).data&&n.data.transition?(n.data.show=!0,r?$i(n,function(){e.style.display=e.__vOriginalDisplay}):Vi(n,function(){e.style.display="none"})):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,i){i||(e.style.display=e.__vOriginalDisplay)}}},io={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function oo(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?oo(Wt(t.children)):e}function ao(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var i=n._parentListeners;for(var o in i)t[E(o)]=i[o];return t}function so(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var uo=function(e){return e.tag||qt(e)},co=function(e){return"show"===e.name},lo={name:"transition",props:io,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(uo)).length){0;var r=this.mode;0;var i=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return i;var o=oo(i);if(!o)return i;if(this._leaving)return so(e,i);var a="__transition-"+this._uid+"-";o.key=null==o.key?o.isComment?a+"comment":a+o.tag:s(o.key)?0===String(o.key).indexOf(a)?o.key:a+o.key:o.key;var u=(o.data||(o.data={})).transition=ao(this),c=this._vnode,l=oo(c);if(o.data.directives&&o.data.directives.some(co)&&(o.data.show=!0),l&&l.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(o,l)&&!qt(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=O({},u);if("out-in"===r)return this._leaving=!0,ut(f,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),so(e,i);if("in-out"===r){if(qt(o))return c;var h,d=function(){h()};ut(u,"afterEnter",d),ut(u,"enterCancelled",d),ut(f,"delayLeave",function(e){h=e})}}return i}}},fo=O({tag:String,moveClass:String},io);function ho(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function po(e){e.data.newPos=e.elm.getBoundingClientRect()}function vo(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,i=t.top-n.top;if(r||i){e.data.moved=!0;var o=e.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}delete fo.mode;var mo={Transition:lo,TransitionGroup:{props:fo,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var i=Xt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,i(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=ao(this),s=0;s<i.length;s++){var u=i[s];if(u.tag)if(null!=u.key&&0!==String(u.key).indexOf("__vlist"))o.push(u),n[u.key]=u,(u.data||(u.data={})).transition=a;else;}if(r){for(var c=[],l=[],f=0;f<r.length;f++){var h=r[f];h.data.transition=a,h.data.pos=h.elm.getBoundingClientRect(),n[h.key]?c.push(h):l.push(h)}this.kept=e(t,null,c),this.removed=l}return e(t,null,o)},updated:function(){var e=this.prevChildren,t=this.moveClass||(this.name||"v")+"-move";e.length&&this.hasMove(e[0].elm,t)&&(e.forEach(ho),e.forEach(po),e.forEach(vo),this._reflow=document.body.offsetHeight,e.forEach(function(e){if(e.data.moved){var n=e.elm,r=n.style;ji(n,t),r.transform=r.WebkitTransform=r.transitionDuration="",n.addEventListener(Oi,n._moveCb=function e(r){r&&r.target!==n||r&&!/transform$/.test(r.propertyName)||(n.removeEventListener(Oi,e),n._moveCb=null,Ni(n,t))})}}))},methods:{hasMove:function(e,t){if(!Ai)return!1;if(this._hasMove)return this._hasMove;var n=e.cloneNode();e._transitionClasses&&e._transitionClasses.forEach(function(e){xi(n,e)}),ki(n,t),n.style.display="none",this.$el.appendChild(n);var r=Bi(n);return this.$el.removeChild(n),this._hasMove=r.hasTransform}}}};An.config.mustUseProp=Nn,An.config.isReservedTag=Jn,An.config.isReservedAttr=Mn,An.config.getTagNamespace=Xn,An.config.isUnknownElement=function(e){if(!W)return!0;if(Jn(e))return!1;if(e=e.toLowerCase(),null!=er[e])return er[e];var t=document.createElement(e);return e.indexOf("-")>-1?er[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:er[e]=/HTMLUnknownElement/.test(t.toString())},O(An.options.directives,ro),O(An.options.components,mo),An.prototype.__patch__=W?Wi:D,An.prototype.$mount=function(e,t){return function(e,t,n){return e.$el=t,e.$options.render||(e.$options.render=ge),nn(e,"beforeMount"),new vn(e,function(){e._update(e._render(),n)},D,{before:function(){e._isMounted&&!e._isDestroyed&&nn(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,nn(e,"mounted")),e}(this,e=e&&W?nr(e):void 0,t)},W&&setTimeout(function(){z.devtools&&ae&&ae.emit("init",An)},0);var yo=/\{\{((?:.|\r?\n)+?)\}\}/g,go=/[-.*+?^${}()|[\]\/\\]/g,bo=k(function(e){var t=e[0].replace(go,"\\$&"),n=e[1].replace(go,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")});var wo={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=zr(e,"class");n&&(e.staticClass=JSON.stringify(n));var r=Ur(e,"class",!1);r&&(e.classBinding=r)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var _o,ko={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=zr(e,"style");n&&(e.staticStyle=JSON.stringify(li(n)));var r=Ur(e,"style",!1);r&&(e.styleBinding=r)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},xo=function(e){return(_o=_o||document.createElement("div")).innerHTML=e,_o.textContent},Eo=m("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),To=m("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),Ao=m("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),So=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Co=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Io="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+$.source+"]*",Oo="((?:"+Io+"\\:)?"+Io+")",Po=new RegExp("^<"+Oo),Do=/^\s*(\/?)>/,Lo=new RegExp("^<\\/"+Oo+"[^>]*>"),Mo=/^<!DOCTYPE [^>]+>/i,jo=/^<!\--/,No=/^<!\[/,Ro=m("script,style,textarea",!0),Fo={},Bo={"&lt;":"<","&gt;":">","&quot;":'"',"&amp;":"&","&#10;":"\n","&#9;":"\t","&#39;":"'"},Uo=/&(?:lt|gt|quot|amp|#39);/g,zo=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,$o=m("pre,textarea",!0),Vo=function(e,t){return e&&$o(e)&&"\n"===t[0]};function Yo(e,t){var n=t?zo:Uo;return e.replace(n,function(e){return Bo[e]})}var Ho,qo,Wo,Go,Ko,Qo,Zo,Jo,Xo=/^@|^v-on:/,ea=/^v-|^@|^:|^#/,ta=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,na=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,ra=/^\(|\)$/g,ia=/^\[.*\]$/,oa=/:(.*)$/,aa=/^:|^\.|^v-bind:/,sa=/\.[^.\]]+(?=[^\]]*$)/g,ua=/^v-slot(:|$)|^#/,ca=/[\r\n]/,la=/\s+/g,fa=k(xo),ha="_empty_";function da(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:function(e){for(var t={},n=0,r=e.length;n<r;n++)t[e[n].name]=e[n].value;return t}(t),rawAttrsMap:{},parent:n,children:[]}}function pa(e,t){Ho=t.warn||Dr,Qo=t.isPreTag||L,Zo=t.mustUseProp||L,Jo=t.getTagNamespace||L;var n=t.isReservedTag||L;(function(e){return!!e.component||!n(e.tag)}),Wo=Lr(t.modules,"transformNode"),Go=Lr(t.modules,"preTransformNode"),Ko=Lr(t.modules,"postTransformNode"),qo=t.delimiters;var r,i,o=[],a=!1!==t.preserveWhitespace,s=t.whitespace,u=!1,c=!1;function l(e){if(f(e),u||e.processed||(e=va(e,t)),o.length||e===r||r.if&&(e.elseif||e.else)&&ya(r,{exp:e.elseif,block:e}),i&&!e.forbidden)if(e.elseif||e.else)a=e,(s=function(e){var t=e.length;for(;t--;){if(1===e[t].type)return e[t];e.pop()}}(i.children))&&s.if&&ya(s,{exp:a.elseif,block:a});else{if(e.slotScope){var n=e.slotTarget||'"default"';(i.scopedSlots||(i.scopedSlots={}))[n]=e}i.children.push(e),e.parent=i}var a,s;e.children=e.children.filter(function(e){return!e.slotScope}),f(e),e.pre&&(u=!1),Qo(e.tag)&&(c=!1);for(var l=0;l<Ko.length;l++)Ko[l](e,t)}function f(e){if(!c)for(var t;(t=e.children[e.children.length-1])&&3===t.type&&" "===t.text;)e.children.pop()}return function(e,t){for(var n,r,i=[],o=t.expectHTML,a=t.isUnaryTag||L,s=t.canBeLeftOpenTag||L,u=0;e;){if(n=e,r&&Ro(r)){var c=0,l=r.toLowerCase(),f=Fo[l]||(Fo[l]=new RegExp("([\\s\\S]*?)(</"+l+"[^>]*>)","i")),h=e.replace(f,function(e,n,r){return c=r.length,Ro(l)||"noscript"===l||(n=n.replace(/<!\--([\s\S]*?)-->/g,"$1").replace(/<!\[CDATA\[([\s\S]*?)]]>/g,"$1")),Vo(l,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""});u+=e.length-h.length,e=h,A(l,u-c,u)}else{var d=e.indexOf("<");if(0===d){if(jo.test(e)){var p=e.indexOf("--\x3e");if(p>=0){t.shouldKeepComment&&t.comment(e.substring(4,p),u,u+p+3),x(p+3);continue}}if(No.test(e)){var v=e.indexOf("]>");if(v>=0){x(v+2);continue}}var m=e.match(Mo);if(m){x(m[0].length);continue}var y=e.match(Lo);if(y){var g=u;x(y[0].length),A(y[1],g,u);continue}var b=E();if(b){T(b),Vo(b.tagName,e)&&x(1);continue}}var w=void 0,_=void 0,k=void 0;if(d>=0){for(_=e.slice(d);!(Lo.test(_)||Po.test(_)||jo.test(_)||No.test(_)||(k=_.indexOf("<",1))<0);)d+=k,_=e.slice(d);w=e.substring(0,d)}d<0&&(w=e),w&&x(w.length),t.chars&&w&&t.chars(w,u-w.length,u)}if(e===n){t.chars&&t.chars(e);break}}function x(t){u+=t,e=e.substring(t)}function E(){var t=e.match(Po);if(t){var n,r,i={tagName:t[1],attrs:[],start:u};for(x(t[0].length);!(n=e.match(Do))&&(r=e.match(Co)||e.match(So));)r.start=u,x(r[0].length),r.end=u,i.attrs.push(r);if(n)return i.unarySlash=n[1],x(n[0].length),i.end=u,i}}function T(e){var n=e.tagName,u=e.unarySlash;o&&("p"===r&&Ao(n)&&A(r),s(n)&&r===n&&A(n));for(var c=a(n)||!!u,l=e.attrs.length,f=new Array(l),h=0;h<l;h++){var d=e.attrs[h],p=d[3]||d[4]||d[5]||"",v="a"===n&&"href"===d[1]?t.shouldDecodeNewlinesForHref:t.shouldDecodeNewlines;f[h]={name:d[1],value:Yo(p,v)}}c||(i.push({tag:n,lowerCasedTag:n.toLowerCase(),attrs:f,start:e.start,end:e.end}),r=n),t.start&&t.start(n,f,c,e.start,e.end)}function A(e,n,o){var a,s;if(null==n&&(n=u),null==o&&(o=u),e)for(s=e.toLowerCase(),a=i.length-1;a>=0&&i[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var c=i.length-1;c>=a;c--)t.end&&t.end(i[c].tag,n,o);i.length=a,r=a&&i[a-1].tag}else"br"===s?t.start&&t.start(e,[],!0,n,o):"p"===s&&(t.start&&t.start(e,[],!1,n,o),t.end&&t.end(e,n,o))}A()}(e,{warn:Ho,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,n,a,s,f){var h=i&&i.ns||Jo(e);Z&&"svg"===h&&(n=function(e){for(var t=[],n=0;n<e.length;n++){var r=e[n];wa.test(r.name)||(r.name=r.name.replace(_a,""),t.push(r))}return t}(n));var d,p=da(e,n,i);h&&(p.ns=h),"style"!==(d=p).tag&&("script"!==d.tag||d.attrsMap.type&&"text/javascript"!==d.attrsMap.type)||oe()||(p.forbidden=!0);for(var v=0;v<Go.length;v++)p=Go[v](p,t)||p;u||(!function(e){null!=zr(e,"v-pre")&&(e.pre=!0)}(p),p.pre&&(u=!0)),Qo(p.tag)&&(c=!0),u?function(e){var t=e.attrsList,n=t.length;if(n)for(var r=e.attrs=new Array(n),i=0;i<n;i++)r[i]={name:t[i].name,value:JSON.stringify(t[i].value)},null!=t[i].start&&(r[i].start=t[i].start,r[i].end=t[i].end);else e.pre||(e.plain=!0)}(p):p.processed||(ma(p),function(e){var t=zr(e,"v-if");if(t)e.if=t,ya(e,{exp:t,block:e});else{null!=zr(e,"v-else")&&(e.else=!0);var n=zr(e,"v-else-if");n&&(e.elseif=n)}}(p),function(e){null!=zr(e,"v-once")&&(e.once=!0)}(p)),r||(r=p),a?l(p):(i=p,o.push(p))},end:function(e,t,n){var r=o[o.length-1];o.length-=1,i=o[o.length-1],l(r)},chars:function(e,t,n){if(i&&(!Z||"textarea"!==i.tag||i.attrsMap.placeholder!==e)){var r,o,l,f=i.children;if(e=c||e.trim()?"script"===(r=i).tag||"style"===r.tag?e:fa(e):f.length?s?"condense"===s&&ca.test(e)?"":" ":a?" ":"":"")c||"condense"!==s||(e=e.replace(la," ")),!u&&" "!==e&&(o=function(e,t){var n=t?bo(t):yo;if(n.test(e)){for(var r,i,o,a=[],s=[],u=n.lastIndex=0;r=n.exec(e);){(i=r.index)>u&&(s.push(o=e.slice(u,i)),a.push(JSON.stringify(o)));var c=Or(r[1].trim());a.push("_s("+c+")"),s.push({"@binding":c}),u=i+r[0].length}return u<e.length&&(s.push(o=e.slice(u)),a.push(JSON.stringify(o))),{expression:a.join("+"),tokens:s}}}(e,qo))?l={type:2,expression:o.expression,tokens:o.tokens,text:e}:" "===e&&f.length&&" "===f[f.length-1].text||(l={type:3,text:e}),l&&f.push(l)}},comment:function(e,t,n){if(i){var r={type:3,text:e,isComment:!0};0,i.children.push(r)}}}),r}function va(e,t){var n,r;!function(e){var t=Ur(e,"key");if(t){e.key=t}}(e),e.plain=!e.key&&!e.scopedSlots&&!e.attrsList.length,(r=Ur(n=e,"ref"))&&(n.ref=r,n.refInFor=function(e){for(var t=e;t;){if(void 0!==t.for)return!0;t=t.parent}return!1}(n)),function(e){var t;"template"===e.tag?(t=zr(e,"scope"),e.slotScope=t||zr(e,"slot-scope")):(t=zr(e,"slot-scope"))&&(e.slotScope=t);var n=Ur(e,"slot");n&&(e.slotTarget='""'===n?'"default"':n,e.slotTargetDynamic=!(!e.attrsMap[":slot"]&&!e.attrsMap["v-bind:slot"]),"template"===e.tag||e.slotScope||jr(e,"slot",n,function(e,t){return e.rawAttrsMap[":"+t]||e.rawAttrsMap["v-bind:"+t]||e.rawAttrsMap[t]}(e,"slot")));if("template"===e.tag){var r=$r(e,ua);if(r){0;var i=ga(r),o=i.name,a=i.dynamic;e.slotTarget=o,e.slotTargetDynamic=a,e.slotScope=r.value||ha}}else{var s=$r(e,ua);if(s){0;var u=e.scopedSlots||(e.scopedSlots={}),c=ga(s),l=c.name,f=c.dynamic,h=u[l]=da("template",[],e);h.slotTarget=l,h.slotTargetDynamic=f,h.children=e.children.filter(function(e){if(!e.slotScope)return e.parent=h,!0}),h.slotScope=s.value||ha,e.children=[],e.plain=!1}}}(e),function(e){"slot"===e.tag&&(e.slotName=Ur(e,"name"))}(e),function(e){var t;(t=Ur(e,"is"))&&(e.component=t);null!=zr(e,"inline-template")&&(e.inlineTemplate=!0)}(e);for(var i=0;i<Wo.length;i++)e=Wo[i](e,t)||e;return function(e){var t,n,r,i,o,a,s,u,c=e.attrsList;for(t=0,n=c.length;t<n;t++){if(r=i=c[t].name,o=c[t].value,ea.test(r))if(e.hasBindings=!0,(a=ba(r.replace(ea,"")))&&(r=r.replace(sa,"")),aa.test(r))r=r.replace(aa,""),o=Or(o),(u=ia.test(r))&&(r=r.slice(1,-1)),a&&(a.prop&&!u&&"innerHtml"===(r=E(r))&&(r="innerHTML"),a.camel&&!u&&(r=E(r)),a.sync&&(s=Hr(o,"$event"),u?Br(e,'"update:"+('+r+")",s,null,!1,0,c[t],!0):(Br(e,"update:"+E(r),s,null,!1,0,c[t]),S(r)!==E(r)&&Br(e,"update:"+S(r),s,null,!1,0,c[t])))),a&&a.prop||!e.component&&Zo(e.tag,e.attrsMap.type,r)?Mr(e,r,o,c[t],u):jr(e,r,o,c[t],u);else if(Xo.test(r))r=r.replace(Xo,""),(u=ia.test(r))&&(r=r.slice(1,-1)),Br(e,r,o,a,!1,0,c[t],u);else{var l=(r=r.replace(ea,"")).match(oa),f=l&&l[1];u=!1,f&&(r=r.slice(0,-(f.length+1)),ia.test(f)&&(f=f.slice(1,-1),u=!0)),Rr(e,r,i,o,f,u,a,c[t])}else jr(e,r,JSON.stringify(o),c[t]),!e.component&&"muted"===r&&Zo(e.tag,e.attrsMap.type,r)&&Mr(e,r,"true",c[t])}}(e),e}function ma(e){var t;if(t=zr(e,"v-for")){var n=function(e){var t=e.match(ta);if(!t)return;var n={};n.for=t[2].trim();var r=t[1].trim().replace(ra,""),i=r.match(na);i?(n.alias=r.replace(na,"").trim(),n.iterator1=i[1].trim(),i[2]&&(n.iterator2=i[2].trim())):n.alias=r;return n}(t);n&&O(e,n)}}function ya(e,t){e.ifConditions||(e.ifConditions=[]),e.ifConditions.push(t)}function ga(e){var t=e.name.replace(ua,"");return t||"#"!==e.name[0]&&(t="default"),ia.test(t)?{name:t.slice(1,-1),dynamic:!0}:{name:'"'+t+'"',dynamic:!1}}function ba(e){var t=e.match(sa);if(t){var n={};return t.forEach(function(e){n[e.slice(1)]=!0}),n}}var wa=/^xmlns:NS\d+/,_a=/^NS\d+:/;function ka(e){return da(e.tag,e.attrsList.slice(),e.parent)}var xa=[wo,ko,{preTransformNode:function(e,t){if("input"===e.tag){var n,r=e.attrsMap;if(!r["v-model"])return;if((r[":type"]||r["v-bind:type"])&&(n=Ur(e,"type")),r.type||n||!r["v-bind"]||(n="("+r["v-bind"]+").type"),n){var i=zr(e,"v-if",!0),o=i?"&&("+i+")":"",a=null!=zr(e,"v-else",!0),s=zr(e,"v-else-if",!0),u=ka(e);ma(u),Nr(u,"type","checkbox"),va(u,t),u.processed=!0,u.if="("+n+")==='checkbox'"+o,ya(u,{exp:u.if,block:u});var c=ka(e);zr(c,"v-for",!0),Nr(c,"type","radio"),va(c,t),ya(u,{exp:"("+n+")==='radio'"+o,block:c});var l=ka(e);return zr(l,"v-for",!0),Nr(l,":type",n),va(l,t),ya(u,{exp:i,block:l}),a?u.else=!0:s&&(u.elseif=s),u}}}}];var Ea,Ta,Aa={expectHTML:!0,modules:xa,directives:{model:function(e,t,n){n;var r=t.value,i=t.modifiers,o=e.tag,a=e.attrsMap.type;if(e.component)return Yr(e,r,i),!1;if("select"===o)!function(e,t,n){var r='var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = "_value" in o ? o._value : o.value;return '+(n&&n.number?"_n(val)":"val")+"});";r=r+" "+Hr(t,"$event.target.multiple ? $$selectedVal : $$selectedVal[0]"),Br(e,"change",r,null,!0)}(e,r,i);else if("input"===o&&"checkbox"===a)!function(e,t,n){var r=n&&n.number,i=Ur(e,"value")||"null",o=Ur(e,"true-value")||"true",a=Ur(e,"false-value")||"false";Mr(e,"checked","Array.isArray("+t+")?_i("+t+","+i+")>-1"+("true"===o?":("+t+")":":_q("+t+","+o+")")),Br(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+o+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Hr(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Hr(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Hr(t,"$$c")+"}",null,!0)}(e,r,i);else if("input"===o&&"radio"===a)!function(e,t,n){var r=n&&n.number,i=Ur(e,"value")||"null";Mr(e,"checked","_q("+t+","+(i=r?"_n("+i+")":i)+")"),Br(e,"change",Hr(t,i),null,!0)}(e,r,i);else if("input"===o||"textarea"===o)!function(e,t,n){var r=e.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,u=!o&&"range"!==r,c=o?"change":"range"===r?Jr:"input",l="$event.target.value";s&&(l="$event.target.value.trim()"),a&&(l="_n("+l+")");var f=Hr(t,l);u&&(f="if($event.target.composing)return;"+f),Mr(e,"value","("+t+")"),Br(e,c,f,null,!0),(s||a)&&Br(e,"blur","$forceUpdate()")}(e,r,i);else if(!z.isReservedTag(o))return Yr(e,r,i),!1;return!0},text:function(e,t){t.value&&Mr(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Mr(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:Eo,mustUseProp:Nn,canBeLeftOpenTag:To,isReservedTag:Jn,getTagNamespace:Xn,staticKeys:function(e){return e.reduce(function(e,t){return e.concat(t.staticKeys||[])},[]).join(",")}(xa)},Sa=k(function(e){return m("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))});function Ca(e,t){e&&(Ea=Sa(t.staticKeys||""),Ta=t.isReservedTag||L,function e(t){t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||y(e.tag)||!Ta(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every(Ea)))}(t);if(1===t.type){if(!Ta(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,r=t.children.length;n<r;n++){var i=t.children[n];e(i),i.static||(t.static=!1)}if(t.ifConditions)for(var o=1,a=t.ifConditions.length;o<a;o++){var s=t.ifConditions[o].block;e(s),s.static||(t.static=!1)}}}(e),function e(t,n){if(1===t.type){if((t.static||t.once)&&(t.staticInFor=n),t.static&&t.children.length&&(1!==t.children.length||3!==t.children[0].type))return void(t.staticRoot=!0);if(t.staticRoot=!1,t.children)for(var r=0,i=t.children.length;r<i;r++)e(t.children[r],n||!!t.for);if(t.ifConditions)for(var o=1,a=t.ifConditions.length;o<a;o++)e(t.ifConditions[o].block,n)}}(e,!1))}var Ia=/^([\w$_]+|\([^)]*?\))\s*=>|^function(?:\s+[\w$]+)?\s*\(/,Oa=/\([^)]*?\);*$/,Pa=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Da={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},La={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Ma=function(e){return"if("+e+")return null;"},ja={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Ma("$event.target !== $event.currentTarget"),ctrl:Ma("!$event.ctrlKey"),shift:Ma("!$event.shiftKey"),alt:Ma("!$event.altKey"),meta:Ma("!$event.metaKey"),left:Ma("'button' in $event && $event.button !== 0"),middle:Ma("'button' in $event && $event.button !== 1"),right:Ma("'button' in $event && $event.button !== 2")};function Na(e,t){var n=t?"nativeOn:":"on:",r="",i="";for(var o in e){var a=Ra(e[o]);e[o]&&e[o].dynamic?i+=o+","+a+",":r+='"'+o+'":'+a+","}return r="{"+r.slice(0,-1)+"}",i?n+"_d("+r+",["+i.slice(0,-1)+"])":n+r}function Ra(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map(function(e){return Ra(e)}).join(",")+"]";var t=Pa.test(e.value),n=Ia.test(e.value),r=Pa.test(e.value.replace(Oa,""));if(e.modifiers){var i="",o="",a=[];for(var s in e.modifiers)if(ja[s])o+=ja[s],Da[s]&&a.push(s);else if("exact"===s){var u=e.modifiers;o+=Ma(["ctrl","shift","alt","meta"].filter(function(e){return!u[e]}).map(function(e){return"$event."+e+"Key"}).join("||"))}else a.push(s);return a.length&&(i+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Fa).join("&&")+")return null;"}(a)),o&&(i+=o),"function($event){"+i+(t?"return "+e.value+"($event)":n?"return ("+e.value+")($event)":r?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(r?"return "+e.value:e.value)+"}"}function Fa(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=Da[e],r=La[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var Ba={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:D},Ua=function(e){this.options=e,this.warn=e.warn||Dr,this.transforms=Lr(e.modules,"transformCode"),this.dataGenFns=Lr(e.modules,"genData"),this.directives=O(O({},Ba),e.directives);var t=e.isReservedTag||L;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function za(e,t){var n=new Ua(t);return{render:"with(this){return "+(e?$a(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function $a(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Va(e,t);if(e.once&&!e.onceProcessed)return Ya(e,t);if(e.for&&!e.forProcessed)return qa(e,t);if(e.if&&!e.ifProcessed)return Ha(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',r=Qa(e,t),i="_t("+n+(r?","+r:""),o=e.attrs||e.dynamicAttrs?Xa((e.attrs||[]).concat(e.dynamicAttrs||[]).map(function(e){return{name:E(e.name),value:e.value,dynamic:e.dynamic}})):null,a=e.attrsMap["v-bind"];!o&&!a||r||(i+=",null");o&&(i+=","+o);a&&(i+=(o?"":",null")+","+a);return i+")"}(e,t);var n;if(e.component)n=function(e,t,n){var r=t.inlineTemplate?null:Qa(t,n,!0);return"_c("+e+","+Wa(t,n)+(r?","+r:"")+")"}(e.component,e,t);else{var r;(!e.plain||e.pre&&t.maybeComponent(e))&&(r=Wa(e,t));var i=e.inlineTemplate?null:Qa(e,t,!0);n="_c('"+e.tag+"'"+(r?","+r:"")+(i?","+i:"")+")"}for(var o=0;o<t.transforms.length;o++)n=t.transforms[o](e,n);return n}return Qa(e,t)||"void 0"}function Va(e,t){e.staticProcessed=!0;var n=t.pre;return e.pre&&(t.pre=e.pre),t.staticRenderFns.push("with(this){return "+$a(e,t)+"}"),t.pre=n,"_m("+(t.staticRenderFns.length-1)+(e.staticInFor?",true":"")+")"}function Ya(e,t){if(e.onceProcessed=!0,e.if&&!e.ifProcessed)return Ha(e,t);if(e.staticInFor){for(var n="",r=e.parent;r;){if(r.for){n=r.key;break}r=r.parent}return n?"_o("+$a(e,t)+","+t.onceId+++","+n+")":$a(e,t)}return Va(e,t)}function Ha(e,t,n,r){return e.ifProcessed=!0,function e(t,n,r,i){if(!t.length)return i||"_e()";var o=t.shift();return o.exp?"("+o.exp+")?"+a(o.block)+":"+e(t,n,r,i):""+a(o.block);function a(e){return r?r(e,n):e.once?Ya(e,n):$a(e,n)}}(e.ifConditions.slice(),t,n,r)}function qa(e,t,n,r){var i=e.for,o=e.alias,a=e.iterator1?","+e.iterator1:"",s=e.iterator2?","+e.iterator2:"";return e.forProcessed=!0,(r||"_l")+"(("+i+"),function("+o+a+s+"){return "+(n||$a)(e,t)+"})"}function Wa(e,t){var n="{",r=function(e,t){var n=e.directives;if(!n)return;var r,i,o,a,s="directives:[",u=!1;for(r=0,i=n.length;r<i;r++){o=n[r],a=!0;var c=t.directives[o.name];c&&(a=!!c(e,o,t.warn)),a&&(u=!0,s+='{name:"'+o.name+'",rawName:"'+o.rawName+'"'+(o.value?",value:("+o.value+"),expression:"+JSON.stringify(o.value):"")+(o.arg?",arg:"+(o.isDynamicArg?o.arg:'"'+o.arg+'"'):"")+(o.modifiers?",modifiers:"+JSON.stringify(o.modifiers):"")+"},")}if(u)return s.slice(0,-1)+"]"}(e,t);r&&(n+=r+","),e.key&&(n+="key:"+e.key+","),e.ref&&(n+="ref:"+e.ref+","),e.refInFor&&(n+="refInFor:true,"),e.pre&&(n+="pre:true,"),e.component&&(n+='tag:"'+e.tag+'",');for(var i=0;i<t.dataGenFns.length;i++)n+=t.dataGenFns[i](e);if(e.attrs&&(n+="attrs:"+Xa(e.attrs)+","),e.props&&(n+="domProps:"+Xa(e.props)+","),e.events&&(n+=Na(e.events,!1)+","),e.nativeEvents&&(n+=Na(e.nativeEvents,!0)+","),e.slotTarget&&!e.slotScope&&(n+="slot:"+e.slotTarget+","),e.scopedSlots&&(n+=function(e,t,n){var r=e.for||Object.keys(t).some(function(e){var n=t[e];return n.slotTargetDynamic||n.if||n.for||Ga(n)}),i=!!e.if;if(!r)for(var o=e.parent;o;){if(o.slotScope&&o.slotScope!==ha||o.for){r=!0;break}o.if&&(i=!0),o=o.parent}var a=Object.keys(t).map(function(e){return Ka(t[e],n)}).join(",");return"scopedSlots:_u(["+a+"]"+(r?",null,true":"")+(!r&&i?",null,false,"+function(e){var t=5381,n=e.length;for(;n;)t=33*t^e.charCodeAt(--n);return t>>>0}(a):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var o=function(e,t){var n=e.children[0];0;if(n&&1===n.type){var r=za(n,t.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map(function(e){return"function(){"+e+"}"}).join(",")+"]}"}}(e,t);o&&(n+=o+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+Xa(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Ga(e){return 1===e.type&&("slot"===e.tag||e.children.some(Ga))}function Ka(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return Ha(e,t,Ka,"null");if(e.for&&!e.forProcessed)return qa(e,t,Ka);var r=e.slotScope===ha?"":String(e.slotScope),i="function("+r+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(Qa(e,t)||"undefined")+":undefined":Qa(e,t)||"undefined":$a(e,t))+"}",o=r?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+i+o+"}"}function Qa(e,t,n,r,i){var o=e.children;if(o.length){var a=o[0];if(1===o.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var s=n?t.maybeComponent(a)?",1":",0":"";return""+(r||$a)(a,t)+s}var u=n?function(e,t){for(var n=0,r=0;r<e.length;r++){var i=e[r];if(1===i.type){if(Za(i)||i.ifConditions&&i.ifConditions.some(function(e){return Za(e.block)})){n=2;break}(t(i)||i.ifConditions&&i.ifConditions.some(function(e){return t(e.block)}))&&(n=1)}}return n}(o,t.maybeComponent):0,c=i||Ja;return"["+o.map(function(e){return c(e,t)}).join(",")+"]"+(u?","+u:"")}}function Za(e){return void 0!==e.for||"template"===e.tag||"slot"===e.tag}function Ja(e,t){return 1===e.type?$a(e,t):3===e.type&&e.isComment?(r=e,"_e("+JSON.stringify(r.text)+")"):"_v("+(2===(n=e).type?n.expression:es(JSON.stringify(n.text)))+")";var n,r}function Xa(e){for(var t="",n="",r=0;r<e.length;r++){var i=e[r],o=es(i.value);i.dynamic?n+=i.name+","+o+",":t+='"'+i.name+'":'+o+","}return t="{"+t.slice(0,-1)+"}",n?"_d("+t+",["+n.slice(0,-1)+"])":t}function es(e){return e.replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments".split(",").join("\\b|\\b")+"\\b"),new RegExp("\\b"+"delete,typeof,void".split(",").join("\\s*\\([^\\)]*\\)|\\b")+"\\s*\\([^\\)]*\\)");function ts(e,t){try{return new Function(e)}catch(n){return t.push({err:n,code:e}),D}}var ns,rs,is=(ns=function(e,t){var n=pa(e.trim(),t);!1!==t.optimize&&Ca(n,t);var r=za(n,t);return{ast:n,render:r.render,staticRenderFns:r.staticRenderFns}},function(e){function t(t,n){var r=Object.create(e),i=[],o=[];if(n)for(var a in n.modules&&(r.modules=(e.modules||[]).concat(n.modules)),n.directives&&(r.directives=O(Object.create(e.directives||null),n.directives)),n)"modules"!==a&&"directives"!==a&&(r[a]=n[a]);r.warn=function(e,t,n){(n?o:i).push(e)};var s=ns(t.trim(),r);return s.errors=i,s.tips=o,s}return{compile:t,compileToFunctions:function(e){var t=Object.create(null);return function(n,r,i){(r=O({},r)).warn,delete r.warn;var o=r.delimiters?String(r.delimiters)+n:n;if(t[o])return t[o];var a=e(n,r),s={},u=[];return s.render=ts(a.render,u),s.staticRenderFns=a.staticRenderFns.map(function(e){return ts(e,u)}),t[o]=s}}(t)}})(Aa),os=(is.compile,is.compileToFunctions);function as(e){return(rs=rs||document.createElement("div")).innerHTML=e?'<a href="\n"/>':'<div a="\n"/>',rs.innerHTML.indexOf("&#10;")>0}var ss=!!W&&as(!1),us=!!W&&as(!0),cs=k(function(e){var t=nr(e);return t&&t.innerHTML}),ls=An.prototype.$mount;An.prototype.$mount=function(e,t){if((e=e&&nr(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=cs(r));else{if(!r.nodeType)return this;r=r.innerHTML}else e&&(r=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(r){0;var i=os(r,{outputSourceRange:!1,shouldDecodeNewlines:ss,shouldDecodeNewlinesForHref:us,delimiters:n.delimiters,comments:n.comments},this),o=i.render,a=i.staticRenderFns;n.render=o,n.staticRenderFns=a}}return ls.call(this,e,t)},An.compile=os,t.a=An}).call(this,n(42),n(402).setImmediate)},function(e,t,n){(function(t,n){var r;r=function(){"use strict";function e(e){return"function"==typeof e}var r=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},i=0,o=void 0,a=void 0,s=function(e,t){p[i]=e,p[i+1]=t,2===(i+=2)&&(a?a(v):w())};var u="undefined"!=typeof window?window:void 0,c=u||{},l=c.MutationObserver||c.WebKitMutationObserver,f="undefined"==typeof self&&void 0!==t&&"[object process]"==={}.toString.call(t),h="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function d(){var e=setTimeout;return function(){return e(v,1)}}var p=new Array(1e3);function v(){for(var e=0;e<i;e+=2){(0,p[e])(p[e+1]),p[e]=void 0,p[e+1]=void 0}i=0}var m,y,g,b,w=void 0;function _(e,t){var n=this,r=new this.constructor(E);void 0===r[x]&&B(r);var i=n._state;if(i){var o=arguments[i-1];s(function(){return R(i,r,o,n._result)})}else j(n,r,e,t);return r}function k(e){if(e&&"object"==typeof e&&e.constructor===this)return e;var t=new this(E);return P(t,e),t}f?w=function(){return t.nextTick(v)}:l?(y=0,g=new l(v),b=document.createTextNode(""),g.observe(b,{characterData:!0}),w=function(){b.data=y=++y%2}):h?((m=new MessageChannel).port1.onmessage=v,w=function(){return m.port2.postMessage(0)}):w=void 0===u?function(){try{var e=Function("return this")().require("vertx");return void 0!==(o=e.runOnLoop||e.runOnContext)?function(){o(v)}:d()}catch(e){return d()}}():d();var x=Math.random().toString(36).substring(2);function E(){}var T=void 0,A=1,S=2,C={error:null};function I(e){try{return e.then}catch(e){return C.error=e,C}}function O(t,n,r){n.constructor===t.constructor&&r===_&&n.constructor.resolve===k?function(e,t){t._state===A?L(e,t._result):t._state===S?M(e,t._result):j(t,void 0,function(t){return P(e,t)},function(t){return M(e,t)})}(t,n):r===C?(M(t,C.error),C.error=null):void 0===r?L(t,n):e(r)?function(e,t,n){s(function(e){var r=!1,i=function(e,t,n,r){try{e.call(t,n,r)}catch(e){return e}}(n,t,function(n){r||(r=!0,t!==n?P(e,n):L(e,n))},function(t){r||(r=!0,M(e,t))},e._label);!r&&i&&(r=!0,M(e,i))},e)}(t,n,r):L(t,n)}function P(e,t){var n,r;e===t?M(e,new TypeError("You cannot resolve a promise with itself")):(r=typeof(n=t),null===n||"object"!==r&&"function"!==r?L(e,t):O(e,t,I(t)))}function D(e){e._onerror&&e._onerror(e._result),N(e)}function L(e,t){e._state===T&&(e._result=t,e._state=A,0!==e._subscribers.length&&s(N,e))}function M(e,t){e._state===T&&(e._state=S,e._result=t,s(D,e))}function j(e,t,n,r){var i=e._subscribers,o=i.length;e._onerror=null,i[o]=t,i[o+A]=n,i[o+S]=r,0===o&&e._state&&s(N,e)}function N(e){var t=e._subscribers,n=e._state;if(0!==t.length){for(var r=void 0,i=void 0,o=e._result,a=0;a<t.length;a+=3)r=t[a],i=t[a+n],r?R(n,r,i,o):i(o);e._subscribers.length=0}}function R(t,n,r,i){var o=e(r),a=void 0,s=void 0,u=void 0,c=void 0;if(o){if((a=function(e,t){try{return e(t)}catch(e){return C.error=e,C}}(r,i))===C?(c=!0,s=a.error,a.error=null):u=!0,n===a)return void M(n,new TypeError("A promises callback cannot return that same promise."))}else a=i,u=!0;n._state!==T||(o&&u?P(n,a):c?M(n,s):t===A?L(n,a):t===S&&M(n,a))}var F=0;function B(e){e[x]=F++,e._state=void 0,e._result=void 0,e._subscribers=[]}var U=function(){function e(e,t){this._instanceConstructor=e,this.promise=new e(E),this.promise[x]||B(this.promise),r(t)?(this.length=t.length,this._remaining=t.length,this._result=new Array(this.length),0===this.length?L(this.promise,this._result):(this.length=this.length||0,this._enumerate(t),0===this._remaining&&L(this.promise,this._result))):M(this.promise,new Error("Array Methods must be provided an Array"))}return e.prototype._enumerate=function(e){for(var t=0;this._state===T&&t<e.length;t++)this._eachEntry(e[t],t)},e.prototype._eachEntry=function(e,t){var n=this._instanceConstructor,r=n.resolve;if(r===k){var i=I(e);if(i===_&&e._state!==T)this._settledAt(e._state,t,e._result);else if("function"!=typeof i)this._remaining--,this._result[t]=e;else if(n===z){var o=new n(E);O(o,e,i),this._willSettleAt(o,t)}else this._willSettleAt(new n(function(t){return t(e)}),t)}else this._willSettleAt(r(e),t)},e.prototype._settledAt=function(e,t,n){var r=this.promise;r._state===T&&(this._remaining--,e===S?M(r,n):this._result[t]=n),0===this._remaining&&L(r,this._result)},e.prototype._willSettleAt=function(e,t){var n=this;j(e,void 0,function(e){return n._settledAt(A,t,e)},function(e){return n._settledAt(S,t,e)})},e}();var z=function(){function t(e){this[x]=F++,this._result=this._state=void 0,this._subscribers=[],E!==e&&("function"!=typeof e&&function(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}(),this instanceof t?function(e,t){try{t(function(t){P(e,t)},function(t){M(e,t)})}catch(t){M(e,t)}}(this,e):function(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}())}return t.prototype.catch=function(e){return this.then(null,e)},t.prototype.finally=function(t){var n=this.constructor;return e(t)?this.then(function(e){return n.resolve(t()).then(function(){return e})},function(e){return n.resolve(t()).then(function(){throw e})}):this.then(t,t)},t}();return z.prototype.then=_,z.all=function(e){return new U(this,e).promise},z.race=function(e){var t=this;return r(e)?new t(function(n,r){for(var i=e.length,o=0;o<i;o++)t.resolve(e[o]).then(n,r)}):new t(function(e,t){return t(new TypeError("You must pass an array to race."))})},z.resolve=k,z.reject=function(e){var t=new this(E);return M(t,e),t},z._setScheduler=function(e){a=e},z._setAsap=function(e){s=e},z._asap=s,z.polyfill=function(){var e=void 0;if(void 0!==n)e=n;else if("undefined"!=typeof self)e=self;else try{e=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var t=e.Promise;if(t){var r=null;try{r=Object.prototype.toString.call(t.resolve())}catch(e){}if("[object Promise]"===r&&!t.cast)return}e.Promise=z},z.Promise=z,z},e.exports=r()}).call(this,n(127),n(42))},function(e,t,n){var r=n(283);e.exports=function(e,t){var n=-1,i=e.length,o=i-1;for(t=void 0===t?i:t;++n<t;){var a=r(n,o),s=e[a];e[a]=e[n],e[n]=s}return e.length=t,e}},function(e,t,n){var r,i;!function(o,a){"use strict";"object"==typeof e&&e.exports?e.exports=a():void 0===(i="function"==typeof(r=a)?r.call(t,n,t,e):r)||(e.exports=i)}(0,function(e){"use strict";var t=e&&e.SecondLevelDomains,n={list:{ac:" com gov mil net org ",ae:" ac co gov mil name net org pro sch ",af:" com edu gov net org ",al:" com edu gov mil net org ",ao:" co ed gv it og pb ",ar:" com edu gob gov int mil net org tur ",at:" ac co gv or ",au:" asn com csiro edu gov id net org ",ba:" co com edu gov mil net org rs unbi unmo unsa untz unze ",bb:" biz co com edu gov info net org store tv ",bh:" biz cc com edu gov info net org ",bn:" com edu gov net org ",bo:" com edu gob gov int mil net org tv ",br:" adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ",bs:" com edu gov net org ",bz:" du et om ov rg ",ca:" ab bc mb nb nf nl ns nt nu on pe qc sk yk ",ck:" biz co edu gen gov info net org ",cn:" ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ",co:" com edu gov mil net nom org ",cr:" ac c co ed fi go or sa ",cy:" ac biz com ekloges gov ltd name net org parliament press pro tm ",do:" art com edu gob gov mil net org sld web ",dz:" art asso com edu gov net org pol ",ec:" com edu fin gov info med mil net org pro ",eg:" com edu eun gov mil name net org sci ",er:" com edu gov ind mil net org rochest w ",es:" com edu gob nom org ",et:" biz com edu gov info name net org ",fj:" ac biz com info mil name net org pro ",fk:" ac co gov net nom org ",fr:" asso com f gouv nom prd presse tm ",gg:" co net org ",gh:" com edu gov mil org ",gn:" ac com gov net org ",gr:" com edu gov mil net org ",gt:" com edu gob ind mil net org ",gu:" com edu gov net org ",hk:" com edu gov idv net org ",hu:" 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ",id:" ac co go mil net or sch web ",il:" ac co gov idf k12 muni net org ",in:" ac co edu ernet firm gen gov i ind mil net nic org res ",iq:" com edu gov i mil net org ",ir:" ac co dnssec gov i id net org sch ",it:" edu gov ",je:" co net org ",jo:" com edu gov mil name net org sch ",jp:" ac ad co ed go gr lg ne or ",ke:" ac co go info me mobi ne or sc ",kh:" com edu gov mil net org per ",ki:" biz com de edu gov info mob net org tel ",km:" asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ",kn:" edu gov net org ",kr:" ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ",kw:" com edu gov net org ",ky:" com edu gov net org ",kz:" com edu gov mil net org ",lb:" com edu gov net org ",lk:" assn com edu gov grp hotel int ltd net ngo org sch soc web ",lr:" com edu gov net org ",lv:" asn com conf edu gov id mil net org ",ly:" com edu gov id med net org plc sch ",ma:" ac co gov m net org press ",mc:" asso tm ",me:" ac co edu gov its net org priv ",mg:" com edu gov mil nom org prd tm ",mk:" com edu gov inf name net org pro ",ml:" com edu gov net org presse ",mn:" edu gov org ",mo:" com edu gov net org ",mt:" com edu gov net org ",mv:" aero biz com coop edu gov info int mil museum name net org pro ",mw:" ac co com coop edu gov int museum net org ",mx:" com edu gob net org ",my:" com edu gov mil name net org sch ",nf:" arts com firm info net other per rec store web ",ng:" biz com edu gov mil mobi name net org sch ",ni:" ac co com edu gob mil net nom org ",np:" com edu gov mil net org ",nr:" biz com edu gov info net org ",om:" ac biz co com edu gov med mil museum net org pro sch ",pe:" com edu gob mil net nom org sld ",ph:" com edu gov i mil net ngo org ",pk:" biz com edu fam gob gok gon gop gos gov net org web ",pl:" art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ",pr:" ac biz com edu est gov info isla name net org pro prof ",ps:" com edu gov net org plo sec ",pw:" belau co ed go ne or ",ro:" arts com firm info nom nt org rec store tm www ",rs:" ac co edu gov in org ",sb:" com edu gov net org ",sc:" com edu gov net org ",sh:" co com edu gov net nom org ",sl:" com edu gov net org ",st:" co com consulado edu embaixada gov mil net org principe saotome store ",sv:" com edu gob org red ",sz:" ac co org ",tr:" av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ",tt:" aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ",tw:" club com ebiz edu game gov idv mil net org ",mu:" ac co com gov net or org ",mz:" ac co edu gov org ",na:" co com ",nz:" ac co cri geek gen govt health iwi maori mil net org parliament school ",pa:" abo ac com edu gob ing med net nom org sld ",pt:" com edu gov int net nome org publ ",py:" com edu gov mil net org ",qa:" com edu gov mil net org ",re:" asso com nom ",ru:" ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ",rw:" ac co com edu gouv gov int mil net ",sa:" com edu gov med net org pub sch ",sd:" com edu gov info med net org tv ",se:" a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ",sg:" com edu gov idn net org per ",sn:" art com edu gouv org perso univ ",sy:" com edu gov mil net news org ",th:" ac co go in mi net or ",tj:" ac biz co com edu go gov info int mil name net nic org test web ",tn:" agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ",tz:" ac co go ne or ",ua:" biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ",ug:" ac co go ne or org sc ",uk:" ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ",us:" dni fed isa kids nsn ",uy:" com edu gub mil net org ",ve:" co com edu gob info mil net org web ",vi:" co com k12 net org ",vn:" ac biz com edu gov health info int name net org pro ",ye:" co com gov ltd me net org plc ",yu:" ac co edu gov org ",za:" ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ",zm:" ac co com edu gov net org sch ",com:"ar br cn de eu gb gr hu jpn kr no qc ru sa se uk us uy za ",net:"gb jp se uk ",org:"ae",de:"com "},has:function(e){var t=e.lastIndexOf(".");if(t<=0||t>=e.length-1)return!1;var r=e.lastIndexOf(".",t-1);if(r<=0||r>=t-1)return!1;var i=n.list[e.slice(t+1)];return!!i&&i.indexOf(" "+e.slice(r+1,t)+" ")>=0},is:function(e){var t=e.lastIndexOf(".");if(t<=0||t>=e.length-1)return!1;if(e.lastIndexOf(".",t-1)>=0)return!1;var r=n.list[e.slice(t+1)];return!!r&&r.indexOf(" "+e.slice(0,t)+" ")>=0},get:function(e){var t=e.lastIndexOf(".");if(t<=0||t>=e.length-1)return null;var r=e.lastIndexOf(".",t-1);if(r<=0||r>=t-1)return null;var i=n.list[e.slice(t+1)];return i?i.indexOf(" "+e.slice(r+1,t)+" ")<0?null:e.slice(r+1):null},noConflict:function(){return e.SecondLevelDomains===this&&(e.SecondLevelDomains=t),this}};return n})},function(e,t,n){var r,i;!function(o,a){"use strict";"object"==typeof e&&e.exports?e.exports=a():void 0===(i="function"==typeof(r=a)?r.call(t,n,t,e):r)||(e.exports=i)}(0,function(e){"use strict";var t=e&&e.IPv6;return{best:function(e){var t,n,r=e.toLowerCase().split(":"),i=r.length,o=8;for(""===r[0]&&""===r[1]&&""===r[2]?(r.shift(),r.shift()):""===r[0]&&""===r[1]?r.shift():""===r[i-1]&&""===r[i-2]&&r.pop(),-1!==r[(i=r.length)-1].indexOf(".")&&(o=7),t=0;t<i&&""!==r[t];t++);if(t<o)for(r.splice(t,1,"0000");r.length<o;)r.splice(t,0,"0000");for(var a=0;a<o;a++){n=r[a].split("");for(var s=0;s<3&&"0"===n[0]&&n.length>1;s++)n.splice(0,1);r[a]=n.join("")}var u=-1,c=0,l=0,f=-1,h=!1;for(a=0;a<o;a++)h?"0"===r[a]?l+=1:(h=!1,l>c&&(u=f,c=l)):"0"===r[a]&&(h=!0,f=a,l=1);l>c&&(u=f,c=l),c>1&&r.splice(u,c,""),i=r.length;var d="";for(""===r[0]&&(d=":"),a=0;a<i&&(d+=r[a],a!==i-1);a++)d+=":";return""===r[i-1]&&(d+=":"),d},noConflict:function(){return e.IPv6===this&&(e.IPv6=t),this}}})},function(e,t,n){(function(e,r){var i;!function(o){"object"==typeof t&&t&&t.nodeType,"object"==typeof e&&e&&e.nodeType;var a="object"==typeof r&&r;a.global!==a&&a.window!==a&&a.self;var s,u=2147483647,c=36,l=1,f=26,h=38,d=700,p=72,v=128,m="-",y=/^xn--/,g=/[^\x20-\x7E]/,b=/[\x2E\u3002\uFF0E\uFF61]/g,w={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},_=c-l,k=Math.floor,x=String.fromCharCode;function E(e){throw new RangeError(w[e])}function T(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}function A(e,t){var n=e.split("@"),r="";return n.length>1&&(r=n[0]+"@",e=n[1]),r+T((e=e.replace(b,".")).split("."),t).join(".")}function S(e){for(var t,n,r=[],i=0,o=e.length;i<o;)(t=e.charCodeAt(i++))>=55296&&t<=56319&&i<o?56320==(64512&(n=e.charCodeAt(i++)))?r.push(((1023&t)<<10)+(1023&n)+65536):(r.push(t),i--):r.push(t);return r}function C(e){return T(e,function(e){var t="";return e>65535&&(t+=x((e-=65536)>>>10&1023|55296),e=56320|1023&e),t+=x(e)}).join("")}function I(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function O(e,t,n){var r=0;for(e=n?k(e/d):e>>1,e+=k(e/t);e>_*f>>1;r+=c)e=k(e/_);return k(r+(_+1)*e/(e+h))}function P(e){var t,n,r,i,o,a,s,h,d,y,g,b=[],w=e.length,_=0,x=v,T=p;for((n=e.lastIndexOf(m))<0&&(n=0),r=0;r<n;++r)e.charCodeAt(r)>=128&&E("not-basic"),b.push(e.charCodeAt(r));for(i=n>0?n+1:0;i<w;){for(o=_,a=1,s=c;i>=w&&E("invalid-input"),((h=(g=e.charCodeAt(i++))-48<10?g-22:g-65<26?g-65:g-97<26?g-97:c)>=c||h>k((u-_)/a))&&E("overflow"),_+=h*a,!(h<(d=s<=T?l:s>=T+f?f:s-T));s+=c)a>k(u/(y=c-d))&&E("overflow"),a*=y;T=O(_-o,t=b.length+1,0==o),k(_/t)>u-x&&E("overflow"),x+=k(_/t),_%=t,b.splice(_++,0,x)}return C(b)}function D(e){var t,n,r,i,o,a,s,h,d,y,g,b,w,_,T,A=[];for(b=(e=S(e)).length,t=v,n=0,o=p,a=0;a<b;++a)(g=e[a])<128&&A.push(x(g));for(r=i=A.length,i&&A.push(m);r<b;){for(s=u,a=0;a<b;++a)(g=e[a])>=t&&g<s&&(s=g);for(s-t>k((u-n)/(w=r+1))&&E("overflow"),n+=(s-t)*w,t=s,a=0;a<b;++a)if((g=e[a])<t&&++n>u&&E("overflow"),g==t){for(h=n,d=c;!(h<(y=d<=o?l:d>=o+f?f:d-o));d+=c)T=h-y,_=c-y,A.push(x(I(y+T%_,0))),h=k(T/_);A.push(x(I(h,0))),o=O(n,w,r==i),n=0,++r}++n,++t}return A.join("")}s={version:"1.3.2",ucs2:{decode:S,encode:C},decode:P,encode:D,toASCII:function(e){return A(e,function(e){return g.test(e)?"xn--"+D(e):e})},toUnicode:function(e){return A(e,function(e){return y.test(e)?P(e.slice(4).toLowerCase()):e})}},void 0===(i=function(){return s}.call(t,n,t,e))||(e.exports=i)}()}).call(this,n(68)(e),n(42))},function(e,t,n){var r=n(99),i=n(78),o=Object.prototype.hasOwnProperty;e.exports=function(e,t,n){var a=e[t];o.call(e,t)&&i(a,n)&&(void 0!==n||t in e)||r(e,t,n)}},function(e,t){e.exports=function(e,t){return"__proto__"==t?void 0:e[t]}},function(e,t,n){var r=n(43),i=n(179),o=n(39),a="[object Object]",s=Function.prototype,u=Object.prototype,c=s.toString,l=u.hasOwnProperty,f=c.call(Object);e.exports=function(e){if(!o(e)||r(e)!=a)return!1;var t=i(e);if(null===t)return!0;var n=l.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&c.call(n)==f}},function(e,t,n){var r=n(193)(Object.getPrototypeOf,Object);e.exports=r},function(e,t){e.exports=function(e,t){var n=-1,r=e.length;for(t||(t=Array(r));++n<r;)t[n]=e[n];return t}},function(e,t,n){var r=n(99),i=n(78);e.exports=function(e,t,n){(void 0===n||i(e[t],n))&&(void 0!==n||t in e)||r(e,t,n)}},function(e,t,n){var r=n(78),i=n(59),o=n(106),a=n(4);e.exports=function(e,t,n){if(!a(n))return!1;var s=typeof t;return!!("number"==s?i(n)&&o(t,n.length):"string"==s&&t in n)&&r(n[t],e)}},function(e,t,n){var r=n(60),i=function(){try{var e=r(Object,"defineProperty");return e({},"",{}),e}catch(e){}}();e.exports=i},function(e,t,n){var r=n(330),i=n(328)(r);e.exports=i},function(e,t,n){var r=n(331),i=Math.max;e.exports=function(e,t,n){return t=i(void 0===t?e.length-1:t,0),function(){for(var o=arguments,a=-1,s=i(o.length-t,0),u=Array(s);++a<s;)u[a]=o[t+a];a=-1;for(var c=Array(t+1);++a<t;)c[a]=o[a];return c[t]=n(u),r(e,this,c)}}},function(e,t,n){var r=n(336)();e.exports=r},function(e,t,n){var r=n(337),i=n(335)(r);e.exports=i},function(e,t){e.exports=function(e){return function(t){return null==t?void 0:t[e]}}},function(e,t,n){var r=n(103),i=n(79),o=n(13),a=n(106),s=n(139),u=n(77);e.exports=function(e,t,n){for(var c=-1,l=(t=r(t,e)).length,f=!1;++c<l;){var h=u(t[c]);if(!(f=null!=e&&n(e,h)))break;e=e[h]}return f||++c!=l?f:!!(l=null==e?0:e.length)&&s(l)&&a(h,l)&&(o(e)||i(e))}},function(e,t,n){var r=n(341),i=n(189);e.exports=function(e,t){return null!=e&&i(e,t,r)}},function(e,t){e.exports=function(e,t){return function(n){return null!=n&&n[e]===t&&(void 0!==t||e in Object(n))}}},function(e,t,n){var r=n(4);e.exports=function(e){return e==e&&!r(e)}},function(e,t){e.exports=function(e,t){return function(n){return e(t(n))}}},function(e,t,n){var r=n(104),i=n(353),o=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return i(e);var t=[];for(var n in Object(e))o.call(e,n)&&"constructor"!=n&&t.push(n);return t}},function(e,t){e.exports=function(e,t){for(var n=-1,r=Array(e);++n<e;)r[n]=t(n);return r}},function(e,t,n){var r=n(195),i=n(79),o=n(13),a=n(107),s=n(106),u=n(105),c=Object.prototype.hasOwnProperty;e.exports=function(e,t){var n=o(e),l=!n&&i(e),f=!n&&!l&&a(e),h=!n&&!l&&!f&&u(e),d=n||l||f||h,p=d?r(e.length,String):[],v=p.length;for(var m in e)!t&&!c.call(e,m)||d&&("length"==m||f&&("offset"==m||"parent"==m)||h&&("buffer"==m||"byteLength"==m||"byteOffset"==m)||s(m,v))||p.push(m);return p}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,i=0,o=[];++n<r;){var a=e[n];t(a,n,e)&&(o[i++]=a)}return o}},function(e,t){e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach(function(e,r){n[++t]=[r,e]}),n}},function(e,t,n){var r=n(44).Uint8Array;e.exports=r},function(e,t){e.exports=function(e,t){return e.has(t)}},function(e,t,n){var r=n(141),i=n(366),o=n(365);function a(e){var t=-1,n=null==e?0:e.length;for(this.__data__=new r;++t<n;)this.add(e[t])}a.prototype.add=a.prototype.push=i,a.prototype.has=o,e.exports=a},function(e,t,n){var r=n(201),i=n(364),o=n(200),a=1,s=2;e.exports=function(e,t,n,u,c,l){var f=n&a,h=e.length,d=t.length;if(h!=d&&!(f&&d>h))return!1;var p=l.get(e);if(p&&l.get(t))return p==t;var v=-1,m=!0,y=n&s?new r:void 0;for(l.set(e,t),l.set(t,e);++v<h;){var g=e[v],b=t[v];if(u)var w=f?u(b,g,v,t,e,l):u(g,b,v,e,t,l);if(void 0!==w){if(w)continue;m=!1;break}if(y){if(!i(t,function(e,t){if(!o(y,t)&&(g===e||c(g,e,n,u,l)))return y.push(t)})){m=!1;break}}else if(g!==b&&!c(g,b,n,u,l)){m=!1;break}}return l.delete(e),l.delete(t),m}},function(e,t){var n=Function.prototype.toString;e.exports=function(e){if(null!=e){try{return n.call(e)}catch(e){}try{return e+""}catch(e){}}return""}},function(e,t,n){(function(t){var n="object"==typeof t&&t&&t.Object===Object&&t;e.exports=n}).call(this,n(42))},function(e,t){e.exports=function(e,t){for(var n=-1,r=t.length,i=e.length;++n<r;)e[i+n]=t[n];return e}},function(e,t,n){"use strict";n.d(t,"a",function(){return s});var r=n(113),i=Object(r.g)(),o="Sentry Logger ",a=function(){function e(){this._enabled=!1}return e.prototype.disable=function(){this._enabled=!1},e.prototype.enable=function(){this._enabled=!0},e.prototype.log=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._enabled&&Object(r.c)(function(){i.console.log(o+"[Log]: "+e.join(" "))})},e.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._enabled&&Object(r.c)(function(){i.console.warn(o+"[Warn]: "+e.join(" "))})},e.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._enabled&&Object(r.c)(function(){i.console.error(o+"[Error]: "+e.join(" "))})},e}();i.__SENTRY__=i.__SENTRY__||{};var s=i.__SENTRY__.logger||(i.__SENTRY__.logger=new a)},function(e,t,n){var r=n(437);e.exports=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(r)},function(e,t,n){var r=n(18),i=n(152),o=n(31);e.exports=function(e,t,n,a){var s,u,c=String(o(e)),l=c.length,f=void 0===n?" ":String(n),h=r(t);return h<=l||""==f?c:(s=h-l,(u=i.call(f,Math.ceil(s/f.length))).length>s&&(u=u.slice(0,s)),a?u+c:c+u)}},function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},function(e,t,n){var r=n(73),i=n(35),o=n(92).f;e.exports=function(e,t){for(var n,a=i(e),s=r(a),u=s.length,c=0,l=[];u>c;)o.call(a,n=s[c++])&&l.push(t?[n,a[n]]:a[n]);return l}},function(e,t,n){var r=n(35),i=n(122).f,o={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return a&&"[object Window]"==o.call(e)?function(e){try{return i(e)}catch(e){return a.slice()}}(e):i(r(e))}},function(e,t,n){t.f=n(20)},function(e,t,n){var r=n(65);e.exports=function(e){if("number"!=typeof e&&"Number"!=r(e))throw TypeError("Incorrect invocation");return+e}},function(e,t,n){var r=n(21).parseInt,i=n(71),o=n(119),a=/^[-+]?0[xX]/,s=8!==r(o+"08")||22!==r(o+"0x16");e.exports=s?function(e,t){var n=i(String(e),3);return r(n,t>>>0||(a.test(n)?16:10))}:r},function(e,t,n){var r=n(23),i=Math.floor;e.exports=function(e){return!r(e)&&isFinite(e)&&i(e)===e}},function(e,t,n){"use strict";var r=n(9),i=n(15);e.exports=function(){for(var e=r(this),t=i(e.delete),n=!0,o=0,a=arguments.length;o<a;o++)n=n&&t.call(e,arguments[o]);return!!n}},function(e,t,n){"use strict";e.exports=function(){for(var e=arguments.length,t=new Array(e);e--;)t[e]=arguments[e];return new this(t)}},function(e,t,n){"use strict";var r=n(15),i=n(27),o=n(30);e.exports=function(e){var t,n,a,s,u=arguments[1];return r(this),(t=void 0!==u)&&r(u),void 0==e?new this:(n=[],t?(a=0,s=i(u,arguments[2],2),o(e,function(e){n.push(s(e,a++))})):o(e,n.push,n),new this(n))}},function(e,t,n){var r=n(536),i=n(226),o=n(21),a=n(41),s=n(20),u=s("iterator"),c=s("toStringTag"),l=i.values;for(var f in r){var h=o[f],d=h&&h.prototype;if(d){if(d[u]!==l)try{a(d,u,l)}catch(e){d[u]=l}if(d[c]||a(d,c,f),r[f])for(var p in i)if(d[p]!==i[p])try{a(d,p,i[p])}catch(e){d[p]=i[p]}}}},function(e,t,n){"use strict";var r=n(29).f,i=n(74),o=n(538),a=n(27),s=n(222),u=n(30),c=n(161),l=n(224),f=n(24),h=n(86).fastKey,d=n(76),p=d.set,v=d.getterFor;e.exports={getConstructor:function(e,t,n,c){var l=e(function(e,r){s(e,l,t),p(e,{type:t,index:i(null),first:void 0,last:void 0,size:0}),f||(e.size=0),void 0!=r&&u(r,e[c],e,n)}),d=v(t),m=function(e,t,n){var r,i,o=d(e),a=y(e,t);return a?a.value=n:(o.last=a={index:i=h(t,!0),key:t,value:n,previous:r=o.last,next:void 0,removed:!1},o.first||(o.first=a),r&&(r.next=a),f?o.size++:e.size++,"F"!==i&&(o.index[i]=a)),e},y=function(e,t){var n,r=d(e),i=h(t);if("F"!==i)return r.index[i];for(n=r.first;n;n=n.next)if(n.key==t)return n};return o(l.prototype,{clear:function(){for(var e=d(this),t=e.index,n=e.first;n;)n.removed=!0,n.previous&&(n.previous=n.previous.next=void 0),delete t[n.index],n=n.next;e.first=e.last=void 0,f?e.size=0:this.size=0},delete:function(e){var t=d(this),n=y(this,e);if(n){var r=n.next,i=n.previous;delete t.index[n.index],n.removed=!0,i&&(i.next=r),r&&(r.previous=i),t.first==n&&(t.first=r),t.last==n&&(t.last=i),f?t.size--:this.size--}return!!n},forEach:function(e){for(var t,n=d(this),r=a(e,arguments.length>1?arguments[1]:void 0,3);t=t?t.next:n.first;)for(r(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!y(this,e)}}),o(l.prototype,n?{get:function(e){var t=y(this,e);return t&&t.value},set:function(e,t){return m(this,0===e?0:e,t)}}:{add:function(e){return m(this,e=0===e?0:e,e)}}),f&&r(l.prototype,"size",{get:function(){return d(this).size}}),l},setStrong:function(e,t,n){var r=t+" Iterator",i=v(t),o=v(r);c(e,t,function(e,t){p(this,{type:r,target:e,state:i(e),kind:t,last:void 0})},function(){for(var e=o(this),t=e.kind,n=e.last;n&&n.removed;)n=n.previous;return e.target&&(e.last=n=n?n.next:e.state.first)?"keys"==t?{value:n.key,done:!1}:"values"==t?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})},n?"entries":"values",!n,!0),l(t)}}},function(e,t,n){var r=n(23),i=n(157);e.exports=function(e,t,n){var o,a=t.constructor;return a!==n&&"function"==typeof a&&(o=a.prototype)!==n.prototype&&r(o)&&i&&i(e,o),e}},function(e,t){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e}},function(e,t,n){"use strict";var r=n(21),i=n(158),o=n(3),a=n(54),s=n(86),u=n(30),c=n(222),l=n(23),f=n(14),h=n(230),d=n(72),p=n(221);e.exports=function(e,t,n,v,m){var y=r[e],g=y&&y.prototype,b=y,w=v?"set":"add",_={},k=function(e){var t=g[e];a(g,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(m&&!l(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return m&&!l(e)?void 0:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(m&&!l(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(i(e,"function"!=typeof y||!(m||g.forEach&&!f(function(){(new y).entries().next()}))))b=n.getConstructor(t,e,v,w),s.REQUIRED=!0;else if(i(e,!0)){var x=new b,E=x[w](m?{}:-0,1)!=x,T=f(function(){x.has(1)}),A=h(function(e){new y(e)}),S=!m&&f(function(){for(var e=new y,t=5;t--;)e[w](t,t);return!e.has(-0)});A||((b=t(function(t,n){c(t,b,e);var r=p(new y,t,b);return void 0!=n&&u(n,r[w],r,v),r})).prototype=g,g.constructor=b),(T||S)&&(k("delete"),k("has"),v&&k("get")),(S||E)&&k(w),m&&g.clear&&delete g.clear}return _[e]=b,o({global:!0,forced:b!=y},_),d(b,e),m||n.setStrong(b,e,v),b}},function(e,t,n){"use strict";var r=n(40),i=n(29),o=n(24),a=n(20)("species");e.exports=function(e){var t=r(e),n=i.f;o&&t&&!t[a]&&n(t,a,{configurable:!0,get:function(){return this}})}},function(e,t,n){var r=n(15),i=n(22),o=n(91),a=n(18);e.exports=function(e,t,n,s,u){r(t);var c=i(e),l=o(c),f=a(c.length),h=u?f-1:0,d=u?-1:1;if(n<2)for(;;){if(h in l){s=l[h],h+=d;break}if(h+=d,u?h<0:f<=h)throw TypeError("Reduce of empty array with no initial value")}for(;u?h>=0:f>h;h+=d)h in l&&(s=t(s,l[h],h,c));return s}},function(e,t,n){"use strict";var r=n(35),i=n(46),o=n(89),a=n(76),s=n(161),u=a.set,c=a.getterFor("Array Iterator");e.exports=s(Array,"Array",function(e,t){u(this,{type:"Array Iterator",target:r(e),index:0,kind:t})},function(){var e=c(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}},"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},function(e,t,n){"use strict";var r=n(63),i=n(18),o=n(27),a=function(e,t,n,s,u,c,l,f){for(var h,d=u,p=0,v=!!l&&o(l,f,3);p<s;){if(p in n){if(h=v?v(n[p],p,t):n[p],c>0&&r(h))d=a(e,t,h,i(h.length),d,c-1)-1;else{if(d>=9007199254740991)throw TypeError("Exceed the acceptable array length");e[d]=h}d++}p++}return d};e.exports=a},function(e,t,n){var r=n(89),i=n(20)("iterator"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||o[i]===e)}},function(e,t,n){var r=n(9);e.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&r(o.call(e)),t}}},function(e,t,n){var r=n(20)("iterator"),i=!1;try{var o=0,a={next:function(){return{done:!!o++}},return:function(){i=!0}};a[r]=function(){return this},Array.from(a,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},e(o)}catch(e){}return n}},function(e,t,n){var r=n(24),i=n(29),o=n(9),a=n(73);e.exports=r?Object.defineProperties:function(e,t){o(e);for(var n,r=a(t),s=r.length,u=0;s>u;)i.f(e,n=r[u++],t[n]);return e}},function(e,t,n){e.exports=!n(14)(function(){return!String(Symbol())})},function(e,t,n){e.exports=!n(14)(function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})},function(e,t,n){"use strict";var r,i,o,a=n(90),s=n(41),u=n(38),c=n(10),l=n(20)("iterator"),f=!1;[].keys&&("next"in(o=[].keys())?(i=a(a(o)))!==Object.prototype&&(r=i):f=!0),void 0==r&&(r={}),c||u(r,l)||s(r,l,function(){return this}),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:f}},function(e,t,n){"use strict";var r=n(234).IteratorPrototype,i=n(74),o=n(94),a=n(72),s=n(89),u=function(){return this};e.exports=function(e,t,n){var c=t+" Iterator";return e.prototype=i(r,{next:o(1,n)}),a(e,c,!1,!0),s[c]=u,e}},function(e,t,n){var r=n(38),i=n(35),o=n(160)(!1),a=n(93);e.exports=function(e,t){var n,s=i(e),u=0,c=[];for(n in s)!r(a,n)&&r(s,n)&&c.push(n);for(;t.length>u;)r(s,n=t[u++])&&(~o(c,n)||c.push(n));return c}},function(e,t,n){var r=n(122),i=n(121),o=n(9),a=n(21).Reflect;e.exports=a&&a.ownKeys||function(e){var t=r.f(o(e)),n=i.f;return n?t.concat(n(e)):t}},function(e,t,n){var r=n(23),i=n(21).document,o=r(i)&&r(i.createElement);e.exports=function(e){return o?i.createElement(e):{}}},function(e,t,n){e.exports=!n(24)&&!n(14)(function(){return 7!=Object.defineProperty(n(238)("div"),"a",{get:function(){return 7}}).a})},function(e,t,n){e.exports=n(95)("native-function-to-string",Function.toString)},function(e,t,n){e.exports=n.p+"assets/6f0b124e.mp4"},function(e,t,n){var r=n(43),i=n(39),o=n(178),a="[object DOMException]",s="[object Error]";e.exports=function(e){if(!i(e))return!1;var t=r(e);return t==s||t==a||"string"==typeof e.message&&"string"==typeof e.name&&!o(e)}},function(e,t,n){var r=n(284),i=n(282),o=n(13);e.exports=function(e){return(o(e)?r:i)(e)}},function(e,t,n){var r=n(140);e.exports=function(e,t){return r(e,t)}},function(e,t,n){var r=n(1),i=n(0),o=function(){"use strict";function e(){r(this,e)}return i(e,[{key:"allSerial",value:function(e){return new Promise(function(t){return t(e.reduce(function(e,t){return e.then(function(e){return t().then(function(t){return e.push(t),e})})},Promise.resolve([])))})}},{key:"retry",value:function(e,t,n){var r=this;return new Promise(function(i){return i(n().catch(function(o){if(!(t>0))throw o;return i(r.wait(e).then(function(){return r.retry(e,t-1,n)}))}))})}},{key:"wait",value:function(e){return new Promise(function(t){return setTimeout(t,e)})}}]),e}();e.exports=o},function(e,t){e.exports='<viewer-root\n  v-if="viewerVisible"\n  v-on:entered="onViewerEntered"\n  v-on:error="onError"\n></viewer-root>\n<setup-root\n  v-else-if="setupVisible"\n  v-on:finish="onSetupFinish"\n></setup-root>\n'},function(e,t){e.exports='<div\n  class="viewer-root"\n  v-bind:class="className"\n  v-if="rootVisible"\n></div>\n<div\n  class="viewer-root"\n  v-bind:class="className"\n  v-else-if="loaderVisible"\n>\n  <loader-root>Loading the device content. Please wait...</loader-root>\n</div>\n'},function(e,t){e.exports='<div class="grid grid-table layout-root">\n  <div class="grid-item align-x-center align-y-center">\n    <loader-container><slot></slot></loader-container>\n  </div>\n</div>\n'},function(e,t){e.exports='<div\n  class="grid grid-table setup-root layout-root"\n  v-bind:style="rootStyle"\n>\n  <div class="grid-item align-x-center align-y-center">\n    <setup-failure\n      v-bind:message="failureMessage"\n      v-bind:retryTime="failureRetryTime"\n      v-if="page === \'failure\'"\n      v-on:back="onFailureBack"\n      v-on:retry="onFailureRetry"\n    ></setup-failure>\n    <loader-container\n      v-else-if="page === \'loader\'"\n    >Verifying the device. Please wait...</loader-container>\n    <setup-manual\n      v-bind:deviceName="deviceName"\n      v-bind:isOnline="isOnline"\n      v-bind:password="password"\n      v-bind:username="username"\n      v-else-if="page === \'manual\'"\n      v-on:back="onManualBack"\n      v-on:submit="onManualSubmit"\n    ></setup-manual>\n    <setup-organization\n      v-bind:isOnline="isOnline"\n      v-bind:organizationArray="organizationArray"\n      v-else-if="page === \'organization\'"\n      v-on:back="onOrganizationBack"\n      v-on:submit="onOrganizationSubmit"\n    ></setup-organization>\n    <setup-qr\n      v-bind:serverUrl="serverUrl"\n      v-else-if="page === \'qr\'"\n      v-on:manual="onManual"\n      v-on:settings="onSettings"\n    ></setup-qr>\n    <setup-settings\n      v-bind:defaultServerUrl="defaultServerUrl"\n      v-bind:isOnline="isOnline"\n      v-bind:serverUrl="serverUrl"\n      v-else-if="page === \'settings\'"\n      v-on:back="onSettingsBack"\n      v-on:submit="onSettingsSubmit"\n    ></setup-settings>\n    <setup-success\n      v-bind:time="successTime"\n      v-else-if="page === \'success\'"\n      v-on:finish="onFinish"\n    ></setup-success>\n  </div>\n  <setup-panel-left></setup-panel-left>\n  <setup-panel-right v-bind:isOnline="isOnline"></setup-panel-right>\n</div>\n'},function(e,t){e.exports='<div class="container container--narrow setup-success">\n  <div class="wrap wrap-large">\n    <div class="gap-large">\n      <div class="gap-base">\n        <span class="icon icon-check-circle setup-icon setup-icon--success"></span>\n      </div>\n      <div class="setup-title gap-base">\n        The player has been registered successfully\n      </div>\n      <div class="gap-base">\n        It will start automatically in\n        <countdown-root\n          v-bind:end="time"\n          v-on:end="onEnd"\n        ></countdown-root>...\n      </div>\n    </div>\n    <div class="gap-large">\n      <button\n        type="button"\n        class="button"\n        v-focus\n        v-on:click="onClick"\n      >Start now</button>\n    </div>\n  </div>\n</div>\n'},function(e,t){e.exports='<form\n  class="container container--narrow"\n  novalidate\n  v-on:submit.prevent\n>\n  <div class="wrap wrap-large">\n    <setup-header\n      class="gap-large"\n      title="Additional settings"\n      v-bind:isOnline="isOnline"\n      v-on:back="onBack"\n    ></setup-header>\n    <div class="gap-large">\n      <div class="form-field gap-base">\n        <label\n          class="form-label"\n          for="serverUrl"\n          v-text="field.serverUrl.label"\n        ></label>\n        <input\n          type="url"\n          class="form-control"\n          v-bind:class="{invalid: errors.has(\'serverUrl\')}"\n          id="serverUrl"\n          name="serverUrl"\n          v-bind:data-vv-as="field.serverUrl.label"\n          v-focus\n          v-model="field.serverUrl.value"\n          v-on:change="onChange"\n          v-validate="field.serverUrl.validator"\n        >\n        <div\n          class="align-x-left form-alert gap-tiny"\n          v-if="errors.has(\'serverUrl\')"\n        >\n          <span class="icon icon-warning"></span>\n          <span v-text="errors.first(\'serverUrl\')"></span>\n        </div>\n      </div>\n      <div class="grid grid-inline grid-base gap-base">\n        <div class="grid-item width-1 width-md-1-2">\n          <button type="button" class="button" v-on:click="onSubmit">Save</button>\n        </div>\n        <div class="grid-item width-1 width-md-1-2">\n          <button type="button" class="button" v-on:click="onReset">Reset</button>\n        </div>\n      </div>\n    </div>\n  </div>\n</form>\n'},function(e,t){e.exports='<div class="container container--narrow">\n  <div class="wrap wrap-large">\n    <div class="gap-large">\n      <div class="gap-base setup-title">Device setup via QR code</div>\n      <div class="gap-base">\n        <canvas class="setup-qr" id="setupQr" ref="canvasEl"></canvas>\n      </div>\n      <div class="gap-base">Scan the QR code and log in on your mobile device</div>\n    </div>\n    <div class="gap-large">\n      <div class="gap-small">\n        <button\n          class="button"\n          id="setupManual"\n          type="button"\n          v-focus\n          v-on:click="onManual"\n        >Manual device setup</button>\n      </div>\n      <div class="gap-small">\n        <button\n          class="button"\n          id="setupSettings"\n          type="button"\n          v-on:click="onSettings"\n        >Additional settings</button>\n      </div>\n    </div>\n  </div>\n</div>\n'},function(e,t,n){e.exports=function(){"use strict";var e=function(){},t=Object.prototype.hasOwnProperty,n=Array.prototype.slice;function r(e,r,i){for(var o,a,s=0,u=(i=n.call(arguments,2)).length;s<u;s++)for(o in a=i[s])e&&!t.call(a,o)||(r[o]=a[o])}var i=function(t,n,i,o){var a=this;return"string"!=typeof t&&(o=i,i=n,n=t,t=null),"function"!=typeof n&&(o=i,i=n,n=function(){return a.apply(this,arguments)}),r(!1,n,a,o),n.prototype=function(t,n){var i;return"function"==typeof Object.create?i=Object.create(t):(e.prototype=t,i=new e,e.prototype=null),n&&r(!0,i,n),i}(a.prototype,i),n.prototype.constructor=n,n.class_=t||a.class_,n.super_=a,n};function o(){}o.class_="Nevis",o.super_=Object,o.extend=i;var a=o,s=a.extend(function(e,t,n){this.qrious=e,this.element=t,this.element.qrious=e,this.enabled=Boolean(n)},{draw:function(e){},getElement:function(){return this.enabled||(this.enabled=!0,this.render()),this.element},getModuleSize:function(e){var t=this.qrious,n=t.padding||0,r=Math.floor((t.size-2*n)/e.width);return Math.max(1,r)},getOffset:function(e){var t=this.qrious,n=t.padding;if(null!=n)return n;var r=this.getModuleSize(e),i=Math.floor((t.size-r*e.width)/2);return Math.max(0,i)},render:function(e){this.enabled&&(this.resize(),this.reset(),this.draw(e))},reset:function(){},resize:function(){}}),u=s.extend({draw:function(e){var t,n,r=this.qrious,i=this.getModuleSize(e),o=this.getOffset(e),a=this.element.getContext("2d");for(a.fillStyle=r.foreground,a.globalAlpha=r.foregroundAlpha,t=0;t<e.width;t++)for(n=0;n<e.width;n++)e.buffer[n*e.width+t]&&a.fillRect(i*t+o,i*n+o,i,i)},reset:function(){var e=this.qrious,t=this.element.getContext("2d"),n=e.size;t.lineWidth=1,t.clearRect(0,0,n,n),t.fillStyle=e.background,t.globalAlpha=e.backgroundAlpha,t.fillRect(0,0,n,n)},resize:function(){var e=this.element;e.width=e.height=this.qrious.size}}),c=a.extend(null,{BLOCK:[0,11,15,19,23,27,31,16,18,20,22,24,26,28,20,22,24,24,26,28,28,22,24,24,26,26,28,28,24,24,26,26,26,28,28,24,26,26,26,28,28]}),l=a.extend(null,{BLOCKS:[1,0,19,7,1,0,16,10,1,0,13,13,1,0,9,17,1,0,34,10,1,0,28,16,1,0,22,22,1,0,16,28,1,0,55,15,1,0,44,26,2,0,17,18,2,0,13,22,1,0,80,20,2,0,32,18,2,0,24,26,4,0,9,16,1,0,108,26,2,0,43,24,2,2,15,18,2,2,11,22,2,0,68,18,4,0,27,16,4,0,19,24,4,0,15,28,2,0,78,20,4,0,31,18,2,4,14,18,4,1,13,26,2,0,97,24,2,2,38,22,4,2,18,22,4,2,14,26,2,0,116,30,3,2,36,22,4,4,16,20,4,4,12,24,2,2,68,18,4,1,43,26,6,2,19,24,6,2,15,28,4,0,81,20,1,4,50,30,4,4,22,28,3,8,12,24,2,2,92,24,6,2,36,22,4,6,20,26,7,4,14,28,4,0,107,26,8,1,37,22,8,4,20,24,12,4,11,22,3,1,115,30,4,5,40,24,11,5,16,20,11,5,12,24,5,1,87,22,5,5,41,24,5,7,24,30,11,7,12,24,5,1,98,24,7,3,45,28,15,2,19,24,3,13,15,30,1,5,107,28,10,1,46,28,1,15,22,28,2,17,14,28,5,1,120,30,9,4,43,26,17,1,22,28,2,19,14,28,3,4,113,28,3,11,44,26,17,4,21,26,9,16,13,26,3,5,107,28,3,13,41,26,15,5,24,30,15,10,15,28,4,4,116,28,17,0,42,26,17,6,22,28,19,6,16,30,2,7,111,28,17,0,46,28,7,16,24,30,34,0,13,24,4,5,121,30,4,14,47,28,11,14,24,30,16,14,15,30,6,4,117,30,6,14,45,28,11,16,24,30,30,2,16,30,8,4,106,26,8,13,47,28,7,22,24,30,22,13,15,30,10,2,114,28,19,4,46,28,28,6,22,28,33,4,16,30,8,4,122,30,22,3,45,28,8,26,23,30,12,28,15,30,3,10,117,30,3,23,45,28,4,31,24,30,11,31,15,30,7,7,116,30,21,7,45,28,1,37,23,30,19,26,15,30,5,10,115,30,19,10,47,28,15,25,24,30,23,25,15,30,13,3,115,30,2,29,46,28,42,1,24,30,23,28,15,30,17,0,115,30,10,23,46,28,10,35,24,30,19,35,15,30,17,1,115,30,14,21,46,28,29,19,24,30,11,46,15,30,13,6,115,30,14,23,46,28,44,7,24,30,59,1,16,30,12,7,121,30,12,26,47,28,39,14,24,30,22,41,15,30,6,14,121,30,6,34,47,28,46,10,24,30,2,64,15,30,17,4,122,30,29,14,46,28,49,10,24,30,24,46,15,30,4,18,122,30,13,32,46,28,48,14,24,30,42,32,15,30,20,4,117,30,40,7,47,28,43,22,24,30,10,67,15,30,19,6,118,30,18,31,47,28,34,34,24,30,20,61,15,30],FINAL_FORMAT:[30660,29427,32170,30877,26159,25368,27713,26998,21522,20773,24188,23371,17913,16590,20375,19104,13663,12392,16177,14854,9396,8579,11994,11245,5769,5054,7399,6608,1890,597,3340,2107],LEVELS:{L:1,M:2,Q:3,H:4}}),f=a.extend(null,{EXPONENT:[1,2,4,8,16,32,64,128,29,58,116,232,205,135,19,38,76,152,45,90,180,117,234,201,143,3,6,12,24,48,96,192,157,39,78,156,37,74,148,53,106,212,181,119,238,193,159,35,70,140,5,10,20,40,80,160,93,186,105,210,185,111,222,161,95,190,97,194,153,47,94,188,101,202,137,15,30,60,120,240,253,231,211,187,107,214,177,127,254,225,223,163,91,182,113,226,217,175,67,134,17,34,68,136,13,26,52,104,208,189,103,206,129,31,62,124,248,237,199,147,59,118,236,197,151,51,102,204,133,23,46,92,184,109,218,169,79,158,33,66,132,21,42,84,168,77,154,41,82,164,85,170,73,146,57,114,228,213,183,115,230,209,191,99,198,145,63,126,252,229,215,179,123,246,241,255,227,219,171,75,150,49,98,196,149,55,110,220,165,87,174,65,130,25,50,100,200,141,7,14,28,56,112,224,221,167,83,166,81,162,89,178,121,242,249,239,195,155,43,86,172,69,138,9,18,36,72,144,61,122,244,245,247,243,251,235,203,139,11,22,44,88,176,125,250,233,207,131,27,54,108,216,173,71,142,0],LOG:[255,0,1,25,2,50,26,198,3,223,51,238,27,104,199,75,4,100,224,14,52,141,239,129,28,193,105,248,200,8,76,113,5,138,101,47,225,36,15,33,53,147,142,218,240,18,130,69,29,181,194,125,106,39,249,185,201,154,9,120,77,228,114,166,6,191,139,98,102,221,48,253,226,152,37,179,16,145,34,136,54,208,148,206,143,150,219,189,241,210,19,92,131,56,70,64,30,66,182,163,195,72,126,110,107,58,40,84,250,133,186,61,202,94,155,159,10,21,121,43,78,212,229,172,115,243,167,87,7,112,192,247,140,128,99,13,103,74,222,237,49,197,254,24,227,165,153,119,38,184,180,124,17,68,146,217,35,32,137,46,55,63,209,91,149,188,207,205,144,135,151,178,220,252,190,97,242,86,211,171,20,42,93,158,132,60,57,83,71,109,65,162,31,45,67,216,183,123,164,118,196,23,73,236,127,12,111,246,108,161,59,82,41,157,85,170,251,96,134,177,187,204,62,90,203,89,95,176,156,169,160,81,11,245,22,235,122,117,44,215,79,174,213,233,230,231,173,232,116,214,244,234,168,80,88,175]}),h=a.extend(null,{BLOCK:[3220,1468,2713,1235,3062,1890,2119,1549,2344,2936,1117,2583,1330,2470,1667,2249,2028,3780,481,4011,142,3098,831,3445,592,2517,1776,2234,1951,2827,1070,2660,1345,3177]}),d=a.extend(function(e){var t,n,r,i,o,a=e.value.length;for(this._badness=[],this._level=l.LEVELS[e.level],this._polynomial=[],this._value=e.value,this._version=0,this._stringBuffer=[];this._version<40&&(this._version++,r=4*(this._level-1)+16*(this._version-1),i=l.BLOCKS[r++],o=l.BLOCKS[r++],t=l.BLOCKS[r++],n=l.BLOCKS[r],r=t*(i+o)+o-3+(this._version<=9),!(a<=r)););this._dataBlock=t,this._eccBlock=n,this._neccBlock1=i,this._neccBlock2=o;var s=this.width=17+4*this._version;this.buffer=d._createArray(s*s),this._ecc=d._createArray(t+(t+n)*(i+o)+o),this._mask=d._createArray((s*(s+1)+1)/2),this._insertFinders(),this._insertAlignments(),this.buffer[8+s*(s-8)]=1,this._insertTimingGap(),this._reverseMask(),this._insertTimingRowAndColumn(),this._insertVersion(),this._syncMask(),this._convertBitStream(a),this._calculatePolynomial(),this._appendEccToData(),this._interleaveBlocks(),this._pack(),this._finish()},{_addAlignment:function(e,t){var n,r=this.buffer,i=this.width;for(r[e+i*t]=1,n=-2;n<2;n++)r[e+n+i*(t-2)]=1,r[e-2+i*(t+n+1)]=1,r[e+2+i*(t+n)]=1,r[e+n+1+i*(t+2)]=1;for(n=0;n<2;n++)this._setMask(e-1,t+n),this._setMask(e+1,t-n),this._setMask(e-n,t-1),this._setMask(e+n,t+1)},_appendData:function(e,t,n,r){var i,o,a,s=this._polynomial,u=this._stringBuffer;for(o=0;o<r;o++)u[n+o]=0;for(o=0;o<t;o++){if(255!==(i=f.LOG[u[e+o]^u[n]]))for(a=1;a<r;a++)u[n+a-1]=u[n+a]^f.EXPONENT[d._modN(i+s[r-a])];else for(a=n;a<n+r;a++)u[a]=u[a+1];u[n+r-1]=255===i?0:f.EXPONENT[d._modN(i+s[0])]}},_appendEccToData:function(){var e,t=0,n=this._dataBlock,r=this._calculateMaxLength(),i=this._eccBlock;for(e=0;e<this._neccBlock1;e++)this._appendData(t,n,r,i),t+=n,r+=i;for(e=0;e<this._neccBlock2;e++)this._appendData(t,n+1,r,i),t+=n+1,r+=i},_applyMask:function(e){var t,n,r,i,o=this.buffer,a=this.width;switch(e){case 0:for(i=0;i<a;i++)for(r=0;r<a;r++)r+i&1||this._isMasked(r,i)||(o[r+i*a]^=1);break;case 1:for(i=0;i<a;i++)for(r=0;r<a;r++)1&i||this._isMasked(r,i)||(o[r+i*a]^=1);break;case 2:for(i=0;i<a;i++)for(t=0,r=0;r<a;r++,t++)3===t&&(t=0),t||this._isMasked(r,i)||(o[r+i*a]^=1);break;case 3:for(n=0,i=0;i<a;i++,n++)for(3===n&&(n=0),t=n,r=0;r<a;r++,t++)3===t&&(t=0),t||this._isMasked(r,i)||(o[r+i*a]^=1);break;case 4:for(i=0;i<a;i++)for(t=0,n=i>>1&1,r=0;r<a;r++,t++)3===t&&(t=0,n=!n),n||this._isMasked(r,i)||(o[r+i*a]^=1);break;case 5:for(n=0,i=0;i<a;i++,n++)for(3===n&&(n=0),t=0,r=0;r<a;r++,t++)3===t&&(t=0),(r&i&1)+!(!t|!n)||this._isMasked(r,i)||(o[r+i*a]^=1);break;case 6:for(n=0,i=0;i<a;i++,n++)for(3===n&&(n=0),t=0,r=0;r<a;r++,t++)3===t&&(t=0),(r&i&1)+(t&&t===n)&1||this._isMasked(r,i)||(o[r+i*a]^=1);break;case 7:for(n=0,i=0;i<a;i++,n++)for(3===n&&(n=0),t=0,r=0;r<a;r++,t++)3===t&&(t=0),(t&&t===n)+(r+i&1)&1||this._isMasked(r,i)||(o[r+i*a]^=1)}},_calculateMaxLength:function(){return this._dataBlock*(this._neccBlock1+this._neccBlock2)+this._neccBlock2},_calculatePolynomial:function(){var e,t,n=this._eccBlock,r=this._polynomial;for(r[0]=1,e=0;e<n;e++){for(r[e+1]=1,t=e;t>0;t--)r[t]=r[t]?r[t-1]^f.EXPONENT[d._modN(f.LOG[r[t]]+e)]:r[t-1];r[0]=f.EXPONENT[d._modN(f.LOG[r[0]]+e)]}for(e=0;e<=n;e++)r[e]=f.LOG[r[e]]},_checkBadness:function(){var e,t,n,r,i,o=0,a=this._badness,s=this.buffer,u=this.width;for(i=0;i<u-1;i++)for(r=0;r<u-1;r++)(s[r+u*i]&&s[r+1+u*i]&&s[r+u*(i+1)]&&s[r+1+u*(i+1)]||!(s[r+u*i]||s[r+1+u*i]||s[r+u*(i+1)]||s[r+1+u*(i+1)]))&&(o+=d.N2);var c=0;for(i=0;i<u;i++){for(n=0,a[0]=0,e=0,r=0;r<u;r++)t=s[r+u*i],e===t?a[n]++:a[++n]=1,c+=(e=t)?1:-1;o+=this._getBadness(n)}c<0&&(c=-c);var l=0,f=c;for(f+=f<<2,f<<=1;f>u*u;)f-=u*u,l++;for(o+=l*d.N4,r=0;r<u;r++){for(n=0,a[0]=0,e=0,i=0;i<u;i++)t=s[r+u*i],e===t?a[n]++:a[++n]=1,e=t;o+=this._getBadness(n)}return o},_convertBitStream:function(e){var t,n,r=this._ecc,i=this._version;for(n=0;n<e;n++)r[n]=this._value.charCodeAt(n);var o=this._stringBuffer=r.slice(),a=this._calculateMaxLength();e>=a-2&&(e=a-2,i>9&&e--);var s=e;if(i>9){for(o[s+2]=0,o[s+3]=0;s--;)t=o[s],o[s+3]|=255&t<<4,o[s+2]=t>>4;o[2]|=255&e<<4,o[1]=e>>4,o[0]=64|e>>12}else{for(o[s+1]=0,o[s+2]=0;s--;)t=o[s],o[s+2]|=255&t<<4,o[s+1]=t>>4;o[1]|=255&e<<4,o[0]=64|e>>4}for(s=e+3-(i<10);s<a;)o[s++]=236,o[s++]=17},_getBadness:function(e){var t,n=0,r=this._badness;for(t=0;t<=e;t++)r[t]>=5&&(n+=d.N1+r[t]-5);for(t=3;t<e-1;t+=2)r[t-2]===r[t+2]&&r[t+2]===r[t-1]&&r[t-1]===r[t+1]&&3*r[t-1]===r[t]&&(0===r[t-3]||t+3>e||3*r[t-3]>=4*r[t]||3*r[t+3]>=4*r[t])&&(n+=d.N3);return n},_finish:function(){var e,t;this._stringBuffer=this.buffer.slice();var n=0,r=3e4;for(t=0;t<8&&(this._applyMask(t),(e=this._checkBadness())<r&&(r=e,n=t),7!==n);t++)this.buffer=this._stringBuffer.slice();n!==t&&this._applyMask(n),r=l.FINAL_FORMAT[n+(this._level-1<<3)];var i=this.buffer,o=this.width;for(t=0;t<8;t++,r>>=1)1&r&&(i[o-1-t+8*o]=1,t<6?i[8+o*t]=1:i[8+o*(t+1)]=1);for(t=0;t<7;t++,r>>=1)1&r&&(i[8+o*(o-7+t)]=1,t?i[6-t+8*o]=1:i[7+8*o]=1)},_interleaveBlocks:function(){var e,t,n=this._dataBlock,r=this._ecc,i=this._eccBlock,o=0,a=this._calculateMaxLength(),s=this._neccBlock1,u=this._neccBlock2,c=this._stringBuffer;for(e=0;e<n;e++){for(t=0;t<s;t++)r[o++]=c[e+t*n];for(t=0;t<u;t++)r[o++]=c[s*n+e+t*(n+1)]}for(t=0;t<u;t++)r[o++]=c[s*n+e+t*(n+1)];for(e=0;e<i;e++)for(t=0;t<s+u;t++)r[o++]=c[a+e+t*i];this._stringBuffer=r},_insertAlignments:function(){var e,t,n,r=this._version,i=this.width;if(r>1)for(e=c.BLOCK[r],n=i-7;;){for(t=i-7;t>e-3&&(this._addAlignment(t,n),!(t<e));)t-=e;if(n<=e+9)break;n-=e,this._addAlignment(6,n),this._addAlignment(n,6)}},_insertFinders:function(){var e,t,n,r,i=this.buffer,o=this.width;for(e=0;e<3;e++){for(t=0,r=0,1===e&&(t=o-7),2===e&&(r=o-7),i[r+3+o*(t+3)]=1,n=0;n<6;n++)i[r+n+o*t]=1,i[r+o*(t+n+1)]=1,i[r+6+o*(t+n)]=1,i[r+n+1+o*(t+6)]=1;for(n=1;n<5;n++)this._setMask(r+n,t+1),this._setMask(r+1,t+n+1),this._setMask(r+5,t+n),this._setMask(r+n+1,t+5);for(n=2;n<4;n++)i[r+n+o*(t+2)]=1,i[r+2+o*(t+n+1)]=1,i[r+4+o*(t+n)]=1,i[r+n+1+o*(t+4)]=1}},_insertTimingGap:function(){var e,t,n=this.width;for(t=0;t<7;t++)this._setMask(7,t),this._setMask(n-8,t),this._setMask(7,t+n-7);for(e=0;e<8;e++)this._setMask(e,7),this._setMask(e+n-8,7),this._setMask(e,n-8)},_insertTimingRowAndColumn:function(){var e,t=this.buffer,n=this.width;for(e=0;e<n-14;e++)1&e?(this._setMask(8+e,6),this._setMask(6,8+e)):(t[8+e+6*n]=1,t[6+n*(8+e)]=1)},_insertVersion:function(){var e,t,n,r,i=this.buffer,o=this._version,a=this.width;if(o>6)for(e=h.BLOCK[o-7],t=17,n=0;n<6;n++)for(r=0;r<3;r++,t--)1&(t>11?o>>t-12:e>>t)?(i[5-n+a*(2-r+a-11)]=1,i[2-r+a-11+a*(5-n)]=1):(this._setMask(5-n,2-r+a-11),this._setMask(2-r+a-11,5-n))},_isMasked:function(e,t){var n=d._getMaskBit(e,t);return 1===this._mask[n]},_pack:function(){var e,t,n,r=1,i=1,o=this.width,a=o-1,s=o-1,u=(this._dataBlock+this._eccBlock)*(this._neccBlock1+this._neccBlock2)+this._neccBlock2;for(t=0;t<u;t++)for(e=this._stringBuffer[t],n=0;n<8;n++,e<<=1){128&e&&(this.buffer[a+o*s]=1);do{i?a--:(a++,r?0!==s?s--:(r=!r,6==(a-=2)&&(a--,s=9)):s!==o-1?s++:(r=!r,6==(a-=2)&&(a--,s-=8))),i=!i}while(this._isMasked(a,s))}},_reverseMask:function(){var e,t,n=this.width;for(e=0;e<9;e++)this._setMask(e,8);for(e=0;e<8;e++)this._setMask(e+n-8,8),this._setMask(8,e);for(t=0;t<7;t++)this._setMask(8,t+n-7)},_setMask:function(e,t){var n=d._getMaskBit(e,t);this._mask[n]=1},_syncMask:function(){var e,t,n=this.width;for(t=0;t<n;t++)for(e=0;e<=t;e++)this.buffer[e+n*t]&&this._setMask(e,t)}},{_createArray:function(e){var t,n=[];for(t=0;t<e;t++)n[t]=0;return n},_getMaskBit:function(e,t){var n;return e>t&&(n=e,e=t,t=n),n=t,n+=t*t,n>>=1,n+=e},_modN:function(e){for(;e>=255;)e=((e-=255)>>8)+(255&e);return e},N1:3,N2:3,N3:40,N4:10}),p=d,v=s.extend({draw:function(){this.element.src=this.qrious.toDataURL()},reset:function(){this.element.src=""},resize:function(){var e=this.element;e.width=e.height=this.qrious.size}}),m=a.extend(function(e,t,n,r){this.name=e,this.modifiable=Boolean(t),this.defaultValue=n,this._valueTransformer=r},{transform:function(e){var t=this._valueTransformer;return"function"==typeof t?t(e,this):e}}),y=a.extend(null,{abs:function(e){return null!=e?Math.abs(e):null},hasOwn:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},noop:function(){},toUpperCase:function(e){return null!=e?e.toUpperCase():null}}),g=a.extend(function(e){this.options={},e.forEach(function(e){this.options[e.name]=e},this)},{exists:function(e){return null!=this.options[e]},get:function(e,t){return g._get(this.options[e],t)},getAll:function(e){var t,n=this.options,r={};for(t in n)y.hasOwn(n,t)&&(r[t]=g._get(n[t],e));return r},init:function(e,t,n){var r,i;for(r in"function"!=typeof n&&(n=y.noop),this.options)y.hasOwn(this.options,r)&&(i=this.options[r],g._set(i,i.defaultValue,t),g._createAccessor(i,t,n));this._setAll(e,t,!0)},set:function(e,t,n){return this._set(e,t,n)},setAll:function(e,t){return this._setAll(e,t)},_set:function(e,t,n,r){var i=this.options[e];if(!i)throw new Error("Invalid option: "+e);if(!i.modifiable&&!r)throw new Error("Option cannot be modified: "+e);return g._set(i,t,n)},_setAll:function(e,t,n){if(!e)return!1;var r,i=!1;for(r in e)y.hasOwn(e,r)&&this._set(r,e[r],t,n)&&(i=!0);return i}},{_createAccessor:function(e,t,n){var r={get:function(){return g._get(e,t)}};e.modifiable&&(r.set=function(r){g._set(e,r,t)&&n(r,e)}),Object.defineProperty(t,e.name,r)},_get:function(e,t){return t["_"+e.name]},_set:function(e,t,n){var r="_"+e.name,i=n[r],o=e.transform(null!=t?t:e.defaultValue);return n[r]=o,o!==i}}),b=g,w=a.extend(function(){this._services={}},{getService:function(e){var t=this._services[e];if(!t)throw new Error("Service is not being managed with name: "+e);return t},setService:function(e,t){if(this._services[e])throw new Error("Service is already managed with name: "+e);t&&(this._services[e]=t)}}),_=new b([new m("background",!0,"white"),new m("backgroundAlpha",!0,1,y.abs),new m("element"),new m("foreground",!0,"black"),new m("foregroundAlpha",!0,1,y.abs),new m("level",!0,"L",y.toUpperCase),new m("mime",!0,"image/png"),new m("padding",!0,null,y.abs),new m("size",!0,100,y.abs),new m("value",!0,"")]),k=new w,x=a.extend(function(e){_.init(e,this,this.update.bind(this));var t=_.get("element",this),n=k.getService("element"),r=t&&n.isCanvas(t)?t:n.createCanvas(),i=t&&n.isImage(t)?t:n.createImage();this._canvasRenderer=new u(this,r,!0),this._imageRenderer=new v(this,i,i===t),this.update()},{get:function(){return _.getAll(this)},set:function(e){_.setAll(e,this)&&this.update()},toDataURL:function(e){return this.canvas.toDataURL(e||this.mime)},update:function(){var e=new p({level:this.level,value:this.value});this._canvasRenderer.render(e),this._imageRenderer.render(e)}},{use:function(e){k.setService(e.getName(),e)}});Object.defineProperties(x.prototype,{canvas:{get:function(){return this._canvasRenderer.getElement()}},image:{get:function(){return this._imageRenderer.getElement()}}});var E=x,T=a.extend({getName:function(){}}).extend({createCanvas:function(){},createImage:function(){},getName:function(){return"element"},isCanvas:function(e){},isImage:function(e){}}).extend({createCanvas:function(){return document.createElement("canvas")},createImage:function(){return document.createElement("img")},isCanvas:function(e){return e instanceof HTMLCanvasElement},isImage:function(e){return e instanceof HTMLImageElement}});return E.use(new T),E}()},function(e,t){e.exports='<div class="setup-panel setup-panel--position-right">\n  <div class="grid grid-small grid-table setup-panel__grid">\n    <div class="grid-item align-y-center">\n      <div class="setup-connectivity" v-bind:class="className"></div>\n    </div>\n    <div class="grid-item align-y-center setup-clock">\n      <clock-root v-bind:delay="delay"></clock-root>\n    </div>\n  </div>\n</div>\n'},function(e,t){e.exports='<span v-text="value"></span>\n'},function(e,t,n){e.exports='<div class="setup-panel setup-panel--position-left">\n  <div class="grid grid-small grid-table setup-panel__grid">\n    <div class="align-y-center grid-item">\n      <img class="setup-logo" src="'+n(285)+'">\n    </div>\n  </div>\n</div>\n'},function(e,t){e.exports='<div class="container container--narrow">\n  <div class="wrap wrap-large">\n    <setup-header\n      class="gap-large"\n      title="Assign to organization"\n      v-bind:isOnline="isOnline"\n      v-on:back="onBack"\n    ></setup-header>\n    <div class="gap-large" v-if="organizationArray.length">\n      <button\n        class="button button--clear gap-small"\n        type="button"\n        v-bind:disabled="!isOnline"\n        v-bind:key="organization.id"\n        v-focus="i === 0"\n        v-for="(organization, i) in organizationArray"\n        v-on:click="onSubmit(organization)"\n        v-text="organization.name"\n      ></button>\n    </div>\n  </div>\n</div>\n'},function(e,t){e.exports='<form\n  class="container container--narrow"\n  novalidate\n  v-on:submit.prevent\n>\n  <div class="wrap wrap-large">\n    <setup-header\n      class="gap-large"\n      title="Manual device setup"\n      v-bind:isOnline="isOnline"\n      v-on:back="onBack"\n    ></setup-header>\n    <div class="gap-large">\n      <div class="form-field gap-base">\n        <label\n          class="form-label"\n          for="username"\n          v-text="field.username.label"\n        ></label>\n        <input\n          type="text"\n          class="form-control"\n          v-bind:class="{invalid: errors.has(\'username\')}"\n          id="username"\n          name="username"\n          v-bind:data-vv-as="field.username.label"\n          v-focus\n          v-model="field.username.value"\n          v-on:change="onChange"\n          v-validate="field.username.validator"\n        >\n        <div\n          class="align-x-left form-alert gap-tiny"\n          v-if="errors.has(\'username\')"\n        >\n          <span class="icon icon-warning"></span>\n          <span v-text="errors.first(\'username\')"></span>\n        </div>\n      </div>\n      <div class="form-field gap-base">\n        <label\n          class="form-label"\n          for="password"\n          v-text="field.password.label"\n        ></label>\n        <input\n          type="password"\n          class="form-control"\n          v-bind:class="{invalid: errors.has(\'password\')}"\n          id="password"\n          name="password"\n          v-bind:data-vv-as="field.password.label"\n          v-model="field.password.value"\n          v-on:change="onChange"\n          v-validate="field.password.validator"\n        >\n        <div\n          class="align-x-left form-alert gap-tiny"\n          v-if="errors.has(\'password\')"\n        >\n          <span class="icon icon-warning"></span>\n          <span v-text="errors.first(\'password\')"></span>\n        </div>\n      </div>\n      <div class="form-field gap-base">\n        <label\n          class="form-label"\n          for="deviceName"\n          v-text="field.deviceName.label"\n        ></label>\n        <input\n          type="text"\n          class="form-control"\n          id="deviceName"\n          name="deviceName"\n          v-bind:data-vv-as="field.deviceName.label"\n          v-on:change="onChange"\n          v-model="field.deviceName.value"\n        >\n      </div>\n      <div class="gap-base">\n        <button\n          type="button"\n          class="button"\n          v-bind:disabled="!isOnline"\n          v-on:click="onSubmit"\n        >Connect</button>\n      </div>\n    </div>\n  </div>\n</form>\n'},function(e,t){e.exports='<header class="grid grid-inline grid-base align-x-left">\n  <div class="grid-item width-1-6">\n    <button\n      type="button"\n      class="button button--square"\n      v-on:click="onBack"\n    ><span class="icon icon-arrow-left"></span></button>\n  </div>\n  <div class="grid-item width-5-6 align-y-center">\n    <div v-text="title"></div>\n    <div v-if="!isOnline" class="header-alert gap-tiny">\n      <span class="icon icon-warning"></span>\n      Manual setup requires internet connection\n    </div>\n  </div>\n</header>\n'},function(e,t){e.exports='<div class="container container--narrow setup-failure">\n  <div class="wrap wrap-large">\n    <div class="gap-large">\n      <div class="gap-base">\n          <span class="icon icon-warning setup-icon setup-icon--failure"></span>\n      </div>\n      <div class="gap-base">\n        <span v-text="message"></span>\n        Retry after <countdown-root\n          v-bind:end="retryTime"\n          v-on:end="onEnd"\n        ></countdown-root>...\n      </div>\n    </div>\n    <div class="grid grid-inline grid-base gap-large">\n      <div class="grid-item align-y-top width-1-2">\n        <button\n          type="button"\n          class="button button--secondary"\n          v-focus\n          v-on:click="onBack"\n        >Back</button>\n      </div>\n      <div class="grid-item align-y-top width-1-2">\n        <button\n          type="button"\n          class="button"\n          v-on:click="onRetry"\n        >Retry now</button>\n      </div>\n    </div>\n  </div>\n</div>\n'},function(e,t){e.exports='<span><span v-text="remaining"></span></span>\n'},function(e,t){e.exports='<div class="container container--narrow">\n  <div class="wrap wrap-large">\n    <div class="gap-large">\n      <div class="gap-small"><span class="icon icon-spinner icon-spin loader-icon"></span></div>\n      <div class="gap-small"><slot>Loading, please wait...</slot></div>\n    </div>\n  </div>\n</div>\n'},function(e,t,n){var r=n(290),i=n(287)(function(e,t){return null==e?{}:r(e,t)});e.exports=i},function(e,t){function n(e){if(!(this instanceof n))return new n(e);if(this.parameters={},e instanceof n)this.type=e.type,this.subtype=e.subtype,this.suffix=e.suffix,this.parameters=d(this.parameters,e.parameters);else if("string"==typeof e){var t=u.exec(e);if(!t)throw SyntaxError("Invalid Media Type: "+e);this.type=t[1].toLowerCase(),this.subtype=t[2].toLowerCase();var r,i=this.subtype.indexOf("+");for(-1!=i&&(this.suffix=this.subtype.slice(i+1)),this.suffix.length&&(this.subtype=this.subtype.slice(0,i)),s.lastIndex=t[1].length+1+t[2].length;r=y(e,s,s.lastIndex);)this.parameters[r[1].toLowerCase()]=m(r[2])}else if(e&&"object"==typeof e)d(this,e);else if(void 0!==e)throw new SyntaxError("Invalid Media Type: "+e)}e.exports=n,n.prototype.type="",n.prototype.subtype="",n.prototype.suffix="",Object.defineProperty(n.prototype,"name",{get:function(){return p(this)},configurable:!0,enumerable:!0}),Object.defineProperty(n.prototype,"q",{get:function(){var e=this.parameters.q;return null==e?1:Number(e)},set:function(e){this.parameters.q=e},configurable:!0,enumerable:!0}),n.prototype.toString=function(){var e=p(this);for(var t in this.parameters){var n=this.parameters[t];void 0!==n&&(e+="; "+t+"="+v(n))}return e},n.prototype.toJSON=n.prototype.toString,n.prototype.inspect=n.prototype.toString,n.prototype.match=function(e){e instanceof n||(e=new n(e));var t=!0;return t=(t=(t=(t=t&&("*"==e.type||this.type==e.type))&&("*"==e.subtype||this.subtype==e.subtype))&&("*"==e.subtype&&""==e.suffix||this.suffix==e.suffix))&&function(e,t){for(var n in t)if("q"!=n&&e[n]!=t[n])return!1;return!0}(this.parameters,e.parameters)},n.parse=n,n.stringify=function(e){return e instanceof n?e.toString():new n(e).toString()},n.split=function(e){var t,n=[];o.lastIndex=0;do{n.push((t=y(e,c,o.lastIndex))?t[0]:"")}while(y(e,o,c.lastIndex));return c.lastIndex!=e.length&&(n[n.length-1]+=e.slice(c.lastIndex)),n},n.sort=function(e){return e.slice().sort(n.comparator)},n.comparator=function(e,t){return function(e,t){return t.q-e.q}(e,t)||function(e,t){return e.type==t.type&&e.subtype==t.subtype?0:"*"==e.type&&"*"==e.subtype?1:"*"==t.type&&"*"==t.subtype?-1:"*"==e.subtype&&"*"==t.subtype?0:"*"==e.subtype?1:"*"==t.subtype?-1:0}(e,t)||function(e,t){return g(t.parameters)-g(e.parameters)}(e,t)};var r="[-a-zA-Z0-9!#$%^&*_+{}\\|'.`~]+",i="("+r+")",o=/\s*,\s*/g,a="(?:\\s*;\\s*("+r+")=("+r+'|"[^\\\\"\0-]*(\\\\.[^\\\\"\0-]*)*"))',s=new RegExp(a,"g"),u=new RegExp("^"+i+"/"+i+a+"*$"),c=new RegExp(i+"/"+i+a+"*","g"),l=new RegExp("^"+r+"$"),f=/([\\"])/g,h=/\\(.)/g;function d(e,t){for(var n in t)e[n]=t[n];return e}function p(e){var t=e.type+"/"+e.subtype;return e.suffix&&(t+="+"+e.suffix),t}function v(e){return null==e?'""':l.test(e)?e:'"'+e.replace(f,"\\$1")+'"'}function m(e){return'"'==e[0]?e.slice(1,-1).replace(h,"$1"):e}function y(e,t,n){t.lastIndex=n;var r=t.exec(e);return null==r||r.index!=n?(t.lastIndex=n,null):r}function g(e){var t=0;for(var n in e)"q"!=n&&++t;return t}},function(e,t,n){var r=n(293)(n(133));e.exports=r},function(e,t){!function(t,n,r){"use strict";"undefined"!=typeof window&&"function"==typeof window.define&&window.define.amd?window.define(r):void 0!==e&&e.exports?e.exports=r():n.exports?n.exports=r():n.Fingerprint2=r()}(0,this,function(){"use strict";var e=function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]+t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]+t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]+t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]+t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]},t=function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]*t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]*t[3],n[1]+=n[2]>>>16,n[2]&=65535,n[2]+=e[3]*t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]*t[3],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[2]*t[2],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[3]*t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]},n=function(e,t){return 32==(t%=64)?[e[1],e[0]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t|e[0]>>>32-t]:(t-=32,[e[1]<<t|e[0]>>>32-t,e[0]<<t|e[1]>>>32-t])},r=function(e,t){return 0==(t%=64)?e:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t]:[e[1]<<t-32,0]},i=function(e,t){return[e[0]^t[0],e[1]^t[1]]},o=function(e){return e=i(e,[0,e[0]>>>1]),e=t(e,[4283543511,3981806797]),e=i(e,[0,e[0]>>>1]),e=t(e,[3301882366,444984403]),i(e,[0,e[0]>>>1])},a=function(a,s){s=s||0;for(var u=(a=a||"").length%16,c=a.length-u,l=[0,s],f=[0,s],h=[0,0],d=[0,0],p=[2277735313,289559509],v=[1291169091,658871167],m=0;m<c;m+=16)h=[255&a.charCodeAt(m+4)|(255&a.charCodeAt(m+5))<<8|(255&a.charCodeAt(m+6))<<16|(255&a.charCodeAt(m+7))<<24,255&a.charCodeAt(m)|(255&a.charCodeAt(m+1))<<8|(255&a.charCodeAt(m+2))<<16|(255&a.charCodeAt(m+3))<<24],d=[255&a.charCodeAt(m+12)|(255&a.charCodeAt(m+13))<<8|(255&a.charCodeAt(m+14))<<16|(255&a.charCodeAt(m+15))<<24,255&a.charCodeAt(m+8)|(255&a.charCodeAt(m+9))<<8|(255&a.charCodeAt(m+10))<<16|(255&a.charCodeAt(m+11))<<24],h=t(h,p),h=n(h,31),h=t(h,v),l=i(l,h),l=n(l,27),l=e(l,f),l=e(t(l,[0,5]),[0,1390208809]),d=t(d,v),d=n(d,33),d=t(d,p),f=i(f,d),f=n(f,31),f=e(f,l),f=e(t(f,[0,5]),[0,944331445]);switch(h=[0,0],d=[0,0],u){case 15:d=i(d,r([0,a.charCodeAt(m+14)],48));case 14:d=i(d,r([0,a.charCodeAt(m+13)],40));case 13:d=i(d,r([0,a.charCodeAt(m+12)],32));case 12:d=i(d,r([0,a.charCodeAt(m+11)],24));case 11:d=i(d,r([0,a.charCodeAt(m+10)],16));case 10:d=i(d,r([0,a.charCodeAt(m+9)],8));case 9:d=i(d,[0,a.charCodeAt(m+8)]),d=t(d,v),d=n(d,33),d=t(d,p),f=i(f,d);case 8:h=i(h,r([0,a.charCodeAt(m+7)],56));case 7:h=i(h,r([0,a.charCodeAt(m+6)],48));case 6:h=i(h,r([0,a.charCodeAt(m+5)],40));case 5:h=i(h,r([0,a.charCodeAt(m+4)],32));case 4:h=i(h,r([0,a.charCodeAt(m+3)],24));case 3:h=i(h,r([0,a.charCodeAt(m+2)],16));case 2:h=i(h,r([0,a.charCodeAt(m+1)],8));case 1:h=i(h,[0,a.charCodeAt(m)]),h=t(h,p),h=n(h,31),h=t(h,v),l=i(l,h)}return l=i(l,[0,a.length]),f=i(f,[0,a.length]),l=e(l,f),f=e(f,l),l=o(l),f=o(f),l=e(l,f),f=e(f,l),("00000000"+(l[0]>>>0).toString(16)).slice(-8)+("00000000"+(l[1]>>>0).toString(16)).slice(-8)+("00000000"+(f[0]>>>0).toString(16)).slice(-8)+("00000000"+(f[1]>>>0).toString(16)).slice(-8)},s={preprocessor:null,audio:{timeout:1e3,excludeIOS11:!0},fonts:{swfContainerId:"fingerprintjs2",swfPath:"flash/compiled/FontList.swf",userDefinedFonts:[],extendedJsFonts:!1},screen:{detectScreenOrientation:!0},plugins:{sortPluginsFor:[/palemoon/i],excludeIE:!1},extraComponents:[],excludes:{enumerateDevices:!0,pixelRatio:!0,doNotTrack:!0,fontsFlash:!0},NOT_AVAILABLE:"not available",ERROR:"error",EXCLUDED:"excluded"},u=function(e,t){if(Array.prototype.forEach&&e.forEach===Array.prototype.forEach)e.forEach(t);else if(e.length===+e.length)for(var n=0,r=e.length;n<r;n++)t(e[n],n,e);else for(var i in e)e.hasOwnProperty(i)&&t(e[i],i,e)},c=function(e,t){var n=[];return null==e?n:Array.prototype.map&&e.map===Array.prototype.map?e.map(t):(u(e,function(e,r,i){n.push(t(e,r,i))}),n)},l=function(e){if(null==navigator.plugins)return e.NOT_AVAILABLE;for(var t=[],n=0,r=navigator.plugins.length;n<r;n++)navigator.plugins[n]&&t.push(navigator.plugins[n]);return f(e)&&(t=t.sort(function(e,t){return e.name>t.name?1:e.name<t.name?-1:0})),c(t,function(e){var t=c(e,function(e){return[e.type,e.suffixes]});return[e.name,e.description,t]})},f=function(e){for(var t=!1,n=0,r=e.plugins.sortPluginsFor.length;n<r;n++){var i=e.plugins.sortPluginsFor[n];if(navigator.userAgent.match(i)){t=!0;break}}return t},h=function(){var e=document.createElement("canvas");return!(!e.getContext||!e.getContext("2d"))},d=function(){if(!h())return!1;var e=p();return!!window.WebGLRenderingContext&&!!e},p=function(){var e=document.createElement("canvas"),t=null;try{t=e.getContext("webgl")||e.getContext("experimental-webgl")}catch(e){}return t||(t=null),t},v=[{key:"userAgent",getData:function(e){e(navigator.userAgent)}},{key:"language",getData:function(e,t){e(navigator.language||navigator.userLanguage||navigator.browserLanguage||navigator.systemLanguage||t.NOT_AVAILABLE)}},{key:"colorDepth",getData:function(e,t){e(window.screen.colorDepth||t.NOT_AVAILABLE)}},{key:"deviceMemory",getData:function(e,t){e(navigator.deviceMemory||t.NOT_AVAILABLE)}},{key:"pixelRatio",getData:function(e,t){e(window.devicePixelRatio||t.NOT_AVAILABLE)}},{key:"hardwareConcurrency",getData:function(e,t){e(function(e){return navigator.hardwareConcurrency?navigator.hardwareConcurrency:e.NOT_AVAILABLE}(t))}},{key:"screenResolution",getData:function(e,t){e(function(e){var t=[window.screen.width,window.screen.height];return e.screen.detectScreenOrientation&&t.sort().reverse(),t}(t))}},{key:"availableScreenResolution",getData:function(e,t){e(function(e){if(window.screen.availWidth&&window.screen.availHeight){var t=[window.screen.availHeight,window.screen.availWidth];return e.screen.detectScreenOrientation&&t.sort().reverse(),t}return e.NOT_AVAILABLE}(t))}},{key:"timezoneOffset",getData:function(e){e((new Date).getTimezoneOffset())}},{key:"timezone",getData:function(e,t){window.Intl&&window.Intl.DateTimeFormat?e((new window.Intl.DateTimeFormat).resolvedOptions().timeZone):e(t.NOT_AVAILABLE)}},{key:"sessionStorage",getData:function(e,t){e(function(e){try{return!!window.sessionStorage}catch(t){return e.ERROR}}(t))}},{key:"localStorage",getData:function(e,t){e(function(e){try{return!!window.localStorage}catch(t){return e.ERROR}}(t))}},{key:"indexedDb",getData:function(e,t){e(function(e){try{return!!window.indexedDB}catch(t){return e.ERROR}}(t))}},{key:"addBehavior",getData:function(e){e(!(!document.body||!document.body.addBehavior))}},{key:"openDatabase",getData:function(e){e(!!window.openDatabase)}},{key:"cpuClass",getData:function(e,t){e(function(e){return navigator.cpuClass||e.NOT_AVAILABLE}(t))}},{key:"platform",getData:function(e,t){e(function(e){return navigator.platform?navigator.platform:e.NOT_AVAILABLE}(t))}},{key:"doNotTrack",getData:function(e,t){e(function(e){return navigator.doNotTrack?navigator.doNotTrack:navigator.msDoNotTrack?navigator.msDoNotTrack:window.doNotTrack?window.doNotTrack:e.NOT_AVAILABLE}(t))}},{key:"plugins",getData:function(e,t){"Microsoft Internet Explorer"===navigator.appName||"Netscape"===navigator.appName&&/Trident/.test(navigator.userAgent)?t.plugins.excludeIE?e(t.EXCLUDED):e(function(e){var t=[];return Object.getOwnPropertyDescriptor&&Object.getOwnPropertyDescriptor(window,"ActiveXObject")||"ActiveXObject"in window?t=c(["AcroPDF.PDF","Adodb.Stream","AgControl.AgControl","DevalVRXCtrl.DevalVRXCtrl.1","MacromediaFlashPaper.MacromediaFlashPaper","Msxml2.DOMDocument","Msxml2.XMLHTTP","PDF.PdfCtrl","QuickTime.QuickTime","QuickTimeCheckObject.QuickTimeCheck.1","RealPlayer","RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)","RealVideo.RealVideo(tm) ActiveX Control (32-bit)","Scripting.Dictionary","SWCtl.SWCtl","Shell.UIHelper","ShockwaveFlash.ShockwaveFlash","Skype.Detection","TDCCtl.TDCCtl","WMPlayer.OCX","rmocx.RealPlayer G2 Control","rmocx.RealPlayer G2 Control.1"],function(t){try{return new window.ActiveXObject(t),t}catch(t){return e.ERROR}}):t.push(e.NOT_AVAILABLE),navigator.plugins&&(t=t.concat(l(e))),t}(t)):e(l(t))}},{key:"canvas",getData:function(e,t){h()?e(function(e){var t=[],n=document.createElement("canvas");n.width=2e3,n.height=200,n.style.display="inline";var r=n.getContext("2d");return r.rect(0,0,10,10),r.rect(2,2,6,6),t.push("canvas winding:"+(!1===r.isPointInPath(5,5,"evenodd")?"yes":"no")),r.textBaseline="alphabetic",r.fillStyle="#f60",r.fillRect(125,1,62,20),r.fillStyle="#069",e.dontUseFakeFontInCanvas?r.font="11pt Arial":r.font="11pt no-real-font-123",r.fillText("Cwm fjordbank glyphs vext quiz, ðŸ˜ƒ",2,15),r.fillStyle="rgba(102, 204, 0, 0.2)",r.font="18pt Arial",r.fillText("Cwm fjordbank glyphs vext quiz, ðŸ˜ƒ",4,45),r.globalCompositeOperation="multiply",r.fillStyle="rgb(255,0,255)",r.beginPath(),r.arc(50,50,50,0,2*Math.PI,!0),r.closePath(),r.fill(),r.fillStyle="rgb(0,255,255)",r.beginPath(),r.arc(100,50,50,0,2*Math.PI,!0),r.closePath(),r.fill(),r.fillStyle="rgb(255,255,0)",r.beginPath(),r.arc(75,100,50,0,2*Math.PI,!0),r.closePath(),r.fill(),r.fillStyle="rgb(255,0,255)",r.arc(75,75,75,0,2*Math.PI,!0),r.arc(75,75,25,0,2*Math.PI,!0),r.fill("evenodd"),n.toDataURL&&t.push("canvas fp:"+n.toDataURL()),t}(t)):e(t.NOT_AVAILABLE)}},{key:"webgl",getData:function(e,t){d()?e(function(){var e,t=function(t){return e.clearColor(0,0,0,1),e.enable(e.DEPTH_TEST),e.depthFunc(e.LEQUAL),e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT),"["+t[0]+", "+t[1]+"]"};if(!(e=p()))return null;var n=[],r=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,r);var i=new Float32Array([-.2,-.9,0,.4,-.26,0,0,.732134444,0]);e.bufferData(e.ARRAY_BUFFER,i,e.STATIC_DRAW),r.itemSize=3,r.numItems=3;var o=e.createProgram(),a=e.createShader(e.VERTEX_SHADER);e.shaderSource(a,"attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate=attrVertex+uniformOffset;gl_Position=vec4(attrVertex,0,1);}"),e.compileShader(a);var s=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(s,"precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor=vec4(varyinTexCoordinate,0,1);}"),e.compileShader(s),e.attachShader(o,a),e.attachShader(o,s),e.linkProgram(o),e.useProgram(o),o.vertexPosAttrib=e.getAttribLocation(o,"attrVertex"),o.offsetUniform=e.getUniformLocation(o,"uniformOffset"),e.enableVertexAttribArray(o.vertexPosArray),e.vertexAttribPointer(o.vertexPosAttrib,r.itemSize,e.FLOAT,!1,0,0),e.uniform2f(o.offsetUniform,1,1),e.drawArrays(e.TRIANGLE_STRIP,0,r.numItems);try{n.push(e.canvas.toDataURL())}catch(t){}n.push("extensions:"+(e.getSupportedExtensions()||[]).join(";")),n.push("webgl aliased line width range:"+t(e.getParameter(e.ALIASED_LINE_WIDTH_RANGE))),n.push("webgl aliased point size range:"+t(e.getParameter(e.ALIASED_POINT_SIZE_RANGE))),n.push("webgl alpha bits:"+e.getParameter(e.ALPHA_BITS)),n.push("webgl antialiasing:"+(e.getContextAttributes().antialias?"yes":"no")),n.push("webgl blue bits:"+e.getParameter(e.BLUE_BITS)),n.push("webgl depth bits:"+e.getParameter(e.DEPTH_BITS)),n.push("webgl green bits:"+e.getParameter(e.GREEN_BITS)),n.push("webgl max anisotropy:"+function(e){var t=e.getExtension("EXT_texture_filter_anisotropic")||e.getExtension("WEBKIT_EXT_texture_filter_anisotropic")||e.getExtension("MOZ_EXT_texture_filter_anisotropic");if(t){var n=e.getParameter(t.MAX_TEXTURE_MAX_ANISOTROPY_EXT);return 0===n&&(n=2),n}return null}(e)),n.push("webgl max combined texture image units:"+e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS)),n.push("webgl max cube map texture size:"+e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE)),n.push("webgl max fragment uniform vectors:"+e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS)),n.push("webgl max render buffer size:"+e.getParameter(e.MAX_RENDERBUFFER_SIZE)),n.push("webgl max texture image units:"+e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS)),n.push("webgl max texture size:"+e.getParameter(e.MAX_TEXTURE_SIZE)),n.push("webgl max varying vectors:"+e.getParameter(e.MAX_VARYING_VECTORS)),n.push("webgl max vertex attribs:"+e.getParameter(e.MAX_VERTEX_ATTRIBS)),n.push("webgl max vertex texture image units:"+e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)),n.push("webgl max vertex uniform vectors:"+e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS)),n.push("webgl max viewport dims:"+t(e.getParameter(e.MAX_VIEWPORT_DIMS))),n.push("webgl red bits:"+e.getParameter(e.RED_BITS)),n.push("webgl renderer:"+e.getParameter(e.RENDERER)),n.push("webgl shading language version:"+e.getParameter(e.SHADING_LANGUAGE_VERSION)),n.push("webgl stencil bits:"+e.getParameter(e.STENCIL_BITS)),n.push("webgl vendor:"+e.getParameter(e.VENDOR)),n.push("webgl version:"+e.getParameter(e.VERSION));try{var c=e.getExtension("WEBGL_debug_renderer_info");c&&(n.push("webgl unmasked vendor:"+e.getParameter(c.UNMASKED_VENDOR_WEBGL)),n.push("webgl unmasked renderer:"+e.getParameter(c.UNMASKED_RENDERER_WEBGL)))}catch(t){}return e.getShaderPrecisionFormat&&u(["FLOAT","INT"],function(t){u(["VERTEX","FRAGMENT"],function(r){u(["HIGH","MEDIUM","LOW"],function(i){u(["precision","rangeMin","rangeMax"],function(o){var a=e.getShaderPrecisionFormat(e[r+"_SHADER"],e[i+"_"+t])[o];"precision"!==o&&(o="precision "+o);var s=["webgl ",r.toLowerCase()," shader ",i.toLowerCase()," ",t.toLowerCase()," ",o,":",a].join("");n.push(s)})})})}),n}()):e(t.NOT_AVAILABLE)}},{key:"webglVendorAndRenderer",getData:function(e){d()?e(function(){try{var e=p(),t=e.getExtension("WEBGL_debug_renderer_info");return e.getParameter(t.UNMASKED_VENDOR_WEBGL)+"~"+e.getParameter(t.UNMASKED_RENDERER_WEBGL)}catch(e){return null}}()):e()}},{key:"adBlock",getData:function(e){e(function(){var e=document.createElement("div");e.innerHTML="&nbsp;";var t=!(e.className="adsbox");try{document.body.appendChild(e),t=0===document.getElementsByClassName("adsbox")[0].offsetHeight,document.body.removeChild(e)}catch(e){t=!1}return t}())}},{key:"hasLiedLanguages",getData:function(e){e(function(){if(void 0!==navigator.languages)try{if(navigator.languages[0].substr(0,2)!==navigator.language.substr(0,2))return!0}catch(e){return!0}return!1}())}},{key:"hasLiedResolution",getData:function(e){e(window.screen.width<window.screen.availWidth||window.screen.height<window.screen.availHeight)}},{key:"hasLiedOs",getData:function(e){e(function(){var e,t=navigator.userAgent.toLowerCase(),n=navigator.oscpu,r=navigator.platform.toLowerCase();if(e=0<=t.indexOf("windows phone")?"Windows Phone":0<=t.indexOf("win")?"Windows":0<=t.indexOf("android")?"Android":0<=t.indexOf("linux")?"Linux":0<=t.indexOf("iphone")||0<=t.indexOf("ipad")?"iOS":0<=t.indexOf("mac")?"Mac":"Other",("ontouchstart"in window||0<navigator.maxTouchPoints||0<navigator.msMaxTouchPoints)&&"Windows Phone"!==e&&"Android"!==e&&"iOS"!==e&&"Other"!==e)return!0;if(void 0!==n){if(0<=(n=n.toLowerCase()).indexOf("win")&&"Windows"!==e&&"Windows Phone"!==e)return!0;if(0<=n.indexOf("linux")&&"Linux"!==e&&"Android"!==e)return!0;if(0<=n.indexOf("mac")&&"Mac"!==e&&"iOS"!==e)return!0;if((-1===n.indexOf("win")&&-1===n.indexOf("linux")&&-1===n.indexOf("mac"))!=("Other"===e))return!0}return 0<=r.indexOf("win")&&"Windows"!==e&&"Windows Phone"!==e||(0<=r.indexOf("linux")||0<=r.indexOf("android")||0<=r.indexOf("pike"))&&"Linux"!==e&&"Android"!==e||(0<=r.indexOf("mac")||0<=r.indexOf("ipad")||0<=r.indexOf("ipod")||0<=r.indexOf("iphone"))&&"Mac"!==e&&"iOS"!==e||(-1===r.indexOf("win")&&-1===r.indexOf("linux")&&-1===r.indexOf("mac"))!=("Other"===e)||void 0===navigator.plugins&&"Windows"!==e&&"Windows Phone"!==e}())}},{key:"hasLiedBrowser",getData:function(e){e(function(){var e,t=navigator.userAgent.toLowerCase(),n=navigator.productSub;if(("Chrome"==(e=0<=t.indexOf("firefox")?"Firefox":0<=t.indexOf("opera")||0<=t.indexOf("opr")?"Opera":0<=t.indexOf("chrome")?"Chrome":0<=t.indexOf("safari")?"Safari":0<=t.indexOf("trident")?"Internet Explorer":"Other")||"Safari"===e||"Opera"===e)&&"20030107"!==n)return!0;var r,i=eval.toString().length;if(37===i&&"Safari"!==e&&"Firefox"!==e&&"Other"!==e)return!0;if(39===i&&"Internet Explorer"!==e&&"Other"!==e)return!0;if(33===i&&"Chrome"!==e&&"Opera"!==e&&"Other"!==e)return!0;try{throw"a"}catch(e){try{e.toSource(),r=!0}catch(e){r=!1}}return r&&"Firefox"!==e&&"Other"!==e}())}},{key:"touchSupport",getData:function(e){e(function(){var e,t=0;void 0!==navigator.maxTouchPoints?t=navigator.maxTouchPoints:void 0!==navigator.msMaxTouchPoints&&(t=navigator.msMaxTouchPoints);try{document.createEvent("TouchEvent"),e=!0}catch(t){e=!1}return[t,e,"ontouchstart"in window]}())}},{key:"fonts",getData:function(e,t){var n=["monospace","sans-serif","serif"],r=["Andale Mono","Arial","Arial Black","Arial Hebrew","Arial MT","Arial Narrow","Arial Rounded MT Bold","Arial Unicode MS","Bitstream Vera Sans Mono","Book Antiqua","Bookman Old Style","Calibri","Cambria","Cambria Math","Century","Century Gothic","Century Schoolbook","Comic Sans","Comic Sans MS","Consolas","Courier","Courier New","Geneva","Georgia","Helvetica","Helvetica Neue","Impact","Lucida Bright","Lucida Calligraphy","Lucida Console","Lucida Fax","LUCIDA GRANDE","Lucida Handwriting","Lucida Sans","Lucida Sans Typewriter","Lucida Sans Unicode","Microsoft Sans Serif","Monaco","Monotype Corsiva","MS Gothic","MS Outlook","MS PGothic","MS Reference Sans Serif","MS Sans Serif","MS Serif","MYRIAD","MYRIAD PRO","Palatino","Palatino Linotype","Segoe Print","Segoe Script","Segoe UI","Segoe UI Light","Segoe UI Semibold","Segoe UI Symbol","Tahoma","Times","Times New Roman","Times New Roman PS","Trebuchet MS","Verdana","Wingdings","Wingdings 2","Wingdings 3"];t.fonts.extendedJsFonts&&(r=r.concat(["Abadi MT Condensed Light","Academy Engraved LET","ADOBE CASLON PRO","Adobe Garamond","ADOBE GARAMOND PRO","Agency FB","Aharoni","Albertus Extra Bold","Albertus Medium","Algerian","Amazone BT","American Typewriter","American Typewriter Condensed","AmerType Md BT","Andalus","Angsana New","AngsanaUPC","Antique Olive","Aparajita","Apple Chancery","Apple Color Emoji","Apple SD Gothic Neo","Arabic Typesetting","ARCHER","ARNO PRO","Arrus BT","Aurora Cn BT","AvantGarde Bk BT","AvantGarde Md BT","AVENIR","Ayuthaya","Bandy","Bangla Sangam MN","Bank Gothic","BankGothic Md BT","Baskerville","Baskerville Old Face","Batang","BatangChe","Bauer Bodoni","Bauhaus 93","Bazooka","Bell MT","Bembo","Benguiat Bk BT","Berlin Sans FB","Berlin Sans FB Demi","Bernard MT Condensed","BernhardFashion BT","BernhardMod BT","Big Caslon","BinnerD","Blackadder ITC","BlairMdITC TT","Bodoni 72","Bodoni 72 Oldstyle","Bodoni 72 Smallcaps","Bodoni MT","Bodoni MT Black","Bodoni MT Condensed","Bodoni MT Poster Compressed","Bookshelf Symbol 7","Boulder","Bradley Hand","Bradley Hand ITC","Bremen Bd BT","Britannic Bold","Broadway","Browallia New","BrowalliaUPC","Brush Script MT","Californian FB","Calisto MT","Calligrapher","Candara","CaslonOpnface BT","Castellar","Centaur","Cezanne","CG Omega","CG Times","Chalkboard","Chalkboard SE","Chalkduster","Charlesworth","Charter Bd BT","Charter BT","Chaucer","ChelthmITC Bk BT","Chiller","Clarendon","Clarendon Condensed","CloisterBlack BT","Cochin","Colonna MT","Constantia","Cooper Black","Copperplate","Copperplate Gothic","Copperplate Gothic Bold","Copperplate Gothic Light","CopperplGoth Bd BT","Corbel","Cordia New","CordiaUPC","Cornerstone","Coronet","Cuckoo","Curlz MT","DaunPenh","Dauphin","David","DB LCD Temp","DELICIOUS","Denmark","DFKai-SB","Didot","DilleniaUPC","DIN","DokChampa","Dotum","DotumChe","Ebrima","Edwardian Script ITC","Elephant","English 111 Vivace BT","Engravers MT","EngraversGothic BT","Eras Bold ITC","Eras Demi ITC","Eras Light ITC","Eras Medium ITC","EucrosiaUPC","Euphemia","Euphemia UCAS","EUROSTILE","Exotc350 Bd BT","FangSong","Felix Titling","Fixedsys","FONTIN","Footlight MT Light","Forte","FrankRuehl","Fransiscan","Freefrm721 Blk BT","FreesiaUPC","Freestyle Script","French Script MT","FrnkGothITC Bk BT","Fruitger","FRUTIGER","Futura","Futura Bk BT","Futura Lt BT","Futura Md BT","Futura ZBlk BT","FuturaBlack BT","Gabriola","Galliard BT","Gautami","Geeza Pro","Geometr231 BT","Geometr231 Hv BT","Geometr231 Lt BT","GeoSlab 703 Lt BT","GeoSlab 703 XBd BT","Gigi","Gill Sans","Gill Sans MT","Gill Sans MT Condensed","Gill Sans MT Ext Condensed Bold","Gill Sans Ultra Bold","Gill Sans Ultra Bold Condensed","Gisha","Gloucester MT Extra Condensed","GOTHAM","GOTHAM BOLD","Goudy Old Style","Goudy Stout","GoudyHandtooled BT","GoudyOLSt BT","Gujarati Sangam MN","Gulim","GulimChe","Gungsuh","GungsuhChe","Gurmukhi MN","Haettenschweiler","Harlow Solid Italic","Harrington","Heather","Heiti SC","Heiti TC","HELV","Herald","High Tower Text","Hiragino Kaku Gothic ProN","Hiragino Mincho ProN","Hoefler Text","Humanst 521 Cn BT","Humanst521 BT","Humanst521 Lt BT","Imprint MT Shadow","Incised901 Bd BT","Incised901 BT","Incised901 Lt BT","INCONSOLATA","Informal Roman","Informal011 BT","INTERSTATE","IrisUPC","Iskoola Pota","JasmineUPC","Jazz LET","Jenson","Jester","Jokerman","Juice ITC","Kabel Bk BT","Kabel Ult BT","Kailasa","KaiTi","Kalinga","Kannada Sangam MN","Kartika","Kaufmann Bd BT","Kaufmann BT","Khmer UI","KodchiangUPC","Kokila","Korinna BT","Kristen ITC","Krungthep","Kunstler Script","Lao UI","Latha","Leelawadee","Letter Gothic","Levenim MT","LilyUPC","Lithograph","Lithograph Light","Long Island","Lydian BT","Magneto","Maiandra GD","Malayalam Sangam MN","Malgun Gothic","Mangal","Marigold","Marion","Marker Felt","Market","Marlett","Matisse ITC","Matura MT Script Capitals","Meiryo","Meiryo UI","Microsoft Himalaya","Microsoft JhengHei","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Uighur","Microsoft YaHei","Microsoft Yi Baiti","MingLiU","MingLiU_HKSCS","MingLiU_HKSCS-ExtB","MingLiU-ExtB","Minion","Minion Pro","Miriam","Miriam Fixed","Mistral","Modern","Modern No. 20","Mona Lisa Solid ITC TT","Mongolian Baiti","MONO","MoolBoran","Mrs Eaves","MS LineDraw","MS Mincho","MS PMincho","MS Reference Specialty","MS UI Gothic","MT Extra","MUSEO","MV Boli","Nadeem","Narkisim","NEVIS","News Gothic","News GothicMT","NewsGoth BT","Niagara Engraved","Niagara Solid","Noteworthy","NSimSun","Nyala","OCR A Extended","Old Century","Old English Text MT","Onyx","Onyx BT","OPTIMA","Oriya Sangam MN","OSAKA","OzHandicraft BT","Palace Script MT","Papyrus","Parchment","Party LET","Pegasus","Perpetua","Perpetua Titling MT","PetitaBold","Pickwick","Plantagenet Cherokee","Playbill","PMingLiU","PMingLiU-ExtB","Poor Richard","Poster","PosterBodoni BT","PRINCETOWN LET","Pristina","PTBarnum BT","Pythagoras","Raavi","Rage Italic","Ravie","Ribbon131 Bd BT","Rockwell","Rockwell Condensed","Rockwell Extra Bold","Rod","Roman","Sakkal Majalla","Santa Fe LET","Savoye LET","Sceptre","Script","Script MT Bold","SCRIPTINA","Serifa","Serifa BT","Serifa Th BT","ShelleyVolante BT","Sherwood","Shonar Bangla","Showcard Gothic","Shruti","Signboard","SILKSCREEN","SimHei","Simplified Arabic","Simplified Arabic Fixed","SimSun","SimSun-ExtB","Sinhala Sangam MN","Sketch Rockwell","Skia","Small Fonts","Snap ITC","Snell Roundhand","Socket","Souvenir Lt BT","Staccato222 BT","Steamer","Stencil","Storybook","Styllo","Subway","Swis721 BlkEx BT","Swiss911 XCm BT","Sylfaen","Synchro LET","System","Tamil Sangam MN","Technical","Teletype","Telugu Sangam MN","Tempus Sans ITC","Terminal","Thonburi","Traditional Arabic","Trajan","TRAJAN PRO","Tristan","Tubular","Tunga","Tw Cen MT","Tw Cen MT Condensed","Tw Cen MT Condensed Extra Bold","TypoUpright BT","Unicorn","Univers","Univers CE 55 Medium","Univers Condensed","Utsaah","Vagabond","Vani","Vijaya","Viner Hand ITC","VisualUI","Vivaldi","Vladimir Script","Vrinda","Westminster","WHITNEY","Wide Latin","ZapfEllipt BT","ZapfHumnst BT","ZapfHumnst Dm BT","Zapfino","Zurich BlkEx BT","Zurich Ex BT","ZWAdobeF"])),r=(r=r.concat(t.fonts.userDefinedFonts)).filter(function(e,t){return r.indexOf(e)===t});var i=document.getElementsByTagName("body")[0],o=document.createElement("div"),a=document.createElement("div"),s={},u={},c=function(){var e=document.createElement("span");return e.style.position="absolute",e.style.left="-9999px",e.style.fontSize="72px",e.style.fontStyle="normal",e.style.fontWeight="normal",e.style.letterSpacing="normal",e.style.lineBreak="auto",e.style.lineHeight="normal",e.style.textTransform="none",e.style.textAlign="left",e.style.textDecoration="none",e.style.textShadow="none",e.style.whiteSpace="normal",e.style.wordBreak="normal",e.style.wordSpacing="normal",e.innerHTML="mmmmmmmmmmlli",e},l=function(e){for(var t=!1,r=0;r<n.length;r++)if(t=e[r].offsetWidth!==s[n[r]]||e[r].offsetHeight!==u[n[r]])return t;return t},f=function(){for(var e=[],t=0,r=n.length;t<r;t++){var i=c();i.style.fontFamily=n[t],o.appendChild(i),e.push(i)}return e}();i.appendChild(o);for(var h=0,d=n.length;h<d;h++)s[n[h]]=f[h].offsetWidth,u[n[h]]=f[h].offsetHeight;var p=function(){for(var e,t,i,o={},s=0,u=r.length;s<u;s++){for(var l=[],f=0,h=n.length;f<h;f++){var d=(e=r[s],t=n[f],i=void 0,(i=c()).style.fontFamily="'"+e+"',"+t,i);a.appendChild(d),l.push(d)}o[r[s]]=l}return o}();i.appendChild(a);for(var v=[],m=0,y=r.length;m<y;m++)l(p[r[m]])&&v.push(r[m]);i.removeChild(a),i.removeChild(o),e(v)},pauseBefore:!0},{key:"fontsFlash",getData:function(e,t){return void 0!==window.swfobject?window.swfobject.hasFlashPlayerVersion("9.0.0")?t.fonts.swfPath?void function(e,t){var n="___fp_swf_loaded";window[n]=function(t){e(t)};var r,i=t.fonts.swfContainerId;(r=document.createElement("div")).setAttribute("id",(void 0).fonts.swfContainerId),document.body.appendChild(r);var o={onReady:n};window.swfobject.embedSWF(t.fonts.swfPath,i,"1","1","9.0.0",!1,o,{allowScriptAccess:"always",menu:"false"},{})}(function(t){e(t)},t):e("missing options.fonts.swfPath"):e("flash not installed"):e("swf object not loaded")},pauseBefore:!0},{key:"audio",getData:function(e,t){var n=t.audio;if(n.excludeIOS11&&navigator.userAgent.match(/OS 11.+Version\/11.+Safari/))return e(t.EXCLUDED);var r=window.OfflineAudioContext||window.webkitOfflineAudioContext;if(null==r)return e(t.NOT_AVAILABLE);var i=new r(1,44100,44100),o=i.createOscillator();o.type="triangle",o.frequency.setValueAtTime(1e4,i.currentTime);var a=i.createDynamicsCompressor();u([["threshold",-50],["knee",40],["ratio",12],["reduction",-20],["attack",0],["release",.25]],function(e){void 0!==a[e[0]]&&"function"==typeof a[e[0]].setValueAtTime&&a[e[0]].setValueAtTime(e[1],i.currentTime)}),o.connect(a),a.connect(i.destination),o.start(0),i.startRendering();var s=setTimeout(function(){return console.warn('Audio fingerprint timed out. Please report bug at https://github.com/Valve/fingerprintjs2 with your user agent: "'+navigator.userAgent+'".'),i.oncomplete=function(){},i=null,e("audioTimeout")},n.timeout);i.oncomplete=function(t){var n;try{clearTimeout(s),n=t.renderedBuffer.getChannelData(0).slice(4500,5e3).reduce(function(e,t){return e+Math.abs(t)},0).toString(),o.disconnect(),a.disconnect()}catch(t){return void e(t)}e(n)}}},{key:"enumerateDevices",getData:function(e,t){if(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices)return e(t.NOT_AVAILABLE);navigator.mediaDevices.enumerateDevices().then(function(t){e(t.map(function(e){return"id="+e.deviceId+";gid="+e.groupId+";"+e.kind+";"+e.label}))}).catch(function(t){e(t)})}}],m=function(e){throw new Error("'new Fingerprint()' is deprecated, see https://github.com/Valve/fingerprintjs2#upgrade-guide-from-182-to-200")};return m.get=function(e,t){t?e||(e={}):(t=e,e={}),function(e,t){var n,r;if(null!=t)for(r in t)null==(n=t[r])||Object.prototype.hasOwnProperty.call(e,r)||(e[r]=n)}(e,s),e.components=e.extraComponents.concat(v);var n={data:[],addPreprocessedComponent:function(t,r){"function"==typeof e.preprocessor&&(r=e.preprocessor(t,r)),n.data.push({key:t,value:r})}},r=-1,i=function(o){if((r+=1)>=e.components.length)t(n.data);else{var a=e.components[r];if(e.excludes[a.key])i(!1);else{if(!o&&a.pauseBefore)return r-=1,void setTimeout(function(){i(!0)},1);try{a.getData(function(e){n.addPreprocessedComponent(a.key,e),i(!1)},e)}catch(o){n.addPreprocessedComponent(a.key,String(o)),i(!1)}}}};i(!1)},m.getPromise=function(e){return new Promise(function(t,n){m.get(e,t)})},m.getV18=function(e,t){return null==t&&(t=e,e={}),m.get(e,function(n){for(var r=[],i=0;i<n.length;i++){var o=n[i];if(o.value===(e.NOT_AVAILABLE||"not available"))r.push({key:o.key,value:"unknown"});else if("plugins"===o.key)r.push({key:"plugins",value:c(o.value,function(e){var t=c(e[2],function(e){return e.join?e.join("~"):e}).join(",");return[e[0],e[1],t].join("::")})});else if(-1!==["canvas","webgl"].indexOf(o.key))r.push({key:o.key,value:o.value.join("~")});else if(-1!==["sessionStorage","localStorage","indexedDb","addBehavior","openDatabase"].indexOf(o.key)){if(!o.value)continue;r.push({key:o.key,value:1})}else o.value?r.push(o.value.join?{key:o.key,value:o.value.join(";")}:o):r.push({key:o.key,value:o.value})}var s=a(c(r,function(e){return e.value}).join("~~~"),31);t(s,r)})},m.x64hash128=a,m.VERSION="2.0.0",m})},function(e,t,n){var r=n(194),i=n(137),o=n(79),a=n(13),s=n(59),u=n(107),c=n(104),l=n(105),f="[object Map]",h="[object Set]",d=Object.prototype.hasOwnProperty;e.exports=function(e){if(null==e)return!0;if(s(e)&&(a(e)||"string"==typeof e||"function"==typeof e.splice||u(e)||l(e)||o(e)))return!e.length;var t=i(e);if(t==f||t==h)return!e.size;if(c(e))return!r(e).length;for(var n in e)if(d.call(e,n))return!1;return!0}},function(e,t,n){var r=n(100)(n(297));e.exports=r},function(e,t,n){e.exports=function(){"use strict";function e(e){if(null===e||!0===e||!1===e)return NaN;var t=Number(e);return isNaN(t)?t:t<0?Math.ceil(t):Math.floor(t)}var t=6e4;function n(e){var n=new Date(e.getTime()),r=n.getTimezoneOffset();n.setSeconds(0,0);var i=n.getTime()%t;return r*t+i}var r=36e5,i=6e4,o=2,a={dateTimeDelimeter:/[T ]/,plainTime:/:/,timeZoneDelimeter:/[Z ]/i,YY:/^(\d{2})$/,YYY:[/^([+-]\d{2})$/,/^([+-]\d{3})$/,/^([+-]\d{4})$/],YYYY:/^(\d{4})/,YYYYY:[/^([+-]\d{4})/,/^([+-]\d{5})/,/^([+-]\d{6})/],MM:/^-(\d{2})$/,DDD:/^-?(\d{3})$/,MMDD:/^-?(\d{2})-?(\d{2})$/,Www:/^-?W(\d{2})$/,WwwD:/^-?W(\d{2})-?(\d{1})$/,HH:/^(\d{2}([.,]\d*)?)$/,HHMM:/^(\d{2}):?(\d{2}([.,]\d*)?)$/,HHMMSS:/^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/,timezone:/([Z+-].*)$/,timezoneZ:/^(Z)$/,timezoneHH:/^([+-])(\d{2})$/,timezoneHHMM:/^([+-])(\d{2}):?(\d{2})$/};function s(t,s){if(arguments.length<1)throw new TypeError("1 argument required, but only "+arguments.length+" present");if(null===t)return new Date(NaN);var c=s||{},l=null==c.additionalDigits?o:e(c.additionalDigits);if(2!==l&&1!==l&&0!==l)throw new RangeError("additionalDigits must be 0, 1 or 2");if(t instanceof Date||"object"==typeof t&&"[object Date]"===Object.prototype.toString.call(t))return new Date(t.getTime());if("number"==typeof t||"[object Number]"===Object.prototype.toString.call(t))return new Date(t);if("string"!=typeof t&&"[object String]"!==Object.prototype.toString.call(t))return new Date(NaN);var m=function(e){var t,n={},r=e.split(a.dateTimeDelimeter);if(a.plainTime.test(r[0])?(n.date=null,t=r[0]):(n.date=r[0],t=r[1],a.timeZoneDelimeter.test(n.date)&&(n.date=e.split(a.timeZoneDelimeter)[0],t=e.substr(n.date.length,e.length))),t){var i=a.timezone.exec(t);i?(n.time=t.replace(i[1],""),n.timezone=i[1]):n.time=t}return n}(t),y=function(e,t){var n,r=a.YYY[t],i=a.YYYYY[t];if(n=a.YYYY.exec(e)||i.exec(e)){var o=n[1];return{year:parseInt(o,10),restDateString:e.slice(o.length)}}if(n=a.YY.exec(e)||r.exec(e)){var s=n[1];return{year:100*parseInt(s,10),restDateString:e.slice(s.length)}}return{year:null}}(m.date,l),g=y.year,b=y.restDateString,w=function(e,t){if(null===t)return null;var n,r,i,o;if(0===e.length)return(r=new Date(0)).setUTCFullYear(t),r;if(n=a.MM.exec(e))return r=new Date(0),i=parseInt(n[1],10)-1,h(t,i)?(r.setUTCFullYear(t,i),r):new Date(NaN);if(n=a.DDD.exec(e)){r=new Date(0);var s=parseInt(n[1],10);return function(e,t){if(t<1)return!1;var n=f(e);return!(n&&t>366)&&!(!n&&t>365)}(t,s)?(r.setUTCFullYear(t,0,s),r):new Date(NaN)}if(n=a.MMDD.exec(e)){r=new Date(0),i=parseInt(n[1],10)-1;var c=parseInt(n[2],10);return h(t,i,c)?(r.setUTCFullYear(t,i,c),r):new Date(NaN)}if(n=a.Www.exec(e))return d(0,o=parseInt(n[1],10)-1)?u(t,o):new Date(NaN);if(n=a.WwwD.exec(e)){o=parseInt(n[1],10)-1;var l=parseInt(n[2],10)-1;return d(0,o,l)?u(t,o,l):new Date(NaN)}return null}(b,g);if(isNaN(w))return new Date(NaN);if(w){var _,k=w.getTime(),x=0;if(m.time&&(x=function(e){var t,n,o;if(t=a.HH.exec(e))return p(n=parseFloat(t[1].replace(",",".")))?n%24*r:NaN;if(t=a.HHMM.exec(e))return n=parseInt(t[1],10),o=parseFloat(t[2].replace(",",".")),p(n,o)?n%24*r+o*i:NaN;if(t=a.HHMMSS.exec(e)){n=parseInt(t[1],10),o=parseInt(t[2],10);var s=parseFloat(t[3].replace(",","."));return p(n,o,s)?n%24*r+o*i+1e3*s:NaN}return null}(m.time),isNaN(x)))return new Date(NaN);if(m.timezone){if(_=function(e){var t,n,o;if(t=a.timezoneZ.exec(e))return 0;if(t=a.timezoneHH.exec(e))return o=parseInt(t[2],10),v()?(n=o*r,"+"===t[1]?-n:n):NaN;if(t=a.timezoneHHMM.exec(e)){o=parseInt(t[2],10);var s=parseInt(t[3],10);return v(0,s)?(n=o*r+s*i,"+"===t[1]?-n:n):NaN}return 0}(m.timezone),isNaN(_))return new Date(NaN)}else _=n(new Date(k+x)),_=n(new Date(k+x+_));return new Date(k+x+_)}return new Date(NaN)}function u(e,t,n){t=t||0,n=n||0;var r=new Date(0);r.setUTCFullYear(e,0,4);var i=r.getUTCDay()||7,o=7*t+n+1-i;return r.setUTCDate(r.getUTCDate()+o),r}var c=[31,28,31,30,31,30,31,31,30,31,30,31],l=[31,29,31,30,31,30,31,31,30,31,30,31];function f(e){return e%400==0||e%4==0&&e%100!=0}function h(e,t,n){if(t<0||t>11)return!1;if(null!=n){if(n<1)return!1;var r=f(e);if(r&&n>l[t])return!1;if(!r&&n>c[t])return!1}return!0}function d(e,t,n){return!(t<0||t>52||null!=n&&(n<0||n>6))}function p(e,t,n){return!(null!=e&&(e<0||e>=25)||null!=t&&(t<0||t>=60)||null!=n&&(n<0||n>=60))}function v(e,t){return null==t||!(t<0||t>59)}function m(e,t){if(arguments.length<1)throw new TypeError("1 argument required, but only "+arguments.length+" present");var n=s(e,t);return!isNaN(n)}var y={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}};function g(e){return function(t){var n=t||{},r=n.width?String(n.width):e.defaultWidth,i=e.formats[r]||e.formats[e.defaultWidth];return i}}var b={date:g({formats:{full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},defaultWidth:"full"}),time:g({formats:{full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},defaultWidth:"full"}),dateTime:g({formats:{full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},defaultWidth:"full"})},w={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"};function _(e){return function(t,n){var r,i=n||{},o=i.width?String(i.width):e.defaultWidth,a=i.context?String(i.context):"standalone";r="formatting"===a&&e.formattingValues?e.formattingValues[o]||e.formattingValues[e.defaultFormattingWidth]:e.values[o]||e.values[e.defaultWidth];var s=e.argumentCallback?e.argumentCallback(t):t;return r[s]}}var k={ordinalNumber:function(e,t){var n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},era:_({values:{narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},defaultWidth:"wide"}),quarter:_({values:{narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},defaultWidth:"wide",argumentCallback:function(e){return Number(e)-1}}),month:_({values:{narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},defaultWidth:"wide"}),day:_({values:{narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},defaultWidth:"wide"}),dayPeriod:_({values:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},defaultWidth:"wide",formattingValues:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},defaulFormattingWidth:"wide"})};function x(e){return function(t,n){var r=String(t),i=n||{},o=i.width,a=o&&e.matchPatterns[o]||e.matchPatterns[e.defaultMatchWidth],s=r.match(a);if(!s)return null;var u,c=s[0],l=o&&e.parsePatterns[o]||e.parsePatterns[e.defaultParseWidth];return u="[object Array]"===Object.prototype.toString.call(l)?l.findIndex(function(e){return e.test(r)}):function(e,t){for(var n in e)if(e.hasOwnProperty(n)&&t(e[n]))return n}(l,function(e){return e.test(r)}),u=e.valueCallback?e.valueCallback(u):u,{value:u=i.valueCallback?i.valueCallback(u):u,rest:r.slice(c.length)}}}var E,T={ordinalNumber:(E={matchPattern:/^(\d+)(th|st|nd|rd)?/i,parsePattern:/\d+/i,valueCallback:function(e){return parseInt(e,10)}},function(e,t){var n=String(e),r=t||{},i=n.match(E.matchPattern);if(!i)return null;var o=i[0],a=n.match(E.parsePattern);if(!a)return null;var s=E.valueCallback?E.valueCallback(a[0]):a[0];return{value:s=r.valueCallback?r.valueCallback(s):s,rest:n.slice(o.length)}}),era:x({matchPatterns:{narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^b/i,/^(a|c)/i]},defaultParseWidth:"any"}),quarter:x({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},defaultMatchWidth:"wide",parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:"any",valueCallback:function(e){return e+1}}),month:x({matchPatterns:{narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},defaultParseWidth:"any"}),day:x({matchPatterns:{narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},defaultParseWidth:"any"}),dayPeriod:x({matchPatterns:{narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},defaultMatchWidth:"any",parsePatterns:{any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},defaultParseWidth:"any"})},A={formatDistance:function(e,t,n){var r;return n=n||{},r="string"==typeof y[e]?y[e]:1===t?y[e].one:y[e].other.replace("{{count}}",t),n.addSuffix?n.comparison>0?"in "+r:r+" ago":r},formatLong:b,formatRelative:function(e,t,n,r){return w[e]},localize:k,match:T,options:{weekStartsOn:0,firstWeekContainsDate:1}},S=864e5;function C(e,t){if(arguments.length<1)throw new TypeError("1 argument required, but only "+arguments.length+" present");var n=s(e,t),r=n.getUTCDay(),i=(r<1?7:0)+r-1;return n.setUTCDate(n.getUTCDate()-i),n.setUTCHours(0,0,0,0),n}function I(e,t){if(arguments.length<1)throw new TypeError("1 argument required, but only "+arguments.length+" present");var n=s(e,t),r=n.getUTCFullYear(),i=new Date(0);i.setUTCFullYear(r+1,0,4),i.setUTCHours(0,0,0,0);var o=C(i,t),a=new Date(0);a.setUTCFullYear(r,0,4),a.setUTCHours(0,0,0,0);var u=C(a,t);return n.getTime()>=o.getTime()?r+1:n.getTime()>=u.getTime()?r:r-1}var O=6048e5;function P(e,t){if(arguments.length<1)throw new TypeError("1 argument required, but only "+arguments.length+" present");var n=s(e,t),r=C(n,t).getTime()-function(e,t){if(arguments.length<1)throw new TypeError("1 argument required, but only "+arguments.length+" present");var n=I(e,t),r=new Date(0);return r.setUTCFullYear(n,0,4),r.setUTCHours(0,0,0,0),C(r,t)}(n,t).getTime();return Math.round(r/O)+1}function D(t,n){if(arguments.length<1)throw new TypeError("1 argument required, but only "+arguments.length+" present");var r=n||{},i=r.locale,o=i&&i.options&&i.options.weekStartsOn,a=null==o?0:e(o),u=null==r.weekStartsOn?a:e(r.weekStartsOn);if(!(u>=0&&u<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var c=s(t,r),l=c.getUTCDay(),f=(l<u?7:0)+l-u;return c.setUTCDate(c.getUTCDate()-f),c.setUTCHours(0,0,0,0),c}function L(t,n){if(arguments.length<1)throw new TypeError("1 argument required, but only "+arguments.length+" present");var r=s(t,n),i=r.getUTCFullYear(),o=n||{},a=o.locale,u=a&&a.options&&a.options.firstWeekContainsDate,c=null==u?1:e(u),l=null==o.firstWeekContainsDate?c:e(o.firstWeekContainsDate);if(!(l>=1&&l<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var f=new Date(0);f.setUTCFullYear(i+1,0,l),f.setUTCHours(0,0,0,0);var h=D(f,n),d=new Date(0);d.setUTCFullYear(i,0,l),d.setUTCHours(0,0,0,0);var p=D(d,n);return r.getTime()>=h.getTime()?i+1:r.getTime()>=p.getTime()?i:i-1}var M=6048e5;function j(t,n){if(arguments.length<1)throw new TypeError("1 argument required, but only "+arguments.length+" present");var r=s(t,n),i=D(r,n).getTime()-function(t,n){if(arguments.length<1)throw new TypeError("1 argument required, but only "+arguments.length+" present");var r=n||{},i=r.locale,o=i&&i.options&&i.options.firstWeekContainsDate,a=null==o?1:e(o),s=null==r.firstWeekContainsDate?a:e(r.firstWeekContainsDate),u=L(t,n),c=new Date(0);return c.setUTCFullYear(u,0,s),c.setUTCHours(0,0,0,0),D(c,n)}(r,n).getTime();return Math.round(i/M)+1}var N={am:"am",pm:"pm",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},R={G:function(e,t,n){var r=e.getUTCFullYear()>0?1:0;switch(t){case"G":case"GG":case"GGG":return n.era(r,{width:"abbreviated"});case"GGGGG":return n.era(r,{width:"narrow"});case"GGGG":default:return n.era(r,{width:"wide"})}},y:function(e,t,n,r){var i=e.getUTCFullYear(),o=i>0?i:1-i;if("yy"===t){var a=o%100;return F(a,2)}return"yo"===t?n.ordinalNumber(o,{unit:"year"}):F(o,t.length)},Y:function(e,t,n,r){var i=L(e,r),o=i>0?i:1-i;if("YY"===t){var a=o%100;return F(a,2)}return"Yo"===t?n.ordinalNumber(o,{unit:"year"}):F(o,t.length)},R:function(e,t,n,r){var i=I(e,r);return F(i,t.length)},u:function(e,t,n,r){var i=e.getUTCFullYear();return F(i,t.length)},Q:function(e,t,n,r){var i=Math.ceil((e.getUTCMonth()+1)/3);switch(t){case"Q":return String(i);case"QQ":return F(i,2);case"Qo":return n.ordinalNumber(i,{unit:"quarter"});case"QQQ":return n.quarter(i,{width:"abbreviated",context:"formatting"});case"QQQQQ":return n.quarter(i,{width:"narrow",context:"formatting"});case"QQQQ":default:return n.quarter(i,{width:"wide",context:"formatting"})}},q:function(e,t,n,r){var i=Math.ceil((e.getUTCMonth()+1)/3);switch(t){case"q":return String(i);case"qq":return F(i,2);case"qo":return n.ordinalNumber(i,{unit:"quarter"});case"qqq":return n.quarter(i,{width:"abbreviated",context:"standalone"});case"qqqqq":return n.quarter(i,{width:"narrow",context:"standalone"});case"qqqq":default:return n.quarter(i,{width:"wide",context:"standalone"})}},M:function(e,t,n,r){var i=e.getUTCMonth();switch(t){case"M":return String(i+1);case"MM":return F(i+1,2);case"Mo":return n.ordinalNumber(i+1,{unit:"month"});case"MMM":return n.month(i,{width:"abbreviated",context:"formatting"});case"MMMMM":return n.month(i,{width:"narrow",context:"formatting"});case"MMMM":default:return n.month(i,{width:"wide",context:"formatting"})}},L:function(e,t,n,r){var i=e.getUTCMonth();switch(t){case"L":return String(i+1);case"LL":return F(i+1,2);case"Lo":return n.ordinalNumber(i+1,{unit:"month"});case"LLL":return n.month(i,{width:"abbreviated",context:"standalone"});case"LLLLL":return n.month(i,{width:"narrow",context:"standalone"});case"LLLL":default:return n.month(i,{width:"wide",context:"standalone"})}},w:function(e,t,n,r){var i=j(e,r);return"wo"===t?n.ordinalNumber(i,{unit:"week"}):F(i,t.length)},I:function(e,t,n,r){var i=P(e,r);return"Io"===t?n.ordinalNumber(i,{unit:"week"}):F(i,t.length)},d:function(e,t,n,r){var i=e.getUTCDate();return"do"===t?n.ordinalNumber(i,{unit:"date"}):F(i,t.length)},D:function(e,t,n,r){var i=function(e,t){if(arguments.length<1)throw new TypeError("1 argument required, but only "+arguments.length+" present");var n=s(e,t),r=n.getTime();n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0);var i=n.getTime(),o=r-i;return Math.floor(o/S)+1}(e,r);return"Do"===t?n.ordinalNumber(i,{unit:"dayOfYear"}):F(i,t.length)},E:function(e,t,n,r){var i=e.getUTCDay();switch(t){case"E":case"EE":case"EEE":return n.day(i,{width:"abbreviated",context:"formatting"});case"EEEEE":return n.day(i,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(i,{width:"short",context:"formatting"});case"EEEE":default:return n.day(i,{width:"wide",context:"formatting"})}},e:function(e,t,n,r){var i=e.getUTCDay(),o=(i-r.weekStartsOn+8)%7||7;switch(t){case"e":return String(o);case"ee":return F(o,2);case"eo":return n.ordinalNumber(o,{unit:"day"});case"eee":return n.day(i,{width:"abbreviated",context:"formatting"});case"eeeee":return n.day(i,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(i,{width:"short",context:"formatting"});case"eeee":default:return n.day(i,{width:"wide",context:"formatting"})}},c:function(e,t,n,r){var i=e.getUTCDay(),o=(i-r.weekStartsOn+8)%7||7;switch(t){case"c":return String(o);case"cc":return F(o,t.length);case"co":return n.ordinalNumber(o,{unit:"day"});case"ccc":return n.day(i,{width:"abbreviated",context:"standalone"});case"ccccc":return n.day(i,{width:"narrow",context:"standalone"});case"cccccc":return n.day(i,{width:"short",context:"standalone"});case"cccc":default:return n.day(i,{width:"wide",context:"standalone"})}},i:function(e,t,n,r){var i=e.getUTCDay(),o=0===i?7:i;switch(t){case"i":return String(o);case"ii":return F(o,t.length);case"io":return n.ordinalNumber(o,{unit:"day"});case"iii":return n.day(i,{width:"abbreviated",context:"formatting"});case"iiiii":return n.day(i,{width:"narrow",context:"formatting"});case"iiiiii":return n.day(i,{width:"short",context:"formatting"});case"iiii":default:return n.day(i,{width:"wide",context:"formatting"})}},a:function(e,t,n){var r=e.getUTCHours(),i=r/12>=1?"pm":"am";switch(t){case"a":case"aa":case"aaa":return n.dayPeriod(i,{width:"abbreviated",context:"formatting"});case"aaaaa":return n.dayPeriod(i,{width:"narrow",context:"formatting"});case"aaaa":default:return n.dayPeriod(i,{width:"wide",context:"formatting"})}},b:function(e,t,n){var r,i=e.getUTCHours();switch(r=12===i?N.noon:0===i?N.midnight:i/12>=1?"pm":"am",t){case"b":case"bb":case"bbb":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"});case"bbbbb":return n.dayPeriod(r,{width:"narrow",context:"formatting"});case"bbbb":default:return n.dayPeriod(r,{width:"wide",context:"formatting"})}},B:function(e,t,n){var r,i=e.getUTCHours();switch(r=i>=17?N.evening:i>=12?N.afternoon:i>=4?N.morning:N.night,t){case"B":case"BB":case"BBB":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"});case"BBBBB":return n.dayPeriod(r,{width:"narrow",context:"formatting"});case"BBBB":default:return n.dayPeriod(r,{width:"wide",context:"formatting"})}},h:function(e,t,n,r){var i=e.getUTCHours()%12;return 0===i&&(i=12),"ho"===t?n.ordinalNumber(i,{unit:"hour"}):F(i,t.length)},H:function(e,t,n,r){var i=e.getUTCHours();return"Ho"===t?n.ordinalNumber(i,{unit:"hour"}):F(i,t.length)},K:function(e,t,n,r){var i=e.getUTCHours()%12;return"Ko"===t?n.ordinalNumber(i,{unit:"hour"}):F(i,t.length)},k:function(e,t,n,r){var i=e.getUTCHours();return 0===i&&(i=24),"ko"===t?n.ordinalNumber(i,{unit:"hour"}):F(i,t.length)},m:function(e,t,n,r){var i=e.getUTCMinutes();return"mo"===t?n.ordinalNumber(i,{unit:"minute"}):F(i,t.length)},s:function(e,t,n,r){var i=e.getUTCSeconds();return"so"===t?n.ordinalNumber(i,{unit:"second"}):F(i,t.length)},S:function(e,t,n,r){var i=t.length,o=e.getUTCMilliseconds(),a=Math.floor(o*Math.pow(10,i-3));return F(a,i)},X:function(e,t,n,r){var i=r._originalDate||e,o=i.getTimezoneOffset();if(0===o)return"Z";switch(t){case"X":return U(o);case"XXXX":case"XX":return B(o);case"XXXXX":case"XXX":default:return B(o,":")}},x:function(e,t,n,r){var i=r._originalDate||e,o=i.getTimezoneOffset();switch(t){case"x":return U(o);case"xxxx":case"xx":return B(o);case"xxxxx":case"xxx":default:return B(o,":")}},O:function(e,t,n,r){var i=r._originalDate||e,o=i.getTimezoneOffset();switch(t){case"O":case"OO":case"OOO":return"GMT"+z(o,":");case"OOOO":default:return"GMT"+B(o,":")}},z:function(e,t,n,r){var i=r._originalDate||e,o=i.getTimezoneOffset();switch(t){case"z":case"zz":case"zzz":return"GMT"+z(o,":");case"zzzz":default:return"GMT"+B(o,":")}},t:function(e,t,n,r){var i=r._originalDate||e,o=Math.floor(i.getTime()/1e3);return F(o,t.length)},T:function(e,t,n,r){var i=r._originalDate||e,o=i.getTime();return F(o,t.length)}};function F(e,t){for(var n=e<0?"-":"",r=Math.abs(e).toString();r.length<t;)r="0"+r;return n+r}function B(e,t){var n=t||"",r=e>0?"-":"+",i=Math.abs(e),o=F(Math.floor(i/60),2),a=F(i%60,2);return r+o+n+a}function U(e,t){if(e%60==0){var n=e>0?"-":"+";return n+F(Math.abs(e)/60,2)}return B(e,t)}function z(e,t){var n=e>0?"-":"+",r=Math.abs(e),i=Math.floor(r/60),o=r%60;if(0===o)return n+String(i);var a=t||"";return n+String(i)+a+F(o,2)}function $(e,t,n){switch(e){case"P":return t.date({width:"short"});case"PP":return t.date({width:"medium"});case"PPP":return t.date({width:"long"});case"PPPP":default:return t.date({width:"full"})}}function V(e,t,n){switch(e){case"p":return t.time({width:"short"});case"pp":return t.time({width:"medium"});case"ppp":return t.time({width:"long"});case"pppp":default:return t.time({width:"full"})}}var Y={p:V,P:function(e,t,n){var r,i=e.match(/(P+)(p+)?/),o=i[1],a=i[2];if(!a)return $(e,t);switch(o){case"P":r=t.dateTime({width:"short"});break;case"PP":r=t.dateTime({width:"medium"});break;case"PPP":r=t.dateTime({width:"long"});break;case"PPPP":default:r=t.dateTime({width:"full"})}return r.replace("{{date}}",$(o,t)).replace("{{time}}",V(a,t))}};function H(t,n,r){if(arguments.length<2)throw new TypeError("2 arguments required, but only "+arguments.length+" present");var i=e(n);return function(t,n,r){if(arguments.length<2)throw new TypeError("2 arguments required, but only "+arguments.length+" present");var i=s(t,r).getTime(),o=e(n);return new Date(i+o)}(t,-i,r)}var q=["D","DD","YY","YYYY"];function W(e){return-1!==q.indexOf(e)}function G(e){throw new RangeError("`options.awareOfUnicodeTokens` must be set to `true` to use `"+e+"` token; see: https://git.io/fxCyr")}var K=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,Q=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,Z=/^'(.*?)'?$/,J=/''/g;function X(t,r,i){if(arguments.length<2)throw new TypeError("2 arguments required, but only "+arguments.length+" present");var o=String(r),a=i||{},u=a.locale||A,c=u.options&&u.options.firstWeekContainsDate,l=null==c?1:e(c),f=null==a.firstWeekContainsDate?l:e(a.firstWeekContainsDate);if(!(f>=1&&f<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var h=u.options&&u.options.weekStartsOn,d=null==h?0:e(h),p=null==a.weekStartsOn?d:e(a.weekStartsOn);if(!(p>=0&&p<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(!u.localize)throw new RangeError("locale must contain localize property");if(!u.formatLong)throw new RangeError("locale must contain formatLong property");var v=s(t,a);if(!m(v,a))return"Invalid Date";var y=n(v),g=H(v,y,a),b={firstWeekContainsDate:f,weekStartsOn:p,locale:u,_originalDate:v},w=o.match(Q).map(function(e){var t=e[0];if("p"===t||"P"===t){var n=Y[t];return n(e,u.formatLong,b)}return e}).join("").match(K).map(function(e){if("''"===e)return"'";var t=e[0];if("'"===t)return e.match(Z)[1].replace(J,"'");var n=R[t];return n?(!a.awareOfUnicodeTokens&&W(e)&&G(e),n(g,e,u.localize,b)):e}).join("");return w}function ee(e,t,n){if(arguments.length<2)throw new TypeError("2 arguments required, but only "+arguments.length+" present");var r=s(e,n),i=s(t,n);return r.getTime()>i.getTime()}function te(e,t,n){if(arguments.length<2)throw new TypeError("2 arguments required, but only "+arguments.length+" present");var r=s(e,n),i=s(t,n);return r.getTime()<i.getTime()}function ne(e,t,n){if(arguments.length<2)throw new TypeError("2 arguments required, but only "+arguments.length+" present");var r=s(e,n),i=s(t,n);return r.getTime()===i.getTime()}function re(t,n,r){if(arguments.length<2)throw new TypeError("2 arguments required, but only "+arguments.length+" present");var i=r||{},o=i.locale,a=o&&o.options&&o.options.weekStartsOn,u=null==a?0:e(a),c=null==i.weekStartsOn?u:e(i.weekStartsOn);if(!(c>=0&&c<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var l=s(t,r),f=e(n),h=l.getUTCDay(),d=f%7,p=(d+7)%7,v=(p<c?7:0)+f-h;return l.setUTCDate(l.getUTCDate()+v),l}var ie=36e5,oe=6e4,ae=1e3,se={month:/^(1[0-2]|0?\d)/,date:/^(3[0-1]|[0-2]?\d)/,dayOfYear:/^(36[0-6]|3[0-5]\d|[0-2]?\d?\d)/,week:/^(5[0-3]|[0-4]?\d)/,hour23h:/^(2[0-3]|[0-1]?\d)/,hour24h:/^(2[0-4]|[0-1]?\d)/,hour11h:/^(1[0-1]|0?\d)/,hour12h:/^(1[0-2]|0?\d)/,minute:/^[0-5]?\d/,second:/^[0-5]?\d/,singleDigit:/^\d/,twoDigits:/^\d{1,2}/,threeDigits:/^\d{1,3}/,fourDigits:/^\d{1,4}/,anyDigitsSigned:/^-?\d+/,singleDigitSigned:/^-?\d/,twoDigitsSigned:/^-?\d{1,2}/,threeDigitsSigned:/^-?\d{1,3}/,fourDigitsSigned:/^-?\d{1,4}/},ue={basicOptionalMinutes:/^([+-])(\d{2})(\d{2})?|Z/,basic:/^([+-])(\d{2})(\d{2})|Z/,basicOptionalSeconds:/^([+-])(\d{2})(\d{2})((\d{2}))?|Z/,extended:/^([+-])(\d{2}):(\d{2})|Z/,extendedOptionalSeconds:/^([+-])(\d{2}):(\d{2})(:(\d{2}))?|Z/};function ce(e,t,n){var r=t.match(e);if(!r)return null;var i=parseInt(r[0],10);return{value:n?n(i):i,rest:t.slice(r[0].length)}}function le(e,t){var n=t.match(e);if(!n)return null;if("Z"===n[0])return{value:0,rest:t.slice(1)};var r="+"===n[1]?1:-1,i=n[2]?parseInt(n[2],10):0,o=n[3]?parseInt(n[3],10):0,a=n[5]?parseInt(n[5],10):0;return{value:r*(i*ie+o*oe+a*ae),rest:t.slice(n[0].length)}}function fe(e,t){return ce(se.anyDigitsSigned,e,t)}function he(e,t,n){switch(e){case 1:return ce(se.singleDigit,t,n);case 2:return ce(se.twoDigits,t,n);case 3:return ce(se.threeDigits,t,n);case 4:return ce(se.fourDigits,t,n);default:return ce(new RegExp("^\\d{1,"+e+"}"),t,n)}}function de(e,t,n){switch(e){case 1:return ce(se.singleDigitSigned,t,n);case 2:return ce(se.twoDigitsSigned,t,n);case 3:return ce(se.threeDigitsSigned,t,n);case 4:return ce(se.fourDigitsSigned,t,n);default:return ce(new RegExp("^-?\\d{1,"+e+"}"),t,n)}}function pe(e){switch(e){case"morning":return 4;case"evening":return 17;case"pm":case"noon":case"afternoon":return 12;case"am":case"midnight":case"night":default:return 0}}function ve(e,t){var n,r=t>0,i=r?t:1-t;if(i<=50)n=e||100;else{var o=i+50,a=100*Math.floor(o/100),s=e>=o%100;n=e+a-(s?100:0)}return r?n:1-n}var me=[31,28,31,30,31,30,31,31,30,31,30,31],ye=[31,29,31,30,31,30,31,31,30,31,30,31];function ge(e){return e%400==0||e%4==0&&e%100!=0}var be={G:{priority:140,parse:function(e,t,n,r){switch(t){case"G":case"GG":case"GGG":return n.era(e,{width:"abbreviated"})||n.era(e,{width:"narrow"});case"GGGGG":return n.era(e,{width:"narrow"});case"GGGG":default:return n.era(e,{width:"wide"})||n.era(e,{width:"abbreviated"})||n.era(e,{width:"narrow"})}},set:function(e,t,n){return e.setUTCFullYear(1===t?10:-9,0,1),e.setUTCHours(0,0,0,0),e}},y:{priority:130,parse:function(e,t,n,r){var i=function(e){return{year:e,isTwoDigitYear:"yy"===t}};switch(t){case"y":return he(4,e,i);case"yo":return n.ordinalNumber(e,{unit:"year",valueCallback:i});default:return he(t.length,e,i)}},validate:function(e,t,n){return t.isTwoDigitYear||t.year>0},set:function(e,t,n){var r=L(e,n);if(t.isTwoDigitYear){var i=ve(t.year,r);return e.setUTCFullYear(i,0,1),e.setUTCHours(0,0,0,0),e}var o=r>0?t.year:1-t.year;return e.setUTCFullYear(o,0,1),e.setUTCHours(0,0,0,0),e}},Y:{priority:130,parse:function(e,t,n,r){var i=function(e){return{year:e,isTwoDigitYear:"YY"===t}};switch(t){case"Y":return he(4,e,i);case"Yo":return n.ordinalNumber(e,{unit:"year",valueCallback:i});default:return he(t.length,e,i)}},validate:function(e,t,n){return t.isTwoDigitYear||t.year>0},set:function(e,t,n){var r=e.getUTCFullYear();if(t.isTwoDigitYear){var i=ve(t.year,r);return e.setUTCFullYear(i,0,n.firstWeekContainsDate),e.setUTCHours(0,0,0,0),D(e,n)}var o=r>0?t.year:1-t.year;return e.setUTCFullYear(o,0,n.firstWeekContainsDate),e.setUTCHours(0,0,0,0),D(e,n)}},R:{priority:130,parse:function(e,t,n,r){return de("R"===t?4:t.length,e)},set:function(e,t,n){var r=new Date(0);return r.setUTCFullYear(t,0,4),r.setUTCHours(0,0,0,0),C(r)}},u:{priority:130,parse:function(e,t,n,r){return de("u"===t?4:t.length,e)},set:function(e,t,n){return e.setUTCFullYear(t,0,1),e.setUTCHours(0,0,0,0),e}},Q:{priority:120,parse:function(e,t,n,r){switch(t){case"Q":case"QQ":return he(t.length,e);case"Qo":return n.ordinalNumber(e,{unit:"quarter"});case"QQQ":return n.quarter(e,{width:"abbreviated",context:"formatting"})||n.quarter(e,{width:"narrow",context:"formatting"});case"QQQQQ":return n.quarter(e,{width:"narrow",context:"formatting"});case"QQQQ":default:return n.quarter(e,{width:"wide",context:"formatting"})||n.quarter(e,{width:"abbreviated",context:"formatting"})||n.quarter(e,{width:"narrow",context:"formatting"})}},validate:function(e,t,n){return t>=1&&t<=4},set:function(e,t,n){return e.setUTCMonth(3*(t-1),1),e.setUTCHours(0,0,0,0),e}},q:{priority:120,parse:function(e,t,n,r){switch(t){case"q":case"qq":return he(t.length,e);case"qo":return n.ordinalNumber(e,{unit:"quarter"});case"qqq":return n.quarter(e,{width:"abbreviated",context:"standalone"})||n.quarter(e,{width:"narrow",context:"standalone"});case"qqqqq":return n.quarter(e,{width:"narrow",context:"standalone"});case"qqqq":default:return n.quarter(e,{width:"wide",context:"standalone"})||n.quarter(e,{width:"abbreviated",context:"standalone"})||n.quarter(e,{width:"narrow",context:"standalone"})}},validate:function(e,t,n){return t>=1&&t<=4},set:function(e,t,n){return e.setUTCMonth(3*(t-1),1),e.setUTCHours(0,0,0,0),e}},M:{priority:110,parse:function(e,t,n,r){var i=function(e){return e-1};switch(t){case"M":return ce(se.month,e,i);case"MM":return he(2,e,i);case"Mo":return n.ordinalNumber(e,{unit:"month",valueCallback:i});case"MMM":return n.month(e,{width:"abbreviated",context:"formatting"})||n.month(e,{width:"narrow",context:"formatting"});case"MMMMM":return n.month(e,{width:"narrow",context:"formatting"});case"MMMM":default:return n.month(e,{width:"wide",context:"formatting"})||n.month(e,{width:"abbreviated",context:"formatting"})||n.month(e,{width:"narrow",context:"formatting"})}},validate:function(e,t,n){return t>=0&&t<=11},set:function(e,t,n){return e.setUTCMonth(t,1),e.setUTCHours(0,0,0,0),e}},L:{priority:110,parse:function(e,t,n,r){var i=function(e){return e-1};switch(t){case"L":return ce(se.month,e,i);case"LL":return he(2,e,i);case"Lo":return n.ordinalNumber(e,{unit:"month",valueCallback:i});case"LLL":return n.month(e,{width:"abbreviated",context:"standalone"})||n.month(e,{width:"narrow",context:"standalone"});case"LLLLL":return n.month(e,{width:"narrow",context:"standalone"});case"LLLL":default:return n.month(e,{width:"wide",context:"standalone"})||n.month(e,{width:"abbreviated",context:"standalone"})||n.month(e,{width:"narrow",context:"standalone"})}},validate:function(e,t,n){return t>=0&&t<=11},set:function(e,t,n){return e.setUTCMonth(t,1),e.setUTCHours(0,0,0,0),e}},w:{priority:100,parse:function(e,t,n,r){switch(t){case"w":return ce(se.week,e);case"wo":return n.ordinalNumber(e,{unit:"week"});default:return he(t.length,e)}},validate:function(e,t,n){return t>=1&&t<=53},set:function(t,n,r){return D(function(t,n,r){if(arguments.length<2)throw new TypeError("2 arguments required, but only "+arguments.length+" present");var i=s(t,r),o=e(n),a=j(i,r)-o;return i.setUTCDate(i.getUTCDate()-7*a),i}(t,n,r),r)}},I:{priority:100,parse:function(e,t,n,r){switch(t){case"I":return ce(se.week,e);case"Io":return n.ordinalNumber(e,{unit:"week"});default:return he(t.length,e)}},validate:function(e,t,n){return t>=1&&t<=53},set:function(t,n,r){return C(function(t,n,r){if(arguments.length<2)throw new TypeError("2 arguments required, but only "+arguments.length+" present");var i=s(t,r),o=e(n),a=P(i,r)-o;return i.setUTCDate(i.getUTCDate()-7*a),i}(t,n,r),r)}},d:{priority:90,parse:function(e,t,n,r){switch(t){case"d":return ce(se.date,e);case"do":return n.ordinalNumber(e,{unit:"date"});default:return he(t.length,e)}},validate:function(e,t,n){var r=e.getUTCFullYear(),i=ge(r),o=e.getUTCMonth();return i?t>=1&&t<=ye[o]:t>=1&&t<=me[o]},set:function(e,t,n){return e.setUTCDate(t),e.setUTCHours(0,0,0,0),e}},D:{priority:90,parse:function(e,t,n,r){switch(t){case"D":case"DD":return ce(se.dayOfYear,e);case"Do":return n.ordinalNumber(e,{unit:"date"});default:return he(t.length,e)}},validate:function(e,t,n){var r=e.getUTCFullYear(),i=ge(r);return i?t>=1&&t<=366:t>=1&&t<=365},set:function(e,t,n){return e.setUTCMonth(0,t),e.setUTCHours(0,0,0,0),e}},E:{priority:90,parse:function(e,t,n,r){switch(t){case"E":case"EE":case"EEE":return n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"EEEEE":return n.day(e,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"EEEE":default:return n.day(e,{width:"wide",context:"formatting"})||n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"})}},validate:function(e,t,n){return t>=0&&t<=6},set:function(e,t,n){return(e=re(e,t,n)).setUTCHours(0,0,0,0),e}},e:{priority:90,parse:function(e,t,n,r){var i=function(e){var t=7*Math.floor((e-1)/7);return(e+r.weekStartsOn+6)%7+t};switch(t){case"e":case"ee":return he(t.length,e,i);case"eo":return n.ordinalNumber(e,{unit:"day",valueCallback:i});case"eee":return n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"eeeee":return n.day(e,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"eeee":default:return n.day(e,{width:"wide",context:"formatting"})||n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"})}},validate:function(e,t,n){return t>=0&&t<=6},set:function(e,t,n){return(e=re(e,t,n)).setUTCHours(0,0,0,0),e}},c:{priority:90,parse:function(e,t,n,r){var i=function(e){var t=7*Math.floor((e-1)/7);return(e+r.weekStartsOn+6)%7+t};switch(t){case"c":case"cc":return he(t.length,e,i);case"co":return n.ordinalNumber(e,{unit:"day",valueCallback:i});case"ccc":return n.day(e,{width:"abbreviated",context:"standalone"})||n.day(e,{width:"short",context:"standalone"})||n.day(e,{width:"narrow",context:"standalone"});case"ccccc":return n.day(e,{width:"narrow",context:"standalone"});case"cccccc":return n.day(e,{width:"short",context:"standalone"})||n.day(e,{width:"narrow",context:"standalone"});case"cccc":default:return n.day(e,{width:"wide",context:"standalone"})||n.day(e,{width:"abbreviated",context:"standalone"})||n.day(e,{width:"short",context:"standalone"})||n.day(e,{width:"narrow",context:"standalone"})}},validate:function(e,t,n){return t>=0&&t<=6},set:function(e,t,n){return(e=re(e,t,n)).setUTCHours(0,0,0,0),e}},i:{priority:90,parse:function(e,t,n,r){var i=function(e){return 0===e?7:e};switch(t){case"i":case"ii":return he(t.length,e);case"io":return n.ordinalNumber(e,{unit:"day"});case"iii":return n.day(e,{width:"abbreviated",context:"formatting",valueCallback:i})||n.day(e,{width:"short",context:"formatting",valueCallback:i})||n.day(e,{width:"narrow",context:"formatting",valueCallback:i});case"iiiii":return n.day(e,{width:"narrow",context:"formatting",valueCallback:i});case"iiiiii":return n.day(e,{width:"short",context:"formatting",valueCallback:i})||n.day(e,{width:"narrow",context:"formatting",valueCallback:i});case"iiii":default:return n.day(e,{width:"wide",context:"formatting",valueCallback:i})||n.day(e,{width:"abbreviated",context:"formatting",valueCallback:i})||n.day(e,{width:"short",context:"formatting",valueCallback:i})||n.day(e,{width:"narrow",context:"formatting",valueCallback:i})}},validate:function(e,t,n){return t>=1&&t<=7},set:function(t,n,r){return(t=function(t,n,r){if(arguments.length<2)throw new TypeError("2 arguments required, but only "+arguments.length+" present");var i=e(n);i%7==0&&(i-=7);var o=s(t,r),a=o.getUTCDay(),u=((i%7+7)%7<1?7:0)+i-a;return o.setUTCDate(o.getUTCDate()+u),o}(t,n,r)).setUTCHours(0,0,0,0),t}},a:{priority:80,parse:function(e,t,n,r){switch(t){case"a":case"aa":case"aaa":return n.dayPeriod(e,{width:"abbreviated",context:"formatting"})||n.dayPeriod(e,{width:"narrow",context:"formatting"});case"aaaaa":return n.dayPeriod(e,{width:"narrow",context:"formatting"});case"aaaa":default:return n.dayPeriod(e,{width:"wide",context:"formatting"})||n.dayPeriod(e,{width:"abbreviated",context:"formatting"})||n.dayPeriod(e,{width:"narrow",context:"formatting"})}},set:function(e,t,n){return e.setUTCHours(pe(t),0,0,0),e}},b:{priority:80,parse:function(e,t,n,r){switch(t){case"b":case"bb":case"bbb":return n.dayPeriod(e,{width:"abbreviated",context:"formatting"})||n.dayPeriod(e,{width:"narrow",context:"formatting"});case"bbbbb":return n.dayPeriod(e,{width:"narrow",context:"formatting"});case"bbbb":default:return n.dayPeriod(e,{width:"wide",context:"formatting"})||n.dayPeriod(e,{width:"abbreviated",context:"formatting"})||n.dayPeriod(e,{width:"narrow",context:"formatting"})}},set:function(e,t,n){return e.setUTCHours(pe(t),0,0,0),e}},B:{priority:80,parse:function(e,t,n,r){switch(t){case"B":case"BB":case"BBB":return n.dayPeriod(e,{width:"abbreviated",context:"formatting"})||n.dayPeriod(e,{width:"narrow",context:"formatting"});case"BBBBB":return n.dayPeriod(e,{width:"narrow",context:"formatting"});case"BBBB":default:return n.dayPeriod(e,{width:"wide",context:"formatting"})||n.dayPeriod(e,{width:"abbreviated",context:"formatting"})||n.dayPeriod(e,{width:"narrow",context:"formatting"})}},set:function(e,t,n){return e.setUTCHours(pe(t),0,0,0),e}},h:{priority:70,parse:function(e,t,n,r){switch(t){case"h":return ce(se.hour12h,e);case"ho":return n.ordinalNumber(e,{unit:"hour"});default:return he(t.length,e)}},validate:function(e,t,n){return t>=1&&t<=12},set:function(e,t,n){var r=e.getUTCHours()>=12;return r&&t<12?e.setUTCHours(t+12,0,0,0):r||12!==t?e.setUTCHours(t,0,0,0):e.setUTCHours(0,0,0,0),e}},H:{priority:70,parse:function(e,t,n,r){switch(t){case"H":return ce(se.hour23h,e);case"Ho":return n.ordinalNumber(e,{unit:"hour"});default:return he(t.length,e)}},validate:function(e,t,n){return t>=0&&t<=23},set:function(e,t,n){return e.setUTCHours(t,0,0,0),e}},K:{priority:70,parse:function(e,t,n,r){switch(t){case"K":return ce(se.hour11h,e);case"Ko":return n.ordinalNumber(e,{unit:"hour"});default:return he(t.length,e)}},validate:function(e,t,n){return t>=0&&t<=11},set:function(e,t,n){var r=e.getUTCHours()>=12;return r&&t<12?e.setUTCHours(t+12,0,0,0):e.setUTCHours(t,0,0,0),e}},k:{priority:70,parse:function(e,t,n,r){switch(t){case"k":return ce(se.hour24h,e);case"ko":return n.ordinalNumber(e,{unit:"hour"});default:return he(t.length,e)}},validate:function(e,t,n){return t>=1&&t<=24},set:function(e,t,n){var r=t<=24?t%24:t;return e.setUTCHours(r,0,0,0),e}},m:{priority:60,parse:function(e,t,n,r){switch(t){case"m":return ce(se.minute,e);case"mo":return n.ordinalNumber(e,{unit:"minute"});default:return he(t.length,e)}},validate:function(e,t,n){return t>=0&&t<=59},set:function(e,t,n){return e.setUTCMinutes(t,0,0),e}},s:{priority:50,parse:function(e,t,n,r){switch(t){case"s":return ce(se.second,e);case"so":return n.ordinalNumber(e,{unit:"second"});default:return he(t.length,e)}},validate:function(e,t,n){return t>=0&&t<=59},set:function(e,t,n){return e.setUTCSeconds(t,0),e}},S:{priority:40,parse:function(e,t,n,r){return he(t.length,e,function(e){return Math.floor(e*Math.pow(10,3-t.length))})},set:function(e,t,n){return e.setUTCMilliseconds(t),e}},X:{priority:20,parse:function(e,t,n,r){switch(t){case"X":return le(ue.basicOptionalMinutes,e);case"XX":return le(ue.basic,e);case"XXXX":return le(ue.basicOptionalSeconds,e);case"XXXXX":return le(ue.extendedOptionalSeconds,e);case"XXX":default:return le(ue.extended,e)}},set:function(e,t,n){return new Date(e.getTime()-t)}},x:{priority:20,parse:function(e,t,n,r){switch(t){case"x":return le(ue.basicOptionalMinutes,e);case"xx":return le(ue.basic,e);case"xxxx":return le(ue.basicOptionalSeconds,e);case"xxxxx":return le(ue.extendedOptionalSeconds,e);case"xxx":default:return le(ue.extended,e)}},set:function(e,t,n){return new Date(e.getTime()-t)}},t:{priority:10,parse:function(e,t,n,r){return fe(e)},set:function(e,t,n){return new Date(1e3*t)}},T:{priority:10,parse:function(e,t,n,r){return fe(e)},set:function(e,t,n){return new Date(t)}}},we=20,_e=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,ke=/^'(.*?)'?$/,xe=/''/g,Ee=/\S/;function Te(e){var t=new Date(0);return t.setFullYear(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()),t.setHours(e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()),t}function Ae(t,r){if("string"!=typeof t)return m(t)?t:null;var i=function(t,r,i,o){if(arguments.length<3)throw new TypeError("3 arguments required, but only "+arguments.length+" present");var a=String(t),u=String(r),c=o||{},l=c.locale||A;if(!l.match)throw new RangeError("locale must contain match property");var f=l.options&&l.options.firstWeekContainsDate,h=null==f?1:e(f),d=null==c.firstWeekContainsDate?h:e(c.firstWeekContainsDate);if(!(d>=1&&d<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var p=l.options&&l.options.weekStartsOn,v=null==p?0:e(p),m=null==c.weekStartsOn?v:e(c.weekStartsOn);if(!(m>=0&&m<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(""===u)return""===a?s(i,c):new Date(NaN);var y,g={firstWeekContainsDate:d,weekStartsOn:m,locale:l},b=[{priority:we,set:Te,index:0}],w=u.match(_e);for(y=0;y<w.length;y++){var _=w[y];!c.awareOfUnicodeTokens&&W(_)&&G(_);var k=_[0],x=be[k];if(x){var E=x.parse(a,_,l.match,g);if(!E)return new Date(NaN);b.push({priority:x.priority,set:x.set,validate:x.validate,value:E.value,index:b.length}),a=E.rest}else{if("''"===_?_="'":"'"===k&&(_=_.match(ke)[1].replace(xe,"'")),0!==a.indexOf(_))return new Date(NaN);a=a.slice(_.length)}}if(a.length>0&&Ee.test(a))return new Date(NaN);var T=b.map(function(e){return e.priority}).sort(function(e,t){return t-e}).filter(function(e,t,n){return n.indexOf(e)===t}).map(function(e){return b.filter(function(t){return t.priority===e}).reverse()}).map(function(e){return e[0]}),S=s(i,c);if(isNaN(S))return new Date(NaN);var C=H(S,n(S));for(y=0;y<T.length;y++){var I=T[y];if(I.validate&&!I.validate(C,I.value,g))return new Date(NaN);C=I.set(C,I.value,g)}return C}(t,r,new Date);return m(i)&&X(i,r)===t?i:null}var Se={validate:function(e,t){void 0===t&&(t={});var n=t.targetValue,r=t.inclusion;void 0===r&&(r=!1);var i=t.format;return void 0===i&&(i=r,r=!1),e=Ae(e,i),n=Ae(n,i),!(!e||!n)&&(ee(e,n)||r&&ne(e,n))},options:{hasTarget:!0,isDate:!0},paramNames:["targetValue","inclusion","format"]},Ce={en:/^[A-Z]*$/i,cs:/^[A-ZÃ�ÄŒÄŽÃ‰ÄšÃ�Å‡Ã“Å˜Å Å¤ÃšÅ®Ã�Å½]*$/i,da:/^[A-ZÃ†Ã˜Ã…]*$/i,de:/^[A-ZÃ„Ã–ÃœÃŸ]*$/i,es:/^[A-ZÃ�Ã‰Ã�Ã‘Ã“ÃšÃœ]*$/i,fr:/^[A-ZÃ€Ã‚Ã†Ã‡Ã‰ÃˆÃŠÃ‹Ã�ÃŽÃ”Å’Ã™Ã›ÃœÅ¸]*$/i,it:/^[A-Z\xC0-\xFF]*$/i,lt:/^[A-ZÄ„ÄŒÄ˜Ä–Ä®Å Å²ÅªÅ½]*$/i,nl:/^[A-ZÃ‰Ã‹Ã�Ã“Ã–Ãœ]*$/i,hu:/^[A-ZÃ�Ã‰Ã�Ã“Ã–Å�ÃšÃœÅ°]*$/i,pl:/^[A-ZÄ„Ä†Ä˜ÅšÅ�ÅƒÃ“Å»Å¹]*$/i,pt:/^[A-ZÃƒÃ�Ã€Ã‚Ã‡Ã‰ÃŠÃ�Ã•Ã“Ã”ÃšÃœ]*$/i,ru:/^[Ð�-Ð¯Ð�]*$/i,sk:/^[A-ZÃ�Ã„ÄŒÄŽÃ‰Ã�Ä¹Ä½Å‡Ã“Å”Å Å¤ÃšÃ�Å½]*$/i,sr:/^[A-ZÄŒÄ†Å½Å Ä�]*$/i,sv:/^[A-ZÃ…Ã„Ã–]*$/i,tr:/^[A-ZÃ‡ÄžÄ°Ä±Ã–ÅžÃœ]*$/i,uk:/^[Ð�-Ð©Ð¬Ð®Ð¯Ð„Ð†Ð‡Ò�]*$/i,ar:/^[Ø¡Ø¢Ø£Ø¤Ø¥Ø¦Ø§Ø¨Ø©ØªØ«Ø¬Ø­Ø®Ø¯Ø°Ø±Ø²Ø³Ø´ØµØ¶Ø·Ø¸Ø¹ØºÙ�Ù‚ÙƒÙ„Ù…Ù†Ù‡ÙˆÙ‰ÙŠÙ‹ÙŒÙ�ÙŽÙ�Ù�Ù‘Ù’Ù°]*$/,az:/^[A-ZÃ‡Æ�ÄžÄ°Ä±Ã–ÅžÃœ]*$/i},Ie={en:/^[A-Z\s]*$/i,cs:/^[A-ZÃ�ÄŒÄŽÃ‰ÄšÃ�Å‡Ã“Å˜Å Å¤ÃšÅ®Ã�Å½\s]*$/i,da:/^[A-ZÃ†Ã˜Ã…\s]*$/i,de:/^[A-ZÃ„Ã–ÃœÃŸ\s]*$/i,es:/^[A-ZÃ�Ã‰Ã�Ã‘Ã“ÃšÃœ\s]*$/i,fr:/^[A-ZÃ€Ã‚Ã†Ã‡Ã‰ÃˆÃŠÃ‹Ã�ÃŽÃ”Å’Ã™Ã›ÃœÅ¸\s]*$/i,it:/^[A-Z\xC0-\xFF\s]*$/i,lt:/^[A-ZÄ„ÄŒÄ˜Ä–Ä®Å Å²ÅªÅ½\s]*$/i,nl:/^[A-ZÃ‰Ã‹Ã�Ã“Ã–Ãœ\s]*$/i,hu:/^[A-ZÃ�Ã‰Ã�Ã“Ã–Å�ÃšÃœÅ°\s]*$/i,pl:/^[A-ZÄ„Ä†Ä˜ÅšÅ�ÅƒÃ“Å»Å¹\s]*$/i,pt:/^[A-ZÃƒÃ�Ã€Ã‚Ã‡Ã‰ÃŠÃ�Ã•Ã“Ã”ÃšÃœ\s]*$/i,ru:/^[Ð�-Ð¯Ð�\s]*$/i,sk:/^[A-ZÃ�Ã„ÄŒÄŽÃ‰Ã�Ä¹Ä½Å‡Ã“Å”Å Å¤ÃšÃ�Å½\s]*$/i,sr:/^[A-ZÄŒÄ†Å½Å Ä�\s]*$/i,sv:/^[A-ZÃ…Ã„Ã–\s]*$/i,tr:/^[A-ZÃ‡ÄžÄ°Ä±Ã–ÅžÃœ\s]*$/i,uk:/^[Ð�-Ð©Ð¬Ð®Ð¯Ð„Ð†Ð‡Ò�\s]*$/i,ar:/^[Ø¡Ø¢Ø£Ø¤Ø¥Ø¦Ø§Ø¨Ø©ØªØ«Ø¬Ø­Ø®Ø¯Ø°Ø±Ø²Ø³Ø´ØµØ¶Ø·Ø¸Ø¹ØºÙ�Ù‚ÙƒÙ„Ù…Ù†Ù‡ÙˆÙ‰ÙŠÙ‹ÙŒÙ�ÙŽÙ�Ù�Ù‘Ù’Ù°\s]*$/,az:/^[A-ZÃ‡Æ�ÄžÄ°Ä±Ã–ÅžÃœ\s]*$/i},Oe={en:/^[0-9A-Z]*$/i,cs:/^[0-9A-ZÃ�ÄŒÄŽÃ‰ÄšÃ�Å‡Ã“Å˜Å Å¤ÃšÅ®Ã�Å½]*$/i,da:/^[0-9A-ZÃ†Ã˜Ã…]$/i,de:/^[0-9A-ZÃ„Ã–ÃœÃŸ]*$/i,es:/^[0-9A-ZÃ�Ã‰Ã�Ã‘Ã“ÃšÃœ]*$/i,fr:/^[0-9A-ZÃ€Ã‚Ã†Ã‡Ã‰ÃˆÃŠÃ‹Ã�ÃŽÃ”Å’Ã™Ã›ÃœÅ¸]*$/i,it:/^[0-9A-Z\xC0-\xFF]*$/i,lt:/^[0-9A-ZÄ„ÄŒÄ˜Ä–Ä®Å Å²ÅªÅ½]*$/i,hu:/^[0-9A-ZÃ�Ã‰Ã�Ã“Ã–Å�ÃšÃœÅ°]*$/i,nl:/^[0-9A-ZÃ‰Ã‹Ã�Ã“Ã–Ãœ]*$/i,pl:/^[0-9A-ZÄ„Ä†Ä˜ÅšÅ�ÅƒÃ“Å»Å¹]*$/i,pt:/^[0-9A-ZÃƒÃ�Ã€Ã‚Ã‡Ã‰ÃŠÃ�Ã•Ã“Ã”ÃšÃœ]*$/i,ru:/^[0-9Ð�-Ð¯Ð�]*$/i,sk:/^[0-9A-ZÃ�Ã„ÄŒÄŽÃ‰Ã�Ä¹Ä½Å‡Ã“Å”Å Å¤ÃšÃ�Å½]*$/i,sr:/^[0-9A-ZÄŒÄ†Å½Å Ä�]*$/i,sv:/^[0-9A-ZÃ…Ã„Ã–]*$/i,tr:/^[0-9A-ZÃ‡ÄžÄ°Ä±Ã–ÅžÃœ]*$/i,uk:/^[0-9Ð�-Ð©Ð¬Ð®Ð¯Ð„Ð†Ð‡Ò�]*$/i,ar:/^[Ù Ù¡Ù¢Ù£Ù¤Ù¥Ù¦Ù§Ù¨Ù©0-9Ø¡Ø¢Ø£Ø¤Ø¥Ø¦Ø§Ø¨Ø©ØªØ«Ø¬Ø­Ø®Ø¯Ø°Ø±Ø²Ø³Ø´ØµØ¶Ø·Ø¸Ø¹ØºÙ�Ù‚ÙƒÙ„Ù…Ù†Ù‡ÙˆÙ‰ÙŠÙ‹ÙŒÙ�ÙŽÙ�Ù�Ù‘Ù’Ù°]*$/,az:/^[0-9A-ZÃ‡Æ�ÄžÄ°Ä±Ã–ÅžÃœ]*$/i},Pe={en:/^[0-9A-Z_-]*$/i,cs:/^[0-9A-ZÃ�ÄŒÄŽÃ‰ÄšÃ�Å‡Ã“Å˜Å Å¤ÃšÅ®Ã�Å½_-]*$/i,da:/^[0-9A-ZÃ†Ã˜Ã…_-]*$/i,de:/^[0-9A-ZÃ„Ã–ÃœÃŸ_-]*$/i,es:/^[0-9A-ZÃ�Ã‰Ã�Ã‘Ã“ÃšÃœ_-]*$/i,fr:/^[0-9A-ZÃ€Ã‚Ã†Ã‡Ã‰ÃˆÃŠÃ‹Ã�ÃŽÃ”Å’Ã™Ã›ÃœÅ¸_-]*$/i,it:/^[0-9A-Z\xC0-\xFF_-]*$/i,lt:/^[0-9A-ZÄ„ÄŒÄ˜Ä–Ä®Å Å²ÅªÅ½_-]*$/i,nl:/^[0-9A-ZÃ‰Ã‹Ã�Ã“Ã–Ãœ_-]*$/i,hu:/^[0-9A-ZÃ�Ã‰Ã�Ã“Ã–Å�ÃšÃœÅ°_-]*$/i,pl:/^[0-9A-ZÄ„Ä†Ä˜ÅšÅ�ÅƒÃ“Å»Å¹_-]*$/i,pt:/^[0-9A-ZÃƒÃ�Ã€Ã‚Ã‡Ã‰ÃŠÃ�Ã•Ã“Ã”ÃšÃœ_-]*$/i,ru:/^[0-9Ð�-Ð¯Ð�_-]*$/i,sk:/^[0-9A-ZÃ�Ã„ÄŒÄŽÃ‰Ã�Ä¹Ä½Å‡Ã“Å”Å Å¤ÃšÃ�Å½_-]*$/i,sr:/^[0-9A-ZÄŒÄ†Å½Å Ä�_-]*$/i,sv:/^[0-9A-ZÃ…Ã„Ã–_-]*$/i,tr:/^[0-9A-ZÃ‡ÄžÄ°Ä±Ã–ÅžÃœ_-]*$/i,uk:/^[0-9Ð�-Ð©Ð¬Ð®Ð¯Ð„Ð†Ð‡Ò�_-]*$/i,ar:/^[Ù Ù¡Ù¢Ù£Ù¤Ù¥Ù¦Ù§Ù¨Ù©0-9Ø¡Ø¢Ø£Ø¤Ø¥Ø¦Ø§Ø¨Ø©ØªØ«Ø¬Ø­Ø®Ø¯Ø°Ø±Ø²Ø³Ø´ØµØ¶Ø·Ø¸Ø¹ØºÙ�Ù‚ÙƒÙ„Ù…Ù†Ù‡ÙˆÙ‰ÙŠÙ‹ÙŒÙ�ÙŽÙ�Ù�Ù‘Ù’Ù°_-]*$/,az:/^[0-9A-ZÃ‡Æ�ÄžÄ°Ä±Ã–ÅžÃœ_-]*$/i},De=function(e,t){void 0===t&&(t={});var n=t.locale;return Array.isArray(e)?e.every(function(e){return De(e,[n])}):n?(Ce[n]||Ce.en).test(e):Object.keys(Ce).some(function(t){return Ce[t].test(e)})},Le={validate:De,paramNames:["locale"]},Me=function(e,t){void 0===t&&(t={});var n=t.locale;return Array.isArray(e)?e.every(function(e){return Me(e,[n])}):n?(Pe[n]||Pe.en).test(e):Object.keys(Pe).some(function(t){return Pe[t].test(e)})},je={validate:Me,paramNames:["locale"]},Ne=function(e,t){void 0===t&&(t={});var n=t.locale;return Array.isArray(e)?e.every(function(e){return Ne(e,[n])}):n?(Oe[n]||Oe.en).test(e):Object.keys(Oe).some(function(t){return Oe[t].test(e)})},Re={validate:Ne,paramNames:["locale"]},Fe=function(e,t){void 0===t&&(t={});var n=t.locale;return Array.isArray(e)?e.every(function(e){return Fe(e,[n])}):n?(Ie[n]||Ie.en).test(e):Object.keys(Ie).some(function(t){return Ie[t].test(e)})},Be={validate:Fe,paramNames:["locale"]},Ue={validate:function(e,t){void 0===t&&(t={});var n=t.targetValue,r=t.inclusion;void 0===r&&(r=!1);var i=t.format;return void 0===i&&(i=r,r=!1),e=Ae(e,i),n=Ae(n,i),!(!e||!n)&&(te(e,n)||r&&ne(e,n))},options:{hasTarget:!0,isDate:!0},paramNames:["targetValue","inclusion","format"]},ze=function(e,t){void 0===t&&(t={});var n=t.min,r=t.max;return Array.isArray(e)?e.every(function(e){return ze(e,{min:n,max:r})}):Number(n)<=e&&Number(r)>=e},$e={validate:ze,paramNames:["min","max"]},Ve={validate:function(e,t){var n=t.targetValue;return String(e)===String(n)},options:{hasTarget:!0},paramNames:["targetValue"]};function Ye(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function He(e,t){return e(t={exports:{}},t.exports),t.exports}var qe=He(function(e,t){function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t;if(!("string"==typeof e||e instanceof String))throw t=null===e?"null":"object"===(t=n(e))&&e.constructor&&e.constructor.hasOwnProperty("name")?e.constructor.name:"a ".concat(t),new TypeError("Expected string but received ".concat(t,"."))},e.exports=t.default,e.exports.default=t.default});Ye(qe);var We=Ye(He(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){(0,r.default)(e);var t=e.replace(/[- ]+/g,"");if(!i.test(t))return!1;for(var n,o,a,s=0,u=t.length-1;u>=0;u--)n=t.substring(u,u+1),o=parseInt(n,10),s+=a&&(o*=2)>=10?o%10+1:o,a=!a;return!(s%10!=0||!t)};var n,r=(n=qe)&&n.__esModule?n:{default:n},i=/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11}|6[27][0-9]{14})$/;e.exports=t.default,e.exports.default=t.default})),Ge={validate:function(e){return We(String(e))}},Ke={validate:function(e,t){void 0===t&&(t={});var n=t.min,r=t.max,i=t.inclusivity;void 0===i&&(i="()");var o=t.format;void 0===o&&(o=i,i="()");var a=Ae(String(n),o),s=Ae(String(r),o),u=Ae(String(e),o);return!!(a&&s&&u)&&("()"===i?ee(u,a)&&te(u,s):"(]"===i?ee(u,a)&&(ne(u,s)||te(u,s)):"[)"===i?te(u,s)&&(ne(u,a)||ee(u,a)):ne(u,s)||ne(u,a)||te(u,s)&&ee(u,a))},options:{isDate:!0},paramNames:["min","max","inclusivity","format"]},Qe={validate:function(e,t){var n=t.format;return!!Ae(e,n)},options:{isDate:!0},paramNames:["format"]},Ze=function(e){return At(["text","password","search","email","tel","url","textarea","number"],e.type)},Je=function(e){return At(["radio","checkbox"],e.type)},Xe=function(e,t){return e.getAttribute("data-vv-"+t)},et=function(e){return"isNaN"in Number?Number.isNaN(e):"number"==typeof e&&e!=e},tt=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return e.every(function(e){return null===e||void 0===e})},nt=function(e,t){if(e instanceof RegExp&&t instanceof RegExp)return nt(e.source,t.source)&&nt(e.flags,t.flags);if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++)if(!nt(e[n],t[n]))return!1;return!0}return lt(e)&&lt(t)?Object.keys(e).every(function(n){return nt(e[n],t[n])})&&Object.keys(t).every(function(n){return nt(e[n],t[n])}):!(!et(e)||!et(t))||e===t},rt=function(e){return tt(e)?null:"FORM"===e.tagName?e:tt(e.form)?tt(e.parentNode)?null:rt(e.parentNode):e.form},it=function(e,t,n){if(void 0===n&&(n=void 0),!e||!t)return n;var r=t;return e.split(".").every(function(e){return e in r?(r=r[e],!0):(r=n,!1)}),r},ot=function(e,t,n){return void 0===t&&(t=0),void 0===n&&(n={cancelled:!1}),0===t?e:function(){for(var i=[],o=arguments.length;o--;)i[o]=arguments[o];clearTimeout(r),(r=setTimeout(function(){r=null,n.cancelled||e.apply(void 0,i)},t))||e.apply(void 0,i)};var r},at=function(e,t){return t?e?("string"==typeof t&&(t=st(t)),mt({},t,st(e))):st(t):st(e)},st=function(e){return e?lt(e)?Object.keys(e).reduce(function(t,n){var r=[];return r=!0===e[n]?[]:Array.isArray(e[n])?e[n]:lt(e[n])?e[n]:[e[n]],!1!==e[n]&&(t[n]=r),t},{}):"string"!=typeof e?(ut("rules must be either a string or an object."),{}):e.split("|").reduce(function(e,t){var n=function(e){var t=[],n=e.split(":")[0];return At(e,":")&&(t=e.split(":").slice(1).join(":").split(",")),{name:n,params:t}}(t);return n.name?(e[n.name]=n.params,e):e},{}):{}},ut=function(e){console.warn("[vee-validate] "+e)},ct=function(e){return new Error("[vee-validate] "+e)},lt=function(e){return null!==e&&e&&"object"==typeof e&&!Array.isArray(e)},ft=function(e){return"function"==typeof e},ht=function(e,t){return e.classList?e.classList.contains(t):!!e.className.match(new RegExp("(\\s|^)"+t+"(\\s|$)"))},dt=function(e,t,n){if(e&&t){if(!Array.isArray(t))return n?function(e,t){e.classList?e.classList.add(t):ht(e,t)||(e.className+=" "+t)}(e,t):void function(e,t){if(e.classList)e.classList.remove(t);else if(ht(e,t)){var n=new RegExp("(\\s|^)"+t+"(\\s|$)");e.className=e.className.replace(n," ")}}(e,t);t.forEach(function(t){return dt(e,t,n)})}},pt=function(e){if(ft(Array.from))return Array.from(e);for(var t=[],n=e.length,r=0;r<n;r++)t.push(e[r]);return t},vt=function(e){if(Array.isArray(e))return[].concat(e);var t=pt(e);return St(t)?[e]:t},mt=function(e){for(var t=[],n=arguments.length-1;n-->0;)t[n]=arguments[n+1];if(ft(Object.assign))return Object.assign.apply(Object,[e].concat(t));if(null==e)throw new TypeError("Cannot convert undefined or null to object");var r=Object(e);return t.forEach(function(e){null!=e&&Object.keys(e).forEach(function(t){r[t]=e[t]})}),r},yt=0,gt="{id}",bt=function(e,t){for(var n=Array.isArray(e)?e:pt(e),r=0;r<n.length;r++)if(t(n[r]))return r;return-1},wt=function(e,t){var n=Array.isArray(e)?e:pt(e),r=bt(n,t);return-1===r?void 0:n[r]},_t=function(e){if(!e)return!1;var t=e.componentOptions.tag;return/^(keep-alive|transition|transition-group)$/.test(t)},kt=function(e){if("number"==typeof e)return e;if("string"==typeof e)return parseInt(e);var t={};for(var n in e)t[n]=parseInt(e[n]);return t},xt=function(e,t){return lt(e)&&lt(t)?(Object.keys(t).forEach(function(n){var r,i;if(lt(t[n]))return e[n]||mt(e,((r={})[n]={},r)),void xt(e[n],t[n]);mt(e,((i={})[n]=t[n],i))}),e):e},Et=function(e,t){if(e.required&&(t=at("required",t)),Ze(e))return"email"===e.type&&(t=at("email"+(e.multiple?":multiple":""),t)),e.pattern&&(t=at({regex:e.pattern},t)),e.maxLength>=0&&e.maxLength<524288&&(t=at("max:"+e.maxLength,t)),e.minLength>0&&(t=at("min:"+e.minLength,t)),"number"===e.type&&(t=at("decimal",t),""!==e.min&&(t=at("min_value:"+e.min,t)),""!==e.max&&(t=at("max_value:"+e.max,t))),t;if(function(e){return At(["date","week","month","datetime-local","time"],e.type)}(e)){var n=e.step&&Number(e.step)<60?"HH:mm:ss":"HH:mm";if("date"===e.type)return at("date_format:yyyy-MM-dd",t);if("datetime-local"===e.type)return at("date_format:yyyy-MM-ddT"+n,t);if("month"===e.type)return at("date_format:yyyy-MM",t);if("week"===e.type)return at("date_format:yyyy-[W]WW",t);if("time"===e.type)return at("date_format:"+n,t)}return t},Tt=function(e){return ft(Object.values)?Object.values(e):Object.keys(e).map(function(t){return e[t]})},At=function(e,t){return-1!==e.indexOf(t)},St=function(e){return Array.isArray(e)&&0===e.length},Ct=function(e,t,n){Object.defineProperty(e,t,{configurable:!1,writable:!0,value:n})},It=function(e,t){void 0===t&&(t={});var n=t.decimals;void 0===n&&(n="*");var r=t.separator;if(void 0===r&&(r="."),tt(e)||""===e)return!1;if(Array.isArray(e))return e.every(function(e){return It(e,{decimals:n,separator:r})});if(0===Number(n))return/^-?\d*$/.test(e);var i="*"===n?"+":"{1,"+n+"}",o=new RegExp("^[-+]?\\d*(\\"+r+"\\d"+i+")?([eE]{1}[-]?\\d+)?$");if(!o.test(e))return!1;var a=parseFloat(e);return a==a},Ot={validate:It,paramNames:["decimals","separator"]},Pt=function(e,t){var n=t[0];if(Array.isArray(e))return e.every(function(e){return Pt(e,[n])});var r=String(e);return/^[0-9]*$/.test(r)&&r.length===Number(n)},Dt={validate:Pt},Lt=/\.(jpg|svg|jpeg|png|bmp|gif)$/i,Mt={validate:function(e,t){var n=t[0],r=t[1],i=vt(e).filter(function(e){return Lt.test(e.name)});return 0!==i.length&&Promise.all(i.map(function(e){return function(e,t,n){var r=window.URL||window.webkitURL;return new Promise(function(i){var o=new Image;o.onerror=function(){return i({valid:!1})},o.onload=function(){return i({valid:o.width===Number(t)&&o.height===Number(n)})},o.src=r.createObjectURL(e)})}(e,n,r)}))}},jt=He(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;for(var n in t)void 0===e[n]&&(e[n]=t[n]);return e},e.exports=t.default,e.exports.default=t.default});Ye(jt);var Nt=He(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n,o;(0,r.default)(e),"object"===i(t)?(n=t.min||0,o=t.max):(n=arguments[1],o=arguments[2]);var a=encodeURI(e).split(/%..|./).length-1;return a>=n&&(void 0===o||a<=o)};var n,r=(n=qe)&&n.__esModule?n:{default:n};function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}e.exports=t.default,e.exports.default=t.default});Ye(Nt);var Rt=He(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){(0,n.default)(e),(t=(0,r.default)(t,o)).allow_trailing_dot&&"."===e[e.length-1]&&(e=e.substring(0,e.length-1));for(var i=e.split("."),a=0;a<i.length;a++)if(i[a].length>63)return!1;if(t.require_tld){var s=i.pop();if(!i.length||!/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(s))return!1;if(/[\s\u2002-\u200B\u202F\u205F\u3000\uFEFF\uDB40\uDC20]/.test(s))return!1}for(var u,c=0;c<i.length;c++){if(u=i[c],t.allow_underscores&&(u=u.replace(/_/g,"")),!/^[a-z\u00a1-\uffff0-9-]+$/i.test(u))return!1;if(/[\uff01-\uff5e]/.test(u))return!1;if("-"===u[0]||"-"===u[u.length-1])return!1}return!0};var n=i(qe),r=i(jt);function i(e){return e&&e.__esModule?e:{default:e}}var o={require_tld:!0,allow_underscores:!1,allow_trailing_dot:!1};e.exports=t.default,e.exports.default=t.default}),Ft=Ye(Rt),Bt=He(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if((0,r.default)(t),!(n=String(n)))return e(t,4)||e(t,6);if("4"===n){if(!i.test(t))return!1;var a=t.split(".").sort(function(e,t){return e-t});return a[3]<=255}if("6"===n){var s=t.split(":"),u=!1,c=e(s[s.length-1],4),l=c?7:8;if(s.length>l)return!1;if("::"===t)return!0;"::"===t.substr(0,2)?(s.shift(),s.shift(),u=!0):"::"===t.substr(t.length-2)&&(s.pop(),s.pop(),u=!0);for(var f=0;f<s.length;++f)if(""===s[f]&&f>0&&f<s.length-1){if(u)return!1;u=!0}else if(c&&f===s.length-1);else if(!o.test(s[f]))return!1;return u?s.length>=1:s.length===l}return!1};var n,r=(n=qe)&&n.__esModule?n:{default:n},i=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/,o=/^[0-9A-F]{1,4}$/i;e.exports=t.default,e.exports.default=t.default}),Ut=Ye(Bt),zt=Ye(He(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if((0,n.default)(e),(t=(0,r.default)(t,u)).require_display_name||t.allow_display_name){var s=e.match(c);if(s)e=s[1];else if(t.require_display_name)return!1}var v=e.split("@"),m=v.pop(),y=v.join("@"),g=m.toLowerCase();if(t.domain_specific_validation&&("gmail.com"===g||"googlemail.com"===g)){var b=(y=y.toLowerCase()).split("+")[0];if(!(0,i.default)(b.replace(".",""),{min:6,max:30}))return!1;for(var w=b.split("."),_=0;_<w.length;_++)if(!f.test(w[_]))return!1}if(!(0,i.default)(y,{max:64})||!(0,i.default)(m,{max:254}))return!1;if(!(0,o.default)(m,{require_tld:t.require_tld})){if(!t.allow_ip_domain)return!1;if(!(0,a.default)(m)){if(!m.startsWith("[")||!m.endsWith("]"))return!1;var k=m.substr(1,m.length-2);if(0===k.length||!(0,a.default)(k))return!1}}if('"'===y[0])return y=y.slice(1,y.length-1),t.allow_utf8_local_part?p.test(y):h.test(y);for(var x=t.allow_utf8_local_part?d:l,E=y.split("."),T=0;T<E.length;T++)if(!x.test(E[T]))return!1;return!0};var n=s(qe),r=s(jt),i=s(Nt),o=s(Rt),a=s(Bt);function s(e){return e&&e.__esModule?e:{default:e}}var u={allow_display_name:!1,require_display_name:!1,allow_utf8_local_part:!0,require_tld:!0},c=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\.\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\,\.\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\s]*<(.+)>$/i,l=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i,f=/^[a-z\d]+$/,h=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i,d=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i,p=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i;e.exports=t.default,e.exports.default=t.default})),$t={validate:function(e,t){void 0===t&&(t={});var n=t.multiple;void 0===n&&(n=!1);var r=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&-1===t.indexOf(r)&&(n[r]=e[r]);return n}(t,["multiple"]),i=r;n&&!Array.isArray(e)&&(e=String(e).split(",").map(function(e){return e.trim()}));var o=mt({},i);return Array.isArray(e)?e.every(function(e){return zt(String(e),o)}):zt(String(e),o)}},Vt=function(e,t){return Array.isArray(e)?e.every(function(e){return Vt(e,t)}):pt(t).some(function(t){return t==e})},Yt={validate:Vt},Ht={validate:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return!Vt.apply(void 0,e)}},qt={validate:function(e,t){var n=new RegExp(".("+t.join("|")+")$","i");return vt(e).every(function(e){return n.test(e.name)})}},Wt={validate:function(e){return(Array.isArray(e)?e:[e]).every(function(e){return/\.(jpg|svg|jpeg|png|bmp|gif)$/i.test(e.name)})}},Gt={validate:function(e){return Array.isArray(e)?e.every(function(e){return/^-?[0-9]+$/.test(String(e))}):/^-?[0-9]+$/.test(String(e))}},Kt={validate:function(e,t){void 0===t&&(t={});var n=t.version;return void 0===n&&(n=4),tt(e)&&(e=""),Array.isArray(e)?e.every(function(e){return Ut(e,n)}):Ut(e,n)},paramNames:["version"]},Qt={validate:function(e){return tt(e)&&(e=""),Array.isArray(e)?e.every(function(e){return Ut(e,"")||Ft(e)}):Ut(e,"")||Ft(e)}},Zt={validate:function(e,t){void 0===t&&(t=[]);var n=t[0];return e===n}},Jt={validate:function(e,t){void 0===t&&(t=[]);var n=t[0];return e!==n}},Xt={validate:function(e,t){var n=t[0],r=t[1];return void 0===r&&(r=void 0),!tt(e)&&(n=Number(n),"number"==typeof e&&(e=String(e)),e.length||(e=pt(e)),function(e,t,n){return void 0===n?e.length===t:(n=Number(n),e.length>=t&&e.length<=n)}(e,n,r))}},en=function(e,t){var n=t[0];return tt(e)?n>=0:Array.isArray(e)?e.every(function(e){return en(e,[n])}):String(e).length<=n},tn={validate:en},nn=function(e,t){var n=t[0];return!tt(e)&&""!==e&&(Array.isArray(e)?e.length>0&&e.every(function(e){return nn(e,[n])}):Number(e)<=n)},rn={validate:nn},on={validate:function(e,t){var n=new RegExp(t.join("|").replace("*",".+")+"$","i");return vt(e).every(function(e){return n.test(e.type)})}},an=function(e,t){var n=t[0];return!tt(e)&&(Array.isArray(e)?e.every(function(e){return an(e,[n])}):String(e).length>=n)},sn={validate:an},un=function(e,t){var n=t[0];return!tt(e)&&""!==e&&(Array.isArray(e)?e.length>0&&e.every(function(e){return un(e,[n])}):Number(e)>=n)},cn={validate:un},ln=/^[Ù Ù¡Ù¢Ù£Ù¤Ù¥Ù¦Ù§Ù¨Ù©]+$/,fn=/^[0-9]+$/,hn={validate:function(e){var t=function(e){var t=String(e);return fn.test(t)||ln.test(t)};return Array.isArray(e)?e.every(t):t(e)}},dn=function(e,t){var n=t.expression;return"string"==typeof n&&(n=new RegExp(n)),Array.isArray(e)?e.every(function(e){return dn(e,{expression:n})}):n.test(String(e))},pn={validate:dn,paramNames:["expression"]},vn={validate:function(e,t){void 0===t&&(t=[]);var n=t[0];return void 0===n&&(n=!1),!(tt(e)||St(e)||!1===e&&n||!String(e).trim().length)}},mn={validate:function(e,t){void 0===t&&(t=[]);var n=t[0],r=t.slice(1),i=r.includes(String(n).trim());if(!i)return{valid:!0,data:{required:i}};var o=St(e)||[!1,null,void 0].includes(e);return{valid:!(o=o||!String(e).trim().length),data:{required:i}}},options:{hasTarget:!0,computesRequired:!0}},yn={validate:function(e,t){var n=t[0];if(isNaN(n))return!1;var r=1024*Number(n);return vt(e).every(function(e){return e.size<=r})}},gn=Ye(He(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if((0,n.default)(e),!e||e.length>=2083||/[\s<>]/.test(e))return!1;if(0===e.indexOf("mailto:"))return!1;var a,l,f,h,d,p,v,m;if(t=(0,o.default)(t,s),v=e.split("#"),e=v.shift(),v=e.split("?"),e=v.shift(),(v=e.split("://")).length>1){if(a=v.shift().toLowerCase(),t.require_valid_protocol&&-1===t.protocols.indexOf(a))return!1}else{if(t.require_protocol)return!1;if("//"===e.substr(0,2)){if(!t.allow_protocol_relative_urls)return!1;v[0]=e.substr(2)}}if(""===(e=v.join("://")))return!1;if(v=e.split("/"),""===(e=v.shift())&&!t.require_host)return!0;if((v=e.split("@")).length>1){if(t.disallow_auth)return!1;if((l=v.shift()).indexOf(":")>=0&&l.split(":").length>2)return!1}h=v.join("@"),p=null,m=null;var y=h.match(u);return y?(f="",m=y[1],p=y[2]||null):(v=h.split(":"),f=v.shift(),v.length&&(p=v.join(":"))),!(null!==p&&(d=parseInt(p,10),!/^[0-9]+$/.test(p)||d<=0||d>65535))&&(!!((0,i.default)(f)||(0,r.default)(f,t)||m&&(0,i.default)(m,6))&&(f=f||m,!(t.host_whitelist&&!c(f,t.host_whitelist))&&(!t.host_blacklist||!c(f,t.host_blacklist))))};var n=a(qe),r=a(Rt),i=a(Bt),o=a(jt);function a(e){return e&&e.__esModule?e:{default:e}}var s={protocols:["http","https","ftp"],require_tld:!0,require_protocol:!1,require_host:!0,require_valid_protocol:!0,allow_underscores:!1,allow_trailing_dot:!1,allow_protocol_relative_urls:!1},u=/^\[([^\]]+)\](?::([0-9]+))?$/;function c(e,t){for(var n=0;n<t.length;n++){var r=t[n];if(e===r||(i=r,"[object RegExp]"===Object.prototype.toString.call(i)&&r.test(e)))return!0}var i;return!1}e.exports=t.default,e.exports.default=t.default})),bn={validate:function(e,t){void 0===t&&(t={}),tt(e)&&(e="");var n=mt({},t);return Array.isArray(e)?e.every(function(e){return gn(e,n)}):gn(e,n)}},wn=Object.freeze({after:Se,alpha_dash:je,alpha_num:Re,alpha_spaces:Be,alpha:Le,before:Ue,between:$e,confirmed:Ve,credit_card:Ge,date_between:Ke,date_format:Qe,decimal:Ot,digits:Dt,dimensions:Mt,email:$t,ext:qt,image:Wt,included:Yt,integer:Gt,length:Xt,ip:Kt,ip_or_fqdn:Qt,is_not:Jt,is:Zt,max:tn,max_value:rn,mimes:on,min:sn,min_value:cn,excluded:Ht,numeric:hn,regex:pn,required:vn,required_if:mn,size:yn,url:bn}),_n="en",kn=function(e){void 0===e&&(e={}),this.container={},this.merge(e)},xn={locale:{configurable:!0}};xn.locale.get=function(){return _n},xn.locale.set=function(e){_n=e||"en"},kn.prototype.hasLocale=function(e){return!!this.container[e]},kn.prototype.setDateFormat=function(e,t){this.container[e]||(this.container[e]={}),this.container[e].dateFormat=t},kn.prototype.getDateFormat=function(e){return this.container[e]&&this.container[e].dateFormat?this.container[e].dateFormat:null},kn.prototype.getMessage=function(e,t,n){var r=null;return r=this.hasMessage(e,t)?this.container[e].messages[t]:this._getDefaultMessage(e),ft(r)?r.apply(void 0,n):r},kn.prototype.getFieldMessage=function(e,t,n,r){if(!this.hasLocale(e))return this.getMessage(e,n,r);var i=this.container[e].custom&&this.container[e].custom[t];if(!i||!i[n])return this.getMessage(e,n,r);var o=i[n];return ft(o)?o.apply(void 0,r):o},kn.prototype._getDefaultMessage=function(e){return this.hasMessage(e,"_default")?this.container[e].messages._default:this.container.en.messages._default},kn.prototype.getAttribute=function(e,t,n){return void 0===n&&(n=""),this.hasAttribute(e,t)?this.container[e].attributes[t]:n},kn.prototype.hasMessage=function(e,t){return!!(this.hasLocale(e)&&this.container[e].messages&&this.container[e].messages[t])},kn.prototype.hasAttribute=function(e,t){return!!(this.hasLocale(e)&&this.container[e].attributes&&this.container[e].attributes[t])},kn.prototype.merge=function(e){xt(this.container,e)},kn.prototype.setMessage=function(e,t,n){this.hasLocale(e)||(this.container[e]={messages:{},attributes:{}}),this.container[e].messages||(this.container[e].messages={}),this.container[e].messages[t]=n},kn.prototype.setAttribute=function(e,t,n){this.hasLocale(e)||(this.container[e]={messages:{},attributes:{}}),this.container[e].attributes[t]=n},Object.defineProperties(kn.prototype,xn);var En={default:new kn({en:{messages:{},attributes:{},custom:{}}})},Tn="default",An=function(){};An._checkDriverName=function(e){if(!e)throw ct("you must provide a name to the dictionary driver")},An.setDriver=function(e,t){void 0===t&&(t=null),this._checkDriverName(e),t&&(En[e]=t),Tn=e},An.getDriver=function(){return En[Tn]};var Sn=function e(t,n){void 0===t&&(t=null),void 0===n&&(n=null),this.vmId=n||null,this.items=t&&t instanceof e?t.items:[]};Sn.prototype["function"==typeof Symbol?Symbol.iterator:"@@iterator"]=function(){var e=this,t=0;return{next:function(){return{value:e.items[t++],done:t>e.items.length}}}},Sn.prototype.add=function(e){var t;(t=this.items).push.apply(t,this._normalizeError(e))},Sn.prototype._normalizeError=function(e){var t=this;return Array.isArray(e)?e.map(function(e){return e.scope=tt(e.scope)?null:e.scope,e.vmId=tt(e.vmId)?t.vmId||null:e.vmId,e}):(e.scope=tt(e.scope)?null:e.scope,e.vmId=tt(e.vmId)?this.vmId||null:e.vmId,[e])},Sn.prototype.regenerate=function(){this.items.forEach(function(e){e.msg=ft(e.regenerate)?e.regenerate():e.msg})},Sn.prototype.update=function(e,t){var n=wt(this.items,function(t){return t.id===e});if(n){var r=this.items.indexOf(n);this.items.splice(r,1),n.scope=t.scope,this.items.push(n)}},Sn.prototype.all=function(e){var t=this;return this.items.filter(function(n){var r=!0,i=!0;return tt(e)||(r=n.scope===e),tt(t.vmId)||(i=n.vmId===t.vmId),i&&r}).map(function(e){return e.msg})},Sn.prototype.any=function(e){var t=this;return!!this.items.filter(function(n){var r=!0,i=!0;return tt(e)||(r=n.scope===e),tt(t.vmId)||(i=n.vmId===t.vmId),i&&r}).length},Sn.prototype.clear=function(e){var t=this,n=tt(this.vmId)?function(){return!0}:function(e){return e.vmId===t.vmId},r=function(t){return t.scope===e};0===arguments.length?r=function(){return!0}:tt(e)&&(e=null);for(var i=0;i<this.items.length;++i)n(this.items[i])&&r(this.items[i])&&(this.items.splice(i,1),--i)},Sn.prototype.collect=function(e,t,n){var r=this;void 0===n&&(n=!0);var i=!tt(e)&&!e.includes("*"),o=function(e){var t=e.reduce(function(e,t){return tt(r.vmId)||t.vmId===r.vmId?(e[t.field]||(e[t.field]=[]),e[t.field].push(n?t.msg:t),e):e},{});return i?Tt(t)[0]||[]:t};if(tt(e))return o(this.items);var a=tt(t)?String(e):t+"."+e,s=this._makeCandidateFilters(a),u=s.isPrimary,c=s.isAlt,l=this.items.reduce(function(e,t){return u(t)&&e.primary.push(t),c(t)&&e.alt.push(t),e},{primary:[],alt:[]});return l=l.primary.length?l.primary:l.alt,o(l)},Sn.prototype.count=function(){var e=this;return this.vmId?this.items.filter(function(t){return t.vmId===e.vmId}).length:this.items.length},Sn.prototype.firstById=function(e){var t=wt(this.items,function(t){return t.id===e});return t?t.msg:void 0},Sn.prototype.first=function(e,t){void 0===t&&(t=null);var n=tt(t)?e:t+"."+e,r=this._match(n);return r&&r.msg},Sn.prototype.firstRule=function(e,t){var n=this.collect(e,t,!1);return n.length&&n[0].rule||void 0},Sn.prototype.has=function(e,t){return void 0===t&&(t=null),!!this.first(e,t)},Sn.prototype.firstByRule=function(e,t,n){void 0===n&&(n=null);var r=this.collect(e,n,!1).filter(function(e){return e.rule===t})[0];return r&&r.msg||void 0},Sn.prototype.firstNot=function(e,t,n){void 0===t&&(t="required"),void 0===n&&(n=null);var r=this.collect(e,n,!1).filter(function(e){return e.rule!==t})[0];return r&&r.msg||void 0},Sn.prototype.removeById=function(e){var t=function(t){return t.id===e};Array.isArray(e)&&(t=function(t){return-1!==e.indexOf(t.id)});for(var n=0;n<this.items.length;++n)t(this.items[n])&&(this.items.splice(n,1),--n)},Sn.prototype.remove=function(e,t,n){if(!tt(e))for(var r=tt(t)?String(e):t+"."+e,i=this._makeCandidateFilters(r),o=i.isPrimary,a=i.isAlt,s=function(e){return o(e)||a(e)},u=0;u<this.items.length;++u)c=this.items[u],(tt(n)?s(c):s(c)&&c.vmId===n)&&(this.items.splice(u,1),--u);var c},Sn.prototype._makeCandidateFilters=function(e){var t=this,n=function(){return!0},r=function(){return!0},i=function(){return!0},o=function(){return!0},a=function(e){var t=null;if(At(e,":")&&(t=e.split(":").pop(),e=e.replace(":"+t,"")),"#"===e[0])return{id:e.slice(1),rule:t,name:null,scope:null};var n=null,r=e;if(At(e,".")){var i=e.split(".");n=i[0],r=i.slice(1).join(".")}return{id:null,scope:n,name:r,rule:t}}(e),s=a.id,u=a.rule,c=a.scope,l=a.name;return u&&(n=function(e){return e.rule===u}),s?{isPrimary:function(e){return n(e)&&function(e){return s===e.id}},isAlt:function(){return!1}}:(r=tt(c)?function(e){return tt(e.scope)}:function(e){return e.scope===c},tt(l)||"*"===l||(i=function(e){return e.field===l}),tt(this.vmId)||(o=function(e){return e.vmId===t.vmId}),{isPrimary:function(e){return o(e)&&i(e)&&n(e)&&r(e)},isAlt:function(e){return o(e)&&n(e)&&e.field===c+"."+l}})},Sn.prototype._match=function(e){if(!tt(e)){var t=this._makeCandidateFilters(e),n=t.isPrimary,r=t.isAlt;return this.items.reduce(function(e,t,i,o){var a=i===o.length-1;return e.primary?a?e.primary:e:(n(t)&&(e.primary=t),r(t)&&(e.alt=t),a?e.primary||e.alt:e)},{})}};var Cn=mt({},{locale:"en",delay:0,errorBagName:"errors",dictionary:null,fieldsBagName:"fields",classes:!1,classNames:null,events:"input",inject:!0,fastExit:!0,aria:!0,validity:!1,mode:"aggressive",useConstraintAttrs:!0,i18n:null,i18nRootKey:"validation"}),In=function(e){var t=it("$options.$_veeValidate",e,{});return mt({},Cn,t)},On=function(){return Cn},Pn=function(e){Cn=mt({},Cn,e)};function Dn(e){return e.data?e.data.model?e.data.model:!!e.data.directives&&wt(e.data.directives,function(e){return"model"===e.name}):null}function Ln(e){if(Dn(e))return[e];var t=function(e){return Array.isArray(e)?e:Array.isArray(e.children)?e.children:e.componentOptions&&Array.isArray(e.componentOptions.children)?e.componentOptions.children:[]}(e);return t.reduce(function(e,t){var n=Ln(t);return n.length&&e.push.apply(e,n),e},[])}function Mn(e){return e.componentOptions?e.componentOptions.Ctor.options.model:null}function jn(e,t,n){if(ft(e[t])){var r=e[t];e[t]=[r]}Array.isArray(e[t])?e[t].push(n):tt(e[t])&&(e[t]=[n])}function Nn(e,t,n){e.componentOptions?function(e,t,n){e.componentOptions.listeners||(e.componentOptions.listeners={}),jn(e.componentOptions.listeners,t,n)}(e,t,n):function(e,t,n){tt(e.data.on)&&(e.data.on={}),jn(e.data.on,t,n)}(e,t,n)}function Rn(e,t){if(e.componentOptions){var n=Mn(e)||{event:"input"},r=n.event;return r}return t&&t.modifiers&&t.modifiers.lazy||"select"===e.tag?"change":e.data.attrs&&Ze({type:e.data.attrs.type||"text"})?"input":"change"}function Fn(e,t){return Array.isArray(t)&&t[0]?t[0]:t||e()}var Bn=function(){};Bn.generate=function(e,t,n){var r=Bn.resolveModel(t,n),i=In(n.context);return{name:Bn.resolveName(e,n),el:e,listen:!t.modifiers.disable,bails:!!t.modifiers.bails||!0!==t.modifiers.continues&&void 0,scope:Bn.resolveScope(e,t,n),vm:n.context,expression:t.value,component:n.componentInstance,classes:i.classes,classNames:i.classNames,getter:Bn.resolveGetter(e,n,r),events:Bn.resolveEvents(e,n)||i.events,model:r,delay:Bn.resolveDelay(e,n,i),rules:Bn.resolveRules(e,t,n),immediate:!!t.modifiers.initial||!!t.modifiers.immediate,persist:!!t.modifiers.persist,validity:i.validity&&!n.componentInstance,aria:i.aria&&!n.componentInstance,initialValue:Bn.resolveInitialValue(n)}},Bn.getCtorConfig=function(e){if(!e.componentInstance)return null;var t=it("componentInstance.$options.$_veeValidate",e);return t},Bn.resolveRules=function(e,t,n){var r="";if(t.value||t&&t.expression||(r=Xe(e,"rules")),t.value&&At(["string","object"],typeof t.value.rules)?r=t.value.rules:t.value&&(r=t.value),n.componentInstance)return r;var i=st(r);return On().useConstraintAttrs?mt({},Et(e,{}),i):i},Bn.resolveInitialValue=function(e){var t=e.data.model||wt(e.data.directives,function(e){return"model"===e.name});return t&&t.value},Bn.resolveDelay=function(e,t,n){var r=Xe(e,"delay"),i=n&&"delay"in n?n.delay:0;return!r&&t.componentInstance&&t.componentInstance.$attrs&&(r=t.componentInstance.$attrs["data-vv-delay"]),lt(i)?(tt(r)||(i.input=r),kt(i)):kt(r||i)},Bn.resolveEvents=function(e,t){var n=Xe(e,"validate-on");if(!n&&t.componentInstance&&t.componentInstance.$attrs&&(n=t.componentInstance.$attrs["data-vv-validate-on"]),!n&&t.componentInstance){var r=Bn.getCtorConfig(t);n=r&&r.events}if(!n&&On().events&&(n=On().events),n&&t.componentInstance&&At(n,"input")){var i=t.componentInstance.$options.model||{event:"input"},o=i.event;if(!o)return n;n=n.replace("input",o)}return n},Bn.resolveScope=function(e,t,n){void 0===n&&(n={});var r=null;return n.componentInstance&&tt(r)&&(r=n.componentInstance.$attrs&&n.componentInstance.$attrs["data-vv-scope"]),tt(r)?function(e){var t=Xe(e,"scope");if(tt(t)){var n=rt(e);n&&(t=Xe(n,"scope"))}return tt(t)?null:t}(e):r},Bn.resolveModel=function(e,t){if(e.arg)return{expression:e.arg};var n=Dn(t);if(!n)return null;var r=!/[^\w.$]/.test(n.expression)&&function(e,t){var n=t,r=null,i=!1,o=e.split(".").reduce(function(e,t){return null==n||"object"!=typeof n?(i=!0,e&&!1):t in n?(n=n[t],r=null===r?t:r+"."+t,e&&!0):e&&!1},!0);if(i)throw new Error(r+" is not an object");return o}(n.expression,t.context),i=!(!n.modifiers||!n.modifiers.lazy);return r?{expression:n.expression,lazy:i}:{expression:null,lazy:i}},Bn.resolveName=function(e,t){var n=Xe(e,"name");if(!n&&!t.componentInstance)return e.name;if(!n&&t.componentInstance&&t.componentInstance.$attrs&&(n=t.componentInstance.$attrs["data-vv-name"]||t.componentInstance.$attrs.name),!n&&t.componentInstance){var r=Bn.getCtorConfig(t);if(r&&ft(r.name)){var i=r.name.bind(t.componentInstance);return i()}return t.componentInstance.name}return n},Bn.resolveGetter=function(e,t,n){if(n&&n.expression)return function(){return it(n.expression,t.context)};if(t.componentInstance){var r=Xe(e,"value-path")||t.componentInstance.$attrs&&t.componentInstance.$attrs["data-vv-value-path"];if(r)return function(){return it(r,t.componentInstance)};var i=Bn.getCtorConfig(t);if(i&&ft(i.value)){var o=i.value.bind(t.componentInstance);return function(){return o()}}var a=t.componentInstance.$options.model||{prop:"value"},s=a.prop;return function(){return t.componentInstance[s]}}switch(e.type){case"checkbox":return function(){var t=document.querySelectorAll('input[name="'+e.name+'"]');if((t=pt(t).filter(function(e){return e.checked})).length)return t.map(function(e){return e.value})};case"radio":return function(){var t=document.querySelectorAll('input[name="'+e.name+'"]'),n=wt(t,function(e){return e.checked});return n&&n.value};case"file":return function(t){return pt(e.files)};case"select-multiple":return function(){return pt(e.options).filter(function(e){return e.selected}).map(function(e){return e.value})};default:return function(){return e&&e.value}}};var Un={},zn=function(){},$n={rules:{configurable:!0}};zn.add=function(e,t){var n=t.validate,r=t.options,i=t.paramNames;Un[e]={validate:n,options:r,paramNames:i}},$n.rules.get=function(){return Un},zn.has=function(e){return!!Un[e]},zn.isImmediate=function(e){return!(!Un[e]||!Un[e].options.immediate)},zn.isRequireRule=function(e){return!(!Un[e]||!Un[e].options.computesRequired)},zn.isTargetRule=function(e){return!(!Un[e]||!Un[e].options.hasTarget)},zn.remove=function(e){delete Un[e]},zn.getParamNames=function(e){return Un[e]&&Un[e].paramNames},zn.getOptions=function(e){return Un[e]&&Un[e].options},zn.getValidatorMethod=function(e){return Un[e]?Un[e].validate:null},Object.defineProperties(zn,$n);var Vn=function(e){return"undefined"!=typeof Event&&ft(Event)&&e instanceof Event||e&&e.srcElement},Yn=function(e){return e?"string"==typeof e?e.split("|"):e:[]},Hn=!0,qn=function(e,t,n){e.addEventListener(t,n,!!Hn&&{passive:!0})},Wn={targetOf:null,immediate:!1,persist:!1,scope:null,listen:!0,name:null,rules:{},vm:null,classes:!1,validity:!0,aria:!0,events:"input|blur",delay:0,classNames:{touched:"touched",untouched:"untouched",valid:"valid",invalid:"invalid",pristine:"pristine",dirty:"dirty"}},Gn=function(e){void 0===e&&(e={}),this.id=(yt>=9999&&(yt=0,gt=gt.replace("{id}","_{id}")),yt++,gt.replace("{id}",String(yt))),this.el=e.el,this.updated=!1,this.vmId=e.vmId,Ct(this,"dependencies",[]),Ct(this,"watchers",[]),Ct(this,"events",[]),this.delay=0,this.rules={},this.forceRequired=!1,this._cacheId(e),this.classNames=mt({},Wn.classNames),e=mt({},Wn,e),this._delay=tt(e.delay)?0:e.delay,this.validity=e.validity,this.aria=e.aria,this.flags=e.flags||{untouched:!0,touched:!1,dirty:!1,pristine:!0,valid:null,invalid:null,validated:!1,pending:!1,required:!1,changed:!1},Ct(this,"vm",e.vm),Ct(this,"componentInstance",e.component),this.ctorConfig=this.componentInstance?it("$options.$_veeValidate",this.componentInstance):void 0,this.update(e),this.initialValue=this.value,this.updated=!1},Kn={validator:{configurable:!0},isRequired:{configurable:!0},isDisabled:{configurable:!0},alias:{configurable:!0},value:{configurable:!0},bails:{configurable:!0},rejectsFalse:{configurable:!0}};Kn.validator.get=function(){return this.vm&&this.vm.$validator?this.vm.$validator:{validate:function(){return Promise.resolve(!0)}}},Kn.isRequired.get=function(){return!!this.rules.required||this.forceRequired},Kn.isDisabled.get=function(){return!(!this.el||!this.el.disabled)},Kn.alias.get=function(){if(this._alias)return this._alias;var e=null;return this.ctorConfig&&this.ctorConfig.alias&&(e=ft(this.ctorConfig.alias)?this.ctorConfig.alias.call(this.componentInstance):this.ctorConfig.alias),!e&&this.el&&(e=Xe(this.el,"as")),!e&&this.componentInstance?this.componentInstance.$attrs&&this.componentInstance.$attrs["data-vv-as"]:e},Kn.value.get=function(){if(ft(this.getter))return this.getter()},Kn.bails.get=function(){return this._bails},Kn.rejectsFalse.get=function(){return this.componentInstance&&this.ctorConfig?!!this.ctorConfig.rejectsFalse:!!this.el&&"checkbox"===this.el.type},Gn.prototype.matches=function(e){var t=this;if(!e)return!0;if(e.id)return this.id===e.id;var n=tt(e.vmId)?function(){return!0}:function(e){return e===t.vmId};return!!n(e.vmId)&&(void 0===e.name&&void 0===e.scope||(void 0===e.scope?this.name===e.name:void 0===e.name?this.scope===e.scope:e.name===this.name&&e.scope===this.scope))},Gn.prototype._cacheId=function(e){this.el&&!e.targetOf&&(this.el._veeValidateId=this.id)},Gn.prototype.waitFor=function(e){this._waitingFor=e},Gn.prototype.isWaitingFor=function(e){return this._waitingFor===e},Gn.prototype.update=function(e){var t,n,r,i=this;if(this.targetOf=e.targetOf||null,this.immediate=e.immediate||this.immediate||!1,this.persist=e.persist||this.persist||!1,!tt(e.scope)&&e.scope!==this.scope&&ft(this.validator.update)&&this.validator.update(this.id,{scope:e.scope}),this.scope=tt(e.scope)?tt(this.scope)?null:this.scope:e.scope,this.name=(tt(e.name)?e.name:String(e.name))||this.name||null,this.rules=void 0!==e.rules?st(e.rules):this.rules,this._bails=void 0!==e.bails?e.bails:this._bails,this.model=e.model||this.model,this.listen=void 0!==e.listen?e.listen:this.listen,this.classes=!(!e.classes&&!this.classes||this.componentInstance),this.classNames=lt(e.classNames)?xt(this.classNames,e.classNames):this.classNames,this.getter=ft(e.getter)?e.getter:this.getter,this._alias=e.alias||this._alias,this.events=e.events?Yn(e.events):this.events,this.delay=(t=this.events,n=e.delay||this.delay,r=this._delay,"number"==typeof n?t.reduce(function(e,t){return e[t]=n,e},{}):t.reduce(function(e,t){return"object"==typeof n&&t in n?(e[t]=n[t],e):"number"==typeof r?(e[t]=r,e):(e[t]=r&&r[t]||0,e)},{})),this.updateDependencies(),this.addActionListeners(),this.name||this.targetOf||ut('A field is missing a "name" or "data-vv-name" attribute'),void 0!==e.rules&&(this.flags.required=this.isRequired),0===Object.keys(e.rules||{}).length&&this.updated){var o=this.flags.validated;this.validator.validate("#"+this.id).then(function(){i.flags.validated=o})}this.flags.validated&&void 0!==e.rules&&this.updated&&this.validator.validate("#"+this.id),this.updated=!0,this.addValueListeners(),this.el&&(this.updateClasses(),this.updateAriaAttrs())},Gn.prototype.reset=function(){var e=this;this._cancellationToken&&(this._cancellationToken.cancelled=!0,delete this._cancellationToken);var t={untouched:!0,touched:!1,dirty:!1,pristine:!0,valid:null,invalid:null,validated:!1,pending:!1,required:!1,changed:!1};Object.keys(this.flags).filter(function(e){return"required"!==e}).forEach(function(n){e.flags[n]=t[n]}),this.initialValue=this.value,this.flags.changed=!1,this.addValueListeners(),this.addActionListeners(),this.updateClasses(!0),this.updateAriaAttrs(),this.updateCustomValidity()},Gn.prototype.setFlags=function(e){var t=this,n={pristine:"dirty",dirty:"pristine",valid:"invalid",invalid:"valid",touched:"untouched",untouched:"touched"};Object.keys(e).forEach(function(r){t.flags[r]=e[r],n[r]&&void 0===e[n[r]]&&(t.flags[n[r]]=!e[r])}),void 0===e.untouched&&void 0===e.touched&&void 0===e.dirty&&void 0===e.pristine||this.addActionListeners(),this.updateClasses(),this.updateAriaAttrs(),this.updateCustomValidity()},Gn.prototype.updateDependencies=function(){var e=this;this.dependencies.forEach(function(e){return e.field.destroy()}),this.dependencies=[];var t=Object.keys(this.rules).reduce(function(t,n){return zn.isTargetRule(n)&&t.push({selector:e.rules[n][0],name:n}),t},[]);t.length&&this.vm&&this.vm.$el&&t.forEach(function(t){var n=t.selector,r=t.name,i=e.vm.$refs[n],o=Array.isArray(i)?i[0]:i;if(o){var a={vm:e.vm,classes:e.classes,classNames:e.classNames,delay:e.delay,scope:e.scope,events:e.events.join("|"),immediate:e.immediate,targetOf:e.id};ft(o.$watch)?(a.component=o,a.el=o.$el,a.getter=Bn.resolveGetter(o.$el,o.$vnode)):(a.el=o,a.getter=Bn.resolveGetter(o,{})),e.dependencies.push({name:r,field:new Gn(a)})}})},Gn.prototype.unwatch=function(e){if(void 0===e&&(e=null),!e)return this.watchers.forEach(function(e){return e.unwatch()}),void(this.watchers=[]);this.watchers.filter(function(t){return e.test(t.tag)}).forEach(function(e){return e.unwatch()}),this.watchers=this.watchers.filter(function(t){return!e.test(t.tag)})},Gn.prototype.updateClasses=function(e){var t=this;if(void 0===e&&(e=!1),this.classes&&!this.isDisabled){var n=function(n){dt(n,t.classNames.dirty,t.flags.dirty),dt(n,t.classNames.pristine,t.flags.pristine),dt(n,t.classNames.touched,t.flags.touched),dt(n,t.classNames.untouched,t.flags.untouched),e&&(dt(n,t.classNames.valid,!1),dt(n,t.classNames.invalid,!1)),!tt(t.flags.valid)&&t.flags.validated&&dt(n,t.classNames.valid,t.flags.valid),!tt(t.flags.invalid)&&t.flags.validated&&dt(n,t.classNames.invalid,t.flags.invalid)};if(Je(this.el)){var r=document.querySelectorAll('input[name="'+this.el.name+'"]');pt(r).forEach(n)}else n(this.el)}},Gn.prototype.addActionListeners=function(){var e=this;if(this.unwatch(/class/),this.el){var t=function(){e.flags.touched=!0,e.flags.untouched=!1,e.classes&&(dt(e.el,e.classNames.touched,!0),dt(e.el,e.classNames.untouched,!1)),e.unwatch(/^class_blur$/)},n=Ze(this.el)?"input":"change",r=function(){e.flags.dirty=!0,e.flags.pristine=!1,e.classes&&(dt(e.el,e.classNames.pristine,!1),dt(e.el,e.classNames.dirty,!0)),e.unwatch(/^class_input$/)};if(this.componentInstance&&ft(this.componentInstance.$once))return this.componentInstance.$once("input",r),this.componentInstance.$once("blur",t),this.watchers.push({tag:"class_input",unwatch:function(){e.componentInstance.$off("input",r)}}),void this.watchers.push({tag:"class_blur",unwatch:function(){e.componentInstance.$off("blur",t)}});if(this.el){qn(this.el,n,r);var i=Je(this.el)?"change":"blur";qn(this.el,i,t),this.watchers.push({tag:"class_input",unwatch:function(){e.el.removeEventListener(n,r)}}),this.watchers.push({tag:"class_blur",unwatch:function(){e.el.removeEventListener(i,t)}})}}},Gn.prototype.checkValueChanged=function(){return(null!==this.initialValue||""!==this.value||!Ze(this.el))&&this.value!==this.initialValue},Gn.prototype._determineInputEvent=function(){return this.componentInstance?this.componentInstance.$options.model&&this.componentInstance.$options.model.event||"input":this.model&&this.model.lazy?"change":Ze(this.el)?"input":"change"},Gn.prototype._determineEventList=function(e){var t=this;return!this.events.length||this.componentInstance||Ze(this.el)?[].concat(this.events).map(function(e){return"input"===e&&t.model&&t.model.lazy?"change":e}):this.events.map(function(t){return"input"===t?e:t})},Gn.prototype.addValueListeners=function(){var e=this;if(this.unwatch(/^input_.+/),this.listen&&this.el){var t={cancelled:!1},n=this.targetOf?function(){var t=e.validator._resolveField("#"+e.targetOf);t&&t.flags.validated&&e.validator.validate("#"+e.targetOf)}:function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];(0===n.length||Vn(n[0]))&&(n[0]=e.value),e.flags.pending=!0,e._cancellationToken=t,e.validator.validate("#"+e.id,n[0])},r=this._determineInputEvent(),i=this._determineEventList(r);if(At(i,r)){var o=null,a=null,s=!1;if(this.model&&this.model.expression&&(o=this.vm,a=this.model.expression,s=!0),!a&&this.componentInstance&&this.componentInstance.$options.model&&(o=this.componentInstance,a=this.componentInstance.$options.model.prop||"value"),o&&a){var u=ot(n,this.delay[r],t),c=o.$watch(a,u);this.watchers.push({tag:"input_model",unwatch:function(){e.vm.$nextTick(function(){c()})}}),s&&(i=i.filter(function(e){return e!==r}))}}i.forEach(function(r){var i=ot(n,e.delay[r],t);e._addComponentEventListener(r,i),e._addHTMLEventListener(r,i)})}},Gn.prototype._addComponentEventListener=function(e,t){var n=this;this.componentInstance&&(this.componentInstance.$on(e,t),this.watchers.push({tag:"input_vue",unwatch:function(){n.componentInstance.$off(e,t)}}))},Gn.prototype._addHTMLEventListener=function(e,t){var n=this;if(this.el&&!this.componentInstance){var r=function(r){qn(r,e,t),n.watchers.push({tag:"input_native",unwatch:function(){r.removeEventListener(e,t)}})};if(r(this.el),Je(this.el)){var i=document.querySelectorAll('input[name="'+this.el.name+'"]');pt(i).forEach(function(e){e._veeValidateId&&e!==n.el||r(e)})}}},Gn.prototype.updateAriaAttrs=function(){var e=this;if(this.aria&&this.el&&ft(this.el.setAttribute)){var t=function(t){t.setAttribute("aria-required",e.isRequired?"true":"false"),t.setAttribute("aria-invalid",e.flags.invalid?"true":"false")};if(Je(this.el)){var n=document.querySelectorAll('input[name="'+this.el.name+'"]');pt(n).forEach(t)}else t(this.el)}},Gn.prototype.updateCustomValidity=function(){this.validity&&this.el&&ft(this.el.setCustomValidity)&&this.validator.errors&&this.el.setCustomValidity(this.flags.valid?"":this.validator.errors.firstById(this.id)||"")},Gn.prototype.destroy=function(){this._cancellationToken&&(this._cancellationToken.cancelled=!0),this.unwatch(),this.dependencies.forEach(function(e){return e.field.destroy()}),this.dependencies=[]},Object.defineProperties(Gn.prototype,Kn);var Qn=function(e){void 0===e&&(e=[]),this.items=e||[],this.itemsById=this.items.reduce(function(e,t){return e[t.id]=t,e},{})},Zn={length:{configurable:!0}};Qn.prototype["function"==typeof Symbol?Symbol.iterator:"@@iterator"]=function(){var e=this,t=0;return{next:function(){return{value:e.items[t++],done:t>e.items.length}}}},Zn.length.get=function(){return this.items.length},Qn.prototype.find=function(e){return wt(this.items,function(t){return t.matches(e)})},Qn.prototype.findById=function(e){return this.itemsById[e]||null},Qn.prototype.filter=function(e){return Array.isArray(e)?this.items.filter(function(t){return e.some(function(e){return t.matches(e)})}):this.items.filter(function(t){return t.matches(e)})},Qn.prototype.map=function(e){return this.items.map(e)},Qn.prototype.remove=function(e){var t=null;if(!(t=e instanceof Gn?e:this.find(e)))return null;var n=this.items.indexOf(t);return this.items.splice(n,1),delete this.itemsById[t.id],t},Qn.prototype.push=function(e){if(!(e instanceof Gn))throw ct("FieldBag only accepts instances of Field that has an id defined.");if(!e.id)throw ct("Field id must be defined.");if(this.findById(e.id))throw ct("Field with id "+e.id+" is already added.");this.items.push(e),this.itemsById[e.id]=e},Object.defineProperties(Qn.prototype,Zn);var Jn=function(e,t){this.id=t._uid,this._base=e,this._paused=!1,this.errors=new Sn(e.errors,this.id)},Xn={flags:{configurable:!0},rules:{configurable:!0},fields:{configurable:!0},dictionary:{configurable:!0},locale:{configurable:!0}};Xn.flags.get=function(){var e=this;return this._base.fields.items.filter(function(t){return t.vmId===e.id}).reduce(function(e,t){return t.scope&&(e["$"+t.scope]||(e["$"+t.scope]={}),e["$"+t.scope][t.name]=t.flags),e[t.name]=t.flags,e},{})},Xn.rules.get=function(){return this._base.rules},Xn.fields.get=function(){return new Qn(this._base.fields.filter({vmId:this.id}))},Xn.dictionary.get=function(){return this._base.dictionary},Xn.locale.get=function(){return this._base.locale},Xn.locale.set=function(e){this._base.locale=e},Jn.prototype.localize=function(){for(var e,t=[],n=arguments.length;n--;)t[n]=arguments[n];return(e=this._base).localize.apply(e,t)},Jn.prototype.update=function(){for(var e,t=[],n=arguments.length;n--;)t[n]=arguments[n];return(e=this._base).update.apply(e,t)},Jn.prototype.attach=function(e){var t=mt({},e,{vmId:this.id});return this._base.attach(t)},Jn.prototype.pause=function(){this._paused=!0},Jn.prototype.resume=function(){this._paused=!1},Jn.prototype.remove=function(e){return this._base.remove(e)},Jn.prototype.detach=function(e,t){return this._base.detach(e,t,this.id)},Jn.prototype.extend=function(){for(var e,t=[],n=arguments.length;n--;)t[n]=arguments[n];return(e=this._base).extend.apply(e,t)},Jn.prototype.validate=function(e,t,n){return void 0===n&&(n={}),this._paused?Promise.resolve(!0):this._base.validate(e,t,mt({},{vmId:this.id},n||{}))},Jn.prototype.verify=function(){for(var e,t=[],n=arguments.length;n--;)t[n]=arguments[n];return(e=this._base).verify.apply(e,t)},Jn.prototype.validateAll=function(e,t){return void 0===t&&(t={}),this._paused?Promise.resolve(!0):this._base.validateAll(e,mt({},{vmId:this.id},t||{}))},Jn.prototype.validateScopes=function(e){return void 0===e&&(e={}),this._paused?Promise.resolve(!0):this._base.validateScopes(mt({},{vmId:this.id},e||{}))},Jn.prototype.destroy=function(){delete this.id,delete this._base},Jn.prototype.reset=function(e){return this._base.reset(Object.assign({},e||{},{vmId:this.id}))},Jn.prototype.flag=function(){for(var e,t=[],n=arguments.length;n--;)t[n]=arguments[n];return(e=this._base).flag.apply(e,t.concat([this.id]))},Jn.prototype._resolveField=function(){for(var e,t=[],n=arguments.length;n--;)t[n]=arguments[n];return(e=this._base)._resolveField.apply(e,t)},Object.defineProperties(Jn.prototype,Xn);var er=null,tr=function(){return er},nr={provide:function(){return this.$validator&&!_t(this.$vnode)?{$validator:this.$validator}:{}},beforeCreate:function(){if(!_t(this.$vnode)&&!1!==this.$options.$__veeInject){this.$parent||Pn(this.$options.$_veeValidate||{});var e=In(this);(!this.$parent||this.$options.$_veeValidate&&/new/.test(this.$options.$_veeValidate.validator))&&(this.$validator=new Jn(tr(),this));var t=(r=this.$options.inject,!(!lt(r)||!r.$validator));if(this.$validator||!e.inject||t||(this.$validator=new Jn(tr(),this)),t||this.$validator){if(!t&&this.$validator){var n=this.$options._base;n.util.defineReactive(this.$validator,"errors",this.$validator.errors)}this.$options.computed||(this.$options.computed={}),this.$options.computed[e.errorBagName||"errors"]=function(){return this.$validator.errors},this.$options.computed[e.fieldsBagName||"fields"]=function(){return this.$validator.fields.items.reduce(function(e,t){return t.scope?(e["$"+t.scope]||(e["$"+t.scope]={}),e["$"+t.scope][t.name]=t.flags,e):(e[t.name]=t.flags,e)},{})}}}var r},beforeDestroy:function(){this.$validator&&this._uid===this.$validator.id&&this.$validator.errors.clear()}};function rr(e,t){return t&&t.$validator?t.$validator.fields.findById(e._veeValidateId):null}var ir={bind:function(e,t,n){var r=n.context.$validator;if(r){var i=Bn.generate(e,t,n);r.attach(i)}else ut("No validator instance is present on vm, did you forget to inject '$validator'?")},inserted:function(e,t,n){var r=rr(e,n.context),i=Bn.resolveScope(e,t,n);r&&i!==r.scope&&(r.update({scope:i}),r.updated=!1)},update:function(e,t,n){var r=rr(e,n.context);if(!(!r||r.updated&&nt(t.value,t.oldValue))){var i=Bn.resolveScope(e,t,n),o=Bn.resolveRules(e,t,n);r.update({scope:i,rules:o})}},unbind:function(e,t,n){var r=n.context,i=rr(e,r);i&&r.$validator.detach(i)}},or=function(e,t,n){void 0===t&&(t={fastExit:!0}),void 0===n&&(n=null),this.errors=new Sn,this.fields=new Qn,this._createFields(e),this.paused=!1,this.fastExit=!!tt(t&&t.fastExit)||t.fastExit,this.$vee=n||{_vm:{$nextTick:function(e){return ft(e)?e():Promise.resolve()},$emit:function(){},$off:function(){}}}},ar={rules:{configurable:!0},dictionary:{configurable:!0},flags:{configurable:!0},locale:{configurable:!0}},sr={rules:{configurable:!0},dictionary:{configurable:!0},locale:{configurable:!0}};sr.rules.get=function(){return ut('this accessor will be deprecated, use `import { rules } from "vee-validate"` instead.'),zn.rules},ar.rules.get=function(){return ut('this accessor will be deprecated, use `import { rules } from "vee-validate"` instead.'),zn.rules},ar.dictionary.get=function(){return An.getDriver()},sr.dictionary.get=function(){return An.getDriver()},ar.flags.get=function(){return this.fields.items.reduce(function(e,t){var n;return t.scope?(e["$"+t.scope]=((n={})[t.name]=t.flags,n),e):(e[t.name]=t.flags,e)},{})},ar.locale.get=function(){return or.locale},ar.locale.set=function(e){or.locale=e},sr.locale.get=function(){return An.getDriver().locale},sr.locale.set=function(e){var t=e!==An.getDriver().locale;An.getDriver().locale=e,t&&or.$vee&&or.$vee._vm&&or.$vee._vm.$emit("localeChanged")},or.create=function(e,t){return ut("Please use `new` to create new validator instances."),new or(e,t)},or.extend=function(e,t,n){void 0===n&&(n={}),or._guardExtend(e,t);var r=t.options||{};or._merge(e,{validator:t,paramNames:n&&n.paramNames||t.paramNames,options:mt({hasTarget:!1,immediate:!0},r,n||{})})},or.remove=function(e){ut("this method will be deprecated, you can still override your rules with `extend`"),zn.remove(e)},or.prototype.localize=function(e,t){or.localize(e,t)},or.localize=function(e,t){var n;if(lt(e))An.getDriver().merge(e);else{if(t){var r=e||t.name;t=mt({},t),An.getDriver().merge(((n={})[r]=t,n))}e&&(or.locale=e)}},or.prototype.attach=function(e){var t=this,n={name:e.name,scope:e.scope,persist:!0},r=e.persist?this.fields.find(n):null;r&&(e.flags=r.flags,r.destroy(),this.fields.remove(r));var i=e.initialValue,o=new Gn(e);return this.fields.push(o),o.immediate?this.$vee._vm.$nextTick(function(){return t.validate("#"+o.id,i||o.value,{vmId:e.vmId})}):this._validate(o,i||o.value,{initial:!0}).then(function(e){o.flags.valid=e.valid,o.flags.invalid=!e.valid}),o},or.prototype.flag=function(e,t,n){void 0===n&&(n=null);var r=this._resolveField(e,void 0,n);r&&t&&r.setFlags(t)},or.prototype.detach=function(e,t,n){var r=ft(e.destroy)?e:this._resolveField(e,t,n);r&&(r.persist||(r.destroy(),this.errors.remove(r.name,r.scope,r.vmId),this.fields.remove(r)))},or.prototype.extend=function(e,t,n){void 0===n&&(n={}),or.extend(e,t,n)},or.prototype.reset=function(e){var t=this;return this.$vee._vm.$nextTick().then(function(){return t.$vee._vm.$nextTick()}).then(function(){t.fields.filter(e).forEach(function(n){n.waitFor(null),n.reset(),t.errors.remove(n.name,n.scope,e&&e.vmId)})})},or.prototype.update=function(e,t){var n=t.scope,r=this._resolveField("#"+e);r&&this.errors.update(e,{scope:n})},or.prototype.remove=function(e){or.remove(e)},or.prototype.validate=function(e,t,n){var r=this;void 0===n&&(n={});var i=n.silent,o=n.vmId;if(this.paused)return Promise.resolve(!0);if(tt(e))return this.validateScopes({silent:i,vmId:o});if("*"===e)return this.validateAll(void 0,{silent:i,vmId:o});if(/^(.+)\.\*$/.test(e)){var a=e.match(/^(.+)\.\*$/)[1];return this.validateAll(a)}var s=this._resolveField(e);if(!s)return this._handleFieldNotFound(e);i||(s.flags.pending=!0),void 0===t&&(t=s.value);var u=this._validate(s,t);return s.waitFor(u),u.then(function(e){return!i&&s.isWaitingFor(u)&&(s.waitFor(null),r._handleValidationResults([e],o)),e.valid})},or.prototype.pause=function(){return this.paused=!0,this},or.prototype.resume=function(){return this.paused=!1,this},or.prototype.validateAll=function(e,t){var n=this;void 0===t&&(t={});var r=t.silent,i=t.vmId;if(this.paused)return Promise.resolve(!0);var o=null,a=!1;return"string"==typeof e?o={scope:e,vmId:i}:lt(e)?(o=Object.keys(e).map(function(e){return{name:e,vmId:i,scope:null}}),a=!0):o=Array.isArray(e)?e.map(function(e){return"object"==typeof e?Object.assign({vmId:i},e):{name:e,vmId:i}}):{scope:null,vmId:i},Promise.all(this.fields.filter(o).map(function(t){return n._validate(t,a?e[t.name]:t.value)})).then(function(e){return r||n._handleValidationResults(e,i),e.every(function(e){return e.valid})})},or.prototype.validateScopes=function(e){var t=this;void 0===e&&(e={});var n=e.silent,r=e.vmId;return this.paused?Promise.resolve(!0):Promise.all(this.fields.filter({vmId:r}).map(function(e){return t._validate(e,e.value)})).then(function(e){return n||t._handleValidationResults(e,r),e.every(function(e){return e.valid})})},or.prototype.verify=function(e,t,n){void 0===n&&(n={});var r={name:n&&n.name||"{field}",rules:st(t),bails:it("bails",n,!0),forceRequired:!1,get isRequired(){return!!this.rules.required||this.forceRequired}},i=Object.keys(r.rules).filter(zn.isTargetRule);return i.length&&n&&lt(n.values)&&(r.dependencies=i.map(function(e){var t=r.rules[e],i=t[0];return{name:e,field:{value:n.values[i]}}})),this._validate(r,e).then(function(e){var t=[],n={};return e.errors.forEach(function(e){t.push(e.msg),n[e.rule]=e.msg}),{valid:e.valid,errors:t,failedRules:n}})},or.prototype.destroy=function(){this.$vee._vm.$off("localeChanged")},or.prototype._createFields=function(e){var t=this;e&&Object.keys(e).forEach(function(n){var r=mt({},{name:n,rules:e[n]});t.attach(r)})},or.prototype._getDateFormat=function(e){var t=null;return e.date_format&&Array.isArray(e.date_format)&&(t=e.date_format[0]),t||An.getDriver().getDateFormat(this.locale)},or.prototype._formatErrorMessage=function(e,t,n,r){void 0===n&&(n={}),void 0===r&&(r=null);var i=this._getFieldDisplayName(e),o=this._getLocalizedParams(t,r);return An.getDriver().getFieldMessage(this.locale,e.name,t.name,[i,o,n])},or.prototype._convertParamObjectToArray=function(e,t){if(Array.isArray(e))return e;var n=zn.getParamNames(t);return n&&lt(e)?n.reduce(function(t,n){return n in e&&t.push(e[n]),t},[]):e},or.prototype._getLocalizedParams=function(e,t){void 0===t&&(t=null);var n=this._convertParamObjectToArray(e.params,e.name);if(e.options.hasTarget&&n&&n[0]){var r=t||An.getDriver().getAttribute(this.locale,n[0],n[0]);return[r].concat(n.slice(1))}return n},or.prototype._getFieldDisplayName=function(e){return e.alias||An.getDriver().getAttribute(this.locale,e.name,e.name)},or.prototype._convertParamArrayToObj=function(e,t){var n=zn.getParamNames(t);if(!n)return e;if(lt(e)){var r=n.some(function(t){return-1!==Object.keys(e).indexOf(t)});if(r)return e;e=[e]}return e.reduce(function(e,t,r){return e[n[r]]=t,e},{})},or.prototype._test=function(e,t,n){var r=this,i=zn.getValidatorMethod(n.name),o=Array.isArray(n.params)?pt(n.params):n.params;o||(o=[]);var a=null;if(!i||"function"!=typeof i)return Promise.reject(ct("No such validator '"+n.name+"' exists."));if(n.options.hasTarget&&e.dependencies){var s=wt(e.dependencies,function(e){return e.name===n.name});s&&(a=s.field.alias,o=[s.field.value].concat(o.slice(1)))}else"required"===n.name&&e.rejectsFalse&&(o=o.length?o:[!0]);if(n.options.isDate){var u=this._getDateFormat(e.rules);"date_format"!==n.name&&o.push(u)}var c=i(t,this._convertParamArrayToObj(o,n.name));return ft(c.then)?c.then(function(t){var i=!0,o={};return Array.isArray(t)?i=t.every(function(e){return lt(e)?e.valid:e}):(i=lt(t)?t.valid:t,o=t.data),{valid:i,data:c.data,errors:i?[]:[r._createFieldError(e,n,o,a)]}}):(lt(c)||(c={valid:c,data:{}}),{valid:c.valid,data:c.data,errors:c.valid?[]:[this._createFieldError(e,n,c.data,a)]})},or._merge=function(e,t){var n=t.validator,r=t.options,i=t.paramNames,o=ft(n)?n:n.validate;n.getMessage&&An.getDriver().setMessage(or.locale,e,n.getMessage),zn.add(e,{validate:o,options:r,paramNames:i})},or._guardExtend=function(e,t){if(!ft(t)&&!ft(t.validate))throw ct("Extension Error: The validator '"+e+"' must be a function or have a 'validate' method.")},or.prototype._createFieldError=function(e,t,n,r){var i=this;return{id:e.id,vmId:e.vmId,field:e.name,msg:this._formatErrorMessage(e,t,n,r),rule:t.name,scope:e.scope,regenerate:function(){return i._formatErrorMessage(e,t,n,r)}}},or.prototype._resolveField=function(e,t,n){if("#"===e[0])return this.fields.findById(e.slice(1));if(!tt(t))return this.fields.find({name:e,scope:t,vmId:n});if(At(e,".")){var r=e.split("."),i=r[0],o=r.slice(1),a=this.fields.find({name:o.join("."),scope:i,vmId:n});if(a)return a}return this.fields.find({name:e,scope:null,vmId:n})},or.prototype._handleFieldNotFound=function(e,t){var n=tt(t)?e:(tt(t)?"":t+".")+e;return Promise.reject(ct('Validating a non-existent field: "'+n+'". Use "attach()" first.'))},or.prototype._handleValidationResults=function(e,t){var n=this,r=e.map(function(e){return{id:e.id}});this.errors.removeById(r.map(function(e){return e.id})),e.forEach(function(e){n.errors.remove(e.field,e.scope,t)});var i=e.reduce(function(e,t){return e.push.apply(e,t.errors),e},[]);this.errors.add(i),this.fields.filter(r).forEach(function(t){var n=wt(e,function(e){return e.id===t.id});t.setFlags({pending:!1,valid:n.valid,validated:!0})})},or.prototype._shouldSkip=function(e,t){return!1!==e.bails&&(!(!e.isDisabled||!On().useConstraintAttrs)||!e.isRequired&&(tt(t)||""===t||St(t)))},or.prototype._shouldBail=function(e){return void 0!==e.bails?e.bails:this.fastExit},or.prototype._validate=function(e,t,n){var r=this;void 0===n&&(n={});var i=n.initial,o=Object.keys(e.rules).filter(zn.isRequireRule);if(e.forceRequired=!1,o.forEach(function(n){var i=zn.getOptions(n),o=r._test(e,t,{name:n,params:e.rules[n],options:i});if(ft(o.then))throw ct("Require rules cannot be async");if(!lt(o))throw ct("Require rules has to return an object (see docs)");!0===o.data.required&&(e.forceRequired=!0)}),this._shouldSkip(e,t))return Promise.resolve({valid:!0,id:e.id,field:e.name,scope:e.scope,errors:[]});var a=[],s=[],u=!1;return ft(e.checkValueChanged)&&(e.flags.changed=e.checkValueChanged()),Object.keys(e.rules).filter(function(e){return!i||!zn.has(e)||zn.isImmediate(e)}).some(function(n){var i=zn.getOptions(n),o=r._test(e,t,{name:n,params:e.rules[n],options:i});return ft(o.then)?a.push(o):!o.valid&&r._shouldBail(e)?(s.push.apply(s,o.errors),u=!0):a.push(new Promise(function(e){return e(o)})),u}),u?Promise.resolve({valid:!1,errors:s,id:e.id,field:e.name,scope:e.scope}):Promise.all(a).then(function(t){return t.reduce(function(e,t){var n;return t.valid||(n=e.errors).push.apply(n,t.errors),e.valid=e.valid&&t.valid,e},{valid:!0,errors:s,id:e.id,field:e.name,scope:e.scope})})},Object.defineProperties(or.prototype,ar),Object.defineProperties(or,sr);var ur=function(e){return lt(e)?Object.keys(e).reduce(function(t,n){return t[n]=ur(e[n]),t},{}):ft(e)?e("{0}",["{1}","{2}","{3}"]):e},cr=function(e,t){this.i18n=e,this.rootKey=t},lr={locale:{configurable:!0}};lr.locale.get=function(){return this.i18n.locale},lr.locale.set=function(e){ut("Cannot set locale from the validator when using vue-i18n, use i18n.locale setter instead")},cr.prototype.getDateFormat=function(e){return this.i18n.getDateTimeFormat(e||this.locale)},cr.prototype.setDateFormat=function(e,t){this.i18n.setDateTimeFormat(e||this.locale,t)},cr.prototype.getMessage=function(e,t,n){var r=this.rootKey+".messages."+t,i=n;return Array.isArray(n)&&(i=[].concat.apply([],n)),this.i18n.te(r)?this.i18n.t(r,i):this.i18n.te(r,this.i18n.fallbackLocale)?this.i18n.t(r,this.i18n.fallbackLocale,i):this.i18n.t(this.rootKey+".messages._default",i)},cr.prototype.getAttribute=function(e,t,n){void 0===n&&(n="");var r=this.rootKey+".attributes."+t;return this.i18n.te(r)?this.i18n.t(r):n},cr.prototype.getFieldMessage=function(e,t,n,r){var i=this.rootKey+".custom."+t+"."+n;return this.i18n.te(i)?this.i18n.t(i,r):this.getMessage(e,n,r)},cr.prototype.merge=function(e){var t=this;Object.keys(e).forEach(function(n){var r,i=xt({},it(n+"."+t.rootKey,t.i18n.messages,{})),o=xt(i,function(e){var t={};return e.messages&&(t.messages=ur(e.messages)),e.custom&&(t.custom=ur(e.custom)),e.attributes&&(t.attributes=e.attributes),tt(e.dateFormat)||(t.dateFormat=e.dateFormat),t}(e[n]));t.i18n.mergeLocaleMessage(n,((r={})[t.rootKey]=o,r)),o.dateFormat&&t.i18n.setDateTimeFormat(n,o.dateFormat)})},cr.prototype.setMessage=function(e,t,n){var r,i;this.merge(((i={})[e]={messages:(r={},r[t]=n,r)},i))},cr.prototype.setAttribute=function(e,t,n){var r,i;this.merge(((i={})[e]={attributes:(r={},r[t]=n,r)},i))},Object.defineProperties(cr.prototype,lr);var fr,hr,dr,pr={aggressive:function(){return{on:["input"]}},eager:function(e){var t=e.errors;return t.length?{on:["input"]}:{on:["change","blur"]}},passive:function(){return{on:[]}},lazy:function(){return{on:["change"]}}},vr=function(e,t){var n;this.configure(e),dr=this,t&&(fr=t),this._validator=(n=new or(null,{fastExit:e&&e.fastExit},this),er=n,n),this._initVM(this.config),this._initI18n(this.config)},mr={i18nDriver:{configurable:!0},config:{configurable:!0}},yr={i18nDriver:{configurable:!0},config:{configurable:!0}};vr.setI18nDriver=function(e,t){An.setDriver(e,t)},vr.configure=function(e){Pn(e)},vr.setMode=function(e,t){if(Pn({mode:e}),t){if(!ft(t))throw new Error("A mode implementation must be a function");pr[e]=t}},vr.use=function(e,t){return void 0===t&&(t={}),ft(e)?dr?void e({Validator:or,ErrorBag:Sn,Rules:or.rules},t):(hr||(hr=[]),void hr.push({plugin:e,options:t})):ut("The plugin must be a callable function")},vr.install=function(e,t){fr&&e===fr?ut("already installed, Vue.use(VeeValidate) should only be called once."):(fr=e,dr=new vr(t),or.$vee=dr,function(){try{var e=Object.defineProperty({},"passive",{get:function(){Hn=!0}});window.addEventListener("testPassive",null,e),window.removeEventListener("testPassive",null,e)}catch(e){Hn=!1}}(),fr.mixin(nr),fr.directive("validate",ir),hr&&(hr.forEach(function(e){var t=e.plugin,n=e.options;vr.use(t,n)}),hr=null))},mr.i18nDriver.get=function(){return An.getDriver()},yr.i18nDriver.get=function(){return An.getDriver()},mr.config.get=function(){return On()},yr.config.get=function(){return On()},vr.prototype._initVM=function(e){var t=this;this._vm=new fr({data:function(){return{errors:t._validator.errors,fields:t._validator.fields}}})},vr.prototype._initI18n=function(e){var t=this,n=e.dictionary,r=e.i18n,i=e.i18nRootKey,o=e.locale,a=function(){n&&t.i18nDriver.merge(n),t._validator.errors.regenerate()};r?(vr.setI18nDriver("i18n",new cr(r,i)),r._vm.$watch("locale",a)):"undefined"!=typeof window&&this._vm.$on("localeChanged",a),n&&this.i18nDriver.merge(n),o&&!r&&this._validator.localize(o)},vr.prototype.configure=function(e){Pn(e)},Object.defineProperties(vr.prototype,mr),Object.defineProperties(vr,yr),vr.mixin=nr,vr.directive=ir,vr.Validator=or,vr.ErrorBag=Sn;var gr=function(e,t){var n={pristine:function(e,t){return e&&t},dirty:function(e,t){return e||t},touched:function(e,t){return e||t},untouched:function(e,t){return e&&t},valid:function(e,t){return e&&t},invalid:function(e,t){return e||t},pending:function(e,t){return e||t},required:function(e,t){return e||t},validated:function(e,t){return e&&t}};return Object.keys(n).reduce(function(r,i){return r[i]=n[i](e[i],t[i]),r},{})},br=function(e,t){return void 0===t&&(t=!0),Object.keys(e).reduce(function(n,r){if(!n)return n=mt({},e[r]);var i=0===r.indexOf("$");return t&&i?gr(br(e[r]),n):!t&&i?n:n=gr(n,e[r])},null)},wr=null,_r=0,kr={$__veeInject:!1,inject:{$_veeObserver:{from:"$_veeObserver",default:function(){return this.$vnode.context.$_veeObserver||(this.$vnode.context.$_veeObserver={refs:{},subscribe:function(e){this.refs[e.vid]=e},unsubscribe:function(e){delete this.refs[e.vid]}}),this.$vnode.context.$_veeObserver}}},props:{vid:{type:[String,Number],default:function(){return"_vee_"+ ++_r}},name:{type:String,default:null},mode:{type:[String,Function],default:function(){return On().mode}},events:{type:Array,validate:function(){return ut("events prop and config will be deprecated in future version please use the interaction modes instead"),!0},default:function(){var e=On().events;return"string"==typeof e?e.split("|"):e}},rules:{type:[Object,String],default:null},immediate:{type:Boolean,default:!1},persist:{type:Boolean,default:!1},bails:{type:Boolean,default:function(){return On().fastExit}},debounce:{type:Number,default:function(){return On().delay||0}},tag:{type:String,default:"span"},slim:{type:Boolean,default:!1}},watch:{rules:{deep:!0,handler:function(e,t){this._needsValidation=!nt(e,t)}}},data:function(){return{messages:[],value:void 0,initialized:!1,initialValue:void 0,flags:{untouched:!0,touched:!1,dirty:!1,pristine:!0,valid:null,invalid:null,validated:!1,pending:!1,required:!1,changed:!1},failedRules:{},forceRequired:!1,isDeactivated:!1,id:null}},computed:{isValid:function(){return this.flags.valid},fieldDeps:function(){var e=this,t=st(this.rules);return Object.keys(t).filter(zn.isTargetRule).map(function(n){var r=t[n][0];return function e(t,n,r){void 0===r&&(r=!0);var i=t.$_veeObserver.refs;if(t._veeWatchers||(t._veeWatchers={}),!i[n]&&r)return t.$once("hook:mounted",function(){e(t,n,!1)});!ft(t._veeWatchers[n])&&i[n]&&(t._veeWatchers[n]=i[n].$watch("value",function(){t.flags.validated&&(t._needsValidation=!0,t.validate())}))}(e,r),r})},normalizedEvents:function(){var e=this,t=Er(this),n=t.on;return Yn(n||this.events||[]).map(function(t){return"input"===t?e._inputEventName:t})},isRequired:function(){var e=st(this.rules),t=this.forceRequired,n=e.required||t;return this.flags.required=n,n},classes:function(){var e=this,t=On().classNames;return Object.keys(this.flags).reduce(function(n,r){var i=t&&t[r]||r;return tt(e.flags[r])?n:(i&&(n[i]=e.flags[r]),n)},{})}},render:function(e){var t=this;this.registerField();var n=xr(this),r=this.$scopedSlots.default;if(!ft(r))return ut('ValidationProvider expects a scoped slot. Did you forget to add "v-slot" to your slot?'),e(this.tag,this.$slots.default);var i=r(n);return Ln(i).forEach(function(e){(function(e){var t=Dn(e);this._inputEventName=this._inputEventName||Rn(e,t),Tr.call(this,t);var n=Ar(this),r=n.onInput,i=n.onBlur,o=n.onValidate;Nn(e,this._inputEventName,r),Nn(e,"blur",i),this.normalizedEvents.forEach(function(t){Nn(e,t,o)}),this.initialized=!0}).call(t,e)}),this.slim?Fn(e,i):e(this.tag,i)},beforeDestroy:function(){this.$_veeObserver.unsubscribe(this)},activated:function(){this.$_veeObserver.subscribe(this),this.isDeactivated=!1},deactivated:function(){this.$_veeObserver.unsubscribe(this),this.isDeactivated=!0},methods:{setFlags:function(e){var t=this;Object.keys(e).forEach(function(n){t.flags[n]=e[n]})},syncValue:function(e){var t=function(e){return Vn(e)?"file"===e.target.type?pt(e.target.files):e.target.value:e}(e);this.value=t,this.flags.changed=this.initialValue!==t},reset:function(){this.messages=[],this._pendingValidation=null,this.initialValue=this.value;var e={untouched:!0,touched:!1,dirty:!1,pristine:!0,valid:null,invalid:null,validated:!1,pending:!1,required:!1,changed:!1};this.setFlags(e)},validate:function(){for(var e=this,t=[],n=arguments.length;n--;)t[n]=arguments[n];return t.length>0&&this.syncValue(t[0]),this.validateSilent().then(function(t){return e.applyResult(t),t})},validateSilent:function(){var e,t,n=this;return this.setFlags({pending:!0}),wr.verify(this.value,this.rules,{name:this.name,values:(e=this,t=e.$_veeObserver.refs,e.fieldDeps.reduce(function(e,n){return t[n]?(e[n]=t[n].value,e):e},{})),bails:this.bails}).then(function(e){return n.setFlags({pending:!1}),n.isRequired||n.setFlags({valid:e.valid,invalid:!e.valid}),e})},applyResult:function(e){var t=e.errors,n=e.failedRules;this.messages=t,this.failedRules=mt({},n),this.setFlags({valid:!t.length,changed:this.value!==this.initialValue,invalid:!!t.length,validated:!0})},registerField:function(){wr||(wr=tr()||new or(null,{fastExit:On().fastExit})),function(e){tt(e.id)&&e.id===e.vid&&(e.id=_r,_r++);var t=e.id,n=e.vid;e.isDeactivated||t===n&&e.$_veeObserver.refs[t]||(t!==n&&e.$_veeObserver.refs[t]===e&&e.$_veeObserver.unsubscribe({vid:t}),e.$_veeObserver.subscribe(e),e.id=n)}(this)}}};function xr(e){return{errors:e.messages,flags:e.flags,classes:e.classes,valid:e.isValid,failedRules:e.failedRules,reset:function(){return e.reset()},validate:function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return e.validate.apply(e,t)},aria:{"aria-invalid":e.flags.invalid?"true":"false","aria-required":e.isRequired?"true":"false"}}}function Er(e){var t=ft(e.mode)?e.mode:pr[e.mode];return t({errors:e.messages,value:e.value,flags:e.flags})}function Tr(e){this.initialized||(this.initialValue=e.value);var t=function(e,t){return!(e._ignoreImmediate||!e.immediate)||(e.value!==t.value||(!!e._needsValidation||!e.initialized&&void 0===t.value))}(this,e);this._needsValidation=!1,this.value=e.value,this._ignoreImmediate=!0,t&&this.validateSilent().then(this.immediate||this.flags.validated?this.applyResult:function(e){return e})}function Ar(e){var t=e.$veeHandler,n=Er(e);return t&&e.$veeDebounce===e.debounce||(t=ot(function(){e.$nextTick(function(){var t=e.validateSilent();e._pendingValidation=t,t.then(function(n){t===e._pendingValidation&&(e.applyResult(n),e._pendingValidation=null)})})},n.debounce||e.debounce),e.$veeHandler=t,e.$veeDebounce=e.debounce),{onInput:function(t){e.syncValue(t),e.setFlags({dirty:!0,pristine:!1})},onBlur:function(){e.setFlags({touched:!0,untouched:!1})},onValidate:t}}var Sr,Cr={pristine:"every",dirty:"some",touched:"some",untouched:"every",valid:"every",invalid:"some",pending:"some",validated:"every"},Ir=0,Or={name:"ValidationObserver",provide:function(){return{$_veeObserver:this}},inject:{$_veeObserver:{from:"$_veeObserver",default:function(){return this.$vnode.context.$_veeObserver?this.$vnode.context.$_veeObserver:null}}},props:{tag:{type:String,default:"span"},slim:{type:Boolean,default:!1}},data:function(){return{vid:"obs_"+Ir++,refs:{},observers:[],persistedStore:{}}},computed:{ctx:function(){var e=this,t={errors:{},validate:function(t){var n=e.validate(t);return{then:function(e){return n.then(function(t){return t&&ft(e)?Promise.resolve(e()):Promise.resolve(t)})}}},reset:function(){return e.reset()}};return Tt(this.refs).concat(Object.keys(this.persistedStore).map(function(t){return{vid:t,flags:e.persistedStore[t].flags,messages:e.persistedStore[t].errors}}),this.observers).reduce(function(e,t){return Object.keys(Cr).forEach(function(n){var r,i,o,a=t.flags||t.ctx;e[n]=n in e?(r=e[n],i=a[n],o=Cr[n],[r,i][o](function(e){return e})):a[n]}),e.errors[t.vid]=t.messages||Tt(t.ctx.errors).reduce(function(e,t){return e.concat(t)},[]),e},t)}},created:function(){this.$_veeObserver&&this.$_veeObserver.subscribe(this,"observer")},activated:function(){this.$_veeObserver&&this.$_veeObserver.subscribe(this,"observer")},deactivated:function(){this.$_veeObserver&&this.$_veeObserver.unsubscribe(this,"observer")},beforeDestroy:function(){this.$_veeObserver&&this.$_veeObserver.unsubscribe(this,"observer")},render:function(e){var t=this.$slots.default||this.$scopedSlots.default||[];return ft(t)&&(t=t(this.ctx)),this.slim?Fn(e,t):e(this.tag,{on:this.$listeners,attrs:this.$attrs},t)},methods:{subscribe:function(e,t){var n;void 0===t&&(t="provider"),"observer"!==t?(this.refs=Object.assign({},this.refs,((n={})[e.vid]=e,n)),e.persist&&this.persistedStore[e.vid]&&this.restoreProviderState(e)):this.observers.push(e)},unsubscribe:function(e,t){var n=e.vid;void 0===t&&(t="provider"),"provider"===t&&this.removeProvider(n);var r=bt(this.observers,function(e){return e.vid===n});-1!==r&&this.observers.splice(r,1)},validate:function(e){void 0===e&&(e={silent:!1});var t=e.silent;return Promise.all(Tt(this.refs).map(function(e){return e[t?"validateSilent":"validate"]().then(function(e){return e.valid})}).concat(this.observers.map(function(e){return e.validate({silent:t})}))).then(function(e){return e.every(function(e){return e})})},reset:function(){var e=this;return Object.keys(this.persistedStore).forEach(function(t){e.$delete(e.persistedStore,t)}),Tt(this.refs).concat(this.observers).forEach(function(e){return e.reset()})},restoreProviderState:function(e){var t=this.persistedStore[e.vid];e.setFlags(t.flags),e.applyResult(t),this.$delete(this.persistedStore,e.vid)},removeProvider:function(e){var t,n=this.refs[e];n&&n.persist&&(0===e.indexOf("_vee_")&&ut("Please provide a `vid` prop when using `persist`, there might be unexpected issues otherwise."),this.persistedStore=mt({},this.persistedStore,((t={})[e]={flags:n.flags,errors:n.messages,failedRules:n.failedRules},t))),this.$delete(this.refs,e)}}},Pr={name:"en",messages:{_default:function(e){return"The "+e+" value is not valid."},after:function(e,t){var n=t[0],r=t[1];return"The "+e+" must be after "+(r?"or equal to ":"")+n+"."},alpha:function(e){return"The "+e+" field may only contain alphabetic characters."},alpha_dash:function(e){return"The "+e+" field may contain alpha-numeric characters as well as dashes and underscores."},alpha_num:function(e){return"The "+e+" field may only contain alpha-numeric characters."},alpha_spaces:function(e){return"The "+e+" field may only contain alphabetic characters as well as spaces."},before:function(e,t){var n=t[0],r=t[1];return"The "+e+" must be before "+(r?"or equal to ":"")+n+"."},between:function(e,t){var n=t[0],r=t[1];return"The "+e+" field must be between "+n+" and "+r+"."},confirmed:function(e){return"The "+e+" confirmation does not match."},credit_card:function(e){return"The "+e+" field is invalid."},date_between:function(e,t){var n=t[0],r=t[1];return"The "+e+" must be between "+n+" and "+r+"."},date_format:function(e,t){var n=t[0];return"The "+e+" must be in the format "+n+"."},decimal:function(e,t){void 0===t&&(t=[]);var n=t[0];return void 0===n&&(n="*"),"The "+e+" field must be numeric and may contain"+(n&&"*"!==n?" "+n:"")+" decimal points."},digits:function(e,t){var n=t[0];return"The "+e+" field must be numeric and contains exactly "+n+" digits."},dimensions:function(e,t){var n=t[0],r=t[1];return"The "+e+" field must be "+n+" pixels by "+r+" pixels."},email:function(e){return"The "+e+" field must be a valid email."},excluded:function(e){return"The "+e+" field must be a valid value."},ext:function(e){return"The "+e+" field must be a valid file."},image:function(e){return"The "+e+" field must be an image."},included:function(e){return"The "+e+" field must be a valid value."},integer:function(e){return"The "+e+" field must be an integer."},ip:function(e){return"The "+e+" field must be a valid ip address."},ip_or_fqdn:function(e){return"The "+e+" field must be a valid ip address or FQDN."},length:function(e,t){var n=t[0],r=t[1];return r?"The "+e+" length must be between "+n+" and "+r+".":"The "+e+" length must be "+n+"."},max:function(e,t){var n=t[0];return"The "+e+" field may not be greater than "+n+" characters."},max_value:function(e,t){var n=t[0];return"The "+e+" field must be "+n+" or less."},mimes:function(e){return"The "+e+" field must have a valid file type."},min:function(e,t){var n=t[0];return"The "+e+" field must be at least "+n+" characters."},min_value:function(e,t){var n=t[0];return"The "+e+" field must be "+n+" or more."},numeric:function(e){return"The "+e+" field may only contain numeric characters."},regex:function(e){return"The "+e+" field format is invalid."},required:function(e){return"The "+e+" field is required."},required_if:function(e,t){var n=t[0];return"The "+e+" field is required when the "+n+" field has this value."},size:function(e,t){var n=t[0];return"The "+e+" size must be less than "+function(e){var t=0==(e=1024*Number(e))?0:Math.floor(Math.log(e)/Math.log(1024));return 1*(e/Math.pow(1024,t)).toFixed(2)+" "+["Byte","KB","MB","GB","TB","PB","EB","ZB","YB"][t]}(n)+"."},url:function(e){return"The "+e+" field is not a valid URL."}},attributes:{}};return"undefined"!=typeof VeeValidate&&VeeValidate.Validator.localize(((Sr={})[Pr.name]=Pr,Sr)),Object.keys(wn).forEach(function(e){vr.Validator.extend(e,wn[e].validate,mt({},wn[e].options,{paramNames:wn[e].paramNames}))}),vr.Validator.localize({en:Pr}),vr.version="2.2.13",vr.Rules=wn,vr.mapFields=function(e){if(!e)return function(){return br(this.$validator.flags)};var t=function(e){return Array.isArray(e)?e.reduce(function(e,t){return At(t,".")?e[t.split(".")[1]]=t:e[t]=t,e},{}):e}(e);return Object.keys(t).reduce(function(e,n){var r=t[n];return e[n]=function(){if(this.$validator.flags[r])return this.$validator.flags[r];if("*"===t[n])return br(this.$validator.flags,!1);var e=r.indexOf(".");if(e<=0)return{};var i=r.split("."),o=i[0],a=i.slice(1);return o=this.$validator.flags["$"+o],"*"===(a=a.join("."))&&o?br(o):o&&o[a]?o[a]:{}},e},{})},vr.ValidationProvider=kr,vr.ValidationObserver=Or,vr.withValidation=function(e,t){void 0===t&&(t=null);var n=ft(e)?e.options:e;n.$__veeInject=!1;var r={name:(n.name||"AnonymousHoc")+"WithValidation",props:mt({},kr.props),data:kr.data,computed:mt({},kr.computed),methods:mt({},kr.methods),$__veeInject:!1,beforeDestroy:kr.beforeDestroy,inject:kr.inject};t||(t=function(e){return e});var i=n.model&&n.model.event||"input";return r.render=function(e){var r;this.registerField();var o=xr(this),a=mt({},this.$listeners),s=Dn(this.$vnode);this._inputEventName=this._inputEventName||Rn(this.$vnode,s),Tr.call(this,s);var u=Ar(this),c=u.onInput,l=u.onBlur,f=u.onValidate;jn(a,i,c),jn(a,"blur",l),this.normalizedEvents.forEach(function(e,t){jn(a,e,f)});var h,d,p=(Mn(this.$vnode)||{prop:"value"}).prop,v=mt({},this.$attrs,((r={})[p]=s.value,r),t(o));return e(n,{attrs:this.$attrs,props:v,on:a},(h=this.$slots,d=this.$vnode.context,Object.keys(h).reduce(function(e,t){return h[t].forEach(function(e){e.context||(h[t].context=d,e.data||(e.data={}),e.data.slot=t)}),e.concat(h[t])},[])))},r},vr}()},function(e,t,n){var r;!function(i,o){"use strict";var a="model",s="name",u="type",c="vendor",l="version",f="mobile",h="tablet",d={extend:function(e,t){var n={};for(var r in e)t[r]&&t[r].length%2==0?n[r]=t[r].concat(e[r]):n[r]=e[r];return n},has:function(e,t){return"string"==typeof e&&-1!==t.toLowerCase().indexOf(e.toLowerCase())},lowerize:function(e){return e.toLowerCase()},major:function(e){return"string"==typeof e?e.replace(/[^\d\.]/g,"").split(".")[0]:void 0},trim:function(e){return e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}},p={rgx:function(e,t){for(var n,r,i,o,a,s,u=0;u<t.length&&!a;){var c=t[u],l=t[u+1];for(n=r=0;n<c.length&&!a;)if(a=c[n++].exec(e))for(i=0;i<l.length;i++)s=a[++r],"object"==typeof(o=l[i])&&o.length>0?2==o.length?"function"==typeof o[1]?this[o[0]]=o[1].call(this,s):this[o[0]]=o[1]:3==o.length?"function"!=typeof o[1]||o[1].exec&&o[1].test?this[o[0]]=s?s.replace(o[1],o[2]):void 0:this[o[0]]=s?o[1].call(this,s,o[2]):void 0:4==o.length&&(this[o[0]]=s?o[3].call(this,s.replace(o[1],o[2])):void 0):this[o]=s||void 0;u+=2}},str:function(e,t){for(var n in t)if("object"==typeof t[n]&&t[n].length>0){for(var r=0;r<t[n].length;r++)if(d.has(t[n][r],e))return"?"===n?void 0:n}else if(d.has(t[n],e))return"?"===n?void 0:n;return e}},v={browser:{oldsafari:{version:{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}}},device:{amazon:{model:{"Fire Phone":["SD","KF"]}},sprint:{model:{"Evo Shift 4G":"7373KT"},vendor:{HTC:"APA",Sprint:"Sprint"}}},os:{windows:{version:{ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2000:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",10:["NT 6.4","NT 10.0"],RT:"ARM"}}}},m={browser:[[/(opera\smini)\/([\w\.-]+)/i,/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i,/(opera).+version\/([\w\.]+)/i,/(opera)[\/\s]+([\w\.]+)/i],[s,l],[/(opios)[\/\s]+([\w\.]+)/i],[[s,"Opera Mini"],l],[/\s(opr)\/([\w\.]+)/i],[[s,"Opera"],l],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i,/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,/(?:ms|\()(ie)\s([\w\.]+)/i,/(rekonq)\/([\w\.]*)/i,/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i],[s,l],[/(konqueror)\/([\w\.]+)/i],[[s,"Konqueror"],l],[/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i],[[s,"IE"],l],[/(edge|edgios|edga|edg)\/((\d+)?[\w\.]+)/i],[[s,"Edge"],l],[/(yabrowser)\/([\w\.]+)/i],[[s,"Yandex"],l],[/(puffin)\/([\w\.]+)/i],[[s,"Puffin"],l],[/(focus)\/([\w\.]+)/i],[[s,"Firefox Focus"],l],[/(opt)\/([\w\.]+)/i],[[s,"Opera Touch"],l],[/((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i],[[s,"UCBrowser"],l],[/(comodo_dragon)\/([\w\.]+)/i],[[s,/_/g," "],l],[/(windowswechat qbcore)\/([\w\.]+)/i],[[s,"WeChat(Win) Desktop"],l],[/(micromessenger)\/([\w\.]+)/i],[[s,"WeChat"],l],[/(brave)\/([\w\.]+)/i],[[s,"Brave"],l],[/(qqbrowserlite)\/([\w\.]+)/i],[s,l],[/(QQ)\/([\d\.]+)/i],[s,l],[/m?(qqbrowser)[\/\s]?([\w\.]+)/i],[s,l],[/(BIDUBrowser)[\/\s]?([\w\.]+)/i],[s,l],[/(2345Explorer)[\/\s]?([\w\.]+)/i],[s,l],[/(MetaSr)[\/\s]?([\w\.]+)/i],[s],[/(LBBROWSER)/i],[s],[/xiaomi\/miuibrowser\/([\w\.]+)/i],[l,[s,"MIUI Browser"]],[/;fbav\/([\w\.]+);/i],[l,[s,"Facebook"]],[/safari\s(line)\/([\w\.]+)/i,/android.+(line)\/([\w\.]+)\/iab/i],[s,l],[/headlesschrome(?:\/([\w\.]+)|\s)/i],[l,[s,"Chrome Headless"]],[/\swv\).+(chrome)\/([\w\.]+)/i],[[s,/(.+)/,"$1 WebView"],l],[/((?:oculus|samsung)browser)\/([\w\.]+)/i],[[s,/(.+(?:g|us))(.+)/,"$1 $2"],l],[/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i],[l,[s,"Android Browser"]],[/(sailfishbrowser)\/([\w\.]+)/i],[[s,"Sailfish Browser"],l],[/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i],[s,l],[/(dolfin)\/([\w\.]+)/i],[[s,"Dolphin"],l],[/((?:android.+)crmo|crios)\/([\w\.]+)/i],[[s,"Chrome"],l],[/(coast)\/([\w\.]+)/i],[[s,"Opera Coast"],l],[/fxios\/([\w\.-]+)/i],[l,[s,"Firefox"]],[/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i],[l,[s,"Mobile Safari"]],[/version\/([\w\.]+).+?(mobile\s?safari|safari)/i],[l,s],[/webkit.+?(gsa)\/([\w\.]+).+?(mobile\s?safari|safari)(\/[\w\.]+)/i],[[s,"GSA"],l],[/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i],[s,[l,p.str,v.browser.oldsafari.version]],[/(webkit|khtml)\/([\w\.]+)/i],[s,l],[/(navigator|netscape)\/([\w\.-]+)/i],[[s,"Netscape"],l],[/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,/(links)\s\(([\w\.]+)/i,/(gobrowser)\/?([\w\.]*)/i,/(ice\s?browser)\/v?([\w\._]+)/i,/(mosaic)[\/\s]([\w\.]+)/i],[s,l]],cpu:[[/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i],[["architecture","amd64"]],[/(ia32(?=;))/i],[["architecture",d.lowerize]],[/((?:i[346]|x)86)[;\)]/i],[["architecture","ia32"]],[/windows\s(ce|mobile);\sppc;/i],[["architecture","arm"]],[/((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i],[["architecture",/ower/,"",d.lowerize]],[/(sun4\w)[;\)]/i],[["architecture","sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+[;l]))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i],[["architecture",d.lowerize]]],device:[[/\((ipad|playbook);[\w\s\),;-]+(rim|apple)/i],[a,c,[u,h]],[/applecoremedia\/[\w\.]+ \((ipad)/],[a,[c,"Apple"],[u,h]],[/(apple\s{0,1}tv)/i],[[a,"Apple TV"],[c,"Apple"]],[/(archos)\s(gamepad2?)/i,/(hp).+(touchpad)/i,/(hp).+(tablet)/i,/(kindle)\/([\w\.]+)/i,/\s(nook)[\w\s]+build\/(\w+)/i,/(dell)\s(strea[kpr\s\d]*[\dko])/i],[c,a,[u,h]],[/(kf[A-z]+)\sbuild\/.+silk\//i],[a,[c,"Amazon"],[u,h]],[/(sd|kf)[0349hijorstuw]+\sbuild\/.+silk\//i],[[a,p.str,v.device.amazon.model],[c,"Amazon"],[u,f]],[/android.+aft([bms])\sbuild/i],[a,[c,"Amazon"],[u,"smarttv"]],[/\((ip[honed|\s\w*]+);.+(apple)/i],[a,c,[u,f]],[/\((ip[honed|\s\w*]+);/i],[a,[c,"Apple"],[u,f]],[/(blackberry)[\s-]?(\w+)/i,/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,/(hp)\s([\w\s]+\w)/i,/(asus)-?(\w+)/i],[c,a,[u,f]],[/\(bb10;\s(\w+)/i],[a,[c,"BlackBerry"],[u,f]],[/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i],[a,[c,"Asus"],[u,h]],[/(sony)\s(tablet\s[ps])\sbuild\//i,/(sony)?(?:sgp.+)\sbuild\//i],[[c,"Sony"],[a,"Xperia Tablet"],[u,h]],[/android.+\s([c-g]\d{4}|so[-l]\w+)(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[a,[c,"Sony"],[u,f]],[/\s(ouya)\s/i,/(nintendo)\s([wids3u]+)/i],[c,a,[u,"console"]],[/android.+;\s(shield)\sbuild/i],[a,[c,"Nvidia"],[u,"console"]],[/(playstation\s[34portablevi]+)/i],[a,[c,"Sony"],[u,"console"]],[/(sprint\s(\w+))/i],[[c,p.str,v.device.sprint.vendor],[a,p.str,v.device.sprint.model],[u,f]],[/(htc)[;_\s-]+([\w\s]+(?=\)|\sbuild)|\w+)/i,/(zte)-(\w*)/i,/(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i],[c,[a,/_/g," "],[u,f]],[/(nexus\s9)/i],[a,[c,"HTC"],[u,h]],[/d\/huawei([\w\s-]+)[;\)]/i,/(nexus\s6p)/i],[a,[c,"Huawei"],[u,f]],[/(microsoft);\s(lumia[\s\w]+)/i],[c,a,[u,f]],[/[\s\(;](xbox(?:\sone)?)[\s\);]/i],[a,[c,"Microsoft"],[u,"console"]],[/(kin\.[onetw]{3})/i],[[a,/\./g," "],[c,"Microsoft"],[u,f]],[/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i,/mot[\s-]?(\w*)/i,/(XT\d{3,4}) build\//i,/(nexus\s6)/i],[a,[c,"Motorola"],[u,f]],[/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i],[a,[c,"Motorola"],[u,h]],[/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i],[[c,d.trim],[a,d.trim],[u,"smarttv"]],[/hbbtv.+maple;(\d+)/i],[[a,/^/,"SmartTV"],[c,"Samsung"],[u,"smarttv"]],[/\(dtv[\);].+(aquos)/i],[a,[c,"Sharp"],[u,"smarttv"]],[/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,/((SM-T\w+))/i],[[c,"Samsung"],a,[u,h]],[/smart-tv.+(samsung)/i],[c,[u,"smarttv"],a],[/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,/(sam[sung]*)[\s-]*(\w+-?[\w-]*)/i,/sec-((sgh\w+))/i],[[c,"Samsung"],a,[u,f]],[/sie-(\w*)/i],[a,[c,"Siemens"],[u,f]],[/(maemo|nokia).*(n900|lumia\s\d+)/i,/(nokia)[\s_-]?([\w-]*)/i],[[c,"Nokia"],a,[u,f]],[/android[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i],[a,[c,"Acer"],[u,h]],[/android.+([vl]k\-?\d{3})\s+build/i],[a,[c,"LG"],[u,h]],[/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i],[[c,"LG"],a,[u,h]],[/(lg) netcast\.tv/i],[c,a,[u,"smarttv"]],[/(nexus\s[45])/i,/lg[e;\s\/-]+(\w*)/i,/android.+lg(\-?[\d\w]+)\s+build/i],[a,[c,"LG"],[u,f]],[/(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+))/i],[c,a,[u,h]],[/android.+(ideatab[a-z0-9\-\s]+)/i],[a,[c,"Lenovo"],[u,h]],[/(lenovo)[_\s-]?([\w-]+)/i],[c,a,[u,f]],[/linux;.+((jolla));/i],[c,a,[u,f]],[/((pebble))app\/[\d\.]+\s/i],[c,a,[u,"wearable"]],[/android.+;\s(oppo)\s?([\w\s]+)\sbuild/i],[c,a,[u,f]],[/crkey/i],[[a,"Chromecast"],[c,"Google"]],[/android.+;\s(glass)\s\d/i],[a,[c,"Google"],[u,"wearable"]],[/android.+;\s(pixel c)[\s)]/i],[a,[c,"Google"],[u,h]],[/android.+;\s(pixel( [23])?( xl)?)[\s)]/i],[a,[c,"Google"],[u,f]],[/android.+;\s(\w+)\s+build\/hm\1/i,/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i,/android.+(mi[\s\-_]*(?:a\d|one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i,/android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+))\s+build/i],[[a,/_/g," "],[c,"Xiaomi"],[u,f]],[/android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+))\s+build/i],[[a,/_/g," "],[c,"Xiaomi"],[u,h]],[/android.+;\s(m[1-5]\snote)\sbuild/i],[a,[c,"Meizu"],[u,f]],[/(mz)-([\w-]{2,})/i],[[c,"Meizu"],a,[u,f]],[/android.+a000(1)\s+build/i,/android.+oneplus\s(a\d{4})\s+build/i],[a,[c,"OnePlus"],[u,f]],[/android.+[;\/]\s*(RCT[\d\w]+)\s+build/i],[a,[c,"RCA"],[u,h]],[/android.+[;\/\s]+(Venue[\d\s]{2,7})\s+build/i],[a,[c,"Dell"],[u,h]],[/android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i],[a,[c,"Verizon"],[u,h]],[/android.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(V?.*)\s+build/i],[[c,"Barnes & Noble"],a,[u,h]],[/android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i],[a,[c,"NuVision"],[u,h]],[/android.+;\s(k88)\sbuild/i],[a,[c,"ZTE"],[u,h]],[/android.+[;\/]\s*(gen\d{3})\s+build.*49h/i],[a,[c,"Swiss"],[u,f]],[/android.+[;\/]\s*(zur\d{3})\s+build/i],[a,[c,"Swiss"],[u,h]],[/android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i],[a,[c,"Zeki"],[u,h]],[/(android).+[;\/]\s+([YR]\d{2})\s+build/i,/android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i],[[c,"Dragon Touch"],a,[u,h]],[/android.+[;\/]\s*(NS-?\w{0,9})\sbuild/i],[a,[c,"Insignia"],[u,h]],[/android.+[;\/]\s*((NX|Next)-?\w{0,9})\s+build/i],[a,[c,"NextBook"],[u,h]],[/android.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i],[[c,"Voice"],a,[u,f]],[/android.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i],[[c,"LvTel"],a,[u,f]],[/android.+;\s(PH-1)\s/i],[a,[c,"Essential"],[u,f]],[/android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i],[a,[c,"Envizen"],[u,h]],[/android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i],[c,a,[u,h]],[/android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i],[a,[c,"MachSpeed"],[u,h]],[/android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i],[c,a,[u,h]],[/android.+[;\/]\s*TU_(1491)\s+build/i],[a,[c,"Rotor"],[u,h]],[/android.+(KS(.+))\s+build/i],[a,[c,"Amazon"],[u,h]],[/android.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i],[c,a,[u,h]],[/\s(tablet|tab)[;\/]/i,/\s(mobile)(?:[;\/]|\ssafari)/i],[[u,d.lowerize],c,a],[/[\s\/\(](smart-?tv)[;\)]/i],[[u,"smarttv"]],[/(android[\w\.\s\-]{0,9});.+build/i],[a,[c,"Generic"]]],engine:[[/windows.+\sedge\/([\w\.]+)/i],[l,[s,"EdgeHTML"]],[/webkit\/537\.36.+chrome\/(?!27)/i],[[s,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i,/(icab)[\/\s]([23]\.[\d\.]+)/i],[s,l],[/rv\:([\w\.]{1,9}).+(gecko)/i],[l,s]],os:[[/microsoft\s(windows)\s(vista|xp)/i],[s,l],[/(windows)\snt\s6\.2;\s(arm)/i,/(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i,/(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i],[s,[l,p.str,v.os.windows.version]],[/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i],[[s,"Windows"],[l,p.str,v.os.windows.version]],[/\((bb)(10);/i],[[s,"BlackBerry"],l],[/(blackberry)\w*\/?([\w\.]*)/i,/(tizen)[\/\s]([\w\.]+)/i,/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i],[s,l],[/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i],[[s,"Symbian"],l],[/\((series40);/i],[s],[/mozilla.+\(mobile;.+gecko.+firefox/i],[[s,"Firefox OS"],l],[/(nintendo|playstation)\s([wids34portablevu]+)/i,/(mint)[\/\s\(]?(\w*)/i,/(mageia|vectorlinux)[;\s]/i,/(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]*)/i,/(hurd|linux)\s?([\w\.]*)/i,/(gnu)\s?([\w\.]*)/i],[s,l],[/(cros)\s[\w]+\s([\w\.]+\w)/i],[[s,"Chromium OS"],l],[/(sunos)\s?([\w\.\d]*)/i],[[s,"Solaris"],l],[/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]*)/i],[s,l],[/(haiku)\s(\w+)/i],[s,l],[/cfnetwork\/.+darwin/i,/ip[honead]{2,4}(?:.*os\s([\w]+)\slike\smac|;\sopera)/i],[[l,/_/g,"."],[s,"iOS"]],[/(mac\sos\sx)\s?([\w\s\.]*)/i,/(macintosh|mac(?=_powerpc)\s)/i],[[s,"Mac OS"],[l,/_/g,"."]],[/((?:open)?solaris)[\/\s-]?([\w\.]*)/i,/(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i,/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i,/(unix)\s?([\w\.]*)/i],[s,l]]},y=function(e,t){if("object"==typeof e&&(t=e,e=void 0),!(this instanceof y))return new y(e,t).getResult();var n=e||(i&&i.navigator&&i.navigator.userAgent?i.navigator.userAgent:""),r=t?d.extend(m,t):m;return this.getBrowser=function(){var e={name:void 0,version:void 0};return p.rgx.call(e,n,r.browser),e.major=d.major(e.version),e},this.getCPU=function(){var e={architecture:void 0};return p.rgx.call(e,n,r.cpu),e},this.getDevice=function(){var e={vendor:void 0,model:void 0,type:void 0};return p.rgx.call(e,n,r.device),e},this.getEngine=function(){var e={name:void 0,version:void 0};return p.rgx.call(e,n,r.engine),e},this.getOS=function(){var e={name:void 0,version:void 0};return p.rgx.call(e,n,r.os),e},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}},this.getUA=function(){return n},this.setUA=function(e){return n=e,this},this};y.VERSION="0.7.20",y.BROWSER={NAME:s,MAJOR:"major",VERSION:l},y.CPU={ARCHITECTURE:"architecture"},y.DEVICE={MODEL:a,VENDOR:c,TYPE:u,CONSOLE:"console",MOBILE:f,SMARTTV:"smarttv",TABLET:h,WEARABLE:"wearable",EMBEDDED:"embedded"},y.ENGINE={NAME:s,VERSION:l},y.OS={NAME:s,VERSION:l},void 0!==t?(void 0!==e&&e.exports&&(t=e.exports=y),t.UAParser=y):void 0===(r=function(){return y}.call(t,n,t,e))||(e.exports=r);var g=i&&(i.jQuery||i.Zepto);if(void 0!==g&&!g.ua){var b=new y;g.ua=b.getResult(),g.ua.get=function(){return b.getUA()},g.ua.set=function(e){b.setUA(e);var t=b.getResult();for(var n in t)g.ua[n]=t[n]}}}("object"==typeof window?window:this)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=n(67),i=n(97),o=l(n(167)),a=l(n(403)),s=l(n(163)),u=l(n(166)),c=l(n(165));function l(e){return e&&e.__esModule?e:{default:e}}t.default=function(e){var t=e.iframe,n=e.methods,l=void 0===n?{}:n,f=e.childOrigin,h=e.timeout,d=e.debug,p=(0,s.default)(d),v=window,m=(0,o.default)(),y=m.destroy,g=m.onDestroy;if(!f){if(!t.src&&!t.srcdoc){var b=new Error("Iframe must have src or srcdoc property defined.");throw b.code=i.ERR_NO_IFRAME_SRC,b}f=(0,a.default)(t.src)}var w="null"===f?"*":f;return{promise:new Promise(function(e,n){var o;void 0!==h&&(o=setTimeout(function(){var e=new Error("Connection to child timed out after ".concat(h,"ms"));e.code=i.ERR_CONNECTION_TIMEOUT,n(e),y()},h));var a,s,d={},m=function(n){var i=t.contentWindow;if(n.source===i&&n.data.penpal===r.HANDSHAKE)if(n.origin===f){p("Parent: Received handshake, sending reply"),n.source.postMessage({penpal:r.HANDSHAKE_REPLY,methodNames:Object.keys(l)},w);var h={localName:"Parent",local:v,remote:i,originForSending:w,originForReceiving:f};s&&s(),s=(0,u.default)(h,l,p),g(s),a&&a.forEach(function(e){delete d[e]}),a=n.data.methodNames;var m=(0,c.default)(d,h,a,y,p);g(m),clearTimeout(o),e(d)}else p("Parent received handshake from origin ".concat(n.origin," which did not match expected origin ").concat(f))};v.addEventListener(r.MESSAGE,m),p("Parent: Awaiting handshake");var b=setInterval(function(){document.contains(t)||(clearInterval(b),y())},6e4);g(function(){v.removeEventListener(r.MESSAGE,m),clearInterval(b);var e=new Error("Connection destroyed");e.code=i.ERR_CONNECTION_DESTROYED,n(e)})}),destroy:y}},e.exports=t.default},function(e,t,n){"use strict";(function(t){function n(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function r(e,t){for(var n,r="",i=0,o=-1,a=0,s=0;s<=e.length;++s){if(s<e.length)n=e.charCodeAt(s);else{if(47===n)break;n=47}if(47===n){if(o===s-1||1===a);else if(o!==s-1&&2===a){if(r.length<2||2!==i||46!==r.charCodeAt(r.length-1)||46!==r.charCodeAt(r.length-2))if(r.length>2){var u=r.lastIndexOf("/");if(u!==r.length-1){-1===u?(r="",i=0):i=(r=r.slice(0,u)).length-1-r.lastIndexOf("/"),o=s,a=0;continue}}else if(2===r.length||1===r.length){r="",i=0,o=s,a=0;continue}t&&(r.length>0?r+="/..":r="..",i=2)}else r.length>0?r+="/"+e.slice(o+1,s):r=e.slice(o+1,s),i=s-o-1;o=s,a=0}else 46===n&&-1!==a?++a:a=-1}return r}var i={resolve:function(){for(var e,i="",o=!1,a=arguments.length-1;a>=-1&&!o;a--){var s;a>=0?s=arguments[a]:(void 0===e&&(e=t.cwd()),s=e),n(s),0!==s.length&&(i=s+"/"+i,o=47===s.charCodeAt(0))}return i=r(i,!o),o?i.length>0?"/"+i:"/":i.length>0?i:"."},normalize:function(e){if(n(e),0===e.length)return".";var t=47===e.charCodeAt(0),i=47===e.charCodeAt(e.length-1);return 0!==(e=r(e,!t)).length||t||(e="."),e.length>0&&i&&(e+="/"),t?"/"+e:e},isAbsolute:function(e){return n(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var e,t=0;t<arguments.length;++t){var r=arguments[t];n(r),r.length>0&&(void 0===e?e=r:e+="/"+r)}return void 0===e?".":i.normalize(e)},relative:function(e,t){if(n(e),n(t),e===t)return"";if((e=i.resolve(e))===(t=i.resolve(t)))return"";for(var r=1;r<e.length&&47===e.charCodeAt(r);++r);for(var o=e.length,a=o-r,s=1;s<t.length&&47===t.charCodeAt(s);++s);for(var u=t.length-s,c=a<u?a:u,l=-1,f=0;f<=c;++f){if(f===c){if(u>c){if(47===t.charCodeAt(s+f))return t.slice(s+f+1);if(0===f)return t.slice(s+f)}else a>c&&(47===e.charCodeAt(r+f)?l=f:0===f&&(l=0));break}var h=e.charCodeAt(r+f);if(h!==t.charCodeAt(s+f))break;47===h&&(l=f)}var d="";for(f=r+l+1;f<=o;++f)f!==o&&47!==e.charCodeAt(f)||(0===d.length?d+="..":d+="/..");return d.length>0?d+t.slice(s+l):(s+=l,47===t.charCodeAt(s)&&++s,t.slice(s))},_makeLong:function(e){return e},dirname:function(e){if(n(e),0===e.length)return".";for(var t=e.charCodeAt(0),r=47===t,i=-1,o=!0,a=e.length-1;a>=1;--a)if(47===(t=e.charCodeAt(a))){if(!o){i=a;break}}else o=!1;return-1===i?r?"/":".":r&&1===i?"//":e.slice(0,i)},basename:function(e,t){if(void 0!==t&&"string"!=typeof t)throw new TypeError('"ext" argument must be a string');n(e);var r,i=0,o=-1,a=!0;if(void 0!==t&&t.length>0&&t.length<=e.length){if(t.length===e.length&&t===e)return"";var s=t.length-1,u=-1;for(r=e.length-1;r>=0;--r){var c=e.charCodeAt(r);if(47===c){if(!a){i=r+1;break}}else-1===u&&(a=!1,u=r+1),s>=0&&(c===t.charCodeAt(s)?-1==--s&&(o=r):(s=-1,o=u))}return i===o?o=u:-1===o&&(o=e.length),e.slice(i,o)}for(r=e.length-1;r>=0;--r)if(47===e.charCodeAt(r)){if(!a){i=r+1;break}}else-1===o&&(a=!1,o=r+1);return-1===o?"":e.slice(i,o)},extname:function(e){n(e);for(var t=-1,r=0,i=-1,o=!0,a=0,s=e.length-1;s>=0;--s){var u=e.charCodeAt(s);if(47!==u)-1===i&&(o=!1,i=s+1),46===u?-1===t?t=s:1!==a&&(a=1):-1!==t&&(a=-1);else if(!o){r=s+1;break}}return-1===t||-1===i||0===a||1===a&&t===i-1&&t===r+1?"":e.slice(t,i)},format:function(e){if(null===e||"object"!=typeof e)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var n=t.dir||t.root,r=t.base||(t.name||"")+(t.ext||"");return n?n===t.root?n+r:n+e+r:r}("/",e)},parse:function(e){n(e);var t={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return t;var r,i=e.charCodeAt(0),o=47===i;o?(t.root="/",r=1):r=0;for(var a=-1,s=0,u=-1,c=!0,l=e.length-1,f=0;l>=r;--l)if(47!==(i=e.charCodeAt(l)))-1===u&&(c=!1,u=l+1),46===i?-1===a?a=l:1!==f&&(f=1):-1!==a&&(f=-1);else if(!c){s=l+1;break}return-1===a||-1===u||0===f||1===f&&a===u-1&&a===s+1?-1!==u&&(t.base=t.name=0===s&&o?e.slice(1,u):e.slice(s,u)):(0===s&&o?(t.name=e.slice(1,a),t.base=e.slice(1,u)):(t.name=e.slice(s,a),t.base=e.slice(s,u)),t.ext=e.slice(a,u)),s>0?t.dir=e.slice(0,s-1):o&&(t.dir="/"),t},sep:"/",delimiter:":",win32:null,posix:null};i.posix=i,e.exports=i}).call(this,n(127))},function(e,t,n){var r;r=function(e){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,n),i.loaded=!0,i.exports}return n.m=e,n.c=t,n.p="",n(0)}([function(e,t,n){"use strict";var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var a=n(1),s=n(2),u=n(13),c=n(22),l=new a.DS,f=a.DSUtils,h=l.defaults.defaultFilter,d=function e(){o(this,e)};d.prototype.basePath="";var p=[],v=!1;function m(e){p.push(e)}function y(){p.length&&!v&&(v=!0,p[0]())}function g(e){p.length?m(e):(m(e),y())}function b(e){return new f.Promise(e).then(function(e){return v=!1,p.shift(),setTimeout(y,0),e},function(e){return v=!1,p.shift(),setTimeout(y,0),f.Promise.reject(e)})}var w=function(){function e(t){o(this,e),t=t||{},this.defaults=new d,this.storage=t.storage||localStorage,f.deepMixIn(this.defaults,t)}return r(e,[{key:"getPath",value:function(e,t){return t=t||{},f.makePath(t.basePath||this.defaults.basePath||e.basePath,e.name)}},{key:"getIdPath",value:function(e,t,n){return t=t||{},f.makePath(t.basePath||this.defaults.basePath||e.basePath,e.endpoint,n)}},{key:"getIds",value:function(e,t){var n=this.getPath(e,t),r=this.storage.getItem(n);return r?f.fromJson(r):{}}},{key:"saveKeys",value:function(e,t,n){var r=this.getPath(t,n);f.isEmpty(e)?this.storage.removeItem(r):this.storage.setItem(r,f.toJson(e))}},{key:"ensureId",value:function(e,t,n){var r=this.getIds(t,n);if(f.isArray(e)){if(!e.length)return;f.forEach(e,function(e){r[e]=1})}else r[e]=1;this.saveKeys(r,t,n)}},{key:"removeId",value:function(e,t,n){var r=this.getIds(t,n);if(f.isArray(e)){if(!e.length)return;f.forEach(e,function(e){delete r[e]})}else delete r[e];this.saveKeys(r,t,n)}},{key:"GET",value:function(e){var t=this;return new f.Promise(function(n){var r=t.storage.getItem(e);n(r?f.fromJson(r):void 0)})}},{key:"PUT",value:function(e,t){var n=this,r=this;return r.GET(e).then(function(i){return i&&f.deepMixIn(i,f.removeCircular(t)),n.storage.setItem(e,f.toJson(i||t)),r.GET(e)})}},{key:"DEL",value:function(e){var t=this;return new f.Promise(function(n){t.storage.removeItem(e),n()})}},{key:"find",value:function(e,t,n){var r=this,o=void 0;return(n=n||{}).with=n.with||[],new f.Promise(function(a,s){r.GET(r.getIdPath(e,n||{},t)).then(function(e){return e||s(new Error("Not Found!"))}).then(function(t){o=t;var a=[];return f.forEach(e.relationList,function(t){var s=t.relation,c=e.getResource(s),l=null;f.contains(n.with,s)?l=s:f.contains(n.with,t.localField)&&(l=t.localField),l&&function(){var h=f.deepMixIn({},n.orig?n.orig():n);h.with=n.with.slice(),h=f._(c,h),f.remove(h.with,l),f.forEach(h.with,function(e,t){e&&0===e.indexOf(l)&&e.length>=l.length&&"."===e[l.length]?h.with[t]=e.substr(l.length+1):h.with[t]=""});var d=void 0;if("hasOne"!==t.type&&"hasMany"!==t.type||!t.foreignKey)if("hasMany"===t.type&&t.localKeys){var p=[],v=o[t.localKeys]||[];v=Array.isArray(v)?v:f.keys(v),p=p.concat(v||[]),d=r.findAll(e.getResource(s),{where:i({},c.idAttribute,{in:f.filter(u(p),function(e){return e})})},h).then(function(e){return f.set(o,t.localField,e),e})}else("belongsTo"===t.type||"hasOne"===t.type&&t.localKey)&&(d=r.find(e.getResource(s),f.get(o,t.localKey),h).then(function(e){return f.set(o,t.localField,e),e}));else d=r.findAll(e.getResource(s),{where:i({},t.foreignKey,{"==":o[e.idAttribute]})},h).then(function(e){return"hasOne"===t.type&&e.length?f.set(o,t.localField,e[0]):f.set(o,t.localField,e),e});d&&a.push(d)}()}),f.Promise.all(a)}).then(function(){return a(o)}).catch(s)})}},{key:"findAll",value:function(e,t,n){var r=this,o=null;return(n=n||{}).with=n.with||[],new f.Promise(function(i,o){try{!function(){"allowSimpleWhere"in(n=n||{})||(n.allowSimpleWhere=!0);var o=[],a=f.keys(r.getIds(e,n));f.forEach(a,function(t){var i=r.storage.getItem(r.getIdPath(e,n,t));i&&o.push(f.fromJson(i))}),i(h.call(l,o,e.name,t,n))}()}catch(e){o(e)}}).then(function(t){o=t;var a=[];return f.forEach(e.relationList,function(t){var s=t.relation,l=e.getResource(s),h=null;f.contains(n.with,s)?h=s:f.contains(n.with,t.localField)&&(h=t.localField),h&&function(){var d=f.deepMixIn({},n.orig?n.orig():n);d.with=n.with.slice(),d=f._(l,d),f.remove(d.with,h),f.forEach(d.with,function(e,t){e&&0===e.indexOf(h)&&e.length>=h.length&&"."===e[h.length]?d.with[t]=e.substr(h.length+1):d.with[t]=""});var p,v=void 0;"hasOne"!==t.type&&"hasMany"!==t.type||!t.foreignKey?"hasMany"===t.type&&t.localKeys?(p=[],f.forEach(o,function(e){var n=e[t.localKeys]||[];n=Array.isArray(n)?n:f.keys(n),p=p.concat(n||[])}),v=r.findAll(e.getResource(s),{where:i({},l.idAttribute,{in:f.filter(u(p),function(e){return e})})},d).then(function(e){return f.forEach(o,function(n){var r=[],i=n[t.localKeys]||[];i=Array.isArray(i)?i:f.keys(i),f.forEach(e,function(e){i&&f.contains(i,e[l.idAttribute])&&r.push(e)}),f.set(n,t.localField,r)}),e})):("belongsTo"===t.type||"hasOne"===t.type&&t.localKey)&&(v=r.findAll(e.getResource(s),{where:i({},l.idAttribute,{in:f.filter(c(o,function(e){return f.get(e,t.localKey)}),function(e){return e})})},d).then(function(e){return f.forEach(o,function(n){f.forEach(e,function(e){e[l.idAttribute]===n[t.localKey]&&f.set(n,t.localField,e)})}),e})):v=r.findAll(e.getResource(s),{where:i({},t.foreignKey,{in:f.filter(c(o,function(t){return f.get(t,e.idAttribute)}),function(e){return e})})},d).then(function(n){return f.forEach(o,function(r){var i=[];f.forEach(n,function(n){f.get(n,t.foreignKey)===r[e.idAttribute]&&i.push(n)}),"hasOne"===t.type&&i.length?f.set(r,t.localField,i[0]):f.set(r,t.localField,i)}),n}),v&&a.push(v)}()}),f.Promise.all(a)}).then(function(){return o})}},{key:"create",value:function(e,t,n){var r=this;return b(function(i,o){g(function(){t[e.idAttribute]=t[e.idAttribute]||s(),n=n||{},r.PUT(f.makePath(r.getIdPath(e,n,t[e.idAttribute])),f.omit(t,e.relationFields||[])).then(function(t){r.ensureId(t[e.idAttribute],e,n),i(t)}).catch(o)})})}},{key:"createMany",value:function(e,t,n){var r=this;return b(function(i,o){g(function(){var a=[],u=[];return f.forEach(t,function(t){var i=t[e.idAttribute]=t[e.idAttribute]||s();u.push(i),n=n||{},a.push(r.PUT(f.makePath(r.getIdPath(e,n,i)),f.omit(t,e.relationFields||[])))}),r.ensureId(u,e,n),f.Promise.all(a).then(i).catch(o)})})}},{key:"update",value:function(e,t,n,r){var i=this;return b(function(o,a){g(function(){r=r||{},i.PUT(i.getIdPath(e,r,t),f.omit(n,e.relationFields||[])).then(function(t){i.ensureId(t[e.idAttribute],e,r),o(t)}).catch(a)})})}},{key:"updateAll",value:function(e,t,n,r){var i=this;return this.findAll(e,n,r).then(function(n){var o=[];return f.forEach(n,function(n){return o.push(i.update(e,n[e.idAttribute],f.omit(t,e.relationFields||[]),r))}),f.Promise.all(o)})}},{key:"destroy",value:function(e,t,n){var r=this;return b(function(i,o){g(function(){n=n||{},r.DEL(r.getIdPath(e,n,t)).then(function(){return r.removeId(t,e,n)}).then(function(){return i(null)},o)})})}},{key:"destroyAll",value:function(e,t,n){var r=this;return this.findAll(e,t,n).then(function(t){var i=[];return f.forEach(t,function(t){var o=t[e.idAttribute];i.push(o),r.storage.removeItem(r.getIdPath(e,n,o))}),r.removeId(i,e,n),i})}}]),e}();w.version={full:"2.3.2",major:parseInt("2",10),minor:parseInt("3",10),patch:parseInt("2",10),alpha:"false",beta:"false"},e.exports=w},function(t,n){t.exports=e},function(e,t,n){var r=n(3),i=n(4);e.exports=function(){return r(8)+"-"+r(4)+"-4"+r(3)+"-"+i(8,9,"a","b")+r(3)+"-"+r(12)}},function(e,t,n){var r=n(4),i="0123456789abcdef".split("");e.exports=function(e){e=e&&e>0?e:6;for(var t="";e--;)t+=r(i);return t}},function(e,t,n){var r=n(5),i=n(10);e.exports=function(e){var t=1===arguments.length&&i(e)?e:arguments;return t[r(0,t.length-1)]}},function(e,t,n){var r=n(6),i=n(7),o=n(8);e.exports=function(e,t){return e=null==e?r:~~e,t=null==t?i:~~t,Math.round(o(e-.5,t+.499999999999))}},function(e,t){e.exports=-2147483648},function(e,t){e.exports=2147483647},function(e,t,n){var r=n(9),i=n(6),o=n(7);e.exports=function(e,t){return(e=null==e?i:e)+((t=null==t?o:t)-e)*r()}},function(e,t){function n(){return n.get()}n.get=Math.random,e.exports=n},function(e,t,n){var r=n(11),i=Array.isArray||function(e){return r(e,"Array")};e.exports=i},function(e,t,n){var r=n(12);e.exports=function(e,t){return r(e)===t}},function(e,t){var n,r=/^\[object (.*)\]$/,i=Object.prototype.toString;e.exports=function(e){return null===e?"Null":e===n?"Undefined":r.exec(i.call(e))[1]}},function(e,t,n){var r=n(14);function i(e,t){return e===t}e.exports=function(e,t){return t=t||i,r(e,function(e,n,r){for(var i=r.length;++n<i;)if(t(e,r[n]))return!1;return!0})}},function(e,t,n){var r=n(15);e.exports=function(e,t,n){t=r(t,n);var i=[];if(null==e)return i;for(var o,a=-1,s=e.length;++a<s;)t(o=e[a],a,e)&&i.push(o);return i}},function(e,t,n){var r=n(16),i=n(17),o=n(18);e.exports=function(e,t){if(null==e)return r;switch(typeof e){case"function":return void 0!==t?function(n,r,i){return e.call(t,n,r,i)}:e;case"object":return function(t){return o(t,e)};case"string":case"number":return i(e)}}},function(e,t){e.exports=function(e){return e}},function(e,t){e.exports=function(e){return function(t){return t[e]}}},function(e,t,n){var r=n(19),i=n(10);function o(e,t){for(var n=-1,r=e.length;++n<r;)if(a(e[n],t))return!0;return!1}function a(e,t){return e&&"object"==typeof e?i(e)&&i(t)?function(e,t){for(var n=-1,r=t.length;++n<r;)if(!o(e,t[n]))return!1;return!0}(e,t):function(e,t){var n=!0;return r(t,function(t,r){if(!a(e[r],t))return n=!1}),n}(e,t):e===t}e.exports=a},function(e,t,n){var r=n(20),i=n(21);e.exports=function(e,t,n){i(e,function(i,o){if(r(e,o))return t.call(n,e[o],o,e)})}},function(e,t){e.exports=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},function(e,t,n){var r,i,o=n(20);function a(e,t,n,r){return e.call(r,t[n],n,t)}e.exports=function(e,t,n){var s,u=0;for(s in null==r&&function(){for(var e in i=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],r=!0,{toString:null})r=!1}(),e)if(!1===a(t,e,s,n))break;if(r)for(var c=e.constructor,l=!!c&&e===c.prototype;(s=i[u++])&&("constructor"===s&&(l||!o(e,s))||e[s]===Object.prototype[s]||!1!==a(t,e,s,n)););}},function(e,t,n){var r=n(15);e.exports=function(e,t,n){t=r(t,n);var i=[];if(null==e)return i;for(var o=-1,a=e.length;++o<a;)i[o]=t(e[o],o,e);return i}}])},e.exports=r(n(50))},function(e,t,n){window,e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=33)}([function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t){e.exports=function(e){return e&&e.__esModule?e:{default:e}}},function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}e.exports=function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),e}},function(e,t){function n(t){return e.exports=n=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},n(t)}e.exports=n},function(e,t,n){var r=n(8);e.exports=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&r(e,t)}},function(e,t,n){var r=n(31),i=n(14);e.exports=function(e,t){return!t||"object"!==r(t)&&"function"!=typeof t?i(e):t}},function(e,t,n){"use strict";var r=n(1),i=r(n(0)),o=r(n(2)),a=n(11),s=n(10),u=function(){function e(){(0,i.default)(this,e),this._list=new a}return(0,o.default)(e,[{key:"shift",value:function(){if(0!==this.length){var e=this._list.head;return this._list.remove(e),e.data}}},{key:"unshift",value:function(e){var t=a.createNode(e);this._list.insertBeginning(t)}},{key:"push",value:function(e){var t=a.createNode(e);this._list.insertEnd(t)}},{key:"pop",value:function(){if(0!==this.length){var e=this._list.tail;return this._list.remove(e),e.data}}},{key:Symbol.iterator,value:function(){return new s(this._list)}},{key:"iterator",value:function(){return new s(this._list)}},{key:"reverseIterator",value:function(){return new s(this._list,!0)}},{key:"head",get:function(){if(0!==this.length)return this._list.head.data}},{key:"tail",get:function(){if(0!==this.length)return this._list.tail.data}},{key:"length",get:function(){return this._list.length}}]),e}();e.exports=u},function(e,t,n){"use strict";var r=n(1),i=r(n(0)),o=r(n(2)),a=function(){function e(t){var n=this;(0,i.default)(this,e),this._state=e.PENDING,this._resolve=void 0,this._reject=void 0,this._promise=new t(function(e,t){n._resolve=e,n._reject=t})}return(0,o.default)(e,[{key:"reject",value:function(t){this._state===e.PENDING&&(this._state=e.REJECTED,this._reject(t))}},{key:"resolve",value:function(t){this._state===e.PENDING&&(this._state=e.FULFILLED,this._resolve(t))}},{key:"state",get:function(){return this._state}},{key:"promise",get:function(){return this._promise}}]),e}();a.PENDING="PENDING",a.FULFILLED="FULFILLED",a.REJECTED="REJECTED",e.exports=a},function(e,t){function n(t,r){return e.exports=n=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},n(t,r)}e.exports=n},function(e,t,n){"use strict";var r=n(1),i=r(n(0)),o=r(n(2)),a=n(16),s=function(){function e(t){(0,i.default)(this,e),this._size=Math.max(0|+t,1),this._slots=[];for(var n=0;n<this._size;n++)this._slots.push(new a)}return(0,o.default)(e,[{key:"enqueue",value:function(e,t){(t=t&&0|+t||0)&&(t<0||t>=this._size)&&(t=this._size-1),this._slots[t].push(e)}},{key:"dequeue",value:function(){for(var e=0,t=this._slots.length;e<t;e+=1)if(this._slots[e].length)return this._slots[e].shift()}},{key:"length",get:function(){for(var e=0,t=0,n=this._slots.length;t<n;t++)e+=this._slots[t].length;return e}},{key:"head",get:function(){for(var e=0,t=this._slots.length;e<t;e+=1)if(this._slots[e].length>0)return this._slots[e].head}},{key:"tail",get:function(){for(var e=this._slots.length-1;e>=0;e--)if(this._slots[e].length>0)return this._slots[e].tail}}]),e}();e.exports=s},function(e,t,n){"use strict";var r=n(1),i=r(n(0)),o=r(n(2)),a=r(n(5)),s=r(n(3)),u=r(n(13)),c=r(n(4)),l=function(e){function t(){return(0,i.default)(this,t),(0,a.default)(this,(0,s.default)(t).apply(this,arguments))}return(0,c.default)(t,e),(0,o.default)(t,[{key:"next",value:function(){var e=(0,u.default)((0,s.default)(t.prototype),"next",this).call(this);return e.value&&(e.value=e.value.data),e}}]),t}(n(17));e.exports=l},function(e,t,n){"use strict";var r=n(1),i=r(n(0)),o=r(n(2)),a=function(){function e(){(0,i.default)(this,e),this.head=null,this.tail=null,this.length=0}return(0,o.default)(e,[{key:"insertBeginning",value:function(e){null===this.head?(this.head=e,this.tail=e,e.prev=null,e.next=null,this.length++):this.insertBefore(this.head,e)}},{key:"insertEnd",value:function(e){null===this.tail?this.insertBeginning(e):this.insertAfter(this.tail,e)}},{key:"insertAfter",value:function(e,t){t.prev=e,t.next=e.next,null===e.next?this.tail=t:e.next.prev=t,e.next=t,this.length++}},{key:"insertBefore",value:function(e,t){t.prev=e.prev,t.next=e,null===e.prev?this.head=t:e.prev.next=t,e.prev=t,this.length++}},{key:"remove",value:function(e){null===e.prev?this.head=e.next:e.prev.next=e.next,null===e.next?this.tail=e.prev:e.next.prev=e.prev,e.prev=null,e.next=null,this.length--}}],[{key:"createNode",value:function(e){return{prev:null,next:null,data:e}}}]),e}();e.exports=a},function(e,t,n){"use strict";var r=n(1),i=r(n(0)),o=r(n(2)),a=function(){function e(){(0,i.default)(this,e)}return(0,o.default)(e,[{key:"evict",value:function(e,t,n){var r=Date.now()-t.lastIdleTime;return e.softIdleTimeoutMillis>0&&e.softIdleTimeoutMillis<r&&e.min<n||e.idleTimeoutMillis<r}}]),e}();e.exports=a},function(e,t,n){n(3);var r=n(25);function i(t,n,o){return"undefined"!=typeof Reflect&&Reflect.get?e.exports=i=Reflect.get:e.exports=i=function(e,t,n){var i=r(e,t);if(i){var o=Object.getOwnPropertyDescriptor(i,t);return o.get?o.get.call(n):o.value}},i(t,n,o||t)}e.exports=i},function(e,t){e.exports=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}},function(e,t,n){"use strict";function r(){}t.reflector=function(e){return e.then(r,r)}},function(e,t,n){"use strict";var r=n(1),i=r(n(0)),o=r(n(2)),a=r(n(5)),s=r(n(3)),u=r(n(4)),c=n(11),l=function(e){function t(){return(0,i.default)(this,t),(0,a.default)(this,(0,s.default)(t).apply(this,arguments))}return(0,u.default)(t,e),(0,o.default)(t,[{key:"push",value:function(e){var t=c.createNode(e);e.promise.catch(this._createTimeoutRejectionHandler(t)),this._list.insertEnd(t)}},{key:"_createTimeoutRejectionHandler",value:function(e){var t=this;return function(n){"TimeoutError"===n.name&&t._list.remove(e)}}}]),t}(n(6));e.exports=l},function(e,t,n){"use strict";var r=n(1),i=r(n(0)),o=r(n(2)),a=function(){function e(t,n){(0,i.default)(this,e),this._list=t,this._direction=!0===n?"prev":"next",this._startPosition=!0===n?"tail":"head",this._started=!1,this._cursor=null,this._done=!1}return(0,o.default)(e,[{key:"_start",value:function(){this._cursor=this._list[this._startPosition],this._started=!0}},{key:"_advanceCursor",value:function(){if(!1===this._started)return this._started=!0,void(this._cursor=this._list[this._startPosition]);this._cursor=this._cursor[this._direction]}},{key:"reset",value:function(){this._done=!1,this._started=!1,this._cursor=null}},{key:"remove",value:function(){if(!1===this._started||!0===this._done||this._isCursorDetached())return!1;this._list.remove(this._cursor)}},{key:"next",value:function(){return!0===this._done?{done:!0}:(this._advanceCursor(),null===this._cursor||this._isCursorDetached()?(this._done=!0,{done:!0}):{value:this._cursor,done:!1})}},{key:"_isCursorDetached",value:function(){return null===this._cursor.prev&&null===this._cursor.next&&this._list.tail!==this._cursor&&this._list.head!==this._cursor}}]),e}();e.exports=a},function(e,t,n){"use strict";e.exports={ALLOCATED:"ALLOCATED",IDLE:"IDLE",INVALID:"INVALID",RETURNING:"RETURNING",VALIDATION:"VALIDATION"}},function(e,t,n){"use strict";var r=n(1),i=r(n(0)),o=r(n(2)),a=n(18),s=function(){function e(t){(0,i.default)(this,e),this.creationTime=Date.now(),this.lastReturnTime=null,this.lastBorrowTime=null,this.lastIdleTime=null,this.obj=t,this.state=a.IDLE}return(0,o.default)(e,[{key:"allocate",value:function(){this.lastBorrowTime=Date.now(),this.state=a.ALLOCATED}},{key:"deallocate",value:function(){this.lastReturnTime=Date.now(),this.state=a.IDLE}},{key:"invalidate",value:function(){this.state=a.INVALID}},{key:"test",value:function(){this.state=a.VALIDATION}},{key:"idle",value:function(){this.lastIdleTime=Date.now(),this.state=a.IDLE}},{key:"returning",value:function(){this.state=a.RETURNING}}]),e}();e.exports=s},function(e,t,n){"use strict";var r=n(1),i=r(n(0)),o=r(n(2)),a=r(n(5)),s=r(n(3)),u=r(n(4)),c=function(e){function t(e,n){var r;return(0,i.default)(this,t),(r=(0,a.default)(this,(0,s.default)(t).call(this,n)))._creationTimestamp=Date.now(),r.pooledResource=e,r}return(0,u.default)(t,e),(0,o.default)(t,[{key:"reject",value:function(){}}]),t}(n(7));e.exports=c},function(e,t,n){var r=n(8);function i(t,n,o){return function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(e){return!1}}()?e.exports=i=Reflect.construct:e.exports=i=function(e,t,n){var i=[null];i.push.apply(i,t);var o=new(Function.bind.apply(e,i));return n&&r(o,n.prototype),o},i.apply(null,arguments)}e.exports=i},function(e,t){e.exports=function(e){return-1!==Function.toString.call(e).indexOf("[native code]")}},function(e,t,n){var r=n(3),i=n(8),o=n(22),a=n(21);function s(t){var n="function"==typeof Map?new Map:void 0;return e.exports=s=function(e){if(null===e||!o(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==n){if(n.has(e))return n.get(e);n.set(e,t)}function t(){return a(e,arguments,r(this).constructor)}return t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),i(t,e)},s(t)}e.exports=s},function(e,t,n){"use strict";var r=n(1),i=r(n(0)),o=r(n(5)),a=r(n(3)),s=r(n(14)),u=r(n(4)),c=function(e){function t(e){return(0,i.default)(this,t),(0,o.default)(this,(0,a.default)(t).call(this,e))}return(0,u.default)(t,e),t}(function(e){function t(e){var n;return(0,i.default)(this,t),(n=(0,o.default)(this,(0,a.default)(t).call(this,e))).name=n.constructor.name,n.message=e,"function"==typeof Error.captureStackTrace?Error.captureStackTrace((0,s.default)(n),n.constructor):n.stack=new Error(e).stack,n}return(0,u.default)(t,e),t}((0,r(n(23)).default)(Error)));e.exports={TimeoutError:c}},function(e,t,n){var r=n(3);e.exports=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=r(e)););return e}},function(e,t,n){"use strict";var r=n(1),i=r(n(0)),o=r(n(2)),a=r(n(5)),s=r(n(3)),u=r(n(13)),c=r(n(4)),l=n(7),f=n(24),h=function(e){function t(e,n){var r;return(0,i.default)(this,t),(r=(0,a.default)(this,(0,s.default)(t).call(this,n)))._creationTimestamp=Date.now(),r._timeout=null,void 0!==e&&r.setTimeout(e),r}return(0,c.default)(t,e),(0,o.default)(t,[{key:"setTimeout",value:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(e){if(this._state===t.PENDING){var n=parseInt(e,10);if(isNaN(n)||n<=0)throw new Error("delay must be a positive int");var r,i,o=Date.now()-this._creationTimestamp;this._timeout&&this.removeTimeout(),this._timeout=setTimeout((r=this._fireTimeout,i=this,function(){return r.apply(i,arguments)}),Math.max(n-o,0))}})},{key:"removeTimeout",value:function(){this._timeout&&clearTimeout(this._timeout),this._timeout=null}},{key:"_fireTimeout",value:function(){this.reject(new f.TimeoutError("ResourceRequest timed out"))}},{key:"reject",value:function(e){this.removeTimeout(),(0,u.default)((0,s.default)(t.prototype),"reject",this).call(this,e)}},{key:"resolve",value:function(e){this.removeTimeout(),(0,u.default)((0,s.default)(t.prototype),"resolve",this).call(this,e)}}]),t}(l);e.exports=h},function(e,t,n){"use strict";var r=n(1)(n(0));e.exports=function e(){(0,r.default)(this,e),this.fifo=!0,this.priorityRange=1,this.testOnBorrow=!1,this.testOnReturn=!1,this.autostart=!0,this.evictionRunIntervalMillis=0,this.numTestsPerEvictionRun=3,this.softIdleTimeoutMillis=-1,this.idleTimeoutMillis=3e4,this.acquireTimeoutMillis=null,this.maxWaitingClients=null,this.min=null,this.max=null,this.Promise=Promise}},function(e,t,n){"use strict";var r=n(1)(n(0)),i=n(27);e.exports=function e(t){(0,r.default)(this,e);var n=new i;t=t||{},this.fifo="boolean"==typeof t.fifo?t.fifo:n.fifo,this.priorityRange=t.priorityRange||n.priorityRange,this.testOnBorrow="boolean"==typeof t.testOnBorrow?t.testOnBorrow:n.testOnBorrow,this.testOnReturn="boolean"==typeof t.testOnReturn?t.testOnReturn:n.testOnReturn,this.autostart="boolean"==typeof t.autostart?t.autostart:n.autostart,t.acquireTimeoutMillis&&(this.acquireTimeoutMillis=parseInt(t.acquireTimeoutMillis,10)),void 0!==t.maxWaitingClients&&(this.maxWaitingClients=parseInt(t.maxWaitingClients,10)),this.max=parseInt(t.max,10),this.min=parseInt(t.min,10),this.max=Math.max(isNaN(this.max)?1:this.max,1),this.min=Math.min(isNaN(this.min)?0:this.min,this.max),this.evictionRunIntervalMillis=t.evictionRunIntervalMillis||n.evictionRunIntervalMillis,this.numTestsPerEvictionRun=t.numTestsPerEvictionRun||n.numTestsPerEvictionRun,this.softIdleTimeoutMillis=t.softIdleTimeoutMillis||n.softIdleTimeoutMillis,this.idleTimeoutMillis=t.idleTimeoutMillis||n.idleTimeoutMillis,this.Promise=null!=t.Promise?t.Promise:n.Promise}},function(e,t,n){"use strict";e.exports=function(e){if("function"!=typeof e.create)throw new TypeError("factory.create must be a function");if("function"!=typeof e.destroy)throw new TypeError("factory.destroy must be a function");if(void 0!==e.validate&&"function"!=typeof e.validate)throw new TypeError("factory.validate must be a function")}},function(e,t){function n(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function i(e){return"object"==typeof e&&null!==e}function o(e){return void 0===e}e.exports=n,n.EventEmitter=n,n.prototype._events=void 0,n.prototype._maxListeners=void 0,n.defaultMaxListeners=10,n.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},n.prototype.emit=function(e){var t,n,a,s,u,c;if(this._events||(this._events={}),"error"===e&&(!this._events.error||i(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var l=new Error('Uncaught, unspecified "error" event. ('+t+")");throw l.context=t,l}if(o(n=this._events[e]))return!1;if(r(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:s=Array.prototype.slice.call(arguments,1),n.apply(this,s)}else if(i(n))for(s=Array.prototype.slice.call(arguments,1),a=(c=n.slice()).length,u=0;u<a;u++)c[u].apply(this,s);return!0},n.prototype.addListener=function(e,t){var a;if(!r(t))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,r(t.listener)?t.listener:t),this._events[e]?i(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,i(this._events[e])&&!this._events[e].warned&&(a=o(this._maxListeners)?n.defaultMaxListeners:this._maxListeners)&&a>0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},n.prototype.on=n.prototype.addListener,n.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},n.prototype.removeListener=function(e,t){var n,o,a,s;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(a=(n=this._events[e]).length,o=-1,n===t||r(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(i(n)){for(s=a;s-->0;)if(n[s]===t||n[s].listener&&n[s].listener===t){o=s;break}if(o<0)return this;1===n.length?(n.length=0,delete this._events[e]):n.splice(o,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},n.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},n.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},n.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},n.listenerCount=function(e,t){return e.listenerCount(t)}},function(e,t){function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function r(t){return"function"==typeof Symbol&&"symbol"===n(Symbol.iterator)?e.exports=r=function(e){return n(e)}:e.exports=r=function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":n(e)},r(t)}e.exports=r},function(e,t,n){"use strict";var r=n(1),i=r(n(0)),o=r(n(2)),a=r(n(5)),s=r(n(3)),u=r(n(4)),c=n(30).EventEmitter,l=n(29),f=n(28),h=n(26),d=n(20),p=n(19),v=(n(12),n(6),n(7)),m=(n(9),n(10),n(15).reflector),y=function(e){function t(e,n,r,o,u){var c;return(0,i.default)(this,t),c=(0,a.default)(this,(0,s.default)(t).call(this)),l(o),c._config=new f(u),c._Promise=c._config.Promise,c._factory=o,c._draining=!1,c._started=!1,c._waitingClientsQueue=new r(c._config.priorityRange),c._factoryCreateOperations=new Set,c._factoryDestroyOperations=new Set,c._availableObjects=new n,c._testOnBorrowResources=new Set,c._testOnReturnResources=new Set,c._validationOperations=new Set,c._allObjects=new Set,c._resourceLoans=new Map,c._evictionIterator=c._availableObjects.iterator(),c._evictor=new e,c._scheduledEviction=null,!0===c._config.autostart&&c.start(),c}return(0,u.default)(t,e),(0,o.default)(t,[{key:"_destroy",value:function(e){var t=this;e.invalidate(),this._allObjects.delete(e);var n=this._factory.destroy(e.obj),r=this._Promise.resolve(n);this._trackOperation(r,this._factoryDestroyOperations).catch(function(e){t.emit("factoryDestroyError",e)}),this._ensureMinimum()}},{key:"_testOnBorrow",value:function(){var e=this;if(this._availableObjects.length<1)return!1;var t=this._availableObjects.shift();t.test(),this._testOnBorrowResources.add(t);var n=this._factory.validate(t.obj),r=this._Promise.resolve(n);return this._trackOperation(r,this._validationOperations).then(function(n){if(e._testOnBorrowResources.delete(t),!1===n)return t.invalidate(),e._destroy(t),void e._dispense();e._dispatchPooledResourceToNextWaitingClient(t)}),!0}},{key:"_dispatchResource",value:function(){if(this._availableObjects.length<1)return!1;var e=this._availableObjects.shift();return this._dispatchPooledResourceToNextWaitingClient(e),!1}},{key:"_dispense",value:function(){var e=this._waitingClientsQueue.length;if(!(e<1)){for(var t=e-this._potentiallyAllocableResourceCount,n=Math.min(this.spareResourceCapacity,t),r=0;n>r;r++)this._createResource();if(!0===this._config.testOnBorrow)for(var i=e-this._testOnBorrowResources.size,o=Math.min(this._availableObjects.length,i),a=0;o>a;a++)this._testOnBorrow();if(!1===this._config.testOnBorrow)for(var s=Math.min(this._availableObjects.length,e),u=0;s>u;u++)this._dispatchResource()}}},{key:"_dispatchPooledResourceToNextWaitingClient",value:function(e){var t=this._waitingClientsQueue.dequeue();if(void 0===t||t.state!==v.PENDING)return this._addPooledResourceToAvailableObjects(e),!1;var n=new d(e,this._Promise);return this._resourceLoans.set(e.obj,n),e.allocate(),t.resolve(e.obj),!0}},{key:"_trackOperation",value:function(e,t){var n=this;return t.add(e),e.then(function(r){return t.delete(e),n._Promise.resolve(r)},function(r){return t.delete(e),n._Promise.reject(r)})}},{key:"_createResource",value:function(){var e=this,t=this._factory.create(),n=this._Promise.resolve(t).then(function(t){var n=new p(t);e._allObjects.add(n),e._addPooledResourceToAvailableObjects(n)});this._trackOperation(n,this._factoryCreateOperations).then(function(){return e._dispense(),null}).catch(function(t){e.emit("factoryCreateError",t),e._dispense()})}},{key:"_ensureMinimum",value:function(){if(!0!==this._draining)for(var e=this._config.min-this._count,t=0;t<e;t++)this._createResource()}},{key:"_evict",value:function(){for(var e=Math.min(this._config.numTestsPerEvictionRun,this._availableObjects.length),t={softIdleTimeoutMillis:this._config.softIdleTimeoutMillis,idleTimeoutMillis:this._config.idleTimeoutMillis,min:this._config.min},n=0;n<e;){var r=this._evictionIterator.next();if(!0===r.done&&this._availableObjects.length<1)return void this._evictionIterator.reset();if(!0===r.done&&this._availableObjects.length>0)this._evictionIterator.reset();else{var i=r.value;n++,!0===this._evictor.evict(t,i,this._availableObjects.length)&&(this._evictionIterator.remove(),this._destroy(i))}}}},{key:"_scheduleEvictorRun",value:function(){var e=this;this._config.evictionRunIntervalMillis>0&&(this._scheduledEviction=setTimeout(function(){e._evict(),e._scheduleEvictorRun()},this._config.evictionRunIntervalMillis))}},{key:"_descheduleEvictorRun",value:function(){this._scheduledEviction&&clearTimeout(this._scheduledEviction),this._scheduledEviction=null}},{key:"start",value:function(){!0!==this._draining&&!0!==this._started&&(this._started=!0,this._scheduleEvictorRun(),this._ensureMinimum())}},{key:"acquire",value:function(e){if(!1===this._started&&!1===this._config.autostart&&this.start(),this._draining)return this._Promise.reject(new Error("pool is draining and cannot accept work"));if(this.spareResourceCapacity<1&&this._availableObjects.length<1&&void 0!==this._config.maxWaitingClients&&this._waitingClientsQueue.length>=this._config.maxWaitingClients)return this._Promise.reject(new Error("max waitingClients count exceeded"));var t=new h(this._config.acquireTimeoutMillis,this._Promise);return this._waitingClientsQueue.enqueue(t,e),this._dispense(),t.promise}},{key:"use",value:function(e){var t=this;return this.acquire().then(function(n){return e(n).then(function(e){return t.release(n),e},function(e){throw t.destroy(n),e})})}},{key:"isBorrowedResource",value:function(e){return this._resourceLoans.has(e)}},{key:"release",value:function(e){var t=this._resourceLoans.get(e);if(void 0===t)return this._Promise.reject(new Error("Resource not currently part of this pool"));this._resourceLoans.delete(e),t.resolve();var n=t.pooledResource;return n.deallocate(),this._addPooledResourceToAvailableObjects(n),this._dispense(),this._Promise.resolve()}},{key:"destroy",value:function(e){var t=this._resourceLoans.get(e);if(void 0===t)return this._Promise.reject(new Error("Resource not currently part of this pool"));this._resourceLoans.delete(e),t.resolve();var n=t.pooledResource;return n.deallocate(),this._destroy(n),this._dispense(),this._Promise.resolve()}},{key:"_addPooledResourceToAvailableObjects",value:function(e){e.idle(),!0===this._config.fifo?this._availableObjects.push(e):this._availableObjects.unshift(e)}},{key:"drain",value:function(){var e=this;return this._draining=!0,this.__allResourceRequestsSettled().then(function(){return e.__allResourcesReturned()}).then(function(){e._descheduleEvictorRun()})}},{key:"__allResourceRequestsSettled",value:function(){return this._waitingClientsQueue.length>0?m(this._waitingClientsQueue.tail.promise):this._Promise.resolve()}},{key:"__allResourcesReturned",value:function(){var e=Array.from(this._resourceLoans.values()).map(function(e){return e.promise}).map(m);return this._Promise.all(e)}},{key:"clear",value:function(){var e=this,t=Array.from(this._factoryCreateOperations).map(m);return this._Promise.all(t).then(function(){var t=!0,n=!1,r=void 0;try{for(var i,o=e._availableObjects[Symbol.iterator]();!(t=(i=o.next()).done);t=!0){var a=i.value;e._destroy(a)}}catch(e){n=!0,r=e}finally{try{t||null==o.return||o.return()}finally{if(n)throw r}}var s=Array.from(e._factoryDestroyOperations).map(m);return m(e._Promise.all(s))})}},{key:"_potentiallyAllocableResourceCount",get:function(){return this._availableObjects.length+this._testOnBorrowResources.size+this._testOnReturnResources.size+this._factoryCreateOperations.size}},{key:"_count",get:function(){return this._allObjects.size+this._factoryCreateOperations.size}},{key:"spareResourceCapacity",get:function(){return this._config.max-(this._allObjects.size+this._factoryCreateOperations.size)}},{key:"size",get:function(){return this._count}},{key:"available",get:function(){return this._availableObjects.length}},{key:"borrowed",get:function(){return this._resourceLoans.size}},{key:"pending",get:function(){return this._waitingClientsQueue.length}},{key:"max",get:function(){return this._config.max}},{key:"min",get:function(){return this._config.min}}]),t}(c);e.exports=y},function(e,t,n){"use strict";var r=n(32),i=n(6),o=n(9),a=n(12);e.exports={Pool:r,Deque:i,PriorityQueue:o,DefaultEvictor:a,createPool:function(e,t){return new r(a,i,o,e,t)}}}])},function(e,t){function n(e){this.str=e}e.exports=function(e){return new n(e).parse()},n.prototype.skip=function(e){this.str=this.str.slice(e[0].length)},n.prototype.comma=function(){var e=/^, */.exec(this.str);if(e)return this.skip(e),{type:"comma",string:","}},n.prototype.ident=function(){var e=/^([\w-]+) */.exec(this.str);if(e)return this.skip(e),{type:"ident",string:e[1]}},n.prototype.int=function(){var e=/^((\d+)(\S+)?) */.exec(this.str);if(e){this.skip(e);var t=~~e[2],n=e[3];return{type:"number",string:e[1],unit:n||"",value:t}}},n.prototype.float=function(){var e=/^(((?:\d+)?\.\d+)(\S+)?) */.exec(this.str);if(e){this.skip(e);var t=parseFloat(e[2]),n=e[3];return{type:"number",string:e[1],unit:n||"",value:t}}},n.prototype.number=function(){return this.float()||this.int()},n.prototype.double=function(){var e=/^"([^"]*)" */.exec(this.str);return e?(this.skip(e),{type:"string",quote:'"',string:'"'+e[1]+'"',value:e[1]}):e},n.prototype.single=function(){var e=/^'([^']*)' */.exec(this.str);return e?(this.skip(e),{type:"string",quote:"'",string:"'"+e[1]+"'",value:e[1]}):e},n.prototype.string=function(){return this.single()||this.double()},n.prototype.value=function(){return this.number()||this.ident()||this.string()||this.comma()},n.prototype.parse=function(){for(var e=[];this.str.length;){var t=this.value();if(!t)throw new Error("failed to parse near `"+this.str.slice(0,10)+"...`");e.push(t)}return e}},function(e,t,n){"use strict";n.d(t,"a",function(){return r});var r=function(){function e(){this._hasWeakSet="function"==typeof WeakSet,this._inner=this._hasWeakSet?new WeakSet:[]}return e.prototype.memoize=function(e){if(this._hasWeakSet)return!!this._inner.has(e)||(this._inner.add(e),!1);for(var t=0;t<this._inner.length;t++){if(this._inner[t]===e)return!0}return this._inner.push(e),!1},e.prototype.unmemoize=function(e){if(this._hasWeakSet)this._inner.delete(e);else for(var t=0;t<this._inner.length;t++)if(this._inner[t]===e){this._inner.splice(t,1);break}},e}()},,,function(e,t,n){"use strict";n.r(t);var r={};n.r(r),n.d(r,"FunctionToString",function(){return I}),n.d(r,"InboundFilters",function(){return M});var i={};n.r(i),n.d(i,"GlobalHandlers",function(){return Se}),n.d(i,"TryCatch",function(){return $e}),n.d(i,"Breadcrumbs",function(){return Ue}),n.d(i,"LinkedErrors",function(){return Ae}),n.d(i,"UserAgent",function(){return Ye});var o={};n.r(o),n.d(o,"BaseTransport",function(){return he}),n.d(o,"FetchTransport",function(){return ve}),n.d(o,"XHRTransport",function(){return de});var a={};n.r(a),n.d(a,"Severity",function(){return l}),n.d(a,"Status",function(){return f}),n.d(a,"addGlobalEventProcessor",function(){return C.b}),n.d(a,"addBreadcrumb",function(){return b}),n.d(a,"captureException",function(){return v}),n.d(a,"captureEvent",function(){return y}),n.d(a,"captureMessage",function(){return m}),n.d(a,"configureScope",function(){return g}),n.d(a,"getHubFromCarrier",function(){return d.c}),n.d(a,"getCurrentHub",function(){return d.b}),n.d(a,"Hub",function(){return d.a}),n.d(a,"Scope",function(){return C.a}),n.d(a,"setContext",function(){return w}),n.d(a,"setExtra",function(){return x}),n.d(a,"setExtras",function(){return _}),n.d(a,"setTag",function(){return E}),n.d(a,"setTags",function(){return k}),n.d(a,"setUser",function(){return T}),n.d(a,"withScope",function(){return A}),n.d(a,"BrowserClient",function(){return be}),n.d(a,"defaultIntegrations",function(){return He}),n.d(a,"forceLoad",function(){return Ke}),n.d(a,"init",function(){return qe}),n.d(a,"lastEventId",function(){return Ge}),n.d(a,"onLoad",function(){return Qe}),n.d(a,"showReportDialog",function(){return We}),n.d(a,"flush",function(){return Ze}),n.d(a,"close",function(){return Je}),n.d(a,"wrap",function(){return Xe}),n.d(a,"SDK_NAME",function(){return ye}),n.d(a,"SDK_VERSION",function(){return ge}),n.d(a,"Integrations",function(){return nt}),n.d(a,"Transports",function(){return o});var s={};n.r(s),n.d(s,"nanoid",function(){return Bt}),n.d(s,"customAlphabet",function(){return Ft});var u=n(171),c=n.n(u);n(582),n(541),n(517),n(500),n(468),n(446),n(411),n(410);"Promise"in window?"finally"in window.Promise.prototype||(window.Promise.prototype.finally=c.a.prototype.finally):window.Promise=c.a;var l,f,h=n(5);!function(e){e.Fatal="fatal",e.Error="error",e.Warning="warning",e.Log="log",e.Info="info",e.Debug="debug",e.Critical="critical"}(l||(l={})),function(e){e.fromString=function(t){switch(t){case"debug":return e.Debug;case"info":return e.Info;case"warn":case"warning":return e.Warning;case"error":return e.Error;case"fatal":return e.Fatal;case"critical":return e.Critical;case"log":default:return e.Log}}}(l||(l={})),function(e){e.Unknown="unknown",e.Skipped="skipped",e.Success="success",e.RateLimit="rate_limit",e.Invalid="invalid",e.Failed="failed"}(f||(f={})),function(e){e.fromHttpCode=function(t){return t>=200&&t<300?e.Success:429===t?e.RateLimit:t>=400&&t<500?e.Invalid:t>=500?e.Failed:e.Unknown}}(f||(f={}));var d=n(48);function p(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=Object(d.b)();if(r&&r[e])return r[e].apply(r,h.d(t));throw new Error("No hub defined or "+e+" was not found on the hub, please open a bug report.")}function v(e){var t;try{throw new Error("Sentry syntheticException")}catch(e){t=e}return p("captureException",e,{originalException:e,syntheticException:t})}function m(e,t){var n;try{throw new Error(e)}catch(e){n=e}return p("captureMessage",e,t,{originalException:e,syntheticException:n})}function y(e){return p("captureEvent",e)}function g(e){p("configureScope",e)}function b(e){p("addBreadcrumb",e)}function w(e,t){p("setContext",e,t)}function _(e){p("setExtras",e)}function k(e){p("setTags",e)}function x(e,t){p("setExtra",e,t)}function E(e,t){p("setTag",e,t)}function T(e){p("setUser",e)}function A(e){p("withScope",e)}var S,C=n(114),I=function(){function e(){this.name=e.id}return e.prototype.setupOnce=function(){S=Function.prototype.toString,Function.prototype.toString=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=this.__sentry_original__||this;return S.apply(n,e)}},e.id="FunctionToString",e}(),O=n(206),P=n(113),D=n(406),L=[/^Script error\.?$/,/^Javascript error: Script error\.? on line 0$/],M=function(){function e(t){void 0===t&&(t={}),this._options=t,this.name=e.id}return e.prototype.setupOnce=function(){Object(C.b)(function(t){var n=Object(d.b)();if(!n)return t;var r=n.getIntegration(e);if(r){var i=n.getClient(),o=i?i.getOptions():{},a=r._mergeOptions(o);if(r._shouldDropEvent(t,a))return null}return t})},e.prototype._shouldDropEvent=function(e,t){return this._isSentryError(e,t)?(O.a.warn("Event dropped due to being internal Sentry Error.\nEvent: "+Object(P.e)(e)),!0):this._isIgnoredError(e,t)?(O.a.warn("Event dropped due to being matched by `ignoreErrors` option.\nEvent: "+Object(P.e)(e)),!0):this._isBlacklistedUrl(e,t)?(O.a.warn("Event dropped due to being matched by `blacklistUrls` option.\nEvent: "+Object(P.e)(e)+".\nUrl: "+this._getEventFilterUrl(e)),!0):!this._isWhitelistedUrl(e,t)&&(O.a.warn("Event dropped due to not being matched by `whitelistUrls` option.\nEvent: "+Object(P.e)(e)+".\nUrl: "+this._getEventFilterUrl(e)),!0)},e.prototype._isSentryError=function(e,t){if(void 0===t&&(t={}),!t.ignoreInternal)return!1;try{return e&&e.exception&&e.exception.values&&e.exception.values[0]&&"SentryError"===e.exception.values[0].type||!1}catch(e){return!1}},e.prototype._isIgnoredError=function(e,t){return void 0===t&&(t={}),!(!t.ignoreErrors||!t.ignoreErrors.length)&&this._getPossibleEventMessages(e).some(function(e){return t.ignoreErrors.some(function(t){return Object(D.a)(e,t)})})},e.prototype._isBlacklistedUrl=function(e,t){if(void 0===t&&(t={}),!t.blacklistUrls||!t.blacklistUrls.length)return!1;var n=this._getEventFilterUrl(e);return!!n&&t.blacklistUrls.some(function(e){return Object(D.a)(n,e)})},e.prototype._isWhitelistedUrl=function(e,t){if(void 0===t&&(t={}),!t.whitelistUrls||!t.whitelistUrls.length)return!0;var n=this._getEventFilterUrl(e);return!n||t.whitelistUrls.some(function(e){return Object(D.a)(n,e)})},e.prototype._mergeOptions=function(e){return void 0===e&&(e={}),{blacklistUrls:h.d(this._options.blacklistUrls||[],e.blacklistUrls||[]),ignoreErrors:h.d(this._options.ignoreErrors||[],e.ignoreErrors||[],L),ignoreInternal:void 0===this._options.ignoreInternal||this._options.ignoreInternal,whitelistUrls:h.d(this._options.whitelistUrls||[],e.whitelistUrls||[])}},e.prototype._getPossibleEventMessages=function(e){if(e.message)return[e.message];if(e.exception)try{var t=e.exception.values&&e.exception.values[0]||{},n=t.type,r=void 0===n?"":n,i=t.value,o=void 0===i?"":i;return[""+o,r+": "+o]}catch(t){return O.a.error("Cannot extract message for event "+Object(P.e)(e)),[]}return[]},e.prototype._getEventFilterUrl=function(e){try{if(e.stacktrace){var t=e.stacktrace.frames;return t&&t[t.length-1].filename||null}if(e.exception){var n=e.exception.values&&e.exception.values[0].stacktrace&&e.exception.values[0].stacktrace.frames;return n&&n[n.length-1].filename||null}return null}catch(t){return O.a.error("Cannot extract url for event "+Object(P.e)(e)),null}},e.id="InboundFilters",e}(),j=n(81),N=n(405),R=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,t){return e.__proto__=t,e}:function(e,t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n]);return e});var F=function(e){function t(t){var n=this.constructor,r=e.call(this,t)||this;return r.message=t,r.name=n.prototype.constructor.name,R(r,n.prototype),r}return h.b(t,e),t}(Error),B=/^(?:(\w+):)\/\/(?:(\w+)(?::(\w+))?@)([\w\.-]+)(?::(\d+))?\/(.+)/,U=function(){function e(e){"string"==typeof e?this._fromString(e):this._fromComponents(e),this._validate()}return e.prototype.toString=function(e){void 0===e&&(e=!1);var t=this,n=t.host,r=t.path,i=t.pass,o=t.port,a=t.projectId;return t.protocol+"://"+t.user+(e&&i?":"+i:"")+"@"+n+(o?":"+o:"")+"/"+(r?r+"/":r)+a},e.prototype._fromString=function(e){var t=B.exec(e);if(!t)throw new F("Invalid Dsn");var n=h.c(t.slice(1),6),r=n[0],i=n[1],o=n[2],a=void 0===o?"":o,s=n[3],u=n[4],c=void 0===u?"":u,l="",f=n[5],d=f.split("/");d.length>1&&(l=d.slice(0,-1).join("/"),f=d.pop()),this._fromComponents({host:s,pass:a,path:l,projectId:f,port:c,protocol:r,user:i})},e.prototype._fromComponents=function(e){this.protocol=e.protocol,this.user=e.user,this.pass=e.pass||"",this.host=e.host,this.port=e.port||"",this.path=e.path||"",this.projectId=e.projectId},e.prototype._validate=function(){var e=this;if(["protocol","user","host","projectId"].forEach(function(t){if(!e[t])throw new F("Invalid Dsn")}),"http"!==this.protocol&&"https"!==this.protocol)throw new F("Invalid Dsn");if(this.port&&isNaN(parseInt(this.port,10)))throw new F("Invalid Dsn")},e}(),z=[];function $(e){var t={};return function(e){var t=e.defaultIntegrations&&h.d(e.defaultIntegrations)||[],n=e.integrations,r=[];if(Array.isArray(n)){var i=n.map(function(e){return e.name}),o=[];t.forEach(function(e){-1===i.indexOf(e.name)&&-1===o.indexOf(e.name)&&(r.push(e),o.push(e.name))}),n.forEach(function(e){-1===o.indexOf(e.name)&&(r.push(e),o.push(e.name))})}else"function"==typeof n?(r=n(t),r=Array.isArray(r)?r:[r]):r=h.d(t);var a=r.map(function(e){return e.name});return-1!==a.indexOf("Debug")&&r.push.apply(r,h.d(r.splice(a.indexOf("Debug"),1))),r}(e).forEach(function(e){t[e.name]=e,function(e){-1===z.indexOf(e.name)&&(e.setupOnce(C.b,d.b),z.push(e.name),O.a.log("Integration installed: "+e.name))}(e)}),t}var V=function(){function e(e,t){this._integrations={},this._processing=!1,this._backend=new e(t),this._options=t,t.dsn&&(this._dsn=new U(t.dsn)),this._isEnabled()&&(this._integrations=$(this._options))}return e.prototype.captureException=function(e,t,n){var r=this,i=t&&t.event_id;return this._processing=!0,this._getBackend().eventFromException(e,t).then(function(e){return r._processEvent(e,t,n)}).then(function(e){i=e&&e.event_id,r._processing=!1}).then(null,function(e){O.a.error(e),r._processing=!1}),i},e.prototype.captureMessage=function(e,t,n,r){var i=this,o=n&&n.event_id;return this._processing=!0,(Object(j.i)(e)?this._getBackend().eventFromMessage(""+e,t,n):this._getBackend().eventFromException(e,n)).then(function(e){return i._processEvent(e,n,r)}).then(function(e){o=e&&e.event_id,i._processing=!1}).then(null,function(e){O.a.error(e),i._processing=!1}),o},e.prototype.captureEvent=function(e,t,n){var r=this,i=t&&t.event_id;return this._processing=!0,this._processEvent(e,t,n).then(function(e){i=e&&e.event_id,r._processing=!1}).then(null,function(e){O.a.error(e),r._processing=!1}),i},e.prototype.getDsn=function(){return this._dsn},e.prototype.getOptions=function(){return this._options},e.prototype.flush=function(e){var t=this;return this._isClientProcessing(e).then(function(n){return clearInterval(n.interval),t._getBackend().getTransport().close(e).then(function(e){return n.ready&&e})})},e.prototype.close=function(e){var t=this;return this.flush(e).then(function(e){return t.getOptions().enabled=!1,e})},e.prototype.getIntegrations=function(){return this._integrations||{}},e.prototype.getIntegration=function(e){try{return this._integrations[e.id]||null}catch(t){return O.a.warn("Cannot retrieve integration "+e.id+" from the current Client"),null}},e.prototype._isClientProcessing=function(e){var t=this;return new N.a(function(n){var r=0,i=0;clearInterval(i),i=setInterval(function(){t._processing?e&&(r+=1)>=e&&n({interval:i,ready:!1}):n({interval:i,ready:!0})},1)})},e.prototype._getBackend=function(){return this._backend},e.prototype._isEnabled=function(){return!1!==this.getOptions().enabled&&void 0!==this._dsn},e.prototype._prepareEvent=function(e,t,n){var r=this.getOptions(),i=r.environment,o=r.release,a=r.dist,s=r.maxValueLength,u=void 0===s?250:s,c=h.a({},e);void 0===c.environment&&void 0!==i&&(c.environment=i),void 0===c.release&&void 0!==o&&(c.release=o),void 0===c.dist&&void 0!==a&&(c.dist=a),c.message&&(c.message=Object(D.c)(c.message,u));var l=c.exception&&c.exception.values&&c.exception.values[0];l&&l.value&&(l.value=Object(D.c)(l.value,u));var f=c.request;f&&f.url&&(f.url=Object(D.c)(f.url,u)),void 0===c.event_id&&(c.event_id=Object(P.n)()),this._addIntegrations(c.sdk);var d=N.a.resolve(c);return t&&(d=t.applyToEvent(c,n)),d},e.prototype._addIntegrations=function(e){var t=Object.keys(this._integrations);e&&t.length>0&&(e.integrations=t)},e.prototype._processEvent=function(e,t,n){var r=this,i=this.getOptions(),o=i.beforeSend,a=i.sampleRate;return this._isEnabled()?"number"==typeof a&&Math.random()>a?N.a.reject("This event has been sampled, will not send event."):new N.a(function(i,a){r._prepareEvent(e,n,t).then(function(e){if(null!==e){var n=e;try{if(t&&t.data&&!0===t.data.__sentry__||!o)return r._getBackend().sendEvent(n),void i(n);var s=o(e,t);if(void 0===s)O.a.error("`beforeSend` method has to return `null` or a valid event.");else if(Object(j.m)(s))r._handleAsyncBeforeSend(s,i,a);else{if(null===(n=s))return O.a.log("`beforeSend` returned `null`, will not send event."),void i(null);r._getBackend().sendEvent(n),i(n)}}catch(e){r.captureException(e,{data:{__sentry__:!0},originalException:e}),a("`beforeSend` threw an error, will not send event.")}}else a("An event processor returned null, will not send event.")}).then(null,function(){a("`beforeSend` threw an error, will not send event.")})}):N.a.reject("SDK not enabled, will not send event.")},e.prototype._handleAsyncBeforeSend=function(e,t,n){var r=this;e.then(function(e){null!==e?(r._getBackend().sendEvent(e),t(e)):n("`beforeSend` returned `null`, will not send event.")}).then(null,function(e){n("beforeSend rejected with "+e)})},e}(),Y=n(407),H=function(){function e(e){this.dsn=e,this._dsnObject=new U(e)}return e.prototype.getDsn=function(){return this._dsnObject},e.prototype.getStoreEndpoint=function(){return""+this._getBaseUrl()+this.getStoreEndpointPath()},e.prototype.getStoreEndpointWithUrlEncodedAuth=function(){var e={sentry_key:this._dsnObject.user,sentry_version:"7"};return this.getStoreEndpoint()+"?"+Object(Y.e)(e)},e.prototype._getBaseUrl=function(){var e=this._dsnObject,t=e.protocol?e.protocol+":":"",n=e.port?":"+e.port:"";return t+"//"+e.host+n},e.prototype.getStoreEndpointPath=function(){var e=this._dsnObject;return(e.path?"/"+e.path:"")+"/api/"+e.projectId+"/store/"},e.prototype.getRequestHeaders=function(e,t){var n=this._dsnObject,r=["Sentry sentry_version=7"];return r.push("sentry_timestamp="+Object(P.m)()),r.push("sentry_client="+e+"/"+t),r.push("sentry_key="+n.user),n.pass&&r.push("sentry_secret="+n.pass),{"Content-Type":"application/json","X-Sentry-Auth":r.join(", ")}},e.prototype.getReportDialogEndpoint=function(e){void 0===e&&(e={});var t=this._dsnObject,n=this._getBaseUrl()+(t.path?"/"+t.path:"")+"/api/embed/error-page/",r=[];for(var i in r.push("dsn="+t.toString()),e)if("user"===i){if(!e.user)continue;e.user.name&&r.push("name="+encodeURIComponent(e.user.name)),e.user.email&&r.push("email="+encodeURIComponent(e.user.email))}else r.push(encodeURIComponent(i)+"="+encodeURIComponent(e[i]));return r.length?n+"?"+r.join("&"):n},e}(),q=function(){function e(){}return e.prototype.sendEvent=function(e){return N.a.resolve({reason:"NoopTransport: Event has been skipped because no Dsn is configured.",status:f.Skipped})},e.prototype.close=function(e){return N.a.resolve(!0)},e}(),W=function(){function e(e){this._options=e,this._options.dsn||O.a.warn("No DSN provided, backend will not do anything."),this._transport=this._setupTransport()}return e.prototype._setupTransport=function(){return new q},e.prototype.eventFromException=function(e,t){throw new F("Backend has to implement `eventFromException` method")},e.prototype.eventFromMessage=function(e,t,n){throw new F("Backend has to implement `eventFromMessage` method")},e.prototype.sendEvent=function(e){this._transport.sendEvent(e).then(null,function(e){O.a.error("Error while sending event: "+e)})},e.prototype.getTransport=function(){return this._transport},e}();function G(){if(!("fetch"in Object(P.g)()))return!1;try{return new Headers,new Request(""),new Response,!0}catch(e){return!1}}function K(e){return e&&/^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(e.toString())}var Q="?",Z=/^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[-a-z]+:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,J=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js))(?::(\d+))?(?::(\d+))?\s*$/i,X=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,ee=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,te=/\((\S*)(?::(\d+))(?::(\d+))\)/;function ne(e){var t=null,n=e&&e.framesToPop;try{if(t=function(e){if(!e||!e.stacktrace)return null;for(var t,n=/ line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i,r=/ line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\))? in (.*):\s*$/i,i=e.stacktrace.split("\n"),o=[],a=0;a<i.length;a+=2){var s=null;(t=n.exec(i[a]))?s={url:t[2],func:t[3],args:[],line:+t[1],column:null}:(t=r.exec(i[a]))&&(s={url:t[6],func:t[3]||t[4],args:t[5]?t[5].split(","):[],line:+t[1],column:+t[2]}),s&&(!s.func&&s.line&&(s.func=Q),o.push(s))}if(!o.length)return null;return{message:ie(e),name:e.name,stack:o}}(e))return re(t,n)}catch(e){}try{if(t=function(e){if(!e||!e.stack)return null;for(var t,n,r,i=[],o=e.stack.split("\n"),a=0;a<o.length;++a){if(n=Z.exec(o[a])){var s=n[2]&&0===n[2].indexOf("native");n[2]&&0===n[2].indexOf("eval")&&(t=te.exec(n[2]))&&(n[2]=t[1],n[3]=t[2],n[4]=t[3]),r={url:n[2],func:n[1]||Q,args:s?[n[2]]:[],line:n[3]?+n[3]:null,column:n[4]?+n[4]:null}}else if(n=X.exec(o[a]))r={url:n[2],func:n[1]||Q,args:[],line:+n[3],column:n[4]?+n[4]:null};else{if(!(n=J.exec(o[a])))continue;n[3]&&n[3].indexOf(" > eval")>-1&&(t=ee.exec(n[3]))?(n[1]=n[1]||"eval",n[3]=t[1],n[4]=t[2],n[5]=""):0!==a||n[5]||void 0===e.columnNumber||(i[0].column=e.columnNumber+1),r={url:n[3],func:n[1]||Q,args:n[2]?n[2].split(","):[],line:n[4]?+n[4]:null,column:n[5]?+n[5]:null}}!r.func&&r.line&&(r.func=Q),i.push(r)}if(!i.length)return null;return{message:ie(e),name:e.name,stack:i}}(e))return re(t,n)}catch(e){}return{message:ie(e),name:e&&e.name,stack:[],failed:!0}}function re(e,t){try{return h.a({},e,{stack:e.stack.slice(t)})}catch(t){return e}}function ie(e){var t=e&&e.message;return t?t.error&&"string"==typeof t.error.message?t.error.message:t:"No error message"}var oe=50;function ae(e){var t=ue(e.stack),n={type:e.name,value:e.message};return t&&t.length&&(n.stacktrace={frames:t}),void 0===n.type&&""===n.value&&(n.value="Unrecoverable error caught"),n}function se(e){return{exception:{values:[ae(e)]}}}function ue(e){if(!e||!e.length)return[];var t=e,n=t[0].func||"",r=t[t.length-1].func||"";return-1===n.indexOf("captureMessage")&&-1===n.indexOf("captureException")||(t=t.slice(1)),-1!==r.indexOf("sentryWrapped")&&(t=t.slice(0,-1)),t.map(function(e){return{colno:null===e.column?void 0:e.column,filename:e.url||t[0].url,function:e.func||"?",in_app:!0,lineno:null===e.line?void 0:e.line}}).slice(0,oe).reverse()}function ce(e,t,n){var r;if(void 0===n&&(n={}),Object(j.e)(e)&&e.error)return r=se(ne(e=e.error));if(Object(j.a)(e)||Object(j.b)(e)){var i=e,o=i.name||(Object(j.a)(i)?"DOMError":"DOMException"),a=i.message?o+": "+i.message:o;return r=le(a,t,n),Object(P.b)(r,a),r}return Object(j.d)(e)?r=se(ne(e)):Object(j.h)(e)||Object(j.f)(e)?(r=function(e,t,n){var r={exception:{values:[{type:Object(j.f)(e)?e.constructor.name:n?"UnhandledRejection":"Error",value:"Non-Error "+(n?"promise rejection":"exception")+" captured with keys: "+Object(Y.a)(e)}]},extra:{__serialized__:Object(Y.d)(e)}};if(t){var i=ue(ne(t).stack);r.stacktrace={frames:i}}return r}(e,t,n.rejection),Object(P.a)(r,{synthetic:!0}),r):(r=le(e,t,n),Object(P.b)(r,""+e,void 0),Object(P.a)(r,{synthetic:!0}),r)}function le(e,t,n){void 0===n&&(n={});var r={message:e};if(n.attachStacktrace&&t){var i=ue(ne(t).stack);r.stacktrace={frames:i}}return r}var fe=function(){function e(e){this._limit=e,this._buffer=[]}return e.prototype.isReady=function(){return void 0===this._limit||this.length()<this._limit},e.prototype.add=function(e){var t=this;return this.isReady()?(-1===this._buffer.indexOf(e)&&this._buffer.push(e),e.then(function(){return t.remove(e)}).then(null,function(){return t.remove(e).then(null,function(){})}),e):N.a.reject(new F("Not adding Promise due to buffer limit reached."))},e.prototype.remove=function(e){return this._buffer.splice(this._buffer.indexOf(e),1)[0]},e.prototype.length=function(){return this._buffer.length},e.prototype.drain=function(e){var t=this;return new N.a(function(n){var r=setTimeout(function(){e&&e>0&&n(!1)},e);N.a.all(t._buffer).then(function(){clearTimeout(r),n(!0)}).then(null,function(){n(!0)})})},e}(),he=function(){function e(e){this.options=e,this._buffer=new fe(30),this.url=new H(this.options.dsn).getStoreEndpointWithUrlEncodedAuth()}return e.prototype.sendEvent=function(e){throw new F("Transport Class has to implement `sendEvent` method")},e.prototype.close=function(e){return this._buffer.drain(e)},e}(),de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._disabledUntil=new Date(Date.now()),t}return h.b(t,e),t.prototype.sendEvent=function(e){var t=this;return new Date(Date.now())<this._disabledUntil?Promise.reject({event:e,reason:"Transport locked till "+this._disabledUntil+" due to too many requests.",status:429}):this._buffer.add(new N.a(function(n,r){var i=new XMLHttpRequest;for(var o in i.onreadystatechange=function(){if(4===i.readyState){var e=f.fromHttpCode(i.status);if(e!==f.Success){if(e===f.RateLimit){var o=Date.now();t._disabledUntil=new Date(o+Object(P.k)(o,i.getResponseHeader("Retry-After"))),O.a.warn("Too many requests, backing off till: "+t._disabledUntil)}r(i)}else n({status:e})}},i.open("POST",t.url),t.options.headers)t.options.headers.hasOwnProperty(o)&&i.setRequestHeader(o,t.options.headers[o]);i.send(JSON.stringify(e))}))},t}(he),pe=Object(P.g)(),ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._disabledUntil=new Date(Date.now()),t}return h.b(t,e),t.prototype.sendEvent=function(e){var t=this;if(new Date(Date.now())<this._disabledUntil)return Promise.reject({event:e,reason:"Transport locked till "+this._disabledUntil+" due to too many requests.",status:429});var n={body:JSON.stringify(e),method:"POST",referrerPolicy:function(){if(!G())return!1;try{return new Request("_",{referrerPolicy:"origin"}),!0}catch(e){return!1}}()?"origin":""};return void 0!==this.options.headers&&(n.headers=this.options.headers),this._buffer.add(new N.a(function(e,r){pe.fetch(t.url,n).then(function(n){var i=f.fromHttpCode(n.status);if(i!==f.Success){if(i===f.RateLimit){var o=Date.now();t._disabledUntil=new Date(o+Object(P.k)(o,n.headers.get("Retry-After"))),O.a.warn("Too many requests, backing off till: "+t._disabledUntil)}r(n)}else e({status:i})}).catch(r)}))},t}(he),me=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return h.b(t,e),t.prototype._setupTransport=function(){if(!this._options.dsn)return e.prototype._setupTransport.call(this);var t=h.a({},this._options.transportOptions,{dsn:this._options.dsn});return this._options.transport?new this._options.transport(t):G()?new ve(t):new de(t)},t.prototype.eventFromException=function(e,t){var n=ce(e,t&&t.syntheticException||void 0,{attachStacktrace:this._options.attachStacktrace});return Object(P.a)(n,{handled:!0,type:"generic"}),n.level=l.Error,t&&t.event_id&&(n.event_id=t.event_id),N.a.resolve(n)},t.prototype.eventFromMessage=function(e,t,n){void 0===t&&(t=l.Info);var r=le(e,n&&n.syntheticException||void 0,{attachStacktrace:this._options.attachStacktrace});return r.level=t,n&&n.event_id&&(r.event_id=n.event_id),N.a.resolve(r)},t}(W),ye="sentry.javascript.browser",ge="5.11.0",be=function(e){function t(t){return void 0===t&&(t={}),e.call(this,me,t)||this}return h.b(t,e),t.prototype._prepareEvent=function(t,n,r){return t.platform=t.platform||"javascript",t.sdk=h.a({},t.sdk,{name:ye,packages:h.d(t.sdk&&t.sdk.packages||[],[{name:"npm:@sentry/browser",version:ge}]),version:ge}),e.prototype._prepareEvent.call(this,t,n,r)},t.prototype.showReportDialog=function(e){void 0===e&&(e={});var t=Object(P.g)().document;if(t)if(this._isEnabled()){var n=e.dsn||this.getDsn();if(e.eventId)if(n){var r=t.createElement("script");r.async=!0,r.src=new H(n).getReportDialogEndpoint(e),e.onLoad&&(r.onload=e.onLoad),(t.head||t.body).appendChild(r)}else O.a.error("Missing `Dsn` option in showReportDialog call");else O.a.error("Missing `eventId` option in showReportDialog call")}else O.a.error("Trying to call showReportDialog with Sentry Client is disabled")},t}(V);var we=0;function _e(){return we>0}function ke(e,t,n){if(void 0===t&&(t={}),"function"!=typeof e)return e;try{if(e.__sentry__)return e;if(e.__sentry_wrapped__)return e.__sentry_wrapped__}catch(t){return e}var r=function(){var r=Array.prototype.slice.call(arguments);try{n&&"function"==typeof n&&n.apply(this,arguments);var i=r.map(function(e){return ke(e,t)});return e.handleEvent?e.handleEvent.apply(this,i):e.apply(this,i)}catch(e){throw we+=1,setTimeout(function(){we-=1}),A(function(n){n.addEventProcessor(function(e){var n=h.a({},e);return t.mechanism&&(Object(P.b)(n,void 0,void 0),Object(P.a)(n,t.mechanism)),n.extra=h.a({},n.extra,{arguments:Object(Y.c)(r,3)}),n}),v(e)}),e}};try{for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(r[i]=e[i])}catch(e){}e.prototype=e.prototype||{},r.prototype=e.prototype,Object.defineProperty(e,"__sentry_wrapped__",{enumerable:!1,value:r}),Object.defineProperties(r,{__sentry__:{enumerable:!1,value:!0},__sentry_original__:{enumerable:!1,value:e}});try{Object.getOwnPropertyDescriptor(r,"name").configurable&&Object.defineProperty(r,"name",{get:function(){return e.name}})}catch(e){}return r}var xe,Ee="cause",Te=5,Ae=function(){function e(t){void 0===t&&(t={}),this.name=e.id,this._key=t.key||Ee,this._limit=t.limit||Te}return e.prototype.setupOnce=function(){Object(C.b)(function(t,n){var r=Object(d.b)().getIntegration(e);return r?r._handler(t,n):t})},e.prototype._handler=function(e,t){if(!(e.exception&&e.exception.values&&t&&Object(j.g)(t.originalException,Error)))return e;var n=this._walkErrorTree(t.originalException,this._key);return e.exception.values=h.d(n,e.exception.values),e},e.prototype._walkErrorTree=function(e,t,n){if(void 0===n&&(n=[]),!Object(j.g)(e[t],Error)||n.length+1>=this._limit)return n;var r=ae(ne(e[t]));return this._walkErrorTree(e[t],t,h.d([r],n))},e.id="LinkedErrors",e}(),Se=function(){function e(t){this.name=e.id,this._global=Object(P.g)(),this._oldOnErrorHandler=null,this._oldOnUnhandledRejectionHandler=null,this._onErrorHandlerInstalled=!1,this._onUnhandledRejectionHandlerInstalled=!1,this._options=h.a({onerror:!0,onunhandledrejection:!0},t)}return e.prototype.setupOnce=function(){Error.stackTraceLimit=50,this._options.onerror&&(O.a.log("Global Handler attached: onerror"),this._installGlobalOnErrorHandler()),this._options.onunhandledrejection&&(O.a.log("Global Handler attached: onunhandledrejection"),this._installGlobalOnUnhandledRejectionHandler())},e.prototype._installGlobalOnErrorHandler=function(){if(!this._onErrorHandlerInstalled){var t=this;this._oldOnErrorHandler=this._global.onerror,this._global.onerror=function(n,r,i,o,a){var s=Object(d.b)(),u=s.getIntegration(e),c=a&&!0===a.__sentry_own_request__;if(!u||_e()||c)return!!t._oldOnErrorHandler&&t._oldOnErrorHandler.apply(this,arguments);var l=s.getClient(),f=Object(j.i)(a)?t._eventFromIncompleteOnError(n,r,i,o):t._enhanceEventWithInitialFrame(ce(a,void 0,{attachStacktrace:l&&l.getOptions().attachStacktrace,rejection:!1}),r,i,o);return Object(P.a)(f,{handled:!1,type:"onerror"}),s.captureEvent(f,{originalException:a}),!!t._oldOnErrorHandler&&t._oldOnErrorHandler.apply(this,arguments)},this._onErrorHandlerInstalled=!0}},e.prototype._installGlobalOnUnhandledRejectionHandler=function(){if(!this._onUnhandledRejectionHandlerInstalled){var t=this;this._oldOnUnhandledRejectionHandler=this._global.onunhandledrejection,this._global.onunhandledrejection=function(n){var r=n;try{r=n&&"reason"in n?n.reason:n}catch(e){}var i=Object(d.b)(),o=i.getIntegration(e),a=r&&!0===r.__sentry_own_request__;if(!o||_e()||a)return!t._oldOnUnhandledRejectionHandler||t._oldOnUnhandledRejectionHandler.apply(this,arguments);var s=i.getClient(),u=Object(j.i)(r)?t._eventFromIncompleteRejection(r):ce(r,void 0,{attachStacktrace:s&&s.getOptions().attachStacktrace,rejection:!0});return u.level=l.Error,Object(P.a)(u,{handled:!1,type:"onunhandledrejection"}),i.captureEvent(u,{originalException:r}),!t._oldOnUnhandledRejectionHandler||t._oldOnUnhandledRejectionHandler.apply(this,arguments)},this._onUnhandledRejectionHandlerInstalled=!0}},e.prototype._eventFromIncompleteOnError=function(e,t,n,r){var i,o=Object(j.e)(e)?e.message:e;if(Object(j.k)(o)){var a=o.match(/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i);a&&(i=a[1],o=a[2])}var s={exception:{values:[{type:i||"Error",value:o}]}};return this._enhanceEventWithInitialFrame(s,t,n,r)},e.prototype._eventFromIncompleteRejection=function(e){return{exception:{values:[{type:"UnhandledRejection",value:"Non-Error promise rejection captured with value: "+e}]}}},e.prototype._enhanceEventWithInitialFrame=function(e,t,n,r){e.exception=e.exception||{},e.exception.values=e.exception.values||[],e.exception.values[0]=e.exception.values[0]||{},e.exception.values[0].stacktrace=e.exception.values[0].stacktrace||{},e.exception.values[0].stacktrace.frames=e.exception.values[0].stacktrace.frames||[];var i=isNaN(parseInt(r,10))?void 0:r,o=isNaN(parseInt(n,10))?void 0:n,a=Object(j.k)(t)&&t.length>0?t:Object(P.h)();return 0===e.exception.values[0].stacktrace.frames.length&&e.exception.values[0].stacktrace.frames.push({colno:i,filename:a,function:"?",in_app:!0,lineno:o}),e},e.id="GlobalHandlers",e}(),Ce=Object(P.g)(),Ie={},Oe={};function Pe(e){if(!Oe[e])switch(Oe[e]=!0,e){case"console":!function(){if(!("console"in Ce))return;["debug","info","warn","error","log","assert"].forEach(function(e){e in Ce.console&&Object(Y.b)(Ce.console,e,function(t){return function(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];Le("console",{args:n,level:e}),t&&Function.prototype.apply.call(t,Ce.console,n)}})})}();break;case"dom":!function(){if(!("document"in Ce))return;Ce.document.addEventListener("click",Fe("click",Le.bind(null,"dom")),!1),Ce.document.addEventListener("keypress",Be(Le.bind(null,"dom")),!1),["EventTarget","Node"].forEach(function(e){var t=Ce[e]&&Ce[e].prototype;t&&t.hasOwnProperty&&t.hasOwnProperty("addEventListener")&&(Object(Y.b)(t,"addEventListener",function(e){return function(t,n,r){return n&&n.handleEvent?("click"===t&&Object(Y.b)(n,"handleEvent",function(e){return function(t){return Fe("click",Le.bind(null,"dom"))(t),e.call(this,t)}}),"keypress"===t&&Object(Y.b)(n,"handleEvent",function(e){return function(t){return Be(Le.bind(null,"dom"))(t),e.call(this,t)}})):("click"===t&&Fe("click",Le.bind(null,"dom"),!0)(this),"keypress"===t&&Be(Le.bind(null,"dom"))(this)),e.call(this,t,n,r)}}),Object(Y.b)(t,"removeEventListener",function(e){return function(t,n,r){var i=n;try{i=i&&(i.__sentry_wrapped__||i)}catch(e){}return e.call(this,t,i,r)}}))})}();break;case"xhr":!function(){if(!("XMLHttpRequest"in Ce))return;var e=XMLHttpRequest.prototype;Object(Y.b)(e,"open",function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=t[1];return this.__sentry_xhr__={method:Object(j.k)(t[0])?t[0].toUpperCase():t[0],url:t[1]},Object(j.k)(r)&&"POST"===this.__sentry_xhr__.method&&r.match(/sentry_key/)&&(this.__sentry_own_request__=!0),e.apply(this,t)}}),Object(Y.b)(e,"send",function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=this,i={args:t,startTimestamp:Date.now(),xhr:r};function o(){if(4===r.readyState){try{r.__sentry_xhr__&&(r.__sentry_xhr__.status_code=r.status)}catch(e){}Le("xhr",h.a({},i,{endTimestamp:Date.now()}))}}return Le("xhr",h.a({},i)),"onreadystatechange"in r&&"function"==typeof r.onreadystatechange?Object(Y.b)(r,"onreadystatechange",function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return o(),e.apply(r,t)}}):r.onreadystatechange=o,e.apply(this,t)}})}();break;case"fetch":!function(){if(!function(){if(!G())return!1;var e=Object(P.g)();if(K(e.fetch))return!0;var t=!1,n=e.document;if(n){var r=n.createElement("iframe");r.hidden=!0;try{n.head.appendChild(r),r.contentWindow&&r.contentWindow.fetch&&(t=K(r.contentWindow.fetch)),n.head.removeChild(r)}catch(e){O.a.warn("Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ",e)}}return t}())return;Object(Y.b)(Ce,"fetch",function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r={args:t,fetchData:{method:function(e){void 0===e&&(e=[]);if("Request"in Ce&&Object(j.g)(e[0],Request)&&e[0].method)return String(e[0].method).toUpperCase();if(e[1]&&e[1].method)return String(e[1].method).toUpperCase();return"GET"}(t),url:function(e){void 0===e&&(e=[]);if("string"==typeof e[0])return e[0];if("Request"in Ce&&Object(j.g)(e[0],Request))return e[0].url;return String(e[0])}(t)},startTimestamp:Date.now()};return Le("fetch",h.a({},r)),e.apply(Ce,t).then(function(e){return Le("fetch",h.a({},r,{endTimestamp:Date.now(),response:e})),e},function(e){throw Le("fetch",h.a({},r,{endTimestamp:Date.now(),error:e})),e})}})}();break;case"history":!function(){if(e=Object(P.g)(),t=e.chrome,n=t&&t.app&&t.app.runtime,r="history"in e&&!!e.history.pushState&&!!e.history.replaceState,n||!r)return;var e,t,n,r;var i=Ce.onpopstate;function o(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=t.length>2?t[2]:void 0;if(r){var i=xe,o=String(r);xe=o,Le("history",{from:i,to:o})}return e.apply(this,t)}}Ce.onpopstate=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=Ce.location.href,r=xe;if(xe=n,Le("history",{from:r,to:n}),i)return i.apply(this,e)},Object(Y.b)(Ce.history,"pushState",o),Object(Y.b)(Ce.history,"replaceState",o)}();break;default:O.a.warn("unknown instrumentation type:",e)}}function De(e){e&&"string"==typeof e.type&&"function"==typeof e.callback&&(Ie[e.type]=Ie[e.type]||[],Ie[e.type].push(e.callback),Pe(e.type))}function Le(e,t){var n,r;if(e&&Ie[e])try{for(var i=h.e(Ie[e]||[]),o=i.next();!o.done;o=i.next()){var a=o.value;try{a(t)}catch(t){O.a.error("Error while triggering instrumentation handler.\nType: "+e+"\nName: "+Object(P.f)(a)+"\nError: "+t)}}}catch(e){n={error:e}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}}var Me,je,Ne=1e3,Re=0;function Fe(e,t,n){return void 0===n&&(n=!1),function(r){Me=void 0,r&&je!==r&&(je=r,Re&&clearTimeout(Re),n?Re=setTimeout(function(){t({event:r,name:e})}):t({event:r,name:e}))}}function Be(e){return function(t){var n;try{n=t.target}catch(e){return}var r=n&&n.tagName;r&&("INPUT"===r||"TEXTAREA"===r||n.isContentEditable)&&(Me||Fe("input",e)(t),clearTimeout(Me),Me=setTimeout(function(){Me=void 0},Ne))}}var Ue=function(){function e(t){this.name=e.id,this._options=h.a({console:!0,dom:!0,fetch:!0,history:!0,sentry:!0,xhr:!0},t)}return e.prototype._consoleBreadcrumb=function(e){var t={category:"console",data:{extra:{arguments:Object(Y.c)(e.args,3)},logger:"console"},level:l.fromString(e.level),message:Object(D.b)(e.args," ")};if("assert"===e.level){if(!1!==e.args[0])return;t.message="Assertion failed: "+(Object(D.b)(e.args.slice(1)," ")||"console.assert"),t.data.extra.arguments=Object(Y.c)(e.args.slice(1),3)}Object(d.b)().addBreadcrumb(t,{input:e.args,level:e.level})},e.prototype._domBreadcrumb=function(e){var t;try{t=e.event.target?Object(P.i)(e.event.target):Object(P.i)(e.event)}catch(e){t="<unknown>"}0!==t.length&&Object(d.b)().addBreadcrumb({category:"ui."+e.name,message:t},{event:event,name:e.name})},e.prototype._xhrBreadcrumb=function(e){if(e.endTimestamp){if(e.xhr.__sentry_own_request__)return;Object(d.b)().addBreadcrumb({category:"xhr",data:e.xhr.__sentry_xhr__,type:"http"},{xhr:e.xhr})}else e.xhr.__sentry_own_request__&&ze(e.args[0])},e.prototype._fetchBreadcrumb=function(e){if(e.endTimestamp){var t=Object(d.b)().getClient(),n=t&&t.getDsn();if(n){var r=new H(n).getStoreEndpoint();if(r&&-1!==e.fetchData.url.indexOf(r)&&"POST"===e.fetchData.method&&e.args[1]&&e.args[1].body)return void ze(e.args[1].body)}e.error?Object(d.b)().addBreadcrumb({category:"fetch",data:h.a({},e.fetchData,{status_code:e.response.status}),level:l.Error,type:"http"},{data:e.error,input:e.args}):Object(d.b)().addBreadcrumb({category:"fetch",data:h.a({},e.fetchData,{status_code:e.response.status}),type:"http"},{input:e.args,response:e.response})}},e.prototype._historyBreadcrumb=function(e){var t=Object(P.g)(),n=e.from,r=e.to,i=Object(P.l)(t.location.href),o=Object(P.l)(n),a=Object(P.l)(r);o.path||(o=i),i.protocol===a.protocol&&i.host===a.host&&(r=a.relative),i.protocol===o.protocol&&i.host===o.host&&(n=o.relative),Object(d.b)().addBreadcrumb({category:"navigation",data:{from:n,to:r}})},e.prototype.setupOnce=function(){var e=this;this._options.console&&De({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._consoleBreadcrumb.apply(e,h.d(t))},type:"console"}),this._options.dom&&De({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._domBreadcrumb.apply(e,h.d(t))},type:"dom"}),this._options.xhr&&De({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._xhrBreadcrumb.apply(e,h.d(t))},type:"xhr"}),this._options.fetch&&De({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._fetchBreadcrumb.apply(e,h.d(t))},type:"fetch"}),this._options.history&&De({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._historyBreadcrumb.apply(e,h.d(t))},type:"history"})},e.id="Breadcrumbs",e}();function ze(e){try{var t=JSON.parse(e);Object(d.b)().addBreadcrumb({category:"sentry",event_id:t.event_id,level:t.level||l.fromString("error"),message:Object(P.e)(t)},{event:t})}catch(e){O.a.error("Error while adding sentry type breadcrumb")}}var $e=function(){function e(){this._ignoreOnError=0,this.name=e.id}return e.prototype._wrapTimeFunction=function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=t[0];return t[0]=ke(r,{mechanism:{data:{function:Object(P.f)(e)},handled:!0,type:"instrument"}}),e.apply(this,t)}},e.prototype._wrapRAF=function(e){return function(t){return e(ke(t,{mechanism:{data:{function:"requestAnimationFrame",handler:Object(P.f)(e)},handled:!0,type:"instrument"}}))}},e.prototype._wrapEventTarget=function(e){var t=Object(P.g)(),n=t[e]&&t[e].prototype;n&&n.hasOwnProperty&&n.hasOwnProperty("addEventListener")&&(Object(Y.b)(n,"addEventListener",function(t){return function(n,r,i){try{"function"==typeof r.handleEvent&&(r.handleEvent=ke(r.handleEvent.bind(r),{mechanism:{data:{function:"handleEvent",handler:Object(P.f)(r),target:e},handled:!0,type:"instrument"}}))}catch(e){}return t.call(this,n,ke(r,{mechanism:{data:{function:"addEventListener",handler:Object(P.f)(r),target:e},handled:!0,type:"instrument"}}),i)}}),Object(Y.b)(n,"removeEventListener",function(e){return function(t,n,r){var i=n;try{i=i&&(i.__sentry_wrapped__||i)}catch(e){}return e.call(this,t,i,r)}}))},e.prototype._wrapXHR=function(e){return function(){for(var t=this,n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];return["onload","onerror","onprogress"].forEach(function(e){e in t&&"function"==typeof t[e]&&Object(Y.b)(t,e,function(t){return ke(t,{mechanism:{data:{function:e,handler:Object(P.f)(t)},handled:!0,type:"instrument"}})})}),"onreadystatechange"in this&&"function"==typeof this.onreadystatechange&&Object(Y.b)(this,"onreadystatechange",function(e){var t={mechanism:{data:{function:"onreadystatechange",handler:Object(P.f)(e)},handled:!0,type:"instrument"}};return e.__sentry_original__&&(t.mechanism.data.handler=Object(P.f)(e.__sentry_original__)),ke(e,t)}),e.apply(this,n)}},e.prototype.setupOnce=function(){this._ignoreOnError=this._ignoreOnError;var e=Object(P.g)();Object(Y.b)(e,"setTimeout",this._wrapTimeFunction.bind(this)),Object(Y.b)(e,"setInterval",this._wrapTimeFunction.bind(this)),Object(Y.b)(e,"requestAnimationFrame",this._wrapRAF.bind(this)),"XMLHttpRequest"in e&&Object(Y.b)(XMLHttpRequest.prototype,"send",this._wrapXHR.bind(this)),["EventTarget","Window","Node","ApplicationCache","AudioTrackList","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"].forEach(this._wrapEventTarget.bind(this))},e.id="TryCatch",e}(),Ve=Object(P.g)(),Ye=function(){function e(){this.name=e.id}return e.prototype.setupOnce=function(){Object(C.b)(function(t){if(Object(d.b)().getIntegration(e)){if(!Ve.navigator||!Ve.location)return t;var n=t.request||{};return n.url=n.url||Ve.location.href,n.headers=n.headers||{},n.headers["User-Agent"]=Ve.navigator.userAgent,h.a({},t,{request:n})}return t})},e.id="UserAgent",e}(),He=[new r.InboundFilters,new r.FunctionToString,new $e,new Ue,new Se,new Ae,new Ye];function qe(e){if(void 0===e&&(e={}),void 0===e.defaultIntegrations&&(e.defaultIntegrations=He),void 0===e.release){var t=Object(P.g)();t.SENTRY_RELEASE&&t.SENTRY_RELEASE.id&&(e.release=t.SENTRY_RELEASE.id)}!function(e,t){!0===t.debug&&O.a.enable(),Object(d.b)().bindClient(new e(t))}(be,e)}function We(e){void 0===e&&(e={}),e.eventId||(e.eventId=Object(d.b)().lastEventId());var t=Object(d.b)().getClient();t&&t.showReportDialog(e)}function Ge(){return Object(d.b)().lastEventId()}function Ke(){}function Qe(e){e()}function Ze(e){var t=Object(d.b)().getClient();return t?t.flush(e):N.a.reject(!1)}function Je(e){var t=Object(d.b)().getClient();return t?t.close(e):N.a.reject(!1)}function Xe(e){return ke(e)()}var et={},tt=Object(P.g)();tt.Sentry&&tt.Sentry.Integrations&&(et=tt.Sentry.Integrations);var nt=h.a({},et,r,i),rt=function(){function e(t){void 0===t&&(t={}),this.name=e.id,this._attachProps=!0,this._logErrors=!1,this._Vue=t.Vue||Object(P.g)().Vue,void 0!==t.logErrors&&(this._logErrors=t.logErrors),!1===t.attachProps&&(this._attachProps=!1)}return e.prototype._formatComponentName=function(e){if(e.$root===e)return"root instance";var t=e._isVue?e.$options.name||e.$options._componentTag:e.name;return(t?"component <"+t+">":"anonymous component")+(e._isVue&&e.$options.__file?" at "+e.$options.__file:"")},e.prototype.setupOnce=function(t,n){var r=this;if(this._Vue&&this._Vue.config){var i=this._Vue.config.errorHandler;this._Vue.config.errorHandler=function(t,o,a){var s={};Object(j.h)(o)&&(s.componentName=r._formatComponentName(o),r._attachProps&&(s.propsData=o.$options.propsData)),void 0!==a&&(s.lifecycleHook=a),n().getIntegration(e)&&setTimeout(function(){n().withScope(function(e){e.setContext("vue",s),n().captureException(t)})}),"function"==typeof i&&i.call(r._Vue,t,o,a),r._logErrors&&(r._Vue.util.warn("Error in "+a+': "'+t.toString()+'"',o),console.error(t))}}else O.a.error("VueIntegration is missing a Vue instance")},e.id="Vue",e}(),it=n(69),ot=n.n(it),at=n(275),st=n.n(at),ut=/d{1,4}|M{1,4}|YY(?:YY)?|S{1,3}|Do|ZZ|Z|([HhMsDm])\1?|[aA]|"[^"]*"|'[^']*'/g,ct="[^\\s]+",lt=/\[([^]*?)\]/gm;function ft(e,t){for(var n=[],r=0,i=e.length;r<i;r++)n.push(e[r].substr(0,t));return n}var ht=function(e){return function(t,n){var r=n[e].map(function(e){return e.toLowerCase()}).indexOf(t.toLowerCase());return r>-1?r:null}};function dt(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];for(var r=0,i=t;r<i.length;r++){var o=i[r];for(var a in o)e[a]=o[a]}return e}var pt=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],vt=["January","February","March","April","May","June","July","August","September","October","November","December"],mt=ft(vt,3),yt={dayNamesShort:ft(pt,3),dayNames:pt,monthNamesShort:mt,monthNames:vt,amPm:["am","pm"],DoFn:function(e){return e+["th","st","nd","rd"][e%10>3?0:(e-e%10!=10?1:0)*e%10]}},gt=dt({},yt),bt=function(e){return e.replace(/[|\\{()[^$+*?.-]/g,"\\$&")},wt=function(e,t){for(void 0===t&&(t=2),e=String(e);e.length<t;)e="0"+e;return e},_t={D:function(e){return String(e.getDate())},DD:function(e){return wt(e.getDate())},Do:function(e,t){return t.DoFn(e.getDate())},d:function(e){return String(e.getDay())},dd:function(e){return wt(e.getDay())},ddd:function(e,t){return t.dayNamesShort[e.getDay()]},dddd:function(e,t){return t.dayNames[e.getDay()]},M:function(e){return String(e.getMonth()+1)},MM:function(e){return wt(e.getMonth()+1)},MMM:function(e,t){return t.monthNamesShort[e.getMonth()]},MMMM:function(e,t){return t.monthNames[e.getMonth()]},YY:function(e){return wt(String(e.getFullYear()),4).substr(2)},YYYY:function(e){return wt(e.getFullYear(),4)},h:function(e){return String(e.getHours()%12||12)},hh:function(e){return wt(e.getHours()%12||12)},H:function(e){return String(e.getHours())},HH:function(e){return wt(e.getHours())},m:function(e){return String(e.getMinutes())},mm:function(e){return wt(e.getMinutes())},s:function(e){return String(e.getSeconds())},ss:function(e){return wt(e.getSeconds())},S:function(e){return String(Math.round(e.getMilliseconds()/100))},SS:function(e){return wt(Math.round(e.getMilliseconds()/10),2)},SSS:function(e){return wt(e.getMilliseconds(),3)},a:function(e,t){return e.getHours()<12?t.amPm[0]:t.amPm[1]},A:function(e,t){return e.getHours()<12?t.amPm[0].toUpperCase():t.amPm[1].toUpperCase()},ZZ:function(e){var t=e.getTimezoneOffset();return(t>0?"-":"+")+wt(100*Math.floor(Math.abs(t)/60)+Math.abs(t)%60,4)},Z:function(e){var t=e.getTimezoneOffset();return(t>0?"-":"+")+wt(Math.floor(Math.abs(t)/60),2)+":"+wt(Math.abs(t)%60,2)}},kt=function(e){return+e-1},xt=[null,"[1-9]\\d?"],Et=[null,ct],Tt=["isPm",ct,function(e,t){var n=e.toLowerCase();return n===t.amPm[0]?0:n===t.amPm[1]?1:null}],At=["timezoneOffset","[^\\s]*?[\\+\\-]\\d\\d:?\\d\\d|[^\\s]*?Z?",function(e){var t=(e+"").match(/([+-]|\d\d)/gi);if(t){var n=60*+t[1]+parseInt(t[2],10);return"+"===t[0]?n:-n}return 0}],St={D:["day","[1-9]\\d?"],DD:["day","\\d\\d"],Do:["day","[1-9]\\d?"+ct,function(e){return parseInt(e,10)}],M:["month","[1-9]\\d?",kt],MM:["month","\\d\\d",kt],YY:["year","\\d\\d",function(e){var t=+(""+(new Date).getFullYear()).substr(0,2);return+(""+(+e>68?t-1:t)+e)}],h:["hour","[1-9]\\d?",void 0,"isPm"],hh:["hour","\\d\\d",void 0,"isPm"],H:["hour","[1-9]\\d?"],HH:["hour","\\d\\d"],m:["minute","[1-9]\\d?"],mm:["minute","\\d\\d"],s:["second","[1-9]\\d?"],ss:["second","\\d\\d"],YYYY:["year","\\d{4}"],S:["millisecond","\\d",function(e){return 100*+e}],SS:["millisecond","\\d\\d",function(e){return 10*+e}],SSS:["millisecond","\\d{3}"],d:xt,dd:xt,ddd:Et,dddd:Et,MMM:["month",ct,ht("monthNamesShort")],MMMM:["month",ct,ht("monthNames")],a:Tt,A:Tt,ZZ:At,Z:At},Ct={default:"ddd MMM DD YYYY HH:mm:ss",shortDate:"M/D/YY",mediumDate:"MMM D, YYYY",longDate:"MMMM D, YYYY",fullDate:"dddd, MMMM D, YYYY",isoDate:"YYYY-MM-DD",isoDateTime:"YYYY-MM-DDTHH:mm:ssZ",shortTime:"HH:mm",mediumTime:"HH:mm:ss",longTime:"HH:mm:ss.SSS"};var It={format:function(e,t,n){if(void 0===t&&(t=Ct.default),void 0===n&&(n={}),"number"==typeof e&&(e=new Date(e)),"[object Date]"!==Object.prototype.toString.call(e)||isNaN(e.getTime()))throw new Error("Invalid Date pass to format");var r=[];t=(t=Ct[t]||t).replace(lt,function(e,t){return r.push(t),"@@@"});var i=dt(dt({},gt),n);return(t=t.replace(ut,function(t){return _t[t](e,i)})).replace(/@@@/g,function(){return r.shift()})},parse:function(e,t,n){if(void 0===n&&(n={}),"string"!=typeof t)throw new Error("Invalid format in fecha parse");if(t=Ct[t]||t,e.length>1e3)return null;var r={year:(new Date).getFullYear(),month:0,day:1,hour:0,minute:0,second:0,millisecond:0,isPm:null,timezoneOffset:null},i=[],o=[],a=t.replace(lt,function(e,t){return o.push(bt(t)),"@@@"}),s={},u={};a=bt(a).replace(ut,function(e){var t=St[e],n=t[0],r=t[1],o=t[3];if(s[n])throw new Error("Invalid format. "+n+" specified twice in format");return s[n]=!0,o&&(u[o]=!0),i.push(t),"("+r+")"}),Object.keys(u).forEach(function(e){if(!s[e])throw new Error("Invalid format. "+e+" is required in specified format")}),a=a.replace(/@@@/g,function(){return o.shift()});var c=e.match(new RegExp(a,"i"));if(!c)return null;for(var l=dt(dt({},gt),n),f=1;f<c.length;f++){var h=i[f-1],d=h[0],p=h[2],v=p?p(c[f],l):+c[f];if(null==v)return null;r[d]=v}1===r.isPm&&null!=r.hour&&12!=+r.hour?r.hour=+r.hour+12:0===r.isPm&&12==+r.hour&&(r.hour=0);for(var m=new Date(r.year,r.month,r.day,r.hour,r.minute,r.second,r.millisecond),y=[["month","getMonth"],["day","getDate"],["hour","getHours"],["minute","getMinutes"],["second","getSeconds"]],g=(f=0,y.length);f<g;f++)if(s[y[f][0]]&&r[y[f][0]]!==m[y[f][1]]())return null;return null==r.timezoneOffset?m:new Date(Date.UTC(r.year,r.month,r.day,r.hour,r.minute-r.timezoneOffset,r.second,r.millisecond))},defaultI18n:yt,setGlobalDateI18n:function(e){return gt=dt(gt,e)},setGlobalDateMasks:function(e){return dt(Ct,e)}},Ot=n(274),Pt=n.n(Ot),Dt=n(273),Lt=n.n(Dt),Mt=n(58),jt=n.n(Mt),Nt=n(84),Rt=n.n(Nt),Ft=function(e,t){return function(){for(var n="",r=t;r--;)n+=e[Math.random()*e.length|0];return n}},Bt=function(){for(var e="",t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:21;t--;)e+="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW"[64*Math.random()|0];return e},Ut=n(272),zt=n.n(Ut),$t=n(271),Vt=n.n($t),Yt=n(270),Ht=n.n(Yt),qt=n(269),Wt=n.n(qt),Gt=n(170),Kt=n(1),Qt=n.n(Kt),Zt=n(0),Jt=n.n(Zt),Xt=n(8),en=n.n(Xt),tn=n(4),nn=n.n(tn),rn=n(132),on=n.n(rn),an=n(2),sn=n.n(an),un=function(){function e(t){if(Qt()(this,e),!nn()(t))throw new TypeError('Invalid store "'.concat(t,'".'));this.analyticsGroup=null,this.analyticsPeriod=null,this.emitter=new en.a,this.store=t,this.timeout=null,this.onError=this.onError.bind(this),this.onTimeout=this.onTimeout.bind(this)}return Jt()(e,[{key:"cancelTimeout",value:function(){var e=this.timeout;if(!e)throw new Error("Timeout is not set.");clearTimeout(e),this.timeout=null}},{key:"closeGroup",value:function(e){var t=this;return new Promise(function(n){return n(t.store.update("analyticsGroup",e.id,{closed:(new Date).toISOString()}))})}},{key:"destroy",value:function(){clearTimeout(this.timeout)}},{key:"isStarted",value:function(){return!sn()(this.analyticsGroup)}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onError",value:function(e){this.emitter.emit("error",e)}},{key:"onTimeout",value:function(){try{this.timeout=null,this.restartIteration(this.analyticsPeriod).catch(this.onError)}catch(e){this.onError(e)}}},{key:"openGroup",value:function(){var e=this;return new Promise(function(t){return t(e.store.create("analyticsGroup",{opened:(new Date).toISOString()}))})}},{key:"restart",value:function(e){var t=this;return new Promise(function(n){if(!t.isStarted())throw new Error("Cycle is not in progress.");return t.cancelTimeout(),n(t.restartIteration(e))})}},{key:"restartIteration",value:function(e){var t=this;return new Promise(function(n){var r=t.analyticsGroup;return n(t.closeGroup(r).then(function(){return t.openGroup()}).then(function(n){t.analyticsGroup=n,t.analyticsPeriod=e,t.startTimeout(e),t.emitter.emit("ended",r)}))})}},{key:"start",value:function(e){var t=this;return new Promise(function(n){if(t.isStarted())throw new Error("Another cycle is in progress.");return n(t.openGroup().then(function(n){t.analyticsGroup=n,t.analyticsPeriod=e,t.startTimeout(e)}))})}},{key:"startTimeout",value:function(e){if(this.timeout)throw new Error("Timeout is already set.");if(!Number.isFinite(e))throw new TypeError('Invalid cycle period "'.concat(e,'".'));if(!(e>0&&e<2147483647))throw new RangeError('Cycle period "'.concat(e,'" is out of range.'));this.timeout=setTimeout(this.onTimeout,e)}},{key:"stop",value:function(){var e=this;return new Promise(function(t){if(!e.isStarted())throw new Error("Cycle is not in progress.");e.cancelTimeout();var n=e.analyticsGroup;return e.analyticsGroup=null,e.analyticsPeriod=null,t(e.closeGroup(n).then(function(){e.emitter.emit("ended",n)}))})}}]),e}(),cn=n(19),ln=n.n(cn),fn=n(7),hn=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"generateCounter",value:function(e){return Object.fromEntries(Object.entries({count:e.played,filename:e.name,id:e.mediumId,mimetype:e.type}).filter(function(e){var t=ln()(e,2),n=(t[0],t[1]);return!sn()(n)}))}},{key:"generateGroup",value:function(e,t,n){var r=this;return Object.fromEntries(Object.entries({deviceId:n,end:t.closed,media:e.map(function(e){return r.generateCounter(e)}),start:t.opened}).filter(function(e){var t=ln()(e,2),n=(t[0],t[1]);return!sn()(n)}))}},{key:"send",value:function(e,t,n,r){return fetch("".concat(r,"/api/device/").concat(n,"/analytics"),{body:JSON.stringify(this.generateGroup(e,t,n)),headers:{"Content-type":"application/json"},method:"POST"}).catch(function(e){throw e.level=fn.a.Warning,e}).then(function(e){if(!e.ok){var t=new RangeError('Invalid HTTP status "'.concat(e.status,'".'));throw t.level=fn.a.Warning,t}})}}]),e}(),dn=function(){function e(t,n,r){if(Qt()(this,e),!nn()(t))throw new TypeError('Invalid queue factory "'.concat(t,'".'));if(!nn()(n))throw new TypeError('Invalid session "'.concat(n,'".'));if(!nn()(r))throw new TypeError('Invalid store "'.concat(r,'".'));this.analyticsCycle=new un(r),this.analyticsTransport=new hn,this.emitter=new en.a,this.queue=t.create(),this.session=n,this.store=r,this.onCycleEnded=this.onCycleEnded.bind(this),this.onError=this.onError.bind(this),this.onTransportSuccess=this.onTransportSuccess.bind(this),this.analyticsCycle.on("ended",this.onCycleEnded),this.analyticsCycle.on("error",this.onError)}return Jt()(e,[{key:"destroy",value:function(){this.analyticsCycle.off("ended",this.onCycleEnded),this.analyticsCycle.destroy()}},{key:"incrementCounter",value:function(e){var t=this;return new Promise(function(n){var r=e.played+1;return n(t.store.update("analyticsCounter",e.id,{played:r}))})}},{key:"hit",value:function(e){var t=this;return new Promise(function(n){return n(t.queue.enqueue(function(){if(e.hasMedium()){var n=t.analyticsCycle;if(n.isStarted()){var r=n.analyticsGroup,i=r.id,o=e.getMedium(),a=o.id,s=t.store.filter("analyticsCounter").filter(function(e){return i===e.analyticsGroupId&&a===e.mediumId});switch(s.length){case 0:return t.openCounter(r,o);case 1:return t.incrementCounter(s[0]);default:throw new Error("Too many matching counters.")}}}}))})}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onCycleEnded",value:function(e){try{this.send(e).catch(this.onError)}catch(e){this.onError(e)}}},{key:"onError",value:function(e){this.emitter.emit("error",e)}},{key:"onTransportSuccess",value:function(e,t){try{this.remove(e,t).catch(this.onError)}catch(e){this.onError(e)}}},{key:"openCounter",value:function(e,t){var n=this;return new Promise(function(r){return r(n.store.create("analyticsCounter",{analyticsGroupId:e.id,mediumId:t.id,name:t.name,played:1,type:t.type}))})}},{key:"send",value:function(e){var t=this;return new Promise(function(n){var r,i=t.session,o=e.id,a=t.store.filter("analyticsCounter").filter(function(e){return o===e.analyticsGroupId});return a.length?t.analyticsTransport.send(a,e,i.deviceId,i.serverUrl).then(function(){return t.onTransportSuccess(a,e)}).catch(t.onError):r=t.remove(a,e),n(r)})}},{key:"remove",value:function(e,t){var n=this;return new Promise(function(r){var i=n.store;return r(i.destroyMany("analyticsCounter",e.map(function(e){return e.id})).then(function(){return i.destroy("analyticsGroup",t.id)}))})}},{key:"replace",value:function(){var e=this;return new Promise(function(t){var n,r=e.analyticsCycle.analyticsGroup,i=e.session.analyticsPeriod;return r?n=i?e.analyticsCycle.restart(i):e.analyticsCycle.stop():i&&(n=e.analyticsCycle.start(i)),t(n)})}},{key:"start",value:function(){var e=this;return new Promise(function(t){if(e.analyticsCycle.analyticsGroup)throw new Error("Another cycle is in progress.");var n=e.store;return t(n.findAll("analyticsCounter").then(function(){return n.findAll("analyticsGroup")}).then(function(t){return t.filter(function(e){return!e.closed}).reduce(function(t,n){return t.then(function(){return e.analyticsCycle.closeGroup(n)})},Promise.resolve()).then(function(){return on()(t,"opened").reduce(function(t,n){return t.then(function(){return e.send(n)})},Promise.resolve())})}).then(function(){var t,n=e.session.analyticsPeriod;return n&&(t=e.analyticsCycle.start(n)),t}))})}}]),e}(),pn="HTML",vn="IPK",mn="WGT",yn="ZIP",gn={KiwiLighter1:"KiwiLighter1",TizenSssp4:"TizenSssp4",Web:"Web",WebosSignage3_0:"WebosSignage3_0",WebosSignage3_2:"WebosSignage3_2"},bn={KiwiLighter1:"KiwiLighter1",TizenSssp4:"TizenSssp4",TizenSssp5:"TizenSssp5",TizenSssp6:"TizenSssp6",Web:"Web",WebosSignage3_0:"WebosSignage3_0",WebosSignage3_2:"WebosSignage3_2",WebosSignage4_0:"WebosSignage4_0",WebosSignage4_1:"WebosSignage4_1"},wn=function(){function e(){Qt()(this,e),this.updateUrl=location.href}return Jt()(e,[{key:"exit",value:function(){return new Promise(function(e){return location.href="about:blank",e()})}},{key:"finishUpdate",value:function(){var e=this;return new Promise(function(t){return location.href=e.updateUrl,t()})}},{key:"getBuildPlatform",value:function(){return Promise.resolve(bn.Web)}},{key:"getFormat",value:function(){return Promise.resolve(pn)}},{key:"getRuntimePlatform",value:function(){return Promise.resolve(bn.Web)}},{key:"getUpdatePlatform",value:function(){return Promise.resolve(gn.Web)}},{key:"getUpdateUrl",value:function(){var e=this;return new Promise(function(t){return t(e.updateUrl)})}},{key:"update",value:function(e){var t=this;return new Promise(function(n){return t.updateUrl=e,n()})}}]),e}(),_n=n(25),kn=n.n(_n),xn=n(12),En=n.n(xn),Tn=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"fromNumber",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.nil,r=t.required,i=void 0!==r&&r;if(sn()(e)){if(i)throw new TypeError('Missing number "'.concat(e,'".'));return n}if(!kn()(e))throw new TypeError('Invalid number "'.concat(e,'".'));return e}},{key:"fromString",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.nil,r=t.required,i=void 0!==r&&r;if(sn()(e)){if(i)throw new TypeError('Missing string "'.concat(e,'".'));return n}if(!En()(e))throw new TypeError('Invalid string "'.concat(e,'".'));var o=e.trim();return o.length?o.match(/b|e|o|x/i)?NaN:Number(o):n}}]),e}(),An=n(6),Sn=n.n(An),Cn=n(13),In=n.n(Cn),On=n(36),Pn=n.n(On),Dn=n(83),Ln=n.n(Dn),Mn=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"parseClock",value:function(e){var t=[{key:"second",max:60},{key:"minute",max:60},{key:"hour",max:24}],n=t.length;if(En()(e)){var r=e.split(":",n);r.length=n,r.reverse(),t.forEach(function(e,t,n){var i,o,a=Tn.fromString(r[t],{nil:null});if(Pn()(a)||!Number.isFinite(a))i=null,o=null;else{var s=a+Sn()(n[t-1],"overflow",0);i=Math.max(0,s-e.max+1),o=s%e.max}e.overflow=i,e.value=o})}else t.forEach(function(e){e.value=null});return t.reduce(function(e,t){return e[t.key]=t.value,e},{})}},{key:"parseBoolean",value:function(e){if(sn()(e))return null;if(!En()(e))throw new TypeError('Invalid boolean "'.concat(e,'".'));return"true"===e}},{key:"parseDate",value:function(e){var t;if(En()(e)||kn()(e)){var n=new Date(e);t=isNaN(n)?null:n.toISOString()}else t=null;return t}},{key:"parseDay",value:function(t){var n=e.parseNumber(t);return Pn()(n)||!Number.isFinite(n)?null:(t+1)%7}},{key:"parseMany",value:function(e,t,n){return In()(e)?e.reduce(function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];return Ln()(e,t.apply(void 0,r))},n):n}},{key:"parseNumber",value:function(e){if(sn()(e))return null;if(kn()(e))return Tn.fromNumber(e,{nil:null});if(En()(e))return Tn.fromString(e,{nil:null});throw new TypeError('Invalid value "'.concat(e,'".'))}},{key:"parseReference",value:function(e,t){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).nil;if(!nn()(e)||e.type!==t)return n;var r=e.id;return En()(r)||Number.isFinite(r)?r:n}},{key:"parseString",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.nil,r=t.required,i=void 0!==r&&r;if(sn()(e)){if(i)throw new TypeError('Missing string "'.concat(e,'".'));return n}if(!En()(e))throw new TypeError('Invalid string "'.concat(e,'".'));return e}},{key:"parseTime",value:function(t){var n=e.parseNumber(t);return Pn()(n)||!Number.isFinite(n)?null:Math.round(1e3*n)}},{key:"parseVolume",value:function(t){var n=e.parseNumber(t);return Pn()(n)||!Number.isFinite(n)?null:n/100}}]),e}(),jn=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"getTnterval",value:function(e){var t=e.get("autoreboot.interval"),n=Mn.parseNumber(t);return sn()(n)?null:60*n*60*1e3}},{key:"isDisabled",value:function(e){var t=e.get("autoreboot.disabled");return Mn.parseBoolean(t)}}]),e}(),Nn=function(){function e(t,n,r,i){Qt()(this,e),this.interval=null,this.logger=t,this.minInterval=n,this.onTimeout=this.onTimeout.bind(this),this.powerManager=r,this.timeout=null,this.timers=i}return Jt()(e,[{key:"getInterval",value:function(){return this.interval}},{key:"isStarted",value:function(){return!sn()(this.timeout)}},{key:"onTimeout",value:function(){var e=this;new Promise(function(t){return t(e.powerManager.reboot())}).catch(function(t){return e.logger.error(t)})}},{key:"start",value:function(e){if(this.isStarted())throw new Error("Autoreboot is already started.");var t=Math.max(this.minInterval,e);this.interval=e,this.timeout=this.timers.setTimeout(this.onTimeout,t)}},{key:"stop",value:function(){this.timers.clearTimeout(this.timeout),this.interval=null,this.timeout=null}}]),e}(),Rn=function(){function e(t,n,r){Qt()(this,e),this.defaultDisabled=t,this.defaultInterval=n,this.manager=r}return Jt()(e,[{key:"getInterval",value:function(e){return sn()(e)?this.defaultInterval:e}},{key:"isDisabled",value:function(e){return sn()(e)?this.defaultDisabled:e}},{key:"replace",value:function(e){var t=this;return new Promise(function(n){var r=t.manager,i=e.session;if(t.isDisabled(i.autorebootDisabled))return r.stop(),n();var o=t.getInterval(i.autorebootInterval);return r.isStarted()?o===r.getInterval()?n():(r.stop(),r.start(o),n()):(r.start(o),n())})}}]),e}(),Fn=function(){function e(){Qt()(this,e),this.fetching=!1}return Jt()(e,[{key:"fetch",value:function(e){function t(t,n){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(t,n){var r,i=this;return this.fetching?r=Promise.resolve(null):(this.fetching=!0,r=fetch("".concat(n,"/api/device/").concat(t,"/heartbeat"),{method:"POST"}).catch(function(e){throw e.level=fn.a.Warning,e}).then(function(e){if(!e.ok){var t=new RangeError('Invalid HTTP status "'.concat(e.status,'".'));throw t.level=fn.a.Warning,t}return e.json()}).then(function(t){return e.parse(t)}).finally(function(){i.fetching=!1})),r})}],[{key:"parse",value:function(t){return{contentTimestamp:Mn.parseDate(Sn()(t,"contentTimestamp")),queueIdArray:e.parseQueue(Sn()(t,"queues")),version:Mn.parseString(Sn()(t,"appVersion"),{nil:null})}}},{key:"parseQueue",value:function(e){return nn()(e)?Object.keys(e):[]}}]),e}(),Bn=n(131),Un=n.n(Bn),zn=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"parse",value:function(e){var t;switch(e){case"html":t=pn;break;case"ipk":t=vn;break;case"wgt":t=mn;break;case"zip":t=yn;break;default:t=null}return t}}]),e}(),$n=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"generate",value:function(e){switch(e){case gn.KiwiLighter1:return"kiwi-lighter-1";case gn.TizenSssp4:return"tizen-sssp-4";case gn.Web:return"web";case gn.WebosSignage3_0:return"webos-signage-3.0";case gn.WebosSignage3_2:return"webos-signage-3.2";default:return null}}},{key:"parse",value:function(e){switch(e){case"kiwi-lighter-1":return gn.KiwiLighter1;case"tizen-sssp-4":return gn.TizenSssp4;case"web":return gn.Web;case"webos-signage-3.0":return gn.WebosSignage3_0;case"webos-signage-3.2":return gn.WebosSignage3_2;default:return null}}}]),e}(),Vn=function(){function e(t){if(Qt()(this,e),arguments.length<1)throw new TypeError("Missing arguments.");this.url=t}return Jt()(e,[{key:"fetch",value:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(){var t=this.url;return fetch(t,{method:"GET"}).catch(function(e){throw e.level=fn.a.Warning,e}).then(function(e){if(!e.ok){var t=new RangeError('Invalid HTTP status "'.concat(e.status,'".'));throw t.level=fn.a.Warning,t}return e.json()}).then(function(n){return e.parse(n,t)})})}],[{key:"parse",value:function(t,n){if(arguments.length<2)throw new TypeError("Missing arguments.");var r=Sn()(t,"builds");return{buildArray:In()(r)?r.map(function(t){return e.parseBuild(t,n)}):[],version:Mn.parseString(Sn()(t,"appVersion"),{nil:null})}}},{key:"parseBuild",value:function(e,t){if(arguments.length<2)throw new TypeError("Missing arguments.");return{buildId:e.buildId,formatEnum:zn.parse(e.type),updatePlatform:$n.parse(e.platform),url:Un()(e.url).absoluteTo(t).toString()}}}]),e}(),Yn="POWER_OFF",Hn="POWER_ON",qn="REBOOT",Wn="REPORT",Gn=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"parse",value:function(e){var t;switch(e){case"info":t=Wn;break;case"restart":t=qn;break;case"shutdown":t=Yn;break;default:t=null}return t}}]),e}(),Kn=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"fetch",value:function(e){function t(t,n,r){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(t,n,r){if(!En()(t))throw new TypeError("Missing queueId.");return fetch("".concat(r,"/api/device/").concat(n,"/queue/").concat(t),{method:"POST"}).catch(function(e){throw e.level=fn.a.Warning,e}).then(function(e){if(!e.ok){var t=new RangeError('Invalid HTTP status "'.concat(e.status,'".'));throw t.level=fn.a.Warning,t}return e.json()}).then(function(t){return e.parse(t)})})}],[{key:"parse",value:function(e){return Gn.parse(Sn()(e,"command"))}}]),e}(),Qn=n(32),Zn=n.n(Qn),Jn=n(28),Xn=n.n(Jn),er=n(26),tr=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"generate",value:function(e){var t;switch(e){case er.a.CLOCKWISE_0:t=0;break;case er.a.CLOCKWISE_90:t=90;break;case er.a.CLOCKWISE_180:t=180;break;case er.a.CLOCKWISE_270:t=270;break;default:t=null}return t}},{key:"parse",value:function(e){var t;switch(e){case 0:t=er.a.CLOCKWISE_0;break;case 90:t=er.a.CLOCKWISE_90;break;case 180:t=er.a.CLOCKWISE_180;break;case 270:t=er.a.CLOCKWISE_270;break;default:t=null}return t}}]),e}(),nr={EXTERNAL:"EXTERNAL",INTERNAL:"INTERNAL"},rr=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"find",value:function(e){var t=[],n=[];switch(e.forEach(function(e){switch(e.driveEnum){case nr.EXTERNAL:t.push(e);break;case nr.INTERNAL:n.push(e);break;default:throw new RangeError('Unknown drive unit "'.concat(e,'".'))}}),n.length){case 0:return 1===t.length?t[0]:null;case 1:return n[0];default:return null}}}]),e}(),ir=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"generate",value:function(e){switch(e){case bn.KiwiLighter1:return"kiwi-lighter-1";case bn.TizenSssp4:return"tizen-sssp-4";case bn.TizenSssp5:return"tizen-sssp-5";case bn.TizenSssp6:return"tizen-sssp-6";case bn.Web:return"web";case bn.WebosSignage3_0:return"webos-signage-3.0";case bn.WebosSignage3_2:return"webos-signage-3.2";case bn.WebosSignage4_0:return"webos-signage-4.0";case bn.WebosSignage4_1:return"webos-signage-4.1";default:return null}}},{key:"parse",value:function(e){switch(e){case"kiwi-lighter-1":return bn.KiwiLighter1;case"tizen-sssp-4":return bn.TizenSssp4;case"tizen-sssp-5":return bn.TizenSssp5;case"tizen-sssp-6":return bn.TizenSssp6;case"web":return bn.Web;case"webos-signage-3.0":return bn.WebosSignage3_0;case"webos-signage-3.2":return bn.WebosSignage3_2;case"webos-signage-4.0":return bn.WebosSignage4_0;case"webos-signage-4.1":return bn.WebosSignage4_1;default:return null}}}]),e}(),or=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"fetch",value:function(e){function t(t,n,r){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(e,t,n){return fetch("".concat(n,"/api/device/").concat(t,"/status"),{body:JSON.stringify(this.filterReport(this.generateReport(e))),headers:{"Content-type":"application/json"},method:"POST"}).catch(function(e){throw e.level=fn.a.Warning,e}).then(function(e){if(!e.ok){var t=new RangeError('Invalid HTTP status "'.concat(e.status,'".'));throw t.level=fn.a.Warning,t}})})},{key:"filterReport",value:function(e){return Object.fromEntries(Object.entries(e).filter(function(e){var t=ln()(e,2),n=(t[0],t[1]);return!sn()(n)}))}},{key:"generateExternalDrives",value:function(e){var t=e.driveInfo;return sn()(t)?{}:t.driveUnitArray.filter(function(e){return e.driveEnum===nr.EXTERNAL}).reduce(function(e,t){var n,r=t.id;return Xn()({},e,(n={},Zn()(n,"totalExternal.".concat(r),t.total),Zn()(n,"usedExternal.".concat(r),t.used),n))},{})}},{key:"generateInternalDrive",value:function(e){var t=e.driveInfo;if(sn()(t))return{};var n=rr.find(t.driveUnitArray);return sn()(n)?{}:{totalInternal:n.total,usedInternal:n.used}}},{key:"generateReport",value:function(e){var t=e.localControlLock,n=e.remoteControlLock;return Xn()({},this.generateExternalDrives(e),this.generateInternalDrive(e),{bootTimestamp:e.bootTimestamp,brightness:e.brightness,buildId:e.buildId,contentTimestamp:e.contentTimestamp,controlLocalExceptionsPower:this.isControlPower(t),controlLocalLocked:this.isControlLocked(t),controlRemoteExceptionsPower:this.isControlPower(n),controlRemoteLocked:this.isControlLocked(n),firmwareVersion:e.firmwareVersion,image:e.image,localTimestamp:e.nowTimestamp,manufacturer:e.manufacturer,modelName:e.modelName,muted:e.muted,orientation:tr.generate(e.orientationEnum),runtimePlatform:ir.generate(e.runtimePlatform),serialNumber:e.serialNumber,temperature:e.temperature,timezone:e.timezone,totalRam:e.totalRam,updatePlatform:$n.generate(e.updatePlatform),updateUrl:e.updateUrl,usedRam:e.usedRam,version:e.version,volume:e.volume,wiredIpAddress:e.wiredIpAddress,wiredMacAddress:e.wiredMacAddress,wirelessIpAddress:e.wirelessIpAddress,wirelessMacAddress:e.wirelessMacAddress})}},{key:"isControlLocked",value:function(e){return Sn()(e,"locked",null)}},{key:"isControlPower",value:function(e){return!!Sn()(e,"exceptions.power")||null}}]),e}(),ar=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"fetch",value:function(e){function t(t,n){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(t,n){return fetch("".concat(n,"/api/device/").concat(t,"/update"),{method:"GET"}).catch(function(e){throw e.level=fn.a.Warning,e}).then(function(e){if(!e.ok){var t=new RangeError('Invalid HTTP status "'.concat(e.status,'".'));throw t.level=fn.a.Warning,t}return e.json()}).then(function(t){return e.parse(t)})})}],[{key:"parse",value:function(e){var t=Sn()(e,"urls");return{urlArray:In()(t)?t.map(function(e){return Mn.parseString(e,{nil:null})}):[],version:Mn.parseString(Sn()(e,"appVersion"),{nil:null})}}}]),e}(),sr=n(130),ur=n.n(sr),cr=n(129),lr=n.n(cr),fr=n(128),hr=n.n(fr),dr=n(50),pr=n(169),vr=n.n(pr),mr={name:"analyticsCounter",relations:{belongsTo:{analyticsGroup:{localField:"analyticsGroup",localKey:"analyticsGroupId"},medium:{localField:"medium",localKey:"mediumId"}}}},yr={name:"analyticsGroup"},gr={defaultAdapter:"binary",name:"asset"},br={name:"contentTask",methods:{toString:function(){return'ContentTask {id: "'.concat(this.id,'"}')}},relations:{belongsTo:{layout:{localField:"layout",localKey:"layoutId"},medium:{localField:"medium",localKey:"mediumId"},playlist:{localField:"playlist",localKey:"playlistId"}}}},wr={name:"exception"},_r={name:"layer",relations:{belongsTo:{layout:{localField:"parentLayout",localKey:"parentLayoutId"},medium:{localField:"medium",localKey:"mediumId"},playlist:{localField:"playlist",localKey:"playlistId"}}}},kr={name:"layout",relations:{belongsTo:{medium:{localField:"medium",localKey:"mediumId"}}}},xr={name:"medium",methods:{toString:function(){return'Medium {id: "'.concat(this.id,'"}')}},relations:{belongsTo:{asset:{localField:"asset",localKey:"assetId"}}}},Er={name:"playlist",methods:{toString:function(){return'Playlist {id: "'.concat(this.id,'"}')}}},Tr={name:"powerTask",methods:{toString:function(){return'PowerTask {id: "'.concat(this.id,'"}')}}},Ar={name:"session",methods:{isInstalled:function(){return!sn()(this.deviceId)&&!sn()(this.serverUrl)}}},Sr={name:"task",methods:{toString:function(){return'Task {id: "'.concat(this.id,'"}')}},relations:{belongsTo:{layout:{localField:"layout",localKey:"layoutId"},medium:{localField:"medium",localKey:"mediumId"},playlist:{localField:"playlist",localKey:"playlistId"}}}},Cr={name:"timer",relations:{belongsTo:{powerTask:{localField:"task",localKey:"taskId"}}}},Ir={name:"track",methods:{toString:function(){return"Track {index: ".concat(this.index,", parentPlaylist: ").concat(this.parentPlaylist,"}")}},relations:{belongsTo:{layout:{localField:"layout",localKey:"layoutId"},medium:{localField:"medium",localKey:"mediumId"},playlist:[{localField:"childPlaylist",localKey:"childPlaylistId"},{localField:"parentPlaylist",localKey:"parentPlaylistId"}]}}},Or=function(e){function t(e){var n;return Qt()(this,t),n=ur()(this,lr()(t).call(this,{allowSimpleWhere:!1,bypassCache:!0,defaultAdapter:"storage",instanceEvents:!1,watchChanges:!1})),nn()(e)&&Object.entries(e).forEach(function(e){var t=ln()(e,2),r=t[0],i=t[1];n.registerAdapter(r,i)}),n.defineResource(mr),n.defineResource(yr),n.defineResource(gr),n.defineResource(br),n.defineResource(wr),n.defineResource(_r),n.defineResource(kr),n.defineResource(xr),n.defineResource(Er),n.defineResource(Tr),n.defineResource(Ar),n.defineResource(Sr),n.defineResource(Cr),n.defineResource(Ir),n}return hr()(t,e),Jt()(t,[{key:"createMany",value:function(e,t,n){var r=this;return Promise.all(t.map(function(t){return r.create(e,t,n)}))}},{key:"destroyMany",value:function(e,t,n){var r=this;return Promise.all(t.map(function(t){return r.destroy(e,t,n)}))}},{key:"ejectMany",value:function(e,t,n){var r=this,i=this.definitions[e];if(!i)throw new dr.DSErrors.NER(e);if(!In()(t))throw new dr.DSErrors.IA("".concat(e,'.ejectMany: "idArray" must be an array!'));var o=t.map(function(t){return r.get(e,t)}).filter(function(e){return e});if(!o.length)return[];var a=i.idAttribute,s=dr.DSUtils._(i,n);s.notify&&i.emit("DS.beforeEject",i,o);var u=Xn()({},n,{notify:!1}),c=o.map(function(t){return r.eject(e,t[a],u)});return s.notify&&i.emit("DS.afterEject",i,o),c}},{key:"replace",value:function(e,t,n,r){var i=this.definitions[e];if(!i)throw new dr.DSErrors.NER(e);if(!In()(t))throw new dr.DSErrors.IA("".concat(e,'.replace: "attrs" must be an array!'));var o=i.idAttribute,a=this.filter(e,n,r),s=vr()(a,t,o);if(s.length){var u=s.map(function(e){return e[o]});this.ejectMany(e,u,r)}return t.length?this.inject(e,t,r):[]}},{key:"replaceAsync",value:function(e,t,n,r){var i=this,o=this.definitions[e];if(!o)throw new dr.DSErrors.NER(e);if(!In()(t))throw new dr.DSErrors.IA("".concat(e,'.replaceAsync: "attrs" must be an array!'));var a=o.idAttribute;return this.findAll(e,n,r).then(function(n){var o,s=vr()(n,t,a);if(s.length){var u=s.map(function(e){return e[a]});o=i.destroyMany(e,u,r)}return o}).then(function(){return t.length?i.createMany(e,t,r):[]})}}]),t}(dr.DS),Pr=n(11),Dr=function(){function e(t){Qt()(this,e),this.CommunicatorManifest=Vn,this.communicatorHeartbeat=new Fn,this.communicatorQueue=new Kn,this.communicatorReport=new or,this.communicatorUpdate=new ar,this.connected=!1,this.contentCommunicator=t,this.emitter=new en.a,this.latestTimestamp=null,this.syncDelayBase=Pr.a.device.communicator.syncDelayBase,this.syncInterval=null,this.onError=this.onError.bind(this)}return Jt()(e,[{key:"connect",value:function(e,t,n){var r=this;return new Promise(function(i){if(r.connected)throw new Error("Already connected.");return r.connected=!0,r.latestTimestamp=n,r.syncInterval=setInterval(function(){return r.onSyncInterval(e,t)},r.syncDelayBase),i(r.fetchHeartbeat(e,t).catch(r.onError))})}},{key:"destroy",value:function(){clearInterval(this.syncInterval),this.syncInterval=null}},{key:"fetchCommand",value:function(e,t,n){var r=this;return new Promise(function(i){if(sn()(n)||0===n.length)return i();var o=n[0];return i(r.communicatorQueue.fetch(o,t,e))})}},{key:"fetchContent",value:function(t,n,r){var i=this;return new Promise(function(o){if(!e.isBefore(r,i.latestTimestamp))return o();var a=new Or;return o(i.contentCommunicator.fetch(a,r,n,t).then(function(t){if(nn()(t)){var n=t.session.contentTimestamp;if(e.isBefore(n,i.latestTimestamp))return i.latestTimestamp=n,t}}))})}},{key:"fetchHeartbeat",value:function(e,t){var n=this;return this.communicatorHeartbeat.fetch(t,e).then(function(e){nn()(e)&&n.emitter.emit("heartbeatFetched",e)})}},{key:"onError",value:function(e){this.emitter.emit("error",e)}},{key:"off",value:function(e,t){this.emitter.off(e,t)}},{key:"on",value:function(e,t){this.emitter.on(e,t)}},{key:"onSyncInterval",value:function(e,t){this.fetchHeartbeat(e,t).catch(this.onError)}},{key:"report",value:function(e,t,n){return this.communicatorReport.fetch(n,t,e)}},{key:"update",value:function(e,t,n,r){var i=this;return new Promise(function(o){if(!n)throw new TypeError("Invalid formatEnum.");if(!r)throw new TypeError("Invalid updatePlatform.");return o(i.communicatorUpdate.fetch(t,e).then(function(e){var t=e.urlArray;if(!e.version)return Promise.resolve();if(!t.length)throw new Error("No version manifest available.");return t.reduce(function(e,t){return e.catch(function(){return new i.CommunicatorManifest(t).fetch().then(function(e){var t=e.buildArray.filter(function(e){return e.formatEnum===n&&e.updatePlatform===r});if(!t.length){var i=new Error("No matching build found.");throw i.level=fn.a.Warning,i}var o=ln()(t,1)[0];return Promise.resolve({buildId:o.buildId,url:o.url,version:e.version})}).catch(function(e){throw i.onError(e),e})})},Promise.reject()).catch(function(){var e=new Error("No version manifest satisfied requirements.");throw e.level=fn.a.Warning,e})}))})}}],[{key:"isBefore",value:function(e,t){var n,r=new Date(e);if(isNaN(r)||Pn()(e))n=!1;else{var i=new Date(t);n=!(!isNaN(i)&&!Pn()(t))||r>i}return n}}]),e}(),Lr=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"parseExceptions",value:function(e){return e?{power:e}:null}},{key:"parseLocalLock",value:function(e){return this.parseLock(e.get("control.local.locked"),e.get("control.local.exceptions.power"))}},{key:"parseLock",value:function(e,t){var n=Mn.parseBoolean(e),r=Mn.parseBoolean(t),i=this.parseLocked(n,r),o=this.parseExceptions(r);return sn()(i)?null:sn()(o)?{locked:i}:{exceptions:o,locked:i}}},{key:"parseLocked",value:function(e,t){return sn()(e)&&sn()(t)?null:!sn()(e)&&e}},{key:"parseRemoteLock",value:function(e){return this.parseLock(e.get("control.remote.locked"),e.get("control.remote.exceptions.power"))}}]),e}(),Mr=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"parse",value:function(e){return nn()(e)&&"server"===e.type&&e.frequency>0?1e3*e.frequency:null}}]),e}(),jr={CONTAIN:"CONTAIN",COVER:"COVER",FILL:"FILL"},Nr=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"parse",value:function(e){var t;switch(e){case"fill":t=jr.FILL;break;case"uniform":t=jr.CONTAIN;break;case"uniformToFill":t=jr.COVER;break;default:t=null}return t}}]),e}(),Rr=function(){function e(t,n,r){Qt()(this,e),this.communicatorAutoreboot=t,this.communicatorControl=n,this.session=r}return Jt()(e,[{key:"parse",value:function(e,t,n){var r=Sn()(t,"main"),i=Sn()(r,"module.media[0]"),o=Sn()(r,"visualController"),a=this.communicatorAutoreboot,s=this.communicatorControl;return n.inject("session",{analyticsPeriod:Mr.parse(Sn()(i,"log")),autorebootDisabled:a.isDisabled(e),autorebootInterval:a.getTnterval(e),contentTimestamp:Mn.parseDate(Sn()(r,"info.updateTimestamp")),id:this.session.id,localControlLock:s.parseLocalLock(e),orientationEnum:tr.parse(Sn()(o,"screen[0].orientation")),remoteControlLock:s.parseRemoteLock(e),stretchEnum:Nr.parse(Sn()(i,"stretching")),volume:Mn.parseVolume(Sn()(o,"volume"))})}}]),e}(),Fr=n(82),Br=n.n(Fr),Ur=function(){function e(t){if(Qt()(this,e),!sn()(t)&&!nn()(t))throw new TypeError('Invalid json "'.concat(t,'".'));this.json=t}return Jt()(e,[{key:"get",value:function(e){if(!En()(e))throw new TypeError('Invalid key "'.concat(e,'".'));var t=this.json;if(!Br()(t,e))return null;var n=t[e];if(sn()(n))return null;if(!En()(n))throw new TypeError('Invalid value "'.concat(n,'" for "').concat(e,'".'));return n}}]),e}(),zr=function(){function e(t){Qt()(this,e),this.CommunicatorSettings=t}return Jt()(e,[{key:"create",value:function(e){return new this.CommunicatorSettings(e)}}]),e}(),$r=function(){function e(t,n){Qt()(this,e),this.console=t,this.errorLevelFactory=n}return Jt()(e,[{key:"capture",value:function(e,t){var n=this.console,r=this.errorLevelFactory.fromValue(t)||e;switch(r){case fn.a.Debug:return n.debug(t);case fn.a.Error:return n.error(t);case fn.a.Info:return n.info(t);case fn.a.Log:return n.log(t);case fn.a.Warning:return n.warn(t);default:throw new RangeError('Unknown level "'.concat(r,'".'))}}},{key:"debug",value:function(e){return this.capture(fn.a.Debug,e)}},{key:"error",value:function(e){return this.capture(fn.a.Error,e)}},{key:"info",value:function(e){return this.console.info(e)}},{key:"log",value:function(e){return this.capture(fn.a.Log,e)}},{key:"setInfo",value:function(e){}},{key:"warn",value:function(e){return this.capture(fn.a.Warning,e)}}]),e}(),Vr=function(){function e(t,n,r){Qt()(this,e),this.ConsoleLogger=t,this.console=n,this.errorLevelFactory=r}return Jt()(e,[{key:"create",value:function(){return new this.ConsoleLogger(this.console,this.errorLevelFactory)}}]),e}(),Yr=n(16),Hr=n.n(Yr),qr=function(){function e(t){Qt()(this,e),this.config=t}return Jt()(e,[{key:"parse",value:function(e,t){var n=t.manufacturer,r=t.modelName,i=t.version;if(sn()(n)||sn()(r)||sn()(i))return null;if(Mn.parseBoolean(e.get("firmware.disabled")))return null;var o="firmware.".concat(n,".").concat(r),a=Mn.parseString(e.get("".concat(o,".url")),{nil:null});if(sn()(a))return null;var s=Mn.parseString(e.get("".concat(o,".version")),{nil:null});return sn()(s)||s===i?null:{manufacturer:n,modelName:r,size:this.config.firmware.defaultSize,url:a,version:s}}}]),e}(),Wr=n(49),Gr=n.n(Wr),Kr=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"generateId",value:function(e,t){if(sn()(e))throw new TypeError("Missing parent layout id.");if(sn()(t))throw new TypeError("Missing layer index.");return Gr()({index:t,parentLayoutId:e})}},{key:"parse",value:function(e,t,n,r){return e.inject("layer",{height:this.parsePercentage(t.height),id:this.generateId(n,r),index:r,left:this.parsePercentage(t.posX),mediumId:Mn.parseReference(t.ref,"media",{nil:null}),parentLayoutId:n,playlistId:Mn.parseReference(t.ref,"playlist",{nil:null}),top:this.parsePercentage(t.posY),width:this.parsePercentage(t.width),zIndex:t.posZ})}},{key:"parsePercentage",value:function(e){var t=Tn.fromString(e,{nil:null});return"".concat(t,"%")}}]),e}(),Qr=function(){function e(t){Qt()(this,e),this.communicatorLayer=t}return Jt()(e,[{key:"parse",value:function(e,t){return e.inject("layout",{backgroundColor:t.bgColor,id:t.id,mediumId:Mn.parseReference(t.bgImage.ref,"media",{nil:null}),name:t.name,playDuration:Mn.parseTime(Sn()(t,"playLength.timeLength"))})}},{key:"parseLayers",value:function(e,t){var n=this;return t.items.map(function(r,i){return n.communicatorLayer.parse(e,r,t.id,i)})}}]),e}(),Zr=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"parseMany",value:function(t){return Mn.parseMany(t,e.parseOne,{medium:{}})}},{key:"parseModel",value:function(t,n){return{assetId:null,checksum:Mn.parseString(t.md5,{nil:null}),id:n,name:Mn.parseString(t.name,{nil:null}),params:e.parseParams(t.params),playDuration:Mn.parseTime(t.playLength.timeLength),stretchEnum:Nr.parse(t.stretching),type:t.type,url:t.url,volume:Mn.parseVolume(t.volume)}}},{key:"parseParams",value:function(e){return nn()(e)?Object.fromEntries(Object.entries(e).reduce(function(e,t){var n=ln()(t,2),r=n[0],i=n[1];return En()(i)?e.push([r,decodeURIComponent(i)]):nn()(i)||e.push([r,i]),e},[])):null}},{key:"parseOne",value:function(t){var n,r=t.id;if(sn()(r))n={medium:{}};else{var i=e.parseModel(t,r);n={medium:Zn()({},r,i)}}return n}}]),e}(),Jr=function(){function e(t,n,r,i,o,a,s,u){Qt()(this,e);var c=new Kr;this.communicatorFirmware=new qr(r),this.communicatorLayer=c,this.communicatorLayout=new Qr(c),this.communicatorSession=t,this.communicatorSettingsFactory=n,this.contentTaskCommunicator=i,this.fetching=!1,this.firmwareManager=o,this.latestTimestamp=null,this.playlistCommunicator=a,this.powerTaskCommunicator=s,this.taskCommunicator=u}return Jt()(e,[{key:"fetch",value:function(e){function t(t,n,r,i){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(t,n,r,i){var o=this;return e.compareRequired(n,this.latestTimestamp)&&(this.latestTimestamp=n),this.fetching?Promise.resolve(null):(this.fetching=!0,fetch("".concat(i,"/device/generator/").concat(r,"/3")).catch(function(e){throw e.level=fn.a.Warning,e}).then(function(e){if(!e.ok){var t=new RangeError('Invalid HTTP status "'.concat(e.status,'".'));throw t.level=fn.a.Warning,t}return e.json()}).then(function(n){return o.firmwareManager.getInfo().then(function(r){var i=o.parse(t,n,r),a=i.session.contentTimestamp;return e.compareReceived(a,o.latestTimestamp)?i:null})}).finally(function(){o.fetching=!1}))})},{key:"parse",value:function(e,t,n){var r,i,o,a=this,s=this.communicatorSettingsFactory.create(Sn()(t,"main.module.media[0].settings")),u=(null!=(r=Sn()(t,"main.commonContent.task"))?r:[]).map(function(t){return a.contentTaskCommunicator.parse(t,e)}),c=(null!=(i=Sn()(t,"main.module.task"))?i:[]).reduce(function(t,n){var r,i=a.powerTaskCommunicator.parse(n,e);return t.powerTasks.push(i.powerTask),(r=t.timerArray).push.apply(r,Hr()(i.timerArray)),t},{powerTasks:[],timerArray:[]}),l=c.powerTasks,f=c.timerArray,h=this.taskCommunicator.parse(u,l,e),d=Zr.parseMany(Sn()(t,"main.commonContent.medium")),p=this.playlistCommunicator.parseMany(Sn()(t,"main.commonContent.playlist")),v=(null!=(o=Sn()(t,"main.commonContent.layout"))?o:[]).reduce(function(t,n){var r,i=a.communicatorLayout.parse(e,n);"mainLayout"!==i.id&&(t.layoutArray.push(i),(r=t.layerArray).push.apply(r,Hr()(a.communicatorLayout.parseLayers(e,n))));return t},{layerArray:[],layoutArray:[]}),m=v.layerArray,y=v.layoutArray;return{contentTasks:u,firmwareRelease:this.communicatorFirmware.parse(s,n),layerArray:m,layoutArray:y,mediumArray:e.inject("medium",Object.values(d.medium)),playlistArray:e.inject("playlist",Object.values(p.playlist)),powerTasks:l,session:this.communicatorSession.parse(s,t,e),store:e,taskArray:h,timerArray:f,trackArray:e.inject("track",Object.values(p.track))}}}],[{key:"compareReceived",value:function(e,t){var n=new Date(e),r=!Pn()(e)&&!isNaN(n),i=new Date(t),o=!Pn()(t)&&!isNaN(i);return r&&(!o||!(n<i))}},{key:"compareRequired",value:function(e,t){var n=new Date(e),r=!Pn()(e)&&!isNaN(n),i=new Date(t),o=!Pn()(t)&&!isNaN(i);return r&&(!o||n>i)}}]),e}(),Xr={Day:"day",Week:"week",Month:"month",Year:"year"},ei=function(){function e(t,n,r,i){Qt()(this,e),this.dateFormat="%Y-%m-%dT%H:%i:%s",this.dhtmlxDateParser=t,this.dhtmlxRecTypeUtil=n,this.dhtmlxToIcalExporter=r,this.infinityEndDate="9999-02-01T00:00:00",this.uidGenerator=i}return Jt()(e,[{key:"generateUid",value:function(e){return this.uidGenerator.generate(e.id)}},{key:"parse",value:function(e,t){var n=e.id,r=e.ref;return t.inject("contentTask",{id:n,layoutId:Mn.parseReference(r,"layout"),mediumId:Mn.parseReference(r,"media"),planIcal:this.parseIcal(n,e),playlistId:Mn.parseReference(r,"playlist"),priority:Tn.fromNumber(e.priority,{required:!0}),target:Mn.parseString(e.target,{required:!0})})}},{key:"parseDhtmlxEvent",value:function(e,t,n){var r=n.endIteration,i=n.endTime,o=n.rec_type,a=n.repeat,s=n.startTime;if(!En()(i)||0===i.length)throw new TypeError('Invalid end time "'.concat(i,'".'));if(!En()(s)||0===s.length)throw new TypeError('Invalid start time "'.concat(s,'".'));if(En()(o)&&0!==o.length){if(!En()(r)||0===r.length)throw new TypeError('Invalid iteration end time "'.concat(r,'".'));return this.parseRecurringEvent(e,r,i,t,o,s)}if(En()(a)&&0!==a.length){if(!En()(r)||0===r.length)throw new TypeError('Invalid iteration end time "'.concat(r,'".'));return this.parseLegacyRecurringEvent(e,r,i,t,a,s)}return this.parseOneTimeEvent(i,t,s)}},{key:"parseEventId",value:function(e){return String(e)}},{key:"parseEventLength",value:function(e,t){var n=e.getTime()-t.getTime();if(!Number.isFinite(n))throw new TypeError('Invalid event length "'.concat(n,'".'));var r=Math.floor(n/1e3);return String(r)}},{key:"parseIcal",value:function(e,t){var n=this,r=this.dateFormat,i=[this.parseDhtmlxEvent(r,e,t)],o=this.dhtmlxToIcalExporter.export(i,{dateFormat:r,generateUid:function(){return n.generateUid.apply(n,arguments)}});if(sn()(o))throw new Error('Unable to crate iCalendar from "'.concat(e,'".'));return o}},{key:"parseLegacyRecType",value:function(e,t){var n=this.dhtmlxRecTypeUtil;switch(e){case"Daily":return n.stringify({type:Xr.Day});case"Monthly":return n.stringify({type:Xr.Month});case"Weekdays":return n.stringify({days:[1,2,3,4,5],type:Xr.Week});case"Weekly":return n.stringify({days:[t.getDay()],type:Xr.Week});default:throw new RangeError('Unknown repeat "'.concat(e,'".'))}}},{key:"parseLegacyRecurringEvent",value:function(e,t,n,r,i,o){var a=this.dhtmlxDateParser,s=a.parse(n,e),u=a.parse(o,e);return{end_date:t,event_length:this.parseEventLength(s,u),event_pid:"",id:this.parseEventId(r),rec_type:this.parseLegacyRecType(i,u).toString(),start_date:o,text:""}}},{key:"parseOneTimeEvent",value:function(e,t,n){return{end_date:e,event_length:"",event_pid:"",id:this.parseEventId(t),rec_type:"",start_date:n,text:""}}},{key:"parseRecurringEvent",value:function(e,t,n,r,i,o){var a=this.dhtmlxDateParser,s=a.parse(n,e),u=a.parse(o,e);return{end_date:this.parseRecurringEndDate(t,i),event_length:this.parseEventLength(s,u),event_pid:"",id:this.parseEventId(r),rec_type:i,start_date:o,text:""}}},{key:"parseRecurringEndDate",value:function(e,t){return this.dhtmlxRecTypeUtil.parse(t).infinite?this.infinityEndDate:e}}]),e}(),ti=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"compare",value:function(e,t){var n=this.comparePriority(e.priority,t.priority);return 0!==n?n:this.compareId(e.id,t.id)}},{key:"compareId",value:function(e,t){var n=kn()(e),r=kn()(t);return n?!r||e>t?1:e<t?-1:0:r?-1:e>t?1:e<t?-1:0}},{key:"comparePriority",value:function(e,t){return e>t?1:e<t?-1:0}}]),e}(),ni=function(){function e(t,n,r,i){Qt()(this,e),this.contentTasks=n.filter(function(e){return"display1.primary"===e.target&&[e.layout,e.medium,e.playlist].some(function(e){return!sn()(e)})}).sort(function(e,n){return-1*t.compare(e,n)}),this.emitter=new en.a,this.iterator=null,this.iteratorFactory=r,this.iteratorResult=null,this.timeout=null,this.timers=i}return Jt()(e,[{key:"getCurrentTask",value:function(){var e=this.iteratorResult;if(sn()(e))throw new Error("CRON is not started.");if(e.done)return null;var t=e.value,n=Date.now();return t.startDate.getTime()-n>0?null:t.contentTask}},{key:"off",value:function(e,t){var n=this.emitter;n.off(e,t),"taskChanged"===e&&0===n.listenerCount("taskChanged")&&this.stop()}},{key:"on",value:function(e,t){var n=this.emitter;"taskChanged"===e&&0===n.listenerCount("taskChanged")&&this.start(),n.on(e,t)}},{key:"onPlanEnd",value:function(e){var t=this,n=Date.now(),r=this.iterator.next();if(this.iteratorResult=r,r.done)return this.timeout=null,void this.emitter.emit("taskChanged",null);var i=r.value,o=i.startDate.getTime(),a=i.contentTask,s=this.timers;if(e.endDate.getTime()===o){var u=i.endDate.getTime()-n;return this.timeout=s.setTimeout(function(){return t.onPlanEnd(i)},u),void(e.contentTask!==a&&this.emitter.emit("taskChanged",a))}var c=o-n;this.timeout=s.setTimeout(function(){return t.onPlanStart(i)},c),this.emitter.emit("taskChanged",null)}},{key:"onPlanStart",value:function(e){var t=this,n=Date.now(),r=e.endDate.getTime()-n;this.timeout=this.timers.setTimeout(function(){return t.onPlanEnd(e)},r),this.emitter.emit("taskChanged",e.contentTask)}},{key:"start",value:function(){var e=this;if([this.iterator,this.iteratorResult,this.timeout].some(function(e){return!sn()(e)}))throw new Error("CRON has already started.");var t=new Date,n=t.getTime(),r=this.iteratorFactory.create(t,this.contentTasks);this.iterator=r;var i=r.next();if(this.iteratorResult=i,!i.done){var o=i.value,a=o.startDate.getTime()-n,s=this.timers;if(a>0)this.timeout=s.setTimeout(function(){return e.onPlanStart(o)},a);else{var u=o.endDate.getTime()-n;this.timeout=s.setTimeout(function(){return e.onPlanEnd(o)},u)}}}},{key:"stop",value:function(){this.timers.clearTimeout(this.timeout),this.iterator=null,this.iteratorResult=null,this.timeout=null}}]),e}(),ri=function(){function e(t,n,r,i){Qt()(this,e),this.ContentTaskPlanCron=t,this.comparator=n,this.iteratorFactory=r,this.timers=i}return Jt()(e,[{key:"create",value:function(e){return new this.ContentTaskPlanCron(this.comparator,e,this.iteratorFactory,this.timers)}}]),e}(),ii=function(){function e(t,n,r,i,o,a){Qt()(this,e),this.ICAL=t,this.contentTasks=r,this.currentDate=t.Time.fromJSDate(n),this.expander=i,this.maxInterval=o,this.timeUtil=a}return Jt()(e,[{key:"findCurrentOccurrence",value:function(e,t){var n=this.timeUtil.adjust(t,{seconds:this.maxInterval}),r=null;return this.expander.expand(e,{startDate:t,endDate:n}).find(function(e){return!!(sn()(r)||e.startDate.toUnixTime()<r.startDate.toUnixTime())&&(r=e,e.startDate.toUnixTime()<=t.toUnixTime())}),r}},{key:"findCurrentPlan",value:function(e,t){var n=this,r=null;return t.find(function(t){var i=t.planIcal,o=n.ICAL.Component.fromString(i),a=n.findCurrentOccurrence(o,e);return!sn()(a)&&(!(!sn()(r)&&a.startDate.toUnixTime()>r.occurrence.startDate.toUnixTime())&&(r={contentTask:t,occurrence:a},a.startDate.toUnixTime()<=e.toUnixTime()))}),r}},{key:"findNextOccurrence",value:function(e,t,n){var r=this.timeUtil,i=r.max(n.startDate,t),o=r.adjust(i,{seconds:this.maxInterval}),a=r.min(n.endDate,o),s=null;return this.expander.expand(e,{startDate:i,endDate:a}).find(function(e){return e.item.uid===n.item.uid||!!(sn()(s)||e.startDate.toUnixTime()<s.startDate.toUnixTime())&&(s=e,!1)}),s}},{key:"findNextPlan",value:function(e,t,n){var r=this;return n.reduce(function(n,i){var o=i.planIcal,a=r.ICAL.Component.fromString(o),s=r.findNextOccurrence(a,e,t.occurrence);return sn()(s)?n:!sn()(n)&&s.startDate.toUnixTime()>n.occurrence.startDate.toUnixTime()?n:{contentTask:i,occurrence:s}},null)}},{key:"findPreviousOccurrence",value:function(e,t,n){var r=this.timeUtil,i=r.adjust(t,{seconds:-1*this.maxInterval}),o=r.max(n.startDate,i),a=null;return this.expander.expand(e,{startDate:o,endDate:t}).find(function(e){return e.item.uid===n.item.uid||!!(sn()(a)||e.endDate.toUnixTime()>a.endDate.toUnixTime())&&(a=e,!1)}),a}},{key:"findPreviousPlan",value:function(e,t,n){var r=this;return n.reduce(function(n,i){var o=i.planIcal,a=r.ICAL.Component.fromString(o),s=r.findPreviousOccurrence(a,e,t.occurrence);return sn()(s)?n:!sn()(n)&&s.endDate.toUnixTime()<n.occurrence.endDate.toUnixTime()?n:{contentTask:i,occurrence:s}},null)}},{key:"getEndDate",value:function(e,t){return sn()(t)?e.occurrence.endDate:t.occurrence.startDate}},{key:"getStartDate",value:function(e,t){return sn()(t)?e.occurrence.startDate:t.occurrence.endDate}},{key:"next",value:function(){var e=this.currentDate,t=this.contentTasks,n=this.findCurrentPlan(e,t);if(sn()(n))return{done:!0};var r=n.contentTask,i=t.indexOf(r);if(-1===i)throw new Error("Unknown current task.");var o=t.slice(0,i+1),a=this.findPreviousPlan(e,n,o),s=this.findNextPlan(e,n,o),u=this.getEndDate(n,s),c=this.getStartDate(n,a);return this.currentDate=u,{done:!1,value:{contentTask:r,endDate:u.toJSDate(),startDate:c.toJSDate()}}}}]),e}(),oi=function(){function e(t,n,r,i,o){Qt()(this,e),this.ContentTaskPlanIterator=t,this.ICAL=n,this.expander=r,this.maxInterval=i,this.timeUtil=o}return Jt()(e,[{key:"create",value:function(e,t){return new this.ContentTaskPlanIterator(this.ICAL,e,t,this.expander,this.maxInterval,this.timeUtil)}}]),e}(),ai=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"generate",value:function(e){return"ContentTaskPlan-".concat(String(e))}}]),e}(),si=function(){function e(t,n){Qt()(this,e),this.primaryStore=t,this.taskConverter=n}return Jt()(e,[{key:"replace",value:function(e){var t=this;return new Promise(function(n){return n(t.primaryStore.replaceAsync("contentTask",JSON.parse(JSON.stringify(e.contentTasks)),null,{onConflict:"replace"}))})}},{key:"restore",value:function(e){var t=this;return new Promise(function(n){return n(t.primaryStore.findAll("contentTask").then(function(n){return n.length?n:e.reduce(function(e,n){var r=t.taskConverter.convert(t.primaryStore,n);return sn()(r)||e.push(r),e},[])}))})}}]),e}(),ui={PRIMARY:"PRIMARY"},ci={CONTENT:"CONTENT",POWER:"POWER"},li=function(){function e(){Qt()(this,e),this.primaryTarget="display1.primary"}return Jt()(e,[{key:"convert",value:function(e,t){var n,r,i;if(e.target===this.primaryTarget)return t.inject("task",{id:e.id,layoutId:null!=(n=e.layoutId)?n:null,mediumId:null!=(r=e.mediumId)?r:null,planIcal:e.planIcal,playlistId:null!=(i=e.playlistId)?i:null,priority:e.priority,targetEnum:ui.PRIMARY,taskEnum:ci.CONTENT})}}]),e}(),fi=function(){function e(t){Qt()(this,e),this.driveManager=t}return Jt()(e,[{key:"detect",value:function(e){var t=this;return new Promise(function(n){if(!Number.isFinite(e))throw new TypeError("Invalid size ".concat(e,"."));return n(t.driveManager.getInfo().then(function(t){var n=rr.find(t.driveUnitArray);if(sn()(n))throw new Error("No drive unit found.");return n.free>=e}))})}}]),e}(),hi=function(){function e(t,n,r,i,o,a,s,u,c,l,f,h,d,p,v,m,y,g,b){Qt()(this,e),this.analyticsTracker=n,this.buildId=t,this.communicator=r,this.contentInfo=null,this.contentTaskCron=null,this.contentTaskCronFactory=i,this.emitter=new en.a,this.fingerprintManager=o,this.firmwareManager=a,this.logger=s,this.loggerManager=u,this.networkListener=c,this.powerManager=l,this.replacer=f,this.reportManager=h,this.scheduleManager=d,this.session=p,this.startupManager=v,this.store=m,this.updater=y,this.viewerDirectorResource=g,this.viewerRegistry=b,this.onContentCleaned=this.onContentCleaned.bind(this),this.onContentTaskChanged=this.onContentTaskChanged.bind(this),this.onError=this.onError.bind(this),this.onHeartbeatFetched=this.onHeartbeatFetched.bind(this),this.onOnlineChanged=this.onOnlineChanged.bind(this),n.on("error",this.onError),c.on("onlineChanged",this.onOnlineChanged),f.on("content",this.onContentCleaned)}return Jt()(e,[{key:"cleanContent",value:function(e){var t=this;return new Promise(function(n){return n(t.unsetContentTasks().then(function(){t.contentInfo=e}).then(function(){return t.setContentTasks(e.contentTasks)}))})}},{key:"connect",value:function(){var e=this.communicator,t=this.session;return e.on("error",this.onError),e.on("heartbeatFetched",this.onHeartbeatFetched),e.connect(t.serverUrl,t.deviceId,t.contentTimestamp)}},{key:"createDirector",value:function(e){var t=this.viewerDirectorResource.create(e),n=this.contentInfo,r=n.layerArray,i=n.session,o=n.store,a=this.contentTaskCron.getCurrentTask(),s=this.scheduleManager.createStrategies(a,r,i,o);return t.createThreads(s),t}},{key:"destroy",value:function(){var e=this.communicator;this.analyticsTracker.off("error",this.onError),e.off("error",this.onError),e.off("heartbeatFetched",this.onHeartbeatFetched),this.networkListener.off("onlineChanged",this.onOnlineChanged),this.replacer.off("content",this.onContentCleaned)}},{key:"destroyDirector",value:function(e){this.viewerDirectorResource.destroy(e)}},{key:"execute",value:function(e){switch(e){case Yn:return this.powerManager.shutdown();case qn:return this.powerManager.reboot();case Wn:return this.report();default:return Promise.reject(new RangeError('Unknown command "'.concat(e,'".')))}}},{key:"getLoggerInfo",value:function(){var e=this;return Promise.all([this.loggerManager.getInfo().catch(function(t){return e.logger.error(t),{}}),new Promise(function(t){var n=e.session,r=e.networkListener.isOnline();return t({deviceId:n.deviceId,online:r,version:n.version})}).catch(function(t){return e.logger.error(t),{deviceId:null,online:null,version:null}})]).then(function(e){return Object.assign.apply(Object,[{}].concat(Hr()(e)))})}},{key:"getReportInfo",value:function(){var e=this;return this.reportManager.getInfo().catch(function(t){return e.logger.error(t),{}}).then(function(t){var n=e.session;return Xn()({},t,{buildId:e.buildId,contentTimestamp:n.contentTimestamp,version:n.version})})}},{key:"hit",value:function(e){return this.analyticsTracker.hit(e)}},{key:"install",value:function(e,t){var n=this,r=this.session.id,i={deviceId:e,id:r,serverUrl:t};return this.store.update("session",r,i).then(function(){n.logger.setInfo({deviceId:e})})}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onContentCleaned",value:function(e){var t=this;this.cleanContent(e).catch(function(e){return t.logger.error(e)})}},{key:"onContentTaskChanged",value:function(e){var t=this;this.setContentTask(e).catch(function(e){return t.logger.error(e)})}},{key:"onError",value:function(e){this.logger.error(e)}},{key:"onHeartbeatFetched",value:function(e){var t=this,n=this.session,r=n.deviceId,i=n.serverUrl;this.communicator.fetchCommand(i,r,e.queueIdArray).then(function(e){if(!sn()(e))return t.execute(e)}).then(function(){return t.communicator.fetchContent(i,r,e.contentTimestamp)}).then(function(n){return sn()(n)?t.updater.updateVersion(e.version):t.replacer.replace(n).then(function(n){return t.unsetContentTasks().then(function(){return t.viewerRegistry.getAll().reduce(function(e,t){return e.then(function(){return t.getSourceCreator().replace()})},Promise.resolve())}).then(function(){return t.analyticsTracker.replace().catch(function(e){return t.logger.error(e)})}).then(function(){t.contentInfo=n,t.emitter.emit("content",n)}).then(function(){return t.setContentTasks(t.contentInfo.contentTasks).catch(function(e){return t.logger.error(e)})}).then(function(){return t.updater.updateVersion(e.version)}).then(function(){var e=n.firmwareRelease;if(!sn()(e))return t.firmwareManager.update(e)})})}).catch(function(e){return t.logger.error(e)})}},{key:"onOnlineChanged",value:function(e){this.logger.setInfo({online:e})}},{key:"report",value:function(){var e=this;return this.getReportInfo().then(function(t){var n=e.session;return e.communicator.report(n.serverUrl,n.deviceId,t)})}},{key:"setContentTask",value:function(e){var t=this;return new Promise(function(n){var r=t.viewerDirectorResource.getAll();if(0===r.length)return n();var i=t.contentInfo,o=i.layerArray,a=i.session,s=i.store,u=t.scheduleManager.createStrategies(e,o,a,s);return n(r.reduce(function(e,t){return e.then(function(){return t.destroyThreads().then(function(){return t.createThreads(u)})})},Promise.resolve()))})}},{key:"setContentTasks",value:function(e){var t=this;return new Promise(function(n){var r=t.startCron(e).getCurrentTask();return n(t.setContentTask(r))})}},{key:"start",value:function(){var e=this;return this.startupManager.start().catch(function(t){return e.logger.error(t)}).then(function(){return e.replacer.restore()}).then(function(t){e.contentInfo=t}).then(function(){return e.updater.start()}).then(function(){if(sn()(e.session.fingerprint))return e.fingerprintManager.generate().then(function(t){return e.store.update("session",e.session.id,{fingerprint:t})})}).then(function(){return e.getLoggerInfo().then(function(t){return e.logger.setInfo(t)}).catch(function(t){return e.logger.error(t)})}).then(function(){return e.store.destroyAll("exception").catch(function(t){return e.logger.error(t)})}).then(function(){return e.analyticsTracker.start().catch(function(t){return e.logger.error(t)})}).then(function(){return e.setContentTasks(e.contentInfo.contentTasks).catch(function(t){return e.logger.error(t)})})}},{key:"startCron",value:function(e){if(!sn()(this.contentTaskCron))throw new Error("CRON is already started.");var t=this.contentTaskCronFactory.create(e);return this.contentTaskCron=t,t.on("taskChanged",this.onContentTaskChanged),t}},{key:"stopCron",value:function(){var e=this.contentTaskCron;sn()(e)||e.off("taskChanged",this.onContentTaskChanged),this.contentTaskCron=null}},{key:"unsetContentTasks",value:function(){var e=this;return new Promise(function(t){return e.stopCron(),t(e.viewerDirectorResource.getAll().reduce(function(e,t){return e.then(function(){return t.destroyThreads()})},Promise.resolve()))})}}]),e}(),di=function(){function e(t){Qt()(this,e),this.fecha=t,this.mappings=[{dhtmlx:"%y",fecha:"YY"},{dhtmlx:"%Y",fecha:"YYYY"},{dhtmlx:"%m",fecha:"MM"},{dhtmlx:"%n",fecha:"M"},{dhtmlx:"%M",fecha:"MMM"},{dhtmlx:"%F",fecha:"MMMM"},{dhtmlx:"%d",fecha:"DD"},{dhtmlx:"%j",fecha:"D"},{dhtmlx:"%D",fecha:"ddd"},{dhtmlx:"%l",fecha:"dddd"},{dhtmlx:"%h",fecha:"hh"},{dhtmlx:"%H",fecha:"HH"},{dhtmlx:"%g",fecha:"h"},{dhtmlx:"%G",fecha:"H"},{dhtmlx:"%i",fecha:"mm"},{dhtmlx:"%s",fecha:"ss"},{dhtmlx:"%a",fecha:"a"},{dhtmlx:"%A",fecha:"A"}]}return Jt()(e,[{key:"parse",value:function(e,t){var n=this.mappings.reduce(function(e,t){return e.replace(t.dhtmlx,t.fecha)},t),r=this.fecha.parse(e,n);if(sn()(r))throw new Error("String does not match the format.");return r}}]),e}(),pi=n(268),vi=n.n(pi),mi=function(){function e(t){Qt()(this,e),this.baseSeparator="_",this.baseSeparatorCount=4,this.count2Index=3,this.countIndex=1,this.dayIndex=2,this.daysIndex=4,this.daysSeparator=",",this.extraFinite="",this.extraInfinite="no",this.extraSeparator="#",this.stringUtil=t,this.typeIndex=0}return Jt()(e,[{key:"isValidCount",value:function(e){return Number.isInteger(e)&&e>0}},{key:"isValidDay",value:function(e){return Number.isInteger(e)&&e>-1&&e<7}},{key:"isValidType",value:function(e){return Object.values(Xr).includes(e)}},{key:"parse",value:function(e){var t=this.parseExtraIndex(e),n=this.parseBase(t,e),r=this.count2Index,i=this.countIndex,o=this.dayIndex,a=this.daysIndex,s=this.typeIndex,u=this.parseBaseParts(n),c=this.parseExtra(t,e);return{count:this.parseCount(u[i]),count2:this.parseCount2(u[r]),count3:this.parseCount3(c),day:this.parseDay(u[o]),days:this.parseDays(u[a]),infinite:this.parseInfinite(c),type:this.parseType(u[s])}}},{key:"parseBase",value:function(e,t){return t.slice(0,e)}},{key:"parseBaseParts",value:function(e){var t=this.baseSeparator,n=this.baseSeparatorCount,r=t.length,i=this.stringUtil.indexesOf(e,t,n+1);if(i.length!==n)throw new Error('Invalid base separator count "'.concat(e,'".'));var o=i.map(function(e){return e+r}),a=[0].concat(Hr()(o)),s=[].concat(Hr()(i),[e.length]);return vi()(a,s).map(function(t){var n=ln()(t,2),r=n[0],i=n[1];return e.slice(r,i)})}},{key:"parseCount",value:function(e){if(0===e.length)throw new Error("Missing count.");var t=Number(e);if(!this.isValidCount(t))throw new Error('Invalid count "'.concat(e,'".'));return t}},{key:"parseCount2",value:function(e){if(0!==e.length){var t=Number(e);if(!this.isValidCount(t))throw new Error('Invalid count2 "'.concat(e,'".'));return t}}},{key:"parseCount3",value:function(e){if(![this.extraFinite,this.extraInfinite].includes(e)){var t=Number(e);if(!this.isValidCount(t))throw new Error('Invalid count3 "'.concat(e,'".'));return t}}},{key:"parseDay",value:function(e){if(0!==e.length){var t=Number(e);if(!this.isValidDay(t))throw new Error('Invalid day "'.concat(e,'".'));return t}}},{key:"parseDays",value:function(e){var t=this;return e.split(this.daysSeparator).reduce(function(e,n){var r=t.parseDay(n);return sn()(r)||e.push(r),e},[])}},{key:"parseExtra",value:function(e,t){return t.slice(e+this.extraSeparator.length)}},{key:"parseExtraIndex",value:function(e){var t=e.indexOf(this.extraSeparator);if(-1===t)throw new Error('Missing extra separator in "'.concat(e,'".'));return t}},{key:"parseInfinite",value:function(e){return e===this.extraInfinite}},{key:"parseType",value:function(e){if(!this.isValidType(e))throw new Error('Invalid type "'.concat(e,'".'));return e}},{key:"stringify",value:function(e){var t=e.count,n=void 0===t?1:t,r=e.count2,i=e.count3,o=e.day,a=e.days,s=void 0===a?[]:a,u=e.infinite,c={count:n,count2:r,count3:i,day:o,days:s,infinite:void 0!==u&&u,type:e.type};return this.stringifyInfo(c)}},{key:"stringifyBase",value:function(e){return[this.stringifyType(e),this.stringifyCount(e),this.stringifyDay(e),this.stringifyCount2(e),this.stringifyDays(e)].join(this.baseSeparator)}},{key:"stringifyCount",value:function(e){var t=e.count;if(!this.isValidCount(t))throw new Error('Invalid count "'.concat(t,'".'));return String(t)}},{key:"stringifyCount2",value:function(e){var t=e.count2;if(sn()(t))return"";if(!this.isValidCount(t))throw new Error('Invalid count2 "'.concat(t,'".'));return String(t)}},{key:"stringifyDay",value:function(e){var t=e.day;return sn()(t)?"":this.stringifyDayValue(t)}},{key:"stringifyDayValue",value:function(e){if(!this.isValidDay(e))throw new Error('Invalid day "'.concat(e,'".'));return String(e)}},{key:"stringifyDays",value:function(e){var t=this;return e.days.map(function(e){return t.stringifyDayValue(e)}).join(this.daysSeparator)}},{key:"stringifyExtra",value:function(e){var t=e.count3,n=e.infinite;if(sn()(t))return n?this.extraInfinite:this.extraFinite;if(n)throw new Error("Unable to create infinite recurrence with end count.");return String(t)}},{key:"stringifyInfo",value:function(e){return[this.stringifyBase(e),this.stringifyExtra(e)].join(this.extraSeparator)}},{key:"stringifyType",value:function(e){var t=e.type;if(!this.isValidType(t))throw new Error('Invalid type "'.concat(t,'".'));return t}}]),e}(),yi=function(){function e(t,n,r,i){Qt()(this,e),this.ICAL=t,this.dateFormat=n,this.dateParser=r,this.event=i}return Jt()(e,[{key:"getEndDate",value:function(){var e=this.dateParser.parse(this.event.end_date,this.dateFormat);return this.ICAL.Time.fromJSDate(e)}},{key:"getEvent",value:function(){return this.event}},{key:"getId",value:function(){return this.event.id}},{key:"getLength",value:function(){return Number(this.event.event_length)}},{key:"getParentId",value:function(){return this.event.event_pid}},{key:"getRecType",value:function(){return this.event.rec_type}},{key:"getStartDate",value:function(){var e=this.dateParser.parse(this.event.start_date,this.dateFormat);return this.ICAL.Time.fromJSDate(e)}},{key:"getText",value:function(){return this.event.text}}]),e}(),gi=function(){function e(t,n,r){Qt()(this,e),this.DhtmlxToIcalEvent=t,this.ICAL=n,this.dateParser=r}return Jt()(e,[{key:"create",value:function(e,t){return new this.DhtmlxToIcalEvent(this.ICAL,e,this.dateParser,t)}}]),e}(),bi=n(85),wi=n.n(bi),_i=function(){function e(t,n,r,i,o,a){Qt()(this,e),this.ICAL=t,this.eventFactory=n,this.idGenerator=r,this.recTypeFactory=i,this.timeUtil=o,this.util=a}return Jt()(e,[{key:"export",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=n.dateFormat,i=void 0===r?"%Y-%m-%d %H:%i":r,o=n.generateUid,a=void 0===o?function(e){return e.id}:o,s=n.nowDate,u=void 0===s?new Date:s,c=e.map(function(e){return t.eventFactory.create(i,e)}),l=wi()(c,function(e){return e.getParentId()}),f=l[""]||[];if(f.length){var h=this.ICAL.Time.fromJSDate(u,!0);return this.util.createVCalendar({subcomponents:f.reduce(function(e,n){var r=n.getId(),i=l[r]||[],o=n.getEvent(),s=a(o),u=t.parseEvents(n,i,h,s);return e.push.apply(e,Hr()(u)),e},[])}).toString()}}},{key:"parseEvents",value:function(e,t,n,r){var i=this;if(""===e.getRecType())return[this.parseOneTimeEvent(e,n,r)];var o=wi()(t,function(e){return e.getRecType()}),a=o.none||[],s=o[""]||[];return[this.parseRecurringEvent(e,a,n,r)].concat(Hr()(s.map(function(e){return i.parseExceptionEvent(e,n,r)})))}},{key:"parseExceptionEvent",value:function(e,t,n){return this.util.createVEvent({endDate:e.getEndDate(),recurrenceDate:this.timeUtil.fromUnixTime(e.getLength(),{zone:this.ICAL.Timezone.localTimezone}),stamp:t,startDate:e.getStartDate(),summary:e.getText(),uid:n})}},{key:"parseOneTimeEvent",value:function(e,t,n){return this.util.createVEvent({endDate:e.getEndDate(),stamp:t,startDate:e.getStartDate(),summary:e.getText(),uid:n})}},{key:"parseRecurringEndDate",value:function(e,t){return this.timeUtil.adjust(t,{seconds:e})}},{key:"parseRecurringEvent",value:function(e,t,n,r){var i=this,o=this.recTypeFactory.create(e),a=e.getStartDate(),s=e.getLength(),u=o.getRecur(),c=this.parseRecurringStartDate(u,a);return this.util.createVEvent({endDate:this.parseRecurringEndDate(s,c),excludedDates:t.map(function(e){return i.timeUtil.fromUnixTime(e.getLength(),{zone:i.ICAL.Timezone.localTimezone})}),recur:u,stamp:n,startDate:c,summary:e.getText(),uid:r})}},{key:"parseRecurringStartDate",value:function(e,t){var n=e.iterator(t).next();return sn()(n)?t:n}}]),e}(),ki={Secondly:"SECONDLY",Minutely:"MINUTELY",Hourly:"HOURLY",Daily:"DAILY",Weekly:"WEEKLY",Monthly:"MONTHLY",Yearly:"YEARLY"},xi=function(){function e(t,n,r,i){Qt()(this,e),this.ICAL=t,this.event=n,this.recTypeOptions=i.parse(n.getRecType()),this.icalUtil=r}return Jt()(e,[{key:"getByDay",value:function(){var e=this,t=this.recTypeOptions,n=t.count2,r=t.day,i=t.days;return sn()(r)||sn()(n)?i.map(function(t){return e.icalUtil.parseRecurDay(t)}):["".concat(n).concat(this.icalUtil.parseRecurDay(r))]}},{key:"getByMonth",value:function(){return this.recTypeOptions.type!==Xr.Year?[]:[this.event.getStartDate().month]}},{key:"getByMonthDay",value:function(){var e=this.recTypeOptions.type;return e!==Xr.Month&&e!==Xr.Year?[]:this.getByDay().length?[]:[this.event.getStartDate().day]}},{key:"getCount",value:function(){return this.recTypeOptions.count3}},{key:"getFreq",value:function(){switch(this.recTypeOptions.type){case Xr.Day:return ki.Daily;case Xr.Week:return ki.Weekly;case Xr.Month:return ki.Monthly;case Xr.Year:return ki.Yearly;default:throw new RangeError("Unknown type")}}},{key:"getInterval",value:function(){return this.recTypeOptions.count}},{key:"getRecur",value:function(){var e={count:this.getCount(),freq:this.getFreq(),interval:this.getInterval(),until:this.getUntil()},t=this.getByDay();t.length&&(e.byday=t);var n=this.getByMonthDay();n.length&&(e.bymonthday=n);var r=this.getByMonth();return r.length&&(e.bymonth=r),new this.ICAL.Recur(e)}},{key:"getUntil",value:function(){var e=this.recTypeOptions;if(!e.infinite&&sn()(e.count3))return this.event.getEndDate()}}]),e}(),Ei=function(){function e(t,n,r,i){Qt()(this,e),this.DhtmlxToIcalRecType=t,this.ICAL=n,this.icalUtil=r,this.recTypeUtil=i}return Jt()(e,[{key:"create",value:function(e){return new this.DhtmlxToIcalRecType(this.ICAL,e,this.icalUtil,this.recTypeUtil)}}]),e}(),Ti=function(){function e(t,n){if(Qt()(this,e),!nn()(n))throw new TypeError("Invalid parent element ".concat(n,"."));var r=t.create(),i=r.getEl(),o=document.createElement("div");i.appendChild(o),n.appendChild(i),this.el=o,this.frame=r,this.parentEl=n}return Jt()(e,[{key:"destroy",value:function(){this.el.removeAttribute("src");var e=this.frame.getEl();this.parentEl.removeChild(e)}},{key:"getEl",value:function(){var e=this.el;if(sn()(e))throw new TypeError("Missing element.");return e}},{key:"getFrame",value:function(){return this.frame}},{key:"setParentEl",value:function(e){if(!nn()(e))throw new TypeError("Invalid parent element ".concat(e,"."));if(e!==this.parentEl){var t=this.frame.getEl();e.appendChild(t),this.parentEl=e}}}]),e}(),Ai=function(){function e(t,n){Qt()(this,e),this.pool=t.create(n),this.sourceFactory=n}return Jt()(e,[{key:"delete",value:function(e){var t=this;return new Promise(function(n){return n(t.pool.delete(e))})}},{key:"destroy",value:function(){this.pool.destroy()}},{key:"getLent",value:function(){return this.pool.getLent()}},{key:"getMax",value:function(){return this.pool.getMax()}},{key:"lend",value:function(e,t){var n=this;return new Promise(function(t){n.sourceFactory.setParentEl(e);var r=n.pool.lend();return r.setParentEl(e),t(r)})}},{key:"receive",value:function(e){var t=this;return new Promise(function(n){return n(t.pool.delete(e))})}},{key:"replace",value:function(){return Promise.resolve()}}]),e}(),Si=function(){function e(t,n){Qt()(this,e),this.DivViewerSource=t,this.frameFactory=n,this.parentEl=null}return Jt()(e,[{key:"create",value:function(){return new this.DivViewerSource(this.frameFactory,this.parentEl)}},{key:"delete",value:function(e){return e.destroy()}},{key:"setParentEl",value:function(e){this.parentEl=e}}]),e}(),Ci=n(52),Ii=n.n(Ci),Oi=function(){function e(t,n){if(Qt()(this,e),!nn()(t))throw new TypeError('Invalid store "'.concat(t,'".'));if(!nn()(n))throw new TypeError('Invalid session "'.concat(n,'".'));this.emitter=new en.a,this.primaryStore=t,this.session=n}return Jt()(e,[{key:"clean",value:function(e){var t=this,n=this.primaryStore,r=n.filter("medium").reduce(function(e,t){var n=t.assetId;return sn()(n)||(e[n]=e[n]||[],e[n].push(t)),e},{}),i=e.mediumArray.map(function(e){return e.id}),o=n.filter("asset").map(function(e){return{asset:e,mediumArray:r[e.id]||[]}}).filter(function(e){return!e.mediumArray.some(function(e){return i.includes(e.id)})});return o.length&&this.emitter.emit("content",{contentTasks:[],firmwareRelease:null,layerArray:[],layoutArray:[],mediumArray:[],playlistArray:[],powerTasks:[],session:this.session,store:n,taskArray:[],timerArray:[],trackArray:[]}),o.reduce(function(e,r){return e.then(function(e){return r.mediumArray.reduce(function(t,r){return t.then(function(){return n.update("medium",r.id,{assetId:null}).then(function(){e.mediumArray.push(r)})})},Promise.resolve()).then(function(){return n.destroy("asset",r.asset.id).then(function(){e.assetArray.push(r.asset)})}).catch(function(e){t.emitter.emit("error",e)}).then(function(){return e})})},Promise.resolve({assetArray:[],mediumArray:[]}))}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}}]),e}(),Pi=function(){function e(t,n,r,i,o){Qt()(this,e);var a=new Oi(r,i);this.cleaner=a,this.config=t,this.detector=n,this.downloadPromise=Promise.resolve(),this.downloading=!1,this.viewerRegistry=o,this.emitter=new en.a,this.primaryStore=r,this.onContent=this.onContent.bind(this),this.onError=this.onError.bind(this),a.on("content",this.onContent),a.on("error",this.onError)}return Jt()(e,[{key:"destroy",value:function(){var e=this.cleaner;e.off("content",this.onContent),e.off("error",this.onError)}},{key:"download",value:function(e){var t=this;return new Promise(function(n){if(t.downloading)throw new Error("Download already in progress");t.downloading=!0;var r=t.fetch(e);return t.downloadPromise=r.catch(Ii.a).then(function(){t.downloading=!1}),n(r)})}},{key:"fetch",value:function(e){var t=this,n=this.config.device.downloader.defaultSize;return e.mediumArray.map(function(e){return{medium:e,viewerType:t.viewerRegistry.find(e.type)}}).filter(function(e){var t=e.viewerType;return t&&t.isOfflineable()}).reduce(function(r,i){var o=i.medium,a=i.viewerType;return r.then(function(r){return new Promise(function(r){var i=t.primaryStore,s=i.definitions.asset,u=s.getAdapter(s),c={checksum:o.checksum,url:o.url},l={extract:a.isExtractable()},f=u.getId(s,c,l),h=i.get("asset",f);return sn()(h)?r(t.detector.detect(n).then(function(r){return r?Promise.resolve():t.cleaner.clean(e).then(function(){return t.detector.detect(n)}).then(function(e){if(!e)throw Error("Unable to clean space for medium ".concat(o,"."));return Promise.resolve()})}).then(function(){return i.create("asset",c,l)})):r(h)}).then(function(t){e.store.inject("medium",{assetId:t.id,id:o.id}),r.push(t)}).catch(function(e){t.emitter.emit("error",e)}).then(function(){return r})})},Promise.resolve([]))}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onContent",value:function(e){this.emitter.emit("content",e)}},{key:"onError",value:function(e){this.emitter.emit("error",e)}},{key:"start",value:function(){var e=this,t=this.primaryStore.definitions.asset;return t.getAdapter(t).clean(t).catch(function(t){e.emitter.emit("error",t)}).then(function(){return e.primaryStore.findAll("asset")})}}]),e}(),Di=n(267),Li=n.n(Di),Mi=n(57),ji=n.n(Mi),Ni=function(){function e(t){Qt()(this,e),this.url=t}return Jt()(e,[{key:"getUrl",value:function(){return this.url}}]),e}(),Ri=function(){function e(t,n,r,i,o,a){Qt()(this,e),this.defaultOptions={checksumAttribute:"checksum",extract:!1,fileAttribute:"fileUrl",localhostAttribute:"localhostUrl",temporaryExtension:"tmp",remoteAttribute:"url"},this.instanceOptions=a,this.fileArchiveManager=t,this.fileSystemPathFactory=n,this.fileSystemManager=r,this.fileSystemMapper=i,this.fileTransferManager=o}return Jt()(e,[{key:"clean",value:function(t,n){return e.validateCommon(t,n),this.listFile(t,n).then(function(e){var t=[];return e.filter(function(e){return!e.injectable}).reduce(function(e,n){return e.then(function(){return n.entry.remove({recursive:!0})}).catch(function(){t.push(n)})},Promise.resolve()).then(function(){if(t.length){var e=t.map(function(e){return e.entry.getPath()}).join(", ");throw new Error("Unable to remove files: ".concat(e,"."))}})})}},{key:"create",value:function(t,n,r){var i=this;return e.validateCommon(t,r),e.validateAttrs(n),new Promise(function(o){var a=i.getWorkspacePath(t,r),s=i.getOption(t,"remoteAttribute",r),u=n[s],c=new Un.a(u).filename();i.validateFilename(t,c,r);var l,f=e.parseExtension(c),h=i.getId(t,n,r),d=i.getOption(t,"extract",r);l=d?i.fileSystemPathFactory.fromInfo({stem:h}):i.fileSystemPathFactory.fromInfo({extension:f,stem:h});var p=i.fileSystemPathFactory.join(a,l),v=i.getOption(t,"temporaryExtension",r),m=i.fileSystemPathFactory.fromInfo({extension:v,stem:h}),y=i.fileSystemPathFactory.join(a,m);return o(i.fileSystemManager.hasDirectory(a).then(function(e){return e?i.hasTarget(p,d).then(function(e){return e?Promise.resolve():i.createTarget(p,y,u,d)}):i.fileSystemManager.createDirectory(a).then(function(){return i.createTarget(p,y,u,d)})}).then(function(){return i.generateAttrs(t,h,p,r)}))})}},{key:"createTarget",value:function(e,t,n,r){var i=this;return new Promise(function(o){var a=new Ni(n);return o(i.fileTransferManager.download(t,a).getResponse().then(function(n){if(!n.isOk())throw new RangeError("Download failed with status ".concat(n.getStatus(),"."));var o=n.getFile();return r?i.fileSystemManager.createDirectory(e).then(function(){return i.fileArchiveManager.getVolume(t)}).then(function(t){return t.extract(e)}).then(function(){return o.remove()}):o.move(e)}))})}},{key:"destroy",value:function(t,n,r){return e.validateCommon(t,r),e.validateId(n),this.listFile(t,r).then(function(e){var t=e.filter(function(e){return e.injectable&&n===e.id}).map(function(e){return e.entry});switch(t.length){case 0:return Promise.resolve();case 1:return t[0].remove({recursive:!0});default:throw new RangeError("Too many files found!")}})}},{key:"destroyAll",value:function(t,n,r){return e.validateCommon(t,r),e.validateParams(n),this.listFile(t,r).then(function(e){return e.filter(function(e){return e.injectable}).reduce(function(e,t){return e.then(function(){return t.entry.remove({recursive:!0})})},Promise.resolve())})}},{key:"find",value:function(t,n,r){var i=this;return e.validateCommon(t,r),e.validateId(n),this.listFile(t,r).then(function(e){var o=e.filter(function(e){return e.injectable&&n===e.id});switch(o.length){case 0:throw new Error("Not Found!");case 1:return i.generateAttrs(t,n,o[0].entry.getPath(),r);default:throw new RangeError("Too many files found!")}})}},{key:"findAll",value:function(t,n,r){var i=this;return e.validateCommon(t,r),e.validateParams(n),this.listFile(t,r).then(function(e){var n=[];return e.filter(function(e){return e.injectable}).reduce(function(e,o){return e.then(function(){return i.generateAttrs(t,o.id,o.entry.getPath(),r).then(function(e){n.push(e)})})},Promise.resolve()).then(function(){return n})})}},{key:"generateAttrs",value:function(e,t,n,r){var i=this;return new Promise(function(o){return o(i.getFileUrl(n).then(function(o){return i.getLocalhostUrl(n).then(function(n){var a=i.getOption(e,"fileAttribute",r),s=i.getOption(e,"idAttribute",r),u=i.getOption(e,"localhostAttribute",r),c={};return c[a]=o,c[s]=t,c[u]=n,c})}))})}},{key:"getId",value:function(t,n,r){e.validateCommon(t,r),e.validateAttrs(n);var i=n[this.getOption(t,"checksumAttribute",r)];if(!sn()(i))return i;var o=n[this.getOption(t,"remoteAttribute",r)];if(!sn()(o))return Gr()(o);throw new Error("Unable to get id from attrs ".concat(n,"."))}},{key:"getFileUrl",value:function(e){var t=this;return new Promise(function(n){return t.fileSystemMapper.hasFile()?n(t.fileSystemMapper.toFileUrl(e)):n(null)})}},{key:"getLocalhostUrl",value:function(e){var t=this;return new Promise(function(n){return t.fileSystemMapper.hasLocalhost()?n(t.fileSystemMapper.toLocalhostUrl(e)):n(null)})}},{key:"getOption",value:function(e,t,n){if(Br()(n,t))return n[t];var r=Sn()(this.instanceOptions,t);if(!ji()(r))return r;var i=this.defaultOptions[t];return ji()(i)?e[t]:i}},{key:"getWorkspacePath",value:function(e,t){var n=this.getOption(e,"endpoint",t);if(!n)throw new TypeError('Missing endpoint for resource "'.concat(e,'".'));var r=this.getOption(e,"basePath",t);return this.fileSystemPathFactory.join(this.fileSystemPathFactory.fromValue(r),this.fileSystemPathFactory.fromInfo({stem:n}))}},{key:"hasTarget",value:function(e,t){var n=this;return new Promise(function(r){var i=n.fileSystemManager;return r(t?i.hasDirectory(e):i.hasFile(e))})}},{key:"listFile",value:function(e,t){var n=this,r=this.getOption(e,"temporaryExtension",t),i=this.getWorkspacePath(e,t);return this.fileSystemManager.hasDirectory(i).then(function(e){return e?n.fileSystemManager.getDirectory(i).then(function(e){return e.list()}).then(function(e){return e.map(function(e){return n.parseFile(e,r)}).map(function(e,t,n){var r=e.id,i=n.find(function(e,n){return r===e.id&&!(t===n)});return Xn()({},e,{injectable:!e.temporary&&!i})})}):[]})}},{key:"parseFile",value:function(t,n){var r=t.getName(),i=e.parseFilename(r,n);return{entry:t,id:i.id,injectable:null,temporary:i.temporary}}},{key:"update",value:function(e,t,n,r){return Promise.reject(new Error("Not implemented!"))}},{key:"updateAll",value:function(e,t,n,r){return Promise.reject(new Error("Not implemented!"))}},{key:"validateFilename",value:function(e,t,n){var r=this.getOption(e,"temporaryExtension",n),i=".".concat(r);if(En()(t)&&t.endsWith(i))throw new TypeError('Invalid filename "'.concat(t,'".'))}}],[{key:"parseFilename",value:function(t,n){var r,i=".".concat(n),o=t.endsWith(i);r=o?t.slice(0,-1*i.length):t;var a,s=e.parseExtension(r);if(s){var u=".".concat(s);a=r.slice(0,-1*u.length)}else a=r;return{id:a,temporary:o}}},{key:"parseExtension",value:function(e){return e.slice(2+(e.lastIndexOf(".")-1>>>0))}},{key:"validateAttrs",value:function(e){if(!nn()(e))throw new TypeError('Invalid attrs "'.concat(e,'".'))}},{key:"validateCommon",value:function(e,t){if(!nn()(e))throw new TypeError('Invalid resource "'.concat(e,'".'));if(!sn()(t)&&!nn()(t))throw new TypeError('Invalid options "'.concat(t,'".'))}},{key:"validateId",value:function(e){if(!En()(e)&&!kn()(e))throw new TypeError('Invalid id "'.concat(e,'".'))}},{key:"validateParams",value:function(e){if(!Li()(e))throw new Error("Using params attribute is not supported.")}}]),e}(),Fi=function(){function e(){Qt()(this,e),this.priorityMap=new Map(["Debug","Log","Info","Warning","Error"].map(function(e,t){return[fn.a[e],t]}))}return Jt()(e,[{key:"compare",value:function(e,t){var n=this.priorityMap.get(e);if(sn()(n))throw new RangeError('Unknown error level "'.concat(e,'".'));var r=this.priorityMap.get(t);if(sn()(r))throw new RangeError('Unknown error level "'.concat(t,'".'));return n<r?-1:n>r?1:0}},{key:"fromValue",value:function(e){if(!nn()(e))return null;var t=e.level;return sn()(t)||!this.isErrorLevel(t)?null:t}},{key:"isErrorLevel",value:function(e){return Br()(fn.a,e)}}]),e}(),Bi={AbortError:"AbortError",EncodingError:"EncodingError",Error:"Error",InvalidModificationError:"InvalidModificationError",InvalidStateError:"InvalidStateError",MediaError:"MediaError",NetworkError:"NetworkError",NoModificationAllowedError:"NoModificationAllowedError",NotFoundError:"NotFoundError",NotReadableError:"NotReadableError",NotSupportedError:"NotSupportedError",PathExistsError:"PathExistsError",QuotaExceededError:"QuotaExceededError",RangeError:"RangeError",ReferenceError:"ReferenceError",SecurityError:"SecurityError",SetupError:"SetupError",SyntaxError:"SyntaxError",TimeoutError:"TimeoutError",TypeError:"TypeError"},Ui=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"getVolume",value:function(e){return new Promise(function(){var e=new Error("No entry exists.");throw e.name=Bi.NotFoundError,e})}}]),e}(),zi=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"createDirectory",value:function(e){return new Promise(function(){var e=new Error("Unable to create any directory.");throw e.name=Bi.NotSupportedError,e})}},{key:"getAllUnits",value:function(){return Promise.resolve([])}},{key:"getDirectory",value:function(e){return new Promise(function(){var e=new Error("No directory exists.");throw e.name=Bi.NotFoundError,e})}},{key:"getEntry",value:function(e){return new Promise(function(){var e=new Error("No entry exists.");throw e.name=Bi.NotFoundError,e})}},{key:"getFile",value:function(e){return new Promise(function(){var e=new Error("No file exists.");throw e.name=Bi.NotFoundError,e})}},{key:"getUnit",value:function(e){return new Promise(function(){var e=new Error("No unit exists.");throw e.name=Bi.NotFoundError,e})}},{key:"hasDirectory",value:function(e){return Promise.resolve(!1)}},{key:"hasEntry",value:function(e){return Promise.resolve(!1)}},{key:"hasFile",value:function(e){return Promise.resolve(!1)}}]),e}(),$i=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"hasFile",value:function(){return!1}},{key:"hasLocalhost",value:function(){return!1}},{key:"toFileUrl",value:function(e){return new Promise(function(){var e=new Error("File URLs are not supported.");throw e.name=Bi.NotSupportedError,e})}},{key:"toLocalhostUrl",value:function(e){return new Promise(function(){var e=new Error("Localhost URLs are not supported.");throw e.name=Bi.NotSupportedError,e})}}]),e}(),Vi=function(){function e(t,n){Qt()(this,e);var r=n.normalize(t);this.normalized=r,this.pathBrowserify=n,this.pathObject=n.parse(r),this.value=t}return Jt()(e,[{key:"getBase",value:function(){return this.isRoot()?"":this.pathObject.base}},{key:"getSegments",value:function(){var e=this.pathObject,t=e.dir.slice(e.root.length),n=[];t&&n.push.apply(n,Hr()(t.split("/")));var r=e.base;return r&&n.push(r),n}},{key:"getExtension",value:function(){return this.isRoot()?"":this.pathObject.ext.slice(1)}},{key:"getNormalized",value:function(){return this.normalized}},{key:"getParents",value:function(){var e=this.getSegments();return this.isAbsolute()?e.slice(1,-1):e.slice(0,-1)}},{key:"getStem",value:function(){if(this.isRoot())return"";var e=this.pathObject,t=e.ext,n=e.name;return 1===t.length?n+t:n}},{key:"getUnit",value:function(){var e=this.getSegments();return this.isAbsolute()&&e.length?e[0]:""}},{key:"getValue",value:function(){return this.value}},{key:"isAbsolute",value:function(){return this.pathBrowserify.isAbsolute(this.normalized)}},{key:"isRoot",value:function(){return this.isAbsolute()&&this.getSegments().length<2}},{key:"toJSON",value:function(){return this.getValue()}},{key:"toString",value:function(){return this.getNormalized()}}]),e}(),Yi=function(){function e(t,n){Qt()(this,e),this.FileSystemPath=t,this.pathBrowserify=n}return Jt()(e,[{key:"fromInfo",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.base,n=void 0===t?"":t,r=e.extension,i=void 0===r?"":r,o=e.unit,a=void 0===o?"":o,s=e.parents,u=void 0===s?[]:s,c=e.stem,l=void 0===c?"":c,f=[];if(!En()(a))throw new TypeError('Invalid unit "'.concat(a,'".'));if(a&&f.push("/".concat(a)),!In()(u))throw new TypeError('Invalid parents "'.concat(u,'".'));if(u.forEach(function(e){if(!En()(e))throw new TypeError('Invalid parent "'.concat(e,'".'));f.push(e)}),!En()(n))throw new TypeError('Invalid base "'.concat(n,'".'));if(n)f.push(n);else{var h=this.getBase({extension:i,stem:l});h&&f.push(h)}var d=f.join("/");return new this.FileSystemPath(d,this.pathBrowserify)}},{key:"fromValue",value:function(e){return new this.FileSystemPath(e,this.pathBrowserify)}},{key:"getBase",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.extension,n=void 0===t?"":t,r=e.stem,i=void 0===r?"":r,o=[];if(!En()(i))throw new TypeError('Invalid stem "'.concat(i,'".'));if(i&&o.push(i),!En()(n))throw new TypeError('Invalid extension "'.concat(n,'".'));return n&&o.push(".".concat(n)),o.join("")}},{key:"join",value:function(){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];var i=n.map(function(e){return e.getValue()}),o=(e=this.pathBrowserify).join.apply(e,Hr()(i));return new this.FileSystemPath(o,this.pathBrowserify)}},{key:"relative",value:function(e,t){var n,r=[e,t].map(function(e){return e.getValue()}),i=(n=this.pathBrowserify).relative.apply(n,Hr()(r));return new this.FileSystemPath(i,this.pathBrowserify)}},{key:"resolve",value:function(){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];var i=n.map(function(e){return e.getValue()}),o=(e=this.pathBrowserify).resolve.apply(e,Hr()(i));return new this.FileSystemPath(o,this.pathBrowserify)}}]),e}(),Hi=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"download",value:function(e,t){var n=new Error("Unable to download any file.");throw n.name=Bi.NotSupportedError,n}}]),e}(),qi=n(266),Wi=n.n(qi),Gi=function(){function e(t){if(Qt()(this,e),!nn()(t))throw new TypeError('Invalid fingerprint hasher "'.concat(t,'".'));this.hasher=t}return Jt()(e,[{key:"generate",value:function(){var e=this;return new Promise(function(t){return t(e.getInfo().then(function(t){return e.hasher.hashObject(t)}))})}},{key:"getInfo",value:function(){return new Promise(function(e){return e(Wi.a.getPromise({excludes:{adBlock:!0,availableScreenResolution:!0,enumerateDevices:!0,fontsFlash:!0,hasLiedResolution:!0,pixelRatio:!0,screenResolution:!0,timezoneOffset:!0},plugins:{excludeIE:!0}}).then(function(e){return e.reduce(function(e,t){return e[t.key]=t.value,e},{})}))})}}]),e}(),Ki=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"hashObject",value:function(e){return Gr()(e,{algorithm:"sha1",encoding:"hex",respectFunctionNames:!1,respectFunctionProperties:!1,respectType:!1})}}]),e}(),Qi=function(){function e(t){Qt()(this,e),this.uaParser=t}return Jt()(e,[{key:"getBrowser",value:function(){var e=this.uaParser.getBrowser(),t=e.major,n=e.name;return sn()(n)?"":"".concat(n," ").concat(t)}},{key:"getEngine",value:function(){var e=this.uaParser.getEngine(),t=e.name,n=e.version;return sn()(t)?"":"".concat(t," ").concat(n)}},{key:"getInfo",value:function(){return new Promise(function(e){return e({})})}},{key:"getManufacturer",value:function(){var e=this;return new Promise(function(t){var n=e.uaParser.getDevice().vendor;if(sn()(n)){var r=new Error("Unable to get the manufacturer.");throw r.name=Bi.NotSupportedError,r}return t(n)})}},{key:"getModelExact",value:function(){var e=this.uaParser.getDevice().model;return sn()(e)?"":e}},{key:"getModelName",value:function(){var e=this;return new Promise(function(t){var n=[e.getModelExact(),e.getBrowser(),e.getEngine(),e.getOs()].filter(function(e){return e}).join(", ");if(sn()(n)){var r=new Error("Unable to get the model name.");throw r.name=Bi.NotSupportedError,r}return t(n)})}},{key:"getOs",value:function(){var e=this.uaParser.getOS(),t=e.name,n=e.version;return sn()(t)?"":"".concat(t," ").concat(n)}},{key:"getSerialNumber",value:function(){return new Promise(function(){var e=new Error("Unable to get the serial number.");throw e.name=Bi.NotSupportedError,e})}},{key:"getVersion",value:function(){return new Promise(function(){var e=new Error("Unable to get the firmware version.");throw e.name=Bi.NotSupportedError,e})}},{key:"update",value:function(e){return new Promise(function(){var e=new Error("Unable to do any update.");throw e.name=Bi.NotSupportedError,e})}}]),e}(),Zi=function(){function e(t){Qt()(this,e),this.document=t}return Jt()(e,[{key:"change",value:function(e){var t=this.queryElements(),n=this.findElement(t,e,{current:this.document.activeElement});return sn()(n)||n.focus(),n}},{key:"findElement",value:function(e,t){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).current,r=this.findFromIndex(e,{current:n}),i=this.findToIndex(r,e.length,t);return-1===i?null:e[i]}},{key:"findFromIndex",value:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).current,n=e.indexOf(t);return-1===n?0:n}},{key:"findToIndex",value:function(e,t,n){return 0===t?-1:n<0?(e+t+n)%t:(e+n)%t}},{key:"next",value:function(){return this.change(1)}},{key:"previous",value:function(){return this.change(-1)}},{key:"queryElements",value:function(){return Array.from(this.document.querySelectorAll("a, button, input, select, textarea")).filter(function(e){return"a"===e.tagName.toLowerCase()?e.href:!e.disabled})}}]),e}(),Ji=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"start",value:function(){}},{key:"stop",value:function(){}}]),e}(),Xi=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"repair",value:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).omitAttributes,n=void 0===t?[]:t;return new Promise(function(t){return Array.from(e.attributes).filter(function(e){return!n.includes(e.name)}).forEach(function(t){e.removeAttribute(t.name)}),e.scrollLeft=0,e.scrollTop=0,t()})}}]),e}(),eo=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"preflight",value:function(e){return Promise.resolve()}}]),e}(),to=n(265),no=n.n(to),ro=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"createError",value:function(e){var t=e.error;if(sn()(t))return new Error("Missing MediaError object.");var n=this.getMessage(t),r=new Error(n);return r.name=Bi.MediaError,r}},{key:"getCode",value:function(e){var t=e.code,n=no()(e).find(function(e){var n=ln()(e,2),r=n[0];return n[1]===t&&"code"!==r});return sn()(n)?"Code ".concat(t,"."):n[0]}},{key:"getMessage",value:function(e){var t=this.getCode(e),n=e.message;return sn()(n)||!n.length?t:"".concat(t," ").concat(n)}}]),e}(),io=function(){function e(t,n,r){Qt()(this,e),this.blankSrc=t,this.elementRepairer=n,this.mediaUtil=r}return Jt()(e,[{key:"repair",value:function(e){var t=this;return new Promise(function(n){return n(t.repairSources(e).then(function(){return t.repairSrc(e)}).then(function(){return t.repairSrcObject(e)}).then(function(){e.defaultPlaybackRate=1,e.muted=!1,e.playbackRate=1,e.volume=1}).then(function(){return t.elementRepairer.repair(e,{omitAttributes:["src"]})}))})}},{key:"repairSources",value:function(e){return new Promise(function(t){return t(Array.from(e.childNodes).filter(function(e){return"SOURCE"===e.tagName}).forEach(function(e){return e.remove()}))})}},{key:"repairSrc",value:function(e){var t,n,r=this;return new Promise(function(i,o){var a=r.blankSrc;if(!e.hasAttribute("src")||e.src===a)return i();t=function(){return i()},n=function(){return o(r.mediaUtil.createError(e))},e.addEventListener("canplay",t),e.addEventListener("error",n),e.src=a,e.load()}).finally(function(){e.removeEventListener("canplay",t),e.removeEventListener("error",n)})}},{key:"repairSrcObject",value:function(e){return new Promise(function(t){var n=e.srcObject;if(sn()(n))return t();if(n instanceof MediaStream)return n.getTracks().forEach(function(e){e.stop()}),e.srcObject=null,t();throw new Error('Unknown srcObject "'.concat(n,'".'))})}}]),e}(),oo=function(){function e(t,n){Qt()(this,e),this.slicer=t,this.util=n}return Jt()(e,[{key:"expand",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.endDate,r=t.maxIterations,i=void 0===r?1/0:r,o=t.startDate,a=this.util,s=this.slicer.slice(e,{startDate:o,endDate:n}),u=[];return a.getAllEvents(s).forEach(function(e){var t,r=e.iterator(),s=0;do{if(s+=1,t=r.next()){var c=e.getOccurrenceDetails(t),l=c.startDate.toUnixTime();if(n&&l>n.toUnixTime())break;a.isEventWithinRange(c,{endDate:n,startDate:o})&&u.push(c)}}while(t&&s<i)}),u}}]),e}(),ao=function(){function e(t,n,r){Qt()(this,e),this.ICAL=t,this.timeUtil=n,this.util=r}return Jt()(e,[{key:"slice",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=n.endDate,i=n.startDate,o=this.ICAL,a=this.util,s=new o.Component("vcalendar");e.getAllProperties().forEach(function(e){var t=a.cloneProperty(e);s.addProperty(t)});var u=a.getAllEvents(e);return e.getAllSubcomponents().forEach(function(e){var n=t.sliceComponent(e,u,{endDate:r,startDate:i});sn()(n)||s.addSubcomponent(n)}),s}},{key:"sliceComponent",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.endDate,i=n.startDate,o=this.util;if("vevent"===e.name){var a=t.find(function(t){return t.component===e});return sn()(a)?o.cloneComponent(e):this.sliceEvent(a,{endDate:r,startDate:i})}return o.cloneComponent(e)}},{key:"sliceDailyStartDate",value:function(e,t,n){var r=this.ICAL;if(1!==t.interval||!sn()(t.count))return null;var i=t.parts;if(Object.keys(i).length)return null;var o=this.timeUtil.adjust(n,{seconds:-1*e.duration.toSeconds()}),a=e.startDate,s=new r.Time({year:o.year,month:o.month,day:o.day,hour:a.hour,minute:a.minute,second:a.second});return a.toUnixTime()>s.toUnixTime()?null:s}},{key:"sliceDtend",value:function(e,t,n){var r=new this.ICAL.Property(t.name),i=this.timeUtil.adjust(n,{seconds:e.duration.toSeconds()});return r.setValue(i),r}},{key:"sliceDtstart",value:function(e,t){var n=new this.ICAL.Property(e.name);return n.setValue(t),n}},{key:"sliceEvent",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.endDate,r=t.startDate,i=this.util,o=e.component;return Object.keys(e.exceptions).length?i.cloneComponent(o):e.isRecurring()?this.sliceRecurringEvent(e,{endDate:n,startDate:r}):this.sliceOneTimeEvent(e,{endDate:n,startDate:r})}},{key:"sliceMonthlyStartDate",value:function(e,t,n){if(1!==t.interval||!sn()(t.count))return null;if(1!==Object.keys(t.parts).length)return null;var r=this.util.getByPartValues("BYMONTHDAY",t.parts);if(1!==r.length||r[0]<0)return null;for(var i=this.timeUtil.adjust(n,{seconds:-1*e.duration.toSeconds()}),o=e.startDate,a=o.day,s=i.year,u=i.month;this.ICAL.Time.daysInMonth(u,s)<a;)1===u?(s-=1,u=12):u-=1;var c=new this.ICAL.Time({year:s,month:u,day:a,hour:o.hour,minute:o.minute,second:o.second});return o.toUnixTime()>c.toUnixTime()?null:c}},{key:"sliceOneTimeEvent",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.endDate,r=t.startDate,i=this.util;return i.isEventWithinRange(e,{endDate:n,startDate:r})?i.cloneComponent(e.component):null}},{key:"sliceRecurringEvent",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=n.endDate,i=n.startDate,o=this.ICAL,a=this.util,s=e.component;if(s.hasProperty("rdate"))return a.cloneComponent(s);var u=s.getAllProperties("rrule");if(1!==u.length)return a.cloneComponent(s);var c=u[0].getFirstValue("rrule");if(!a.isRecurringEventWithinRange(e,c,{endDate:r,startDate:i}))return null;if(sn()(i))return a.cloneComponent(s);var l=this.sliceStartDate(e,c,i);if(sn()(l))return a.cloneComponent(s);var f=new o.Component("vevent");return s.getAllProperties().forEach(function(n){var r=t.sliceRecurringProperty(e,n,l);f.addProperty(r)}),f}},{key:"sliceRecurringProperty",value:function(e,t,n){switch(t.name){case"dtend":return this.sliceDtend(e,t,n);case"dtstart":return this.sliceDtstart(t,n);default:return this.util.cloneProperty(t)}}},{key:"sliceStartDate",value:function(e,t,n){switch(t.freq){case ki.Daily:return this.sliceDailyStartDate(e,t,n);case ki.Weekly:return this.sliceWeeklyStartDate(e,t,n);case ki.Monthly:return this.sliceMonthlyStartDate(e,t,n);default:return null}}},{key:"sliceWeeklyStartDate",value:function(e,t,n){var r=this.ICAL;if(1!==t.interval||!sn()(t.count))return null;var i=t.parts;if(1!==Object.keys(i).length)return null;if(!this.util.getByPartValues("BYDAY",i).length)return null;for(var o=this.timeUtil.adjust(n,{seconds:-1*e.duration.toSeconds()});o.dayOfWeek()!==e.startDate.dayOfWeek();)o=this.timeUtil.adjust(o,{days:-1});var a=e.startDate,s=new r.Time({year:o.year,month:o.month,day:o.day,hour:a.hour,minute:a.minute,second:a.second});return a.toUnixTime()>s.toUnixTime()?null:s}}]),e}(),so=function(){function e(t){Qt()(this,e),this.ICAL=t}return Jt()(e,[{key:"adjust",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.days,r=void 0===n?0:n,i=t.hours,o=void 0===i?0:i,a=t.minutes,s=void 0===a?0:a,u=t.seconds,c=void 0===u?0:u;return e.clone().adjust(r,o,s,c)}},{key:"fromUnixTime",value:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).zone,n=void 0===t?this.ICAL.Timezone.utcTimezone:t,r=this.ICAL,i=r.Time,o=r.Timezone;if(![o.localTimezone,o.utcTimezone].includes(n))throw new Error("Only UTC and floating zones are implemented.");var a=this.adjust(i.epochTime,{seconds:e});return a._cachedUnixTime=e,a.zone=n,a}},{key:"max",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.reduce(function(e,t){return t.toUnixTime()>e.toUnixTime()?t:e})}},{key:"min",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.reduce(function(e,t){return t.toUnixTime()<e.toUnixTime()?t:e})}}]),e}(),uo={Sunday:"SU",Monday:"MO",Tuesday:"TU",Wednesday:"WE",Thursday:"TH",Friday:"FR",Saturday:"SA"},co=function(){function e(t){Qt()(this,e),this.ICAL=t,this.defaultProdid="+//IDN ki-wi.cz//NONSGML Player Lighter//EN",this.defaultVersion="2.0"}return Jt()(e,[{key:"cloneComponent",value:function(e){return new this.ICAL.Component(e.toJSON())}},{key:"cloneProperty",value:function(e){return new this.ICAL.Property(e.toJSON())}},{key:"createExdateProperty",value:function(e){var t=e.map(function(e){return e.toICALString()});return new this.ICAL.Property(["exdate",{},"date-time"].concat(Hr()(t)))}},{key:"createVCalendar",value:function(e){var t=e.prodid,n=void 0===t?this.defaultProdid:t,r=e.subcomponents,i=void 0===r?[]:r,o=e.version,a=void 0===o?this.defaultVersion:o,s=new this.ICAL.Component(["vcalendar",[],[]]);return s.updatePropertyWithValue("version",a),s.updatePropertyWithValue("prodid",n),i.forEach(function(e){s.addSubcomponent(e)}),s}},{key:"createVEvent",value:function(e){var t=e.endDate,n=e.excludedDates,r=void 0===n?[]:n,i=e.recur,o=e.recurrenceDate,a=e.stamp,s=e.startDate,u=e.summary,c=void 0===u?"":u,l=e.uid,f=this.ICAL,h=new f.Component("vevent"),d=new f.Event(h);if(d.uid=l,h.addPropertyWithValue("dtstamp",a),d.startDate=s,d.endDate=t,sn()(i)||h.addPropertyWithValue("rrule",i),r.length){var p=this.createExdateProperty(r);h.addProperty(p)}return sn()(o)||(d.recurrenceId=o),c.length&&(d.summary=c),h}},{key:"getAllEvents",value:function(e){var t=this.ICAL;return this.relateEvents(e.getAllSubcomponents("vevent").map(function(e){return new t.Event(e,{exceptions:[]})}))}},{key:"getByPartValues",value:function(e,t){var n=t[e];return sn()(n)?[]:n}},{key:"getEndTime",value:function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).endDate;return sn()(e)?1/0:e.toUnixTime()}},{key:"getStartTime",value:function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).startDate;return sn()(e)?-1/0:e.toUnixTime()}},{key:"isEventWithinRange",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.endDate,r=t.startDate,i=this.getEndTime({endDate:n}),o=this.getStartTime({startDate:r});if(o>i)return!1;var a=e.endDate.toUnixTime(),s=e.startDate.toUnixTime();return!(s>=a)&&(o===i?o>=s&&o<a:i>s&&o<a)}},{key:"isRecurringEventWithinRange",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.endDate,i=n.startDate,o=this.getEndTime({endDate:r}),a=this.getStartTime({startDate:i});if(a>o)return!1;var s=t.until,u=e.startDate,c=e.duration.toSeconds(),l=this.getEndTime({endDate:s})+c,f=u.toUnixTime();return!(f>=l)&&(a===o?a>=f&&a<l:o>f&&a<l)}},{key:"parseRecurDay",value:function(e){switch(e){case 0:return uo.Sunday;case 1:return uo.Monday;case 2:return uo.Tuesday;case 3:return uo.Wednesday;case 4:return uo.Thursday;case 5:return uo.Friday;case 6:return uo.Saturday;default:throw new RangeError("Unknown day")}}},{key:"relateEvents",value:function(e){var t=this,n=wi()(e,function(e){return e.isRecurrenceException()}),r=n.true||[],i=n.false||[],o=wi()(r,function(e){return e.uid});return i.map(function(e){return new t.ICAL.Event(e.component,{exceptions:o[e.uid]||[],strictExceptions:!0})})}}]),e}(),lo=function(){function e(t,n){Qt()(this,e),this.controllerFactory=t,this.sourceCreator=n}return Jt()(e,[{key:"createController",value:function(){return this.controllerFactory.create()}},{key:"getSourceCreator",value:function(){return this.sourceCreator}},{key:"getUrl",value:function(e){return e.url}},{key:"isExtractable",value:function(){return!1}},{key:"isOfflineable",value:function(){return!1}},{key:"isPreloadable",value:function(e){return!0}}]),e}(),fo=function(){function e(t){Qt()(this,e),this.emitter=new en.a,this.scheduleInfo=null,this.viewerLifeCycle=t.create(),this.viewerSource=null}return Jt()(e,[{key:"destroy",value:function(){}},{key:"enter",value:function(){var e=this;return this.viewerLifeCycle.enter(function(){e.viewerSource.getFrame().enter()})}},{key:"getStretchClassName",value:function(e){switch(e){case jr.CONTAIN:return"image-viewer-controller--stretch-contain";case jr.COVER:return"image-viewer-controller--stretch-cover";case jr.FILL:return"image-viewer-controller--stretch-fill";default:throw new Error('Invalid stretch "'.concat(e,'".'))}}},{key:"leave",value:function(){var e=this;return this.viewerLifeCycle.leave(function(){e.viewerSource.getFrame().leave()})}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"release",value:function(){var e=this;return this.viewerLifeCycle.release(function(){e.viewerSource.getFrame().release(),e.scheduleInfo=null,e.viewerSource=null})}},{key:"seize",value:function(e,t){var n=this;return this.viewerLifeCycle.seize(function(){n.scheduleInfo=e,n.viewerSource=t;var r=e.getStretchEnum(),i=e.getUrl(),o=t.getEl(),a=t.getFrame(),s=n.getStretchClassName(r);a.seize(e),o.classList.add("image-viewer-controller",s),o.style.backgroundImage='url("'.concat(i,'")'),n.emitter.emit("loaded")})}}]),e}(),ho=function(){function e(t,n){Qt()(this,e),this.ImageViewerController=t,this.lifeCycleFactory=n}return Jt()(e,[{key:"create",value:function(){return new this.ImageViewerController(this.lifeCycleFactory)}}]),e}(),po=function(){function e(t,n){Qt()(this,e),this.JavascriptStateMachine=t,this.StateMachine=n}return Jt()(e,[{key:"create",value:function(e){return new this.StateMachine(this.JavascriptStateMachine,e)}}]),e}(),vo=n(56),mo=n.n(vo),yo=function(){function e(t,n){var r=this;Qt()(this,e),this.pendingPromise=null,this.jsm=new t(Xn()({},n,{methods:{onBeforeTransition:function(){return r.onBeforeTransition.apply(r,arguments)},onInvalidTransition:function(){return r.onInvalidTransition.apply(r,arguments)},onPendingTransition:function(){return r.onPendingTransition.apply(r,arguments)}}}))}return Jt()(e,[{key:"getState",value:function(){return this.jsm.state}},{key:"onBeforeTransition",value:function(){return this.pendingPromise}},{key:"onInvalidTransition",value:function(e,t){throw new Error('Invalid transition "'.concat(e,'" from the state "').concat(t,'".'))}},{key:"onPendingTransition",value:function(e,t){throw new Error('Can not transition "'.concat(e,'" from the state "').concat(t,'". Another transition is pending.'))}},{key:"transit",value:function(e,t){if(!mo()(t))throw TypeError("Invalid callback ".concat(t,"."));var n=this.jsm;n.cannot(e)&&this.onInvalidTransition(e,n.state);var r=t();return n[e](),r}},{key:"transitAsync",value:function(e,t){var n=this;return new Promise(function(r){if(!mo()(t))throw TypeError("Invalid callback ".concat(t,"."));var i=n.jsm,o=n.pendingPromise;sn()(o)||n.onPendingTransition(e,i.state),i.cannot(e)&&n.onInvalidTransition(e,i.state);var a=n.wrapPromise(t);return n.pendingPromise=a,r(n.jsm[e]().then(function(){return a}).finally(function(){n.pendingPromise=null}))})}},{key:"wrapPromise",value:function(e){return new Promise(function(t){return t(e())})}}]),e}(),go=function(){function e(t){Qt()(this,e),this.stateMachine=t.create({init:"created",transitions:[{name:"enter",from:"seized",to:"entered"},{name:"leave",from:"entered",to:"left"},{name:"release",from:["left","seized"],to:"released"},{name:"seize",from:"created",to:"seized"}]})}return Jt()(e,[{key:"enter",value:function(e){return this.stateMachine.transitAsync("enter",e)}},{key:"leave",value:function(e){return this.stateMachine.transitAsync("leave",e)}},{key:"release",value:function(e){return this.stateMachine.transitAsync("release",e)}},{key:"seize",value:function(e){return this.stateMachine.transitAsync("seize",e)}}]),e}(),bo=function(){function e(t,n){var r=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).scroll,i=void 0!==r&&r;Qt()(this,e),this.emitter=new en.a,this.loadDelay=t,this.loadTimeout=null,this.preflighter=n,this.scheduleInfo=null,this.scroll=i;var o=new po(Rt.a,yo);this.viewerLifeCycle=new go(o),this.viewerSource=null,this.onElementError=this.onElementError.bind(this),this.onElementLoad=this.onElementLoad.bind(this),this.onLoadTimeout=this.onLoadTimeout.bind(this)}return Jt()(e,[{key:"bindElement",value:function(e){e.addEventListener("error",this.onElementError),e.addEventListener("load",this.onElementLoad)}},{key:"destroy",value:function(){var e=this.viewerSource;if(!sn()(e)){var t=e.getEl();this.unbindElement(t)}}},{key:"enter",value:function(){var e=this;return this.viewerLifeCycle.enter(function(){e.viewerSource.getFrame().enter()})}},{key:"leave",value:function(){var e=this;return this.viewerLifeCycle.leave(function(){e.viewerSource.getFrame().leave()})}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onElementError",value:function(){clearTimeout(this.loadTimeout);var e=new Error("Unknown HTMLIframeElement error.");this.emitter.emit("error",e)}},{key:"onElementLoad",value:function(){clearTimeout(this.loadTimeout),this.emitter.emit("loaded")}},{key:"onLoadTimeout",value:function(){var e=new Error("HTMLIframeElement load timed out.");this.emitter.emit("error",e)}},{key:"onPreflightError",value:function(e){e.level=fn.a.Warning,this.emitter.emit("error",e)}},{key:"release",value:function(){var e=this;return this.viewerLifeCycle.release(function(){var t=e.viewerSource;t.getFrame().release();var n=t.getEl();e.unbindElement(n),clearTimeout(e.loadTimeout),e.scheduleInfo=null,e.viewerSource=null})}},{key:"seize",value:function(e,t){var n=this;return this.viewerLifeCycle.seize(function(){n.scheduleInfo=e,n.viewerSource=t,t.getFrame().seize(e);var r=t.getEl();n.bindElement(r),r.classList.add("viewer-controller-iframe"),r.sandbox="allow-forms allow-same-origin allow-scripts",n.scroll||(r.classList.add("viewer-controller-iframe--no-scroll"),r.scrolling="no");var i=e.getUrl();n.preflighter.preflight(i).catch(function(e){return n.onPreflightError(e)}),n.loadTimeout=setTimeout(n.onLoadTimeout,n.loadDelay),r.src=i})}},{key:"unbindElement",value:function(e){e.removeEventListener("error",this.onElementError),e.removeEventListener("load",this.onElementLoad)}}]),e}(),wo=function(){function e(t,n,r){Qt()(this,e),this.loadDelay=t,this.preflighter=n,this.sourceCreator=r}return Jt()(e,[{key:"createController",value:function(){return new bo(this.loadDelay,this.preflighter,{scroll:!0})}},{key:"getSourceCreator",value:function(){return this.sourceCreator}},{key:"getUrl",value:function(e){return e.url}},{key:"isExtractable",value:function(){return!1}},{key:"isOfflineable",value:function(){return!1}},{key:"isPreloadable",value:function(e){return!1}}]),e}(),_o="DEV",ko="PROD",xo="TEST",Eo=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"generate",value:function(e){switch(e){case _o:return"development";case ko:return"production";case xo:return"testing";default:return null}}},{key:"parse",value:function(e){switch(e){case"dev":case"development":return _o;case"prod":case"production":return ko;case"test":case"testing":return xo;default:return null}}}]),e}();var To=function(e,t,n,r,i){var o=sn()(r)?t.create():i.create(r);return o.setInfo({buildId:e,envEnum:Eo.parse(n)}),o},Ao=function(){function e(t,n,r){Qt()(this,e),this.appManager=t,this.firmwareManager=n,this.logger=r}return Jt()(e,[{key:"getInfo",value:function(){var e=this;return new Promise(function(t){return t([function(){return e.getManufacturer()},function(){return e.getModelName()},function(){return e.getRuntimePlatform()},function(){return e.getUpdatePlatform()},function(){return e.getUpdateUrl()}].reduce(function(t,n){return t.then(function(t){return n().then(function(e){return Object.assign(t,e)}).catch(function(n){return n.name!==Bi.NotSupportedError&&e.logger.error(n),t})})},Promise.resolve({})))})}},{key:"getManufacturer",value:function(){var e=this;return new Promise(function(t){return t(e.firmwareManager.getManufacturer().then(function(e){return{manufacturer:e}}))})}},{key:"getModelName",value:function(){var e=this;return new Promise(function(t){return t(e.firmwareManager.getModelName().then(function(e){return{modelName:e}}))})}},{key:"getRuntimePlatform",value:function(){var e=this;return new Promise(function(t){return t(e.appManager.getRuntimePlatform().then(function(e){return{runtimePlatform:e}}))})}},{key:"getUpdatePlatform",value:function(){var e=this;return new Promise(function(t){return t(e.appManager.getUpdatePlatform().then(function(e){return{updatePlatform:e}}))})}},{key:"getUpdateUrl",value:function(){var e=this;return new Promise(function(t){return t(e.appManager.getUpdateUrl().then(function(e){return{updateUrl:e}}))})}}]),e}(),So=function(){function e(t){Qt()(this,e),this.maxDelay=t}return Jt()(e,[{key:"clearInterval",value:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(e){return clearInterval(e)})},{key:"clearTimeout",value:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(e){return clearTimeout(e)})},{key:"mapSetArgs",value:function(e){var t=e[1];return!kn()(t)||isNaN(t)?e:[].concat(Hr()(e.slice(0,1)),[Math.min(t,this.maxDelay)],Hr()(e.slice(2)))}},{key:"setInterval",value:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=this.mapSetArgs(t);return setInterval.apply(void 0,Hr()(r))})},{key:"setTimeout",value:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=this.mapSetArgs(t);return setTimeout.apply(void 0,Hr()(r))})}]),e}(),Co=n(264),Io=function(e){function t(e){var n;if(Qt()(this,t),ji()(e))throw new SyntaxError("Invalid Media Type: ".concat(e));var r=n=ur()(this,lr()(t).call(this,e));if("*"===r.type&&"*"!==r.subtype)throw new SyntaxError("Invalid top-level type range: ".concat(e));return n}return hr()(t,e),Jt()(t,[{key:"equals",value:function(e){return this.toString()===e.toString()}}]),t}(n.n(Co).a),Oo=function(){function e(){Qt()(this,e),this.mediumRecordArray=[]}return Jt()(e,[{key:"find",value:function(e){var t=new Io(e);if("*"===t.type||"*"===t.subtype)throw new SyntaxError("Type range is not supported.");var n=this.mediumRecordArray.filter(function(e){return t.match(e.mediumType)}).sort(function(e,t){return Io.comparator(e.mediumType,t.mediumType)});return n.length?n[0].value:null}},{key:"getAll",value:function(){return this.mediumRecordArray.map(function(e){return e.value})}},{key:"register",value:function(e,t){In()(e)?this.registerMany(e,t):this.registerOne(e,t)}},{key:"registerOne",value:function(e,t){var n=new Io(e);if(Object.keys(n.parameters).length)throw new SyntaxError("Parameters are not supported.");if(this.mediumRecordArray.find(function(e){return n.equals(e.mediumType)}))throw new Error("Similar media type is already registered.");var r={mediumType:n,value:t};return this.mediumRecordArray.push(r),r}},{key:"registerMany",value:function(e,t){var n=this;return e.map(function(e){return n.registerOne(e,t)})}}]),e}(),Po=function(){function e(t){Qt()(this,e),this.nanoid=t}return Jt()(e,[{key:"generate",value:function(){return this.nanoid.nanoid()}}]),e}(),Do=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"getAllConnections",value:function(){return new Promise(function(e){return e([])})}}]),e}(),Lo=n(263),Mo=n.n(Lo),jo=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"flatten",value:function(e){var t=this,n=e.child;return(void 0===n?[]:n).reduce(function(e,n){return e.concat(t.flatten(n))},[Mo()(e,"id","name")])}}]),e}(),No=function(){function e(t,n){Qt()(this,e),this.controllerFactory=t,this.sourceCreator=n}return Jt()(e,[{key:"createController",value:function(){return this.controllerFactory.create()}},{key:"getSourceCreator",value:function(){return this.sourceCreator}},{key:"getUrl",value:function(e){return e.url}},{key:"isExtractable",value:function(){return!1}},{key:"isOfflineable",value:function(){return!1}},{key:"isPreloadable",value:function(e){return!1}}]),e}(),Ro=function(){function e(t,n,r,i){Qt()(this,e),this.emitter=new en.a,this.connection=t({childOrigin:r,iframe:n,methods:{durationchange:this.onDurationchange.bind(this),ended:this.onEnded.bind(this),error:this.onError.bind(this)},timeout:i}),n.src="pdf-viewer/viewer.html"}return Jt()(e,[{key:"destroy",value:function(){this.connection.destroy()}},{key:"getSrc",value:function(){var e=this;return new Promise(function(t){return t(e.connection.promise.then(function(e){return e.getSrc()}))})}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onDurationchange",value:function(e){return this.emitter.emit("durationchange",e)}},{key:"onEnded",value:function(){return this.emitter.emit("ended")}},{key:"onError",value:function(e){var t=new Error(e);return this.emitter.emit("error",t)}},{key:"pause",value:function(){var e=this;return new Promise(function(t){return t(e.connection.promise.then(function(e){return e.pause()}))})}},{key:"play",value:function(){var e=this;return new Promise(function(t){return t(e.connection.promise.then(function(e){return e.play()}))})}},{key:"setCurrentPage",value:function(e){var t=this;return new Promise(function(n){return n(t.connection.promise.then(function(t){return t.setCurrentPage(e)}))})}},{key:"setPlaybackRate",value:function(e){var t=this;return new Promise(function(n){return n(t.connection.promise.then(function(t){return t.setPlaybackRate(e)}))})}},{key:"setSrc",value:function(e){var t=this;return new Promise(function(n){return n(t.connection.promise.then(function(t){return t.setSrc(e)}))})}}]),e}(),Fo=function(){function e(t,n,r,i){Qt()(this,e),this.PdfParent=t,this.connectToChild=n,this.origin=r,this.timeout=i}return Jt()(e,[{key:"create",value:function(e){return new this.PdfParent(this.connectToChild,e,this.origin,this.timeout)}}]),e}(),Bo=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"recycle",value:function(e){return new Promise(function(t){return t(e.pause().then(function(){return e.setPlaybackRate(1)}).then(function(){return e.setCurrentPage(1)}))})}}]),e}(),Uo=function(){function e(t){Qt()(this,e),this.emitter=new en.a,this.onDurationchange=this.onDurationchange.bind(this),this.onElementError=this.onElementError.bind(this),this.onEnded=this.onEnded.bind(this),this.onParentError=this.onParentError.bind(this),this.parent=null,this.scheduleInfo=null,this.viewerLifeCycle=t.create(),this.viewerSource=null}return Jt()(e,[{key:"bindElement",value:function(e){e.addEventListener("error",this.onElementError)}},{key:"bindParent",value:function(e){e.on("durationchange",this.onDurationchange),e.on("ended",this.onEnded),e.on("error",this.onParentError)}},{key:"destroy",value:function(){var e=this.parent,t=this.viewerSource;if(sn()(e)||this.unbindParent(e),!sn()(t)){var n=t.getEl();this.unbindElement(n)}}},{key:"enter",value:function(){var e=this;return this.viewerLifeCycle.enter(function(){return e.viewerSource.getFrame().enter(),e.parent.play()})}},{key:"leave",value:function(){var e=this;return this.viewerLifeCycle.leave(function(){return e.viewerSource.getFrame().leave(),e.parent.pause()})}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onDurationchange",value:function(e){var t=this.scheduleInfo.getPlayDuration();if(0!==t){var n=1e3*e/t;return this.parent.setPlaybackRate(n)}}},{key:"onElementError",value:function(){var e=new Error("Unknown HTMLIframeElement error.");this.emitter.emit("error",e)}},{key:"onEnded",value:function(){this.emitter.emit("played")}},{key:"onParentError",value:function(e){this.emitter.emit("error",e)}},{key:"release",value:function(){var e=this;return this.viewerLifeCycle.release(function(){var t=e.viewerSource;t.getFrame().release();var n=t.getEl();e.unbindElement(n),e.scheduleInfo=null,e.viewerSource=null})}},{key:"seize",value:function(e,t){var n=this;return this.viewerLifeCycle.seize(function(){n.scheduleInfo=e,n.viewerSource=t,t.getFrame().seize(e);var r=t.getEl();n.bindElement(r),r.classList.add("pdf-viewer-controller"),r.sandbox="allow-forms allow-same-origin allow-scripts",r.scrolling="no";var i=e.getUrl(),o=t.getParent();return n.parent=o,n.bindParent(o),o.setSrc(i)})}},{key:"unbindElement",value:function(e){e.removeEventListener("error",this.onElementError)}},{key:"unbindParent",value:function(e){e.off("durationchange",this.onDurationchange),e.off("ended",this.onEnded),e.off("error",this.onParentError)}}]),e}(),zo=function(){function e(t,n){Qt()(this,e),this.PdfViewerController=t,this.viewerLifeCycleFactory=n}return Jt()(e,[{key:"create",value:function(){return new this.PdfViewerController(this.viewerLifeCycleFactory)}}]),e}(),$o=function(){function e(t,n){Qt()(this,e),this.parent=t,this.sourceIframe=n}return Jt()(e,[{key:"destroy",value:function(){this.parent.destroy(),this.sourceIframe.destroy()}},{key:"getEl",value:function(){return this.sourceIframe.getEl()}},{key:"getFrame",value:function(){return this.sourceIframe.getFrame()}},{key:"getParent",value:function(){return this.parent}},{key:"setParentEl",value:function(e){return this.sourceIframe.setParentEl(e)}}]),e}(),Vo=function(){function e(t,n,r,i){Qt()(this,e),this.pool=n.create(i,{max:t}),this.poolFactory=n,this.poolMap={},this.recycler=r,this.sourceFactory=i}return Jt()(e,[{key:"delete",value:function(e){var t=this;return new Promise(function(n){return e.getFrame().repair(),n(t.findPool(e).delete(e))})}},{key:"destroy",value:function(){}},{key:"findPool",value:function(e){var t=Object.values(this.poolMap).find(function(t){return t.isLent(e)});if(sn()(t))throw new Error("Object ".concat(e," is not lent."));return t}},{key:"getLent",value:function(){return Object.values(this.poolMap).reduce(function(e,t){return e-t.getAvailable()},this.pool.getLent())}},{key:"getMax",value:function(){return this.pool.getMax()}},{key:"lend",value:function(e,t){var n=this;return new Promise(function(r){var i=n.poolMap,o=n.sourceFactory;o.setParentEl(e),o.setScheduleInfo(t);var a=t.getUrl(),s=i[a];if(!sn()(s))return r(s.lend());var u=n.poolFactory.create({create:function(){return n.pool.lend()},delete:function(e){return n.pool.delete(e)}});return i[a]=u,r(u.lend())})}},{key:"receive",value:function(e){var t=this;return new Promise(function(n){return n(t.recycler.recycle(e.getParent()).then(function(){t.findPool(e).receive(e)}))})}},{key:"replace",value:function(){var e=this;return new Promise(function(t){return t(Object.entries(e.poolMap).reduce(function(t,n){var r=ln()(n,2),i=r[0],o=r[1];return t.then(function(){if(!(o.getLent()>0))return o.destroy().then(function(){delete e.poolMap[i]})})},Promise.resolve()))})}}]),e}(),Yo=function(){function e(t,n,r){Qt()(this,e),this.PdfViewerSource=t,this.iframeCreator=n,this.parentEl=null,this.parentFactory=r,this.scheduleInfo=null}return Jt()(e,[{key:"create",value:function(){var e=this;return new Promise(function(t){return t(e.iframeCreator.lend(e.parentEl,e.scheduleInfo).then(function(t){var n=t.getEl(),r=e.parentFactory.create(n);return new e.PdfViewerSource(r,t)}))})}},{key:"delete",value:function(e){return e.destroy()}},{key:"setParentEl",value:function(e){this.parentEl=e}},{key:"setScheduleInfo",value:function(e){this.scheduleInfo=e}}]),e}(),Ho={ArrowDown:"ArrowDown",ArrowLeft:"ArrowLeft",ArrowRight:"ArrowRight",ArrowUp:"ArrowUp",Back:"Back",Enter:"Enter"},qo=n(262),Wo={name:"LoaderContainer",template:n.n(qo).a},Go=n(261),Ko={name:"CountdownRoot",template:n.n(Go).a,data:function(){return{remaining:0}},destroyed:function(){this.stop()},methods:{getDelay:function(){return this.end-Date.now()},onEnd:function(){this.endTimeout=null,clearInterval(this.tickInterval),this.tickInterval=null,this.onTick(),this.$emit("end")},onTick:function(){var e=this.getDelay();this.remaining=Math.max(0,Math.round(e/1e3))},start:function(){if(this.endTimeout||this.tickInterval)throw new Error("Already started.");var e=this.getDelay();this.endTimeout=setTimeout(this.onEnd,e),this.tickInterval=setInterval(this.onTick,1e3),this.onTick()},stop:function(){clearTimeout(this.endTimeout),this.endTimeout=null,clearInterval(this.tickInterval),this.tickInterval=null}},mounted:function(){this.start()},props:{end:{type:Number}}},Qo={inserted:function(e,t){(sn()(t.value)||t.value)&&e.focus()}},Zo=n(260),Jo={name:"SetupFailure",template:n.n(Zo).a,components:{CountdownRoot:Ko},directives:{focus:Qo},methods:{onBack:function(){this.$emit("back")},onEnd:function(){this.retry()},onRetry:function(){this.retry()},retry:function(){this.$emit("retry")}},props:["message","retryTime"]},Xo=n(259),ea={name:"SetupHeader",template:n.n(Xo).a,methods:{onBack:function(){this.$emit("back")}},props:["isOnline","title"]},ta=n(258),na={name:"SetupManual",template:n.n(ta).a,components:{SetupHeader:ea},created:function(){this.submitted=!1},directives:{focus:Qo},data:function(){return{field:{deviceName:{label:"Device name (optional)",value:this.deviceName},password:{label:"Password",validator:"required",value:this.password},username:{label:"Username",validator:"required",value:this.username}}}},methods:{handleError:function(e){this.$root.logger.error(e)},onBack:function(){this.$emit("back")},onChange:function(){var e=this;new Promise(function(t){return e.submitted?t(e.$validator.validateAll()):t()}).catch(function(t){return e.handleError(t)})},onSubmit:function(){var e=this;new Promise(function(t){return e.submitted=!0,t(e.$validator.validateAll())}).then(function(t){if(t){var n=e.field;e.$emit("submit",n.deviceName.value,n.username.value,n.password.value)}}).catch(function(t){return e.handleError(t)})}},props:["deviceName","isOnline","password","username"]},ra=n(257),ia={name:"SetupOrganization",template:n.n(ra).a,components:{SetupHeader:ea},directives:{focus:Qo},methods:{onBack:function(){this.$emit("back")},onSubmit:function(e){this.$emit("submit",e)}},props:["isOnline","organizationArray"]},oa=n(256),aa={name:"SetupPanelLeft",template:n.n(oa).a},sa=n(255),ua={name:"ClockRoot",template:n.n(sa).a,created:function(){this.interval=setInterval(this.refresh,this.delay),this.refresh()},data:function(){return{value:null}},destroyed:function(){clearInterval(this.interval)},methods:{refresh:function(){var e=new Date,t=String(e.getHours()),n=String(e.getMinutes()).padStart(2,"0");this.value="".concat(t,":").concat(n)}},props:{delay:{type:Number,required:!0}}},ca=n(254),la={name:"SetupPanelRight",template:n.n(ca).a,components:{ClockRoot:ua},computed:{className:function(){return this.isOnline?"setup-connectivity--online":"setup-connectivity--offline"}},data:function(){return{delay:1e3}},props:["isOnline"]},fa=n(253),ha=n.n(fa),da=n(252),pa={name:"SetupQr",template:n.n(da).a,directives:{focus:Qo},methods:{onManual:function(){this.$emit("manual")},onSettings:function(){this.$emit("settings")}},mounted:function(){this.qriuous=new ha.a({element:this.$refs.canvasEl,level:"L",size:340,value:this.$root.setupManager.getQrUrl(this.serverUrl,this.$root.session.fingerprint)})},props:["serverUrl"]},va=n(251),ma={name:"SetupSettings",template:n.n(va).a,components:{SetupHeader:ea},created:function(){this.submitted=!1},directives:{focus:Qo},data:function(){return{field:{serverUrl:{label:"Server URL",validator:{required:!0,url:{require_tld:!1}},value:this.serverUrl}}}},methods:{handleError:function(e){this.$root.logger.error(e)},onBack:function(){this.$emit("back")},onChange:function(){var e=this;new Promise(function(t){return e.submitted?t(e.$validator.validateAll()):t()}).catch(function(t){return e.handleError(t)})},onReset:function(){this.field.serverUrl.value=this.defaultServerUrl},onSubmit:function(){var e=this;new Promise(function(t){return e.submitted=!0,t(e.$validator.validateAll())}).then(function(t){t&&e.$emit("submit",e.field.serverUrl.value)}).catch(function(t){return e.handleError(t)})}},props:["defaultServerUrl","isOnline","serverUrl"]},ya=n(250),ga={name:"SetupSuccess",template:n.n(ya).a,components:{CountdownRoot:Ko},directives:{focus:Qo},methods:{finish:function(){this.$emit("finish")},onClick:function(){this.finish()},onEnd:function(){this.finish()}},props:["time"]},ba=n(249),wa={name:"SetupRoot",template:n.n(ba).a,components:{LoaderContainer:Wo,SetupFailure:Jo,SetupManual:na,SetupOrganization:ia,SetupPanelLeft:aa,SetupPanelRight:la,SetupQr:pa,SetupSettings:ma,SetupSuccess:ga},created:function(){var e=this,t=this.$root,n=t.virtualKeyboardManager;this.automaticEnabled=!1,this.automaticTimeout=null,this.deviceId=null,this.organization=null,this.fingerprint=t.session.fingerprint,t.controlManager.on("buttonDown",this.onButtonDown),t.focusManager.start(),t.networkListener.on("onlineChanged",this.onOnlineChanged),n.on("infoChanged",this.onVirtualKeyboardChanged),n.getInfo().then(function(t){e.rootStyle=e.getRootStyle(t)}).then(function(){return e.startAutomatic()}).catch(function(t){return e.handleError(t)})},data:function(){var e=Pr.a.setup.serverUrl;return{defaultServerUrl:e,deviceName:Pr.a.setup.deviceName,failureMessage:null,failureRetryDelay:null,failureRetryTime:null,isOnline:this.$root.networkListener.isOnline(),organizationArray:[],page:"qr",password:Pr.a.setup.password,rootStyle:null,serverUrl:e,successTime:null,username:Pr.a.setup.username}},destroyed:function(){var e=this.$root;this.stopAutomatic(),e.controlManager.off("buttonDown",this.onButtonDown),e.focusManager.start(),e.networkListener.off("onlineChanged",this.onOnlineChanged),e.virtualKeyboardManager.off("infoChanged",this.onVirtualKeyboardChanged)},methods:{back:function(){switch(this.page){case"failure":return this.onFailureBack();case"manual":return this.onManualBack();case"organization":return this.onOrganizationBack();case"settings":return this.onSettingsBack();default:return this.$root.appManager.exit()}},getRootStyle:function(e){return e.isOverlapping()?{paddingBottom:e.getHeight()}:null},handleError:function(e){this.$root.logger.error(e)},install:function(e,t){var n=this;return new Promise(function(r){return r(n.$root.device.install(e,t).then(function(){return n.showSuccess()}))})},onAutomatic:function(){var e=this;new Promise(function(t){return t(e.registerAutomatic())}).catch(function(t){return e.handleError(t)}).finally(function(){e.automaticEnabled&&(e.automaticTimeout=setTimeout(e.onAutomatic,Pr.a.setup.automaticDelay))})},onButtonDown:function(e){e===Ho.Back&&this.back()},onFailureBack:function(){this.showManual()},onFailureRetry:function(){var e=this;new Promise(function(t){var n=Pr.a.setup,r=n.failureDelayMultiplier,i=n.failureDelayMax;e.failureRetryDelay=Math.min(e.failureRetryDelay*r,i),e.showLoader();var o=e.organization;return sn()(o)?t(e.registerManualSimple(e.serverUrl,e.username,e.password,e.deviceName)):t(e.registerManualComplete(e.serverUrl,e.username,e.password,o.id,e.deviceName))}).catch(function(t){return e.showFailure(t)})},onFinish:function(){this.$emit("finish")},onManual:function(){this.showManual()},onManualBack:function(){this.showQr()},onManualSubmit:function(e,t,n){var r=this;new Promise(function(i){return r.failureRetryDelay=Pr.a.setup.failureDelayBase,r.deviceName=e,r.password=n,r.username=t,r.showLoader(),i(r.registerManualSimple(r.serverUrl,t,n,e))}).catch(function(e){return r.showFailure(e)})},onOnlineChanged:function(e){this.isOnline=e},onOrganizationBack:function(){this.showManual()},onOrganizationSubmit:function(e){var t=this;new Promise(function(n){return t.failureRetryDelay=Pr.a.setup.failureDelayBase,t.organization=e,t.showLoader(),n(t.registerManualComplete(t.serverUrl,t.username,t.password,e.id,t.deviceName))}).catch(function(e){return t.showFailure(e)})},onSettings:function(){this.showSettings()},onSettingsBack:function(){this.showQr()},onSettingsSubmit:function(e){this.serverUrl=e,this.showQr()},onVirtualKeyboardChanged:function(e){this.rootStyle=this.getRootStyle(e)},registerAutomatic:function(){var e=this;return new Promise(function(t){var n=e.serverUrl;return t(e.$root.setupManager.registerAutomatic(n,e.fingerprint).then(function(t){if(!sn()(t))return e.install(t,n)}))})},registerManualSimple:function(e,t,n,r){var i=this;return new Promise(function(o){return o(i.$root.setupManager.fetchOrganizations(e,t,n).then(function(o){if(i.organizationArray=o,!o.length)throw new Error("No organizations available.");if(1===o.length){var a=o[0];return i.organization=a,i.registerManualComplete(e,t,n,a.id,r)}i.showOrganization()}))})},registerManualComplete:function(e,t,n,r,i){var o=this;return new Promise(function(a){return a(o.$root.setupManager.registerManual(e,o.fingerprint,t,n,i,r).then(function(t){return o.deviceId=t,o.install(t,e)}))})},showFailure:function(e){this.failureMessage=e.message,this.failureRetryTime=Date.now()+this.failureRetryDelay,this.page="failure",e.name!==Bi.SetupError&&this.handleError(e)},showLoader:function(){this.page="loader"},showManual:function(){this.stopAutomatic(),this.page="manual"},showOrganization:function(){this.page="organization"},showQr:function(){this.startAutomatic(),this.page="qr"},showSettings:function(){this.page="settings"},showSuccess:function(){this.stopAutomatic(),this.successTime=Date.now()+Pr.a.setup.successDelay,this.page="success"},startAutomatic:function(){this.automaticEnabled||(this.automaticEnabled=!0,this.onAutomatic())},stopAutomatic:function(){clearInterval(this.automaticTimeout),this.automaticTimeout=null,this.automaticEnabled=!1}}},_a=n(248),ka={name:"LoaderRoot",template:n.n(_a).a,components:{LoaderContainer:Wo}},xa=n(247),Ea={name:"ViewerRoot",template:n.n(xa).a,components:{LoaderRoot:ka},computed:{className:function(){switch(this.orientationEnum){case er.a.CLOCKWISE_0:return"viewer-root--orientation-0";case er.a.CLOCKWISE_90:return"viewer-root--orientation-90";case er.a.CLOCKWISE_180:return"viewer-root--orientation-180";case er.a.CLOCKWISE_270:return"viewer-root--orientation-270";default:return""}},loaderVisible:function(){return this.orientationEnum},rootVisible:function(){return this.contentReady&&this.orientationEnum}},created:function(){var e=this,t=this.$root.device;t.on("content",this.onContent),this.refresh(),t.connect().catch(function(t){return e.handleError(t)})},data:function(){return{contentReady:!sn()(this.$root.session.contentTimestamp),orientationEnum:null}},destroyed:function(){this.$root.device.off("content",this.onContent);var e=this.director;sn()(e)||this.destroyDirector(e)},methods:{createDirector:function(){var e=this.$root.device.createDirector(this.$el);return e.on("error",this.onError),e.on("entered",this.onEntered),e.on("played",this.onPlayed),e},destroyDirector:function(e){e.off("error",this.onError),e.off("entered",this.onEntered),e.off("played",this.onPlayed),this.$root.device.destroyDirector(e)},handleError:function(e){this.$emit("error",e)},onContent:function(){this.contentReady=!0,this.refresh()},onEntered:function(e){this.$emit("entered",e)},onError:function(e){this.handleError(e)},onPlayed:function(e){var t=this;this.$root.device.hit(e).catch(function(e){return t.handleError(e)})},refresh:function(){var e=this;this.$root.screenManager.getCssOrientation().then(function(t){e.orientationEnum=t}).catch(function(t){return e.handleError(t)})}},watch:{rootVisible:function(e){var t=this;e&&!this.director&&this.$nextTick(function(){var e=t.createDirector();t.director=e})}}},Ta=n(246),Aa={name:"PlayerRoot",template:n.n(Ta).a,components:{SetupRoot:wa,ViewerRoot:Ea},created:function(){this.reportEnabled=!0,this.reportDelay=250,this.reportTimeout=null;var e=this.$root,t=e.controlManager,n=e.device;t.on("buttonDown",this.onButtonDown),n.on("content",this.onContent),this.refresh()},data:function(){return{setupVisible:!1,viewerVisible:!1}},destroyed:function(){var e=this.$root,t=e.controlManager,n=e.device;t.off("buttonDown",this.onButtonDown),n.off("content",this.onContent),clearTimeout(this.reportTimeout)},methods:{back:function(){this.setupVisible||this.$root.appManager.exit()},handleError:function(e){this.$root.logger.error(e)},onButtonDown:function(e){e===Ho.Back&&this.back()},onContent:function(){this.reportEnabled=!0},onError:function(e){this.handleError(e)},onSetupFinish:function(){this.refresh()},onViewerEntered:function(){this.report()},refresh:function(){var e=this.$root.session.isInstalled();this.setupVisible=!e,this.viewerVisible=e},report:function(){var e=this;this.reportEnabled&&!this.reportTimeout&&this.$nextTick().then(function(){e.reportTimeout=setTimeout(function(){e.reportTimeout=null,e.$root.device.report().catch(function(t){return e.handleError(t)})},e.reportDelay)}).catch(function(t){return e.handleError(t)}),this.reportEnabled=!1}}},Sa=function(){function e(t,n,r,i,o,a,s,u,c,l,f){Qt()(this,e),this.appManager=t,this.controlManager=n,this.device=r,this.focusManager=i,this.logger=o,this.networkListener=a,this.screenManager=s,this.session=u,this.setupManager=c,this.virtualKeyboardManager=l,this.vueFactory=f}return Jt()(e,[{key:"createVue",value:function(e){var t=this;return new Promise(function(n){var r=t;t.vueFactory.create({components:{PlayerRoot:Aa},el:e,template:"<PlayerRoot/>",created:function(){this.appManager=r.appManager,this.controlManager=r.controlManager,this.device=r.device,this.focusManager=r.focusManager,this.logger=r.logger,this.networkListener=r.networkListener,this.screenManager=r.screenManager,this.session=r.session,this.setupManager=r.setupManager,this.virtualKeyboardManager=r.virtualKeyboardManager},mounted:n})})}},{key:"start",value:function(e){var t=this;return new Promise(function(n){return n(t.device.start().then(function(){return t.createVue(e)}))})}}]),e}(),Ca={DYNAMIC:"DYNAMIC",RANDOM:"RANDOM",STATIC:"STATIC"},Ia=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"parse",value:function(e){switch(e){case"dynamic":return Ca.DYNAMIC;case"linear":return Ca.STATIC;case"shuffle":return Ca.RANDOM;default:return null}}}]),e}(),Oa=function(){function e(t){Qt()(this,e),this.trackCommunicator=t}return Jt()(e,[{key:"parseMany",value:function(e){var t=this;return Mn.parseMany(e,function(e){return t.parseOne(e)},{playlist:{},track:{}})}},{key:"parseModel",value:function(e,t){return{id:t,scheduleEnum:Ia.parse(e.scheduler.type),volume:Mn.parseVolume(e.volume)}}},{key:"parseOne",value:function(e){var t=e.id;if(sn()(t))return{playlist:{},track:{}};var n=this.parseModel(e,t),r={playlist:Zn()({},t,n)},i=this.trackCommunicator.parseMany(e.tracks,t);return Ln()({},i,r)}}]),e}(),Pa=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"isIndex",value:function(e){return Number.isInteger(e)&&e>-1}}]),e}(),Da=function(){function e(t,n){if(Qt()(this,e),!e.isFactory(t))throw new TypeError("Invalid factory ".concat(t,"."));if(!e.isMax(n))throw new TypeError("Invalid maximum ".concat(n,"."));this.availableArray=[],this.factory=t,this.lentArray=[],this.max=n}return Jt()(e,[{key:"delete",value:function(e){this.removeLent(e),this.factory.delete(e)}},{key:"destroy",value:function(){var e=this.getLent();if(0!==e)throw new Error("There are some lent objects (".concat(e,")."));var t=this.getAvailable();this.drain(t)}},{key:"drain",value:function(e){var t=this;if(!Pa.isIndex(e))throw new TypeError("Invalid count ".concat(e,"."));if(e>this.getAvailable())throw new Error("Not enought objects available.");Array(e).fill().forEach(function(){var e=t.availableArray.pop();t.factory.delete(e)})}},{key:"fill",value:function(e){var t=this;if(!Pa.isIndex(e))throw new TypeError("Invalid count ".concat(e,"."));if(e>this.getMax()-this.getLength())throw new Error("Maximum count of objects exceeded.");Array(e).fill().forEach(function(){var e=t.factory.create();t.availableArray.push(e)})}},{key:"getAvailable",value:function(){return this.availableArray.length}},{key:"getLength",value:function(){return this.getAvailable()+this.getLent()}},{key:"getLent",value:function(){return this.lentArray.length}},{key:"getMax",value:function(){return this.max}},{key:"isLent",value:function(e){return this.lentArray.includes(e)}},{key:"lend",value:function(){var e=this.availableArray,t=this.lentArray;if(this.getAvailable()>0){var n=e.pop();return t.push(n),n}if(this.getMax()>this.getLength()){var r=this.factory.create();return t.push(r),r}throw new Error("Maximum count of objects exceeded.")}},{key:"receive",value:function(e){this.removeLent(e),this.availableArray.push(e)}},{key:"removeLent",value:function(e){var t=this.lentArray,n=t.indexOf(e);if(-1===n)throw new Error("Object ".concat(e," is not lent."));t.splice(n,1)}}],[{key:"isFactory",value:function(e){return nn()(e)&&mo()(e.create)}},{key:"isMax",value:function(e){return e===1/0||Pa.isIndex(e)}}]),e}(),La=function(){function e(t,n,r){Qt()(this,e);var i=n.createPool({create:function(){return t.create()},destroy:function(e){return t.delete(e)}},{autostart:!1,max:r===1/0?Number.MAX_SAFE_INTEGER:r,maxWaitingClients:0});i.on("factoryCreateError",function(e){i._waitingClientsQueue.dequeue().reject(e)}),this.pool=i}return Jt()(e,[{key:"delete",value:function(e){var t=this;return new Promise(function(n){var r=t.pool;if(!r.isBorrowedResource(e))throw new Error("Object ".concat(e," is not lent."));return n(r.destroy(e))})}},{key:"destroy",value:function(){var e=this;return new Promise(function(t){var n=e.pool;return t(n.drain().then(function(){return n.clear()}))})}},{key:"fill",value:function(e){var t=this;return new Promise(function(n){var r=t.pool;if(!Pa.isIndex(e))throw new TypeError("Invalid count ".concat(e,"."));if(e>t.getMax()-t.getLength())throw new Error("Maximum count of objects exceeded.");r._config.min=r._count+e,r._ensureMinimum(),setTimeout(n,0)})}},{key:"getAvailable",value:function(){return this.pool.available}},{key:"getLength",value:function(){return this.pool.size}},{key:"getLent",value:function(){return this.pool.borrowed}},{key:"getMax",value:function(){var e=this.pool.max;return e===Number.MAX_SAFE_INTEGER?1/0:e}},{key:"isLent",value:function(e){return this.pool.isBorrowedResource(e)}},{key:"lend",value:function(){var e=this;return new Promise(function(t){return t(e.pool.acquire())})}},{key:"receive",value:function(e){var t=this.pool;if(!t.isBorrowedResource(e))throw new Error("Object ".concat(e," is not lent."));t.release(e)}}]),e}(),Ma=function(){function e(t,n){Qt()(this,e),this.PoolAsync=t,this.genericPool=n}return Jt()(e,[{key:"create",value:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).max,n=void 0===t?1/0:t;return new this.PoolAsync(e,this.genericPool,n)}}]),e}(),ja=function(){function e(t){Qt()(this,e),this.Pool=t}return Jt()(e,[{key:"create",value:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).max,n=void 0===t?1/0:t;return new this.Pool(e,n)}}]),e}(),Na=function(){function e(t,n){Qt()(this,e);var r=document.createElement("div");r.classList.add("position-frame"),this.cssValue=t,this.el=r,this.scheduleInfo=null,this.stateMachine=n.create({init:"released",transitions:[{name:"enter",from:"seized",to:"entered"},{name:"leave",from:"entered",to:"left"},{name:"release",from:["left","seized"],to:"released"},{name:"repair",from:["entered","left","released","seized"],to:"released"},{name:"seize",from:"released",to:"seized"}]})}return Jt()(e,[{key:"enter",value:function(){var e=this;return this.stateMachine.transit("enter",function(){var t=e.scheduleInfo;Object.assign(e.el.style,{left:t.getLeft(),top:t.getTop()})})}},{key:"getEl",value:function(){return this.el}},{key:"hide",value:function(e){var t=e.getWidth(),n=e.getHeight();Object.assign(this.el.style,{left:this.negateCssValue(t),top:this.negateCssValue(n)})}},{key:"leave",value:function(){var e=this;return this.stateMachine.transit("leave",function(){e.hide(e.scheduleInfo)})}},{key:"negateCssValue",value:function(e){var t=this.cssValue(e);if(1!==t.length)throw new Error('Invalid CSS token count in "'.concat(e,'".'));var n=t[0],r=n.type,i=n.unit,o=n.value;if("number"!==r)throw new Error('Invalid CSS token type in "'.concat(e,'".'));return"-".concat(Math.abs(o)).concat(i)}},{key:"release",value:function(){return this.stateMachine.transit("release",Ii.a)}},{key:"repair",value:function(){var e=this;return this.stateMachine.transit("repair",function(){var t=e.scheduleInfo;sn()(t)||e.hide(t)})}},{key:"seize",value:function(e){var t=this;return this.stateMachine.transit("seize",function(){t.scheduleInfo=e,t.hide(e),Object.assign(t.el.style,{backgroundColor:e.getBackgroundColor(),height:e.getHeight(),width:e.getWidth(),zIndex:e.getZIndex()})})}}]),e}(),Ra=function(){function e(t,n,r){Qt()(this,e),this.PositionFrame=t,this.cssValue=n,this.stateMachineFactory=r}return Jt()(e,[{key:"create",value:function(){return new this.PositionFrame(this.cssValue,this.stateMachineFactory)}}]),e}(),Fa=function(){function e(){Qt()(this,e),this.bootDate=new Date}return Jt()(e,[{key:"createTimers",value:function(e,t){return Promise.resolve()}},{key:"deleteAllTimers",value:function(){return Promise.resolve()}},{key:"getBootDate",value:function(){var e=this;return new Promise(function(t){return t(e.bootDate)})}},{key:"reboot",value:function(){return new Promise(function(e){return location.reload(),e()})}},{key:"shutdown",value:function(){return new Promise(function(e){return location.href="about:blank",e()})}}]),e}(),Ba=function(){function e(t){Qt()(this,e),this.timerCommunicator=t}return Jt()(e,[{key:"parse",value:function(e,t){var n=this.timerCommunicator,r=e.daysOfWeek,i=e.id,o=t.inject("powerTask",{id:i}),a=n.parseMany(e.startTimes,i,Yn,r).timer,s=n.parseMany(e.endTimes,i,Hn,r).timer;return{powerTask:o,timerArray:t.inject("timer",Object.values(Ln()({},a,s)))}}}]),e}(),Ua=function(){function e(t,n){Qt()(this,e),this.primaryStore=t,this.taskConverter=n}return Jt()(e,[{key:"replace",value:function(e){var t=this;return new Promise(function(n){return n(t.primaryStore.replaceAsync("powerTask",JSON.parse(JSON.stringify(e.powerTasks)),null,{onConflict:"replace"}))})}},{key:"restore",value:function(e){var t=this;return new Promise(function(n){return n(t.primaryStore.findAll("powerTask").then(function(n){return n.length?n:e.reduce(function(e,n){var r=t.taskConverter.convert(t.primaryStore,n);return sn()(r)||e.push(r),e},[])}))})}}]),e}(),za=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"convert",value:function(e,t){return t.inject("task",{id:e.id,layoutId:null,mediumId:null,planIcal:null,playlistId:null,priority:null,targetEnum:null,taskEnum:ci.POWER})}}]),e}(),$a=n(245),Va=n.n($a),Ya=function(){function e(){Qt()(this,e),this.promise=Promise.resolve()}return Jt()(e,[{key:"enqueue",value:function(e){var t=this;return new Promise(function(n){var r=t.promise.catch(Ii.a).then(function(){return e()});return t.promise=r,n(r)})}}]),e}(),Ha=function(){function e(t){if(Qt()(this,e),!nn()(t))throw new TypeError("Invalid queue constructor ".concat(t,"."));this.Queue=t}return Jt()(e,[{key:"create",value:function(){return new this.Queue}}]),e}(),qa=function(){function e(t,n,r,i,o,a,s,u,c,l,f,h,d,p){Qt()(this,e),this.autorebootReplacer=t,this.contentTaskReplacer=n,this.downloader=r,this.emitter=new en.a,this.logger=i,this.powerTaskReplacer=o,this.primaryStore=a,this.promiseUtil=s,this.queue=u.create(),this.replacerCommon=c,this.replacerControl=l,this.replacerPower=f,this.replacerScreen=h,this.replacerSession=d,this.replacerSound=p,this.onContent=this.onContent.bind(this),this.onError=this.onError.bind(this),r.on("content",this.onContent),r.on("error",this.onError)}return Jt()(e,[{key:"applyContent",value:function(e){var t=this;return new Promise(function(n){return n([function(){return t.autorebootReplacer.replace(e)},function(){return t.replacerControl.replace(e)},function(){return t.replacerSound.replace(e)},function(){return t.replacerPower.replace(e)},function(){return t.replacerScreen.replace(e)}].reduce(function(e,n){return e.then(function(){return n().catch(function(e){return t.logger.error(e)})})},Promise.resolve()))})}},{key:"destroy",value:function(){this.downloader.off("content",this.onContent),this.downloader.off("error",this.onError),this.downloader.destroy()}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onContent",value:function(e){this.emitter.emit("content",e)}},{key:"onError",value:function(e){this.logger.error(e)}},{key:"replace",value:function(e){var t=this;return new Promise(function(n){return n(t.queue.enqueue(function(){return t.replaceContent(e).then(function(e){return t.applyContent(e).then(function(){return e})})}))})}},{key:"replaceContent",value:function(e){var t=this;return new Promise(function(n){return n(t.promiseUtil.allSerial([function(){return t.downloader.download(e)},function(){return t.replacerSession.replace(e)},function(){return t.replacerCommon.replace(e)},function(){return t.contentTaskReplacer.replace(e)},function(){return t.powerTaskReplacer.replace(e)}]).then(function(n){var r=ln()(n,5),i=(r[0],r[1]),o=r[2],a=r[3],s=r[4],u=t.primaryStore;return{contentTasks:a,firmwareRelease:e.firmwareRelease,layerArray:o.layer,layoutArray:o.layout,mediumArray:o.medium,playlistArray:o.playlist,powerTasks:s,session:i,store:u,taskArray:o.task,timerArray:o.timer,trackArray:o.track}}))})}},{key:"restore",value:function(){var e=this;return new Promise(function(t){return t(e.restoreContent().then(function(t){return e.applyContent(t).then(function(){return t})}))})}},{key:"restoreContent",value:function(){var e=this;return new Promise(function(t){return t(e.promiseUtil.allSerial([function(){return e.downloader.start()},function(){return e.replacerSession.restore()},function(){return e.replacerCommon.restore()}]).then(function(t){var n=ln()(t,3),r=(n[0],n[1]),i=n[2],o=e.primaryStore,a=i.task;return e.promiseUtil.allSerial([function(){return e.contentTaskReplacer.restore(a)},function(){return e.powerTaskReplacer.restore(a)}]).then(function(e){var t=ln()(e,2),n=t[0],s=t[1];return{contentTasks:n,firmwareRelease:null,layerArray:i.layer,layoutArray:i.layout,mediumArray:i.medium,playlistArray:i.playlist,powerTasks:s,session:r,store:o,taskArray:a,timerArray:i.timer,trackArray:i.track}})}))})}}]),e}(),Wa=function(){function e(t){Qt()(this,e),this.primaryStore=t,this.resources=[{contentInfoKey:"layerArray",resourceName:"layer"},{contentInfoKey:"layoutArray",resourceName:"layout"},{contentInfoKey:"mediumArray",resourceName:"medium"},{contentInfoKey:"playlistArray",resourceName:"playlist"},{contentInfoKey:"taskArray",resourceName:"task"},{contentInfoKey:"timerArray",resourceName:"timer"},{contentInfoKey:"trackArray",resourceName:"track"}]}return Jt()(e,[{key:"replace",value:function(e){var t=this;return new Promise(function(n){return n(t.resources.reduce(function(n,r){var i=r.contentInfoKey,o=r.resourceName;return n.then(function(n){var r=e[i],a=JSON.parse(JSON.stringify(r));return t.primaryStore.replaceAsync(o,a,null,{onConflict:"replace"}).then(function(e){return n[o]=e,n})})},Promise.resolve({})))})}},{key:"restore",value:function(){var e=this;return new Promise(function(t){return t(e.resources.reduce(function(t,n){var r=n.resourceName;return t.then(function(t){return e.primaryStore.findAll(r).then(function(e){return t[r]=e,t})})},Promise.resolve({})))})}}]),e}(),Ga=function(){function e(t,n){Qt()(this,e),this.controlManager=t,this.logger=n}return Jt()(e,[{key:"handleError",value:function(e){if(e.name===Bi.NotSupportedError)return this.logger.warn(e);throw e}},{key:"replace",value:function(e){var t=this;return new Promise(function(n){return n(t.replaceLocalLock(e).then(function(){return t.replaceRemoteLock(e)}))})}},{key:"replaceLocalLock",value:function(e){var t=this;return new Promise(function(n){var r=e.session.localControlLock;return sn()(r)?n():n(t.controlManager.setLocalLock(r).catch(function(e){return t.handleError(e)}))})}},{key:"replaceRemoteLock",value:function(e){var t=this;return new Promise(function(n){var r=e.session.remoteControlLock;return sn()(r)?n():n(t.controlManager.setRemoteLock(r).catch(function(e){return t.handleError(e)}))})}}]),e}(),Ka=function(){function e(t){Qt()(this,e),this.powerManager=t}return Jt()(e,[{key:"replace",value:function(e){var t=this;return new Promise(function(n){return n(t.powerManager.deleteAllTimers().then(function(){return t.powerManager.createTimers(e.powerTasks,e.timerArray)}))})}}]),e}(),Qa=function(){function e(t,n){Qt()(this,e),this.defaultOrientationEnum=t,this.screenManager=n}return Jt()(e,[{key:"getOrientation",value:function(e){return sn()(e)?this.defaultOrientationEnum:e}},{key:"replace",value:function(e){var t=this;return new Promise(function(n){return n(t.screenManager.setOrientation(t.getOrientation(e.session.orientationEnum)))})}}]),e}(),Za=function(){function e(t,n){Qt()(this,e),this.primaryStore=t,this.session=n}return Jt()(e,[{key:"replace",value:function(e){var t=this;return new Promise(function(n){var r=e.session,i=JSON.parse(JSON.stringify(r));return n(t.primaryStore.update("session",t.session.id,i))})}},{key:"restore",value:function(){var e=this;return new Promise(function(t){var n=e.primaryStore,r=e.session.id;return t(n.find("session",r).catch(function(){return n.create("session",{id:r})}))})}}]),e}(),Ja=function(){function e(t){Qt()(this,e),this.soundManager=t}return Jt()(e,[{key:"replace",value:function(e){var t=this;return new Promise(function(n){var r=e.session.volume;return sn()(r)?n():n(t.soundManager.setVolume(r))})}}]),e}(),Xa={Ethernet:"Ethernet",Wifi:"Wifi"},es=function(){function e(t,n,r,i,o,a,s,u,c,l,f,h){Qt()(this,e),this.appManager=t,this.controlManager=n,this.driveManager=r,this.firmwareManager=i,this.logger=o,this.memoryManager=a,this.networkManager=s,this.powerManager=u,this.screenManager=c,this.sensorManager=l,this.soundManager=f,this.timeManager=h}return Jt()(e,[{key:"getBootTimestamp",value:function(){var e=this;return new Promise(function(t){return t(e.powerManager.getBootDate().then(function(e){return{bootTimestamp:e.toISOString()}}))})}},{key:"getBrightness",value:function(){var e=this;return new Promise(function(t){return t(e.screenManager.getBrightness().then(function(e){return{brightness:e}}))})}},{key:"getDriveInfo",value:function(){var e=this;return new Promise(function(t){return t(e.driveManager.getInfo().then(function(e){return{driveInfo:e}}))})}},{key:"getFirmwareVersion",value:function(){var e=this;return new Promise(function(t){return t(e.firmwareManager.getVersion().then(function(e){return{firmwareVersion:e}}))})}},{key:"getImage",value:function(){var e=this;return new Promise(function(t){return t(e.screenManager.createScreenshot().then(function(e){return{image:e}}))})}},{key:"getInfo",value:function(){var e=this;return new Promise(function(t){return t([function(){return e.getBootTimestamp()},function(){return e.getBrightness()},function(){return e.getDriveInfo()},function(){return e.getFirmwareVersion()},function(){return e.getImage()},function(){return e.getLocalControlLock()},function(){return e.getManufacturer()},function(){return e.getMemory()},function(){return e.getModelName()},function(){return e.getMuted()},function(){return e.getNetwork()},function(){return e.getNowTimestamp()},function(){return e.getOrientation()},function(){return e.getRemoteControlLock()},function(){return e.getRuntimePlatform()},function(){return e.getSerialNumber()},function(){return e.getTemperature()},function(){return e.getTimezone()},function(){return e.getUpdatePlatform()},function(){return e.getUpdateUrl()},function(){return e.getVolume()}].reduce(function(t,n){return t.then(function(t){return n().then(function(e){return Object.assign(t,e)}).catch(function(n){return n.name!==Bi.NotSupportedError&&e.logger.error(n),t})})},Promise.resolve({})))})}},{key:"getLocalControlLock",value:function(){var e=this;return new Promise(function(t){return t(e.controlManager.getLocalLock().then(function(e){return{localControlLock:e}}))})}},{key:"getManufacturer",value:function(){var e=this;return new Promise(function(t){return t(e.firmwareManager.getManufacturer().then(function(e){return{manufacturer:e}}))})}},{key:"getMemory",value:function(){var e=this;return new Promise(function(t){return t(e.memoryManager.getInfo().then(function(e){return{totalRam:e.total,usedRam:e.used}}))})}},{key:"getModelName",value:function(){var e=this;return new Promise(function(t){return t(e.firmwareManager.getModelName().then(function(e){return{modelName:e}}))})}},{key:"getMuted",value:function(){var e=this;return new Promise(function(t){return t(e.soundManager.isMuted().then(function(e){return{muted:e}}))})}},{key:"getNetwork",value:function(){var e=this;return new Promise(function(t){return t(e.networkManager.getAllConnections().then(function(t){var n=e.getWired(t),r=e.getWireless(t);return Xn()({},n,r)}))})}},{key:"getNowTimestamp",value:function(){return new Promise(function(e){return e({nowTimestamp:(new Date).toISOString()})})}},{key:"getOrientation",value:function(){var e=this;return new Promise(function(t){return t(e.screenManager.getOrientation().then(function(e){return{orientationEnum:e}}))})}},{key:"getRemoteControlLock",value:function(){var e=this;return new Promise(function(t){return t(e.controlManager.getRemoteLock().then(function(e){return{remoteControlLock:e}}))})}},{key:"getRuntimePlatform",value:function(){var e=this;return new Promise(function(t){return t(e.appManager.getRuntimePlatform().then(function(e){return{runtimePlatform:e}}))})}},{key:"getSerialNumber",value:function(){var e=this;return new Promise(function(t){return t(e.firmwareManager.getSerialNumber().then(function(e){return{serialNumber:e}}))})}},{key:"getTemperature",value:function(){var e=this;return new Promise(function(t){return t(e.sensorManager.getTemperature().then(function(e){return{temperature:e}}))})}},{key:"getTimezone",value:function(){var e=this;return new Promise(function(t){return t(e.timeManager.getZone().then(function(e){return{timezone:e}}))})}},{key:"getUpdatePlatform",value:function(){var e=this;return new Promise(function(t){return t(e.appManager.getUpdatePlatform().then(function(e){return{updatePlatform:e}}))})}},{key:"getUpdateUrl",value:function(){var e=this;return new Promise(function(t){return t(e.appManager.getUpdateUrl().then(function(e){return{updateUrl:e}}))})}},{key:"getVolume",value:function(){var e=this;return new Promise(function(t){return t(e.soundManager.getVolume().then(function(e){return{volume:e}}))})}},{key:"getWired",value:function(e){var t=e.find(function(e){return e.getType()===Xa.Ethernet});if(sn()(t))return{};var n=this.getWiredIp(t);return Xn()({},n,{wiredMacAddress:t.getMac()})}},{key:"getWiredIp",value:function(e){return e.hasIp()?{wiredIpAddress:e.getIp()}:{}}},{key:"getWireless",value:function(e){var t=e.find(function(e){return e.getType()===Xa.Wifi});if(sn()(t))return{};var n=this.getWirelessIp(t);return Xn()({},n,{wirelessMacAddress:t.getMac()})}},{key:"getWirelessIp",value:function(e){return e.hasIp()?{wirelessIpAddress:e.getIp()}:{}}}]),e}(),ts=n(244),ns=n.n(ts),rs=function(){function e(){Qt()(this,e);var t=new co(jt.a),n=new so(jt.a),r=new ao(jt.a,n,t),i=new oo(r,t);this.expander=i,this.maxIterations=Pr.a.icalMaxIterations}return Jt()(e,[{key:"hasEventOnDate",value:function(e,t){var n=jt.a.Component.fromString(e),r=jt.a.Time.fromJSDate(t),i=this.expander.expand(n,{startDate:r,endDate:r,maxIterations:this.maxIterations});return Boolean(i.length)}}]),e}(),is=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.cycleIndex,r=t.iterationIndex,i=t.layer,o=t.layout,a=t.medium,s=t.playlistArray,u=void 0===s?[]:s,c=t.session,l=t.trackArray,f=void 0===l?[]:l,h=t.viewerRegistry;Qt()(this,e),this.cycleIndex=n,this.iterationIndex=r,this.layer=i,this.layout=o,this.medium=a,this.playlistArray=u,this.session=c,this.trackArray=f,this.viewerRegistry=h}return Jt()(e,[{key:"getBackgroundColor",value:function(){var e=this.layer,t=this.layout;if(!sn()(e))return"#000000";if(!sn()(t)){var n=t.backgroundColor;if(sn()(n))throw new TypeError("Missing background color.");return n}return"#000000"}},{key:"getCycleIndex",value:function(){var e=this.cycleIndex;if(sn()(e))throw new TypeError("Missing cycle index.");return e}},{key:"getHeight",value:function(){var e=this.layer;return sn()(e)?"100%":e.height}},{key:"getIterationIndex",value:function(){var e=this.iterationIndex;if(sn()(e))throw new TypeError("Missing iteration index.");return e}},{key:"getLeft",value:function(){var e=this.layer;return sn()(e)?"0%":e.left}},{key:"getMedium",value:function(){var e=this.medium;if(sn()(e))throw new TypeError("Missing medium.");return e}},{key:"getPlayDuration",value:function(){var e=Sn()(this.trackArray[0],"playDuration");if(!sn()(e))return e;var t=Sn()(this.medium,"playDuration");if(!sn()(t))return t;throw new TypeError("Missing play duration.")}},{key:"getStretchEnum",value:function(){var e=Sn()(this.medium,"stretchEnum");if(!sn()(e))return e;var t=Sn()(this.session,"stretchEnum");if(!sn()(t))return t;throw new TypeError("Missing stretch.")}},{key:"getTop",value:function(){var e=this.layer;return sn()(e)?"0%":e.top}},{key:"getUrl",value:function(){var e=this.getViewerType().getUrl(this.medium);if(sn()(e))throw new TypeError("Missing URL.");return e}},{key:"getViewerType",value:function(){var e=this.viewerRegistry.find(this.medium.type);if(sn()(e))throw new TypeError("Missing viewer type.");return e}},{key:"getVolume",value:function(){var e=[this.getMedium().volume].concat(this.trackArray.map(function(e){return e.volume}),this.playlistArray.map(function(e){return e.volume})).reduce(function(e,t){return sn()(t)?e:sn()(e)?t:e*t},null);if(sn()(e))throw new TypeError("Missing volume.");return e}},{key:"getWidth",value:function(){var e=this.layer;return sn()(e)?"100%":e.width}},{key:"getZIndex",value:function(){var e=this.layer;if(sn()(e))return"1";var t=Number(e.zIndex);if(!Pa.isIndex(t))throw new TypeError("Invalid layer z-index ".concat(t,"."));return String(t+2)}},{key:"hasCycleIndex",value:function(){return!sn()(this.cycleIndex)}},{key:"hasIterationIndex",value:function(){return!sn()(this.iterationIndex)}},{key:"hasMedium",value:function(){return!sn()(this.medium)}},{key:"isEmpty",value:function(){return sn()(this.medium)}},{key:"isPreloadable",value:function(){var e=this.viewerRegistry;if(sn()(e))return!0;var t=this.medium,n=Sn()(t,"type");if(sn()(n))return!0;var r=e.find(n);return!!sn()(r)||r.isPreloadable(t)}},{key:"isEqual",value:function(e){if(!nn()(e))throw new TypeError("Invalid schedule info ".concat(e,"."));return!(!this.isEmpty()||!e.isEmpty())||!this.isEmpty()&&!e.isEmpty()&&ns()(this.toJSON(),e.toJSON())}},{key:"isViewable",value:function(e){var t=this.viewerRegistry;if(sn()(t))return!1;var n=Sn()(this.medium,"type");if(sn()(n))return!1;var r=t.find(n);if(sn()(r))return!1;if(!e&&!r.isOfflineable())return!1;if(!this.trackArray.every(function(e){var t=e.planIcal;return sn()(t)||(new rs).hasEventOnDate(t,new Date)}))return!1;var i=r.getSourceCreator();return i.getLent()<i.getMax()}},{key:"toJSON",value:function(){return{cycleIndex:this.cycleIndex,iterationIndex:this.iterationIndex,layerId:Sn()(this.layer,"id",null),layoutId:Sn()(this.layout,"id",null),mediumId:Sn()(this.medium,"id",null),playlistIdArray:this.playlistArray.map(function(e){return e.id}),sessionId:Sn()(this.session,"id",null),trackIdArray:this.trackArray.map(function(e){return e.id})}}},{key:"toString",value:function(){return"ScheduleInfo ".concat(JSON.stringify(this))}},{key:"merge",value:function(t){var n=this;return new e([].concat(["cycleIndex","iterationIndex","layer","layout","medium","session","viewerRegistry"].map(function(e){return[e,ji()(t[e])?n[e]:t[e]]}),["playlistArray","trackArray"].map(function(e){return[e,ji()(t[e])?n[e]:n[e].concat(t[e])]})).reduce(function(e,t){var n=ln()(t,2),r=n[0],i=n[1];return Xn()({},e,Zn()({},r,i))},{}))}}]),e}(),os=function(){function e(t,n,r){if(Qt()(this,e),!nn()(t))throw new TypeError("Invalid session ".concat(t,"."));if(!nn()(n))throw new TypeError("Invalid layout ".concat(n,"."));if(!nn()(r))throw new TypeError("Invalid viewer registry ".concat(r,"."));this.cycleIndex=0,this.emitter=new en.a,this.layout=n,this.session=t,this.viewerRegistry=r}return Jt()(e,[{key:"destroy",value:function(){}},{key:"getInfo",value:function(e){if(e>0)return new is({cycleIndex:e,iterationIndex:0});var t=this.layout,n=t.medium;return sn()(n)?new is({cycleIndex:e,iterationIndex:0}):new is({cycleIndex:e,iterationIndex:0,layout:t,medium:n,session:this.session,viewerRegistry:this.viewerRegistry})}},{key:"go",value:function(){var e=this.cycleIndex,t=this.getInfo(e);return this.cycleIndex=e+1,this.emitter.emit("gone",t),t}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"plan",value:function(e){var t=this;if(!Pa.isIndex(e))throw new TypeError("Invalid offset ".concat(e,"."));return Array(e).fill().map(function(e,n){return t.getInfo(t.cycleIndex+n)})}},{key:"skip",value:function(){}},{key:"stop",value:function(){}},{key:"toString",value:function(){return"ScheduleBackground {layoutId: ".concat(this.layout.id,"}")}}]),e}(),as=function(){function e(){Qt()(this,e),this.emitter=new en.a}return Jt()(e,[{key:"destroy",value:function(){}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"go",value:function(){var e=new is;return this.emitter.emit("gone",e),e}},{key:"plan",value:function(e){if(!Pa.isIndex(e))throw new TypeError("Invalid offset ".concat(e,"."));return Array(e).fill().map(function(){return new is})}},{key:"skip",value:function(){}},{key:"stop",value:function(){}},{key:"toString",value:function(){return"ScheduleEmpty"}}]),e}(),ss=function(){function e(t,n,r){if(Qt()(this,e),!nn()(t))throw new TypeError("Invalid session ".concat(t,"."));if(!nn()(n))throw new TypeError("Invalid medium ".concat(n,"."));if(!nn()(r))throw new TypeError("Invalid viewer registry ".concat(r,"."));this.emitter=new en.a,this.medium=n,this.schedulePlan=null,this.session=t,this.viewerRegistry=r}return Jt()(e,[{key:"destroy",value:function(){}},{key:"getInfo",value:function(e){var t=this.medium;return new is({cycleIndex:e,iterationIndex:0,medium:t,session:this.session,viewerRegistry:this.viewerRegistry})}},{key:"go",value:function(){var e=this.schedulePlan,t=Sn()(e,"cycleIndex",null),n=this.planCycleIndex(t),r={cycleIndex:n,scheduleInfo:this.getInfo(n)},i=r.scheduleInfo;return this.schedulePlan=r,this.emitter.emit("gone",i),i}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"plan",value:function(e){var t=this;if(!Pa.isIndex(e))throw new TypeError("Invalid offset ".concat(e,"."));return Array(e).fill().reduce(function(e){var n=e[e.length-1],r=Sn()(n,"cycleIndex",null),i=t.planCycleIndex(r),o=t.getInfo(i);return e.concat({cycleIndex:i,scheduleInfo:o})},[this.schedulePlan]).slice(1).map(function(e){return e.scheduleInfo})}},{key:"planCycleIndex",value:function(e){return sn()(e)?0:e+1}},{key:"skip",value:function(){}},{key:"stop",value:function(){}},{key:"toString",value:function(){return"ScheduleMedium {medium: ".concat(this.medium,"}")}}]),e}(),us=function(){function e(){Qt()(this,e),this.emitter=new en.a,this.playing=!1,this.timeout=null}return Jt()(e,[{key:"destroy",value:function(){clearTimeout(this.timeout),this.timeout=null}},{key:"isPlaying",value:function(){return this.playing}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onTimeout",value:function(){this.playing=!1,this.timeout=null,this.emitter.emit("played")}},{key:"play",value:function(e){var t=this;if(!sn()(e)&&!kn()(e))throw new TypeError("Invalid duration ".concat(e,"."));if(this.playing)throw new Error("Already playing.");e>0&&(this.timeout=setTimeout(function(){return t.onTimeout()},e)),this.playing=!0}},{key:"stop",value:function(){clearTimeout(this.timeout),this.playing=!1,this.timeout=null}}]),e}(),cs=function(){function e(t,n){Qt()(this,e);var r=new us;this.emitter=new en.a,this.playDuration=t,this.scheduleInfo=null,this.schedulePlayer=r,this.scheduleStrategy=n,this.onGone=this.onGone.bind(this),this.onPlayed=this.onPlayed.bind(this),r.on("played",this.onPlayed),n.on("gone",this.onGone)}return Jt()(e,[{key:"destroy",value:function(){var e=this.schedulePlayer,t=this.scheduleStrategy;e.off("played",this.onPlayed),e.destroy(),t.off("gone",this.onGone),t.destroy()}},{key:"go",value:function(){var e=this.schedulePlayer;return e.stop(),e.play(this.playDuration),this.scheduleStrategy.go()}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onGone",value:function(e){this.scheduleInfo=e,this.emitter.emit("gone",e)}},{key:"onPlayed",value:function(){this.emitter.emit("played",this.scheduleInfo)}},{key:"plan",value:function(e){return this.scheduleStrategy.plan(e)}},{key:"skip",value:function(){this.scheduleStrategy.skip()}},{key:"stop",value:function(){this.schedulePlayer.stop()}},{key:"toString",value:function(){return"ScheduleOrphan {scheduleStrategy: ".concat(this.scheduleStrategy,"}")}}]),e}(),ls=n(243),fs=n.n(ls),hs=function(){function e(t,n,r,i){if(Qt()(this,e),!nn()(r))throw new TypeError("Invalid track ".concat(r,"."));var o=new us,a=e.detectStrategy(t,n,r,i);this.emitter=new en.a,this.scheduleInfo=null,this.schedulePlayer=o,this.scheduleStrategy=a,this.track=r,this.onPlayerPlayed=this.onPlayerPlayed.bind(this),this.onStrategyPlayed=this.onStrategyPlayed.bind(this),o.on("played",this.onPlayerPlayed),a.on("played",this.onStrategyPlayed)}return Jt()(e,[{key:"destroy",value:function(){var e=this.schedulePlayer,t=this.scheduleStrategy;e.off("played",this.onPlayerPlayed),t.off("played",this.onStrategyPlayed),e.destroy(),t.destroy()}},{key:"getInfo",value:function(e){return e.merge({trackArray:[this.track]})}},{key:"go",value:function(){var e=this.scheduleStrategy.go(),t=this.getInfo(e);return this.schedulePlayer.isPlaying()||this.schedulePlayer.play(this.track.playDuration),this.scheduleInfo=t,this.emitter.emit("gone",t),t}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onPlayerPlayed",value:function(){this.scheduleStrategy.skip(),this.scheduleStrategy.stop(),this.emitter.emit("played",this.scheduleInfo)}},{key:"onStrategyPlayed",value:function(e){this.emitter.emit("played",e)}},{key:"plan",value:function(e){var t=this;return this.scheduleStrategy.plan(e).map(function(e){return t.getInfo(e)})}},{key:"skip",value:function(){this.scheduleStrategy.skip()}},{key:"stop",value:function(){this.schedulePlayer.stop(),this.scheduleStrategy.stop()}},{key:"toString",value:function(){return"ScheduleTrack {track: ".concat(this.track,"}")}}],[{key:"detectStrategy",value:function(e,t,n,r){var i=n.childPlaylist,o=n.layout,a=n.medium,s=!sn()(a),u=!sn()(i),c=!sn()(o);if(s&&!u&&!c)return new ss(t,a,r);if(u&&!s&&!c)return new ms(e,t,i,r);if(c&&!s&&!u)return new as;throw new Error("Unable to detect strategy for track ".concat(n,"."))}}]),e}(),ds=function(){function e(t,n,r,i,o){var a=this;if(Qt()(this,e),!nn()(t))throw new TypeError('Invalid store "'.concat(t,'".'));if(!nn()(r))throw new TypeError('Invalid playlist "'.concat(r,'".'));if(!In()(i))throw new TypeError('Invalid track array "'.concat(i,'".'));var s=i.map(function(e,r){var i=new hs(t,n,e,o);return{onPlayed:a.onPlayed.bind(a,i),scheduleStrategy:i}});this.emitter=new en.a,this.playlist=r,this.scheduleEdgeArray=s,this.schedulePlan=null,this.store=t,s.forEach(function(e){e.scheduleStrategy.on("played",e.onPlayed)})}return Jt()(e,[{key:"destroy",value:function(){this.scheduleEdgeArray.forEach(function(e){var t=e.scheduleStrategy;t.off("played",e.onPlayed),t.destroy()})}},{key:"findEdgeIndex",value:function(e){var t=this.scheduleEdgeArray.indexOf(e);if(-1===t)throw new RangeError("Playlist does not contain ".concat(e.scheduleStrategy,"."));return t}},{key:"go",value:function(){var e,t=this.schedulePlan;if(sn()(t))e=this.goNext(t);else{var n=t.scheduleEdge.scheduleStrategy,r=n.plan(1)[0];r.isEmpty()||r.getCycleIndex()>t.cycleIndex?(n.stop(),e=this.goNext(t)):e=this.goDeep(t)}var i=Sn()(e,"scheduleInfo",new is);return this.schedulePlan=e,this.emitter.emit("gone",i),i}},{key:"goDeep",value:function(e){var t=e.cycleIndex,n=e.iterationIndex,r=e.scheduleEdge,i=r.scheduleStrategy.go(),o=this.nextIterationIndex(t,n,t);return{cycleIndex:t,iterationIndex:o,scheduleEdge:r,scheduleInfo:i.merge({cycleIndex:t,iterationIndex:o,playlistArray:[this.playlist]})}}},{key:"goNext",value:function(e){var t,n=this,r=Sn()(e,"cycleIndex"),i=Sn()(e,"iterationIndex"),o=Sn()(e,"scheduleEdge",null),a=this.nextEdgeIndex(o),s=this.scheduleEdgeArray;return s.slice(a).concat(s.slice(0,a)).some(function(e){var a=e.scheduleStrategy,s=a.go();if(s.isEmpty())return a.stop(),!1;var u=n.nextCycleIndex(r,o),c=n.nextIterationIndex(r,i,u);return t={cycleIndex:u,iterationIndex:c,scheduleEdge:e,scheduleInfo:s.merge({cycleIndex:u,iterationIndex:c,playlistArray:[n.playlist]})},!0}),sn()(t)&&(t=null),t}},{key:"isLastEdge",value:function(e){var t=this.scheduleEdgeArray,n=t.length;return n>0&&e===t[n-1]}},{key:"nextCycleIndex",value:function(e,t){return sn()(e)||sn()(t)?0:this.isLastEdge(t)?e+1:e}},{key:"nextEdgeIndex",value:function(e){return sn()(e)?0:(this.findEdgeIndex(e)+1)%this.scheduleEdgeArray.length}},{key:"nextIterationIndex",value:function(e,t,n){if(e===n)return sn()(t)?0:t+1;if(sn()(e)||e<n)return 0;throw new Error("Invalid cycle change from ".concat(e," to ").concat(n,"."))}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onPlayed",value:function(e,t){var n=this.schedulePlan;if(e!==n.scheduleEdge.scheduleStrategy)throw new Error("Unexpected played event from ".concat(e,"."));this.emitter.emit("played",n.scheduleInfo)}},{key:"plan",value:function(e){var t=this;if(!Pa.isIndex(e))throw new TypeError("Invalid offset ".concat(e,"."));var n,r=this.scheduleEdgeArray,i=this.schedulePlan,o=Sn()(i,"cycleIndex"),a=Sn()(i,"iterationIndex"),s=Sn()(i,"scheduleEdge",null);return n=sn()(s)?0:this.findEdgeIndex(s),r.slice(n).concat(r.slice(0,n)).reduce(function(n,r){var i=n.cycleIndex,o=n.offset,a=r.scheduleStrategy.plan(o).filter(function(e){return!e.isEmpty()}).map(function(e){return e.merge({iterationIndex:t.findEdgeIndex(r)})}),s=a.filter(function(e){var t=e.getCycleIndex();return sn()(i)?0===t:t===i}).length;return{cycleIndex:t.nextCycleIndex(i,r),offset:o-s,scheduleInfoArray:on()(n.scheduleInfoArray.concat(a),[function(e){return e.getCycleIndex()},function(e){return e.getIterationIndex()}]).slice(0,e)}},{cycleIndex:o,offset:e,scheduleInfoArray:[]}).scheduleInfoArray.reduce(function(e,n){var r,i,o=e[e.length-1];r=o.hasCycleIndex()?o.getCycleIndex():null,i=o.hasIterationIndex()?o.getIterationIndex():null;var a=n.merge({iterationIndex:t.nextIterationIndex(r,i,n.getCycleIndex()),playlistArray:[t.playlist]});return e.concat(a)},[new is({cycleIndex:o,iterationIndex:a})]).slice(1).concat(Array(e).fill(new is)).slice(0,e)}},{key:"skip",value:function(){var e=this.schedulePlan;if(!sn()(e))for(;;){var t=this.schedulePlan.scheduleEdge,n=t.scheduleStrategy.plan(1)[0];if(this.isLastEdge(t)&&(n.isEmpty()||n.getCycleIndex()>e.cycleIndex))break;this.go()}}},{key:"stop",value:function(){var e=this.schedulePlan;e&&e.scheduleEdge.scheduleStrategy.stop()}},{key:"toString",value:function(){return"ScheduleLinear {playlist: ".concat(this.playlist,"}")}}]),e}(),ps=function(){function e(t,n,r,i,o){if(Qt()(this,e),!In()(i))throw new TypeError("Invalid track array ".concat(i,"."));this.scheduleLinear=new ds(t,n,r,fs()(i),o)}return Jt()(e,[{key:"destroy",value:function(){this.scheduleLinear.destroy()}},{key:"go",value:function(){return this.scheduleLinear.go()}},{key:"off",value:function(){var e;(e=this.scheduleLinear).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.scheduleLinear).on.apply(e,arguments)}},{key:"plan",value:function(e){return this.scheduleLinear.plan(e)}},{key:"skip",value:function(){this.scheduleLinear.skip()}},{key:"stop",value:function(){this.scheduleLinear.stop()}},{key:"toString",value:function(){return"ScheduleRandom {playlist: ".concat(this.playlist,"}")}}]),e}(),vs=function(){function e(t,n,r,i,o){if(Qt()(this,e),!In()(i))throw new TypeError("Invalid track array ".concat(i,"."));var a=i.sort(function(e,t){return e.index-t.index});this.scheduleLinear=new ds(t,n,r,a,o)}return Jt()(e,[{key:"destroy",value:function(){this.scheduleLinear.destroy()}},{key:"go",value:function(){return this.scheduleLinear.go()}},{key:"off",value:function(){var e;(e=this.scheduleLinear).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.scheduleLinear).on.apply(e,arguments)}},{key:"plan",value:function(e){return this.scheduleLinear.plan(e)}},{key:"skip",value:function(){this.scheduleLinear.skip()}},{key:"stop",value:function(){this.scheduleLinear.stop()}},{key:"toString",value:function(){return"ScheduleStatic {playlist: ".concat(this.playlist,"}")}}]),e}(),ms=function(){function e(t,n,r,i){if(Qt()(this,e),!nn()(t))throw new TypeError("Invalid store ".concat(t,"."));if(!nn()(r))throw new TypeError("Invalid playlist ".concat(r,"."));var o=e.getTrackArray(t,r);this.scheduleStrategy=e.detectStrategy(t,n,r,o,i)}return Jt()(e,[{key:"destroy",value:function(){this.scheduleStrategy.destroy()}},{key:"go",value:function(){return this.scheduleStrategy.go()}},{key:"off",value:function(){var e;(e=this.scheduleStrategy).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.scheduleStrategy).on.apply(e,arguments)}},{key:"plan",value:function(e){return this.scheduleStrategy.plan(e)}},{key:"skip",value:function(){this.scheduleStrategy.skip()}},{key:"stop",value:function(){this.scheduleStrategy.stop()}},{key:"toString",value:function(){return"SchedulePlaylist {playlist: ".concat(this.playlist,"}")}}],[{key:"getTrackArray",value:function(e,t){return e.filter("track").filter(function(e){return e.parentPlaylistId===t.id})}},{key:"detectStrategy",value:function(e,t,n,r,i){switch(n.scheduleEnum){case Ca.RANDOM:return new ps(e,t,n,r,i);case Ca.DYNAMIC:case Ca.STATIC:return new vs(e,t,n,r,i);default:throw new Error("Unable to detect strategy for playlist ".concat(n,"."))}}}]),e}(),ys=function(){function e(t,n,r,i,o){if(Qt()(this,e),!nn()(r))throw new TypeError("Invalid layer ".concat(r,"."));this.emitter=new en.a,this.layer=r,this.layout=i;var a=e.detectStrategy(t,n,r,o);this.scheduleStrategy=a,this.onGone=this.onGone.bind(this),this.onPlayed=this.onPlayed.bind(this),a.on("gone",this.onGone),a.on("played",this.onPlayed)}return Jt()(e,[{key:"destroy",value:function(){var e=this.scheduleStrategy;e.off("gone",this.onGone),e.off("played",this.onPlayed),e.destroy()}},{key:"getInfo",value:function(e){return e.merge({layer:this.layer,layout:this.layout})}},{key:"go",value:function(){var e=this.scheduleStrategy.go();return this.getInfo(e)}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onGone",value:function(e){this.emitter.emit("gone",this.getInfo(e))}},{key:"onPlayed",value:function(e){this.emitter.emit("played",this.getInfo(e))}},{key:"plan",value:function(e){var t=this;return this.scheduleStrategy.plan(e).map(function(e){return t.getInfo(e)})}},{key:"skip",value:function(){this.scheduleStrategy.skip()}},{key:"stop",value:function(){this.scheduleStrategy.stop()}},{key:"toString",value:function(){return"ScheduleLayer {layer: ".concat(this.layer,"}")}}],[{key:"detectStrategy",value:function(e,t,n,r){var i=n.medium,o=n.playlist,a=!sn()(i),s=!sn()(o);if(a&&!s){var u=new ss(t,i,r);return new cs(i.playDuration,u)}if(s&&!a)return new ms(e,t,o,r);if(!s&&!a)return new as;throw new Error("Unable to detect strategy for layer ".concat(n,"."))}}]),e}(),gs=function(){function e(){Qt()(this,e)}return Jt()(e,null,[{key:"createStrategies",value:function(e,t,n,r,i){return n.filter(function(e){return e.parentLayoutId===r.id}).map(function(n){return new ys(e,t,n,r,i)}).concat(new os(t,r,i))}}]),e}(),bs=function(){function e(t){Qt()(this,e),this.viewerRegistry=t}return Jt()(e,[{key:"createStrategies",value:function(e,t,n,r){if(sn()(e))return[];var i=this.viewerRegistry,o=e.layout,a=e.medium,s=e.playlist,u=!sn()(o),c=!sn()(a),l=!sn()(s);if(u&&!c&&!l)return gs.createStrategies(r,n,t,o,i);if(c&&!u&&!l){var f=new ss(n,a,i);return[new cs(a.playDuration,f)]}if(l&&!u&&!c)return[new ms(r,n,s,i)];throw new Error("Unable to detect strategy for content task ".concat(e,"."))}}]),e}(),ws=function(){function e(t){Qt()(this,e),this.orientationEnum=t}return Jt()(e,[{key:"createScreenshot",value:function(){return new Promise(function(){var e=new Error("Unable to create the screenshot.");throw e.name=Bi.NotSupportedError,e})}},{key:"getBrightness",value:function(){return new Promise(function(){var e=new Error("Unable to get the brightness.");throw e.name=Bi.NotSupportedError,e})}},{key:"getCssOrientation",value:function(){var e=this;return new Promise(function(t){return t(e.orientationEnum)})}},{key:"getOrientation",value:function(){var e=this;return new Promise(function(t){return t(e.orientationEnum)})}},{key:"setOrientation",value:function(e){var t=this;return new Promise(function(n){return t.orientationEnum=e,n()})}}]),e}(),_s=n(242),ks=n.n(_s),xs=function(){function e(t,n,r,i,o,a,s){Qt()(this,e),t.init({dsn:r,integrations:function(e){return[].concat(Hr()(e),[s,o])}}),o.sendEvents();var u=t.getCurrentHub(),c=u.getClient();this.captureErrorLevel=n,this.client=c,this.errorLevelFactory=i,this.hub=u,this.severityFactory=a}return Jt()(e,[{key:"capture",value:function(e,t){var n=this.errorLevelFactory.fromValue(t)||e;return ks()(t)?this.captureError(n,t):nn()(t)?this.captureObject(n,t):this.captureString(n,String(t))}},{key:"captureError",value:function(e,t){var n=this.hub,r=this.severityFactory.fromErrorLevel(e);this.isBreadcrumb(e)?n.addBreadcrumb({message:t.toString(),level:r}):n.withScope(function(e){e.setLevel(r),n.captureException(t)})}},{key:"captureObject",value:function(e,t){var n=t.message,r=t.name;return En()(n)?En()(r)?this.captureString(e,"".concat(r,": ").concat(n)):this.captureString(e,n):this.captureString(e,String(t))}},{key:"captureString",value:function(e,t){var n=this.hub,r=this.severityFactory.fromErrorLevel(e);this.isBreadcrumb(e)?n.addBreadcrumb({message:t,level:r}):n.captureMessage(t,r)}},{key:"debug",value:function(e){return this.capture(fn.a.Debug,e)}},{key:"error",value:function(e){return this.capture(fn.a.Error,e)}},{key:"info",value:function(e){return this.capture(fn.a.Info,e)}},{key:"isBreadcrumb",value:function(e){return-1===this.errorLevelFactory.compare(e,this.captureErrorLevel)}},{key:"log",value:function(e){return this.capture(fn.a.Log,e)}},{key:"setBuildId",value:function(e){sn()(e)||this.hub.setExtra("buildId",e)}},{key:"setDeviceId",value:function(e){sn()(e)||this.hub.setUser({id:e})}},{key:"setEnvEnum",value:function(e){sn()(e)||(this.client._options.environment=Eo.generate(e))}},{key:"setInfo",value:function(e){this.setBuildId(e.buildId),this.setDeviceId(e.deviceId),this.setEnvEnum(e.envEnum),this.setManufacturer(e.manufacturer),this.setModelName(e.modelName),this.setOnline(e.online),this.setRuntimePlatform(e.runtimePlatform),this.setUpdatePlatform(e.updatePlatform),this.setUpdateUrl(e.updateUrl),this.setVersion(e.version)}},{key:"setManufacturer",value:function(e){sn()(e)||this.hub.setExtra("manufacturer",e)}},{key:"setModelName",value:function(e){sn()(e)||this.hub.setExtra("modelName",e)}},{key:"setOnline",value:function(e){sn()(e)||this.hub.setExtra("online",e)}},{key:"setRuntimePlatform",value:function(e){sn()(e)||this.hub.setExtra("runtimePlatform",ir.generate(e))}},{key:"setUpdatePlatform",value:function(e){sn()(e)||this.hub.setExtra("updatePlatform",$n.generate(e))}},{key:"setUpdateUrl",value:function(e){sn()(e)||this.hub.setExtra("updateUrl",e)}},{key:"setVersion",value:function(e){sn()(e)||(this.client._options.release=e)}},{key:"warn",value:function(e){return this.capture(fn.a.Warning,e)}}]),e}(),Es=function(){function e(t,n,r,i,o,a,s){Qt()(this,e),this.Sentry=t,this.SentryLogger=n,this.captureErrorLevel=r,this.errorLevelFactory=i,this.offlineIntegration=o,this.severityFactory=a,this.vueIntegration=s}return Jt()(e,[{key:"create",value:function(e){return new this.SentryLogger(this.Sentry,this.captureErrorLevel,e,this.errorLevelFactory,this.offlineIntegration,this.severityFactory,this.vueIntegration)}}]),e}(),Ts=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.eventTarget,r=void 0===n?window:n,i=t.key,o=void 0===i?"SentryOfflineIntegration":i,a=t.maxEvents,s=void 0===a?5:a,u=t.navigator,c=void 0===u?window.navigator:u,l=t.storage,f=void 0===l?window.localStorage:l;Qt()(this,e),this.eventTarget=r,this.hub=null,this.key=o,this.maxEvents=s,this.name=e.id,this.navigator=c,this.storage=f}return Jt()(e,[{key:"clearEvents",value:function(){this.storage.removeItem(this.key)}},{key:"processEvent",value:function(e){return this.navigator.onLine?e:(this.storeEvent(e),null)}},{key:"restoreEvents",value:function(){var e=this.storage.getItem(this.key);return null===e?[]:JSON.parse(e)}},{key:"sendEvents",value:function(){var e=this.hub,t=e.getClient();t&&(t.getDsn()&&this.navigator.onLine&&(this.restoreEvents().forEach(function(t){return e.captureEvent(t)}),this.clearEvents()))}},{key:"setupOnce",value:function(e,t){var n=this;this.hub=t(),e(function(){return n.processEvent.apply(n,arguments)}),this.eventTarget.addEventListener("online",function(){return n.sendEvents()})}},{key:"storeEvent",value:function(e){e.timestamp=Object(P.m)();var t=this.restoreEvents().concat(e).slice(-1*this.maxEvents),n=JSON.stringify(t);this.storage.setItem(this.key,n)}}]),e}();Ts.id="Offline";var As=Ts,Ss={Critical:"critical",Debug:"debug",Error:"error",Fatal:"fatal",Info:"info",Log:"log",Warning:"warning"},Cs=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"fromErrorLevel",value:function(e){switch(e){case fn.a.Debug:return Ss.Debug;case fn.a.Error:return Ss.Error;case fn.a.Info:return Ss.Info;case fn.a.Log:return Ss.Log;case fn.a.Warning:return Ss.Warning;default:throw new RangeError('Unknown error level "'.concat(e,'".'))}}}]),e}(),Is={AccessCodeMissing:"AccessCodeMissing",DeviceExists:"DeviceExists",DeviceLimitExceeded:"DeviceLimitExceeded",DeviceRegistered:"DeviceRegistered",OrganizationInvalid:"OrganizationInvalid",OrganizationMissing:"OrganizationMissing",RequestInvalid:"RequestInvalid",SaveError:"SaveError",UserInvalid:"UserInvalid"};function Os(e){var t=Os.getMessage(e),n=new Error(t);n.name=Bi.SetupError,sn()(t)||Object.defineProperty(this,"message",{configurable:!0,value:n.message,writable:!0}),Object.defineProperty(this,"stack",{configurable:!0,value:n.stack,writable:!0})}Os.getMessage=function(e){switch(e){case Is.AccessCodeMissing:return"Missing device access code.";case Is.DeviceExists:return"Device ID already exists.";case Is.DeviceLimitExceeded:return"License limit for number of devices was exceeded.";case Is.DeviceRegistered:return"Device is already registered.";case Is.OrganizationInvalid:return"Unable to add the device to organization.";case Is.OrganizationMissing:return"Missing device organization.";case Is.RequestInvalid:return"Invalid request format.";case Is.SaveError:return"Unable to save the device.";case Is.UserInvalid:return"Invalid username or password."}},Os.prototype=Object.create(Error.prototype,{constructor:{configurable:!0,value:Os,writable:!0},message:{configurable:!0,value:"",writable:!0},name:{configurable:!0,value:Bi.SetupError,writable:!0},toString:{configurable:!0,value:function(){return this.error.toString()},writable:!0}});var Ps=Os,Ds=function(){function e(t){Qt()(this,e),this.SetupError=t}return Jt()(e,[{key:"create",value:function(e){return new this.SetupError(e)}}]),e}(),Ls=function(){function e(t,n){Qt()(this,e),this.errorFactory=n,this.organizationHelper=t}return Jt()(e,[{key:"createError",value:function(e,t){var n=this.parseErrorType(t);return sn()(n)?new Error("HTTP status ".concat(e,".")):this.errorFactory.create(n)}},{key:"fetchOrganizations",value:function(e,t,n){var r=this;return new Promise(function(i){return i(fetch("".concat(e,"/api/register/verify"),{body:JSON.stringify({username:t,password:n}),headers:{"Content-type":"application/json"},method:"POST"}).then(function(e){return e.ok?e.json().then(function(e){return r.parseOrganizations(e)}):e.text().then(function(t){throw r.createError(e.status,t)})}))})}},{key:"getQrUrl",value:function(e,t){return"".concat(e,"/api/register/url/lighter/").concat(t)}},{key:"parseErrorType",value:function(e){switch(e){case"device.alreadyExists":return Is.DeviceExists;case"device.alreadyRegistered":return Is.DeviceRegistered;case"device.missingAccessCode":return Is.AccessCodeMissing;case"device.saveError":return Is.SaveError;case"organization.deviceLimitExceeded":return Is.DeviceLimitExceeded;case"organization.invalid":return Is.OrganizationInvalid;case"organization.missingOrganization":return Is.OrganizationMissing;case"request.invalid":return Is.RequestInvalid;case"user.invalid":return Is.UserInvalid}}},{key:"parseDeviceId",value:function(e){return e.device.deviceId}},{key:"parseOrganizations",value:function(e){var t=Sn()(e,"organization");return sn()(t)?[]:this.organizationHelper.flatten(t)}},{key:"registerAutomatic",value:function(e,t){var n=this;return new Promise(function(r){return r(fetch("".concat(e,"/api/register/sync"),{body:JSON.stringify({accessCode:t}),headers:{"Content-type":"application/json"},method:"POST"}).then(function(e){if(e.ok)return e.json().then(function(e){return n.parseDeviceId(e)});var t=e.status;if(404===e.status)return null;throw new Error("HTTP status ".concat(t,"."))}))})}},{key:"registerManual",value:function(e,t,n,r,i,o){var a=this;return new Promise(function(s){return s(fetch("".concat(e,"/api/register/device"),{body:JSON.stringify({accessCode:t,deviceName:i,deviceType:"lighter",organizationId:o,password:r,username:n}),headers:{"Content-type":"application/json"},method:"POST"}).then(function(e){return e.ok?e.json().then(function(e){return a.parseDeviceId(e)}):e.text().then(function(t){throw a.createError(e.status,t)})}))})}}]),e}(),Ms=function(){function e(t,n){Qt()(this,e),this.controllerFactory=t,this.sourceCreator=n}return Jt()(e,[{key:"createController",value:function(){return this.controllerFactory.create()}},{key:"getSourceCreator",value:function(){return this.sourceCreator}},{key:"getUrl",value:function(e){return e.url}},{key:"isExtractable",value:function(){return!1}},{key:"isOfflineable",value:function(){return!1}},{key:"isPreloadable",value:function(e){return!0}}]),e}(),js=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"getClassName",value:function(e){switch(e){case jr.CONTAIN:return"stretch-native--contain";case jr.COVER:return"stretch-native--cover";case jr.FILL:return"stretch-native--fill";default:throw new Error('Invalid stretch "'.concat(e,'".'))}}}]),e}(),Ns=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"indexesOf",value:function(e,t){for(var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).max,r=void 0===n?1/0:n,i=e.length,o=[],a=-1,s=r;s--&&a++<i&&-1!==(a=e.indexOf(t,a));)o.push(a);return o}},{key:"nthIndexOf",value:function(e,t,n){for(var r=e.length,i=-1,o=n;o--&&i++<r&&-1!==(i=e.indexOf(t,i)););return i}}]),e}(),Rs=function(){function e(t,n){Qt()(this,e),this.contentTaskConverter=t,this.powerTaskConverter=n}return Jt()(e,[{key:"parse",value:function(e,t,n){var r=this.parseContentTasks(e,n),i=this.parsePowerTasks(t,n);return[].concat(Hr()(r),Hr()(i))}},{key:"parseContentTasks",value:function(e,t){var n=this;return e.reduce(function(e,r){var i=n.contentTaskConverter.convert(r,t);return sn()(i)||e.push(i),e},[])}},{key:"parsePowerTasks",value:function(e,t){var n=this;return e.reduce(function(e,r){var i=n.powerTaskConverter.convert(r,t);return sn()(i)||e.push(i),e},[])}}]),e}(),Fs=function(){function e(t,n,r,i){Qt()(this,e),this.ICAL=t,this.endDays=36500,this.icalTimeUtil=n,this.icalUtil=r,this.mainPriority=-1,this.primaryTarget="display1.primary",this.startDays=-30,this.uidGenerator=i}return Jt()(e,[{key:"convert",value:function(e,t){var n,r,i,o=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).nowDate,a=void 0===o?new Date:o,s=t.id,u=t.priority;if(t.taskEnum===ci.CONTENT&&t.targetEnum===ui.PRIMARY&&!sn()(u)){var c=this.ICAL.Time.fromJSDate(a,!0),l=this.convertPlanIcal(s,c,u,{planIcal:t.planIcal});if(!sn()(l))return e.inject("contentTask",{id:s,layoutId:null!=(n=t.layoutId)?n:void 0,mediumId:null!=(r=t.mediumId)?r:void 0,planIcal:l,playlistId:null!=(i=t.playlistId)?i:void 0,priority:u,target:this.primaryTarget})}}},{key:"convertPlanIcal",value:function(e,t,n,r){var i=r.planIcal;if(!sn()(i))return i;if(n===this.mainPriority){var o=this.icalTimeUtil,a=this.icalUtil,s=this.ICAL.Timezone.localTimezone,u=t.convertToZone(s),c=o.adjust(u,{days:this.startDays}),l=o.adjust(u,{days:this.endDays}),f=this.uidGenerator.generate(e),h=a.createVEvent({endDate:l,stamp:t,startDate:c,uid:f});return a.createVCalendar({subcomponents:[h]}).toString()}}}]),e}(),Bs=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"convert",value:function(e,t){if(t.taskEnum===ci.POWER)return e.inject("powerTask",{id:t.id})}}]),e}(),Us=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"generateId",value:function(e,t,n){return Gr()({commandEnum:t,day:n,taskId:e})}},{key:"includesDay",value:function(e,t){var n=(7+t-1)%7,r=Math.pow(2,n);return Boolean(e&r)}},{key:"parseMany",value:function(e,t,n,r){var i=this,o=Tn.fromString(r,{nil:null});return Mn.parseMany(e,function(e,r){return i.parseOne(e,t,n,o,r)},{timer:{}})}},{key:"parseModel",value:function(e,t,n,r,i){var o=Mn.parseClock(e);return{commandEnum:r,day:i,hour:o.hour,id:t,minute:o.minute,second:o.second,taskId:n}}},{key:"parseOne",value:function(e,t,n,r,i){var o,a=Mn.parseDay(i),s=this.generateId(t,n,a);if(sn()(s)||!this.includesDay(r,a))o={timer:{}};else{var u=this.parseModel(e,s,t,n,a);o={timer:Zn()({},s,u)}}return o}}]),e}(),zs=function(){function e(t){Qt()(this,e),this.trackPlanCommunicator=t}return Jt()(e,[{key:"parseMany",value:function(e,t){var n=this;return Mn.parseMany(e,function(e,r){return n.parseOne(e,t,r)},{track:{}})}},{key:"parseModel",value:function(e,t,n){var r;if(sn()(t))throw new TypeError("Missing parent playlist.");if(sn()(n))throw new TypeError("Missing index.");var i=null!=(r=e.trackPlans)?r:[];return{childPlaylistId:Mn.parseReference(e.ref,"playlist",{nil:null}),id:Gr()({parentPlaylistId:t,index:n}),index:n,layoutId:Mn.parseReference(e.ref,"layout",{nil:null}),mediumId:Mn.parseReference(e.ref,"media",{nil:null}),parentPlaylistId:t,planIcal:this.trackPlanCommunicator.parseIcal(i),playDuration:Mn.parseTime(e.schedule.duration),volume:Mn.parseVolume(e.schedule.volume)}}},{key:"parseOne",value:function(e,t,n){var r=this.parseModel(e,t,n);return{track:Zn()({},r.id,r)}}}]),e}(),$s=function(){function e(t){Qt()(this,e),this.dhtmlxToIcalExporter=t}return Jt()(e,[{key:"generateUid",value:function(e){return"TrackPlan-".concat(e.id)}},{key:"parseDhtmlxEvent",value:function(e){return{end_date:e.endDate,event_length:this.parseString(e.event_length),event_pid:this.parseString(e.event_pid),id:String(e.id),rec_type:e.rec_type,start_date:e.startDate,text:""}}},{key:"parseIcal",value:function(e){var t=this,n=e.map(function(e){return t.parseDhtmlxEvent(e)}),r=this.dhtmlxToIcalExporter.export(n,{generateUid:function(){return t.generateUid.apply(t,arguments)}});return sn()(r)?null:r}},{key:"parseString",value:function(e){return-1===e?"":String(e)}}]),e}(),Vs=function(){function e(t,n,r,i,o){Qt()(this,e),this.appManager=t,this.buildId=n,this.communicator=r,this.session=i,this.store=o,this.updatePending=!1}return Jt()(e,[{key:"start",value:function(){var e=this.session;if(this.buildId===e.buildId)return Promise.resolve();var t=e.id,n={buildId:this.buildId,id:t,version:null};return this.store.update("session",t,n)}},{key:"updateVersion",value:function(e){var t=this;return new Promise(function(n){var r=t.session;if(!t.buildId||e===r.version)return n();if(t.updatePending)throw new Error("An update is already pending.");return t.updatePending=!0,n(t.appManager.getUpdatePlatform().then(function(e){return t.appManager.getFormat().then(function(n){return t.communicator.update(r.serverUrl,r.deviceId,n,e)})}).then(function(e){if(e){var n=t.buildId===e.buildId,i=Promise.resolve();n||(i=i.then(function(){return t.appManager.update(e.url)}));var o=r.id,a={id:o,buildId:e.buildId,version:e.version},s=t.store;return i=i.then(function(){return s.update("session",o,a)}),n||(i=i.then(function(){return t.appManager.finishUpdate()})),i}}).finally(function(){t.updatePending=!1}))})}}]),e}(),Ys=function(){function e(){Qt()(this,e),this.stretchNative=new js,this.emitter=new en.a,this.mediaUtil=new ro,this.playReject=null,this.playResolve=null,this.playTimeout=null,this.scheduleInfo=null;var t=new po(Rt.a,yo);this.viewerLifeCycle=new go(t),this.viewerSource=null,this.onCanplaythrough=this.onCanplaythrough.bind(this),this.onEnded=this.onEnded.bind(this),this.onError=this.onError.bind(this),this.onPlaying=this.onPlaying.bind(this)}return Jt()(e,[{key:"bindElement",value:function(e){e.addEventListener("canplaythrough",this.onCanplaythrough),e.addEventListener("ended",this.onEnded),e.addEventListener("error",this.onError),e.addEventListener("playing",this.onPlaying)}},{key:"destroy",value:function(){clearTimeout(this.playTimeout);var e=this.viewerSource;if(!sn()(e)){var t=e.getEl();this.unbindElement(t)}}},{key:"enter",value:function(){var e=this;return this.viewerLifeCycle.enter(function(){var t=e.scheduleInfo,n=e.viewerSource,r=t.getVolume(),i=n.getEl();return n.getFrame().enter(),r>0&&(i.muted=!1),e.play(i)})}},{key:"leave",value:function(){var e=this;return this.viewerLifeCycle.leave(function(){var t=e.viewerSource,n=t.getEl();t.getFrame().leave(),n.pause()})}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onCanplaythrough",value:function(){var e=this.viewerSource.getEl();this.emitter.emit("loaded"),e.removeEventListener("canplaythrough",this.onCanplaythrough)}},{key:"onEnded",value:function(){this.emitter.emit("played")}},{key:"onError",value:function(){var e=this.viewerSource.getEl(),t=this.mediaUtil.createError(e),n=this.playReject;if(!sn()(n))return n(t);this.emitter.emit("error",t)}},{key:"onPlaying",value:function(){var e=this.playResolve;if(!sn()(e))return e()}},{key:"play",value:function(e){var t=this;return new Promise(function(n,r){t.playReject=r,t.playResolve=n;var i=e.play();sn()(i)||i.catch(function(e){return r(e)}),t.playTimeout=setTimeout(function(){return r(new Error("Play request timed out."))},3e4)}).finally(function(){t.playReject=null,t.playResolve=null,clearTimeout(t.playTimeout)})}},{key:"release",value:function(){var e=this;return this.viewerLifeCycle.release(function(){var t=e.viewerSource,n=t.getEl();t.getFrame().release(),e.unbindElement(n),e.scheduleInfo=null,e.viewerSource=null})}},{key:"seize",value:function(e,t){var n=this;return this.viewerLifeCycle.seize(function(){n.scheduleInfo=e,n.viewerSource=t;var r=e.getStretchEnum(),i=n.stretchNative.getClassName(r),o=e.getUrl(),a=e.getVolume(),s=t.getEl();t.getFrame().seize(e),n.bindElement(s),s.classList.add("viewer-controller-video",i),s.muted=!0,s.volume=a,s.src=o})}},{key:"unbindElement",value:function(e){e.removeEventListener("canplaythrough",this.onCanplaythrough),e.removeEventListener("ended",this.onEnded),e.removeEventListener("error",this.onError),e.removeEventListener("playing",this.onPlaying)}}]),e}(),Hs=function(){function e(t,n,r,i){Qt()(this,e),this.ViewerControllerVideo=t,this.mediaUtil=n,this.stretchNative=r,this.viewerLifeCycleFactory=i}return Jt()(e,[{key:"create",value:function(){return new this.ViewerControllerVideo}}]),e}(),qs=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.delay,r=void 0===n?0:n,i=t.limit,o=void 0===i?1/0:i;if(Qt()(this,e),!kn()(r))throw new TypeError("Invalid delay ".concat(r,"."));if(!kn()(o))throw new TypeError("Invalid limit ".concat(o,"."));this.count=0,this.delay=r,this.limit=o,this.timeout=null}return Jt()(e,[{key:"destroy",value:function(){clearTimeout(this.timeout)}},{key:"fail",value:function(){var e=this;return new Promise(function(t){var n=e.count+1;return n>e.limit?(e.count=0,setTimeout(t,e.delay)):(e.count=n,t())})}},{key:"succeed",value:function(){var e=this;return new Promise(function(t){return e.count=0,t()})}}]),e}(),Ws=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=n.delay,i=n.limit;if(Qt()(this,e),!nn()(t))throw new TypeError("Invalid viewer delayer constructor ".concat(t,"."));if(!sn()(r)&&!kn()(r))throw new TypeError("Invalid delay ".concat(r,"."));if(!sn()(i)&&!kn()(i))throw new TypeError("Invalid limit ".concat(i,"."));this.ViewerDelayer=t,this.delay=r,this.limit=i}return Jt()(e,[{key:"create",value:function(){return new this.ViewerDelayer({delay:this.delay,limit:this.limit})}}]),e}(),Gs=function(){function e(t,n,r){Qt()(this,e),this.el=t,this.emitter=new en.a,this.queue=n.create(),this.threadArray=[],this.threadFactory=r,this.onEntered=this.onEntered.bind(this),this.onError=this.onError.bind(this),this.onPlayed=this.onPlayed.bind(this)}return Jt()(e,[{key:"bindThread",value:function(e){e.on("error",this.onError),e.on("entered",this.onEntered),e.on("played",this.onPlayed)}},{key:"createThread",value:function(e){var t=this.threadFactory.create(this.el,e);return this.bindThread(t),t.start(),t}},{key:"createThreads",value:function(e){var t=this;return new Promise(function(n){return n(t.queue.enqueue(function(){var n=e.map(function(e){return t.createThread(e)});t.threadArray=t.threadArray.concat(n)}))})}},{key:"destroy",value:function(){var e=this;this.threadArray.forEach(function(t){e.unbindThread(t),t.destroy()})}},{key:"destroyThread",value:function(e){return this.unbindThread(e),e.stop().then(function(){return e.destroy()})}},{key:"destroyThreads",value:function(){var e=this;return new Promise(function(t){return t(e.queue.enqueue(function(){return e.threadArray.reduce(function(t,n){return t.then(function(){return e.destroyThread(n)})},Promise.resolve()).then(function(){e.threadArray=[]})}))})}},{key:"handleError",value:function(e){this.emitter.emit("error",e)}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onEntered",value:function(e){this.emitter.emit("entered",e)}},{key:"onError",value:function(e){this.handleError(e)}},{key:"onPlayed",value:function(e){this.emitter.emit("played",e)}},{key:"unbindThread",value:function(e){e.off("error",this.onError),e.off("entered",this.onEntered),e.off("played",this.onPlayed)}}]),e}(),Ks=function(){function e(t,n,r){Qt()(this,e),this.ViewerDirector=t,this.queueFactory=n,this.threadFactory=r}return Jt()(e,[{key:"create",value:function(e){return new this.ViewerDirector(e,this.queueFactory,this.threadFactory)}}]),e}(),Qs=function(){function e(t){Qt()(this,e),this.directorArray=[],this.factory=t}return Jt()(e,[{key:"create",value:function(e){var t=this.factory.create(e);return this.directorArray.push(t),t}},{key:"destroy",value:function(e){var t=this.directorArray,n=t.indexOf(e);if(-1===n)throw new Error('Unknown director "'.concat(e,'".'));t.splice(n,1),e.destroy()}},{key:"getAll",value:function(){return Array.from(this.directorArray)}}]),e}(),Zs=function(){function e(t,n){Qt()(this,e),this.ViewerLifeCycle=t,this.stateMachineFactory=n}return Jt()(e,[{key:"create",value:function(){return new this.ViewerLifeCycle(this.stateMachineFactory)}}]),e}(),Js=function(){function e(t,n,r,i,o,a,s){Qt()(this,e);var u=new t;u.register("image/*",n),u.register("application/pdf",i),u.register("application/x-http-stream",o),u.register("application/x-kiwi-kiosk-1",r),u.register("video/*",a),u.register("text/html",s),this.mediumRegistry=u}return Jt()(e,[{key:"find",value:function(e){return this.mediumRegistry.find(e)}},{key:"getAll",value:function(){return this.mediumRegistry.getAll()}}]),e}(),Xs=n(168),eu=n.n(Xs),tu=function(){function e(t,n,r){if(Qt()(this,e),!nn()(t))throw new TypeError("Invalid parent element ".concat(t,"."));if(!nn()(n))throw new TypeError("Invalid schedule info ".concat(n,"."));this.controller=null,this.emitter=new en.a,this.failed=!1,this.parentEl=t,this.played=!1,this.scheduleInfo=n,this.source=null,this.stateMachine=r.create({init:"created",transitions:[{name:"delete",from:["created","entered","left","seized"],to:"deleted"},{name:"enter",from:"seized",to:"entered"},{name:"leave",from:"entered",to:"left"},{name:"release",from:["left","seized"],to:"released"},{name:"seize",from:"created",to:"seized"}]}),this.onError=this.onError.bind(this),this.onLoaded=this.onLoaded.bind(this),this.onPlayed=this.onPlayed.bind(this)}return Jt()(e,[{key:"createController",value:function(e){var t=e.createController();return t.on("error",this.onError),t.on("loaded",this.onLoaded),t.on("played",this.onPlayed),t}},{key:"delete",value:function(){var e=this;return this.stateMachine.transitAsync("delete",function(){var t=e.controller;sn()(t)||(e.destroyController(t),e.controller=null);var n=e.source;if(!sn()(n))return e.deleteSource(n).then(function(){e.source=null})})}},{key:"deleteSource",value:function(e){return this.scheduleInfo.getViewerType().getSourceCreator().delete(e)}},{key:"destroy",value:function(){var e=this.controller;sn()(e)||this.destroyController(e)}},{key:"destroyController",value:function(e){e.off("error",this.onError),e.off("loaded",this.onLoaded),e.off("played",this.onPlayed),e.destroy()}},{key:"enter",value:function(){var e=this;return this.stateMachine.transitAsync("enter",function(){return e.controller.enter()})}},{key:"getScheduleInfo",value:function(){return this.scheduleInfo}},{key:"isFailed",value:function(){return this.failed}},{key:"isPlayed",value:function(){return this.played}},{key:"leave",value:function(){var e=this;return this.stateMachine.transitAsync("leave",function(){return e.controller.leave()})}},{key:"release",value:function(){var e=this;return this.stateMachine.transitAsync("release",function(){var t=e.controller;return t.release().then(function(){return e.destroyController(t),e.controller=null,e.scheduleInfo.getViewerType().getSourceCreator().receive(e.source).then(function(){e.source=null})})})}},{key:"seize",value:function(){var e=this;return this.stateMachine.transitAsync("seize",function(){var t=e.scheduleInfo,n=t.getViewerType();return n.getSourceCreator().lend(e.parentEl,t).then(function(r){e.source=r;var i=e.createController(n);return e.controller=i,i.seize(t,r)})})}},{key:"setFailed",value:function(e){if(!eu()(e))throw new TypeError("Invalid value ".concat(e,"."));this.failed=e}},{key:"setPlayed",value:function(e){if(!eu()(e))throw new TypeError("Invalid value ".concat(e,"."));this.played=e}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onError",value:function(e){this.emitter.emit("error",this,e)}},{key:"onLoaded",value:function(){this.emitter.emit("loaded",this)}},{key:"onPlayed",value:function(){this.emitter.emit("played",this)}}]),e}(),nu=function(){function e(t,n){if(Qt()(this,e),!nn()(t))throw new TypeError("Invalid viewer slide constructor ".concat(t,"."));this.ViewerSlide=t,this.stateMachineFactory=n}return Jt()(e,[{key:"create",value:function(e,t){return new this.ViewerSlide(e,t,this.stateMachineFactory)}}]),e}(),ru=function(){function e(t,n){if(Qt()(this,e),!nn()(n))throw new TypeError("Invalid parent element ".concat(n,"."));var r=t.create(),i=r.getEl(),o=document.createElement("iframe");i.appendChild(o),n.appendChild(i),this.el=o,this.frame=r,this.parentEl=n}return Jt()(e,[{key:"destroy",value:function(){this.el.removeAttribute("src");var e=this.frame.getEl();this.parentEl.removeChild(e)}},{key:"getEl",value:function(){var e=this.el;if(sn()(e))throw new TypeError("Missing element.");return e}},{key:"getFrame",value:function(){return this.frame}},{key:"setParentEl",value:function(e){if(!nn()(e))throw new TypeError("Invalid parent element ".concat(e,"."));if(e!==this.parentEl){var t=this.frame.getEl();e.appendChild(t),this.parentEl=e}}}]),e}(),iu=function(){function e(t,n){Qt()(this,e),this.pool=t.create(n),this.sourceFactory=n}return Jt()(e,[{key:"delete",value:function(e){var t=this;return new Promise(function(n){return n(t.pool.delete(e))})}},{key:"destroy",value:function(){this.pool.destroy()}},{key:"getLent",value:function(){return this.pool.getLent()}},{key:"getMax",value:function(){return this.pool.getMax()}},{key:"lend",value:function(e,t){var n=this;return new Promise(function(t){var r=n.pool;n.sourceFactory.setParentEl(e);var i=r.lend();return i.setParentEl(e),t(i)})}},{key:"receive",value:function(e){var t=this;return new Promise(function(n){return n(t.pool.delete(e))})}},{key:"replace",value:function(){return Promise.resolve()}}]),e}(),ou=function(){function e(t,n){Qt()(this,e),this.ViewerSourceIframe=t,this.frameFactory=n,this.parentEl=null}return Jt()(e,[{key:"create",value:function(){return new this.ViewerSourceIframe(this.frameFactory,this.parentEl)}},{key:"delete",value:function(e){return e.destroy()}},{key:"setParentEl",value:function(e){this.parentEl=e}}]),e}(),au=function(){function e(t,n){if(Qt()(this,e),!nn()(n))throw new TypeError("Invalid parent element ".concat(n,"."));var r=t.create(),i=r.getEl(),o=document.createElement("video");i.appendChild(o),n.appendChild(i),this.el=o,this.frame=r,this.parentEl=n}return Jt()(e,[{key:"destroy",value:function(){var e=this.el;e.pause(),e.removeAttribute("src"),e.load();var t=this.frame.getEl();this.parentEl.removeChild(t)}},{key:"getEl",value:function(){var e=this.el;if(sn()(e))throw new TypeError("Missing element.");return e}},{key:"getFrame",value:function(){return this.frame}},{key:"setParentEl",value:function(e){if(!nn()(e))throw new TypeError("Invalid parent element ".concat(e,"."));if(e!==this.parentEl){var t=this.frame.getEl();e.appendChild(t),this.parentEl=e}}}]),e}(),su=function(){function e(t,n,r){Qt()(this,e),this.pool=t.create(r),this.repairer=n,this.sourceFactory=r}return Jt()(e,[{key:"delete",value:function(e){var t=this;return new Promise(function(n){return e.getFrame().repair(),n(t.repairer.repair(e.getEl()).then(function(){return t.pool.receive(e)}))})}},{key:"destroy",value:function(){this.pool.destroy()}},{key:"getLent",value:function(){return this.pool.getLent()}},{key:"getMax",value:function(){return this.pool.getMax()}},{key:"lend",value:function(e,t){var n=this;return new Promise(function(t){n.sourceFactory.setParentEl(e);var r=n.pool.lend();return r.setParentEl(e),t(r)})}},{key:"receive",value:function(e){var t=this;return new Promise(function(n){return n(t.repairer.repair(e.getEl()).then(function(){return t.pool.receive(e)}))})}},{key:"replace",value:function(){return Promise.resolve()}}]),e}(),uu=function(){function e(t,n){Qt()(this,e),this.ViewerSourceVideo=t,this.frameFactory=n,this.parentEl=null}return Jt()(e,[{key:"create",value:function(){return new this.ViewerSourceVideo(this.frameFactory,this.parentEl)}},{key:"delete",value:function(e){return e.destroy()}},{key:"setParentEl",value:function(e){this.parentEl=e}}]),e}(),cu=function(){function e(t,n,r,i,o,a){var s=(arguments.length>6&&void 0!==arguments[6]?arguments[6]:{}).loadLimit,u=void 0===s?1/0:s;Qt()(this,e),this.delayer=t.create(),this.el=n,this.emitter=new en.a,this.loadLimit=u,this.loadRequested=!1,this.loadingSlide=null,this.logger=r,this.networkListener=i,this.playRequested=!1,this.playingSlide=null,this.queuePromise=null,this.scheduleStrategy=o,this.slideFactory=a,this.stopRequested=!1,this.timeout=null,this.onOnlineChanged=this.onOnlineChanged.bind(this),this.onSchedulePlayed=this.onSchedulePlayed.bind(this),this.onSlideError=this.onSlideError.bind(this),this.onSlidePlayed=this.onSlidePlayed.bind(this)}return Jt()(e,[{key:"activateLoading",value:function(){this.playingSlide=this.loadingSlide,this.loadingSlide=null}},{key:"bindSlide",value:function(e){e.on("error",this.onSlideError),e.on("played",this.onSlidePlayed)}},{key:"createLoading",value:function(e){var t=this;return new Promise(function(n){var r=t.createSlide(e);return t.loadingSlide=r,n(r.seize())})}},{key:"createPlaying",value:function(e){var t=this;return new Promise(function(n){var r=t.createSlide(e);return t.playingSlide=r,n(r.seize())})}},{key:"createSlide",value:function(e){var t=this.slideFactory.create(this.el,e);return this.bindSlide(t),t}},{key:"deleteLoading",value:function(){var e=this;return this.deleteSlide(this.loadingSlide).then(function(){e.loadingSlide=null})}},{key:"deletePlaying",value:function(){var e=this;return this.deleteSlide(this.playingSlide).then(function(){e.playingSlide=null})}},{key:"deleteSlide",value:function(e){var t=this;return new Promise(function(n){return n(e.delete().then(function(){return t.destroySlide(e)}))})}},{key:"destroySlide",value:function(e){this.unbindSlide(e),e.destroy()}},{key:"dequeue",value:function(){var e=this;return new Promise(function(t){return e.stopRequested?(e.playRequested=!1,e.loadRequested=!1,t(e.unsetLoading().then(function(){return e.unsetPlaying()}))):e.playRequested?(e.playRequested=!1,e.loadRequested=!1,t(e.playUnsafe().then(function(t){var n=e.delayer;return t?n.succeed().then(function(){return e.wait()}).then(function(){return e.loadUnsafe()}).then(function(){return e.dequeue()}):(e.playRequested=!0,n.fail().then(function(){return e.dequeue()}))}))):e.loadRequested?(e.loadRequested=!1,t(e.wait().then(function(){return e.loadUnsafe()}).then(function(){return e.dequeue()}))):t()})}},{key:"destroy",value:function(){clearTimeout(this.timeout);var e=this.loadingSlide,t=this.playingSlide;sn()(e)||this.destroySlide(e),sn()(t)||this.destroySlide(t),this.networkListener.off("onlineChanged",this.onOnlineChanged),this.scheduleStrategy.off("played",this.onSchedulePlayed),this.scheduleStrategy.destroy(),this.delayer.destroy()}},{key:"enterPlaying",value:function(){var e=this;return new Promise(function(t){var n=e.playingSlide;return t(n.enter().then(function(){e.emitter.emit("entered",n.getScheduleInfo())}))})}},{key:"enqueue",value:function(){var e=this;return new Promise(function(t){var n=e.queuePromise;if(!sn()(n))return t(n);var r=e.dequeue().finally(function(){e.queuePromise=null});return e.queuePromise=r,t(r)})}},{key:"handleError",value:function(e){this.emitter.emit("error",e)}},{key:"load",value:function(){var e=this;return new Promise(function(t){return e.loadRequested=!0,t(e.enqueue())}).catch(function(t){return e.handleError(t)})}},{key:"loadStep",value:function(e){var t=this;return new Promise(function(n){if(e>t.loadLimit)return n();var r=t.scheduleStrategy.plan(e)[e-1];if(!r.isPreloadable())return n();if(r.isEmpty())return n(t.unsetLoading());var i=t.loadingSlide;return!sn()(i)&&r.isEqual(i.getScheduleInfo())?n():n(t.unsetLoading().then(function(){var n=t.networkListener.isOnline();return r.isViewable(n)?t.setLoading(r).then(function(n){if(!n)return t.loadStep(e+1)}):t.loadStep(e+1)}))})}},{key:"loadUnsafe",value:function(){return this.loadStep(1)}},{key:"off",value:function(){var e;(e=this.emitter).off.apply(e,arguments)}},{key:"on",value:function(){var e;(e=this.emitter).on.apply(e,arguments)}},{key:"onOnlineChanged",value:function(e){var t=this.playingSlide;if(!sn()(t)&&!t.getScheduleInfo().isViewable(e))return this.play();var n=this.loadingSlide;return sn()(n)||n.getScheduleInfo().isViewable(e)?void 0:this.load()}},{key:"onSchedulePlayed",value:function(e){var t=this.playingSlide;if(sn()(t))throw new Error("Missing playing slide.");if(!t.getScheduleInfo().isEqual(e))throw new Error("Unexpected played slide.");t.setPlayed(!0),this.play()}},{key:"onSlideError",value:function(e,t){this.logger.warn(t),e.setFailed(!0),e===this.playingSlide&&this.play()}},{key:"onSlidePlayed",value:function(e){e.isPlayed()||(e.setPlayed(!0),this.play())}},{key:"play",value:function(){var e=this;return new Promise(function(t){return e.playRequested=!0,t(e.enqueue())}).catch(function(t){return e.handleError(t)})}},{key:"playStep",value:function(){var e=this;return new Promise(function(t){var n=e.scheduleStrategy.go();if(n.isEmpty())return t(!0);var r=e.networkListener.isOnline();return n.isViewable(r)?t(e.setPlaying(n)):t(!1)})}},{key:"playUnsafe",value:function(){var e=this;return this.unsetPlaying().then(function(){return e.playStep()})}},{key:"releaseLoading",value:function(){var e=this;return this.releaseSlide(this.loadingSlide).then(function(){e.loadingSlide=null})}},{key:"releasePlaying",value:function(){var e=this;return this.releaseSlide(this.playingSlide).then(function(){e.playingSlide=null})}},{key:"releaseSlide",value:function(e){var t=this;return new Promise(function(n){return n(e.release().then(function(){return t.unbindSlide(e)}))})}},{key:"setLoading",value:function(e){var t=this;return this.createLoading(e).then(function(){return!0}).catch(function(e){return t.logger.warn(e),!sn()(t.loadingSlide)&&t.deleteLoading().then(function(){return!1})})}},{key:"setPlaying",value:function(e){var t=this;return new Promise(function(n){var r=t.loadingSlide;return!sn()(r)&&e.isEqual(r.getScheduleInfo())?r.isFailed()?n(!1):(t.activateLoading(),n(t.enterPlaying().then(function(){return!0}))):n(t.createPlaying(e).then(function(){return t.playingSlide.isFailed()?n(!1):t.enterPlaying().then(function(){return!0})}))}).catch(function(e){return t.logger.warn(e),!sn()(t.playingSlide)&&t.deletePlaying().then(function(){return!1})})}},{key:"start",value:function(){this.networkListener.on("onlineChanged",this.onOnlineChanged),this.scheduleStrategy.on("played",this.onSchedulePlayed),this.play()}},{key:"stop",value:function(){return this.networkListener.off("onlineChanged",this.onOnlineChanged),this.scheduleStrategy.off("played",this.onSchedulePlayed),this.stopRequested=!0,this.enqueue()}},{key:"unbindSlide",value:function(e){e.off("error",this.onSlideError),e.off("played",this.onSlidePlayed)}},{key:"unsetLoading",value:function(){var e=this;return new Promise(function(t){var n=e.loadingSlide;return sn()(n)?t():n.isFailed()?t(e.deleteLoading()):t(e.releaseLoading().catch(function(t){return e.handleError(t),e.deleteLoading()}))})}},{key:"unsetPlaying",value:function(){var e=this;return new Promise(function(t){var n=e.playingSlide;return sn()(n)?t():n.isFailed()?t(e.deletePlaying()):(e.emitter.emit("played",n.getScheduleInfo()),t(n.leave().then(function(){return e.releasePlaying()}).catch(function(t){return e.handleError(t),e.deletePlaying()})))})}},{key:"wait",value:function(){var e=this;return new Promise(function(t){e.timeout=setTimeout(t,200)})}}]),e}(),lu=function(){function e(t,n,r,i,o){var a=(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).loadLimit;Qt()(this,e),this.ViewerThread=t,this.delayerFactory=n,this.loadLimit=a,this.logger=r,this.networkListener=i,this.slideFactory=o}return Jt()(e,[{key:"create",value:function(e,t){return new this.ViewerThread(this.delayerFactory,e,this.logger,this.networkListener,t,this.slideFactory,{loadLimit:this.loadLimit})}}]),e}(),fu=function(){function e(t){Qt()(this,e),this.viewerSourceCreator=t}return Jt()(e,[{key:"createController",value:function(){return new Ys}},{key:"getSourceCreator",value:function(){return this.viewerSourceCreator}},{key:"getUrl",value:function(e){return e.url}},{key:"isExtractable",value:function(){return!1}},{key:"isOfflineable",value:function(){return!1}},{key:"isPreloadable",value:function(e){return!0}}]),e}(),hu=function(){function e(t,n,r){Qt()(this,e),this.loadDelay=t,this.preflighter=n,this.sourceCreator=r}return Jt()(e,[{key:"createController",value:function(){return new bo(this.loadDelay,this.preflighter)}},{key:"getSourceCreator",value:function(){return this.sourceCreator}},{key:"getUrl",value:function(e){return e.url}},{key:"isExtractable",value:function(){return!1}},{key:"isOfflineable",value:function(){return!1}},{key:"isPreloadable",value:function(e){return!1}}]),e}(),du=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"getHeight",value:function(){return"0"}},{key:"isDisplayed",value:function(){return!1}},{key:"isOverlapping",value:function(){return!1}}]),e}(),pu=function(){function e(t){Qt()(this,e),this.VirtualKeyboardHidden=t}return Jt()(e,[{key:"create",value:function(){return new this.VirtualKeyboardHidden}}]),e}(),vu=function(){function e(t){Qt()(this,e),this.factory=t}return Jt()(e,[{key:"destroy",value:function(){}},{key:"getInfo",value:function(){var e=this;return new Promise(function(t){return t(e.factory.create())})}},{key:"on",value:function(e,t){}},{key:"off",value:function(e,t){}}]),e}(),mu=function(){function e(t,n){Qt()(this,e),n.config.productionTip=!1,n.use(t,{enableAutoClasses:!0,events:"none",classNames:{valid:"valid",invalid:"invalid"},locale:"en"}),this.Vue=n}return Jt()(e,[{key:"create",value:function(e){return new this.Vue(e)}}]),e}(),yu=function(){function e(t){Qt()(this,e),this.emitter=new en.a,this.parser=t,this.onKeydown=this.onKeydown.bind(this),document.addEventListener("keydown",this.onKeydown)}return Jt()(e,[{key:"destroy",value:function(){document.removeEventListener("keydown",this.onKeydown)}},{key:"off",value:function(e,t){this.emitter.off(e,t)}},{key:"on",value:function(e,t){this.emitter.on(e,t)}},{key:"onKeydown",value:function(e){var t=this.parser.parseKeyCode(e.keyCode);sn()(t)||this.emitter.emit("buttonDown",t)}}]),e}(),gu=function(){function e(t){Qt()(this,e),this.listener=t}return Jt()(e,[{key:"getLocalLock",value:function(){return new Promise(function(){var e=new Error("Getting the local control lock is not supported.");throw e.name=Bi.NotSupportedError,e})}},{key:"getRemoteLock",value:function(){return new Promise(function(){var e=new Error("Getting the remote control lock is not supported.");throw e.name=Bi.NotSupportedError,e})}},{key:"off",value:function(e,t){this.listener.off(e,t)}},{key:"on",value:function(e,t){this.listener.on(e,t)}},{key:"setLocalLock",value:function(e){return new Promise(function(){var e=new Error("Setting the local control lock is not supported.");throw e.name=Bi.NotSupportedError,e})}},{key:"setRemoteLock",value:function(e){return new Promise(function(){var e=new Error("Setting the remote control lock is not supported.");throw e.name=Bi.NotSupportedError,e})}}]),e}(),bu=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"parseKeyCode",value:function(e){switch(e){case 13:return Ho.Enter;case 37:return Ho.ArrowLeft;case 38:return Ho.ArrowUp;case 39:return Ho.ArrowRight;case 40:return Ho.ArrowDown;default:return null}}}]),e}(),wu=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"getAllUnits",value:function(){return Promise.resolve([])}},{key:"getInfo",value:function(){var e=this;return new Promise(function(t){return t(e.getAllUnits().then(function(e){return{driveUnitArray:e}}))})}}]),e}(),_u=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"getInfo",value:function(){return new Promise(function(){var e=new Error("Unable to get memory info.");throw e.name=Bi.NotSupportedError,e})}}]),e}(),ku=function(){function e(t,n){Qt()(this,e),this.emitter=new en.a,this.eventTarget=t,this.listenerMap=new Map,this.navigator=n,this.onOffline=this.onOffline.bind(this),this.onOnline=this.onOnline.bind(this)}return Jt()(e,[{key:"isOnline",value:function(){return this.navigator.onLine}},{key:"off",value:function(e,t){var n=this.eventTarget,r=this.listenerMap;if("onlineChanged"===e&&r.has(t)){var i=r.get(t),o=i.onOffline,a=i.onOnline;r.delete(t),n.removeEventListener("offline",o),n.removeEventListener("online",a)}}},{key:"on",value:function(e,t){var n=this.eventTarget,r=this.listenerMap;if("onlineChanged"===e&&!r.has(t)){var i=function(){return t(!1)},o=function(){return t(!0)};r.set(t,{onOffline:i,onOnline:o}),n.addEventListener("offline",i),n.addEventListener("online",o)}}},{key:"onOffline",value:function(){this.emitter.emit("onlineChanged",!1)}},{key:"onOnline",value:function(){this.emitter.emit("onlineChanged",!0)}}]),e}(),xu=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"getTemperature",value:function(){return new Promise(function(){var e=new Error("Unable to get the temperature.");throw e.name=Bi.NotSupportedError,e})}}]),e}(),Eu=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"getVolume",value:function(){return new Promise(function(){var e=new Error("Unable to get the volume.");throw e.name=Bi.NotSupportedError,e})}},{key:"isMuted",value:function(){return new Promise(function(){var e=new Error("Unable to get the muted state.");throw e.name=Bi.NotSupportedError,e})}},{key:"setVolume",value:function(e){return Promise.resolve()}}]),e}(),Tu=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"destroy",value:function(){}},{key:"start",value:function(){return Promise.resolve()}}]),e}(),Au=function(){function e(){Qt()(this,e)}return Jt()(e,[{key:"getZone",value:function(){return new Promise(function(e){try{var t=Intl.DateTimeFormat().resolvedOptions().timeZone;if(sn()(t))throw new Error("Missing time zone.");return e(t)}catch(e){throw e.name=Bi.NotSupportedError,e}})}}]),e}(),Su=n(241),Cu=n.n(Su);ot.a.config.strict=!0;var Iu=new ot.a;new Promise(function(e){return e(Iu.constant("Console",console).constant("ConsoleLoggerConstructor",$r).constant("SentryBrowser",a).constant("SentryLoggerConstructor",xs).constant("SentryOfflineIntegrationOptions",{key:"".concat(Pr.a.name,"/sentryEvent"),maxEvents:Pr.a.sentryMaxEvents}).constant("SentryVueIntegrationOptions",{Vue:Gt.a}).constant("buildId",kiwi.buildId).constant("env","production").constant("sentryCaptureErrorLevel",Pr.a.sentryCaptureErrorLevel).constant("sentryDsn",kiwi.sentryDsn).service("ConsoleLoggerFactory",Vr,"ConsoleLoggerConstructor","Console","ErrorLevelFactory").service("ErrorLevelFactory",Fi).service("SentryLoggerFactory",Es,"SentryBrowser","SentryLoggerConstructor","sentryCaptureErrorLevel","ErrorLevelFactory","SentryOfflineIntegration","SentrySeverityFactory","SentryVueIntegration").service("SentryOfflineIntegration",As,"SentryOfflineIntegrationOptions").service("SentrySeverityFactory",Cs).service("SentryVueIntegration",rt,"SentryVueIntegrationOptions").serviceFactory("Logger",To,"buildId","ConsoleLoggerFactory","env","sentryDsn","SentryLoggerFactory").container.Logger)}).then(function(){return Iu.constant("CommunicatorSettingsConstructor",Ur).constant("Config",Pr.a).constant("ContentTaskPlanCronConstructor",ni).constant("ContentTaskPlanIteratorConstructor",ii).constant("CssValue",st.a).constant("DhtmlxToIcalEventConstructor",yi).constant("DhtmlxToIcalRecTypeConstructor",xi).constant("DivViewerSourceConstructor",Ti).constant("Document",document).constant("DsLocalStorageAdapterOptions",{basePath:Pr.a.name}).constant("Fecha",It).constant("FileSystemPathConstructor",Vi).constant("GenericPool",Pt.a).constant("IcalApi",jt.a).constant("ImageViewerControllerConstructor",fo).constant("JavascriptStateMachine",Rt.a).constant("MediumRegistryConstructor",Oo).constant("Nanoid",s).constant("Navigator",navigator).constant("PathBrowserify",zt.a).constant("PdfParentConstructor",Ro).constant("PdfViewerControllerConstructor",Uo).constant("PdfViewerSourceConstructor",$o).constant("PenpalConnectToChild",Vt.a).constant("PoolAsyncConstructor",La).constant("PoolConstructor",Da).constant("PositionFrameConstructor",Na).constant("QueueConstructor",Ya).constant("SetupErrorConstructor",Ps).constant("StateMachineConstructor",yo).constant("VeeValidate",Wt.a).constant("ViewerControllerVideoConstructor",Ys).constant("ViewerDelayerConstructor",qs).constant("ViewerDelayerOptions",{delay:Pr.a.viewer.errorDelay,limit:Pr.a.viewer.errorLimit}).constant("ViewerDirectorConstructor",Gs).constant("ViewerLifeCycleConstructor",go).constant("ViewerSlideConstructor",tu).constant("ViewerSourceIframeConstructor",ru).constant("ViewerSourceVideoConstructor",au).constant("ViewerThreadConstructor",cu).constant("ViewerThreadOptions",{loadLimit:Pr.a.viewer.loadLimit}).constant("VirtualKeyboardHiddenConstructor",du).constant("VueConstructor",Gt.a).constant("Window",window).constant("autorebootDefaultDisabled",Pr.a.autorebootDefaultDisabled).constant("autorebootDefaultInterval",Pr.a.autorebootDefaultInterval).constant("autorebootMinInterval",Pr.a.autorebootMinInterval).constant("contentTaskMaxInterval",Pr.a.contentTaskMaxInterval).constant("defaultOrientationEnum",Pr.a.device.orientation.defaultOrientationEnum).constant("htmlIframeLoadDelay",Pr.a.htmlIframeLoadDelay).constant("htmlVideoBlank",Cu.a).constant("longTimersMaxDelay",Pr.a.longTimersMaxDelay).constant("origin",location.origin).constant("pdfConnectionTimeout",Pr.a.pdfConnectionTimeout).constant("pdfSourceMax",Pr.a.pdfSourceMax).service("AnalyticsTracker",dn,"QueueFactory","Session","Store").service("AppManager",wn).service("AutorebootCommunicator",jn).service("AutorebootManager",Nn,"Logger","autorebootMinInterval","PowerManager","LongTimers").service("AutorebootReplacer",Rn,"autorebootDefaultDisabled","autorebootDefaultInterval","AutorebootManager").service("Communicator",Dr,"ContentCommunicator").service("CommunicatorControl",Lr).service("CommunicatorSession",Rr,"AutorebootCommunicator","CommunicatorControl","Session").service("CommunicatorSettingsFactory",zr,"CommunicatorSettingsConstructor").service("ContentCommunicator",Jr,"CommunicatorSession","CommunicatorSettingsFactory","Config","ContentTaskCommunicator","FirmwareManager","PlaylistCommunicator","PowerTaskCommunicator","TaskCommunicator").service("ContentTaskCommunicator",ei,"DhtmlxDateParser","DhtmlxRecTypeUtil","DhtmlxToIcalExporter","ContentTaskPlanUidGenerator").service("ContentTaskComparator",ti).service("ContentTaskPlanCronFactory",ri,"ContentTaskPlanCronConstructor","ContentTaskComparator","ContentTaskPlanIteratorFactory","LongTimers").service("ContentTaskPlanIteratorFactory",oi,"ContentTaskPlanIteratorConstructor","IcalApi","IcalExpander","contentTaskMaxInterval","IcalTimeUtil").service("ContentTaskPlanUidGenerator",ai).service("ContentTaskReplacer",si,"Store","TaskToContentTaskConverter").service("ContentTaskToTaskConverter",li).service("ControlListener",yu,"ControlParser").service("ControlManager",gu,"ControlListener").service("ControlParser",bu).service("Detector",fi,"DriveManager").service("Device",hi,"buildId","AnalyticsTracker","Communicator","ContentTaskPlanCronFactory","FingerprintBrowser","FirmwareManager","Logger","LoggerManager","NetworkListener","PowerManager","Replacer","ReportManager","ScheduleManager","Session","StartupManager","Store","Updater","ViewerDirectorResource","ViewerRegistry").service("DhtmlxDateParser",di,"Fecha").service("DhtmlxRecTypeUtil",mi,"StringUtil").service("DhtmlxToIcalEventFactory",gi,"DhtmlxToIcalEventConstructor","IcalApi","DhtmlxDateParser").service("DhtmlxToIcalExporter",_i,"IcalApi","DhtmlxToIcalEventFactory","IdGenerator","DhtmlxToIcalRecTypeFactory","IcalTimeUtil","IcalUtil").service("DhtmlxToIcalRecTypeFactory",Ei,"DhtmlxToIcalRecTypeConstructor","IcalApi","IcalUtil","DhtmlxRecTypeUtil").service("DivViewerSourceCreator",Ai,"PoolFactory","DivViewerSourceFactory").service("DivViewerSourceFactory",Si,"DivViewerSourceConstructor","PositionFrameFactory").service("Downloader",Pi,"Config","Detector","Store","Session","ViewerRegistry").service("DriveManager",wu).service("DsBinaryAdapter",Ri,"FileArchiveManager","FileSystemPathFactory","FileSystemManager","FileSystemMapper","FileTransferManager").service("DsLocalStorageAdapter",Lt.a,"DsLocalStorageAdapterOptions").service("FileArchiveManager",Ui).service("FileSystemManager",zi).service("FileSystemMapper",$i).service("FileSystemPathFactory",Yi,"FileSystemPathConstructor","PathBrowserify").service("FileTransferManager",Hi).service("FingerprintBrowser",Gi,"FingerprintHasher").service("FingerprintHasher",Ki).service("FirmwareManager",Qi,"UaParser").service("FocusManager",Ji,"ControlManager","FocusNavigator").service("FocusNavigator",Zi,"Document").service("HtmlElementRepairer",Xi).service("HtmlIframePreflighterNoop",eo).service("HtmlMediaUtil",ro).service("HtmlVideoRepairer",io,"htmlVideoBlank","HtmlElementRepairer","HtmlMediaUtil").service("IcalExpander",oo,"IcalSlicer","IcalUtil").service("IcalSlicer",ao,"IcalApi","IcalTimeUtil","IcalUtil").service("IcalTimeUtil",so,"IcalApi").service("IcalUtil",co,"IcalApi").service("IdGenerator",Po,"Nanoid").service("ImageViewerControllerFactory",ho,"ImageViewerControllerConstructor","ViewerLifeCycleFactory").service("ImageViewerType",lo,"ImageViewerControllerFactory","DivViewerSourceCreator").service("KioskViewerType",wo,"htmlIframeLoadDelay","HtmlIframePreflighterNoop","ViewerSourceIframeCreator").service("LoggerManager",Ao,"AppManager","FirmwareManager","Logger").service("LongTimers",So,"longTimersMaxDelay").service("MemoryManager",_u).service("NetworkListener",ku,"Window","Navigator").service("NetworkManager",Do).service("OrganizationHelper",jo).service("PdfOnlineViewerType",No,"PdfViewerControllerFactory","PdfViewerSourceCreator").service("PdfParentFactory",Fo,"PdfParentConstructor","PenpalConnectToChild","origin","pdfConnectionTimeout").service("PdfRecycler",Bo).service("PdfViewerControllerFactory",zo,"PdfViewerControllerConstructor","ViewerLifeCycleFactory").service("PdfViewerSourceCreator",Vo,"pdfSourceMax","PoolAsyncFactory","PdfRecycler","PdfViewerSourceFactory").service("PdfViewerSourceFactory",Yo,"PdfViewerSourceConstructor","ViewerSourceIframeCreator","PdfParentFactory").service("Player",Sa,"AppManager","ControlManager","Device","FocusManager","Logger","NetworkListener","ScreenManager","Session","SetupManager","VirtualKeyboardManager","VueFactory").service("PlaylistCommunicator",Oa,"TrackCommunicator").service("PoolAsyncFactory",Ma,"PoolAsyncConstructor","GenericPool").service("PoolFactory",ja,"PoolConstructor").service("PositionFrameFactory",Ra,"PositionFrameConstructor","CssValue","StateMachineFactory").service("PowerManager",Fa).service("PowerTaskCommunicator",Ba,"TimerCommunicator").service("PowerTaskReplacer",Ua,"Store","TaskToPowerTaskConverter").service("PowerTaskToTaskConverter",za).service("PromiseUtil",Va.a).service("QueueFactory",Ha,"QueueConstructor").service("Replacer",qa,"AutorebootReplacer","ContentTaskReplacer","Downloader","Logger","PowerTaskReplacer","Store","PromiseUtil","QueueFactory","ReplacerCommon","ReplacerControl","ReplacerPower","ReplacerScreen","ReplacerSession","ReplacerSound").service("ReplacerCommon",Wa,"Store").service("ReplacerControl",Ga,"ControlManager","Logger").service("ReplacerPower",Ka,"PowerManager").service("ReplacerScreen",Qa,"defaultOrientationEnum","ScreenManager").service("ReplacerSession",Za,"Store","Session").service("ReplacerSound",Ja,"SoundManager").service("ReportManager",es,"AppManager","ControlManager","DriveManager","FirmwareManager","Logger","MemoryManager","NetworkManager","PowerManager","ScreenManager","SensorManager","SoundManager","TimeManager").service("ScheduleManager",bs,"ViewerRegistry").service("ScreenManager",ws,"defaultOrientationEnum").service("SensorManager",xu).service("SetupErrorFactory",Ds,"SetupErrorConstructor").service("SetupManager",Ls,"OrganizationHelper","SetupErrorFactory").service("SoundManager",Eu).service("StartupManager",Tu).service("StateMachineFactory",po,"JavascriptStateMachine","StateMachineConstructor").service("StreamViewerType",Ms,"ViewerControllerVideoFactory","VideoViewerSourceCreator").service("StretchNative",js).service("StringUtil",Ns).service("TaskCommunicator",Rs,"ContentTaskToTaskConverter","PowerTaskToTaskConverter").service("TaskToContentTaskConverter",Fs,"IcalApi","IcalTimeUtil","IcalUtil","ContentTaskPlanUidGenerator").service("TaskToPowerTaskConverter",Bs).service("TimeManager",Au).service("TimerCommunicator",Us).service("TrackCommunicator",zs,"TrackPlanCommunicator").service("TrackPlanCommunicator",$s,"DhtmlxToIcalExporter").service("UaParser",Ht.a).service("Updater",Vs,"AppManager","buildId","Communicator","Session","Store").service("VideoViewerSourceCreator",su,"PoolFactory","HtmlVideoRepairer","VideoViewerSourceFactory").service("VideoViewerSourceFactory",uu,"ViewerSourceVideoConstructor","PositionFrameFactory").service("VideoViewerType",fu,"VideoViewerSourceCreator").service("ViewerControllerVideoFactory",Hs,"ViewerControllerVideoConstructor","HtmlMediaUtil","StretchNative","ViewerLifeCycleFactory").service("ViewerDelayerFactory",Ws,"ViewerDelayerConstructor","ViewerDelayerOptions").service("ViewerDirectorFactory",Ks,"ViewerDirectorConstructor","QueueFactory","ViewerThreadFactory").service("ViewerDirectorResource",Qs,"ViewerDirectorFactory").service("ViewerLifeCycleFactory",Zs,"ViewerLifeCycleConstructor","StateMachineFactory").service("ViewerRegistry",Js,"MediumRegistryConstructor","ImageViewerType","KioskViewerType","PdfOnlineViewerType","StreamViewerType","VideoViewerType","ViewerTypeWeb").service("ViewerSlideFactory",nu,"ViewerSlideConstructor","StateMachineFactory").service("ViewerSourceIframeCreator",iu,"PoolFactory","ViewerSourceIframeFactory").service("ViewerSourceIframeFactory",ou,"ViewerSourceIframeConstructor","PositionFrameFactory").service("ViewerThreadFactory",lu,"ViewerThreadConstructor","ViewerDelayerFactory","Logger","NetworkListener","ViewerSlideFactory","ViewerThreadOptions").service("ViewerTypeWeb",hu,"htmlIframeLoadDelay","HtmlIframePreflighterNoop","ViewerSourceIframeCreator").service("VirtualKeyboardHiddenFactory",pu,"VirtualKeyboardHiddenConstructor").service("VirtualKeyboardManager",vu,"VirtualKeyboardHiddenFactory").service("VueFactory",mu,"VeeValidate","VueConstructor").serviceFactory("Session",function(e){return e.inject("session",{id:Pr.a.device.session.defaultId})},"Store").serviceFactory("Store",function(e,t){return new Or({binary:e,storage:t})},"DsBinaryAdapter","DsLocalStorageAdapter").container.Player.start("#player")}).catch(function(e){return Iu.container.Logger.error(e)})},function(e,t,n){var r=n(70);e.exports=function(e,t){return r(t,function(t){return e[t]})}},function(e,t,n){var r=n(280),i=n(108);e.exports=function(e){return null==e?[]:r(e,i(e))}},function(e,t,n){var r=n(172),i=n(281);e.exports=function(e){return r(i(e))}},function(e,t){var n=Math.floor,r=Math.random;e.exports=function(e,t){return e+n(r()*(t-e+1))}},function(e,t,n){var r=n(180),i=n(172);e.exports=function(e){return i(r(e))}},function(e,t,n){e.exports=n.p+"assets/924178c7.svg"},function(e,t,n){var r=n(145);e.exports=function(e){return null!=e&&e.length?r(e,1):[]}},function(e,t,n){var r=n(286),i=n(185),o=n(184);e.exports=function(e){return o(i(e,void 0,r),e+"")}},function(e,t,n){var r=n(176),i=n(103),o=n(106),a=n(4),s=n(77);e.exports=function(e,t,n,u){if(!a(e))return e;for(var c=-1,l=(t=i(t,e)).length,f=l-1,h=e;null!=h&&++c<l;){var d=s(t[c]),p=n;if(c!=f){var v=h[d];void 0===(p=u?u(v,d,h):void 0)&&(p=a(v)?v:o(t[c+1])?[]:{})}r(h,d,p),h=h[d]}return e}},function(e,t,n){var r=n(136),i=n(288),o=n(103);e.exports=function(e,t,n){for(var a=-1,s=t.length,u={};++a<s;){var c=t[a],l=r(e,c);n(l,c)&&i(u,o(c,e),l)}return u}},function(e,t,n){var r=n(289),i=n(190);e.exports=function(e,t){return r(e,t,function(t,n){return i(e,n)})}},function(e,t){e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach(function(e){n[++t]=[e,e]}),n}},function(e,t,n){var r=n(70);e.exports=function(e,t){return r(t,function(t){return[t,e[t]]})}},function(e,t,n){var r=n(292),i=n(137),o=n(198),a=n(291),s="[object Map]",u="[object Set]";e.exports=function(e){return function(t){var n=i(t);return n==s?o(t):n==u?a(t):r(t,e(t))}}},function(e,t,n){var r=n(187);e.exports=function(e,t,n,i){return r(e,function(e,r,o){t(i,e,n(e),o)}),i}},function(e,t){e.exports=function(e,t,n,r){for(var i=-1,o=null==e?0:e.length;++i<o;){var a=e[i];t(r,a,n(a),e)}return r}},function(e,t,n){var r=n(295),i=n(294),o=n(144),a=n(13);e.exports=function(e,t){return function(n,s){var u=a(n)?r:i,c=t?t():{};return u(n,e,o(s,2),c)}}},function(e,t,n){var r=n(197),i=n(70),o=n(188),a=n(195),s=n(134),u=Math.max;e.exports=function(e){if(!e||!e.length)return[];var t=0;return e=r(e,function(e){if(s(e))return t=u(e.length,t),!0}),a(t,function(t){return i(e,o(t))})}},function(e,t){e.exports=function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}},function(e,t){e.exports=function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}},function(e,t){e.exports=function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}},function(e,t){var n=Object.prototype.hasOwnProperty;e.exports=function(e,t){return null!=e&&n.call(e,t)}},function(e,t){e.exports=function(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}},function(e,t){e.exports=function(e,t,n){for(var r=-1,i=null==e?0:e.length;++r<i;)if(n(t,e[r]))return!0;return!1}},function(e,t){e.exports=function(e,t,n){for(var r=n-1,i=e.length;++r<i;)if(e[r]===t)return r;return-1}},function(e,t){e.exports=function(e){return e!=e}},function(e,t){e.exports=function(e,t,n,r){for(var i=e.length,o=n+(r?1:-1);r?o--:++o<i;)if(t(e[o],o,e))return o;return-1}},function(e,t,n){var r=n(306),i=n(305),o=n(304);e.exports=function(e,t,n){return t==t?o(e,t,n):r(e,i,n)}},function(e,t,n){var r=n(307);e.exports=function(e,t){return!(null==e||!e.length)&&r(e,t,0)>-1}},function(e,t,n){var r=n(201),i=n(308),o=n(303),a=n(70),s=n(138),u=n(200),c=200;e.exports=function(e,t,n,l){var f=-1,h=i,d=!0,p=e.length,v=[],m=t.length;if(!p)return v;n&&(t=a(t,s(n))),l?(h=o,d=!1):t.length>=c&&(h=u,d=!1,t=new r(t));e:for(;++f<p;){var y=e[f],g=null==n?y:n(y);if(y=l||0!==y?y:0,d&&g==g){for(var b=m;b--;)if(t[b]===g)continue e;v.push(y)}else h(t,g,l)||v.push(y)}return v}},function(e,t){function n(t,r){return e.exports=n=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},n(t,r)}e.exports=n},function(e,t){e.exports=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}},function(e,t){function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function r(t){return"function"==typeof Symbol&&"symbol"===n(Symbol.iterator)?e.exports=r=function(e){return n(e)}:e.exports=r=function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":n(e)},r(t)}e.exports=r},function(e,t,n){var r=n(100),i=n(182);e.exports=function(e){return r(function(t,n){var r=-1,o=n.length,a=o>1?n[o-1]:void 0,s=o>2?n[2]:void 0;for(a=e.length>3&&"function"==typeof a?(o--,a):void 0,s&&i(n[0],n[1],s)&&(a=o<3?void 0:a,o=1),t=Object(t);++r<o;){var u=n[r];u&&e(t,u,r,a)}return t})}},function(e,t){e.exports=function(e){var t=[];if(null!=e)for(var n in Object(e))t.push(n);return t}},function(e,t,n){var r=n(4),i=n(104),o=n(314),a=Object.prototype.hasOwnProperty;e.exports=function(e){if(!r(e))return o(e);var t=i(e),n=[];for(var s in e)("constructor"!=s||!t&&a.call(e,s))&&n.push(s);return n}},function(e,t,n){var r=n(176),i=n(99);e.exports=function(e,t,n,o){var a=!n;n||(n={});for(var s=-1,u=t.length;++s<u;){var c=t[s],l=o?o(n[c],e[c],c,n,e):void 0;void 0===l&&(l=e[c]),a?i(n,c,l):r(n,c,l)}return n}},function(e,t,n){var r=n(316),i=n(133);e.exports=function(e){return r(e,i(e))}},function(e,t,n){var r=n(4),i=Object.create,o=function(){function e(){}return function(t){if(!r(t))return{};if(i)return i(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();e.exports=o},function(e,t,n){var r=n(318),i=n(179),o=n(104);e.exports=function(e){return"function"!=typeof e.constructor||o(e)?{}:r(i(e))}},function(e,t,n){var r=n(199);e.exports=function(e){var t=new e.constructor(e.byteLength);return new r(t).set(new r(e)),t}},function(e,t,n){var r=n(320);e.exports=function(e,t){var n=t?r(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}},function(e,t,n){(function(e){var r=n(44),i="object"==typeof t&&t&&!t.nodeType&&t,o=i&&"object"==typeof e&&e&&!e.nodeType&&e,a=o&&o.exports===i?r.Buffer:void 0,s=a?a.allocUnsafe:void 0;e.exports=function(e,t){if(t)return e.slice();var n=e.length,r=s?s(n):new e.constructor(n);return e.copy(r),r}}).call(this,n(68)(e))},function(e,t,n){var r=n(181),i=n(322),o=n(321),a=n(180),s=n(319),u=n(79),c=n(13),l=n(134),f=n(107),h=n(56),d=n(4),p=n(178),v=n(105),m=n(177),y=n(317);e.exports=function(e,t,n,g,b,w,_){var k=m(e,n),x=m(t,n),E=_.get(x);if(E)r(e,n,E);else{var T=w?w(k,x,n+"",e,t,_):void 0,A=void 0===T;if(A){var S=c(x),C=!S&&f(x),I=!S&&!C&&v(x);T=x,S||C||I?c(k)?T=k:l(k)?T=a(k):C?(A=!1,T=i(x,!0)):I?(A=!1,T=o(x,!0)):T=[]:p(x)||u(x)?(T=k,u(k)?T=y(k):(!d(k)||g&&h(k))&&(T=s(x))):A=!1}A&&(_.set(x,T),b(T,x,g,w,_),_.delete(x)),r(e,n,T)}}},function(e,t,n){var r=n(143),i=n(181),o=n(186),a=n(323),s=n(4),u=n(133),c=n(177);e.exports=function e(t,n,l,f,h){t!==n&&o(n,function(o,u){if(s(o))h||(h=new r),a(t,n,u,l,e,f,h);else{var d=f?f(c(t,u),o,u+"",t,n,h):void 0;void 0===d&&(d=o),i(t,u,d)}},u)}},function(e,t){e.exports=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}},function(e,t){e.exports=function(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{r||null==s.return||s.return()}finally{if(i)throw o}}return n}},function(e,t){e.exports=function(e){if(Array.isArray(e))return e}},function(e,t){var n=800,r=16,i=Date.now;e.exports=function(e){var t=0,o=0;return function(){var a=i(),s=r-(a-o);if(o=a,s>0){if(++t>=n)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}},function(e,t){e.exports=function(e){return function(){return e}}},function(e,t,n){var r=n(329),i=n(183),o=n(101),a=i?function(e,t){return i(e,"toString",{configurable:!0,enumerable:!1,value:r(t),writable:!0})}:o;e.exports=a},function(e,t){e.exports=function(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}},function(e,t,n){var r=n(102);e.exports=function(e,t){if(e!==t){var n=void 0!==e,i=null===e,o=e==e,a=r(e),s=void 0!==t,u=null===t,c=t==t,l=r(t);if(!u&&!l&&!a&&e>t||a&&s&&c&&!u&&!l||i&&s&&c||!n&&c||!o)return 1;if(!i&&!a&&!l&&e<t||l&&n&&o&&!i&&!a||u&&n&&o||!s&&o||!c)return-1}return 0}},function(e,t,n){var r=n(332);e.exports=function(e,t,n){for(var i=-1,o=e.criteria,a=t.criteria,s=o.length,u=n.length;++i<s;){var c=r(o[i],a[i]);if(c)return i>=u?c:c*("desc"==n[i]?-1:1)}return e.index-t.index}},function(e,t){e.exports=function(e,t){var n=e.length;for(e.sort(t);n--;)e[n]=e[n].value;return e}},function(e,t,n){var r=n(59);e.exports=function(e,t){return function(n,i){if(null==n)return n;if(!r(n))return e(n,i);for(var o=n.length,a=t?o:-1,s=Object(n);(t?a--:++a<o)&&!1!==i(s[a],a,s););return n}}},function(e,t){e.exports=function(e){return function(t,n,r){for(var i=-1,o=Object(t),a=r(t),s=a.length;s--;){var u=a[e?s:++i];if(!1===n(o[u],u,o))break}return t}}},function(e,t,n){var r=n(186),i=n(108);e.exports=function(e,t){return e&&r(e,t,i)}},function(e,t,n){var r=n(187),i=n(59);e.exports=function(e,t){var n=-1,o=i(e)?Array(e.length):[];return r(e,function(e,r,i){o[++n]=t(e,r,i)}),o}},function(e,t,n){var r=n(136);e.exports=function(e){return function(t){return r(t,e)}}},function(e,t,n){var r=n(188),i=n(339),o=n(135),a=n(77);e.exports=function(e){return o(e)?r(a(e)):i(e)}},function(e,t){e.exports=function(e,t){return null!=e&&t in Object(e)}},function(e,t,n){var r=n(80),i=n(70),o=n(13),a=n(102),s=1/0,u=r?r.prototype:void 0,c=u?u.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(o(t))return i(t,e)+"";if(a(t))return c?c.call(t):"";var n=t+"";return"0"==n&&1/t==-s?"-0":n}},function(e,t,n){var r=n(342);e.exports=function(e){return null==e?"":r(e)}},function(e,t,n){var r=n(141),i="Expected a function";function o(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError(i);var n=function(){var r=arguments,i=t?t.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=e.apply(this,r);return n.cache=o.set(i,a)||o,a};return n.cache=new(o.Cache||r),n}o.Cache=r,e.exports=o},function(e,t,n){var r=n(344),i=500;e.exports=function(e){var t=r(e,function(e){return n.size===i&&n.clear(),e}),n=t.cache;return t}},function(e,t,n){var r=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,i=/\\(\\)?/g,o=n(345)(function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(r,function(e,n,r,o){t.push(r?o.replace(i,"$1"):n||e)}),t});e.exports=o},function(e,t,n){var r=n(140),i=n(6),o=n(190),a=n(135),s=n(192),u=n(191),c=n(77),l=1,f=2;e.exports=function(e,t){return a(e)&&s(t)?u(c(e),t):function(n){var a=i(n,e);return void 0===a&&a===t?o(n,e):r(t,a,l|f)}}},function(e,t,n){var r=n(192),i=n(108);e.exports=function(e){for(var t=i(e),n=t.length;n--;){var o=t[n],a=e[o];t[n]=[o,a,r(a)]}return t}},function(e,t,n){var r=n(60)(n(44),"WeakMap");e.exports=r},function(e,t,n){var r=n(60)(n(44),"Set");e.exports=r},function(e,t,n){var r=n(60)(n(44),"Promise");e.exports=r},function(e,t,n){var r=n(60)(n(44),"DataView");e.exports=r},function(e,t,n){var r=n(193)(Object.keys,Object);e.exports=r},function(e,t,n){(function(e){var r=n(204),i="object"==typeof t&&t&&!t.nodeType&&t,o=i&&"object"==typeof e&&e&&!e.nodeType&&e,a=o&&o.exports===i&&r.process,s=function(){try{var e=o&&o.require&&o.require("util").types;return e||a&&a.binding&&a.binding("util")}catch(e){}}();e.exports=s}).call(this,n(68)(e))},function(e,t,n){var r=n(43),i=n(139),o=n(39),a={};a["[object Float32Array]"]=a["[object Float64Array]"]=a["[object Int8Array]"]=a["[object Int16Array]"]=a["[object Int32Array]"]=a["[object Uint8Array]"]=a["[object Uint8ClampedArray]"]=a["[object Uint16Array]"]=a["[object Uint32Array]"]=!0,a["[object Arguments]"]=a["[object Array]"]=a["[object ArrayBuffer]"]=a["[object Boolean]"]=a["[object DataView]"]=a["[object Date]"]=a["[object Error]"]=a["[object Function]"]=a["[object Map]"]=a["[object Number]"]=a["[object Object]"]=a["[object RegExp]"]=a["[object Set]"]=a["[object String]"]=a["[object WeakMap]"]=!1,e.exports=function(e){return o(e)&&i(e.length)&&!!a[r(e)]}},function(e,t){e.exports=function(){return!1}},function(e,t){e.exports=function(){return[]}},function(e,t,n){var r=n(197),i=n(357),o=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,s=a?function(e){return null==e?[]:(e=Object(e),r(a(e),function(t){return o.call(e,t)}))}:i;e.exports=s},function(e,t,n){var r=n(205),i=n(13);e.exports=function(e,t,n){var o=t(e);return i(e)?o:r(o,n(e))}},function(e,t,n){var r=n(359),i=n(358),o=n(108);e.exports=function(e){return r(e,o,i)}},function(e,t,n){var r=n(360),i=1,o=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,a,s,u){var c=n&i,l=r(e),f=l.length;if(f!=r(t).length&&!c)return!1;for(var h=f;h--;){var d=l[h];if(!(c?d in t:o.call(t,d)))return!1}var p=u.get(e);if(p&&u.get(t))return p==t;var v=!0;u.set(e,t),u.set(t,e);for(var m=c;++h<f;){var y=e[d=l[h]],g=t[d];if(a)var b=c?a(g,y,d,t,e,u):a(y,g,d,e,t,u);if(!(void 0===b?y===g||s(y,g,n,a,u):b)){v=!1;break}m||(m="constructor"==d)}if(v&&!m){var w=e.constructor,_=t.constructor;w!=_&&"constructor"in e&&"constructor"in t&&!("function"==typeof w&&w instanceof w&&"function"==typeof _&&_ instanceof _)&&(v=!1)}return u.delete(e),u.delete(t),v}},function(e,t){e.exports=function(e){var t=-1,n=Array(e.size);return e.forEach(function(e){n[++t]=e}),n}},function(e,t,n){var r=n(80),i=n(199),o=n(78),a=n(202),s=n(198),u=n(362),c=1,l=2,f="[object Boolean]",h="[object Date]",d="[object Error]",p="[object Map]",v="[object Number]",m="[object RegExp]",y="[object Set]",g="[object String]",b="[object Symbol]",w="[object ArrayBuffer]",_="[object DataView]",k=r?r.prototype:void 0,x=k?k.valueOf:void 0;e.exports=function(e,t,n,r,k,E,T){switch(n){case _:if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case w:return!(e.byteLength!=t.byteLength||!E(new i(e),new i(t)));case f:case h:case v:return o(+e,+t);case d:return e.name==t.name&&e.message==t.message;case m:case g:return e==t+"";case p:var A=s;case y:var S=r&c;if(A||(A=u),e.size!=t.size&&!S)return!1;var C=T.get(e);if(C)return C==t;r|=l,T.set(e,t);var I=a(A(e),A(t),r,k,E,T);return T.delete(e),I;case b:if(x)return x.call(e)==x.call(t)}return!1}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length;++n<r;)if(t(e[n],n,e))return!0;return!1}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t){var n="__lodash_hash_undefined__";e.exports=function(e){return this.__data__.set(e,n),this}},function(e,t,n){var r=n(143),i=n(202),o=n(363),a=n(361),s=n(137),u=n(13),c=n(107),l=n(105),f=1,h="[object Arguments]",d="[object Array]",p="[object Object]",v=Object.prototype.hasOwnProperty;e.exports=function(e,t,n,m,y,g){var b=u(e),w=u(t),_=b?d:s(e),k=w?d:s(t),x=(_=_==h?p:_)==p,E=(k=k==h?p:k)==p,T=_==k;if(T&&c(e)){if(!c(t))return!1;b=!0,x=!1}if(T&&!x)return g||(g=new r),b||l(e)?i(e,t,n,m,y,g):o(e,t,_,n,m,y,g);if(!(n&f)){var A=x&&v.call(e,"__wrapped__"),S=E&&v.call(t,"__wrapped__");if(A||S){var C=A?e.value():e,I=S?t.value():t;return g||(g=new r),y(C,I,n,m,g)}}return!!T&&(g||(g=new r),a(e,t,n,m,y,g))}},function(e,t,n){var r=n(109);e.exports=function(e,t){var n=r(this,e),i=n.size;return n.set(e,t),this.size+=n.size==i?0:1,this}},function(e,t,n){var r=n(109);e.exports=function(e){return r(this,e).has(e)}},function(e,t,n){var r=n(109);e.exports=function(e){return r(this,e).get(e)}},function(e,t){e.exports=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}},function(e,t,n){var r=n(109);e.exports=function(e){var t=r(this,e).delete(e);return this.size-=t?1:0,t}},function(e,t,n){var r=n(110),i="__lodash_hash_undefined__";e.exports=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=r&&void 0===t?i:t,this}},function(e,t,n){var r=n(110),i=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;return r?void 0!==t[e]:i.call(t,e)}},function(e,t,n){var r=n(110),i="__lodash_hash_undefined__",o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;if(r){var n=t[e];return n===i?void 0:n}return o.call(t,e)?t[e]:void 0}},function(e,t){e.exports=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}},function(e,t,n){var r=n(110);e.exports=function(){this.__data__=r?r(null):{},this.size=0}},function(e,t,n){var r=n(377),i=n(376),o=n(375),a=n(374),s=n(373);function u(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}u.prototype.clear=r,u.prototype.delete=i,u.prototype.get=o,u.prototype.has=a,u.prototype.set=s,e.exports=u},function(e,t,n){var r=n(378),i=n(112),o=n(142);e.exports=function(){this.size=0,this.__data__={hash:new r,map:new(o||i),string:new r}}},function(e,t){e.exports=function(e,t){return null==e?void 0:e[t]}},function(e,t,n){var r=n(44)["__core-js_shared__"];e.exports=r},function(e,t,n){var r,i=n(381),o=(r=/[^.]+$/.exec(i&&i.keys&&i.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";e.exports=function(e){return!!o&&o in e}},function(e,t,n){var r=n(56),i=n(382),o=n(4),a=n(203),s=/^\[object .+?Constructor\]$/,u=Function.prototype,c=Object.prototype,l=u.toString,f=c.hasOwnProperty,h=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!o(e)||i(e))&&(r(e)?h:s).test(a(e))}},function(e,t,n){var r=n(112),i=n(142),o=n(141),a=200;e.exports=function(e,t){var n=this.__data__;if(n instanceof r){var s=n.__data__;if(!i||s.length<a-1)return s.push([e,t]),this.size=++n.size,this;n=this.__data__=new o(s)}return n.set(e,t),this.size=n.size,this}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t){e.exports=function(e){return this.__data__.get(e)}},function(e,t){e.exports=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}},function(e,t,n){var r=n(112);e.exports=function(){this.__data__=new r,this.size=0}},function(e,t,n){var r=n(111);e.exports=function(e,t){var n=this.__data__,i=r(n,e);return i<0?(++this.size,n.push([e,t])):n[i][1]=t,this}},function(e,t,n){var r=n(111);e.exports=function(e){return r(this.__data__,e)>-1}},function(e,t,n){var r=n(111);e.exports=function(e){var t=this.__data__,n=r(t,e);return n<0?void 0:t[n][1]}},function(e,t,n){var r=n(111),i=Array.prototype.splice;e.exports=function(e){var t=this.__data__,n=r(t,e);return!(n<0||(n==t.length-1?t.pop():i.call(t,n,1),--this.size,0))}},function(e,t){e.exports=function(){this.__data__=[],this.size=0}},function(e,t,n){var r=n(143),i=n(140),o=1,a=2;e.exports=function(e,t,n,s){var u=n.length,c=u,l=!s;if(null==e)return!c;for(e=Object(e);u--;){var f=n[u];if(l&&f[2]?f[1]!==e[f[0]]:!(f[0]in e))return!1}for(;++u<c;){var h=(f=n[u])[0],d=e[h],p=f[1];if(l&&f[2]){if(void 0===d&&!(h in e))return!1}else{var v=new r;if(s)var m=s(d,p,h,e,t,v);if(!(void 0===m?i(p,d,o|a,s,v):m))return!1}}return!0}},function(e,t,n){var r=n(394),i=n(348),o=n(191);e.exports=function(e){var t=i(e);return 1==t.length&&t[0][2]?o(t[0][0],t[0][1]):function(n){return n===e||r(n,e,t)}}},function(e,t,n){var r=n(70),i=n(144),o=n(338),a=n(334),s=n(138),u=n(333),c=n(101);e.exports=function(e,t,n){var l=-1;t=r(t.length?t:[c],s(i));var f=o(e,function(e,n,i){return{criteria:r(t,function(t){return t(e)}),index:++l,value:e}});return a(f,function(e,t){return u(e,t,n)})}},function(e,t){var n=Object.prototype.toString;e.exports=function(e){return n.call(e)}},function(e,t,n){var r=n(80),i=Object.prototype,o=i.hasOwnProperty,a=i.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=o.call(e,s),n=e[s];try{e[s]=void 0;var r=!0}catch(e){}var i=a.call(e);return r&&(t?e[s]=n:delete e[s]),i}},function(e,t,n){var r=n(43),i=n(39),o="[object Arguments]";e.exports=function(e){return i(e)&&r(e)==o}},function(e,t,n){var r=n(80),i=n(79),o=n(13),a=r?r.isConcatSpreadable:void 0;e.exports=function(e){return o(e)||i(e)||!!(a&&e&&e[a])}},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var r,i,o,a,s,u=1,c={},l=!1,f=e.document,h=Object.getPrototypeOf&&Object.getPrototypeOf(e);h=h&&h.setTimeout?h:e,"[object process]"==={}.toString.call(e.process)?r=function(e){t.nextTick(function(){p(e)})}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((o=new MessageChannel).port1.onmessage=function(e){p(e.data)},r=function(e){o.port2.postMessage(e)}):f&&"onreadystatechange"in f.createElement("script")?(i=f.documentElement,r=function(e){var t=f.createElement("script");t.onreadystatechange=function(){p(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):r=function(e){setTimeout(p,0,e)}:(a="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(a)&&p(+t.data.slice(a.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),r=function(t){e.postMessage(a+t,"*")}),h.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n<t.length;n++)t[n]=arguments[n+1];var i={callback:e,args:t};return c[u]=i,r(u),u++},h.clearImmediate=d}function d(e){delete c[e]}function p(e){if(l)setTimeout(p,0,e);else{var t=c[e];if(t){l=!0;try{!function(e){var t=e.callback,r=e.args;switch(r.length){case 0:t();break;case 1:t(r[0]);break;case 2:t(r[0],r[1]);break;case 3:t(r[0],r[1],r[2]);break;default:t.apply(n,r)}}(t)}finally{d(e),l=!1}}}}}("undefined"==typeof self?void 0===e?this:e:self)}).call(this,n(42),n(127))},function(e,t,n){(function(e){var r=void 0!==e&&e||"undefined"!=typeof self&&self||window,i=Function.prototype.apply;function o(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new o(i.call(setTimeout,r,arguments),clearTimeout)},t.setInterval=function(){return new o(i.call(setInterval,r,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},o.prototype.unref=o.prototype.ref=function(){},o.prototype.close=function(){this._clearFn.call(r,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(401),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(42))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r={"http:":"80","https:":"443"},i=/^(https?:)?\/\/([^/:]+)?(:(\d+))?/,o=["file:","data:"];t.default=function(e){if(e&&o.find(function(t){return e.startsWith(t)}))return"null";var t,n,a,s=document.location,u=i.exec(e);u?(t=u[1]?u[1]:s.protocol,n=u[2],a=u[4]):(t=s.protocol,n=s.hostname,a=s.port);var c=a&&a!==r[t]?":".concat(a):"";return"".concat(t,"//").concat(n).concat(c)},e.exports=t.default},function(e,t){e.exports=function(e){if(!e.webpackPolyfill){var t=Object.create(e);t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),Object.defineProperty(t,"exports",{enumerable:!0}),t.webpackPolyfill=1}return t}},function(e,t,n){"use strict";n.d(t,"a",function(){return o});var r,i=n(81);!function(e){e.PENDING="PENDING",e.RESOLVED="RESOLVED",e.REJECTED="REJECTED"}(r||(r={}));var o=function(){function e(e){var t=this;this._state=r.PENDING,this._handlers=[],this._resolve=function(e){t._setResult(r.RESOLVED,e)},this._reject=function(e){t._setResult(r.REJECTED,e)},this._setResult=function(e,n){t._state===r.PENDING&&(Object(i.m)(n)?n.then(t._resolve,t._reject):(t._state=e,t._value=n,t._executeHandlers()))},this._attachHandler=function(e){t._handlers=t._handlers.concat(e),t._executeHandlers()},this._executeHandlers=function(){t._state!==r.PENDING&&(t._state===r.REJECTED?t._handlers.forEach(function(e){e.onrejected&&e.onrejected(t._value)}):t._handlers.forEach(function(e){e.onfulfilled&&e.onfulfilled(t._value)}),t._handlers=[])};try{e(this._resolve,this._reject)}catch(e){this._reject(e)}}return e.prototype.toString=function(){return"[object SyncPromise]"},e.resolve=function(t){return new e(function(e){e(t)})},e.reject=function(t){return new e(function(e,n){n(t)})},e.all=function(t){return new e(function(n,r){if(Array.isArray(t))if(0!==t.length){var i=t.length,o=[];t.forEach(function(t,a){e.resolve(t).then(function(e){o[a]=e,0===(i-=1)&&n(o)}).then(null,r)})}else n([]);else r(new TypeError("Promise.all requires an array as input."))})},e.prototype.then=function(t,n){var r=this;return new e(function(e,i){r._attachHandler({onfulfilled:function(n){if(t)try{return void e(t(n))}catch(e){return void i(e)}else e(n)},onrejected:function(t){if(n)try{return void e(n(t))}catch(e){return void i(e)}else i(t)}})})},e.prototype.catch=function(e){return this.then(function(e){return e},e)},e.prototype.finally=function(t){var n=this;return new e(function(e,r){var i,o;return n.then(function(e){o=!1,i=e,t&&t()},function(e){o=!0,i=e,t&&t()}).then(function(){o?r(i):e(i)})})},e}()},function(e,t,n){"use strict";n.d(t,"c",function(){return i}),n.d(t,"b",function(){return o}),n.d(t,"a",function(){return a});var r=n(81);function i(e,t){return void 0===t&&(t=0),"string"!=typeof e||0===t?e:e.length<=t?e:e.substr(0,t)+"..."}function o(e,t){if(!Array.isArray(e))return"";for(var n=[],r=0;r<e.length;r++){var i=e[r];try{n.push(String(i))}catch(e){n.push("[value cannot be serialized]")}}return n.join(t)}function a(e,t){return Object(r.j)(t)?t.test(e):"string"==typeof t&&-1!==e.indexOf(t)}},function(e,t,n){"use strict";(function(e){n.d(t,"b",function(){return s}),n.d(t,"e",function(){return u}),n.d(t,"d",function(){return f}),n.d(t,"c",function(){return p}),n.d(t,"a",function(){return v});var r=n(81),i=n(276),o=n(113),a=n(406);function s(e,t,n){if(t in e){var r=e[t],i=n(r);if("function"==typeof i)try{i.prototype=i.prototype||{},Object.defineProperties(i,{__sentry_original__:{enumerable:!1,value:r}})}catch(e){}e[t]=i}}function u(e){return Object.keys(e).map(function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])}).join("&")}function c(e){if(Object(r.d)(e)){var t=e,n={message:t.message,name:t.name,stack:t.stack};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(n[i]=t[i]);return n}if(Object(r.f)(e)){var a=e,s={};s.type=a.type;try{s.target=Object(r.c)(a.target)?Object(o.i)(a.target):Object.prototype.toString.call(a.target)}catch(e){s.target="<unknown>"}try{s.currentTarget=Object(r.c)(a.currentTarget)?Object(o.i)(a.currentTarget):Object.prototype.toString.call(a.currentTarget)}catch(e){s.currentTarget="<unknown>"}for(var i in"undefined"!=typeof CustomEvent&&Object(r.g)(e,CustomEvent)&&(s.detail=a.detail),a)Object.prototype.hasOwnProperty.call(a,i)&&(s[i]=a);return s}return e}function l(e){return function(e){return~-encodeURI(e).split(/%..|./).length}(JSON.stringify(e))}function f(e,t,n){void 0===t&&(t=3),void 0===n&&(n=102400);var r=p(e,t);return l(r)>n?f(e,t-1,n):r}function h(t,n){return"domain"===n&&t&&"object"==typeof t&&t._events?"[Domain]":"domainEmitter"===n?"[DomainEmitter]":void 0!==e&&t===e?"[Global]":"undefined"!=typeof window&&t===window?"[Window]":"undefined"!=typeof document&&t===document?"[Document]":Object(r.l)(t)?"[SyntheticEvent]":"number"==typeof t&&t!=t?"[NaN]":void 0===t?"[undefined]":"function"==typeof t?"[Function: "+Object(o.f)(t)+"]":t}function d(e,t,n,o){if(void 0===n&&(n=1/0),void 0===o&&(o=new i.a),0===n)return function(e){var t=Object.prototype.toString.call(e);if("string"==typeof e)return e;if("[object Object]"===t)return"[Object]";if("[object Array]"===t)return"[Array]";var n=h(e);return Object(r.i)(n)?n:t}(t);if(null!==t&&void 0!==t&&"function"==typeof t.toJSON)return t.toJSON();var a=h(t,e);if(Object(r.i)(a))return a;var s=c(t),u=Array.isArray(t)?[]:{};if(o.memoize(t))return"[Circular ~]";for(var l in s)Object.prototype.hasOwnProperty.call(s,l)&&(u[l]=d(l,s[l],n-1,o));return o.unmemoize(t),u}function p(e,t){try{return JSON.parse(JSON.stringify(e,function(e,n){return d(e,n,t)}))}catch(e){return"**non-serializable**"}}function v(e,t){void 0===t&&(t=40);var n=Object.keys(c(e));if(n.sort(),!n.length)return"[object has no keys]";if(n[0].length>=t)return Object(a.c)(n[0],t);for(var r=n.length;r>0;r--){var i=n.slice(0,r).join(", ");if(!(i.length>t))return r===n.length?i:Object(a.c)(i,t)}return""}}).call(this,n(42))},,,function(e,t){!function(e){"use strict";if(!e.fetch){var t={searchParams:"URLSearchParams"in e,iterable:"Symbol"in e&&"iterator"in Symbol,blob:!1,formData:"FormData"in e,arrayBuffer:"ArrayBuffer"in e};if(t.arrayBuffer)var n=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],r=function(e){return e&&DataView.prototype.isPrototypeOf(e)},i=ArrayBuffer.isView||function(e){return e&&n.indexOf(Object.prototype.toString.call(e))>-1};l.prototype.append=function(e,t){e=s(e),t=u(t);var n=this.map[e];this.map[e]=n?n+","+t:t},l.prototype.delete=function(e){delete this.map[s(e)]},l.prototype.get=function(e){return e=s(e),this.has(e)?this.map[e]:null},l.prototype.has=function(e){return this.map.hasOwnProperty(s(e))},l.prototype.set=function(e,t){this.map[s(e)]=u(t)},l.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},l.prototype.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),c(e)},l.prototype.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),c(e)},l.prototype.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),c(e)},t.iterable&&(l.prototype[Symbol.iterator]=l.prototype.entries);var o=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];m.prototype.clone=function(){return new m(this,{body:this._bodyInit})},v.call(m.prototype),v.call(g.prototype),g.prototype.clone=function(){return new g(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new l(this.headers),url:this.url})},g.error=function(){var e=new g(null,{status:0,statusText:""});return e.type="error",e};var a=[301,302,303,307,308];g.redirect=function(e,t){if(-1===a.indexOf(t))throw new RangeError("Invalid status code");return new g(null,{status:t,headers:{location:e}})},e.Headers=l,e.Request=m,e.Response=g,e.fetch=function(e,n){return new Promise(function(r,i){var o=new m(e,n),a=new XMLHttpRequest;a.onload=function(){var e,t,n={status:a.status,statusText:a.statusText,headers:(e=a.getAllResponseHeaders()||"",t=new l,e.split(/\r?\n/).forEach(function(e){var n=e.split(":"),r=n.shift().trim();if(r){var i=n.join(":").trim();t.append(r,i)}}),t)};n.url="responseURL"in a?a.responseURL:n.headers.get("X-Request-URL");var i="response"in a?a.response:a.responseText;r(new g(i,n))},a.onerror=function(){i(new TypeError("Network request failed"))},a.ontimeout=function(){i(new TypeError("Network request failed"))},a.open(o.method,o.url,!0),"include"===o.credentials&&(a.withCredentials=!0),"responseType"in a&&t.blob&&(a.responseType="blob"),o.headers.forEach(function(e,t){a.setRequestHeader(t,e)}),a.send(void 0===o._bodyInit?null:o._bodyInit)})},e.fetch.polyfill=!0}function s(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(e))throw new TypeError("Invalid character in header field name");return e.toLowerCase()}function u(e){return"string"!=typeof e&&(e=String(e)),e}function c(e){var n={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t.iterable&&(n[Symbol.iterator]=function(){return n}),n}function l(e){this.map={},e instanceof l?e.forEach(function(e,t){this.append(t,e)},this):Array.isArray(e)?e.forEach(function(e){this.append(e[0],e[1])},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}function f(e){if(e.bodyUsed)return Promise.reject(new TypeError("Already read"));e.bodyUsed=!0}function h(e){return new Promise(function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}})}function d(e){var t=new FileReader,n=h(t);return t.readAsArrayBuffer(e),n}function p(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function v(){return this.bodyUsed=!1,this._initBody=function(e){if(this._bodyInit=e,e)if("string"==typeof e)this._bodyText=e;else if(t.blob&&Blob.prototype.isPrototypeOf(e))this._bodyBlob=e;else if(t.formData&&FormData.prototype.isPrototypeOf(e))this._bodyFormData=e;else if(t.searchParams&&URLSearchParams.prototype.isPrototypeOf(e))this._bodyText=e.toString();else if(t.arrayBuffer&&t.blob&&r(e))this._bodyArrayBuffer=p(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer]);else{if(!t.arrayBuffer||!ArrayBuffer.prototype.isPrototypeOf(e)&&!i(e))throw new Error("unsupported BodyInit type");this._bodyArrayBuffer=p(e)}else this._bodyText="";this.headers.get("content-type")||("string"==typeof e?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):t.searchParams&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},t.blob&&(this.blob=function(){var e=f(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?f(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(d)}),this.text=function(){var e,t,n,r=f(this);if(r)return r;if(this._bodyBlob)return e=this._bodyBlob,t=new FileReader,n=h(t),t.readAsText(e),n;if(this._bodyArrayBuffer)return Promise.resolve(function(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},t.formData&&(this.formData=function(){return this.text().then(y)}),this.json=function(){return this.text().then(JSON.parse)},this}function m(e,t){var n,r,i=(t=t||{}).body;if(e instanceof m){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new l(e.headers)),this.method=e.method,this.mode=e.mode,i||null==e._bodyInit||(i=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||"omit",!t.headers&&this.headers||(this.headers=new l(t.headers)),this.method=(n=t.method||this.method||"GET",r=n.toUpperCase(),o.indexOf(r)>-1?r:n),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&i)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(i)}function y(e){var t=new FormData;return e.trim().split("&").forEach(function(e){if(e){var n=e.split("="),r=n.shift().replace(/\+/g," "),i=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(r),decodeURIComponent(i))}}),t}function g(e,t){t||(t={}),this.type="default",this.status="status"in t?t.status:200,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in t?t.statusText:"OK",this.headers=new l(t.headers),this.url=t.url||"",this._initBody(e)}}("undefined"!=typeof self?self:this)},function(e,t,n){var r=n(1),i=n(0),o=function(){"use strict";function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;r(this,e),this.x=t,this.y=n,this.z=i,this.w=o}return i(e,[{key:"matrixTransform",value:function(t){return(t.is2D||t instanceof SVGMatrix)&&0===this.z&&1===this.w?new e(this.x*t.a+this.y*t.c+t.e,this.x*t.b+this.y*t.d+t.f,0,1):new e(this.x*t.m11+this.y*t.m21+this.z*t.m31+this.w*t.m41,this.x*t.m12+this.y*t.m22+this.z*t.m32+this.w*t.m42,this.x*t.m13+this.y*t.m23+this.z*t.m33+this.w*t.m43,this.x*t.m14+this.y*t.m24+this.z*t.m34+this.w*t.m44)}}],[{key:"fromPoint",value:function(t){return new e(t.x,t.y,void 0!==t.z?t.z:0,void 0!==t.w?t.w:1)}}]),e}();window.DOMPoint=window.DOMPoint||o;var a=function(){"use strict";function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;r(this,e),this.x=t,this.y=n,this.width=i,this.height=o}return i(e,[{key:"top",get:function(){return this.y}},{key:"left",get:function(){return this.x}},{key:"right",get:function(){return this.x+this.width}},{key:"bottom",get:function(){return this.y+this.height}}],[{key:"fromRect",value:function(t){return new e(t.x,t.y,t.width,t.height)}}]),e}();window.DOMRect=window.DOMRect||a;var s=0,u=1,c=2,l=3,f=4,h=5,d=6,p=7,v=8,m=9,y=10,g=11,b=12,w=13,_=14,k=15,x=s,E=u,T=f,A=h,S=b,C=w,I=180/Math.PI,O=Math.PI/180,P=Symbol(),D=Symbol(),L=function(e){var t=e.split(/\(/,1)[0];if("matrix"===t)return function(e){var t=e.replace(/matrix\(/,"");if(6!==(t=t.split(/,/,7)).length)throw new Error("Failed to parse ".concat(e));return[(t=t.map(parseFloat))[0],t[1],0,0,t[2],t[3],0,0,0,0,1,0,t[4],t[5],0,1]}(e);if("matrix3d"===t)return function(e){var t=e.replace(/matrix3d\(/,"");if(16!==(t=t.split(/,/,17)).length)throw new Error("Failed to parse ".concat(e));return t.map(parseFloat)}(e);throw new Error("".concat(t," parsing not implemented"))},M=function(e,t,n){if("number"!=typeof n)throw new TypeError("Expected number");e[P][t]=n},j=function(e,t,n){if("number"!=typeof n)throw new TypeError("Expected number");t===y||t===k?1!==n&&(e[D]=!1):0!==n&&(e[D]=!1),e[P][t]=n},N=function(e){var t=Object.create(F.prototype);return t.constructor=F,t[D]=!0,t[P]=e,t},R=function(e,t){for(var n=new Float64Array(16),r=0;r<4;r++)for(var i=0;i<4;i++){for(var o=0,a=0;a<4;a++)o+=e[4*r+a]*t[4*a+i];n[4*r+i]=o}return n},F=function(){"use strict";function e(t){if(r(this,e),this[D]=!0,this[P]=new Float64Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),"string"==typeof t){if(""===t)return;var n=t.split(/\)\s+/,20).map(L);if(0===n.length)return;t=n[0];for(var i=1;i<n.length;i++)t=R(n[i],t)}var o=0;if(t&&6===t.length)M(this,x,t[o++]),M(this,E,t[o++]),M(this,T,t[o++]),M(this,A,t[o++]),M(this,S,t[o++]),M(this,C,t[o++]);else if(t&&16===t.length)M(this,s,t[o++]),M(this,u,t[o++]),j(this,c,t[o++]),j(this,l,t[o++]),M(this,f,t[o++]),M(this,h,t[o++]),j(this,d,t[o++]),j(this,p,t[o++]),j(this,v,t[o++]),j(this,m,t[o++]),j(this,y,t[o++]),j(this,g,t[o++]),M(this,b,t[o++]),M(this,w,t[o++]),j(this,_,t[o++]),j(this,k,t[o]);else if(void 0!==t)throw new TypeError("Expected string or array.")}return i(e,[{key:"m11",get:function(){return this[P][s]},set:function(e){M(this,s,e)}},{key:"m12",get:function(){return this[P][u]},set:function(e){M(this,u,e)}},{key:"m13",get:function(){return this[P][c]},set:function(e){j(this,c,e)}},{key:"m14",get:function(){return this[P][l]},set:function(e){j(this,l,e)}},{key:"m21",get:function(){return this[P][f]},set:function(e){M(this,f,e)}},{key:"m22",get:function(){return this[P][h]},set:function(e){M(this,h,e)}},{key:"m23",get:function(){return this[P][d]},set:function(e){j(this,d,e)}},{key:"m24",get:function(){return this[P][p]},set:function(e){j(this,p,e)}},{key:"m31",get:function(){return this[P][v]},set:function(e){j(this,v,e)}},{key:"m32",get:function(){return this[P][m]},set:function(e){j(this,m,e)}},{key:"m33",get:function(){return this[P][y]},set:function(e){j(this,y,e)}},{key:"m34",get:function(){return this[P][g]},set:function(e){j(this,g,e)}},{key:"m41",get:function(){return this[P][b]},set:function(e){M(this,b,e)}},{key:"m42",get:function(){return this[P][w]},set:function(e){M(this,w,e)}},{key:"m43",get:function(){return this[P][_]},set:function(e){j(this,_,e)}},{key:"m44",get:function(){return this[P][k]},set:function(e){j(this,k,e)}},{key:"a",get:function(){return this[P][x]},set:function(e){M(this,x,e)}},{key:"b",get:function(){return this[P][E]},set:function(e){M(this,E,e)}},{key:"c",get:function(){return this[P][T]},set:function(e){M(this,T,e)}},{key:"d",get:function(){return this[P][A]},set:function(e){M(this,A,e)}},{key:"e",get:function(){return this[P][S]},set:function(e){M(this,S,e)}},{key:"f",get:function(){return this[P][C]},set:function(e){M(this,C,e)}},{key:"is2D",get:function(){return this[D]}},{key:"isIdentity",get:function(){var e=this[P];return 1===e[s]&&0===e[u]&&0===e[c]&&0===e[l]&&0===e[f]&&1===e[h]&&0===e[d]&&0===e[p]&&0===e[v]&&0===e[m]&&1===e[y]&&0===e[g]&&0===e[b]&&0===e[w]&&0===e[_]&&1===e[k]}}],[{key:"fromMatrix",value:function(t){if(t instanceof e)return new e(t[P]);if(t instanceof SVGMatrix)return new e([t.a,t.b,t.c,t.d,t.e,t.f]);throw new TypeError("Expected DOMMatrix")}},{key:"fromFloat32Array",value:function(t){if(!(t instanceof Float32Array))throw new TypeError("Expected Float32Array");return new e(t)}},{key:"fromFloat64Array",value:function(t){if(!(t instanceof Float64Array))throw new TypeError("Expected Float64Array");return new e(t)}}]),i(e,[{key:"inspect",value:function(e,t){return e<0?"[DOMMatrix]":"DOMMatrix [\n        a: ".concat(this.a,"\n        b: ").concat(this.b,"\n        c: ").concat(this.c,"\n        d: ").concat(this.d,"\n        e: ").concat(this.e,"\n        f: ").concat(this.f,"\n        m11: ").concat(this.m11,"\n        m12: ").concat(this.m12,"\n        m13: ").concat(this.m13,"\n        m14: ").concat(this.m14,"\n        m21: ").concat(this.m21,"\n        m22: ").concat(this.m22,"\n        m23: ").concat(this.m23,"\n        m23: ").concat(this.m23,"\n        m31: ").concat(this.m31,"\n        m32: ").concat(this.m32,"\n        m33: ").concat(this.m33,"\n        m34: ").concat(this.m34,"\n        m41: ").concat(this.m41,"\n        m42: ").concat(this.m42,"\n        m43: ").concat(this.m43,"\n        m44: ").concat(this.m44,"\n        is2D: ").concat(this.is2D,"\n        isIdentity: ").concat(this.isIdentity," ]")}},{key:"multiply",value:function(e){return N(this[P]).multiplySelf(e)}},{key:"multiplySelf",value:function(e){return this[P]=R(e[P],this[P]),e.is2D||(this[D]=!1),this}},{key:"preMultiplySelf",value:function(e){return this[P]=R(this[P],e[P]),e.is2D||(this[D]=!1),this}},{key:"translate",value:function(e,t,n){return N(this[P]).translateSelf(e,t,n)}},{key:"translateSelf",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return this[P]=R([1,0,0,0,0,1,0,0,0,0,1,0,e,t,n,1],this[P]),0!==n&&(this[D]=!1),this}},{key:"scale",value:function(e,t,n,r,i,o){return N(this[P]).scaleSelf(e,t,n,r,i,o)}},{key:"scale3d",value:function(e,t,n,r){return N(this[P]).scale3dSelf(e,t,n,r)}},{key:"scale3dSelf",value:function(e,t,n,r){return this.scaleSelf(e,e,e,t,n,r)}},{key:"scaleSelf",value:function(e,t,n,r,i,o){return"number"!=typeof r&&(r=0),"number"!=typeof i&&(i=0),"number"!=typeof o&&(o=0),this.translateSelf(r,i,o),"number"!=typeof e&&(e=1),"number"!=typeof t&&(t=e),"number"!=typeof n&&(n=1),this[P]=R([e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1],this[P]),this.translateSelf(-r,-i,-o),1===n&&0===o||(this[D]=!1),this}},{key:"rotateFromVector",value:function(e,t){return N(this[P]).rotateFromVectorSelf(e,t)}},{key:"rotateFromVectorSelf",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=0===e&&0===t?0:Math.atan2(t,e)*I;return this.rotateSelf(n)}},{key:"rotate",value:function(e,t,n){return N(this[P]).rotateSelf(e,t,n)}},{key:"rotateSelf",value:function(e,t,n){void 0===t&&void 0===n&&(n=e,e=t=0),"number"!=typeof t&&(t=0),"number"!=typeof n&&(n=0),0===e&&0===t||(this[D]=!1),e*=O,t*=O,n*=O;var r=Math.cos(n),i=Math.sin(n);return this[P]=R([r,i,0,0,-i,r,0,0,0,0,1,0,0,0,0,1],this[P]),r=Math.cos(t),i=Math.sin(t),this[P]=R([r,0,-i,0,0,1,0,0,i,0,r,0,0,0,0,1],this[P]),r=Math.cos(e),i=Math.sin(e),this[P]=R([1,0,0,0,0,r,i,0,0,-i,r,0,0,0,0,1],this[P]),this}},{key:"rotateAxisAngle",value:function(e,t,n,r){return N(this[P]).rotateAxisAngleSelf(e,t,n,r)}},{key:"rotateAxisAngleSelf",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=Math.sqrt(e*e+t*t+n*n);if(0===i)return this;1!==i&&(e/=i,t/=i,n/=i),r*=O;var o=Math.cos(r),a=Math.sin(r),s=1-o,u=s*e,c=s*t;return this[P]=R([u*e+o,u*t+a*n,u*n-a*t,0,u*t-a*n,c*t+o,c*n+a*e,0,u*n+a*t,c*n-a*e,s*n*n+o,0,0,0,0,1],this[P]),0===e&&0===t||(this[D]=!1),this}},{key:"skewX",value:function(e){return N(this[P]).skewXSelf(e)}},{key:"skewXSelf",value:function(e){if("number"!=typeof e)return this;var t=Math.tan(e*O);return this[P]=R([1,0,0,0,t,1,0,0,0,0,1,0,0,0,0,1],this[P]),this}},{key:"skewY",value:function(e){return N(this[P]).skewYSelf(e)}},{key:"skewYSelf",value:function(e){if("number"!=typeof e)return this;var t=Math.tan(e*O);return this[P]=R([1,t,0,0,0,1,0,0,0,0,1,0,0,0,0,1],this[P]),this}},{key:"flipX",value:function(){return N(R([-1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],this[P]))}},{key:"flipY",value:function(){return N(R([1,0,0,0,0,-1,0,0,0,0,1,0,0,0,0,1],this[P]))}},{key:"inverse",value:function(){return N(this[P]).invertSelf()}},{key:"invertSelf",value:function(){if(!this[D])throw new Error("3D matrix inversion is not implemented.");var t=this[P][x]*this[P][A]-this[P][E]*this[P][T];if(0!==t){var n=new e;return n.a=this[P][A]/t,n.b=-this[P][E]/t,n.c=-this[P][T]/t,n.d=this[P][x]/t,n.e=(this[P][T]*this[P][C]-this[P][A]*this[P][S])/t,n.f=(this[P][E]*this[P][S]-this[P][x]*this[P][C])/t,n}this[D]=!1,this[P]=[NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]}},{key:"setMatrixValue",value:function(t){var n=new e(t);return this[P]=n[P],this[D]=n[D],this}},{key:"transformPoint",value:function(e){var t=e.x,n=e.y,r=e.z,i=e.w,o=this[P],a=o[s]*t+o[f]*n+o[v]*r+o[b]*i,x=o[u]*t+o[h]*n+o[m]*r+o[w]*i,E=o[c]*t+o[d]*n+o[y]*r+o[_]*i,T=o[l]*t+o[p]*n+o[g]*r+o[k]*i;return new DOMPoint(a,x,E,T)}},{key:"toFloat32Array",value:function(){return Float32Array.from(this[P])}},{key:"toFloat64Array",value:function(){return this[P].slice(0)}},{key:"toString",value:function(){return this.is2D?"matrix(".concat(this.a,", ").concat(this.b,", ").concat(this.c,", ").concat(this.d,", ").concat(this.e,", ").concat(this.f,")"):"matrix3d(".concat(this[P].join(", "),")")}}]),e}();window.DOMMatrix=window.DOMMatrix||F},function(e,t,n){"use strict";var r=n(31),i=n(150),o=n(147),a=n(37);n(3)({target:"String",proto:!0},{replaceAll:function(e,t){var n,s,u=r(this);return i(e)?(n=~(s=o.call(e)).indexOf("g")?e:new(a(e,RegExp))(e.source,s+"g"),String(u).replace(n,t)):String(u).split(e).join(t)}})},function(e,t,n){"use strict";var r=n(235),i=n(31),o=n(18),a=n(15),s=n(9),u=n(155),c=n(147),l=n(41),f=n(37),h=n(117),d=n(20)("matchAll"),p=n(10),v=n(76),m=v.set,y=v.getterFor("RegExp String Iterator"),g=RegExp.prototype,b=g.exec,w=r(function(e,t,n,r){m(this,{type:"RegExp String Iterator",regexp:e,string:t,global:n,unicode:r,done:!1})},"RegExp String",function(){var e=y(this);if(e.done)return{value:void 0,done:!0};var t=e.regexp,n=e.string,r=function(e,t){var n,r=e.exec;if("function"==typeof r){if("object"!=typeof(n=r.call(e,t)))throw TypeError("Incorrect exec result");return n}return b.call(e,t)}(t,n);return null===r?{value:void 0,done:e.done=!0}:e.global?(""==String(r[0])&&(t.lastIndex=h(n,o(t.lastIndex),e.unicode)),{value:r,done:!1}):(e.done=!0,{value:r,done:!1})}),_=function(e){var t,n,r,i,a,u=s(this),l=String(e);return t=f(u,RegExp),n="flags"in g?String(u.flags):c.call(u),r=new t(t===RegExp?u.source:u,n),i=!!~n.indexOf("g"),a=!!~n.indexOf("u"),r.lastIndex=o(u.lastIndex),new w(r,l,i,a)};n(3)({target:"String",proto:!0},{matchAll:function(e){var t,n,r,o=i(this);return null!=e&&(void 0===(n=e[d])&&p&&"RegExp"==u(e)&&(n=_),null!=n)?a(n).call(e,o):(t=String(o),r=new RegExp(e,"g"),p?_.call(r,t):r[d](t))}}),p||d in g||l(g,d,_)},function(e,t,n){"use strict";var r=n(125);n(3)({target:"String",proto:!0},{at:function(e){return r(this,e,!0)}})},function(e,t,n){"use strict";var r=n(34),i=n(33)("sup");n(3)({target:"String",proto:!0,forced:i},{sup:function(){return r(this,"sup","","")}})},function(e,t,n){"use strict";var r=n(34),i=n(33)("sub");n(3)({target:"String",proto:!0,forced:i},{sub:function(){return r(this,"sub","","")}})},function(e,t,n){"use strict";var r=n(34),i=n(33)("strike");n(3)({target:"String",proto:!0,forced:i},{strike:function(){return r(this,"strike","","")}})},function(e,t,n){"use strict";var r=n(34),i=n(33)("small");n(3)({target:"String",proto:!0,forced:i},{small:function(){return r(this,"small","","")}})},function(e,t,n){"use strict";var r=n(34),i=n(33)("link");n(3)({target:"String",proto:!0,forced:i},{link:function(e){return r(this,"a","href",e)}})},function(e,t,n){"use strict";var r=n(34),i=n(33)("italics");n(3)({target:"String",proto:!0,forced:i},{italics:function(){return r(this,"i","","")}})},function(e,t,n){"use strict";var r=n(34),i=n(33)("fontsize");n(3)({target:"String",proto:!0,forced:i},{fontsize:function(e){return r(this,"font","size",e)}})},function(e,t,n){"use strict";var r=n(34),i=n(33)("fontcolor");n(3)({target:"String",proto:!0,forced:i},{fontcolor:function(e){return r(this,"font","color",e)}})},function(e,t,n){"use strict";var r=n(34),i=n(33)("fixed");n(3)({target:"String",proto:!0,forced:i},{fixed:function(){return r(this,"tt","","")}})},function(e,t,n){"use strict";var r=n(34),i=n(33)("bold");n(3)({target:"String",proto:!0,forced:i},{bold:function(){return r(this,"b","","")}})},function(e,t,n){"use strict";var r=n(34),i=n(33)("blink");n(3)({target:"String",proto:!0,forced:i},{blink:function(){return r(this,"blink","","")}})},function(e,t,n){"use strict";var r=n(34),i=n(33)("big");n(3)({target:"String",proto:!0,forced:i},{big:function(){return r(this,"big","","")}})},function(e,t,n){"use strict";var r=n(34),i=n(33)("anchor");n(3)({target:"String",proto:!0,forced:i},{anchor:function(e){return r(this,"a","name",e)}})},function(e,t,n){"use strict";var r=n(71),i=n(146)("trimEnd"),o=i?function(){return r(this,2)}:"".trimEnd;n(3)({target:"String",proto:!0,forced:i},{trimEnd:o,trimRight:o})},function(e,t,n){"use strict";var r=n(71),i=n(146)("trimStart"),o=i?function(){return r(this,1)}:"".trimStart;n(3)({target:"String",proto:!0,forced:i},{trimStart:o,trimLeft:o})},function(e,t,n){"use strict";var r=n(71),i=n(146)("trim");n(3)({target:"String",proto:!0,forced:i},{trim:function(){return r(this,3)}})},function(e,t,n){"use strict";var r=n(18),i=n(151),o=n(149)("startsWith"),a="".startsWith;n(3)({target:"String",proto:!0,forced:!o},{startsWith:function(e){var t=i(this,e,"startsWith"),n=r(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),o=String(e);return a?a.call(t,o,n):t.slice(n,n+o.length)===o}})},function(e,t,n){"use strict";var r=n(150),i=n(9),o=n(31),a=n(37),s=n(117),u=n(18),c=n(116),l=n(148),f=n(14),h=[].push,d=Math.min,p=!f(function(){return!RegExp(4294967295,"y")});n(115)("split",2,function(e,t,n){var f;return f="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var i=String(o(this)),a=void 0===n?4294967295:n>>>0;if(0===a)return[];if(void 0===e)return[i];if(!r(e))return t.call(i,e,a);for(var s,u,c,f=[],d=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),p=0,v=new RegExp(e.source,d+"g");(s=l.call(v,i))&&!((u=v.lastIndex)>p&&(f.push(i.slice(p,s.index)),s.length>1&&s.index<i.length&&h.apply(f,s.slice(1)),c=s[0].length,p=u,f.length>=a));)v.lastIndex===s.index&&v.lastIndex++;return p===i.length?!c&&v.test("")||f.push(""):f.push(i.slice(p)),f.length>a?f.slice(0,a):f}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var r=o(this),i=void 0==t?void 0:t[e];return void 0!==i?i.call(t,r,n):f.call(String(r),t,n)},function(e,r){var o=n(f,e,this,r,f!==t);if(o.done)return o.value;var l=i(e),h=String(this),v=a(l,RegExp),m=l.unicode,y=(l.ignoreCase?"i":"")+(l.multiline?"m":"")+(l.unicode?"u":"")+(p?"y":"g"),g=new v(p?l:"^(?:"+l.source+")",y),b=void 0===r?4294967295:r>>>0;if(0===b)return[];if(0===h.length)return null===c(g,h)?[h]:[];for(var w=0,_=0,k=[];_<h.length;){g.lastIndex=p?_:0;var x,E=c(g,p?h:h.slice(_));if(null===E||(x=d(u(g.lastIndex+(p?0:_)),h.length))===w)_=s(h,_,m);else{if(k.push(h.slice(w,_)),k.length===b)return k;for(var T=1;T<=E.length-1;T++)if(k.push(E[T]),k.length===b)return k;_=w=x}}return k.push(h.slice(w)),k}]},!p)},function(e,t,n){"use strict";var r=n(9),i=n(31),o=n(209),a=n(116);n(115)("search",1,function(e,t,n){return[function(t){var n=i(this),r=void 0==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var s=r(e),u=String(this),c=s.lastIndex;o(c,0)||(s.lastIndex=0);var l=a(s,u);return o(s.lastIndex,c)||(s.lastIndex=c),null===l?-1:l.index}]})},function(e,t,n){"use strict";var r=n(9),i=n(22),o=n(18),a=n(47),s=n(31),u=n(117),c=n(116),l=Math.max,f=Math.min,h=Math.floor,d=/\$([$&`']|\d\d?|<[^>]*>)/g,p=/\$([$&`']|\d\d?)/g;n(115)("replace",2,function(e,t,n){return[function(n,r){var i=s(this),o=void 0==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,i){var s=n(t,e,this,i);if(s.done)return s.value;var h=r(e),d=String(this),p="function"==typeof i;p||(i=String(i));var m=h.global;if(m){var y=h.unicode;h.lastIndex=0}for(var g=[];;){var b=c(h,d);if(null===b)break;if(g.push(b),!m)break;""===String(b[0])&&(h.lastIndex=u(d,o(h.lastIndex),y))}for(var w,_="",k=0,x=0;x<g.length;x++){b=g[x];for(var E=String(b[0]),T=l(f(a(b.index),d.length),0),A=[],S=1;S<b.length;S++)A.push(void 0===(w=b[S])?w:String(w));var C=b.groups;if(p){var I=[E].concat(A,T,d);void 0!==C&&I.push(C);var O=String(i.apply(void 0,I))}else O=v(E,d,T,A,C,i);T>=k&&(_+=d.slice(k,T)+O,k=T+E.length)}return _+d.slice(k)}];function v(e,n,r,o,a,s){var u=r+e.length,c=o.length,l=p;return void 0!==a&&(a=i(a),l=d),t.call(s,l,function(t,i){var s;switch(i.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,r);case"'":return n.slice(u);case"<":s=a[i.slice(1,-1)];break;default:var l=+i;if(0===l)return t;if(l>c){var f=h(l/10);return 0===f?t:f<=c?void 0===o[f-1]?i.charAt(1):o[f-1]+i.charAt(1):t}s=o[l-1]}return void 0===s?"":s})}})},function(e,t,n){n(3)({target:"String",proto:!0},{repeat:n(152)})},function(e,t,n){"use strict";var r=n(208),i=n(207);n(3)({target:"String",proto:!0,forced:i},{padStart:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0,!0)}})},function(e,t,n){var r=n(21).navigator;e.exports=r&&r.userAgent||""},function(e,t,n){"use strict";var r=n(208),i=n(207);n(3)({target:"String",proto:!0,forced:i},{padEnd:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0,!1)}})},function(e,t,n){"use strict";var r=n(9),i=n(18),o=n(31),a=n(117),s=n(116);n(115)("match",1,function(e,t,n){return[function(t){var n=o(this),r=void 0==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var o=n(t,e,this);if(o.done)return o.value;var u=r(e),c=String(this);if(!u.global)return s(u,c);var l=u.unicode;u.lastIndex=0;for(var f,h=[],d=0;null!==(f=s(u,c));){var p=String(f[0]);h[d]=p,""===p&&(u.lastIndex=a(c,i(u.lastIndex),l)),d++}return 0===d?null:h}]})},function(e,t,n){"use strict";var r=n(151),i=n(149)("includes");n(3)({target:"String",proto:!0,forced:!i},{includes:function(e){return!!~r(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){"use strict";var r=n(18),i=n(151),o="".endsWith,a=Math.min,s=n(149)("endsWith");n(3)({target:"String",proto:!0,forced:!s},{endsWith:function(e){var t=i(this,e,"endsWith"),n=arguments.length>1?arguments[1]:void 0,s=r(t.length),u=void 0===n?s:a(r(n),s),c=String(e);return o?o.call(t,c,u):t.slice(u-c.length,u)===c}})},function(e,t,n){"use strict";var r=n(125);n(3)({target:"String",proto:!0},{codePointAt:function(e){return r(this,e)}})},function(e,t,n){var r=n(35),i=n(18);n(3)({target:"String",stat:!0},{raw:function(e){for(var t=r(e.raw),n=i(t.length),o=arguments.length,a=[],s=0;n>s;)a.push(String(t[s++])),s<o&&a.push(String(arguments[s]));return a.join("")}})},function(e,t,n){var r=n(75),i=String.fromCharCode,o=String.fromCodePoint,a=!!o&&1!=o.length;n(3)({target:"String",stat:!0,forced:a},{fromCodePoint:function(e){for(var t,n=[],o=arguments.length,a=0;o>a;){if(t=+arguments[a++],r(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?i(t):i(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}})},function(e,t,n){n(444),n(443),n(442),n(441),n(440),n(439),n(438),n(436),n(435),n(434),n(433),n(432),n(431),n(430),n(429),n(428),n(126),n(427),n(426),n(425),n(424),n(423),n(422),n(421),n(420),n(419),n(418),n(417),n(416),n(415),e.exports=n(53).String},function(e,t,n){e.exports=n(445),n(414),n(413),n(412)},function(e,t,n){"use strict";var r=n(40),i=n(9),o=n(15),a=n(37),s=n(30);n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{union:function(e){var t=i(this),n=new(a(t,r("Set")))(t);return s(e,o(n.add),n),n}})},function(e,t,n){"use strict";var r=n(40),i=n(9),o=n(15),a=n(37),s=n(30);n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{symmetricDifference:function(e){var t=i(this),n=new(a(t,r("Set")))(t),u=o(n.delete),c=o(n.add);return s(e,function(e){u.call(n,e)||c.call(n,e)}),n}})},function(e,t,n){"use strict";var r=n(9),i=n(27),o=n(61);n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{some:function(e){for(var t,n,a=r(this),s=o(a),u=i(e,arguments.length>1?arguments[1]:void 0,3);!(t=s.next()).done;)if(u(n=t.value,n,a))return!0;return!1}})},function(e,t,n){"use strict";var r=n(9),i=n(15),o=n(61);n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{reduce:function(e){var t,n,a,s=r(this),u=o(s);if(i(e),arguments.length>1)t=arguments[1];else{if((n=u.next()).done)throw TypeError("Reduce of empty set with no initial value");t=n.value}for(;!(n=u.next()).done;)t=e(t,a=n.value,a,s);return t}})},function(e,t,n){"use strict";var r=n(40),i=n(9),o=n(15),a=n(27),s=n(37),u=n(61);n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{map:function(e){for(var t,n,c=i(this),l=u(c),f=a(e,arguments.length>1?arguments[1]:void 0,3),h=new(s(c,r("Set"))),d=o(h.add);!(t=l.next()).done;)d.call(h,f(n=t.value,n,c));return h}})},function(e,t,n){"use strict";var r=n(9),i=n(61);n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{join:function(e){for(var t,n=r(this),o=i(n),a=void 0===e?",":String(e),s=[];!(t=o.next()).done;)s.push(t.value);return s.join(a)}})},function(e,t,n){"use strict";var r=n(9),i=n(15),o=n(30),a=o.BREAK;n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{isSupersetOf:function(e){var t=r(this),n=i(t.has);return o(e,function(e){if(!1===n.call(t,e))return a})!==a}})},function(e,t,n){"use strict";var r=n(40),i=n(9),o=n(15),a=n(153),s=n(30),u=s.BREAK;n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{isSubsetOf:function(e){var t=a(this),n=i(e),c=n.has;return"function"!=typeof c&&(n=new(r("Set"))(e),c=o(n.has)),s(t,function(e){if(!1===c.call(n,e))return u},void 0,!1,!0)!==u}})},function(e,t,n){"use strict";var r=n(9),i=n(15),o=n(30),a=o.BREAK;n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{isDisjointFrom:function(e){var t=r(this),n=i(t.has);return o(e,function(e){if(!0===n.call(t,e))return a})!==a}})},function(e,t,n){"use strict";var r=n(40),i=n(9),o=n(15),a=n(37),s=n(30);n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{intersection:function(e){var t=i(this),n=new(a(t,r("Set"))),u=o(t.has),c=o(n.add);return s(e,function(e){u.call(t,e)&&c.call(n,e)}),n}})},function(e,t,n){"use strict";var r=n(9),i=n(27),o=n(61);n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{find:function(e){for(var t,n,a=r(this),s=o(a),u=i(e,arguments.length>1?arguments[1]:void 0,3);!(t=s.next()).done;)if(u(n=t.value,n,a))return n}})},function(e,t,n){"use strict";var r=n(40),i=n(9),o=n(15),a=n(27),s=n(37),u=n(61);n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{filter:function(e){for(var t,n,c=i(this),l=u(c),f=a(e,arguments.length>1?arguments[1]:void 0,3),h=new(s(c,r("Set"))),d=o(h.add);!(t=l.next()).done;)f(n=t.value,n,c)&&d.call(h,n);return h}})},function(e,t,n){"use strict";var r=n(40),i=n(9),o=n(15),a=n(37),s=n(30);n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{difference:function(e){var t=i(this),n=new(a(t,r("Set")))(t),u=o(n.delete);return s(e,function(e){u.call(n,e)}),n}})},function(e,t,n){"use strict";var r=n(9),i=n(27),o=n(61);n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{every:function(e){for(var t,n,a=r(this),s=o(a),u=i(e,arguments.length>1?arguments[1]:void 0,3);!(t=s.next()).done;)if(!u(n=t.value,n,a))return!1;return!0}})},function(e,t,n){"use strict";var r=n(216);n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{deleteAll:function(){return r.apply(this,arguments)}})},function(e,t,n){"use strict";var r=n(9),i=n(15);e.exports=function(){for(var e=r(this),t=i(e.add),n=0,o=arguments.length;n<o;n++)t.call(e,arguments[n]);return e}},function(e,t,n){"use strict";var r=n(462);n(3)({target:"Set",proto:!0,real:!0,forced:n(10)},{addAll:function(){return r.apply(this,arguments)}})},function(e,t,n){n(3)({target:"Set",stat:!0},{of:n(217)})},function(e,t,n){n(3)({target:"Set",stat:!0},{from:n(218)})},function(e,t,n){"use strict";e.exports=n(223)("Set",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},n(220))},function(e,t,n){n(466),n(154),n(126),n(219),e.exports=n(53).Set},function(e,t,n){e.exports=n(467),n(465),n(464),n(463),n(461),n(460),n(459),n(458),n(457),n(456),n(455),n(454),n(453),n(452),n(451),n(450),n(449),n(448),n(447)},function(e,t,n){n(72)(n(21).JSON,"JSON",!0)},function(e,t,n){n(72)(Math,"Math",!0)},function(e,t,n){"use strict";var r=n(22),i=n(66),o=n(90),a=n(55).f,s=n(118);n(24)&&n(3)({target:"Object",proto:!0,forced:s},{__lookupSetter__:function(e){var t,n=r(this),s=i(e,!0);do{if(t=a(n,s))return t.set}while(n=o(n))}})},function(e,t,n){"use strict";var r=n(22),i=n(66),o=n(90),a=n(55).f,s=n(118);n(24)&&n(3)({target:"Object",proto:!0,forced:s},{__lookupGetter__:function(e){var t,n=r(this),s=i(e,!0);do{if(t=a(n,s))return t.get}while(n=o(n))}})},function(e,t,n){"use strict";var r=n(22),i=n(15),o=n(29),a=n(118);n(24)&&n(3)({target:"Object",proto:!0,forced:a},{__defineSetter__:function(e,t){o.f(r(this),e,{set:i(t),enumerable:!0,configurable:!0})}})},function(e,t,n){"use strict";var r=n(22),i=n(15),o=n(29),a=n(118);n(24)&&n(3)({target:"Object",proto:!0,forced:a},{__defineGetter__:function(e,t){o.f(r(this),e,{get:i(t),enumerable:!0,configurable:!0})}})},function(e,t,n){var r=n(210);n(3)({target:"Object",stat:!0},{values:function(e){return r(e)}})},function(e,t,n){n(3)({target:"Object",stat:!0},{setPrototypeOf:n(157)})},function(e,t,n){var r=n(23),i=n(86).onFreeze,o=Object.seal,a=n(120),s=n(14)(function(){o(1)});n(3)({target:"Object",stat:!0,forced:s,sham:!a},{seal:function(e){return o&&r(e)?o(i(e)):e}})},function(e,t,n){var r=n(23),i=n(86).onFreeze,o=Object.preventExtensions,a=n(120),s=n(14)(function(){o(1)});n(3)({target:"Object",stat:!0,forced:s,sham:!a},{preventExtensions:function(e){return o&&r(e)?o(i(e)):e}})},function(e,t,n){var r=n(22),i=n(73),o=n(14)(function(){i(1)});n(3)({target:"Object",stat:!0,forced:o},{keys:function(e){return i(r(e))}})},function(e,t,n){var r=n(23),i=Object.isSealed,o=n(14)(function(){i(1)});n(3)({target:"Object",stat:!0,forced:o},{isSealed:function(e){return!r(e)||!!i&&i(e)}})},function(e,t,n){var r=n(23),i=Object.isFrozen,o=n(14)(function(){i(1)});n(3)({target:"Object",stat:!0,forced:o},{isFrozen:function(e){return!r(e)||!!i&&i(e)}})},function(e,t,n){var r=n(23),i=Object.isExtensible,o=n(14)(function(){i(1)});n(3)({target:"Object",stat:!0,forced:o},{isExtensible:function(e){return!!r(e)&&(!i||i(e))}})},function(e,t,n){n(3)({target:"Object",stat:!0},{is:n(209)})},function(e,t,n){var r=n(22),i=n(90),o=n(233),a=n(14)(function(){i(1)});n(3)({target:"Object",stat:!0,forced:a,sham:!o},{getPrototypeOf:function(e){return i(r(e))}})},function(e,t,n){var r=n(211).f,i=n(14)(function(){Object.getOwnPropertyNames(1)});n(3)({target:"Object",stat:!0,forced:i},{getOwnPropertyNames:r})},function(e,t,n){var r=n(24),i=n(237),o=n(35),a=n(55),s=n(64);n(3)({target:"Object",stat:!0,sham:!r},{getOwnPropertyDescriptors:function(e){for(var t,n,r=o(e),u=a.f,c=i(r),l={},f=0;c.length>f;)void 0!==(n=u(r,t=c[f++]))&&s(l,t,n);return l}})},function(e,t,n){var r=n(35),i=n(55).f,o=n(24),a=n(14)(function(){i(1)}),s=!o||a;n(3)({target:"Object",stat:!0,forced:s,sham:!o},{getOwnPropertyDescriptor:function(e,t){return i(r(e),t)}})},function(e,t,n){var r=n(30),i=n(64);n(3)({target:"Object",stat:!0},{fromEntries:function(e){var t={};return r(e,function(e,n){i(t,e,n)},void 0,!0),t}})},function(e,t,n){var r=n(23),i=n(86).onFreeze,o=Object.freeze,a=n(120),s=n(14)(function(){o(1)});n(3)({target:"Object",stat:!0,forced:s,sham:!a},{freeze:function(e){return o&&r(e)?o(i(e)):e}})},function(e,t,n){var r=n(210);n(3)({target:"Object",stat:!0},{entries:function(e){return r(e,!0)}})},function(e,t,n){var r=n(24);n(3)({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperties:n(231)})},function(e,t,n){var r=n(24);n(3)({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperty:n(29).f})},function(e,t,n){n(3)({target:"Object",stat:!0,sham:!n(24)},{create:n(74)})},function(e,t,n){"use strict";var r=n(73),i=n(121),o=n(92),a=n(22),s=n(91),u=Object.assign;e.exports=!u||n(14)(function(){var e={},t={},n=Symbol();return e[n]=7,"abcdefghijklmnopqrst".split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||"abcdefghijklmnopqrst"!=r(u({},t)).join("")})?function(e,t){for(var n=a(e),u=arguments.length,c=1,l=i.f,f=o.f;u>c;)for(var h,d=s(arguments[c++]),p=l?r(d).concat(l(d)):r(d),v=p.length,m=0;v>m;)f.call(d,h=p[m++])&&(n[h]=d[h]);return n}:u},function(e,t,n){var r=n(494);n(3)({target:"Object",stat:!0,forced:Object.assign!==r},{assign:r})},function(e,t,n){var r=n(73),i=n(121),o=n(92);e.exports=function(e){var t=r(e),n=i.f;if(n)for(var a,s=n(e),u=o.f,c=0;s.length>c;)u.call(e,a=s[c++])&&t.push(a);return t}},function(e,t,n){var r=n(53),i=n(38),o=n(212),a=n(29).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});i(t,e)||a(t,e,{value:o.f(e)})}},function(e,t,n){"use strict";var r=n(21),i=n(38),o=n(24),a=n(10),s=n(3),u=n(54),c=n(93),l=n(14),f=n(95),h=n(72),d=n(123),p=n(20),v=n(212),m=n(497),y=n(496),g=n(63),b=n(9),w=n(23),_=n(35),k=n(66),x=n(94),E=n(74),T=n(211),A=n(55),S=n(29),C=n(92),I=n(41),O=n(73),P=n(124)("hidden"),D=n(76),L=D.set,M=D.getterFor("Symbol"),j=A.f,N=S.f,R=T.f,F=r.Symbol,B=r.JSON,U=B&&B.stringify,z=p("toPrimitive"),$=C.f,V=f("symbol-registry"),Y=f("symbols"),H=f("op-symbols"),q=f("wks"),W=Object.prototype,G=r.QObject,K=n(232),Q=!G||!G.prototype||!G.prototype.findChild,Z=o&&l(function(){return 7!=E(N({},"a",{get:function(){return N(this,"a",{value:7}).a}})).a})?function(e,t,n){var r=j(W,t);r&&delete W[t],N(e,t,n),r&&e!==W&&N(W,t,r)}:N,J=function(e,t){var n=Y[e]=E(F.prototype);return L(n,{type:"Symbol",tag:e,description:t}),o||(n.description=t),n},X=K&&"symbol"==typeof F.iterator?function(e){return"symbol"==typeof e}:function(e){return Object(e)instanceof F},ee=function(e,t,n){return e===W&&ee(H,t,n),b(e),t=k(t,!0),b(n),i(Y,t)?(n.enumerable?(i(e,P)&&e[P][t]&&(e[P][t]=!1),n=E(n,{enumerable:x(0,!1)})):(i(e,P)||N(e,P,x(1,{})),e[P][t]=!0),Z(e,t,n)):N(e,t,n)},te=function(e,t){b(e);for(var n,r=y(t=_(t)),i=0,o=r.length;o>i;)ee(e,n=r[i++],t[n]);return e},ne=function(e){var t=$.call(this,e=k(e,!0));return!(this===W&&i(Y,e)&&!i(H,e))&&(!(t||!i(this,e)||!i(Y,e)||i(this,P)&&this[P][e])||t)},re=function(e,t){if(e=_(e),t=k(t,!0),e!==W||!i(Y,t)||i(H,t)){var n=j(e,t);return!n||!i(Y,t)||i(e,P)&&e[P][t]||(n.enumerable=!0),n}},ie=function(e){for(var t,n=R(_(e)),r=[],o=0;n.length>o;)i(Y,t=n[o++])||i(c,t)||r.push(t);return r},oe=function(e){for(var t,n=e===W,r=R(n?H:_(e)),o=[],a=0;r.length>a;)!i(Y,t=r[a++])||n&&!i(W,t)||o.push(Y[t]);return o};K||(u((F=function(){if(this instanceof F)throw TypeError("Symbol is not a constructor");var e=void 0===arguments[0]?void 0:String(arguments[0]),t=d(e),n=function(e){this===W&&n.call(H,e),i(this,P)&&i(this[P],t)&&(this[P][t]=!1),Z(this,t,x(1,e))};return o&&Q&&Z(W,t,{configurable:!0,set:n}),J(t,e)}).prototype,"toString",function(){return M(this).tag}),C.f=ne,S.f=ee,A.f=re,n(122).f=T.f=ie,n(121).f=oe,o&&(N(F.prototype,"description",{configurable:!0,get:function(){return M(this).description}}),a||u(W,"propertyIsEnumerable",ne,{unsafe:!0})),v.f=function(e){return J(p(e),e)}),s({global:!0,wrap:!0,forced:!K,sham:!K},{Symbol:F});for(var ae=O(q),se=0;ae.length>se;)m(ae[se++]);s({target:"Symbol",stat:!0,forced:!K},{for:function(e){return i(V,e+="")?V[e]:V[e]=F(e)},keyFor:function(e){if(!X(e))throw TypeError(e+" is not a symbol");for(var t in V)if(V[t]===e)return t},useSetter:function(){Q=!0},useSimple:function(){Q=!1}}),s({target:"Object",stat:!0,forced:!K,sham:!o},{create:function(e,t){return void 0===t?E(e):te(E(e),t)},defineProperty:ee,defineProperties:te,getOwnPropertyDescriptor:re}),s({target:"Object",stat:!0,forced:!K},{getOwnPropertyNames:ie,getOwnPropertySymbols:oe}),B&&s({target:"JSON",stat:!0,forced:!K||l(function(){var e=F();return"[null]"!=U([e])||"{}"!=U({a:e})||"{}"!=U(Object(e))})},{stringify:function(e){for(var t,n,r=[e],i=1;arguments.length>i;)r.push(arguments[i++]);if(n=t=r[1],(w(t)||void 0!==e)&&!X(e))return g(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!X(t))return t}),r[1]=t,U.apply(B,r)}}),F.prototype[z]||I(F.prototype,z,F.prototype.valueOf),h(F,"Symbol"),c[P]=!0},function(e,t,n){n(498),n(495),n(493),n(492),n(491),n(490),n(489),n(488),n(487),n(486),n(485),n(484),n(483),n(482),n(481),n(480),n(479),n(478),n(477),n(476),n(475),n(154),n(474),n(473),n(472),n(471),n(470),n(469),e.exports=n(53).Object},function(e,t,n){e.exports=n(499)},function(e,t,n){"use strict";var r=n(47),i=n(214),o=/^[0-9a-z]+$/;n(3)({target:"Number",stat:!0},{fromString:function(e,t){var n,a,s=1;if("string"!=typeof e)throw TypeError("Invalid number representation");if(!e.length)throw SyntaxError("Invalid number representation");if("-"==e.charAt(0)&&(s=-1,!(e=e.slice(1)).length))throw SyntaxError("Invalid number representation");if((n=void 0===t?10:r(t))<2||n>36)throw RangeError("Invalid radix");if(!o.test(e)||(a=i(e,n)).toString(n)!==e)throw SyntaxError("Invalid number representation");return s*a}})},function(e,t,n){"use strict";var r=n(14),i=n(213),o=1..toPrecision;n(3)({target:"Number",proto:!0,forced:r(function(){return"1"!==o.call(1,void 0)})||!r(function(){o.call({})})},{toPrecision:function(e){return void 0===e?o.call(i(this)):o.call(i(this),e)}})},function(e,t,n){"use strict";var r=n(47),i=n(213),o=n(152),a=1..toFixed,s=Math.floor,u=[0,0,0,0,0,0],c=function(e,t){for(var n=-1,r=t;++n<6;)r+=e*u[n],u[n]=r%1e7,r=s(r/1e7)},l=function(e){for(var t=6,n=0;--t>=0;)n+=u[t],u[t]=s(n/e),n=n%e*1e7},f=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==u[e]){var n=String(u[e]);t=""===t?n:t+o.call("0",7-n.length)+n}return t},h=function(e,t,n){return 0===t?n:t%2==1?h(e,t-1,n*e):h(e*e,t/2,n)};n(3)({target:"Number",proto:!0,forced:a&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!n(14)(function(){a.call({})})},{toFixed:function(e){var t,n,a,s,u=i(this),d=r(e),p="",v="0";if(d<0||d>20)throw RangeError("Incorrect fraction digits");if(u!=u)return"NaN";if(u<=-1e21||u>=1e21)return String(u);if(u<0&&(p="-",u=-u),u>1e-21)if(n=(t=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t}(u*h(2,69,1))-69)<0?u*h(2,-t,1):u/h(2,t,1),n*=4503599627370496,(t=52-t)>0){for(c(0,n),a=d;a>=7;)c(1e7,0),a-=7;for(c(h(10,a,1),0),a=t-1;a>=23;)l(1<<23),a-=23;l(1<<a),c(1,1),l(2),v=f()}else c(0,n),c(1<<-t,0),v=f()+o.call("0",d);return v=d>0?p+((s=v.length)<=d?"0."+o.call("0",d-s)+v:v.slice(0,s-d)+"."+v.slice(s-d)):p+v}})},function(e,t,n){var r=n(214);n(3)({target:"Number",stat:!0,forced:Number.parseInt!=r},{parseInt:r})},function(e,t,n){var r=n(21).parseFloat,i=n(71),o=n(119),a=1/r(o+"-0")!=-1/0;e.exports=a?function(e){var t=i(String(e),3),n=r(t);return 0===n&&"-"==t.charAt(0)?-0:n}:r},function(e,t,n){var r=n(505);n(3)({target:"Number",stat:!0,forced:Number.parseFloat!=r},{parseFloat:r})},function(e,t,n){n(3)({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991})},function(e,t,n){n(3)({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991})},function(e,t,n){var r=n(215),i=Math.abs;n(3)({target:"Number",stat:!0},{isSafeInteger:function(e){return r(e)&&i(e)<=9007199254740991}})},function(e,t,n){n(3)({target:"Number",stat:!0},{isNaN:function(e){return e!=e}})},function(e,t,n){n(3)({target:"Number",stat:!0},{isInteger:n(215)})},function(e,t,n){var r=n(21).isFinite;e.exports=Number.isFinite||function(e){return"number"==typeof e&&r(e)}},function(e,t,n){n(3)({target:"Number",stat:!0},{isFinite:n(512)})},function(e,t,n){n(3)({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)})},function(e,t,n){"use strict";var r=n(21),i=n(158),o=n(38),a=n(65),s=n(221),u=n(66),c=n(14),l=n(122).f,f=n(55).f,h=n(29).f,d=n(71),p=r.Number,v=p.prototype,m="Number"==a(n(74)(v)),y="trim"in String.prototype,g=function(e){var t,n,r,i,o,a,s,c,l=u(e,!1);if("string"==typeof l&&l.length>2)if(43===(t=(l=y?l.trim():d(l,3)).charCodeAt(0))||45===t){if(88===(n=l.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(l.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+l}for(a=(o=l.slice(2)).length,s=0;s<a;s++)if((c=o.charCodeAt(s))<48||c>i)return NaN;return parseInt(o,r)}return+l};if(i("Number",!p(" 0o1")||!p("0b1")||p("+0x1"))){for(var b,w=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof w&&(m?c(function(){v.valueOf.call(n)}):"Number"!=a(n))?s(new p(g(t)),n,w):g(t)},_=n(24)?l(p):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),k=0;_.length>k;k++)o(p,b=_[k])&&!o(w,b)&&h(w,b,f(p,b));w.prototype=v,v.constructor=w,n(54)(r,"Number",w)}},function(e,t,n){n(515),n(514),n(513),n(511),n(510),n(509),n(508),n(507),n(506),n(504),n(503),n(502),e.exports=n(53).Number},function(e,t,n){e.exports=n(516),n(501)},function(e,t,n){"use strict";var r=n(9),i=n(15);n(3)({target:"Map",proto:!0,real:!0,forced:n(10)},{update:function(e,t){var n=r(this);i(t);var o=n.has(e);if(!o&&arguments.length<3)throw TypeError("Updating absent value");var a=o?n.get(e):i(arguments[2])(e,n);return n.set(e,t(a,e,n)),n}})},function(e,t,n){"use strict";var r=n(9),i=n(27),o=n(45);n(3)({target:"Map",proto:!0,real:!0,forced:n(10)},{some:function(e){for(var t,n,a=r(this),s=o(a),u=i(e,arguments.length>1?arguments[1]:void 0,3);!(t=s.next()).done;)if(u((n=t.value)[1],n[0],a))return!0;return!1}})},function(e,t,n){"use strict";var r=n(9),i=n(15),o=n(45);n(3)({target:"Map",proto:!0,real:!0,forced:n(10)},{reduce:function(e){var t,n,a,s=r(this),u=o(s);if(i(e),arguments.length>1)t=arguments[1];else{if((n=u.next()).done)throw TypeError("Reduce of empty map with no initial value");t=n.value[1]}for(;!(n=u.next()).done;)t=e(t,(a=n.value)[1],a[0],s);return t}})},function(e,t,n){"use strict";var r=n(9),i=n(15),o=n(30);n(3)({target:"Map",proto:!0,real:!0,forced:n(10)},{merge:function(e){for(var t=r(this),n=i(t.set),a=0;a<arguments.length;)o(arguments[a++],n,t,!0);return t}})},function(e,t,n){"use strict";var r=n(40),i=n(9),o=n(15),a=n(27),s=n(37),u=n(45);n(3)({target:"Map",proto:!0,real:!0,forced:n(10)},{mapValues:function(e){for(var t,n,c,l=i(this),f=u(l),h=a(e,arguments.length>1?arguments[1]:void 0,3),d=new(s(l,r("Map"))),p=o(d.set);!(t=f.next()).done;)n=t.value,p.call(d,c=n[0],h(n[1],c,l));return d}})},function(e,t,n){"use strict";var r=n(40),i=n(9),o=n(15),a=n(27),s=n(37),u=n(45);n(3)({target:"Map",proto:!0,real:!0,forced:n(10)},{mapKeys:function(e){for(var t,n,c,l=i(this),f=u(l),h=a(e,arguments.length>1?arguments[1]:void 0,3),d=new(s(l,r("Map"))),p=o(d.set);!(t=f.next()).done;)n=t.value,p.call(d,h(c=n[1],n[0],l),c);return d}})},function(e,t,n){"use strict";var r=n(9),i=n(45);n(3)({target:"Map",proto:!0,real:!0,forced:n(10)},{keyOf:function(e){for(var t,n,o=r(this),a=i(o);!(t=a.next()).done;)if((n=t.value)[1]===e)return n[0]}})},function(e,t,n){"use strict";var r=n(30),i=n(15);n(3)({target:"Map",stat:!0,forced:n(10)},{keyBy:function(e,t){var n=new this;i(t);var o=i(n.set);return r(e,function(e){o.call(n,t(e),e)}),n}})},function(e,t){e.exports=function(e,t){return e===t||e!=e&&t!=t}},function(e,t,n){"use strict";var r=n(9),i=n(45),o=n(526);n(3)({target:"Map",proto:!0,real:!0,forced:n(10)},{includes:function(e){for(var t,n=r(this),a=i(n);!(t=a.next()).done;)if(o(t.value[1],e))return!0;return!1}})},function(e,t,n){"use strict";var r=n(30),i=n(15);n(3)({target:"Map",stat:!0,forced:n(10)},{groupBy:function(e,t){var n=new this;i(t);var o=i(n.has),a=i(n.get),s=i(n.set);return r(e,function(e){var r=t(e);o.call(n,r)?a.call(n,r).push(e):s.call(n,r,[e])}),n}})},function(e,t,n){"use strict";var r=n(9),i=n(27),o=n(45);n(3)({target:"Map",proto:!0,real:!0,forced:n(10)},{findKey:function(e){for(var t,n,a,s=r(this),u=o(s),c=i(e,arguments.length>1?arguments[1]:void 0,3);!(t=u.next()).done;)if(c((n=t.value)[1],a=n[0],s))return a}})},function(e,t,n){"use strict";var r=n(9),i=n(27),o=n(45);n(3)({target:"Map",proto:!0,real:!0,forced:n(10)},{find:function(e){for(var t,n,a,s=r(this),u=o(s),c=i(e,arguments.length>1?arguments[1]:void 0,3);!(t=u.next()).done;)if(c(a=(n=t.value)[1],n[0],s))return a}})},function(e,t,n){"use strict";var r=n(40),i=n(9),o=n(15),a=n(27),s=n(37),u=n(45);n(3)({target:"Map",proto:!0,real:!0,forced:n(10)},{filter:function(e){for(var t,n,c,l,f=i(this),h=u(f),d=a(e,arguments.length>1?arguments[1]:void 0,3),p=new(s(f,r("Map"))),v=o(p.set);!(t=h.next()).done;)d(l=(n=t.value)[1],c=n[0],f)&&v.call(p,c,l);return p}})},function(e,t,n){"use strict";var r=n(9),i=n(27),o=n(45);n(3)({target:"Map",proto:!0,real:!0,forced:n(10)},{every:function(e){for(var t,n,a=r(this),s=o(a),u=i(e,arguments.length>1?arguments[1]:void 0,3);!(t=s.next()).done;)if(!u((n=t.value)[1],n[0],a))return!1;return!0}})},function(e,t,n){"use strict";var r=n(216);n(3)({target:"Map",proto:!0,real:!0,forced:n(10)},{deleteAll:function(){return r.apply(this,arguments)}})},function(e,t,n){n(3)({target:"Map",stat:!0},{of:n(217)})},function(e,t,n){n(3)({target:"Map",stat:!0},{from:n(218)})},function(e,t){e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(e,t,n){"use strict";var r=n(155),i={};i[n(20)("toStringTag")]="z",e.exports="[object z]"!==String(i)?function(){return"[object "+r(this)+"]"}:i.toString},function(e,t,n){var r=n(54);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},function(e,t,n){"use strict";e.exports=n(223)("Map",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},n(220),!0)},function(e,t,n){n(539),n(154),n(126),n(219),e.exports=n(53).Map},function(e,t,n){e.exports=n(540),n(535),n(534),n(533),n(532),n(531),n(530),n(529),n(528),n(527),n(525),n(524),n(523),n(522),n(521),n(520),n(519),n(518)},function(e,t,n){"use strict";var r=n(24),i=n(22),o=n(18),a=n(29).f;!r||"lastIndex"in[]||(a(Array.prototype,"lastIndex",{configurable:!0,get:function(){var e=i(this),t=o(e.length);return 0==t?0:t-1}}),n(46)("lastIndex"))},function(e,t,n){"use strict";var r=n(24),i=n(22),o=n(18),a=n(29).f;!r||"lastItem"in[]||(a(Array.prototype,"lastItem",{configurable:!0,get:function(){var e=i(this),t=o(e.length);return 0==t?void 0:e[t-1]},set:function(e){var t=i(this),n=o(t.length);return t[0==n?0:n-1]=e}}),n(46)("lastItem"))},function(e,t,n){n(46)("flatMap")},function(e,t,n){n(46)("flat")},function(e,t,n){"use strict";var r=n(75),i=n(47),o=n(18),a=n(22),s=n(88),u=n(64),c=Math.max,l=Math.min,f=n(87)("splice");n(3)({target:"Array",proto:!0,forced:!f},{splice:function(e,t){var n,f,h,d,p,v,m=a(this),y=o(m.length),g=r(e,y),b=arguments.length;if(0===b?n=f=0:1===b?(n=0,f=y-g):(n=b-2,f=l(c(i(t),0),y-g)),y+n-f>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(h=s(m,f),d=0;d<f;d++)(p=g+d)in m&&u(h,d,m[p]);if(h.length=f,n<f){for(d=g;d<y-f;d++)v=d+n,(p=d+f)in m?m[v]=m[p]:delete m[v];for(d=y;d>y-f+n;d--)delete m[d-1]}else if(n>f)for(d=y-f;d>g;d--)v=d+n-1,(p=d+f-1)in m?m[v]=m[p]:delete m[v];for(d=0;d<n;d++)m[d+g]=arguments[d+2];return m.length=y-f+n,h}})},function(e,t,n){n(224)("Array")},function(e,t,n){"use strict";var r=n(15),i=n(22),o=n(14),a=[].sort,s=[1,2,3],u=o(function(){s.sort(void 0)}),c=o(function(){s.sort(null)}),l=n(51)("sort"),f=u||!c||l;n(3)({target:"Array",proto:!0,forced:f},{sort:function(e){return void 0===e?a.call(i(this)):a.call(i(this),r(e))}})},function(e,t,n){"use strict";var r=n(62)(3),i=n(51)("some");n(3)({target:"Array",proto:!0,forced:i},{some:function(e){return r(this,e,arguments[1])}})},function(e,t,n){"use strict";var r=n(23),i=n(63),o=n(75),a=n(18),s=n(35),u=n(64),c=n(20)("species"),l=[].slice,f=Math.max,h=n(87)("slice");n(3)({target:"Array",proto:!0,forced:!h},{slice:function(e,t){var n,h,d,p=s(this),v=a(p.length),m=o(e,v),y=o(void 0===t?v:t,v);if(i(p)&&("function"!=typeof(n=p.constructor)||n!==Array&&!i(n.prototype)?r(n)&&null===(n=n[c])&&(n=void 0):n=void 0,n===Array||void 0===n))return l.call(p,m,y);for(h=new(void 0===n?Array:n)(f(y-m,0)),d=0;m<y;m++,d++)m in p&&u(h,d,p[m]);return h.length=d,h}})},function(e,t,n){"use strict";var r=n(63),i=[].reverse,o=[1,2];n(3)({target:"Array",proto:!0,forced:String(o)===String(o.reverse())},{reverse:function(){return r(this)&&(this.length=this.length),i.call(this)}})},function(e,t,n){"use strict";var r=n(225),i=n(51)("reduceRight");n(3)({target:"Array",proto:!0,forced:i},{reduceRight:function(e){return r(this,e,arguments.length,arguments[1],!0)}})},function(e,t,n){"use strict";var r=n(225),i=n(51)("reduce");n(3)({target:"Array",proto:!0,forced:i},{reduce:function(e){return r(this,e,arguments.length,arguments[1],!1)}})},function(e,t,n){"use strict";var r=n(62)(1),i=n(87)("map");n(3)({target:"Array",proto:!0,forced:!i},{map:function(e){return r(this,e,arguments[1])}})},function(e,t,n){"use strict";var r=n(35),i=n(47),o=n(18),a=[].lastIndexOf,s=!!a&&1/[1].lastIndexOf(1,-0)<0,u=n(51)("lastIndexOf");e.exports=s||u?function(e){if(s)return a.apply(this,arguments)||0;var t=r(this),n=o(t.length),u=n-1;for(arguments.length>1&&(u=Math.min(u,i(arguments[1]))),u<0&&(u=n+u);u>=0;u--)if(u in t&&t[u]===e)return u||0;return-1}:a},function(e,t,n){var r=n(555);n(3)({target:"Array",proto:!0,forced:r!==[].lastIndexOf},{lastIndexOf:r})},function(e,t,n){"use strict";var r=n(35),i=[].join,o=n(91)!=Object,a=n(51)("join",",");n(3)({target:"Array",proto:!0,forced:o||a},{join:function(e){return i.call(r(this),void 0===e?",":e)}})},function(e,t,n){"use strict";var r=n(160)(!1),i=[].indexOf,o=!!i&&1/[1].indexOf(1,-0)<0,a=n(51)("indexOf");n(3)({target:"Array",proto:!0,forced:o||a},{indexOf:function(e){return o?i.apply(this,arguments)||0:r(this,e,arguments[1])}})},function(e,t,n){"use strict";var r=n(160)(!0);n(3)({target:"Array",proto:!0},{includes:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}}),n(46)("includes")},function(e,t,n){"use strict";var r=[].forEach,i=n(62)(0),o=n(51)("forEach");e.exports=o?function(e){return i(this,e,arguments[1])}:r},function(e,t,n){"use strict";var r=n(560);n(3)({target:"Array",proto:!0,forced:[].forEach!=r},{forEach:r})},function(e,t,n){"use strict";var r=n(227),i=n(22),o=n(18),a=n(15),s=n(88);n(3)({target:"Array",proto:!0},{flatMap:function(e){var t,n=i(this),u=o(n.length);return a(e),(t=s(n,0)).length=r(t,n,n,u,0,1,e,arguments[1]),t}})},function(e,t,n){"use strict";var r=n(227),i=n(22),o=n(18),a=n(47),s=n(88);n(3)({target:"Array",proto:!0},{flat:function(){var e=arguments[0],t=i(this),n=o(t.length),u=s(t,0);return u.length=r(u,t,t,n,0,void 0===e?1:a(e)),u}})},function(e,t,n){"use strict";var r=n(62)(6),i=!0;"findIndex"in[]&&Array(1).findIndex(function(){i=!1}),n(3)({target:"Array",proto:!0,forced:i},{findIndex:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}}),n(46)("findIndex")},function(e,t,n){"use strict";var r=n(62)(5),i=!0;"find"in[]&&Array(1).find(function(){i=!1}),n(3)({target:"Array",proto:!0,forced:i},{find:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}}),n(46)("find")},function(e,t,n){"use strict";var r=n(62)(2),i=n(87)("filter");n(3)({target:"Array",proto:!0,forced:!i},{filter:function(e){return r(this,e,arguments[1])}})},function(e,t,n){"use strict";var r=n(22),i=n(75),o=n(18);e.exports=function(e){for(var t=r(this),n=o(t.length),a=arguments.length,s=i(a>1?arguments[1]:void 0,n),u=a>2?arguments[2]:void 0,c=void 0===u?n:i(u,n);c>s;)t[s++]=e;return t}},function(e,t,n){n(3)({target:"Array",proto:!0},{fill:n(567)}),n(46)("fill")},function(e,t,n){"use strict";var r=n(62)(4),i=n(51)("every");n(3)({target:"Array",proto:!0,forced:i},{every:function(e){return r(this,e,arguments[1])}})},function(e,t,n){"use strict";var r=n(22),i=n(75),o=n(18);e.exports=[].copyWithin||function(e,t){var n=r(this),a=o(n.length),s=i(e,a),u=i(t,a),c=arguments.length>2?arguments[2]:void 0,l=Math.min((void 0===c?a:i(c,a))-u,a-s),f=1;for(u<s&&s<u+l&&(f=-1,u+=l-1,s+=l-1);l-->0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},function(e,t,n){n(3)({target:"Array",proto:!0},{copyWithin:n(570)}),n(46)("copyWithin")},function(e,t,n){"use strict";var r=n(63),i=n(23),o=n(22),a=n(18),s=n(64),u=n(88),c=n(20)("isConcatSpreadable"),l=!n(14)(function(){var e=[];return e[c]=!1,e.concat()[0]!==e}),f=n(87)("concat"),h=function(e){if(!i(e))return!1;var t=e[c];return void 0!==t?!!t:r(e)},d=!l||!f;n(3)({target:"Array",proto:!0,forced:d},{concat:function(e){var t,n,r,i,c,l=o(this),f=u(l,0),d=0;for(t=-1,r=arguments.length;t<r;t++)if(c=-1===t?l:arguments[t],h(c)){if(d+(i=a(c.length))>9007199254740991)throw TypeError("Maximum allowed index exceeded");for(n=0;n<i;n++,d++)n in c&&s(f,d,c[n])}else{if(d>=9007199254740991)throw TypeError("Maximum allowed index exceeded");s(f,d++,c)}return f.length=d,f}})},function(e,t,n){"use strict";var r=n(64),i=n(14)(function(){function e(){}return!(Array.of.call(e)instanceof e)});n(3)({target:"Array",stat:!0,forced:i},{of:function(){for(var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);t>e;)r(n,e,arguments[e++]);return n.length=t,n}})},function(e,t,n){n(3)({target:"Array",stat:!0},{isArray:n(63)})},function(e,t,n){"use strict";var r=n(27),i=n(22),o=n(229),a=n(228),s=n(18),u=n(64),c=n(156);e.exports=function(e){var t,n,l,f,h=i(e),d="function"==typeof this?this:Array,p=arguments.length,v=p>1?arguments[1]:void 0,m=void 0!==v,y=0,g=c(h);if(m&&(v=r(v,p>2?arguments[2]:void 0,2)),void 0==g||d==Array&&a(g))for(n=new d(t=s(h.length));t>y;y++)u(n,y,m?v(h[y],y):h[y]);else for(f=g.call(h),n=new d;!(l=f.next()).done;y++)u(n,y,m?o(f,v,[l.value,y],!0):l.value);return n.length=y,n}},function(e,t,n){var r=!n(230)(function(e){Array.from(e)});n(3)({target:"Array",stat:!0,forced:r},{from:n(575)})},function(e,t,n){var r=n(23),i=n(9);e.exports=function(e,t){if(i(e),!r(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype")}},function(e,t,n){var r=n(21).document;e.exports=r&&r.documentElement},function(e,t,n){var r=n(38),i=n(237),o=n(55),a=n(29);e.exports=function(e,t){for(var n=i(t),s=a.f,u=o.f,c=0;c<n.length;c++){var l=n[c];r(e,l)||s(e,l,u(t,l))}}},function(e,t,n){var r=n(240),i=n(21).WeakMap;e.exports="function"==typeof i&&/native code/.test(r.call(i))},function(e,t,n){n(126),n(576),n(574),n(573),n(572),n(571),n(569),n(568),n(566),n(565),n(564),n(563),n(562),n(561),n(559),n(558),n(226),n(557),n(556),n(554),n(553),n(552),n(551),n(550),n(549),n(548),n(547),n(546),n(545),n(544),e.exports=n(53).Array},function(e,t,n){e.exports=n(581),n(543),n(542)},function(e,t,n){n(607),e.exports=n(279)},,,,,,,,,,,,,,,,,,,,,,,,function(e,t){}]);{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/@babel/runtime/helpers/arrayWithHoles.js","webpack:///./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js","webpack:///./node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack:///./node_modules/@babel/runtime/helpers/classCallCheck.js","webpack:///./node_modules/@babel/runtime/helpers/createClass.js","webpack:///./node_modules/@babel/runtime/helpers/defineProperty.js","webpack:///./node_modules/@babel/runtime/helpers/getPrototypeOf.js","webpack:///./node_modules/@babel/runtime/helpers/inherits.js","webpack:///./node_modules/@babel/runtime/helpers/iterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","webpack:///./node_modules/@babel/runtime/helpers/nonIterableRest.js","webpack:///./node_modules/@babel/runtime/helpers/nonIterableSpread.js","webpack:///./node_modules/@babel/runtime/helpers/objectSpread.js","webpack:///./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","webpack:///./node_modules/@babel/runtime/helpers/setPrototypeOf.js","webpack:///./node_modules/@babel/runtime/helpers/slicedToArray.js","webpack:///./node_modules/@babel/runtime/helpers/toConsumableArray.js","webpack:///./node_modules/@babel/runtime/helpers/typeof.js","webpack:///./node_modules/@sentry/browser/esm/backend.js","webpack:///./node_modules/@sentry/browser/esm/client.js","webpack:///./node_modules/@sentry/browser/esm/eventbuilder.js","webpack:///./node_modules/@sentry/browser/esm/helpers.js","webpack:///./node_modules/@sentry/browser/esm/index.js","webpack:///./node_modules/@sentry/browser/esm/integrations/breadcrumbs.js","webpack:///./node_modules/@sentry/browser/esm/integrations/globalhandlers.js","webpack:///./node_modules/@sentry/browser/esm/integrations/index.js","webpack:///./node_modules/@sentry/browser/esm/integrations/linkederrors.js","webpack:///./node_modules/@sentry/browser/esm/integrations/trycatch.js","webpack:///./node_modules/@sentry/browser/esm/integrations/useragent.js","webpack:///./node_modules/@sentry/browser/esm/parsers.js","webpack:///./node_modules/@sentry/browser/esm/sdk.js","webpack:///./node_modules/@sentry/browser/esm/tracekit.js","webpack:///./node_modules/@sentry/browser/esm/transports/base.js","webpack:///./node_modules/@sentry/browser/esm/transports/fetch.js","webpack:///./node_modules/@sentry/browser/esm/transports/index.js","webpack:///./node_modules/@sentry/browser/esm/transports/xhr.js","webpack:///./node_modules/@sentry/browser/esm/version.js","webpack:///./node_modules/@sentry/core/esm/api.js","webpack:///./node_modules/@sentry/core/esm/basebackend.js","webpack:///./node_modules/@sentry/core/esm/baseclient.js","webpack:///./node_modules/@sentry/core/esm/index.js","webpack:///./node_modules/@sentry/core/esm/integration.js","webpack:///./node_modules/@sentry/core/esm/integrations/functiontostring.js","webpack:///./node_modules/@sentry/core/esm/integrations/inboundfilters.js","webpack:///./node_modules/@sentry/core/esm/integrations/index.js","webpack:///./node_modules/@sentry/core/esm/sdk.js","webpack:///./node_modules/@sentry/core/esm/transports/noop.js","webpack:///./node_modules/@sentry/hub/esm/hub.js","webpack:///./node_modules/@sentry/hub/esm/index.js","webpack:///./node_modules/@sentry/hub/esm/scope.js","webpack:///./node_modules/@sentry/integrations/esm/angular.js","webpack:///./node_modules/@sentry/integrations/esm/captureconsole.js","webpack:///./node_modules/@sentry/integrations/esm/debug.js","webpack:///./node_modules/@sentry/integrations/esm/dedupe.js","webpack:///./node_modules/@sentry/integrations/esm/ember.js","webpack:///./node_modules/@sentry/integrations/esm/extraerrordata.js","webpack:///./node_modules/@sentry/integrations/esm/index.js","webpack:///./node_modules/@sentry/integrations/esm/reportingobserver.js","webpack:///./node_modules/@sentry/integrations/esm/rewriteframes.js","webpack:///./node_modules/@sentry/integrations/esm/sessiontiming.js","webpack:///./node_modules/@sentry/integrations/esm/transaction.js","webpack:///./node_modules/@sentry/integrations/esm/vue.js","webpack:///./node_modules/@sentry/minimal/esm/index.js","webpack:///./node_modules/@sentry/types/esm/index.js","webpack:///./node_modules/@sentry/types/esm/loglevel.js","webpack:///./node_modules/@sentry/types/esm/severity.js","webpack:///./node_modules/@sentry/types/esm/span.js","webpack:///./node_modules/@sentry/types/esm/status.js","webpack:///./node_modules/@sentry/utils/esm/async.js","webpack:///./node_modules/@sentry/utils/esm/dsn.js","webpack:///./node_modules/@sentry/utils/esm/error.js","webpack:///./node_modules/@sentry/utils/esm/index.js","webpack:///./node_modules/@sentry/utils/esm/instrument.js","webpack:///./node_modules/@sentry/utils/esm/is.js","webpack:///./node_modules/@sentry/utils/esm/logger.js","webpack:///./node_modules/@sentry/utils/esm/memo.js","webpack:///./node_modules/@sentry/utils/esm/misc.js","webpack:///./node_modules/@sentry/utils/esm/object.js","webpack:///./node_modules/@sentry/utils/esm/path.js","webpack:///./node_modules/@sentry/utils/esm/polyfill.js","webpack:///./node_modules/@sentry/utils/esm/promisebuffer.js","webpack:///./node_modules/@sentry/utils/esm/string.js","webpack:///./node_modules/@sentry/utils/esm/supports.js","webpack:///./node_modules/@sentry/utils/esm/syncpromise.js","webpack:///./node_modules/bottlejs/dist/bottle.js","webpack:///./node_modules/core-js/es/array/index.js","webpack:///./node_modules/core-js/es/map/index.js","webpack:///./node_modules/core-js/es/number/index.js","webpack:///./node_modules/core-js/es/object/index.js","webpack:///./node_modules/core-js/es/set/index.js","webpack:///./node_modules/core-js/es/string/index.js","webpack:///./node_modules/core-js/features/array/index.js","webpack:///./node_modules/core-js/features/map/index.js","webpack:///./node_modules/core-js/features/number/index.js","webpack:///./node_modules/core-js/features/object/index.js","webpack:///./node_modules/core-js/features/set/index.js","webpack:///./node_modules/core-js/features/string/index.js","webpack:///./node_modules/core-js/internals/a-function.js","webpack:///./node_modules/core-js/internals/add-to-unscopables.js","webpack:///./node_modules/core-js/internals/advance-string-index.js","webpack:///./node_modules/core-js/internals/an-instance.js","webpack:///./node_modules/core-js/internals/an-object.js","webpack:///./node_modules/core-js/internals/array-copy-within.js","webpack:///./node_modules/core-js/internals/array-fill.js","webpack:///./node_modules/core-js/internals/array-for-each.js","webpack:///./node_modules/core-js/internals/array-from.js","webpack:///./node_modules/core-js/internals/array-includes.js","webpack:///./node_modules/core-js/internals/array-last-index-of.js","webpack:///./node_modules/core-js/internals/array-method-has-species-support.js","webpack:///./node_modules/core-js/internals/array-methods.js","webpack:///./node_modules/core-js/internals/array-reduce.js","webpack:///./node_modules/core-js/internals/array-species-create.js","webpack:///./node_modules/core-js/internals/bind-context.js","webpack:///./node_modules/core-js/internals/call-with-safe-iteration-closing.js","webpack:///./node_modules/core-js/internals/check-correctness-of-iteration.js","webpack:///./node_modules/core-js/internals/classof-raw.js","webpack:///./node_modules/core-js/internals/classof.js","webpack:///./node_modules/core-js/internals/collection-add-all.js","webpack:///./node_modules/core-js/internals/collection-delete-all.js","webpack:///./node_modules/core-js/internals/collection-from.js","webpack:///./node_modules/core-js/internals/collection-of.js","webpack:///./node_modules/core-js/internals/collection-strong.js","webpack:///./node_modules/core-js/internals/collection.js","webpack:///./node_modules/core-js/internals/copy-constructor-properties.js","webpack:///./node_modules/core-js/internals/correct-is-regexp-logic.js","webpack:///./node_modules/core-js/internals/correct-prototype-getter.js","webpack:///./node_modules/core-js/internals/create-html.js","webpack:///./node_modules/core-js/internals/create-iterator-constructor.js","webpack:///./node_modules/core-js/internals/create-property-descriptor.js","webpack:///./node_modules/core-js/internals/create-property.js","webpack:///./node_modules/core-js/internals/define-iterator.js","webpack:///./node_modules/core-js/internals/define-well-known-symbol.js","webpack:///./node_modules/core-js/internals/descriptors.js","webpack:///./node_modules/core-js/internals/document-create-element.js","webpack:///./node_modules/core-js/internals/dom-iterables.js","webpack:///./node_modules/core-js/internals/enum-bug-keys.js","webpack:///./node_modules/core-js/internals/enum-keys.js","webpack:///./node_modules/core-js/internals/export.js","webpack:///./node_modules/core-js/internals/fails.js","webpack:///./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","webpack:///./node_modules/core-js/internals/flatten-into-array.js","webpack:///./node_modules/core-js/internals/forced-object-prototype-accessors-methods.js","webpack:///./node_modules/core-js/internals/forced-string-html-method.js","webpack:///./node_modules/core-js/internals/forced-string-trim-method.js","webpack:///./node_modules/core-js/internals/freezing.js","webpack:///./node_modules/core-js/internals/function-to-string.js","webpack:///./node_modules/core-js/internals/get-built-in.js","webpack:///./node_modules/core-js/internals/get-iterator-method.js","webpack:///./node_modules/core-js/internals/get-iterator.js","webpack:///./node_modules/core-js/internals/get-map-iterator.js","webpack:///./node_modules/core-js/internals/get-set-iterator.js","webpack:///./node_modules/core-js/internals/global.js","webpack:///./node_modules/core-js/internals/has.js","webpack:///./node_modules/core-js/internals/hidden-keys.js","webpack:///./node_modules/core-js/internals/hide.js","webpack:///./node_modules/core-js/internals/html.js","webpack:///./node_modules/core-js/internals/ie8-dom-define.js","webpack:///./node_modules/core-js/internals/indexed-object.js","webpack:///./node_modules/core-js/internals/inherit-if-required.js","webpack:///./node_modules/core-js/internals/internal-metadata.js","webpack:///./node_modules/core-js/internals/internal-state.js","webpack:///./node_modules/core-js/internals/is-array-iterator-method.js","webpack:///./node_modules/core-js/internals/is-array.js","webpack:///./node_modules/core-js/internals/is-forced.js","webpack:///./node_modules/core-js/internals/is-integer.js","webpack:///./node_modules/core-js/internals/is-object.js","webpack:///./node_modules/core-js/internals/is-pure.js","webpack:///./node_modules/core-js/internals/is-regexp.js","webpack:///./node_modules/core-js/internals/iterate.js","webpack:///./node_modules/core-js/internals/iterators-core.js","webpack:///./node_modules/core-js/internals/iterators.js","webpack:///./node_modules/core-js/internals/native-symbol.js","webpack:///./node_modules/core-js/internals/native-weak-map.js","webpack:///./node_modules/core-js/internals/number-is-finite.js","webpack:///./node_modules/core-js/internals/object-assign.js","webpack:///./node_modules/core-js/internals/object-create.js","webpack:///./node_modules/core-js/internals/object-define-properties.js","webpack:///./node_modules/core-js/internals/object-define-property.js","webpack:///./node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack:///./node_modules/core-js/internals/object-get-own-property-names-external.js","webpack:///./node_modules/core-js/internals/object-get-own-property-names.js","webpack:///./node_modules/core-js/internals/object-get-own-property-symbols.js","webpack:///./node_modules/core-js/internals/object-get-prototype-of.js","webpack:///./node_modules/core-js/internals/object-keys-internal.js","webpack:///./node_modules/core-js/internals/object-keys.js","webpack:///./node_modules/core-js/internals/object-property-is-enumerable.js","webpack:///./node_modules/core-js/internals/object-set-prototype-of.js","webpack:///./node_modules/core-js/internals/object-to-array.js","webpack:///./node_modules/core-js/internals/object-to-string.js","webpack:///./node_modules/core-js/internals/own-keys.js","webpack:///./node_modules/core-js/internals/parse-float.js","webpack:///./node_modules/core-js/internals/parse-int.js","webpack:///./node_modules/core-js/internals/path.js","webpack:///./node_modules/core-js/internals/redefine-all.js","webpack:///./node_modules/core-js/internals/redefine.js","webpack:///./node_modules/core-js/internals/regexp-exec-abstract.js","webpack:///./node_modules/core-js/internals/regexp-exec.js","webpack:///./node_modules/core-js/internals/regexp-flags.js","webpack:///./node_modules/core-js/internals/require-object-coercible.js","webpack:///./node_modules/core-js/internals/same-value-zero.js","webpack:///./node_modules/core-js/internals/same-value.js","webpack:///./node_modules/core-js/internals/set-global.js","webpack:///./node_modules/core-js/internals/set-species.js","webpack:///./node_modules/core-js/internals/set-to-string-tag.js","webpack:///./node_modules/core-js/internals/shared-key.js","webpack:///./node_modules/core-js/internals/shared.js","webpack:///./node_modules/core-js/internals/sloppy-array-method.js","webpack:///./node_modules/core-js/internals/species-constructor.js","webpack:///./node_modules/core-js/internals/string-at.js","webpack:///./node_modules/core-js/internals/string-pad.js","webpack:///./node_modules/core-js/internals/string-repeat.js","webpack:///./node_modules/core-js/internals/string-trim.js","webpack:///./node_modules/core-js/internals/this-number-value.js","webpack:///./node_modules/core-js/internals/to-absolute-index.js","webpack:///./node_modules/core-js/internals/to-indexed-object.js","webpack:///./node_modules/core-js/internals/to-integer.js","webpack:///./node_modules/core-js/internals/to-length.js","webpack:///./node_modules/core-js/internals/to-object.js","webpack:///./node_modules/core-js/internals/to-primitive.js","webpack:///./node_modules/core-js/internals/uid.js","webpack:///./node_modules/core-js/internals/user-agent.js","webpack:///./node_modules/core-js/internals/validate-set-prototype-of-arguments.js","webpack:///./node_modules/core-js/internals/validate-string-method-arguments.js","webpack:///./node_modules/core-js/internals/webkit-string-pad-bug.js","webpack:///./node_modules/core-js/internals/well-known-symbol.js","webpack:///./node_modules/core-js/internals/whitespaces.js","webpack:///./node_modules/core-js/internals/wrapped-well-known-symbol.js","webpack:///./node_modules/core-js/modules/es.array.concat.js","webpack:///./node_modules/core-js/modules/es.array.copy-within.js","webpack:///./node_modules/core-js/modules/es.array.every.js","webpack:///./node_modules/core-js/modules/es.array.fill.js","webpack:///./node_modules/core-js/modules/es.array.filter.js","webpack:///./node_modules/core-js/modules/es.array.find-index.js","webpack:///./node_modules/core-js/modules/es.array.find.js","webpack:///./node_modules/core-js/modules/es.array.flat-map.js","webpack:///./node_modules/core-js/modules/es.array.flat.js","webpack:///./node_modules/core-js/modules/es.array.for-each.js","webpack:///./node_modules/core-js/modules/es.array.from.js","webpack:///./node_modules/core-js/modules/es.array.includes.js","webpack:///./node_modules/core-js/modules/es.array.index-of.js","webpack:///./node_modules/core-js/modules/es.array.is-array.js","webpack:///./node_modules/core-js/modules/es.array.iterator.js","webpack:///./node_modules/core-js/modules/es.array.join.js","webpack:///./node_modules/core-js/modules/es.array.last-index-of.js","webpack:///./node_modules/core-js/modules/es.array.map.js","webpack:///./node_modules/core-js/modules/es.array.of.js","webpack:///./node_modules/core-js/modules/es.array.reduce-right.js","webpack:///./node_modules/core-js/modules/es.array.reduce.js","webpack:///./node_modules/core-js/modules/es.array.reverse.js","webpack:///./node_modules/core-js/modules/es.array.slice.js","webpack:///./node_modules/core-js/modules/es.array.some.js","webpack:///./node_modules/core-js/modules/es.array.sort.js","webpack:///./node_modules/core-js/modules/es.array.species.js","webpack:///./node_modules/core-js/modules/es.array.splice.js","webpack:///./node_modules/core-js/modules/es.array.unscopables.flat-map.js","webpack:///./node_modules/core-js/modules/es.array.unscopables.flat.js","webpack:///./node_modules/core-js/modules/es.json.to-string-tag.js","webpack:///./node_modules/core-js/modules/es.map.js","webpack:///./node_modules/core-js/modules/es.math.to-string-tag.js","webpack:///./node_modules/core-js/modules/es.number.constructor.js","webpack:///./node_modules/core-js/modules/es.number.epsilon.js","webpack:///./node_modules/core-js/modules/es.number.is-finite.js","webpack:///./node_modules/core-js/modules/es.number.is-integer.js","webpack:///./node_modules/core-js/modules/es.number.is-nan.js","webpack:///./node_modules/core-js/modules/es.number.is-safe-integer.js","webpack:///./node_modules/core-js/modules/es.number.max-safe-integer.js","webpack:///./node_modules/core-js/modules/es.number.min-safe-integer.js","webpack:///./node_modules/core-js/modules/es.number.parse-float.js","webpack:///./node_modules/core-js/modules/es.number.parse-int.js","webpack:///./node_modules/core-js/modules/es.number.to-fixed.js","webpack:///./node_modules/core-js/modules/es.number.to-precision.js","webpack:///./node_modules/core-js/modules/es.object.assign.js","webpack:///./node_modules/core-js/modules/es.object.create.js","webpack:///./node_modules/core-js/modules/es.object.define-getter.js","webpack:///./node_modules/core-js/modules/es.object.define-properties.js","webpack:///./node_modules/core-js/modules/es.object.define-property.js","webpack:///./node_modules/core-js/modules/es.object.define-setter.js","webpack:///./node_modules/core-js/modules/es.object.entries.js","webpack:///./node_modules/core-js/modules/es.object.freeze.js","webpack:///./node_modules/core-js/modules/es.object.from-entries.js","webpack:///./node_modules/core-js/modules/es.object.get-own-property-descriptor.js","webpack:///./node_modules/core-js/modules/es.object.get-own-property-descriptors.js","webpack:///./node_modules/core-js/modules/es.object.get-own-property-names.js","webpack:///./node_modules/core-js/modules/es.object.get-prototype-of.js","webpack:///./node_modules/core-js/modules/es.object.is-extensible.js","webpack:///./node_modules/core-js/modules/es.object.is-frozen.js","webpack:///./node_modules/core-js/modules/es.object.is-sealed.js","webpack:///./node_modules/core-js/modules/es.object.is.js","webpack:///./node_modules/core-js/modules/es.object.keys.js","webpack:///./node_modules/core-js/modules/es.object.lookup-getter.js","webpack:///./node_modules/core-js/modules/es.object.lookup-setter.js","webpack:///./node_modules/core-js/modules/es.object.prevent-extensions.js","webpack:///./node_modules/core-js/modules/es.object.seal.js","webpack:///./node_modules/core-js/modules/es.object.set-prototype-of.js","webpack:///./node_modules/core-js/modules/es.object.to-string.js","webpack:///./node_modules/core-js/modules/es.object.values.js","webpack:///./node_modules/core-js/modules/es.set.js","webpack:///./node_modules/core-js/modules/es.string.anchor.js","webpack:///./node_modules/core-js/modules/es.string.big.js","webpack:///./node_modules/core-js/modules/es.string.blink.js","webpack:///./node_modules/core-js/modules/es.string.bold.js","webpack:///./node_modules/core-js/modules/es.string.code-point-at.js","webpack:///./node_modules/core-js/modules/es.string.ends-with.js","webpack:///./node_modules/core-js/modules/es.string.fixed.js","webpack:///./node_modules/core-js/modules/es.string.fontcolor.js","webpack:///./node_modules/core-js/modules/es.string.fontsize.js","webpack:///./node_modules/core-js/modules/es.string.from-code-point.js","webpack:///./node_modules/core-js/modules/es.string.includes.js","webpack:///./node_modules/core-js/modules/es.string.italics.js","webpack:///./node_modules/core-js/modules/es.string.iterator.js","webpack:///./node_modules/core-js/modules/es.string.link.js","webpack:///./node_modules/core-js/modules/es.string.match.js","webpack:///./node_modules/core-js/modules/es.string.pad-end.js","webpack:///./node_modules/core-js/modules/es.string.pad-start.js","webpack:///./node_modules/core-js/modules/es.string.raw.js","webpack:///./node_modules/core-js/modules/es.string.repeat.js","webpack:///./node_modules/core-js/modules/es.string.replace.js","webpack:///./node_modules/core-js/modules/es.string.search.js","webpack:///./node_modules/core-js/modules/es.string.small.js","webpack:///./node_modules/core-js/modules/es.string.split.js","webpack:///./node_modules/core-js/modules/es.string.starts-with.js","webpack:///./node_modules/core-js/modules/es.string.strike.js","webpack:///./node_modules/core-js/modules/es.string.sub.js","webpack:///./node_modules/core-js/modules/es.string.sup.js","webpack:///./node_modules/core-js/modules/es.string.trim-end.js","webpack:///./node_modules/core-js/modules/es.string.trim-start.js","webpack:///./node_modules/core-js/modules/es.string.trim.js","webpack:///./node_modules/core-js/modules/es.symbol.js","webpack:///./node_modules/core-js/modules/esnext.array.last-index.js","webpack:///./node_modules/core-js/modules/esnext.array.last-item.js","webpack:///./node_modules/core-js/modules/esnext.map.delete-all.js","webpack:///./node_modules/core-js/modules/esnext.map.every.js","webpack:///./node_modules/core-js/modules/esnext.map.filter.js","webpack:///./node_modules/core-js/modules/esnext.map.find-key.js","webpack:///./node_modules/core-js/modules/esnext.map.find.js","webpack:///./node_modules/core-js/modules/esnext.map.from.js","webpack:///./node_modules/core-js/modules/esnext.map.group-by.js","webpack:///./node_modules/core-js/modules/esnext.map.includes.js","webpack:///./node_modules/core-js/modules/esnext.map.key-by.js","webpack:///./node_modules/core-js/modules/esnext.map.key-of.js","webpack:///./node_modules/core-js/modules/esnext.map.map-keys.js","webpack:///./node_modules/core-js/modules/esnext.map.map-values.js","webpack:///./node_modules/core-js/modules/esnext.map.merge.js","webpack:///./node_modules/core-js/modules/esnext.map.of.js","webpack:///./node_modules/core-js/modules/esnext.map.reduce.js","webpack:///./node_modules/core-js/modules/esnext.map.some.js","webpack:///./node_modules/core-js/modules/esnext.map.update.js","webpack:///./node_modules/core-js/modules/esnext.number.from-string.js","webpack:///./node_modules/core-js/modules/esnext.set.add-all.js","webpack:///./node_modules/core-js/modules/esnext.set.delete-all.js","webpack:///./node_modules/core-js/modules/esnext.set.difference.js","webpack:///./node_modules/core-js/modules/esnext.set.every.js","webpack:///./node_modules/core-js/modules/esnext.set.filter.js","webpack:///./node_modules/core-js/modules/esnext.set.find.js","webpack:///./node_modules/core-js/modules/esnext.set.from.js","webpack:///./node_modules/core-js/modules/esnext.set.intersection.js","webpack:///./node_modules/core-js/modules/esnext.set.is-disjoint-from.js","webpack:///./node_modules/core-js/modules/esnext.set.is-subset-of.js","webpack:///./node_modules/core-js/modules/esnext.set.is-superset-of.js","webpack:///./node_modules/core-js/modules/esnext.set.join.js","webpack:///./node_modules/core-js/modules/esnext.set.map.js","webpack:///./node_modules/core-js/modules/esnext.set.of.js","webpack:///./node_modules/core-js/modules/esnext.set.reduce.js","webpack:///./node_modules/core-js/modules/esnext.set.some.js","webpack:///./node_modules/core-js/modules/esnext.set.symmetric-difference.js","webpack:///./node_modules/core-js/modules/esnext.set.union.js","webpack:///./node_modules/core-js/modules/esnext.string.at.js","webpack:///./node_modules/core-js/modules/esnext.string.match-all.js","webpack:///./node_modules/core-js/modules/esnext.string.replace-all.js","webpack:///./node_modules/core-js/modules/web.dom-collections.iterator.js","webpack:///./node_modules/css-value/index.js","webpack:///./node_modules/es6-promise/dist/es6-promise.js","webpack:///./node_modules/eventemitter3/index.js","webpack:///./node_modules/fecha/lib/fecha.js","webpack:///./node_modules/fingerprintjs2/dist/fingerprint2.min.js","webpack:///./node_modules/geometry-polyfill/geometry-polyfill.js","webpack:///./node_modules/ical-expander/index.js","webpack:///./node_modules/ical.js/build/ical.js","webpack:///./node_modules/javascript-state-machine/lib/state-machine.js","webpack:///./node_modules/js-data-localstorage/dist/js-data-localstorage.js","webpack:///./node_modules/js-data/dist/js-data.js","webpack:///./node_modules/lodash/_DataView.js","webpack:///./node_modules/lodash/_Hash.js","webpack:///./node_modules/lodash/_ListCache.js","webpack:///./node_modules/lodash/_Map.js","webpack:///./node_modules/lodash/_MapCache.js","webpack:///./node_modules/lodash/_Promise.js","webpack:///./node_modules/lodash/_Set.js","webpack:///./node_modules/lodash/_SetCache.js","webpack:///./node_modules/lodash/_Stack.js","webpack:///./node_modules/lodash/_Symbol.js","webpack:///./node_modules/lodash/_Uint8Array.js","webpack:///./node_modules/lodash/_WeakMap.js","webpack:///./node_modules/lodash/_apply.js","webpack:///./node_modules/lodash/_arrayAggregator.js","webpack:///./node_modules/lodash/_arrayFilter.js","webpack:///./node_modules/lodash/_arrayIncludes.js","webpack:///./node_modules/lodash/_arrayIncludesWith.js","webpack:///./node_modules/lodash/_arrayLikeKeys.js","webpack:///./node_modules/lodash/_arrayMap.js","webpack:///./node_modules/lodash/_arrayPush.js","webpack:///./node_modules/lodash/_arrayShuffle.js","webpack:///./node_modules/lodash/_arraySome.js","webpack:///./node_modules/lodash/_assignMergeValue.js","webpack:///./node_modules/lodash/_assignValue.js","webpack:///./node_modules/lodash/_assocIndexOf.js","webpack:///./node_modules/lodash/_baseAggregator.js","webpack:///./node_modules/lodash/_baseAssignValue.js","webpack:///./node_modules/lodash/_baseCreate.js","webpack:///./node_modules/lodash/_baseDifference.js","webpack:///./node_modules/lodash/_baseEach.js","webpack:///./node_modules/lodash/_baseFindIndex.js","webpack:///./node_modules/lodash/_baseFlatten.js","webpack:///./node_modules/lodash/_baseFor.js","webpack:///./node_modules/lodash/_baseForOwn.js","webpack:///./node_modules/lodash/_baseGet.js","webpack:///./node_modules/lodash/_baseGetAllKeys.js","webpack:///./node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/lodash/_baseHas.js","webpack:///./node_modules/lodash/_baseHasIn.js","webpack:///./node_modules/lodash/_baseIndexOf.js","webpack:///./node_modules/lodash/_baseIsArguments.js","webpack:///./node_modules/lodash/_baseIsEqual.js","webpack:///./node_modules/lodash/_baseIsEqualDeep.js","webpack:///./node_modules/lodash/_baseIsMatch.js","webpack:///./node_modules/lodash/_baseIsNaN.js","webpack:///./node_modules/lodash/_baseIsNative.js","webpack:///./node_modules/lodash/_baseIsTypedArray.js","webpack:///./node_modules/lodash/_baseIteratee.js","webpack:///./node_modules/lodash/_baseKeys.js","webpack:///./node_modules/lodash/_baseKeysIn.js","webpack:///./node_modules/lodash/_baseMap.js","webpack:///./node_modules/lodash/_baseMatches.js","webpack:///./node_modules/lodash/_baseMatchesProperty.js","webpack:///./node_modules/lodash/_baseMerge.js","webpack:///./node_modules/lodash/_baseMergeDeep.js","webpack:///./node_modules/lodash/_baseOrderBy.js","webpack:///./node_modules/lodash/_basePick.js","webpack:///./node_modules/lodash/_basePickBy.js","webpack:///./node_modules/lodash/_baseProperty.js","webpack:///./node_modules/lodash/_basePropertyDeep.js","webpack:///./node_modules/lodash/_baseRandom.js","webpack:///./node_modules/lodash/_baseRest.js","webpack:///./node_modules/lodash/_baseSet.js","webpack:///./node_modules/lodash/_baseSetToString.js","webpack:///./node_modules/lodash/_baseShuffle.js","webpack:///./node_modules/lodash/_baseSortBy.js","webpack:///./node_modules/lodash/_baseTimes.js","webpack:///./node_modules/lodash/_baseToPairs.js","webpack:///./node_modules/lodash/_baseToString.js","webpack:///./node_modules/lodash/_baseUnary.js","webpack:///./node_modules/lodash/_baseValues.js","webpack:///./node_modules/lodash/_cacheHas.js","webpack:///./node_modules/lodash/_castPath.js","webpack:///./node_modules/lodash/_cloneArrayBuffer.js","webpack:///./node_modules/lodash/_cloneBuffer.js","webpack:///./node_modules/lodash/_cloneTypedArray.js","webpack:///./node_modules/lodash/_compareAscending.js","webpack:///./node_modules/lodash/_compareMultiple.js","webpack:///./node_modules/lodash/_copyArray.js","webpack:///./node_modules/lodash/_copyObject.js","webpack:///./node_modules/lodash/_coreJsData.js","webpack:///./node_modules/lodash/_createAggregator.js","webpack:///./node_modules/lodash/_createAssigner.js","webpack:///./node_modules/lodash/_createBaseEach.js","webpack:///./node_modules/lodash/_createBaseFor.js","webpack:///./node_modules/lodash/_createToPairs.js","webpack:///./node_modules/lodash/_defineProperty.js","webpack:///./node_modules/lodash/_equalArrays.js","webpack:///./node_modules/lodash/_equalByTag.js","webpack:///./node_modules/lodash/_equalObjects.js","webpack:///./node_modules/lodash/_flatRest.js","webpack:///./node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/lodash/_getAllKeys.js","webpack:///./node_modules/lodash/_getMapData.js","webpack:///./node_modules/lodash/_getMatchData.js","webpack:///./node_modules/lodash/_getNative.js","webpack:///./node_modules/lodash/_getPrototype.js","webpack:///./node_modules/lodash/_getRawTag.js","webpack:///./node_modules/lodash/_getSymbols.js","webpack:///./node_modules/lodash/_getTag.js","webpack:///./node_modules/lodash/_getValue.js","webpack:///./node_modules/lodash/_hasPath.js","webpack:///./node_modules/lodash/_hashClear.js","webpack:///./node_modules/lodash/_hashDelete.js","webpack:///./node_modules/lodash/_hashGet.js","webpack:///./node_modules/lodash/_hashHas.js","webpack:///./node_modules/lodash/_hashSet.js","webpack:///./node_modules/lodash/_initCloneObject.js","webpack:///./node_modules/lodash/_isFlattenable.js","webpack:///./node_modules/lodash/_isIndex.js","webpack:///./node_modules/lodash/_isIterateeCall.js","webpack:///./node_modules/lodash/_isKey.js","webpack:///./node_modules/lodash/_isKeyable.js","webpack:///./node_modules/lodash/_isMasked.js","webpack:///./node_modules/lodash/_isPrototype.js","webpack:///./node_modules/lodash/_isStrictComparable.js","webpack:///./node_modules/lodash/_listCacheClear.js","webpack:///./node_modules/lodash/_listCacheDelete.js","webpack:///./node_modules/lodash/_listCacheGet.js","webpack:///./node_modules/lodash/_listCacheHas.js","webpack:///./node_modules/lodash/_listCacheSet.js","webpack:///./node_modules/lodash/_mapCacheClear.js","webpack:///./node_modules/lodash/_mapCacheDelete.js","webpack:///./node_modules/lodash/_mapCacheGet.js","webpack:///./node_modules/lodash/_mapCacheHas.js","webpack:///./node_modules/lodash/_mapCacheSet.js","webpack:///./node_modules/lodash/_mapToArray.js","webpack:///./node_modules/lodash/_matchesStrictComparable.js","webpack:///./node_modules/lodash/_memoizeCapped.js","webpack:///./node_modules/lodash/_nativeCreate.js","webpack:///./node_modules/lodash/_nativeKeys.js","webpack:///./node_modules/lodash/_nativeKeysIn.js","webpack:///./node_modules/lodash/_nodeUtil.js","webpack:///./node_modules/lodash/_objectToString.js","webpack:///./node_modules/lodash/_overArg.js","webpack:///./node_modules/lodash/_overRest.js","webpack:///./node_modules/lodash/_root.js","webpack:///./node_modules/lodash/_safeGet.js","webpack:///./node_modules/lodash/_setCacheAdd.js","webpack:///./node_modules/lodash/_setCacheHas.js","webpack:///./node_modules/lodash/_setToArray.js","webpack:///./node_modules/lodash/_setToPairs.js","webpack:///./node_modules/lodash/_setToString.js","webpack:///./node_modules/lodash/_shortOut.js","webpack:///./node_modules/lodash/_shuffleSelf.js","webpack:///./node_modules/lodash/_stackClear.js","webpack:///./node_modules/lodash/_stackDelete.js","webpack:///./node_modules/lodash/_stackGet.js","webpack:///./node_modules/lodash/_stackHas.js","webpack:///./node_modules/lodash/_stackSet.js","webpack:///./node_modules/lodash/_strictIndexOf.js","webpack:///./node_modules/lodash/_stringToPath.js","webpack:///./node_modules/lodash/_toKey.js","webpack:///./node_modules/lodash/_toSource.js","webpack:///./node_modules/lodash/constant.js","webpack:///./node_modules/lodash/differenceBy.js","webpack:///./node_modules/lodash/eq.js","webpack:///./node_modules/lodash/flatten.js","webpack:///./node_modules/lodash/get.js","webpack:///./node_modules/lodash/groupBy.js","webpack:///./node_modules/lodash/has.js","webpack:///./node_modules/lodash/hasIn.js","webpack:///./node_modules/lodash/identity.js","webpack:///./node_modules/lodash/isArguments.js","webpack:///./node_modules/lodash/isArray.js","webpack:///./node_modules/lodash/isArrayLike.js","webpack:///./node_modules/lodash/isArrayLikeObject.js","webpack:///./node_modules/lodash/isBoolean.js","webpack:///./node_modules/lodash/isBuffer.js","webpack:///./node_modules/lodash/isEmpty.js","webpack:///./node_modules/lodash/isEqual.js","webpack:///./node_modules/lodash/isError.js","webpack:///./node_modules/lodash/isFunction.js","webpack:///./node_modules/lodash/isLength.js","webpack:///./node_modules/lodash/isNil.js","webpack:///./node_modules/lodash/isNull.js","webpack:///./node_modules/lodash/isNumber.js","webpack:///./node_modules/lodash/isObject.js","webpack:///./node_modules/lodash/isObjectLike.js","webpack:///./node_modules/lodash/isPlainObject.js","webpack:///./node_modules/lodash/isString.js","webpack:///./node_modules/lodash/isSymbol.js","webpack:///./node_modules/lodash/isTypedArray.js","webpack:///./node_modules/lodash/isUndefined.js","webpack:///./node_modules/lodash/keys.js","webpack:///./node_modules/lodash/keysIn.js","webpack:///./node_modules/lodash/last.js","webpack:///./node_modules/lodash/memoize.js","webpack:///./node_modules/lodash/merge.js","webpack:///./node_modules/lodash/noop.js","webpack:///./node_modules/lodash/pick.js","webpack:///./node_modules/lodash/property.js","webpack:///./node_modules/lodash/shuffle.js","webpack:///./node_modules/lodash/sortBy.js","webpack:///./node_modules/lodash/stubArray.js","webpack:///./node_modules/lodash/stubFalse.js","webpack:///./node_modules/lodash/toPairsIn.js","webpack:///./node_modules/lodash/toPlainObject.js","webpack:///./node_modules/lodash/toString.js","webpack:///./node_modules/lodash/values.js","webpack:///./node_modules/medium-type/index.js","webpack:///./node_modules/nanoid/non-secure/index.js","webpack:///./node_modules/object-hash/dist/object_hash.js","webpack:///./node_modules/path-browserify/index.js","webpack:///./node_modules/penpal/lib/connectCallReceiver.js","webpack:///./node_modules/penpal/lib/connectCallSender.js","webpack:///./node_modules/penpal/lib/connectToChild.js","webpack:///./node_modules/penpal/lib/constants.js","webpack:///./node_modules/penpal/lib/createDestructor.js","webpack:///./node_modules/penpal/lib/createLogger.js","webpack:///./node_modules/penpal/lib/errorCodes.js","webpack:///./node_modules/penpal/lib/errorSerialization.js","webpack:///./node_modules/penpal/lib/generateId.js","webpack:///./node_modules/penpal/lib/getOriginFromSrc.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/qrious/dist/qrious.js","webpack:///./node_modules/semver/semver.js","webpack:///./node_modules/setimmediate/setImmediate.js","webpack:///./node_modules/timers-browserify/main.js","webpack:///./node_modules/tslib/tslib.es6.js","webpack:///./node_modules/urijs/src/IPv6.js","webpack:///./node_modules/urijs/src/SecondLevelDomains.js","webpack:///./node_modules/urijs/src/URI.fragmentQuery.js","webpack:///./node_modules/urijs/src/URI.js","webpack:///./node_modules/urijs/src/punycode.js","webpack:///./node_modules/vee-validate/dist/vee-validate.js","webpack:///./node_modules/vue/dist/vue.esm.js","webpack:///(webpack)/buildin/amd-options.js","webpack:///(webpack)/buildin/global.js","webpack:///(webpack)/buildin/harmony-module.js","webpack:///(webpack)/buildin/module.js","webpack:///./src/adapter/web/virtual-keyboard/virtual-keyboard-manager.js","webpack:///./src/adapter/webos-signage-3.0/ds-binary-adapter/ds-binary-adapter.js","webpack:///./src/config.js","webpack:///./src/core/analytics/analytics-counter-resource.js","webpack:///./src/core/analytics/analytics-group-resource.js","webpack:///./src/core/analytics/cycle/analytics-cycle.js","webpack:///./src/core/analytics/tracker/analytics-tracker.js","webpack:///./src/core/analytics/transport/analytics-transport.js","webpack:///./src/core/asset/asset-resource.js","webpack:///./src/core/autoreboot/autoreboot-communicator.js","webpack:///./src/core/autoreboot/autoreboot-manager.js","webpack:///./src/core/autoreboot/autoreboot-replacer.js","webpack:///./src/core/cleaner/cleaner.js","webpack:///./src/core/clock/clock-root.html","webpack:///./src/core/clock/clock-root.js","webpack:///./src/core/command-enum.js","webpack:///./src/core/communicator/analytics/communicator-analytics.js","webpack:///./src/core/communicator/command/communicator-command.js","webpack:///./src/core/communicator/communicator.js","webpack:///./src/core/communicator/control/communicator-control.js","webpack:///./src/core/communicator/firmware/communicator-firmware.js","webpack:///./src/core/communicator/format/communicator-format.js","webpack:///./src/core/communicator/heartbeat/communicator-heartbeat.js","webpack:///./src/core/communicator/layer/communicator-layer.js","webpack:///./src/core/communicator/layout/communicator-layout.js","webpack:///./src/core/communicator/manifest/communicator-manifest.js","webpack:///./src/core/communicator/medium/communicator-medium.js","webpack:///./src/core/communicator/number/communicator-number.js","webpack:///./src/core/communicator/orientation/communicator-orientation.js","webpack:///./src/core/communicator/queue/communicator-queue.js","webpack:///./src/core/communicator/report/communicator-report.js","webpack:///./src/core/communicator/schedule/communicator-schedule.js","webpack:///./src/core/communicator/session/communicator-session.js","webpack:///./src/core/communicator/settings/communicator-settings-factory.js","webpack:///./src/core/communicator/settings/communicator-settings.js","webpack:///./src/core/communicator/stretch/communicator-stretch.js","webpack:///./src/core/communicator/target/communicator-target.js","webpack:///./src/core/communicator/task/communicator-task.js","webpack:///./src/core/communicator/timer/communicator-timer.js","webpack:///./src/core/communicator/update/communicator-update.js","webpack:///./src/core/communicator/utility/communicator-utility.js","webpack:///./src/core/console/console-logger-factory.js","webpack:///./src/core/console/console-logger.js","webpack:///./src/core/content/content-communicator.js","webpack:///./src/core/control/control-button.js","webpack:///./src/core/cordova/cordova-archiver.js","webpack:///./src/core/cordova/cordova-resolver.js","webpack:///./src/core/cordova/cordova-unit-resource.js","webpack:///./src/core/cordova/cordova-unit.js","webpack:///./src/core/countdown/countdown-root.html","webpack:///./src/core/countdown/countdown-root.js","webpack:///./src/core/detector/detector.js","webpack:///./src/core/dhtmlx/date/dhtmlx-date-parser.js","webpack:///./src/core/dhtmlx/dhtmlx-rec-frequency.js","webpack:///./src/core/dhtmlx/to-ical/dhtmlx-to-ical-event-factory.js","webpack:///./src/core/dhtmlx/to-ical/dhtmlx-to-ical-event.js","webpack:///./src/core/dhtmlx/to-ical/dhtmlx-to-ical-exporter.js","webpack:///./src/core/dhtmlx/to-ical/dhtmlx-to-ical-rec-type-factory.js","webpack:///./src/core/dhtmlx/to-ical/dhtmlx-to-ical-rec-type.js","webpack:///./src/core/div/div-viewer-source-creator.js","webpack:///./src/core/div/div-viewer-source-factory.js","webpack:///./src/core/div/div-viewer-source.js","webpack:///./src/core/downloader/downloader.js","webpack:///./src/core/drive/drive-enum.js","webpack:///./src/core/drive/drive-util.js","webpack:///./src/core/env-enum.js","webpack:///./src/core/env-util.js","webpack:///./src/core/error/error-level-factory.js","webpack:///./src/core/error/error-level.js","webpack:///./src/core/error/error-name.js","webpack:///./src/core/exception/exception-resource.js","webpack:///./src/core/file/system/file-system-path-factory.js","webpack:///./src/core/file/system/file-system-path.js","webpack:///./src/core/file/system/file-system-purpose.js","webpack:///./src/core/file/transfer/file-transfer-connection.js","webpack:///./src/core/file/transfer/file-transfer-request.js","webpack:///./src/core/file/transfer/file-transfer-response.js","webpack:///./src/core/fingerprint/fingerprint-browser.js","webpack:///./src/core/fingerprint/fingerprint-fallback.js","webpack:///./src/core/fingerprint/fingerprint-hardware.js","webpack:///./src/core/fingerprint/fingerprint-hasher.js","webpack:///./src/core/focus/focus-directive.js","webpack:///./src/core/focus/focus-navigator.js","webpack:///./src/core/focus/focus-noop.js","webpack:///./src/core/format-enum.js","webpack:///./src/core/html/html-element-repairer.js","webpack:///./src/core/html/html-iframe-preflighter-file.js","webpack:///./src/core/html/html-iframe-preflighter-http.js","webpack:///./src/core/html/html-iframe-preflighter-noop.js","webpack:///./src/core/html/html-iframe-preflighter-registry.js","webpack:///./src/core/html/html-image-blank.png","webpack:///./src/core/html/html-media-util.js","webpack:///./src/core/html/html-video-blank.mp4","webpack:///./src/core/html/html-video-repairer.js","webpack:///./src/core/ical/ical-freq.js","webpack:///./src/core/ical/ical-planner.js","webpack:///./src/core/ical/ical-util.js","webpack:///./src/core/ical/ical-weekday.js","webpack:///./src/core/id/id-generator.js","webpack:///./src/core/image/image-file-viewer-type.js","webpack:///./src/core/image/image-viewer-controller-factory.js","webpack:///./src/core/image/image-viewer-controller.js","webpack:///./src/core/kiosk/kiosk-viewer-type.js","webpack:///./src/core/kiwi-lighter-1/app/kiwi-lighter-1-app-manager.js","webpack:///./src/core/kiwi-lighter-1/boot/kiwi-lighter-1-boot-manager.js","webpack:///./src/core/kiwi-lighter-1/config.xml","webpack:///./src/core/kiwi-lighter-1/control/kiwi-lighter-1-control-listener.js","webpack:///./src/core/kiwi-lighter-1/control/kiwi-lighter-1-control-manager.js","webpack:///./src/core/kiwi-lighter-1/control/kiwi-lighter-1-control-parser.js","webpack:///./src/core/kiwi-lighter-1/drive/kiwi-lighter-1-drive-manager.js","webpack:///./src/core/kiwi-lighter-1/file/archive/kiwi-lighter-1-file-archive-manager.js","webpack:///./src/core/kiwi-lighter-1/file/archive/kiwi-lighter-1-file-archive-volume-factory.js","webpack:///./src/core/kiwi-lighter-1/file/archive/kiwi-lighter-1-file-archive-volume.js","webpack:///./src/core/kiwi-lighter-1/file/system/kiwi-lighter-1-file-system-directory.js","webpack:///./src/core/kiwi-lighter-1/file/system/kiwi-lighter-1-file-system-entry-factory.js","webpack:///./src/core/kiwi-lighter-1/file/system/kiwi-lighter-1-file-system-file.js","webpack:///./src/core/kiwi-lighter-1/file/system/kiwi-lighter-1-file-system-manager.js","webpack:///./src/core/kiwi-lighter-1/file/system/kiwi-lighter-1-file-system-mapper.js","webpack:///./src/core/kiwi-lighter-1/file/system/kiwi-lighter-1-file-system-unit-factory.js","webpack:///./src/core/kiwi-lighter-1/file/system/kiwi-lighter-1-file-system-unit.js","webpack:///./src/core/kiwi-lighter-1/file/transfer/kiwi-lighter-1-file-transfer-download-factory.js","webpack:///./src/core/kiwi-lighter-1/file/transfer/kiwi-lighter-1-file-transfer-download.js","webpack:///./src/core/kiwi-lighter-1/file/transfer/kiwi-lighter-1-file-transfer-manager.js","webpack:///./src/core/kiwi-lighter-1/firmware/kiwi-lighter-1-firmware-manager.js","webpack:///./src/core/kiwi-lighter-1/kiwi-lighter-1-main.js","webpack:///./src/core/kiwi-lighter-1/kiwi-lighter-1-main.less","webpack:///./src/core/kiwi-lighter-1/memory/kiwi-lighter-1-memory-manager.js","webpack:///./src/core/kiwi-lighter-1/network/kiwi-lighter-1-network-manager.js","webpack:///./src/core/kiwi-lighter-1/orientation/kiwi-lighter-1-orientation-mapper.js","webpack:///./src/core/kiwi-lighter-1/power/kiwi-lighter-1-power-manager.js","webpack:///./src/core/kiwi-lighter-1/promisify/kiwi-lighter-1-promisify-file.js","webpack:///./src/core/kiwi-lighter-1/promisify/kiwi-lighter-1-promisify-lighter.js","webpack:///./src/core/kiwi-lighter-1/screen/kiwi-lighter-1-screen-manager.js","webpack:///./src/core/kiwi-lighter-1/sensor/kiwi-lighter-1-sensor-manager.js","webpack:///./src/core/kiwi-lighter-1/sound/kiwi-lighter-1-sound-manager.js","webpack:///./src/core/kiwi-lighter-1/startup/kiwi-lighter-1-startup-manager.js","webpack:///./src/core/kiwi-lighter-1/time/kiwi-lighter-1-time-manager.js","webpack:///./src/core/kiwi-lighter-1/video/kiwi-lighter-1-video-viewer-controller-factory.js","webpack:///./src/core/kiwi-lighter-1/video/kiwi-lighter-1-video-viewer-controller.js","webpack:///./src/core/kiwi-lighter-1/video/kiwi-lighter-1-video-viewer-type.js","webpack:///./src/core/kiwi-lighter-1/viewer/kiwi-lighter-1-viewer-registry.js","webpack:///./src/core/kiwi-lighter-1/widget/kiwi-lighter-1-widget-viewer-type.js","webpack:///./src/core/kiwi-lighter-api/kiwi-lighter-api-control-button.js","webpack:///./src/core/kiwi-lighter-api/kiwi-lighter-api-drive-type.js","webpack:///./src/core/kiwi-lighter-api/kiwi-lighter-api-network-type-factory.js","webpack:///./src/core/kiwi-lighter-api/kiwi-lighter-api-network-type.js","webpack:///./src/core/kiwi-lighter-api/kiwi-lighter-api-orientation.js","webpack:///./src/core/kiwi-lighter-api/kiwi-lighter-api-power-command.js","webpack:///./src/core/layer/layer-resource.js","webpack:///./src/core/layout/layout-resource.js","webpack:///./src/core/loader/loader-container.html","webpack:///./src/core/loader/loader-container.js","webpack:///./src/core/loader/loader-root.html","webpack:///./src/core/loader/loader-root.js","webpack:///./src/core/logger/logger-factory.js","webpack:///./src/core/logger/logger-manager.js","webpack:///./src/core/long-timers/long-timers.js","webpack:///./src/core/medium/medium-registry.js","webpack:///./src/core/medium/medium-resource.js","webpack:///./src/core/medium/medium-type.js","webpack:///./src/core/memory/memory-info.js","webpack:///./src/core/network/network-connection-factory.js","webpack:///./src/core/network/network-connection.js","webpack:///./src/core/network/network-type.js","webpack:///./src/core/numeric/numeric.js","webpack:///./src/core/organization/organization-helper.js","webpack:///./src/core/orientation/orientation-enum.js","webpack:///./src/core/pdf/pdf-file-viewer-type.js","webpack:///./src/core/pdf/pdf-parent-factory.js","webpack:///./src/core/pdf/pdf-parent.js","webpack:///./src/core/pdf/pdf-recycler.js","webpack:///./src/core/pdf/pdf-viewer-controller-factory.js","webpack:///./src/core/pdf/pdf-viewer-controller.js","webpack:///./src/core/pdf/pdf-viewer-source-creator.js","webpack:///./src/core/pdf/pdf-viewer-source-factory.js","webpack:///./src/core/pdf/pdf-viewer-source.js","webpack:///./src/core/playlist/playlist-communicator.js","webpack:///./src/core/playlist/playlist-resource.js","webpack:///./src/core/pool/pool-async-factory.js","webpack:///./src/core/pool/pool-async.js","webpack:///./src/core/pool/pool-factory.js","webpack:///./src/core/pool/pool.js","webpack:///./src/core/position/position-frame-factory.js","webpack:///./src/core/position/position-frame.js","webpack:///./src/core/promisify/promisify.js","webpack:///./src/core/queue/queue-factory.js","webpack:///./src/core/queue/queue.js","webpack:///./src/core/replacer/common/replacer-common.js","webpack:///./src/core/replacer/control/replacer-control.js","webpack:///./src/core/replacer/power/replacer-power.js","webpack:///./src/core/replacer/replacer.js","webpack:///./src/core/replacer/screen/replacer-screen.js","webpack:///./src/core/replacer/session/replacer-session.js","webpack:///./src/core/replacer/sound/replacer-sound.js","webpack:///./src/core/report/report-manager.js","webpack:///./src/core/schedule/schedule-background.js","webpack:///./src/core/schedule/schedule-empty.js","webpack:///./src/core/schedule/schedule-enum.js","webpack:///./src/core/schedule/schedule-info.js","webpack:///./src/core/schedule/schedule-layer.js","webpack:///./src/core/schedule/schedule-layout.js","webpack:///./src/core/schedule/schedule-linear.js","webpack:///./src/core/schedule/schedule-manager.js","webpack:///./src/core/schedule/schedule-medium.js","webpack:///./src/core/schedule/schedule-orphan.js","webpack:///./src/core/schedule/schedule-player.js","webpack:///./src/core/schedule/schedule-playlist.js","webpack:///./src/core/schedule/schedule-random.js","webpack:///./src/core/schedule/schedule-static.js","webpack:///./src/core/schedule/schedule-track.js","webpack:///./src/core/sentry/sentry-logger-factory.js","webpack:///./src/core/sentry/sentry-logger.js","webpack:///./src/core/sentry/sentry-offline-integration.js","webpack:///./src/core/sentry/sentry-severity-factory.js","webpack:///./src/core/sentry/sentry-severity.js","webpack:///./src/core/session/session-resource.js","webpack:///./src/core/setup/setup-error-factory.js","webpack:///./src/core/setup/setup-error-type.js","webpack:///./src/core/setup/setup-error.js","webpack:///./src/core/setup/setup-failure.html","webpack:///./src/core/setup/setup-failure.js","webpack:///./src/core/setup/setup-header.html","webpack:///./src/core/setup/setup-header.js","webpack:///./src/core/setup/setup-logo.svg","webpack:///./src/core/setup/setup-manager.js","webpack:///./src/core/setup/setup-manual.html","webpack:///./src/core/setup/setup-manual.js","webpack:///./src/core/setup/setup-organization.html","webpack:///./src/core/setup/setup-organization.js","webpack:///./src/core/setup/setup-panel-left.html","webpack:///./src/core/setup/setup-panel-left.js","webpack:///./src/core/setup/setup-panel-right.html","webpack:///./src/core/setup/setup-panel-right.js","webpack:///./src/core/setup/setup-qr.html","webpack:///./src/core/setup/setup-qr.js","webpack:///./src/core/setup/setup-root.html","webpack:///./src/core/setup/setup-root.js","webpack:///./src/core/setup/setup-settings.html","webpack:///./src/core/setup/setup-settings.js","webpack:///./src/core/setup/setup-success.html","webpack:///./src/core/setup/setup-success.js","webpack:///./src/core/state-machine/state-machine-factory.js","webpack:///./src/core/state-machine/state-machine.js","webpack:///./src/core/store/store.js","webpack:///./src/core/stream/stream-viewer-type.js","webpack:///./src/core/stretch/stretch-enum.js","webpack:///./src/core/stretch/stretch-native.js","webpack:///./src/core/target-enum.js","webpack:///./src/core/task/task-enum.js","webpack:///./src/core/task/task-resource.js","webpack:///./src/core/timer/timer-resource.js","webpack:///./src/core/track/track-communicator.js","webpack:///./src/core/track/track-plan-communicator.js","webpack:///./src/core/track/track-resource.js","webpack:///./src/core/update/update-platform-util.js","webpack:///./src/core/update/update-platform.js","webpack:///./src/core/updater/updater.js","webpack:///./src/core/viewer/controller/viewer-controller-iframe.js","webpack:///./src/core/viewer/delayer/viewer-delayer-factory.js","webpack:///./src/core/viewer/delayer/viewer-delayer.js","webpack:///./src/core/viewer/director/viewer-director-factory.js","webpack:///./src/core/viewer/director/viewer-director-resource.js","webpack:///./src/core/viewer/director/viewer-director.js","webpack:///./src/core/viewer/life-cycle/viewer-life-cycle-factory.js","webpack:///./src/core/viewer/life-cycle/viewer-life-cycle.js","webpack:///./src/core/viewer/root/viewer-root.html","webpack:///./src/core/viewer/root/viewer-root.js","webpack:///./src/core/viewer/slide/viewer-slide-factory.js","webpack:///./src/core/viewer/slide/viewer-slide.js","webpack:///./src/core/viewer/source/viewer-source-iframe-creator.js","webpack:///./src/core/viewer/source/viewer-source-iframe-factory.js","webpack:///./src/core/viewer/source/viewer-source-iframe.js","webpack:///./src/core/viewer/source/viewer-source-video-creator.js","webpack:///./src/core/viewer/source/viewer-source-video-factory.js","webpack:///./src/core/viewer/source/viewer-source-video.js","webpack:///./src/core/viewer/thread/viewer-thread-factory.js","webpack:///./src/core/viewer/thread/viewer-thread.js","webpack:///./src/core/viewer/type/viewer-type-web.js","webpack:///./src/core/virtual-keyboard/virtual-keyboard-hidden-factory.js","webpack:///./src/core/virtual-keyboard/virtual-keyboard-hidden.js","webpack:///./src/core/vue/vue-factory.js","webpack:///./src/core/web/web-network-listener.js","webpack:///./src/core/xhr/xhr-fetcher.js","webpack:///./src/device/device.js","webpack:///./src/node_modules/generic-pool-browser/dist/index.js","webpack:///./src/node_modules/whatwg-fetch/fetch.js","webpack:///./src/platform/platform-util.js","webpack:///./src/platform/platform.js","webpack:///./src/player/player-root.html","webpack:///./src/player/player-root.js","webpack:///./src/player/player.js","webpack:///./src/polyfill.js"],"names":["DOMPoint","x","y","z","w","matrix","is2D","SVGMatrix","a","c","e","b","d","f","m11","m21","m31","m41","m12","m22","m32","m42","m13","m23","m33","m43","m14","m24","m34","m44","otherPoint","undefined","window","DOMRect","width","height","otherRect","M11","M12","M13","M14","M21","M22","M23","M24","M31","M32","M33","M34","M41","M42","M43","M44","A","B","C","D","E","F","DEGREE_PER_RAD","Math","PI","RAD_PER_DEGREE","$values","Symbol","$is2D","parseMatrix","init","parsed","replace","split","length","Error","map","parseFloat","parseMatrix3d","parseTransform","tform","type","setNumber2D","receiver","index","value","TypeError","setNumber3D","newInstance","values","instance","Object","create","DOMMatrix","prototype","constructor","multiply","first","second","dest","Float64Array","i","j","sum","k","Float32Array","tforms","depth","options","isIdentity","other","multiplySelf","tx","ty","tz","translateSelf","scaleX","scaleY","scaleZ","originX","originY","originZ","scaleSelf","scale","scale3dSelf","rotateFromVectorSelf","theta","atan2","rotateSelf","rotX","rotY","rotZ","cos","s","sin","angle","rotateAxisAngleSelf","sqrt","t","sx","skewXSelf","tan","sy","skewYSelf","invertSelf","det","result","NaN","transformList","temp","point","nx","ny","nz","nw","from","slice","join","ICAL","timezones","IcalExpander","opts","maxIterations","skipInvalidDates","jCalData","parse","ics","component","Component","events","getAllSubcomponents","vevent","Event","filter","evt","startDate","toJSDate","endDate","err","after","before","isEventWithinRange","startTime","endTime","getTime","getTimes","eventOrOccurrence","isDate","exceptions","forEach","event","isRecurrenceException","push","ret","occurrences","exdates","getAllProperties","exdateProp","exdate","getFirstValue","isRecurring","iterator","next","occurrence","getOccurrenceDetails","isOccurrenceExcluded","indexOf","exception","find","ex","uid","recurrenceId","between","registerTimezones","keys","key","icsData","comp","vtimezone","getFirstSubcomponent","TimezoneService","register","Timezone","module","exports","urlAlphabet","customAlphabet","alphabet","size","id","random","nanoid","defineProperty","default","_constants","_errorSerialization","_default","info","methods","log","localName","local","remote","originForSending","originForReceiving","destroyed","handleMessageEvent","source","data","penpal","CALL","origin","_event$data","methodName","args","createPromiseHandler","resolution","returnValue","message","REPLY","REJECTED","serializeError","returnValueIsError","postMessage","name","DATA_CLONE_ERROR","Promise","resolve","apply","then","FULFILLED","addEventListener","MESSAGE","removeEventListener","_errorCodes","_generateId","_interopRequireDefault","obj","__esModule","callSender","methodNames","destroyConnection","createMethodProxy","_len","arguments","Array","_key","iframeRemoved","closed","error","code","ERR_CONNECTION_DESTROYED","reject","deserializeError","reduce","api","_createDestructor2","_getOriginFromSrc","_createLogger","_connectCallReceiver","_connectCallSender","CHECK_IFRAME_IN_DOC_INTERVAL","_ref","iframe","_ref$methods","childOrigin","timeout","debug","parent","_createDestructor","destroy","onDestroy","src","srcdoc","ERR_NO_IFRAME_SRC","promise","resolveConnectionPromise","connectionTimeoutId","setTimeout","ERR_CONNECTION_TIMEOUT","receiverMethodNames","destroyCallReceiver","handleMessage","child","contentWindow","HANDSHAKE","HANDSHAKE_REPLY","receiverMethodName","destroyCallSender","clearTimeout","checkIframeInDocIntervalId","setInterval","document","contains","clearInterval","callbacks","callback","console","ERR_NOT_IN_IFRAME","stack","deserializedError","DEFAULT_PORTS","URL_REGEX","opaqueOriginSchemes","scheme","startsWith","location","regexResult","exec","protocol","hostname","port","portSuffix","VirtualKeyboardManager","factory","DsBinaryAdapter","fileArchiveManager","fileSystemPathFactory","fileSystemManager","fileSystemMapper","fileTransferManager","defaultOptions","checksumAttribute","extract","fileAttribute","localhostAttribute","temporaryExtension","remoteAttribute","instanceOptions","resource","validateCommon","listFile","fileArray","failedFileArray","file","injectable","accumulator","entry","remove","recursive","catch","failedString","getPath","attrs","validateAttrs","workspacePath","getWorkspacePath","getOption","remoteUrl","remoteUri","remoteFilename","filename","validateFilename","remoteExtension","parseExtension","getId","targetFilePath","fromInfo","stem","extension","targetPath","temporaryFilePath","temporaryPath","hasDirectory","workspaceExists","hasTarget","targetExists","createTarget","createDirectory","generateAttrs","request","connection","download","getResponse","response","isOk","RangeError","getStatus","temporaryFile","getFile","getVolume","volume","move","validateId","entryArray","params","validateParams","listedFileArray","attrsArray","acc","path","getFileUrl","fileUrl","getLocalhostUrl","localhostUrl","idAttribute","checksum","url","hasFile","toFileUrl","hasLocalhost","toLocalhostUrl","instanceValue","defaultValue","endpoint","basePath","fromValue","exists","getDirectory","directory","list","parseFile","fileInfo","duplicatedFileInfo","anotherFile","anotherIndex","temporary","getName","filenameInfo","parseFilename","temporarySuffix","endsWith","basename","extensionSuffix","lastIndexOf","autorebootDefaultDisabled","autorebootDefaultInterval","autorebootMinInterval","cordovaBootDelay","device","downloader","defaultSize","communicator","syncDelayBase","orientation","defaultOrientationEnum","CLOCKWISE_0","session","defaultId","fileSystemLocalhostPort","firmware","htmlIframeLoadDelay","icalPlannerMaxIterations","kiwiLighterApiVersion","longTimersMaxDelay","pow","pdfConnectionTimeout","pdfPageRate","pdfSourceMax","platform","tizenSssp4","booterClockLimit","Date","booterRetryDelay","clockSyncInterval","sentryCaptureErrorLevel","sentryMaxEvents","setup","automaticDelay","deviceName","failureDelayBase","failureDelayMax","failureDelayMultiplier","password","serverUrl","successDelay","username","streamDefaultContainer","timerMax","viewer","errorDelay","errorLimit","loadLimit","relations","belongsTo","analyticsGroup","localField","localKey","medium","AnalyticsCycle","store","analyticsPeriod","emitter","onError","bind","onTimeout","update","toISOString","off","on","emit","restartIteration","opened","isStarted","cancelTimeout","oldAnalyticsGroup","closeGroup","openGroup","newAnalyticsGroup","startTimeout","Number","isFinite","AnalyticsTracker","queueFactory","analyticsCycle","analyticsTransport","queue","onCycleEnded","onTransportSuccess","analyticsCounter","played","scheduleInfo","enqueue","hasMedium","analyticsGroupId","getMedium","mediumId","analyticsCounterArray","openCounter","incrementCounter","send","deviceId","destroyMany","restart","stop","start","findAll","analyticsGroupArray","sortBy","AnalyticsTransport","fromEntries","entries","count","mimetype","end","media","generateCounter","fetch","body","JSON","stringify","generateGroup","headers","method","level","Warning","ok","status","defaultAdapter","AutorebootCommunicator","settings","get","hours","parseNumber","parseBoolean","AutorebootManager","logger","minInterval","powerManager","timers","interval","reboot","safeDelay","max","AutorebootReplacer","defaultDisabled","defaultInterval","manager","disabled","contentInfo","isDisabled","autorebootDisabled","getInterval","autorebootInterval","currentInterval","Cleaner","primaryStore","mediumArrayByAssetId","assetId","contentMediumIdArray","mediumArray","cleanerGroupArray","asset","cleanerGroup","some","includes","firmwareRelease","layerArray","layoutArray","playlistArray","taskArray","timerArray","trackArray","cleanerInfo","updateAcc","assetArray","template","created","refresh","delay","now","String","getHours","minutes","getMinutes","padStart","props","required","POWER_OFF","POWER_ON","REBOOT","REPORT","CommunicatorAnalytics","json","frequency","CommunicatorCommand","Communicator","contentCommunicator","CommunicatorManifest","communicatorHeartbeat","communicatorQueue","communicatorReport","communicatorUpdate","connected","latestTimestamp","syncInterval","contentTimestamp","onSyncInterval","fetchHeartbeat","queueIdArray","queueId","heartbeatTimestamp","isBefore","receivedTimestamp","heartbeat","reportInfo","formatEnum","updatePlatform","urlArray","version","communicatorManifest","manifestData","buildArray","build","buildId","newTimestamp","oldTimestamp","newDate","isNaN","oldDate","CommunicatorControl","power","parseLock","lockedString","powerString","lockedBoolean","powerBoolean","locked","parseLocked","parseExceptions","CommunicatorFirmware","config","communicatorSettings","firmwareInfo","manufacturer","modelName","parseString","releaseVersion","CommunicatorFormat","HTML","IPK","WGT","ZIP","CommunicatorHeartbeat","fetching","finally","parseDate","parseQueue","CommunicatorLayer","parentLayoutId","inject","parsePercentage","generateId","left","posX","parseReference","ref","playlistId","top","posY","zIndex","posZ","number","fromString","CommunicatorLayout","communicatorLayer","backgroundColor","bgColor","bgImage","playDuration","parseTime","items","item","builds","parseBuild","absoluteTo","toString","CommunicatorMedium","jsonArray","emptyMap","parseMany","parseOne","md5","parseParams","playLength","timeLength","stretchEnum","stretching","parseVolume","decodeURIComponent","model","parseModel","CommunicatorNumber","trimmed","trim","match","CommunicatorOrientation","CLOCKWISE_90","CLOCKWISE_180","CLOCKWISE_270","CommunicatorQueue","CommunicatorReport","filterReport","generateReport","mapped","driveInfo","driveUnitArray","driveUnit","driveEnum","EXTERNAL","total","used","totalInternal","usedInternal","localControlLock","remoteControlLock","generateExternalDrives","generateInternalDrive","bootTimestamp","brightness","controlLocalExceptionsPower","isControlPower","controlLocalLocked","isControlLocked","controlRemoteExceptionsPower","controlRemoteLocked","firmwareVersion","image","localTimestamp","nowTimestamp","muted","generate","orientationEnum","runtimePlatform","serialNumber","temperature","timezone","totalRam","updateUrl","usedRam","wiredIpAddress","wiredMacAddress","wirelessIpAddress","wirelessMacAddress","controlLock","CommunicatorSchedule","DYNAMIC","STATIC","RANDOM","CommunicatorSession","communicatorAutoreboot","communicatorControl","mainJson","deviceJson","visualJson","getTnterval","parseLocalLock","parseRemoteLock","CommunicatorSettingsFactory","CommunicatorSettings","CommunicatorStretch","FILL","CONTAIN","COVER","CommunicatorTarget","PRIMARY","CommunicatorTask","CONTENT","POWER","task","timer","layoutId","priority","fromNumber","targetEnum","target","taskEnum","parseEnum","daysOfWeek","taskModel","taskMap","offTimerMap","startTimes","onTimerMap","endTimes","CommunicatorTimer","taskId","commandEnum","day","binaryWeek","flagCount","flagPosition","flagValue","Boolean","binaryWeekString","binaryWeekNumber","jsonString","clock","parseClock","hour","minute","parseDay","includesDay","CommunicatorUpdate","urls","CommunicatorUtility","inputString","resultArray","inputArray","reverse","array","overflow","inputNumber","carry","date","initial","round","ConsoleLoggerFactory","ConsoleLogger","errorLevelFactory","methodLevel","valueLevel","Debug","Info","Log","warn","capture","loggerInfo","ContentCommunicator","communicatorSession","communicatorSettingsFactory","firmwareManager","playlistCommunicator","communicatorFirmware","communicatorLayout","requiredTimestamp","compareRequired","getInfo","compareReceived","contentTaskDsMap","mediumDsMap","playlistDsMap","powerTaskDsMap","layoutArrayJson","layoutJson","layout","parseLayers","playlist","track","receivedDate","receivedValid","latestDate","latestValid","requiredDate","requiredValid","ControlButton","ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Back","Enter","CordovaArchiver","zip","zipUrl","toUrl","unzip","CordovaResolver","localFileSystem","promisify","getEntry","isDirectory","isFile","NotFoundError","CordovaUnitResource","CordovaUnit","cordovaLayout","unitArray","Install","Temp","Data","foundUnit","unit","hasUrl","cordovaUnit","cordovaName","purpose","remaining","getDelay","onEnd","endTimeout","tickInterval","onTick","$emit","mounted","Detector","driveManager","free","DhtmlxDateParser","fecha","mappings","dhtmlx","string","format","mappedFormat","mapping","jsDate","DhtmlRecFrequency","Day","Week","Month","Year","DhtmlxToIcalEventFactory","DhtmlxToIcalEvent","dateParser","dateFormat","end_date","Time","fromJSDate","event_length","event_pid","rec_type","start_date","text","DhtmlxToIcalExporter","eventFactory","recTypeFactory","util","dhtmlxEvents","nowDate","dhtmlxToIcalEvents","dhtmlxEvent","eventGroups","dhtmlxToIcalEvent","getParentId","parentEvents","nowIcalDate","vcalendar","createVCalendar","prodid","subcomponents","childEvents","vevents","parseEvents","parentEvent","getRecType","parseOneTimeEvent","eventsGroup","childEvent","excludedEvents","none","updatedEvents","parseRecurringEvent","updatedEvent","parseExceptionEvent","createVEvent","getEndDate","recurrenceDate","fromUnixTime","getLength","stamp","getStartDate","summary","getText","endUnixTime","toUnixTime","recType","recurStartDate","recur","getRecur","firstStartDate","parseRecurringStartDate","parseRecurringEndDate","excludedDates","firstDate","DhtmlxToIcalRecTypeFactory","DhtmlxToIcalRecType","base","extra","count2","daysString","days","parseRecurDay","month","getByDay","Daily","Weekly","Monthly","Yearly","getCount","freq","getFreq","until","getUntil","byDay","byday","byMonthDay","getByMonthDay","bymonthday","byMonth","getByMonth","bymonth","Recur","DivViewerSourceCreator","poolFactory","sourceFactory","pool","delete","getLent","getMax","parentEl","setParentEl","lend","DivViewerSourceFactory","DivViewerSource","frameFactory","frame","frameEl","getEl","el","createElement","appendChild","removeAttribute","removeChild","Downloader","detector","viewerRegistry","cleaner","downloadPromise","downloading","onContent","viewerType","isOfflineable","definitions","adapter","getAdapter","assetAttrs","assetOptions","isExtractable","detect","detected","clean","detectedAfterClean","DriveEnum","INTERNAL","DriveUtil","externalDriveUnitArray","internalDriveUnitArray","DEV","PROD","TEST","EnvUtil","ErrorLevelFactory","priorityMap","Map","firstPriority","secondPriority","isErrorLevel","ErrorLevel","ErrorName","AbortError","EncodingError","InvalidModificationError","InvalidStateError","MediaError","NetworkError","NoModificationAllowedError","NotReadableError","NotSupportedError","PathExistsError","QuotaExceededError","ReferenceError","SecurityError","SetupError","SyntaxError","TimeoutError","ExceptionResource","FileSystemPathFactory","FileSystemPath","pathBrowserify","parents","segmentArray","altBase","getBase","pathArray","valueArray","getValue","fromPath","toPath","relative","normalized","normalize","pathObject","isRoot","dirString","dir","root","segments","ext","getSegments","isAbsolute","getNormalized","FileSystemPurpose","FileTransferConnection","FileTransferRequest","FileTransferResponse","isStatus","isInteger","FingerprintBrowser","hasher","hashObject","getPromise","excludes","adBlock","availableScreenResolution","enumerateDevices","fontsFlash","hasLiedResolution","pixelRatio","screenResolution","timezoneOffset","plugins","excludeIE","componentArray","FingerprintFallback","browser","hardware","_error","FingerprintHardware","networkManager","getAllConnections","connectionArray","getType","connectionMap","Ethernet","getLeastMac","Wifi","findMac","mac","getSerialNumber","getMac","normalizeMac","sort","macRegex","test","toLowerCase","FingerprintHasher","algorithm","encoding","respectFunctionNames","respectFunctionProperties","respectType","inserted","binding","focus","FocusNavigator","offset","elArray","queryElements","findElement","current","activeElement","fromIndex","findFromIndex","toIndex","findToIndex","change","querySelectorAll","tagName","href","FocusNoop","HtmlElementRepairer","omitAttributes","attributes","attribute","scrollLeft","scrollTop","HtmlIframePreflighterFile","xhrFetcher","responseURL","HtmlIframePreflighterHttp","mode","HtmlIframePreflighterNoop","HtmlIframePreflighterRegistry","URI","preflighterFile","preflighterHttp","preflighterMap","http","https","uri","preflighter","preflight","HtmlMediaUtil","mediaError","getMessage","codeKey","codeValue","foundEntry","codeText","getCode","HtmlVideoRepairer","blankSrc","elementRepairer","mediaUtil","repairSources","repairSrc","repairSrcObject","defaultPlaybackRate","playbackRate","repair","childNodes","node","onCanplay","hasAttribute","createError","load","srcObject","MediaStream","getTracks","IcalFreq","Secondly","Minutely","Hourly","IcalPlanner","ical","expander","IcalUtil","times","strings","time","toICALString","Property","updatePropertyWithValue","subcomponent","addSubcomponent","ievent","addPropertyWithValue","property","createExdateProperty","addProperty","unixTime","icalTime","toJSON","jsWeekday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","IcalWeekday","IdGenerator","ImageFileViewerType","controllerFactory","sourceCreator","ImageViewerControllerFactory","ImageViewerController","lifeCycleFactory","viewerLifeCycle","viewerSource","enter","viewerFrame","getFrame","leave","release","seize","getStretchEnum","getUrl","stretchClassName","getStretchClassName","classList","add","style","backgroundImage","KioskViewerType","loadDelay","scroll","KiwiLighter1AppManager","lighterApp","KiwiLighter1","KiwiLighter1BootManager","onDeviceReady","started","KiwiLighter1ControlListener","eventTarget","parser","listenerMap","has","listener","controlButton","parseKeyCode","detail","button","set","KiwiLighter1ControlManager","lighterControl","lock","KiwiLighter1ControlParser","KiwiLighter1DriveManager","lighterDrive","parseType","getAllUnits","cordovaType","External","Internal","KiwiLighter1FileArchiveManager","volumeFactory","KiwiLighter1FileArchiveVolumeFactory","FileArchiveVolume","cordovaArchiver","mapper","pathFactory","KiwiLighter1FileArchiveVolume","toPathAbs","toDirectory","KiwiLighter1FileSystemDirectory","cordovaDirectory","cordovaResolver","entryFactory","createReader","readEntries","filePath","listedPath","createEntry","hasEntry","toCordovaDirectory","KiwiLighter1FileSystemEntryFactory","FileSystemDirectory","FileSystemFile","cordovaEntry","createFile","cordovaFile","KiwiLighter1FileSystemFile","toCordovaFile","KiwiLighter1FileSystemManager","cordovaUnitResource","unitFactory","getUnit","rootDirectory","getParents","parentName","accDirectory","exclusive","parentDirectory","baseDirectory","getAll","getPurpose","concat","KiwiLighter1FileSystemMapper","localhostPort","unitResource","unitName","unitUrl","prefix","rest","KiwiLighter1FileSystemUnitFactory","FileSystemUnit","KiwiLighter1FileSystemUnit","KiwiLighter1FileTransferDownloadFactory","FileTransferDownload","lighterFileTransfer","KiwiLighter1FileTransferDownload","KiwiLighter1FileTransferManager","downloadFactory","KiwiLighter1FirmwareManager","lighterFirmware","getManufacturer","getModelName","getVersion","accPromise","getter","accObject","assign","strict","bottle","constant","maxEvents","Vue","kiwi","sentryDsn","service","serviceFactory","container","Logger","boot","cordova","kiwiApp","kiwiControl","kiwiDrive","kiwiFileTransfer","kiwiFirmware","kiwiMemory","kiwiNetwork","kiwiPower","kiwiScreen","kiwiSensor","kiwiSound","kiwiTime","navigator","limit","binary","storage","Player","KiwiLighter1MemoryManager","lighterMemory","KiwiLighter1NetworkManager","connectionFactory","networkTypeFactory","toNetworkType","ip","KiwiLighter1OrientationMapper","Clockwise0","Clockwise90","Clockwise180","Clockwise270","orientationString","KiwiLighter1PowerManager","lighterPower","command","parseCommand","isoString","Off","On","KiwiLighter1PromisifyFile","settlement","fromError","callbackArgArray","fromCode","context","failureIndex","failureTransform","successIndex","KiwiLighter1PromisifyLighter","errorObject","KiwiLighter1ScreenManager","lighterScreen","orientationMapper","toEnum","fromEnum","KiwiLighter1SensorManager","lighterSensor","KiwiLighter1SoundManager","lighterSound","KiwiLighter1StartupManager","range","semver","satisfies","KiwiLighter1TimeManager","lighterTime","KiwiLighter1VideoViewerControllerFactory","KiwiLighter1VideoViewerController","stretchNative","viewerLifeCycleFactory","playReject","playResolve","playTimeout","stateMachineFactory","onCanplaythrough","onEnded","onPlaying","unbindElement","play","pause","getClassName","bindElement","poster","KiwiLighter1VideoViewerType","KiwiLighter1ViewerRegistry","MediumRegistry","imageType","kioskType","pdfType","streamType","videoType","webType","widgetType","mediumRegistry","mediumType","KiwiLighter1WidgetViewerType","setSearch","KiwiLighterApiControlButton","KiwiLighterApiDriveType","KiwiLighterApiNetworkTypeFactory","KiwiLighterApiNetworkType","KiwiLighterApiOrientation","KiwiLighterApiPowerCommand","components","LoaderContainer","LoggerFactory","consoleFactory","env","sentryFactory","createLogger","setInfo","envEnum","LoggerManager","appManager","getRuntimePlatform","getUpdatePlatform","getUpdateUrl","LongTimers","maxDelay","delayIndex","min","mappedArgs","mapSetArgs","mediumRecordArray","parsedMediumType","subtype","mediumRecord","aMediumRecord","bMediumRecord","comparator","registerMany","registerOne","parameters","foundMediumRecord","equals","mediumTypeArray","MediumType","MemoryInfo","NetworkConnectionFactory","NetworkConnection","hasIp","NetworkType","Numeric","OrganizationHelper","organization","orgArray","childOrganization","flatten","PdfFileViewerType","PdfParentFactory","PdfParent","connectToChild","durationchange","onDurationchange","ended","getSrc","duration","page","setCurrentPage","setPlaybackRate","setSrc","PdfRecycler","PdfViewerControllerFactory","PdfViewerController","onElementError","onParentError","unbindParent","requestedDuration","getPlayDuration","sandbox","scrolling","getParent","bindParent","PdfViewerSourceCreator","recycler","poolMap","findPool","foundPool","isLent","getAvailable","setScheduleInfo","existingPool","createdPool","recycle","receive","PdfViewerSourceFactory","PdfViewerSource","iframeCreator","parentFactory","sourceIframe","PlaylistCommunicator","trackCommunicator","scheduleEnum","scheduler","playlistModel","playlistMap","trackMap","tracks","PoolAsyncFactory","PoolAsync","genericPool","Infinity","createPool","object","autostart","MAX_SAFE_INTEGER","maxWaitingClients","_waitingClientsQueue","dequeue","isBorrowedResource","drain","clear","isIndex","_config","_count","_ensureMinimum","available","borrowed","acquire","PoolFactory","Pool","isFactory","isMax","availableArray","lentArray","removeLent","lent","fill","pop","lentIndex","splice","PositionFrameFactory","PositionFrame","cssValue","stateMachine","transitions","to","transit","getLeft","getTop","getWidth","getHeight","negateCssValue","hide","parsedArray","abs","getBackgroundColor","getZIndex","Promisify","callArgArray","failureLabel","getIndex","getTransform","successLabel","successTransform","successFn","failureFn","callbackArray","fn","mergeArgs","label","definedCallbackArray","maxIndex","argLength","argArray","argIndex","callArgIndex","arg","getArgs","QueueFactory","Queue","cb","ReplacerCommon","resourceNameArray","contentStore","resourceName","replaceAsync","onConflict","modelArray","idArray","ReplacerControl","controlManager","replaceLocalLock","replaceRemoteLock","setLocalLock","handleError","setRemoteLock","ReplacerPower","deleteAllTimers","createTimers","Replacer","autorebootReplacer","replacerControl","replacerPower","replacerSound","replacerScreen","replacerCommon","replacerSession","replaceContent","replacedContentInfo","applyContent","restoreContent","ReplacerScreen","screenManager","setOrientation","getOrientation","ReplacerSession","sessionId","ReplacerSound","soundManager","setVolume","ReportManager","memoryManager","sensorManager","timeManager","getBootDate","getBrightness","createScreenshot","getBootTimestamp","getDriveInfo","getFirmwareVersion","getImage","getLocalControlLock","getMemory","getMuted","getNetwork","getNowTimestamp","getRemoteControlLock","getTemperature","getTimezone","getLocalLock","memoryInfo","isMuted","wiredInfo","getWired","wirelessInfo","getWireless","getRemoteLock","getZone","foundConnection","wiredIpInfo","getWiredIp","getIp","wirelessIpInfo","getWirelessIp","ScheduleBackground","cycleIndex","iterationIndex","ScheduleEmpty","ScheduleEnum","ScheduleInfo","layer","trackDuration","mediumDuration","mediumStretchEnum","sessionStretchEnum","getViewerType","accVolume","currentVolume","isPreloadable","isEmpty","online","isIcalValid","every","planIcal","hasEventOnDate","viewerSourceCreator","getSourceCreator","layerId","playlistIdArray","trackIdArray","ScheduleLayer","scheduleStrategy","detectStrategy","onGone","onPlayed","merge","go","plan","skip","hasPlaylist","scheduleMedium","ScheduleLayout","ScheduleLinear","scheduleEdgeArray","schedulePlan","scheduleEdge","scheduleEdgeIndex","toSchedulePlan","fromSchedulePlan","goNext","childScheduleInfo","getCycleIndex","goDeep","toScheduleInfo","fromCycleIndex","fromIterationIndex","fromScheduleEdge","toIterationIndex","nextIterationIndex","toScheduleEdgeIndex","nextEdgeIndex","childScheduleStrategy","toCycleIndex","nextCycleIndex","isLastEdge","findEdgeIndex","sliceIndex","accCycleIndex","accOffest","childScheduleInfoArray","foundOffset","scheduleInfoArray","getIterationIndex","previousScheduleInfo","previousCycleIndex","hasCycleIndex","previousIterationIndex","hasIterationIndex","ScheduleManager","findTask","hasLayout","createStrategies","filteredTaskArray","ScheduleMedium","planCycleIndex","previousSchedulePlan","ScheduleOrphan","schedulePlayer","SchedulePlayer","playing","SchedulePlaylist","getTrackArray","parentPlaylistId","ScheduleRandom","scheduleLinear","ScheduleStatic","sortedTrackArray","ScheduleTrack","onPlayerPlayed","onStrategyPlayed","isPlaying","childPlaylist","SentryLoggerFactory","Sentry","SentryLogger","captureErrorLevel","offlineIntegration","severityFactory","vueIntegration","dsn","integrations","sendEvents","hub","getCurrentHub","client","getClient","captureError","captureObject","captureString","severity","fromErrorLevel","isBreadcrumb","addBreadcrumb","withScope","scope","setLevel","captureException","captureMessage","compare","setExtra","setUser","_options","environment","setBuildId","setDeviceId","setEnvEnum","setManufacturer","setModelName","setOnline","setRuntimePlatform","setUpdatePlatform","setUpdateUrl","setVersion","SentryOfflineIntegration","localStorage","removeItem","onLine","storeEvent","getItem","getDsn","restoreEvents","captureEvent","clearEvents","addGlobalEventProcessor","processEvent","timestamp","setItem","SentrySeverityFactory","errorLevel","SentrySeverity","Critical","Fatal","isInstalled","SetupErrorFactory","SetupErrorType","AccessCodeMissing","DeviceExists","DeviceLimitExceeded","DeviceRegistered","OrganizationInvalid","OrganizationMissing","RequestInvalid","SaveError","UserInvalid","configurable","writable","CountdownRoot","directives","onBack","retry","onRetry","SetupManager","organizationHelper","errorFactory","errorType","parseErrorType","parseOrganizations","fingerprint","accessCode","parseDeviceId","organizationId","deviceType","SetupHeader","submitted","field","validator","$root","onChange","$validator","validateAll","onSubmit","valid","ClockRoot","computed","className","isOnline","onManual","onSettings","qriuous","element","$refs","canvasEl","setupManager","getQrUrl","SetupFailure","SetupManual","SetupOrganization","SetupPanelLeft","SetupPanelRight","SetupQr","SetupSettings","SetupSuccess","virtualKeyboardManager","automaticEnabled","automaticTimeout","onButtonDown","focusManager","networkListener","onOnlineChanged","onVirtualKeyboardChanged","rootStyle","getRootStyle","startAutomatic","defaultServerUrl","failureMessage","failureRetryDelay","failureRetryTime","organizationArray","successTime","stopAutomatic","back","onFailureBack","onManualBack","onOrganizationBack","onSettingsBack","exit","isOverlapping","paddingBottom","install","showSuccess","onAutomatic","registerAutomatic","showManual","onFailureRetry","showLoader","registerManualComplete","registerManualSimple","showFailure","onFinish","showQr","onManualSubmit","onOrganizationSubmit","showSettings","onSettingsSubmit","fetchOrganizations","showOrganization","registerManual","require_tld","onReset","finish","onClick","StateMachineFactory","JavascriptStateMachine","StateMachine","pendingPromise","jsm","onBeforeTransition","onInvalidTransition","onPendingTransition","state","transition","cannot","wrapPromise","Store","dsAdapterMap","allowSimpleWhere","bypassCache","instanceEvents","watchChanges","dsAdapter","registerAdapter","defineResource","all","definition","NER","IA","inheritedOptions","_","notify","ejectOptions","eject","currentModelArray","ejectModelArray","ejectIdArray","ejectMany","createMany","StreamViewerType","StretchEnum","StretchNative","TaskEnum","TrackCommunicator","trackPlanCommunicator","jsonObject","trackPlans","childPlaylistId","parseIcal","schedule","TrackPlanCommunicator","dhtmlxToIcalExporter","trackPlan","parseDhtmlxEvent","export","parentPlaylist","UpdatePlatformUtil","TizenSssp4","Web","WebosSignage3_0","WebosSignage3_2","UpdatePlatform","Updater","updatePending","getFormat","updateResult","buildIdMatched","updatePromise","finishUpdate","ViewerControllerIframe","loadTimeout","onElementLoad","onLoadTimeout","onPreflightError","ViewerDelayerFactory","ViewerDelayer","ViewerDirectorFactory","ViewerDirector","threadFactory","ViewerDirectorResource","directorArray","director","threadArray","onEntered","thread","bindThread","scheduleStrategyArray","createThread","unbindThread","destroyThread","ViewerLifeCycleFactory","ViewerLifeCycle","transitAsync","LoaderRoot","loaderVisible","rootVisible","contentReady","connect","destroyDirector","createDirector","$el","hit","getCssOrientation","watch","$nextTick","ViewerSlideFactory","ViewerSlide","controller","failed","onLoaded","createController","destroyController","deleteSource","ViewerSourceIframeCreator","ViewerSourceIframeFactory","ViewerSourceIframe","ViewerSourceVideoCreator","repairer","ViewerSourceVideoFactory","ViewerSourceVideo","ViewerThreadFactory","ViewerThread","delayerFactory","slideFactory","delayer","loadRequested","loadingSlide","playRequested","playingSlide","queuePromise","stopRequested","onSchedulePlayed","onSlideError","onSlidePlayed","slide","createSlide","bindSlide","deleteSlide","destroySlide","unbindSlide","unsetLoading","unsetPlaying","playUnsafe","success","fail","succeed","wait","loadUnsafe","getScheduleInfo","currentPromise","nextPromise","isEqual","isViewable","loadStep","setLoading","playingScheduleInfo","setPlayed","setFailed","isPlayed","setPlaying","playStep","releaseSlide","createLoading","deleteLoading","isFailed","activateLoading","enterPlaying","createPlaying","deletePlaying","releaseLoading","releasePlaying","ViewerTypeWeb","VirtualKeyboardHiddenFactory","VirtualKeyboardHidden","VueFactory","VeeValidate","productionTip","use","enableAutoClasses","classNames","invalid","locale","WebNetworkListener","onOffline","onOnline","XhrFetcher","responseType","xhr","XMLHttpRequest","onreadystatechange","readyState","open","Device","analyticsTracker","fingerprintManager","loggerManager","replacer","reportManager","scheduleManager","startupManager","updater","viewerDirectorResource","onContentCleaned","onHeartbeatFetched","createThreads","shutdown","report","loggerInfoArray","destroyThreads","fetchCommand","execute","fetchContent","fetchedContentInfo","updateVersion","accDirector","accType","getReportInfo","getLoggerInfo","destroyAll","PlatformUtil","TizenSssp5","TizenSssp6","WebosSignage4_0","WebosSignage4_1","Platform","SetupRoot","ViewerRoot","reportEnabled","reportDelay","reportTimeout","setupVisible","viewerVisible","onSetupFinish","onViewerEntered","installed","vueFactory","self","PlayerRoot","createVue"],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;AClFA;AACA;AACA;;AAEA,iC;;;;;;;;;;;ACJA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;;AAEA;AACA;AACA;;AAEA,oC;;;;;;;;;;;ACVA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,wC;;;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;;;;;;ACNA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,8B;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;;AAEA;AACA;;AAEA,iC;;;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;;;;;;ACPA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA,2B;;;;;;;;;;;ACjBA;AACA;AACA;;AAEA,kC;;;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;AAEA;AACA,6CAA6C,+BAA+B;AAC5E;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA,uC;;;;;;;;;;;AC1BA;AACA;AACA;;AAEA,kC;;;;;;;;;;;ACJA;AACA;AACA;;AAEA,oC;;;;;;;;;;;ACJA;;AAEA;AACA,iBAAiB,sBAAsB;AACvC;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA,+B;;;;;;;;;;;ACrBA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,4C;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iC;;;;;;;;;;;ACTA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,gC;;;;;;;;;;;ACVA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,oC;;;;;;;;;;;ACVA,wBAAwB,2EAA2E,oCAAoC,mBAAmB,GAAG,EAAE,OAAO,oCAAoC,8HAA8H,GAAG,EAAE,sBAAsB;;AAEnW;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yB;;;;;;;;;;;;;;;;;;;;AChBA;AACsB;AACH;AACyC;AACX;AACV;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gFAAkD,mCAAmC,yBAAyB;AAC9G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,qEAAuB;AACtD;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,mC;;;;;;;;;;;;;;;;;;;ACpEA;AAC0B;AACQ;AACT;AACO;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAuC,cAAc;AACrD;AACA;AACA;AACA,iBAAiB;AACjB,+EAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,kC;;;;;;;;;;;;;;;;;;ACvEmI;AACxD;AAC/C;AAC5B;AACA;AACA,6BAA6B,cAAc;AAC3C;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,6BAA6B,cAAc;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wC;;;;;;;;;;;;;;;;;;;AC1EA;AACsC;AAC4B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,cAAc;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,2BAA2B,EAAE;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0FAA4D;AAC5D;AACA;AACA;AACA;AACA,4FAA8D,yBAAyB,sFAAgC;AACvH;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,EAAE;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtIA;AAC4B;AAC0M;AAC9M;AACkF;AAC1E;AACW;AACjB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAsC;AAC9B;AACR,iC;;;;;;;;;;;;;;;;;;ACpBA;AAC6B;AACV;AACiH;AACpI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAA0C,gFAAgF;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAyC,0BAA0B,2CAA2C;AAC9G;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,uEAAyC,0BAA0B,2CAA2C;AAC9G;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,uC;;;;;;;;;;;;;;;;;;;;AChRA;AACwB;AACL;AAC6F;AAChF;AACF;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAA0C,4CAA4C;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,0C;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClMyB;AACN;AACG;AACC;AACH;AACpB,iC;;;;;;;;;;;;;;;;;;;ACLA;AACiD;AAC1B;AACW;AACN;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,YAAY;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,wC;;;;;;;;;;;;;;;;AC/DiD;AAClC;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA,2BAA2B,4FAAsC;AACjE;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA,6BAA6B;AAC7B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA,6BAA6B;AAC7B,yBAAyB;AACzB,qBAAqB;AACrB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,oC;;;;;;;;;;;;;;;;;ACxMA;AACiD;AACvB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAA0C,UAAU,mBAAmB;AACvE;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,qC;;;;;;;;;;;;;;;;;;;ACtCmE;AACvC;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,KAAK,EAAE,EAAE;AACT;AACA;AACA;AACA,mC;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1FuE;AAChC;AACf;AACO;AAC0C;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,WAAW;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,WAAW,iBAAiB;AAC5B;AACA,qBAAqB,eAAe;AACpC,mBAAmB,qBAAqB;AACxC,oBAAoB,aAAa;AACjC,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,SAAS,qBAAqB;AAC9B;AACA;AACA,6BAA6B,cAAc;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,cAAc;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAA8B;AAC9B;AACA,+B;;;;;;;;;;;;;;AC9JA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,kBAAkB;AACrC;AACA,wEAAwE;AACxE,gEAAgE;AAChE;AACA;AACA,uCAAuC;AACvC,uCAAuC;AACvC,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAkC,eAAe,yCAAyC;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oC;;;;;;;;;;;;;;;;AC1Mc;AACuB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,gC;;;;;;;;;;;;;;;;;;ACzBA;AACiB;AAC6E;AACtE;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA,CAAC;AACO;AACR,iC;;;;;;;;;;;;;;;;;;;;;;AC5DwB;AACC;AACF;AACvB,iC;;;;;;;;;;;;;;;;;;ACHA;AACiB;AACoC;AAC7B;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC;AACO;AACR,+B;;;;;;;;;;;;;;;ACvDA;AACA;AACA,mC;;;;;;;;;;;;;;;ACF0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mHAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,+B;;;;;;;;;;;;;;;;ACtF8B;AACN;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,uC;;;;;;;;;;;;;;;;;AClDA;AAC6E;AACjD;AAC5B;AACA;AACA;AACA;AACA;AACA,IAAI,wBAAwB;AAC5B,IAAI,wBAAwB;AAC5B;AACA;AACA,IAAI,oBAAoB;AACxB,0CAA0C,sBAAsB;AAChE;AACA;AACA;AACA,IAAI,8BAA8B;AAClC;AACA;AACA;AACA;AACA,IAAI,0BAA0B;AAC9B;AACA,IAAI,2BAA2B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,gDAAgD,EAAE;AACtF;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,gDAAgD,EAAE;AACtF;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,yCAAyC,EAAE;AAC9F,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,4BAA4B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC;AACO;AACR,sC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5W+J;AAC/E;AAClE;AACO;AACC;AACA;AACE;AACxB;AACQ;AACR,iC;;;;;;;;;;;;;;;;;;;;ACTA;AACiD;AAChC;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,eAAe,EAAE;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,eAAe,EAAE;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,uC;;;;;;;;;;;;;AClEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,4C;;;;;;;;;;;;;;;;;AC/BA;AACiD;AACQ;AACzD;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,eAAe;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA,iEAAiE,kGAA4C,EAAE;AAC/G,SAAS;AACT;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA,6EAA6E,8FAAwC,EAAE;AACvH;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA,4EAA4E,8FAAwC,EAAE;AACtH;AACA;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,0C;;;;;;;;;;;;;;;;;;;AC9J2B;AACF;AACzB,iC;;;;;;;;;;;;;;;;ACFwB;AACP;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+B;;;;;;;;;;;;;;;;ACfiB;AACK;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,gC;;;;;;;;;;;;;;;;;;;;;;;ACxBA;AACsG;AACtF;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,6BAA6B;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,YAAY;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,4DAAqB;AACpD,kCAAkC,wBAAwB;AAC1D;AACA,kBAAkB,YAAY;AAC9B;AACA,0BAA0B,+BAA+B;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2GAA6E,cAAc,oBAAoB;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8GAAgF,cAAc,oBAAoB;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mGAAqE,SAAS,oBAAoB;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE;AACzE;AACA;AACA;AACA;AACA,+EAAiD,uBAAuB;AACxE;AACA,gGAA0C,iDAAiD,EAAE;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,sBAAsB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,UAAU;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,UAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9byC;AACkD;AAC3F,iC;;;;;;;;;;;;;;;;;ACFA;AAC+E;AAC/E;AACA,wCAAwC,yBAAyB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,mBAAmB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;AACA;AACA,kCAAkC,mBAAmB;AACrD;AACA;AACA;AACA,+BAA+B,WAAW;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wFAA0D;AAC1D;AACA;AACA,gDAAgD,uFAAuF,EAAE;AACzI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAwC,sBAAsB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAyC,uBAAuB;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAAgD;AAChD,+EAAiD;AACjD,iFAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAAiD,uBAAuB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA6C;AAC7C;AACA;AACA,0EAA4C;AAC5C;AACA;AACA,0EAA4C;AAC5C;AACA;AACA,8EAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iC;;;;;;;;;;;;;;;;AC1SA;AACkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+FAAiE,gBAAgB,yCAAyC;AAC1H;AACA;AACA;AACA,qBAAqB;AACrB;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,mC;;;;;;;;;;;;;;;;ACvFmB;AACkC;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+HAAyE;AACzE;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,cAAc,EAAE;AAChB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,0C;;;;;;;;;;;;;;;;AC1EA;AACyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAA0C,oCAAoC;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,iC;;;;;;;;;;;;;ACnDA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,2BAA2B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,kC;;;;;;;;;;;;;;;ACpKgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,2BAA2B;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kEAAkE,4BAA4B;AAC9F;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,iC;;;;;;;;;;;;;;;;AC3DA;AACoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,aAAa,YAAY;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4EAA8C;AAC9C;AACA;AACA,4EAA8C,0BAA0B,8DAAgC;AACxG;AACA,oEAAsC,UAAU,qBAAqB;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qFAAqF,yCAAyC,EAAE;AAChI;AACA;AACA;AACA,yIAA2G,qBAAqB;AAChI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,QAAQ,gBAAgB;AACvD;AACA;AACA;AACA;AACA,6BAA6B,0BAA0B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,0C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5FkB;AACO;AACT;AACC;AACD;AACS;AACG;AACJ;AACA;AACF;AACR;AACd,iC;;;;;;;;;;;;;;;;ACXA;AACqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,yHAA2F,mBAAmB;AAC9G;AACA;AACA;AACA;AACA,uBAAuB,QAAQ,gBAAgB;AAC/C;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,6C;;;;;;;;;;;;;;;;AClGA;AAC6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAsC,UAAU,6DAA+B,oB;AAC/E;AACA;AACA,yEAAyE,0DAA4B,UAAU,yDAAyD,GAAG,EAAE,GAAG,GAAG;AACnL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAsC,UAAU,wDAAwD;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAkC,eAAe,gFAAgF,2BAA2B,EAAE,GAAG;AACjK;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,yC;;;;;;;;;;;;;;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAkC,UAAU,yDAA2B,uBAAuB,wHAAwH;AACtN;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,yC;;;;;;;;;;;;;ACtCA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,QAAQ;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,uC;;;;;;;;;;;;;;;ACnDiD;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,cAAc;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzFA;AACwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA;AACA,iC;;;;;;;;;;;;;;;;;;;;;;;;;ACpKmB;AACA;AACE;AACJ;AACjB,iC;;;;;;;;;;;;;ACJA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B,oC;;;;;;;;;;;;;ACZA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA,6CAA6C,eAAe;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B,oC;;;;;;;;;;;;;ACjDA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACA,2CAA2C,iBAAiB;AAC5D;AACA;AACA,oCAAoC,8BAA8B;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC,gC;;;;;;;;;;;;;ACrFA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wBAAwB;AACzB;AACA;AACA;AACA;AACA,2CAA2C,aAAa;AACxD;AACA;AACA,oCAAoC,qBAAqB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wBAAwB;AACzB,kC;;;;;;;;;;;;;AC1CA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,iC;;;;;;;;;;;;;;;;ACVA;AACsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,sBAAsB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,uGAAuG;AACrI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,+B;;;;;;;;;;;;;;;;AC9EA;AACyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,iC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iC;;;;;;;;;;;;;;;;;;;ACdA;AAAA;AACA;AACiC;AAChB;AAC0B;AAC5B;AACgC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2GAA6E,UAAU;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,QAAQ,gBAAgB;AAC3C;AACA;AACA;AACA;AACA,iBAAiB,0BAA0B;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,uBAAuB;AACvD;AACA;AACA,4CAA4C,2BAA2B;AACvE;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,sFAAwD;AACxD;AACA,0FAA4D,sBAAsB,+CAA+C;AACjI;AACA,aAAa;AACb,0FAA4D,sBAAsB,yCAAyC;AAC3H;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,oFAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4FAA8D,sBAAsB,2BAA2B;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uBAAuB;AAC/D;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uBAAuB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,kBAAkB;AAChD;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,2BAA2B;AACpD,aAAa;AACb;AACA;AACA,qBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,sC;;;;;;;;;;;;;;;;;;;;;;;;;ACraA;AAAA;AACA;AACA,IAAI,cAAc;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,mBAAmB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iBAAiB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,qBAAqB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,eAAe;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,kBAAkB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,oBAAoB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,cAAc;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,gBAAgB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,eAAe;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,uBAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,mBAAmB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8B;;;;;;;;;;;;;;;ACpJ0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE;AACpE,SAAS;AACT;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE,SAAS;AACT;AACA;AACA;AACA;AACA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE,SAAS;AACT;AACA;AACA,CAAC;AACD;AACA;AACA;AACQ;AACR,kC;;;;;;;;;;;;;AChEA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,wBAAwB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACO;AACR,gC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpDmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA,eAAe,0BAA0B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gC;;;;;;;;;;;;;;;;;;;;;;;;AClUmF;AACpE;AAC6B;AACzB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wEAAwE,EAAE;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,WAAW;AACtC,6BAA6B,sBAAsB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mBAAmB;AAC9C,0BAA0B,yDAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uEAAuE,gCAAgC,EAAE;AACzG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,kBAAkB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kC;;;;;;;;;;;;;;;;;;;;AC5RA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,IAAI;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA;AACA,iCAAiC,8BAA8B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,YAAY,EAAE;AAC7F;AACA;AACA;AACA;AACA;AACA,UAAU,oBAAoB;AAC9B;AACA;AACA;AACA;AACA;AACA,UAAU,UAAU;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,sBAAsB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E,YAAY,EAAE;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gC;;;;;;;;;;;;;;AC7JA,gDAAuD,gBAAgB,kDAAkD;AACzH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oC;;;;;;;;;;;;;;;;ACrBsB;AACA;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,2BAA2B,EAAE;AAC5D;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,CAAC;AACO;AACR,yC;;;;;;;;;;;;;;;;;;AClFmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,KAAK;AAC1B;AACA;AACA,sBAAsB,KAAK;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kC;;;;;;;;;;;;;;;;;;;;;;;AC1FiB;AACS;AAC1B;AACA;AACA,IAAI,yBAAyB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,uBAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,2BAA2B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,oBAAoB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,uBAAuB;AACnE;AACA;AACA;AACA,IAAI,0BAA0B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,gCAAgC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,6BAA6B;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,sBAAsB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oC;;;;;;;;;;;;;;;AC5KqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,wBAAwB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,yCAAyC,YAAY,EAAE;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,CAAC;AACO;AACR,uC;;;;;;;;;;;sDChMA,mCAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2DAA+B,eAAe,EAAE;AAAA;AAChD,SAAS;AACT;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;;AAEL,CAAC,a;;;;;;;;;;;;ACrrBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC/BA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC7BA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC/BA;;AAEA;AACA;;;;;;;;;;;;ACHA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClBA;;AAEA;;;;;;;;;;;;ACFA;;;;;;;;;;;;ACAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACnBA;;AAEA;AACA;AACA;;;;;;;;;;;;ACJA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;ACJA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;;ACdA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACPA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;ACJA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;;AC1BA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AChBA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,+BAA+B;AACzC;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,UAAU,eAAe;AACzB;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACxCA;AACA;AACA;;AAEA,qBAAqB,oBAAoB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,YAAY,eAAe;AAChC;AACA,KAAK;AACL;AACA;;;;;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,WAAW;AACnB;AACA,CAAC;;;;;;;;;;;;ACrBD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,GAAG;AACH;;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB,qDAAqD;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,eAAe;AACzB;AACA;AACA;AACA,2CAA2C;AAC3C;AACA,8BAA8B;AAC9B,+BAA+B;AAC/B,+BAA+B;AAC/B,qCAAqC;AACrC,SAAS,iCAAiC;AAC1C;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACpDA;AACA;AACA;AACA;;AAEA,qBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,sCAAsC;AAC9C;AACA;AACA;AACA;;;;;;;;;;;;AC9BA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;ACjBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACvBA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACZA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,SAAS,EAAE;AACzD,CAAC,gBAAgB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,GAAG,gBAAgB;AACnB;AACA;;;;;;;;;;;;ACnCA,iBAAiB;;AAEjB;AACA;AACA;;;;;;;;;;;;ACJA;AACA;AACA;AACA,gDAAgD,kBAAkB,EAAE;;AAEpE;AACA;AACA;AACA;AACA,GAAG,gBAAgB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACtBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;;;;;;;;;;;;;ACZA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;;;;;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;;;;;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,OAAO;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,kCAAkC;AAClC,oCAAoC;AACpC,cAAc;AACd,KAAK;;AAEL;AACA;AACA;AACA;;;;;;;;;;;;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,qDAAqD;AACrD;AACA,kDAAkD,iBAAiB,EAAE;AACrE;AACA;AACA,4EAA4E,iCAAiC,EAAE;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,WAAW,yDAAyD;;AAEpE;;AAEA;;AAEA;AACA;;;;;;;;;;;;AChGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;;;;;;;;;;;;ACbA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,KAAK,YAAY;AACjB,GAAG;AACH;;;;;;;;;;;;ACZA;AACA,gBAAgB;AAChB;AACA;AACA,CAAC;;;;;;;;;;;;ACJD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0FAA0F;AAC1F;AACA;;;;;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;;AAEA,8BAA8B,aAAa;;AAE3C;AACA;AACA,6DAA6D,0CAA0C;AACvG;AACA;AACA;AACA;;;;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACPA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8BAA8B,aAAa;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA,yCAAyC,4CAA4C;AACrF,6CAA6C,4CAA4C;AACzF,+CAA+C,4CAA4C;AAC3F,KAAK,qBAAqB,sCAAsC;AAChE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAmB;AACnC;AACA;AACA,yCAAyC,kCAAkC;AAC3E;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,eAAe,qFAAqF;AACzG;;AAEA;AACA;;;;;;;;;;;;ACvFA;AACA;AACA;AACA;;AAEA;AACA,+CAA+C;AAC/C;AACA;AACA,GAAG;AACH;;;;;;;;;;;;ACVA;AACA;AACA,iCAAiC,QAAQ,mBAAmB,UAAU,EAAE,EAAE;AAC1E,CAAC;;;;;;;;;;;;ACHD;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACTA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,mDAAmD;AACnD,GAAG;AACH,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACrDA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,yBAAyB,4CAA4C;AACrE;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA,6BAA6B,UAAU;AACvC;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,2BAA2B,mBAAmB,aAAa;;AAE3D;AACA;AACA;AACA;AACA,6CAA6C,WAAW;AACxD;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA,gBAAgB;AAChB;AACA,cAAc;AACd,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,4CAA4C;AAC5E;AACA;AACA,2BAA2B,uCAAuC;AAClE;AACA;AACA;AACA;;;;;;;;;;;;;AC5FA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,cAAc;AAC9D;AACA,CAAC;;;;;;;;;;;;ACRD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;ACTA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;ACVA;AACA,wDAAwD;AACxD,CAAC;;;;;;;;;;;;ACFD;;;;;;;;;;;;ACAA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACVA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACRA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;ACRA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACNA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACJA,uBAAuB;;AAEvB;AACA;AACA;;;;;;;;;;;;ACJA;;;;;;;;;;;;ACAA;AACA;;AAEA;AACA;AACA,CAAC;AACD;AACA;AACA;;;;;;;;;;;;ACRA;;AAEA;;;;;;;;;;;;ACFA;AACA;AACA;AACA,sBAAsB,UAAU;AAChC,GAAG;AACH,CAAC;;;;;;;;;;;;ACLD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA,CAAC;;;;;;;;;;;;ACXD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gCAAgC;AAChC;AACA,gBAAgB;AAChB,GAAG,EAAE;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uCAAuC;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC1DA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACPA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACNA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnBA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACPA;AACA;AACA;;;;;;;;;;;;ACFA;;;;;;;;;;;;ACAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,yDAAyD,gBAAgB;AACzE;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8BAA8B,aAAa;;AAE3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AChCA;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACJD;AACA;;AAEA;;;;;;;;;;;;ACHA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,cAAc,EAAE;AAC7D,wBAAwB,+CAA+C;AACvE,CAAC,qCAAqC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;;;;;;;;;;;;ACjCD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;;;;;AC5CA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,gBAAgB;AACnB;AACA;AACA;AACA;;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG,gBAAgB;AACnB;AACA;;;;;;;;;;;;AChBA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACpBA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACNA;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;ACbA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AChBA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;ACNA;AACA,mCAAmC;AACnC;;AAEA;AACA,sFAAsF,OAAO;;AAE7F;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACVD;AACA;AACA;;AAEA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,gBAAgB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACnBD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;;AChBA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACXD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACVA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACTD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACTD;;;;;;;;;;;;ACAA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA,CAAC;;;;;;;;;;;;ACpCD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;;;ACpBA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,0BAA0B;AAC7C;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;;;ACtDA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACLA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;;;;;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,sBAAsB,aAAa;AACnC,GAAG;AACH;;;;;;;;;;;;ACbA;AACA;AACA;;AAEA;AACA;AACA,uCAAuC,iCAAiC;AACxE;AACA;;;;;;;;;;;;ACRA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACLA;AACA;AACA;AACA,kDAAkD;;AAElD;AACA,qEAAqE;AACrE,CAAC;AACD;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACXD;AACA;;AAEA;AACA;AACA;AACA;AACA,+CAA+C,SAAS,EAAE;AAC1D,GAAG;AACH;;;;;;;;;;;;ACTA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACfA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AChBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,MAAM;AACd;AACA;;;;;;;;;;;;ACbA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACbA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACTA;AACA;AACA;;AAEA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;;;;;;;;;;;;ACVA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACNA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACPA;AACA;;AAEA;AACA;AACA;AACA,uEAAuE;AACvE;;;;;;;;;;;;ACPA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACXA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;ACLA;AACA;;AAEA;;;;;;;;;;;;ACHA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACRA,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;;ACRA;AACA;;AAEA;AACA;;;;;;;;;;;;ACJA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACRA;AACA;AACA;;;;;;;;;;;;ACFA;;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,8FAAgC,+CAA+C;AAC/E,gCAAgC;AAChC;AACA;AACA;AACA;AACA,2CAA2C,YAAY;AACvD;AACA;AACA;AACA;AACA,mBAAmB,SAAS;AAC5B,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;AClDD;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA,CAAC;;AAED;AACA;;;;;;;;;;;;;ACPA;AACA;;AAEA;;AAEA;AACA;AACA,8FAAgC,sDAAsD;AACtF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACXD;AACA;AACA,8FAAgC,+BAA+B,GAAG,6GAA2C;;AAE7G;AACA;;;;;;;;;;;;;ACLA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,8FAAgC,yDAAyD;AACzF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACZD;AACA;AACA;AACA;;AAEA;AACA,wDAAwD,qBAAqB,EAAE;;AAE/E;AACA;AACA,8FAAgC,oDAAoD;AACpF;AACA;AACA;AACA,CAAC;;AAED;AACA;;;;;;;;;;;;;ACjBA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,qBAAqB,EAAE;;AAEnE;AACA;AACA,8FAAgC,oDAAoD;AACpF;AACA;AACA;AACA,CAAC;;AAED;AACA;;;;;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACnBD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;AClBD;AACA;;AAEA;AACA;AACA,8FAAgC,8DAA8D,GAAG,mBAAmB;;;;;;;;;;;;ACLpH;AACA;AACA,CAAC;;AAED;AACA;AACA,8FAAgC,2DAA2D;AAC3F;AACA,CAAC;;;;;;;;;;;;;ACRD;AACA;;AAEA;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA;AACA;AACA,CAAC;;AAED;AACA;;;;;;;;;;;;;ACZA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,8FAAgC,uEAAuE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;AChBD;AACA;AACA,8FAAgC,8BAA8B,GAAG,4GAA4C;;;;;;;;;;;;;ACF7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,8BAA8B;AAC9B,gCAAgC;AAChC,UAAU;AACV,CAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;;ACnDA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,8FAAgC,qEAAqE;AACrG;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACbD;;AAEA;AACA;AACA,8FAAgC,4EAA4E;AAC5G;AACA,CAAC;;;;;;;;;;;;;ACND;AACA;;AAEA;;AAEA;AACA;AACA;AACA,8FAAgC,yDAAyD;AACzF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACZD;AACA;;AAEA;AACA,gBAAgB;AAChB;AACA,CAAC;;AAED;AACA;AACA;AACA,8FAAgC,oDAAoD;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACpBD;AACA;;AAEA;;AAEA;AACA;AACA,8FAAgC,sDAAsD;AACtF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACXD;AACA;;AAEA;;AAEA;AACA;AACA,8FAAgC,sDAAsD;AACtF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACXD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,8FAAgC,gFAAgF;AAChH;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACdD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,8FAAgC,yDAAyD;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;AC1CD;AACA;;AAEA;;AAEA;AACA;AACA,8FAAgC,sDAAsD;AACtF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACXD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,CAAC;AACD;AACA;;AAEA;;AAEA;AACA;AACA,8FAAgC,+CAA+C;AAC/E;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;AC5BD;AACA;AACA;;;;;;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,8FAAgC,yDAAyD;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,uBAAuB;AACtC;AACA;AACA;AACA;AACA;AACA,2BAA2B,6BAA6B;AACxD;AACA;AACA;AACA;AACA;AACA,mBAAmB,2CAA2C;AAC9D,KAAK;AACL,uCAAuC,iBAAiB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iBAAiB;AAChC;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;AChED;AACA;AACA;;;;;;;;;;;;ACFA;AACA;AACA;;;;;;;;;;;;ACFA;AACA;AACA;;;;;;;;;;;;;ACFA;AACA;AACA;AACA;AACA,yBAAyB,mEAAmE;AAC5F,CAAC;;;;;;;;;;;;ACLD;AACA;AACA;;;;;;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD;AACpD,KAAK;AACL;AACA,oCAAoC,cAAc,OAAO;AACzD,qCAAqC,cAAc,OAAO;AAC1D;AACA;AACA;AACA;AACA,iBAAiB,YAAY;AAC7B;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,oCAAoC,EAAE;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC1EA;AACA;AACA,8FAAgC,+BAA+B,GAAG,4BAA4B;;;;;;;;;;;;ACF9F;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA,CAAC;;;;;;;;;;;;ACJD;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA,CAAC;;;;;;;;;;;;ACJD;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACPD;AACA;;AAEA;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACTD;AACA;AACA,8FAAgC,+BAA+B,GAAG,qCAAqC;;;;;;;;;;;;ACFvG;AACA;AACA,8FAAgC,+BAA+B,GAAG,sCAAsC;;;;;;;;;;;;ACFxG;;AAEA;AACA;AACA,8FAAgC,wEAAwE;AACxG;AACA,CAAC;;;;;;;;;;;;ACND;;AAEA;AACA;AACA,8FAAgC,oEAAoE;AACpG;AACA,CAAC;;;;;;;;;;;;;ACND;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA,8FAAgC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,CAAC,GAAG;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,CAAC;;;;;;;;;;;;;ACpHD;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC;AAChC;AACA;AACA,CAAC;AACD;AACA,2BAA2B;AAC3B,CAAC,GAAG;AACJ;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACnBD;;AAEA;AACA;AACA,8FAAgC,iEAAiE,GAAG,iBAAiB;;;;;;;;;;;;ACJrH;AACA;AACA;AACA;AACA,CAAC,GAAG,qHAAgD;;;;;;;;;;;;;ACJpD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gGAAkC,gDAAgD;AAClF;AACA,iDAAiD,+DAA+D;AAChH;AACA,GAAG;AACH;;;;;;;;;;;;ACdA;;AAEA;AACA;AACA,8FAAgC,yEAAyE;AACzG;AACA,CAAC;;;;;;;;;;;;ACND;;AAEA;AACA;AACA,8FAAgC,yEAAyE;AACzG;AACA,CAAC;;;;;;;;;;;;;ACND;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gGAAkC,gDAAgD;AAClF;AACA,iDAAiD,+DAA+D;AAChH;AACA,GAAG;AACH;;;;;;;;;;;;ACdA;;AAEA;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACRD;AACA;AACA;AACA;AACA,kIAAqE,iBAAiB,EAAE;;AAExF;AACA;AACA,8FAAgC,6EAA6E;AAC7G;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACZD;AACA;;AAEA;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;;;;;;;;;;;;ACbD;AACA;AACA;AACA,kIAAqE,mCAAmC,EAAE;AAC1G;;AAEA;AACA;AACA,8FAAgC,mEAAmE;AACnG;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACZD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,mDAAmD;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACtBD;AACA,kIAAqE,+BAA+B,EAAE;;AAEtG;AACA;AACA,8FAAgC,4DAA4D;AAC5F;AACA,CAAC;;;;;;;;;;;;ACPD;AACA;AACA;AACA,kIAAqE,yBAAyB,EAAE;;AAEhG;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACbD;AACA;AACA,kIAAqE,uBAAuB,EAAE;;AAE9F;AACA;AACA,8FAAgC,4DAA4D;AAC5F;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACVD;AACA;AACA,kIAAqE,mBAAmB,EAAE;;AAE1F;AACA;AACA,8FAAgC,4DAA4D;AAC5F;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACVD;AACA;AACA,kIAAqE,mBAAmB,EAAE;;AAE1F;AACA;AACA,8FAAgC,4DAA4D;AAC5F;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACVD;AACA;AACA,8FAAgC,+BAA+B,GAAG,2GAAyC;;;;;;;;;;;;ACF3G;AACA;AACA,kIAAqE,eAAe,EAAE;;AAEtF;AACA;AACA,8FAAgC,4DAA4D;AAC5F;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gGAAkC,gDAAgD;AAClF;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;;;;;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gGAAkC,gDAAgD;AAClF;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;;;;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA,kIAAqE,4BAA4B,EAAE;;AAEnG;AACA;AACA,8FAAgC,6EAA6E;AAC7G;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACZD;AACA;AACA;AACA;AACA,kIAAqE,eAAe,EAAE;;AAEtF;AACA;AACA,8FAAgC,6EAA6E;AAC7G;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACZD;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA,CAAC;;;;;;;;;;;;ACJD;AACA;;AAEA;AACA;AACA;AACA,2IAA2E,eAAe;AAC1F;;;;;;;;;;;;ACPA;;AAEA;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACRD;AACA;AACA;AACA;AACA,yBAAyB,mEAAmE;AAC5F,CAAC;;;;;;;;;;;;;ACLD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;;AAEA;AACA;AACA,8FAAgC,gCAAgC;AAChE;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACTD;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,8FAAgC,kEAAkE;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACtBD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACVD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,8FAAgC,yDAAyD;AACzF,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC;;;;;;;;;;;;;ACxBD;AACA;AACA;;AAEA;;AAEA;AACA;AACA,8FAAgC,kEAAkE;AAClG;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACbD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA,UAAU;AACV,CAAC;;;;;;;;;;;;;AC3BD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC/CA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,oDAAoD;AACpF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,oDAAoD;AACpF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACVD;AACA;;AAEA;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC;;;;;;;;;;;;ACjBD;AACA;AACA,8FAAgC,gCAAgC;AAChE;AACA,CAAC;;;;;;;;;;;;;ACJD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB,oBAAoB;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,mBAAmB;AAC5C;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;;;;;;;;;;;;AChIA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACrCA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,iCAAiC,EAAE;;AAExE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iFAAiF;AACjF;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,2BAA2B,mBAAmB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;;;;;;;;;;;;ACzIA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,kEAAkE;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;AClBD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED,sBAAsB,qBAAqB;AAC3C;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA,CAAC;;;;;;;;;;;;;ACbD;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED,sBAAsB,sBAAsB;AAC5C;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA,CAAC;;;;;;;;;;;;;ACbD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gDAAgD;AAChF;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACVD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mDAAmD;AACnD,sBAAsB,yCAAyC,WAAW,IAAI;AAC9E,GAAG;AACH,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,CAAC;AACD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2FAA2F;AAC3F;AACA,KAAK;AACL;AACA,iCAAiC,iDAAiD;AAClF,KAAK;AACL,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA8E,kCAAkC;AAChH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,gFAAgF,eAAe;AAC/F;AACA;;AAEA;AACA;AACA;AACA;;AAEA,SAAS,yEAAyE,GAAG,kBAAkB;;AAEvG,qEAAqE,6BAA6B;AAClG;AACA;;AAEA,SAAS,qDAAqD;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,0BAA0B,mBAAmB,EAAE;AAC/C,0BAA0B,oBAAoB;AAC9C,CAAC;;AAED,SAAS,2EAA2E;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED,SAAS,uDAAuD;AAChE;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,4BAA4B,YAAY,QAAQ;AAChD;AACA,iDAAiD;AACjD,CAAC,GAAG;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;ACpRA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;;;;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;;;;;;;;;;;;ACxBA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACXD;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC;;;;;;;;;;;;;AClBD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACxBD;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;AClBD;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;AClBD;AACA;AACA,8FAAgC,4BAA4B;AAC5D;AACA,CAAC;;;;;;;;;;;;;ACJD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,oIAAqE;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;;;;;;;;;;;;;ACpBD;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACjBD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,oIAAqE;AACrG;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;;;;;;;;;;;;;AChBD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;AChBD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACxBD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACxBD;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;AClBD;AACA;AACA,8FAAgC,4BAA4B;AAC5D;AACA,CAAC;;;;;;;;;;;;;ACJD;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACzBD;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC;;;;;;;;;;;;;AClBD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;AClBD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,+BAA+B;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;AC3BD;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACTD;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACTD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;;;;;;;;;;;;;ACnBD;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC;;;;;;;;;;;;;ACjBD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACvBD;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACjBD;AACA;AACA,8FAAgC,4BAA4B;AAC5D;AACA,CAAC;;;;;;;;;;;;;ACJD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;;;;;;;;;;;;;ACpBD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC;;;;;;;;;;;;;AChBD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC;;;;;;;;;;;;;ACvBD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC;;;;;;;;;;;;;AChBD;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;AChBD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACvBD;AACA;AACA,8FAAgC,4BAA4B;AAC5D;AACA,CAAC;;;;;;;;;;;;;ACJD;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACxBD;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC;;;;;;;;;;;;;ACjBD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;;;;;;;;;;;;;ACpBD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,iJAAkF;AAClH;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;AChBD;AACA;;AAEA;AACA;AACA,8FAAgC,gCAAgC;AAChE;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;ACTD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;AACD;AACA,0BAA0B;AAC1B;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gCAAgC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;;;;;;;;;;;;ACtFA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8FAAgC,gCAAgC;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACrBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC5BA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;AChHA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UACA;AACA,CAAC,qBAAqB;;AAEtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;AAIA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,gFAAgF;;AAEhF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAA0B,sBAAsB;;AAEhD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB,SAAS;AAC1B;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA,CAAC;AACD;AACA,CAAC;AACD;AACA,CAAC;AACD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA,UAAU,IAAI;AACd;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,uBAAuB;;AAEvB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iBAAiB,wBAAwB;AACzC;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA,mBAAmB,6CAA6C;AAChE;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;;AAEA;AACA;AACA,UAAU,MAAM;AAChB,UAAU,OAAO;AACjB;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAU,MAAM;AAChB;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA,qBAAqB,YAAY;AACjC;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;;AAEA;AACA;AACA,UAAU,IAAI;AACd;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;;AAEA;AACA,UAAU,SAAS;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,UAAU,SAAS;AACnB,UAAU,SAAS;AACnB;AACA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,UAAU,SAAS;AACnB;AACA,WAAW;AACX;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;;AAEA;AACA,YAAY,SAAS;AACrB,aAAa;AACb;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA,SAAS;AACT,OAAO;AACP;;AAEA;AACA;;AAEA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,CAAC;;;;AAID;;;;;;;;;;;;;;AC9pCA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,EAAE;AACb,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,aAAa;AACxB,WAAW,gBAAgB;AAC3B,WAAW,SAAS;AACpB,WAAW,EAAE;AACb,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,aAAa;AACxB,WAAW,gBAAgB;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yDAAyD,OAAO;AAChE;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC,SAAS;AAClD;AACA;;AAEA;AACA,GAAG;AACH;AACA;;AAEA,eAAe,YAAY;AAC3B;;AAEA;AACA,2DAA2D;AAC3D,+DAA+D;AAC/D,mEAAmE;AACnE,uEAAuE;AACvE;AACA,0DAA0D,SAAS;AACnE;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B,WAAW,SAAS;AACpB,WAAW,EAAE;AACb,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B,WAAW,SAAS;AACpB,WAAW,EAAE;AACb,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B,WAAW,SAAS;AACpB,WAAW,EAAE;AACb,WAAW,QAAQ;AACnB,aAAa,aAAa;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,2DAA2D,YAAY;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,gBAAgB;AAC3B,aAAa,aAAa;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC/UA;AAAA,eAAe,IAAI,GAAG,IAAI,aAAa,IAAI;AAC3C;AACA;AACA,uBAAuB,EAAE;AACzB,sBAAsB,EAAE;AACxB;AACA;AACA;AACA;AACA,qCAAqC,SAAS;AAC9C;AACA;AACA;AACA;AACA,sCAAsC;AACtC,uDAAuD,wBAAwB,EAAE;AACjF;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA,mCAAmC,oBAAoB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,yBAAyB,SAAS;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,kCAAkC,EAAE;AAC/D,4BAA4B,+BAA+B,EAAE;AAC7D;AACA;AACA,KAAK;AACL,2BAA2B,iCAAiC,EAAE;AAC9D,4BAA4B,8BAA8B,EAAE;AAC5D;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,2BAA2B,uCAAuC,EAAE;AACpE,4BAA4B,oCAAoC,EAAE;AAClE;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,8BAA8B,sCAAsC,EAAE;AACtE,2BAA2B,8CAA8C,EAAE;AAC3E,4BAA4B,2CAA2C,EAAE;AACzE,2BAA2B,mCAAmC,EAAE;AAChE,4BAA4B,gCAAgC,EAAE;AAC9D,2BAA2B,qCAAqC,EAAE;AAClE,4BAA4B,kCAAkC,EAAE;AAChE,2BAA2B,qCAAqC,EAAE;AAClE,4BAA4B,kCAAkC,EAAE;AAChE;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,6BAA6B,0CAA0C,EAAE;AACzE;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,eAAe;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,wBAAwB,EAAE;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,iBAAiB,EAAE;AAC/D,iDAAiD,gBAAgB,EAAE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,mCAAmC;AAC9E;AACA;AACA;AACA,WAAW,YAAY;AACvB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA,0BAA0B,+BAA+B;AACzD,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,+CAA+C;AAC/C;AACA;AACA;AACA,KAAK;AACL;AACA,6CAA6C,yBAAyB,EAAE;AACxE;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,KAAK;AAChB,aAAa,UAAU;AACvB;AACA;AACA,0BAA0B,WAAW;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,uDAAuD,yBAAyB,EAAE;AAClF;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA,mBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,SAAS;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACQ;AACR;;;;;;;;;;;;ACjYA;AACA;;AAEA,iBAAiB,aAAa,0MAA0M,mBAAmB,aAAa,oBAAoB,4FAA4F,gBAAgB,qMAAqM,iBAAiB,4FAA4F,gBAAgB,uWAAuW,iBAAiB,iIAAiI,iBAAiB,uEAAuE,iBAAiB,4BAA4B,eAAe,gIAAgI,iBAAiB,OAAO,iIAAiI,IAAI,mmBAAmmB,0BAA0B,4CAA4C,4CAA4C,4CAA4C,4CAA4C,4CAA4C,0CAA0C,yEAAyE,0CAA0C,0CAA0C,0CAA0C,0CAA0C,0CAA0C,0CAA0C,yCAAyC,uEAAuE,6RAA6R,IAAI,yBAAyB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OAAO;AACpB,cAAc,QAAQ;AACtB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,cAAc,EAAE;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,aAAa,MAAM;AACnB,aAAa,EAAE;AACf,aAAa,cAAc;AAC3B;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,aAAa,EAAE;AACf,aAAa,SAAS;AACtB,cAAc,EAAE;AAChB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,aAAa,cAAc;AAC3B,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA,mCAAmC;AACnC,6BAA6B;AAC7B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B,iCAAiC;AACjC,sCAAsC,yCAAyC;AAC/E,8BAA8B;AAC9B,oCAAoC;AACpC,+BAA+B;AAC/B,0BAA0B;AAC1B,gCAAgC;AAChC,4BAA4B;AAC5B,sCAAsC;;AAEtC;AACA;AACA;AACA;AACA,eAAe;AACf,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,MAAM;;AAExB;AACA,cAAc;;AAEd;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL,eAAe,MAAM;AACrB;AACA;AACA,KAAK;AACL,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA,KAAK;AACL,oBAAoB,MAAM;AAC1B;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,iDAAiD;AACjD;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA,eAAe,qBAAqB;AACpC,iBAAiB,6BAA6B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,0BAA0B;AAC3C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,iBAAiB,yCAAyC;AAC1D,YAAY,0CAA0C,GAAG;AACzD;AACA;AACA;AACA,kBAAkB,6BAA6B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,mEAAmE;AACnF;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,yCAAyC,oBAAoB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,8BAA8B;AAC3C;AACA;AACA,UAAU,yCAAyC,oBAAoB;AACvE;AACA;AACA,YAAY,yCAAyC,GAAG;AACxD;AACA;AACA,YAAY,2BAA2B;AACvC;AACA;AACA;AACA,YAAY,oDAAoD;AAChE;AACA,WAAW,mEAAmE;AAC9E;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,yCAAyC,oBAAoB;AACrE;AACA,YAAY,yDAAyD;AACrE;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL,UAAU,yCAAyC,oBAAoB;AACvE;;AAEA,UAAU,8BAA8B;AACxC;AACA;;AAEA,SAAS,kEAAkE;AAC3E,UAAU,0CAA0C,GAAG;;AAEvD;AACA;AACA,WAAW,yDAAyD;AACpE,YAAY,+DAA+D;AAC3E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,YAAY,yDAAyD;;AAErE;AACA,UAAU;AACV,GAAG;;AAEH;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA,kBAAkB,OAAO;AACzB,kBAAkB,OAAO;AACzB,kBAAkB,OAAO;AACzB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd,kBAAkB,sBAAsB;AACxC,kBAAkB,sBAAsB;AACxC,kBAAkB,sBAAsB;AACxC,kBAAkB,sBAAsB;AACxC,kBAAkB,sBAAsB;AACxC,kBAAkB,sBAAsB;AACxC,kBAAkB,sBAAsB;AACxC,kBAAkB,sBAAsB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;;AAGL;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,sBAAsB;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AACD;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,UAAU,SAAS;AACnB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA,aAAa,sBAAsB;AACnC;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAU,mBAAmB;AAC7B;AACA;;AAEA;AACA;AACA;AACA;;AAEA,UAAU,mBAAmB;AAC7B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA,aAAa,sBAAsB;AACnC;AACA,aAAa,QAAQ;AACrB;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;AAGA,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mCAAmC;AACnC,gBAAgB;AAChB;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;;AAEA;AACA;AACA,2CAA2C;;AAE3C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB,aAAa,OAAO,4CAA4C;AAChE,aAAa,OAAO;AACpB;AACA,aAAa,QAAQ;AACrB;AACA,aAAa,sBAAsB;AACnC;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;;AAEA,UAAU,SAAS;AACnB;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,cAAc;AAC3B,aAAa,OAAO;AACpB;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,6BAA6B;;AAE7B;AACA,CAAC;AACD;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,2BAA2B,mCAAmC;AAC9D;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,gBAAgB;AAC9B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;;;AAGL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA,aAAa,uBAAuB;AACpC;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,sBAAsB;AACtC,gBAAgB,iBAAiB;AACjC,gBAAgB,eAAe;AAC/B;;;AAGA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,uBAAuB;AACpC;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,kBAAkB;AAClB;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,6BAA6B;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,aAAa,OAAO;AACpB,aAAa,sBAAsB;AACnC,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,0BAA0B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,CAAC;AACD;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B;AACA,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,cAAc,aAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,gBAAgB,aAAa;AAC7B;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;;AAEA;AACA,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,eAAe;AAC/B;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,cAAc,aAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,gBAAgB,aAAa;AAC7B;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,eAAe;AAC9B,gBAAgB,eAAe;AAC/B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,sBAAsB;AACrC,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,gBAAgB,oBAAoB;AACpC;AACA,eAAe,cAAc;AAC7B,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,qBAAqB;AACpC,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;;AAEA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,qBAAqB;AACpC,gBAAgB,cAAc;AAC9B;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,qBAAqB;AACpC,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,qBAAqB;AACrC;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA,CAAC;AACD;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,aAAa;AAC1B;AACA;AACA,aAAa,gBAAgB;AAC7B;AACA;AACA;;AAEA;AACA;AACA,2BAA2B;AAC3B;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,6DAA6D,gBAAgB;AAC7E;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB,OAAO;AACvB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,EAAE;AAClB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,eAAe,EAAE;AACjB,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,aAAa;AAC7B;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,OAAO;AACvB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,aAAa;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,YAAY,SAAS;AACrB;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAc,SAAS;AACvB;AACA;AACA,OAAO;AACP,cAAc,SAAS;AACvB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,oBAAoB;AACpC;AACA,aAAa,OAAO;AACpB,aAAa,uBAAuB;AACpC,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA,CAAC;AACD;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,eAAe;AAC/B;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,eAAe;AAC9B,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,4BAA4B;AAC5B;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,qBAAqB;AACzC;AACA,aAAa,OAAO;AACpB,cAAc,cAAc;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AACD;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,UAAU;AACV;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;;AAEA;;AAEA;;AAEA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAU;AACV;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA,OAAO;;AAEP;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,YAAY;AAC1B;AACA;AACA;AACA;;AAEA;AACA,CAAC;AACD;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,WAAW;AACxB,aAAa,WAAW;AACxB,aAAa,eAAe;AAC5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,kBAAkB;AACtC;AACA,aAAa,OAAO;AACpB,aAAa,cAAc;AAC3B,cAAc,YAAY;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA,aAAa,OAAO;AACpB,aAAa,WAAW;AACxB,aAAa,WAAW;AACxB,aAAa,eAAe;AAC5B,cAAc,YAAY;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,qBAAqB;AAClC,aAAa,cAAc;AAC3B,aAAa,QAAQ;AACrB,cAAc,YAAY;AAC1B;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;;;;AAIA;AACA,qCAAqC,IAAI;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,qBAAqB,8BAA8B,MAAM,gCAAgC;AACzF;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,cAAc;AAC9B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,cAAc;AAC7B,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,cAAc;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,oBAAoB;AACxC;AACA,aAAa,OAAO;AACpB,cAAc,cAAc;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,cAAc,cAAc;AAC5B;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;;;;AAIA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,aAAa,sBAAsB;AACnC,aAAa,sBAAsB;AACnC;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,sBAAsB;AACrC,eAAe,sBAAsB;AACrC;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,UAAU;AACzB,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,oCAAoC;;AAEpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,cAAc,mBAAmB;AACjC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,UAAU;AACvB,aAAa,cAAc;AAC3B,aAAa,cAAc;AAC3B,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,sBAAsB;AACnC,aAAa,sBAAsB;AACnC;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC;AAChC;AACA,CAAC;AACD;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,eAAe;AAC/B;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA,eAAe,6BAA6B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,eAAe;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,CAAC;AACD;AACA;AACA;AACA;;;;AAIA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA,aAAa,cAAc;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,mCAAmC,8BAA8B;AACjE;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,cAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA,eAAe,MAAM;AACrB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB;AACA,eAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA,eAAe,mBAAmB;AAClC;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO,QAEP;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,OAAO;AACvB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,eAAe,kBAAkB;AACjC,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,kBAAkB;AACjC,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,UAAU;AACzB,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,cAAc;AAC7B,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,cAAc;AAC7B,eAAe,cAAc;AAC7B,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,QAAQ;AACvB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,YAAY,SAAS;AACrB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,qCAAqC,+BAA+B;AACpE,aAAa,OAAO;AACpB,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,eAAe;AAC5B,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,eAAe;AAC5B,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,mBAAmB;AAChC,cAAc,UAAU;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;;;;AAIA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,6BAA6B;AAC1C,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,eAAe;AAC/B;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,cAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,4BAA4B;AACzC,aAAa,QAAQ;AACrB,aAAa,mBAAmB;AAChC,aAAa,WAAW;AACxB,aAAa,QAAQ;AACrB,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,MAAM;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA,eAAe,OAAO;AACtB,eAAe,aAAa;AAC5B;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,MAAM;AACrB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,iBAAiB,sBAAsB;AACvC;AACA;AACA;AACA;AACA;AACA,QAAQ,mCAAmC;AAC3C;AACA,eAAe,UAAU;AACzB,eAAe,UAAU;AACzB,gBAAgB,UAAU;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,4BAA4B;AAC3C,eAAe,QAAQ;AACvB,eAAe,mBAAmB;AAClC,eAAe,WAAW;AAC1B,eAAe,QAAQ;AACvB,eAAe,gBAAgB;AAC/B,eAAe,gBAAgB;AAC/B,eAAe,gBAAgB;AAC/B,eAAe,gBAAgB;AAC/B,eAAe,gBAAgB;AAC/B,eAAe,gBAAgB;AAC/B,eAAe,gBAAgB;AAC/B,eAAe,gBAAgB;AAC/B,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,mBAAmB;AAChC;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,mBAAmB;AAChC;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,oBAAoB,iBAAiB;AACrC;AACA,aAAa,OAAO;AACpB,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA,aAAa,OAAO;AACpB,aAAa,4BAA4B;AACzC,aAAa,QAAQ;AACrB,aAAa,mBAAmB;AAChC,aAAa,WAAW;AACxB,aAAa,QAAQ;AACrB,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B,aAAa,gBAAgB;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB;AACA,cAAc,WAAW;AACzB;AACA;AACA;;AAEA;AACA;AACA,gCAAgC;AAChC;;AAEA,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,cAAc,yBAAyB;AACvC;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM,0BAA0B;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,WAAW;AACxB,aAAa,UAAU;AACvB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,QAAQ,8BAA8B;AACtC,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA,iCAAiC,iCAAiC;AAClE,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA,yBAAyB,8BAA8B;AACvD,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,WAAW;AAC1B,eAAe,UAAU;AACzB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,eAAe,MAAM;AACrB;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,YAAY,eAAe;AAC3B;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,2CAA2C,cAAc,EAAE;AAC3D,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAAS;AACxB;AACA;AACA;AACA,qBAAqB;AACrB;;AAEA;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,iBAAiB;AAC7C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA,2BAA2B,oBAAoB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yCAAyC,oBAAoB;AAC7D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,eAAe,mBAAmB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA,qBAAqB,SAAS;AAC9B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,8BAA8B,wCAAwC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,sBAAsB;AAC3D;AACA;AACA;;AAEA,6BAA6B,iDAAiD;AAC9E;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B,oBAAoB;AACjD;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,+BAA+B;AAChE;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kDAAkD,oBAAoB;AACtE;AACA;AACA,eAAe;AACf;;AAEA;AACA;AACA;AACA,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,cAAc,EAAE,EAAE;AACzD,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,uCAAuC,qBAAqB;AAC5D;AACA;;AAEA,SAAS;AACT;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,qBAAqB,mBAAmB;AACxC,uBAAuB,OAAO;AAC9B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,CAAC;AACD;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA,aAAa,UAAU;AACvB;AACA,aAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,QAAQ,sCAAsC;AAC9C;AACA,eAAe,OAAO;AACtB;AACA,eAAe,UAAU;AACzB;AACA,eAAe,gBAAgB;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,eAAe,eAAe;AAC9B,eAAe,OAAO;AACtB,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,YAAY,SAAS;AACrB;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,eAAe;AAC9B;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,cAAc,SAAS;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,gBAAgB,oBAAoB;AACpC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAY,eAAe;AAC3B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AACD;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM,iBAAiB;AACvB;AACA;AACA;AACA,aAAa,gBAAgB;AAC7B,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB;AACA,aAAa,iCAAiC;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,0BAA0B;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,UAAU;AACzB,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA,mCAAmC;AACnC;AACA,iBAAiB,OAAO;AACxB;AACA,kBAAkB,UAAU;AAC5B,kBAAkB,WAAW;AAC7B,kBAAkB,UAAU;AAC5B,kBAAkB,UAAU;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA,uBAAuB,mCAAmC;AAC1D;AACA,eAAe,UAAU;AACzB,gBAAgB,6BAA6B;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB,gBAAgB,oBAAoB;AACpC;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,QAAQ,sBAAsB;AAC9B;AACA,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,SAAS;AACrB;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;;AAGL;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,YAAY,sBAAsB;AAClC,cAAc;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA,8CAA8C,sBAAsB;AACpE,cAAc;AACd;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,UAAU;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;AACD;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,wDAAwD;;AAExD;AACA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA,wDAAwD;;AAExD;AACA;AACA;AACA;AACA,eAAe,cAAc;AAC7B;AACA,iEAAiE;;AAEjE;AACA;AACA;AACA;AACA,eAAe,WAAW;AAC1B;AACA,8DAA8D;;AAE9D;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,6BAA6B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,YAAY,SAAS;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;;;;;;;;;;;;AC5xSD;AACA;AACA;AACA,QAKA;AACA,CAAC;AACD,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,cAAc;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,0BAA0B,EAAE;AAC/D,yCAAyC,eAAe;AACxD;AACA;AACA;AACA;AACA;AACA,8DAA8D,+DAA+D;AAC7H;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA,aAAa,uBAAuB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,qCAAqC,UAAU;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;;AAEA,qCAAqC,UAAU;AAC/C;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,OAAO;AACP;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,aAAa,mBAAmB;AAChC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,OAAO;AACP;AACA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,iBAAiB,mCAAmC;AACpD,iBAAiB,mCAAmC;AACpD,iBAAiB,mCAAmC;AACpD,iBAAiB,mCAAmC;AACpD,iBAAiB;AACjB;AACA,GAAG;;AAEH;AACA;AACA,wCAAwC,uBAAuB,yBAAyB;AACxF;AACA;AACA,wCAAwC,6BAA6B,eAAe;AACpF;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,yBAAyB,aAAa;AACtC;AACA,yBAAyB,WAAW;AACpC,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,qCAAqC,UAAU;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,eAAe,yBAAyB;AACxC;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC,4BAA4B,+CAA+C;AAC3E;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;;;AAGA,OAAO;AACP;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,6BAA6B;;AAE7B;;AAEA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH,qCAAqC,qBAAqB,kBAAkB;AAC5E,qCAAqC,sBAAsB,eAAe,EAAE;AAC5E,qCAAqC,sBAAsB,cAAc,GAAG;AAC5E,qCAAqC,2BAA2B,YAAY;;AAE5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH,sCAAsC;AACtC;AACA,UAAU,UAAU;AACpB;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;;;AAGA,OAAO;AACP;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,8CAA8C,iEAAiE;AAC/G,8CAA8C,iEAAiE;AAC/G,8CAA8C,iEAAiE;AAC/G,8CAA8C,iEAAiE;AAC/G,8CAA8C,iEAAiE;AAC/G,8CAA8C,iEAAiE;AAC/G,8CAA8C,iEAAiE;AAC/G,8CAA8C,iEAAiE;AAC/G,8CAA8C,iEAAiE;AAC/G;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,yBAAyB;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,OAAO;AACP;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA,CAAC,E;;;;;;;;;;;AC5pBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAKA;AACA,CAAC;AACD,oCAAoC;AACpC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;;AAEA,kCAAkC,2CAA2C,gBAAgB,kBAAkB,OAAO,2BAA2B,wDAAwD,gCAAgC,uDAAuD,2DAA2D,EAAE,EAAE,yDAAyD,qEAAqE,6DAA6D,oBAAoB,GAAG,EAAE;;AAEnjB,4CAA4C,kBAAkB,kCAAkC,qEAAqE,EAAE,EAAE,OAAO,kBAAkB,EAAE,YAAY;;AAEhN,kDAAkD,0CAA0C,0DAA0D,EAAE;;AAExJ;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kEAAkE;AAClE;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,kBAAkB;;AAElB;;AAEA;AACA;AACA,8CAA8C;AAC9C;AACA,sBAAsB;AACtB,oBAAoB;AACpB;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,oBAAoB;AACpB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA,wBAAwB;AACxB,sBAAsB;AACtB,oBAAoB;AACpB;AACA;AACA,oBAAoB;AACpB,kBAAkB;AAClB;AACA;AACA;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA,YAAY;;AAEZ;AACA,UAAU;AACV;AACA,UAAU;AACV,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,YAAY;AACZ,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA,gBAAgB;;AAEhB;;AAEA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA,sBAAsB;AACtB;AACA,sBAAsB;AACtB,oBAAoB;AACpB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA,sBAAsB;AACtB;AACA;AACA,oBAAoB;AACpB;AACA,kBAAkB;AAClB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA,8CAA8C;AAC9C;AACA;AACA,wBAAwB;AACxB,sBAAsB;AACtB,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA,sBAAsB;AACtB;AACA,oBAAoB;AACpB,kBAAkB;AAClB,gBAAgB;AAChB;AACA,4CAA4C;AAC5C;AACA;AACA,sBAAsB;AACtB;AACA,sBAAsB;AACtB,oBAAoB;AACpB,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB,oBAAoB;AACpB;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,UAAU;AACV,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,UAAU;AACV,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ,UAAU;AACV,QAAQ;AACR;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA,IAAI;;AAEJ;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA,OAAO;AACP;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;;;;AAIA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;;;;AAIA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;;;;AAIA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;AAIA;AACA;AACA,CAAC;AACD,C;;;;;;;;;;;AChpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAKA;AACA,CAAC;AACD,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAuC,uCAAuC,gBAAgB;;AAE9F;AACA;AACA;AACA;AACA,8CAA8C,MAAM;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF,qGAAqG,mBAAmB,EAAE,mBAAmB,8HAA8H;;AAE3Q,iCAAiC,2CAA2C,gBAAgB,kBAAkB,OAAO,2BAA2B,wDAAwD,gCAAgC,uDAAuD,2DAA2D,EAAE,EAAE,yDAAyD,qEAAqE,6DAA6D,oBAAoB,GAAG,EAAE,GAAG;;;AAGrjB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAuC,uCAAuC,gBAAgB;;AAE9F,kDAAkD,0CAA0C,0DAA0D,EAAE;;AAExJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;AAChC,YAAY;AACZ;AACA,YAAY;AACZ,gCAAgC;AAChC,YAAY;AACZ;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;;AAER;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA,MAAM;AACN;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;;AAEN;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ;AACA;AACA,sEAAsE,aAAa;AACnF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,eAAe;AAC1F;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;;AAEA;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF,qGAAqG,mBAAmB,EAAE,mBAAmB,8HAA8H,GAAG;;AAE9Q;AACA;AACA;;;AAGA;;AAEA;;AAEA,uCAAuC,uCAAuC,gBAAgB;;AAE9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA,oBAAoB;AACpB,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,YAAY;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;;AAEA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,wEAAwE,aAAa;AACrF;AACA;;AAEA;AACA;AACA,0BAA0B,sBAAsB;AAChD;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR,+CAA+C;AAC/C,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA,oCAAoC;AACpC;;AAEA;AACA;AACA;AACA;;AAEA;AACA,qEAAqE,eAAe;AACpF;AACA;;AAEA;AACA,uCAAuC,GAAG;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,yEAAyE,eAAe;AACxF;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,kBAAkB;AACxC,uCAAuC,0BAA0B;AACjE;AACA,UAAU;AACV;AACA;AACA,uCAAuC,0BAA0B;AACjE,YAAY;AACZ;AACA;AACA;AACA;AACA,MAAM,UAAU,yBAAyB;AACzC,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,eAAe;AACf,MAAM;AACN;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,kJAAkJ,yBAAyB;AAC3K,cAAc;AACd;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB,gBAAgB;AAChB;AACA;AACA;AACA,kBAAkB;AAClB;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,4KAA4K,yBAAyB;AACrM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iFAAiF,eAAe;AAChG;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF,kDAAkD,0CAA0C,0DAA0D,EAAE;;AAExJ,kDAAkD,aAAa,uFAAuF,EAAE,uFAAuF;;AAE/O,2CAA2C,+DAA+D,qGAAqG,EAAE,yEAAyE,eAAe,yEAAyE,EAAE,EAAE,uHAAuH;;AAE7e;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO;AACP;AACA;;AAEA;AACA;AACA,YACA;AACA,EAAE,oBAAoB;;AAEtB;AACA;AACA,cAAc,MAAM;AACpB,cAAc,SAAS;AACvB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,MAAM;AACpB,cAAc,SAAS;AACvB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAE;AACF;;AAEA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;;AAIA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;;;;AAIA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,wCAAwC;AACxC,oBAAoB,YAAY,EAAE;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;;AAEA;AACA,MAAM;;AAEN;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,oBAAoB;AAC1C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,yBAAyB;AACzB,2BAA2B;AAC3B,2BAA2B;AAC3B;AACA;AACA;AACA;;AAEA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;;AAEN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB,0BAA0B;AAC9C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;;AAEA,EAAE;;;AAGF,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA,OAAO;AACP;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;;;;AAIA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;;;;AAIA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;AAKA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA,OAAO;AACP;AACA;;;;AAIA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;;;;AAIA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA,uCAAuC,uCAAuC,gBAAgB;;AAE9F;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;;AAGA,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;;AAGA;AACA;AACA;AACA,MAAM;AACN;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,YAAY;AACZ;AACA;AACA;AACA,QAAQ;AACR;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;;AAGA;AACA;AACA;AACA,sBAAsB,YAAY;AAClC;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI;;AAEJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAuC,uCAAuC,gBAAgB;;AAE9F;AACA;AACA;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,wEAAwE,cAAc;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,UAAU;AACV,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,gFAAgF,yBAAyB,EAAE,QAAQ;AACnH;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA,QAAQ;AACR,wEAAwE,KAAK;AAC7E;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,MAAM;;AAEN;AACA,wCAAwC,QAAQ;AAChD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA,wCAAwC,QAAQ;AAChD;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA,wEAAwE,aAAa;AACrF;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA,yEAAyE,eAAe;AACxF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR,2BAA2B;AAC3B,oBAAoB;AACpB,yBAAyB;AACzB,gBAAgB;AAChB,mBAAmB;AACnB,gBAAgB;AAChB,6BAA6B;AAC7B,oBAAoB;AACpB,0BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6EAA6E,eAAe;AAC5F;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+EAA+E,eAAe;AAC9F;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA,6EAA6E,eAAe;AAC5F;AACA;;AAEA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,MAAM;;AAEN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;;AAGA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;;AAGA;AACA,kBAAkB,gCAAgC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAuC,uCAAuC,gBAAgB;;AAE9F;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA,gBAAgB;AAChB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;;AAEZ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA+B,IAAI,IAAI;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,QAAQ;AACR,MAAM;AACN,IAAI;;AAEJ;AACA;AACA;AACA;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ,mCAAmC,mBAAmB;AACtD,IAAI;AACJ;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,qCAAqC;AACrC;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,iCAAiC,mBAAmB;AACpD,IAAI;AACJ;AACA;AACA,gCAAgC,gBAAgB;AAChD;AACA;AACA,IAAI;AACJ;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,oCAAoC,mBAAmB;AACvD,IAAI;AACJ;AACA;AACA,mCAAmC,gBAAgB;AACnD;AACA;AACA,IAAI;AACJ;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,cAAc;AACd;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ,mCAAmC,mBAAmB;AACtD,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,cAAc;AACd;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA,UAAU;;AAEV;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ,oCAAoC,mBAAmB;AACvD,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA,4CAA4C,kBAAkB,kCAAkC,qEAAqE,EAAE,EAAE,OAAO,kBAAkB,EAAE,YAAY;;AAEhN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA,kBAAkB;AAClB;AACA,gBAAgB;AAChB;AACA,kDAAkD;AAClD;AACA,kBAAkB;AAClB;AACA;AACA,cAAc;AACd;AACA;AACA,gBAAgB;AAChB;AACA;AACA,kBAAkB;AAClB;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,QAAQ;;AAER;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR,MAAM;AACN;AACA;AACA,QAAQ;AACR,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ,mCAAmC,mBAAmB;AACtD,IAAI;AACJ;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ,mCAAmC,mBAAmB;AACtD,IAAI;AACJ;;AAEA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,IAAI;AACJ,oCAAoC,mBAAmB;AACvD,IAAI;AACJ;;AAEA;AACA;AACA,CAAC;AACD;AACA;;;;;;;;;;;;AC7kLA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC/BA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC/BA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACNA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACNA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC1BA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACLA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACLA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,EAAE;AACb,WAAW,MAAM;AACjB,aAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,SAAS;AACpB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACxBA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,EAAE;AACb,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,SAAS;AACpB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnBA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACtBA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnBA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC3BA;;AAEA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpBA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;;;;;ACpBA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;;AAEA;;;;;;;;;;;;ACxBA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;;;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AClEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB,WAAW,SAAS;AACpB,aAAa,aAAa;AAC1B;AACA;;AAEA;;;;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACvBA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACrCA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;;AAEA;;;;;;;;;;;;ACfA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACfA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,aAAa;AACxB,aAAa,EAAE;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACvBA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnBA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC3BA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,aAAa;AACxB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,aAAa;AACxB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACZA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,EAAE;AACb,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnBA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACjBA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,WAAW,EAAE;AACb,WAAW,QAAQ;AACnB;AACA;AACA,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AClFA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACXA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oCAAoC;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC9CA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC3DA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC9BA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC7BA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AChCA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB,WAAW,SAAS;AACpB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;;;;;ACrBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,EAAE;AACb,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB,WAAW,6BAA6B;AACxC,WAAW,SAAS;AACpB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL,YAAY;AACZ,GAAG;;AAEH;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;;;;;ACjCA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;;;;;AClBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACbA;;AAEA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACfA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACjBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,aAAa;AACxB,WAAW,EAAE;AACb,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC9CA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;;;;;ACrBA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,SAAS;AACpB,aAAa,MAAM;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnBA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;;;;;ACjBA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACbA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACZA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpBA;;AAEA;AACA;AACA;AACA;AACA,WAAW,YAAY;AACvB,aAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACfA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;;;AClCA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACfA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACxCA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,mBAAmB;AAC9B,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC3CA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnBA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,WAAW,OAAO,WAAW;AAC7B,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA,wBAAwB;;AAExB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACvCA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACLA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;;ACtBA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;;;;;ACpCA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACxBA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC7BA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,GAAG;AACH,CAAC;;AAED;;;;;;;;;;;;ACVA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AClFA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC/GA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACxFA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACfA;AACA;;AAEA;;;;;;;;;;;;;ACHA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACfA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACjBA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACvBA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,EAAE;AACf;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AChBA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACLA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC7CA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACzDA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,EAAE;AACf;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,aAAa;AACxB,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACtCA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AChBA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC7BA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACtBA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACtBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACjBA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnBA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACxBA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,WAAW,EAAE;AACb,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC7BA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACdA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnBA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACjBA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACZA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AClCA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,EAAE;AACf;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;;AClBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACfA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACzBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACjBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,EAAE;AACf;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACfA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACfA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,EAAE;AACb,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnBA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;;;;;;;;;;;ACzBA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACLA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnBA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH,CAAC;;AAED;;;;;;;;;;;;;AC7BA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACdA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnCA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACRA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB,aAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACdA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACbA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;;;;;;;;;;;ACjBA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;;AAEA;;;;;;;;;;;;ACbA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpCA;;AAEA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC3BA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,EAAE;AACf;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACbA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,EAAE;AACb,WAAW,OAAO;AAClB,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACtBA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;;;;;;;;;;;;AC1BA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpBA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;;;;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,SAAS;AACtB;AACA;AACA,wCAAwC,SAAS;AACjD;AACA;AACA,WAAW,SAAS,GAAG,SAAS;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,SAAS,GAAG,SAAS,KAAK,SAAS;AACvD,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;;;;;;;;;;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA,iBAAiB;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpCA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACrBA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,aAAa;AACxB,WAAW,EAAE;AACb,aAAa,EAAE;AACf;AACA;AACA,iBAAiB,QAAQ,OAAO,SAAS,EAAE;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AChCA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;;;;;;;;;;;;ACxCA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,aAAa;AACxB,aAAa,QAAQ;AACrB;AACA;AACA,iBAAiB,OAAO,SAAS;AACjC,yBAAyB,gBAAgB,SAAS,GAAG;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AClCA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,aAAa;AACxB,aAAa,QAAQ;AACrB;AACA;AACA,0BAA0B,gBAAgB,SAAS,GAAG;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,EAAE;AACf;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpBA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA,6BAA6B,kBAAkB,EAAE;AACjD;AACA;AACA;AACA;AACA;AACA,8CAA8C,kBAAkB,EAAE;AAClE;AACA;AACA;;AAEA;;;;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACzBA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AChCA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AChCA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC5BA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC5EA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA,iBAAiB;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AClCA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnCA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpCA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACrBA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC5BA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC7DA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC7BA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC5BA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACrBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACpCA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACnBA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,SAAS;AACtB;AACA;AACA,iBAAiB;AACjB,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;;ACxEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,UAAU;AACrB,aAAa,OAAO;AACpB;AACA;AACA;AACA,YAAY,SAAS,GAAG,SAAS;AACjC;AACA;AACA;AACA,YAAY,SAAS,GAAG,SAAS;AACjC;AACA;AACA;AACA,UAAU,QAAQ,iBAAiB,GAAG,iBAAiB;AACvD;AACA;AACA;AACA,CAAC;;AAED;;;;;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AChBA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,qBAAqB;AAChC,aAAa,OAAO;AACpB;AACA;AACA,iBAAiB;AACjB;AACA;AACA,UAAU;AACV;AACA;AACA,4BAA4B;AAC5B,CAAC;;AAED;;;;;;;;;;;;ACxBA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB,aAAa,SAAS;AACtB;AACA;AACA;AACA,MAAM,OAAO,SAAS,EAAE;AACxB,MAAM,OAAO,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC/BA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACxBA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,aAAa;AACxB,WAAW,yBAAyB;AACpC;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA,MAAM,8BAA8B;AACpC,MAAM,8BAA8B;AACpC,MAAM,8BAA8B;AACpC,MAAM;AACN;AACA;AACA,iCAAiC,eAAe,EAAE;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,CAAC;;AAED;;;;;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACjBA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC7BA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB,UAAU;AACV;AACA,aAAa,SAAS;AACtB,UAAU;AACV;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC/BA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;AC3BA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;ACjCA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB,IAAI;AACJ;AACA;AACA;AACA,WAAW,2BAA2B;AACtC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,OAAO;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B,OAAO;AACpC,OAAO;AACP;AACA,cAAc,OAAO;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,cAAc,OAAO;AACrB;AACA;AACA,mBAAmB,uBAAuB;AAC1C;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA,mBAAmB,2BAA2B,iCAAiC;AAC/E,wBAAwB,4BAA4B;AACpD;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,mBAAmB,8BAA8B;AACjD,6BAA6B,iCAAiC;AAC9D;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,uCAAuC;AACvC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,kCAAkC;AAC/D,gDAAgD;AAChD;AACA;AACA,WAAW,mBAAmB;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB,8BAA8B;AACvD,mCAAmC,sBAAsB;AACzD;AACA;AACA;AACA;AACA,WAAW,mBAAmB;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,SAAS;AACxC,+BAA+B;AAC/B,gCAAgC;AAChC,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;;AAEA;AACA,yBAAyB;AACzB;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AC/XA;AAAA;AACA;AACA,IAAIiE,WAAW,GACb,kEADF;;AAGA,IAAIC,cAAc,GAAG,SAAjBA,cAAiB,CAACC,QAAD,EAAWC,IAAX,EAAoB;AACvC,SAAO,YAAM;AACX,QAAIC,EAAE,GAAG,EAAT,CADW,CAEX;;AACA,QAAIhI,CAAC,GAAG+H,IAAR;;AACA,WAAO/H,CAAC,EAAR,EAAY;AACV;AACAgI,QAAE,IAAIF,QAAQ,CAACpK,IAAI,CAACuK,MAAL,KAAgBH,QAAQ,CAACzJ,MAAzB,GAAkC,CAAnC,CAAd;AACD;;AACD,WAAO2J,EAAP;AACD,GATD;AAUD,CAXD;;AAaA,IAAIE,MAAM,GAAG,SAATA,MAAS,GAAe;AAAA,MAAdH,IAAc,uEAAP,EAAO;AAC1B,MAAIC,EAAE,GAAG,EAAT,CAD0B,CAE1B;;AACA,MAAIhI,CAAC,GAAG+H,IAAR;;AACA,SAAO/H,CAAC,EAAR,EAAY;AACV;AACAgI,MAAE,IAAIJ,WAAW,CAAClK,IAAI,CAACuK,MAAL,KAAgB,EAAhB,GAAqB,CAAtB,CAAjB;AACD;;AACD,SAAOD,EAAP;AACD,CATD;;;;;;;;;;;;;YClBA,yBAAa,2BAA+C,eAAmE,CAA6H,YAAY,yBAAyB,gBAAgB,UAAU,UAAU,0CAA0C,8BAAwB,oBAAoB,8CAA8C,YAAY,YAAY,mCAAmC,iBAAiB,gBAAgB,sBAAsB,oBAAoB,kDAAkD,WAAW,YAAY,SAAS,EAAE,mBAAmB,6BAA6B,aAAa,gBAAgB,uBAAuB,gBAAgB,UAAU,8lBAA8lB,YAAY,WAAW,uEAAuE,8HAA8H,wJAAwJ,SAAS,cAAc,iCAAiC,oCAAoC,sBAAsB,IAAI,yDAAyD,gBAAgB,MAAM,6HAA6H,aAAa,uGAAuG,eAAe,qDAAqD,kBAAkB,QAAQ,kBAAkB,sDAAsD,OAAO,qBAAqB,8BAA8B,eAAe,2CAA2C,qBAAqB,yEAAyE,6CAA6C,WAAW,gEAAgE,uFAAuF,iCAAiC,qBAAqB,sJAAsJ,wBAAwB,6BAA6B,WAAW,6BAA6B,8DAA8D,EAAE,iBAAiB,uCAAuC,+CAA+C,eAAe,sBAAsB,iDAAiD,WAAW,yEAAyE,qBAAqB,EAAE,6BAA6B,mCAAmC,uEAAuE,EAAE,gDAAgD,mBAAmB,6BAA6B,qBAAqB,iCAAiC,oBAAoB,gCAAgC,sBAAsB,+BAA+B,qBAAqB,+BAA+B,uBAAuB,6LAA6L,qBAAqB,iCAAiC,kBAAkB,8BAA8B,kBAAkB,iBAAiB,uBAAuB,sBAAsB,qBAAqB,gCAAgC,yBAAyB,qEAAqE,gCAAgC,4EAA4E,wBAAwB,qEAAqE,0BAA0B,sEAAsE,yBAAyB,sEAAsE,0BAA0B,sEAAsE,yBAAyB,sEAAsE,2BAA2B,uEAAuE,2BAA2B,uEAAuE,0BAA0B,0DAA0D,kBAAkB,qCAAqC,kBAAkB,UAAU,oBAAoB,2CAA2C,kBAAkB,UAAU,oBAAoB,2CAA2C,kBAAkB,sCAAsC,2KAA2K,uBAAuB,sBAAsB,qBAAqB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,iBAAiB,iBAAiB,gBAAgB,iBAAiB,gBAAgB,iBAAiB,gBAAgB,yBAAyB,wBAAwB,2BAA2B,0BAA0B,wBAAwB,uBAAuB,kBAAkB,iBAAiB,qBAAqB,oBAAoB,wBAAwB,uBAAuB,wBAAwB,uBAAuB,sBAAsB,qBAAqB,oBAAoB,mBAAmB,qBAAqB,oBAAoB,qBAAqB,sBAAsB,aAAa,OAAO,yBAAyB,YAAY,iBAAiB,YAAY,iBAAiB,kBAAkB,kBAAkB,iCAAiC,YAAY,oBAAoB,YAAY,iDAAiD,EAAE,mBAAmB,YAAY,+BAA+B,EAAE,uBAAuB,YAAY,gDAAgD,GAAG,uDAAuD,sBAAsB,yCAAyC,gCAAgC,sCAAsC,+BAA+B,0FAA0F,iGAAiG,EAAE,4BAA4B,qBAAqB,6BAA6B,yEAAyE,aAAa,aAAa,cAAc,sBAAsB,+FAA+F,cAAc,cAAc,SAAS,gBAAgB,kFAAkF,eAAe,kGAAkG,QAAQ,YAAY,IAAI,sIAAsI,6JAA6J,cAAc,cAAc,mBAAmB,cAAc,kDAAkD,4BAA4B,qBAAqB,IAAI,6CAA6C,UAAU,wDAAwD,MAAM,yFAAyF,SAAS,kMAAkM,kCAAkC,uCAAuC,IAAI,0FAA0F,sMAAsM,EAAE,mBAAmB,qBAAqB,6BAA6B,kBAAkB,4CAA4C,eAAe,yCAAyC,eAAe,QAAQ,MAAM,uBAAuB,yCAAyC,KAAK,yFAAyF,cAAc,MAAM,qFAAqF,MAAM,8DAA8D,qBAAqB,IAAI,gDAAgD,oCAAoC,qDAAqD,IAAI,WAAW,SAAS,oBAAoB,eAAe,iBAAiB,+BAA+B,eAAe,+CAA+C,YAAY,IAAI,KAAK,mCAAmC,2CAA2C,6BAA6B,oBAAoB,oCAAoC,SAAS,oBAAoB,oCAAoC,SAAS,oBAAoB,kBAAkB,oBAAoB,oCAAoC,SAAS,oBAAoB,oCAAoC,SAAS,kBAAkB,4EAA4E,kBAAkB,cAAc,uBAAuB,YAAY,IAAI,gFAAgF,cAAc,kBAAkB,SAAS,uBAAuB,YAAY,IAAI,iCAAiC,SAAS,kBAAkB,gBAAgB,kBAAkB,eAAe,uCAAuC,iBAAiB,IAAI,eAAe,SAAS,kBAAkB,gCAAgC,WAAW,6CAA6C,SAAS,oBAAoB,uJAAuJ,eAAe,YAAY,MAAM,0EAA0E,oBAAoB,uJAAuJ,eAAe,YAAY,MAAM,8KAA8K,oBAAoB,uJAAuJ,eAAe,YAAY,4BAA4B,2BAA2B,oBAAoB,uJAAuJ,eAAe,YAAY,iCAAiC,gCAAgC,oBAAoB,wIAAwI,oBAAoB,wIAAwI,sBAAsB,2MAA2M,eAAe,yCAAyC,IAAI,8CAA8C,sBAAsB,gNAAgN,eAAe,yCAAyC,IAAI,+BAA+B,sBAAsB,kNAAkN,eAAe,+CAA+C,sBAAsB,4NAA4N,eAAe,oDAAoD,sBAAsB,kPAAkP,eAAe,4BAA4B,sBAAsB,oPAAoP,eAAe,4BAA4B,cAAc,kDAAkD,kBAAkB,iEAAiE,cAAc,iCAAiC,cAAc,kCAAkC,2DAA2D,KAAK,cAAc,6EAA6E,cAAc,8CAA8C,cAAc,iBAAiB,WAAW,KAAK,sBAAsB,kCAAkC,KAAK,QAAQ,wBAAwB,sEAAsE,WAAW,+BAA+B,SAAS,cAAc,iBAAiB,WAAW,gCAAgC,SAAS,cAAc,uBAAuB,WAAW,yDAAyD,SAAS,cAAc,wBAAwB,oBAAoB,YAAY,mCAAmC,gBAAgB,SAAS,cAAc,IAAI,6BAA6B,SAAS,mCAAmC,gBAAgB,+OAA+O,kBAAkB,2NAA2N,kBAAkB,mKAAmK,gBAAgB,6CAA6C,oCAAoC,8FAA8F,IAAI,6CAA6C,wBAAwB,UAAU,6CAA6C,SAAS,UAAU,4BAA4B,gCAAgC,8IAA8I,kBAAkB,wBAAwB,4CAA4C,4BAA4B,MAAM,wBAAwB,uBAAuB,MAAM,qCAAqC,MAAM,8CAA8C,MAAM,2BAA2B,MAAM,iEAAiE,MAAM,4CAA4C,SAAS,wBAAwB,8GAA8G,4BAA4B,MAAM,kCAAkC,WAAW,mBAAmB,mBAAmB,QAAQ,WAAW,KAAK,WAAW,wBAAwB,SAAS,qCAAqC,2CAA2C,KAAK,QAAQ,YAAY,eAAe,oBAAoB,iEAAiE,MAAM,UAAU,0BAA0B,MAAM,uCAAuC,MAAM,4BAA4B,MAAM,6BAA6B,MAAM,6BAA6B,MAAM,oEAAoE,MAAM,4CAA4C,SAAS,sCAAsC,WAAW,qGAAqG,MAAM,UAAU,qBAAqB,MAAM,kCAAkC,MAAM,uBAAuB,MAAM,wBAAwB,MAAM,wBAAwB,MAAM,+DAA+D,MAAM,4CAA4C,SAAS,+BAA+B,OAAO,kEAAkE,oCAAoC,WAAW,kFAAkF,iPAAiP,UAAU,yCAAyC,IAAI,qBAAqB,qCAAqC,iCAAiC,kBAAkB,iFAAiF,2CAA2C,IAAI,mBAAmB,SAAS,6BAA6B,kGAAkG,+BAA+B,qGAAqG,qCAAqC,yIAAyI,wCAAwC,sBAAsB,wCAAwC,sBAAsB,wCAAwC,sBAAsB,wCAAwC,sBAAsB,oCAAoC,2HAA2H,kBAAkB,qCAAqC,uCAAuC,sBAAsB,uCAAuC,sBAAsB,uCAAuC,sBAAsB,uCAAuC,sBAAsB,uCAAuC,sBAAsB,uCAAuC,sBAAsB,wCAAwC,sBAAsB,wCAAwC,sBAAsB,wCAAwC,mLAAmL,2CAA2C,iBAAiB,2CAA2C,iBAAiB,2CAA2C,iBAAiB,2CAA2C,iBAAiB,uCAAuC,uOAAuO,0CAA0C,iBAAiB,0CAA0C,iBAAiB,0CAA0C,iBAAiB,0CAA0C,iBAAiB,0CAA0C,iBAAiB,0CAA0C,iBAAiB,2CAA2C,iBAAiB,2CAA2C,iBAAiB,kCAAkC,uLAAuL,yFAAyF,YAAY,IAAI,eAAe,gCAAgC,+BAA+B,IAAI,gDAAgD,aAAa,MAAM,iCAAiC,sCAAsC,mCAAmC,+CAA+C,qDAAqD,IAAI,kBAAkB,gBAAgB,uEAAuE,kBAAkB,uBAAuB,+iCAA+iC,0FAA0F,0LAA0L,EAAE,4CAA4C,qBAAqB,6BAA6B,gBAAgB,mBAAmB,8BAA8B,oBAAoB,iDAAiD,WAAW,yBAAyB,SAAS,kBAAkB,yDAAyD,WAAW,0BAA0B,SAAS,oBAAoB,4BAA4B,2BAA2B,gBAAgB,wCAAwC,UAAU,QAAQ,WAAW,QAAQ,0FAA0F,kNAAkN,EAAE,mBAAmB,qBAAqB,6BAA6B,kBAAkB,4GAA4G,kCAAkC,IAAI,8BAA8B,yBAAyB,0BAA0B,gBAAgB,YAAY,oBAAoB,oDAAoD,mBAAmB,8DAA8D,oBAAoB,oCAAoC,kCAAkC,aAAa,yCAAyC,4GAA4G,gBAAgB,yBAAyB,mFAAmF,sBAAsB,iBAAiB,mCAAmC,YAAY,4BAA4B,cAAc,6BAA6B,kCAAkC,IAAI,gCAAgC,SAAS,MAAM,oKAAoK,gBAAgB,wCAAwC,EAAE,0FAA0F,gNAAgN,EAAE,8DAA8D,qBAAqB,6BAA6B,gBAAgB,yCAAyC,gEAAgE,WAAW,OAAO,oBAAoB,gqEAAgqE,sBAAsB,wBAAwB,kCAAkC,0BAA0B,6BAA6B,0BAA0B,6BAA6B,0BAA0B,0BAA0B,0BAA0B,6BAA6B,gBAAgB,oDAAoD,qBAAqB,gBAAgB,qBAAqB,qBAAqB,sBAAsB,uBAAuB,0FAA0F,8MAA8M,EAAE,iCAAiC,qBAAqB,6BAA6B,YAAY,eAAe,cAAc,+BAA+B,IAAI,mEAAmE,SAAS,kDAAkD,wBAAwB,mCAAmC,iBAAiB,GAAG,0FAA0F,8MAA8M,EAAE,mBAAmB,qBAAqB,6BAA6B,gBAAgB,2CAA2C,0FAA0F,WAAW,OAAO,gCAAgC,KAAK,KAAK,yDAAyD,gDAAgD,0BAA0B,6CAA6C,wBAAwB,oBAAoB,uDAAuD,cAAc,mEAAmE,gBAAgB,oDAAoD,qBAAqB,gBAAgB,qBAAqB,qBAAqB,sBAAsB,0BAA0B,0FAA0F,8MAA8M,EAAE,iCAAiC,qBAAqB,6BAA6B,qCAAqC,oDAAoD,qBAAqB,iBAAiB,qBAAqB,iBAAiB,aAAa,mBAAmB,gBAAgB,mBAAmB,mBAAmB,eAAe,8BAA8B;AAC5v+B,8BAA8B,eAAe,6BAA6B,eAAe,+BAA+B,iBAAiB,60BAA60B,2CAA2C,YAAY,WAAW,OAAO,wDAAwD,YAAY,KAAK,4KAA4K,wHAAwH,UAAU,sBAAsB,0BAA0B,0FAA0F,iNAAiN,EAAE,iCAAiC,sBAAsB,6BAA6B,cAAc,mBAAmB,sBAAsB,gIAAgI,wBAAwB,+BAA+B,MAAM,SAAS,qDAAqD,eAAe,sFAAsF,gBAAgB,KAAK,iBAAiB,kDAAkD,mBAAmB,iBAAiB,0CAA0C,4HAA4H,oDAAoD,kBAAkB,UAAU,qBAAqB,mDAAmD,0FAA0F,8LAA8L,EAAE,mBAAmB,sBAAsB,6BAA6B,2BAA2B,qEAAqE,mCAAmC,IAAI,0BAA0B,8BAA8B,IAAI,0BAA0B,eAAe,KAAK,qCAAqC,sBAAsB,iCAAiC,+BAA+B,4HAA4H,mRAAmR,KAAK,+BAA+B,kBAAkB,IAAI,+BAA+B,iBAAiB,0FAA0F,kIAAkI,EAAE,mBAAmB,EAAE,GAAG,SAAS,E;;;;;;;;;;;;ACD5lI;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAsC,8BAA8B;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,mBAAmB,sBAAsB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,UAAU,yBAAyB;AACnC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU,qBAAqB;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU,aAAa;AACvB;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA,WAAW;AACX;AACA,qCAAqC;AACrC;AACA;AACA,SAAS;AACT;AACA;AACA,gDAAgD;AAChD;AACA,WAAW;AACX;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2CAA2C,cAAc;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,+BAA+B,QAAQ;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gDAAgD;AAChD;AACA,KAAK;AACL,+BAA+B,QAAQ;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,QAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU,YAAY;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoF;AACpF;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA,8DAA8D;;AAE9D;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;;;;;;;;;;;;AChhBA;;AAEA1I,MAAM,CAAC6I,cAAP,CAAsBR,OAAtB,EAA+B,YAA/B,EAA6C;AAC3C3I,OAAK,EAAE;AADoC,CAA7C;AAGA2I,OAAO,CAACS,OAAR,GAAkB,KAAK,CAAvB;;AAEA,IAAIC,UAAU,GAAG,mBAAO,CAAC,2DAAD,CAAxB;;AAEA,IAAIC,mBAAmB,GAAG,mBAAO,CAAC,6EAAD,CAAjC;AAEA;;;;;;;;;;;;AAUA,IAAIC,QAAQ,GAAG,SAAXA,QAAW,CAACC,IAAD,EAAOC,OAAP,EAAgBC,GAAhB,EAAwB;AACrC,MAAMC,SAAS,GAAGH,IAAI,CAACG,SAAvB;AAAA,MACMC,KAAK,GAAGJ,IAAI,CAACI,KADnB;AAAA,MAEMC,MAAM,GAAGL,IAAI,CAACK,MAFpB;AAAA,MAGMC,gBAAgB,GAAGN,IAAI,CAACM,gBAH9B;AAAA,MAIMC,kBAAkB,GAAGP,IAAI,CA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AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qCAAqC;;AAErC;AACA;AACA;;AAEA,2BAA2B;AAC3B;AACA;AACA;AACA,4BAA4B,UAAU;;;;;;;;;;;;ACvLtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WACA;AACA,CAAC,qBAAqB;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,SAAS;AACtB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,yBAAyB;AACzB,aAAa,OAAO;AACpB,aAAa,UAAU;AACvB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;;AAEA,4CAA4C,YAAY;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,SAAS;AACtB,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,0CAA0C,YAAY;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO,eAAe,aAAa;AAChD,aAAa,EAAE;AACf,aAAa,QAAQ,qCAAqC,eAAe,YAAY;AACrF;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,aAAa;AACzB;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA,oCAAoC,eAAe;AACnD;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,eAAe;AACpC;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,2BAA2B,eAAe;AAC1C;AACA,eAAe,MAAM,cAAc,YAAY;AAC/C,gBAAgB;AAChB;AACA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA,4CAA4C,eAAe;AAC3D;AACA,4CAA4C,eAAe;AAC3D;AACA;AACA,gBAAgB,EAAE;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,MAAM,cAAc,YAAY;AAC/C,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,MAAM,cAAc,YAAY;AAC/C,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,MAAM,cAAc,YAAY;AAC/C,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,2BAA2B,eAAe;AAC1C;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,wBAAwB;;AAExB;AACA,+FAA+F,aAAa;AAC5G;AACA,2BAA2B,eAAe;AAC1C;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA,2BAA2B,eAAe;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iBAAiB,iBAAiB;AAClC,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,GAAG;;AAEH;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA,kBAAkB,OAAO;AACzB;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA,iBAAiB,eAAe;AAChC;AACA;;AAEA,iBAAiB,gBAAgB;AACjC;;AAEA;AACA,qBAAqB,eAAe;AACpC;AACA;AACA;AACA,SAAS;AACT,uBAAuB,qBAAqB;AAC5C;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,sBAAsB;AACvC;;AAEA;AACA;AACA;;AAEA,iBAAiB,sBAAsB;AACvC;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,WAAW;AAC9B,qBAAqB,WAAW;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,WAAW;AAC9B,qBAAqB,WAAW;AAChC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,WAAW;AAC9B,8BAA8B,WAAW;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;;AAEA,gCAAgC,WAAW;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,WAAW;AAC9B,kDAAkD,WAAW;AAC7D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;;AAEA,8BAA8B,WAAW;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;;AAEA,8BAA8B,WAAW;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,WAAW;AACvC;AACA;AACA;;AAEA,8BAA8B,WAAW;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA,iBAAiB,cAAc;AAC/B;;AAEA,mBAAmB,OAAO;AAC1B;AACA;AACA;;AAEA;AACA;;AAEA;AACA,iBAAiB,eAAe;AAChC;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,eAAe;AAChC,mBAAmB,eAAe;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,iBAAiB,WAAW;AAC5B;;AAEA;;AAEA,0BAA0B,WAAW;AACrC;;AAEA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,iBAAiB,WAAW;AAC5B;;AAEA;;AAEA,0BAA0B,WAAW;AACrC;;AAEA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,YAAY;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,OAAO;AACxB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,iBAAiB,OAAO;AACxB;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,OAAO;AACxB;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAiB,eAAe;AAChC,mBAAmB,gBAAgB;AACnC;AACA;;AAEA,mBAAmB,gBAAgB;AACnC;AACA;AACA;;AAEA,iBAAiB,gBAAgB;AACjC;AACA;;AAEA,iBAAiB,cAAc;AAC/B,mBAAmB,6BAA6B;AAChD;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,eAAe;AACf;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA,iBAAiB,OAAO;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;;AAEA,iBAAiB,OAAO;AACxB;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,mBAAmB,OAAO;AAC1B,qBAAqB,OAAO;AAC5B;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iBAAiB,YAAY;AAC7B;;AAEA,mBAAmB,OAAO;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,eAAe;AACf;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW;AACX;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA,iBAAiB,OAAO;AACxB;AACA;;AAEA,iBAAiB,OAAO;AACxB;AACA;AACA;;AAEA,iBAAiB,OAAO;AACxB;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA,iBAAiB,WAAW;AAC5B,mBAAmB,QAAQ;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;AACA;AACA;;AAEA,iBAAiB,YAAY;AAC7B;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA,0BAA0B,YAAY;AACtC;AACA,eAAe,OAAO;AACtB,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB;;AAEA;AACA,2BAA2B,eAAe;AAC1C;AACA,sBAAsB,qBAAqB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,oBAAoB;AACzE;AACA;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB;AACA,aAAa,EAAE;AACf,aAAa,wBAAwB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,aAAa;AACvC;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA,+FAA+F,aAAa;AAC5G;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA,mCAAmC,aAAa;AAChD;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA,uFAAuF,aAAa;AACpG;AACA,2DAA2D,aAAa;AACxE;AACA;AACA,eAAe,EAAE;AACjB,gBAAgB,EAAE;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA,aAAa,EAAE;AACf,aAAa,OAAO,eAAe,aAAa;AAChD,cAAc,EAAE;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,OAAO;AACtB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,uBAAuB;;AAEvB;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA,uBAAuB,aAAa;AACpC;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA,eAAe,OAAO,yBAAyB,aAAa;AAC5D,gBAAgB,QAAQ,0BAA0B,aAAa,+BAA+B;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO,yBAAyB,aAAa;AAC5D,eAAe,OAAO,wDAAwD,aAAa;AAC3F,gBAAgB,EAAE,mBAAmB,aAAa;AAClD;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,4BAA4B;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC,eAAe,OAAO;AACtB,eAAe,SAAS;AACxB;AACA,gBAAgB;AAChB,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,aAAa;AACxE,2CAA2C,aAAa;AACxD;AACA;AACA;AACA;AACA,eAAe,OAAO,yBAAyB,aAAa;AAC5D,eAAe,EAAE,4CAA4C,aAAa;AAC1E,eAAe,OAAO,6EAA6E;AACnG,gBAAgB,QAAQ,8EAA8E;AACtG;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4FAA4F,aAAa;AACzG,8EAA8E,aAAa;AAC3F;AACA;AACA;AACA;AACA;AACA,eAAe,mBAAmB;AAClC,eAAe,OAAO;AACtB,gBAAgB,QAAQ,uFAAuF;AAC/G;AACA,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA,gDAAgD,aAAa;AAC7D;AACA;AACA;AACA,aAAa,EAAE;AACf,aAAa,OAAO,yBAAyB,aAAa;AAC1D,cAAc;AACd;;AAEA;AACA,0BAA0B,cAAc;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA,oBAAoB,cAAc;AAClC;AACA,eAAe,OAAO,yBAAyB,cAAc;AAC7D,gBAAgB,QAAQ,MAAM,cAAc;AAC5C,gBAAgB,MAAM,QAAQ,cAAc;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA,iBAAiB,cAAc;AAC/B;AACA;AACA,eAAe,OAAO,yBAAyB,cAAc;AAC7D,eAAe,QAAQ,gBAAgB,cAAc;AACrD,gBAAgB;AAChB,gBAAgB,MAAM,OAAO,cAAc;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,eAAe;AAC5B,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA,uDAAuD,aAAa;AACpE;AACA;AACA;AACA;AACA,gBAAgB,mBAAmB;AACnC;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,sFAAsF,aAAa;AACnG;AACA;AACA;AACA;AACA;AACA,eAAe,eAAe;AAC9B,gBAAgB;AAChB,gBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,OAAO;AACtB,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,qBAAqB,aAAa,sBAAsB,YAAY;AACpE;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;;AAEA,GAAG;;AAEH;AACA,uEAAuE,aAAa;AACpF;AACA,eAAe,QAAQ,gBAAgB,cAAc;AACrD,gBAAgB;AAChB,gBAAgB,MAAM,OAAO,cAAc;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA;AACA,4FAA4F,aAAa;AACzG;AACA,kBAAkB,EAAE;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,yFAAyF,aAAa;AACtG;AACA,kBAAkB,EAAE;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA,0BAA0B,aAAa;AACvC;AACA,eAAe,OAAO;AACtB,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB,gBAAgB,EAAE;AAClB;AACA,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iCAAiC,cAAc;AAC/C;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA,gBAAgB,EAAE;AAClB;AACA;AACA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA,gBAAgB,EAAE;AAClB;AACA;AACA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA,eAAe,EAAE;AACjB,gBAAgB,QAAQ,uDAAuD;AAC/E;AACA;AACA;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD;AACA,eAAe,EAAE;AACjB,gBAAgB,QAAQ,uDAAuD;AAC/E;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;AACA,2BAA2B,qBAAqB;AAChD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,CAAC;;AAED,kC;;;;;;;;;;;AC1zEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,oCAAoC;AACxD,0BAA0B,oCAAoC;AAC9D,0BAA0B,oCAAoC;AAC9D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD,sCAAsC;AACtC,oCAAoC;AACpC,sCAAsC;AACtC,oCAAoC;AACpC,sCAAsC;AACtC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP,KAAK;AACL,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iBAAiB,qBAAqB;AACtC;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,gBAAgB;AACnC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,2BAA2B;AAC3B,4CAA4C;AAC5C;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,2BAA2B;AAC3B,2CAA2C;AAC3C;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iBAAiB,sBAAsB;AACvC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,sF;AACA;;;;;;;;;;;;;AC3yCA;AACA;;AAEA;AACA;AACA;;AAEA,uBAAuB;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,iBAAiB;AACtC;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,0CAA0C,sBAAsB,EAAE;AAClE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA,KAAK;AACL;AACA;;AAEA,KAAK;AACL;AACA;;AAEA,KAAK;AACL;AACA;;AAEA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,CAAC;;;;;;;;;;;;;ACzLD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9DA;AAAA;AACA;AACA,+DAA+D;AAC/D;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU,gBAAgB,sCAAsC,iBAAiB,EAAE;AACnF,yBAAyB,uDAAuD;AAChF;AACA;;AAEA;AACA;AACA,mBAAmB,sBAAsB;AACzC;AACA;;AAEA;AACA;AACA,gDAAgD,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;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,eAAe,YAAY;AAC3B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;ACxLD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AAAA;AAAA;AAAA;AAAA;AACA,GAAG,QAGH;AACA,CAAC;AACD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,CAAC;;;;;;;;;;;;ACpPD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,2BAA2B;AAC3B,iBAAiB,WAAW;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AAAA;AAAA;AAAA;AACA,GAAG,QAGH;AACA,CAAC;AACD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAsC,WAAW;AACjD;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;;;;;;;;;;;ACxHD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AAAA;AAAA;AAAA;AACA,GAAG,QAGH;AACA,CAAC;AACD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,wCAAwC;AACxC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL,wCAAwC,YAAY;AACpD;AACA;AACA,KAAK;AACL;AACA;;AAEA,qCAAqC,YAAY;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,wCAAwC,YAAY;AACpD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,qCAAqC,YAAY;AACjD;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,mCAAmC,OAAO;AAC1C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI;AAC3D;AACA;AACA;AACA,2CAA2C,IAAI,GAAG,EAAE,aAAa,IAAI,mBAAmB,IAAI,GAAG,EAAE,cAAc,IAAI,yEAAyE,EAAE,oBAAoB,IAAI,GAAG,EAAE,gBAAgB,IAAI,EAAE,IAAI,2EAA2E,EAAE,oBAAoB,IAAI,GAAG,EAAE,gBAAgB,IAAI,EAAE,IAAI,iBAAiB,IAAI,2EAA2E,EAAE,qBAAqB,IAAI,GAAG,EAAE,gBAAgB,IAAI,EAAE,IAAI,iBAAiB,IAAI,EAAE,IAAI,yEAAyE,EAAE,qBAAqB,IAAI,GAAG,EAAE,gBAAgB,IAAI,EAAE,IAAI,iBAAiB,IAAI,EAAE,IAAI,yEAAyE,EAAE,qBAAqB,IAAI,GAAG,EAAE,gBAAgB,IAAI,EAAE,IAAI,iBAAiB,IAAI,EAAE,IAAI,yEAAyE,EAAE,yBAAyB,IAAI,EAAE,IAAI,iBAAiB,IAAI,EAAE,IAAI,yEAAyE,EAAE;AAC9jC;AACA;AACA;AACA;AACA,qDAAqD,IAAI,kBAAkB,IAAI,yBAAyB,IAAI,0GAA0G;AACtN;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB,2CAA2C;AAC3C,sCAAsC,GAAG,IAAI;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uEAAuE;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;;AAEA,+CAA+C,YAAY;AAC3D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mBAAmB,YAAY;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,YAAY;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA,uCAAuC,YAAY;AACnD;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA,mBAAmB,sBAAsB;AACzC;AACA;AACA;AACA,qBAAqB,sBAAsB;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB,cAAc;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,0BAA0B;AAC1B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA,8BAA8B,UAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,iCAAiC,OAAO;AACxC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,wCAAwC,OAAO;AAC/C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL,+BAA+B,OAAO;AACtC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,GAAG;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,sEAAsE,OAAO;AAC7E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA,eAAe,qBAAqB;AACpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,CAAC;;;;;;;;;;;;sDCjyED;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAY,OAAO;AACnB,cAAc,MAAM;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,MAAM;AAClB,YAAY,SAAS;AACrB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB,YAAY,SAAS;AACrB;AACA,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB,cAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,KAAK;AACL,4BAA4B;AAC5B;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY,MAAM;AAClB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB,cAAc,OAAO;AACrB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mCAAmC;AAClE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,aAAa,WAAW;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB;;AAExB,yCAAyC,qBAAqB;;AAE9D;AACA;AACA;AACA;AACA;AACA,kCAAkC,oBAAoB;;AAEtD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,0BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,cAAc,iBAAiB;AAC/B;;AAEA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B,oBAAoB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,OAAO;AACnB;AACA,cAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAEA;AACA;AACA;AACA;AACA,GAAG;AAAA;AACH,EAAE,QAaF;;AAEA,CAAC;;;;;;;;;;;;;ACphBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WACA;AACA,CAAC,oBAAoB;;AAErB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,EAAE;AAChB;AACA,gBAAgB,EAAE;AAClB,gBAAgB,EAAE;AAClB,gBAAgB,EAAE;AAClB;AACA,gBAAgB,EAAE;AAClB;AACA,gBAAgB,EAAE;AAClB,gBAAgB,EAAE;AAClB,gBAAgB,EAAE;AAClB;;AAEA;AACA,eAAe,EAAE;AACjB,iBAAiB,EAAE;AACnB,kBAAkB,EAAE,OAAO,EAAE;AAC7B,kBAAkB,EAAE;AACpB,mBAAmB,EAAE,OAAO,EAAE;;AAE9B,cAAc,EAAE;AAChB,gBAAgB,EAAE,OAAO,EAAE;AAC3B,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE;;AAEtC;AACA;AACA;AACA,4BAA4B,EAAE;AAC9B,8BAA8B,EAAE,OAAO,EAAE;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC,aAAa,QAAQ,oDAAoD;AACzE,aAAa,MAAM;AACnB,eAAe,KAAK;AACpB,cAAc,UAAU;AACxB,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC,aAAa,OAAO;AACpB,aAAa,QAAQ,oDAAoD;AACzE,aAAa,MAAM,iEAAiE;AACpF,eAAe,KAAK;AACpB,cAAc,UAAU;AACxB,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA,aAAa,EAAE;AACf,aAAa,QAAQ,oDAAoD;AACzE,aAAa,MAAM,iEAAiE;AACpF,eAAe,QAAQ;AACvB,cAAc,UAAU;AACxB,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,0BAA0B,OAAO;AACjC,KAAK;;AAEL;AACA;AACA,gBAAgB,OAAO;AACvB,KAAK;;AAEL;;AAEA;AACA;AACA,0BAA0B,OAAO;AACjC,KAAK;;AAEL;AACA;AACA,gBAAgB,OAAO;AACvB,KAAK;;AAEL;AACA;AACA,sBAAsB,OAAO;AAC7B,KAAK;;AAEL;AACA;AACA,gBAAgB,OAAO;AACvB,KAAK;;AAEL;AACA;AACA,gBAAgB,OAAO;AACvB,KAAK;;AAEL;AACA;AACA,sBAAsB,OAAO;AAC7B,KAAK;;AAEL;AACA;AACA,gBAAgB,OAAO;AACvB,KAAK;;AAEL;AACA;AACA,sBAAsB,OAAO;AAC7B,KAAK;;AAEL;AACA;AACA,gBAAgB,OAAO;AACvB,KAAK;;AAEL;AACA;AACA,qBAAqB,OAAO;AAC5B,KAAK;;AAEL;AACA;AACA,uBAAuB,OAAO;AAC9B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL,4DAA4D,OAAO;AACnE;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,MAAM,QAAQ,MAAM;AACjC,aAAa,MAAM,QAAQ,MAAM;AACjC,eAAe,MAAM,IAAI,MAAM;AAC/B,cAAc,MAAM,IAAI,MAAM;AAC9B;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA,SAAS;AACT;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,sCAAsC;AACtC,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,qBAAqB;AACzD;AACA;AACA,oCAAoC,gBAAgB;AACpD;AACA;AACA;AACA,oCAAoC,cAAc;AAClD;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6CAA6C,aAAa;AAC1D;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iDAAiD,aAAa;AAC9D;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,gBAAgB;AAClE;AACA;AACA,4CAA4C,4CAA4C;AACxF,sCAAsC;AACtC;AACA,4CAA4C,uCAAuC;AACnF;AACA;AACA;AACA,4CAA4C,qCAAqC;AACjF;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,gBAAgB;AAClE;AACA;AACA,4CAA4C,4CAA4C;AACxF,sCAAsC;AACtC;AACA,4CAA4C,uCAAuC;AACnF;AACA;AACA;AACA,4CAA4C,qCAAqC;AACjF;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;AAClE;AACA;AACA,wCAAwC,4CAA4C;AACpF;AACA;AACA,wCAAwC,uCAAuC;AAC/E;AACA;AACA;AACA,wCAAwC,qCAAqC;AAC7E;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;AAClE;AACA;AACA,wCAAwC,4CAA4C;AACpF;AACA;AACA,wCAAwC,uCAAuC;AAC/E;AACA;AACA;AACA,wCAAwC,qCAAqC;AAC7E;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,6CAA6C,aAAa;AAC1D;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,gDAAgD,aAAa;AAC7D;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,mDAAmD,aAAa;AAChE;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,kDAAkD,kBAAkB;AACpE;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,4CAA4C;AACtF;AACA;AACA,0CAA0C,uCAAuC;AACjF;AACA;AACA,0CAA0C,sCAAsC;AAChF;AACA;AACA;AACA,0CAA0C,qCAAqC;AAC/E;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,YAAY;AACrE;AACA,0CAA0C,4CAA4C;AACtF;AACA;AACA,0CAA0C,uCAAuC;AACjF;AACA;AACA,0CAA0C,sCAAsC;AAChF;AACA;AACA;AACA,0CAA0C,qCAAqC;AAC/E;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,YAAY;AACrE;AACA,0CAA0C,4CAA4C;AACtF;AACA;AACA,0CAA0C,uCAAuC;AACjF;AACA;AACA,0CAA0C,sCAAsC;AAChF;AACA;AACA;AACA,0CAA0C,qCAAqC;AAC/E;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,YAAY;AACnE;AACA;AACA,0CAA0C,4CAA4C;AACtF;AACA;AACA,0CAA0C,uCAAuC;AACjF;AACA;AACA,0CAA0C,sCAAsC;AAChF;AACA;AACA;AACA,0CAA0C,qCAAqC;AAC/E;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yDAAyD,4CAA4C;AACrG;AACA,yDAAyD,uCAAuC;AAChG;AACA;AACA,yDAAyD,qCAAqC;AAC9F;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,yDAAyD,4CAA4C;AACrG;AACA,yDAAyD,uCAAuC;AAChG;AACA;AACA,yDAAyD,qCAAqC;AAC9F;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA,yDAAyD,4CAA4C;AACrG;AACA,yDAAyD,uCAAuC;AAChG;AACA;AACA,yDAAyD,qCAAqC;AAC9F;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8CAA8C,aAAa;AAC3D;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,8CAA8C,aAAa;AAC3D;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,8CAA8C,aAAa;AAC3D;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8CAA8C,aAAa;AAC3D;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,gDAAgD,eAAe;AAC/D;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,gDAAgD,eAAe;AAC/D;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gCAAgC,eAAe;AAC/C;AACA,gCAAgC,gBAAgB;AAChD;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;;AAEA;AACA;AACA;AACA,gCAAgC,eAAe;AAC/C;AACA,gCAAgC,gBAAgB;AAChD;AACA,gCAAgC,cAAc;AAC9C;AACA;AACA,gCAAgC,cAAc;AAC9C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,8CAA8C,eAAe;AAC7D;AACA;AACA,8CAA8C,gBAAgB;AAC9D;AACA;AACA,8CAA8C,cAAc;AAC5D;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D;AACA;;AAEA;AACA,kBAAkB,MAAM;AACxB,kBAAkB,MAAM;AACxB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC,aAAa,OAAO;AACpB,aAAa,QAAQ,oDAAoD;AACzE,aAAa,MAAM,iEAAiE;AACpF,eAAe,KAAK;AACpB,cAAc,UAAU;AACxB,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,WAAW;AAC9D;AACA,mDAAmD,WAAW;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE,0BAA0B,4CAA4C;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC,aAAa,OAAO;AACpB,aAAa,QAAQ,oDAAoD;AACzE,aAAa,MAAM,iEAAiE;AACpF,aAAa,cAAc;AAC3B,aAAa,OAAO;AACpB,aAAa,OAAO,kEAAkE;AACtF,aAAa,QAAQ;AACrB;AACA;AACA;AACA,eAAe,OAAO;AACtB,cAAc,UAAU;AACxB,cAAc,WAAW;AACzB,cAAc,WAAW;AACzB,cAAc,WAAW;AACzB,cAAc,WAAW;AACzB,cAAc,WAAW;AACzB,cAAc,WAAW,wEAAwE;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,WAAW;AACxB;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ,oDAAoD;AACzE,aAAa,MAAM,iEAAiE;AACpF,eAAe,QAAQ;AACvB,cAAc,UAAU;AACxB,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ,oDAAoD;AACzE,aAAa,MAAM,iEAAiE;AACpF,eAAe,QAAQ;AACvB,cAAc,UAAU;AACxB,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC,aAAa,mBAAmB;AAChC,aAAa,QAAQ,oDAAoD;AACzE,aAAa,MAAM,iEAAiE;AACpF,eAAe,QAAQ;AACvB,cAAc,UAAU;AACxB,cAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,IAAI;AACxB,sBAAsB,IAAI;AAC1B,qBAAqB,IAAI;;AAEzB;AACA;AACA,4BAA4B,IAAI;AAChC,8BAA8B,IAAI;AAClC,6BAA6B,IAAI;AACjC;;AAEA;AACA,sCAAsC,EAAE,KAAK,EAAE;AAC/C,uBAAuB,EAAE,KAAK,EAAE;AAChC,sCAAsC,EAAE,KAAK,EAAE,MAAM,EAAE;AACvD,0BAA0B,EAAE,MAAM,EAAE;AACpC,yCAAyC,EAAE,MAAM,EAAE,OAAO,EAAE;AAC5D;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,YAAY;AAChE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,YAAY;AAClE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,qBAAqB;AAC3D,iCAAiC,gBAAgB;AACjD;AACA;AACA,sCAAsC,gBAAgB;AACtD;AACA;AACA;AACA,sCAAsC,cAAc;AACpD,iCAAiC,qBAAqB;AACtD,iCAAiC,gBAAgB;AACjD;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gDAAgD,2CAA2C;AAC3F;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gDAAgD,2CAA2C;AAC3F;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA,0CAA0C,4CAA4C;AACtF,qCAAqC,uCAAuC;AAC5E,wCAAwC;AACxC;AACA,0CAA0C,uCAAuC;AACjF;AACA;AACA;AACA,0CAA0C,qCAAqC;AAC/E,qCAAqC,4CAA4C;AACjF,qCAAqC,uCAAuC;AAC5E;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,gBAAgB;AAChE;AACA;AACA,0CAA0C,4CAA4C;AACtF,qCAAqC,uCAAuC;AAC5E,wCAAwC;AACxC;AACA,0CAA0C,uCAAuC;AACjF;AACA;AACA;AACA,0CAA0C,qCAAqC;AAC/E,qCAAqC,4CAA4C;AACjF,qCAAqC,uCAAuC;AAC5E;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,4CAA4C;AAC5F;AACA;AACA,wCAAwC,4CAA4C;AACpF,mCAAmC,uCAAuC;AAC1E;AACA;AACA,wCAAwC,uCAAuC;AAC/E;AACA;AACA;AACA,wCAAwC,qCAAqC;AAC7E,mCAAmC,4CAA4C;AAC/E,mCAAmC,uCAAuC;AAC1E;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,4CAA4C;AAC5F;AACA;AACA,wCAAwC,4CAA4C;AACpF,mCAAmC,uCAAuC;AAC1E;AACA;AACA,wCAAwC,uCAAuC;AAC/E;AACA;AACA;AACA,wCAAwC,qCAAqC;AAC7E,mCAAmC,4CAA4C;AAC/E,mCAAmC,uCAAuC;AAC1E;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,aAAa;AAC7D;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,aAAa;AAC7D;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,aAAa;AAC7D;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,aAAa;AAC7D;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,4CAA4C;AAClF,iCAAiC,sCAAsC;AACvE,iCAAiC,uCAAuC;AACxE;AACA;AACA,sCAAsC,uCAAuC;AAC7E;AACA;AACA,sCAAsC,sCAAsC;AAC5E,+BAA+B,uCAAuC;AACtE;AACA;AACA;AACA,sCAAsC,qCAAqC;AAC3E,iCAAiC,4CAA4C;AAC7E,iCAAiC,sCAAsC;AACvE,iCAAiC,uCAAuC;AACxE;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,0CAA0C;AAC1F;AACA;AACA,sCAAsC,4CAA4C;AAClF,iCAAiC,sCAAsC;AACvE,iCAAiC,uCAAuC;AACxE;AACA;AACA,sCAAsC,uCAAuC;AAC7E;AACA;AACA,sCAAsC,sCAAsC;AAC5E,+BAA+B,uCAAuC;AACtE;AACA;AACA;AACA,sCAAsC,qCAAqC;AAC3E,iCAAiC,4CAA4C;AAC7E,iCAAiC,sCAAsC;AACvE,iCAAiC,uCAAuC;AACxE;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,0CAA0C;AAC1F;AACA;AACA,sCAAsC,4CAA4C;AAClF,iCAAiC,sCAAsC;AACvE,iCAAiC,uCAAuC;AACxE;AACA;AACA,sCAAsC,uCAAuC;AAC7E;AACA;AACA,sCAAsC,sCAAsC;AAC5E,+BAA+B,uCAAuC;AACtE;AACA;AACA;AACA,sCAAsC,qCAAqC;AAC3E,iCAAiC,4CAA4C;AAC7E,iCAAiC,sCAAsC;AACvE,iCAAiC,uCAAuC;AACxE;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,YAAY;AAC5D;AACA;AACA,sCAAsC,0EAA0E;AAChH,iCAAiC,oEAAoE;AACrG,iCAAiC,qEAAqE;AACtG;AACA;AACA,sCAAsC,qEAAqE;AAC3G;AACA;AACA,sCAAsC,oEAAoE;AAC1G,+BAA+B,qEAAqE;AACpG;AACA;AACA;AACA,sCAAsC,mEAAmE;AACzG,iCAAiC,0EAA0E;AAC3G,iCAAiC,oEAAoE;AACrG,iCAAiC,qEAAqE;AACtG;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,4CAA4C;AACxF,uCAAuC,uCAAuC;AAC9E;AACA,4CAA4C,uCAAuC;AACnF;AACA;AACA,4CAA4C,qCAAqC;AACjF,uCAAuC,4CAA4C;AACnF,uCAAuC,uCAAuC;AAC9E;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,4CAA4C;AACxF,uCAAuC,uCAAuC;AAC9E;AACA,4CAA4C,uCAAuC;AACnF;AACA;AACA,4CAA4C,qCAAqC;AACjF,uCAAuC,4CAA4C;AACnF,uCAAuC,uCAAuC;AAC9E;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,4CAA4C;AACxF,uCAAuC,uCAAuC;AAC9E;AACA,4CAA4C,uCAAuC;AACnF;AACA;AACA,4CAA4C,qCAAqC;AACjF,uCAAuC,4CAA4C;AACnF,uCAAuC,uCAAuC;AAC9E;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,aAAa;AAC7D;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,aAAa;AAC7D;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,aAAa;AAC7D;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,aAAa;AAC7D;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,eAAe;AAC/D;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,eAAe;AAC/D;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,WAAW;AAC9D;AACA,mDAAmD,WAAW;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE,0BAA0B,4CAA4C;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB,aAAa,mBAAmB;AAChC,aAAa,QAAQ,oDAAoD;AACzE,aAAa,MAAM,iEAAiE;AACpF,aAAa,OAAO,kEAAkE;AACtF,aAAa,cAAc;AAC3B,aAAa,cAAc;AAC3B,aAAa,QAAQ;AACrB;AACA;AACA;AACA,eAAe,KAAK;AACpB,cAAc,UAAU;AACxB,cAAc,WAAW;AACzB,cAAc,WAAW;AACzB,cAAc,WAAW;AACzB,cAAc,WAAW;AACzB,cAAc,WAAW,wEAAwE;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,eAAe,mBAAmB;AAClC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,OAAO;AACP;AACA;AACA,OAAO;;AAEP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,eAAe,kCAAkC;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC;AAClC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,yCAAyC,gCAAgC,EAAE;AAC3E;;AAEA;AACA;AACA,qDAAqD,+BAA+B,EAAE;AACtF;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,yCAAyC,kCAAkC,EAAE;AAC7E;;AAEA;AACA;AACA,yDAAyD,mCAAmC,EAAE;AAC9F;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,yCAAyC,kCAAkC,EAAE;AAC7E;;AAEA;AACA;AACA,4DAA4D,sCAAsC,EAAE;AACpG;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,yCAAyC,kCAAkC,EAAE;AAC7E;;AAEA;AACA;AACA,2DAA2D,qCAAqC,EAAE;AAClG;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC;AAClC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,yCAAyC,yBAAyB,qBAAqB,EAAE,EAAE;AAC3F;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oBAAoB,YAAY,EAAE;AAClC;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA,yBAAyB,2EAA2E,kCAAkC,mBAAmB,GAAG,EAAE,OAAO,kCAAkC,8HAA8H,GAAG,EAAE,qBAAqB;;AAE/V;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA,wCAAwC,uCAAuC,gBAAgB;;AAE/F;AACA,+BAA+B,GAAG,SAAS,EAAE,eAAe,GAAG,oCAAoC,EAAE,wBAAwB,GAAG,2BAA2B,GAAG,YAAY,GAAG,4BAA4B,GAAG,mBAAmB,EAAE,IAAI,GAAG,YAAY,GAAG;AACvP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,sCAAsC,QAAQ;AAC9C;AACA;;AAEA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA,qCAAqC,oCAAoC;;AAEzE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,8CAA8C,6CAA6C;;AAE3F;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,EAAE;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAsC,cAAc;;AAEpD,qBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,aAAa;;AAE7C,gCAAgC,WAAW;;AAE3C,sCAAsC,gBAAgB;;AAEtD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,YAAY;;AAEvC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA,qCAAqC;;AAErC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,+BAA+B,wBAAwB;AACvD;;AAEA;AACA;AACA,qBAAqB,wBAAwB;AAC7C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,OAAO,IAAI;AACX;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK,IAAI;AACT;;AAEA;AACA;AACA;AACA;AACA,gDAAgD;AAChD;;AAEA;AACA;AACA;AACA,wCAAwC,iDAAiD;;AAEzF;AACA;AACA;AACA,iCAAiC,+EAA+E;;AAEhH;AACA;AACA;AACA,oCAAoC,mCAAmC;;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4BAA4B,QAAQ;;AAEpC;AACA,yCAAyC,sCAAsC,EAAE;AACjF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,YAAY;AAC/B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA,qBAAqB,GAAG;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,GAAG,MAAM,GAAG;AACpD;;AAEA;AACA,qCAAqC,GAAG;;AAExC;AACA;;AAEA;AACA;AACA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAI;AACX;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,KAAK,IAAI;AACT;;AAEA;AACA,oCAAoC,cAAc;;AAElD,oCAAoC,wBAAwB;;AAE5D;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,mCAAmC,eAAe;AAClD;;AAEA;AACA;AACA;;AAEA,iCAAiC;AACjC,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4BAA4B,oBAAoB;AAChD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,8CAA8C,eAAe,EAAE;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,gCAAgC;AAChC,kCAAkC;;AAElC;AACA;AACA;;AAEA;AACA,yCAAyC,yBAAyB,2CAA2C,EAAE,EAAE;AACjH;;AAEA;AACA;AACA;AACA;;AAEA,gDAAgD,mBAAmB;AACnE,uFAAuF,EAAE;;AAEzF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,yCAAyC,kCAAkC,EAAE;AAC7E;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mCAAmC,iBAAiB,eAAe,EAAE;AACrE,kCAAkC;AAClC;AACA,OAAO,EAAE;;AAET;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA,4DAA4D,mCAAmC,EAAE;AACjG;AACA;AACA;AACA,oDAAoD,4CAA4C,EAAE;AAClG;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA,wCAAwC,uCAAuC,gBAAgB;;AAE/F,yBAAyB,2EAA2E,kCAAkC,mBAAmB,GAAG,EAAE,OAAO,kCAAkC,8HAA8H,GAAG,EAAE,qBAAqB;;AAE/V;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;;AAEA,wCAAwC,uCAAuC,gBAAgB;;AAE/F;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,mBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;;AAEA;AACA;;AAEA,kDAAkD,GAAG,aAAa,GAAG;AACrE;AACA,OAAO;;;AAGP;AACA;AACA;AACA;;AAEA,0BAA0B,mBAAmB;AAC7C;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;;AAGP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA,wCAAwC,uCAAuC,gBAAgB;;AAE/F,wBAAwB,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI;AAC7D,6BAA6B,IAAI;;AAEjC;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA,qCAAqC;AACrC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;;;AAGP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA,qBAAqB,mBAAmB;AACxC;AACA;AACA;AACA;AACA,yBAAyB;AACzB;;AAEA;AACA,SAAS,gEAAgE;AACzE;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAwC,uCAAuC,gBAAgB;;AAE/F;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mDAAmD,GAAG,yEAAyE,GAAG;AAClI,qDAAqD,GAAG;AACxD;AACA;AACA,yDAAyD,GAAG;AAC5D;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC;;AAEhC,wCAAwC;;AAExC;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;;AAEA,qBAAqB,wBAAwB;AAC7C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAoB,wBAAwB;AAC5C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA,mDAAmD,iBAAiB,sHAAsH,eAAe;;AAEzM;AACA;AACA,gCAAgC;AAChC;AACA;;AAEA;AACA,gEAAgE,wBAAwB,EAAE;AAC1F;;AAEA,oCAAoC;;AAEpC;AACA,yCAAyC,+CAA+C,EAAE;AAC1F;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yCAAyC,iCAAiC,EAAE;AAC5E;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,qDAAqD,8BAA8B,EAAE;AACrF;;AAEA;AACA;AACA;;AAEA,qCAAqC,wEAAwE,yDAAyD,EAAE,EAAE;;AAE1K;AACA;AACA;;AAEA;AACA;AACA,yCAAyC,uCAAuC,EAAE;AAClF;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;;AAEA;AACA,yCAAyC,2BAA2B,EAAE;AACtE;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,yCAAyC,uCAAuC,EAAE;AAClF;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,aAAa,aAAa;AAC1B,aAAa,OAAO;AACpB,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,qBAAqB;;AAErB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,yCAAyC,kCAAkC,EAAE;AAC7E;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,6DAA6D,+BAA+B,EAAE;AAC9F;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,qDAAqD,8BAA8B,EAAE;AACrF;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,yCAAyC,kCAAkC,EAAE;AAC7E;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,6DAA6D,+BAA+B,EAAE;AAC9F;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,yCAAyC,yBAAyB,yBAAyB,EAAE,EAAE;AAC/F;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC;;AAEjC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,qDAAqD,2BAA2B,EAAE;AAClF;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAwC,uCAAuC,gBAAgB;;AAE/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,mBAAmB,oBAAoB;AACvC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,oCAAoC;;AAEpC;AACA,yCAAyC,qCAAqC,EAAE;AAChF;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B,UAAU,qBAAqB;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,oBAAoB;AACpB,sBAAsB;AACtB;AACA;AACA,KAAK;AACL;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,8CAA8C,oBAAoB,EAAE;AACpE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,yDAAyD,cAAc,EAAE;AACzE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,gEAAgE,aAAa,EAAE,iBAAiB,+BAA+B;AAC/H,qCAAqC,0BAA0B;AAC/D;AACA,kCAAkC,aAAa;AAC/C,KAAK;AACL;AACA;;AAEA,mBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,OAAO,IAAI;;AAEX;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK,GAAG,uBAAuB;;AAE/B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,6CAA6C,+BAA+B,EAAE;AAC9E;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,+CAA+C,oBAAoB,EAAE;;AAErE;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,sEAAsE,wBAAwB,EAAE;;AAEhG;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,sEAAsE,wBAAwB,EAAE;;AAEhG;AACA;;AAEA;AACA;AACA;AACA;AACA,qCAAqC,uBAAuB;AAC5D;AACA,mCAAmC,mCAAmC;AACtE;;AAEA,mBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mCAAmC,uCAAuC;AAC1E;AACA,oCAAoC,sBAAsB;;AAE1D;AACA;;AAEA,mBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,mCAAmC,aAAa;AAChD,oCAAoC,aAAa;AACjD,mCAAmC,aAAa;AAChD,iCAAiC,aAAa;;AAE9C;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,2BAA2B;AAChE;;AAEA;AACA;AACA;AACA,oCAAoC,+CAA+C,uBAAuB,EAAE,EAAE,EAAE;AAChH,4BAA4B,cAAc;AAC1C;AACA;;AAEA;AACA;AACA,sCAAsC,sCAAsC;AAC5E,KAAK;AACL,sCAAsC,6BAA6B;AACnE;;AAEA;AACA,qCAAqC,4BAA4B;AACjE;;AAEA;AACA,mCAAmC,kCAAkC;AACrE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK,IAAI;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+BAA+B;;AAE/B;AACA,8DAA8D;;AAE9D,oBAAoB;AACpB;;AAEA,+BAA+B,sBAAsB;;AAErD;AACA,6BAA6B;AAC7B;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kFAAkF,2BAA2B,EAAE;AAC/G;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA,kCAAkC,aAAa;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,yCAAyC,wCAAwC;AACjF;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,aAAa;;AAEhD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,oBAAoB,6BAA6B;AACjD;;AAEA;AACA,aAAa,EAAE;AACf;AACA;AACA,8EAA8E,2BAA2B,EAAE;;AAE3G;AACA;;AAEA;AACA;AACA,aAAa,EAAE;AACf,aAAa,EAAE;AACf,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,EAAE;AACf,aAAa,EAAE;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,2DAA2D;AAC3D;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,EAAE;AACf,aAAa,EAAE;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAc;AACd;;AAEA,YAAY;AACZ;;AAEA;AACA;AACA,cAAc,OAAO;AACrB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,2DAA2D;AAC3D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+CAA+C,mBAAmB,EAAE;AACpE,wBAAwB,kBAAkB;;AAE1C,0CAA0C,uBAAuB,EAAE;AACnE;AACA;AACA;AACA,yCAAyC,mBAAmB,EAAE;;AAE9D;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,qBAAqB,EAAE,sBAAsB,kBAAkB,EAAE;AACzH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,yBAAyB,SAAS,qBAAqB;;AAEvD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,gBAAgB,WAAW;;AAE3B;AACA;;AAEA;;AAEA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA,0DAA0D,gBAAgB;AAC1E;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B,uBAAuB;AACvB,wEAAwE;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8BAA8B,aAAa,qBAAqB,cAAc,qBAAqB,cAAc,qBAAqB,SAAS,qBAAqB,SAAS,qBAAqB,SAAS,qBAAqB,gBAAgB,qBAAqB;;AAErQ;AACA;AACA,cAAc,wBAAwB,8BAA8B,EAAE;AACtE;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4EAA4E,aAAa,EAAE,kBAAkB,2BAA2B;AACxI;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sCAAsC,uBAAuB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,uCAAuC;AACvC;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,oDAAoD,4BAA4B,EAAE;AAClF;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,0BAA0B,EAAE;AACxE;;AAEA;AACA;AACA;AACA,mBAAmB,wCAAwC;AAC3D;;AAEA;AACA,KAAK;;AAEL,qDAAqD,QAAQ;;AAE7D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,sDAAsD;AACtD;;AAEA,gCAAgC,wCAAwC;AACxE,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,0CAA0C,oBAAoB,EAAE;AAChE;AACA;AACA;;AAEA,uCAAuC,wBAAwB,EAAE,wBAAwB,oBAAoB,EAAE;AAC/G,uDAAuD,yBAAyB,EAAE;AAClF;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,2CAA2C,QAAQ;AACnD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,mBAAmB,QAAQ;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA,mBAAmB,QAAQ;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,mCAAmC,QAAQ;;AAE3C,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;;AAET;AACA;AACA,+CAA+C,yBAAyB,EAAE;AAC1E;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA,kCAAkC,QAAQ;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA,6CAA6C,QAAQ;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA,sEAAsE,QAAQ;;AAE9E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yGAAyG,QAAQ;;AAEjH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,0BAA0B,EAAE;AACxE;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK,IAAI;AACT;;AAEA,8BAA8B,UAAU,qBAAqB;;AAE7D;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6CAA6C,8BAA8B,EAAE;AAC7E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,mCAAmC,wBAAwB,EAAE,EAAE,EAAE;AACjH;;AAEA,8CAA8C,8BAA8B,EAAE;AAC9E;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA,gBAAgB,aAAa;;AAE7B;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,8BAA8B,SAAS,qBAAqB,SAAS,qBAAqB,UAAU,qBAAqB,cAAc,qBAAqB,UAAU,qBAAqB;;AAE3L;AACA;;AAEA,wDAAwD,6BAA6B,EAAE;AACvF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,KAAK,IAAI;AACT;;AAEA;AACA;AACA;;AAEA;AACA,kDAAkD,gBAAgB;AAClE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,SAAS,gBAAgB;;AAEvD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,uBAAuB,8BAA8B;;AAErD,2DAA2D,GAAG,gBAAgB,YAAY;AAC1F;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,uBAAuB,8BAA8B;;AAErD,mDAAmD,GAAG,gBAAgB,YAAY;AAClF;;AAEA;AACA;;AAEA,uBAAuB,8BAA8B;;AAErD,8CAA8C,GAAG,gBAAgB,YAAY;AAC7E;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,eAAe,GAAG,gBAAgB;AAC9E;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mDAAmD;AACnD;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,sCAAsC;AACtC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,SAAS,IAAI;AACb;AACA,KAAK;AACL;AACA;AACA,uCAAuC;AACvC;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA,4CAA4C,QAAQ;;AAEpD;AACA,oBAAoB,eAAe;;AAEnC;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA,oFAAoF,QAAQ;AAC5F;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;;AAEA;AACA,mBAAmB,QAAQ;;AAE3B;AACA;AACA;;AAEA;;AAEA;AACA,yCAAyC;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,kDAAkD,EAAE;AACtF,6BAA6B;AAC7B;AACA;AACA;AACA;;AAEA,8BAA8B,SAAS,qBAAqB,cAAc,qBAAqB,SAAS,qBAAqB,UAAU,qBAAqB;AAC5J,2BAA2B,SAAS,qBAAqB,cAAc,qBAAqB,UAAU,qBAAqB;;AAE3H;AACA;AACA;AACA;AACA;AACA,2DAA2D,QAAQ;AACnE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2DAA2D,QAAQ;AACnE;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+CAA+C;;AAE/C;AACA;;AAEA;;AAEA;AACA,KAAK,IAAI;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,oCAAoC,2BAA2B;AACtF,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B;AAC5B,qDAAqD;AACrD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,2CAA2C,mEAAmE,uBAAuB,EAAE,EAAE;AACzI,KAAK;AACL,mDAAmD,gBAAgB;AACnE;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,QAAQ;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,sBAAsB;AACtB;AACA,OAAO;AACP,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,QAAQ;;AAEzB;AACA,4BAA4B,eAAe;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,8BAA8B;;AAEpD;AACA;AACA,kCAAkC,6BAA6B;AAC/D;;AAEA;AACA;AACA,0CAA0C,6BAA6B;AACvE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kBAAkB,4BAA4B;AAC9C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,8BAA8B;;AAEpD;AACA;;AAEA;AACA,iBAAiB;AACjB,KAAK;AACL;AACA,gBAAgB;AAChB,OAAO;AACP;AACA,KAAK;AACL;AACA,wDAAwD,aAAa,UAAU;AAC/E,OAAO;AACP,KAAK;AACL,iBAAiB;AACjB;;AAEA;AACA,wDAAwD,mFAAmF,EAAE;AAC7I;AACA;AACA;AACA;;AAEA,yCAAyC,gBAAgB,EAAE;AAC3D,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,8BAA8B;;AAEpD;AACA,0BAA0B,aAAa,wBAAwB,6CAA6C,EAAE;AAC9G;AACA;AACA;AACA;;AAEA,yCAAyC,gBAAgB,EAAE;AAC3D,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA2C,MAAM;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB;AAClB;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,uBAAuB,QAAQ;;AAE/B;AACA,6BAA6B,GAAG,yCAAyC;AACzE;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qDAAqD,iDAAiD,EAAE;AACxG;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK,IAAI;AACT;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,0DAA0D,6BAA6B,EAAE;AACzF;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,oCAAoC,EAAE;AACtF,SAAS,OAAO;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,gBAAgB,wBAAwB;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA+B,sCAAsC;AACrE;;AAEA;AACA;AACA;AACA;AACA,oCAAoC,0DAA0D;AAC9F;AACA;AACA;AACA;;AAEA,6BAA6B,qCAAqC;AAClE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,kDAAkD,UAAU,gBAAgB,EAAE,EAAE;AAChF,sDAAsD,aAAa,EAAE;AACrE;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA,+CAA+C,0BAA0B,EAAE;AAC3E;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,+CAA+C,8DAA8D;;AAE7G,oCAAoC,oDAAoD;AACxF,8BAA8B,uEAAuE;;AAErG;AACA;AACA;AACA,KAAK;;AAEL;AACA,8BAA8B,+EAA+E;AAC7G;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iDAAiD,aAAa;;AAE9D;AACA,KAAK;AACL;AACA,+CAA+C,8DAA8D;AAC7G;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,sDAAsD,wBAAwB,EAAE;AAChF;;AAEA;AACA,KAAK;;AAEL;AACA,8BAA8B,oFAAoF;AAClH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,OAAO,GAAG,mFAAmF;AAC7F,KAAK;AACL;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,OAAO,IAAI;AACX;;AAEA;AACA,qBAAqB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE;AAC7C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,8BAA8B,UAAU,qBAAqB;;AAE7D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,0BAA0B,wEAAwE;AAClG;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA,2BAA2B;AAC3B,4BAA4B;AAC5B,OAAO;AACP;;AAEA;AACA;;AAEA,2BAA2B;AAC3B,8BAA8B;AAC9B,OAAO;AACP;;AAEA;;AAEA,gCAAgC;AAChC;AACA,GAAG,EAAE;;AAEL,0BAA0B;AAC1B;AACA,GAAG,EAAE;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,6BAA6B;AAC7B;AACA,GAAG,EAAE;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,sCAAsC;AACjE;AACA;AACA;AACA;;AAEA,8BAA8B,cAAc,qBAAqB,UAAU,qBAAqB;AAChG,2BAA2B,cAAc,qBAAqB,UAAU,qBAAqB;;AAE7F;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,eAAe,aAAa;AAC5B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA2B,mCAAmC;AAC9D;AACA;;AAEA,YAAY,mEAAmE;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,yBAAyB;AACzB;AACA;AACA,OAAO,EAAE;AACT,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA,OAAO,IAAI;AACX;;AAEA;AACA;;AAEA;AACA;AACA;AACA,qCAAqC,mBAAmB,EAAE;AAC1D,kCAAkC,mBAAmB,EAAE;AACvD,oCAAoC,mBAAmB,EAAE;AACzD,sCAAsC,mBAAmB,EAAE;AAC3D,kCAAkC,mBAAmB,EAAE;AACvD,oCAAoC,mBAAmB,EAAE;AACzD,oCAAoC,mBAAmB,EAAE;AACzD,qCAAqC,mBAAmB,EAAE;AAC1D,sCAAsC,mBAAmB;AACzD;;AAEA;AACA;;AAEA;AACA,KAAK,IAAI;AACT;;AAEA;AACA;;AAEA;AACA;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,KAAK,IAAI;AACT;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,8BAA8B,6BAA6B;AAC3D,OAAO;AACP;AACA;AACA,8BAA8B,+BAA+B;AAC7D,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,KAAK,EAAE,EAAE;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS;AACT,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,SAAS,IAAI;AACb;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,SAAS;AACT,OAAO;AACP;AACA;;AAEA,uBAAuB,gBAAgB;;AAEvC;AACA;AACA;AACA;AACA,SAAS;AACT,2BAA2B,iBAAiB;AAC5C;AACA,6BAA6B,8CAA8C;AAC3E;;AAEA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;;AAEA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA,8DAA8D,iCAAiC;AAC/F;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oBAAoB,EAAE;AAChD;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,yGAAyG,UAAU,EAAE;AACrH;;AAEA;AACA;AACA;AACA,uBAAuB;AACvB,oBAAoB,+BAA+B;AACnD;;AAEA;AACA;AACA,oBAAoB,kCAAkC;AACtD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,YAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,KAAK,IAAI;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qCAAqC,UAAU;AAC/C;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,+CAA+C,UAAU,EAAE;AAC3D;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL,uBAAuB;AACvB;AACA,cAAc;AACd;AACA;AACA,KAAK,EAAE,EAAE;AACT;AACA;AACA;;AAEA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA,WAAW;AACX,8BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW;;AAEX;AACA;AACA,WAAW;;AAEX;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA,mEAAmE,0CAA0C;AAC7G,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,oCAAoC,uBAAuB;AAC3D;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA,0DAA0D,sBAAsB,EAAE;AAClF;AACA;AACA;AACA,OAAO;AACP;AACA,qCAAqC;AACrC;;AAEA,iEAAiE,yEAAyE,gBAAgB,EAAE,EAAE,EAAE,6CAA6C,sBAAsB,iBAAiB,EAAE,EAAE;AACxP,oCAAoC,oCAAoC,UAAU,EAAE,EAAE,EAAE;AACxF,OAAO;AACP;AACA;;AAEA;AACA;AACA,SAAS;AACT,iFAAiF,oBAAoB,EAAE;AACvG,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC,iCAAiC;AAC1E;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA,OAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,yBAAyB;AACzB,wBAAwB;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA,mCAAmC,YAAY;AAC/C;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,+BAA+B;;AAE/B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,mDAAmD;AACnD;AACA,2BAA2B,yBAAyB;;AAEpD;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,gCAAgC,kDAAkD,EAAE;AACpF;AACA;AACA;;AAEA;AACA,GAAG;AACH,6BAA6B,4EAA4E,EAAE;AAC3G,kCAAkC,4GAA4G,EAAE;AAChJ,iCAAiC,+EAA+E,EAAE;AAClH,oCAAoC,8FAA8F,EAAE;AACpI;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA,GAAG;AACH,iCAAiC,2DAA2D,EAAE;AAC9F,mCAAmC,gDAAgD,EAAE;AACrF;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA,4BAA4B;;AAE5B;AACA,GAAG;AACH;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA,GAAG;AACH,6BAA6B,2DAA2D,EAAE;AAC1F,gCAAgC,2DAA2D,EAAE;AAC7F,2BAA2B,0DAA0D,EAAE;AACvF,6BAA6B,sDAAsD,EAAE;AACrF,gCAAgC,2DAA2D,EAAE;AAC7F,+BAA+B,wDAAwD,EAAE;AACzF,0BAA0B,gEAAgE,EAAE;AAC5F,kCAAkC,wEAAwE,EAAE;AAC5G;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;;AAEA;AACA,GAAG;AACH;AACA;;AAEA;AACA,GAAG;AACH,6BAA6B,iEAAiE,EAAE;AAChG;AACA;;AAEA;AACA,GAAG;AACH;AACA;;AAEA;AACA,GAAG;AACH,+BAA+B,yEAAyE,EAAE;AAC1G,6BAA6B,uDAAuD,EAAE;AACtF,gCAAgC,iDAAiD,EAAE;AACnF;AACA;;AAEA;AACA,GAAG;AACH;AACA;;AAEA;AACA,GAAG;AACH,2BAA2B,wDAAwD;AACnF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6CAA6C;AAC7C;;AAEA;;AAEA;AACA,wEAAwE,wBAAwB,qCAAqC;AACrI,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;;;;ACz1VD;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA,kCAAkC;;AAElC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;AACA,sBAAsB,+BAA+B;AACrD,sBAAsB,iBAAiB;AACvC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,kDAAkD,iCAAiC,EAAE;AACrF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B,cAAc;;AAE3C;;AAEA;AACA;AACA;AACA,6BAA6B,UAAU;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gBAAgB;AACjC,kCAAkC;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qBAAqB;AACxC,iBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,GAAG;AACR;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA;AACA,oCAAoC;AACpC;;AAEA;AACA;AACA;AACA,iCAAiC;AACjC,uCAAuC,wBAAwB,EAAE;AACjE,0BAA0B;;AAE1B;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC,kBAAkB,YAAY;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA,wCAAwC,EAAE;AAC1C;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,oBAAoB,EAAE;AACrD;AACA,kCAAkC,OAAO;AACzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0BAA0B,SAAS,qBAAqB;;AAExD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2BAA2B;AAC9C;AACA;AACA;AACA,GAAG;AACH,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mCAAmC,OAAO;AAC1C;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,OAAO;AACzC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;;AAEA,iBAAiB,iBAAiB;AAClC;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,uBAAuB;AACzD,iCAAiC,sBAAsB;AACvD;AACA,kBAAkB;AAClB;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,iBAAiB,uBAAuB;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,OAAO;AACP;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,mBAAmB,mBAAmB;AACtC,+BAA+B;AAC/B;AACA,GAAG;AACH;AACA;AACA;AACA,kBAAkB,YAAY;AAC9B,WAAW;AACX;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,OAAO;AACrD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,oCAAoC;AACpC;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2BAA2B;AAC9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6CAA6C,SAAS;AACtD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,6CAA6C,qCAAqC,EAAE;AACpF;;AAEA;AACA;AACA;;AAEA,oCAAoC,yCAAyC,EAAE;AAC/E;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA;AACA,4BAA4B;AAC5B,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,sDAAsD,EAAE;AACtF;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,mBAAmB;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kBAAkB;AAClC;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,uBAAuB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,iCAAiC;AACnE,cAAc,6BAA6B;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kCAAkC,iCAAiC;AACnE,cAAc,6BAA6B;AAC3C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,yBAAyB;AAC1C,GAAG;AACH;AACA;AACA,iBAAiB,+BAA+B;AAChD;AACA;;AAEA;;AAEA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB,mBAAmB;AACxC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,qBAAqB;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,qBAAqB;AAClC;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO,QAEP;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,iBAAiB;AACpC;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,OAAO;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kEAAkE;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA,sBAAsB,mBAAmB;AACzC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,OAAO;AACtC;AACA;AACA,GAAG;AACH;AACA,eAAe,SAAS;AACxB;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,kCAAkC,OAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA,4CAA4C,eAAe;AAC3D,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,kDAAkD;AAClD,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;;AAEA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,iBAAiB,gBAAgB;AACjC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,iBAAiB,mBAAmB;AACpC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,qCAAqC,gEAAgE;AACrG;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,4BAA4B,+BAA+B;AAC3D,4BAA4B,+BAA+B;AAC3D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA,mBAAmB,mBAAmB;AACtC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;AACA,mCAAmC;AACnC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK,uFAAuF;AAC5F;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0CAA0C;AAC1C,iBAAiB,yBAAyB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG,+BAA+B;AAClC,mCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,oBAAoB,oBAAoB;AACxC,sBAAsB,4BAA4B;AAClD;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,OAAO;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,mBAAmB;AACnB,yBAAyB;AACzB;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,6CAA6C;AAC9E;AACA;AACA,6CAA6C,4CAA4C;;AAEzF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,GAAG,QAGH;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,KAAK,2CAA2C,8BAA8B,EAAE;;AAEhF;AACA,wCAAwC,OAAO;AAC/C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mBAAmB,qBAAqB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uCAAuC,OAAO;AAC9C;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,OAAO;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAA0B;;AAE1B,kBAAkB;AAClB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qBAAqB;AACxC;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,mBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,0BAA0B;AACpD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,oBAAoB,EAAE;;AAEpD;AACA;AACA,iBAAiB,sBAAsB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,oBAAoB;AACpB;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAmB,2BAA2B;AAC9C,qBAAqB,+BAA+B;AACpD;AACA;AACA,GAAG;AACH,yBAAyB;AACzB;AACA,sBAAsB,iCAAiC;AACvD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK,QAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA,8BAA8B;;AAE9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB,oBAAoB;AACzC;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,QAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,oBAAoB;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,eAAe;AACrC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE;AACtE;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iCAAiC;;AAEjC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;AAIA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA,0CAA0C,2BAA2B,EAAE;AACvE,KAAK;AACL;AACA,0CAA0C,4BAA4B,EAAE;AACxE,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,+BAA+B,eAAe;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mCAAmC,OAAO;AAC1C;AACA,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB,YAAY;AAC5B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+BAA+B,sBAAsB;;AAErD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB;;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAAgC;;AAEhC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA,qBAAqB,cAAc;AACnC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,aAAa,kBAAkB;AAC/B;AACA,eAAe,oBAAoB;AACnC;AACA;AACA;AACA;AACA;;AAEA;AACA,2DAA2D;AAC3D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAiC;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,qBAAqB,qBAAqB;AAC1C;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,yBAAyB;AAC9C;AACA;AACA,wBAAwB;AACxB;AACA,4BAA4B,4BAA4B;AACxD,4BAA4B,gCAAgC;AAC5D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,oBAAoB;AAC9B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,yDAAyD,UAAU;AACnE,iBAAiB,wBAAwB,OAAO,uBAAuB;AACvE;AACA;AACA,iBAAiB,2BAA2B;AAC5C;AACA;AACA;AACA;;AAEA;AACA,UAAU,oBAAoB;AAC9B;AACA;AACA;AACA;AACA;AACA,SAAS,OAAO;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,uBAAuB;AACxC;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,6CAA6C;AAC7C,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO,kDAAkD;AACzD;AACA;AACA;AACA;AACA,OAAO,kDAAkD;AACzD;AACA;AACA;AACA;AACA,OAAO;AACP,mCAAmC,gEAAgE;AACnG;AACA;AACA;AACA,gCAAgC;AAChC;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,mBAAmB,qBAAqB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA,uBAAuB,SAAS;AAChC;AACA,2CAA2C;AAC3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,uBAAuB,OAAO,gCAAgC;AAC/E,wDAAwD,oBAAoB;AAC5E;AACA;AACA;AACA,2BAA2B,gEAAgE;AAC3F,OAAO;AACP;AACA;AACA;AACA,mCAAmC,iCAAiC;AACpE;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,2DAA2D,oBAAoB;AAC/E;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,qBAAqB,kBAAkB;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,gCAAgC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,6BAA6B,uBAAuB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,6BAA6B;AACzD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA2B,wBAAwB;AACnD;AACA;AACA;AACA;AACA,+BAA+B,yBAAyB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,yBAAyB;AAC1D;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,qBAAqB,8BAA8B;AACnD;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,iBAAiB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4EAA4E;AAC5E;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,gBAAgB;AAC7B;AACA;AACA;AACA,wCAAwC,kBAAkB;AAC1D,KAAK;AACL,wCAAwC,kBAAkB;AAC1D,KAAK;AACL,wCAAwC,0BAA0B;AAClE,KAAK;AACL,wCAAwC,iBAAiB;AACzD,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA,mCAAmC;AACnC,mCAAmC;AACnC,2CAA2C;AAC3C,2BAA2B;AAC3B,2BAA2B;AAC3B,4BAA4B;AAC5B,4BAA4B;AAC5B,2BAA2B;AAC3B,2BAA2B;AAC3B;AACA,uBAAuB;AACvB;AACA;AACA;AACA,cAAc,QAAQ;AACtB;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,eAAe,oBAAoB;AACnC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gCAAgC,eAAe,EAAE,uBAAuB,UAAU,EAAE;AACpF;AACA;;AAEA;AACA,mDAAmD,6CAA6C;AAChG;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA2B,6CAA6C;AACxE;AACA;;AAEA;AACA;AACA;AACA,kCAAkC,2BAA2B;AAC7D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qDAAqD;AACrD,GAAG;AACH,yCAAyC;AACzC;;AAEA,iCAAiC,wCAAwC;AACzE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kCAAkC,OAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wDAAwD,mBAAmB;AAC3E;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,aAAa;AACpC,uBAAuB,aAAa;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iFAAiF;AACjF,4BAA4B;AAC5B;AACA,2BAA2B;AAC3B,wBAAwB,iEAAiE;AACzF,YAAY,0FAA0F;AACtG,MAAM,KAAK,0CAA0C;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,kBAAkB;AAC/D,sBAAsB,+CAA+C;AACrE,iDAAiD;;AAEjD;AACA,sDAAsD;AACtD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,2BAA2B;AACtD,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,6CAA6C,EAAE;AACtD;AACA;;AAEA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA,UAAU;AACV;AACA,uCAAuC,SAAS;AAChD;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,wBAAwB;AACzC;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oDAAoD,4BAA4B,EAAE;AAClF,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oDAAoD,+BAA+B,EAAE;AACrF,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8CAA8C,aAAa;;AAE3D;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,iCAAiC,qCAAqC;;AAEtE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,uCAAuC,EAAE;AACpF;AACA;AACA;AACA,6CAA6C,2CAA2C,EAAE;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,8BAA8B,EAAE;AACrE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;;AAEA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,kCAAkC,uCAAuC;;AAEzE,qCAAqC,0BAA0B;;AAE/D;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8CAA8C;AAC9C;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,wCAAwC,gBAAgB;AACxD;AACA;AACA,gEAAgE,sBAAsB,EAAE;AACxF;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,wBAAwB;AAC3C;AACA;AACA;AACA;AACA;AACA,WAAW,uBAAuB;AAClC,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,2BAA2B;AAClD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,yBAAyB,EAAE;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,YACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA,sBAAsB,EAAE,iBAAiB,EAAE;AAC3C,+BAA+B;;AAE/B;AACA;AACA;AACA;AACA,CAAC;;;;AAID;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,OAAO;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,OAAO;AACP,OAAO;AACP,SAAS;AACT,QAAQ;AACR,QAAQ;AACR,OAAO;AACP,QAAQ;AACR;AACA,2CAA2C;AAC3C,8DAA8D;;AAE9D;AACA;AACA,qDAAqD,2DAA2D;;AAEhH;AACA;AACA,6CAA6C,2BAA2B,EAAE;AAC1E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kFAAkF,6BAA6B;AAC/G;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAkB,uGAAuG;AACzH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAwB,eAAe;AACvC,sBAAsB,aAAa;;AAEnC;AACA;AACA;AACA,kCAAkC,UAAU;AAC5C;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA,oCAAoC,UAAU;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,4BAA4B,eAAe;AAC3C;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kCAAkC,iDAAiD;;AAEnF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,6DAA6D;AACxE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6DAA6D,uBAAuB,EAAE;AACtF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2BAA2B;AAC9C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,IAAI;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,WAAW;AACX;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB,SAAS;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,uBAAuB;AACxC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE;AAChE;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B,OAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO,4BAA4B;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,OAAO;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,OAAO;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,wBAAwB,EAAE;AAC1D;AACA;AACA;;AAEA;AACA;AACA,mCAAmC,OAAO;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,OAAO;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,WAAW;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,+CAA+C,OAAO;AACtD;AACA;AACA;AACA;AACA,uDAAuD,WAAW;AAClE;AACA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB;AACxB;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,6BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,qCAAqC,2CAA2C,GAAG;;AAEnF;AACA,kCAAkC;AAClC,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,qBAAqB,sCAAsC;AAC3D;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,wBAAwB;AACxB;;AAEA;AACA,mDAAmD,4BAA4B,EAAE;AACjF;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,8BAA8B,+EAA+E;AAC7G,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,4CAA4C,gCAAgC,EAAE;AAC9E,yCAAyC,0CAA0C,EAAE;AACrF;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,2BAA2B;AACzD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,sCAAsC,iDAAiD;AACvF;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;AAMA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA,uCAAuC,iDAAiD;AACxF;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,oBAAoB;AAC7C;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB,6BAA6B;AAChD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,uCAAuC;AACjF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;AACzB;AACA,qDAAqD;AACrD;AACA,MAAM;AACN;;AAEA;AACA,eAAe;;AAEf;AACA;AACA;AACA,aAAa,oBAAoB;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,6BAA6B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,6GAA6G;AACjI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,8BAA8B,OAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sUAAsU;AACrV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,6BAA6B,kBAAkB,iCAAiC,4EAA4E,qBAAqB,aAAa,GAAG,EAAE,kBAAkB;AACrN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB,yCAAyC,EAAE;AACpE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA,YAAY,0EAA0E;AACtF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,sBAAsB,EAAE;AACtE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,qBAAqB;AACtC;AACA;AACA;AACA;AACA;AACA,+DAA+D,oCAAoC,EAAE;AACrG;AACA;AACA;AACA;AACA,+DAA+D,gCAAgC,EAAE;AACjG;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mFAAmF;AACnF;AACA;AACA;AACA;AACA,OAAO,EAAE,EAAE;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,kBAAkB,mCAAmC;AACrD;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,6EAA6E,GAAG;;AAEhF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,0BAA0B;AAC/C;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA,6BAA6B,+BAA+B;AAC5D,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB;AAClB,kBAAkB,eAAe;AACjC;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;AACA;AACA;AACA,GAAG;AACH,iBAAiB,uBAAuB;AACxC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA;AACA,8CAA8C,mBAAmB,EAAE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,uBAAuB,EAAE;AACvE,SAAS;AACT,gDAAgD,qBAAqB,EAAE;AACvE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;;+DAEA;;;AAGA;AACQ;;;;;;;;;;;;;AC5tXR;AACA;;;;;;;;;;;;;ACDA;;AAEA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;;AAEA;AACA;AACA,4CAA4C;;AAE5C;;;;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;;;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACrBA;;;;;;;;;AASA;;;;;;IAMMwH,sB;;;AACJ;;;AAGA,kCAAaC,OAAb,EAAsB;AAAA;;AACpB,SAAKA,OAAL,GAAeA,OAAf;AACD;AAED;;;;;8BACW,CAEV,C,CADC;;AAGF;;;;8BACW;AAAA;;AACT,aAAO,IAAIxF,OAAJ,CAAY,UAACC,OAAD;AAAA,eAAaA,OAAO,CACrC,KAAI,CAACuF,OAAL,CAAatQ,MAAb,EADqC,CAApB;AAAA,OAAZ,CAAP;AAGD;AAED;;;;uBACIX,I,EAAM+P,Q,EAAU,CAEnB,C,CADC;;AAGF;;;;wBACK/P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ACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CAGA;AACA;AACA;AACA;AACA;AAEA;;AACA,+CAAM,CAAC/tB,MAAP,CAAcwuB,MAAd,GAAuB,IAAvB;AACA,IAAMC,MAAM,GAAG,IAAI,+CAAJ,EAAf,C,CACA;;AACA,IAAI5pC,OAAJ,CAAY,UAACC,OAAD;AAAA,SAAaA,OAAO,CAC9B2pC,MAAM,CACLC,QADD,CACU,SADV,EACqBtlC,OADrB,EAECslC,QAFD,CAEU,0BAFV,EAEsC,gEAFtC,EAGCA,QAHD,CAGU,eAHV,EAG2B,4CAH3B,EAICA,QAJD,CAIU,yBAJV,EAIqC,+DAJrC,EAKCA,QALD,CAKU,iCALV,EAK6C;AAAChtC,OAAG,YAAK,iDAAM,CAACiD,IAAZ,iBAAJ;AAAoCgqC,aAAS,EAAE,iDAAM,CAACx7B;AAAtD,GAL7C,EAMCu7B,QAND,CAMU,6BANV,EAMyC;AAACE,OAAG,EAAH,4CAAAA;AAAD,GANzC,EAOCF,QAPD,CAOU,SAPV,EAOqBG,IAAI,CAAC9vB,OAP1B,EAQC2vB,QARD,CAQU,KARV,EAQiB,aARjB,EASCA,QATD,CAS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Q,IAAI,8BAA8B,QAAQ,cAAc,qDAAqD,4BAA4B,GAAG,EAAE,wDAAwD,2IAA2I,EAAE,4BAA4B,iEAAiE,EAAE,2CAA2C,oFAAoF,EAAE,0BAA0B,oBAAoB,EAAE,+BAA+B,sCAAsC,EAAE,8BAA8B,iCAAiC,EAAE,6BAA6B,yCAAyC,EAAE,yBAAyB,yBAAyB,EAAE,yBAAyB,yBAAyB,KAAK,IAAI,YAAY,iBAAiB,aAAa,kCAAkC,WAAW,yEAAyE,0BAA0B,GAAG,E;;;;;;;;;;;ACAly0B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,kCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,wCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,uDAAuD;AACvD,SAAS;AACT;AACA,SAAS;AACT,8EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAE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","file":"main.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","function _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;","function _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) {\n    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {\n      arr2[i] = arr[i];\n    }\n\n    return arr2;\n  }\n}\n\nmodule.exports = _arrayWithoutHoles;","function _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nmodule.exports = _assertThisInitialized;","function _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nmodule.exports = _createClass;","function _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nmodule.exports = _defineProperty;","function _getPrototypeOf(o) {\n  module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nmodule.exports = _getPrototypeOf;","var setPrototypeOf = require(\"./setPrototypeOf\");\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inherits;","function _iterableToArray(iter) {\n  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nmodule.exports = _iterableToArray;","function _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;","function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nmodule.exports = _nonIterableRest;","function _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nmodule.exports = _nonIterableSpread;","var defineProperty = require(\"./defineProperty\");\n\nfunction _objectSpread(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n    var ownKeys = Object.keys(source);\n\n    if (typeof Object.getOwnPropertySymbols === 'function') {\n      ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n        return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n      }));\n    }\n\n    ownKeys.forEach(function (key) {\n      defineProperty(target, key, source[key]);\n    });\n  }\n\n  return target;\n}\n\nmodule.exports = _objectSpread;","var _typeof = require(\"../helpers/typeof\");\n\nvar assertThisInitialized = require(\"./assertThisInitialized\");\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return assertThisInitialized(self);\n}\n\nmodule.exports = _possibleConstructorReturn;","function _setPrototypeOf(o, p) {\n  module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","var arrayWithoutHoles = require(\"./arrayWithoutHoles\");\n\nvar iterableToArray = require(\"./iterableToArray\");\n\nvar nonIterableSpread = require(\"./nonIterableSpread\");\n\nfunction _toConsumableArray(arr) {\n  return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();\n}\n\nmodule.exports = _toConsumableArray;","function _typeof2(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\") {\n    module.exports = _typeof = function _typeof(obj) {\n      return _typeof2(obj);\n    };\n  } else {\n    module.exports = _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n    };\n  }\n\n  return _typeof(obj);\n}\n\nmodule.exports = _typeof;","import * as tslib_1 from \"tslib\";\nimport { BaseBackend } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addExceptionMechanism, supportsFetch, SyncPromise } from '@sentry/utils';\nimport { eventFromString, eventFromUnknownInput } from './eventbuilder';\nimport { FetchTransport, XHRTransport } from './transports';\n/**\n * The Sentry Browser SDK Backend.\n * @hidden\n */\nvar BrowserBackend = /** @class */ (function (_super) {\n    tslib_1.__extends(BrowserBackend, _super);\n    function BrowserBackend() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    /**\n     * @inheritDoc\n     */\n    BrowserBackend.prototype._setupTransport = function () {\n        if (!this._options.dsn) {\n            // We return the noop transport here in case there is no Dsn.\n            return _super.prototype._setupTransport.call(this);\n        }\n        var transportOptions = tslib_1.__assign({}, this._options.transportOptions, { dsn: this._options.dsn });\n        if (this._options.transport) {\n            return new this._options.transport(transportOptions);\n        }\n        if (supportsFetch()) {\n            return new FetchTransport(transportOptions);\n        }\n        return new XHRTransport(transportOptions);\n    };\n    /**\n     * @inheritDoc\n     */\n    BrowserBackend.prototype.eventFromException = function (exception, hint) {\n        var syntheticException = (hint && hint.syntheticException) || undefined;\n        var event = eventFromUnknownInput(exception, syntheticException, {\n            attachStacktrace: this._options.attachStacktrace,\n        });\n        addExceptionMechanism(event, {\n            handled: true,\n            type: 'generic',\n        });\n        event.level = Severity.Error;\n        if (hint && hint.event_id) {\n            event.event_id = hint.event_id;\n        }\n        return SyncPromise.resolve(event);\n    };\n    /**\n     * @inheritDoc\n     */\n    BrowserBackend.prototype.eventFromMessage = function (message, level, hint) {\n        if (level === void 0) { level = Severity.Info; }\n        var syntheticException = (hint && hint.syntheticException) || undefined;\n        var event = eventFromString(message, syntheticException, {\n            attachStacktrace: this._options.attachStacktrace,\n        });\n        event.level = level;\n        if (hint && hint.event_id) {\n            event.event_id = hint.event_id;\n        }\n        return SyncPromise.resolve(event);\n    };\n    return BrowserBackend;\n}(BaseBackend));\nexport { BrowserBackend };\n//# sourceMappingURL=backend.js.map","import * as tslib_1 from \"tslib\";\nimport { API, BaseClient } from '@sentry/core';\nimport { getGlobalObject, logger } from '@sentry/utils';\nimport { BrowserBackend } from './backend';\nimport { SDK_NAME, SDK_VERSION } from './version';\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nvar BrowserClient = /** @class */ (function (_super) {\n    tslib_1.__extends(BrowserClient, _super);\n    /**\n     * Creates a new Browser SDK instance.\n     *\n     * @param options Configuration options for this SDK.\n     */\n    function BrowserClient(options) {\n        if (options === void 0) { options = {}; }\n        return _super.call(this, BrowserBackend, options) || this;\n    }\n    /**\n     * @inheritDoc\n     */\n    BrowserClient.prototype._prepareEvent = function (event, scope, hint) {\n        event.platform = event.platform || 'javascript';\n        event.sdk = tslib_1.__assign({}, event.sdk, { name: SDK_NAME, packages: tslib_1.__spread(((event.sdk && event.sdk.packages) || []), [\n                {\n                    name: 'npm:@sentry/browser',\n                    version: SDK_VERSION,\n                },\n            ]), version: SDK_VERSION });\n        return _super.prototype._prepareEvent.call(this, event, scope, hint);\n    };\n    /**\n     * Show a report dialog to the user to send feedback to a specific event.\n     *\n     * @param options Set individual options for the dialog\n     */\n    BrowserClient.prototype.showReportDialog = function (options) {\n        if (options === void 0) { options = {}; }\n        // doesn't work without a document (React Native)\n        var document = getGlobalObject().document;\n        if (!document) {\n            return;\n        }\n        if (!this._isEnabled()) {\n            logger.error('Trying to call showReportDialog with Sentry Client is disabled');\n            return;\n        }\n        var dsn = options.dsn || this.getDsn();\n        if (!options.eventId) {\n            logger.error('Missing `eventId` option in showReportDialog call');\n            return;\n        }\n        if (!dsn) {\n            logger.error('Missing `Dsn` option in showReportDialog call');\n            return;\n        }\n        var script = document.createElement('script');\n        script.async = true;\n        script.src = new API(dsn).getReportDialogEndpoint(options);\n        if (options.onLoad) {\n            script.onload = options.onLoad;\n        }\n        (document.head || document.body).appendChild(script);\n    };\n    return BrowserClient;\n}(BaseClient));\nexport { BrowserClient };\n//# sourceMappingURL=client.js.map","import { addExceptionMechanism, addExceptionTypeValue, isDOMError, isDOMException, isError, isErrorEvent, isEvent, isPlainObject, } from '@sentry/utils';\nimport { eventFromPlainObject, eventFromStacktrace, prepareFramesForEvent } from './parsers';\nimport { computeStackTrace } from './tracekit';\n/** JSDoc */\nexport function eventFromUnknownInput(exception, syntheticException, options) {\n    if (options === void 0) { options = {}; }\n    var event;\n    if (isErrorEvent(exception) && exception.error) {\n        // If it is an ErrorEvent with `error` property, extract it to get actual Error\n        var errorEvent = exception;\n        exception = errorEvent.error; // tslint:disable-line:no-parameter-reassignment\n        event = eventFromStacktrace(computeStackTrace(exception));\n        return event;\n    }\n    if (isDOMError(exception) || isDOMException(exception)) {\n        // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n        // then we just extract the name and message, as they don't provide anything else\n        // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n        // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n        var domException = exception;\n        var name_1 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n        var message = domException.message ? name_1 + \": \" + domException.message : name_1;\n        event = eventFromString(message, syntheticException, options);\n        addExceptionTypeValue(event, message);\n        return event;\n    }\n    if (isError(exception)) {\n        // we have a real Error object, do nothing\n        event = eventFromStacktrace(computeStackTrace(exception));\n        return event;\n    }\n    if (isPlainObject(exception) || isEvent(exception)) {\n        // If it is plain Object or Event, serialize it manually and extract options\n        // This will allow us to group events based on top-level keys\n        // which is much better than creating new group when any key/value change\n        var objectException = exception;\n        event = eventFromPlainObject(objectException, syntheticException, options.rejection);\n        addExceptionMechanism(event, {\n            synthetic: true,\n        });\n        return event;\n    }\n    // If none of previous checks were valid, then it means that it's not:\n    // - an instance of DOMError\n    // - an instance of DOMException\n    // - an instance of Event\n    // - an instance of Error\n    // - a valid ErrorEvent (one with an error property)\n    // - a plain Object\n    //\n    // So bail out and capture it as a simple message:\n    event = eventFromString(exception, syntheticException, options);\n    addExceptionTypeValue(event, \"\" + exception, undefined);\n    addExceptionMechanism(event, {\n        synthetic: true,\n    });\n    return event;\n}\n// this._options.attachStacktrace\n/** JSDoc */\nexport function eventFromString(input, syntheticException, options) {\n    if (options === void 0) { options = {}; }\n    var event = {\n        message: input,\n    };\n    if (options.attachStacktrace && syntheticException) {\n        var stacktrace = computeStackTrace(syntheticException);\n        var frames_1 = prepareFramesForEvent(stacktrace.stack);\n        event.stacktrace = {\n            frames: frames_1,\n        };\n    }\n    return event;\n}\n//# sourceMappingURL=eventbuilder.js.map","import * as tslib_1 from \"tslib\";\nimport { captureException, withScope } from '@sentry/core';\nimport { addExceptionMechanism, addExceptionTypeValue, normalize } from '@sentry/utils';\nvar ignoreOnError = 0;\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError() {\n    return ignoreOnError > 0;\n}\n/**\n * @hidden\n */\nexport function ignoreNextOnError() {\n    // onerror should trigger before setTimeout\n    ignoreOnError += 1;\n    setTimeout(function () {\n        ignoreOnError -= 1;\n    });\n}\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap(fn, options, before) {\n    if (options === void 0) { options = {}; }\n    // tslint:disable-next-line:strict-type-predicates\n    if (typeof fn !== 'function') {\n        return fn;\n    }\n    try {\n        // We don't wanna wrap it twice\n        if (fn.__sentry__) {\n            return fn;\n        }\n        // If this has already been wrapped in the past, return that wrapped function\n        if (fn.__sentry_wrapped__) {\n            return fn.__sentry_wrapped__;\n        }\n    }\n    catch (e) {\n        // Just accessing custom props in some Selenium environments\n        // can cause a \"Permission denied\" exception (see raven-js#495).\n        // Bail on wrapping and return the function as-is (defers to window.onerror).\n        return fn;\n    }\n    var sentryWrapped = function () {\n        var args = Array.prototype.slice.call(arguments);\n        // tslint:disable:no-unsafe-any\n        try {\n            // tslint:disable-next-line:strict-type-predicates\n            if (before && typeof before === 'function') {\n                before.apply(this, arguments);\n            }\n            var wrappedArguments = args.map(function (arg) { return wrap(arg, options); });\n            if (fn.handleEvent) {\n                // Attempt to invoke user-land function\n                // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n                //       means the sentry.javascript SDK caught an error invoking your application code. This\n                //       is expected behavior and NOT indicative of a bug with sentry.javascript.\n                return fn.handleEvent.apply(this, wrappedArguments);\n            }\n            // Attempt to invoke user-land function\n            // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n            //       means the sentry.javascript SDK caught an error invoking your application code. This\n            //       is expected behavior and NOT indicative of a bug with sentry.javascript.\n            return fn.apply(this, wrappedArguments);\n            // tslint:enable:no-unsafe-any\n        }\n        catch (ex) {\n            ignoreNextOnError();\n            withScope(function (scope) {\n                scope.addEventProcessor(function (event) {\n                    var processedEvent = tslib_1.__assign({}, event);\n                    if (options.mechanism) {\n                        addExceptionTypeValue(processedEvent, undefined, undefined);\n                        addExceptionMechanism(processedEvent, options.mechanism);\n                    }\n                    processedEvent.extra = tslib_1.__assign({}, processedEvent.extra, { arguments: normalize(args, 3) });\n                    return processedEvent;\n                });\n                captureException(ex);\n            });\n            throw ex;\n        }\n    };\n    // Accessing some objects may throw\n    // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n    try {\n        for (var property in fn) {\n            if (Object.prototype.hasOwnProperty.call(fn, property)) {\n                sentryWrapped[property] = fn[property];\n            }\n        }\n    }\n    catch (_oO) { } // tslint:disable-line:no-empty\n    fn.prototype = fn.prototype || {};\n    sentryWrapped.prototype = fn.prototype;\n    Object.defineProperty(fn, '__sentry_wrapped__', {\n        enumerable: false,\n        value: sentryWrapped,\n    });\n    // Signal that this function has been wrapped/filled already\n    // for both debugging and to prevent it to being wrapped/filled twice\n    Object.defineProperties(sentryWrapped, {\n        __sentry__: {\n            enumerable: false,\n            value: true,\n        },\n        __sentry_original__: {\n            enumerable: false,\n            value: fn,\n        },\n    });\n    // Restore original function name (not all browsers allow that)\n    try {\n        var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name');\n        if (descriptor.configurable) {\n            Object.defineProperty(sentryWrapped, 'name', {\n                get: function () {\n                    return fn.name;\n                },\n            });\n        }\n    }\n    catch (_oO) {\n        /*no-empty*/\n    }\n    return sentryWrapped;\n}\n//# sourceMappingURL=helpers.js.map","import * as tslib_1 from \"tslib\";\nexport { Severity, Status, } from '@sentry/types';\nexport { addGlobalEventProcessor, addBreadcrumb, captureException, captureEvent, captureMessage, configureScope, getHubFromCarrier, getCurrentHub, Hub, Scope, setContext, setExtra, setExtras, setTag, setTags, setUser, withScope, } from '@sentry/core';\nexport { BrowserClient } from './client';\nexport { defaultIntegrations, forceLoad, init, lastEventId, onLoad, showReportDialog, flush, close, wrap } from './sdk';\nexport { SDK_NAME, SDK_VERSION } from './version';\nimport { Integrations as CoreIntegrations } from '@sentry/core';\nimport { getGlobalObject } from '@sentry/utils';\nimport * as BrowserIntegrations from './integrations';\nimport * as Transports from './transports';\nvar windowIntegrations = {};\n// This block is needed to add compatibility with the integrations packages when used with a CDN\n// tslint:disable: no-unsafe-any\nvar _window = getGlobalObject();\nif (_window.Sentry && _window.Sentry.Integrations) {\n    windowIntegrations = _window.Sentry.Integrations;\n}\n// tslint:enable: no-unsafe-any\nvar INTEGRATIONS = tslib_1.__assign({}, windowIntegrations, CoreIntegrations, BrowserIntegrations);\nexport { INTEGRATIONS as Integrations, Transports };\n//# sourceMappingURL=index.js.map","import * as tslib_1 from \"tslib\";\nimport { API, getCurrentHub } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addInstrumentationHandler, getEventDescription, getGlobalObject, htmlTreeAsString, logger, normalize, parseUrl, safeJoin, } from '@sentry/utils';\n/**\n * Default Breadcrumbs instrumentations\n * TODO: Deprecated - with v6, this will be renamed to `Instrument`\n */\nvar Breadcrumbs = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function Breadcrumbs(options) {\n        /**\n         * @inheritDoc\n         */\n        this.name = Breadcrumbs.id;\n        this._options = tslib_1.__assign({ console: true, dom: true, fetch: true, history: true, sentry: true, xhr: true }, options);\n    }\n    /**\n     * Creates breadcrumbs from console API calls\n     */\n    Breadcrumbs.prototype._consoleBreadcrumb = function (handlerData) {\n        var breadcrumb = {\n            category: 'console',\n            data: {\n                extra: {\n                    arguments: normalize(handlerData.args, 3),\n                },\n                logger: 'console',\n            },\n            level: Severity.fromString(handlerData.level),\n            message: safeJoin(handlerData.args, ' '),\n        };\n        if (handlerData.level === 'assert') {\n            if (handlerData.args[0] === false) {\n                breadcrumb.message = \"Assertion failed: \" + (safeJoin(handlerData.args.slice(1), ' ') || 'console.assert');\n                breadcrumb.data.extra.arguments = normalize(handlerData.args.slice(1), 3);\n            }\n            else {\n                // Don't capture a breadcrumb for passed assertions\n                return;\n            }\n        }\n        getCurrentHub().addBreadcrumb(breadcrumb, {\n            input: handlerData.args,\n            level: handlerData.level,\n        });\n    };\n    /**\n     * Creates breadcrumbs from DOM API calls\n     */\n    Breadcrumbs.prototype._domBreadcrumb = function (handlerData) {\n        var target;\n        // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n        try {\n            target = handlerData.event.target\n                ? htmlTreeAsString(handlerData.event.target)\n                : htmlTreeAsString(handlerData.event);\n        }\n        catch (e) {\n            target = '<unknown>';\n        }\n        if (target.length === 0) {\n            return;\n        }\n        getCurrentHub().addBreadcrumb({\n            category: \"ui.\" + handlerData.name,\n            message: target,\n        }, {\n            event: event,\n            name: handlerData.name,\n        });\n    };\n    /**\n     * Creates breadcrumbs from XHR API calls\n     */\n    Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) {\n        if (handlerData.endTimestamp) {\n            // We only capture complete, non-sentry requests\n            if (handlerData.xhr.__sentry_own_request__) {\n                return;\n            }\n            getCurrentHub().addBreadcrumb({\n                category: 'xhr',\n                data: handlerData.xhr.__sentry_xhr__,\n                type: 'http',\n            }, {\n                xhr: handlerData.xhr,\n            });\n            return;\n        }\n        // We only capture issued sentry requests\n        if (handlerData.xhr.__sentry_own_request__) {\n            addSentryBreadcrumb(handlerData.args[0]);\n        }\n    };\n    /**\n     * Creates breadcrumbs from fetch API calls\n     */\n    Breadcrumbs.prototype._fetchBreadcrumb = function (handlerData) {\n        // We only capture complete fetch requests\n        if (!handlerData.endTimestamp) {\n            return;\n        }\n        var client = getCurrentHub().getClient();\n        var dsn = client && client.getDsn();\n        if (dsn) {\n            var filterUrl = new API(dsn).getStoreEndpoint();\n            // if Sentry key appears in URL, don't capture it as a request\n            // but rather as our own 'sentry' type breadcrumb\n            if (filterUrl &&\n                handlerData.fetchData.url.indexOf(filterUrl) !== -1 &&\n                handlerData.fetchData.method === 'POST' &&\n                handlerData.args[1] &&\n                handlerData.args[1].body) {\n                addSentryBreadcrumb(handlerData.args[1].body);\n                return;\n            }\n        }\n        if (handlerData.error) {\n            getCurrentHub().addBreadcrumb({\n                category: 'fetch',\n                data: tslib_1.__assign({}, handlerData.fetchData, { status_code: handlerData.response.status }),\n                level: Severity.Error,\n                type: 'http',\n            }, {\n                data: handlerData.error,\n                input: handlerData.args,\n            });\n        }\n        else {\n            getCurrentHub().addBreadcrumb({\n                category: 'fetch',\n                data: tslib_1.__assign({}, handlerData.fetchData, { status_code: handlerData.response.status }),\n                type: 'http',\n            }, {\n                input: handlerData.args,\n                response: handlerData.response,\n            });\n        }\n    };\n    /**\n     * Creates breadcrumbs from history API calls\n     */\n    Breadcrumbs.prototype._historyBreadcrumb = function (handlerData) {\n        var global = getGlobalObject();\n        var from = handlerData.from;\n        var to = handlerData.to;\n        var parsedLoc = parseUrl(global.location.href);\n        var parsedFrom = parseUrl(from);\n        var parsedTo = parseUrl(to);\n        // Initial pushState doesn't provide `from` information\n        if (!parsedFrom.path) {\n            parsedFrom = parsedLoc;\n        }\n        // Use only the path component of the URL if the URL matches the current\n        // document (almost all the time when using pushState)\n        if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n            // tslint:disable-next-line:no-parameter-reassignment\n            to = parsedTo.relative;\n        }\n        if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n            // tslint:disable-next-line:no-parameter-reassignment\n            from = parsedFrom.relative;\n        }\n        getCurrentHub().addBreadcrumb({\n            category: 'navigation',\n            data: {\n                from: from,\n                to: to,\n            },\n        });\n    };\n    /**\n     * Instrument browser built-ins w/ breadcrumb capturing\n     *  - Console API\n     *  - DOM API (click/typing)\n     *  - XMLHttpRequest API\n     *  - Fetch API\n     *  - History API\n     */\n    Breadcrumbs.prototype.setupOnce = function () {\n        var _this = this;\n        if (this._options.console) {\n            addInstrumentationHandler({\n                callback: function () {\n                    var args = [];\n                    for (var _i = 0; _i < arguments.length; _i++) {\n                        args[_i] = arguments[_i];\n                    }\n                    _this._consoleBreadcrumb.apply(_this, tslib_1.__spread(args));\n                },\n                type: 'console',\n            });\n        }\n        if (this._options.dom) {\n            addInstrumentationHandler({\n                callback: function () {\n                    var args = [];\n                    for (var _i = 0; _i < arguments.length; _i++) {\n                        args[_i] = arguments[_i];\n                    }\n                    _this._domBreadcrumb.apply(_this, tslib_1.__spread(args));\n                },\n                type: 'dom',\n            });\n        }\n        if (this._options.xhr) {\n            addInstrumentationHandler({\n                callback: function () {\n                    var args = [];\n                    for (var _i = 0; _i < arguments.length; _i++) {\n                        args[_i] = arguments[_i];\n                    }\n                    _this._xhrBreadcrumb.apply(_this, tslib_1.__spread(args));\n                },\n                type: 'xhr',\n            });\n        }\n        if (this._options.fetch) {\n            addInstrumentationHandler({\n                callback: function () {\n                    var args = [];\n                    for (var _i = 0; _i < arguments.length; _i++) {\n                        args[_i] = arguments[_i];\n                    }\n                    _this._fetchBreadcrumb.apply(_this, tslib_1.__spread(args));\n                },\n                type: 'fetch',\n            });\n        }\n        if (this._options.history) {\n            addInstrumentationHandler({\n                callback: function () {\n                    var args = [];\n                    for (var _i = 0; _i < arguments.length; _i++) {\n                        args[_i] = arguments[_i];\n                    }\n                    _this._historyBreadcrumb.apply(_this, tslib_1.__spread(args));\n                },\n                type: 'history',\n            });\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Breadcrumbs.id = 'Breadcrumbs';\n    return Breadcrumbs;\n}());\nexport { Breadcrumbs };\n/**\n * Create a breadcrumb of `sentry` from the events themselves\n */\nfunction addSentryBreadcrumb(serializedData) {\n    // There's always something that can go wrong with deserialization...\n    try {\n        var event_1 = JSON.parse(serializedData);\n        getCurrentHub().addBreadcrumb({\n            category: 'sentry',\n            event_id: event_1.event_id,\n            level: event_1.level || Severity.fromString('error'),\n            message: getEventDescription(event_1),\n        }, {\n            event: event_1,\n        });\n    }\n    catch (_oO) {\n        logger.error('Error while adding sentry type breadcrumb');\n    }\n}\n//# sourceMappingURL=breadcrumbs.js.map","import * as tslib_1 from \"tslib\";\nimport { getCurrentHub } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addExceptionMechanism, getGlobalObject, getLocationHref, isErrorEvent, isPrimitive, isString, logger, } from '@sentry/utils';\nimport { eventFromUnknownInput } from '../eventbuilder';\nimport { shouldIgnoreOnError } from '../helpers';\n/** Global handlers */\nvar GlobalHandlers = /** @class */ (function () {\n    /** JSDoc */\n    function GlobalHandlers(options) {\n        /**\n         * @inheritDoc\n         */\n        this.name = GlobalHandlers.id;\n        /** JSDoc */\n        this._global = getGlobalObject();\n        /** JSDoc */\n        this._oldOnErrorHandler = null;\n        /** JSDoc */\n        this._oldOnUnhandledRejectionHandler = null;\n        /** JSDoc */\n        this._onErrorHandlerInstalled = false;\n        /** JSDoc */\n        this._onUnhandledRejectionHandlerInstalled = false;\n        this._options = tslib_1.__assign({ onerror: true, onunhandledrejection: true }, options);\n    }\n    /**\n     * @inheritDoc\n     */\n    GlobalHandlers.prototype.setupOnce = function () {\n        Error.stackTraceLimit = 50;\n        if (this._options.onerror) {\n            logger.log('Global Handler attached: onerror');\n            this._installGlobalOnErrorHandler();\n        }\n        if (this._options.onunhandledrejection) {\n            logger.log('Global Handler attached: onunhandledrejection');\n            this._installGlobalOnUnhandledRejectionHandler();\n        }\n    };\n    /** JSDoc */\n    GlobalHandlers.prototype._installGlobalOnErrorHandler = function () {\n        if (this._onErrorHandlerInstalled) {\n            return;\n        }\n        var self = this; // tslint:disable-line:no-this-assignment\n        this._oldOnErrorHandler = this._global.onerror;\n        this._global.onerror = function (msg, url, line, column, error) {\n            var currentHub = getCurrentHub();\n            var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n            var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n            if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n                if (self._oldOnErrorHandler) {\n                    return self._oldOnErrorHandler.apply(this, arguments);\n                }\n                return false;\n            }\n            var client = currentHub.getClient();\n            var event = isPrimitive(error)\n                ? self._eventFromIncompleteOnError(msg, url, line, column)\n                : self._enhanceEventWithInitialFrame(eventFromUnknownInput(error, undefined, {\n                    attachStacktrace: client && client.getOptions().attachStacktrace,\n                    rejection: false,\n                }), url, line, column);\n            addExceptionMechanism(event, {\n                handled: false,\n                type: 'onerror',\n            });\n            currentHub.captureEvent(event, {\n                originalException: error,\n            });\n            if (self._oldOnErrorHandler) {\n                return self._oldOnErrorHandler.apply(this, arguments);\n            }\n            return false;\n        };\n        this._onErrorHandlerInstalled = true;\n    };\n    /** JSDoc */\n    GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () {\n        if (this._onUnhandledRejectionHandlerInstalled) {\n            return;\n        }\n        var self = this; // tslint:disable-line:no-this-assignment\n        this._oldOnUnhandledRejectionHandler = this._global.onunhandledrejection;\n        this._global.onunhandledrejection = function (e) {\n            var error = e;\n            try {\n                error = e && 'reason' in e ? e.reason : e;\n            }\n            catch (_oO) {\n                // no-empty\n            }\n            var currentHub = getCurrentHub();\n            var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n            var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n            if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n                if (self._oldOnUnhandledRejectionHandler) {\n                    return self._oldOnUnhandledRejectionHandler.apply(this, arguments);\n                }\n                return true;\n            }\n            var client = currentHub.getClient();\n            var event = isPrimitive(error)\n                ? self._eventFromIncompleteRejection(error)\n                : eventFromUnknownInput(error, undefined, {\n                    attachStacktrace: client && client.getOptions().attachStacktrace,\n                    rejection: true,\n                });\n            event.level = Severity.Error;\n            addExceptionMechanism(event, {\n                handled: false,\n                type: 'onunhandledrejection',\n            });\n            currentHub.captureEvent(event, {\n                originalException: error,\n            });\n            if (self._oldOnUnhandledRejectionHandler) {\n                return self._oldOnUnhandledRejectionHandler.apply(this, arguments);\n            }\n            return true;\n        };\n        this._onUnhandledRejectionHandlerInstalled = true;\n    };\n    /**\n     * This function creates a stack from an old, error-less onerror handler.\n     */\n    GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) {\n        var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;\n        // If 'message' is ErrorEvent, get real message from inside\n        var message = isErrorEvent(msg) ? msg.message : msg;\n        var name;\n        if (isString(message)) {\n            var groups = message.match(ERROR_TYPES_RE);\n            if (groups) {\n                name = groups[1];\n                message = groups[2];\n            }\n        }\n        var event = {\n            exception: {\n                values: [\n                    {\n                        type: name || 'Error',\n                        value: message,\n                    },\n                ],\n            },\n        };\n        return this._enhanceEventWithInitialFrame(event, url, line, column);\n    };\n    /**\n     * This function creates an Event from an TraceKitStackTrace that has part of it missing.\n     */\n    GlobalHandlers.prototype._eventFromIncompleteRejection = function (error) {\n        return {\n            exception: {\n                values: [\n                    {\n                        type: 'UnhandledRejection',\n                        value: \"Non-Error promise rejection captured with value: \" + error,\n                    },\n                ],\n            },\n        };\n    };\n    /** JSDoc */\n    GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) {\n        event.exception = event.exception || {};\n        event.exception.values = event.exception.values || [];\n        event.exception.values[0] = event.exception.values[0] || {};\n        event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};\n        event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];\n        var colno = isNaN(parseInt(column, 10)) ? undefined : column;\n        var lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n        var filename = isString(url) && url.length > 0 ? url : getLocationHref();\n        if (event.exception.values[0].stacktrace.frames.length === 0) {\n            event.exception.values[0].stacktrace.frames.push({\n                colno: colno,\n                filename: filename,\n                function: '?',\n                in_app: true,\n                lineno: lineno,\n            });\n        }\n        return event;\n    };\n    /**\n     * @inheritDoc\n     */\n    GlobalHandlers.id = 'GlobalHandlers';\n    return GlobalHandlers;\n}());\nexport { GlobalHandlers };\n//# sourceMappingURL=globalhandlers.js.map","export { GlobalHandlers } from './globalhandlers';\nexport { TryCatch } from './trycatch';\nexport { Breadcrumbs } from './breadcrumbs';\nexport { LinkedErrors } from './linkederrors';\nexport { UserAgent } from './useragent';\n//# sourceMappingURL=index.js.map","import * as tslib_1 from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { isInstanceOf } from '@sentry/utils';\nimport { exceptionFromStacktrace } from '../parsers';\nimport { computeStackTrace } from '../tracekit';\nvar DEFAULT_KEY = 'cause';\nvar DEFAULT_LIMIT = 5;\n/** Adds SDK info to an event. */\nvar LinkedErrors = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function LinkedErrors(options) {\n        if (options === void 0) { options = {}; }\n        /**\n         * @inheritDoc\n         */\n        this.name = LinkedErrors.id;\n        this._key = options.key || DEFAULT_KEY;\n        this._limit = options.limit || DEFAULT_LIMIT;\n    }\n    /**\n     * @inheritDoc\n     */\n    LinkedErrors.prototype.setupOnce = function () {\n        addGlobalEventProcessor(function (event, hint) {\n            var self = getCurrentHub().getIntegration(LinkedErrors);\n            if (self) {\n                return self._handler(event, hint);\n            }\n            return event;\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    LinkedErrors.prototype._handler = function (event, hint) {\n        if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n            return event;\n        }\n        var linkedErrors = this._walkErrorTree(hint.originalException, this._key);\n        event.exception.values = tslib_1.__spread(linkedErrors, event.exception.values);\n        return event;\n    };\n    /**\n     * @inheritDoc\n     */\n    LinkedErrors.prototype._walkErrorTree = function (error, key, stack) {\n        if (stack === void 0) { stack = []; }\n        if (!isInstanceOf(error[key], Error) || stack.length + 1 >= this._limit) {\n            return stack;\n        }\n        var stacktrace = computeStackTrace(error[key]);\n        var exception = exceptionFromStacktrace(stacktrace);\n        return this._walkErrorTree(error[key], key, tslib_1.__spread([exception], stack));\n    };\n    /**\n     * @inheritDoc\n     */\n    LinkedErrors.id = 'LinkedErrors';\n    return LinkedErrors;\n}());\nexport { LinkedErrors };\n//# sourceMappingURL=linkederrors.js.map","import { fill, getFunctionName, getGlobalObject } from '@sentry/utils';\nimport { wrap } from '../helpers';\n/** Wrap timer functions and event targets to catch errors and provide better meta data */\nvar TryCatch = /** @class */ (function () {\n    function TryCatch() {\n        /** JSDoc */\n        this._ignoreOnError = 0;\n        /**\n         * @inheritDoc\n         */\n        this.name = TryCatch.id;\n    }\n    /** JSDoc */\n    TryCatch.prototype._wrapTimeFunction = function (original) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            var originalCallback = args[0];\n            args[0] = wrap(originalCallback, {\n                mechanism: {\n                    data: { function: getFunctionName(original) },\n                    handled: true,\n                    type: 'instrument',\n                },\n            });\n            return original.apply(this, args);\n        };\n    };\n    /** JSDoc */\n    TryCatch.prototype._wrapRAF = function (original) {\n        return function (callback) {\n            return original(wrap(callback, {\n                mechanism: {\n                    data: {\n                        function: 'requestAnimationFrame',\n                        handler: getFunctionName(original),\n                    },\n                    handled: true,\n                    type: 'instrument',\n                },\n            }));\n        };\n    };\n    /** JSDoc */\n    TryCatch.prototype._wrapEventTarget = function (target) {\n        var global = getGlobalObject();\n        var proto = global[target] && global[target].prototype;\n        if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n            return;\n        }\n        fill(proto, 'addEventListener', function (original) {\n            return function (eventName, fn, options) {\n                try {\n                    // tslint:disable-next-line:no-unbound-method strict-type-predicates\n                    if (typeof fn.handleEvent === 'function') {\n                        fn.handleEvent = wrap(fn.handleEvent.bind(fn), {\n                            mechanism: {\n                                data: {\n                                    function: 'handleEvent',\n                                    handler: getFunctionName(fn),\n                                    target: target,\n                                },\n                                handled: true,\n                                type: 'instrument',\n                            },\n                        });\n                    }\n                }\n                catch (err) {\n                    // can sometimes get 'Permission denied to access property \"handle Event'\n                }\n                return original.call(this, eventName, wrap(fn, {\n                    mechanism: {\n                        data: {\n                            function: 'addEventListener',\n                            handler: getFunctionName(fn),\n                            target: target,\n                        },\n                        handled: true,\n                        type: 'instrument',\n                    },\n                }), options);\n            };\n        });\n        fill(proto, 'removeEventListener', function (original) {\n            return function (eventName, fn, options) {\n                var callback = fn;\n                try {\n                    callback = callback && (callback.__sentry_wrapped__ || callback);\n                }\n                catch (e) {\n                    // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n                }\n                return original.call(this, eventName, callback, options);\n            };\n        });\n    };\n    /** JSDoc */\n    TryCatch.prototype._wrapXHR = function (originalSend) {\n        return function () {\n            var _this = this;\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            var xhr = this; // tslint:disable-line:no-this-assignment\n            var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress'];\n            xmlHttpRequestProps.forEach(function (prop) {\n                if (prop in _this && typeof _this[prop] === 'function') {\n                    fill(_this, prop, function (original) {\n                        return wrap(original, {\n                            mechanism: {\n                                data: {\n                                    function: prop,\n                                    handler: getFunctionName(original),\n                                },\n                                handled: true,\n                                type: 'instrument',\n                            },\n                        });\n                    });\n                }\n            });\n            if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') {\n                fill(xhr, 'onreadystatechange', function (original) {\n                    var wrapOptions = {\n                        mechanism: {\n                            data: {\n                                function: 'onreadystatechange',\n                                handler: getFunctionName(original),\n                            },\n                            handled: true,\n                            type: 'instrument',\n                        },\n                    };\n                    // If Instrument integration has been called before TryCatch, get the name of original function\n                    if (original.__sentry_original__) {\n                        wrapOptions.mechanism.data.handler = getFunctionName(original.__sentry_original__);\n                    }\n                    // Otherwise wrap directly\n                    return wrap(original, wrapOptions);\n                });\n            }\n            return originalSend.apply(this, args);\n        };\n    };\n    /**\n     * Wrap timer functions and event targets to catch errors\n     * and provide better metadata.\n     */\n    TryCatch.prototype.setupOnce = function () {\n        this._ignoreOnError = this._ignoreOnError;\n        var global = getGlobalObject();\n        fill(global, 'setTimeout', this._wrapTimeFunction.bind(this));\n        fill(global, 'setInterval', this._wrapTimeFunction.bind(this));\n        fill(global, 'requestAnimationFrame', this._wrapRAF.bind(this));\n        if ('XMLHttpRequest' in global) {\n            fill(XMLHttpRequest.prototype, 'send', this._wrapXHR.bind(this));\n        }\n        [\n            'EventTarget',\n            'Window',\n            'Node',\n            'ApplicationCache',\n            'AudioTrackList',\n            'ChannelMergerNode',\n            'CryptoOperation',\n            'EventSource',\n            'FileReader',\n            'HTMLUnknownElement',\n            'IDBDatabase',\n            'IDBRequest',\n            'IDBTransaction',\n            'KeyOperation',\n            'MediaController',\n            'MessagePort',\n            'ModalWindow',\n            'Notification',\n            'SVGElementInstance',\n            'Screen',\n            'TextTrack',\n            'TextTrackCue',\n            'TextTrackList',\n            'WebSocket',\n            'WebSocketWorker',\n            'Worker',\n            'XMLHttpRequest',\n            'XMLHttpRequestEventTarget',\n            'XMLHttpRequestUpload',\n        ].forEach(this._wrapEventTarget.bind(this));\n    };\n    /**\n     * @inheritDoc\n     */\n    TryCatch.id = 'TryCatch';\n    return TryCatch;\n}());\nexport { TryCatch };\n//# sourceMappingURL=trycatch.js.map","import * as tslib_1 from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { getGlobalObject } from '@sentry/utils';\nvar global = getGlobalObject();\n/** UserAgent */\nvar UserAgent = /** @class */ (function () {\n    function UserAgent() {\n        /**\n         * @inheritDoc\n         */\n        this.name = UserAgent.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    UserAgent.prototype.setupOnce = function () {\n        addGlobalEventProcessor(function (event) {\n            if (getCurrentHub().getIntegration(UserAgent)) {\n                if (!global.navigator || !global.location) {\n                    return event;\n                }\n                // Request Interface: https://docs.sentry.io/development/sdk-dev/event-payloads/request/\n                var request = event.request || {};\n                request.url = request.url || global.location.href;\n                request.headers = request.headers || {};\n                request.headers['User-Agent'] = global.navigator.userAgent;\n                return tslib_1.__assign({}, event, { request: request });\n            }\n            return event;\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    UserAgent.id = 'UserAgent';\n    return UserAgent;\n}());\nexport { UserAgent };\n//# sourceMappingURL=useragent.js.map","import { extractExceptionKeysForMessage, isEvent, normalizeToSize } from '@sentry/utils';\nimport { computeStackTrace } from './tracekit';\nvar STACKTRACE_LIMIT = 50;\n/**\n * This function creates an exception from an TraceKitStackTrace\n * @param stacktrace TraceKitStackTrace that will be converted to an exception\n * @hidden\n */\nexport function exceptionFromStacktrace(stacktrace) {\n    var frames = prepareFramesForEvent(stacktrace.stack);\n    var exception = {\n        type: stacktrace.name,\n        value: stacktrace.message,\n    };\n    if (frames && frames.length) {\n        exception.stacktrace = { frames: frames };\n    }\n    // tslint:disable-next-line:strict-type-predicates\n    if (exception.type === undefined && exception.value === '') {\n        exception.value = 'Unrecoverable error caught';\n    }\n    return exception;\n}\n/**\n * @hidden\n */\nexport function eventFromPlainObject(exception, syntheticException, rejection) {\n    var event = {\n        exception: {\n            values: [\n                {\n                    type: isEvent(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',\n                    value: \"Non-Error \" + (rejection ? 'promise rejection' : 'exception') + \" captured with keys: \" + extractExceptionKeysForMessage(exception),\n                },\n            ],\n        },\n        extra: {\n            __serialized__: normalizeToSize(exception),\n        },\n    };\n    if (syntheticException) {\n        var stacktrace = computeStackTrace(syntheticException);\n        var frames_1 = prepareFramesForEvent(stacktrace.stack);\n        event.stacktrace = {\n            frames: frames_1,\n        };\n    }\n    return event;\n}\n/**\n * @hidden\n */\nexport function eventFromStacktrace(stacktrace) {\n    var exception = exceptionFromStacktrace(stacktrace);\n    return {\n        exception: {\n            values: [exception],\n        },\n    };\n}\n/**\n * @hidden\n */\nexport function prepareFramesForEvent(stack) {\n    if (!stack || !stack.length) {\n        return [];\n    }\n    var localStack = stack;\n    var firstFrameFunction = localStack[0].func || '';\n    var lastFrameFunction = localStack[localStack.length - 1].func || '';\n    // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n    if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {\n        localStack = localStack.slice(1);\n    }\n    // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n    if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {\n        localStack = localStack.slice(0, -1);\n    }\n    // The frame where the crash happened, should be the last entry in the array\n    return localStack\n        .map(function (frame) { return ({\n        colno: frame.column === null ? undefined : frame.column,\n        filename: frame.url || localStack[0].url,\n        function: frame.func || '?',\n        in_app: true,\n        lineno: frame.line === null ? undefined : frame.line,\n    }); })\n        .slice(0, STACKTRACE_LIMIT)\n        .reverse();\n}\n//# sourceMappingURL=parsers.js.map","import { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core';\nimport { getGlobalObject, SyncPromise } from '@sentry/utils';\nimport { BrowserClient } from './client';\nimport { wrap as internalWrap } from './helpers';\nimport { Breadcrumbs, GlobalHandlers, LinkedErrors, TryCatch, UserAgent } from './integrations';\nexport var defaultIntegrations = [\n    new CoreIntegrations.InboundFilters(),\n    new CoreIntegrations.FunctionToString(),\n    new TryCatch(),\n    new Breadcrumbs(),\n    new GlobalHandlers(),\n    new LinkedErrors(),\n    new UserAgent(),\n];\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n *   dsn: '__DSN__',\n *   // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { configureScope } from '@sentry/browser';\n * configureScope((scope: Scope) => {\n *   scope.setExtra({ battery: 0.7 });\n *   scope.setTag({ user_mode: 'admin' });\n *   scope.setUser({ id: '4711' });\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n *   message: 'My Breadcrumb',\n *   // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n *   message: 'Manual',\n *   stacktrace: [\n *     // ...\n *   ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nexport function init(options) {\n    if (options === void 0) { options = {}; }\n    if (options.defaultIntegrations === undefined) {\n        options.defaultIntegrations = defaultIntegrations;\n    }\n    if (options.release === undefined) {\n        var window_1 = getGlobalObject();\n        // This supports the variable that sentry-webpack-plugin injects\n        if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) {\n            options.release = window_1.SENTRY_RELEASE.id;\n        }\n    }\n    initAndBind(BrowserClient, options);\n}\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nexport function showReportDialog(options) {\n    if (options === void 0) { options = {}; }\n    if (!options.eventId) {\n        options.eventId = getCurrentHub().lastEventId();\n    }\n    var client = getCurrentHub().getClient();\n    if (client) {\n        client.showReportDialog(options);\n    }\n}\n/**\n * This is the getter for lastEventId.\n *\n * @returns The last event id of a captured event.\n */\nexport function lastEventId() {\n    return getCurrentHub().lastEventId();\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad() {\n    // Noop\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback) {\n    callback();\n}\n/**\n * A promise that resolves when all current events have been sent.\n * If you provide a timeout and the queue takes longer to drain the promise returns false.\n *\n * @param timeout Maximum time in ms the client should wait.\n */\nexport function flush(timeout) {\n    var client = getCurrentHub().getClient();\n    if (client) {\n        return client.flush(timeout);\n    }\n    return SyncPromise.reject(false);\n}\n/**\n * A promise that resolves when all current events have been sent.\n * If you provide a timeout and the queue takes longer to drain the promise returns false.\n *\n * @param timeout Maximum time in ms the client should wait.\n */\nexport function close(timeout) {\n    var client = getCurrentHub().getClient();\n    if (client) {\n        return client.close(timeout);\n    }\n    return SyncPromise.reject(false);\n}\n/**\n * Wrap code within a try/catch block so the SDK is able to capture errors.\n *\n * @param fn A function to wrap.\n *\n * @returns The result of wrapped function call.\n */\nexport function wrap(fn) {\n    return internalWrap(fn)(); // tslint:disable-line:no-unsafe-any\n}\n//# sourceMappingURL=sdk.js.map","// tslint:disable:object-literal-sort-keys\nimport * as tslib_1 from \"tslib\";\n// global reference to slice\nvar UNKNOWN_FUNCTION = '?';\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nvar chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[-a-z]+:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nvar gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js))(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nvar winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\nvar geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\nvar chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n/** JSDoc */\nexport function computeStackTrace(ex) {\n    // tslint:disable:no-unsafe-any\n    var stack = null;\n    var popSize = ex && ex.framesToPop;\n    try {\n        // This must be tried first because Opera 10 *destroys*\n        // its stacktrace property if you try to access the stack\n        // property first!!\n        stack = computeStackTraceFromStacktraceProp(ex);\n        if (stack) {\n            return popFrames(stack, popSize);\n        }\n    }\n    catch (e) {\n        // no-empty\n    }\n    try {\n        stack = computeStackTraceFromStackProp(ex);\n        if (stack) {\n            return popFrames(stack, popSize);\n        }\n    }\n    catch (e) {\n        // no-empty\n    }\n    return {\n        message: extractMessage(ex),\n        name: ex && ex.name,\n        stack: [],\n        failed: true,\n    };\n}\n/** JSDoc */\n// tslint:disable-next-line:cyclomatic-complexity\nfunction computeStackTraceFromStackProp(ex) {\n    // tslint:disable:no-conditional-assignment\n    if (!ex || !ex.stack) {\n        return null;\n    }\n    var stack = [];\n    var lines = ex.stack.split('\\n');\n    var isEval;\n    var submatch;\n    var parts;\n    var element;\n    for (var i = 0; i < lines.length; ++i) {\n        if ((parts = chrome.exec(lines[i]))) {\n            var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n            isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n            if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n                // throw out eval line/column and use top-most line/column number\n                parts[2] = submatch[1]; // url\n                parts[3] = submatch[2]; // line\n                parts[4] = submatch[3]; // column\n            }\n            element = {\n                url: parts[2],\n                func: parts[1] || UNKNOWN_FUNCTION,\n                args: isNative ? [parts[2]] : [],\n                line: parts[3] ? +parts[3] : null,\n                column: parts[4] ? +parts[4] : null,\n            };\n        }\n        else if ((parts = winjs.exec(lines[i]))) {\n            element = {\n                url: parts[2],\n                func: parts[1] || UNKNOWN_FUNCTION,\n                args: [],\n                line: +parts[3],\n                column: parts[4] ? +parts[4] : null,\n            };\n        }\n        else if ((parts = gecko.exec(lines[i]))) {\n            isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n            if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n                // throw out eval line/column and use top-most line number\n                parts[1] = parts[1] || \"eval\";\n                parts[3] = submatch[1];\n                parts[4] = submatch[2];\n                parts[5] = ''; // no column when eval\n            }\n            else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) {\n                // FireFox uses this awesome columnNumber property for its top frame\n                // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n                // so adding 1\n                // NOTE: this hack doesn't work if top-most frame is eval\n                stack[0].column = ex.columnNumber + 1;\n            }\n            element = {\n                url: parts[3],\n                func: parts[1] || UNKNOWN_FUNCTION,\n                args: parts[2] ? parts[2].split(',') : [],\n                line: parts[4] ? +parts[4] : null,\n                column: parts[5] ? +parts[5] : null,\n            };\n        }\n        else {\n            continue;\n        }\n        if (!element.func && element.line) {\n            element.func = UNKNOWN_FUNCTION;\n        }\n        stack.push(element);\n    }\n    if (!stack.length) {\n        return null;\n    }\n    return {\n        message: extractMessage(ex),\n        name: ex.name,\n        stack: stack,\n    };\n}\n/** JSDoc */\nfunction computeStackTraceFromStacktraceProp(ex) {\n    if (!ex || !ex.stacktrace) {\n        return null;\n    }\n    // Access and store the stacktrace property before doing ANYTHING\n    // else to it because Opera is not very good at providing it\n    // reliably in other circumstances.\n    var stacktrace = ex.stacktrace;\n    var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n    var opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^\\)]+))\\((.*)\\))? in (.*):\\s*$/i;\n    var lines = stacktrace.split('\\n');\n    var stack = [];\n    var parts;\n    for (var line = 0; line < lines.length; line += 2) {\n        // tslint:disable:no-conditional-assignment\n        var element = null;\n        if ((parts = opera10Regex.exec(lines[line]))) {\n            element = {\n                url: parts[2],\n                func: parts[3],\n                args: [],\n                line: +parts[1],\n                column: null,\n            };\n        }\n        else if ((parts = opera11Regex.exec(lines[line]))) {\n            element = {\n                url: parts[6],\n                func: parts[3] || parts[4],\n                args: parts[5] ? parts[5].split(',') : [],\n                line: +parts[1],\n                column: +parts[2],\n            };\n        }\n        if (element) {\n            if (!element.func && element.line) {\n                element.func = UNKNOWN_FUNCTION;\n            }\n            stack.push(element);\n        }\n    }\n    if (!stack.length) {\n        return null;\n    }\n    return {\n        message: extractMessage(ex),\n        name: ex.name,\n        stack: stack,\n    };\n}\n/** Remove N number of frames from the stack */\nfunction popFrames(stacktrace, popSize) {\n    try {\n        return tslib_1.__assign({}, stacktrace, { stack: stacktrace.stack.slice(popSize) });\n    }\n    catch (e) {\n        return stacktrace;\n    }\n}\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\nfunction extractMessage(ex) {\n    var message = ex && ex.message;\n    if (!message) {\n        return 'No error message';\n    }\n    if (message.error && typeof message.error.message === 'string') {\n        return message.error.message;\n    }\n    return message;\n}\n//# sourceMappingURL=tracekit.js.map","import { API } from '@sentry/core';\nimport { PromiseBuffer, SentryError } from '@sentry/utils';\n/** Base Transport class implementation */\nvar BaseTransport = /** @class */ (function () {\n    function BaseTransport(options) {\n        this.options = options;\n        /** A simple buffer holding all requests. */\n        this._buffer = new PromiseBuffer(30);\n        this.url = new API(this.options.dsn).getStoreEndpointWithUrlEncodedAuth();\n    }\n    /**\n     * @inheritDoc\n     */\n    BaseTransport.prototype.sendEvent = function (_) {\n        throw new SentryError('Transport Class has to implement `sendEvent` method');\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseTransport.prototype.close = function (timeout) {\n        return this._buffer.drain(timeout);\n    };\n    return BaseTransport;\n}());\nexport { BaseTransport };\n//# sourceMappingURL=base.js.map","import * as tslib_1 from \"tslib\";\nimport { Status } from '@sentry/types';\nimport { getGlobalObject, logger, parseRetryAfterHeader, supportsReferrerPolicy, SyncPromise } from '@sentry/utils';\nimport { BaseTransport } from './base';\nvar global = getGlobalObject();\n/** `fetch` based transport */\nvar FetchTransport = /** @class */ (function (_super) {\n    tslib_1.__extends(FetchTransport, _super);\n    function FetchTransport() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        /** Locks transport after receiving 429 response */\n        _this._disabledUntil = new Date(Date.now());\n        return _this;\n    }\n    /**\n     * @inheritDoc\n     */\n    FetchTransport.prototype.sendEvent = function (event) {\n        var _this = this;\n        if (new Date(Date.now()) < this._disabledUntil) {\n            return Promise.reject({\n                event: event,\n                reason: \"Transport locked till \" + this._disabledUntil + \" due to too many requests.\",\n                status: 429,\n            });\n        }\n        var defaultOptions = {\n            body: JSON.stringify(event),\n            method: 'POST',\n            // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n            // https://caniuse.com/#feat=referrer-policy\n            // It doesn't. And it throw exception instead of ignoring this parameter...\n            // REF: https://github.com/getsentry/raven-js/issues/1233\n            referrerPolicy: (supportsReferrerPolicy() ? 'origin' : ''),\n        };\n        if (this.options.headers !== undefined) {\n            defaultOptions.headers = this.options.headers;\n        }\n        return this._buffer.add(new SyncPromise(function (resolve, reject) {\n            global\n                .fetch(_this.url, defaultOptions)\n                .then(function (response) {\n                var status = Status.fromHttpCode(response.status);\n                if (status === Status.Success) {\n                    resolve({ status: status });\n                    return;\n                }\n                if (status === Status.RateLimit) {\n                    var now = Date.now();\n                    _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, response.headers.get('Retry-After')));\n                    logger.warn(\"Too many requests, backing off till: \" + _this._disabledUntil);\n                }\n                reject(response);\n            })\n                .catch(reject);\n        }));\n    };\n    return FetchTransport;\n}(BaseTransport));\nexport { FetchTransport };\n//# sourceMappingURL=fetch.js.map","export { BaseTransport } from './base';\nexport { FetchTransport } from './fetch';\nexport { XHRTransport } from './xhr';\n//# sourceMappingURL=index.js.map","import * as tslib_1 from \"tslib\";\nimport { Status } from '@sentry/types';\nimport { logger, parseRetryAfterHeader, SyncPromise } from '@sentry/utils';\nimport { BaseTransport } from './base';\n/** `XHR` based transport */\nvar XHRTransport = /** @class */ (function (_super) {\n    tslib_1.__extends(XHRTransport, _super);\n    function XHRTransport() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        /** Locks transport after receiving 429 response */\n        _this._disabledUntil = new Date(Date.now());\n        return _this;\n    }\n    /**\n     * @inheritDoc\n     */\n    XHRTransport.prototype.sendEvent = function (event) {\n        var _this = this;\n        if (new Date(Date.now()) < this._disabledUntil) {\n            return Promise.reject({\n                event: event,\n                reason: \"Transport locked till \" + this._disabledUntil + \" due to too many requests.\",\n                status: 429,\n            });\n        }\n        return this._buffer.add(new SyncPromise(function (resolve, reject) {\n            var request = new XMLHttpRequest();\n            request.onreadystatechange = function () {\n                if (request.readyState !== 4) {\n                    return;\n                }\n                var status = Status.fromHttpCode(request.status);\n                if (status === Status.Success) {\n                    resolve({ status: status });\n                    return;\n                }\n                if (status === Status.RateLimit) {\n                    var now = Date.now();\n                    _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, request.getResponseHeader('Retry-After')));\n                    logger.warn(\"Too many requests, backing off till: \" + _this._disabledUntil);\n                }\n                reject(request);\n            };\n            request.open('POST', _this.url);\n            for (var header in _this.options.headers) {\n                if (_this.options.headers.hasOwnProperty(header)) {\n                    request.setRequestHeader(header, _this.options.headers[header]);\n                }\n            }\n            request.send(JSON.stringify(event));\n        }));\n    };\n    return XHRTransport;\n}(BaseTransport));\nexport { XHRTransport };\n//# sourceMappingURL=xhr.js.map","export var SDK_NAME = 'sentry.javascript.browser';\nexport var SDK_VERSION = '5.11.0';\n//# sourceMappingURL=version.js.map","import { Dsn, timestampWithMs, urlEncode } from '@sentry/utils';\nvar SENTRY_API_VERSION = '7';\n/** Helper class to provide urls to different Sentry endpoints. */\nvar API = /** @class */ (function () {\n    /** Create a new instance of API */\n    function API(dsn) {\n        this.dsn = dsn;\n        this._dsnObject = new Dsn(dsn);\n    }\n    /** Returns the Dsn object. */\n    API.prototype.getDsn = function () {\n        return this._dsnObject;\n    };\n    /** Returns a string with auth headers in the url to the store endpoint. */\n    API.prototype.getStoreEndpoint = function () {\n        return \"\" + this._getBaseUrl() + this.getStoreEndpointPath();\n    };\n    /** Returns the store endpoint with auth added in url encoded. */\n    API.prototype.getStoreEndpointWithUrlEncodedAuth = function () {\n        var dsn = this._dsnObject;\n        var auth = {\n            sentry_key: dsn.user,\n            sentry_version: SENTRY_API_VERSION,\n        };\n        // Auth is intentionally sent as part of query string (NOT as custom HTTP header)\n        // to avoid preflight CORS requests\n        return this.getStoreEndpoint() + \"?\" + urlEncode(auth);\n    };\n    /** Returns the base path of the url including the port. */\n    API.prototype._getBaseUrl = function () {\n        var dsn = this._dsnObject;\n        var protocol = dsn.protocol ? dsn.protocol + \":\" : '';\n        var port = dsn.port ? \":\" + dsn.port : '';\n        return protocol + \"//\" + dsn.host + port;\n    };\n    /** Returns only the path component for the store endpoint. */\n    API.prototype.getStoreEndpointPath = function () {\n        var dsn = this._dsnObject;\n        return (dsn.path ? \"/\" + dsn.path : '') + \"/api/\" + dsn.projectId + \"/store/\";\n    };\n    /** Returns an object that can be used in request headers. */\n    API.prototype.getRequestHeaders = function (clientName, clientVersion) {\n        var dsn = this._dsnObject;\n        var header = [\"Sentry sentry_version=\" + SENTRY_API_VERSION];\n        header.push(\"sentry_timestamp=\" + timestampWithMs()); // TODO: This can be removed\n        header.push(\"sentry_client=\" + clientName + \"/\" + clientVersion);\n        header.push(\"sentry_key=\" + dsn.user);\n        if (dsn.pass) {\n            header.push(\"sentry_secret=\" + dsn.pass);\n        }\n        return {\n            'Content-Type': 'application/json',\n            'X-Sentry-Auth': header.join(', '),\n        };\n    };\n    /** Returns the url to the report dialog endpoint. */\n    API.prototype.getReportDialogEndpoint = function (dialogOptions) {\n        if (dialogOptions === void 0) { dialogOptions = {}; }\n        var dsn = this._dsnObject;\n        var endpoint = \"\" + this._getBaseUrl() + (dsn.path ? \"/\" + dsn.path : '') + \"/api/embed/error-page/\";\n        var encodedOptions = [];\n        encodedOptions.push(\"dsn=\" + dsn.toString());\n        for (var key in dialogOptions) {\n            if (key === 'user') {\n                if (!dialogOptions.user) {\n                    continue;\n                }\n                if (dialogOptions.user.name) {\n                    encodedOptions.push(\"name=\" + encodeURIComponent(dialogOptions.user.name));\n                }\n                if (dialogOptions.user.email) {\n                    encodedOptions.push(\"email=\" + encodeURIComponent(dialogOptions.user.email));\n                }\n            }\n            else {\n                encodedOptions.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(dialogOptions[key]));\n            }\n        }\n        if (encodedOptions.length) {\n            return endpoint + \"?\" + encodedOptions.join('&');\n        }\n        return endpoint;\n    };\n    return API;\n}());\nexport { API };\n//# sourceMappingURL=api.js.map","import { logger, SentryError } from '@sentry/utils';\nimport { NoopTransport } from './transports/noop';\n/**\n * This is the base implemention of a Backend.\n * @hidden\n */\nvar BaseBackend = /** @class */ (function () {\n    /** Creates a new backend instance. */\n    function BaseBackend(options) {\n        this._options = options;\n        if (!this._options.dsn) {\n            logger.warn('No DSN provided, backend will not do anything.');\n        }\n        this._transport = this._setupTransport();\n    }\n    /**\n     * Sets up the transport so it can be used later to send requests.\n     */\n    BaseBackend.prototype._setupTransport = function () {\n        return new NoopTransport();\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseBackend.prototype.eventFromException = function (_exception, _hint) {\n        throw new SentryError('Backend has to implement `eventFromException` method');\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) {\n        throw new SentryError('Backend has to implement `eventFromMessage` method');\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseBackend.prototype.sendEvent = function (event) {\n        this._transport.sendEvent(event).then(null, function (reason) {\n            logger.error(\"Error while sending event: \" + reason);\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseBackend.prototype.getTransport = function () {\n        return this._transport;\n    };\n    return BaseBackend;\n}());\nexport { BaseBackend };\n//# sourceMappingURL=basebackend.js.map","import * as tslib_1 from \"tslib\";\nimport { Dsn, isPrimitive, isThenable, logger, SyncPromise, truncate, uuid4 } from '@sentry/utils';\nimport { setupIntegrations } from './integration';\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding backend constructor and options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}. Also, the Backend instance is available via\n * {@link Client.getBackend}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event via the backend, it is passed through\n * {@link BaseClient.prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient<NodeBackend, NodeOptions> {\n *   public constructor(options: NodeOptions) {\n *     super(NodeBackend, options);\n *   }\n *\n *   // ...\n * }\n */\nvar BaseClient = /** @class */ (function () {\n    /**\n     * Initializes this client instance.\n     *\n     * @param backendClass A constructor function to create the backend.\n     * @param options Options for the client.\n     */\n    function BaseClient(backendClass, options) {\n        /** Array of used integrations. */\n        this._integrations = {};\n        /** Is the client still processing a call? */\n        this._processing = false;\n        this._backend = new backendClass(options);\n        this._options = options;\n        if (options.dsn) {\n            this._dsn = new Dsn(options.dsn);\n        }\n        if (this._isEnabled()) {\n            this._integrations = setupIntegrations(this._options);\n        }\n    }\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.captureException = function (exception, hint, scope) {\n        var _this = this;\n        var eventId = hint && hint.event_id;\n        this._processing = true;\n        this._getBackend()\n            .eventFromException(exception, hint)\n            .then(function (event) { return _this._processEvent(event, hint, scope); })\n            .then(function (finalEvent) {\n            // We need to check for finalEvent in case beforeSend returned null\n            eventId = finalEvent && finalEvent.event_id;\n            _this._processing = false;\n        })\n            .then(null, function (reason) {\n            logger.error(reason);\n            _this._processing = false;\n        });\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.captureMessage = function (message, level, hint, scope) {\n        var _this = this;\n        var eventId = hint && hint.event_id;\n        this._processing = true;\n        var promisedEvent = isPrimitive(message)\n            ? this._getBackend().eventFromMessage(\"\" + message, level, hint)\n            : this._getBackend().eventFromException(message, hint);\n        promisedEvent\n            .then(function (event) { return _this._processEvent(event, hint, scope); })\n            .then(function (finalEvent) {\n            // We need to check for finalEvent in case beforeSend returned null\n            eventId = finalEvent && finalEvent.event_id;\n            _this._processing = false;\n        })\n            .then(null, function (reason) {\n            logger.error(reason);\n            _this._processing = false;\n        });\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.captureEvent = function (event, hint, scope) {\n        var _this = this;\n        var eventId = hint && hint.event_id;\n        this._processing = true;\n        this._processEvent(event, hint, scope)\n            .then(function (finalEvent) {\n            // We need to check for finalEvent in case beforeSend returned null\n            eventId = finalEvent && finalEvent.event_id;\n            _this._processing = false;\n        })\n            .then(null, function (reason) {\n            logger.error(reason);\n            _this._processing = false;\n        });\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.getDsn = function () {\n        return this._dsn;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.getOptions = function () {\n        return this._options;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.flush = function (timeout) {\n        var _this = this;\n        return this._isClientProcessing(timeout).then(function (status) {\n            clearInterval(status.interval);\n            return _this._getBackend()\n                .getTransport()\n                .close(timeout)\n                .then(function (transportFlushed) { return status.ready && transportFlushed; });\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.close = function (timeout) {\n        var _this = this;\n        return this.flush(timeout).then(function (result) {\n            _this.getOptions().enabled = false;\n            return result;\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.getIntegrations = function () {\n        return this._integrations || {};\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.getIntegration = function (integration) {\n        try {\n            return this._integrations[integration.id] || null;\n        }\n        catch (_oO) {\n            logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Client\");\n            return null;\n        }\n    };\n    /** Waits for the client to be done with processing. */\n    BaseClient.prototype._isClientProcessing = function (timeout) {\n        var _this = this;\n        return new SyncPromise(function (resolve) {\n            var ticked = 0;\n            var tick = 1;\n            var interval = 0;\n            clearInterval(interval);\n            interval = setInterval(function () {\n                if (!_this._processing) {\n                    resolve({\n                        interval: interval,\n                        ready: true,\n                    });\n                }\n                else {\n                    ticked += tick;\n                    if (timeout && ticked >= timeout) {\n                        resolve({\n                            interval: interval,\n                            ready: false,\n                        });\n                    }\n                }\n            }, tick);\n        });\n    };\n    /** Returns the current backend. */\n    BaseClient.prototype._getBackend = function () {\n        return this._backend;\n    };\n    /** Determines whether this SDK is enabled and a valid Dsn is present. */\n    BaseClient.prototype._isEnabled = function () {\n        return this.getOptions().enabled !== false && this._dsn !== undefined;\n    };\n    /**\n     * Adds common information to events.\n     *\n     * The information includes release and environment from `options`,\n     * breadcrumbs and context (extra, tags and user) from the scope.\n     *\n     * Information that is already present in the event is never overwritten. For\n     * nested objects, such as the context, keys are merged.\n     *\n     * @param event The original event.\n     * @param hint May contain additional informartion about the original exception.\n     * @param scope A scope containing event metadata.\n     * @returns A new event with more information.\n     */\n    BaseClient.prototype._prepareEvent = function (event, scope, hint) {\n        var _a = this.getOptions(), environment = _a.environment, release = _a.release, dist = _a.dist, _b = _a.maxValueLength, maxValueLength = _b === void 0 ? 250 : _b;\n        var prepared = tslib_1.__assign({}, event);\n        if (prepared.environment === undefined && environment !== undefined) {\n            prepared.environment = environment;\n        }\n        if (prepared.release === undefined && release !== undefined) {\n            prepared.release = release;\n        }\n        if (prepared.dist === undefined && dist !== undefined) {\n            prepared.dist = dist;\n        }\n        if (prepared.message) {\n            prepared.message = truncate(prepared.message, maxValueLength);\n        }\n        var exception = prepared.exception && prepared.exception.values && prepared.exception.values[0];\n        if (exception && exception.value) {\n            exception.value = truncate(exception.value, maxValueLength);\n        }\n        var request = prepared.request;\n        if (request && request.url) {\n            request.url = truncate(request.url, maxValueLength);\n        }\n        if (prepared.event_id === undefined) {\n            prepared.event_id = uuid4();\n        }\n        this._addIntegrations(prepared.sdk);\n        // We prepare the result here with a resolved Event.\n        var result = SyncPromise.resolve(prepared);\n        // This should be the last thing called, since we want that\n        // {@link Hub.addEventProcessor} gets the finished prepared event.\n        if (scope) {\n            // In case we have a hub we reassign it.\n            result = scope.applyToEvent(prepared, hint);\n        }\n        return result;\n    };\n    /**\n     * This function adds all used integrations to the SDK info in the event.\n     * @param sdkInfo The sdkInfo of the event that will be filled with all integrations.\n     */\n    BaseClient.prototype._addIntegrations = function (sdkInfo) {\n        var integrationsArray = Object.keys(this._integrations);\n        if (sdkInfo && integrationsArray.length > 0) {\n            sdkInfo.integrations = integrationsArray;\n        }\n    };\n    /**\n     * Processes an event (either error or message) and sends it to Sentry.\n     *\n     * This also adds breadcrumbs and context information to the event. However,\n     * platform specific meta data (such as the User's IP address) must be added\n     * by the SDK implementor.\n     *\n     *\n     * @param event The event to send to Sentry.\n     * @param hint May contain additional informartion about the original exception.\n     * @param scope A scope containing event metadata.\n     * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n     */\n    BaseClient.prototype._processEvent = function (event, hint, scope) {\n        var _this = this;\n        var _a = this.getOptions(), beforeSend = _a.beforeSend, sampleRate = _a.sampleRate;\n        if (!this._isEnabled()) {\n            return SyncPromise.reject('SDK not enabled, will not send event.');\n        }\n        // 1.0 === 100% events are sent\n        // 0.0 === 0% events are sent\n        if (typeof sampleRate === 'number' && Math.random() > sampleRate) {\n            return SyncPromise.reject('This event has been sampled, will not send event.');\n        }\n        return new SyncPromise(function (resolve, reject) {\n            _this._prepareEvent(event, scope, hint)\n                .then(function (prepared) {\n                if (prepared === null) {\n                    reject('An event processor returned null, will not send event.');\n                    return;\n                }\n                var finalEvent = prepared;\n                try {\n                    var isInternalException = hint && hint.data && hint.data.__sentry__ === true;\n                    if (isInternalException || !beforeSend) {\n                        _this._getBackend().sendEvent(finalEvent);\n                        resolve(finalEvent);\n                        return;\n                    }\n                    var beforeSendResult = beforeSend(prepared, hint);\n                    // tslint:disable-next-line:strict-type-predicates\n                    if (typeof beforeSendResult === 'undefined') {\n                        logger.error('`beforeSend` method has to return `null` or a valid event.');\n                    }\n                    else if (isThenable(beforeSendResult)) {\n                        _this._handleAsyncBeforeSend(beforeSendResult, resolve, reject);\n                    }\n                    else {\n                        finalEvent = beforeSendResult;\n                        if (finalEvent === null) {\n                            logger.log('`beforeSend` returned `null`, will not send event.');\n                            resolve(null);\n                            return;\n                        }\n                        // From here on we are really async\n                        _this._getBackend().sendEvent(finalEvent);\n                        resolve(finalEvent);\n                    }\n                }\n                catch (exception) {\n                    _this.captureException(exception, {\n                        data: {\n                            __sentry__: true,\n                        },\n                        originalException: exception,\n                    });\n                    reject('`beforeSend` threw an error, will not send event.');\n                }\n            })\n                .then(null, function () {\n                reject('`beforeSend` threw an error, will not send event.');\n            });\n        });\n    };\n    /**\n     * Resolves before send Promise and calls resolve/reject on parent SyncPromise.\n     */\n    BaseClient.prototype._handleAsyncBeforeSend = function (beforeSend, resolve, reject) {\n        var _this = this;\n        beforeSend\n            .then(function (processedEvent) {\n            if (processedEvent === null) {\n                reject('`beforeSend` returned `null`, will not send event.');\n                return;\n            }\n            // From here on we are really async\n            _this._getBackend().sendEvent(processedEvent);\n            resolve(processedEvent);\n        })\n            .then(null, function (e) {\n            reject(\"beforeSend rejected with \" + e);\n        });\n    };\n    return BaseClient;\n}());\nexport { BaseClient };\n//# sourceMappingURL=baseclient.js.map","export { addBreadcrumb, captureException, captureEvent, captureMessage, configureScope, setContext, setExtra, setExtras, setTag, setTags, setUser, withScope, } from '@sentry/minimal';\nexport { addGlobalEventProcessor, getCurrentHub, getHubFromCarrier, Hub, Scope } from '@sentry/hub';\nexport { API } from './api';\nexport { BaseClient } from './baseclient';\nexport { BaseBackend } from './basebackend';\nexport { initAndBind } from './sdk';\nexport { NoopTransport } from './transports/noop';\nimport * as Integrations from './integrations';\nexport { Integrations };\n//# sourceMappingURL=index.js.map","import * as tslib_1 from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { logger } from '@sentry/utils';\nexport var installedIntegrations = [];\n/** Gets integration to install */\nexport function getIntegrationsToSetup(options) {\n    var defaultIntegrations = (options.defaultIntegrations && tslib_1.__spread(options.defaultIntegrations)) || [];\n    var userIntegrations = options.integrations;\n    var integrations = [];\n    if (Array.isArray(userIntegrations)) {\n        var userIntegrationsNames_1 = userIntegrations.map(function (i) { return i.name; });\n        var pickedIntegrationsNames_1 = [];\n        // Leave only unique default integrations, that were not overridden with provided user integrations\n        defaultIntegrations.forEach(function (defaultIntegration) {\n            if (userIntegrationsNames_1.indexOf(defaultIntegration.name) === -1 &&\n                pickedIntegrationsNames_1.indexOf(defaultIntegration.name) === -1) {\n                integrations.push(defaultIntegration);\n                pickedIntegrationsNames_1.push(defaultIntegration.name);\n            }\n        });\n        // Don't add same user integration twice\n        userIntegrations.forEach(function (userIntegration) {\n            if (pickedIntegrationsNames_1.indexOf(userIntegration.name) === -1) {\n                integrations.push(userIntegration);\n                pickedIntegrationsNames_1.push(userIntegration.name);\n            }\n        });\n    }\n    else if (typeof userIntegrations === 'function') {\n        integrations = userIntegrations(defaultIntegrations);\n        integrations = Array.isArray(integrations) ? integrations : [integrations];\n    }\n    else {\n        integrations = tslib_1.__spread(defaultIntegrations);\n    }\n    // Make sure that if present, `Debug` integration will always run last\n    var integrationsNames = integrations.map(function (i) { return i.name; });\n    var alwaysLastToRun = 'Debug';\n    if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {\n        integrations.push.apply(integrations, tslib_1.__spread(integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1)));\n    }\n    return integrations;\n}\n/** Setup given integration */\nexport function setupIntegration(integration) {\n    if (installedIntegrations.indexOf(integration.name) !== -1) {\n        return;\n    }\n    integration.setupOnce(addGlobalEventProcessor, getCurrentHub);\n    installedIntegrations.push(integration.name);\n    logger.log(\"Integration installed: \" + integration.name);\n}\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations(options) {\n    var integrations = {};\n    getIntegrationsToSetup(options).forEach(function (integration) {\n        integrations[integration.name] = integration;\n        setupIntegration(integration);\n    });\n    return integrations;\n}\n//# sourceMappingURL=integration.js.map","var originalFunctionToString;\n/** Patch toString calls to return proper name for wrapped functions */\nvar FunctionToString = /** @class */ (function () {\n    function FunctionToString() {\n        /**\n         * @inheritDoc\n         */\n        this.name = FunctionToString.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    FunctionToString.prototype.setupOnce = function () {\n        originalFunctionToString = Function.prototype.toString;\n        Function.prototype.toString = function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            var context = this.__sentry_original__ || this;\n            // tslint:disable-next-line:no-unsafe-any\n            return originalFunctionToString.apply(context, args);\n        };\n    };\n    /**\n     * @inheritDoc\n     */\n    FunctionToString.id = 'FunctionToString';\n    return FunctionToString;\n}());\nexport { FunctionToString };\n//# sourceMappingURL=functiontostring.js.map","import * as tslib_1 from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { getEventDescription, isMatchingPattern, logger } from '@sentry/utils';\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nvar DEFAULT_IGNORE_ERRORS = [/^Script error\\.?$/, /^Javascript error: Script error\\.? on line 0$/];\n/** Inbound filters configurable by the user */\nvar InboundFilters = /** @class */ (function () {\n    function InboundFilters(_options) {\n        if (_options === void 0) { _options = {}; }\n        this._options = _options;\n        /**\n         * @inheritDoc\n         */\n        this.name = InboundFilters.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    InboundFilters.prototype.setupOnce = function () {\n        addGlobalEventProcessor(function (event) {\n            var hub = getCurrentHub();\n            if (!hub) {\n                return event;\n            }\n            var self = hub.getIntegration(InboundFilters);\n            if (self) {\n                var client = hub.getClient();\n                var clientOptions = client ? client.getOptions() : {};\n                var options = self._mergeOptions(clientOptions);\n                if (self._shouldDropEvent(event, options)) {\n                    return null;\n                }\n            }\n            return event;\n        });\n    };\n    /** JSDoc */\n    InboundFilters.prototype._shouldDropEvent = function (event, options) {\n        if (this._isSentryError(event, options)) {\n            logger.warn(\"Event dropped due to being internal Sentry Error.\\nEvent: \" + getEventDescription(event));\n            return true;\n        }\n        if (this._isIgnoredError(event, options)) {\n            logger.warn(\"Event dropped due to being matched by `ignoreErrors` option.\\nEvent: \" + getEventDescription(event));\n            return true;\n        }\n        if (this._isBlacklistedUrl(event, options)) {\n            logger.warn(\"Event dropped due to being matched by `blacklistUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n            return true;\n        }\n        if (!this._isWhitelistedUrl(event, options)) {\n            logger.warn(\"Event dropped due to not being matched by `whitelistUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n            return true;\n        }\n        return false;\n    };\n    /** JSDoc */\n    InboundFilters.prototype._isSentryError = function (event, options) {\n        if (options === void 0) { options = {}; }\n        if (!options.ignoreInternal) {\n            return false;\n        }\n        try {\n            return ((event &&\n                event.exception &&\n                event.exception.values &&\n                event.exception.values[0] &&\n                event.exception.values[0].type === 'SentryError') ||\n                false);\n        }\n        catch (_oO) {\n            return false;\n        }\n    };\n    /** JSDoc */\n    InboundFilters.prototype._isIgnoredError = function (event, options) {\n        if (options === void 0) { options = {}; }\n        if (!options.ignoreErrors || !options.ignoreErrors.length) {\n            return false;\n        }\n        return this._getPossibleEventMessages(event).some(function (message) {\n            // Not sure why TypeScript complains here...\n            return options.ignoreErrors.some(function (pattern) { return isMatchingPattern(message, pattern); });\n        });\n    };\n    /** JSDoc */\n    InboundFilters.prototype._isBlacklistedUrl = function (event, options) {\n        if (options === void 0) { options = {}; }\n        // TODO: Use Glob instead?\n        if (!options.blacklistUrls || !options.blacklistUrls.length) {\n            return false;\n        }\n        var url = this._getEventFilterUrl(event);\n        return !url ? false : options.blacklistUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });\n    };\n    /** JSDoc */\n    InboundFilters.prototype._isWhitelistedUrl = function (event, options) {\n        if (options === void 0) { options = {}; }\n        // TODO: Use Glob instead?\n        if (!options.whitelistUrls || !options.whitelistUrls.length) {\n            return true;\n        }\n        var url = this._getEventFilterUrl(event);\n        return !url ? true : options.whitelistUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });\n    };\n    /** JSDoc */\n    InboundFilters.prototype._mergeOptions = function (clientOptions) {\n        if (clientOptions === void 0) { clientOptions = {}; }\n        return {\n            blacklistUrls: tslib_1.__spread((this._options.blacklistUrls || []), (clientOptions.blacklistUrls || [])),\n            ignoreErrors: tslib_1.__spread((this._options.ignoreErrors || []), (clientOptions.ignoreErrors || []), DEFAULT_IGNORE_ERRORS),\n            ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true,\n            whitelistUrls: tslib_1.__spread((this._options.whitelistUrls || []), (clientOptions.whitelistUrls || [])),\n        };\n    };\n    /** JSDoc */\n    InboundFilters.prototype._getPossibleEventMessages = function (event) {\n        if (event.message) {\n            return [event.message];\n        }\n        if (event.exception) {\n            try {\n                var _a = (event.exception.values && event.exception.values[0]) || {}, _b = _a.type, type = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c;\n                return [\"\" + value, type + \": \" + value];\n            }\n            catch (oO) {\n                logger.error(\"Cannot extract message for event \" + getEventDescription(event));\n                return [];\n            }\n        }\n        return [];\n    };\n    /** JSDoc */\n    InboundFilters.prototype._getEventFilterUrl = function (event) {\n        try {\n            if (event.stacktrace) {\n                var frames_1 = event.stacktrace.frames;\n                return (frames_1 && frames_1[frames_1.length - 1].filename) || null;\n            }\n            if (event.exception) {\n                var frames_2 = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames;\n                return (frames_2 && frames_2[frames_2.length - 1].filename) || null;\n            }\n            return null;\n        }\n        catch (oO) {\n            logger.error(\"Cannot extract url for event \" + getEventDescription(event));\n            return null;\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    InboundFilters.id = 'InboundFilters';\n    return InboundFilters;\n}());\nexport { InboundFilters };\n//# sourceMappingURL=inboundfilters.js.map","export { FunctionToString } from './functiontostring';\nexport { InboundFilters } from './inboundfilters';\n//# sourceMappingURL=index.js.map","import { getCurrentHub } from '@sentry/hub';\nimport { logger } from '@sentry/utils';\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instanciate.\n * @param options Options to pass to the client.\n */\nexport function initAndBind(clientClass, options) {\n    if (options.debug === true) {\n        logger.enable();\n    }\n    getCurrentHub().bindClient(new clientClass(options));\n}\n//# sourceMappingURL=sdk.js.map","import { Status } from '@sentry/types';\nimport { SyncPromise } from '@sentry/utils';\n/** Noop transport */\nvar NoopTransport = /** @class */ (function () {\n    function NoopTransport() {\n    }\n    /**\n     * @inheritDoc\n     */\n    NoopTransport.prototype.sendEvent = function (_) {\n        return SyncPromise.resolve({\n            reason: \"NoopTransport: Event has been skipped because no Dsn is configured.\",\n            status: Status.Skipped,\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    NoopTransport.prototype.close = function (_) {\n        return SyncPromise.resolve(true);\n    };\n    return NoopTransport;\n}());\nexport { NoopTransport };\n//# sourceMappingURL=noop.js.map","import * as tslib_1 from \"tslib\";\nimport { consoleSandbox, dynamicRequire, getGlobalObject, isNodeEnv, logger, timestampWithMs, uuid4, } from '@sentry/utils';\nimport { Scope } from './scope';\n/**\n * API compatibility version of this hub.\n *\n * WARNING: This number should only be incresed when the global interface\n * changes a and new methods are introduced.\n *\n * @hidden\n */\nexport var API_VERSION = 3;\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nvar DEFAULT_BREADCRUMBS = 100;\n/**\n * Absolute maximum number of breadcrumbs added to an event. The\n * `maxBreadcrumbs` option cannot be higher than this value.\n */\nvar MAX_BREADCRUMBS = 100;\n/**\n * @inheritDoc\n */\nvar Hub = /** @class */ (function () {\n    /**\n     * Creates a new instance of the hub, will push one {@link Layer} into the\n     * internal stack on creation.\n     *\n     * @param client bound to the hub.\n     * @param scope bound to the hub.\n     * @param version number, higher number means higher priority.\n     */\n    function Hub(client, scope, _version) {\n        if (scope === void 0) { scope = new Scope(); }\n        if (_version === void 0) { _version = API_VERSION; }\n        this._version = _version;\n        /** Is a {@link Layer}[] containing the client and scope */\n        this._stack = [];\n        this._stack.push({ client: client, scope: scope });\n    }\n    /**\n     * Internal helper function to call a method on the top client if it exists.\n     *\n     * @param method The method to call on the client.\n     * @param args Arguments to pass to the client function.\n     */\n    Hub.prototype._invokeClient = function (method) {\n        var _a;\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        var top = this.getStackTop();\n        if (top && top.client && top.client[method]) {\n            (_a = top.client)[method].apply(_a, tslib_1.__spread(args, [top.scope]));\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.isOlderThan = function (version) {\n        return this._version < version;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.bindClient = function (client) {\n        var top = this.getStackTop();\n        top.client = client;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.pushScope = function () {\n        // We want to clone the content of prev scope\n        var stack = this.getStack();\n        var parentScope = stack.length > 0 ? stack[stack.length - 1].scope : undefined;\n        var scope = Scope.clone(parentScope);\n        this.getStack().push({\n            client: this.getClient(),\n            scope: scope,\n        });\n        return scope;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.popScope = function () {\n        return this.getStack().pop() !== undefined;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.withScope = function (callback) {\n        var scope = this.pushScope();\n        try {\n            callback(scope);\n        }\n        finally {\n            this.popScope();\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.getClient = function () {\n        return this.getStackTop().client;\n    };\n    /** Returns the scope of the top stack. */\n    Hub.prototype.getScope = function () {\n        return this.getStackTop().scope;\n    };\n    /** Returns the scope stack for domains or the process. */\n    Hub.prototype.getStack = function () {\n        return this._stack;\n    };\n    /** Returns the topmost scope layer in the order domain > local > process. */\n    Hub.prototype.getStackTop = function () {\n        return this._stack[this._stack.length - 1];\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.captureException = function (exception, hint) {\n        var eventId = (this._lastEventId = uuid4());\n        var finalHint = hint;\n        // If there's no explicit hint provided, mimick the same thing that would happen\n        // in the minimal itself to create a consistent behavior.\n        // We don't do this in the client, as it's the lowest level API, and doing this,\n        // would prevent user from having full control over direct calls.\n        if (!hint) {\n            var syntheticException = void 0;\n            try {\n                throw new Error('Sentry syntheticException');\n            }\n            catch (exception) {\n                syntheticException = exception;\n            }\n            finalHint = {\n                originalException: exception,\n                syntheticException: syntheticException,\n            };\n        }\n        this._invokeClient('captureException', exception, tslib_1.__assign({}, finalHint, { event_id: eventId }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.captureMessage = function (message, level, hint) {\n        var eventId = (this._lastEventId = uuid4());\n        var finalHint = hint;\n        // If there's no explicit hint provided, mimick the same thing that would happen\n        // in the minimal itself to create a consistent behavior.\n        // We don't do this in the client, as it's the lowest level API, and doing this,\n        // would prevent user from having full control over direct calls.\n        if (!hint) {\n            var syntheticException = void 0;\n            try {\n                throw new Error(message);\n            }\n            catch (exception) {\n                syntheticException = exception;\n            }\n            finalHint = {\n                originalException: message,\n                syntheticException: syntheticException,\n            };\n        }\n        this._invokeClient('captureMessage', message, level, tslib_1.__assign({}, finalHint, { event_id: eventId }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.captureEvent = function (event, hint) {\n        var eventId = (this._lastEventId = uuid4());\n        this._invokeClient('captureEvent', event, tslib_1.__assign({}, hint, { event_id: eventId }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.lastEventId = function () {\n        return this._lastEventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.addBreadcrumb = function (breadcrumb, hint) {\n        var top = this.getStackTop();\n        if (!top.scope || !top.client) {\n            return;\n        }\n        var _a = (top.client.getOptions && top.client.getOptions()) || {}, _b = _a.beforeBreadcrumb, beforeBreadcrumb = _b === void 0 ? null : _b, _c = _a.maxBreadcrumbs, maxBreadcrumbs = _c === void 0 ? DEFAULT_BREADCRUMBS : _c;\n        if (maxBreadcrumbs <= 0) {\n            return;\n        }\n        var timestamp = timestampWithMs();\n        var mergedBreadcrumb = tslib_1.__assign({ timestamp: timestamp }, breadcrumb);\n        var finalBreadcrumb = beforeBreadcrumb\n            ? consoleSandbox(function () { return beforeBreadcrumb(mergedBreadcrumb, hint); })\n            : mergedBreadcrumb;\n        if (finalBreadcrumb === null) {\n            return;\n        }\n        top.scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS));\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setUser = function (user) {\n        var top = this.getStackTop();\n        if (!top.scope) {\n            return;\n        }\n        top.scope.setUser(user);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setTags = function (tags) {\n        var top = this.getStackTop();\n        if (!top.scope) {\n            return;\n        }\n        top.scope.setTags(tags);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setExtras = function (extras) {\n        var top = this.getStackTop();\n        if (!top.scope) {\n            return;\n        }\n        top.scope.setExtras(extras);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setTag = function (key, value) {\n        var top = this.getStackTop();\n        if (!top.scope) {\n            return;\n        }\n        top.scope.setTag(key, value);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setExtra = function (key, extra) {\n        var top = this.getStackTop();\n        if (!top.scope) {\n            return;\n        }\n        top.scope.setExtra(key, extra);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setContext = function (name, context) {\n        var top = this.getStackTop();\n        if (!top.scope) {\n            return;\n        }\n        top.scope.setContext(name, context);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.configureScope = function (callback) {\n        var top = this.getStackTop();\n        if (top.scope && top.client) {\n            callback(top.scope);\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.run = function (callback) {\n        var oldHub = makeMain(this);\n        try {\n            callback(this);\n        }\n        finally {\n            makeMain(oldHub);\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.getIntegration = function (integration) {\n        var client = this.getClient();\n        if (!client) {\n            return null;\n        }\n        try {\n            return client.getIntegration(integration);\n        }\n        catch (_oO) {\n            logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Hub\");\n            return null;\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.startSpan = function (spanOrSpanContext, forceNoChild) {\n        if (forceNoChild === void 0) { forceNoChild = false; }\n        return this._callExtensionMethod('startSpan', spanOrSpanContext, forceNoChild);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.traceHeaders = function () {\n        return this._callExtensionMethod('traceHeaders');\n    };\n    /**\n     * Calls global extension method and binding current instance to the function call\n     */\n    // @ts-ignore\n    Hub.prototype._callExtensionMethod = function (method) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        var carrier = getMainCarrier();\n        var sentry = carrier.__SENTRY__;\n        // tslint:disable-next-line: strict-type-predicates\n        if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {\n            return sentry.extensions[method].apply(this, args);\n        }\n        logger.warn(\"Extension method \" + method + \" couldn't be found, doing nothing.\");\n    };\n    return Hub;\n}());\nexport { Hub };\n/** Returns the global shim registry. */\nexport function getMainCarrier() {\n    var carrier = getGlobalObject();\n    carrier.__SENTRY__ = carrier.__SENTRY__ || {\n        extensions: {},\n        hub: undefined,\n    };\n    return carrier;\n}\n/**\n * Replaces the current main hub with the passed one on the global object\n *\n * @returns The old replaced hub\n */\nexport function makeMain(hub) {\n    var registry = getMainCarrier();\n    var oldHub = getHubFromCarrier(registry);\n    setHubOnCarrier(registry, hub);\n    return oldHub;\n}\n/**\n * Returns the default hub instance.\n *\n * If a hub is already registered in the global carrier but this module\n * contains a more recent version, it replaces the registered version.\n * Otherwise, the currently registered hub will be returned.\n */\nexport function getCurrentHub() {\n    // Get main carrier (global for every environment)\n    var registry = getMainCarrier();\n    // If there's no hub, or its an old API, assign a new one\n    if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {\n        setHubOnCarrier(registry, new Hub());\n    }\n    // Prefer domains over global if they are there (applicable only to Node environment)\n    if (isNodeEnv()) {\n        return getHubFromActiveDomain(registry);\n    }\n    // Return hub that lives on a global object\n    return getHubFromCarrier(registry);\n}\n/**\n * Try to read the hub from an active domain, fallback to the registry if one doesnt exist\n * @returns discovered hub\n */\nfunction getHubFromActiveDomain(registry) {\n    try {\n        // We need to use `dynamicRequire` because `require` on it's own will be optimized by webpack.\n        // We do not want this to happen, we need to try to `require` the domain node module and fail if we are in browser\n        // for example so we do not have to shim it and use `getCurrentHub` universally.\n        var domain = dynamicRequire(module, 'domain');\n        var activeDomain = domain.active;\n        // If there no active domain, just return global hub\n        if (!activeDomain) {\n            return getHubFromCarrier(registry);\n        }\n        // If there's no hub on current domain, or its an old API, assign a new one\n        if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {\n            var registryHubTopStack = getHubFromCarrier(registry).getStackTop();\n            setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, Scope.clone(registryHubTopStack.scope)));\n        }\n        // Return hub that lives on a domain\n        return getHubFromCarrier(activeDomain);\n    }\n    catch (_Oo) {\n        // Return hub that lives on a global object\n        return getHubFromCarrier(registry);\n    }\n}\n/**\n * This will tell whether a carrier has a hub on it or not\n * @param carrier object\n */\nfunction hasHubOnCarrier(carrier) {\n    if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {\n        return true;\n    }\n    return false;\n}\n/**\n * This will create a new {@link Hub} and add to the passed object on\n * __SENTRY__.hub.\n * @param carrier object\n * @hidden\n */\nexport function getHubFromCarrier(carrier) {\n    if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {\n        return carrier.__SENTRY__.hub;\n    }\n    carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n    carrier.__SENTRY__.hub = new Hub();\n    return carrier.__SENTRY__.hub;\n}\n/**\n * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute\n * @param carrier object\n * @param hub Hub\n */\nexport function setHubOnCarrier(carrier, hub) {\n    if (!carrier) {\n        return false;\n    }\n    carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n    carrier.__SENTRY__.hub = hub;\n    return true;\n}\n//# sourceMappingURL=hub.js.map","export { addGlobalEventProcessor, Scope } from './scope';\nexport { getCurrentHub, getHubFromCarrier, getMainCarrier, Hub, makeMain, setHubOnCarrier } from './hub';\n//# sourceMappingURL=index.js.map","import * as tslib_1 from \"tslib\";\nimport { getGlobalObject, isThenable, normalize, SyncPromise, timestampWithMs } from '@sentry/utils';\n/**\n * Holds additional event information. {@link Scope.applyToEvent} will be\n * called by the client before an event will be sent.\n */\nvar Scope = /** @class */ (function () {\n    function Scope() {\n        /** Flag if notifiying is happening. */\n        this._notifyingListeners = false;\n        /** Callback for client to receive scope changes. */\n        this._scopeListeners = [];\n        /** Callback list that will be called after {@link applyToEvent}. */\n        this._eventProcessors = [];\n        /** Array of breadcrumbs. */\n        this._breadcrumbs = [];\n        /** User */\n        this._user = {};\n        /** Tags */\n        this._tags = {};\n        /** Extra */\n        this._extra = {};\n        /** Contexts */\n        this._context = {};\n    }\n    /**\n     * Add internal on change listener. Used for sub SDKs that need to store the scope.\n     * @hidden\n     */\n    Scope.prototype.addScopeListener = function (callback) {\n        this._scopeListeners.push(callback);\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.addEventProcessor = function (callback) {\n        this._eventProcessors.push(callback);\n        return this;\n    };\n    /**\n     * This will be called on every set call.\n     */\n    Scope.prototype._notifyScopeListeners = function () {\n        var _this = this;\n        if (!this._notifyingListeners) {\n            this._notifyingListeners = true;\n            setTimeout(function () {\n                _this._scopeListeners.forEach(function (callback) {\n                    callback(_this);\n                });\n                _this._notifyingListeners = false;\n            });\n        }\n    };\n    /**\n     * This will be called after {@link applyToEvent} is finished.\n     */\n    Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) {\n        var _this = this;\n        if (index === void 0) { index = 0; }\n        return new SyncPromise(function (resolve, reject) {\n            var processor = processors[index];\n            // tslint:disable-next-line:strict-type-predicates\n            if (event === null || typeof processor !== 'function') {\n                resolve(event);\n            }\n            else {\n                var result = processor(tslib_1.__assign({}, event), hint);\n                if (isThenable(result)) {\n                    result\n                        .then(function (final) { return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve); })\n                        .then(null, reject);\n                }\n                else {\n                    _this._notifyEventProcessors(processors, result, hint, index + 1)\n                        .then(resolve)\n                        .then(null, reject);\n                }\n            }\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setUser = function (user) {\n        this._user = normalize(user);\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setTags = function (tags) {\n        this._tags = tslib_1.__assign({}, this._tags, normalize(tags));\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setTag = function (key, value) {\n        var _a;\n        this._tags = tslib_1.__assign({}, this._tags, (_a = {}, _a[key] = normalize(value), _a));\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setExtras = function (extra) {\n        this._extra = tslib_1.__assign({}, this._extra, normalize(extra));\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setExtra = function (key, extra) {\n        var _a;\n        this._extra = tslib_1.__assign({}, this._extra, (_a = {}, _a[key] = normalize(extra), _a));\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setFingerprint = function (fingerprint) {\n        this._fingerprint = normalize(fingerprint);\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setLevel = function (level) {\n        this._level = normalize(level);\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setTransaction = function (transaction) {\n        this._transaction = transaction;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setContext = function (name, context) {\n        this._context[name] = context ? normalize(context) : undefined;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setSpan = function (span) {\n        this._span = span;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * Internal getter for Span, used in Hub.\n     * @hidden\n     */\n    Scope.prototype.getSpan = function () {\n        return this._span;\n    };\n    /**\n     * Inherit values from the parent scope.\n     * @param scope to clone.\n     */\n    Scope.clone = function (scope) {\n        var newScope = new Scope();\n        if (scope) {\n            newScope._breadcrumbs = tslib_1.__spread(scope._breadcrumbs);\n            newScope._tags = tslib_1.__assign({}, scope._tags);\n            newScope._extra = tslib_1.__assign({}, scope._extra);\n            newScope._context = tslib_1.__assign({}, scope._context);\n            newScope._user = scope._user;\n            newScope._level = scope._level;\n            newScope._span = scope._span;\n            newScope._transaction = scope._transaction;\n            newScope._fingerprint = scope._fingerprint;\n            newScope._eventProcessors = tslib_1.__spread(scope._eventProcessors);\n        }\n        return newScope;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.clear = function () {\n        this._breadcrumbs = [];\n        this._tags = {};\n        this._extra = {};\n        this._user = {};\n        this._context = {};\n        this._level = undefined;\n        this._transaction = undefined;\n        this._fingerprint = undefined;\n        this._span = undefined;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) {\n        var timestamp = timestampWithMs();\n        var mergedBreadcrumb = tslib_1.__assign({ timestamp: timestamp }, breadcrumb);\n        this._breadcrumbs =\n            maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0\n                ? tslib_1.__spread(this._breadcrumbs, [normalize(mergedBreadcrumb)]).slice(-maxBreadcrumbs)\n                : tslib_1.__spread(this._breadcrumbs, [normalize(mergedBreadcrumb)]);\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.clearBreadcrumbs = function () {\n        this._breadcrumbs = [];\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * Applies fingerprint from the scope to the event if there's one,\n     * uses message if there's one instead or get rid of empty fingerprint\n     */\n    Scope.prototype._applyFingerprint = function (event) {\n        // Make sure it's an array first and we actually have something in place\n        event.fingerprint = event.fingerprint\n            ? Array.isArray(event.fingerprint)\n                ? event.fingerprint\n                : [event.fingerprint]\n            : [];\n        // If we have something on the scope, then merge it with event\n        if (this._fingerprint) {\n            event.fingerprint = event.fingerprint.concat(this._fingerprint);\n        }\n        // If we have no data at all, remove empty array default\n        if (event.fingerprint && !event.fingerprint.length) {\n            delete event.fingerprint;\n        }\n    };\n    /**\n     * Applies the current context and fingerprint to the event.\n     * Note that breadcrumbs will be added by the client.\n     * Also if the event has already breadcrumbs on it, we do not merge them.\n     * @param event Event\n     * @param hint May contain additional informartion about the original exception.\n     * @hidden\n     */\n    Scope.prototype.applyToEvent = function (event, hint) {\n        if (this._extra && Object.keys(this._extra).length) {\n            event.extra = tslib_1.__assign({}, this._extra, event.extra);\n        }\n        if (this._tags && Object.keys(this._tags).length) {\n            event.tags = tslib_1.__assign({}, this._tags, event.tags);\n        }\n        if (this._user && Object.keys(this._user).length) {\n            event.user = tslib_1.__assign({}, this._user, event.user);\n        }\n        if (this._context && Object.keys(this._context).length) {\n            event.contexts = tslib_1.__assign({}, this._context, event.contexts);\n        }\n        if (this._level) {\n            event.level = this._level;\n        }\n        if (this._transaction) {\n            event.transaction = this._transaction;\n        }\n        this._applyFingerprint(event);\n        event.breadcrumbs = tslib_1.__spread((event.breadcrumbs || []), this._breadcrumbs);\n        event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;\n        return this._notifyEventProcessors(tslib_1.__spread(getGlobalEventProcessors(), this._eventProcessors), event, hint);\n    };\n    return Scope;\n}());\nexport { Scope };\n/**\n * Retruns the global event processors.\n */\nfunction getGlobalEventProcessors() {\n    var global = getGlobalObject();\n    global.__SENTRY__ = global.__SENTRY__ || {};\n    global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || [];\n    return global.__SENTRY__.globalEventProcessors;\n}\n/**\n * Add a EventProcessor to be kept globally.\n * @param callback EventProcessor to add\n */\nexport function addGlobalEventProcessor(callback) {\n    getGlobalEventProcessors().push(callback);\n}\n//# sourceMappingURL=scope.js.map","import * as tslib_1 from \"tslib\";\nimport { getGlobalObject, logger } from '@sentry/utils';\n// See https://github.com/angular/angular.js/blob/v1.4.7/src/minErr.js\nvar angularPattern = /^\\[((?:[$a-zA-Z0-9]+:)?(?:[$a-zA-Z0-9]+))\\] (.*?)\\n?(\\S+)$/;\n/**\n * AngularJS integration\n *\n * Provides an $exceptionHandler for AngularJS\n */\nvar Angular = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function Angular(options) {\n        if (options === void 0) { options = {}; }\n        /**\n         * @inheritDoc\n         */\n        this.name = Angular.id;\n        // tslint:disable-next-line: no-unsafe-any\n        this._angular = options.angular || getGlobalObject().angular;\n    }\n    /**\n     * @inheritDoc\n     */\n    Angular.prototype.setupOnce = function (_, getCurrentHub) {\n        var _this = this;\n        if (!this._angular) {\n            logger.error('AngularIntegration is missing an Angular instance');\n            return;\n        }\n        this._getCurrentHub = getCurrentHub;\n        // tslint:disable: no-unsafe-any\n        this._angular.module(Angular.moduleName, []).config([\n            '$provide',\n            function ($provide) {\n                $provide.decorator('$exceptionHandler', ['$delegate', _this._$exceptionHandlerDecorator.bind(_this)]);\n            },\n        ]);\n        // tslint:enable: no-unsafe-any\n    };\n    /**\n     * Angular's exceptionHandler for Sentry integration\n     */\n    // tslint:disable-next-line: no-unsafe-any\n    Angular.prototype._$exceptionHandlerDecorator = function ($delegate) {\n        var _this = this;\n        return function (exception, cause) {\n            var hub = _this._getCurrentHub && _this._getCurrentHub();\n            if (hub && hub.getIntegration(Angular)) {\n                hub.withScope(function (scope) {\n                    if (cause) {\n                        scope.setExtra('cause', cause);\n                    }\n                    scope.addEventProcessor(function (event) {\n                        var ex = event.exception && event.exception.values && event.exception.values[0];\n                        if (ex) {\n                            var matches = angularPattern.exec(ex.value || '');\n                            if (matches) {\n                                // This type now becomes something like: $rootScope:inprog\n                                ex.type = matches[1];\n                                ex.value = matches[2];\n                                event.message = ex.type + \": \" + ex.value;\n                                // auto set a new tag specifically for the angular error url\n                                event.extra = tslib_1.__assign({}, event.extra, { angularDocs: matches[3].substr(0, 250) });\n                            }\n                        }\n                        return event;\n                    });\n                    hub.captureException(exception);\n                });\n            }\n            // tslint:disable-next-line: no-unsafe-any\n            $delegate(exception, cause);\n        };\n    };\n    /**\n     * @inheritDoc\n     */\n    Angular.id = 'AngularJS';\n    /**\n     * moduleName used in Angular's DI resolution algorithm\n     */\n    Angular.moduleName = 'ngSentry';\n    return Angular;\n}());\nexport { Angular };\n//# sourceMappingURL=angular.js.map","import { Severity } from '@sentry/types';\nimport { fill, getGlobalObject, normalize, safeJoin } from '@sentry/utils';\nvar global = getGlobalObject();\n/** Send Console API calls as Sentry Events */\nvar CaptureConsole = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function CaptureConsole(options) {\n        if (options === void 0) { options = {}; }\n        /**\n         * @inheritDoc\n         */\n        this.name = CaptureConsole.id;\n        /**\n         * @inheritDoc\n         */\n        this._levels = ['log', 'info', 'warn', 'error', 'debug', 'assert'];\n        if (options.levels) {\n            this._levels = options.levels;\n        }\n    }\n    /**\n     * @inheritDoc\n     */\n    CaptureConsole.prototype.setupOnce = function (_, getCurrentHub) {\n        if (!('console' in global)) {\n            return;\n        }\n        this._levels.forEach(function (level) {\n            if (!(level in global.console)) {\n                return;\n            }\n            fill(global.console, level, function (originalConsoleLevel) { return function () {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    args[_i] = arguments[_i];\n                }\n                var hub = getCurrentHub();\n                if (hub.getIntegration(CaptureConsole)) {\n                    hub.withScope(function (scope) {\n                        scope.setLevel(Severity.fromString(level));\n                        scope.setExtra('arguments', normalize(args, 3));\n                        scope.addEventProcessor(function (event) {\n                            event.logger = 'console';\n                            return event;\n                        });\n                        var message = safeJoin(args, ' ');\n                        if (level === 'assert') {\n                            if (args[0] === false) {\n                                message = \"Assertion failed: \" + (safeJoin(args.slice(1), ' ') || 'console.assert');\n                                scope.setExtra('arguments', normalize(args.slice(1), 3));\n                                hub.captureMessage(message);\n                            }\n                        }\n                        else {\n                            hub.captureMessage(message);\n                        }\n                    });\n                }\n                // this fails for some browsers. :(\n                if (originalConsoleLevel) {\n                    Function.prototype.apply.call(originalConsoleLevel, global.console, args);\n                }\n            }; });\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    CaptureConsole.id = 'CaptureConsole';\n    return CaptureConsole;\n}());\nexport { CaptureConsole };\n//# sourceMappingURL=captureconsole.js.map","import * as tslib_1 from \"tslib\";\nimport { consoleSandbox } from '@sentry/utils';\n/** JSDoc */\nvar Debug = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function Debug(options) {\n        /**\n         * @inheritDoc\n         */\n        this.name = Debug.id;\n        this._options = tslib_1.__assign({ debugger: false, stringify: false }, options);\n    }\n    /**\n     * @inheritDoc\n     */\n    Debug.prototype.setupOnce = function (addGlobalEventProcessor, getCurrentHub) {\n        addGlobalEventProcessor(function (event, hint) {\n            var self = getCurrentHub().getIntegration(Debug);\n            if (self) {\n                // tslint:disable:no-console\n                // tslint:disable:no-debugger\n                if (self._options.debugger) {\n                    debugger;\n                }\n                consoleSandbox(function () {\n                    if (self._options.stringify) {\n                        console.log(JSON.stringify(event, null, 2));\n                        if (hint) {\n                            console.log(JSON.stringify(hint, null, 2));\n                        }\n                    }\n                    else {\n                        console.log(event);\n                        if (hint) {\n                            console.log(hint);\n                        }\n                    }\n                });\n            }\n            return event;\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    Debug.id = 'Debug';\n    return Debug;\n}());\nexport { Debug };\n//# sourceMappingURL=debug.js.map","/** Deduplication filter */\nvar Dedupe = /** @class */ (function () {\n    function Dedupe() {\n        /**\n         * @inheritDoc\n         */\n        this.name = Dedupe.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    Dedupe.prototype.setupOnce = function (addGlobalEventProcessor, getCurrentHub) {\n        addGlobalEventProcessor(function (currentEvent) {\n            var self = getCurrentHub().getIntegration(Dedupe);\n            if (self) {\n                // Juuust in case something goes wrong\n                try {\n                    if (self._shouldDropEvent(currentEvent, self._previousEvent)) {\n                        return null;\n                    }\n                }\n                catch (_oO) {\n                    return (self._previousEvent = currentEvent);\n                }\n                return (self._previousEvent = currentEvent);\n            }\n            return currentEvent;\n        });\n    };\n    /** JSDoc */\n    Dedupe.prototype._shouldDropEvent = function (currentEvent, previousEvent) {\n        if (!previousEvent) {\n            return false;\n        }\n        if (this._isSameMessageEvent(currentEvent, previousEvent)) {\n            return true;\n        }\n        if (this._isSameExceptionEvent(currentEvent, previousEvent)) {\n            return true;\n        }\n        return false;\n    };\n    /** JSDoc */\n    Dedupe.prototype._isSameMessageEvent = function (currentEvent, previousEvent) {\n        var currentMessage = currentEvent.message;\n        var previousMessage = previousEvent.message;\n        // If no event has a message, they were both exceptions, so bail out\n        if (!currentMessage && !previousMessage) {\n            return false;\n        }\n        // If only one event has a stacktrace, but not the other one, they are not the same\n        if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {\n            return false;\n        }\n        if (currentMessage !== previousMessage) {\n            return false;\n        }\n        if (!this._isSameFingerprint(currentEvent, previousEvent)) {\n            return false;\n        }\n        if (!this._isSameStacktrace(currentEvent, previousEvent)) {\n            return false;\n        }\n        return true;\n    };\n    /** JSDoc */\n    Dedupe.prototype._getFramesFromEvent = function (event) {\n        var exception = event.exception;\n        if (exception) {\n            try {\n                // @ts-ignore\n                return exception.values[0].stacktrace.frames;\n            }\n            catch (_oO) {\n                return undefined;\n            }\n        }\n        else if (event.stacktrace) {\n            return event.stacktrace.frames;\n        }\n        return undefined;\n    };\n    /** JSDoc */\n    Dedupe.prototype._isSameStacktrace = function (currentEvent, previousEvent) {\n        var currentFrames = this._getFramesFromEvent(currentEvent);\n        var previousFrames = this._getFramesFromEvent(previousEvent);\n        // If no event has a fingerprint, they are assumed to be the same\n        if (!currentFrames && !previousFrames) {\n            return true;\n        }\n        // If only one event has a stacktrace, but not the other one, they are not the same\n        if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {\n            return false;\n        }\n        currentFrames = currentFrames;\n        previousFrames = previousFrames;\n        // If number of frames differ, they are not the same\n        if (previousFrames.length !== currentFrames.length) {\n            return false;\n        }\n        // Otherwise, compare the two\n        for (var i = 0; i < previousFrames.length; i++) {\n            var frameA = previousFrames[i];\n            var frameB = currentFrames[i];\n            if (frameA.filename !== frameB.filename ||\n                frameA.lineno !== frameB.lineno ||\n                frameA.colno !== frameB.colno ||\n                frameA.function !== frameB.function) {\n                return false;\n            }\n        }\n        return true;\n    };\n    /** JSDoc */\n    Dedupe.prototype._getExceptionFromEvent = function (event) {\n        return event.exception && event.exception.values && event.exception.values[0];\n    };\n    /** JSDoc */\n    Dedupe.prototype._isSameExceptionEvent = function (currentEvent, previousEvent) {\n        var previousException = this._getExceptionFromEvent(previousEvent);\n        var currentException = this._getExceptionFromEvent(currentEvent);\n        if (!previousException || !currentException) {\n            return false;\n        }\n        if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n            return false;\n        }\n        if (!this._isSameFingerprint(currentEvent, previousEvent)) {\n            return false;\n        }\n        if (!this._isSameStacktrace(currentEvent, previousEvent)) {\n            return false;\n        }\n        return true;\n    };\n    /** JSDoc */\n    Dedupe.prototype._isSameFingerprint = function (currentEvent, previousEvent) {\n        var currentFingerprint = currentEvent.fingerprint;\n        var previousFingerprint = previousEvent.fingerprint;\n        // If no event has a fingerprint, they are assumed to be the same\n        if (!currentFingerprint && !previousFingerprint) {\n            return true;\n        }\n        // If only one event has a fingerprint, but not the other one, they are not the same\n        if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {\n            return false;\n        }\n        currentFingerprint = currentFingerprint;\n        previousFingerprint = previousFingerprint;\n        // Otherwise, compare the two\n        try {\n            return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n        }\n        catch (_oO) {\n            return false;\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Dedupe.id = 'Dedupe';\n    return Dedupe;\n}());\nexport { Dedupe };\n//# sourceMappingURL=dedupe.js.map","import { getGlobalObject, isInstanceOf, logger } from '@sentry/utils';\n/** JSDoc */\nvar Ember = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function Ember(options) {\n        if (options === void 0) { options = {}; }\n        /**\n         * @inheritDoc\n         */\n        this.name = Ember.id;\n        // tslint:disable-next-line: no-unsafe-any\n        this._Ember = options.Ember || getGlobalObject().Ember;\n    }\n    /**\n     * @inheritDoc\n     */\n    Ember.prototype.setupOnce = function (_, getCurrentHub) {\n        // tslint:disable:no-unsafe-any\n        var _this = this;\n        if (!this._Ember) {\n            logger.error('EmberIntegration is missing an Ember instance');\n            return;\n        }\n        var oldOnError = this._Ember.onerror;\n        this._Ember.onerror = function (error) {\n            if (getCurrentHub().getIntegration(Ember)) {\n                getCurrentHub().captureException(error, { originalException: error });\n            }\n            if (typeof oldOnError === 'function') {\n                oldOnError.call(_this._Ember, error);\n            }\n            else if (_this._Ember.testing) {\n                throw error;\n            }\n        };\n        this._Ember.RSVP.on('error', function (reason) {\n            if (getCurrentHub().getIntegration(Ember)) {\n                getCurrentHub().withScope(function (scope) {\n                    if (isInstanceOf(reason, Error)) {\n                        scope.setExtra('context', 'Unhandled Promise error detected');\n                        getCurrentHub().captureException(reason, { originalException: reason });\n                    }\n                    else {\n                        scope.setExtra('reason', reason);\n                        getCurrentHub().captureMessage('Unhandled Promise error detected');\n                    }\n                });\n            }\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    Ember.id = 'Ember';\n    return Ember;\n}());\nexport { Ember };\n//# sourceMappingURL=ember.js.map","import * as tslib_1 from \"tslib\";\nimport { isError, isPlainObject, logger, normalize } from '@sentry/utils';\n/** Patch toString calls to return proper name for wrapped functions */\nvar ExtraErrorData = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function ExtraErrorData(_options) {\n        if (_options === void 0) { _options = { depth: 3 }; }\n        this._options = _options;\n        /**\n         * @inheritDoc\n         */\n        this.name = ExtraErrorData.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    ExtraErrorData.prototype.setupOnce = function (addGlobalEventProcessor, getCurrentHub) {\n        addGlobalEventProcessor(function (event, hint) {\n            var self = getCurrentHub().getIntegration(ExtraErrorData);\n            if (!self) {\n                return event;\n            }\n            return self.enhanceEventWithErrorData(event, hint);\n        });\n    };\n    /**\n     * Attaches extracted information from the Error object to extra field in the Event\n     */\n    ExtraErrorData.prototype.enhanceEventWithErrorData = function (event, hint) {\n        var _a;\n        if (!hint || !hint.originalException || !isError(hint.originalException)) {\n            return event;\n        }\n        var name = hint.originalException.name || hint.originalException.constructor.name;\n        var errorData = this._extractErrorData(hint.originalException);\n        if (errorData) {\n            var contexts = tslib_1.__assign({}, event.contexts);\n            var normalizedErrorData = normalize(errorData, this._options.depth);\n            if (isPlainObject(normalizedErrorData)) {\n                contexts = tslib_1.__assign({}, event.contexts, (_a = {}, _a[name] = tslib_1.__assign({}, normalizedErrorData), _a));\n            }\n            return tslib_1.__assign({}, event, { contexts: contexts });\n        }\n        return event;\n    };\n    /**\n     * Extract extra information from the Error object\n     */\n    ExtraErrorData.prototype._extractErrorData = function (error) {\n        var e_1, _a;\n        var result = null;\n        // We are trying to enhance already existing event, so no harm done if it won't succeed\n        try {\n            var nativeKeys_1 = ['name', 'message', 'stack', 'line', 'column', 'fileName', 'lineNumber', 'columnNumber'];\n            var errorKeys = Object.getOwnPropertyNames(error).filter(function (key) { return nativeKeys_1.indexOf(key) === -1; });\n            if (errorKeys.length) {\n                var extraErrorInfo = {};\n                try {\n                    for (var errorKeys_1 = tslib_1.__values(errorKeys), errorKeys_1_1 = errorKeys_1.next(); !errorKeys_1_1.done; errorKeys_1_1 = errorKeys_1.next()) {\n                        var key = errorKeys_1_1.value;\n                        var value = error[key];\n                        if (isError(value)) {\n                            value = value.toString();\n                        }\n                        // tslint:disable:no-unsafe-any\n                        extraErrorInfo[key] = value;\n                    }\n                }\n                catch (e_1_1) { e_1 = { error: e_1_1 }; }\n                finally {\n                    try {\n                        if (errorKeys_1_1 && !errorKeys_1_1.done && (_a = errorKeys_1.return)) _a.call(errorKeys_1);\n                    }\n                    finally { if (e_1) throw e_1.error; }\n                }\n                result = extraErrorInfo;\n            }\n        }\n        catch (oO) {\n            logger.error('Unable to extract extra data from the Error object:', oO);\n        }\n        return result;\n    };\n    /**\n     * @inheritDoc\n     */\n    ExtraErrorData.id = 'ExtraErrorData';\n    return ExtraErrorData;\n}());\nexport { ExtraErrorData };\n//# sourceMappingURL=extraerrordata.js.map","export { Angular } from './angular';\nexport { CaptureConsole } from './captureconsole';\nexport { Debug } from './debug';\nexport { Dedupe } from './dedupe';\nexport { Ember } from './ember';\nexport { ExtraErrorData } from './extraerrordata';\nexport { ReportingObserver } from './reportingobserver';\nexport { RewriteFrames } from './rewriteframes';\nexport { SessionTiming } from './sessiontiming';\nexport { Transaction } from './transaction';\nexport { Vue } from './vue';\n//# sourceMappingURL=index.js.map","import * as tslib_1 from \"tslib\";\nimport { getGlobalObject, supportsReportingObserver } from '@sentry/utils';\n/** JSDoc */\nvar ReportTypes;\n(function (ReportTypes) {\n    /** JSDoc */\n    ReportTypes[\"Crash\"] = \"crash\";\n    /** JSDoc */\n    ReportTypes[\"Deprecation\"] = \"deprecation\";\n    /** JSDoc */\n    ReportTypes[\"Intervention\"] = \"intervention\";\n})(ReportTypes || (ReportTypes = {}));\n/** Reporting API integration - https://w3c.github.io/reporting/ */\nvar ReportingObserver = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function ReportingObserver(_options) {\n        if (_options === void 0) { _options = {\n            types: [ReportTypes.Crash, ReportTypes.Deprecation, ReportTypes.Intervention],\n        }; }\n        this._options = _options;\n        /**\n         * @inheritDoc\n         */\n        this.name = ReportingObserver.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    ReportingObserver.prototype.setupOnce = function (_, getCurrentHub) {\n        // tslint:disable:no-unsafe-any\n        if (!supportsReportingObserver()) {\n            return;\n        }\n        this._getCurrentHub = getCurrentHub;\n        var observer = new (getGlobalObject()).ReportingObserver(this.handler.bind(this), {\n            buffered: true,\n            types: this._options.types,\n        });\n        observer.observe();\n    };\n    /**\n     * @inheritDoc\n     */\n    ReportingObserver.prototype.handler = function (reports) {\n        var e_1, _a;\n        var hub = this._getCurrentHub && this._getCurrentHub();\n        if (!hub || !hub.getIntegration(ReportingObserver)) {\n            return;\n        }\n        var _loop_1 = function (report) {\n            hub.withScope(function (scope) {\n                scope.setExtra('url', report.url);\n                var label = \"ReportingObserver [\" + report.type + \"]\";\n                var details = 'No details available';\n                if (report.body) {\n                    // Object.keys doesn't work on ReportBody, as all properties are inheirted\n                    var plainBody = {};\n                    // tslint:disable-next-line:forin\n                    for (var prop in report.body) {\n                        plainBody[prop] = report.body[prop];\n                    }\n                    scope.setExtra('body', plainBody);\n                    if (report.type === ReportTypes.Crash) {\n                        var body = report.body;\n                        // A fancy way to create a message out of crashId OR reason OR both OR fallback\n                        details = [body.crashId || '', body.reason || ''].join(' ').trim() || details;\n                    }\n                    else {\n                        var body = report.body;\n                        details = body.message || details;\n                    }\n                }\n                hub.captureMessage(label + \": \" + details);\n            });\n        };\n        try {\n            for (var reports_1 = tslib_1.__values(reports), reports_1_1 = reports_1.next(); !reports_1_1.done; reports_1_1 = reports_1.next()) {\n                var report = reports_1_1.value;\n                _loop_1(report);\n            }\n        }\n        catch (e_1_1) { e_1 = { error: e_1_1 }; }\n        finally {\n            try {\n                if (reports_1_1 && !reports_1_1.done && (_a = reports_1.return)) _a.call(reports_1);\n            }\n            finally { if (e_1) throw e_1.error; }\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    ReportingObserver.id = 'ReportingObserver';\n    return ReportingObserver;\n}());\nexport { ReportingObserver };\n//# sourceMappingURL=reportingobserver.js.map","import * as tslib_1 from \"tslib\";\nimport { basename, relative } from '@sentry/utils';\n/** Rewrite event frames paths */\nvar RewriteFrames = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function RewriteFrames(options) {\n        var _this = this;\n        if (options === void 0) { options = {}; }\n        /**\n         * @inheritDoc\n         */\n        this.name = RewriteFrames.id;\n        /**\n         * @inheritDoc\n         */\n        this._iteratee = function (frame) {\n            if (!frame.filename) {\n                return frame;\n            }\n            // Check if the frame filename begins with `/` or a Windows-style prefix such as `C:\\`\n            var isWindowsFrame = /^[A-Z]:\\\\/.test(frame.filename);\n            var startsWithSlash = /^\\//.test(frame.filename);\n            if (frame.filename && (isWindowsFrame || startsWithSlash)) {\n                var filename = isWindowsFrame\n                    ? frame.filename\n                        .replace(/^[A-Z]:/, '') // remove Windows-style prefix\n                        .replace(/\\\\/g, '/') // replace all `\\\\` instances with `/`\n                    : frame.filename;\n                var base = _this._root ? relative(_this._root, filename) : basename(filename);\n                frame.filename = \"app:///\" + base;\n            }\n            return frame;\n        };\n        if (options.root) {\n            this._root = options.root;\n        }\n        if (options.iteratee) {\n            this._iteratee = options.iteratee;\n        }\n    }\n    /**\n     * @inheritDoc\n     */\n    RewriteFrames.prototype.setupOnce = function (addGlobalEventProcessor, getCurrentHub) {\n        addGlobalEventProcessor(function (event) {\n            var self = getCurrentHub().getIntegration(RewriteFrames);\n            if (self) {\n                return self.process(event);\n            }\n            return event;\n        });\n    };\n    /** JSDoc */\n    RewriteFrames.prototype.process = function (event) {\n        if (event.exception && Array.isArray(event.exception.values)) {\n            return this._processExceptionsEvent(event);\n        }\n        if (event.stacktrace) {\n            return this._processStacktraceEvent(event);\n        }\n        return event;\n    };\n    /** JSDoc */\n    RewriteFrames.prototype._processExceptionsEvent = function (event) {\n        var _this = this;\n        try {\n            return tslib_1.__assign({}, event, { exception: tslib_1.__assign({}, event.exception, { \n                    // The check for this is performed inside `process` call itself, safe to skip here\n                    // tslint:disable-next-line:no-non-null-assertion\n                    values: event.exception.values.map(function (value) { return (tslib_1.__assign({}, value, { stacktrace: _this._processStacktrace(value.stacktrace) })); }) }) });\n        }\n        catch (_oO) {\n            return event;\n        }\n    };\n    /** JSDoc */\n    RewriteFrames.prototype._processStacktraceEvent = function (event) {\n        try {\n            return tslib_1.__assign({}, event, { stacktrace: this._processStacktrace(event.stacktrace) });\n        }\n        catch (_oO) {\n            return event;\n        }\n    };\n    /** JSDoc */\n    RewriteFrames.prototype._processStacktrace = function (stacktrace) {\n        var _this = this;\n        return tslib_1.__assign({}, stacktrace, { frames: stacktrace && stacktrace.frames && stacktrace.frames.map(function (f) { return _this._iteratee(f); }) });\n    };\n    /**\n     * @inheritDoc\n     */\n    RewriteFrames.id = 'RewriteFrames';\n    return RewriteFrames;\n}());\nexport { RewriteFrames };\n//# sourceMappingURL=rewriteframes.js.map","import * as tslib_1 from \"tslib\";\n/** This function adds duration since Sentry was initialized till the time event was sent */\nvar SessionTiming = /** @class */ (function () {\n    function SessionTiming() {\n        /**\n         * @inheritDoc\n         */\n        this.name = SessionTiming.id;\n        /** Exact time Client was initialized expressed in milliseconds since Unix Epoch. */\n        this._startTime = Date.now();\n    }\n    /**\n     * @inheritDoc\n     */\n    SessionTiming.prototype.setupOnce = function (addGlobalEventProcessor, getCurrentHub) {\n        addGlobalEventProcessor(function (event) {\n            var self = getCurrentHub().getIntegration(SessionTiming);\n            if (self) {\n                return self.process(event);\n            }\n            return event;\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    SessionTiming.prototype.process = function (event) {\n        var _a;\n        var now = Date.now();\n        return tslib_1.__assign({}, event, { extra: tslib_1.__assign({}, event.extra, (_a = {}, _a['session:start'] = this._startTime, _a['session:duration'] = now - this._startTime, _a['session:end'] = now, _a)) });\n    };\n    /**\n     * @inheritDoc\n     */\n    SessionTiming.id = 'SessionTiming';\n    return SessionTiming;\n}());\nexport { SessionTiming };\n//# sourceMappingURL=sessiontiming.js.map","/** Add node transaction to the event */\nvar Transaction = /** @class */ (function () {\n    function Transaction() {\n        /**\n         * @inheritDoc\n         */\n        this.name = Transaction.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    Transaction.prototype.setupOnce = function (addGlobalEventProcessor, getCurrentHub) {\n        addGlobalEventProcessor(function (event) {\n            var self = getCurrentHub().getIntegration(Transaction);\n            if (self) {\n                return self.process(event);\n            }\n            return event;\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    Transaction.prototype.process = function (event) {\n        var frames = this._getFramesFromEvent(event);\n        // use for loop so we don't have to reverse whole frames array\n        for (var i = frames.length - 1; i >= 0; i--) {\n            var frame = frames[i];\n            if (frame.in_app === true) {\n                event.transaction = this._getTransaction(frame);\n                break;\n            }\n        }\n        return event;\n    };\n    /** JSDoc */\n    Transaction.prototype._getFramesFromEvent = function (event) {\n        var exception = event.exception && event.exception.values && event.exception.values[0];\n        return (exception && exception.stacktrace && exception.stacktrace.frames) || [];\n    };\n    /** JSDoc */\n    Transaction.prototype._getTransaction = function (frame) {\n        return frame.module || frame.function ? (frame.module || '?') + \"/\" + (frame.function || '?') : '<unknown>';\n    };\n    /**\n     * @inheritDoc\n     */\n    Transaction.id = 'Transaction';\n    return Transaction;\n}());\nexport { Transaction };\n//# sourceMappingURL=transaction.js.map","import { getGlobalObject, isPlainObject, logger } from '@sentry/utils';\n/** JSDoc */\nvar Vue = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function Vue(options) {\n        if (options === void 0) { options = {}; }\n        /**\n         * @inheritDoc\n         */\n        this.name = Vue.id;\n        /**\n         * When set to false, Sentry will suppress reporting all props data\n         * from your Vue components for privacy concerns.\n         */\n        this._attachProps = true;\n        /**\n         * When set to true, original Vue's `logError` will be called as well.\n         * https://github.com/vuejs/vue/blob/c2b1cfe9ccd08835f2d99f6ce60f67b4de55187f/src/core/util/error.js#L38-L48\n         */\n        this._logErrors = false;\n        // tslint:disable-next-line: no-unsafe-any\n        this._Vue = options.Vue || getGlobalObject().Vue;\n        if (options.logErrors !== undefined) {\n            this._logErrors = options.logErrors;\n        }\n        if (options.attachProps === false) {\n            this._attachProps = false;\n        }\n    }\n    /** JSDoc */\n    Vue.prototype._formatComponentName = function (vm) {\n        // tslint:disable:no-unsafe-any\n        if (vm.$root === vm) {\n            return 'root instance';\n        }\n        var name = vm._isVue ? vm.$options.name || vm.$options._componentTag : vm.name;\n        return ((name ? \"component <\" + name + \">\" : 'anonymous component') +\n            (vm._isVue && vm.$options.__file ? \" at \" + vm.$options.__file : ''));\n    };\n    /**\n     * @inheritDoc\n     */\n    Vue.prototype.setupOnce = function (_, getCurrentHub) {\n        // tslint:disable:no-unsafe-any\n        var _this = this;\n        if (!this._Vue || !this._Vue.config) {\n            logger.error('VueIntegration is missing a Vue instance');\n            return;\n        }\n        var oldOnError = this._Vue.config.errorHandler;\n        this._Vue.config.errorHandler = function (error, vm, info) {\n            var metadata = {};\n            if (isPlainObject(vm)) {\n                metadata.componentName = _this._formatComponentName(vm);\n                if (_this._attachProps) {\n                    metadata.propsData = vm.$options.propsData;\n                }\n            }\n            if (info !== void 0) {\n                metadata.lifecycleHook = info;\n            }\n            if (getCurrentHub().getIntegration(Vue)) {\n                // This timeout makes sure that any breadcrumbs are recorded before sending it off the sentry\n                setTimeout(function () {\n                    getCurrentHub().withScope(function (scope) {\n                        scope.setContext('vue', metadata);\n                        getCurrentHub().captureException(error);\n                    });\n                });\n            }\n            if (typeof oldOnError === 'function') {\n                oldOnError.call(_this._Vue, error, vm, info);\n            }\n            if (_this._logErrors) {\n                _this._Vue.util.warn(\"Error in \" + info + \": \\\"\" + error.toString() + \"\\\"\", vm);\n                // tslint:disable-next-line:no-console\n                console.error(error);\n            }\n        };\n    };\n    /**\n     * @inheritDoc\n     */\n    Vue.id = 'Vue';\n    return Vue;\n}());\nexport { Vue };\n//# sourceMappingURL=vue.js.map","import * as tslib_1 from \"tslib\";\nimport { getCurrentHub } from '@sentry/hub';\n/**\n * This calls a function on the current hub.\n * @param method function to call on hub.\n * @param args to pass to function.\n */\nfunction callOnHub(method) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        args[_i - 1] = arguments[_i];\n    }\n    var hub = getCurrentHub();\n    if (hub && hub[method]) {\n        // tslint:disable-next-line:no-unsafe-any\n        return hub[method].apply(hub, tslib_1.__spread(args));\n    }\n    throw new Error(\"No hub defined or \" + method + \" was not found on the hub, please open a bug report.\");\n}\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception An exception-like object.\n * @returns The generated eventId.\n */\nexport function captureException(exception) {\n    var syntheticException;\n    try {\n        throw new Error('Sentry syntheticException');\n    }\n    catch (exception) {\n        syntheticException = exception;\n    }\n    return callOnHub('captureException', exception, {\n        originalException: exception,\n        syntheticException: syntheticException,\n    });\n}\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param level Define the level of the message.\n * @returns The generated eventId.\n */\nexport function captureMessage(message, level) {\n    var syntheticException;\n    try {\n        throw new Error(message);\n    }\n    catch (exception) {\n        syntheticException = exception;\n    }\n    return callOnHub('captureMessage', message, level, {\n        originalException: message,\n        syntheticException: syntheticException,\n    });\n}\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @returns The generated eventId.\n */\nexport function captureEvent(event) {\n    return callOnHub('captureEvent', event);\n}\n/**\n * Callback to set context information onto the scope.\n * @param callback Callback function that receives Scope.\n */\nexport function configureScope(callback) {\n    callOnHub('configureScope', callback);\n}\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n *\n * @param breadcrumb The breadcrumb to record.\n */\nexport function addBreadcrumb(breadcrumb) {\n    callOnHub('addBreadcrumb', breadcrumb);\n}\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normailzed.\n */\nexport function setContext(name, context) {\n    callOnHub('setContext', name, context);\n}\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nexport function setExtras(extras) {\n    callOnHub('setExtras', extras);\n}\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nexport function setTags(tags) {\n    callOnHub('setTags', tags);\n}\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normailzed.\n */\nexport function setExtra(key, extra) {\n    callOnHub('setExtra', key, extra);\n}\n/**\n * Set key:value that will be sent as tags data with the event.\n * @param key String key of tag\n * @param value String value of tag\n */\nexport function setTag(key, value) {\n    callOnHub('setTag', key, value);\n}\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nexport function setUser(user) {\n    callOnHub('setUser', user);\n}\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n *\n * This is essentially a convenience function for:\n *\n *     pushScope();\n *     callback();\n *     popScope();\n *\n * @param callback that will be enclosed into push/popScope.\n */\nexport function withScope(callback) {\n    callOnHub('withScope', callback);\n}\n/**\n * Calls a function on the latest client. Use this with caution, it's meant as\n * in \"internal\" helper so we don't need to expose every possible function in\n * the shim. It is not guaranteed that the client actually implements the\n * function.\n *\n * @param method The method to call on the client/client.\n * @param args Arguments to pass to the client/fontend.\n * @hidden\n */\nexport function _callOnClient(method) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        args[_i - 1] = arguments[_i];\n    }\n    callOnHub.apply(void 0, tslib_1.__spread(['_invokeClient', method], args));\n}\n//# sourceMappingURL=index.js.map","export { LogLevel } from './loglevel';\nexport { Severity } from './severity';\nexport { SpanStatus } from './span';\nexport { Status } from './status';\n//# sourceMappingURL=index.js.map","/** Console logging verbosity for the SDK. */\nexport var LogLevel;\n(function (LogLevel) {\n    /** No logs will be generated. */\n    LogLevel[LogLevel[\"None\"] = 0] = \"None\";\n    /** Only SDK internal errors will be logged. */\n    LogLevel[LogLevel[\"Error\"] = 1] = \"Error\";\n    /** Information useful for debugging the SDK will be logged. */\n    LogLevel[LogLevel[\"Debug\"] = 2] = \"Debug\";\n    /** All SDK actions will be logged. */\n    LogLevel[LogLevel[\"Verbose\"] = 3] = \"Verbose\";\n})(LogLevel || (LogLevel = {}));\n//# sourceMappingURL=loglevel.js.map","/** JSDoc */\nexport var Severity;\n(function (Severity) {\n    /** JSDoc */\n    Severity[\"Fatal\"] = \"fatal\";\n    /** JSDoc */\n    Severity[\"Error\"] = \"error\";\n    /** JSDoc */\n    Severity[\"Warning\"] = \"warning\";\n    /** JSDoc */\n    Severity[\"Log\"] = \"log\";\n    /** JSDoc */\n    Severity[\"Info\"] = \"info\";\n    /** JSDoc */\n    Severity[\"Debug\"] = \"debug\";\n    /** JSDoc */\n    Severity[\"Critical\"] = \"critical\";\n})(Severity || (Severity = {}));\n// tslint:disable:completed-docs\n// tslint:disable:no-unnecessary-qualifier no-namespace\n(function (Severity) {\n    /**\n     * Converts a string-based level into a {@link Severity}.\n     *\n     * @param level string representation of Severity\n     * @returns Severity\n     */\n    function fromString(level) {\n        switch (level) {\n            case 'debug':\n                return Severity.Debug;\n            case 'info':\n                return Severity.Info;\n            case 'warn':\n            case 'warning':\n                return Severity.Warning;\n            case 'error':\n                return Severity.Error;\n            case 'fatal':\n                return Severity.Fatal;\n            case 'critical':\n                return Severity.Critical;\n            case 'log':\n            default:\n                return Severity.Log;\n        }\n    }\n    Severity.fromString = fromString;\n})(Severity || (Severity = {}));\n//# sourceMappingURL=severity.js.map","/** The status of an Span. */\nexport var SpanStatus;\n(function (SpanStatus) {\n    /** The operation completed successfully. */\n    SpanStatus[\"Ok\"] = \"ok\";\n    /** Deadline expired before operation could complete. */\n    SpanStatus[\"DealineExceeded\"] = \"deadline_exceeded\";\n    /** 401 Unauthorized (actually does mean unauthenticated according to RFC 7235) */\n    SpanStatus[\"Unauthenticated\"] = \"unauthenticated\";\n    /** 403 Forbidden */\n    SpanStatus[\"PermissionDenied\"] = \"permission_denied\";\n    /** 404 Not Found. Some requested entity (file or directory) was not found. */\n    SpanStatus[\"NotFound\"] = \"not_found\";\n    /** 429 Too Many Requests */\n    SpanStatus[\"ResourceExhausted\"] = \"resource_exhausted\";\n    /** Client specified an invalid argument. 4xx. */\n    SpanStatus[\"InvalidArgument\"] = \"invalid_argument\";\n    /** 501 Not Implemented */\n    SpanStatus[\"Unimplemented\"] = \"unimplemented\";\n    /** 503 Service Unavailable */\n    SpanStatus[\"Unavailable\"] = \"unavailable\";\n    /** Other/generic 5xx. */\n    SpanStatus[\"InternalError\"] = \"internal_error\";\n    /** Unknown. Any non-standard HTTP status code. */\n    SpanStatus[\"UnknownError\"] = \"unknown_error\";\n    /** The operation was cancelled (typically by the user). */\n    SpanStatus[\"Cancelled\"] = \"cancelled\";\n    /** Already exists (409) */\n    SpanStatus[\"AlreadyExists\"] = \"already_exists\";\n    /** Operation was rejected because the system is not in a state required for the operation's */\n    SpanStatus[\"FailedPrecondition\"] = \"failed_precondition\";\n    /** The operation was aborted, typically due to a concurrency issue. */\n    SpanStatus[\"Aborted\"] = \"aborted\";\n    /** Operation was attempted past the valid range. */\n    SpanStatus[\"OutOfRange\"] = \"out_of_range\";\n    /** Unrecoverable data loss or corruption */\n    SpanStatus[\"DataLoss\"] = \"data_loss\";\n})(SpanStatus || (SpanStatus = {}));\n// tslint:disable:no-unnecessary-qualifier no-namespace\n(function (SpanStatus) {\n    /**\n     * Converts a HTTP status code into a {@link SpanStatus}.\n     *\n     * @param httpStatus The HTTP response status code.\n     * @returns The span status or {@link SpanStatus.UnknownError}.\n     */\n    // tslint:disable-next-line:completed-docs\n    function fromHttpCode(httpStatus) {\n        if (httpStatus < 400) {\n            return SpanStatus.Ok;\n        }\n        if (httpStatus >= 400 && httpStatus < 500) {\n            switch (httpStatus) {\n                case 401:\n                    return SpanStatus.Unauthenticated;\n                case 403:\n                    return SpanStatus.PermissionDenied;\n                case 404:\n                    return SpanStatus.NotFound;\n                case 409:\n                    return SpanStatus.AlreadyExists;\n                case 413:\n                    return SpanStatus.FailedPrecondition;\n                case 429:\n                    return SpanStatus.ResourceExhausted;\n                default:\n                    return SpanStatus.InvalidArgument;\n            }\n        }\n        if (httpStatus >= 500 && httpStatus < 600) {\n            switch (httpStatus) {\n                case 501:\n                    return SpanStatus.Unimplemented;\n                case 503:\n                    return SpanStatus.Unavailable;\n                case 504:\n                    return SpanStatus.DealineExceeded;\n                default:\n                    return SpanStatus.InternalError;\n            }\n        }\n        return SpanStatus.UnknownError;\n    }\n    SpanStatus.fromHttpCode = fromHttpCode;\n})(SpanStatus || (SpanStatus = {}));\n//# sourceMappingURL=span.js.map","/** The status of an event. */\nexport var Status;\n(function (Status) {\n    /** The status could not be determined. */\n    Status[\"Unknown\"] = \"unknown\";\n    /** The event was skipped due to configuration or callbacks. */\n    Status[\"Skipped\"] = \"skipped\";\n    /** The event was sent to Sentry successfully. */\n    Status[\"Success\"] = \"success\";\n    /** The client is currently rate limited and will try again later. */\n    Status[\"RateLimit\"] = \"rate_limit\";\n    /** The event could not be processed. */\n    Status[\"Invalid\"] = \"invalid\";\n    /** A server-side error ocurred during submission. */\n    Status[\"Failed\"] = \"failed\";\n})(Status || (Status = {}));\n// tslint:disable:completed-docs\n// tslint:disable:no-unnecessary-qualifier no-namespace\n(function (Status) {\n    /**\n     * Converts a HTTP status code into a {@link Status}.\n     *\n     * @param code The HTTP response status code.\n     * @returns The send status or {@link Status.Unknown}.\n     */\n    function fromHttpCode(code) {\n        if (code >= 200 && code < 300) {\n            return Status.Success;\n        }\n        if (code === 429) {\n            return Status.RateLimit;\n        }\n        if (code >= 400 && code < 500) {\n            return Status.Invalid;\n        }\n        if (code >= 500) {\n            return Status.Failed;\n        }\n        return Status.Unknown;\n    }\n    Status.fromHttpCode = fromHttpCode;\n})(Status || (Status = {}));\n//# sourceMappingURL=status.js.map","/**\n * Consumes the promise and logs the error when it rejects.\n * @param promise A promise to forget.\n */\nexport function forget(promise) {\n    promise.then(null, function (e) {\n        // TODO: Use a better logging mechanism\n        console.error(e);\n    });\n}\n//# sourceMappingURL=async.js.map","import * as tslib_1 from \"tslib\";\nimport { SentryError } from './error';\n/** Regular expression used to parse a Dsn. */\nvar DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+))?@)([\\w\\.-]+)(?::(\\d+))?\\/(.+)/;\n/** Error message */\nvar ERROR_MESSAGE = 'Invalid Dsn';\n/** The Sentry Dsn, identifying a Sentry instance and project. */\nvar Dsn = /** @class */ (function () {\n    /** Creates a new Dsn component */\n    function Dsn(from) {\n        if (typeof from === 'string') {\n            this._fromString(from);\n        }\n        else {\n            this._fromComponents(from);\n        }\n        this._validate();\n    }\n    /**\n     * Renders the string representation of this Dsn.\n     *\n     * By default, this will render the public representation without the password\n     * component. To get the deprecated private _representation, set `withPassword`\n     * to true.\n     *\n     * @param withPassword When set to true, the password will be included.\n     */\n    Dsn.prototype.toString = function (withPassword) {\n        if (withPassword === void 0) { withPassword = false; }\n        // tslint:disable-next-line:no-this-assignment\n        var _a = this, host = _a.host, path = _a.path, pass = _a.pass, port = _a.port, projectId = _a.projectId, protocol = _a.protocol, user = _a.user;\n        return (protocol + \"://\" + user + (withPassword && pass ? \":\" + pass : '') +\n            (\"@\" + host + (port ? \":\" + port : '') + \"/\" + (path ? path + \"/\" : path) + projectId));\n    };\n    /** Parses a string into this Dsn. */\n    Dsn.prototype._fromString = function (str) {\n        var match = DSN_REGEX.exec(str);\n        if (!match) {\n            throw new SentryError(ERROR_MESSAGE);\n        }\n        var _a = tslib_1.__read(match.slice(1), 6), protocol = _a[0], user = _a[1], _b = _a[2], pass = _b === void 0 ? '' : _b, host = _a[3], _c = _a[4], port = _c === void 0 ? '' : _c, lastPath = _a[5];\n        var path = '';\n        var projectId = lastPath;\n        var split = projectId.split('/');\n        if (split.length > 1) {\n            path = split.slice(0, -1).join('/');\n            projectId = split.pop();\n        }\n        this._fromComponents({ host: host, pass: pass, path: path, projectId: projectId, port: port, protocol: protocol, user: user });\n    };\n    /** Maps Dsn components into this instance. */\n    Dsn.prototype._fromComponents = function (components) {\n        this.protocol = components.protocol;\n        this.user = components.user;\n        this.pass = components.pass || '';\n        this.host = components.host;\n        this.port = components.port || '';\n        this.path = components.path || '';\n        this.projectId = components.projectId;\n    };\n    /** Validates this Dsn and throws on error. */\n    Dsn.prototype._validate = function () {\n        var _this = this;\n        ['protocol', 'user', 'host', 'projectId'].forEach(function (component) {\n            if (!_this[component]) {\n                throw new SentryError(ERROR_MESSAGE);\n            }\n        });\n        if (this.protocol !== 'http' && this.protocol !== 'https') {\n            throw new SentryError(ERROR_MESSAGE);\n        }\n        if (this.port && isNaN(parseInt(this.port, 10))) {\n            throw new SentryError(ERROR_MESSAGE);\n        }\n    };\n    return Dsn;\n}());\nexport { Dsn };\n//# sourceMappingURL=dsn.js.map","import * as tslib_1 from \"tslib\";\nimport { setPrototypeOf } from './polyfill';\n/** An error emitted by Sentry SDKs and related utilities. */\nvar SentryError = /** @class */ (function (_super) {\n    tslib_1.__extends(SentryError, _super);\n    function SentryError(message) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, message) || this;\n        _this.message = message;\n        // tslint:disable:no-unsafe-any\n        _this.name = _newTarget.prototype.constructor.name;\n        setPrototypeOf(_this, _newTarget.prototype);\n        return _this;\n    }\n    return SentryError;\n}(Error));\nexport { SentryError };\n//# sourceMappingURL=error.js.map","export * from './async';\nexport * from './error';\nexport * from './is';\nexport * from './logger';\nexport * from './memo';\nexport * from './misc';\nexport * from './object';\nexport * from './path';\nexport * from './promisebuffer';\nexport * from './string';\nexport * from './supports';\nexport * from './syncpromise';\nexport * from './instrument';\nexport * from './dsn';\n//# sourceMappingURL=index.js.map","/* tslint:disable:only-arrow-functions no-unsafe-any */\nimport * as tslib_1 from \"tslib\";\nimport { isInstanceOf, isString } from './is';\nimport { logger } from './logger';\nimport { getFunctionName, getGlobalObject } from './misc';\nimport { fill } from './object';\nimport { supportsHistory, supportsNativeFetch } from './supports';\nvar global = getGlobalObject();\n/**\n * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.\n *  - Console API\n *  - Fetch API\n *  - XHR API\n *  - History API\n *  - DOM API (click/typing)\n */\nvar handlers = {};\nvar instrumented = {};\n/** Instruments given API */\nfunction instrument(type) {\n    if (instrumented[type]) {\n        return;\n    }\n    instrumented[type] = true;\n    switch (type) {\n        case 'console':\n            instrumentConsole();\n            break;\n        case 'dom':\n            instrumentDOM();\n            break;\n        case 'xhr':\n            instrumentXHR();\n            break;\n        case 'fetch':\n            instrumentFetch();\n            break;\n        case 'history':\n            instrumentHistory();\n            break;\n        default:\n            logger.warn('unknown instrumentation type:', type);\n    }\n}\n/**\n * Add handler that will be called when given type of instrumentation triggers.\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addInstrumentationHandler(handler) {\n    // tslint:disable-next-line:strict-type-predicates\n    if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') {\n        return;\n    }\n    handlers[handler.type] = handlers[handler.type] || [];\n    handlers[handler.type].push(handler.callback);\n    instrument(handler.type);\n}\n/** JSDoc */\nfunction triggerHandlers(type, data) {\n    var e_1, _a;\n    if (!type || !handlers[type]) {\n        return;\n    }\n    try {\n        for (var _b = tslib_1.__values(handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) {\n            var handler = _c.value;\n            try {\n                handler(data);\n            }\n            catch (e) {\n                logger.error(\"Error while triggering instrumentation handler.\\nType: \" + type + \"\\nName: \" + getFunctionName(handler) + \"\\nError: \" + e);\n            }\n        }\n    }\n    catch (e_1_1) { e_1 = { error: e_1_1 }; }\n    finally {\n        try {\n            if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n        }\n        finally { if (e_1) throw e_1.error; }\n    }\n}\n/** JSDoc */\nfunction instrumentConsole() {\n    if (!('console' in global)) {\n        return;\n    }\n    ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) {\n        if (!(level in global.console)) {\n            return;\n        }\n        fill(global.console, level, function (originalConsoleLevel) {\n            return function () {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    args[_i] = arguments[_i];\n                }\n                triggerHandlers('console', { args: args, level: level });\n                // this fails for some browsers. :(\n                if (originalConsoleLevel) {\n                    Function.prototype.apply.call(originalConsoleLevel, global.console, args);\n                }\n            };\n        });\n    });\n}\n/** JSDoc */\nfunction instrumentFetch() {\n    if (!supportsNativeFetch()) {\n        return;\n    }\n    fill(global, 'fetch', function (originalFetch) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            var commonHandlerData = {\n                args: args,\n                fetchData: {\n                    method: getFetchMethod(args),\n                    url: getFetchUrl(args),\n                },\n                startTimestamp: Date.now(),\n            };\n            triggerHandlers('fetch', tslib_1.__assign({}, commonHandlerData));\n            return originalFetch.apply(global, args).then(function (response) {\n                triggerHandlers('fetch', tslib_1.__assign({}, commonHandlerData, { endTimestamp: Date.now(), response: response }));\n                return response;\n            }, function (error) {\n                triggerHandlers('fetch', tslib_1.__assign({}, commonHandlerData, { endTimestamp: Date.now(), error: error }));\n                throw error;\n            });\n        };\n    });\n}\n/** Extract `method` from fetch call arguments */\nfunction getFetchMethod(fetchArgs) {\n    if (fetchArgs === void 0) { fetchArgs = []; }\n    if ('Request' in global && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) {\n        return String(fetchArgs[0].method).toUpperCase();\n    }\n    if (fetchArgs[1] && fetchArgs[1].method) {\n        return String(fetchArgs[1].method).toUpperCase();\n    }\n    return 'GET';\n}\n/** Extract `url` from fetch call arguments */\nfunction getFetchUrl(fetchArgs) {\n    if (fetchArgs === void 0) { fetchArgs = []; }\n    if (typeof fetchArgs[0] === 'string') {\n        return fetchArgs[0];\n    }\n    if ('Request' in global && isInstanceOf(fetchArgs[0], Request)) {\n        return fetchArgs[0].url;\n    }\n    return String(fetchArgs[0]);\n}\n/** JSDoc */\nfunction instrumentXHR() {\n    if (!('XMLHttpRequest' in global)) {\n        return;\n    }\n    var xhrproto = XMLHttpRequest.prototype;\n    fill(xhrproto, 'open', function (originalOpen) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            var url = args[1];\n            this.__sentry_xhr__ = {\n                method: isString(args[0]) ? args[0].toUpperCase() : args[0],\n                url: args[1],\n            };\n            // if Sentry key appears in URL, don't capture it as a request\n            if (isString(url) && this.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) {\n                this.__sentry_own_request__ = true;\n            }\n            return originalOpen.apply(this, args);\n        };\n    });\n    fill(xhrproto, 'send', function (originalSend) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            var xhr = this; // tslint:disable-line:no-this-assignment\n            var commonHandlerData = {\n                args: args,\n                startTimestamp: Date.now(),\n                xhr: xhr,\n            };\n            triggerHandlers('xhr', tslib_1.__assign({}, commonHandlerData));\n            /**\n             * @hidden\n             */\n            function onreadystatechangeHandler() {\n                if (xhr.readyState === 4) {\n                    try {\n                        // touching statusCode in some platforms throws\n                        // an exception\n                        if (xhr.__sentry_xhr__) {\n                            xhr.__sentry_xhr__.status_code = xhr.status;\n                        }\n                    }\n                    catch (e) {\n                        /* do nothing */\n                    }\n                    triggerHandlers('xhr', tslib_1.__assign({}, commonHandlerData, { endTimestamp: Date.now() }));\n                }\n            }\n            if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') {\n                fill(xhr, 'onreadystatechange', function (original) {\n                    return function () {\n                        var readyStateArgs = [];\n                        for (var _i = 0; _i < arguments.length; _i++) {\n                            readyStateArgs[_i] = arguments[_i];\n                        }\n                        onreadystatechangeHandler();\n                        return original.apply(xhr, readyStateArgs);\n                    };\n                });\n            }\n            else {\n                // if onreadystatechange wasn't actually set by the page on this xhr, we\n                // are free to set our own and capture the breadcrumb\n                xhr.onreadystatechange = onreadystatechangeHandler;\n            }\n            return originalSend.apply(this, args);\n        };\n    });\n}\nvar lastHref;\n/** JSDoc */\nfunction instrumentHistory() {\n    if (!supportsHistory()) {\n        return;\n    }\n    var oldOnPopState = global.onpopstate;\n    global.onpopstate = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var to = global.location.href;\n        // keep track of the current URL state, as we always receive only the updated state\n        var from = lastHref;\n        lastHref = to;\n        triggerHandlers('history', {\n            from: from,\n            to: to,\n        });\n        if (oldOnPopState) {\n            return oldOnPopState.apply(this, args);\n        }\n    };\n    /** @hidden */\n    function historyReplacementFunction(originalHistoryFunction) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            var url = args.length > 2 ? args[2] : undefined;\n            if (url) {\n                // coerce to string (this is what pushState does)\n                var from = lastHref;\n                var to = String(url);\n                // keep track of the current URL state, as we always receive only the updated state\n                lastHref = to;\n                triggerHandlers('history', {\n                    from: from,\n                    to: to,\n                });\n            }\n            return originalHistoryFunction.apply(this, args);\n        };\n    }\n    fill(global.history, 'pushState', historyReplacementFunction);\n    fill(global.history, 'replaceState', historyReplacementFunction);\n}\n/** JSDoc */\nfunction instrumentDOM() {\n    if (!('document' in global)) {\n        return;\n    }\n    // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n    // to the document. Do this before we instrument addEventListener.\n    global.document.addEventListener('click', domEventHandler('click', triggerHandlers.bind(null, 'dom')), false);\n    global.document.addEventListener('keypress', keypressEventHandler(triggerHandlers.bind(null, 'dom')), false);\n    // After hooking into document bubbled up click and keypresses events, we also hook into user handled click & keypresses.\n    ['EventTarget', 'Node'].forEach(function (target) {\n        var proto = global[target] && global[target].prototype;\n        if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n            return;\n        }\n        fill(proto, 'addEventListener', function (original) {\n            return function (eventName, fn, options) {\n                if (fn && fn.handleEvent) {\n                    if (eventName === 'click') {\n                        fill(fn, 'handleEvent', function (innerOriginal) {\n                            return function (event) {\n                                domEventHandler('click', triggerHandlers.bind(null, 'dom'))(event);\n                                return innerOriginal.call(this, event);\n                            };\n                        });\n                    }\n                    if (eventName === 'keypress') {\n                        fill(fn, 'handleEvent', function (innerOriginal) {\n                            return function (event) {\n                                keypressEventHandler(triggerHandlers.bind(null, 'dom'))(event);\n                                return innerOriginal.call(this, event);\n                            };\n                        });\n                    }\n                }\n                else {\n                    if (eventName === 'click') {\n                        domEventHandler('click', triggerHandlers.bind(null, 'dom'), true)(this);\n                    }\n                    if (eventName === 'keypress') {\n                        keypressEventHandler(triggerHandlers.bind(null, 'dom'))(this);\n                    }\n                }\n                return original.call(this, eventName, fn, options);\n            };\n        });\n        fill(proto, 'removeEventListener', function (original) {\n            return function (eventName, fn, options) {\n                var callback = fn;\n                try {\n                    callback = callback && (callback.__sentry_wrapped__ || callback);\n                }\n                catch (e) {\n                    // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n                }\n                return original.call(this, eventName, callback, options);\n            };\n        });\n    });\n}\nvar debounceDuration = 1000;\nvar debounceTimer = 0;\nvar keypressTimeout;\nvar lastCapturedEvent;\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param name the event name (e.g. \"click\")\n * @param handler function that will be triggered\n * @param debounce decides whether it should wait till another event loop\n * @returns wrapped breadcrumb events handler\n * @hidden\n */\nfunction domEventHandler(name, handler, debounce) {\n    if (debounce === void 0) { debounce = false; }\n    return function (event) {\n        // reset keypress timeout; e.g. triggering a 'click' after\n        // a 'keypress' will reset the keypress debounce so that a new\n        // set of keypresses can be recorded\n        keypressTimeout = undefined;\n        // It's possible this handler might trigger multiple times for the same\n        // event (e.g. event propagation through node ancestors). Ignore if we've\n        // already captured the event.\n        if (!event || lastCapturedEvent === event) {\n            return;\n        }\n        lastCapturedEvent = event;\n        if (debounceTimer) {\n            clearTimeout(debounceTimer);\n        }\n        if (debounce) {\n            debounceTimer = setTimeout(function () {\n                handler({ event: event, name: name });\n            });\n        }\n        else {\n            handler({ event: event, name: name });\n        }\n    };\n}\n/**\n * Wraps addEventListener to capture keypress UI events\n * @param handler function that will be triggered\n * @returns wrapped keypress events handler\n * @hidden\n */\nfunction keypressEventHandler(handler) {\n    // TODO: if somehow user switches keypress target before\n    //       debounce timeout is triggered, we will only capture\n    //       a single breadcrumb from the FIRST target (acceptable?)\n    return function (event) {\n        var target;\n        try {\n            target = event.target;\n        }\n        catch (e) {\n            // just accessing event properties can throw an exception in some rare circumstances\n            // see: https://github.com/getsentry/raven-js/issues/838\n            return;\n        }\n        var tagName = target && target.tagName;\n        // only consider keypress events on actual input elements\n        // this will disregard keypresses targeting body (e.g. tabbing\n        // through elements, hotkeys, etc)\n        if (!tagName || (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)) {\n            return;\n        }\n        // record first keypress in a series, but ignore subsequent\n        // keypresses until debounce clears\n        if (!keypressTimeout) {\n            domEventHandler('input', handler)(event);\n        }\n        clearTimeout(keypressTimeout);\n        keypressTimeout = setTimeout(function () {\n            keypressTimeout = undefined;\n        }, debounceDuration);\n    };\n}\n//# sourceMappingURL=instrument.js.map","/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isError(wat) {\n    switch (Object.prototype.toString.call(wat)) {\n        case '[object Error]':\n            return true;\n        case '[object Exception]':\n            return true;\n        case '[object DOMException]':\n            return true;\n        default:\n            return isInstanceOf(wat, Error);\n    }\n}\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isErrorEvent(wat) {\n    return Object.prototype.toString.call(wat) === '[object ErrorEvent]';\n}\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMError(wat) {\n    return Object.prototype.toString.call(wat) === '[object DOMError]';\n}\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMException(wat) {\n    return Object.prototype.toString.call(wat) === '[object DOMException]';\n}\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isString(wat) {\n    return Object.prototype.toString.call(wat) === '[object String]';\n}\n/**\n * Checks whether given value's is a primitive (undefined, null, number, boolean, string)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPrimitive(wat) {\n    return wat === null || (typeof wat !== 'object' && typeof wat !== 'function');\n}\n/**\n * Checks whether given value's type is an object literal\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPlainObject(wat) {\n    return Object.prototype.toString.call(wat) === '[object Object]';\n}\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isEvent(wat) {\n    // tslint:disable-next-line:strict-type-predicates\n    return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n}\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isElement(wat) {\n    // tslint:disable-next-line:strict-type-predicates\n    return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n}\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isRegExp(wat) {\n    return Object.prototype.toString.call(wat) === '[object RegExp]';\n}\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\nexport function isThenable(wat) {\n    // tslint:disable:no-unsafe-any\n    return Boolean(wat && wat.then && typeof wat.then === 'function');\n    // tslint:enable:no-unsafe-any\n}\n/**\n * Checks whether given value's type is a SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isSyntheticEvent(wat) {\n    // tslint:disable-next-line:no-unsafe-any\n    return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\nexport function isInstanceOf(wat, base) {\n    try {\n        // tslint:disable-next-line:no-unsafe-any\n        return wat instanceof base;\n    }\n    catch (_e) {\n        return false;\n    }\n}\n//# sourceMappingURL=is.js.map","import { consoleSandbox, getGlobalObject } from './misc';\n// TODO: Implement different loggers for different environments\nvar global = getGlobalObject();\n/** Prefix for logging strings */\nvar PREFIX = 'Sentry Logger ';\n/** JSDoc */\nvar Logger = /** @class */ (function () {\n    /** JSDoc */\n    function Logger() {\n        this._enabled = false;\n    }\n    /** JSDoc */\n    Logger.prototype.disable = function () {\n        this._enabled = false;\n    };\n    /** JSDoc */\n    Logger.prototype.enable = function () {\n        this._enabled = true;\n    };\n    /** JSDoc */\n    Logger.prototype.log = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (!this._enabled) {\n            return;\n        }\n        consoleSandbox(function () {\n            global.console.log(PREFIX + \"[Log]: \" + args.join(' ')); // tslint:disable-line:no-console\n        });\n    };\n    /** JSDoc */\n    Logger.prototype.warn = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (!this._enabled) {\n            return;\n        }\n        consoleSandbox(function () {\n            global.console.warn(PREFIX + \"[Warn]: \" + args.join(' ')); // tslint:disable-line:no-console\n        });\n    };\n    /** JSDoc */\n    Logger.prototype.error = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (!this._enabled) {\n            return;\n        }\n        consoleSandbox(function () {\n            global.console.error(PREFIX + \"[Error]: \" + args.join(' ')); // tslint:disable-line:no-console\n        });\n    };\n    return Logger;\n}());\n// Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used\nglobal.__SENTRY__ = global.__SENTRY__ || {};\nvar logger = global.__SENTRY__.logger || (global.__SENTRY__.logger = new Logger());\nexport { logger };\n//# sourceMappingURL=logger.js.map","// tslint:disable:no-unsafe-any\n/**\n * Memo class used for decycle json objects. Uses WeakSet if available otherwise array.\n */\nvar Memo = /** @class */ (function () {\n    function Memo() {\n        // tslint:disable-next-line\n        this._hasWeakSet = typeof WeakSet === 'function';\n        this._inner = this._hasWeakSet ? new WeakSet() : [];\n    }\n    /**\n     * Sets obj to remember.\n     * @param obj Object to remember\n     */\n    Memo.prototype.memoize = function (obj) {\n        if (this._hasWeakSet) {\n            if (this._inner.has(obj)) {\n                return true;\n            }\n            this._inner.add(obj);\n            return false;\n        }\n        // tslint:disable-next-line:prefer-for-of\n        for (var i = 0; i < this._inner.length; i++) {\n            var value = this._inner[i];\n            if (value === obj) {\n                return true;\n            }\n        }\n        this._inner.push(obj);\n        return false;\n    };\n    /**\n     * Removes object from internal storage.\n     * @param obj Object to forget\n     */\n    Memo.prototype.unmemoize = function (obj) {\n        if (this._hasWeakSet) {\n            this._inner.delete(obj);\n        }\n        else {\n            for (var i = 0; i < this._inner.length; i++) {\n                if (this._inner[i] === obj) {\n                    this._inner.splice(i, 1);\n                    break;\n                }\n            }\n        }\n    };\n    return Memo;\n}());\nexport { Memo };\n//# sourceMappingURL=memo.js.map","import { isString } from './is';\n/**\n * Requires a module which is protected _against bundler minification.\n *\n * @param request The module path to resolve\n */\nexport function dynamicRequire(mod, request) {\n    // tslint:disable-next-line: no-unsafe-any\n    return mod.require(request);\n}\n/**\n * Checks whether we're in the Node.js or Browser environment\n *\n * @returns Answer to given question\n */\nexport function isNodeEnv() {\n    // tslint:disable:strict-type-predicates\n    return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n}\nvar fallbackGlobalObject = {};\n/**\n * Safely get global scope object\n *\n * @returns Global scope object\n */\nexport function getGlobalObject() {\n    return (isNodeEnv()\n        ? global\n        : typeof window !== 'undefined'\n            ? window\n            : typeof self !== 'undefined'\n                ? self\n                : fallbackGlobalObject);\n}\n/**\n * UUID4 generator\n *\n * @returns string Generated UUID4.\n */\nexport function uuid4() {\n    var global = getGlobalObject();\n    var crypto = global.crypto || global.msCrypto;\n    if (!(crypto === void 0) && crypto.getRandomValues) {\n        // Use window.crypto API if available\n        var arr = new Uint16Array(8);\n        crypto.getRandomValues(arr);\n        // set 4 in byte 7\n        // tslint:disable-next-line:no-bitwise\n        arr[3] = (arr[3] & 0xfff) | 0x4000;\n        // set 2 most significant bits of byte 9 to '10'\n        // tslint:disable-next-line:no-bitwise\n        arr[4] = (arr[4] & 0x3fff) | 0x8000;\n        var pad = function (num) {\n            var v = num.toString(16);\n            while (v.length < 4) {\n                v = \"0\" + v;\n            }\n            return v;\n        };\n        return (pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7]));\n    }\n    // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n    return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n        // tslint:disable-next-line:no-bitwise\n        var r = (Math.random() * 16) | 0;\n        // tslint:disable-next-line:no-bitwise\n        var v = c === 'x' ? r : (r & 0x3) | 0x8;\n        return v.toString(16);\n    });\n}\n/**\n * Parses string form of URL into an object\n * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n * // intentionally using regex and not <a/> href parsing trick because React Native and other\n * // environments where DOM might not be available\n * @returns parsed URL object\n */\nexport function parseUrl(url) {\n    if (!url) {\n        return {};\n    }\n    var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n    if (!match) {\n        return {};\n    }\n    // coerce to undefined values to empty string so we don't get 'undefined'\n    var query = match[6] || '';\n    var fragment = match[8] || '';\n    return {\n        host: match[4],\n        path: match[5],\n        protocol: match[2],\n        relative: match[5] + query + fragment,\n    };\n}\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\nexport function getEventDescription(event) {\n    if (event.message) {\n        return event.message;\n    }\n    if (event.exception && event.exception.values && event.exception.values[0]) {\n        var exception = event.exception.values[0];\n        if (exception.type && exception.value) {\n            return exception.type + \": \" + exception.value;\n        }\n        return exception.type || exception.value || event.event_id || '<unknown>';\n    }\n    return event.event_id || '<unknown>';\n}\n/** JSDoc */\nexport function consoleSandbox(callback) {\n    var global = getGlobalObject();\n    var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert'];\n    if (!('console' in global)) {\n        return callback();\n    }\n    var originalConsole = global.console;\n    var wrappedLevels = {};\n    // Restore all wrapped console methods\n    levels.forEach(function (level) {\n        if (level in global.console && originalConsole[level].__sentry_original__) {\n            wrappedLevels[level] = originalConsole[level];\n            originalConsole[level] = originalConsole[level].__sentry_original__;\n        }\n    });\n    // Perform callback manipulations\n    var result = callback();\n    // Revert restoration to wrapped state\n    Object.keys(wrappedLevels).forEach(function (level) {\n        originalConsole[level] = wrappedLevels[level];\n    });\n    return result;\n}\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\nexport function addExceptionTypeValue(event, value, type) {\n    event.exception = event.exception || {};\n    event.exception.values = event.exception.values || [];\n    event.exception.values[0] = event.exception.values[0] || {};\n    event.exception.values[0].value = event.exception.values[0].value || value || '';\n    event.exception.values[0].type = event.exception.values[0].type || type || 'Error';\n}\n/**\n * Adds exception mechanism to a given event.\n * @param event The event to modify.\n * @param mechanism Mechanism of the mechanism.\n * @hidden\n */\nexport function addExceptionMechanism(event, mechanism) {\n    if (mechanism === void 0) { mechanism = {}; }\n    // TODO: Use real type with `keyof Mechanism` thingy and maybe make it better?\n    try {\n        // @ts-ignore\n        // tslint:disable:no-non-null-assertion\n        event.exception.values[0].mechanism = event.exception.values[0].mechanism || {};\n        Object.keys(mechanism).forEach(function (key) {\n            // @ts-ignore\n            event.exception.values[0].mechanism[key] = mechanism[key];\n        });\n    }\n    catch (_oO) {\n        // no-empty\n    }\n}\n/**\n * A safe form of location.href\n */\nexport function getLocationHref() {\n    try {\n        return document.location.href;\n    }\n    catch (oO) {\n        return '';\n    }\n}\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nexport function htmlTreeAsString(elem) {\n    // try/catch both:\n    // - accessing event.target (see getsentry/raven-js#838, #768)\n    // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n    // - can throw an exception in some circumstances.\n    try {\n        var currentElem = elem;\n        var MAX_TRAVERSE_HEIGHT = 5;\n        var MAX_OUTPUT_LEN = 80;\n        var out = [];\n        var height = 0;\n        var len = 0;\n        var separator = ' > ';\n        var sepLength = separator.length;\n        var nextStr = void 0;\n        while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n            nextStr = _htmlElementAsString(currentElem);\n            // bail out if\n            // - nextStr is the 'html' element\n            // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n            //   (ignore this limit if we are on the first iteration)\n            if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)) {\n                break;\n            }\n            out.push(nextStr);\n            len += nextStr.length;\n            currentElem = currentElem.parentNode;\n        }\n        return out.reverse().join(separator);\n    }\n    catch (_oO) {\n        return '<unknown>';\n    }\n}\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(el) {\n    var elem = el;\n    var out = [];\n    var className;\n    var classes;\n    var key;\n    var attr;\n    var i;\n    if (!elem || !elem.tagName) {\n        return '';\n    }\n    out.push(elem.tagName.toLowerCase());\n    if (elem.id) {\n        out.push(\"#\" + elem.id);\n    }\n    className = elem.className;\n    if (className && isString(className)) {\n        classes = className.split(/\\s+/);\n        for (i = 0; i < classes.length; i++) {\n            out.push(\".\" + classes[i]);\n        }\n    }\n    var attrWhitelist = ['type', 'name', 'title', 'alt'];\n    for (i = 0; i < attrWhitelist.length; i++) {\n        key = attrWhitelist[i];\n        attr = elem.getAttribute(key);\n        if (attr) {\n            out.push(\"[\" + key + \"=\\\"\" + attr + \"\\\"]\");\n        }\n    }\n    return out.join('');\n}\n/**\n * Returns a timestamp in seconds with milliseconds precision.\n */\nexport function timestampWithMs() {\n    return new Date().getTime() / 1000;\n}\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nvar SEMVER_REGEXP = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\nexport function parseSemver(input) {\n    var match = input.match(SEMVER_REGEXP) || [];\n    var major = parseInt(match[1], 10);\n    var minor = parseInt(match[2], 10);\n    var patch = parseInt(match[3], 10);\n    return {\n        buildmetadata: match[5],\n        major: isNaN(major) ? undefined : major,\n        minor: isNaN(minor) ? undefined : minor,\n        patch: isNaN(patch) ? undefined : patch,\n        prerelease: match[4],\n    };\n}\nvar defaultRetryAfter = 60 * 1000; // 60 seconds\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param now current unix timestamp\n * @param header string representation of 'Retry-After' header\n */\nexport function parseRetryAfterHeader(now, header) {\n    if (!header) {\n        return defaultRetryAfter;\n    }\n    var headerDelay = parseInt(\"\" + header, 10);\n    if (!isNaN(headerDelay)) {\n        return headerDelay * 1000;\n    }\n    var headerDate = Date.parse(\"\" + header);\n    if (!isNaN(headerDate)) {\n        return headerDate - now;\n    }\n    return defaultRetryAfter;\n}\nvar defaultFunctionName = '<anonymous>';\n/**\n * Safely extract function name from itself\n */\nexport function getFunctionName(fn) {\n    try {\n        if (!fn || typeof fn !== 'function') {\n            return defaultFunctionName;\n        }\n        return fn.name || defaultFunctionName;\n    }\n    catch (e) {\n        // Just accessing custom props in some Selenium environments\n        // can cause a \"Permission denied\" exception (see raven-js#495).\n        return defaultFunctionName;\n    }\n}\n//# sourceMappingURL=misc.js.map","import { isElement, isError, isEvent, isInstanceOf, isPrimitive, isSyntheticEvent } from './is';\nimport { Memo } from './memo';\nimport { getFunctionName, htmlTreeAsString } from './misc';\nimport { truncate } from './string';\n/**\n * Wrap a given object method with a higher-order function\n *\n * @param source An object that contains a method to be wrapped.\n * @param name A name of method to be wrapped.\n * @param replacement A function that should be used to wrap a given method.\n * @returns void\n */\nexport function fill(source, name, replacement) {\n    if (!(name in source)) {\n        return;\n    }\n    var original = source[name];\n    var wrapped = replacement(original);\n    // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n    // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n    // tslint:disable-next-line:strict-type-predicates\n    if (typeof wrapped === 'function') {\n        try {\n            wrapped.prototype = wrapped.prototype || {};\n            Object.defineProperties(wrapped, {\n                __sentry_original__: {\n                    enumerable: false,\n                    value: original,\n                },\n            });\n        }\n        catch (_Oo) {\n            // This can throw if multiple fill happens on a global object like XMLHttpRequest\n            // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n        }\n    }\n    source[name] = wrapped;\n}\n/**\n * Encodes given object into url-friendly format\n *\n * @param object An object that contains serializable values\n * @returns string Encoded\n */\nexport function urlEncode(object) {\n    return Object.keys(object)\n        .map(\n    // tslint:disable-next-line:no-unsafe-any\n    function (key) { return encodeURIComponent(key) + \"=\" + encodeURIComponent(object[key]); })\n        .join('&');\n}\n/**\n * Transforms any object into an object literal with all it's attributes\n * attached to it.\n *\n * @param value Initial source that we have to transform in order to be usable by the serializer\n */\nfunction getWalkSource(value) {\n    if (isError(value)) {\n        var error = value;\n        var err = {\n            message: error.message,\n            name: error.name,\n            stack: error.stack,\n        };\n        for (var i in error) {\n            if (Object.prototype.hasOwnProperty.call(error, i)) {\n                err[i] = error[i];\n            }\n        }\n        return err;\n    }\n    if (isEvent(value)) {\n        var event_1 = value;\n        var source = {};\n        source.type = event_1.type;\n        // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n        try {\n            source.target = isElement(event_1.target)\n                ? htmlTreeAsString(event_1.target)\n                : Object.prototype.toString.call(event_1.target);\n        }\n        catch (_oO) {\n            source.target = '<unknown>';\n        }\n        try {\n            source.currentTarget = isElement(event_1.currentTarget)\n                ? htmlTreeAsString(event_1.currentTarget)\n                : Object.prototype.toString.call(event_1.currentTarget);\n        }\n        catch (_oO) {\n            source.currentTarget = '<unknown>';\n        }\n        // tslint:disable-next-line:strict-type-predicates\n        if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n            source.detail = event_1.detail;\n        }\n        for (var i in event_1) {\n            if (Object.prototype.hasOwnProperty.call(event_1, i)) {\n                source[i] = event_1;\n            }\n        }\n        return source;\n    }\n    return value;\n}\n/** Calculates bytes size of input string */\nfunction utf8Length(value) {\n    // tslint:disable-next-line:no-bitwise\n    return ~-encodeURI(value).split(/%..|./).length;\n}\n/** Calculates bytes size of input object */\nfunction jsonSize(value) {\n    return utf8Length(JSON.stringify(value));\n}\n/** JSDoc */\nexport function normalizeToSize(object, \n// Default Node.js REPL depth\ndepth, \n// 100kB, as 200kB is max payload size, so half sounds reasonable\nmaxSize) {\n    if (depth === void 0) { depth = 3; }\n    if (maxSize === void 0) { maxSize = 100 * 1024; }\n    var serialized = normalize(object, depth);\n    if (jsonSize(serialized) > maxSize) {\n        return normalizeToSize(object, depth - 1, maxSize);\n    }\n    return serialized;\n}\n/** Transforms any input value into a string form, either primitive value or a type of the input */\nfunction serializeValue(value) {\n    var type = Object.prototype.toString.call(value);\n    // Node.js REPL notation\n    if (typeof value === 'string') {\n        return value;\n    }\n    if (type === '[object Object]') {\n        return '[Object]';\n    }\n    if (type === '[object Array]') {\n        return '[Array]';\n    }\n    var normalized = normalizeValue(value);\n    return isPrimitive(normalized) ? normalized : type;\n}\n/**\n * normalizeValue()\n *\n * Takes unserializable input and make it serializable friendly\n *\n * - translates undefined/NaN values to \"[undefined]\"/\"[NaN]\" respectively,\n * - serializes Error objects\n * - filter global objects\n */\n// tslint:disable-next-line:cyclomatic-complexity\nfunction normalizeValue(value, key) {\n    if (key === 'domain' && value && typeof value === 'object' && value._events) {\n        return '[Domain]';\n    }\n    if (key === 'domainEmitter') {\n        return '[DomainEmitter]';\n    }\n    if (typeof global !== 'undefined' && value === global) {\n        return '[Global]';\n    }\n    if (typeof window !== 'undefined' && value === window) {\n        return '[Window]';\n    }\n    if (typeof document !== 'undefined' && value === document) {\n        return '[Document]';\n    }\n    // React's SyntheticEvent thingy\n    if (isSyntheticEvent(value)) {\n        return '[SyntheticEvent]';\n    }\n    // tslint:disable-next-line:no-tautology-expression\n    if (typeof value === 'number' && value !== value) {\n        return '[NaN]';\n    }\n    if (value === void 0) {\n        return '[undefined]';\n    }\n    if (typeof value === 'function') {\n        return \"[Function: \" + getFunctionName(value) + \"]\";\n    }\n    return value;\n}\n/**\n * Walks an object to perform a normalization on it\n *\n * @param key of object that's walked in current iteration\n * @param value object to be walked\n * @param depth Optional number indicating how deep should walking be performed\n * @param memo Optional Memo class handling decycling\n */\nexport function walk(key, value, depth, memo) {\n    if (depth === void 0) { depth = +Infinity; }\n    if (memo === void 0) { memo = new Memo(); }\n    // If we reach the maximum depth, serialize whatever has left\n    if (depth === 0) {\n        return serializeValue(value);\n    }\n    // If value implements `toJSON` method, call it and return early\n    // tslint:disable:no-unsafe-any\n    if (value !== null && value !== undefined && typeof value.toJSON === 'function') {\n        return value.toJSON();\n    }\n    // tslint:enable:no-unsafe-any\n    // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further\n    var normalized = normalizeValue(value, key);\n    if (isPrimitive(normalized)) {\n        return normalized;\n    }\n    // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself\n    var source = getWalkSource(value);\n    // Create an accumulator that will act as a parent for all future itterations of that branch\n    var acc = Array.isArray(value) ? [] : {};\n    // If we already walked that branch, bail out, as it's circular reference\n    if (memo.memoize(value)) {\n        return '[Circular ~]';\n    }\n    // Walk all keys of the source\n    for (var innerKey in source) {\n        // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n        if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {\n            continue;\n        }\n        // Recursively walk through all the child nodes\n        acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);\n    }\n    // Once walked through all the branches, remove the parent from memo storage\n    memo.unmemoize(value);\n    // Return accumulated values\n    return acc;\n}\n/**\n * normalize()\n *\n * - Creates a copy to prevent original input mutation\n * - Skip non-enumerablers\n * - Calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format\n * - Translates known global objects/Classes to a string representations\n * - Takes care of Error objects serialization\n * - Optionally limit depth of final output\n */\nexport function normalize(input, depth) {\n    try {\n        // tslint:disable-next-line:no-unsafe-any\n        return JSON.parse(JSON.stringify(input, function (key, value) { return walk(key, value, depth); }));\n    }\n    catch (_oO) {\n        return '**non-serializable**';\n    }\n}\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nexport function extractExceptionKeysForMessage(exception, maxLength) {\n    if (maxLength === void 0) { maxLength = 40; }\n    // tslint:disable:strict-type-predicates\n    var keys = Object.keys(getWalkSource(exception));\n    keys.sort();\n    if (!keys.length) {\n        return '[object has no keys]';\n    }\n    if (keys[0].length >= maxLength) {\n        return truncate(keys[0], maxLength);\n    }\n    for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n        var serialized = keys.slice(0, includedKeys).join(', ');\n        if (serialized.length > maxLength) {\n            continue;\n        }\n        if (includedKeys === keys.length) {\n            return serialized;\n        }\n        return truncate(serialized, maxLength);\n    }\n    return '';\n}\n//# sourceMappingURL=object.js.map","// Slightly modified (no IE8 support, ES6) and transcribed to TypeScript\n// https://raw.githubusercontent.com/calvinmetcalf/rollup-plugin-node-builtins/master/src/es6/path.js\n/** JSDoc */\nfunction normalizeArray(parts, allowAboveRoot) {\n    // if the path tries to go above the root, `up` ends up > 0\n    var up = 0;\n    for (var i = parts.length - 1; i >= 0; i--) {\n        var last = parts[i];\n        if (last === '.') {\n            parts.splice(i, 1);\n        }\n        else if (last === '..') {\n            parts.splice(i, 1);\n            up++;\n        }\n        else if (up) {\n            parts.splice(i, 1);\n            up--;\n        }\n    }\n    // if the path is allowed to go above the root, restore leading ..s\n    if (allowAboveRoot) {\n        for (; up--; up) {\n            parts.unshift('..');\n        }\n    }\n    return parts;\n}\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\n/** JSDoc */\nfunction splitPath(filename) {\n    var parts = splitPathRe.exec(filename);\n    return parts ? parts.slice(1) : [];\n}\n// path.resolve([from ...], to)\n// posix version\n/** JSDoc */\nexport function resolve() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    var resolvedPath = '';\n    var resolvedAbsolute = false;\n    for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n        var path = i >= 0 ? args[i] : '/';\n        // Skip empty entries\n        if (!path) {\n            continue;\n        }\n        resolvedPath = path + \"/\" + resolvedPath;\n        resolvedAbsolute = path.charAt(0) === '/';\n    }\n    // At this point the path should be resolved to a full absolute path, but\n    // handle relative paths to be safe (might happen when process.cwd() fails)\n    // Normalize the path\n    resolvedPath = normalizeArray(resolvedPath.split('/').filter(function (p) { return !!p; }), !resolvedAbsolute).join('/');\n    return (resolvedAbsolute ? '/' : '') + resolvedPath || '.';\n}\n/** JSDoc */\nfunction trim(arr) {\n    var start = 0;\n    for (; start < arr.length; start++) {\n        if (arr[start] !== '') {\n            break;\n        }\n    }\n    var end = arr.length - 1;\n    for (; end >= 0; end--) {\n        if (arr[end] !== '') {\n            break;\n        }\n    }\n    if (start > end) {\n        return [];\n    }\n    return arr.slice(start, end - start + 1);\n}\n// path.relative(from, to)\n// posix version\n/** JSDoc */\nexport function relative(from, to) {\n    // tslint:disable:no-parameter-reassignment\n    from = resolve(from).substr(1);\n    to = resolve(to).substr(1);\n    var fromParts = trim(from.split('/'));\n    var toParts = trim(to.split('/'));\n    var length = Math.min(fromParts.length, toParts.length);\n    var samePartsLength = length;\n    for (var i = 0; i < length; i++) {\n        if (fromParts[i] !== toParts[i]) {\n            samePartsLength = i;\n            break;\n        }\n    }\n    var outputParts = [];\n    for (var i = samePartsLength; i < fromParts.length; i++) {\n        outputParts.push('..');\n    }\n    outputParts = outputParts.concat(toParts.slice(samePartsLength));\n    return outputParts.join('/');\n}\n// path.normalize(path)\n// posix version\n/** JSDoc */\nexport function normalizePath(path) {\n    var isPathAbsolute = isAbsolute(path);\n    var trailingSlash = path.substr(-1) === '/';\n    // Normalize the path\n    var normalizedPath = normalizeArray(path.split('/').filter(function (p) { return !!p; }), !isPathAbsolute).join('/');\n    if (!normalizedPath && !isPathAbsolute) {\n        normalizedPath = '.';\n    }\n    if (normalizedPath && trailingSlash) {\n        normalizedPath += '/';\n    }\n    return (isPathAbsolute ? '/' : '') + normalizedPath;\n}\n// posix version\n/** JSDoc */\nexport function isAbsolute(path) {\n    return path.charAt(0) === '/';\n}\n// posix version\n/** JSDoc */\nexport function join() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    return normalizePath(args.join('/'));\n}\n/** JSDoc */\nexport function dirname(path) {\n    var result = splitPath(path);\n    var root = result[0];\n    var dir = result[1];\n    if (!root && !dir) {\n        // No dirname whatsoever\n        return '.';\n    }\n    if (dir) {\n        // It has a dirname, strip trailing slash\n        dir = dir.substr(0, dir.length - 1);\n    }\n    return root + dir;\n}\n/** JSDoc */\nexport function basename(path, ext) {\n    var f = splitPath(path)[2];\n    if (ext && f.substr(ext.length * -1) === ext) {\n        f = f.substr(0, f.length - ext.length);\n    }\n    return f;\n}\n//# sourceMappingURL=path.js.map","export var setPrototypeOf = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties); // tslint:disable-line:no-unbound-method\n/**\n * setPrototypeOf polyfill using __proto__\n */\nfunction setProtoOf(obj, proto) {\n    // @ts-ignore\n    obj.__proto__ = proto;\n    return obj;\n}\n/**\n * setPrototypeOf polyfill using mixin\n */\nfunction mixinProperties(obj, proto) {\n    for (var prop in proto) {\n        if (!obj.hasOwnProperty(prop)) {\n            // @ts-ignore\n            obj[prop] = proto[prop];\n        }\n    }\n    return obj;\n}\n//# sourceMappingURL=polyfill.js.map","import { SentryError } from './error';\nimport { SyncPromise } from './syncpromise';\n/** A simple queue that holds promises. */\nvar PromiseBuffer = /** @class */ (function () {\n    function PromiseBuffer(_limit) {\n        this._limit = _limit;\n        /** Internal set of queued Promises */\n        this._buffer = [];\n    }\n    /**\n     * Says if the buffer is ready to take more requests\n     */\n    PromiseBuffer.prototype.isReady = function () {\n        return this._limit === undefined || this.length() < this._limit;\n    };\n    /**\n     * Add a promise to the queue.\n     *\n     * @param task Can be any PromiseLike<T>\n     * @returns The original promise.\n     */\n    PromiseBuffer.prototype.add = function (task) {\n        var _this = this;\n        if (!this.isReady()) {\n            return SyncPromise.reject(new SentryError('Not adding Promise due to buffer limit reached.'));\n        }\n        if (this._buffer.indexOf(task) === -1) {\n            this._buffer.push(task);\n        }\n        task\n            .then(function () { return _this.remove(task); })\n            .then(null, function () {\n            return _this.remove(task).then(null, function () {\n                // We have to add this catch here otherwise we have an unhandledPromiseRejection\n                // because it's a new Promise chain.\n            });\n        });\n        return task;\n    };\n    /**\n     * Remove a promise to the queue.\n     *\n     * @param task Can be any PromiseLike<T>\n     * @returns Removed promise.\n     */\n    PromiseBuffer.prototype.remove = function (task) {\n        var removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0];\n        return removedTask;\n    };\n    /**\n     * This function returns the number of unresolved promises in the queue.\n     */\n    PromiseBuffer.prototype.length = function () {\n        return this._buffer.length;\n    };\n    /**\n     * This will drain the whole queue, returns true if queue is empty or drained.\n     * If timeout is provided and the queue takes longer to drain, the promise still resolves but with false.\n     *\n     * @param timeout Number in ms to wait until it resolves with false.\n     */\n    PromiseBuffer.prototype.drain = function (timeout) {\n        var _this = this;\n        return new SyncPromise(function (resolve) {\n            var capturedSetTimeout = setTimeout(function () {\n                if (timeout && timeout > 0) {\n                    resolve(false);\n                }\n            }, timeout);\n            SyncPromise.all(_this._buffer)\n                .then(function () {\n                clearTimeout(capturedSetTimeout);\n                resolve(true);\n            })\n                .then(null, function () {\n                resolve(true);\n            });\n        });\n    };\n    return PromiseBuffer;\n}());\nexport { PromiseBuffer };\n//# sourceMappingURL=promisebuffer.js.map","import { isRegExp } from './is';\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function truncate(str, max) {\n    if (max === void 0) { max = 0; }\n    // tslint:disable-next-line:strict-type-predicates\n    if (typeof str !== 'string' || max === 0) {\n        return str;\n    }\n    return str.length <= max ? str : str.substr(0, max) + \"...\";\n}\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function snipLine(line, colno) {\n    var newLine = line;\n    var ll = newLine.length;\n    if (ll <= 150) {\n        return newLine;\n    }\n    if (colno > ll) {\n        colno = ll; // tslint:disable-line:no-parameter-reassignment\n    }\n    var start = Math.max(colno - 60, 0);\n    if (start < 5) {\n        start = 0;\n    }\n    var end = Math.min(start + 140, ll);\n    if (end > ll - 5) {\n        end = ll;\n    }\n    if (end === ll) {\n        start = Math.max(end - 140, 0);\n    }\n    newLine = newLine.slice(start, end);\n    if (start > 0) {\n        newLine = \"'{snip} \" + newLine;\n    }\n    if (end < ll) {\n        newLine += ' {snip}';\n    }\n    return newLine;\n}\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns Joined values\n */\nexport function safeJoin(input, delimiter) {\n    if (!Array.isArray(input)) {\n        return '';\n    }\n    var output = [];\n    // tslint:disable-next-line:prefer-for-of\n    for (var i = 0; i < input.length; i++) {\n        var value = input[i];\n        try {\n            output.push(String(value));\n        }\n        catch (e) {\n            output.push('[value cannot be serialized]');\n        }\n    }\n    return output.join(delimiter);\n}\n/**\n * Checks if the value matches a regex or includes the string\n * @param value The string value to be checked against\n * @param pattern Either a regex or a string that must be contained in value\n */\nexport function isMatchingPattern(value, pattern) {\n    if (isRegExp(pattern)) {\n        return pattern.test(value);\n    }\n    if (typeof pattern === 'string') {\n        return value.indexOf(pattern) !== -1;\n    }\n    return false;\n}\n//# sourceMappingURL=string.js.map","import { logger } from './logger';\nimport { getGlobalObject } from './misc';\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent() {\n    try {\n        // tslint:disable:no-unused-expression\n        new ErrorEvent('');\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError() {\n    try {\n        // It really needs 1 argument, not 0.\n        // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n        // 1 argument required, but only 0 present.\n        // @ts-ignore\n        // tslint:disable:no-unused-expression\n        new DOMError('');\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException() {\n    try {\n        // tslint:disable:no-unused-expression\n        new DOMException('');\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsFetch() {\n    if (!('fetch' in getGlobalObject())) {\n        return false;\n    }\n    try {\n        // tslint:disable-next-line:no-unused-expression\n        new Headers();\n        // tslint:disable-next-line:no-unused-expression\n        new Request('');\n        // tslint:disable-next-line:no-unused-expression\n        new Response();\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * isNativeFetch checks if the given function is a native implementation of fetch()\n */\nfunction isNativeFetch(func) {\n    return func && /^function fetch\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch() {\n    if (!supportsFetch()) {\n        return false;\n    }\n    var global = getGlobalObject();\n    // Fast path to avoid DOM I/O\n    // tslint:disable-next-line:no-unbound-method\n    if (isNativeFetch(global.fetch)) {\n        return true;\n    }\n    // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n    // so create a \"pure\" iframe to see if that has native fetch\n    var result = false;\n    var doc = global.document;\n    if (doc) {\n        var sandbox = doc.createElement('iframe');\n        sandbox.hidden = true;\n        try {\n            doc.head.appendChild(sandbox);\n            if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n                // tslint:disable-next-line:no-unbound-method\n                result = isNativeFetch(sandbox.contentWindow.fetch);\n            }\n            doc.head.removeChild(sandbox);\n        }\n        catch (err) {\n            logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n        }\n    }\n    return result;\n}\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver() {\n    // tslint:disable-next-line: no-unsafe-any\n    return 'ReportingObserver' in getGlobalObject();\n}\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReferrerPolicy() {\n    // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n    // https://caniuse.com/#feat=referrer-policy\n    // It doesn't. And it throw exception instead of ignoring this parameter...\n    // REF: https://github.com/getsentry/raven-js/issues/1233\n    if (!supportsFetch()) {\n        return false;\n    }\n    try {\n        // tslint:disable:no-unused-expression\n        new Request('_', {\n            referrerPolicy: 'origin',\n        });\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory() {\n    // NOTE: in Chrome App environment, touching history.pushState, *even inside\n    //       a try/catch block*, will cause Chrome to output an error to console.error\n    // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n    var global = getGlobalObject();\n    var chrome = global.chrome;\n    // tslint:disable-next-line:no-unsafe-any\n    var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n    var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;\n    return !isChromePackagedApp && hasHistoryApi;\n}\n//# sourceMappingURL=supports.js.map","import { isThenable } from './is';\n/** SyncPromise internal states */\nvar States;\n(function (States) {\n    /** Pending */\n    States[\"PENDING\"] = \"PENDING\";\n    /** Resolved / OK */\n    States[\"RESOLVED\"] = \"RESOLVED\";\n    /** Rejected / Error */\n    States[\"REJECTED\"] = \"REJECTED\";\n})(States || (States = {}));\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nvar SyncPromise = /** @class */ (function () {\n    function SyncPromise(executor) {\n        var _this = this;\n        this._state = States.PENDING;\n        this._handlers = [];\n        /** JSDoc */\n        this._resolve = function (value) {\n            _this._setResult(States.RESOLVED, value);\n        };\n        /** JSDoc */\n        this._reject = function (reason) {\n            _this._setResult(States.REJECTED, reason);\n        };\n        /** JSDoc */\n        this._setResult = function (state, value) {\n            if (_this._state !== States.PENDING) {\n                return;\n            }\n            if (isThenable(value)) {\n                value.then(_this._resolve, _this._reject);\n                return;\n            }\n            _this._state = state;\n            _this._value = value;\n            _this._executeHandlers();\n        };\n        // TODO: FIXME\n        /** JSDoc */\n        this._attachHandler = function (handler) {\n            _this._handlers = _this._handlers.concat(handler);\n            _this._executeHandlers();\n        };\n        /** JSDoc */\n        this._executeHandlers = function () {\n            if (_this._state === States.PENDING) {\n                return;\n            }\n            if (_this._state === States.REJECTED) {\n                _this._handlers.forEach(function (handler) {\n                    if (handler.onrejected) {\n                        handler.onrejected(_this._value);\n                    }\n                });\n            }\n            else {\n                _this._handlers.forEach(function (handler) {\n                    if (handler.onfulfilled) {\n                        // tslint:disable-next-line:no-unsafe-any\n                        handler.onfulfilled(_this._value);\n                    }\n                });\n            }\n            _this._handlers = [];\n        };\n        try {\n            executor(this._resolve, this._reject);\n        }\n        catch (e) {\n            this._reject(e);\n        }\n    }\n    /** JSDoc */\n    SyncPromise.prototype.toString = function () {\n        return '[object SyncPromise]';\n    };\n    /** JSDoc */\n    SyncPromise.resolve = function (value) {\n        return new SyncPromise(function (resolve) {\n            resolve(value);\n        });\n    };\n    /** JSDoc */\n    SyncPromise.reject = function (reason) {\n        return new SyncPromise(function (_, reject) {\n            reject(reason);\n        });\n    };\n    /** JSDoc */\n    SyncPromise.all = function (collection) {\n        return new SyncPromise(function (resolve, reject) {\n            if (!Array.isArray(collection)) {\n                reject(new TypeError(\"Promise.all requires an array as input.\"));\n                return;\n            }\n            if (collection.length === 0) {\n                resolve([]);\n                return;\n            }\n            var counter = collection.length;\n            var resolvedCollection = [];\n            collection.forEach(function (item, index) {\n                SyncPromise.resolve(item)\n                    .then(function (value) {\n                    resolvedCollection[index] = value;\n                    counter -= 1;\n                    if (counter !== 0) {\n                        return;\n                    }\n                    resolve(resolvedCollection);\n                })\n                    .then(null, reject);\n            });\n        });\n    };\n    /** JSDoc */\n    SyncPromise.prototype.then = function (onfulfilled, onrejected) {\n        var _this = this;\n        return new SyncPromise(function (resolve, reject) {\n            _this._attachHandler({\n                onfulfilled: function (result) {\n                    if (!onfulfilled) {\n                        // TODO: Â¯\\_(ãƒ„)_/Â¯\n                        // TODO: FIXME\n                        resolve(result);\n                        return;\n                    }\n                    try {\n                        resolve(onfulfilled(result));\n                        return;\n                    }\n                    catch (e) {\n                        reject(e);\n                        return;\n                    }\n                },\n                onrejected: function (reason) {\n                    if (!onrejected) {\n                        reject(reason);\n                        return;\n                    }\n                    try {\n                        resolve(onrejected(reason));\n                        return;\n                    }\n                    catch (e) {\n                        reject(e);\n                        return;\n                    }\n                },\n            });\n        });\n    };\n    /** JSDoc */\n    SyncPromise.prototype.catch = function (onrejected) {\n        return this.then(function (val) { return val; }, onrejected);\n    };\n    /** JSDoc */\n    SyncPromise.prototype.finally = function (onfinally) {\n        var _this = this;\n        return new SyncPromise(function (resolve, reject) {\n            var val;\n            var isRejected;\n            return _this.then(function (value) {\n                isRejected = false;\n                val = value;\n                if (onfinally) {\n                    onfinally();\n                }\n            }, function (reason) {\n                isRejected = true;\n                val = reason;\n                if (onfinally) {\n                    onfinally();\n                }\n            }).then(function () {\n                if (isRejected) {\n                    reject(val);\n                    return;\n                }\n                // tslint:disable-next-line:no-unsafe-any\n                resolve(val);\n            });\n        });\n    };\n    return SyncPromise;\n}());\nexport { SyncPromise };\n//# sourceMappingURL=syncpromise.js.map",";(function(undefined) {\n    'use strict';\n    /**\n     * BottleJS v1.7.1 - 2018-05-03\n     * A powerful dependency injection micro container\n     *\n     * Copyright (c) 2018 Stephen Young\n     * Licensed MIT\n     */\n    var Bottle;\n    \n    /**\n     * String constants\n     */\n    var DELIMITER = '.';\n    var FUNCTION_TYPE = 'function';\n    var STRING_TYPE = 'string';\n    var GLOBAL_NAME = '__global__';\n    var PROVIDER_SUFFIX = 'Provider';\n    \n    /**\n     * Unique id counter;\n     *\n     * @type Number\n     */\n    var id = 0;\n    \n    /**\n     * Local slice alias\n     *\n     * @type Functions\n     */\n    var slice = Array.prototype.slice;\n    \n    /**\n     * Iterator used to walk down a nested object.\n     *\n     * If Bottle.config.strict is true, this method will throw an exception if it encounters an\n     * undefined path\n     *\n     * @param Object obj\n     * @param String prop\n     * @return mixed\n     * @throws Error if Bottle is unable to resolve the requested service.\n     */\n    var getNested = function getNested(obj, prop) {\n        var service = obj[prop];\n        if (service === undefined && Bottle.config.strict) {\n            throw new Error('Bottle was unable to resolve a service.  `' + prop + '` is undefined.');\n        }\n        return service;\n    };\n    \n    /**\n     * Get a nested bottle. Will set and return if not set.\n     *\n     * @param String name\n     * @return Bottle\n     */\n    var getNestedBottle = function getNestedBottle(name) {\n        var bottle;\n        if (!this.nested[name]) {\n            bottle = Bottle.pop();\n            this.nested[name] = bottle;\n            this.factory(name, function SubProviderFactory() {\n                return bottle.container;\n            });\n        }\n        return this.nested[name];\n    };\n    \n    /**\n     * Get a service stored under a nested key\n     *\n     * @param String fullname\n     * @return Service\n     */\n    var getNestedService = function getNestedService(fullname) {\n        return fullname.split(DELIMITER).reduce(getNested, this);\n    };\n    \n    /**\n     * Function used by provider to set up middleware for each request.\n     *\n     * @param Number id\n     * @param String name\n     * @param Object instance\n     * @param Object container\n     * @return void\n     */\n    var applyMiddleware = function applyMiddleware(middleware, name, instance, container) {\n        var descriptor = {\n            configurable : true,\n            enumerable : true\n        };\n        if (middleware.length) {\n            descriptor.get = function getWithMiddlewear() {\n                var index = 0;\n                var next = function nextMiddleware(err) {\n                    if (err) {\n                        throw err;\n                    }\n                    if (middleware[index]) {\n                        middleware[index++](instance, next);\n                    }\n                };\n                next();\n                return instance;\n            };\n        } else {\n            descriptor.value = instance;\n            descriptor.writable = true;\n        }\n    \n        Object.defineProperty(container, name, descriptor);\n    \n        return container[name];\n    };\n    \n    /**\n     * Register middleware.\n     *\n     * @param String name\n     * @param Function func\n     * @return Bottle\n     */\n    var middleware = function middleware(fullname, func) {\n        var parts, name;\n        if (typeof fullname === FUNCTION_TYPE) {\n            func = fullname;\n            fullname = GLOBAL_NAME;\n        }\n    \n        parts = fullname.split(DELIMITER);\n        name = parts.shift();\n        if (parts.length) {\n            getNestedBottle.call(this, name).middleware(parts.join(DELIMITER), func);\n        } else {\n            if (!this.middlewares[name]) {\n                this.middlewares[name] = [];\n            }\n            this.middlewares[name].push(func);\n        }\n        return this;\n    };\n    \n    /**\n     * Used to process decorators in the provider\n     *\n     * @param Object instance\n     * @param Function func\n     * @return Mixed\n     */\n    var reducer = function reducer(instance, func) {\n        return func(instance);\n    };\n    \n    \n    /**\n     * Get decorators and middleware including globals\n     *\n     * @return array\n     */\n    var getWithGlobal = function getWithGlobal(collection, name) {\n        return (collection[name] || []).concat(collection.__global__ || []);\n    };\n    \n    \n    /**\n     * Create the provider properties on the container\n     *\n     * @param String name\n     * @param Function Provider\n     * @return Bottle\n     */\n    var createProvider = function createProvider(name, Provider) {\n        var providerName, properties, container, id, decorators, middlewares;\n    \n        id = this.id;\n        container = this.container;\n        decorators = this.decorators;\n        middlewares = this.middlewares;\n        providerName = name + PROVIDER_SUFFIX;\n    \n        properties = Object.create(null);\n        properties[providerName] = {\n            configurable : true,\n            enumerable : true,\n            get : function getProvider() {\n                var instance = new Provider();\n                delete container[providerName];\n                container[providerName] = instance;\n                return instance;\n            }\n        };\n    \n        properties[name] = {\n            configurable : true,\n            enumerable : true,\n            get : function getService() {\n                var provider = container[providerName];\n                var instance;\n                if (provider) {\n                    // filter through decorators\n                    instance = getWithGlobal(decorators, name).reduce(reducer, provider.$get(container));\n    \n                    delete container[providerName];\n                    delete container[name];\n                }\n                return instance === undefined ? instance : applyMiddleware(getWithGlobal(middlewares, name),\n                    name, instance, container);\n            }\n        };\n    \n        Object.defineProperties(container, properties);\n        return this;\n    };\n    \n    \n    /**\n     * Register a provider.\n     *\n     * @param String fullname\n     * @param Function Provider\n     * @return Bottle\n     */\n    var provider = function provider(fullname, Provider) {\n        var parts, name;\n        parts = fullname.split(DELIMITER);\n        if (this.providerMap[fullname] && parts.length === 1 && !this.container[fullname + PROVIDER_SUFFIX]) {\n            return console.error(fullname + ' provider already instantiated.');\n        }\n        this.originalProviders[fullname] = Provider;\n        this.providerMap[fullname] = true;\n    \n        name = parts.shift();\n    \n        if (parts.length) {\n            getNestedBottle.call(this, name).provider(parts.join(DELIMITER), Provider);\n            return this;\n        }\n        return createProvider.call(this, name, Provider);\n    };\n    \n    /**\n     * Register a factory inside a generic provider.\n     *\n     * @param String name\n     * @param Function Factory\n     * @return Bottle\n     */\n    var factory = function factory(name, Factory) {\n        return provider.call(this, name, function GenericProvider() {\n            this.$get = Factory;\n        });\n    };\n    \n    /**\n     * Private helper for creating service and service factories.\n     *\n     * @param String name\n     * @param Function Service\n     * @return Bottle\n     */\n    var createService = function createService(name, Service, isClass) {\n        var deps = arguments.length > 3 ? slice.call(arguments, 3) : [];\n        var bottle = this;\n        return factory.call(this, name, function GenericFactory() {\n            var serviceFactory = Service; // alias for jshint\n            var args = deps.map(getNestedService, bottle.container);\n    \n            if (!isClass) {\n                return serviceFactory.apply(null, args);\n            }\n            return new (Service.bind.apply(Service, [null].concat(args)))();\n        });\n    };\n    \n    /**\n     * Register a class service\n     *\n     * @param String name\n     * @param Function Service\n     * @return Bottle\n     */\n    var service = function service(name, Service) {\n        return createService.apply(this, [name, Service, true].concat(slice.call(arguments, 2)));\n    };\n    \n    /**\n     * Register a function service\n     */\n    var serviceFactory = function serviceFactory(name, factoryService) {\n        return createService.apply(this, [name, factoryService, false].concat(slice.call(arguments, 2)));\n    };\n    \n    /**\n     * Define a mutable property on the container.\n     *\n     * @param String name\n     * @param mixed val\n     * @return void\n     * @scope container\n     */\n    var defineValue = function defineValue(name, val) {\n        Object.defineProperty(this, name, {\n            configurable : true,\n            enumerable : true,\n            value : val,\n            writable : true\n        });\n    };\n    \n    /**\n     * Iterator for setting a plain object literal via defineValue\n     *\n     * @param Object container\n     * @param string name\n     */\n    var setValueObject = function setValueObject(container, name) {\n        var nestedContainer = container[name];\n        if (!nestedContainer) {\n            nestedContainer = {};\n            defineValue.call(container, name, nestedContainer);\n        }\n        return nestedContainer;\n    };\n    \n    \n    /**\n     * Register a value\n     *\n     * @param String name\n     * @param mixed val\n     * @return Bottle\n     */\n    var value = function value(name, val) {\n        var parts;\n        parts = name.split(DELIMITER);\n        name = parts.pop();\n        defineValue.call(parts.reduce(setValueObject, this.container), name, val);\n        return this;\n    };\n    \n    /**\n     * Define an enumerable, non-configurable, non-writable value.\n     *\n     * @param String name\n     * @param mixed value\n     * @return undefined\n     */\n    var defineConstant = function defineConstant(name, value) {\n        Object.defineProperty(this, name, {\n            configurable : false,\n            enumerable : true,\n            value : value,\n            writable : false\n        });\n    };\n    \n    /**\n     * Register a constant\n     *\n     * @param String name\n     * @param mixed value\n     * @return Bottle\n     */\n    var constant = function constant(name, value) {\n        var parts = name.split(DELIMITER);\n        name = parts.pop();\n        defineConstant.call(parts.reduce(setValueObject, this.container), name, value);\n        return this;\n    };\n    \n    /**\n     * Register decorator.\n     *\n     * @param String fullname\n     * @param Function func\n     * @return Bottle\n     */\n    var decorator = function decorator(fullname, func) {\n        var parts, name;\n        if (typeof fullname === FUNCTION_TYPE) {\n            func = fullname;\n            fullname = GLOBAL_NAME;\n        }\n    \n        parts = fullname.split(DELIMITER);\n        name = parts.shift();\n        if (parts.length) {\n            getNestedBottle.call(this, name).decorator(parts.join(DELIMITER), func);\n        } else {\n            if (!this.decorators[name]) {\n                this.decorators[name] = [];\n            }\n            this.decorators[name].push(func);\n        }\n        return this;\n    };\n    \n    /**\n     * Register a function that will be executed when Bottle#resolve is called.\n     *\n     * @param Function func\n     * @return Bottle\n     */\n    var defer = function defer(func) {\n        this.deferred.push(func);\n        return this;\n    };\n    \n    \n    /**\n     * Immediately instantiates the provided list of services and returns them.\n     *\n     * @param Array services\n     * @return Array Array of instances (in the order they were provided)\n     */\n    var digest = function digest(services) {\n        return (services || []).map(getNestedService, this.container);\n    };\n    \n    /**\n     * Register an instance factory inside a generic factory.\n     *\n     * @param {String} name - The name of the service\n     * @param {Function} Factory - The factory function, matches the signature required for the\n     * `factory` method\n     * @return Bottle\n     */\n    var instanceFactory = function instanceFactory(name, Factory) {\n        return factory.call(this, name, function GenericInstanceFactory(container) {\n            return {\n                instance : Factory.bind(Factory, container)\n            };\n        });\n    };\n    \n    /**\n     * A filter function for removing bottle container methods and providers from a list of keys\n     */\n    var byMethod = function byMethod(name) {\n        return !/^\\$(?:decorator|register|list)$|Provider$/.test(name);\n    };\n    \n    /**\n     * List the services registered on the container.\n     *\n     * @param Object container\n     * @return Array\n     */\n    var list = function list(container) {\n        return Object.keys(container || this.container || {}).filter(byMethod);\n    };\n    \n    /**\n     * Named bottle instances\n     *\n     * @type Object\n     */\n    var bottles = {};\n    \n    /**\n     * Get an instance of bottle.\n     *\n     * If a name is provided the instance will be stored in a local hash.  Calling Bottle.pop multiple\n     * times with the same name will return the same instance.\n     *\n     * @param String name\n     * @return Bottle\n     */\n    var pop = function pop(name) {\n        var instance;\n        if (typeof name === STRING_TYPE) {\n            instance = bottles[name];\n            if (!instance) {\n                bottles[name] = instance = new Bottle();\n                instance.constant('BOTTLE_NAME', name);\n            }\n            return instance;\n        }\n        return new Bottle();\n    };\n    \n    /**\n     * Clear all named bottles.\n     */\n    var clear = function clear(name) {\n        if (typeof name === STRING_TYPE) {\n            delete bottles[name];\n        } else {\n            bottles = {};\n        }\n    };\n    \n    /**\n     * Register a service, factory, provider, or value based on properties on the object.\n     *\n     * properties:\n     *  * Obj.$name   String required ex: `'Thing'`\n     *  * Obj.$type   String optional 'service', 'factory', 'provider', 'value'.  Default: 'service'\n     *  * Obj.$inject Mixed  optional only useful with $type 'service' name or array of names\n     *  * Obj.$value  Mixed  optional Normally Obj is registered on the container.  However, if this\n     *                       property is included, it's value will be registered on the container\n     *                       instead of the object itsself.  Useful for registering objects on the\n     *                       bottle container without modifying those objects with bottle specific keys.\n     *\n     * @param Function Obj\n     * @return Bottle\n     */\n    var register = function register(Obj) {\n        var value = Obj.$value === undefined ? Obj : Obj.$value;\n        return this[Obj.$type || 'service'].apply(this, [Obj.$name, value].concat(Obj.$inject || []));\n    };\n    \n    /**\n     * Deletes providers from the map and container.\n     *\n     * @param String name\n     * @return void\n     */\n    var removeProviderMap = function resetProvider(name) {\n        delete this.providerMap[name];\n        delete this.container[name];\n        delete this.container[name + PROVIDER_SUFFIX];\n    };\n    \n    /**\n     * Resets providers on a bottle instance. If 'names' array is provided, only the named providers will be reset.\n     *\n     * @param Array names\n     * @return void\n     */\n    var resetProviders = function resetProviders(names) {\n        var tempProviders = this.originalProviders;\n        var shouldFilter = Array.isArray(names);\n    \n        Object.keys(this.originalProviders).forEach(function resetProvider(originalProviderName) {\n            if (shouldFilter && names.indexOf(originalProviderName) === -1) {\n                return;\n            }\n            var parts = originalProviderName.split(DELIMITER);\n            if (parts.length > 1) {\n                parts.forEach(removeProviderMap, getNestedBottle.call(this, parts[0]));\n            }\n            removeProviderMap.call(this, originalProviderName);\n            this.provider(originalProviderName, tempProviders[originalProviderName]);\n        }, this);\n    };\n    \n    \n    /**\n     * Execute any deferred functions\n     *\n     * @param Mixed data\n     * @return Bottle\n     */\n    var resolve = function resolve(data) {\n        this.deferred.forEach(function deferredIterator(func) {\n            func(data);\n        });\n    \n        return this;\n    };\n    \n    \n    /**\n     * Bottle constructor\n     *\n     * @param String name Optional name for functional construction\n     */\n    Bottle = function Bottle(name) {\n        if (!(this instanceof Bottle)) {\n            return Bottle.pop(name);\n        }\n    \n        this.id = id++;\n    \n        this.decorators = {};\n        this.middlewares = {};\n        this.nested = {};\n        this.providerMap = {};\n        this.originalProviders = {};\n        this.deferred = [];\n        this.container = {\n            $decorator : decorator.bind(this),\n            $register : register.bind(this),\n            $list : list.bind(this)\n        };\n    };\n    \n    /**\n     * Bottle prototype\n     */\n    Bottle.prototype = {\n        constant : constant,\n        decorator : decorator,\n        defer : defer,\n        digest : digest,\n        factory : factory,\n        instanceFactory: instanceFactory,\n        list : list,\n        middleware : middleware,\n        provider : provider,\n        resetProviders : resetProviders,\n        register : register,\n        resolve : resolve,\n        service : service,\n        serviceFactory : serviceFactory,\n        value : value\n    };\n    \n    /**\n     * Bottle static\n     */\n    Bottle.pop = pop;\n    Bottle.clear = clear;\n    Bottle.list = list;\n    \n    /**\n     * Global config\n     */\n    Bottle.config = {\n        strict : false\n    };\n    \n    /**\n     * Exports script adapted from lodash v2.4.1 Modern Build\n     *\n     * @see http://lodash.com/\n     */\n    \n    /**\n     * Valid object type map\n     *\n     * @type Object\n     */\n    var objectTypes = {\n        'function' : true,\n        'object' : true\n    };\n    \n    (function exportBottle(root) {\n    \n        /**\n         * Free variable exports\n         *\n         * @type Function\n         */\n        var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n    \n        /**\n         * Free variable module\n         *\n         * @type Object\n         */\n        var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n    \n        /**\n         * CommonJS module.exports\n         *\n         * @type Function\n         */\n        var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n    \n        /**\n         * Free variable `global`\n         *\n         * @type Object\n         */\n        var freeGlobal = objectTypes[typeof global] && global;\n        if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n            root = freeGlobal;\n        }\n    \n        /**\n         * Export\n         */\n        if (typeof define === FUNCTION_TYPE && typeof define.amd === 'object' && define.amd) {\n            root.Bottle = Bottle;\n            define(function() { return Bottle; });\n        } else if (freeExports && freeModule) {\n            if (moduleExports) {\n                (freeModule.exports = Bottle).Bottle = Bottle;\n            } else {\n                freeExports.Bottle = Bottle;\n            }\n        } else {\n            root.Bottle = Bottle;\n        }\n    }((objectTypes[typeof window] && window) || this));\n    \n}.call(this));","require('../../modules/es.string.iterator');\nrequire('../../modules/es.array.from');\nrequire('../../modules/es.array.is-array');\nrequire('../../modules/es.array.of');\nrequire('../../modules/es.array.concat');\nrequire('../../modules/es.array.copy-within');\nrequire('../../modules/es.array.every');\nrequire('../../modules/es.array.fill');\nrequire('../../modules/es.array.filter');\nrequire('../../modules/es.array.find');\nrequire('../../modules/es.array.find-index');\nrequire('../../modules/es.array.flat');\nrequire('../../modules/es.array.flat-map');\nrequire('../../modules/es.array.for-each');\nrequire('../../modules/es.array.includes');\nrequire('../../modules/es.array.index-of');\nrequire('../../modules/es.array.iterator');\nrequire('../../modules/es.array.join');\nrequire('../../modules/es.array.last-index-of');\nrequire('../../modules/es.array.map');\nrequire('../../modules/es.array.reduce');\nrequire('../../modules/es.array.reduce-right');\nrequire('../../modules/es.array.reverse');\nrequire('../../modules/es.array.slice');\nrequire('../../modules/es.array.some');\nrequire('../../modules/es.array.sort');\nrequire('../../modules/es.array.species');\nrequire('../../modules/es.array.splice');\nrequire('../../modules/es.array.unscopables.flat');\nrequire('../../modules/es.array.unscopables.flat-map');\n\nmodule.exports = require('../../internals/path').Array;\n","require('../../modules/es.map');\nrequire('../../modules/es.object.to-string');\nrequire('../../modules/es.string.iterator');\nrequire('../../modules/web.dom-collections.iterator');\n\nmodule.exports = require('../../internals/path').Map;\n","require('../../modules/es.number.constructor');\nrequire('../../modules/es.number.epsilon');\nrequire('../../modules/es.number.is-finite');\nrequire('../../modules/es.number.is-integer');\nrequire('../../modules/es.number.is-nan');\nrequire('../../modules/es.number.is-safe-integer');\nrequire('../../modules/es.number.max-safe-integer');\nrequire('../../modules/es.number.min-safe-integer');\nrequire('../../modules/es.number.parse-float');\nrequire('../../modules/es.number.parse-int');\nrequire('../../modules/es.number.to-fixed');\nrequire('../../modules/es.number.to-precision');\n\nmodule.exports = require('../../internals/path').Number;\n","require('../../modules/es.symbol');\nrequire('../../modules/es.object.assign');\nrequire('../../modules/es.object.create');\nrequire('../../modules/es.object.define-property');\nrequire('../../modules/es.object.define-properties');\nrequire('../../modules/es.object.entries');\nrequire('../../modules/es.object.freeze');\nrequire('../../modules/es.object.from-entries');\nrequire('../../modules/es.object.get-own-property-descriptor');\nrequire('../../modules/es.object.get-own-property-descriptors');\nrequire('../../modules/es.object.get-own-property-names');\nrequire('../../modules/es.object.get-prototype-of');\nrequire('../../modules/es.object.is');\nrequire('../../modules/es.object.is-extensible');\nrequire('../../modules/es.object.is-frozen');\nrequire('../../modules/es.object.is-sealed');\nrequire('../../modules/es.object.keys');\nrequire('../../modules/es.object.prevent-extensions');\nrequire('../../modules/es.object.seal');\nrequire('../../modules/es.object.set-prototype-of');\nrequire('../../modules/es.object.values');\nrequire('../../modules/es.object.to-string');\nrequire('../../modules/es.object.define-getter');\nrequire('../../modules/es.object.define-setter');\nrequire('../../modules/es.object.lookup-getter');\nrequire('../../modules/es.object.lookup-setter');\nrequire('../../modules/es.math.to-string-tag');\nrequire('../../modules/es.json.to-string-tag');\n\nmodule.exports = require('../../internals/path').Object;\n","require('../../modules/es.set');\nrequire('../../modules/es.object.to-string');\nrequire('../../modules/es.string.iterator');\nrequire('../../modules/web.dom-collections.iterator');\n\nmodule.exports = require('../../internals/path').Set;\n","require('../../modules/es.string.from-code-point');\nrequire('../../modules/es.string.raw');\nrequire('../../modules/es.string.code-point-at');\nrequire('../../modules/es.string.ends-with');\nrequire('../../modules/es.string.includes');\nrequire('../../modules/es.string.match');\nrequire('../../modules/es.string.pad-end');\nrequire('../../modules/es.string.pad-start');\nrequire('../../modules/es.string.repeat');\nrequire('../../modules/es.string.replace');\nrequire('../../modules/es.string.search');\nrequire('../../modules/es.string.split');\nrequire('../../modules/es.string.starts-with');\nrequire('../../modules/es.string.trim');\nrequire('../../modules/es.string.trim-start');\nrequire('../../modules/es.string.trim-end');\nrequire('../../modules/es.string.iterator');\nrequire('../../modules/es.string.anchor');\nrequire('../../modules/es.string.big');\nrequire('../../modules/es.string.blink');\nrequire('../../modules/es.string.bold');\nrequire('../../modules/es.string.fixed');\nrequire('../../modules/es.string.fontcolor');\nrequire('../../modules/es.string.fontsize');\nrequire('../../modules/es.string.italics');\nrequire('../../modules/es.string.link');\nrequire('../../modules/es.string.small');\nrequire('../../modules/es.string.strike');\nrequire('../../modules/es.string.sub');\nrequire('../../modules/es.string.sup');\n\nmodule.exports = require('../../internals/path').String;\n","module.exports = require('../../es/array');\n\nrequire('../../modules/esnext.array.last-item');\nrequire('../../modules/esnext.array.last-index');\n","module.exports = require('../../es/map');\n\nrequire('../../modules/esnext.map.from');\nrequire('../../modules/esnext.map.of');\nrequire('../../modules/esnext.map.delete-all');\nrequire('../../modules/esnext.map.every');\nrequire('../../modules/esnext.map.filter');\nrequire('../../modules/esnext.map.find');\nrequire('../../modules/esnext.map.find-key');\nrequire('../../modules/esnext.map.group-by');\nrequire('../../modules/esnext.map.includes');\nrequire('../../modules/esnext.map.key-by');\nrequire('../../modules/esnext.map.key-of');\nrequire('../../modules/esnext.map.map-keys');\nrequire('../../modules/esnext.map.map-values');\nrequire('../../modules/esnext.map.merge');\nrequire('../../modules/esnext.map.reduce');\nrequire('../../modules/esnext.map.some');\nrequire('../../modules/esnext.map.update');\n","module.exports = require('../../es/number');\n\nrequire('../../modules/esnext.number.from-string');\n","module.exports = require('../../es/object');\n","module.exports = require('../../es/set');\n\nrequire('../../modules/esnext.set.from');\nrequire('../../modules/esnext.set.of');\nrequire('../../modules/esnext.set.add-all');\nrequire('../../modules/esnext.set.delete-all');\nrequire('../../modules/esnext.set.every');\nrequire('../../modules/esnext.set.difference');\nrequire('../../modules/esnext.set.filter');\nrequire('../../modules/esnext.set.find');\nrequire('../../modules/esnext.set.intersection');\nrequire('../../modules/esnext.set.is-disjoint-from');\nrequire('../../modules/esnext.set.is-subset-of');\nrequire('../../modules/esnext.set.is-superset-of');\nrequire('../../modules/esnext.set.join');\nrequire('../../modules/esnext.set.map');\nrequire('../../modules/esnext.set.reduce');\nrequire('../../modules/esnext.set.some');\nrequire('../../modules/esnext.set.symmetric-difference');\nrequire('../../modules/esnext.set.union');\n","module.exports = require('../../es/string');\n\nrequire('../../modules/esnext.string.at');\nrequire('../../modules/esnext.string.match-all');\nrequire('../../modules/esnext.string.replace-all');\n","module.exports = function (it) {\n  if (typeof it != 'function') {\n    throw TypeError(String(it) + ' is not a function');\n  } return it;\n};\n","var UNSCOPABLES = require('../internals/well-known-symbol')('unscopables');\nvar create = require('../internals/object-create');\nvar hide = require('../internals/hide');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n  hide(ArrayPrototype, UNSCOPABLES, create(null));\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n  ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar codePointAt = require('../internals/string-at');\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n  return index + (unicode ? codePointAt(S, index, true).length : 1);\n};\n","module.exports = function (it, Constructor, name) {\n  if (!(it instanceof Constructor)) {\n    throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n  } return it;\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n  if (!isObject(it)) {\n    throw TypeError(String(it) + ' is not an object');\n  } return it;\n};\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.copyWithin` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n  var O = toObject(this);\n  var len = toLength(O.length);\n  var to = toAbsoluteIndex(target, len);\n  var from = toAbsoluteIndex(start, len);\n  var end = arguments.length > 2 ? arguments[2] : undefined;\n  var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n  var inc = 1;\n  if (from < to && to < from + count) {\n    inc = -1;\n    from += count - 1;\n    to += count - 1;\n  }\n  while (count-- > 0) {\n    if (from in O) O[to] = O[from];\n    else delete O[to];\n    to += inc;\n    from += inc;\n  } return O;\n};\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.fill` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.fill\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n  var O = toObject(this);\n  var length = toLength(O.length);\n  var argumentsLength = arguments.length;\n  var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);\n  var end = argumentsLength > 2 ? arguments[2] : undefined;\n  var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n  while (endPos > index) O[index++] = value;\n  return O;\n};\n","'use strict';\nvar nativeForEach = [].forEach;\nvar internalForEach = require('../internals/array-methods')(0);\n\nvar SLOPPY_METHOD = require('../internals/sloppy-array-method')('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = SLOPPY_METHOD ? function forEach(callbackfn /* , thisArg */) {\n  return internalForEach(this, callbackfn, arguments[1]);\n} : nativeForEach;\n","'use strict';\nvar bind = require('../internals/bind-context');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n  var O = toObject(arrayLike);\n  var C = typeof this == 'function' ? this : Array;\n  var argumentsLength = arguments.length;\n  var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n  var mapping = mapfn !== undefined;\n  var index = 0;\n  var iteratorMethod = getIteratorMethod(O);\n  var length, result, step, iterator;\n  if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n  // if the target is not iterable or it's an array with the default iterator - use a simple case\n  if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n    iterator = iteratorMethod.call(O);\n    result = new C();\n    for (;!(step = iterator.next()).done; index++) {\n      createProperty(result, index, mapping\n        ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true)\n        : step.value\n      );\n    }\n  } else {\n    length = toLength(O.length);\n    result = new C(length);\n    for (;length > index; index++) {\n      createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n    }\n  }\n  result.length = index;\n  return result;\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\n// false -> Array#indexOf\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n// true  -> Array#includes\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIndexedObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar nativeLastIndexOf = [].lastIndexOf;\n\nvar NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar SLOPPY_METHOD = require('../internals/sloppy-array-method')('lastIndexOf');\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = (NEGATIVE_ZERO || SLOPPY_METHOD) ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n  // convert -0 to +0\n  if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;\n  var O = toIndexedObject(this);\n  var length = toLength(O.length);\n  var index = length - 1;\n  if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1]));\n  if (index < 0) index = length + index;\n  for (;index >= 0; index--) if (index in O) if (O[index] === searchElement) return index || 0;\n  return -1;\n} : nativeLastIndexOf;\n","var fails = require('../internals/fails');\nvar SPECIES = require('../internals/well-known-symbol')('species');\n\nmodule.exports = function (METHOD_NAME) {\n  return !fails(function () {\n    var array = [];\n    var constructor = array.constructor = {};\n    constructor[SPECIES] = function () {\n      return { foo: 1 };\n    };\n    return array[METHOD_NAME](Boolean).foo !== 1;\n  });\n};\n","var bind = require('../internals/bind-context');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\n// 0 -> Array#forEach\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n// 1 -> Array#map\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// 2 -> Array#filter\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// 3 -> Array#some\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n// 4 -> Array#every\n// https://tc39.github.io/ecma262/#sec-array.prototype.every\n// 5 -> Array#find\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n// 6 -> Array#findIndex\n// https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\nmodule.exports = function (TYPE, specificCreate) {\n  var IS_MAP = TYPE == 1;\n  var IS_FILTER = TYPE == 2;\n  var IS_SOME = TYPE == 3;\n  var IS_EVERY = TYPE == 4;\n  var IS_FIND_INDEX = TYPE == 6;\n  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n  var create = specificCreate || arraySpeciesCreate;\n  return function ($this, callbackfn, that) {\n    var O = toObject($this);\n    var self = IndexedObject(O);\n    var boundFunction = bind(callbackfn, that, 3);\n    var length = toLength(self.length);\n    var index = 0;\n    var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n    var value, result;\n    for (;length > index; index++) if (NO_HOLES || index in self) {\n      value = self[index];\n      result = boundFunction(value, index, O);\n      if (TYPE) {\n        if (IS_MAP) target[index] = result; // map\n        else if (result) switch (TYPE) {\n          case 3: return true;              // some\n          case 5: return value;             // find\n          case 6: return index;             // findIndex\n          case 2: target.push(value);       // filter\n        } else if (IS_EVERY) return false;  // every\n      }\n    }\n    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n  };\n};\n","var aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\nmodule.exports = function (that, callbackfn, argumentsLength, memo, isRight) {\n  aFunction(callbackfn);\n  var O = toObject(that);\n  var self = IndexedObject(O);\n  var length = toLength(O.length);\n  var index = isRight ? length - 1 : 0;\n  var i = isRight ? -1 : 1;\n  if (argumentsLength < 2) while (true) {\n    if (index in self) {\n      memo = self[index];\n      index += i;\n      break;\n    }\n    index += i;\n    if (isRight ? index < 0 : length <= index) {\n      throw TypeError('Reduce of empty array with no initial value');\n    }\n  }\n  for (;isRight ? index >= 0 : length > index; index += i) if (index in self) {\n    memo = callbackfn(memo, self[index], index, O);\n  }\n  return memo;\n};\n","var isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar SPECIES = require('../internals/well-known-symbol')('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n  var C;\n  if (isArray(originalArray)) {\n    C = originalArray.constructor;\n    // cross-realm fallback\n    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n    else if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 0: return function () {\n      return fn.call(that);\n    };\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n","var anObject = require('../internals/an-object');\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n  try {\n    return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch (error) {\n    var returnMethod = iterator['return'];\n    if (returnMethod !== undefined) anObject(returnMethod.call(iterator));\n    throw error;\n  }\n};\n","var ITERATOR = require('../internals/well-known-symbol')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var called = 0;\n  var iteratorWithReturn = {\n    next: function () {\n      return { done: !!called++ };\n    },\n    'return': function () {\n      SAFE_CLOSING = true;\n    }\n  };\n  iteratorWithReturn[ITERATOR] = function () {\n    return this;\n  };\n  // eslint-disable-next-line no-throw-literal\n  Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n  if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n  var ITERATION_SUPPORT = false;\n  try {\n    var object = {};\n    object[ITERATOR] = function () {\n      return {\n        next: function () {\n          return { done: ITERATION_SUPPORT = true };\n        }\n      };\n    };\n    exec(object);\n  } catch (error) { /* empty */ }\n  return ITERATION_SUPPORT;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n","var classofRaw = require('../internals/classof-raw');\nvar TO_STRING_TAG = require('../internals/well-known-symbol')('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = function (it) {\n  var O, tag, result;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n    // builtinTag case\n    : CORRECT_ARGUMENTS ? classofRaw(O)\n    // ES3 arguments fallback\n    : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\n\n// https://github.com/tc39/collection-methods\nmodule.exports = function (/* ...elements */) {\n  var set = anObject(this);\n  var adder = aFunction(set.add);\n  for (var k = 0, len = arguments.length; k < len; k++) {\n    adder.call(set, arguments[k]);\n  }\n  return set;\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\n\n// https://github.com/tc39/collection-methods\nmodule.exports = function (/* ...elements */) {\n  var collection = anObject(this);\n  var remover = aFunction(collection['delete']);\n  var allDeleted = true;\n  for (var k = 0, len = arguments.length; k < len; k++) {\n    allDeleted = allDeleted && remover.call(collection, arguments[k]);\n  }\n  return !!allDeleted;\n};\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar aFunction = require('../internals/a-function');\nvar bind = require('../internals/bind-context');\nvar iterate = require('../internals/iterate');\n\nmodule.exports = function from(source /* , mapFn, thisArg */) {\n  var mapFn = arguments[1];\n  var mapping, A, n, boundFunction;\n  aFunction(this);\n  mapping = mapFn !== undefined;\n  if (mapping) aFunction(mapFn);\n  if (source == undefined) return new this();\n  A = [];\n  if (mapping) {\n    n = 0;\n    boundFunction = bind(mapFn, arguments[2], 2);\n    iterate(source, function (nextItem) {\n      A.push(boundFunction(nextItem, n++));\n    });\n  } else {\n    iterate(source, A.push, A);\n  }\n  return new this(A);\n};\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nmodule.exports = function of() {\n  var length = arguments.length;\n  var A = new Array(length);\n  while (length--) A[length] = arguments[length];\n  return new this(A);\n};\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\nvar create = require('../internals/object-create');\nvar redefineAll = require('../internals/redefine-all');\nvar bind = require('../internals/bind-context');\nvar anInstance = require('../internals/an-instance');\nvar iterate = require('../internals/iterate');\nvar defineIterator = require('../internals/define-iterator');\nvar setSpecies = require('../internals/set-species');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fastKey = require('../internals/internal-metadata').fastKey;\nvar InternalStateModule = require('../internals/internal-state');\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\n\nmodule.exports = {\n  getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, CONSTRUCTOR_NAME);\n      setInternalState(that, {\n        type: CONSTRUCTOR_NAME,\n        index: create(null),\n        first: undefined,\n        last: undefined,\n        size: 0\n      });\n      if (!DESCRIPTORS) that.size = 0;\n      if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP);\n    });\n\n    var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n    var define = function (that, key, value) {\n      var state = getInternalState(that);\n      var entry = getEntry(that, key);\n      var previous, index;\n      // change existing entry\n      if (entry) {\n        entry.value = value;\n      // create new entry\n      } else {\n        state.last = entry = {\n          index: index = fastKey(key, true),\n          key: key,\n          value: value,\n          previous: previous = state.last,\n          next: undefined,\n          removed: false\n        };\n        if (!state.first) state.first = entry;\n        if (previous) previous.next = entry;\n        if (DESCRIPTORS) state.size++;\n        else that.size++;\n        // add to index\n        if (index !== 'F') state.index[index] = entry;\n      } return that;\n    };\n\n    var getEntry = function (that, key) {\n      var state = getInternalState(that);\n      // fast case\n      var index = fastKey(key);\n      var entry;\n      if (index !== 'F') return state.index[index];\n      // frozen object case\n      for (entry = state.first; entry; entry = entry.next) {\n        if (entry.key == key) return entry;\n      }\n    };\n\n    redefineAll(C.prototype, {\n      // 23.1.3.1 Map.prototype.clear()\n      // 23.2.3.2 Set.prototype.clear()\n      clear: function clear() {\n        var that = this;\n        var state = getInternalState(that);\n        var data = state.index;\n        var entry = state.first;\n        while (entry) {\n          entry.removed = true;\n          if (entry.previous) entry.previous = entry.previous.next = undefined;\n          delete data[entry.index];\n          entry = entry.next;\n        }\n        state.first = state.last = undefined;\n        if (DESCRIPTORS) state.size = 0;\n        else that.size = 0;\n      },\n      // 23.1.3.3 Map.prototype.delete(key)\n      // 23.2.3.4 Set.prototype.delete(value)\n      'delete': function (key) {\n        var that = this;\n        var state = getInternalState(that);\n        var entry = getEntry(that, key);\n        if (entry) {\n          var next = entry.next;\n          var prev = entry.previous;\n          delete state.index[entry.index];\n          entry.removed = true;\n          if (prev) prev.next = next;\n          if (next) next.previous = prev;\n          if (state.first == entry) state.first = next;\n          if (state.last == entry) state.last = prev;\n          if (DESCRIPTORS) state.size--;\n          else that.size--;\n        } return !!entry;\n      },\n      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n      forEach: function forEach(callbackfn /* , that = undefined */) {\n        var state = getInternalState(this);\n        var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n        var entry;\n        while (entry = entry ? entry.next : state.first) {\n          boundFunction(entry.value, entry.key, this);\n          // revert to the last existing entry\n          while (entry && entry.removed) entry = entry.previous;\n        }\n      },\n      // 23.1.3.7 Map.prototype.has(key)\n      // 23.2.3.7 Set.prototype.has(value)\n      has: function has(key) {\n        return !!getEntry(this, key);\n      }\n    });\n\n    redefineAll(C.prototype, IS_MAP ? {\n      // 23.1.3.6 Map.prototype.get(key)\n      get: function get(key) {\n        var entry = getEntry(this, key);\n        return entry && entry.value;\n      },\n      // 23.1.3.9 Map.prototype.set(key, value)\n      set: function set(key, value) {\n        return define(this, key === 0 ? 0 : key, value);\n      }\n    } : {\n      // 23.2.3.1 Set.prototype.add(value)\n      add: function add(value) {\n        return define(this, value = value === 0 ? 0 : value, value);\n      }\n    });\n    if (DESCRIPTORS) defineProperty(C.prototype, 'size', {\n      get: function () {\n        return getInternalState(this).size;\n      }\n    });\n    return C;\n  },\n  setStrong: function (C, CONSTRUCTOR_NAME, IS_MAP) {\n    var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';\n    var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);\n    var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);\n    // add .keys, .values, .entries, [@@iterator]\n    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n    defineIterator(C, CONSTRUCTOR_NAME, function (iterated, kind) {\n      setInternalState(this, {\n        type: ITERATOR_NAME,\n        target: iterated,\n        state: getInternalCollectionState(iterated),\n        kind: kind,\n        last: undefined\n      });\n    }, function () {\n      var state = getInternalIteratorState(this);\n      var kind = state.kind;\n      var entry = state.last;\n      // revert to the last existing entry\n      while (entry && entry.removed) entry = entry.previous;\n      // get next entry\n      if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {\n        // or finish the iteration\n        state.target = undefined;\n        return { value: undefined, done: true };\n      }\n      // return step by kind\n      if (kind == 'keys') return { value: entry.key, done: false };\n      if (kind == 'values') return { value: entry.value, done: false };\n      return { value: [entry.key, entry.value], done: false };\n    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n    // add [@@species], 23.1.2.2, 23.2.2.2\n    setSpecies(CONSTRUCTOR_NAME);\n  }\n};\n","'use strict';\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar $export = require('../internals/export');\nvar redefine = require('../internals/redefine');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common, IS_MAP, IS_WEAK) {\n  var NativeConstructor = global[CONSTRUCTOR_NAME];\n  var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n  var Constructor = NativeConstructor;\n  var ADDER = IS_MAP ? 'set' : 'add';\n  var exported = {};\n\n  var fixMethod = function (KEY) {\n    var nativeMethod = NativePrototype[KEY];\n    redefine(NativePrototype, KEY,\n      KEY == 'add' ? function add(a) {\n        nativeMethod.call(this, a === 0 ? 0 : a);\n        return this;\n      } : KEY == 'delete' ? function (a) {\n        return IS_WEAK && !isObject(a) ? false : nativeMethod.call(this, a === 0 ? 0 : a);\n      } : KEY == 'get' ? function get(a) {\n        return IS_WEAK && !isObject(a) ? undefined : nativeMethod.call(this, a === 0 ? 0 : a);\n      } : KEY == 'has' ? function has(a) {\n        return IS_WEAK && !isObject(a) ? false : nativeMethod.call(this, a === 0 ? 0 : a);\n      } : function set(a, b) {\n        nativeMethod.call(this, a === 0 ? 0 : a, b);\n        return this;\n      }\n    );\n  };\n\n  // eslint-disable-next-line max-len\n  if (isForced(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n    new NativeConstructor().entries().next();\n  })))) {\n    // create collection constructor\n    Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n    InternalMetadataModule.REQUIRED = true;\n  } else if (isForced(CONSTRUCTOR_NAME, true)) {\n    var instance = new Constructor();\n    // early implementations not supports chaining\n    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n    // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false\n    var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n    // most early implementations doesn't supports iterables, most modern - not close it correctly\n    // eslint-disable-next-line no-new\n    var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\n    // for early implementations -0 and +0 not the same\n    var BUGGY_ZERO = !IS_WEAK && fails(function () {\n      // V8 ~ Chromium 42- fails only with 5+ elements\n      var $instance = new NativeConstructor();\n      var index = 5;\n      while (index--) $instance[ADDER](index, index);\n      return !$instance.has(-0);\n    });\n\n    if (!ACCEPT_ITERABLES) {\n      Constructor = wrapper(function (target, iterable) {\n        anInstance(target, Constructor, CONSTRUCTOR_NAME);\n        var that = inheritIfRequired(new NativeConstructor(), target, Constructor);\n        if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP);\n        return that;\n      });\n      Constructor.prototype = NativePrototype;\n      NativePrototype.constructor = Constructor;\n    }\n\n    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n\n    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n    // weak collections should not contains .clear method\n    if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n  }\n\n  exported[CONSTRUCTOR_NAME] = Constructor;\n  $export({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n  setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n  if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n  return Constructor;\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n  var keys = ownKeys(source);\n  var defineProperty = definePropertyModule.f;\n  var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n  }\n};\n","var MATCH = require('../internals/well-known-symbol')('match');\n\nmodule.exports = function (METHOD_NAME) {\n  var regexp = /./;\n  try {\n    '/./'[METHOD_NAME](regexp);\n  } catch (e) {\n    try {\n      regexp[MATCH] = false;\n      return '/./'[METHOD_NAME](regexp);\n    } catch (f) { /* empty */ }\n  } return false;\n};\n","module.exports = !require('../internals/fails')(function () {\n  function F() { /* empty */ }\n  F.prototype.constructor = null;\n  return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","var requireObjectCoercible = require('../internals/require-object-coercible');\nvar quot = /\"/g;\n\n// B.2.3.2.1 CreateHTML(string, tag, attribute, value)\n// https://tc39.github.io/ecma262/#sec-createhtml\nmodule.exports = function (string, tag, attribute, value) {\n  var S = String(requireObjectCoercible(string));\n  var p1 = '<' + tag;\n  if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '&quot;') + '\"';\n  return p1 + '>' + S + '</' + tag + '>';\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n  var TO_STRING_TAG = NAME + ' Iterator';\n  IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n  setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n  Iterators[TO_STRING_TAG] = returnThis;\n  return IteratorConstructor;\n};\n","module.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n  var propertyKey = toPrimitive(key);\n  if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n  else object[propertyKey] = value;\n};\n","'use strict';\nvar $export = require('../internals/export');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar hide = require('../internals/hide');\nvar redefine = require('../internals/redefine');\nvar IS_PURE = require('../internals/is-pure');\nvar ITERATOR = require('../internals/well-known-symbol')('iterator');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n  createIteratorConstructor(IteratorConstructor, NAME, next);\n\n  var getIterationMethod = function (KIND) {\n    if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n    if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n    switch (KIND) {\n      case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n      case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n      case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n    } return function () { return new IteratorConstructor(this); };\n  };\n\n  var TO_STRING_TAG = NAME + ' Iterator';\n  var INCORRECT_VALUES_NAME = false;\n  var IterablePrototype = Iterable.prototype;\n  var nativeIterator = IterablePrototype[ITERATOR]\n    || IterablePrototype['@@iterator']\n    || DEFAULT && IterablePrototype[DEFAULT];\n  var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n  var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n  var CurrentIteratorPrototype, methods, KEY;\n\n  // fix native\n  if (anyNativeIterator) {\n    CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n    if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n      if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n        if (setPrototypeOf) {\n          setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n        } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n          hide(CurrentIteratorPrototype, ITERATOR, returnThis);\n        }\n      }\n      // Set @@toStringTag to native iterators\n      setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n      if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n    }\n  }\n\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n    INCORRECT_VALUES_NAME = true;\n    defaultIterator = function values() { return nativeIterator.call(this); };\n  }\n\n  // define iterator\n  if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n    hide(IterablePrototype, ITERATOR, defaultIterator);\n  }\n  Iterators[NAME] = defaultIterator;\n\n  // export additional methods\n  if (DEFAULT) {\n    methods = {\n      values: getIterationMethod(VALUES),\n      keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n      entries: getIterationMethod(ENTRIES)\n    };\n    if (FORCED) for (KEY in methods) {\n      if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n        redefine(IterablePrototype, KEY, methods[KEY]);\n      }\n    } else $export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n  }\n\n  return methods;\n};\n","var path = require('../internals/path');\nvar has = require('../internals/has');\nvar wrappedWellKnownSymbolModule = require('../internals/wrapped-well-known-symbol');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n  var Symbol = path.Symbol || (path.Symbol = {});\n  if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n    value: wrappedWellKnownSymbolModule.f(NAME)\n  });\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('../internals/fails')(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('../internals/is-object');\nvar document = require('../internals/global').document;\n// typeof document.createElement is 'object' in old IE\nvar exist = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n  return exist ? document.createElement(it) : {};\n};\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n  CSSRuleList: 0,\n  CSSStyleDeclaration: 0,\n  CSSValueList: 0,\n  ClientRectList: 0,\n  DOMRectList: 0,\n  DOMStringList: 0,\n  DOMTokenList: 1,\n  DataTransferItemList: 0,\n  FileList: 0,\n  HTMLAllCollection: 0,\n  HTMLCollection: 0,\n  HTMLFormElement: 0,\n  HTMLSelectElement: 0,\n  MediaList: 0,\n  MimeTypeArray: 0,\n  NamedNodeMap: 0,\n  NodeList: 1,\n  PaintRequestList: 0,\n  Plugin: 0,\n  PluginArray: 0,\n  SVGLengthList: 0,\n  SVGNumberList: 0,\n  SVGPathSegList: 0,\n  SVGPointList: 0,\n  SVGStringList: 0,\n  SVGTransformList: 0,\n  SourceBufferList: 0,\n  StyleSheetList: 0,\n  TextTrackCueList: 0,\n  TextTrackList: 0,\n  TouchList: 0\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n  'constructor',\n  'hasOwnProperty',\n  'isPrototypeOf',\n  'propertyIsEnumerable',\n  'toLocaleString',\n  'toString',\n  'valueOf'\n];\n","var objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\n\n// all enumerable object keys, includes symbols\nmodule.exports = function (it) {\n  var result = objectKeys(it);\n  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n  if (getOwnPropertySymbols) {\n    var symbols = getOwnPropertySymbols(it);\n    var propertyIsEnumerable = propertyIsEnumerableModule.f;\n    var i = 0;\n    var key;\n    while (symbols.length > i) if (propertyIsEnumerable.call(it, key = symbols[i++])) result.push(key);\n  } return result;\n};\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar hide = require('../internals/hide');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n  options.target      - name of the target object\n  options.global      - target is the global object\n  options.stat        - export as static methods of target\n  options.proto       - export as prototype methods of target\n  options.real        - real prototype method for the `pure` version\n  options.forced      - export even if the native feature is available\n  options.bind        - bind methods to the target, required for the `pure` version\n  options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version\n  options.unsafe      - use the simple assignment of property instead of delete + defineProperty\n  options.sham        - add a flag to not completely full polyfills\n  options.enumerable  - export as enumerable property\n  options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n  var TARGET = options.target;\n  var GLOBAL = options.global;\n  var STATIC = options.stat;\n  var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n  if (GLOBAL) {\n    target = global;\n  } else if (STATIC) {\n    target = global[TARGET] || setGlobal(TARGET, {});\n  } else {\n    target = (global[TARGET] || {}).prototype;\n  }\n  if (target) for (key in source) {\n    sourceProperty = source[key];\n    if (options.noTargetGet) {\n      descriptor = getOwnPropertyDescriptor(target, key);\n      targetProperty = descriptor && descriptor.value;\n    } else targetProperty = target[key];\n    FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n    // contained in target\n    if (!FORCED && targetProperty !== undefined) {\n      if (typeof sourceProperty === typeof targetProperty) continue;\n      copyConstructorProperties(sourceProperty, targetProperty);\n    }\n    // add a flag to not completely full polyfills\n    if (options.sham || (targetProperty && targetProperty.sham)) {\n      hide(sourceProperty, 'sham', true);\n    }\n    // extend global\n    redefine(target, key, sourceProperty, options);\n  }\n};\n","module.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (error) {\n    return true;\n  }\n};\n","'use strict';\nvar hide = require('../internals/hide');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar regexpExec = require('../internals/regexp-exec');\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n  // #replace needs built-in support for named groups.\n  // #match works fine because it just return the exec results, even if it has\n  // a \"grops\" property.\n  var re = /./;\n  re.exec = function () {\n    var result = [];\n    result.groups = { a: '7' };\n    return result;\n  };\n  return ''.replace(re, '$<a>') !== '7';\n});\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n  var re = /(?:)/;\n  var originalExec = re.exec;\n  re.exec = function () { return originalExec.apply(this, arguments); };\n  var result = 'ab'.split(re);\n  return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n  var SYMBOL = wellKnownSymbol(KEY);\n\n  var DELEGATES_TO_SYMBOL = !fails(function () {\n    // String methods call symbol-named RegEp methods\n    var O = {};\n    O[SYMBOL] = function () { return 7; };\n    return ''[KEY](O) != 7;\n  });\n\n  var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n    // Symbol-named RegExp methods call .exec\n    var execCalled = false;\n    var re = /a/;\n    re.exec = function () { execCalled = true; return null; };\n\n    if (KEY === 'split') {\n      // RegExp[@@split] doesn't call the regex's exec method, but first creates\n      // a new one. We need to return the patched regex when creating the new one.\n      re.constructor = {};\n      re.constructor[SPECIES] = function () { return re; };\n    }\n\n    re[SYMBOL]('');\n    return !execCalled;\n  });\n\n  if (\n    !DELEGATES_TO_SYMBOL ||\n    !DELEGATES_TO_EXEC ||\n    (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n    (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n  ) {\n    var nativeRegExpMethod = /./[SYMBOL];\n    var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n      if (regexp.exec === regexpExec) {\n        if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n          // The native String method already delegates to @@method (this\n          // polyfilled function), leasing to infinite recursion.\n          // We avoid it by directly calling the native @@method method.\n          return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n        }\n        return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n      }\n      return { done: false };\n    });\n    var stringMethod = methods[0];\n    var regexMethod = methods[1];\n\n    redefine(String.prototype, KEY, stringMethod);\n    redefine(RegExp.prototype, SYMBOL, length == 2\n      // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n      // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n      ? function (string, arg) { return regexMethod.call(string, this, arg); }\n      // 21.2.5.6 RegExp.prototype[@@match](string)\n      // 21.2.5.9 RegExp.prototype[@@search](string)\n      : function (string) { return regexMethod.call(string, this); }\n    );\n    if (sham) hide(RegExp.prototype[SYMBOL], 'sham', true);\n  }\n};\n","'use strict';\nvar isArray = require('../internals/is-array');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/bind-context');\n\n// `FlattenIntoArray` abstract operation\n// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray\nvar flattenIntoArray = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {\n  var targetIndex = start;\n  var sourceIndex = 0;\n  var mapFn = mapper ? bind(mapper, thisArg, 3) : false;\n  var element;\n\n  while (sourceIndex < sourceLen) {\n    if (sourceIndex in source) {\n      element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];\n\n      if (depth > 0 && isArray(element)) {\n        targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;\n      } else {\n        if (targetIndex >= 0x1FFFFFFFFFFFFF) throw TypeError('Exceed the acceptable array length');\n        target[targetIndex] = element;\n      }\n\n      targetIndex++;\n    }\n    sourceIndex++;\n  }\n  return targetIndex;\n};\n\nmodule.exports = flattenIntoArray;\n","'use strict';\n// Forced replacement object prototype accessors methods\nmodule.exports = require('../internals/is-pure') || !require('../internals/fails')(function () {\n  var key = Math.random();\n  // In FF throws only define methods\n  // eslint-disable-next-line no-undef, no-useless-call\n  __defineSetter__.call(null, key, function () { /* empty */ });\n  delete require('../internals/global')[key];\n});\n","var fails = require('../internals/fails');\n\n// check the existence of a method, lowercase\n// of a tag and escaping quotes in arguments\nmodule.exports = function (METHOD_NAME) {\n  return fails(function () {\n    var test = ''[METHOD_NAME]('\"');\n    return test !== test.toLowerCase() || test.split('\"').length > 3;\n  });\n};\n","var fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n  return fails(function () {\n    return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n  });\n};\n","module.exports = !require('../internals/fails')(function () {\n  return Object.isExtensible(Object.preventExtensions({}));\n});\n","module.exports = require('../internals/shared')('native-function-to-string', Function.toString);\n","var path = require('../internals/path');\nvar global = require('../internals/global');\n\nvar aFunction = function (variable) {\n  return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n  return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n    : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n","var classof = require('../internals/classof');\nvar ITERATOR = require('../internals/well-known-symbol')('iterator');\nvar Iterators = require('../internals/iterators');\n\nmodule.exports = function (it) {\n  if (it != undefined) return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n","var anObject = require('../internals/an-object');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nmodule.exports = function (it) {\n  var iteratorMethod = getIteratorMethod(it);\n  if (typeof iteratorMethod != 'function') {\n    throw TypeError(String(it) + ' is not iterable');\n  } return anObject(iteratorMethod.call(it));\n};\n","var IS_PURE = require('../internals/is-pure');\nvar getIterator = require('../internals/get-iterator');\n\nmodule.exports = IS_PURE ? getIterator : function (it) {\n  // eslint-disable-next-line no-undef\n  return Map.prototype.entries.call(it);\n};\n","var IS_PURE = require('../internals/is-pure');\nvar getIterator = require('../internals/get-iterator');\n\nmodule.exports = IS_PURE ? getIterator : function (it) {\n  // eslint-disable-next-line no-undef\n  return Set.prototype.values.call(it);\n};\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports = typeof window == 'object' && window && window.Math == Math ? window\n  : typeof self == 'object' && self && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\n","var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n","module.exports = {};\n","var definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = require('../internals/descriptors') ? function (object, key, value) {\n  return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n","var document = require('../internals/global').document;\n\nmodule.exports = document && document.documentElement;\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('../internals/descriptors') && !require('../internals/fails')(function () {\n  return Object.defineProperty(require('../internals/document-create-element')('div'), 'a', {\n    get: function () { return 7; }\n  }).a != 7;\n});\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\nvar split = ''.split;\n\nmodule.exports = fails(function () {\n  // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n  // eslint-disable-next-line no-prototype-builtins\n  return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n  return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","var isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\nmodule.exports = function (that, target, C) {\n  var S = target.constructor;\n  var P;\n  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n    setPrototypeOf(that, P);\n  } return that;\n};\n","var METADATA = require('../internals/uid')('meta');\nvar FREEZING = require('../internals/freezing');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar defineProperty = require('../internals/object-define-property').f;\nvar id = 0;\n\nvar isExtensible = Object.isExtensible || function () {\n  return true;\n};\n\nvar setMetadata = function (it) {\n  defineProperty(it, METADATA, { value: {\n    objectID: 'O' + ++id, // object ID\n    weakData: {}          // weak collections IDs\n  } });\n};\n\nvar fastKey = function (it, create) {\n  // return a primitive with prefix\n  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!has(it, METADATA)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add metadata\n    if (!create) return 'E';\n    // add missing metadata\n    setMetadata(it);\n  // return object ID\n  } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n  if (!has(it, METADATA)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return true;\n    // not necessary to add metadata\n    if (!create) return false;\n    // add missing metadata\n    setMetadata(it);\n  // return the store of weak collections IDs\n  } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n  if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n  return it;\n};\n\nvar meta = module.exports = {\n  REQUIRED: false,\n  fastKey: fastKey,\n  getWeakData: getWeakData,\n  onFreeze: onFreeze\n};\n\nrequire('../internals/hidden-keys')[METADATA] = true;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar isObject = require('../internals/is-object');\nvar hide = require('../internals/hide');\nvar objectHas = require('../internals/has');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar WeakMap = require('../internals/global').WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n  return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n  return function (it) {\n    var state;\n    if (!isObject(it) || (state = get(it)).type !== TYPE) {\n      throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n    } return state;\n  };\n};\n\nif (NATIVE_WEAK_MAP) {\n  var store = new WeakMap();\n  var wmget = store.get;\n  var wmhas = store.has;\n  var wmset = store.set;\n  set = function (it, metadata) {\n    wmset.call(store, it, metadata);\n    return metadata;\n  };\n  get = function (it) {\n    return wmget.call(store, it) || {};\n  };\n  has = function (it) {\n    return wmhas.call(store, it);\n  };\n} else {\n  var STATE = sharedKey('state');\n  hiddenKeys[STATE] = true;\n  set = function (it, metadata) {\n    hide(it, STATE, metadata);\n    return metadata;\n  };\n  get = function (it) {\n    return objectHas(it, STATE) ? it[STATE] : {};\n  };\n  has = function (it) {\n    return objectHas(it, STATE);\n  };\n}\n\nmodule.exports = {\n  set: set,\n  get: get,\n  has: has,\n  enforce: enforce,\n  getterFor: getterFor\n};\n","// check on default Array iterator\nvar Iterators = require('../internals/iterators');\nvar ITERATOR = require('../internals/well-known-symbol')('iterator');\nvar ArrayPrototype = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n  return classof(arg) == 'Array';\n};\n","var fails = require('../internals/fails');\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n  var value = data[normalize(feature)];\n  return value == POLYFILL ? true\n    : value == NATIVE ? false\n    : typeof detection == 'function' ? fails(detection)\n    : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n  return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var isObject = require('../internals/is-object');\nvar floor = Math.floor;\n\n// `Number.isInteger` method implementation\n// https://tc39.github.io/ecma262/#sec-number.isinteger\nmodule.exports = function isInteger(it) {\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","module.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","module.exports = false;\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar MATCH = require('../internals/well-known-symbol')('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","var anObject = require('../internals/an-object');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/bind-context');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar BREAK = {};\n\nvar exports = module.exports = function (iterable, fn, that, ENTRIES, ITERATOR) {\n  var boundFunction = bind(fn, that, ENTRIES ? 2 : 1);\n  var iterator, iterFn, index, length, result, step;\n\n  if (ITERATOR) {\n    iterator = iterable;\n  } else {\n    iterFn = getIteratorMethod(iterable);\n    if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n    // optimisation for array iterators\n    if (isArrayIteratorMethod(iterFn)) {\n      for (index = 0, length = toLength(iterable.length); length > index; index++) {\n        result = ENTRIES ? boundFunction(anObject(step = iterable[index])[0], step[1]) : boundFunction(iterable[index]);\n        if (result === BREAK) return BREAK;\n      } return;\n    }\n    iterator = iterFn.call(iterable);\n  }\n\n  while (!(step = iterator.next()).done) {\n    if (callWithSafeIterationClosing(iterator, boundFunction, step.value, ENTRIES) === BREAK) return BREAK;\n  }\n};\n\nexports.BREAK = BREAK;\n","'use strict';\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar hide = require('../internals/hide');\nvar has = require('../internals/has');\nvar IS_PURE = require('../internals/is-pure');\nvar ITERATOR = require('../internals/well-known-symbol')('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n  arrayIterator = [].keys();\n  // Safari 8 has buggy iterators w/o `next`\n  if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n  else {\n    PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n    if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n  }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n\nmodule.exports = {\n  IteratorPrototype: IteratorPrototype,\n  BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","module.exports = {};\n","// Chrome 38 Symbol has incorrect toString conversion\nmodule.exports = !require('../internals/fails')(function () {\n  // eslint-disable-next-line no-undef\n  return !String(Symbol());\n});\n","var nativeFunctionToString = require('../internals/function-to-string');\nvar WeakMap = require('../internals/global').WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(nativeFunctionToString.call(WeakMap));\n","var globalIsFinite = require('../internals/global').isFinite;\n\n// `Number.isFinite` method\n// https://tc39.github.io/ecma262/#sec-number.isfinite\nmodule.exports = Number.isFinite || function isFinite(it) {\n  return typeof it == 'number' && globalIsFinite(it);\n};\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar nativeAssign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !nativeAssign || require('../internals/fails')(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var symbol = Symbol();\n  var alphabet = 'abcdefghijklmnopqrst';\n  A[symbol] = 7;\n  alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n  return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var argumentsLength = arguments.length;\n  var index = 1;\n  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n  var propertyIsEnumerable = propertyIsEnumerableModule.f;\n  while (argumentsLength > index) {\n    var S = IndexedObject(arguments[index++]);\n    var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) if (propertyIsEnumerable.call(S, key = keys[j++])) T[key] = S[key];\n  } return T;\n} : nativeAssign;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar IE_PROTO = require('../internals/shared-key')('IE_PROTO');\nvar PROTOTYPE = 'prototype';\nvar Empty = function () { /* empty */ };\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = documentCreateElement('iframe');\n  var length = enumBugKeys.length;\n  var lt = '<';\n  var script = 'script';\n  var gt = '>';\n  var js = 'java' + script + ':';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  html.appendChild(iframe);\n  iframe.src = String(js);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : defineProperties(result, Properties);\n};\n\nrequire('../internals/hidden-keys')[IE_PROTO] = true;\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = objectKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var key;\n  while (length > i) definePropertyModule.f(O, key = keys[i++], Properties[key]);\n  return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar nativeDefineProperty = Object.defineProperty;\n\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return nativeDefineProperty(O, P, Attributes);\n  } catch (error) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n  O = toIndexedObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return nativeGetOwnPropertyDescriptor(O, P);\n  } catch (error) { /* empty */ }\n  if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n  try {\n    return nativeGetOwnPropertyNames(it);\n  } catch (error) {\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n  return windowNames && toString.call(it) == '[object Window]'\n    ? getWindowNames(it)\n    : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar hiddenKeys = require('../internals/enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return internalObjectKeys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('../internals/has');\nvar toObject = require('../internals/to-object');\nvar IE_PROTO = require('../internals/shared-key')('IE_PROTO');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\nvar ObjectPrototype = Object.prototype;\n\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectPrototype : null;\n};\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayIndexOf = require('../internals/array-includes')(false);\nvar hiddenKeys = require('../internals/hidden-keys');\n\nmodule.exports = function (object, names) {\n  var O = toIndexedObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n  return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = nativeGetOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n  var descriptor = nativeGetOwnPropertyDescriptor(this, V);\n  return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar validateSetPrototypeOfArguments = require('../internals/validate-set-prototype-of-arguments');\n\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n  var correctSetter = false;\n  var test = {};\n  var setter;\n  try {\n    setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n    setter.call(test, []);\n    correctSetter = test instanceof Array;\n  } catch (error) { /* empty */ }\n  return function setPrototypeOf(O, proto) {\n    validateSetPrototypeOfArguments(O, proto);\n    if (correctSetter) setter.call(O, proto);\n    else O.__proto__ = proto;\n    return O;\n  };\n}() : undefined);\n","var objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\n// TO_ENTRIES: true  -> Object.entries\n// TO_ENTRIES: false -> Object.values\nmodule.exports = function (it, TO_ENTRIES) {\n  var O = toIndexedObject(it);\n  var keys = objectKeys(O);\n  var length = keys.length;\n  var i = 0;\n  var result = [];\n  var key;\n  while (length > i) if (propertyIsEnumerable.call(O, key = keys[i++])) {\n    result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n  } return result;\n};\n","'use strict';\nvar classof = require('../internals/classof');\nvar TO_STRING_TAG = require('../internals/well-known-symbol')('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = String(test) !== '[object z]' ? function toString() {\n  return '[object ' + classof(this) + ']';\n} : test.toString;\n","var getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\nvar Reflect = require('../internals/global').Reflect;\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n  var keys = getOwnPropertyNamesModule.f(anObject(it));\n  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n  return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","var nativeParseFloat = require('../internals/global').parseFloat;\nvar internalStringTrim = require('../internals/string-trim');\nvar whitespaces = require('../internals/whitespaces');\nvar FORCED = 1 / nativeParseFloat(whitespaces + '-0') !== -Infinity;\n\nmodule.exports = FORCED ? function parseFloat(str) {\n  var string = internalStringTrim(String(str), 3);\n  var result = nativeParseFloat(string);\n  return result === 0 && string.charAt(0) == '-' ? -0 : result;\n} : nativeParseFloat;\n","var nativeParseInt = require('../internals/global').parseInt;\nvar internalStringTrim = require('../internals/string-trim');\nvar whitespaces = require('../internals/whitespaces');\nvar hex = /^[-+]?0[xX]/;\nvar FORCED = nativeParseInt(whitespaces + '08') !== 8 || nativeParseInt(whitespaces + '0x16') !== 22;\n\nmodule.exports = FORCED ? function parseInt(str, radix) {\n  var string = internalStringTrim(String(str), 3);\n  return nativeParseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));\n} : nativeParseInt;\n","module.exports = require('../internals/global');\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n  for (var key in src) redefine(target, key, src[key], options);\n  return target;\n};\n","var global = require('../internals/global');\nvar hide = require('../internals/hide');\nvar has = require('../internals/has');\nvar setGlobal = require('../internals/set-global');\nvar nativeFunctionToString = require('../internals/function-to-string');\nvar InternalStateModule = require('../internals/internal-state');\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(nativeFunctionToString).split('toString');\n\nrequire('../internals/shared')('inspectSource', function (it) {\n  return nativeFunctionToString.call(it);\n});\n\n(module.exports = function (O, key, value, options) {\n  var unsafe = options ? !!options.unsafe : false;\n  var simple = options ? !!options.enumerable : false;\n  var noTargetGet = options ? !!options.noTargetGet : false;\n  if (typeof value == 'function') {\n    if (typeof key == 'string' && !has(value, 'name')) hide(value, 'name', key);\n    enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n  }\n  if (O === global) {\n    if (simple) O[key] = value;\n    else setGlobal(key, value);\n    return;\n  } else if (!unsafe) {\n    delete O[key];\n  } else if (!noTargetGet && O[key]) {\n    simple = true;\n  }\n  if (simple) O[key] = value;\n  else hide(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n  return typeof this == 'function' && getInternalState(this).source || nativeFunctionToString.call(this);\n});\n","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n  var exec = R.exec;\n  if (typeof exec === 'function') {\n    var result = exec.call(R, S);\n    if (typeof result !== 'object') {\n      throw TypeError('RegExp exec method returned something other than an Object or null');\n    }\n    return result;\n  }\n\n  if (classof(R) !== 'RegExp') {\n    throw TypeError('RegExp#exec called on incompatible receiver');\n  }\n\n  return regexpExec.call(R, S);\n};\n\n","'use strict';\n\nvar regexpFlags = require('./regexp-flags');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n  var re1 = /a/;\n  var re2 = /b*/g;\n  nativeExec.call(re1, 'a');\n  nativeExec.call(re2, 'a');\n  return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n  patchedExec = function exec(str) {\n    var re = this;\n    var lastIndex, reCopy, match, i;\n\n    if (NPCG_INCLUDED) {\n      reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n    }\n    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n    match = nativeExec.call(re, str);\n\n    if (UPDATES_LAST_INDEX_WRONG && match) {\n      re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n    }\n    if (NPCG_INCLUDED && match && match.length > 1) {\n      // Fix browsers whose `exec` methods don't consistently return `undefined`\n      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n      nativeReplace.call(match[0], reCopy, function () {\n        for (i = 1; i < arguments.length - 2; i++) {\n          if (arguments[i] === undefined) match[i] = undefined;\n        }\n      });\n    }\n\n    return match;\n  };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n  return it;\n};\n","// `SameValueZero` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevaluezero\nmodule.exports = function (x, y) {\n  // eslint-disable-next-line no-self-compare\n  return x === y || x != x && y != y;\n};\n","// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\nmodule.exports = Object.is || function is(x, y) {\n  // eslint-disable-next-line no-self-compare\n  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","var global = require('../internals/global');\nvar hide = require('../internals/hide');\n\nmodule.exports = function (key, value) {\n  try {\n    hide(global, key, value);\n  } catch (error) {\n    global[key] = value;\n  } return value;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar SPECIES = require('../internals/well-known-symbol')('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n  var C = getBuiltIn(CONSTRUCTOR_NAME);\n  var defineProperty = definePropertyModule.f;\n  if (DESCRIPTORS && C && !C[SPECIES]) defineProperty(C, SPECIES, {\n    configurable: true,\n    get: function () { return this; }\n  });\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar has = require('../internals/has');\nvar TO_STRING_TAG = require('../internals/well-known-symbol')('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n  if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n    defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n  }\n};\n","var shared = require('../internals/shared')('keys');\nvar uid = require('../internals/uid');\n\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: '3.0.1',\n  mode: require('../internals/is-pure') ? 'pure' : 'global',\n  copyright: 'Â© 2019 Denis Pushkarev (zloirock.ru)'\n});\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n  var method = [][METHOD_NAME];\n  return !method || !fails(function () {\n    // eslint-disable-next-line no-useless-call,no-throw-literal\n    method.call(null, argument || function () { throw 1; }, 1);\n  });\n};\n","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar SPECIES = require('../internals/well-known-symbol')('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","var toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n// CONVERT_TO_STRING: true  -> String#at\n// CONVERT_TO_STRING: false -> String#codePointAt\nmodule.exports = function (that, pos, CONVERT_TO_STRING) {\n  var S = String(requireObjectCoercible(that));\n  var position = toInteger(pos);\n  var size = S.length;\n  var first, second;\n  if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n  first = S.charCodeAt(position);\n  return first < 0xD800 || first > 0xDBFF || position + 1 === size\n    || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n      ? CONVERT_TO_STRING ? S.charAt(position) : first\n      : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n};\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('../internals/to-length');\nvar repeat = require('../internals/string-repeat');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n  var S = String(requireObjectCoercible(that));\n  var stringLength = S.length;\n  var fillStr = fillString === undefined ? ' ' : String(fillString);\n  var intMaxLength = toLength(maxLength);\n  var fillLen, stringFiller;\n  if (intMaxLength <= stringLength || fillStr == '') return S;\n  fillLen = intMaxLength - stringLength;\n  stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n  return left ? stringFiller + S : S + stringFiller;\n};\n","'use strict';\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nmodule.exports = ''.repeat || function repeat(count) {\n  var str = String(requireObjectCoercible(this));\n  var result = '';\n  var n = toInteger(count);\n  if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n  for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n  return result;\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\nvar whitespace = '[' + require('../internals/whitespaces') + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// 1 -> String#trimStart\n// 2 -> String#trimEnd\n// 3 -> String#trim\nmodule.exports = function (string, TYPE) {\n  string = String(requireObjectCoercible(string));\n  if (TYPE & 1) string = string.replace(ltrim, '');\n  if (TYPE & 2) string = string.replace(rtrim, '');\n  return string;\n};\n","var classof = require('../internals/classof-raw');\n\n// `thisNumberValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-thisnumbervalue\nmodule.exports = function (value) {\n  if (typeof value != 'number' && classof(value) != 'Number') {\n    throw TypeError('Incorrect invocation');\n  }\n  return +value;\n};\n","var toInteger = require('../internals/to-integer');\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(length, length).\nmodule.exports = function (index, length) {\n  var integer = toInteger(index);\n  return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n  return IndexedObject(requireObjectCoercible(it));\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n  return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var toInteger = require('../internals/to-integer');\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n  return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n  return Object(requireObjectCoercible(argument));\n};\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('../internals/is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + postfix).toString(36));\n};\n","var global = require('../internals/global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","var isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\n\nmodule.exports = function (O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) {\n    throw TypeError(\"Can't set \" + String(proto) + ' as a prototype');\n  }\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('../internals/is-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (that, searchString, NAME) {\n  if (isRegExp(searchString)) {\n    throw TypeError('String.prototype.' + NAME + \" doesn't accept regex\");\n  } return String(requireObjectCoercible(that));\n};\n","// https://github.com/zloirock/core-js/issues/280\nvar userAgent = require('../internals/user-agent');\n\n// eslint-disable-next-line unicorn/no-unsafe-regex\nmodule.exports = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n","var store = require('../internals/shared')('wks');\nvar uid = require('../internals/uid');\nvar Symbol = require('../internals/global').Symbol;\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = function (name) {\n  return store[name] || (store[name] = NATIVE_SYMBOL && Symbol[name]\n    || (NATIVE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n","// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","exports.f = require('../internals/well-known-symbol');\n","'use strict';\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar IS_CONCAT_SPREADABLE = require('../internals/well-known-symbol')('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\nvar IS_CONCAT_SPREADABLE_SUPPORT = !require('../internals/fails')(function () {\n  var array = [];\n  array[IS_CONCAT_SPREADABLE] = false;\n  return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = require('../internals/array-method-has-species-support')('concat');\n\nvar isConcatSpreadable = function (O) {\n  if (!isObject(O)) return false;\n  var spreadable = O[IS_CONCAT_SPREADABLE];\n  return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\nrequire('../internals/export')({ target: 'Array', proto: true, forced: FORCED }, {\n  concat: function concat(arg) { // eslint-disable-line no-unused-vars\n    var O = toObject(this);\n    var A = arraySpeciesCreate(O, 0);\n    var n = 0;\n    var i, k, length, len, E;\n    for (i = -1, length = arguments.length; i < length; i++) {\n      E = i === -1 ? O : arguments[i];\n      if (isConcatSpreadable(E)) {\n        len = toLength(E.length);\n        if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n        for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n      } else {\n        if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n        createProperty(A, n++, E);\n      }\n    }\n    A.length = n;\n    return A;\n  }\n});\n","// `Array.prototype.copyWithin` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin\nrequire('../internals/export')({ target: 'Array', proto: true }, {\n  copyWithin: require('../internals/array-copy-within')\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nrequire('../internals/add-to-unscopables')('copyWithin');\n","'use strict';\nvar internalEvery = require('../internals/array-methods')(4);\n\nvar SLOPPY_METHOD = require('../internals/sloppy-array-method')('every');\n\n// `Array.prototype.every` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.every\nrequire('../internals/export')({ target: 'Array', proto: true, forced: SLOPPY_METHOD }, {\n  every: function every(callbackfn /* , thisArg */) {\n    return internalEvery(this, callbackfn, arguments[1]);\n  }\n});\n","// `Array.prototype.fill` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.fill\nrequire('../internals/export')({ target: 'Array', proto: true }, { fill: require('../internals/array-fill') });\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nrequire('../internals/add-to-unscopables')('fill');\n","'use strict';\nvar internalFilter = require('../internals/array-methods')(2);\n\nvar SPECIES_SUPPORT = require('../internals/array-method-has-species-support')('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\nrequire('../internals/export')({ target: 'Array', proto: true, forced: !SPECIES_SUPPORT }, {\n  filter: function filter(callbackfn /* , thisArg */) {\n    return internalFilter(this, callbackfn, arguments[1]);\n  }\n});\n","'use strict';\nvar internalFindIndex = require('../internals/array-methods')(6);\nvar FIND_INDEX = 'findIndex';\nvar SKIPS_HOLES = true;\n\n// Shouldn't skip holes\nif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.findIndex` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.findindex\nrequire('../internals/export')({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {\n  findIndex: function findIndex(callbackfn /* , that = undefined */) {\n    return internalFindIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nrequire('../internals/add-to-unscopables')(FIND_INDEX);\n","'use strict';\nvar internalFind = require('../internals/array-methods')(5);\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\nrequire('../internals/export')({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {\n  find: function find(callbackfn /* , that = undefined */) {\n    return internalFind(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nrequire('../internals/add-to-unscopables')(FIND);\n","'use strict';\nvar flattenIntoArray = require('../internals/flatten-into-array');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar aFunction = require('../internals/a-function');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.flatMap` method\n// https://github.com/tc39/proposal-flatMap\nrequire('../internals/export')({ target: 'Array', proto: true }, {\n  flatMap: function flatMap(callbackfn /* , thisArg */) {\n    var O = toObject(this);\n    var sourceLen = toLength(O.length);\n    var A;\n    aFunction(callbackfn);\n    A = arraySpeciesCreate(O, 0);\n    A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments[1]);\n    return A;\n  }\n});\n","'use strict';\nvar flattenIntoArray = require('../internals/flatten-into-array');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toInteger = require('../internals/to-integer');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.flat` method\n// https://github.com/tc39/proposal-flatMap\nrequire('../internals/export')({ target: 'Array', proto: true }, {\n  flat: function flat(/* depthArg = 1 */) {\n    var depthArg = arguments[0];\n    var O = toObject(this);\n    var sourceLen = toLength(O.length);\n    var A = arraySpeciesCreate(O, 0);\n    A.length = flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));\n    return A;\n  }\n});\n","'use strict';\nvar forEach = require('../internals/array-for-each');\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nrequire('../internals/export')({ target: 'Array', proto: true, forced: [].forEach != forEach }, { forEach: forEach });\n","var INCORRECT_ITERATION = !require('../internals/check-correctness-of-iteration')(function (iterable) {\n  Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\nrequire('../internals/export')({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n  from: require('../internals/array-from')\n});\n","'use strict';\nvar internalIncludes = require('../internals/array-includes')(true);\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nrequire('../internals/export')({ target: 'Array', proto: true }, {\n  includes: function includes(el /* , fromIndex = 0 */) {\n    return internalIncludes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nrequire('../internals/add-to-unscopables')('includes');\n","'use strict';\nvar internalIndexOf = require('../internals/array-includes')(false);\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar SLOPPY_METHOD = require('../internals/sloppy-array-method')('indexOf');\n\n// `Array.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\nrequire('../internals/export')({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || SLOPPY_METHOD }, {\n  indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n    return NEGATIVE_ZERO\n      // convert -0 to +0\n      ? nativeIndexOf.apply(this, arguments) || 0\n      : internalIndexOf(this, searchElement, arguments[1]);\n  }\n});\n","// `Array.isArray` method\n// https://tc39.github.io/ecma262/#sec-array.isarray\nrequire('../internals/export')({ target: 'Array', stat: true }, { isArray: require('../internals/is-array') });\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n  setInternalState(this, {\n    type: ARRAY_ITERATOR,\n    target: toIndexedObject(iterated), // target\n    index: 0,                          // next index\n    kind: kind                         // kind\n  });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n  var state = getInternalState(this);\n  var target = state.target;\n  var kind = state.kind;\n  var index = state.index++;\n  if (!target || index >= target.length) {\n    state.target = undefined;\n    return { value: undefined, done: true };\n  }\n  if (kind == 'keys') return { value: index, done: false };\n  if (kind == 'values') return { value: target[index], done: false };\n  return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar nativeJoin = [].join;\n\nvar ES3_STRINGS = require('../internals/indexed-object') != Object;\nvar SLOPPY_METHOD = require('../internals/sloppy-array-method')('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.join\nrequire('../internals/export')({ target: 'Array', proto: true, forced: ES3_STRINGS || SLOPPY_METHOD }, {\n  join: function join(separator) {\n    return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n  }\n});\n","var arrayLastIndexOf = require('../internals/array-last-index-of');\n\n// `Array.prototype.lastIndexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\nrequire('../internals/export')({ target: 'Array', proto: true, forced: arrayLastIndexOf !== [].lastIndexOf }, {\n  lastIndexOf: arrayLastIndexOf\n});\n","'use strict';\nvar internalMap = require('../internals/array-methods')(1);\n\nvar SPECIES_SUPPORT = require('../internals/array-method-has-species-support')('map');\n\n// `Array.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// with adding support of @@species\nrequire('../internals/export')({ target: 'Array', proto: true, forced: !SPECIES_SUPPORT }, {\n  map: function map(callbackfn /* , thisArg */) {\n    return internalMap(this, callbackfn, arguments[1]);\n  }\n});\n","'use strict';\nvar createProperty = require('../internals/create-property');\n\nvar ISNT_GENERIC = require('../internals/fails')(function () {\n  function F() { /* empty */ }\n  return !(Array.of.call(F) instanceof F);\n});\n\n// `Array.of` method\n// https://tc39.github.io/ecma262/#sec-array.of\n// WebKit Array.of isn't generic\nrequire('../internals/export')({ target: 'Array', stat: true, forced: ISNT_GENERIC }, {\n  of: function of(/* ...args */) {\n    var index = 0;\n    var argumentsLength = arguments.length;\n    var result = new (typeof this == 'function' ? this : Array)(argumentsLength);\n    while (argumentsLength > index) createProperty(result, index, arguments[index++]);\n    result.length = argumentsLength;\n    return result;\n  }\n});\n","'use strict';\nvar internalReduceRight = require('../internals/array-reduce');\n\nvar SLOPPY_METHOD = require('../internals/sloppy-array-method')('reduceRight');\n\n// `Array.prototype.reduceRight` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\nrequire('../internals/export')({ target: 'Array', proto: true, forced: SLOPPY_METHOD }, {\n  reduceRight: function reduceRight(callbackfn /* , initialValue */) {\n    return internalReduceRight(this, callbackfn, arguments.length, arguments[1], true);\n  }\n});\n","'use strict';\nvar internalReduce = require('../internals/array-reduce');\n\nvar SLOPPY_METHOD = require('../internals/sloppy-array-method')('reduce');\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\nrequire('../internals/export')({ target: 'Array', proto: true, forced: SLOPPY_METHOD }, {\n  reduce: function reduce(callbackfn /* , initialValue */) {\n    return internalReduce(this, callbackfn, arguments.length, arguments[1], false);\n  }\n});\n","'use strict';\nvar isArray = require('../internals/is-array');\nvar nativeReverse = [].reverse;\nvar test = [1, 2];\n\n// `Array.prototype.reverse` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reverse\n// fix for Safari 12.0 bug\n// https://bugs.webkit.org/show_bug.cgi?id=188794\nrequire('../internals/export')({ target: 'Array', proto: true, forced: String(test) === String(test.reverse()) }, {\n  reverse: function reverse() {\n    if (isArray(this)) this.length = this.length;\n    return nativeReverse.call(this);\n  }\n});\n","'use strict';\nvar isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar createProperty = require('../internals/create-property');\nvar SPECIES = require('../internals/well-known-symbol')('species');\nvar nativeSlice = [].slice;\nvar max = Math.max;\n\nvar SPECIES_SUPPORT = require('../internals/array-method-has-species-support')('slice');\n\n// `Array.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\nrequire('../internals/export')({ target: 'Array', proto: true, forced: !SPECIES_SUPPORT }, {\n  slice: function slice(start, end) {\n    var O = toIndexedObject(this);\n    var length = toLength(O.length);\n    var k = toAbsoluteIndex(start, length);\n    var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n    // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n    var Constructor, result, n;\n    if (isArray(O)) {\n      Constructor = O.constructor;\n      // cross-realm fallback\n      if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n        Constructor = undefined;\n      } else if (isObject(Constructor)) {\n        Constructor = Constructor[SPECIES];\n        if (Constructor === null) Constructor = undefined;\n      }\n      if (Constructor === Array || Constructor === undefined) {\n        return nativeSlice.call(O, k, fin);\n      }\n    }\n    result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));\n    for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n    result.length = n;\n    return result;\n  }\n});\n","'use strict';\nvar internalSome = require('../internals/array-methods')(3);\n\nvar SLOPPY_METHOD = require('../internals/sloppy-array-method')('some');\n\n// `Array.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\nrequire('../internals/export')({ target: 'Array', proto: true, forced: SLOPPY_METHOD }, {\n  some: function some(callbackfn /* , thisArg */) {\n    return internalSome(this, callbackfn, arguments[1]);\n  }\n});\n","'use strict';\nvar aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar fails = require('../internals/fails');\nvar nativeSort = [].sort;\nvar test = [1, 2, 3];\n\n// IE8-\nvar FAILS_ON_UNDEFINED = fails(function () {\n  test.sort(undefined);\n});\n// V8 bug\nvar FAILS_ON_NULL = fails(function () {\n  test.sort(null);\n});\n// Old WebKit\nvar SLOPPY_METHOD = require('../internals/sloppy-array-method')('sort');\n\nvar FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || SLOPPY_METHOD;\n\n// `Array.prototype.sort` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.sort\nrequire('../internals/export')({ target: 'Array', proto: true, forced: FORCED }, {\n  sort: function sort(comparefn) {\n    return comparefn === undefined\n      ? nativeSort.call(toObject(this))\n      : nativeSort.call(toObject(this), aFunction(comparefn));\n  }\n});\n","// `Array[@@species]` getter\n// https://tc39.github.io/ecma262/#sec-get-array-@@species\nrequire('../internals/set-species')('Array');\n","'use strict';\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toObject = require('../internals/to-object');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar createProperty = require('../internals/create-property');\nvar max = Math.max;\nvar min = Math.min;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\nvar SPECIES_SUPPORT = require('../internals/array-method-has-species-support')('splice');\n\n// `Array.prototype.splice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\nrequire('../internals/export')({ target: 'Array', proto: true, forced: !SPECIES_SUPPORT }, {\n  splice: function splice(start, deleteCount /* , ...items */) {\n    var O = toObject(this);\n    var len = toLength(O.length);\n    var actualStart = toAbsoluteIndex(start, len);\n    var argumentsLength = arguments.length;\n    var insertCount, actualDeleteCount, A, k, from, to;\n    if (argumentsLength === 0) {\n      insertCount = actualDeleteCount = 0;\n    } else if (argumentsLength === 1) {\n      insertCount = 0;\n      actualDeleteCount = len - actualStart;\n    } else {\n      insertCount = argumentsLength - 2;\n      actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\n    }\n    if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\n      throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n    }\n    A = arraySpeciesCreate(O, actualDeleteCount);\n    for (k = 0; k < actualDeleteCount; k++) {\n      from = actualStart + k;\n      if (from in O) createProperty(A, k, O[from]);\n    }\n    A.length = actualDeleteCount;\n    if (insertCount < actualDeleteCount) {\n      for (k = actualStart; k < len - actualDeleteCount; k++) {\n        from = k + actualDeleteCount;\n        to = k + insertCount;\n        if (from in O) O[to] = O[from];\n        else delete O[to];\n      }\n      for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n    } else if (insertCount > actualDeleteCount) {\n      for (k = len - actualDeleteCount; k > actualStart; k--) {\n        from = k + actualDeleteCount - 1;\n        to = k + insertCount - 1;\n        if (from in O) O[to] = O[from];\n        else delete O[to];\n      }\n    }\n    for (k = 0; k < insertCount; k++) {\n      O[k + actualStart] = arguments[k + 2];\n    }\n    O.length = len - actualDeleteCount + insertCount;\n    return A;\n  }\n});\n","// this method was added to unscopables after implementation\n// in popular engines, so it's moved to a separate module\nrequire('../internals/add-to-unscopables')('flatMap');\n","// this method was added to unscopables after implementation\n// in popular engines, so it's moved to a separate module\nrequire('../internals/add-to-unscopables')('flat');\n","// JSON[@@toStringTag] property\n// https://tc39.github.io/ecma262/#sec-json-@@tostringtag\nrequire('../internals/set-to-string-tag')(require('../internals/global').JSON, 'JSON', true);\n","'use strict';\n// `Map` constructor\n// https://tc39.github.io/ecma262/#sec-map-objects\nmodule.exports = require('../internals/collection')('Map', function (get) {\n  return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, require('../internals/collection-strong'), true);\n","// Math[@@toStringTag] property\n// https://tc39.github.io/ecma262/#sec-math-@@tostringtag\nrequire('../internals/set-to-string-tag')(Math, 'Math', true);\n","'use strict';\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof-raw');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar toPrimitive = require('../internals/to-primitive');\nvar fails = require('../internals/fails');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar internalStringTrim = require('../internals/string-trim');\nvar NUMBER = 'Number';\nvar NativeNumber = global[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\n\n// Opera ~12 has broken Object#toString\nvar BROKEN_CLASSOF = classof(require('../internals/object-create')(NumberPrototype)) == NUMBER;\nvar NATIVE_TRIM = 'trim' in String.prototype;\n\n// `ToNumber` abstract operation\n// https://tc39.github.io/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n  var it = toPrimitive(argument, false);\n  var first, third, radix, maxCode, digits, length, i, code;\n  if (typeof it == 'string' && it.length > 2) {\n    it = NATIVE_TRIM ? it.trim() : internalStringTrim(it, 3);\n    first = it.charCodeAt(0);\n    if (first === 43 || first === 45) {\n      third = it.charCodeAt(2);\n      if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n    } else if (first === 48) {\n      switch (it.charCodeAt(1)) {\n        case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i\n        case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n        default: return +it;\n      }\n      digits = it.slice(2);\n      length = digits.length;\n      for (i = 0; i < length; i++) {\n        code = digits.charCodeAt(i);\n        // parseInt parses a string to a first unavailable symbol\n        // but ToNumber should return NaN if a string contains unavailable symbols\n        if (code < 48 || code > maxCode) return NaN;\n      } return parseInt(digits, radix);\n    }\n  } return +it;\n};\n\n// `Number` constructor\n// https://tc39.github.io/ecma262/#sec-number-constructor\nif (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n  var NumberWrapper = function Number(value) {\n    var it = arguments.length < 1 ? 0 : value;\n    var that = this;\n    return that instanceof NumberWrapper\n      // check on 1..constructor(foo) case\n      && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(that); }) : classof(that) != NUMBER)\n        ? inheritIfRequired(new NativeNumber(toNumber(it)), that, NumberWrapper) : toNumber(it);\n  };\n  for (var keys = require('../internals/descriptors') ? getOwnPropertyNames(NativeNumber) : (\n    // ES3:\n    'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n    // ES2015 (in case, if modules with ES2015 Number statics required before):\n    'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n    'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n  ).split(','), j = 0, key; keys.length > j; j++) {\n    if (has(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) {\n      defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key));\n    }\n  }\n  NumberWrapper.prototype = NumberPrototype;\n  NumberPrototype.constructor = NumberWrapper;\n  require('../internals/redefine')(global, NUMBER, NumberWrapper);\n}\n","// `Number.EPSILON` constant\n// https://tc39.github.io/ecma262/#sec-number.epsilon\nrequire('../internals/export')({ target: 'Number', stat: true }, { EPSILON: Math.pow(2, -52) });\n","// `Number.isFinite` method\n// https://tc39.github.io/ecma262/#sec-number.isfinite\nrequire('../internals/export')({ target: 'Number', stat: true }, {\n  isFinite: require('../internals/number-is-finite')\n});\n","// `Number.isInteger` method\n// https://tc39.github.io/ecma262/#sec-number.isinteger\nrequire('../internals/export')({ target: 'Number', stat: true }, {\n  isInteger: require('../internals/is-integer')\n});\n","// `Number.isNaN` method\n// https://tc39.github.io/ecma262/#sec-number.isnan\nrequire('../internals/export')({ target: 'Number', stat: true }, {\n  isNaN: function isNaN(number) {\n    // eslint-disable-next-line no-self-compare\n    return number != number;\n  }\n});\n","var isInteger = require('../internals/is-integer');\nvar abs = Math.abs;\n\n// `Number.isSafeInteger` method\n// https://tc39.github.io/ecma262/#sec-number.issafeinteger\nrequire('../internals/export')({ target: 'Number', stat: true }, {\n  isSafeInteger: function isSafeInteger(number) {\n    return isInteger(number) && abs(number) <= 0x1FFFFFFFFFFFFF;\n  }\n});\n","// `Number.MAX_SAFE_INTEGER` constant\n// https://tc39.github.io/ecma262/#sec-number.max_safe_integer\nrequire('../internals/export')({ target: 'Number', stat: true }, { MAX_SAFE_INTEGER: 0x1FFFFFFFFFFFFF });\n","// `Number.MIN_SAFE_INTEGER` constant\n// https://tc39.github.io/ecma262/#sec-number.min_safe_integer\nrequire('../internals/export')({ target: 'Number', stat: true }, { MIN_SAFE_INTEGER: -0x1FFFFFFFFFFFFF });\n","var parseFloat = require('../internals/parse-float');\n\n// `Number.parseFloat` method\n// https://tc39.github.io/ecma262/#sec-number.parseFloat\nrequire('../internals/export')({ target: 'Number', stat: true, forced: Number.parseFloat != parseFloat }, {\n  parseFloat: parseFloat\n});\n","var parseInt = require('../internals/parse-int');\n\n// `Number.parseInt` method\n// https://tc39.github.io/ecma262/#sec-number.parseint\nrequire('../internals/export')({ target: 'Number', stat: true, forced: Number.parseInt != parseInt }, {\n  parseInt: parseInt\n});\n","'use strict';\nvar toInteger = require('../internals/to-integer');\nvar thisNumberValue = require('../internals/this-number-value');\nvar repeat = require('../internals/string-repeat');\nvar nativeToFixed = 1.0.toFixed;\nvar floor = Math.floor;\nvar data = [0, 0, 0, 0, 0, 0];\n\nvar multiply = function (n, c) {\n  var i = -1;\n  var c2 = c;\n  while (++i < 6) {\n    c2 += n * data[i];\n    data[i] = c2 % 1e7;\n    c2 = floor(c2 / 1e7);\n  }\n};\n\nvar divide = function (n) {\n  var i = 6;\n  var c = 0;\n  while (--i >= 0) {\n    c += data[i];\n    data[i] = floor(c / n);\n    c = (c % n) * 1e7;\n  }\n};\n\nvar numToString = function () {\n  var i = 6;\n  var s = '';\n  while (--i >= 0) {\n    if (s !== '' || i === 0 || data[i] !== 0) {\n      var t = String(data[i]);\n      s = s === '' ? t : s + repeat.call('0', 7 - t.length) + t;\n    }\n  } return s;\n};\n\nvar pow = function (x, n, acc) {\n  return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\n\nvar log = function (x) {\n  var n = 0;\n  var x2 = x;\n  while (x2 >= 4096) {\n    n += 12;\n    x2 /= 4096;\n  }\n  while (x2 >= 2) {\n    n += 1;\n    x2 /= 2;\n  } return n;\n};\n\n// `Number.prototype.toFixed` method\n// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\nrequire('../internals/export')({ target: 'Number', proto: true, forced: nativeToFixed && (\n  0.00008.toFixed(3) !== '0.000' ||\n  0.9.toFixed(0) !== '1' ||\n  1.255.toFixed(2) !== '1.25' ||\n  1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !require('../internals/fails')(function () {\n  // V8 ~ Android 4.3-\n  nativeToFixed.call({});\n}) }, {\n  toFixed: function toFixed(fractionDigits) {\n    var x = thisNumberValue(this);\n    var f = toInteger(fractionDigits);\n    var s = '';\n    var m = '0';\n    var e, z, j, k;\n    if (f < 0 || f > 20) throw RangeError('Incorrect fraction digits');\n    // eslint-disable-next-line no-self-compare\n    if (x != x) return 'NaN';\n    if (x <= -1e21 || x >= 1e21) return String(x);\n    if (x < 0) {\n      s = '-';\n      x = -x;\n    }\n    if (x > 1e-21) {\n      e = log(x * pow(2, 69, 1)) - 69;\n      z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);\n      z *= 0x10000000000000;\n      e = 52 - e;\n      if (e > 0) {\n        multiply(0, z);\n        j = f;\n        while (j >= 7) {\n          multiply(1e7, 0);\n          j -= 7;\n        }\n        multiply(pow(10, j, 1), 0);\n        j = e - 1;\n        while (j >= 23) {\n          divide(1 << 23);\n          j -= 23;\n        }\n        divide(1 << j);\n        multiply(1, 1);\n        divide(2);\n        m = numToString();\n      } else {\n        multiply(0, z);\n        multiply(1 << -e, 0);\n        m = numToString() + repeat.call('0', f);\n      }\n    }\n    if (f > 0) {\n      k = m.length;\n      m = s + (k <= f ? '0.' + repeat.call('0', f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));\n    } else {\n      m = s + m;\n    } return m;\n  }\n});\n","'use strict';\nvar fails = require('../internals/fails');\nvar thisNumberValue = require('../internals/this-number-value');\nvar nativeToPrecision = 1.0.toPrecision;\n\n// `Number.prototype.toPrecision` method\n// https://tc39.github.io/ecma262/#sec-number.prototype.toprecision\nrequire('../internals/export')({ target: 'Number', proto: true, forced: fails(function () {\n  // IE7-\n  return nativeToPrecision.call(1, undefined) !== '1';\n}) || !fails(function () {\n  // V8 ~ Android 4.3-\n  nativeToPrecision.call({});\n}) }, {\n  toPrecision: function toPrecision(precision) {\n    return precision === undefined\n      ? nativeToPrecision.call(thisNumberValue(this))\n      : nativeToPrecision.call(thisNumberValue(this), precision);\n  }\n});\n","var assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\nrequire('../internals/export')({ target: 'Object', stat: true, forced: Object.assign !== assign }, { assign: assign });\n","// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nrequire('../internals/export')({\n  target: 'Object', stat: true, sham: !require('../internals/descriptors')\n}, { create: require('../internals/object-create') });\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar aFunction = require('../internals/a-function');\nvar definePropertyModule = require('../internals/object-define-property');\nvar FORCED = require('../internals/forced-object-prototype-accessors-methods');\n\n// `Object.prototype.__defineGetter__` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.__defineGetter__\nif (require('../internals/descriptors')) {\n  require('../internals/export')({ target: 'Object', proto: true, forced: FORCED }, {\n    __defineGetter__: function __defineGetter__(P, getter) {\n      definePropertyModule.f(toObject(this), P, { get: aFunction(getter), enumerable: true, configurable: true });\n    }\n  });\n}\n","var DESCRIPTORS = require('../internals/descriptors');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nrequire('../internals/export')({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, {\n  defineProperties: require('../internals/object-define-properties')\n});\n","var DESCRIPTORS = require('../internals/descriptors');\n\n// `Object.defineProperty` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperty\nrequire('../internals/export')({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, {\n  defineProperty: require('../internals/object-define-property').f\n});\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar aFunction = require('../internals/a-function');\nvar definePropertyModule = require('../internals/object-define-property');\nvar FORCED = require('../internals/forced-object-prototype-accessors-methods');\n\n// `Object.prototype.__defineSetter__` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.__defineSetter__\nif (require('../internals/descriptors')) {\n  require('../internals/export')({ target: 'Object', proto: true, forced: FORCED }, {\n    __defineSetter__: function __defineSetter__(P, setter) {\n      definePropertyModule.f(toObject(this), P, { set: aFunction(setter), enumerable: true, configurable: true });\n    }\n  });\n}\n","var objectToArray = require('../internals/object-to-array');\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\nrequire('../internals/export')({ target: 'Object', stat: true }, {\n  entries: function entries(O) {\n    return objectToArray(O, true);\n  }\n});\n","var isObject = require('../internals/is-object');\nvar onFreeze = require('../internals/internal-metadata').onFreeze;\nvar nativeFreeze = Object.freeze;\nvar FREEZING = require('../internals/freezing');\nvar FAILS_ON_PRIMITIVES = require('../internals/fails')(function () { nativeFreeze(1); });\n\n// `Object.freeze` method\n// https://tc39.github.io/ecma262/#sec-object.freeze\nrequire('../internals/export')({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, {\n  freeze: function freeze(it) {\n    return nativeFreeze && isObject(it) ? nativeFreeze(onFreeze(it)) : it;\n  }\n});\n","var iterate = require('../internals/iterate');\nvar createProperty = require('../internals/create-property');\n\n// `Object.fromEntries` method\n// https://github.com/tc39/proposal-object-from-entries\nrequire('../internals/export')({ target: 'Object', stat: true }, {\n  fromEntries: function fromEntries(iterable) {\n    var obj = {};\n    iterate(iterable, function (k, v) {\n      createProperty(obj, k, v);\n    }, undefined, true);\n    return obj;\n  }\n});\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar DESCRIPTORS = require('../internals/descriptors');\nvar FAILS_ON_PRIMITIVES = require('../internals/fails')(function () { nativeGetOwnPropertyDescriptor(1); });\nvar FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nrequire('../internals/export')({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {\n  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n    return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);\n  }\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar ownKeys = require('../internals/own-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar createProperty = require('../internals/create-property');\n\n// `Object.getOwnPropertyDescriptors` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\nrequire('../internals/export')({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIndexedObject(object);\n    var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n    var keys = ownKeys(O);\n    var result = {};\n    var i = 0;\n    var key, descriptor;\n    while (keys.length > i) {\n      descriptor = getOwnPropertyDescriptor(O, key = keys[i++]);\n      if (descriptor !== undefined) createProperty(result, key, descriptor);\n    }\n    return result;\n  }\n});\n","var nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names-external').f;\nvar FAILS_ON_PRIMITIVES = require('../internals/fails')(function () { Object.getOwnPropertyNames(1); });\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nrequire('../internals/export')({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n  getOwnPropertyNames: nativeGetOwnPropertyNames\n});\n","var toObject = require('../internals/to-object');\nvar nativeGetPrototypeOf = require('../internals/object-get-prototype-of');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\nvar FAILS_ON_PRIMITIVES = require('../internals/fails')(function () { nativeGetPrototypeOf(1); });\n\n// `Object.getPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.getprototypeof\nrequire('../internals/export')({\n  target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !CORRECT_PROTOTYPE_GETTER\n}, {\n  getPrototypeOf: function getPrototypeOf(it) {\n    return nativeGetPrototypeOf(toObject(it));\n  }\n});\n\n","var isObject = require('../internals/is-object');\nvar nativeIsExtensible = Object.isExtensible;\nvar FAILS_ON_PRIMITIVES = require('../internals/fails')(function () { nativeIsExtensible(1); });\n\n// `Object.isExtensible` method\n// https://tc39.github.io/ecma262/#sec-object.isextensible\nrequire('../internals/export')({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n  isExtensible: function isExtensible(it) {\n    return isObject(it) ? nativeIsExtensible ? nativeIsExtensible(it) : true : false;\n  }\n});\n","var isObject = require('../internals/is-object');\nvar nativeIsFrozen = Object.isFrozen;\nvar FAILS_ON_PRIMITIVES = require('../internals/fails')(function () { nativeIsFrozen(1); });\n\n// `Object.isFrozen` method\n// https://tc39.github.io/ecma262/#sec-object.isfrozen\nrequire('../internals/export')({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n  isFrozen: function isFrozen(it) {\n    return isObject(it) ? nativeIsFrozen ? nativeIsFrozen(it) : false : true;\n  }\n});\n","var isObject = require('../internals/is-object');\nvar nativeIsSealed = Object.isSealed;\nvar FAILS_ON_PRIMITIVES = require('../internals/fails')(function () { nativeIsSealed(1); });\n\n// `Object.isSealed` method\n// https://tc39.github.io/ecma262/#sec-object.issealed\nrequire('../internals/export')({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n  isSealed: function isSealed(it) {\n    return isObject(it) ? nativeIsSealed ? nativeIsSealed(it) : false : true;\n  }\n});\n","// `Object.is` method\n// https://tc39.github.io/ecma262/#sec-object.is\nrequire('../internals/export')({ target: 'Object', stat: true }, { is: require('../internals/same-value') });\n","var toObject = require('../internals/to-object');\nvar nativeKeys = require('../internals/object-keys');\nvar FAILS_ON_PRIMITIVES = require('../internals/fails')(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\nrequire('../internals/export')({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n  keys: function keys(it) {\n    return nativeKeys(toObject(it));\n  }\n});\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar FORCED = require('../internals/forced-object-prototype-accessors-methods');\n\n// `Object.prototype.__lookupGetter__` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.__lookupGetter__\nif (require('../internals/descriptors')) {\n  require('../internals/export')({ target: 'Object', proto: true, forced: FORCED }, {\n    __lookupGetter__: function __lookupGetter__(P) {\n      var O = toObject(this);\n      var key = toPrimitive(P, true);\n      var desc;\n      do {\n        if (desc = getOwnPropertyDescriptor(O, key)) return desc.get;\n      } while (O = getPrototypeOf(O));\n    }\n  });\n}\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar FORCED = require('../internals/forced-object-prototype-accessors-methods');\n\n// `Object.prototype.__lookupSetter__` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.__lookupSetter__\nif (require('../internals/descriptors')) {\n  require('../internals/export')({ target: 'Object', proto: true, forced: FORCED }, {\n    __lookupSetter__: function __lookupSetter__(P) {\n      var O = toObject(this);\n      var key = toPrimitive(P, true);\n      var desc;\n      do {\n        if (desc = getOwnPropertyDescriptor(O, key)) return desc.set;\n      } while (O = getPrototypeOf(O));\n    }\n  });\n}\n","var isObject = require('../internals/is-object');\nvar onFreeze = require('../internals/internal-metadata').onFreeze;\nvar nativePreventExtensions = Object.preventExtensions;\nvar FREEZING = require('../internals/freezing');\nvar FAILS_ON_PRIMITIVES = require('../internals/fails')(function () { nativePreventExtensions(1); });\n\n// `Object.preventExtensions` method\n// https://tc39.github.io/ecma262/#sec-object.preventextensions\nrequire('../internals/export')({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, {\n  preventExtensions: function preventExtensions(it) {\n    return nativePreventExtensions && isObject(it) ? nativePreventExtensions(onFreeze(it)) : it;\n  }\n});\n","var isObject = require('../internals/is-object');\nvar onFreeze = require('../internals/internal-metadata').onFreeze;\nvar nativeSeal = Object.seal;\nvar FREEZING = require('../internals/freezing');\nvar FAILS_ON_PRIMITIVES = require('../internals/fails')(function () { nativeSeal(1); });\n\n// `Object.seal` method\n// https://tc39.github.io/ecma262/#sec-object.seal\nrequire('../internals/export')({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, {\n  seal: function seal(it) {\n    return nativeSeal && isObject(it) ? nativeSeal(onFreeze(it)) : it;\n  }\n});\n","// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\nrequire('../internals/export')({ target: 'Object', stat: true }, {\n  setPrototypeOf: require('../internals/object-set-prototype-of')\n});\n","var toString = require('../internals/object-to-string');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (toString !== ObjectPrototype.toString) {\n  require('../internals/redefine')(ObjectPrototype, 'toString', toString, { unsafe: true });\n}\n","var objectToArray = require('../internals/object-to-array');\n\n// `Object.values` method\n// https://tc39.github.io/ecma262/#sec-object.values\nrequire('../internals/export')({ target: 'Object', stat: true }, {\n  values: function values(O) {\n    return objectToArray(O);\n  }\n});\n","'use strict';\n// `Set` constructor\n// https://tc39.github.io/ecma262/#sec-set-objects\nmodule.exports = require('../internals/collection')('Set', function (get) {\n  return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, require('../internals/collection-strong'));\n","'use strict';\nvar createHTML = require('../internals/create-html');\nvar FORCED = require('../internals/forced-string-html-method')('anchor');\n\n// `String.prototype.anchor` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.anchor\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  anchor: function anchor(name) {\n    return createHTML(this, 'a', 'name', name);\n  }\n});\n","'use strict';\nvar createHTML = require('../internals/create-html');\nvar FORCED = require('../internals/forced-string-html-method')('big');\n\n// `String.prototype.big` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.big\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  big: function big() {\n    return createHTML(this, 'big', '', '');\n  }\n});\n","'use strict';\nvar createHTML = require('../internals/create-html');\nvar FORCED = require('../internals/forced-string-html-method')('blink');\n\n// `String.prototype.blink` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.blink\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  blink: function blink() {\n    return createHTML(this, 'blink', '', '');\n  }\n});\n","'use strict';\nvar createHTML = require('../internals/create-html');\nvar FORCED = require('../internals/forced-string-html-method')('bold');\n\n// `String.prototype.bold` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.bold\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  bold: function bold() {\n    return createHTML(this, 'b', '', '');\n  }\n});\n","'use strict';\nvar internalCodePointAt = require('../internals/string-at');\n\n// `String.prototype.codePointAt` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\nrequire('../internals/export')({ target: 'String', proto: true }, {\n  codePointAt: function codePointAt(pos) {\n    return internalCodePointAt(this, pos);\n  }\n});\n","'use strict';\nvar toLength = require('../internals/to-length');\nvar validateArguments = require('../internals/validate-string-method-arguments');\nvar ENDS_WITH = 'endsWith';\nvar nativeEndsWith = ''[ENDS_WITH];\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = require('../internals/correct-is-regexp-logic')(ENDS_WITH);\n\n// `String.prototype.endsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.endswith\nrequire('../internals/export')({ target: 'String', proto: true, forced: !CORRECT_IS_REGEXP_LOGIC }, {\n  endsWith: function endsWith(searchString /* , endPosition = @length */) {\n    var that = validateArguments(this, searchString, ENDS_WITH);\n    var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n    var len = toLength(that.length);\n    var end = endPosition === undefined ? len : min(toLength(endPosition), len);\n    var search = String(searchString);\n    return nativeEndsWith\n      ? nativeEndsWith.call(that, search, end)\n      : that.slice(end - search.length, end) === search;\n  }\n});\n","'use strict';\nvar createHTML = require('../internals/create-html');\nvar FORCED = require('../internals/forced-string-html-method')('fixed');\n\n// `String.prototype.fixed` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.fixed\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  fixed: function fixed() {\n    return createHTML(this, 'tt', '', '');\n  }\n});\n","'use strict';\nvar createHTML = require('../internals/create-html');\nvar FORCED = require('../internals/forced-string-html-method')('fontcolor');\n\n// `String.prototype.fontcolor` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.fontcolor\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  fontcolor: function fontcolor(color) {\n    return createHTML(this, 'font', 'color', color);\n  }\n});\n","'use strict';\nvar createHTML = require('../internals/create-html');\nvar FORCED = require('../internals/forced-string-html-method')('fontsize');\n\n// `String.prototype.fontsize` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.fontsize\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  fontsize: function fontsize(size) {\n    return createHTML(this, 'font', 'size', size);\n  }\n});\n","var toAbsoluteIndex = require('../internals/to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar nativeFromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\nvar INCORRECT_LENGTH = !!nativeFromCodePoint && nativeFromCodePoint.length != 1;\n\n// `String.fromCodePoint` method\n// https://tc39.github.io/ecma262/#sec-string.fromcodepoint\nrequire('../internals/export')({ target: 'String', stat: true, forced: INCORRECT_LENGTH }, {\n  fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n    var elements = [];\n    var length = arguments.length;\n    var i = 0;\n    var code;\n    while (length > i) {\n      code = +arguments[i++];\n      if (toAbsoluteIndex(code, 0x10FFFF) !== code) throw RangeError(code + ' is not a valid code point');\n      elements.push(code < 0x10000\n        ? fromCharCode(code)\n        : fromCharCode(((code -= 0x10000) >> 10) + 0xD800, code % 0x400 + 0xDC00)\n      );\n    } return elements.join('');\n  }\n});\n","'use strict';\nvar validateArguments = require('../internals/validate-string-method-arguments');\nvar INCLUDES = 'includes';\n\nvar CORRECT_IS_REGEXP_LOGIC = require('../internals/correct-is-regexp-logic')(INCLUDES);\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\nrequire('../internals/export')({ target: 'String', proto: true, forced: !CORRECT_IS_REGEXP_LOGIC }, {\n  includes: function includes(searchString /* , position = 0 */) {\n    return !!~validateArguments(this, searchString, INCLUDES)\n      .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n","'use strict';\nvar createHTML = require('../internals/create-html');\nvar FORCED = require('../internals/forced-string-html-method')('italics');\n\n// `String.prototype.italics` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.italics\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  italics: function italics() {\n    return createHTML(this, 'i', '', '');\n  }\n});\n","'use strict';\nvar codePointAt = require('../internals/string-at');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n  setInternalState(this, {\n    type: STRING_ITERATOR,\n    string: String(iterated),\n    index: 0\n  });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n  var state = getInternalState(this);\n  var string = state.string;\n  var index = state.index;\n  var point;\n  if (index >= string.length) return { value: undefined, done: true };\n  point = codePointAt(string, index, true);\n  state.index += point.length;\n  return { value: point, done: false };\n});\n","'use strict';\nvar createHTML = require('../internals/create-html');\nvar FORCED = require('../internals/forced-string-html-method')('link');\n\n// `String.prototype.link` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.link\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  link: function link(url) {\n    return createHTML(this, 'a', 'href', url);\n  }\n});\n","'use strict';\n\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nrequire('../internals/fix-regexp-well-known-symbol-logic')(\n  'match',\n  1,\n  function (MATCH, nativeMatch, maybeCallNative) {\n    return [\n      // `String.prototype.match` method\n      // https://tc39.github.io/ecma262/#sec-string.prototype.match\n      function match(regexp) {\n        var O = requireObjectCoercible(this);\n        var matcher = regexp == undefined ? undefined : regexp[MATCH];\n        return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n      },\n      // `RegExp.prototype[@@match]` method\n      // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n      function (regexp) {\n        var res = maybeCallNative(nativeMatch, regexp, this);\n        if (res.done) return res.value;\n\n        var rx = anObject(regexp);\n        var S = String(this);\n\n        if (!rx.global) return regExpExec(rx, S);\n\n        var fullUnicode = rx.unicode;\n        rx.lastIndex = 0;\n        var A = [];\n        var n = 0;\n        var result;\n        while ((result = regExpExec(rx, S)) !== null) {\n          var matchStr = String(result[0]);\n          A[n] = matchStr;\n          if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n          n++;\n        }\n        return n === 0 ? null : A;\n      }\n    ];\n  }\n);\n","'use strict';\nvar internalStringPad = require('../internals/string-pad');\nvar WEBKIT_BUG = require('../internals/webkit-string-pad-bug');\n\n// `String.prototype.padEnd` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.padend\nrequire('../internals/export')({ target: 'String', proto: true, forced: WEBKIT_BUG }, {\n  padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n    return internalStringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n  }\n});\n","'use strict';\nvar internalStringPad = require('../internals/string-pad');\nvar WEBKIT_BUG = require('../internals/webkit-string-pad-bug');\n\n// `String.prototype.padStart` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.padstart\nrequire('../internals/export')({ target: 'String', proto: true, forced: WEBKIT_BUG }, {\n  padStart: function padStart(maxLength /* , fillString = ' ' */) {\n    return internalStringPad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n  }\n});\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\n\n// `String.raw` method\n// https://tc39.github.io/ecma262/#sec-string.raw\nrequire('../internals/export')({ target: 'String', stat: true }, {\n  raw: function raw(template) {\n    var rawTemplate = toIndexedObject(template.raw);\n    var literalSegments = toLength(rawTemplate.length);\n    var argumentsLength = arguments.length;\n    var elements = [];\n    var i = 0;\n    while (literalSegments > i) {\n      elements.push(String(rawTemplate[i++]));\n      if (i < argumentsLength) elements.push(String(arguments[i]));\n    } return elements.join('');\n  }\n});\n","// `String.prototype.repeat` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nrequire('../internals/export')({ target: 'String', proto: true }, {\n  repeat: require('../internals/string-repeat')\n});\n","'use strict';\n\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n  return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nrequire('../internals/fix-regexp-well-known-symbol-logic')(\n  'replace',\n  2,\n  function (REPLACE, nativeReplace, maybeCallNative) {\n    return [\n      // `String.prototype.replace` method\n      // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n      function replace(searchValue, replaceValue) {\n        var O = requireObjectCoercible(this);\n        var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n        return replacer !== undefined\n          ? replacer.call(searchValue, O, replaceValue)\n          : nativeReplace.call(String(O), searchValue, replaceValue);\n      },\n      // `RegExp.prototype[@@replace]` method\n      // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n      function (regexp, replaceValue) {\n        var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n        if (res.done) return res.value;\n\n        var rx = anObject(regexp);\n        var S = String(this);\n\n        var functionalReplace = typeof replaceValue === 'function';\n        if (!functionalReplace) replaceValue = String(replaceValue);\n\n        var global = rx.global;\n        if (global) {\n          var fullUnicode = rx.unicode;\n          rx.lastIndex = 0;\n        }\n        var results = [];\n        while (true) {\n          var result = regExpExec(rx, S);\n          if (result === null) break;\n\n          results.push(result);\n          if (!global) break;\n\n          var matchStr = String(result[0]);\n          if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n        }\n\n        var accumulatedResult = '';\n        var nextSourcePosition = 0;\n        for (var i = 0; i < results.length; i++) {\n          result = results[i];\n\n          var matched = String(result[0]);\n          var position = max(min(toInteger(result.index), S.length), 0);\n          var captures = [];\n          // NOTE: This is equivalent to\n          //   captures = result.slice(1).map(maybeToString)\n          // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n          // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n          // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n          for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n          var namedCaptures = result.groups;\n          if (functionalReplace) {\n            var replacerArgs = [matched].concat(captures, position, S);\n            if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n            var replacement = String(replaceValue.apply(undefined, replacerArgs));\n          } else {\n            replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n          }\n          if (position >= nextSourcePosition) {\n            accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n            nextSourcePosition = position + matched.length;\n          }\n        }\n        return accumulatedResult + S.slice(nextSourcePosition);\n      }\n    ];\n\n    // https://tc39.github.io/ecma262/#sec-getsubstitution\n    function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n      var tailPos = position + matched.length;\n      var m = captures.length;\n      var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n      if (namedCaptures !== undefined) {\n        namedCaptures = toObject(namedCaptures);\n        symbols = SUBSTITUTION_SYMBOLS;\n      }\n      return nativeReplace.call(replacement, symbols, function (match, ch) {\n        var capture;\n        switch (ch.charAt(0)) {\n          case '$': return '$';\n          case '&': return matched;\n          case '`': return str.slice(0, position);\n          case \"'\": return str.slice(tailPos);\n          case '<':\n            capture = namedCaptures[ch.slice(1, -1)];\n            break;\n          default: // \\d\\d?\n            var n = +ch;\n            if (n === 0) return match;\n            if (n > m) {\n              var f = floor(n / 10);\n              if (f === 0) return match;\n              if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n              return match;\n            }\n            capture = captures[n - 1];\n        }\n        return capture === undefined ? '' : capture;\n      });\n    }\n  }\n);\n","'use strict';\n\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar sameValue = require('../internals/same-value');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@search logic\nrequire('../internals/fix-regexp-well-known-symbol-logic')(\n  'search',\n  1,\n  function (SEARCH, nativeSearch, maybeCallNative) {\n    return [\n      // `String.prototype.search` method\n      // https://tc39.github.io/ecma262/#sec-string.prototype.search\n      function search(regexp) {\n        var O = requireObjectCoercible(this);\n        var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n        return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n      },\n      // `RegExp.prototype[@@search]` method\n      // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n      function (regexp) {\n        var res = maybeCallNative(nativeSearch, regexp, this);\n        if (res.done) return res.value;\n\n        var rx = anObject(regexp);\n        var S = String(this);\n\n        var previousLastIndex = rx.lastIndex;\n        if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n        var result = regExpExec(rx, S);\n        if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n        return result === null ? -1 : result.index;\n      }\n    ];\n  }\n);\n","'use strict';\nvar createHTML = require('../internals/create-html');\nvar FORCED = require('../internals/forced-string-html-method')('small');\n\n// `String.prototype.small` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.small\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  small: function small() {\n    return createHTML(this, 'small', '', '');\n  }\n});\n","'use strict';\n\nvar isRegExp = require('../internals/is-regexp');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar callRegExpExec = require('../internals/regexp-exec-abstract');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nrequire('../internals/fix-regexp-well-known-symbol-logic')(\n  'split',\n  2,\n  function (SPLIT, nativeSplit, maybeCallNative) {\n    var internalSplit;\n    if (\n      'abbc'.split(/(b)*/)[1] == 'c' ||\n      'test'.split(/(?:)/, -1).length != 4 ||\n      'ab'.split(/(?:ab)*/).length != 2 ||\n      '.'.split(/(.?)(.?)/).length != 4 ||\n      '.'.split(/()()/).length > 1 ||\n      ''.split(/.?/).length\n    ) {\n      // based on es5-shim implementation, need to rework it\n      internalSplit = function (separator, limit) {\n        var string = String(requireObjectCoercible(this));\n        var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n        if (lim === 0) return [];\n        if (separator === undefined) return [string];\n        // If `separator` is not a regex, use native split\n        if (!isRegExp(separator)) {\n          return nativeSplit.call(string, separator, lim);\n        }\n        var output = [];\n        var flags = (separator.ignoreCase ? 'i' : '') +\n                    (separator.multiline ? 'm' : '') +\n                    (separator.unicode ? 'u' : '') +\n                    (separator.sticky ? 'y' : '');\n        var lastLastIndex = 0;\n        // Make `global` and avoid `lastIndex` issues by working with a copy\n        var separatorCopy = new RegExp(separator.source, flags + 'g');\n        var match, lastIndex, lastLength;\n        while (match = regexpExec.call(separatorCopy, string)) {\n          lastIndex = separatorCopy.lastIndex;\n          if (lastIndex > lastLastIndex) {\n            output.push(string.slice(lastLastIndex, match.index));\n            if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n            lastLength = match[0].length;\n            lastLastIndex = lastIndex;\n            if (output.length >= lim) break;\n          }\n          if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n        }\n        if (lastLastIndex === string.length) {\n          if (lastLength || !separatorCopy.test('')) output.push('');\n        } else output.push(string.slice(lastLastIndex));\n        return output.length > lim ? output.slice(0, lim) : output;\n      };\n    // Chakra, V8\n    } else if ('0'.split(undefined, 0).length) {\n      internalSplit = function (separator, limit) {\n        return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n      };\n    } else internalSplit = nativeSplit;\n\n    return [\n      // `String.prototype.split` method\n      // https://tc39.github.io/ecma262/#sec-string.prototype.split\n      function split(separator, limit) {\n        var O = requireObjectCoercible(this);\n        var splitter = separator == undefined ? undefined : separator[SPLIT];\n        return splitter !== undefined\n          ? splitter.call(separator, O, limit)\n          : internalSplit.call(String(O), separator, limit);\n      },\n      // `RegExp.prototype[@@split]` method\n      // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n      //\n      // NOTE: This cannot be properly polyfilled in engines that don't support\n      // the 'y' flag.\n      function (regexp, limit) {\n        var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n        if (res.done) return res.value;\n\n        var rx = anObject(regexp);\n        var S = String(this);\n        var C = speciesConstructor(rx, RegExp);\n\n        var unicodeMatching = rx.unicode;\n        var flags = (rx.ignoreCase ? 'i' : '') +\n                    (rx.multiline ? 'm' : '') +\n                    (rx.unicode ? 'u' : '') +\n                    (SUPPORTS_Y ? 'y' : 'g');\n\n        // ^(? + rx + ) is needed, in combination with some S slicing, to\n        // simulate the 'y' flag.\n        var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n        var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n        if (lim === 0) return [];\n        if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n        var p = 0;\n        var q = 0;\n        var A = [];\n        while (q < S.length) {\n          splitter.lastIndex = SUPPORTS_Y ? q : 0;\n          var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n          var e;\n          if (\n            z === null ||\n            (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n          ) {\n            q = advanceStringIndex(S, q, unicodeMatching);\n          } else {\n            A.push(S.slice(p, q));\n            if (A.length === lim) return A;\n            for (var i = 1; i <= z.length - 1; i++) {\n              A.push(z[i]);\n              if (A.length === lim) return A;\n            }\n            q = p = e;\n          }\n        }\n        A.push(S.slice(p));\n        return A;\n      }\n    ];\n  },\n  !SUPPORTS_Y\n);\n","'use strict';\nvar toLength = require('../internals/to-length');\nvar validateArguments = require('../internals/validate-string-method-arguments');\nvar STARTS_WITH = 'startsWith';\nvar CORRECT_IS_REGEXP_LOGIC = require('../internals/correct-is-regexp-logic')(STARTS_WITH);\nvar nativeStartsWith = ''[STARTS_WITH];\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\nrequire('../internals/export')({ target: 'String', proto: true, forced: !CORRECT_IS_REGEXP_LOGIC }, {\n  startsWith: function startsWith(searchString /* , position = 0 */) {\n    var that = validateArguments(this, searchString, STARTS_WITH);\n    var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n    var search = String(searchString);\n    return nativeStartsWith\n      ? nativeStartsWith.call(that, search, index)\n      : that.slice(index, index + search.length) === search;\n  }\n});\n","'use strict';\nvar createHTML = require('../internals/create-html');\nvar FORCED = require('../internals/forced-string-html-method')('strike');\n\n// `String.prototype.strike` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.strike\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  strike: function strike() {\n    return createHTML(this, 'strike', '', '');\n  }\n});\n","'use strict';\nvar createHTML = require('../internals/create-html');\nvar FORCED = require('../internals/forced-string-html-method')('sub');\n\n// `String.prototype.sub` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.sub\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  sub: function sub() {\n    return createHTML(this, 'sub', '', '');\n  }\n});\n","'use strict';\nvar createHTML = require('../internals/create-html');\nvar FORCED = require('../internals/forced-string-html-method')('sup');\n\n// `String.prototype.sup` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.sup\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  sup: function sup() {\n    return createHTML(this, 'sup', '', '');\n  }\n});\n","'use strict';\nvar internalStringTrim = require('../internals/string-trim');\nvar FORCED = require('../internals/forced-string-trim-method')('trimEnd');\n\nvar trimEnd = FORCED ? function trimEnd() {\n  return internalStringTrim(this, 2);\n} : ''.trimEnd;\n\n// `String.prototype.{ trimEnd, trimRight }` methods\n// https://github.com/tc39/ecmascript-string-left-right-trim\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  trimEnd: trimEnd,\n  trimRight: trimEnd\n});\n","'use strict';\nvar internalStringTrim = require('../internals/string-trim');\nvar FORCED = require('../internals/forced-string-trim-method')('trimStart');\n\nvar trimStart = FORCED ? function trimStart() {\n  return internalStringTrim(this, 1);\n} : ''.trimStart;\n\n// `String.prototype.{ trimStart, trimLeft }` methods\n// https://github.com/tc39/ecmascript-string-left-right-trim\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  trimStart: trimStart,\n  trimLeft: trimStart\n});\n","'use strict';\nvar internalStringTrim = require('../internals/string-trim');\nvar FORCED = require('../internals/forced-string-trim-method')('trim');\n\n// `String.prototype.trim` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.trim\nrequire('../internals/export')({ target: 'String', proto: true, forced: FORCED }, {\n  trim: function trim() {\n    return internalStringTrim(this, 3);\n  }\n});\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('../internals/global');\nvar has = require('../internals/has');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IS_PURE = require('../internals/is-pure');\nvar $export = require('../internals/export');\nvar redefine = require('../internals/redefine');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar fails = require('../internals/fails');\nvar shared = require('../internals/shared');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar uid = require('../internals/uid');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar wrappedWellKnownSymbolModule = require('../internals/wrapped-well-known-symbol');\nvar defineWellKnownSymbol = require('../internals/define-well-known-symbol');\nvar enumKeys = require('../internals/enum-keys');\nvar isArray = require('../internals/is-array');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar nativeObjectCreate = require('../internals/object-create');\nvar getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar hide = require('../internals/hide');\nvar objectKeys = require('../internals/object-keys');\nvar HIDDEN = require('../internals/shared-key')('hidden');\nvar InternalStateModule = require('../internals/internal-state');\nvar SYMBOL = 'Symbol';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SYMBOL);\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;\nvar $Symbol = global.Symbol;\nvar JSON = global.JSON;\nvar nativeJSONStringify = JSON && JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nvar nativePropertyIsEnumerable = propertyIsEnumerableModule.f;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar WellKnownSymbolsStore = shared('wks');\nvar ObjectPrototype = Object[PROTOTYPE];\nvar QObject = global.QObject;\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDescriptor = DESCRIPTORS && fails(function () {\n  return nativeObjectCreate(nativeDefineProperty({}, 'a', {\n    get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }\n  })).a != 7;\n}) ? function (it, key, D) {\n  var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, key);\n  if (ObjectPrototypeDescriptor) delete ObjectPrototype[key];\n  nativeDefineProperty(it, key, D);\n  if (ObjectPrototypeDescriptor && it !== ObjectPrototype) {\n    nativeDefineProperty(ObjectPrototype, key, ObjectPrototypeDescriptor);\n  }\n} : nativeDefineProperty;\n\nvar wrap = function (tag, description) {\n  var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);\n  setInternalState(symbol, {\n    type: SYMBOL,\n    tag: tag,\n    description: description\n  });\n  if (!DESCRIPTORS) symbol.description = description;\n  return symbol;\n};\n\nvar isSymbol = NATIVE_SYMBOL && typeof $Symbol.iterator == 'symbol' ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  return Object(it) instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n  if (it === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, key, D);\n  anObject(it);\n  key = toPrimitive(key, true);\n  anObject(D);\n  if (has(AllSymbols, key)) {\n    if (!D.enumerable) {\n      if (!has(it, HIDDEN)) nativeDefineProperty(it, HIDDEN, createPropertyDescriptor(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n      D = nativeObjectCreate(D, { enumerable: createPropertyDescriptor(0, false) });\n    } return setSymbolDescriptor(it, key, D);\n  } return nativeDefineProperty(it, key, D);\n};\n\nvar $defineProperties = function defineProperties(it, P) {\n  anObject(it);\n  var keys = enumKeys(P = toIndexedObject(P));\n  var i = 0;\n  var l = keys.length;\n  var key;\n  while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n  return it;\n};\n\nvar $create = function create(it, P) {\n  return P === undefined ? nativeObjectCreate(it) : $defineProperties(nativeObjectCreate(it), P);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n  var E = nativePropertyIsEnumerable.call(this, key = toPrimitive(key, true));\n  if (this === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return false;\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n  it = toIndexedObject(it);\n  key = toPrimitive(key, true);\n  if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n  var D = nativeGetOwnPropertyDescriptor(it, key);\n  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n  return D;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n  var names = nativeGetOwnPropertyNames(toIndexedObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (!has(AllSymbols, key = names[i++]) && !has(hiddenKeys, key)) result.push(key);\n  } return result;\n};\n\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n  var IS_OP = it === ObjectPrototype;\n  var names = nativeGetOwnPropertyNames(IS_OP ? ObjectPrototypeSymbols : toIndexedObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectPrototype, key) : true)) result.push(AllSymbols[key]);\n  } return result;\n};\n\n// `Symbol` constructor\n// https://tc39.github.io/ecma262/#sec-symbol-constructor\nif (!NATIVE_SYMBOL) {\n  $Symbol = function Symbol() {\n    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n    var description = arguments[0] === undefined ? undefined : String(arguments[0]);\n    var tag = uid(description);\n    var setter = function (value) {\n      if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n    };\n    if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n    return wrap(tag, description);\n  };\n  redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n    return getInternalState(this).tag;\n  });\n\n  propertyIsEnumerableModule.f = $propertyIsEnumerable;\n  definePropertyModule.f = $defineProperty;\n  getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;\n  require('../internals/object-get-own-property-names').f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n  require('../internals/object-get-own-property-symbols').f = $getOwnPropertySymbols;\n\n  if (DESCRIPTORS) {\n    // https://github.com/tc39/proposal-Symbol-description\n    nativeDefineProperty($Symbol[PROTOTYPE], 'description', {\n      configurable: true,\n      get: function description() {\n        return getInternalState(this).description;\n      }\n    });\n    if (!IS_PURE) {\n      redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n    }\n  }\n\n  wrappedWellKnownSymbolModule.f = function (name) {\n    return wrap(wellKnownSymbol(name), name);\n  };\n}\n\n$export({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, { Symbol: $Symbol });\n\nfor (var wellKnownSymbols = objectKeys(WellKnownSymbolsStore), k = 0; wellKnownSymbols.length > k;) {\n  defineWellKnownSymbol(wellKnownSymbols[k++]);\n}\n\n$export({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {\n  // `Symbol.for` method\n  // https://tc39.github.io/ecma262/#sec-symbol.for\n  'for': function (key) {\n    return has(SymbolRegistry, key += '')\n      ? SymbolRegistry[key]\n      : SymbolRegistry[key] = $Symbol(key);\n  },\n  // `Symbol.keyFor` method\n  // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n  keyFor: function keyFor(sym) {\n    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n  },\n  useSetter: function () { USE_SETTER = true; },\n  useSimple: function () { USE_SETTER = false; }\n});\n\n$export({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {\n  // `Object.create` method\n  // https://tc39.github.io/ecma262/#sec-object.create\n  create: $create,\n  // `Object.defineProperty` method\n  // https://tc39.github.io/ecma262/#sec-object.defineproperty\n  defineProperty: $defineProperty,\n  // `Object.defineProperties` method\n  // https://tc39.github.io/ecma262/#sec-object.defineproperties\n  defineProperties: $defineProperties,\n  // `Object.getOwnPropertyDescriptor` method\n  // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n$export({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {\n  // `Object.getOwnPropertyNames` method\n  // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // `Object.getOwnPropertySymbols` method\n  // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// `JSON.stringify` method behavior with symbols\n// https://tc39.github.io/ecma262/#sec-json.stringify\nJSON && $export({ target: 'JSON', stat: true, forced: !NATIVE_SYMBOL || fails(function () {\n  var symbol = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  return nativeJSONStringify([symbol]) != '[null]'\n    // WebKit converts symbol values to JSON as null\n    || nativeJSONStringify({ a: symbol }) != '{}'\n    // V8 throws on boxed symbols\n    || nativeJSONStringify(Object(symbol)) != '{}';\n}) }, {\n  stringify: function stringify(it) {\n    var args = [it];\n    var i = 1;\n    var replacer, $replacer;\n    while (arguments.length > i) args.push(arguments[i++]);\n    $replacer = replacer = args[1];\n    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n    if (!isArray(replacer)) replacer = function (key, value) {\n      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n      if (!isSymbol(value)) return value;\n    };\n    args[1] = replacer;\n    return nativeJSONStringify.apply(JSON, args);\n  }\n});\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\nif (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) hide($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar defineProperty = require('../internals/object-define-property').f;\n\n// `Array.prototype.lastIndex` getter\n// https://github.com/keithamus/proposal-array-last\nif (DESCRIPTORS && !('lastIndex' in [])) {\n  defineProperty(Array.prototype, 'lastIndex', {\n    configurable: true,\n    get: function lastIndex() {\n      var O = toObject(this);\n      var len = toLength(O.length);\n      return len == 0 ? 0 : len - 1;\n    }\n  });\n\n  require('../internals/add-to-unscopables')('lastIndex');\n}\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar defineProperty = require('../internals/object-define-property').f;\n\n// `Array.prototype.lastIndex` accessor\n// https://github.com/keithamus/proposal-array-last\nif (DESCRIPTORS && !('lastItem' in [])) {\n  defineProperty(Array.prototype, 'lastItem', {\n    configurable: true,\n    get: function lastItem() {\n      var O = toObject(this);\n      var len = toLength(O.length);\n      return len == 0 ? undefined : O[len - 1];\n    },\n    set: function lastItem(value) {\n      var O = toObject(this);\n      var len = toLength(O.length);\n      return O[len == 0 ? 0 : len - 1] = value;\n    }\n  });\n\n  require('../internals/add-to-unscopables')('lastItem');\n}\n","'use strict';\nvar collectionDeleteAll = require('../internals/collection-delete-all');\n\n// `Map.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({\n  target: 'Map', proto: true, real: true, forced: require('../internals/is-pure')\n}, {\n  deleteAll: function deleteAll(/* ...elements */) {\n    return collectionDeleteAll.apply(this, arguments);\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar bind = require('../internals/bind-context');\nvar getMapIterator = require('../internals/get-map-iterator');\n\n// `Map.prototype.every` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  every: function every(callbackfn /* , thisArg */) {\n    var map = anObject(this);\n    var iterator = getMapIterator(map);\n    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n    var step, entry;\n    while (!(step = iterator.next()).done) {\n      entry = step.value;\n      if (!boundFunction(entry[1], entry[0], map)) return false;\n    } return true;\n  }\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar bind = require('../internals/bind-context');\nvar speciesConstructor = require('../internals/species-constructor');\nvar getMapIterator = require('../internals/get-map-iterator');\n\n// `Map.prototype.filter` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  filter: function filter(callbackfn /* , thisArg */) {\n    var map = anObject(this);\n    var iterator = getMapIterator(map);\n    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n    var newMap = new (speciesConstructor(map, getBuiltIn('Map')))();\n    var setter = aFunction(newMap.set);\n    var step, entry, key, value;\n    while (!(step = iterator.next()).done) {\n      entry = step.value;\n      if (boundFunction(value = entry[1], key = entry[0], map)) setter.call(newMap, key, value);\n    }\n    return newMap;\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar bind = require('../internals/bind-context');\nvar getMapIterator = require('../internals/get-map-iterator');\n\n// `Map.prototype.findKey` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  findKey: function findKey(callbackfn /* , thisArg */) {\n    var map = anObject(this);\n    var iterator = getMapIterator(map);\n    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n    var step, entry, key;\n    while (!(step = iterator.next()).done) {\n      entry = step.value;\n      if (boundFunction(entry[1], key = entry[0], map)) return key;\n    }\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar bind = require('../internals/bind-context');\nvar getMapIterator = require('../internals/get-map-iterator');\n\n// `Map.prototype.find` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  find: function find(callbackfn /* , thisArg */) {\n    var map = anObject(this);\n    var iterator = getMapIterator(map);\n    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n    var step, entry, value;\n    while (!(step = iterator.next()).done) {\n      entry = step.value;\n      if (boundFunction(value = entry[1], entry[0], map)) return value;\n    }\n  }\n});\n","// `Map.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from\nrequire('../internals/export')({ target: 'Map', stat: true }, {\n  from: require('../internals/collection-from')\n});\n","'use strict';\nvar iterate = require('../internals/iterate');\nvar aFunction = require('../internals/a-function');\n\n// `Map.groupBy` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', stat: true, forced: require('../internals/is-pure') }, {\n  groupBy: function groupBy(iterable, keyDerivative) {\n    var newMap = new this();\n    aFunction(keyDerivative);\n    var has = aFunction(newMap.has);\n    var get = aFunction(newMap.get);\n    var set = aFunction(newMap.set);\n    iterate(iterable, function (element) {\n      var derivedKey = keyDerivative(element);\n      if (!has.call(newMap, derivedKey)) set.call(newMap, derivedKey, [element]);\n      else get.call(newMap, derivedKey).push(element);\n    });\n    return newMap;\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar getMapIterator = require('../internals/get-map-iterator');\nvar sameValueZero = require('../internals/same-value-zero');\n\n// `Map.prototype.includes` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  includes: function includes(searchElement) {\n    var map = anObject(this);\n    var iterator = getMapIterator(map);\n    var step;\n    while (!(step = iterator.next()).done) {\n      if (sameValueZero(step.value[1], searchElement)) return true;\n    }\n    return false;\n  }\n});\n","'use strict';\nvar iterate = require('../internals/iterate');\nvar aFunction = require('../internals/a-function');\n\n// `Map.keyBy` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', stat: true, forced: require('../internals/is-pure') }, {\n  keyBy: function keyBy(iterable, keyDerivative) {\n    var newMap = new this();\n    aFunction(keyDerivative);\n    var setter = aFunction(newMap.set);\n    iterate(iterable, function (element) {\n      setter.call(newMap, keyDerivative(element), element);\n    });\n    return newMap;\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar getMapIterator = require('../internals/get-map-iterator');\n\n// `Map.prototype.includes` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  keyOf: function keyOf(searchElement) {\n    var map = anObject(this);\n    var iterator = getMapIterator(map);\n    var step, entry;\n    while (!(step = iterator.next()).done) {\n      entry = step.value;\n      if (entry[1] === searchElement) return entry[0];\n    }\n  }\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar bind = require('../internals/bind-context');\nvar speciesConstructor = require('../internals/species-constructor');\nvar getMapIterator = require('../internals/get-map-iterator');\n\n// `Map.prototype.mapKeys` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  mapKeys: function mapKeys(callbackfn /* , thisArg */) {\n    var map = anObject(this);\n    var iterator = getMapIterator(map);\n    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n    var newMap = new (speciesConstructor(map, getBuiltIn('Map')))();\n    var setter = aFunction(newMap.set);\n    var step, entry, value;\n    while (!(step = iterator.next()).done) {\n      entry = step.value;\n      setter.call(newMap, boundFunction(value = entry[1], entry[0], map), value);\n    }\n    return newMap;\n  }\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar bind = require('../internals/bind-context');\nvar speciesConstructor = require('../internals/species-constructor');\nvar getMapIterator = require('../internals/get-map-iterator');\n\n// `Map.prototype.mapValues` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  mapValues: function mapValues(callbackfn /* , thisArg */) {\n    var map = anObject(this);\n    var iterator = getMapIterator(map);\n    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n    var newMap = new (speciesConstructor(map, getBuiltIn('Map')))();\n    var setter = aFunction(newMap.set);\n    var step, entry, key;\n    while (!(step = iterator.next()).done) {\n      entry = step.value;\n      setter.call(newMap, key = entry[0], boundFunction(entry[1], key, map));\n    }\n    return newMap;\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar iterate = require('../internals/iterate');\n\n// `Map.prototype.merge` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  // eslint-disable-next-line no-unused-vars\n  merge: function merge(iterable /* ...iterbles */) {\n    var map = anObject(this);\n    var setter = aFunction(map.set);\n    var i = 0;\n    while (i < arguments.length) {\n      iterate(arguments[i++], setter, map, true);\n    }\n    return map;\n  }\n});\n","// `Map.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of\nrequire('../internals/export')({ target: 'Map', stat: true }, {\n  of: require('../internals/collection-of')\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar getMapIterator = require('../internals/get-map-iterator');\n\n// `Map.prototype.reduce` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  reduce: function reduce(callbackfn /* , initialValue */) {\n    var map = anObject(this);\n    var iterator = getMapIterator(map);\n    var accumulator, step, entry;\n    aFunction(callbackfn);\n    if (arguments.length > 1) accumulator = arguments[1];\n    else {\n      step = iterator.next();\n      if (step.done) throw TypeError('Reduce of empty map with no initial value');\n      accumulator = step.value[1];\n    }\n    while (!(step = iterator.next()).done) {\n      entry = step.value;\n      accumulator = callbackfn(accumulator, entry[1], entry[0], map);\n    }\n    return accumulator;\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar bind = require('../internals/bind-context');\nvar getMapIterator = require('../internals/get-map-iterator');\n\n// `Set.prototype.some` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  some: function some(callbackfn /* , thisArg */) {\n    var map = anObject(this);\n    var iterator = getMapIterator(map);\n    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n    var step, entry;\n    while (!(step = iterator.next()).done) {\n      entry = step.value;\n      if (boundFunction(entry[1], entry[0], map)) return true;\n    } return false;\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\n\n// `Set.prototype.update` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Map', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  update: function update(key, callback /* , thunk */) {\n    var map = anObject(this);\n    aFunction(callback);\n    var isPresentInMap = map.has(key);\n    if (!isPresentInMap && arguments.length < 3) {\n      throw TypeError('Updating absent value');\n    }\n    var value = isPresentInMap ? map.get(key) : aFunction(arguments[2])(key, map);\n    map.set(key, callback(value, key, map));\n    return map;\n  }\n});\n","'use strict';\nvar toInteger = require('../internals/to-integer');\nvar parseInt = require('../internals/parse-int');\nvar INVALID_NUMBER_REPRESENTATION = 'Invalid number representation';\nvar INVALID_RADIX = 'Invalid radix';\nvar valid = /^[0-9a-z]+$/;\n\n// `Number.fromString` method\n// https://github.com/tc39/proposal-number-fromstring\nrequire('../internals/export')({ target: 'Number', stat: true }, {\n  fromString: function fromString(string, radix) {\n    var sign = 1;\n    var R, mathNum;\n    if (typeof string != 'string') throw TypeError(INVALID_NUMBER_REPRESENTATION);\n    if (!string.length) throw SyntaxError(INVALID_NUMBER_REPRESENTATION);\n    if (string.charAt(0) == '-') {\n      sign = -1;\n      string = string.slice(1);\n      if (!string.length) throw SyntaxError(INVALID_NUMBER_REPRESENTATION);\n    }\n    R = radix === undefined ? 10 : toInteger(radix);\n    if (R < 2 || R > 36) throw RangeError(INVALID_RADIX);\n    if (!valid.test(string) || (mathNum = parseInt(string, R)).toString(R) !== string) {\n      throw SyntaxError(INVALID_NUMBER_REPRESENTATION);\n    }\n    return sign * mathNum;\n  }\n});\n","'use strict';\nvar collectionAddAll = require('../internals/collection-add-all');\n\n// `Set.prototype.addAll` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  addAll: function addAll(/* ...elements */) {\n    return collectionAddAll.apply(this, arguments);\n  }\n});\n","'use strict';\nvar collectionDeleteAll = require('../internals/collection-delete-all');\n\n// `Set.prototype.deleteAll` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  deleteAll: function deleteAll(/* ...elements */) {\n    return collectionDeleteAll.apply(this, arguments);\n  }\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar speciesConstructor = require('../internals/species-constructor');\nvar iterate = require('../internals/iterate');\n\n// `Set.prototype.difference` method\n// https://github.com/tc39/proposal-set-methods\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  difference: function difference(iterable) {\n    var set = anObject(this);\n    var newSet = new (speciesConstructor(set, getBuiltIn('Set')))(set);\n    var remover = aFunction(newSet['delete']);\n    iterate(iterable, function (value) {\n      remover.call(newSet, value);\n    });\n    return newSet;\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar bind = require('../internals/bind-context');\nvar getSetIterator = require('../internals/get-set-iterator');\n\n// `Set.prototype.every` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  every: function every(callbackfn /* , thisArg */) {\n    var set = anObject(this);\n    var iterator = getSetIterator(set);\n    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n    var step, value;\n    while (!(step = iterator.next()).done) {\n      if (!boundFunction(value = step.value, value, set)) return false;\n    } return true;\n  }\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar bind = require('../internals/bind-context');\nvar speciesConstructor = require('../internals/species-constructor');\nvar getSetIterator = require('../internals/get-set-iterator');\n\n// `Set.prototype.filter` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  filter: function filter(callbackfn /* , thisArg */) {\n    var set = anObject(this);\n    var iterator = getSetIterator(set);\n    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n    var newSet = new (speciesConstructor(set, getBuiltIn('Set')))();\n    var adder = aFunction(newSet.add);\n    var step, value;\n    while (!(step = iterator.next()).done) {\n      if (boundFunction(value = step.value, value, set)) adder.call(newSet, value);\n    }\n    return newSet;\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar bind = require('../internals/bind-context');\nvar getSetIterator = require('../internals/get-set-iterator');\n\n// `Set.prototype.find` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  find: function find(callbackfn /* , thisArg */) {\n    var set = anObject(this);\n    var iterator = getSetIterator(set);\n    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n    var step, value;\n    while (!(step = iterator.next()).done) {\n      if (boundFunction(value = step.value, value, set)) return value;\n    }\n  }\n});\n","// `Set.from` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from\nrequire('../internals/export')({ target: 'Set', stat: true }, {\n  from: require('../internals/collection-from')\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar speciesConstructor = require('../internals/species-constructor');\nvar iterate = require('../internals/iterate');\n\n// `Set.prototype.intersection` method\n// https://github.com/tc39/proposal-set-methods\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  intersection: function intersection(iterable) {\n    var set = anObject(this);\n    var newSet = new (speciesConstructor(set, getBuiltIn('Set')))();\n    var hasCheck = aFunction(set.has);\n    var adder = aFunction(newSet.add);\n    iterate(iterable, function (value) {\n      if (hasCheck.call(set, value)) adder.call(newSet, value);\n    });\n    return newSet;\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar iterate = require('../internals/iterate');\nvar BREAK = iterate.BREAK;\n\n// `Set.prototype.isDisjointFrom` method\n// https://tc39.github.io/proposal-set-methods/#Set.prototype.isDisjointFrom\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  isDisjointFrom: function isDisjointFrom(iterable) {\n    var set = anObject(this);\n    var hasCheck = aFunction(set.has);\n    return iterate(iterable, function (value) {\n      if (hasCheck.call(set, value) === true) return BREAK;\n    }) !== BREAK;\n  }\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar getIterator = require('../internals/get-iterator');\nvar iterate = require('../internals/iterate');\nvar BREAK = iterate.BREAK;\n\n// `Set.prototype.isSubsetOf` method\n// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSubsetOf\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  isSubsetOf: function isSubsetOf(iterable) {\n    var iterator = getIterator(this);\n    var otherSet = anObject(iterable);\n    var hasCheck = otherSet.has;\n    if (typeof hasCheck != 'function') {\n      otherSet = new (getBuiltIn('Set'))(iterable);\n      hasCheck = aFunction(otherSet.has);\n    }\n    return iterate(iterator, function (value) {\n      if (hasCheck.call(otherSet, value) === false) return BREAK;\n    }, undefined, false, true) !== BREAK;\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar iterate = require('../internals/iterate');\nvar BREAK = iterate.BREAK;\n\n// `Set.prototype.isSupersetOf` method\n// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSupersetOf\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  isSupersetOf: function isSupersetOf(iterable) {\n    var set = anObject(this);\n    var hasCheck = aFunction(set.has);\n    return iterate(iterable, function (value) {\n      if (hasCheck.call(set, value) === false) return BREAK;\n    }) !== BREAK;\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar getSetIterator = require('../internals/get-set-iterator');\n\n// `Set.prototype.join` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  join: function join(separator) {\n    var set = anObject(this);\n    var iterator = getSetIterator(set);\n    var sep = separator === undefined ? ',' : String(separator);\n    var result = [];\n    var step;\n    while (!(step = iterator.next()).done) result.push(step.value);\n    return result.join(sep);\n  }\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar bind = require('../internals/bind-context');\nvar speciesConstructor = require('../internals/species-constructor');\nvar getSetIterator = require('../internals/get-set-iterator');\n\n// `Set.prototype.map` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  map: function map(callbackfn /* , thisArg */) {\n    var set = anObject(this);\n    var iterator = getSetIterator(set);\n    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n    var newSet = new (speciesConstructor(set, getBuiltIn('Set')))();\n    var adder = aFunction(newSet.add);\n    var step, value;\n    while (!(step = iterator.next()).done) {\n      adder.call(newSet, boundFunction(value = step.value, value, set));\n    }\n    return newSet;\n  }\n});\n","// `Set.of` method\n// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of\nrequire('../internals/export')({ target: 'Set', stat: true }, {\n  of: require('../internals/collection-of')\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar getSetIterator = require('../internals/get-set-iterator');\n\n// `Set.prototype.reduce` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  reduce: function reduce(callbackfn /* , initialValue */) {\n    var set = anObject(this);\n    var iterator = getSetIterator(set);\n    var accumulator, step, value;\n    aFunction(callbackfn);\n    if (arguments.length > 1) accumulator = arguments[1];\n    else {\n      step = iterator.next();\n      if (step.done) throw TypeError('Reduce of empty set with no initial value');\n      accumulator = step.value;\n    }\n    while (!(step = iterator.next()).done) {\n      accumulator = callbackfn(accumulator, value = step.value, value, set);\n    }\n    return accumulator;\n  }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar bind = require('../internals/bind-context');\nvar getSetIterator = require('../internals/get-set-iterator');\n\n// `Set.prototype.some` method\n// https://github.com/tc39/proposal-collection-methods\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  some: function some(callbackfn /* , thisArg */) {\n    var set = anObject(this);\n    var iterator = getSetIterator(set);\n    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n    var step, value;\n    while (!(step = iterator.next()).done) {\n      if (boundFunction(value = step.value, value, set)) return true;\n    } return false;\n  }\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar speciesConstructor = require('../internals/species-constructor');\nvar iterate = require('../internals/iterate');\n\n// `Set.prototype.symmetricDifference` method\n// https://github.com/tc39/proposal-set-methods\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  symmetricDifference: function symmetricDifference(iterable) {\n    var set = anObject(this);\n    var newSet = new (speciesConstructor(set, getBuiltIn('Set')))(set);\n    var remover = aFunction(newSet['delete']);\n    var adder = aFunction(newSet.add);\n    iterate(iterable, function (value) {\n      remover.call(newSet, value) || adder.call(newSet, value);\n    });\n    return newSet;\n  }\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar speciesConstructor = require('../internals/species-constructor');\nvar iterate = require('../internals/iterate');\n\n// `Set.prototype.union` method\n// https://github.com/tc39/proposal-set-methods\nrequire('../internals/export')({ target: 'Set', proto: true, real: true, forced: require('../internals/is-pure') }, {\n  union: function union(iterable) {\n    var set = anObject(this);\n    var newSet = new (speciesConstructor(set, getBuiltIn('Set')))(set);\n    iterate(iterable, aFunction(newSet.add), newSet);\n    return newSet;\n  }\n});\n","'use strict';\nvar codePointAt = require('../internals/string-at');\n\n// `String.prototype.at` method\n// https://github.com/mathiasbynens/String.prototype.at\nrequire('../internals/export')({ target: 'String', proto: true }, {\n  at: function at(pos) {\n    return codePointAt(this, pos, true);\n  }\n});\n","'use strict';\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toLength = require('../internals/to-length');\nvar aFunction = require('../internals/a-function');\nvar anObject = require('../internals/an-object');\nvar classof = require('../internals/classof');\nvar getFlags = require('../internals/regexp-flags');\nvar hide = require('../internals/hide');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar MATCH_ALL = require('../internals/well-known-symbol')('matchAll');\nvar IS_PURE = require('../internals/is-pure');\nvar REGEXP_STRING = 'RegExp String';\nvar REGEXP_STRING_ITERATOR = REGEXP_STRING + ' Iterator';\nvar InternalStateModule = require('../internals/internal-state');\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(REGEXP_STRING_ITERATOR);\nvar RegExpPrototype = RegExp.prototype;\nvar regExpBuiltinExec = RegExpPrototype.exec;\n\nvar regExpExec = function (R, S) {\n  var exec = R.exec;\n  var result;\n  if (typeof exec == 'function') {\n    result = exec.call(R, S);\n    if (typeof result != 'object') throw TypeError('Incorrect exec result');\n    return result;\n  } return regExpBuiltinExec.call(R, S);\n};\n\n// eslint-disable-next-line max-len\nvar $RegExpStringIterator = createIteratorConstructor(function RegExpStringIterator(regexp, string, global, fullUnicode) {\n  setInternalState(this, {\n    type: REGEXP_STRING_ITERATOR,\n    regexp: regexp,\n    string: string,\n    global: global,\n    unicode: fullUnicode,\n    done: false\n  });\n}, REGEXP_STRING, function next() {\n  var state = getInternalState(this);\n  if (state.done) return { value: undefined, done: true };\n  var R = state.regexp;\n  var S = state.string;\n  var match = regExpExec(R, S);\n  if (match === null) return { value: undefined, done: state.done = true };\n  if (state.global) {\n    if (String(match[0]) == '') R.lastIndex = advanceStringIndex(S, toLength(R.lastIndex), state.unicode);\n    return { value: match, done: false };\n  }\n  state.done = true;\n  return { value: match, done: false };\n});\n\nvar $matchAll = function (string) {\n  var R = anObject(this);\n  var S = String(string);\n  var C, flags, matcher, global, fullUnicode;\n  C = speciesConstructor(R, RegExp);\n  flags = 'flags' in RegExpPrototype ? String(R.flags) : getFlags.call(R);\n  matcher = new C(C === RegExp ? R.source : R, flags);\n  global = !!~flags.indexOf('g');\n  fullUnicode = !!~flags.indexOf('u');\n  matcher.lastIndex = toLength(R.lastIndex);\n  return new $RegExpStringIterator(matcher, S, global, fullUnicode);\n};\n\n// `String.prototype.matchAll` method\n// https://github.com/tc39/proposal-string-matchall\nrequire('../internals/export')({ target: 'String', proto: true }, {\n  matchAll: function matchAll(regexp) {\n    var O = requireObjectCoercible(this);\n    var S, matcher, rx;\n    if (regexp != null) {\n      matcher = regexp[MATCH_ALL];\n      if (matcher === undefined && IS_PURE && classof(regexp) == 'RegExp') matcher = $matchAll;\n      if (matcher != null) return aFunction(matcher).call(regexp, O);\n    }\n    S = String(O);\n    rx = new RegExp(regexp, 'g');\n    return IS_PURE ? $matchAll.call(rx, S) : rx[MATCH_ALL](S);\n  }\n});\n\nIS_PURE || MATCH_ALL in RegExpPrototype || hide(RegExpPrototype, MATCH_ALL, $matchAll);\n","'use strict';\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar isRegExp = require('../internals/is-regexp');\nvar getRegExpFlags = require('../internals/regexp-flags');\nvar speciesConstructor = require('../internals/species-constructor');\n\n// `String.prototype.replaceAll` method\n// https://github.com/tc39/proposal-string-replace-all\nrequire('../internals/export')({ target: 'String', proto: true }, {\n  replaceAll: function replaceAll(searchValue, replaceValue) {\n    var O = requireObjectCoercible(this);\n    var search, flags;\n    if (isRegExp(searchValue)) {\n      flags = getRegExpFlags.call(searchValue);\n      if (!~flags.indexOf('g')) {\n        search = new (speciesConstructor(searchValue, RegExp))(searchValue.source, flags + 'g');\n      } else search = searchValue;\n      return String(O).replace(search, replaceValue);\n    }\n    return String(O).split(searchValue).join(replaceValue);\n  }\n});\n","var DOMIterables = require('../internals/dom-iterables');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar global = require('../internals/global');\nvar hide = require('../internals/hide');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n  var Collection = global[COLLECTION_NAME];\n  var CollectionPrototype = Collection && Collection.prototype;\n  if (CollectionPrototype) {\n    // some Chrome versions have non-configurable methods on DOMTokenList\n    if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n      hide(CollectionPrototype, ITERATOR, ArrayValues);\n    } catch (error) {\n      CollectionPrototype[ITERATOR] = ArrayValues;\n    }\n    if (!CollectionPrototype[TO_STRING_TAG]) hide(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n    if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n      // some Chrome versions have non-configurable methods on DOMTokenList\n      if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n        hide(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n      } catch (error) {\n        CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n      }\n    }\n  }\n}\n","\nmodule.exports = parse;\n\nfunction parse(str) {\n  return new Parser(str).parse();\n}\n\nfunction Parser(str) {\n  this.str = str;\n}\n\nParser.prototype.skip = function(m){\n  this.str = this.str.slice(m[0].length);\n};\n\nParser.prototype.comma = function(){\n  var m = /^, */.exec(this.str);\n  if (!m) return;\n  this.skip(m);\n  return { type: 'comma', string: ',' };\n};\n\nParser.prototype.ident = function(){\n  var m = /^([\\w-]+) */.exec(this.str);\n  if (!m) return;\n  this.skip(m);\n  return {\n    type: 'ident',\n    string: m[1]\n  }\n};\n\nParser.prototype.int = function(){\n  var m = /^((\\d+)(\\S+)?) */.exec(this.str);\n  if (!m) return;\n  this.skip(m);\n  var n = ~~m[2];\n  var u = m[3];\n\n  return {\n    type: 'number',\n    string: m[1],\n    unit: u || '',\n    value: n\n  }\n};\n\nParser.prototype.float = function(){\n  var m = /^(((?:\\d+)?\\.\\d+)(\\S+)?) */.exec(this.str);\n  if (!m) return;\n  this.skip(m);\n  var n = parseFloat(m[2]);\n  var u = m[3];\n\n  return {\n    type: 'number',\n    string: m[1],\n    unit: u || '',\n    value: n\n  }\n};\n\nParser.prototype.number = function(){\n  return this.float() || this.int();\n};\n\nParser.prototype.double = function(){\n  var m = /^\"([^\"]*)\" */.exec(this.str);\n  if (!m) return m;\n  this.skip(m);\n  return {\n    type: 'string',\n    quote: '\"',\n    string: '\"' + m[1] + '\"',\n    value: m[1]\n  }\n};\n\nParser.prototype.single = function(){\n  var m = /^'([^']*)' */.exec(this.str);\n  if (!m) return m;\n  this.skip(m);\n  return {\n    type: 'string',\n    quote: \"'\",\n    string: \"'\" + m[1] + \"'\",\n    value: m[1]\n  }\n};\n\nParser.prototype.string = function(){\n  return this.single() || this.double();\n};\n\n\nParser.prototype.value = function(){\n  return this.number()\n    || this.ident()\n    || this.string()\n    || this.comma();\n};\n\nParser.prototype.parse = function(){\n  var vals = [];\n\n  while (this.str.length) {\n    var obj = this.value();\n    if (!obj) throw new Error('failed to parse near `' + this.str.slice(0, 10) + '...`');\n    vals.push(obj);\n  }\n\n  return vals;\n};\n","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license   Licensed under MIT license\n *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version   v4.2.5+7f2b526d\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n  var type = typeof x;\n  return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n  return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n  _isArray = Array.isArray;\n} else {\n  _isArray = function (x) {\n    return Object.prototype.toString.call(x) === '[object Array]';\n  };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n  queue[len] = callback;\n  queue[len + 1] = arg;\n  len += 2;\n  if (len === 2) {\n    // If len is 2, that means that we need to schedule an async flush.\n    // If additional callbacks are queued before the queue is flushed, they\n    // will be processed by this flush that we are scheduling.\n    if (customSchedulerFn) {\n      customSchedulerFn(flush);\n    } else {\n      scheduleFlush();\n    }\n  }\n};\n\nfunction setScheduler(scheduleFn) {\n  customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n  asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n  // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n  // see https://github.com/cujojs/when/issues/410 for details\n  return function () {\n    return process.nextTick(flush);\n  };\n}\n\n// vertx\nfunction useVertxTimer() {\n  if (typeof vertxNext !== 'undefined') {\n    return function () {\n      vertxNext(flush);\n    };\n  }\n\n  return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n  var iterations = 0;\n  var observer = new BrowserMutationObserver(flush);\n  var node = document.createTextNode('');\n  observer.observe(node, { characterData: true });\n\n  return function () {\n    node.data = iterations = ++iterations % 2;\n  };\n}\n\n// web worker\nfunction useMessageChannel() {\n  var channel = new MessageChannel();\n  channel.port1.onmessage = flush;\n  return function () {\n    return channel.port2.postMessage(0);\n  };\n}\n\nfunction useSetTimeout() {\n  // Store setTimeout reference so es6-promise will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var globalSetTimeout = setTimeout;\n  return function () {\n    return globalSetTimeout(flush, 1);\n  };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n  for (var i = 0; i < len; i += 2) {\n    var callback = queue[i];\n    var arg = queue[i + 1];\n\n    callback(arg);\n\n    queue[i] = undefined;\n    queue[i + 1] = undefined;\n  }\n\n  len = 0;\n}\n\nfunction attemptVertx() {\n  try {\n    var vertx = Function('return this')().require('vertx');\n    vertxNext = vertx.runOnLoop || vertx.runOnContext;\n    return useVertxTimer();\n  } catch (e) {\n    return useSetTimeout();\n  }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n  scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n  scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n  scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n  scheduleFlush = attemptVertx();\n} else {\n  scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n  var parent = this;\n\n  var child = new this.constructor(noop);\n\n  if (child[PROMISE_ID] === undefined) {\n    makePromise(child);\n  }\n\n  var _state = parent._state;\n\n\n  if (_state) {\n    var callback = arguments[_state - 1];\n    asap(function () {\n      return invokeCallback(_state, child, callback, parent._result);\n    });\n  } else {\n    subscribe(parent, child, onFulfillment, onRejection);\n  }\n\n  return child;\n}\n\n/**\n  `Promise.resolve` returns a promise that will become resolved with the\n  passed `value`. It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    resolve(1);\n  });\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.resolve(1);\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  @method resolve\n  @static\n  @param {Any} value value that the returned promise will be resolved with\n  Useful for tooling.\n  @return {Promise} a promise that will become fulfilled with the given\n  `value`\n*/\nfunction resolve$1(object) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (object && typeof object === 'object' && object.constructor === Constructor) {\n    return object;\n  }\n\n  var promise = new Constructor(noop);\n  resolve(promise, object);\n  return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(2);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar TRY_CATCH_ERROR = { error: null };\n\nfunction selfFulfillment() {\n  return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n  return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n  try {\n    return promise.then;\n  } catch (error) {\n    TRY_CATCH_ERROR.error = error;\n    return TRY_CATCH_ERROR;\n  }\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n  try {\n    then$$1.call(value, fulfillmentHandler, rejectionHandler);\n  } catch (e) {\n    return e;\n  }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n  asap(function (promise) {\n    var sealed = false;\n    var error = tryThen(then$$1, thenable, function (value) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n      if (thenable !== value) {\n        resolve(promise, value);\n      } else {\n        fulfill(promise, value);\n      }\n    }, function (reason) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n\n      reject(promise, reason);\n    }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n    if (!sealed && error) {\n      sealed = true;\n      reject(promise, error);\n    }\n  }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n  if (thenable._state === FULFILLED) {\n    fulfill(promise, thenable._result);\n  } else if (thenable._state === REJECTED) {\n    reject(promise, thenable._result);\n  } else {\n    subscribe(thenable, undefined, function (value) {\n      return resolve(promise, value);\n    }, function (reason) {\n      return reject(promise, reason);\n    });\n  }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n  if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n    handleOwnThenable(promise, maybeThenable);\n  } else {\n    if (then$$1 === TRY_CATCH_ERROR) {\n      reject(promise, TRY_CATCH_ERROR.error);\n      TRY_CATCH_ERROR.error = null;\n    } else if (then$$1 === undefined) {\n      fulfill(promise, maybeThenable);\n    } else if (isFunction(then$$1)) {\n      handleForeignThenable(promise, maybeThenable, then$$1);\n    } else {\n      fulfill(promise, maybeThenable);\n    }\n  }\n}\n\nfunction resolve(promise, value) {\n  if (promise === value) {\n    reject(promise, selfFulfillment());\n  } else if (objectOrFunction(value)) {\n    handleMaybeThenable(promise, value, getThen(value));\n  } else {\n    fulfill(promise, value);\n  }\n}\n\nfunction publishRejection(promise) {\n  if (promise._onerror) {\n    promise._onerror(promise._result);\n  }\n\n  publish(promise);\n}\n\nfunction fulfill(promise, value) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n\n  promise._result = value;\n  promise._state = FULFILLED;\n\n  if (promise._subscribers.length !== 0) {\n    asap(publish, promise);\n  }\n}\n\nfunction reject(promise, reason) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n  promise._state = REJECTED;\n  promise._result = reason;\n\n  asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n  var _subscribers = parent._subscribers;\n  var length = _subscribers.length;\n\n\n  parent._onerror = null;\n\n  _subscribers[length] = child;\n  _subscribers[length + FULFILLED] = onFulfillment;\n  _subscribers[length + REJECTED] = onRejection;\n\n  if (length === 0 && parent._state) {\n    asap(publish, parent);\n  }\n}\n\nfunction publish(promise) {\n  var subscribers = promise._subscribers;\n  var settled = promise._state;\n\n  if (subscribers.length === 0) {\n    return;\n  }\n\n  var child = void 0,\n      callback = void 0,\n      detail = promise._result;\n\n  for (var i = 0; i < subscribers.length; i += 3) {\n    child = subscribers[i];\n    callback = subscribers[i + settled];\n\n    if (child) {\n      invokeCallback(settled, child, callback, detail);\n    } else {\n      callback(detail);\n    }\n  }\n\n  promise._subscribers.length = 0;\n}\n\nfunction tryCatch(callback, detail) {\n  try {\n    return callback(detail);\n  } catch (e) {\n    TRY_CATCH_ERROR.error = e;\n    return TRY_CATCH_ERROR;\n  }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n  var hasCallback = isFunction(callback),\n      value = void 0,\n      error = void 0,\n      succeeded = void 0,\n      failed = void 0;\n\n  if (hasCallback) {\n    value = tryCatch(callback, detail);\n\n    if (value === TRY_CATCH_ERROR) {\n      failed = true;\n      error = value.error;\n      value.error = null;\n    } else {\n      succeeded = true;\n    }\n\n    if (promise === value) {\n      reject(promise, cannotReturnOwn());\n      return;\n    }\n  } else {\n    value = detail;\n    succeeded = true;\n  }\n\n  if (promise._state !== PENDING) {\n    // noop\n  } else if (hasCallback && succeeded) {\n    resolve(promise, value);\n  } else if (failed) {\n    reject(promise, error);\n  } else if (settled === FULFILLED) {\n    fulfill(promise, value);\n  } else if (settled === REJECTED) {\n    reject(promise, value);\n  }\n}\n\nfunction initializePromise(promise, resolver) {\n  try {\n    resolver(function resolvePromise(value) {\n      resolve(promise, value);\n    }, function rejectPromise(reason) {\n      reject(promise, reason);\n    });\n  } catch (e) {\n    reject(promise, e);\n  }\n}\n\nvar id = 0;\nfunction nextId() {\n  return id++;\n}\n\nfunction makePromise(promise) {\n  promise[PROMISE_ID] = id++;\n  promise._state = undefined;\n  promise._result = undefined;\n  promise._subscribers = [];\n}\n\nfunction validationError() {\n  return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n  function Enumerator(Constructor, input) {\n    this._instanceConstructor = Constructor;\n    this.promise = new Constructor(noop);\n\n    if (!this.promise[PROMISE_ID]) {\n      makePromise(this.promise);\n    }\n\n    if (isArray(input)) {\n      this.length = input.length;\n      this._remaining = input.length;\n\n      this._result = new Array(this.length);\n\n      if (this.length === 0) {\n        fulfill(this.promise, this._result);\n      } else {\n        this.length = this.length || 0;\n        this._enumerate(input);\n        if (this._remaining === 0) {\n          fulfill(this.promise, this._result);\n        }\n      }\n    } else {\n      reject(this.promise, validationError());\n    }\n  }\n\n  Enumerator.prototype._enumerate = function _enumerate(input) {\n    for (var i = 0; this._state === PENDING && i < input.length; i++) {\n      this._eachEntry(input[i], i);\n    }\n  };\n\n  Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n    var c = this._instanceConstructor;\n    var resolve$$1 = c.resolve;\n\n\n    if (resolve$$1 === resolve$1) {\n      var _then = getThen(entry);\n\n      if (_then === then && entry._state !== PENDING) {\n        this._settledAt(entry._state, i, entry._result);\n      } else if (typeof _then !== 'function') {\n        this._remaining--;\n        this._result[i] = entry;\n      } else if (c === Promise$1) {\n        var promise = new c(noop);\n        handleMaybeThenable(promise, entry, _then);\n        this._willSettleAt(promise, i);\n      } else {\n        this._willSettleAt(new c(function (resolve$$1) {\n          return resolve$$1(entry);\n        }), i);\n      }\n    } else {\n      this._willSettleAt(resolve$$1(entry), i);\n    }\n  };\n\n  Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n    var promise = this.promise;\n\n\n    if (promise._state === PENDING) {\n      this._remaining--;\n\n      if (state === REJECTED) {\n        reject(promise, value);\n      } else {\n        this._result[i] = value;\n      }\n    }\n\n    if (this._remaining === 0) {\n      fulfill(promise, this._result);\n    }\n  };\n\n  Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n    var enumerator = this;\n\n    subscribe(promise, undefined, function (value) {\n      return enumerator._settledAt(FULFILLED, i, value);\n    }, function (reason) {\n      return enumerator._settledAt(REJECTED, i, reason);\n    });\n  };\n\n  return Enumerator;\n}();\n\n/**\n  `Promise.all` accepts an array of promises, and returns a new promise which\n  is fulfilled with an array of fulfillment values for the passed promises, or\n  rejected with the reason of the first passed promise to be rejected. It casts all\n  elements of the passed iterable to promises as it runs this algorithm.\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = resolve(2);\n  let promise3 = resolve(3);\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // The array here would be [ 1, 2, 3 ];\n  });\n  ```\n\n  If any of the `promises` given to `all` are rejected, the first promise\n  that is rejected will be given as an argument to the returned promises's\n  rejection handler. For example:\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = reject(new Error(\"2\"));\n  let promise3 = reject(new Error(\"3\"));\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // Code here never runs because there are rejected promises!\n  }, function(error) {\n    // error.message === \"2\"\n  });\n  ```\n\n  @method all\n  @static\n  @param {Array} entries array of promises\n  @param {String} label optional string for labeling the promise.\n  Useful for tooling.\n  @return {Promise} promise that is fulfilled when all `promises` have been\n  fulfilled, or rejected if any of them become rejected.\n  @static\n*/\nfunction all(entries) {\n  return new Enumerator(this, entries).promise;\n}\n\n/**\n  `Promise.race` returns a new promise which is settled in the same way as the\n  first passed promise to settle.\n\n  Example:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 2');\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // result === 'promise 2' because it was resolved before promise1\n    // was resolved.\n  });\n  ```\n\n  `Promise.race` is deterministic in that only the state of the first\n  settled promise matters. For example, even if other promises given to the\n  `promises` array argument are resolved, but the first settled promise has\n  become rejected before the other promises became fulfilled, the returned\n  promise will become rejected:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      reject(new Error('promise 2'));\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // Code here never runs\n  }, function(reason){\n    // reason.message === 'promise 2' because promise 2 became rejected before\n    // promise 1 became fulfilled\n  });\n  ```\n\n  An example real-world use case is implementing timeouts:\n\n  ```javascript\n  Promise.race([ajax('foo.json'), timeout(5000)])\n  ```\n\n  @method race\n  @static\n  @param {Array} promises array of promises to observe\n  Useful for tooling.\n  @return {Promise} a promise which settles in the same way as the first passed\n  promise to settle.\n*/\nfunction race(entries) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (!isArray(entries)) {\n    return new Constructor(function (_, reject) {\n      return reject(new TypeError('You must pass an array to race.'));\n    });\n  } else {\n    return new Constructor(function (resolve, reject) {\n      var length = entries.length;\n      for (var i = 0; i < length; i++) {\n        Constructor.resolve(entries[i]).then(resolve, reject);\n      }\n    });\n  }\n}\n\n/**\n  `Promise.reject` returns a promise rejected with the passed `reason`.\n  It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    reject(new Error('WHOOPS'));\n  });\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.reject(new Error('WHOOPS'));\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  @method reject\n  @static\n  @param {Any} reason value that the returned promise will be rejected with.\n  Useful for tooling.\n  @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n  /*jshint validthis:true */\n  var Constructor = this;\n  var promise = new Constructor(noop);\n  reject(promise, reason);\n  return promise;\n}\n\nfunction needsResolver() {\n  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n  throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n  Promise objects represent the eventual result of an asynchronous operation. The\n  primary way of interacting with a promise is through its `then` method, which\n  registers callbacks to receive either a promise's eventual value or the reason\n  why the promise cannot be fulfilled.\n\n  Terminology\n  -----------\n\n  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n  - `thenable` is an object or function that defines a `then` method.\n  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n  - `exception` is a value that is thrown using the throw statement.\n  - `reason` is a value that indicates why a promise was rejected.\n  - `settled` the final resting state of a promise, fulfilled or rejected.\n\n  A promise can be in one of three states: pending, fulfilled, or rejected.\n\n  Promises that are fulfilled have a fulfillment value and are in the fulfilled\n  state.  Promises that are rejected have a rejection reason and are in the\n  rejected state.  A fulfillment value is never a thenable.\n\n  Promises can also be said to *resolve* a value.  If this value is also a\n  promise, then the original promise's settled state will match the value's\n  settled state.  So a promise that *resolves* a promise that rejects will\n  itself reject, and a promise that *resolves* a promise that fulfills will\n  itself fulfill.\n\n\n  Basic Usage:\n  ------------\n\n  ```js\n  let promise = new Promise(function(resolve, reject) {\n    // on success\n    resolve(value);\n\n    // on failure\n    reject(reason);\n  });\n\n  promise.then(function(value) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Advanced Usage:\n  ---------------\n\n  Promises shine when abstracting away asynchronous interactions such as\n  `XMLHttpRequest`s.\n\n  ```js\n  function getJSON(url) {\n    return new Promise(function(resolve, reject){\n      let xhr = new XMLHttpRequest();\n\n      xhr.open('GET', url);\n      xhr.onreadystatechange = handler;\n      xhr.responseType = 'json';\n      xhr.setRequestHeader('Accept', 'application/json');\n      xhr.send();\n\n      function handler() {\n        if (this.readyState === this.DONE) {\n          if (this.status === 200) {\n            resolve(this.response);\n          } else {\n            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n          }\n        }\n      };\n    });\n  }\n\n  getJSON('/posts.json').then(function(json) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Unlike callbacks, promises are great composable primitives.\n\n  ```js\n  Promise.all([\n    getJSON('/posts'),\n    getJSON('/comments')\n  ]).then(function(values){\n    values[0] // => postsJSON\n    values[1] // => commentsJSON\n\n    return values;\n  });\n  ```\n\n  @class Promise\n  @param {Function} resolver\n  Useful for tooling.\n  @constructor\n*/\n\nvar Promise$1 = function () {\n  function Promise(resolver) {\n    this[PROMISE_ID] = nextId();\n    this._result = this._state = undefined;\n    this._subscribers = [];\n\n    if (noop !== resolver) {\n      typeof resolver !== 'function' && needsResolver();\n      this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n    }\n  }\n\n  /**\n  The primary way of interacting with a promise is through its `then` method,\n  which registers callbacks to receive either a promise's eventual value or the\n  reason why the promise cannot be fulfilled.\n   ```js\n  findUser().then(function(user){\n    // user is available\n  }, function(reason){\n    // user is unavailable, and you are given the reason why\n  });\n  ```\n   Chaining\n  --------\n   The return value of `then` is itself a promise.  This second, 'downstream'\n  promise is resolved with the return value of the first promise's fulfillment\n  or rejection handler, or rejected if the handler throws an exception.\n   ```js\n  findUser().then(function (user) {\n    return user.name;\n  }, function (reason) {\n    return 'default name';\n  }).then(function (userName) {\n    // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n    // will be `'default name'`\n  });\n   findUser().then(function (user) {\n    throw new Error('Found user, but still unhappy');\n  }, function (reason) {\n    throw new Error('`findUser` rejected and we're unhappy');\n  }).then(function (value) {\n    // never reached\n  }, function (reason) {\n    // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n    // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n  });\n  ```\n  If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n   ```js\n  findUser().then(function (user) {\n    throw new PedagogicalException('Upstream error');\n  }).then(function (value) {\n    // never reached\n  }).then(function (value) {\n    // never reached\n  }, function (reason) {\n    // The `PedgagocialException` is propagated all the way down to here\n  });\n  ```\n   Assimilation\n  ------------\n   Sometimes the value you want to propagate to a downstream promise can only be\n  retrieved asynchronously. This can be achieved by returning a promise in the\n  fulfillment or rejection handler. The downstream promise will then be pending\n  until the returned promise is settled. This is called *assimilation*.\n   ```js\n  findUser().then(function (user) {\n    return findCommentsByAuthor(user);\n  }).then(function (comments) {\n    // The user's comments are now available\n  });\n  ```\n   If the assimliated promise rejects, then the downstream promise will also reject.\n   ```js\n  findUser().then(function (user) {\n    return findCommentsByAuthor(user);\n  }).then(function (comments) {\n    // If `findCommentsByAuthor` fulfills, we'll have the value here\n  }, function (reason) {\n    // If `findCommentsByAuthor` rejects, we'll have the reason here\n  });\n  ```\n   Simple Example\n  --------------\n   Synchronous Example\n   ```javascript\n  let result;\n   try {\n    result = findResult();\n    // success\n  } catch(reason) {\n    // failure\n  }\n  ```\n   Errback Example\n   ```js\n  findResult(function(result, err){\n    if (err) {\n      // failure\n    } else {\n      // success\n    }\n  });\n  ```\n   Promise Example;\n   ```javascript\n  findResult().then(function(result){\n    // success\n  }, function(reason){\n    // failure\n  });\n  ```\n   Advanced Example\n  --------------\n   Synchronous Example\n   ```javascript\n  let author, books;\n   try {\n    author = findAuthor();\n    books  = findBooksByAuthor(author);\n    // success\n  } catch(reason) {\n    // failure\n  }\n  ```\n   Errback Example\n   ```js\n   function foundBooks(books) {\n   }\n   function failure(reason) {\n   }\n   findAuthor(function(author, err){\n    if (err) {\n      failure(err);\n      // failure\n    } else {\n      try {\n        findBoooksByAuthor(author, function(books, err) {\n          if (err) {\n            failure(err);\n          } else {\n            try {\n              foundBooks(books);\n            } catch(reason) {\n              failure(reason);\n            }\n          }\n        });\n      } catch(error) {\n        failure(err);\n      }\n      // success\n    }\n  });\n  ```\n   Promise Example;\n   ```javascript\n  findAuthor().\n    then(findBooksByAuthor).\n    then(function(books){\n      // found books\n  }).catch(function(reason){\n    // something went wrong\n  });\n  ```\n   @method then\n  @param {Function} onFulfilled\n  @param {Function} onRejected\n  Useful for tooling.\n  @return {Promise}\n  */\n\n  /**\n  `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n  as the catch block of a try/catch statement.\n  ```js\n  function findAuthor(){\n  throw new Error('couldn't find that author');\n  }\n  // synchronous\n  try {\n  findAuthor();\n  } catch(reason) {\n  // something went wrong\n  }\n  // async with promises\n  findAuthor().catch(function(reason){\n  // something went wrong\n  });\n  ```\n  @method catch\n  @param {Function} onRejection\n  Useful for tooling.\n  @return {Promise}\n  */\n\n\n  Promise.prototype.catch = function _catch(onRejection) {\n    return this.then(null, onRejection);\n  };\n\n  /**\n    `finally` will be invoked regardless of the promise's fate just as native\n    try/catch/finally behaves\n  \n    Synchronous example:\n  \n    ```js\n    findAuthor() {\n      if (Math.random() > 0.5) {\n        throw new Error();\n      }\n      return new Author();\n    }\n  \n    try {\n      return findAuthor(); // succeed or fail\n    } catch(error) {\n      return findOtherAuther();\n    } finally {\n      // always runs\n      // doesn't affect the return value\n    }\n    ```\n  \n    Asynchronous example:\n  \n    ```js\n    findAuthor().catch(function(reason){\n      return findOtherAuther();\n    }).finally(function(){\n      // author was either found, or not\n    });\n    ```\n  \n    @method finally\n    @param {Function} callback\n    @return {Promise}\n  */\n\n\n  Promise.prototype.finally = function _finally(callback) {\n    var promise = this;\n    var constructor = promise.constructor;\n\n    if (isFunction(callback)) {\n      return promise.then(function (value) {\n        return constructor.resolve(callback()).then(function () {\n          return value;\n        });\n      }, function (reason) {\n        return constructor.resolve(callback()).then(function () {\n          throw reason;\n        });\n      });\n    }\n\n    return promise.then(callback, callback);\n  };\n\n  return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n  var local = void 0;\n\n  if (typeof global !== 'undefined') {\n    local = global;\n  } else if (typeof self !== 'undefined') {\n    local = self;\n  } else {\n    try {\n      local = Function('return this')();\n    } catch (e) {\n      throw new Error('polyfill failed because global object is unavailable in this environment');\n    }\n  }\n\n  var P = local.Promise;\n\n  if (P) {\n    var promiseToString = null;\n    try {\n      promiseToString = Object.prototype.toString.call(P.resolve());\n    } catch (e) {\n      // silently ignored\n    }\n\n    if (promiseToString === '[object Promise]' && !P.cast) {\n      return;\n    }\n  }\n\n  local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n//# sourceMappingURL=es6-promise.map\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n","var token = /d{1,4}|M{1,4}|YY(?:YY)?|S{1,3}|Do|ZZ|Z|([HhMsDm])\\1?|[aA]|\"[^\"]*\"|'[^']*'/g;\nvar twoDigitsOptional = \"[1-9]\\\\d?\";\nvar twoDigits = \"\\\\d\\\\d\";\nvar threeDigits = \"\\\\d{3}\";\nvar fourDigits = \"\\\\d{4}\";\nvar word = \"[^\\\\s]+\";\nvar literal = /\\[([^]*?)\\]/gm;\nfunction shorten(arr, sLen) {\n    var newArr = [];\n    for (var i = 0, len = arr.length; i < len; i++) {\n        newArr.push(arr[i].substr(0, sLen));\n    }\n    return newArr;\n}\nvar monthUpdate = function (arrName) { return function (v, i18n) {\n    var lowerCaseArr = i18n[arrName].map(function (v) { return v.toLowerCase(); });\n    var index = lowerCaseArr.indexOf(v.toLowerCase());\n    if (index > -1) {\n        return index;\n    }\n    return null;\n}; };\nfunction assign(origObj) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        args[_i - 1] = arguments[_i];\n    }\n    for (var _a = 0, args_1 = args; _a < args_1.length; _a++) {\n        var obj = args_1[_a];\n        for (var key in obj) {\n            // @ts-ignore ex\n            origObj[key] = obj[key];\n        }\n    }\n    return origObj;\n}\nvar dayNames = [\n    \"Sunday\",\n    \"Monday\",\n    \"Tuesday\",\n    \"Wednesday\",\n    \"Thursday\",\n    \"Friday\",\n    \"Saturday\"\n];\nvar monthNames = [\n    \"January\",\n    \"February\",\n    \"March\",\n    \"April\",\n    \"May\",\n    \"June\",\n    \"July\",\n    \"August\",\n    \"September\",\n    \"October\",\n    \"November\",\n    \"December\"\n];\nvar monthNamesShort = shorten(monthNames, 3);\nvar dayNamesShort = shorten(dayNames, 3);\nvar defaultI18n = {\n    dayNamesShort: dayNamesShort,\n    dayNames: dayNames,\n    monthNamesShort: monthNamesShort,\n    monthNames: monthNames,\n    amPm: [\"am\", \"pm\"],\n    DoFn: function (dayOfMonth) {\n        return (dayOfMonth +\n            [\"th\", \"st\", \"nd\", \"rd\"][dayOfMonth % 10 > 3\n                ? 0\n                : ((dayOfMonth - (dayOfMonth % 10) !== 10 ? 1 : 0) * dayOfMonth) % 10]);\n    }\n};\nvar globalI18n = assign({}, defaultI18n);\nvar setGlobalDateI18n = function (i18n) {\n    return (globalI18n = assign(globalI18n, i18n));\n};\nvar regexEscape = function (str) {\n    return str.replace(/[|\\\\{()[^$+*?.-]/g, \"\\\\$&\");\n};\nvar pad = function (val, len) {\n    if (len === void 0) { len = 2; }\n    val = String(val);\n    while (val.length < len) {\n        val = \"0\" + val;\n    }\n    return val;\n};\nvar formatFlags = {\n    D: function (dateObj) { return String(dateObj.getDate()); },\n    DD: function (dateObj) { return pad(dateObj.getDate()); },\n    Do: function (dateObj, i18n) {\n        return i18n.DoFn(dateObj.getDate());\n    },\n    d: function (dateObj) { return String(dateObj.getDay()); },\n    dd: function (dateObj) { return pad(dateObj.getDay()); },\n    ddd: function (dateObj, i18n) {\n        return i18n.dayNamesShort[dateObj.getDay()];\n    },\n    dddd: function (dateObj, i18n) {\n        return i18n.dayNames[dateObj.getDay()];\n    },\n    M: function (dateObj) { return String(dateObj.getMonth() + 1); },\n    MM: function (dateObj) { return pad(dateObj.getMonth() + 1); },\n    MMM: function (dateObj, i18n) {\n        return i18n.monthNamesShort[dateObj.getMonth()];\n    },\n    MMMM: function (dateObj, i18n) {\n        return i18n.monthNames[dateObj.getMonth()];\n    },\n    YY: function (dateObj) {\n        return pad(String(dateObj.getFullYear()), 4).substr(2);\n    },\n    YYYY: function (dateObj) { return pad(dateObj.getFullYear(), 4); },\n    h: function (dateObj) { return String(dateObj.getHours() % 12 || 12); },\n    hh: function (dateObj) { return pad(dateObj.getHours() % 12 || 12); },\n    H: function (dateObj) { return String(dateObj.getHours()); },\n    HH: function (dateObj) { return pad(dateObj.getHours()); },\n    m: function (dateObj) { return String(dateObj.getMinutes()); },\n    mm: function (dateObj) { return pad(dateObj.getMinutes()); },\n    s: function (dateObj) { return String(dateObj.getSeconds()); },\n    ss: function (dateObj) { return pad(dateObj.getSeconds()); },\n    S: function (dateObj) {\n        return String(Math.round(dateObj.getMilliseconds() / 100));\n    },\n    SS: function (dateObj) {\n        return pad(Math.round(dateObj.getMilliseconds() / 10), 2);\n    },\n    SSS: function (dateObj) { return pad(dateObj.getMilliseconds(), 3); },\n    a: function (dateObj, i18n) {\n        return dateObj.getHours() < 12 ? i18n.amPm[0] : i18n.amPm[1];\n    },\n    A: function (dateObj, i18n) {\n        return dateObj.getHours() < 12\n            ? i18n.amPm[0].toUpperCase()\n            : i18n.amPm[1].toUpperCase();\n    },\n    ZZ: function (dateObj) {\n        var offset = dateObj.getTimezoneOffset();\n        return ((offset > 0 ? \"-\" : \"+\") +\n            pad(Math.floor(Math.abs(offset) / 60) * 100 + (Math.abs(offset) % 60), 4));\n    },\n    Z: function (dateObj) {\n        var offset = dateObj.getTimezoneOffset();\n        return ((offset > 0 ? \"-\" : \"+\") +\n            pad(Math.floor(Math.abs(offset) / 60), 2) +\n            \":\" +\n            pad(Math.abs(offset) % 60, 2));\n    }\n};\nvar monthParse = function (v) { return +v - 1; };\nvar emptyDigits = [null, twoDigitsOptional];\nvar emptyWord = [null, word];\nvar amPm = [\n    \"isPm\",\n    word,\n    function (v, i18n) {\n        var val = v.toLowerCase();\n        if (val === i18n.amPm[0]) {\n            return 0;\n        }\n        else if (val === i18n.amPm[1]) {\n            return 1;\n        }\n        return null;\n    }\n];\nvar timezoneOffset = [\n    \"timezoneOffset\",\n    \"[^\\\\s]*?[\\\\+\\\\-]\\\\d\\\\d:?\\\\d\\\\d|[^\\\\s]*?Z?\",\n    function (v) {\n        var parts = (v + \"\").match(/([+-]|\\d\\d)/gi);\n        if (parts) {\n            var minutes = +parts[1] * 60 + parseInt(parts[2], 10);\n            return parts[0] === \"+\" ? minutes : -minutes;\n        }\n        return 0;\n    }\n];\nvar parseFlags = {\n    D: [\"day\", twoDigitsOptional],\n    DD: [\"day\", twoDigits],\n    Do: [\"day\", twoDigitsOptional + word, function (v) { return parseInt(v, 10); }],\n    M: [\"month\", twoDigitsOptional, monthParse],\n    MM: [\"month\", twoDigits, monthParse],\n    YY: [\n        \"year\",\n        twoDigits,\n        function (v) {\n            var now = new Date();\n            var cent = +(\"\" + now.getFullYear()).substr(0, 2);\n            return +(\"\" + (+v > 68 ? cent - 1 : cent) + v);\n        }\n    ],\n    h: [\"hour\", twoDigitsOptional, undefined, \"isPm\"],\n    hh: [\"hour\", twoDigits, undefined, \"isPm\"],\n    H: [\"hour\", twoDigitsOptional],\n    HH: [\"hour\", twoDigits],\n    m: [\"minute\", twoDigitsOptional],\n    mm: [\"minute\", twoDigits],\n    s: [\"second\", twoDigitsOptional],\n    ss: [\"second\", twoDigits],\n    YYYY: [\"year\", fourDigits],\n    S: [\"millisecond\", \"\\\\d\", function (v) { return +v * 100; }],\n    SS: [\"millisecond\", twoDigits, function (v) { return +v * 10; }],\n    SSS: [\"millisecond\", threeDigits],\n    d: emptyDigits,\n    dd: emptyDigits,\n    ddd: emptyWord,\n    dddd: emptyWord,\n    MMM: [\"month\", word, monthUpdate(\"monthNamesShort\")],\n    MMMM: [\"month\", word, monthUpdate(\"monthNames\")],\n    a: amPm,\n    A: amPm,\n    ZZ: timezoneOffset,\n    Z: timezoneOffset\n};\n// Some common format strings\nvar globalMasks = {\n    default: \"ddd MMM DD YYYY HH:mm:ss\",\n    shortDate: \"M/D/YY\",\n    mediumDate: \"MMM D, YYYY\",\n    longDate: \"MMMM D, YYYY\",\n    fullDate: \"dddd, MMMM D, YYYY\",\n    isoDate: \"YYYY-MM-DD\",\n    isoDateTime: \"YYYY-MM-DDTHH:mm:ssZ\",\n    shortTime: \"HH:mm\",\n    mediumTime: \"HH:mm:ss\",\n    longTime: \"HH:mm:ss.SSS\"\n};\nvar setGlobalDateMasks = function (masks) { return assign(globalMasks, masks); };\n/***\n * Format a date\n * @method format\n * @param {Date|number} dateObj\n * @param {string} mask Format of the date, i.e. 'mm-dd-yy' or 'shortDate'\n * @returns {string} Formatted date string\n */\nvar format = function (dateObj, mask, i18n) {\n    if (mask === void 0) { mask = globalMasks[\"default\"]; }\n    if (i18n === void 0) { i18n = {}; }\n    if (typeof dateObj === \"number\") {\n        dateObj = new Date(dateObj);\n    }\n    if (Object.prototype.toString.call(dateObj) !== \"[object Date]\" ||\n        isNaN(dateObj.getTime())) {\n        throw new Error(\"Invalid Date pass to format\");\n    }\n    mask = globalMasks[mask] || mask;\n    var literals = [];\n    // Make literals inactive by replacing them with @@@\n    mask = mask.replace(literal, function ($0, $1) {\n        literals.push($1);\n        return \"@@@\";\n    });\n    var combinedI18nSettings = assign(assign({}, globalI18n), i18n);\n    // Apply formatting rules\n    mask = mask.replace(token, function ($0) {\n        return formatFlags[$0](dateObj, combinedI18nSettings);\n    });\n    // Inline literal values back into the formatted value\n    return mask.replace(/@@@/g, function () { return literals.shift(); });\n};\n/**\n * Parse a date string into a Javascript Date object /\n * @method parse\n * @param {string} dateStr Date string\n * @param {string} format Date parse format\n * @param {i18n} I18nSettingsOptional Full or subset of I18N settings\n * @returns {Date|null} Returns Date object. Returns null what date string is invalid or doesn't match format\n */\nfunction parse(dateStr, format, i18n) {\n    if (i18n === void 0) { i18n = {}; }\n    if (typeof format !== \"string\") {\n        throw new Error(\"Invalid format in fecha parse\");\n    }\n    // Check to see if the format is actually a mask\n    format = globalMasks[format] || format;\n    // Avoid regular expression denial of service, fail early for really long strings\n    // https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS\n    if (dateStr.length > 1000) {\n        return null;\n    }\n    // Default to the beginning of the year.\n    var today = new Date();\n    var dateInfo = {\n        year: today.getFullYear(),\n        month: 0,\n        day: 1,\n        hour: 0,\n        minute: 0,\n        second: 0,\n        millisecond: 0,\n        isPm: null,\n        timezoneOffset: null\n    };\n    var parseInfo = [];\n    var literals = [];\n    // Replace all the literals with @@@. Hopefully a string that won't exist in the format\n    var newFormat = format.replace(literal, function ($0, $1) {\n        literals.push(regexEscape($1));\n        return \"@@@\";\n    });\n    var specifiedFields = {};\n    var requiredFields = {};\n    // Change every token that we find into the correct regex\n    newFormat = regexEscape(newFormat).replace(token, function ($0) {\n        var info = parseFlags[$0];\n        var field = info[0], regex = info[1], requiredField = info[3];\n        // Check if the person has specified the same field twice. This will lead to confusing results.\n        if (specifiedFields[field]) {\n            throw new Error(\"Invalid format. \" + field + \" specified twice in format\");\n        }\n        specifiedFields[field] = true;\n        // Check if there are any required fields. For instance, 12 hour time requires AM/PM specified\n        if (requiredField) {\n            requiredFields[requiredField] = true;\n        }\n        parseInfo.push(info);\n        return \"(\" + regex + \")\";\n    });\n    // Check all the required fields are present\n    Object.keys(requiredFields).forEach(function (field) {\n        if (!specifiedFields[field]) {\n            throw new Error(\"Invalid format. \" + field + \" is required in specified format\");\n        }\n    });\n    // Add back all the literals after\n    newFormat = newFormat.replace(/@@@/g, function () { return literals.shift(); });\n    // Check if the date string matches the format. If it doesn't return null\n    var matches = dateStr.match(new RegExp(newFormat, \"i\"));\n    if (!matches) {\n        return null;\n    }\n    var combinedI18nSettings = assign(assign({}, globalI18n), i18n);\n    // For each match, call the parser function for that date part\n    for (var i = 1; i < matches.length; i++) {\n        var _a = parseInfo[i - 1], field = _a[0], parser = _a[2];\n        var value = parser\n            ? parser(matches[i], combinedI18nSettings)\n            : +matches[i];\n        // If the parser can't make sense of the value, return null\n        if (value == null) {\n            return null;\n        }\n        dateInfo[field] = value;\n    }\n    if (dateInfo.isPm === 1 && dateInfo.hour != null && +dateInfo.hour !== 12) {\n        dateInfo.hour = +dateInfo.hour + 12;\n    }\n    else if (dateInfo.isPm === 0 && +dateInfo.hour === 12) {\n        dateInfo.hour = 0;\n    }\n    var dateWithoutTZ = new Date(dateInfo.year, dateInfo.month, dateInfo.day, dateInfo.hour, dateInfo.minute, dateInfo.second, dateInfo.millisecond);\n    var validateFields = [\n        [\"month\", \"getMonth\"],\n        [\"day\", \"getDate\"],\n        [\"hour\", \"getHours\"],\n        [\"minute\", \"getMinutes\"],\n        [\"second\", \"getSeconds\"]\n    ];\n    for (var i = 0, len = validateFields.length; i < len; i++) {\n        // Check to make sure the date field is within the allowed range. Javascript dates allows values\n        // outside the allowed range. If the values don't match the value was invalid\n        if (specifiedFields[validateFields[i][0]] &&\n            dateInfo[validateFields[i][0]] !== dateWithoutTZ[validateFields[i][1]]()) {\n            return null;\n        }\n    }\n    if (dateInfo.timezoneOffset == null) {\n        return dateWithoutTZ;\n    }\n    return new Date(Date.UTC(dateInfo.year, dateInfo.month, dateInfo.day, dateInfo.hour, dateInfo.minute - dateInfo.timezoneOffset, dateInfo.second, dateInfo.millisecond));\n}\nvar fecha = {\n    format: format,\n    parse: parse,\n    defaultI18n: defaultI18n,\n    setGlobalDateI18n: setGlobalDateI18n,\n    setGlobalDateMasks: setGlobalDateMasks\n};\n\nexport default fecha;\nexport { assign, format, parse, defaultI18n, setGlobalDateI18n, setGlobalDateMasks };\n//# sourceMappingURL=fecha.js.map\n","// Fingerprintjs2 - Copyright (c) 2018 Valentin Vasilyev (valentin.vasilyev@outlook.com)\n// Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.\n\n!function(e,t,n){\"use strict\";\"undefined\"!=typeof window&&\"function\"==typeof window.define&&window.define.amd?window.define(n):\"undefined\"!=typeof module&&module.exports?module.exports=n():t.exports?t.exports=n():t.Fingerprint2=n()}(0,this,function(){\"use strict\";var d=function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]+t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]+t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]+t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]+t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]},g=function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var n=[0,0,0,0];return n[3]+=e[3]*t[3],n[2]+=n[3]>>>16,n[3]&=65535,n[2]+=e[2]*t[3],n[1]+=n[2]>>>16,n[2]&=65535,n[2]+=e[3]*t[2],n[1]+=n[2]>>>16,n[2]&=65535,n[1]+=e[1]*t[3],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[2]*t[2],n[0]+=n[1]>>>16,n[1]&=65535,n[1]+=e[3]*t[1],n[0]+=n[1]>>>16,n[1]&=65535,n[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],n[0]&=65535,[n[0]<<16|n[1],n[2]<<16|n[3]]},f=function(e,t){return 32===(t%=64)?[e[1],e[0]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t|e[0]>>>32-t]:(t-=32,[e[1]<<t|e[0]>>>32-t,e[0]<<t|e[1]>>>32-t])},h=function(e,t){return 0===(t%=64)?e:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t]:[e[1]<<t-32,0]},m=function(e,t){return[e[0]^t[0],e[1]^t[1]]},T=function(e){return e=m(e,[0,e[0]>>>1]),e=g(e,[4283543511,3981806797]),e=m(e,[0,e[0]>>>1]),e=g(e,[3301882366,444984403]),e=m(e,[0,e[0]>>>1])},l=function(e,t){t=t||0;for(var n=(e=e||\"\").length%16,a=e.length-n,r=[0,t],i=[0,t],o=[0,0],l=[0,0],s=[2277735313,289559509],c=[1291169091,658871167],u=0;u<a;u+=16)o=[255&e.charCodeAt(u+4)|(255&e.charCodeAt(u+5))<<8|(255&e.charCodeAt(u+6))<<16|(255&e.charCodeAt(u+7))<<24,255&e.charCodeAt(u)|(255&e.charCodeAt(u+1))<<8|(255&e.charCodeAt(u+2))<<16|(255&e.charCodeAt(u+3))<<24],l=[255&e.charCodeAt(u+12)|(255&e.charCodeAt(u+13))<<8|(255&e.charCodeAt(u+14))<<16|(255&e.charCodeAt(u+15))<<24,255&e.charCodeAt(u+8)|(255&e.charCodeAt(u+9))<<8|(255&e.charCodeAt(u+10))<<16|(255&e.charCodeAt(u+11))<<24],o=g(o,s),o=f(o,31),o=g(o,c),r=m(r,o),r=f(r,27),r=d(r,i),r=d(g(r,[0,5]),[0,1390208809]),l=g(l,c),l=f(l,33),l=g(l,s),i=m(i,l),i=f(i,31),i=d(i,r),i=d(g(i,[0,5]),[0,944331445]);switch(o=[0,0],l=[0,0],n){case 15:l=m(l,h([0,e.charCodeAt(u+14)],48));case 14:l=m(l,h([0,e.charCodeAt(u+13)],40));case 13:l=m(l,h([0,e.charCodeAt(u+12)],32));case 12:l=m(l,h([0,e.charCodeAt(u+11)],24));case 11:l=m(l,h([0,e.charCodeAt(u+10)],16));case 10:l=m(l,h([0,e.charCodeAt(u+9)],8));case 9:l=m(l,[0,e.charCodeAt(u+8)]),l=g(l,c),l=f(l,33),l=g(l,s),i=m(i,l);case 8:o=m(o,h([0,e.charCodeAt(u+7)],56));case 7:o=m(o,h([0,e.charCodeAt(u+6)],48));case 6:o=m(o,h([0,e.charCodeAt(u+5)],40));case 5:o=m(o,h([0,e.charCodeAt(u+4)],32));case 4:o=m(o,h([0,e.charCodeAt(u+3)],24));case 3:o=m(o,h([0,e.charCodeAt(u+2)],16));case 2:o=m(o,h([0,e.charCodeAt(u+1)],8));case 1:o=m(o,[0,e.charCodeAt(u)]),o=g(o,s),o=f(o,31),o=g(o,c),r=m(r,o)}return r=m(r,[0,e.length]),i=m(i,[0,e.length]),r=d(r,i),i=d(i,r),r=T(r),i=T(i),r=d(r,i),i=d(i,r),(\"00000000\"+(r[0]>>>0).toString(16)).slice(-8)+(\"00000000\"+(r[1]>>>0).toString(16)).slice(-8)+(\"00000000\"+(i[0]>>>0).toString(16)).slice(-8)+(\"00000000\"+(i[1]>>>0).toString(16)).slice(-8)},e={preprocessor:null,audio:{timeout:1e3,excludeIOS11:!0},fonts:{swfContainerId:\"fingerprintjs2\",swfPath:\"flash/compiled/FontList.swf\",userDefinedFonts:[],extendedJsFonts:!1},screen:{detectScreenOrientation:!0},plugins:{sortPluginsFor:[/palemoon/i],excludeIE:!1},extraComponents:[],excludes:{enumerateDevices:!0,pixelRatio:!0,doNotTrack:!0,fontsFlash:!0},NOT_AVAILABLE:\"not available\",ERROR:\"error\",EXCLUDED:\"excluded\"},c=function(e,t){if(Array.prototype.forEach&&e.forEach===Array.prototype.forEach)e.forEach(t);else if(e.length===+e.length)for(var n=0,a=e.length;n<a;n++)t(e[n],n,e);else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r,e)},s=function(e,a){var r=[];return null==e?r:Array.prototype.map&&e.map===Array.prototype.map?e.map(a):(c(e,function(e,t,n){r.push(a(e,t,n))}),r)},n=function(){return navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices},a=function(e){var t=[window.screen.width,window.screen.height];return e.screen.detectScreenOrientation&&t.sort().reverse(),t},r=function(e){if(window.screen.availWidth&&window.screen.availHeight){var t=[window.screen.availHeight,window.screen.availWidth];return e.screen.detectScreenOrientation&&t.sort().reverse(),t}return e.NOT_AVAILABLE},i=function(e){if(null==navigator.plugins)return e.NOT_AVAILABLE;for(var t=[],n=0,a=navigator.plugins.length;n<a;n++)navigator.plugins[n]&&t.push(navigator.plugins[n]);return u(e)&&(t=t.sort(function(e,t){return e.name>t.name?1:e.name<t.name?-1:0})),s(t,function(e){var t=s(e,function(e){return[e.type,e.suffixes]});return[e.name,e.description,t]})},o=function(t){var e=[];if(Object.getOwnPropertyDescriptor&&Object.getOwnPropertyDescriptor(window,\"ActiveXObject\")||\"ActiveXObject\"in window){e=s([\"AcroPDF.PDF\",\"Adodb.Stream\",\"AgControl.AgControl\",\"DevalVRXCtrl.DevalVRXCtrl.1\",\"MacromediaFlashPaper.MacromediaFlashPaper\",\"Msxml2.DOMDocument\",\"Msxml2.XMLHTTP\",\"PDF.PdfCtrl\",\"QuickTime.QuickTime\",\"QuickTimeCheckObject.QuickTimeCheck.1\",\"RealPlayer\",\"RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)\",\"RealVideo.RealVideo(tm) ActiveX Control (32-bit)\",\"Scripting.Dictionary\",\"SWCtl.SWCtl\",\"Shell.UIHelper\",\"ShockwaveFlash.ShockwaveFlash\",\"Skype.Detection\",\"TDCCtl.TDCCtl\",\"WMPlayer.OCX\",\"rmocx.RealPlayer G2 Control\",\"rmocx.RealPlayer G2 Control.1\"],function(e){try{return new window.ActiveXObject(e),e}catch(e){return t.ERROR}})}else e.push(t.NOT_AVAILABLE);return navigator.plugins&&(e=e.concat(i(t))),e},u=function(e){for(var t=!1,n=0,a=e.plugins.sortPluginsFor.length;n<a;n++){var r=e.plugins.sortPluginsFor[n];if(navigator.userAgent.match(r)){t=!0;break}}return t},p=function(t){try{return!!window.sessionStorage}catch(e){return t.ERROR}},v=function(t){try{return!!window.localStorage}catch(e){return t.ERROR}},A=function(t){try{return!!window.indexedDB}catch(e){return t.ERROR}},S=function(e){return navigator.hardwareConcurrency?navigator.hardwareConcurrency:e.NOT_AVAILABLE},C=function(e){return navigator.cpuClass||e.NOT_AVAILABLE},B=function(e){return navigator.platform?navigator.platform:e.NOT_AVAILABLE},w=function(e){return navigator.doNotTrack?navigator.doNotTrack:navigator.msDoNotTrack?navigator.msDoNotTrack:window.doNotTrack?window.doNotTrack:e.NOT_AVAILABLE},t=function(){var t,e=0;void 0!==navigator.maxTouchPoints?e=navigator.maxTouchPoints:void 0!==navigator.msMaxTouchPoints&&(e=navigator.msMaxTouchPoints);try{document.createEvent(\"TouchEvent\"),t=!0}catch(e){t=!1}return[e,t,\"ontouchstart\"in window]},y=function(e){var t=[],n=document.createElement(\"canvas\");n.width=2e3,n.height=200,n.style.display=\"inline\";var a=n.getContext(\"2d\");return a.rect(0,0,10,10),a.rect(2,2,6,6),t.push(\"canvas winding:\"+(!1===a.isPointInPath(5,5,\"evenodd\")?\"yes\":\"no\")),a.textBaseline=\"alphabetic\",a.fillStyle=\"#f60\",a.fillRect(125,1,62,20),a.fillStyle=\"#069\",e.dontUseFakeFontInCanvas?a.font=\"11pt Arial\":a.font=\"11pt no-real-font-123\",a.fillText(\"Cwm fjordbank glyphs vext quiz, \\ud83d\\ude03\",2,15),a.fillStyle=\"rgba(102, 204, 0, 0.2)\",a.font=\"18pt Arial\",a.fillText(\"Cwm fjordbank glyphs vext quiz, \\ud83d\\ude03\",4,45),a.globalCompositeOperation=\"multiply\",a.fillStyle=\"rgb(255,0,255)\",a.beginPath(),a.arc(50,50,50,0,2*Math.PI,!0),a.closePath(),a.fill(),a.fillStyle=\"rgb(0,255,255)\",a.beginPath(),a.arc(100,50,50,0,2*Math.PI,!0),a.closePath(),a.fill(),a.fillStyle=\"rgb(255,255,0)\",a.beginPath(),a.arc(75,100,50,0,2*Math.PI,!0),a.closePath(),a.fill(),a.fillStyle=\"rgb(255,0,255)\",a.arc(75,75,75,0,2*Math.PI,!0),a.arc(75,75,25,0,2*Math.PI,!0),a.fill(\"evenodd\"),n.toDataURL&&t.push(\"canvas fp:\"+n.toDataURL()),t},E=function(){var o,e=function(e){return o.clearColor(0,0,0,1),o.enable(o.DEPTH_TEST),o.depthFunc(o.LEQUAL),o.clear(o.COLOR_BUFFER_BIT|o.DEPTH_BUFFER_BIT),\"[\"+e[0]+\", \"+e[1]+\"]\"};if(!(o=F()))return null;var l=[],t=o.createBuffer();o.bindBuffer(o.ARRAY_BUFFER,t);var n=new Float32Array([-.2,-.9,0,.4,-.26,0,0,.732134444,0]);o.bufferData(o.ARRAY_BUFFER,n,o.STATIC_DRAW),t.itemSize=3,t.numItems=3;var a=o.createProgram(),r=o.createShader(o.VERTEX_SHADER);o.shaderSource(r,\"attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate=attrVertex+uniformOffset;gl_Position=vec4(attrVertex,0,1);}\"),o.compileShader(r);var i=o.createShader(o.FRAGMENT_SHADER);o.shaderSource(i,\"precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor=vec4(varyinTexCoordinate,0,1);}\"),o.compileShader(i),o.attachShader(a,r),o.attachShader(a,i),o.linkProgram(a),o.useProgram(a),a.vertexPosAttrib=o.getAttribLocation(a,\"attrVertex\"),a.offsetUniform=o.getUniformLocation(a,\"uniformOffset\"),o.enableVertexAttribArray(a.vertexPosArray),o.vertexAttribPointer(a.vertexPosAttrib,t.itemSize,o.FLOAT,!1,0,0),o.uniform2f(a.offsetUniform,1,1),o.drawArrays(o.TRIANGLE_STRIP,0,t.numItems);try{l.push(o.canvas.toDataURL())}catch(e){}l.push(\"extensions:\"+(o.getSupportedExtensions()||[]).join(\";\")),l.push(\"webgl aliased line width range:\"+e(o.getParameter(o.ALIASED_LINE_WIDTH_RANGE))),l.push(\"webgl aliased point size range:\"+e(o.getParameter(o.ALIASED_POINT_SIZE_RANGE))),l.push(\"webgl alpha bits:\"+o.getParameter(o.ALPHA_BITS)),l.push(\"webgl antialiasing:\"+(o.getContextAttributes().antialias?\"yes\":\"no\")),l.push(\"webgl blue bits:\"+o.getParameter(o.BLUE_BITS)),l.push(\"webgl depth bits:\"+o.getParameter(o.DEPTH_BITS)),l.push(\"webgl green bits:\"+o.getParameter(o.GREEN_BITS)),l.push(\"webgl max anisotropy:\"+function(e){var t=e.getExtension(\"EXT_texture_filter_anisotropic\")||e.getExtension(\"WEBKIT_EXT_texture_filter_anisotropic\")||e.getExtension(\"MOZ_EXT_texture_filter_anisotropic\");if(t){var n=e.getParameter(t.MAX_TEXTURE_MAX_ANISOTROPY_EXT);return 0===n&&(n=2),n}return null}(o)),l.push(\"webgl max combined texture image units:\"+o.getParameter(o.MAX_COMBINED_TEXTURE_IMAGE_UNITS)),l.push(\"webgl max cube map texture size:\"+o.getParameter(o.MAX_CUBE_MAP_TEXTURE_SIZE)),l.push(\"webgl max fragment uniform vectors:\"+o.getParameter(o.MAX_FRAGMENT_UNIFORM_VECTORS)),l.push(\"webgl max render buffer size:\"+o.getParameter(o.MAX_RENDERBUFFER_SIZE)),l.push(\"webgl max texture image units:\"+o.getParameter(o.MAX_TEXTURE_IMAGE_UNITS)),l.push(\"webgl max texture size:\"+o.getParameter(o.MAX_TEXTURE_SIZE)),l.push(\"webgl max varying vectors:\"+o.getParameter(o.MAX_VARYING_VECTORS)),l.push(\"webgl max vertex attribs:\"+o.getParameter(o.MAX_VERTEX_ATTRIBS)),l.push(\"webgl max vertex texture image units:\"+o.getParameter(o.MAX_VERTEX_TEXTURE_IMAGE_UNITS)),l.push(\"webgl max vertex uniform vectors:\"+o.getParameter(o.MAX_VERTEX_UNIFORM_VECTORS)),l.push(\"webgl max viewport dims:\"+e(o.getParameter(o.MAX_VIEWPORT_DIMS))),l.push(\"webgl red bits:\"+o.getParameter(o.RED_BITS)),l.push(\"webgl renderer:\"+o.getParameter(o.RENDERER)),l.push(\"webgl shading language version:\"+o.getParameter(o.SHADING_LANGUAGE_VERSION)),l.push(\"webgl stencil bits:\"+o.getParameter(o.STENCIL_BITS)),l.push(\"webgl vendor:\"+o.getParameter(o.VENDOR)),l.push(\"webgl version:\"+o.getParameter(o.VERSION));try{var s=o.getExtension(\"WEBGL_debug_renderer_info\");s&&(l.push(\"webgl unmasked vendor:\"+o.getParameter(s.UNMASKED_VENDOR_WEBGL)),l.push(\"webgl unmasked renderer:\"+o.getParameter(s.UNMASKED_RENDERER_WEBGL)))}catch(e){}return o.getShaderPrecisionFormat&&c([\"FLOAT\",\"INT\"],function(i){c([\"VERTEX\",\"FRAGMENT\"],function(r){c([\"HIGH\",\"MEDIUM\",\"LOW\"],function(a){c([\"precision\",\"rangeMin\",\"rangeMax\"],function(e){var t=o.getShaderPrecisionFormat(o[r+\"_SHADER\"],o[a+\"_\"+i])[e];\"precision\"!==e&&(e=\"precision \"+e);var n=[\"webgl \",r.toLowerCase(),\" shader \",a.toLowerCase(),\" \",i.toLowerCase(),\" \",e,\":\",t].join(\"\");l.push(n)})})})}),l},M=function(){try{var e=F(),t=e.getExtension(\"WEBGL_debug_renderer_info\");return e.getParameter(t.UNMASKED_VENDOR_WEBGL)+\"~\"+e.getParameter(t.UNMASKED_RENDERER_WEBGL)}catch(e){return null}},x=function(){var e=document.createElement(\"div\");e.innerHTML=\"&nbsp;\";var t=!(e.className=\"adsbox\");try{document.body.appendChild(e),t=0===document.getElementsByClassName(\"adsbox\")[0].offsetHeight,document.body.removeChild(e)}catch(e){t=!1}return t},O=function(){if(void 0!==navigator.languages)try{if(navigator.languages[0].substr(0,2)!==navigator.language.substr(0,2))return!0}catch(e){return!0}return!1},P=function(){return window.screen.width<window.screen.availWidth||window.screen.height<window.screen.availHeight},b=function(){var e,t=navigator.userAgent.toLowerCase(),n=navigator.oscpu,a=navigator.platform.toLowerCase();if(e=0<=t.indexOf(\"windows phone\")?\"Windows Phone\":0<=t.indexOf(\"win\")?\"Windows\":0<=t.indexOf(\"android\")?\"Android\":0<=t.indexOf(\"linux\")?\"Linux\":0<=t.indexOf(\"iphone\")||0<=t.indexOf(\"ipad\")?\"iOS\":0<=t.indexOf(\"mac\")?\"Mac\":\"Other\",(\"ontouchstart\"in window||0<navigator.maxTouchPoints||0<navigator.msMaxTouchPoints)&&\"Windows Phone\"!==e&&\"Android\"!==e&&\"iOS\"!==e&&\"Other\"!==e)return!0;if(void 0!==n){if(0<=(n=n.toLowerCase()).indexOf(\"win\")&&\"Windows\"!==e&&\"Windows Phone\"!==e)return!0;if(0<=n.indexOf(\"linux\")&&\"Linux\"!==e&&\"Android\"!==e)return!0;if(0<=n.indexOf(\"mac\")&&\"Mac\"!==e&&\"iOS\"!==e)return!0;if((-1===n.indexOf(\"win\")&&-1===n.indexOf(\"linux\")&&-1===n.indexOf(\"mac\"))!=(\"Other\"===e))return!0}return 0<=a.indexOf(\"win\")&&\"Windows\"!==e&&\"Windows Phone\"!==e||((0<=a.indexOf(\"linux\")||0<=a.indexOf(\"android\")||0<=a.indexOf(\"pike\"))&&\"Linux\"!==e&&\"Android\"!==e||((0<=a.indexOf(\"mac\")||0<=a.indexOf(\"ipad\")||0<=a.indexOf(\"ipod\")||0<=a.indexOf(\"iphone\"))&&\"Mac\"!==e&&\"iOS\"!==e||((-1===a.indexOf(\"win\")&&-1===a.indexOf(\"linux\")&&-1===a.indexOf(\"mac\"))!=(\"Other\"===e)||void 0===navigator.plugins&&\"Windows\"!==e&&\"Windows Phone\"!==e)))},L=function(){var e,t=navigator.userAgent.toLowerCase(),n=navigator.productSub;if((\"Chrome\"===(e=0<=t.indexOf(\"firefox\")?\"Firefox\":0<=t.indexOf(\"opera\")||0<=t.indexOf(\"opr\")?\"Opera\":0<=t.indexOf(\"chrome\")?\"Chrome\":0<=t.indexOf(\"safari\")?\"Safari\":0<=t.indexOf(\"trident\")?\"Internet Explorer\":\"Other\")||\"Safari\"===e||\"Opera\"===e)&&\"20030107\"!==n)return!0;var a,r=eval.toString().length;if(37===r&&\"Safari\"!==e&&\"Firefox\"!==e&&\"Other\"!==e)return!0;if(39===r&&\"Internet Explorer\"!==e&&\"Other\"!==e)return!0;if(33===r&&\"Chrome\"!==e&&\"Opera\"!==e&&\"Other\"!==e)return!0;try{throw\"a\"}catch(e){try{e.toSource(),a=!0}catch(e){a=!1}}return a&&\"Firefox\"!==e&&\"Other\"!==e},I=function(){var e=document.createElement(\"canvas\");return!(!e.getContext||!e.getContext(\"2d\"))},k=function(){if(!I())return!1;var e=F();return!!window.WebGLRenderingContext&&!!e},R=function(){return\"Microsoft Internet Explorer\"===navigator.appName||!(\"Netscape\"!==navigator.appName||!/Trident/.test(navigator.userAgent))},D=function(){return void 0!==window.swfobject},N=function(){return window.swfobject.hasFlashPlayerVersion(\"9.0.0\")},_=function(t,e){var n=\"___fp_swf_loaded\";window[n]=function(e){t(e)};var a,r,i=e.fonts.swfContainerId;(r=document.createElement(\"div\")).setAttribute(\"id\",a.fonts.swfContainerId),document.body.appendChild(r);var o={onReady:n};window.swfobject.embedSWF(e.fonts.swfPath,i,\"1\",\"1\",\"9.0.0\",!1,o,{allowScriptAccess:\"always\",menu:\"false\"},{})},F=function(){var e=document.createElement(\"canvas\"),t=null;try{t=e.getContext(\"webgl\")||e.getContext(\"experimental-webgl\")}catch(e){}return t||(t=null),t},G=[{key:\"userAgent\",getData:function(e){e(navigator.userAgent)}},{key:\"language\",getData:function(e,t){e(navigator.language||navigator.userLanguage||navigator.browserLanguage||navigator.systemLanguage||t.NOT_AVAILABLE)}},{key:\"colorDepth\",getData:function(e,t){e(window.screen.colorDepth||t.NOT_AVAILABLE)}},{key:\"deviceMemory\",getData:function(e,t){e(navigator.deviceMemory||t.NOT_AVAILABLE)}},{key:\"pixelRatio\",getData:function(e,t){e(window.devicePixelRatio||t.NOT_AVAILABLE)}},{key:\"hardwareConcurrency\",getData:function(e,t){e(S(t))}},{key:\"screenResolution\",getData:function(e,t){e(a(t))}},{key:\"availableScreenResolution\",getData:function(e,t){e(r(t))}},{key:\"timezoneOffset\",getData:function(e){e((new Date).getTimezoneOffset())}},{key:\"timezone\",getData:function(e,t){window.Intl&&window.Intl.DateTimeFormat?e((new window.Intl.DateTimeFormat).resolvedOptions().timeZone):e(t.NOT_AVAILABLE)}},{key:\"sessionStorage\",getData:function(e,t){e(p(t))}},{key:\"localStorage\",getData:function(e,t){e(v(t))}},{key:\"indexedDb\",getData:function(e,t){e(A(t))}},{key:\"addBehavior\",getData:function(e){e(!(!document.body||!document.body.addBehavior))}},{key:\"openDatabase\",getData:function(e){e(!!window.openDatabase)}},{key:\"cpuClass\",getData:function(e,t){e(C(t))}},{key:\"platform\",getData:function(e,t){e(B(t))}},{key:\"doNotTrack\",getData:function(e,t){e(w(t))}},{key:\"plugins\",getData:function(e,t){R()?t.plugins.excludeIE?e(t.EXCLUDED):e(o(t)):e(i(t))}},{key:\"canvas\",getData:function(e,t){I()?e(y(t)):e(t.NOT_AVAILABLE)}},{key:\"webgl\",getData:function(e,t){k()?e(E()):e(t.NOT_AVAILABLE)}},{key:\"webglVendorAndRenderer\",getData:function(e){k()?e(M()):e()}},{key:\"adBlock\",getData:function(e){e(x())}},{key:\"hasLiedLanguages\",getData:function(e){e(O())}},{key:\"hasLiedResolution\",getData:function(e){e(P())}},{key:\"hasLiedOs\",getData:function(e){e(b())}},{key:\"hasLiedBrowser\",getData:function(e){e(L())}},{key:\"touchSupport\",getData:function(e){e(t())}},{key:\"fonts\",getData:function(e,t){var u=[\"monospace\",\"sans-serif\",\"serif\"],d=[\"Andale Mono\",\"Arial\",\"Arial Black\",\"Arial Hebrew\",\"Arial MT\",\"Arial Narrow\",\"Arial Rounded MT Bold\",\"Arial Unicode MS\",\"Bitstream Vera Sans Mono\",\"Book Antiqua\",\"Bookman Old Style\",\"Calibri\",\"Cambria\",\"Cambria Math\",\"Century\",\"Century Gothic\",\"Century Schoolbook\",\"Comic Sans\",\"Comic Sans MS\",\"Consolas\",\"Courier\",\"Courier New\",\"Geneva\",\"Georgia\",\"Helvetica\",\"Helvetica Neue\",\"Impact\",\"Lucida Bright\",\"Lucida Calligraphy\",\"Lucida Console\",\"Lucida Fax\",\"LUCIDA GRANDE\",\"Lucida Handwriting\",\"Lucida Sans\",\"Lucida Sans Typewriter\",\"Lucida Sans Unicode\",\"Microsoft Sans Serif\",\"Monaco\",\"Monotype Corsiva\",\"MS Gothic\",\"MS Outlook\",\"MS PGothic\",\"MS Reference Sans Serif\",\"MS Sans Serif\",\"MS Serif\",\"MYRIAD\",\"MYRIAD PRO\",\"Palatino\",\"Palatino Linotype\",\"Segoe Print\",\"Segoe Script\",\"Segoe UI\",\"Segoe UI Light\",\"Segoe UI Semibold\",\"Segoe UI Symbol\",\"Tahoma\",\"Times\",\"Times New Roman\",\"Times New Roman PS\",\"Trebuchet MS\",\"Verdana\",\"Wingdings\",\"Wingdings 2\",\"Wingdings 3\"];t.fonts.extendedJsFonts&&(d=d.concat([\"Abadi MT Condensed Light\",\"Academy Engraved LET\",\"ADOBE CASLON PRO\",\"Adobe Garamond\",\"ADOBE GARAMOND PRO\",\"Agency FB\",\"Aharoni\",\"Albertus Extra Bold\",\"Albertus Medium\",\"Algerian\",\"Amazone BT\",\"American Typewriter\",\"American Typewriter Condensed\",\"AmerType Md BT\",\"Andalus\",\"Angsana New\",\"AngsanaUPC\",\"Antique Olive\",\"Aparajita\",\"Apple Chancery\",\"Apple Color Emoji\",\"Apple SD Gothic Neo\",\"Arabic Typesetting\",\"ARCHER\",\"ARNO PRO\",\"Arrus BT\",\"Aurora Cn BT\",\"AvantGarde Bk BT\",\"AvantGarde Md BT\",\"AVENIR\",\"Ayuthaya\",\"Bandy\",\"Bangla Sangam MN\",\"Bank Gothic\",\"BankGothic Md BT\",\"Baskerville\",\"Baskerville Old Face\",\"Batang\",\"BatangChe\",\"Bauer Bodoni\",\"Bauhaus 93\",\"Bazooka\",\"Bell MT\",\"Bembo\",\"Benguiat Bk BT\",\"Berlin Sans FB\",\"Berlin Sans FB Demi\",\"Bernard MT Condensed\",\"BernhardFashion BT\",\"BernhardMod BT\",\"Big Caslon\",\"BinnerD\",\"Blackadder ITC\",\"BlairMdITC TT\",\"Bodoni 72\",\"Bodoni 72 Oldstyle\",\"Bodoni 72 Smallcaps\",\"Bodoni MT\",\"Bodoni MT Black\",\"Bodoni MT Condensed\",\"Bodoni MT Poster Compressed\",\"Bookshelf Symbol 7\",\"Boulder\",\"Bradley Hand\",\"Bradley Hand ITC\",\"Bremen Bd BT\",\"Britannic Bold\",\"Broadway\",\"Browallia New\",\"BrowalliaUPC\",\"Brush Script MT\",\"Californian FB\",\"Calisto MT\",\"Calligrapher\",\"Candara\",\"CaslonOpnface BT\",\"Castellar\",\"Centaur\",\"Cezanne\",\"CG Omega\",\"CG Times\",\"Chalkboard\",\"Chalkboard SE\",\"Chalkduster\",\"Charlesworth\",\"Charter Bd BT\",\"Charter BT\",\"Chaucer\",\"ChelthmITC Bk BT\",\"Chiller\",\"Clarendon\",\"Clarendon Condensed\",\"CloisterBlack BT\",\"Cochin\",\"Colonna MT\",\"Constantia\",\"Cooper Black\",\"Copperplate\",\"Copperplate Gothic\",\"Copperplate Gothic Bold\",\"Copperplate Gothic Light\",\"CopperplGoth Bd BT\",\"Corbel\",\"Cordia New\",\"CordiaUPC\",\"Cornerstone\",\"Coronet\",\"Cuckoo\",\"Curlz MT\",\"DaunPenh\",\"Dauphin\",\"David\",\"DB LCD Temp\",\"DELICIOUS\",\"Denmark\",\"DFKai-SB\",\"Didot\",\"DilleniaUPC\",\"DIN\",\"DokChampa\",\"Dotum\",\"DotumChe\",\"Ebrima\",\"Edwardian Script ITC\",\"Elephant\",\"English 111 Vivace BT\",\"Engravers MT\",\"EngraversGothic BT\",\"Eras Bold ITC\",\"Eras Demi ITC\",\"Eras Light ITC\",\"Eras Medium ITC\",\"EucrosiaUPC\",\"Euphemia\",\"Euphemia UCAS\",\"EUROSTILE\",\"Exotc350 Bd BT\",\"FangSong\",\"Felix Titling\",\"Fixedsys\",\"FONTIN\",\"Footlight MT Light\",\"Forte\",\"FrankRuehl\",\"Fransiscan\",\"Freefrm721 Blk BT\",\"FreesiaUPC\",\"Freestyle Script\",\"French Script MT\",\"FrnkGothITC Bk BT\",\"Fruitger\",\"FRUTIGER\",\"Futura\",\"Futura Bk BT\",\"Futura Lt BT\",\"Futura Md BT\",\"Futura ZBlk BT\",\"FuturaBlack BT\",\"Gabriola\",\"Galliard BT\",\"Gautami\",\"Geeza Pro\",\"Geometr231 BT\",\"Geometr231 Hv BT\",\"Geometr231 Lt BT\",\"GeoSlab 703 Lt BT\",\"GeoSlab 703 XBd BT\",\"Gigi\",\"Gill Sans\",\"Gill Sans MT\",\"Gill Sans MT Condensed\",\"Gill Sans MT Ext Condensed Bold\",\"Gill Sans Ultra Bold\",\"Gill Sans Ultra Bold Condensed\",\"Gisha\",\"Gloucester MT Extra Condensed\",\"GOTHAM\",\"GOTHAM BOLD\",\"Goudy Old Style\",\"Goudy Stout\",\"GoudyHandtooled BT\",\"GoudyOLSt BT\",\"Gujarati Sangam MN\",\"Gulim\",\"GulimChe\",\"Gungsuh\",\"GungsuhChe\",\"Gurmukhi MN\",\"Haettenschweiler\",\"Harlow Solid Italic\",\"Harrington\",\"Heather\",\"Heiti SC\",\"Heiti TC\",\"HELV\",\"Herald\",\"High Tower Text\",\"Hiragino Kaku Gothic ProN\",\"Hiragino Mincho ProN\",\"Hoefler Text\",\"Humanst 521 Cn BT\",\"Humanst521 BT\",\"Humanst521 Lt BT\",\"Imprint MT Shadow\",\"Incised901 Bd BT\",\"Incised901 BT\",\"Incised901 Lt BT\",\"INCONSOLATA\",\"Informal Roman\",\"Informal011 BT\",\"INTERSTATE\",\"IrisUPC\",\"Iskoola Pota\",\"JasmineUPC\",\"Jazz LET\",\"Jenson\",\"Jester\",\"Jokerman\",\"Juice ITC\",\"Kabel Bk BT\",\"Kabel Ult BT\",\"Kailasa\",\"KaiTi\",\"Kalinga\",\"Kannada Sangam MN\",\"Kartika\",\"Kaufmann Bd BT\",\"Kaufmann BT\",\"Khmer UI\",\"KodchiangUPC\",\"Kokila\",\"Korinna BT\",\"Kristen ITC\",\"Krungthep\",\"Kunstler Script\",\"Lao UI\",\"Latha\",\"Leelawadee\",\"Letter Gothic\",\"Levenim MT\",\"LilyUPC\",\"Lithograph\",\"Lithograph Light\",\"Long Island\",\"Lydian BT\",\"Magneto\",\"Maiandra GD\",\"Malayalam Sangam MN\",\"Malgun Gothic\",\"Mangal\",\"Marigold\",\"Marion\",\"Marker Felt\",\"Market\",\"Marlett\",\"Matisse ITC\",\"Matura MT Script Capitals\",\"Meiryo\",\"Meiryo UI\",\"Microsoft Himalaya\",\"Microsoft JhengHei\",\"Microsoft New Tai Lue\",\"Microsoft PhagsPa\",\"Microsoft Tai Le\",\"Microsoft Uighur\",\"Microsoft YaHei\",\"Microsoft Yi Baiti\",\"MingLiU\",\"MingLiU_HKSCS\",\"MingLiU_HKSCS-ExtB\",\"MingLiU-ExtB\",\"Minion\",\"Minion Pro\",\"Miriam\",\"Miriam Fixed\",\"Mistral\",\"Modern\",\"Modern No. 20\",\"Mona Lisa Solid ITC TT\",\"Mongolian Baiti\",\"MONO\",\"MoolBoran\",\"Mrs Eaves\",\"MS LineDraw\",\"MS Mincho\",\"MS PMincho\",\"MS Reference Specialty\",\"MS UI Gothic\",\"MT Extra\",\"MUSEO\",\"MV Boli\",\"Nadeem\",\"Narkisim\",\"NEVIS\",\"News Gothic\",\"News GothicMT\",\"NewsGoth BT\",\"Niagara Engraved\",\"Niagara Solid\",\"Noteworthy\",\"NSimSun\",\"Nyala\",\"OCR A Extended\",\"Old Century\",\"Old English Text MT\",\"Onyx\",\"Onyx BT\",\"OPTIMA\",\"Oriya Sangam MN\",\"OSAKA\",\"OzHandicraft BT\",\"Palace Script MT\",\"Papyrus\",\"Parchment\",\"Party LET\",\"Pegasus\",\"Perpetua\",\"Perpetua Titling MT\",\"PetitaBold\",\"Pickwick\",\"Plantagenet Cherokee\",\"Playbill\",\"PMingLiU\",\"PMingLiU-ExtB\",\"Poor Richard\",\"Poster\",\"PosterBodoni BT\",\"PRINCETOWN LET\",\"Pristina\",\"PTBarnum BT\",\"Pythagoras\",\"Raavi\",\"Rage Italic\",\"Ravie\",\"Ribbon131 Bd BT\",\"Rockwell\",\"Rockwell Condensed\",\"Rockwell Extra Bold\",\"Rod\",\"Roman\",\"Sakkal Majalla\",\"Santa Fe LET\",\"Savoye LET\",\"Sceptre\",\"Script\",\"Script MT Bold\",\"SCRIPTINA\",\"Serifa\",\"Serifa BT\",\"Serifa Th BT\",\"ShelleyVolante BT\",\"Sherwood\",\"Shonar Bangla\",\"Showcard Gothic\",\"Shruti\",\"Signboard\",\"SILKSCREEN\",\"SimHei\",\"Simplified Arabic\",\"Simplified Arabic Fixed\",\"SimSun\",\"SimSun-ExtB\",\"Sinhala Sangam MN\",\"Sketch Rockwell\",\"Skia\",\"Small Fonts\",\"Snap ITC\",\"Snell Roundhand\",\"Socket\",\"Souvenir Lt BT\",\"Staccato222 BT\",\"Steamer\",\"Stencil\",\"Storybook\",\"Styllo\",\"Subway\",\"Swis721 BlkEx BT\",\"Swiss911 XCm BT\",\"Sylfaen\",\"Synchro LET\",\"System\",\"Tamil Sangam MN\",\"Technical\",\"Teletype\",\"Telugu Sangam MN\",\"Tempus Sans ITC\",\"Terminal\",\"Thonburi\",\"Traditional Arabic\",\"Trajan\",\"TRAJAN PRO\",\"Tristan\",\"Tubular\",\"Tunga\",\"Tw Cen MT\",\"Tw Cen MT Condensed\",\"Tw Cen MT Condensed Extra Bold\",\"TypoUpright BT\",\"Unicorn\",\"Univers\",\"Univers CE 55 Medium\",\"Univers Condensed\",\"Utsaah\",\"Vagabond\",\"Vani\",\"Vijaya\",\"Viner Hand ITC\",\"VisualUI\",\"Vivaldi\",\"Vladimir Script\",\"Vrinda\",\"Westminster\",\"WHITNEY\",\"Wide Latin\",\"ZapfEllipt BT\",\"ZapfHumnst BT\",\"ZapfHumnst Dm BT\",\"Zapfino\",\"Zurich BlkEx BT\",\"Zurich Ex BT\",\"ZWAdobeF\"]));d=(d=d.concat(t.fonts.userDefinedFonts)).filter(function(e,t){return d.indexOf(e)===t});var n=document.getElementsByTagName(\"body\")[0],r=document.createElement(\"div\"),g=document.createElement(\"div\"),a={},i={},f=function(){var e=document.createElement(\"span\");return e.style.position=\"absolute\",e.style.left=\"-9999px\",e.style.fontSize=\"72px\",e.style.fontStyle=\"normal\",e.style.fontWeight=\"normal\",e.style.letterSpacing=\"normal\",e.style.lineBreak=\"auto\",e.style.lineHeight=\"normal\",e.style.textTransform=\"none\",e.style.textAlign=\"left\",e.style.textDecoration=\"none\",e.style.textShadow=\"none\",e.style.whiteSpace=\"normal\",e.style.wordBreak=\"normal\",e.style.wordSpacing=\"normal\",e.innerHTML=\"mmmmmmmmmmlli\",e},o=function(e){for(var t=!1,n=0;n<u.length;n++)if(t=e[n].offsetWidth!==a[u[n]]||e[n].offsetHeight!==i[u[n]])return t;return t},l=function(){for(var e=[],t=0,n=u.length;t<n;t++){var a=f();a.style.fontFamily=u[t],r.appendChild(a),e.push(a)}return e}();n.appendChild(r);for(var s=0,c=u.length;s<c;s++)a[u[s]]=l[s].offsetWidth,i[u[s]]=l[s].offsetHeight;var h=function(){for(var e,t,n,a={},r=0,i=d.length;r<i;r++){for(var o=[],l=0,s=u.length;l<s;l++){var c=(e=d[r],t=u[l],n=void 0,(n=f()).style.fontFamily=\"'\"+e+\"',\"+t,n);g.appendChild(c),o.push(c)}a[d[r]]=o}return a}();n.appendChild(g);for(var m=[],T=0,p=d.length;T<p;T++)o(h[d[T]])&&m.push(d[T]);n.removeChild(g),n.removeChild(r),e(m)},pauseBefore:!0},{key:\"fontsFlash\",getData:function(t,e){return D()?N()?e.fonts.swfPath?void _(function(e){t(e)},e):t(\"missing options.fonts.swfPath\"):t(\"flash not installed\"):t(\"swf object not loaded\")},pauseBefore:!0},{key:\"audio\",getData:function(n,e){var t=e.audio;if(t.excludeIOS11&&navigator.userAgent.match(/OS 11.+Version\\/11.+Safari/))return n(e.EXCLUDED);var a=window.OfflineAudioContext||window.webkitOfflineAudioContext;if(null==a)return n(e.NOT_AVAILABLE);var r=new a(1,44100,44100),i=r.createOscillator();i.type=\"triangle\",i.frequency.setValueAtTime(1e4,r.currentTime);var o=r.createDynamicsCompressor();c([[\"threshold\",-50],[\"knee\",40],[\"ratio\",12],[\"reduction\",-20],[\"attack\",0],[\"release\",.25]],function(e){void 0!==o[e[0]]&&\"function\"==typeof o[e[0]].setValueAtTime&&o[e[0]].setValueAtTime(e[1],r.currentTime)}),i.connect(o),o.connect(r.destination),i.start(0),r.startRendering();var l=setTimeout(function(){return console.warn('Audio fingerprint timed out. Please report bug at https://github.com/Valve/fingerprintjs2 with your user agent: \"'+navigator.userAgent+'\".'),r.oncomplete=function(){},r=null,n(\"audioTimeout\")},t.timeout);r.oncomplete=function(e){var t;try{clearTimeout(l),t=e.renderedBuffer.getChannelData(0).slice(4500,5e3).reduce(function(e,t){return e+Math.abs(t)},0).toString(),i.disconnect(),o.disconnect()}catch(e){return void n(e)}n(t)}}},{key:\"enumerateDevices\",getData:function(t,e){if(!n())return t(e.NOT_AVAILABLE);navigator.mediaDevices.enumerateDevices().then(function(e){t(e.map(function(e){return\"id=\"+e.deviceId+\";gid=\"+e.groupId+\";\"+e.kind+\";\"+e.label}))}).catch(function(e){t(e)})}}],U=function(e){throw new Error(\"'new Fingerprint()' is deprecated, see https://github.com/Valve/fingerprintjs2#upgrade-guide-from-182-to-200\")};return U.get=function(n,a){a?n||(n={}):(a=n,n={}),function(e,t){if(null==t)return;var n,a;for(a in t)null==(n=t[a])||Object.prototype.hasOwnProperty.call(e,a)||(e[a]=n)}(n,e),n.components=n.extraComponents.concat(G);var r={data:[],addPreprocessedComponent:function(e,t){\"function\"==typeof n.preprocessor&&(t=n.preprocessor(e,t)),r.data.push({key:e,value:t})}},i=-1,o=function(e){if((i+=1)>=n.components.length)a(r.data);else{var t=n.components[i];if(n.excludes[t.key])o(!1);else{if(!e&&t.pauseBefore)return i-=1,void setTimeout(function(){o(!0)},1);try{t.getData(function(e){r.addPreprocessedComponent(t.key,e),o(!1)},n)}catch(e){r.addPreprocessedComponent(t.key,String(e)),o(!1)}}}};o(!1)},U.getPromise=function(n){return new Promise(function(e,t){U.get(n,e)})},U.getV18=function(i,o){return null==o&&(o=i,i={}),U.get(i,function(e){for(var t=[],n=0;n<e.length;n++){var a=e[n];if(a.value===(i.NOT_AVAILABLE||\"not available\"))t.push({key:a.key,value:\"unknown\"});else if(\"plugins\"===a.key)t.push({key:\"plugins\",value:s(a.value,function(e){var t=s(e[2],function(e){return e.join?e.join(\"~\"):e}).join(\",\");return[e[0],e[1],t].join(\"::\")})});else if(-1!==[\"canvas\",\"webgl\"].indexOf(a.key))t.push({key:a.key,value:a.value.join(\"~\")});else if(-1!==[\"sessionStorage\",\"localStorage\",\"indexedDb\",\"addBehavior\",\"openDatabase\"].indexOf(a.key)){if(!a.value)continue;t.push({key:a.key,value:1})}else a.value?t.push(a.value.join?{key:a.key,value:a.value.join(\";\")}:a):t.push({key:a.key,value:a.value})}var r=l(s(t,function(e){return e.value}).join(\"~~~\"),31);o(r,t)})},U.x64hash128=l,U.VERSION=\"2.0.0\",U});","\n// @info\n//   DOMPoint polyfill\n// @src\n//   https://drafts.fxtf.org/geometry/#DOMPoint\n//   https://github.com/chromium/chromium/blob/master/third_party/blink/renderer/core/geometry/dom_point_read_only.cc\n{\n  class DOMPoint {\n    constructor(x = 0, y = 0, z = 0, w = 1) {\n      this.x = x;\n      this.y = y;\n      this.z = z;\n      this.w = w;\n    }\n\n    static fromPoint(otherPoint) {\n      return new DOMPoint(\n        otherPoint.x,\n        otherPoint.y,\n        otherPoint.z !== undefined ? otherPoint.z : 0,\n        otherPoint.w !== undefined ? otherPoint.w : 1\n      );\n    }\n\n    matrixTransform(matrix) {\n      if (\n        (matrix.is2D || matrix instanceof SVGMatrix) &&\n        this.z === 0 &&\n        this.w === 1\n      ) {\n        return new DOMPoint(\n          this.x * matrix.a + this.y * matrix.c + matrix.e,\n          this.x * matrix.b + this.y * matrix.d + matrix.f,\n          0, 1\n        );\n      }\n      else {\n        return new DOMPoint(\n          this.x * matrix.m11 + this.y * matrix.m21 + this.z * matrix.m31 + this.w * matrix.m41,\n          this.x * matrix.m12 + this.y * matrix.m22 + this.z * matrix.m32 + this.w * matrix.m42,\n          this.x * matrix.m13 + this.y * matrix.m23 + this.z * matrix.m33 + this.w * matrix.m43,\n          this.x * matrix.m14 + this.y * matrix.m24 + this.z * matrix.m34 + this.w * matrix.m44\n        );\n      }\n    }\n  }\n\n  window.DOMPoint = window.DOMPoint || DOMPoint;\n}\n\n// @info\n//   DOMRect polyfill\n// @src\n//   https://drafts.fxtf.org/geometry/#DOMRect\n//   https://github.com/chromium/chromium/blob/master/third_party/blink/renderer/core/geometry/dom_rect_read_only.cc\n{\n  class DOMRect {\n    constructor(x = 0, y = 0, width = 0, height = 0) {\n      this.x = x;\n      this.y = y;\n      this.width = width;\n      this.height = height;\n    }\n\n    static fromRect(otherRect) {\n      return new DOMRect(otherRect.x, otherRect.y, otherRect.width, otherRect.height);\n    }\n\n    get top() {\n      return this.y;\n    }\n\n    get left() {\n      return this.x;\n    }\n\n    get right() {\n      return this.x + this.width;\n    }\n\n    get bottom() {\n      return this.y + this.height;\n    }\n  }\n\n  window.DOMRect = window.DOMRect || DOMRect;\n}\n\n// @info\n//   DOMMatrix polyfill (SVG 2)\n// @src\n//   https://github.com/chromium/chromium/blob/master/third_party/blink/renderer/core/geometry/dom_matrix_read_only.cc\n//   https://github.com/tocharomera/generativecanvas/blob/master/node-canvas/lib/DOMMatrix.js\n{\n  const M11 =  0,  M12 =  1,  M13 =  2,  M14 =  3;\n  const M21 =  4,  M22 =  5,  M23 =  6,  M24 =  7;\n  const M31 =  8,  M32 =  9,  M33 = 10,  M34 = 11;\n  const M41 = 12,  M42 = 13,  M43 = 14,  M44 = 15;\n\n  const A = M11, B = M12;\n  const C = M21, D = M22;\n  const E = M41, F = M42;\n\n  const DEGREE_PER_RAD = 180 / Math.PI;\n  const RAD_PER_DEGREE = Math.PI / 180;\n\n  const $values = Symbol();\n  const $is2D = Symbol();\n\n  let parseMatrix = (init) => {\n    let parsed = init.replace(/matrix\\(/, \"\");\n    parsed = parsed.split(/,/, 7);\n\n    if (parsed.length !== 6) {\n      throw new Error(`Failed to parse ${init}`);\n    }\n\n    parsed = parsed.map(parseFloat);\n\n    return [\n      parsed[0], parsed[1], 0, 0,\n      parsed[2], parsed[3], 0, 0,\n              0,         0, 1, 0,\n      parsed[4], parsed[5], 0, 1\n    ];\n  };\n\n  let parseMatrix3d = (init) => {\n    let parsed = init.replace(/matrix3d\\(/, \"\");\n    parsed = parsed.split(/,/, 17);\n\n    if (parsed.length !== 16) {\n      throw new Error(`Failed to parse ${init}`);\n    }\n\n    return parsed.map(parseFloat);\n  };\n\n  let parseTransform = (tform) => {\n    let type = tform.split(/\\(/, 1)[0];\n\n    if (type === \"matrix\") {\n      return parseMatrix(tform);\n    }\n    else if (type === \"matrix3d\") {\n      return parseMatrix3d(tform);\n    }\n    else {\n      throw new Error(`${type} parsing not implemented`)\n    }\n  };\n\n  let setNumber2D = (receiver, index, value) => {\n    if (typeof value !== \"number\") {\n      throw new TypeError(\"Expected number\");\n    }\n\n    receiver[$values][index] = value;\n  };\n\n  let setNumber3D = (receiver, index, value) => {\n    if (typeof value !== \"number\") {\n      throw new TypeError(\"Expected number\");\n    }\n\n    if (index === M33 || index === M44) {\n      if (value !== 1) {\n        receiver[$is2D] = false;\n      }\n    }\n    else if (value !== 0) {\n      receiver[$is2D] = false;\n    }\n\n    receiver[$values][index] = value;\n  };\n\n  let newInstance = (values) => {\n    let instance = Object.create(DOMMatrix.prototype);\n    instance.constructor = DOMMatrix;\n    instance[$is2D] = true;\n    instance[$values] = values;\n\n    return instance;\n  };\n\n  let multiply = (first, second) => {\n    let dest = new Float64Array(16);\n\n    for (let i = 0; i < 4; i++) {\n      for (let j = 0; j < 4; j++) {\n        let sum = 0;\n\n        for (let k = 0; k < 4; k++) {\n          sum += first[i * 4 + k] * second[k * 4 + j];\n        }\n\n        dest[i * 4 + j] = sum;\n      }\n    }\n\n    return dest;\n  };\n\n  class DOMMatrix {\n    get m11() { return this[$values][M11]; } set m11(value) { setNumber2D(this, M11, value); }\n    get m12() { return this[$values][M12]; } set m12(value) { setNumber2D(this, M12, value); }\n    get m13() { return this[$values][M13]; } set m13(value) { setNumber3D(this, M13, value); }\n    get m14() { return this[$values][M14]; } set m14(value) { setNumber3D(this, M14, value); }\n    get m21() { return this[$values][M21]; } set m21(value) { setNumber2D(this, M21, value); }\n    get m22() { return this[$values][M22]; } set m22(value) { setNumber2D(this, M22, value); }\n    get m23() { return this[$values][M23]; } set m23(value) { setNumber3D(this, M23, value); }\n    get m24() { return this[$values][M24]; } set m24(value) { setNumber3D(this, M24, value); }\n    get m31() { return this[$values][M31]; } set m31(value) { setNumber3D(this, M31, value); }\n    get m32() { return this[$values][M32]; } set m32(value) { setNumber3D(this, M32, value); }\n    get m33() { return this[$values][M33]; } set m33(value) { setNumber3D(this, M33, value); }\n    get m34() { return this[$values][M34]; } set m34(value) { setNumber3D(this, M34, value); }\n    get m41() { return this[$values][M41]; } set m41(value) { setNumber2D(this, M41, value); }\n    get m42() { return this[$values][M42]; } set m42(value) { setNumber2D(this, M42, value); }\n    get m43() { return this[$values][M43]; } set m43(value) { setNumber3D(this, M43, value); }\n    get m44() { return this[$values][M44]; } set m44(value) { setNumber3D(this, M44, value); }\n\n    get a() { return this[$values][A]; } set a(value) { setNumber2D(this, A, value); }\n    get b() { return this[$values][B]; } set b(value) { setNumber2D(this, B, value); }\n    get c() { return this[$values][C]; } set c(value) { setNumber2D(this, C, value); }\n    get d() { return this[$values][D]; } set d(value) { setNumber2D(this, D, value); }\n    get e() { return this[$values][E]; } set e(value) { setNumber2D(this, E, value); }\n    get f() { return this[$values][F]; } set f(value) { setNumber2D(this, F, value); }\n\n    get is2D() {\n      return this[$is2D];\n    }\n\n    get isIdentity() {\n      let values = this[$values];\n\n      return values[M11] === 1 && values[M12] === 0 && values[M13] === 0 && values[M14] === 0 &&\n             values[M21] === 0 && values[M22] === 1 && values[M23] === 0 && values[M24] === 0 &&\n             values[M31] === 0 && values[M32] === 0 && values[M33] === 1 && values[M34] === 0 &&\n             values[M41] === 0 && values[M42] === 0 && values[M43] === 0 && values[M44] === 1;\n    }\n\n    static fromMatrix(init) {\n      if (init instanceof DOMMatrix) {\n        return new DOMMatrix(init[$values]);\n      }\n      else if (init instanceof SVGMatrix) {\n        return new DOMMatrix([init.a, init.b, init.c, init.d, init.e, init.f]);\n      }\n      else {\n        throw new TypeError(\"Expected DOMMatrix\");\n      }\n    }\n\n    static fromFloat32Array(init) {\n      if (!(init instanceof Float32Array)) throw new TypeError(\"Expected Float32Array\");\n      return new DOMMatrix(init);\n    }\n\n    static fromFloat64Array(init) {\n      if (!(init instanceof Float64Array)) throw new TypeError(\"Expected Float64Array\");\n      return new DOMMatrix(init);\n    }\n\n    // @type\n    // (Float64Array) => void\n    constructor(init) {\n      this[$is2D] = true;\n\n      this[$values] = new Float64Array([\n        1, 0, 0, 0,\n        0, 1, 0, 0,\n        0, 0, 1, 0,\n        0, 0, 0, 1\n      ]);\n\n      // Parse CSS transformList\n      if (typeof init === \"string\") {\n        if (init === \"\") {\n          return;\n        }\n        else {\n          let tforms = init.split(/\\)\\s+/, 20).map(parseTransform);\n\n          if (tforms.length === 0) {\n            return;\n          }\n\n          init = tforms[0];\n\n          for (let i = 1; i < tforms.length; i++) {\n            init = multiply(tforms[i], init);\n          }\n        }\n      }\n\n      let i = 0;\n\n      if (init && init.length === 6) {\n        setNumber2D(this, A, init[i++]);\n        setNumber2D(this, B, init[i++]);\n        setNumber2D(this, C, init[i++]);\n        setNumber2D(this, D, init[i++]);\n        setNumber2D(this, E, init[i++]);\n        setNumber2D(this, F, init[i++]);\n      }\n      else if (init && init.length === 16) {\n        setNumber2D(this, M11, init[i++]);\n        setNumber2D(this, M12, init[i++]);\n        setNumber3D(this, M13, init[i++]);\n        setNumber3D(this, M14, init[i++]);\n        setNumber2D(this, M21, init[i++]);\n        setNumber2D(this, M22, init[i++]);\n        setNumber3D(this, M23, init[i++]);\n        setNumber3D(this, M24, init[i++]);\n        setNumber3D(this, M31, init[i++]);\n        setNumber3D(this, M32, init[i++]);\n        setNumber3D(this, M33, init[i++]);\n        setNumber3D(this, M34, init[i++]);\n        setNumber2D(this, M41, init[i++]);\n        setNumber2D(this, M42, init[i++]);\n        setNumber3D(this, M43, init[i++]);\n        setNumber3D(this, M44, init[i]);\n      }\n      else if (init !== undefined) {\n        throw new TypeError(\"Expected string or array.\");\n      }\n    }\n\n    inspect(depth, options) {\n      if (depth < 0) {\n        return \"[DOMMatrix]\";\n      }\n\n      return `DOMMatrix [\n        a: ${this.a}\n        b: ${this.b}\n        c: ${this.c}\n        d: ${this.d}\n        e: ${this.e}\n        f: ${this.f}\n        m11: ${this.m11}\n        m12: ${this.m12}\n        m13: ${this.m13}\n        m14: ${this.m14}\n        m21: ${this.m21}\n        m22: ${this.m22}\n        m23: ${this.m23}\n        m23: ${this.m23}\n        m31: ${this.m31}\n        m32: ${this.m32}\n        m33: ${this.m33}\n        m34: ${this.m34}\n        m41: ${this.m41}\n        m42: ${this.m42}\n        m43: ${this.m43}\n        m44: ${this.m44}\n        is2D: ${this.is2D}\n        isIdentity: ${this.isIdentity} ]`;\n    }\n\n    multiply(other) {\n      return newInstance(this[$values]).multiplySelf(other);\n    }\n\n    multiplySelf(other) {\n      this[$values] = multiply(other[$values], this[$values]);\n\n      if (!other.is2D) {\n        this[$is2D] = false;\n      }\n\n      return this;\n    }\n\n    preMultiplySelf(other) {\n      this[$values] = multiply(this[$values], other[$values]);\n\n      if (!other.is2D) {\n        this[$is2D] = false;\n      }\n\n      return this;\n    }\n\n    translate(tx, ty, tz) {\n      return newInstance(this[$values]).translateSelf(tx, ty, tz);\n    }\n\n    translateSelf(tx = 0, ty = 0, tz = 0) {\n      this[$values] = multiply([\n        1, 0, 0, 0,\n        0, 1, 0, 0,\n        0, 0, 1, 0,\n        tx, ty, tz, 1\n      ], this[$values]);\n\n      if (tz !== 0) {\n        this[$is2D] = false;\n      }\n\n      return this;\n    }\n\n    scale(scaleX, scaleY, scaleZ, originX, originY, originZ) {\n      return newInstance(this[$values]).scaleSelf(scaleX, scaleY, scaleZ, originX, originY, originZ);\n    }\n\n    scale3d(scale, originX, originY, originZ) {\n      return newInstance(this[$values]).scale3dSelf(scale, originX, originY, originZ);\n    }\n\n    scale3dSelf(scale, originX, originY, originZ) {\n      return this.scaleSelf(scale, scale, scale, originX, originY, originZ);\n    }\n\n    scaleSelf(scaleX, scaleY, scaleZ, originX, originY, originZ) {\n      // Not redundant with translate's checks because we need to negate the values later.\n      if (typeof originX !== \"number\") originX = 0;\n      if (typeof originY !== \"number\") originY = 0;\n      if (typeof originZ !== \"number\") originZ = 0;\n\n      this.translateSelf(originX, originY, originZ);\n\n      if (typeof scaleX !== \"number\") scaleX = 1;\n      if (typeof scaleY !== \"number\") scaleY = scaleX;\n      if (typeof scaleZ !== \"number\") scaleZ = 1;\n\n      this[$values] = multiply([\n        scaleX, 0, 0, 0,\n        0, scaleY, 0, 0,\n        0, 0, scaleZ, 0,\n        0, 0, 0, 1\n      ], this[$values]);\n\n      this.translateSelf(-originX, -originY, -originZ);\n\n      if (scaleZ !== 1 || originZ !== 0) {\n        this[$is2D] = false;\n      }\n\n      return this;\n    }\n\n    rotateFromVector(x, y) {\n      return newInstance(this[$values]).rotateFromVectorSelf(x, y);\n    }\n\n    rotateFromVectorSelf(x = 0, y = 0) {\n      let theta = (x === 0 && y === 0) ? 0 : Math.atan2(y, x) * DEGREE_PER_RAD;\n      return this.rotateSelf(theta);\n    }\n\n    rotate(rotX, rotY, rotZ) {\n      return newInstance(this[$values]).rotateSelf(rotX, rotY, rotZ);\n    }\n\n    rotateSelf(rotX, rotY, rotZ) {\n      if (rotY === undefined && rotZ === undefined) {\n        rotZ = rotX;\n        rotX = rotY = 0;\n      }\n\n      if (typeof rotY !== \"number\") rotY = 0;\n      if (typeof rotZ !== \"number\") rotZ = 0;\n\n      if (rotX !== 0 || rotY !== 0) {\n        this[$is2D] = false;\n      }\n\n      rotX *= RAD_PER_DEGREE;\n      rotY *= RAD_PER_DEGREE;\n      rotZ *= RAD_PER_DEGREE;\n\n      let c = Math.cos(rotZ);\n      let s = Math.sin(rotZ);\n\n      this[$values] = multiply([\n        c, s, 0, 0,\n        -s, c, 0, 0,\n        0, 0, 1, 0,\n        0, 0, 0, 1\n      ], this[$values]);\n\n      c = Math.cos(rotY);\n      s = Math.sin(rotY);\n\n      this[$values] = multiply([\n        c, 0, -s, 0,\n        0, 1, 0, 0,\n        s, 0, c, 0,\n        0, 0, 0, 1\n      ], this[$values]);\n\n      c = Math.cos(rotX);\n      s = Math.sin(rotX);\n\n      this[$values] = multiply([\n        1, 0, 0, 0,\n        0, c, s, 0,\n        0, -s, c, 0,\n        0, 0, 0, 1\n      ], this[$values]);\n\n      return this;\n    }\n\n    rotateAxisAngle(x, y, z, angle) {\n      return newInstance(this[$values]).rotateAxisAngleSelf(x, y, z, angle);\n    }\n\n    rotateAxisAngleSelf(x = 0, y = 0, z = 0, angle = 0) {\n      let length = Math.sqrt(x * x + y * y + z * z);\n\n      if (length === 0) {\n        return this;\n      }\n\n      if (length !== 1) {\n        x /= length;\n        y /= length;\n        z /= length;\n      }\n\n      angle *= RAD_PER_DEGREE;\n\n      let c = Math.cos(angle);\n      let s = Math.sin(angle);\n      let t = 1 - c;\n      let tx = t * x;\n      let ty = t * y;\n\n      this[$values] = multiply([\n        tx * x + c,      tx * y + s * z,  tx * z - s * y,  0,\n        tx * y - s * z,  ty * y + c,      ty * z + s * x,  0,\n        tx * z + s * y,  ty * z - s * x,  t * z * z + c,   0,\n        0,               0,               0,               1\n      ], this[$values]);\n\n      if (x !== 0 || y !== 0) {\n        this[$is2D] = false;\n      }\n\n      return this;\n    }\n\n    skewX(sx) {\n      return newInstance(this[$values]).skewXSelf(sx);\n    }\n\n    skewXSelf(sx) {\n      if (typeof sx !== \"number\") {\n        return this;\n      }\n\n      let t = Math.tan(sx * RAD_PER_DEGREE);\n\n      this[$values] = multiply([\n        1, 0, 0, 0,\n        t, 1, 0, 0,\n        0, 0, 1, 0,\n        0, 0, 0, 1\n      ], this[$values]);\n\n      return this;\n    }\n\n    skewY(sy) {\n      return newInstance(this[$values]).skewYSelf(sy);\n    }\n\n    skewYSelf(sy) {\n      if (typeof sy !== \"number\") {\n        return this;\n      }\n\n      let t = Math.tan(sy * RAD_PER_DEGREE);\n\n      this[$values] = multiply([\n        1, t, 0, 0,\n        0, 1, 0, 0,\n        0, 0, 1, 0,\n        0, 0, 0, 1\n      ], this[$values]);\n\n      return this;\n    }\n\n    flipX() {\n      return newInstance(multiply([\n        -1, 0, 0, 0,\n        0, 1, 0, 0,\n        0, 0, 1, 0,\n        0, 0, 0, 1\n      ], this[$values]));\n    }\n\n    flipY() {\n      return newInstance(multiply([\n        1, 0, 0, 0,\n        0, -1, 0, 0,\n        0, 0, 1, 0,\n        0, 0, 0, 1\n      ], this[$values]));\n    }\n\n    inverse () {\n      return newInstance(this[$values]).invertSelf();\n    }\n\n    invertSelf() {\n      if (this[$is2D]) {\n        let det = this[$values][A] * this[$values][D] - this[$values][B] * this[$values][C];\n\n        // Invertable\n        if (det !== 0) {\n          let result = new DOMMatrix();\n\n          result.a =  this[$values][D] / det;\n          result.b = -this[$values][B] / det;\n          result.c = -this[$values][C] / det;\n          result.d =  this[$values][A] / det;\n          result.e = (this[$values][C] * this[$values][F] - this[$values][D] * this[$values][E]) / det;\n          result.f = (this[$values][B] * this[$values][E] - this[$values][A] * this[$values][F]) / det;\n\n          return result;\n        }\n\n        // Not invertable\n        else {\n          this[$is2D] = false;\n\n          this[$values] = [\n            NaN, NaN, NaN, NaN,\n            NaN, NaN, NaN, NaN,\n            NaN, NaN, NaN, NaN,\n            NaN, NaN, NaN, NaN\n          ];\n        }\n      }\n      else {\n        throw new Error(\"3D matrix inversion is not implemented.\");\n      }\n    }\n\n    setMatrixValue(transformList) {\n      let temp = new DOMMatrix(transformList);\n\n      this[$values] = temp[$values];\n      this[$is2D] = temp[$is2D];\n\n      return this;\n    }\n\n    transformPoint(point) {\n      let x = point.x;\n      let y = point.y;\n      let z = point.z;\n      let w = point.w;\n\n      let values = this[$values];\n\n      let nx = values[M11] * x + values[M21] * y + values[M31] * z + values[M41] * w;\n      let ny = values[M12] * x + values[M22] * y + values[M32] * z + values[M42] * w;\n      let nz = values[M13] * x + values[M23] * y + values[M33] * z + values[M43] * w;\n      let nw = values[M14] * x + values[M24] * y + values[M34] * z + values[M44] * w;\n\n      return new DOMPoint(nx, ny, nz, nw);\n    }\n\n    toFloat32Array() {\n      return Float32Array.from(this[$values]);\n    }\n\n    toFloat64Array() {\n      return this[$values].slice(0);\n    }\n\n    toString() {\n      if (this.is2D) {\n        return `matrix(${this.a}, ${this.b}, ${this.c}, ${this.d}, ${this.e}, ${this.f})`;\n      }\n      else {\n        return `matrix3d(${this[$values].join(\", \")})`;\n      }\n    }\n  }\n\n  window.DOMMatrix = window.DOMMatrix || DOMMatrix;\n}\n","'use strict';\n\nconst ICAL = require('ical.js');\n\n// Copied from https://dxr.mozilla.org/comm-central/source/calendar/timezones/zones.json\n// And compiled using node compile-zones.js\n// See also https://github.com/mozilla-comm/ical.js/issues/195\nconst timezones = require('./zones-compiled.json');\n\nclass IcalExpander {\n  constructor(opts) {\n    this.maxIterations = opts.maxIterations != null ? opts.maxIterations : 1000;\n    this.skipInvalidDates = opts.skipInvalidDates != null ? opts.skipInvalidDates : false;\n\n    this.jCalData = ICAL.parse(opts.ics);\n    this.component = new ICAL.Component(this.jCalData);\n    this.events = this.component.getAllSubcomponents('vevent').map(vevent => new ICAL.Event(vevent));\n\n    if (this.skipInvalidDates) {\n      this.events = this.events.filter((evt) => {\n        try {\n          evt.startDate.toJSDate();\n          evt.endDate.toJSDate();\n          return true;\n        } catch (err) {\n          // skipping events with invalid time\n          return false;\n        }\n      });\n    }\n  }\n\n  between(after, before) {\n    function isEventWithinRange(startTime, endTime) {\n      return (!after || endTime >= after.getTime()) &&\n      (!before || startTime <= before.getTime());\n    }\n\n    function getTimes(eventOrOccurrence) {\n      const startTime = eventOrOccurrence.startDate.toJSDate().getTime();\n      let endTime = eventOrOccurrence.endDate.toJSDate().getTime();\n\n      // If it is an all day event, the end date is set to 00:00 of the next day\n      // So we need to make it be 23:59:59 to compare correctly with the given range\n      if (eventOrOccurrence.endDate.isDate && (endTime > startTime)) {\n        endTime -= 1;\n      }\n\n      return { startTime, endTime };\n    }\n\n    const exceptions = [];\n\n    this.events.forEach((event) => {\n      if (event.isRecurrenceException()) exceptions.push(event);\n    });\n\n    const ret = {\n      events: [],\n      occurrences: [],\n    };\n\n    this.events.filter(e => !e.isRecurrenceException()).forEach((event) => {\n      const exdates = [];\n\n      event.component.getAllProperties('exdate').forEach((exdateProp) => {\n        const exdate = exdateProp.getFirstValue();\n        exdates.push(exdate.toJSDate().getTime());\n      });\n\n      // Recurring event is handled differently\n      if (event.isRecurring()) {\n        const iterator = event.iterator();\n\n        let next;\n        let i = 0;\n\n        do {\n          i += 1;\n          next = iterator.next();\n          if (next) {\n            const occurrence = event.getOccurrenceDetails(next);\n\n            const { startTime, endTime } = getTimes(occurrence);\n\n            const isOccurrenceExcluded = exdates.indexOf(startTime) !== -1;\n\n            // TODO check that within same day?\n            const exception = exceptions.find(ex => ex.uid === event.uid && ex.recurrenceId.toJSDate().getTime() === occurrence.startDate.toJSDate().getTime());\n\n            // We have passed the max date, stop\n            if (before && startTime > before.getTime()) break;\n\n            // Check that we are within our range\n            if (isEventWithinRange(startTime, endTime)) {\n              if (exception) {\n                ret.events.push(exception);\n              } else if (!isOccurrenceExcluded) {\n                ret.occurrences.push(occurrence);\n              }\n            }\n          }\n        }\n        while (next && (!this.maxIterations || i < this.maxIterations));\n\n        return;\n      }\n\n      // Non-recurring event:\n      const { startTime, endTime } = getTimes(event);\n\n      if (isEventWithinRange(startTime, endTime)) ret.events.push(event);\n    });\n\n    return ret;\n  }\n\n  before(before) {\n    return this.between(undefined, before);\n  }\n\n  after(after) {\n    return this.between(after);\n  }\n\n  all() {\n    return this.between();\n  }\n}\n\nfunction registerTimezones() {\n  Object.keys(timezones).forEach((key) => {\n    const icsData = timezones[key];\n    const parsed = ICAL.parse(`BEGIN:VCALENDAR\\nPRODID:-//tzurl.org//NONSGML Olson 2012h//EN\\nVERSION:2.0\\n${icsData}\\nEND:VCALENDAR`);\n    const comp = new ICAL.Component(parsed);\n    const vtimezone = comp.getFirstSubcomponent('vtimezone');\n\n    ICAL.TimezoneService.register(key, new ICAL.Timezone(vtimezone));\n  });\n}\n\nregisterTimezones();\n\nmodule.exports = IcalExpander;\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n/* istanbul ignore next */\n/* jshint ignore:start */\nif (typeof module === 'object') {\n  // CommonJS, where exports may be different each time.\n  ICAL = module.exports;\n} else if (typeof ICAL !== 'object') {/* istanbul ignore next */\n  /** @ignore */\n  this.ICAL = {};\n}\n/* jshint ignore:end */\n\n\n/**\n * The number of characters before iCalendar line folding should occur\n * @type {Number}\n * @default 75\n */\nICAL.foldLength = 75;\n\n\n/**\n * The character(s) to be used for a newline. The default value is provided by\n * rfc5545.\n * @type {String}\n * @default \"\\r\\n\"\n */\nICAL.newLineChar = '\\r\\n';\n\n\n/**\n * Helper functions used in various places within ical.js\n * @namespace\n */\nICAL.helpers = {\n  /**\n   * Compiles a list of all referenced TZIDs in all subcomponents and\n   * removes any extra VTIMEZONE subcomponents. In addition, if any TZIDs\n   * are referenced by a component, but a VTIMEZONE does not exist,\n   * an attempt will be made to generate a VTIMEZONE using ICAL.TimezoneService.\n   *\n   * @param {ICAL.Component} vcal     The top-level VCALENDAR component.\n   * @return {ICAL.Component}         The ICAL.Component that was passed in.\n   */\n  updateTimezones: function(vcal) {\n    var allsubs, properties, vtimezones, reqTzid, i, tzid;\n\n    if (!vcal || vcal.name !== \"vcalendar\") {\n      //not a top-level vcalendar component\n      return vcal;\n    }\n\n    //Store vtimezone subcomponents in an object reference by tzid.\n    //Store properties from everything else in another array\n    allsubs = vcal.getAllSubcomponents();\n    properties = [];\n    vtimezones = {};\n    for (i = 0; i < allsubs.length; i++) {\n      if (allsubs[i].name === \"vtimezone\") {\n        tzid = allsubs[i].getFirstProperty(\"tzid\").getFirstValue();\n        vtimezones[tzid] = allsubs[i];\n      } else {\n        properties = properties.concat(allsubs[i].getAllProperties());\n      }\n    }\n\n    //create an object with one entry for each required tz\n    reqTzid = {};\n    for (i = 0; i < properties.length; i++) {\n      if ((tzid = properties[i].getParameter(\"tzid\"))) {\n        reqTzid[tzid] = true;\n      }\n    }\n\n    //delete any vtimezones that are not on the reqTzid list.\n    for (i in vtimezones) {\n      if (vtimezones.hasOwnProperty(i) && !reqTzid[i]) {\n        vcal.removeSubcomponent(vtimezones[i]);\n      }\n    }\n\n    //create any missing, but registered timezones\n    for (i in reqTzid) {\n      if (\n        reqTzid.hasOwnProperty(i) &&\n        !vtimezones[i] &&\n        ICAL.TimezoneService.has(i)\n      ) {\n        vcal.addSubcomponent(ICAL.TimezoneService.get(i).component);\n      }\n    }\n\n    return vcal;\n  },\n\n  /**\n   * Checks if the given type is of the number type and also NaN.\n   *\n   * @param {Number} number     The number to check\n   * @return {Boolean}          True, if the number is strictly NaN\n   */\n  isStrictlyNaN: function(number) {\n    return typeof(number) === 'number' && isNaN(number);\n  },\n\n  /**\n   * Parses a string value that is expected to be an integer, when the valid is\n   * not an integer throws a decoration error.\n   *\n   * @param {String} string     Raw string input\n   * @return {Number}           Parsed integer\n   */\n  strictParseInt: function(string) {\n    var result = parseInt(string, 10);\n\n    if (ICAL.helpers.isStrictlyNaN(result)) {\n      throw new Error(\n        'Could not extract integer from \"' + string + '\"'\n      );\n    }\n\n    return result;\n  },\n\n  /**\n   * Creates or returns a class instance of a given type with the initialization\n   * data if the data is not already an instance of the given type.\n   *\n   * @example\n   * var time = new ICAL.Time(...);\n   * var result = ICAL.helpers.formatClassType(time, ICAL.Time);\n   *\n   * (result instanceof ICAL.Time)\n   * // => true\n   *\n   * result = ICAL.helpers.formatClassType({}, ICAL.Time);\n   * (result isntanceof ICAL.Time)\n   * // => true\n   *\n   *\n   * @param {Object} data       object initialization data\n   * @param {Object} type       object type (like ICAL.Time)\n   * @return {?}                An instance of the found type.\n   */\n  formatClassType: function formatClassType(data, type) {\n    if (typeof(data) === 'undefined') {\n      return undefined;\n    }\n\n    if (data instanceof type) {\n      return data;\n    }\n    return new type(data);\n  },\n\n  /**\n   * Identical to indexOf but will only match values when they are not preceded\n   * by a backslash character.\n   *\n   * @param {String} buffer         String to search\n   * @param {String} search         Value to look for\n   * @param {Number} pos            Start position\n   * @return {Number}               The position, or -1 if not found\n   */\n  unescapedIndexOf: function(buffer, search, pos) {\n    while ((pos = buffer.indexOf(search, pos)) !== -1) {\n      if (pos > 0 && buffer[pos - 1] === '\\\\') {\n        pos += 1;\n      } else {\n        return pos;\n      }\n    }\n    return -1;\n  },\n\n  /**\n   * Find the index for insertion using binary search.\n   *\n   * @param {Array} list            The list to search\n   * @param {?} seekVal             The value to insert\n   * @param {function(?,?)} cmpfunc The comparison func, that can\n   *                                  compare two seekVals\n   * @return {Number}               The insert position\n   */\n  binsearchInsert: function(list, seekVal, cmpfunc) {\n    if (!list.length)\n      return 0;\n\n    var low = 0, high = list.length - 1,\n        mid, cmpval;\n\n    while (low <= high) {\n      mid = low + Math.floor((high - low) / 2);\n      cmpval = cmpfunc(seekVal, list[mid]);\n\n      if (cmpval < 0)\n        high = mid - 1;\n      else if (cmpval > 0)\n        low = mid + 1;\n      else\n        break;\n    }\n\n    if (cmpval < 0)\n      return mid; // insertion is displacing, so use mid outright.\n    else if (cmpval > 0)\n      return mid + 1;\n    else\n      return mid;\n  },\n\n  /**\n   * Convenience function for debug output\n   * @private\n   */\n  dumpn: /* istanbul ignore next */ function() {\n    if (!ICAL.debug) {\n      return;\n    }\n\n    if (typeof (console) !== 'undefined' && 'log' in console) {\n      ICAL.helpers.dumpn = function consoleDumpn(input) {\n        console.log(input);\n      };\n    } else {\n      ICAL.helpers.dumpn = function geckoDumpn(input) {\n        dump(input + '\\n');\n      };\n    }\n\n    ICAL.helpers.dumpn(arguments[0]);\n  },\n\n  /**\n   * Clone the passed object or primitive. By default a shallow clone will be\n   * executed.\n   *\n   * @param {*} aSrc            The thing to clone\n   * @param {Boolean=} aDeep    If true, a deep clone will be performed\n   * @return {*}                The copy of the thing\n   */\n  clone: function(aSrc, aDeep) {\n    if (!aSrc || typeof aSrc != \"object\") {\n      return aSrc;\n    } else if (aSrc instanceof Date) {\n      return new Date(aSrc.getTime());\n    } else if (\"clone\" in aSrc) {\n      return aSrc.clone();\n    } else if (Array.isArray(aSrc)) {\n      var arr = [];\n      for (var i = 0; i < aSrc.length; i++) {\n        arr.push(aDeep ? ICAL.helpers.clone(aSrc[i], true) : aSrc[i]);\n      }\n      return arr;\n    } else {\n      var obj = {};\n      for (var name in aSrc) {\n        // uses prototype method to allow use of Object.create(null);\n        /* istanbul ignore else */\n        if (Object.prototype.hasOwnProperty.call(aSrc, name)) {\n          if (aDeep) {\n            obj[name] = ICAL.helpers.clone(aSrc[name], true);\n          } else {\n            obj[name] = aSrc[name];\n          }\n        }\n      }\n      return obj;\n    }\n  },\n\n  /**\n   * Performs iCalendar line folding. A line ending character is inserted and\n   * the next line begins with a whitespace.\n   *\n   * @example\n   * SUMMARY:This line will be fold\n   *  ed right in the middle of a word.\n   *\n   * @param {String} aLine      The line to fold\n   * @return {String}           The folded line\n   */\n  foldline: function foldline(aLine) {\n    var result = \"\";\n    var line = aLine || \"\";\n\n    while (line.length) {\n      result += ICAL.newLineChar + \" \" + line.substr(0, ICAL.foldLength);\n      line = line.substr(ICAL.foldLength);\n    }\n    return result.substr(ICAL.newLineChar.length + 1);\n  },\n\n  /**\n   * Pads the given string or number with zeros so it will have at least two\n   * characters.\n   *\n   * @param {String|Number} data    The string or number to pad\n   * @return {String}               The number padded as a string\n   */\n  pad2: function pad(data) {\n    if (typeof(data) !== 'string') {\n      // handle fractions.\n      if (typeof(data) === 'number') {\n        data = parseInt(data);\n      }\n      data = String(data);\n    }\n\n    var len = data.length;\n\n    switch (len) {\n      case 0:\n        return '00';\n      case 1:\n        return '0' + data;\n      default:\n        return data;\n    }\n  },\n\n  /**\n   * Truncates the given number, correctly handling negative numbers.\n   *\n   * @param {Number} number     The number to truncate\n   * @return {Number}           The truncated number\n   */\n  trunc: function trunc(number) {\n    return (number < 0 ? Math.ceil(number) : Math.floor(number));\n  },\n\n  /**\n   * Poor-man's cross-browser inheritance for JavaScript. Doesn't support all\n   * the features, but enough for our usage.\n   *\n   * @param {Function} base     The base class constructor function.\n   * @param {Function} child    The child class constructor function.\n   * @param {Object} extra      Extends the prototype with extra properties\n   *                              and methods\n   */\n  inherits: function(base, child, extra) {\n    function F() {}\n    F.prototype = base.prototype;\n    child.prototype = new F();\n\n    if (extra) {\n      ICAL.helpers.extend(extra, child.prototype);\n    }\n  },\n\n  /**\n   * Poor-man's cross-browser object extension. Doesn't support all the\n   * features, but enough for our usage. Note that the target's properties are\n   * not overwritten with the source properties.\n   *\n   * @example\n   * var child = ICAL.helpers.extend(parent, {\n   *   \"bar\": 123\n   * });\n   *\n   * @param {Object} source     The object to extend\n   * @param {Object} target     The object to extend with\n   * @return {Object}           Returns the target.\n   */\n  extend: function(source, target) {\n    for (var key in source) {\n      var descr = Object.getOwnPropertyDescriptor(source, key);\n      if (descr && !Object.getOwnPropertyDescriptor(target, key)) {\n        Object.defineProperty(target, key, descr);\n      }\n    }\n    return target;\n  }\n};\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n/** @namespace ICAL */\n\n\n/**\n * This symbol is further described later on\n * @ignore\n */\nICAL.design = (function() {\n  'use strict';\n\n  var FROM_ICAL_NEWLINE = /\\\\\\\\|\\\\;|\\\\,|\\\\[Nn]/g;\n  var TO_ICAL_NEWLINE = /\\\\|;|,|\\n/g;\n  var FROM_VCARD_NEWLINE = /\\\\\\\\|\\\\,|\\\\[Nn]/g;\n  var TO_VCARD_NEWLINE = /\\\\|,|\\n/g;\n\n  function createTextType(fromNewline, toNewline) {\n    var result = {\n      matches: /.*/,\n\n      fromICAL: function(aValue, structuredEscape) {\n        return replaceNewline(aValue, fromNewline, structuredEscape);\n      },\n\n      toICAL: function(aValue, structuredEscape) {\n        var regEx = toNewline;\n        if (structuredEscape)\n          regEx = new RegExp(regEx.source + '|' + structuredEscape);\n        return aValue.replace(regEx, function(str) {\n          switch (str) {\n          case \"\\\\\":\n            return \"\\\\\\\\\";\n          case \";\":\n            return \"\\\\;\";\n          case \",\":\n            return \"\\\\,\";\n          case \"\\n\":\n            return \"\\\\n\";\n          /* istanbul ignore next */\n          default:\n            return str;\n          }\n        });\n      }\n    };\n    return result;\n  }\n\n  // default types used multiple times\n  var DEFAULT_TYPE_TEXT = { defaultType: \"text\" };\n  var DEFAULT_TYPE_TEXT_MULTI = { defaultType: \"text\", multiValue: \",\" };\n  var DEFAULT_TYPE_TEXT_STRUCTURED = { defaultType: \"text\", structuredValue: \";\" };\n  var DEFAULT_TYPE_INTEGER = { defaultType: \"integer\" };\n  var DEFAULT_TYPE_DATETIME_DATE = { defaultType: \"date-time\", allowedTypes: [\"date-time\", \"date\"] };\n  var DEFAULT_TYPE_DATETIME = { defaultType: \"date-time\" };\n  var DEFAULT_TYPE_URI = { defaultType: \"uri\" };\n  var DEFAULT_TYPE_UTCOFFSET = { defaultType: \"utc-offset\" };\n  var DEFAULT_TYPE_RECUR = { defaultType: \"recur\" };\n  var DEFAULT_TYPE_DATE_ANDOR_TIME = { defaultType: \"date-and-or-time\", allowedTypes: [\"date-time\", \"date\", \"text\"] };\n\n  function replaceNewlineReplace(string) {\n    switch (string) {\n      case \"\\\\\\\\\":\n        return \"\\\\\";\n      case \"\\\\;\":\n        return \";\";\n      case \"\\\\,\":\n        return \",\";\n      case \"\\\\n\":\n      case \"\\\\N\":\n        return \"\\n\";\n      /* istanbul ignore next */\n      default:\n        return string;\n    }\n  }\n\n  function replaceNewline(value, newline, structuredEscape) {\n    // avoid regex when possible.\n    if (value.indexOf('\\\\') === -1) {\n      return value;\n    }\n    if (structuredEscape)\n      newline = new RegExp(newline.source + '|\\\\\\\\' + structuredEscape);\n    return value.replace(newline, replaceNewlineReplace);\n  }\n\n  var commonProperties = {\n    \"categories\": DEFAULT_TYPE_TEXT_MULTI,\n    \"url\": DEFAULT_TYPE_URI,\n    \"version\": DEFAULT_TYPE_TEXT,\n    \"uid\": DEFAULT_TYPE_TEXT\n  };\n\n  var commonValues = {\n    \"boolean\": {\n      values: [\"TRUE\", \"FALSE\"],\n\n      fromICAL: function(aValue) {\n        switch (aValue) {\n          case 'TRUE':\n            return true;\n          case 'FALSE':\n            return false;\n          default:\n            //TODO: parser warning\n            return false;\n        }\n      },\n\n      toICAL: function(aValue) {\n        if (aValue) {\n          return 'TRUE';\n        }\n        return 'FALSE';\n      }\n\n    },\n    float: {\n      matches: /^[+-]?\\d+\\.\\d+$/,\n\n      fromICAL: function(aValue) {\n        var parsed = parseFloat(aValue);\n        if (ICAL.helpers.isStrictlyNaN(parsed)) {\n          // TODO: parser warning\n          return 0.0;\n        }\n        return parsed;\n      },\n\n      toICAL: function(aValue) {\n        return String(aValue);\n      }\n    },\n    integer: {\n      fromICAL: function(aValue) {\n        var parsed = parseInt(aValue);\n        if (ICAL.helpers.isStrictlyNaN(parsed)) {\n          return 0;\n        }\n        return parsed;\n      },\n\n      toICAL: function(aValue) {\n        return String(aValue);\n      }\n    },\n    \"utc-offset\": {\n      toICAL: function(aValue) {\n        if (aValue.length < 7) {\n          // no seconds\n          // -0500\n          return aValue.substr(0, 3) +\n                 aValue.substr(4, 2);\n        } else {\n          // seconds\n          // -050000\n          return aValue.substr(0, 3) +\n                 aValue.substr(4, 2) +\n                 aValue.substr(7, 2);\n        }\n      },\n\n      fromICAL: function(aValue) {\n        if (aValue.length < 6) {\n          // no seconds\n          // -05:00\n          return aValue.substr(0, 3) + ':' +\n                 aValue.substr(3, 2);\n        } else {\n          // seconds\n          // -05:00:00\n          return aValue.substr(0, 3) + ':' +\n                 aValue.substr(3, 2) + ':' +\n                 aValue.substr(5, 2);\n        }\n      },\n\n      decorate: function(aValue) {\n        return ICAL.UtcOffset.fromString(aValue);\n      },\n\n      undecorate: function(aValue) {\n        return aValue.toString();\n      }\n    }\n  };\n\n  var icalParams = {\n    // Although the syntax is DQUOTE uri DQUOTE, I don't think we should\n    // enfoce anything aside from it being a valid content line.\n    //\n    // At least some params require - if multi values are used - DQUOTEs\n    // for each of its values - e.g. delegated-from=\"uri1\",\"uri2\"\n    // To indicate this, I introduced the new k/v pair\n    // multiValueSeparateDQuote: true\n    //\n    // \"ALTREP\": { ... },\n\n    // CN just wants a param-value\n    // \"CN\": { ... }\n\n    \"cutype\": {\n      values: [\"INDIVIDUAL\", \"GROUP\", \"RESOURCE\", \"ROOM\", \"UNKNOWN\"],\n      allowXName: true,\n      allowIanaToken: true\n    },\n\n    \"delegated-from\": {\n      valueType: \"cal-address\",\n      multiValue: \",\",\n      multiValueSeparateDQuote: true\n    },\n    \"delegated-to\": {\n      valueType: \"cal-address\",\n      multiValue: \",\",\n      multiValueSeparateDQuote: true\n    },\n    // \"DIR\": { ... }, // See ALTREP\n    \"encoding\": {\n      values: [\"8BIT\", \"BASE64\"]\n    },\n    // \"FMTTYPE\": { ... }, // See ALTREP\n    \"fbtype\": {\n      values: [\"FREE\", \"BUSY\", \"BUSY-UNAVAILABLE\", \"BUSY-TENTATIVE\"],\n      allowXName: true,\n      allowIanaToken: true\n    },\n    // \"LANGUAGE\": { ... }, // See ALTREP\n    \"member\": {\n      valueType: \"cal-address\",\n      multiValue: \",\",\n      multiValueSeparateDQuote: true\n    },\n    \"partstat\": {\n      // TODO These values are actually different per-component\n      values: [\"NEEDS-ACTION\", \"ACCEPTED\", \"DECLINED\", \"TENTATIVE\",\n               \"DELEGATED\", \"COMPLETED\", \"IN-PROCESS\"],\n      allowXName: true,\n      allowIanaToken: true\n    },\n    \"range\": {\n      values: [\"THISLANDFUTURE\"]\n    },\n    \"related\": {\n      values: [\"START\", \"END\"]\n    },\n    \"reltype\": {\n      values: [\"PARENT\", \"CHILD\", \"SIBLING\"],\n      allowXName: true,\n      allowIanaToken: true\n    },\n    \"role\": {\n      values: [\"REQ-PARTICIPANT\", \"CHAIR\",\n               \"OPT-PARTICIPANT\", \"NON-PARTICIPANT\"],\n      allowXName: true,\n      allowIanaToken: true\n    },\n    \"rsvp\": {\n      values: [\"TRUE\", \"FALSE\"]\n    },\n    \"sent-by\": {\n      valueType: \"cal-address\"\n    },\n    \"tzid\": {\n      matches: /^\\//\n    },\n    \"value\": {\n      // since the value here is a 'type' lowercase is used.\n      values: [\"binary\", \"boolean\", \"cal-address\", \"date\", \"date-time\",\n               \"duration\", \"float\", \"integer\", \"period\", \"recur\", \"text\",\n               \"time\", \"uri\", \"utc-offset\"],\n      allowXName: true,\n      allowIanaToken: true\n    }\n  };\n\n  // When adding a value here, be sure to add it to the parameter types!\n  var icalValues = ICAL.helpers.extend(commonValues, {\n    text: createTextType(FROM_ICAL_NEWLINE, TO_ICAL_NEWLINE),\n\n    uri: {\n      // TODO\n      /* ... */\n    },\n\n    \"binary\": {\n      decorate: function(aString) {\n        return ICAL.Binary.fromString(aString);\n      },\n\n      undecorate: function(aBinary) {\n        return aBinary.toString();\n      }\n    },\n    \"cal-address\": {\n      // needs to be an uri\n    },\n    \"date\": {\n      decorate: function(aValue, aProp) {\n        if (design.strict) {\n          return ICAL.Time.fromDateString(aValue, aProp);\n        } else {\n          return ICAL.Time.fromString(aValue, aProp);\n        }\n      },\n\n      /**\n       * undecorates a time object.\n       */\n      undecorate: function(aValue) {\n        return aValue.toString();\n      },\n\n      fromICAL: function(aValue) {\n        // from: 20120901\n        // to: 2012-09-01\n        if (!design.strict && aValue.length >= 15) {\n          // This is probably a date-time, e.g. 20120901T130000Z\n          return icalValues[\"date-time\"].fromICAL(aValue);\n        } else {\n          return aValue.substr(0, 4) + '-' +\n                 aValue.substr(4, 2) + '-' +\n                 aValue.substr(6, 2);\n        }\n      },\n\n      toICAL: function(aValue) {\n        // from: 2012-09-01\n        // to: 20120901\n        var len = aValue.length;\n\n        if (len == 10) {\n          return aValue.substr(0, 4) +\n                 aValue.substr(5, 2) +\n                 aValue.substr(8, 2);\n        } else if (len >= 19) {\n          return icalValues[\"date-time\"].toICAL(aValue);\n        } else {\n          //TODO: serialize warning?\n          return aValue;\n        }\n\n      }\n    },\n    \"date-time\": {\n      fromICAL: function(aValue) {\n        // from: 20120901T130000\n        // to: 2012-09-01T13:00:00\n        if (!design.strict && aValue.length == 8) {\n          // This is probably a date, e.g. 20120901\n          return icalValues.date.fromICAL(aValue);\n        } else {\n          var result = aValue.substr(0, 4) + '-' +\n                       aValue.substr(4, 2) + '-' +\n                       aValue.substr(6, 2) + 'T' +\n                       aValue.substr(9, 2) + ':' +\n                       aValue.substr(11, 2) + ':' +\n                       aValue.substr(13, 2);\n\n          if (aValue[15] && aValue[15] === 'Z') {\n            result += 'Z';\n          }\n\n          return result;\n        }\n      },\n\n      toICAL: function(aValue) {\n        // from: 2012-09-01T13:00:00\n        // to: 20120901T130000\n        var len = aValue.length;\n\n        if (len == 10 && !design.strict) {\n          return icalValues.date.toICAL(aValue);\n        } else if (len >= 19) {\n          var result = aValue.substr(0, 4) +\n                       aValue.substr(5, 2) +\n                       // grab the (DDTHH) segment\n                       aValue.substr(8, 5) +\n                       // MM\n                       aValue.substr(14, 2) +\n                       // SS\n                       aValue.substr(17, 2);\n\n          if (aValue[19] && aValue[19] === 'Z') {\n            result += 'Z';\n          }\n          return result;\n        } else {\n          // TODO: error\n          return aValue;\n        }\n      },\n\n      decorate: function(aValue, aProp) {\n        if (design.strict) {\n          return ICAL.Time.fromDateTimeString(aValue, aProp);\n        } else {\n          return ICAL.Time.fromString(aValue, aProp);\n        }\n      },\n\n      undecorate: function(aValue) {\n        return aValue.toString();\n      }\n    },\n    duration: {\n      decorate: function(aValue) {\n        return ICAL.Duration.fromString(aValue);\n      },\n      undecorate: function(aValue) {\n        return aValue.toString();\n      }\n    },\n    period: {\n\n      fromICAL: function(string) {\n        var parts = string.split('/');\n        parts[0] = icalValues['date-time'].fromICAL(parts[0]);\n\n        if (!ICAL.Duration.isValueString(parts[1])) {\n          parts[1] = icalValues['date-time'].fromICAL(parts[1]);\n        }\n\n        return parts;\n      },\n\n      toICAL: function(parts) {\n        if (!design.strict && parts[0].length == 10) {\n          parts[0] = icalValues.date.toICAL(parts[0]);\n        } else {\n          parts[0] = icalValues['date-time'].toICAL(parts[0]);\n        }\n\n        if (!ICAL.Duration.isValueString(parts[1])) {\n          if (!design.strict && parts[1].length == 10) {\n            parts[1] = icalValues.date.toICAL(parts[1]);\n          } else {\n            parts[1] = icalValues['date-time'].toICAL(parts[1]);\n          }\n        }\n\n        return parts.join(\"/\");\n      },\n\n      decorate: function(aValue, aProp) {\n        return ICAL.Period.fromJSON(aValue, aProp, !design.strict);\n      },\n\n      undecorate: function(aValue) {\n        return aValue.toJSON();\n      }\n    },\n    recur: {\n      fromICAL: function(string) {\n        return ICAL.Recur._stringToData(string, true);\n      },\n\n      toICAL: function(data) {\n        var str = \"\";\n        for (var k in data) {\n          /* istanbul ignore if */\n          if (!Object.prototype.hasOwnProperty.call(data, k)) {\n            continue;\n          }\n          var val = data[k];\n          if (k == \"until\") {\n            if (val.length > 10) {\n              val = icalValues['date-time'].toICAL(val);\n            } else {\n              val = icalValues.date.toICAL(val);\n            }\n          } else if (k == \"wkst\") {\n            if (typeof val === 'number') {\n              val = ICAL.Recur.numericDayToIcalDay(val);\n            }\n          } else if (Array.isArray(val)) {\n            val = val.join(\",\");\n          }\n          str += k.toUpperCase() + \"=\" + val + \";\";\n        }\n        return str.substr(0, str.length - 1);\n      },\n\n      decorate: function decorate(aValue) {\n        return ICAL.Recur.fromData(aValue);\n      },\n\n      undecorate: function(aRecur) {\n        return aRecur.toJSON();\n      }\n    },\n\n    time: {\n      fromICAL: function(aValue) {\n        // from: MMHHSS(Z)?\n        // to: HH:MM:SS(Z)?\n        if (aValue.length < 6) {\n          // TODO: parser exception?\n          return aValue;\n        }\n\n        // HH::MM::SSZ?\n        var result = aValue.substr(0, 2) + ':' +\n                     aValue.substr(2, 2) + ':' +\n                     aValue.substr(4, 2);\n\n        if (aValue[6] === 'Z') {\n          result += 'Z';\n        }\n\n        return result;\n      },\n\n      toICAL: function(aValue) {\n        // from: HH:MM:SS(Z)?\n        // to: MMHHSS(Z)?\n        if (aValue.length < 8) {\n          //TODO: error\n          return aValue;\n        }\n\n        var result = aValue.substr(0, 2) +\n                     aValue.substr(3, 2) +\n                     aValue.substr(6, 2);\n\n        if (aValue[8] === 'Z') {\n          result += 'Z';\n        }\n\n        return result;\n      }\n    }\n  });\n\n  var icalProperties = ICAL.helpers.extend(commonProperties, {\n\n    \"action\": DEFAULT_TYPE_TEXT,\n    \"attach\": { defaultType: \"uri\" },\n    \"attendee\": { defaultType: \"cal-address\" },\n    \"calscale\": DEFAULT_TYPE_TEXT,\n    \"class\": DEFAULT_TYPE_TEXT,\n    \"comment\": DEFAULT_TYPE_TEXT,\n    \"completed\": DEFAULT_TYPE_DATETIME,\n    \"contact\": DEFAULT_TYPE_TEXT,\n    \"created\": DEFAULT_TYPE_DATETIME,\n    \"description\": DEFAULT_TYPE_TEXT,\n    \"dtend\": DEFAULT_TYPE_DATETIME_DATE,\n    \"dtstamp\": DEFAULT_TYPE_DATETIME,\n    \"dtstart\": DEFAULT_TYPE_DATETIME_DATE,\n    \"due\": DEFAULT_TYPE_DATETIME_DATE,\n    \"duration\": { defaultType: \"duration\" },\n    \"exdate\": {\n      defaultType: \"date-time\",\n      allowedTypes: [\"date-time\", \"date\"],\n      multiValue: ','\n    },\n    \"exrule\": DEFAULT_TYPE_RECUR,\n    \"freebusy\": { defaultType: \"period\", multiValue: \",\" },\n    \"geo\": { defaultType: \"float\", structuredValue: \";\" },\n    \"last-modified\": DEFAULT_TYPE_DATETIME,\n    \"location\": DEFAULT_TYPE_TEXT,\n    \"method\": DEFAULT_TYPE_TEXT,\n    \"organizer\": { defaultType: \"cal-address\" },\n    \"percent-complete\": DEFAULT_TYPE_INTEGER,\n    \"priority\": DEFAULT_TYPE_INTEGER,\n    \"prodid\": DEFAULT_TYPE_TEXT,\n    \"related-to\": DEFAULT_TYPE_TEXT,\n    \"repeat\": DEFAULT_TYPE_INTEGER,\n    \"rdate\": {\n      defaultType: \"date-time\",\n      allowedTypes: [\"date-time\", \"date\", \"period\"],\n      multiValue: ',',\n      detectType: function(string) {\n        if (string.indexOf('/') !== -1) {\n          return 'period';\n        }\n        return (string.indexOf('T') === -1) ? 'date' : 'date-time';\n      }\n    },\n    \"recurrence-id\": DEFAULT_TYPE_DATETIME_DATE,\n    \"resources\": DEFAULT_TYPE_TEXT_MULTI,\n    \"request-status\": DEFAULT_TYPE_TEXT_STRUCTURED,\n    \"rrule\": DEFAULT_TYPE_RECUR,\n    \"sequence\": DEFAULT_TYPE_INTEGER,\n    \"status\": DEFAULT_TYPE_TEXT,\n    \"summary\": DEFAULT_TYPE_TEXT,\n    \"transp\": DEFAULT_TYPE_TEXT,\n    \"trigger\": { defaultType: \"duration\", allowedTypes: [\"duration\", \"date-time\"] },\n    \"tzoffsetfrom\": DEFAULT_TYPE_UTCOFFSET,\n    \"tzoffsetto\": DEFAULT_TYPE_UTCOFFSET,\n    \"tzurl\": DEFAULT_TYPE_URI,\n    \"tzid\": DEFAULT_TYPE_TEXT,\n    \"tzname\": DEFAULT_TYPE_TEXT\n  });\n\n  // When adding a value here, be sure to add it to the parameter types!\n  var vcardValues = ICAL.helpers.extend(commonValues, {\n    text: createTextType(FROM_VCARD_NEWLINE, TO_VCARD_NEWLINE),\n    uri: createTextType(FROM_VCARD_NEWLINE, TO_VCARD_NEWLINE),\n\n    date: {\n      decorate: function(aValue) {\n        return ICAL.VCardTime.fromDateAndOrTimeString(aValue, \"date\");\n      },\n      undecorate: function(aValue) {\n        return aValue.toString();\n      },\n      fromICAL: function(aValue) {\n        if (aValue.length == 8) {\n          return icalValues.date.fromICAL(aValue);\n        } else if (aValue[0] == '-' && aValue.length == 6) {\n          return aValue.substr(0, 4) + '-' + aValue.substr(4);\n        } else {\n          return aValue;\n        }\n      },\n      toICAL: function(aValue) {\n        if (aValue.length == 10) {\n          return icalValues.date.toICAL(aValue);\n        } else if (aValue[0] == '-' && aValue.length == 7) {\n          return aValue.substr(0, 4) + aValue.substr(5);\n        } else {\n          return aValue;\n        }\n      }\n    },\n\n    time: {\n      decorate: function(aValue) {\n        return ICAL.VCardTime.fromDateAndOrTimeString(\"T\" + aValue, \"time\");\n      },\n      undecorate: function(aValue) {\n        return aValue.toString();\n      },\n      fromICAL: function(aValue) {\n        var splitzone = vcardValues.time._splitZone(aValue, true);\n        var zone = splitzone[0], value = splitzone[1];\n\n        //console.log(\"SPLIT: \",splitzone);\n\n        if (value.length == 6) {\n          value = value.substr(0, 2) + ':' +\n                  value.substr(2, 2) + ':' +\n                  value.substr(4, 2);\n        } else if (value.length == 4 && value[0] != '-') {\n          value = value.substr(0, 2) + ':' + value.substr(2, 2);\n        } else if (value.length == 5) {\n          value = value.substr(0, 3) + ':' + value.substr(3, 2);\n        }\n\n        if (zone.length == 5 && (zone[0] == '-' || zone[0] == '+')) {\n          zone = zone.substr(0, 3) + ':' + zone.substr(3);\n        }\n\n        return value + zone;\n      },\n\n      toICAL: function(aValue) {\n        var splitzone = vcardValues.time._splitZone(aValue);\n        var zone = splitzone[0], value = splitzone[1];\n\n        if (value.length == 8) {\n          value = value.substr(0, 2) +\n                  value.substr(3, 2) +\n                  value.substr(6, 2);\n        } else if (value.length == 5 && value[0] != '-') {\n          value = value.substr(0, 2) + value.substr(3, 2);\n        } else if (value.length == 6) {\n          value = value.substr(0, 3) + value.substr(4, 2);\n        }\n\n        if (zone.length == 6 && (zone[0] == '-' || zone[0] == '+')) {\n          zone = zone.substr(0, 3) + zone.substr(4);\n        }\n\n        return value + zone;\n      },\n\n      _splitZone: function(aValue, isFromIcal) {\n        var lastChar = aValue.length - 1;\n        var signChar = aValue.length - (isFromIcal ? 5 : 6);\n        var sign = aValue[signChar];\n        var zone, value;\n\n        if (aValue[lastChar] == 'Z') {\n          zone = aValue[lastChar];\n          value = aValue.substr(0, lastChar);\n        } else if (aValue.length > 6 && (sign == '-' || sign == '+')) {\n          zone = aValue.substr(signChar);\n          value = aValue.substr(0, signChar);\n        } else {\n          zone = \"\";\n          value = aValue;\n        }\n\n        return [zone, value];\n      }\n    },\n\n    \"date-time\": {\n      decorate: function(aValue) {\n        return ICAL.VCardTime.fromDateAndOrTimeString(aValue, \"date-time\");\n      },\n\n      undecorate: function(aValue) {\n        return aValue.toString();\n      },\n\n      fromICAL: function(aValue) {\n        return vcardValues['date-and-or-time'].fromICAL(aValue);\n      },\n\n      toICAL: function(aValue) {\n        return vcardValues['date-and-or-time'].toICAL(aValue);\n      }\n    },\n\n    \"date-and-or-time\": {\n      decorate: function(aValue) {\n        return ICAL.VCardTime.fromDateAndOrTimeString(aValue, \"date-and-or-time\");\n      },\n\n      undecorate: function(aValue) {\n        return aValue.toString();\n      },\n\n      fromICAL: function(aValue) {\n        var parts = aValue.split('T');\n        return (parts[0] ? vcardValues.date.fromICAL(parts[0]) : '') +\n               (parts[1] ? 'T' + vcardValues.time.fromICAL(parts[1]) : '');\n      },\n\n      toICAL: function(aValue) {\n        var parts = aValue.split('T');\n        return vcardValues.date.toICAL(parts[0]) +\n               (parts[1] ? 'T' + vcardValues.time.toICAL(parts[1]) : '');\n\n      }\n    },\n    timestamp: icalValues['date-time'],\n    \"language-tag\": {\n      matches: /^[a-zA-Z0-9-]+$/ // Could go with a more strict regex here\n    }\n  });\n\n  var vcardParams = {\n    \"type\": {\n      valueType: \"text\",\n      multiValue: \",\"\n    },\n    \"value\": {\n      // since the value here is a 'type' lowercase is used.\n      values: [\"text\", \"uri\", \"date\", \"time\", \"date-time\", \"date-and-or-time\",\n               \"timestamp\", \"boolean\", \"integer\", \"float\", \"utc-offset\",\n               \"language-tag\"],\n      allowXName: true,\n      allowIanaToken: true\n    }\n  };\n\n  var vcardProperties = ICAL.helpers.extend(commonProperties, {\n    \"adr\": { defaultType: \"text\", structuredValue: \";\", multiValue: \",\" },\n    \"anniversary\": DEFAULT_TYPE_DATE_ANDOR_TIME,\n    \"bday\": DEFAULT_TYPE_DATE_ANDOR_TIME,\n    \"caladruri\": DEFAULT_TYPE_URI,\n    \"caluri\": DEFAULT_TYPE_URI,\n    \"clientpidmap\": DEFAULT_TYPE_TEXT_STRUCTURED,\n    \"email\": DEFAULT_TYPE_TEXT,\n    \"fburl\": DEFAULT_TYPE_URI,\n    \"fn\": DEFAULT_TYPE_TEXT,\n    \"gender\": DEFAULT_TYPE_TEXT_STRUCTURED,\n    \"geo\": DEFAULT_TYPE_URI,\n    \"impp\": DEFAULT_TYPE_URI,\n    \"key\": DEFAULT_TYPE_URI,\n    \"kind\": DEFAULT_TYPE_TEXT,\n    \"lang\": { defaultType: \"language-tag\" },\n    \"logo\": DEFAULT_TYPE_URI,\n    \"member\": DEFAULT_TYPE_URI,\n    \"n\": { defaultType: \"text\", structuredValue: \";\", multiValue: \",\" },\n    \"nickname\": DEFAULT_TYPE_TEXT_MULTI,\n    \"note\": DEFAULT_TYPE_TEXT,\n    \"org\": { defaultType: \"text\", structuredValue: \";\" },\n    \"photo\": DEFAULT_TYPE_URI,\n    \"related\": DEFAULT_TYPE_URI,\n    \"rev\": { defaultType: \"timestamp\" },\n    \"role\": DEFAULT_TYPE_TEXT,\n    \"sound\": DEFAULT_TYPE_URI,\n    \"source\": DEFAULT_TYPE_URI,\n    \"tel\": { defaultType: \"uri\", allowedTypes: [\"uri\", \"text\"] },\n    \"title\": DEFAULT_TYPE_TEXT,\n    \"tz\": { defaultType: \"text\", allowedTypes: [\"text\", \"utc-offset\", \"uri\"] },\n    \"xml\": DEFAULT_TYPE_TEXT\n  });\n\n  var vcard3Values = ICAL.helpers.extend(commonValues, {\n    binary: icalValues.binary,\n    date: vcardValues.date,\n    \"date-time\": vcardValues[\"date-time\"],\n    \"phone-number\": {\n      // TODO\n      /* ... */\n    },\n    uri: icalValues.uri,\n    text: icalValues.text,\n    time: icalValues.time,\n    vcard: icalValues.text,\n    \"utc-offset\": {\n      toICAL: function(aValue) {\n        return aValue.substr(0, 7);\n      },\n\n      fromICAL: function(aValue) {\n        return aValue.substr(0, 7);\n      },\n\n      decorate: function(aValue) {\n        return ICAL.UtcOffset.fromString(aValue);\n      },\n\n      undecorate: function(aValue) {\n        return aValue.toString();\n      }\n    }\n  });\n\n  var vcard3Params = {\n    \"type\": {\n      valueType: \"text\",\n      multiValue: \",\"\n    },\n    \"value\": {\n      // since the value here is a 'type' lowercase is used.\n      values: [\"text\", \"uri\", \"date\", \"date-time\", \"phone-number\", \"time\",\n               \"boolean\", \"integer\", \"float\", \"utc-offset\", \"vcard\", \"binary\"],\n      allowXName: true,\n      allowIanaToken: true\n    }\n  };\n\n  var vcard3Properties = ICAL.helpers.extend(commonProperties, {\n    fn: DEFAULT_TYPE_TEXT,\n    n: { defaultType: \"text\", structuredValue: \";\", multiValue: \",\" },\n    nickname: DEFAULT_TYPE_TEXT_MULTI,\n    photo: { defaultType: \"binary\", allowedTypes: [\"binary\", \"uri\"] },\n    bday: {\n      defaultType: \"date-time\",\n      allowedTypes: [\"date-time\", \"date\"],\n      detectType: function(string) {\n        return (string.indexOf('T') === -1) ? 'date' : 'date-time';\n      }\n    },\n\n    adr: { defaultType: \"text\", structuredValue: \";\", multiValue: \",\" },\n    label: DEFAULT_TYPE_TEXT,\n\n    tel: { defaultType: \"phone-number\" },\n    email: DEFAULT_TYPE_TEXT,\n    mailer: DEFAULT_TYPE_TEXT,\n\n    tz: { defaultType: \"utc-offset\", allowedTypes: [\"utc-offset\", \"text\"] },\n    geo: { defaultType: \"float\", structuredValue: \";\" },\n\n    title: DEFAULT_TYPE_TEXT,\n    role: DEFAULT_TYPE_TEXT,\n    logo: { defaultType: \"binary\", allowedTypes: [\"binary\", \"uri\"] },\n    agent: { defaultType: \"vcard\", allowedTypes: [\"vcard\", \"text\", \"uri\"] },\n    org: DEFAULT_TYPE_TEXT_STRUCTURED,\n\n    note: DEFAULT_TYPE_TEXT_MULTI,\n    prodid: DEFAULT_TYPE_TEXT,\n    rev: {\n      defaultType: \"date-time\",\n      allowedTypes: [\"date-time\", \"date\"],\n      detectType: function(string) {\n        return (string.indexOf('T') === -1) ? 'date' : 'date-time';\n      }\n    },\n    \"sort-string\": DEFAULT_TYPE_TEXT,\n    sound: { defaultType: \"binary\", allowedTypes: [\"binary\", \"uri\"] },\n\n    class: DEFAULT_TYPE_TEXT,\n    key: { defaultType: \"binary\", allowedTypes: [\"binary\", \"text\"] }\n  });\n\n  /**\n   * iCalendar design set\n   * @type {ICAL.design.designSet}\n   */\n  var icalSet = {\n    value: icalValues,\n    param: icalParams,\n    property: icalProperties\n  };\n\n  /**\n   * vCard 4.0 design set\n   * @type {ICAL.design.designSet}\n   */\n  var vcardSet = {\n    value: vcardValues,\n    param: vcardParams,\n    property: vcardProperties\n  };\n\n  /**\n   * vCard 3.0 design set\n   * @type {ICAL.design.designSet}\n   */\n  var vcard3Set = {\n    value: vcard3Values,\n    param: vcard3Params,\n    property: vcard3Properties\n  };\n\n  /**\n   * The design data, used by the parser to determine types for properties and\n   * other metadata needed to produce correct jCard/jCal data.\n   *\n   * @alias ICAL.design\n   * @namespace\n   */\n  var design = {\n    /**\n     * A designSet describes value, parameter and property data. It is used by\n     * ther parser and stringifier in components and properties to determine they\n     * should be represented.\n     *\n     * @typedef {Object} designSet\n     * @memberOf ICAL.design\n     * @property {Object} value       Definitions for value types, keys are type names\n     * @property {Object} param       Definitions for params, keys are param names\n     * @property {Object} property    Defintions for properties, keys are property names\n     */\n\n    /**\n     * Can be set to false to make the parser more lenient.\n     */\n    strict: true,\n\n    /**\n     * The default set for new properties and components if none is specified.\n     * @type {ICAL.design.designSet}\n     */\n    defaultSet: icalSet,\n\n    /**\n     * The default type for unknown properties\n     * @type {String}\n     */\n    defaultType: 'unknown',\n\n    /**\n     * Holds the design set for known top-level components\n     *\n     * @type {Object}\n     * @property {ICAL.design.designSet} vcard       vCard VCARD\n     * @property {ICAL.design.designSet} vevent      iCalendar VEVENT\n     * @property {ICAL.design.designSet} vtodo       iCalendar VTODO\n     * @property {ICAL.design.designSet} vjournal    iCalendar VJOURNAL\n     * @property {ICAL.design.designSet} valarm      iCalendar VALARM\n     * @property {ICAL.design.designSet} vtimezone   iCalendar VTIMEZONE\n     * @property {ICAL.design.designSet} daylight    iCalendar DAYLIGHT\n     * @property {ICAL.design.designSet} standard    iCalendar STANDARD\n     *\n     * @example\n     * var propertyName = 'fn';\n     * var componentDesign = ICAL.design.components.vcard;\n     * var propertyDetails = componentDesign.property[propertyName];\n     * if (propertyDetails.defaultType == 'text') {\n     *   // Yep, sure is...\n     * }\n     */\n    components: {\n      vcard: vcardSet,\n      vcard3: vcard3Set,\n      vevent: icalSet,\n      vtodo: icalSet,\n      vjournal: icalSet,\n      valarm: icalSet,\n      vtimezone: icalSet,\n      daylight: icalSet,\n      standard: icalSet\n    },\n\n\n    /**\n     * The design set for iCalendar (rfc5545/rfc7265) components.\n     * @type {ICAL.design.designSet}\n     */\n    icalendar: icalSet,\n\n    /**\n     * The design set for vCard (rfc6350/rfc7095) components.\n     * @type {ICAL.design.designSet}\n     */\n    vcard: vcardSet,\n\n    /**\n     * The design set for vCard (rfc2425/rfc2426/rfc7095) components.\n     * @type {ICAL.design.designSet}\n     */\n    vcard3: vcard3Set,\n\n    /**\n     * Gets the design set for the given component name.\n     *\n     * @param {String} componentName        The name of the component\n     * @return {ICAL.design.designSet}      The design set for the component\n     */\n    getDesignSet: function(componentName) {\n      var isInDesign = componentName && componentName in design.components;\n      return isInDesign ? design.components[componentName] : design.defaultSet;\n    }\n  };\n\n  return design;\n}());\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n/**\n * Contains various functions to convert jCal and jCard data back into\n * iCalendar and vCard.\n * @namespace\n */\nICAL.stringify = (function() {\n  'use strict';\n\n  var LINE_ENDING = '\\r\\n';\n  var DEFAULT_VALUE_TYPE = 'unknown';\n\n  var design = ICAL.design;\n  var helpers = ICAL.helpers;\n\n  /**\n   * Convert a full jCal/jCard array into a iCalendar/vCard string.\n   *\n   * @function ICAL.stringify\n   * @variation function\n   * @param {Array} jCal    The jCal/jCard document\n   * @return {String}       The stringified iCalendar/vCard document\n   */\n  function stringify(jCal) {\n    if (typeof jCal[0] == \"string\") {\n      // This is a single component\n      jCal = [jCal];\n    }\n\n    var i = 0;\n    var len = jCal.length;\n    var result = '';\n\n    for (; i < len; i++) {\n      result += stringify.component(jCal[i]) + LINE_ENDING;\n    }\n\n    return result;\n  }\n\n  /**\n   * Converts an jCal component array into a ICAL string.\n   * Recursive will resolve sub-components.\n   *\n   * Exact component/property order is not saved all\n   * properties will come before subcomponents.\n   *\n   * @function ICAL.stringify.component\n   * @param {Array} component\n   *        jCal/jCard fragment of a component\n   * @param {ICAL.design.designSet} designSet\n   *        The design data to use for this component\n   * @return {String}       The iCalendar/vCard string\n   */\n  stringify.component = function(component, designSet) {\n    var name = component[0].toUpperCase();\n    var result = 'BEGIN:' + name + LINE_ENDING;\n\n    var props = component[1];\n    var propIdx = 0;\n    var propLen = props.length;\n\n    var designSetName = component[0];\n    // rfc6350 requires that in vCard 4.0 the first component is the VERSION\n    // component with as value 4.0, note that 3.0 does not have this requirement.\n    if (designSetName === 'vcard' && component[1].length > 0 &&\n            !(component[1][0][0] === \"version\" && component[1][0][3] === \"4.0\")) {\n      designSetName = \"vcard3\";\n    }\n    designSet = designSet || design.getDesignSet(designSetName);\n\n    for (; propIdx < propLen; propIdx++) {\n      result += stringify.property(props[propIdx], designSet) + LINE_ENDING;\n    }\n\n    // Ignore subcomponents if none exist, e.g. in vCard.\n    var comps = component[2] || [];\n    var compIdx = 0;\n    var compLen = comps.length;\n\n    for (; compIdx < compLen; compIdx++) {\n      result += stringify.component(comps[compIdx], designSet) + LINE_ENDING;\n    }\n\n    result += 'END:' + name;\n    return result;\n  };\n\n  /**\n   * Converts a single jCal/jCard property to a iCalendar/vCard string.\n   *\n   * @function ICAL.stringify.property\n   * @param {Array} property\n   *        jCal/jCard property array\n   * @param {ICAL.design.designSet} designSet\n   *        The design data to use for this property\n   * @param {Boolean} noFold\n   *        If true, the line is not folded\n   * @return {String}       The iCalendar/vCard string\n   */\n  stringify.property = function(property, designSet, noFold) {\n    var name = property[0].toUpperCase();\n    var jsName = property[0];\n    var params = property[1];\n\n    var line = name;\n\n    var paramName;\n    for (paramName in params) {\n      var value = params[paramName];\n\n      /* istanbul ignore else */\n      if (params.hasOwnProperty(paramName)) {\n        var multiValue = (paramName in designSet.param) && designSet.param[paramName].multiValue;\n        if (multiValue && Array.isArray(value)) {\n          if (designSet.param[paramName].multiValueSeparateDQuote) {\n            multiValue = '\"' + multiValue + '\"';\n          }\n          value = value.map(stringify._rfc6868Unescape);\n          value = stringify.multiValue(value, multiValue, \"unknown\", null, designSet);\n        } else {\n          value = stringify._rfc6868Unescape(value);\n        }\n\n\n        line += ';' + paramName.toUpperCase();\n        line += '=' + stringify.propertyValue(value);\n      }\n    }\n\n    if (property.length === 3) {\n      // If there are no values, we must assume a blank value\n      return line + ':';\n    }\n\n    var valueType = property[2];\n\n    if (!designSet) {\n      designSet = design.defaultSet;\n    }\n\n    var propDetails;\n    var multiValue = false;\n    var structuredValue = false;\n    var isDefault = false;\n\n    if (jsName in designSet.property) {\n      propDetails = designSet.property[jsName];\n\n      if ('multiValue' in propDetails) {\n        multiValue = propDetails.multiValue;\n      }\n\n      if (('structuredValue' in propDetails) && Array.isArray(property[3])) {\n        structuredValue = propDetails.structuredValue;\n      }\n\n      if ('defaultType' in propDetails) {\n        if (valueType === propDetails.defaultType) {\n          isDefault = true;\n        }\n      } else {\n        if (valueType === DEFAULT_VALUE_TYPE) {\n          isDefault = true;\n        }\n      }\n    } else {\n      if (valueType === DEFAULT_VALUE_TYPE) {\n        isDefault = true;\n      }\n    }\n\n    // push the VALUE property if type is not the default\n    // for the current property.\n    if (!isDefault) {\n      // value will never contain ;/:/, so we don't escape it here.\n      line += ';VALUE=' + valueType.toUpperCase();\n    }\n\n    line += ':';\n\n    if (multiValue && structuredValue) {\n      line += stringify.multiValue(\n        property[3], structuredValue, valueType, multiValue, designSet, structuredValue\n      );\n    } else if (multiValue) {\n      line += stringify.multiValue(\n        property.slice(3), multiValue, valueType, null, designSet, false\n      );\n    } else if (structuredValue) {\n      line += stringify.multiValue(\n        property[3], structuredValue, valueType, null, designSet, structuredValue\n      );\n    } else {\n      line += stringify.value(property[3], valueType, designSet, false);\n    }\n\n    return noFold ? line : ICAL.helpers.foldline(line);\n  };\n\n  /**\n   * Handles escaping of property values that may contain:\n   *\n   *    COLON (:), SEMICOLON (;), or COMMA (,)\n   *\n   * If any of the above are present the result is wrapped\n   * in double quotes.\n   *\n   * @function ICAL.stringify.propertyValue\n   * @param {String} value      Raw property value\n   * @return {String}           Given or escaped value when needed\n   */\n  stringify.propertyValue = function(value) {\n\n    if ((helpers.unescapedIndexOf(value, ',') === -1) &&\n        (helpers.unescapedIndexOf(value, ':') === -1) &&\n        (helpers.unescapedIndexOf(value, ';') === -1)) {\n\n      return value;\n    }\n\n    return '\"' + value + '\"';\n  };\n\n  /**\n   * Converts an array of ical values into a single\n   * string based on a type and a delimiter value (like \",\").\n   *\n   * @function ICAL.stringify.multiValue\n   * @param {Array} values      List of values to convert\n   * @param {String} delim      Used to join the values (\",\", \";\", \":\")\n   * @param {String} type       Lowecase ical value type\n   *        (like boolean, date-time, etc..)\n   * @param {?String} innerMulti If set, each value will again be processed\n   *        Used for structured values\n   * @param {ICAL.design.designSet} designSet\n   *        The design data to use for this property\n   *\n   * @return {String}           iCalendar/vCard string for value\n   */\n  stringify.multiValue = function(values, delim, type, innerMulti, designSet, structuredValue) {\n    var result = '';\n    var len = values.length;\n    var i = 0;\n\n    for (; i < len; i++) {\n      if (innerMulti && Array.isArray(values[i])) {\n        result += stringify.multiValue(values[i], innerMulti, type, null, designSet, structuredValue);\n      } else {\n        result += stringify.value(values[i], type, designSet, structuredValue);\n      }\n\n      if (i !== (len - 1)) {\n        result += delim;\n      }\n    }\n\n    return result;\n  };\n\n  /**\n   * Processes a single ical value runs the associated \"toICAL\" method from the\n   * design value type if available to convert the value.\n   *\n   * @function ICAL.stringify.value\n   * @param {String|Number} value       A formatted value\n   * @param {String} type               Lowercase iCalendar/vCard value type\n   *  (like boolean, date-time, etc..)\n   * @return {String}                   iCalendar/vCard value for single value\n   */\n  stringify.value = function(value, type, designSet, structuredValue) {\n    if (type in designSet.value && 'toICAL' in designSet.value[type]) {\n      return designSet.value[type].toICAL(value, structuredValue);\n    }\n    return value;\n  };\n\n  /**\n   * Internal helper for rfc6868. Exposing this on ICAL.stringify so that\n   * hackers can disable the rfc6868 parsing if the really need to.\n   *\n   * @param {String} val        The value to unescape\n   * @return {String}           The escaped value\n   */\n  stringify._rfc6868Unescape = function(val) {\n    return val.replace(/[\\n^\"]/g, function(x) {\n      return RFC6868_REPLACE_MAP[x];\n    });\n  };\n  var RFC6868_REPLACE_MAP = { '\"': \"^'\", \"\\n\": \"^n\", \"^\": \"^^\" };\n\n  return stringify;\n}());\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n/**\n * Contains various functions to parse iCalendar and vCard data.\n * @namespace\n */\nICAL.parse = (function() {\n  'use strict';\n\n  var CHAR = /[^ \\t]/;\n  var MULTIVALUE_DELIMITER = ',';\n  var VALUE_DELIMITER = ':';\n  var PARAM_DELIMITER = ';';\n  var PARAM_NAME_DELIMITER = '=';\n  var DEFAULT_VALUE_TYPE = 'unknown';\n  var DEFAULT_PARAM_TYPE = 'text';\n\n  var design = ICAL.design;\n  var helpers = ICAL.helpers;\n\n  /**\n   * An error that occurred during parsing.\n   *\n   * @param {String} message        The error message\n   * @memberof ICAL.parse\n   * @extends {Error}\n   * @class\n   */\n  function ParserError(message) {\n    this.message = message;\n    this.name = 'ParserError';\n\n    try {\n      throw new Error();\n    } catch (e) {\n      if (e.stack) {\n        var split = e.stack.split('\\n');\n        split.shift();\n        this.stack = split.join('\\n');\n      }\n    }\n  }\n\n  ParserError.prototype = Error.prototype;\n\n  /**\n   * Parses iCalendar or vCard data into a raw jCal object. Consult\n   * documentation on the {@tutorial layers|layers of parsing} for more\n   * details.\n   *\n   * @function ICAL.parse\n   * @variation function\n   * @todo Fix the API to be more clear on the return type\n   * @param {String} input      The string data to parse\n   * @return {Object|Object[]}  A single jCal object, or an array thereof\n   */\n  function parser(input) {\n    var state = {};\n    var root = state.component = [];\n\n    state.stack = [root];\n\n    parser._eachLine(input, function(err, line) {\n      parser._handleContentLine(line, state);\n    });\n\n\n    // when there are still items on the stack\n    // throw a fatal error, a component was not closed\n    // correctly in that case.\n    if (state.stack.length > 1) {\n      throw new ParserError(\n        'invalid ical body. component began but did not end'\n      );\n    }\n\n    state = null;\n\n    return (root.length == 1 ? root[0] : root);\n  }\n\n  /**\n   * Parse an iCalendar property value into the jCal for a single property\n   *\n   * @function ICAL.parse.property\n   * @param {String} str\n   *   The iCalendar property string to parse\n   * @param {ICAL.design.designSet=} designSet\n   *   The design data to use for this property\n   * @return {Object}\n   *   The jCal Object containing the property\n   */\n  parser.property = function(str, designSet) {\n    var state = {\n      component: [[], []],\n      designSet: designSet || design.defaultSet\n    };\n    parser._handleContentLine(str, state);\n    return state.component[1][0];\n  };\n\n  /**\n   * Convenience method to parse a component. You can use ICAL.parse() directly\n   * instead.\n   *\n   * @function ICAL.parse.component\n   * @see ICAL.parse(function)\n   * @param {String} str    The iCalendar component string to parse\n   * @return {Object}       The jCal Object containing the component\n   */\n  parser.component = function(str) {\n    return parser(str);\n  };\n\n  // classes & constants\n  parser.ParserError = ParserError;\n\n  /**\n   * The state for parsing content lines from an iCalendar/vCard string.\n   *\n   * @private\n   * @memberof ICAL.parse\n   * @typedef {Object} parserState\n   * @property {ICAL.design.designSet} designSet    The design set to use for parsing\n   * @property {ICAL.Component[]} stack             The stack of components being processed\n   * @property {ICAL.Component} component           The currently active component\n   */\n\n\n  /**\n   * Handles a single line of iCalendar/vCard, updating the state.\n   *\n   * @private\n   * @function ICAL.parse._handleContentLine\n   * @param {String} line               The content line to process\n   * @param {ICAL.parse.parserState}    The current state of the line parsing\n   */\n  parser._handleContentLine = function(line, state) {\n    // break up the parts of the line\n    var valuePos = line.indexOf(VALUE_DELIMITER);\n    var paramPos = line.indexOf(PARAM_DELIMITER);\n\n    var lastParamIndex;\n    var lastValuePos;\n\n    // name of property or begin/end\n    var name;\n    var value;\n    // params is only overridden if paramPos !== -1.\n    // we can't do params = params || {} later on\n    // because it sacrifices ops.\n    var params = {};\n\n    /**\n     * Different property cases\n     *\n     *\n     * 1. RRULE:FREQ=foo\n     *    // FREQ= is not a param but the value\n     *\n     * 2. ATTENDEE;ROLE=REQ-PARTICIPANT;\n     *    // ROLE= is a param because : has not happened yet\n     */\n      // when the parameter delimiter is after the\n      // value delimiter then its not a parameter.\n\n    if ((paramPos !== -1 && valuePos !== -1)) {\n      // when the parameter delimiter is after the\n      // value delimiter then its not a parameter.\n      if (paramPos > valuePos) {\n        paramPos = -1;\n      }\n    }\n\n    var parsedParams;\n    if (paramPos !== -1) {\n      name = line.substring(0, paramPos).toLowerCase();\n      parsedParams = parser._parseParameters(line.substring(paramPos), 0, state.designSet);\n      if (parsedParams[2] == -1) {\n        throw new ParserError(\"Invalid parameters in '\" + line + \"'\");\n      }\n      params = parsedParams[0];\n      lastParamIndex = parsedParams[1].length + parsedParams[2] + paramPos;\n      if ((lastValuePos =\n        line.substring(lastParamIndex).indexOf(VALUE_DELIMITER)) !== -1) {\n        value = line.substring(lastParamIndex + lastValuePos + 1);\n      } else {\n        throw new ParserError(\"Missing parameter value in '\" + line + \"'\");\n      }\n    } else if (valuePos !== -1) {\n      // without parmeters (BEGIN:VCAENDAR, CLASS:PUBLIC)\n      name = line.substring(0, valuePos).toLowerCase();\n      value = line.substring(valuePos + 1);\n\n      if (name === 'begin') {\n        var newComponent = [value.toLowerCase(), [], []];\n        if (state.stack.length === 1) {\n          state.component.push(newComponent);\n        } else {\n          state.component[2].push(newComponent);\n        }\n        state.stack.push(state.component);\n        state.component = newComponent;\n        if (!state.designSet) {\n          state.designSet = design.getDesignSet(state.component[0]);\n        }\n        return;\n      } else if (name === 'end') {\n        state.component = state.stack.pop();\n        return;\n      }\n      // If its not begin/end, then this is a property with an empty value,\n      // which should be considered valid.\n    } else {\n      /**\n       * Invalid line.\n       * The rational to throw an error is we will\n       * never be certain that the rest of the file\n       * is sane and its unlikely that we can serialize\n       * the result correctly either.\n       */\n      throw new ParserError(\n        'invalid line (no token \";\" or \":\") \"' + line + '\"'\n      );\n    }\n\n    var valueType;\n    var multiValue = false;\n    var structuredValue = false;\n    var propertyDetails;\n\n    if (name in state.designSet.property) {\n      propertyDetails = state.designSet.property[name];\n\n      if ('multiValue' in propertyDetails) {\n        multiValue = propertyDetails.multiValue;\n      }\n\n      if ('structuredValue' in propertyDetails) {\n        structuredValue = propertyDetails.structuredValue;\n      }\n\n      if (value && 'detectType' in propertyDetails) {\n        valueType = propertyDetails.detectType(value);\n      }\n    }\n\n    // attempt to determine value\n    if (!valueType) {\n      if (!('value' in params)) {\n        if (propertyDetails) {\n          valueType = propertyDetails.defaultType;\n        } else {\n          valueType = DEFAULT_VALUE_TYPE;\n        }\n      } else {\n        // possible to avoid this?\n        valueType = params.value.toLowerCase();\n      }\n    }\n\n    delete params.value;\n\n    /**\n     * Note on `var result` juggling:\n     *\n     * I observed that building the array in pieces has adverse\n     * effects on performance, so where possible we inline the creation.\n     * Its a little ugly but resulted in ~2000 additional ops/sec.\n     */\n\n    var result;\n    if (multiValue && structuredValue) {\n      value = parser._parseMultiValue(value, structuredValue, valueType, [], multiValue, state.designSet, structuredValue);\n      result = [name, params, valueType, value];\n    } else if (multiValue) {\n      result = [name, params, valueType];\n      parser._parseMultiValue(value, multiValue, valueType, result, null, state.designSet, false);\n    } else if (structuredValue) {\n      value = parser._parseMultiValue(value, structuredValue, valueType, [], null, state.designSet, structuredValue);\n      result = [name, params, valueType, value];\n    } else {\n      value = parser._parseValue(value, valueType, state.designSet, false);\n      result = [name, params, valueType, value];\n    }\n    // rfc6350 requires that in vCard 4.0 the first component is the VERSION\n    // component with as value 4.0, note that 3.0 does not have this requirement.\n    if (state.component[0] === 'vcard' && state.component[1].length === 0 &&\n            !(name === 'version' && value === '4.0')) {\n      state.designSet = design.getDesignSet(\"vcard3\");\n    }\n    state.component[1].push(result);\n  };\n\n  /**\n   * Parse a value from the raw value into the jCard/jCal value.\n   *\n   * @private\n   * @function ICAL.parse._parseValue\n   * @param {String} value          Original value\n   * @param {String} type           Type of value\n   * @param {Object} designSet      The design data to use for this value\n   * @return {Object} varies on type\n   */\n  parser._parseValue = function(value, type, designSet, structuredValue) {\n    if (type in designSet.value && 'fromICAL' in designSet.value[type]) {\n      return designSet.value[type].fromICAL(value, structuredValue);\n    }\n    return value;\n  };\n\n  /**\n   * Parse parameters from a string to object.\n   *\n   * @function ICAL.parse._parseParameters\n   * @private\n   * @param {String} line           A single unfolded line\n   * @param {Numeric} start         Position to start looking for properties\n   * @param {Object} designSet      The design data to use for this property\n   * @return {Object} key/value pairs\n   */\n  parser._parseParameters = function(line, start, designSet) {\n    var lastParam = start;\n    var pos = 0;\n    var delim = PARAM_NAME_DELIMITER;\n    var result = {};\n    var name, lcname;\n    var value, valuePos = -1;\n    var type, multiValue, mvdelim;\n\n    // find the next '=' sign\n    // use lastParam and pos to find name\n    // check if \" is used if so get value from \"->\"\n    // then increment pos to find next ;\n\n    while ((pos !== false) &&\n           (pos = helpers.unescapedIndexOf(line, delim, pos + 1)) !== -1) {\n\n      name = line.substr(lastParam + 1, pos - lastParam - 1);\n      if (name.length == 0) {\n        throw new ParserError(\"Empty parameter name in '\" + line + \"'\");\n      }\n      lcname = name.toLowerCase();\n      mvdelim = false;\n      multiValue = false;\n\n      if (lcname in designSet.param && designSet.param[lcname].valueType) {\n        type = designSet.param[lcname].valueType;\n      } else {\n        type = DEFAULT_PARAM_TYPE;\n      }\n\n      if (lcname in designSet.param) {\n        multiValue = designSet.param[lcname].multiValue;\n        if (designSet.param[lcname].multiValueSeparateDQuote) {\n          mvdelim = parser._rfc6868Escape('\"' + multiValue + '\"');\n        }\n      }\n\n      var nextChar = line[pos + 1];\n      if (nextChar === '\"') {\n        valuePos = pos + 2;\n        pos = helpers.unescapedIndexOf(line, '\"', valuePos);\n        if (multiValue && pos != -1) {\n            var extendedValue = true;\n            while (extendedValue) {\n              if (line[pos + 1] == multiValue && line[pos + 2] == '\"') {\n                pos = helpers.unescapedIndexOf(line, '\"', pos + 3);\n              } else {\n                extendedValue = false;\n              }\n            }\n          }\n        if (pos === -1) {\n          throw new ParserError(\n            'invalid line (no matching double quote) \"' + line + '\"'\n          );\n        }\n        value = line.substr(valuePos, pos - valuePos);\n        lastParam = helpers.unescapedIndexOf(line, PARAM_DELIMITER, pos);\n        if (lastParam === -1) {\n          pos = false;\n        }\n      } else {\n        valuePos = pos + 1;\n\n        // move to next \";\"\n        var nextPos = helpers.unescapedIndexOf(line, PARAM_DELIMITER, valuePos);\n        var propValuePos = helpers.unescapedIndexOf(line, VALUE_DELIMITER, valuePos);\n        if (propValuePos !== -1 && nextPos > propValuePos) {\n          // this is a delimiter in the property value, let's stop here\n          nextPos = propValuePos;\n          pos = false;\n        } else if (nextPos === -1) {\n          // no \";\"\n          if (propValuePos === -1) {\n            nextPos = line.length;\n          } else {\n            nextPos = propValuePos;\n          }\n          pos = false;\n        } else {\n          lastParam = nextPos;\n          pos = nextPos;\n        }\n\n        value = line.substr(valuePos, nextPos - valuePos);\n      }\n\n      value = parser._rfc6868Escape(value);\n      if (multiValue) {\n        var delimiter = mvdelim || multiValue;\n        value = parser._parseMultiValue(value, delimiter, type, [], null, designSet);\n      } else {\n        value = parser._parseValue(value, type, designSet);\n      }\n\n      if (multiValue && (lcname in result)) {\n        if (Array.isArray(result[lcname])) {\n          result[lcname].push(value);\n        } else {\n          result[lcname] = [\n            result[lcname],\n            value\n          ];\n        }\n      } else {\n        result[lcname] = value;\n      }\n    }\n    return [result, value, valuePos];\n  };\n\n  /**\n   * Internal helper for rfc6868. Exposing this on ICAL.parse so that\n   * hackers can disable the rfc6868 parsing if the really need to.\n   *\n   * @function ICAL.parse._rfc6868Escape\n   * @param {String} val        The value to escape\n   * @return {String}           The escaped value\n   */\n  parser._rfc6868Escape = function(val) {\n    return val.replace(/\\^['n^]/g, function(x) {\n      return RFC6868_REPLACE_MAP[x];\n    });\n  };\n  var RFC6868_REPLACE_MAP = { \"^'\": '\"', \"^n\": \"\\n\", \"^^\": \"^\" };\n\n  /**\n   * Parse a multi value string. This function is used either for parsing\n   * actual multi-value property's values, or for handling parameter values. It\n   * can be used for both multi-value properties and structured value properties.\n   *\n   * @private\n   * @function ICAL.parse._parseMultiValue\n   * @param {String} buffer     The buffer containing the full value\n   * @param {String} delim      The multi-value delimiter\n   * @param {String} type       The value type to be parsed\n   * @param {Array.<?>} result        The array to append results to, varies on value type\n   * @param {String} innerMulti The inner delimiter to split each value with\n   * @param {ICAL.design.designSet} designSet   The design data for this value\n   * @return {?|Array.<?>}            Either an array of results, or the first result\n   */\n  parser._parseMultiValue = function(buffer, delim, type, result, innerMulti, designSet, structuredValue) {\n    var pos = 0;\n    var lastPos = 0;\n    var value;\n    if (delim.length === 0) {\n      return buffer;\n    }\n\n    // split each piece\n    while ((pos = helpers.unescapedIndexOf(buffer, delim, lastPos)) !== -1) {\n      value = buffer.substr(lastPos, pos - lastPos);\n      if (innerMulti) {\n        value = parser._parseMultiValue(value, innerMulti, type, [], null, designSet, structuredValue);\n      } else {\n        value = parser._parseValue(value, type, designSet, structuredValue);\n      }\n      result.push(value);\n      lastPos = pos + delim.length;\n    }\n\n    // on the last piece take the rest of string\n    value = buffer.substr(lastPos);\n    if (innerMulti) {\n      value = parser._parseMultiValue(value, innerMulti, type, [], null, designSet, structuredValue);\n    } else {\n      value = parser._parseValue(value, type, designSet, structuredValue);\n    }\n    result.push(value);\n\n    return result.length == 1 ? result[0] : result;\n  };\n\n  /**\n   * Process a complete buffer of iCalendar/vCard data line by line, correctly\n   * unfolding content. Each line will be processed with the given callback\n   *\n   * @private\n   * @function ICAL.parse._eachLine\n   * @param {String} buffer                         The buffer to process\n   * @param {function(?String, String)} callback    The callback for each line\n   */\n  parser._eachLine = function(buffer, callback) {\n    var len = buffer.length;\n    var lastPos = buffer.search(CHAR);\n    var pos = lastPos;\n    var line;\n    var firstChar;\n\n    var newlineOffset;\n\n    do {\n      pos = buffer.indexOf('\\n', lastPos) + 1;\n\n      if (pos > 1 && buffer[pos - 2] === '\\r') {\n        newlineOffset = 2;\n      } else {\n        newlineOffset = 1;\n      }\n\n      if (pos === 0) {\n        pos = len;\n        newlineOffset = 0;\n      }\n\n      firstChar = buffer[lastPos];\n\n      if (firstChar === ' ' || firstChar === '\\t') {\n        // add to line\n        line += buffer.substr(\n          lastPos + 1,\n          pos - lastPos - (newlineOffset + 1)\n        );\n      } else {\n        if (line)\n          callback(null, line);\n        // push line\n        line = buffer.substr(\n          lastPos,\n          pos - lastPos - newlineOffset\n        );\n      }\n\n      lastPos = pos;\n    } while (pos !== len);\n\n    // extra ending line\n    line = line.trim();\n\n    if (line.length)\n      callback(null, line);\n  };\n\n  return parser;\n\n}());\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n/**\n * This symbol is further described later on\n * @ignore\n */\nICAL.Component = (function() {\n  'use strict';\n\n  var PROPERTY_INDEX = 1;\n  var COMPONENT_INDEX = 2;\n  var NAME_INDEX = 0;\n\n  /**\n   * @classdesc\n   * Wraps a jCal component, adding convenience methods to add, remove and\n   * update subcomponents and properties.\n   *\n   * @class\n   * @alias ICAL.Component\n   * @param {Array|String} jCal         Raw jCal component data OR name of new\n   *                                      component\n   * @param {ICAL.Component} parent     Parent component to associate\n   */\n  function Component(jCal, parent) {\n    if (typeof(jCal) === 'string') {\n      // jCal spec (name, properties, components)\n      jCal = [jCal, [], []];\n    }\n\n    // mostly for legacy reasons.\n    this.jCal = jCal;\n\n    this.parent = parent || null;\n  }\n\n  Component.prototype = {\n    /**\n     * Hydrated properties are inserted into the _properties array at the same\n     * position as in the jCal array, so its possible the array contains\n     * undefined values for unhydrdated properties. To avoid iterating the\n     * array when checking if all properties have been hydrated, we save the\n     * count here.\n     *\n     * @type {Number}\n     * @private\n     */\n    _hydratedPropertyCount: 0,\n\n    /**\n     * The same count as for _hydratedPropertyCount, but for subcomponents\n     *\n     * @type {Number}\n     * @private\n     */\n    _hydratedComponentCount: 0,\n\n    /**\n     * The name of this component\n     * @readonly\n     */\n    get name() {\n      return this.jCal[NAME_INDEX];\n    },\n\n    /**\n     * The design set for this component, e.g. icalendar vs vcard\n     *\n     * @type {ICAL.design.designSet}\n     * @private\n     */\n    get _designSet() {\n      var parentDesign = this.parent && this.parent._designSet;\n      return parentDesign || ICAL.design.getDesignSet(this.name);\n    },\n\n    _hydrateComponent: function(index) {\n      if (!this._components) {\n        this._components = [];\n        this._hydratedComponentCount = 0;\n      }\n\n      if (this._components[index]) {\n        return this._components[index];\n      }\n\n      var comp = new Component(\n        this.jCal[COMPONENT_INDEX][index],\n        this\n      );\n\n      this._hydratedComponentCount++;\n      return (this._components[index] = comp);\n    },\n\n    _hydrateProperty: function(index) {\n      if (!this._properties) {\n        this._properties = [];\n        this._hydratedPropertyCount = 0;\n      }\n\n      if (this._properties[index]) {\n        return this._properties[index];\n      }\n\n      var prop = new ICAL.Property(\n        this.jCal[PROPERTY_INDEX][index],\n        this\n      );\n\n      this._hydratedPropertyCount++;\n      return (this._properties[index] = prop);\n    },\n\n    /**\n     * Finds first sub component, optionally filtered by name.\n     *\n     * @param {String=} name        Optional name to filter by\n     * @return {?ICAL.Component}     The found subcomponent\n     */\n    getFirstSubcomponent: function(name) {\n      if (name) {\n        var i = 0;\n        var comps = this.jCal[COMPONENT_INDEX];\n        var len = comps.length;\n\n        for (; i < len; i++) {\n          if (comps[i][NAME_INDEX] === name) {\n            var result = this._hydrateComponent(i);\n            return result;\n          }\n        }\n      } else {\n        if (this.jCal[COMPONENT_INDEX].length) {\n          return this._hydrateComponent(0);\n        }\n      }\n\n      // ensure we return a value (strict mode)\n      return null;\n    },\n\n    /**\n     * Finds all sub components, optionally filtering by name.\n     *\n     * @param {String=} name            Optional name to filter by\n     * @return {ICAL.Component[]}       The found sub components\n     */\n    getAllSubcomponents: function(name) {\n      var jCalLen = this.jCal[COMPONENT_INDEX].length;\n      var i = 0;\n\n      if (name) {\n        var comps = this.jCal[COMPONENT_INDEX];\n        var result = [];\n\n        for (; i < jCalLen; i++) {\n          if (name === comps[i][NAME_INDEX]) {\n            result.push(\n              this._hydrateComponent(i)\n            );\n          }\n        }\n        return result;\n      } else {\n        if (!this._components ||\n            (this._hydratedComponentCount !== jCalLen)) {\n          for (; i < jCalLen; i++) {\n            this._hydrateComponent(i);\n          }\n        }\n\n        return this._components || [];\n      }\n    },\n\n    /**\n     * Returns true when a named property exists.\n     *\n     * @param {String} name     The property name\n     * @return {Boolean}        True, when property is found\n     */\n    hasProperty: function(name) {\n      var props = this.jCal[PROPERTY_INDEX];\n      var len = props.length;\n\n      var i = 0;\n      for (; i < len; i++) {\n        // 0 is property name\n        if (props[i][NAME_INDEX] === name) {\n          return true;\n        }\n      }\n\n      return false;\n    },\n\n    /**\n     * Finds the first property, optionally with the given name.\n     *\n     * @param {String=} name        Lowercase property name\n     * @return {?ICAL.Property}     The found property\n     */\n    getFirstProperty: function(name) {\n      if (name) {\n        var i = 0;\n        var props = this.jCal[PROPERTY_INDEX];\n        var len = props.length;\n\n        for (; i < len; i++) {\n          if (props[i][NAME_INDEX] === name) {\n            var result = this._hydrateProperty(i);\n            return result;\n          }\n        }\n      } else {\n        if (this.jCal[PROPERTY_INDEX].length) {\n          return this._hydrateProperty(0);\n        }\n      }\n\n      return null;\n    },\n\n    /**\n     * Returns first property's value, if available.\n     *\n     * @param {String=} name    Lowercase property name\n     * @return {?String}        The found property value.\n     */\n    getFirstPropertyValue: function(name) {\n      var prop = this.getFirstProperty(name);\n      if (prop) {\n        return prop.getFirstValue();\n      }\n\n      return null;\n    },\n\n    /**\n     * Get all properties in the component, optionally filtered by name.\n     *\n     * @param {String=} name        Lowercase property name\n     * @return {ICAL.Property[]}    List of properties\n     */\n    getAllProperties: function(name) {\n      var jCalLen = this.jCal[PROPERTY_INDEX].length;\n      var i = 0;\n\n      if (name) {\n        var props = this.jCal[PROPERTY_INDEX];\n        var result = [];\n\n        for (; i < jCalLen; i++) {\n          if (name === props[i][NAME_INDEX]) {\n            result.push(\n              this._hydrateProperty(i)\n            );\n          }\n        }\n        return result;\n      } else {\n        if (!this._properties ||\n            (this._hydratedPropertyCount !== jCalLen)) {\n          for (; i < jCalLen; i++) {\n            this._hydrateProperty(i);\n          }\n        }\n\n        return this._properties || [];\n      }\n    },\n\n    _removeObjectByIndex: function(jCalIndex, cache, index) {\n      cache = cache || [];\n      // remove cached version\n      if (cache[index]) {\n        var obj = cache[index];\n        if (\"parent\" in obj) {\n            obj.parent = null;\n        }\n      }\n\n      cache.splice(index, 1);\n\n      // remove it from the jCal\n      this.jCal[jCalIndex].splice(index, 1);\n    },\n\n    _removeObject: function(jCalIndex, cache, nameOrObject) {\n      var i = 0;\n      var objects = this.jCal[jCalIndex];\n      var len = objects.length;\n      var cached = this[cache];\n\n      if (typeof(nameOrObject) === 'string') {\n        for (; i < len; i++) {\n          if (objects[i][NAME_INDEX] === nameOrObject) {\n            this._removeObjectByIndex(jCalIndex, cached, i);\n            return true;\n          }\n        }\n      } else if (cached) {\n        for (; i < len; i++) {\n          if (cached[i] && cached[i] === nameOrObject) {\n            this._removeObjectByIndex(jCalIndex, cached, i);\n            return true;\n          }\n        }\n      }\n\n      return false;\n    },\n\n    _removeAllObjects: function(jCalIndex, cache, name) {\n      var cached = this[cache];\n\n      // Unfortunately we have to run through all children to reset their\n      // parent property.\n      var objects = this.jCal[jCalIndex];\n      var i = objects.length - 1;\n\n      // descending search required because splice\n      // is used and will effect the indices.\n      for (; i >= 0; i--) {\n        if (!name || objects[i][NAME_INDEX] === name) {\n          this._removeObjectByIndex(jCalIndex, cached, i);\n        }\n      }\n    },\n\n    /**\n     * Adds a single sub component.\n     *\n     * @param {ICAL.Component} component        The component to add\n     * @return {ICAL.Component}                 The passed in component\n     */\n    addSubcomponent: function(component) {\n      if (!this._components) {\n        this._components = [];\n        this._hydratedComponentCount = 0;\n      }\n\n      if (component.parent) {\n        component.parent.removeSubcomponent(component);\n      }\n\n      var idx = this.jCal[COMPONENT_INDEX].push(component.jCal);\n      this._components[idx - 1] = component;\n      this._hydratedComponentCount++;\n      component.parent = this;\n      return component;\n    },\n\n    /**\n     * Removes a single component by name or the instance of a specific\n     * component.\n     *\n     * @param {ICAL.Component|String} nameOrComp    Name of component, or component\n     * @return {Boolean}                            True when comp is removed\n     */\n    removeSubcomponent: function(nameOrComp) {\n      var removed = this._removeObject(COMPONENT_INDEX, '_components', nameOrComp);\n      if (removed) {\n        this._hydratedComponentCount--;\n      }\n      return removed;\n    },\n\n    /**\n     * Removes all components or (if given) all components by a particular\n     * name.\n     *\n     * @param {String=} name            Lowercase component name\n     */\n    removeAllSubcomponents: function(name) {\n      var removed = this._removeAllObjects(COMPONENT_INDEX, '_components', name);\n      this._hydratedComponentCount = 0;\n      return removed;\n    },\n\n    /**\n     * Adds an {@link ICAL.Property} to the component.\n     *\n     * @param {ICAL.Property} property      The property to add\n     * @return {ICAL.Property}              The passed in property\n     */\n    addProperty: function(property) {\n      if (!(property instanceof ICAL.Property)) {\n        throw new TypeError('must instance of ICAL.Property');\n      }\n\n      if (!this._properties) {\n        this._properties = [];\n        this._hydratedPropertyCount = 0;\n      }\n\n      if (property.parent) {\n        property.parent.removeProperty(property);\n      }\n\n      var idx = this.jCal[PROPERTY_INDEX].push(property.jCal);\n      this._properties[idx - 1] = property;\n      this._hydratedPropertyCount++;\n      property.parent = this;\n      return property;\n    },\n\n    /**\n     * Helper method to add a property with a value to the component.\n     *\n     * @param {String}               name         Property name to add\n     * @param {String|Number|Object} value        Property value\n     * @return {ICAL.Property}                    The created property\n     */\n    addPropertyWithValue: function(name, value) {\n      var prop = new ICAL.Property(name);\n      prop.setValue(value);\n\n      this.addProperty(prop);\n\n      return prop;\n    },\n\n    /**\n     * Helper method that will update or create a property of the given name\n     * and sets its value. If multiple properties with the given name exist,\n     * only the first is updated.\n     *\n     * @param {String}               name         Property name to update\n     * @param {String|Number|Object} value        Property value\n     * @return {ICAL.Property}                    The created property\n     */\n    updatePropertyWithValue: function(name, value) {\n      var prop = this.getFirstProperty(name);\n\n      if (prop) {\n        prop.setValue(value);\n      } else {\n        prop = this.addPropertyWithValue(name, value);\n      }\n\n      return prop;\n    },\n\n    /**\n     * Removes a single property by name or the instance of the specific\n     * property.\n     *\n     * @param {String|ICAL.Property} nameOrProp     Property name or instance to remove\n     * @return {Boolean}                            True, when deleted\n     */\n    removeProperty: function(nameOrProp) {\n      var removed = this._removeObject(PROPERTY_INDEX, '_properties', nameOrProp);\n      if (removed) {\n        this._hydratedPropertyCount--;\n      }\n      return removed;\n    },\n\n    /**\n     * Removes all properties associated with this component, optionally\n     * filtered by name.\n     *\n     * @param {String=} name        Lowercase property name\n     * @return {Boolean}            True, when deleted\n     */\n    removeAllProperties: function(name) {\n      var removed = this._removeAllObjects(PROPERTY_INDEX, '_properties', name);\n      this._hydratedPropertyCount = 0;\n      return removed;\n    },\n\n    /**\n     * Returns the Object representation of this component. The returned object\n     * is a live jCal object and should be cloned if modified.\n     * @return {Object}\n     */\n    toJSON: function() {\n      return this.jCal;\n    },\n\n    /**\n     * The string representation of this component.\n     * @return {String}\n     */\n    toString: function() {\n      return ICAL.stringify.component(\n        this.jCal, this._designSet\n      );\n    }\n  };\n\n  /**\n   * Create an {@link ICAL.Component} by parsing the passed iCalendar string.\n   *\n   * @param {String} str        The iCalendar string to parse\n   */\n  Component.fromString = function(str) {\n    return new Component(ICAL.parse.component(str));\n  };\n\n  return Component;\n}());\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n/**\n * This symbol is further described later on\n * @ignore\n */\nICAL.Property = (function() {\n  'use strict';\n\n  var NAME_INDEX = 0;\n  var PROP_INDEX = 1;\n  var TYPE_INDEX = 2;\n  var VALUE_INDEX = 3;\n\n  var design = ICAL.design;\n\n  /**\n   * @classdesc\n   * Provides a layer on top of the raw jCal object for manipulating a single\n   * property, with its parameters and value.\n   *\n   * @description\n   * Its important to note that mutations done in the wrapper\n   * directly mutate the jCal object used to initialize.\n   *\n   * Can also be used to create new properties by passing\n   * the name of the property (as a String).\n   *\n   * @class\n   * @alias ICAL.Property\n   * @param {Array|String} jCal         Raw jCal representation OR\n   *  the new name of the property\n   *\n   * @param {ICAL.Component=} parent    Parent component\n   */\n  function Property(jCal, parent) {\n    this._parent = parent || null;\n\n    if (typeof(jCal) === 'string') {\n      // We are creating the property by name and need to detect the type\n      this.jCal = [jCal, {}, design.defaultType];\n      this.jCal[TYPE_INDEX] = this.getDefaultType();\n    } else {\n      this.jCal = jCal;\n    }\n    this._updateType();\n  }\n\n  Property.prototype = {\n\n    /**\n     * The value type for this property\n     * @readonly\n     * @type {String}\n     */\n    get type() {\n      return this.jCal[TYPE_INDEX];\n    },\n\n    /**\n     * The name of this property, in lowercase.\n     * @readonly\n     * @type {String}\n     */\n    get name() {\n      return this.jCal[NAME_INDEX];\n    },\n\n    /**\n     * The parent component for this property.\n     * @type {ICAL.Component}\n     */\n    get parent() {\n      return this._parent;\n    },\n\n    set parent(p) {\n      // Before setting the parent, check if the design set has changed. If it\n      // has, we later need to update the type if it was unknown before.\n      var designSetChanged = !this._parent || (p && p._designSet != this._parent._designSet);\n\n      this._parent = p;\n\n      if (this.type == design.defaultType && designSetChanged) {\n        this.jCal[TYPE_INDEX] = this.getDefaultType();\n        this._updateType();\n      }\n\n      return p;\n    },\n\n    /**\n     * The design set for this property, e.g. icalendar vs vcard\n     *\n     * @type {ICAL.design.designSet}\n     * @private\n     */\n    get _designSet() {\n      return this.parent ? this.parent._designSet : design.defaultSet;\n    },\n\n    /**\n     * Updates the type metadata from the current jCal type and design set.\n     *\n     * @private\n     */\n    _updateType: function() {\n      var designSet = this._designSet;\n\n      if (this.type in designSet.value) {\n        var designType = designSet.value[this.type];\n\n        if ('decorate' in designSet.value[this.type]) {\n          this.isDecorated = true;\n        } else {\n          this.isDecorated = false;\n        }\n\n        if (this.name in designSet.property) {\n          this.isMultiValue = ('multiValue' in designSet.property[this.name]);\n          this.isStructuredValue = ('structuredValue' in designSet.property[this.name]);\n        }\n      }\n    },\n\n    /**\n     * Hydrate a single value. The act of hydrating means turning the raw jCal\n     * value into a potentially wrapped object, for example {@link ICAL.Time}.\n     *\n     * @private\n     * @param {Number} index        The index of the value to hydrate\n     * @return {Object}             The decorated value.\n     */\n    _hydrateValue: function(index) {\n      if (this._values && this._values[index]) {\n        return this._values[index];\n      }\n\n      // for the case where there is no value.\n      if (this.jCal.length <= (VALUE_INDEX + index)) {\n        return null;\n      }\n\n      if (this.isDecorated) {\n        if (!this._values) {\n          this._values = [];\n        }\n        return (this._values[index] = this._decorate(\n          this.jCal[VALUE_INDEX + index]\n        ));\n      } else {\n        return this.jCal[VALUE_INDEX + index];\n      }\n    },\n\n    /**\n     * Decorate a single value, returning its wrapped object. This is used by\n     * the hydrate function to actually wrap the value.\n     *\n     * @private\n     * @param {?} value         The value to decorate\n     * @return {Object}         The decorated value\n     */\n    _decorate: function(value) {\n      return this._designSet.value[this.type].decorate(value, this);\n    },\n\n    /**\n     * Undecorate a single value, returning its raw jCal data.\n     *\n     * @private\n     * @param {Object} value         The value to undecorate\n     * @return {?}                   The undecorated value\n     */\n    _undecorate: function(value) {\n      return this._designSet.value[this.type].undecorate(value, this);\n    },\n\n    /**\n     * Sets the value at the given index while also hydrating it. The passed\n     * value can either be a decorated or undecorated value.\n     *\n     * @private\n     * @param {?} value             The value to set\n     * @param {Number} index        The index to set it at\n     */\n    _setDecoratedValue: function(value, index) {\n      if (!this._values) {\n        this._values = [];\n      }\n\n      if (typeof(value) === 'object' && 'icaltype' in value) {\n        // decorated value\n        this.jCal[VALUE_INDEX + index] = this._undecorate(value);\n        this._values[index] = value;\n      } else {\n        // undecorated value\n        this.jCal[VALUE_INDEX + index] = value;\n        this._values[index] = this._decorate(value);\n      }\n    },\n\n    /**\n     * Gets a parameter on the property.\n     *\n     * @param {String}        name   Property name (lowercase)\n     * @return {Array|String}        Property value\n     */\n    getParameter: function(name) {\n      if (name in this.jCal[PROP_INDEX]) {\n        return this.jCal[PROP_INDEX][name];\n      } else {\n        return undefined;\n      }\n    },\n\n    /**\n     * Gets first parameter on the property.\n     *\n     * @param {String}        name   Property name (lowercase)\n     * @return {String}        Property value\n     */\n    getFirstParameter: function(name) {\n      var parameters = this.getParameter(name);\n\n      if (Array.isArray(parameters)) {\n        return parameters[0];\n      }\n\n      return parameters;\n    },\n\n    /**\n     * Sets a parameter on the property.\n     *\n     * @param {String}       name     The parameter name\n     * @param {Array|String} value    The parameter value\n     */\n    setParameter: function(name, value) {\n      var lcname = name.toLowerCase();\n      if (typeof value === \"string\" &&\n          lcname in this._designSet.param &&\n          'multiValue' in this._designSet.param[lcname]) {\n          value = [value];\n      }\n      this.jCal[PROP_INDEX][name] = value;\n    },\n\n    /**\n     * Removes a parameter\n     *\n     * @param {String} name     The parameter name\n     */\n    removeParameter: function(name) {\n      delete this.jCal[PROP_INDEX][name];\n    },\n\n    /**\n     * Get the default type based on this property's name.\n     *\n     * @return {String}     The default type for this property\n     */\n    getDefaultType: function() {\n      var name = this.jCal[NAME_INDEX];\n      var designSet = this._designSet;\n\n      if (name in designSet.property) {\n        var details = designSet.property[name];\n        if ('defaultType' in details) {\n          return details.defaultType;\n        }\n      }\n      return design.defaultType;\n    },\n\n    /**\n     * Sets type of property and clears out any existing values of the current\n     * type.\n     *\n     * @param {String} type     New iCAL type (see design.*.values)\n     */\n    resetType: function(type) {\n      this.removeAllValues();\n      this.jCal[TYPE_INDEX] = type;\n      this._updateType();\n    },\n\n    /**\n     * Finds the first property value.\n     *\n     * @return {String}         First property value\n     */\n    getFirstValue: function() {\n      return this._hydrateValue(0);\n    },\n\n    /**\n     * Gets all values on the property.\n     *\n     * NOTE: this creates an array during each call.\n     *\n     * @return {Array}          List of values\n     */\n    getValues: function() {\n      var len = this.jCal.length - VALUE_INDEX;\n\n      if (len < 1) {\n        // its possible for a property to have no value.\n        return [];\n      }\n\n      var i = 0;\n      var result = [];\n\n      for (; i < len; i++) {\n        result[i] = this._hydrateValue(i);\n      }\n\n      return result;\n    },\n\n    /**\n     * Removes all values from this property\n     */\n    removeAllValues: function() {\n      if (this._values) {\n        this._values.length = 0;\n      }\n      this.jCal.length = 3;\n    },\n\n    /**\n     * Sets the values of the property.  Will overwrite the existing values.\n     * This can only be used for multi-value properties.\n     *\n     * @param {Array} values    An array of values\n     */\n    setValues: function(values) {\n      if (!this.isMultiValue) {\n        throw new Error(\n          this.name + ': does not not support mulitValue.\\n' +\n          'override isMultiValue'\n        );\n      }\n\n      var len = values.length;\n      var i = 0;\n      this.removeAllValues();\n\n      if (len > 0 &&\n          typeof(values[0]) === 'object' &&\n          'icaltype' in values[0]) {\n        this.resetType(values[0].icaltype);\n      }\n\n      if (this.isDecorated) {\n        for (; i < len; i++) {\n          this._setDecoratedValue(values[i], i);\n        }\n      } else {\n        for (; i < len; i++) {\n          this.jCal[VALUE_INDEX + i] = values[i];\n        }\n      }\n    },\n\n    /**\n     * Sets the current value of the property. If this is a multi-value\n     * property, all other values will be removed.\n     *\n     * @param {String|Object} value     New property value.\n     */\n    setValue: function(value) {\n      this.removeAllValues();\n      if (typeof(value) === 'object' && 'icaltype' in value) {\n        this.resetType(value.icaltype);\n      }\n\n      if (this.isDecorated) {\n        this._setDecoratedValue(value, 0);\n      } else {\n        this.jCal[VALUE_INDEX] = value;\n      }\n    },\n\n    /**\n     * Returns the Object representation of this component. The returned object\n     * is a live jCal object and should be cloned if modified.\n     * @return {Object}\n     */\n    toJSON: function() {\n      return this.jCal;\n    },\n\n    /**\n     * The string representation of this component.\n     * @return {String}\n     */\n    toICALString: function() {\n      return ICAL.stringify.property(\n        this.jCal, this._designSet, true\n      );\n    }\n  };\n\n  /**\n   * Create an {@link ICAL.Property} by parsing the passed iCalendar string.\n   *\n   * @param {String} str                        The iCalendar string to parse\n   * @param {ICAL.design.designSet=} designSet  The design data to use for this property\n   * @return {ICAL.Property}                    The created iCalendar property\n   */\n  Property.fromString = function(str, designSet) {\n    return new Property(ICAL.parse.property(str, designSet));\n  };\n\n  return Property;\n}());\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n/**\n * This symbol is further described later on\n * @ignore\n */\nICAL.UtcOffset = (function() {\n\n  /**\n   * @classdesc\n   * This class represents the \"duration\" value type, with various calculation\n   * and manipulation methods.\n   *\n   * @class\n   * @alias ICAL.UtcOffset\n   * @param {Object} aData          An object with members of the utc offset\n   * @param {Number=} aData.hours   The hours for the utc offset\n   * @param {Number=} aData.minutes The minutes in the utc offset\n   * @param {Number=} aData.factor  The factor for the utc-offset, either -1 or 1\n   */\n  function UtcOffset(aData) {\n    this.fromData(aData);\n  }\n\n  UtcOffset.prototype = {\n\n    /**\n     * The hours in the utc-offset\n     * @type {Number}\n     */\n    hours: 0,\n\n    /**\n     * The minutes in the utc-offset\n     * @type {Number}\n     */\n    minutes: 0,\n\n    /**\n     * The sign of the utc offset, 1 for positive offset, -1 for negative\n     * offsets.\n     * @type {Number}\n     */\n    factor: 1,\n\n    /**\n     * The type name, to be used in the jCal object.\n     * @constant\n     * @type {String}\n     * @default \"utc-offset\"\n     */\n    icaltype: \"utc-offset\",\n\n    /**\n     * Returns a clone of the utc offset object.\n     *\n     * @return {ICAL.UtcOffset}     The cloned object\n     */\n    clone: function() {\n      return ICAL.UtcOffset.fromSeconds(this.toSeconds());\n    },\n\n    /**\n     * Sets up the current instance using members from the passed data object.\n     *\n     * @param {Object} aData          An object with members of the utc offset\n     * @param {Number=} aData.hours   The hours for the utc offset\n     * @param {Number=} aData.minutes The minutes in the utc offset\n     * @param {Number=} aData.factor  The factor for the utc-offset, either -1 or 1\n     */\n    fromData: function(aData) {\n      if (aData) {\n        for (var key in aData) {\n          /* istanbul ignore else */\n          if (aData.hasOwnProperty(key)) {\n            this[key] = aData[key];\n          }\n        }\n      }\n      this._normalize();\n    },\n\n    /**\n     * Sets up the current instance from the given seconds value. The seconds\n     * value is truncated to the minute. Offsets are wrapped when the world\n     * ends, the hour after UTC+14:00 is UTC-12:00.\n     *\n     * @param {Number} aSeconds         The seconds to convert into an offset\n     */\n    fromSeconds: function(aSeconds) {\n      var secs = Math.abs(aSeconds);\n\n      this.factor = aSeconds < 0 ? -1 : 1;\n      this.hours = ICAL.helpers.trunc(secs / 3600);\n\n      secs -= (this.hours * 3600);\n      this.minutes = ICAL.helpers.trunc(secs / 60);\n      return this;\n    },\n\n    /**\n     * Convert the current offset to a value in seconds\n     *\n     * @return {Number}                 The offset in seconds\n     */\n    toSeconds: function() {\n      return this.factor * (60 * this.minutes + 3600 * this.hours);\n    },\n\n    /**\n     * Compare this utc offset with another one.\n     *\n     * @param {ICAL.UtcOffset} other        The other offset to compare with\n     * @return {Number}                     -1, 0 or 1 for less/equal/greater\n     */\n    compare: function icaltime_compare(other) {\n      var a = this.toSeconds();\n      var b = other.toSeconds();\n      return (a > b) - (b > a);\n    },\n\n    _normalize: function() {\n      // Range: 97200 seconds (with 1 hour inbetween)\n      var secs = this.toSeconds();\n      var factor = this.factor;\n      while (secs < -43200) { // = UTC-12:00\n        secs += 97200;\n      }\n      while (secs > 50400) { // = UTC+14:00\n        secs -= 97200;\n      }\n\n      this.fromSeconds(secs);\n\n      // Avoid changing the factor when on zero seconds\n      if (secs == 0) {\n        this.factor = factor;\n      }\n    },\n\n    /**\n     * The iCalendar string representation of this utc-offset.\n     * @return {String}\n     */\n    toICALString: function() {\n      return ICAL.design.icalendar.value['utc-offset'].toICAL(this.toString());\n    },\n\n    /**\n     * The string representation of this utc-offset.\n     * @return {String}\n     */\n    toString: function toString() {\n      return (this.factor == 1 ? \"+\" : \"-\") +\n              ICAL.helpers.pad2(this.hours) + ':' +\n              ICAL.helpers.pad2(this.minutes);\n    }\n  };\n\n  /**\n   * Creates a new {@link ICAL.UtcOffset} instance from the passed string.\n   *\n   * @param {String} aString    The string to parse\n   * @return {ICAL.Duration}    The created utc-offset instance\n   */\n  UtcOffset.fromString = function(aString) {\n    // -05:00\n    var options = {};\n    //TODO: support seconds per rfc5545 ?\n    options.factor = (aString[0] === '+') ? 1 : -1;\n    options.hours = ICAL.helpers.strictParseInt(aString.substr(1, 2));\n    options.minutes = ICAL.helpers.strictParseInt(aString.substr(4, 2));\n\n    return new ICAL.UtcOffset(options);\n  };\n\n  /**\n   * Creates a new {@link ICAL.UtcOffset} instance from the passed seconds\n   * value.\n   *\n   * @param {Number} aSeconds       The number of seconds to convert\n   */\n  UtcOffset.fromSeconds = function(aSeconds) {\n    var instance = new UtcOffset();\n    instance.fromSeconds(aSeconds);\n    return instance;\n  };\n\n  return UtcOffset;\n}());\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n/**\n * This symbol is further described later on\n * @ignore\n */\nICAL.Binary = (function() {\n\n  /**\n   * @classdesc\n   * Represents the BINARY value type, which contains extra methods for\n   * encoding and decoding.\n   *\n   * @class\n   * @alias ICAL.Binary\n   * @param {String} aValue     The binary data for this value\n   */\n  function Binary(aValue) {\n    this.value = aValue;\n  }\n\n  Binary.prototype = {\n    /**\n     * The type name, to be used in the jCal object.\n     * @default \"binary\"\n     * @constant\n     */\n    icaltype: \"binary\",\n\n    /**\n     * Base64 decode the current value\n     *\n     * @return {String}         The base64-decoded value\n     */\n    decodeValue: function decodeValue() {\n      return this._b64_decode(this.value);\n    },\n\n    /**\n     * Encodes the passed parameter with base64 and sets the internal\n     * value to the result.\n     *\n     * @param {String} aValue      The raw binary value to encode\n     */\n    setEncodedValue: function setEncodedValue(aValue) {\n      this.value = this._b64_encode(aValue);\n    },\n\n    _b64_encode: function base64_encode(data) {\n      // http://kevin.vanzonneveld.net\n      // +   original by: Tyler Akins (http://rumkin.com)\n      // +   improved by: Bayron Guevara\n      // +   improved by: Thunder.m\n      // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n      // +   bugfixed by: Pellentesque Malesuada\n      // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n      // +   improved by: RafaÅ‚ Kukawski (http://kukawski.pl)\n      // *     example 1: base64_encode('Kevin van Zonneveld');\n      // *     returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='\n      // mozilla has this native\n      // - but breaks in 2.0.0.12!\n      //if (typeof this.window['atob'] == 'function') {\n      //    return atob(data);\n      //}\n      var b64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" +\n                \"abcdefghijklmnopqrstuvwxyz0123456789+/=\";\n      var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,\n        ac = 0,\n        enc = \"\",\n        tmp_arr = [];\n\n      if (!data) {\n        return data;\n      }\n\n      do { // pack three octets into four hexets\n        o1 = data.charCodeAt(i++);\n        o2 = data.charCodeAt(i++);\n        o3 = data.charCodeAt(i++);\n\n        bits = o1 << 16 | o2 << 8 | o3;\n\n        h1 = bits >> 18 & 0x3f;\n        h2 = bits >> 12 & 0x3f;\n        h3 = bits >> 6 & 0x3f;\n        h4 = bits & 0x3f;\n\n        // use hexets to index into b64, and append result to encoded string\n        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);\n      } while (i < data.length);\n\n      enc = tmp_arr.join('');\n\n      var r = data.length % 3;\n\n      return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);\n\n    },\n\n    _b64_decode: function base64_decode(data) {\n      // http://kevin.vanzonneveld.net\n      // +   original by: Tyler Akins (http://rumkin.com)\n      // +   improved by: Thunder.m\n      // +      input by: Aman Gupta\n      // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n      // +   bugfixed by: Onno Marsman\n      // +   bugfixed by: Pellentesque Malesuada\n      // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n      // +      input by: Brett Zamir (http://brett-zamir.me)\n      // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n      // *     example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');\n      // *     returns 1: 'Kevin van Zonneveld'\n      // mozilla has this native\n      // - but breaks in 2.0.0.12!\n      //if (typeof this.window['btoa'] == 'function') {\n      //    return btoa(data);\n      //}\n      var b64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" +\n                \"abcdefghijklmnopqrstuvwxyz0123456789+/=\";\n      var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,\n        ac = 0,\n        dec = \"\",\n        tmp_arr = [];\n\n      if (!data) {\n        return data;\n      }\n\n      data += '';\n\n      do { // unpack four hexets into three octets using index points in b64\n        h1 = b64.indexOf(data.charAt(i++));\n        h2 = b64.indexOf(data.charAt(i++));\n        h3 = b64.indexOf(data.charAt(i++));\n        h4 = b64.indexOf(data.charAt(i++));\n\n        bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;\n\n        o1 = bits >> 16 & 0xff;\n        o2 = bits >> 8 & 0xff;\n        o3 = bits & 0xff;\n\n        if (h3 == 64) {\n          tmp_arr[ac++] = String.fromCharCode(o1);\n        } else if (h4 == 64) {\n          tmp_arr[ac++] = String.fromCharCode(o1, o2);\n        } else {\n          tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);\n        }\n      } while (i < data.length);\n\n      dec = tmp_arr.join('');\n\n      return dec;\n    },\n\n    /**\n     * The string representation of this value\n     * @return {String}\n     */\n    toString: function() {\n      return this.value;\n    }\n  };\n\n  /**\n   * Creates a binary value from the given string.\n   *\n   * @param {String} aString        The binary value string\n   * @return {ICAL.Binary}          The binary value instance\n   */\n  Binary.fromString = function(aString) {\n    return new Binary(aString);\n  };\n\n  return Binary;\n}());\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n\n(function() {\n  /**\n   * @classdesc\n   * This class represents the \"period\" value type, with various calculation\n   * and manipulation methods.\n   *\n   * @description\n   * The passed data object cannot contain both and end date and a duration.\n   *\n   * @class\n   * @param {Object} aData                  An object with members of the period\n   * @param {ICAL.Time=} aData.start        The start of the period\n   * @param {ICAL.Time=} aData.end          The end of the period\n   * @param {ICAL.Duration=} aData.duration The duration of the period\n   */\n  ICAL.Period = function icalperiod(aData) {\n    this.wrappedJSObject = this;\n\n    if (aData && 'start' in aData) {\n      if (aData.start && !(aData.start instanceof ICAL.Time)) {\n        throw new TypeError('.start must be an instance of ICAL.Time');\n      }\n      this.start = aData.start;\n    }\n\n    if (aData && aData.end && aData.duration) {\n      throw new Error('cannot accept both end and duration');\n    }\n\n    if (aData && 'end' in aData) {\n      if (aData.end && !(aData.end instanceof ICAL.Time)) {\n        throw new TypeError('.end must be an instance of ICAL.Time');\n      }\n      this.end = aData.end;\n    }\n\n    if (aData && 'duration' in aData) {\n      if (aData.duration && !(aData.duration instanceof ICAL.Duration)) {\n        throw new TypeError('.duration must be an instance of ICAL.Duration');\n      }\n      this.duration = aData.duration;\n    }\n  };\n\n  ICAL.Period.prototype = {\n\n    /**\n     * The start of the period\n     * @type {ICAL.Time}\n     */\n    start: null,\n\n    /**\n     * The end of the period\n     * @type {ICAL.Time}\n     */\n    end: null,\n\n    /**\n     * The duration of the period\n     * @type {ICAL.Duration}\n     */\n    duration: null,\n\n    /**\n     * The class identifier.\n     * @constant\n     * @type {String}\n     * @default \"icalperiod\"\n     */\n    icalclass: \"icalperiod\",\n\n    /**\n     * The type name, to be used in the jCal object.\n     * @constant\n     * @type {String}\n     * @default \"period\"\n     */\n    icaltype: \"period\",\n\n    /**\n     * Returns a clone of the duration object.\n     *\n     * @return {ICAL.Period}      The cloned object\n     */\n    clone: function() {\n      return ICAL.Period.fromData({\n        start: this.start ? this.start.clone() : null,\n        end: this.end ? this.end.clone() : null,\n        duration: this.duration ? this.duration.clone() : null\n      });\n    },\n\n    /**\n     * Calculates the duration of the period, either directly or by subtracting\n     * start from end date.\n     *\n     * @return {ICAL.Duration}      The calculated duration\n     */\n    getDuration: function duration() {\n      if (this.duration) {\n        return this.duration;\n      } else {\n        return this.end.subtractDate(this.start);\n      }\n    },\n\n    /**\n     * Calculates the end date of the period, either directly or by adding\n     * duration to start date.\n     *\n     * @return {ICAL.Time}          The calculated end date\n     */\n    getEnd: function() {\n      if (this.end) {\n        return this.end;\n      } else {\n        var end = this.start.clone();\n        end.addDuration(this.duration);\n        return end;\n      }\n    },\n\n    /**\n     * The string representation of this period.\n     * @return {String}\n     */\n    toString: function toString() {\n      return this.start + \"/\" + (this.end || this.duration);\n    },\n\n    /**\n     * The jCal representation of this period type.\n     * @return {Object}\n     */\n    toJSON: function() {\n      return [this.start.toString(), (this.end || this.duration).toString()];\n    },\n\n    /**\n     * The iCalendar string representation of this period.\n     * @return {String}\n     */\n    toICALString: function() {\n      return this.start.toICALString() + \"/\" +\n             (this.end || this.duration).toICALString();\n    }\n  };\n\n  /**\n   * Creates a new {@link ICAL.Period} instance from the passed string.\n   *\n   * @param {String} str            The string to parse\n   * @param {ICAL.Property} prop    The property this period will be on\n   * @return {ICAL.Period}          The created period instance\n   */\n  ICAL.Period.fromString = function fromString(str, prop) {\n    var parts = str.split('/');\n\n    if (parts.length !== 2) {\n      throw new Error(\n        'Invalid string value: \"' + str + '\" must contain a \"/\" char.'\n      );\n    }\n\n    var options = {\n      start: ICAL.Time.fromDateTimeString(parts[0], prop)\n    };\n\n    var end = parts[1];\n\n    if (ICAL.Duration.isValueString(end)) {\n      options.duration = ICAL.Duration.fromString(end);\n    } else {\n      options.end = ICAL.Time.fromDateTimeString(end, prop);\n    }\n\n    return new ICAL.Period(options);\n  };\n\n  /**\n   * Creates a new {@link ICAL.Period} instance from the given data object.\n   * The passed data object cannot contain both and end date and a duration.\n   *\n   * @param {Object} aData                  An object with members of the period\n   * @param {ICAL.Time=} aData.start        The start of the period\n   * @param {ICAL.Time=} aData.end          The end of the period\n   * @param {ICAL.Duration=} aData.duration The duration of the period\n   * @return {ICAL.Period}                  The period instance\n   */\n  ICAL.Period.fromData = function fromData(aData) {\n    return new ICAL.Period(aData);\n  };\n\n  /**\n   * Returns a new period instance from the given jCal data array. The first\n   * member is always the start date string, the second member is either a\n   * duration or end date string.\n   *\n   * @param {Array<String,String>} aData    The jCal data array\n   * @param {ICAL.Property} aProp           The property this jCal data is on\n   * @param {Boolean} aLenient              If true, data value can be both date and date-time\n   * @return {ICAL.Period}                  The period instance\n   */\n  ICAL.Period.fromJSON = function(aData, aProp, aLenient) {\n    function fromDateOrDateTimeString(aValue, aProp) {\n      if (aLenient) {\n        return ICAL.Time.fromString(aValue, aProp);\n      } else {\n        return ICAL.Time.fromDateTimeString(aValue, aProp);\n      }\n    }\n\n    if (ICAL.Duration.isValueString(aData[1])) {\n      return ICAL.Period.fromData({\n        start: fromDateOrDateTimeString(aData[0], aProp),\n        duration: ICAL.Duration.fromString(aData[1])\n      });\n    } else {\n      return ICAL.Period.fromData({\n        start: fromDateOrDateTimeString(aData[0], aProp),\n        end: fromDateOrDateTimeString(aData[1], aProp)\n      });\n    }\n  };\n})();\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n\n(function() {\n  var DURATION_LETTERS = /([PDWHMTS]{1,1})/;\n\n  /**\n   * @classdesc\n   * This class represents the \"duration\" value type, with various calculation\n   * and manipulation methods.\n   *\n   * @class\n   * @alias ICAL.Duration\n   * @param {Object} data               An object with members of the duration\n   * @param {Number} data.weeks         Duration in weeks\n   * @param {Number} data.days          Duration in days\n   * @param {Number} data.hours         Duration in hours\n   * @param {Number} data.minutes       Duration in minutes\n   * @param {Number} data.seconds       Duration in seconds\n   * @param {Boolean} data.isNegative   If true, the duration is negative\n   */\n  ICAL.Duration = function icalduration(data) {\n    this.wrappedJSObject = this;\n    this.fromData(data);\n  };\n\n  ICAL.Duration.prototype = {\n    /**\n     * The weeks in this duration\n     * @type {Number}\n     * @default 0\n     */\n    weeks: 0,\n\n    /**\n     * The days in this duration\n     * @type {Number}\n     * @default 0\n     */\n    days: 0,\n\n    /**\n     * The days in this duration\n     * @type {Number}\n     * @default 0\n     */\n    hours: 0,\n\n    /**\n     * The minutes in this duration\n     * @type {Number}\n     * @default 0\n     */\n    minutes: 0,\n\n    /**\n     * The seconds in this duration\n     * @type {Number}\n     * @default 0\n     */\n    seconds: 0,\n\n    /**\n     * The seconds in this duration\n     * @type {Boolean}\n     * @default false\n     */\n    isNegative: false,\n\n    /**\n     * The class identifier.\n     * @constant\n     * @type {String}\n     * @default \"icalduration\"\n     */\n    icalclass: \"icalduration\",\n\n    /**\n     * The type name, to be used in the jCal object.\n     * @constant\n     * @type {String}\n     * @default \"duration\"\n     */\n    icaltype: \"duration\",\n\n    /**\n     * Returns a clone of the duration object.\n     *\n     * @return {ICAL.Duration}      The cloned object\n     */\n    clone: function clone() {\n      return ICAL.Duration.fromData(this);\n    },\n\n    /**\n     * The duration value expressed as a number of seconds.\n     *\n     * @return {Number}             The duration value in seconds\n     */\n    toSeconds: function toSeconds() {\n      var seconds = this.seconds + 60 * this.minutes + 3600 * this.hours +\n                    86400 * this.days + 7 * 86400 * this.weeks;\n      return (this.isNegative ? -seconds : seconds);\n    },\n\n    /**\n     * Reads the passed seconds value into this duration object. Afterwards,\n     * members like {@link ICAL.Duration#days days} and {@link ICAL.Duration#weeks weeks} will be set up\n     * accordingly.\n     *\n     * @param {Number} aSeconds     The duration value in seconds\n     * @return {ICAL.Duration}      Returns this instance\n     */\n    fromSeconds: function fromSeconds(aSeconds) {\n      var secs = Math.abs(aSeconds);\n\n      this.isNegative = (aSeconds < 0);\n      this.days = ICAL.helpers.trunc(secs / 86400);\n\n      // If we have a flat number of weeks, use them.\n      if (this.days % 7 == 0) {\n        this.weeks = this.days / 7;\n        this.days = 0;\n      } else {\n        this.weeks = 0;\n      }\n\n      secs -= (this.days + 7 * this.weeks) * 86400;\n\n      this.hours = ICAL.helpers.trunc(secs / 3600);\n      secs -= this.hours * 3600;\n\n      this.minutes = ICAL.helpers.trunc(secs / 60);\n      secs -= this.minutes * 60;\n\n      this.seconds = secs;\n      return this;\n    },\n\n    /**\n     * Sets up the current instance using members from the passed data object.\n     *\n     * @param {Object} aData               An object with members of the duration\n     * @param {Number} aData.weeks         Duration in weeks\n     * @param {Number} aData.days          Duration in days\n     * @param {Number} aData.hours         Duration in hours\n     * @param {Number} aData.minutes       Duration in minutes\n     * @param {Number} aData.seconds       Duration in seconds\n     * @param {Boolean} aData.isNegative   If true, the duration is negative\n     */\n    fromData: function fromData(aData) {\n      var propsToCopy = [\"weeks\", \"days\", \"hours\",\n                         \"minutes\", \"seconds\", \"isNegative\"];\n      for (var key in propsToCopy) {\n        /* istanbul ignore if */\n        if (!propsToCopy.hasOwnProperty(key)) {\n          continue;\n        }\n        var prop = propsToCopy[key];\n        if (aData && prop in aData) {\n          this[prop] = aData[prop];\n        } else {\n          this[prop] = 0;\n        }\n      }\n    },\n\n    /**\n     * Resets the duration instance to the default values, i.e. PT0S\n     */\n    reset: function reset() {\n      this.isNegative = false;\n      this.weeks = 0;\n      this.days = 0;\n      this.hours = 0;\n      this.minutes = 0;\n      this.seconds = 0;\n    },\n\n    /**\n     * Compares the duration instance with another one.\n     *\n     * @param {ICAL.Duration} aOther        The instance to compare with\n     * @return {Number}                     -1, 0 or 1 for less/equal/greater\n     */\n    compare: function compare(aOther) {\n      var thisSeconds = this.toSeconds();\n      var otherSeconds = aOther.toSeconds();\n      return (thisSeconds > otherSeconds) - (thisSeconds < otherSeconds);\n    },\n\n    /**\n     * Normalizes the duration instance. For example, a duration with a value\n     * of 61 seconds will be normalized to 1 minute and 1 second.\n     */\n    normalize: function normalize() {\n      this.fromSeconds(this.toSeconds());\n    },\n\n    /**\n     * The string representation of this duration.\n     * @return {String}\n     */\n    toString: function toString() {\n      if (this.toSeconds() == 0) {\n        return \"PT0S\";\n      } else {\n        var str = \"\";\n        if (this.isNegative) str += \"-\";\n        str += \"P\";\n        if (this.weeks) str += this.weeks + \"W\";\n        if (this.days) str += this.days + \"D\";\n\n        if (this.hours || this.minutes || this.seconds) {\n          str += \"T\";\n          if (this.hours) str += this.hours + \"H\";\n          if (this.minutes) str += this.minutes + \"M\";\n          if (this.seconds) str += this.seconds + \"S\";\n        }\n        return str;\n      }\n    },\n\n    /**\n     * The iCalendar string representation of this duration.\n     * @return {String}\n     */\n    toICALString: function() {\n      return this.toString();\n    }\n  };\n\n  /**\n   * Returns a new ICAL.Duration instance from the passed seconds value.\n   *\n   * @param {Number} aSeconds       The seconds to create the instance from\n   * @return {ICAL.Duration}        The newly created duration instance\n   */\n  ICAL.Duration.fromSeconds = function icalduration_from_seconds(aSeconds) {\n    return (new ICAL.Duration()).fromSeconds(aSeconds);\n  };\n\n  /**\n   * Internal helper function to handle a chunk of a duration.\n   *\n   * @param {String} letter type of duration chunk\n   * @param {String} number numeric value or -/+\n   * @param {Object} dict target to assign values to\n   */\n  function parseDurationChunk(letter, number, object) {\n    var type;\n    switch (letter) {\n      case 'P':\n        if (number && number === '-') {\n          object.isNegative = true;\n        } else {\n          object.isNegative = false;\n        }\n        // period\n        break;\n      case 'D':\n        type = 'days';\n        break;\n      case 'W':\n        type = 'weeks';\n        break;\n      case 'H':\n        type = 'hours';\n        break;\n      case 'M':\n        type = 'minutes';\n        break;\n      case 'S':\n        type = 'seconds';\n        break;\n      default:\n        // Not a valid chunk\n        return 0;\n    }\n\n    if (type) {\n      if (!number && number !== 0) {\n        throw new Error(\n          'invalid duration value: Missing number before \"' + letter + '\"'\n        );\n      }\n      var num = parseInt(number, 10);\n      if (ICAL.helpers.isStrictlyNaN(num)) {\n        throw new Error(\n          'invalid duration value: Invalid number \"' + number + '\" before \"' + letter + '\"'\n        );\n      }\n      object[type] = num;\n    }\n\n    return 1;\n  }\n\n  /**\n   * Checks if the given string is an iCalendar duration value.\n   *\n   * @param {String} value      The raw ical value\n   * @return {Boolean}          True, if the given value is of the\n   *                              duration ical type\n   */\n  ICAL.Duration.isValueString = function(string) {\n    return (string[0] === 'P' || string[1] === 'P');\n  };\n\n  /**\n   * Creates a new {@link ICAL.Duration} instance from the passed string.\n   *\n   * @param {String} aStr       The string to parse\n   * @return {ICAL.Duration}    The created duration instance\n   */\n  ICAL.Duration.fromString = function icalduration_from_string(aStr) {\n    var pos = 0;\n    var dict = Object.create(null);\n    var chunks = 0;\n\n    while ((pos = aStr.search(DURATION_LETTERS)) !== -1) {\n      var type = aStr[pos];\n      var numeric = aStr.substr(0, pos);\n      aStr = aStr.substr(pos + 1);\n\n      chunks += parseDurationChunk(type, numeric, dict);\n    }\n\n    if (chunks < 2) {\n      // There must be at least a chunk with \"P\" and some unit chunk\n      throw new Error(\n        'invalid duration value: Not enough duration components in \"' + aStr + '\"'\n      );\n    }\n\n    return new ICAL.Duration(dict);\n  };\n\n  /**\n   * Creates a new ICAL.Duration instance from the given data object.\n   *\n   * @param {Object} aData               An object with members of the duration\n   * @param {Number} aData.weeks         Duration in weeks\n   * @param {Number} aData.days          Duration in days\n   * @param {Number} aData.hours         Duration in hours\n   * @param {Number} aData.minutes       Duration in minutes\n   * @param {Number} aData.seconds       Duration in seconds\n   * @param {Boolean} aData.isNegative   If true, the duration is negative\n   * @return {ICAL.Duration}             The createad duration instance\n   */\n  ICAL.Duration.fromData = function icalduration_from_data(aData) {\n    return new ICAL.Duration(aData);\n  };\n})();\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2012 */\n\n\n\n(function() {\n  var OPTIONS = [\"tzid\", \"location\", \"tznames\",\n                 \"latitude\", \"longitude\"];\n\n  /**\n   * @classdesc\n   * Timezone representation, created by passing in a tzid and component.\n   *\n   * @example\n   * var vcalendar;\n   * var timezoneComp = vcalendar.getFirstSubcomponent('vtimezone');\n   * var tzid = timezoneComp.getFirstPropertyValue('tzid');\n   *\n   * var timezone = new ICAL.Timezone({\n   *   component: timezoneComp,\n   *   tzid\n   * });\n   *\n   * @class\n   * @param {ICAL.Component|Object} data options for class\n   * @param {String|ICAL.Component} data.component\n   *        If data is a simple object, then this member can be set to either a\n   *        string containing the component data, or an already parsed\n   *        ICAL.Component\n   * @param {String} data.tzid      The timezone identifier\n   * @param {String} data.location  The timezone locationw\n   * @param {String} data.tznames   An alternative string representation of the\n   *                                  timezone\n   * @param {Number} data.latitude  The latitude of the timezone\n   * @param {Number} data.longitude The longitude of the timezone\n   */\n  ICAL.Timezone = function icaltimezone(data) {\n    this.wrappedJSObject = this;\n    this.fromData(data);\n  };\n\n  ICAL.Timezone.prototype = {\n\n    /**\n     * Timezone identifier\n     * @type {String}\n     */\n    tzid: \"\",\n\n    /**\n     * Timezone location\n     * @type {String}\n     */\n    location: \"\",\n\n    /**\n     * Alternative timezone name, for the string representation\n     * @type {String}\n     */\n    tznames: \"\",\n\n    /**\n     * The primary latitude for the timezone.\n     * @type {Number}\n     */\n    latitude: 0.0,\n\n    /**\n     * The primary longitude for the timezone.\n     * @type {Number}\n     */\n    longitude: 0.0,\n\n    /**\n     * The vtimezone component for this timezone.\n     * @type {ICAL.Component}\n     */\n    component: null,\n\n    /**\n     * The year this timezone has been expanded to. All timezone transition\n     * dates until this year are known and can be used for calculation\n     *\n     * @private\n     * @type {Number}\n     */\n    expandedUntilYear: 0,\n\n    /**\n     * The class identifier.\n     * @constant\n     * @type {String}\n     * @default \"icaltimezone\"\n     */\n    icalclass: \"icaltimezone\",\n\n    /**\n     * Sets up the current instance using members from the passed data object.\n     *\n     * @param {ICAL.Component|Object} aData options for class\n     * @param {String|ICAL.Component} aData.component\n     *        If aData is a simple object, then this member can be set to either a\n     *        string containing the component data, or an already parsed\n     *        ICAL.Component\n     * @param {String} aData.tzid      The timezone identifier\n     * @param {String} aData.location  The timezone locationw\n     * @param {String} aData.tznames   An alternative string representation of the\n     *                                  timezone\n     * @param {Number} aData.latitude  The latitude of the timezone\n     * @param {Number} aData.longitude The longitude of the timezone\n     */\n    fromData: function fromData(aData) {\n      this.expandedUntilYear = 0;\n      this.changes = [];\n\n      if (aData instanceof ICAL.Component) {\n        // Either a component is passed directly\n        this.component = aData;\n      } else {\n        // Otherwise the component may be in the data object\n        if (aData && \"component\" in aData) {\n          if (typeof aData.component == \"string\") {\n            // If a string was passed, parse it as a component\n            var jCal = ICAL.parse(aData.component);\n            this.component = new ICAL.Component(jCal);\n          } else if (aData.component instanceof ICAL.Component) {\n            // If it was a component already, then just set it\n            this.component = aData.component;\n          } else {\n            // Otherwise just null out the component\n            this.component = null;\n          }\n        }\n\n        // Copy remaining passed properties\n        for (var key in OPTIONS) {\n          /* istanbul ignore else */\n          if (OPTIONS.hasOwnProperty(key)) {\n            var prop = OPTIONS[key];\n            if (aData && prop in aData) {\n              this[prop] = aData[prop];\n            }\n          }\n        }\n      }\n\n      // If we have a component but no TZID, attempt to get it from the\n      // component's properties.\n      if (this.component instanceof ICAL.Component && !this.tzid) {\n        this.tzid = this.component.getFirstPropertyValue('tzid');\n      }\n\n      return this;\n    },\n\n    /**\n     * Finds the utcOffset the given time would occur in this timezone.\n     *\n     * @param {ICAL.Time} tt        The time to check for\n     * @return {Number} utc offset in seconds\n     */\n    utcOffset: function utcOffset(tt) {\n      if (this == ICAL.Timezone.utcTimezone || this == ICAL.Timezone.localTimezone) {\n        return 0;\n      }\n\n      this._ensureCoverage(tt.year);\n\n      if (!this.changes.length) {\n        return 0;\n      }\n\n      var tt_change = {\n        year: tt.year,\n        month: tt.month,\n        day: tt.day,\n        hour: tt.hour,\n        minute: tt.minute,\n        second: tt.second\n      };\n\n      var change_num = this._findNearbyChange(tt_change);\n      var change_num_to_use = -1;\n      var step = 1;\n\n      // TODO: replace with bin search?\n      for (;;) {\n        var change = ICAL.helpers.clone(this.changes[change_num], true);\n        if (change.utcOffset < change.prevUtcOffset) {\n          ICAL.Timezone.adjust_change(change, 0, 0, 0, change.utcOffset);\n        } else {\n          ICAL.Timezone.adjust_change(change, 0, 0, 0,\n                                          change.prevUtcOffset);\n        }\n\n        var cmp = ICAL.Timezone._compare_change_fn(tt_change, change);\n\n        if (cmp >= 0) {\n          change_num_to_use = change_num;\n        } else {\n          step = -1;\n        }\n\n        if (step == -1 && change_num_to_use != -1) {\n          break;\n        }\n\n        change_num += step;\n\n        if (change_num < 0) {\n          return 0;\n        }\n\n        if (change_num >= this.changes.length) {\n          break;\n        }\n      }\n\n      var zone_change = this.changes[change_num_to_use];\n      var utcOffset_change = zone_change.utcOffset - zone_change.prevUtcOffset;\n\n      if (utcOffset_change < 0 && change_num_to_use > 0) {\n        var tmp_change = ICAL.helpers.clone(zone_change, true);\n        ICAL.Timezone.adjust_change(tmp_change, 0, 0, 0,\n                                        tmp_change.prevUtcOffset);\n\n        if (ICAL.Timezone._compare_change_fn(tt_change, tmp_change) < 0) {\n          var prev_zone_change = this.changes[change_num_to_use - 1];\n\n          var want_daylight = false; // TODO\n\n          if (zone_change.is_daylight != want_daylight &&\n              prev_zone_change.is_daylight == want_daylight) {\n            zone_change = prev_zone_change;\n          }\n        }\n      }\n\n      // TODO return is_daylight?\n      return zone_change.utcOffset;\n    },\n\n    _findNearbyChange: function icaltimezone_find_nearby_change(change) {\n      // find the closest match\n      var idx = ICAL.helpers.binsearchInsert(\n        this.changes,\n        change,\n        ICAL.Timezone._compare_change_fn\n      );\n\n      if (idx >= this.changes.length) {\n        return this.changes.length - 1;\n      }\n\n      return idx;\n    },\n\n    _ensureCoverage: function(aYear) {\n      if (ICAL.Timezone._minimumExpansionYear == -1) {\n        var today = ICAL.Time.now();\n        ICAL.Timezone._minimumExpansionYear = today.year;\n      }\n\n      var changesEndYear = aYear;\n      if (changesEndYear < ICAL.Timezone._minimumExpansionYear) {\n        changesEndYear = ICAL.Timezone._minimumExpansionYear;\n      }\n\n      changesEndYear += ICAL.Timezone.EXTRA_COVERAGE;\n\n      if (changesEndYear > ICAL.Timezone.MAX_YEAR) {\n        changesEndYear = ICAL.Timezone.MAX_YEAR;\n      }\n\n      if (!this.changes.length || this.expandedUntilYear < aYear) {\n        var subcomps = this.component.getAllSubcomponents();\n        var compLen = subcomps.length;\n        var compIdx = 0;\n\n        for (; compIdx < compLen; compIdx++) {\n          this._expandComponent(\n            subcomps[compIdx], changesEndYear, this.changes\n          );\n        }\n\n        this.changes.sort(ICAL.Timezone._compare_change_fn);\n        this.expandedUntilYear = changesEndYear;\n      }\n    },\n\n    _expandComponent: function(aComponent, aYear, changes) {\n      if (!aComponent.hasProperty(\"dtstart\") ||\n          !aComponent.hasProperty(\"tzoffsetto\") ||\n          !aComponent.hasProperty(\"tzoffsetfrom\")) {\n        return null;\n      }\n\n      var dtstart = aComponent.getFirstProperty(\"dtstart\").getFirstValue();\n      var change;\n\n      function convert_tzoffset(offset) {\n        return offset.factor * (offset.hours * 3600 + offset.minutes * 60);\n      }\n\n      function init_changes() {\n        var changebase = {};\n        changebase.is_daylight = (aComponent.name == \"daylight\");\n        changebase.utcOffset = convert_tzoffset(\n          aComponent.getFirstProperty(\"tzoffsetto\").getFirstValue()\n        );\n\n        changebase.prevUtcOffset = convert_tzoffset(\n          aComponent.getFirstProperty(\"tzoffsetfrom\").getFirstValue()\n        );\n\n        return changebase;\n      }\n\n      if (!aComponent.hasProperty(\"rrule\") && !aComponent.hasProperty(\"rdate\")) {\n        change = init_changes();\n        change.year = dtstart.year;\n        change.month = dtstart.month;\n        change.day = dtstart.day;\n        change.hour = dtstart.hour;\n        change.minute = dtstart.minute;\n        change.second = dtstart.second;\n\n        ICAL.Timezone.adjust_change(change, 0, 0, 0,\n                                        -change.prevUtcOffset);\n        changes.push(change);\n      } else {\n        var props = aComponent.getAllProperties(\"rdate\");\n        for (var rdatekey in props) {\n          /* istanbul ignore if */\n          if (!props.hasOwnProperty(rdatekey)) {\n            continue;\n          }\n          var rdate = props[rdatekey];\n          var time = rdate.getFirstValue();\n          change = init_changes();\n\n          change.year = time.year;\n          change.month = time.month;\n          change.day = time.day;\n\n          if (time.isDate) {\n            change.hour = dtstart.hour;\n            change.minute = dtstart.minute;\n            change.second = dtstart.second;\n\n            if (dtstart.zone != ICAL.Timezone.utcTimezone) {\n              ICAL.Timezone.adjust_change(change, 0, 0, 0,\n                                              -change.prevUtcOffset);\n            }\n          } else {\n            change.hour = time.hour;\n            change.minute = time.minute;\n            change.second = time.second;\n\n            if (time.zone != ICAL.Timezone.utcTimezone) {\n              ICAL.Timezone.adjust_change(change, 0, 0, 0,\n                                              -change.prevUtcOffset);\n            }\n          }\n\n          changes.push(change);\n        }\n\n        var rrule = aComponent.getFirstProperty(\"rrule\");\n\n        if (rrule) {\n          rrule = rrule.getFirstValue();\n          change = init_changes();\n\n          if (rrule.until && rrule.until.zone == ICAL.Timezone.utcTimezone) {\n            rrule.until.adjust(0, 0, 0, change.prevUtcOffset);\n            rrule.until.zone = ICAL.Timezone.localTimezone;\n          }\n\n          var iterator = rrule.iterator(dtstart);\n\n          var occ;\n          while ((occ = iterator.next())) {\n            change = init_changes();\n            if (occ.year > aYear || !occ) {\n              break;\n            }\n\n            change.year = occ.year;\n            change.month = occ.month;\n            change.day = occ.day;\n            change.hour = occ.hour;\n            change.minute = occ.minute;\n            change.second = occ.second;\n            change.isDate = occ.isDate;\n\n            ICAL.Timezone.adjust_change(change, 0, 0, 0,\n                                            -change.prevUtcOffset);\n            changes.push(change);\n          }\n        }\n      }\n\n      return changes;\n    },\n\n    /**\n     * The string representation of this timezone.\n     * @return {String}\n     */\n    toString: function toString() {\n      return (this.tznames ? this.tznames : this.tzid);\n    }\n  };\n\n  ICAL.Timezone._compare_change_fn = function icaltimezone_compare_change_fn(a, b) {\n    if (a.year < b.year) return -1;\n    else if (a.year > b.year) return 1;\n\n    if (a.month < b.month) return -1;\n    else if (a.month > b.month) return 1;\n\n    if (a.day < b.day) return -1;\n    else if (a.day > b.day) return 1;\n\n    if (a.hour < b.hour) return -1;\n    else if (a.hour > b.hour) return 1;\n\n    if (a.minute < b.minute) return -1;\n    else if (a.minute > b.minute) return 1;\n\n    if (a.second < b.second) return -1;\n    else if (a.second > b.second) return 1;\n\n    return 0;\n  };\n\n  /**\n   * Convert the date/time from one zone to the next.\n   *\n   * @param {ICAL.Time} tt                  The time to convert\n   * @param {ICAL.Timezone} from_zone       The source zone to convert from\n   * @param {ICAL.Timezone} to_zone         The target zone to convert to\n   * @return {ICAL.Time}                    The converted date/time object\n   */\n  ICAL.Timezone.convert_time = function icaltimezone_convert_time(tt, from_zone, to_zone) {\n    if (tt.isDate ||\n        from_zone.tzid == to_zone.tzid ||\n        from_zone == ICAL.Timezone.localTimezone ||\n        to_zone == ICAL.Timezone.localTimezone) {\n      tt.zone = to_zone;\n      return tt;\n    }\n\n    var utcOffset = from_zone.utcOffset(tt);\n    tt.adjust(0, 0, 0, - utcOffset);\n\n    utcOffset = to_zone.utcOffset(tt);\n    tt.adjust(0, 0, 0, utcOffset);\n\n    return null;\n  };\n\n  /**\n   * Creates a new ICAL.Timezone instance from the passed data object.\n   *\n   * @param {ICAL.Component|Object} aData options for class\n   * @param {String|ICAL.Component} aData.component\n   *        If aData is a simple object, then this member can be set to either a\n   *        string containing the component data, or an already parsed\n   *        ICAL.Component\n   * @param {String} aData.tzid      The timezone identifier\n   * @param {String} aData.location  The timezone locationw\n   * @param {String} aData.tznames   An alternative string representation of the\n   *                                  timezone\n   * @param {Number} aData.latitude  The latitude of the timezone\n   * @param {Number} aData.longitude The longitude of the timezone\n   */\n  ICAL.Timezone.fromData = function icaltimezone_fromData(aData) {\n    var tt = new ICAL.Timezone();\n    return tt.fromData(aData);\n  };\n\n  /**\n   * The instance describing the UTC timezone\n   * @type {ICAL.Timezone}\n   * @constant\n   * @instance\n   */\n  ICAL.Timezone.utcTimezone = ICAL.Timezone.fromData({\n    tzid: \"UTC\"\n  });\n\n  /**\n   * The instance describing the local timezone\n   * @type {ICAL.Timezone}\n   * @constant\n   * @instance\n   */\n  ICAL.Timezone.localTimezone = ICAL.Timezone.fromData({\n    tzid: \"floating\"\n  });\n\n  /**\n   * Adjust a timezone change object.\n   * @private\n   * @param {Object} change     The timezone change object\n   * @param {Number} days       The extra amount of days\n   * @param {Number} hours      The extra amount of hours\n   * @param {Number} minutes    The extra amount of minutes\n   * @param {Number} seconds    The extra amount of seconds\n   */\n  ICAL.Timezone.adjust_change = function icaltimezone_adjust_change(change, days, hours, minutes, seconds) {\n    return ICAL.Time.prototype.adjust.call(\n      change,\n      days,\n      hours,\n      minutes,\n      seconds,\n      change\n    );\n  };\n\n  ICAL.Timezone._minimumExpansionYear = -1;\n  ICAL.Timezone.MAX_YEAR = 2035; // TODO this is because of time_t, which we don't need. Still usefull?\n  ICAL.Timezone.EXTRA_COVERAGE = 5;\n})();\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n/**\n * This symbol is further described later on\n * @ignore\n */\nICAL.TimezoneService = (function() {\n  var zones;\n\n  /**\n   * @classdesc\n   * Singleton class to contain timezones.  Right now its all manual registry in\n   * the future we may use this class to download timezone information or handle\n   * loading pre-expanded timezones.\n   *\n   * @namespace\n   * @alias ICAL.TimezoneService\n   */\n  var TimezoneService = {\n    get count() {\n      return Object.keys(zones).length;\n    },\n\n    reset: function() {\n      zones = Object.create(null);\n      var utc = ICAL.Timezone.utcTimezone;\n\n      zones.Z = utc;\n      zones.UTC = utc;\n      zones.GMT = utc;\n    },\n\n    /**\n     * Checks if timezone id has been registered.\n     *\n     * @param {String} tzid     Timezone identifier (e.g. America/Los_Angeles)\n     * @return {Boolean}        False, when not present\n     */\n    has: function(tzid) {\n      return !!zones[tzid];\n    },\n\n    /**\n     * Returns a timezone by its tzid if present.\n     *\n     * @param {String} tzid     Timezone identifier (e.g. America/Los_Angeles)\n     * @return {?ICAL.Timezone} The timezone, or null if not found\n     */\n    get: function(tzid) {\n      return zones[tzid];\n    },\n\n    /**\n     * Registers a timezone object or component.\n     *\n     * @param {String=} name\n     *        The name of the timezone. Defaults to the component's TZID if not\n     *        passed.\n     * @param {ICAL.Component|ICAL.Timezone} zone\n     *        The initialized zone or vtimezone.\n     */\n    register: function(name, timezone) {\n      if (name instanceof ICAL.Component) {\n        if (name.name === 'vtimezone') {\n          timezone = new ICAL.Timezone(name);\n          name = timezone.tzid;\n        }\n      }\n\n      if (timezone instanceof ICAL.Timezone) {\n        zones[name] = timezone;\n      } else {\n        throw new TypeError('timezone must be ICAL.Timezone or ICAL.Component');\n      }\n    },\n\n    /**\n     * Removes a timezone by its tzid from the list.\n     *\n     * @param {String} tzid     Timezone identifier (e.g. America/Los_Angeles)\n     * @return {?ICAL.Timezone} The removed timezone, or null if not registered\n     */\n    remove: function(tzid) {\n      return (delete zones[tzid]);\n    }\n  };\n\n  // initialize defaults\n  TimezoneService.reset();\n\n  return TimezoneService;\n}());\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n\n(function() {\n\n  /**\n   * @classdesc\n   * iCalendar Time representation (similar to JS Date object).  Fully\n   * independent of system (OS) timezone / time.  Unlike JS Date, the month\n   * January is 1, not zero.\n   *\n   * @example\n   * var time = new ICAL.Time({\n   *   year: 2012,\n   *   month: 10,\n   *   day: 11\n   *   minute: 0,\n   *   second: 0,\n   *   isDate: false\n   * });\n   *\n   *\n   * @alias ICAL.Time\n   * @class\n   * @param {Object} data           Time initialization\n   * @param {Number=} data.year     The year for this date\n   * @param {Number=} data.month    The month for this date\n   * @param {Number=} data.day      The day for this date\n   * @param {Number=} data.hour     The hour for this date\n   * @param {Number=} data.minute   The minute for this date\n   * @param {Number=} data.second   The second for this date\n   * @param {Boolean=} data.isDate  If true, the instance represents a date (as\n   *                                  opposed to a date-time)\n   * @param {ICAL.Timezone} zone timezone this position occurs in\n   */\n  ICAL.Time = function icaltime(data, zone) {\n    this.wrappedJSObject = this;\n    var time = this._time = Object.create(null);\n\n    /* time defaults */\n    time.year = 0;\n    time.month = 1;\n    time.day = 1;\n    time.hour = 0;\n    time.minute = 0;\n    time.second = 0;\n    time.isDate = false;\n\n    this.fromData(data, zone);\n  };\n\n  ICAL.Time._dowCache = {};\n  ICAL.Time._wnCache = {};\n\n  ICAL.Time.prototype = {\n\n    /**\n     * The class identifier.\n     * @constant\n     * @type {String}\n     * @default \"icaltime\"\n     */\n    icalclass: \"icaltime\",\n    _cachedUnixTime: null,\n\n    /**\n     * The type name, to be used in the jCal object. This value may change and\n     * is strictly defined by the {@link ICAL.Time#isDate isDate} member.\n     * @readonly\n     * @type {String}\n     * @default \"date-time\"\n     */\n    get icaltype() {\n      return this.isDate ? 'date' : 'date-time';\n    },\n\n    /**\n     * The timezone for this time.\n     * @type {ICAL.Timezone}\n     */\n    zone: null,\n\n    /**\n     * Internal uses to indicate that a change has been made and the next read\n     * operation must attempt to normalize the value (for example changing the\n     * day to 33).\n     *\n     * @type {Boolean}\n     * @private\n     */\n    _pendingNormalization: false,\n\n    /**\n     * Returns a clone of the time object.\n     *\n     * @return {ICAL.Time}              The cloned object\n     */\n    clone: function() {\n      return new ICAL.Time(this._time, this.zone);\n    },\n\n    /**\n     * Reset the time instance to epoch time\n     */\n    reset: function icaltime_reset() {\n      this.fromData(ICAL.Time.epochTime);\n      this.zone = ICAL.Timezone.utcTimezone;\n    },\n\n    /**\n     * Reset the time instance to the given date/time values.\n     *\n     * @param {Number} year             The year to set\n     * @param {Number} month            The month to set\n     * @param {Number} day              The day to set\n     * @param {Number} hour             The hour to set\n     * @param {Number} minute           The minute to set\n     * @param {Number} second           The second to set\n     * @param {ICAL.Timezone} timezone  The timezone to set\n     */\n    resetTo: function icaltime_resetTo(year, month, day,\n                                       hour, minute, second, timezone) {\n      this.fromData({\n        year: year,\n        month: month,\n        day: day,\n        hour: hour,\n        minute: minute,\n        second: second,\n        zone: timezone\n      });\n    },\n\n    /**\n     * Set up the current instance from the Javascript date value.\n     *\n     * @param {?Date} aDate     The Javascript Date to read, or null to reset\n     * @param {Boolean} useUTC  If true, the UTC values of the date will be used\n     */\n    fromJSDate: function icaltime_fromJSDate(aDate, useUTC) {\n      if (!aDate) {\n        this.reset();\n      } else {\n        if (useUTC) {\n          this.zone = ICAL.Timezone.utcTimezone;\n          this.year = aDate.getUTCFullYear();\n          this.month = aDate.getUTCMonth() + 1;\n          this.day = aDate.getUTCDate();\n          this.hour = aDate.getUTCHours();\n          this.minute = aDate.getUTCMinutes();\n          this.second = aDate.getUTCSeconds();\n        } else {\n          this.zone = ICAL.Timezone.localTimezone;\n          this.year = aDate.getFullYear();\n          this.month = aDate.getMonth() + 1;\n          this.day = aDate.getDate();\n          this.hour = aDate.getHours();\n          this.minute = aDate.getMinutes();\n          this.second = aDate.getSeconds();\n        }\n      }\n      this._cachedUnixTime = null;\n      return this;\n    },\n\n    /**\n     * Sets up the current instance using members from the passed data object.\n     *\n     * @param {Object} aData            Time initialization\n     * @param {Number=} aData.year      The year for this date\n     * @param {Number=} aData.month     The month for this date\n     * @param {Number=} aData.day       The day for this date\n     * @param {Number=} aData.hour      The hour for this date\n     * @param {Number=} aData.minute    The minute for this date\n     * @param {Number=} aData.second    The second for this date\n     * @param {Boolean=} aData.isDate   If true, the instance represents a date\n     *                                    (as opposed to a date-time)\n     * @param {ICAL.Timezone=} aZone    Timezone this position occurs in\n     */\n    fromData: function fromData(aData, aZone) {\n      if (aData) {\n        for (var key in aData) {\n          /* istanbul ignore else */\n          if (Object.prototype.hasOwnProperty.call(aData, key)) {\n            // ical type cannot be set\n            if (key === 'icaltype') continue;\n            this[key] = aData[key];\n          }\n        }\n      }\n\n      if (aZone) {\n        this.zone = aZone;\n      }\n\n      if (aData && !(\"isDate\" in aData)) {\n        this.isDate = !(\"hour\" in aData);\n      } else if (aData && (\"isDate\" in aData)) {\n        this.isDate = aData.isDate;\n      }\n\n      if (aData && \"timezone\" in aData) {\n        var zone = ICAL.TimezoneService.get(\n          aData.timezone\n        );\n\n        this.zone = zone || ICAL.Timezone.localTimezone;\n      }\n\n      if (aData && \"zone\" in aData) {\n        this.zone = aData.zone;\n      }\n\n      if (!this.zone) {\n        this.zone = ICAL.Timezone.localTimezone;\n      }\n\n      this._cachedUnixTime = null;\n      return this;\n    },\n\n    /**\n     * Calculate the day of week.\n     * @param {ICAL.Time.weekDay=} aWeekStart\n     *        The week start weekday, defaults to SUNDAY\n     * @return {ICAL.Time.weekDay}\n     */\n    dayOfWeek: function icaltime_dayOfWeek(aWeekStart) {\n      var firstDow = aWeekStart || ICAL.Time.SUNDAY;\n      var dowCacheKey = (this.year << 12) + (this.month << 8) + (this.day << 3) + firstDow;\n      if (dowCacheKey in ICAL.Time._dowCache) {\n        return ICAL.Time._dowCache[dowCacheKey];\n      }\n\n      // Using Zeller's algorithm\n      var q = this.day;\n      var m = this.month + (this.month < 3 ? 12 : 0);\n      var Y = this.year - (this.month < 3 ? 1 : 0);\n\n      var h = (q + Y + ICAL.helpers.trunc(((m + 1) * 26) / 10) + ICAL.helpers.trunc(Y / 4));\n      /* istanbul ignore else */\n      if (true /* gregorian */) {\n        h += ICAL.helpers.trunc(Y / 100) * 6 + ICAL.helpers.trunc(Y / 400);\n      } else {\n        h += 5;\n      }\n\n      // Normalize to 1 = wkst\n      h = ((h + 7 - firstDow) % 7) + 1;\n      ICAL.Time._dowCache[dowCacheKey] = h;\n      return h;\n    },\n\n    /**\n     * Calculate the day of year.\n     * @return {Number}\n     */\n    dayOfYear: function dayOfYear() {\n      var is_leap = (ICAL.Time.isLeapYear(this.year) ? 1 : 0);\n      var diypm = ICAL.Time.daysInYearPassedMonth;\n      return diypm[is_leap][this.month - 1] + this.day;\n    },\n\n    /**\n     * Returns a copy of the current date/time, rewound to the start of the\n     * week. The resulting ICAL.Time instance is of icaltype date, even if this\n     * is a date-time.\n     *\n     * @param {ICAL.Time.weekDay=} aWeekStart\n     *        The week start weekday, defaults to SUNDAY\n     * @return {ICAL.Time}      The start of the week (cloned)\n     */\n    startOfWeek: function startOfWeek(aWeekStart) {\n      var firstDow = aWeekStart || ICAL.Time.SUNDAY;\n      var result = this.clone();\n      result.day -= ((this.dayOfWeek() + 7 - firstDow) % 7);\n      result.isDate = true;\n      result.hour = 0;\n      result.minute = 0;\n      result.second = 0;\n      return result;\n    },\n\n    /**\n     * Returns a copy of the current date/time, shifted to the end of the week.\n     * The resulting ICAL.Time instance is of icaltype date, even if this is a\n     * date-time.\n     *\n     * @param {ICAL.Time.weekDay=} aWeekStart\n     *        The week start weekday, defaults to SUNDAY\n     * @return {ICAL.Time}      The end of the week (cloned)\n     */\n    endOfWeek: function endOfWeek(aWeekStart) {\n      var firstDow = aWeekStart || ICAL.Time.SUNDAY;\n      var result = this.clone();\n      result.day += (7 - this.dayOfWeek() + firstDow - ICAL.Time.SUNDAY) % 7;\n      result.isDate = true;\n      result.hour = 0;\n      result.minute = 0;\n      result.second = 0;\n      return result;\n    },\n\n    /**\n     * Returns a copy of the current date/time, rewound to the start of the\n     * month. The resulting ICAL.Time instance is of icaltype date, even if\n     * this is a date-time.\n     *\n     * @return {ICAL.Time}      The start of the month (cloned)\n     */\n    startOfMonth: function startOfMonth() {\n      var result = this.clone();\n      result.day = 1;\n      result.isDate = true;\n      result.hour = 0;\n      result.minute = 0;\n      result.second = 0;\n      return result;\n    },\n\n    /**\n     * Returns a copy of the current date/time, shifted to the end of the\n     * month.  The resulting ICAL.Time instance is of icaltype date, even if\n     * this is a date-time.\n     *\n     * @return {ICAL.Time}      The end of the month (cloned)\n     */\n    endOfMonth: function endOfMonth() {\n      var result = this.clone();\n      result.day = ICAL.Time.daysInMonth(result.month, result.year);\n      result.isDate = true;\n      result.hour = 0;\n      result.minute = 0;\n      result.second = 0;\n      return result;\n    },\n\n    /**\n     * Returns a copy of the current date/time, rewound to the start of the\n     * year. The resulting ICAL.Time instance is of icaltype date, even if\n     * this is a date-time.\n     *\n     * @return {ICAL.Time}      The start of the year (cloned)\n     */\n    startOfYear: function startOfYear() {\n      var result = this.clone();\n      result.day = 1;\n      result.month = 1;\n      result.isDate = true;\n      result.hour = 0;\n      result.minute = 0;\n      result.second = 0;\n      return result;\n    },\n\n    /**\n     * Returns a copy of the current date/time, shifted to the end of the\n     * year.  The resulting ICAL.Time instance is of icaltype date, even if\n     * this is a date-time.\n     *\n     * @return {ICAL.Time}      The end of the year (cloned)\n     */\n    endOfYear: function endOfYear() {\n      var result = this.clone();\n      result.day = 31;\n      result.month = 12;\n      result.isDate = true;\n      result.hour = 0;\n      result.minute = 0;\n      result.second = 0;\n      return result;\n    },\n\n    /**\n     * First calculates the start of the week, then returns the day of year for\n     * this date. If the day falls into the previous year, the day is zero or negative.\n     *\n     * @param {ICAL.Time.weekDay=} aFirstDayOfWeek\n     *        The week start weekday, defaults to SUNDAY\n     * @return {Number}     The calculated day of year\n     */\n    startDoyWeek: function startDoyWeek(aFirstDayOfWeek) {\n      var firstDow = aFirstDayOfWeek || ICAL.Time.SUNDAY;\n      var delta = this.dayOfWeek() - firstDow;\n      if (delta < 0) delta += 7;\n      return this.dayOfYear() - delta;\n    },\n\n    /**\n     * Get the dominical letter for the current year. Letters range from A - G\n     * for common years, and AG to GF for leap years.\n     *\n     * @param {Number} yr           The year to retrieve the letter for\n     * @return {String}             The dominical letter.\n     */\n    getDominicalLetter: function() {\n      return ICAL.Time.getDominicalLetter(this.year);\n    },\n\n    /**\n     * Finds the nthWeekDay relative to the current month (not day).  The\n     * returned value is a day relative the month that this month belongs to so\n     * 1 would indicate the first of the month and 40 would indicate a day in\n     * the following month.\n     *\n     * @param {Number} aDayOfWeek   Day of the week see the day name constants\n     * @param {Number} aPos         Nth occurrence of a given week day values\n     *        of 1 and 0 both indicate the first weekday of that type. aPos may\n     *        be either positive or negative\n     *\n     * @return {Number} numeric value indicating a day relative\n     *                   to the current month of this time object\n     */\n    nthWeekDay: function icaltime_nthWeekDay(aDayOfWeek, aPos) {\n      var daysInMonth = ICAL.Time.daysInMonth(this.month, this.year);\n      var weekday;\n      var pos = aPos;\n\n      var start = 0;\n\n      var otherDay = this.clone();\n\n      if (pos >= 0) {\n        otherDay.day = 1;\n\n        // because 0 means no position has been given\n        // 1 and 0 indicate the same day.\n        if (pos != 0) {\n          // remove the extra numeric value\n          pos--;\n        }\n\n        // set current start offset to current day.\n        start = otherDay.day;\n\n        // find the current day of week\n        var startDow = otherDay.dayOfWeek();\n\n        // calculate the difference between current\n        // day of the week and desired day of the week\n        var offset = aDayOfWeek - startDow;\n\n\n        // if the offset goes into the past\n        // week we add 7 so its goes into the next\n        // week. We only want to go forward in time here.\n        if (offset < 0)\n          // this is really important otherwise we would\n          // end up with dates from in the past.\n          offset += 7;\n\n        // add offset to start so start is the same\n        // day of the week as the desired day of week.\n        start += offset;\n\n        // because we are going to add (and multiply)\n        // the numeric value of the day we subtract it\n        // from the start position so not to add it twice.\n        start -= aDayOfWeek;\n\n        // set week day\n        weekday = aDayOfWeek;\n      } else {\n\n        // then we set it to the last day in the current month\n        otherDay.day = daysInMonth;\n\n        // find the ends weekday\n        var endDow = otherDay.dayOfWeek();\n\n        pos++;\n\n        weekday = (endDow - aDayOfWeek);\n\n        if (weekday < 0) {\n          weekday += 7;\n        }\n\n        weekday = daysInMonth - weekday;\n      }\n\n      weekday += pos * 7;\n\n      return start + weekday;\n    },\n\n    /**\n     * Checks if current time is the nth weekday, relative to the current\n     * month.  Will always return false when rule resolves outside of current\n     * month.\n     *\n     * @param {ICAL.Time.weekDay} aDayOfWeek       Day of week to check\n     * @param {Number} aPos                        Relative position\n     * @return {Boolean}                           True, if its the nth weekday\n     */\n    isNthWeekDay: function(aDayOfWeek, aPos) {\n      var dow = this.dayOfWeek();\n\n      if (aPos === 0 && dow === aDayOfWeek) {\n        return true;\n      }\n\n      // get pos\n      var day = this.nthWeekDay(aDayOfWeek, aPos);\n\n      if (day === this.day) {\n        return true;\n      }\n\n      return false;\n    },\n\n    /**\n     * Calculates the ISO 8601 week number. The first week of a year is the\n     * week that contains the first Thursday. The year can have 53 weeks, if\n     * January 1st is a Friday.\n     *\n     * Note there are regions where the first week of the year is the one that\n     * starts on January 1st, which may offset the week number. Also, if a\n     * different week start is specified, this will also affect the week\n     * number.\n     *\n     * @see ICAL.Time.weekOneStarts\n     * @param {ICAL.Time.weekDay} aWeekStart        The weekday the week starts with\n     * @return {Number}                             The ISO week number\n     */\n    weekNumber: function weekNumber(aWeekStart) {\n      var wnCacheKey = (this.year << 12) + (this.month << 8) + (this.day << 3) + aWeekStart;\n      if (wnCacheKey in ICAL.Time._wnCache) {\n        return ICAL.Time._wnCache[wnCacheKey];\n      }\n      // This function courtesty of Julian Bucknall, published under the MIT license\n      // http://www.boyet.com/articles/publishedarticles/calculatingtheisoweeknumb.html\n      // plus some fixes to be able to use different week starts.\n      var week1;\n\n      var dt = this.clone();\n      dt.isDate = true;\n      var isoyear = this.year;\n\n      if (dt.month == 12 && dt.day > 25) {\n        week1 = ICAL.Time.weekOneStarts(isoyear + 1, aWeekStart);\n        if (dt.compare(week1) < 0) {\n          week1 = ICAL.Time.weekOneStarts(isoyear, aWeekStart);\n        } else {\n          isoyear++;\n        }\n      } else {\n        week1 = ICAL.Time.weekOneStarts(isoyear, aWeekStart);\n        if (dt.compare(week1) < 0) {\n          week1 = ICAL.Time.weekOneStarts(--isoyear, aWeekStart);\n        }\n      }\n\n      var daysBetween = (dt.subtractDate(week1).toSeconds() / 86400);\n      var answer = ICAL.helpers.trunc(daysBetween / 7) + 1;\n      ICAL.Time._wnCache[wnCacheKey] = answer;\n      return answer;\n    },\n\n    /**\n     * Adds the duration to the current time. The instance is modified in\n     * place.\n     *\n     * @param {ICAL.Duration} aDuration         The duration to add\n     */\n    addDuration: function icaltime_add(aDuration) {\n      var mult = (aDuration.isNegative ? -1 : 1);\n\n      // because of the duration optimizations it is much\n      // more efficient to grab all the values up front\n      // then set them directly (which will avoid a normalization call).\n      // So we don't actually normalize until we need it.\n      var second = this.second;\n      var minute = this.minute;\n      var hour = this.hour;\n      var day = this.day;\n\n      second += mult * aDuration.seconds;\n      minute += mult * aDuration.minutes;\n      hour += mult * aDuration.hours;\n      day += mult * aDuration.days;\n      day += mult * 7 * aDuration.weeks;\n\n      this.second = second;\n      this.minute = minute;\n      this.hour = hour;\n      this.day = day;\n\n      this._cachedUnixTime = null;\n    },\n\n    /**\n     * Subtract the date details (_excluding_ timezone).  Useful for finding\n     * the relative difference between two time objects excluding their\n     * timezone differences.\n     *\n     * @param {ICAL.Time} aDate     The date to substract\n     * @return {ICAL.Duration}      The difference as a duration\n     */\n    subtractDate: function icaltime_subtract(aDate) {\n      var unixTime = this.toUnixTime() + this.utcOffset();\n      var other = aDate.toUnixTime() + aDate.utcOffset();\n      return ICAL.Duration.fromSeconds(unixTime - other);\n    },\n\n    /**\n     * Subtract the date details, taking timezones into account.\n     *\n     * @param {ICAL.Time} aDate  The date to subtract\n     * @return {ICAL.Duration}  The difference in duration\n     */\n    subtractDateTz: function icaltime_subtract_abs(aDate) {\n      var unixTime = this.toUnixTime();\n      var other = aDate.toUnixTime();\n      return ICAL.Duration.fromSeconds(unixTime - other);\n    },\n\n    /**\n     * Compares the ICAL.Time instance with another one.\n     *\n     * @param {ICAL.Duration} aOther        The instance to compare with\n     * @return {Number}                     -1, 0 or 1 for less/equal/greater\n     */\n    compare: function icaltime_compare(other) {\n      var a = this.toUnixTime();\n      var b = other.toUnixTime();\n\n      if (a > b) return 1;\n      if (b > a) return -1;\n      return 0;\n    },\n\n    /**\n     * Compares only the date part of this instance with another one.\n     *\n     * @param {ICAL.Duration} other         The instance to compare with\n     * @param {ICAL.Timezone} tz            The timezone to compare in\n     * @return {Number}                     -1, 0 or 1 for less/equal/greater\n     */\n    compareDateOnlyTz: function icaltime_compareDateOnlyTz(other, tz) {\n      function cmp(attr) {\n        return ICAL.Time._cmp_attr(a, b, attr);\n      }\n      var a = this.convertToZone(tz);\n      var b = other.convertToZone(tz);\n      var rc = 0;\n\n      if ((rc = cmp(\"year\")) != 0) return rc;\n      if ((rc = cmp(\"month\")) != 0) return rc;\n      if ((rc = cmp(\"day\")) != 0) return rc;\n\n      return rc;\n    },\n\n    /**\n     * Convert the instance into another timzone. The returned ICAL.Time\n     * instance is always a copy.\n     *\n     * @param {ICAL.Timezone} zone      The zone to convert to\n     * @return {ICAL.Time}              The copy, converted to the zone\n     */\n    convertToZone: function convertToZone(zone) {\n      var copy = this.clone();\n      var zone_equals = (this.zone.tzid == zone.tzid);\n\n      if (!this.isDate && !zone_equals) {\n        ICAL.Timezone.convert_time(copy, this.zone, zone);\n      }\n\n      copy.zone = zone;\n      return copy;\n    },\n\n    /**\n     * Calculates the UTC offset of the current date/time in the timezone it is\n     * in.\n     *\n     * @return {Number}     UTC offset in seconds\n     */\n    utcOffset: function utc_offset() {\n      if (this.zone == ICAL.Timezone.localTimezone ||\n          this.zone == ICAL.Timezone.utcTimezone) {\n        return 0;\n      } else {\n        return this.zone.utcOffset(this);\n      }\n    },\n\n    /**\n     * Returns an RFC 5545 compliant ical representation of this object.\n     *\n     * @return {String} ical date/date-time\n     */\n    toICALString: function() {\n      var string = this.toString();\n\n      if (string.length > 10) {\n        return ICAL.design.icalendar.value['date-time'].toICAL(string);\n      } else {\n        return ICAL.design.icalendar.value.date.toICAL(string);\n      }\n    },\n\n    /**\n     * The string representation of this date/time, in jCal form\n     * (including : and - separators).\n     * @return {String}\n     */\n    toString: function toString() {\n      var result = this.year + '-' +\n                   ICAL.helpers.pad2(this.month) + '-' +\n                   ICAL.helpers.pad2(this.day);\n\n      if (!this.isDate) {\n          result += 'T' + ICAL.helpers.pad2(this.hour) + ':' +\n                    ICAL.helpers.pad2(this.minute) + ':' +\n                    ICAL.helpers.pad2(this.second);\n\n        if (this.zone === ICAL.Timezone.utcTimezone) {\n          result += 'Z';\n        }\n      }\n\n      return result;\n    },\n\n    /**\n     * Converts the current instance to a Javascript date\n     * @return {Date}\n     */\n    toJSDate: function toJSDate() {\n      if (this.zone == ICAL.Timezone.localTimezone) {\n        if (this.isDate) {\n          return new Date(this.year, this.month - 1, this.day);\n        } else {\n          return new Date(this.year, this.month - 1, this.day,\n                          this.hour, this.minute, this.second, 0);\n        }\n      } else {\n        return new Date(this.toUnixTime() * 1000);\n      }\n    },\n\n    _normalize: function icaltime_normalize() {\n      var isDate = this._time.isDate;\n      if (this._time.isDate) {\n        this._time.hour = 0;\n        this._time.minute = 0;\n        this._time.second = 0;\n      }\n      this.adjust(0, 0, 0, 0);\n\n      return this;\n    },\n\n    /**\n     * Adjust the date/time by the given offset\n     *\n     * @param {Number} aExtraDays       The extra amount of days\n     * @param {Number} aExtraHours      The extra amount of hours\n     * @param {Number} aExtraMinutes    The extra amount of minutes\n     * @param {Number} aExtraSeconds    The extra amount of seconds\n     * @param {Number=} aTime           The time to adjust, defaults to the\n     *                                    current instance.\n     */\n    adjust: function icaltime_adjust(aExtraDays, aExtraHours,\n                                     aExtraMinutes, aExtraSeconds, aTime) {\n\n      var minutesOverflow, hoursOverflow,\n          daysOverflow = 0, yearsOverflow = 0;\n\n      var second, minute, hour, day;\n      var daysInMonth;\n\n      var time = aTime || this._time;\n\n      if (!time.isDate) {\n        second = time.second + aExtraSeconds;\n        time.second = second % 60;\n        minutesOverflow = ICAL.helpers.trunc(second / 60);\n        if (time.second < 0) {\n          time.second += 60;\n          minutesOverflow--;\n        }\n\n        minute = time.minute + aExtraMinutes + minutesOverflow;\n        time.minute = minute % 60;\n        hoursOverflow = ICAL.helpers.trunc(minute / 60);\n        if (time.minute < 0) {\n          time.minute += 60;\n          hoursOverflow--;\n        }\n\n        hour = time.hour + aExtraHours + hoursOverflow;\n\n        time.hour = hour % 24;\n        daysOverflow = ICAL.helpers.trunc(hour / 24);\n        if (time.hour < 0) {\n          time.hour += 24;\n          daysOverflow--;\n        }\n      }\n\n\n      // Adjust month and year first, because we need to know what month the day\n      // is in before adjusting it.\n      if (time.month > 12) {\n        yearsOverflow = ICAL.helpers.trunc((time.month - 1) / 12);\n      } else if (time.month < 1) {\n        yearsOverflow = ICAL.helpers.trunc(time.month / 12) - 1;\n      }\n\n      time.year += yearsOverflow;\n      time.month -= 12 * yearsOverflow;\n\n      // Now take care of the days (and adjust month if needed)\n      day = time.day + aExtraDays + daysOverflow;\n\n      if (day > 0) {\n        for (;;) {\n          daysInMonth = ICAL.Time.daysInMonth(time.month, time.year);\n          if (day <= daysInMonth) {\n            break;\n          }\n\n          time.month++;\n          if (time.month > 12) {\n            time.year++;\n            time.month = 1;\n          }\n\n          day -= daysInMonth;\n        }\n      } else {\n        while (day <= 0) {\n          if (time.month == 1) {\n            time.year--;\n            time.month = 12;\n          } else {\n            time.month--;\n          }\n\n          day += ICAL.Time.daysInMonth(time.month, time.year);\n        }\n      }\n\n      time.day = day;\n\n      this._cachedUnixTime = null;\n      return this;\n    },\n\n    /**\n     * Sets up the current instance from unix time, the number of seconds since\n     * January 1st, 1970.\n     *\n     * @param {Number} seconds      The seconds to set up with\n     */\n    fromUnixTime: function fromUnixTime(seconds) {\n      this.zone = ICAL.Timezone.utcTimezone;\n      var epoch = ICAL.Time.epochTime.clone();\n      epoch.adjust(0, 0, 0, seconds);\n\n      this.year = epoch.year;\n      this.month = epoch.month;\n      this.day = epoch.day;\n      this.hour = epoch.hour;\n      this.minute = epoch.minute;\n      this.second = Math.floor(epoch.second);\n\n      this._cachedUnixTime = null;\n    },\n\n    /**\n     * Converts the current instance to seconds since January 1st 1970.\n     *\n     * @return {Number}         Seconds since 1970\n     */\n    toUnixTime: function toUnixTime() {\n      if (this._cachedUnixTime !== null) {\n        return this._cachedUnixTime;\n      }\n      var offset = this.utcOffset();\n\n      // we use the offset trick to ensure\n      // that we are getting the actual UTC time\n      var ms = Date.UTC(\n        this.year,\n        this.month - 1,\n        this.day,\n        this.hour,\n        this.minute,\n        this.second - offset\n      );\n\n      // seconds\n      this._cachedUnixTime = ms / 1000;\n      return this._cachedUnixTime;\n    },\n\n    /**\n     * Converts time to into Object which can be serialized then re-created\n     * using the constructor.\n     *\n     * @example\n     * // toJSON will automatically be called\n     * var json = JSON.stringify(mytime);\n     *\n     * var deserialized = JSON.parse(json);\n     *\n     * var time = new ICAL.Time(deserialized);\n     *\n     * @return {Object}\n     */\n    toJSON: function() {\n      var copy = [\n        'year',\n        'month',\n        'day',\n        'hour',\n        'minute',\n        'second',\n        'isDate'\n      ];\n\n      var result = Object.create(null);\n\n      var i = 0;\n      var len = copy.length;\n      var prop;\n\n      for (; i < len; i++) {\n        prop = copy[i];\n        result[prop] = this[prop];\n      }\n\n      if (this.zone) {\n        result.timezone = this.zone.tzid;\n      }\n\n      return result;\n    }\n\n  };\n\n  (function setupNormalizeAttributes() {\n    // This needs to run before any instances are created!\n    function defineAttr(attr) {\n      Object.defineProperty(ICAL.Time.prototype, attr, {\n        get: function getTimeAttr() {\n          if (this._pendingNormalization) {\n            this._normalize();\n            this._pendingNormalization = false;\n          }\n\n          return this._time[attr];\n        },\n        set: function setTimeAttr(val) {\n          // Check if isDate will be set and if was not set to normalize date.\n          // This avoids losing days when seconds, minutes and hours are zeroed\n          // what normalize will do when time is a date.\n          if (attr === \"isDate\" && val && !this._time.isDate) {\n            this.adjust(0, 0, 0, 0);\n          }\n          this._cachedUnixTime = null;\n          this._pendingNormalization = true;\n          this._time[attr] = val;\n\n          return val;\n        }\n      });\n\n    }\n\n    /* istanbul ignore else */\n    if (\"defineProperty\" in Object) {\n      defineAttr(\"year\");\n      defineAttr(\"month\");\n      defineAttr(\"day\");\n      defineAttr(\"hour\");\n      defineAttr(\"minute\");\n      defineAttr(\"second\");\n      defineAttr(\"isDate\");\n    }\n  })();\n\n  /**\n   * Returns the days in the given month\n   *\n   * @param {Number} month      The month to check\n   * @param {Number} year       The year to check\n   * @return {Number}           The number of days in the month\n   */\n  ICAL.Time.daysInMonth = function icaltime_daysInMonth(month, year) {\n    var _daysInMonth = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n    var days = 30;\n\n    if (month < 1 || month > 12) return days;\n\n    days = _daysInMonth[month];\n\n    if (month == 2) {\n      days += ICAL.Time.isLeapYear(year);\n    }\n\n    return days;\n  };\n\n  /**\n   * Checks if the year is a leap year\n   *\n   * @param {Number} year       The year to check\n   * @return {Boolean}          True, if the year is a leap year\n   */\n  ICAL.Time.isLeapYear = function isLeapYear(year) {\n    if (year <= 1752) {\n      return ((year % 4) == 0);\n    } else {\n      return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));\n    }\n  };\n\n  /**\n   * Create a new ICAL.Time from the day of year and year. The date is returned\n   * in floating timezone.\n   *\n   * @param {Number} aDayOfYear     The day of year\n   * @param {Number} aYear          The year to create the instance in\n   * @return {ICAL.Time}            The created instance with the calculated date\n   */\n  ICAL.Time.fromDayOfYear = function icaltime_fromDayOfYear(aDayOfYear, aYear) {\n    var year = aYear;\n    var doy = aDayOfYear;\n    var tt = new ICAL.Time();\n    tt.auto_normalize = false;\n    var is_leap = (ICAL.Time.isLeapYear(year) ? 1 : 0);\n\n    if (doy < 1) {\n      year--;\n      is_leap = (ICAL.Time.isLeapYear(year) ? 1 : 0);\n      doy += ICAL.Time.daysInYearPassedMonth[is_leap][12];\n      return ICAL.Time.fromDayOfYear(doy, year);\n    } else if (doy > ICAL.Time.daysInYearPassedMonth[is_leap][12]) {\n      is_leap = (ICAL.Time.isLeapYear(year) ? 1 : 0);\n      doy -= ICAL.Time.daysInYearPassedMonth[is_leap][12];\n      year++;\n      return ICAL.Time.fromDayOfYear(doy, year);\n    }\n\n    tt.year = year;\n    tt.isDate = true;\n\n    for (var month = 11; month >= 0; month--) {\n      if (doy > ICAL.Time.daysInYearPassedMonth[is_leap][month]) {\n        tt.month = month + 1;\n        tt.day = doy - ICAL.Time.daysInYearPassedMonth[is_leap][month];\n        break;\n      }\n    }\n\n    tt.auto_normalize = true;\n    return tt;\n  };\n\n  /**\n   * Returns a new ICAL.Time instance from a date string, e.g 2015-01-02.\n   *\n   * @deprecated                Use {@link ICAL.Time.fromDateString} instead\n   * @param {String} str        The string to create from\n   * @return {ICAL.Time}        The date/time instance\n   */\n  ICAL.Time.fromStringv2 = function fromString(str) {\n    return new ICAL.Time({\n      year: parseInt(str.substr(0, 4), 10),\n      month: parseInt(str.substr(5, 2), 10),\n      day: parseInt(str.substr(8, 2), 10),\n      isDate: true\n    });\n  };\n\n  /**\n   * Returns a new ICAL.Time instance from a date string, e.g 2015-01-02.\n   *\n   * @param {String} aValue     The string to create from\n   * @return {ICAL.Time}        The date/time instance\n   */\n  ICAL.Time.fromDateString = function(aValue) {\n    // Dates should have no timezone.\n    // Google likes to sometimes specify Z on dates\n    // we specifically ignore that to avoid issues.\n\n    // YYYY-MM-DD\n    // 2012-10-10\n    return new ICAL.Time({\n      year: ICAL.helpers.strictParseInt(aValue.substr(0, 4)),\n      month: ICAL.helpers.strictParseInt(aValue.substr(5, 2)),\n      day: ICAL.helpers.strictParseInt(aValue.substr(8, 2)),\n      isDate: true\n    });\n  };\n\n  /**\n   * Returns a new ICAL.Time instance from a date-time string, e.g\n   * 2015-01-02T03:04:05. If a property is specified, the timezone is set up\n   * from the property's TZID parameter.\n   *\n   * @param {String} aValue         The string to create from\n   * @param {ICAL.Property=} prop   The property the date belongs to\n   * @return {ICAL.Time}            The date/time instance\n   */\n  ICAL.Time.fromDateTimeString = function(aValue, prop) {\n    if (aValue.length < 19) {\n      throw new Error(\n        'invalid date-time value: \"' + aValue + '\"'\n      );\n    }\n\n    var zone;\n\n    if (aValue[19] && aValue[19] === 'Z') {\n      zone = 'Z';\n    } else if (prop) {\n      zone = prop.getParameter('tzid');\n    }\n\n    // 2012-10-10T10:10:10(Z)?\n    var time = new ICAL.Time({\n      year: ICAL.helpers.strictParseInt(aValue.substr(0, 4)),\n      month: ICAL.helpers.strictParseInt(aValue.substr(5, 2)),\n      day: ICAL.helpers.strictParseInt(aValue.substr(8, 2)),\n      hour: ICAL.helpers.strictParseInt(aValue.substr(11, 2)),\n      minute: ICAL.helpers.strictParseInt(aValue.substr(14, 2)),\n      second: ICAL.helpers.strictParseInt(aValue.substr(17, 2)),\n      timezone: zone\n    });\n\n    return time;\n  };\n\n  /**\n   * Returns a new ICAL.Time instance from a date or date-time string,\n   *\n   * @param {String} aValue         The string to create from\n   * @param {ICAL.Property=} prop   The property the date belongs to\n   * @return {ICAL.Time}            The date/time instance\n   */\n  ICAL.Time.fromString = function fromString(aValue, aProperty) {\n    if (aValue.length > 10) {\n      return ICAL.Time.fromDateTimeString(aValue, aProperty);\n    } else {\n      return ICAL.Time.fromDateString(aValue);\n    }\n  };\n\n  /**\n   * Creates a new ICAL.Time instance from the given Javascript Date.\n   *\n   * @param {?Date} aDate     The Javascript Date to read, or null to reset\n   * @param {Boolean} useUTC  If true, the UTC values of the date will be used\n   */\n  ICAL.Time.fromJSDate = function fromJSDate(aDate, useUTC) {\n    var tt = new ICAL.Time();\n    return tt.fromJSDate(aDate, useUTC);\n  };\n\n  /**\n   * Creates a new ICAL.Time instance from the the passed data object.\n   *\n   * @param {Object} aData            Time initialization\n   * @param {Number=} aData.year      The year for this date\n   * @param {Number=} aData.month     The month for this date\n   * @param {Number=} aData.day       The day for this date\n   * @param {Number=} aData.hour      The hour for this date\n   * @param {Number=} aData.minute    The minute for this date\n   * @param {Number=} aData.second    The second for this date\n   * @param {Boolean=} aData.isDate   If true, the instance represents a date\n   *                                    (as opposed to a date-time)\n   * @param {ICAL.Timezone=} aZone    Timezone this position occurs in\n   */\n  ICAL.Time.fromData = function fromData(aData, aZone) {\n    var t = new ICAL.Time();\n    return t.fromData(aData, aZone);\n  };\n\n  /**\n   * Creates a new ICAL.Time instance from the current moment.\n   * @return {ICAL.Time}\n   */\n  ICAL.Time.now = function icaltime_now() {\n    return ICAL.Time.fromJSDate(new Date(), false);\n  };\n\n  /**\n   * Returns the date on which ISO week number 1 starts.\n   *\n   * @see ICAL.Time#weekNumber\n   * @param {Number} aYear                  The year to search in\n   * @param {ICAL.Time.weekDay=} aWeekStart The week start weekday, used for calculation.\n   * @return {ICAL.Time}                    The date on which week number 1 starts\n   */\n  ICAL.Time.weekOneStarts = function weekOneStarts(aYear, aWeekStart) {\n    var t = ICAL.Time.fromData({\n      year: aYear,\n      month: 1,\n      day: 1,\n      isDate: true\n    });\n\n    var dow = t.dayOfWeek();\n    var wkst = aWeekStart || ICAL.Time.DEFAULT_WEEK_START;\n    if (dow > ICAL.Time.THURSDAY) {\n      t.day += 7;\n    }\n    if (wkst > ICAL.Time.THURSDAY) {\n      t.day -= 7;\n    }\n\n    t.day -= dow - wkst;\n\n    return t;\n  };\n\n  /**\n   * Get the dominical letter for the given year. Letters range from A - G for\n   * common years, and AG to GF for leap years.\n   *\n   * @param {Number} yr           The year to retrieve the letter for\n   * @return {String}             The dominical letter.\n   */\n  ICAL.Time.getDominicalLetter = function(yr) {\n    var LTRS = \"GFEDCBA\";\n    var dom = (yr + (yr / 4 | 0) + (yr / 400 | 0) - (yr / 100 | 0) - 1) % 7;\n    var isLeap = ICAL.Time.isLeapYear(yr);\n    if (isLeap) {\n      return LTRS[(dom + 6) % 7] + LTRS[dom];\n    } else {\n      return LTRS[dom];\n    }\n  };\n\n  /**\n   * January 1st, 1970 as an ICAL.Time.\n   * @type {ICAL.Time}\n   * @constant\n   * @instance\n   */\n  ICAL.Time.epochTime = ICAL.Time.fromData({\n    year: 1970,\n    month: 1,\n    day: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    isDate: false,\n    timezone: \"Z\"\n  });\n\n  ICAL.Time._cmp_attr = function _cmp_attr(a, b, attr) {\n    if (a[attr] > b[attr]) return 1;\n    if (a[attr] < b[attr]) return -1;\n    return 0;\n  };\n\n  /**\n   * The days that have passed in the year after a given month. The array has\n   * two members, one being an array of passed days for non-leap years, the\n   * other analog for leap years.\n   * @example\n   * var isLeapYear = ICAL.Time.isLeapYear(year);\n   * var passedDays = ICAL.Time.daysInYearPassedMonth[isLeapYear][month];\n   * @type {Array.<Array.<Number>>}\n   */\n  ICAL.Time.daysInYearPassedMonth = [\n    [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365],\n    [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]\n  ];\n\n  /**\n   * The weekday, 1 = SUNDAY, 7 = SATURDAY. Access via\n   * ICAL.Time.MONDAY, ICAL.Time.TUESDAY, ...\n   *\n   * @typedef {Number} weekDay\n   * @memberof ICAL.Time\n   */\n\n  ICAL.Time.SUNDAY = 1;\n  ICAL.Time.MONDAY = 2;\n  ICAL.Time.TUESDAY = 3;\n  ICAL.Time.WEDNESDAY = 4;\n  ICAL.Time.THURSDAY = 5;\n  ICAL.Time.FRIDAY = 6;\n  ICAL.Time.SATURDAY = 7;\n\n  /**\n   * The default weekday for the WKST part.\n   * @constant\n   * @default ICAL.Time.MONDAY\n   */\n  ICAL.Time.DEFAULT_WEEK_START = ICAL.Time.MONDAY;\n})();\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2015 */\n\n\n\n(function() {\n\n  /**\n   * Describes a vCard time, which has slight differences to the ICAL.Time.\n   * Properties can be null if not specified, for example for dates with\n   * reduced accuracy or truncation.\n   *\n   * Note that currently not all methods are correctly re-implemented for\n   * VCardTime. For example, comparison will have undefined results when some\n   * members are null.\n   *\n   * Also, normalization is not yet implemented for this class!\n   *\n   * @alias ICAL.VCardTime\n   * @class\n   * @extends {ICAL.Time}\n   * @param {Object} data                           The data for the time instance\n   * @param {Number=} data.year                     The year for this date\n   * @param {Number=} data.month                    The month for this date\n   * @param {Number=} data.day                      The day for this date\n   * @param {Number=} data.hour                     The hour for this date\n   * @param {Number=} data.minute                   The minute for this date\n   * @param {Number=} data.second                   The second for this date\n   * @param {ICAL.Timezone|ICAL.UtcOffset} zone     The timezone to use\n   * @param {String} icaltype                       The type for this date/time object\n   */\n  ICAL.VCardTime = function(data, zone, icaltype) {\n    this.wrappedJSObject = this;\n    var time = this._time = Object.create(null);\n\n    time.year = null;\n    time.month = null;\n    time.day = null;\n    time.hour = null;\n    time.minute = null;\n    time.second = null;\n\n    this.icaltype = icaltype || \"date-and-or-time\";\n\n    this.fromData(data, zone);\n  };\n  ICAL.helpers.inherits(ICAL.Time, ICAL.VCardTime, /** @lends ICAL.VCardTime */ {\n\n    /**\n     * The class identifier.\n     * @constant\n     * @type {String}\n     * @default \"vcardtime\"\n     */\n    icalclass: \"vcardtime\",\n\n    /**\n     * The type name, to be used in the jCal object.\n     * @type {String}\n     * @default \"date-and-or-time\"\n     */\n    icaltype: \"date-and-or-time\",\n\n    /**\n     * The timezone. This can either be floating, UTC, or an instance of\n     * ICAL.UtcOffset.\n     * @type {ICAL.Timezone|ICAL.UtcOFfset}\n     */\n    zone: null,\n\n    /**\n     * Returns a clone of the vcard date/time object.\n     *\n     * @return {ICAL.VCardTime}     The cloned object\n     */\n    clone: function() {\n      return new ICAL.VCardTime(this._time, this.zone, this.icaltype);\n    },\n\n    _normalize: function() {\n      return this;\n    },\n\n    /**\n     * @inheritdoc\n     */\n    utcOffset: function() {\n      if (this.zone instanceof ICAL.UtcOffset) {\n        return this.zone.toSeconds();\n      } else {\n        return ICAL.Time.prototype.utcOffset.apply(this, arguments);\n      }\n    },\n\n    /**\n     * Returns an RFC 6350 compliant representation of this object.\n     *\n     * @return {String}         vcard date/time string\n     */\n    toICALString: function() {\n      return ICAL.design.vcard.value[this.icaltype].toICAL(this.toString());\n    },\n\n    /**\n     * The string representation of this date/time, in jCard form\n     * (including : and - separators).\n     * @return {String}\n     */\n    toString: function toString() {\n      var p2 = ICAL.helpers.pad2;\n      var y = this.year, m = this.month, d = this.day;\n      var h = this.hour, mm = this.minute, s = this.second;\n\n      var hasYear = y !== null, hasMonth = m !== null, hasDay = d !== null;\n      var hasHour = h !== null, hasMinute = mm !== null, hasSecond = s !== null;\n\n      var datepart = (hasYear ? p2(y) + (hasMonth || hasDay ? '-' : '') : (hasMonth || hasDay ? '--' : '')) +\n                     (hasMonth ? p2(m) : '') +\n                     (hasDay ? '-' + p2(d) : '');\n      var timepart = (hasHour ? p2(h) : '-') + (hasHour && hasMinute ? ':' : '') +\n                     (hasMinute ? p2(mm) : '') + (!hasHour && !hasMinute ? '-' : '') +\n                     (hasMinute && hasSecond ? ':' : '') +\n                     (hasSecond ? p2(s) : '');\n\n      var zone;\n      if (this.zone === ICAL.Timezone.utcTimezone) {\n        zone = 'Z';\n      } else if (this.zone instanceof ICAL.UtcOffset) {\n        zone = this.zone.toString();\n      } else if (this.zone === ICAL.Timezone.localTimezone) {\n        zone = '';\n      } else if (this.zone instanceof ICAL.Timezone) {\n        var offset = ICAL.UtcOffset.fromSeconds(this.zone.utcOffset(this));\n        zone = offset.toString();\n      } else {\n        zone = '';\n      }\n\n      switch (this.icaltype) {\n        case \"time\":\n          return timepart + zone;\n        case \"date-and-or-time\":\n        case \"date-time\":\n          return datepart + (timepart == '--' ? '' : 'T' + timepart + zone);\n        case \"date\":\n          return datepart;\n      }\n      return null;\n    }\n  });\n\n  /**\n   * Returns a new ICAL.VCardTime instance from a date and/or time string.\n   *\n   * @param {String} aValue     The string to create from\n   * @param {String} aIcalType  The type for this instance, e.g. date-and-or-time\n   * @return {ICAL.VCardTime}   The date/time instance\n   */\n  ICAL.VCardTime.fromDateAndOrTimeString = function(aValue, aIcalType) {\n    function part(v, s, e) {\n      return v ? ICAL.helpers.strictParseInt(v.substr(s, e)) : null;\n    }\n    var parts = aValue.split('T');\n    var dt = parts[0], tmz = parts[1];\n    var splitzone = tmz ? ICAL.design.vcard.value.time._splitZone(tmz) : [];\n    var zone = splitzone[0], tm = splitzone[1];\n\n    var stoi = ICAL.helpers.strictParseInt;\n    var dtlen = dt ? dt.length : 0;\n    var tmlen = tm ? tm.length : 0;\n\n    var hasDashDate = dt && dt[0] == '-' && dt[1] == '-';\n    var hasDashTime = tm && tm[0] == '-';\n\n    var o = {\n      year: hasDashDate ? null : part(dt, 0, 4),\n      month: hasDashDate && (dtlen == 4 || dtlen == 7) ? part(dt, 2, 2) : dtlen == 7 ? part(dt, 5, 2) : dtlen == 10 ? part(dt, 5, 2) : null,\n      day: dtlen == 5 ? part(dt, 3, 2) : dtlen == 7 && hasDashDate ? part(dt, 5, 2) : dtlen == 10 ? part(dt, 8, 2) : null,\n\n      hour: hasDashTime ? null : part(tm, 0, 2),\n      minute: hasDashTime && tmlen == 3 ? part(tm, 1, 2) : tmlen > 4 ? hasDashTime ? part(tm, 1, 2) : part(tm, 3, 2) : null,\n      second: tmlen == 4 ? part(tm, 2, 2) : tmlen == 6 ? part(tm, 4, 2) : tmlen == 8 ? part(tm, 6, 2) : null\n    };\n\n    if (zone == 'Z') {\n      zone = ICAL.Timezone.utcTimezone;\n    } else if (zone && zone[3] == ':') {\n      zone = ICAL.UtcOffset.fromString(zone);\n    } else {\n      zone = null;\n    }\n\n    return new ICAL.VCardTime(o, zone, aIcalType);\n  };\n})();\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n\n(function() {\n  var DOW_MAP = {\n    SU: ICAL.Time.SUNDAY,\n    MO: ICAL.Time.MONDAY,\n    TU: ICAL.Time.TUESDAY,\n    WE: ICAL.Time.WEDNESDAY,\n    TH: ICAL.Time.THURSDAY,\n    FR: ICAL.Time.FRIDAY,\n    SA: ICAL.Time.SATURDAY\n  };\n\n  var REVERSE_DOW_MAP = {};\n  for (var key in DOW_MAP) {\n    /* istanbul ignore else */\n    if (DOW_MAP.hasOwnProperty(key)) {\n      REVERSE_DOW_MAP[DOW_MAP[key]] = key;\n    }\n  }\n\n  var COPY_PARTS = [\"BYSECOND\", \"BYMINUTE\", \"BYHOUR\", \"BYDAY\",\n                    \"BYMONTHDAY\", \"BYYEARDAY\", \"BYWEEKNO\",\n                    \"BYMONTH\", \"BYSETPOS\"];\n\n  /**\n   * @classdesc\n   * This class represents the \"recur\" value type, with various calculation\n   * and manipulation methods.\n   *\n   * @class\n   * @alias ICAL.Recur\n   * @param {Object} data                               An object with members of the recurrence\n   * @param {ICAL.Recur.frequencyValues=} data.freq     The frequency value\n   * @param {Number=} data.interval                     The INTERVAL value\n   * @param {ICAL.Time.weekDay=} data.wkst              The week start value\n   * @param {ICAL.Time=} data.until                     The end of the recurrence set\n   * @param {Number=} data.count                        The number of occurrences\n   * @param {Array.<Number>=} data.bysecond             The seconds for the BYSECOND part\n   * @param {Array.<Number>=} data.byminute             The minutes for the BYMINUTE part\n   * @param {Array.<Number>=} data.byhour               The hours for the BYHOUR part\n   * @param {Array.<String>=} data.byday                The BYDAY values\n   * @param {Array.<Number>=} data.bymonthday           The days for the BYMONTHDAY part\n   * @param {Array.<Number>=} data.byyearday            The days for the BYYEARDAY part\n   * @param {Array.<Number>=} data.byweekno             The weeks for the BYWEEKNO part\n   * @param {Array.<Number>=} data.bymonth              The month for the BYMONTH part\n   * @param {Array.<Number>=} data.bysetpos             The positionals for the BYSETPOS part\n   */\n  ICAL.Recur = function icalrecur(data) {\n    this.wrappedJSObject = this;\n    this.parts = {};\n\n    if (data && typeof(data) === 'object') {\n      this.fromData(data);\n    }\n  };\n\n  ICAL.Recur.prototype = {\n    /**\n     * An object holding the BY-parts of the recurrence rule\n     * @type {Object}\n     */\n    parts: null,\n\n    /**\n     * The interval value for the recurrence rule.\n     * @type {Number}\n     */\n    interval: 1,\n\n    /**\n     * The week start day\n     *\n     * @type {ICAL.Time.weekDay}\n     * @default ICAL.Time.MONDAY\n     */\n    wkst: ICAL.Time.MONDAY,\n\n    /**\n     * The end of the recurrence\n     * @type {?ICAL.Time}\n     */\n    until: null,\n\n    /**\n     * The maximum number of occurrences\n     * @type {?Number}\n     */\n    count: null,\n\n    /**\n     * The frequency value.\n     * @type {ICAL.Recur.frequencyValues}\n     */\n    freq: null,\n\n    /**\n     * The class identifier.\n     * @constant\n     * @type {String}\n     * @default \"icalrecur\"\n     */\n    icalclass: \"icalrecur\",\n\n    /**\n     * The type name, to be used in the jCal object.\n     * @constant\n     * @type {String}\n     * @default \"recur\"\n     */\n    icaltype: \"recur\",\n\n    /**\n     * Create a new iterator for this recurrence rule. The passed start date\n     * must be the start date of the event, not the start of the range to\n     * search in.\n     *\n     * @example\n     * var recur = comp.getFirstPropertyValue('rrule');\n     * var dtstart = comp.getFirstPropertyValue('dtstart');\n     * var iter = recur.iterator(dtstart);\n     * for (var next = iter.next(); next; next = iter.next()) {\n     *   if (next.compare(rangeStart) < 0) {\n     *     continue;\n     *   }\n     *   console.log(next.toString());\n     * }\n     *\n     * @param {ICAL.Time} aStart        The item's start date\n     * @return {ICAL.RecurIterator}     The recurrence iterator\n     */\n    iterator: function(aStart) {\n      return new ICAL.RecurIterator({\n        rule: this,\n        dtstart: aStart\n      });\n    },\n\n    /**\n     * Returns a clone of the recurrence object.\n     *\n     * @return {ICAL.Recur}      The cloned object\n     */\n    clone: function clone() {\n      return new ICAL.Recur(this.toJSON());\n    },\n\n    /**\n     * Checks if the current rule is finite, i.e. has a count or until part.\n     *\n     * @return {Boolean}        True, if the rule is finite\n     */\n    isFinite: function isfinite() {\n      return !!(this.count || this.until);\n    },\n\n    /**\n     * Checks if the current rule has a count part, and not limited by an until\n     * part.\n     *\n     * @return {Boolean}        True, if the rule is by count\n     */\n    isByCount: function isbycount() {\n      return !!(this.count && !this.until);\n    },\n\n    /**\n     * Adds a component (part) to the recurrence rule. This is not a component\n     * in the sense of {@link ICAL.Component}, but a part of the recurrence\n     * rule, i.e. BYMONTH.\n     *\n     * @param {String} aType            The name of the component part\n     * @param {Array|String} aValue     The component value\n     */\n    addComponent: function addPart(aType, aValue) {\n      var ucname = aType.toUpperCase();\n      if (ucname in this.parts) {\n        this.parts[ucname].push(aValue);\n      } else {\n        this.parts[ucname] = [aValue];\n      }\n    },\n\n    /**\n     * Sets the component value for the given by-part.\n     *\n     * @param {String} aType        The component part name\n     * @param {Array} aValues       The component values\n     */\n    setComponent: function setComponent(aType, aValues) {\n      this.parts[aType.toUpperCase()] = aValues.slice();\n    },\n\n    /**\n     * Gets (a copy) of the requested component value.\n     *\n     * @param {String} aType        The component part name\n     * @return {Array}              The component part value\n     */\n    getComponent: function getComponent(aType) {\n      var ucname = aType.toUpperCase();\n      return (ucname in this.parts ? this.parts[ucname].slice() : []);\n    },\n\n    /**\n     * Retrieves the next occurrence after the given recurrence id. See the\n     * guide on {@tutorial terminology} for more details.\n     *\n     * NOTE: Currently, this method iterates all occurrences from the start\n     * date. It should not be called in a loop for performance reasons. If you\n     * would like to get more than one occurrence, you can iterate the\n     * occurrences manually, see the example on the\n     * {@link ICAL.Recur#iterator iterator} method.\n     *\n     * @param {ICAL.Time} aStartTime        The start of the event series\n     * @param {ICAL.Time} aRecurrenceId     The date of the last occurrence\n     * @return {ICAL.Time}                  The next occurrence after\n     */\n    getNextOccurrence: function getNextOccurrence(aStartTime, aRecurrenceId) {\n      var iter = this.iterator(aStartTime);\n      var next, cdt;\n\n      do {\n        next = iter.next();\n      } while (next && next.compare(aRecurrenceId) <= 0);\n\n      if (next && aRecurrenceId.zone) {\n        next.zone = aRecurrenceId.zone;\n      }\n\n      return next;\n    },\n\n    /**\n     * Sets up the current instance using members from the passed data object.\n     *\n     * @param {Object} data                               An object with members of the recurrence\n     * @param {ICAL.Recur.frequencyValues=} data.freq     The frequency value\n     * @param {Number=} data.interval                     The INTERVAL value\n     * @param {ICAL.Time.weekDay=} data.wkst              The week start value\n     * @param {ICAL.Time=} data.until                     The end of the recurrence set\n     * @param {Number=} data.count                        The number of occurrences\n     * @param {Array.<Number>=} data.bysecond             The seconds for the BYSECOND part\n     * @param {Array.<Number>=} data.byminute             The minutes for the BYMINUTE part\n     * @param {Array.<Number>=} data.byhour               The hours for the BYHOUR part\n     * @param {Array.<String>=} data.byday                The BYDAY values\n     * @param {Array.<Number>=} data.bymonthday           The days for the BYMONTHDAY part\n     * @param {Array.<Number>=} data.byyearday            The days for the BYYEARDAY part\n     * @param {Array.<Number>=} data.byweekno             The weeks for the BYWEEKNO part\n     * @param {Array.<Number>=} data.bymonth              The month for the BYMONTH part\n     * @param {Array.<Number>=} data.bysetpos             The positionals for the BYSETPOS part\n     */\n    fromData: function(data) {\n      for (var key in data) {\n        var uckey = key.toUpperCase();\n\n        if (uckey in partDesign) {\n          if (Array.isArray(data[key])) {\n            this.parts[uckey] = data[key];\n          } else {\n            this.parts[uckey] = [data[key]];\n          }\n        } else {\n          this[key] = data[key];\n        }\n      }\n\n      if (this.interval && typeof this.interval != \"number\") {\n        optionDesign.INTERVAL(this.interval, this);\n      }\n\n      if (this.wkst && typeof this.wkst != \"number\") {\n        this.wkst = ICAL.Recur.icalDayToNumericDay(this.wkst);\n      }\n\n      if (this.until && !(this.until instanceof ICAL.Time)) {\n        this.until = ICAL.Time.fromString(this.until);\n      }\n    },\n\n    /**\n     * The jCal representation of this recurrence type.\n     * @return {Object}\n     */\n    toJSON: function() {\n      var res = Object.create(null);\n      res.freq = this.freq;\n\n      if (this.count) {\n        res.count = this.count;\n      }\n\n      if (this.interval > 1) {\n        res.interval = this.interval;\n      }\n\n      for (var k in this.parts) {\n        /* istanbul ignore if */\n        if (!this.parts.hasOwnProperty(k)) {\n          continue;\n        }\n        var kparts = this.parts[k];\n        if (Array.isArray(kparts) && kparts.length == 1) {\n          res[k.toLowerCase()] = kparts[0];\n        } else {\n          res[k.toLowerCase()] = ICAL.helpers.clone(this.parts[k]);\n        }\n      }\n\n      if (this.until) {\n        res.until = this.until.toString();\n      }\n      if ('wkst' in this && this.wkst !== ICAL.Time.DEFAULT_WEEK_START) {\n        res.wkst = ICAL.Recur.numericDayToIcalDay(this.wkst);\n      }\n      return res;\n    },\n\n    /**\n     * The string representation of this recurrence rule.\n     * @return {String}\n     */\n    toString: function icalrecur_toString() {\n      // TODO retain order\n      var str = \"FREQ=\" + this.freq;\n      if (this.count) {\n        str += \";COUNT=\" + this.count;\n      }\n      if (this.interval > 1) {\n        str += \";INTERVAL=\" + this.interval;\n      }\n      for (var k in this.parts) {\n        /* istanbul ignore else */\n        if (this.parts.hasOwnProperty(k)) {\n          str += \";\" + k + \"=\" + this.parts[k];\n        }\n      }\n      if (this.until) {\n        str += ';UNTIL=' + this.until.toICALString();\n      }\n      if ('wkst' in this && this.wkst !== ICAL.Time.DEFAULT_WEEK_START) {\n        str += ';WKST=' + ICAL.Recur.numericDayToIcalDay(this.wkst);\n      }\n      return str;\n    }\n  };\n\n  function parseNumericValue(type, min, max, value) {\n    var result = value;\n\n    if (value[0] === '+') {\n      result = value.substr(1);\n    }\n\n    result = ICAL.helpers.strictParseInt(result);\n\n    if (min !== undefined && value < min) {\n      throw new Error(\n        type + ': invalid value \"' + value + '\" must be > ' + min\n      );\n    }\n\n    if (max !== undefined && value > max) {\n      throw new Error(\n        type + ': invalid value \"' + value + '\" must be < ' + min\n      );\n    }\n\n    return result;\n  }\n\n  /**\n   * Convert an ical representation of a day (SU, MO, etc..)\n   * into a numeric value of that day.\n   *\n   * @param {String} string     The iCalendar day name\n   * @param {ICAL.Time.weekDay=} aWeekStart\n   *        The week start weekday, defaults to SUNDAY\n   * @return {Number}           Numeric value of given day\n   */\n  ICAL.Recur.icalDayToNumericDay = function toNumericDay(string, aWeekStart) {\n    //XXX: this is here so we can deal\n    //     with possibly invalid string values.\n    var firstDow = aWeekStart || ICAL.Time.SUNDAY;\n    return ((DOW_MAP[string] - firstDow + 7) % 7) + 1;\n  };\n\n  /**\n   * Convert a numeric day value into its ical representation (SU, MO, etc..)\n   *\n   * @param {Number} num        Numeric value of given day\n   * @param {ICAL.Time.weekDay=} aWeekStart\n   *        The week start weekday, defaults to SUNDAY\n   * @return {String}           The ICAL day value, e.g SU,MO,...\n   */\n  ICAL.Recur.numericDayToIcalDay = function toIcalDay(num, aWeekStart) {\n    //XXX: this is here so we can deal with possibly invalid number values.\n    //     Also, this allows consistent mapping between day numbers and day\n    //     names for external users.\n    var firstDow = aWeekStart || ICAL.Time.SUNDAY;\n    var dow = (num + firstDow - ICAL.Time.SUNDAY);\n    if (dow > 7) {\n      dow -= 7;\n    }\n    return REVERSE_DOW_MAP[dow];\n  };\n\n  var VALID_DAY_NAMES = /^(SU|MO|TU|WE|TH|FR|SA)$/;\n  var VALID_BYDAY_PART = /^([+-])?(5[0-3]|[1-4][0-9]|[1-9])?(SU|MO|TU|WE|TH|FR|SA)$/;\n\n  /**\n   * Possible frequency values for the FREQ part\n   * (YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, SECONDLY)\n   *\n   * @typedef {String} frequencyValues\n   * @memberof ICAL.Recur\n   */\n\n  var ALLOWED_FREQ = ['SECONDLY', 'MINUTELY', 'HOURLY',\n                      'DAILY', 'WEEKLY', 'MONTHLY', 'YEARLY'];\n\n  var optionDesign = {\n    FREQ: function(value, dict, fmtIcal) {\n      // yes this is actually equal or faster then regex.\n      // upside here is we can enumerate the valid values.\n      if (ALLOWED_FREQ.indexOf(value) !== -1) {\n        dict.freq = value;\n      } else {\n        throw new Error(\n          'invalid frequency \"' + value + '\" expected: \"' +\n          ALLOWED_FREQ.join(', ') + '\"'\n        );\n      }\n    },\n\n    COUNT: function(value, dict, fmtIcal) {\n      dict.count = ICAL.helpers.strictParseInt(value);\n    },\n\n    INTERVAL: function(value, dict, fmtIcal) {\n      dict.interval = ICAL.helpers.strictParseInt(value);\n      if (dict.interval < 1) {\n        // 0 or negative values are not allowed, some engines seem to generate\n        // it though. Assume 1 instead.\n        dict.interval = 1;\n      }\n    },\n\n    UNTIL: function(value, dict, fmtIcal) {\n      if (value.length > 10) {\n        dict.until = ICAL.design.icalendar.value['date-time'].fromICAL(value);\n      } else {\n        dict.until = ICAL.design.icalendar.value.date.fromICAL(value);\n      }\n      if (!fmtIcal) {\n        dict.until = ICAL.Time.fromString(dict.until);\n      }\n    },\n\n    WKST: function(value, dict, fmtIcal) {\n      if (VALID_DAY_NAMES.test(value)) {\n        dict.wkst = ICAL.Recur.icalDayToNumericDay(value);\n      } else {\n        throw new Error('invalid WKST value \"' + value + '\"');\n      }\n    }\n  };\n\n  var partDesign = {\n    BYSECOND: parseNumericValue.bind(this, 'BYSECOND', 0, 60),\n    BYMINUTE: parseNumericValue.bind(this, 'BYMINUTE', 0, 59),\n    BYHOUR: parseNumericValue.bind(this, 'BYHOUR', 0, 23),\n    BYDAY: function(value) {\n      if (VALID_BYDAY_PART.test(value)) {\n        return value;\n      } else {\n        throw new Error('invalid BYDAY value \"' + value + '\"');\n      }\n    },\n    BYMONTHDAY: parseNumericValue.bind(this, 'BYMONTHDAY', -31, 31),\n    BYYEARDAY: parseNumericValue.bind(this, 'BYYEARDAY', -366, 366),\n    BYWEEKNO: parseNumericValue.bind(this, 'BYWEEKNO', -53, 53),\n    BYMONTH: parseNumericValue.bind(this, 'BYMONTH', 0, 12),\n    BYSETPOS: parseNumericValue.bind(this, 'BYSETPOS', -366, 366)\n  };\n\n\n  /**\n   * Creates a new {@link ICAL.Recur} instance from the passed string.\n   *\n   * @param {String} string         The string to parse\n   * @return {ICAL.Recur}           The created recurrence instance\n   */\n  ICAL.Recur.fromString = function(string) {\n    var data = ICAL.Recur._stringToData(string, false);\n    return new ICAL.Recur(data);\n  };\n\n  /**\n   * Creates a new {@link ICAL.Recur} instance using members from the passed\n   * data object.\n   *\n   * @param {Object} aData                              An object with members of the recurrence\n   * @param {ICAL.Recur.frequencyValues=} aData.freq    The frequency value\n   * @param {Number=} aData.interval                    The INTERVAL value\n   * @param {ICAL.Time.weekDay=} aData.wkst             The week start value\n   * @param {ICAL.Time=} aData.until                    The end of the recurrence set\n   * @param {Number=} aData.count                       The number of occurrences\n   * @param {Array.<Number>=} aData.bysecond            The seconds for the BYSECOND part\n   * @param {Array.<Number>=} aData.byminute            The minutes for the BYMINUTE part\n   * @param {Array.<Number>=} aData.byhour              The hours for the BYHOUR part\n   * @param {Array.<String>=} aData.byday               The BYDAY values\n   * @param {Array.<Number>=} aData.bymonthday          The days for the BYMONTHDAY part\n   * @param {Array.<Number>=} aData.byyearday           The days for the BYYEARDAY part\n   * @param {Array.<Number>=} aData.byweekno            The weeks for the BYWEEKNO part\n   * @param {Array.<Number>=} aData.bymonth             The month for the BYMONTH part\n   * @param {Array.<Number>=} aData.bysetpos            The positionals for the BYSETPOS part\n   */\n  ICAL.Recur.fromData = function(aData) {\n    return new ICAL.Recur(aData);\n  };\n\n  /**\n   * Converts a recurrence string to a data object, suitable for the fromData\n   * method.\n   *\n   * @param {String} string     The string to parse\n   * @param {Boolean} fmtIcal   If true, the string is considered to be an\n   *                              iCalendar string\n   * @return {ICAL.Recur}       The recurrence instance\n   */\n  ICAL.Recur._stringToData = function(string, fmtIcal) {\n    var dict = Object.create(null);\n\n    // split is slower in FF but fast enough.\n    // v8 however this is faster then manual split?\n    var values = string.split(';');\n    var len = values.length;\n\n    for (var i = 0; i < len; i++) {\n      var parts = values[i].split('=');\n      var ucname = parts[0].toUpperCase();\n      var lcname = parts[0].toLowerCase();\n      var name = (fmtIcal ? lcname : ucname);\n      var value = parts[1];\n\n      if (ucname in partDesign) {\n        var partArr = value.split(',');\n        var partArrIdx = 0;\n        var partArrLen = partArr.length;\n\n        for (; partArrIdx < partArrLen; partArrIdx++) {\n          partArr[partArrIdx] = partDesign[ucname](partArr[partArrIdx]);\n        }\n        dict[name] = (partArr.length == 1 ? partArr[0] : partArr);\n      } else if (ucname in optionDesign) {\n        optionDesign[ucname](value, dict, fmtIcal);\n      } else {\n        // Don't swallow unknown values. Just set them as they are.\n        dict[lcname] = value;\n      }\n    }\n\n    return dict;\n  };\n})();\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n/**\n * This symbol is further described later on\n * @ignore\n */\nICAL.RecurIterator = (function() {\n\n  /**\n   * @classdesc\n   * An iterator for a single recurrence rule. This class usually doesn't have\n   * to be instanciated directly, the convenience method\n   * {@link ICAL.Recur#iterator} can be used.\n   *\n   * @description\n   * The options object may contain additional members when resuming iteration from a previous run\n   *\n   * @description\n   * The options object may contain additional members when resuming iteration\n   * from a previous run.\n   *\n   * @class\n   * @alias ICAL.RecurIterator\n   * @param {Object} options                The iterator options\n   * @param {ICAL.Recur} options.rule       The rule to iterate.\n   * @param {ICAL.Time} options.dtstart     The start date of the event.\n   * @param {Boolean=} options.initialized  When true, assume that options are\n   *        from a previously constructed iterator. Initialization will not be\n   *        repeated.\n   */\n  function icalrecur_iterator(options) {\n    this.fromData(options);\n  }\n\n  icalrecur_iterator.prototype = {\n\n    /**\n     * True when iteration is finished.\n     * @type {Boolean}\n     */\n    completed: false,\n\n    /**\n     * The rule that is being iterated\n     * @type {ICAL.Recur}\n     */\n    rule: null,\n\n    /**\n     * The start date of the event being iterated.\n     * @type {ICAL.Time}\n     */\n    dtstart: null,\n\n    /**\n     * The last occurrence that was returned from the\n     * {@link ICAL.RecurIterator#next} method.\n     * @type {ICAL.Time}\n     */\n    last: null,\n\n    /**\n     * The sequence number from the occurrence\n     * @type {Number}\n     */\n    occurrence_number: 0,\n\n    /**\n     * The indices used for the {@link ICAL.RecurIterator#by_data} object.\n     * @type {Object}\n     * @private\n     */\n    by_indices: null,\n\n    /**\n     * If true, the iterator has already been initialized\n     * @type {Boolean}\n     * @private\n     */\n    initialized: false,\n\n    /**\n     * The initializd by-data.\n     * @type {Object}\n     * @private\n     */\n    by_data: null,\n\n    /**\n     * The expanded yeardays\n     * @type {Array}\n     * @private\n     */\n    days: null,\n\n    /**\n     * The index in the {@link ICAL.RecurIterator#days} array.\n     * @type {Number}\n     * @private\n     */\n    days_index: 0,\n\n    /**\n     * Initialize the recurrence iterator from the passed data object. This\n     * method is usually not called directly, you can initialize the iterator\n     * through the constructor.\n     *\n     * @param {Object} options                The iterator options\n     * @param {ICAL.Recur} options.rule       The rule to iterate.\n     * @param {ICAL.Time} options.dtstart     The start date of the event.\n     * @param {Boolean=} options.initialized  When true, assume that options are\n     *        from a previously constructed iterator. Initialization will not be\n     *        repeated.\n     */\n    fromData: function(options) {\n      this.rule = ICAL.helpers.formatClassType(options.rule, ICAL.Recur);\n\n      if (!this.rule) {\n        throw new Error('iterator requires a (ICAL.Recur) rule');\n      }\n\n      this.dtstart = ICAL.helpers.formatClassType(options.dtstart, ICAL.Time);\n\n      if (!this.dtstart) {\n        throw new Error('iterator requires a (ICAL.Time) dtstart');\n      }\n\n      if (options.by_data) {\n        this.by_data = options.by_data;\n      } else {\n        this.by_data = ICAL.helpers.clone(this.rule.parts, true);\n      }\n\n      if (options.occurrence_number)\n        this.occurrence_number = options.occurrence_number;\n\n      this.days = options.days || [];\n      if (options.last) {\n        this.last = ICAL.helpers.formatClassType(options.last, ICAL.Time);\n      }\n\n      this.by_indices = options.by_indices;\n\n      if (!this.by_indices) {\n        this.by_indices = {\n          \"BYSECOND\": 0,\n          \"BYMINUTE\": 0,\n          \"BYHOUR\": 0,\n          \"BYDAY\": 0,\n          \"BYMONTH\": 0,\n          \"BYWEEKNO\": 0,\n          \"BYMONTHDAY\": 0\n        };\n      }\n\n      this.initialized = options.initialized || false;\n\n      if (!this.initialized) {\n        this.init();\n      }\n    },\n\n    /**\n     * Intialize the iterator\n     * @private\n     */\n    init: function icalrecur_iterator_init() {\n      this.initialized = true;\n      this.last = this.dtstart.clone();\n      var parts = this.by_data;\n\n      if (\"BYDAY\" in parts) {\n        // libical does this earlier when the rule is loaded, but we postpone to\n        // now so we can preserve the original order.\n        this.sort_byday_rules(parts.BYDAY);\n      }\n\n      // If the BYYEARDAY appares, no other date rule part may appear\n      if (\"BYYEARDAY\" in parts) {\n        if (\"BYMONTH\" in parts || \"BYWEEKNO\" in parts ||\n            \"BYMONTHDAY\" in parts || \"BYDAY\" in parts) {\n          throw new Error(\"Invalid BYYEARDAY rule\");\n        }\n      }\n\n      // BYWEEKNO and BYMONTHDAY rule parts may not both appear\n      if (\"BYWEEKNO\" in parts && \"BYMONTHDAY\" in parts) {\n        throw new Error(\"BYWEEKNO does not fit to BYMONTHDAY\");\n      }\n\n      // For MONTHLY recurrences (FREQ=MONTHLY) neither BYYEARDAY nor\n      // BYWEEKNO may appear.\n      if (this.rule.freq == \"MONTHLY\" &&\n          (\"BYYEARDAY\" in parts || \"BYWEEKNO\" in parts)) {\n        throw new Error(\"For MONTHLY recurrences neither BYYEARDAY nor BYWEEKNO may appear\");\n      }\n\n      // For WEEKLY recurrences (FREQ=WEEKLY) neither BYMONTHDAY nor\n      // BYYEARDAY may appear.\n      if (this.rule.freq == \"WEEKLY\" &&\n          (\"BYYEARDAY\" in parts || \"BYMONTHDAY\" in parts)) {\n        throw new Error(\"For WEEKLY recurrences neither BYMONTHDAY nor BYYEARDAY may appear\");\n      }\n\n      // BYYEARDAY may only appear in YEARLY rules\n      if (this.rule.freq != \"YEARLY\" && \"BYYEARDAY\" in parts) {\n        throw new Error(\"BYYEARDAY may only appear in YEARLY rules\");\n      }\n\n      this.last.second = this.setup_defaults(\"BYSECOND\", \"SECONDLY\", this.dtstart.second);\n      this.last.minute = this.setup_defaults(\"BYMINUTE\", \"MINUTELY\", this.dtstart.minute);\n      this.last.hour = this.setup_defaults(\"BYHOUR\", \"HOURLY\", this.dtstart.hour);\n      this.last.day = this.setup_defaults(\"BYMONTHDAY\", \"DAILY\", this.dtstart.day);\n      this.last.month = this.setup_defaults(\"BYMONTH\", \"MONTHLY\", this.dtstart.month);\n\n      if (this.rule.freq == \"WEEKLY\") {\n        if (\"BYDAY\" in parts) {\n          var bydayParts = this.ruleDayOfWeek(parts.BYDAY[0], this.rule.wkst);\n          var pos = bydayParts[0];\n          var dow = bydayParts[1];\n          var wkdy = dow - this.last.dayOfWeek(this.rule.wkst);\n          if ((this.last.dayOfWeek(this.rule.wkst) < dow && wkdy >= 0) || wkdy < 0) {\n            // Initial time is after first day of BYDAY data\n            this.last.day += wkdy;\n          }\n        } else {\n          var dayName = ICAL.Recur.numericDayToIcalDay(this.dtstart.dayOfWeek());\n          parts.BYDAY = [dayName];\n        }\n      }\n\n      if (this.rule.freq == \"YEARLY\") {\n        for (;;) {\n          this.expand_year_days(this.last.year);\n          if (this.days.length > 0) {\n            break;\n          }\n          this.increment_year(this.rule.interval);\n        }\n\n        this._nextByYearDay();\n      }\n\n      if (this.rule.freq == \"MONTHLY\" && this.has_by_data(\"BYDAY\")) {\n        var tempLast = null;\n        var initLast = this.last.clone();\n        var daysInMonth = ICAL.Time.daysInMonth(this.last.month, this.last.year);\n\n        // Check every weekday in BYDAY with relative dow and pos.\n        for (var i in this.by_data.BYDAY) {\n          /* istanbul ignore if */\n          if (!this.by_data.BYDAY.hasOwnProperty(i)) {\n            continue;\n          }\n          this.last = initLast.clone();\n          var bydayParts = this.ruleDayOfWeek(this.by_data.BYDAY[i]);\n          var pos = bydayParts[0];\n          var dow = bydayParts[1];\n          var dayOfMonth = this.last.nthWeekDay(dow, pos);\n\n          // If |pos| >= 6, the byday is invalid for a monthly rule.\n          if (pos >= 6 || pos <= -6) {\n            throw new Error(\"Malformed values in BYDAY part\");\n          }\n\n          // If a Byday with pos=+/-5 is not in the current month it\n          // must be searched in the next months.\n          if (dayOfMonth > daysInMonth || dayOfMonth <= 0) {\n            // Skip if we have already found a \"last\" in this month.\n            if (tempLast && tempLast.month == initLast.month) {\n              continue;\n            }\n            while (dayOfMonth > daysInMonth || dayOfMonth <= 0) {\n              this.increment_month();\n              daysInMonth = ICAL.Time.daysInMonth(this.last.month, this.last.year);\n              dayOfMonth = this.last.nthWeekDay(dow, pos);\n            }\n          }\n\n          this.last.day = dayOfMonth;\n          if (!tempLast || this.last.compare(tempLast) < 0) {\n            tempLast = this.last.clone();\n          }\n        }\n        this.last = tempLast.clone();\n\n        //XXX: This feels like a hack, but we need to initialize\n        //     the BYMONTHDAY case correctly and byDayAndMonthDay handles\n        //     this case. It accepts a special flag which will avoid incrementing\n        //     the initial value without the flag days that match the start time\n        //     would be missed.\n        if (this.has_by_data('BYMONTHDAY')) {\n          this._byDayAndMonthDay(true);\n        }\n\n        if (this.last.day > daysInMonth || this.last.day == 0) {\n          throw new Error(\"Malformed values in BYDAY part\");\n        }\n\n      } else if (this.has_by_data(\"BYMONTHDAY\")) {\n        if (this.last.day < 0) {\n          var daysInMonth = ICAL.Time.daysInMonth(this.last.month, this.last.year);\n          this.last.day = daysInMonth + this.last.day + 1;\n        }\n      }\n\n    },\n\n    /**\n     * Retrieve the next occurrence from the iterator.\n     * @return {ICAL.Time}\n     */\n    next: function icalrecur_iterator_next() {\n      var before = (this.last ? this.last.clone() : null);\n\n      if ((this.rule.count && this.occurrence_number >= this.rule.count) ||\n          (this.rule.until && this.last.compare(this.rule.until) > 0)) {\n\n        //XXX: right now this is just a flag and has no impact\n        //     we can simplify the above case to check for completed later.\n        this.completed = true;\n\n        return null;\n      }\n\n      if (this.occurrence_number == 0 && this.last.compare(this.dtstart) >= 0) {\n        // First of all, give the instance that was initialized\n        this.occurrence_number++;\n        return this.last;\n      }\n\n\n      var valid;\n      do {\n        valid = 1;\n\n        switch (this.rule.freq) {\n        case \"SECONDLY\":\n          this.next_second();\n          break;\n        case \"MINUTELY\":\n          this.next_minute();\n          break;\n        case \"HOURLY\":\n          this.next_hour();\n          break;\n        case \"DAILY\":\n          this.next_day();\n          break;\n        case \"WEEKLY\":\n          this.next_week();\n          break;\n        case \"MONTHLY\":\n          valid = this.next_month();\n          break;\n        case \"YEARLY\":\n          this.next_year();\n          break;\n\n        default:\n          return null;\n        }\n      } while (!this.check_contracting_rules() ||\n               this.last.compare(this.dtstart) < 0 ||\n               !valid);\n\n      // TODO is this valid?\n      if (this.last.compare(before) == 0) {\n        throw new Error(\"Same occurrence found twice, protecting \" +\n                        \"you from death by recursion\");\n      }\n\n      if (this.rule.until && this.last.compare(this.rule.until) > 0) {\n        this.completed = true;\n        return null;\n      } else {\n        this.occurrence_number++;\n        return this.last;\n      }\n    },\n\n    next_second: function next_second() {\n      return this.next_generic(\"BYSECOND\", \"SECONDLY\", \"second\", \"minute\");\n    },\n\n    increment_second: function increment_second(inc) {\n      return this.increment_generic(inc, \"second\", 60, \"minute\");\n    },\n\n    next_minute: function next_minute() {\n      return this.next_generic(\"BYMINUTE\", \"MINUTELY\",\n                               \"minute\", \"hour\", \"next_second\");\n    },\n\n    increment_minute: function increment_minute(inc) {\n      return this.increment_generic(inc, \"minute\", 60, \"hour\");\n    },\n\n    next_hour: function next_hour() {\n      return this.next_generic(\"BYHOUR\", \"HOURLY\", \"hour\",\n                               \"monthday\", \"next_minute\");\n    },\n\n    increment_hour: function increment_hour(inc) {\n      this.increment_generic(inc, \"hour\", 24, \"monthday\");\n    },\n\n    next_day: function next_day() {\n      var has_by_day = (\"BYDAY\" in this.by_data);\n      var this_freq = (this.rule.freq == \"DAILY\");\n\n      if (this.next_hour() == 0) {\n        return 0;\n      }\n\n      if (this_freq) {\n        this.increment_monthday(this.rule.interval);\n      } else {\n        this.increment_monthday(1);\n      }\n\n      return 0;\n    },\n\n    next_week: function next_week() {\n      var end_of_data = 0;\n\n      if (this.next_weekday_by_week() == 0) {\n        return end_of_data;\n      }\n\n      if (this.has_by_data(\"BYWEEKNO\")) {\n        var idx = ++this.by_indices.BYWEEKNO;\n\n        if (this.by_indices.BYWEEKNO == this.by_data.BYWEEKNO.length) {\n          this.by_indices.BYWEEKNO = 0;\n          end_of_data = 1;\n        }\n\n        // HACK should be first month of the year\n        this.last.month = 1;\n        this.last.day = 1;\n\n        var week_no = this.by_data.BYWEEKNO[this.by_indices.BYWEEKNO];\n\n        this.last.day += 7 * week_no;\n\n        if (end_of_data) {\n          this.increment_year(1);\n        }\n      } else {\n        // Jump to the next week\n        this.increment_monthday(7 * this.rule.interval);\n      }\n\n      return end_of_data;\n    },\n\n    /**\n     * Normalize each by day rule for a given year/month.\n     * Takes into account ordering and negative rules\n     *\n     * @private\n     * @param {Number} year         Current year.\n     * @param {Number} month        Current month.\n     * @param {Array}  rules        Array of rules.\n     *\n     * @return {Array} sorted and normalized rules.\n     *                 Negative rules will be expanded to their\n     *                 correct positive values for easier processing.\n     */\n    normalizeByMonthDayRules: function(year, month, rules) {\n      var daysInMonth = ICAL.Time.daysInMonth(month, year);\n\n      // XXX: This is probably bad for performance to allocate\n      //      a new array for each month we scan, if possible\n      //      we should try to optimize this...\n      var newRules = [];\n\n      var ruleIdx = 0;\n      var len = rules.length;\n      var rule;\n\n      for (; ruleIdx < len; ruleIdx++) {\n        rule = rules[ruleIdx];\n\n        // if this rule falls outside of given\n        // month discard it.\n        if (Math.abs(rule) > daysInMonth) {\n          continue;\n        }\n\n        // negative case\n        if (rule < 0) {\n          // we add (not subtract its a negative number)\n          // one from the rule because 1 === last day of month\n          rule = daysInMonth + (rule + 1);\n        } else if (rule === 0) {\n          // skip zero its invalid.\n          continue;\n        }\n\n        // only add unique items...\n        if (newRules.indexOf(rule) === -1) {\n          newRules.push(rule);\n        }\n\n      }\n\n      // unique and sort\n      return newRules.sort(function(a, b) { return a - b; });\n    },\n\n    /**\n     * NOTES:\n     * We are given a list of dates in the month (BYMONTHDAY) (23, etc..)\n     * Also we are given a list of days (BYDAY) (MO, 2SU, etc..) when\n     * both conditions match a given date (this.last.day) iteration stops.\n     *\n     * @private\n     * @param {Boolean=} isInit     When given true will not increment the\n     *                                current day (this.last).\n     */\n    _byDayAndMonthDay: function(isInit) {\n      var byMonthDay; // setup in initMonth\n      var byDay = this.by_data.BYDAY;\n\n      var date;\n      var dateIdx = 0;\n      var dateLen; // setup in initMonth\n      var dayLen = byDay.length;\n\n      // we are not valid by default\n      var dataIsValid = 0;\n\n      var daysInMonth;\n      var self = this;\n      // we need a copy of this, because a DateTime gets normalized\n      // automatically if the day is out of range. At some points we\n      // set the last day to 0 to start counting.\n      var lastDay = this.last.day;\n\n      function initMonth() {\n        daysInMonth = ICAL.Time.daysInMonth(\n          self.last.month, self.last.year\n        );\n\n        byMonthDay = self.normalizeByMonthDayRules(\n          self.last.year,\n          self.last.month,\n          self.by_data.BYMONTHDAY\n        );\n\n        dateLen = byMonthDay.length;\n\n        // For the case of more than one occurrence in one month\n        // we have to be sure to start searching after the last\n        // found date or at the last BYMONTHDAY, unless we are\n        // initializing the iterator because in this case we have\n        // to consider the last found date too.\n        while (byMonthDay[dateIdx] <= lastDay &&\n               !(isInit && byMonthDay[dateIdx] == lastDay) &&\n               dateIdx < dateLen - 1) {\n          dateIdx++;\n        }\n      }\n\n      function nextMonth() {\n        // since the day is incremented at the start\n        // of the loop below, we need to start at 0\n        lastDay = 0;\n        self.increment_month();\n        dateIdx = 0;\n        initMonth();\n      }\n\n      initMonth();\n\n      // should come after initMonth\n      if (isInit) {\n        lastDay -= 1;\n      }\n\n      // Use a counter to avoid an infinite loop with malformed rules.\n      // Stop checking after 4 years so we consider also a leap year.\n      var monthsCounter = 48;\n\n      while (!dataIsValid && monthsCounter) {\n        monthsCounter--;\n        // increment the current date. This is really\n        // important otherwise we may fall into the infinite\n        // loop trap. The initial date takes care of the case\n        // where the current date is the date we are looking\n        // for.\n        date = lastDay + 1;\n\n        if (date > daysInMonth) {\n          nextMonth();\n          continue;\n        }\n\n        // find next date\n        var next = byMonthDay[dateIdx++];\n\n        // this logic is dependant on the BYMONTHDAYS\n        // being in order (which is done by #normalizeByMonthDayRules)\n        if (next >= date) {\n          // if the next month day is in the future jump to it.\n          lastDay = next;\n        } else {\n          // in this case the 'next' monthday has past\n          // we must move to the month.\n          nextMonth();\n          continue;\n        }\n\n        // Now we can loop through the day rules to see\n        // if one matches the current month date.\n        for (var dayIdx = 0; dayIdx < dayLen; dayIdx++) {\n          var parts = this.ruleDayOfWeek(byDay[dayIdx]);\n          var pos = parts[0];\n          var dow = parts[1];\n\n          this.last.day = lastDay;\n          if (this.last.isNthWeekDay(dow, pos)) {\n            // when we find the valid one we can mark\n            // the conditions as met and break the loop.\n            // (Because we have this condition above\n            //  it will also break the parent loop).\n            dataIsValid = 1;\n            break;\n          }\n        }\n\n        // Its completely possible that the combination\n        // cannot be matched in the current month.\n        // When we reach the end of possible combinations\n        // in the current month we iterate to the next one.\n        // since dateIdx is incremented right after getting\n        // \"next\", we don't need dateLen -1 here.\n        if (!dataIsValid && dateIdx === dateLen) {\n          nextMonth();\n          continue;\n        }\n      }\n\n      if (monthsCounter <= 0) {\n        // Checked 4 years without finding a Byday that matches\n        // a Bymonthday. Maybe the rule is not correct.\n        throw new Error(\"Malformed values in BYDAY combined with BYMONTHDAY parts\");\n      }\n\n\n      return dataIsValid;\n    },\n\n    next_month: function next_month() {\n      var this_freq = (this.rule.freq == \"MONTHLY\");\n      var data_valid = 1;\n\n      if (this.next_hour() == 0) {\n        return data_valid;\n      }\n\n      if (this.has_by_data(\"BYDAY\") && this.has_by_data(\"BYMONTHDAY\")) {\n        data_valid = this._byDayAndMonthDay();\n      } else if (this.has_by_data(\"BYDAY\")) {\n        var daysInMonth = ICAL.Time.daysInMonth(this.last.month, this.last.year);\n        var setpos = 0;\n        var setpos_total = 0;\n\n        if (this.has_by_data(\"BYSETPOS\")) {\n          var last_day = this.last.day;\n          for (var day = 1; day <= daysInMonth; day++) {\n            this.last.day = day;\n            if (this.is_day_in_byday(this.last)) {\n              setpos_total++;\n              if (day <= last_day) {\n                setpos++;\n              }\n            }\n          }\n          this.last.day = last_day;\n        }\n\n        data_valid = 0;\n        for (var day = this.last.day + 1; day <= daysInMonth; day++) {\n          this.last.day = day;\n\n          if (this.is_day_in_byday(this.last)) {\n            if (!this.has_by_data(\"BYSETPOS\") ||\n                this.check_set_position(++setpos) ||\n                this.check_set_position(setpos - setpos_total - 1)) {\n\n              data_valid = 1;\n              break;\n            }\n          }\n        }\n\n        if (day > daysInMonth) {\n          this.last.day = 1;\n          this.increment_month();\n\n          if (this.is_day_in_byday(this.last)) {\n            if (!this.has_by_data(\"BYSETPOS\") || this.check_set_position(1)) {\n              data_valid = 1;\n            }\n          } else {\n            data_valid = 0;\n          }\n        }\n      } else if (this.has_by_data(\"BYMONTHDAY\")) {\n        this.by_indices.BYMONTHDAY++;\n\n        if (this.by_indices.BYMONTHDAY >= this.by_data.BYMONTHDAY.length) {\n          this.by_indices.BYMONTHDAY = 0;\n          this.increment_month();\n        }\n\n        var daysInMonth = ICAL.Time.daysInMonth(this.last.month, this.last.year);\n        var day = this.by_data.BYMONTHDAY[this.by_indices.BYMONTHDAY];\n\n        if (day < 0) {\n          day = daysInMonth + day + 1;\n        }\n\n        if (day > daysInMonth) {\n          this.last.day = 1;\n          data_valid = this.is_day_in_byday(this.last);\n        } else {\n          this.last.day = day;\n        }\n\n      } else {\n        this.increment_month();\n        var daysInMonth = ICAL.Time.daysInMonth(this.last.month, this.last.year);\n        if (this.by_data.BYMONTHDAY[0] > daysInMonth) {\n          data_valid = 0;\n        } else {\n          this.last.day = this.by_data.BYMONTHDAY[0];\n        }\n      }\n\n      return data_valid;\n    },\n\n    next_weekday_by_week: function next_weekday_by_week() {\n      var end_of_data = 0;\n\n      if (this.next_hour() == 0) {\n        return end_of_data;\n      }\n\n      if (!this.has_by_data(\"BYDAY\")) {\n        return 1;\n      }\n\n      for (;;) {\n        var tt = new ICAL.Time();\n        this.by_indices.BYDAY++;\n\n        if (this.by_indices.BYDAY == Object.keys(this.by_data.BYDAY).length) {\n          this.by_indices.BYDAY = 0;\n          end_of_data = 1;\n        }\n\n        var coded_day = this.by_data.BYDAY[this.by_indices.BYDAY];\n        var parts = this.ruleDayOfWeek(coded_day);\n        var dow = parts[1];\n\n        dow -= this.rule.wkst;\n\n        if (dow < 0) {\n          dow += 7;\n        }\n\n        tt.year = this.last.year;\n        tt.month = this.last.month;\n        tt.day = this.last.day;\n\n        var startOfWeek = tt.startDoyWeek(this.rule.wkst);\n\n        if (dow + startOfWeek < 1) {\n          // The selected date is in the previous year\n          if (!end_of_data) {\n            continue;\n          }\n        }\n\n        var next = ICAL.Time.fromDayOfYear(startOfWeek + dow,\n                                                  this.last.year);\n\n        /**\n         * The normalization horrors below are due to\n         * the fact that when the year/month/day changes\n         * it can effect the other operations that come after.\n         */\n        this.last.year = next.year;\n        this.last.month = next.month;\n        this.last.day = next.day;\n\n        return end_of_data;\n      }\n    },\n\n    next_year: function next_year() {\n\n      if (this.next_hour() == 0) {\n        return 0;\n      }\n\n      if (++this.days_index == this.days.length) {\n        this.days_index = 0;\n        do {\n          this.increment_year(this.rule.interval);\n          this.expand_year_days(this.last.year);\n        } while (this.days.length == 0);\n      }\n\n      this._nextByYearDay();\n\n      return 1;\n    },\n\n    _nextByYearDay: function _nextByYearDay() {\n        var doy = this.days[this.days_index];\n        var year = this.last.year;\n        if (doy < 1) {\n            // Time.fromDayOfYear(doy, year) indexes relative to the\n            // start of the given year. That is different from the\n            // semantics of BYYEARDAY where negative indexes are an\n            // offset from the end of the given year.\n            doy += 1;\n            year += 1;\n        }\n        var next = ICAL.Time.fromDayOfYear(doy, year);\n        this.last.day = next.day;\n        this.last.month = next.month;\n    },\n\n    /**\n     * @param dow (eg: '1TU', '-1MO')\n     * @param {ICAL.Time.weekDay=} aWeekStart The week start weekday\n     * @return [pos, numericDow] (eg: [1, 3]) numericDow is relative to aWeekStart\n     */\n    ruleDayOfWeek: function ruleDayOfWeek(dow, aWeekStart) {\n      var matches = dow.match(/([+-]?[0-9])?(MO|TU|WE|TH|FR|SA|SU)/);\n      if (matches) {\n        var pos = parseInt(matches[1] || 0, 10);\n        dow = ICAL.Recur.icalDayToNumericDay(matches[2], aWeekStart);\n        return [pos, dow];\n      } else {\n        return [0, 0];\n      }\n    },\n\n    next_generic: function next_generic(aRuleType, aInterval, aDateAttr,\n                                        aFollowingAttr, aPreviousIncr) {\n      var has_by_rule = (aRuleType in this.by_data);\n      var this_freq = (this.rule.freq == aInterval);\n      var end_of_data = 0;\n\n      if (aPreviousIncr && this[aPreviousIncr]() == 0) {\n        return end_of_data;\n      }\n\n      if (has_by_rule) {\n        this.by_indices[aRuleType]++;\n        var idx = this.by_indices[aRuleType];\n        var dta = this.by_data[aRuleType];\n\n        if (this.by_indices[aRuleType] == dta.length) {\n          this.by_indices[aRuleType] = 0;\n          end_of_data = 1;\n        }\n        this.last[aDateAttr] = dta[this.by_indices[aRuleType]];\n      } else if (this_freq) {\n        this[\"increment_\" + aDateAttr](this.rule.interval);\n      }\n\n      if (has_by_rule && end_of_data && this_freq) {\n        this[\"increment_\" + aFollowingAttr](1);\n      }\n\n      return end_of_data;\n    },\n\n    increment_monthday: function increment_monthday(inc) {\n      for (var i = 0; i < inc; i++) {\n        var daysInMonth = ICAL.Time.daysInMonth(this.last.month, this.last.year);\n        this.last.day++;\n\n        if (this.last.day > daysInMonth) {\n          this.last.day -= daysInMonth;\n          this.increment_month();\n        }\n      }\n    },\n\n    increment_month: function increment_month() {\n      this.last.day = 1;\n      if (this.has_by_data(\"BYMONTH\")) {\n        this.by_indices.BYMONTH++;\n\n        if (this.by_indices.BYMONTH == this.by_data.BYMONTH.length) {\n          this.by_indices.BYMONTH = 0;\n          this.increment_year(1);\n        }\n\n        this.last.month = this.by_data.BYMONTH[this.by_indices.BYMONTH];\n      } else {\n        if (this.rule.freq == \"MONTHLY\") {\n          this.last.month += this.rule.interval;\n        } else {\n          this.last.month++;\n        }\n\n        this.last.month--;\n        var years = ICAL.helpers.trunc(this.last.month / 12);\n        this.last.month %= 12;\n        this.last.month++;\n\n        if (years != 0) {\n          this.increment_year(years);\n        }\n      }\n    },\n\n    increment_year: function increment_year(inc) {\n      this.last.year += inc;\n    },\n\n    increment_generic: function increment_generic(inc, aDateAttr,\n                                                  aFactor, aNextIncrement) {\n      this.last[aDateAttr] += inc;\n      var nextunit = ICAL.helpers.trunc(this.last[aDateAttr] / aFactor);\n      this.last[aDateAttr] %= aFactor;\n      if (nextunit != 0) {\n        this[\"increment_\" + aNextIncrement](nextunit);\n      }\n    },\n\n    has_by_data: function has_by_data(aRuleType) {\n      return (aRuleType in this.rule.parts);\n    },\n\n    expand_year_days: function expand_year_days(aYear) {\n      var t = new ICAL.Time();\n      this.days = [];\n\n      // We need our own copy with a few keys set\n      var parts = {};\n      var rules = [\"BYDAY\", \"BYWEEKNO\", \"BYMONTHDAY\", \"BYMONTH\", \"BYYEARDAY\"];\n      for (var p in rules) {\n        /* istanbul ignore else */\n        if (rules.hasOwnProperty(p)) {\n          var part = rules[p];\n          if (part in this.rule.parts) {\n            parts[part] = this.rule.parts[part];\n          }\n        }\n      }\n\n      if (\"BYMONTH\" in parts && \"BYWEEKNO\" in parts) {\n        var valid = 1;\n        var validWeeks = {};\n        t.year = aYear;\n        t.isDate = true;\n\n        for (var monthIdx = 0; monthIdx < this.by_data.BYMONTH.length; monthIdx++) {\n          var month = this.by_data.BYMONTH[monthIdx];\n          t.month = month;\n          t.day = 1;\n          var first_week = t.weekNumber(this.rule.wkst);\n          t.day = ICAL.Time.daysInMonth(month, aYear);\n          var last_week = t.weekNumber(this.rule.wkst);\n          for (monthIdx = first_week; monthIdx < last_week; monthIdx++) {\n            validWeeks[monthIdx] = 1;\n          }\n        }\n\n        for (var weekIdx = 0; weekIdx < this.by_data.BYWEEKNO.length && valid; weekIdx++) {\n          var weekno = this.by_data.BYWEEKNO[weekIdx];\n          if (weekno < 52) {\n            valid &= validWeeks[weekIdx];\n          } else {\n            valid = 0;\n          }\n        }\n\n        if (valid) {\n          delete parts.BYMONTH;\n        } else {\n          delete parts.BYWEEKNO;\n        }\n      }\n\n      var partCount = Object.keys(parts).length;\n\n      if (partCount == 0) {\n        var t1 = this.dtstart.clone();\n        t1.year = this.last.year;\n        this.days.push(t1.dayOfYear());\n      } else if (partCount == 1 && \"BYMONTH\" in parts) {\n        for (var monthkey in this.by_data.BYMONTH) {\n          /* istanbul ignore if */\n          if (!this.by_data.BYMONTH.hasOwnProperty(monthkey)) {\n            continue;\n          }\n          var t2 = this.dtstart.clone();\n          t2.year = aYear;\n          t2.month = this.by_data.BYMONTH[monthkey];\n          t2.isDate = true;\n          this.days.push(t2.dayOfYear());\n        }\n      } else if (partCount == 1 && \"BYMONTHDAY\" in parts) {\n        for (var monthdaykey in this.by_data.BYMONTHDAY) {\n          /* istanbul ignore if */\n          if (!this.by_data.BYMONTHDAY.hasOwnProperty(monthdaykey)) {\n            continue;\n          }\n          var t3 = this.dtstart.clone();\n          var day_ = this.by_data.BYMONTHDAY[monthdaykey];\n          if (day_ < 0) {\n            var daysInMonth = ICAL.Time.daysInMonth(t3.month, aYear);\n            day_ = day_ + daysInMonth + 1;\n          }\n          t3.day = day_;\n          t3.year = aYear;\n          t3.isDate = true;\n          this.days.push(t3.dayOfYear());\n        }\n      } else if (partCount == 2 &&\n                 \"BYMONTHDAY\" in parts &&\n                 \"BYMONTH\" in parts) {\n        for (var monthkey in this.by_data.BYMONTH) {\n          /* istanbul ignore if */\n          if (!this.by_data.BYMONTH.hasOwnProperty(monthkey)) {\n            continue;\n          }\n          var month_ = this.by_data.BYMONTH[monthkey];\n          var daysInMonth = ICAL.Time.daysInMonth(month_, aYear);\n          for (var monthdaykey in this.by_data.BYMONTHDAY) {\n            /* istanbul ignore if */\n            if (!this.by_data.BYMONTHDAY.hasOwnProperty(monthdaykey)) {\n              continue;\n            }\n            var day_ = this.by_data.BYMONTHDAY[monthdaykey];\n            if (day_ < 0) {\n              day_ = day_ + daysInMonth + 1;\n            }\n            t.day = day_;\n            t.month = month_;\n            t.year = aYear;\n            t.isDate = true;\n\n            this.days.push(t.dayOfYear());\n          }\n        }\n      } else if (partCount == 1 && \"BYWEEKNO\" in parts) {\n        // TODO unimplemented in libical\n      } else if (partCount == 2 &&\n                 \"BYWEEKNO\" in parts &&\n                 \"BYMONTHDAY\" in parts) {\n        // TODO unimplemented in libical\n      } else if (partCount == 1 && \"BYDAY\" in parts) {\n        this.days = this.days.concat(this.expand_by_day(aYear));\n      } else if (partCount == 2 && \"BYDAY\" in parts && \"BYMONTH\" in parts) {\n        for (var monthkey in this.by_data.BYMONTH) {\n          /* istanbul ignore if */\n          if (!this.by_data.BYMONTH.hasOwnProperty(monthkey)) {\n            continue;\n          }\n          var month = this.by_data.BYMONTH[monthkey];\n          var daysInMonth = ICAL.Time.daysInMonth(month, aYear);\n\n          t.year = aYear;\n          t.month = this.by_data.BYMONTH[monthkey];\n          t.day = 1;\n          t.isDate = true;\n\n          var first_dow = t.dayOfWeek();\n          var doy_offset = t.dayOfYear() - 1;\n\n          t.day = daysInMonth;\n          var last_dow = t.dayOfWeek();\n\n          if (this.has_by_data(\"BYSETPOS\")) {\n            var set_pos_counter = 0;\n            var by_month_day = [];\n            for (var day = 1; day <= daysInMonth; day++) {\n              t.day = day;\n              if (this.is_day_in_byday(t)) {\n                by_month_day.push(day);\n              }\n            }\n\n            for (var spIndex = 0; spIndex < by_month_day.length; spIndex++) {\n              if (this.check_set_position(spIndex + 1) ||\n                  this.check_set_position(spIndex - by_month_day.length)) {\n                this.days.push(doy_offset + by_month_day[spIndex]);\n              }\n            }\n          } else {\n            for (var daycodedkey in this.by_data.BYDAY) {\n              /* istanbul ignore if */\n              if (!this.by_data.BYDAY.hasOwnProperty(daycodedkey)) {\n                continue;\n              }\n              var coded_day = this.by_data.BYDAY[daycodedkey];\n              var bydayParts = this.ruleDayOfWeek(coded_day);\n              var pos = bydayParts[0];\n              var dow = bydayParts[1];\n              var month_day;\n\n              var first_matching_day = ((dow + 7 - first_dow) % 7) + 1;\n              var last_matching_day = daysInMonth - ((last_dow + 7 - dow) % 7);\n\n              if (pos == 0) {\n                for (var day = first_matching_day; day <= daysInMonth; day += 7) {\n                  this.days.push(doy_offset + day);\n                }\n              } else if (pos > 0) {\n                month_day = first_matching_day + (pos - 1) * 7;\n\n                if (month_day <= daysInMonth) {\n                  this.days.push(doy_offset + month_day);\n                }\n              } else {\n                month_day = last_matching_day + (pos + 1) * 7;\n\n                if (month_day > 0) {\n                  this.days.push(doy_offset + month_day);\n                }\n              }\n            }\n          }\n        }\n        // Return dates in order of occurrence (1,2,3,...) instead\n        // of by groups of weekdays (1,8,15,...,2,9,16,...).\n        this.days.sort(function(a, b) { return a - b; }); // Comparator function allows to sort numbers.\n      } else if (partCount == 2 && \"BYDAY\" in parts && \"BYMONTHDAY\" in parts) {\n        var expandedDays = this.expand_by_day(aYear);\n\n        for (var daykey in expandedDays) {\n          /* istanbul ignore if */\n          if (!expandedDays.hasOwnProperty(daykey)) {\n            continue;\n          }\n          var day = expandedDays[daykey];\n          var tt = ICAL.Time.fromDayOfYear(day, aYear);\n          if (this.by_data.BYMONTHDAY.indexOf(tt.day) >= 0) {\n            this.days.push(day);\n          }\n        }\n      } else if (partCount == 3 &&\n                 \"BYDAY\" in parts &&\n                 \"BYMONTHDAY\" in parts &&\n                 \"BYMONTH\" in parts) {\n        var expandedDays = this.expand_by_day(aYear);\n\n        for (var daykey in expandedDays) {\n          /* istanbul ignore if */\n          if (!expandedDays.hasOwnProperty(daykey)) {\n            continue;\n          }\n          var day = expandedDays[daykey];\n          var tt = ICAL.Time.fromDayOfYear(day, aYear);\n\n          if (this.by_data.BYMONTH.indexOf(tt.month) >= 0 &&\n              this.by_data.BYMONTHDAY.indexOf(tt.day) >= 0) {\n            this.days.push(day);\n          }\n        }\n      } else if (partCount == 2 && \"BYDAY\" in parts && \"BYWEEKNO\" in parts) {\n        var expandedDays = this.expand_by_day(aYear);\n\n        for (var daykey in expandedDays) {\n          /* istanbul ignore if */\n          if (!expandedDays.hasOwnProperty(daykey)) {\n            continue;\n          }\n          var day = expandedDays[daykey];\n          var tt = ICAL.Time.fromDayOfYear(day, aYear);\n          var weekno = tt.weekNumber(this.rule.wkst);\n\n          if (this.by_data.BYWEEKNO.indexOf(weekno)) {\n            this.days.push(day);\n          }\n        }\n      } else if (partCount == 3 &&\n                 \"BYDAY\" in parts &&\n                 \"BYWEEKNO\" in parts &&\n                 \"BYMONTHDAY\" in parts) {\n        // TODO unimplemted in libical\n      } else if (partCount == 1 && \"BYYEARDAY\" in parts) {\n        this.days = this.days.concat(this.by_data.BYYEARDAY);\n      } else {\n        this.days = [];\n      }\n      return 0;\n    },\n\n    expand_by_day: function expand_by_day(aYear) {\n\n      var days_list = [];\n      var tmp = this.last.clone();\n\n      tmp.year = aYear;\n      tmp.month = 1;\n      tmp.day = 1;\n      tmp.isDate = true;\n\n      var start_dow = tmp.dayOfWeek();\n\n      tmp.month = 12;\n      tmp.day = 31;\n      tmp.isDate = true;\n\n      var end_dow = tmp.dayOfWeek();\n      var end_year_day = tmp.dayOfYear();\n\n      for (var daykey in this.by_data.BYDAY) {\n        /* istanbul ignore if */\n        if (!this.by_data.BYDAY.hasOwnProperty(daykey)) {\n          continue;\n        }\n        var day = this.by_data.BYDAY[daykey];\n        var parts = this.ruleDayOfWeek(day);\n        var pos = parts[0];\n        var dow = parts[1];\n\n        if (pos == 0) {\n          var tmp_start_doy = ((dow + 7 - start_dow) % 7) + 1;\n\n          for (var doy = tmp_start_doy; doy <= end_year_day; doy += 7) {\n            days_list.push(doy);\n          }\n\n        } else if (pos > 0) {\n          var first;\n          if (dow >= start_dow) {\n            first = dow - start_dow + 1;\n          } else {\n            first = dow - start_dow + 8;\n          }\n\n          days_list.push(first + (pos - 1) * 7);\n        } else {\n          var last;\n          pos = -pos;\n\n          if (dow <= end_dow) {\n            last = end_year_day - end_dow + dow;\n          } else {\n            last = end_year_day - end_dow + dow - 7;\n          }\n\n          days_list.push(last - (pos - 1) * 7);\n        }\n      }\n      return days_list;\n    },\n\n    is_day_in_byday: function is_day_in_byday(tt) {\n      for (var daykey in this.by_data.BYDAY) {\n        /* istanbul ignore if */\n        if (!this.by_data.BYDAY.hasOwnProperty(daykey)) {\n          continue;\n        }\n        var day = this.by_data.BYDAY[daykey];\n        var parts = this.ruleDayOfWeek(day);\n        var pos = parts[0];\n        var dow = parts[1];\n        var this_dow = tt.dayOfWeek();\n\n        if ((pos == 0 && dow == this_dow) ||\n            (tt.nthWeekDay(dow, pos) == tt.day)) {\n          return 1;\n        }\n      }\n\n      return 0;\n    },\n\n    /**\n     * Checks if given value is in BYSETPOS.\n     *\n     * @private\n     * @param {Numeric} aPos position to check for.\n     * @return {Boolean} false unless BYSETPOS rules exist\n     *                   and the given value is present in rules.\n     */\n    check_set_position: function check_set_position(aPos) {\n      if (this.has_by_data('BYSETPOS')) {\n        var idx = this.by_data.BYSETPOS.indexOf(aPos);\n        // negative numbers are not false-y\n        return idx !== -1;\n      }\n      return false;\n    },\n\n    sort_byday_rules: function icalrecur_sort_byday_rules(aRules) {\n      for (var i = 0; i < aRules.length; i++) {\n        for (var j = 0; j < i; j++) {\n          var one = this.ruleDayOfWeek(aRules[j], this.rule.wkst)[1];\n          var two = this.ruleDayOfWeek(aRules[i], this.rule.wkst)[1];\n\n          if (one > two) {\n            var tmp = aRules[i];\n            aRules[i] = aRules[j];\n            aRules[j] = tmp;\n          }\n        }\n      }\n    },\n\n    check_contract_restriction: function check_contract_restriction(aRuleType, v) {\n      var indexMapValue = icalrecur_iterator._indexMap[aRuleType];\n      var ruleMapValue = icalrecur_iterator._expandMap[this.rule.freq][indexMapValue];\n      var pass = false;\n\n      if (aRuleType in this.by_data &&\n          ruleMapValue == icalrecur_iterator.CONTRACT) {\n\n        var ruleType = this.by_data[aRuleType];\n\n        for (var bydatakey in ruleType) {\n          /* istanbul ignore else */\n          if (ruleType.hasOwnProperty(bydatakey)) {\n            if (ruleType[bydatakey] == v) {\n              pass = true;\n              break;\n            }\n          }\n        }\n      } else {\n        // Not a contracting byrule or has no data, test passes\n        pass = true;\n      }\n      return pass;\n    },\n\n    check_contracting_rules: function check_contracting_rules() {\n      var dow = this.last.dayOfWeek();\n      var weekNo = this.last.weekNumber(this.rule.wkst);\n      var doy = this.last.dayOfYear();\n\n      return (this.check_contract_restriction(\"BYSECOND\", this.last.second) &&\n              this.check_contract_restriction(\"BYMINUTE\", this.last.minute) &&\n              this.check_contract_restriction(\"BYHOUR\", this.last.hour) &&\n              this.check_contract_restriction(\"BYDAY\", ICAL.Recur.numericDayToIcalDay(dow)) &&\n              this.check_contract_restriction(\"BYWEEKNO\", weekNo) &&\n              this.check_contract_restriction(\"BYMONTHDAY\", this.last.day) &&\n              this.check_contract_restriction(\"BYMONTH\", this.last.month) &&\n              this.check_contract_restriction(\"BYYEARDAY\", doy));\n    },\n\n    setup_defaults: function setup_defaults(aRuleType, req, deftime) {\n      var indexMapValue = icalrecur_iterator._indexMap[aRuleType];\n      var ruleMapValue = icalrecur_iterator._expandMap[this.rule.freq][indexMapValue];\n\n      if (ruleMapValue != icalrecur_iterator.CONTRACT) {\n        if (!(aRuleType in this.by_data)) {\n          this.by_data[aRuleType] = [deftime];\n        }\n        if (this.rule.freq != req) {\n          return this.by_data[aRuleType][0];\n        }\n      }\n      return deftime;\n    },\n\n    /**\n     * Convert iterator into a serialize-able object.  Will preserve current\n     * iteration sequence to ensure the seamless continuation of the recurrence\n     * rule.\n     * @return {Object}\n     */\n    toJSON: function() {\n      var result = Object.create(null);\n\n      result.initialized = this.initialized;\n      result.rule = this.rule.toJSON();\n      result.dtstart = this.dtstart.toJSON();\n      result.by_data = this.by_data;\n      result.days = this.days;\n      result.last = this.last.toJSON();\n      result.by_indices = this.by_indices;\n      result.occurrence_number = this.occurrence_number;\n\n      return result;\n    }\n  };\n\n  icalrecur_iterator._indexMap = {\n    \"BYSECOND\": 0,\n    \"BYMINUTE\": 1,\n    \"BYHOUR\": 2,\n    \"BYDAY\": 3,\n    \"BYMONTHDAY\": 4,\n    \"BYYEARDAY\": 5,\n    \"BYWEEKNO\": 6,\n    \"BYMONTH\": 7,\n    \"BYSETPOS\": 8\n  };\n\n  icalrecur_iterator._expandMap = {\n    \"SECONDLY\": [1, 1, 1, 1, 1, 1, 1, 1],\n    \"MINUTELY\": [2, 1, 1, 1, 1, 1, 1, 1],\n    \"HOURLY\": [2, 2, 1, 1, 1, 1, 1, 1],\n    \"DAILY\": [2, 2, 2, 1, 1, 1, 1, 1],\n    \"WEEKLY\": [2, 2, 2, 2, 3, 3, 1, 1],\n    \"MONTHLY\": [2, 2, 2, 2, 2, 3, 3, 1],\n    \"YEARLY\": [2, 2, 2, 2, 2, 2, 2, 2]\n  };\n  icalrecur_iterator.UNKNOWN = 0;\n  icalrecur_iterator.CONTRACT = 1;\n  icalrecur_iterator.EXPAND = 2;\n  icalrecur_iterator.ILLEGAL = 3;\n\n  return icalrecur_iterator;\n\n}());\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n/**\n * This symbol is further described later on\n * @ignore\n */\nICAL.RecurExpansion = (function() {\n  function formatTime(item) {\n    return ICAL.helpers.formatClassType(item, ICAL.Time);\n  }\n\n  function compareTime(a, b) {\n    return a.compare(b);\n  }\n\n  function isRecurringComponent(comp) {\n    return comp.hasProperty('rdate') ||\n           comp.hasProperty('rrule') ||\n           comp.hasProperty('recurrence-id');\n  }\n\n  /**\n   * @classdesc\n   * Primary class for expanding recurring rules.  Can take multiple rrules,\n   * rdates, exdate(s) and iterate (in order) over each next occurrence.\n   *\n   * Once initialized this class can also be serialized saved and continue\n   * iteration from the last point.\n   *\n   * NOTE: it is intended that this class is to be used\n   *       with ICAL.Event which handles recurrence exceptions.\n   *\n   * @example\n   * // assuming event is a parsed ical component\n   * var event;\n   *\n   * var expand = new ICAL.RecurExpansion({\n   *   component: event,\n   *   dtstart: event.getFirstPropertyValue('dtstart')\n   * });\n   *\n   * // remember there are infinite rules\n   * // so its a good idea to limit the scope\n   * // of the iterations then resume later on.\n   *\n   * // next is always an ICAL.Time or null\n   * var next;\n   *\n   * while (someCondition && (next = expand.next())) {\n   *   // do something with next\n   * }\n   *\n   * // save instance for later\n   * var json = JSON.stringify(expand);\n   *\n   * //...\n   *\n   * // NOTE: if the component's properties have\n   * //       changed you will need to rebuild the\n   * //       class and start over. This only works\n   * //       when the component's recurrence info is the same.\n   * var expand = new ICAL.RecurExpansion(JSON.parse(json));\n   *\n   * @description\n   * The options object can be filled with the specified initial values. It can\n   * also contain additional members, as a result of serializing a previous\n   * expansion state, as shown in the example.\n   *\n   * @class\n   * @alias ICAL.RecurExpansion\n   * @param {Object} options\n   *        Recurrence expansion options\n   * @param {ICAL.Time} options.dtstart\n   *        Start time of the event\n   * @param {ICAL.Component=} options.component\n   *        Component for expansion, required if not resuming.\n   */\n  function RecurExpansion(options) {\n    this.ruleDates = [];\n    this.exDates = [];\n    this.fromData(options);\n  }\n\n  RecurExpansion.prototype = {\n    /**\n     * True when iteration is fully completed.\n     * @type {Boolean}\n     */\n    complete: false,\n\n    /**\n     * Array of rrule iterators.\n     *\n     * @type {ICAL.RecurIterator[]}\n     * @private\n     */\n    ruleIterators: null,\n\n    /**\n     * Array of rdate instances.\n     *\n     * @type {ICAL.Time[]}\n     * @private\n     */\n    ruleDates: null,\n\n    /**\n     * Array of exdate instances.\n     *\n     * @type {ICAL.Time[]}\n     * @private\n     */\n    exDates: null,\n\n    /**\n     * Current position in ruleDates array.\n     * @type {Number}\n     * @private\n     */\n    ruleDateInc: 0,\n\n    /**\n     * Current position in exDates array\n     * @type {Number}\n     * @private\n     */\n    exDateInc: 0,\n\n    /**\n     * Current negative date.\n     *\n     * @type {ICAL.Time}\n     * @private\n     */\n    exDate: null,\n\n    /**\n     * Current additional date.\n     *\n     * @type {ICAL.Time}\n     * @private\n     */\n    ruleDate: null,\n\n    /**\n     * Start date of recurring rules.\n     *\n     * @type {ICAL.Time}\n     */\n    dtstart: null,\n\n    /**\n     * Last expanded time\n     *\n     * @type {ICAL.Time}\n     */\n    last: null,\n\n    /**\n     * Initialize the recurrence expansion from the data object. The options\n     * object may also contain additional members, see the\n     * {@link ICAL.RecurExpansion constructor} for more details.\n     *\n     * @param {Object} options\n     *        Recurrence expansion options\n     * @param {ICAL.Time} options.dtstart\n     *        Start time of the event\n     * @param {ICAL.Component=} options.component\n     *        Component for expansion, required if not resuming.\n     */\n    fromData: function(options) {\n      var start = ICAL.helpers.formatClassType(options.dtstart, ICAL.Time);\n\n      if (!start) {\n        throw new Error('.dtstart (ICAL.Time) must be given');\n      } else {\n        this.dtstart = start;\n      }\n\n      if (options.component) {\n        this._init(options.component);\n      } else {\n        this.last = formatTime(options.last) || start.clone();\n\n        if (!options.ruleIterators) {\n          throw new Error('.ruleIterators or .component must be given');\n        }\n\n        this.ruleIterators = options.ruleIterators.map(function(item) {\n          return ICAL.helpers.formatClassType(item, ICAL.RecurIterator);\n        });\n\n        this.ruleDateInc = options.ruleDateInc;\n        this.exDateInc = options.exDateInc;\n\n        if (options.ruleDates) {\n          this.ruleDates = options.ruleDates.map(formatTime);\n          this.ruleDate = this.ruleDates[this.ruleDateInc];\n        }\n\n        if (options.exDates) {\n          this.exDates = options.exDates.map(formatTime);\n          this.exDate = this.exDates[this.exDateInc];\n        }\n\n        if (typeof(options.complete) !== 'undefined') {\n          this.complete = options.complete;\n        }\n      }\n    },\n\n    /**\n     * Retrieve the next occurrence in the series.\n     * @return {ICAL.Time}\n     */\n    next: function() {\n      var iter;\n      var ruleOfDay;\n      var next;\n      var compare;\n\n      var maxTries = 500;\n      var currentTry = 0;\n\n      while (true) {\n        if (currentTry++ > maxTries) {\n          throw new Error(\n            'max tries have occured, rule may be impossible to forfill.'\n          );\n        }\n\n        next = this.ruleDate;\n        iter = this._nextRecurrenceIter(this.last);\n\n        // no more matches\n        // because we increment the rule day or rule\n        // _after_ we choose a value this should be\n        // the only spot where we need to worry about the\n        // end of events.\n        if (!next && !iter) {\n          // there are no more iterators or rdates\n          this.complete = true;\n          break;\n        }\n\n        // no next rule day or recurrence rule is first.\n        if (!next || (iter && next.compare(iter.last) > 0)) {\n          // must be cloned, recur will reuse the time element.\n          next = iter.last.clone();\n          // move to next so we can continue\n          iter.next();\n        }\n\n        // if the ruleDate is still next increment it.\n        if (this.ruleDate === next) {\n          this._nextRuleDay();\n        }\n\n        this.last = next;\n\n        // check the negative rules\n        if (this.exDate) {\n          compare = this.exDate.compare(this.last);\n\n          if (compare < 0) {\n            this._nextExDay();\n          }\n\n          // if the current rule is excluded skip it.\n          if (compare === 0) {\n            this._nextExDay();\n            continue;\n          }\n        }\n\n        //XXX: The spec states that after we resolve the final\n        //     list of dates we execute exdate this seems somewhat counter\n        //     intuitive to what I have seen most servers do so for now\n        //     I exclude based on the original date not the one that may\n        //     have been modified by the exception.\n        return this.last;\n      }\n    },\n\n    /**\n     * Converts object into a serialize-able format. This format can be passed\n     * back into the expansion to resume iteration.\n     * @return {Object}\n     */\n    toJSON: function() {\n      function toJSON(item) {\n        return item.toJSON();\n      }\n\n      var result = Object.create(null);\n      result.ruleIterators = this.ruleIterators.map(toJSON);\n\n      if (this.ruleDates) {\n        result.ruleDates = this.ruleDates.map(toJSON);\n      }\n\n      if (this.exDates) {\n        result.exDates = this.exDates.map(toJSON);\n      }\n\n      result.ruleDateInc = this.ruleDateInc;\n      result.exDateInc = this.exDateInc;\n      result.last = this.last.toJSON();\n      result.dtstart = this.dtstart.toJSON();\n      result.complete = this.complete;\n\n      return result;\n    },\n\n    /**\n     * Extract all dates from the properties in the given component. The\n     * properties will be filtered by the property name.\n     *\n     * @private\n     * @param {ICAL.Component} component        The component to search in\n     * @param {String} propertyName             The property name to search for\n     * @return {ICAL.Time[]}                    The extracted dates.\n     */\n    _extractDates: function(component, propertyName) {\n      function handleProp(prop) {\n        idx = ICAL.helpers.binsearchInsert(\n          result,\n          prop,\n          compareTime\n        );\n\n        // ordered insert\n        result.splice(idx, 0, prop);\n      }\n\n      var result = [];\n      var props = component.getAllProperties(propertyName);\n      var len = props.length;\n      var i = 0;\n      var prop;\n\n      var idx;\n\n      for (; i < len; i++) {\n        props[i].getValues().forEach(handleProp);\n      }\n\n      return result;\n    },\n\n    /**\n     * Initialize the recurrence expansion.\n     *\n     * @private\n     * @param {ICAL.Component} component    The component to initialize from.\n     */\n    _init: function(component) {\n      this.ruleIterators = [];\n\n      this.last = this.dtstart.clone();\n\n      // to provide api consistency non-recurring\n      // events can also use the iterator though it will\n      // only return a single time.\n      if (!isRecurringComponent(component)) {\n        this.ruleDate = this.last.clone();\n        this.complete = true;\n        return;\n      }\n\n      if (component.hasProperty('rdate')) {\n        this.ruleDates = this._extractDates(component, 'rdate');\n\n        // special hack for cases where first rdate is prior\n        // to the start date. We only check for the first rdate.\n        // This is mostly for google's crazy recurring date logic\n        // (contacts birthdays).\n        if ((this.ruleDates[0]) &&\n            (this.ruleDates[0].compare(this.dtstart) < 0)) {\n\n          this.ruleDateInc = 0;\n          this.last = this.ruleDates[0].clone();\n        } else {\n          this.ruleDateInc = ICAL.helpers.binsearchInsert(\n            this.ruleDates,\n            this.last,\n            compareTime\n          );\n        }\n\n        this.ruleDate = this.ruleDates[this.ruleDateInc];\n      }\n\n      if (component.hasProperty('rrule')) {\n        var rules = component.getAllProperties('rrule');\n        var i = 0;\n        var len = rules.length;\n\n        var rule;\n        var iter;\n\n        for (; i < len; i++) {\n          rule = rules[i].getFirstValue();\n          iter = rule.iterator(this.dtstart);\n          this.ruleIterators.push(iter);\n\n          // increment to the next occurrence so future\n          // calls to next return times beyond the initial iteration.\n          // XXX: I find this suspicious might be a bug?\n          iter.next();\n        }\n      }\n\n      if (component.hasProperty('exdate')) {\n        this.exDates = this._extractDates(component, 'exdate');\n        // if we have a .last day we increment the index to beyond it.\n        this.exDateInc = ICAL.helpers.binsearchInsert(\n          this.exDates,\n          this.last,\n          compareTime\n        );\n\n        this.exDate = this.exDates[this.exDateInc];\n      }\n    },\n\n    /**\n     * Advance to the next exdate\n     * @private\n     */\n    _nextExDay: function() {\n      this.exDate = this.exDates[++this.exDateInc];\n    },\n\n    /**\n     * Advance to the next rule date\n     * @private\n     */\n    _nextRuleDay: function() {\n      this.ruleDate = this.ruleDates[++this.ruleDateInc];\n    },\n\n    /**\n     * Find and return the recurrence rule with the most recent event and\n     * return it.\n     *\n     * @private\n     * @return {?ICAL.RecurIterator}    Found iterator.\n     */\n    _nextRecurrenceIter: function() {\n      var iters = this.ruleIterators;\n\n      if (iters.length === 0) {\n        return null;\n      }\n\n      var len = iters.length;\n      var iter;\n      var iterTime;\n      var iterIdx = 0;\n      var chosenIter;\n\n      // loop through each iterator\n      for (; iterIdx < len; iterIdx++) {\n        iter = iters[iterIdx];\n        iterTime = iter.last;\n\n        // if iteration is complete\n        // then we must exclude it from\n        // the search and remove it.\n        if (iter.completed) {\n          len--;\n          if (iterIdx !== 0) {\n            iterIdx--;\n          }\n          iters.splice(iterIdx, 1);\n          continue;\n        }\n\n        // find the most recent possible choice\n        if (!chosenIter || chosenIter.last.compare(iterTime) > 0) {\n          // that iterator is saved\n          chosenIter = iter;\n        }\n      }\n\n      // the chosen iterator is returned but not mutated\n      // this iterator contains the most recent event.\n      return chosenIter;\n    }\n  };\n\n  return RecurExpansion;\n}());\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n/**\n * This symbol is further described later on\n * @ignore\n */\nICAL.Event = (function() {\n\n  /**\n   * @classdesc\n   * ICAL.js is organized into multiple layers. The bottom layer is a raw jCal\n   * object, followed by the component/property layer. The highest level is the\n   * event representation, which this class is part of. See the\n   * {@tutorial layers} guide for more details.\n   *\n   * @class\n   * @alias ICAL.Event\n   * @param {ICAL.Component=} component         The ICAL.Component to base this event on\n   * @param {Object} options                    Options for this event\n   * @param {Boolean} options.strictExceptions\n   *          When true, will verify exceptions are related by their UUID\n   * @param {Array<ICAL.Component|ICAL.Event>} options.exceptions\n   *          Exceptions to this event, either as components or events. If not\n   *            specified exceptions will automatically be set in relation of\n   *            component's parent\n   */\n  function Event(component, options) {\n    if (!(component instanceof ICAL.Component)) {\n      options = component;\n      component = null;\n    }\n\n    if (component) {\n      this.component = component;\n    } else {\n      this.component = new ICAL.Component('vevent');\n    }\n\n    this._rangeExceptionCache = Object.create(null);\n    this.exceptions = Object.create(null);\n    this.rangeExceptions = [];\n\n    if (options && options.strictExceptions) {\n      this.strictExceptions = options.strictExceptions;\n    }\n\n    if (options && options.exceptions) {\n      options.exceptions.forEach(this.relateException, this);\n    } else if (this.component.parent && !this.isRecurrenceException()) {\n      this.component.parent.getAllSubcomponents('vevent').forEach(function(event) {\n        if (event.hasProperty('recurrence-id')) {\n          this.relateException(event);\n        }\n      }, this);\n    }\n  }\n\n  Event.prototype = {\n\n    THISANDFUTURE: 'THISANDFUTURE',\n\n    /**\n     * List of related event exceptions.\n     *\n     * @type {ICAL.Event[]}\n     */\n    exceptions: null,\n\n    /**\n     * When true, will verify exceptions are related by their UUID.\n     *\n     * @type {Boolean}\n     */\n    strictExceptions: false,\n\n    /**\n     * Relates a given event exception to this object.  If the given component\n     * does not share the UID of this event it cannot be related and will throw\n     * an exception.\n     *\n     * If this component is an exception it cannot have other exceptions\n     * related to it.\n     *\n     * @param {ICAL.Component|ICAL.Event} obj       Component or event\n     */\n    relateException: function(obj) {\n      if (this.isRecurrenceException()) {\n        throw new Error('cannot relate exception to exceptions');\n      }\n\n      if (obj instanceof ICAL.Component) {\n        obj = new ICAL.Event(obj);\n      }\n\n      if (this.strictExceptions && obj.uid !== this.uid) {\n        throw new Error('attempted to relate unrelated exception');\n      }\n\n      var id = obj.recurrenceId.toString();\n\n      // we don't sort or manage exceptions directly\n      // here the recurrence expander handles that.\n      this.exceptions[id] = obj;\n\n      // index RANGE=THISANDFUTURE exceptions so we can\n      // look them up later in getOccurrenceDetails.\n      if (obj.modifiesFuture()) {\n        var item = [\n          obj.recurrenceId.toUnixTime(), id\n        ];\n\n        // we keep them sorted so we can find the nearest\n        // value later on...\n        var idx = ICAL.helpers.binsearchInsert(\n          this.rangeExceptions,\n          item,\n          compareRangeException\n        );\n\n        this.rangeExceptions.splice(idx, 0, item);\n      }\n    },\n\n    /**\n     * Checks if this record is an exception and has the RANGE=THISANDFUTURE\n     * value.\n     *\n     * @return {Boolean}        True, when exception is within range\n     */\n    modifiesFuture: function() {\n      if (!this.component.hasProperty('recurrence-id')) {\n        return false;\n      }\n\n      var range = this.component.getFirstProperty('recurrence-id').getParameter('range');\n      return range === this.THISANDFUTURE;\n    },\n\n    /**\n     * Finds the range exception nearest to the given date.\n     *\n     * @param {ICAL.Time} time usually an occurrence time of an event\n     * @return {?ICAL.Event} the related event/exception or null\n     */\n    findRangeException: function(time) {\n      if (!this.rangeExceptions.length) {\n        return null;\n      }\n\n      var utc = time.toUnixTime();\n      var idx = ICAL.helpers.binsearchInsert(\n        this.rangeExceptions,\n        [utc],\n        compareRangeException\n      );\n\n      idx -= 1;\n\n      // occurs before\n      if (idx < 0) {\n        return null;\n      }\n\n      var rangeItem = this.rangeExceptions[idx];\n\n      /* istanbul ignore next: sanity check only */\n      if (utc < rangeItem[0]) {\n        return null;\n      }\n\n      return rangeItem[1];\n    },\n\n    /**\n     * This object is returned by {@link ICAL.Event#getOccurrenceDetails getOccurrenceDetails}\n     *\n     * @typedef {Object} occurrenceDetails\n     * @memberof ICAL.Event\n     * @property {ICAL.Time} recurrenceId       The passed in recurrence id\n     * @property {ICAL.Event} item              The occurrence\n     * @property {ICAL.Time} startDate          The start of the occurrence\n     * @property {ICAL.Time} endDate            The end of the occurrence\n     */\n\n    /**\n     * Returns the occurrence details based on its start time.  If the\n     * occurrence has an exception will return the details for that exception.\n     *\n     * NOTE: this method is intend to be used in conjunction\n     *       with the {@link ICAL.Event#iterator iterator} method.\n     *\n     * @param {ICAL.Time} occurrence time occurrence\n     * @return {ICAL.Event.occurrenceDetails} Information about the occurrence\n     */\n    getOccurrenceDetails: function(occurrence) {\n      var id = occurrence.toString();\n      var utcId = occurrence.convertToZone(ICAL.Timezone.utcTimezone).toString();\n      var item;\n      var result = {\n        //XXX: Clone?\n        recurrenceId: occurrence\n      };\n\n      if (id in this.exceptions) {\n        item = result.item = this.exceptions[id];\n        result.startDate = item.startDate;\n        result.endDate = item.endDate;\n        result.item = item;\n      } else if (utcId in this.exceptions) {\n        item = this.exceptions[utcId];\n        result.startDate = item.startDate;\n        result.endDate = item.endDate;\n        result.item = item;\n      } else {\n        // range exceptions (RANGE=THISANDFUTURE) have a\n        // lower priority then direct exceptions but\n        // must be accounted for first. Their item is\n        // always the first exception with the range prop.\n        var rangeExceptionId = this.findRangeException(\n          occurrence\n        );\n        var end;\n\n        if (rangeExceptionId) {\n          var exception = this.exceptions[rangeExceptionId];\n\n          // range exception must modify standard time\n          // by the difference (if any) in start/end times.\n          result.item = exception;\n\n          var startDiff = this._rangeExceptionCache[rangeExceptionId];\n\n          if (!startDiff) {\n            var original = exception.recurrenceId.clone();\n            var newStart = exception.startDate.clone();\n\n            // zones must be same otherwise subtract may be incorrect.\n            original.zone = newStart.zone;\n            startDiff = newStart.subtractDate(original);\n\n            this._rangeExceptionCache[rangeExceptionId] = startDiff;\n          }\n\n          var start = occurrence.clone();\n          start.zone = exception.startDate.zone;\n          start.addDuration(startDiff);\n\n          end = start.clone();\n          end.addDuration(exception.duration);\n\n          result.startDate = start;\n          result.endDate = end;\n        } else {\n          // no range exception standard expansion\n          end = occurrence.clone();\n          end.addDuration(this.duration);\n\n          result.endDate = end;\n          result.startDate = occurrence;\n          result.item = this;\n        }\n      }\n\n      return result;\n    },\n\n    /**\n     * Builds a recur expansion instance for a specific point in time (defaults\n     * to startDate).\n     *\n     * @param {ICAL.Time} startTime     Starting point for expansion\n     * @return {ICAL.RecurExpansion}    Expansion object\n     */\n    iterator: function(startTime) {\n      return new ICAL.RecurExpansion({\n        component: this.component,\n        dtstart: startTime || this.startDate\n      });\n    },\n\n    /**\n     * Checks if the event is recurring\n     *\n     * @return {Boolean}        True, if event is recurring\n     */\n    isRecurring: function() {\n      var comp = this.component;\n      return comp.hasProperty('rrule') || comp.hasProperty('rdate');\n    },\n\n    /**\n     * Checks if the event describes a recurrence exception. See\n     * {@tutorial terminology} for details.\n     *\n     * @return {Boolean}    True, if the even describes a recurrence exception\n     */\n    isRecurrenceException: function() {\n      return this.component.hasProperty('recurrence-id');\n    },\n\n    /**\n     * Returns the types of recurrences this event may have.\n     *\n     * Returned as an object with the following possible keys:\n     *\n     *    - YEARLY\n     *    - MONTHLY\n     *    - WEEKLY\n     *    - DAILY\n     *    - MINUTELY\n     *    - SECONDLY\n     *\n     * @return {Object.<ICAL.Recur.frequencyValues, Boolean>}\n     *          Object of recurrence flags\n     */\n    getRecurrenceTypes: function() {\n      var rules = this.component.getAllProperties('rrule');\n      var i = 0;\n      var len = rules.length;\n      var result = Object.create(null);\n\n      for (; i < len; i++) {\n        var value = rules[i].getFirstValue();\n        result[value.freq] = true;\n      }\n\n      return result;\n    },\n\n    /**\n     * The uid of this event\n     * @type {String}\n     */\n    get uid() {\n      return this._firstProp('uid');\n    },\n\n    set uid(value) {\n      this._setProp('uid', value);\n    },\n\n    /**\n     * The start date\n     * @type {ICAL.Time}\n     */\n    get startDate() {\n      return this._firstProp('dtstart');\n    },\n\n    set startDate(value) {\n      this._setTime('dtstart', value);\n    },\n\n    /**\n     * The end date. This can be the result directly from the property, or the\n     * end date calculated from start date and duration. Setting the property\n     * will remove any duration properties.\n     * @type {ICAL.Time}\n     */\n    get endDate() {\n      var endDate = this._firstProp('dtend');\n      if (!endDate) {\n          var duration = this._firstProp('duration');\n          endDate = this.startDate.clone();\n          if (duration) {\n              endDate.addDuration(duration);\n          } else if (endDate.isDate) {\n              endDate.day += 1;\n          }\n      }\n      return endDate;\n    },\n\n    set endDate(value) {\n      if (this.component.hasProperty('duration')) {\n        this.component.removeProperty('duration');\n      }\n      this._setTime('dtend', value);\n    },\n\n    /**\n     * The duration. This can be the result directly from the property, or the\n     * duration calculated from start date and end date. Setting the property\n     * will remove any `dtend` properties.\n     * @type {ICAL.Duration}\n     */\n    get duration() {\n      var duration = this._firstProp('duration');\n      if (!duration) {\n        return this.endDate.subtractDateTz(this.startDate);\n      }\n      return duration;\n    },\n\n    set duration(value) {\n      if (this.component.hasProperty('dtend')) {\n        this.component.removeProperty('dtend');\n      }\n\n      this._setProp('duration', value);\n    },\n\n    /**\n     * The location of the event.\n     * @type {String}\n     */\n    get location() {\n      return this._firstProp('location');\n    },\n\n    set location(value) {\n      return this._setProp('location', value);\n    },\n\n    /**\n     * The attendees in the event\n     * @type {ICAL.Property[]}\n     * @readonly\n     */\n    get attendees() {\n      //XXX: This is way lame we should have a better\n      //     data structure for this later.\n      return this.component.getAllProperties('attendee');\n    },\n\n\n    /**\n     * The event summary\n     * @type {String}\n     */\n    get summary() {\n      return this._firstProp('summary');\n    },\n\n    set summary(value) {\n      this._setProp('summary', value);\n    },\n\n    /**\n     * The event description.\n     * @type {String}\n     */\n    get description() {\n      return this._firstProp('description');\n    },\n\n    set description(value) {\n      this._setProp('description', value);\n    },\n\n    /**\n     * The organizer value as an uri. In most cases this is a mailto: uri, but\n     * it can also be something else, like urn:uuid:...\n     * @type {String}\n     */\n    get organizer() {\n      return this._firstProp('organizer');\n    },\n\n    set organizer(value) {\n      this._setProp('organizer', value);\n    },\n\n    /**\n     * The sequence value for this event. Used for scheduling\n     * see {@tutorial terminology}.\n     * @type {Number}\n     */\n    get sequence() {\n      return this._firstProp('sequence');\n    },\n\n    set sequence(value) {\n      this._setProp('sequence', value);\n    },\n\n    /**\n     * The recurrence id for this event. See {@tutorial terminology} for details.\n     * @type {ICAL.Time}\n     */\n    get recurrenceId() {\n      return this._firstProp('recurrence-id');\n    },\n\n    set recurrenceId(value) {\n      this._setTime('recurrence-id', value);\n    },\n\n    /**\n     * Set/update a time property's value.\n     * This will also update the TZID of the property.\n     *\n     * TODO: this method handles the case where we are switching\n     * from a known timezone to an implied timezone (one without TZID).\n     * This does _not_ handle the case of moving between a known\n     *  (by TimezoneService) timezone to an unknown timezone...\n     *\n     * We will not add/remove/update the VTIMEZONE subcomponents\n     *  leading to invalid ICAL data...\n     * @private\n     * @param {String} propName     The property name\n     * @param {ICAL.Time} time      The time to set\n     */\n    _setTime: function(propName, time) {\n      var prop = this.component.getFirstProperty(propName);\n\n      if (!prop) {\n        prop = new ICAL.Property(propName);\n        this.component.addProperty(prop);\n      }\n\n      // utc and local don't get a tzid\n      if (\n        time.zone === ICAL.Timezone.localTimezone ||\n        time.zone === ICAL.Timezone.utcTimezone\n      ) {\n        // remove the tzid\n        prop.removeParameter('tzid');\n      } else {\n        prop.setParameter('tzid', time.zone.tzid);\n      }\n\n      prop.setValue(time);\n    },\n\n    _setProp: function(name, value) {\n      this.component.updatePropertyWithValue(name, value);\n    },\n\n    _firstProp: function(name) {\n      return this.component.getFirstPropertyValue(name);\n    },\n\n    /**\n     * The string representation of this event.\n     * @return {String}\n     */\n    toString: function() {\n      return this.component.toString();\n    }\n\n  };\n\n  function compareRangeException(a, b) {\n    if (a[0] > b[0]) return 1;\n    if (b[0] > a[0]) return -1;\n    return 0;\n  }\n\n  return Event;\n}());\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch, 2011-2015 */\n\n\n/**\n * This symbol is further described later on\n * @ignore\n */\nICAL.ComponentParser = (function() {\n  /**\n   * @classdesc\n   * The ComponentParser is used to process a String or jCal Object,\n   * firing callbacks for various found components, as well as completion.\n   *\n   * @example\n   * var options = {\n   *   // when false no events will be emitted for type\n   *   parseEvent: true,\n   *   parseTimezone: true\n   * };\n   *\n   * var parser = new ICAL.ComponentParser(options);\n   *\n   * parser.onevent(eventComponent) {\n   *   //...\n   * }\n   *\n   * // ontimezone, etc...\n   *\n   * parser.oncomplete = function() {\n   *\n   * };\n   *\n   * parser.process(stringOrComponent);\n   *\n   * @class\n   * @alias ICAL.ComponentParser\n   * @param {Object=} options        Component parser options\n   * @param {Boolean} options.parseEvent        Whether events should be parsed\n   * @param {Boolean} options.parseTimezeone    Whether timezones should be parsed\n   */\n  function ComponentParser(options) {\n    if (typeof(options) === 'undefined') {\n      options = {};\n    }\n\n    var key;\n    for (key in options) {\n      /* istanbul ignore else */\n      if (options.hasOwnProperty(key)) {\n        this[key] = options[key];\n      }\n    }\n  }\n\n  ComponentParser.prototype = {\n\n    /**\n     * When true, parse events\n     *\n     * @type {Boolean}\n     */\n    parseEvent: true,\n\n    /**\n     * When true, parse timezones\n     *\n     * @type {Boolean}\n     */\n    parseTimezone: true,\n\n\n    /* SAX like events here for reference */\n\n    /**\n     * Fired when parsing is complete\n     * @callback\n     */\n    oncomplete: /* istanbul ignore next */ function() {},\n\n    /**\n     * Fired if an error occurs during parsing.\n     *\n     * @callback\n     * @param {Error} err details of error\n     */\n    onerror: /* istanbul ignore next */ function(err) {},\n\n    /**\n     * Fired when a top level component (VTIMEZONE) is found\n     *\n     * @callback\n     * @param {ICAL.Timezone} component     Timezone object\n     */\n    ontimezone: /* istanbul ignore next */ function(component) {},\n\n    /**\n     * Fired when a top level component (VEVENT) is found.\n     *\n     * @callback\n     * @param {ICAL.Event} component    Top level component\n     */\n    onevent: /* istanbul ignore next */ function(component) {},\n\n    /**\n     * Process a string or parse ical object.  This function itself will return\n     * nothing but will start the parsing process.\n     *\n     * Events must be registered prior to calling this method.\n     *\n     * @param {ICAL.Component|String|Object} ical      The component to process,\n     *        either in its final form, as a jCal Object, or string representation\n     */\n    process: function(ical) {\n      //TODO: this is sync now in the future we will have a incremental parser.\n      if (typeof(ical) === 'string') {\n        ical = ICAL.parse(ical);\n      }\n\n      if (!(ical instanceof ICAL.Component)) {\n        ical = new ICAL.Component(ical);\n      }\n\n      var components = ical.getAllSubcomponents();\n      var i = 0;\n      var len = components.length;\n      var component;\n\n      for (; i < len; i++) {\n        component = components[i];\n\n        switch (component.name) {\n          case 'vtimezone':\n            if (this.parseTimezone) {\n              var tzid = component.getFirstPropertyValue('tzid');\n              if (tzid) {\n                this.ontimezone(new ICAL.Timezone({\n                  tzid: tzid,\n                  component: component\n                }));\n              }\n            }\n            break;\n          case 'vevent':\n            if (this.parseEvent) {\n              this.onevent(new ICAL.Event(component));\n            }\n            break;\n          default:\n            continue;\n        }\n      }\n\n      //XXX: ideally we should do a \"nextTick\" here\n      //     so in all cases this is actually async.\n      this.oncomplete();\n    }\n  };\n\n  return ComponentParser;\n}());\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"StateMachine\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"StateMachine\"] = factory();\n\telse\n\t\troot[\"StateMachine\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 5);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function(target, sources) {\n  var n, source, key;\n  for(n = 1 ; n < arguments.length ; n++) {\n    source = arguments[n];\n    for(key in source) {\n      if (source.hasOwnProperty(key))\n        target[key] = source[key];\n    }\n  }\n  return target;\n}\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n//-------------------------------------------------------------------------------------------------\n\nvar mixin = __webpack_require__(0);\n\n//-------------------------------------------------------------------------------------------------\n\nmodule.exports = {\n\n  build: function(target, config) {\n    var n, max, plugin, plugins = config.plugins;\n    for(n = 0, max = plugins.length ; n < max ; n++) {\n      plugin = plugins[n];\n      if (plugin.methods)\n        mixin(target, plugin.methods);\n      if (plugin.properties)\n        Object.defineProperties(target, plugin.properties);\n    }\n  },\n\n  hook: function(fsm, name, additional) {\n    var n, max, method, plugin,\n        plugins = fsm.config.plugins,\n        args    = [fsm.context];\n\n    if (additional)\n      args = args.concat(additional)\n\n    for(n = 0, max = plugins.length ; n < max ; n++) {\n      plugin = plugins[n]\n      method = plugins[n][name]\n      if (method)\n        method.apply(plugin, args);\n    }\n  }\n\n}\n\n//-------------------------------------------------------------------------------------------------\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n//-------------------------------------------------------------------------------------------------\n\nfunction camelize(label) {\n\n  if (label.length === 0)\n    return label;\n\n  var n, result, word, words = label.split(/[_-]/);\n\n  // single word with first character already lowercase, return untouched\n  if ((words.length === 1) && (words[0][0].toLowerCase() === words[0][0]))\n    return label;\n\n  result = words[0].toLowerCase();\n  for(n = 1 ; n < words.length ; n++) {\n    result = result + words[n].charAt(0).toUpperCase() + words[n].substring(1).toLowerCase();\n  }\n\n  return result;\n}\n\n//-------------------------------------------------------------------------------------------------\n\ncamelize.prepended = function(prepend, label) {\n  label = camelize(label);\n  return prepend + label[0].toUpperCase() + label.substring(1);\n}\n\n//-------------------------------------------------------------------------------------------------\n\nmodule.exports = camelize;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n//-------------------------------------------------------------------------------------------------\n\nvar mixin    = __webpack_require__(0),\n    camelize = __webpack_require__(2);\n\n//-------------------------------------------------------------------------------------------------\n\nfunction Config(options, StateMachine) {\n\n  options = options || {};\n\n  this.options     = options; // preserving original options can be useful (e.g visualize plugin)\n  this.defaults    = StateMachine.defaults;\n  this.states      = [];\n  this.transitions = [];\n  this.map         = {};\n  this.lifecycle   = this.configureLifecycle();\n  this.init        = this.configureInitTransition(options.init);\n  this.data        = this.configureData(options.data);\n  this.methods     = this.configureMethods(options.methods);\n\n  this.map[this.defaults.wildcard] = {};\n\n  this.configureTransitions(options.transitions || []);\n\n  this.plugins = this.configurePlugins(options.plugins, StateMachine.plugin);\n\n}\n\n//-------------------------------------------------------------------------------------------------\n\nmixin(Config.prototype, {\n\n  addState: function(name) {\n    if (!this.map[name]) {\n      this.states.push(name);\n      this.addStateLifecycleNames(name);\n      this.map[name] = {};\n    }\n  },\n\n  addStateLifecycleNames: function(name) {\n    this.lifecycle.onEnter[name] = camelize.prepended('onEnter', name);\n    this.lifecycle.onLeave[name] = camelize.prepended('onLeave', name);\n    this.lifecycle.on[name]      = camelize.prepended('on',      name);\n  },\n\n  addTransition: function(name) {\n    if (this.transitions.indexOf(name) < 0) {\n      this.transitions.push(name);\n      this.addTransitionLifecycleNames(name);\n    }\n  },\n\n  addTransitionLifecycleNames: function(name) {\n    this.lifecycle.onBefore[name] = camelize.prepended('onBefore', name);\n    this.lifecycle.onAfter[name]  = camelize.prepended('onAfter',  name);\n    this.lifecycle.on[name]       = camelize.prepended('on',       name);\n  },\n\n  mapTransition: function(transition) {\n    var name = transition.name,\n        from = transition.from,\n        to   = transition.to;\n    this.addState(from);\n    if (typeof to !== 'function')\n      this.addState(to);\n    this.addTransition(name);\n    this.map[from][name] = transition;\n    return transition;\n  },\n\n  configureLifecycle: function() {\n    return {\n      onBefore: { transition: 'onBeforeTransition' },\n      onAfter:  { transition: 'onAfterTransition'  },\n      onEnter:  { state:      'onEnterState'       },\n      onLeave:  { state:      'onLeaveState'       },\n      on:       { transition: 'onTransition'       }\n    };\n  },\n\n  configureInitTransition: function(init) {\n    if (typeof init === 'string') {\n      return this.mapTransition(mixin({}, this.defaults.init, { to: init, active: true }));\n    }\n    else if (typeof init === 'object') {\n      return this.mapTransition(mixin({}, this.defaults.init, init, { active: true }));\n    }\n    else {\n      this.addState(this.defaults.init.from);\n      return this.defaults.init;\n    }\n  },\n\n  configureData: function(data) {\n    if (typeof data === 'function')\n      return data;\n    else if (typeof data === 'object')\n      return function() { return data; }\n    else\n      return function() { return {};  }\n  },\n\n  configureMethods: function(methods) {\n    return methods || {};\n  },\n\n  configurePlugins: function(plugins, builtin) {\n    plugins = plugins || [];\n    var n, max, plugin;\n    for(n = 0, max = plugins.length ; n < max ; n++) {\n      plugin = plugins[n];\n      if (typeof plugin === 'function')\n        plugins[n] = plugin = plugin()\n      if (plugin.configure)\n        plugin.configure(this);\n    }\n    return plugins\n  },\n\n  configureTransitions: function(transitions) {\n    var i, n, transition, from, to, wildcard = this.defaults.wildcard;\n    for(n = 0 ; n < transitions.length ; n++) {\n      transition = transitions[n];\n      from  = Array.isArray(transition.from) ? transition.from : [transition.from || wildcard]\n      to    = transition.to || wildcard;\n      for(i = 0 ; i < from.length ; i++) {\n        this.mapTransition({ name: transition.name, from: from[i], to: to });\n      }\n    }\n  },\n\n  transitionFor: function(state, transition) {\n    var wildcard = this.defaults.wildcard;\n    return this.map[state][transition] ||\n           this.map[wildcard][transition];\n  },\n\n  transitionsFor: function(state) {\n    var wildcard = this.defaults.wildcard;\n    return Object.keys(this.map[state]).concat(Object.keys(this.map[wildcard]));\n  },\n\n  allStates: function() {\n    return this.states;\n  },\n\n  allTransitions: function() {\n    return this.transitions;\n  }\n\n});\n\n//-------------------------------------------------------------------------------------------------\n\nmodule.exports = Config;\n\n//-------------------------------------------------------------------------------------------------\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar mixin      = __webpack_require__(0),\n    Exception  = __webpack_require__(6),\n    plugin     = __webpack_require__(1),\n    UNOBSERVED = [ null, [] ];\n\n//-------------------------------------------------------------------------------------------------\n\nfunction JSM(context, config) {\n  this.context   = context;\n  this.config    = config;\n  this.state     = config.init.from;\n  this.observers = [context];\n}\n\n//-------------------------------------------------------------------------------------------------\n\nmixin(JSM.prototype, {\n\n  init: function(args) {\n    mixin(this.context, this.config.data.apply(this.context, args));\n    plugin.hook(this, 'init');\n    if (this.config.init.active)\n      return this.fire(this.config.init.name, []);\n  },\n\n  is: function(state) {\n    return Array.isArray(state) ? (state.indexOf(this.state) >= 0) : (this.state === state);\n  },\n\n  isPending: function() {\n    return this.pending;\n  },\n\n  can: function(transition) {\n    return !this.isPending() && !!this.seek(transition);\n  },\n\n  cannot: function(transition) {\n    return !this.can(transition);\n  },\n\n  allStates: function() {\n    return this.config.allStates();\n  },\n\n  allTransitions: function() {\n    return this.config.allTransitions();\n  },\n\n  transitions: function() {\n    return this.config.transitionsFor(this.state);\n  },\n\n  seek: function(transition, args) {\n    var wildcard = this.config.defaults.wildcard,\n        entry    = this.config.transitionFor(this.state, transition),\n        to       = entry && entry.to;\n    if (typeof to === 'function')\n      return to.apply(this.context, args);\n    else if (to === wildcard)\n      return this.state\n    else\n      return to\n  },\n\n  fire: function(transition, args) {\n    return this.transit(transition, this.state, this.seek(transition, args), args);\n  },\n\n  transit: function(transition, from, to, args) {\n\n    var lifecycle = this.config.lifecycle,\n        changed   = this.config.options.observeUnchangedState || (from !== to);\n\n    if (!to)\n      return this.context.onInvalidTransition(transition, from, to);\n\n    if (this.isPending())\n      return this.context.onPendingTransition(transition, from, to);\n\n    this.config.addState(to);  // might need to add this state if it's unknown (e.g. conditional transition or goto)\n\n    this.beginTransit();\n\n    args.unshift({             // this context will be passed to each lifecycle event observer\n      transition: transition,\n      from:       from,\n      to:         to,\n      fsm:        this.context\n    });\n\n    return this.observeEvents([\n                this.observersForEvent(lifecycle.onBefore.transition),\n                this.observersForEvent(lifecycle.onBefore[transition]),\n      changed ? this.observersForEvent(lifecycle.onLeave.state) : UNOBSERVED,\n      changed ? this.observersForEvent(lifecycle.onLeave[from]) : UNOBSERVED,\n                this.observersForEvent(lifecycle.on.transition),\n      changed ? [ 'doTransit', [ this ] ]                       : UNOBSERVED,\n      changed ? this.observersForEvent(lifecycle.onEnter.state) : UNOBSERVED,\n      changed ? this.observersForEvent(lifecycle.onEnter[to])   : UNOBSERVED,\n      changed ? this.observersForEvent(lifecycle.on[to])        : UNOBSERVED,\n                this.observersForEvent(lifecycle.onAfter.transition),\n                this.observersForEvent(lifecycle.onAfter[transition]),\n                this.observersForEvent(lifecycle.on[transition])\n    ], args);\n  },\n\n  beginTransit: function()          { this.pending = true;                 },\n  endTransit:   function(result)    { this.pending = false; return result; },\n  failTransit:  function(result)    { this.pending = false; throw result;  },\n  doTransit:    function(lifecycle) { this.state = lifecycle.to;           },\n\n  observe: function(args) {\n    if (args.length === 2) {\n      var observer = {};\n      observer[args[0]] = args[1];\n      this.observers.push(observer);\n    }\n    else {\n      this.observers.push(args[0]);\n    }\n  },\n\n  observersForEvent: function(event) { // TODO: this could be cached\n    var n = 0, max = this.observers.length, observer, result = [];\n    for( ; n < max ; n++) {\n      observer = this.observers[n];\n      if (observer[event])\n        result.push(observer);\n    }\n    return [ event, result, true ]\n  },\n\n  observeEvents: function(events, args, previousEvent, previousResult) {\n    if (events.length === 0) {\n      return this.endTransit(previousResult === undefined ? true : previousResult);\n    }\n\n    var event     = events[0][0],\n        observers = events[0][1],\n        pluggable = events[0][2];\n\n    args[0].event = event;\n    if (event && pluggable && event !== previousEvent)\n      plugin.hook(this, 'lifecycle', args);\n\n    if (observers.length === 0) {\n      events.shift();\n      return this.observeEvents(events, args, event, previousResult);\n    }\n    else {\n      var observer = observers.shift(),\n          result = observer[event].apply(observer, args);\n      if (result && typeof result.then === 'function') {\n        return result.then(this.observeEvents.bind(this, events, args, event))\n                     .catch(this.failTransit.bind(this))\n      }\n      else if (result === false) {\n        return this.endTransit(false);\n      }\n      else {\n        return this.observeEvents(events, args, event, result);\n      }\n    }\n  },\n\n  onInvalidTransition: function(transition, from, to) {\n    throw new Exception(\"transition is invalid in current state\", transition, from, to, this.state);\n  },\n\n  onPendingTransition: function(transition, from, to) {\n    throw new Exception(\"transition is invalid while previous transition is still in progress\", transition, from, to, this.state);\n  }\n\n});\n\n//-------------------------------------------------------------------------------------------------\n\nmodule.exports = JSM;\n\n//-------------------------------------------------------------------------------------------------\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n//-----------------------------------------------------------------------------------------------\n\nvar mixin    = __webpack_require__(0),\n    camelize = __webpack_require__(2),\n    plugin   = __webpack_require__(1),\n    Config   = __webpack_require__(3),\n    JSM      = __webpack_require__(4);\n\n//-----------------------------------------------------------------------------------------------\n\nvar PublicMethods = {\n  is:                  function(state)       { return this._fsm.is(state)                                     },\n  can:                 function(transition)  { return this._fsm.can(transition)                               },\n  cannot:              function(transition)  { return this._fsm.cannot(transition)                            },\n  observe:             function()            { return this._fsm.observe(arguments)                            },\n  transitions:         function()            { return this._fsm.transitions()                                 },\n  allTransitions:      function()            { return this._fsm.allTransitions()                              },\n  allStates:           function()            { return this._fsm.allStates()                                   },\n  onInvalidTransition: function(t, from, to) { return this._fsm.onInvalidTransition(t, from, to)              },\n  onPendingTransition: function(t, from, to) { return this._fsm.onPendingTransition(t, from, to)              },\n}\n\nvar PublicProperties = {\n  state: {\n    configurable: false,\n    enumerable:   true,\n    get: function() {\n      return this._fsm.state;\n    },\n    set: function(state) {\n      throw Error('use transitions to change state')\n    }\n  }\n}\n\n//-----------------------------------------------------------------------------------------------\n\nfunction StateMachine(options) {\n  return apply(this || {}, options);\n}\n\nfunction factory() {\n  var cstor, options;\n  if (typeof arguments[0] === 'function') {\n    cstor   = arguments[0];\n    options = arguments[1] || {};\n  }\n  else {\n    cstor   = function() { this._fsm.apply(this, arguments) };\n    options = arguments[0] || {};\n  }\n  var config = new Config(options, StateMachine);\n  build(cstor.prototype, config);\n  cstor.prototype._fsm.config = config; // convenience access to shared config without needing an instance\n  return cstor;\n}\n\n//-------------------------------------------------------------------------------------------------\n\nfunction apply(instance, options) {\n  var config = new Config(options, StateMachine);\n  build(instance, config);\n  instance._fsm();\n  return instance;\n}\n\nfunction build(target, config) {\n  if ((typeof target !== 'object') || Array.isArray(target))\n    throw Error('StateMachine can only be applied to objects');\n  plugin.build(target, config);\n  Object.defineProperties(target, PublicProperties);\n  mixin(target, PublicMethods);\n  mixin(target, config.methods);\n  config.allTransitions().forEach(function(transition) {\n    target[camelize(transition)] = function() {\n      return this._fsm.fire(transition, [].slice.call(arguments))\n    }\n  });\n  target._fsm = function() {\n    this._fsm = new JSM(this, config);\n    this._fsm.init(arguments);\n  }\n}\n\n//-----------------------------------------------------------------------------------------------\n\nStateMachine.version  = '3.0.1';\nStateMachine.factory  = factory;\nStateMachine.apply    = apply;\nStateMachine.defaults = {\n  wildcard: '*',\n  init: {\n    name: 'init',\n    from: 'none'\n  }\n}\n\n//===============================================================================================\n\nmodule.exports = StateMachine;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function(message, transition, from, to, current) {\n  this.message    = message;\n  this.transition = transition;\n  this.from       = from;\n  this.to         = to;\n  this.current    = current;\n}\n\n\n/***/ })\n/******/ ]);\n});","/*!\n* js-data-localstorage\n* @version 2.3.2 - Homepage <http://www.js-data.io/docs/dslocalstorageadapter>\n* @author Jason Dobry <jason.dobry@gmail.com>\n* @copyright (c) 2014-2015 Jason Dobry\n* @license MIT <https://github.com/js-data/js-data-localstorage/blob/master/LICENSE>\n*\n* @overview localStorage adapter for js-data.\n*/\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"js-data\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"js-data\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"DSLocalStorageAdapter\"] = factory(require(\"js-data\"));\n\telse\n\t\troot[\"DSLocalStorageAdapter\"] = factory(root[\"JSData\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\t/* global: localStorage */\n\tvar JSData = __webpack_require__(1);\n\tvar guid = __webpack_require__(2);\n\tvar unique = __webpack_require__(13);\n\tvar map = __webpack_require__(22);\n\n\tvar emptyStore = new JSData.DS();\n\tvar DSUtils = JSData.DSUtils;\n\n\tvar filter = emptyStore.defaults.defaultFilter;\n\n\tvar Defaults = function Defaults() {\n\t  _classCallCheck(this, Defaults);\n\t};\n\n\tDefaults.prototype.basePath = '';\n\n\tvar queue = [];\n\tvar taskInProcess = false;\n\n\tfunction enqueue(task) {\n\t  queue.push(task);\n\t}\n\n\tfunction dequeue() {\n\t  if (queue.length && !taskInProcess) {\n\t    taskInProcess = true;\n\t    queue[0]();\n\t  }\n\t}\n\n\tfunction queueTask(task) {\n\t  if (!queue.length) {\n\t    enqueue(task);\n\t    dequeue();\n\t  } else {\n\t    enqueue(task);\n\t  }\n\t}\n\n\tfunction createTask(fn) {\n\t  return new DSUtils.Promise(fn).then(function (result) {\n\t    taskInProcess = false;\n\t    queue.shift();\n\t    setTimeout(dequeue, 0);\n\t    return result;\n\t  }, function (err) {\n\t    taskInProcess = false;\n\t    queue.shift();\n\t    setTimeout(dequeue, 0);\n\t    return DSUtils.Promise.reject(err);\n\t  });\n\t}\n\n\tvar DSLocalStorageAdapter = (function () {\n\t  function DSLocalStorageAdapter(options) {\n\t    _classCallCheck(this, DSLocalStorageAdapter);\n\n\t    options = options || {};\n\t    this.defaults = new Defaults();\n\t    this.storage = options.storage || localStorage;\n\t    DSUtils.deepMixIn(this.defaults, options);\n\t  }\n\n\t  _createClass(DSLocalStorageAdapter, [{\n\t    key: 'getPath',\n\t    value: function getPath(resourceConfig, options) {\n\t      options = options || {};\n\t      return DSUtils.makePath(options.basePath || this.defaults.basePath || resourceConfig.basePath, resourceConfig.name);\n\t    }\n\t  }, {\n\t    key: 'getIdPath',\n\t    value: function getIdPath(resourceConfig, options, id) {\n\t      options = options || {};\n\t      return DSUtils.makePath(options.basePath || this.defaults.basePath || resourceConfig.basePath, resourceConfig.endpoint, id);\n\t    }\n\t  }, {\n\t    key: 'getIds',\n\t    value: function getIds(resourceConfig, options) {\n\t      var ids = undefined;\n\t      var idsPath = this.getPath(resourceConfig, options);\n\t      var idsJson = this.storage.getItem(idsPath);\n\t      if (idsJson) {\n\t        ids = DSUtils.fromJson(idsJson);\n\t      } else {\n\t        ids = {};\n\t      }\n\t      return ids;\n\t    }\n\t  }, {\n\t    key: 'saveKeys',\n\t    value: function saveKeys(ids, resourceConfig, options) {\n\t      var idsPath = this.getPath(resourceConfig, options);\n\t      if (!DSUtils.isEmpty(ids)) {\n\t        this.storage.setItem(idsPath, DSUtils.toJson(ids));\n\t      } else {\n\t        this.storage.removeItem(idsPath);\n\t      }\n\t    }\n\t  }, {\n\t    key: 'ensureId',\n\t    value: function ensureId(id, resourceConfig, options) {\n\t      var ids = this.getIds(resourceConfig, options);\n\t      if (DSUtils.isArray(id)) {\n\t        if (!id.length) {\n\t          return;\n\t        }\n\t        DSUtils.forEach(id, function (_id) {\n\t          ids[_id] = 1;\n\t        });\n\t      } else {\n\t        ids[id] = 1;\n\t      }\n\t      this.saveKeys(ids, resourceConfig, options);\n\t    }\n\t  }, {\n\t    key: 'removeId',\n\t    value: function removeId(id, resourceConfig, options) {\n\t      var ids = this.getIds(resourceConfig, options);\n\t      if (DSUtils.isArray(id)) {\n\t        if (!id.length) {\n\t          return;\n\t        }\n\t        DSUtils.forEach(id, function (_id) {\n\t          delete ids[_id];\n\t        });\n\t      } else {\n\t        delete ids[id];\n\t      }\n\t      this.saveKeys(ids, resourceConfig, options);\n\t    }\n\t  }, {\n\t    key: 'GET',\n\t    value: function GET(key) {\n\t      var _this = this;\n\n\t      return new DSUtils.Promise(function (resolve) {\n\t        var item = _this.storage.getItem(key);\n\t        resolve(item ? DSUtils.fromJson(item) : undefined);\n\t      });\n\t    }\n\t  }, {\n\t    key: 'PUT',\n\t    value: function PUT(key, value) {\n\t      var _this2 = this;\n\n\t      var DSLocalStorageAdapter = this;\n\t      return DSLocalStorageAdapter.GET(key).then(function (item) {\n\t        if (item) {\n\t          DSUtils.deepMixIn(item, DSUtils.removeCircular(value));\n\t        }\n\t        _this2.storage.setItem(key, DSUtils.toJson(item || value));\n\t        return DSLocalStorageAdapter.GET(key);\n\t      });\n\t    }\n\t  }, {\n\t    key: 'DEL',\n\t    value: function DEL(key) {\n\t      var _this3 = this;\n\n\t      return new DSUtils.Promise(function (resolve) {\n\t        _this3.storage.removeItem(key);\n\t        resolve();\n\t      });\n\t    }\n\t  }, {\n\t    key: 'find',\n\t    value: function find(resourceConfig, id, options) {\n\t      var _this4 = this;\n\n\t      var instance = undefined;\n\t      options = options || {};\n\t      options.with = options.with || [];\n\t      return new DSUtils.Promise(function (resolve, reject) {\n\t        _this4.GET(_this4.getIdPath(resourceConfig, options || {}, id)).then(function (item) {\n\t          return !item ? reject(new Error('Not Found!')) : item;\n\t        }).then(function (_instance) {\n\t          instance = _instance;\n\t          var tasks = [];\n\n\t          DSUtils.forEach(resourceConfig.relationList, function (def) {\n\t            var relationName = def.relation;\n\t            var relationDef = resourceConfig.getResource(relationName);\n\t            var containedName = null;\n\t            if (DSUtils.contains(options.with, relationName)) {\n\t              containedName = relationName;\n\t            } else if (DSUtils.contains(options.with, def.localField)) {\n\t              containedName = def.localField;\n\t            }\n\t            if (containedName) {\n\t              (function () {\n\t                var __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options);\n\t                __options.with = options.with.slice();\n\t                __options = DSUtils._(relationDef, __options);\n\t                DSUtils.remove(__options.with, containedName);\n\t                DSUtils.forEach(__options.with, function (relation, i) {\n\t                  if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\n\t                    __options.with[i] = relation.substr(containedName.length + 1);\n\t                  } else {\n\t                    __options.with[i] = '';\n\t                  }\n\t                });\n\n\t                var task = undefined;\n\n\t                if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) {\n\t                  task = _this4.findAll(resourceConfig.getResource(relationName), {\n\t                    where: _defineProperty({}, def.foreignKey, {\n\t                      '==': instance[resourceConfig.idAttribute]\n\t                    })\n\t                  }, __options).then(function (relatedItems) {\n\t                    if (def.type === 'hasOne' && relatedItems.length) {\n\t                      DSUtils.set(instance, def.localField, relatedItems[0]);\n\t                    } else {\n\t                      DSUtils.set(instance, def.localField, relatedItems);\n\t                    }\n\t                    return relatedItems;\n\t                  });\n\t                } else if (def.type === 'hasMany' && def.localKeys) {\n\t                  var localKeys = [];\n\t                  var itemKeys = instance[def.localKeys] || [];\n\t                  itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys);\n\t                  localKeys = localKeys.concat(itemKeys || []);\n\t                  task = _this4.findAll(resourceConfig.getResource(relationName), {\n\t                    where: _defineProperty({}, relationDef.idAttribute, {\n\t                      'in': DSUtils.filter(unique(localKeys), function (x) {\n\t                        return x;\n\t                      })\n\t                    })\n\t                  }, __options).then(function (relatedItems) {\n\t                    DSUtils.set(instance, def.localField, relatedItems);\n\t                    return relatedItems;\n\t                  });\n\t                } else if (def.type === 'belongsTo' || def.type === 'hasOne' && def.localKey) {\n\t                  task = _this4.find(resourceConfig.getResource(relationName), DSUtils.get(instance, def.localKey), __options).then(function (relatedItem) {\n\t                    DSUtils.set(instance, def.localField, relatedItem);\n\t                    return relatedItem;\n\t                  });\n\t                }\n\n\t                if (task) {\n\t                  tasks.push(task);\n\t                }\n\t              })();\n\t            }\n\t          });\n\n\t          return DSUtils.Promise.all(tasks);\n\t        }).then(function () {\n\t          return resolve(instance);\n\t        }).catch(reject);\n\t      });\n\t    }\n\t  }, {\n\t    key: 'findAll',\n\t    value: function findAll(resourceConfig, params, options) {\n\t      var _this5 = this;\n\n\t      var items = null;\n\t      options = options || {};\n\t      options.with = options.with || [];\n\t      return new DSUtils.Promise(function (resolve, reject) {\n\t        try {\n\t          (function () {\n\t            options = options || {};\n\t            if (!('allowSimpleWhere' in options)) {\n\t              options.allowSimpleWhere = true;\n\t            }\n\t            var items = [];\n\t            var ids = DSUtils.keys(_this5.getIds(resourceConfig, options));\n\t            DSUtils.forEach(ids, function (id) {\n\t              var itemJson = _this5.storage.getItem(_this5.getIdPath(resourceConfig, options, id));\n\t              if (itemJson) {\n\t                items.push(DSUtils.fromJson(itemJson));\n\t              }\n\t            });\n\t            resolve(filter.call(emptyStore, items, resourceConfig.name, params, options));\n\t          })();\n\t        } catch (err) {\n\t          reject(err);\n\t        }\n\t      }).then(function (_items) {\n\t        items = _items;\n\t        var tasks = [];\n\t        DSUtils.forEach(resourceConfig.relationList, function (def) {\n\t          var relationName = def.relation;\n\t          var relationDef = resourceConfig.getResource(relationName);\n\t          var containedName = null;\n\t          if (DSUtils.contains(options.with, relationName)) {\n\t            containedName = relationName;\n\t          } else if (DSUtils.contains(options.with, def.localField)) {\n\t            containedName = def.localField;\n\t          }\n\t          if (containedName) {\n\t            (function () {\n\t              var __options = DSUtils.deepMixIn({}, options.orig ? options.orig() : options);\n\t              __options.with = options.with.slice();\n\t              __options = DSUtils._(relationDef, __options);\n\t              DSUtils.remove(__options.with, containedName);\n\t              DSUtils.forEach(__options.with, function (relation, i) {\n\t                if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\n\t                  __options.with[i] = relation.substr(containedName.length + 1);\n\t                } else {\n\t                  __options.with[i] = '';\n\t                }\n\t              });\n\n\t              var task = undefined;\n\n\t              if ((def.type === 'hasOne' || def.type === 'hasMany') && def.foreignKey) {\n\t                task = _this5.findAll(resourceConfig.getResource(relationName), {\n\t                  where: _defineProperty({}, def.foreignKey, {\n\t                    'in': DSUtils.filter(map(items, function (item) {\n\t                      return DSUtils.get(item, resourceConfig.idAttribute);\n\t                    }), function (x) {\n\t                      return x;\n\t                    })\n\t                  })\n\t                }, __options).then(function (relatedItems) {\n\t                  DSUtils.forEach(items, function (item) {\n\t                    var attached = [];\n\t                    DSUtils.forEach(relatedItems, function (relatedItem) {\n\t                      if (DSUtils.get(relatedItem, def.foreignKey) === item[resourceConfig.idAttribute]) {\n\t                        attached.push(relatedItem);\n\t                      }\n\t                    });\n\t                    if (def.type === 'hasOne' && attached.length) {\n\t                      DSUtils.set(item, def.localField, attached[0]);\n\t                    } else {\n\t                      DSUtils.set(item, def.localField, attached);\n\t                    }\n\t                  });\n\t                  return relatedItems;\n\t                });\n\t              } else if (def.type === 'hasMany' && def.localKeys) {\n\t                (function () {\n\t                  var localKeys = [];\n\t                  DSUtils.forEach(items, function (item) {\n\t                    var itemKeys = item[def.localKeys] || [];\n\t                    itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys);\n\t                    localKeys = localKeys.concat(itemKeys || []);\n\t                  });\n\t                  task = _this5.findAll(resourceConfig.getResource(relationName), {\n\t                    where: _defineProperty({}, relationDef.idAttribute, {\n\t                      'in': DSUtils.filter(unique(localKeys), function (x) {\n\t                        return x;\n\t                      })\n\t                    })\n\t                  }, __options).then(function (relatedItems) {\n\t                    DSUtils.forEach(items, function (item) {\n\t                      var attached = [];\n\t                      var itemKeys = item[def.localKeys] || [];\n\t                      itemKeys = Array.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys);\n\t                      DSUtils.forEach(relatedItems, function (relatedItem) {\n\t                        if (itemKeys && DSUtils.contains(itemKeys, relatedItem[relationDef.idAttribute])) {\n\t                          attached.push(relatedItem);\n\t                        }\n\t                      });\n\t                      DSUtils.set(item, def.localField, attached);\n\t                    });\n\t                    return relatedItems;\n\t                  });\n\t                })();\n\t              } else if (def.type === 'belongsTo' || def.type === 'hasOne' && def.localKey) {\n\t                task = _this5.findAll(resourceConfig.getResource(relationName), {\n\t                  where: _defineProperty({}, relationDef.idAttribute, {\n\t                    'in': DSUtils.filter(map(items, function (item) {\n\t                      return DSUtils.get(item, def.localKey);\n\t                    }), function (x) {\n\t                      return x;\n\t                    })\n\t                  })\n\t                }, __options).then(function (relatedItems) {\n\t                  DSUtils.forEach(items, function (item) {\n\t                    DSUtils.forEach(relatedItems, function (relatedItem) {\n\t                      if (relatedItem[relationDef.idAttribute] === item[def.localKey]) {\n\t                        DSUtils.set(item, def.localField, relatedItem);\n\t                      }\n\t                    });\n\t                  });\n\t                  return relatedItems;\n\t                });\n\t              }\n\n\t              if (task) {\n\t                tasks.push(task);\n\t              }\n\t            })();\n\t          }\n\t        });\n\t        return DSUtils.Promise.all(tasks);\n\t      }).then(function () {\n\t        return items;\n\t      });\n\t    }\n\t  }, {\n\t    key: 'create',\n\t    value: function create(resourceConfig, attrs, options) {\n\t      var _this6 = this;\n\n\t      return createTask(function (resolve, reject) {\n\t        queueTask(function () {\n\t          attrs[resourceConfig.idAttribute] = attrs[resourceConfig.idAttribute] || guid();\n\t          options = options || {};\n\t          _this6.PUT(DSUtils.makePath(_this6.getIdPath(resourceConfig, options, attrs[resourceConfig.idAttribute])), DSUtils.omit(attrs, resourceConfig.relationFields || [])).then(function (item) {\n\t            _this6.ensureId(item[resourceConfig.idAttribute], resourceConfig, options);\n\t            resolve(item);\n\t          }).catch(reject);\n\t        });\n\t      });\n\t    }\n\t  }, {\n\t    key: 'createMany',\n\t    value: function createMany(resourceConfig, items, options) {\n\t      var _this7 = this;\n\n\t      return createTask(function (resolve, reject) {\n\t        queueTask(function () {\n\t          var tasks = [];\n\t          var ids = [];\n\t          DSUtils.forEach(items, function (attrs) {\n\t            var id = attrs[resourceConfig.idAttribute] = attrs[resourceConfig.idAttribute] || guid();\n\t            ids.push(id);\n\t            options = options || {};\n\t            tasks.push(_this7.PUT(DSUtils.makePath(_this7.getIdPath(resourceConfig, options, id)), DSUtils.omit(attrs, resourceConfig.relationFields || [])));\n\t          });\n\t          _this7.ensureId(ids, resourceConfig, options);\n\t          return DSUtils.Promise.all(tasks).then(resolve).catch(reject);\n\t        });\n\t      });\n\t    }\n\t  }, {\n\t    key: 'update',\n\t    value: function update(resourceConfig, id, attrs, options) {\n\t      var _this8 = this;\n\n\t      return createTask(function (resolve, reject) {\n\t        queueTask(function () {\n\t          options = options || {};\n\t          _this8.PUT(_this8.getIdPath(resourceConfig, options, id), DSUtils.omit(attrs, resourceConfig.relationFields || [])).then(function (item) {\n\t            _this8.ensureId(item[resourceConfig.idAttribute], resourceConfig, options);\n\t            resolve(item);\n\t          }).catch(reject);\n\t        });\n\t      });\n\t    }\n\t  }, {\n\t    key: 'updateAll',\n\t    value: function updateAll(resourceConfig, attrs, params, options) {\n\t      var _this9 = this;\n\n\t      return this.findAll(resourceConfig, params, options).then(function (items) {\n\t        var tasks = [];\n\t        DSUtils.forEach(items, function (item) {\n\t          return tasks.push(_this9.update(resourceConfig, item[resourceConfig.idAttribute], DSUtils.omit(attrs, resourceConfig.relationFields || []), options));\n\t        });\n\t        return DSUtils.Promise.all(tasks);\n\t      });\n\t    }\n\t  }, {\n\t    key: 'destroy',\n\t    value: function destroy(resourceConfig, id, options) {\n\t      var _this10 = this;\n\n\t      return createTask(function (resolve, reject) {\n\t        queueTask(function () {\n\t          options = options || {};\n\t          _this10.DEL(_this10.getIdPath(resourceConfig, options, id)).then(function () {\n\t            return _this10.removeId(id, resourceConfig, options);\n\t          }).then(function () {\n\t            return resolve(null);\n\t          }, reject);\n\t        });\n\t      });\n\t    }\n\t  }, {\n\t    key: 'destroyAll',\n\t    value: function destroyAll(resourceConfig, params, options) {\n\t      var _this11 = this;\n\n\t      return this.findAll(resourceConfig, params, options).then(function (items) {\n\t        var ids = [];\n\t        DSUtils.forEach(items, function (item) {\n\t          var id = item[resourceConfig.idAttribute];\n\t          ids.push(id);\n\t          _this11.storage.removeItem(_this11.getIdPath(resourceConfig, options, id));\n\t        });\n\t        _this11.removeId(ids, resourceConfig, options);\n\t        return ids;\n\t      });\n\t    }\n\t  }]);\n\n\t  return DSLocalStorageAdapter;\n\t})();\n\n\tDSLocalStorageAdapter.version = {\n\t  full: '2.3.2',\n\t  major: parseInt('2', 10),\n\t  minor: parseInt('3', 10),\n\t  patch: parseInt('2', 10),\n\t  alpha:  true ? 'false' : false,\n\t  beta:  true ? 'false' : false\n\t};\n\n\tmodule.exports = DSLocalStorageAdapter;\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_1__;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar randHex = __webpack_require__(3);\n\tvar choice = __webpack_require__(4);\n\n\t  /**\n\t   * Returns pseudo-random guid (UUID v4)\n\t   * IMPORTANT: it's not totally \"safe\" since randHex/choice uses Math.random\n\t   * by default and sequences can be predicted in some cases. See the\n\t   * \"random/random\" documentation for more info about it and how to replace\n\t   * the default PRNG.\n\t   */\n\t  function guid() {\n\t    return (\n\t        randHex(8)+'-'+\n\t        randHex(4)+'-'+\n\t        // v4 UUID always contain \"4\" at this position to specify it was\n\t        // randomly generated\n\t        '4' + randHex(3) +'-'+\n\t        // v4 UUID always contain chars [a,b,8,9] at this position\n\t        choice(8, 9, 'a', 'b') + randHex(3)+'-'+\n\t        randHex(12)\n\t    );\n\t  }\n\t  module.exports = guid;\n\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar choice = __webpack_require__(4);\n\n\t    var _chars = '0123456789abcdef'.split('');\n\n\t    /**\n\t     * Returns a random hexadecimal string\n\t     */\n\t    function randHex(size){\n\t        size = size && size > 0? size : 6;\n\t        var str = '';\n\t        while (size--) {\n\t            str += choice(_chars);\n\t        }\n\t        return str;\n\t    }\n\n\t    module.exports = randHex;\n\n\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar randInt = __webpack_require__(5);\n\tvar isArray = __webpack_require__(10);\n\n\t    /**\n\t     * Returns a random element from the supplied arguments\n\t     * or from the array (if single argument is an array).\n\t     */\n\t    function choice(items) {\n\t        var target = (arguments.length === 1 && isArray(items))? items : arguments;\n\t        return target[ randInt(0, target.length - 1) ];\n\t    }\n\n\t    module.exports = choice;\n\n\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar MIN_INT = __webpack_require__(6);\n\tvar MAX_INT = __webpack_require__(7);\n\tvar rand = __webpack_require__(8);\n\n\t    /**\n\t     * Gets random integer inside range or snap to min/max values.\n\t     */\n\t    function randInt(min, max){\n\t        min = min == null? MIN_INT : ~~min;\n\t        max = max == null? MAX_INT : ~~max;\n\t        // can't be max + 0.5 otherwise it will round up if `rand`\n\t        // returns `max` causing it to overflow range.\n\t        // -0.5 and + 0.49 are required to avoid bias caused by rounding\n\t        return Math.round( rand(min - 0.5, max + 0.499999999999) );\n\t    }\n\n\t    module.exports = randInt;\n\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t/**\n\t * @constant Minimum 32-bit signed integer value (-2^31).\n\t */\n\n\t    module.exports = -2147483648;\n\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\t/**\n\t * @constant Maximum 32-bit signed integer value. (2^31 - 1)\n\t */\n\n\t    module.exports = 2147483647;\n\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar random = __webpack_require__(9);\n\tvar MIN_INT = __webpack_require__(6);\n\tvar MAX_INT = __webpack_require__(7);\n\n\t    /**\n\t     * Returns random number inside range\n\t     */\n\t    function rand(min, max){\n\t        min = min == null? MIN_INT : min;\n\t        max = max == null? MAX_INT : max;\n\t        return min + (max - min) * random();\n\t    }\n\n\t    module.exports = rand;\n\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t\n\n\t    /**\n\t     * Just a wrapper to Math.random. No methods inside mout/random should call\n\t     * Math.random() directly so we can inject the pseudo-random number\n\t     * generator if needed (ie. in case we need a seeded random or a better\n\t     * algorithm than the native one)\n\t     */\n\t    function random(){\n\t        return random.get();\n\t    }\n\n\t    // we expose the method so it can be swapped if needed\n\t    random.get = Math.random;\n\n\t    module.exports = random;\n\n\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar isKind = __webpack_require__(11);\n\t    /**\n\t     */\n\t    var isArray = Array.isArray || function (val) {\n\t        return isKind(val, 'Array');\n\t    };\n\t    module.exports = isArray;\n\n\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar kindOf = __webpack_require__(12);\n\t    /**\n\t     * Check if value is from a specific \"kind\".\n\t     */\n\t    function isKind(val, kind){\n\t        return kindOf(val) === kind;\n\t    }\n\t    module.exports = isKind;\n\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\t\n\n\t    var _rKind = /^\\[object (.*)\\]$/,\n\t        _toString = Object.prototype.toString,\n\t        UNDEF;\n\n\t    /**\n\t     * Gets the \"kind\" of value. (e.g. \"String\", \"Number\", etc)\n\t     */\n\t    function kindOf(val) {\n\t        if (val === null) {\n\t            return 'Null';\n\t        } else if (val === UNDEF) {\n\t            return 'Undefined';\n\t        } else {\n\t            return _rKind.exec( _toString.call(val) )[1];\n\t        }\n\t    }\n\t    module.exports = kindOf;\n\n\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar filter = __webpack_require__(14);\n\n\t    /**\n\t     * @return {array} Array of unique items\n\t     */\n\t    function unique(arr, compare){\n\t        compare = compare || isEqual;\n\t        return filter(arr, function(item, i, arr){\n\t            var n = arr.length;\n\t            while (++i < n) {\n\t                if ( compare(item, arr[i]) ) {\n\t                    return false;\n\t                }\n\t            }\n\t            return true;\n\t        });\n\t    }\n\n\t    function isEqual(a, b){\n\t        return a === b;\n\t    }\n\n\t    module.exports = unique;\n\n\n\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar makeIterator = __webpack_require__(15);\n\n\t    /**\n\t     * Array filter\n\t     */\n\t    function filter(arr, callback, thisObj) {\n\t        callback = makeIterator(callback, thisObj);\n\t        var results = [];\n\t        if (arr == null) {\n\t            return results;\n\t        }\n\n\t        var i = -1, len = arr.length, value;\n\t        while (++i < len) {\n\t            value = arr[i];\n\t            if (callback(value, i, arr)) {\n\t                results.push(value);\n\t            }\n\t        }\n\n\t        return results;\n\t    }\n\n\t    module.exports = filter;\n\n\n\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar identity = __webpack_require__(16);\n\tvar prop = __webpack_require__(17);\n\tvar deepMatches = __webpack_require__(18);\n\n\t    /**\n\t     * Converts argument into a valid iterator.\n\t     * Used internally on most array/object/collection methods that receives a\n\t     * callback/iterator providing a shortcut syntax.\n\t     */\n\t    function makeIterator(src, thisObj){\n\t        if (src == null) {\n\t            return identity;\n\t        }\n\t        switch(typeof src) {\n\t            case 'function':\n\t                // function is the first to improve perf (most common case)\n\t                // also avoid using `Function#call` if not needed, which boosts\n\t                // perf a lot in some cases\n\t                return (typeof thisObj !== 'undefined')? function(val, i, arr){\n\t                    return src.call(thisObj, val, i, arr);\n\t                } : src;\n\t            case 'object':\n\t                return function(val){\n\t                    return deepMatches(val, src);\n\t                };\n\t            case 'string':\n\t            case 'number':\n\t                return prop(src);\n\t        }\n\t    }\n\n\t    module.exports = makeIterator;\n\n\n\n\n/***/ },\n/* 16 */\n/***/ function(module, exports) {\n\n\t\n\n\t    /**\n\t     * Returns the first argument provided to it.\n\t     */\n\t    function identity(val){\n\t        return val;\n\t    }\n\n\t    module.exports = identity;\n\n\n\n\n/***/ },\n/* 17 */\n/***/ function(module, exports) {\n\n\t\n\n\t    /**\n\t     * Returns a function that gets a property of the passed object\n\t     */\n\t    function prop(name){\n\t        return function(obj){\n\t            return obj[name];\n\t        };\n\t    }\n\n\t    module.exports = prop;\n\n\n\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar forOwn = __webpack_require__(19);\n\tvar isArray = __webpack_require__(10);\n\n\t    function containsMatch(array, pattern) {\n\t        var i = -1, length = array.length;\n\t        while (++i < length) {\n\t            if (deepMatches(array[i], pattern)) {\n\t                return true;\n\t            }\n\t        }\n\n\t        return false;\n\t    }\n\n\t    function matchArray(target, pattern) {\n\t        var i = -1, patternLength = pattern.length;\n\t        while (++i < patternLength) {\n\t            if (!containsMatch(target, pattern[i])) {\n\t                return false;\n\t            }\n\t        }\n\n\t        return true;\n\t    }\n\n\t    function matchObject(target, pattern) {\n\t        var result = true;\n\t        forOwn(pattern, function(val, key) {\n\t            if (!deepMatches(target[key], val)) {\n\t                // Return false to break out of forOwn early\n\t                return (result = false);\n\t            }\n\t        });\n\n\t        return result;\n\t    }\n\n\t    /**\n\t     * Recursively check if the objects match.\n\t     */\n\t    function deepMatches(target, pattern){\n\t        if (target && typeof target === 'object') {\n\t            if (isArray(target) && isArray(pattern)) {\n\t                return matchArray(target, pattern);\n\t            } else {\n\t                return matchObject(target, pattern);\n\t            }\n\t        } else {\n\t            return target === pattern;\n\t        }\n\t    }\n\n\t    module.exports = deepMatches;\n\n\n\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar hasOwn = __webpack_require__(20);\n\tvar forIn = __webpack_require__(21);\n\n\t    /**\n\t     * Similar to Array/forEach but works over object properties and fixes Don't\n\t     * Enum bug on IE.\n\t     * based on: http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n\t     */\n\t    function forOwn(obj, fn, thisObj){\n\t        forIn(obj, function(val, key){\n\t            if (hasOwn(obj, key)) {\n\t                return fn.call(thisObj, obj[key], key, obj);\n\t            }\n\t        });\n\t    }\n\n\t    module.exports = forOwn;\n\n\n\n\n/***/ },\n/* 20 */\n/***/ function(module, exports) {\n\n\t\n\n\t    /**\n\t     * Safer Object.hasOwnProperty\n\t     */\n\t     function hasOwn(obj, prop){\n\t         return Object.prototype.hasOwnProperty.call(obj, prop);\n\t     }\n\n\t     module.exports = hasOwn;\n\n\n\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar hasOwn = __webpack_require__(20);\n\n\t    var _hasDontEnumBug,\n\t        _dontEnums;\n\n\t    function checkDontEnum(){\n\t        _dontEnums = [\n\t                'toString',\n\t                'toLocaleString',\n\t                'valueOf',\n\t                'hasOwnProperty',\n\t                'isPrototypeOf',\n\t                'propertyIsEnumerable',\n\t                'constructor'\n\t            ];\n\n\t        _hasDontEnumBug = true;\n\n\t        for (var key in {'toString': null}) {\n\t            _hasDontEnumBug = false;\n\t        }\n\t    }\n\n\t    /**\n\t     * Similar to Array/forEach but works over object properties and fixes Don't\n\t     * Enum bug on IE.\n\t     * based on: http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n\t     */\n\t    function forIn(obj, fn, thisObj){\n\t        var key, i = 0;\n\t        // no need to check if argument is a real object that way we can use\n\t        // it for arrays, functions, date, etc.\n\n\t        //post-pone check till needed\n\t        if (_hasDontEnumBug == null) checkDontEnum();\n\n\t        for (key in obj) {\n\t            if (exec(fn, obj, key, thisObj) === false) {\n\t                break;\n\t            }\n\t        }\n\n\n\t        if (_hasDontEnumBug) {\n\t            var ctor = obj.constructor,\n\t                isProto = !!ctor && obj === ctor.prototype;\n\n\t            while (key = _dontEnums[i++]) {\n\t                // For constructor, if it is a prototype object the constructor\n\t                // is always non-enumerable unless defined otherwise (and\n\t                // enumerated above).  For non-prototype objects, it will have\n\t                // to be defined on this object, since it cannot be defined on\n\t                // any prototype objects.\n\t                //\n\t                // For other [[DontEnum]] properties, check if the value is\n\t                // different than Object prototype value.\n\t                if (\n\t                    (key !== 'constructor' ||\n\t                        (!isProto && hasOwn(obj, key))) &&\n\t                    obj[key] !== Object.prototype[key]\n\t                ) {\n\t                    if (exec(fn, obj, key, thisObj) === false) {\n\t                        break;\n\t                    }\n\t                }\n\t            }\n\t        }\n\t    }\n\n\t    function exec(fn, obj, key, thisObj){\n\t        return fn.call(thisObj, obj[key], key, obj);\n\t    }\n\n\t    module.exports = forIn;\n\n\n\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar makeIterator = __webpack_require__(15);\n\n\t    /**\n\t     * Array map\n\t     */\n\t    function map(arr, callback, thisObj) {\n\t        callback = makeIterator(callback, thisObj);\n\t        var results = [];\n\t        if (arr == null){\n\t            return results;\n\t        }\n\n\t        var i = -1, len = arr.length;\n\t        while (++i < len) {\n\t            results[i] = callback(arr[i], i, arr);\n\t        }\n\n\t        return results;\n\t    }\n\n\t     module.exports = map;\n\n\n\n/***/ }\n/******/ ])\n});\n;","/*!\n * js-data\n * @version 2.10.1 - Homepage <http://www.js-data.io/>\n * @author Jason Dobry <jason.dobry@gmail.com>\n * @copyright (c) 2014-2016 Jason Dobry \n * @license MIT <https://github.com/js-data/js-data/blob/master/LICENSE>\n * \n * @overview Robust framework-agnostic data store.\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"JSData\"] = factory();\n\telse\n\t\troot[\"JSData\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _index = __webpack_require__(1);\n\t\n\tvar _index2 = _interopRequireDefault(_index);\n\t\n\tvar _utils = __webpack_require__(2);\n\t\n\tvar _utils2 = _interopRequireDefault(_utils);\n\t\n\tvar _errors = __webpack_require__(3);\n\t\n\tvar _errors2 = _interopRequireDefault(_errors);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * The library export.\n\t *   - window.JSData\n\t *   - require('js-data')\n\t *   - define(['js-data', function (JSData) { ... }]);\n\t *   - import JSData from 'js-data'\n\t */\n\tmodule.exports = {\n\t  DS: _index2.default,\n\t  DSUtils: _utils2.default,\n\t  DSErrors: _errors2.default,\n\t  createStore: function createStore(options) {\n\t    return new _index2.default(options);\n\t  },\n\t\n\t  version: {\n\t    full: '2.10.1',\n\t    major: parseInt('2', 10),\n\t    minor: parseInt('10', 10),\n\t    patch: parseInt('1', 10),\n\t    alpha:  true ? 'false' : false,\n\t    beta:  true ? 'false' : false\n\t  }\n\t};\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* jshint eqeqeq:false */\n\t\n\t\n\tvar _utils = __webpack_require__(2);\n\t\n\tvar _utils2 = _interopRequireDefault(_utils);\n\t\n\tvar _errors = __webpack_require__(3);\n\t\n\tvar _errors2 = _interopRequireDefault(_errors);\n\t\n\tvar _index = __webpack_require__(41);\n\t\n\tvar _index2 = _interopRequireDefault(_index);\n\t\n\tvar _index3 = __webpack_require__(47);\n\t\n\tvar _index4 = _interopRequireDefault(_index3);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction lifecycleNoopCb(resource, attrs, cb) {\n\t  cb(null, attrs);\n\t}\n\t\n\tfunction lifecycleNoop(resource, attrs) {\n\t  return attrs;\n\t}\n\t\n\tfunction compare(orderBy, index, a, b) {\n\t  var def = orderBy[index];\n\t  var cA = _utils2.default.get(a, def[0]);\n\t  var cB = _utils2.default.get(b, def[0]);\n\t  if (_utils2.default._s(cA)) {\n\t    cA = _utils2.default.upperCase(cA);\n\t  }\n\t  if (_utils2.default._s(cB)) {\n\t    cB = _utils2.default.upperCase(cB);\n\t  }\n\t  if (def[1] === 'DESC') {\n\t    if (cB < cA) {\n\t      return -1;\n\t    } else if (cB > cA) {\n\t      return 1;\n\t    } else {\n\t      if (index < orderBy.length - 1) {\n\t        return compare(orderBy, index + 1, a, b);\n\t      } else {\n\t        return 0;\n\t      }\n\t    }\n\t  } else {\n\t    if (cA < cB) {\n\t      return -1;\n\t    } else if (cA > cB) {\n\t      return 1;\n\t    } else {\n\t      if (index < orderBy.length - 1) {\n\t        return compare(orderBy, index + 1, a, b);\n\t      } else {\n\t        return 0;\n\t      }\n\t    }\n\t  }\n\t}\n\t\n\tvar Defaults = function () {\n\t  function Defaults() {\n\t    _classCallCheck(this, Defaults);\n\t  }\n\t\n\t  _createClass(Defaults, [{\n\t    key: 'errorFn',\n\t    value: function errorFn(a, b) {\n\t      if (this.error && typeof this.error === 'function') {\n\t        try {\n\t          if (typeof a === 'string') {\n\t            throw new Error(a);\n\t          } else {\n\t            throw a;\n\t          }\n\t        } catch (err) {\n\t          a = err;\n\t        }\n\t        this.error(this.name || null, a || null, b || null);\n\t      }\n\t    }\n\t  }]);\n\t\n\t  return Defaults;\n\t}();\n\t\n\tvar defaultsPrototype = Defaults.prototype;\n\t\n\tdefaultsPrototype.actions = {};\n\tdefaultsPrototype.afterCreate = lifecycleNoopCb;\n\tdefaultsPrototype.afterCreateCollection = lifecycleNoop;\n\tdefaultsPrototype.afterCreateInstance = lifecycleNoop;\n\tdefaultsPrototype.afterDestroy = lifecycleNoopCb;\n\tdefaultsPrototype.afterEject = lifecycleNoop;\n\tdefaultsPrototype.afterFind = lifecycleNoopCb;\n\tdefaultsPrototype.afterFindAll = lifecycleNoopCb;\n\tdefaultsPrototype.afterInject = lifecycleNoop;\n\tdefaultsPrototype.afterLoadRelations = lifecycleNoopCb;\n\tdefaultsPrototype.afterReap = lifecycleNoop;\n\tdefaultsPrototype.afterUpdate = lifecycleNoopCb;\n\tdefaultsPrototype.afterValidate = lifecycleNoopCb;\n\tdefaultsPrototype.allowSimpleWhere = true;\n\tdefaultsPrototype.applyDefaultsOnInject = false;\n\tdefaultsPrototype.basePath = '';\n\tdefaultsPrototype.beforeCreate = lifecycleNoopCb;\n\tdefaultsPrototype.beforeCreateCollection = lifecycleNoop;\n\tdefaultsPrototype.beforeCreateInstance = lifecycleNoop;\n\tdefaultsPrototype.beforeDestroy = lifecycleNoopCb;\n\tdefaultsPrototype.beforeEject = lifecycleNoop;\n\tdefaultsPrototype.beforeInject = lifecycleNoop;\n\tdefaultsPrototype.beforeReap = lifecycleNoop;\n\tdefaultsPrototype.beforeUpdate = lifecycleNoopCb;\n\tdefaultsPrototype.beforeValidate = lifecycleNoopCb;\n\tdefaultsPrototype.bypassCache = false;\n\tdefaultsPrototype.cacheResponse = !!_utils2.default.w;\n\tdefaultsPrototype.csp = false;\n\tdefaultsPrototype.clearEmptyQueries = true;\n\tdefaultsPrototype.computed = {};\n\tdefaultsPrototype.defaultAdapter = 'http';\n\tdefaultsPrototype.debug = false;\n\tdefaultsPrototype.defaultValues = {};\n\tdefaultsPrototype.eagerEject = false;\n\t// TODO: Implement eagerInject in DS#create\n\tdefaultsPrototype.eagerInject = false;\n\tdefaultsPrototype.endpoint = '';\n\tdefaultsPrototype.error = console ? function (a, b, c) {\n\t  return console[typeof console.error === 'function' ? 'error' : 'log'](a, b, c);\n\t} : false;\n\tdefaultsPrototype.errorHandler = function () {\n\t  return _utils2.default.Promise.reject(arguments.length <= 0 ? undefined : arguments[0]);\n\t};\n\tdefaultsPrototype.fallbackAdapters = ['http'];\n\tdefaultsPrototype.findStrictCache = false;\n\tdefaultsPrototype.idAttribute = 'id';\n\tdefaultsPrototype.ignoredChanges = [/\\$/];\n\tdefaultsPrototype.instanceEvents = !!_utils2.default.w;\n\tdefaultsPrototype.keepChangeHistory = false;\n\tdefaultsPrototype.linkRelations = !!_utils2.default.w;\n\tdefaultsPrototype.log = console ? function (a, b, c, d, e) {\n\t  return console[typeof console.info === 'function' ? 'info' : 'log'](a, b, c, d, e);\n\t} : false;\n\t\n\tdefaultsPrototype.logFn = function (a, b, c, d) {\n\t  var _this = this;\n\t  if (_this.debug && _this.log && typeof _this.log === 'function') {\n\t    _this.log(_this.name || null, a || null, b || null, c || null, d || null);\n\t  }\n\t};\n\t\n\tdefaultsPrototype.maxAge = false;\n\tdefaultsPrototype.methods = {};\n\tdefaultsPrototype.notify = !!_utils2.default.w;\n\tdefaultsPrototype.omit = [];\n\tdefaultsPrototype.onConflict = 'merge';\n\tdefaultsPrototype.reapAction = _utils2.default.w ? 'inject' : 'none';\n\tdefaultsPrototype.reapInterval = _utils2.default.w ? 30000 : false;\n\tdefaultsPrototype.relationsEnumerable = false;\n\tdefaultsPrototype.resetHistoryOnInject = true;\n\tdefaultsPrototype.returnMeta = false;\n\tdefaultsPrototype.scopes = {};\n\tdefaultsPrototype.strategy = 'single';\n\tdefaultsPrototype.upsert = !!_utils2.default.w;\n\tdefaultsPrototype.useClass = true;\n\tdefaultsPrototype.useFilter = false;\n\tdefaultsPrototype.usePendingFind = true;\n\tdefaultsPrototype.usePendingFindAll = true;\n\tdefaultsPrototype.validate = lifecycleNoopCb;\n\tdefaultsPrototype.watchChanges = !!_utils2.default.w;\n\t\n\tvar escapeRegExp = /([.*+?^=!:${}()|[\\]\\/\\\\])/g;\n\tvar percentRegExp = /%/g;\n\tvar underscoreRegExp = /_/g;\n\t\n\tfunction escape(pattern) {\n\t  return pattern.replace(escapeRegExp, '\\\\$1');\n\t}\n\t\n\tfunction like(pattern, flags) {\n\t  return new RegExp('^' + escape(pattern).replace(percentRegExp, '.*').replace(underscoreRegExp, '.') + '$', flags);\n\t}\n\t\n\tdefaultsPrototype.defaultFilter = function (collection, resourceName, params, options) {\n\t  var definition = this.definitions[resourceName];\n\t  var idA = 'id';\n\t  var resource = void 0;\n\t  if (definition) {\n\t    idA = definition.idAttribute;\n\t    resource = this.store[resourceName];\n\t  }\n\t  var filtered = collection;\n\t  var where = null;\n\t  var reserved = {\n\t    skip: '',\n\t    offset: '',\n\t    where: '',\n\t    limit: '',\n\t    orderBy: '',\n\t    sort: ''\n\t  };\n\t\n\t  params = params || {};\n\t  options = options || {};\n\t\n\t  if (_utils2.default._o(params.where)) {\n\t    where = params.where;\n\t  } else {\n\t    where = {};\n\t  }\n\t\n\t  if (options.allowSimpleWhere) {\n\t    _utils2.default.forOwn(params, function (value, key) {\n\t      if (!(key in reserved) && !(key in where)) {\n\t        where[key] = {\n\t          '==': value\n\t        };\n\t      }\n\t    });\n\t  }\n\t\n\t  if (_utils2.default.isEmpty(where)) {\n\t    where = null;\n\t  }\n\t\n\t  if (where) {\n\t    filtered = _utils2.default.filter(filtered, function (attrs) {\n\t      var first = true;\n\t      var keep = true;\n\t\n\t      if (options.excludeTemporary && resource && resource.temporaryItems[attrs[idA]]) {\n\t        return false;\n\t      }\n\t\n\t      _utils2.default.forOwn(where, function (clause, field) {\n\t        if (!_utils2.default._o(clause)) {\n\t          clause = {\n\t            '==': clause\n\t          };\n\t        }\n\t        _utils2.default.forOwn(clause, function (term, op) {\n\t          var expr = void 0;\n\t          var isOr = op[0] === '|';\n\t          var val = _utils2.default.get(attrs, field);\n\t          op = isOr ? op.substr(1) : op;\n\t          if (op === '==') {\n\t            expr = val == term; // eslint-disable-line\n\t          } else if (op === '===') {\n\t            expr = val === term;\n\t          } else if (op === '!=') {\n\t            expr = val != term; // eslint-disable-line\n\t          } else if (op === '!==') {\n\t            expr = val !== term;\n\t          } else if (op === '>') {\n\t            expr = val > term;\n\t          } else if (op === '>=') {\n\t            expr = val >= term;\n\t          } else if (op === '<') {\n\t            expr = val < term;\n\t          } else if (op === '<=') {\n\t            expr = val <= term;\n\t          } else if (op === 'isectEmpty') {\n\t            expr = !_utils2.default.intersection(val || [], term || []).length;\n\t          } else if (op === 'isectNotEmpty') {\n\t            expr = _utils2.default.intersection(val || [], term || []).length;\n\t          } else if (op === 'in') {\n\t            if (_utils2.default._s(term)) {\n\t              expr = term.indexOf(val) !== -1;\n\t            } else {\n\t              expr = _utils2.default.contains(term, val);\n\t            }\n\t          } else if (op === 'notIn') {\n\t            if (_utils2.default._s(term)) {\n\t              expr = term.indexOf(val) === -1;\n\t            } else {\n\t              expr = !_utils2.default.contains(term, val);\n\t            }\n\t          } else if (op.indexOf('like') === 0) {\n\t            expr = like(term, op.substr(4)).exec(val) !== null;\n\t          } else if (op.indexOf('notLike') === 0) {\n\t            expr = like(term, op.substr(7)).exec(val) === null;\n\t          } else if (op === 'contains') {\n\t            if (_utils2.default._s(val)) {\n\t              expr = val.indexOf(term) !== -1;\n\t            } else {\n\t              expr = _utils2.default.contains(val, term);\n\t            }\n\t          } else if (op === 'notContains') {\n\t            if (_utils2.default._s(val)) {\n\t              expr = val.indexOf(term) === -1;\n\t            } else {\n\t              expr = !_utils2.default.contains(val, term);\n\t            }\n\t          }\n\t          if (expr !== undefined) {\n\t            keep = first ? expr : isOr ? keep || expr : keep && expr;\n\t          }\n\t          first = false;\n\t        });\n\t      });\n\t\n\t      return keep;\n\t    });\n\t  } else if (options.excludeTemporary && resource) {\n\t    filtered = _utils2.default.filter(filtered, function (attrs) {\n\t      return resource.temporaryItems[attrs[idA]];\n\t    });\n\t  }\n\t\n\t  var orderBy = null;\n\t\n\t  if (_utils2.default._s(params.orderBy)) {\n\t    orderBy = [[params.orderBy, 'ASC']];\n\t  } else if (_utils2.default._a(params.orderBy)) {\n\t    orderBy = params.orderBy;\n\t  }\n\t\n\t  if (!orderBy && _utils2.default._s(params.sort)) {\n\t    orderBy = [[params.sort, 'ASC']];\n\t  } else if (!orderBy && _utils2.default._a(params.sort)) {\n\t    orderBy = params.sort;\n\t  }\n\t\n\t  // Apply 'orderBy'\n\t  if (orderBy) {\n\t    var index = 0;\n\t    _utils2.default.forEach(orderBy, function (def, i) {\n\t      if (_utils2.default._s(def)) {\n\t        orderBy[i] = [def, 'ASC'];\n\t      } else if (!_utils2.default._a(def)) {\n\t        throw new _errors2.default.IA('DS.filter(\"' + resourceName + '\"[, params][, options]): ' + _utils2.default.toJson(def) + ': Must be a string or an array!', {\n\t          params: {\n\t            'orderBy[i]': {\n\t              actual: typeof def === 'undefined' ? 'undefined' : _typeof(def),\n\t              expected: 'string|array'\n\t            }\n\t          }\n\t        });\n\t      }\n\t    });\n\t    filtered = _utils2.default.sort(filtered, function (a, b) {\n\t      return compare(orderBy, index, a, b);\n\t    });\n\t  }\n\t\n\t  var limit = _utils2.default._n(params.limit) ? params.limit : null;\n\t  var skip = null;\n\t\n\t  if (_utils2.default._n(params.skip)) {\n\t    skip = params.skip;\n\t  } else if (_utils2.default._n(params.offset)) {\n\t    skip = params.offset;\n\t  }\n\t\n\t  // Apply 'limit' and 'skip'\n\t  if (limit && skip) {\n\t    filtered = _utils2.default.slice(filtered, skip, Math.min(filtered.length, skip + limit));\n\t  } else if (_utils2.default._n(limit)) {\n\t    filtered = _utils2.default.slice(filtered, 0, Math.min(filtered.length, limit));\n\t  } else if (_utils2.default._n(skip)) {\n\t    if (skip < filtered.length) {\n\t      filtered = _utils2.default.slice(filtered, skip);\n\t    } else {\n\t      filtered = [];\n\t    }\n\t  }\n\t\n\t  return filtered === collection ? filtered.slice() : filtered;\n\t};\n\t\n\tvar DS = function () {\n\t  function DS(options) {\n\t    _classCallCheck(this, DS);\n\t\n\t    var _this = this;\n\t    options = options || {};\n\t\n\t    _this.store = {};\n\t    _this.definitions = {};\n\t    _this.adapters = {};\n\t    _this.defaults = new Defaults();\n\t    _this.observe = _utils2.default.observe;\n\t    _utils2.default.forOwn(options, function (v, k) {\n\t      if (k === 'omit') {\n\t        _this.defaults.omit = v.concat(Defaults.prototype.omit);\n\t      } else {\n\t        _this.defaults[k] = v;\n\t      }\n\t    });\n\t\n\t    var P = _utils2.default.Promise;\n\t\n\t    if (P && !P.prototype.spread) {\n\t      P.prototype.spread = function (cb) {\n\t        return this.then(function (arr) {\n\t          return cb.apply(this, arr);\n\t        });\n\t      };\n\t    }\n\t\n\t    _utils2.default.Events(_this);\n\t  }\n\t\n\t  _createClass(DS, [{\n\t    key: 'getAdapterName',\n\t    value: function getAdapterName(options) {\n\t      var errorIfNotExist = false;\n\t      options = options || {};\n\t      if (_utils2.default._s(options)) {\n\t        errorIfNotExist = true;\n\t        options = {\n\t          adapter: options\n\t        };\n\t      }\n\t      if (this.adapters[options.adapter]) {\n\t        return options.adapter;\n\t      } else if (errorIfNotExist) {\n\t        throw new Error(options.adapter + ' is not a registered adapter!');\n\t      } else {\n\t        return options.defaultAdapter;\n\t      }\n\t    }\n\t  }, {\n\t    key: 'getAdapter',\n\t    value: function getAdapter(options) {\n\t      options = options || {};\n\t      return this.adapters[this.getAdapterName(options)];\n\t    }\n\t  }, {\n\t    key: 'registerAdapter',\n\t    value: function registerAdapter(name, Adapter, options) {\n\t      var _this = this;\n\t      options = options || {};\n\t      if (_utils2.default.isFunction(Adapter)) {\n\t        _this.adapters[name] = new Adapter(options);\n\t      } else {\n\t        _this.adapters[name] = Adapter;\n\t      }\n\t      if (options.default) {\n\t        _this.defaults.defaultAdapter = name;\n\t      }\n\t    }\n\t  }, {\n\t    key: 'is',\n\t    value: function is(resourceName, instance) {\n\t      var definition = this.definitions[resourceName];\n\t      if (!definition) {\n\t        throw new _errors2.default.NER(resourceName);\n\t      }\n\t      return instance instanceof definition[definition.class];\n\t    }\n\t  }, {\n\t    key: 'clear',\n\t    value: function clear() {\n\t      var _this2 = this;\n\t\n\t      var ejected = {};\n\t      _utils2.default.forOwn(this.definitions, function (definition) {\n\t        var name = definition.name;\n\t        ejected[name] = definition.ejectAll();\n\t        _this2.store[name].completedQueries = {};\n\t        _this2.store[name].queryData = {};\n\t      });\n\t      return ejected;\n\t    }\n\t  }, {\n\t    key: 'errorFn',\n\t    value: function errorFn() {\n\t      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t        args[_key] = arguments[_key];\n\t      }\n\t\n\t      var options = args[args.length - 1];\n\t      var defaultHandler = this.defaults.errorHandler;\n\t      var errorHandler = options ? options.errorHandler : defaultHandler;\n\t      errorHandler = errorHandler || defaultHandler;\n\t      return function (err) {\n\t        return errorHandler.apply(undefined, [err].concat(args));\n\t      };\n\t    }\n\t  }]);\n\t\n\t  return DS;\n\t}();\n\t\n\tvar dsPrototype = DS.prototype;\n\t\n\tdsPrototype.getAdapterName.shorthand = false;\n\tdsPrototype.getAdapter.shorthand = false;\n\tdsPrototype.registerAdapter.shorthand = false;\n\tdsPrototype.errors = _errors2.default;\n\tdsPrototype.utils = _utils2.default;\n\t\n\tfunction addMethods(target, obj) {\n\t  _utils2.default.forOwn(obj, function (v, k) {\n\t    target[k] = v;\n\t    target[k].before = function (fn) {\n\t      var orig = target[k];\n\t      target[k] = function () {\n\t        for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t          args[_key2] = arguments[_key2];\n\t        }\n\t\n\t        return orig.apply(this, fn.apply(this, args) || args);\n\t      };\n\t    };\n\t  });\n\t}\n\t\n\taddMethods(dsPrototype, _index2.default);\n\taddMethods(dsPrototype, _index4.default);\n\t\n\texports.default = DS;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; /* jshint eqeqeq:false */\n\t\n\t/**\n\t * Mix of ES6 and CommonJS module imports because the interop of Babel + Webpack + ES6 modules + CommonJS isn't very good.\n\t */\n\t\n\t\n\tvar _errors = __webpack_require__(3);\n\t\n\tvar _errors2 = _interopRequireDefault(_errors);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar BinaryHeap = __webpack_require__(4);\n\tvar forEach = __webpack_require__(5);\n\tvar slice = __webpack_require__(6);\n\tvar forOwn = __webpack_require__(7);\n\tvar contains = __webpack_require__(10);\n\tvar deepMixIn = __webpack_require__(12);\n\tvar pascalCase = __webpack_require__(14);\n\tvar remove = __webpack_require__(21);\n\tvar pick = __webpack_require__(22);\n\tvar _keys = __webpack_require__(23);\n\tvar sort = __webpack_require__(24);\n\tvar upperCase = __webpack_require__(19);\n\tvar get = __webpack_require__(25);\n\tvar set = __webpack_require__(27);\n\tvar observe = __webpack_require__(29);\n\tvar guid = __webpack_require__(30);\n\tvar w = void 0,\n\t    P = void 0,\n\t    File = void 0;\n\tvar objectProto = Object.prototype;\n\tvar toString = objectProto.toString;\n\t\n\t/**\n\t * Attempt to detect the global Promise constructor.\n\t * JSData will still work without one, as long you do something like this:\n\t *\n\t * var JSData = require('js-data');\n\t * JSData.DSUtils.Promise = MyPromiseLib;\n\t */\n\ttry {\n\t  P = Promise;\n\t} catch (e) {\n\t  console.error('js-data requires a global Promise constructor!');\n\t}\n\t\n\ttry {\n\t  File = window.File;\n\t} catch (e) {\n\t  File = function File() {};\n\t}\n\t\n\tfunction _isArray(value) {\n\t  return toString.call(value) === '[object Array]' || false;\n\t}\n\t\n\tvar isArray = Array.isArray || _isArray;\n\t\n\tfunction isRegExp(value) {\n\t  return toString.call(value) === '[object RegExp]' || false;\n\t}\n\t\n\t// adapted from lodash.isString\n\tfunction isString(value) {\n\t  return typeof value === 'string' || value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && toString.call(value) === '[object String]' || false;\n\t}\n\t\n\tfunction isObject(value) {\n\t  return toString.call(value) === '[object Object]' || false;\n\t}\n\t\n\t// adapted from lodash.isDate\n\tfunction isDate(value) {\n\t  return value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && toString.call(value) === '[object Date]' || false;\n\t}\n\t\n\t// adapted from lodash.isNumber\n\tfunction isNumber(value) {\n\t  var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);\n\t  return type === 'number' || value && type === 'object' && toString.call(value) === '[object Number]' || false;\n\t}\n\t\n\t// adapted from lodash.isFunction\n\tfunction isFunction(value) {\n\t  return typeof value === 'function' || value && toString.call(value) === '[object Function]' || false;\n\t}\n\t\n\t// shorthand argument checking functions, using these shaves 1.18 kb off of the minified build\n\tfunction isStringOrNumber(value) {\n\t  return isString(value) || isNumber(value);\n\t}\n\t\n\tfunction isStringOrNumberErr(field) {\n\t  return new _errors2.default.IA('\"' + field + '\" must be a string or a number!');\n\t}\n\t\n\tfunction isObjectErr(field) {\n\t  return new _errors2.default.IA('\"' + field + '\" must be an object!');\n\t}\n\t\n\tfunction isArrayErr(field) {\n\t  return new _errors2.default.IA('\"' + field + '\" must be an array!');\n\t}\n\t\n\t// adapted from mout.isEmpty\n\tfunction isEmpty(val) {\n\t  if (val == null) {\n\t    // jshint ignore:line\n\t    // typeof null == 'object' so we check it first\n\t    return true;\n\t  } else if (typeof val === 'string' || isArray(val)) {\n\t    return !val.length;\n\t  } else if ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object') {\n\t    var result = true;\n\t    forOwn(val, function () {\n\t      result = false;\n\t      return false; // break loop\n\t    });\n\t    return result;\n\t  } else {\n\t    return true;\n\t  }\n\t}\n\t\n\t// Find the intersection between two arrays\n\tfunction intersection(array1, array2) {\n\t  if (!array1 || !array2) {\n\t    return [];\n\t  }\n\t  var result = [];\n\t  var item = void 0;\n\t  for (var i = 0, length = array1.length; i < length; i++) {\n\t    item = array1[i];\n\t    if (contains(result, item)) {\n\t      continue;\n\t    }\n\t    if (contains(array2, item)) {\n\t      result.push(item);\n\t    }\n\t  }\n\t  return result;\n\t}\n\t\n\tfunction filter(array, cb, thisObj) {\n\t  var results = [];\n\t  forEach(array, function (value, key, arr) {\n\t    if (cb(value, key, arr)) {\n\t      results.push(value);\n\t    }\n\t  }, thisObj);\n\t  return results;\n\t}\n\t\n\t/**\n\t * Attempt to detect whether we are in the browser.\n\t */\n\ttry {\n\t  w = window;\n\t  w = {};\n\t} catch (e) {\n\t  w = null;\n\t}\n\t\n\t/**\n\t * Event mixin. Usage:\n\t *\n\t * function handler() { ... }\n\t * Events(myObject);\n\t * myObject.on('foo', handler);\n\t * myObject.emit('foo', 'some', 'data');\n\t * myObject.off('foo', handler);\n\t */\n\tfunction Events(target) {\n\t  var events = {};\n\t  target = target || this;\n\t  Object.defineProperties(target, {\n\t    on: {\n\t      value: function value(type, func, ctx) {\n\t        events[type] = events[type] || [];\n\t        events[type].push({\n\t          f: func,\n\t          c: ctx\n\t        });\n\t      }\n\t    },\n\t    off: {\n\t      value: function value(type, func) {\n\t        var listeners = events[type];\n\t        if (!listeners) {\n\t          events = {};\n\t        } else if (func) {\n\t          for (var i = 0; i < listeners.length; i++) {\n\t            if (listeners[i].f === func) {\n\t              listeners.splice(i, 1);\n\t              break;\n\t            }\n\t          }\n\t        } else {\n\t          listeners.splice(0, listeners.length);\n\t        }\n\t      }\n\t    },\n\t    emit: {\n\t      value: function value() {\n\t        for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t          args[_key] = arguments[_key];\n\t        }\n\t\n\t        var listeners = events[args.shift()] || [];\n\t        if (listeners) {\n\t          for (var i = 0; i < listeners.length; i++) {\n\t            listeners[i].f.apply(listeners[i].c, args);\n\t          }\n\t        }\n\t      }\n\t    }\n\t  });\n\t}\n\t\n\t/**\n\t * Lifecycle hooks that should support promises.\n\t */\n\tvar toPromisify = ['beforeValidate', 'validate', 'afterValidate', 'beforeCreate', 'afterCreate', 'beforeUpdate', 'afterUpdate', 'beforeDestroy', 'afterDestroy'];\n\t\n\t/**\n\t * Return whether \"prop\" is in the blacklist.\n\t */\n\tvar isBlacklisted = observe.isBlacklisted;\n\t\n\t// adapted from angular.copy\n\tfunction copy(source, destination, stackSource, stackDest, blacklist) {\n\t  if (!destination) {\n\t    destination = source;\n\t    if (source) {\n\t      if (isArray(source)) {\n\t        destination = copy(source, [], stackSource, stackDest, blacklist);\n\t      } else if (isDate(source)) {\n\t        destination = new Date(source.getTime());\n\t      } else if (isRegExp(source)) {\n\t        destination = new RegExp(source.source, source.toString().match(/[^\\/]*$/)[0]);\n\t        destination.lastIndex = source.lastIndex;\n\t      } else if (isObject(source)) {\n\t        destination = copy(source, Object.create(Object.getPrototypeOf(source)), stackSource, stackDest, blacklist);\n\t      }\n\t    }\n\t  } else {\n\t    if (source === destination) {\n\t      throw new Error('Cannot copy! Source and destination are identical.');\n\t    }\n\t\n\t    stackSource = stackSource || [];\n\t    stackDest = stackDest || [];\n\t\n\t    if (isObject(source)) {\n\t      var index = stackSource.indexOf(source);\n\t      if (index !== -1) {\n\t        return stackDest[index];\n\t      }\n\t\n\t      stackSource.push(source);\n\t      stackDest.push(destination);\n\t    }\n\t\n\t    var result = void 0;\n\t    if (isArray(source)) {\n\t      var i = void 0;\n\t      destination.length = 0;\n\t      for (i = 0; i < source.length; i++) {\n\t        result = copy(source[i], null, stackSource, stackDest, blacklist);\n\t        if (isObject(source[i])) {\n\t          stackSource.push(source[i]);\n\t          stackDest.push(result);\n\t        }\n\t        destination.push(result);\n\t      }\n\t    } else {\n\t      if (isArray(destination)) {\n\t        destination.length = 0;\n\t      } else {\n\t        forEach(destination, function (value, key) {\n\t          delete destination[key];\n\t        });\n\t      }\n\t      for (var key in source) {\n\t        if (source.hasOwnProperty(key)) {\n\t          if (isBlacklisted(key, blacklist)) {\n\t            continue;\n\t          }\n\t          result = copy(source[key], null, stackSource, stackDest, blacklist);\n\t          if (isObject(source[key])) {\n\t            stackSource.push(source[key]);\n\t            stackDest.push(result);\n\t          }\n\t          destination[key] = result;\n\t        }\n\t      }\n\t    }\n\t  }\n\t  return destination;\n\t}\n\t\n\t// adapted from angular.equals\n\tfunction equals(o1, o2) {\n\t  if (o1 === o2) {\n\t    return true;\n\t  }\n\t  if (o1 === null || o2 === null) {\n\t    return false;\n\t  }\n\t  if (o1 !== o1 && o2 !== o2) {\n\t    // eslint-disable-line\n\t    return true;\n\t  } // NaN === NaN\n\t  var t1 = typeof o1 === 'undefined' ? 'undefined' : _typeof(o1);\n\t  var t2 = typeof o2 === 'undefined' ? 'undefined' : _typeof(o2);\n\t  var length, key, keySet;\n\t  if (t1 == t2) {\n\t    // eslint-disable-line\n\t    if (t1 == 'object') {\n\t      // eslint-disable-line\n\t      if (isArray(o1)) {\n\t        if (!isArray(o2)) {\n\t          return false;\n\t        }\n\t        if ((length = o1.length) === o2.length) {\n\t          // jshint ignore:line\n\t          for (key = 0; key < length; key++) {\n\t            if (!equals(o1[key], o2[key])) {\n\t              return false;\n\t            }\n\t          }\n\t          return true;\n\t        }\n\t      } else if (isDate(o1)) {\n\t        if (!isDate(o2)) {\n\t          return false;\n\t        }\n\t        return equals(o1.getTime(), o2.getTime());\n\t      } else if (isRegExp(o1) && isRegExp(o2)) {\n\t        return o1.toString() == o2.toString(); // eslint-disable-line\n\t      } else {\n\t        if (isArray(o2)) {\n\t          return false;\n\t        }\n\t        keySet = {};\n\t        for (key in o1) {\n\t          if (key.charAt(0) === '$' || isFunction(o1[key])) {\n\t            continue;\n\t          }\n\t          if (!equals(o1[key], o2[key])) {\n\t            return false;\n\t          }\n\t          keySet[key] = true;\n\t        }\n\t        for (key in o2) {\n\t          if (!keySet.hasOwnProperty(key) && key.charAt(0) !== '$' && o2[key] !== undefined && !isFunction(o2[key])) {\n\t            return false;\n\t          }\n\t        }\n\t        return true;\n\t      }\n\t    }\n\t  }\n\t  return false;\n\t}\n\t\n\t/**\n\t * Given either an instance or the primary key of an instance, return the primary key.\n\t */\n\tfunction resolveId(definition, idOrInstance) {\n\t  if (isString(idOrInstance) || isNumber(idOrInstance)) {\n\t    return idOrInstance;\n\t  } else if (idOrInstance && definition) {\n\t    return idOrInstance[definition.idAttribute] || idOrInstance;\n\t  } else {\n\t    return idOrInstance;\n\t  }\n\t}\n\t\n\t/**\n\t * Given either an instance or the primary key of an instance, return the instance.\n\t */\n\tfunction resolveItem(resource, idOrInstance) {\n\t  if (resource && (isString(idOrInstance) || isNumber(idOrInstance))) {\n\t    return resource.index[idOrInstance] || idOrInstance;\n\t  } else {\n\t    return idOrInstance;\n\t  }\n\t}\n\t\n\tfunction isValidString(val) {\n\t  return val != null && val !== ''; // jshint ignore:line\n\t}\n\t\n\tfunction join(items, separator) {\n\t  separator = separator || '';\n\t  return filter(items, isValidString).join(separator);\n\t}\n\t\n\tfunction makePath() {\n\t  for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t    args[_key2] = arguments[_key2];\n\t  }\n\t\n\t  var result = join(args, '/');\n\t  return result.replace(/([^:\\/]|^)\\/{2,}/g, '$1/');\n\t}\n\t\n\texports.default = {\n\t  Promise: P,\n\t  /**\n\t   * Method to wrap an \"options\" object so that it will inherit from\n\t   * some parent object, such as a resource definition.\n\t   */\n\t  _: function _(parent, options) {\n\t    var _this = this;\n\t    parent = parent || {};\n\t    options = options || {};\n\t    if (options && options.constructor === parent.constructor) {\n\t      return options;\n\t    } else if (!isObject(options)) {\n\t      throw new _errors2.default.IA('\"options\" must be an object!');\n\t    }\n\t    forEach(toPromisify, function (name) {\n\t      if (typeof options[name] === 'function' && options[name].toString().indexOf('for (var _len3 = arg') === -1) {\n\t        options[name] = _this.promisify(options[name]);\n\t      }\n\t    });\n\t    // Dynamic constructor function\n\t    var O = function Options(attrs) {\n\t      var self = this;\n\t      forOwn(attrs, function (value, key) {\n\t        self[key] = value;\n\t      });\n\t    };\n\t    // Inherit from some parent object\n\t    O.prototype = parent;\n\t    // Give us a way to get the original options back.\n\t    O.prototype.orig = function () {\n\t      var orig = {};\n\t      forOwn(this, function (value, key) {\n\t        orig[key] = value;\n\t      });\n\t      return orig;\n\t    };\n\t    return new O(options);\n\t  },\n\t\n\t  _n: isNumber,\n\t  _s: isString,\n\t  _sn: isStringOrNumber,\n\t  _snErr: isStringOrNumberErr,\n\t  _o: isObject,\n\t  _oErr: isObjectErr,\n\t  _a: isArray,\n\t  _aErr: isArrayErr,\n\t  applyScope: function applyScope(definition, params, options) {\n\t    var scope = options.scope;\n\t    var _params = copy(params);\n\t    if (scope) {\n\t      if (isString(scope)) {\n\t        scope = [scope];\n\t      }\n\t    } else {\n\t      scope = [];\n\t    }\n\t    scope.unshift('defaultScope');\n\t    forEach(scope, function (_scope) {\n\t      var scopeDef = options.scopes[_scope];\n\t      if (typeof scopeDef === 'function') {\n\t        deepMixIn(params, scopeDef(definition));\n\t      } else if (scopeDef) {\n\t        deepMixIn(params, scopeDef);\n\t      }\n\t    });\n\t    deepMixIn(params, _params);\n\t  },\n\t  compute: function compute(fn, field) {\n\t    var _this = this;\n\t    var args = [];\n\t    if (!isObject(fn)) {\n\t      forEach(fn.deps, function (dep) {\n\t        args.push(get(_this, dep));\n\t      });\n\t      // compute property\n\t      set(_this, field, fn[fn.length - 1].apply(_this, args));\n\t    }\n\t  },\n\t\n\t  contains: contains,\n\t  copy: copy,\n\t  deepMixIn: deepMixIn,\n\t  diffObjectFromOldObject: observe.diffObjectFromOldObject,\n\t  BinaryHeap: BinaryHeap,\n\t  equals: equals,\n\t  Events: Events,\n\t  filter: filter,\n\t  fillIn: function fillIn(target, obj) {\n\t    forOwn(obj, function (v, k) {\n\t      if (!(k in target)) {\n\t        target[k] = v;\n\t      }\n\t    });\n\t    return target;\n\t  },\n\t\n\t  forEach: forEach,\n\t  forOwn: forOwn,\n\t  fromJson: function fromJson(json) {\n\t    return isString(json) ? JSON.parse(json) : json;\n\t  },\n\t\n\t  get: get,\n\t  guid: guid,\n\t  intersection: intersection,\n\t  isArray: isArray,\n\t  isBlacklisted: isBlacklisted,\n\t  isEmpty: isEmpty,\n\t  isFunction: isFunction,\n\t  isObject: isObject,\n\t  isNumber: isNumber,\n\t  isString: isString,\n\t  keys: _keys,\n\t  makePath: makePath,\n\t  observe: observe,\n\t  omit: function omit(obj, bl) {\n\t    var toRemove = [];\n\t    forOwn(obj, function (v, k) {\n\t      if (isBlacklisted(k, bl)) {\n\t        toRemove.push(k);\n\t      }\n\t    });\n\t    forEach(toRemove, function (k) {\n\t      delete obj[k];\n\t    });\n\t    return obj;\n\t  },\n\t\n\t  pascalCase: pascalCase,\n\t  pick: pick,\n\t  // Turn the given node-style callback function into one that can return a promise.\n\t  promisify: function promisify(fn, target) {\n\t    var _this = this;\n\t    if (!fn) {\n\t      return;\n\t    } else if (typeof fn !== 'function') {\n\t      throw new Error('Can only promisify functions!');\n\t    }\n\t    return function () {\n\t      for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n\t        args[_key3] = arguments[_key3];\n\t      }\n\t\n\t      return new _this.Promise(function (resolve, reject) {\n\t        args.push(function (err, result) {\n\t          if (err) {\n\t            reject(err);\n\t          } else {\n\t            resolve(result);\n\t          }\n\t        });\n\t\n\t        try {\n\t          var promise = fn.apply(target || this, args);\n\t          if (promise && promise.then) {\n\t            promise.then(resolve, reject);\n\t          }\n\t        } catch (err) {\n\t          reject(err);\n\t        }\n\t      });\n\t    };\n\t  },\n\t\n\t  remove: remove,\n\t  set: set,\n\t  slice: slice,\n\t  sort: sort,\n\t  toJson: JSON.stringify,\n\t  updateTimestamp: function updateTimestamp(timestamp) {\n\t    var newTimestamp = typeof Date.now === 'function' ? Date.now() : new Date().getTime();\n\t    if (timestamp && newTimestamp <= timestamp) {\n\t      return timestamp + 1;\n\t    } else {\n\t      return newTimestamp;\n\t    }\n\t  },\n\t\n\t  upperCase: upperCase,\n\t  // Return a copy of \"object\" with cycles removed.\n\t  removeCircular: function removeCircular(object) {\n\t    return function rmCirc(value, ctx) {\n\t      var i = void 0;\n\t      var nu = void 0;\n\t\n\t      if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value !== null && !(value instanceof Boolean) && !(value instanceof Date) && !(value instanceof Number) && !(value instanceof RegExp) && !(value instanceof String) && (!File || !(value instanceof File))) {\n\t        // check if current object points back to itself\n\t        var cur = ctx.cur;\n\t        var parent = ctx.ctx;\n\t        while (parent) {\n\t          if (parent.cur === cur) {\n\t            return undefined;\n\t          }\n\t          parent = parent.ctx;\n\t        }\n\t\n\t        if (isArray(value)) {\n\t          nu = [];\n\t          for (i = 0; i < value.length; i += 1) {\n\t            nu[i] = rmCirc(value[i], { ctx: ctx, cur: value[i] });\n\t          }\n\t        } else {\n\t          nu = {};\n\t          forOwn(value, function (v, k) {\n\t            nu[k] = rmCirc(value[k], { ctx: ctx, cur: value[k] });\n\t          });\n\t        }\n\t        return nu;\n\t      }\n\t      return value;\n\t    }(object, { ctx: null, cur: object });\n\t  },\n\t\n\t  resolveItem: resolveItem,\n\t  resolveId: resolveId,\n\t  respond: function respond(response, meta, options) {\n\t    if (options.returnMeta === 'array') {\n\t      return [response, meta];\n\t    } else if (options.returnMeta === 'object') {\n\t      return { response: response, meta: meta };\n\t    } else {\n\t      return response;\n\t    }\n\t  },\n\t\n\t  w: w,\n\t  // This is where the magic of relations happens.\n\t  applyRelationGettersToTarget: function applyRelationGettersToTarget(store, definition, target) {\n\t    this.forEach(definition.relationList, function (def) {\n\t      var relationName = def.relation;\n\t      var localField = def.localField;\n\t      var localKey = def.localKey;\n\t      var foreignKey = def.foreignKey;\n\t      var localKeys = def.localKeys;\n\t      var foreignKeys = def.foreignKeys;\n\t      var enumerable = typeof def.enumerable === 'boolean' ? def.enumerable : !!definition.relationsEnumerable;\n\t      if (typeof def.link === 'boolean' ? def.link : !!definition.linkRelations) {\n\t        delete target[localField];\n\t        var prop = {\n\t          enumerable: enumerable\n\t        };\n\t        if (def.type === 'belongsTo') {\n\t          prop.get = function () {\n\t            var key = get(this, localKey);\n\t            var hasKey = !!(key || key === 0);\n\t            return hasKey ? definition.getResource(relationName).get(key) : undefined;\n\t          };\n\t          prop.set = function (parent) {\n\t            if (parent) {\n\t              set(this, localKey, get(parent, definition.getResource(relationName).idAttribute));\n\t            }\n\t            return get(this, localField);\n\t          };\n\t        } else if (def.type === 'hasMany') {\n\t          prop.get = function () {\n\t            var params = {};\n\t            if (foreignKey) {\n\t              params[foreignKey] = this[definition.idAttribute];\n\t              return definition.getResource(relationName).defaultFilter.call(store, store.store[relationName].collection, relationName, params, { allowSimpleWhere: true });\n\t            } else if (localKeys) {\n\t              var keys = get(this, localKeys) || [];\n\t              return definition.getResource(relationName).getAll(isArray(keys) ? keys : _keys(keys));\n\t            } else if (foreignKeys) {\n\t              set(params, 'where.' + foreignKeys + '.contains', this[definition.idAttribute]);\n\t              return definition.getResource(relationName).defaultFilter.call(store, store.store[relationName].collection, relationName, params);\n\t            }\n\t            return undefined;\n\t          };\n\t          prop.set = function (children) {\n\t            if (children && children.length) {\n\t              var id = get(this, definition.idAttribute);\n\t              if (foreignKey) {\n\t                forEach(children, function (child) {\n\t                  set(child, foreignKey, id);\n\t                });\n\t              } else if (localKeys) {\n\t                var keys = [];\n\t                forEach(children, function (child) {\n\t                  keys.push(get(child, definition.getResource(relationName).idAttribute));\n\t                });\n\t                set(this, localKeys, keys);\n\t              } else if (foreignKeys) {\n\t                forEach(children, function (child) {\n\t                  var keys = get(child, foreignKeys);\n\t                  if (keys) {\n\t                    if (!contains(keys, id)) {\n\t                      keys.push(id);\n\t                    }\n\t                  } else {\n\t                    set(child, foreignKeys, [id]);\n\t                  }\n\t                });\n\t              }\n\t            }\n\t            return get(this, localField);\n\t          };\n\t        } else if (def.type === 'hasOne') {\n\t          if (localKey) {\n\t            prop.get = function () {\n\t              var key = get(this, localKey);\n\t              var hasKey = !!(key || key === 0);\n\t              return hasKey ? definition.getResource(relationName).get(key) : undefined;\n\t            };\n\t            prop.set = function (sibling) {\n\t              if (sibling) {\n\t                set(this, localKey, get(sibling, definition.getResource(relationName).idAttribute));\n\t              }\n\t              return get(this, localField);\n\t            };\n\t          } else {\n\t            prop.get = function () {\n\t              var params = {};\n\t              params[foreignKey] = this[definition.idAttribute];\n\t              var items = params[foreignKey] ? definition.getResource(relationName).defaultFilter.call(store, store.store[relationName].collection, relationName, params, { allowSimpleWhere: true }) : [];\n\t              if (items.length) {\n\t                return items[0];\n\t              }\n\t              return undefined;\n\t            };\n\t            prop.set = function (sibling) {\n\t              if (sibling) {\n\t                set(sibling, foreignKey, get(this, definition.idAttribute));\n\t              }\n\t              return get(this, localField);\n\t            };\n\t          }\n\t        }\n\t        if (def.get) {\n\t          var orig = prop.get;\n\t          prop.get = function () {\n\t            var _this2 = this;\n\t\n\t            return def.get(definition, def, this, function () {\n\t              for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n\t                args[_key4] = arguments[_key4];\n\t              }\n\t\n\t              return orig.apply(_this2, args);\n\t            });\n\t          };\n\t        }\n\t        Object.defineProperty(target, localField, prop);\n\t      }\n\t    });\n\t  }\n\t};\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\t/**\n\t * Thrown during a method call when an argument passed into the method is invalid.\n\t */\n\tvar IllegalArgumentError = function (_Error) {\n\t  _inherits(IllegalArgumentError, _Error);\n\t\n\t  function IllegalArgumentError(message) {\n\t    _classCallCheck(this, IllegalArgumentError);\n\t\n\t    var _this = _possibleConstructorReturn(this, (IllegalArgumentError.__proto__ || Object.getPrototypeOf(IllegalArgumentError)).call(this));\n\t\n\t    if (typeof Error.captureStackTrace === 'function') {\n\t      Error.captureStackTrace(_this, _this.constructor);\n\t    }\n\t    _this.type = _this.constructor.name;\n\t    _this.message = message;\n\t    return _this;\n\t  }\n\t\n\t  return IllegalArgumentError;\n\t}(Error);\n\t\n\t/**\n\t * Thrown when an invariant is violated or unrecoverable error is encountered during execution.\n\t */\n\t\n\t\n\tvar RuntimeError = function (_Error2) {\n\t  _inherits(RuntimeError, _Error2);\n\t\n\t  function RuntimeError(message) {\n\t    _classCallCheck(this, RuntimeError);\n\t\n\t    var _this2 = _possibleConstructorReturn(this, (RuntimeError.__proto__ || Object.getPrototypeOf(RuntimeError)).call(this));\n\t\n\t    if (typeof Error.captureStackTrace === 'function') {\n\t      Error.captureStackTrace(_this2, _this2.constructor);\n\t    }\n\t    _this2.type = _this2.constructor.name;\n\t    _this2.message = message;\n\t    return _this2;\n\t  }\n\t\n\t  return RuntimeError;\n\t}(Error);\n\t\n\t/**\n\t * Thrown when attempting to access or work with a non-existent resource.\n\t */\n\t\n\t\n\tvar NonexistentResourceError = function (_Error3) {\n\t  _inherits(NonexistentResourceError, _Error3);\n\t\n\t  function NonexistentResourceError(resourceName) {\n\t    _classCallCheck(this, NonexistentResourceError);\n\t\n\t    var _this3 = _possibleConstructorReturn(this, (NonexistentResourceError.__proto__ || Object.getPrototypeOf(NonexistentResourceError)).call(this));\n\t\n\t    if (typeof Error.captureStackTrace === 'function') {\n\t      Error.captureStackTrace(_this3, _this3.constructor);\n\t    }\n\t    _this3.type = _this3.constructor.name;\n\t    _this3.message = resourceName + ' is not a registered resource!';\n\t    return _this3;\n\t  }\n\t\n\t  return NonexistentResourceError;\n\t}(Error);\n\t\n\texports.default = {\n\t  IllegalArgumentError: IllegalArgumentError,\n\t  IA: IllegalArgumentError,\n\t  RuntimeError: RuntimeError,\n\t  R: RuntimeError,\n\t  NonexistentResourceError: NonexistentResourceError,\n\t  NER: NonexistentResourceError\n\t};\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t(function (global, factory) {\n\t   true ? module.exports = factory() :\n\t  typeof define === 'function' && define.amd ? define('yabh', factory) :\n\t  (global.BinaryHeap = factory());\n\t}(this, function () { 'use strict';\n\t\n\t  /**\n\t   * @method bubbleUp\n\t   * @param {array} heap The heap.\n\t   * @param {function} weightFunc The weight function.\n\t   * @param {number} n The index of the element to bubble up.\n\t   */\n\t  var bubbleUp = function bubbleUp(heap, weightFunc, n) {\n\t    var element = heap[n];\n\t    var weight = weightFunc(element);\n\t    // When at 0, an element can not go up any further.\n\t    while (n > 0) {\n\t      // Compute the parent element's index, and fetch it.\n\t      var parentN = Math.floor((n + 1) / 2) - 1;\n\t      var parent = heap[parentN];\n\t      // If the parent has a lesser weight, things are in order and we\n\t      // are done.\n\t      if (weight >= weightFunc(parent)) {\n\t        break;\n\t      } else {\n\t        heap[parentN] = element;\n\t        heap[n] = parent;\n\t        n = parentN;\n\t      }\n\t    }\n\t  };\n\t\n\t  /**\n\t   * @method bubbleDown\n\t   * @param {array} heap The heap.\n\t   * @param {function} weightFunc The weight function.\n\t   * @param {number} n The index of the element to sink down.\n\t   */\n\t  var bubbleDown = function bubbleDown(heap, weightFunc, n) {\n\t    var length = heap.length;\n\t    var node = heap[n];\n\t    var nodeWeight = weightFunc(node);\n\t\n\t    while (true) {\n\t      var child2N = (n + 1) * 2;\n\t      var child1N = child2N - 1;\n\t      var swap = null;\n\t      if (child1N < length) {\n\t        var child1 = heap[child1N];\n\t        var child1Weight = weightFunc(child1);\n\t        // If the score is less than our node's, we need to swap.\n\t        if (child1Weight < nodeWeight) {\n\t          swap = child1N;\n\t        }\n\t      }\n\t      // Do the same checks for the other child.\n\t      if (child2N < length) {\n\t        var child2 = heap[child2N];\n\t        var child2Weight = weightFunc(child2);\n\t        if (child2Weight < (swap === null ? nodeWeight : weightFunc(heap[child1N]))) {\n\t          swap = child2N;\n\t        }\n\t      }\n\t\n\t      if (swap === null) {\n\t        break;\n\t      } else {\n\t        heap[n] = heap[swap];\n\t        heap[swap] = node;\n\t        n = swap;\n\t      }\n\t    }\n\t  };\n\t\n\t  function BinaryHeap(weightFunc, compareFunc) {\n\t    if (!weightFunc) {\n\t      weightFunc = function weightFunc(x) {\n\t        return x;\n\t      };\n\t    }\n\t    if (!compareFunc) {\n\t      compareFunc = function compareFunc(x, y) {\n\t        return x === y;\n\t      };\n\t    }\n\t    if (typeof weightFunc !== 'function') {\n\t      throw new Error('BinaryHeap([weightFunc][, compareFunc]): \"weightFunc\" must be a function!');\n\t    }\n\t    if (typeof compareFunc !== 'function') {\n\t      throw new Error('BinaryHeap([weightFunc][, compareFunc]): \"compareFunc\" must be a function!');\n\t    }\n\t    this.weightFunc = weightFunc;\n\t    this.compareFunc = compareFunc;\n\t    this.heap = [];\n\t  }\n\t\n\t  var BHProto = BinaryHeap.prototype;\n\t\n\t  BHProto.push = function (node) {\n\t    this.heap.push(node);\n\t    bubbleUp(this.heap, this.weightFunc, this.heap.length - 1);\n\t  };\n\t\n\t  BHProto.peek = function () {\n\t    return this.heap[0];\n\t  };\n\t\n\t  BHProto.pop = function () {\n\t    var front = this.heap[0];\n\t    var end = this.heap.pop();\n\t    if (this.heap.length > 0) {\n\t      this.heap[0] = end;\n\t      bubbleDown(this.heap, this.weightFunc, 0);\n\t    }\n\t    return front;\n\t  };\n\t\n\t  BHProto.remove = function (node) {\n\t    var length = this.heap.length;\n\t    for (var i = 0; i < length; i++) {\n\t      if (this.compareFunc(this.heap[i], node)) {\n\t        var removed = this.heap[i];\n\t        var end = this.heap.pop();\n\t        if (i !== length - 1) {\n\t          this.heap[i] = end;\n\t          bubbleUp(this.heap, this.weightFunc, i);\n\t          bubbleDown(this.heap, this.weightFunc, i);\n\t        }\n\t        return removed;\n\t      }\n\t    }\n\t    return null;\n\t  };\n\t\n\t  BHProto.removeAll = function () {\n\t    this.heap = [];\n\t  };\n\t\n\t  BHProto.size = function () {\n\t    return this.heap.length;\n\t  };\n\t\n\t  return BinaryHeap;\n\t\n\t}));\n\t//# sourceMappingURL=yabh.js.map\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t    /**\n\t     * Array forEach\n\t     */\n\t    function forEach(arr, callback, thisObj) {\n\t        if (arr == null) {\n\t            return;\n\t        }\n\t        var i = -1,\n\t            len = arr.length;\n\t        while (++i < len) {\n\t            // we iterate over sparse items since there is no way to make it\n\t            // work properly on IE 7-8. see #64\n\t            if ( callback.call(thisObj, arr[i], i, arr) === false ) {\n\t                break;\n\t            }\n\t        }\n\t    }\n\t\n\t    module.exports = forEach;\n\t\n\t\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t    /**\n\t     * Create slice of source array or array-like object\n\t     */\n\t    function slice(arr, start, end){\n\t        var len = arr.length;\n\t\n\t        if (start == null) {\n\t            start = 0;\n\t        } else if (start < 0) {\n\t            start = Math.max(len + start, 0);\n\t        } else {\n\t            start = Math.min(start, len);\n\t        }\n\t\n\t        if (end == null) {\n\t            end = len;\n\t        } else if (end < 0) {\n\t            end = Math.max(len + end, 0);\n\t        } else {\n\t            end = Math.min(end, len);\n\t        }\n\t\n\t        var result = [];\n\t        while (start < end) {\n\t            result.push(arr[start++]);\n\t        }\n\t\n\t        return result;\n\t    }\n\t\n\t    module.exports = slice;\n\t\n\t\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar hasOwn = __webpack_require__(8);\n\tvar forIn = __webpack_require__(9);\n\t\n\t    /**\n\t     * Similar to Array/forEach but works over object properties and fixes Don't\n\t     * Enum bug on IE.\n\t     * based on: http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n\t     */\n\t    function forOwn(obj, fn, thisObj){\n\t        forIn(obj, function(val, key){\n\t            if (hasOwn(obj, key)) {\n\t                return fn.call(thisObj, obj[key], key, obj);\n\t            }\n\t        });\n\t    }\n\t\n\t    module.exports = forOwn;\n\t\n\t\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t    /**\n\t     * Safer Object.hasOwnProperty\n\t     */\n\t     function hasOwn(obj, prop){\n\t         return Object.prototype.hasOwnProperty.call(obj, prop);\n\t     }\n\t\n\t     module.exports = hasOwn;\n\t\n\t\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar hasOwn = __webpack_require__(8);\n\t\n\t    var _hasDontEnumBug,\n\t        _dontEnums;\n\t\n\t    function checkDontEnum(){\n\t        _dontEnums = [\n\t                'toString',\n\t                'toLocaleString',\n\t                'valueOf',\n\t                'hasOwnProperty',\n\t                'isPrototypeOf',\n\t                'propertyIsEnumerable',\n\t                'constructor'\n\t            ];\n\t\n\t        _hasDontEnumBug = true;\n\t\n\t        for (var key in {'toString': null}) {\n\t            _hasDontEnumBug = false;\n\t        }\n\t    }\n\t\n\t    /**\n\t     * Similar to Array/forEach but works over object properties and fixes Don't\n\t     * Enum bug on IE.\n\t     * based on: http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n\t     */\n\t    function forIn(obj, fn, thisObj){\n\t        var key, i = 0;\n\t        // no need to check if argument is a real object that way we can use\n\t        // it for arrays, functions, date, etc.\n\t\n\t        //post-pone check till needed\n\t        if (_hasDontEnumBug == null) checkDontEnum();\n\t\n\t        for (key in obj) {\n\t            if (exec(fn, obj, key, thisObj) === false) {\n\t                break;\n\t            }\n\t        }\n\t\n\t\n\t        if (_hasDontEnumBug) {\n\t            var ctor = obj.constructor,\n\t                isProto = !!ctor && obj === ctor.prototype;\n\t\n\t            while (key = _dontEnums[i++]) {\n\t                // For constructor, if it is a prototype object the constructor\n\t                // is always non-enumerable unless defined otherwise (and\n\t                // enumerated above).  For non-prototype objects, it will have\n\t                // to be defined on this object, since it cannot be defined on\n\t                // any prototype objects.\n\t                //\n\t                // For other [[DontEnum]] properties, check if the value is\n\t                // different than Object prototype value.\n\t                if (\n\t                    (key !== 'constructor' ||\n\t                        (!isProto && hasOwn(obj, key))) &&\n\t                    obj[key] !== Object.prototype[key]\n\t                ) {\n\t                    if (exec(fn, obj, key, thisObj) === false) {\n\t                        break;\n\t                    }\n\t                }\n\t            }\n\t        }\n\t    }\n\t\n\t    function exec(fn, obj, key, thisObj){\n\t        return fn.call(thisObj, obj[key], key, obj);\n\t    }\n\t\n\t    module.exports = forIn;\n\t\n\t\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar indexOf = __webpack_require__(11);\n\t\n\t    /**\n\t     * If array contains values.\n\t     */\n\t    function contains(arr, val) {\n\t        return indexOf(arr, val) !== -1;\n\t    }\n\t    module.exports = contains;\n\t\n\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t    /**\n\t     * Array.indexOf\n\t     */\n\t    function indexOf(arr, item, fromIndex) {\n\t        fromIndex = fromIndex || 0;\n\t        if (arr == null) {\n\t            return -1;\n\t        }\n\t\n\t        var len = arr.length,\n\t            i = fromIndex < 0 ? len + fromIndex : fromIndex;\n\t        while (i < len) {\n\t            // we iterate over sparse items since there is no way to make it\n\t            // work properly on IE 7-8. see #64\n\t            if (arr[i] === item) {\n\t                return i;\n\t            }\n\t\n\t            i++;\n\t        }\n\t\n\t        return -1;\n\t    }\n\t\n\t    module.exports = indexOf;\n\t\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar forOwn = __webpack_require__(7);\n\tvar isPlainObject = __webpack_require__(13);\n\t\n\t    /**\n\t     * Mixes objects into the target object, recursively mixing existing child\n\t     * objects.\n\t     */\n\t    function deepMixIn(target, objects) {\n\t        var i = 0,\n\t            n = arguments.length,\n\t            obj;\n\t\n\t        while(++i < n){\n\t            obj = arguments[i];\n\t            if (obj) {\n\t                forOwn(obj, copyProp, target);\n\t            }\n\t        }\n\t\n\t        return target;\n\t    }\n\t\n\t    function copyProp(val, key) {\n\t        var existing = this[key];\n\t        if (isPlainObject(val) && isPlainObject(existing)) {\n\t            deepMixIn(existing, val);\n\t        } else {\n\t            this[key] = val;\n\t        }\n\t    }\n\t\n\t    module.exports = deepMixIn;\n\t\n\t\n\n\n/***/ },\n/* 13 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t    /**\n\t     * Checks if the value is created by the `Object` constructor.\n\t     */\n\t    function isPlainObject(value) {\n\t        return (!!value && typeof value === 'object' &&\n\t            value.constructor === Object);\n\t    }\n\t\n\t    module.exports = isPlainObject;\n\t\n\t\n\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar toString = __webpack_require__(15);\n\tvar camelCase = __webpack_require__(16);\n\tvar upperCase = __webpack_require__(19);\n\t    /**\n\t     * camelCase + UPPERCASE first char\n\t     */\n\t    function pascalCase(str){\n\t        str = toString(str);\n\t        return camelCase(str).replace(/^[a-z]/, upperCase);\n\t    }\n\t\n\t    module.exports = pascalCase;\n\t\n\n\n/***/ },\n/* 15 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t    /**\n\t     * Typecast a value to a String, using an empty string value for null or\n\t     * undefined.\n\t     */\n\t    function toString(val){\n\t        return val == null ? '' : val.toString();\n\t    }\n\t\n\t    module.exports = toString;\n\t\n\t\n\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar toString = __webpack_require__(15);\n\tvar replaceAccents = __webpack_require__(17);\n\tvar removeNonWord = __webpack_require__(18);\n\tvar upperCase = __webpack_require__(19);\n\tvar lowerCase = __webpack_require__(20);\n\t    /**\n\t    * Convert string to camelCase text.\n\t    */\n\t    function camelCase(str){\n\t        str = toString(str);\n\t        str = replaceAccents(str);\n\t        str = removeNonWord(str)\n\t            .replace(/[\\-_]/g, ' ') //convert all hyphens and underscores to spaces\n\t            .replace(/\\s[a-z]/g, upperCase) //convert first char of each word to UPPERCASE\n\t            .replace(/\\s+/g, '') //remove spaces\n\t            .replace(/^[A-Z]/g, lowerCase); //convert first char to lowercase\n\t        return str;\n\t    }\n\t    module.exports = camelCase;\n\t\n\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar toString = __webpack_require__(15);\n\t    /**\n\t    * Replaces all accented chars with regular ones\n\t    */\n\t    function replaceAccents(str){\n\t        str = toString(str);\n\t\n\t        // verifies if the String has accents and replace them\n\t        if (str.search(/[\\xC0-\\xFF]/g) > -1) {\n\t            str = str\n\t                    .replace(/[\\xC0-\\xC5]/g, \"A\")\n\t                    .replace(/[\\xC6]/g, \"AE\")\n\t                    .replace(/[\\xC7]/g, \"C\")\n\t                    .replace(/[\\xC8-\\xCB]/g, \"E\")\n\t                    .replace(/[\\xCC-\\xCF]/g, \"I\")\n\t                    .replace(/[\\xD0]/g, \"D\")\n\t                    .replace(/[\\xD1]/g, \"N\")\n\t                    .replace(/[\\xD2-\\xD6\\xD8]/g, \"O\")\n\t                    .replace(/[\\xD9-\\xDC]/g, \"U\")\n\t                    .replace(/[\\xDD]/g, \"Y\")\n\t                    .replace(/[\\xDE]/g, \"P\")\n\t                    .replace(/[\\xE0-\\xE5]/g, \"a\")\n\t                    .replace(/[\\xE6]/g, \"ae\")\n\t                    .replace(/[\\xE7]/g, \"c\")\n\t                    .replace(/[\\xE8-\\xEB]/g, \"e\")\n\t                    .replace(/[\\xEC-\\xEF]/g, \"i\")\n\t                    .replace(/[\\xF1]/g, \"n\")\n\t                    .replace(/[\\xF2-\\xF6\\xF8]/g, \"o\")\n\t                    .replace(/[\\xF9-\\xFC]/g, \"u\")\n\t                    .replace(/[\\xFE]/g, \"p\")\n\t                    .replace(/[\\xFD\\xFF]/g, \"y\");\n\t        }\n\t        return str;\n\t    }\n\t    module.exports = replaceAccents;\n\t\n\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar toString = __webpack_require__(15);\n\t    // This pattern is generated by the _build/pattern-removeNonWord.js script\n\t    var PATTERN = /[^\\x20\\x2D0-9A-Z\\x5Fa-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\xFF]/g;\n\t\n\t    /**\n\t     * Remove non-word chars.\n\t     */\n\t    function removeNonWord(str){\n\t        str = toString(str);\n\t        return str.replace(PATTERN, '');\n\t    }\n\t\n\t    module.exports = removeNonWord;\n\t\n\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar toString = __webpack_require__(15);\n\t    /**\n\t     * \"Safer\" String.toUpperCase()\n\t     */\n\t    function upperCase(str){\n\t        str = toString(str);\n\t        return str.toUpperCase();\n\t    }\n\t    module.exports = upperCase;\n\t\n\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar toString = __webpack_require__(15);\n\t    /**\n\t     * \"Safer\" String.toLowerCase()\n\t     */\n\t    function lowerCase(str){\n\t        str = toString(str);\n\t        return str.toLowerCase();\n\t    }\n\t\n\t    module.exports = lowerCase;\n\t\n\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar indexOf = __webpack_require__(11);\n\t\n\t    /**\n\t     * Remove a single item from the array.\n\t     * (it won't remove duplicates, just a single item)\n\t     */\n\t    function remove(arr, item){\n\t        var idx = indexOf(arr, item);\n\t        if (idx !== -1) arr.splice(idx, 1);\n\t    }\n\t\n\t    module.exports = remove;\n\t\n\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar slice = __webpack_require__(6);\n\t\n\t    /**\n\t     * Return a copy of the object, filtered to only have values for the whitelisted keys.\n\t     */\n\t    function pick(obj, var_keys){\n\t        var keys = typeof arguments[1] !== 'string'? arguments[1] : slice(arguments, 1),\n\t            out = {},\n\t            i = 0, key;\n\t        while (key = keys[i++]) {\n\t            out[key] = obj[key];\n\t        }\n\t        return out;\n\t    }\n\t\n\t    module.exports = pick;\n\t\n\t\n\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar forOwn = __webpack_require__(7);\n\t\n\t    /**\n\t     * Get object keys\n\t     */\n\t     var keys = Object.keys || function (obj) {\n\t            var keys = [];\n\t            forOwn(obj, function(val, key){\n\t                keys.push(key);\n\t            });\n\t            return keys;\n\t        };\n\t\n\t    module.exports = keys;\n\t\n\t\n\n\n/***/ },\n/* 24 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t    /**\n\t     * Merge sort (http://en.wikipedia.org/wiki/Merge_sort)\n\t     */\n\t    function mergeSort(arr, compareFn) {\n\t        if (arr == null) {\n\t            return [];\n\t        } else if (arr.length < 2) {\n\t            return arr;\n\t        }\n\t\n\t        if (compareFn == null) {\n\t            compareFn = defaultCompare;\n\t        }\n\t\n\t        var mid, left, right;\n\t\n\t        mid   = ~~(arr.length / 2);\n\t        left  = mergeSort( arr.slice(0, mid), compareFn );\n\t        right = mergeSort( arr.slice(mid, arr.length), compareFn );\n\t\n\t        return merge(left, right, compareFn);\n\t    }\n\t\n\t    function defaultCompare(a, b) {\n\t        return a < b ? -1 : (a > b? 1 : 0);\n\t    }\n\t\n\t    function merge(left, right, compareFn) {\n\t        var result = [];\n\t\n\t        while (left.length && right.length) {\n\t            if (compareFn(left[0], right[0]) <= 0) {\n\t                // if 0 it should preserve same order (stable)\n\t                result.push(left.shift());\n\t            } else {\n\t                result.push(right.shift());\n\t            }\n\t        }\n\t\n\t        if (left.length) {\n\t            result.push.apply(result, left);\n\t        }\n\t\n\t        if (right.length) {\n\t            result.push.apply(result, right);\n\t        }\n\t\n\t        return result;\n\t    }\n\t\n\t    module.exports = mergeSort;\n\t\n\t\n\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar isPrimitive = __webpack_require__(26);\n\t\n\t    /**\n\t     * get \"nested\" object property\n\t     */\n\t    function get(obj, prop){\n\t        var parts = prop.split('.'),\n\t            last = parts.pop();\n\t\n\t        while (prop = parts.shift()) {\n\t            obj = obj[prop];\n\t            if (obj == null) return;\n\t        }\n\t\n\t        return obj[last];\n\t    }\n\t\n\t    module.exports = get;\n\t\n\t\n\n\n/***/ },\n/* 26 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t    /**\n\t     * Checks if the object is a primitive\n\t     */\n\t    function isPrimitive(value) {\n\t        // Using switch fallthrough because it's simple to read and is\n\t        // generally fast: http://jsperf.com/testing-value-is-primitive/5\n\t        switch (typeof value) {\n\t            case \"string\":\n\t            case \"number\":\n\t            case \"boolean\":\n\t                return true;\n\t        }\n\t\n\t        return value == null;\n\t    }\n\t\n\t    module.exports = isPrimitive;\n\t\n\t\n\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar namespace = __webpack_require__(28);\n\t\n\t    /**\n\t     * set \"nested\" object property\n\t     */\n\t    function set(obj, prop, val){\n\t        var parts = (/^(.+)\\.(.+)$/).exec(prop);\n\t        if (parts){\n\t            namespace(obj, parts[1])[parts[2]] = val;\n\t        } else {\n\t            obj[prop] = val;\n\t        }\n\t    }\n\t\n\t    module.exports = set;\n\t\n\t\n\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar forEach = __webpack_require__(5);\n\t\n\t    /**\n\t     * Create nested object if non-existent\n\t     */\n\t    function namespace(obj, path){\n\t        if (!path) return obj;\n\t        forEach(path.split('.'), function(key){\n\t            if (!obj[key]) {\n\t                obj[key] = {};\n\t            }\n\t            obj = obj[key];\n\t        });\n\t        return obj;\n\t    }\n\t\n\t    module.exports = namespace;\n\t\n\t\n\n\n/***/ },\n/* 29 */\n/***/ function(module, exports) {\n\n\t/*\n\t * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n\t * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n\t * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n\t * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n\t * Code distributed by Google as part of the polymer project is also\n\t * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\t */\n\t\n\t// Modifications\n\t// Copyright 2014-2015 Jason Dobry\n\t//\n\t// Summary of modifications:\n\t// Fixed use of \"delete\" keyword for IE8 compatibility\n\t// Exposed diffObjectFromOldObject on the exported object\n\t// Added the \"equals\" argument to diffObjectFromOldObject to be used to check equality\n\t// Added a way in diffObjectFromOldObject to ignore changes to certain properties\n\t// Removed all code related to:\n\t// - ArrayObserver\n\t// - ArraySplice\n\t// - PathObserver\n\t// - CompoundObserver\n\t// - Path\n\t// - ObserverTransform\n\t\n\t(function(global) {\n\t  var testingExposeCycleCount = global.testingExposeCycleCount;\n\t\n\t  // Detect and do basic sanity checking on Object/Array.observe.\n\t  function detectObjectObserve() {\n\t    if (typeof Object.observe !== 'function' ||\n\t        typeof Array.observe !== 'function') {\n\t      return false;\n\t    }\n\t\n\t    var records = [];\n\t\n\t    function callback(recs) {\n\t      records = recs;\n\t    }\n\t\n\t    var test = {};\n\t    var arr = [];\n\t    Object.observe(test, callback);\n\t    Array.observe(arr, callback);\n\t    test.id = 1;\n\t    test.id = 2;\n\t    delete test.id;\n\t    arr.push(1, 2);\n\t    arr.length = 0;\n\t\n\t    Object.deliverChangeRecords(callback);\n\t    if (records.length !== 5)\n\t      return false;\n\t\n\t    if (records[0].type != 'add' ||\n\t        records[1].type != 'update' ||\n\t        records[2].type != 'delete' ||\n\t        records[3].type != 'splice' ||\n\t        records[4].type != 'splice') {\n\t      return false;\n\t    }\n\t\n\t    Object.unobserve(test, callback);\n\t    Array.unobserve(arr, callback);\n\t\n\t    return true;\n\t  }\n\t\n\t  var hasObserve = detectObjectObserve();\n\t\n\t  var createObject = ('__proto__' in {}) ?\n\t    function(obj) { return obj; } :\n\t    function(obj) {\n\t      var proto = obj.__proto__;\n\t      if (!proto)\n\t        return obj;\n\t      var newObject = Object.create(proto);\n\t      Object.getOwnPropertyNames(obj).forEach(function(name) {\n\t        Object.defineProperty(newObject, name,\n\t                             Object.getOwnPropertyDescriptor(obj, name));\n\t      });\n\t      return newObject;\n\t    };\n\t\n\t  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\t\n\t  function dirtyCheck(observer) {\n\t    var cycles = 0;\n\t    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n\t      cycles++;\n\t    }\n\t    if (testingExposeCycleCount)\n\t      global.dirtyCheckCycleCount = cycles;\n\t\n\t    return cycles > 0;\n\t  }\n\t\n\t  function objectIsEmpty(object) {\n\t    for (var prop in object)\n\t      return false;\n\t    return true;\n\t  }\n\t\n\t  function diffIsEmpty(diff) {\n\t    return objectIsEmpty(diff.added) &&\n\t           objectIsEmpty(diff.removed) &&\n\t           objectIsEmpty(diff.changed);\n\t  }\n\t\n\t  function isBlacklisted(prop, bl) {\n\t    if (!bl || !bl.length) {\n\t      return false;\n\t    }\n\t    var matches;\n\t    for (var i = 0; i < bl.length; i++) {\n\t      if ((Object.prototype.toString.call(bl[i]) === '[object RegExp]' && bl[i].test(prop)) || bl[i] === prop) {\n\t        return matches = prop;\n\t      }\n\t    }\n\t    return !!matches;\n\t  }\n\t\n\t  function diffObjectFromOldObject(object, oldObject, equals, bl) {\n\t    var added = {};\n\t    var removed = {};\n\t    var changed = {};\n\t\n\t    for (var prop in oldObject) {\n\t      var newValue = object[prop];\n\t\n\t      if (isBlacklisted(prop, bl))\n\t        continue;\n\t\n\t      if (newValue !== undefined && (equals ? equals(newValue, oldObject[prop]) : newValue === oldObject[prop]))\n\t        continue;\n\t\n\t      if (!(prop in object)) {\n\t        removed[prop] = undefined;\n\t        continue;\n\t      }\n\t\n\t      if (equals ? !equals(newValue, oldObject[prop]) : newValue !== oldObject[prop])\n\t        changed[prop] = newValue;\n\t    }\n\t\n\t    for (var prop in object) {\n\t      if (prop in oldObject)\n\t        continue;\n\t\n\t      if (isBlacklisted(prop, bl))\n\t        continue;\n\t\n\t      added[prop] = object[prop];\n\t    }\n\t\n\t    if (Array.isArray(object) && object.length !== oldObject.length)\n\t      changed.length = object.length;\n\t\n\t    return {\n\t      added: added,\n\t      removed: removed,\n\t      changed: changed\n\t    };\n\t  }\n\t\n\t  var eomTasks = [];\n\t  function runEOMTasks() {\n\t    if (!eomTasks.length)\n\t      return false;\n\t\n\t    for (var i = 0; i < eomTasks.length; i++) {\n\t      eomTasks[i]();\n\t    }\n\t    eomTasks.length = 0;\n\t    return true;\n\t  }\n\t\n\t  var runEOM = hasObserve ? (function(){\n\t    return function(fn) {\n\t      return Promise.resolve().then(fn);\n\t    }\n\t  })() :\n\t  (function() {\n\t    return function(fn) {\n\t      eomTasks.push(fn);\n\t    };\n\t  })();\n\t\n\t  var observedObjectCache = [];\n\t\n\t  function newObservedObject() {\n\t    var observer;\n\t    var object;\n\t    var discardRecords = false;\n\t    var first = true;\n\t\n\t    function callback(records) {\n\t      if (observer && observer.state_ === OPENED && !discardRecords)\n\t        observer.check_(records);\n\t    }\n\t\n\t    return {\n\t      open: function(obs) {\n\t        if (observer)\n\t          throw Error('ObservedObject in use');\n\t\n\t        if (!first)\n\t          Object.deliverChangeRecords(callback);\n\t\n\t        observer = obs;\n\t        first = false;\n\t      },\n\t      observe: function(obj, arrayObserve) {\n\t        object = obj;\n\t        if (arrayObserve)\n\t          Array.observe(object, callback);\n\t        else\n\t          Object.observe(object, callback);\n\t      },\n\t      deliver: function(discard) {\n\t        discardRecords = discard;\n\t        Object.deliverChangeRecords(callback);\n\t        discardRecords = false;\n\t      },\n\t      close: function() {\n\t        observer = undefined;\n\t        Object.unobserve(object, callback);\n\t        observedObjectCache.push(this);\n\t      }\n\t    };\n\t  }\n\t\n\t  function getObservedObject(observer, object, arrayObserve) {\n\t    var dir = observedObjectCache.pop() || newObservedObject();\n\t    dir.open(observer);\n\t    dir.observe(object, arrayObserve);\n\t    return dir;\n\t  }\n\t\n\t  var UNOPENED = 0;\n\t  var OPENED = 1;\n\t  var CLOSED = 2;\n\t\n\t  var nextObserverId = 1;\n\t\n\t  function Observer() {\n\t    this.state_ = UNOPENED;\n\t    this.callback_ = undefined;\n\t    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n\t    this.directObserver_ = undefined;\n\t    this.value_ = undefined;\n\t    this.id_ = nextObserverId++;\n\t  }\n\t\n\t  Observer.prototype = {\n\t    open: function(callback, target) {\n\t      if (this.state_ != UNOPENED)\n\t        throw Error('Observer has already been opened.');\n\t\n\t      addToAll(this);\n\t      this.callback_ = callback;\n\t      this.target_ = target;\n\t      this.connect_();\n\t      this.state_ = OPENED;\n\t      return this.value_;\n\t    },\n\t\n\t    close: function() {\n\t      if (this.state_ != OPENED)\n\t        return;\n\t\n\t      removeFromAll(this);\n\t      this.disconnect_();\n\t      this.value_ = undefined;\n\t      this.callback_ = undefined;\n\t      this.target_ = undefined;\n\t      this.state_ = CLOSED;\n\t    },\n\t\n\t    deliver: function() {\n\t      if (this.state_ != OPENED)\n\t        return;\n\t\n\t      dirtyCheck(this);\n\t    },\n\t\n\t    report_: function(changes) {\n\t      try {\n\t        this.callback_.apply(this.target_, changes);\n\t      } catch (ex) {\n\t        Observer._errorThrownDuringCallback = true;\n\t        console.error('Exception caught during observer callback: ' +\n\t                       (ex.stack || ex));\n\t      }\n\t    },\n\t\n\t    discardChanges: function() {\n\t      this.check_(undefined, true);\n\t      return this.value_;\n\t    }\n\t  }\n\t\n\t  var collectObservers = !hasObserve;\n\t  var allObservers;\n\t  Observer._allObserversCount = 0;\n\t\n\t  if (collectObservers) {\n\t    allObservers = [];\n\t  }\n\t\n\t  function addToAll(observer) {\n\t    Observer._allObserversCount++;\n\t    if (!collectObservers)\n\t      return;\n\t\n\t    allObservers.push(observer);\n\t  }\n\t\n\t  function removeFromAll(observer) {\n\t    Observer._allObserversCount--;\n\t  }\n\t\n\t  var runningMicrotaskCheckpoint = false;\n\t\n\t  global.Platform = global.Platform || {};\n\t\n\t  global.Platform.performMicrotaskCheckpoint = function() {\n\t    if (runningMicrotaskCheckpoint)\n\t      return;\n\t\n\t    if (!collectObservers)\n\t      return;\n\t\n\t    runningMicrotaskCheckpoint = true;\n\t\n\t    var cycles = 0;\n\t    var anyChanged, toCheck;\n\t\n\t    do {\n\t      cycles++;\n\t      toCheck = allObservers;\n\t      allObservers = [];\n\t      anyChanged = false;\n\t\n\t      for (var i = 0; i < toCheck.length; i++) {\n\t        var observer = toCheck[i];\n\t        if (observer.state_ != OPENED)\n\t          continue;\n\t\n\t        if (observer.check_())\n\t          anyChanged = true;\n\t\n\t        allObservers.push(observer);\n\t      }\n\t      if (runEOMTasks())\n\t        anyChanged = true;\n\t    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\t\n\t    if (testingExposeCycleCount)\n\t      global.dirtyCheckCycleCount = cycles;\n\t\n\t    runningMicrotaskCheckpoint = false;\n\t  };\n\t\n\t  if (collectObservers) {\n\t    global.Platform.clearObservers = function() {\n\t      allObservers = [];\n\t    };\n\t  }\n\t\n\t  function ObjectObserver(object) {\n\t    Observer.call(this);\n\t    this.value_ = object;\n\t    this.oldObject_ = undefined;\n\t  }\n\t\n\t  ObjectObserver.prototype = createObject({\n\t    __proto__: Observer.prototype,\n\t\n\t    arrayObserve: false,\n\t\n\t    connect_: function(callback, target) {\n\t      if (hasObserve) {\n\t        this.directObserver_ = getObservedObject(this, this.value_,\n\t                                                 this.arrayObserve);\n\t      } else {\n\t        this.oldObject_ = this.copyObject(this.value_);\n\t      }\n\t\n\t    },\n\t\n\t    copyObject: function(object) {\n\t      var copy = Array.isArray(object) ? [] : {};\n\t      for (var prop in object) {\n\t        copy[prop] = object[prop];\n\t      };\n\t      if (Array.isArray(object))\n\t        copy.length = object.length;\n\t      return copy;\n\t    },\n\t\n\t    check_: function(changeRecords, skipChanges) {\n\t      var diff;\n\t      var oldValues;\n\t      if (hasObserve) {\n\t        if (!changeRecords)\n\t          return false;\n\t\n\t        oldValues = {};\n\t        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n\t                                           oldValues);\n\t      } else {\n\t        oldValues = this.oldObject_;\n\t        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n\t      }\n\t\n\t      if (diffIsEmpty(diff))\n\t        return false;\n\t\n\t      if (!hasObserve)\n\t        this.oldObject_ = this.copyObject(this.value_);\n\t\n\t      this.report_([\n\t        diff.added || {},\n\t        diff.removed || {},\n\t        diff.changed || {},\n\t        function(property) {\n\t          return oldValues[property];\n\t        }\n\t      ]);\n\t\n\t      return true;\n\t    },\n\t\n\t    disconnect_: function() {\n\t      if (hasObserve) {\n\t        this.directObserver_.close();\n\t        this.directObserver_ = undefined;\n\t      } else {\n\t        this.oldObject_ = undefined;\n\t      }\n\t    },\n\t\n\t    deliver: function() {\n\t      if (this.state_ != OPENED)\n\t        return;\n\t\n\t      if (hasObserve)\n\t        this.directObserver_.deliver(false);\n\t      else\n\t        dirtyCheck(this);\n\t    },\n\t\n\t    discardChanges: function() {\n\t      if (this.directObserver_)\n\t        this.directObserver_.deliver(true);\n\t      else\n\t        this.oldObject_ = this.copyObject(this.value_);\n\t\n\t      return this.value_;\n\t    }\n\t  });\n\t\n\t  var observerSentinel = {};\n\t\n\t  var expectedRecordTypes = {\n\t    add: true,\n\t    update: true,\n\t    'delete': true\n\t  };\n\t\n\t  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n\t    var added = {};\n\t    var removed = {};\n\t\n\t    for (var i = 0; i < changeRecords.length; i++) {\n\t      var record = changeRecords[i];\n\t      if (!expectedRecordTypes[record.type]) {\n\t        console.error('Unknown changeRecord type: ' + record.type);\n\t        console.error(record);\n\t        continue;\n\t      }\n\t\n\t      if (!(record.name in oldValues))\n\t        oldValues[record.name] = record.oldValue;\n\t\n\t      if (record.type == 'update')\n\t        continue;\n\t\n\t      if (record.type == 'add') {\n\t        if (record.name in removed)\n\t          delete removed[record.name];\n\t        else\n\t          added[record.name] = true;\n\t\n\t        continue;\n\t      }\n\t\n\t      // type = 'delete'\n\t      if (record.name in added) {\n\t        delete added[record.name];\n\t        delete oldValues[record.name];\n\t      } else {\n\t        removed[record.name] = true;\n\t      }\n\t    }\n\t\n\t    for (var prop in added)\n\t      added[prop] = object[prop];\n\t\n\t    for (var prop in removed)\n\t      removed[prop] = undefined;\n\t\n\t    var changed = {};\n\t    for (var prop in oldValues) {\n\t      if (prop in added || prop in removed)\n\t        continue;\n\t\n\t      var newValue = object[prop];\n\t      if (oldValues[prop] !== newValue)\n\t        changed[prop] = newValue;\n\t    }\n\t\n\t    return {\n\t      added: added,\n\t      removed: removed,\n\t      changed: changed\n\t    };\n\t  }\n\t\n\t  // Export the observe-js object for **Node.js**, with backwards-compatibility\n\t  // for the old `require()` API. Also ensure `exports` is not a DOM Element.\n\t  // If we're in the browser, export as a global object.\n\t\n\t  global.Observer = Observer;\n\t  global.isBlacklisted = isBlacklisted;\n\t  global.Observer.runEOM_ = runEOM;\n\t  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n\t  global.Observer.hasObjectObserve = hasObserve;\n\t  global.diffObjectFromOldObject = diffObjectFromOldObject;\n\t  global.ObjectObserver = ObjectObserver;\n\t\n\t})(exports);\n\n\n/***/ },\n/* 30 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar randHex = __webpack_require__(31);\n\tvar choice = __webpack_require__(32);\n\t\n\t  /**\n\t   * Returns pseudo-random guid (UUID v4)\n\t   * IMPORTANT: it's not totally \"safe\" since randHex/choice uses Math.random\n\t   * by default and sequences can be predicted in some cases. See the\n\t   * \"random/random\" documentation for more info about it and how to replace\n\t   * the default PRNG.\n\t   */\n\t  function guid() {\n\t    return (\n\t        randHex(8)+'-'+\n\t        randHex(4)+'-'+\n\t        // v4 UUID always contain \"4\" at this position to specify it was\n\t        // randomly generated\n\t        '4' + randHex(3) +'-'+\n\t        // v4 UUID always contain chars [a,b,8,9] at this position\n\t        choice(8, 9, 'a', 'b') + randHex(3)+'-'+\n\t        randHex(12)\n\t    );\n\t  }\n\t  module.exports = guid;\n\t\n\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar choice = __webpack_require__(32);\n\t\n\t    var _chars = '0123456789abcdef'.split('');\n\t\n\t    /**\n\t     * Returns a random hexadecimal string\n\t     */\n\t    function randHex(size){\n\t        size = size && size > 0? size : 6;\n\t        var str = '';\n\t        while (size--) {\n\t            str += choice(_chars);\n\t        }\n\t        return str;\n\t    }\n\t\n\t    module.exports = randHex;\n\t\n\t\n\n\n/***/ },\n/* 32 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar randInt = __webpack_require__(33);\n\tvar isArray = __webpack_require__(38);\n\t\n\t    /**\n\t     * Returns a random element from the supplied arguments\n\t     * or from the array (if single argument is an array).\n\t     */\n\t    function choice(items) {\n\t        var target = (arguments.length === 1 && isArray(items))? items : arguments;\n\t        return target[ randInt(0, target.length - 1) ];\n\t    }\n\t\n\t    module.exports = choice;\n\t\n\t\n\n\n/***/ },\n/* 33 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar MIN_INT = __webpack_require__(34);\n\tvar MAX_INT = __webpack_require__(35);\n\tvar rand = __webpack_require__(36);\n\t\n\t    /**\n\t     * Gets random integer inside range or snap to min/max values.\n\t     */\n\t    function randInt(min, max){\n\t        min = min == null? MIN_INT : ~~min;\n\t        max = max == null? MAX_INT : ~~max;\n\t        // can't be max + 0.5 otherwise it will round up if `rand`\n\t        // returns `max` causing it to overflow range.\n\t        // -0.5 and + 0.49 are required to avoid bias caused by rounding\n\t        return Math.round( rand(min - 0.5, max + 0.499999999999) );\n\t    }\n\t\n\t    module.exports = randInt;\n\t\n\n\n/***/ },\n/* 34 */\n/***/ function(module, exports) {\n\n\t/**\n\t * @constant Minimum 32-bit signed integer value (-2^31).\n\t */\n\t\n\t    module.exports = -2147483648;\n\t\n\n\n/***/ },\n/* 35 */\n/***/ function(module, exports) {\n\n\t/**\n\t * @constant Maximum 32-bit signed integer value. (2^31 - 1)\n\t */\n\t\n\t    module.exports = 2147483647;\n\t\n\n\n/***/ },\n/* 36 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar random = __webpack_require__(37);\n\tvar MIN_INT = __webpack_require__(34);\n\tvar MAX_INT = __webpack_require__(35);\n\t\n\t    /**\n\t     * Returns random number inside range\n\t     */\n\t    function rand(min, max){\n\t        min = min == null? MIN_INT : min;\n\t        max = max == null? MAX_INT : max;\n\t        return min + (max - min) * random();\n\t    }\n\t\n\t    module.exports = rand;\n\t\n\n\n/***/ },\n/* 37 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t    /**\n\t     * Just a wrapper to Math.random. No methods inside mout/random should call\n\t     * Math.random() directly so we can inject the pseudo-random number\n\t     * generator if needed (ie. in case we need a seeded random or a better\n\t     * algorithm than the native one)\n\t     */\n\t    function random(){\n\t        return random.get();\n\t    }\n\t\n\t    // we expose the method so it can be swapped if needed\n\t    random.get = Math.random;\n\t\n\t    module.exports = random;\n\t\n\t\n\n\n/***/ },\n/* 38 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar isKind = __webpack_require__(39);\n\t    /**\n\t     */\n\t    var isArray = Array.isArray || function (val) {\n\t        return isKind(val, 'Array');\n\t    };\n\t    module.exports = isArray;\n\t\n\n\n/***/ },\n/* 39 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar kindOf = __webpack_require__(40);\n\t    /**\n\t     * Check if value is from a specific \"kind\".\n\t     */\n\t    function isKind(val, kind){\n\t        return kindOf(val) === kind;\n\t    }\n\t    module.exports = isKind;\n\t\n\n\n/***/ },\n/* 40 */\n/***/ function(module, exports) {\n\n\t\n\t\n\t    var _rKind = /^\\[object (.*)\\]$/,\n\t        _toString = Object.prototype.toString,\n\t        UNDEF;\n\t\n\t    /**\n\t     * Gets the \"kind\" of value. (e.g. \"String\", \"Number\", etc)\n\t     */\n\t    function kindOf(val) {\n\t        if (val === null) {\n\t            return 'Null';\n\t        } else if (val === UNDEF) {\n\t            return 'Undefined';\n\t        } else {\n\t            return _rKind.exec( _toString.call(val) )[1];\n\t        }\n\t    }\n\t    module.exports = kindOf;\n\t\n\n\n/***/ },\n/* 41 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(2);\n\t\n\tvar _utils2 = _interopRequireDefault(_utils);\n\t\n\tvar _errors = __webpack_require__(3);\n\t\n\tvar _errors2 = _interopRequireDefault(_errors);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar NER = _errors2.default.NER,\n\t    IA = _errors2.default.IA,\n\t    R = _errors2.default.R;\n\t\n\tvar fakeId = 'DS_' + new Date().getTime();\n\t\n\tfunction diffIsEmpty(diff) {\n\t  return !(_utils2.default.isEmpty(diff.added) && _utils2.default.isEmpty(diff.removed) && _utils2.default.isEmpty(diff.changed));\n\t}\n\t\n\tfunction check(fnName, resourceName, id, options) {\n\t  var _this = this;\n\t  var definition = _this.definitions[resourceName];\n\t  options = options || {};\n\t\n\t  id = _utils2.default.resolveId(definition, id);\n\t  if (!definition) {\n\t    throw new NER(resourceName);\n\t  } else if (!_utils2.default._sn(id)) {\n\t    throw _utils2.default._snErr('id');\n\t  }\n\t  id = id === fakeId ? undefined : id;\n\t\n\t  options = _utils2.default._(definition, options);\n\t\n\t\n\t  return { _this: _this, definition: definition, _resourceName: resourceName, _id: id, _options: options };\n\t}\n\t\n\texports.default = {\n\t  // Return the changes for the given item, if any.\n\t  //\n\t  // @param resourceName The name of the type of resource of the item whose changes are to be returned.\n\t  // @param id The primary key of the item whose changes are to be returned.\n\t  // @param options Optional configuration.\n\t  // @param options.ignoredChanges Array of strings or regular expressions of fields, the changes of which are to be ignored.\n\t  // @returns The changes of the given item, if any.\n\t  changes: function changes(resourceName, id, options) {\n\t    var _check$call = check.call(this, 'changes', resourceName, id, options),\n\t        _this = _check$call._this,\n\t        definition = _check$call.definition,\n\t        _resourceName = _check$call._resourceName,\n\t        _id = _check$call._id,\n\t        _options = _check$call._options;\n\t\n\t    var item = definition.get(_id);\n\t    if (item) {\n\t      var observer = _this.store[_resourceName].observers[_id];\n\t      if (observer && typeof observer === 'function') {\n\t        // force observation handler to be fired for item if there are changes and `Object.observe` is not available\n\t        observer.deliver();\n\t      }\n\t\n\t      var ignoredChanges = _utils2.default.copy(_options.ignoredChanges || []);\n\t      // add linked relations to list of ignored changes\n\t      _utils2.default.forEach(definition.relationFields, function (field) {\n\t        if (!_utils2.default.contains(ignoredChanges, field)) {\n\t          ignoredChanges.push(field);\n\t        }\n\t      });\n\t      // calculate changes\n\t      var diff = _utils2.default.diffObjectFromOldObject(item, _this.store[_resourceName].previousAttributes[_id], _utils2.default.equals, ignoredChanges);\n\t      // remove functions from diff\n\t      _utils2.default.forOwn(diff, function (changeset, name) {\n\t        var toKeep = [];\n\t        _utils2.default.forOwn(changeset, function (value, field) {\n\t          if (!_utils2.default.isFunction(value)) {\n\t            toKeep.push(field);\n\t          }\n\t        });\n\t        diff[name] = _utils2.default.pick(diff[name], toKeep);\n\t      });\n\t      // definitely ignore changes to linked relations\n\t      _utils2.default.forEach(definition.relationFields, function (field) {\n\t        delete diff.added[field];\n\t        delete diff.removed[field];\n\t        delete diff.changed[field];\n\t      });\n\t      return diff;\n\t    }\n\t  },\n\t\n\t\n\t  // Return the change history of the given item, if any.\n\t  //\n\t  // @param resourceName The name of the type of resource of the item whose change history is to be returned.\n\t  // @param id The primary key of the item whose change history is to be returned.\n\t  // @returns The change history of the given item, if any.\n\t  changeHistory: function changeHistory(resourceName, id) {\n\t    var _check$call2 = check.call(this, 'changeHistory', resourceName, id || fakeId),\n\t        _this = _check$call2._this,\n\t        definition = _check$call2.definition,\n\t        _resourceName = _check$call2._resourceName,\n\t        _id = _check$call2._id;\n\t\n\t    var resource = _this.store[_resourceName];\n\t\n\t    if (!definition.keepChangeHistory) {\n\t      definition.errorFn('changeHistory is disabled for this resource!');\n\t    } else {\n\t      if (_resourceName) {\n\t        var item = definition.get(_id);\n\t        if (item) {\n\t          return resource.changeHistories[_id];\n\t        }\n\t      } else {\n\t        return resource.changeHistory;\n\t      }\n\t    }\n\t  },\n\t  commit: function commit(resourceName, id) {\n\t    var _check$call3 = check.call(this, 'commit', resourceName, id),\n\t        _this = _check$call3._this,\n\t        definition = _check$call3.definition,\n\t        _resourceName = _check$call3._resourceName,\n\t        _id = _check$call3._id;\n\t\n\t    var resource = _this.store[_resourceName];\n\t    var item = _this.store[_resourceName].index[_id];\n\t    if (item) {\n\t      var relationFields = definition.relationFields || [];\n\t      var previousAttributes = {};\n\t      for (var key in item) {\n\t        if (relationFields.indexOf(key) === -1) {\n\t          previousAttributes[key] = _utils2.default.copy(item[key], null, null, null, []);\n\t        }\n\t      }\n\t      resource.previousAttributes[_id] = previousAttributes;\n\t    }\n\t\n\t    if (resource.changeHistories[_id].length) {\n\t      _utils2.default.forEach(resource.changeHistories[_id], function (changeRecord) {\n\t        _utils2.default.remove(resource.changeHistory, changeRecord);\n\t      });\n\t      resource.changeHistories[_id].splice(0, resource.changeHistories[_id].length);\n\t    }\n\t    return item;\n\t  },\n\t\n\t\n\t  // Re-compute the computed properties of the given item.\n\t  //\n\t  // @param resourceName The name of the type of resource of the item whose computed properties are to be re-computed.\n\t  // @param instance The instance whose computed properties are to be re-computed.\n\t  // @returns The item whose computed properties were re-computed.\n\t  compute: function compute(resourceName, instance) {\n\t    var _this = this;\n\t    var definition = _this.definitions[resourceName];\n\t\n\t    instance = _utils2.default.resolveItem(_this.store[resourceName], instance);\n\t    if (!definition) {\n\t      throw new NER(resourceName);\n\t    } else if (!instance) {\n\t      throw new R('Item not in the store!');\n\t    } else if (!_utils2.default._o(instance) && !_utils2.default._sn(instance)) {\n\t      throw new IA('\"instance\" must be an object, string or number!');\n\t    }\n\t\n\t\n\t    // re-compute all computed properties\n\t    _utils2.default.forOwn(definition.computed, function (fn, field) {\n\t      _utils2.default.compute.call(instance, fn, field);\n\t    });\n\t    return instance;\n\t  },\n\t\n\t\n\t  // Factory function to create an instance of the specified Resource.\n\t  //\n\t  // @param resourceName The name of the type of resource of which to create an instance.\n\t  // @param attrs Hash of properties with which to initialize the instance.\n\t  // @param options Optional configuration.\n\t  // @param options.defaultValues Default values with which to initialize the instance.\n\t  // @returns The new instance.\n\t  createInstance: function createInstance(resourceName, attrs, options) {\n\t    var definition = this.definitions[resourceName];\n\t    var item = void 0;\n\t\n\t    attrs = attrs || {};\n\t\n\t    if (!definition) {\n\t      throw new NER(resourceName);\n\t    } else if (attrs && !_utils2.default.isObject(attrs)) {\n\t      throw new IA('\"attrs\" must be an object!');\n\t    }\n\t\n\t    options = _utils2.default._(definition, options);\n\t\n\t    var relationList = definition.relationList || [];\n\t    if (relationList.length) {\n\t      _utils2.default.forEach(relationList, function (def) {\n\t        var relationData = _utils2.default.get(attrs, def.localField);\n\t        if (relationData) {\n\t          if (_utils2.default.isArray(relationData)) {\n\t            var array = [];\n\t            var Resource = definition.getResource(def.relation);\n\t            var _options = options.orig();\n\t            _utils2.default.forEach(relationData, function (relationDataItem) {\n\t              array.push(Resource.createInstance(relationDataItem, _options));\n\t            });\n\t            _utils2.default.set(attrs, def.localField, array);\n\t          } else if (_utils2.default.isObject(relationData)) {\n\t            _utils2.default.set(attrs, def.localField, definition.getResource(def.relation).createInstance(relationData, options.orig()));\n\t          }\n\t        }\n\t      });\n\t    }\n\t\n\t\n\t    // lifecycle\n\t    options.beforeCreateInstance(options, attrs);\n\t\n\t    // grab instance constructor function from Resource definition\n\t    var Constructor = definition[definition.class];\n\t\n\t    // create instance\n\t    item = new Constructor();\n\t\n\t    if (definition.instanceEvents) {\n\t      _utils2.default.Events(item);\n\t    }\n\t\n\t    // add default values\n\t    if (options.defaultValues) {\n\t      _utils2.default.deepMixIn(item, _utils2.default.copy(options.defaultValues));\n\t    }\n\t    _utils2.default.deepMixIn(item, attrs);\n\t\n\t    // compute computed properties\n\t    if (definition.computed) {\n\t      definition.compute(item);\n\t    }\n\t    // lifecycle\n\t    options.afterCreateInstance(options, item);\n\t    return item;\n\t  },\n\t\n\t\n\t  // Create a new collection of the specified Resource.\n\t  //\n\t  // @param resourceName The name of the type of resource of which to create a collection\n\t  // @param arr Possibly empty array of data from which to create the collection.\n\t  // @param params The criteria by which to filter items. Will be passed to `DS#findAll` if `fetch` is called. See http://www.js-data.io/docs/query-syntax\n\t  // @param options Optional configuration.\n\t  // @param options.notify Whether to call the beforeCreateCollection and afterCreateCollection lifecycle hooks..\n\t  // @returns The new collection.\n\t  createCollection: function createCollection(resourceName, arr, params, options) {\n\t    var _this = this;\n\t    var definition = _this.definitions[resourceName];\n\t\n\t    arr = arr || [];\n\t    params = params || {};\n\t\n\t    if (!definition) {\n\t      throw new NER(resourceName);\n\t    } else if (arr && !_utils2.default.isArray(arr)) {\n\t      throw new IA('\"arr\" must be an array!');\n\t    }\n\t\n\t    options = _utils2.default._(definition, options);\n\t\n\t\n\t    // lifecycle\n\t    options.beforeCreateCollection(options, arr);\n\t\n\t    // define the API for this collection\n\t    Object.defineProperties(arr, {\n\t      //  Call DS#findAll with the params of this collection, filling the collection with the results.\n\t      fetch: {\n\t        value: function value(params, options) {\n\t          var __this = this;\n\t          __this.params = params || __this.params;\n\t          return definition.findAll(__this.params, options).then(function (data) {\n\t            if (data === __this) {\n\t              return __this;\n\t            }\n\t            data.unshift(__this.length);\n\t            data.unshift(0);\n\t            __this.splice.apply(__this, data);\n\t            data.shift();\n\t            data.shift();\n\t            if (data.$$injected) {\n\t              _this.store[resourceName].queryData[_utils2.default.toJson(__this.params)] = __this;\n\t              __this.$$injected = true;\n\t            }\n\t            return __this;\n\t          });\n\t        }\n\t      },\n\t      // params for this collection. See http://www.js-data.io/docs/query-syntax\n\t      params: {\n\t        value: params,\n\t        writable: true\n\t      },\n\t      // name of the resource type of this collection\n\t      resourceName: {\n\t        value: resourceName\n\t      }\n\t    });\n\t\n\t    // lifecycle\n\t    options.afterCreateCollection(options, arr);\n\t    return arr;\n\t  },\n\t\n\t  defineResource: __webpack_require__(42),\n\t  digest: function digest() {\n\t    this.observe.Platform.performMicrotaskCheckpoint();\n\t  },\n\t\n\t  eject: __webpack_require__(43),\n\t  ejectAll: __webpack_require__(44),\n\t  filter: __webpack_require__(45),\n\t\n\t  // Return the item with the given primary key if its in the store.\n\t  //\n\t  // @param resourceName The name of the type of resource of the item to retrieve.\n\t  // @param id The primary key of the item to retrieve.\n\t  // @returns The item with the given primary key if it's in the store.\n\t  // /\n\t  get: function get(resourceName, id) {\n\t    var _check$call4 = check.call(this, 'get', resourceName, id),\n\t        _this = _check$call4._this,\n\t        _resourceName = _check$call4._resourceName,\n\t        _id = _check$call4._id;\n\t\n\t    // return the item if it exists\n\t\n\t\n\t    return _this.store[_resourceName].index[_id];\n\t  },\n\t\n\t\n\t  // Return the items in the store that have the given primary keys.\n\t  //\n\t  // @param resourceName The name of the type of resource of the items to retrieve.\n\t  // @param ids The primary keys of the items to retrieve.\n\t  // @returns The items with the given primary keys if they're in the store.\n\t  getAll: function getAll(resourceName, ids) {\n\t    var _this = this;\n\t    var definition = _this.definitions[resourceName];\n\t    var resource = _this.store[resourceName];\n\t    var collection = [];\n\t\n\t    if (!definition) {\n\t      throw new NER(resourceName);\n\t    } else if (ids && !_utils2.default._a(ids)) {\n\t      throw _utils2.default._aErr('ids');\n\t    }\n\t\n\t\n\t    if (_utils2.default._a(ids)) {\n\t      // return just the items with the given primary keys\n\t      var length = ids.length;\n\t      for (var i = 0; i < length; i++) {\n\t        if (resource.index[ids[i]]) {\n\t          collection.push(resource.index[ids[i]]);\n\t        }\n\t      }\n\t    } else {\n\t      // most efficient of retrieving ALL items from the store\n\t      collection = resource.collection.slice();\n\t    }\n\t\n\t    return collection;\n\t  },\n\t\n\t\n\t  // Return the whether the item with the given primary key has any changes.\n\t  //\n\t  // @param resourceName The name of the type of resource of the item.\n\t  // @param id The primary key of the item.\n\t  // @returns Whether the item with the given primary key has any changes.\n\t  hasChanges: function hasChanges(resourceName, id) {\n\t    var _check$call5 = check.call(this, 'hasChanges', resourceName, id),\n\t        definition = _check$call5.definition,\n\t        _id = _check$call5._id;\n\t\n\t    return definition.get(_id) ? diffIsEmpty(definition.changes(_id)) : false;\n\t  },\n\t\n\t  inject: __webpack_require__(46),\n\t\n\t  // Return whether the item with the given primary key is a temporary item.\n\t  //\n\t  // @param resourceName The name of the type of resource of the item.\n\t  // @param id The primary key of the item.\n\t  // @returns Whether the item with the given primary key is a temporary item.\n\t  isNew: function isNew(resourceName, id) {\n\t    var _check$call6 = check.call(this, 'isNew', resourceName, id || fakeId),\n\t        _this = _check$call6._this,\n\t        _resourceName = _check$call6._resourceName,\n\t        _id = _check$call6._id;\n\t\n\t    var resource = _this.store[_resourceName];\n\t\n\t    return !!resource.temporaryItems[_id];\n\t  },\n\t\n\t\n\t  // Return the timestamp from the last time the item with the given primary key was changed.\n\t  //\n\t  // @param resourceName The name of the type of resource of the item.\n\t  // @param id The primary key of the item.\n\t  // @returns Timestamp from the last time the item was changed.\n\t  lastModified: function lastModified(resourceName, id) {\n\t    var _check$call7 = check.call(this, 'lastModified', resourceName, id || fakeId),\n\t        _this = _check$call7._this,\n\t        _resourceName = _check$call7._resourceName,\n\t        _id = _check$call7._id;\n\t\n\t    var resource = _this.store[_resourceName];\n\t\n\t    if (_id) {\n\t      if (!(_id in resource.modified)) {\n\t        resource.modified[_id] = 0;\n\t      }\n\t      return resource.modified[_id];\n\t    }\n\t    return resource.collectionModified;\n\t  },\n\t\n\t\n\t  // Return the timestamp from the last time the item with the given primary key was saved via an adapter.\n\t  //\n\t  // @param resourceName The name of the type of resource of the item.\n\t  // @param id The primary key of the item.\n\t  // @returns Timestamp from the last time the item was saved.\n\t  lastSaved: function lastSaved(resourceName, id) {\n\t    var _check$call8 = check.call(this, 'lastSaved', resourceName, id || fakeId),\n\t        _this = _check$call8._this,\n\t        _resourceName = _check$call8._resourceName,\n\t        _id = _check$call8._id;\n\t\n\t    var resource = _this.store[_resourceName];\n\t\n\t    if (!(_id in resource.saved)) {\n\t      resource.saved[_id] = 0;\n\t    }\n\t    return resource.saved[_id];\n\t  },\n\t\n\t\n\t  // Return the previous attributes of the item with the given primary key before it was changed.\n\t  //\n\t  // @param resourceName The name of the type of resource of the item.\n\t  // @param id The primary key of the item.\n\t  // @returns The previous attributes of the item\n\t  previous: function previous(resourceName, id) {\n\t    var _check$call9 = check.call(this, 'previous', resourceName, id),\n\t        _this = _check$call9._this,\n\t        _resourceName = _check$call9._resourceName,\n\t        _id = _check$call9._id;\n\t\n\t    var resource = _this.store[_resourceName];\n\t\n\t    // return resource from cache\n\t    return resource.previousAttributes[_id] ? _utils2.default.copy(resource.previousAttributes[_id]) : undefined;\n\t  },\n\t\n\t\n\t  // Revert all attributes of the item with the given primary key to their previous values.\n\t  //\n\t  // @param resourceName The name of the type of resource of the item.\n\t  // @param id The primary key of the item.\n\t  // @param options Optional configuration.\n\t  // @returns The reverted item\n\t  revert: function revert(resourceName, id, options) {\n\t    var _check$call10 = check.call(this, 'revert', resourceName, id, options),\n\t        _this = _check$call10._this,\n\t        definition = _check$call10.definition,\n\t        _resourceName = _check$call10._resourceName,\n\t        _id = _check$call10._id,\n\t        _options = _check$call10._options;\n\t\n\t    var preserve = _options.preserve || [];\n\t    var injectObj = {};\n\t\n\t    if (preserve.length === 0) {\n\t      injectObj = _this.previous(_resourceName, _id);\n\t    } else {\n\t      var instance = definition.get(id);\n\t      var previousInstance = _this.previous(_resourceName, _id);\n\t\n\t      if (!instance) {\n\t        return;\n\t      }\n\t\n\t      _utils2.default.forOwn(instance, function (value, key) {\n\t        if (_utils2.default.contains(preserve, key)) {\n\t          injectObj[key] = instance[key];\n\t        } else {\n\t          injectObj[key] = previousInstance[key];\n\t        }\n\t      });\n\t    }\n\t\n\t    return definition.inject(injectObj, {\n\t      onConflict: 'replace'\n\t    });\n\t  }\n\t};\n\n/***/ },\n/* 42 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _utils = __webpack_require__(2);\n\t\n\tvar _utils2 = _interopRequireDefault(_utils);\n\t\n\tvar _errors = __webpack_require__(3);\n\t\n\tvar _errors2 = _interopRequireDefault(_errors);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * These are DS methods that will be proxied by instances. e.g.\n\t *\n\t * var store = new JSData.DS()\n\t * var User = store.defineResource('user')\n\t * var user = User.createInstance({ id: 1 })\n\t *\n\t * store.update(resourceName, id, attrs[, options]) // DS method\n\t * User.update(id, attrs[, options]) // DS method proxied on a Resource\n\t * user.DSUpdate(attrs[, options]) // DS method proxied on an Instance\n\t */\n\t/* jshint evil:true, loopfunc:true */\n\tvar instanceMethods = ['compute', 'eject', 'refresh', 'save', 'update', 'destroy', 'loadRelations', 'changeHistory', 'changes', 'commit', 'hasChanges', 'isNew', 'lastModified', 'lastSaved', 'previous', 'revert'];\n\t\n\tmodule.exports = function defineResource(definition) {\n\t  var _this = this;\n\t  var definitions = _this.definitions;\n\t\n\t  /**\n\t   * This allows the name-only definition shorthand.\n\t   * store.defineResource('user') is the same as store.defineResource({ name: 'user'})\n\t   */\n\t  if (_utils2.default._s(definition)) {\n\t    definition = {\n\t      name: definition.replace(/\\s/gi, '')\n\t    };\n\t  }\n\t  if (!_utils2.default._o(definition)) {\n\t    throw _utils2.default._oErr('definition');\n\t  } else if (!_utils2.default._s(definition.name)) {\n\t    throw new _errors2.default.IA('\"name\" must be a string!');\n\t  } else if (definitions[definition.name]) {\n\t    throw new _errors2.default.R(definition.name + ' is already registered!');\n\t  }\n\t\n\t  /**\n\t   * Dynamic Resource constructor function.\n\t   *\n\t   * A Resource inherits from the defaults of the data store that created it.\n\t   */\n\t  function Resource(options) {\n\t    this.defaultValues = {};\n\t    this.methods = {};\n\t    this.computed = {};\n\t    this.scopes = {};\n\t    this.actions = {};\n\t    _utils2.default.deepMixIn(this, options);\n\t    var parent = _this.defaults;\n\t    if (definition.extends && definitions[definition.extends]) {\n\t      parent = definitions[definition.extends];\n\t    }\n\t    _utils2.default.fillIn(this.defaultValues, parent.defaultValues);\n\t    _utils2.default.fillIn(this.methods, parent.methods);\n\t    _utils2.default.fillIn(this.computed, parent.computed);\n\t    _utils2.default.fillIn(this.scopes, parent.scopes);\n\t    _utils2.default.fillIn(this.actions, parent.actions);\n\t    this.endpoint = 'endpoint' in options ? options.endpoint : this.name;\n\t  }\n\t\n\t  try {\n\t    // Resources can inherit from another resource instead of inheriting directly from the data store defaults.\n\t    if (definition.extends && definitions[definition.extends]) {\n\t      // Inherit from another resource\n\t      Resource.prototype = definitions[definition.extends];\n\t    } else {\n\t      // Inherit from global defaults\n\t      Resource.prototype = _this.defaults;\n\t    }\n\t    definitions[definition.name] = new Resource(definition);\n\t\n\t    var def = definitions[definition.name];\n\t\n\t    def.getResource = function (resourceName) {\n\t      return _this.definitions[resourceName];\n\t    };\n\t\n\t\n\t    if (!_utils2.default._s(def.idAttribute)) {\n\t      throw new _errors2.default.IA('\"idAttribute\" must be a string!');\n\t    }\n\t\n\t    // Setup nested parent configuration\n\t    if (def.relations) {\n\t      def.relationList = [];\n\t      def.relationFields = [];\n\t      _utils2.default.forOwn(def.relations, function (relatedModels, type) {\n\t        _utils2.default.forOwn(relatedModels, function (defs, relationName) {\n\t          if (!_utils2.default._a(defs)) {\n\t            relatedModels[relationName] = [defs];\n\t          }\n\t          _utils2.default.forEach(relatedModels[relationName], function (d) {\n\t            d.type = type;\n\t            d.relation = relationName;\n\t            d.name = def.name;\n\t            def.relationList.push(d);\n\t            if (d.localField) {\n\t              def.relationFields.push(d.localField);\n\t            }\n\t          });\n\t        });\n\t      });\n\t      if (def.relations.belongsTo) {\n\t        def.parents = {};\n\t        _utils2.default.forOwn(def.relations.belongsTo, function (relatedModel, modelName) {\n\t          _utils2.default.forEach(relatedModel, function (relation) {\n\t            if (relation.parent) {\n\t              def.parent = modelName;\n\t              def.parentKey = relation.localKey;\n\t              def.parentField = relation.localField;\n\t              def.parents[modelName] = {\n\t                key: def.parentKey,\n\t                field: def.parentField\n\t              };\n\t            }\n\t          });\n\t        });\n\t      }\n\t      if (typeof Object.freeze === 'function') {\n\t        Object.freeze(def.relations);\n\t        Object.freeze(def.relationList);\n\t      }\n\t    }\n\t\n\t    // Create the wrapper class for the new resource\n\t    var _class = def['class'] = _utils2.default.pascalCase(def.name);\n\t    try {\n\t      if (typeof def.useClass === 'function') {\n\t        if (def.csp) {\n\t          def[_class] = function () {\n\t            def.useClass.call(this);\n\t          };\n\t        } else {\n\t          def[_class] = new Function('def', 'return function ' + _class + '() { def.useClass.call(this); }')(def); // eslint-disable-line\n\t        }\n\t        def[_class].prototype = function (proto) {\n\t          function Ctor() {}\n\t\n\t          Ctor.prototype = proto;\n\t          return new Ctor();\n\t        }(def.useClass.prototype);\n\t      } else if (def.csp) {\n\t        def[_class] = function () {};\n\t      } else {\n\t        def[_class] = new Function('return function ' + _class + '() {}')(); // eslint-disable-line\n\t      }\n\t    } catch (e) {\n\t      def[_class] = function () {};\n\t    }\n\t\n\t    // Apply developer-defined instance methods\n\t    _utils2.default.forOwn(def.methods, function (fn, m) {\n\t      def[_class].prototype[m] = fn;\n\t    });\n\t\n\t    /**\n\t     * var user = User.createInstance({ id: 1 })\n\t     * user.set('foo', 'bar')\n\t     */\n\t    def[_class].prototype.set = function (key, value) {\n\t      var _this2 = this;\n\t\n\t      _utils2.default.set(this, key, value);\n\t      def.compute(this);\n\t      if (def.instanceEvents) {\n\t        setTimeout(function () {\n\t          _this2.emit('DS.change', def, _this2);\n\t        }, 0);\n\t      }\n\t      def.handleChange(this);\n\t      return this;\n\t    };\n\t\n\t    /**\n\t     * var user = User.createInstance({ id: 1 })\n\t     * user.get('id') // 1\n\t     */\n\t    def[_class].prototype.get = function (key) {\n\t      return _utils2.default.get(this, key);\n\t    };\n\t\n\t    // Setup the relation links\n\t    _utils2.default.applyRelationGettersToTarget(_this, def, def[_class].prototype);\n\t\n\t    var parentOmit = null;\n\t    if (!def.hasOwnProperty('omit')) {\n\t      parentOmit = def.omit;\n\t      def.omit = [];\n\t    } else {\n\t      parentOmit = _this.defaults.omit;\n\t    }\n\t    def.omit = def.omit.concat(parentOmit || []);\n\t\n\t    // Prepare for computed properties\n\t    _utils2.default.forOwn(def.computed, function (fn, field) {\n\t      if (_utils2.default.isFunction(fn)) {\n\t        def.computed[field] = [fn];\n\t        fn = def.computed[field];\n\t      }\n\t      if (def.methods && field in def.methods) {\n\t        def.errorFn('Computed property \"' + field + '\" conflicts with previously defined prototype method!');\n\t      }\n\t      def.omit.push(field);\n\t      if (_utils2.default.isArray(fn)) {\n\t        var deps;\n\t        if (fn.length === 1) {\n\t          var match = fn[0].toString().match(/function.*?\\(([\\s\\S]*?)\\)/);\n\t          deps = match[1].split(',');\n\t          deps = _utils2.default.filter(deps, function (x) {\n\t            return x;\n\t          });\n\t          def.computed[field] = deps.concat(fn);\n\t          fn = def.computed[field];\n\t          if (deps.length) {\n\t            def.errorFn('Use the computed property array syntax for compatibility with minified code!');\n\t          }\n\t        }\n\t        deps = fn.slice(0, fn.length - 1);\n\t        _utils2.default.forEach(deps, function (val, index) {\n\t          deps[index] = val.trim();\n\t        });\n\t        fn.deps = _utils2.default.filter(deps, function (dep) {\n\t          return !!dep;\n\t        });\n\t      } else if (_utils2.default.isObject(fn)) {\n\t        Object.defineProperty(def[_class].prototype, field, fn);\n\t      }\n\t    });\n\t\n\t    // add instance proxies of DS methods\n\t    _utils2.default.forEach(instanceMethods, function (name) {\n\t      def[_class].prototype['DS' + _utils2.default.pascalCase(name)] = function () {\n\t        for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t          args[_key] = arguments[_key];\n\t        }\n\t\n\t        args.unshift(this[def.idAttribute] || this);\n\t        args.unshift(def.name);\n\t        return _this[name].apply(_this, args);\n\t      };\n\t    });\n\t\n\t    // manually add instance proxy for DS#create\n\t    def[_class].prototype.DSCreate = function () {\n\t      for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t        args[_key2] = arguments[_key2];\n\t      }\n\t\n\t      args.unshift(this);\n\t      args.unshift(def.name);\n\t      return _this.create.apply(_this, args);\n\t    };\n\t\n\t    // Initialize store data for the new resource\n\t    _this.store[def.name] = {\n\t      collection: [],\n\t      expiresHeap: new _utils2.default.BinaryHeap(function (x) {\n\t        return x.expires;\n\t      }, function (x, y) {\n\t        return x.item === y;\n\t      }),\n\t      completedQueries: {},\n\t      queryData: {},\n\t      pendingQueries: {},\n\t      index: {},\n\t      modified: {},\n\t      saved: {},\n\t      previousAttributes: {},\n\t      observers: {},\n\t      changeHistories: {},\n\t      changeHistory: [],\n\t      collectionModified: 0,\n\t      temporaryItems: {}\n\t    };\n\t\n\t    var resource = _this.store[def.name];\n\t\n\t    // start the reaping\n\t    if (def.reapInterval) {\n\t      setInterval(function () {\n\t        return def.reap();\n\t      }, def.reapInterval);\n\t    }\n\t\n\t    // proxy DS methods with shorthand ones\n\t    var fns = ['registerAdapter', 'getAdapterName', 'getAdapter', 'is', '!clear'];\n\t    for (var key in _this) {\n\t      if (typeof _this[key] === 'function') {\n\t        fns.push(key);\n\t      }\n\t    }\n\t\n\t    /**\n\t     * Create the Resource shorthands that proxy DS methods. e.g.\n\t     *\n\t     * var store = new JSData.DS()\n\t     * var User = store.defineResource('user')\n\t     *\n\t     * store.update(resourceName, id, attrs[, options]) // DS method\n\t     * User.update(id, attrs[, options]) // DS method proxied on a Resource\n\t     */\n\t    _utils2.default.forEach(fns, function (key) {\n\t      var k = key;\n\t      if (k[0] === '!') {\n\t        return;\n\t      }\n\t      if (_this[k].shorthand !== false) {\n\t        def[k] = function () {\n\t          for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n\t            args[_key3] = arguments[_key3];\n\t          }\n\t\n\t          args.unshift(def.name);\n\t          return _this[k].apply(_this, args);\n\t        };\n\t        def[k].before = function (fn) {\n\t          var orig = def[k];\n\t          def[k] = function () {\n\t            for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n\t              args[_key4] = arguments[_key4];\n\t            }\n\t\n\t            return orig.apply(def, fn.apply(def, args) || args);\n\t          };\n\t        };\n\t      } else {\n\t        def[k] = function () {\n\t          for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n\t            args[_key5] = arguments[_key5];\n\t          }\n\t\n\t          return _this[k].apply(_this, args);\n\t        };\n\t      }\n\t    });\n\t\n\t    def.beforeValidate = _utils2.default.promisify(def.beforeValidate);\n\t    def.validate = _utils2.default.promisify(def.validate);\n\t    def.afterValidate = _utils2.default.promisify(def.afterValidate);\n\t    def.beforeCreate = _utils2.default.promisify(def.beforeCreate);\n\t    def.afterCreate = _utils2.default.promisify(def.afterCreate);\n\t    def.afterFind = _utils2.default.promisify(def.afterFind);\n\t    def.afterFindAll = _utils2.default.promisify(def.afterFindAll);\n\t    def.afterLoadRelations = _utils2.default.promisify(def.afterLoadRelations);\n\t    def.beforeUpdate = _utils2.default.promisify(def.beforeUpdate);\n\t    def.afterUpdate = _utils2.default.promisify(def.afterUpdate);\n\t    def.beforeDestroy = _utils2.default.promisify(def.beforeDestroy);\n\t    def.afterDestroy = _utils2.default.promisify(def.afterDestroy);\n\t\n\t    var defaultAdapter = void 0;\n\t    if (def.hasOwnProperty('defaultAdapter')) {\n\t      defaultAdapter = def.defaultAdapter;\n\t    }\n\t\n\t    // setup \"actions\"\n\t    _utils2.default.forOwn(def.actions, function (action, name) {\n\t      if (def[name] && !def.actions[name]) {\n\t        throw new Error('Cannot override existing method \"' + name + '\"!');\n\t      }\n\t      action.request = action.request || function (config) {\n\t        return config;\n\t      };\n\t      action.response = action.response || function (response) {\n\t        return response;\n\t      };\n\t      action.responseError = action.responseError || function (err) {\n\t        return _utils2.default.Promise.reject(err);\n\t      };\n\t      def[name] = function (id, options) {\n\t        if (_utils2.default._o(id)) {\n\t          options = id;\n\t        }\n\t        options = options || {};\n\t        var adapter = def.getAdapter(action.adapter || defaultAdapter || 'http');\n\t        var config = _utils2.default.deepMixIn({}, action);\n\t        if (!options.hasOwnProperty('endpoint') && config.endpoint) {\n\t          options.endpoint = config.endpoint;\n\t        }\n\t        if (typeof options.getEndpoint === 'function') {\n\t          config.url = options.getEndpoint(def, options);\n\t        } else {\n\t          var _args = [options.basePath || def.basePath || adapter.defaults.basePath, adapter.getEndpoint(def, _utils2.default._sn(id) ? id : null, options)];\n\t          if (_utils2.default._sn(id)) {\n\t            _args.push(id);\n\t          }\n\t          _args.push(action.pathname || name);\n\t          config.url = _utils2.default.makePath.apply(null, _args);\n\t        }\n\t        config.method = config.method || 'GET';\n\t        config.resourceName = def.name;\n\t        _utils2.default.deepMixIn(config, options);\n\t        return new _utils2.default.Promise(function (resolve) {\n\t          return resolve(config);\n\t        }).then(options.request || action.request).then(function (config) {\n\t          return adapter.HTTP(config);\n\t        }).then(function (data) {\n\t          if (data && data.config) {\n\t            data.config.resourceName = def.name;\n\t          }\n\t          return data;\n\t        }).then(options.response || action.response, options.responseError || action.responseError);\n\t      };\n\t    });\n\t\n\t    // mix in events\n\t    _utils2.default.Events(def);\n\t\n\t    def.handleChange = function (data) {\n\t      resource.collectionModified = _utils2.default.updateTimestamp(resource.collectionModified);\n\t      if (def.notify) {\n\t        setTimeout(function () {\n\t          def.emit('DS.change', def, data);\n\t        }, 0);\n\t      }\n\t    };\n\t\n\t\n\t    return def;\n\t  } catch (err) {\n\t    _this.defaults.errorFn(err);\n\t    delete definitions[definition.name];\n\t    delete _this.store[definition.name];\n\t    throw err;\n\t  }\n\t};\n\n/***/ },\n/* 43 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/* jshint eqeqeq:false */\n\t/**\n\t * Eject an item from the store, if it is currently in the store.\n\t *\n\t * @param resourceName The name of the resource type of the item eject.\n\t * @param id The primary key of the item to eject.\n\t * @param options Optional configuration.\n\t * @param options.notify Whether to emit the \"DS.beforeEject\" and \"DS.afterEject\" events\n\t * @param options.clearEmptyQueries Whether to remove cached findAll queries that become empty as a result of this method call.\n\t * @returns The ejected item if one was ejected.\n\t */\n\tmodule.exports = function eject(resourceName, id, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils;\n\t  var definition = _this.definitions[resourceName];\n\t  var resource = _this.store[resourceName];\n\t  var item = void 0;\n\t  var found = false;\n\t\n\t  id = DSUtils.resolveId(definition, id);\n\t\n\t  if (!definition) {\n\t    throw new _this.errors.NER(resourceName);\n\t  } else if (!DSUtils._sn(id)) {\n\t    throw DSUtils._snErr('id');\n\t  }\n\t\n\t  options = DSUtils._(definition, options);\n\t\n\t\n\t  // find the item to eject\n\t  for (var i = 0; i < resource.collection.length; i++) {\n\t    if (resource.collection[i][definition.idAttribute] == id) {\n\t      // eslint-disable-line\n\t      item = resource.collection[i];\n\t      // remove its expiration timestamp\n\t      resource.expiresHeap.remove(item);\n\t      found = true;\n\t      break;\n\t    }\n\t  }\n\t  if (found) {\n\t    // lifecycle\n\t    definition.beforeEject(options, item);\n\t    if (options.notify) {\n\t      definition.emit('DS.beforeEject', definition, item);\n\t    }\n\t\n\t    // find the item in any ($$injected) cached queries\n\t    var toRemove = [];\n\t    DSUtils.forOwn(resource.queryData, function (items, queryHash) {\n\t      if (items.$$injected) {\n\t        DSUtils.remove(items, item);\n\t      }\n\t      // optionally remove any empty queries\n\t      if (!items.length && options.clearEmptyQueries) {\n\t        toRemove.push(queryHash);\n\t      }\n\t    });\n\t\n\t    // clean up\n\t    DSUtils.forEach(resource.changeHistories[id], function (changeRecord) {\n\t      DSUtils.remove(resource.changeHistory, changeRecord);\n\t    });\n\t    DSUtils.forEach(toRemove, function (queryHash) {\n\t      delete resource.completedQueries[queryHash];\n\t      delete resource.queryData[queryHash];\n\t    });\n\t    if (resource.observers[id] && typeof resource.observers[id].close === 'function') {\n\t      // stop observation\n\t      resource.observers[id].close();\n\t    }\n\t    delete resource.observers[id];\n\t    delete resource.index[id];\n\t    delete resource.previousAttributes[id];\n\t    delete resource.completedQueries[id];\n\t    delete resource.pendingQueries[id];\n\t    delete resource.changeHistories[id];\n\t    delete resource.modified[id];\n\t    delete resource.saved[id];\n\t    if (definition.instanceEvents && item.off) {\n\t      item.off();\n\t    }\n\t\n\t    // remove it from the store\n\t    resource.collection.splice(i, 1);\n\t    // collection has been modified\n\t    definition.handleChange(item);\n\t\n\t    // lifecycle\n\t    definition.afterEject(options, item);\n\t    if (options.notify) {\n\t      definition.emit('DS.afterEject', definition, item);\n\t    }\n\t\n\t    return item;\n\t  }\n\t};\n\n/***/ },\n/* 44 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Eject a collection of items from the store, if any items currently in the store match the given criteria.\n\t *\n\t * @param resourceName The name of the resource type of the items eject.\n\t * @param params The criteria by which to match items to eject. See http://www.js-data.io/docs/query-syntax\n\t * @param options Optional configuration.\n\t * @returns The collection of items that were ejected, if any.\n\t */\n\tmodule.exports = function ejectAll(resourceName, params, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils;\n\t  var definition = _this.definitions[resourceName];\n\t  params = params || {};\n\t\n\t  if (!definition) {\n\t    throw new _this.errors.NER(resourceName);\n\t  } else if (!DSUtils._o(params)) {\n\t    throw DSUtils._oErr('params');\n\t  }\n\t\n\t  options = DSUtils._(definition, options);\n\t\n\t  DSUtils.applyScope(definition, params, options);\n\t\n\t  var resource = _this.store[resourceName];\n\t  var queryHash = DSUtils.toJson(params);\n\t\n\t  // get items that match the criteria\n\t  var items = void 0;\n\t\n\t  if (DSUtils.isEmpty(params)) {\n\t    items = definition.getAll();\n\t    // remove all completed queries if ejecting all items\n\t    resource.completedQueries = {};\n\t  } else {\n\t    items = definition.filter(params);\n\t    // remove matching completed query, if any\n\t    delete resource.completedQueries[queryHash];\n\t  }\n\t  // prepare to remove matching items\n\t  DSUtils.forEach(items, function (item) {\n\t    if (item && item[definition.idAttribute]) {\n\t      definition.eject(item[definition.idAttribute], options);\n\t    }\n\t  });\n\t  // collection has been modified\n\t  definition.handleChange(items);\n\t  return items;\n\t};\n\n/***/ },\n/* 45 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Return the subset of items currently in the store that match the given criteria.\n\t *\n\t * The actual filtering is delegated to DS#defaults.defaultFilter, which can be overridden by developers.\n\t *\n\t * @param resourceName The name of the resource type of the items to filter.\n\t * @param params The criteria by which to filter items. See http://www.js-data.io/docs/query-syntax\n\t * @param options Optional configuration.\n\t * @returns Matching items.\n\t */\n\tmodule.exports = function filter(resourceName, params, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils;\n\t  var definition = _this.definitions[resourceName];\n\t\n\t  if (!definition) {\n\t    throw new _this.errors.NER(resourceName);\n\t  } else if (params && !DSUtils._o(params)) {\n\t    throw DSUtils._oErr('params');\n\t  }\n\t\n\t  // Protect against null\n\t  params = params || {};\n\t  options = DSUtils._(definition, options);\n\t\n\t  DSUtils.applyScope(definition, params, options);\n\t\n\t  // delegate filtering to DS#defaults.defaultFilter, which can be overridden by developers.\n\t  return definition.defaultFilter.call(_this, _this.store[resourceName].collection, resourceName, params, options);\n\t};\n\n/***/ },\n/* 46 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _utils = __webpack_require__(2);\n\t\n\tvar _utils2 = _interopRequireDefault(_utils);\n\t\n\tvar _errors = __webpack_require__(3);\n\t\n\tvar _errors2 = _interopRequireDefault(_errors);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/**\n\t * This is a beast of a file, but it's where a significant portion of the magic happens.\n\t *\n\t * DS#inject makes up the core of how data gets into the store.\n\t */\n\t\n\t/**\n\t * This factory function produces an observer handler function tailor-made for the current item being injected.\n\t *\n\t * The observer handler is what allows computed properties and change tracking to function.\n\t *\n\t * @param definition Resource definition produced by DS#defineResource\n\t * @param resource Resource data as internally stored by the data store\n\t * @returns {Function} Observer handler function\n\t * @private\n\t */\n\tfunction makeObserverHandler(definition, resource) {\n\t  var DS = this;\n\t\n\t  // using \"var\" avoids a JSHint error\n\t  var name = definition.name;\n\t\n\t  /**\n\t   * This will be called by observe-js when a new change record is available for the observed object\n\t   *\n\t   * @param added Change record for added properties\n\t   * @param removed Change record for removed properties\n\t   * @param changed Change record for changed properties\n\t   * @param oldValueFn Function that can be used to get the previous value of a changed property\n\t   * @param firstTime Whether this is the first time this function is being called for the given item. Will only be true once.\n\t   */\n\t  return function _react(added, removed, changed, oldValueFn, firstTime) {\n\t    var target = this;\n\t    var item = void 0;\n\t\n\t    // Get the previous primary key of the observed item, in-case some knucklehead changed it\n\t    var innerId = oldValueFn && oldValueFn(definition.idAttribute) ? oldValueFn(definition.idAttribute) : target[definition.idAttribute];\n\t\n\t    // Ignore changes to relation links\n\t    _utils2.default.forEach(definition.relationFields, function (field) {\n\t      delete added[field];\n\t      delete removed[field];\n\t      delete changed[field];\n\t    });\n\t\n\t    // Detect whether there are actually any changes\n\t    if (!_utils2.default.isEmpty(added) || !_utils2.default.isEmpty(removed) || !_utils2.default.isEmpty(changed) || firstTime) {\n\t      item = DS.get(name, innerId);\n\t\n\t      // update item and collection \"modified\" timestamps\n\t      resource.modified[innerId] = _utils2.default.updateTimestamp(resource.modified[innerId]);\n\t\n\t      if (item && definition.instanceEvents) {\n\t        setTimeout(function () {\n\t          item.emit('DS.change', definition, item);\n\t        }, 0);\n\t      }\n\t\n\t      definition.handleChange(item);\n\t\n\t      // Save a change record for the item\n\t      if (definition.keepChangeHistory) {\n\t        var changeRecord = {\n\t          resourceName: name,\n\t          target: item,\n\t          added: added,\n\t          removed: removed,\n\t          changed: changed,\n\t          timestamp: resource.modified[innerId]\n\t        };\n\t        resource.changeHistories[innerId].push(changeRecord);\n\t        resource.changeHistory.push(changeRecord);\n\t      }\n\t    }\n\t\n\t    // Recompute computed properties if any computed properties depend on changed properties\n\t    if (definition.computed) {\n\t      item = item || DS.get(name, innerId);\n\t      _utils2.default.forOwn(definition.computed, function (fn, field) {\n\t        if (_utils2.default._o(fn)) {\n\t          return;\n\t        }\n\t        var compute = false;\n\t        // check if required fields changed\n\t        _utils2.default.forEach(fn.deps, function (dep) {\n\t          if (dep in added || dep in removed || dep in changed || !(field in item)) {\n\t            compute = true;\n\t          }\n\t        });\n\t        compute = compute || !fn.deps.length;\n\t        if (compute) {\n\t          _utils2.default.compute.call(item, fn, field);\n\t        }\n\t      });\n\t    }\n\t\n\t    if (definition.idAttribute in changed) {\n\t      definition.errorFn('Doh! You just changed the primary key of an object! Your data for the \"' + name + '\" resource is now in an undefined (probably broken) state.');\n\t    }\n\t  };\n\t}\n\t\n\t/**\n\t * A recursive function for injecting data into the store.\n\t *\n\t * @param definition Resource definition produced by DS#defineResource\n\t * @param resource Resource data as internally stored by the data store\n\t * @param attrs The data to be injected. Will be an object or an array of objects.\n\t * @param options Optional configuration.\n\t * @returns The injected data\n\t * @private\n\t */\n\tfunction _inject(definition, resource, attrs, options) {\n\t  var _this = this;\n\t  var injected = void 0;\n\t\n\t  if (_utils2.default._a(attrs)) {\n\t    // have an array of objects, go ahead and inject each one individually and return the resulting array\n\t    injected = [];\n\t    for (var i = 0; i < attrs.length; i++) {\n\t      injected.push(_inject.call(_this, definition, resource, attrs[i], options));\n\t    }\n\t  } else {\n\t    // check if \"idAttribute\" is a computed property\n\t    var c = definition.computed;\n\t    var idA = definition.idAttribute;\n\t    // compute the primary key if necessary\n\t    if (c && c[idA]) {\n\t      var args = [];\n\t      _utils2.default.forEach(c[idA].deps, function (dep) {\n\t        args.push(attrs[dep]);\n\t      });\n\t      attrs[idA] = c[idA][c[idA].length - 1].apply(attrs, args);\n\t    } else if (options.temporary) {\n\t      attrs[idA] = _utils2.default.guid();\n\t    }\n\t\n\t    if (!(idA in attrs)) {\n\t      var error = new _errors2.default.R(definition.name + '.inject: \"attrs\" must contain the property specified by \"idAttribute\"!');\n\t      options.errorFn(error);\n\t      throw error;\n\t    } else {\n\t      try {\n\t        // when injecting object that contain their nested relations, this code\n\t        // will recursively inject them into their proper places in the data store.\n\t        // Magic!\n\t        _utils2.default.forEach(definition.relationList, function (def) {\n\t          var relationName = def.relation;\n\t          var relationDef = _this.definitions[relationName];\n\t          var toInject = attrs[def.localField];\n\t          if (typeof def.inject === 'function') {\n\t            def.inject(definition, def, attrs);\n\t          } else if (toInject && def.inject !== false) {\n\t            if (!relationDef) {\n\t              throw new _errors2.default.R(definition.name + ' relation is defined but the resource is not!');\n\t            }\n\t            // handle injecting hasMany relations\n\t            if (_utils2.default._a(toInject)) {\n\t              var items = [];\n\t              _utils2.default.forEach(toInject, function (toInjectItem) {\n\t                if (toInjectItem !== _this.store[relationName].index[toInjectItem[relationDef.idAttribute]]) {\n\t                  try {\n\t                    var injectedItem = relationDef.inject(toInjectItem, options.orig());\n\t                    if (def.foreignKey) {\n\t                      _utils2.default.set(injectedItem, def.foreignKey, attrs[definition.idAttribute]);\n\t                    }\n\t                    items.push(injectedItem);\n\t                  } catch (err) {\n\t                    options.errorFn(err, 'Failed to inject ' + def.type + ' relation: \"' + relationName + '\"!');\n\t                  }\n\t                }\n\t              });\n\t            } else {\n\t              // handle injecting belongsTo and hasOne relations\n\t              if (toInject !== _this.store[relationName].index[toInject[relationDef.idAttribute]]) {\n\t                try {\n\t                  var _injected = relationDef.inject(attrs[def.localField], options.orig());\n\t                  if (def.foreignKey) {\n\t                    _utils2.default.set(_injected, def.foreignKey, attrs[definition.idAttribute]);\n\t                  }\n\t                  if (def.localKey) {\n\t                    _utils2.default.set(attrs, def.localKey, _utils2.default.get(_injected, relationDef.idAttribute));\n\t                  }\n\t                } catch (err) {\n\t                  options.errorFn(err, 'Failed to inject ' + def.type + ' relation: \"' + relationName + '\"!');\n\t                }\n\t              }\n\t            }\n\t          }\n\t        });\n\t\n\t        // primary key of item being injected\n\t        var id = attrs[idA];\n\t        // item being injected\n\t        var item = definition.get(id);\n\t        // 0 if the item is new, otherwise the previous last modified timestamp of the item\n\t        var initialLastModified = item ? resource.modified[id] : 0;\n\t\n\t        // item is new\n\t        if (!item) {\n\t          if (attrs instanceof definition[definition['class']]) {\n\t            item = attrs;\n\t          } else {\n\t            item = new definition[definition['class']]();\n\t            if (options.applyDefaultsOnInject && options.defaultValues) {\n\t              _utils2.default.deepMixIn(item, _utils2.default.copy(options.defaultValues));\n\t            }\n\t          }\n\t\n\t          if (definition.instanceEvents && typeof item.emit !== 'function') {\n\t            _utils2.default.Events(item);\n\t          }\n\t          // remove relation properties from the item, since those relations have been injected by now\n\t          _utils2.default.forEach(definition.relationList, function (def) {\n\t            if (typeof def.link === 'boolean' ? def.link : !!definition.linkRelations) {\n\t              delete attrs[def.localField];\n\t            }\n\t          });\n\t\n\t          // copy remaining properties to the injected item\n\t          _utils2.default.deepMixIn(item, attrs);\n\t\n\t          // add item to collection\n\t          resource.collection.push(item);\n\t          resource.changeHistories[id] = [];\n\t\n\t          // create the observer handler for the data to be injected\n\t          var _react = makeObserverHandler.call(_this, definition, resource);\n\t\n\t          // If we're in the browser, start observation\n\t          if (definition.watchChanges) {\n\t            resource.observers[id] = new _this.observe.ObjectObserver(item);\n\t            resource.observers[id].open(_react, item);\n\t          }\n\t\n\t          // index item\n\t          resource.index[id] = item;\n\t          // fire observation handler for the first time\n\t          _react.call(item, {}, {}, {}, null, true);\n\t          // save \"previous\" attributes of the injected item, for change diffs later\n\t          resource.previousAttributes[id] = _utils2.default.copy(item, null, null, null, definition.relationFields);\n\t          // mark item as temporary if guid has been generated\n\t          if (options.temporary) {\n\t            resource.temporaryItems[id] = true;\n\t          }\n\t        } else {\n\t          // item is being re-injected\n\t          // new properties take precedence\n\t          if (options.onConflict === 'merge') {\n\t            _utils2.default.deepMixIn(item, attrs);\n\t            _utils2.default.forOwn(definition.computed, function (fn, field) {\n\t              _utils2.default.compute.call(item, fn, field);\n\t            });\n\t          } else if (options.onConflict === 'replace') {\n\t            _utils2.default.forOwn(definition.computed, function (fn, field) {\n\t              _utils2.default.compute.call(attrs, fn, field);\n\t            });\n\t            _utils2.default.forOwn(item, function (v, k) {\n\t              if (k !== definition.idAttribute) {\n\t                if (!attrs.hasOwnProperty(k)) {\n\t                  delete item[k];\n\t                }\n\t              }\n\t            });\n\t            _utils2.default.forOwn(attrs, function (v, k) {\n\t              if (k !== definition.idAttribute) {\n\t                item[k] = v;\n\t              }\n\t            });\n\t          }\n\t\n\t          if (definition.resetHistoryOnInject) {\n\t            // clear change history for item\n\t            _this.commit(definition.name, id);\n\t          }\n\t          if (resource.observers[id] && typeof resource.observers[id] === 'function') {\n\t            // force observation callback to be fired if there are any changes to the item and `Object.observe` is not available\n\t            resource.observers[id].deliver();\n\t          }\n\t        }\n\t        // update modified timestamp of item\n\t        resource.modified[id] = initialLastModified && resource.modified[id] === initialLastModified ? _utils2.default.updateTimestamp(resource.modified[id]) : resource.modified[id];\n\t\n\t        // reset expiry tracking for item\n\t        resource.expiresHeap.remove(item);\n\t        var timestamp = new Date().getTime();\n\t        resource.expiresHeap.push({\n\t          item: item,\n\t          timestamp: timestamp,\n\t          expires: definition.maxAge ? timestamp + definition.maxAge : Number.MAX_VALUE\n\t        });\n\t\n\t        // final injected item\n\t        injected = item;\n\t      } catch (err) {\n\t        options.errorFn(err, attrs);\n\t      }\n\t    }\n\t  }\n\t  return injected;\n\t}\n\t\n\t/**\n\t * Inject the given object or array of objects into the data store.\n\t *\n\t * @param resourceName The name of the type of resource of the data to be injected.\n\t * @param attrs Object or array of objects. Objects must contain a primary key.\n\t * @param options Optional configuration.\n\t * @param options.notify Whether to emit the \"DS.beforeInject\" and \"DS.afterInject\" events.\n\t * @returns The injected data.\n\t */\n\tmodule.exports = function inject(resourceName, attrs, options) {\n\t  var _this = this;\n\t  var definition = _this.definitions[resourceName];\n\t  var resource = _this.store[resourceName];\n\t  var injected = void 0;\n\t\n\t  if (!definition) {\n\t    throw new _errors2.default.NER(resourceName);\n\t  } else if (!_utils2.default._o(attrs) && !_utils2.default._a(attrs)) {\n\t    throw new _errors2.default.IA(resourceName + '.inject: \"attrs\" must be an object or an array!');\n\t  }\n\t\n\t  options = _utils2.default._(definition, options);\n\t\n\t  // lifecycle\n\t  options.beforeInject(options, attrs);\n\t  if (options.notify) {\n\t    definition.emit('DS.beforeInject', definition, attrs);\n\t  }\n\t\n\t  // start the recursive injection of data\n\t  injected = _inject.call(_this, definition, resource, attrs, options);\n\t\n\t  // collection was modified\n\t  definition.handleChange(injected);\n\t\n\t  // lifecycle\n\t  options.afterInject(options, injected);\n\t  if (options.notify) {\n\t    definition.emit('DS.afterInject', definition, injected);\n\t  }\n\t\n\t  return injected;\n\t};\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t  value: true\n\t});\n\texports.default = {\n\t  create: __webpack_require__(48),\n\t  destroy: __webpack_require__(49),\n\t  destroyAll: __webpack_require__(50),\n\t  find: __webpack_require__(51),\n\t  findAll: __webpack_require__(52),\n\t  loadRelations: __webpack_require__(53),\n\t  reap: __webpack_require__(54),\n\t  refresh: function refresh(resourceName, id, options) {\n\t    var _this = this;\n\t    var DSUtils = _this.utils;\n\t\n\t    return new DSUtils.Promise(function (resolve, reject) {\n\t      var definition = _this.definitions[resourceName];\n\t      id = DSUtils.resolveId(_this.definitions[resourceName], id);\n\t      if (!definition) {\n\t        reject(new _this.errors.NER(resourceName));\n\t      } else if (!DSUtils._sn(id)) {\n\t        reject(DSUtils._snErr('id'));\n\t      } else {\n\t        options = DSUtils._(definition, options);\n\t        options.bypassCache = true;\n\t        resolve(_this.get(resourceName, id));\n\t      }\n\t    }).then(function (item) {\n\t      return item ? _this.find(resourceName, id, options) : item;\n\t    }).catch(_this.errorFn('refresh', resourceName, id, options));\n\t  },\n\t  refreshAll: function refreshAll(resourceName, params, options) {\n\t    var _this = this;\n\t    var DSUtils = _this.utils;\n\t    var definition = _this.definitions[resourceName];\n\t    params = params || {};\n\t\n\t    return new DSUtils.Promise(function (resolve, reject) {\n\t      if (!definition) {\n\t        reject(new _this.errors.NER(resourceName));\n\t      } else if (!DSUtils._o(params)) {\n\t        reject(DSUtils._oErr('params'));\n\t      } else {\n\t        options = DSUtils._(definition, options);\n\t        options.bypassCache = true;\n\t        resolve(_this.filter(resourceName, params, options));\n\t      }\n\t    }).then(function (existing) {\n\t      options.bypassCache = true;\n\t      return _this.findAll(resourceName, params, options).then(function (found) {\n\t        DSUtils.forEach(existing, function (item) {\n\t          if (found.indexOf(item) === -1) {\n\t            definition.eject(item);\n\t          }\n\t        });\n\t        return found;\n\t      });\n\t    }).catch(_this.errorFn('refreshAll', resourceName, params, options));\n\t  },\n\t\n\t  save: __webpack_require__(55),\n\t  update: __webpack_require__(56),\n\t  updateAll: __webpack_require__(57)\n\t};\n\n/***/ },\n/* 48 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Using an adapter, create a new item.\n\t *\n\t * Generally a primary key will NOT be provided in the properties hash,\n\t * because the adapter's persistence layer should be generating one.\n\t *\n\t * @param resourceName The name of the type of resource of the new item.\n\t * @param attrs Hash of properties with which to create the new item.\n\t * @param options Optional configuration.\n\t * @param options.cacheResponse Whether the newly created item as returned by the adapter should be injected into the data store.\n\t * @param options.upsert If the properties hash contains a primary key, attempt to call DS#update instead.\n\t * @param options.notify Whether to emit the \"DS.beforeCreate\" and \"DS.afterCreate\" events.\n\t * @param options.beforeValidate Lifecycle hook.\n\t * @param options.validate Lifecycle hook.\n\t * @param options.afterValidate Lifecycle hook.\n\t * @param options.beforeCreate Lifecycle hook.\n\t * @param options.afterCreate Lifecycle hook.\n\t */\n\tmodule.exports = function create(resourceName, attrs, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils;\n\t  var definition = _this.definitions[resourceName];\n\t  var resource = _this.store[resourceName];\n\t  var adapter = void 0;\n\t\n\t  options = options || {};\n\t  attrs = attrs || {};\n\t\n\t  var rejectionError = void 0;\n\t  if (!definition) {\n\t    rejectionError = new _this.errors.NER(resourceName);\n\t  } else if (!DSUtils._o(attrs)) {\n\t    rejectionError = DSUtils._oErr('attrs');\n\t  } else {\n\t    options = DSUtils._(definition, options);\n\t    if (options.upsert && DSUtils._sn(attrs[definition.idAttribute]) && !resource.temporaryItems[attrs[definition.idAttribute]]) {\n\t      return _this.update(resourceName, attrs[definition.idAttribute], attrs, options);\n\t    }\n\t  }\n\t\n\t  return new DSUtils.Promise(function (resolve, reject) {\n\t    if (rejectionError) {\n\t      reject(rejectionError);\n\t    } else {\n\t      resolve(attrs);\n\t    }\n\t  })\n\t  // start lifecycle\n\t  .then(function (attrs) {\n\t    return options.beforeValidate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    return options.validate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    return options.afterValidate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    return options.beforeCreate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    if (options.notify) {\n\t      definition.emit('DS.beforeCreate', definition, attrs);\n\t    }\n\t    adapter = _this.getAdapterName(options);\n\t    return _this.adapters[adapter].create(definition, DSUtils.omit(attrs, options.omit), options);\n\t  }).then(function (attrs) {\n\t    return options.afterCreate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    if (options.notify) {\n\t      definition.emit('DS.afterCreate', definition, attrs);\n\t    }\n\t    if (options.cacheResponse) {\n\t      // injected created intem into the store\n\t      var created = _this.inject(definition.name, attrs, options.orig());\n\t      var id = created[definition.idAttribute];\n\t      // mark item's `find` query as completed, so a subsequent `find` call for this item will resolve immediately\n\t      var _resource = _this.store[resourceName];\n\t      _resource.completedQueries[id] = new Date().getTime();\n\t      _resource.saved[id] = DSUtils.updateTimestamp(_resource.saved[id]);\n\t      return created;\n\t    } else {\n\t      // just return an un-injected instance\n\t      return _this.createInstance(resourceName, attrs, options);\n\t    }\n\t  }).then(function (item) {\n\t    return DSUtils.respond(item, { adapter: adapter }, options);\n\t  })['catch'](_this.errorFn('create', resourceName, attrs, options));\n\t};\n\n/***/ },\n/* 49 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Using an adapter, destroy an item.\n\t *\n\t * @param resourceName The name of the type of resource of the item to destroy.\n\t * @param id The primary key of the item to destroy.\n\t * @param options Optional configuration.\n\t * @param options.eagerEject Whether to eject the item from the store before the adapter operation completes, re-injecting if the adapter operation fails.\n\t * @param options.notify Whether to emit the \"DS.beforeDestroy\" and \"DS.afterDestroy\" events.\n\t * @param options.beforeDestroy Lifecycle hook.\n\t * @param options.afterDestroy Lifecycle hook.\n\t * @returns The primary key of the destroyed item.\n\t */\n\tmodule.exports = function destroy(resourceName, id, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils;\n\t  var definition = _this.definitions[resourceName];\n\t  var item = void 0,\n\t      adapter = void 0;\n\t\n\t  return new DSUtils.Promise(function (resolve, reject) {\n\t    id = DSUtils.resolveId(definition, id);\n\t    if (!definition) {\n\t      reject(new _this.errors.NER(resourceName));\n\t    } else if (!DSUtils._sn(id)) {\n\t      reject(DSUtils._snErr('id'));\n\t    } else {\n\t      // check if the item is in the store\n\t      item = definition.get(id) || { id: id };\n\t      options = DSUtils._(definition, options);\n\t      resolve(item);\n\t    }\n\t  })\n\t  // start lifecycle\n\t  .then(function (attrs) {\n\t    return options.beforeDestroy.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    if (options.notify) {\n\t      definition.emit('DS.beforeDestroy', definition, attrs);\n\t    }\n\t    // don't wait for the adapter, remove the item from the store\n\t    if (options.eagerEject) {\n\t      definition.eject(id);\n\t    }\n\t    adapter = definition.getAdapter(options);\n\t    return adapter.destroy(definition, id, options);\n\t  }).then(function () {\n\t    return options.afterDestroy.call(item, options, item);\n\t  }).then(function (item) {\n\t    if (options.notify) {\n\t      definition.emit('DS.afterDestroy', definition, item);\n\t    }\n\t    // make sure the item is removed from the store\n\t    definition.eject(id);\n\t    return DSUtils.respond(id, { adapter: adapter }, options);\n\t  })['catch'](function (err) {\n\t    // rollback by re-injecting the item into the store\n\t    if (options && options.eagerEject && item) {\n\t      definition.inject(item, { notify: false });\n\t    }\n\t    return _this.errorFn('destroy', resourceName, id, options)(err);\n\t  });\n\t};\n\n/***/ },\n/* 50 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Using an adapter, destroy an item.\n\t *\n\t * @param resourceName The name of the type of resource of the item to destroy.\n\t * @param params The criteria by which to filter items to destroy. See http://www.js-data.io/docs/query-syntax\n\t * @param options Optional configuration.\n\t * @param options.eagerEject Whether to eject the items from the store before the adapter operation completes, re-injecting if the adapter operation fails.\n\t * @param options.notify Whether to emit the \"DS.beforeDestroy\" and \"DS.afterDestroy\" events.\n\t * @param options.beforeDestroy Lifecycle hook.\n\t * @param options.afterDestroy Lifecycle hook.\n\t * @returns The ejected items, if any.\n\t */\n\tmodule.exports = function destroyAll(resourceName, params, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils;\n\t  var definition = _this.definitions[resourceName];\n\t  var ejected = void 0,\n\t      toEject = void 0,\n\t      adapter = void 0;\n\t\n\t  params = params || {};\n\t\n\t  return new DSUtils.Promise(function (resolve, reject) {\n\t    if (!definition) {\n\t      reject(new _this.errors.NER(resourceName));\n\t    } else if (!DSUtils._o(params)) {\n\t      reject(DSUtils._oErr('attrs'));\n\t    } else {\n\t      options = DSUtils._(definition, options);\n\t      DSUtils.applyScope(definition, params, options);\n\t      resolve();\n\t    }\n\t  }).then(function () {\n\t    // find items that are to be ejected from the store\n\t    toEject = definition.defaultFilter.call(_this, resourceName, params);\n\t    return options.beforeDestroy(options, toEject);\n\t  }).then(function () {\n\t    if (options.notify) {\n\t      definition.emit('DS.beforeDestroy', definition, toEject);\n\t    }\n\t    // don't wait for the adapter, remove the items from the store\n\t    if (options.eagerEject) {\n\t      ejected = definition.ejectAll(params);\n\t    }\n\t    adapter = definition.getAdapterName(options);\n\t    return _this.adapters[adapter].destroyAll(definition, params, options);\n\t  }).then(function () {\n\t    return options.afterDestroy(options, toEject);\n\t  }).then(function () {\n\t    if (options.notify) {\n\t      definition.emit('DS.afterDestroy', definition, toEject);\n\t    }\n\t    // make sure items are removed from the store\n\t    return ejected || definition.ejectAll(params);\n\t  }).then(function (items) {\n\t    return DSUtils.respond(items, { adapter: adapter }, options);\n\t  })['catch'](function (err) {\n\t    // rollback by re-injecting the items into the store\n\t    if (options && options.eagerEject && ejected) {\n\t      definition.inject(ejected, { notify: false });\n\t    }\n\t    return _this.errorFn('destroyAll', resourceName, params, options)(err);\n\t  });\n\t};\n\n/***/ },\n/* 51 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/* jshint -W082 */\n\t\n\t/**\n\t * Using an adapter, retrieve a single item.\n\t *\n\t * @param resourceName The of the type of resource of the item to retrieve.\n\t * @param id The primary key of the item to retrieve.\n\t * @param options Optional configuration.\n\t * @param options.bypassCache Whether to ignore any cached item and force the retrieval through the adapter.\n\t * @param options.cacheResponse Whether to inject the found item into the data store.\n\t * @param options.strictCache Whether to only consider items to be \"cached\" if they were injected into the store as the result of `find` or `findAll`.\n\t * @param options.strategy The retrieval strategy to use.\n\t * @param options.findStrategy The retrieval strategy to use. Overrides \"strategy\".\n\t * @param options.fallbackAdapters Array of names of adapters to use if using \"fallback\" strategy.\n\t * @param options.findFallbackAdapters Array of names of adapters to use if using \"fallback\" strategy. Overrides \"fallbackAdapters\".\n\t * @returns The item.\n\t */\n\tmodule.exports = function find(resourceName, id, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils;\n\t  var definition = _this.definitions[resourceName];\n\t  var resource = _this.store[resourceName];\n\t  var adapter = void 0;\n\t\n\t  return new DSUtils.Promise(function (resolve, reject) {\n\t    if (!definition) {\n\t      reject(new _this.errors.NER(resourceName));\n\t    } else if (!DSUtils._sn(id)) {\n\t      reject(DSUtils._snErr('id'));\n\t    } else {\n\t      options = DSUtils._(definition, options);\n\t\n\t      if (options.params) {\n\t        options.params = DSUtils.copy(options.params);\n\t      }\n\t\n\t      if (options.bypassCache || !options.cacheResponse) {\n\t        delete resource.completedQueries[id];\n\t      }\n\t\n\t      var expired = options.maxAge && id in resource.completedQueries && resource.completedQueries[id] + options.maxAge < new Date().getTime();\n\t\n\t      if ((!options.findStrictCache || id in resource.completedQueries) && definition.get(id) && !options.bypassCache && !expired) {\n\t        // resolve immediately with the cached item\n\t        resolve(definition.get(id));\n\t      } else {\n\t        // we're going to delegate to the adapter next\n\t        delete resource.completedQueries[id];\n\t        resolve();\n\t      }\n\t    }\n\t  }).then(function (item) {\n\t    if (!item) {\n\t      var query = void 0;\n\t      var usePendingFind = DSUtils.isFunction(options.usePendingFind) ? options.usePendingFind.call(this, resourceName, id, options) : options.usePendingFind;\n\t      if (!(id in resource.pendingQueries) || !usePendingFind) {\n\t        var promise = void 0;\n\t        var strategy = options.findStrategy || options.strategy;\n\t\n\t        // try subsequent adapters if the preceeding one fails\n\t        if (strategy === 'fallback') {\n\t          var makeFallbackCall = function makeFallbackCall(index) {\n\t            adapter = definition.getAdapterName((options.findFallbackAdapters || options.fallbackAdapters)[index]);\n\t            return _this.adapters[adapter].find(definition, id, options)['catch'](function (err) {\n\t              index++;\n\t              if (index < options.fallbackAdapters.length) {\n\t                return makeFallbackCall(index);\n\t              } else {\n\t                return DSUtils.Promise.reject(err);\n\t              }\n\t            });\n\t          };\n\t\n\t          promise = makeFallbackCall(0);\n\t        } else {\n\t          adapter = definition.getAdapterName(options);\n\t          // just make a single attempt\n\t          promise = _this.adapters[adapter].find(definition, id, options);\n\t        }\n\t\n\t        query = promise.then(function (data) {\n\t          return options.afterFind.call(data, options, data);\n\t        }).then(function (data) {\n\t          // Query is no longer pending\n\t          delete resource.pendingQueries[id];\n\t          if (options.cacheResponse) {\n\t            // inject the item into the data store\n\t            var injected = definition.inject(data, options.orig());\n\t            // mark the item as \"cached\"\n\t            resource.completedQueries[id] = new Date().getTime();\n\t            resource.saved[id] = DSUtils.updateTimestamp(resource.saved[id]);\n\t            return injected;\n\t          } else {\n\t            // just return an un-injected instance\n\t            return definition.createInstance(data, options.orig());\n\t          }\n\t        });\n\t\n\t        if (usePendingFind) {\n\t          resource.pendingQueries[id] = query;\n\t        }\n\t      } else {\n\t        query = resource.pendingQueries[id];\n\t      }\n\t      return query;\n\t    } else {\n\t      // resolve immediately with the item\n\t      return item;\n\t    }\n\t  }).then(function (item) {\n\t    return DSUtils.respond(item, { adapter: adapter }, options);\n\t  })['catch'](function (err) {\n\t    if (resource) {\n\t      delete resource.pendingQueries[id];\n\t    }\n\t    return _this.errorFn('find', resourceName, id, options)(err);\n\t  });\n\t};\n\n/***/ },\n/* 52 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/* jshint -W082 */\n\tfunction processResults(data, resourceName, queryHash, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils;\n\t  var definition = _this.definitions[resourceName];\n\t  var resource = _this.store[resourceName];\n\t  var idAttribute = definition.idAttribute;\n\t  var date = new Date().getTime();\n\t\n\t  data = data || [];\n\t\n\t  // Query is no longer pending\n\t  delete resource.pendingQueries[queryHash];\n\t  resource.completedQueries[queryHash] = date;\n\t\n\t  // Merge the new values into the cache\n\t  var injected = definition.inject(data, options.orig());\n\t\n\t  // Make sure each object is added to completedQueries\n\t  if (DSUtils._a(injected)) {\n\t    DSUtils.forEach(injected, function (item) {\n\t      if (item) {\n\t        var id = item[idAttribute];\n\t        if (id) {\n\t          resource.completedQueries[id] = date;\n\t          resource.saved[id] = DSUtils.updateTimestamp(resource.saved[id]);\n\t        }\n\t      }\n\t    });\n\t  } else {\n\t    options.errorFn('response is expected to be an array!');\n\t    resource.completedQueries[injected[idAttribute]] = date;\n\t  }\n\t\n\t  return injected;\n\t}\n\t\n\t/**\n\t * Using an adapter, retrieve a collection of items.\n\t *\n\t * @param resourceName The name of the type of resource of the items to retrieve.\n\t * @param params The criteria by which to filter items to retrieve. See http://www.js-data.io/docs/query-syntax\n\t * @param options Optional configuration.\n\t * @param options.bypassCache Whether to ignore any cached query for these items and force the retrieval through the adapter.\n\t * @param options.cacheResponse Whether to inject the found items into the data store.\n\t * @returns The items.\n\t */\n\tmodule.exports = function findAll(resourceName, params, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils;\n\t  var definition = _this.definitions[resourceName];\n\t  var resource = _this.store[resourceName];\n\t  var queryHash = void 0,\n\t      adapter = void 0;\n\t\n\t  return new DSUtils.Promise(function (resolve, reject) {\n\t    params = params || {};\n\t\n\t    if (!_this.definitions[resourceName]) {\n\t      reject(new _this.errors.NER(resourceName));\n\t    } else if (!DSUtils._o(params)) {\n\t      reject(DSUtils._oErr('params'));\n\t    } else {\n\t      options = DSUtils._(definition, options);\n\t      queryHash = DSUtils.toJson(params);\n\t\n\t      if (options.params) {\n\t        options.params = DSUtils.copy(options.params);\n\t      }\n\t\n\t      DSUtils.applyScope(definition, params, options);\n\t\n\t      // force a new request\n\t      if (options.bypassCache || !options.cacheResponse) {\n\t        delete resource.completedQueries[queryHash];\n\t        delete resource.queryData[queryHash];\n\t      }\n\t\n\t      var expired = options.maxAge && queryHash in resource.completedQueries && resource.completedQueries[queryHash] + options.maxAge < new Date().getTime();\n\t\n\t      if (queryHash in resource.completedQueries && !expired) {\n\t        if (options.useFilter) {\n\t          if (options.localKeys) {\n\t            resolve(definition.getAll(options.localKeys, options.orig()));\n\t          } else {\n\t            // resolve immediately by filtering data from the data store\n\t            resolve(definition.filter(params, options.orig()));\n\t          }\n\t        } else {\n\t          // resolve immediately by returning the cached array from the previously made query\n\t          resolve(resource.queryData[queryHash]);\n\t        }\n\t      } else {\n\t        resolve();\n\t      }\n\t    }\n\t  }).then(function (items) {\n\t    if (!items) {\n\t      var query = void 0;\n\t      var usePendingFindAll = DSUtils.isFunction(options.usePendingFindAll) ? options.usePendingFindAll.call(this, resourceName, params, options) : options.usePendingFindAll;\n\t      if (!(queryHash in resource.pendingQueries) || !usePendingFindAll) {\n\t        var promise = void 0;\n\t        var strategy = options.findAllStrategy || options.strategy;\n\t\n\t        // try subsequent adapters if the preceeding one fails\n\t        if (strategy === 'fallback') {\n\t          var makeFallbackCall = function makeFallbackCall(index) {\n\t            adapter = definition.getAdapterName((options.findAllFallbackAdapters || options.fallbackAdapters)[index]);\n\t            return _this.adapters[adapter].findAll(definition, params, options)['catch'](function (err) {\n\t              index++;\n\t              if (index < options.fallbackAdapters.length) {\n\t                return makeFallbackCall(index);\n\t              } else {\n\t                return DSUtils.Promise.reject(err);\n\t              }\n\t            });\n\t          };\n\t\n\t          promise = makeFallbackCall(0);\n\t        } else {\n\t          adapter = definition.getAdapterName(options);\n\t          // just make a single attempt\n\t          promise = _this.adapters[adapter].findAll(definition, params, options);\n\t        }\n\t\n\t        query = promise.then(function (data) {\n\t          return options.afterFindAll.call(data, options, data);\n\t        }).then(function (data) {\n\t          // Query is no longer pending\n\t          delete resource.pendingQueries[queryHash];\n\t          if (options.cacheResponse) {\n\t            // inject the items into the data store\n\t            resource.queryData[queryHash] = processResults.call(_this, data, resourceName, queryHash, options);\n\t            resource.queryData[queryHash].$$injected = true;\n\t            return resource.queryData[queryHash];\n\t          } else {\n\t            DSUtils.forEach(data, function (item, i) {\n\t              data[i] = definition.createInstance(item, options.orig());\n\t            });\n\t            return data;\n\t          }\n\t        });\n\t\n\t        if (usePendingFindAll) {\n\t          resource.pendingQueries[queryHash] = query;\n\t        }\n\t      } else {\n\t        query = resource.pendingQueries[queryHash];\n\t      }\n\t\n\t      return query;\n\t    } else {\n\t      // resolve immediately with the items\n\t      return items;\n\t    }\n\t  }).then(function (items) {\n\t    return DSUtils.respond(items, { adapter: adapter }, options);\n\t  })['catch'](function (err) {\n\t    if (resource) {\n\t      delete resource.pendingQueries[queryHash];\n\t    }\n\t    return _this.errorFn('findAll', resourceName, params, options)(err);\n\t  });\n\t};\n\n/***/ },\n/* 53 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\t\n\t/**\n\t * Load the specified relations for the given instance.\n\t *\n\t * @param resourceName The name of the type of resource of the instance for which to load relations.\n\t * @param instance The instance or the primary key of the instance.\n\t * @param relations An array of the relations to load.\n\t * @param options Optional configuration.\n\t * @returns The instance, now with its relations loaded.\n\t */\n\tmodule.exports = function loadRelations(resourceName, instance, relations, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils,\n\t      DSErrors = _this.errors;\n\t\n\t  var definition = _this.definitions[resourceName];\n\t  var _options = void 0;\n\t\n\t  return new DSUtils.Promise(function (resolve, reject) {\n\t    if (DSUtils._sn(instance)) {\n\t      instance = definition.get(instance);\n\t    }\n\t\n\t    if (DSUtils._s(relations)) {\n\t      relations = [relations];\n\t    }\n\t\n\t    relations = relations || [];\n\t\n\t    if (!definition) {\n\t      reject(new DSErrors.NER(resourceName));\n\t    } else if (!DSUtils._o(instance)) {\n\t      reject(new DSErrors.IA('\"instance(id)\" must be a string, number or object!'));\n\t    } else if (!DSUtils._a(relations)) {\n\t      reject(new DSErrors.IA('\"relations\" must be a string or an array!'));\n\t    } else {\n\t      _options = DSUtils._(definition, options);\n\t\n\t      var tasks = [];\n\t\n\t      DSUtils.forEach(definition.relationList, function (def) {\n\t        var relationName = def.relation;\n\t        var relationDef = definition.getResource(relationName);\n\t        var __options = DSUtils._(relationDef, options);\n\t\n\t        // relations can be loaded based on resource name or field name\n\t        if (!relations.length || DSUtils.contains(relations, relationName) || DSUtils.contains(relations, def.localField)) {\n\t          var task = void 0;\n\t          var params = {};\n\t          if (__options.allowSimpleWhere) {\n\t            params[def.foreignKey] = instance[definition.idAttribute];\n\t          } else {\n\t            params.where = {};\n\t            params.where[def.foreignKey] = {\n\t              '==': instance[definition.idAttribute]\n\t            };\n\t          }\n\t\n\t          var orig = __options.orig();\n\t          var defKey = def.localKey ? DSUtils.get(instance, def.localKey) : null;\n\t          var hasDefKey = !!(defKey || defKey === 0);\n\t\n\t          if (typeof def.load === 'function') {\n\t            task = def.load(definition, def, instance, orig);\n\t          } else {\n\t            if (def.type === 'hasMany') {\n\t              if (def.localKeys) {\n\t                delete params[def.foreignKey];\n\t                var keys = DSUtils.get(instance, def.localKeys) || [];\n\t                keys = DSUtils._a(keys) ? keys : DSUtils.keys(keys);\n\t                params.where = _defineProperty({}, relationDef.idAttribute, {\n\t                  'in': keys\n\t                });\n\t                orig.localKeys = keys;\n\t              } else if (def.foreignKeys) {\n\t                delete params[def.foreignKey];\n\t                params.where = _defineProperty({}, def.foreignKeys, {\n\t                  contains: instance[definition.idAttribute]\n\t                });\n\t              }\n\t              task = relationDef.findAll(params, orig);\n\t            } else if (def.type === 'hasOne') {\n\t              if (def.localKey && hasDefKey) {\n\t                task = relationDef.find(defKey, orig);\n\t              } else if (def.foreignKey) {\n\t                task = relationDef.findAll(params, orig).then(function (hasOnes) {\n\t                  return hasOnes.length ? hasOnes[0] : null;\n\t                });\n\t              }\n\t            } else if (hasDefKey) {\n\t              task = relationDef.find(defKey, orig);\n\t            }\n\t          }\n\t\n\t          if (task) {\n\t            if (!_options.linkRelations) {\n\t              task = task.then(function (data) {\n\t                instance[def.localField] = data;\n\t              });\n\t            }\n\t            tasks.push(task);\n\t          }\n\t        }\n\t      });\n\t\n\t      resolve(tasks);\n\t    }\n\t  }).then(function (tasks) {\n\t    return DSUtils.Promise.all(tasks);\n\t  }).then(function () {\n\t    return _options.afterLoadRelations.call(instance, _options, instance);\n\t  }).catch(_this.errorFn('loadRelations', resourceName, instance, relations, options));\n\t};\n\n/***/ },\n/* 54 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Find expired items of the specified resource type and perform the configured action.\n\t *\n\t * @param resourceName The name of the type of resource of the items to reap.\n\t * @param options Optional configuration.\n\t * @returns The reaped items.\n\t */\n\tmodule.exports = function reap(resourceName, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils;\n\t  var definition = _this.definitions[resourceName];\n\t  var resource = _this.store[resourceName];\n\t\n\t  return new DSUtils.Promise(function (resolve, reject) {\n\t    if (!definition) {\n\t      reject(new _this.errors.NER(resourceName));\n\t    } else {\n\t      options = DSUtils._(definition, options);\n\t      if (!options.hasOwnProperty('notify')) {\n\t        options.notify = false;\n\t      }\n\t      var items = [];\n\t      var now = new Date().getTime();\n\t      var expiredItem = void 0;\n\t\n\t      // find the expired items\n\t      while ((expiredItem = resource.expiresHeap.peek()) && expiredItem.expires < now) {\n\t        items.push(expiredItem.item);\n\t        delete expiredItem.item;\n\t        resource.expiresHeap.pop();\n\t      }\n\t      resolve(items);\n\t    }\n\t  }).then(function (items) {\n\t    // only hit lifecycle if there are items\n\t    if (items.length) {\n\t      definition.beforeReap(options, items);\n\t      if (options.notify) {\n\t        definition.emit('DS.beforeReap', definition, items);\n\t      }\n\t    }\n\t\n\t    if (options.reapAction === 'inject') {\n\t      var timestamp = new Date().getTime();\n\t      DSUtils.forEach(items, function (item) {\n\t        resource.expiresHeap.push({\n\t          item: item,\n\t          timestamp: timestamp,\n\t          expires: definition.maxAge ? timestamp + definition.maxAge : Number.MAX_VALUE\n\t        });\n\t      });\n\t    } else if (options.reapAction === 'eject') {\n\t      DSUtils.forEach(items, function (item) {\n\t        definition.eject(item[definition.idAttribute]);\n\t      });\n\t    } else if (options.reapAction === 'refresh') {\n\t      var tasks = [];\n\t      DSUtils.forEach(items, function (item) {\n\t        tasks.push(definition.refresh(item[definition.idAttribute]));\n\t      });\n\t      return DSUtils.Promise.all(tasks);\n\t    }\n\t    return items;\n\t  }).then(function (items) {\n\t    // only hit lifecycle if there are items\n\t    if (items.length) {\n\t      definition.afterReap(options, items);\n\t      if (options.notify) {\n\t        definition.emit('DS.afterReap', definition, items);\n\t      }\n\t    }\n\t    return items;\n\t  }).catch(_this.errorFn('reap', resourceName, options));\n\t};\n\n/***/ },\n/* 55 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Save a single item in its present state.\n\t *\n\t * @param resourceName The name of the type of resource of the item.\n\t * @param id The primary key of the item.\n\t * @param options Optional congifuration.\n\t * @returns The item, now saved.\n\t */\n\tmodule.exports = function save(resourceName, id, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils,\n\t      DSErrors = _this.errors;\n\t\n\t  var definition = _this.definitions[resourceName];\n\t  var resource = _this.store[resourceName];\n\t  var item = void 0,\n\t      noChanges = void 0,\n\t      adapter = void 0;\n\t\n\t  return new DSUtils.Promise(function (resolve, reject) {\n\t    id = DSUtils.resolveId(definition, id);\n\t    if (!definition) {\n\t      reject(new DSErrors.NER(resourceName));\n\t    } else if (!DSUtils._sn(id)) {\n\t      reject(DSUtils._snErr('id'));\n\t    } else if (!definition.get(id)) {\n\t      reject(new DSErrors.R('id \"' + id + '\" not found in cache!'));\n\t    } else {\n\t      item = definition.get(id);\n\t      options = DSUtils._(definition, options);\n\t      resolve(item);\n\t    }\n\t  })\n\t  // start lifecycle\n\t  .then(function (attrs) {\n\t    return options.beforeValidate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    return options.validate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    return options.afterValidate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    return options.beforeUpdate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    if (options.notify) {\n\t      definition.emit('DS.beforeUpdate', definition, attrs);\n\t    }\n\t    // only send changed properties to the adapter\n\t    if (options.changesOnly) {\n\t      if (resource.observers[id] && typeof resource.observers[id] === 'function') {\n\t        resource.observers[id].deliver();\n\t      }\n\t      var toKeep = [];\n\t      var changes = definition.changes(id);\n\t\n\t      for (var key in changes.added) {\n\t        toKeep.push(key);\n\t      }\n\t      for (key in changes.changed) {\n\t        toKeep.push(key);\n\t      }\n\t      DSUtils.forEach(options.always, function (property) {\n\t        toKeep.push(property);\n\t      });\n\t      changes = DSUtils.pick(attrs, toKeep);\n\t      // no changes? no save\n\t      if (DSUtils.isEmpty(changes)) {\n\t        // no changes, return\n\t        noChanges = true;\n\t        return attrs;\n\t      } else {\n\t        attrs = changes;\n\t      }\n\t    }\n\t    adapter = definition.getAdapterName(options);\n\t    return _this.adapters[adapter].update(definition, id, DSUtils.omit(attrs, options.omit), options);\n\t  }).then(function (data) {\n\t    return options.afterUpdate.call(data, options, data);\n\t  }).then(function (attrs) {\n\t    if (options.notify) {\n\t      definition.emit('DS.afterUpdate', definition, attrs);\n\t    }\n\t    if (noChanges) {\n\t      // no changes, just return\n\t      return attrs;\n\t    } else if (options.cacheResponse) {\n\t      // inject the reponse into the store, updating the item\n\t      var injected = definition.inject(attrs, options.orig());\n\t      // mark the item as \"saved\"\n\t      resource.saved[id] = DSUtils.updateTimestamp(resource.saved[id]);\n\t      if (!definition.resetHistoryOnInject) {\n\t        resource.previousAttributes[id] = DSUtils.copy(injected, null, null, null, definition.relationFields);\n\t      }\n\t      return injected;\n\t    } else {\n\t      // just return an instance\n\t      return definition.createInstance(attrs, options.orig());\n\t    }\n\t  }).then(function (item) {\n\t    return DSUtils.respond(item, { adapter: adapter }, options);\n\t  }).catch(_this.errorFn('save', resourceName, id, options));\n\t};\n\n/***/ },\n/* 56 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Update a single item using the supplied properties hash.\n\t *\n\t * @param resourceName The name of the type of resource of the item to update.\n\t * @param id The primary key of the item to update.\n\t * @param attrs The attributes with which to update the item.\n\t * @param options Optional configuration.\n\t * @returns The item, now updated.\n\t */\n\tmodule.exports = function update(resourceName, id, attrs, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils,\n\t      DSErrors = _this.errors;\n\t\n\t  var definition = _this.definitions[resourceName];\n\t  var adapter = void 0;\n\t\n\t  return new DSUtils.Promise(function (resolve, reject) {\n\t    id = DSUtils.resolveId(definition, id);\n\t    if (!definition) {\n\t      reject(new DSErrors.NER(resourceName));\n\t    } else if (!DSUtils._sn(id)) {\n\t      reject(DSUtils._snErr('id'));\n\t    } else {\n\t      options = DSUtils._(definition, options);\n\t      resolve(attrs);\n\t    }\n\t  })\n\t  // start lifecycle\n\t  .then(function (attrs) {\n\t    return options.beforeValidate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    return options.validate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    return options.afterValidate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    return options.beforeUpdate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    if (options.notify) {\n\t      definition.emit('DS.beforeUpdate', definition, attrs);\n\t    }\n\t    adapter = definition.getAdapterName(options);\n\t    return _this.adapters[adapter].update(definition, id, DSUtils.omit(attrs, options.omit), options);\n\t  }).then(function (data) {\n\t    return options.afterUpdate.call(data, options, data);\n\t  }).then(function (attrs) {\n\t    if (options.notify) {\n\t      definition.emit('DS.afterUpdate', definition, attrs);\n\t    }\n\t    if (options.cacheResponse) {\n\t      // inject the updated item into the store\n\t      var injected = definition.inject(attrs, options.orig());\n\t      var resource = _this.store[resourceName];\n\t      var _id = injected[definition.idAttribute];\n\t      // mark the item as \"saved\"\n\t      resource.saved[_id] = DSUtils.updateTimestamp(resource.saved[_id]);\n\t      if (!definition.resetHistoryOnInject) {\n\t        resource.previousAttributes[_id] = DSUtils.copy(injected, null, null, null, definition.relationFields);\n\t      }\n\t      return injected;\n\t    } else {\n\t      // just return an instance\n\t      return definition.createInstance(attrs, options.orig());\n\t    }\n\t  }).then(function (item) {\n\t    return DSUtils.respond(item, { adapter: adapter }, options);\n\t  }).catch(_this.errorFn('update', resourceName, id, attrs, options));\n\t};\n\n/***/ },\n/* 57 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Update a collection of items using the supplied properties hash.\n\t *\n\t * @param resourceName The name of the type of resource of the items to update.\n\t * @param attrs  The attributes with which to update the item.\n\t * @param params The criteria by which to select items to update. See http://www.js-data.io/docs/query-syntax\n\t * @param options Optional configuration.\n\t * @returns The updated items.\n\t */\n\tmodule.exports = function updateAll(resourceName, attrs, params, options) {\n\t  var _this = this;\n\t  var DSUtils = _this.utils,\n\t      DSErrors = _this.errors;\n\t\n\t  var definition = _this.definitions[resourceName];\n\t  var adapter = void 0;\n\t\n\t  return new DSUtils.Promise(function (resolve, reject) {\n\t    if (!definition) {\n\t      reject(new DSErrors.NER(resourceName));\n\t    } else {\n\t      options = DSUtils._(definition, options);\n\t      DSUtils.applyScope(definition, params, options);\n\t      resolve(attrs);\n\t    }\n\t  })\n\t  // start lifecycle\n\t  .then(function (attrs) {\n\t    return options.beforeValidate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    return options.validate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    return options.afterValidate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    return options.beforeUpdate.call(attrs, options, attrs);\n\t  }).then(function (attrs) {\n\t    if (options.notify) {\n\t      definition.emit('DS.beforeUpdate', definition, attrs);\n\t    }\n\t    adapter = definition.getAdapterName(options);\n\t    return _this.adapters[adapter].updateAll(definition, DSUtils.omit(attrs, options.omit), params, options);\n\t  }).then(function (data) {\n\t    return options.afterUpdate.call(data, options, data);\n\t  }).then(function (data) {\n\t    if (options.notify) {\n\t      definition.emit('DS.afterUpdate', definition, attrs);\n\t    }\n\t    var origOptions = options.orig();\n\t    if (options.cacheResponse) {\n\t      // inject the updated items into the store\n\t      var injected = definition.inject(data, origOptions);\n\t      var resource = _this.store[resourceName];\n\t      // mark the items as \"saved\"\n\t      DSUtils.forEach(injected, function (i) {\n\t        var id = i[definition.idAttribute];\n\t        resource.saved[id] = DSUtils.updateTimestamp(resource.saved[id]);\n\t        if (!definition.resetHistoryOnInject) {\n\t          resource.previousAttributes[id] = DSUtils.copy(i, null, null, null, definition.relationFields);\n\t        }\n\t      });\n\t      return injected;\n\t    } else {\n\t      // just return instances\n\t      var instances = [];\n\t      DSUtils.forEach(data, function (item) {\n\t        instances.push(definition.createInstance(item, origOptions));\n\t      });\n\t      return instances;\n\t    }\n\t  }).then(function (items) {\n\t    return DSUtils.respond(items, { adapter: adapter }, options);\n\t  }).catch(_this.errorFn('updateAll', resourceName, attrs, params, options));\n\t};\n\n/***/ }\n/******/ ])\n});\n;\n//# sourceMappingURL=js-data-debug.js.map\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var hashClear = require('./_hashClear'),\n    hashDelete = require('./_hashDelete'),\n    hashGet = require('./_hashGet'),\n    hashHas = require('./_hashHas'),\n    hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var listCacheClear = require('./_listCacheClear'),\n    listCacheDelete = require('./_listCacheDelete'),\n    listCacheGet = require('./_listCacheGet'),\n    listCacheHas = require('./_listCacheHas'),\n    listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var mapCacheClear = require('./_mapCacheClear'),\n    mapCacheDelete = require('./_mapCacheDelete'),\n    mapCacheGet = require('./_mapCacheGet'),\n    mapCacheHas = require('./_mapCacheHas'),\n    mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var MapCache = require('./_MapCache'),\n    setCacheAdd = require('./_setCacheAdd'),\n    setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","var ListCache = require('./_ListCache'),\n    stackClear = require('./_stackClear'),\n    stackDelete = require('./_stackDelete'),\n    stackGet = require('./_stackGet'),\n    stackHas = require('./_stackHas'),\n    stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    var value = array[index];\n    setter(accumulator, value, iteratee(value), array);\n  }\n  return accumulator;\n}\n\nmodule.exports = arrayAggregator;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayFilter;\n","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n  var length = array == null ? 0 : array.length;\n  return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (comparator(value, array[index])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","var baseTimes = require('./_baseTimes'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isIndex = require('./_isIndex'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n","var copyArray = require('./_copyArray'),\n    shuffleSelf = require('./_shuffleSelf');\n\n/**\n * A specialized version of `_.shuffle` for arrays.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\nfunction arrayShuffle(array) {\n  return shuffleSelf(copyArray(array));\n}\n\nmodule.exports = arrayShuffle;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arraySome;\n","var baseAssignValue = require('./_baseAssignValue'),\n    eq = require('./eq');\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n  if ((value !== undefined && !eq(object[key], value)) ||\n      (value === undefined && !(key in object))) {\n    baseAssignValue(object, key, value);\n  }\n}\n\nmodule.exports = assignMergeValue;\n","var baseAssignValue = require('./_baseAssignValue'),\n    eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n  var objValue = object[key];\n  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n      (value === undefined && !(key in object))) {\n    baseAssignValue(object, key, value);\n  }\n}\n\nmodule.exports = assignValue;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var baseEach = require('./_baseEach');\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n  baseEach(collection, function(value, key, collection) {\n    setter(accumulator, value, iteratee(value), collection);\n  });\n  return accumulator;\n}\n\nmodule.exports = baseAggregator;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n  if (key == '__proto__' && defineProperty) {\n    defineProperty(object, key, {\n      'configurable': true,\n      'enumerable': true,\n      'value': value,\n      'writable': true\n    });\n  } else {\n    object[key] = value;\n  }\n}\n\nmodule.exports = baseAssignValue;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n  function object() {}\n  return function(proto) {\n    if (!isObject(proto)) {\n      return {};\n    }\n    if (objectCreate) {\n      return objectCreate(proto);\n    }\n    object.prototype = proto;\n    var result = new object;\n    object.prototype = undefined;\n    return result;\n  };\n}());\n\nmodule.exports = baseCreate;\n","var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    arrayMap = require('./_arrayMap'),\n    baseUnary = require('./_baseUnary'),\n    cacheHas = require('./_cacheHas');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      isCommon = true,\n      length = array.length,\n      result = [],\n      valuesLength = values.length;\n\n  if (!length) {\n    return result;\n  }\n  if (iteratee) {\n    values = arrayMap(values, baseUnary(iteratee));\n  }\n  if (comparator) {\n    includes = arrayIncludesWith;\n    isCommon = false;\n  }\n  else if (values.length >= LARGE_ARRAY_SIZE) {\n    includes = cacheHas;\n    isCommon = false;\n    values = new SetCache(values);\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee == null ? value : iteratee(value);\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var valuesIndex = valuesLength;\n      while (valuesIndex--) {\n        if (values[valuesIndex] === computed) {\n          continue outer;\n        }\n      }\n      result.push(value);\n    }\n    else if (!includes(values, computed, comparator)) {\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseDifference;\n","var baseForOwn = require('./_baseForOwn'),\n    createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n  var length = array.length,\n      index = fromIndex + (fromRight ? 1 : -1);\n\n  while ((fromRight ? index-- : ++index < length)) {\n    if (predicate(array[index], index, array)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseFindIndex;\n","var arrayPush = require('./_arrayPush'),\n    isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n  var index = -1,\n      length = array.length;\n\n  predicate || (predicate = isFlattenable);\n  result || (result = []);\n\n  while (++index < length) {\n    var value = array[index];\n    if (depth > 0 && predicate(value)) {\n      if (depth > 1) {\n        // Recursively flatten arrays (susceptible to call stack limits).\n        baseFlatten(value, depth - 1, predicate, isStrict, result);\n      } else {\n        arrayPush(result, value);\n      }\n    } else if (!isStrict) {\n      result[result.length] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseFlatten;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","var baseFor = require('./_baseFor'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n  return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var castPath = require('./_castPath'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n  path = castPath(path, object);\n\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = object[toKey(path[index++])];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var arrayPush = require('./_arrayPush'),\n    isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n  return object != null && hasOwnProperty.call(object, key);\n}\n\nmodule.exports = baseHas;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n  return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var baseFindIndex = require('./_baseFindIndex'),\n    baseIsNaN = require('./_baseIsNaN'),\n    strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n  return value === value\n    ? strictIndexOf(array, value, fromIndex)\n    : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Unordered comparison\n *  2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n    equalArrays = require('./_equalArrays'),\n    equalByTag = require('./_equalByTag'),\n    equalObjects = require('./_equalObjects'),\n    getTag = require('./_getTag'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = objIsArr ? arrayTag : getTag(object),\n      othTag = othIsArr ? arrayTag : getTag(other);\n\n  objTag = objTag == argsTag ? objectTag : objTag;\n  othTag = othTag == argsTag ? objectTag : othTag;\n\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && isBuffer(object)) {\n    if (!isBuffer(other)) {\n      return false;\n    }\n    objIsArr = true;\n    objIsObj = false;\n  }\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n  }\n  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var Stack = require('./_Stack'),\n    baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n  var index = matchData.length,\n      length = index,\n      noCustomizer = !customizer;\n\n  if (object == null) {\n    return !length;\n  }\n  object = Object(object);\n  while (index--) {\n    var data = matchData[index];\n    if ((noCustomizer && data[2])\n          ? data[1] !== object[data[0]]\n          : !(data[0] in object)\n        ) {\n      return false;\n    }\n  }\n  while (++index < length) {\n    data = matchData[index];\n    var key = data[0],\n        objValue = object[key],\n        srcValue = data[1];\n\n    if (noCustomizer && data[2]) {\n      if (objValue === undefined && !(key in object)) {\n        return false;\n      }\n    } else {\n      var stack = new Stack;\n      if (customizer) {\n        var result = customizer(objValue, srcValue, key, object, source, stack);\n      }\n      if (!(result === undefined\n            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n            : result\n          )) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nmodule.exports = baseIsMatch;\n","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n  return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n","var isFunction = require('./isFunction'),\n    isMasked = require('./_isMasked'),\n    isObject = require('./isObject'),\n    toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var baseGetTag = require('./_baseGetTag'),\n    isLength = require('./isLength'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","var baseMatches = require('./_baseMatches'),\n    baseMatchesProperty = require('./_baseMatchesProperty'),\n    identity = require('./identity'),\n    isArray = require('./isArray'),\n    property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n  // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n  if (typeof value == 'function') {\n    return value;\n  }\n  if (value == null) {\n    return identity;\n  }\n  if (typeof value == 'object') {\n    return isArray(value)\n      ? baseMatchesProperty(value[0], value[1])\n      : baseMatches(value);\n  }\n  return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var isPrototype = require('./_isPrototype'),\n    nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeys;\n","var isObject = require('./isObject'),\n    isPrototype = require('./_isPrototype'),\n    nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n  if (!isObject(object)) {\n    return nativeKeysIn(object);\n  }\n  var isProto = isPrototype(object),\n      result = [];\n\n  for (var key in object) {\n    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeysIn;\n","var baseEach = require('./_baseEach'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n  var index = -1,\n      result = isArrayLike(collection) ? Array(collection.length) : [];\n\n  baseEach(collection, function(value, key, collection) {\n    result[++index] = iteratee(value, key, collection);\n  });\n  return result;\n}\n\nmodule.exports = baseMap;\n","var baseIsMatch = require('./_baseIsMatch'),\n    getMatchData = require('./_getMatchData'),\n    matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n  var matchData = getMatchData(source);\n  if (matchData.length == 1 && matchData[0][2]) {\n    return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n  }\n  return function(object) {\n    return object === source || baseIsMatch(object, source, matchData);\n  };\n}\n\nmodule.exports = baseMatches;\n","var baseIsEqual = require('./_baseIsEqual'),\n    get = require('./get'),\n    hasIn = require('./hasIn'),\n    isKey = require('./_isKey'),\n    isStrictComparable = require('./_isStrictComparable'),\n    matchesStrictComparable = require('./_matchesStrictComparable'),\n    toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n  if (isKey(path) && isStrictComparable(srcValue)) {\n    return matchesStrictComparable(toKey(path), srcValue);\n  }\n  return function(object) {\n    var objValue = get(object, path);\n    return (objValue === undefined && objValue === srcValue)\n      ? hasIn(object, path)\n      : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n  };\n}\n\nmodule.exports = baseMatchesProperty;\n","var Stack = require('./_Stack'),\n    assignMergeValue = require('./_assignMergeValue'),\n    baseFor = require('./_baseFor'),\n    baseMergeDeep = require('./_baseMergeDeep'),\n    isObject = require('./isObject'),\n    keysIn = require('./keysIn'),\n    safeGet = require('./_safeGet');\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n *  counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n  if (object === source) {\n    return;\n  }\n  baseFor(source, function(srcValue, key) {\n    if (isObject(srcValue)) {\n      stack || (stack = new Stack);\n      baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n    }\n    else {\n      var newValue = customizer\n        ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      if (newValue === undefined) {\n        newValue = srcValue;\n      }\n      assignMergeValue(object, key, newValue);\n    }\n  }, keysIn);\n}\n\nmodule.exports = baseMerge;\n","var assignMergeValue = require('./_assignMergeValue'),\n    cloneBuffer = require('./_cloneBuffer'),\n    cloneTypedArray = require('./_cloneTypedArray'),\n    copyArray = require('./_copyArray'),\n    initCloneObject = require('./_initCloneObject'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isArrayLikeObject = require('./isArrayLikeObject'),\n    isBuffer = require('./isBuffer'),\n    isFunction = require('./isFunction'),\n    isObject = require('./isObject'),\n    isPlainObject = require('./isPlainObject'),\n    isTypedArray = require('./isTypedArray'),\n    safeGet = require('./_safeGet'),\n    toPlainObject = require('./toPlainObject');\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n *  counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n  var objValue = safeGet(object, key),\n      srcValue = safeGet(source, key),\n      stacked = stack.get(srcValue);\n\n  if (stacked) {\n    assignMergeValue(object, key, stacked);\n    return;\n  }\n  var newValue = customizer\n    ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n    : undefined;\n\n  var isCommon = newValue === undefined;\n\n  if (isCommon) {\n    var isArr = isArray(srcValue),\n        isBuff = !isArr && isBuffer(srcValue),\n        isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n    newValue = srcValue;\n    if (isArr || isBuff || isTyped) {\n      if (isArray(objValue)) {\n        newValue = objValue;\n      }\n      else if (isArrayLikeObject(objValue)) {\n        newValue = copyArray(objValue);\n      }\n      else if (isBuff) {\n        isCommon = false;\n        newValue = cloneBuffer(srcValue, true);\n      }\n      else if (isTyped) {\n        isCommon = false;\n        newValue = cloneTypedArray(srcValue, true);\n      }\n      else {\n        newValue = [];\n      }\n    }\n    else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n      newValue = objValue;\n      if (isArguments(objValue)) {\n        newValue = toPlainObject(objValue);\n      }\n      else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {\n        newValue = initCloneObject(srcValue);\n      }\n    }\n    else {\n      isCommon = false;\n    }\n  }\n  if (isCommon) {\n    // Recursively merge objects and arrays (susceptible to call stack limits).\n    stack.set(srcValue, newValue);\n    mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n    stack['delete'](srcValue);\n  }\n  assignMergeValue(object, key, newValue);\n}\n\nmodule.exports = baseMergeDeep;\n","var arrayMap = require('./_arrayMap'),\n    baseIteratee = require('./_baseIteratee'),\n    baseMap = require('./_baseMap'),\n    baseSortBy = require('./_baseSortBy'),\n    baseUnary = require('./_baseUnary'),\n    compareMultiple = require('./_compareMultiple'),\n    identity = require('./identity');\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n  var index = -1;\n  iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee));\n\n  var result = baseMap(collection, function(value, key, collection) {\n    var criteria = arrayMap(iteratees, function(iteratee) {\n      return iteratee(value);\n    });\n    return { 'criteria': criteria, 'index': ++index, 'value': value };\n  });\n\n  return baseSortBy(result, function(object, other) {\n    return compareMultiple(object, other, orders);\n  });\n}\n\nmodule.exports = baseOrderBy;\n","var basePickBy = require('./_basePickBy'),\n    hasIn = require('./hasIn');\n\n/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\nfunction basePick(object, paths) {\n  return basePickBy(object, paths, function(value, path) {\n    return hasIn(object, path);\n  });\n}\n\nmodule.exports = basePick;\n","var baseGet = require('./_baseGet'),\n    baseSet = require('./_baseSet'),\n    castPath = require('./_castPath');\n\n/**\n * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n  var index = -1,\n      length = paths.length,\n      result = {};\n\n  while (++index < length) {\n    var path = paths[index],\n        value = baseGet(object, path);\n\n    if (predicate(value, path)) {\n      baseSet(result, castPath(path, object), value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = basePickBy;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n  return function(object) {\n    return baseGet(object, path);\n  };\n}\n\nmodule.exports = basePropertyDeep;\n","/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeFloor = Math.floor,\n    nativeRandom = Math.random;\n\n/**\n * The base implementation of `_.random` without support for returning\n * floating-point numbers.\n *\n * @private\n * @param {number} lower The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the random number.\n */\nfunction baseRandom(lower, upper) {\n  return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n}\n\nmodule.exports = baseRandom;\n","var identity = require('./identity'),\n    overRest = require('./_overRest'),\n    setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n  return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var assignValue = require('./_assignValue'),\n    castPath = require('./_castPath'),\n    isIndex = require('./_isIndex'),\n    isObject = require('./isObject'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n  if (!isObject(object)) {\n    return object;\n  }\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      lastIndex = length - 1,\n      nested = object;\n\n  while (nested != null && ++index < length) {\n    var key = toKey(path[index]),\n        newValue = value;\n\n    if (index != lastIndex) {\n      var objValue = nested[key];\n      newValue = customizer ? customizer(objValue, key, nested) : undefined;\n      if (newValue === undefined) {\n        newValue = isObject(objValue)\n          ? objValue\n          : (isIndex(path[index + 1]) ? [] : {});\n      }\n    }\n    assignValue(nested, key, newValue);\n    nested = nested[key];\n  }\n  return object;\n}\n\nmodule.exports = baseSet;\n","var constant = require('./constant'),\n    defineProperty = require('./_defineProperty'),\n    identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n  return defineProperty(func, 'toString', {\n    'configurable': true,\n    'enumerable': false,\n    'value': constant(string),\n    'writable': true\n  });\n};\n\nmodule.exports = baseSetToString;\n","var shuffleSelf = require('./_shuffleSelf'),\n    values = require('./values');\n\n/**\n * The base implementation of `_.shuffle`.\n *\n * @private\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\nfunction baseShuffle(collection) {\n  return shuffleSelf(values(collection));\n}\n\nmodule.exports = baseShuffle;\n","/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n  var length = array.length;\n\n  array.sort(comparer);\n  while (length--) {\n    array[length] = array[length].value;\n  }\n  return array;\n}\n\nmodule.exports = baseSortBy;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = baseTimes;\n","var arrayMap = require('./_arrayMap');\n\n/**\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n * of key-value pairs for `object` corresponding to the property names of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the key-value pairs.\n */\nfunction baseToPairs(object, props) {\n  return arrayMap(props, function(key) {\n    return [key, object[key]];\n  });\n}\n\nmodule.exports = baseToPairs;\n","var Symbol = require('./_Symbol'),\n    arrayMap = require('./_arrayMap'),\n    isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isArray(value)) {\n    // Recursively convert values (susceptible to call stack limits).\n    return arrayMap(value, baseToString) + '';\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n","var arrayMap = require('./_arrayMap');\n\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n  return arrayMap(props, function(key) {\n    return object[key];\n  });\n}\n\nmodule.exports = baseValues;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var isArray = require('./isArray'),\n    isKey = require('./_isKey'),\n    stringToPath = require('./_stringToPath'),\n    toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n  if (isArray(value)) {\n    return value;\n  }\n  return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n  new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n  return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n    allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of  `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n  if (isDeep) {\n    return buffer.slice();\n  }\n  var length = buffer.length,\n      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n  buffer.copy(result);\n  return result;\n}\n\nmodule.exports = cloneBuffer;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n","var isSymbol = require('./isSymbol');\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n  if (value !== other) {\n    var valIsDefined = value !== undefined,\n        valIsNull = value === null,\n        valIsReflexive = value === value,\n        valIsSymbol = isSymbol(value);\n\n    var othIsDefined = other !== undefined,\n        othIsNull = other === null,\n        othIsReflexive = other === other,\n        othIsSymbol = isSymbol(other);\n\n    if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n        (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n        (valIsNull && othIsDefined && othIsReflexive) ||\n        (!valIsDefined && othIsReflexive) ||\n        !valIsReflexive) {\n      return 1;\n    }\n    if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n        (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n        (othIsNull && valIsDefined && valIsReflexive) ||\n        (!othIsDefined && valIsReflexive) ||\n        !othIsReflexive) {\n      return -1;\n    }\n  }\n  return 0;\n}\n\nmodule.exports = compareAscending;\n","var compareAscending = require('./_compareAscending');\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n  var index = -1,\n      objCriteria = object.criteria,\n      othCriteria = other.criteria,\n      length = objCriteria.length,\n      ordersLength = orders.length;\n\n  while (++index < length) {\n    var result = compareAscending(objCriteria[index], othCriteria[index]);\n    if (result) {\n      if (index >= ordersLength) {\n        return result;\n      }\n      var order = orders[index];\n      return result * (order == 'desc' ? -1 : 1);\n    }\n  }\n  // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n  // that causes it, under certain circumstances, to provide the same value for\n  // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n  // for more details.\n  //\n  // This also ensures a stable sort in V8 and other engines.\n  // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n  return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nmodule.exports = copyArray;\n","var assignValue = require('./_assignValue'),\n    baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n  var isNew = !object;\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n\n    var newValue = customizer\n      ? customizer(object[key], source[key], key, object, source)\n      : undefined;\n\n    if (newValue === undefined) {\n      newValue = source[key];\n    }\n    if (isNew) {\n      baseAssignValue(object, key, newValue);\n    } else {\n      assignValue(object, key, newValue);\n    }\n  }\n  return object;\n}\n\nmodule.exports = copyObject;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","var arrayAggregator = require('./_arrayAggregator'),\n    baseAggregator = require('./_baseAggregator'),\n    baseIteratee = require('./_baseIteratee'),\n    isArray = require('./isArray');\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n  return function(collection, iteratee) {\n    var func = isArray(collection) ? arrayAggregator : baseAggregator,\n        accumulator = initializer ? initializer() : {};\n\n    return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n  };\n}\n\nmodule.exports = createAggregator;\n","var baseRest = require('./_baseRest'),\n    isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n  return baseRest(function(object, sources) {\n    var index = -1,\n        length = sources.length,\n        customizer = length > 1 ? sources[length - 1] : undefined,\n        guard = length > 2 ? sources[2] : undefined;\n\n    customizer = (assigner.length > 3 && typeof customizer == 'function')\n      ? (length--, customizer)\n      : undefined;\n\n    if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n      customizer = length < 3 ? undefined : customizer;\n      length = 1;\n    }\n    object = Object(object);\n    while (++index < length) {\n      var source = sources[index];\n      if (source) {\n        assigner(object, source, index, customizer);\n      }\n    }\n    return object;\n  });\n}\n\nmodule.exports = createAssigner;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n  return function(collection, iteratee) {\n    if (collection == null) {\n      return collection;\n    }\n    if (!isArrayLike(collection)) {\n      return eachFunc(collection, iteratee);\n    }\n    var length = collection.length,\n        index = fromRight ? length : -1,\n        iterable = Object(collection);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (iteratee(iterable[index], index, iterable) === false) {\n        break;\n      }\n    }\n    return collection;\n  };\n}\n\nmodule.exports = createBaseEach;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length;\n\n    while (length--) {\n      var key = props[fromRight ? length : ++index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n","var baseToPairs = require('./_baseToPairs'),\n    getTag = require('./_getTag'),\n    mapToArray = require('./_mapToArray'),\n    setToPairs = require('./_setToPairs');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    setTag = '[object Set]';\n\n/**\n * Creates a `_.toPairs` or `_.toPairsIn` function.\n *\n * @private\n * @param {Function} keysFunc The function to get the keys of a given object.\n * @returns {Function} Returns the new pairs function.\n */\nfunction createToPairs(keysFunc) {\n  return function(object) {\n    var tag = getTag(object);\n    if (tag == mapTag) {\n      return mapToArray(object);\n    }\n    if (tag == setTag) {\n      return setToPairs(object);\n    }\n    return baseToPairs(object, keysFunc(object));\n  };\n}\n\nmodule.exports = createToPairs;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var SetCache = require('./_SetCache'),\n    arraySome = require('./_arraySome'),\n    cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  var stacked = stack.get(array);\n  if (stacked && stack.get(other)) {\n    return stacked == other;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, bitmask, customizer, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalArrays;\n","var Symbol = require('./_Symbol'),\n    Uint8Array = require('./_Uint8Array'),\n    eq = require('./eq'),\n    equalArrays = require('./_equalArrays'),\n    mapToArray = require('./_mapToArray'),\n    setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= COMPARE_UNORDERED_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\nmodule.exports = equalByTag;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      objProps = getAllKeys(object),\n      objLength = objProps.length,\n      othProps = getAllKeys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Assume cyclic values are equal.\n  var stacked = stack.get(object);\n  if (stacked && stack.get(other)) {\n    return stacked == other;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalObjects;\n","var flatten = require('./flatten'),\n    overRest = require('./_overRest'),\n    setToString = require('./_setToString');\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n  return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n    getSymbols = require('./_getSymbols'),\n    keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n","var isStrictComparable = require('./_isStrictComparable'),\n    keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n  var result = keys(object),\n      length = result.length;\n\n  while (length--) {\n    var key = result[length],\n        value = object[key];\n\n    result[length] = [key, value, isStrictComparable(value)];\n  }\n  return result;\n}\n\nmodule.exports = getMatchData;\n","var baseIsNative = require('./_baseIsNative'),\n    getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n","var arrayFilter = require('./_arrayFilter'),\n    stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\nmodule.exports = getSymbols;\n","var DataView = require('./_DataView'),\n    Map = require('./_Map'),\n    Promise = require('./_Promise'),\n    Set = require('./_Set'),\n    WeakMap = require('./_WeakMap'),\n    baseGetTag = require('./_baseGetTag'),\n    toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nmodule.exports = getTag;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var castPath = require('./_castPath'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isIndex = require('./_isIndex'),\n    isLength = require('./isLength'),\n    toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      result = false;\n\n  while (++index < length) {\n    var key = toKey(path[index]);\n    if (!(result = object != null && hasFunc(object, key))) {\n      break;\n    }\n    object = object[key];\n  }\n  if (result || ++index != length) {\n    return result;\n  }\n  length = object == null ? 0 : object.length;\n  return !!length && isLength(length) && isIndex(key, length) &&\n    (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n","var baseCreate = require('./_baseCreate'),\n    getPrototype = require('./_getPrototype'),\n    isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n  return (typeof object.constructor == 'function' && !isPrototype(object))\n    ? baseCreate(getPrototype(object))\n    : {};\n}\n\nmodule.exports = initCloneObject;\n","var Symbol = require('./_Symbol'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n  return isArray(value) || isArguments(value) ||\n    !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var eq = require('./eq'),\n    isArrayLike = require('./isArrayLike'),\n    isIndex = require('./_isIndex'),\n    isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n *  else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n  if (!isObject(object)) {\n    return false;\n  }\n  var type = typeof index;\n  if (type == 'number'\n        ? (isArrayLike(object) && isIndex(index, object.length))\n        : (type == 'string' && index in object)\n      ) {\n    return eq(object[index], value);\n  }\n  return false;\n}\n\nmodule.exports = isIterateeCall;\n","var isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  if (isArray(value)) {\n    return false;\n  }\n  var type = typeof value;\n  if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n      value == null || isSymbol(value)) {\n    return true;\n  }\n  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n    (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n *  equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n  return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n","var Hash = require('./_Hash'),\n    ListCache = require('./_ListCache'),\n    Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n  return function(object) {\n    if (object == null) {\n      return false;\n    }\n    return object[key] === srcValue &&\n      (srcValue !== undefined || (key in Object(object)));\n  };\n}\n\nmodule.exports = matchesStrictComparable;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n  var result = memoize(func, function(key) {\n    if (cache.size === MAX_MEMOIZE_SIZE) {\n      cache.clear();\n    }\n    return key;\n  });\n\n  var cache = result.cache;\n  return result;\n}\n\nmodule.exports = memoizeCapped;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n  var result = [];\n  if (object != null) {\n    for (var key in Object(object)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = transform(array);\n    return apply(func, this, otherArgs);\n  };\n}\n\nmodule.exports = overRest;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n  return key == '__proto__'\n    ? undefined\n    : object[key];\n}\n\nmodule.exports = safeGet;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n","/**\n * Converts `set` to its value-value pairs.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the value-value pairs.\n */\nfunction setToPairs(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = [value, value];\n  });\n  return result;\n}\n\nmodule.exports = setToPairs;\n","var baseSetToString = require('./_baseSetToString'),\n    shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n    HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n  var count = 0,\n      lastCalled = 0;\n\n  return function() {\n    var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return arguments[0];\n      }\n    } else {\n      count = 0;\n    }\n    return func.apply(undefined, arguments);\n  };\n}\n\nmodule.exports = shortOut;\n","var baseRandom = require('./_baseRandom');\n\n/**\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @param {number} [size=array.length] The size of `array`.\n * @returns {Array} Returns `array`.\n */\nfunction shuffleSelf(array, size) {\n  var index = -1,\n      length = array.length,\n      lastIndex = length - 1;\n\n  size = size === undefined ? length : size;\n  while (++index < size) {\n    var rand = baseRandom(index, lastIndex),\n        value = array[rand];\n\n    array[rand] = array[index];\n    array[index] = value;\n  }\n  array.length = size;\n  return array;\n}\n\nmodule.exports = shuffleSelf;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n    Map = require('./_Map'),\n    MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nmodule.exports = stackSet;\n","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = strictIndexOf;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n  var result = [];\n  if (string.charCodeAt(0) === 46 /* . */) {\n    result.push('');\n  }\n  string.replace(rePropName, function(match, number, quote, subString) {\n    result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n});\n\nmodule.exports = stringToPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nmodule.exports = constant;\n","var baseDifference = require('./_baseDifference'),\n    baseFlatten = require('./_baseFlatten'),\n    baseIteratee = require('./_baseIteratee'),\n    baseRest = require('./_baseRest'),\n    isArrayLikeObject = require('./isArrayLikeObject'),\n    last = require('./last');\n\n/**\n * This method is like `_.difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\nvar differenceBy = baseRest(function(array, values) {\n  var iteratee = last(values);\n  if (isArrayLikeObject(iteratee)) {\n    iteratee = undefined;\n  }\n  return isArrayLikeObject(array)\n    ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2))\n    : [];\n});\n\nmodule.exports = differenceBy;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var baseFlatten = require('./_baseFlatten');\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n  var result = object == null ? undefined : baseGet(object, path);\n  return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var baseAssignValue = require('./_baseAssignValue'),\n    createAggregator = require('./_createAggregator');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\nvar groupBy = createAggregator(function(result, value, key) {\n  if (hasOwnProperty.call(result, key)) {\n    result[key].push(value);\n  } else {\n    baseAssignValue(result, key, [value]);\n  }\n});\n\nmodule.exports = groupBy;\n","var baseHas = require('./_baseHas'),\n    hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n  return object != null && hasPath(object, path, baseHas);\n}\n\nmodule.exports = has;\n","var baseHasIn = require('./_baseHasIn'),\n    hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n  return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n","var baseIsArguments = require('./_baseIsArguments'),\n    isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var isFunction = require('./isFunction'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var isArrayLike = require('./isArrayLike'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]';\n\n/**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\nfunction isBoolean(value) {\n  return value === true || value === false ||\n    (isObjectLike(value) && baseGetTag(value) == boolTag);\n}\n\nmodule.exports = isBoolean;\n","var root = require('./_root'),\n    stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","var baseKeys = require('./_baseKeys'),\n    getTag = require('./_getTag'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isArrayLike = require('./isArrayLike'),\n    isBuffer = require('./isBuffer'),\n    isPrototype = require('./_isPrototype'),\n    isTypedArray = require('./isTypedArray');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n  if (value == null) {\n    return true;\n  }\n  if (isArrayLike(value) &&\n      (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n        isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n    return !value.length;\n  }\n  var tag = getTag(value);\n  if (tag == mapTag || tag == setTag) {\n    return !value.size;\n  }\n  if (isPrototype(value)) {\n    return !baseKeys(value).length;\n  }\n  for (var key in value) {\n    if (hasOwnProperty.call(value, key)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nmodule.exports = isEmpty;\n","var baseIsEqual = require('./_baseIsEqual');\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n  return baseIsEqual(value, other);\n}\n\nmodule.exports = isEqual;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike'),\n    isPlainObject = require('./isPlainObject');\n\n/** `Object#toString` result references. */\nvar domExcTag = '[object DOMException]',\n    errorTag = '[object Error]';\n\n/**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\nfunction isError(value) {\n  if (!isObjectLike(value)) {\n    return false;\n  }\n  var tag = baseGetTag(value);\n  return tag == errorTag || tag == domExcTag ||\n    (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n}\n\nmodule.exports = isError;\n","var baseGetTag = require('./_baseGetTag'),\n    isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","/**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\nfunction isNil(value) {\n  return value == null;\n}\n\nmodule.exports = isNil;\n","/**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */\nfunction isNull(value) {\n  return value === null;\n}\n\nmodule.exports = isNull;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar numberTag = '[object Number]';\n\n/**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\nfunction isNumber(value) {\n  return typeof value == 'number' ||\n    (isObjectLike(value) && baseGetTag(value) == numberTag);\n}\n\nmodule.exports = isNumber;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n    getPrototype = require('./_getPrototype'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n    return false;\n  }\n  var proto = getPrototype(value);\n  if (proto === null) {\n    return true;\n  }\n  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n  return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n    funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n","var baseGetTag = require('./_baseGetTag'),\n    isArray = require('./isArray'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n  return typeof value == 'string' ||\n    (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\nfunction isUndefined(value) {\n  return value === undefined;\n}\n\nmodule.exports = isUndefined;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeys = require('./_baseKeys'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeysIn = require('./_baseKeysIn'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var baseMerge = require('./_baseMerge'),\n    createAssigner = require('./_createAssigner');\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n *   'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n *   'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n  baseMerge(object, source, srcIndex);\n});\n\nmodule.exports = merge;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n","var basePick = require('./_basePick'),\n    flatRest = require('./_flatRest');\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\nvar pick = flatRest(function(object, paths) {\n  return object == null ? {} : basePick(object, paths);\n});\n\nmodule.exports = pick;\n","var baseProperty = require('./_baseProperty'),\n    basePropertyDeep = require('./_basePropertyDeep'),\n    isKey = require('./_isKey'),\n    toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n *   { 'a': { 'b': 2 } },\n *   { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n  return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","var arrayShuffle = require('./_arrayShuffle'),\n    baseShuffle = require('./_baseShuffle'),\n    isArray = require('./isArray');\n\n/**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */\nfunction shuffle(collection) {\n  var func = isArray(collection) ? arrayShuffle : baseShuffle;\n  return func(collection);\n}\n\nmodule.exports = shuffle;\n","var baseFlatten = require('./_baseFlatten'),\n    baseOrderBy = require('./_baseOrderBy'),\n    baseRest = require('./_baseRest'),\n    isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n *  The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n *   { 'user': 'fred',   'age': 48 },\n *   { 'user': 'barney', 'age': 36 },\n *   { 'user': 'fred',   'age': 40 },\n *   { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n  if (collection == null) {\n    return [];\n  }\n  var length = iteratees.length;\n  if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n    iteratees = [];\n  } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n    iteratees = [iteratees[0]];\n  }\n  return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\nmodule.exports = stubArray;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = stubFalse;\n","var createToPairs = require('./_createToPairs'),\n    keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable string keyed-value pairs\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n * or set, its entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entriesIn\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairsIn(new Foo);\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n */\nvar toPairsIn = createToPairs(keysIn);\n\nmodule.exports = toPairsIn;\n","var copyObject = require('./_copyObject'),\n    keysIn = require('./keysIn');\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n  return copyObject(value, keysIn(value));\n}\n\nmodule.exports = toPlainObject;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var baseValues = require('./_baseValues'),\n    keys = require('./keys');\n\n/**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\nfunction values(object) {\n  return object == null ? [] : baseValues(object, keys(object));\n}\n\nmodule.exports = values;\n","module.exports = MediumType\n\n/**\n * [RFC 2045][rfc2045] media type class.\n *\n * Implements parsing based on [RFC 2045][rfc2045] with added support for\n * suffixes ([RFC 3023][rfc3023], [RFC 6839][rfc6839]).\n *\n * Pass it a string or an object with necessary fields.  \n * Media types with invalid syntax will result in a `SyntaxError` being thrown.\n *\n * [rfc2045]: https://tools.ietf.org/html/rfc2045\n * [rfc3023]: https://tools.ietf.org/html/rfc3023\n * [rfc6839]: https://tools.ietf.org/html/rfc6839\n *\n * @example\n * new MediumType(\"application/vnd.app.model+json; charset=utf-8\")\n *\n * new MediumType({\n *   type: \"application\",\n *   subtype: \"vnd.app.model\",\n *   suffix: \"json\",\n *   parameters: {charset: \"utf-8\"}\n * })\n *\n * @class MediumType\n * @constructor\n * @param {String, Object, MediumType} mediaType\n */\nfunction MediumType(type) {\n  if (!(this instanceof MediumType)) return new MediumType(type)\n  this.parameters = {}\n\n  if (type instanceof MediumType) {\n    this.type = type.type\n    this.subtype = type.subtype\n    this.suffix = type.suffix\n    this.parameters = assign(this.parameters, type.parameters)\n  }\n  else if (typeof type == \"string\") {\n    var match = MEDIA_TYPE.exec(type)\n    if (!match) throw SyntaxError(\"Invalid Media Type: \" + type)\n\n    this.type = match[1].toLowerCase()\n    this.subtype = match[2].toLowerCase()\n\n    // Suffix is an implicit part of the subtype:\n    // http://tools.ietf.org/html/rfc3023\n    // http://tools.ietf.org/html/rfc6839\n    var suffix = this.subtype.indexOf(\"+\")\n    if (suffix != -1) this.suffix = this.subtype.slice(suffix + 1)\n    if (this.suffix.length) this.subtype = this.subtype.slice(0, suffix)\n\n    var param\n    PARAMETERS.lastIndex = match[1].length + 1 + match[2].length\n    while (param = matchAt(type, PARAMETERS, PARAMETERS.lastIndex)) {\n      this.parameters[param[1].toLowerCase()] = unquote(param[2])\n    }\n  }\n  else if (type && typeof type == \"object\") assign(this, type)\n  else if (type === undefined);\n  else throw new SyntaxError(\"Invalid Media Type: \" + type)\n}\n\n/**\n * Type of the media type.  \n * Always in lower case.\n *\n * @example\n * new MediumType(\"application/json\").type // \"application\"\n *\n * @property {String} type\n */\nMediumType.prototype.type = \"\"\n\n/**\n * Subtype of the media type.  \n * Always in lower case.\n *\n * @example\n * new MediumType(\"application/json\").subtype // \"json\"\n *\n * @property {String} subtype\n */\nMediumType.prototype.subtype = \"\"\n\n/**\n * Suffix of the media type.  \n * Always in lower case.\n *\n * @example\n * new MediumType(\"application/vnd.app.model+xml\").suffix // \"xml\"\n *\n * @property {String} suffix\n */\nMediumType.prototype.suffix = \"\"\n\n/**\n * Parameters of the media type.  \n * Keys are always in lower case. Values are left as-is.\n *\n * @example\n * new MediumType(\"text/html; q=0.3; charset=utf-8\").parameters\n * // {q: \"0.3\", charset: \"utf-8\"}\n *\n * @property {Object} parameters\n */\n\n/**\n * Full media type name without parameters (read-only).  \n * Contains the type, subtype and optional suffix.\n *\n * @example\n * new MediumType(\"application/rdf+xml\").name // application/rdf+xml\n * new MediumType(\"text/html; q=0.3\").name // text/html\n *\n * @property {String} name\n */\nObject.defineProperty(MediumType.prototype, \"name\", {\n  get: function() { return nameify(this) },\n  configurable: true, enumerable: true\n})\n\n/**\n * Numeric quality value of the media type taken from the `q` parameter.  \n * If missing, will default to `1`.\n *\n * @example\n * new MediumType(\"text/html; q=0.3\").q // 0.3\n * new MediumType(\"text/html\").q // 1\n *\n * @property {Number} q\n */\nObject.defineProperty(MediumType.prototype, \"q\", {\n  get: function() { var q = this.parameters.q; return q == null? 1: Number(q) },\n  set: function(value) { this.parameters.q = value },\n  configurable: true, enumerable: true\n})\n\n/**\n * Stringify a `MediumType` to canonical form.\n *\n * @example\n * new MediumType({type: \"text\", subtype: \"html\"}).toString() // \"text/html\"\n * new MediumType(\"text/html;q=0.3\").toString() // \"text/html; q=0.3\"\n *\n * @method toString\n */\nMediumType.prototype.toString = function() {\n  var type = nameify(this)\n\n  for (var name in this.parameters) {\n    var value = this.parameters[name]\n    if (value !== undefined) type += \"; \" + name + \"=\" + quote(value)\n  }\n\n  return type\n}\n\n/**\n * Stringifies the media type to a canonical string when passing it to\n * `JSON.stringify`.  \n * This way you don't need to manually call `toString` when stringifying.\n *\n * @example\n * JSON.stringify(new MediumType(\"text/html\")) // \"\\\"text/html\\\"\"\n *\n * @method toJSON\n * @alias toString\n */\nMediumType.prototype.toJSON = MediumType.prototype.toString\nMediumType.prototype.inspect = MediumType.prototype.toString\n\n/**\n * Matches a given media type pattern to the current media type.  \n * Supports wildcards (`*`) for type and subtype.  \n *\n * Only those parameters are checked that are in the given type. This allows\n * for matching `application/json; charset=utf-8` by passing in\n * `application/json`. `application/json; charset=utf-16` however would not\n * match. The `q` parameter is ignored entirely for easier use when matching\n * against HTTP's `Accept` header types.\n *\n * @example\n * new MediumType(\"application/json\").match(new MediumType(\"application/json\")) // true\n * new MediumType(\"application/json\").match(\"application/*\") // true\n * new MediumType(\"text/html+zip\").match(\"text/*+zip\") // true\n * new MediumType(\"text/html; charset=utf-8\").match(\"text/html; charset=utf-8\") // true\n * new MediumType(\"text/html\").match(\"text/html; q=0.3\") // true\n *\n * @method match\n * @param {string, MediumType} type\n */\nMediumType.prototype.match = function(t) {\n  if (!(t instanceof MediumType)) t = new MediumType(t)\n\n  var eql = true\n  eql = eql && (t.type == \"*\" || this.type == t.type)\n  eql = eql && (t.subtype == \"*\" || this.subtype == t.subtype)\n  eql = eql && (t.subtype == \"*\" && t.suffix == \"\" || this.suffix == t.suffix)\n  eql = eql && contains(this.parameters, t.parameters)\n  return eql\n}\n\n/**\n * Parse a media type string to a `MediumType`.  \n * Media types with invalid syntax will result in a `SyntaxError` being thrown.\n *\n * @example\n * MediumType.parse(\"application/json\")\n * MediumType.parse(\"text/html+zip\")\n * MediumType.parse(\"text/html; charset=utf-8\")\n *\n * @static\n * @method parse\n * @param {string} type\n */\nMediumType.parse = MediumType\n\n/**\n * Stringify a `MediumType` to canonical form.\n *\n * @example\n * MediumType.stringify(new MediumType(\"text/html\")) // \"text/html\"\n * MediumType.stringify({type: \"text\", subtype: \"html\"}) // \"text/html\"\n * MediumType.stringify(\"text/html;q=0.3\") // \"text/html; q=0.3\"\n *\n * @static\n * @method stringify\n * @alias toString\n * @param {Object, MediumType} type\n */\nMediumType.stringify = function(type) {\n  if (type instanceof MediumType) return type.toString()\n  return new MediumType(type).toString()\n}\n\n/**\n * Split a comma separated string to an array of media type strings.  \n * Handles quoted parameters with embedded spaces, commas etc.\n *\n * If you need `MediaType` instances back, map over the array with\n * `MediumType`:\n * ```javascript\n * MediumType.split(types).map(MediaType)\n * ```\n *\n * @example\n * MediumType.split(\"text/html; levels=\\\"1, 2, 3\\\", text/plain\")\n * // [\n * //   \"text/html; levels=\\\"1, 2, 3\\\",\n * //   \"text/plain\"\n * // ]\n *\n * @static\n * @method split\n * @param {string} types\n */\nMediumType.split = function(string) {\n  var types = [], m\n  COMMAS.lastIndex = 0\n\n  do types.push((m = matchAt(string, MEDIA_TYPES, COMMAS.lastIndex))? m[0] : \"\")\n  while (matchAt(string, COMMAS, MEDIA_TYPES.lastIndex))\n\n  if (MEDIA_TYPES.lastIndex != string.length) {\n    types[types.length - 1] += string.slice(MEDIA_TYPES.lastIndex)\n  }\n\n  return types\n}\n\n/**\n * Sort an array of `MediumType`s according to sorting rules of the HTTP\n * `Accept` header listed in [RFC 2616][rfc2616] and [RFC 7231][rfc7231].\n * That is, first by the `q` parameter, then by type and subtype specificity\n * and then by parameter count (excluding the `q` parameter).\n *\n * Returns a new array and does not modify the given array.\n *\n * If you want to sort the comma separated HTTP `Accept` header, split it first\n * with [`MediumType.split`](#MediumType.split).\n *\n * [rfc2616]: https://tools.ietf.org/html/rfc2616\n * [rfc7231]: https://tools.ietf.org/html/rfc7231\n *\n * @example\n * MediumType.sort([\n *   new MediumType(\"text/html; level=3; q=0.7\"),\n *   new MediumType(\"text/html; q=0.7\"),\n *   new MediumType(\"text/plain; q=0.5\"),\n *   new MediumType(\"text/*; q=0.1\")\n * ])\n *\n * @static\n * @method sort\n * @param {Array} types\n */\nMediumType.sort = function(types) {\n  return types.slice().sort(MediumType.comparator)\n}\n\nMediumType.comparator = function(a, b) {\n  return sortByQuality(a, b) || sortByType(a, b) || sortByParameters(a, b)\n}\n\n// https://tools.ietf.org/html/rfc2045#section-5.1\n//\n// Using the permissive RFC 2045 5.1 for parsing as opposed to RFC 6838 that\n// states the requirements for _registering_ media types.\nvar TOKEN = \"[-a-zA-Z0-9!#$%^&*_+{}\\\\|'.`~]+\"\nvar QUOTED = \"\\\"[^\\\\\\\\\\\"\\x00-\\x1f\\x7f]*(\\\\\\\\.[^\\\\\\\\\\\"\\x00-\\x1f\\x7f]*)*\\\"\"\nvar TYPE = \"(\" + TOKEN + \")\"\nvar COMMAS = /\\s*,\\s*/g\n\n// https://tools.ietf.org/html/rfc2045#section-5.1\nvar PARAMETER = \"(?:\\\\s*;\\\\s*(\" + TOKEN + \")=(\" + TOKEN + \"|\" + QUOTED + \"))\"\nvar PARAMETERS = new RegExp(PARAMETER, \"g\")\n\nvar MEDIA_TYPE = new RegExp(\"^\" + TYPE + \"/\" + TYPE + PARAMETER + \"*$\")\nvar MEDIA_TYPES = new RegExp(TYPE + \"/\" + TYPE + PARAMETER + \"*\", \"g\")\n\nvar ALL_TOKEN = new RegExp(\"^\" + TOKEN + \"$\")\nvar ESCAPE = /([\\\\\"])/g\nvar UNESCAPE = /\\\\(.)/g\n\nfunction assign(a, b) {\n  for (var key in b) a[key] = b[key]\n  return a\n}\n\nfunction nameify(type) {\n  var name = type.type + \"/\" + type.subtype\n  if (type.suffix) name += \"+\" + type.suffix\n  return name\n}\n\nfunction quote(value) {\n  if (value == null) return '\"\"'\n  if (ALL_TOKEN.test(value)) return value\n  return '\"' + value.replace(ESCAPE, \"\\\\$1\") + '\"'\n}\n\nfunction unquote(value) {\n  if (value[0] == '\"') return value.slice(1, -1).replace(UNESCAPE, \"$1\")\n  return value\n}\n\nfunction matchAt(string, regexp, pos) {\n  regexp.lastIndex = pos\n  var match = regexp.exec(string)\n  if (match == null || match.index != pos) return regexp.lastIndex = pos, null\n  return match\n}\n\nfunction contains(a, b) {\n  for (var key in b) if (key != \"q\" && a[key] != b[key]) return false\n  return true\n}\n\nfunction sortByQuality(a, b) {\n  return b.q - a.q\n}\n\nfunction sortByType(a, b) {\n  // RFC 7231 does not speak of suffix ordering. Better ignore that for now.\n  if (a.type == b.type && a.subtype == b.subtype) return 0\n  if (a.type == \"*\" && a.subtype == \"*\") return 1\n  if (b.type == \"*\" && b.subtype == \"*\") return -1\n  if (a.subtype == \"*\" && b.subtype == \"*\") return 0\n  if (a.subtype == \"*\") return 1\n  if (b.subtype == \"*\") return -1\n  return 0\n}\n\nfunction sortByParameters(a, b) {\n  return countParameters(b.parameters) - countParameters(a.parameters)\n}\n\nfunction countParameters(obj) {\n  var i = 0\n  for (var key in obj) if (key != \"q\") ++i\n  return i\n}\n","// This alphabet uses `A-Za-z0-9_-` symbols. The genetic algorithm helped\n// optimize the gzip compression for this alphabet.\nlet urlAlphabet =\n  'ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW'\n\nlet customAlphabet = (alphabet, size) => {\n  return () => {\n    let id = ''\n    // A compact alternative for `for (var i = 0; i < step; i++)`.\n    let i = size\n    while (i--) {\n      // `| 0` is more compact and faster than `Math.floor()`.\n      id += alphabet[Math.random() * alphabet.length | 0]\n    }\n    return id\n  }\n}\n\nlet nanoid = (size = 21) => {\n  let id = ''\n  // A compact alternative for `for (var i = 0; i < step; i++)`.\n  let i = size\n  while (i--) {\n    // `| 0` is more compact and faster than `Math.floor()`.\n    id += urlAlphabet[Math.random() * 64 | 0]\n  }\n  return id\n}\n\nexport { nanoid, customAlphabet }\n","!function(e){if(\"object\"==typeof exports)module.exports=e();else if(\"function\"==typeof define&&define.amd)define(e);else{var t;\"undefined\"!=typeof window?t=window:\"undefined\"!=typeof global?t=global:\"undefined\"!=typeof self&&(t=self),t.objectHash=e()}}(function(){return function e(t,n,r){function o(u,a){if(!n[u]){if(!t[u]){var f=\"function\"==typeof require&&require;if(!a&&f)return f(u,!0);if(i)return i(u,!0);throw new Error(\"Cannot find module '\"+u+\"'\")}var s=n[u]={exports:{}};t[u][0].call(s.exports,function(e){var n=t[u][1][e];return o(n?n:e)},s,s.exports,e,t,n,r)}return n[u].exports}for(var i=\"function\"==typeof require&&require,u=0;u<r.length;u++)o(r[u]);return o}({1:[function(e,t,n){(function(r,o,i,u,a,f,s,c,l){\"use strict\";function d(e,t){return t=h(e,t),y(e,t)}function h(e,t){if(t=t||{},t.algorithm=t.algorithm||\"sha1\",t.encoding=t.encoding||\"hex\",t.excludeValues=!!t.excludeValues,t.algorithm=t.algorithm.toLowerCase(),t.encoding=t.encoding.toLowerCase(),t.ignoreUnknown=t.ignoreUnknown===!0,t.respectType=t.respectType!==!1,t.respectFunctionNames=t.respectFunctionNames!==!1,t.respectFunctionProperties=t.respectFunctionProperties!==!1,t.unorderedArrays=t.unorderedArrays===!0,t.unorderedSets=t.unorderedSets!==!1,t.unorderedObjects=t.unorderedObjects!==!1,t.replacer=t.replacer||void 0,t.excludeKeys=t.excludeKeys||void 0,\"undefined\"==typeof e)throw new Error(\"Object argument required.\");for(var n=0;n<v.length;++n)v[n].toLowerCase()===t.algorithm.toLowerCase()&&(t.algorithm=v[n]);if(v.indexOf(t.algorithm)===-1)throw new Error('Algorithm \"'+t.algorithm+'\"  not supported. supported values: '+v.join(\", \"));if(m.indexOf(t.encoding)===-1&&\"passthrough\"!==t.algorithm)throw new Error('Encoding \"'+t.encoding+'\"  not supported. supported values: '+m.join(\", \"));return t}function p(e){if(\"function\"!=typeof e)return!1;var t=/^function\\s+\\w*\\s*\\(\\s*\\)\\s*{\\s+\\[native code\\]\\s+}$/i;return null!=t.exec(Function.prototype.toString.call(e))}function y(e,t){var n;n=\"passthrough\"!==t.algorithm?b.createHash(t.algorithm):new w,\"undefined\"==typeof n.write&&(n.write=n.update,n.end=n.update);var r=g(t,n);if(r.dispatch(e),n.update||n.end(\"\"),n.digest)return n.digest(\"buffer\"===t.encoding?void 0:t.encoding);var o=n.read();return\"buffer\"===t.encoding?o:o.toString(t.encoding)}function g(e,t,n){n=n||[];var r=function(e){return t.update?t.update(e,\"utf8\"):t.write(e,\"utf8\")};return{dispatch:function(t){e.replacer&&(t=e.replacer(t));var n=typeof t;return null===t&&(n=\"null\"),this[\"_\"+n](t)},_object:function(t){var o=/\\[object (.*)\\]/i,u=Object.prototype.toString.call(t),a=o.exec(u);a=a?a[1]:\"unknown:[\"+u+\"]\",a=a.toLowerCase();var f=null;if((f=n.indexOf(t))>=0)return this.dispatch(\"[CIRCULAR:\"+f+\"]\");if(n.push(t),\"undefined\"!=typeof i&&i.isBuffer&&i.isBuffer(t))return r(\"buffer:\"),r(t);if(\"object\"===a||\"function\"===a){var s=Object.keys(t);e.unorderedObjects&&(s=s.sort()),e.respectType===!1||p(t)||s.splice(0,0,\"prototype\",\"__proto__\",\"constructor\"),e.excludeKeys&&(s=s.filter(function(t){return!e.excludeKeys(t)})),r(\"object:\"+s.length+\":\");var c=this;return s.forEach(function(n){c.dispatch(n),r(\":\"),e.excludeValues||c.dispatch(t[n]),r(\",\")})}if(!this[\"_\"+a]){if(e.ignoreUnknown)return r(\"[\"+a+\"]\");throw new Error('Unknown object type \"'+a+'\"')}this[\"_\"+a](t)},_array:function(t,o){o=\"undefined\"!=typeof o?o:e.unorderedArrays!==!1;var i=this;if(r(\"array:\"+t.length+\":\"),!o||t.length<=1)return t.forEach(function(e){return i.dispatch(e)});var u=[],a=t.map(function(t){var r=new w,o=n.slice(),i=g(e,r,o);return i.dispatch(t),u=u.concat(o.slice(n.length)),r.read().toString()});return n=n.concat(u),a.sort(),this._array(a,!1)},_date:function(e){return r(\"date:\"+e.toJSON())},_symbol:function(e){return r(\"symbol:\"+e.toString())},_error:function(e){return r(\"error:\"+e.toString())},_boolean:function(e){return r(\"bool:\"+e.toString())},_string:function(e){r(\"string:\"+e.length+\":\"),r(e)},_function:function(t){r(\"fn:\"),p(t)?this.dispatch(\"[native]\"):this.dispatch(t.toString()),e.respectFunctionNames!==!1&&this.dispatch(\"function-name:\"+String(t.name)),e.respectFunctionProperties&&this._object(t)},_number:function(e){return r(\"number:\"+e.toString())},_xml:function(e){return r(\"xml:\"+e.toString())},_null:function(){return r(\"Null\")},_undefined:function(){return r(\"Undefined\")},_regexp:function(e){return r(\"regex:\"+e.toString())},_uint8array:function(e){return r(\"uint8array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint8clampedarray:function(e){return r(\"uint8clampedarray:\"),this.dispatch(Array.prototype.slice.call(e))},_int8array:function(e){return r(\"uint8array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint16array:function(e){return r(\"uint16array:\"),this.dispatch(Array.prototype.slice.call(e))},_int16array:function(e){return r(\"uint16array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint32array:function(e){return r(\"uint32array:\"),this.dispatch(Array.prototype.slice.call(e))},_int32array:function(e){return r(\"uint32array:\"),this.dispatch(Array.prototype.slice.call(e))},_float32array:function(e){return r(\"float32array:\"),this.dispatch(Array.prototype.slice.call(e))},_float64array:function(e){return r(\"float64array:\"),this.dispatch(Array.prototype.slice.call(e))},_arraybuffer:function(e){return r(\"arraybuffer:\"),this.dispatch(new Uint8Array(e))},_url:function(e){return r(\"url:\"+e.toString(),\"utf8\")},_map:function(t){r(\"map:\");var n=Array.from(t);return this._array(n,e.unorderedSets!==!1)},_set:function(t){r(\"set:\");var n=Array.from(t);return this._array(n,e.unorderedSets!==!1)},_blob:function(){if(e.ignoreUnknown)return r(\"[blob]\");throw Error('Hashing Blob objects is currently not supported\\n(see https://github.com/puleos/object-hash/issues/26)\\nUse \"options.replacer\" or \"options.ignoreUnknown\"\\n')},_domwindow:function(){return r(\"domwindow\")},_process:function(){return r(\"process\")},_timer:function(){return r(\"timer\")},_pipe:function(){return r(\"pipe\")},_tcp:function(){return r(\"tcp\")},_udp:function(){return r(\"udp\")},_tty:function(){return r(\"tty\")},_statwatcher:function(){return r(\"statwatcher\")},_securecontext:function(){return r(\"securecontext\")},_connection:function(){return r(\"connection\")},_zlib:function(){return r(\"zlib\")},_context:function(){return r(\"context\")},_nodescript:function(){return r(\"nodescript\")},_httpparser:function(){return r(\"httpparser\")},_dataview:function(){return r(\"dataview\")},_signal:function(){return r(\"signal\")},_fsevent:function(){return r(\"fsevent\")},_tlswrap:function(){return r(\"tlswrap\")}}}function w(){return{buf:\"\",write:function(e){this.buf+=e},end:function(e){this.buf+=e},read:function(){return this.buf}}}var b=e(\"crypto\");n=t.exports=d,n.sha1=function(e){return d(e)},n.keys=function(e){return d(e,{excludeValues:!0,algorithm:\"sha1\",encoding:\"hex\"})},n.MD5=function(e){return d(e,{algorithm:\"md5\",encoding:\"hex\"})},n.keysMD5=function(e){return d(e,{algorithm:\"md5\",encoding:\"hex\",excludeValues:!0})};var v=b.getHashes?b.getHashes().slice():[\"sha1\",\"md5\"];v.push(\"passthrough\");var m=[\"buffer\",\"hex\",\"binary\",\"base64\"];n.writeToStream=function(e,t,n){return\"undefined\"==typeof n&&(n=t,t={}),t=h(e,t),g(t,n).dispatch(e)}}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/fake_5f1a2fc7.js\",\"/\")},{buffer:3,crypto:5,lYpoI2:10}],2:[function(e,t,n){(function(e,t,r,o,i,u,a,f,s){var c=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";!function(e){\"use strict\";function t(e){var t=e.charCodeAt(0);return t===i||t===l?62:t===u||t===d?63:t<a?-1:t<a+10?t-a+26+26:t<s+26?t-s:t<f+26?t-f+26:void 0}function n(e){function n(e){s[l++]=e}var r,i,u,a,f,s;if(e.length%4>0)throw new Error(\"Invalid string. Length must be a multiple of 4\");var c=e.length;f=\"=\"===e.charAt(c-2)?2:\"=\"===e.charAt(c-1)?1:0,s=new o(3*e.length/4-f),u=f>0?e.length-4:e.length;var l=0;for(r=0,i=0;r<u;r+=4,i+=3)a=t(e.charAt(r))<<18|t(e.charAt(r+1))<<12|t(e.charAt(r+2))<<6|t(e.charAt(r+3)),n((16711680&a)>>16),n((65280&a)>>8),n(255&a);return 2===f?(a=t(e.charAt(r))<<2|t(e.charAt(r+1))>>4,n(255&a)):1===f&&(a=t(e.charAt(r))<<10|t(e.charAt(r+1))<<4|t(e.charAt(r+2))>>2,n(a>>8&255),n(255&a)),s}function r(e){function t(e){return c.charAt(e)}function n(e){return t(e>>18&63)+t(e>>12&63)+t(e>>6&63)+t(63&e)}var r,o,i,u=e.length%3,a=\"\";for(r=0,i=e.length-u;r<i;r+=3)o=(e[r]<<16)+(e[r+1]<<8)+e[r+2],a+=n(o);switch(u){case 1:o=e[e.length-1],a+=t(o>>2),a+=t(o<<4&63),a+=\"==\";break;case 2:o=(e[e.length-2]<<8)+e[e.length-1],a+=t(o>>10),a+=t(o>>4&63),a+=t(o<<2&63),a+=\"=\"}return a}var o=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,i=\"+\".charCodeAt(0),u=\"/\".charCodeAt(0),a=\"0\".charCodeAt(0),f=\"a\".charCodeAt(0),s=\"A\".charCodeAt(0),l=\"-\".charCodeAt(0),d=\"_\".charCodeAt(0);e.toByteArray=n,e.fromByteArray=r}(\"undefined\"==typeof n?this.base64js={}:n)}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/base64-js/lib/b64.js\",\"/node_modules/gulp-browserify/node_modules/base64-js/lib\")},{buffer:3,lYpoI2:10}],3:[function(e,t,n){(function(t,r,o,i,u,a,f,s,c){function o(e,t,n){if(!(this instanceof o))return new o(e,t,n);var r=typeof e;if(\"base64\"===t&&\"string\"===r)for(e=N(e);e.length%4!==0;)e+=\"=\";var i;if(\"number\"===r)i=F(e);else if(\"string\"===r)i=o.byteLength(e,t);else{if(\"object\"!==r)throw new Error(\"First argument needs to be a number, array or string.\");i=F(e.length)}var u;o._useTypedArrays?u=o._augment(new Uint8Array(i)):(u=this,u.length=i,u._isBuffer=!0);var a;if(o._useTypedArrays&&\"number\"==typeof e.byteLength)u._set(e);else if(O(e))for(a=0;a<i;a++)o.isBuffer(e)?u[a]=e.readUInt8(a):u[a]=e[a];else if(\"string\"===r)u.write(e,0,t);else if(\"number\"===r&&!o._useTypedArrays&&!n)for(a=0;a<i;a++)u[a]=0;return u}function l(e,t,n,r){n=Number(n)||0;var i=e.length-n;r?(r=Number(r),r>i&&(r=i)):r=i;var u=t.length;$(u%2===0,\"Invalid hex string\"),r>u/2&&(r=u/2);for(var a=0;a<r;a++){var f=parseInt(t.substr(2*a,2),16);$(!isNaN(f),\"Invalid hex string\"),e[n+a]=f}return o._charsWritten=2*a,a}function d(e,t,n,r){var i=o._charsWritten=W(V(t),e,n,r);return i}function h(e,t,n,r){var i=o._charsWritten=W(q(t),e,n,r);return i}function p(e,t,n,r){return h(e,t,n,r)}function y(e,t,n,r){var i=o._charsWritten=W(R(t),e,n,r);return i}function g(e,t,n,r){var i=o._charsWritten=W(P(t),e,n,r);return i}function w(e,t,n){return 0===t&&n===e.length?G.fromByteArray(e):G.fromByteArray(e.slice(t,n))}function b(e,t,n){var r=\"\",o=\"\";n=Math.min(e.length,n);for(var i=t;i<n;i++)e[i]<=127?(r+=J(o)+String.fromCharCode(e[i]),o=\"\"):o+=\"%\"+e[i].toString(16);return r+J(o)}function v(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var o=t;o<n;o++)r+=String.fromCharCode(e[o]);return r}function m(e,t,n){return v(e,t,n)}function _(e,t,n){var r=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>r)&&(n=r);for(var o=\"\",i=t;i<n;i++)o+=H(e[i]);return o}function E(e,t,n){for(var r=e.slice(t,n),o=\"\",i=0;i<r.length;i+=2)o+=String.fromCharCode(r[i]+256*r[i+1]);return o}function I(e,t,n,r){r||($(\"boolean\"==typeof n,\"missing or invalid endian\"),$(void 0!==t&&null!==t,\"missing offset\"),$(t+1<e.length,\"Trying to read beyond buffer length\"));var o=e.length;if(!(t>=o)){var i;return n?(i=e[t],t+1<o&&(i|=e[t+1]<<8)):(i=e[t]<<8,t+1<o&&(i|=e[t+1])),i}}function A(e,t,n,r){r||($(\"boolean\"==typeof n,\"missing or invalid endian\"),$(void 0!==t&&null!==t,\"missing offset\"),$(t+3<e.length,\"Trying to read beyond buffer length\"));var o=e.length;if(!(t>=o)){var i;return n?(t+2<o&&(i=e[t+2]<<16),t+1<o&&(i|=e[t+1]<<8),i|=e[t],t+3<o&&(i+=e[t+3]<<24>>>0)):(t+1<o&&(i=e[t+1]<<16),t+2<o&&(i|=e[t+2]<<8),t+3<o&&(i|=e[t+3]),i+=e[t]<<24>>>0),i}}function B(e,t,n,r){r||($(\"boolean\"==typeof n,\"missing or invalid endian\"),$(void 0!==t&&null!==t,\"missing offset\"),$(t+1<e.length,\"Trying to read beyond buffer length\"));var o=e.length;if(!(t>=o)){var i=I(e,t,n,!0),u=32768&i;return u?(65535-i+1)*-1:i}}function L(e,t,n,r){r||($(\"boolean\"==typeof n,\"missing or invalid endian\"),$(void 0!==t&&null!==t,\"missing offset\"),$(t+3<e.length,\"Trying to read beyond buffer length\"));var o=e.length;if(!(t>=o)){var i=A(e,t,n,!0),u=2147483648&i;return u?(4294967295-i+1)*-1:i}}function U(e,t,n,r){return r||($(\"boolean\"==typeof n,\"missing or invalid endian\"),$(t+3<e.length,\"Trying to read beyond buffer length\")),Q.read(e,t,n,23,4)}function x(e,t,n,r){return r||($(\"boolean\"==typeof n,\"missing or invalid endian\"),$(t+7<e.length,\"Trying to read beyond buffer length\")),Q.read(e,t,n,52,8)}function S(e,t,n,r,o){o||($(void 0!==t&&null!==t,\"missing value\"),$(\"boolean\"==typeof r,\"missing or invalid endian\"),$(void 0!==n&&null!==n,\"missing offset\"),$(n+1<e.length,\"trying to write beyond buffer length\"),K(t,65535));var i=e.length;if(!(n>=i))for(var u=0,a=Math.min(i-n,2);u<a;u++)e[n+u]=(t&255<<8*(r?u:1-u))>>>8*(r?u:1-u)}function j(e,t,n,r,o){o||($(void 0!==t&&null!==t,\"missing value\"),$(\"boolean\"==typeof r,\"missing or invalid endian\"),$(void 0!==n&&null!==n,\"missing offset\"),$(n+3<e.length,\"trying to write beyond buffer length\"),K(t,4294967295));var i=e.length;if(!(n>=i))for(var u=0,a=Math.min(i-n,4);u<a;u++)e[n+u]=t>>>8*(r?u:3-u)&255}function C(e,t,n,r,o){o||($(void 0!==t&&null!==t,\"missing value\"),$(\"boolean\"==typeof r,\"missing or invalid endian\"),$(void 0!==n&&null!==n,\"missing offset\"),$(n+1<e.length,\"Trying to write beyond buffer length\"),z(t,32767,-32768));var i=e.length;n>=i||(t>=0?S(e,t,n,r,o):S(e,65535+t+1,n,r,o))}function k(e,t,n,r,o){o||($(void 0!==t&&null!==t,\"missing value\"),$(\"boolean\"==typeof r,\"missing or invalid endian\"),$(void 0!==n&&null!==n,\"missing offset\"),$(n+3<e.length,\"Trying to write beyond buffer length\"),z(t,2147483647,-2147483648));var i=e.length;n>=i||(t>=0?j(e,t,n,r,o):j(e,4294967295+t+1,n,r,o))}function T(e,t,n,r,o){o||($(void 0!==t&&null!==t,\"missing value\"),$(\"boolean\"==typeof r,\"missing or invalid endian\"),$(void 0!==n&&null!==n,\"missing offset\"),$(n+3<e.length,\"Trying to write beyond buffer length\"),X(t,3.4028234663852886e38,-3.4028234663852886e38));var i=e.length;n>=i||Q.write(e,t,n,r,23,4)}function M(e,t,n,r,o){o||($(void 0!==t&&null!==t,\"missing value\"),$(\"boolean\"==typeof r,\"missing or invalid endian\"),$(void 0!==n&&null!==n,\"missing offset\"),$(n+7<e.length,\"Trying to write beyond buffer length\"),X(t,1.7976931348623157e308,-1.7976931348623157e308));var i=e.length;n>=i||Q.write(e,t,n,r,52,8)}function N(e){return e.trim?e.trim():e.replace(/^\\s+|\\s+$/g,\"\")}function Y(e,t,n){return\"number\"!=typeof e?n:(e=~~e,e>=t?t:e>=0?e:(e+=t,e>=0?e:0))}function F(e){return e=~~Math.ceil(+e),e<0?0:e}function D(e){return(Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)})(e)}function O(e){return D(e)||o.isBuffer(e)||e&&\"object\"==typeof e&&\"number\"==typeof e.length}function H(e){return e<16?\"0\"+e.toString(16):e.toString(16)}function V(e){for(var t=[],n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<=127)t.push(e.charCodeAt(n));else{var o=n;r>=55296&&r<=57343&&n++;for(var i=encodeURIComponent(e.slice(o,n+1)).substr(1).split(\"%\"),u=0;u<i.length;u++)t.push(parseInt(i[u],16))}}return t}function q(e){for(var t=[],n=0;n<e.length;n++)t.push(255&e.charCodeAt(n));return t}function P(e){for(var t,n,r,o=[],i=0;i<e.length;i++)t=e.charCodeAt(i),n=t>>8,r=t%256,o.push(r),o.push(n);return o}function R(e){return G.toByteArray(e)}function W(e,t,n,r){for(var o=0;o<r&&!(o+n>=t.length||o>=e.length);o++)t[o+n]=e[o];return o}function J(e){try{return decodeURIComponent(e)}catch(t){return String.fromCharCode(65533)}}function K(e,t){$(\"number\"==typeof e,\"cannot write a non-number as a number\"),$(e>=0,\"specified a negative value for writing an unsigned value\"),$(e<=t,\"value is larger than maximum value for type\"),$(Math.floor(e)===e,\"value has a fractional component\")}function z(e,t,n){$(\"number\"==typeof e,\"cannot write a non-number as a number\"),$(e<=t,\"value larger than maximum allowed value\"),$(e>=n,\"value smaller than minimum allowed value\"),$(Math.floor(e)===e,\"value has a fractional component\")}function X(e,t,n){$(\"number\"==typeof e,\"cannot write a non-number as a number\"),$(e<=t,\"value larger than maximum allowed value\"),$(e>=n,\"value smaller than minimum allowed value\")}function $(e,t){if(!e)throw new Error(t||\"Failed assertion\")}var G=e(\"base64-js\"),Q=e(\"ieee754\");n.Buffer=o,n.SlowBuffer=o,n.INSPECT_MAX_BYTES=50,o.poolSize=8192,o._useTypedArrays=function(){try{var e=new ArrayBuffer(0),t=new Uint8Array(e);return t.foo=function(){return 42},42===t.foo()&&\"function\"==typeof t.subarray}catch(n){return!1}}(),o.isEncoding=function(e){switch(String(e).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"raw\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},o.isBuffer=function(e){return!(null===e||void 0===e||!e._isBuffer)},o.byteLength=function(e,t){var n;switch(e+=\"\",t||\"utf8\"){case\"hex\":n=e.length/2;break;case\"utf8\":case\"utf-8\":n=V(e).length;break;case\"ascii\":case\"binary\":case\"raw\":n=e.length;break;case\"base64\":n=R(e).length;break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":n=2*e.length;break;default:throw new Error(\"Unknown encoding\")}return n},o.concat=function(e,t){if($(D(e),\"Usage: Buffer.concat(list, [totalLength])\\nlist should be an Array.\"),0===e.length)return new o(0);if(1===e.length)return e[0];var n;if(\"number\"!=typeof t)for(t=0,n=0;n<e.length;n++)t+=e[n].length;var r=new o(t),i=0;for(n=0;n<e.length;n++){var u=e[n];u.copy(r,i),i+=u.length}return r},o.prototype.write=function(e,t,n,r){if(isFinite(t))isFinite(n)||(r=n,n=void 0);else{var o=r;r=t,t=n,n=o}t=Number(t)||0;var i=this.length-t;n?(n=Number(n),n>i&&(n=i)):n=i,r=String(r||\"utf8\").toLowerCase();var u;switch(r){case\"hex\":u=l(this,e,t,n);break;case\"utf8\":case\"utf-8\":u=d(this,e,t,n);break;case\"ascii\":u=h(this,e,t,n);break;case\"binary\":u=p(this,e,t,n);break;case\"base64\":u=y(this,e,t,n);break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":u=g(this,e,t,n);break;default:throw new Error(\"Unknown encoding\")}return u},o.prototype.toString=function(e,t,n){var r=this;if(e=String(e||\"utf8\").toLowerCase(),t=Number(t)||0,n=void 0!==n?Number(n):n=r.length,n===t)return\"\";var o;switch(e){case\"hex\":o=_(r,t,n);break;case\"utf8\":case\"utf-8\":o=b(r,t,n);break;case\"ascii\":o=v(r,t,n);break;case\"binary\":o=m(r,t,n);break;case\"base64\":o=w(r,t,n);break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":o=E(r,t,n);break;default:throw new Error(\"Unknown encoding\")}return o},o.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}},o.prototype.copy=function(e,t,n,r){var i=this;if(n||(n=0),r||0===r||(r=this.length),t||(t=0),r!==n&&0!==e.length&&0!==i.length){$(r>=n,\"sourceEnd < sourceStart\"),$(t>=0&&t<e.length,\"targetStart out of bounds\"),$(n>=0&&n<i.length,\"sourceStart out of bounds\"),$(r>=0&&r<=i.length,\"sourceEnd out of bounds\"),r>this.length&&(r=this.length),e.length-t<r-n&&(r=e.length-t+n);var u=r-n;if(u<100||!o._useTypedArrays)for(var a=0;a<u;a++)e[a+t]=this[a+n];else e._set(this.subarray(n,n+u),t)}},o.prototype.slice=function(e,t){var n=this.length;if(e=Y(e,n,0),t=Y(t,n,n),o._useTypedArrays)return o._augment(this.subarray(e,t));for(var r=t-e,i=new o(r,(void 0),(!0)),u=0;u<r;u++)i[u]=this[u+e];return i},o.prototype.get=function(e){return console.log(\".get() is deprecated. Access using array indexes instead.\"),this.readUInt8(e)},o.prototype.set=function(e,t){return console.log(\".set() is deprecated. Access using array indexes instead.\"),this.writeUInt8(e,t)},o.prototype.readUInt8=function(e,t){if(t||($(void 0!==e&&null!==e,\"missing offset\"),$(e<this.length,\"Trying to read beyond buffer length\")),!(e>=this.length))return this[e]},o.prototype.readUInt16LE=function(e,t){return I(this,e,!0,t)},o.prototype.readUInt16BE=function(e,t){return I(this,e,!1,t)},o.prototype.readUInt32LE=function(e,t){return A(this,e,!0,t)},o.prototype.readUInt32BE=function(e,t){return A(this,e,!1,t)},o.prototype.readInt8=function(e,t){if(t||($(void 0!==e&&null!==e,\"missing offset\"),$(e<this.length,\"Trying to read beyond buffer length\")),!(e>=this.length)){var n=128&this[e];return n?(255-this[e]+1)*-1:this[e]}},o.prototype.readInt16LE=function(e,t){return B(this,e,!0,t)},o.prototype.readInt16BE=function(e,t){return B(this,e,!1,t)},o.prototype.readInt32LE=function(e,t){return L(this,e,!0,t)},o.prototype.readInt32BE=function(e,t){return L(this,e,!1,t)},o.prototype.readFloatLE=function(e,t){return U(this,e,!0,t)},o.prototype.readFloatBE=function(e,t){return U(this,e,!1,t)},o.prototype.readDoubleLE=function(e,t){return x(this,e,!0,t)},o.prototype.readDoubleBE=function(e,t){return x(this,e,!1,t)},o.prototype.writeUInt8=function(e,t,n){n||($(void 0!==e&&null!==e,\"missing value\"),$(void 0!==t&&null!==t,\"missing offset\"),$(t<this.length,\"trying to write beyond buffer length\"),K(e,255)),t>=this.length||(this[t]=e)},o.prototype.writeUInt16LE=function(e,t,n){S(this,e,t,!0,n)},o.prototype.writeUInt16BE=function(e,t,n){S(this,e,t,!1,n)},o.prototype.writeUInt32LE=function(e,t,n){j(this,e,t,!0,n)},o.prototype.writeUInt32BE=function(e,t,n){j(this,e,t,!1,n)},o.prototype.writeInt8=function(e,t,n){n||($(void 0!==e&&null!==e,\"missing value\"),$(void 0!==t&&null!==t,\"missing offset\"),$(t<this.length,\"Trying to write beyond buffer length\"),z(e,127,-128)),t>=this.length||(e>=0?this.writeUInt8(e,t,n):this.writeUInt8(255+e+1,t,n))},o.prototype.writeInt16LE=function(e,t,n){C(this,e,t,!0,n)},o.prototype.writeInt16BE=function(e,t,n){C(this,e,t,!1,n)},o.prototype.writeInt32LE=function(e,t,n){k(this,e,t,!0,n)},o.prototype.writeInt32BE=function(e,t,n){k(this,e,t,!1,n)},o.prototype.writeFloatLE=function(e,t,n){T(this,e,t,!0,n)},o.prototype.writeFloatBE=function(e,t,n){T(this,e,t,!1,n)},o.prototype.writeDoubleLE=function(e,t,n){M(this,e,t,!0,n)},o.prototype.writeDoubleBE=function(e,t,n){M(this,e,t,!1,n)},o.prototype.fill=function(e,t,n){if(e||(e=0),t||(t=0),n||(n=this.length),\"string\"==typeof e&&(e=e.charCodeAt(0)),$(\"number\"==typeof e&&!isNaN(e),\"value is not a number\"),$(n>=t,\"end < start\"),n!==t&&0!==this.length){$(t>=0&&t<this.length,\"start out of bounds\"),$(n>=0&&n<=this.length,\"end out of bounds\");for(var r=t;r<n;r++)this[r]=e}},o.prototype.inspect=function(){for(var e=[],t=this.length,r=0;r<t;r++)if(e[r]=H(this[r]),r===n.INSPECT_MAX_BYTES){e[r+1]=\"...\";break}return\"<Buffer \"+e.join(\" \")+\">\"},o.prototype.toArrayBuffer=function(){if(\"undefined\"!=typeof Uint8Array){if(o._useTypedArrays)return new o(this).buffer;for(var e=new Uint8Array(this.length),t=0,n=e.length;t<n;t+=1)e[t]=this[t];return e.buffer}throw new Error(\"Buffer.toArrayBuffer not supported in this browser\")};var Z=o.prototype;o._augment=function(e){return e._isBuffer=!0,e._get=e.get,e._set=e.set,e.get=Z.get,e.set=Z.set,e.write=Z.write,e.toString=Z.toString,e.toLocaleString=Z.toString,e.toJSON=Z.toJSON,e.copy=Z.copy,e.slice=Z.slice,e.readUInt8=Z.readUInt8,e.readUInt16LE=Z.readUInt16LE,e.readUInt16BE=Z.readUInt16BE,e.readUInt32LE=Z.readUInt32LE,e.readUInt32BE=Z.readUInt32BE,e.readInt8=Z.readInt8,e.readInt16LE=Z.readInt16LE,e.readInt16BE=Z.readInt16BE,e.readInt32LE=Z.readInt32LE,e.readInt32BE=Z.readInt32BE,e.readFloatLE=Z.readFloatLE,e.readFloatBE=Z.readFloatBE,e.readDoubleLE=Z.readDoubleLE,e.readDoubleBE=Z.readDoubleBE,e.writeUInt8=Z.writeUInt8,e.writeUInt16LE=Z.writeUInt16LE,e.writeUInt16BE=Z.writeUInt16BE,e.writeUInt32LE=Z.writeUInt32LE,e.writeUInt32BE=Z.writeUInt32BE,e.writeInt8=Z.writeInt8,e.writeInt16LE=Z.writeInt16LE,e.writeInt16BE=Z.writeInt16BE,e.writeInt32LE=Z.writeInt32LE,e.writeInt32BE=Z.writeInt32BE,e.writeFloatLE=Z.writeFloatLE,e.writeFloatBE=Z.writeFloatBE,e.writeDoubleLE=Z.writeDoubleLE,e.writeDoubleBE=Z.writeDoubleBE,e.fill=Z.fill,e.inspect=Z.inspect,e.toArrayBuffer=Z.toArrayBuffer,e}}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/buffer/index.js\",\"/node_modules/gulp-browserify/node_modules/buffer\")},{\"base64-js\":2,buffer:3,ieee754:11,lYpoI2:10}],4:[function(e,t,n){(function(n,r,o,i,u,a,f,s,c){function l(e,t){if(e.length%p!==0){var n=e.length+(p-e.length%p);e=o.concat([e,y],n)}for(var r=[],i=t?e.readInt32BE:e.readInt32LE,u=0;u<e.length;u+=p)r.push(i.call(e,u));return r}function d(e,t,n){for(var r=new o(t),i=n?r.writeInt32BE:r.writeInt32LE,u=0;u<e.length;u++)i.call(r,e[u],4*u,!0);return r}function h(e,t,n,r){o.isBuffer(e)||(e=new o(e));var i=t(l(e,r),e.length*g);return d(i,n,r)}var o=e(\"buffer\").Buffer,p=4,y=new o(p);y.fill(0);var g=8;t.exports={hash:h}}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/helpers.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{buffer:3,lYpoI2:10}],5:[function(e,t,n){(function(t,r,o,i,u,a,f,s,c){function l(e,t,n){o.isBuffer(t)||(t=new o(t)),o.isBuffer(n)||(n=new o(n)),t.length>m?t=e(t):t.length<m&&(t=o.concat([t,_],m));for(var r=new o(m),i=new o(m),u=0;u<m;u++)r[u]=54^t[u],i[u]=92^t[u];var a=e(o.concat([r,n]));return e(o.concat([i,a]))}function d(e,t){e=e||\"sha1\";var n=v[e],r=[],i=0;return n||h(\"algorithm:\",e,\"is not yet supported\"),{update:function(e){return o.isBuffer(e)||(e=new o(e)),r.push(e),i+=e.length,this},digest:function(e){var i=o.concat(r),u=t?l(n,t,i):n(i);return r=null,e?u.toString(e):u}}}function h(){var e=[].slice.call(arguments).join(\" \");throw new Error([e,\"we accept pull requests\",\"http://github.com/dominictarr/crypto-browserify\"].join(\"\\n\"))}function p(e,t){for(var n in e)t(e[n],n)}var o=e(\"buffer\").Buffer,y=e(\"./sha\"),g=e(\"./sha256\"),w=e(\"./rng\"),b=e(\"./md5\"),v={sha1:y,sha256:g,md5:b},m=64,_=new o(m);_.fill(0),n.createHash=function(e){return d(e)},n.createHmac=function(e,t){return d(e,t)},n.randomBytes=function(e,t){if(!t||!t.call)return new o(w(e));try{t.call(this,void 0,new o(w(e)))}catch(n){t(n)}},p([\"createCredentials\",\"createCipher\",\"createCipheriv\",\"createDecipher\",\"createDecipheriv\",\"createSign\",\"createVerify\",\"createDiffieHellman\",\"pbkdf2\"],function(e){n[e]=function(){h(\"sorry,\",e,\"is not implemented yet\")}})}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/index.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./md5\":6,\"./rng\":7,\"./sha\":8,\"./sha256\":9,buffer:3,lYpoI2:10}],6:[function(e,t,n){(function(n,r,o,i,u,a,f,s,c){function l(e,t){e[t>>5]|=128<<t%32,e[(t+64>>>9<<4)+14]=t;for(var n=1732584193,r=-271733879,o=-1732584194,i=271733878,u=0;u<e.length;u+=16){var a=n,f=r,s=o,c=i;n=h(n,r,o,i,e[u+0],7,-680876936),i=h(i,n,r,o,e[u+1],12,-389564586),o=h(o,i,n,r,e[u+2],17,606105819),r=h(r,o,i,n,e[u+3],22,-1044525330),n=h(n,r,o,i,e[u+4],7,-176418897),i=h(i,n,r,o,e[u+5],12,1200080426),o=h(o,i,n,r,e[u+6],17,-1473231341),r=h(r,o,i,n,e[u+7],22,-45705983),n=h(n,r,o,i,e[u+8],7,1770035416),i=h(i,n,r,o,e[u+9],12,-1958414417),o=h(o,i,n,r,e[u+10],17,-42063),r=h(r,o,i,n,e[u+11],22,-1990404162),n=h(n,r,o,i,e[u+12],7,1804603682),i=h(i,n,r,o,e[u+13],12,-40341101),o=h(o,i,n,r,e[u+14],17,-1502002290),r=h(r,o,i,n,e[u+15],22,1236535329),n=p(n,r,o,i,e[u+1],5,-165796510),i=p(i,n,r,o,e[u+6],9,-1069501632),o=p(o,i,n,r,e[u+11],14,643717713),r=p(r,o,i,n,e[u+0],20,-373897302),n=p(n,r,o,i,e[u+5],5,-701558691),i=p(i,n,r,o,e[u+10],9,38016083),o=p(o,i,n,r,e[u+15],14,-660478335),r=p(r,o,i,n,e[u+4],20,-405537848),n=p(n,r,o,i,e[u+9],5,568446438),i=p(i,n,r,o,e[u+14],9,-1019803690),o=p(o,i,n,r,e[u+3],14,-187363961),r=p(r,o,i,n,e[u+8],20,1163531501),n=p(n,r,o,i,e[u+13],5,-1444681467),i=p(i,n,r,o,e[u+2],9,-51403784),o=p(o,i,n,r,e[u+7],14,1735328473),r=p(r,o,i,n,e[u+12],20,-1926607734),n=y(n,r,o,i,e[u+5],4,-378558),i=y(i,n,r,o,e[u+8],11,-2022574463),o=y(o,i,n,r,e[u+11],16,1839030562),r=y(r,o,i,n,e[u+14],23,-35309556),n=y(n,r,o,i,e[u+1],4,-1530992060),i=y(i,n,r,o,e[u+4],11,1272893353),o=y(o,i,n,r,e[u+7],16,-155497632),r=y(r,o,i,n,e[u+10],23,-1094730640),n=y(n,r,o,i,e[u+13],4,681279174),i=y(i,n,r,o,e[u+0],11,-358537222),o=y(o,i,n,r,e[u+3],16,-722521979),r=y(r,o,i,n,e[u+6],23,76029189),n=y(n,r,o,i,e[u+9],4,-640364487),i=y(i,n,r,o,e[u+12],11,-421815835),o=y(o,i,n,r,e[u+15],16,530742520),r=y(r,o,i,n,e[u+2],23,-995338651),n=g(n,r,o,i,e[u+0],6,-198630844),i=g(i,n,r,o,e[u+7],10,1126891415),o=g(o,i,n,r,e[u+14],15,-1416354905),r=g(r,o,i,n,e[u+5],21,-57434055),n=g(n,r,o,i,e[u+12],6,1700485571),i=g(i,n,r,o,e[u+3],10,-1894986606),o=g(o,i,n,r,e[u+10],15,-1051523),r=g(r,o,i,n,e[u+1],21,-2054922799),n=g(n,r,o,i,e[u+8],6,1873313359),i=g(i,n,r,o,e[u+15],10,-30611744),o=g(o,i,n,r,e[u+6],15,-1560198380),r=g(r,o,i,n,e[u+13],21,1309151649),n=g(n,r,o,i,e[u+4],6,-145523070),i=g(i,n,r,o,e[u+11],10,-1120210379),o=g(o,i,n,r,e[u+2],15,718787259),r=g(r,o,i,n,e[u+9],21,-343485551),n=w(n,a),r=w(r,f),o=w(o,s),i=w(i,c)}return Array(n,r,o,i)}function d(e,t,n,r,o,i){return w(b(w(w(t,e),w(r,i)),o),n)}function h(e,t,n,r,o,i,u){return d(t&n|~t&r,e,t,o,i,u)}function p(e,t,n,r,o,i,u){return d(t&r|n&~r,e,t,o,i,u)}function y(e,t,n,r,o,i,u){return d(t^n^r,e,t,o,i,u)}function g(e,t,n,r,o,i,u){return d(n^(t|~r),e,t,o,i,u)}function w(e,t){var n=(65535&e)+(65535&t),r=(e>>16)+(t>>16)+(n>>16);return r<<16|65535&n}function b(e,t){return e<<t|e>>>32-t}var v=e(\"./helpers\");t.exports=function(e){return v.hash(e,l,16)}}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/md5.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:10}],7:[function(e,t,n){(function(e,n,r,o,i,u,a,f,s){!function(){var e,n,r=this;e=function(e){for(var t,t,n=new Array(e),r=0;r<e;r++)0==(3&r)&&(t=4294967296*Math.random()),n[r]=t>>>((3&r)<<3)&255;return n},r.crypto&&crypto.getRandomValues&&(n=function(e){var t=new Uint8Array(e);return crypto.getRandomValues(t),t}),t.exports=n||e}()}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/rng.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{buffer:3,lYpoI2:10}],8:[function(e,t,n){(function(n,r,o,i,u,a,f,s,c){function l(e,t){e[t>>5]|=128<<24-t%32,e[(t+64>>9<<4)+15]=t;for(var n=Array(80),r=1732584193,o=-271733879,i=-1732584194,u=271733878,a=-1009589776,f=0;f<e.length;f+=16){for(var s=r,c=o,l=i,g=u,w=a,b=0;b<80;b++){b<16?n[b]=e[f+b]:n[b]=y(n[b-3]^n[b-8]^n[b-14]^n[b-16],1);var v=p(p(y(r,5),d(b,o,i,u)),p(p(a,n[b]),h(b)));a=u,u=i,i=y(o,30),o=r,r=v}r=p(r,s),o=p(o,c),i=p(i,l),u=p(u,g),a=p(a,w)}return Array(r,o,i,u,a)}function d(e,t,n,r){return e<20?t&n|~t&r:e<40?t^n^r:e<60?t&n|t&r|n&r:t^n^r}function h(e){return e<20?1518500249:e<40?1859775393:e<60?-1894007588:-899497514}function p(e,t){var n=(65535&e)+(65535&t),r=(e>>16)+(t>>16)+(n>>16);return r<<16|65535&n}function y(e,t){return e<<t|e>>>32-t}var g=e(\"./helpers\");t.exports=function(e){return g.hash(e,l,20,!0)}}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:10}],9:[function(e,t,n){(function(n,r,o,i,u,a,f,s,c){var l=e(\"./helpers\"),d=function(e,t){var n=(65535&e)+(65535&t),r=(e>>16)+(t>>16)+(n>>16);return r<<16|65535&n},h=function(e,t){return e>>>t|e<<32-t},p=function(e,t){return e>>>t},y=function(e,t,n){return e&t^~e&n},g=function(e,t,n){return e&t^e&n^t&n},w=function(e){return h(e,2)^h(e,13)^h(e,22)},b=function(e){\nreturn h(e,6)^h(e,11)^h(e,25)},v=function(e){return h(e,7)^h(e,18)^p(e,3)},m=function(e){return h(e,17)^h(e,19)^p(e,10)},_=function(e,t){var n,r,o,i,u,a,f,s,c,l,h,p,_=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),E=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),I=new Array(64);e[t>>5]|=128<<24-t%32,e[(t+64>>9<<4)+15]=t;for(var c=0;c<e.length;c+=16){n=E[0],r=E[1],o=E[2],i=E[3],u=E[4],a=E[5],f=E[6],s=E[7];for(var l=0;l<64;l++)l<16?I[l]=e[l+c]:I[l]=d(d(d(m(I[l-2]),I[l-7]),v(I[l-15])),I[l-16]),h=d(d(d(d(s,b(u)),y(u,a,f)),_[l]),I[l]),p=d(w(n),g(n,r,o)),s=f,f=a,a=u,u=d(i,h),i=o,o=r,r=n,n=d(h,p);E[0]=d(n,E[0]),E[1]=d(r,E[1]),E[2]=d(o,E[2]),E[3]=d(i,E[3]),E[4]=d(u,E[4]),E[5]=d(a,E[5]),E[6]=d(f,E[6]),E[7]=d(s,E[7])}return E};t.exports=function(e){return l.hash(e,_,32,!0)}}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha256.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:10}],10:[function(e,t,n){(function(e,n,r,o,i,u,a,f,s){function c(){}var e=t.exports={};e.nextTick=function(){var e=\"undefined\"!=typeof window&&window.setImmediate,t=\"undefined\"!=typeof window&&window.postMessage&&window.addEventListener;if(e)return function(e){return window.setImmediate(e)};if(t){var n=[];return window.addEventListener(\"message\",function(e){var t=e.source;if((t===window||null===t)&&\"process-tick\"===e.data&&(e.stopPropagation(),n.length>0)){var r=n.shift();r()}},!0),function(e){n.push(e),window.postMessage(\"process-tick\",\"*\")}}return function(e){setTimeout(e,0)}}(),e.title=\"browser\",e.browser=!0,e.env={},e.argv=[],e.on=c,e.addListener=c,e.once=c,e.off=c,e.removeListener=c,e.removeAllListeners=c,e.emit=c,e.binding=function(e){throw new Error(\"process.binding is not supported\")},e.cwd=function(){return\"/\"},e.chdir=function(e){throw new Error(\"process.chdir is not supported\")}}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/process/browser.js\",\"/node_modules/gulp-browserify/node_modules/process\")},{buffer:3,lYpoI2:10}],11:[function(e,t,n){(function(e,t,r,o,i,u,a,f,s){n.read=function(e,t,n,r,o){var i,u,a=8*o-r-1,f=(1<<a)-1,s=f>>1,c=-7,l=n?o-1:0,d=n?-1:1,h=e[t+l];for(l+=d,i=h&(1<<-c)-1,h>>=-c,c+=a;c>0;i=256*i+e[t+l],l+=d,c-=8);for(u=i&(1<<-c)-1,i>>=-c,c+=r;c>0;u=256*u+e[t+l],l+=d,c-=8);if(0===i)i=1-s;else{if(i===f)return u?NaN:(h?-1:1)*(1/0);u+=Math.pow(2,r),i-=s}return(h?-1:1)*u*Math.pow(2,i-r)},n.write=function(e,t,n,r,o,i){var u,a,f,s=8*i-o-1,c=(1<<s)-1,l=c>>1,d=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:i-1,p=r?1:-1,y=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,u=c):(u=Math.floor(Math.log(t)/Math.LN2),t*(f=Math.pow(2,-u))<1&&(u--,f*=2),t+=u+l>=1?d/f:d*Math.pow(2,1-l),t*f>=2&&(u++,f/=2),u+l>=c?(a=0,u=c):u+l>=1?(a=(t*f-1)*Math.pow(2,o),u+=l):(a=t*Math.pow(2,l-1)*Math.pow(2,o),u=0));o>=8;e[n+h]=255&a,h+=p,a/=256,o-=8);for(u=u<<o|a,s+=o;s>0;e[n+h]=255&u,h+=p,u/=256,s-=8);e[n+h-p]|=128*y}}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/ieee754/index.js\",\"/node_modules/ieee754\")},{buffer:3,lYpoI2:10}]},{},[1])(1)});","// 'path' module extracted from Node.js v8.11.1 (only the posix part)\n// transplited with Babel\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nfunction assertPath(path) {\n  if (typeof path !== 'string') {\n    throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));\n  }\n}\n\n// Resolves . and .. elements in a path with directory names\nfunction normalizeStringPosix(path, allowAboveRoot) {\n  var res = '';\n  var lastSegmentLength = 0;\n  var lastSlash = -1;\n  var dots = 0;\n  var code;\n  for (var i = 0; i <= path.length; ++i) {\n    if (i < path.length)\n      code = path.charCodeAt(i);\n    else if (code === 47 /*/*/)\n      break;\n    else\n      code = 47 /*/*/;\n    if (code === 47 /*/*/) {\n      if (lastSlash === i - 1 || dots === 1) {\n        // NOOP\n      } else if (lastSlash !== i - 1 && dots === 2) {\n        if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {\n          if (res.length > 2) {\n            var lastSlashIndex = res.lastIndexOf('/');\n            if (lastSlashIndex !== res.length - 1) {\n              if (lastSlashIndex === -1) {\n                res = '';\n                lastSegmentLength = 0;\n              } else {\n                res = res.slice(0, lastSlashIndex);\n                lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n              }\n              lastSlash = i;\n              dots = 0;\n              continue;\n            }\n          } else if (res.length === 2 || res.length === 1) {\n            res = '';\n            lastSegmentLength = 0;\n            lastSlash = i;\n            dots = 0;\n            continue;\n          }\n        }\n        if (allowAboveRoot) {\n          if (res.length > 0)\n            res += '/..';\n          else\n            res = '..';\n          lastSegmentLength = 2;\n        }\n      } else {\n        if (res.length > 0)\n          res += '/' + path.slice(lastSlash + 1, i);\n        else\n          res = path.slice(lastSlash + 1, i);\n        lastSegmentLength = i - lastSlash - 1;\n      }\n      lastSlash = i;\n      dots = 0;\n    } else if (code === 46 /*.*/ && dots !== -1) {\n      ++dots;\n    } else {\n      dots = -1;\n    }\n  }\n  return res;\n}\n\nfunction _format(sep, pathObject) {\n  var dir = pathObject.dir || pathObject.root;\n  var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');\n  if (!dir) {\n    return base;\n  }\n  if (dir === pathObject.root) {\n    return dir + base;\n  }\n  return dir + sep + base;\n}\n\nvar posix = {\n  // path.resolve([from ...], to)\n  resolve: function resolve() {\n    var resolvedPath = '';\n    var resolvedAbsolute = false;\n    var cwd;\n\n    for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n      var path;\n      if (i >= 0)\n        path = arguments[i];\n      else {\n        if (cwd === undefined)\n          cwd = process.cwd();\n        path = cwd;\n      }\n\n      assertPath(path);\n\n      // Skip empty entries\n      if (path.length === 0) {\n        continue;\n      }\n\n      resolvedPath = path + '/' + resolvedPath;\n      resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;\n    }\n\n    // At this point the path should be resolved to a full absolute path, but\n    // handle relative paths to be safe (might happen when process.cwd() fails)\n\n    // Normalize the path\n    resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);\n\n    if (resolvedAbsolute) {\n      if (resolvedPath.length > 0)\n        return '/' + resolvedPath;\n      else\n        return '/';\n    } else if (resolvedPath.length > 0) {\n      return resolvedPath;\n    } else {\n      return '.';\n    }\n  },\n\n  normalize: function normalize(path) {\n    assertPath(path);\n\n    if (path.length === 0) return '.';\n\n    var isAbsolute = path.charCodeAt(0) === 47 /*/*/;\n    var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;\n\n    // Normalize the path\n    path = normalizeStringPosix(path, !isAbsolute);\n\n    if (path.length === 0 && !isAbsolute) path = '.';\n    if (path.length > 0 && trailingSeparator) path += '/';\n\n    if (isAbsolute) return '/' + path;\n    return path;\n  },\n\n  isAbsolute: function isAbsolute(path) {\n    assertPath(path);\n    return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;\n  },\n\n  join: function join() {\n    if (arguments.length === 0)\n      return '.';\n    var joined;\n    for (var i = 0; i < arguments.length; ++i) {\n      var arg = arguments[i];\n      assertPath(arg);\n      if (arg.length > 0) {\n        if (joined === undefined)\n          joined = arg;\n        else\n          joined += '/' + arg;\n      }\n    }\n    if (joined === undefined)\n      return '.';\n    return posix.normalize(joined);\n  },\n\n  relative: function relative(from, to) {\n    assertPath(from);\n    assertPath(to);\n\n    if (from === to) return '';\n\n    from = posix.resolve(from);\n    to = posix.resolve(to);\n\n    if (from === to) return '';\n\n    // Trim any leading backslashes\n    var fromStart = 1;\n    for (; fromStart < from.length; ++fromStart) {\n      if (from.charCodeAt(fromStart) !== 47 /*/*/)\n        break;\n    }\n    var fromEnd = from.length;\n    var fromLen = fromEnd - fromStart;\n\n    // Trim any leading backslashes\n    var toStart = 1;\n    for (; toStart < to.length; ++toStart) {\n      if (to.charCodeAt(toStart) !== 47 /*/*/)\n        break;\n    }\n    var toEnd = to.length;\n    var toLen = toEnd - toStart;\n\n    // Compare paths to find the longest common path from root\n    var length = fromLen < toLen ? fromLen : toLen;\n    var lastCommonSep = -1;\n    var i = 0;\n    for (; i <= length; ++i) {\n      if (i === length) {\n        if (toLen > length) {\n          if (to.charCodeAt(toStart + i) === 47 /*/*/) {\n            // We get here if `from` is the exact base path for `to`.\n            // For example: from='/foo/bar'; to='/foo/bar/baz'\n            return to.slice(toStart + i + 1);\n          } else if (i === 0) {\n            // We get here if `from` is the root\n            // For example: from='/'; to='/foo'\n            return to.slice(toStart + i);\n          }\n        } else if (fromLen > length) {\n          if (from.charCodeAt(fromStart + i) === 47 /*/*/) {\n            // We get here if `to` is the exact base path for `from`.\n            // For example: from='/foo/bar/baz'; to='/foo/bar'\n            lastCommonSep = i;\n          } else if (i === 0) {\n            // We get here if `to` is the root.\n            // For example: from='/foo'; to='/'\n            lastCommonSep = 0;\n          }\n        }\n        break;\n      }\n      var fromCode = from.charCodeAt(fromStart + i);\n      var toCode = to.charCodeAt(toStart + i);\n      if (fromCode !== toCode)\n        break;\n      else if (fromCode === 47 /*/*/)\n        lastCommonSep = i;\n    }\n\n    var out = '';\n    // Generate the relative path based on the path difference between `to`\n    // and `from`\n    for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n      if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {\n        if (out.length === 0)\n          out += '..';\n        else\n          out += '/..';\n      }\n    }\n\n    // Lastly, append the rest of the destination (`to`) path that comes after\n    // the common path parts\n    if (out.length > 0)\n      return out + to.slice(toStart + lastCommonSep);\n    else {\n      toStart += lastCommonSep;\n      if (to.charCodeAt(toStart) === 47 /*/*/)\n        ++toStart;\n      return to.slice(toStart);\n    }\n  },\n\n  _makeLong: function _makeLong(path) {\n    return path;\n  },\n\n  dirname: function dirname(path) {\n    assertPath(path);\n    if (path.length === 0) return '.';\n    var code = path.charCodeAt(0);\n    var hasRoot = code === 47 /*/*/;\n    var end = -1;\n    var matchedSlash = true;\n    for (var i = path.length - 1; i >= 1; --i) {\n      code = path.charCodeAt(i);\n      if (code === 47 /*/*/) {\n          if (!matchedSlash) {\n            end = i;\n            break;\n          }\n        } else {\n        // We saw the first non-path separator\n        matchedSlash = false;\n      }\n    }\n\n    if (end === -1) return hasRoot ? '/' : '.';\n    if (hasRoot && end === 1) return '//';\n    return path.slice(0, end);\n  },\n\n  basename: function basename(path, ext) {\n    if (ext !== undefined && typeof ext !== 'string') throw new TypeError('\"ext\" argument must be a string');\n    assertPath(path);\n\n    var start = 0;\n    var end = -1;\n    var matchedSlash = true;\n    var i;\n\n    if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n      if (ext.length === path.length && ext === path) return '';\n      var extIdx = ext.length - 1;\n      var firstNonSlashEnd = -1;\n      for (i = path.length - 1; i >= 0; --i) {\n        var code = path.charCodeAt(i);\n        if (code === 47 /*/*/) {\n            // If we reached a path separator that was not part of a set of path\n            // separators at the end of the string, stop now\n            if (!matchedSlash) {\n              start = i + 1;\n              break;\n            }\n          } else {\n          if (firstNonSlashEnd === -1) {\n            // We saw the first non-path separator, remember this index in case\n            // we need it if the extension ends up not matching\n            matchedSlash = false;\n            firstNonSlashEnd = i + 1;\n          }\n          if (extIdx >= 0) {\n            // Try to match the explicit extension\n            if (code === ext.charCodeAt(extIdx)) {\n              if (--extIdx === -1) {\n                // We matched the extension, so mark this as the end of our path\n                // component\n                end = i;\n              }\n            } else {\n              // Extension does not match, so our result is the entire path\n              // component\n              extIdx = -1;\n              end = firstNonSlashEnd;\n            }\n          }\n        }\n      }\n\n      if (start === end) end = firstNonSlashEnd;else if (end === -1) end = path.length;\n      return path.slice(start, end);\n    } else {\n      for (i = path.length - 1; i >= 0; --i) {\n        if (path.charCodeAt(i) === 47 /*/*/) {\n            // If we reached a path separator that was not part of a set of path\n            // separators at the end of the string, stop now\n            if (!matchedSlash) {\n              start = i + 1;\n              break;\n            }\n          } else if (end === -1) {\n          // We saw the first non-path separator, mark this as the end of our\n          // path component\n          matchedSlash = false;\n          end = i + 1;\n        }\n      }\n\n      if (end === -1) return '';\n      return path.slice(start, end);\n    }\n  },\n\n  extname: function extname(path) {\n    assertPath(path);\n    var startDot = -1;\n    var startPart = 0;\n    var end = -1;\n    var matchedSlash = true;\n    // Track the state of characters (if any) we see before our first dot and\n    // after any path separator we find\n    var preDotState = 0;\n    for (var i = path.length - 1; i >= 0; --i) {\n      var code = path.charCodeAt(i);\n      if (code === 47 /*/*/) {\n          // If we reached a path separator that was not part of a set of path\n          // separators at the end of the string, stop now\n          if (!matchedSlash) {\n            startPart = i + 1;\n            break;\n          }\n          continue;\n        }\n      if (end === -1) {\n        // We saw the first non-path separator, mark this as the end of our\n        // extension\n        matchedSlash = false;\n        end = i + 1;\n      }\n      if (code === 46 /*.*/) {\n          // If this is our first dot, mark it as the start of our extension\n          if (startDot === -1)\n            startDot = i;\n          else if (preDotState !== 1)\n            preDotState = 1;\n      } else if (startDot !== -1) {\n        // We saw a non-dot and non-path separator before our dot, so we should\n        // have a good chance at having a non-empty extension\n        preDotState = -1;\n      }\n    }\n\n    if (startDot === -1 || end === -1 ||\n        // We saw a non-dot character immediately before the dot\n        preDotState === 0 ||\n        // The (right-most) trimmed path component is exactly '..'\n        preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n      return '';\n    }\n    return path.slice(startDot, end);\n  },\n\n  format: function format(pathObject) {\n    if (pathObject === null || typeof pathObject !== 'object') {\n      throw new TypeError('The \"pathObject\" argument must be of type Object. Received type ' + typeof pathObject);\n    }\n    return _format('/', pathObject);\n  },\n\n  parse: function parse(path) {\n    assertPath(path);\n\n    var ret = { root: '', dir: '', base: '', ext: '', name: '' };\n    if (path.length === 0) return ret;\n    var code = path.charCodeAt(0);\n    var isAbsolute = code === 47 /*/*/;\n    var start;\n    if (isAbsolute) {\n      ret.root = '/';\n      start = 1;\n    } else {\n      start = 0;\n    }\n    var startDot = -1;\n    var startPart = 0;\n    var end = -1;\n    var matchedSlash = true;\n    var i = path.length - 1;\n\n    // Track the state of characters (if any) we see before our first dot and\n    // after any path separator we find\n    var preDotState = 0;\n\n    // Get non-dir info\n    for (; i >= start; --i) {\n      code = path.charCodeAt(i);\n      if (code === 47 /*/*/) {\n          // If we reached a path separator that was not part of a set of path\n          // separators at the end of the string, stop now\n          if (!matchedSlash) {\n            startPart = i + 1;\n            break;\n          }\n          continue;\n        }\n      if (end === -1) {\n        // We saw the first non-path separator, mark this as the end of our\n        // extension\n        matchedSlash = false;\n        end = i + 1;\n      }\n      if (code === 46 /*.*/) {\n          // If this is our first dot, mark it as the start of our extension\n          if (startDot === -1) startDot = i;else if (preDotState !== 1) preDotState = 1;\n        } else if (startDot !== -1) {\n        // We saw a non-dot and non-path separator before our dot, so we should\n        // have a good chance at having a non-empty extension\n        preDotState = -1;\n      }\n    }\n\n    if (startDot === -1 || end === -1 ||\n    // We saw a non-dot character immediately before the dot\n    preDotState === 0 ||\n    // The (right-most) trimmed path component is exactly '..'\n    preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n      if (end !== -1) {\n        if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end);else ret.base = ret.name = path.slice(startPart, end);\n      }\n    } else {\n      if (startPart === 0 && isAbsolute) {\n        ret.name = path.slice(1, startDot);\n        ret.base = path.slice(1, end);\n      } else {\n        ret.name = path.slice(startPart, startDot);\n        ret.base = path.slice(startPart, end);\n      }\n      ret.ext = path.slice(startDot, end);\n    }\n\n    if (startPart > 0) ret.dir = path.slice(0, startPart - 1);else if (isAbsolute) ret.dir = '/';\n\n    return ret;\n  },\n\n  sep: '/',\n  delimiter: ':',\n  win32: null,\n  posix: null\n};\n\nposix.posix = posix;\n\nmodule.exports = posix;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _constants = require(\"./constants\");\n\nvar _errorSerialization = require(\"./errorSerialization\");\n\n/**\n * Listens for \"call\" messages coming from the remote, executes the corresponding method, and\n * responds with the return value.\n * @param {Object} info Information about the local and remote windows.\n * @param {Object} methods The keys are the names of the methods that can be called by the remote\n * while the values are the method functions.\n * @param {Promise} destructionPromise A promise resolved when destroy() is called on the penpal\n * connection.\n * @returns {Function} A function that may be called to disconnect the receiver.\n */\nvar _default = (info, methods, log) => {\n  const localName = info.localName,\n        local = info.local,\n        remote = info.remote,\n        originForSending = info.originForSending,\n        originForReceiving = info.originForReceiving;\n  let destroyed = false;\n  log(`${localName}: Connecting call receiver`);\n\n  const handleMessageEvent = event => {\n    if (event.source !== remote || event.data.penpal !== _constants.CALL) {\n      return;\n    }\n\n    if (event.origin !== originForReceiving) {\n      log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);\n      return;\n    }\n\n    const _event$data = event.data,\n          methodName = _event$data.methodName,\n          args = _event$data.args,\n          id = _event$data.id;\n    log(`${localName}: Received ${methodName}() call`);\n\n    const createPromiseHandler = resolution => {\n      return returnValue => {\n        log(`${localName}: Sending ${methodName}() reply`);\n\n        if (destroyed) {\n          // It's possible to throw an error here, but it would need to be thrown asynchronously\n          // and would only be catchable using window.onerror. This is because the consumer\n          // is merely returning a value from their method and not calling any function\n          // that they could wrap in a try-catch. Even if the consumer were to catch the error,\n          // the value of doing so is questionable. Instead, we'll just log a message.\n          log(`${localName}: Unable to send ${methodName}() reply due to destroyed connection`);\n          return;\n        }\n\n        const message = {\n          penpal: _constants.REPLY,\n          id,\n          resolution,\n          returnValue\n        };\n\n        if (resolution === _constants.REJECTED && returnValue instanceof Error) {\n          message.returnValue = (0, _errorSerialization.serializeError)(returnValue);\n          message.returnValueIsError = true;\n        }\n\n        try {\n          remote.postMessage(message, originForSending);\n        } catch (err) {\n          // If a consumer attempts to send an object that's not cloneable (e.g., window),\n          // we want to ensure the receiver's promise gets rejected.\n          if (err.name === _constants.DATA_CLONE_ERROR) {\n            remote.postMessage({\n              penpal: _constants.REPLY,\n              id,\n              resolution: _constants.REJECTED,\n              returnValue: (0, _errorSerialization.serializeError)(err),\n              returnValueIsError: true\n            }, originForSending);\n          }\n\n          throw err;\n        }\n      };\n    };\n\n    new Promise(resolve => resolve(methods[methodName].apply(methods, args))).then(createPromiseHandler(_constants.FULFILLED), createPromiseHandler(_constants.REJECTED));\n  };\n\n  local.addEventListener(_constants.MESSAGE, handleMessageEvent);\n  return () => {\n    destroyed = true;\n    local.removeEventListener(_constants.MESSAGE, handleMessageEvent);\n  };\n};\n\nexports.default = _default;\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _constants = require(\"./constants\");\n\nvar _errorCodes = require(\"./errorCodes\");\n\nvar _generateId = _interopRequireDefault(require(\"./generateId\"));\n\nvar _errorSerialization = require(\"./errorSerialization\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Augments an object with methods that match those defined by the remote. When these methods are\n * called, a \"call\" message will be sent to the remote, the remote's corresponding method will be\n * executed, and the method's return value will be returned via a message.\n * @param {Object} callSender Sender object that should be augmented with methods.\n * @param {Object} info Information about the local and remote windows.\n * @param {Array} methodNames Names of methods available to be called on the remote.\n * @param {Promise} destructionPromise A promise resolved when destroy() is called on the penpal\n * connection.\n * @returns {Object} The call sender object with methods that may be called.\n */\nvar _default = (callSender, info, methodNames, destroyConnection, log) => {\n  const localName = info.localName,\n        local = info.local,\n        remote = info.remote,\n        originForSending = info.originForSending,\n        originForReceiving = info.originForReceiving;\n  let destroyed = false;\n  log(`${localName}: Connecting call sender`);\n\n  const createMethodProxy = methodName => {\n    return function () {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      log(`${localName}: Sending ${methodName}() call`); // This handles the case where the iframe has been removed from the DOM\n      // (and therefore its window closed), the consumer has not yet\n      // called destroy(), and the user calls a method exposed by\n      // the remote. We detect the iframe has been removed and force\n      // a destroy() immediately so that the consumer sees the error saying\n      // the connection has been destroyed. We wrap this check in a try catch\n      // because Edge throws an \"Object expected\" error when accessing\n      // contentWindow.closed on a contentWindow from an iframe that's been\n      // removed from the DOM.\n\n      let iframeRemoved;\n\n      try {\n        if (remote.closed) {\n          iframeRemoved = true;\n        }\n      } catch (e) {\n        iframeRemoved = true;\n      }\n\n      if (iframeRemoved) {\n        destroyConnection();\n      }\n\n      if (destroyed) {\n        const error = new Error(`Unable to send ${methodName}() call due ` + `to destroyed connection`);\n        error.code = _errorCodes.ERR_CONNECTION_DESTROYED;\n        throw error;\n      }\n\n      return new Promise((resolve, reject) => {\n        const id = (0, _generateId.default)();\n\n        const handleMessageEvent = event => {\n          if (event.source !== remote || event.data.penpal !== _constants.REPLY || event.data.id !== id) {\n            return;\n          }\n\n          if (event.origin !== originForReceiving) {\n            log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);\n            return;\n          }\n\n          log(`${localName}: Received ${methodName}() reply`);\n          local.removeEventListener(_constants.MESSAGE, handleMessageEvent);\n          let returnValue = event.data.returnValue;\n\n          if (event.data.returnValueIsError) {\n            returnValue = (0, _errorSerialization.deserializeError)(returnValue);\n          }\n\n          (event.data.resolution === _constants.FULFILLED ? resolve : reject)(returnValue);\n        };\n\n        local.addEventListener(_constants.MESSAGE, handleMessageEvent);\n        remote.postMessage({\n          penpal: _constants.CALL,\n          id,\n          methodName,\n          args\n        }, originForSending);\n      });\n    };\n  };\n\n  methodNames.reduce((api, methodName) => {\n    api[methodName] = createMethodProxy(methodName);\n    return api;\n  }, callSender);\n  return () => {\n    destroyed = true;\n  };\n};\n\nexports.default = _default;\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _constants = require(\"./constants\");\n\nvar _errorCodes = require(\"./errorCodes\");\n\nvar _createDestructor2 = _interopRequireDefault(require(\"./createDestructor\"));\n\nvar _getOriginFromSrc = _interopRequireDefault(require(\"./getOriginFromSrc\"));\n\nvar _createLogger = _interopRequireDefault(require(\"./createLogger\"));\n\nvar _connectCallReceiver = _interopRequireDefault(require(\"./connectCallReceiver\"));\n\nvar _connectCallSender = _interopRequireDefault(require(\"./connectCallSender\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst CHECK_IFRAME_IN_DOC_INTERVAL = 60000;\n/**\n * @typedef {Object} Child\n * @property {Promise} promise A promise which will be resolved once a connection has\n * been established.\n * @property {Function} destroy A method that, when called, will disconnect any\n * messaging channels. You may call this even before a connection has been established.\n */\n\n/**\n * Creates an iframe, loads a webpage into the URL, and attempts to establish communication with\n * the iframe.\n * @param {Object} options\n * @param {HTMLIframeElement} options.iframe The iframe to connect to.\n * @param {Object} [options.methods={}] Methods that may be called by the iframe.\n * @param {String} [options.childOrigin] The child origin to use to secure communication. If\n * not provided, the child origin will be derived from the iframe's src or srcdoc value.\n * @param {Number} [options.timeout] The amount of time, in milliseconds, Penpal should wait\n * for the child to respond before rejecting the connection promise.\n * @return {Child}\n */\n\nvar _default = (_ref) => {\n  let iframe = _ref.iframe,\n      _ref$methods = _ref.methods,\n      methods = _ref$methods === void 0 ? {} : _ref$methods,\n      childOrigin = _ref.childOrigin,\n      timeout = _ref.timeout,\n      debug = _ref.debug;\n  const log = (0, _createLogger.default)(debug);\n  const parent = window;\n\n  const _createDestructor = (0, _createDestructor2.default)(),\n        destroy = _createDestructor.destroy,\n        onDestroy = _createDestructor.onDestroy;\n\n  if (!childOrigin) {\n    if (!iframe.src && !iframe.srcdoc) {\n      const error = new Error('Iframe must have src or srcdoc property defined.');\n      error.code = _errorCodes.ERR_NO_IFRAME_SRC;\n      throw error;\n    }\n\n    childOrigin = (0, _getOriginFromSrc.default)(iframe.src);\n  } // If event.origin is \"null\", the remote protocol is\n  // file:, data:, and we must post messages with \"*\" as targetOrigin\n  // when sending and allow\n  // [1] https://developer.mozilla.org/fr/docs/Web/API/Window/postMessage#Utiliser_window.postMessage_dans_les_extensions\n\n\n  const originForSending = childOrigin === 'null' ? '*' : childOrigin;\n  const promise = new Promise((resolveConnectionPromise, reject) => {\n    let connectionTimeoutId;\n\n    if (timeout !== undefined) {\n      connectionTimeoutId = setTimeout(() => {\n        const error = new Error(`Connection to child timed out after ${timeout}ms`);\n        error.code = _errorCodes.ERR_CONNECTION_TIMEOUT;\n        reject(error);\n        destroy();\n      }, timeout);\n    } // We resolve the promise with the call sender. If the child reconnects (for example, after\n    // refreshing or navigating to another page that uses Penpal, we'll update the call sender\n    // with methods that match the latest provided by the child.\n\n\n    const callSender = {};\n    let receiverMethodNames;\n    let destroyCallReceiver;\n\n    const handleMessage = event => {\n      const child = iframe.contentWindow;\n\n      if (event.source !== child || event.data.penpal !== _constants.HANDSHAKE) {\n        return;\n      }\n\n      if (event.origin !== childOrigin) {\n        log(`Parent received handshake from origin ${event.origin} which did not match expected origin ${childOrigin}`);\n        return;\n      }\n\n      log('Parent: Received handshake, sending reply');\n      event.source.postMessage({\n        penpal: _constants.HANDSHAKE_REPLY,\n        methodNames: Object.keys(methods)\n      }, originForSending);\n      const info = {\n        localName: 'Parent',\n        local: parent,\n        remote: child,\n        originForSending: originForSending,\n        originForReceiving: childOrigin\n      }; // If the child reconnected, we need to destroy the previous call receiver before setting\n      // up a new one.\n\n      if (destroyCallReceiver) {\n        destroyCallReceiver();\n      }\n\n      destroyCallReceiver = (0, _connectCallReceiver.default)(info, methods, log);\n      onDestroy(destroyCallReceiver); // If the child reconnected, we need to remove the methods from the previous call receiver\n      // off the sender.\n\n      if (receiverMethodNames) {\n        receiverMethodNames.forEach(receiverMethodName => {\n          delete callSender[receiverMethodName];\n        });\n      }\n\n      receiverMethodNames = event.data.methodNames;\n      const destroyCallSender = (0, _connectCallSender.default)(callSender, info, receiverMethodNames, destroy, log);\n      onDestroy(destroyCallSender);\n      clearTimeout(connectionTimeoutId);\n      resolveConnectionPromise(callSender);\n    };\n\n    parent.addEventListener(_constants.MESSAGE, handleMessage);\n    log('Parent: Awaiting handshake'); // This is to prevent memory leaks when the iframe is removed\n    // from the document and the consumer hasn't called destroy().\n    // Without this, event listeners attached to the window would\n    // stick around and since the event handlers have a reference\n    // to the iframe in their closures, the iframe would stick around\n    // too.\n\n    var checkIframeInDocIntervalId = setInterval(() => {\n      if (!document.contains(iframe)) {\n        clearInterval(checkIframeInDocIntervalId);\n        destroy();\n      }\n    }, CHECK_IFRAME_IN_DOC_INTERVAL);\n    onDestroy(() => {\n      parent.removeEventListener(_constants.MESSAGE, handleMessage);\n      clearInterval(checkIframeInDocIntervalId);\n      const error = new Error('Connection destroyed');\n      error.code = _errorCodes.ERR_CONNECTION_DESTROYED;\n      reject(error);\n    });\n  });\n  return {\n    promise,\n    destroy\n  };\n};\n\nexports.default = _default;\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DATA_CLONE_ERROR = exports.MESSAGE = exports.REJECTED = exports.FULFILLED = exports.REPLY = exports.CALL = exports.HANDSHAKE_REPLY = exports.HANDSHAKE = void 0;\nconst HANDSHAKE = 'handshake';\nexports.HANDSHAKE = HANDSHAKE;\nconst HANDSHAKE_REPLY = 'handshake-reply';\nexports.HANDSHAKE_REPLY = HANDSHAKE_REPLY;\nconst CALL = 'call';\nexports.CALL = CALL;\nconst REPLY = 'reply';\nexports.REPLY = REPLY;\nconst FULFILLED = 'fulfilled';\nexports.FULFILLED = FULFILLED;\nconst REJECTED = 'rejected';\nexports.REJECTED = REJECTED;\nconst MESSAGE = 'message';\nexports.MESSAGE = MESSAGE;\nconst DATA_CLONE_ERROR = 'DataCloneError';\nexports.DATA_CLONE_ERROR = DATA_CLONE_ERROR;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _default = () => {\n  const callbacks = [];\n  let destroyed = false;\n  return {\n    destroy() {\n      destroyed = true;\n      callbacks.forEach(callback => {\n        callback();\n      });\n    },\n\n    onDestroy(callback) {\n      destroyed ? callback() : callbacks.push(callback);\n    }\n\n  };\n};\n\nexports.default = _default;\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _default = debug => {\n  return function () {\n    if (debug) {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      console.log('[Penpal]', ...args); // eslint-disable-line no-console\n    }\n  };\n};\n\nexports.default = _default;\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ERR_NO_IFRAME_SRC = exports.ERR_NOT_IN_IFRAME = exports.ERR_CONNECTION_TIMEOUT = exports.ERR_CONNECTION_DESTROYED = void 0;\nconst ERR_CONNECTION_DESTROYED = 'ConnectionDestroyed';\nexports.ERR_CONNECTION_DESTROYED = ERR_CONNECTION_DESTROYED;\nconst ERR_CONNECTION_TIMEOUT = 'ConnectionTimeout';\nexports.ERR_CONNECTION_TIMEOUT = ERR_CONNECTION_TIMEOUT;\nconst ERR_NOT_IN_IFRAME = 'NotInIframe';\nexports.ERR_NOT_IN_IFRAME = ERR_NOT_IN_IFRAME;\nconst ERR_NO_IFRAME_SRC = 'NoIframeSrc';\nexports.ERR_NO_IFRAME_SRC = ERR_NO_IFRAME_SRC;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.deserializeError = exports.serializeError = void 0;\n\n/**\n * Converts an error object into a plain object.\n * @param {Error} Error object.\n * @returns {Object}\n */\nconst serializeError = (_ref) => {\n  let name = _ref.name,\n      message = _ref.message,\n      stack = _ref.stack;\n  return {\n    name,\n    message,\n    stack\n  };\n};\n/**\n * Converts a plain object into an error object.\n * @param {Object} Object with error properties.\n * @returns {Error}\n */\n\n\nexports.serializeError = serializeError;\n\nconst deserializeError = obj => {\n  const deserializedError = new Error();\n  Object.keys(obj).forEach(key => deserializedError[key] = obj[key]);\n  return deserializedError;\n};\n\nexports.deserializeError = deserializeError;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nlet id = 0;\n/**\n * @return {number} A unique ID (not universally unique)\n */\n\nvar _default = () => ++id;\n\nexports.default = _default;\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nconst DEFAULT_PORTS = {\n  'http:': '80',\n  'https:': '443'\n};\nconst URL_REGEX = /^(https?:)?\\/\\/([^/:]+)?(:(\\d+))?/;\nconst opaqueOriginSchemes = ['file:', 'data:'];\n/**\n * Converts a src value into an origin.\n * @param {string} src\n * @return {string} The URL's origin\n */\n\nvar _default = src => {\n  if (src && opaqueOriginSchemes.find(scheme => src.startsWith(scheme))) {\n    // The origin of the child document is an opaque origin and its\n    // serialization is \"null\"\n    // https://html.spec.whatwg.org/multipage/origin.html#origin\n    return 'null';\n  } // Note that if src is undefined, then srcdoc is being used instead of src\n  // and we can follow this same logic below to get the origin of the parent,\n  // which is the origin that we will need to use.\n\n\n  const location = document.location;\n  const regexResult = URL_REGEX.exec(src);\n  let protocol;\n  let hostname;\n  let port;\n\n  if (regexResult) {\n    // It's an absolute URL. Use the parsed info.\n    // regexResult[1] will be undefined if the URL starts with //\n    protocol = regexResult[1] ? regexResult[1] : location.protocol;\n    hostname = regexResult[2];\n    port = regexResult[4];\n  } else {\n    // It's a relative path. Use the current location's info.\n    protocol = location.protocol;\n    hostname = location.hostname;\n    port = location.port;\n  } // If the port is the default for the protocol, we don't want to add it to the origin string\n  // or it won't match the message's event.origin.\n\n\n  const portSuffix = port && port !== DEFAULT_PORTS[protocol] ? `:${port}` : '';\n  return `${protocol}//${hostname}${portSuffix}`;\n};\n\nexports.default = _default;\nmodule.exports = exports.default;","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","/*\n * QRious v4.0.2\n * Copyright (C) 2017 Alasdair Mercer\n * Copyright (C) 2010 Tom Zerucha\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global.QRious = factory());\n}(this, (function () { 'use strict';\n\n  /*\n   * Copyright (C) 2017 Alasdair Mercer, !ninja\n   *\n   * Permission is hereby granted, free of charge, to any person obtaining a copy\n   * of this software and associated documentation files (the \"Software\"), to deal\n   * in the Software without restriction, including without limitation the rights\n   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n   * copies of the Software, and to permit persons to whom the Software is\n   * furnished to do so, subject to the following conditions:\n   *\n   * The above copyright notice and this permission notice shall be included in all\n   * copies or substantial portions of the Software.\n   *\n   * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n   * SOFTWARE.\n   */\n\n  /**\n   * A bare-bones constructor for surrogate prototype swapping.\n   *\n   * @private\n   * @constructor\n   */\n  var Constructor = /* istanbul ignore next */ function() {};\n  /**\n   * A reference to <code>Object.prototype.hasOwnProperty</code>.\n   *\n   * @private\n   * @type {Function}\n   */\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n  /**\n   * A reference to <code>Array.prototype.slice</code>.\n   *\n   * @private\n   * @type {Function}\n   */\n  var slice = Array.prototype.slice;\n\n  /**\n   * Creates an object which inherits the given <code>prototype</code>.\n   *\n   * Optionally, the created object can be extended further with the specified <code>properties</code>.\n   *\n   * @param {Object} prototype - the prototype to be inherited by the created object\n   * @param {Object} [properties] - the optional properties to be extended by the created object\n   * @return {Object} The newly created object.\n   * @private\n   */\n  function createObject(prototype, properties) {\n    var result;\n    /* istanbul ignore next */\n    if (typeof Object.create === 'function') {\n      result = Object.create(prototype);\n    } else {\n      Constructor.prototype = prototype;\n      result = new Constructor();\n      Constructor.prototype = null;\n    }\n\n    if (properties) {\n      extendObject(true, result, properties);\n    }\n\n    return result;\n  }\n\n  /**\n   * Extends the constructor to which this method is associated with the <code>prototype</code> and/or\n   * <code>statics</code> provided.\n   *\n   * If <code>name</code> is provided, it will be used as the class name and can be accessed via a special\n   * <code>class_</code> property on the child constructor, otherwise the class name of the super constructor will be used\n   * instead. The class name may also be used string representation for instances of the child constructor (via\n   * <code>toString</code>), but this is not applicable to the <i>lite</i> version of Nevis.\n   *\n   * If <code>constructor</code> is provided, it will be used as the constructor for the child, otherwise a simple\n   * constructor which only calls the super constructor will be used instead.\n   *\n   * The super constructor can be accessed via a special <code>super_</code> property on the child constructor.\n   *\n   * @param {string} [name=this.class_] - the class name to be used for the child constructor\n   * @param {Function} [constructor] - the constructor for the child\n   * @param {Object} [prototype] - the prototype properties to be defined for the child\n   * @param {Object} [statics] - the static properties to be defined for the child\n   * @return {Function} The child <code>constructor</code> provided or the one created if none was given.\n   * @public\n   */\n  function extend(name, constructor, prototype, statics) {\n    var superConstructor = this;\n\n    if (typeof name !== 'string') {\n      statics = prototype;\n      prototype = constructor;\n      constructor = name;\n      name = null;\n    }\n\n    if (typeof constructor !== 'function') {\n      statics = prototype;\n      prototype = constructor;\n      constructor = function() {\n        return superConstructor.apply(this, arguments);\n      };\n    }\n\n    extendObject(false, constructor, superConstructor, statics);\n\n    constructor.prototype = createObject(superConstructor.prototype, prototype);\n    constructor.prototype.constructor = constructor;\n\n    constructor.class_ = name || superConstructor.class_;\n    constructor.super_ = superConstructor;\n\n    return constructor;\n  }\n\n  /**\n   * Extends the specified <code>target</code> object with the properties in each of the <code>sources</code> provided.\n   *\n   * if any source is <code>null</code> it will be ignored.\n   *\n   * @param {boolean} own - <code>true</code> to only copy <b>own</b> properties from <code>sources</code> onto\n   * <code>target</code>; otherwise <code>false</code>\n   * @param {Object} target - the target object which should be extended\n   * @param {...Object} [sources] - the source objects whose properties are to be copied onto <code>target</code>\n   * @return {void}\n   * @private\n   */\n  function extendObject(own, target, sources) {\n    sources = slice.call(arguments, 2);\n\n    var property;\n    var source;\n\n    for (var i = 0, length = sources.length; i < length; i++) {\n      source = sources[i];\n\n      for (property in source) {\n        if (!own || hasOwnProperty.call(source, property)) {\n          target[property] = source[property];\n        }\n      }\n    }\n  }\n\n  var extend_1 = extend;\n\n  /**\n   * The base class from which all others should extend.\n   *\n   * @public\n   * @constructor\n   */\n  function Nevis() {}\n  Nevis.class_ = 'Nevis';\n  Nevis.super_ = Object;\n\n  /**\n   * Extends the constructor to which this method is associated with the <code>prototype</code> and/or\n   * <code>statics</code> provided.\n   *\n   * If <code>name</code> is provided, it will be used as the class name and can be accessed via a special\n   * <code>class_</code> property on the child constructor, otherwise the class name of the super constructor will be used\n   * instead. The class name may also be used string representation for instances of the child constructor (via\n   * <code>toString</code>), but this is not applicable to the <i>lite</i> version of Nevis.\n   *\n   * If <code>constructor</code> is provided, it will be used as the constructor for the child, otherwise a simple\n   * constructor which only calls the super constructor will be used instead.\n   *\n   * The super constructor can be accessed via a special <code>super_</code> property on the child constructor.\n   *\n   * @param {string} [name=this.class_] - the class name to be used for the child constructor\n   * @param {Function} [constructor] - the constructor for the child\n   * @param {Object} [prototype] - the prototype properties to be defined for the child\n   * @param {Object} [statics] - the static properties to be defined for the child\n   * @return {Function} The child <code>constructor</code> provided or the one created if none was given.\n   * @public\n   * @static\n   * @memberof Nevis\n   */\n  Nevis.extend = extend_1;\n\n  var nevis = Nevis;\n\n  var lite = nevis;\n\n  /**\n   * Responsible for rendering a QR code {@link Frame} on a specific type of element.\n   *\n   * A renderer may be dependant on the rendering of another element, so the ordering of their execution is important.\n   *\n   * The rendering of a element can be deferred by disabling the renderer initially, however, any attempt get the element\n   * from the renderer will result in it being immediately enabled and the element being rendered.\n   *\n   * @param {QRious} qrious - the {@link QRious} instance to be used\n   * @param {*} element - the element onto which the QR code is to be rendered\n   * @param {boolean} [enabled] - <code>true</code> this {@link Renderer} is enabled; otherwise <code>false</code>.\n   * @public\n   * @class\n   * @extends Nevis\n   */\n  var Renderer = lite.extend(function(qrious, element, enabled) {\n    /**\n     * The {@link QRious} instance.\n     *\n     * @protected\n     * @type {QRious}\n     * @memberof Renderer#\n     */\n    this.qrious = qrious;\n\n    /**\n     * The element onto which this {@link Renderer} is rendering the QR code.\n     *\n     * @protected\n     * @type {*}\n     * @memberof Renderer#\n     */\n    this.element = element;\n    this.element.qrious = qrious;\n\n    /**\n     * Whether this {@link Renderer} is enabled.\n     *\n     * @protected\n     * @type {boolean}\n     * @memberof Renderer#\n     */\n    this.enabled = Boolean(enabled);\n  }, {\n\n    /**\n     * Draws the specified QR code <code>frame</code> on the underlying element.\n     *\n     * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.\n     *\n     * @param {Frame} frame - the {@link Frame} to be drawn\n     * @return {void}\n     * @protected\n     * @abstract\n     * @memberof Renderer#\n     */\n    draw: function(frame) {},\n\n    /**\n     * Returns the element onto which this {@link Renderer} is rendering the QR code.\n     *\n     * If this method is called while this {@link Renderer} is disabled, it will be immediately enabled and rendered\n     * before the element is returned.\n     *\n     * @return {*} The element.\n     * @public\n     * @memberof Renderer#\n     */\n    getElement: function() {\n      if (!this.enabled) {\n        this.enabled = true;\n        this.render();\n      }\n\n      return this.element;\n    },\n\n    /**\n     * Calculates the size (in pixel units) to represent an individual module within the QR code based on the\n     * <code>frame</code> provided.\n     *\n     * Any configured padding will be excluded from the returned size.\n     *\n     * The returned value will be at least one, even in cases where the size of the QR code does not fit its contents.\n     * This is done so that the inevitable clipping is handled more gracefully since this way at least something is\n     * displayed instead of just a blank space filled by the background color.\n     *\n     * @param {Frame} frame - the {@link Frame} from which the module size is to be derived\n     * @return {number} The pixel size for each module in the QR code which will be no less than one.\n     * @protected\n     * @memberof Renderer#\n     */\n    getModuleSize: function(frame) {\n      var qrious = this.qrious;\n      var padding = qrious.padding || 0;\n      var pixels = Math.floor((qrious.size - (padding * 2)) / frame.width);\n\n      return Math.max(1, pixels);\n    },\n\n    /**\n     * Calculates the offset/padding (in pixel units) to be inserted before the QR code based on the <code>frame</code>\n     * provided.\n     *\n     * The returned value will be zero if there is no available offset or if the size of the QR code does not fit its\n     * contents. It will never be a negative value. This is done so that the inevitable clipping appears more naturally\n     * and it is not clipped from all directions.\n     *\n     * @param {Frame} frame - the {@link Frame} from which the offset is to be derived\n     * @return {number} The pixel offset for the QR code which will be no less than zero.\n     * @protected\n     * @memberof Renderer#\n     */\n    getOffset: function(frame) {\n      var qrious = this.qrious;\n      var padding = qrious.padding;\n\n      if (padding != null) {\n        return padding;\n      }\n\n      var moduleSize = this.getModuleSize(frame);\n      var offset = Math.floor((qrious.size - (moduleSize * frame.width)) / 2);\n\n      return Math.max(0, offset);\n    },\n\n    /**\n     * Renders a QR code on the underlying element based on the <code>frame</code> provided.\n     *\n     * @param {Frame} frame - the {@link Frame} to be rendered\n     * @return {void}\n     * @public\n     * @memberof Renderer#\n     */\n    render: function(frame) {\n      if (this.enabled) {\n        this.resize();\n        this.reset();\n        this.draw(frame);\n      }\n    },\n\n    /**\n     * Resets the underlying element, effectively clearing any previously rendered QR code.\n     *\n     * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.\n     *\n     * @return {void}\n     * @protected\n     * @abstract\n     * @memberof Renderer#\n     */\n    reset: function() {},\n\n    /**\n     * Ensures that the size of the underlying element matches that defined on the associated {@link QRious} instance.\n     *\n     * Implementations of {@link Renderer} <b>must</b> override this method with their own specific logic.\n     *\n     * @return {void}\n     * @protected\n     * @abstract\n     * @memberof Renderer#\n     */\n    resize: function() {}\n\n  });\n\n  var Renderer_1 = Renderer;\n\n  /**\n   * An implementation of {@link Renderer} for working with <code>canvas</code> elements.\n   *\n   * @public\n   * @class\n   * @extends Renderer\n   */\n  var CanvasRenderer = Renderer_1.extend({\n\n    /**\n     * @override\n     */\n    draw: function(frame) {\n      var i, j;\n      var qrious = this.qrious;\n      var moduleSize = this.getModuleSize(frame);\n      var offset = this.getOffset(frame);\n      var context = this.element.getContext('2d');\n\n      context.fillStyle = qrious.foreground;\n      context.globalAlpha = qrious.foregroundAlpha;\n\n      for (i = 0; i < frame.width; i++) {\n        for (j = 0; j < frame.width; j++) {\n          if (frame.buffer[(j * frame.width) + i]) {\n            context.fillRect((moduleSize * i) + offset, (moduleSize * j) + offset, moduleSize, moduleSize);\n          }\n        }\n      }\n    },\n\n    /**\n     * @override\n     */\n    reset: function() {\n      var qrious = this.qrious;\n      var context = this.element.getContext('2d');\n      var size = qrious.size;\n\n      context.lineWidth = 1;\n      context.clearRect(0, 0, size, size);\n      context.fillStyle = qrious.background;\n      context.globalAlpha = qrious.backgroundAlpha;\n      context.fillRect(0, 0, size, size);\n    },\n\n    /**\n     * @override\n     */\n    resize: function() {\n      var element = this.element;\n\n      element.width = element.height = this.qrious.size;\n    }\n\n  });\n\n  var CanvasRenderer_1 = CanvasRenderer;\n\n  /* eslint no-multi-spaces: \"off\" */\n\n\n\n  /**\n   * Contains alignment pattern information.\n   *\n   * @public\n   * @class\n   * @extends Nevis\n   */\n  var Alignment = lite.extend(null, {\n\n    /**\n     * The alignment pattern block.\n     *\n     * @public\n     * @static\n     * @type {number[]}\n     * @memberof Alignment\n     */\n    BLOCK: [\n      0,  11, 15, 19, 23, 27, 31,\n      16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,\n      26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28\n    ]\n\n  });\n\n  var Alignment_1 = Alignment;\n\n  /* eslint no-multi-spaces: \"off\" */\n\n\n\n  /**\n   * Contains error correction information.\n   *\n   * @public\n   * @class\n   * @extends Nevis\n   */\n  var ErrorCorrection = lite.extend(null, {\n\n    /**\n     * The error correction blocks.\n     *\n     * There are four elements per version. The first two indicate the number of blocks, then the data width, and finally\n     * the ECC width.\n     *\n     * @public\n     * @static\n     * @type {number[]}\n     * @memberof ErrorCorrection\n     */\n    BLOCKS: [\n      1,  0,  19,  7,     1,  0,  16,  10,    1,  0,  13,  13,    1,  0,  9,   17,\n      1,  0,  34,  10,    1,  0,  28,  16,    1,  0,  22,  22,    1,  0,  16,  28,\n      1,  0,  55,  15,    1,  0,  44,  26,    2,  0,  17,  18,    2,  0,  13,  22,\n      1,  0,  80,  20,    2,  0,  32,  18,    2,  0,  24,  26,    4,  0,  9,   16,\n      1,  0,  108, 26,    2,  0,  43,  24,    2,  2,  15,  18,    2,  2,  11,  22,\n      2,  0,  68,  18,    4,  0,  27,  16,    4,  0,  19,  24,    4,  0,  15,  28,\n      2,  0,  78,  20,    4,  0,  31,  18,    2,  4,  14,  18,    4,  1,  13,  26,\n      2,  0,  97,  24,    2,  2,  38,  22,    4,  2,  18,  22,    4,  2,  14,  26,\n      2,  0,  116, 30,    3,  2,  36,  22,    4,  4,  16,  20,    4,  4,  12,  24,\n      2,  2,  68,  18,    4,  1,  43,  26,    6,  2,  19,  24,    6,  2,  15,  28,\n      4,  0,  81,  20,    1,  4,  50,  30,    4,  4,  22,  28,    3,  8,  12,  24,\n      2,  2,  92,  24,    6,  2,  36,  22,    4,  6,  20,  26,    7,  4,  14,  28,\n      4,  0,  107, 26,    8,  1,  37,  22,    8,  4,  20,  24,    12, 4,  11,  22,\n      3,  1,  115, 30,    4,  5,  40,  24,    11, 5,  16,  20,    11, 5,  12,  24,\n      5,  1,  87,  22,    5,  5,  41,  24,    5,  7,  24,  30,    11, 7,  12,  24,\n      5,  1,  98,  24,    7,  3,  45,  28,    15, 2,  19,  24,    3,  13, 15,  30,\n      1,  5,  107, 28,    10, 1,  46,  28,    1,  15, 22,  28,    2,  17, 14,  28,\n      5,  1,  120, 30,    9,  4,  43,  26,    17, 1,  22,  28,    2,  19, 14,  28,\n      3,  4,  113, 28,    3,  11, 44,  26,    17, 4,  21,  26,    9,  16, 13,  26,\n      3,  5,  107, 28,    3,  13, 41,  26,    15, 5,  24,  30,    15, 10, 15,  28,\n      4,  4,  116, 28,    17, 0,  42,  26,    17, 6,  22,  28,    19, 6,  16,  30,\n      2,  7,  111, 28,    17, 0,  46,  28,    7,  16, 24,  30,    34, 0,  13,  24,\n      4,  5,  121, 30,    4,  14, 47,  28,    11, 14, 24,  30,    16, 14, 15,  30,\n      6,  4,  117, 30,    6,  14, 45,  28,    11, 16, 24,  30,    30, 2,  16,  30,\n      8,  4,  106, 26,    8,  13, 47,  28,    7,  22, 24,  30,    22, 13, 15,  30,\n      10, 2,  114, 28,    19, 4,  46,  28,    28, 6,  22,  28,    33, 4,  16,  30,\n      8,  4,  122, 30,    22, 3,  45,  28,    8,  26, 23,  30,    12, 28, 15,  30,\n      3,  10, 117, 30,    3,  23, 45,  28,    4,  31, 24,  30,    11, 31, 15,  30,\n      7,  7,  116, 30,    21, 7,  45,  28,    1,  37, 23,  30,    19, 26, 15,  30,\n      5,  10, 115, 30,    19, 10, 47,  28,    15, 25, 24,  30,    23, 25, 15,  30,\n      13, 3,  115, 30,    2,  29, 46,  28,    42, 1,  24,  30,    23, 28, 15,  30,\n      17, 0,  115, 30,    10, 23, 46,  28,    10, 35, 24,  30,    19, 35, 15,  30,\n      17, 1,  115, 30,    14, 21, 46,  28,    29, 19, 24,  30,    11, 46, 15,  30,\n      13, 6,  115, 30,    14, 23, 46,  28,    44, 7,  24,  30,    59, 1,  16,  30,\n      12, 7,  121, 30,    12, 26, 47,  28,    39, 14, 24,  30,    22, 41, 15,  30,\n      6,  14, 121, 30,    6,  34, 47,  28,    46, 10, 24,  30,    2,  64, 15,  30,\n      17, 4,  122, 30,    29, 14, 46,  28,    49, 10, 24,  30,    24, 46, 15,  30,\n      4,  18, 122, 30,    13, 32, 46,  28,    48, 14, 24,  30,    42, 32, 15,  30,\n      20, 4,  117, 30,    40, 7,  47,  28,    43, 22, 24,  30,    10, 67, 15,  30,\n      19, 6,  118, 30,    18, 31, 47,  28,    34, 34, 24,  30,    20, 61, 15,  30\n    ],\n\n    /**\n     * The final format bits with mask (level << 3 | mask).\n     *\n     * @public\n     * @static\n     * @type {number[]}\n     * @memberof ErrorCorrection\n     */\n    FINAL_FORMAT: [\n      // L\n      0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976,\n      // M\n      0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0,\n      // Q\n      0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed,\n      // H\n      0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b\n    ],\n\n    /**\n     * A map of human-readable ECC levels.\n     *\n     * @public\n     * @static\n     * @type {Object.<string, number>}\n     * @memberof ErrorCorrection\n     */\n    LEVELS: {\n      L: 1,\n      M: 2,\n      Q: 3,\n      H: 4\n    }\n\n  });\n\n  var ErrorCorrection_1 = ErrorCorrection;\n\n  /**\n   * Contains Galois field information.\n   *\n   * @public\n   * @class\n   * @extends Nevis\n   */\n  var Galois = lite.extend(null, {\n\n    /**\n     * The Galois field exponent table.\n     *\n     * @public\n     * @static\n     * @type {number[]}\n     * @memberof Galois\n     */\n    EXPONENT: [\n      0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,\n      0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,\n      0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,\n      0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,\n      0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,\n      0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,\n      0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,\n      0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,\n      0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,\n      0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,\n      0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,\n      0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,\n      0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,\n      0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,\n      0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,\n      0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00\n    ],\n\n    /**\n     * The Galois field log table.\n     *\n     * @public\n     * @static\n     * @type {number[]}\n     * @memberof Galois\n     */\n    LOG: [\n      0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,\n      0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,\n      0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,\n      0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,\n      0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,\n      0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,\n      0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,\n      0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,\n      0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,\n      0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,\n      0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,\n      0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,\n      0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,\n      0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,\n      0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,\n      0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf\n    ]\n\n  });\n\n  var Galois_1 = Galois;\n\n  /**\n   * Contains version pattern information.\n   *\n   * @public\n   * @class\n   * @extends Nevis\n   */\n  var Version = lite.extend(null, {\n\n    /**\n     * The version pattern block.\n     *\n     * @public\n     * @static\n     * @type {number[]}\n     * @memberof Version\n     */\n    BLOCK: [\n      0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d, 0x928, 0xb78, 0x45d, 0xa17, 0x532,\n      0x9a6, 0x683, 0x8c9, 0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75, 0x250, 0x9d5,\n      0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64, 0x541, 0xc69\n    ]\n\n  });\n\n  var Version_1 = Version;\n\n  /**\n   * Generates information for a QR code frame based on a specific value to be encoded.\n   *\n   * @param {Frame~Options} options - the options to be used\n   * @public\n   * @class\n   * @extends Nevis\n   */\n  var Frame = lite.extend(function(options) {\n    var dataBlock, eccBlock, index, neccBlock1, neccBlock2;\n    var valueLength = options.value.length;\n\n    this._badness = [];\n    this._level = ErrorCorrection_1.LEVELS[options.level];\n    this._polynomial = [];\n    this._value = options.value;\n    this._version = 0;\n    this._stringBuffer = [];\n\n    while (this._version < 40) {\n      this._version++;\n\n      index = ((this._level - 1) * 4) + ((this._version - 1) * 16);\n\n      neccBlock1 = ErrorCorrection_1.BLOCKS[index++];\n      neccBlock2 = ErrorCorrection_1.BLOCKS[index++];\n      dataBlock = ErrorCorrection_1.BLOCKS[index++];\n      eccBlock = ErrorCorrection_1.BLOCKS[index];\n\n      index = (dataBlock * (neccBlock1 + neccBlock2)) + neccBlock2 - 3 + (this._version <= 9);\n\n      if (valueLength <= index) {\n        break;\n      }\n    }\n\n    this._dataBlock = dataBlock;\n    this._eccBlock = eccBlock;\n    this._neccBlock1 = neccBlock1;\n    this._neccBlock2 = neccBlock2;\n\n    /**\n     * The data width is based on version.\n     *\n     * @public\n     * @type {number}\n     * @memberof Frame#\n     */\n    // FIXME: Ensure that it fits instead of being truncated.\n    var width = this.width = 17 + (4 * this._version);\n\n    /**\n     * The image buffer.\n     *\n     * @public\n     * @type {number[]}\n     * @memberof Frame#\n     */\n    this.buffer = Frame._createArray(width * width);\n\n    this._ecc = Frame._createArray(dataBlock + ((dataBlock + eccBlock) * (neccBlock1 + neccBlock2)) + neccBlock2);\n    this._mask = Frame._createArray(((width * (width + 1)) + 1) / 2);\n\n    this._insertFinders();\n    this._insertAlignments();\n\n    // Insert single foreground cell.\n    this.buffer[8 + (width * (width - 8))] = 1;\n\n    this._insertTimingGap();\n    this._reverseMask();\n    this._insertTimingRowAndColumn();\n    this._insertVersion();\n    this._syncMask();\n    this._convertBitStream(valueLength);\n    this._calculatePolynomial();\n    this._appendEccToData();\n    this._interleaveBlocks();\n    this._pack();\n    this._finish();\n  }, {\n\n    _addAlignment: function(x, y) {\n      var i;\n      var buffer = this.buffer;\n      var width = this.width;\n\n      buffer[x + (width * y)] = 1;\n\n      for (i = -2; i < 2; i++) {\n        buffer[x + i + (width * (y - 2))] = 1;\n        buffer[x - 2 + (width * (y + i + 1))] = 1;\n        buffer[x + 2 + (width * (y + i))] = 1;\n        buffer[x + i + 1 + (width * (y + 2))] = 1;\n      }\n\n      for (i = 0; i < 2; i++) {\n        this._setMask(x - 1, y + i);\n        this._setMask(x + 1, y - i);\n        this._setMask(x - i, y - 1);\n        this._setMask(x + i, y + 1);\n      }\n    },\n\n    _appendData: function(data, dataLength, ecc, eccLength) {\n      var bit, i, j;\n      var polynomial = this._polynomial;\n      var stringBuffer = this._stringBuffer;\n\n      for (i = 0; i < eccLength; i++) {\n        stringBuffer[ecc + i] = 0;\n      }\n\n      for (i = 0; i < dataLength; i++) {\n        bit = Galois_1.LOG[stringBuffer[data + i] ^ stringBuffer[ecc]];\n\n        if (bit !== 255) {\n          for (j = 1; j < eccLength; j++) {\n            stringBuffer[ecc + j - 1] = stringBuffer[ecc + j] ^\n              Galois_1.EXPONENT[Frame._modN(bit + polynomial[eccLength - j])];\n          }\n        } else {\n          for (j = ecc; j < ecc + eccLength; j++) {\n            stringBuffer[j] = stringBuffer[j + 1];\n          }\n        }\n\n        stringBuffer[ecc + eccLength - 1] = bit === 255 ? 0 : Galois_1.EXPONENT[Frame._modN(bit + polynomial[0])];\n      }\n    },\n\n    _appendEccToData: function() {\n      var i;\n      var data = 0;\n      var dataBlock = this._dataBlock;\n      var ecc = this._calculateMaxLength();\n      var eccBlock = this._eccBlock;\n\n      for (i = 0; i < this._neccBlock1; i++) {\n        this._appendData(data, dataBlock, ecc, eccBlock);\n\n        data += dataBlock;\n        ecc += eccBlock;\n      }\n\n      for (i = 0; i < this._neccBlock2; i++) {\n        this._appendData(data, dataBlock + 1, ecc, eccBlock);\n\n        data += dataBlock + 1;\n        ecc += eccBlock;\n      }\n    },\n\n    _applyMask: function(mask) {\n      var r3x, r3y, x, y;\n      var buffer = this.buffer;\n      var width = this.width;\n\n      switch (mask) {\n      case 0:\n        for (y = 0; y < width; y++) {\n          for (x = 0; x < width; x++) {\n            if (!((x + y) & 1) && !this._isMasked(x, y)) {\n              buffer[x + (y * width)] ^= 1;\n            }\n          }\n        }\n\n        break;\n      case 1:\n        for (y = 0; y < width; y++) {\n          for (x = 0; x < width; x++) {\n            if (!(y & 1) && !this._isMasked(x, y)) {\n              buffer[x + (y * width)] ^= 1;\n            }\n          }\n        }\n\n        break;\n      case 2:\n        for (y = 0; y < width; y++) {\n          for (r3x = 0, x = 0; x < width; x++, r3x++) {\n            if (r3x === 3) {\n              r3x = 0;\n            }\n\n            if (!r3x && !this._isMasked(x, y)) {\n              buffer[x + (y * width)] ^= 1;\n            }\n          }\n        }\n\n        break;\n      case 3:\n        for (r3y = 0, y = 0; y < width; y++, r3y++) {\n          if (r3y === 3) {\n            r3y = 0;\n          }\n\n          for (r3x = r3y, x = 0; x < width; x++, r3x++) {\n            if (r3x === 3) {\n              r3x = 0;\n            }\n\n            if (!r3x && !this._isMasked(x, y)) {\n              buffer[x + (y * width)] ^= 1;\n            }\n          }\n        }\n\n        break;\n      case 4:\n        for (y = 0; y < width; y++) {\n          for (r3x = 0, r3y = (y >> 1) & 1, x = 0; x < width; x++, r3x++) {\n            if (r3x === 3) {\n              r3x = 0;\n              r3y = !r3y;\n            }\n\n            if (!r3y && !this._isMasked(x, y)) {\n              buffer[x + (y * width)] ^= 1;\n            }\n          }\n        }\n\n        break;\n      case 5:\n        for (r3y = 0, y = 0; y < width; y++, r3y++) {\n          if (r3y === 3) {\n            r3y = 0;\n          }\n\n          for (r3x = 0, x = 0; x < width; x++, r3x++) {\n            if (r3x === 3) {\n              r3x = 0;\n            }\n\n            if (!((x & y & 1) + !(!r3x | !r3y)) && !this._isMasked(x, y)) {\n              buffer[x + (y * width)] ^= 1;\n            }\n          }\n        }\n\n        break;\n      case 6:\n        for (r3y = 0, y = 0; y < width; y++, r3y++) {\n          if (r3y === 3) {\n            r3y = 0;\n          }\n\n          for (r3x = 0, x = 0; x < width; x++, r3x++) {\n            if (r3x === 3) {\n              r3x = 0;\n            }\n\n            if (!((x & y & 1) + (r3x && r3x === r3y) & 1) && !this._isMasked(x, y)) {\n              buffer[x + (y * width)] ^= 1;\n            }\n          }\n        }\n\n        break;\n      case 7:\n        for (r3y = 0, y = 0; y < width; y++, r3y++) {\n          if (r3y === 3) {\n            r3y = 0;\n          }\n\n          for (r3x = 0, x = 0; x < width; x++, r3x++) {\n            if (r3x === 3) {\n              r3x = 0;\n            }\n\n            if (!((r3x && r3x === r3y) + (x + y & 1) & 1) && !this._isMasked(x, y)) {\n              buffer[x + (y * width)] ^= 1;\n            }\n          }\n        }\n\n        break;\n      }\n    },\n\n    _calculateMaxLength: function() {\n      return (this._dataBlock * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2;\n    },\n\n    _calculatePolynomial: function() {\n      var i, j;\n      var eccBlock = this._eccBlock;\n      var polynomial = this._polynomial;\n\n      polynomial[0] = 1;\n\n      for (i = 0; i < eccBlock; i++) {\n        polynomial[i + 1] = 1;\n\n        for (j = i; j > 0; j--) {\n          polynomial[j] = polynomial[j] ? polynomial[j - 1] ^\n            Galois_1.EXPONENT[Frame._modN(Galois_1.LOG[polynomial[j]] + i)] : polynomial[j - 1];\n        }\n\n        polynomial[0] = Galois_1.EXPONENT[Frame._modN(Galois_1.LOG[polynomial[0]] + i)];\n      }\n\n      // Use logs for generator polynomial to save calculation step.\n      for (i = 0; i <= eccBlock; i++) {\n        polynomial[i] = Galois_1.LOG[polynomial[i]];\n      }\n    },\n\n    _checkBadness: function() {\n      var b, b1, h, x, y;\n      var bad = 0;\n      var badness = this._badness;\n      var buffer = this.buffer;\n      var width = this.width;\n\n      // Blocks of same colour.\n      for (y = 0; y < width - 1; y++) {\n        for (x = 0; x < width - 1; x++) {\n          // All foreground colour.\n          if ((buffer[x + (width * y)] &&\n            buffer[x + 1 + (width * y)] &&\n            buffer[x + (width * (y + 1))] &&\n            buffer[x + 1 + (width * (y + 1))]) ||\n            // All background colour.\n            !(buffer[x + (width * y)] ||\n            buffer[x + 1 + (width * y)] ||\n            buffer[x + (width * (y + 1))] ||\n            buffer[x + 1 + (width * (y + 1))])) {\n            bad += Frame.N2;\n          }\n        }\n      }\n\n      var bw = 0;\n\n      // X runs.\n      for (y = 0; y < width; y++) {\n        h = 0;\n\n        badness[0] = 0;\n\n        for (b = 0, x = 0; x < width; x++) {\n          b1 = buffer[x + (width * y)];\n\n          if (b === b1) {\n            badness[h]++;\n          } else {\n            badness[++h] = 1;\n          }\n\n          b = b1;\n          bw += b ? 1 : -1;\n        }\n\n        bad += this._getBadness(h);\n      }\n\n      if (bw < 0) {\n        bw = -bw;\n      }\n\n      var count = 0;\n      var big = bw;\n      big += big << 2;\n      big <<= 1;\n\n      while (big > width * width) {\n        big -= width * width;\n        count++;\n      }\n\n      bad += count * Frame.N4;\n\n      // Y runs.\n      for (x = 0; x < width; x++) {\n        h = 0;\n\n        badness[0] = 0;\n\n        for (b = 0, y = 0; y < width; y++) {\n          b1 = buffer[x + (width * y)];\n\n          if (b === b1) {\n            badness[h]++;\n          } else {\n            badness[++h] = 1;\n          }\n\n          b = b1;\n        }\n\n        bad += this._getBadness(h);\n      }\n\n      return bad;\n    },\n\n    _convertBitStream: function(length) {\n      var bit, i;\n      var ecc = this._ecc;\n      var version = this._version;\n\n      // Convert string to bit stream. 8-bit data to QR-coded 8-bit data (numeric, alphanumeric, or kanji not supported).\n      for (i = 0; i < length; i++) {\n        ecc[i] = this._value.charCodeAt(i);\n      }\n\n      var stringBuffer = this._stringBuffer = ecc.slice();\n      var maxLength = this._calculateMaxLength();\n\n      if (length >= maxLength - 2) {\n        length = maxLength - 2;\n\n        if (version > 9) {\n          length--;\n        }\n      }\n\n      // Shift and re-pack to insert length prefix.\n      var index = length;\n\n      if (version > 9) {\n        stringBuffer[index + 2] = 0;\n        stringBuffer[index + 3] = 0;\n\n        while (index--) {\n          bit = stringBuffer[index];\n\n          stringBuffer[index + 3] |= 255 & (bit << 4);\n          stringBuffer[index + 2] = bit >> 4;\n        }\n\n        stringBuffer[2] |= 255 & (length << 4);\n        stringBuffer[1] = length >> 4;\n        stringBuffer[0] = 0x40 | (length >> 12);\n      } else {\n        stringBuffer[index + 1] = 0;\n        stringBuffer[index + 2] = 0;\n\n        while (index--) {\n          bit = stringBuffer[index];\n\n          stringBuffer[index + 2] |= 255 & (bit << 4);\n          stringBuffer[index + 1] = bit >> 4;\n        }\n\n        stringBuffer[1] |= 255 & (length << 4);\n        stringBuffer[0] = 0x40 | (length >> 4);\n      }\n\n      // Fill to end with pad pattern.\n      index = length + 3 - (version < 10);\n\n      while (index < maxLength) {\n        stringBuffer[index++] = 0xec;\n        stringBuffer[index++] = 0x11;\n      }\n    },\n\n    _getBadness: function(length) {\n      var i;\n      var badRuns = 0;\n      var badness = this._badness;\n\n      for (i = 0; i <= length; i++) {\n        if (badness[i] >= 5) {\n          badRuns += Frame.N1 + badness[i] - 5;\n        }\n      }\n\n      // FBFFFBF as in finder.\n      for (i = 3; i < length - 1; i += 2) {\n        if (badness[i - 2] === badness[i + 2] &&\n          badness[i + 2] === badness[i - 1] &&\n          badness[i - 1] === badness[i + 1] &&\n          badness[i - 1] * 3 === badness[i] &&\n          // Background around the foreground pattern? Not part of the specs.\n          (badness[i - 3] === 0 || i + 3 > length ||\n          badness[i - 3] * 3 >= badness[i] * 4 ||\n          badness[i + 3] * 3 >= badness[i] * 4)) {\n          badRuns += Frame.N3;\n        }\n      }\n\n      return badRuns;\n    },\n\n    _finish: function() {\n      // Save pre-mask copy of frame.\n      this._stringBuffer = this.buffer.slice();\n\n      var currentMask, i;\n      var bit = 0;\n      var mask = 30000;\n\n      /*\n       * Using for instead of while since in original Arduino code if an early mask was \"good enough\" it wouldn't try for\n       * a better one since they get more complex and take longer.\n       */\n      for (i = 0; i < 8; i++) {\n        // Returns foreground-background imbalance.\n        this._applyMask(i);\n\n        currentMask = this._checkBadness();\n\n        // Is current mask better than previous best?\n        if (currentMask < mask) {\n          mask = currentMask;\n          bit = i;\n        }\n\n        // Don't increment \"i\" to a void redoing mask.\n        if (bit === 7) {\n          break;\n        }\n\n        // Reset for next pass.\n        this.buffer = this._stringBuffer.slice();\n      }\n\n      // Redo best mask as none were \"good enough\" (i.e. last wasn't bit).\n      if (bit !== i) {\n        this._applyMask(bit);\n      }\n\n      // Add in final mask/ECC level bytes.\n      mask = ErrorCorrection_1.FINAL_FORMAT[bit + (this._level - 1 << 3)];\n\n      var buffer = this.buffer;\n      var width = this.width;\n\n      // Low byte.\n      for (i = 0; i < 8; i++, mask >>= 1) {\n        if (mask & 1) {\n          buffer[width - 1 - i + (width * 8)] = 1;\n\n          if (i < 6) {\n            buffer[8 + (width * i)] = 1;\n          } else {\n            buffer[8 + (width * (i + 1))] = 1;\n          }\n        }\n      }\n\n      // High byte.\n      for (i = 0; i < 7; i++, mask >>= 1) {\n        if (mask & 1) {\n          buffer[8 + (width * (width - 7 + i))] = 1;\n\n          if (i) {\n            buffer[6 - i + (width * 8)] = 1;\n          } else {\n            buffer[7 + (width * 8)] = 1;\n          }\n        }\n      }\n    },\n\n    _interleaveBlocks: function() {\n      var i, j;\n      var dataBlock = this._dataBlock;\n      var ecc = this._ecc;\n      var eccBlock = this._eccBlock;\n      var k = 0;\n      var maxLength = this._calculateMaxLength();\n      var neccBlock1 = this._neccBlock1;\n      var neccBlock2 = this._neccBlock2;\n      var stringBuffer = this._stringBuffer;\n\n      for (i = 0; i < dataBlock; i++) {\n        for (j = 0; j < neccBlock1; j++) {\n          ecc[k++] = stringBuffer[i + (j * dataBlock)];\n        }\n\n        for (j = 0; j < neccBlock2; j++) {\n          ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))];\n        }\n      }\n\n      for (j = 0; j < neccBlock2; j++) {\n        ecc[k++] = stringBuffer[(neccBlock1 * dataBlock) + i + (j * (dataBlock + 1))];\n      }\n\n      for (i = 0; i < eccBlock; i++) {\n        for (j = 0; j < neccBlock1 + neccBlock2; j++) {\n          ecc[k++] = stringBuffer[maxLength + i + (j * eccBlock)];\n        }\n      }\n\n      this._stringBuffer = ecc;\n    },\n\n    _insertAlignments: function() {\n      var i, x, y;\n      var version = this._version;\n      var width = this.width;\n\n      if (version > 1) {\n        i = Alignment_1.BLOCK[version];\n        y = width - 7;\n\n        for (;;) {\n          x = width - 7;\n\n          while (x > i - 3) {\n            this._addAlignment(x, y);\n\n            if (x < i) {\n              break;\n            }\n\n            x -= i;\n          }\n\n          if (y <= i + 9) {\n            break;\n          }\n\n          y -= i;\n\n          this._addAlignment(6, y);\n          this._addAlignment(y, 6);\n        }\n      }\n    },\n\n    _insertFinders: function() {\n      var i, j, x, y;\n      var buffer = this.buffer;\n      var width = this.width;\n\n      for (i = 0; i < 3; i++) {\n        j = 0;\n        y = 0;\n\n        if (i === 1) {\n          j = width - 7;\n        }\n        if (i === 2) {\n          y = width - 7;\n        }\n\n        buffer[y + 3 + (width * (j + 3))] = 1;\n\n        for (x = 0; x < 6; x++) {\n          buffer[y + x + (width * j)] = 1;\n          buffer[y + (width * (j + x + 1))] = 1;\n          buffer[y + 6 + (width * (j + x))] = 1;\n          buffer[y + x + 1 + (width * (j + 6))] = 1;\n        }\n\n        for (x = 1; x < 5; x++) {\n          this._setMask(y + x, j + 1);\n          this._setMask(y + 1, j + x + 1);\n          this._setMask(y + 5, j + x);\n          this._setMask(y + x + 1, j + 5);\n        }\n\n        for (x = 2; x < 4; x++) {\n          buffer[y + x + (width * (j + 2))] = 1;\n          buffer[y + 2 + (width * (j + x + 1))] = 1;\n          buffer[y + 4 + (width * (j + x))] = 1;\n          buffer[y + x + 1 + (width * (j + 4))] = 1;\n        }\n      }\n    },\n\n    _insertTimingGap: function() {\n      var x, y;\n      var width = this.width;\n\n      for (y = 0; y < 7; y++) {\n        this._setMask(7, y);\n        this._setMask(width - 8, y);\n        this._setMask(7, y + width - 7);\n      }\n\n      for (x = 0; x < 8; x++) {\n        this._setMask(x, 7);\n        this._setMask(x + width - 8, 7);\n        this._setMask(x, width - 8);\n      }\n    },\n\n    _insertTimingRowAndColumn: function() {\n      var x;\n      var buffer = this.buffer;\n      var width = this.width;\n\n      for (x = 0; x < width - 14; x++) {\n        if (x & 1) {\n          this._setMask(8 + x, 6);\n          this._setMask(6, 8 + x);\n        } else {\n          buffer[8 + x + (width * 6)] = 1;\n          buffer[6 + (width * (8 + x))] = 1;\n        }\n      }\n    },\n\n    _insertVersion: function() {\n      var i, j, x, y;\n      var buffer = this.buffer;\n      var version = this._version;\n      var width = this.width;\n\n      if (version > 6) {\n        i = Version_1.BLOCK[version - 7];\n        j = 17;\n\n        for (x = 0; x < 6; x++) {\n          for (y = 0; y < 3; y++, j--) {\n            if (1 & (j > 11 ? version >> j - 12 : i >> j)) {\n              buffer[5 - x + (width * (2 - y + width - 11))] = 1;\n              buffer[2 - y + width - 11 + (width * (5 - x))] = 1;\n            } else {\n              this._setMask(5 - x, 2 - y + width - 11);\n              this._setMask(2 - y + width - 11, 5 - x);\n            }\n          }\n        }\n      }\n    },\n\n    _isMasked: function(x, y) {\n      var bit = Frame._getMaskBit(x, y);\n\n      return this._mask[bit] === 1;\n    },\n\n    _pack: function() {\n      var bit, i, j;\n      var k = 1;\n      var v = 1;\n      var width = this.width;\n      var x = width - 1;\n      var y = width - 1;\n\n      // Interleaved data and ECC codes.\n      var length = ((this._dataBlock + this._eccBlock) * (this._neccBlock1 + this._neccBlock2)) + this._neccBlock2;\n\n      for (i = 0; i < length; i++) {\n        bit = this._stringBuffer[i];\n\n        for (j = 0; j < 8; j++, bit <<= 1) {\n          if (0x80 & bit) {\n            this.buffer[x + (width * y)] = 1;\n          }\n\n          // Find next fill position.\n          do {\n            if (v) {\n              x--;\n            } else {\n              x++;\n\n              if (k) {\n                if (y !== 0) {\n                  y--;\n                } else {\n                  x -= 2;\n                  k = !k;\n\n                  if (x === 6) {\n                    x--;\n                    y = 9;\n                  }\n                }\n              } else if (y !== width - 1) {\n                y++;\n              } else {\n                x -= 2;\n                k = !k;\n\n                if (x === 6) {\n                  x--;\n                  y -= 8;\n                }\n              }\n            }\n\n            v = !v;\n          } while (this._isMasked(x, y));\n        }\n      }\n    },\n\n    _reverseMask: function() {\n      var x, y;\n      var width = this.width;\n\n      for (x = 0; x < 9; x++) {\n        this._setMask(x, 8);\n      }\n\n      for (x = 0; x < 8; x++) {\n        this._setMask(x + width - 8, 8);\n        this._setMask(8, x);\n      }\n\n      for (y = 0; y < 7; y++) {\n        this._setMask(8, y + width - 7);\n      }\n    },\n\n    _setMask: function(x, y) {\n      var bit = Frame._getMaskBit(x, y);\n\n      this._mask[bit] = 1;\n    },\n\n    _syncMask: function() {\n      var x, y;\n      var width = this.width;\n\n      for (y = 0; y < width; y++) {\n        for (x = 0; x <= y; x++) {\n          if (this.buffer[x + (width * y)]) {\n            this._setMask(x, y);\n          }\n        }\n      }\n    }\n\n  }, {\n\n    _createArray: function(length) {\n      var i;\n      var array = [];\n\n      for (i = 0; i < length; i++) {\n        array[i] = 0;\n      }\n\n      return array;\n    },\n\n    _getMaskBit: function(x, y) {\n      var bit;\n\n      if (x > y) {\n        bit = x;\n        x = y;\n        y = bit;\n      }\n\n      bit = y;\n      bit += y * y;\n      bit >>= 1;\n      bit += x;\n\n      return bit;\n    },\n\n    _modN: function(x) {\n      while (x >= 255) {\n        x -= 255;\n        x = (x >> 8) + (x & 255);\n      }\n\n      return x;\n    },\n\n    // *Badness* coefficients.\n    N1: 3,\n    N2: 3,\n    N3: 40,\n    N4: 10\n\n  });\n\n  var Frame_1 = Frame;\n\n  /**\n   * The options used by {@link Frame}.\n   *\n   * @typedef {Object} Frame~Options\n   * @property {string} level - The ECC level to be used.\n   * @property {string} value - The value to be encoded.\n   */\n\n  /**\n   * An implementation of {@link Renderer} for working with <code>img</code> elements.\n   *\n   * This depends on {@link CanvasRenderer} being executed first as this implementation simply applies the data URL from\n   * the rendered <code>canvas</code> element as the <code>src</code> for the <code>img</code> element being rendered.\n   *\n   * @public\n   * @class\n   * @extends Renderer\n   */\n  var ImageRenderer = Renderer_1.extend({\n\n    /**\n     * @override\n     */\n    draw: function() {\n      this.element.src = this.qrious.toDataURL();\n    },\n\n    /**\n     * @override\n     */\n    reset: function() {\n      this.element.src = '';\n    },\n\n    /**\n     * @override\n     */\n    resize: function() {\n      var element = this.element;\n\n      element.width = element.height = this.qrious.size;\n    }\n\n  });\n\n  var ImageRenderer_1 = ImageRenderer;\n\n  /**\n   * Defines an available option while also configuring how values are applied to the target object.\n   *\n   * Optionally, a default value can be specified as well a value transformer for greater control over how the option\n   * value is applied.\n   *\n   * If no value transformer is specified, then any specified option will be applied directly. All values are maintained\n   * on the target object itself as a field using the option name prefixed with a single underscore.\n   *\n   * When an option is specified as modifiable, the {@link OptionManager} will be required to include a setter for the\n   * property that is defined on the target object that uses the option name.\n   *\n   * @param {string} name - the name to be used\n   * @param {boolean} [modifiable] - <code>true</code> if the property defined on target objects should include a setter;\n   * otherwise <code>false</code>\n   * @param {*} [defaultValue] - the default value to be used\n   * @param {Option~ValueTransformer} [valueTransformer] - the value transformer to be used\n   * @public\n   * @class\n   * @extends Nevis\n   */\n  var Option = lite.extend(function(name, modifiable, defaultValue, valueTransformer) {\n    /**\n     * The name for this {@link Option}.\n     *\n     * @public\n     * @type {string}\n     * @memberof Option#\n     */\n    this.name = name;\n\n    /**\n     * Whether a setter should be included on the property defined on target objects for this {@link Option}.\n     *\n     * @public\n     * @type {boolean}\n     * @memberof Option#\n     */\n    this.modifiable = Boolean(modifiable);\n\n    /**\n     * The default value for this {@link Option}.\n     *\n     * @public\n     * @type {*}\n     * @memberof Option#\n     */\n    this.defaultValue = defaultValue;\n\n    this._valueTransformer = valueTransformer;\n  }, {\n\n    /**\n     * Transforms the specified <code>value</code> so that it can be applied for this {@link Option}.\n     *\n     * If a value transformer has been specified for this {@link Option}, it will be called upon to transform\n     * <code>value</code>. Otherwise, <code>value</code> will be returned directly.\n     *\n     * @param {*} value - the value to be transformed\n     * @return {*} The transformed value or <code>value</code> if no value transformer is specified.\n     * @public\n     * @memberof Option#\n     */\n    transform: function(value) {\n      var transformer = this._valueTransformer;\n      if (typeof transformer === 'function') {\n        return transformer(value, this);\n      }\n\n      return value;\n    }\n\n  });\n\n  var Option_1 = Option;\n\n  /**\n   * Returns a transformed value for the specified <code>value</code> to be applied for the <code>option</code> provided.\n   *\n   * @callback Option~ValueTransformer\n   * @param {*} value - the value to be transformed\n   * @param {Option} option - the {@link Option} for which <code>value</code> is being transformed\n   * @return {*} The transform value.\n   */\n\n  /**\n   * Contains utility methods that are useful throughout the library.\n   *\n   * @public\n   * @class\n   * @extends Nevis\n   */\n  var Utilities = lite.extend(null, {\n\n    /**\n     * Returns the absolute value of a given number.\n     *\n     * This method is simply a convenient shorthand for <code>Math.abs</code> while ensuring that nulls are returned as\n     * <code>null</code> instead of zero.\n     *\n     * @param {number} value - the number whose absolute value is to be returned\n     * @return {number} The absolute value of <code>value</code> or <code>null</code> if <code>value</code> is\n     * <code>null</code>.\n     * @public\n     * @static\n     * @memberof Utilities\n     */\n    abs: function(value) {\n      return value != null ? Math.abs(value) : null;\n    },\n\n    /**\n     * Returns whether the specified <code>object</code> has a property with the specified <code>name</code> as an own\n     * (not inherited) property.\n     *\n     * @param {Object} object - the object on which the property is to be checked\n     * @param {string} name - the name of the property to be checked\n     * @return {boolean} <code>true</code> if <code>object</code> has an own property with <code>name</code>.\n     * @public\n     * @static\n     * @memberof Utilities\n     */\n    hasOwn: function(object, name) {\n      return Object.prototype.hasOwnProperty.call(object, name);\n    },\n\n    /**\n     * A non-operation method that does absolutely nothing.\n     *\n     * @return {void}\n     * @public\n     * @static\n     * @memberof Utilities\n     */\n    noop: function() {},\n\n    /**\n     * Transforms the specified <code>string</code> to upper case while remaining null-safe.\n     *\n     * @param {string} string - the string to be transformed to upper case\n     * @return {string} <code>string</code> transformed to upper case if <code>string</code> is not <code>null</code>.\n     * @public\n     * @static\n     * @memberof Utilities\n     */\n    toUpperCase: function(string) {\n      return string != null ? string.toUpperCase() : null;\n    }\n\n  });\n\n  var Utilities_1 = Utilities;\n\n  /**\n   * Manages multiple {@link Option} instances that are intended to be used by multiple implementations.\n   *\n   * Although the option definitions are shared between targets, the values are maintained on the targets themselves.\n   *\n   * @param {Option[]} options - the options to be used\n   * @public\n   * @class\n   * @extends Nevis\n   */\n  var OptionManager = lite.extend(function(options) {\n    /**\n     * The available options for this {@link OptionManager}.\n     *\n     * @public\n     * @type {Object.<string, Option>}\n     * @memberof OptionManager#\n     */\n    this.options = {};\n\n    options.forEach(function(option) {\n      this.options[option.name] = option;\n    }, this);\n  }, {\n\n    /**\n     * Returns whether an option with the specified <code>name</code> is available.\n     *\n     * @param {string} name - the name of the {@link Option} whose existence is to be checked\n     * @return {boolean} <code>true</code> if an {@link Option} exists with <code>name</code>; otherwise\n     * <code>false</code>.\n     * @public\n     * @memberof OptionManager#\n     */\n    exists: function(name) {\n      return this.options[name] != null;\n    },\n\n    /**\n     * Returns the value of the option with the specified <code>name</code> on the <code>target</code> object provided.\n     *\n     * @param {string} name - the name of the {@link Option} whose value on <code>target</code> is to be returned\n     * @param {Object} target - the object from which the value of the named {@link Option} is to be returned\n     * @return {*} The value of the {@link Option} with <code>name</code> on <code>target</code>.\n     * @public\n     * @memberof OptionManager#\n     */\n    get: function(name, target) {\n      return OptionManager._get(this.options[name], target);\n    },\n\n    /**\n     * Returns a copy of all of the available options on the <code>target</code> object provided.\n     *\n     * @param {Object} target - the object from which the option name/value pairs are to be returned\n     * @return {Object.<string, *>} A hash containing the name/value pairs of all options on <code>target</code>.\n     * @public\n     * @memberof OptionManager#\n     */\n    getAll: function(target) {\n      var name;\n      var options = this.options;\n      var result = {};\n\n      for (name in options) {\n        if (Utilities_1.hasOwn(options, name)) {\n          result[name] = OptionManager._get(options[name], target);\n        }\n      }\n\n      return result;\n    },\n\n    /**\n     * Initializes the available options for the <code>target</code> object provided and then applies the initial values\n     * within the speciifed <code>options</code>.\n     *\n     * This method will throw an error if any of the names within <code>options</code> does not match an available option.\n     *\n     * This involves setting the default values and defining properties for all of the available options on\n     * <code>target</code> before finally calling {@link OptionMananger#setAll} with <code>options</code> and\n     * <code>target</code>. Any options that are configured to be modifiable will have a setter included in their defined\n     * property that will allow its corresponding value to be modified.\n     *\n     * If a change handler is specified, it will be called whenever the value changes on <code>target</code> for a\n     * modifiable option, but only when done so via the defined property's setter.\n     *\n     * @param {Object.<string, *>} options - the name/value pairs of the initial options to be set\n     * @param {Object} target - the object on which the options are to be initialized\n     * @param {Function} [changeHandler] - the function to be called whenever the value of an modifiable option changes on\n     * <code>target</code>\n     * @return {void}\n     * @throws {Error} If <code>options</code> contains an invalid option name.\n     * @public\n     * @memberof OptionManager#\n     */\n    init: function(options, target, changeHandler) {\n      if (typeof changeHandler !== 'function') {\n        changeHandler = Utilities_1.noop;\n      }\n\n      var name, option;\n\n      for (name in this.options) {\n        if (Utilities_1.hasOwn(this.options, name)) {\n          option = this.options[name];\n\n          OptionManager._set(option, option.defaultValue, target);\n          OptionManager._createAccessor(option, target, changeHandler);\n        }\n      }\n\n      this._setAll(options, target, true);\n    },\n\n    /**\n     * Sets the value of the option with the specified <code>name</code> on the <code>target</code> object provided to\n     * <code>value</code>.\n     *\n     * This method will throw an error if <code>name</code> does not match an available option or matches an option that\n     * cannot be modified.\n     *\n     * If <code>value</code> is <code>null</code> and the {@link Option} has a default value configured, then that default\n     * value will be used instead. If the {@link Option} also has a value transformer configured, it will be used to\n     * transform whichever value was determined to be used.\n     *\n     * This method returns whether the value of the underlying field on <code>target</code> was changed as a result.\n     *\n     * @param {string} name - the name of the {@link Option} whose value is to be set\n     * @param {*} value - the value to be set for the named {@link Option} on <code>target</code>\n     * @param {Object} target - the object on which <code>value</code> is to be set for the named {@link Option}\n     * @return {boolean} <code>true</code> if the underlying field on <code>target</code> was changed; otherwise\n     * <code>false</code>.\n     * @throws {Error} If <code>name</code> is invalid or is for an option that cannot be modified.\n     * @public\n     * @memberof OptionManager#\n     */\n    set: function(name, value, target) {\n      return this._set(name, value, target);\n    },\n\n    /**\n     * Sets all of the specified <code>options</code> on the <code>target</code> object provided to their corresponding\n     * values.\n     *\n     * This method will throw an error if any of the names within <code>options</code> does not match an available option\n     * or matches an option that cannot be modified.\n     *\n     * If any value within <code>options</code> is <code>null</code> and the corresponding {@link Option} has a default\n     * value configured, then that default value will be used instead. If an {@link Option} also has a value transformer\n     * configured, it will be used to transform whichever value was determined to be used.\n     *\n     * This method returns whether the value for any of the underlying fields on <code>target</code> were changed as a\n     * result.\n     *\n     * @param {Object.<string, *>} options - the name/value pairs of options to be set\n     * @param {Object} target - the object on which the options are to be set\n     * @return {boolean} <code>true</code> if any of the underlying fields on <code>target</code> were changed; otherwise\n     * <code>false</code>.\n     * @throws {Error} If <code>options</code> contains an invalid option name or an option that cannot be modiifed.\n     * @public\n     * @memberof OptionManager#\n     */\n    setAll: function(options, target) {\n      return this._setAll(options, target);\n    },\n\n    _set: function(name, value, target, allowUnmodifiable) {\n      var option = this.options[name];\n      if (!option) {\n        throw new Error('Invalid option: ' + name);\n      }\n      if (!option.modifiable && !allowUnmodifiable) {\n        throw new Error('Option cannot be modified: ' + name);\n      }\n\n      return OptionManager._set(option, value, target);\n    },\n\n    _setAll: function(options, target, allowUnmodifiable) {\n      if (!options) {\n        return false;\n      }\n\n      var name;\n      var changed = false;\n\n      for (name in options) {\n        if (Utilities_1.hasOwn(options, name) && this._set(name, options[name], target, allowUnmodifiable)) {\n          changed = true;\n        }\n      }\n\n      return changed;\n    }\n\n  }, {\n\n    _createAccessor: function(option, target, changeHandler) {\n      var descriptor = {\n        get: function() {\n          return OptionManager._get(option, target);\n        }\n      };\n\n      if (option.modifiable) {\n        descriptor.set = function(value) {\n          if (OptionManager._set(option, value, target)) {\n            changeHandler(value, option);\n          }\n        };\n      }\n\n      Object.defineProperty(target, option.name, descriptor);\n    },\n\n    _get: function(option, target) {\n      return target['_' + option.name];\n    },\n\n    _set: function(option, value, target) {\n      var fieldName = '_' + option.name;\n      var oldValue = target[fieldName];\n      var newValue = option.transform(value != null ? value : option.defaultValue);\n\n      target[fieldName] = newValue;\n\n      return newValue !== oldValue;\n    }\n\n  });\n\n  var OptionManager_1 = OptionManager;\n\n  /**\n   * Called whenever the value of a modifiable {@link Option} is changed on a target object via the defined property's\n   * setter.\n   *\n   * @callback OptionManager~ChangeHandler\n   * @param {*} value - the new value for <code>option</code> on the target object\n   * @param {Option} option - the modifable {@link Option} whose value has changed on the target object.\n   * @return {void}\n   */\n\n  /**\n   * A basic manager for {@link Service} implementations that are mapped to simple names.\n   *\n   * @public\n   * @class\n   * @extends Nevis\n   */\n  var ServiceManager = lite.extend(function() {\n    this._services = {};\n  }, {\n\n    /**\n     * Returns the {@link Service} being managed with the specified <code>name</code>.\n     *\n     * @param {string} name - the name of the {@link Service} to be returned\n     * @return {Service} The {@link Service} is being managed with <code>name</code>.\n     * @throws {Error} If no {@link Service} is being managed with <code>name</code>.\n     * @public\n     * @memberof ServiceManager#\n     */\n    getService: function(name) {\n      var service = this._services[name];\n      if (!service) {\n        throw new Error('Service is not being managed with name: ' + name);\n      }\n\n      return service;\n    },\n\n    /**\n     * Sets the {@link Service} implementation to be managed for the specified <code>name</code> to the\n     * <code>service</code> provided.\n     *\n     * @param {string} name - the name of the {@link Service} to be managed with <code>name</code>\n     * @param {Service} service - the {@link Service} implementation to be managed\n     * @return {void}\n     * @throws {Error} If a {@link Service} is already being managed with the same <code>name</code>.\n     * @public\n     * @memberof ServiceManager#\n     */\n    setService: function(name, service) {\n      if (this._services[name]) {\n        throw new Error('Service is already managed with name: ' + name);\n      }\n\n      if (service) {\n        this._services[name] = service;\n      }\n    }\n\n  });\n\n  var ServiceManager_1 = ServiceManager;\n\n  var optionManager = new OptionManager_1([\n    new Option_1('background', true, 'white'),\n    new Option_1('backgroundAlpha', true, 1, Utilities_1.abs),\n    new Option_1('element'),\n    new Option_1('foreground', true, 'black'),\n    new Option_1('foregroundAlpha', true, 1, Utilities_1.abs),\n    new Option_1('level', true, 'L', Utilities_1.toUpperCase),\n    new Option_1('mime', true, 'image/png'),\n    new Option_1('padding', true, null, Utilities_1.abs),\n    new Option_1('size', true, 100, Utilities_1.abs),\n    new Option_1('value', true, '')\n  ]);\n  var serviceManager = new ServiceManager_1();\n\n  /**\n   * Enables configuration of a QR code generator which uses HTML5 <code>canvas</code> for rendering.\n   *\n   * @param {QRious~Options} [options] - the options to be used\n   * @throws {Error} If any <code>options</code> are invalid.\n   * @public\n   * @class\n   * @extends Nevis\n   */\n  var QRious = lite.extend(function(options) {\n    optionManager.init(options, this, this.update.bind(this));\n\n    var element = optionManager.get('element', this);\n    var elementService = serviceManager.getService('element');\n    var canvas = element && elementService.isCanvas(element) ? element : elementService.createCanvas();\n    var image = element && elementService.isImage(element) ? element : elementService.createImage();\n\n    this._canvasRenderer = new CanvasRenderer_1(this, canvas, true);\n    this._imageRenderer = new ImageRenderer_1(this, image, image === element);\n\n    this.update();\n  }, {\n\n    /**\n     * Returns all of the options configured for this {@link QRious}.\n     *\n     * Any changes made to the returned object will not be reflected in the options themselves or their corresponding\n     * underlying fields.\n     *\n     * @return {Object.<string, *>} A copy of the applied options.\n     * @public\n     * @memberof QRious#\n     */\n    get: function() {\n      return optionManager.getAll(this);\n    },\n\n    /**\n     * Sets all of the specified <code>options</code> and automatically updates this {@link QRious} if any of the\n     * underlying fields are changed as a result.\n     *\n     * This is the preferred method for updating multiple options at one time to avoid unnecessary updates between\n     * changes.\n     *\n     * @param {QRious~Options} options - the options to be set\n     * @return {void}\n     * @throws {Error} If any <code>options</code> are invalid or cannot be modified.\n     * @public\n     * @memberof QRious#\n     */\n    set: function(options) {\n      if (optionManager.setAll(options, this)) {\n        this.update();\n      }\n    },\n\n    /**\n     * Returns the image data URI for the generated QR code using the <code>mime</code> provided.\n     *\n     * @param {string} [mime] - the MIME type for the image\n     * @return {string} The image data URI for the QR code.\n     * @public\n     * @memberof QRious#\n     */\n    toDataURL: function(mime) {\n      return this.canvas.toDataURL(mime || this.mime);\n    },\n\n    /**\n     * Updates this {@link QRious} by generating a new {@link Frame} and re-rendering the QR code.\n     *\n     * @return {void}\n     * @protected\n     * @memberof QRious#\n     */\n    update: function() {\n      var frame = new Frame_1({\n        level: this.level,\n        value: this.value\n      });\n\n      this._canvasRenderer.render(frame);\n      this._imageRenderer.render(frame);\n    }\n\n  }, {\n\n    /**\n     * Configures the <code>service</code> provided to be used by all {@link QRious} instances.\n     *\n     * @param {Service} service - the {@link Service} to be configured\n     * @return {void}\n     * @throws {Error} If a {@link Service} has already been configured with the same name.\n     * @public\n     * @static\n     * @memberof QRious\n     */\n    use: function(service) {\n      serviceManager.setService(service.getName(), service);\n    }\n\n  });\n\n  Object.defineProperties(QRious.prototype, {\n\n    canvas: {\n      /**\n       * Returns the <code>canvas</code> element being used to render the QR code for this {@link QRious}.\n       *\n       * @return {*} The <code>canvas</code> element.\n       * @public\n       * @memberof QRious#\n       * @alias canvas\n       */\n      get: function() {\n        return this._canvasRenderer.getElement();\n      }\n    },\n\n    image: {\n      /**\n       * Returns the <code>img</code> element being used to render the QR code for this {@link QRious}.\n       *\n       * @return {*} The <code>img</code> element.\n       * @public\n       * @memberof QRious#\n       * @alias image\n       */\n      get: function() {\n        return this._imageRenderer.getElement();\n      }\n    }\n\n  });\n\n  var QRious_1$2 = QRious;\n\n  /**\n   * The options used by {@link QRious}.\n   *\n   * @typedef {Object} QRious~Options\n   * @property {string} [background=\"white\"] - The background color to be applied to the QR code.\n   * @property {number} [backgroundAlpha=1] - The background alpha to be applied to the QR code.\n   * @property {*} [element] - The element to be used to render the QR code which may either be an <code>canvas</code> or\n   * <code>img</code>. The element(s) will be created if needed.\n   * @property {string} [foreground=\"black\"] - The foreground color to be applied to the QR code.\n   * @property {number} [foregroundAlpha=1] - The foreground alpha to be applied to the QR code.\n   * @property {string} [level=\"L\"] - The error correction level to be applied to the QR code.\n   * @property {string} [mime=\"image/png\"] - The MIME type to be used to render the image for the QR code.\n   * @property {number} [padding] - The padding for the QR code in pixels.\n   * @property {number} [size=100] - The size of the QR code in pixels.\n   * @property {string} [value=\"\"] - The value to be encoded within the QR code.\n   */\n\n  var index = QRious_1$2;\n\n  /**\n   * Defines a service contract that must be met by all implementations.\n   *\n   * @public\n   * @class\n   * @extends Nevis\n   */\n  var Service = lite.extend({\n\n    /**\n     * Returns the name of this {@link Service}.\n     *\n     * @return {string} The service name.\n     * @public\n     * @abstract\n     * @memberof Service#\n     */\n    getName: function() {}\n\n  });\n\n  var Service_1 = Service;\n\n  /**\n   * A service for working with elements.\n   *\n   * @public\n   * @class\n   * @extends Service\n   */\n  var ElementService = Service_1.extend({\n\n    /**\n     * Creates an instance of a canvas element.\n     *\n     * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.\n     *\n     * @return {*} The newly created canvas element.\n     * @public\n     * @abstract\n     * @memberof ElementService#\n     */\n    createCanvas: function() {},\n\n    /**\n     * Creates an instance of a image element.\n     *\n     * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.\n     *\n     * @return {*} The newly created image element.\n     * @public\n     * @abstract\n     * @memberof ElementService#\n     */\n    createImage: function() {},\n\n    /**\n     * @override\n     */\n    getName: function() {\n      return 'element';\n    },\n\n    /**\n     * Returns whether the specified <code>element</code> is a canvas.\n     *\n     * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.\n     *\n     * @param {*} element - the element to be checked\n     * @return {boolean} <code>true</code> if <code>element</code> is a canvas; otherwise <code>false</code>.\n     * @public\n     * @abstract\n     * @memberof ElementService#\n     */\n    isCanvas: function(element) {},\n\n    /**\n     * Returns whether the specified <code>element</code> is an image.\n     *\n     * Implementations of {@link ElementService} <b>must</b> override this method with their own specific logic.\n     *\n     * @param {*} element - the element to be checked\n     * @return {boolean} <code>true</code> if <code>element</code> is an image; otherwise <code>false</code>.\n     * @public\n     * @abstract\n     * @memberof ElementService#\n     */\n    isImage: function(element) {}\n\n  });\n\n  var ElementService_1 = ElementService;\n\n  /**\n   * An implementation of {@link ElementService} intended for use within a browser environment.\n   *\n   * @public\n   * @class\n   * @extends ElementService\n   */\n  var BrowserElementService = ElementService_1.extend({\n\n    /**\n     * @override\n     */\n    createCanvas: function() {\n      return document.createElement('canvas');\n    },\n\n    /**\n     * @override\n     */\n    createImage: function() {\n      return document.createElement('img');\n    },\n\n    /**\n     * @override\n     */\n    isCanvas: function(element) {\n      return element instanceof HTMLCanvasElement;\n    },\n\n    /**\n     * @override\n     */\n    isImage: function(element) {\n      return element instanceof HTMLImageElement;\n    }\n\n  });\n\n  var BrowserElementService_1 = BrowserElementService;\n\n  index.use(new BrowserElementService_1());\n\n  var QRious_1 = index;\n\n  return QRious_1;\n\n})));\n\n//# sourceMappingURL=qrious.js.map","exports = module.exports = SemVer;\n\n// The debug function is excluded entirely from the minified version.\n/* nomin */ var debug;\n/* nomin */ if (typeof process === 'object' &&\n    /* nomin */ process.env &&\n    /* nomin */ process.env.NODE_DEBUG &&\n    /* nomin */ /\\bsemver\\b/i.test(process.env.NODE_DEBUG))\n  /* nomin */ debug = function() {\n    /* nomin */ var args = Array.prototype.slice.call(arguments, 0);\n    /* nomin */ args.unshift('SEMVER');\n    /* nomin */ console.log.apply(console, args);\n    /* nomin */ };\n/* nomin */ else\n  /* nomin */ debug = function() {};\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nexports.SEMVER_SPEC_VERSION = '2.0.0';\n\nvar MAX_LENGTH = 256;\nvar MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\n// Max safe segment length for coercion.\nvar MAX_SAFE_COMPONENT_LENGTH = 16;\n\n// The actual regexps go on exports.re\nvar re = exports.re = [];\nvar src = exports.src = [];\nvar R = 0;\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\nvar NUMERICIDENTIFIER = R++;\nsrc[NUMERICIDENTIFIER] = '0|[1-9]\\\\d*';\nvar NUMERICIDENTIFIERLOOSE = R++;\nsrc[NUMERICIDENTIFIERLOOSE] = '[0-9]+';\n\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\nvar NONNUMERICIDENTIFIER = R++;\nsrc[NONNUMERICIDENTIFIER] = '\\\\d*[a-zA-Z-][a-zA-Z0-9-]*';\n\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\nvar MAINVERSION = R++;\nsrc[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\\\.' +\n                   '(' + src[NUMERICIDENTIFIER] + ')\\\\.' +\n                   '(' + src[NUMERICIDENTIFIER] + ')';\n\nvar MAINVERSIONLOOSE = R++;\nsrc[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\\\.' +\n                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\\\.' +\n                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')';\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\nvar PRERELEASEIDENTIFIER = R++;\nsrc[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +\n                            '|' + src[NONNUMERICIDENTIFIER] + ')';\n\nvar PRERELEASEIDENTIFIERLOOSE = R++;\nsrc[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +\n                                 '|' + src[NONNUMERICIDENTIFIER] + ')';\n\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\nvar PRERELEASE = R++;\nsrc[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +\n                  '(?:\\\\.' + src[PRERELEASEIDENTIFIER] + ')*))';\n\nvar PRERELEASELOOSE = R++;\nsrc[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +\n                       '(?:\\\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))';\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\nvar BUILDIDENTIFIER = R++;\nsrc[BUILDIDENTIFIER] = '[0-9A-Za-z-]+';\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\nvar BUILD = R++;\nsrc[BUILD] = '(?:\\\\+(' + src[BUILDIDENTIFIER] +\n             '(?:\\\\.' + src[BUILDIDENTIFIER] + ')*))';\n\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups.  The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\nvar FULL = R++;\nvar FULLPLAIN = 'v?' + src[MAINVERSION] +\n                src[PRERELEASE] + '?' +\n                src[BUILD] + '?';\n\nsrc[FULL] = '^' + FULLPLAIN + '$';\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\nvar LOOSEPLAIN = '[v=\\\\s]*' + src[MAINVERSIONLOOSE] +\n                 src[PRERELEASELOOSE] + '?' +\n                 src[BUILD] + '?';\n\nvar LOOSE = R++;\nsrc[LOOSE] = '^' + LOOSEPLAIN + '$';\n\nvar GTLT = R++;\nsrc[GTLT] = '((?:<|>)?=?)';\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\nvar XRANGEIDENTIFIERLOOSE = R++;\nsrc[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\\\*';\nvar XRANGEIDENTIFIER = R++;\nsrc[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\\\*';\n\nvar XRANGEPLAIN = R++;\nsrc[XRANGEPLAIN] = '[v=\\\\s]*(' + src[XRANGEIDENTIFIER] + ')' +\n                   '(?:\\\\.(' + src[XRANGEIDENTIFIER] + ')' +\n                   '(?:\\\\.(' + src[XRANGEIDENTIFIER] + ')' +\n                   '(?:' + src[PRERELEASE] + ')?' +\n                   src[BUILD] + '?' +\n                   ')?)?';\n\nvar XRANGEPLAINLOOSE = R++;\nsrc[XRANGEPLAINLOOSE] = '[v=\\\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +\n                        '(?:\\\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +\n                        '(?:\\\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +\n                        '(?:' + src[PRERELEASELOOSE] + ')?' +\n                        src[BUILD] + '?' +\n                        ')?)?';\n\nvar XRANGE = R++;\nsrc[XRANGE] = '^' + src[GTLT] + '\\\\s*' + src[XRANGEPLAIN] + '$';\nvar XRANGELOOSE = R++;\nsrc[XRANGELOOSE] = '^' + src[GTLT] + '\\\\s*' + src[XRANGEPLAINLOOSE] + '$';\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\nvar COERCE = R++;\nsrc[COERCE] = '(?:^|[^\\\\d])' +\n              '(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +\n              '(?:\\\\.(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +\n              '(?:\\\\.(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +\n              '(?:$|[^\\\\d])';\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\nvar LONETILDE = R++;\nsrc[LONETILDE] = '(?:~>?)';\n\nvar TILDETRIM = R++;\nsrc[TILDETRIM] = '(\\\\s*)' + src[LONETILDE] + '\\\\s+';\nre[TILDETRIM] = new RegExp(src[TILDETRIM], 'g');\nvar tildeTrimReplace = '$1~';\n\nvar TILDE = R++;\nsrc[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$';\nvar TILDELOOSE = R++;\nsrc[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$';\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\nvar LONECARET = R++;\nsrc[LONECARET] = '(?:\\\\^)';\n\nvar CARETTRIM = R++;\nsrc[CARETTRIM] = '(\\\\s*)' + src[LONECARET] + '\\\\s+';\nre[CARETTRIM] = new RegExp(src[CARETTRIM], 'g');\nvar caretTrimReplace = '$1^';\n\nvar CARET = R++;\nsrc[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$';\nvar CARETLOOSE = R++;\nsrc[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$';\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\nvar COMPARATORLOOSE = R++;\nsrc[COMPARATORLOOSE] = '^' + src[GTLT] + '\\\\s*(' + LOOSEPLAIN + ')$|^$';\nvar COMPARATOR = R++;\nsrc[COMPARATOR] = '^' + src[GTLT] + '\\\\s*(' + FULLPLAIN + ')$|^$';\n\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\nvar COMPARATORTRIM = R++;\nsrc[COMPARATORTRIM] = '(\\\\s*)' + src[GTLT] +\n                      '\\\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')';\n\n// this one has to use the /g flag\nre[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g');\nvar comparatorTrimReplace = '$1$2$3';\n\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\nvar HYPHENRANGE = R++;\nsrc[HYPHENRANGE] = '^\\\\s*(' + src[XRANGEPLAIN] + ')' +\n                   '\\\\s+-\\\\s+' +\n                   '(' + src[XRANGEPLAIN] + ')' +\n                   '\\\\s*$';\n\nvar HYPHENRANGELOOSE = R++;\nsrc[HYPHENRANGELOOSE] = '^\\\\s*(' + src[XRANGEPLAINLOOSE] + ')' +\n                        '\\\\s+-\\\\s+' +\n                        '(' + src[XRANGEPLAINLOOSE] + ')' +\n                        '\\\\s*$';\n\n// Star ranges basically just allow anything at all.\nvar STAR = R++;\nsrc[STAR] = '(<|>)?=?\\\\s*\\\\*';\n\n// Compile to actual regexp objects.\n// All are flag-free, unless they were created above with a flag.\nfor (var i = 0; i < R; i++) {\n  debug(i, src[i]);\n  if (!re[i])\n    re[i] = new RegExp(src[i]);\n}\n\nexports.parse = parse;\nfunction parse(version, loose) {\n  if (version instanceof SemVer)\n    return version;\n\n  if (typeof version !== 'string')\n    return null;\n\n  if (version.length > MAX_LENGTH)\n    return null;\n\n  var r = loose ? re[LOOSE] : re[FULL];\n  if (!r.test(version))\n    return null;\n\n  try {\n    return new SemVer(version, loose);\n  } catch (er) {\n    return null;\n  }\n}\n\nexports.valid = valid;\nfunction valid(version, loose) {\n  var v = parse(version, loose);\n  return v ? v.version : null;\n}\n\n\nexports.clean = clean;\nfunction clean(version, loose) {\n  var s = parse(version.trim().replace(/^[=v]+/, ''), loose);\n  return s ? s.version : null;\n}\n\nexports.SemVer = SemVer;\n\nfunction SemVer(version, loose) {\n  if (version instanceof SemVer) {\n    if (version.loose === loose)\n      return version;\n    else\n      version = version.version;\n  } else if (typeof version !== 'string') {\n    throw new TypeError('Invalid Version: ' + version);\n  }\n\n  if (version.length > MAX_LENGTH)\n    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')\n\n  if (!(this instanceof SemVer))\n    return new SemVer(version, loose);\n\n  debug('SemVer', version, loose);\n  this.loose = loose;\n  var m = version.trim().match(loose ? re[LOOSE] : re[FULL]);\n\n  if (!m)\n    throw new TypeError('Invalid Version: ' + version);\n\n  this.raw = version;\n\n  // these are actually numbers\n  this.major = +m[1];\n  this.minor = +m[2];\n  this.patch = +m[3];\n\n  if (this.major > MAX_SAFE_INTEGER || this.major < 0)\n    throw new TypeError('Invalid major version')\n\n  if (this.minor > MAX_SAFE_INTEGER || this.minor < 0)\n    throw new TypeError('Invalid minor version')\n\n  if (this.patch > MAX_SAFE_INTEGER || this.patch < 0)\n    throw new TypeError('Invalid patch version')\n\n  // numberify any prerelease numeric ids\n  if (!m[4])\n    this.prerelease = [];\n  else\n    this.prerelease = m[4].split('.').map(function(id) {\n      if (/^[0-9]+$/.test(id)) {\n        var num = +id;\n        if (num >= 0 && num < MAX_SAFE_INTEGER)\n          return num;\n      }\n      return id;\n    });\n\n  this.build = m[5] ? m[5].split('.') : [];\n  this.format();\n}\n\nSemVer.prototype.format = function() {\n  this.version = this.major + '.' + this.minor + '.' + this.patch;\n  if (this.prerelease.length)\n    this.version += '-' + this.prerelease.join('.');\n  return this.version;\n};\n\nSemVer.prototype.toString = function() {\n  return this.version;\n};\n\nSemVer.prototype.compare = function(other) {\n  debug('SemVer.compare', this.version, this.loose, other);\n  if (!(other instanceof SemVer))\n    other = new SemVer(other, this.loose);\n\n  return this.compareMain(other) || this.comparePre(other);\n};\n\nSemVer.prototype.compareMain = function(other) {\n  if (!(other instanceof SemVer))\n    other = new SemVer(other, this.loose);\n\n  return compareIdentifiers(this.major, other.major) ||\n         compareIdentifiers(this.minor, other.minor) ||\n         compareIdentifiers(this.patch, other.patch);\n};\n\nSemVer.prototype.comparePre = function(other) {\n  if (!(other instanceof SemVer))\n    other = new SemVer(other, this.loose);\n\n  // NOT having a prerelease is > having one\n  if (this.prerelease.length && !other.prerelease.length)\n    return -1;\n  else if (!this.prerelease.length && other.prerelease.length)\n    return 1;\n  else if (!this.prerelease.length && !other.prerelease.length)\n    return 0;\n\n  var i = 0;\n  do {\n    var a = this.prerelease[i];\n    var b = other.prerelease[i];\n    debug('prerelease compare', i, a, b);\n    if (a === undefined && b === undefined)\n      return 0;\n    else if (b === undefined)\n      return 1;\n    else if (a === undefined)\n      return -1;\n    else if (a === b)\n      continue;\n    else\n      return compareIdentifiers(a, b);\n  } while (++i);\n};\n\n// preminor will bump the version up to the next minor release, and immediately\n// down to pre-release. premajor and prepatch work the same way.\nSemVer.prototype.inc = function(release, identifier) {\n  switch (release) {\n    case 'premajor':\n      this.prerelease.length = 0;\n      this.patch = 0;\n      this.minor = 0;\n      this.major++;\n      this.inc('pre', identifier);\n      break;\n    case 'preminor':\n      this.prerelease.length = 0;\n      this.patch = 0;\n      this.minor++;\n      this.inc('pre', identifier);\n      break;\n    case 'prepatch':\n      // If this is already a prerelease, it will bump to the next version\n      // drop any prereleases that might already exist, since they are not\n      // relevant at this point.\n      this.prerelease.length = 0;\n      this.inc('patch', identifier);\n      this.inc('pre', identifier);\n      break;\n    // If the input is a non-prerelease version, this acts the same as\n    // prepatch.\n    case 'prerelease':\n      if (this.prerelease.length === 0)\n        this.inc('patch', identifier);\n      this.inc('pre', identifier);\n      break;\n\n    case 'major':\n      // If this is a pre-major version, bump up to the same major version.\n      // Otherwise increment major.\n      // 1.0.0-5 bumps to 1.0.0\n      // 1.1.0 bumps to 2.0.0\n      if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0)\n        this.major++;\n      this.minor = 0;\n      this.patch = 0;\n      this.prerelease = [];\n      break;\n    case 'minor':\n      // If this is a pre-minor version, bump up to the same minor version.\n      // Otherwise increment minor.\n      // 1.2.0-5 bumps to 1.2.0\n      // 1.2.1 bumps to 1.3.0\n      if (this.patch !== 0 || this.prerelease.length === 0)\n        this.minor++;\n      this.patch = 0;\n      this.prerelease = [];\n      break;\n    case 'patch':\n      // If this is not a pre-release version, it will increment the patch.\n      // If it is a pre-release it will bump up to the same patch version.\n      // 1.2.0-5 patches to 1.2.0\n      // 1.2.0 patches to 1.2.1\n      if (this.prerelease.length === 0)\n        this.patch++;\n      this.prerelease = [];\n      break;\n    // This probably shouldn't be used publicly.\n    // 1.0.0 \"pre\" would become 1.0.0-0 which is the wrong direction.\n    case 'pre':\n      if (this.prerelease.length === 0)\n        this.prerelease = [0];\n      else {\n        var i = this.prerelease.length;\n        while (--i >= 0) {\n          if (typeof this.prerelease[i] === 'number') {\n            this.prerelease[i]++;\n            i = -2;\n          }\n        }\n        if (i === -1) // didn't increment anything\n          this.prerelease.push(0);\n      }\n      if (identifier) {\n        // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n        // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n        if (this.prerelease[0] === identifier) {\n          if (isNaN(this.prerelease[1]))\n            this.prerelease = [identifier, 0];\n        } else\n          this.prerelease = [identifier, 0];\n      }\n      break;\n\n    default:\n      throw new Error('invalid increment argument: ' + release);\n  }\n  this.format();\n  this.raw = this.version;\n  return this;\n};\n\nexports.inc = inc;\nfunction inc(version, release, loose, identifier) {\n  if (typeof(loose) === 'string') {\n    identifier = loose;\n    loose = undefined;\n  }\n\n  try {\n    return new SemVer(version, loose).inc(release, identifier).version;\n  } catch (er) {\n    return null;\n  }\n}\n\nexports.diff = diff;\nfunction diff(version1, version2) {\n  if (eq(version1, version2)) {\n    return null;\n  } else {\n    var v1 = parse(version1);\n    var v2 = parse(version2);\n    if (v1.prerelease.length || v2.prerelease.length) {\n      for (var key in v1) {\n        if (key === 'major' || key === 'minor' || key === 'patch') {\n          if (v1[key] !== v2[key]) {\n            return 'pre'+key;\n          }\n        }\n      }\n      return 'prerelease';\n    }\n    for (var key in v1) {\n      if (key === 'major' || key === 'minor' || key === 'patch') {\n        if (v1[key] !== v2[key]) {\n          return key;\n        }\n      }\n    }\n  }\n}\n\nexports.compareIdentifiers = compareIdentifiers;\n\nvar numeric = /^[0-9]+$/;\nfunction compareIdentifiers(a, b) {\n  var anum = numeric.test(a);\n  var bnum = numeric.test(b);\n\n  if (anum && bnum) {\n    a = +a;\n    b = +b;\n  }\n\n  return (anum && !bnum) ? -1 :\n         (bnum && !anum) ? 1 :\n         a < b ? -1 :\n         a > b ? 1 :\n         0;\n}\n\nexports.rcompareIdentifiers = rcompareIdentifiers;\nfunction rcompareIdentifiers(a, b) {\n  return compareIdentifiers(b, a);\n}\n\nexports.major = major;\nfunction major(a, loose) {\n  return new SemVer(a, loose).major;\n}\n\nexports.minor = minor;\nfunction minor(a, loose) {\n  return new SemVer(a, loose).minor;\n}\n\nexports.patch = patch;\nfunction patch(a, loose) {\n  return new SemVer(a, loose).patch;\n}\n\nexports.compare = compare;\nfunction compare(a, b, loose) {\n  return new SemVer(a, loose).compare(new SemVer(b, loose));\n}\n\nexports.compareLoose = compareLoose;\nfunction compareLoose(a, b) {\n  return compare(a, b, true);\n}\n\nexports.rcompare = rcompare;\nfunction rcompare(a, b, loose) {\n  return compare(b, a, loose);\n}\n\nexports.sort = sort;\nfunction sort(list, loose) {\n  return list.sort(function(a, b) {\n    return exports.compare(a, b, loose);\n  });\n}\n\nexports.rsort = rsort;\nfunction rsort(list, loose) {\n  return list.sort(function(a, b) {\n    return exports.rcompare(a, b, loose);\n  });\n}\n\nexports.gt = gt;\nfunction gt(a, b, loose) {\n  return compare(a, b, loose) > 0;\n}\n\nexports.lt = lt;\nfunction lt(a, b, loose) {\n  return compare(a, b, loose) < 0;\n}\n\nexports.eq = eq;\nfunction eq(a, b, loose) {\n  return compare(a, b, loose) === 0;\n}\n\nexports.neq = neq;\nfunction neq(a, b, loose) {\n  return compare(a, b, loose) !== 0;\n}\n\nexports.gte = gte;\nfunction gte(a, b, loose) {\n  return compare(a, b, loose) >= 0;\n}\n\nexports.lte = lte;\nfunction lte(a, b, loose) {\n  return compare(a, b, loose) <= 0;\n}\n\nexports.cmp = cmp;\nfunction cmp(a, op, b, loose) {\n  var ret;\n  switch (op) {\n    case '===':\n      if (typeof a === 'object') a = a.version;\n      if (typeof b === 'object') b = b.version;\n      ret = a === b;\n      break;\n    case '!==':\n      if (typeof a === 'object') a = a.version;\n      if (typeof b === 'object') b = b.version;\n      ret = a !== b;\n      break;\n    case '': case '=': case '==': ret = eq(a, b, loose); break;\n    case '!=': ret = neq(a, b, loose); break;\n    case '>': ret = gt(a, b, loose); break;\n    case '>=': ret = gte(a, b, loose); break;\n    case '<': ret = lt(a, b, loose); break;\n    case '<=': ret = lte(a, b, loose); break;\n    default: throw new TypeError('Invalid operator: ' + op);\n  }\n  return ret;\n}\n\nexports.Comparator = Comparator;\nfunction Comparator(comp, loose) {\n  if (comp instanceof Comparator) {\n    if (comp.loose === loose)\n      return comp;\n    else\n      comp = comp.value;\n  }\n\n  if (!(this instanceof Comparator))\n    return new Comparator(comp, loose);\n\n  debug('comparator', comp, loose);\n  this.loose = loose;\n  this.parse(comp);\n\n  if (this.semver === ANY)\n    this.value = '';\n  else\n    this.value = this.operator + this.semver.version;\n\n  debug('comp', this);\n}\n\nvar ANY = {};\nComparator.prototype.parse = function(comp) {\n  var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR];\n  var m = comp.match(r);\n\n  if (!m)\n    throw new TypeError('Invalid comparator: ' + comp);\n\n  this.operator = m[1];\n  if (this.operator === '=')\n    this.operator = '';\n\n  // if it literally is just '>' or '' then allow anything.\n  if (!m[2])\n    this.semver = ANY;\n  else\n    this.semver = new SemVer(m[2], this.loose);\n};\n\nComparator.prototype.toString = function() {\n  return this.value;\n};\n\nComparator.prototype.test = function(version) {\n  debug('Comparator.test', version, this.loose);\n\n  if (this.semver === ANY)\n    return true;\n\n  if (typeof version === 'string')\n    version = new SemVer(version, this.loose);\n\n  return cmp(version, this.operator, this.semver, this.loose);\n};\n\nComparator.prototype.intersects = function(comp, loose) {\n  if (!(comp instanceof Comparator)) {\n    throw new TypeError('a Comparator is required');\n  }\n\n  var rangeTmp;\n\n  if (this.operator === '') {\n    rangeTmp = new Range(comp.value, loose);\n    return satisfies(this.value, rangeTmp, loose);\n  } else if (comp.operator === '') {\n    rangeTmp = new Range(this.value, loose);\n    return satisfies(comp.semver, rangeTmp, loose);\n  }\n\n  var sameDirectionIncreasing =\n    (this.operator === '>=' || this.operator === '>') &&\n    (comp.operator === '>=' || comp.operator === '>');\n  var sameDirectionDecreasing =\n    (this.operator === '<=' || this.operator === '<') &&\n    (comp.operator === '<=' || comp.operator === '<');\n  var sameSemVer = this.semver.version === comp.semver.version;\n  var differentDirectionsInclusive =\n    (this.operator === '>=' || this.operator === '<=') &&\n    (comp.operator === '>=' || comp.operator === '<=');\n  var oppositeDirectionsLessThan =\n    cmp(this.semver, '<', comp.semver, loose) &&\n    ((this.operator === '>=' || this.operator === '>') &&\n    (comp.operator === '<=' || comp.operator === '<'));\n  var oppositeDirectionsGreaterThan =\n    cmp(this.semver, '>', comp.semver, loose) &&\n    ((this.operator === '<=' || this.operator === '<') &&\n    (comp.operator === '>=' || comp.operator === '>'));\n\n  return sameDirectionIncreasing || sameDirectionDecreasing ||\n    (sameSemVer && differentDirectionsInclusive) ||\n    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan;\n};\n\n\nexports.Range = Range;\nfunction Range(range, loose) {\n  if (range instanceof Range) {\n    if (range.loose === loose) {\n      return range;\n    } else {\n      return new Range(range.raw, loose);\n    }\n  }\n\n  if (range instanceof Comparator) {\n    return new Range(range.value, loose);\n  }\n\n  if (!(this instanceof Range))\n    return new Range(range, loose);\n\n  this.loose = loose;\n\n  // First, split based on boolean or ||\n  this.raw = range;\n  this.set = range.split(/\\s*\\|\\|\\s*/).map(function(range) {\n    return this.parseRange(range.trim());\n  }, this).filter(function(c) {\n    // throw out any that are not relevant for whatever reason\n    return c.length;\n  });\n\n  if (!this.set.length) {\n    throw new TypeError('Invalid SemVer Range: ' + range);\n  }\n\n  this.format();\n}\n\nRange.prototype.format = function() {\n  this.range = this.set.map(function(comps) {\n    return comps.join(' ').trim();\n  }).join('||').trim();\n  return this.range;\n};\n\nRange.prototype.toString = function() {\n  return this.range;\n};\n\nRange.prototype.parseRange = function(range) {\n  var loose = this.loose;\n  range = range.trim();\n  debug('range', range, loose);\n  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n  var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE];\n  range = range.replace(hr, hyphenReplace);\n  debug('hyphen replace', range);\n  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n  range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace);\n  debug('comparator trim', range, re[COMPARATORTRIM]);\n\n  // `~ 1.2.3` => `~1.2.3`\n  range = range.replace(re[TILDETRIM], tildeTrimReplace);\n\n  // `^ 1.2.3` => `^1.2.3`\n  range = range.replace(re[CARETTRIM], caretTrimReplace);\n\n  // normalize spaces\n  range = range.split(/\\s+/).join(' ');\n\n  // At this point, the range is completely trimmed and\n  // ready to be split into comparators.\n\n  var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR];\n  var set = range.split(' ').map(function(comp) {\n    return parseComparator(comp, loose);\n  }).join(' ').split(/\\s+/);\n  if (this.loose) {\n    // in loose mode, throw out any that are not valid comparators\n    set = set.filter(function(comp) {\n      return !!comp.match(compRe);\n    });\n  }\n  set = set.map(function(comp) {\n    return new Comparator(comp, loose);\n  });\n\n  return set;\n};\n\nRange.prototype.intersects = function(range, loose) {\n  if (!(range instanceof Range)) {\n    throw new TypeError('a Range is required');\n  }\n\n  return this.set.some(function(thisComparators) {\n    return thisComparators.every(function(thisComparator) {\n      return range.set.some(function(rangeComparators) {\n        return rangeComparators.every(function(rangeComparator) {\n          return thisComparator.intersects(rangeComparator, loose);\n        });\n      });\n    });\n  });\n};\n\n// Mostly just for testing and legacy API reasons\nexports.toComparators = toComparators;\nfunction toComparators(range, loose) {\n  return new Range(range, loose).set.map(function(comp) {\n    return comp.map(function(c) {\n      return c.value;\n    }).join(' ').trim().split(' ');\n  });\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nfunction parseComparator(comp, loose) {\n  debug('comp', comp);\n  comp = replaceCarets(comp, loose);\n  debug('caret', comp);\n  comp = replaceTildes(comp, loose);\n  debug('tildes', comp);\n  comp = replaceXRanges(comp, loose);\n  debug('xrange', comp);\n  comp = replaceStars(comp, loose);\n  debug('stars', comp);\n  return comp;\n}\n\nfunction isX(id) {\n  return !id || id.toLowerCase() === 'x' || id === '*';\n}\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0\nfunction replaceTildes(comp, loose) {\n  return comp.trim().split(/\\s+/).map(function(comp) {\n    return replaceTilde(comp, loose);\n  }).join(' ');\n}\n\nfunction replaceTilde(comp, loose) {\n  var r = loose ? re[TILDELOOSE] : re[TILDE];\n  return comp.replace(r, function(_, M, m, p, pr) {\n    debug('tilde', comp, _, M, m, p, pr);\n    var ret;\n\n    if (isX(M))\n      ret = '';\n    else if (isX(m))\n      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';\n    else if (isX(p))\n      // ~1.2 == >=1.2.0 <1.3.0\n      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';\n    else if (pr) {\n      debug('replaceTilde pr', pr);\n      if (pr.charAt(0) !== '-')\n        pr = '-' + pr;\n      ret = '>=' + M + '.' + m + '.' + p + pr +\n            ' <' + M + '.' + (+m + 1) + '.0';\n    } else\n      // ~1.2.3 == >=1.2.3 <1.3.0\n      ret = '>=' + M + '.' + m + '.' + p +\n            ' <' + M + '.' + (+m + 1) + '.0';\n\n    debug('tilde return', ret);\n    return ret;\n  });\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0\n// ^1.2.3 --> >=1.2.3 <2.0.0\n// ^1.2.0 --> >=1.2.0 <2.0.0\nfunction replaceCarets(comp, loose) {\n  return comp.trim().split(/\\s+/).map(function(comp) {\n    return replaceCaret(comp, loose);\n  }).join(' ');\n}\n\nfunction replaceCaret(comp, loose) {\n  debug('caret', comp, loose);\n  var r = loose ? re[CARETLOOSE] : re[CARET];\n  return comp.replace(r, function(_, M, m, p, pr) {\n    debug('caret', comp, _, M, m, p, pr);\n    var ret;\n\n    if (isX(M))\n      ret = '';\n    else if (isX(m))\n      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';\n    else if (isX(p)) {\n      if (M === '0')\n        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';\n      else\n        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0';\n    } else if (pr) {\n      debug('replaceCaret pr', pr);\n      if (pr.charAt(0) !== '-')\n        pr = '-' + pr;\n      if (M === '0') {\n        if (m === '0')\n          ret = '>=' + M + '.' + m + '.' + p + pr +\n                ' <' + M + '.' + m + '.' + (+p + 1);\n        else\n          ret = '>=' + M + '.' + m + '.' + p + pr +\n                ' <' + M + '.' + (+m + 1) + '.0';\n      } else\n        ret = '>=' + M + '.' + m + '.' + p + pr +\n              ' <' + (+M + 1) + '.0.0';\n    } else {\n      debug('no pr');\n      if (M === '0') {\n        if (m === '0')\n          ret = '>=' + M + '.' + m + '.' + p +\n                ' <' + M + '.' + m + '.' + (+p + 1);\n        else\n          ret = '>=' + M + '.' + m + '.' + p +\n                ' <' + M + '.' + (+m + 1) + '.0';\n      } else\n        ret = '>=' + M + '.' + m + '.' + p +\n              ' <' + (+M + 1) + '.0.0';\n    }\n\n    debug('caret return', ret);\n    return ret;\n  });\n}\n\nfunction replaceXRanges(comp, loose) {\n  debug('replaceXRanges', comp, loose);\n  return comp.split(/\\s+/).map(function(comp) {\n    return replaceXRange(comp, loose);\n  }).join(' ');\n}\n\nfunction replaceXRange(comp, loose) {\n  comp = comp.trim();\n  var r = loose ? re[XRANGELOOSE] : re[XRANGE];\n  return comp.replace(r, function(ret, gtlt, M, m, p, pr) {\n    debug('xRange', comp, ret, gtlt, M, m, p, pr);\n    var xM = isX(M);\n    var xm = xM || isX(m);\n    var xp = xm || isX(p);\n    var anyX = xp;\n\n    if (gtlt === '=' && anyX)\n      gtlt = '';\n\n    if (xM) {\n      if (gtlt === '>' || gtlt === '<') {\n        // nothing is allowed\n        ret = '<0.0.0';\n      } else {\n        // nothing is forbidden\n        ret = '*';\n      }\n    } else if (gtlt && anyX) {\n      // replace X with 0\n      if (xm)\n        m = 0;\n      if (xp)\n        p = 0;\n\n      if (gtlt === '>') {\n        // >1 => >=2.0.0\n        // >1.2 => >=1.3.0\n        // >1.2.3 => >= 1.2.4\n        gtlt = '>=';\n        if (xm) {\n          M = +M + 1;\n          m = 0;\n          p = 0;\n        } else if (xp) {\n          m = +m + 1;\n          p = 0;\n        }\n      } else if (gtlt === '<=') {\n        // <=0.7.x is actually <0.8.0, since any 0.7.x should\n        // pass.  Similarly, <=7.x is actually <8.0.0, etc.\n        gtlt = '<';\n        if (xm)\n          M = +M + 1;\n        else\n          m = +m + 1;\n      }\n\n      ret = gtlt + M + '.' + m + '.' + p;\n    } else if (xm) {\n      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';\n    } else if (xp) {\n      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';\n    }\n\n    debug('xRange return', ret);\n\n    return ret;\n  });\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nfunction replaceStars(comp, loose) {\n  debug('replaceStars', comp, loose);\n  // Looseness is ignored here.  star is always as loose as it gets!\n  return comp.trim().replace(re[STAR], '');\n}\n\n// This function is passed to string.replace(re[HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0\nfunction hyphenReplace($0,\n                       from, fM, fm, fp, fpr, fb,\n                       to, tM, tm, tp, tpr, tb) {\n\n  if (isX(fM))\n    from = '';\n  else if (isX(fm))\n    from = '>=' + fM + '.0.0';\n  else if (isX(fp))\n    from = '>=' + fM + '.' + fm + '.0';\n  else\n    from = '>=' + from;\n\n  if (isX(tM))\n    to = '';\n  else if (isX(tm))\n    to = '<' + (+tM + 1) + '.0.0';\n  else if (isX(tp))\n    to = '<' + tM + '.' + (+tm + 1) + '.0';\n  else if (tpr)\n    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;\n  else\n    to = '<=' + to;\n\n  return (from + ' ' + to).trim();\n}\n\n\n// if ANY of the sets match ALL of its comparators, then pass\nRange.prototype.test = function(version) {\n  if (!version)\n    return false;\n\n  if (typeof version === 'string')\n    version = new SemVer(version, this.loose);\n\n  for (var i = 0; i < this.set.length; i++) {\n    if (testSet(this.set[i], version))\n      return true;\n  }\n  return false;\n};\n\nfunction testSet(set, version) {\n  for (var i = 0; i < set.length; i++) {\n    if (!set[i].test(version))\n      return false;\n  }\n\n  if (version.prerelease.length) {\n    // Find the set of versions that are allowed to have prereleases\n    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n    // That should allow `1.2.3-pr.2` to pass.\n    // However, `1.2.4-alpha.notready` should NOT be allowed,\n    // even though it's within the range set by the comparators.\n    for (var i = 0; i < set.length; i++) {\n      debug(set[i].semver);\n      if (set[i].semver === ANY)\n        continue;\n\n      if (set[i].semver.prerelease.length > 0) {\n        var allowed = set[i].semver;\n        if (allowed.major === version.major &&\n            allowed.minor === version.minor &&\n            allowed.patch === version.patch)\n          return true;\n      }\n    }\n\n    // Version has a -pre, but it's not one of the ones we like.\n    return false;\n  }\n\n  return true;\n}\n\nexports.satisfies = satisfies;\nfunction satisfies(version, range, loose) {\n  try {\n    range = new Range(range, loose);\n  } catch (er) {\n    return false;\n  }\n  return range.test(version);\n}\n\nexports.maxSatisfying = maxSatisfying;\nfunction maxSatisfying(versions, range, loose) {\n  var max = null;\n  var maxSV = null;\n  try {\n    var rangeObj = new Range(range, loose);\n  } catch (er) {\n    return null;\n  }\n  versions.forEach(function (v) {\n    if (rangeObj.test(v)) { // satisfies(v, range, loose)\n      if (!max || maxSV.compare(v) === -1) { // compare(max, v, true)\n        max = v;\n        maxSV = new SemVer(max, loose);\n      }\n    }\n  })\n  return max;\n}\n\nexports.minSatisfying = minSatisfying;\nfunction minSatisfying(versions, range, loose) {\n  var min = null;\n  var minSV = null;\n  try {\n    var rangeObj = new Range(range, loose);\n  } catch (er) {\n    return null;\n  }\n  versions.forEach(function (v) {\n    if (rangeObj.test(v)) { // satisfies(v, range, loose)\n      if (!min || minSV.compare(v) === 1) { // compare(min, v, true)\n        min = v;\n        minSV = new SemVer(min, loose);\n      }\n    }\n  })\n  return min;\n}\n\nexports.validRange = validRange;\nfunction validRange(range, loose) {\n  try {\n    // Return '*' instead of '' so that truthiness works.\n    // This will throw if it's invalid anyway\n    return new Range(range, loose).range || '*';\n  } catch (er) {\n    return null;\n  }\n}\n\n// Determine if version is less than all the versions possible in the range\nexports.ltr = ltr;\nfunction ltr(version, range, loose) {\n  return outside(version, range, '<', loose);\n}\n\n// Determine if version is greater than all the versions possible in the range.\nexports.gtr = gtr;\nfunction gtr(version, range, loose) {\n  return outside(version, range, '>', loose);\n}\n\nexports.outside = outside;\nfunction outside(version, range, hilo, loose) {\n  version = new SemVer(version, loose);\n  range = new Range(range, loose);\n\n  var gtfn, ltefn, ltfn, comp, ecomp;\n  switch (hilo) {\n    case '>':\n      gtfn = gt;\n      ltefn = lte;\n      ltfn = lt;\n      comp = '>';\n      ecomp = '>=';\n      break;\n    case '<':\n      gtfn = lt;\n      ltefn = gte;\n      ltfn = gt;\n      comp = '<';\n      ecomp = '<=';\n      break;\n    default:\n      throw new TypeError('Must provide a hilo val of \"<\" or \">\"');\n  }\n\n  // If it satisifes the range it is not outside\n  if (satisfies(version, range, loose)) {\n    return false;\n  }\n\n  // From now on, variable terms are as if we're in \"gtr\" mode.\n  // but note that everything is flipped for the \"ltr\" function.\n\n  for (var i = 0; i < range.set.length; ++i) {\n    var comparators = range.set[i];\n\n    var high = null;\n    var low = null;\n\n    comparators.forEach(function(comparator) {\n      if (comparator.semver === ANY) {\n        comparator = new Comparator('>=0.0.0')\n      }\n      high = high || comparator;\n      low = low || comparator;\n      if (gtfn(comparator.semver, high.semver, loose)) {\n        high = comparator;\n      } else if (ltfn(comparator.semver, low.semver, loose)) {\n        low = comparator;\n      }\n    });\n\n    // If the edge version comparator has a operator then our version\n    // isn't outside it\n    if (high.operator === comp || high.operator === ecomp) {\n      return false;\n    }\n\n    // If the lowest version comparator has an operator and our version\n    // is less than it then it isn't higher than the range\n    if ((!low.operator || low.operator === comp) &&\n        ltefn(version, low.semver)) {\n      return false;\n    } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexports.prerelease = prerelease;\nfunction prerelease(version, loose) {\n  var parsed = parse(version, loose);\n  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null;\n}\n\nexports.intersects = intersects;\nfunction intersects(r1, r2, loose) {\n  r1 = new Range(r1, loose)\n  r2 = new Range(r2, loose)\n  return r1.intersects(r2)\n}\n\nexports.coerce = coerce;\nfunction coerce(version) {\n  if (version instanceof SemVer)\n    return version;\n\n  if (typeof version !== 'string')\n    return null;\n\n  var match = version.match(re[COERCE]);\n\n  if (match == null)\n    return null;\n\n  return parse((match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0')); \n}\n","(function (global, undefined) {\n    \"use strict\";\n\n    if (global.setImmediate) {\n        return;\n    }\n\n    var nextHandle = 1; // Spec says greater than zero\n    var tasksByHandle = {};\n    var currentlyRunningATask = false;\n    var doc = global.document;\n    var registerImmediate;\n\n    function setImmediate(callback) {\n      // Callback can either be a function or a string\n      if (typeof callback !== \"function\") {\n        callback = new Function(\"\" + callback);\n      }\n      // Copy function arguments\n      var args = new Array(arguments.length - 1);\n      for (var i = 0; i < args.length; i++) {\n          args[i] = arguments[i + 1];\n      }\n      // Store and register the task\n      var task = { callback: callback, args: args };\n      tasksByHandle[nextHandle] = task;\n      registerImmediate(nextHandle);\n      return nextHandle++;\n    }\n\n    function clearImmediate(handle) {\n        delete tasksByHandle[handle];\n    }\n\n    function run(task) {\n        var callback = task.callback;\n        var args = task.args;\n        switch (args.length) {\n        case 0:\n            callback();\n            break;\n        case 1:\n            callback(args[0]);\n            break;\n        case 2:\n            callback(args[0], args[1]);\n            break;\n        case 3:\n            callback(args[0], args[1], args[2]);\n            break;\n        default:\n            callback.apply(undefined, args);\n            break;\n        }\n    }\n\n    function runIfPresent(handle) {\n        // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n        // So if we're currently running a task, we'll need to delay this invocation.\n        if (currentlyRunningATask) {\n            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n            // \"too much recursion\" error.\n            setTimeout(runIfPresent, 0, handle);\n        } else {\n            var task = tasksByHandle[handle];\n            if (task) {\n                currentlyRunningATask = true;\n                try {\n                    run(task);\n                } finally {\n                    clearImmediate(handle);\n                    currentlyRunningATask = false;\n                }\n            }\n        }\n    }\n\n    function installNextTickImplementation() {\n        registerImmediate = function(handle) {\n            process.nextTick(function () { runIfPresent(handle); });\n        };\n    }\n\n    function canUsePostMessage() {\n        // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n        // where `global.postMessage` means something completely different and can't be used for this purpose.\n        if (global.postMessage && !global.importScripts) {\n            var postMessageIsAsynchronous = true;\n            var oldOnMessage = global.onmessage;\n            global.onmessage = function() {\n                postMessageIsAsynchronous = false;\n            };\n            global.postMessage(\"\", \"*\");\n            global.onmessage = oldOnMessage;\n            return postMessageIsAsynchronous;\n        }\n    }\n\n    function installPostMessageImplementation() {\n        // Installs an event handler on `global` for the `message` event: see\n        // * https://developer.mozilla.org/en/DOM/window.postMessage\n        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n        var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n        var onGlobalMessage = function(event) {\n            if (event.source === global &&\n                typeof event.data === \"string\" &&\n                event.data.indexOf(messagePrefix) === 0) {\n                runIfPresent(+event.data.slice(messagePrefix.length));\n            }\n        };\n\n        if (global.addEventListener) {\n            global.addEventListener(\"message\", onGlobalMessage, false);\n        } else {\n            global.attachEvent(\"onmessage\", onGlobalMessage);\n        }\n\n        registerImmediate = function(handle) {\n            global.postMessage(messagePrefix + handle, \"*\");\n        };\n    }\n\n    function installMessageChannelImplementation() {\n        var channel = new MessageChannel();\n        channel.port1.onmessage = function(event) {\n            var handle = event.data;\n            runIfPresent(handle);\n        };\n\n        registerImmediate = function(handle) {\n            channel.port2.postMessage(handle);\n        };\n    }\n\n    function installReadyStateChangeImplementation() {\n        var html = doc.documentElement;\n        registerImmediate = function(handle) {\n            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n            var script = doc.createElement(\"script\");\n            script.onreadystatechange = function () {\n                runIfPresent(handle);\n                script.onreadystatechange = null;\n                html.removeChild(script);\n                script = null;\n            };\n            html.appendChild(script);\n        };\n    }\n\n    function installSetTimeoutImplementation() {\n        registerImmediate = function(handle) {\n            setTimeout(runIfPresent, 0, handle);\n        };\n    }\n\n    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n    // Don't get fooled by e.g. browserify environments.\n    if ({}.toString.call(global.process) === \"[object process]\") {\n        // For Node.js before 0.9\n        installNextTickImplementation();\n\n    } else if (canUsePostMessage()) {\n        // For non-IE10 modern browsers\n        installPostMessageImplementation();\n\n    } else if (global.MessageChannel) {\n        // For web workers, where supported\n        installMessageChannelImplementation();\n\n    } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n        // For IE 6â€“8\n        installReadyStateChangeImplementation();\n\n    } else {\n        // For older browsers\n        installSetTimeoutImplementation();\n    }\n\n    attachTo.setImmediate = setImmediate;\n    attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n","var scope = (typeof global !== \"undefined\" && global) ||\n            (typeof self !== \"undefined\" && self) ||\n            window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n  return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n  return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n  if (timeout) {\n    timeout.close();\n  }\n};\n\nfunction Timeout(id, clearFn) {\n  this._id = id;\n  this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n  this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n  clearTimeout(item._idleTimeoutId);\n\n  var msecs = item._idleTimeout;\n  if (msecs >= 0) {\n    item._idleTimeoutId = setTimeout(function onTimeout() {\n      if (item._onTimeout)\n        item._onTimeout();\n    }, msecs);\n  }\n};\n\n// setimmediate attaches itself to the global object\nrequire(\"setimmediate\");\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto.  Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n                       (typeof global !== \"undefined\" && global.setImmediate) ||\n                       (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n                         (typeof global !== \"undefined\" && global.clearImmediate) ||\n                         (this && this.clearImmediate);\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n    if (m) return m.call(o);\r\n    return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","/*!\n * URI.js - Mutating URLs\n * IPv6 Support\n *\n * Version: 1.19.1\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n *   MIT License http://www.opensource.org/licenses/mit-license\n *\n */\n\n(function (root, factory) {\n  'use strict';\n  // https://github.com/umdjs/umd/blob/master/returnExports.js\n  if (typeof module === 'object' && module.exports) {\n    // Node\n    module.exports = factory();\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define(factory);\n  } else {\n    // Browser globals (root is window)\n    root.IPv6 = factory(root);\n  }\n}(this, function (root) {\n  'use strict';\n\n  /*\n  var _in = \"fe80:0000:0000:0000:0204:61ff:fe9d:f156\";\n  var _out = IPv6.best(_in);\n  var _expected = \"fe80::204:61ff:fe9d:f156\";\n\n  console.log(_in, _out, _expected, _out === _expected);\n  */\n\n  // save current IPv6 variable, if any\n  var _IPv6 = root && root.IPv6;\n\n  function bestPresentation(address) {\n    // based on:\n    // Javascript to test an IPv6 address for proper format, and to\n    // present the \"best text representation\" according to IETF Draft RFC at\n    // http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04\n    // 8 Feb 2010 Rich Brown, Dartware, LLC\n    // Please feel free to use this code as long as you provide a link to\n    // http://www.intermapper.com\n    // http://intermapper.com/support/tools/IPV6-Validator.aspx\n    // http://download.dartware.com/thirdparty/ipv6validator.js\n\n    var _address = address.toLowerCase();\n    var segments = _address.split(':');\n    var length = segments.length;\n    var total = 8;\n\n    // trim colons (:: or ::a:b:câ€¦ or â€¦a:b:c::)\n    if (segments[0] === '' && segments[1] === '' && segments[2] === '') {\n      // must have been ::\n      // remove first two items\n      segments.shift();\n      segments.shift();\n    } else if (segments[0] === '' && segments[1] === '') {\n      // must have been ::xxxx\n      // remove the first item\n      segments.shift();\n    } else if (segments[length - 1] === '' && segments[length - 2] === '') {\n      // must have been xxxx::\n      segments.pop();\n    }\n\n    length = segments.length;\n\n    // adjust total segments for IPv4 trailer\n    if (segments[length - 1].indexOf('.') !== -1) {\n      // found a \".\" which means IPv4\n      total = 7;\n    }\n\n    // fill empty segments them with \"0000\"\n    var pos;\n    for (pos = 0; pos < length; pos++) {\n      if (segments[pos] === '') {\n        break;\n      }\n    }\n\n    if (pos < total) {\n      segments.splice(pos, 1, '0000');\n      while (segments.length < total) {\n        segments.splice(pos, 0, '0000');\n      }\n    }\n\n    // strip leading zeros\n    var _segments;\n    for (var i = 0; i < total; i++) {\n      _segments = segments[i].split('');\n      for (var j = 0; j < 3 ; j++) {\n        if (_segments[0] === '0' && _segments.length > 1) {\n          _segments.splice(0,1);\n        } else {\n          break;\n        }\n      }\n\n      segments[i] = _segments.join('');\n    }\n\n    // find longest sequence of zeroes and coalesce them into one segment\n    var best = -1;\n    var _best = 0;\n    var _current = 0;\n    var current = -1;\n    var inzeroes = false;\n    // i; already declared\n\n    for (i = 0; i < total; i++) {\n      if (inzeroes) {\n        if (segments[i] === '0') {\n          _current += 1;\n        } else {\n          inzeroes = false;\n          if (_current > _best) {\n            best = current;\n            _best = _current;\n          }\n        }\n      } else {\n        if (segments[i] === '0') {\n          inzeroes = true;\n          current = i;\n          _current = 1;\n        }\n      }\n    }\n\n    if (_current > _best) {\n      best = current;\n      _best = _current;\n    }\n\n    if (_best > 1) {\n      segments.splice(best, _best, '');\n    }\n\n    length = segments.length;\n\n    // assemble remaining segments\n    var result = '';\n    if (segments[0] === '')  {\n      result = ':';\n    }\n\n    for (i = 0; i < length; i++) {\n      result += segments[i];\n      if (i === length - 1) {\n        break;\n      }\n\n      result += ':';\n    }\n\n    if (segments[length - 1] === '') {\n      result += ':';\n    }\n\n    return result;\n  }\n\n  function noConflict() {\n    /*jshint validthis: true */\n    if (root.IPv6 === this) {\n      root.IPv6 = _IPv6;\n    }\n\n    return this;\n  }\n\n  return {\n    best: bestPresentation,\n    noConflict: noConflict\n  };\n}));\n","/*!\n * URI.js - Mutating URLs\n * Second Level Domain (SLD) Support\n *\n * Version: 1.19.1\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n *   MIT License http://www.opensource.org/licenses/mit-license\n *\n */\n\n(function (root, factory) {\n  'use strict';\n  // https://github.com/umdjs/umd/blob/master/returnExports.js\n  if (typeof module === 'object' && module.exports) {\n    // Node\n    module.exports = factory();\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define(factory);\n  } else {\n    // Browser globals (root is window)\n    root.SecondLevelDomains = factory(root);\n  }\n}(this, function (root) {\n  'use strict';\n\n  // save current SecondLevelDomains variable, if any\n  var _SecondLevelDomains = root && root.SecondLevelDomains;\n\n  var SLD = {\n    // list of known Second Level Domains\n    // converted list of SLDs from https://github.com/gavingmiller/second-level-domains\n    // ----\n    // publicsuffix.org is more current and actually used by a couple of browsers internally.\n    // downside is it also contains domains like \"dyndns.org\" - which is fine for the security\n    // issues browser have to deal with (SOP for cookies, etc) - but is way overboard for URI.js\n    // ----\n    list: {\n      'ac':' com gov mil net org ',\n      'ae':' ac co gov mil name net org pro sch ',\n      'af':' com edu gov net org ',\n      'al':' com edu gov mil net org ',\n      'ao':' co ed gv it og pb ',\n      'ar':' com edu gob gov int mil net org tur ',\n      'at':' ac co gv or ',\n      'au':' asn com csiro edu gov id net org ',\n      'ba':' co com edu gov mil net org rs unbi unmo unsa untz unze ',\n      'bb':' biz co com edu gov info net org store tv ',\n      'bh':' biz cc com edu gov info net org ',\n      'bn':' com edu gov net org ',\n      'bo':' com edu gob gov int mil net org tv ',\n      'br':' adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ',\n      'bs':' com edu gov net org ',\n      'bz':' du et om ov rg ',\n      'ca':' ab bc mb nb nf nl ns nt nu on pe qc sk yk ',\n      'ck':' biz co edu gen gov info net org ',\n      'cn':' ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ',\n      'co':' com edu gov mil net nom org ',\n      'cr':' ac c co ed fi go or sa ',\n      'cy':' ac biz com ekloges gov ltd name net org parliament press pro tm ',\n      'do':' art com edu gob gov mil net org sld web ',\n      'dz':' art asso com edu gov net org pol ',\n      'ec':' com edu fin gov info med mil net org pro ',\n      'eg':' com edu eun gov mil name net org sci ',\n      'er':' com edu gov ind mil net org rochest w ',\n      'es':' com edu gob nom org ',\n      'et':' biz com edu gov info name net org ',\n      'fj':' ac biz com info mil name net org pro ',\n      'fk':' ac co gov net nom org ',\n      'fr':' asso com f gouv nom prd presse tm ',\n      'gg':' co net org ',\n      'gh':' com edu gov mil org ',\n      'gn':' ac com gov net org ',\n      'gr':' com edu gov mil net org ',\n      'gt':' com edu gob ind mil net org ',\n      'gu':' com edu gov net org ',\n      'hk':' com edu gov idv net org ',\n      'hu':' 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ',\n      'id':' ac co go mil net or sch web ',\n      'il':' ac co gov idf k12 muni net org ',\n      'in':' ac co edu ernet firm gen gov i ind mil net nic org res ',\n      'iq':' com edu gov i mil net org ',\n      'ir':' ac co dnssec gov i id net org sch ',\n      'it':' edu gov ',\n      'je':' co net org ',\n      'jo':' com edu gov mil name net org sch ',\n      'jp':' ac ad co ed go gr lg ne or ',\n      'ke':' ac co go info me mobi ne or sc ',\n      'kh':' com edu gov mil net org per ',\n      'ki':' biz com de edu gov info mob net org tel ',\n      'km':' asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ',\n      'kn':' edu gov net org ',\n      'kr':' ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ',\n      'kw':' com edu gov net org ',\n      'ky':' com edu gov net org ',\n      'kz':' com edu gov mil net org ',\n      'lb':' com edu gov net org ',\n      'lk':' assn com edu gov grp hotel int ltd net ngo org sch soc web ',\n      'lr':' com edu gov net org ',\n      'lv':' asn com conf edu gov id mil net org ',\n      'ly':' com edu gov id med net org plc sch ',\n      'ma':' ac co gov m net org press ',\n      'mc':' asso tm ',\n      'me':' ac co edu gov its net org priv ',\n      'mg':' com edu gov mil nom org prd tm ',\n      'mk':' com edu gov inf name net org pro ',\n      'ml':' com edu gov net org presse ',\n      'mn':' edu gov org ',\n      'mo':' com edu gov net org ',\n      'mt':' com edu gov net org ',\n      'mv':' aero biz com coop edu gov info int mil museum name net org pro ',\n      'mw':' ac co com coop edu gov int museum net org ',\n      'mx':' com edu gob net org ',\n      'my':' com edu gov mil name net org sch ',\n      'nf':' arts com firm info net other per rec store web ',\n      'ng':' biz com edu gov mil mobi name net org sch ',\n      'ni':' ac co com edu gob mil net nom org ',\n      'np':' com edu gov mil net org ',\n      'nr':' biz com edu gov info net org ',\n      'om':' ac biz co com edu gov med mil museum net org pro sch ',\n      'pe':' com edu gob mil net nom org sld ',\n      'ph':' com edu gov i mil net ngo org ',\n      'pk':' biz com edu fam gob gok gon gop gos gov net org web ',\n      'pl':' art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ',\n      'pr':' ac biz com edu est gov info isla name net org pro prof ',\n      'ps':' com edu gov net org plo sec ',\n      'pw':' belau co ed go ne or ',\n      'ro':' arts com firm info nom nt org rec store tm www ',\n      'rs':' ac co edu gov in org ',\n      'sb':' com edu gov net org ',\n      'sc':' com edu gov net org ',\n      'sh':' co com edu gov net nom org ',\n      'sl':' com edu gov net org ',\n      'st':' co com consulado edu embaixada gov mil net org principe saotome store ',\n      'sv':' com edu gob org red ',\n      'sz':' ac co org ',\n      'tr':' av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ',\n      'tt':' aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ',\n      'tw':' club com ebiz edu game gov idv mil net org ',\n      'mu':' ac co com gov net or org ',\n      'mz':' ac co edu gov org ',\n      'na':' co com ',\n      'nz':' ac co cri geek gen govt health iwi maori mil net org parliament school ',\n      'pa':' abo ac com edu gob ing med net nom org sld ',\n      'pt':' com edu gov int net nome org publ ',\n      'py':' com edu gov mil net org ',\n      'qa':' com edu gov mil net org ',\n      're':' asso com nom ',\n      'ru':' ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ',\n      'rw':' ac co com edu gouv gov int mil net ',\n      'sa':' com edu gov med net org pub sch ',\n      'sd':' com edu gov info med net org tv ',\n      'se':' a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ',\n      'sg':' com edu gov idn net org per ',\n      'sn':' art com edu gouv org perso univ ',\n      'sy':' com edu gov mil net news org ',\n      'th':' ac co go in mi net or ',\n      'tj':' ac biz co com edu go gov info int mil name net nic org test web ',\n      'tn':' agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ',\n      'tz':' ac co go ne or ',\n      'ua':' biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ',\n      'ug':' ac co go ne or org sc ',\n      'uk':' ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ',\n      'us':' dni fed isa kids nsn ',\n      'uy':' com edu gub mil net org ',\n      've':' co com edu gob info mil net org web ',\n      'vi':' co com k12 net org ',\n      'vn':' ac biz com edu gov health info int name net org pro ',\n      'ye':' co com gov ltd me net org plc ',\n      'yu':' ac co edu gov org ',\n      'za':' ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ',\n      'zm':' ac co com edu gov net org sch ',\n      // https://en.wikipedia.org/wiki/CentralNic#Second-level_domains\n      'com': 'ar br cn de eu gb gr hu jpn kr no qc ru sa se uk us uy za ',\n      'net': 'gb jp se uk ',\n      'org': 'ae',\n      'de': 'com '\n    },\n    // gorhill 2013-10-25: Using indexOf() instead Regexp(). Significant boost\n    // in both performance and memory footprint. No initialization required.\n    // http://jsperf.com/uri-js-sld-regex-vs-binary-search/4\n    // Following methods use lastIndexOf() rather than array.split() in order\n    // to avoid any memory allocations.\n    has: function(domain) {\n      var tldOffset = domain.lastIndexOf('.');\n      if (tldOffset <= 0 || tldOffset >= (domain.length-1)) {\n        return false;\n      }\n      var sldOffset = domain.lastIndexOf('.', tldOffset-1);\n      if (sldOffset <= 0 || sldOffset >= (tldOffset-1)) {\n        return false;\n      }\n      var sldList = SLD.list[domain.slice(tldOffset+1)];\n      if (!sldList) {\n        return false;\n      }\n      return sldList.indexOf(' ' + domain.slice(sldOffset+1, tldOffset) + ' ') >= 0;\n    },\n    is: function(domain) {\n      var tldOffset = domain.lastIndexOf('.');\n      if (tldOffset <= 0 || tldOffset >= (domain.length-1)) {\n        return false;\n      }\n      var sldOffset = domain.lastIndexOf('.', tldOffset-1);\n      if (sldOffset >= 0) {\n        return false;\n      }\n      var sldList = SLD.list[domain.slice(tldOffset+1)];\n      if (!sldList) {\n        return false;\n      }\n      return sldList.indexOf(' ' + domain.slice(0, tldOffset) + ' ') >= 0;\n    },\n    get: function(domain) {\n      var tldOffset = domain.lastIndexOf('.');\n      if (tldOffset <= 0 || tldOffset >= (domain.length-1)) {\n        return null;\n      }\n      var sldOffset = domain.lastIndexOf('.', tldOffset-1);\n      if (sldOffset <= 0 || sldOffset >= (tldOffset-1)) {\n        return null;\n      }\n      var sldList = SLD.list[domain.slice(tldOffset+1)];\n      if (!sldList) {\n        return null;\n      }\n      if (sldList.indexOf(' ' + domain.slice(sldOffset+1, tldOffset) + ' ') < 0) {\n        return null;\n      }\n      return domain.slice(sldOffset+1);\n    },\n    noConflict: function(){\n      if (root.SecondLevelDomains === this) {\n        root.SecondLevelDomains = _SecondLevelDomains;\n      }\n      return this;\n    }\n  };\n\n  return SLD;\n}));\n","/*\n * Extending URI.js for fragment abuse\n */\n\n// --------------------------------------------------------------------------------\n// EXAMPLE: storing application/x-www-form-urlencoded data in the fragment\n// possibly helpful for Google's hashbangs\n// see http://code.google.com/web/ajaxcrawling/\n// --------------------------------------------------------------------------------\n\n// Note: make sure this is the last file loaded!\n\n// USAGE:\n// var uri = URI(\"http://example.org/#?foo=bar\");\n// uri.fragment(true) === {foo: \"bar\"};\n// uri.fragment({bar: \"foo\"});\n// uri.toString() === \"http://example.org/#?bar=foo\";\n// uri.addFragment(\"name\", \"value\");\n// uri.toString() === \"http://example.org/#?bar=foo&name=value\";\n// uri.removeFragment(\"name\");\n// uri.toString() === \"http://example.org/#?bar=foo\";\n// uri.setFragment(\"name\", \"value1\");\n// uri.toString() === \"http://example.org/#?bar=foo&name=value1\";\n// uri.setFragment(\"name\", \"value2\");\n// uri.toString() === \"http://example.org/#?bar=foo&name=value2\";\n\n(function (root, factory) {\n  'use strict';\n  // https://github.com/umdjs/umd/blob/master/returnExports.js\n  if (typeof module === 'object' && module.exports) {\n    // Node\n    module.exports = factory(require('./URI'));\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define(['./URI'], factory);\n  } else {\n    // Browser globals (root is window)\n    factory(root.URI);\n  }\n}(this, function (URI) {\n  'use strict';\n\n  var p = URI.prototype;\n  // old fragment handler we need to wrap\n  var f = p.fragment;\n\n  // make fragmentPrefix configurable\n  URI.fragmentPrefix = '?';\n  var _parts = URI._parts;\n  URI._parts = function() {\n    var parts = _parts();\n    parts.fragmentPrefix = URI.fragmentPrefix;\n    return parts;\n  };\n  p.fragmentPrefix = function(v) {\n    this._parts.fragmentPrefix = v;\n    return this;\n  };\n\n  // add fragment(true) and fragment({key: value}) signatures\n  p.fragment = function(v, build) {\n    var prefix = this._parts.fragmentPrefix;\n    var fragment = this._parts.fragment || '';\n\n    if (v === true) {\n      if (fragment.substring(0, prefix.length) !== prefix) {\n        return {};\n      }\n\n      return URI.parseQuery(fragment.substring(prefix.length));\n    } else if (v !== undefined && typeof v !== 'string') {\n      this._parts.fragment = prefix + URI.buildQuery(v);\n      this.build(!build);\n      return this;\n    } else {\n      return f.call(this, v, build);\n    }\n  };\n  p.addFragment = function(name, value, build) {\n    var prefix = this._parts.fragmentPrefix;\n    var data = URI.parseQuery((this._parts.fragment || '').substring(prefix.length));\n    URI.addQuery(data, name, value);\n    this._parts.fragment = prefix + URI.buildQuery(data);\n    if (typeof name !== 'string') {\n      build = value;\n    }\n\n    this.build(!build);\n    return this;\n  };\n  p.removeFragment = function(name, value, build) {\n    var prefix = this._parts.fragmentPrefix;\n    var data = URI.parseQuery((this._parts.fragment || '').substring(prefix.length));\n    URI.removeQuery(data, name, value);\n    this._parts.fragment = prefix + URI.buildQuery(data);\n    if (typeof name !== 'string') {\n      build = value;\n    }\n\n    this.build(!build);\n    return this;\n  };\n  p.setFragment = function(name, value, build) {\n    var prefix = this._parts.fragmentPrefix;\n    var data = URI.parseQuery((this._parts.fragment || '').substring(prefix.length));\n    URI.setQuery(data, name, value);\n    this._parts.fragment = prefix + URI.buildQuery(data);\n    if (typeof name !== 'string') {\n      build = value;\n    }\n\n    this.build(!build);\n    return this;\n  };\n  p.addHash = p.addFragment;\n  p.removeHash = p.removeFragment;\n  p.setHash = p.setFragment;\n\n  // extending existing object rather than defining something new\n  return URI;\n}));\n","/*!\n * URI.js - Mutating URLs\n *\n * Version: 1.19.1\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n *   MIT License http://www.opensource.org/licenses/mit-license\n *\n */\n(function (root, factory) {\n  'use strict';\n  // https://github.com/umdjs/umd/blob/master/returnExports.js\n  if (typeof module === 'object' && module.exports) {\n    // Node\n    module.exports = factory(require('./punycode'), require('./IPv6'), require('./SecondLevelDomains'));\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define(['./punycode', './IPv6', './SecondLevelDomains'], factory);\n  } else {\n    // Browser globals (root is window)\n    root.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root);\n  }\n}(this, function (punycode, IPv6, SLD, root) {\n  'use strict';\n  /*global location, escape, unescape */\n  // FIXME: v2.0.0 renamce non-camelCase properties to uppercase\n  /*jshint camelcase: false */\n\n  // save current URI variable, if any\n  var _URI = root && root.URI;\n\n  function URI(url, base) {\n    var _urlSupplied = arguments.length >= 1;\n    var _baseSupplied = arguments.length >= 2;\n\n    // Allow instantiation without the 'new' keyword\n    if (!(this instanceof URI)) {\n      if (_urlSupplied) {\n        if (_baseSupplied) {\n          return new URI(url, base);\n        }\n\n        return new URI(url);\n      }\n\n      return new URI();\n    }\n\n    if (url === undefined) {\n      if (_urlSupplied) {\n        throw new TypeError('undefined is not a valid argument for URI');\n      }\n\n      if (typeof location !== 'undefined') {\n        url = location.href + '';\n      } else {\n        url = '';\n      }\n    }\n\n    if (url === null) {\n      if (_urlSupplied) {\n        throw new TypeError('null is not a valid argument for URI');\n      }\n    }\n\n    this.href(url);\n\n    // resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor\n    if (base !== undefined) {\n      return this.absoluteTo(base);\n    }\n\n    return this;\n  }\n\n  function isInteger(value) {\n    return /^[0-9]+$/.test(value);\n  }\n\n  URI.version = '1.19.1';\n\n  var p = URI.prototype;\n  var hasOwn = Object.prototype.hasOwnProperty;\n\n  function escapeRegEx(string) {\n    // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963\n    return string.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n  }\n\n  function getType(value) {\n    // IE8 doesn't return [Object Undefined] but [Object Object] for undefined value\n    if (value === undefined) {\n      return 'Undefined';\n    }\n\n    return String(Object.prototype.toString.call(value)).slice(8, -1);\n  }\n\n  function isArray(obj) {\n    return getType(obj) === 'Array';\n  }\n\n  function filterArrayValues(data, value) {\n    var lookup = {};\n    var i, length;\n\n    if (getType(value) === 'RegExp') {\n      lookup = null;\n    } else if (isArray(value)) {\n      for (i = 0, length = value.length; i < length; i++) {\n        lookup[value[i]] = true;\n      }\n    } else {\n      lookup[value] = true;\n    }\n\n    for (i = 0, length = data.length; i < length; i++) {\n      /*jshint laxbreak: true */\n      var _match = lookup && lookup[data[i]] !== undefined\n        || !lookup && value.test(data[i]);\n      /*jshint laxbreak: false */\n      if (_match) {\n        data.splice(i, 1);\n        length--;\n        i--;\n      }\n    }\n\n    return data;\n  }\n\n  function arrayContains(list, value) {\n    var i, length;\n\n    // value may be string, number, array, regexp\n    if (isArray(value)) {\n      // Note: this can be optimized to O(n) (instead of current O(m * n))\n      for (i = 0, length = value.length; i < length; i++) {\n        if (!arrayContains(list, value[i])) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n    var _type = getType(value);\n    for (i = 0, length = list.length; i < length; i++) {\n      if (_type === 'RegExp') {\n        if (typeof list[i] === 'string' && list[i].match(value)) {\n          return true;\n        }\n      } else if (list[i] === value) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  function arraysEqual(one, two) {\n    if (!isArray(one) || !isArray(two)) {\n      return false;\n    }\n\n    // arrays can't be equal if they have different amount of content\n    if (one.length !== two.length) {\n      return false;\n    }\n\n    one.sort();\n    two.sort();\n\n    for (var i = 0, l = one.length; i < l; i++) {\n      if (one[i] !== two[i]) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  function trimSlashes(text) {\n    var trim_expression = /^\\/+|\\/+$/g;\n    return text.replace(trim_expression, '');\n  }\n\n  URI._parts = function() {\n    return {\n      protocol: null,\n      username: null,\n      password: null,\n      hostname: null,\n      urn: null,\n      port: null,\n      path: null,\n      query: null,\n      fragment: null,\n      // state\n      preventInvalidHostname: URI.preventInvalidHostname,\n      duplicateQueryParameters: URI.duplicateQueryParameters,\n      escapeQuerySpace: URI.escapeQuerySpace\n    };\n  };\n  // state: throw on invalid hostname\n  // see https://github.com/medialize/URI.js/pull/345\n  // and https://github.com/medialize/URI.js/issues/354\n  URI.preventInvalidHostname = false;\n  // state: allow duplicate query parameters (a=1&a=1)\n  URI.duplicateQueryParameters = false;\n  // state: replaces + with %20 (space in query strings)\n  URI.escapeQuerySpace = true;\n  // static properties\n  URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i;\n  URI.idn_expression = /[^a-z0-9\\._-]/i;\n  URI.punycode_expression = /(xn--)/i;\n  // well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care?\n  URI.ip4_expression = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\n  // credits to Rich Brown\n  // source: http://forums.intermapper.com/viewtopic.php?p=1096#1096\n  // specification: http://www.ietf.org/rfc/rfc4291.txt\n  URI.ip6_expression = /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/;\n  // expression used is \"gruber revised\" (@gruber v2) determined to be the\n  // best solution in a regex-golf we did a couple of ages ago at\n  // * http://mathiasbynens.be/demo/url-regex\n  // * http://rodneyrehm.de/t/url-regex.html\n  URI.find_uri_expression = /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?Â«Â»â€œâ€�â€˜â€™]))/ig;\n  URI.findUri = {\n    // valid \"scheme://\" or \"www.\"\n    start: /\\b(?:([a-z][a-z0-9.+-]*:\\/\\/)|www\\.)/gi,\n    // everything up to the next whitespace\n    end: /[\\s\\r\\n]|$/,\n    // trim trailing punctuation captured by end RegExp\n    trim: /[`!()\\[\\]{};:'\".,<>?Â«Â»â€œâ€�â€žâ€˜â€™]+$/,\n    // balanced parens inclusion (), [], {}, <>\n    parens: /(\\([^\\)]*\\)|\\[[^\\]]*\\]|\\{[^}]*\\}|<[^>]*>)/g,\n  };\n  // http://www.iana.org/assignments/uri-schemes.html\n  // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports\n  URI.defaultPorts = {\n    http: '80',\n    https: '443',\n    ftp: '21',\n    gopher: '70',\n    ws: '80',\n    wss: '443'\n  };\n  // list of protocols which always require a hostname\n  URI.hostProtocols = [\n    'http',\n    'https'\n  ];\n\n  // allowed hostname characters according to RFC 3986\n  // ALPHA DIGIT \"-\" \".\" \"_\" \"~\" \"!\" \"$\" \"&\" \"'\" \"(\" \")\" \"*\" \"+\" \",\" \";\" \"=\" %encoded\n  // I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . - _\n  URI.invalid_hostname_characters = /[^a-zA-Z0-9\\.\\-:_]/;\n  // map DOM Elements to their URI attribute\n  URI.domAttributes = {\n    'a': 'href',\n    'blockquote': 'cite',\n    'link': 'href',\n    'base': 'href',\n    'script': 'src',\n    'form': 'action',\n    'img': 'src',\n    'area': 'href',\n    'iframe': 'src',\n    'embed': 'src',\n    'source': 'src',\n    'track': 'src',\n    'input': 'src', // but only if type=\"image\"\n    'audio': 'src',\n    'video': 'src'\n  };\n  URI.getDomAttribute = function(node) {\n    if (!node || !node.nodeName) {\n      return undefined;\n    }\n\n    var nodeName = node.nodeName.toLowerCase();\n    // <input> should only expose src for type=\"image\"\n    if (nodeName === 'input' && node.type !== 'image') {\n      return undefined;\n    }\n\n    return URI.domAttributes[nodeName];\n  };\n\n  function escapeForDumbFirefox36(value) {\n    // https://github.com/medialize/URI.js/issues/91\n    return escape(value);\n  }\n\n  // encoding / decoding according to RFC3986\n  function strictEncodeURIComponent(string) {\n    // see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent\n    return encodeURIComponent(string)\n      .replace(/[!'()*]/g, escapeForDumbFirefox36)\n      .replace(/\\*/g, '%2A');\n  }\n  URI.encode = strictEncodeURIComponent;\n  URI.decode = decodeURIComponent;\n  URI.iso8859 = function() {\n    URI.encode = escape;\n    URI.decode = unescape;\n  };\n  URI.unicode = function() {\n    URI.encode = strictEncodeURIComponent;\n    URI.decode = decodeURIComponent;\n  };\n  URI.characters = {\n    pathname: {\n      encode: {\n        // RFC3986 2.1: For consistency, URI producers and normalizers should\n        // use uppercase hexadecimal digits for all percent-encodings.\n        expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig,\n        map: {\n          // -._~!'()*\n          '%24': '$',\n          '%26': '&',\n          '%2B': '+',\n          '%2C': ',',\n          '%3B': ';',\n          '%3D': '=',\n          '%3A': ':',\n          '%40': '@'\n        }\n      },\n      decode: {\n        expression: /[\\/\\?#]/g,\n        map: {\n          '/': '%2F',\n          '?': '%3F',\n          '#': '%23'\n        }\n      }\n    },\n    reserved: {\n      encode: {\n        // RFC3986 2.1: For consistency, URI producers and normalizers should\n        // use uppercase hexadecimal digits for all percent-encodings.\n        expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,\n        map: {\n          // gen-delims\n          '%3A': ':',\n          '%2F': '/',\n          '%3F': '?',\n          '%23': '#',\n          '%5B': '[',\n          '%5D': ']',\n          '%40': '@',\n          // sub-delims\n          '%21': '!',\n          '%24': '$',\n          '%26': '&',\n          '%27': '\\'',\n          '%28': '(',\n          '%29': ')',\n          '%2A': '*',\n          '%2B': '+',\n          '%2C': ',',\n          '%3B': ';',\n          '%3D': '='\n        }\n      }\n    },\n    urnpath: {\n      // The characters under `encode` are the characters called out by RFC 2141 as being acceptable\n      // for usage in a URN. RFC2141 also calls out \"-\", \".\", and \"_\" as acceptable characters, but\n      // these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also\n      // note that the colon character is not featured in the encoding map; this is because URI.js\n      // gives the colons in URNs semantic meaning as the delimiters of path segements, and so it\n      // should not appear unencoded in a segment itself.\n      // See also the note above about RFC3986 and capitalalized hex digits.\n      encode: {\n        expression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,\n        map: {\n          '%21': '!',\n          '%24': '$',\n          '%27': '\\'',\n          '%28': '(',\n          '%29': ')',\n          '%2A': '*',\n          '%2B': '+',\n          '%2C': ',',\n          '%3B': ';',\n          '%3D': '=',\n          '%40': '@'\n        }\n      },\n      // These characters are the characters called out by RFC2141 as \"reserved\" characters that\n      // should never appear in a URN, plus the colon character (see note above).\n      decode: {\n        expression: /[\\/\\?#:]/g,\n        map: {\n          '/': '%2F',\n          '?': '%3F',\n          '#': '%23',\n          ':': '%3A'\n        }\n      }\n    }\n  };\n  URI.encodeQuery = function(string, escapeQuerySpace) {\n    var escaped = URI.encode(string + '');\n    if (escapeQuerySpace === undefined) {\n      escapeQuerySpace = URI.escapeQuerySpace;\n    }\n\n    return escapeQuerySpace ? escaped.replace(/%20/g, '+') : escaped;\n  };\n  URI.decodeQuery = function(string, escapeQuerySpace) {\n    string += '';\n    if (escapeQuerySpace === undefined) {\n      escapeQuerySpace = URI.escapeQuerySpace;\n    }\n\n    try {\n      return URI.decode(escapeQuerySpace ? string.replace(/\\+/g, '%20') : string);\n    } catch(e) {\n      // we're not going to mess with weird encodings,\n      // give up and return the undecoded original string\n      // see https://github.com/medialize/URI.js/issues/87\n      // see https://github.com/medialize/URI.js/issues/92\n      return string;\n    }\n  };\n  // generate encode/decode path functions\n  var _parts = {'encode':'encode', 'decode':'decode'};\n  var _part;\n  var generateAccessor = function(_group, _part) {\n    return function(string) {\n      try {\n        return URI[_part](string + '').replace(URI.characters[_group][_part].expression, function(c) {\n          return URI.characters[_group][_part].map[c];\n        });\n      } catch (e) {\n        // we're not going to mess with weird encodings,\n        // give up and return the undecoded original string\n        // see https://github.com/medialize/URI.js/issues/87\n        // see https://github.com/medialize/URI.js/issues/92\n        return string;\n      }\n    };\n  };\n\n  for (_part in _parts) {\n    URI[_part + 'PathSegment'] = generateAccessor('pathname', _parts[_part]);\n    URI[_part + 'UrnPathSegment'] = generateAccessor('urnpath', _parts[_part]);\n  }\n\n  var generateSegmentedPathFunction = function(_sep, _codingFuncName, _innerCodingFuncName) {\n    return function(string) {\n      // Why pass in names of functions, rather than the function objects themselves? The\n      // definitions of some functions (but in particular, URI.decode) will occasionally change due\n      // to URI.js having ISO8859 and Unicode modes. Passing in the name and getting it will ensure\n      // that the functions we use here are \"fresh\".\n      var actualCodingFunc;\n      if (!_innerCodingFuncName) {\n        actualCodingFunc = URI[_codingFuncName];\n      } else {\n        actualCodingFunc = function(string) {\n          return URI[_codingFuncName](URI[_innerCodingFuncName](string));\n        };\n      }\n\n      var segments = (string + '').split(_sep);\n\n      for (var i = 0, length = segments.length; i < length; i++) {\n        segments[i] = actualCodingFunc(segments[i]);\n      }\n\n      return segments.join(_sep);\n    };\n  };\n\n  // This takes place outside the above loop because we don't want, e.g., encodeUrnPath functions.\n  URI.decodePath = generateSegmentedPathFunction('/', 'decodePathSegment');\n  URI.decodeUrnPath = generateSegmentedPathFunction(':', 'decodeUrnPathSegment');\n  URI.recodePath = generateSegmentedPathFunction('/', 'encodePathSegment', 'decode');\n  URI.recodeUrnPath = generateSegmentedPathFunction(':', 'encodeUrnPathSegment', 'decode');\n\n  URI.encodeReserved = generateAccessor('reserved', 'encode');\n\n  URI.parse = function(string, parts) {\n    var pos;\n    if (!parts) {\n      parts = {\n        preventInvalidHostname: URI.preventInvalidHostname\n      };\n    }\n    // [protocol\"://\"[username[\":\"password]\"@\"]hostname[\":\"port]\"/\"?][path][\"?\"querystring][\"#\"fragment]\n\n    // extract fragment\n    pos = string.indexOf('#');\n    if (pos > -1) {\n      // escaping?\n      parts.fragment = string.substring(pos + 1) || null;\n      string = string.substring(0, pos);\n    }\n\n    // extract query\n    pos = string.indexOf('?');\n    if (pos > -1) {\n      // escaping?\n      parts.query = string.substring(pos + 1) || null;\n      string = string.substring(0, pos);\n    }\n\n    // extract protocol\n    if (string.substring(0, 2) === '//') {\n      // relative-scheme\n      parts.protocol = null;\n      string = string.substring(2);\n      // extract \"user:pass@host:port\"\n      string = URI.parseAuthority(string, parts);\n    } else {\n      pos = string.indexOf(':');\n      if (pos > -1) {\n        parts.protocol = string.substring(0, pos) || null;\n        if (parts.protocol && !parts.protocol.match(URI.protocol_expression)) {\n          // : may be within the path\n          parts.protocol = undefined;\n        } else if (string.substring(pos + 1, pos + 3) === '//') {\n          string = string.substring(pos + 3);\n\n          // extract \"user:pass@host:port\"\n          string = URI.parseAuthority(string, parts);\n        } else {\n          string = string.substring(pos + 1);\n          parts.urn = true;\n        }\n      }\n    }\n\n    // what's left must be the path\n    parts.path = string;\n\n    // and we're done\n    return parts;\n  };\n  URI.parseHost = function(string, parts) {\n    if (!string) {\n      string = '';\n    }\n\n    // Copy chrome, IE, opera backslash-handling behavior.\n    // Back slashes before the query string get converted to forward slashes\n    // See: https://github.com/joyent/node/blob/386fd24f49b0e9d1a8a076592a404168faeecc34/lib/url.js#L115-L124\n    // See: https://code.google.com/p/chromium/issues/detail?id=25916\n    // https://github.com/medialize/URI.js/pull/233\n    string = string.replace(/\\\\/g, '/');\n\n    // extract host:port\n    var pos = string.indexOf('/');\n    var bracketPos;\n    var t;\n\n    if (pos === -1) {\n      pos = string.length;\n    }\n\n    if (string.charAt(0) === '[') {\n      // IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6\n      // I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts\n      // IPv6+port in the format [2001:db8::1]:80 (for the time being)\n      bracketPos = string.indexOf(']');\n      parts.hostname = string.substring(1, bracketPos) || null;\n      parts.port = string.substring(bracketPos + 2, pos) || null;\n      if (parts.port === '/') {\n        parts.port = null;\n      }\n    } else {\n      var firstColon = string.indexOf(':');\n      var firstSlash = string.indexOf('/');\n      var nextColon = string.indexOf(':', firstColon + 1);\n      if (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) {\n        // IPv6 host contains multiple colons - but no port\n        // this notation is actually not allowed by RFC 3986, but we're a liberal parser\n        parts.hostname = string.substring(0, pos) || null;\n        parts.port = null;\n      } else {\n        t = string.substring(0, pos).split(':');\n        parts.hostname = t[0] || null;\n        parts.port = t[1] || null;\n      }\n    }\n\n    if (parts.hostname && string.substring(pos).charAt(0) !== '/') {\n      pos++;\n      string = '/' + string;\n    }\n\n    if (parts.preventInvalidHostname) {\n      URI.ensureValidHostname(parts.hostname, parts.protocol);\n    }\n\n    if (parts.port) {\n      URI.ensureValidPort(parts.port);\n    }\n\n    return string.substring(pos) || '/';\n  };\n  URI.parseAuthority = function(string, parts) {\n    string = URI.parseUserinfo(string, parts);\n    return URI.parseHost(string, parts);\n  };\n  URI.parseUserinfo = function(string, parts) {\n    // extract username:password\n    var firstSlash = string.indexOf('/');\n    var pos = string.lastIndexOf('@', firstSlash > -1 ? firstSlash : string.length - 1);\n    var t;\n\n    // authority@ must come before /path\n    if (pos > -1 && (firstSlash === -1 || pos < firstSlash)) {\n      t = string.substring(0, pos).split(':');\n      parts.username = t[0] ? URI.decode(t[0]) : null;\n      t.shift();\n      parts.password = t[0] ? URI.decode(t.join(':')) : null;\n      string = string.substring(pos + 1);\n    } else {\n      parts.username = null;\n      parts.password = null;\n    }\n\n    return string;\n  };\n  URI.parseQuery = function(string, escapeQuerySpace) {\n    if (!string) {\n      return {};\n    }\n\n    // throw out the funky business - \"?\"[name\"=\"value\"&\"]+\n    string = string.replace(/&+/g, '&').replace(/^\\?*&*|&+$/g, '');\n\n    if (!string) {\n      return {};\n    }\n\n    var items = {};\n    var splits = string.split('&');\n    var length = splits.length;\n    var v, name, value;\n\n    for (var i = 0; i < length; i++) {\n      v = splits[i].split('=');\n      name = URI.decodeQuery(v.shift(), escapeQuerySpace);\n      // no \"=\" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters\n      value = v.length ? URI.decodeQuery(v.join('='), escapeQuerySpace) : null;\n\n      if (hasOwn.call(items, name)) {\n        if (typeof items[name] === 'string' || items[name] === null) {\n          items[name] = [items[name]];\n        }\n\n        items[name].push(value);\n      } else {\n        items[name] = value;\n      }\n    }\n\n    return items;\n  };\n\n  URI.build = function(parts) {\n    var t = '';\n\n    if (parts.protocol) {\n      t += parts.protocol + ':';\n    }\n\n    if (!parts.urn && (t || parts.hostname)) {\n      t += '//';\n    }\n\n    t += (URI.buildAuthority(parts) || '');\n\n    if (typeof parts.path === 'string') {\n      if (parts.path.charAt(0) !== '/' && typeof parts.hostname === 'string') {\n        t += '/';\n      }\n\n      t += parts.path;\n    }\n\n    if (typeof parts.query === 'string' && parts.query) {\n      t += '?' + parts.query;\n    }\n\n    if (typeof parts.fragment === 'string' && parts.fragment) {\n      t += '#' + parts.fragment;\n    }\n    return t;\n  };\n  URI.buildHost = function(parts) {\n    var t = '';\n\n    if (!parts.hostname) {\n      return '';\n    } else if (URI.ip6_expression.test(parts.hostname)) {\n      t += '[' + parts.hostname + ']';\n    } else {\n      t += parts.hostname;\n    }\n\n    if (parts.port) {\n      t += ':' + parts.port;\n    }\n\n    return t;\n  };\n  URI.buildAuthority = function(parts) {\n    return URI.buildUserinfo(parts) + URI.buildHost(parts);\n  };\n  URI.buildUserinfo = function(parts) {\n    var t = '';\n\n    if (parts.username) {\n      t += URI.encode(parts.username);\n    }\n\n    if (parts.password) {\n      t += ':' + URI.encode(parts.password);\n    }\n\n    if (t) {\n      t += '@';\n    }\n\n    return t;\n  };\n  URI.buildQuery = function(data, duplicateQueryParameters, escapeQuerySpace) {\n    // according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html\n    // being Â»-._~!$&'()*+,;=:@/?Â« %HEX and alnum are allowed\n    // the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax!\n    // URI.js treats the query string as being application/x-www-form-urlencoded\n    // see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type\n\n    var t = '';\n    var unique, key, i, length;\n    for (key in data) {\n      if (hasOwn.call(data, key) && key) {\n        if (isArray(data[key])) {\n          unique = {};\n          for (i = 0, length = data[key].length; i < length; i++) {\n            if (data[key][i] !== undefined && unique[data[key][i] + ''] === undefined) {\n              t += '&' + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace);\n              if (duplicateQueryParameters !== true) {\n                unique[data[key][i] + ''] = true;\n              }\n            }\n          }\n        } else if (data[key] !== undefined) {\n          t += '&' + URI.buildQueryParameter(key, data[key], escapeQuerySpace);\n        }\n      }\n    }\n\n    return t.substring(1);\n  };\n  URI.buildQueryParameter = function(name, value, escapeQuerySpace) {\n    // http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded\n    // don't append \"=\" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization\n    return URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? '=' + URI.encodeQuery(value, escapeQuerySpace) : '');\n  };\n\n  URI.addQuery = function(data, name, value) {\n    if (typeof name === 'object') {\n      for (var key in name) {\n        if (hasOwn.call(name, key)) {\n          URI.addQuery(data, key, name[key]);\n        }\n      }\n    } else if (typeof name === 'string') {\n      if (data[name] === undefined) {\n        data[name] = value;\n        return;\n      } else if (typeof data[name] === 'string') {\n        data[name] = [data[name]];\n      }\n\n      if (!isArray(value)) {\n        value = [value];\n      }\n\n      data[name] = (data[name] || []).concat(value);\n    } else {\n      throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n    }\n  };\n\n  URI.setQuery = function(data, name, value) {\n    if (typeof name === 'object') {\n      for (var key in name) {\n        if (hasOwn.call(name, key)) {\n          URI.setQuery(data, key, name[key]);\n        }\n      }\n    } else if (typeof name === 'string') {\n      data[name] = value === undefined ? null : value;\n    } else {\n      throw new TypeError('URI.setQuery() accepts an object, string as the name parameter');\n    }\n  };\n\n  URI.removeQuery = function(data, name, value) {\n    var i, length, key;\n\n    if (isArray(name)) {\n      for (i = 0, length = name.length; i < length; i++) {\n        data[name[i]] = undefined;\n      }\n    } else if (getType(name) === 'RegExp') {\n      for (key in data) {\n        if (name.test(key)) {\n          data[key] = undefined;\n        }\n      }\n    } else if (typeof name === 'object') {\n      for (key in name) {\n        if (hasOwn.call(name, key)) {\n          URI.removeQuery(data, key, name[key]);\n        }\n      }\n    } else if (typeof name === 'string') {\n      if (value !== undefined) {\n        if (getType(value) === 'RegExp') {\n          if (!isArray(data[name]) && value.test(data[name])) {\n            data[name] = undefined;\n          } else {\n            data[name] = filterArrayValues(data[name], value);\n          }\n        } else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) {\n          data[name] = undefined;\n        } else if (isArray(data[name])) {\n          data[name] = filterArrayValues(data[name], value);\n        }\n      } else {\n        data[name] = undefined;\n      }\n    } else {\n      throw new TypeError('URI.removeQuery() accepts an object, string, RegExp as the first parameter');\n    }\n  };\n  URI.hasQuery = function(data, name, value, withinArray) {\n    switch (getType(name)) {\n      case 'String':\n        // Nothing to do here\n        break;\n\n      case 'RegExp':\n        for (var key in data) {\n          if (hasOwn.call(data, key)) {\n            if (name.test(key) && (value === undefined || URI.hasQuery(data, key, value))) {\n              return true;\n            }\n          }\n        }\n\n        return false;\n\n      case 'Object':\n        for (var _key in name) {\n          if (hasOwn.call(name, _key)) {\n            if (!URI.hasQuery(data, _key, name[_key])) {\n              return false;\n            }\n          }\n        }\n\n        return true;\n\n      default:\n        throw new TypeError('URI.hasQuery() accepts a string, regular expression or object as the name parameter');\n    }\n\n    switch (getType(value)) {\n      case 'Undefined':\n        // true if exists (but may be empty)\n        return name in data; // data[name] !== undefined;\n\n      case 'Boolean':\n        // true if exists and non-empty\n        var _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]);\n        return value === _booly;\n\n      case 'Function':\n        // allow complex comparison\n        return !!value(data[name], name, data);\n\n      case 'Array':\n        if (!isArray(data[name])) {\n          return false;\n        }\n\n        var op = withinArray ? arrayContains : arraysEqual;\n        return op(data[name], value);\n\n      case 'RegExp':\n        if (!isArray(data[name])) {\n          return Boolean(data[name] && data[name].match(value));\n        }\n\n        if (!withinArray) {\n          return false;\n        }\n\n        return arrayContains(data[name], value);\n\n      case 'Number':\n        value = String(value);\n        /* falls through */\n      case 'String':\n        if (!isArray(data[name])) {\n          return data[name] === value;\n        }\n\n        if (!withinArray) {\n          return false;\n        }\n\n        return arrayContains(data[name], value);\n\n      default:\n        throw new TypeError('URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter');\n    }\n  };\n\n\n  URI.joinPaths = function() {\n    var input = [];\n    var segments = [];\n    var nonEmptySegments = 0;\n\n    for (var i = 0; i < arguments.length; i++) {\n      var url = new URI(arguments[i]);\n      input.push(url);\n      var _segments = url.segment();\n      for (var s = 0; s < _segments.length; s++) {\n        if (typeof _segments[s] === 'string') {\n          segments.push(_segments[s]);\n        }\n\n        if (_segments[s]) {\n          nonEmptySegments++;\n        }\n      }\n    }\n\n    if (!segments.length || !nonEmptySegments) {\n      return new URI('');\n    }\n\n    var uri = new URI('').segment(segments);\n\n    if (input[0].path() === '' || input[0].path().slice(0, 1) === '/') {\n      uri.path('/' + uri.path());\n    }\n\n    return uri.normalize();\n  };\n\n  URI.commonPath = function(one, two) {\n    var length = Math.min(one.length, two.length);\n    var pos;\n\n    // find first non-matching character\n    for (pos = 0; pos < length; pos++) {\n      if (one.charAt(pos) !== two.charAt(pos)) {\n        pos--;\n        break;\n      }\n    }\n\n    if (pos < 1) {\n      return one.charAt(0) === two.charAt(0) && one.charAt(0) === '/' ? '/' : '';\n    }\n\n    // revert to last /\n    if (one.charAt(pos) !== '/' || two.charAt(pos) !== '/') {\n      pos = one.substring(0, pos).lastIndexOf('/');\n    }\n\n    return one.substring(0, pos + 1);\n  };\n\n  URI.withinString = function(string, callback, options) {\n    options || (options = {});\n    var _start = options.start || URI.findUri.start;\n    var _end = options.end || URI.findUri.end;\n    var _trim = options.trim || URI.findUri.trim;\n    var _parens = options.parens || URI.findUri.parens;\n    var _attributeOpen = /[a-z0-9-]=[\"']?$/i;\n\n    _start.lastIndex = 0;\n    while (true) {\n      var match = _start.exec(string);\n      if (!match) {\n        break;\n      }\n\n      var start = match.index;\n      if (options.ignoreHtml) {\n        // attribut(e=[\"']?$)\n        var attributeOpen = string.slice(Math.max(start - 3, 0), start);\n        if (attributeOpen && _attributeOpen.test(attributeOpen)) {\n          continue;\n        }\n      }\n\n      var end = start + string.slice(start).search(_end);\n      var slice = string.slice(start, end);\n      // make sure we include well balanced parens\n      var parensEnd = -1;\n      while (true) {\n        var parensMatch = _parens.exec(slice);\n        if (!parensMatch) {\n          break;\n        }\n\n        var parensMatchEnd = parensMatch.index + parensMatch[0].length;\n        parensEnd = Math.max(parensEnd, parensMatchEnd);\n      }\n\n      if (parensEnd > -1) {\n        slice = slice.slice(0, parensEnd) + slice.slice(parensEnd).replace(_trim, '');\n      } else {\n        slice = slice.replace(_trim, '');\n      }\n\n      if (slice.length <= match[0].length) {\n        // the extract only contains the starting marker of a URI,\n        // e.g. \"www\" or \"http://\"\n        continue;\n      }\n\n      if (options.ignore && options.ignore.test(slice)) {\n        continue;\n      }\n\n      end = start + slice.length;\n      var result = callback(slice, start, end, string);\n      if (result === undefined) {\n        _start.lastIndex = end;\n        continue;\n      }\n\n      result = String(result);\n      string = string.slice(0, start) + result + string.slice(end);\n      _start.lastIndex = start + result.length;\n    }\n\n    _start.lastIndex = 0;\n    return string;\n  };\n\n  URI.ensureValidHostname = function(v, protocol) {\n    // Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986)\n    // they are not part of DNS and therefore ignored by URI.js\n\n    var hasHostname = !!v; // not null and not an empty string\n    var hasProtocol = !!protocol;\n    var rejectEmptyHostname = false;\n\n    if (hasProtocol) {\n      rejectEmptyHostname = arrayContains(URI.hostProtocols, protocol);\n    }\n\n    if (rejectEmptyHostname && !hasHostname) {\n      throw new TypeError('Hostname cannot be empty, if protocol is ' + protocol);\n    } else if (v && v.match(URI.invalid_hostname_characters)) {\n      // test punycode\n      if (!punycode) {\n        throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-:_] and Punycode.js is not available');\n      }\n      if (punycode.toASCII(v).match(URI.invalid_hostname_characters)) {\n        throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-:_]');\n      }\n    }\n  };\n\n  URI.ensureValidPort = function (v) {\n    if (!v) {\n      return;\n    }\n\n    var port = Number(v);\n    if (isInteger(port) && (port > 0) && (port < 65536)) {\n      return;\n    }\n\n    throw new TypeError('Port \"' + v + '\" is not a valid port');\n  };\n\n  // noConflict\n  URI.noConflict = function(removeAll) {\n    if (removeAll) {\n      var unconflicted = {\n        URI: this.noConflict()\n      };\n\n      if (root.URITemplate && typeof root.URITemplate.noConflict === 'function') {\n        unconflicted.URITemplate = root.URITemplate.noConflict();\n      }\n\n      if (root.IPv6 && typeof root.IPv6.noConflict === 'function') {\n        unconflicted.IPv6 = root.IPv6.noConflict();\n      }\n\n      if (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === 'function') {\n        unconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict();\n      }\n\n      return unconflicted;\n    } else if (root.URI === this) {\n      root.URI = _URI;\n    }\n\n    return this;\n  };\n\n  p.build = function(deferBuild) {\n    if (deferBuild === true) {\n      this._deferred_build = true;\n    } else if (deferBuild === undefined || this._deferred_build) {\n      this._string = URI.build(this._parts);\n      this._deferred_build = false;\n    }\n\n    return this;\n  };\n\n  p.clone = function() {\n    return new URI(this);\n  };\n\n  p.valueOf = p.toString = function() {\n    return this.build(false)._string;\n  };\n\n\n  function generateSimpleAccessor(_part){\n    return function(v, build) {\n      if (v === undefined) {\n        return this._parts[_part] || '';\n      } else {\n        this._parts[_part] = v || null;\n        this.build(!build);\n        return this;\n      }\n    };\n  }\n\n  function generatePrefixAccessor(_part, _key){\n    return function(v, build) {\n      if (v === undefined) {\n        return this._parts[_part] || '';\n      } else {\n        if (v !== null) {\n          v = v + '';\n          if (v.charAt(0) === _key) {\n            v = v.substring(1);\n          }\n        }\n\n        this._parts[_part] = v;\n        this.build(!build);\n        return this;\n      }\n    };\n  }\n\n  p.protocol = generateSimpleAccessor('protocol');\n  p.username = generateSimpleAccessor('username');\n  p.password = generateSimpleAccessor('password');\n  p.hostname = generateSimpleAccessor('hostname');\n  p.port = generateSimpleAccessor('port');\n  p.query = generatePrefixAccessor('query', '?');\n  p.fragment = generatePrefixAccessor('fragment', '#');\n\n  p.search = function(v, build) {\n    var t = this.query(v, build);\n    return typeof t === 'string' && t.length ? ('?' + t) : t;\n  };\n  p.hash = function(v, build) {\n    var t = this.fragment(v, build);\n    return typeof t === 'string' && t.length ? ('#' + t) : t;\n  };\n\n  p.pathname = function(v, build) {\n    if (v === undefined || v === true) {\n      var res = this._parts.path || (this._parts.hostname ? '/' : '');\n      return v ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res;\n    } else {\n      if (this._parts.urn) {\n        this._parts.path = v ? URI.recodeUrnPath(v) : '';\n      } else {\n        this._parts.path = v ? URI.recodePath(v) : '/';\n      }\n      this.build(!build);\n      return this;\n    }\n  };\n  p.path = p.pathname;\n  p.href = function(href, build) {\n    var key;\n\n    if (href === undefined) {\n      return this.toString();\n    }\n\n    this._string = '';\n    this._parts = URI._parts();\n\n    var _URI = href instanceof URI;\n    var _object = typeof href === 'object' && (href.hostname || href.path || href.pathname);\n    if (href.nodeName) {\n      var attribute = URI.getDomAttribute(href);\n      href = href[attribute] || '';\n      _object = false;\n    }\n\n    // window.location is reported to be an object, but it's not the sort\n    // of object we're looking for:\n    // * location.protocol ends with a colon\n    // * location.query != object.search\n    // * location.hash != object.fragment\n    // simply serializing the unknown object should do the trick\n    // (for location, not for everything...)\n    if (!_URI && _object && href.pathname !== undefined) {\n      href = href.toString();\n    }\n\n    if (typeof href === 'string' || href instanceof String) {\n      this._parts = URI.parse(String(href), this._parts);\n    } else if (_URI || _object) {\n      var src = _URI ? href._parts : href;\n      for (key in src) {\n        if (key === 'query') { continue; }\n        if (hasOwn.call(this._parts, key)) {\n          this._parts[key] = src[key];\n        }\n      }\n      if (src.query) {\n        this.query(src.query, false);\n      }\n    } else {\n      throw new TypeError('invalid input');\n    }\n\n    this.build(!build);\n    return this;\n  };\n\n  // identification accessors\n  p.is = function(what) {\n    var ip = false;\n    var ip4 = false;\n    var ip6 = false;\n    var name = false;\n    var sld = false;\n    var idn = false;\n    var punycode = false;\n    var relative = !this._parts.urn;\n\n    if (this._parts.hostname) {\n      relative = false;\n      ip4 = URI.ip4_expression.test(this._parts.hostname);\n      ip6 = URI.ip6_expression.test(this._parts.hostname);\n      ip = ip4 || ip6;\n      name = !ip;\n      sld = name && SLD && SLD.has(this._parts.hostname);\n      idn = name && URI.idn_expression.test(this._parts.hostname);\n      punycode = name && URI.punycode_expression.test(this._parts.hostname);\n    }\n\n    switch (what.toLowerCase()) {\n      case 'relative':\n        return relative;\n\n      case 'absolute':\n        return !relative;\n\n      // hostname identification\n      case 'domain':\n      case 'name':\n        return name;\n\n      case 'sld':\n        return sld;\n\n      case 'ip':\n        return ip;\n\n      case 'ip4':\n      case 'ipv4':\n      case 'inet4':\n        return ip4;\n\n      case 'ip6':\n      case 'ipv6':\n      case 'inet6':\n        return ip6;\n\n      case 'idn':\n        return idn;\n\n      case 'url':\n        return !this._parts.urn;\n\n      case 'urn':\n        return !!this._parts.urn;\n\n      case 'punycode':\n        return punycode;\n    }\n\n    return null;\n  };\n\n  // component specific input validation\n  var _protocol = p.protocol;\n  var _port = p.port;\n  var _hostname = p.hostname;\n\n  p.protocol = function(v, build) {\n    if (v) {\n      // accept trailing ://\n      v = v.replace(/:(\\/\\/)?$/, '');\n\n      if (!v.match(URI.protocol_expression)) {\n        throw new TypeError('Protocol \"' + v + '\" contains characters other than [A-Z0-9.+-] or doesn\\'t start with [A-Z]');\n      }\n    }\n\n    return _protocol.call(this, v, build);\n  };\n  p.scheme = p.protocol;\n  p.port = function(v, build) {\n    if (this._parts.urn) {\n      return v === undefined ? '' : this;\n    }\n\n    if (v !== undefined) {\n      if (v === 0) {\n        v = null;\n      }\n\n      if (v) {\n        v += '';\n        if (v.charAt(0) === ':') {\n          v = v.substring(1);\n        }\n\n        URI.ensureValidPort(v);\n      }\n    }\n    return _port.call(this, v, build);\n  };\n  p.hostname = function(v, build) {\n    if (this._parts.urn) {\n      return v === undefined ? '' : this;\n    }\n\n    if (v !== undefined) {\n      var x = { preventInvalidHostname: this._parts.preventInvalidHostname };\n      var res = URI.parseHost(v, x);\n      if (res !== '/') {\n        throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n      }\n\n      v = x.hostname;\n      if (this._parts.preventInvalidHostname) {\n        URI.ensureValidHostname(v, this._parts.protocol);\n      }\n    }\n\n    return _hostname.call(this, v, build);\n  };\n\n  // compound accessors\n  p.origin = function(v, build) {\n    if (this._parts.urn) {\n      return v === undefined ? '' : this;\n    }\n\n    if (v === undefined) {\n      var protocol = this.protocol();\n      var authority = this.authority();\n      if (!authority) {\n        return '';\n      }\n\n      return (protocol ? protocol + '://' : '') + this.authority();\n    } else {\n      var origin = URI(v);\n      this\n        .protocol(origin.protocol())\n        .authority(origin.authority())\n        .build(!build);\n      return this;\n    }\n  };\n  p.host = function(v, build) {\n    if (this._parts.urn) {\n      return v === undefined ? '' : this;\n    }\n\n    if (v === undefined) {\n      return this._parts.hostname ? URI.buildHost(this._parts) : '';\n    } else {\n      var res = URI.parseHost(v, this._parts);\n      if (res !== '/') {\n        throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n      }\n\n      this.build(!build);\n      return this;\n    }\n  };\n  p.authority = function(v, build) {\n    if (this._parts.urn) {\n      return v === undefined ? '' : this;\n    }\n\n    if (v === undefined) {\n      return this._parts.hostname ? URI.buildAuthority(this._parts) : '';\n    } else {\n      var res = URI.parseAuthority(v, this._parts);\n      if (res !== '/') {\n        throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n      }\n\n      this.build(!build);\n      return this;\n    }\n  };\n  p.userinfo = function(v, build) {\n    if (this._parts.urn) {\n      return v === undefined ? '' : this;\n    }\n\n    if (v === undefined) {\n      var t = URI.buildUserinfo(this._parts);\n      return t ? t.substring(0, t.length -1) : t;\n    } else {\n      if (v[v.length-1] !== '@') {\n        v += '@';\n      }\n\n      URI.parseUserinfo(v, this._parts);\n      this.build(!build);\n      return this;\n    }\n  };\n  p.resource = function(v, build) {\n    var parts;\n\n    if (v === undefined) {\n      return this.path() + this.search() + this.hash();\n    }\n\n    parts = URI.parse(v);\n    this._parts.path = parts.path;\n    this._parts.query = parts.query;\n    this._parts.fragment = parts.fragment;\n    this.build(!build);\n    return this;\n  };\n\n  // fraction accessors\n  p.subdomain = function(v, build) {\n    if (this._parts.urn) {\n      return v === undefined ? '' : this;\n    }\n\n    // convenience, return \"www\" from \"www.example.org\"\n    if (v === undefined) {\n      if (!this._parts.hostname || this.is('IP')) {\n        return '';\n      }\n\n      // grab domain and add another segment\n      var end = this._parts.hostname.length - this.domain().length - 1;\n      return this._parts.hostname.substring(0, end) || '';\n    } else {\n      var e = this._parts.hostname.length - this.domain().length;\n      var sub = this._parts.hostname.substring(0, e);\n      var replace = new RegExp('^' + escapeRegEx(sub));\n\n      if (v && v.charAt(v.length - 1) !== '.') {\n        v += '.';\n      }\n\n      if (v.indexOf(':') !== -1) {\n        throw new TypeError('Domains cannot contain colons');\n      }\n\n      if (v) {\n        URI.ensureValidHostname(v, this._parts.protocol);\n      }\n\n      this._parts.hostname = this._parts.hostname.replace(replace, v);\n      this.build(!build);\n      return this;\n    }\n  };\n  p.domain = function(v, build) {\n    if (this._parts.urn) {\n      return v === undefined ? '' : this;\n    }\n\n    if (typeof v === 'boolean') {\n      build = v;\n      v = undefined;\n    }\n\n    // convenience, return \"example.org\" from \"www.example.org\"\n    if (v === undefined) {\n      if (!this._parts.hostname || this.is('IP')) {\n        return '';\n      }\n\n      // if hostname consists of 1 or 2 segments, it must be the domain\n      var t = this._parts.hostname.match(/\\./g);\n      if (t && t.length < 2) {\n        return this._parts.hostname;\n      }\n\n      // grab tld and add another segment\n      var end = this._parts.hostname.length - this.tld(build).length - 1;\n      end = this._parts.hostname.lastIndexOf('.', end -1) + 1;\n      return this._parts.hostname.substring(end) || '';\n    } else {\n      if (!v) {\n        throw new TypeError('cannot set domain empty');\n      }\n\n      if (v.indexOf(':') !== -1) {\n        throw new TypeError('Domains cannot contain colons');\n      }\n\n      URI.ensureValidHostname(v, this._parts.protocol);\n\n      if (!this._parts.hostname || this.is('IP')) {\n        this._parts.hostname = v;\n      } else {\n        var replace = new RegExp(escapeRegEx(this.domain()) + '$');\n        this._parts.hostname = this._parts.hostname.replace(replace, v);\n      }\n\n      this.build(!build);\n      return this;\n    }\n  };\n  p.tld = function(v, build) {\n    if (this._parts.urn) {\n      return v === undefined ? '' : this;\n    }\n\n    if (typeof v === 'boolean') {\n      build = v;\n      v = undefined;\n    }\n\n    // return \"org\" from \"www.example.org\"\n    if (v === undefined) {\n      if (!this._parts.hostname || this.is('IP')) {\n        return '';\n      }\n\n      var pos = this._parts.hostname.lastIndexOf('.');\n      var tld = this._parts.hostname.substring(pos + 1);\n\n      if (build !== true && SLD && SLD.list[tld.toLowerCase()]) {\n        return SLD.get(this._parts.hostname) || tld;\n      }\n\n      return tld;\n    } else {\n      var replace;\n\n      if (!v) {\n        throw new TypeError('cannot set TLD empty');\n      } else if (v.match(/[^a-zA-Z0-9-]/)) {\n        if (SLD && SLD.is(v)) {\n          replace = new RegExp(escapeRegEx(this.tld()) + '$');\n          this._parts.hostname = this._parts.hostname.replace(replace, v);\n        } else {\n          throw new TypeError('TLD \"' + v + '\" contains characters other than [A-Z0-9]');\n        }\n      } else if (!this._parts.hostname || this.is('IP')) {\n        throw new ReferenceError('cannot set TLD on non-domain host');\n      } else {\n        replace = new RegExp(escapeRegEx(this.tld()) + '$');\n        this._parts.hostname = this._parts.hostname.replace(replace, v);\n      }\n\n      this.build(!build);\n      return this;\n    }\n  };\n  p.directory = function(v, build) {\n    if (this._parts.urn) {\n      return v === undefined ? '' : this;\n    }\n\n    if (v === undefined || v === true) {\n      if (!this._parts.path && !this._parts.hostname) {\n        return '';\n      }\n\n      if (this._parts.path === '/') {\n        return '/';\n      }\n\n      var end = this._parts.path.length - this.filename().length - 1;\n      var res = this._parts.path.substring(0, end) || (this._parts.hostname ? '/' : '');\n\n      return v ? URI.decodePath(res) : res;\n\n    } else {\n      var e = this._parts.path.length - this.filename().length;\n      var directory = this._parts.path.substring(0, e);\n      var replace = new RegExp('^' + escapeRegEx(directory));\n\n      // fully qualifier directories begin with a slash\n      if (!this.is('relative')) {\n        if (!v) {\n          v = '/';\n        }\n\n        if (v.charAt(0) !== '/') {\n          v = '/' + v;\n        }\n      }\n\n      // directories always end with a slash\n      if (v && v.charAt(v.length - 1) !== '/') {\n        v += '/';\n      }\n\n      v = URI.recodePath(v);\n      this._parts.path = this._parts.path.replace(replace, v);\n      this.build(!build);\n      return this;\n    }\n  };\n  p.filename = function(v, build) {\n    if (this._parts.urn) {\n      return v === undefined ? '' : this;\n    }\n\n    if (typeof v !== 'string') {\n      if (!this._parts.path || this._parts.path === '/') {\n        return '';\n      }\n\n      var pos = this._parts.path.lastIndexOf('/');\n      var res = this._parts.path.substring(pos+1);\n\n      return v ? URI.decodePathSegment(res) : res;\n    } else {\n      var mutatedDirectory = false;\n\n      if (v.charAt(0) === '/') {\n        v = v.substring(1);\n      }\n\n      if (v.match(/\\.?\\//)) {\n        mutatedDirectory = true;\n      }\n\n      var replace = new RegExp(escapeRegEx(this.filename()) + '$');\n      v = URI.recodePath(v);\n      this._parts.path = this._parts.path.replace(replace, v);\n\n      if (mutatedDirectory) {\n        this.normalizePath(build);\n      } else {\n        this.build(!build);\n      }\n\n      return this;\n    }\n  };\n  p.suffix = function(v, build) {\n    if (this._parts.urn) {\n      return v === undefined ? '' : this;\n    }\n\n    if (v === undefined || v === true) {\n      if (!this._parts.path || this._parts.path === '/') {\n        return '';\n      }\n\n      var filename = this.filename();\n      var pos = filename.lastIndexOf('.');\n      var s, res;\n\n      if (pos === -1) {\n        return '';\n      }\n\n      // suffix may only contain alnum characters (yup, I made this up.)\n      s = filename.substring(pos+1);\n      res = (/^[a-z0-9%]+$/i).test(s) ? s : '';\n      return v ? URI.decodePathSegment(res) : res;\n    } else {\n      if (v.charAt(0) === '.') {\n        v = v.substring(1);\n      }\n\n      var suffix = this.suffix();\n      var replace;\n\n      if (!suffix) {\n        if (!v) {\n          return this;\n        }\n\n        this._parts.path += '.' + URI.recodePath(v);\n      } else if (!v) {\n        replace = new RegExp(escapeRegEx('.' + suffix) + '$');\n      } else {\n        replace = new RegExp(escapeRegEx(suffix) + '$');\n      }\n\n      if (replace) {\n        v = URI.recodePath(v);\n        this._parts.path = this._parts.path.replace(replace, v);\n      }\n\n      this.build(!build);\n      return this;\n    }\n  };\n  p.segment = function(segment, v, build) {\n    var separator = this._parts.urn ? ':' : '/';\n    var path = this.path();\n    var absolute = path.substring(0, 1) === '/';\n    var segments = path.split(separator);\n\n    if (segment !== undefined && typeof segment !== 'number') {\n      build = v;\n      v = segment;\n      segment = undefined;\n    }\n\n    if (segment !== undefined && typeof segment !== 'number') {\n      throw new Error('Bad segment \"' + segment + '\", must be 0-based integer');\n    }\n\n    if (absolute) {\n      segments.shift();\n    }\n\n    if (segment < 0) {\n      // allow negative indexes to address from the end\n      segment = Math.max(segments.length + segment, 0);\n    }\n\n    if (v === undefined) {\n      /*jshint laxbreak: true */\n      return segment === undefined\n        ? segments\n        : segments[segment];\n      /*jshint laxbreak: false */\n    } else if (segment === null || segments[segment] === undefined) {\n      if (isArray(v)) {\n        segments = [];\n        // collapse empty elements within array\n        for (var i=0, l=v.length; i < l; i++) {\n          if (!v[i].length && (!segments.length || !segments[segments.length -1].length)) {\n            continue;\n          }\n\n          if (segments.length && !segments[segments.length -1].length) {\n            segments.pop();\n          }\n\n          segments.push(trimSlashes(v[i]));\n        }\n      } else if (v || typeof v === 'string') {\n        v = trimSlashes(v);\n        if (segments[segments.length -1] === '') {\n          // empty trailing elements have to be overwritten\n          // to prevent results such as /foo//bar\n          segments[segments.length -1] = v;\n        } else {\n          segments.push(v);\n        }\n      }\n    } else {\n      if (v) {\n        segments[segment] = trimSlashes(v);\n      } else {\n        segments.splice(segment, 1);\n      }\n    }\n\n    if (absolute) {\n      segments.unshift('');\n    }\n\n    return this.path(segments.join(separator), build);\n  };\n  p.segmentCoded = function(segment, v, build) {\n    var segments, i, l;\n\n    if (typeof segment !== 'number') {\n      build = v;\n      v = segment;\n      segment = undefined;\n    }\n\n    if (v === undefined) {\n      segments = this.segment(segment, v, build);\n      if (!isArray(segments)) {\n        segments = segments !== undefined ? URI.decode(segments) : undefined;\n      } else {\n        for (i = 0, l = segments.length; i < l; i++) {\n          segments[i] = URI.decode(segments[i]);\n        }\n      }\n\n      return segments;\n    }\n\n    if (!isArray(v)) {\n      v = (typeof v === 'string' || v instanceof String) ? URI.encode(v) : v;\n    } else {\n      for (i = 0, l = v.length; i < l; i++) {\n        v[i] = URI.encode(v[i]);\n      }\n    }\n\n    return this.segment(segment, v, build);\n  };\n\n  // mutating query string\n  var q = p.query;\n  p.query = function(v, build) {\n    if (v === true) {\n      return URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n    } else if (typeof v === 'function') {\n      var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n      var result = v.call(this, data);\n      this._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n      this.build(!build);\n      return this;\n    } else if (v !== undefined && typeof v !== 'string') {\n      this._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n      this.build(!build);\n      return this;\n    } else {\n      return q.call(this, v, build);\n    }\n  };\n  p.setQuery = function(name, value, build) {\n    var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\n    if (typeof name === 'string' || name instanceof String) {\n      data[name] = value !== undefined ? value : null;\n    } else if (typeof name === 'object') {\n      for (var key in name) {\n        if (hasOwn.call(name, key)) {\n          data[key] = name[key];\n        }\n      }\n    } else {\n      throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n    }\n\n    this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n    if (typeof name !== 'string') {\n      build = value;\n    }\n\n    this.build(!build);\n    return this;\n  };\n  p.addQuery = function(name, value, build) {\n    var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n    URI.addQuery(data, name, value === undefined ? null : value);\n    this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n    if (typeof name !== 'string') {\n      build = value;\n    }\n\n    this.build(!build);\n    return this;\n  };\n  p.removeQuery = function(name, value, build) {\n    var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n    URI.removeQuery(data, name, value);\n    this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n    if (typeof name !== 'string') {\n      build = value;\n    }\n\n    this.build(!build);\n    return this;\n  };\n  p.hasQuery = function(name, value, withinArray) {\n    var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n    return URI.hasQuery(data, name, value, withinArray);\n  };\n  p.setSearch = p.setQuery;\n  p.addSearch = p.addQuery;\n  p.removeSearch = p.removeQuery;\n  p.hasSearch = p.hasQuery;\n\n  // sanitizing URLs\n  p.normalize = function() {\n    if (this._parts.urn) {\n      return this\n        .normalizeProtocol(false)\n        .normalizePath(false)\n        .normalizeQuery(false)\n        .normalizeFragment(false)\n        .build();\n    }\n\n    return this\n      .normalizeProtocol(false)\n      .normalizeHostname(false)\n      .normalizePort(false)\n      .normalizePath(false)\n      .normalizeQuery(false)\n      .normalizeFragment(false)\n      .build();\n  };\n  p.normalizeProtocol = function(build) {\n    if (typeof this._parts.protocol === 'string') {\n      this._parts.protocol = this._parts.protocol.toLowerCase();\n      this.build(!build);\n    }\n\n    return this;\n  };\n  p.normalizeHostname = function(build) {\n    if (this._parts.hostname) {\n      if (this.is('IDN') && punycode) {\n        this._parts.hostname = punycode.toASCII(this._parts.hostname);\n      } else if (this.is('IPv6') && IPv6) {\n        this._parts.hostname = IPv6.best(this._parts.hostname);\n      }\n\n      this._parts.hostname = this._parts.hostname.toLowerCase();\n      this.build(!build);\n    }\n\n    return this;\n  };\n  p.normalizePort = function(build) {\n    // remove port of it's the protocol's default\n    if (typeof this._parts.protocol === 'string' && this._parts.port === URI.defaultPorts[this._parts.protocol]) {\n      this._parts.port = null;\n      this.build(!build);\n    }\n\n    return this;\n  };\n  p.normalizePath = function(build) {\n    var _path = this._parts.path;\n    if (!_path) {\n      return this;\n    }\n\n    if (this._parts.urn) {\n      this._parts.path = URI.recodeUrnPath(this._parts.path);\n      this.build(!build);\n      return this;\n    }\n\n    if (this._parts.path === '/') {\n      return this;\n    }\n\n    _path = URI.recodePath(_path);\n\n    var _was_relative;\n    var _leadingParents = '';\n    var _parent, _pos;\n\n    // handle relative paths\n    if (_path.charAt(0) !== '/') {\n      _was_relative = true;\n      _path = '/' + _path;\n    }\n\n    // handle relative files (as opposed to directories)\n    if (_path.slice(-3) === '/..' || _path.slice(-2) === '/.') {\n      _path += '/';\n    }\n\n    // resolve simples\n    _path = _path\n      .replace(/(\\/(\\.\\/)+)|(\\/\\.$)/g, '/')\n      .replace(/\\/{2,}/g, '/');\n\n    // remember leading parents\n    if (_was_relative) {\n      _leadingParents = _path.substring(1).match(/^(\\.\\.\\/)+/) || '';\n      if (_leadingParents) {\n        _leadingParents = _leadingParents[0];\n      }\n    }\n\n    // resolve parents\n    while (true) {\n      _parent = _path.search(/\\/\\.\\.(\\/|$)/);\n      if (_parent === -1) {\n        // no more ../ to resolve\n        break;\n      } else if (_parent === 0) {\n        // top level cannot be relative, skip it\n        _path = _path.substring(3);\n        continue;\n      }\n\n      _pos = _path.substring(0, _parent).lastIndexOf('/');\n      if (_pos === -1) {\n        _pos = _parent;\n      }\n      _path = _path.substring(0, _pos) + _path.substring(_parent + 3);\n    }\n\n    // revert to relative\n    if (_was_relative && this.is('relative')) {\n      _path = _leadingParents + _path.substring(1);\n    }\n\n    this._parts.path = _path;\n    this.build(!build);\n    return this;\n  };\n  p.normalizePathname = p.normalizePath;\n  p.normalizeQuery = function(build) {\n    if (typeof this._parts.query === 'string') {\n      if (!this._parts.query.length) {\n        this._parts.query = null;\n      } else {\n        this.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace));\n      }\n\n      this.build(!build);\n    }\n\n    return this;\n  };\n  p.normalizeFragment = function(build) {\n    if (!this._parts.fragment) {\n      this._parts.fragment = null;\n      this.build(!build);\n    }\n\n    return this;\n  };\n  p.normalizeSearch = p.normalizeQuery;\n  p.normalizeHash = p.normalizeFragment;\n\n  p.iso8859 = function() {\n    // expect unicode input, iso8859 output\n    var e = URI.encode;\n    var d = URI.decode;\n\n    URI.encode = escape;\n    URI.decode = decodeURIComponent;\n    try {\n      this.normalize();\n    } finally {\n      URI.encode = e;\n      URI.decode = d;\n    }\n    return this;\n  };\n\n  p.unicode = function() {\n    // expect iso8859 input, unicode output\n    var e = URI.encode;\n    var d = URI.decode;\n\n    URI.encode = strictEncodeURIComponent;\n    URI.decode = unescape;\n    try {\n      this.normalize();\n    } finally {\n      URI.encode = e;\n      URI.decode = d;\n    }\n    return this;\n  };\n\n  p.readable = function() {\n    var uri = this.clone();\n    // removing username, password, because they shouldn't be displayed according to RFC 3986\n    uri.username('').password('').normalize();\n    var t = '';\n    if (uri._parts.protocol) {\n      t += uri._parts.protocol + '://';\n    }\n\n    if (uri._parts.hostname) {\n      if (uri.is('punycode') && punycode) {\n        t += punycode.toUnicode(uri._parts.hostname);\n        if (uri._parts.port) {\n          t += ':' + uri._parts.port;\n        }\n      } else {\n        t += uri.host();\n      }\n    }\n\n    if (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== '/') {\n      t += '/';\n    }\n\n    t += uri.path(true);\n    if (uri._parts.query) {\n      var q = '';\n      for (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) {\n        var kv = (qp[i] || '').split('=');\n        q += '&' + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace)\n          .replace(/&/g, '%26');\n\n        if (kv[1] !== undefined) {\n          q += '=' + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace)\n            .replace(/&/g, '%26');\n        }\n      }\n      t += '?' + q.substring(1);\n    }\n\n    t += URI.decodeQuery(uri.hash(), true);\n    return t;\n  };\n\n  // resolving relative and absolute URLs\n  p.absoluteTo = function(base) {\n    var resolved = this.clone();\n    var properties = ['protocol', 'username', 'password', 'hostname', 'port'];\n    var basedir, i, p;\n\n    if (this._parts.urn) {\n      throw new Error('URNs do not have any generally defined hierarchical components');\n    }\n\n    if (!(base instanceof URI)) {\n      base = new URI(base);\n    }\n\n    if (resolved._parts.protocol) {\n      // Directly returns even if this._parts.hostname is empty.\n      return resolved;\n    } else {\n      resolved._parts.protocol = base._parts.protocol;\n    }\n\n    if (this._parts.hostname) {\n      return resolved;\n    }\n\n    for (i = 0; (p = properties[i]); i++) {\n      resolved._parts[p] = base._parts[p];\n    }\n\n    if (!resolved._parts.path) {\n      resolved._parts.path = base._parts.path;\n      if (!resolved._parts.query) {\n        resolved._parts.query = base._parts.query;\n      }\n    } else {\n      if (resolved._parts.path.substring(-2) === '..') {\n        resolved._parts.path += '/';\n      }\n\n      if (resolved.path().charAt(0) !== '/') {\n        basedir = base.directory();\n        basedir = basedir ? basedir : base.path().indexOf('/') === 0 ? '/' : '';\n        resolved._parts.path = (basedir ? (basedir + '/') : '') + resolved._parts.path;\n        resolved.normalizePath();\n      }\n    }\n\n    resolved.build();\n    return resolved;\n  };\n  p.relativeTo = function(base) {\n    var relative = this.clone().normalize();\n    var relativeParts, baseParts, common, relativePath, basePath;\n\n    if (relative._parts.urn) {\n      throw new Error('URNs do not have any generally defined hierarchical components');\n    }\n\n    base = new URI(base).normalize();\n    relativeParts = relative._parts;\n    baseParts = base._parts;\n    relativePath = relative.path();\n    basePath = base.path();\n\n    if (relativePath.charAt(0) !== '/') {\n      throw new Error('URI is already relative');\n    }\n\n    if (basePath.charAt(0) !== '/') {\n      throw new Error('Cannot calculate a URI relative to another relative URI');\n    }\n\n    if (relativeParts.protocol === baseParts.protocol) {\n      relativeParts.protocol = null;\n    }\n\n    if (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) {\n      return relative.build();\n    }\n\n    if (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) {\n      return relative.build();\n    }\n\n    if (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) {\n      relativeParts.hostname = null;\n      relativeParts.port = null;\n    } else {\n      return relative.build();\n    }\n\n    if (relativePath === basePath) {\n      relativeParts.path = '';\n      return relative.build();\n    }\n\n    // determine common sub path\n    common = URI.commonPath(relativePath, basePath);\n\n    // If the paths have nothing in common, return a relative URL with the absolute path.\n    if (!common) {\n      return relative.build();\n    }\n\n    var parents = baseParts.path\n      .substring(common.length)\n      .replace(/[^\\/]*$/, '')\n      .replace(/.*?\\//g, '../');\n\n    relativeParts.path = (parents + relativeParts.path.substring(common.length)) || './';\n\n    return relative.build();\n  };\n\n  // comparing URIs\n  p.equals = function(uri) {\n    var one = this.clone();\n    var two = new URI(uri);\n    var one_map = {};\n    var two_map = {};\n    var checked = {};\n    var one_query, two_query, key;\n\n    one.normalize();\n    two.normalize();\n\n    // exact match\n    if (one.toString() === two.toString()) {\n      return true;\n    }\n\n    // extract query string\n    one_query = one.query();\n    two_query = two.query();\n    one.query('');\n    two.query('');\n\n    // definitely not equal if not even non-query parts match\n    if (one.toString() !== two.toString()) {\n      return false;\n    }\n\n    // query parameters have the same length, even if they're permuted\n    if (one_query.length !== two_query.length) {\n      return false;\n    }\n\n    one_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace);\n    two_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace);\n\n    for (key in one_map) {\n      if (hasOwn.call(one_map, key)) {\n        if (!isArray(one_map[key])) {\n          if (one_map[key] !== two_map[key]) {\n            return false;\n          }\n        } else if (!arraysEqual(one_map[key], two_map[key])) {\n          return false;\n        }\n\n        checked[key] = true;\n      }\n    }\n\n    for (key in two_map) {\n      if (hasOwn.call(two_map, key)) {\n        if (!checked[key]) {\n          // two contains a parameter not present in one\n          return false;\n        }\n      }\n    }\n\n    return true;\n  };\n\n  // state\n  p.preventInvalidHostname = function(v) {\n    this._parts.preventInvalidHostname = !!v;\n    return this;\n  };\n\n  p.duplicateQueryParameters = function(v) {\n    this._parts.duplicateQueryParameters = !!v;\n    return this;\n  };\n\n  p.escapeQuerySpace = function(v) {\n    this._parts.escapeQuerySpace = !!v;\n    return this;\n  };\n\n  return URI;\n}));\n","/*! https://mths.be/punycode v1.4.0 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow new RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t    counter = 0,\n\t\t    length = string.length,\n\t\t    value,\n\t\t    extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t//  0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t    inputLength = input.length,\n\t\t    out,\n\t\t    i = 0,\n\t\t    n = initialN,\n\t\t    bias = initialBias,\n\t\t    basic,\n\t\t    j,\n\t\t    index,\n\t\t    oldi,\n\t\t    w,\n\t\t    k,\n\t\t    digit,\n\t\t    t,\n\t\t    /** Cached calculation results */\n\t\t    baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t    delta,\n\t\t    handledCPCount,\n\t\t    basicLength,\n\t\t    bias,\n\t\t    j,\n\t\t    m,\n\t\t    q,\n\t\t    k,\n\t\t    t,\n\t\t    currentValue,\n\t\t    output = [],\n\t\t    /** `inputLength` will hold the number of code points in `input`. */\n\t\t    inputLength,\n\t\t    /** Cached calculation results */\n\t\t    handledCPCountPlusOne,\n\t\t    baseMinusT,\n\t\t    qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.3.2',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine('punycode', function() {\n\t\t\treturn punycode;\n\t\t});\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) {\n\t\t\t// in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else {\n\t\t\t// in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n","/**\n  * vee-validate v2.2.13\n  * (c) 2019 Abdelrahman Awad\n  * @license MIT\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = global || self, global.VeeValidate = factory());\n}(this, function () { 'use strict';\n\n  function toInteger (dirtyNumber) {\n    if (dirtyNumber === null || dirtyNumber === true || dirtyNumber === false) {\n      return NaN\n    }\n\n    var number = Number(dirtyNumber);\n\n    if (isNaN(number)) {\n      return number\n    }\n\n    return number < 0 ? Math.ceil(number) : Math.floor(number)\n  }\n\n  var MILLISECONDS_IN_MINUTE = 60000;\n\n  /**\n   * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n   * They usually appear for dates that denote time before the timezones were introduced\n   * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n   * and GMT+01:00:00 after that date)\n   *\n   * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n   * which would lead to incorrect calculations.\n   *\n   * This function returns the timezone offset in milliseconds that takes seconds in account.\n   */\n  function getTimezoneOffsetInMilliseconds (dirtyDate) {\n    var date = new Date(dirtyDate.getTime());\n    var baseTimezoneOffset = date.getTimezoneOffset();\n    date.setSeconds(0, 0);\n    var millisecondsPartOfTimezoneOffset = date.getTime() % MILLISECONDS_IN_MINUTE;\n\n    return baseTimezoneOffset * MILLISECONDS_IN_MINUTE + millisecondsPartOfTimezoneOffset\n  }\n\n  var MILLISECONDS_IN_HOUR = 3600000;\n  var MILLISECONDS_IN_MINUTE$1 = 60000;\n  var DEFAULT_ADDITIONAL_DIGITS = 2;\n\n  var patterns = {\n    dateTimeDelimeter: /[T ]/,\n    plainTime: /:/,\n    timeZoneDelimeter: /[Z ]/i,\n\n    // year tokens\n    YY: /^(\\d{2})$/,\n    YYY: [\n      /^([+-]\\d{2})$/, // 0 additional digits\n      /^([+-]\\d{3})$/, // 1 additional digit\n      /^([+-]\\d{4})$/ // 2 additional digits\n    ],\n    YYYY: /^(\\d{4})/,\n    YYYYY: [\n      /^([+-]\\d{4})/, // 0 additional digits\n      /^([+-]\\d{5})/, // 1 additional digit\n      /^([+-]\\d{6})/ // 2 additional digits\n    ],\n\n    // date tokens\n    MM: /^-(\\d{2})$/,\n    DDD: /^-?(\\d{3})$/,\n    MMDD: /^-?(\\d{2})-?(\\d{2})$/,\n    Www: /^-?W(\\d{2})$/,\n    WwwD: /^-?W(\\d{2})-?(\\d{1})$/,\n\n    HH: /^(\\d{2}([.,]\\d*)?)$/,\n    HHMM: /^(\\d{2}):?(\\d{2}([.,]\\d*)?)$/,\n    HHMMSS: /^(\\d{2}):?(\\d{2}):?(\\d{2}([.,]\\d*)?)$/,\n\n    // timezone tokens\n    timezone: /([Z+-].*)$/,\n    timezoneZ: /^(Z)$/,\n    timezoneHH: /^([+-])(\\d{2})$/,\n    timezoneHHMM: /^([+-])(\\d{2}):?(\\d{2})$/\n  };\n\n  /**\n   * @name toDate\n   * @category Common Helpers\n   * @summary Convert the given argument to an instance of Date.\n   *\n   * @description\n   * Convert the given argument to an instance of Date.\n   *\n   * If the argument is an instance of Date, the function returns its clone.\n   *\n   * If the argument is a number, it is treated as a timestamp.\n   *\n   * If an argument is a string, the function tries to parse it.\n   * Function accepts complete ISO 8601 formats as well as partial implementations.\n   * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n   * If the function cannot parse the string or the values are invalid, it returns Invalid Date.\n   *\n   * If the argument is none of the above, the function returns Invalid Date.\n   *\n   * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n   * All *date-fns* functions will throw `RangeError` if `options.additionalDigits` is not 0, 1, 2 or undefined.\n   *\n   * @param {Date|String|Number} argument - the value to convert\n   * @param {Options} [options] - the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n   * @param {0|1|2} [options.additionalDigits=2] - the additional number of digits in the extended year format\n   * @returns {Date} the parsed date in the local time zone\n   * @throws {TypeError} 1 argument required\n   * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n   *\n   * @example\n   * // Convert string '2014-02-11T11:30:30' to date:\n   * var result = toDate('2014-02-11T11:30:30')\n   * //=> Tue Feb 11 2014 11:30:30\n   *\n   * @example\n   * // Convert string '+02014101' to date,\n   * // if the additional number of digits in the extended year format is 1:\n   * var result = toDate('+02014101', {additionalDigits: 1})\n   * //=> Fri Apr 11 2014 00:00:00\n   */\n  function toDate (argument, dirtyOptions) {\n    if (arguments.length < 1) {\n      throw new TypeError('1 argument required, but only ' + arguments.length + ' present')\n    }\n\n    if (argument === null) {\n      return new Date(NaN)\n    }\n\n    var options = dirtyOptions || {};\n\n    var additionalDigits = options.additionalDigits == null ? DEFAULT_ADDITIONAL_DIGITS : toInteger(options.additionalDigits);\n    if (additionalDigits !== 2 && additionalDigits !== 1 && additionalDigits !== 0) {\n      throw new RangeError('additionalDigits must be 0, 1 or 2')\n    }\n\n    // Clone the date\n    if (argument instanceof Date ||\n      (typeof argument === 'object' && Object.prototype.toString.call(argument) === '[object Date]')\n    ) {\n      // Prevent the date to lose the milliseconds when passed to new Date() in IE10\n      return new Date(argument.getTime())\n    } else if (typeof argument === 'number' || Object.prototype.toString.call(argument) === '[object Number]') {\n      return new Date(argument)\n    } else if (!(typeof argument === 'string' || Object.prototype.toString.call(argument) === '[object String]')) {\n      return new Date(NaN)\n    }\n\n    var dateStrings = splitDateString(argument);\n\n    var parseYearResult = parseYear(dateStrings.date, additionalDigits);\n    var year = parseYearResult.year;\n    var restDateString = parseYearResult.restDateString;\n\n    var date = parseDate(restDateString, year);\n\n    if (isNaN(date)) {\n      return new Date(NaN)\n    }\n\n    if (date) {\n      var timestamp = date.getTime();\n      var time = 0;\n      var offset;\n\n      if (dateStrings.time) {\n        time = parseTime(dateStrings.time);\n\n        if (isNaN(time)) {\n          return new Date(NaN)\n        }\n      }\n\n      if (dateStrings.timezone) {\n        offset = parseTimezone(dateStrings.timezone);\n        if (isNaN(offset)) {\n          return new Date(NaN)\n        }\n      } else {\n        // get offset accurate to hour in timezones that change offset\n        offset = getTimezoneOffsetInMilliseconds(new Date(timestamp + time));\n        offset = getTimezoneOffsetInMilliseconds(new Date(timestamp + time + offset));\n      }\n\n      return new Date(timestamp + time + offset)\n    } else {\n      return new Date(NaN)\n    }\n  }\n\n  function splitDateString (dateString) {\n    var dateStrings = {};\n    var array = dateString.split(patterns.dateTimeDelimeter);\n    var timeString;\n\n    if (patterns.plainTime.test(array[0])) {\n      dateStrings.date = null;\n      timeString = array[0];\n    } else {\n      dateStrings.date = array[0];\n      timeString = array[1];\n      if (patterns.timeZoneDelimeter.test(dateStrings.date)) {\n        dateStrings.date = dateString.split(patterns.timeZoneDelimeter)[0];\n        timeString = dateString.substr(dateStrings.date.length, dateString.length);\n      }\n    }\n\n    if (timeString) {\n      var token = patterns.timezone.exec(timeString);\n      if (token) {\n        dateStrings.time = timeString.replace(token[1], '');\n        dateStrings.timezone = token[1];\n      } else {\n        dateStrings.time = timeString;\n      }\n    }\n\n    return dateStrings\n  }\n\n  function parseYear (dateString, additionalDigits) {\n    var patternYYY = patterns.YYY[additionalDigits];\n    var patternYYYYY = patterns.YYYYY[additionalDigits];\n\n    var token;\n\n    // YYYY or Â±YYYYY\n    token = patterns.YYYY.exec(dateString) || patternYYYYY.exec(dateString);\n    if (token) {\n      var yearString = token[1];\n      return {\n        year: parseInt(yearString, 10),\n        restDateString: dateString.slice(yearString.length)\n      }\n    }\n\n    // YY or Â±YYY\n    token = patterns.YY.exec(dateString) || patternYYY.exec(dateString);\n    if (token) {\n      var centuryString = token[1];\n      return {\n        year: parseInt(centuryString, 10) * 100,\n        restDateString: dateString.slice(centuryString.length)\n      }\n    }\n\n    // Invalid ISO-formatted year\n    return {\n      year: null\n    }\n  }\n\n  function parseDate (dateString, year) {\n    // Invalid ISO-formatted year\n    if (year === null) {\n      return null\n    }\n\n    var token;\n    var date;\n    var month;\n    var week;\n\n    // YYYY\n    if (dateString.length === 0) {\n      date = new Date(0);\n      date.setUTCFullYear(year);\n      return date\n    }\n\n    // YYYY-MM\n    token = patterns.MM.exec(dateString);\n    if (token) {\n      date = new Date(0);\n      month = parseInt(token[1], 10) - 1;\n\n      if (!validateDate(year, month)) {\n        return new Date(NaN)\n      }\n\n      date.setUTCFullYear(year, month);\n      return date\n    }\n\n    // YYYY-DDD or YYYYDDD\n    token = patterns.DDD.exec(dateString);\n    if (token) {\n      date = new Date(0);\n      var dayOfYear = parseInt(token[1], 10);\n\n      if (!validateDayOfYearDate(year, dayOfYear)) {\n        return new Date(NaN)\n      }\n\n      date.setUTCFullYear(year, 0, dayOfYear);\n      return date\n    }\n\n    // YYYY-MM-DD or YYYYMMDD\n    token = patterns.MMDD.exec(dateString);\n    if (token) {\n      date = new Date(0);\n      month = parseInt(token[1], 10) - 1;\n      var day = parseInt(token[2], 10);\n\n      if (!validateDate(year, month, day)) {\n        return new Date(NaN)\n      }\n\n      date.setUTCFullYear(year, month, day);\n      return date\n    }\n\n    // YYYY-Www or YYYYWww\n    token = patterns.Www.exec(dateString);\n    if (token) {\n      week = parseInt(token[1], 10) - 1;\n\n      if (!validateWeekDate(year, week)) {\n        return new Date(NaN)\n      }\n\n      return dayOfISOWeekYear(year, week)\n    }\n\n    // YYYY-Www-D or YYYYWwwD\n    token = patterns.WwwD.exec(dateString);\n    if (token) {\n      week = parseInt(token[1], 10) - 1;\n      var dayOfWeek = parseInt(token[2], 10) - 1;\n\n      if (!validateWeekDate(year, week, dayOfWeek)) {\n        return new Date(NaN)\n      }\n\n      return dayOfISOWeekYear(year, week, dayOfWeek)\n    }\n\n    // Invalid ISO-formatted date\n    return null\n  }\n\n  function parseTime (timeString) {\n    var token;\n    var hours;\n    var minutes;\n\n    // hh\n    token = patterns.HH.exec(timeString);\n    if (token) {\n      hours = parseFloat(token[1].replace(',', '.'));\n\n      if (!validateTime(hours)) {\n        return NaN\n      }\n\n      return (hours % 24) * MILLISECONDS_IN_HOUR\n    }\n\n    // hh:mm or hhmm\n    token = patterns.HHMM.exec(timeString);\n    if (token) {\n      hours = parseInt(token[1], 10);\n      minutes = parseFloat(token[2].replace(',', '.'));\n\n      if (!validateTime(hours, minutes)) {\n        return NaN\n      }\n\n      return (hours % 24) * MILLISECONDS_IN_HOUR +\n        minutes * MILLISECONDS_IN_MINUTE$1\n    }\n\n    // hh:mm:ss or hhmmss\n    token = patterns.HHMMSS.exec(timeString);\n    if (token) {\n      hours = parseInt(token[1], 10);\n      minutes = parseInt(token[2], 10);\n      var seconds = parseFloat(token[3].replace(',', '.'));\n\n      if (!validateTime(hours, minutes, seconds)) {\n        return NaN\n      }\n\n      return (hours % 24) * MILLISECONDS_IN_HOUR +\n        minutes * MILLISECONDS_IN_MINUTE$1 +\n        seconds * 1000\n    }\n\n    // Invalid ISO-formatted time\n    return null\n  }\n\n  function parseTimezone (timezoneString) {\n    var token;\n    var absoluteOffset;\n\n    // Z\n    token = patterns.timezoneZ.exec(timezoneString);\n    if (token) {\n      return 0\n    }\n\n    var hours;\n\n    // Â±hh\n    token = patterns.timezoneHH.exec(timezoneString);\n    if (token) {\n      hours = parseInt(token[2], 10);\n\n      if (!validateTimezone()) {\n        return NaN\n      }\n\n      absoluteOffset = hours * MILLISECONDS_IN_HOUR;\n      return (token[1] === '+') ? -absoluteOffset : absoluteOffset\n    }\n\n    // Â±hh:mm or Â±hhmm\n    token = patterns.timezoneHHMM.exec(timezoneString);\n    if (token) {\n      hours = parseInt(token[2], 10);\n      var minutes = parseInt(token[3], 10);\n\n      if (!validateTimezone(hours, minutes)) {\n        return NaN\n      }\n\n      absoluteOffset = hours * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE$1;\n      return (token[1] === '+') ? -absoluteOffset : absoluteOffset\n    }\n\n    return 0\n  }\n\n  function dayOfISOWeekYear (isoWeekYear, week, day) {\n    week = week || 0;\n    day = day || 0;\n    var date = new Date(0);\n    date.setUTCFullYear(isoWeekYear, 0, 4);\n    var fourthOfJanuaryDay = date.getUTCDay() || 7;\n    var diff = week * 7 + day + 1 - fourthOfJanuaryDay;\n    date.setUTCDate(date.getUTCDate() + diff);\n    return date\n  }\n\n  // Validation functions\n\n  var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n  var DAYS_IN_MONTH_LEAP_YEAR = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n  function isLeapYearIndex (year) {\n    return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0)\n  }\n\n  function validateDate (year, month, date) {\n    if (month < 0 || month > 11) {\n      return false\n    }\n\n    if (date != null) {\n      if (date < 1) {\n        return false\n      }\n\n      var isLeapYear = isLeapYearIndex(year);\n      if (isLeapYear && date > DAYS_IN_MONTH_LEAP_YEAR[month]) {\n        return false\n      }\n      if (!isLeapYear && date > DAYS_IN_MONTH[month]) {\n        return false\n      }\n    }\n\n    return true\n  }\n\n  function validateDayOfYearDate (year, dayOfYear) {\n    if (dayOfYear < 1) {\n      return false\n    }\n\n    var isLeapYear = isLeapYearIndex(year);\n    if (isLeapYear && dayOfYear > 366) {\n      return false\n    }\n    if (!isLeapYear && dayOfYear > 365) {\n      return false\n    }\n\n    return true\n  }\n\n  function validateWeekDate (year, week, day) {\n    if (week < 0 || week > 52) {\n      return false\n    }\n\n    if (day != null && (day < 0 || day > 6)) {\n      return false\n    }\n\n    return true\n  }\n\n  function validateTime (hours, minutes, seconds) {\n    if (hours != null && (hours < 0 || hours >= 25)) {\n      return false\n    }\n\n    if (minutes != null && (minutes < 0 || minutes >= 60)) {\n      return false\n    }\n\n    if (seconds != null && (seconds < 0 || seconds >= 60)) {\n      return false\n    }\n\n    return true\n  }\n\n  function validateTimezone (hours, minutes) {\n    if (minutes != null && (minutes < 0 || minutes > 59)) {\n      return false\n    }\n\n    return true\n  }\n\n  /**\n   * @name addMilliseconds\n   * @category Millisecond Helpers\n   * @summary Add the specified number of milliseconds to the given date.\n   *\n   * @description\n   * Add the specified number of milliseconds to the given date.\n   *\n   * @param {Date|String|Number} date - the date to be changed\n   * @param {Number} amount - the amount of milliseconds to be added\n   * @param {Options} [options] - the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n   * @param {0|1|2} [options.additionalDigits=2] - passed to `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate}\n   * @returns {Date} the new date with the milliseconds added\n   * @throws {TypeError} 2 arguments required\n   * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n   *\n   * @example\n   * // Add 750 milliseconds to 10 July 2014 12:45:30.000:\n   * var result = addMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)\n   * //=> Thu Jul 10 2014 12:45:30.750\n   */\n  function addMilliseconds (dirtyDate, dirtyAmount, dirtyOptions) {\n    if (arguments.length < 2) {\n      throw new TypeError('2 arguments required, but only ' + arguments.length + ' present')\n    }\n\n    var timestamp = toDate(dirtyDate, dirtyOptions).getTime();\n    var amount = toInteger(dirtyAmount);\n    return new Date(timestamp + amount)\n  }\n\n  /**\n   * @name isValid\n   * @category Common Helpers\n   * @summary Is the given date valid?\n   *\n   * @description\n   * Returns false if argument is Invalid Date and true otherwise.\n   * Argument is converted to Date using `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate}\n   * Invalid Date is a Date, whose time value is NaN.\n   *\n   * Time value of Date: http://es5.github.io/#x15.9.1.1\n   *\n   * @param {*} date - the date to check\n   * @param {Options} [options] - the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n   * @param {0|1|2} [options.additionalDigits=2] - passed to `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate}\n   * @returns {Boolean} the date is valid\n   * @throws {TypeError} 1 argument required\n   * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n   *\n   * @example\n   * // For the valid date:\n   * var result = isValid(new Date(2014, 1, 31))\n   * //=> true\n   *\n   * @example\n   * // For the value, convertable into a date:\n   * var result = isValid('2014-02-31')\n   * //=> true\n   *\n   * @example\n   * // For the invalid date:\n   * var result = isValid(new Date(''))\n   * //=> false\n   */\n  function isValid (dirtyDate, dirtyOptions) {\n    if (arguments.length < 1) {\n      throw new TypeError('1 argument required, but only ' + arguments.length + ' present')\n    }\n\n    var date = toDate(dirtyDate, dirtyOptions);\n    return !isNaN(date)\n  }\n\n  var formatDistanceLocale = {\n    lessThanXSeconds: {\n      one: 'less than a second',\n      other: 'less than {{count}} seconds'\n    },\n\n    xSeconds: {\n      one: '1 second',\n      other: '{{count}} seconds'\n    },\n\n    halfAMinute: 'half a minute',\n\n    lessThanXMinutes: {\n      one: 'less than a minute',\n      other: 'less than {{count}} minutes'\n    },\n\n    xMinutes: {\n      one: '1 minute',\n      other: '{{count}} minutes'\n    },\n\n    aboutXHours: {\n      one: 'about 1 hour',\n      other: 'about {{count}} hours'\n    },\n\n    xHours: {\n      one: '1 hour',\n      other: '{{count}} hours'\n    },\n\n    xDays: {\n      one: '1 day',\n      other: '{{count}} days'\n    },\n\n    aboutXMonths: {\n      one: 'about 1 month',\n      other: 'about {{count}} months'\n    },\n\n    xMonths: {\n      one: '1 month',\n      other: '{{count}} months'\n    },\n\n    aboutXYears: {\n      one: 'about 1 year',\n      other: 'about {{count}} years'\n    },\n\n    xYears: {\n      one: '1 year',\n      other: '{{count}} years'\n    },\n\n    overXYears: {\n      one: 'over 1 year',\n      other: 'over {{count}} years'\n    },\n\n    almostXYears: {\n      one: 'almost 1 year',\n      other: 'almost {{count}} years'\n    }\n  };\n\n  function formatDistance (token, count, options) {\n    options = options || {};\n\n    var result;\n    if (typeof formatDistanceLocale[token] === 'string') {\n      result = formatDistanceLocale[token];\n    } else if (count === 1) {\n      result = formatDistanceLocale[token].one;\n    } else {\n      result = formatDistanceLocale[token].other.replace('{{count}}', count);\n    }\n\n    if (options.addSuffix) {\n      if (options.comparison > 0) {\n        return 'in ' + result\n      } else {\n        return result + ' ago'\n      }\n    }\n\n    return result\n  }\n\n  function buildFormatLongFn (args) {\n    return function (dirtyOptions) {\n      var options = dirtyOptions || {};\n      var width = options.width ? String(options.width) : args.defaultWidth;\n      var format = args.formats[width] || args.formats[args.defaultWidth];\n      return format\n    }\n  }\n\n  var dateFormats = {\n    full: 'EEEE, MMMM do, y',\n    long: 'MMMM do, y',\n    medium: 'MMM d, y',\n    short: 'MM/dd/yyyy'\n  };\n\n  var timeFormats = {\n    full: 'h:mm:ss a zzzz',\n    long: 'h:mm:ss a z',\n    medium: 'h:mm:ss a',\n    short: 'h:mm a'\n  };\n\n  var dateTimeFormats = {\n    full: \"{{date}} 'at' {{time}}\",\n    long: \"{{date}} 'at' {{time}}\",\n    medium: '{{date}}, {{time}}',\n    short: '{{date}}, {{time}}'\n  };\n\n  var formatLong = {\n    date: buildFormatLongFn({\n      formats: dateFormats,\n      defaultWidth: 'full'\n    }),\n\n    time: buildFormatLongFn({\n      formats: timeFormats,\n      defaultWidth: 'full'\n    }),\n\n    dateTime: buildFormatLongFn({\n      formats: dateTimeFormats,\n      defaultWidth: 'full'\n    })\n  };\n\n  var formatRelativeLocale = {\n    lastWeek: \"'last' eeee 'at' p\",\n    yesterday: \"'yesterday at' p\",\n    today: \"'today at' p\",\n    tomorrow: \"'tomorrow at' p\",\n    nextWeek: \"eeee 'at' p\",\n    other: 'P'\n  };\n\n  function formatRelative (token, date, baseDate, options) {\n    return formatRelativeLocale[token]\n  }\n\n  function buildLocalizeFn (args) {\n    return function (dirtyIndex, dirtyOptions) {\n      var options = dirtyOptions || {};\n      var width = options.width ? String(options.width) : args.defaultWidth;\n      var context = options.context ? String(options.context) : 'standalone';\n\n      var valuesArray;\n      if (context === 'formatting' && args.formattingValues) {\n        valuesArray = args.formattingValues[width] || args.formattingValues[args.defaultFormattingWidth];\n      } else {\n        valuesArray = args.values[width] || args.values[args.defaultWidth];\n      }\n      var index = args.argumentCallback ? args.argumentCallback(dirtyIndex) : dirtyIndex;\n      return valuesArray[index]\n    }\n  }\n\n  var eraValues = {\n    narrow: ['B', 'A'],\n    abbreviated: ['BC', 'AD'],\n    wide: ['Before Christ', 'Anno Domini']\n  };\n\n  var quarterValues = {\n    narrow: ['1', '2', '3', '4'],\n    abbreviated: ['Q1', 'Q2', 'Q3', 'Q4'],\n    wide: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter']\n  };\n\n  // Note: in English, the names of days of the week and months are capitalized.\n  // If you are making a new locale based on this one, check if the same is true for the language you're working on.\n  // Generally, formatted dates should look like they are in the middle of a sentence,\n  // e.g. in Spanish language the weekdays and months should be in the lowercase.\n  var monthValues = {\n    narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n    abbreviated: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n    wide: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n  };\n\n  var dayValues = {\n    narrow: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n    short: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n    abbreviated: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n    wide: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']\n  };\n\n  var dayPeriodValues = {\n    narrow: {\n      am: 'a',\n      pm: 'p',\n      midnight: 'mi',\n      noon: 'n',\n      morning: 'morning',\n      afternoon: 'afternoon',\n      evening: 'evening',\n      night: 'night'\n    },\n    abbreviated: {\n      am: 'AM',\n      pm: 'PM',\n      midnight: 'midnight',\n      noon: 'noon',\n      morning: 'morning',\n      afternoon: 'afternoon',\n      evening: 'evening',\n      night: 'night'\n    },\n    wide: {\n      am: 'a.m.',\n      pm: 'p.m.',\n      midnight: 'midnight',\n      noon: 'noon',\n      morning: 'morning',\n      afternoon: 'afternoon',\n      evening: 'evening',\n      night: 'night'\n    }\n  };\n  var formattingDayPeriodValues = {\n    narrow: {\n      am: 'a',\n      pm: 'p',\n      midnight: 'mi',\n      noon: 'n',\n      morning: 'in the morning',\n      afternoon: 'in the afternoon',\n      evening: 'in the evening',\n      night: 'at night'\n    },\n    abbreviated: {\n      am: 'AM',\n      pm: 'PM',\n      midnight: 'midnight',\n      noon: 'noon',\n      morning: 'in the morning',\n      afternoon: 'in the afternoon',\n      evening: 'in the evening',\n      night: 'at night'\n    },\n    wide: {\n      am: 'a.m.',\n      pm: 'p.m.',\n      midnight: 'midnight',\n      noon: 'noon',\n      morning: 'in the morning',\n      afternoon: 'in the afternoon',\n      evening: 'in the evening',\n      night: 'at night'\n    }\n  };\n\n  function ordinalNumber (dirtyNumber, dirtyOptions) {\n    var number = Number(dirtyNumber);\n\n    // If ordinal numbers depend on context, for example,\n    // if they are different for different grammatical genders,\n    // use `options.unit`:\n    //\n    //   var options = dirtyOptions || {}\n    //   var unit = String(options.unit)\n    //\n    // where `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n    // 'day', 'hour', 'minute', 'second'\n\n    var rem100 = number % 100;\n    if (rem100 > 20 || rem100 < 10) {\n      switch (rem100 % 10) {\n        case 1:\n          return number + 'st'\n        case 2:\n          return number + 'nd'\n        case 3:\n          return number + 'rd'\n      }\n    }\n    return number + 'th'\n  }\n\n  var localize = {\n    ordinalNumber: ordinalNumber,\n\n    era: buildLocalizeFn({\n      values: eraValues,\n      defaultWidth: 'wide'\n    }),\n\n    quarter: buildLocalizeFn({\n      values: quarterValues,\n      defaultWidth: 'wide',\n      argumentCallback: function (quarter) {\n        return Number(quarter) - 1\n      }\n    }),\n\n    month: buildLocalizeFn({\n      values: monthValues,\n      defaultWidth: 'wide'\n    }),\n\n    day: buildLocalizeFn({\n      values: dayValues,\n      defaultWidth: 'wide'\n    }),\n\n    dayPeriod: buildLocalizeFn({\n      values: dayPeriodValues,\n      defaultWidth: 'wide',\n      formattingValues: formattingDayPeriodValues,\n      defaulFormattingWidth: 'wide'\n    })\n  };\n\n  function buildMatchPatternFn (args) {\n    return function (dirtyString, dirtyOptions) {\n      var string = String(dirtyString);\n      var options = dirtyOptions || {};\n\n      var matchResult = string.match(args.matchPattern);\n      if (!matchResult) {\n        return null\n      }\n      var matchedString = matchResult[0];\n\n      var parseResult = string.match(args.parsePattern);\n      if (!parseResult) {\n        return null\n      }\n      var value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0];\n      value = options.valueCallback ? options.valueCallback(value) : value;\n\n      return {\n        value: value,\n        rest: string.slice(matchedString.length)\n      }\n    }\n  }\n\n  function buildMatchFn (args) {\n    return function (dirtyString, dirtyOptions) {\n      var string = String(dirtyString);\n      var options = dirtyOptions || {};\n      var width = options.width;\n\n      var matchPattern = (width && args.matchPatterns[width]) || args.matchPatterns[args.defaultMatchWidth];\n      var matchResult = string.match(matchPattern);\n\n      if (!matchResult) {\n        return null\n      }\n      var matchedString = matchResult[0];\n\n      var parsePatterns = (width && args.parsePatterns[width]) || args.parsePatterns[args.defaultParseWidth];\n\n      var value;\n      if (Object.prototype.toString.call(parsePatterns) === '[object Array]') {\n        value = parsePatterns.findIndex(function (pattern) {\n          return pattern.test(string)\n        });\n      } else {\n        value = findKey(parsePatterns, function (pattern) {\n          return pattern.test(string)\n        });\n      }\n\n      value = args.valueCallback ? args.valueCallback(value) : value;\n      value = options.valueCallback ? options.valueCallback(value) : value;\n\n      return {\n        value: value,\n        rest: string.slice(matchedString.length)\n      }\n    }\n  }\n\n  function findKey (object, predicate) {\n    for (var key in object) {\n      if (object.hasOwnProperty(key) && predicate(object[key])) {\n        return key\n      }\n    }\n  }\n\n  var matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\n  var parseOrdinalNumberPattern = /\\d+/i;\n\n  var matchEraPatterns = {\n    narrow: /^(b|a)/i,\n    abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n    wide: /^(before christ|before common era|anno domini|common era)/i\n  };\n  var parseEraPatterns = {\n    any: [/^b/i, /^(a|c)/i]\n  };\n\n  var matchQuarterPatterns = {\n    narrow: /^[1234]/i,\n    abbreviated: /^q[1234]/i,\n    wide: /^[1234](th|st|nd|rd)? quarter/i\n  };\n  var parseQuarterPatterns = {\n    any: [/1/i, /2/i, /3/i, /4/i]\n  };\n\n  var matchMonthPatterns = {\n    narrow: /^[jfmasond]/i,\n    abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n    wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i\n  };\n  var parseMonthPatterns = {\n    narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i],\n    any: [/^ja/i, /^f/i, /^mar/i, /^ap/i, /^may/i, /^jun/i, /^jul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i]\n  };\n\n  var matchDayPatterns = {\n    narrow: /^[smtwf]/i,\n    short: /^(su|mo|tu|we|th|fr|sa)/i,\n    abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n    wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i\n  };\n  var parseDayPatterns = {\n    narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n    any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i]\n  };\n\n  var matchDayPeriodPatterns = {\n    narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n    any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i\n  };\n  var parseDayPeriodPatterns = {\n    any: {\n      am: /^a/i,\n      pm: /^p/i,\n      midnight: /^mi/i,\n      noon: /^no/i,\n      morning: /morning/i,\n      afternoon: /afternoon/i,\n      evening: /evening/i,\n      night: /night/i\n    }\n  };\n\n  var match = {\n    ordinalNumber: buildMatchPatternFn({\n      matchPattern: matchOrdinalNumberPattern,\n      parsePattern: parseOrdinalNumberPattern,\n      valueCallback: function (value) {\n        return parseInt(value, 10)\n      }\n    }),\n\n    era: buildMatchFn({\n      matchPatterns: matchEraPatterns,\n      defaultMatchWidth: 'wide',\n      parsePatterns: parseEraPatterns,\n      defaultParseWidth: 'any'\n    }),\n\n    quarter: buildMatchFn({\n      matchPatterns: matchQuarterPatterns,\n      defaultMatchWidth: 'wide',\n      parsePatterns: parseQuarterPatterns,\n      defaultParseWidth: 'any',\n      valueCallback: function (index) {\n        return index + 1\n      }\n    }),\n\n    month: buildMatchFn({\n      matchPatterns: matchMonthPatterns,\n      defaultMatchWidth: 'wide',\n      parsePatterns: parseMonthPatterns,\n      defaultParseWidth: 'any'\n    }),\n\n    day: buildMatchFn({\n      matchPatterns: matchDayPatterns,\n      defaultMatchWidth: 'wide',\n      parsePatterns: parseDayPatterns,\n      defaultParseWidth: 'any'\n    }),\n\n    dayPeriod: buildMatchFn({\n      matchPatterns: matchDayPeriodPatterns,\n      defaultMatchWidth: 'any',\n      parsePatterns: parseDayPeriodPatterns,\n      defaultParseWidth: 'any'\n    })\n  };\n\n  /**\n   * @type {Locale}\n   * @category Locales\n   * @summary English locale (United States).\n   * @language English\n   * @iso-639-2 eng\n   * @author Sasha Koss [@kossnocorp]{@link https://github.com/kossnocorp}\n   * @author Lesha Koss [@leshakoss]{@link https://github.com/leshakoss}\n   */\n  var locale = {\n    formatDistance: formatDistance,\n    formatLong: formatLong,\n    formatRelative: formatRelative,\n    localize: localize,\n    match: match,\n    options: {\n      weekStartsOn: 0 /* Sunday */,\n      firstWeekContainsDate: 1\n    }\n  };\n\n  var MILLISECONDS_IN_DAY = 86400000;\n\n  // This function will be a part of public API when UTC function will be implemented.\n  // See issue: https://github.com/date-fns/date-fns/issues/376\n  function getUTCDayOfYear (dirtyDate, dirtyOptions) {\n    if (arguments.length < 1) {\n      throw new TypeError('1 argument required, but only ' + arguments.length + ' present')\n    }\n\n    var date = toDate(dirtyDate, dirtyOptions);\n    var timestamp = date.getTime();\n    date.setUTCMonth(0, 1);\n    date.setUTCHours(0, 0, 0, 0);\n    var startOfYearTimestamp = date.getTime();\n    var difference = timestamp - startOfYearTimestamp;\n    return Math.floor(difference / MILLISECONDS_IN_DAY) + 1\n  }\n\n  // This function will be a part of public API when UTC function will be implemented.\n  // See issue: https://github.com/date-fns/date-fns/issues/376\n  function startOfUTCISOWeek (dirtyDate, dirtyOptions) {\n    if (arguments.length < 1) {\n      throw new TypeError('1 argument required, but only ' + arguments.length + ' present')\n    }\n\n    var weekStartsOn = 1;\n\n    var date = toDate(dirtyDate, dirtyOptions);\n    var day = date.getUTCDay();\n    var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n    date.setUTCDate(date.getUTCDate() - diff);\n    date.setUTCHours(0, 0, 0, 0);\n    return date\n  }\n\n  // This function will be a part of public API when UTC function will be implemented.\n  // See issue: https://github.com/date-fns/date-fns/issues/376\n  function getUTCISOWeekYear (dirtyDate, dirtyOptions) {\n    if (arguments.length < 1) {\n      throw new TypeError('1 argument required, but only ' + arguments.length + ' present')\n    }\n\n    var date = toDate(dirtyDate, dirtyOptions);\n    var year = date.getUTCFullYear();\n\n    var fourthOfJanuaryOfNextYear = new Date(0);\n    fourthOfJanuaryOfNextYear.setUTCFullYear(year + 1, 0, 4);\n    fourthOfJanuaryOfNextYear.setUTCHours(0, 0, 0, 0);\n    var startOfNextYear = startOfUTCISOWeek(fourthOfJanuaryOfNextYear, dirtyOptions);\n\n    var fourthOfJanuaryOfThisYear = new Date(0);\n    fourthOfJanuaryOfThisYear.setUTCFullYear(year, 0, 4);\n    fourthOfJanuaryOfThisYear.setUTCHours(0, 0, 0, 0);\n    var startOfThisYear = startOfUTCISOWeek(fourthOfJanuaryOfThisYear, dirtyOptions);\n\n    if (date.getTime() >= startOfNextYear.getTime()) {\n      return year + 1\n    } else if (date.getTime() >= startOfThisYear.getTime()) {\n      return year\n    } else {\n      return year - 1\n    }\n  }\n\n  // This function will be a part of public API when UTC function will be implemented.\n  // See issue: https://github.com/date-fns/date-fns/issues/376\n  function startOfUTCISOWeekYear (dirtyDate, dirtyOptions) {\n    if (arguments.length < 1) {\n      throw new TypeError('1 argument required, but only ' + arguments.length + ' present')\n    }\n\n    var year = getUTCISOWeekYear(dirtyDate, dirtyOptions);\n    var fourthOfJanuary = new Date(0);\n    fourthOfJanuary.setUTCFullYear(year, 0, 4);\n    fourthOfJanuary.setUTCHours(0, 0, 0, 0);\n    var date = startOfUTCISOWeek(fourthOfJanuary, dirtyOptions);\n    return date\n  }\n\n  var MILLISECONDS_IN_WEEK = 604800000;\n\n  // This function will be a part of public API when UTC function will be implemented.\n  // See issue: https://github.com/date-fns/date-fns/issues/376\n  function getUTCISOWeek (dirtyDate, dirtyOptions) {\n    if (arguments.length < 1) {\n      throw new TypeError('1 argument required, but only ' + arguments.length + ' present')\n    }\n\n    var date = toDate(dirtyDate, dirtyOptions);\n    var diff = startOfUTCISOWeek(date, dirtyOptions).getTime() - startOfUTCISOWeekYear(date, dirtyOptions).getTime();\n\n    // Round the number of days to the nearest integer\n    // because the number of milliseconds in a week is not constant\n    // (e.g. it's different in the week of the daylight saving time clock shift)\n    return Math.round(diff / MILLISECONDS_IN_WEEK) + 1\n  }\n\n  // This function will be a part of public API when UTC function will be implemented.\n  // See issue: https://github.com/date-fns/date-fns/issues/376\n  function startOfUTCWeek (dirtyDate, dirtyOptions) {\n    if (arguments.length < 1) {\n      throw new TypeError('1 argument required, but only ' + arguments.length + ' present')\n    }\n\n    var options = dirtyOptions || {};\n    var locale = options.locale;\n    var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn;\n    var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);\n    var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn);\n\n    // Test if weekStartsOn is between 0 and 6 _and_ is not NaN\n    if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {\n      throw new RangeError('weekStartsOn must be between 0 and 6 inclusively')\n    }\n\n    var date = toDate(dirtyDate, options);\n    var day = date.getUTCDay();\n    var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n    date.setUTCDate(date.getUTCDate() - diff);\n    date.setUTCHours(0, 0, 0, 0);\n    return date\n  }\n\n  // This function will be a part of public API when UTC function will be implemented.\n  // See issue: https://github.com/date-fns/date-fns/issues/376\n  function getUTCWeekYear (dirtyDate, dirtyOptions) {\n    if (arguments.length < 1) {\n      throw new TypeError('1 argument required, but only ' + arguments.length + ' present')\n    }\n\n    var date = toDate(dirtyDate, dirtyOptions);\n    var year = date.getUTCFullYear();\n\n    var options = dirtyOptions || {};\n    var locale = options.locale;\n    var localeFirstWeekContainsDate = locale &&\n      locale.options &&\n      locale.options.firstWeekContainsDate;\n    var defaultFirstWeekContainsDate =\n      localeFirstWeekContainsDate == null\n        ? 1\n        : toInteger(localeFirstWeekContainsDate);\n    var firstWeekContainsDate =\n      options.firstWeekContainsDate == null\n        ? defaultFirstWeekContainsDate\n        : toInteger(options.firstWeekContainsDate);\n\n    // Test if weekStartsOn is between 1 and 7 _and_ is not NaN\n    if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {\n      throw new RangeError('firstWeekContainsDate must be between 1 and 7 inclusively')\n    }\n\n    var firstWeekOfNextYear = new Date(0);\n    firstWeekOfNextYear.setUTCFullYear(year + 1, 0, firstWeekContainsDate);\n    firstWeekOfNextYear.setUTCHours(0, 0, 0, 0);\n    var startOfNextYear = startOfUTCWeek(firstWeekOfNextYear, dirtyOptions);\n\n    var firstWeekOfThisYear = new Date(0);\n    firstWeekOfThisYear.setUTCFullYear(year, 0, firstWeekContainsDate);\n    firstWeekOfThisYear.setUTCHours(0, 0, 0, 0);\n    var startOfThisYear = startOfUTCWeek(firstWeekOfThisYear, dirtyOptions);\n\n    if (date.getTime() >= startOfNextYear.getTime()) {\n      return year + 1\n    } else if (date.getTime() >= startOfThisYear.getTime()) {\n      return year\n    } else {\n      return year - 1\n    }\n  }\n\n  // This function will be a part of public API when UTC function will be implemented.\n  // See issue: https://github.com/date-fns/date-fns/issues/376\n  function startOfUTCWeekYear (dirtyDate, dirtyOptions) {\n    if (arguments.length < 1) {\n      throw new TypeError('1 argument required, but only ' + arguments.length + ' present')\n    }\n\n    var options = dirtyOptions || {};\n    var locale = options.locale;\n    var localeFirstWeekContainsDate = locale &&\n      locale.options &&\n      locale.options.firstWeekContainsDate;\n    var defaultFirstWeekContainsDate =\n      localeFirstWeekContainsDate == null\n        ? 1\n        : toInteger(localeFirstWeekContainsDate);\n    var firstWeekContainsDate =\n      options.firstWeekContainsDate == null\n        ? defaultFirstWeekContainsDate\n        : toInteger(options.firstWeekContainsDate);\n\n    var year = getUTCWeekYear(dirtyDate, dirtyOptions);\n    var firstWeek = new Date(0);\n    firstWeek.setUTCFullYear(year, 0, firstWeekContainsDate);\n    firstWeek.setUTCHours(0, 0, 0, 0);\n    var date = startOfUTCWeek(firstWeek, dirtyOptions);\n    return date\n  }\n\n  var MILLISECONDS_IN_WEEK$1 = 604800000;\n\n  // This function will be a part of public API when UTC function will be implemented.\n  // See issue: https://github.com/date-fns/date-fns/issues/376\n  function getUTCWeek (dirtyDate, dirtyOptions) {\n    if (arguments.length < 1) {\n      throw new TypeError('1 argument required, but only ' + arguments.length + ' present')\n    }\n\n    var date = toDate(dirtyDate, dirtyOptions);\n    var diff = startOfUTCWeek(date, dirtyOptions).getTime() - startOfUTCWeekYear(date, dirtyOptions).getTime();\n\n    // Round the number of days to the nearest integer\n    // because the number of milliseconds in a week is not constant\n    // (e.g. it's different in the week of the daylight saving time clock shift)\n    return Math.round(diff / MILLISECONDS_IN_WEEK$1) + 1\n  }\n\n  var dayPeriodEnum = {\n    am: 'am',\n    pm: 'pm',\n    midnight: 'midnight',\n    noon: 'noon',\n    morning: 'morning',\n    afternoon: 'afternoon',\n    evening: 'evening',\n    night: 'night'\n  };\n\n  /*\n   * |     | Unit                           |     | Unit                           |\n   * |-----|--------------------------------|-----|--------------------------------|\n   * |  a  | AM, PM                         |  A* | Milliseconds in day            |\n   * |  b  | AM, PM, noon, midnight         |  B  | Flexible day period            |\n   * |  c  | Stand-alone local day of week  |  C* | Localized hour w/ day period   |\n   * |  d  | Day of month                   |  D  | Day of year                    |\n   * |  e  | Local day of week              |  E  | Day of week                    |\n   * |  f  |                                |  F* | Day of week in month           |\n   * |  g* | Modified Julian day            |  G  | Era                            |\n   * |  h  | Hour [1-12]                    |  H  | Hour [0-23]                    |\n   * |  i! | ISO day of week                |  I! | ISO week of year               |\n   * |  j* | Localized hour w/ day period   |  J* | Localized hour w/o day period  |\n   * |  k  | Hour [1-24]                    |  K  | Hour [0-11]                    |\n   * |  l* | (deprecated)                   |  L  | Stand-alone month              |\n   * |  m  | Minute                         |  M  | Month                          |\n   * |  n  |                                |  N  |                                |\n   * |  o! | Ordinal number modifier        |  O  | Timezone (GMT)                 |\n   * |  p! | Long localized time            |  P! | Long localized date            |\n   * |  q  | Stand-alone quarter            |  Q  | Quarter                        |\n   * |  r* | Related Gregorian year         |  R! | ISO week-numbering year        |\n   * |  s  | Second                         |  S  | Fraction of second             |\n   * |  t! | Seconds timestamp              |  T! | Milliseconds timestamp         |\n   * |  u  | Extended year                  |  U* | Cyclic year                    |\n   * |  v* | Timezone (generic non-locat.)  |  V* | Timezone (location)            |\n   * |  w  | Local week of year             |  W* | Week of month                  |\n   * |  x  | Timezone (ISO-8601 w/o Z)      |  X  | Timezone (ISO-8601)            |\n   * |  y  | Year (abs)                     |  Y  | Local week-numbering year      |\n   * |  z  | Timezone (specific non-locat.) |  Z* | Timezone (aliases)             |\n   *\n   * Letters marked by * are not implemented but reserved by Unicode standard.\n   *\n   * Letters marked by ! are non-standard, but implemented by date-fns:\n   * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n   * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n   *   i.e. 7 for Sunday, 1 for Monday, etc.\n   * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n   * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n   *   `R` is supposed to be used in conjunction with `I` and `i`\n   *   for universal ISO week-numbering date, whereas\n   *   `Y` is supposed to be used in conjunction with `w` and `e`\n   *   for week-numbering date specific to the locale.\n   * - `P` is long localized date format\n   * - `p` is long localized time format\n   */\n\n  var formatters = {\n    // Era\n    G: function (date, token, localize) {\n      var era = date.getUTCFullYear() > 0 ? 1 : 0;\n      switch (token) {\n        // AD, BC\n        case 'G':\n        case 'GG':\n        case 'GGG':\n          return localize.era(era, {width: 'abbreviated'})\n        // A, B\n        case 'GGGGG':\n          return localize.era(era, {width: 'narrow'})\n        // Anno Domini, Before Christ\n        case 'GGGG':\n        default:\n          return localize.era(era, {width: 'wide'})\n      }\n    },\n\n    // Year\n    y: function (date, token, localize, options) {\n      // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n      // | Year     |     y | yy |   yyy |  yyyy | yyyyy |\n      // |----------|-------|----|-------|-------|-------|\n      // | AD 1     |     1 | 01 |   001 |  0001 | 00001 |\n      // | AD 12    |    12 | 12 |   012 |  0012 | 00012 |\n      // | AD 123   |   123 | 23 |   123 |  0123 | 00123 |\n      // | AD 1234  |  1234 | 34 |  1234 |  1234 | 01234 |\n      // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n      var signedYear = date.getUTCFullYear();\n\n      // Returns 1 for 1 BC (which is year 0 in JavaScript)\n      var year = signedYear > 0 ? signedYear : 1 - signedYear;\n\n      // Two digit year\n      if (token === 'yy') {\n        var twoDigitYear = year % 100;\n        return addLeadingZeros(twoDigitYear, 2)\n      }\n\n      // Ordinal number\n      if (token === 'yo') {\n        return localize.ordinalNumber(year, {unit: 'year'})\n      }\n\n      // Padding\n      return addLeadingZeros(year, token.length)\n    },\n\n    // Local week-numbering year\n    Y: function (date, token, localize, options) {\n      var signedWeekYear = getUTCWeekYear(date, options);\n      var weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n      // Two digit year\n      if (token === 'YY') {\n        var twoDigitYear = weekYear % 100;\n        return addLeadingZeros(twoDigitYear, 2)\n      }\n\n      // Ordinal number\n      if (token === 'Yo') {\n        return localize.ordinalNumber(weekYear, {unit: 'year'})\n      }\n\n      // Padding\n      return addLeadingZeros(weekYear, token.length)\n    },\n\n    // ISO week-numbering year\n    R: function (date, token, localize, options) {\n      var isoWeekYear = getUTCISOWeekYear(date, options);\n\n      // Padding\n      return addLeadingZeros(isoWeekYear, token.length)\n    },\n\n    // Extended year. This is a single number designating the year of this calendar system.\n    // The main difference between `y` and `u` localizers are B.C. years:\n    // | Year | `y` | `u` |\n    // |------|-----|-----|\n    // | AC 1 |   1 |   1 |\n    // | BC 1 |   1 |   0 |\n    // | BC 2 |   2 |  -1 |\n    // Also `yy` always returns the last two digits of a year,\n    // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n    u: function (date, token, localize, options) {\n      var year = date.getUTCFullYear();\n      return addLeadingZeros(year, token.length)\n    },\n\n    // Quarter\n    Q: function (date, token, localize, options) {\n      var quarter = Math.ceil((date.getUTCMonth() + 1) / 3);\n      switch (token) {\n        // 1, 2, 3, 4\n        case 'Q':\n          return String(quarter)\n        // 01, 02, 03, 04\n        case 'QQ':\n          return addLeadingZeros(quarter, 2)\n        // 1st, 2nd, 3rd, 4th\n        case 'Qo':\n          return localize.ordinalNumber(quarter, {unit: 'quarter'})\n        // Q1, Q2, Q3, Q4\n        case 'QQQ':\n          return localize.quarter(quarter, {width: 'abbreviated', context: 'formatting'})\n        // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n        case 'QQQQQ':\n          return localize.quarter(quarter, {width: 'narrow', context: 'formatting'})\n        // 1st quarter, 2nd quarter, ...\n        case 'QQQQ':\n        default:\n          return localize.quarter(quarter, {width: 'wide', context: 'formatting'})\n      }\n    },\n\n    // Stand-alone quarter\n    q: function (date, token, localize, options) {\n      var quarter = Math.ceil((date.getUTCMonth() + 1) / 3);\n      switch (token) {\n        // 1, 2, 3, 4\n        case 'q':\n          return String(quarter)\n        // 01, 02, 03, 04\n        case 'qq':\n          return addLeadingZeros(quarter, 2)\n        // 1st, 2nd, 3rd, 4th\n        case 'qo':\n          return localize.ordinalNumber(quarter, {unit: 'quarter'})\n        // Q1, Q2, Q3, Q4\n        case 'qqq':\n          return localize.quarter(quarter, {width: 'abbreviated', context: 'standalone'})\n        // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n        case 'qqqqq':\n          return localize.quarter(quarter, {width: 'narrow', context: 'standalone'})\n        // 1st quarter, 2nd quarter, ...\n        case 'qqqq':\n        default:\n          return localize.quarter(quarter, {width: 'wide', context: 'standalone'})\n      }\n    },\n\n    // Month\n    M: function (date, token, localize, options) {\n      var month = date.getUTCMonth();\n      switch (token) {\n        // 1, 2, ..., 12\n        case 'M':\n          return String(month + 1)\n        // 01, 02, ..., 12\n        case 'MM':\n          return addLeadingZeros(month + 1, 2)\n        // 1st, 2nd, ..., 12th\n        case 'Mo':\n          return localize.ordinalNumber(month + 1, {unit: 'month'})\n        // Jan, Feb, ..., Dec\n        case 'MMM':\n          return localize.month(month, {width: 'abbreviated', context: 'formatting'})\n        // J, F, ..., D\n        case 'MMMMM':\n          return localize.month(month, {width: 'narrow', context: 'formatting'})\n        // January, February, ..., December\n        case 'MMMM':\n        default:\n          return localize.month(month, {width: 'wide', context: 'formatting'})\n      }\n    },\n\n    // Stand-alone month\n    L: function (date, token, localize, options) {\n      var month = date.getUTCMonth();\n      switch (token) {\n        // 1, 2, ..., 12\n        case 'L':\n          return String(month + 1)\n        // 01, 02, ..., 12\n        case 'LL':\n          return addLeadingZeros(month + 1, 2)\n        // 1st, 2nd, ..., 12th\n        case 'Lo':\n          return localize.ordinalNumber(month + 1, {unit: 'month'})\n        // Jan, Feb, ..., Dec\n        case 'LLL':\n          return localize.month(month, {width: 'abbreviated', context: 'standalone'})\n        // J, F, ..., D\n        case 'LLLLL':\n          return localize.month(month, {width: 'narrow', context: 'standalone'})\n        // January, February, ..., December\n        case 'LLLL':\n        default:\n          return localize.month(month, {width: 'wide', context: 'standalone'})\n      }\n    },\n\n    // Local week of year\n    w: function (date, token, localize, options) {\n      var week = getUTCWeek(date, options);\n\n      if (token === 'wo') {\n        return localize.ordinalNumber(week, {unit: 'week'})\n      }\n\n      return addLeadingZeros(week, token.length)\n    },\n\n    // ISO week of year\n    I: function (date, token, localize, options) {\n      var isoWeek = getUTCISOWeek(date, options);\n\n      if (token === 'Io') {\n        return localize.ordinalNumber(isoWeek, {unit: 'week'})\n      }\n\n      return addLeadingZeros(isoWeek, token.length)\n    },\n\n    // Day of the month\n    d: function (date, token, localize, options) {\n      var dayOfMonth = date.getUTCDate();\n\n      if (token === 'do') {\n        return localize.ordinalNumber(dayOfMonth, {unit: 'date'})\n      }\n\n      return addLeadingZeros(dayOfMonth, token.length)\n    },\n\n    // Day of year\n    D: function (date, token, localize, options) {\n      var dayOfYear = getUTCDayOfYear(date, options);\n\n      if (token === 'Do') {\n        return localize.ordinalNumber(dayOfYear, {unit: 'dayOfYear'})\n      }\n\n      return addLeadingZeros(dayOfYear, token.length)\n    },\n\n    // Day of week\n    E: function (date, token, localize, options) {\n      var dayOfWeek = date.getUTCDay();\n      switch (token) {\n        // Tue\n        case 'E':\n        case 'EE':\n        case 'EEE':\n          return localize.day(dayOfWeek, {width: 'abbreviated', context: 'formatting'})\n        // T\n        case 'EEEEE':\n          return localize.day(dayOfWeek, {width: 'narrow', context: 'formatting'})\n        // Tu\n        case 'EEEEEE':\n          return localize.day(dayOfWeek, {width: 'short', context: 'formatting'})\n        // Tuesday\n        case 'EEEE':\n        default:\n          return localize.day(dayOfWeek, {width: 'wide', context: 'formatting'})\n      }\n    },\n\n    // Local day of week\n    e: function (date, token, localize, options) {\n      var dayOfWeek = date.getUTCDay();\n      var localDayOfWeek = ((dayOfWeek - options.weekStartsOn + 8) % 7) || 7;\n      switch (token) {\n        // Numerical value (Nth day of week with current locale or weekStartsOn)\n        case 'e':\n          return String(localDayOfWeek)\n        // Padded numerical value\n        case 'ee':\n          return addLeadingZeros(localDayOfWeek, 2)\n        // 1st, 2nd, ..., 7th\n        case 'eo':\n          return localize.ordinalNumber(localDayOfWeek, {unit: 'day'})\n        case 'eee':\n          return localize.day(dayOfWeek, {width: 'abbreviated', context: 'formatting'})\n        // T\n        case 'eeeee':\n          return localize.day(dayOfWeek, {width: 'narrow', context: 'formatting'})\n        // Tu\n        case 'eeeeee':\n          return localize.day(dayOfWeek, {width: 'short', context: 'formatting'})\n        // Tuesday\n        case 'eeee':\n        default:\n          return localize.day(dayOfWeek, {width: 'wide', context: 'formatting'})\n      }\n    },\n\n    // Stand-alone local day of week\n    c: function (date, token, localize, options) {\n      var dayOfWeek = date.getUTCDay();\n      var localDayOfWeek = ((dayOfWeek - options.weekStartsOn + 8) % 7) || 7;\n      switch (token) {\n        // Numerical value (same as in `e`)\n        case 'c':\n          return String(localDayOfWeek)\n        // Padded numberical value\n        case 'cc':\n          return addLeadingZeros(localDayOfWeek, token.length)\n        // 1st, 2nd, ..., 7th\n        case 'co':\n          return localize.ordinalNumber(localDayOfWeek, {unit: 'day'})\n        case 'ccc':\n          return localize.day(dayOfWeek, {width: 'abbreviated', context: 'standalone'})\n        // T\n        case 'ccccc':\n          return localize.day(dayOfWeek, {width: 'narrow', context: 'standalone'})\n        // Tu\n        case 'cccccc':\n          return localize.day(dayOfWeek, {width: 'short', context: 'standalone'})\n        // Tuesday\n        case 'cccc':\n        default:\n          return localize.day(dayOfWeek, {width: 'wide', context: 'standalone'})\n      }\n    },\n\n    // ISO day of week\n    i: function (date, token, localize, options) {\n      var dayOfWeek = date.getUTCDay();\n      var isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n      switch (token) {\n        // 2\n        case 'i':\n          return String(isoDayOfWeek)\n        // 02\n        case 'ii':\n          return addLeadingZeros(isoDayOfWeek, token.length)\n        // 2nd\n        case 'io':\n          return localize.ordinalNumber(isoDayOfWeek, {unit: 'day'})\n        // Tue\n        case 'iii':\n          return localize.day(dayOfWeek, {width: 'abbreviated', context: 'formatting'})\n        // T\n        case 'iiiii':\n          return localize.day(dayOfWeek, {width: 'narrow', context: 'formatting'})\n        // Tu\n        case 'iiiiii':\n          return localize.day(dayOfWeek, {width: 'short', context: 'formatting'})\n        // Tuesday\n        case 'iiii':\n        default:\n          return localize.day(dayOfWeek, {width: 'wide', context: 'formatting'})\n      }\n    },\n\n    // AM or PM\n    a: function (date, token, localize) {\n      var hours = date.getUTCHours();\n      var dayPeriodEnumValue = (hours / 12) >= 1 ? 'pm' : 'am';\n\n      switch (token) {\n        case 'a':\n        case 'aa':\n        case 'aaa':\n          return localize.dayPeriod(dayPeriodEnumValue, {width: 'abbreviated', context: 'formatting'})\n        case 'aaaaa':\n          return localize.dayPeriod(dayPeriodEnumValue, {width: 'narrow', context: 'formatting'})\n        case 'aaaa':\n        default:\n          return localize.dayPeriod(dayPeriodEnumValue, {width: 'wide', context: 'formatting'})\n      }\n    },\n\n    // AM, PM, midnight, noon\n    b: function (date, token, localize) {\n      var hours = date.getUTCHours();\n      var dayPeriodEnumValue;\n      if (hours === 12) {\n        dayPeriodEnumValue = dayPeriodEnum.noon;\n      } else if (hours === 0) {\n        dayPeriodEnumValue = dayPeriodEnum.midnight;\n      } else {\n        dayPeriodEnumValue = (hours / 12) >= 1 ? 'pm' : 'am';\n      }\n\n      switch (token) {\n        case 'b':\n        case 'bb':\n        case 'bbb':\n          return localize.dayPeriod(dayPeriodEnumValue, {width: 'abbreviated', context: 'formatting'})\n        case 'bbbbb':\n          return localize.dayPeriod(dayPeriodEnumValue, {width: 'narrow', context: 'formatting'})\n        case 'bbbb':\n        default:\n          return localize.dayPeriod(dayPeriodEnumValue, {width: 'wide', context: 'formatting'})\n      }\n    },\n\n    // in the morning, in the afternoon, in the evening, at night\n    B: function (date, token, localize) {\n      var hours = date.getUTCHours();\n      var dayPeriodEnumValue;\n      if (hours >= 17) {\n        dayPeriodEnumValue = dayPeriodEnum.evening;\n      } else if (hours >= 12) {\n        dayPeriodEnumValue = dayPeriodEnum.afternoon;\n      } else if (hours >= 4) {\n        dayPeriodEnumValue = dayPeriodEnum.morning;\n      } else {\n        dayPeriodEnumValue = dayPeriodEnum.night;\n      }\n\n      switch (token) {\n        case 'B':\n        case 'BB':\n        case 'BBB':\n          return localize.dayPeriod(dayPeriodEnumValue, {width: 'abbreviated', context: 'formatting'})\n        case 'BBBBB':\n          return localize.dayPeriod(dayPeriodEnumValue, {width: 'narrow', context: 'formatting'})\n        case 'BBBB':\n        default:\n          return localize.dayPeriod(dayPeriodEnumValue, {width: 'wide', context: 'formatting'})\n      }\n    },\n\n    // Hour [1-12]\n    h: function (date, token, localize, options) {\n      var hours = date.getUTCHours() % 12;\n\n      if (hours === 0) {\n        hours = 12;\n      }\n\n      if (token === 'ho') {\n        return localize.ordinalNumber(hours, {unit: 'hour'})\n      }\n\n      return addLeadingZeros(hours, token.length)\n    },\n\n    // Hour [0-23]\n    H: function (date, token, localize, options) {\n      var hours = date.getUTCHours();\n\n      if (token === 'Ho') {\n        return localize.ordinalNumber(hours, {unit: 'hour'})\n      }\n\n      return addLeadingZeros(hours, token.length)\n    },\n\n    // Hour [0-11]\n    K: function (date, token, localize, options) {\n      var hours = date.getUTCHours() % 12;\n\n      if (token === 'Ko') {\n        return localize.ordinalNumber(hours, {unit: 'hour'})\n      }\n\n      return addLeadingZeros(hours, token.length)\n    },\n\n    // Hour [1-24]\n    k: function (date, token, localize, options) {\n      var hours = date.getUTCHours();\n\n      if (hours === 0) {\n        hours = 24;\n      }\n\n      if (token === 'ko') {\n        return localize.ordinalNumber(hours, {unit: 'hour'})\n      }\n\n      return addLeadingZeros(hours, token.length)\n    },\n\n    // Minute\n    m: function (date, token, localize, options) {\n      var minutes = date.getUTCMinutes();\n\n      if (token === 'mo') {\n        return localize.ordinalNumber(minutes, {unit: 'minute'})\n      }\n\n      return addLeadingZeros(minutes, token.length)\n    },\n\n    // Second\n    s: function (date, token, localize, options) {\n      var seconds = date.getUTCSeconds();\n\n      if (token === 'so') {\n        return localize.ordinalNumber(seconds, {unit: 'second'})\n      }\n\n      return addLeadingZeros(seconds, token.length)\n    },\n\n    // Fraction of second\n    S: function (date, token, localize, options) {\n      var numberOfDigits = token.length;\n      var milliseconds = date.getUTCMilliseconds();\n      var fractionalSeconds = Math.floor(milliseconds * Math.pow(10, numberOfDigits - 3));\n      return addLeadingZeros(fractionalSeconds, numberOfDigits)\n    },\n\n    // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n    X: function (date, token, localize, options) {\n      var originalDate = options._originalDate || date;\n      var timezoneOffset = originalDate.getTimezoneOffset();\n\n      if (timezoneOffset === 0) {\n        return 'Z'\n      }\n\n      switch (token) {\n        // Hours and optional minutes\n        case 'X':\n          return formatTimezoneWithOptionalMinutes(timezoneOffset)\n\n        // Hours, minutes and optional seconds without `:` delimeter\n        // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n        // so this token always has the same output as `XX`\n        case 'XXXX':\n        case 'XX': // Hours and minutes without `:` delimeter\n          return formatTimezone(timezoneOffset)\n\n        // Hours, minutes and optional seconds with `:` delimeter\n        // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n        // so this token always has the same output as `XXX`\n        case 'XXXXX':\n        case 'XXX': // Hours and minutes with `:` delimeter\n        default:\n          return formatTimezone(timezoneOffset, ':')\n      }\n    },\n\n    // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n    x: function (date, token, localize, options) {\n      var originalDate = options._originalDate || date;\n      var timezoneOffset = originalDate.getTimezoneOffset();\n\n      switch (token) {\n        // Hours and optional minutes\n        case 'x':\n          return formatTimezoneWithOptionalMinutes(timezoneOffset)\n\n        // Hours, minutes and optional seconds without `:` delimeter\n        // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n        // so this token always has the same output as `xx`\n        case 'xxxx':\n        case 'xx': // Hours and minutes without `:` delimeter\n          return formatTimezone(timezoneOffset)\n\n        // Hours, minutes and optional seconds with `:` delimeter\n        // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n        // so this token always has the same output as `xxx`\n        case 'xxxxx':\n        case 'xxx': // Hours and minutes with `:` delimeter\n        default:\n          return formatTimezone(timezoneOffset, ':')\n      }\n    },\n\n    // Timezone (GMT)\n    O: function (date, token, localize, options) {\n      var originalDate = options._originalDate || date;\n      var timezoneOffset = originalDate.getTimezoneOffset();\n\n      switch (token) {\n        // Short\n        case 'O':\n        case 'OO':\n        case 'OOO':\n          return 'GMT' + formatTimezoneShort(timezoneOffset, ':')\n        // Long\n        case 'OOOO':\n        default:\n          return 'GMT' + formatTimezone(timezoneOffset, ':')\n      }\n    },\n\n    // Timezone (specific non-location)\n    z: function (date, token, localize, options) {\n      var originalDate = options._originalDate || date;\n      var timezoneOffset = originalDate.getTimezoneOffset();\n\n      switch (token) {\n        // Short\n        case 'z':\n        case 'zz':\n        case 'zzz':\n          return 'GMT' + formatTimezoneShort(timezoneOffset, ':')\n        // Long\n        case 'zzzz':\n        default:\n          return 'GMT' + formatTimezone(timezoneOffset, ':')\n      }\n    },\n\n    // Seconds timestamp\n    t: function (date, token, localize, options) {\n      var originalDate = options._originalDate || date;\n      var timestamp = Math.floor(originalDate.getTime() / 1000);\n      return addLeadingZeros(timestamp, token.length)\n    },\n\n    // Milliseconds timestamp\n    T: function (date, token, localize, options) {\n      var originalDate = options._originalDate || date;\n      var timestamp = originalDate.getTime();\n      return addLeadingZeros(timestamp, token.length)\n    }\n  };\n\n  function addLeadingZeros (number, targetLength) {\n    var sign = number < 0 ? '-' : '';\n    var output = Math.abs(number).toString();\n    while (output.length < targetLength) {\n      output = '0' + output;\n    }\n    return sign + output\n  }\n\n  function formatTimezone (offset, dirtyDelimeter) {\n    var delimeter = dirtyDelimeter || '';\n    var sign = offset > 0 ? '-' : '+';\n    var absOffset = Math.abs(offset);\n    var hours = addLeadingZeros(Math.floor(absOffset / 60), 2);\n    var minutes = addLeadingZeros(absOffset % 60, 2);\n    return sign + hours + delimeter + minutes\n  }\n\n  function formatTimezoneWithOptionalMinutes (offset, dirtyDelimeter) {\n    if (offset % 60 === 0) {\n      var sign = offset > 0 ? '-' : '+';\n      return sign + addLeadingZeros(Math.abs(offset) / 60, 2)\n    }\n    return formatTimezone(offset, dirtyDelimeter)\n  }\n\n  function formatTimezoneShort (offset, dirtyDelimeter) {\n    var sign = offset > 0 ? '-' : '+';\n    var absOffset = Math.abs(offset);\n    var hours = Math.floor(absOffset / 60);\n    var minutes = absOffset % 60;\n    if (minutes === 0) {\n      return sign + String(hours)\n    }\n    var delimeter = dirtyDelimeter || '';\n    return sign + String(hours) + delimeter + addLeadingZeros(minutes, 2)\n  }\n\n  function dateLongFormatter (pattern, formatLong, options) {\n    switch (pattern) {\n      case 'P':\n        return formatLong.date({width: 'short'})\n      case 'PP':\n        return formatLong.date({width: 'medium'})\n      case 'PPP':\n        return formatLong.date({width: 'long'})\n      case 'PPPP':\n      default:\n        return formatLong.date({width: 'full'})\n    }\n  }\n\n  function timeLongFormatter (pattern, formatLong, options) {\n    switch (pattern) {\n      case 'p':\n        return formatLong.time({width: 'short'})\n      case 'pp':\n        return formatLong.time({width: 'medium'})\n      case 'ppp':\n        return formatLong.time({width: 'long'})\n      case 'pppp':\n      default:\n        return formatLong.time({width: 'full'})\n    }\n  }\n\n  function dateTimeLongFormatter (pattern, formatLong, options) {\n    var matchResult = pattern.match(/(P+)(p+)?/);\n    var datePattern = matchResult[1];\n    var timePattern = matchResult[2];\n\n    if (!timePattern) {\n      return dateLongFormatter(pattern, formatLong)\n    }\n\n    var dateTimeFormat;\n\n    switch (datePattern) {\n      case 'P':\n        dateTimeFormat = formatLong.dateTime({width: 'short'});\n        break\n      case 'PP':\n        dateTimeFormat = formatLong.dateTime({width: 'medium'});\n        break\n      case 'PPP':\n        dateTimeFormat = formatLong.dateTime({width: 'long'});\n        break\n      case 'PPPP':\n      default:\n        dateTimeFormat = formatLong.dateTime({width: 'full'});\n        break\n    }\n\n    return dateTimeFormat\n      .replace('{{date}}', dateLongFormatter(datePattern, formatLong))\n      .replace('{{time}}', timeLongFormatter(timePattern, formatLong))\n  }\n\n  var longFormatters = {\n    p: timeLongFormatter,\n    P: dateTimeLongFormatter\n  };\n\n  /**\n   * @name subMilliseconds\n   * @category Millisecond Helpers\n   * @summary Subtract the specified number of milliseconds from the given date.\n   *\n   * @description\n   * Subtract the specified number of milliseconds from the given date.\n   *\n   * @param {Date|String|Number} date - the date to be changed\n   * @param {Number} amount - the amount of milliseconds to be subtracted\n   * @param {Options} [options] - the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n   * @param {0|1|2} [options.additionalDigits=2] - passed to `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate}\n   * @returns {Date} the new date with the milliseconds subtracted\n   * @throws {TypeError} 2 arguments required\n   * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n   *\n   * @example\n   * // Subtract 750 milliseconds from 10 July 2014 12:45:30.000:\n   * var result = subMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)\n   * //=> Thu Jul 10 2014 12:45:29.250\n   */\n  function subMilliseconds (dirtyDate, dirtyAmount, dirtyOptions) {\n    if (arguments.length < 2) {\n      throw new TypeError('2 arguments required, but only ' + arguments.length + ' present')\n    }\n\n    var amount = toInteger(dirtyAmount);\n    return addMilliseconds(dirtyDate, -amount, dirtyOptions)\n  }\n\n  var protectedTokens = ['D', 'DD', 'YY', 'YYYY'];\n\n  function isProtectedToken(token) {\n    return protectedTokens.indexOf(token) !== -1\n  }\n\n  function throwProtectedError(token) {\n    throw new RangeError(\n      '`options.awareOfUnicodeTokens` must be set to `true` to use `' +\n        token +\n        '` token; see: https://git.io/fxCyr'\n    )\n  }\n\n  // This RegExp consists of three parts separated by `|`:\n  // - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n  //   (one of the certain letters followed by `o`)\n  // - (\\w)\\1* matches any sequences of the same letter\n  // - '' matches two quote characters in a row\n  // - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n  //   except a single quote symbol, which ends the sequence.\n  //   Two quote characters do not end the sequence.\n  //   If there is no matching single quote\n  //   then the sequence will continue until the end of the string.\n  // - . matches any single character unmatched by previous parts of the RegExps\n  var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n  // This RegExp catches symbols escaped by quotes, and also\n  // sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\n  var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\n  var escapedStringRegExp = /^'(.*?)'?$/;\n  var doubleQuoteRegExp = /''/g;\n\n  /**\n   * @name format\n   * @category Common Helpers\n   * @summary Format the date.\n   *\n   * @description\n   * Return the formatted date string in the given format. The result may vary by locale.\n   *\n   * > âš ï¸� Please note that the `format` tokens differ from Moment.js and other libraries.\n   * > See: https://git.io/fxCyr\n   *\n   * The characters wrapped between two single quotes characters (') are escaped.\n   * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n   * (see the last example)\n   *\n   * Format of the string is based on Unicode Technical Standard #35:\n   * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n   * with a few additions (see note 7 below the table).\n   *\n   * Accepted patterns:\n   * | Unit                            | Pattern | Result examples                   | Notes |\n   * |---------------------------------|---------|-----------------------------------|-------|\n   * | Era                             | G..GGG  | AD, BC                            |       |\n   * |                                 | GGGG    | Anno Domini, Before Christ        | 2     |\n   * |                                 | GGGGG   | A, B                              |       |\n   * | Calendar year                   | y       | 44, 1, 1900, 2017                 | 5     |\n   * |                                 | yo      | 44th, 1st, 0th, 17th              | 5,7   |\n   * |                                 | yy      | 44, 01, 00, 17                    | 5     |\n   * |                                 | yyy     | 044, 001, 1900, 2017              | 5     |\n   * |                                 | yyyy    | 0044, 0001, 1900, 2017            | 5     |\n   * |                                 | yyyyy   | ...                               | 3,5   |\n   * | Local week-numbering year       | Y       | 44, 1, 1900, 2017                 | 5     |\n   * |                                 | Yo      | 44th, 1st, 1900th, 2017th         | 5,7   |\n   * |                                 | YY      | 44, 01, 00, 17                    | 5,8   |\n   * |                                 | YYY     | 044, 001, 1900, 2017              | 5     |\n   * |                                 | YYYY    | 0044, 0001, 1900, 2017            | 5,8   |\n   * |                                 | YYYYY   | ...                               | 3,5   |\n   * | ISO week-numbering year         | R       | -43, 0, 1, 1900, 2017             | 5,7   |\n   * |                                 | RR      | -43, 00, 01, 1900, 2017           | 5,7   |\n   * |                                 | RRR     | -043, 000, 001, 1900, 2017        | 5,7   |\n   * |                                 | RRRR    | -0043, 0000, 0001, 1900, 2017     | 5,7   |\n   * |                                 | RRRRR   | ...                               | 3,5,7 |\n   * | Extended year                   | u       | -43, 0, 1, 1900, 2017             | 5     |\n   * |                                 | uu      | -43, 01, 1900, 2017               | 5     |\n   * |                                 | uuu     | -043, 001, 1900, 2017             | 5     |\n   * |                                 | uuuu    | -0043, 0001, 1900, 2017           | 5     |\n   * |                                 | uuuuu   | ...                               | 3,5   |\n   * | Quarter (formatting)            | Q       | 1, 2, 3, 4                        |       |\n   * |                                 | Qo      | 1st, 2nd, 3rd, 4th                | 7     |\n   * |                                 | QQ      | 01, 02, 03, 04                    |       |\n   * |                                 | QQQ     | Q1, Q2, Q3, Q4                    |       |\n   * |                                 | QQQQ    | 1st quarter, 2nd quarter, ...     | 2     |\n   * |                                 | QQQQQ   | 1, 2, 3, 4                        | 4     |\n   * | Quarter (stand-alone)           | q       | 1, 2, 3, 4                        |       |\n   * |                                 | qo      | 1st, 2nd, 3rd, 4th                | 7     |\n   * |                                 | qq      | 01, 02, 03, 04                    |       |\n   * |                                 | qqq     | Q1, Q2, Q3, Q4                    |       |\n   * |                                 | qqqq    | 1st quarter, 2nd quarter, ...     | 2     |\n   * |                                 | qqqqq   | 1, 2, 3, 4                        | 4     |\n   * | Month (formatting)              | M       | 1, 2, ..., 12                     |       |\n   * |                                 | Mo      | 1st, 2nd, ..., 12th               | 7     |\n   * |                                 | MM      | 01, 02, ..., 12                   |       |\n   * |                                 | MMM     | Jan, Feb, ..., Dec                |       |\n   * |                                 | MMMM    | January, February, ..., December  | 2     |\n   * |                                 | MMMMM   | J, F, ..., D                      |       |\n   * | Month (stand-alone)             | L       | 1, 2, ..., 12                     |       |\n   * |                                 | Lo      | 1st, 2nd, ..., 12th               | 7     |\n   * |                                 | LL      | 01, 02, ..., 12                   |       |\n   * |                                 | LLL     | Jan, Feb, ..., Dec                |       |\n   * |                                 | LLLL    | January, February, ..., December  | 2     |\n   * |                                 | LLLLL   | J, F, ..., D                      |       |\n   * | Local week of year              | w       | 1, 2, ..., 53                     |       |\n   * |                                 | wo      | 1st, 2nd, ..., 53th               | 7     |\n   * |                                 | ww      | 01, 02, ..., 53                   |       |\n   * | ISO week of year                | I       | 1, 2, ..., 53                     | 7     |\n   * |                                 | Io      | 1st, 2nd, ..., 53th               | 7     |\n   * |                                 | II      | 01, 02, ..., 53                   | 7     |\n   * | Day of month                    | d       | 1, 2, ..., 31                     |       |\n   * |                                 | do      | 1st, 2nd, ..., 31st               | 7     |\n   * |                                 | dd      | 01, 02, ..., 31                   |       |\n   * | Day of year                     | D       | 1, 2, ..., 365, 366               | 8     |\n   * |                                 | Do      | 1st, 2nd, ..., 365th, 366th       | 7     |\n   * |                                 | DD      | 01, 02, ..., 365, 366             | 8     |\n   * |                                 | DDD     | 001, 002, ..., 365, 366           |       |\n   * |                                 | DDDD    | ...                               | 3     |\n   * | Day of week (formatting)        | E..EEE  | Mon, Tue, Wed, ..., Su            |       |\n   * |                                 | EEEE    | Monday, Tuesday, ..., Sunday      | 2     |\n   * |                                 | EEEEE   | M, T, W, T, F, S, S               |       |\n   * |                                 | EEEEEE  | Mo, Tu, We, Th, Fr, Su, Sa        |       |\n   * | ISO day of week (formatting)    | i       | 1, 2, 3, ..., 7                   | 7     |\n   * |                                 | io      | 1st, 2nd, ..., 7th                | 7     |\n   * |                                 | ii      | 01, 02, ..., 07                   | 7     |\n   * |                                 | iii     | Mon, Tue, Wed, ..., Su            | 7     |\n   * |                                 | iiii    | Monday, Tuesday, ..., Sunday      | 2,7   |\n   * |                                 | iiiii   | M, T, W, T, F, S, S               | 7     |\n   * |                                 | iiiiii  | Mo, Tu, We, Th, Fr, Su, Sa        | 7     |\n   * | Local day of week (formatting)  | e       | 2, 3, 4, ..., 1                   |       |\n   * |                                 | eo      | 2nd, 3rd, ..., 1st                | 7     |\n   * |                                 | ee      | 02, 03, ..., 01                   |       |\n   * |                                 | eee     | Mon, Tue, Wed, ..., Su            |       |\n   * |                                 | eeee    | Monday, Tuesday, ..., Sunday      | 2     |\n   * |                                 | eeeee   | M, T, W, T, F, S, S               |       |\n   * |                                 | eeeeee  | Mo, Tu, We, Th, Fr, Su, Sa        |       |\n   * | Local day of week (stand-alone) | c       | 2, 3, 4, ..., 1                   |       |\n   * |                                 | co      | 2nd, 3rd, ..., 1st                | 7     |\n   * |                                 | cc      | 02, 03, ..., 01                   |       |\n   * |                                 | ccc     | Mon, Tue, Wed, ..., Su            |       |\n   * |                                 | cccc    | Monday, Tuesday, ..., Sunday      | 2     |\n   * |                                 | ccccc   | M, T, W, T, F, S, S               |       |\n   * |                                 | cccccc  | Mo, Tu, We, Th, Fr, Su, Sa        |       |\n   * | AM, PM                          | a..aaa  | AM, PM                            |       |\n   * |                                 | aaaa    | a.m., p.m.                        | 2     |\n   * |                                 | aaaaa   | a, p                              |       |\n   * | AM, PM, noon, midnight          | b..bbb  | AM, PM, noon, midnight            |       |\n   * |                                 | bbbb    | a.m., p.m., noon, midnight        | 2     |\n   * |                                 | bbbbb   | a, p, n, mi                       |       |\n   * | Flexible day period             | B..BBB  | at night, in the morning, ...     |       |\n   * |                                 | BBBB    | at night, in the morning, ...     | 2     |\n   * |                                 | BBBBB   | at night, in the morning, ...     |       |\n   * | Hour [1-12]                     | h       | 1, 2, ..., 11, 12                 |       |\n   * |                                 | ho      | 1st, 2nd, ..., 11th, 12th         | 7     |\n   * |                                 | hh      | 01, 02, ..., 11, 12               |       |\n   * | Hour [0-23]                     | H       | 0, 1, 2, ..., 23                  |       |\n   * |                                 | Ho      | 0th, 1st, 2nd, ..., 23rd          | 7     |\n   * |                                 | HH      | 00, 01, 02, ..., 23               |       |\n   * | Hour [0-11]                     | K       | 1, 2, ..., 11, 0                  |       |\n   * |                                 | Ko      | 1st, 2nd, ..., 11th, 0th          | 7     |\n   * |                                 | KK      | 1, 2, ..., 11, 0                  |       |\n   * | Hour [1-24]                     | k       | 24, 1, 2, ..., 23                 |       |\n   * |                                 | ko      | 24th, 1st, 2nd, ..., 23rd         | 7     |\n   * |                                 | kk      | 24, 01, 02, ..., 23               |       |\n   * | Minute                          | m       | 0, 1, ..., 59                     |       |\n   * |                                 | mo      | 0th, 1st, ..., 59th               | 7     |\n   * |                                 | mm      | 00, 01, ..., 59                   |       |\n   * | Second                          | s       | 0, 1, ..., 59                     |       |\n   * |                                 | so      | 0th, 1st, ..., 59th               | 7     |\n   * |                                 | ss      | 00, 01, ..., 59                   |       |\n   * | Fraction of second              | S       | 0, 1, ..., 9                      |       |\n   * |                                 | SS      | 00, 01, ..., 99                   |       |\n   * |                                 | SSS     | 000, 0001, ..., 999               |       |\n   * |                                 | SSSS    | ...                               | 3     |\n   * | Timezone (ISO-8601 w/ Z)        | X       | -08, +0530, Z                     |       |\n   * |                                 | XX      | -0800, +0530, Z                   |       |\n   * |                                 | XXX     | -08:00, +05:30, Z                 |       |\n   * |                                 | XXXX    | -0800, +0530, Z, +123456          | 2     |\n   * |                                 | XXXXX   | -08:00, +05:30, Z, +12:34:56      |       |\n   * | Timezone (ISO-8601 w/o Z)       | x       | -08, +0530, +00                   |       |\n   * |                                 | xx      | -0800, +0530, +0000               |       |\n   * |                                 | xxx     | -08:00, +05:30, +00:00            | 2     |\n   * |                                 | xxxx    | -0800, +0530, +0000, +123456      |       |\n   * |                                 | xxxxx   | -08:00, +05:30, +00:00, +12:34:56 |       |\n   * | Timezone (GMT)                  | O...OOO | GMT-8, GMT+5:30, GMT+0            |       |\n   * |                                 | OOOO    | GMT-08:00, GMT+05:30, GMT+00:00   | 2     |\n   * | Timezone (specific non-locat.)  | z...zzz | GMT-8, GMT+5:30, GMT+0            | 6     |\n   * |                                 | zzzz    | GMT-08:00, GMT+05:30, GMT+00:00   | 2,6   |\n   * | Seconds timestamp               | t       | 512969520                         | 7     |\n   * |                                 | tt      | ...                               | 3,7   |\n   * | Milliseconds timestamp          | T       | 512969520900                      | 7     |\n   * |                                 | TT      | ...                               | 3,7   |\n   * | Long localized date             | P       | 05/29/1453                        | 7     |\n   * |                                 | PP      | May 29, 1453                      | 7     |\n   * |                                 | PPP     | May 29th, 1453                    | 7     |\n   * |                                 | PPPP    | Sunday, May 29th, 1453            | 2,7   |\n   * | Long localized time             | p       | 12:00 AM                          | 7     |\n   * |                                 | pp      | 12:00:00 AM                       | 7     |\n   * |                                 | ppp     | 12:00:00 AM GMT+2                 | 7     |\n   * |                                 | pppp    | 12:00:00 AM GMT+02:00             | 2,7   |\n   * | Combination of date and time    | Pp      | 05/29/1453, 12:00 AM              | 7     |\n   * |                                 | PPpp    | May 29, 1453, 12:00:00 AM         | 7     |\n   * |                                 | PPPppp  | May 29th, 1453 at ...             | 7     |\n   * |                                 | PPPPpppp| Sunday, May 29th, 1453 at ...     | 2,7   |\n   * Notes:\n   * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n   *    are the same as \"stand-alone\" units, but are different in some languages.\n   *    \"Formatting\" units are declined according to the rules of the language\n   *    in the context of a date. \"Stand-alone\" units are always nominative singular:\n   *\n   *    `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n   *\n   *    `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n   *\n   * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n   *    the single quote characters (see below).\n   *    If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n   *    the output will be the same as default pattern for this unit, usually\n   *    the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n   *    are marked with \"2\" in the last column of the table.\n   *\n   *    `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n   *\n   *    `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n   *\n   *    `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n   *\n   *    `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n   *\n   *    `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n   *\n   * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n   *    The output will be padded with zeros to match the length of the pattern.\n   *\n   *    `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n   *\n   * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n   *    These tokens represent the shortest form of the quarter.\n   *\n   * 5. The main difference between `y` and `u` patterns are B.C. years:\n   *\n   *    | Year | `y` | `u` |\n   *    |------|-----|-----|\n   *    | AC 1 |   1 |   1 |\n   *    | BC 1 |   1 |   0 |\n   *    | BC 2 |   2 |  -1 |\n   *\n   *    Also `yy` always returns the last two digits of a year,\n   *    while `uu` pads single digit years to 2 characters and returns other years unchanged:\n   *\n   *    | Year | `yy` | `uu` |\n   *    |------|------|------|\n   *    | 1    |   01 |   01 |\n   *    | 14   |   14 |   14 |\n   *    | 376  |   76 |  376 |\n   *    | 1453 |   53 | 1453 |\n   *\n   *    The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n   *    except local week-numbering years are dependent on `options.weekStartsOn`\n   *    and `options.firstWeekContainsDate` (compare [getISOWeekYear]{@link https://date-fns.org/docs/getISOWeekYear}\n   *    and [getWeekYear]{@link https://date-fns.org/docs/getWeekYear}).\n   *\n   * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n   *    so right now these tokens fall back to GMT timezones.\n   *\n   * 7. These patterns are not in the Unicode Technical Standard #35:\n   *    - `i`: ISO day of week\n   *    - `I`: ISO week of year\n   *    - `R`: ISO week-numbering year\n   *    - `t`: seconds timestamp\n   *    - `T`: milliseconds timestamp\n   *    - `o`: ordinal number modifier\n   *    - `P`: long localized date\n   *    - `p`: long localized time\n   *\n   * 8. These tokens are often confused with others. See: https://git.io/fxCyr\n   *\n   * @param {Date|String|Number} date - the original date\n   * @param {String} format - the string of tokens\n   * @param {Options} [options] - the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n   * @param {0|1|2} [options.additionalDigits=2] - passed to `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate}\n   * @param {0|1|2|3|4|5|6} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday)\n   * @param {Number} [options.firstWeekContainsDate=1] - the day of January, which is\n   * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n   * @param {Boolean} [options.awareOfUnicodeTokens=false] - if true, allows usage of Unicode tokens causes confusion:\n   *   - Some of the day of year tokens (`D`, `DD`) that are confused with the day of month tokens (`d`, `dd`).\n   *   - Some of the local week-numbering year tokens (`YY`, `YYYY`) that are confused with the calendar year tokens (`yy`, `yyyy`).\n   *   See: https://git.io/fxCyr\n   * @returns {String} the formatted date string\n   * @throws {TypeError} 2 arguments required\n   * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n   * @throws {RangeError} `options.locale` must contain `localize` property\n   * @throws {RangeError} `options.locale` must contain `formatLong` property\n   * @throws {RangeError} `options.weekStartsOn` must be between 0 and 6\n   * @throws {RangeError} `options.firstWeekContainsDate` must be between 1 and 7\n   * @throws {RangeError} `options.awareOfUnicodeTokens` must be set to `true` to use `XX` token; see: https://git.io/fxCyr\n   *\n   * @example\n   * // Represent 11 February 2014 in middle-endian format:\n   * var result = format(\n   *   new Date(2014, 1, 11),\n   *   'MM/dd/yyyy'\n   * )\n   * //=> '02/11/2014'\n   *\n   * @example\n   * // Represent 2 July 2014 in Esperanto:\n   * import { eoLocale } from 'date-fns/locale/eo'\n   * var result = format(\n   *   new Date(2014, 6, 2),\n   *   \"do 'de' MMMM yyyy\",\n   *   {locale: eoLocale}\n   * )\n   * //=> '2-a de julio 2014'\n   *\n   * @example\n   * // Escape string by single quote characters:\n   * var result = format(\n   *   new Date(2014, 6, 2, 15),\n   *   \"h 'o''clock'\"\n   * )\n   * //=> \"3 o'clock\"\n   */\n  function format(dirtyDate, dirtyFormatStr, dirtyOptions) {\n    if (arguments.length < 2) {\n      throw new TypeError(\n        '2 arguments required, but only ' + arguments.length + ' present'\n      )\n    }\n\n    var formatStr = String(dirtyFormatStr);\n    var options = dirtyOptions || {};\n\n    var locale$1 = options.locale || locale;\n\n    var localeFirstWeekContainsDate =\n      locale$1.options && locale$1.options.firstWeekContainsDate;\n    var defaultFirstWeekContainsDate =\n      localeFirstWeekContainsDate == null\n        ? 1\n        : toInteger(localeFirstWeekContainsDate);\n    var firstWeekContainsDate =\n      options.firstWeekContainsDate == null\n        ? defaultFirstWeekContainsDate\n        : toInteger(options.firstWeekContainsDate);\n\n    // Test if weekStartsOn is between 1 and 7 _and_ is not NaN\n    if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {\n      throw new RangeError(\n        'firstWeekContainsDate must be between 1 and 7 inclusively'\n      )\n    }\n\n    var localeWeekStartsOn = locale$1.options && locale$1.options.weekStartsOn;\n    var defaultWeekStartsOn =\n      localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);\n    var weekStartsOn =\n      options.weekStartsOn == null\n        ? defaultWeekStartsOn\n        : toInteger(options.weekStartsOn);\n\n    // Test if weekStartsOn is between 0 and 6 _and_ is not NaN\n    if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {\n      throw new RangeError('weekStartsOn must be between 0 and 6 inclusively')\n    }\n\n    if (!locale$1.localize) {\n      throw new RangeError('locale must contain localize property')\n    }\n\n    if (!locale$1.formatLong) {\n      throw new RangeError('locale must contain formatLong property')\n    }\n\n    var originalDate = toDate(dirtyDate, options);\n\n    if (!isValid(originalDate, options)) {\n      return 'Invalid Date'\n    }\n\n    // Convert the date in system timezone to the same date in UTC+00:00 timezone.\n    // This ensures that when UTC functions will be implemented, locales will be compatible with them.\n    // See an issue about UTC functions: https://github.com/date-fns/date-fns/issues/376\n    var timezoneOffset = getTimezoneOffsetInMilliseconds(originalDate);\n    var utcDate = subMilliseconds(originalDate, timezoneOffset, options);\n\n    var formatterOptions = {\n      firstWeekContainsDate: firstWeekContainsDate,\n      weekStartsOn: weekStartsOn,\n      locale: locale$1,\n      _originalDate: originalDate\n    };\n\n    var result = formatStr\n      .match(longFormattingTokensRegExp)\n      .map(function(substring) {\n        var firstCharacter = substring[0];\n        if (firstCharacter === 'p' || firstCharacter === 'P') {\n          var longFormatter = longFormatters[firstCharacter];\n          return longFormatter(substring, locale$1.formatLong, formatterOptions)\n        }\n        return substring\n      })\n      .join('')\n      .match(formattingTokensRegExp)\n      .map(function(substring) {\n        // Replace two single quote characters with one single quote character\n        if (substring === \"''\") {\n          return \"'\"\n        }\n\n        var firstCharacter = substring[0];\n        if (firstCharacter === \"'\") {\n          return cleanEscapedString(substring)\n        }\n\n        var formatter = formatters[firstCharacter];\n        if (formatter) {\n          if (!options.awareOfUnicodeTokens && isProtectedToken(substring)) {\n            throwProtectedError(substring);\n          }\n          return formatter(utcDate, substring, locale$1.localize, formatterOptions)\n        }\n\n        return substring\n      })\n      .join('');\n\n    return result\n  }\n\n  function cleanEscapedString(input) {\n    return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, \"'\")\n  }\n\n  /**\n   * @name isAfter\n   * @category Common Helpers\n   * @summary Is the first date after the second one?\n   *\n   * @description\n   * Is the first date after the second one?\n   *\n   * @param {Date|String|Number} date - the date that should be after the other one to return true\n   * @param {Date|String|Number} dateToCompare - the date to compare with\n   * @param {Options} [options] - the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n   * @param {0|1|2} [options.additionalDigits=2] - passed to `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate}\n   * @returns {Boolean} the first date is after the second date\n   * @throws {TypeError} 2 arguments required\n   * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n   *\n   * @example\n   * // Is 10 July 1989 after 11 February 1987?\n   * var result = isAfter(new Date(1989, 6, 10), new Date(1987, 1, 11))\n   * //=> true\n   */\n  function isAfter (dirtyDate, dirtyDateToCompare, dirtyOptions) {\n    if (arguments.length < 2) {\n      throw new TypeError('2 arguments required, but only ' + arguments.length + ' present')\n    }\n\n    var date = toDate(dirtyDate, dirtyOptions);\n    var dateToCompare = toDate(dirtyDateToCompare, dirtyOptions);\n    return date.getTime() > dateToCompare.getTime()\n  }\n\n  /**\n   * @name isBefore\n   * @category Common Helpers\n   * @summary Is the first date before the second one?\n   *\n   * @description\n   * Is the first date before the second one?\n   *\n   * @param {Date|String|Number} date - the date that should be before the other one to return true\n   * @param {Date|String|Number} dateToCompare - the date to compare with\n   * @param {Options} [options] - the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n   * @param {0|1|2} [options.additionalDigits=2] - passed to `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate}\n   * @returns {Boolean} the first date is before the second date\n   * @throws {TypeError} 2 arguments required\n   * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n   *\n   * @example\n   * // Is 10 July 1989 before 11 February 1987?\n   * var result = isBefore(new Date(1989, 6, 10), new Date(1987, 1, 11))\n   * //=> false\n   */\n  function isBefore (dirtyDate, dirtyDateToCompare, dirtyOptions) {\n    if (arguments.length < 2) {\n      throw new TypeError('2 arguments required, but only ' + arguments.length + ' present')\n    }\n\n    var date = toDate(dirtyDate, dirtyOptions);\n    var dateToCompare = toDate(dirtyDateToCompare, dirtyOptions);\n    return date.getTime() < dateToCompare.getTime()\n  }\n\n  /**\n   * @name isEqual\n   * @category Common Helpers\n   * @summary Are the given dates equal?\n   *\n   * @description\n   * Are the given dates equal?\n   *\n   * @param {Date|String|Number} dateLeft - the first date to compare\n   * @param {Date|String|Number} dateRight - the second date to compare\n   * @param {Options} [options] - the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n   * @param {0|1|2} [options.additionalDigits=2] - passed to `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate}\n   * @returns {Boolean} the dates are equal\n   * @throws {TypeError} 2 arguments required\n   * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n   *\n   * @example\n   * // Are 2 July 2014 06:30:45.000 and 2 July 2014 06:30:45.500 equal?\n   * var result = isEqual(\n   *   new Date(2014, 6, 2, 6, 30, 45, 0)\n   *   new Date(2014, 6, 2, 6, 30, 45, 500)\n   * )\n   * //=> false\n   */\n  function isEqual (dirtyLeftDate, dirtyRightDate, dirtyOptions) {\n    if (arguments.length < 2) {\n      throw new TypeError('2 arguments required, but only ' + arguments.length + ' present')\n    }\n\n    var dateLeft = toDate(dirtyLeftDate, dirtyOptions);\n    var dateRight = toDate(dirtyRightDate, dirtyOptions);\n    return dateLeft.getTime() === dateRight.getTime()\n  }\n\n  // This function will be a part of public API when UTC function will be implemented.\n  // See issue: https://github.com/date-fns/date-fns/issues/376\n  function setUTCDay (dirtyDate, dirtyDay, dirtyOptions) {\n    if (arguments.length < 2) {\n      throw new TypeError('2 arguments required, but only ' + arguments.length + ' present')\n    }\n\n    var options = dirtyOptions || {};\n    var locale = options.locale;\n    var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn;\n    var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);\n    var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn);\n\n    // Test if weekStartsOn is between 0 and 6 _and_ is not NaN\n    if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {\n      throw new RangeError('weekStartsOn must be between 0 and 6 inclusively')\n    }\n\n    var date = toDate(dirtyDate, dirtyOptions);\n    var day = toInteger(dirtyDay);\n\n    var currentDay = date.getUTCDay();\n\n    var remainder = day % 7;\n    var dayIndex = (remainder + 7) % 7;\n\n    var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay;\n\n    date.setUTCDate(date.getUTCDate() + diff);\n    return date\n  }\n\n  // This function will be a part of public API when UTC function will be implemented.\n  // See issue: https://github.com/date-fns/date-fns/issues/376\n  function setUTCWeek (dirtyDate, dirtyWeek, dirtyOptions) {\n    if (arguments.length < 2) {\n      throw new TypeError('2 arguments required, but only ' + arguments.length + ' present')\n    }\n\n    var date = toDate(dirtyDate, dirtyOptions);\n    var week = toInteger(dirtyWeek);\n    var diff = getUTCWeek(date, dirtyOptions) - week;\n    date.setUTCDate(date.getUTCDate() - diff * 7);\n    return date\n  }\n\n  // This function will be a part of public API when UTC function will be implemented.\n  // See issue: https://github.com/date-fns/date-fns/issues/376\n  function setUTCISODay (dirtyDate, dirtyDay, dirtyOptions) {\n    if (arguments.length < 2) {\n      throw new TypeError('2 arguments required, but only ' + arguments.length + ' present')\n    }\n\n    var day = toInteger(dirtyDay);\n\n    if (day % 7 === 0) {\n      day = day - 7;\n    }\n\n    var weekStartsOn = 1;\n    var date = toDate(dirtyDate, dirtyOptions);\n    var currentDay = date.getUTCDay();\n\n    var remainder = day % 7;\n    var dayIndex = (remainder + 7) % 7;\n\n    var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay;\n\n    date.setUTCDate(date.getUTCDate() + diff);\n    return date\n  }\n\n  // This function will be a part of public API when UTC function will be implemented.\n  // See issue: https://github.com/date-fns/date-fns/issues/376\n  function setUTCISOWeek (dirtyDate, dirtyISOWeek, dirtyOptions) {\n    if (arguments.length < 2) {\n      throw new TypeError('2 arguments required, but only ' + arguments.length + ' present')\n    }\n\n    var date = toDate(dirtyDate, dirtyOptions);\n    var isoWeek = toInteger(dirtyISOWeek);\n    var diff = getUTCISOWeek(date, dirtyOptions) - isoWeek;\n    date.setUTCDate(date.getUTCDate() - diff * 7);\n    return date\n  }\n\n  var MILLISECONDS_IN_HOUR$1 = 3600000;\n  var MILLISECONDS_IN_MINUTE$2 = 60000;\n  var MILLISECONDS_IN_SECOND = 1000;\n\n  var numericPatterns = {\n    month: /^(1[0-2]|0?\\d)/, // 0 to 12\n    date: /^(3[0-1]|[0-2]?\\d)/, // 0 to 31\n    dayOfYear: /^(36[0-6]|3[0-5]\\d|[0-2]?\\d?\\d)/, // 0 to 366\n    week: /^(5[0-3]|[0-4]?\\d)/, // 0 to 53\n    hour23h: /^(2[0-3]|[0-1]?\\d)/, // 0 to 23\n    hour24h: /^(2[0-4]|[0-1]?\\d)/, // 0 to 24\n    hour11h: /^(1[0-1]|0?\\d)/, // 0 to 11\n    hour12h: /^(1[0-2]|0?\\d)/, // 0 to 12\n    minute: /^[0-5]?\\d/, // 0 to 59\n    second: /^[0-5]?\\d/, // 0 to 59\n\n    singleDigit: /^\\d/, // 0 to 9\n    twoDigits: /^\\d{1,2}/, // 0 to 99\n    threeDigits: /^\\d{1,3}/, // 0 to 999\n    fourDigits: /^\\d{1,4}/, // 0 to 9999\n\n    anyDigitsSigned: /^-?\\d+/,\n    singleDigitSigned: /^-?\\d/, // 0 to 9, -0 to -9\n    twoDigitsSigned: /^-?\\d{1,2}/, // 0 to 99, -0 to -99\n    threeDigitsSigned: /^-?\\d{1,3}/, // 0 to 999, -0 to -999\n    fourDigitsSigned: /^-?\\d{1,4}/ // 0 to 9999, -0 to -9999\n  };\n\n  var timezonePatterns = {\n    basicOptionalMinutes: /^([+-])(\\d{2})(\\d{2})?|Z/,\n    basic: /^([+-])(\\d{2})(\\d{2})|Z/,\n    basicOptionalSeconds: /^([+-])(\\d{2})(\\d{2})((\\d{2}))?|Z/,\n    extended: /^([+-])(\\d{2}):(\\d{2})|Z/,\n    extendedOptionalSeconds: /^([+-])(\\d{2}):(\\d{2})(:(\\d{2}))?|Z/\n  };\n\n  function parseNumericPattern (pattern, string, valueCallback) {\n    var matchResult = string.match(pattern);\n\n    if (!matchResult) {\n      return null\n    }\n\n    var value = parseInt(matchResult[0], 10);\n\n    return {\n      value: valueCallback ? valueCallback(value) : value,\n      rest: string.slice(matchResult[0].length)\n    }\n  }\n\n  function parseTimezonePattern (pattern, string) {\n    var matchResult = string.match(pattern);\n\n    if (!matchResult) {\n      return null\n    }\n\n    // Input is 'Z'\n    if (matchResult[0] === 'Z') {\n      return {\n        value: 0,\n        rest: string.slice(1)\n      }\n    }\n\n    var sign = matchResult[1] === '+' ? 1 : -1;\n    var hours = matchResult[2] ? parseInt(matchResult[2], 10) : 0;\n    var minutes = matchResult[3] ? parseInt(matchResult[3], 10) : 0;\n    var seconds = matchResult[5] ? parseInt(matchResult[5], 10) : 0;\n\n    return {\n      value: sign * (\n        hours * MILLISECONDS_IN_HOUR$1 +\n          minutes * MILLISECONDS_IN_MINUTE$2 +\n          seconds * MILLISECONDS_IN_SECOND\n      ),\n      rest: string.slice(matchResult[0].length)\n    }\n  }\n\n  function parseAnyDigitsSigned (string, valueCallback) {\n    return parseNumericPattern(numericPatterns.anyDigitsSigned, string, valueCallback)\n  }\n\n  function parseNDigits (n, string, valueCallback) {\n    switch (n) {\n      case 1:\n        return parseNumericPattern(numericPatterns.singleDigit, string, valueCallback)\n      case 2:\n        return parseNumericPattern(numericPatterns.twoDigits, string, valueCallback)\n      case 3:\n        return parseNumericPattern(numericPatterns.threeDigits, string, valueCallback)\n      case 4:\n        return parseNumericPattern(numericPatterns.fourDigits, string, valueCallback)\n      default:\n        return parseNumericPattern(new RegExp('^\\\\d{1,' + n + '}'), string, valueCallback)\n    }\n  }\n\n  function parseNDigitsSigned (n, string, valueCallback) {\n    switch (n) {\n      case 1:\n        return parseNumericPattern(numericPatterns.singleDigitSigned, string, valueCallback)\n      case 2:\n        return parseNumericPattern(numericPatterns.twoDigitsSigned, string, valueCallback)\n      case 3:\n        return parseNumericPattern(numericPatterns.threeDigitsSigned, string, valueCallback)\n      case 4:\n        return parseNumericPattern(numericPatterns.fourDigitsSigned, string, valueCallback)\n      default:\n        return parseNumericPattern(new RegExp('^-?\\\\d{1,' + n + '}'), string, valueCallback)\n    }\n  }\n\n  function dayPeriodEnumToHours (enumValue) {\n    switch (enumValue) {\n      case 'morning':\n        return 4\n      case 'evening':\n        return 17\n      case 'pm':\n      case 'noon':\n      case 'afternoon':\n        return 12\n      case 'am':\n      case 'midnight':\n      case 'night':\n      default:\n        return 0\n    }\n  }\n\n  function normalizeTwoDigitYear (twoDigitYear, currentYear) {\n    var isCommonEra = currentYear > 0;\n    // Absolute number of the current year:\n    // 1 -> 1 AC\n    // 0 -> 1 BC\n    // -1 -> 2 BC\n    var absCurrentYear = isCommonEra ? currentYear : 1 - currentYear;\n\n    var result;\n    if (absCurrentYear <= 50) {\n      result = twoDigitYear || 100;\n    } else {\n      var rangeEnd = absCurrentYear + 50;\n      var rangeEndCentury = Math.floor(rangeEnd / 100) * 100;\n      var isPreviousCentury = twoDigitYear >= rangeEnd % 100;\n      result = twoDigitYear + rangeEndCentury - (isPreviousCentury ? 100 : 0);\n    }\n\n    return isCommonEra ? result : 1 - result\n  }\n\n  var DAYS_IN_MONTH$1 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n  var DAYS_IN_MONTH_LEAP_YEAR$1 = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n  // User for validation\n  function isLeapYearIndex$1 (year) {\n    return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0)\n  }\n\n  /*\n   * |     | Unit                           |     | Unit                           |\n   * |-----|--------------------------------|-----|--------------------------------|\n   * |  a  | AM, PM                         |  A* | Milliseconds in day            |\n   * |  b  | AM, PM, noon, midnight         |  B  | Flexible day period            |\n   * |  c  | Stand-alone local day of week  |  C* | Localized hour w/ day period   |\n   * |  d  | Day of month                   |  D  | Day of year                    |\n   * |  e  | Local day of week              |  E  | Day of week                    |\n   * |  f  |                                |  F* | Day of week in month           |\n   * |  g* | Modified Julian day            |  G  | Era                            |\n   * |  h  | Hour [1-12]                    |  H  | Hour [0-23]                    |\n   * |  i! | ISO day of week                |  I! | ISO week of year               |\n   * |  j* | Localized hour w/ day period   |  J* | Localized hour w/o day period  |\n   * |  k  | Hour [1-24]                    |  K  | Hour [0-11]                    |\n   * |  l* | (deprecated)                   |  L  | Stand-alone month              |\n   * |  m  | Minute                         |  M  | Month                          |\n   * |  n  |                                |  N  |                                |\n   * |  o! | Ordinal number modifier        |  O* | Timezone (GMT)                 |\n   * |  p  |                                |  P  |                                |\n   * |  q  | Stand-alone quarter            |  Q  | Quarter                        |\n   * |  r* | Related Gregorian year         |  R! | ISO week-numbering year        |\n   * |  s  | Second                         |  S  | Fraction of second             |\n   * |  t! | Seconds timestamp              |  T! | Milliseconds timestamp         |\n   * |  u  | Extended year                  |  U* | Cyclic year                    |\n   * |  v* | Timezone (generic non-locat.)  |  V* | Timezone (location)            |\n   * |  w  | Local week of year             |  W* | Week of month                  |\n   * |  x  | Timezone (ISO-8601 w/o Z)      |  X  | Timezone (ISO-8601)            |\n   * |  y  | Year (abs)                     |  Y  | Local week-numbering year      |\n   * |  z* | Timezone (specific non-locat.) |  Z* | Timezone (aliases)             |\n   *\n   * Letters marked by * are not implemented but reserved by Unicode standard.\n   *\n   * Letters marked by ! are non-standard, but implemented by date-fns:\n   * - `o` modifies the previous token to turn it into an ordinal (see `parse` docs)\n   * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n   *   i.e. 7 for Sunday, 1 for Monday, etc.\n   * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n   * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n   *   `R` is supposed to be used in conjunction with `I` and `i`\n   *   for universal ISO week-numbering date, whereas\n   *   `Y` is supposed to be used in conjunction with `w` and `e`\n   *   for week-numbering date specific to the locale.\n   */\n  var parsers = {\n    // Era\n    G: {\n      priority: 140,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          // AD, BC\n          case 'G':\n          case 'GG':\n          case 'GGG':\n            return match.era(string, {width: 'abbreviated'}) ||\n              match.era(string, {width: 'narrow'})\n          // A, B\n          case 'GGGGG':\n            return match.era(string, {width: 'narrow'})\n          // Anno Domini, Before Christ\n          case 'GGGG':\n          default:\n            return match.era(string, {width: 'wide'}) ||\n              match.era(string, {width: 'abbreviated'}) ||\n              match.era(string, {width: 'narrow'})\n        }\n      },\n      set: function (date, value, options) {\n        // Sets year 10 BC if BC, or 10 AC if AC\n        date.setUTCFullYear(value === 1 ? 10 : -9, 0, 1);\n        date.setUTCHours(0, 0, 0, 0);\n        return date\n      }\n    },\n\n    // Year\n    y: {\n      // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns\n      // | Year     |     y | yy |   yyy |  yyyy | yyyyy |\n      // |----------|-------|----|-------|-------|-------|\n      // | AD 1     |     1 | 01 |   001 |  0001 | 00001 |\n      // | AD 12    |    12 | 12 |   012 |  0012 | 00012 |\n      // | AD 123   |   123 | 23 |   123 |  0123 | 00123 |\n      // | AD 1234  |  1234 | 34 |  1234 |  1234 | 01234 |\n      // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n      priority: 130,\n      parse: function (string, token, match, options) {\n        var valueCallback = function (year) {\n          return {\n            year: year,\n            isTwoDigitYear: token === 'yy'\n          }\n        };\n\n        switch (token) {\n          case 'y':\n            return parseNDigits(4, string, valueCallback)\n          case 'yo':\n            return match.ordinalNumber(string, {unit: 'year', valueCallback: valueCallback})\n          default:\n            return parseNDigits(token.length, string, valueCallback)\n        }\n      },\n      validate: function (date, value, options) {\n        return value.isTwoDigitYear || value.year > 0\n      },\n      set: function (date, value, options) {\n        var currentYear = getUTCWeekYear(date, options);\n\n        if (value.isTwoDigitYear) {\n          var normalizedTwoDigitYear = normalizeTwoDigitYear(value.year, currentYear);\n          date.setUTCFullYear(normalizedTwoDigitYear, 0, 1);\n          date.setUTCHours(0, 0, 0, 0);\n          return date\n        }\n\n        var year = currentYear > 0 ? value.year : 1 - value.year;\n        date.setUTCFullYear(year, 0, 1);\n        date.setUTCHours(0, 0, 0, 0);\n        return date\n      }\n    },\n\n    // Local week-numbering year\n    Y: {\n      priority: 130,\n      parse: function (string, token, match, options) {\n        var valueCallback = function (year) {\n          return {\n            year: year,\n            isTwoDigitYear: token === 'YY'\n          }\n        };\n\n        switch (token) {\n          case 'Y':\n            return parseNDigits(4, string, valueCallback)\n          case 'Yo':\n            return match.ordinalNumber(string, {unit: 'year', valueCallback: valueCallback})\n          default:\n            return parseNDigits(token.length, string, valueCallback)\n        }\n      },\n      validate: function (date, value, options) {\n        return value.isTwoDigitYear || value.year > 0\n      },\n      set: function (date, value, options) {\n        var currentYear = date.getUTCFullYear();\n\n        if (value.isTwoDigitYear) {\n          var normalizedTwoDigitYear = normalizeTwoDigitYear(value.year, currentYear);\n          date.setUTCFullYear(normalizedTwoDigitYear, 0, options.firstWeekContainsDate);\n          date.setUTCHours(0, 0, 0, 0);\n          return startOfUTCWeek(date, options)\n        }\n\n        var year = currentYear > 0 ? value.year : 1 - value.year;\n        date.setUTCFullYear(year, 0, options.firstWeekContainsDate);\n        date.setUTCHours(0, 0, 0, 0);\n        return startOfUTCWeek(date, options)\n      }\n    },\n\n    // ISO week-numbering year\n    R: {\n      priority: 130,\n      parse: function (string, token, match, options) {\n        if (token === 'R') {\n          return parseNDigitsSigned(4, string)\n        }\n\n        return parseNDigitsSigned(token.length, string)\n      },\n      set: function (date, value, options) {\n        var firstWeekOfYear = new Date(0);\n        firstWeekOfYear.setUTCFullYear(value, 0, 4);\n        firstWeekOfYear.setUTCHours(0, 0, 0, 0);\n        return startOfUTCISOWeek(firstWeekOfYear)\n      }\n    },\n\n    // Extended year\n    u: {\n      priority: 130,\n      parse: function (string, token, match, options) {\n        if (token === 'u') {\n          return parseNDigitsSigned(4, string)\n        }\n\n        return parseNDigitsSigned(token.length, string)\n      },\n      set: function (date, value, options) {\n        date.setUTCFullYear(value, 0, 1);\n        date.setUTCHours(0, 0, 0, 0);\n        return date\n      }\n    },\n\n    // Quarter\n    Q: {\n      priority: 120,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          // 1, 2, 3, 4\n          case 'Q':\n          case 'QQ': // 01, 02, 03, 04\n            return parseNDigits(token.length, string)\n          // 1st, 2nd, 3rd, 4th\n          case 'Qo':\n            return match.ordinalNumber(string, {unit: 'quarter'})\n          // Q1, Q2, Q3, Q4\n          case 'QQQ':\n            return match.quarter(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.quarter(string, {width: 'narrow', context: 'formatting'})\n          // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n          case 'QQQQQ':\n            return match.quarter(string, {width: 'narrow', context: 'formatting'})\n          // 1st quarter, 2nd quarter, ...\n          case 'QQQQ':\n          default:\n            return match.quarter(string, {width: 'wide', context: 'formatting'}) ||\n              match.quarter(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.quarter(string, {width: 'narrow', context: 'formatting'})\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 1 && value <= 4\n      },\n      set: function (date, value, options) {\n        date.setUTCMonth((value - 1) * 3, 1);\n        date.setUTCHours(0, 0, 0, 0);\n        return date\n      }\n    },\n\n    // Stand-alone quarter\n    q: {\n      priority: 120,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          // 1, 2, 3, 4\n          case 'q':\n          case 'qq': // 01, 02, 03, 04\n            return parseNDigits(token.length, string)\n          // 1st, 2nd, 3rd, 4th\n          case 'qo':\n            return match.ordinalNumber(string, {unit: 'quarter'})\n          // Q1, Q2, Q3, Q4\n          case 'qqq':\n            return match.quarter(string, {width: 'abbreviated', context: 'standalone'}) ||\n              match.quarter(string, {width: 'narrow', context: 'standalone'})\n          // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n          case 'qqqqq':\n            return match.quarter(string, {width: 'narrow', context: 'standalone'})\n          // 1st quarter, 2nd quarter, ...\n          case 'qqqq':\n          default:\n            return match.quarter(string, {width: 'wide', context: 'standalone'}) ||\n              match.quarter(string, {width: 'abbreviated', context: 'standalone'}) ||\n              match.quarter(string, {width: 'narrow', context: 'standalone'})\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 1 && value <= 4\n      },\n      set: function (date, value, options) {\n        date.setUTCMonth((value - 1) * 3, 1);\n        date.setUTCHours(0, 0, 0, 0);\n        return date\n      }\n    },\n\n    // Month\n    M: {\n      priority: 110,\n      parse: function (string, token, match, options) {\n        var valueCallback = function (value) {\n          return value - 1\n        };\n\n        switch (token) {\n          // 1, 2, ..., 12\n          case 'M':\n            return parseNumericPattern(numericPatterns.month, string, valueCallback)\n          // 01, 02, ..., 12\n          case 'MM':\n            return parseNDigits(2, string, valueCallback)\n          // 1st, 2nd, ..., 12th\n          case 'Mo':\n            return match.ordinalNumber(string, {unit: 'month', valueCallback: valueCallback})\n          // Jan, Feb, ..., Dec\n          case 'MMM':\n            return match.month(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.month(string, {width: 'narrow', context: 'formatting'})\n          // J, F, ..., D\n          case 'MMMMM':\n            return match.month(string, {width: 'narrow', context: 'formatting'})\n          // January, February, ..., December\n          case 'MMMM':\n          default:\n            return match.month(string, {width: 'wide', context: 'formatting'}) ||\n              match.month(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.month(string, {width: 'narrow', context: 'formatting'})\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 0 && value <= 11\n      },\n      set: function (date, value, options) {\n        date.setUTCMonth(value, 1);\n        date.setUTCHours(0, 0, 0, 0);\n        return date\n      }\n    },\n\n    // Stand-alone month\n    L: {\n      priority: 110,\n      parse: function (string, token, match, options) {\n        var valueCallback = function (value) {\n          return value - 1\n        };\n\n        switch (token) {\n          // 1, 2, ..., 12\n          case 'L':\n            return parseNumericPattern(numericPatterns.month, string, valueCallback)\n          // 01, 02, ..., 12\n          case 'LL':\n            return parseNDigits(2, string, valueCallback)\n          // 1st, 2nd, ..., 12th\n          case 'Lo':\n            return match.ordinalNumber(string, {unit: 'month', valueCallback: valueCallback})\n          // Jan, Feb, ..., Dec\n          case 'LLL':\n            return match.month(string, {width: 'abbreviated', context: 'standalone'}) ||\n              match.month(string, {width: 'narrow', context: 'standalone'})\n          // J, F, ..., D\n          case 'LLLLL':\n            return match.month(string, {width: 'narrow', context: 'standalone'})\n          // January, February, ..., December\n          case 'LLLL':\n          default:\n            return match.month(string, {width: 'wide', context: 'standalone'}) ||\n              match.month(string, {width: 'abbreviated', context: 'standalone'}) ||\n              match.month(string, {width: 'narrow', context: 'standalone'})\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 0 && value <= 11\n      },\n      set: function (date, value, options) {\n        date.setUTCMonth(value, 1);\n        date.setUTCHours(0, 0, 0, 0);\n        return date\n      }\n    },\n\n    // Local week of year\n    w: {\n      priority: 100,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'w':\n            return parseNumericPattern(numericPatterns.week, string)\n          case 'wo':\n            return match.ordinalNumber(string, {unit: 'week'})\n          default:\n            return parseNDigits(token.length, string)\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 1 && value <= 53\n      },\n      set: function (date, value, options) {\n        return startOfUTCWeek(setUTCWeek(date, value, options), options)\n      }\n    },\n\n    // ISO week of year\n    I: {\n      priority: 100,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'I':\n            return parseNumericPattern(numericPatterns.week, string)\n          case 'Io':\n            return match.ordinalNumber(string, {unit: 'week'})\n          default:\n            return parseNDigits(token.length, string)\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 1 && value <= 53\n      },\n      set: function (date, value, options) {\n        return startOfUTCISOWeek(setUTCISOWeek(date, value, options), options)\n      }\n    },\n\n    // Day of the month\n    d: {\n      priority: 90,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'd':\n            return parseNumericPattern(numericPatterns.date, string)\n          case 'do':\n            return match.ordinalNumber(string, {unit: 'date'})\n          default:\n            return parseNDigits(token.length, string)\n        }\n      },\n      validate: function (date, value, options) {\n        var year = date.getUTCFullYear();\n        var isLeapYear = isLeapYearIndex$1(year);\n        var month = date.getUTCMonth();\n        if (isLeapYear) {\n          return value >= 1 && value <= DAYS_IN_MONTH_LEAP_YEAR$1[month]\n        } else {\n          return value >= 1 && value <= DAYS_IN_MONTH$1[month]\n        }\n      },\n      set: function (date, value, options) {\n        date.setUTCDate(value);\n        date.setUTCHours(0, 0, 0, 0);\n        return date\n      }\n    },\n\n    // Day of year\n    D: {\n      priority: 90,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'D':\n          case 'DD':\n            return parseNumericPattern(numericPatterns.dayOfYear, string)\n          case 'Do':\n            return match.ordinalNumber(string, {unit: 'date'})\n          default:\n            return parseNDigits(token.length, string)\n        }\n      },\n      validate: function (date, value, options) {\n        var year = date.getUTCFullYear();\n        var isLeapYear = isLeapYearIndex$1(year);\n        if (isLeapYear) {\n          return value >= 1 && value <= 366\n        } else {\n          return value >= 1 && value <= 365\n        }\n      },\n      set: function (date, value, options) {\n        date.setUTCMonth(0, value);\n        date.setUTCHours(0, 0, 0, 0);\n        return date\n      }\n    },\n\n    // Day of week\n    E: {\n      priority: 90,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          // Tue\n          case 'E':\n          case 'EE':\n          case 'EEE':\n            return match.day(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.day(string, {width: 'short', context: 'formatting'}) ||\n              match.day(string, {width: 'narrow', context: 'formatting'})\n          // T\n          case 'EEEEE':\n            return match.day(string, {width: 'narrow', context: 'formatting'})\n          // Tu\n          case 'EEEEEE':\n            return match.day(string, {width: 'short', context: 'formatting'}) ||\n            match.day(string, {width: 'narrow', context: 'formatting'})\n          // Tuesday\n          case 'EEEE':\n          default:\n            return match.day(string, {width: 'wide', context: 'formatting'}) ||\n              match.day(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.day(string, {width: 'short', context: 'formatting'}) ||\n              match.day(string, {width: 'narrow', context: 'formatting'})\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 0 && value <= 6\n      },\n      set: function (date, value, options) {\n        date = setUTCDay(date, value, options);\n        date.setUTCHours(0, 0, 0, 0);\n        return date\n      }\n    },\n\n    // Local day of week\n    e: {\n      priority: 90,\n      parse: function (string, token, match, options) {\n        var valueCallback = function (value) {\n          var wholeWeekDays = Math.floor((value - 1) / 7) * 7;\n          return (value + options.weekStartsOn + 6) % 7 + wholeWeekDays\n        };\n\n        switch (token) {\n          // 3\n          case 'e':\n          case 'ee': // 03\n            return parseNDigits(token.length, string, valueCallback)\n          // 3rd\n          case 'eo':\n            return match.ordinalNumber(string, {unit: 'day', valueCallback: valueCallback})\n          // Tue\n          case 'eee':\n            return match.day(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.day(string, {width: 'short', context: 'formatting'}) ||\n              match.day(string, {width: 'narrow', context: 'formatting'})\n          // T\n          case 'eeeee':\n            return match.day(string, {width: 'narrow', context: 'formatting'})\n          // Tu\n          case 'eeeeee':\n            return match.day(string, {width: 'short', context: 'formatting'}) ||\n            match.day(string, {width: 'narrow', context: 'formatting'})\n          // Tuesday\n          case 'eeee':\n          default:\n            return match.day(string, {width: 'wide', context: 'formatting'}) ||\n              match.day(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.day(string, {width: 'short', context: 'formatting'}) ||\n              match.day(string, {width: 'narrow', context: 'formatting'})\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 0 && value <= 6\n      },\n      set: function (date, value, options) {\n        date = setUTCDay(date, value, options);\n        date.setUTCHours(0, 0, 0, 0);\n        return date\n      }\n    },\n\n    // Stand-alone local day of week\n    c: {\n      priority: 90,\n      parse: function (string, token, match, options) {\n        var valueCallback = function (value) {\n          var wholeWeekDays = Math.floor((value - 1) / 7) * 7;\n          return (value + options.weekStartsOn + 6) % 7 + wholeWeekDays\n        };\n\n        switch (token) {\n          // 3\n          case 'c':\n          case 'cc': // 03\n            return parseNDigits(token.length, string, valueCallback)\n          // 3rd\n          case 'co':\n            return match.ordinalNumber(string, {unit: 'day', valueCallback: valueCallback})\n          // Tue\n          case 'ccc':\n            return match.day(string, {width: 'abbreviated', context: 'standalone'}) ||\n              match.day(string, {width: 'short', context: 'standalone'}) ||\n              match.day(string, {width: 'narrow', context: 'standalone'})\n          // T\n          case 'ccccc':\n            return match.day(string, {width: 'narrow', context: 'standalone'})\n          // Tu\n          case 'cccccc':\n            return match.day(string, {width: 'short', context: 'standalone'}) ||\n            match.day(string, {width: 'narrow', context: 'standalone'})\n          // Tuesday\n          case 'cccc':\n          default:\n            return match.day(string, {width: 'wide', context: 'standalone'}) ||\n              match.day(string, {width: 'abbreviated', context: 'standalone'}) ||\n              match.day(string, {width: 'short', context: 'standalone'}) ||\n              match.day(string, {width: 'narrow', context: 'standalone'})\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 0 && value <= 6\n      },\n      set: function (date, value, options) {\n        date = setUTCDay(date, value, options);\n        date.setUTCHours(0, 0, 0, 0);\n        return date\n      }\n    },\n\n    // ISO day of week\n    i: {\n      priority: 90,\n      parse: function (string, token, match, options) {\n        var valueCallback = function (value) {\n          if (value === 0) {\n            return 7\n          }\n          return value\n        };\n\n        switch (token) {\n          // 2\n          case 'i':\n          case 'ii': // 02\n            return parseNDigits(token.length, string)\n          // 2nd\n          case 'io':\n            return match.ordinalNumber(string, {unit: 'day'})\n          // Tue\n          case 'iii':\n            return match.day(string, {width: 'abbreviated', context: 'formatting', valueCallback: valueCallback}) ||\n              match.day(string, {width: 'short', context: 'formatting', valueCallback: valueCallback}) ||\n              match.day(string, {width: 'narrow', context: 'formatting', valueCallback: valueCallback})\n          // T\n          case 'iiiii':\n            return match.day(string, {width: 'narrow', context: 'formatting', valueCallback: valueCallback})\n          // Tu\n          case 'iiiiii':\n            return match.day(string, {width: 'short', context: 'formatting', valueCallback: valueCallback}) ||\n            match.day(string, {width: 'narrow', context: 'formatting', valueCallback: valueCallback})\n          // Tuesday\n          case 'iiii':\n          default:\n            return match.day(string, {width: 'wide', context: 'formatting', valueCallback: valueCallback}) ||\n              match.day(string, {width: 'abbreviated', context: 'formatting', valueCallback: valueCallback}) ||\n              match.day(string, {width: 'short', context: 'formatting', valueCallback: valueCallback}) ||\n              match.day(string, {width: 'narrow', context: 'formatting', valueCallback: valueCallback})\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 1 && value <= 7\n      },\n      set: function (date, value, options) {\n        date = setUTCISODay(date, value, options);\n        date.setUTCHours(0, 0, 0, 0);\n        return date\n      }\n    },\n\n    // AM or PM\n    a: {\n      priority: 80,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'a':\n          case 'aa':\n          case 'aaa':\n            return match.dayPeriod(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.dayPeriod(string, {width: 'narrow', context: 'formatting'})\n          case 'aaaaa':\n            return match.dayPeriod(string, {width: 'narrow', context: 'formatting'})\n          case 'aaaa':\n          default:\n            return match.dayPeriod(string, {width: 'wide', context: 'formatting'}) ||\n              match.dayPeriod(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.dayPeriod(string, {width: 'narrow', context: 'formatting'})\n        }\n      },\n      set: function (date, value, options) {\n        date.setUTCHours(dayPeriodEnumToHours(value), 0, 0, 0);\n        return date\n      }\n    },\n\n    // AM, PM, midnight\n    b: {\n      priority: 80,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'b':\n          case 'bb':\n          case 'bbb':\n            return match.dayPeriod(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.dayPeriod(string, {width: 'narrow', context: 'formatting'})\n          case 'bbbbb':\n            return match.dayPeriod(string, {width: 'narrow', context: 'formatting'})\n          case 'bbbb':\n          default:\n            return match.dayPeriod(string, {width: 'wide', context: 'formatting'}) ||\n              match.dayPeriod(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.dayPeriod(string, {width: 'narrow', context: 'formatting'})\n        }\n      },\n      set: function (date, value, options) {\n        date.setUTCHours(dayPeriodEnumToHours(value), 0, 0, 0);\n        return date\n      }\n    },\n\n    // in the morning, in the afternoon, in the evening, at night\n    B: {\n      priority: 80,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'B':\n          case 'BB':\n          case 'BBB':\n            return match.dayPeriod(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.dayPeriod(string, {width: 'narrow', context: 'formatting'})\n          case 'BBBBB':\n            return match.dayPeriod(string, {width: 'narrow', context: 'formatting'})\n          case 'BBBB':\n          default:\n            return match.dayPeriod(string, {width: 'wide', context: 'formatting'}) ||\n              match.dayPeriod(string, {width: 'abbreviated', context: 'formatting'}) ||\n              match.dayPeriod(string, {width: 'narrow', context: 'formatting'})\n        }\n      },\n      set: function (date, value, options) {\n        date.setUTCHours(dayPeriodEnumToHours(value), 0, 0, 0);\n        return date\n      }\n    },\n\n    // Hour [1-12]\n    h: {\n      priority: 70,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'h':\n            return parseNumericPattern(numericPatterns.hour12h, string)\n          case 'ho':\n            return match.ordinalNumber(string, {unit: 'hour'})\n          default:\n            return parseNDigits(token.length, string)\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 1 && value <= 12\n      },\n      set: function (date, value, options) {\n        var isPM = date.getUTCHours() >= 12;\n        if (isPM && value < 12) {\n          date.setUTCHours(value + 12, 0, 0, 0);\n        } else if (!isPM && value === 12) {\n          date.setUTCHours(0, 0, 0, 0);\n        } else {\n          date.setUTCHours(value, 0, 0, 0);\n        }\n        return date\n      }\n    },\n\n    // Hour [0-23]\n    H: {\n      priority: 70,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'H':\n            return parseNumericPattern(numericPatterns.hour23h, string)\n          case 'Ho':\n            return match.ordinalNumber(string, {unit: 'hour'})\n          default:\n            return parseNDigits(token.length, string)\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 0 && value <= 23\n      },\n      set: function (date, value, options) {\n        date.setUTCHours(value, 0, 0, 0);\n        return date\n      }\n    },\n\n    // Hour [0-11]\n    K: {\n      priority: 70,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'K':\n            return parseNumericPattern(numericPatterns.hour11h, string)\n          case 'Ko':\n            return match.ordinalNumber(string, {unit: 'hour'})\n          default:\n            return parseNDigits(token.length, string)\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 0 && value <= 11\n      },\n      set: function (date, value, options) {\n        var isPM = date.getUTCHours() >= 12;\n        if (isPM && value < 12) {\n          date.setUTCHours(value + 12, 0, 0, 0);\n        } else {\n          date.setUTCHours(value, 0, 0, 0);\n        }\n        return date\n      }\n    },\n\n    // Hour [1-24]\n    k: {\n      priority: 70,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'k':\n            return parseNumericPattern(numericPatterns.hour24h, string)\n          case 'ko':\n            return match.ordinalNumber(string, {unit: 'hour'})\n          default:\n            return parseNDigits(token.length, string)\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 1 && value <= 24\n      },\n      set: function (date, value, options) {\n        var hours = value <= 24 ? value % 24 : value;\n        date.setUTCHours(hours, 0, 0, 0);\n        return date\n      }\n    },\n\n    // Minute\n    m: {\n      priority: 60,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'm':\n            return parseNumericPattern(numericPatterns.minute, string)\n          case 'mo':\n            return match.ordinalNumber(string, {unit: 'minute'})\n          default:\n            return parseNDigits(token.length, string)\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 0 && value <= 59\n      },\n      set: function (date, value, options) {\n        date.setUTCMinutes(value, 0, 0);\n        return date\n      }\n    },\n\n    // Second\n    s: {\n      priority: 50,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 's':\n            return parseNumericPattern(numericPatterns.second, string)\n          case 'so':\n            return match.ordinalNumber(string, {unit: 'second'})\n          default:\n            return parseNDigits(token.length, string)\n        }\n      },\n      validate: function (date, value, options) {\n        return value >= 0 && value <= 59\n      },\n      set: function (date, value, options) {\n        date.setUTCSeconds(value, 0);\n        return date\n      }\n    },\n\n    // Fraction of second\n    S: {\n      priority: 40,\n      parse: function (string, token, match, options) {\n        var valueCallback = function (value) {\n          return Math.floor(value * Math.pow(10, -token.length + 3))\n        };\n        return parseNDigits(token.length, string, valueCallback)\n      },\n      set: function (date, value, options) {\n        date.setUTCMilliseconds(value);\n        return date\n      }\n    },\n\n    // Timezone (ISO-8601. +00:00 is `'Z'`)\n    X: {\n      priority: 20,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'X':\n            return parseTimezonePattern(timezonePatterns.basicOptionalMinutes, string)\n          case 'XX':\n            return parseTimezonePattern(timezonePatterns.basic, string)\n          case 'XXXX':\n            return parseTimezonePattern(timezonePatterns.basicOptionalSeconds, string)\n          case 'XXXXX':\n            return parseTimezonePattern(timezonePatterns.extendedOptionalSeconds, string)\n          case 'XXX':\n          default:\n            return parseTimezonePattern(timezonePatterns.extended, string)\n        }\n      },\n      set: function (date, value, options) {\n        return new Date(date.getTime() - value)\n      }\n    },\n\n    // Timezone (ISO-8601)\n    x: {\n      priority: 20,\n      parse: function (string, token, match, options) {\n        switch (token) {\n          case 'x':\n            return parseTimezonePattern(timezonePatterns.basicOptionalMinutes, string)\n          case 'xx':\n            return parseTimezonePattern(timezonePatterns.basic, string)\n          case 'xxxx':\n            return parseTimezonePattern(timezonePatterns.basicOptionalSeconds, string)\n          case 'xxxxx':\n            return parseTimezonePattern(timezonePatterns.extendedOptionalSeconds, string)\n          case 'xxx':\n          default:\n            return parseTimezonePattern(timezonePatterns.extended, string)\n        }\n      },\n      set: function (date, value, options) {\n        return new Date(date.getTime() - value)\n      }\n    },\n\n    // Seconds timestamp\n    t: {\n      priority: 10,\n      parse: function (string, token, match, options) {\n        return parseAnyDigitsSigned(string)\n      },\n      set: function (date, value, options) {\n        return new Date(value * 1000)\n      }\n    },\n\n    // Milliseconds timestamp\n    T: {\n      priority: 10,\n      parse: function (string, token, match, options) {\n        return parseAnyDigitsSigned(string)\n      },\n      set: function (date, value, options) {\n        return new Date(value)\n      }\n    }\n  };\n\n  var TIMEZONE_UNIT_PRIORITY = 20;\n\n  // This RegExp consists of three parts separated by `|`:\n  // - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n  //   (one of the certain letters followed by `o`)\n  // - (\\w)\\1* matches any sequences of the same letter\n  // - '' matches two quote characters in a row\n  // - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n  //   except a single quote symbol, which ends the sequence.\n  //   Two quote characters do not end the sequence.\n  //   If there is no matching single quote\n  //   then the sequence will continue until the end of the string.\n  // - . matches any single character unmatched by previous parts of the RegExps\n  var formattingTokensRegExp$1 = /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n  var escapedStringRegExp$1 = /^'(.*?)'?$/;\n  var doubleQuoteRegExp$1 = /''/g;\n\n  var notWhitespaceRegExp = /\\S/;\n\n  /**\n   * @name parse\n   * @category Common Helpers\n   * @summary Parse the date.\n   *\n   * @description\n   * Return the date parsed from string using the given format string.\n   *\n   * > âš ï¸� Please note that the `format` tokens differ from Moment.js and other libraries.\n   * > See: https://git.io/fxCyr\n   *\n   * The characters in the format string wrapped between two single quotes characters (') are escaped.\n   * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n   *\n   * Format of the format string is based on Unicode Technical Standard #35:\n   * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n   * with a few additions (see note 5 below the table).\n   *\n   * Accepted format string patterns:\n   * | Unit                            |Prior| Pattern | Result examples                   | Notes |\n   * |---------------------------------|-----|---------|-----------------------------------|-------|\n   * | Era                             | 140 | G..GGG  | AD, BC                            |       |\n   * |                                 |     | GGGG    | Anno Domini, Before Christ        | 2     |\n   * |                                 |     | GGGGG   | A, B                              |       |\n   * | Calendar year                   | 130 | y       | 44, 1, 1900, 2017, 9999           | 4     |\n   * |                                 |     | yo      | 44th, 1st, 1900th, 9999999th      | 4,5   |\n   * |                                 |     | yy      | 44, 01, 00, 17                    | 4     |\n   * |                                 |     | yyy     | 044, 001, 123, 999                | 4     |\n   * |                                 |     | yyyy    | 0044, 0001, 1900, 2017            | 4     |\n   * |                                 |     | yyyyy   | ...                               | 2,4   |\n   * | Local week-numbering year       | 130 | Y       | 44, 1, 1900, 2017, 9000           | 4     |\n   * |                                 |     | Yo      | 44th, 1st, 1900th, 9999999th      | 4,5   |\n   * |                                 |     | YY      | 44, 01, 00, 17                    | 4,6   |\n   * |                                 |     | YYY     | 044, 001, 123, 999                | 4     |\n   * |                                 |     | YYYY    | 0044, 0001, 1900, 2017            | 4,6   |\n   * |                                 |     | YYYYY   | ...                               | 2,4   |\n   * | ISO week-numbering year         | 130 | R       | -43, 1, 1900, 2017, 9999, -9999   | 4,5   |\n   * |                                 |     | RR      | -43, 01, 00, 17                   | 4,5   |\n   * |                                 |     | RRR     | -043, 001, 123, 999, -999         | 4,5   |\n   * |                                 |     | RRRR    | -0043, 0001, 2017, 9999, -9999    | 4,5   |\n   * |                                 |     | RRRRR   | ...                               | 2,4,5 |\n   * | Extended year                   | 130 | u       | -43, 1, 1900, 2017, 9999, -999    | 4     |\n   * |                                 |     | uu      | -43, 01, 99, -99                  | 4     |\n   * |                                 |     | uuu     | -043, 001, 123, 999, -999         | 4     |\n   * |                                 |     | uuuu    | -0043, 0001, 2017, 9999, -9999    | 4     |\n   * |                                 |     | uuuuu   | ...                               | 2,4   |\n   * | Quarter (formatting)            | 120 | Q       | 1, 2, 3, 4                        |       |\n   * |                                 |     | Qo      | 1st, 2nd, 3rd, 4th                | 5     |\n   * |                                 |     | QQ      | 01, 02, 03, 04                    |       |\n   * |                                 |     | QQQ     | Q1, Q2, Q3, Q4                    |       |\n   * |                                 |     | QQQQ    | 1st quarter, 2nd quarter, ...     | 2     |\n   * |                                 |     | QQQQQ   | 1, 2, 3, 4                        | 4     |\n   * | Quarter (stand-alone)           | 120 | q       | 1, 2, 3, 4                        |       |\n   * |                                 |     | qo      | 1st, 2nd, 3rd, 4th                | 5     |\n   * |                                 |     | qq      | 01, 02, 03, 04                    |       |\n   * |                                 |     | qqq     | Q1, Q2, Q3, Q4                    |       |\n   * |                                 |     | qqqq    | 1st quarter, 2nd quarter, ...     | 2     |\n   * |                                 |     | qqqqq   | 1, 2, 3, 4                        | 3     |\n   * | Month (formatting)              | 110 | M       | 1, 2, ..., 12                     |       |\n   * |                                 |     | Mo      | 1st, 2nd, ..., 12th               | 5     |\n   * |                                 |     | MM      | 01, 02, ..., 12                   |       |\n   * |                                 |     | MMM     | Jan, Feb, ..., Dec                |       |\n   * |                                 |     | MMMM    | January, February, ..., December  | 2     |\n   * |                                 |     | MMMMM   | J, F, ..., D                      |       |\n   * | Month (stand-alone)             | 110 | L       | 1, 2, ..., 12                     |       |\n   * |                                 |     | Lo      | 1st, 2nd, ..., 12th               | 5     |\n   * |                                 |     | LL      | 01, 02, ..., 12                   |       |\n   * |                                 |     | LLL     | Jan, Feb, ..., Dec                |       |\n   * |                                 |     | LLLL    | January, February, ..., December  | 2     |\n   * |                                 |     | LLLLL   | J, F, ..., D                      |       |\n   * | Local week of year              | 100 | w       | 1, 2, ..., 53                     |       |\n   * |                                 |     | wo      | 1st, 2nd, ..., 53th               | 5     |\n   * |                                 |     | ww      | 01, 02, ..., 53                   |       |\n   * | ISO week of year                | 100 | I       | 1, 2, ..., 53                     | 5     |\n   * |                                 |     | Io      | 1st, 2nd, ..., 53th               | 5     |\n   * |                                 |     | II      | 01, 02, ..., 53                   | 5     |\n   * | Day of month                    |  90 | d       | 1, 2, ..., 31                     |       |\n   * |                                 |     | do      | 1st, 2nd, ..., 31st               | 5     |\n   * |                                 |     | dd      | 01, 02, ..., 31                   |       |\n   * | Day of year                     |  90 | D       | 1, 2, ..., 365, 366               | 6     |\n   * |                                 |     | Do      | 1st, 2nd, ..., 365th, 366th       | 5     |\n   * |                                 |     | DD      | 01, 02, ..., 365, 366             | 6     |\n   * |                                 |     | DDD     | 001, 002, ..., 365, 366           |       |\n   * |                                 |     | DDDD    | ...                               | 2     |\n   * | Day of week (formatting)        |  90 | E..EEE  | Mon, Tue, Wed, ..., Su            |       |\n   * |                                 |     | EEEE    | Monday, Tuesday, ..., Sunday      | 2     |\n   * |                                 |     | EEEEE   | M, T, W, T, F, S, S               |       |\n   * |                                 |     | EEEEEE  | Mo, Tu, We, Th, Fr, Su, Sa        |       |\n   * | ISO day of week (formatting)    |  90 | i       | 1, 2, 3, ..., 7                   | 5     |\n   * |                                 |     | io      | 1st, 2nd, ..., 7th                | 5     |\n   * |                                 |     | ii      | 01, 02, ..., 07                   | 5     |\n   * |                                 |     | iii     | Mon, Tue, Wed, ..., Su            | 5     |\n   * |                                 |     | iiii    | Monday, Tuesday, ..., Sunday      | 2,5   |\n   * |                                 |     | iiiii   | M, T, W, T, F, S, S               | 5     |\n   * |                                 |     | iiiiii  | Mo, Tu, We, Th, Fr, Su, Sa        | 5     |\n   * | Local day of week (formatting)  |  90 | e       | 2, 3, 4, ..., 1                   |       |\n   * |                                 |     | eo      | 2nd, 3rd, ..., 1st                | 5     |\n   * |                                 |     | ee      | 02, 03, ..., 01                   |       |\n   * |                                 |     | eee     | Mon, Tue, Wed, ..., Su            |       |\n   * |                                 |     | eeee    | Monday, Tuesday, ..., Sunday      | 2     |\n   * |                                 |     | eeeee   | M, T, W, T, F, S, S               |       |\n   * |                                 |     | eeeeee  | Mo, Tu, We, Th, Fr, Su, Sa        |       |\n   * | Local day of week (stand-alone) |  90 | c       | 2, 3, 4, ..., 1                   |       |\n   * |                                 |     | co      | 2nd, 3rd, ..., 1st                | 5     |\n   * |                                 |     | cc      | 02, 03, ..., 01                   |       |\n   * |                                 |     | ccc     | Mon, Tue, Wed, ..., Su            |       |\n   * |                                 |     | cccc    | Monday, Tuesday, ..., Sunday      | 2     |\n   * |                                 |     | ccccc   | M, T, W, T, F, S, S               |       |\n   * |                                 |     | cccccc  | Mo, Tu, We, Th, Fr, Su, Sa        |       |\n   * | AM, PM                          |  80 | a..aaa  | AM, PM                            |       |\n   * |                                 |     | aaaa    | a.m., p.m.                        | 2     |\n   * |                                 |     | aaaaa   | a, p                              |       |\n   * | AM, PM, noon, midnight          |  80 | b..bbb  | AM, PM, noon, midnight            |       |\n   * |                                 |     | bbbb    | a.m., p.m., noon, midnight        | 2     |\n   * |                                 |     | bbbbb   | a, p, n, mi                       |       |\n   * | Flexible day period             |  80 | B..BBB  | at night, in the morning, ...     |       |\n   * |                                 |     | BBBB    | at night, in the morning, ...     | 2     |\n   * |                                 |     | BBBBB   | at night, in the morning, ...     |       |\n   * | Hour [1-12]                     |  70 | h       | 1, 2, ..., 11, 12                 |       |\n   * |                                 |     | ho      | 1st, 2nd, ..., 11th, 12th         | 5     |\n   * |                                 |     | hh      | 01, 02, ..., 11, 12               |       |\n   * | Hour [0-23]                     |  70 | H       | 0, 1, 2, ..., 23                  |       |\n   * |                                 |     | Ho      | 0th, 1st, 2nd, ..., 23rd          | 5     |\n   * |                                 |     | HH      | 00, 01, 02, ..., 23               |       |\n   * | Hour [0-11]                     |  70 | K       | 1, 2, ..., 11, 0                  |       |\n   * |                                 |     | Ko      | 1st, 2nd, ..., 11th, 0th          | 5     |\n   * |                                 |     | KK      | 1, 2, ..., 11, 0                  |       |\n   * | Hour [1-24]                     |  70 | k       | 24, 1, 2, ..., 23                 |       |\n   * |                                 |     | ko      | 24th, 1st, 2nd, ..., 23rd         | 5     |\n   * |                                 |     | kk      | 24, 01, 02, ..., 23               |       |\n   * | Minute                          |  60 | m       | 0, 1, ..., 59                     |       |\n   * |                                 |     | mo      | 0th, 1st, ..., 59th               | 5     |\n   * |                                 |     | mm      | 00, 01, ..., 59                   |       |\n   * | Second                          |  50 | s       | 0, 1, ..., 59                     |       |\n   * |                                 |     | so      | 0th, 1st, ..., 59th               | 5     |\n   * |                                 |     | ss      | 00, 01, ..., 59                   |       |\n   * | Fraction of second              |  40 | S       | 0, 1, ..., 9                      |       |\n   * |                                 |     | SS      | 00, 01, ..., 99                   |       |\n   * |                                 |     | SSS     | 000, 0001, ..., 999               |       |\n   * |                                 |     | SSSS    | ...                               | 2     |\n   * | Timezone (ISO-8601 w/ Z)        |  20 | X       | -08, +0530, Z                     |       |\n   * |                                 |     | XX      | -0800, +0530, Z                   |       |\n   * |                                 |     | XXX     | -08:00, +05:30, Z                 |       |\n   * |                                 |     | XXXX    | -0800, +0530, Z, +123456          | 2     |\n   * |                                 |     | XXXXX   | -08:00, +05:30, Z, +12:34:56      |       |\n   * | Timezone (ISO-8601 w/o Z)       |  20 | x       | -08, +0530, +00                   |       |\n   * |                                 |     | xx      | -0800, +0530, +0000               |       |\n   * |                                 |     | xxx     | -08:00, +05:30, +00:00            | 2     |\n   * |                                 |     | xxxx    | -0800, +0530, +0000, +123456      |       |\n   * |                                 |     | xxxxx   | -08:00, +05:30, +00:00, +12:34:56 |       |\n   * | Seconds timestamp               |  10 | t       | 512969520                         |       |\n   * |                                 |     | tt      | ...                               | 2     |\n   * | Milliseconds timestamp          |  10 | T       | 512969520900                      |       |\n   * |                                 |     | TT      | ...                               | 2     |\n   * Notes:\n   * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n   *    are the same as \"stand-alone\" units, but are different in some languages.\n   *    \"Formatting\" units are declined according to the rules of the language\n   *    in the context of a date. \"Stand-alone\" units are always nominative singular.\n   *    In `format` function, they will produce different result:\n   *\n   *    `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n   *\n   *    `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n   *\n   *    `parse` will try to match both formatting and stand-alone units interchangably.\n   *\n   * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n   *    the single quote characters (see below).\n   *    If the sequence is longer than listed in table:\n   *    - for numerical units (`yyyyyyyy`) `parse` will try to match a number\n   *      as wide as the sequence\n   *    - for text units (`MMMMMMMM`) `parse` will try to match the widest variation of the unit.\n   *      These variations are marked with \"2\" in the last column of the table.\n   *\n   * 3. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n   *    These tokens represent the shortest form of the quarter.\n   *\n   * 4. The main difference between `y` and `u` patterns are B.C. years:\n   *\n   *    | Year | `y` | `u` |\n   *    |------|-----|-----|\n   *    | AC 1 |   1 |   1 |\n   *    | BC 1 |   1 |   0 |\n   *    | BC 2 |   2 |  -1 |\n   *\n   *    Also `yy` will try to guess the century of two digit year by proximity with `baseDate`:\n   *\n   *    `parse('50', 'yy', new Date(2018, 0, 1)) //=> Sat Jan 01 2050 00:00:00`\n   *\n   *    `parse('75', 'yy', new Date(2018, 0, 1)) //=> Wed Jan 01 1975 00:00:00`\n   *\n   *    while `uu` will just assign the year as is:\n   *\n   *    `parse('50', 'uu', new Date(2018, 0, 1)) //=> Sat Jan 01 0050 00:00:00`\n   *\n   *    `parse('75', 'uu', new Date(2018, 0, 1)) //=> Tue Jan 01 0075 00:00:00`\n   *\n   *    The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n   *    except local week-numbering years are dependent on `options.weekStartsOn`\n   *    and `options.firstWeekContainsDate` (compare [setISOWeekYear]{@link https://date-fns.org/docs/setISOWeekYear}\n   *    and [setWeekYear]{@link https://date-fns.org/docs/setWeekYear}).\n   *\n   * 5. These patterns are not in the Unicode Technical Standard #35:\n   *    - `i`: ISO day of week\n   *    - `I`: ISO week of year\n   *    - `R`: ISO week-numbering year\n   *    - `o`: ordinal number modifier\n   *\n   * 6. These tokens are often confused with others. See: https://git.io/fxCyr\n   *\n   * Values will be assigned to the date in the descending order of its unit's priority.\n   * Units of an equal priority overwrite each other in the order of appearance.\n   *\n   * If no values of higher priority are parsed (e.g. when parsing string 'January 1st' without a year),\n   * the values will be taken from 3rd argument `baseDate` which works as a context of parsing.\n   *\n   * `baseDate` must be passed for correct work of the function.\n   * If you're not sure which `baseDate` to supply, create a new instance of Date:\n   * `parse('02/11/2014', 'MM/dd/yyyy', new Date())`\n   * In this case parsing will be done in the context of the current date.\n   * If `baseDate` is `Invalid Date` or a value not convertible to valid `Date`,\n   * then `Invalid Date` will be returned.\n   *\n   * The result may vary by locale.\n   *\n   * If `formatString` matches with `dateString` but does not provides tokens, `baseDate` will be returned.\n   *\n   * If parsing failed, `Invalid Date` will be returned.\n   * Invalid Date is a Date, whose time value is NaN.\n   * Time value of Date: http://es5.github.io/#x15.9.1.1\n   *\n   * @param {String} dateString - the string to parse\n   * @param {String} formatString - the string of tokens\n   * @param {Date|String|Number} baseDate - defines values missing from the parsed dateString\n   * @param {Options} [options] - the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n   * @param {0|1|2} [options.additionalDigits=2] - passed to `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate}\n   * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n   * @param {0|1|2|3|4|5|6} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday)\n   * @param {1|2|3|4|5|6|7} [options.firstWeekContainsDate=1] - the day of January, which is always in the first week of the year\n   * @param {Boolean} [options.awareOfUnicodeTokens=false] - if true, allows usage of Unicode tokens causes confusion:\n   *   - Some of the day of year tokens (`D`, `DD`) that are confused with the day of month tokens (`d`, `dd`).\n   *   - Some of the local week-numbering year tokens (`YY`, `YYYY`) that are confused with the calendar year tokens (`yy`, `yyyy`).\n   *   See: https://git.io/fxCyr\n   * @returns {Date} the parsed date\n   * @throws {TypeError} 3 arguments required\n   * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n   * @throws {RangeError} `options.weekStartsOn` must be between 0 and 6\n   * @throws {RangeError} `options.firstWeekContainsDate` must be between 1 and 7\n   * @throws {RangeError} `options.locale` must contain `match` property\n   * @throws {RangeError} `options.awareOfUnicodeTokens` must be set to `true` to use `XX` token; see: https://git.io/fxCyr\n   *\n   * @example\n   * // Parse 11 February 2014 from middle-endian format:\n   * var result = parse(\n   *   '02/11/2014',\n   *   'MM/dd/yyyy',\n   *   new Date()\n   * )\n   * //=> Tue Feb 11 2014 00:00:00\n   *\n   * @example\n   * // Parse 28th of February in Esperanto locale in the context of 2010 year:\n   * import eo from 'date-fns/locale/eo'\n   * var result = parse(\n   *   '28-a de februaro',\n   *   \"do 'de' MMMM\",\n   *   new Date(2010, 0, 1),\n   *   {locale: eo}\n   * )\n   * //=> Sun Feb 28 2010 00:00:00\n   */\n  function parse(\n    dirtyDateString,\n    dirtyFormatString,\n    dirtyBaseDate,\n    dirtyOptions\n  ) {\n    if (arguments.length < 3) {\n      throw new TypeError(\n        '3 arguments required, but only ' + arguments.length + ' present'\n      )\n    }\n\n    var dateString = String(dirtyDateString);\n    var formatString = String(dirtyFormatString);\n    var options = dirtyOptions || {};\n\n    var locale$1 = options.locale || locale;\n\n    if (!locale$1.match) {\n      throw new RangeError('locale must contain match property')\n    }\n\n    var localeFirstWeekContainsDate =\n      locale$1.options && locale$1.options.firstWeekContainsDate;\n    var defaultFirstWeekContainsDate =\n      localeFirstWeekContainsDate == null\n        ? 1\n        : toInteger(localeFirstWeekContainsDate);\n    var firstWeekContainsDate =\n      options.firstWeekContainsDate == null\n        ? defaultFirstWeekContainsDate\n        : toInteger(options.firstWeekContainsDate);\n\n    // Test if weekStartsOn is between 1 and 7 _and_ is not NaN\n    if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {\n      throw new RangeError(\n        'firstWeekContainsDate must be between 1 and 7 inclusively'\n      )\n    }\n\n    var localeWeekStartsOn = locale$1.options && locale$1.options.weekStartsOn;\n    var defaultWeekStartsOn =\n      localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);\n    var weekStartsOn =\n      options.weekStartsOn == null\n        ? defaultWeekStartsOn\n        : toInteger(options.weekStartsOn);\n\n    // Test if weekStartsOn is between 0 and 6 _and_ is not NaN\n    if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {\n      throw new RangeError('weekStartsOn must be between 0 and 6 inclusively')\n    }\n\n    if (formatString === '') {\n      if (dateString === '') {\n        return toDate(dirtyBaseDate, options)\n      } else {\n        return new Date(NaN)\n      }\n    }\n\n    var subFnOptions = {\n      firstWeekContainsDate: firstWeekContainsDate,\n      weekStartsOn: weekStartsOn,\n      locale: locale$1\n    };\n\n    // If timezone isn't specified, it will be set to the system timezone\n    var setters = [\n      {\n        priority: TIMEZONE_UNIT_PRIORITY,\n        set: dateToSystemTimezone,\n        index: 0\n      }\n    ];\n\n    var i;\n\n    var tokens = formatString.match(formattingTokensRegExp$1);\n\n    for (i = 0; i < tokens.length; i++) {\n      var token = tokens[i];\n\n      if (!options.awareOfUnicodeTokens && isProtectedToken(token)) {\n        throwProtectedError(token);\n      }\n\n      var firstCharacter = token[0];\n      var parser = parsers[firstCharacter];\n      if (parser) {\n        var parseResult = parser.parse(\n          dateString,\n          token,\n          locale$1.match,\n          subFnOptions\n        );\n\n        if (!parseResult) {\n          return new Date(NaN)\n        }\n\n        setters.push({\n          priority: parser.priority,\n          set: parser.set,\n          validate: parser.validate,\n          value: parseResult.value,\n          index: setters.length\n        });\n\n        dateString = parseResult.rest;\n      } else {\n        // Replace two single quote characters with one single quote character\n        if (token === \"''\") {\n          token = \"'\";\n        } else if (firstCharacter === \"'\") {\n          token = cleanEscapedString$1(token);\n        }\n\n        // Cut token from string, or, if string doesn't match the token, return Invalid Date\n        if (dateString.indexOf(token) === 0) {\n          dateString = dateString.slice(token.length);\n        } else {\n          return new Date(NaN)\n        }\n      }\n    }\n\n    // Check if the remaining input contains something other than whitespace\n    if (dateString.length > 0 && notWhitespaceRegExp.test(dateString)) {\n      return new Date(NaN)\n    }\n\n    var uniquePrioritySetters = setters\n      .map(function(setter) {\n        return setter.priority\n      })\n      .sort(function(a, b) {\n        return b - a\n      })\n      .filter(function(priority, index, array) {\n        return array.indexOf(priority) === index\n      })\n      .map(function(priority) {\n        return setters\n          .filter(function(setter) {\n            return setter.priority === priority\n          })\n          .reverse()\n      })\n      .map(function(setterArray) {\n        return setterArray[0]\n      });\n\n    var date = toDate(dirtyBaseDate, options);\n\n    if (isNaN(date)) {\n      return new Date(NaN)\n    }\n\n    // Convert the date in system timezone to the same date in UTC+00:00 timezone.\n    // This ensures that when UTC functions will be implemented, locales will be compatible with them.\n    // See an issue about UTC functions: https://github.com/date-fns/date-fns/issues/37\n    var utcDate = subMilliseconds(date, getTimezoneOffsetInMilliseconds(date));\n\n    for (i = 0; i < uniquePrioritySetters.length; i++) {\n      var setter = uniquePrioritySetters[i];\n\n      if (\n        setter.validate &&\n        !setter.validate(utcDate, setter.value, subFnOptions)\n      ) {\n        return new Date(NaN)\n      }\n\n      utcDate = setter.set(utcDate, setter.value, subFnOptions);\n    }\n\n    return utcDate\n  }\n\n  function dateToSystemTimezone(date) {\n    var convertedDate = new Date(0);\n    convertedDate.setFullYear(\n      date.getUTCFullYear(),\n      date.getUTCMonth(),\n      date.getUTCDate()\n    );\n    convertedDate.setHours(\n      date.getUTCHours(),\n      date.getUTCMinutes(),\n      date.getUTCSeconds(),\n      date.getUTCMilliseconds()\n    );\n    return convertedDate\n  }\n\n  function cleanEscapedString$1(input) {\n    return input.match(escapedStringRegExp$1)[1].replace(doubleQuoteRegExp$1, \"'\")\n  }\n\n  // \n\n  /**\n   * Custom parse behavior on top of date-fns parse function.\n   */\n  function parseDate$1 (date, format$1) {\n    if (typeof date !== 'string') {\n      return isValid(date) ? date : null;\n    }\n\n    var parsed = parse(date, format$1, new Date());\n\n    // if date is not valid or the formatted output after parsing does not match\n    // the string value passed in (avoids overflows)\n    if (!isValid(parsed) || format(parsed, format$1) !== date) {\n      return null;\n    }\n\n    return parsed;\n  }\n\n  var afterValidator = function (value, ref) {\n    if ( ref === void 0 ) ref = {};\n    var targetValue = ref.targetValue;\n    var inclusion = ref.inclusion; if ( inclusion === void 0 ) inclusion = false;\n    var format = ref.format;\n\n    if (typeof format === 'undefined') {\n      format = inclusion;\n      inclusion = false;\n    }\n\n    value = parseDate$1(value, format);\n    targetValue = parseDate$1(targetValue, format);\n\n    // if either is not valid.\n    if (!value || !targetValue) {\n      return false;\n    }\n\n    return isAfter(value, targetValue) || (inclusion && isEqual(value, targetValue));\n  };\n\n  var options = {\n    hasTarget: true,\n    isDate: true\n  };\n\n  // required to convert from a list of array values to an object.\n  var paramNames = ['targetValue', 'inclusion', 'format'];\n\n  var after = {\n    validate: afterValidator,\n    options: options,\n    paramNames: paramNames\n  };\n\n  /**\n   * Some Alpha Regex helpers.\n   * https://github.com/chriso/validator.js/blob/master/src/lib/alpha.js\n   */\n\n  var alpha = {\n    en: /^[A-Z]*$/i,\n    cs: /^[A-ZÃ�ÄŒÄŽÃ‰ÄšÃ�Å‡Ã“Å˜Å Å¤ÃšÅ®Ã�Å½]*$/i,\n    da: /^[A-ZÃ†Ã˜Ã…]*$/i,\n    de: /^[A-ZÃ„Ã–ÃœÃŸ]*$/i,\n    es: /^[A-ZÃ�Ã‰Ã�Ã‘Ã“ÃšÃœ]*$/i,\n    fr: /^[A-ZÃ€Ã‚Ã†Ã‡Ã‰ÃˆÃŠÃ‹Ã�ÃŽÃ”Å’Ã™Ã›ÃœÅ¸]*$/i,\n    it: /^[A-Z\\xC0-\\xFF]*$/i,\n    lt: /^[A-ZÄ„ÄŒÄ˜Ä–Ä®Å Å²ÅªÅ½]*$/i,\n    nl: /^[A-ZÃ‰Ã‹Ã�Ã“Ã–Ãœ]*$/i,\n    hu: /^[A-ZÃ�Ã‰Ã�Ã“Ã–Å�ÃšÃœÅ°]*$/i,\n    pl: /^[A-ZÄ„Ä†Ä˜ÅšÅ�ÅƒÃ“Å»Å¹]*$/i,\n    pt: /^[A-ZÃƒÃ�Ã€Ã‚Ã‡Ã‰ÃŠÃ�Ã•Ã“Ã”ÃšÃœ]*$/i,\n    ru: /^[Ð�-Ð¯Ð�]*$/i,\n    sk: /^[A-ZÃ�Ã„ÄŒÄŽÃ‰Ã�Ä¹Ä½Å‡Ã“Å”Å Å¤ÃšÃ�Å½]*$/i,\n    sr: /^[A-ZÄŒÄ†Å½Å Ä�]*$/i,\n    sv: /^[A-ZÃ…Ã„Ã–]*$/i,\n    tr: /^[A-ZÃ‡ÄžÄ°Ä±Ã–ÅžÃœ]*$/i,\n    uk: /^[Ð�-Ð©Ð¬Ð®Ð¯Ð„Ð†Ð‡Ò�]*$/i,\n    ar: /^[Ø¡Ø¢Ø£Ø¤Ø¥Ø¦Ø§Ø¨Ø©ØªØ«Ø¬Ø­Ø®Ø¯Ø°Ø±Ø²Ø³Ø´ØµØ¶Ø·Ø¸Ø¹ØºÙ�Ù‚ÙƒÙ„Ù…Ù†Ù‡ÙˆÙ‰ÙŠÙ‹ÙŒÙ�ÙŽÙ�Ù�Ù‘Ù’Ù°]*$/,\n    az: /^[A-ZÃ‡Æ�ÄžÄ°Ä±Ã–ÅžÃœ]*$/i\n  };\n\n  var alphaSpaces = {\n    en: /^[A-Z\\s]*$/i,\n    cs: /^[A-ZÃ�ÄŒÄŽÃ‰ÄšÃ�Å‡Ã“Å˜Å Å¤ÃšÅ®Ã�Å½\\s]*$/i,\n    da: /^[A-ZÃ†Ã˜Ã…\\s]*$/i,\n    de: /^[A-ZÃ„Ã–ÃœÃŸ\\s]*$/i,\n    es: /^[A-ZÃ�Ã‰Ã�Ã‘Ã“ÃšÃœ\\s]*$/i,\n    fr: /^[A-ZÃ€Ã‚Ã†Ã‡Ã‰ÃˆÃŠÃ‹Ã�ÃŽÃ”Å’Ã™Ã›ÃœÅ¸\\s]*$/i,\n    it: /^[A-Z\\xC0-\\xFF\\s]*$/i,\n    lt: /^[A-ZÄ„ÄŒÄ˜Ä–Ä®Å Å²ÅªÅ½\\s]*$/i,\n    nl: /^[A-ZÃ‰Ã‹Ã�Ã“Ã–Ãœ\\s]*$/i,\n    hu: /^[A-ZÃ�Ã‰Ã�Ã“Ã–Å�ÃšÃœÅ°\\s]*$/i,\n    pl: /^[A-ZÄ„Ä†Ä˜ÅšÅ�ÅƒÃ“Å»Å¹\\s]*$/i,\n    pt: /^[A-ZÃƒÃ�Ã€Ã‚Ã‡Ã‰ÃŠÃ�Ã•Ã“Ã”ÃšÃœ\\s]*$/i,\n    ru: /^[Ð�-Ð¯Ð�\\s]*$/i,\n    sk: /^[A-ZÃ�Ã„ÄŒÄŽÃ‰Ã�Ä¹Ä½Å‡Ã“Å”Å Å¤ÃšÃ�Å½\\s]*$/i,\n    sr: /^[A-ZÄŒÄ†Å½Å Ä�\\s]*$/i,\n    sv: /^[A-ZÃ…Ã„Ã–\\s]*$/i,\n    tr: /^[A-ZÃ‡ÄžÄ°Ä±Ã–ÅžÃœ\\s]*$/i,\n    uk: /^[Ð�-Ð©Ð¬Ð®Ð¯Ð„Ð†Ð‡Ò�\\s]*$/i,\n    ar: /^[Ø¡Ø¢Ø£Ø¤Ø¥Ø¦Ø§Ø¨Ø©ØªØ«Ø¬Ø­Ø®Ø¯Ø°Ø±Ø²Ø³Ø´ØµØ¶Ø·Ø¸Ø¹ØºÙ�Ù‚ÙƒÙ„Ù…Ù†Ù‡ÙˆÙ‰ÙŠÙ‹ÙŒÙ�ÙŽÙ�Ù�Ù‘Ù’Ù°\\s]*$/,\n    az: /^[A-ZÃ‡Æ�ÄžÄ°Ä±Ã–ÅžÃœ\\s]*$/i\n  };\n\n  var alphanumeric = {\n    en: /^[0-9A-Z]*$/i,\n    cs: /^[0-9A-ZÃ�ÄŒÄŽÃ‰ÄšÃ�Å‡Ã“Å˜Å Å¤ÃšÅ®Ã�Å½]*$/i,\n    da: /^[0-9A-ZÃ†Ã˜Ã…]$/i,\n    de: /^[0-9A-ZÃ„Ã–ÃœÃŸ]*$/i,\n    es: /^[0-9A-ZÃ�Ã‰Ã�Ã‘Ã“ÃšÃœ]*$/i,\n    fr: /^[0-9A-ZÃ€Ã‚Ã†Ã‡Ã‰ÃˆÃŠÃ‹Ã�ÃŽÃ”Å’Ã™Ã›ÃœÅ¸]*$/i,\n    it: /^[0-9A-Z\\xC0-\\xFF]*$/i,\n    lt: /^[0-9A-ZÄ„ÄŒÄ˜Ä–Ä®Å Å²ÅªÅ½]*$/i,\n    hu: /^[0-9A-ZÃ�Ã‰Ã�Ã“Ã–Å�ÃšÃœÅ°]*$/i,\n    nl: /^[0-9A-ZÃ‰Ã‹Ã�Ã“Ã–Ãœ]*$/i,\n    pl: /^[0-9A-ZÄ„Ä†Ä˜ÅšÅ�ÅƒÃ“Å»Å¹]*$/i,\n    pt: /^[0-9A-ZÃƒÃ�Ã€Ã‚Ã‡Ã‰ÃŠÃ�Ã•Ã“Ã”ÃšÃœ]*$/i,\n    ru: /^[0-9Ð�-Ð¯Ð�]*$/i,\n    sk: /^[0-9A-ZÃ�Ã„ÄŒÄŽÃ‰Ã�Ä¹Ä½Å‡Ã“Å”Å Å¤ÃšÃ�Å½]*$/i,\n    sr: /^[0-9A-ZÄŒÄ†Å½Å Ä�]*$/i,\n    sv: /^[0-9A-ZÃ…Ã„Ã–]*$/i,\n    tr: /^[0-9A-ZÃ‡ÄžÄ°Ä±Ã–ÅžÃœ]*$/i,\n    uk: /^[0-9Ð�-Ð©Ð¬Ð®Ð¯Ð„Ð†Ð‡Ò�]*$/i,\n    ar: /^[Ù Ù¡Ù¢Ù£Ù¤Ù¥Ù¦Ù§Ù¨Ù©0-9Ø¡Ø¢Ø£Ø¤Ø¥Ø¦Ø§Ø¨Ø©ØªØ«Ø¬Ø­Ø®Ø¯Ø°Ø±Ø²Ø³Ø´ØµØ¶Ø·Ø¸Ø¹ØºÙ�Ù‚ÙƒÙ„Ù…Ù†Ù‡ÙˆÙ‰ÙŠÙ‹ÙŒÙ�ÙŽÙ�Ù�Ù‘Ù’Ù°]*$/,\n    az: /^[0-9A-ZÃ‡Æ�ÄžÄ°Ä±Ã–ÅžÃœ]*$/i\n  };\n\n  var alphaDash = {\n    en: /^[0-9A-Z_-]*$/i,\n    cs: /^[0-9A-ZÃ�ÄŒÄŽÃ‰ÄšÃ�Å‡Ã“Å˜Å Å¤ÃšÅ®Ã�Å½_-]*$/i,\n    da: /^[0-9A-ZÃ†Ã˜Ã…_-]*$/i,\n    de: /^[0-9A-ZÃ„Ã–ÃœÃŸ_-]*$/i,\n    es: /^[0-9A-ZÃ�Ã‰Ã�Ã‘Ã“ÃšÃœ_-]*$/i,\n    fr: /^[0-9A-ZÃ€Ã‚Ã†Ã‡Ã‰ÃˆÃŠÃ‹Ã�ÃŽÃ”Å’Ã™Ã›ÃœÅ¸_-]*$/i,\n    it: /^[0-9A-Z\\xC0-\\xFF_-]*$/i,\n    lt: /^[0-9A-ZÄ„ÄŒÄ˜Ä–Ä®Å Å²ÅªÅ½_-]*$/i,\n    nl: /^[0-9A-ZÃ‰Ã‹Ã�Ã“Ã–Ãœ_-]*$/i,\n    hu: /^[0-9A-ZÃ�Ã‰Ã�Ã“Ã–Å�ÃšÃœÅ°_-]*$/i,\n    pl: /^[0-9A-ZÄ„Ä†Ä˜ÅšÅ�ÅƒÃ“Å»Å¹_-]*$/i,\n    pt: /^[0-9A-ZÃƒÃ�Ã€Ã‚Ã‡Ã‰ÃŠÃ�Ã•Ã“Ã”ÃšÃœ_-]*$/i,\n    ru: /^[0-9Ð�-Ð¯Ð�_-]*$/i,\n    sk: /^[0-9A-ZÃ�Ã„ÄŒÄŽÃ‰Ã�Ä¹Ä½Å‡Ã“Å”Å Å¤ÃšÃ�Å½_-]*$/i,\n    sr: /^[0-9A-ZÄŒÄ†Å½Å Ä�_-]*$/i,\n    sv: /^[0-9A-ZÃ…Ã„Ã–_-]*$/i,\n    tr: /^[0-9A-ZÃ‡ÄžÄ°Ä±Ã–ÅžÃœ_-]*$/i,\n    uk: /^[0-9Ð�-Ð©Ð¬Ð®Ð¯Ð„Ð†Ð‡Ò�_-]*$/i,\n    ar: /^[Ù Ù¡Ù¢Ù£Ù¤Ù¥Ù¦Ù§Ù¨Ù©0-9Ø¡Ø¢Ø£Ø¤Ø¥Ø¦Ø§Ø¨Ø©ØªØ«Ø¬Ø­Ø®Ø¯Ø°Ø±Ø²Ø³Ø´ØµØ¶Ø·Ø¸Ø¹ØºÙ�Ù‚ÙƒÙ„Ù…Ù†Ù‡ÙˆÙ‰ÙŠÙ‹ÙŒÙ�ÙŽÙ�Ù�Ù‘Ù’Ù°_-]*$/,\n    az: /^[0-9A-ZÃ‡Æ�ÄžÄ°Ä±Ã–ÅžÃœ_-]*$/i\n  };\n\n  var validate = function (value, ref) {\n    if ( ref === void 0 ) ref = {};\n    var locale = ref.locale;\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return validate(val, [locale]); });\n    }\n\n    // Match at least one locale.\n    if (! locale) {\n      return Object.keys(alpha).some(function (loc) { return alpha[loc].test(value); });\n    }\n\n    return (alpha[locale] || alpha.en).test(value);\n  };\n\n  var paramNames$1 = ['locale'];\n\n  var alpha$1 = {\n    validate: validate,\n    paramNames: paramNames$1\n  };\n\n  var validate$1 = function (value, ref) {\n    if ( ref === void 0 ) ref = {};\n    var locale = ref.locale;\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return validate$1(val, [locale]); });\n    }\n\n    // Match at least one locale.\n    if (! locale) {\n      return Object.keys(alphaDash).some(function (loc) { return alphaDash[loc].test(value); });\n    }\n\n    return (alphaDash[locale] || alphaDash.en).test(value);\n  };\n\n  var paramNames$2 = ['locale'];\n\n  var alpha_dash = {\n    validate: validate$1,\n    paramNames: paramNames$2\n  };\n\n  var validate$2 = function (value, ref) {\n    if ( ref === void 0 ) ref = {};\n    var locale = ref.locale;\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return validate$2(val, [locale]); });\n    }\n\n    // Match at least one locale.\n    if (! locale) {\n      return Object.keys(alphanumeric).some(function (loc) { return alphanumeric[loc].test(value); });\n    }\n\n    return (alphanumeric[locale] || alphanumeric.en).test(value);\n  };\n\n  var paramNames$3 = ['locale'];\n\n  var alpha_num = {\n    validate: validate$2,\n    paramNames: paramNames$3\n  };\n\n  var validate$3 = function (value, ref) {\n    if ( ref === void 0 ) ref = {};\n    var locale = ref.locale;\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return validate$3(val, [locale]); });\n    }\n\n    // Match at least one locale.\n    if (! locale) {\n      return Object.keys(alphaSpaces).some(function (loc) { return alphaSpaces[loc].test(value); });\n    }\n\n    return (alphaSpaces[locale] || alphaSpaces.en).test(value);\n  };\n\n  var paramNames$4 = ['locale'];\n\n  var alpha_spaces = {\n    validate: validate$3,\n    paramNames: paramNames$4\n  };\n\n  var validate$4 = function (value, ref) {\n    if ( ref === void 0 ) ref = {};\n    var targetValue = ref.targetValue;\n    var inclusion = ref.inclusion; if ( inclusion === void 0 ) inclusion = false;\n    var format = ref.format;\n\n    if (typeof format === 'undefined') {\n      format = inclusion;\n      inclusion = false;\n    }\n\n    value = parseDate$1(value, format);\n    targetValue = parseDate$1(targetValue, format);\n\n    // if either is not valid.\n    if (!value || !targetValue) {\n      return false;\n    }\n\n    return isBefore(value, targetValue) || (inclusion && isEqual(value, targetValue));\n  };\n\n  var options$1 = {\n    hasTarget: true,\n    isDate: true\n  };\n\n  var paramNames$5 = ['targetValue', 'inclusion', 'format'];\n\n  var before = {\n    validate: validate$4,\n    options: options$1,\n    paramNames: paramNames$5\n  };\n\n  var validate$5 = function (value, ref) {\n    if ( ref === void 0 ) ref = {};\n    var min = ref.min;\n    var max = ref.max;\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return validate$5(val, { min: min, max: max }); });\n    }\n\n    return Number(min) <= value && Number(max) >= value;\n  };\n\n  var paramNames$6 = ['min', 'max'];\n\n  var between = {\n    validate: validate$5,\n    paramNames: paramNames$6\n  };\n\n  var validate$6 = function (value, ref) {\n    var targetValue = ref.targetValue;\n\n    return String(value) === String(targetValue);\n  };\n  var options$2 = {\n    hasTarget: true\n  };\n\n  var paramNames$7 = ['targetValue'];\n\n  var confirmed = {\n    validate: validate$6,\n    options: options$2,\n    paramNames: paramNames$7\n  };\n\n  function unwrapExports (x) {\n  \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n  }\n\n  function createCommonjsModule(fn, module) {\n  \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n  }\n\n  var assertString_1 = createCommonjsModule(function (module, exports) {\n\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n  exports.default = assertString;\n\n  function _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n  function assertString(input) {\n    var isString = typeof input === 'string' || input instanceof String;\n\n    if (!isString) {\n      var invalidType;\n\n      if (input === null) {\n        invalidType = 'null';\n      } else {\n        invalidType = _typeof(input);\n\n        if (invalidType === 'object' && input.constructor && input.constructor.hasOwnProperty('name')) {\n          invalidType = input.constructor.name;\n        } else {\n          invalidType = \"a \".concat(invalidType);\n        }\n      }\n\n      throw new TypeError(\"Expected string but received \".concat(invalidType, \".\"));\n    }\n  }\n\n  module.exports = exports.default;\n  module.exports.default = exports.default;\n  });\n\n  unwrapExports(assertString_1);\n\n  var isCreditCard_1 = createCommonjsModule(function (module, exports) {\n\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n  exports.default = isCreditCard;\n\n  var _assertString = _interopRequireDefault(assertString_1);\n\n  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n  /* eslint-disable max-len */\n  var creditCard = /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11}|6[27][0-9]{14})$/;\n  /* eslint-enable max-len */\n\n  function isCreditCard(str) {\n    (0, _assertString.default)(str);\n    var sanitized = str.replace(/[- ]+/g, '');\n\n    if (!creditCard.test(sanitized)) {\n      return false;\n    }\n\n    var sum = 0;\n    var digit;\n    var tmpNum;\n    var shouldDouble;\n\n    for (var i = sanitized.length - 1; i >= 0; i--) {\n      digit = sanitized.substring(i, i + 1);\n      tmpNum = parseInt(digit, 10);\n\n      if (shouldDouble) {\n        tmpNum *= 2;\n\n        if (tmpNum >= 10) {\n          sum += tmpNum % 10 + 1;\n        } else {\n          sum += tmpNum;\n        }\n      } else {\n        sum += tmpNum;\n      }\n\n      shouldDouble = !shouldDouble;\n    }\n\n    return !!(sum % 10 === 0 ? sanitized : false);\n  }\n\n  module.exports = exports.default;\n  module.exports.default = exports.default;\n  });\n\n  var isCreditCard = unwrapExports(isCreditCard_1);\n\n  var validate$7 = function (value) { return isCreditCard(String(value)); };\n\n  var credit_card = {\n    validate: validate$7\n  };\n\n  var validate$8 = function (value, ref) {\n    if ( ref === void 0 ) ref = {};\n    var min = ref.min;\n    var max = ref.max;\n    var inclusivity = ref.inclusivity; if ( inclusivity === void 0 ) inclusivity = '()';\n    var format = ref.format;\n\n    if (typeof format === 'undefined') {\n      format = inclusivity;\n      inclusivity = '()';\n    }\n\n    var minDate = parseDate$1(String(min), format);\n    var maxDate = parseDate$1(String(max), format);\n    var dateVal = parseDate$1(String(value), format);\n\n    if (!minDate || !maxDate || !dateVal) {\n      return false;\n    }\n\n    if (inclusivity === '()') {\n      return isAfter(dateVal, minDate) && isBefore(dateVal, maxDate);\n    }\n\n    if (inclusivity === '(]') {\n      return isAfter(dateVal, minDate) && (isEqual(dateVal, maxDate) || isBefore(dateVal, maxDate));\n    }\n\n    if (inclusivity === '[)') {\n      return isBefore(dateVal, maxDate) && (isEqual(dateVal, minDate) || isAfter(dateVal, minDate));\n    }\n\n    return isEqual(dateVal, maxDate) || isEqual(dateVal, minDate) ||\n      (isBefore(dateVal, maxDate) && isAfter(dateVal, minDate));\n  };\n\n  var options$3 = {\n    isDate: true\n  };\n\n  var paramNames$8 = ['min', 'max', 'inclusivity', 'format'];\n\n  var date_between = {\n    validate: validate$8,\n    options: options$3,\n    paramNames: paramNames$8\n  };\n\n  var validate$9 = function (value, ref) {\n    var format = ref.format;\n\n    return !!parseDate$1(value, format);\n  };\n\n  var options$4 = {\n    isDate: true\n  };\n\n  var paramNames$9 = ['format'];\n\n  var date_format = {\n    validate: validate$9,\n    options: options$4,\n    paramNames: paramNames$9\n  };\n\n  // \n\n  var isTextInput = function (el) {\n    return includes(['text', 'password', 'search', 'email', 'tel', 'url', 'textarea', 'number'], el.type);\n  };\n\n  var isCheckboxOrRadioInput = function (el) {\n    return includes(['radio', 'checkbox'], el.type);\n  };\n\n  var isDateInput = function (el) {\n    return includes(['date', 'week', 'month', 'datetime-local', 'time'], el.type);\n  };\n\n  /**\n   * Gets the data attribute. the name must be kebab-case.\n   */\n  var getDataAttribute = function (el, name) { return el.getAttribute((\"data-vv-\" + name)); };\n\n  var isNaN$1 = function (value) {\n    if ('isNaN' in Number) {\n      return Number.isNaN(value);\n    }\n\n    // eslint-disable-next-line\n    return typeof(value) === 'number' && value !== value;\n  };\n\n  /**\n   * Checks if the values are either null or undefined.\n   */\n  var isNullOrUndefined = function () {\n    var values = [], len = arguments.length;\n    while ( len-- ) values[ len ] = arguments[ len ];\n\n    return values.every(function (value) {\n      return value === null || value === undefined;\n    });\n  };\n\n  /**\n   * Creates the default flags object.\n   */\n  var createFlags = function () { return ({\n    untouched: true,\n    touched: false,\n    dirty: false,\n    pristine: true,\n    valid: null,\n    invalid: null,\n    validated: false,\n    pending: false,\n    required: false,\n    changed: false\n  }); };\n\n  /**\n   * Shallow object comparison.\n   */\n  var isEqual$1 = function (lhs, rhs) {\n    if (lhs instanceof RegExp && rhs instanceof RegExp) {\n      return isEqual$1(lhs.source, rhs.source) && isEqual$1(lhs.flags, rhs.flags);\n    }\n\n    if (Array.isArray(lhs) && Array.isArray(rhs)) {\n      if (lhs.length !== rhs.length) { return false; }\n\n      for (var i = 0; i < lhs.length; i++) {\n        if (!isEqual$1(lhs[i], rhs[i])) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n    // if both are objects, compare each key recursively.\n    if (isObject(lhs) && isObject(rhs)) {\n      return Object.keys(lhs).every(function (key) {\n        return isEqual$1(lhs[key], rhs[key]);\n      }) && Object.keys(rhs).every(function (key) {\n        return isEqual$1(lhs[key], rhs[key]);\n      });\n    }\n\n    if (isNaN$1(lhs) && isNaN$1(rhs)) {\n      return true;\n    }\n\n    return lhs === rhs;\n  };\n\n  /**\n   * Determines the input field scope.\n   */\n  var getScope = function (el) {\n    var scope = getDataAttribute(el, 'scope');\n    if (isNullOrUndefined(scope)) {\n      var form = getForm(el);\n\n      if (form) {\n        scope = getDataAttribute(form, 'scope');\n      }\n    }\n\n    return !isNullOrUndefined(scope) ? scope : null;\n  };\n\n  /**\n   * Get the closest form element.\n   */\n  var getForm = function (el) {\n    if (isNullOrUndefined(el)) { return null; }\n\n    if (el.tagName === 'FORM') { return el; }\n\n    if (!isNullOrUndefined(el.form)) { return el.form; }\n\n    return !isNullOrUndefined(el.parentNode) ? getForm(el.parentNode) : null;\n  };\n\n  /**\n   * Gets the value in an object safely.\n   */\n  var getPath = function (path, target, def) {\n    if ( def === void 0 ) def = undefined;\n\n    if (!path || !target) { return def; }\n\n    var value = target;\n    path.split('.').every(function (prop) {\n      if (prop in value) {\n        value = value[prop];\n\n        return true;\n      }\n\n      value = def;\n\n      return false;\n    });\n\n    return value;\n  };\n\n  /**\n   * Checks if path exists within an object.\n   */\n  var hasPath = function (path, target) {\n    var obj = target;\n    var previousPath = null;\n    var isNullOrNonObject = false;\n    var isValidPath = path.split('.').reduce(function (reducer, prop) {\n      if (obj == null || typeof obj !== 'object') {\n        isNullOrNonObject = true;\n        return reducer && false;\n      }\n\n      if (prop in obj) {\n        obj = obj[prop];\n        previousPath = previousPath === null ? prop : previousPath + '.' + prop;\n\n        return reducer && true;\n      }\n\n      return reducer && false;\n    }, true);\n\n    {\n      if (isNullOrNonObject) {\n        throw new Error(previousPath + ' is not an object');\n      }\n    }\n\n    return isValidPath;\n  };\n\n  /**\n   * Parses a rule string expression.\n   */\n  var parseRule = function (rule) {\n    var params = [];\n    var name = rule.split(':')[0];\n\n    if (includes(rule, ':')) {\n      params = rule.split(':').slice(1).join(':').split(',');\n    }\n\n    return { name: name, params: params };\n  };\n\n  /**\n   * Debounces a function.\n   */\n  var debounce = function (fn, wait, token) {\n    if ( wait === void 0 ) wait = 0;\n    if ( token === void 0 ) token = { cancelled: false };\n\n    if (wait === 0) {\n      return fn;\n    }\n\n    var timeout;\n\n    return function () {\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n\n      var later = function () {\n        timeout = null;\n\n        // check if the fn call was cancelled.\n        if (!token.cancelled) { fn.apply(void 0, args); }\n      };\n\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n      if (!timeout) { fn.apply(void 0, args); }\n    };\n  };\n\n  /**\n   * Appends a rule definition to a list of rules.\n   */\n  var appendRule = function (rule, rules) {\n    if (!rules) {\n      return normalizeRules(rule);\n    }\n\n    if (!rule) {\n      return normalizeRules(rules);\n    }\n\n    if (typeof rules === 'string') {\n      rules = normalizeRules(rules);\n    }\n\n    return assign({}, rules, normalizeRules(rule));\n  };\n\n  /**\n   * Normalizes the given rules expression.\n   */\n  var normalizeRules = function (rules) {\n    // if falsy value return an empty object.\n    if (!rules) {\n      return {};\n    }\n\n    if (isObject(rules)) {\n      // $FlowFixMe\n      return Object.keys(rules).reduce(function (prev, curr) {\n        var params = [];\n        // $FlowFixMe\n        if (rules[curr] === true) {\n          params = [];\n        } else if (Array.isArray(rules[curr])) {\n          params = rules[curr];\n        } else if (isObject(rules[curr])) {\n          params = rules[curr];\n        } else {\n          params = [rules[curr]];\n        }\n\n        // $FlowFixMe\n        if (rules[curr] !== false) {\n          prev[curr] = params;\n        }\n\n        return prev;\n      }, {});\n    }\n\n    if (typeof rules !== 'string') {\n      warn('rules must be either a string or an object.');\n      return {};\n    }\n\n    return rules.split('|').reduce(function (prev, rule) {\n      var parsedRule = parseRule(rule);\n      if (!parsedRule.name) {\n        return prev;\n      }\n\n      prev[parsedRule.name] = parsedRule.params;\n      return prev;\n    }, {});\n  };\n\n  /**\n   * Emits a warning to the console.\n   */\n  var warn = function (message) {\n    console.warn((\"[vee-validate] \" + message)); // eslint-disable-line\n  };\n\n  /**\n   * Creates a branded error object.\n   */\n  var createError = function (message) { return new Error((\"[vee-validate] \" + message)); };\n\n  /**\n   * Checks if the value is an object.\n   */\n  var isObject = function (obj) { return obj !== null && obj && typeof obj === 'object' && ! Array.isArray(obj); };\n\n  /**\n   * Checks if a function is callable.\n   */\n  var isCallable = function (func) { return typeof func === 'function'; };\n\n  /**\n   * Check if element has the css class on it.\n   */\n  var hasClass = function (el, className) {\n    if (el.classList) {\n      return el.classList.contains(className);\n    }\n\n    return !!el.className.match(new RegExp((\"(\\\\s|^)\" + className + \"(\\\\s|$)\")));\n  };\n\n  /**\n   * Adds the provided css className to the element.\n   */\n  var addClass = function (el, className) {\n    if (el.classList) {\n      el.classList.add(className);\n      return;\n    }\n\n    if (!hasClass(el, className)) {\n      el.className += \" \" + className;\n    }\n  };\n\n  /**\n   * Remove the provided css className from the element.\n   */\n  var removeClass = function (el, className) {\n    if (el.classList) {\n      el.classList.remove(className);\n      return;\n    }\n\n    if (hasClass(el, className)) {\n      var reg = new RegExp((\"(\\\\s|^)\" + className + \"(\\\\s|$)\"));\n      el.className = el.className.replace(reg, ' ');\n    }\n  };\n\n  /**\n   * Adds or removes a class name on the input depending on the status flag.\n   */\n  var toggleClass = function (el, className, status) {\n    if (!el || !className) { return; }\n\n    if (Array.isArray(className)) {\n      className.forEach(function (item) { return toggleClass(el, item, status); });\n      return;\n    }\n\n    if (status) {\n      return addClass(el, className);\n    }\n\n    removeClass(el, className);\n  };\n\n  /**\n   * Converts an array-like object to array, provides a simple polyfill for Array.from\n   */\n  var toArray = function (arrayLike) {\n    if (isCallable(Array.from)) {\n      return Array.from(arrayLike);\n    }\n\n    var array = [];\n    var length = arrayLike.length;\n    /* istanbul ignore next */\n    for (var i = 0; i < length; i++) {\n      array.push(arrayLike[i]);\n    }\n\n    /* istanbul ignore next */\n    return array;\n  };\n\n  /**\n   * Converts an array-like object to array and place other elements in an array\n   */\n  var ensureArray = function (arrayLike) {\n    if (Array.isArray(arrayLike)) {\n      return [].concat( arrayLike );\n    }\n    var array = toArray(arrayLike);\n    return isEmptyArray(array) ? [arrayLike] : array;\n  };\n\n  /**\n   * Assign polyfill from the mdn.\n   */\n  var assign = function (target) {\n    var others = [], len = arguments.length - 1;\n    while ( len-- > 0 ) others[ len ] = arguments[ len + 1 ];\n\n    /* istanbul ignore else */\n    if (isCallable(Object.assign)) {\n      return Object.assign.apply(Object, [ target ].concat( others ));\n    }\n\n    /* istanbul ignore next */\n    if (target == null) {\n      throw new TypeError('Cannot convert undefined or null to object');\n    }\n\n    /* istanbul ignore next */\n    var to = Object(target);\n    /* istanbul ignore next */\n    others.forEach(function (arg) {\n      // Skip over if undefined or null\n      if (arg != null) {\n        Object.keys(arg).forEach(function (key) {\n          to[key] = arg[key];\n        });\n      }\n    });\n    /* istanbul ignore next */\n    return to;\n  };\n\n  var id = 0;\n  var idTemplate = '{id}';\n\n  /**\n   * Generates a unique id.\n   */\n  var uniqId = function () {\n    // handle too many uses of uniqId, although unlikely.\n    if (id >= 9999) {\n      id = 0;\n      // shift the template.\n      idTemplate = idTemplate.replace('{id}', '_{id}');\n    }\n\n    id++;\n    var newId = idTemplate.replace('{id}', String(id));\n\n    return newId;\n  };\n\n  var findIndex = function (arrayLike, predicate) {\n    var array = Array.isArray(arrayLike) ? arrayLike : toArray(arrayLike);\n    for (var i = 0; i < array.length; i++) {\n      if (predicate(array[i])) {\n        return i;\n      }\n    }\n\n    return -1;\n  };\n\n  /**\n   * finds the first element that satisfies the predicate callback, polyfills array.find\n   */\n  var find = function (arrayLike, predicate) {\n    var array = Array.isArray(arrayLike) ? arrayLike : toArray(arrayLike);\n    var idx = findIndex(array, predicate);\n\n    return idx === -1 ? undefined : array[idx];\n  };\n\n  var isBuiltInComponent = function (vnode) {\n    if (!vnode) {\n      return false;\n    }\n\n    var tag = vnode.componentOptions.tag;\n\n    return /^(keep-alive|transition|transition-group)$/.test(tag);\n  };\n\n  var makeDelayObject = function (events, delay, delayConfig) {\n    if (typeof delay === 'number') {\n      return events.reduce(function (prev, e) {\n        prev[e] = delay;\n        return prev;\n      }, {});\n    }\n\n    return events.reduce(function (prev, e) {\n      if (typeof delay === 'object' && e in delay) {\n        prev[e] = delay[e];\n        return prev;\n      }\n\n      if (typeof delayConfig === 'number') {\n        prev[e] = delayConfig;\n        return prev;\n      }\n\n      prev[e] = (delayConfig && delayConfig[e]) || 0;\n\n      return prev;\n    }, {});\n  };\n\n  var deepParseInt = function (input) {\n    if (typeof input === 'number') { return input; }\n\n    if (typeof input === 'string') { return parseInt(input); }\n\n    var map = {};\n    for (var element in input) {\n      map[element] = parseInt(input[element]);\n    }\n\n    return map;\n  };\n\n  var merge = function (target, source) {\n    if (! (isObject(target) && isObject(source))) {\n      return target;\n    }\n\n    Object.keys(source).forEach(function (key) {\n      var obj, obj$1;\n\n      if (isObject(source[key])) {\n        if (! target[key]) {\n          assign(target, ( obj = {}, obj[key] = {}, obj ));\n        }\n\n        merge(target[key], source[key]);\n        return;\n      }\n\n      assign(target, ( obj$1 = {}, obj$1[key] = source[key], obj$1 ));\n    });\n\n    return target;\n  };\n\n  var fillRulesFromElement = function (el, rules) {\n    if (el.required) {\n      rules = appendRule('required', rules);\n    }\n\n    if (isTextInput(el)) {\n      if (el.type === 'email') {\n        rules = appendRule((\"email\" + (el.multiple ? ':multiple' : '')), rules);\n      }\n\n      if (el.pattern) {\n        rules = appendRule({ regex: el.pattern }, rules);\n      }\n\n      // 524288 is the max on some browsers and test environments.\n      if (el.maxLength >= 0 && el.maxLength < 524288) {\n        rules = appendRule((\"max:\" + (el.maxLength)), rules);\n      }\n\n      if (el.minLength > 0) {\n        rules = appendRule((\"min:\" + (el.minLength)), rules);\n      }\n\n      if (el.type === 'number') {\n        rules = appendRule('decimal', rules);\n        if (el.min !== '') {\n          rules = appendRule((\"min_value:\" + (el.min)), rules);\n        }\n\n        if (el.max !== '') {\n          rules = appendRule((\"max_value:\" + (el.max)), rules);\n        }\n      }\n\n      return rules;\n    }\n\n    if (isDateInput(el)) {\n      var timeFormat = el.step && Number(el.step) < 60 ? 'HH:mm:ss' : 'HH:mm';\n\n      if (el.type === 'date') {\n        return appendRule('date_format:yyyy-MM-dd', rules);\n      }\n\n      if (el.type === 'datetime-local') {\n        return appendRule((\"date_format:yyyy-MM-ddT\" + timeFormat), rules);\n      }\n\n      if (el.type === 'month') {\n        return appendRule('date_format:yyyy-MM', rules);\n      }\n\n      if (el.type === 'week') {\n        return appendRule('date_format:yyyy-[W]WW', rules);\n      }\n\n      if (el.type === 'time') {\n        return appendRule((\"date_format:\" + timeFormat), rules);\n      }\n    }\n\n    return rules;\n  };\n\n  var values = function (obj) {\n    if (isCallable(Object.values)) {\n      return Object.values(obj);\n    }\n\n    // fallback to keys()\n    /* istanbul ignore next */\n    return Object.keys(obj).map(function (k) { return obj[k]; });\n  };\n\n  var parseSelector = function (selector) {\n    var rule = null;\n    if (includes(selector, ':')) {\n      rule = selector.split(':').pop();\n      selector = selector.replace((\":\" + rule), '');\n    }\n\n    if (selector[0] === '#') {\n      return {\n        id: selector.slice(1),\n        rule: rule,\n        name: null,\n        scope: null\n      };\n    }\n\n    var scope = null;\n    var name = selector;\n    if (includes(selector, '.')) {\n      var parts = selector.split('.');\n      scope = parts[0];\n      name = parts.slice(1).join('.');\n    }\n\n    return {\n      id: null,\n      scope: scope,\n      name: name,\n      rule: rule\n    };\n  };\n\n  var includes = function (collection, item) {\n    return collection.indexOf(item) !== -1;\n  };\n\n  var isEmptyArray = function (arr) {\n    return Array.isArray(arr) && arr.length === 0;\n  };\n\n  var defineNonReactive = function (obj, prop, value) {\n    Object.defineProperty(obj, prop, {\n      configurable: false,\n      writable: true,\n      value: value\n    });\n  };\n\n  var validate$a = function (value, ref) {\n    if ( ref === void 0 ) ref = {};\n    var decimals = ref.decimals; if ( decimals === void 0 ) decimals = '*';\n    var separator = ref.separator; if ( separator === void 0 ) separator = '.';\n\n    if (isNullOrUndefined(value) || value === '') {\n      return false;\n    }\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return validate$a(val, { decimals: decimals, separator: separator }); });\n    }\n\n    // if is 0.\n    if (Number(decimals) === 0) {\n      return /^-?\\d*$/.test(value);\n    }\n\n    var regexPart = decimals === '*' ? '+' : (\"{1,\" + decimals + \"}\");\n    var regex = new RegExp((\"^[-+]?\\\\d*(\\\\\" + separator + \"\\\\d\" + regexPart + \")?([eE]{1}[-]?\\\\d+)?$\"));\n\n    if (! regex.test(value)) {\n      return false;\n    }\n\n    var parsedValue = parseFloat(value);\n\n    // eslint-disable-next-line\n    return parsedValue === parsedValue;\n  };\n\n  var paramNames$a = ['decimals', 'separator'];\n\n  var decimal = {\n    validate: validate$a,\n    paramNames: paramNames$a\n  };\n\n  var validate$b = function (value, ref) {\n    var length = ref[0];\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return validate$b(val, [length]); });\n    }\n    var strVal = String(value);\n\n    return /^[0-9]*$/.test(strVal) && strVal.length === Number(length);\n  };\n\n  var digits = {\n    validate: validate$b\n  };\n\n  var imageRegex = /\\.(jpg|svg|jpeg|png|bmp|gif)$/i;\n\n  var validateImage = function (file, width, height) {\n    var URL = window.URL || window.webkitURL;\n    return new Promise(function (resolve) {\n      var image = new Image();\n      image.onerror = function () { return resolve({ valid: false }); };\n      image.onload = function () { return resolve({\n        valid: image.width === Number(width) && image.height === Number(height)\n      }); };\n\n      image.src = URL.createObjectURL(file);\n    });\n  };\n\n  var validate$c = function (files, ref) {\n    var width = ref[0];\n    var height = ref[1];\n\n    var images = ensureArray(files).filter(function (file) { return imageRegex.test(file.name); });\n    if (images.length === 0) {\n      return false;\n    }\n    return Promise.all(images.map(function (image) { return validateImage(image, width, height); }));\n  };\n\n  var dimensions = {\n    validate: validate$c\n  };\n\n  var merge_1 = createCommonjsModule(function (module, exports) {\n\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n  exports.default = merge;\n\n  function merge() {\n    var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var defaults = arguments.length > 1 ? arguments[1] : undefined;\n\n    for (var key in defaults) {\n      if (typeof obj[key] === 'undefined') {\n        obj[key] = defaults[key];\n      }\n    }\n\n    return obj;\n  }\n\n  module.exports = exports.default;\n  module.exports.default = exports.default;\n  });\n\n  unwrapExports(merge_1);\n\n  var isByteLength_1 = createCommonjsModule(function (module, exports) {\n\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n  exports.default = isByteLength;\n\n  var _assertString = _interopRequireDefault(assertString_1);\n\n  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n  function _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n  /* eslint-disable prefer-rest-params */\n  function isByteLength(str, options) {\n    (0, _assertString.default)(str);\n    var min;\n    var max;\n\n    if (_typeof(options) === 'object') {\n      min = options.min || 0;\n      max = options.max;\n    } else {\n      // backwards compatibility: isByteLength(str, min [, max])\n      min = arguments[1];\n      max = arguments[2];\n    }\n\n    var len = encodeURI(str).split(/%..|./).length - 1;\n    return len >= min && (typeof max === 'undefined' || len <= max);\n  }\n\n  module.exports = exports.default;\n  module.exports.default = exports.default;\n  });\n\n  unwrapExports(isByteLength_1);\n\n  var isFQDN_1 = createCommonjsModule(function (module, exports) {\n\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n  exports.default = isFQDN;\n\n  var _assertString = _interopRequireDefault(assertString_1);\n\n  var _merge = _interopRequireDefault(merge_1);\n\n  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n  var default_fqdn_options = {\n    require_tld: true,\n    allow_underscores: false,\n    allow_trailing_dot: false\n  };\n\n  function isFQDN(str, options) {\n    (0, _assertString.default)(str);\n    options = (0, _merge.default)(options, default_fqdn_options);\n    /* Remove the optional trailing dot before checking validity */\n\n    if (options.allow_trailing_dot && str[str.length - 1] === '.') {\n      str = str.substring(0, str.length - 1);\n    }\n\n    var parts = str.split('.');\n\n    for (var i = 0; i < parts.length; i++) {\n      if (parts[i].length > 63) {\n        return false;\n      }\n    }\n\n    if (options.require_tld) {\n      var tld = parts.pop();\n\n      if (!parts.length || !/^([a-z\\u00a1-\\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {\n        return false;\n      } // disallow spaces\n\n\n      if (/[\\s\\u2002-\\u200B\\u202F\\u205F\\u3000\\uFEFF\\uDB40\\uDC20]/.test(tld)) {\n        return false;\n      }\n    }\n\n    for (var part, _i = 0; _i < parts.length; _i++) {\n      part = parts[_i];\n\n      if (options.allow_underscores) {\n        part = part.replace(/_/g, '');\n      }\n\n      if (!/^[a-z\\u00a1-\\uffff0-9-]+$/i.test(part)) {\n        return false;\n      } // disallow full-width chars\n\n\n      if (/[\\uff01-\\uff5e]/.test(part)) {\n        return false;\n      }\n\n      if (part[0] === '-' || part[part.length - 1] === '-') {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  module.exports = exports.default;\n  module.exports.default = exports.default;\n  });\n\n  var isFQDN = unwrapExports(isFQDN_1);\n\n  var isIP_1 = createCommonjsModule(function (module, exports) {\n\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n  exports.default = isIP;\n\n  var _assertString = _interopRequireDefault(assertString_1);\n\n  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n  var ipv4Maybe = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/;\n  var ipv6Block = /^[0-9A-F]{1,4}$/i;\n\n  function isIP(str) {\n    var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n    (0, _assertString.default)(str);\n    version = String(version);\n\n    if (!version) {\n      return isIP(str, 4) || isIP(str, 6);\n    } else if (version === '4') {\n      if (!ipv4Maybe.test(str)) {\n        return false;\n      }\n\n      var parts = str.split('.').sort(function (a, b) {\n        return a - b;\n      });\n      return parts[3] <= 255;\n    } else if (version === '6') {\n      var blocks = str.split(':');\n      var foundOmissionBlock = false; // marker to indicate ::\n      // At least some OS accept the last 32 bits of an IPv6 address\n      // (i.e. 2 of the blocks) in IPv4 notation, and RFC 3493 says\n      // that '::ffff:a.b.c.d' is valid for IPv4-mapped IPv6 addresses,\n      // and '::a.b.c.d' is deprecated, but also valid.\n\n      var foundIPv4TransitionBlock = isIP(blocks[blocks.length - 1], 4);\n      var expectedNumberOfBlocks = foundIPv4TransitionBlock ? 7 : 8;\n\n      if (blocks.length > expectedNumberOfBlocks) {\n        return false;\n      } // initial or final ::\n\n\n      if (str === '::') {\n        return true;\n      } else if (str.substr(0, 2) === '::') {\n        blocks.shift();\n        blocks.shift();\n        foundOmissionBlock = true;\n      } else if (str.substr(str.length - 2) === '::') {\n        blocks.pop();\n        blocks.pop();\n        foundOmissionBlock = true;\n      }\n\n      for (var i = 0; i < blocks.length; ++i) {\n        // test for a :: which can not be at the string start/end\n        // since those cases have been handled above\n        if (blocks[i] === '' && i > 0 && i < blocks.length - 1) {\n          if (foundOmissionBlock) {\n            return false; // multiple :: in address\n          }\n\n          foundOmissionBlock = true;\n        } else if (foundIPv4TransitionBlock && i === blocks.length - 1) ; else if (!ipv6Block.test(blocks[i])) {\n          return false;\n        }\n      }\n\n      if (foundOmissionBlock) {\n        return blocks.length >= 1;\n      }\n\n      return blocks.length === expectedNumberOfBlocks;\n    }\n\n    return false;\n  }\n\n  module.exports = exports.default;\n  module.exports.default = exports.default;\n  });\n\n  var isIP = unwrapExports(isIP_1);\n\n  var isEmail_1 = createCommonjsModule(function (module, exports) {\n\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n  exports.default = isEmail;\n\n  var _assertString = _interopRequireDefault(assertString_1);\n\n  var _merge = _interopRequireDefault(merge_1);\n\n  var _isByteLength = _interopRequireDefault(isByteLength_1);\n\n  var _isFQDN = _interopRequireDefault(isFQDN_1);\n\n  var _isIP = _interopRequireDefault(isIP_1);\n\n  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n  var default_email_options = {\n    allow_display_name: false,\n    require_display_name: false,\n    allow_utf8_local_part: true,\n    require_tld: true\n  };\n  /* eslint-disable max-len */\n\n  /* eslint-disable no-control-regex */\n\n  var displayName = /^[a-z\\d!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~\\.\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+[a-z\\d!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~\\,\\.\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF\\s]*<(.+)>$/i;\n  var emailUserPart = /^[a-z\\d!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]+$/i;\n  var gmailUserPart = /^[a-z\\d]+$/;\n  var quotedEmailUser = /^([\\s\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f\\x21\\x23-\\x5b\\x5d-\\x7e]|(\\\\[\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]))*$/i;\n  var emailUserUtf8Part = /^[a-z\\d!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+$/i;\n  var quotedEmailUserUtf8 = /^([\\s\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f\\x21\\x23-\\x5b\\x5d-\\x7e\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]|(\\\\[\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))*$/i;\n  /* eslint-enable max-len */\n\n  /* eslint-enable no-control-regex */\n\n  function isEmail(str, options) {\n    (0, _assertString.default)(str);\n    options = (0, _merge.default)(options, default_email_options);\n\n    if (options.require_display_name || options.allow_display_name) {\n      var display_email = str.match(displayName);\n\n      if (display_email) {\n        str = display_email[1];\n      } else if (options.require_display_name) {\n        return false;\n      }\n    }\n\n    var parts = str.split('@');\n    var domain = parts.pop();\n    var user = parts.join('@');\n    var lower_domain = domain.toLowerCase();\n\n    if (options.domain_specific_validation && (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com')) {\n      /*\n        Previously we removed dots for gmail addresses before validating.\n        This was removed because it allows `multiple..dots@gmail.com`\n        to be reported as valid, but it is not.\n        Gmail only normalizes single dots, removing them from here is pointless,\n        should be done in normalizeEmail\n      */\n      user = user.toLowerCase(); // Removing sub-address from username before gmail validation\n\n      var username = user.split('+')[0]; // Dots are not included in gmail length restriction\n\n      if (!(0, _isByteLength.default)(username.replace('.', ''), {\n        min: 6,\n        max: 30\n      })) {\n        return false;\n      }\n\n      var _user_parts = username.split('.');\n\n      for (var i = 0; i < _user_parts.length; i++) {\n        if (!gmailUserPart.test(_user_parts[i])) {\n          return false;\n        }\n      }\n    }\n\n    if (!(0, _isByteLength.default)(user, {\n      max: 64\n    }) || !(0, _isByteLength.default)(domain, {\n      max: 254\n    })) {\n      return false;\n    }\n\n    if (!(0, _isFQDN.default)(domain, {\n      require_tld: options.require_tld\n    })) {\n      if (!options.allow_ip_domain) {\n        return false;\n      }\n\n      if (!(0, _isIP.default)(domain)) {\n        if (!domain.startsWith('[') || !domain.endsWith(']')) {\n          return false;\n        }\n\n        var noBracketdomain = domain.substr(1, domain.length - 2);\n\n        if (noBracketdomain.length === 0 || !(0, _isIP.default)(noBracketdomain)) {\n          return false;\n        }\n      }\n    }\n\n    if (user[0] === '\"') {\n      user = user.slice(1, user.length - 1);\n      return options.allow_utf8_local_part ? quotedEmailUserUtf8.test(user) : quotedEmailUser.test(user);\n    }\n\n    var pattern = options.allow_utf8_local_part ? emailUserUtf8Part : emailUserPart;\n    var user_parts = user.split('.');\n\n    for (var _i = 0; _i < user_parts.length; _i++) {\n      if (!pattern.test(user_parts[_i])) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  module.exports = exports.default;\n  module.exports.default = exports.default;\n  });\n\n  var isEmail = unwrapExports(isEmail_1);\n\n  function objectWithoutProperties (obj, exclude) { var target = {}; for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k) && exclude.indexOf(k) === -1) target[k] = obj[k]; return target; }\n\n  var validate$d = function (value, ref) {\n    if ( ref === void 0 ) ref = {};\n    var multiple = ref.multiple; if ( multiple === void 0 ) multiple = false;\n    var rest = objectWithoutProperties( ref, [\"multiple\"] );\n    var options = rest;\n\n    if (multiple && !Array.isArray(value)) {\n      value = String(value).split(',').map(function (emailStr) { return emailStr.trim(); });\n    }\n\n    var validatorOptions = assign({}, options);\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return isEmail(String(val), validatorOptions); });\n    }\n\n    return isEmail(String(value), validatorOptions);\n  };\n\n  var email = {\n    validate: validate$d\n  };\n\n  var validate$e = function (value, options) {\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return validate$e(val, options); });\n    }\n\n    return toArray(options).some(function (item) {\n      // eslint-disable-next-line\n      return item == value;\n    });\n  };\n\n  var included = {\n    validate: validate$e\n  };\n\n  var validate$f = function () {\n    var args = [], len = arguments.length;\n    while ( len-- ) args[ len ] = arguments[ len ];\n\n    return !validate$e.apply(void 0, args);\n  };\n\n  var excluded = {\n    validate: validate$f\n  };\n\n  var validate$g = function (files, extensions) {\n    var regex = new RegExp((\".(\" + (extensions.join('|')) + \")$\"), 'i');\n    return ensureArray(files).every(function (file) { return regex.test(file.name); });\n  };\n\n  var ext = {\n    validate: validate$g\n  };\n\n  var validate$h = function (files) { return (Array.isArray(files) ? files : [files]).every(function (file) { return /\\.(jpg|svg|jpeg|png|bmp|gif)$/i.test(file.name); }); };\n\n  var image = {\n    validate: validate$h\n  };\n\n  var validate$i = function (value) {\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return /^-?[0-9]+$/.test(String(val)); });\n    }\n\n    return /^-?[0-9]+$/.test(String(value));\n  };\n\n  var integer = {\n    validate: validate$i\n  };\n\n  var validate$j = function (value, ref) {\n    if ( ref === void 0 ) ref = {};\n    var version = ref.version; if ( version === void 0 ) version = 4;\n\n    if (isNullOrUndefined(value)) {\n      value = '';\n    }\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return isIP(val, version); });\n    }\n\n    return isIP(value, version);\n  };\n\n  var paramNames$b = ['version'];\n\n  var ip = {\n    validate: validate$j,\n    paramNames: paramNames$b\n  };\n\n  var validate$k = function (value) {\n    if (isNullOrUndefined(value)) {\n      value = '';\n    }\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return (isIP(val, '') || isFQDN(val)); });\n    }\n\n    return isIP(value, '') || isFQDN(value);\n  };\n\n  var ip_or_fqdn = {\n    validate: validate$k\n  };\n\n  var validate$l = function (value, ref) {\n    if ( ref === void 0 ) ref = [];\n    var other = ref[0];\n\n    return value === other;\n  };\n\n  var is = {\n    validate: validate$l\n  };\n\n  var validate$m = function (value, ref) {\n    if ( ref === void 0 ) ref = [];\n    var other = ref[0];\n\n    return value !== other;\n  };\n\n  var is_not = {\n    validate: validate$m\n  };\n\n  /**\n   * @param {Array|String} value\n   * @param {Number} length\n   * @param {Number} max\n   */\n  var compare = function (value, length, max) {\n    if (max === undefined) {\n      return value.length === length;\n    }\n\n    // cast to number.\n    max = Number(max);\n\n    return value.length >= length && value.length <= max;\n  };\n\n  var validate$n = function (value, ref) {\n    var length = ref[0];\n    var max = ref[1]; if ( max === void 0 ) max = undefined;\n\n    if (isNullOrUndefined(value)) {\n      return false;\n    }\n\n    length = Number(length);\n    if (typeof value === 'number') {\n      value = String(value);\n    }\n\n    if (!value.length) {\n      value = toArray(value);\n    }\n\n    return compare(value, length, max);\n  };\n\n  var length = {\n    validate: validate$n\n  };\n\n  var validate$o = function (value, ref) {\n    var length = ref[0];\n\n    if (isNullOrUndefined(value)) {\n      return length >= 0;\n    }\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return validate$o(val, [length]); });\n    }\n\n    return String(value).length <= length;\n  };\n\n  var max = {\n    validate: validate$o\n  };\n\n  var validate$p = function (value, ref) {\n    var max = ref[0];\n\n    if (isNullOrUndefined(value) || value === '') {\n      return false;\n    }\n\n    if (Array.isArray(value)) {\n      return value.length > 0 && value.every(function (val) { return validate$p(val, [max]); });\n    }\n\n    return Number(value) <= max;\n  };\n\n  var max_value = {\n    validate: validate$p\n  };\n\n  var validate$q = function (files, mimes) {\n    var regex = new RegExp(((mimes.join('|').replace('*', '.+')) + \"$\"), 'i');\n    return ensureArray(files).every(function (file) { return regex.test(file.type); });\n  };\n\n  var mimes = {\n    validate: validate$q\n  };\n\n  var validate$r = function (value, ref) {\n    var length = ref[0];\n\n    if (isNullOrUndefined(value)) {\n      return false;\n    }\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return validate$r(val, [length]); });\n    }\n\n    return String(value).length >= length;\n  };\n\n  var min = {\n    validate: validate$r\n  };\n\n  var validate$s = function (value, ref) {\n    var min = ref[0];\n\n    if (isNullOrUndefined(value) || value === '') {\n      return false;\n    }\n\n    if (Array.isArray(value)) {\n      return value.length > 0 && value.every(function (val) { return validate$s(val, [min]); });\n    }\n\n    return Number(value) >= min;\n  };\n\n  var min_value = {\n    validate: validate$s\n  };\n\n  var ar = /^[Ù Ù¡Ù¢Ù£Ù¤Ù¥Ù¦Ù§Ù¨Ù©]+$/;\n  var en = /^[0-9]+$/;\n\n  var validate$t = function (value) {\n    var testValue = function (val) {\n      var strValue = String(val);\n\n      return en.test(strValue) || ar.test(strValue);\n    };\n\n    if (Array.isArray(value)) {\n      return value.every(testValue);\n    }\n\n    return testValue(value);\n  };\n\n  var numeric = {\n    validate: validate$t\n  };\n\n  var validate$u = function (value, ref) {\n    var expression = ref.expression;\n\n    if (typeof expression === 'string') {\n      expression = new RegExp(expression);\n    }\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return validate$u(val, { expression: expression }); });\n    }\n\n    return expression.test(String(value));\n  };\n\n  var paramNames$c = ['expression'];\n\n  var regex = {\n    validate: validate$u,\n    paramNames: paramNames$c\n  };\n\n  var validate$v = function (value, ref) {\n    if ( ref === void 0 ) ref = [];\n    var invalidateFalse = ref[0]; if ( invalidateFalse === void 0 ) invalidateFalse = false;\n\n    if (isNullOrUndefined(value) || isEmptyArray(value)) {\n      return false;\n    }\n\n    // incase a field considers `false` as an empty value like checkboxes.\n    if (value === false && invalidateFalse) {\n      return false;\n    }\n\n    return !!String(value).trim().length;\n  };\n\n  var required = {\n    validate: validate$v\n  };\n\n  var validate$w = function (value, ref) {\n    if ( ref === void 0 ) ref = [];\n    var otherFieldVal = ref[0];\n    var possibleVals = ref.slice(1);\n\n    var required = possibleVals.includes(String(otherFieldVal).trim());\n\n    if (!required) {\n      return {\n        valid: true,\n        data: {\n          required: required\n        }\n      };\n    }\n\n    var invalid = (isEmptyArray(value) || [false, null, undefined].includes(value));\n\n    invalid = invalid || !String(value).trim().length;\n\n    return {\n      valid: !invalid,\n      data: {\n        required: required\n      }\n    };\n  };\n\n  var options$5 = {\n    hasTarget: true,\n    computesRequired: true\n  };\n\n  var required_if = {\n    validate: validate$w,\n    options: options$5\n  };\n\n  var validate$x = function (files, ref) {\n    var size = ref[0];\n\n    if (isNaN(size)) {\n      return false;\n    }\n    var nSize = Number(size) * 1024;\n    return ensureArray(files).every(function (file) { return file.size <= nSize; });\n  };\n\n  var size = {\n    validate: validate$x\n  };\n\n  var isURL_1 = createCommonjsModule(function (module, exports) {\n\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n  exports.default = isURL;\n\n  var _assertString = _interopRequireDefault(assertString_1);\n\n  var _isFQDN = _interopRequireDefault(isFQDN_1);\n\n  var _isIP = _interopRequireDefault(isIP_1);\n\n  var _merge = _interopRequireDefault(merge_1);\n\n  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n  var default_url_options = {\n    protocols: ['http', 'https', 'ftp'],\n    require_tld: true,\n    require_protocol: false,\n    require_host: true,\n    require_valid_protocol: true,\n    allow_underscores: false,\n    allow_trailing_dot: false,\n    allow_protocol_relative_urls: false\n  };\n  var wrapped_ipv6 = /^\\[([^\\]]+)\\](?::([0-9]+))?$/;\n\n  function isRegExp(obj) {\n    return Object.prototype.toString.call(obj) === '[object RegExp]';\n  }\n\n  function checkHost(host, matches) {\n    for (var i = 0; i < matches.length; i++) {\n      var match = matches[i];\n\n      if (host === match || isRegExp(match) && match.test(host)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  function isURL(url, options) {\n    (0, _assertString.default)(url);\n\n    if (!url || url.length >= 2083 || /[\\s<>]/.test(url)) {\n      return false;\n    }\n\n    if (url.indexOf('mailto:') === 0) {\n      return false;\n    }\n\n    options = (0, _merge.default)(options, default_url_options);\n    var protocol, auth, host, hostname, port, port_str, split, ipv6;\n    split = url.split('#');\n    url = split.shift();\n    split = url.split('?');\n    url = split.shift();\n    split = url.split('://');\n\n    if (split.length > 1) {\n      protocol = split.shift().toLowerCase();\n\n      if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) {\n        return false;\n      }\n    } else if (options.require_protocol) {\n      return false;\n    } else if (url.substr(0, 2) === '//') {\n      if (!options.allow_protocol_relative_urls) {\n        return false;\n      }\n\n      split[0] = url.substr(2);\n    }\n\n    url = split.join('://');\n\n    if (url === '') {\n      return false;\n    }\n\n    split = url.split('/');\n    url = split.shift();\n\n    if (url === '' && !options.require_host) {\n      return true;\n    }\n\n    split = url.split('@');\n\n    if (split.length > 1) {\n      if (options.disallow_auth) {\n        return false;\n      }\n\n      auth = split.shift();\n\n      if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) {\n        return false;\n      }\n    }\n\n    hostname = split.join('@');\n    port_str = null;\n    ipv6 = null;\n    var ipv6_match = hostname.match(wrapped_ipv6);\n\n    if (ipv6_match) {\n      host = '';\n      ipv6 = ipv6_match[1];\n      port_str = ipv6_match[2] || null;\n    } else {\n      split = hostname.split(':');\n      host = split.shift();\n\n      if (split.length) {\n        port_str = split.join(':');\n      }\n    }\n\n    if (port_str !== null) {\n      port = parseInt(port_str, 10);\n\n      if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) {\n        return false;\n      }\n    }\n\n    if (!(0, _isIP.default)(host) && !(0, _isFQDN.default)(host, options) && (!ipv6 || !(0, _isIP.default)(ipv6, 6))) {\n      return false;\n    }\n\n    host = host || ipv6;\n\n    if (options.host_whitelist && !checkHost(host, options.host_whitelist)) {\n      return false;\n    }\n\n    if (options.host_blacklist && checkHost(host, options.host_blacklist)) {\n      return false;\n    }\n\n    return true;\n  }\n\n  module.exports = exports.default;\n  module.exports.default = exports.default;\n  });\n\n  var isURL = unwrapExports(isURL_1);\n\n  var validate$y = function (value, options) {\n    if ( options === void 0 ) options = {};\n\n    if (isNullOrUndefined(value)) {\n      value = '';\n    }\n\n    var validatorOptions = assign({}, options);\n\n    if (Array.isArray(value)) {\n      return value.every(function (val) { return isURL(val, validatorOptions); });\n    }\n\n    return isURL(value, validatorOptions);\n  };\n\n  var url = {\n    validate: validate$y\n  };\n\n  /* eslint-disable camelcase */\n\n  var Rules = /*#__PURE__*/Object.freeze({\n    after: after,\n    alpha_dash: alpha_dash,\n    alpha_num: alpha_num,\n    alpha_spaces: alpha_spaces,\n    alpha: alpha$1,\n    before: before,\n    between: between,\n    confirmed: confirmed,\n    credit_card: credit_card,\n    date_between: date_between,\n    date_format: date_format,\n    decimal: decimal,\n    digits: digits,\n    dimensions: dimensions,\n    email: email,\n    ext: ext,\n    image: image,\n    included: included,\n    integer: integer,\n    length: length,\n    ip: ip,\n    ip_or_fqdn: ip_or_fqdn,\n    is_not: is_not,\n    is: is,\n    max: max,\n    max_value: max_value,\n    mimes: mimes,\n    min: min,\n    min_value: min_value,\n    excluded: excluded,\n    numeric: numeric,\n    regex: regex,\n    required: required,\n    required_if: required_if,\n    size: size,\n    url: url\n  });\n\n  // \n\n  var LOCALE = 'en';\n\n  var Dictionary = function Dictionary (dictionary) {\n    if ( dictionary === void 0 ) dictionary = {};\n\n    this.container = {};\n    this.merge(dictionary);\n  };\n\n  var prototypeAccessors = { locale: { configurable: true } };\n\n  prototypeAccessors.locale.get = function () {\n    return LOCALE;\n  };\n\n  prototypeAccessors.locale.set = function (value) {\n    LOCALE = value || 'en';\n  };\n\n  Dictionary.prototype.hasLocale = function hasLocale (locale) {\n    return !!this.container[locale];\n  };\n\n  Dictionary.prototype.setDateFormat = function setDateFormat (locale, format) {\n    if (!this.container[locale]) {\n      this.container[locale] = {};\n    }\n\n    this.container[locale].dateFormat = format;\n  };\n\n  Dictionary.prototype.getDateFormat = function getDateFormat (locale) {\n    if (!this.container[locale] || !this.container[locale].dateFormat) {\n      return null;\n    }\n\n    return this.container[locale].dateFormat;\n  };\n\n  Dictionary.prototype.getMessage = function getMessage (locale, key, data) {\n    var message = null;\n    if (!this.hasMessage(locale, key)) {\n      message = this._getDefaultMessage(locale);\n    } else {\n      message = this.container[locale].messages[key];\n    }\n\n    return isCallable(message) ? message.apply(void 0, data) : message;\n  };\n\n  /**\n   * Gets a specific message for field. falls back to the rule message.\n   */\n  Dictionary.prototype.getFieldMessage = function getFieldMessage (locale, field, key, data) {\n    if (!this.hasLocale(locale)) {\n      return this.getMessage(locale, key, data);\n    }\n\n    var dict = this.container[locale].custom && this.container[locale].custom[field];\n    if (!dict || !dict[key]) {\n      return this.getMessage(locale, key, data);\n    }\n\n    var message = dict[key];\n    return isCallable(message) ? message.apply(void 0, data) : message;\n  };\n\n  Dictionary.prototype._getDefaultMessage = function _getDefaultMessage (locale) {\n    if (this.hasMessage(locale, '_default')) {\n      return this.container[locale].messages._default;\n    }\n\n    return this.container.en.messages._default;\n  };\n\n  Dictionary.prototype.getAttribute = function getAttribute (locale, key, fallback) {\n      if ( fallback === void 0 ) fallback = '';\n\n    if (!this.hasAttribute(locale, key)) {\n      return fallback;\n    }\n\n    return this.container[locale].attributes[key];\n  };\n\n  Dictionary.prototype.hasMessage = function hasMessage (locale, key) {\n    return !! (\n      this.hasLocale(locale) &&\n            this.container[locale].messages &&\n            this.container[locale].messages[key]\n    );\n  };\n\n  Dictionary.prototype.hasAttribute = function hasAttribute (locale, key) {\n    return !! (\n      this.hasLocale(locale) &&\n            this.container[locale].attributes &&\n            this.container[locale].attributes[key]\n    );\n  };\n\n  Dictionary.prototype.merge = function merge$1 (dictionary) {\n    merge(this.container, dictionary);\n  };\n\n  Dictionary.prototype.setMessage = function setMessage (locale, key, message) {\n    if (! this.hasLocale(locale)) {\n      this.container[locale] = {\n        messages: {},\n        attributes: {}\n      };\n    }\n      \n    if (!this.container[locale].messages) {\n      this.container[locale].messages = {};\n    }\n\n    this.container[locale].messages[key] = message;\n  };\n\n  Dictionary.prototype.setAttribute = function setAttribute (locale, key, attribute) {\n    if (! this.hasLocale(locale)) {\n      this.container[locale] = {\n        messages: {},\n        attributes: {}\n      };\n    }\n\n    this.container[locale].attributes[key] = attribute;\n  };\n\n  Object.defineProperties( Dictionary.prototype, prototypeAccessors );\n\n  var drivers = {\n    default: new Dictionary({\n      en: {\n        messages: {},\n        attributes: {},\n        custom: {}\n      }\n    })\n  };\n\n  var currentDriver = 'default';\n\n  var DictionaryResolver = function DictionaryResolver () {};\n\n  DictionaryResolver._checkDriverName = function _checkDriverName (driver) {\n    if (!driver) {\n      throw createError('you must provide a name to the dictionary driver');\n    }\n  };\n\n  DictionaryResolver.setDriver = function setDriver (driver, implementation) {\n      if ( implementation === void 0 ) implementation = null;\n\n    this._checkDriverName(driver);\n    if (implementation) {\n      drivers[driver] = implementation;\n    }\n\n    currentDriver = driver;\n  };\n\n  DictionaryResolver.getDriver = function getDriver () {\n    return drivers[currentDriver];\n  };\n\n  // \n\n  var ErrorBag = function ErrorBag (errorBag, id) {\n    if ( errorBag === void 0 ) errorBag = null;\n    if ( id === void 0 ) id = null;\n\n    this.vmId = id || null;\n    // make this bag a mirror of the provided one, sharing the same items reference.\n    if (errorBag && errorBag instanceof ErrorBag) {\n      this.items = errorBag.items;\n    } else {\n      this.items = [];\n    }\n  };\n\n  ErrorBag.prototype[typeof Symbol === 'function' ? Symbol.iterator : '@@iterator'] = function () {\n      var this$1 = this;\n\n    var index = 0;\n    return {\n      next: function () {\n        return { value: this$1.items[index++], done: index > this$1.items.length };\n      }\n    };\n  };\n\n  /**\n   * Adds an error to the internal array.\n   */\n  ErrorBag.prototype.add = function add (error) {\n      var ref;\n\n    (ref = this.items).push.apply(\n      ref, this._normalizeError(error)\n    );\n  };\n\n  /**\n   * Normalizes passed errors to an error array.\n   */\n  ErrorBag.prototype._normalizeError = function _normalizeError (error) {\n      var this$1 = this;\n\n    if (Array.isArray(error)) {\n      return error.map(function (e) {\n        e.scope = !isNullOrUndefined(e.scope) ? e.scope : null;\n        e.vmId = !isNullOrUndefined(e.vmId) ? e.vmId : (this$1.vmId || null);\n\n        return e;\n      });\n    }\n\n    error.scope = !isNullOrUndefined(error.scope) ? error.scope : null;\n    error.vmId = !isNullOrUndefined(error.vmId) ? error.vmId : (this.vmId || null);\n\n    return [error];\n  };\n\n  /**\n   * Regenrates error messages if they have a generator function.\n   */\n  ErrorBag.prototype.regenerate = function regenerate () {\n    this.items.forEach(function (i) {\n      i.msg = isCallable(i.regenerate) ? i.regenerate() : i.msg;\n    });\n  };\n\n  /**\n   * Updates a field error with the new field scope.\n   */\n  ErrorBag.prototype.update = function update (id, error) {\n    var item = find(this.items, function (i) { return i.id === id; });\n    if (!item) {\n      return;\n    }\n\n    var idx = this.items.indexOf(item);\n    this.items.splice(idx, 1);\n    item.scope = error.scope;\n    this.items.push(item);\n  };\n\n  /**\n   * Gets all error messages from the internal array.\n   */\n  ErrorBag.prototype.all = function all (scope) {\n      var this$1 = this;\n\n    var filterFn = function (item) {\n      var matchesScope = true;\n      var matchesVM = true;\n      if (!isNullOrUndefined(scope)) {\n        matchesScope = item.scope === scope;\n      }\n\n      if (!isNullOrUndefined(this$1.vmId)) {\n        matchesVM = item.vmId === this$1.vmId;\n      }\n\n      return matchesVM && matchesScope;\n    };\n\n    return this.items.filter(filterFn).map(function (e) { return e.msg; });\n  };\n\n  /**\n   * Checks if there are any errors in the internal array.\n   */\n  ErrorBag.prototype.any = function any (scope) {\n      var this$1 = this;\n\n    var filterFn = function (item) {\n      var matchesScope = true;\n      var matchesVM = true;\n      if (!isNullOrUndefined(scope)) {\n        matchesScope = item.scope === scope;\n      }\n\n      if (!isNullOrUndefined(this$1.vmId)) {\n        matchesVM = item.vmId === this$1.vmId;\n      }\n\n      return matchesVM && matchesScope;\n    };\n\n    return !!this.items.filter(filterFn).length;\n  };\n\n  /**\n   * Removes all items from the internal array.\n   */\n  ErrorBag.prototype.clear = function clear (scope) {\n      var this$1 = this;\n\n    var matchesVM = isNullOrUndefined(this.vmId) ? function () { return true; } : function (i) { return i.vmId === this$1.vmId; };\n    var matchesScope = function (i) { return i.scope === scope; };\n    if (arguments.length === 0) {\n      matchesScope = function () { return true; };\n    } else if (isNullOrUndefined(scope)) {\n      scope = null;\n    }\n\n    for (var i = 0; i < this.items.length; ++i) {\n      if (matchesVM(this.items[i]) && matchesScope(this.items[i])) {\n        this.items.splice(i, 1);\n        --i;\n      }\n    }\n  };\n\n  /**\n   * Collects errors into groups or for a specific field.\n   */\n  ErrorBag.prototype.collect = function collect (field, scope, map) {\n      var this$1 = this;\n      if ( map === void 0 ) map = true;\n\n    var isSingleField = !isNullOrUndefined(field) && !field.includes('*');\n    var groupErrors = function (items) {\n      var errors = items.reduce(function (collection, error) {\n        if (!isNullOrUndefined(this$1.vmId) && error.vmId !== this$1.vmId) {\n          return collection;\n        }\n\n        if (!collection[error.field]) {\n          collection[error.field] = [];\n        }\n\n        collection[error.field].push(map ? error.msg : error);\n\n        return collection;\n      }, {});\n\n      // reduce the collection to be a single array.\n      if (isSingleField) {\n        return values(errors)[0] || [];\n      }\n\n      return errors;\n    };\n\n    if (isNullOrUndefined(field)) {\n      return groupErrors(this.items);\n    }\n\n    var selector = isNullOrUndefined(scope) ? String(field) : (scope + \".\" + field);\n    var ref = this._makeCandidateFilters(selector);\n      var isPrimary = ref.isPrimary;\n      var isAlt = ref.isAlt;\n\n    var collected = this.items.reduce(function (prev, curr) {\n      if (isPrimary(curr)) {\n        prev.primary.push(curr);\n      }\n\n      if (isAlt(curr)) {\n        prev.alt.push(curr);\n      }\n\n      return prev;\n    }, { primary: [], alt: [] });\n\n    collected = collected.primary.length ? collected.primary : collected.alt;\n\n    return groupErrors(collected);\n  };\n\n  /**\n   * Gets the internal array length.\n   */\n  ErrorBag.prototype.count = function count () {\n      var this$1 = this;\n\n    if (this.vmId) {\n      return this.items.filter(function (e) { return e.vmId === this$1.vmId; }).length;\n    }\n\n    return this.items.length;\n  };\n\n  /**\n   * Finds and fetches the first error message for the specified field id.\n   */\n  ErrorBag.prototype.firstById = function firstById (id) {\n    var error = find(this.items, function (i) { return i.id === id; });\n\n    return error ? error.msg : undefined;\n  };\n\n  /**\n   * Gets the first error message for a specific field.\n   */\n  ErrorBag.prototype.first = function first (field, scope) {\n      if ( scope === void 0 ) scope = null;\n\n    var selector = isNullOrUndefined(scope) ? field : (scope + \".\" + field);\n    var match = this._match(selector);\n\n    return match && match.msg;\n  };\n\n  /**\n   * Returns the first error rule for the specified field\n   */\n  ErrorBag.prototype.firstRule = function firstRule (field, scope) {\n    var errors = this.collect(field, scope, false);\n\n    return (errors.length && errors[0].rule) || undefined;\n  };\n\n  /**\n   * Checks if the internal array has at least one error for the specified field.\n   */\n  ErrorBag.prototype.has = function has (field, scope) {\n      if ( scope === void 0 ) scope = null;\n\n    return !!this.first(field, scope);\n  };\n\n  /**\n   * Gets the first error message for a specific field and a rule.\n   */\n  ErrorBag.prototype.firstByRule = function firstByRule (name, rule, scope) {\n      if ( scope === void 0 ) scope = null;\n\n    var error = this.collect(name, scope, false).filter(function (e) { return e.rule === rule; })[0];\n\n    return (error && error.msg) || undefined;\n  };\n\n  /**\n   * Gets the first error message for a specific field that not match the rule.\n   */\n  ErrorBag.prototype.firstNot = function firstNot (name, rule, scope) {\n      if ( rule === void 0 ) rule = 'required';\n      if ( scope === void 0 ) scope = null;\n\n    var error = this.collect(name, scope, false).filter(function (e) { return e.rule !== rule; })[0];\n\n    return (error && error.msg) || undefined;\n  };\n\n  /**\n   * Removes errors by matching against the id or ids.\n   */\n  ErrorBag.prototype.removeById = function removeById (id) {\n    var condition = function (item) { return item.id === id; };\n    if (Array.isArray(id)) {\n      condition = function (item) { return id.indexOf(item.id) !== -1; };\n    }\n\n    for (var i = 0; i < this.items.length; ++i) {\n      if (condition(this.items[i])) {\n        this.items.splice(i, 1);\n        --i;\n      }\n    }\n  };\n\n  /**\n   * Removes all error messages associated with a specific field.\n   */\n  ErrorBag.prototype.remove = function remove (field, scope, vmId) {\n    if (isNullOrUndefined(field)) {\n      return;\n    }\n\n    var selector = isNullOrUndefined(scope) ? String(field) : (scope + \".\" + field);\n    var ref = this._makeCandidateFilters(selector);\n      var isPrimary = ref.isPrimary;\n      var isAlt = ref.isAlt;\n    var matches = function (item) { return isPrimary(item) || isAlt(item); };\n    var shouldRemove = function (item) {\n      if (isNullOrUndefined(vmId)) { return matches(item); }\n\n      return matches(item) && item.vmId === vmId;\n    };\n\n    for (var i = 0; i < this.items.length; ++i) {\n      if (shouldRemove(this.items[i])) {\n        this.items.splice(i, 1);\n        --i;\n      }\n    }\n  };\n\n  ErrorBag.prototype._makeCandidateFilters = function _makeCandidateFilters (selector) {\n      var this$1 = this;\n\n    var matchesRule = function () { return true; };\n    var matchesScope = function () { return true; };\n    var matchesName = function () { return true; };\n    var matchesVM = function () { return true; };\n\n    var ref = parseSelector(selector);\n      var id = ref.id;\n      var rule = ref.rule;\n      var scope = ref.scope;\n      var name = ref.name;\n\n    if (rule) {\n      matchesRule = function (item) { return item.rule === rule; };\n    }\n\n    // match by id, can be combined with rule selection.\n    if (id) {\n      return {\n        isPrimary: function (item) { return matchesRule(item) && (function (item) { return id === item.id; }); },\n        isAlt: function () { return false; }\n      };\n    }\n\n    if (isNullOrUndefined(scope)) {\n      // if no scope specified, make sure the found error has no scope.\n      matchesScope = function (item) { return isNullOrUndefined(item.scope); };\n    } else {\n      matchesScope = function (item) { return item.scope === scope; };\n    }\n\n    if (!isNullOrUndefined(name) && name !== '*') {\n      matchesName = function (item) { return item.field === name; };\n    }\n\n    if (!isNullOrUndefined(this.vmId)) {\n      matchesVM = function (item) { return item.vmId === this$1.vmId; };\n    }\n\n    // matches the first candidate.\n    var isPrimary = function (item) {\n      return matchesVM(item) && matchesName(item) && matchesRule(item) && matchesScope(item);\n    };\n\n    // matches a second candidate, which is a field with a name containing the '.' character.\n    var isAlt = function (item) {\n      return matchesVM(item) && matchesRule(item) && item.field === (scope + \".\" + name);\n    };\n\n    return {\n      isPrimary: isPrimary,\n      isAlt: isAlt\n    };\n  };\n\n  ErrorBag.prototype._match = function _match (selector) {\n    if (isNullOrUndefined(selector)) {\n      return undefined;\n    }\n\n    var ref = this._makeCandidateFilters(selector);\n      var isPrimary = ref.isPrimary;\n      var isAlt = ref.isAlt;\n\n    return this.items.reduce(function (prev, item, idx, arr) {\n      var isLast = idx === arr.length - 1;\n      if (prev.primary) {\n        return isLast ? prev.primary : prev;\n      }\n\n      if (isPrimary(item)) {\n        prev.primary = item;\n      }\n\n      if (isAlt(item)) {\n        prev.alt = item;\n      }\n\n      // keep going.\n      if (!isLast) {\n        return prev;\n      }\n\n      return prev.primary || prev.alt;\n    }, {});\n  };\n\n  var DEFAULT_CONFIG = {\n    locale: 'en',\n    delay: 0,\n    errorBagName: 'errors',\n    dictionary: null,\n    fieldsBagName: 'fields',\n    classes: false,\n    classNames: null,\n    events: 'input',\n    inject: true,\n    fastExit: true,\n    aria: true,\n    validity: false,\n    mode: 'aggressive',\n    useConstraintAttrs: true,\n    i18n: null,\n    i18nRootKey: 'validation'\n  };\n\n  var currentConfig = assign({}, DEFAULT_CONFIG);\n\n  var resolveConfig = function (ctx) {\n    var selfConfig = getPath('$options.$_veeValidate', ctx, {});\n\n    return assign({}, currentConfig, selfConfig);\n  };\n\n  var getConfig = function () { return currentConfig; };\n\n  var setConfig = function (newConf) {\n    currentConfig = assign({}, currentConfig, newConf);\n  };\n\n  // VNode Utils\n\n  // Gets the model object on the vnode.\n  function findModel (vnode) {\n    if (!vnode.data) {\n      return null;\n    }\n\n    // Component Model\n    if (vnode.data.model) {\n      return vnode.data.model;\n    }\n\n    return !!(vnode.data.directives) && find(vnode.data.directives, function (d) { return d.name === 'model'; });\n  }\n\n  function extractChildren (vnode) {\n    if (Array.isArray(vnode)) {\n      return vnode;\n    }\n\n    if (Array.isArray(vnode.children)) {\n      return vnode.children;\n    }\n\n    if (vnode.componentOptions && Array.isArray(vnode.componentOptions.children)) {\n      return vnode.componentOptions.children;\n    }\n\n    return [];\n  }\n\n  function extractVNodes (vnode) {\n    if (findModel(vnode)) {\n      return [vnode];\n    }\n\n    var children = extractChildren(vnode);\n\n    return children.reduce(function (nodes, node) {\n      var candidates = extractVNodes(node);\n      if (candidates.length) {\n        nodes.push.apply(nodes, candidates);\n      }\n\n      return nodes;\n    }, []);\n  }\n\n  // Resolves v-model config if exists.\n  function findModelConfig (vnode) {\n    if (!vnode.componentOptions) { return null; }\n\n    return vnode.componentOptions.Ctor.options.model;\n  }\n  // Adds a listener to vnode listener object.\n  function mergeVNodeListeners (obj, eventName, handler) {\n    // Has a single listener.\n    if (isCallable(obj[eventName])) {\n      var prevHandler = obj[eventName];\n      obj[eventName] = [prevHandler];\n    }\n\n    // has other listeners.\n    if (Array.isArray(obj[eventName])) {\n      obj[eventName].push(handler);\n      return;\n    }\n\n    // no listener at all.\n    if (isNullOrUndefined(obj[eventName])) {\n      obj[eventName] = [handler];\n    }\n  }\n\n  // Adds a listener to a native HTML vnode.\n  function addNativeNodeListener (node, eventName, handler) {\n    if (isNullOrUndefined(node.data.on)) {\n      node.data.on = {};\n    }\n\n    mergeVNodeListeners(node.data.on, eventName, handler);\n  }\n\n  // Adds a listener to a Vue component vnode.\n  function addComponentNodeListener (node, eventName, handler) {\n    /* istanbul ignore next */\n    if (!node.componentOptions.listeners) {\n      node.componentOptions.listeners = {};\n    }\n\n    mergeVNodeListeners(node.componentOptions.listeners, eventName, handler);\n  }\n  function addVNodeListener (vnode, eventName, handler) {\n    if (vnode.componentOptions) {\n      addComponentNodeListener(vnode, eventName, handler);\n      return;\n    }\n\n    addNativeNodeListener(vnode, eventName, handler);\n  }\n  // Determines if `change` should be used over `input` for listeners.\n  function getInputEventName (vnode, model) {\n    // Is a component.\n    if (vnode.componentOptions) {\n      var ref = findModelConfig(vnode) || { event: 'input' };\n      var event = ref.event;\n\n      return event;\n    }\n\n    // Lazy Models and select tag typically use change event\n    if ((model && model.modifiers && model.modifiers.lazy) || vnode.tag === 'select') {\n      return 'change';\n    }\n\n    // is a textual-type input.\n    if (vnode.data.attrs && isTextInput({ type: vnode.data.attrs.type || 'text' })) {\n      return 'input';\n    }\n\n    return 'change';\n  }\n\n  function normalizeSlots (slots, ctx) {\n    return Object.keys(slots).reduce(function (arr, key) {\n      slots[key].forEach(function (vnode) {\n        if (!vnode.context) {\n          slots[key].context = ctx;\n          if (!vnode.data) {\n            vnode.data = {};\n          }\n          vnode.data.slot = key;\n        }\n      });\n\n      return arr.concat(slots[key]);\n    }, []);\n  }\n  function createRenderless (h, children) {\n    // Only render the first item of the node.\n    if (Array.isArray(children) && children[0]) {\n      return children[0];\n    }\n\n    // a single node.\n    if (children) {\n      return children;\n    }\n\n    // No slots, render nothing.\n    return h();\n  }\n\n  /**\n   * Generates the options required to construct a field.\n   */\n  var Resolver = function Resolver () {};\n\n  Resolver.generate = function generate (el, binding, vnode) {\n    var model = Resolver.resolveModel(binding, vnode);\n    var options = resolveConfig(vnode.context);\n\n    return {\n      name: Resolver.resolveName(el, vnode),\n      el: el,\n      listen: !binding.modifiers.disable,\n      bails: binding.modifiers.bails ? true : (binding.modifiers.continues === true ? false : undefined),\n      scope: Resolver.resolveScope(el, binding, vnode),\n      vm: vnode.context,\n      expression: binding.value,\n      component: vnode.componentInstance,\n      classes: options.classes,\n      classNames: options.classNames,\n      getter: Resolver.resolveGetter(el, vnode, model),\n      events: Resolver.resolveEvents(el, vnode) || options.events,\n      model: model,\n      delay: Resolver.resolveDelay(el, vnode, options),\n      rules: Resolver.resolveRules(el, binding, vnode),\n      immediate: !!binding.modifiers.initial || !!binding.modifiers.immediate,\n      persist: !!binding.modifiers.persist,\n      validity: options.validity && !vnode.componentInstance,\n      aria: options.aria && !vnode.componentInstance,\n      initialValue: Resolver.resolveInitialValue(vnode)\n    };\n  };\n\n  Resolver.getCtorConfig = function getCtorConfig (vnode) {\n    if (!vnode.componentInstance) { return null; }\n\n    var config = getPath('componentInstance.$options.$_veeValidate', vnode);\n\n    return config;\n  };\n\n  /**\n   * Resolves the rules defined on an element.\n   */\n  Resolver.resolveRules = function resolveRules (el, binding, vnode) {\n    var rules = '';\n    if (!binding.value && (!binding || !binding.expression)) {\n      rules = getDataAttribute(el, 'rules');\n    }\n\n    if (binding.value && includes(['string', 'object'], typeof binding.value.rules)) {\n      rules = binding.value.rules;\n    } else if (binding.value) {\n      rules = binding.value;\n    }\n\n    if (vnode.componentInstance) {\n      return rules;\n    }\n\n    // If validity is disabled, ignore field rules.\n    var normalized = normalizeRules(rules);\n    if (!getConfig().useConstraintAttrs) {\n      return normalized;\n    }\n\n    return assign({}, fillRulesFromElement(el, {}), normalized);\n  };\n\n  /**\n   * @param {*} vnode\n   */\n  Resolver.resolveInitialValue = function resolveInitialValue (vnode) {\n    var model = vnode.data.model || find(vnode.data.directives, function (d) { return d.name === 'model'; });\n\n    return model && model.value;\n  };\n\n  /**\n   * Resolves the delay value.\n   * @param {*} el\n   * @param {*} vnode\n   * @param {Object} options\n   */\n  Resolver.resolveDelay = function resolveDelay (el, vnode, options) {\n    var delay = getDataAttribute(el, 'delay');\n    var globalDelay = (options && 'delay' in options) ? options.delay : 0;\n\n    if (!delay && vnode.componentInstance && vnode.componentInstance.$attrs) {\n      delay = vnode.componentInstance.$attrs['data-vv-delay'];\n    }\n\n    if (!isObject(globalDelay)) {\n      return deepParseInt(delay || globalDelay);\n    }\n\n    if (!isNullOrUndefined(delay)) {\n      globalDelay.input = delay;\n    }\n\n    return deepParseInt(globalDelay);\n  };\n\n  /**\n   * Resolves the events to validate in response to.\n   * @param {*} el\n   * @param {*} vnode\n   */\n  Resolver.resolveEvents = function resolveEvents (el, vnode) {\n    // resolve it from the root element.\n    var events = getDataAttribute(el, 'validate-on');\n\n    // resolve from data-vv-validate-on if its a vue component.\n    if (!events && vnode.componentInstance && vnode.componentInstance.$attrs) {\n      events = vnode.componentInstance.$attrs['data-vv-validate-on'];\n    }\n\n    // resolve it from $_veeValidate options.\n    if (!events && vnode.componentInstance) {\n      var config = Resolver.getCtorConfig(vnode);\n      events = config && config.events;\n    }\n\n    if (!events && getConfig().events) {\n      events = getConfig().events;\n    }\n\n    // resolve the model event if its configured for custom components.\n    if (events && vnode.componentInstance && includes(events, 'input')) {\n      var ref = vnode.componentInstance.$options.model || { event: 'input' };\n        var event = ref.event;\n      // if the prop was configured but not the model.\n      if (!event) {\n        return events;\n      }\n\n      events = events.replace('input', event);\n    }\n\n    return events;\n  };\n\n  /**\n   * Resolves the scope for the field.\n   * @param {*} el\n   * @param {*} binding\n   */\n  Resolver.resolveScope = function resolveScope (el, binding, vnode) {\n      if ( vnode === void 0 ) vnode = {};\n\n    var scope = null;\n    if (vnode.componentInstance && isNullOrUndefined(scope)) {\n      scope = vnode.componentInstance.$attrs && vnode.componentInstance.$attrs['data-vv-scope'];\n    }\n\n    return !isNullOrUndefined(scope) ? scope : getScope(el);\n  };\n\n  /**\n   * Checks if the node directives contains a v-model or a specified arg.\n   * Args take priority over models.\n   *\n   * @return {Object}\n   */\n  Resolver.resolveModel = function resolveModel (binding, vnode) {\n    if (binding.arg) {\n      return { expression: binding.arg };\n    }\n\n    var model = findModel(vnode);\n    if (!model) {\n      return null;\n    }\n\n    // https://github.com/vuejs/vue/blob/dev/src/core/util/lang.js#L26\n    var watchable = !/[^\\w.$]/.test(model.expression) && hasPath(model.expression, vnode.context);\n    var lazy = !!(model.modifiers && model.modifiers.lazy);\n\n    if (!watchable) {\n      return { expression: null, lazy: lazy };\n    }\n\n    return { expression: model.expression, lazy: lazy };\n  };\n\n  /**\n   * Resolves the field name to trigger validations.\n   * @return {String} The field name.\n   */\n  Resolver.resolveName = function resolveName (el, vnode) {\n    var name = getDataAttribute(el, 'name');\n\n    if (!name && !vnode.componentInstance) {\n      return el.name;\n    }\n\n    if (!name && vnode.componentInstance && vnode.componentInstance.$attrs) {\n      name = vnode.componentInstance.$attrs['data-vv-name'] || vnode.componentInstance.$attrs['name'];\n    }\n\n    if (!name && vnode.componentInstance) {\n      var config = Resolver.getCtorConfig(vnode);\n      if (config && isCallable(config.name)) {\n        var boundGetter = config.name.bind(vnode.componentInstance);\n\n        return boundGetter();\n      }\n\n      return vnode.componentInstance.name;\n    }\n\n    return name;\n  };\n\n  /**\n   * Returns a value getter input type.\n   */\n  Resolver.resolveGetter = function resolveGetter (el, vnode, model) {\n    if (model && model.expression) {\n      return function () {\n        return getPath(model.expression, vnode.context);\n      };\n    }\n\n    if (vnode.componentInstance) {\n      var path = getDataAttribute(el, 'value-path') || (vnode.componentInstance.$attrs && vnode.componentInstance.$attrs['data-vv-value-path']);\n      if (path) {\n        return function () {\n          return getPath(path, vnode.componentInstance);\n        };\n      }\n\n      var config = Resolver.getCtorConfig(vnode);\n      if (config && isCallable(config.value)) {\n        var boundGetter = config.value.bind(vnode.componentInstance);\n\n        return function () {\n          return boundGetter();\n        };\n      }\n\n      var ref = vnode.componentInstance.$options.model || { prop: 'value' };\n        var prop = ref.prop;\n\n      return function () {\n        return vnode.componentInstance[prop];\n      };\n    }\n\n    switch (el.type) {\n    case 'checkbox': return function () {\n      var els = document.querySelectorAll((\"input[name=\\\"\" + (el.name) + \"\\\"]\"));\n\n      els = toArray(els).filter(function (el) { return el.checked; });\n      if (!els.length) { return undefined; }\n\n      return els.map(function (checkbox) { return checkbox.value; });\n    };\n    case 'radio': return function () {\n      var els = document.querySelectorAll((\"input[name=\\\"\" + (el.name) + \"\\\"]\"));\n      var elm = find(els, function (el) { return el.checked; });\n\n      return elm && elm.value;\n    };\n    case 'file': return function (context) {\n      return toArray(el.files);\n    };\n    case 'select-multiple': return function () {\n      return toArray(el.options).filter(function (opt) { return opt.selected; }).map(function (opt) { return opt.value; });\n    };\n    default: return function () {\n      return el && el.value;\n    };\n    }\n  };\n\n  var RULES = {};\n\n  var RuleContainer = function RuleContainer () {};\n\n  var staticAccessors = { rules: { configurable: true } };\n\n  RuleContainer.add = function add (name, ref) {\n      var validate = ref.validate;\n      var options = ref.options;\n      var paramNames = ref.paramNames;\n\n    RULES[name] = {\n      validate: validate,\n      options: options,\n      paramNames: paramNames\n    };\n  };\n\n  staticAccessors.rules.get = function () {\n    return RULES;\n  };\n\n  RuleContainer.has = function has (name) {\n    return !!RULES[name];\n  };\n\n  RuleContainer.isImmediate = function isImmediate (name) {\n    return !!(RULES[name] && RULES[name].options.immediate);\n  };\n\n  RuleContainer.isRequireRule = function isRequireRule (name) {\n    return !!(RULES[name] && RULES[name].options.computesRequired);\n  };\n\n  RuleContainer.isTargetRule = function isTargetRule (name) {\n    return !!(RULES[name] && RULES[name].options.hasTarget);\n  };\n\n  RuleContainer.remove = function remove (ruleName) {\n    delete RULES[ruleName];\n  };\n\n  RuleContainer.getParamNames = function getParamNames (ruleName) {\n    return RULES[ruleName] && RULES[ruleName].paramNames;\n  };\n\n  RuleContainer.getOptions = function getOptions (ruleName) {\n    return RULES[ruleName] && RULES[ruleName].options;\n  };\n\n  RuleContainer.getValidatorMethod = function getValidatorMethod (ruleName) {\n    return RULES[ruleName] ? RULES[ruleName].validate : null;\n  };\n\n  Object.defineProperties( RuleContainer, staticAccessors );\n\n  // \n\n  var isEvent = function (evt) {\n    return (typeof Event !== 'undefined' && isCallable(Event) && evt instanceof Event) || (evt && evt.srcElement);\n  };\n\n  var normalizeEvents = function (evts) {\n    if (!evts) { return []; }\n\n    return (typeof evts === 'string' ? evts.split('|') : evts);\n  };\n\n  var supportsPassive = true;\n\n  var detectPassiveSupport = function () {\n    try {\n      var opts = Object.defineProperty({}, 'passive', {\n        get: function get () {\n          supportsPassive = true;\n        }\n      });\n      window.addEventListener('testPassive', null, opts);\n      window.removeEventListener('testPassive', null, opts);\n    } catch (e) {\n      supportsPassive = false;\n    }\n    return supportsPassive;\n  };\n\n  var addEventListener = function (el, eventName, cb) {\n    el.addEventListener(eventName, cb, supportsPassive ? { passive: true } : false);\n  };\n\n  // \n\n  var DEFAULT_OPTIONS = {\n    targetOf: null,\n    immediate: false,\n    persist: false,\n    scope: null,\n    listen: true,\n    name: null,\n    rules: {},\n    vm: null,\n    classes: false,\n    validity: true,\n    aria: true,\n    events: 'input|blur',\n    delay: 0,\n    classNames: {\n      touched: 'touched', // the control has been blurred\n      untouched: 'untouched', // the control hasn't been blurred\n      valid: 'valid', // model is valid\n      invalid: 'invalid', // model is invalid\n      pristine: 'pristine', // control has not been interacted with\n      dirty: 'dirty' // control has been interacted with\n    }\n  };\n\n  var Field = function Field (options) {\n    if ( options === void 0 ) options = {};\n\n    this.id = uniqId();\n    this.el = options.el;\n    this.updated = false;\n    this.vmId = options.vmId;\n    defineNonReactive(this, 'dependencies', []);\n    defineNonReactive(this, 'watchers', []);\n    defineNonReactive(this, 'events', []);\n    this.delay = 0;\n    this.rules = {};\n    this.forceRequired = false;\n    this._cacheId(options);\n    this.classNames = assign({}, DEFAULT_OPTIONS.classNames);\n    options = assign({}, DEFAULT_OPTIONS, options);\n    this._delay = !isNullOrUndefined(options.delay) ? options.delay : 0; // cache initial delay\n    this.validity = options.validity;\n    this.aria = options.aria;\n    this.flags = options.flags || createFlags();\n    defineNonReactive(this, 'vm', options.vm);\n    defineNonReactive(this, 'componentInstance', options.component);\n    this.ctorConfig = this.componentInstance ? getPath('$options.$_veeValidate', this.componentInstance) : undefined;\n    this.update(options);\n    // set initial value.\n    this.initialValue = this.value;\n    this.updated = false;\n  };\n\n  var prototypeAccessors$1 = { validator: { configurable: true },isRequired: { configurable: true },isDisabled: { configurable: true },alias: { configurable: true },value: { configurable: true },bails: { configurable: true },rejectsFalse: { configurable: true } };\n\n  prototypeAccessors$1.validator.get = function () {\n    if (!this.vm || !this.vm.$validator) {\n      return { validate: function () { return Promise.resolve(true); } };\n    }\n\n    return this.vm.$validator;\n  };\n\n  prototypeAccessors$1.isRequired.get = function () {\n    return !!this.rules.required || this.forceRequired;\n  };\n\n  prototypeAccessors$1.isDisabled.get = function () {\n    return !!(this.el && this.el.disabled);\n  };\n\n  /**\n   * Gets the display name (user-friendly name).\n   */\n  prototypeAccessors$1.alias.get = function () {\n    if (this._alias) {\n      return this._alias;\n    }\n\n    var alias = null;\n    if (this.ctorConfig && this.ctorConfig.alias) {\n      alias = isCallable(this.ctorConfig.alias) ? this.ctorConfig.alias.call(this.componentInstance) : this.ctorConfig.alias;\n    }\n\n    if (!alias && this.el) {\n      alias = getDataAttribute(this.el, 'as');\n    }\n\n    if (!alias && this.componentInstance) {\n      return this.componentInstance.$attrs && this.componentInstance.$attrs['data-vv-as'];\n    }\n\n    return alias;\n  };\n\n  /**\n   * Gets the input value.\n   */\n\n  prototypeAccessors$1.value.get = function () {\n    if (!isCallable(this.getter)) {\n      return undefined;\n    }\n\n    return this.getter();\n  };\n\n  prototypeAccessors$1.bails.get = function () {\n    return this._bails;\n  };\n\n  /**\n   * If the field rejects false as a valid value for the required rule.\n   */\n\n  prototypeAccessors$1.rejectsFalse.get = function () {\n    if (this.componentInstance && this.ctorConfig) {\n      return !!this.ctorConfig.rejectsFalse;\n    }\n\n    if (!this.el) {\n      return false;\n    }\n\n    return this.el.type === 'checkbox';\n  };\n\n  /**\n   * Determines if the instance matches the options provided.\n   */\n  Field.prototype.matches = function matches (options) {\n      var this$1 = this;\n\n    if (!options) {\n      return true;\n    }\n\n    if (options.id) {\n      return this.id === options.id;\n    }\n\n    var matchesComponentId = isNullOrUndefined(options.vmId) ? function () { return true; } : function (id) { return id === this$1.vmId; };\n    if (!matchesComponentId(options.vmId)) {\n      return false;\n    }\n\n    if (options.name === undefined && options.scope === undefined) {\n      return true;\n    }\n\n    if (options.scope === undefined) {\n      return this.name === options.name;\n    }\n\n    if (options.name === undefined) {\n      return this.scope === options.scope;\n    }\n\n    return options.name === this.name && options.scope === this.scope;\n  };\n\n  /**\n   * Caches the field id.\n   */\n  Field.prototype._cacheId = function _cacheId (options) {\n    if (this.el && !options.targetOf) {\n      this.el._veeValidateId = this.id;\n    }\n  };\n\n  /**\n   * Keeps a reference of the most current validation run.\n   */\n  Field.prototype.waitFor = function waitFor (pendingPromise) {\n    this._waitingFor = pendingPromise;\n  };\n\n  Field.prototype.isWaitingFor = function isWaitingFor (promise) {\n    return this._waitingFor === promise;\n  };\n\n  /**\n   * Updates the field with changed data.\n   */\n  Field.prototype.update = function update (options) {\n      var this$1 = this;\n\n    this.targetOf = options.targetOf || null;\n    this.immediate = options.immediate || this.immediate || false;\n    this.persist = options.persist || this.persist || false;\n\n    // update errors scope if the field scope was changed.\n    if (!isNullOrUndefined(options.scope) && options.scope !== this.scope && isCallable(this.validator.update)) {\n      this.validator.update(this.id, { scope: options.scope });\n    }\n    this.scope = !isNullOrUndefined(options.scope) ? options.scope\n      : !isNullOrUndefined(this.scope) ? this.scope : null;\n    this.name = (!isNullOrUndefined(options.name) ? String(options.name) : options.name) || this.name || null;\n    this.rules = options.rules !== undefined ? normalizeRules(options.rules) : this.rules;\n    this._bails = options.bails !== undefined ? options.bails : this._bails;\n    this.model = options.model || this.model;\n    this.listen = options.listen !== undefined ? options.listen : this.listen;\n    this.classes = (options.classes || this.classes || false) && !this.componentInstance;\n    this.classNames = isObject(options.classNames) ? merge(this.classNames, options.classNames) : this.classNames;\n    this.getter = isCallable(options.getter) ? options.getter : this.getter;\n    this._alias = options.alias || this._alias;\n    this.events = (options.events) ? normalizeEvents(options.events) : this.events;\n    this.delay = makeDelayObject(this.events, options.delay || this.delay, this._delay);\n    this.updateDependencies();\n    this.addActionListeners();\n\n    if ( !this.name && !this.targetOf) {\n      warn('A field is missing a \"name\" or \"data-vv-name\" attribute');\n    }\n\n    // update required flag flags\n    if (options.rules !== undefined) {\n      this.flags.required = this.isRequired;\n    }\n\n    if (Object.keys(options.rules || {}).length === 0 && this.updated) {\n      var resetFlag = this.flags.validated;\n      this.validator.validate((\"#\" + (this.id))).then(function () {\n        this$1.flags.validated = resetFlag;\n      });\n    }\n\n    // validate if it was validated before and field was updated and there was a rules mutation.\n    if (this.flags.validated && options.rules !== undefined && this.updated) {\n      this.validator.validate((\"#\" + (this.id)));\n    }\n\n    this.updated = true;\n    this.addValueListeners();\n\n    // no need to continue.\n    if (!this.el) {\n      return;\n    }\n    this.updateClasses();\n    this.updateAriaAttrs();\n  };\n\n  /**\n   * Resets field flags and errors.\n   */\n  Field.prototype.reset = function reset () {\n      var this$1 = this;\n\n    if (this._cancellationToken) {\n      this._cancellationToken.cancelled = true;\n      delete this._cancellationToken;\n    }\n\n    var defaults = createFlags();\n    Object.keys(this.flags).filter(function (flag) { return flag !== 'required'; }).forEach(function (flag) {\n      this$1.flags[flag] = defaults[flag];\n    });\n\n    // update initial value\n    this.initialValue = this.value;\n    this.flags.changed = false;\n\n    this.addValueListeners();\n    this.addActionListeners();\n    this.updateClasses(true);\n    this.updateAriaAttrs();\n    this.updateCustomValidity();\n  };\n\n  /**\n   * Sets the flags and their negated counterparts, and updates the classes and re-adds action listeners.\n   */\n  Field.prototype.setFlags = function setFlags (flags) {\n      var this$1 = this;\n\n    var negated = {\n      pristine: 'dirty',\n      dirty: 'pristine',\n      valid: 'invalid',\n      invalid: 'valid',\n      touched: 'untouched',\n      untouched: 'touched'\n    };\n\n    Object.keys(flags).forEach(function (flag) {\n      this$1.flags[flag] = flags[flag];\n      // if it has a negation and was not specified, set it as well.\n      if (negated[flag] && flags[negated[flag]] === undefined) {\n        this$1.flags[negated[flag]] = !flags[flag];\n      }\n    });\n\n    if (\n      flags.untouched !== undefined ||\n      flags.touched !== undefined ||\n      flags.dirty !== undefined ||\n      flags.pristine !== undefined\n    ) {\n      this.addActionListeners();\n    }\n    this.updateClasses();\n    this.updateAriaAttrs();\n    this.updateCustomValidity();\n  };\n\n  /**\n   * Determines if the field requires references to target fields.\n  */\n  Field.prototype.updateDependencies = function updateDependencies () {\n      var this$1 = this;\n\n    // reset dependencies.\n    this.dependencies.forEach(function (d) { return d.field.destroy(); });\n    this.dependencies = [];\n\n    // we get the selectors for each field.\n    var fields = Object.keys(this.rules).reduce(function (prev, r) {\n      if (RuleContainer.isTargetRule(r)) {\n        prev.push({ selector: this$1.rules[r][0], name: r });\n      }\n\n      return prev;\n    }, []);\n\n    if (!fields.length || !this.vm || !this.vm.$el) { return; }\n\n    // must be contained within the same component, so we use the vm root element constrain our dom search.\n    fields.forEach(function (ref$1) {\n        var selector = ref$1.selector;\n        var name = ref$1.name;\n\n      var ref = this$1.vm.$refs[selector];\n      var el = Array.isArray(ref) ? ref[0] : ref;\n      if (!el) {\n        return;\n      }\n\n      var options = {\n        vm: this$1.vm,\n        classes: this$1.classes,\n        classNames: this$1.classNames,\n        delay: this$1.delay,\n        scope: this$1.scope,\n        events: this$1.events.join('|'),\n        immediate: this$1.immediate,\n        targetOf: this$1.id\n      };\n\n      // probably a component.\n      if (isCallable(el.$watch)) {\n        options.component = el;\n        options.el = el.$el;\n        options.getter = Resolver.resolveGetter(el.$el, el.$vnode);\n      } else {\n        options.el = el;\n        options.getter = Resolver.resolveGetter(el, {});\n      }\n\n      this$1.dependencies.push({ name: name, field: new Field(options) });\n    });\n  };\n\n  /**\n   * Removes listeners.\n   */\n  Field.prototype.unwatch = function unwatch (tag) {\n      if ( tag === void 0 ) tag = null;\n\n    if (!tag) {\n      this.watchers.forEach(function (w) { return w.unwatch(); });\n      this.watchers = [];\n      return;\n    }\n\n    this.watchers.filter(function (w) { return tag.test(w.tag); }).forEach(function (w) { return w.unwatch(); });\n    this.watchers = this.watchers.filter(function (w) { return !tag.test(w.tag); });\n  };\n\n  /**\n   * Updates the element classes depending on each field flag status.\n   */\n  Field.prototype.updateClasses = function updateClasses (isReset) {\n      var this$1 = this;\n      if ( isReset === void 0 ) isReset = false;\n\n    if (!this.classes || this.isDisabled) { return; }\n    var applyClasses = function (el) {\n      toggleClass(el, this$1.classNames.dirty, this$1.flags.dirty);\n      toggleClass(el, this$1.classNames.pristine, this$1.flags.pristine);\n      toggleClass(el, this$1.classNames.touched, this$1.flags.touched);\n      toggleClass(el, this$1.classNames.untouched, this$1.flags.untouched);\n\n      // remove valid/invalid classes on reset.\n      if (isReset) {\n        toggleClass(el, this$1.classNames.valid, false);\n        toggleClass(el, this$1.classNames.invalid, false);\n      }\n\n      // make sure we don't set any classes if the state is undetermined.\n      if (!isNullOrUndefined(this$1.flags.valid) && this$1.flags.validated) {\n        toggleClass(el, this$1.classNames.valid, this$1.flags.valid);\n      }\n\n      if (!isNullOrUndefined(this$1.flags.invalid) && this$1.flags.validated) {\n        toggleClass(el, this$1.classNames.invalid, this$1.flags.invalid);\n      }\n    };\n\n    if (!isCheckboxOrRadioInput(this.el)) {\n      applyClasses(this.el);\n      return;\n    }\n\n    var els = document.querySelectorAll((\"input[name=\\\"\" + (this.el.name) + \"\\\"]\"));\n    toArray(els).forEach(applyClasses);\n  };\n\n  /**\n   * Adds the listeners required for automatic classes and some flags.\n   */\n  Field.prototype.addActionListeners = function addActionListeners () {\n      var this$1 = this;\n\n    // remove previous listeners.\n    this.unwatch(/class/);\n\n    if (!this.el) { return; }\n\n    var onBlur = function () {\n      this$1.flags.touched = true;\n      this$1.flags.untouched = false;\n      if (this$1.classes) {\n        toggleClass(this$1.el, this$1.classNames.touched, true);\n        toggleClass(this$1.el, this$1.classNames.untouched, false);\n      }\n\n      // only needed once.\n      this$1.unwatch(/^class_blur$/);\n    };\n\n    var inputEvent = isTextInput(this.el) ? 'input' : 'change';\n    var onInput = function () {\n      this$1.flags.dirty = true;\n      this$1.flags.pristine = false;\n      if (this$1.classes) {\n        toggleClass(this$1.el, this$1.classNames.pristine, false);\n        toggleClass(this$1.el, this$1.classNames.dirty, true);\n      }\n\n      // only needed once.\n      this$1.unwatch(/^class_input$/);\n    };\n\n    if (this.componentInstance && isCallable(this.componentInstance.$once)) {\n      this.componentInstance.$once('input', onInput);\n      this.componentInstance.$once('blur', onBlur);\n      this.watchers.push({\n        tag: 'class_input',\n        unwatch: function () {\n          this$1.componentInstance.$off('input', onInput);\n        }\n      });\n      this.watchers.push({\n        tag: 'class_blur',\n        unwatch: function () {\n          this$1.componentInstance.$off('blur', onBlur);\n        }\n      });\n      return;\n    }\n\n    if (!this.el) { return; }\n\n    addEventListener(this.el, inputEvent, onInput);\n    // Checkboxes and radio buttons on Mac don't emit blur naturally, so we listen on click instead.\n    var blurEvent = isCheckboxOrRadioInput(this.el) ? 'change' : 'blur';\n    addEventListener(this.el, blurEvent, onBlur);\n    this.watchers.push({\n      tag: 'class_input',\n      unwatch: function () {\n        this$1.el.removeEventListener(inputEvent, onInput);\n      }\n    });\n\n    this.watchers.push({\n      tag: 'class_blur',\n      unwatch: function () {\n        this$1.el.removeEventListener(blurEvent, onBlur);\n      }\n    });\n  };\n\n  Field.prototype.checkValueChanged = function checkValueChanged () {\n    // handle some people initialize the value to null, since text inputs have empty string value.\n    if (this.initialValue === null && this.value === '' && isTextInput(this.el)) {\n      return false;\n    }\n\n    return this.value !== this.initialValue;\n  };\n\n  /**\n   * Determines the suitable primary event to listen for.\n   */\n  Field.prototype._determineInputEvent = function _determineInputEvent () {\n    // if its a custom component, use the customized model event or the input event.\n    if (this.componentInstance) {\n      return (this.componentInstance.$options.model && this.componentInstance.$options.model.event) || 'input';\n    }\n\n    if (this.model && this.model.lazy) {\n      return 'change';\n    }\n\n    if (isTextInput(this.el)) {\n      return 'input';\n    }\n\n    return 'change';\n  };\n\n  /**\n   * Determines the list of events to listen to.\n   */\n  Field.prototype._determineEventList = function _determineEventList (defaultInputEvent) {\n      var this$1 = this;\n\n    // if no event is configured, or it is a component or a text input then respect the user choice.\n    if (!this.events.length || this.componentInstance || isTextInput(this.el)) {\n      return [].concat( this.events ).map(function (evt) {\n        if (evt === 'input' && this$1.model && this$1.model.lazy) {\n          return 'change';\n        }\n\n        return evt;\n      });\n    }\n\n    // force suitable event for non-text type fields.\n    return this.events.map(function (e) {\n      if (e === 'input') {\n        return defaultInputEvent;\n      }\n\n      return e;\n    });\n  };\n\n  /**\n   * Adds the listeners required for validation.\n   */\n  Field.prototype.addValueListeners = function addValueListeners () {\n      var this$1 = this;\n\n    this.unwatch(/^input_.+/);\n    if (!this.listen || !this.el) { return; }\n\n    var token = { cancelled: false };\n    var fn = this.targetOf ? function () {\n      var target = this$1.validator._resolveField((\"#\" + (this$1.targetOf)));\n      if (target && target.flags.validated) {\n        this$1.validator.validate((\"#\" + (this$1.targetOf)));\n      }\n    } : function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n      // if its a DOM event, resolve the value, otherwise use the first parameter as the value.\n      if (args.length === 0 || isEvent(args[0])) {\n        args[0] = this$1.value;\n      }\n\n      this$1.flags.pending = true;\n      this$1._cancellationToken = token;\n      this$1.validator.validate((\"#\" + (this$1.id)), args[0]);\n    };\n\n    var inputEvent = this._determineInputEvent();\n    var events = this._determineEventList(inputEvent);\n\n    // if on input validation is requested.\n    if (includes(events, inputEvent)) {\n      var ctx = null;\n      var expression = null;\n      var watchCtxVm = false;\n      // if its watchable from the context vm.\n      if (this.model && this.model.expression) {\n        ctx = this.vm;\n        expression = this.model.expression;\n        watchCtxVm = true;\n      }\n\n      // watch it from the custom component vm instead.\n      if (!expression && this.componentInstance && this.componentInstance.$options.model) {\n        ctx = this.componentInstance;\n        expression = this.componentInstance.$options.model.prop || 'value';\n      }\n\n      if (ctx && expression) {\n        var debouncedFn = debounce(fn, this.delay[inputEvent], token);\n        var unwatch = ctx.$watch(expression, debouncedFn);\n        this.watchers.push({\n          tag: 'input_model',\n          unwatch: function () {\n            this$1.vm.$nextTick(function () {\n              unwatch();\n            });\n          }\n        });\n\n        // filter out input event when we are watching from the context vm.\n        if (watchCtxVm) {\n          events = events.filter(function (e) { return e !== inputEvent; });\n        }\n      }\n    }\n\n    // Add events.\n    events.forEach(function (e) {\n      var debouncedFn = debounce(fn, this$1.delay[e], token);\n\n      this$1._addComponentEventListener(e, debouncedFn);\n      this$1._addHTMLEventListener(e, debouncedFn);\n    });\n  };\n\n  Field.prototype._addComponentEventListener = function _addComponentEventListener (evt, validate) {\n      var this$1 = this;\n\n    if (!this.componentInstance) { return; }\n\n    this.componentInstance.$on(evt, validate);\n    this.watchers.push({\n      tag: 'input_vue',\n      unwatch: function () {\n        this$1.componentInstance.$off(evt, validate);\n      }\n    });\n  };\n\n  Field.prototype._addHTMLEventListener = function _addHTMLEventListener (evt, validate) {\n      var this$1 = this;\n\n    if (!this.el || this.componentInstance) { return; }\n\n    // listen for the current element.\n    var addListener = function (el) {\n      addEventListener(el, evt, validate);\n      this$1.watchers.push({\n        tag: 'input_native',\n        unwatch: function () {\n          el.removeEventListener(evt, validate);\n        }\n      });\n    };\n\n    addListener(this.el);\n    if (!isCheckboxOrRadioInput(this.el)) {\n      return;\n    }\n\n    var els = document.querySelectorAll((\"input[name=\\\"\" + (this.el.name) + \"\\\"]\"));\n    toArray(els).forEach(function (el) {\n      // skip if it is added by v-validate and is not the current element.\n      if (el._veeValidateId && el !== this$1.el) {\n        return;\n      }\n\n      addListener(el);\n    });\n  };\n\n  /**\n   * Updates aria attributes on the element.\n   */\n  Field.prototype.updateAriaAttrs = function updateAriaAttrs () {\n      var this$1 = this;\n\n    if (!this.aria || !this.el || !isCallable(this.el.setAttribute)) { return; }\n\n    var applyAriaAttrs = function (el) {\n      el.setAttribute('aria-required', this$1.isRequired ? 'true' : 'false');\n      el.setAttribute('aria-invalid', this$1.flags.invalid ? 'true' : 'false');\n    };\n\n    if (!isCheckboxOrRadioInput(this.el)) {\n      applyAriaAttrs(this.el);\n      return;\n    }\n\n    var els = document.querySelectorAll((\"input[name=\\\"\" + (this.el.name) + \"\\\"]\"));\n    toArray(els).forEach(applyAriaAttrs);\n  };\n\n  /**\n   * Updates the custom validity for the field.\n   */\n  Field.prototype.updateCustomValidity = function updateCustomValidity () {\n    if (!this.validity || !this.el || !isCallable(this.el.setCustomValidity) || !this.validator.errors) { return; }\n\n    this.el.setCustomValidity(this.flags.valid ? '' : (this.validator.errors.firstById(this.id) || ''));\n  };\n\n  /**\n   * Removes all listeners.\n   */\n  Field.prototype.destroy = function destroy () {\n    // ignore the result of any ongoing validation.\n    if (this._cancellationToken) {\n      this._cancellationToken.cancelled = true;\n    }\n\n    this.unwatch();\n    this.dependencies.forEach(function (d) { return d.field.destroy(); });\n    this.dependencies = [];\n  };\n\n  Object.defineProperties( Field.prototype, prototypeAccessors$1 );\n\n  // \n\n  var FieldBag = function FieldBag (items) {\n    if ( items === void 0 ) items = [];\n\n    this.items = items || [];\n    this.itemsById = this.items.reduce(function (itemsById, item) {\n      itemsById[item.id] = item;\n      return itemsById;\n    }, {});\n  };\n\n  var prototypeAccessors$2 = { length: { configurable: true } };\n\n  FieldBag.prototype[typeof Symbol === 'function' ? Symbol.iterator : '@@iterator'] = function () {\n      var this$1 = this;\n\n    var index = 0;\n    return {\n      next: function () {\n        return { value: this$1.items[index++], done: index > this$1.items.length };\n      }\n    };\n  };\n\n  /**\n   * Gets the current items length.\n   */\n\n  prototypeAccessors$2.length.get = function () {\n    return this.items.length;\n  };\n\n  /**\n   * Finds the first field that matches the provided matcher object.\n   */\n  FieldBag.prototype.find = function find$1 (matcher) {\n    return find(this.items, function (item) { return item.matches(matcher); });\n  };\n\n  /**\n   * Finds the field with the given id, using a plain object as a map to link\n   * ids to items faster than by looping over the array and matching.\n   */\n  FieldBag.prototype.findById = function findById (id) {\n    return this.itemsById[id] || null;\n  };\n\n  /**\n   * Filters the items down to the matched fields.\n   */\n  FieldBag.prototype.filter = function filter (matcher) {\n    // multiple matchers to be tried.\n    if (Array.isArray(matcher)) {\n      return this.items.filter(function (item) { return matcher.some(function (m) { return item.matches(m); }); });\n    }\n\n    return this.items.filter(function (item) { return item.matches(matcher); });\n  };\n\n  /**\n   * Maps the field items using the mapping function.\n   */\n  FieldBag.prototype.map = function map (mapper) {\n    return this.items.map(mapper);\n  };\n\n  /**\n   * Finds and removes the first field that matches the provided matcher object, returns the removed item.\n   */\n  FieldBag.prototype.remove = function remove (matcher) {\n    var item = null;\n    if (matcher instanceof Field) {\n      item = matcher;\n    } else {\n      item = this.find(matcher);\n    }\n\n    if (!item) { return null; }\n\n    var index = this.items.indexOf(item);\n    this.items.splice(index, 1);\n    delete this.itemsById[item.id];\n\n    return item;\n  };\n\n  /**\n   * Adds a field item to the list.\n   */\n  FieldBag.prototype.push = function push (item) {\n    if (! (item instanceof Field)) {\n      throw createError('FieldBag only accepts instances of Field that has an id defined.');\n    }\n\n    if (!item.id) {\n      throw createError('Field id must be defined.');\n    }\n\n    if (this.findById(item.id)) {\n      throw createError((\"Field with id \" + (item.id) + \" is already added.\"));\n    }\n\n    this.items.push(item);\n    this.itemsById[item.id] = item;\n  };\n\n  Object.defineProperties( FieldBag.prototype, prototypeAccessors$2 );\n\n  var ScopedValidator = function ScopedValidator (base, vm) {\n    this.id = vm._uid;\n    this._base = base;\n    this._paused = false;\n\n    // create a mirror bag with limited component scope.\n    this.errors = new ErrorBag(base.errors, this.id);\n  };\n\n  var prototypeAccessors$3 = { flags: { configurable: true },rules: { configurable: true },fields: { configurable: true },dictionary: { configurable: true },locale: { configurable: true } };\n\n  prototypeAccessors$3.flags.get = function () {\n      var this$1 = this;\n\n    return this._base.fields.items.filter(function (f) { return f.vmId === this$1.id; }).reduce(function (acc, field) {\n      if (field.scope) {\n        if (!acc[(\"$\" + (field.scope))]) {\n          acc[(\"$\" + (field.scope))] = {};\n        }\n\n        acc[(\"$\" + (field.scope))][field.name] = field.flags;\n      }\n\n      acc[field.name] = field.flags;\n\n      return acc;\n    }, {});\n  };\n\n  prototypeAccessors$3.rules.get = function () {\n    return this._base.rules;\n  };\n\n  prototypeAccessors$3.fields.get = function () {\n    return new FieldBag(this._base.fields.filter({ vmId: this.id }));\n  };\n\n  prototypeAccessors$3.dictionary.get = function () {\n    return this._base.dictionary;\n  };\n\n  prototypeAccessors$3.locale.get = function () {\n    return this._base.locale;\n  };\n\n  prototypeAccessors$3.locale.set = function (val) {\n    this._base.locale = val;\n  };\n\n  ScopedValidator.prototype.localize = function localize () {\n      var ref;\n\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n    return (ref = this._base).localize.apply(ref, args);\n  };\n\n  ScopedValidator.prototype.update = function update () {\n      var ref;\n\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n    return (ref = this._base).update.apply(ref, args);\n  };\n\n  ScopedValidator.prototype.attach = function attach (opts) {\n    var attachOpts = assign({}, opts, { vmId: this.id });\n\n    return this._base.attach(attachOpts);\n  };\n\n  ScopedValidator.prototype.pause = function pause () {\n    this._paused = true;\n  };\n\n  ScopedValidator.prototype.resume = function resume () {\n    this._paused = false;\n  };\n\n  ScopedValidator.prototype.remove = function remove (ruleName) {\n    return this._base.remove(ruleName);\n  };\n\n  ScopedValidator.prototype.detach = function detach (name, scope) {\n    return this._base.detach(name, scope, this.id);\n  };\n\n  ScopedValidator.prototype.extend = function extend () {\n      var ref;\n\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n    return (ref = this._base).extend.apply(ref, args);\n  };\n\n  ScopedValidator.prototype.validate = function validate (descriptor, value, opts) {\n      if ( opts === void 0 ) opts = {};\n\n    if (this._paused) { return Promise.resolve(true); }\n\n    return this._base.validate(descriptor, value, assign({}, { vmId: this.id }, opts || {}));\n  };\n\n  ScopedValidator.prototype.verify = function verify () {\n      var ref;\n\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n    return (ref = this._base).verify.apply(ref, args);\n  };\n\n  ScopedValidator.prototype.validateAll = function validateAll (values, opts) {\n      if ( opts === void 0 ) opts = {};\n\n    if (this._paused) { return Promise.resolve(true); }\n\n    return this._base.validateAll(values, assign({}, { vmId: this.id }, opts || {}));\n  };\n\n  ScopedValidator.prototype.validateScopes = function validateScopes (opts) {\n      if ( opts === void 0 ) opts = {};\n\n    if (this._paused) { return Promise.resolve(true); }\n\n    return this._base.validateScopes(assign({}, { vmId: this.id }, opts || {}));\n  };\n\n  ScopedValidator.prototype.destroy = function destroy () {\n    delete this.id;\n    delete this._base;\n  };\n\n  ScopedValidator.prototype.reset = function reset (matcher) {\n    return this._base.reset(Object.assign({}, matcher || {}, { vmId: this.id }));\n  };\n\n  ScopedValidator.prototype.flag = function flag () {\n      var ref;\n\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n    return (ref = this._base).flag.apply(ref, args.concat( [this.id] ));\n  };\n\n  ScopedValidator.prototype._resolveField = function _resolveField () {\n      var ref;\n\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n    return (ref = this._base)._resolveField.apply(ref, args);\n  };\n\n  Object.defineProperties( ScopedValidator.prototype, prototypeAccessors$3 );\n\n  var VALIDATOR = null;\n\n  var getValidator = function () {\n    return VALIDATOR;\n  };\n\n  var setValidator = function (value) {\n    VALIDATOR = value;\n\n    return value;\n  };\n\n  // \n\n  /**\n   * Checks if a parent validator instance was requested.\n   */\n  var requestsValidator = function (injections) {\n    if (isObject(injections) && injections.$validator) {\n      return true;\n    }\n\n    return false;\n  };\n\n  var mixin = {\n    provide: function provide () {\n      if (this.$validator && !isBuiltInComponent(this.$vnode)) {\n        return {\n          $validator: this.$validator\n        };\n      }\n\n      return {};\n    },\n    beforeCreate: function beforeCreate () {\n      // if built in do nothing.\n      if (isBuiltInComponent(this.$vnode) || this.$options.$__veeInject === false) {\n        return;\n      }\n\n      // if its a root instance set the config if it exists.\n      if (!this.$parent) {\n        setConfig(this.$options.$_veeValidate || {});\n      }\n\n      var options = resolveConfig(this);\n\n      // if its a root instance, inject anyways, or if it requested a new instance.\n      if (!this.$parent || (this.$options.$_veeValidate && /new/.test(this.$options.$_veeValidate.validator))) {\n        this.$validator = new ScopedValidator(getValidator(), this);\n      }\n\n      var requested = requestsValidator(this.$options.inject);\n\n      // if automatic injection is enabled and no instance was requested.\n      if (! this.$validator && options.inject && !requested) {\n        this.$validator = new ScopedValidator(getValidator(), this);\n      }\n\n      // don't inject errors or fieldBag as no validator was resolved.\n      if (!requested && !this.$validator) {\n        return;\n      }\n\n      // There is a validator but it isn't injected, mark as reactive.\n      if (!requested && this.$validator) {\n        var Vue = this.$options._base; // the vue constructor.\n        Vue.util.defineReactive(this.$validator, 'errors', this.$validator.errors);\n      }\n\n      if (!this.$options.computed) {\n        this.$options.computed = {};\n      }\n\n      this.$options.computed[options.errorBagName || 'errors'] = function errorBagGetter () {\n        return this.$validator.errors;\n      };\n      this.$options.computed[options.fieldsBagName || 'fields'] = function fieldBagGetter () {\n        return this.$validator.fields.items.reduce(function (acc, field) {\n          if (field.scope) {\n            if (!acc[(\"$\" + (field.scope))]) {\n              acc[(\"$\" + (field.scope))] = {};\n            }\n\n            acc[(\"$\" + (field.scope))][field.name] = field.flags;\n\n            return acc;\n          }\n\n          acc[field.name] = field.flags;\n\n          return acc;\n        }, {});\n      };\n    },\n    beforeDestroy: function beforeDestroy () {\n      if (this.$validator && this._uid === this.$validator.id) {\n        this.$validator.errors.clear(); // remove errors generated by this component.\n      }\n    }\n  };\n\n  // \n\n  /**\n   * Finds the requested field by id from the context object.\n   */\n  function findField (el, context) {\n    if (!context || !context.$validator) {\n      return null;\n    }\n\n    return context.$validator.fields.findById(el._veeValidateId);\n  }\n  var directive = {\n    bind: function bind (el, binding, vnode) {\n      var validator = vnode.context.$validator;\n      if (!validator) {\n        {\n          warn(\"No validator instance is present on vm, did you forget to inject '$validator'?\");\n        }\n\n        return;\n      }\n\n      var fieldOptions = Resolver.generate(el, binding, vnode);\n      validator.attach(fieldOptions);\n    },\n    inserted: function inserted (el, binding, vnode) {\n      var field = findField(el, vnode.context);\n      var scope = Resolver.resolveScope(el, binding, vnode);\n\n      // skip if scope hasn't changed.\n      if (!field || scope === field.scope) { return; }\n\n      // only update scope.\n      field.update({ scope: scope });\n\n      // allows the field to re-evaluated once more in the update hook.\n      field.updated = false;\n    },\n    update: function update (el, binding, vnode) {\n      var field = findField(el, vnode.context);\n\n      // make sure we don't do unneccasary work if no important change was done.\n      if (!field || (field.updated && isEqual$1(binding.value, binding.oldValue))) { return; }\n      var scope = Resolver.resolveScope(el, binding, vnode);\n      var rules = Resolver.resolveRules(el, binding, vnode);\n\n      field.update({\n        scope: scope,\n        rules: rules\n      });\n    },\n    unbind: function unbind (el, binding, ref) {\n      var context = ref.context;\n\n      var field = findField(el, context);\n      if (!field) { return; }\n\n      context.$validator.detach(field);\n    }\n  };\n\n  // \n\n  var Validator = function Validator (validations, options, pluginContainer) {\n    if ( options === void 0 ) options = { fastExit: true };\n    if ( pluginContainer === void 0 ) pluginContainer = null;\n\n    this.errors = new ErrorBag();\n    this.fields = new FieldBag();\n    this._createFields(validations);\n    this.paused = false;\n    this.fastExit = !isNullOrUndefined(options && options.fastExit) ? options.fastExit : true;\n    this.$vee = pluginContainer || {\n      _vm: {\n        $nextTick: function (cb) { return isCallable(cb) ? cb() : Promise.resolve(); },\n        $emit: function () {},\n        $off: function () {}\n      }\n    };\n  };\n\n  var prototypeAccessors$4 = { rules: { configurable: true },dictionary: { configurable: true },flags: { configurable: true },locale: { configurable: true } };\n  var staticAccessors$1 = { rules: { configurable: true },dictionary: { configurable: true },locale: { configurable: true } };\n\n  /**\n   * @deprecated\n   */\n  staticAccessors$1.rules.get = function () {\n    {\n      warn('this accessor will be deprecated, use `import { rules } from \"vee-validate\"` instead.');\n    }\n\n    return RuleContainer.rules;\n  };\n\n  /**\n   * @deprecated\n   */\n  prototypeAccessors$4.rules.get = function () {\n    {\n      warn('this accessor will be deprecated, use `import { rules } from \"vee-validate\"` instead.');\n    }\n\n    return RuleContainer.rules;\n  };\n\n  prototypeAccessors$4.dictionary.get = function () {\n    return DictionaryResolver.getDriver();\n  };\n\n  staticAccessors$1.dictionary.get = function () {\n    return DictionaryResolver.getDriver();\n  };\n\n  prototypeAccessors$4.flags.get = function () {\n    return this.fields.items.reduce(function (acc, field) {\n        var obj;\n\n      if (field.scope) {\n        acc[(\"$\" + (field.scope))] = ( obj = {}, obj[field.name] = field.flags, obj );\n\n        return acc;\n      }\n\n      acc[field.name] = field.flags;\n\n      return acc;\n    }, {});\n  };\n\n  /**\n   * Getter for the current locale.\n   */\n  prototypeAccessors$4.locale.get = function () {\n    return Validator.locale;\n  };\n\n  /**\n   * Setter for the validator locale.\n   */\n  prototypeAccessors$4.locale.set = function (value) {\n    Validator.locale = value;\n  };\n\n  staticAccessors$1.locale.get = function () {\n    return DictionaryResolver.getDriver().locale;\n  };\n\n  /**\n   * Setter for the validator locale.\n   */\n  staticAccessors$1.locale.set = function (value) {\n    var hasChanged = value !== DictionaryResolver.getDriver().locale;\n    DictionaryResolver.getDriver().locale = value;\n    if (hasChanged && Validator.$vee && Validator.$vee._vm) {\n      Validator.$vee._vm.$emit('localeChanged');\n    }\n  };\n\n  /**\n   * Static constructor.\n   * @deprecated\n   */\n  Validator.create = function create (validations, options) {\n    {\n      warn('Please use `new` to create new validator instances.');\n    }\n\n    return new Validator(validations, options);\n  };\n\n  /**\n   * Adds a custom validator to the list of validation rules.\n   */\n  Validator.extend = function extend (name, validator, options) {\n      if ( options === void 0 ) options = {};\n\n    Validator._guardExtend(name, validator);\n    // rules imported from the minimal bundle\n    // will have the options embedded in them\n    var mergedOpts = validator.options || {};\n    Validator._merge(name, {\n      validator: validator,\n      paramNames: (options && options.paramNames) || validator.paramNames,\n      options: assign({ hasTarget: false, immediate: true }, mergedOpts, options || {})\n    });\n  };\n\n  /**\n   * Removes a rule from the list of validators.\n   * @deprecated\n   */\n  Validator.remove = function remove (name) {\n    {\n      warn('this method will be deprecated, you can still override your rules with `extend`');\n    }\n\n    RuleContainer.remove(name);\n  };\n\n  /**\n   * Adds and sets the current locale for the validator.\n  */\n  Validator.prototype.localize = function localize (lang, dictionary) {\n    Validator.localize(lang, dictionary);\n  };\n\n  /**\n   * Adds and sets the current locale for the validator.\n   */\n  Validator.localize = function localize (lang, dictionary) {\n      var obj;\n\n    if (isObject(lang)) {\n      DictionaryResolver.getDriver().merge(lang);\n      return;\n    }\n\n    // merge the dictionary.\n    if (dictionary) {\n      var locale = lang || dictionary.name;\n      dictionary = assign({}, dictionary);\n      DictionaryResolver.getDriver().merge(( obj = {}, obj[locale] = dictionary, obj ));\n    }\n\n    if (lang) {\n      // set the locale.\n      Validator.locale = lang;\n    }\n  };\n\n  /**\n   * Registers a field to be validated.\n   */\n  Validator.prototype.attach = function attach (fieldOpts) {\n      var this$1 = this;\n\n    // We search for a field with the same name & scope, having persist enabled\n    var oldFieldMatcher = { name: fieldOpts.name, scope: fieldOpts.scope, persist: true };\n    var oldField = fieldOpts.persist ? this.fields.find(oldFieldMatcher) : null;\n\n    if (oldField) {\n      // We keep the flags of the old field, then we remove its instance\n      fieldOpts.flags = oldField.flags;\n      oldField.destroy();\n      this.fields.remove(oldField);\n    }\n\n    // fixes initial value detection with v-model and select elements.\n    var value = fieldOpts.initialValue;\n    var field = new Field(fieldOpts);\n    this.fields.push(field);\n\n    // validate the field initially\n    if (field.immediate) {\n      this.$vee._vm.$nextTick(function () { return this$1.validate((\"#\" + (field.id)), value || field.value, { vmId: fieldOpts.vmId }); });\n    } else {\n      this._validate(field, value || field.value, { initial: true }).then(function (result) {\n        field.flags.valid = result.valid;\n        field.flags.invalid = !result.valid;\n      });\n    }\n\n    return field;\n  };\n\n  /**\n   * Sets the flags on a field.\n   */\n  Validator.prototype.flag = function flag (name, flags, uid) {\n      if ( uid === void 0 ) uid = null;\n\n    var field = this._resolveField(name, undefined, uid);\n    if (!field || !flags) {\n      return;\n    }\n\n    field.setFlags(flags);\n  };\n\n  /**\n   * Removes a field from the validator.\n   */\n  Validator.prototype.detach = function detach (name, scope, uid) {\n    var field = isCallable(name.destroy) ? name : this._resolveField(name, scope, uid);\n    if (!field) { return; }\n\n    // We destroy/remove the field & error instances if it's not a `persist` one\n    if (!field.persist) {\n      field.destroy();\n      this.errors.remove(field.name, field.scope, field.vmId);\n      this.fields.remove(field);\n    }\n  };\n\n  /**\n   * Adds a custom validator to the list of validation rules.\n   */\n  Validator.prototype.extend = function extend (name, validator, options) {\n      if ( options === void 0 ) options = {};\n\n    Validator.extend(name, validator, options);\n  };\n\n  Validator.prototype.reset = function reset (matcher) {\n      var this$1 = this;\n\n    // two ticks\n    return this.$vee._vm.$nextTick().then(function () {\n      return this$1.$vee._vm.$nextTick();\n    }).then(function () {\n      this$1.fields.filter(matcher).forEach(function (field) {\n        field.waitFor(null);\n        field.reset(); // reset field flags.\n        this$1.errors.remove(field.name, field.scope, matcher && matcher.vmId);\n      });\n    });\n  };\n\n  /**\n   * Updates a field, updating both errors and flags.\n   */\n  Validator.prototype.update = function update (id, ref) {\n      var scope = ref.scope;\n\n    var field = this._resolveField((\"#\" + id));\n    if (!field) { return; }\n\n    // remove old scope.\n    this.errors.update(id, { scope: scope });\n  };\n\n  /**\n   * Removes a rule from the list of validators.\n   * @deprecated\n   */\n  Validator.prototype.remove = function remove (name) {\n    Validator.remove(name);\n  };\n\n  /**\n   * Validates a value against a registered field validations.\n   */\n  Validator.prototype.validate = function validate (fieldDescriptor, value, ref) {\n      var this$1 = this;\n      if ( ref === void 0 ) ref = {};\n      var silent = ref.silent;\n      var vmId = ref.vmId;\n\n    if (this.paused) { return Promise.resolve(true); }\n\n    // overload to validate all.\n    if (isNullOrUndefined(fieldDescriptor)) {\n      return this.validateScopes({ silent: silent, vmId: vmId });\n    }\n\n    // overload to validate scope-less fields.\n    if (fieldDescriptor === '*') {\n      return this.validateAll(undefined, { silent: silent, vmId: vmId });\n    }\n\n    // if scope validation was requested.\n    if (/^(.+)\\.\\*$/.test(fieldDescriptor)) {\n      var matched = fieldDescriptor.match(/^(.+)\\.\\*$/)[1];\n      return this.validateAll(matched);\n    }\n\n    var field = this._resolveField(fieldDescriptor);\n    if (!field) {\n      return this._handleFieldNotFound(fieldDescriptor);\n    }\n\n    if (!silent) { field.flags.pending = true; }\n    if (value === undefined) {\n      value = field.value;\n    }\n\n    var validationPromise = this._validate(field, value);\n    field.waitFor(validationPromise);\n\n    return validationPromise.then(function (result) {\n      if (!silent && field.isWaitingFor(validationPromise)) {\n        // allow next validation to mutate the state.\n        field.waitFor(null);\n        this$1._handleValidationResults([result], vmId);\n      }\n\n      return result.valid;\n    });\n  };\n\n  /**\n   * Pauses the validator.\n   */\n  Validator.prototype.pause = function pause () {\n    this.paused = true;\n\n    return this;\n  };\n\n  /**\n   * Resumes the validator.\n   */\n  Validator.prototype.resume = function resume () {\n    this.paused = false;\n\n    return this;\n  };\n\n  /**\n   * Validates each value against the corresponding field validations.\n   */\n  Validator.prototype.validateAll = function validateAll (values, ref) {\n      var this$1 = this;\n      if ( ref === void 0 ) ref = {};\n      var silent = ref.silent;\n      var vmId = ref.vmId;\n\n    if (this.paused) { return Promise.resolve(true); }\n\n    var matcher = null;\n    var providedValues = false;\n\n    if (typeof values === 'string') {\n      matcher = { scope: values, vmId: vmId };\n    } else if (isObject(values)) {\n      matcher = Object.keys(values).map(function (key) {\n        return { name: key, vmId: vmId, scope: null };\n      });\n      providedValues = true;\n    } else if (Array.isArray(values)) {\n      matcher = values.map(function (key) {\n        return typeof key === 'object' ? Object.assign({ vmId: vmId }, key) : { name: key, vmId: vmId };\n      });\n    } else {\n      matcher = { scope: null, vmId: vmId };\n    }\n\n    return Promise.all(\n      this.fields.filter(matcher).map(function (field) { return this$1._validate(field, providedValues ? values[field.name] : field.value); })\n    ).then(function (results) {\n      if (!silent) {\n        this$1._handleValidationResults(results, vmId);\n      }\n\n      return results.every(function (t) { return t.valid; });\n    });\n  };\n\n  /**\n   * Validates all scopes.\n   */\n  Validator.prototype.validateScopes = function validateScopes (ref) {\n      var this$1 = this;\n      if ( ref === void 0 ) ref = {};\n      var silent = ref.silent;\n      var vmId = ref.vmId;\n\n    if (this.paused) { return Promise.resolve(true); }\n\n    return Promise.all(\n      this.fields.filter({ vmId: vmId }).map(function (field) { return this$1._validate(field, field.value); })\n    ).then(function (results) {\n      if (!silent) {\n        this$1._handleValidationResults(results, vmId);\n      }\n\n      return results.every(function (t) { return t.valid; });\n    });\n  };\n\n  /**\n   * Validates a value against the rules.\n   */\n  Validator.prototype.verify = function verify (value, rules, options) {\n      if ( options === void 0 ) options = {};\n\n    var field = {\n      name: (options && options.name) || '{field}',\n      rules: normalizeRules(rules),\n      bails: getPath('bails', options, true),\n      forceRequired: false,\n      get isRequired () {\n        return !!this.rules.required || this.forceRequired;\n      }\n    };\n\n    var targetRules = Object.keys(field.rules).filter(RuleContainer.isTargetRule);\n    if (targetRules.length && options && isObject(options.values)) {\n      field.dependencies = targetRules.map(function (rule) {\n        var ref = field.rules[rule];\n          var targetKey = ref[0];\n\n        return {\n          name: rule,\n          field: { value: options.values[targetKey] }\n        };\n      });\n    }\n\n    return this._validate(field, value).then(function (result) {\n      var errors = [];\n      var ruleMap = {};\n      result.errors.forEach(function (e) {\n        errors.push(e.msg);\n        ruleMap[e.rule] = e.msg;\n      });\n\n      return {\n        valid: result.valid,\n        errors: errors,\n        failedRules: ruleMap\n      };\n    });\n  };\n\n  /**\n   * Perform cleanup.\n   */\n  Validator.prototype.destroy = function destroy () {\n    this.$vee._vm.$off('localeChanged');\n  };\n\n  /**\n   * Creates the fields to be validated.\n   */\n  Validator.prototype._createFields = function _createFields (validations) {\n      var this$1 = this;\n\n    if (!validations) { return; }\n\n    Object.keys(validations).forEach(function (field) {\n      var options = assign({}, { name: field, rules: validations[field] });\n      this$1.attach(options);\n    });\n  };\n\n  /**\n   * Date rules need the existence of a format, so date_format must be supplied.\n   */\n  Validator.prototype._getDateFormat = function _getDateFormat (validations) {\n    var format = null;\n    if (validations.date_format && Array.isArray(validations.date_format)) {\n      format = validations.date_format[0];\n    }\n\n    return format || DictionaryResolver.getDriver().getDateFormat(this.locale);\n  };\n\n  /**\n   * Formats an error message for field and a rule.\n   */\n  Validator.prototype._formatErrorMessage = function _formatErrorMessage (field, rule, data, targetName) {\n      if ( data === void 0 ) data = {};\n      if ( targetName === void 0 ) targetName = null;\n\n    var name = this._getFieldDisplayName(field);\n    var params = this._getLocalizedParams(rule, targetName);\n\n    return DictionaryResolver.getDriver().getFieldMessage(this.locale, field.name, rule.name, [name, params, data]);\n  };\n\n  /**\n   * We need to convert any object param to an array format since the locales do not handle params as objects yet.\n   */\n  Validator.prototype._convertParamObjectToArray = function _convertParamObjectToArray (obj, ruleName) {\n    if (Array.isArray(obj)) {\n      return obj;\n    }\n\n    var paramNames = RuleContainer.getParamNames(ruleName);\n    if (!paramNames || !isObject(obj)) {\n      return obj;\n    }\n\n    return paramNames.reduce(function (prev, paramName) {\n      if (paramName in obj) {\n        prev.push(obj[paramName]);\n      }\n\n      return prev;\n    }, []);\n  };\n\n  /**\n   * Translates the parameters passed to the rule (mainly for target fields).\n   */\n  Validator.prototype._getLocalizedParams = function _getLocalizedParams (rule, targetName) {\n      if ( targetName === void 0 ) targetName = null;\n\n    var params = this._convertParamObjectToArray(rule.params, rule.name);\n    if (rule.options.hasTarget && params && params[0]) {\n      var localizedName = targetName || DictionaryResolver.getDriver().getAttribute(this.locale, params[0], params[0]);\n      return [localizedName].concat(params.slice(1));\n    }\n\n    return params;\n  };\n\n  /**\n   * Resolves an appropriate display name, first checking 'data-as' or the registered 'prettyName'\n   */\n  Validator.prototype._getFieldDisplayName = function _getFieldDisplayName (field) {\n    return field.alias || DictionaryResolver.getDriver().getAttribute(this.locale, field.name, field.name);\n  };\n\n  /**\n   * Converts an array of params to an object with named properties.\n   * Only works if the rule is configured with a paramNames array.\n   * Returns the same params if it cannot convert it.\n   */\n  Validator.prototype._convertParamArrayToObj = function _convertParamArrayToObj (params, ruleName) {\n    var paramNames = RuleContainer.getParamNames(ruleName);\n    if (!paramNames) {\n      return params;\n    }\n\n    if (isObject(params)) {\n      // check if the object is either a config object or a single parameter that is an object.\n      var hasKeys = paramNames.some(function (name) { return Object.keys(params).indexOf(name) !== -1; });\n      // if it has some of the keys, return it as is.\n      if (hasKeys) {\n        return params;\n      }\n      // otherwise wrap the object in an array.\n      params = [params];\n    }\n\n    // Reduce the paramsNames to a param object.\n    return params.reduce(function (prev, value, idx) {\n      prev[paramNames[idx]] = value;\n\n      return prev;\n    }, {});\n  };\n\n  /**\n   * Tests a single input value against a rule.\n   */\n  Validator.prototype._test = function _test (field, value, rule) {\n      var this$1 = this;\n\n    var validator = RuleContainer.getValidatorMethod(rule.name);\n    var params = Array.isArray(rule.params) ? toArray(rule.params) : rule.params;\n    if (!params) {\n      params = [];\n    }\n\n    var targetName = null;\n    if (!validator || typeof validator !== 'function') {\n      return Promise.reject(createError((\"No such validator '\" + (rule.name) + \"' exists.\")));\n    }\n\n    // has field dependencies.\n    if (rule.options.hasTarget && field.dependencies) {\n      var target = find(field.dependencies, function (d) { return d.name === rule.name; });\n      if (target) {\n        targetName = target.field.alias;\n        params = [target.field.value].concat(params.slice(1));\n      }\n    } else if (rule.name === 'required' && field.rejectsFalse) {\n      // invalidate false if no args were specified and the field rejects false by default.\n      params = params.length ? params : [true];\n    }\n\n    if (rule.options.isDate) {\n      var dateFormat = this._getDateFormat(field.rules);\n      if (rule.name !== 'date_format') {\n        params.push(dateFormat);\n      }\n    }\n\n    var result = validator(value, this._convertParamArrayToObj(params, rule.name));\n\n    // If it is a promise.\n    if (isCallable(result.then)) {\n      return result.then(function (values) {\n        var allValid = true;\n        var data = {};\n        if (Array.isArray(values)) {\n          allValid = values.every(function (t) { return (isObject(t) ? t.valid : t); });\n        } else { // Is a single object/boolean.\n          allValid = isObject(values) ? values.valid : values;\n          data = values.data;\n        }\n\n        return {\n          valid: allValid,\n          data: result.data,\n          errors: allValid ? [] : [this$1._createFieldError(field, rule, data, targetName)]\n        };\n      });\n    }\n\n    if (!isObject(result)) {\n      result = { valid: result, data: {} };\n    }\n\n    return {\n      valid: result.valid,\n      data: result.data,\n      errors: result.valid ? [] : [this._createFieldError(field, rule, result.data, targetName)]\n    };\n  };\n\n  /**\n   * Merges a validator object into the RULES and Messages.\n   */\n  Validator._merge = function _merge (name, ref) {\n      var validator = ref.validator;\n      var options = ref.options;\n      var paramNames = ref.paramNames;\n\n    var validate = isCallable(validator) ? validator : validator.validate;\n    if (validator.getMessage) {\n      DictionaryResolver.getDriver().setMessage(Validator.locale, name, validator.getMessage);\n    }\n\n    RuleContainer.add(name, {\n      validate: validate,\n      options: options,\n      paramNames: paramNames\n    });\n  };\n\n  /**\n   * Guards from extension violations.\n   */\n  Validator._guardExtend = function _guardExtend (name, validator) {\n    if (isCallable(validator)) {\n      return;\n    }\n\n    if (!isCallable(validator.validate)) {\n      throw createError(\n        (\"Extension Error: The validator '\" + name + \"' must be a function or have a 'validate' method.\")\n      );\n    }\n  };\n\n  /**\n   * Creates a Field Error Object.\n   */\n  Validator.prototype._createFieldError = function _createFieldError (field, rule, data, targetName) {\n      var this$1 = this;\n\n    return {\n      id: field.id,\n      vmId: field.vmId,\n      field: field.name,\n      msg: this._formatErrorMessage(field, rule, data, targetName),\n      rule: rule.name,\n      scope: field.scope,\n      regenerate: function () {\n        return this$1._formatErrorMessage(field, rule, data, targetName);\n      }\n    };\n  };\n\n  /**\n   * Tries different strategies to find a field.\n   */\n  Validator.prototype._resolveField = function _resolveField (name, scope, uid) {\n    if (name[0] === '#') {\n      return this.fields.findById(name.slice(1));\n    }\n\n    if (!isNullOrUndefined(scope)) {\n      return this.fields.find({ name: name, scope: scope, vmId: uid });\n    }\n\n    if (includes(name, '.')) {\n      var ref = name.split('.');\n        var fieldScope = ref[0];\n        var fieldName = ref.slice(1);\n      var field = this.fields.find({ name: fieldName.join('.'), scope: fieldScope, vmId: uid });\n      if (field) {\n        return field;\n      }\n    }\n\n    return this.fields.find({ name: name, scope: null, vmId: uid });\n  };\n\n  /**\n   * Handles when a field is not found.\n   */\n  Validator.prototype._handleFieldNotFound = function _handleFieldNotFound (name, scope) {\n    var fullName = isNullOrUndefined(scope) ? name : (\"\" + (!isNullOrUndefined(scope) ? scope + '.' : '') + name);\n\n    return Promise.reject(createError(\n      (\"Validating a non-existent field: \\\"\" + fullName + \"\\\". Use \\\"attach()\\\" first.\")\n    ));\n  };\n\n  /**\n   * Handles validation results.\n   */\n  Validator.prototype._handleValidationResults = function _handleValidationResults (results, vmId) {\n      var this$1 = this;\n\n    var matchers = results.map(function (result) { return ({ id: result.id }); });\n    this.errors.removeById(matchers.map(function (m) { return m.id; }));\n    // remove by name and scope to remove any custom errors added.\n    results.forEach(function (result) {\n      this$1.errors.remove(result.field, result.scope, vmId);\n    });\n    var allErrors = results.reduce(function (prev, curr) {\n      prev.push.apply(prev, curr.errors);\n\n      return prev;\n    }, []);\n\n    this.errors.add(allErrors);\n\n    // handle flags.\n    this.fields.filter(matchers).forEach(function (field) {\n      var result = find(results, function (r) { return r.id === field.id; });\n      field.setFlags({\n        pending: false,\n        valid: result.valid,\n        validated: true\n      });\n    });\n  };\n\n  Validator.prototype._shouldSkip = function _shouldSkip (field, value) {\n    // field is configured to run through the pipeline regardless\n    if (field.bails === false) {\n      return false;\n    }\n\n    // disabled fields are skipped if useConstraintAttrs is enabled in config\n    if (field.isDisabled && getConfig().useConstraintAttrs) {\n      return true;\n    }\n\n    // skip if the field is not required and has an empty value.\n    return !field.isRequired && (isNullOrUndefined(value) || value === '' || isEmptyArray(value));\n  };\n\n  Validator.prototype._shouldBail = function _shouldBail (field) {\n    // if the field was configured explicitly.\n    if (field.bails !== undefined) {\n      return field.bails;\n    }\n\n    return this.fastExit;\n  };\n\n  /**\n   * Starts the validation process.\n   */\n  Validator.prototype._validate = function _validate (field, value, ref) {\n      var this$1 = this;\n      if ( ref === void 0 ) ref = {};\n      var initial = ref.initial;\n\n    var requireRules = Object.keys(field.rules).filter(RuleContainer.isRequireRule);\n\n    field.forceRequired = false;\n    requireRules.forEach(function (rule) {\n      var ruleOptions = RuleContainer.getOptions(rule);\n      var result = this$1._test(field, value, { name: rule, params: field.rules[rule], options: ruleOptions });\n\n      if (isCallable(result.then)) { throw createError('Require rules cannot be async'); }\n      if (!isObject(result)) { throw createError('Require rules has to return an object (see docs)'); }\n\n      if (result.data.required === true) {\n        field.forceRequired = true;\n      }\n    });\n\n    if (this._shouldSkip(field, value)) {\n      return Promise.resolve({ valid: true, id: field.id, field: field.name, scope: field.scope, errors: [] });\n    }\n\n    var promises = [];\n    var errors = [];\n    var isExitEarly = false;\n    if (isCallable(field.checkValueChanged)) {\n      field.flags.changed = field.checkValueChanged();\n    }\n\n    // use of '.some()' is to break iteration in middle by returning true\n    Object.keys(field.rules).filter(function (rule) {\n      if (!initial || !RuleContainer.has(rule)) { return true; }\n\n      return RuleContainer.isImmediate(rule);\n    }).some(function (rule) {\n      var ruleOptions = RuleContainer.getOptions(rule);\n      var result = this$1._test(field, value, { name: rule, params: field.rules[rule], options: ruleOptions });\n      if (isCallable(result.then)) {\n        promises.push(result);\n      } else if (!result.valid && this$1._shouldBail(field)) {\n        errors.push.apply(errors, result.errors);\n        isExitEarly = true;\n      } else {\n        // promisify the result.\n        promises.push(new Promise(function (resolve) { return resolve(result); }));\n      }\n\n      return isExitEarly;\n    });\n\n    if (isExitEarly) {\n      return Promise.resolve({ valid: false, errors: errors, id: field.id, field: field.name, scope: field.scope });\n    }\n\n    return Promise.all(promises).then(function (results) {\n      return results.reduce(function (prev, v) {\n          var ref;\n\n        if (!v.valid) {\n          (ref = prev.errors).push.apply(ref, v.errors);\n        }\n\n        prev.valid = prev.valid && v.valid;\n\n        return prev;\n      }, { valid: true, errors: errors, id: field.id, field: field.name, scope: field.scope });\n    });\n  };\n\n  Object.defineProperties( Validator.prototype, prototypeAccessors$4 );\n  Object.defineProperties( Validator, staticAccessors$1 );\n\n  // \n\n  var normalizeValue = function (value) {\n    if (isObject(value)) {\n      return Object.keys(value).reduce(function (prev, key) {\n        prev[key] = normalizeValue(value[key]);\n\n        return prev;\n      }, {});\n    }\n\n    if (isCallable(value)) {\n      return value('{0}', ['{1}', '{2}', '{3}']);\n    }\n\n    return value;\n  };\n\n  var normalizeFormat = function (locale) {\n    // normalize messages\n    var dictionary = {};\n    if (locale.messages) {\n      dictionary.messages = normalizeValue(locale.messages);\n    }\n\n    if (locale.custom) {\n      dictionary.custom = normalizeValue(locale.custom);\n    }\n\n    if (locale.attributes) {\n      dictionary.attributes = locale.attributes;\n    }\n\n    if (!isNullOrUndefined(locale.dateFormat)) {\n      dictionary.dateFormat = locale.dateFormat;\n    }\n\n    return dictionary;\n  };\n\n  var I18nDictionary = function I18nDictionary (i18n, rootKey) {\n    this.i18n = i18n;\n    this.rootKey = rootKey;\n  };\n\n  var prototypeAccessors$5 = { locale: { configurable: true } };\n\n  prototypeAccessors$5.locale.get = function () {\n    return this.i18n.locale;\n  };\n\n  prototypeAccessors$5.locale.set = function (value) {\n    warn('Cannot set locale from the validator when using vue-i18n, use i18n.locale setter instead');\n  };\n\n  I18nDictionary.prototype.getDateFormat = function getDateFormat (locale) {\n    return this.i18n.getDateTimeFormat(locale || this.locale);\n  };\n\n  I18nDictionary.prototype.setDateFormat = function setDateFormat (locale, value) {\n    this.i18n.setDateTimeFormat(locale || this.locale, value);\n  };\n\n  I18nDictionary.prototype.getMessage = function getMessage (_, key, data) {\n    var path = (this.rootKey) + \".messages.\" + key;\n    var dataOptions = data;\n\n    if (Array.isArray(data)) {\n      dataOptions = [].concat.apply([], data);\n    }\n\n    if (this.i18n.te(path)) {\n      return this.i18n.t(path, dataOptions);\n    }\n\n    // fallback to the fallback message\n    if (this.i18n.te(path, this.i18n.fallbackLocale)) {\n      return this.i18n.t(path, this.i18n.fallbackLocale, dataOptions);\n    }\n\n    // fallback to the root message\n    return this.i18n.t(((this.rootKey) + \".messages._default\"), dataOptions);\n  };\n\n  I18nDictionary.prototype.getAttribute = function getAttribute (_, key, fallback) {\n      if ( fallback === void 0 ) fallback = '';\n\n    var path = (this.rootKey) + \".attributes.\" + key;\n    if (this.i18n.te(path)) {\n      return this.i18n.t(path);\n    }\n\n    return fallback;\n  };\n\n  I18nDictionary.prototype.getFieldMessage = function getFieldMessage (_, field, key, data) {\n    var path = (this.rootKey) + \".custom.\" + field + \".\" + key;\n    if (this.i18n.te(path)) {\n      return this.i18n.t(path, data);\n    }\n\n    return this.getMessage(_, key, data);\n  };\n\n  I18nDictionary.prototype.merge = function merge$1 (dictionary) {\n      var this$1 = this;\n\n    Object.keys(dictionary).forEach(function (localeKey) {\n        var obj;\n\n      // i18n doesn't deep merge\n      // first clone the existing locale (avoid mutations to locale)\n      var clone = merge({}, getPath((localeKey + \".\" + (this$1.rootKey)), this$1.i18n.messages, {}));\n      // Merge cloned locale with new one\n      var locale = merge(clone, normalizeFormat(dictionary[localeKey]));\n      this$1.i18n.mergeLocaleMessage(localeKey, ( obj = {}, obj[this$1.rootKey] = locale, obj ));\n      if (locale.dateFormat) {\n        this$1.i18n.setDateTimeFormat(localeKey, locale.dateFormat);\n      }\n    });\n  };\n\n  I18nDictionary.prototype.setMessage = function setMessage (locale, key, value) {\n      var obj, obj$1;\n\n    this.merge(( obj$1 = {}, obj$1[locale] = {\n        messages: ( obj = {}, obj[key] = value, obj )\n      }, obj$1 ));\n  };\n\n  I18nDictionary.prototype.setAttribute = function setAttribute (locale, key, value) {\n      var obj, obj$1;\n\n    this.merge(( obj$1 = {}, obj$1[locale] = {\n        attributes: ( obj = {}, obj[key] = value, obj )\n      }, obj$1 ));\n  };\n\n  Object.defineProperties( I18nDictionary.prototype, prototypeAccessors$5 );\n\n  var aggressive = function () { return ({\n    on: ['input']\n  }); };\n\n  var lazy = function () { return ({\n    on: ['change']\n  }); };\n\n  var eager = function (ref) {\n    var errors = ref.errors;\n\n    if (errors.length) {\n      return {\n        on: ['input']\n      };\n    }\n\n    return {\n      on: ['change', 'blur']\n    };\n  };\n\n  var passive = function () { return ({\n    on: []\n  }); };\n\n  var modes = {\n    aggressive: aggressive,\n    eager: eager,\n    passive: passive,\n    lazy: lazy\n  };\n\n  // \n\n  var Vue;\n  var pendingPlugins;\n  var pluginInstance;\n\n  var VeeValidate$1 = function VeeValidate (config, _Vue) {\n    this.configure(config);\n    pluginInstance = this;\n    if (_Vue) {\n      Vue = _Vue;\n    }\n    this._validator = setValidator(\n      new Validator(null, { fastExit: config && config.fastExit }, this)\n    );\n    this._initVM(this.config);\n    this._initI18n(this.config);\n  };\n\n  var prototypeAccessors$6 = { i18nDriver: { configurable: true },config: { configurable: true } };\n  var staticAccessors$2 = { i18nDriver: { configurable: true },config: { configurable: true } };\n\n  VeeValidate$1.setI18nDriver = function setI18nDriver (driver, instance) {\n    DictionaryResolver.setDriver(driver, instance);\n  };\n\n  VeeValidate$1.configure = function configure (cfg) {\n    setConfig(cfg);\n  };\n\n  VeeValidate$1.setMode = function setMode (mode, implementation) {\n    setConfig({ mode: mode });\n    if (!implementation) {\n      return;\n    }\n\n    if (!isCallable(implementation)) {\n      throw new Error('A mode implementation must be a function');\n    }\n\n    modes[mode] = implementation;\n  };\n\n  VeeValidate$1.use = function use (plugin, options) {\n      if ( options === void 0 ) options = {};\n\n    if (!isCallable(plugin)) {\n      return warn('The plugin must be a callable function');\n    }\n\n    // Don't install plugins until vee-validate is installed.\n    if (!pluginInstance) {\n      if (!pendingPlugins) {\n        pendingPlugins = [];\n      }\n      pendingPlugins.push({ plugin: plugin, options: options });\n      return;\n    }\n\n    plugin({ Validator: Validator, ErrorBag: ErrorBag, Rules: Validator.rules }, options);\n  };\n  VeeValidate$1.install = function install (_Vue, opts) {\n    if (Vue && _Vue === Vue) {\n      {\n        warn('already installed, Vue.use(VeeValidate) should only be called once.');\n      }\n      return;\n    }\n\n    Vue = _Vue;\n    pluginInstance = new VeeValidate$1(opts);\n    // inject the plugin container statically into the validator class\n    Validator.$vee = pluginInstance;\n\n    detectPassiveSupport();\n\n    Vue.mixin(mixin);\n    Vue.directive('validate', directive);\n    if (pendingPlugins) {\n      pendingPlugins.forEach(function (ref) {\n          var plugin = ref.plugin;\n          var options = ref.options;\n\n        VeeValidate$1.use(plugin, options);\n      });\n      pendingPlugins = null;\n    }\n  };\n\n  prototypeAccessors$6.i18nDriver.get = function () {\n    return DictionaryResolver.getDriver();\n  };\n\n  staticAccessors$2.i18nDriver.get = function () {\n    return DictionaryResolver.getDriver();\n  };\n\n  prototypeAccessors$6.config.get = function () {\n    return getConfig();\n  };\n\n  staticAccessors$2.config.get = function () {\n    return getConfig();\n  };\n\n  VeeValidate$1.prototype._initVM = function _initVM (config) {\n      var this$1 = this;\n\n    this._vm = new Vue({\n      data: function () { return ({\n        errors: this$1._validator.errors,\n        fields: this$1._validator.fields\n      }); }\n    });\n  };\n\n  VeeValidate$1.prototype._initI18n = function _initI18n (config) {\n      var this$1 = this;\n\n    var dictionary = config.dictionary;\n      var i18n = config.i18n;\n      var i18nRootKey = config.i18nRootKey;\n      var locale = config.locale;\n    var onLocaleChanged = function () {\n      if (dictionary) {\n        this$1.i18nDriver.merge(dictionary);\n      }\n\n      this$1._validator.errors.regenerate();\n    };\n\n    // i18 is being used for localization.\n    if (i18n) {\n      VeeValidate$1.setI18nDriver('i18n', new I18nDictionary(i18n, i18nRootKey));\n      i18n._vm.$watch('locale', onLocaleChanged);\n    } else if (typeof window !== 'undefined') {\n      this._vm.$on('localeChanged', onLocaleChanged);\n    }\n\n    if (dictionary) {\n      this.i18nDriver.merge(dictionary);\n    }\n\n    if (locale && !i18n) {\n      this._validator.localize(locale);\n    }\n  };\n\n  VeeValidate$1.prototype.configure = function configure (cfg) {\n    setConfig(cfg);\n  };\n\n  Object.defineProperties( VeeValidate$1.prototype, prototypeAccessors$6 );\n  Object.defineProperties( VeeValidate$1, staticAccessors$2 );\n\n  VeeValidate$1.mixin = mixin;\n  VeeValidate$1.directive = directive;\n  VeeValidate$1.Validator = Validator;\n  VeeValidate$1.ErrorBag = ErrorBag;\n\n  // \n\n  var normalize = function (fields) {\n    if (Array.isArray(fields)) {\n      return fields.reduce(function (prev, curr) {\n        if (includes(curr, '.')) {\n          prev[curr.split('.')[1]] = curr;\n        } else {\n          prev[curr] = curr;\n        }\n\n        return prev;\n      }, {});\n    }\n\n    return fields;\n  };\n\n  // Combines two flags using either AND or OR depending on the flag type.\n  var combine = function (lhs, rhs) {\n    var mapper = {\n      pristine: function (lhs, rhs) { return lhs && rhs; },\n      dirty: function (lhs, rhs) { return lhs || rhs; },\n      touched: function (lhs, rhs) { return lhs || rhs; },\n      untouched: function (lhs, rhs) { return lhs && rhs; },\n      valid: function (lhs, rhs) { return lhs && rhs; },\n      invalid: function (lhs, rhs) { return lhs || rhs; },\n      pending: function (lhs, rhs) { return lhs || rhs; },\n      required: function (lhs, rhs) { return lhs || rhs; },\n      validated: function (lhs, rhs) { return lhs && rhs; }\n    };\n\n    return Object.keys(mapper).reduce(function (flags, flag) {\n      flags[flag] = mapper[flag](lhs[flag], rhs[flag]);\n\n      return flags;\n    }, {});\n  };\n\n  var mapScope = function (scope, deep) {\n    if ( deep === void 0 ) deep = true;\n\n    return Object.keys(scope).reduce(function (flags, field) {\n      if (!flags) {\n        flags = assign({}, scope[field]);\n        return flags;\n      }\n\n      // scope.\n      var isScope = field.indexOf('$') === 0;\n      if (deep && isScope) {\n        return combine(mapScope(scope[field]), flags);\n      } else if (!deep && isScope) {\n        return flags;\n      }\n\n      flags = combine(flags, scope[field]);\n\n      return flags;\n    }, null);\n  };\n\n  /**\n   * Maps fields to computed functions.\n   */\n  var mapFields = function (fields) {\n    if (!fields) {\n      return function () {\n        return mapScope(this.$validator.flags);\n      };\n    }\n\n    var normalized = normalize(fields);\n    return Object.keys(normalized).reduce(function (prev, curr) {\n      var field = normalized[curr];\n      prev[curr] = function mappedField () {\n        // if field exists\n        if (this.$validator.flags[field]) {\n          return this.$validator.flags[field];\n        }\n\n        // scopeless fields were selected.\n        if (normalized[curr] === '*') {\n          return mapScope(this.$validator.flags, false);\n        }\n\n        // if it has a scope defined\n        var index = field.indexOf('.');\n        if (index <= 0) {\n          return {};\n        }\n\n        var ref = field.split('.');\n        var scope = ref[0];\n        var name = ref.slice(1);\n\n        scope = this.$validator.flags[(\"$\" + scope)];\n        name = name.join('.');\n\n        // an entire scope was selected: scope.*\n        if (name === '*' && scope) {\n          return mapScope(scope);\n        }\n\n        if (scope && scope[name]) {\n          return scope[name];\n        }\n\n        return {};\n      };\n\n      return prev;\n    }, {});\n  };\n\n  var $validator = null;\n\n  var PROVIDER_COUNTER = 0;\n\n  var ValidationProvider = {\n    $__veeInject: false,\n    inject: {\n      $_veeObserver: {\n        from: '$_veeObserver',\n        default: function default$1 () {\n          if (!this.$vnode.context.$_veeObserver) {\n            this.$vnode.context.$_veeObserver = createObserver();\n          }\n\n          return this.$vnode.context.$_veeObserver;\n        }\n      }\n    },\n    props: {\n      vid: {\n        type: [String, Number],\n        default: function () {\n          PROVIDER_COUNTER++;\n\n          return (\"_vee_\" + PROVIDER_COUNTER);\n        }\n      },\n      name: {\n        type: String,\n        default: null\n      },\n      mode: {\n        type: [String, Function],\n        default: function () {\n          return getConfig().mode;\n        }\n      },\n      events: {\n        type: Array,\n        validate: function () {\n          /* istanbul ignore next */\n          {\n            warn('events prop and config will be deprecated in future version please use the interaction modes instead');\n          }\n\n          return true;\n        },\n        default: function () {\n          var events = getConfig().events;\n          if (typeof events === 'string') {\n            return events.split('|');\n          }\n\n          return events;\n        }\n      },\n      rules: {\n        type: [Object, String],\n        default: null\n      },\n      immediate: {\n        type: Boolean,\n        default: false\n      },\n      persist: {\n        type: Boolean,\n        default: false\n      },\n      bails: {\n        type: Boolean,\n        default: function () { return getConfig().fastExit; }\n      },\n      debounce: {\n        type: Number,\n        default: function () { return getConfig().delay || 0; }\n      },\n      tag: {\n        type: String,\n        default: 'span'\n      },\n      slim: {\n        type: Boolean,\n        default: false\n      }\n    },\n    watch: {\n      rules: {\n        deep: true,\n        handler: function handler (val, oldVal) {\n          this._needsValidation = !isEqual$1(val, oldVal);\n        }\n      }\n    },\n    data: function () { return ({\n      messages: [],\n      value: undefined,\n      initialized: false,\n      initialValue: undefined,\n      flags: createFlags(),\n      failedRules: {},\n      forceRequired: false,\n      isDeactivated: false,\n      id: null\n    }); },\n    computed: {\n      isValid: function isValid () {\n        return this.flags.valid;\n      },\n      fieldDeps: function fieldDeps () {\n        var this$1 = this;\n\n        var rules = normalizeRules(this.rules);\n\n        return Object.keys(rules).filter(RuleContainer.isTargetRule).map(function (rule) {\n          var depName = rules[rule][0];\n          watchCrossFieldDep(this$1, depName);\n\n          return depName;\n        });\n      },\n      normalizedEvents: function normalizedEvents () {\n        var this$1 = this;\n\n        var ref = computeModeSetting(this);\n        var on = ref.on;\n\n        return normalizeEvents(on || this.events || []).map(function (e) {\n          if (e === 'input') {\n            return this$1._inputEventName;\n          }\n\n          return e;\n        });\n      },\n      isRequired: function isRequired () {\n        var rules = normalizeRules(this.rules);\n        var forceRequired = this.forceRequired;\n\n        var isRequired = rules.required || forceRequired;\n        this.flags.required = isRequired;\n\n        return isRequired;\n      },\n      classes: function classes () {\n        var this$1 = this;\n\n        var names = getConfig().classNames;\n        return Object.keys(this.flags).reduce(function (classes, flag) {\n          var className = (names && names[flag]) || flag;\n          if (isNullOrUndefined(this$1.flags[flag])) {\n            return classes;\n          }\n\n          if (className) {\n            classes[className] = this$1.flags[flag];\n          }\n\n          return classes;\n        }, {});\n      }\n    },\n    render: function render (h) {\n      var this$1 = this;\n\n      this.registerField();\n      var ctx = createValidationCtx(this);\n\n      // Gracefully handle non-existent scoped slots.\n      var slot = this.$scopedSlots.default;\n      /* istanbul ignore next */\n      if (!isCallable(slot)) {\n        {\n          warn('ValidationProvider expects a scoped slot. Did you forget to add \"v-slot\" to your slot?');\n        }\n\n        return h(this.tag, this.$slots.default);\n      }\n\n      var nodes = slot(ctx);\n      // Handle single-root slot.\n      extractVNodes(nodes).forEach(function (input) {\n        addListeners.call(this$1, input);\n      });\n\n      return this.slim ? createRenderless(h, nodes) : h(this.tag, nodes);\n    },\n    beforeDestroy: function beforeDestroy () {\n      // cleanup reference.\n      this.$_veeObserver.unsubscribe(this);\n    },\n    activated: function activated () {\n      this.$_veeObserver.subscribe(this);\n      this.isDeactivated = false;\n    },\n    deactivated: function deactivated () {\n      this.$_veeObserver.unsubscribe(this);\n      this.isDeactivated = true;\n    },\n    methods: {\n      setFlags: function setFlags (flags) {\n        var this$1 = this;\n\n        Object.keys(flags).forEach(function (flag) {\n          this$1.flags[flag] = flags[flag];\n        });\n      },\n      syncValue: function syncValue (e) {\n        var value = normalizeValue$1(e);\n        this.value = value;\n        this.flags.changed = this.initialValue !== value;\n      },\n      reset: function reset () {\n        this.messages = [];\n        this._pendingValidation = null;\n        this.initialValue = this.value;\n        var flags = createFlags();\n        this.setFlags(flags);\n      },\n      validate: function validate () {\n        var this$1 = this;\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        if (args.length > 0) {\n          this.syncValue(args[0]);\n        }\n\n        return this.validateSilent().then(function (result) {\n          this$1.applyResult(result);\n\n          return result;\n        });\n      },\n      validateSilent: function validateSilent () {\n        var this$1 = this;\n\n        this.setFlags({ pending: true });\n\n        return $validator.verify(this.value, this.rules, {\n          name: this.name,\n          values: createValuesLookup(this),\n          bails: this.bails\n        }).then(function (result) {\n          this$1.setFlags({ pending: false });\n          if (!this$1.isRequired) {\n            this$1.setFlags({ valid: result.valid, invalid: !result.valid });\n          }\n\n          return result;\n        });\n      },\n      applyResult: function applyResult (ref) {\n        var errors = ref.errors;\n        var failedRules = ref.failedRules;\n\n        this.messages = errors;\n        this.failedRules = assign({}, failedRules);\n        this.setFlags({\n          valid: !errors.length,\n          changed: this.value !== this.initialValue,\n          invalid: !!errors.length,\n          validated: true\n        });\n      },\n      registerField: function registerField () {\n        if (!$validator) {\n          $validator = getValidator() || new Validator(null, { fastExit: getConfig().fastExit });\n        }\n\n        updateRenderingContextRefs(this);\n      }\n    }\n  };\n\n  function createValidationCtx (ctx) {\n    return {\n      errors: ctx.messages,\n      flags: ctx.flags,\n      classes: ctx.classes,\n      valid: ctx.isValid,\n      failedRules: ctx.failedRules,\n      reset: function () { return ctx.reset(); },\n      validate: function () {\n        var args = [], len = arguments.length;\n        while ( len-- ) args[ len ] = arguments[ len ];\n\n        return ctx.validate.apply(ctx, args);\n    },\n      aria: {\n        'aria-invalid': ctx.flags.invalid ? 'true' : 'false',\n        'aria-required': ctx.isRequired ? 'true' : 'false'\n      }\n    };\n  }\n\n  function normalizeValue$1 (value) {\n    if (isEvent(value)) {\n      return value.target.type === 'file' ? toArray(value.target.files) : value.target.value;\n    }\n\n    return value;\n  }\n\n  /**\n   * Determines if a provider needs to run validation.\n   */\n  function shouldValidate (ctx, model) {\n    // when an immediate/initial validation is needed and wasn't done before.\n    if (!ctx._ignoreImmediate && ctx.immediate) {\n      return true;\n    }\n\n    // when the value changes for whatever reason.\n    if (ctx.value !== model.value) {\n      return true;\n    }\n\n    // when it needs validation due to props/cross-fields changes.\n    if (ctx._needsValidation) {\n      return true;\n    }\n\n    // when the initial value is undefined and the field wasn't rendered yet.\n    if (!ctx.initialized && model.value === undefined) {\n      return true;\n    }\n\n    return false;\n  }\n\n  function computeModeSetting (ctx) {\n    var compute = isCallable(ctx.mode) ? ctx.mode : modes[ctx.mode];\n\n    return compute({\n      errors: ctx.messages,\n      value: ctx.value,\n      flags: ctx.flags\n    });\n  }\n\n  function onRenderUpdate (model) {\n    if (!this.initialized) {\n      this.initialValue = model.value;\n    }\n\n    var validateNow = shouldValidate(this, model);\n    this._needsValidation = false;\n    this.value = model.value;\n    this._ignoreImmediate = true;\n\n    if (!validateNow) {\n      return;\n    }\n\n    this.validateSilent().then(this.immediate || this.flags.validated ? this.applyResult : function (x) { return x; });\n  }\n\n  // Creates the common handlers for a validatable context.\n  function createCommonHandlers (ctx) {\n    var onInput = function (e) {\n      ctx.syncValue(e); // track and keep the value updated.\n      ctx.setFlags({ dirty: true, pristine: false });\n    };\n\n    // Blur event listener.\n    var onBlur = function () {\n      ctx.setFlags({ touched: true, untouched: false });\n    };\n\n    var onValidate = ctx.$veeHandler;\n    var mode = computeModeSetting(ctx);\n\n    // Handle debounce changes.\n    if (!onValidate || ctx.$veeDebounce !== ctx.debounce) {\n      onValidate = debounce(\n        function () {\n          ctx.$nextTick(function () {\n            var pendingPromise = ctx.validateSilent();\n            // avoids race conditions between successive validations.\n            ctx._pendingValidation = pendingPromise;\n            pendingPromise.then(function (result) {\n              if (pendingPromise === ctx._pendingValidation) {\n                ctx.applyResult(result);\n                ctx._pendingValidation = null;\n              }\n            });\n          });\n        },\n        mode.debounce || ctx.debounce\n      );\n\n      // Cache the handler so we don't create it each time.\n      ctx.$veeHandler = onValidate;\n      // cache the debounce value so we detect if it was changed.\n      ctx.$veeDebounce = ctx.debounce;\n    }\n\n    return { onInput: onInput, onBlur: onBlur, onValidate: onValidate };\n  }\n\n  // Adds all plugin listeners to the vnode.\n  function addListeners (node) {\n    var model = findModel(node);\n    // cache the input eventName.\n    this._inputEventName = this._inputEventName || getInputEventName(node, model);\n\n    onRenderUpdate.call(this, model);\n\n    var ref = createCommonHandlers(this);\n    var onInput = ref.onInput;\n    var onBlur = ref.onBlur;\n    var onValidate = ref.onValidate;\n    addVNodeListener(node, this._inputEventName, onInput);\n    addVNodeListener(node, 'blur', onBlur);\n\n    // add the validation listeners.\n    this.normalizedEvents.forEach(function (evt) {\n      addVNodeListener(node, evt, onValidate);\n    });\n\n    this.initialized = true;\n  }\n\n  function createValuesLookup (ctx) {\n    var providers = ctx.$_veeObserver.refs;\n\n    return ctx.fieldDeps.reduce(function (acc, depName) {\n      if (!providers[depName]) {\n        return acc;\n      }\n\n      acc[depName] = providers[depName].value;\n\n      return acc;\n    }, {});\n  }\n\n  function updateRenderingContextRefs (ctx) {\n    // IDs should not be nullable.\n    if (isNullOrUndefined(ctx.id) && ctx.id === ctx.vid) {\n      ctx.id = PROVIDER_COUNTER;\n      PROVIDER_COUNTER++;\n    }\n\n    var id = ctx.id;\n    var vid = ctx.vid;\n    // Nothing has changed.\n    if (ctx.isDeactivated || (id === vid && ctx.$_veeObserver.refs[id])) {\n      return;\n    }\n\n    // vid was changed.\n    if (id !== vid && ctx.$_veeObserver.refs[id] === ctx) {\n      ctx.$_veeObserver.unsubscribe({ vid: id });\n    }\n\n    ctx.$_veeObserver.subscribe(ctx);\n    ctx.id = vid;\n  }\n\n  function createObserver () {\n    return {\n      refs: {},\n      subscribe: function subscribe (ctx) {\n        this.refs[ctx.vid] = ctx;\n      },\n      unsubscribe: function unsubscribe (ctx) {\n        delete this.refs[ctx.vid];\n      }\n    };\n  }\n\n  function watchCrossFieldDep (ctx, depName, withHooks) {\n    if ( withHooks === void 0 ) withHooks = true;\n\n    var providers = ctx.$_veeObserver.refs;\n    if (!ctx._veeWatchers) {\n      ctx._veeWatchers = {};\n    }\n\n    if (!providers[depName] && withHooks) {\n      return ctx.$once('hook:mounted', function () {\n        watchCrossFieldDep(ctx, depName, false);\n      });\n    }\n\n    if (!isCallable(ctx._veeWatchers[depName]) && providers[depName]) {\n      ctx._veeWatchers[depName] = providers[depName].$watch('value', function () {\n        if (ctx.flags.validated) {\n          ctx._needsValidation = true;\n          ctx.validate();\n        }\n      });\n    }\n  }\n\n  var flagMergingStrategy = {\n    pristine: 'every',\n    dirty: 'some',\n    touched: 'some',\n    untouched: 'every',\n    valid: 'every',\n    invalid: 'some',\n    pending: 'some',\n    validated: 'every'\n  };\n\n  function mergeFlags (lhs, rhs, strategy) {\n    var stratName = flagMergingStrategy[strategy];\n\n    return [lhs, rhs][stratName](function (f) { return f; });\n  }\n\n  var OBSERVER_COUNTER = 0;\n\n  var ValidationObserver = {\n    name: 'ValidationObserver',\n    provide: function provide () {\n      return {\n        $_veeObserver: this\n      };\n    },\n    inject: {\n      $_veeObserver: {\n        from: '$_veeObserver',\n        default: function default$1 () {\n          if (!this.$vnode.context.$_veeObserver) {\n            return null;\n          }\n\n          return this.$vnode.context.$_veeObserver;\n        }\n      }\n    },\n    props: {\n      tag: {\n        type: String,\n        default: 'span'\n      },\n      slim: {\n        type: Boolean,\n        default: false\n      }\n    },\n    data: function () { return ({\n      vid: (\"obs_\" + (OBSERVER_COUNTER++)),\n      refs: {},\n      observers: [],\n      persistedStore: {}\n    }); },\n    computed: {\n      ctx: function ctx () {\n        var this$1 = this;\n\n        var ctx = {\n          errors: {},\n          validate: function (arg) {\n            var promise = this$1.validate(arg);\n\n            return {\n              then: function then (thenable) {\n                return promise.then(function (success) {\n                  if (success && isCallable(thenable)) {\n                    return Promise.resolve(thenable());\n                  }\n\n                  return Promise.resolve(success);\n                });\n              }\n            };\n          },\n          reset: function () { return this$1.reset(); }\n        };\n\n        return values(this.refs).concat( Object.keys(this.persistedStore).map(function (key) {\n            return {\n              vid: key,\n              flags: this$1.persistedStore[key].flags,\n              messages: this$1.persistedStore[key].errors\n            };\n          }),\n          this.observers ).reduce(function (acc, provider) {\n          Object.keys(flagMergingStrategy).forEach(function (flag) {\n            var flags = provider.flags || provider.ctx;\n            if (!(flag in acc)) {\n              acc[flag] = flags[flag];\n              return;\n            }\n\n            acc[flag] = mergeFlags(acc[flag], flags[flag], flag);\n          });\n\n          acc.errors[provider.vid] = provider.messages || values(provider.ctx.errors).reduce(function (errs, obsErrors) {\n            return errs.concat(obsErrors);\n          }, []);\n\n          return acc;\n        }, ctx);\n      }\n    },\n    created: function created () {\n      if (this.$_veeObserver) {\n        this.$_veeObserver.subscribe(this, 'observer');\n      }\n    },\n    activated: function activated () {\n      if (this.$_veeObserver) {\n        this.$_veeObserver.subscribe(this, 'observer');\n      }\n    },\n    deactivated: function deactivated () {\n      if (this.$_veeObserver) {\n        this.$_veeObserver.unsubscribe(this, 'observer');\n      }\n    },\n    beforeDestroy: function beforeDestroy () {\n      if (this.$_veeObserver) {\n        this.$_veeObserver.unsubscribe(this, 'observer');\n      }\n    },\n    render: function render (h) {\n      var slots = this.$slots.default || this.$scopedSlots.default || [];\n      if (isCallable(slots)) {\n        slots = slots(this.ctx);\n      }\n\n      return this.slim ? createRenderless(h, slots) : h(this.tag, { on: this.$listeners, attrs: this.$attrs }, slots);\n    },\n    methods: {\n      subscribe: function subscribe (subscriber, kind) {\n        var obj;\n\n        if ( kind === void 0 ) kind = 'provider';\n        if (kind === 'observer') {\n          this.observers.push(subscriber);\n          return;\n        }\n\n        this.refs = Object.assign({}, this.refs, ( obj = {}, obj[subscriber.vid] = subscriber, obj ));\n        if (subscriber.persist && this.persistedStore[subscriber.vid]) {\n          this.restoreProviderState(subscriber);\n        }\n      },\n      unsubscribe: function unsubscribe (ref, kind) {\n        var vid = ref.vid;\n        if ( kind === void 0 ) kind = 'provider';\n\n        if (kind === 'provider') {\n          this.removeProvider(vid);\n        }\n\n        var idx = findIndex(this.observers, function (o) { return o.vid === vid; });\n        if (idx !== -1) {\n          this.observers.splice(idx, 1);\n        }\n      },\n      validate: function validate (ref) {\n        if ( ref === void 0 ) ref = { silent: false };\n        var silent = ref.silent;\n\n        return Promise.all(values(this.refs).map(function (ref) { return ref[silent ? 'validateSilent' : 'validate']().then(function (r) { return r.valid; }); }).concat( this.observers.map(function (obs) { return obs.validate({ silent: silent }); })\n        )).then(function (results) { return results.every(function (r) { return r; }); });\n      },\n      reset: function reset () {\n        var this$1 = this;\n\n        Object.keys(this.persistedStore).forEach(function (key) {\n          this$1.$delete(this$1.persistedStore, key);\n        });\n        return values(this.refs).concat( this.observers).forEach(function (ref) { return ref.reset(); });\n      },\n      restoreProviderState: function restoreProviderState (provider) {\n        var state = this.persistedStore[provider.vid];\n        provider.setFlags(state.flags);\n        provider.applyResult(state);\n        this.$delete(this.persistedStore, provider.vid);\n      },\n      removeProvider: function removeProvider (vid) {\n        var obj;\n\n        var provider = this.refs[vid];\n        // save it for the next time.\n        if (provider && provider.persist) {\n          /* istanbul ignore else */\n          {\n            if (vid.indexOf('_vee_') === 0) {\n              warn('Please provide a `vid` prop when using `persist`, there might be unexpected issues otherwise.');\n            }\n          }\n\n          this.persistedStore = assign({}, this.persistedStore, ( obj = {}, obj[vid] = {\n              flags: provider.flags,\n              errors: provider.messages,\n              failedRules: provider.failedRules\n            }, obj ));\n        }\n\n        this.$delete(this.refs, vid);\n      },\n    }\n  };\n\n  function withValidation (component, ctxToProps) {\n    if ( ctxToProps === void 0 ) ctxToProps = null;\n\n    var options = isCallable(component) ? component.options : component;\n    options.$__veeInject = false;\n    var hoc = {\n      name: ((options.name || 'AnonymousHoc') + \"WithValidation\"),\n      props: assign({}, ValidationProvider.props),\n      data: ValidationProvider.data,\n      computed: assign({}, ValidationProvider.computed),\n      methods: assign({}, ValidationProvider.methods),\n      $__veeInject: false,\n      beforeDestroy: ValidationProvider.beforeDestroy,\n      inject: ValidationProvider.inject\n    };\n\n    // Default ctx converts ctx props to component props.\n    if (!ctxToProps) {\n      ctxToProps = function (ctx) { return ctx; };\n    }\n\n    var eventName = (options.model && options.model.event) || 'input';\n\n    hoc.render = function (h) {\n      var obj;\n\n      this.registerField();\n      var vctx = createValidationCtx(this);\n      var listeners = assign({}, this.$listeners);\n\n      var model = findModel(this.$vnode);\n      this._inputEventName = this._inputEventName || getInputEventName(this.$vnode, model);\n      onRenderUpdate.call(this, model);\n\n      var ref = createCommonHandlers(this);\n      var onInput = ref.onInput;\n      var onBlur = ref.onBlur;\n      var onValidate = ref.onValidate;\n\n      mergeVNodeListeners(listeners, eventName, onInput);\n      mergeVNodeListeners(listeners, 'blur', onBlur);\n      this.normalizedEvents.forEach(function (evt, idx) {\n        mergeVNodeListeners(listeners, evt, onValidate);\n      });\n\n      // Props are any attrs not associated with ValidationProvider Plus the model prop.\n      // WARNING: Accidental prop overwrite will probably happen.\n      var ref$1 = findModelConfig(this.$vnode) || { prop: 'value' };\n      var prop = ref$1.prop;\n      var props = assign({}, this.$attrs, ( obj = {}, obj[prop] = model.value, obj ), ctxToProps(vctx));\n\n      return h(options, {\n        attrs: this.$attrs,\n        props: props,\n        on: listeners\n      }, normalizeSlots(this.$slots, this.$vnode.context));\n    };\n\n    return hoc;\n  }\n\n  /**\n   * Formates file size.\n   *\n   * @param {Number|String} size\n   */\n  var formatFileSize = function (size) {\n    var units = ['Byte', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n    var threshold = 1024;\n    size = Number(size) * threshold;\n    var i = size === 0 ? 0 : Math.floor(Math.log(size) / Math.log(threshold));\n    return (((size / Math.pow(threshold, i)).toFixed(2) * 1) + \" \" + (units[i]));\n  };\n\n  /**\n   * Checks if vee-validate is defined globally.\n   */\n  var isDefinedGlobally = function () {\n    return typeof VeeValidate !== 'undefined';\n  };\n\n  var obj;\n\n  var messages = {\n    _default: function (field) { return (\"The \" + field + \" value is not valid.\"); },\n    after: function (field, ref) {\n      var target = ref[0];\n      var inclusion = ref[1];\n\n      return (\"The \" + field + \" must be after \" + (inclusion ? 'or equal to ' : '') + target + \".\");\n  },\n    alpha: function (field) { return (\"The \" + field + \" field may only contain alphabetic characters.\"); },\n    alpha_dash: function (field) { return (\"The \" + field + \" field may contain alpha-numeric characters as well as dashes and underscores.\"); },\n    alpha_num: function (field) { return (\"The \" + field + \" field may only contain alpha-numeric characters.\"); },\n    alpha_spaces: function (field) { return (\"The \" + field + \" field may only contain alphabetic characters as well as spaces.\"); },\n    before: function (field, ref) {\n      var target = ref[0];\n      var inclusion = ref[1];\n\n      return (\"The \" + field + \" must be before \" + (inclusion ? 'or equal to ' : '') + target + \".\");\n  },\n    between: function (field, ref) {\n      var min = ref[0];\n      var max = ref[1];\n\n      return (\"The \" + field + \" field must be between \" + min + \" and \" + max + \".\");\n  },\n    confirmed: function (field) { return (\"The \" + field + \" confirmation does not match.\"); },\n    credit_card: function (field) { return (\"The \" + field + \" field is invalid.\"); },\n    date_between: function (field, ref) {\n      var min = ref[0];\n      var max = ref[1];\n\n      return (\"The \" + field + \" must be between \" + min + \" and \" + max + \".\");\n  },\n    date_format: function (field, ref) {\n      var format = ref[0];\n\n      return (\"The \" + field + \" must be in the format \" + format + \".\");\n  },\n    decimal: function (field, ref) {\n      if ( ref === void 0 ) ref = [];\n      var decimals = ref[0]; if ( decimals === void 0 ) decimals = '*';\n\n      return (\"The \" + field + \" field must be numeric and may contain\" + (!decimals || decimals === '*' ? '' : ' ' + decimals) + \" decimal points.\");\n  },\n    digits: function (field, ref) {\n      var length = ref[0];\n\n      return (\"The \" + field + \" field must be numeric and contains exactly \" + length + \" digits.\");\n  },\n    dimensions: function (field, ref) {\n      var width = ref[0];\n      var height = ref[1];\n\n      return (\"The \" + field + \" field must be \" + width + \" pixels by \" + height + \" pixels.\");\n  },\n    email: function (field) { return (\"The \" + field + \" field must be a valid email.\"); },\n    excluded: function (field) { return (\"The \" + field + \" field must be a valid value.\"); },\n    ext: function (field) { return (\"The \" + field + \" field must be a valid file.\"); },\n    image: function (field) { return (\"The \" + field + \" field must be an image.\"); },\n    included: function (field) { return (\"The \" + field + \" field must be a valid value.\"); },\n    integer: function (field) { return (\"The \" + field + \" field must be an integer.\"); },\n    ip: function (field) { return (\"The \" + field + \" field must be a valid ip address.\"); },\n    ip_or_fqdn: function (field) { return (\"The \" + field + \" field must be a valid ip address or FQDN.\"); },\n    length: function (field, ref) {\n      var length = ref[0];\n      var max = ref[1];\n\n      if (max) {\n        return (\"The \" + field + \" length must be between \" + length + \" and \" + max + \".\");\n      }\n\n      return (\"The \" + field + \" length must be \" + length + \".\");\n    },\n    max: function (field, ref) {\n      var length = ref[0];\n\n      return (\"The \" + field + \" field may not be greater than \" + length + \" characters.\");\n  },\n    max_value: function (field, ref) {\n      var max = ref[0];\n\n      return (\"The \" + field + \" field must be \" + max + \" or less.\");\n  },\n    mimes: function (field) { return (\"The \" + field + \" field must have a valid file type.\"); },\n    min: function (field, ref) {\n      var length = ref[0];\n\n      return (\"The \" + field + \" field must be at least \" + length + \" characters.\");\n  },\n    min_value: function (field, ref) {\n      var min = ref[0];\n\n      return (\"The \" + field + \" field must be \" + min + \" or more.\");\n  },\n    numeric: function (field) { return (\"The \" + field + \" field may only contain numeric characters.\"); },\n    regex: function (field) { return (\"The \" + field + \" field format is invalid.\"); },\n    required: function (field) { return (\"The \" + field + \" field is required.\"); },\n    required_if: function (field, ref) {\n      var target = ref[0];\n\n      return (\"The \" + field + \" field is required when the \" + target + \" field has this value.\");\n  },\n    size: function (field, ref) {\n      var size = ref[0];\n\n      return (\"The \" + field + \" size must be less than \" + (formatFileSize(size)) + \".\");\n  },\n    url: function (field) { return (\"The \" + field + \" field is not a valid URL.\"); }\n  };\n\n  var locale$1 = {\n    name: 'en',\n    messages: messages,\n    attributes: {}\n  };\n\n  if (isDefinedGlobally()) {\n    // eslint-disable-next-line\n    VeeValidate.Validator.localize(( obj = {}, obj[locale$1.name] = locale$1, obj ));\n  }\n\n  // rules plugin definition.\n\n  Object.keys(Rules).forEach(function (rule) {\n    VeeValidate$1.Validator.extend(rule, Rules[rule].validate, assign({}, Rules[rule].options, { paramNames: Rules[rule].paramNames }));\n  });\n\n  // Merge the english messages.\n  VeeValidate$1.Validator.localize({\n    en: locale$1\n  });\n\n  VeeValidate$1.version = '2.2.13';\n  VeeValidate$1.Rules = Rules;\n  VeeValidate$1.mapFields = mapFields;\n  VeeValidate$1.ValidationProvider = ValidationProvider;\n  VeeValidate$1.ValidationObserver = ValidationObserver;\n  VeeValidate$1.withValidation = withValidation;\n\n  return VeeValidate$1;\n\n}));\n","/*!\n * Vue.js v2.6.11\n * (c) 2014-2019 Evan You\n * Released under the MIT License.\n */\n/*  */\n\nvar emptyObject = Object.freeze({});\n\n// These helpers produce better VM code in JS engines due to their\n// explicitness and function inlining.\nfunction isUndef (v) {\n  return v === undefined || v === null\n}\n\nfunction isDef (v) {\n  return v !== undefined && v !== null\n}\n\nfunction isTrue (v) {\n  return v === true\n}\n\nfunction isFalse (v) {\n  return v === false\n}\n\n/**\n * Check if value is primitive.\n */\nfunction isPrimitive (value) {\n  return (\n    typeof value === 'string' ||\n    typeof value === 'number' ||\n    // $flow-disable-line\n    typeof value === 'symbol' ||\n    typeof value === 'boolean'\n  )\n}\n\n/**\n * Quick object check - this is primarily used to tell\n * Objects from primitive values when we know the value\n * is a JSON-compliant type.\n */\nfunction isObject (obj) {\n  return obj !== null && typeof obj === 'object'\n}\n\n/**\n * Get the raw type string of a value, e.g., [object Object].\n */\nvar _toString = Object.prototype.toString;\n\nfunction toRawType (value) {\n  return _toString.call(value).slice(8, -1)\n}\n\n/**\n * Strict object type check. Only returns true\n * for plain JavaScript objects.\n */\nfunction isPlainObject (obj) {\n  return _toString.call(obj) === '[object Object]'\n}\n\nfunction isRegExp (v) {\n  return _toString.call(v) === '[object RegExp]'\n}\n\n/**\n * Check if val is a valid array index.\n */\nfunction isValidArrayIndex (val) {\n  var n = parseFloat(String(val));\n  return n >= 0 && Math.floor(n) === n && isFinite(val)\n}\n\nfunction isPromise (val) {\n  return (\n    isDef(val) &&\n    typeof val.then === 'function' &&\n    typeof val.catch === 'function'\n  )\n}\n\n/**\n * Convert a value to a string that is actually rendered.\n */\nfunction toString (val) {\n  return val == null\n    ? ''\n    : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)\n      ? JSON.stringify(val, null, 2)\n      : String(val)\n}\n\n/**\n * Convert an input value to a number for persistence.\n * If the conversion fails, return original string.\n */\nfunction toNumber (val) {\n  var n = parseFloat(val);\n  return isNaN(n) ? val : n\n}\n\n/**\n * Make a map and return a function for checking if a key\n * is in that map.\n */\nfunction makeMap (\n  str,\n  expectsLowerCase\n) {\n  var map = Object.create(null);\n  var list = str.split(',');\n  for (var i = 0; i < list.length; i++) {\n    map[list[i]] = true;\n  }\n  return expectsLowerCase\n    ? function (val) { return map[val.toLowerCase()]; }\n    : function (val) { return map[val]; }\n}\n\n/**\n * Check if a tag is a built-in tag.\n */\nvar isBuiltInTag = makeMap('slot,component', true);\n\n/**\n * Check if an attribute is a reserved attribute.\n */\nvar isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');\n\n/**\n * Remove an item from an array.\n */\nfunction remove (arr, item) {\n  if (arr.length) {\n    var index = arr.indexOf(item);\n    if (index > -1) {\n      return arr.splice(index, 1)\n    }\n  }\n}\n\n/**\n * Check whether an object has the property.\n */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction hasOwn (obj, key) {\n  return hasOwnProperty.call(obj, key)\n}\n\n/**\n * Create a cached version of a pure function.\n */\nfunction cached (fn) {\n  var cache = Object.create(null);\n  return (function cachedFn (str) {\n    var hit = cache[str];\n    return hit || (cache[str] = fn(str))\n  })\n}\n\n/**\n * Camelize a hyphen-delimited string.\n */\nvar camelizeRE = /-(\\w)/g;\nvar camelize = cached(function (str) {\n  return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })\n});\n\n/**\n * Capitalize a string.\n */\nvar capitalize = cached(function (str) {\n  return str.charAt(0).toUpperCase() + str.slice(1)\n});\n\n/**\n * Hyphenate a camelCase string.\n */\nvar hyphenateRE = /\\B([A-Z])/g;\nvar hyphenate = cached(function (str) {\n  return str.replace(hyphenateRE, '-$1').toLowerCase()\n});\n\n/**\n * Simple bind polyfill for environments that do not support it,\n * e.g., PhantomJS 1.x. Technically, we don't need this anymore\n * since native bind is now performant enough in most browsers.\n * But removing it would mean breaking code that was able to run in\n * PhantomJS 1.x, so this must be kept for backward compatibility.\n */\n\n/* istanbul ignore next */\nfunction polyfillBind (fn, ctx) {\n  function boundFn (a) {\n    var l = arguments.length;\n    return l\n      ? l > 1\n        ? fn.apply(ctx, arguments)\n        : fn.call(ctx, a)\n      : fn.call(ctx)\n  }\n\n  boundFn._length = fn.length;\n  return boundFn\n}\n\nfunction nativeBind (fn, ctx) {\n  return fn.bind(ctx)\n}\n\nvar bind = Function.prototype.bind\n  ? nativeBind\n  : polyfillBind;\n\n/**\n * Convert an Array-like object to a real Array.\n */\nfunction toArray (list, start) {\n  start = start || 0;\n  var i = list.length - start;\n  var ret = new Array(i);\n  while (i--) {\n    ret[i] = list[i + start];\n  }\n  return ret\n}\n\n/**\n * Mix properties into target object.\n */\nfunction extend (to, _from) {\n  for (var key in _from) {\n    to[key] = _from[key];\n  }\n  return to\n}\n\n/**\n * Merge an Array of Objects into a single Object.\n */\nfunction toObject (arr) {\n  var res = {};\n  for (var i = 0; i < arr.length; i++) {\n    if (arr[i]) {\n      extend(res, arr[i]);\n    }\n  }\n  return res\n}\n\n/* eslint-disable no-unused-vars */\n\n/**\n * Perform no operation.\n * Stubbing args to make Flow happy without leaving useless transpiled code\n * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).\n */\nfunction noop (a, b, c) {}\n\n/**\n * Always return false.\n */\nvar no = function (a, b, c) { return false; };\n\n/* eslint-enable no-unused-vars */\n\n/**\n * Return the same value.\n */\nvar identity = function (_) { return _; };\n\n/**\n * Generate a string containing static keys from compiler modules.\n */\nfunction genStaticKeys (modules) {\n  return modules.reduce(function (keys, m) {\n    return keys.concat(m.staticKeys || [])\n  }, []).join(',')\n}\n\n/**\n * Check if two values are loosely equal - that is,\n * if they are plain objects, do they have the same shape?\n */\nfunction looseEqual (a, b) {\n  if (a === b) { return true }\n  var isObjectA = isObject(a);\n  var isObjectB = isObject(b);\n  if (isObjectA && isObjectB) {\n    try {\n      var isArrayA = Array.isArray(a);\n      var isArrayB = Array.isArray(b);\n      if (isArrayA && isArrayB) {\n        return a.length === b.length && a.every(function (e, i) {\n          return looseEqual(e, b[i])\n        })\n      } else if (a instanceof Date && b instanceof Date) {\n        return a.getTime() === b.getTime()\n      } else if (!isArrayA && !isArrayB) {\n        var keysA = Object.keys(a);\n        var keysB = Object.keys(b);\n        return keysA.length === keysB.length && keysA.every(function (key) {\n          return looseEqual(a[key], b[key])\n        })\n      } else {\n        /* istanbul ignore next */\n        return false\n      }\n    } catch (e) {\n      /* istanbul ignore next */\n      return false\n    }\n  } else if (!isObjectA && !isObjectB) {\n    return String(a) === String(b)\n  } else {\n    return false\n  }\n}\n\n/**\n * Return the first index at which a loosely equal value can be\n * found in the array (if value is a plain object, the array must\n * contain an object of the same shape), or -1 if it is not present.\n */\nfunction looseIndexOf (arr, val) {\n  for (var i = 0; i < arr.length; i++) {\n    if (looseEqual(arr[i], val)) { return i }\n  }\n  return -1\n}\n\n/**\n * Ensure a function is called only once.\n */\nfunction once (fn) {\n  var called = false;\n  return function () {\n    if (!called) {\n      called = true;\n      fn.apply(this, arguments);\n    }\n  }\n}\n\nvar SSR_ATTR = 'data-server-rendered';\n\nvar ASSET_TYPES = [\n  'component',\n  'directive',\n  'filter'\n];\n\nvar LIFECYCLE_HOOKS = [\n  'beforeCreate',\n  'created',\n  'beforeMount',\n  'mounted',\n  'beforeUpdate',\n  'updated',\n  'beforeDestroy',\n  'destroyed',\n  'activated',\n  'deactivated',\n  'errorCaptured',\n  'serverPrefetch'\n];\n\n/*  */\n\n\n\nvar config = ({\n  /**\n   * Option merge strategies (used in core/util/options)\n   */\n  // $flow-disable-line\n  optionMergeStrategies: Object.create(null),\n\n  /**\n   * Whether to suppress warnings.\n   */\n  silent: false,\n\n  /**\n   * Show production mode tip message on boot?\n   */\n  productionTip: process.env.NODE_ENV !== 'production',\n\n  /**\n   * Whether to enable devtools\n   */\n  devtools: process.env.NODE_ENV !== 'production',\n\n  /**\n   * Whether to record perf\n   */\n  performance: false,\n\n  /**\n   * Error handler for watcher errors\n   */\n  errorHandler: null,\n\n  /**\n   * Warn handler for watcher warns\n   */\n  warnHandler: null,\n\n  /**\n   * Ignore certain custom elements\n   */\n  ignoredElements: [],\n\n  /**\n   * Custom user key aliases for v-on\n   */\n  // $flow-disable-line\n  keyCodes: Object.create(null),\n\n  /**\n   * Check if a tag is reserved so that it cannot be registered as a\n   * component. This is platform-dependent and may be overwritten.\n   */\n  isReservedTag: no,\n\n  /**\n   * Check if an attribute is reserved so that it cannot be used as a component\n   * prop. This is platform-dependent and may be overwritten.\n   */\n  isReservedAttr: no,\n\n  /**\n   * Check if a tag is an unknown element.\n   * Platform-dependent.\n   */\n  isUnknownElement: no,\n\n  /**\n   * Get the namespace of an element\n   */\n  getTagNamespace: noop,\n\n  /**\n   * Parse the real tag name for the specific platform.\n   */\n  parsePlatformTagName: identity,\n\n  /**\n   * Check if an attribute must be bound using property, e.g. value\n   * Platform-dependent.\n   */\n  mustUseProp: no,\n\n  /**\n   * Perform updates asynchronously. Intended to be used by Vue Test Utils\n   * This will significantly reduce performance if set to false.\n   */\n  async: true,\n\n  /**\n   * Exposed for legacy reasons\n   */\n  _lifecycleHooks: LIFECYCLE_HOOKS\n});\n\n/*  */\n\n/**\n * unicode letters used for parsing html tags, component names and property paths.\n * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname\n * skipping \\u10000-\\uEFFFF due to it freezing up PhantomJS\n */\nvar unicodeRegExp = /a-zA-Z\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD/;\n\n/**\n * Check if a string starts with $ or _\n */\nfunction isReserved (str) {\n  var c = (str + '').charCodeAt(0);\n  return c === 0x24 || c === 0x5F\n}\n\n/**\n * Define a property.\n */\nfunction def (obj, key, val, enumerable) {\n  Object.defineProperty(obj, key, {\n    value: val,\n    enumerable: !!enumerable,\n    writable: true,\n    configurable: true\n  });\n}\n\n/**\n * Parse simple path.\n */\nvar bailRE = new RegExp((\"[^\" + (unicodeRegExp.source) + \".$_\\\\d]\"));\nfunction parsePath (path) {\n  if (bailRE.test(path)) {\n    return\n  }\n  var segments = path.split('.');\n  return function (obj) {\n    for (var i = 0; i < segments.length; i++) {\n      if (!obj) { return }\n      obj = obj[segments[i]];\n    }\n    return obj\n  }\n}\n\n/*  */\n\n// can we use __proto__?\nvar hasProto = '__proto__' in {};\n\n// Browser environment sniffing\nvar inBrowser = typeof window !== 'undefined';\nvar inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;\nvar weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();\nvar UA = inBrowser && window.navigator.userAgent.toLowerCase();\nvar isIE = UA && /msie|trident/.test(UA);\nvar isIE9 = UA && UA.indexOf('msie 9.0') > 0;\nvar isEdge = UA && UA.indexOf('edge/') > 0;\nvar isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');\nvar isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');\nvar isChrome = UA && /chrome\\/\\d+/.test(UA) && !isEdge;\nvar isPhantomJS = UA && /phantomjs/.test(UA);\nvar isFF = UA && UA.match(/firefox\\/(\\d+)/);\n\n// Firefox has a \"watch\" function on Object.prototype...\nvar nativeWatch = ({}).watch;\n\nvar supportsPassive = false;\nif (inBrowser) {\n  try {\n    var opts = {};\n    Object.defineProperty(opts, 'passive', ({\n      get: function get () {\n        /* istanbul ignore next */\n        supportsPassive = true;\n      }\n    })); // https://github.com/facebook/flow/issues/285\n    window.addEventListener('test-passive', null, opts);\n  } catch (e) {}\n}\n\n// this needs to be lazy-evaled because vue may be required before\n// vue-server-renderer can set VUE_ENV\nvar _isServer;\nvar isServerRendering = function () {\n  if (_isServer === undefined) {\n    /* istanbul ignore if */\n    if (!inBrowser && !inWeex && typeof global !== 'undefined') {\n      // detect presence of vue-server-renderer and avoid\n      // Webpack shimming the process\n      _isServer = global['process'] && global['process'].env.VUE_ENV === 'server';\n    } else {\n      _isServer = false;\n    }\n  }\n  return _isServer\n};\n\n// detect devtools\nvar devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\n/* istanbul ignore next */\nfunction isNative (Ctor) {\n  return typeof Ctor === 'function' && /native code/.test(Ctor.toString())\n}\n\nvar hasSymbol =\n  typeof Symbol !== 'undefined' && isNative(Symbol) &&\n  typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);\n\nvar _Set;\n/* istanbul ignore if */ // $flow-disable-line\nif (typeof Set !== 'undefined' && isNative(Set)) {\n  // use native Set when available.\n  _Set = Set;\n} else {\n  // a non-standard Set polyfill that only works with primitive keys.\n  _Set = /*@__PURE__*/(function () {\n    function Set () {\n      this.set = Object.create(null);\n    }\n    Set.prototype.has = function has (key) {\n      return this.set[key] === true\n    };\n    Set.prototype.add = function add (key) {\n      this.set[key] = true;\n    };\n    Set.prototype.clear = function clear () {\n      this.set = Object.create(null);\n    };\n\n    return Set;\n  }());\n}\n\n/*  */\n\nvar warn = noop;\nvar tip = noop;\nvar generateComponentTrace = (noop); // work around flow check\nvar formatComponentName = (noop);\n\nif (process.env.NODE_ENV !== 'production') {\n  var hasConsole = typeof console !== 'undefined';\n  var classifyRE = /(?:^|[-_])(\\w)/g;\n  var classify = function (str) { return str\n    .replace(classifyRE, function (c) { return c.toUpperCase(); })\n    .replace(/[-_]/g, ''); };\n\n  warn = function (msg, vm) {\n    var trace = vm ? generateComponentTrace(vm) : '';\n\n    if (config.warnHandler) {\n      config.warnHandler.call(null, msg, vm, trace);\n    } else if (hasConsole && (!config.silent)) {\n      console.error((\"[Vue warn]: \" + msg + trace));\n    }\n  };\n\n  tip = function (msg, vm) {\n    if (hasConsole && (!config.silent)) {\n      console.warn(\"[Vue tip]: \" + msg + (\n        vm ? generateComponentTrace(vm) : ''\n      ));\n    }\n  };\n\n  formatComponentName = function (vm, includeFile) {\n    if (vm.$root === vm) {\n      return '<Root>'\n    }\n    var options = typeof vm === 'function' && vm.cid != null\n      ? vm.options\n      : vm._isVue\n        ? vm.$options || vm.constructor.options\n        : vm;\n    var name = options.name || options._componentTag;\n    var file = options.__file;\n    if (!name && file) {\n      var match = file.match(/([^/\\\\]+)\\.vue$/);\n      name = match && match[1];\n    }\n\n    return (\n      (name ? (\"<\" + (classify(name)) + \">\") : \"<Anonymous>\") +\n      (file && includeFile !== false ? (\" at \" + file) : '')\n    )\n  };\n\n  var repeat = function (str, n) {\n    var res = '';\n    while (n) {\n      if (n % 2 === 1) { res += str; }\n      if (n > 1) { str += str; }\n      n >>= 1;\n    }\n    return res\n  };\n\n  generateComponentTrace = function (vm) {\n    if (vm._isVue && vm.$parent) {\n      var tree = [];\n      var currentRecursiveSequence = 0;\n      while (vm) {\n        if (tree.length > 0) {\n          var last = tree[tree.length - 1];\n          if (last.constructor === vm.constructor) {\n            currentRecursiveSequence++;\n            vm = vm.$parent;\n            continue\n          } else if (currentRecursiveSequence > 0) {\n            tree[tree.length - 1] = [last, currentRecursiveSequence];\n            currentRecursiveSequence = 0;\n          }\n        }\n        tree.push(vm);\n        vm = vm.$parent;\n      }\n      return '\\n\\nfound in\\n\\n' + tree\n        .map(function (vm, i) { return (\"\" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)\n            ? ((formatComponentName(vm[0])) + \"... (\" + (vm[1]) + \" recursive calls)\")\n            : formatComponentName(vm))); })\n        .join('\\n')\n    } else {\n      return (\"\\n\\n(found in \" + (formatComponentName(vm)) + \")\")\n    }\n  };\n}\n\n/*  */\n\nvar uid = 0;\n\n/**\n * A dep is an observable that can have multiple\n * directives subscribing to it.\n */\nvar Dep = function Dep () {\n  this.id = uid++;\n  this.subs = [];\n};\n\nDep.prototype.addSub = function addSub (sub) {\n  this.subs.push(sub);\n};\n\nDep.prototype.removeSub = function removeSub (sub) {\n  remove(this.subs, sub);\n};\n\nDep.prototype.depend = function depend () {\n  if (Dep.target) {\n    Dep.target.addDep(this);\n  }\n};\n\nDep.prototype.notify = function notify () {\n  // stabilize the subscriber list first\n  var subs = this.subs.slice();\n  if (process.env.NODE_ENV !== 'production' && !config.async) {\n    // subs aren't sorted in scheduler if not running async\n    // we need to sort them now to make sure they fire in correct\n    // order\n    subs.sort(function (a, b) { return a.id - b.id; });\n  }\n  for (var i = 0, l = subs.length; i < l; i++) {\n    subs[i].update();\n  }\n};\n\n// The current target watcher being evaluated.\n// This is globally unique because only one watcher\n// can be evaluated at a time.\nDep.target = null;\nvar targetStack = [];\n\nfunction pushTarget (target) {\n  targetStack.push(target);\n  Dep.target = target;\n}\n\nfunction popTarget () {\n  targetStack.pop();\n  Dep.target = targetStack[targetStack.length - 1];\n}\n\n/*  */\n\nvar VNode = function VNode (\n  tag,\n  data,\n  children,\n  text,\n  elm,\n  context,\n  componentOptions,\n  asyncFactory\n) {\n  this.tag = tag;\n  this.data = data;\n  this.children = children;\n  this.text = text;\n  this.elm = elm;\n  this.ns = undefined;\n  this.context = context;\n  this.fnContext = undefined;\n  this.fnOptions = undefined;\n  this.fnScopeId = undefined;\n  this.key = data && data.key;\n  this.componentOptions = componentOptions;\n  this.componentInstance = undefined;\n  this.parent = undefined;\n  this.raw = false;\n  this.isStatic = false;\n  this.isRootInsert = true;\n  this.isComment = false;\n  this.isCloned = false;\n  this.isOnce = false;\n  this.asyncFactory = asyncFactory;\n  this.asyncMeta = undefined;\n  this.isAsyncPlaceholder = false;\n};\n\nvar prototypeAccessors = { child: { configurable: true } };\n\n// DEPRECATED: alias for componentInstance for backwards compat.\n/* istanbul ignore next */\nprototypeAccessors.child.get = function () {\n  return this.componentInstance\n};\n\nObject.defineProperties( VNode.prototype, prototypeAccessors );\n\nvar createEmptyVNode = function (text) {\n  if ( text === void 0 ) text = '';\n\n  var node = new VNode();\n  node.text = text;\n  node.isComment = true;\n  return node\n};\n\nfunction createTextVNode (val) {\n  return new VNode(undefined, undefined, undefined, String(val))\n}\n\n// optimized shallow clone\n// used for static nodes and slot nodes because they may be reused across\n// multiple renders, cloning them avoids errors when DOM manipulations rely\n// on their elm reference.\nfunction cloneVNode (vnode) {\n  var cloned = new VNode(\n    vnode.tag,\n    vnode.data,\n    // #7975\n    // clone children array to avoid mutating original in case of cloning\n    // a child.\n    vnode.children && vnode.children.slice(),\n    vnode.text,\n    vnode.elm,\n    vnode.context,\n    vnode.componentOptions,\n    vnode.asyncFactory\n  );\n  cloned.ns = vnode.ns;\n  cloned.isStatic = vnode.isStatic;\n  cloned.key = vnode.key;\n  cloned.isComment = vnode.isComment;\n  cloned.fnContext = vnode.fnContext;\n  cloned.fnOptions = vnode.fnOptions;\n  cloned.fnScopeId = vnode.fnScopeId;\n  cloned.asyncMeta = vnode.asyncMeta;\n  cloned.isCloned = true;\n  return cloned\n}\n\n/*\n * not type checking this file because flow doesn't play well with\n * dynamically accessing methods on Array prototype\n */\n\nvar arrayProto = Array.prototype;\nvar arrayMethods = Object.create(arrayProto);\n\nvar methodsToPatch = [\n  'push',\n  'pop',\n  'shift',\n  'unshift',\n  'splice',\n  'sort',\n  'reverse'\n];\n\n/**\n * Intercept mutating methods and emit events\n */\nmethodsToPatch.forEach(function (method) {\n  // cache original method\n  var original = arrayProto[method];\n  def(arrayMethods, method, function mutator () {\n    var args = [], len = arguments.length;\n    while ( len-- ) args[ len ] = arguments[ len ];\n\n    var result = original.apply(this, args);\n    var ob = this.__ob__;\n    var inserted;\n    switch (method) {\n      case 'push':\n      case 'unshift':\n        inserted = args;\n        break\n      case 'splice':\n        inserted = args.slice(2);\n        break\n    }\n    if (inserted) { ob.observeArray(inserted); }\n    // notify change\n    ob.dep.notify();\n    return result\n  });\n});\n\n/*  */\n\nvar arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n\n/**\n * In some cases we may want to disable observation inside a component's\n * update computation.\n */\nvar shouldObserve = true;\n\nfunction toggleObserving (value) {\n  shouldObserve = value;\n}\n\n/**\n * Observer class that is attached to each observed\n * object. Once attached, the observer converts the target\n * object's property keys into getter/setters that\n * collect dependencies and dispatch updates.\n */\nvar Observer = function Observer (value) {\n  this.value = value;\n  this.dep = new Dep();\n  this.vmCount = 0;\n  def(value, '__ob__', this);\n  if (Array.isArray(value)) {\n    if (hasProto) {\n      protoAugment(value, arrayMethods);\n    } else {\n      copyAugment(value, arrayMethods, arrayKeys);\n    }\n    this.observeArray(value);\n  } else {\n    this.walk(value);\n  }\n};\n\n/**\n * Walk through all properties and convert them into\n * getter/setters. This method should only be called when\n * value type is Object.\n */\nObserver.prototype.walk = function walk (obj) {\n  var keys = Object.keys(obj);\n  for (var i = 0; i < keys.length; i++) {\n    defineReactive$$1(obj, keys[i]);\n  }\n};\n\n/**\n * Observe a list of Array items.\n */\nObserver.prototype.observeArray = function observeArray (items) {\n  for (var i = 0, l = items.length; i < l; i++) {\n    observe(items[i]);\n  }\n};\n\n// helpers\n\n/**\n * Augment a target Object or Array by intercepting\n * the prototype chain using __proto__\n */\nfunction protoAugment (target, src) {\n  /* eslint-disable no-proto */\n  target.__proto__ = src;\n  /* eslint-enable no-proto */\n}\n\n/**\n * Augment a target Object or Array by defining\n * hidden properties.\n */\n/* istanbul ignore next */\nfunction copyAugment (target, src, keys) {\n  for (var i = 0, l = keys.length; i < l; i++) {\n    var key = keys[i];\n    def(target, key, src[key]);\n  }\n}\n\n/**\n * Attempt to create an observer instance for a value,\n * returns the new observer if successfully observed,\n * or the existing observer if the value already has one.\n */\nfunction observe (value, asRootData) {\n  if (!isObject(value) || value instanceof VNode) {\n    return\n  }\n  var ob;\n  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n    ob = value.__ob__;\n  } else if (\n    shouldObserve &&\n    !isServerRendering() &&\n    (Array.isArray(value) || isPlainObject(value)) &&\n    Object.isExtensible(value) &&\n    !value._isVue\n  ) {\n    ob = new Observer(value);\n  }\n  if (asRootData && ob) {\n    ob.vmCount++;\n  }\n  return ob\n}\n\n/**\n * Define a reactive property on an Object.\n */\nfunction defineReactive$$1 (\n  obj,\n  key,\n  val,\n  customSetter,\n  shallow\n) {\n  var dep = new Dep();\n\n  var property = Object.getOwnPropertyDescriptor(obj, key);\n  if (property && property.configurable === false) {\n    return\n  }\n\n  // cater for pre-defined getter/setters\n  var getter = property && property.get;\n  var setter = property && property.set;\n  if ((!getter || setter) && arguments.length === 2) {\n    val = obj[key];\n  }\n\n  var childOb = !shallow && observe(val);\n  Object.defineProperty(obj, key, {\n    enumerable: true,\n    configurable: true,\n    get: function reactiveGetter () {\n      var value = getter ? getter.call(obj) : val;\n      if (Dep.target) {\n        dep.depend();\n        if (childOb) {\n          childOb.dep.depend();\n          if (Array.isArray(value)) {\n            dependArray(value);\n          }\n        }\n      }\n      return value\n    },\n    set: function reactiveSetter (newVal) {\n      var value = getter ? getter.call(obj) : val;\n      /* eslint-disable no-self-compare */\n      if (newVal === value || (newVal !== newVal && value !== value)) {\n        return\n      }\n      /* eslint-enable no-self-compare */\n      if (process.env.NODE_ENV !== 'production' && customSetter) {\n        customSetter();\n      }\n      // #7981: for accessor properties without setter\n      if (getter && !setter) { return }\n      if (setter) {\n        setter.call(obj, newVal);\n      } else {\n        val = newVal;\n      }\n      childOb = !shallow && observe(newVal);\n      dep.notify();\n    }\n  });\n}\n\n/**\n * Set a property on an object. Adds the new property and\n * triggers change notification if the property doesn't\n * already exist.\n */\nfunction set (target, key, val) {\n  if (process.env.NODE_ENV !== 'production' &&\n    (isUndef(target) || isPrimitive(target))\n  ) {\n    warn((\"Cannot set reactive property on undefined, null, or primitive value: \" + ((target))));\n  }\n  if (Array.isArray(target) && isValidArrayIndex(key)) {\n    target.length = Math.max(target.length, key);\n    target.splice(key, 1, val);\n    return val\n  }\n  if (key in target && !(key in Object.prototype)) {\n    target[key] = val;\n    return val\n  }\n  var ob = (target).__ob__;\n  if (target._isVue || (ob && ob.vmCount)) {\n    process.env.NODE_ENV !== 'production' && warn(\n      'Avoid adding reactive properties to a Vue instance or its root $data ' +\n      'at runtime - declare it upfront in the data option.'\n    );\n    return val\n  }\n  if (!ob) {\n    target[key] = val;\n    return val\n  }\n  defineReactive$$1(ob.value, key, val);\n  ob.dep.notify();\n  return val\n}\n\n/**\n * Delete a property and trigger change if necessary.\n */\nfunction del (target, key) {\n  if (process.env.NODE_ENV !== 'production' &&\n    (isUndef(target) || isPrimitive(target))\n  ) {\n    warn((\"Cannot delete reactive property on undefined, null, or primitive value: \" + ((target))));\n  }\n  if (Array.isArray(target) && isValidArrayIndex(key)) {\n    target.splice(key, 1);\n    return\n  }\n  var ob = (target).__ob__;\n  if (target._isVue || (ob && ob.vmCount)) {\n    process.env.NODE_ENV !== 'production' && warn(\n      'Avoid deleting properties on a Vue instance or its root $data ' +\n      '- just set it to null.'\n    );\n    return\n  }\n  if (!hasOwn(target, key)) {\n    return\n  }\n  delete target[key];\n  if (!ob) {\n    return\n  }\n  ob.dep.notify();\n}\n\n/**\n * Collect dependencies on array elements when the array is touched, since\n * we cannot intercept array element access like property getters.\n */\nfunction dependArray (value) {\n  for (var e = (void 0), i = 0, l = value.length; i < l; i++) {\n    e = value[i];\n    e && e.__ob__ && e.__ob__.dep.depend();\n    if (Array.isArray(e)) {\n      dependArray(e);\n    }\n  }\n}\n\n/*  */\n\n/**\n * Option overwriting strategies are functions that handle\n * how to merge a parent option value and a child option\n * value into the final value.\n */\nvar strats = config.optionMergeStrategies;\n\n/**\n * Options with restrictions\n */\nif (process.env.NODE_ENV !== 'production') {\n  strats.el = strats.propsData = function (parent, child, vm, key) {\n    if (!vm) {\n      warn(\n        \"option \\\"\" + key + \"\\\" can only be used during instance \" +\n        'creation with the `new` keyword.'\n      );\n    }\n    return defaultStrat(parent, child)\n  };\n}\n\n/**\n * Helper that recursively merges two data objects together.\n */\nfunction mergeData (to, from) {\n  if (!from) { return to }\n  var key, toVal, fromVal;\n\n  var keys = hasSymbol\n    ? Reflect.ownKeys(from)\n    : Object.keys(from);\n\n  for (var i = 0; i < keys.length; i++) {\n    key = keys[i];\n    // in case the object is already observed...\n    if (key === '__ob__') { continue }\n    toVal = to[key];\n    fromVal = from[key];\n    if (!hasOwn(to, key)) {\n      set(to, key, fromVal);\n    } else if (\n      toVal !== fromVal &&\n      isPlainObject(toVal) &&\n      isPlainObject(fromVal)\n    ) {\n      mergeData(toVal, fromVal);\n    }\n  }\n  return to\n}\n\n/**\n * Data\n */\nfunction mergeDataOrFn (\n  parentVal,\n  childVal,\n  vm\n) {\n  if (!vm) {\n    // in a Vue.extend merge, both should be functions\n    if (!childVal) {\n      return parentVal\n    }\n    if (!parentVal) {\n      return childVal\n    }\n    // when parentVal & childVal are both present,\n    // we need to return a function that returns the\n    // merged result of both functions... no need to\n    // check if parentVal is a function here because\n    // it has to be a function to pass previous merges.\n    return function mergedDataFn () {\n      return mergeData(\n        typeof childVal === 'function' ? childVal.call(this, this) : childVal,\n        typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal\n      )\n    }\n  } else {\n    return function mergedInstanceDataFn () {\n      // instance merge\n      var instanceData = typeof childVal === 'function'\n        ? childVal.call(vm, vm)\n        : childVal;\n      var defaultData = typeof parentVal === 'function'\n        ? parentVal.call(vm, vm)\n        : parentVal;\n      if (instanceData) {\n        return mergeData(instanceData, defaultData)\n      } else {\n        return defaultData\n      }\n    }\n  }\n}\n\nstrats.data = function (\n  parentVal,\n  childVal,\n  vm\n) {\n  if (!vm) {\n    if (childVal && typeof childVal !== 'function') {\n      process.env.NODE_ENV !== 'production' && warn(\n        'The \"data\" option should be a function ' +\n        'that returns a per-instance value in component ' +\n        'definitions.',\n        vm\n      );\n\n      return parentVal\n    }\n    return mergeDataOrFn(parentVal, childVal)\n  }\n\n  return mergeDataOrFn(parentVal, childVal, vm)\n};\n\n/**\n * Hooks and props are merged as arrays.\n */\nfunction mergeHook (\n  parentVal,\n  childVal\n) {\n  var res = childVal\n    ? parentVal\n      ? parentVal.concat(childVal)\n      : Array.isArray(childVal)\n        ? childVal\n        : [childVal]\n    : parentVal;\n  return res\n    ? dedupeHooks(res)\n    : res\n}\n\nfunction dedupeHooks (hooks) {\n  var res = [];\n  for (var i = 0; i < hooks.length; i++) {\n    if (res.indexOf(hooks[i]) === -1) {\n      res.push(hooks[i]);\n    }\n  }\n  return res\n}\n\nLIFECYCLE_HOOKS.forEach(function (hook) {\n  strats[hook] = mergeHook;\n});\n\n/**\n * Assets\n *\n * When a vm is present (instance creation), we need to do\n * a three-way merge between constructor options, instance\n * options and parent options.\n */\nfunction mergeAssets (\n  parentVal,\n  childVal,\n  vm,\n  key\n) {\n  var res = Object.create(parentVal || null);\n  if (childVal) {\n    process.env.NODE_ENV !== 'production' && assertObjectType(key, childVal, vm);\n    return extend(res, childVal)\n  } else {\n    return res\n  }\n}\n\nASSET_TYPES.forEach(function (type) {\n  strats[type + 's'] = mergeAssets;\n});\n\n/**\n * Watchers.\n *\n * Watchers hashes should not overwrite one\n * another, so we merge them as arrays.\n */\nstrats.watch = function (\n  parentVal,\n  childVal,\n  vm,\n  key\n) {\n  // work around Firefox's Object.prototype.watch...\n  if (parentVal === nativeWatch) { parentVal = undefined; }\n  if (childVal === nativeWatch) { childVal = undefined; }\n  /* istanbul ignore if */\n  if (!childVal) { return Object.create(parentVal || null) }\n  if (process.env.NODE_ENV !== 'production') {\n    assertObjectType(key, childVal, vm);\n  }\n  if (!parentVal) { return childVal }\n  var ret = {};\n  extend(ret, parentVal);\n  for (var key$1 in childVal) {\n    var parent = ret[key$1];\n    var child = childVal[key$1];\n    if (parent && !Array.isArray(parent)) {\n      parent = [parent];\n    }\n    ret[key$1] = parent\n      ? parent.concat(child)\n      : Array.isArray(child) ? child : [child];\n  }\n  return ret\n};\n\n/**\n * Other object hashes.\n */\nstrats.props =\nstrats.methods =\nstrats.inject =\nstrats.computed = function (\n  parentVal,\n  childVal,\n  vm,\n  key\n) {\n  if (childVal && process.env.NODE_ENV !== 'production') {\n    assertObjectType(key, childVal, vm);\n  }\n  if (!parentVal) { return childVal }\n  var ret = Object.create(null);\n  extend(ret, parentVal);\n  if (childVal) { extend(ret, childVal); }\n  return ret\n};\nstrats.provide = mergeDataOrFn;\n\n/**\n * Default strategy.\n */\nvar defaultStrat = function (parentVal, childVal) {\n  return childVal === undefined\n    ? parentVal\n    : childVal\n};\n\n/**\n * Validate component names\n */\nfunction checkComponents (options) {\n  for (var key in options.components) {\n    validateComponentName(key);\n  }\n}\n\nfunction validateComponentName (name) {\n  if (!new RegExp((\"^[a-zA-Z][\\\\-\\\\.0-9_\" + (unicodeRegExp.source) + \"]*$\")).test(name)) {\n    warn(\n      'Invalid component name: \"' + name + '\". Component names ' +\n      'should conform to valid custom element name in html5 specification.'\n    );\n  }\n  if (isBuiltInTag(name) || config.isReservedTag(name)) {\n    warn(\n      'Do not use built-in or reserved HTML elements as component ' +\n      'id: ' + name\n    );\n  }\n}\n\n/**\n * Ensure all props option syntax are normalized into the\n * Object-based format.\n */\nfunction normalizeProps (options, vm) {\n  var props = options.props;\n  if (!props) { return }\n  var res = {};\n  var i, val, name;\n  if (Array.isArray(props)) {\n    i = props.length;\n    while (i--) {\n      val = props[i];\n      if (typeof val === 'string') {\n        name = camelize(val);\n        res[name] = { type: null };\n      } else if (process.env.NODE_ENV !== 'production') {\n        warn('props must be strings when using array syntax.');\n      }\n    }\n  } else if (isPlainObject(props)) {\n    for (var key in props) {\n      val = props[key];\n      name = camelize(key);\n      res[name] = isPlainObject(val)\n        ? val\n        : { type: val };\n    }\n  } else if (process.env.NODE_ENV !== 'production') {\n    warn(\n      \"Invalid value for option \\\"props\\\": expected an Array or an Object, \" +\n      \"but got \" + (toRawType(props)) + \".\",\n      vm\n    );\n  }\n  options.props = res;\n}\n\n/**\n * Normalize all injections into Object-based format\n */\nfunction normalizeInject (options, vm) {\n  var inject = options.inject;\n  if (!inject) { return }\n  var normalized = options.inject = {};\n  if (Array.isArray(inject)) {\n    for (var i = 0; i < inject.length; i++) {\n      normalized[inject[i]] = { from: inject[i] };\n    }\n  } else if (isPlainObject(inject)) {\n    for (var key in inject) {\n      var val = inject[key];\n      normalized[key] = isPlainObject(val)\n        ? extend({ from: key }, val)\n        : { from: val };\n    }\n  } else if (process.env.NODE_ENV !== 'production') {\n    warn(\n      \"Invalid value for option \\\"inject\\\": expected an Array or an Object, \" +\n      \"but got \" + (toRawType(inject)) + \".\",\n      vm\n    );\n  }\n}\n\n/**\n * Normalize raw function directives into object format.\n */\nfunction normalizeDirectives (options) {\n  var dirs = options.directives;\n  if (dirs) {\n    for (var key in dirs) {\n      var def$$1 = dirs[key];\n      if (typeof def$$1 === 'function') {\n        dirs[key] = { bind: def$$1, update: def$$1 };\n      }\n    }\n  }\n}\n\nfunction assertObjectType (name, value, vm) {\n  if (!isPlainObject(value)) {\n    warn(\n      \"Invalid value for option \\\"\" + name + \"\\\": expected an Object, \" +\n      \"but got \" + (toRawType(value)) + \".\",\n      vm\n    );\n  }\n}\n\n/**\n * Merge two option objects into a new one.\n * Core utility used in both instantiation and inheritance.\n */\nfunction mergeOptions (\n  parent,\n  child,\n  vm\n) {\n  if (process.env.NODE_ENV !== 'production') {\n    checkComponents(child);\n  }\n\n  if (typeof child === 'function') {\n    child = child.options;\n  }\n\n  normalizeProps(child, vm);\n  normalizeInject(child, vm);\n  normalizeDirectives(child);\n\n  // Apply extends and mixins on the child options,\n  // but only if it is a raw options object that isn't\n  // the result of another mergeOptions call.\n  // Only merged options has the _base property.\n  if (!child._base) {\n    if (child.extends) {\n      parent = mergeOptions(parent, child.extends, vm);\n    }\n    if (child.mixins) {\n      for (var i = 0, l = child.mixins.length; i < l; i++) {\n        parent = mergeOptions(parent, child.mixins[i], vm);\n      }\n    }\n  }\n\n  var options = {};\n  var key;\n  for (key in parent) {\n    mergeField(key);\n  }\n  for (key in child) {\n    if (!hasOwn(parent, key)) {\n      mergeField(key);\n    }\n  }\n  function mergeField (key) {\n    var strat = strats[key] || defaultStrat;\n    options[key] = strat(parent[key], child[key], vm, key);\n  }\n  return options\n}\n\n/**\n * Resolve an asset.\n * This function is used because child instances need access\n * to assets defined in its ancestor chain.\n */\nfunction resolveAsset (\n  options,\n  type,\n  id,\n  warnMissing\n) {\n  /* istanbul ignore if */\n  if (typeof id !== 'string') {\n    return\n  }\n  var assets = options[type];\n  // check local registration variations first\n  if (hasOwn(assets, id)) { return assets[id] }\n  var camelizedId = camelize(id);\n  if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }\n  var PascalCaseId = capitalize(camelizedId);\n  if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }\n  // fallback to prototype chain\n  var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];\n  if (process.env.NODE_ENV !== 'production' && warnMissing && !res) {\n    warn(\n      'Failed to resolve ' + type.slice(0, -1) + ': ' + id,\n      options\n    );\n  }\n  return res\n}\n\n/*  */\n\n\n\nfunction validateProp (\n  key,\n  propOptions,\n  propsData,\n  vm\n) {\n  var prop = propOptions[key];\n  var absent = !hasOwn(propsData, key);\n  var value = propsData[key];\n  // boolean casting\n  var booleanIndex = getTypeIndex(Boolean, prop.type);\n  if (booleanIndex > -1) {\n    if (absent && !hasOwn(prop, 'default')) {\n      value = false;\n    } else if (value === '' || value === hyphenate(key)) {\n      // only cast empty string / same name to boolean if\n      // boolean has higher priority\n      var stringIndex = getTypeIndex(String, prop.type);\n      if (stringIndex < 0 || booleanIndex < stringIndex) {\n        value = true;\n      }\n    }\n  }\n  // check default value\n  if (value === undefined) {\n    value = getPropDefaultValue(vm, prop, key);\n    // since the default value is a fresh copy,\n    // make sure to observe it.\n    var prevShouldObserve = shouldObserve;\n    toggleObserving(true);\n    observe(value);\n    toggleObserving(prevShouldObserve);\n  }\n  if (\n    process.env.NODE_ENV !== 'production' &&\n    // skip validation for weex recycle-list child component props\n    !(false)\n  ) {\n    assertProp(prop, key, value, vm, absent);\n  }\n  return value\n}\n\n/**\n * Get the default value of a prop.\n */\nfunction getPropDefaultValue (vm, prop, key) {\n  // no default, return undefined\n  if (!hasOwn(prop, 'default')) {\n    return undefined\n  }\n  var def = prop.default;\n  // warn against non-factory defaults for Object & Array\n  if (process.env.NODE_ENV !== 'production' && isObject(def)) {\n    warn(\n      'Invalid default value for prop \"' + key + '\": ' +\n      'Props with type Object/Array must use a factory function ' +\n      'to return the default value.',\n      vm\n    );\n  }\n  // the raw prop value was also undefined from previous render,\n  // return previous default value to avoid unnecessary watcher trigger\n  if (vm && vm.$options.propsData &&\n    vm.$options.propsData[key] === undefined &&\n    vm._props[key] !== undefined\n  ) {\n    return vm._props[key]\n  }\n  // call factory function for non-Function types\n  // a value is Function if its prototype is function even across different execution context\n  return typeof def === 'function' && getType(prop.type) !== 'Function'\n    ? def.call(vm)\n    : def\n}\n\n/**\n * Assert whether a prop is valid.\n */\nfunction assertProp (\n  prop,\n  name,\n  value,\n  vm,\n  absent\n) {\n  if (prop.required && absent) {\n    warn(\n      'Missing required prop: \"' + name + '\"',\n      vm\n    );\n    return\n  }\n  if (value == null && !prop.required) {\n    return\n  }\n  var type = prop.type;\n  var valid = !type || type === true;\n  var expectedTypes = [];\n  if (type) {\n    if (!Array.isArray(type)) {\n      type = [type];\n    }\n    for (var i = 0; i < type.length && !valid; i++) {\n      var assertedType = assertType(value, type[i]);\n      expectedTypes.push(assertedType.expectedType || '');\n      valid = assertedType.valid;\n    }\n  }\n\n  if (!valid) {\n    warn(\n      getInvalidTypeMessage(name, value, expectedTypes),\n      vm\n    );\n    return\n  }\n  var validator = prop.validator;\n  if (validator) {\n    if (!validator(value)) {\n      warn(\n        'Invalid prop: custom validator check failed for prop \"' + name + '\".',\n        vm\n      );\n    }\n  }\n}\n\nvar simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;\n\nfunction assertType (value, type) {\n  var valid;\n  var expectedType = getType(type);\n  if (simpleCheckRE.test(expectedType)) {\n    var t = typeof value;\n    valid = t === expectedType.toLowerCase();\n    // for primitive wrapper objects\n    if (!valid && t === 'object') {\n      valid = value instanceof type;\n    }\n  } else if (expectedType === 'Object') {\n    valid = isPlainObject(value);\n  } else if (expectedType === 'Array') {\n    valid = Array.isArray(value);\n  } else {\n    valid = value instanceof type;\n  }\n  return {\n    valid: valid,\n    expectedType: expectedType\n  }\n}\n\n/**\n * Use function string name to check built-in types,\n * because a simple equality check will fail when running\n * across different vms / iframes.\n */\nfunction getType (fn) {\n  var match = fn && fn.toString().match(/^\\s*function (\\w+)/);\n  return match ? match[1] : ''\n}\n\nfunction isSameType (a, b) {\n  return getType(a) === getType(b)\n}\n\nfunction getTypeIndex (type, expectedTypes) {\n  if (!Array.isArray(expectedTypes)) {\n    return isSameType(expectedTypes, type) ? 0 : -1\n  }\n  for (var i = 0, len = expectedTypes.length; i < len; i++) {\n    if (isSameType(expectedTypes[i], type)) {\n      return i\n    }\n  }\n  return -1\n}\n\nfunction getInvalidTypeMessage (name, value, expectedTypes) {\n  var message = \"Invalid prop: type check failed for prop \\\"\" + name + \"\\\".\" +\n    \" Expected \" + (expectedTypes.map(capitalize).join(', '));\n  var expectedType = expectedTypes[0];\n  var receivedType = toRawType(value);\n  var expectedValue = styleValue(value, expectedType);\n  var receivedValue = styleValue(value, receivedType);\n  // check if we need to specify expected value\n  if (expectedTypes.length === 1 &&\n      isExplicable(expectedType) &&\n      !isBoolean(expectedType, receivedType)) {\n    message += \" with value \" + expectedValue;\n  }\n  message += \", got \" + receivedType + \" \";\n  // check if we need to specify received value\n  if (isExplicable(receivedType)) {\n    message += \"with value \" + receivedValue + \".\";\n  }\n  return message\n}\n\nfunction styleValue (value, type) {\n  if (type === 'String') {\n    return (\"\\\"\" + value + \"\\\"\")\n  } else if (type === 'Number') {\n    return (\"\" + (Number(value)))\n  } else {\n    return (\"\" + value)\n  }\n}\n\nfunction isExplicable (value) {\n  var explicitTypes = ['string', 'number', 'boolean'];\n  return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; })\n}\n\nfunction isBoolean () {\n  var args = [], len = arguments.length;\n  while ( len-- ) args[ len ] = arguments[ len ];\n\n  return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; })\n}\n\n/*  */\n\nfunction handleError (err, vm, info) {\n  // Deactivate deps tracking while processing error handler to avoid possible infinite rendering.\n  // See: https://github.com/vuejs/vuex/issues/1505\n  pushTarget();\n  try {\n    if (vm) {\n      var cur = vm;\n      while ((cur = cur.$parent)) {\n        var hooks = cur.$options.errorCaptured;\n        if (hooks) {\n          for (var i = 0; i < hooks.length; i++) {\n            try {\n              var capture = hooks[i].call(cur, err, vm, info) === false;\n              if (capture) { return }\n            } catch (e) {\n              globalHandleError(e, cur, 'errorCaptured hook');\n            }\n          }\n        }\n      }\n    }\n    globalHandleError(err, vm, info);\n  } finally {\n    popTarget();\n  }\n}\n\nfunction invokeWithErrorHandling (\n  handler,\n  context,\n  args,\n  vm,\n  info\n) {\n  var res;\n  try {\n    res = args ? handler.apply(context, args) : handler.call(context);\n    if (res && !res._isVue && isPromise(res) && !res._handled) {\n      res.catch(function (e) { return handleError(e, vm, info + \" (Promise/async)\"); });\n      // issue #9511\n      // avoid catch triggering multiple times when nested calls\n      res._handled = true;\n    }\n  } catch (e) {\n    handleError(e, vm, info);\n  }\n  return res\n}\n\nfunction globalHandleError (err, vm, info) {\n  if (config.errorHandler) {\n    try {\n      return config.errorHandler.call(null, err, vm, info)\n    } catch (e) {\n      // if the user intentionally throws the original error in the handler,\n      // do not log it twice\n      if (e !== err) {\n        logError(e, null, 'config.errorHandler');\n      }\n    }\n  }\n  logError(err, vm, info);\n}\n\nfunction logError (err, vm, info) {\n  if (process.env.NODE_ENV !== 'production') {\n    warn((\"Error in \" + info + \": \\\"\" + (err.toString()) + \"\\\"\"), vm);\n  }\n  /* istanbul ignore else */\n  if ((inBrowser || inWeex) && typeof console !== 'undefined') {\n    console.error(err);\n  } else {\n    throw err\n  }\n}\n\n/*  */\n\nvar isUsingMicroTask = false;\n\nvar callbacks = [];\nvar pending = false;\n\nfunction flushCallbacks () {\n  pending = false;\n  var copies = callbacks.slice(0);\n  callbacks.length = 0;\n  for (var i = 0; i < copies.length; i++) {\n    copies[i]();\n  }\n}\n\n// Here we have async deferring wrappers using microtasks.\n// In 2.5 we used (macro) tasks (in combination with microtasks).\n// However, it has subtle problems when state is changed right before repaint\n// (e.g. #6813, out-in transitions).\n// Also, using (macro) tasks in event handler would cause some weird behaviors\n// that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).\n// So we now use microtasks everywhere, again.\n// A major drawback of this tradeoff is that there are some scenarios\n// where microtasks have too high a priority and fire in between supposedly\n// sequential events (e.g. #4521, #6690, which have workarounds)\n// or even between bubbling of the same event (#6566).\nvar timerFunc;\n\n// The nextTick behavior leverages the microtask queue, which can be accessed\n// via either native Promise.then or MutationObserver.\n// MutationObserver has wider support, however it is seriously bugged in\n// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It\n// completely stops working after triggering a few times... so, if native\n// Promise is available, we will use it:\n/* istanbul ignore next, $flow-disable-line */\nif (typeof Promise !== 'undefined' && isNative(Promise)) {\n  var p = Promise.resolve();\n  timerFunc = function () {\n    p.then(flushCallbacks);\n    // In problematic UIWebViews, Promise.then doesn't completely break, but\n    // it can get stuck in a weird state where callbacks are pushed into the\n    // microtask queue but the queue isn't being flushed, until the browser\n    // needs to do some other work, e.g. handle a timer. Therefore we can\n    // \"force\" the microtask queue to be flushed by adding an empty timer.\n    if (isIOS) { setTimeout(noop); }\n  };\n  isUsingMicroTask = true;\n} else if (!isIE && typeof MutationObserver !== 'undefined' && (\n  isNative(MutationObserver) ||\n  // PhantomJS and iOS 7.x\n  MutationObserver.toString() === '[object MutationObserverConstructor]'\n)) {\n  // Use MutationObserver where native Promise is not available,\n  // e.g. PhantomJS, iOS7, Android 4.4\n  // (#6466 MutationObserver is unreliable in IE11)\n  var counter = 1;\n  var observer = new MutationObserver(flushCallbacks);\n  var textNode = document.createTextNode(String(counter));\n  observer.observe(textNode, {\n    characterData: true\n  });\n  timerFunc = function () {\n    counter = (counter + 1) % 2;\n    textNode.data = String(counter);\n  };\n  isUsingMicroTask = true;\n} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {\n  // Fallback to setImmediate.\n  // Technically it leverages the (macro) task queue,\n  // but it is still a better choice than setTimeout.\n  timerFunc = function () {\n    setImmediate(flushCallbacks);\n  };\n} else {\n  // Fallback to setTimeout.\n  timerFunc = function () {\n    setTimeout(flushCallbacks, 0);\n  };\n}\n\nfunction nextTick (cb, ctx) {\n  var _resolve;\n  callbacks.push(function () {\n    if (cb) {\n      try {\n        cb.call(ctx);\n      } catch (e) {\n        handleError(e, ctx, 'nextTick');\n      }\n    } else if (_resolve) {\n      _resolve(ctx);\n    }\n  });\n  if (!pending) {\n    pending = true;\n    timerFunc();\n  }\n  // $flow-disable-line\n  if (!cb && typeof Promise !== 'undefined') {\n    return new Promise(function (resolve) {\n      _resolve = resolve;\n    })\n  }\n}\n\n/*  */\n\nvar mark;\nvar measure;\n\nif (process.env.NODE_ENV !== 'production') {\n  var perf = inBrowser && window.performance;\n  /* istanbul ignore if */\n  if (\n    perf &&\n    perf.mark &&\n    perf.measure &&\n    perf.clearMarks &&\n    perf.clearMeasures\n  ) {\n    mark = function (tag) { return perf.mark(tag); };\n    measure = function (name, startTag, endTag) {\n      perf.measure(name, startTag, endTag);\n      perf.clearMarks(startTag);\n      perf.clearMarks(endTag);\n      // perf.clearMeasures(name)\n    };\n  }\n}\n\n/* not type checking this file because flow doesn't play well with Proxy */\n\nvar initProxy;\n\nif (process.env.NODE_ENV !== 'production') {\n  var allowedGlobals = makeMap(\n    'Infinity,undefined,NaN,isFinite,isNaN,' +\n    'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +\n    'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +\n    'require' // for Webpack/Browserify\n  );\n\n  var warnNonPresent = function (target, key) {\n    warn(\n      \"Property or method \\\"\" + key + \"\\\" is not defined on the instance but \" +\n      'referenced during render. Make sure that this property is reactive, ' +\n      'either in the data option, or for class-based components, by ' +\n      'initializing the property. ' +\n      'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',\n      target\n    );\n  };\n\n  var warnReservedPrefix = function (target, key) {\n    warn(\n      \"Property \\\"\" + key + \"\\\" must be accessed with \\\"$data.\" + key + \"\\\" because \" +\n      'properties starting with \"$\" or \"_\" are not proxied in the Vue instance to ' +\n      'prevent conflicts with Vue internals. ' +\n      'See: https://vuejs.org/v2/api/#data',\n      target\n    );\n  };\n\n  var hasProxy =\n    typeof Proxy !== 'undefined' && isNative(Proxy);\n\n  if (hasProxy) {\n    var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');\n    config.keyCodes = new Proxy(config.keyCodes, {\n      set: function set (target, key, value) {\n        if (isBuiltInModifier(key)) {\n          warn((\"Avoid overwriting built-in modifier in config.keyCodes: .\" + key));\n          return false\n        } else {\n          target[key] = value;\n          return true\n        }\n      }\n    });\n  }\n\n  var hasHandler = {\n    has: function has (target, key) {\n      var has = key in target;\n      var isAllowed = allowedGlobals(key) ||\n        (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));\n      if (!has && !isAllowed) {\n        if (key in target.$data) { warnReservedPrefix(target, key); }\n        else { warnNonPresent(target, key); }\n      }\n      return has || !isAllowed\n    }\n  };\n\n  var getHandler = {\n    get: function get (target, key) {\n      if (typeof key === 'string' && !(key in target)) {\n        if (key in target.$data) { warnReservedPrefix(target, key); }\n        else { warnNonPresent(target, key); }\n      }\n      return target[key]\n    }\n  };\n\n  initProxy = function initProxy (vm) {\n    if (hasProxy) {\n      // determine which proxy handler to use\n      var options = vm.$options;\n      var handlers = options.render && options.render._withStripped\n        ? getHandler\n        : hasHandler;\n      vm._renderProxy = new Proxy(vm, handlers);\n    } else {\n      vm._renderProxy = vm;\n    }\n  };\n}\n\n/*  */\n\nvar seenObjects = new _Set();\n\n/**\n * Recursively traverse an object to evoke all converted\n * getters, so that every nested property inside the object\n * is collected as a \"deep\" dependency.\n */\nfunction traverse (val) {\n  _traverse(val, seenObjects);\n  seenObjects.clear();\n}\n\nfunction _traverse (val, seen) {\n  var i, keys;\n  var isA = Array.isArray(val);\n  if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {\n    return\n  }\n  if (val.__ob__) {\n    var depId = val.__ob__.dep.id;\n    if (seen.has(depId)) {\n      return\n    }\n    seen.add(depId);\n  }\n  if (isA) {\n    i = val.length;\n    while (i--) { _traverse(val[i], seen); }\n  } else {\n    keys = Object.keys(val);\n    i = keys.length;\n    while (i--) { _traverse(val[keys[i]], seen); }\n  }\n}\n\n/*  */\n\nvar normalizeEvent = cached(function (name) {\n  var passive = name.charAt(0) === '&';\n  name = passive ? name.slice(1) : name;\n  var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first\n  name = once$$1 ? name.slice(1) : name;\n  var capture = name.charAt(0) === '!';\n  name = capture ? name.slice(1) : name;\n  return {\n    name: name,\n    once: once$$1,\n    capture: capture,\n    passive: passive\n  }\n});\n\nfunction createFnInvoker (fns, vm) {\n  function invoker () {\n    var arguments$1 = arguments;\n\n    var fns = invoker.fns;\n    if (Array.isArray(fns)) {\n      var cloned = fns.slice();\n      for (var i = 0; i < cloned.length; i++) {\n        invokeWithErrorHandling(cloned[i], null, arguments$1, vm, \"v-on handler\");\n      }\n    } else {\n      // return handler return value for single handlers\n      return invokeWithErrorHandling(fns, null, arguments, vm, \"v-on handler\")\n    }\n  }\n  invoker.fns = fns;\n  return invoker\n}\n\nfunction updateListeners (\n  on,\n  oldOn,\n  add,\n  remove$$1,\n  createOnceHandler,\n  vm\n) {\n  var name, def$$1, cur, old, event;\n  for (name in on) {\n    def$$1 = cur = on[name];\n    old = oldOn[name];\n    event = normalizeEvent(name);\n    if (isUndef(cur)) {\n      process.env.NODE_ENV !== 'production' && warn(\n        \"Invalid handler for event \\\"\" + (event.name) + \"\\\": got \" + String(cur),\n        vm\n      );\n    } else if (isUndef(old)) {\n      if (isUndef(cur.fns)) {\n        cur = on[name] = createFnInvoker(cur, vm);\n      }\n      if (isTrue(event.once)) {\n        cur = on[name] = createOnceHandler(event.name, cur, event.capture);\n      }\n      add(event.name, cur, event.capture, event.passive, event.params);\n    } else if (cur !== old) {\n      old.fns = cur;\n      on[name] = old;\n    }\n  }\n  for (name in oldOn) {\n    if (isUndef(on[name])) {\n      event = normalizeEvent(name);\n      remove$$1(event.name, oldOn[name], event.capture);\n    }\n  }\n}\n\n/*  */\n\nfunction mergeVNodeHook (def, hookKey, hook) {\n  if (def instanceof VNode) {\n    def = def.data.hook || (def.data.hook = {});\n  }\n  var invoker;\n  var oldHook = def[hookKey];\n\n  function wrappedHook () {\n    hook.apply(this, arguments);\n    // important: remove merged hook to ensure it's called only once\n    // and prevent memory leak\n    remove(invoker.fns, wrappedHook);\n  }\n\n  if (isUndef(oldHook)) {\n    // no existing hook\n    invoker = createFnInvoker([wrappedHook]);\n  } else {\n    /* istanbul ignore if */\n    if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {\n      // already a merged invoker\n      invoker = oldHook;\n      invoker.fns.push(wrappedHook);\n    } else {\n      // existing plain hook\n      invoker = createFnInvoker([oldHook, wrappedHook]);\n    }\n  }\n\n  invoker.merged = true;\n  def[hookKey] = invoker;\n}\n\n/*  */\n\nfunction extractPropsFromVNodeData (\n  data,\n  Ctor,\n  tag\n) {\n  // we are only extracting raw values here.\n  // validation and default values are handled in the child\n  // component itself.\n  var propOptions = Ctor.options.props;\n  if (isUndef(propOptions)) {\n    return\n  }\n  var res = {};\n  var attrs = data.attrs;\n  var props = data.props;\n  if (isDef(attrs) || isDef(props)) {\n    for (var key in propOptions) {\n      var altKey = hyphenate(key);\n      if (process.env.NODE_ENV !== 'production') {\n        var keyInLowerCase = key.toLowerCase();\n        if (\n          key !== keyInLowerCase &&\n          attrs && hasOwn(attrs, keyInLowerCase)\n        ) {\n          tip(\n            \"Prop \\\"\" + keyInLowerCase + \"\\\" is passed to component \" +\n            (formatComponentName(tag || Ctor)) + \", but the declared prop name is\" +\n            \" \\\"\" + key + \"\\\". \" +\n            \"Note that HTML attributes are case-insensitive and camelCased \" +\n            \"props need to use their kebab-case equivalents when using in-DOM \" +\n            \"templates. You should probably use \\\"\" + altKey + \"\\\" instead of \\\"\" + key + \"\\\".\"\n          );\n        }\n      }\n      checkProp(res, props, key, altKey, true) ||\n      checkProp(res, attrs, key, altKey, false);\n    }\n  }\n  return res\n}\n\nfunction checkProp (\n  res,\n  hash,\n  key,\n  altKey,\n  preserve\n) {\n  if (isDef(hash)) {\n    if (hasOwn(hash, key)) {\n      res[key] = hash[key];\n      if (!preserve) {\n        delete hash[key];\n      }\n      return true\n    } else if (hasOwn(hash, altKey)) {\n      res[key] = hash[altKey];\n      if (!preserve) {\n        delete hash[altKey];\n      }\n      return true\n    }\n  }\n  return false\n}\n\n/*  */\n\n// The template compiler attempts to minimize the need for normalization by\n// statically analyzing the template at compile time.\n//\n// For plain HTML markup, normalization can be completely skipped because the\n// generated render function is guaranteed to return Array<VNode>. There are\n// two cases where extra normalization is needed:\n\n// 1. When the children contains components - because a functional component\n// may return an Array instead of a single root. In this case, just a simple\n// normalization is needed - if any child is an Array, we flatten the whole\n// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep\n// because functional components already normalize their own children.\nfunction simpleNormalizeChildren (children) {\n  for (var i = 0; i < children.length; i++) {\n    if (Array.isArray(children[i])) {\n      return Array.prototype.concat.apply([], children)\n    }\n  }\n  return children\n}\n\n// 2. When the children contains constructs that always generated nested Arrays,\n// e.g. <template>, <slot>, v-for, or when the children is provided by user\n// with hand-written render functions / JSX. In such cases a full normalization\n// is needed to cater to all possible types of children values.\nfunction normalizeChildren (children) {\n  return isPrimitive(children)\n    ? [createTextVNode(children)]\n    : Array.isArray(children)\n      ? normalizeArrayChildren(children)\n      : undefined\n}\n\nfunction isTextNode (node) {\n  return isDef(node) && isDef(node.text) && isFalse(node.isComment)\n}\n\nfunction normalizeArrayChildren (children, nestedIndex) {\n  var res = [];\n  var i, c, lastIndex, last;\n  for (i = 0; i < children.length; i++) {\n    c = children[i];\n    if (isUndef(c) || typeof c === 'boolean') { continue }\n    lastIndex = res.length - 1;\n    last = res[lastIndex];\n    //  nested\n    if (Array.isArray(c)) {\n      if (c.length > 0) {\n        c = normalizeArrayChildren(c, ((nestedIndex || '') + \"_\" + i));\n        // merge adjacent text nodes\n        if (isTextNode(c[0]) && isTextNode(last)) {\n          res[lastIndex] = createTextVNode(last.text + (c[0]).text);\n          c.shift();\n        }\n        res.push.apply(res, c);\n      }\n    } else if (isPrimitive(c)) {\n      if (isTextNode(last)) {\n        // merge adjacent text nodes\n        // this is necessary for SSR hydration because text nodes are\n        // essentially merged when rendered to HTML strings\n        res[lastIndex] = createTextVNode(last.text + c);\n      } else if (c !== '') {\n        // convert primitive to vnode\n        res.push(createTextVNode(c));\n      }\n    } else {\n      if (isTextNode(c) && isTextNode(last)) {\n        // merge adjacent text nodes\n        res[lastIndex] = createTextVNode(last.text + c.text);\n      } else {\n        // default key for nested array children (likely generated by v-for)\n        if (isTrue(children._isVList) &&\n          isDef(c.tag) &&\n          isUndef(c.key) &&\n          isDef(nestedIndex)) {\n          c.key = \"__vlist\" + nestedIndex + \"_\" + i + \"__\";\n        }\n        res.push(c);\n      }\n    }\n  }\n  return res\n}\n\n/*  */\n\nfunction initProvide (vm) {\n  var provide = vm.$options.provide;\n  if (provide) {\n    vm._provided = typeof provide === 'function'\n      ? provide.call(vm)\n      : provide;\n  }\n}\n\nfunction initInjections (vm) {\n  var result = resolveInject(vm.$options.inject, vm);\n  if (result) {\n    toggleObserving(false);\n    Object.keys(result).forEach(function (key) {\n      /* istanbul ignore else */\n      if (process.env.NODE_ENV !== 'production') {\n        defineReactive$$1(vm, key, result[key], function () {\n          warn(\n            \"Avoid mutating an injected value directly since the changes will be \" +\n            \"overwritten whenever the provided component re-renders. \" +\n            \"injection being mutated: \\\"\" + key + \"\\\"\",\n            vm\n          );\n        });\n      } else {\n        defineReactive$$1(vm, key, result[key]);\n      }\n    });\n    toggleObserving(true);\n  }\n}\n\nfunction resolveInject (inject, vm) {\n  if (inject) {\n    // inject is :any because flow is not smart enough to figure out cached\n    var result = Object.create(null);\n    var keys = hasSymbol\n      ? Reflect.ownKeys(inject)\n      : Object.keys(inject);\n\n    for (var i = 0; i < keys.length; i++) {\n      var key = keys[i];\n      // #6574 in case the inject object is observed...\n      if (key === '__ob__') { continue }\n      var provideKey = inject[key].from;\n      var source = vm;\n      while (source) {\n        if (source._provided && hasOwn(source._provided, provideKey)) {\n          result[key] = source._provided[provideKey];\n          break\n        }\n        source = source.$parent;\n      }\n      if (!source) {\n        if ('default' in inject[key]) {\n          var provideDefault = inject[key].default;\n          result[key] = typeof provideDefault === 'function'\n            ? provideDefault.call(vm)\n            : provideDefault;\n        } else if (process.env.NODE_ENV !== 'production') {\n          warn((\"Injection \\\"\" + key + \"\\\" not found\"), vm);\n        }\n      }\n    }\n    return result\n  }\n}\n\n/*  */\n\n\n\n/**\n * Runtime helper for resolving raw children VNodes into a slot object.\n */\nfunction resolveSlots (\n  children,\n  context\n) {\n  if (!children || !children.length) {\n    return {}\n  }\n  var slots = {};\n  for (var i = 0, l = children.length; i < l; i++) {\n    var child = children[i];\n    var data = child.data;\n    // remove slot attribute if the node is resolved as a Vue slot node\n    if (data && data.attrs && data.attrs.slot) {\n      delete data.attrs.slot;\n    }\n    // named slots should only be respected if the vnode was rendered in the\n    // same context.\n    if ((child.context === context || child.fnContext === context) &&\n      data && data.slot != null\n    ) {\n      var name = data.slot;\n      var slot = (slots[name] || (slots[name] = []));\n      if (child.tag === 'template') {\n        slot.push.apply(slot, child.children || []);\n      } else {\n        slot.push(child);\n      }\n    } else {\n      (slots.default || (slots.default = [])).push(child);\n    }\n  }\n  // ignore slots that contains only whitespace\n  for (var name$1 in slots) {\n    if (slots[name$1].every(isWhitespace)) {\n      delete slots[name$1];\n    }\n  }\n  return slots\n}\n\nfunction isWhitespace (node) {\n  return (node.isComment && !node.asyncFactory) || node.text === ' '\n}\n\n/*  */\n\nfunction normalizeScopedSlots (\n  slots,\n  normalSlots,\n  prevSlots\n) {\n  var res;\n  var hasNormalSlots = Object.keys(normalSlots).length > 0;\n  var isStable = slots ? !!slots.$stable : !hasNormalSlots;\n  var key = slots && slots.$key;\n  if (!slots) {\n    res = {};\n  } else if (slots._normalized) {\n    // fast path 1: child component re-render only, parent did not change\n    return slots._normalized\n  } else if (\n    isStable &&\n    prevSlots &&\n    prevSlots !== emptyObject &&\n    key === prevSlots.$key &&\n    !hasNormalSlots &&\n    !prevSlots.$hasNormal\n  ) {\n    // fast path 2: stable scoped slots w/ no normal slots to proxy,\n    // only need to normalize once\n    return prevSlots\n  } else {\n    res = {};\n    for (var key$1 in slots) {\n      if (slots[key$1] && key$1[0] !== '$') {\n        res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]);\n      }\n    }\n  }\n  // expose normal slots on scopedSlots\n  for (var key$2 in normalSlots) {\n    if (!(key$2 in res)) {\n      res[key$2] = proxyNormalSlot(normalSlots, key$2);\n    }\n  }\n  // avoriaz seems to mock a non-extensible $scopedSlots object\n  // and when that is passed down this would cause an error\n  if (slots && Object.isExtensible(slots)) {\n    (slots)._normalized = res;\n  }\n  def(res, '$stable', isStable);\n  def(res, '$key', key);\n  def(res, '$hasNormal', hasNormalSlots);\n  return res\n}\n\nfunction normalizeScopedSlot(normalSlots, key, fn) {\n  var normalized = function () {\n    var res = arguments.length ? fn.apply(null, arguments) : fn({});\n    res = res && typeof res === 'object' && !Array.isArray(res)\n      ? [res] // single vnode\n      : normalizeChildren(res);\n    return res && (\n      res.length === 0 ||\n      (res.length === 1 && res[0].isComment) // #9658\n    ) ? undefined\n      : res\n  };\n  // this is a slot using the new v-slot syntax without scope. although it is\n  // compiled as a scoped slot, render fn users would expect it to be present\n  // on this.$slots because the usage is semantically a normal slot.\n  if (fn.proxy) {\n    Object.defineProperty(normalSlots, key, {\n      get: normalized,\n      enumerable: true,\n      configurable: true\n    });\n  }\n  return normalized\n}\n\nfunction proxyNormalSlot(slots, key) {\n  return function () { return slots[key]; }\n}\n\n/*  */\n\n/**\n * Runtime helper for rendering v-for lists.\n */\nfunction renderList (\n  val,\n  render\n) {\n  var ret, i, l, keys, key;\n  if (Array.isArray(val) || typeof val === 'string') {\n    ret = new Array(val.length);\n    for (i = 0, l = val.length; i < l; i++) {\n      ret[i] = render(val[i], i);\n    }\n  } else if (typeof val === 'number') {\n    ret = new Array(val);\n    for (i = 0; i < val; i++) {\n      ret[i] = render(i + 1, i);\n    }\n  } else if (isObject(val)) {\n    if (hasSymbol && val[Symbol.iterator]) {\n      ret = [];\n      var iterator = val[Symbol.iterator]();\n      var result = iterator.next();\n      while (!result.done) {\n        ret.push(render(result.value, ret.length));\n        result = iterator.next();\n      }\n    } else {\n      keys = Object.keys(val);\n      ret = new Array(keys.length);\n      for (i = 0, l = keys.length; i < l; i++) {\n        key = keys[i];\n        ret[i] = render(val[key], key, i);\n      }\n    }\n  }\n  if (!isDef(ret)) {\n    ret = [];\n  }\n  (ret)._isVList = true;\n  return ret\n}\n\n/*  */\n\n/**\n * Runtime helper for rendering <slot>\n */\nfunction renderSlot (\n  name,\n  fallback,\n  props,\n  bindObject\n) {\n  var scopedSlotFn = this.$scopedSlots[name];\n  var nodes;\n  if (scopedSlotFn) { // scoped slot\n    props = props || {};\n    if (bindObject) {\n      if (process.env.NODE_ENV !== 'production' && !isObject(bindObject)) {\n        warn(\n          'slot v-bind without argument expects an Object',\n          this\n        );\n      }\n      props = extend(extend({}, bindObject), props);\n    }\n    nodes = scopedSlotFn(props) || fallback;\n  } else {\n    nodes = this.$slots[name] || fallback;\n  }\n\n  var target = props && props.slot;\n  if (target) {\n    return this.$createElement('template', { slot: target }, nodes)\n  } else {\n    return nodes\n  }\n}\n\n/*  */\n\n/**\n * Runtime helper for resolving filters\n */\nfunction resolveFilter (id) {\n  return resolveAsset(this.$options, 'filters', id, true) || identity\n}\n\n/*  */\n\nfunction isKeyNotMatch (expect, actual) {\n  if (Array.isArray(expect)) {\n    return expect.indexOf(actual) === -1\n  } else {\n    return expect !== actual\n  }\n}\n\n/**\n * Runtime helper for checking keyCodes from config.\n * exposed as Vue.prototype._k\n * passing in eventKeyName as last argument separately for backwards compat\n */\nfunction checkKeyCodes (\n  eventKeyCode,\n  key,\n  builtInKeyCode,\n  eventKeyName,\n  builtInKeyName\n) {\n  var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;\n  if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {\n    return isKeyNotMatch(builtInKeyName, eventKeyName)\n  } else if (mappedKeyCode) {\n    return isKeyNotMatch(mappedKeyCode, eventKeyCode)\n  } else if (eventKeyName) {\n    return hyphenate(eventKeyName) !== key\n  }\n}\n\n/*  */\n\n/**\n * Runtime helper for merging v-bind=\"object\" into a VNode's data.\n */\nfunction bindObjectProps (\n  data,\n  tag,\n  value,\n  asProp,\n  isSync\n) {\n  if (value) {\n    if (!isObject(value)) {\n      process.env.NODE_ENV !== 'production' && warn(\n        'v-bind without argument expects an Object or Array value',\n        this\n      );\n    } else {\n      if (Array.isArray(value)) {\n        value = toObject(value);\n      }\n      var hash;\n      var loop = function ( key ) {\n        if (\n          key === 'class' ||\n          key === 'style' ||\n          isReservedAttribute(key)\n        ) {\n          hash = data;\n        } else {\n          var type = data.attrs && data.attrs.type;\n          hash = asProp || config.mustUseProp(tag, type, key)\n            ? data.domProps || (data.domProps = {})\n            : data.attrs || (data.attrs = {});\n        }\n        var camelizedKey = camelize(key);\n        var hyphenatedKey = hyphenate(key);\n        if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) {\n          hash[key] = value[key];\n\n          if (isSync) {\n            var on = data.on || (data.on = {});\n            on[(\"update:\" + key)] = function ($event) {\n              value[key] = $event;\n            };\n          }\n        }\n      };\n\n      for (var key in value) loop( key );\n    }\n  }\n  return data\n}\n\n/*  */\n\n/**\n * Runtime helper for rendering static trees.\n */\nfunction renderStatic (\n  index,\n  isInFor\n) {\n  var cached = this._staticTrees || (this._staticTrees = []);\n  var tree = cached[index];\n  // if has already-rendered static tree and not inside v-for,\n  // we can reuse the same tree.\n  if (tree && !isInFor) {\n    return tree\n  }\n  // otherwise, render a fresh tree.\n  tree = cached[index] = this.$options.staticRenderFns[index].call(\n    this._renderProxy,\n    null,\n    this // for render fns generated for functional component templates\n  );\n  markStatic(tree, (\"__static__\" + index), false);\n  return tree\n}\n\n/**\n * Runtime helper for v-once.\n * Effectively it means marking the node as static with a unique key.\n */\nfunction markOnce (\n  tree,\n  index,\n  key\n) {\n  markStatic(tree, (\"__once__\" + index + (key ? (\"_\" + key) : \"\")), true);\n  return tree\n}\n\nfunction markStatic (\n  tree,\n  key,\n  isOnce\n) {\n  if (Array.isArray(tree)) {\n    for (var i = 0; i < tree.length; i++) {\n      if (tree[i] && typeof tree[i] !== 'string') {\n        markStaticNode(tree[i], (key + \"_\" + i), isOnce);\n      }\n    }\n  } else {\n    markStaticNode(tree, key, isOnce);\n  }\n}\n\nfunction markStaticNode (node, key, isOnce) {\n  node.isStatic = true;\n  node.key = key;\n  node.isOnce = isOnce;\n}\n\n/*  */\n\nfunction bindObjectListeners (data, value) {\n  if (value) {\n    if (!isPlainObject(value)) {\n      process.env.NODE_ENV !== 'production' && warn(\n        'v-on without argument expects an Object value',\n        this\n      );\n    } else {\n      var on = data.on = data.on ? extend({}, data.on) : {};\n      for (var key in value) {\n        var existing = on[key];\n        var ours = value[key];\n        on[key] = existing ? [].concat(existing, ours) : ours;\n      }\n    }\n  }\n  return data\n}\n\n/*  */\n\nfunction resolveScopedSlots (\n  fns, // see flow/vnode\n  res,\n  // the following are added in 2.6\n  hasDynamicKeys,\n  contentHashKey\n) {\n  res = res || { $stable: !hasDynamicKeys };\n  for (var i = 0; i < fns.length; i++) {\n    var slot = fns[i];\n    if (Array.isArray(slot)) {\n      resolveScopedSlots(slot, res, hasDynamicKeys);\n    } else if (slot) {\n      // marker for reverse proxying v-slot without scope on this.$slots\n      if (slot.proxy) {\n        slot.fn.proxy = true;\n      }\n      res[slot.key] = slot.fn;\n    }\n  }\n  if (contentHashKey) {\n    (res).$key = contentHashKey;\n  }\n  return res\n}\n\n/*  */\n\nfunction bindDynamicKeys (baseObj, values) {\n  for (var i = 0; i < values.length; i += 2) {\n    var key = values[i];\n    if (typeof key === 'string' && key) {\n      baseObj[values[i]] = values[i + 1];\n    } else if (process.env.NODE_ENV !== 'production' && key !== '' && key !== null) {\n      // null is a special value for explicitly removing a binding\n      warn(\n        (\"Invalid value for dynamic directive argument (expected string or null): \" + key),\n        this\n      );\n    }\n  }\n  return baseObj\n}\n\n// helper to dynamically append modifier runtime markers to event names.\n// ensure only append when value is already string, otherwise it will be cast\n// to string and cause the type check to miss.\nfunction prependModifier (value, symbol) {\n  return typeof value === 'string' ? symbol + value : value\n}\n\n/*  */\n\nfunction installRenderHelpers (target) {\n  target._o = markOnce;\n  target._n = toNumber;\n  target._s = toString;\n  target._l = renderList;\n  target._t = renderSlot;\n  target._q = looseEqual;\n  target._i = looseIndexOf;\n  target._m = renderStatic;\n  target._f = resolveFilter;\n  target._k = checkKeyCodes;\n  target._b = bindObjectProps;\n  target._v = createTextVNode;\n  target._e = createEmptyVNode;\n  target._u = resolveScopedSlots;\n  target._g = bindObjectListeners;\n  target._d = bindDynamicKeys;\n  target._p = prependModifier;\n}\n\n/*  */\n\nfunction FunctionalRenderContext (\n  data,\n  props,\n  children,\n  parent,\n  Ctor\n) {\n  var this$1 = this;\n\n  var options = Ctor.options;\n  // ensure the createElement function in functional components\n  // gets a unique context - this is necessary for correct named slot check\n  var contextVm;\n  if (hasOwn(parent, '_uid')) {\n    contextVm = Object.create(parent);\n    // $flow-disable-line\n    contextVm._original = parent;\n  } else {\n    // the context vm passed in is a functional context as well.\n    // in this case we want to make sure we are able to get a hold to the\n    // real context instance.\n    contextVm = parent;\n    // $flow-disable-line\n    parent = parent._original;\n  }\n  var isCompiled = isTrue(options._compiled);\n  var needNormalization = !isCompiled;\n\n  this.data = data;\n  this.props = props;\n  this.children = children;\n  this.parent = parent;\n  this.listeners = data.on || emptyObject;\n  this.injections = resolveInject(options.inject, parent);\n  this.slots = function () {\n    if (!this$1.$slots) {\n      normalizeScopedSlots(\n        data.scopedSlots,\n        this$1.$slots = resolveSlots(children, parent)\n      );\n    }\n    return this$1.$slots\n  };\n\n  Object.defineProperty(this, 'scopedSlots', ({\n    enumerable: true,\n    get: function get () {\n      return normalizeScopedSlots(data.scopedSlots, this.slots())\n    }\n  }));\n\n  // support for compiled functional template\n  if (isCompiled) {\n    // exposing $options for renderStatic()\n    this.$options = options;\n    // pre-resolve slots for renderSlot()\n    this.$slots = this.slots();\n    this.$scopedSlots = normalizeScopedSlots(data.scopedSlots, this.$slots);\n  }\n\n  if (options._scopeId) {\n    this._c = function (a, b, c, d) {\n      var vnode = createElement(contextVm, a, b, c, d, needNormalization);\n      if (vnode && !Array.isArray(vnode)) {\n        vnode.fnScopeId = options._scopeId;\n        vnode.fnContext = parent;\n      }\n      return vnode\n    };\n  } else {\n    this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };\n  }\n}\n\ninstallRenderHelpers(FunctionalRenderContext.prototype);\n\nfunction createFunctionalComponent (\n  Ctor,\n  propsData,\n  data,\n  contextVm,\n  children\n) {\n  var options = Ctor.options;\n  var props = {};\n  var propOptions = options.props;\n  if (isDef(propOptions)) {\n    for (var key in propOptions) {\n      props[key] = validateProp(key, propOptions, propsData || emptyObject);\n    }\n  } else {\n    if (isDef(data.attrs)) { mergeProps(props, data.attrs); }\n    if (isDef(data.props)) { mergeProps(props, data.props); }\n  }\n\n  var renderContext = new FunctionalRenderContext(\n    data,\n    props,\n    children,\n    contextVm,\n    Ctor\n  );\n\n  var vnode = options.render.call(null, renderContext._c, renderContext);\n\n  if (vnode instanceof VNode) {\n    return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options, renderContext)\n  } else if (Array.isArray(vnode)) {\n    var vnodes = normalizeChildren(vnode) || [];\n    var res = new Array(vnodes.length);\n    for (var i = 0; i < vnodes.length; i++) {\n      res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options, renderContext);\n    }\n    return res\n  }\n}\n\nfunction cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderContext) {\n  // #7817 clone node before setting fnContext, otherwise if the node is reused\n  // (e.g. it was from a cached normal slot) the fnContext causes named slots\n  // that should not be matched to match.\n  var clone = cloneVNode(vnode);\n  clone.fnContext = contextVm;\n  clone.fnOptions = options;\n  if (process.env.NODE_ENV !== 'production') {\n    (clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext = renderContext;\n  }\n  if (data.slot) {\n    (clone.data || (clone.data = {})).slot = data.slot;\n  }\n  return clone\n}\n\nfunction mergeProps (to, from) {\n  for (var key in from) {\n    to[camelize(key)] = from[key];\n  }\n}\n\n/*  */\n\n/*  */\n\n/*  */\n\n/*  */\n\n// inline hooks to be invoked on component VNodes during patch\nvar componentVNodeHooks = {\n  init: function init (vnode, hydrating) {\n    if (\n      vnode.componentInstance &&\n      !vnode.componentInstance._isDestroyed &&\n      vnode.data.keepAlive\n    ) {\n      // kept-alive components, treat as a patch\n      var mountedNode = vnode; // work around flow\n      componentVNodeHooks.prepatch(mountedNode, mountedNode);\n    } else {\n      var child = vnode.componentInstance = createComponentInstanceForVnode(\n        vnode,\n        activeInstance\n      );\n      child.$mount(hydrating ? vnode.elm : undefined, hydrating);\n    }\n  },\n\n  prepatch: function prepatch (oldVnode, vnode) {\n    var options = vnode.componentOptions;\n    var child = vnode.componentInstance = oldVnode.componentInstance;\n    updateChildComponent(\n      child,\n      options.propsData, // updated props\n      options.listeners, // updated listeners\n      vnode, // new parent vnode\n      options.children // new children\n    );\n  },\n\n  insert: function insert (vnode) {\n    var context = vnode.context;\n    var componentInstance = vnode.componentInstance;\n    if (!componentInstance._isMounted) {\n      componentInstance._isMounted = true;\n      callHook(componentInstance, 'mounted');\n    }\n    if (vnode.data.keepAlive) {\n      if (context._isMounted) {\n        // vue-router#1212\n        // During updates, a kept-alive component's child components may\n        // change, so directly walking the tree here may call activated hooks\n        // on incorrect children. Instead we push them into a queue which will\n        // be processed after the whole patch process ended.\n        queueActivatedComponent(componentInstance);\n      } else {\n        activateChildComponent(componentInstance, true /* direct */);\n      }\n    }\n  },\n\n  destroy: function destroy (vnode) {\n    var componentInstance = vnode.componentInstance;\n    if (!componentInstance._isDestroyed) {\n      if (!vnode.data.keepAlive) {\n        componentInstance.$destroy();\n      } else {\n        deactivateChildComponent(componentInstance, true /* direct */);\n      }\n    }\n  }\n};\n\nvar hooksToMerge = Object.keys(componentVNodeHooks);\n\nfunction createComponent (\n  Ctor,\n  data,\n  context,\n  children,\n  tag\n) {\n  if (isUndef(Ctor)) {\n    return\n  }\n\n  var baseCtor = context.$options._base;\n\n  // plain options object: turn it into a constructor\n  if (isObject(Ctor)) {\n    Ctor = baseCtor.extend(Ctor);\n  }\n\n  // if at this stage it's not a constructor or an async component factory,\n  // reject.\n  if (typeof Ctor !== 'function') {\n    if (process.env.NODE_ENV !== 'production') {\n      warn((\"Invalid Component definition: \" + (String(Ctor))), context);\n    }\n    return\n  }\n\n  // async component\n  var asyncFactory;\n  if (isUndef(Ctor.cid)) {\n    asyncFactory = Ctor;\n    Ctor = resolveAsyncComponent(asyncFactory, baseCtor);\n    if (Ctor === undefined) {\n      // return a placeholder node for async component, which is rendered\n      // as a comment node but preserves all the raw information for the node.\n      // the information will be used for async server-rendering and hydration.\n      return createAsyncPlaceholder(\n        asyncFactory,\n        data,\n        context,\n        children,\n        tag\n      )\n    }\n  }\n\n  data = data || {};\n\n  // resolve constructor options in case global mixins are applied after\n  // component constructor creation\n  resolveConstructorOptions(Ctor);\n\n  // transform component v-model data into props & events\n  if (isDef(data.model)) {\n    transformModel(Ctor.options, data);\n  }\n\n  // extract props\n  var propsData = extractPropsFromVNodeData(data, Ctor, tag);\n\n  // functional component\n  if (isTrue(Ctor.options.functional)) {\n    return createFunctionalComponent(Ctor, propsData, data, context, children)\n  }\n\n  // extract listeners, since these needs to be treated as\n  // child component listeners instead of DOM listeners\n  var listeners = data.on;\n  // replace with listeners with .native modifier\n  // so it gets processed during parent component patch.\n  data.on = data.nativeOn;\n\n  if (isTrue(Ctor.options.abstract)) {\n    // abstract components do not keep anything\n    // other than props & listeners & slot\n\n    // work around flow\n    var slot = data.slot;\n    data = {};\n    if (slot) {\n      data.slot = slot;\n    }\n  }\n\n  // install component management hooks onto the placeholder node\n  installComponentHooks(data);\n\n  // return a placeholder vnode\n  var name = Ctor.options.name || tag;\n  var vnode = new VNode(\n    (\"vue-component-\" + (Ctor.cid) + (name ? (\"-\" + name) : '')),\n    data, undefined, undefined, undefined, context,\n    { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },\n    asyncFactory\n  );\n\n  return vnode\n}\n\nfunction createComponentInstanceForVnode (\n  vnode, // we know it's MountedComponentVNode but flow doesn't\n  parent // activeInstance in lifecycle state\n) {\n  var options = {\n    _isComponent: true,\n    _parentVnode: vnode,\n    parent: parent\n  };\n  // check inline-template render functions\n  var inlineTemplate = vnode.data.inlineTemplate;\n  if (isDef(inlineTemplate)) {\n    options.render = inlineTemplate.render;\n    options.staticRenderFns = inlineTemplate.staticRenderFns;\n  }\n  return new vnode.componentOptions.Ctor(options)\n}\n\nfunction installComponentHooks (data) {\n  var hooks = data.hook || (data.hook = {});\n  for (var i = 0; i < hooksToMerge.length; i++) {\n    var key = hooksToMerge[i];\n    var existing = hooks[key];\n    var toMerge = componentVNodeHooks[key];\n    if (existing !== toMerge && !(existing && existing._merged)) {\n      hooks[key] = existing ? mergeHook$1(toMerge, existing) : toMerge;\n    }\n  }\n}\n\nfunction mergeHook$1 (f1, f2) {\n  var merged = function (a, b) {\n    // flow complains about extra args which is why we use any\n    f1(a, b);\n    f2(a, b);\n  };\n  merged._merged = true;\n  return merged\n}\n\n// transform component v-model info (value and callback) into\n// prop and event handler respectively.\nfunction transformModel (options, data) {\n  var prop = (options.model && options.model.prop) || 'value';\n  var event = (options.model && options.model.event) || 'input'\n  ;(data.attrs || (data.attrs = {}))[prop] = data.model.value;\n  var on = data.on || (data.on = {});\n  var existing = on[event];\n  var callback = data.model.callback;\n  if (isDef(existing)) {\n    if (\n      Array.isArray(existing)\n        ? existing.indexOf(callback) === -1\n        : existing !== callback\n    ) {\n      on[event] = [callback].concat(existing);\n    }\n  } else {\n    on[event] = callback;\n  }\n}\n\n/*  */\n\nvar SIMPLE_NORMALIZE = 1;\nvar ALWAYS_NORMALIZE = 2;\n\n// wrapper function for providing a more flexible interface\n// without getting yelled at by flow\nfunction createElement (\n  context,\n  tag,\n  data,\n  children,\n  normalizationType,\n  alwaysNormalize\n) {\n  if (Array.isArray(data) || isPrimitive(data)) {\n    normalizationType = children;\n    children = data;\n    data = undefined;\n  }\n  if (isTrue(alwaysNormalize)) {\n    normalizationType = ALWAYS_NORMALIZE;\n  }\n  return _createElement(context, tag, data, children, normalizationType)\n}\n\nfunction _createElement (\n  context,\n  tag,\n  data,\n  children,\n  normalizationType\n) {\n  if (isDef(data) && isDef((data).__ob__)) {\n    process.env.NODE_ENV !== 'production' && warn(\n      \"Avoid using observed data object as vnode data: \" + (JSON.stringify(data)) + \"\\n\" +\n      'Always create fresh vnode data objects in each render!',\n      context\n    );\n    return createEmptyVNode()\n  }\n  // object syntax in v-bind\n  if (isDef(data) && isDef(data.is)) {\n    tag = data.is;\n  }\n  if (!tag) {\n    // in case of component :is set to falsy value\n    return createEmptyVNode()\n  }\n  // warn against non-primitive key\n  if (process.env.NODE_ENV !== 'production' &&\n    isDef(data) && isDef(data.key) && !isPrimitive(data.key)\n  ) {\n    {\n      warn(\n        'Avoid using non-primitive value as key, ' +\n        'use string/number value instead.',\n        context\n      );\n    }\n  }\n  // support single function children as default scoped slot\n  if (Array.isArray(children) &&\n    typeof children[0] === 'function'\n  ) {\n    data = data || {};\n    data.scopedSlots = { default: children[0] };\n    children.length = 0;\n  }\n  if (normalizationType === ALWAYS_NORMALIZE) {\n    children = normalizeChildren(children);\n  } else if (normalizationType === SIMPLE_NORMALIZE) {\n    children = simpleNormalizeChildren(children);\n  }\n  var vnode, ns;\n  if (typeof tag === 'string') {\n    var Ctor;\n    ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);\n    if (config.isReservedTag(tag)) {\n      // platform built-in elements\n      if (process.env.NODE_ENV !== 'production' && isDef(data) && isDef(data.nativeOn)) {\n        warn(\n          (\"The .native modifier for v-on is only valid on components but it was used on <\" + tag + \">.\"),\n          context\n        );\n      }\n      vnode = new VNode(\n        config.parsePlatformTagName(tag), data, children,\n        undefined, undefined, context\n      );\n    } else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {\n      // component\n      vnode = createComponent(Ctor, data, context, children, tag);\n    } else {\n      // unknown or unlisted namespaced elements\n      // check at runtime because it may get assigned a namespace when its\n      // parent normalizes children\n      vnode = new VNode(\n        tag, data, children,\n        undefined, undefined, context\n      );\n    }\n  } else {\n    // direct component options / constructor\n    vnode = createComponent(tag, data, context, children);\n  }\n  if (Array.isArray(vnode)) {\n    return vnode\n  } else if (isDef(vnode)) {\n    if (isDef(ns)) { applyNS(vnode, ns); }\n    if (isDef(data)) { registerDeepBindings(data); }\n    return vnode\n  } else {\n    return createEmptyVNode()\n  }\n}\n\nfunction applyNS (vnode, ns, force) {\n  vnode.ns = ns;\n  if (vnode.tag === 'foreignObject') {\n    // use default namespace inside foreignObject\n    ns = undefined;\n    force = true;\n  }\n  if (isDef(vnode.children)) {\n    for (var i = 0, l = vnode.children.length; i < l; i++) {\n      var child = vnode.children[i];\n      if (isDef(child.tag) && (\n        isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {\n        applyNS(child, ns, force);\n      }\n    }\n  }\n}\n\n// ref #5318\n// necessary to ensure parent re-render when deep bindings like :style and\n// :class are used on slot nodes\nfunction registerDeepBindings (data) {\n  if (isObject(data.style)) {\n    traverse(data.style);\n  }\n  if (isObject(data.class)) {\n    traverse(data.class);\n  }\n}\n\n/*  */\n\nfunction initRender (vm) {\n  vm._vnode = null; // the root of the child tree\n  vm._staticTrees = null; // v-once cached trees\n  var options = vm.$options;\n  var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree\n  var renderContext = parentVnode && parentVnode.context;\n  vm.$slots = resolveSlots(options._renderChildren, renderContext);\n  vm.$scopedSlots = emptyObject;\n  // bind the createElement fn to this instance\n  // so that we get proper render context inside it.\n  // args order: tag, data, children, normalizationType, alwaysNormalize\n  // internal version is used by render functions compiled from templates\n  vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };\n  // normalization is always applied for the public version, used in\n  // user-written render functions.\n  vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };\n\n  // $attrs & $listeners are exposed for easier HOC creation.\n  // they need to be reactive so that HOCs using them are always updated\n  var parentData = parentVnode && parentVnode.data;\n\n  /* istanbul ignore else */\n  if (process.env.NODE_ENV !== 'production') {\n    defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {\n      !isUpdatingChildComponent && warn(\"$attrs is readonly.\", vm);\n    }, true);\n    defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, function () {\n      !isUpdatingChildComponent && warn(\"$listeners is readonly.\", vm);\n    }, true);\n  } else {\n    defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true);\n    defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, null, true);\n  }\n}\n\nvar currentRenderingInstance = null;\n\nfunction renderMixin (Vue) {\n  // install runtime convenience helpers\n  installRenderHelpers(Vue.prototype);\n\n  Vue.prototype.$nextTick = function (fn) {\n    return nextTick(fn, this)\n  };\n\n  Vue.prototype._render = function () {\n    var vm = this;\n    var ref = vm.$options;\n    var render = ref.render;\n    var _parentVnode = ref._parentVnode;\n\n    if (_parentVnode) {\n      vm.$scopedSlots = normalizeScopedSlots(\n        _parentVnode.data.scopedSlots,\n        vm.$slots,\n        vm.$scopedSlots\n      );\n    }\n\n    // set parent vnode. this allows render functions to have access\n    // to the data on the placeholder node.\n    vm.$vnode = _parentVnode;\n    // render self\n    var vnode;\n    try {\n      // There's no need to maintain a stack because all render fns are called\n      // separately from one another. Nested component's render fns are called\n      // when parent component is patched.\n      currentRenderingInstance = vm;\n      vnode = render.call(vm._renderProxy, vm.$createElement);\n    } catch (e) {\n      handleError(e, vm, \"render\");\n      // return error render result,\n      // or previous vnode to prevent render error causing blank component\n      /* istanbul ignore else */\n      if (process.env.NODE_ENV !== 'production' && vm.$options.renderError) {\n        try {\n          vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);\n        } catch (e) {\n          handleError(e, vm, \"renderError\");\n          vnode = vm._vnode;\n        }\n      } else {\n        vnode = vm._vnode;\n      }\n    } finally {\n      currentRenderingInstance = null;\n    }\n    // if the returned array contains only a single node, allow it\n    if (Array.isArray(vnode) && vnode.length === 1) {\n      vnode = vnode[0];\n    }\n    // return empty vnode in case the render function errored out\n    if (!(vnode instanceof VNode)) {\n      if (process.env.NODE_ENV !== 'production' && Array.isArray(vnode)) {\n        warn(\n          'Multiple root nodes returned from render function. Render function ' +\n          'should return a single root node.',\n          vm\n        );\n      }\n      vnode = createEmptyVNode();\n    }\n    // set parent\n    vnode.parent = _parentVnode;\n    return vnode\n  };\n}\n\n/*  */\n\nfunction ensureCtor (comp, base) {\n  if (\n    comp.__esModule ||\n    (hasSymbol && comp[Symbol.toStringTag] === 'Module')\n  ) {\n    comp = comp.default;\n  }\n  return isObject(comp)\n    ? base.extend(comp)\n    : comp\n}\n\nfunction createAsyncPlaceholder (\n  factory,\n  data,\n  context,\n  children,\n  tag\n) {\n  var node = createEmptyVNode();\n  node.asyncFactory = factory;\n  node.asyncMeta = { data: data, context: context, children: children, tag: tag };\n  return node\n}\n\nfunction resolveAsyncComponent (\n  factory,\n  baseCtor\n) {\n  if (isTrue(factory.error) && isDef(factory.errorComp)) {\n    return factory.errorComp\n  }\n\n  if (isDef(factory.resolved)) {\n    return factory.resolved\n  }\n\n  var owner = currentRenderingInstance;\n  if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) {\n    // already pending\n    factory.owners.push(owner);\n  }\n\n  if (isTrue(factory.loading) && isDef(factory.loadingComp)) {\n    return factory.loadingComp\n  }\n\n  if (owner && !isDef(factory.owners)) {\n    var owners = factory.owners = [owner];\n    var sync = true;\n    var timerLoading = null;\n    var timerTimeout = null\n\n    ;(owner).$on('hook:destroyed', function () { return remove(owners, owner); });\n\n    var forceRender = function (renderCompleted) {\n      for (var i = 0, l = owners.length; i < l; i++) {\n        (owners[i]).$forceUpdate();\n      }\n\n      if (renderCompleted) {\n        owners.length = 0;\n        if (timerLoading !== null) {\n          clearTimeout(timerLoading);\n          timerLoading = null;\n        }\n        if (timerTimeout !== null) {\n          clearTimeout(timerTimeout);\n          timerTimeout = null;\n        }\n      }\n    };\n\n    var resolve = once(function (res) {\n      // cache resolved\n      factory.resolved = ensureCtor(res, baseCtor);\n      // invoke callbacks only if this is not a synchronous resolve\n      // (async resolves are shimmed as synchronous during SSR)\n      if (!sync) {\n        forceRender(true);\n      } else {\n        owners.length = 0;\n      }\n    });\n\n    var reject = once(function (reason) {\n      process.env.NODE_ENV !== 'production' && warn(\n        \"Failed to resolve async component: \" + (String(factory)) +\n        (reason ? (\"\\nReason: \" + reason) : '')\n      );\n      if (isDef(factory.errorComp)) {\n        factory.error = true;\n        forceRender(true);\n      }\n    });\n\n    var res = factory(resolve, reject);\n\n    if (isObject(res)) {\n      if (isPromise(res)) {\n        // () => Promise\n        if (isUndef(factory.resolved)) {\n          res.then(resolve, reject);\n        }\n      } else if (isPromise(res.component)) {\n        res.component.then(resolve, reject);\n\n        if (isDef(res.error)) {\n          factory.errorComp = ensureCtor(res.error, baseCtor);\n        }\n\n        if (isDef(res.loading)) {\n          factory.loadingComp = ensureCtor(res.loading, baseCtor);\n          if (res.delay === 0) {\n            factory.loading = true;\n          } else {\n            timerLoading = setTimeout(function () {\n              timerLoading = null;\n              if (isUndef(factory.resolved) && isUndef(factory.error)) {\n                factory.loading = true;\n                forceRender(false);\n              }\n            }, res.delay || 200);\n          }\n        }\n\n        if (isDef(res.timeout)) {\n          timerTimeout = setTimeout(function () {\n            timerTimeout = null;\n            if (isUndef(factory.resolved)) {\n              reject(\n                process.env.NODE_ENV !== 'production'\n                  ? (\"timeout (\" + (res.timeout) + \"ms)\")\n                  : null\n              );\n            }\n          }, res.timeout);\n        }\n      }\n    }\n\n    sync = false;\n    // return in case resolved synchronously\n    return factory.loading\n      ? factory.loadingComp\n      : factory.resolved\n  }\n}\n\n/*  */\n\nfunction isAsyncPlaceholder (node) {\n  return node.isComment && node.asyncFactory\n}\n\n/*  */\n\nfunction getFirstComponentChild (children) {\n  if (Array.isArray(children)) {\n    for (var i = 0; i < children.length; i++) {\n      var c = children[i];\n      if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {\n        return c\n      }\n    }\n  }\n}\n\n/*  */\n\n/*  */\n\nfunction initEvents (vm) {\n  vm._events = Object.create(null);\n  vm._hasHookEvent = false;\n  // init parent attached events\n  var listeners = vm.$options._parentListeners;\n  if (listeners) {\n    updateComponentListeners(vm, listeners);\n  }\n}\n\nvar target;\n\nfunction add (event, fn) {\n  target.$on(event, fn);\n}\n\nfunction remove$1 (event, fn) {\n  target.$off(event, fn);\n}\n\nfunction createOnceHandler (event, fn) {\n  var _target = target;\n  return function onceHandler () {\n    var res = fn.apply(null, arguments);\n    if (res !== null) {\n      _target.$off(event, onceHandler);\n    }\n  }\n}\n\nfunction updateComponentListeners (\n  vm,\n  listeners,\n  oldListeners\n) {\n  target = vm;\n  updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm);\n  target = undefined;\n}\n\nfunction eventsMixin (Vue) {\n  var hookRE = /^hook:/;\n  Vue.prototype.$on = function (event, fn) {\n    var vm = this;\n    if (Array.isArray(event)) {\n      for (var i = 0, l = event.length; i < l; i++) {\n        vm.$on(event[i], fn);\n      }\n    } else {\n      (vm._events[event] || (vm._events[event] = [])).push(fn);\n      // optimize hook:event cost by using a boolean flag marked at registration\n      // instead of a hash lookup\n      if (hookRE.test(event)) {\n        vm._hasHookEvent = true;\n      }\n    }\n    return vm\n  };\n\n  Vue.prototype.$once = function (event, fn) {\n    var vm = this;\n    function on () {\n      vm.$off(event, on);\n      fn.apply(vm, arguments);\n    }\n    on.fn = fn;\n    vm.$on(event, on);\n    return vm\n  };\n\n  Vue.prototype.$off = function (event, fn) {\n    var vm = this;\n    // all\n    if (!arguments.length) {\n      vm._events = Object.create(null);\n      return vm\n    }\n    // array of events\n    if (Array.isArray(event)) {\n      for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {\n        vm.$off(event[i$1], fn);\n      }\n      return vm\n    }\n    // specific event\n    var cbs = vm._events[event];\n    if (!cbs) {\n      return vm\n    }\n    if (!fn) {\n      vm._events[event] = null;\n      return vm\n    }\n    // specific handler\n    var cb;\n    var i = cbs.length;\n    while (i--) {\n      cb = cbs[i];\n      if (cb === fn || cb.fn === fn) {\n        cbs.splice(i, 1);\n        break\n      }\n    }\n    return vm\n  };\n\n  Vue.prototype.$emit = function (event) {\n    var vm = this;\n    if (process.env.NODE_ENV !== 'production') {\n      var lowerCaseEvent = event.toLowerCase();\n      if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {\n        tip(\n          \"Event \\\"\" + lowerCaseEvent + \"\\\" is emitted in component \" +\n          (formatComponentName(vm)) + \" but the handler is registered for \\\"\" + event + \"\\\". \" +\n          \"Note that HTML attributes are case-insensitive and you cannot use \" +\n          \"v-on to listen to camelCase events when using in-DOM templates. \" +\n          \"You should probably use \\\"\" + (hyphenate(event)) + \"\\\" instead of \\\"\" + event + \"\\\".\"\n        );\n      }\n    }\n    var cbs = vm._events[event];\n    if (cbs) {\n      cbs = cbs.length > 1 ? toArray(cbs) : cbs;\n      var args = toArray(arguments, 1);\n      var info = \"event handler for \\\"\" + event + \"\\\"\";\n      for (var i = 0, l = cbs.length; i < l; i++) {\n        invokeWithErrorHandling(cbs[i], vm, args, vm, info);\n      }\n    }\n    return vm\n  };\n}\n\n/*  */\n\nvar activeInstance = null;\nvar isUpdatingChildComponent = false;\n\nfunction setActiveInstance(vm) {\n  var prevActiveInstance = activeInstance;\n  activeInstance = vm;\n  return function () {\n    activeInstance = prevActiveInstance;\n  }\n}\n\nfunction initLifecycle (vm) {\n  var options = vm.$options;\n\n  // locate first non-abstract parent\n  var parent = options.parent;\n  if (parent && !options.abstract) {\n    while (parent.$options.abstract && parent.$parent) {\n      parent = parent.$parent;\n    }\n    parent.$children.push(vm);\n  }\n\n  vm.$parent = parent;\n  vm.$root = parent ? parent.$root : vm;\n\n  vm.$children = [];\n  vm.$refs = {};\n\n  vm._watcher = null;\n  vm._inactive = null;\n  vm._directInactive = false;\n  vm._isMounted = false;\n  vm._isDestroyed = false;\n  vm._isBeingDestroyed = false;\n}\n\nfunction lifecycleMixin (Vue) {\n  Vue.prototype._update = function (vnode, hydrating) {\n    var vm = this;\n    var prevEl = vm.$el;\n    var prevVnode = vm._vnode;\n    var restoreActiveInstance = setActiveInstance(vm);\n    vm._vnode = vnode;\n    // Vue.prototype.__patch__ is injected in entry points\n    // based on the rendering backend used.\n    if (!prevVnode) {\n      // initial render\n      vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */);\n    } else {\n      // updates\n      vm.$el = vm.__patch__(prevVnode, vnode);\n    }\n    restoreActiveInstance();\n    // update __vue__ reference\n    if (prevEl) {\n      prevEl.__vue__ = null;\n    }\n    if (vm.$el) {\n      vm.$el.__vue__ = vm;\n    }\n    // if parent is an HOC, update its $el as well\n    if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {\n      vm.$parent.$el = vm.$el;\n    }\n    // updated hook is called by the scheduler to ensure that children are\n    // updated in a parent's updated hook.\n  };\n\n  Vue.prototype.$forceUpdate = function () {\n    var vm = this;\n    if (vm._watcher) {\n      vm._watcher.update();\n    }\n  };\n\n  Vue.prototype.$destroy = function () {\n    var vm = this;\n    if (vm._isBeingDestroyed) {\n      return\n    }\n    callHook(vm, 'beforeDestroy');\n    vm._isBeingDestroyed = true;\n    // remove self from parent\n    var parent = vm.$parent;\n    if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {\n      remove(parent.$children, vm);\n    }\n    // teardown watchers\n    if (vm._watcher) {\n      vm._watcher.teardown();\n    }\n    var i = vm._watchers.length;\n    while (i--) {\n      vm._watchers[i].teardown();\n    }\n    // remove reference from data ob\n    // frozen object may not have observer.\n    if (vm._data.__ob__) {\n      vm._data.__ob__.vmCount--;\n    }\n    // call the last hook...\n    vm._isDestroyed = true;\n    // invoke destroy hooks on current rendered tree\n    vm.__patch__(vm._vnode, null);\n    // fire destroyed hook\n    callHook(vm, 'destroyed');\n    // turn off all instance listeners.\n    vm.$off();\n    // remove __vue__ reference\n    if (vm.$el) {\n      vm.$el.__vue__ = null;\n    }\n    // release circular reference (#6759)\n    if (vm.$vnode) {\n      vm.$vnode.parent = null;\n    }\n  };\n}\n\nfunction mountComponent (\n  vm,\n  el,\n  hydrating\n) {\n  vm.$el = el;\n  if (!vm.$options.render) {\n    vm.$options.render = createEmptyVNode;\n    if (process.env.NODE_ENV !== 'production') {\n      /* istanbul ignore if */\n      if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||\n        vm.$options.el || el) {\n        warn(\n          'You are using the runtime-only build of Vue where the template ' +\n          'compiler is not available. Either pre-compile the templates into ' +\n          'render functions, or use the compiler-included build.',\n          vm\n        );\n      } else {\n        warn(\n          'Failed to mount component: template or render function not defined.',\n          vm\n        );\n      }\n    }\n  }\n  callHook(vm, 'beforeMount');\n\n  var updateComponent;\n  /* istanbul ignore if */\n  if (process.env.NODE_ENV !== 'production' && config.performance && mark) {\n    updateComponent = function () {\n      var name = vm._name;\n      var id = vm._uid;\n      var startTag = \"vue-perf-start:\" + id;\n      var endTag = \"vue-perf-end:\" + id;\n\n      mark(startTag);\n      var vnode = vm._render();\n      mark(endTag);\n      measure((\"vue \" + name + \" render\"), startTag, endTag);\n\n      mark(startTag);\n      vm._update(vnode, hydrating);\n      mark(endTag);\n      measure((\"vue \" + name + \" patch\"), startTag, endTag);\n    };\n  } else {\n    updateComponent = function () {\n      vm._update(vm._render(), hydrating);\n    };\n  }\n\n  // we set this to vm._watcher inside the watcher's constructor\n  // since the watcher's initial patch may call $forceUpdate (e.g. inside child\n  // component's mounted hook), which relies on vm._watcher being already defined\n  new Watcher(vm, updateComponent, noop, {\n    before: function before () {\n      if (vm._isMounted && !vm._isDestroyed) {\n        callHook(vm, 'beforeUpdate');\n      }\n    }\n  }, true /* isRenderWatcher */);\n  hydrating = false;\n\n  // manually mounted instance, call mounted on self\n  // mounted is called for render-created child components in its inserted hook\n  if (vm.$vnode == null) {\n    vm._isMounted = true;\n    callHook(vm, 'mounted');\n  }\n  return vm\n}\n\nfunction updateChildComponent (\n  vm,\n  propsData,\n  listeners,\n  parentVnode,\n  renderChildren\n) {\n  if (process.env.NODE_ENV !== 'production') {\n    isUpdatingChildComponent = true;\n  }\n\n  // determine whether component has slot children\n  // we need to do this before overwriting $options._renderChildren.\n\n  // check if there are dynamic scopedSlots (hand-written or compiled but with\n  // dynamic slot names). Static scoped slots compiled from template has the\n  // \"$stable\" marker.\n  var newScopedSlots = parentVnode.data.scopedSlots;\n  var oldScopedSlots = vm.$scopedSlots;\n  var hasDynamicScopedSlot = !!(\n    (newScopedSlots && !newScopedSlots.$stable) ||\n    (oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) ||\n    (newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key)\n  );\n\n  // Any static slot children from the parent may have changed during parent's\n  // update. Dynamic scoped slots may also have changed. In such cases, a forced\n  // update is necessary to ensure correctness.\n  var needsForceUpdate = !!(\n    renderChildren ||               // has new static slots\n    vm.$options._renderChildren ||  // has old static slots\n    hasDynamicScopedSlot\n  );\n\n  vm.$options._parentVnode = parentVnode;\n  vm.$vnode = parentVnode; // update vm's placeholder node without re-render\n\n  if (vm._vnode) { // update child tree's parent\n    vm._vnode.parent = parentVnode;\n  }\n  vm.$options._renderChildren = renderChildren;\n\n  // update $attrs and $listeners hash\n  // these are also reactive so they may trigger child update if the child\n  // used them during render\n  vm.$attrs = parentVnode.data.attrs || emptyObject;\n  vm.$listeners = listeners || emptyObject;\n\n  // update props\n  if (propsData && vm.$options.props) {\n    toggleObserving(false);\n    var props = vm._props;\n    var propKeys = vm.$options._propKeys || [];\n    for (var i = 0; i < propKeys.length; i++) {\n      var key = propKeys[i];\n      var propOptions = vm.$options.props; // wtf flow?\n      props[key] = validateProp(key, propOptions, propsData, vm);\n    }\n    toggleObserving(true);\n    // keep a copy of raw propsData\n    vm.$options.propsData = propsData;\n  }\n\n  // update listeners\n  listeners = listeners || emptyObject;\n  var oldListeners = vm.$options._parentListeners;\n  vm.$options._parentListeners = listeners;\n  updateComponentListeners(vm, listeners, oldListeners);\n\n  // resolve slots + force update if has children\n  if (needsForceUpdate) {\n    vm.$slots = resolveSlots(renderChildren, parentVnode.context);\n    vm.$forceUpdate();\n  }\n\n  if (process.env.NODE_ENV !== 'production') {\n    isUpdatingChildComponent = false;\n  }\n}\n\nfunction isInInactiveTree (vm) {\n  while (vm && (vm = vm.$parent)) {\n    if (vm._inactive) { return true }\n  }\n  return false\n}\n\nfunction activateChildComponent (vm, direct) {\n  if (direct) {\n    vm._directInactive = false;\n    if (isInInactiveTree(vm)) {\n      return\n    }\n  } else if (vm._directInactive) {\n    return\n  }\n  if (vm._inactive || vm._inactive === null) {\n    vm._inactive = false;\n    for (var i = 0; i < vm.$children.length; i++) {\n      activateChildComponent(vm.$children[i]);\n    }\n    callHook(vm, 'activated');\n  }\n}\n\nfunction deactivateChildComponent (vm, direct) {\n  if (direct) {\n    vm._directInactive = true;\n    if (isInInactiveTree(vm)) {\n      return\n    }\n  }\n  if (!vm._inactive) {\n    vm._inactive = true;\n    for (var i = 0; i < vm.$children.length; i++) {\n      deactivateChildComponent(vm.$children[i]);\n    }\n    callHook(vm, 'deactivated');\n  }\n}\n\nfunction callHook (vm, hook) {\n  // #7573 disable dep collection when invoking lifecycle hooks\n  pushTarget();\n  var handlers = vm.$options[hook];\n  var info = hook + \" hook\";\n  if (handlers) {\n    for (var i = 0, j = handlers.length; i < j; i++) {\n      invokeWithErrorHandling(handlers[i], vm, null, vm, info);\n    }\n  }\n  if (vm._hasHookEvent) {\n    vm.$emit('hook:' + hook);\n  }\n  popTarget();\n}\n\n/*  */\n\nvar MAX_UPDATE_COUNT = 100;\n\nvar queue = [];\nvar activatedChildren = [];\nvar has = {};\nvar circular = {};\nvar waiting = false;\nvar flushing = false;\nvar index = 0;\n\n/**\n * Reset the scheduler's state.\n */\nfunction resetSchedulerState () {\n  index = queue.length = activatedChildren.length = 0;\n  has = {};\n  if (process.env.NODE_ENV !== 'production') {\n    circular = {};\n  }\n  waiting = flushing = false;\n}\n\n// Async edge case #6566 requires saving the timestamp when event listeners are\n// attached. However, calling performance.now() has a perf overhead especially\n// if the page has thousands of event listeners. Instead, we take a timestamp\n// every time the scheduler flushes and use that for all event listeners\n// attached during that flush.\nvar currentFlushTimestamp = 0;\n\n// Async edge case fix requires storing an event listener's attach timestamp.\nvar getNow = Date.now;\n\n// Determine what event timestamp the browser is using. Annoyingly, the\n// timestamp can either be hi-res (relative to page load) or low-res\n// (relative to UNIX epoch), so in order to compare time we have to use the\n// same timestamp type when saving the flush timestamp.\n// All IE versions use low-res event timestamps, and have problematic clock\n// implementations (#9632)\nif (inBrowser && !isIE) {\n  var performance = window.performance;\n  if (\n    performance &&\n    typeof performance.now === 'function' &&\n    getNow() > document.createEvent('Event').timeStamp\n  ) {\n    // if the event timestamp, although evaluated AFTER the Date.now(), is\n    // smaller than it, it means the event is using a hi-res timestamp,\n    // and we need to use the hi-res version for event listener timestamps as\n    // well.\n    getNow = function () { return performance.now(); };\n  }\n}\n\n/**\n * Flush both queues and run the watchers.\n */\nfunction flushSchedulerQueue () {\n  currentFlushTimestamp = getNow();\n  flushing = true;\n  var watcher, id;\n\n  // Sort queue before flush.\n  // This ensures that:\n  // 1. Components are updated from parent to child. (because parent is always\n  //    created before the child)\n  // 2. A component's user watchers are run before its render watcher (because\n  //    user watchers are created before the render watcher)\n  // 3. If a component is destroyed during a parent component's watcher run,\n  //    its watchers can be skipped.\n  queue.sort(function (a, b) { return a.id - b.id; });\n\n  // do not cache length because more watchers might be pushed\n  // as we run existing watchers\n  for (index = 0; index < queue.length; index++) {\n    watcher = queue[index];\n    if (watcher.before) {\n      watcher.before();\n    }\n    id = watcher.id;\n    has[id] = null;\n    watcher.run();\n    // in dev build, check and stop circular updates.\n    if (process.env.NODE_ENV !== 'production' && has[id] != null) {\n      circular[id] = (circular[id] || 0) + 1;\n      if (circular[id] > MAX_UPDATE_COUNT) {\n        warn(\n          'You may have an infinite update loop ' + (\n            watcher.user\n              ? (\"in watcher with expression \\\"\" + (watcher.expression) + \"\\\"\")\n              : \"in a component render function.\"\n          ),\n          watcher.vm\n        );\n        break\n      }\n    }\n  }\n\n  // keep copies of post queues before resetting state\n  var activatedQueue = activatedChildren.slice();\n  var updatedQueue = queue.slice();\n\n  resetSchedulerState();\n\n  // call component updated and activated hooks\n  callActivatedHooks(activatedQueue);\n  callUpdatedHooks(updatedQueue);\n\n  // devtool hook\n  /* istanbul ignore if */\n  if (devtools && config.devtools) {\n    devtools.emit('flush');\n  }\n}\n\nfunction callUpdatedHooks (queue) {\n  var i = queue.length;\n  while (i--) {\n    var watcher = queue[i];\n    var vm = watcher.vm;\n    if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {\n      callHook(vm, 'updated');\n    }\n  }\n}\n\n/**\n * Queue a kept-alive component that was activated during patch.\n * The queue will be processed after the entire tree has been patched.\n */\nfunction queueActivatedComponent (vm) {\n  // setting _inactive to false here so that a render function can\n  // rely on checking whether it's in an inactive tree (e.g. router-view)\n  vm._inactive = false;\n  activatedChildren.push(vm);\n}\n\nfunction callActivatedHooks (queue) {\n  for (var i = 0; i < queue.length; i++) {\n    queue[i]._inactive = true;\n    activateChildComponent(queue[i], true /* true */);\n  }\n}\n\n/**\n * Push a watcher into the watcher queue.\n * Jobs with duplicate IDs will be skipped unless it's\n * pushed when the queue is being flushed.\n */\nfunction queueWatcher (watcher) {\n  var id = watcher.id;\n  if (has[id] == null) {\n    has[id] = true;\n    if (!flushing) {\n      queue.push(watcher);\n    } else {\n      // if already flushing, splice the watcher based on its id\n      // if already past its id, it will be run next immediately.\n      var i = queue.length - 1;\n      while (i > index && queue[i].id > watcher.id) {\n        i--;\n      }\n      queue.splice(i + 1, 0, watcher);\n    }\n    // queue the flush\n    if (!waiting) {\n      waiting = true;\n\n      if (process.env.NODE_ENV !== 'production' && !config.async) {\n        flushSchedulerQueue();\n        return\n      }\n      nextTick(flushSchedulerQueue);\n    }\n  }\n}\n\n/*  */\n\n\n\nvar uid$2 = 0;\n\n/**\n * A watcher parses an expression, collects dependencies,\n * and fires callback when the expression value changes.\n * This is used for both the $watch() api and directives.\n */\nvar Watcher = function Watcher (\n  vm,\n  expOrFn,\n  cb,\n  options,\n  isRenderWatcher\n) {\n  this.vm = vm;\n  if (isRenderWatcher) {\n    vm._watcher = this;\n  }\n  vm._watchers.push(this);\n  // options\n  if (options) {\n    this.deep = !!options.deep;\n    this.user = !!options.user;\n    this.lazy = !!options.lazy;\n    this.sync = !!options.sync;\n    this.before = options.before;\n  } else {\n    this.deep = this.user = this.lazy = this.sync = false;\n  }\n  this.cb = cb;\n  this.id = ++uid$2; // uid for batching\n  this.active = true;\n  this.dirty = this.lazy; // for lazy watchers\n  this.deps = [];\n  this.newDeps = [];\n  this.depIds = new _Set();\n  this.newDepIds = new _Set();\n  this.expression = process.env.NODE_ENV !== 'production'\n    ? expOrFn.toString()\n    : '';\n  // parse expression for getter\n  if (typeof expOrFn === 'function') {\n    this.getter = expOrFn;\n  } else {\n    this.getter = parsePath(expOrFn);\n    if (!this.getter) {\n      this.getter = noop;\n      process.env.NODE_ENV !== 'production' && warn(\n        \"Failed watching path: \\\"\" + expOrFn + \"\\\" \" +\n        'Watcher only accepts simple dot-delimited paths. ' +\n        'For full control, use a function instead.',\n        vm\n      );\n    }\n  }\n  this.value = this.lazy\n    ? undefined\n    : this.get();\n};\n\n/**\n * Evaluate the getter, and re-collect dependencies.\n */\nWatcher.prototype.get = function get () {\n  pushTarget(this);\n  var value;\n  var vm = this.vm;\n  try {\n    value = this.getter.call(vm, vm);\n  } catch (e) {\n    if (this.user) {\n      handleError(e, vm, (\"getter for watcher \\\"\" + (this.expression) + \"\\\"\"));\n    } else {\n      throw e\n    }\n  } finally {\n    // \"touch\" every property so they are all tracked as\n    // dependencies for deep watching\n    if (this.deep) {\n      traverse(value);\n    }\n    popTarget();\n    this.cleanupDeps();\n  }\n  return value\n};\n\n/**\n * Add a dependency to this directive.\n */\nWatcher.prototype.addDep = function addDep (dep) {\n  var id = dep.id;\n  if (!this.newDepIds.has(id)) {\n    this.newDepIds.add(id);\n    this.newDeps.push(dep);\n    if (!this.depIds.has(id)) {\n      dep.addSub(this);\n    }\n  }\n};\n\n/**\n * Clean up for dependency collection.\n */\nWatcher.prototype.cleanupDeps = function cleanupDeps () {\n  var i = this.deps.length;\n  while (i--) {\n    var dep = this.deps[i];\n    if (!this.newDepIds.has(dep.id)) {\n      dep.removeSub(this);\n    }\n  }\n  var tmp = this.depIds;\n  this.depIds = this.newDepIds;\n  this.newDepIds = tmp;\n  this.newDepIds.clear();\n  tmp = this.deps;\n  this.deps = this.newDeps;\n  this.newDeps = tmp;\n  this.newDeps.length = 0;\n};\n\n/**\n * Subscriber interface.\n * Will be called when a dependency changes.\n */\nWatcher.prototype.update = function update () {\n  /* istanbul ignore else */\n  if (this.lazy) {\n    this.dirty = true;\n  } else if (this.sync) {\n    this.run();\n  } else {\n    queueWatcher(this);\n  }\n};\n\n/**\n * Scheduler job interface.\n * Will be called by the scheduler.\n */\nWatcher.prototype.run = function run () {\n  if (this.active) {\n    var value = this.get();\n    if (\n      value !== this.value ||\n      // Deep watchers and watchers on Object/Arrays should fire even\n      // when the value is the same, because the value may\n      // have mutated.\n      isObject(value) ||\n      this.deep\n    ) {\n      // set new value\n      var oldValue = this.value;\n      this.value = value;\n      if (this.user) {\n        try {\n          this.cb.call(this.vm, value, oldValue);\n        } catch (e) {\n          handleError(e, this.vm, (\"callback for watcher \\\"\" + (this.expression) + \"\\\"\"));\n        }\n      } else {\n        this.cb.call(this.vm, value, oldValue);\n      }\n    }\n  }\n};\n\n/**\n * Evaluate the value of the watcher.\n * This only gets called for lazy watchers.\n */\nWatcher.prototype.evaluate = function evaluate () {\n  this.value = this.get();\n  this.dirty = false;\n};\n\n/**\n * Depend on all deps collected by this watcher.\n */\nWatcher.prototype.depend = function depend () {\n  var i = this.deps.length;\n  while (i--) {\n    this.deps[i].depend();\n  }\n};\n\n/**\n * Remove self from all dependencies' subscriber list.\n */\nWatcher.prototype.teardown = function teardown () {\n  if (this.active) {\n    // remove self from vm's watcher list\n    // this is a somewhat expensive operation so we skip it\n    // if the vm is being destroyed.\n    if (!this.vm._isBeingDestroyed) {\n      remove(this.vm._watchers, this);\n    }\n    var i = this.deps.length;\n    while (i--) {\n      this.deps[i].removeSub(this);\n    }\n    this.active = false;\n  }\n};\n\n/*  */\n\nvar sharedPropertyDefinition = {\n  enumerable: true,\n  configurable: true,\n  get: noop,\n  set: noop\n};\n\nfunction proxy (target, sourceKey, key) {\n  sharedPropertyDefinition.get = function proxyGetter () {\n    return this[sourceKey][key]\n  };\n  sharedPropertyDefinition.set = function proxySetter (val) {\n    this[sourceKey][key] = val;\n  };\n  Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction initState (vm) {\n  vm._watchers = [];\n  var opts = vm.$options;\n  if (opts.props) { initProps(vm, opts.props); }\n  if (opts.methods) { initMethods(vm, opts.methods); }\n  if (opts.data) {\n    initData(vm);\n  } else {\n    observe(vm._data = {}, true /* asRootData */);\n  }\n  if (opts.computed) { initComputed(vm, opts.computed); }\n  if (opts.watch && opts.watch !== nativeWatch) {\n    initWatch(vm, opts.watch);\n  }\n}\n\nfunction initProps (vm, propsOptions) {\n  var propsData = vm.$options.propsData || {};\n  var props = vm._props = {};\n  // cache prop keys so that future props updates can iterate using Array\n  // instead of dynamic object key enumeration.\n  var keys = vm.$options._propKeys = [];\n  var isRoot = !vm.$parent;\n  // root instance props should be converted\n  if (!isRoot) {\n    toggleObserving(false);\n  }\n  var loop = function ( key ) {\n    keys.push(key);\n    var value = validateProp(key, propsOptions, propsData, vm);\n    /* istanbul ignore else */\n    if (process.env.NODE_ENV !== 'production') {\n      var hyphenatedKey = hyphenate(key);\n      if (isReservedAttribute(hyphenatedKey) ||\n          config.isReservedAttr(hyphenatedKey)) {\n        warn(\n          (\"\\\"\" + hyphenatedKey + \"\\\" is a reserved attribute and cannot be used as component prop.\"),\n          vm\n        );\n      }\n      defineReactive$$1(props, key, value, function () {\n        if (!isRoot && !isUpdatingChildComponent) {\n          warn(\n            \"Avoid mutating a prop directly since the value will be \" +\n            \"overwritten whenever the parent component re-renders. \" +\n            \"Instead, use a data or computed property based on the prop's \" +\n            \"value. Prop being mutated: \\\"\" + key + \"\\\"\",\n            vm\n          );\n        }\n      });\n    } else {\n      defineReactive$$1(props, key, value);\n    }\n    // static props are already proxied on the component's prototype\n    // during Vue.extend(). We only need to proxy props defined at\n    // instantiation here.\n    if (!(key in vm)) {\n      proxy(vm, \"_props\", key);\n    }\n  };\n\n  for (var key in propsOptions) loop( key );\n  toggleObserving(true);\n}\n\nfunction initData (vm) {\n  var data = vm.$options.data;\n  data = vm._data = typeof data === 'function'\n    ? getData(data, vm)\n    : data || {};\n  if (!isPlainObject(data)) {\n    data = {};\n    process.env.NODE_ENV !== 'production' && warn(\n      'data functions should return an object:\\n' +\n      'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',\n      vm\n    );\n  }\n  // proxy data on instance\n  var keys = Object.keys(data);\n  var props = vm.$options.props;\n  var methods = vm.$options.methods;\n  var i = keys.length;\n  while (i--) {\n    var key = keys[i];\n    if (process.env.NODE_ENV !== 'production') {\n      if (methods && hasOwn(methods, key)) {\n        warn(\n          (\"Method \\\"\" + key + \"\\\" has already been defined as a data property.\"),\n          vm\n        );\n      }\n    }\n    if (props && hasOwn(props, key)) {\n      process.env.NODE_ENV !== 'production' && warn(\n        \"The data property \\\"\" + key + \"\\\" is already declared as a prop. \" +\n        \"Use prop default value instead.\",\n        vm\n      );\n    } else if (!isReserved(key)) {\n      proxy(vm, \"_data\", key);\n    }\n  }\n  // observe data\n  observe(data, true /* asRootData */);\n}\n\nfunction getData (data, vm) {\n  // #7573 disable dep collection when invoking data getters\n  pushTarget();\n  try {\n    return data.call(vm, vm)\n  } catch (e) {\n    handleError(e, vm, \"data()\");\n    return {}\n  } finally {\n    popTarget();\n  }\n}\n\nvar computedWatcherOptions = { lazy: true };\n\nfunction initComputed (vm, computed) {\n  // $flow-disable-line\n  var watchers = vm._computedWatchers = Object.create(null);\n  // computed properties are just getters during SSR\n  var isSSR = isServerRendering();\n\n  for (var key in computed) {\n    var userDef = computed[key];\n    var getter = typeof userDef === 'function' ? userDef : userDef.get;\n    if (process.env.NODE_ENV !== 'production' && getter == null) {\n      warn(\n        (\"Getter is missing for computed property \\\"\" + key + \"\\\".\"),\n        vm\n      );\n    }\n\n    if (!isSSR) {\n      // create internal watcher for the computed property.\n      watchers[key] = new Watcher(\n        vm,\n        getter || noop,\n        noop,\n        computedWatcherOptions\n      );\n    }\n\n    // component-defined computed properties are already defined on the\n    // component prototype. We only need to define computed properties defined\n    // at instantiation here.\n    if (!(key in vm)) {\n      defineComputed(vm, key, userDef);\n    } else if (process.env.NODE_ENV !== 'production') {\n      if (key in vm.$data) {\n        warn((\"The computed property \\\"\" + key + \"\\\" is already defined in data.\"), vm);\n      } else if (vm.$options.props && key in vm.$options.props) {\n        warn((\"The computed property \\\"\" + key + \"\\\" is already defined as a prop.\"), vm);\n      }\n    }\n  }\n}\n\nfunction defineComputed (\n  target,\n  key,\n  userDef\n) {\n  var shouldCache = !isServerRendering();\n  if (typeof userDef === 'function') {\n    sharedPropertyDefinition.get = shouldCache\n      ? createComputedGetter(key)\n      : createGetterInvoker(userDef);\n    sharedPropertyDefinition.set = noop;\n  } else {\n    sharedPropertyDefinition.get = userDef.get\n      ? shouldCache && userDef.cache !== false\n        ? createComputedGetter(key)\n        : createGetterInvoker(userDef.get)\n      : noop;\n    sharedPropertyDefinition.set = userDef.set || noop;\n  }\n  if (process.env.NODE_ENV !== 'production' &&\n      sharedPropertyDefinition.set === noop) {\n    sharedPropertyDefinition.set = function () {\n      warn(\n        (\"Computed property \\\"\" + key + \"\\\" was assigned to but it has no setter.\"),\n        this\n      );\n    };\n  }\n  Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction createComputedGetter (key) {\n  return function computedGetter () {\n    var watcher = this._computedWatchers && this._computedWatchers[key];\n    if (watcher) {\n      if (watcher.dirty) {\n        watcher.evaluate();\n      }\n      if (Dep.target) {\n        watcher.depend();\n      }\n      return watcher.value\n    }\n  }\n}\n\nfunction createGetterInvoker(fn) {\n  return function computedGetter () {\n    return fn.call(this, this)\n  }\n}\n\nfunction initMethods (vm, methods) {\n  var props = vm.$options.props;\n  for (var key in methods) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (typeof methods[key] !== 'function') {\n        warn(\n          \"Method \\\"\" + key + \"\\\" has type \\\"\" + (typeof methods[key]) + \"\\\" in the component definition. \" +\n          \"Did you reference the function correctly?\",\n          vm\n        );\n      }\n      if (props && hasOwn(props, key)) {\n        warn(\n          (\"Method \\\"\" + key + \"\\\" has already been defined as a prop.\"),\n          vm\n        );\n      }\n      if ((key in vm) && isReserved(key)) {\n        warn(\n          \"Method \\\"\" + key + \"\\\" conflicts with an existing Vue instance method. \" +\n          \"Avoid defining component methods that start with _ or $.\"\n        );\n      }\n    }\n    vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);\n  }\n}\n\nfunction initWatch (vm, watch) {\n  for (var key in watch) {\n    var handler = watch[key];\n    if (Array.isArray(handler)) {\n      for (var i = 0; i < handler.length; i++) {\n        createWatcher(vm, key, handler[i]);\n      }\n    } else {\n      createWatcher(vm, key, handler);\n    }\n  }\n}\n\nfunction createWatcher (\n  vm,\n  expOrFn,\n  handler,\n  options\n) {\n  if (isPlainObject(handler)) {\n    options = handler;\n    handler = handler.handler;\n  }\n  if (typeof handler === 'string') {\n    handler = vm[handler];\n  }\n  return vm.$watch(expOrFn, handler, options)\n}\n\nfunction stateMixin (Vue) {\n  // flow somehow has problems with directly declared definition object\n  // when using Object.defineProperty, so we have to procedurally build up\n  // the object here.\n  var dataDef = {};\n  dataDef.get = function () { return this._data };\n  var propsDef = {};\n  propsDef.get = function () { return this._props };\n  if (process.env.NODE_ENV !== 'production') {\n    dataDef.set = function () {\n      warn(\n        'Avoid replacing instance root $data. ' +\n        'Use nested data properties instead.',\n        this\n      );\n    };\n    propsDef.set = function () {\n      warn(\"$props is readonly.\", this);\n    };\n  }\n  Object.defineProperty(Vue.prototype, '$data', dataDef);\n  Object.defineProperty(Vue.prototype, '$props', propsDef);\n\n  Vue.prototype.$set = set;\n  Vue.prototype.$delete = del;\n\n  Vue.prototype.$watch = function (\n    expOrFn,\n    cb,\n    options\n  ) {\n    var vm = this;\n    if (isPlainObject(cb)) {\n      return createWatcher(vm, expOrFn, cb, options)\n    }\n    options = options || {};\n    options.user = true;\n    var watcher = new Watcher(vm, expOrFn, cb, options);\n    if (options.immediate) {\n      try {\n        cb.call(vm, watcher.value);\n      } catch (error) {\n        handleError(error, vm, (\"callback for immediate watcher \\\"\" + (watcher.expression) + \"\\\"\"));\n      }\n    }\n    return function unwatchFn () {\n      watcher.teardown();\n    }\n  };\n}\n\n/*  */\n\nvar uid$3 = 0;\n\nfunction initMixin (Vue) {\n  Vue.prototype._init = function (options) {\n    var vm = this;\n    // a uid\n    vm._uid = uid$3++;\n\n    var startTag, endTag;\n    /* istanbul ignore if */\n    if (process.env.NODE_ENV !== 'production' && config.performance && mark) {\n      startTag = \"vue-perf-start:\" + (vm._uid);\n      endTag = \"vue-perf-end:\" + (vm._uid);\n      mark(startTag);\n    }\n\n    // a flag to avoid this being observed\n    vm._isVue = true;\n    // merge options\n    if (options && options._isComponent) {\n      // optimize internal component instantiation\n      // since dynamic options merging is pretty slow, and none of the\n      // internal component options needs special treatment.\n      initInternalComponent(vm, options);\n    } else {\n      vm.$options = mergeOptions(\n        resolveConstructorOptions(vm.constructor),\n        options || {},\n        vm\n      );\n    }\n    /* istanbul ignore else */\n    if (process.env.NODE_ENV !== 'production') {\n      initProxy(vm);\n    } else {\n      vm._renderProxy = vm;\n    }\n    // expose real self\n    vm._self = vm;\n    initLifecycle(vm);\n    initEvents(vm);\n    initRender(vm);\n    callHook(vm, 'beforeCreate');\n    initInjections(vm); // resolve injections before data/props\n    initState(vm);\n    initProvide(vm); // resolve provide after data/props\n    callHook(vm, 'created');\n\n    /* istanbul ignore if */\n    if (process.env.NODE_ENV !== 'production' && config.performance && mark) {\n      vm._name = formatComponentName(vm, false);\n      mark(endTag);\n      measure((\"vue \" + (vm._name) + \" init\"), startTag, endTag);\n    }\n\n    if (vm.$options.el) {\n      vm.$mount(vm.$options.el);\n    }\n  };\n}\n\nfunction initInternalComponent (vm, options) {\n  var opts = vm.$options = Object.create(vm.constructor.options);\n  // doing this because it's faster than dynamic enumeration.\n  var parentVnode = options._parentVnode;\n  opts.parent = options.parent;\n  opts._parentVnode = parentVnode;\n\n  var vnodeComponentOptions = parentVnode.componentOptions;\n  opts.propsData = vnodeComponentOptions.propsData;\n  opts._parentListeners = vnodeComponentOptions.listeners;\n  opts._renderChildren = vnodeComponentOptions.children;\n  opts._componentTag = vnodeComponentOptions.tag;\n\n  if (options.render) {\n    opts.render = options.render;\n    opts.staticRenderFns = options.staticRenderFns;\n  }\n}\n\nfunction resolveConstructorOptions (Ctor) {\n  var options = Ctor.options;\n  if (Ctor.super) {\n    var superOptions = resolveConstructorOptions(Ctor.super);\n    var cachedSuperOptions = Ctor.superOptions;\n    if (superOptions !== cachedSuperOptions) {\n      // super option changed,\n      // need to resolve new options.\n      Ctor.superOptions = superOptions;\n      // check if there are any late-modified/attached options (#4976)\n      var modifiedOptions = resolveModifiedOptions(Ctor);\n      // update base extend options\n      if (modifiedOptions) {\n        extend(Ctor.extendOptions, modifiedOptions);\n      }\n      options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);\n      if (options.name) {\n        options.components[options.name] = Ctor;\n      }\n    }\n  }\n  return options\n}\n\nfunction resolveModifiedOptions (Ctor) {\n  var modified;\n  var latest = Ctor.options;\n  var sealed = Ctor.sealedOptions;\n  for (var key in latest) {\n    if (latest[key] !== sealed[key]) {\n      if (!modified) { modified = {}; }\n      modified[key] = latest[key];\n    }\n  }\n  return modified\n}\n\nfunction Vue (options) {\n  if (process.env.NODE_ENV !== 'production' &&\n    !(this instanceof Vue)\n  ) {\n    warn('Vue is a constructor and should be called with the `new` keyword');\n  }\n  this._init(options);\n}\n\ninitMixin(Vue);\nstateMixin(Vue);\neventsMixin(Vue);\nlifecycleMixin(Vue);\nrenderMixin(Vue);\n\n/*  */\n\nfunction initUse (Vue) {\n  Vue.use = function (plugin) {\n    var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));\n    if (installedPlugins.indexOf(plugin) > -1) {\n      return this\n    }\n\n    // additional parameters\n    var args = toArray(arguments, 1);\n    args.unshift(this);\n    if (typeof plugin.install === 'function') {\n      plugin.install.apply(plugin, args);\n    } else if (typeof plugin === 'function') {\n      plugin.apply(null, args);\n    }\n    installedPlugins.push(plugin);\n    return this\n  };\n}\n\n/*  */\n\nfunction initMixin$1 (Vue) {\n  Vue.mixin = function (mixin) {\n    this.options = mergeOptions(this.options, mixin);\n    return this\n  };\n}\n\n/*  */\n\nfunction initExtend (Vue) {\n  /**\n   * Each instance constructor, including Vue, has a unique\n   * cid. This enables us to create wrapped \"child\n   * constructors\" for prototypal inheritance and cache them.\n   */\n  Vue.cid = 0;\n  var cid = 1;\n\n  /**\n   * Class inheritance\n   */\n  Vue.extend = function (extendOptions) {\n    extendOptions = extendOptions || {};\n    var Super = this;\n    var SuperId = Super.cid;\n    var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});\n    if (cachedCtors[SuperId]) {\n      return cachedCtors[SuperId]\n    }\n\n    var name = extendOptions.name || Super.options.name;\n    if (process.env.NODE_ENV !== 'production' && name) {\n      validateComponentName(name);\n    }\n\n    var Sub = function VueComponent (options) {\n      this._init(options);\n    };\n    Sub.prototype = Object.create(Super.prototype);\n    Sub.prototype.constructor = Sub;\n    Sub.cid = cid++;\n    Sub.options = mergeOptions(\n      Super.options,\n      extendOptions\n    );\n    Sub['super'] = Super;\n\n    // For props and computed properties, we define the proxy getters on\n    // the Vue instances at extension time, on the extended prototype. This\n    // avoids Object.defineProperty calls for each instance created.\n    if (Sub.options.props) {\n      initProps$1(Sub);\n    }\n    if (Sub.options.computed) {\n      initComputed$1(Sub);\n    }\n\n    // allow further extension/mixin/plugin usage\n    Sub.extend = Super.extend;\n    Sub.mixin = Super.mixin;\n    Sub.use = Super.use;\n\n    // create asset registers, so extended classes\n    // can have their private assets too.\n    ASSET_TYPES.forEach(function (type) {\n      Sub[type] = Super[type];\n    });\n    // enable recursive self-lookup\n    if (name) {\n      Sub.options.components[name] = Sub;\n    }\n\n    // keep a reference to the super options at extension time.\n    // later at instantiation we can check if Super's options have\n    // been updated.\n    Sub.superOptions = Super.options;\n    Sub.extendOptions = extendOptions;\n    Sub.sealedOptions = extend({}, Sub.options);\n\n    // cache constructor\n    cachedCtors[SuperId] = Sub;\n    return Sub\n  };\n}\n\nfunction initProps$1 (Comp) {\n  var props = Comp.options.props;\n  for (var key in props) {\n    proxy(Comp.prototype, \"_props\", key);\n  }\n}\n\nfunction initComputed$1 (Comp) {\n  var computed = Comp.options.computed;\n  for (var key in computed) {\n    defineComputed(Comp.prototype, key, computed[key]);\n  }\n}\n\n/*  */\n\nfunction initAssetRegisters (Vue) {\n  /**\n   * Create asset registration methods.\n   */\n  ASSET_TYPES.forEach(function (type) {\n    Vue[type] = function (\n      id,\n      definition\n    ) {\n      if (!definition) {\n        return this.options[type + 's'][id]\n      } else {\n        /* istanbul ignore if */\n        if (process.env.NODE_ENV !== 'production' && type === 'component') {\n          validateComponentName(id);\n        }\n        if (type === 'component' && isPlainObject(definition)) {\n          definition.name = definition.name || id;\n          definition = this.options._base.extend(definition);\n        }\n        if (type === 'directive' && typeof definition === 'function') {\n          definition = { bind: definition, update: definition };\n        }\n        this.options[type + 's'][id] = definition;\n        return definition\n      }\n    };\n  });\n}\n\n/*  */\n\n\n\nfunction getComponentName (opts) {\n  return opts && (opts.Ctor.options.name || opts.tag)\n}\n\nfunction matches (pattern, name) {\n  if (Array.isArray(pattern)) {\n    return pattern.indexOf(name) > -1\n  } else if (typeof pattern === 'string') {\n    return pattern.split(',').indexOf(name) > -1\n  } else if (isRegExp(pattern)) {\n    return pattern.test(name)\n  }\n  /* istanbul ignore next */\n  return false\n}\n\nfunction pruneCache (keepAliveInstance, filter) {\n  var cache = keepAliveInstance.cache;\n  var keys = keepAliveInstance.keys;\n  var _vnode = keepAliveInstance._vnode;\n  for (var key in cache) {\n    var cachedNode = cache[key];\n    if (cachedNode) {\n      var name = getComponentName(cachedNode.componentOptions);\n      if (name && !filter(name)) {\n        pruneCacheEntry(cache, key, keys, _vnode);\n      }\n    }\n  }\n}\n\nfunction pruneCacheEntry (\n  cache,\n  key,\n  keys,\n  current\n) {\n  var cached$$1 = cache[key];\n  if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {\n    cached$$1.componentInstance.$destroy();\n  }\n  cache[key] = null;\n  remove(keys, key);\n}\n\nvar patternTypes = [String, RegExp, Array];\n\nvar KeepAlive = {\n  name: 'keep-alive',\n  abstract: true,\n\n  props: {\n    include: patternTypes,\n    exclude: patternTypes,\n    max: [String, Number]\n  },\n\n  created: function created () {\n    this.cache = Object.create(null);\n    this.keys = [];\n  },\n\n  destroyed: function destroyed () {\n    for (var key in this.cache) {\n      pruneCacheEntry(this.cache, key, this.keys);\n    }\n  },\n\n  mounted: function mounted () {\n    var this$1 = this;\n\n    this.$watch('include', function (val) {\n      pruneCache(this$1, function (name) { return matches(val, name); });\n    });\n    this.$watch('exclude', function (val) {\n      pruneCache(this$1, function (name) { return !matches(val, name); });\n    });\n  },\n\n  render: function render () {\n    var slot = this.$slots.default;\n    var vnode = getFirstComponentChild(slot);\n    var componentOptions = vnode && vnode.componentOptions;\n    if (componentOptions) {\n      // check pattern\n      var name = getComponentName(componentOptions);\n      var ref = this;\n      var include = ref.include;\n      var exclude = ref.exclude;\n      if (\n        // not included\n        (include && (!name || !matches(include, name))) ||\n        // excluded\n        (exclude && name && matches(exclude, name))\n      ) {\n        return vnode\n      }\n\n      var ref$1 = this;\n      var cache = ref$1.cache;\n      var keys = ref$1.keys;\n      var key = vnode.key == null\n        // same constructor may get registered as different local components\n        // so cid alone is not enough (#3269)\n        ? componentOptions.Ctor.cid + (componentOptions.tag ? (\"::\" + (componentOptions.tag)) : '')\n        : vnode.key;\n      if (cache[key]) {\n        vnode.componentInstance = cache[key].componentInstance;\n        // make current key freshest\n        remove(keys, key);\n        keys.push(key);\n      } else {\n        cache[key] = vnode;\n        keys.push(key);\n        // prune oldest entry\n        if (this.max && keys.length > parseInt(this.max)) {\n          pruneCacheEntry(cache, keys[0], keys, this._vnode);\n        }\n      }\n\n      vnode.data.keepAlive = true;\n    }\n    return vnode || (slot && slot[0])\n  }\n};\n\nvar builtInComponents = {\n  KeepAlive: KeepAlive\n};\n\n/*  */\n\nfunction initGlobalAPI (Vue) {\n  // config\n  var configDef = {};\n  configDef.get = function () { return config; };\n  if (process.env.NODE_ENV !== 'production') {\n    configDef.set = function () {\n      warn(\n        'Do not replace the Vue.config object, set individual fields instead.'\n      );\n    };\n  }\n  Object.defineProperty(Vue, 'config', configDef);\n\n  // exposed util methods.\n  // NOTE: these are not considered part of the public API - avoid relying on\n  // them unless you are aware of the risk.\n  Vue.util = {\n    warn: warn,\n    extend: extend,\n    mergeOptions: mergeOptions,\n    defineReactive: defineReactive$$1\n  };\n\n  Vue.set = set;\n  Vue.delete = del;\n  Vue.nextTick = nextTick;\n\n  // 2.6 explicit observable API\n  Vue.observable = function (obj) {\n    observe(obj);\n    return obj\n  };\n\n  Vue.options = Object.create(null);\n  ASSET_TYPES.forEach(function (type) {\n    Vue.options[type + 's'] = Object.create(null);\n  });\n\n  // this is used to identify the \"base\" constructor to extend all plain-object\n  // components with in Weex's multi-instance scenarios.\n  Vue.options._base = Vue;\n\n  extend(Vue.options.components, builtInComponents);\n\n  initUse(Vue);\n  initMixin$1(Vue);\n  initExtend(Vue);\n  initAssetRegisters(Vue);\n}\n\ninitGlobalAPI(Vue);\n\nObject.defineProperty(Vue.prototype, '$isServer', {\n  get: isServerRendering\n});\n\nObject.defineProperty(Vue.prototype, '$ssrContext', {\n  get: function get () {\n    /* istanbul ignore next */\n    return this.$vnode && this.$vnode.ssrContext\n  }\n});\n\n// expose FunctionalRenderContext for ssr runtime helper installation\nObject.defineProperty(Vue, 'FunctionalRenderContext', {\n  value: FunctionalRenderContext\n});\n\nVue.version = '2.6.11';\n\n/*  */\n\n// these are reserved for web because they are directly compiled away\n// during template compilation\nvar isReservedAttr = makeMap('style,class');\n\n// attributes that should be using props for binding\nvar acceptValue = makeMap('input,textarea,option,select,progress');\nvar mustUseProp = function (tag, type, attr) {\n  return (\n    (attr === 'value' && acceptValue(tag)) && type !== 'button' ||\n    (attr === 'selected' && tag === 'option') ||\n    (attr === 'checked' && tag === 'input') ||\n    (attr === 'muted' && tag === 'video')\n  )\n};\n\nvar isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');\n\nvar isValidContentEditableValue = makeMap('events,caret,typing,plaintext-only');\n\nvar convertEnumeratedValue = function (key, value) {\n  return isFalsyAttrValue(value) || value === 'false'\n    ? 'false'\n    // allow arbitrary string value for contenteditable\n    : key === 'contenteditable' && isValidContentEditableValue(value)\n      ? value\n      : 'true'\n};\n\nvar isBooleanAttr = makeMap(\n  'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +\n  'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +\n  'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +\n  'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +\n  'required,reversed,scoped,seamless,selected,sortable,translate,' +\n  'truespeed,typemustmatch,visible'\n);\n\nvar xlinkNS = 'http://www.w3.org/1999/xlink';\n\nvar isXlink = function (name) {\n  return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'\n};\n\nvar getXlinkProp = function (name) {\n  return isXlink(name) ? name.slice(6, name.length) : ''\n};\n\nvar isFalsyAttrValue = function (val) {\n  return val == null || val === false\n};\n\n/*  */\n\nfunction genClassForVnode (vnode) {\n  var data = vnode.data;\n  var parentNode = vnode;\n  var childNode = vnode;\n  while (isDef(childNode.componentInstance)) {\n    childNode = childNode.componentInstance._vnode;\n    if (childNode && childNode.data) {\n      data = mergeClassData(childNode.data, data);\n    }\n  }\n  while (isDef(parentNode = parentNode.parent)) {\n    if (parentNode && parentNode.data) {\n      data = mergeClassData(data, parentNode.data);\n    }\n  }\n  return renderClass(data.staticClass, data.class)\n}\n\nfunction mergeClassData (child, parent) {\n  return {\n    staticClass: concat(child.staticClass, parent.staticClass),\n    class: isDef(child.class)\n      ? [child.class, parent.class]\n      : parent.class\n  }\n}\n\nfunction renderClass (\n  staticClass,\n  dynamicClass\n) {\n  if (isDef(staticClass) || isDef(dynamicClass)) {\n    return concat(staticClass, stringifyClass(dynamicClass))\n  }\n  /* istanbul ignore next */\n  return ''\n}\n\nfunction concat (a, b) {\n  return a ? b ? (a + ' ' + b) : a : (b || '')\n}\n\nfunction stringifyClass (value) {\n  if (Array.isArray(value)) {\n    return stringifyArray(value)\n  }\n  if (isObject(value)) {\n    return stringifyObject(value)\n  }\n  if (typeof value === 'string') {\n    return value\n  }\n  /* istanbul ignore next */\n  return ''\n}\n\nfunction stringifyArray (value) {\n  var res = '';\n  var stringified;\n  for (var i = 0, l = value.length; i < l; i++) {\n    if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {\n      if (res) { res += ' '; }\n      res += stringified;\n    }\n  }\n  return res\n}\n\nfunction stringifyObject (value) {\n  var res = '';\n  for (var key in value) {\n    if (value[key]) {\n      if (res) { res += ' '; }\n      res += key;\n    }\n  }\n  return res\n}\n\n/*  */\n\nvar namespaceMap = {\n  svg: 'http://www.w3.org/2000/svg',\n  math: 'http://www.w3.org/1998/Math/MathML'\n};\n\nvar isHTMLTag = makeMap(\n  'html,body,base,head,link,meta,style,title,' +\n  'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +\n  'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +\n  'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +\n  's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +\n  'embed,object,param,source,canvas,script,noscript,del,ins,' +\n  'caption,col,colgroup,table,thead,tbody,td,th,tr,' +\n  'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +\n  'output,progress,select,textarea,' +\n  'details,dialog,menu,menuitem,summary,' +\n  'content,element,shadow,template,blockquote,iframe,tfoot'\n);\n\n// this map is intentionally selective, only covering SVG elements that may\n// contain child elements.\nvar isSVG = makeMap(\n  'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +\n  'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +\n  'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',\n  true\n);\n\nvar isPreTag = function (tag) { return tag === 'pre'; };\n\nvar isReservedTag = function (tag) {\n  return isHTMLTag(tag) || isSVG(tag)\n};\n\nfunction getTagNamespace (tag) {\n  if (isSVG(tag)) {\n    return 'svg'\n  }\n  // basic support for MathML\n  // note it doesn't support other MathML elements being component roots\n  if (tag === 'math') {\n    return 'math'\n  }\n}\n\nvar unknownElementCache = Object.create(null);\nfunction isUnknownElement (tag) {\n  /* istanbul ignore if */\n  if (!inBrowser) {\n    return true\n  }\n  if (isReservedTag(tag)) {\n    return false\n  }\n  tag = tag.toLowerCase();\n  /* istanbul ignore if */\n  if (unknownElementCache[tag] != null) {\n    return unknownElementCache[tag]\n  }\n  var el = document.createElement(tag);\n  if (tag.indexOf('-') > -1) {\n    // http://stackoverflow.com/a/28210364/1070244\n    return (unknownElementCache[tag] = (\n      el.constructor === window.HTMLUnknownElement ||\n      el.constructor === window.HTMLElement\n    ))\n  } else {\n    return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))\n  }\n}\n\nvar isTextInputType = makeMap('text,number,password,search,email,tel,url');\n\n/*  */\n\n/**\n * Query an element selector if it's not an element already.\n */\nfunction query (el) {\n  if (typeof el === 'string') {\n    var selected = document.querySelector(el);\n    if (!selected) {\n      process.env.NODE_ENV !== 'production' && warn(\n        'Cannot find element: ' + el\n      );\n      return document.createElement('div')\n    }\n    return selected\n  } else {\n    return el\n  }\n}\n\n/*  */\n\nfunction createElement$1 (tagName, vnode) {\n  var elm = document.createElement(tagName);\n  if (tagName !== 'select') {\n    return elm\n  }\n  // false or null will remove the attribute but undefined will not\n  if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) {\n    elm.setAttribute('multiple', 'multiple');\n  }\n  return elm\n}\n\nfunction createElementNS (namespace, tagName) {\n  return document.createElementNS(namespaceMap[namespace], tagName)\n}\n\nfunction createTextNode (text) {\n  return document.createTextNode(text)\n}\n\nfunction createComment (text) {\n  return document.createComment(text)\n}\n\nfunction insertBefore (parentNode, newNode, referenceNode) {\n  parentNode.insertBefore(newNode, referenceNode);\n}\n\nfunction removeChild (node, child) {\n  node.removeChild(child);\n}\n\nfunction appendChild (node, child) {\n  node.appendChild(child);\n}\n\nfunction parentNode (node) {\n  return node.parentNode\n}\n\nfunction nextSibling (node) {\n  return node.nextSibling\n}\n\nfunction tagName (node) {\n  return node.tagName\n}\n\nfunction setTextContent (node, text) {\n  node.textContent = text;\n}\n\nfunction setStyleScope (node, scopeId) {\n  node.setAttribute(scopeId, '');\n}\n\nvar nodeOps = /*#__PURE__*/Object.freeze({\n  createElement: createElement$1,\n  createElementNS: createElementNS,\n  createTextNode: createTextNode,\n  createComment: createComment,\n  insertBefore: insertBefore,\n  removeChild: removeChild,\n  appendChild: appendChild,\n  parentNode: parentNode,\n  nextSibling: nextSibling,\n  tagName: tagName,\n  setTextContent: setTextContent,\n  setStyleScope: setStyleScope\n});\n\n/*  */\n\nvar ref = {\n  create: function create (_, vnode) {\n    registerRef(vnode);\n  },\n  update: function update (oldVnode, vnode) {\n    if (oldVnode.data.ref !== vnode.data.ref) {\n      registerRef(oldVnode, true);\n      registerRef(vnode);\n    }\n  },\n  destroy: function destroy (vnode) {\n    registerRef(vnode, true);\n  }\n};\n\nfunction registerRef (vnode, isRemoval) {\n  var key = vnode.data.ref;\n  if (!isDef(key)) { return }\n\n  var vm = vnode.context;\n  var ref = vnode.componentInstance || vnode.elm;\n  var refs = vm.$refs;\n  if (isRemoval) {\n    if (Array.isArray(refs[key])) {\n      remove(refs[key], ref);\n    } else if (refs[key] === ref) {\n      refs[key] = undefined;\n    }\n  } else {\n    if (vnode.data.refInFor) {\n      if (!Array.isArray(refs[key])) {\n        refs[key] = [ref];\n      } else if (refs[key].indexOf(ref) < 0) {\n        // $flow-disable-line\n        refs[key].push(ref);\n      }\n    } else {\n      refs[key] = ref;\n    }\n  }\n}\n\n/**\n * Virtual DOM patching algorithm based on Snabbdom by\n * Simon Friis Vindum (@paldepind)\n * Licensed under the MIT License\n * https://github.com/paldepind/snabbdom/blob/master/LICENSE\n *\n * modified by Evan You (@yyx990803)\n *\n * Not type-checking this because this file is perf-critical and the cost\n * of making flow understand it is not worth it.\n */\n\nvar emptyNode = new VNode('', {}, []);\n\nvar hooks = ['create', 'activate', 'update', 'remove', 'destroy'];\n\nfunction sameVnode (a, b) {\n  return (\n    a.key === b.key && (\n      (\n        a.tag === b.tag &&\n        a.isComment === b.isComment &&\n        isDef(a.data) === isDef(b.data) &&\n        sameInputType(a, b)\n      ) || (\n        isTrue(a.isAsyncPlaceholder) &&\n        a.asyncFactory === b.asyncFactory &&\n        isUndef(b.asyncFactory.error)\n      )\n    )\n  )\n}\n\nfunction sameInputType (a, b) {\n  if (a.tag !== 'input') { return true }\n  var i;\n  var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;\n  var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;\n  return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)\n}\n\nfunction createKeyToOldIdx (children, beginIdx, endIdx) {\n  var i, key;\n  var map = {};\n  for (i = beginIdx; i <= endIdx; ++i) {\n    key = children[i].key;\n    if (isDef(key)) { map[key] = i; }\n  }\n  return map\n}\n\nfunction createPatchFunction (backend) {\n  var i, j;\n  var cbs = {};\n\n  var modules = backend.modules;\n  var nodeOps = backend.nodeOps;\n\n  for (i = 0; i < hooks.length; ++i) {\n    cbs[hooks[i]] = [];\n    for (j = 0; j < modules.length; ++j) {\n      if (isDef(modules[j][hooks[i]])) {\n        cbs[hooks[i]].push(modules[j][hooks[i]]);\n      }\n    }\n  }\n\n  function emptyNodeAt (elm) {\n    return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)\n  }\n\n  function createRmCb (childElm, listeners) {\n    function remove$$1 () {\n      if (--remove$$1.listeners === 0) {\n        removeNode(childElm);\n      }\n    }\n    remove$$1.listeners = listeners;\n    return remove$$1\n  }\n\n  function removeNode (el) {\n    var parent = nodeOps.parentNode(el);\n    // element may have already been removed due to v-html / v-text\n    if (isDef(parent)) {\n      nodeOps.removeChild(parent, el);\n    }\n  }\n\n  function isUnknownElement$$1 (vnode, inVPre) {\n    return (\n      !inVPre &&\n      !vnode.ns &&\n      !(\n        config.ignoredElements.length &&\n        config.ignoredElements.some(function (ignore) {\n          return isRegExp(ignore)\n            ? ignore.test(vnode.tag)\n            : ignore === vnode.tag\n        })\n      ) &&\n      config.isUnknownElement(vnode.tag)\n    )\n  }\n\n  var creatingElmInVPre = 0;\n\n  function createElm (\n    vnode,\n    insertedVnodeQueue,\n    parentElm,\n    refElm,\n    nested,\n    ownerArray,\n    index\n  ) {\n    if (isDef(vnode.elm) && isDef(ownerArray)) {\n      // This vnode was used in a previous render!\n      // now it's used as a new node, overwriting its elm would cause\n      // potential patch errors down the road when it's used as an insertion\n      // reference node. Instead, we clone the node on-demand before creating\n      // associated DOM element for it.\n      vnode = ownerArray[index] = cloneVNode(vnode);\n    }\n\n    vnode.isRootInsert = !nested; // for transition enter check\n    if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {\n      return\n    }\n\n    var data = vnode.data;\n    var children = vnode.children;\n    var tag = vnode.tag;\n    if (isDef(tag)) {\n      if (process.env.NODE_ENV !== 'production') {\n        if (data && data.pre) {\n          creatingElmInVPre++;\n        }\n        if (isUnknownElement$$1(vnode, creatingElmInVPre)) {\n          warn(\n            'Unknown custom element: <' + tag + '> - did you ' +\n            'register the component correctly? For recursive components, ' +\n            'make sure to provide the \"name\" option.',\n            vnode.context\n          );\n        }\n      }\n\n      vnode.elm = vnode.ns\n        ? nodeOps.createElementNS(vnode.ns, tag)\n        : nodeOps.createElement(tag, vnode);\n      setScope(vnode);\n\n      /* istanbul ignore if */\n      {\n        createChildren(vnode, children, insertedVnodeQueue);\n        if (isDef(data)) {\n          invokeCreateHooks(vnode, insertedVnodeQueue);\n        }\n        insert(parentElm, vnode.elm, refElm);\n      }\n\n      if (process.env.NODE_ENV !== 'production' && data && data.pre) {\n        creatingElmInVPre--;\n      }\n    } else if (isTrue(vnode.isComment)) {\n      vnode.elm = nodeOps.createComment(vnode.text);\n      insert(parentElm, vnode.elm, refElm);\n    } else {\n      vnode.elm = nodeOps.createTextNode(vnode.text);\n      insert(parentElm, vnode.elm, refElm);\n    }\n  }\n\n  function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n    var i = vnode.data;\n    if (isDef(i)) {\n      var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;\n      if (isDef(i = i.hook) && isDef(i = i.init)) {\n        i(vnode, false /* hydrating */);\n      }\n      // after calling the init hook, if the vnode is a child component\n      // it should've created a child instance and mounted it. the child\n      // component also has set the placeholder vnode's elm.\n      // in that case we can just return the element and be done.\n      if (isDef(vnode.componentInstance)) {\n        initComponent(vnode, insertedVnodeQueue);\n        insert(parentElm, vnode.elm, refElm);\n        if (isTrue(isReactivated)) {\n          reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);\n        }\n        return true\n      }\n    }\n  }\n\n  function initComponent (vnode, insertedVnodeQueue) {\n    if (isDef(vnode.data.pendingInsert)) {\n      insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);\n      vnode.data.pendingInsert = null;\n    }\n    vnode.elm = vnode.componentInstance.$el;\n    if (isPatchable(vnode)) {\n      invokeCreateHooks(vnode, insertedVnodeQueue);\n      setScope(vnode);\n    } else {\n      // empty component root.\n      // skip all element-related modules except for ref (#3455)\n      registerRef(vnode);\n      // make sure to invoke the insert hook\n      insertedVnodeQueue.push(vnode);\n    }\n  }\n\n  function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n    var i;\n    // hack for #4339: a reactivated component with inner transition\n    // does not trigger because the inner node's created hooks are not called\n    // again. It's not ideal to involve module-specific logic in here but\n    // there doesn't seem to be a better way to do it.\n    var innerNode = vnode;\n    while (innerNode.componentInstance) {\n      innerNode = innerNode.componentInstance._vnode;\n      if (isDef(i = innerNode.data) && isDef(i = i.transition)) {\n        for (i = 0; i < cbs.activate.length; ++i) {\n          cbs.activate[i](emptyNode, innerNode);\n        }\n        insertedVnodeQueue.push(innerNode);\n        break\n      }\n    }\n    // unlike a newly created component,\n    // a reactivated keep-alive component doesn't insert itself\n    insert(parentElm, vnode.elm, refElm);\n  }\n\n  function insert (parent, elm, ref$$1) {\n    if (isDef(parent)) {\n      if (isDef(ref$$1)) {\n        if (nodeOps.parentNode(ref$$1) === parent) {\n          nodeOps.insertBefore(parent, elm, ref$$1);\n        }\n      } else {\n        nodeOps.appendChild(parent, elm);\n      }\n    }\n  }\n\n  function createChildren (vnode, children, insertedVnodeQueue) {\n    if (Array.isArray(children)) {\n      if (process.env.NODE_ENV !== 'production') {\n        checkDuplicateKeys(children);\n      }\n      for (var i = 0; i < children.length; ++i) {\n        createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i);\n      }\n    } else if (isPrimitive(vnode.text)) {\n      nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)));\n    }\n  }\n\n  function isPatchable (vnode) {\n    while (vnode.componentInstance) {\n      vnode = vnode.componentInstance._vnode;\n    }\n    return isDef(vnode.tag)\n  }\n\n  function invokeCreateHooks (vnode, insertedVnodeQueue) {\n    for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n      cbs.create[i$1](emptyNode, vnode);\n    }\n    i = vnode.data.hook; // Reuse variable\n    if (isDef(i)) {\n      if (isDef(i.create)) { i.create(emptyNode, vnode); }\n      if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); }\n    }\n  }\n\n  // set scope id attribute for scoped CSS.\n  // this is implemented as a special case to avoid the overhead\n  // of going through the normal attribute patching process.\n  function setScope (vnode) {\n    var i;\n    if (isDef(i = vnode.fnScopeId)) {\n      nodeOps.setStyleScope(vnode.elm, i);\n    } else {\n      var ancestor = vnode;\n      while (ancestor) {\n        if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {\n          nodeOps.setStyleScope(vnode.elm, i);\n        }\n        ancestor = ancestor.parent;\n      }\n    }\n    // for slot content they should also get the scopeId from the host instance.\n    if (isDef(i = activeInstance) &&\n      i !== vnode.context &&\n      i !== vnode.fnContext &&\n      isDef(i = i.$options._scopeId)\n    ) {\n      nodeOps.setStyleScope(vnode.elm, i);\n    }\n  }\n\n  function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {\n    for (; startIdx <= endIdx; ++startIdx) {\n      createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm, false, vnodes, startIdx);\n    }\n  }\n\n  function invokeDestroyHook (vnode) {\n    var i, j;\n    var data = vnode.data;\n    if (isDef(data)) {\n      if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }\n      for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }\n    }\n    if (isDef(i = vnode.children)) {\n      for (j = 0; j < vnode.children.length; ++j) {\n        invokeDestroyHook(vnode.children[j]);\n      }\n    }\n  }\n\n  function removeVnodes (vnodes, startIdx, endIdx) {\n    for (; startIdx <= endIdx; ++startIdx) {\n      var ch = vnodes[startIdx];\n      if (isDef(ch)) {\n        if (isDef(ch.tag)) {\n          removeAndInvokeRemoveHook(ch);\n          invokeDestroyHook(ch);\n        } else { // Text node\n          removeNode(ch.elm);\n        }\n      }\n    }\n  }\n\n  function removeAndInvokeRemoveHook (vnode, rm) {\n    if (isDef(rm) || isDef(vnode.data)) {\n      var i;\n      var listeners = cbs.remove.length + 1;\n      if (isDef(rm)) {\n        // we have a recursively passed down rm callback\n        // increase the listeners count\n        rm.listeners += listeners;\n      } else {\n        // directly removing\n        rm = createRmCb(vnode.elm, listeners);\n      }\n      // recursively invoke hooks on child component root node\n      if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {\n        removeAndInvokeRemoveHook(i, rm);\n      }\n      for (i = 0; i < cbs.remove.length; ++i) {\n        cbs.remove[i](vnode, rm);\n      }\n      if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {\n        i(vnode, rm);\n      } else {\n        rm();\n      }\n    } else {\n      removeNode(vnode.elm);\n    }\n  }\n\n  function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {\n    var oldStartIdx = 0;\n    var newStartIdx = 0;\n    var oldEndIdx = oldCh.length - 1;\n    var oldStartVnode = oldCh[0];\n    var oldEndVnode = oldCh[oldEndIdx];\n    var newEndIdx = newCh.length - 1;\n    var newStartVnode = newCh[0];\n    var newEndVnode = newCh[newEndIdx];\n    var oldKeyToIdx, idxInOld, vnodeToMove, refElm;\n\n    // removeOnly is a special flag used only by <transition-group>\n    // to ensure removed elements stay in correct relative positions\n    // during leaving transitions\n    var canMove = !removeOnly;\n\n    if (process.env.NODE_ENV !== 'production') {\n      checkDuplicateKeys(newCh);\n    }\n\n    while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n      if (isUndef(oldStartVnode)) {\n        oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left\n      } else if (isUndef(oldEndVnode)) {\n        oldEndVnode = oldCh[--oldEndIdx];\n      } else if (sameVnode(oldStartVnode, newStartVnode)) {\n        patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n        oldStartVnode = oldCh[++oldStartIdx];\n        newStartVnode = newCh[++newStartIdx];\n      } else if (sameVnode(oldEndVnode, newEndVnode)) {\n        patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);\n        oldEndVnode = oldCh[--oldEndIdx];\n        newEndVnode = newCh[--newEndIdx];\n      } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right\n        patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);\n        canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));\n        oldStartVnode = oldCh[++oldStartIdx];\n        newEndVnode = newCh[--newEndIdx];\n      } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left\n        patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n        canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\n        oldEndVnode = oldCh[--oldEndIdx];\n        newStartVnode = newCh[++newStartIdx];\n      } else {\n        if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }\n        idxInOld = isDef(newStartVnode.key)\n          ? oldKeyToIdx[newStartVnode.key]\n          : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);\n        if (isUndef(idxInOld)) { // New element\n          createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n        } else {\n          vnodeToMove = oldCh[idxInOld];\n          if (sameVnode(vnodeToMove, newStartVnode)) {\n            patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n            oldCh[idxInOld] = undefined;\n            canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm);\n          } else {\n            // same key but different element. treat as new element\n            createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n          }\n        }\n        newStartVnode = newCh[++newStartIdx];\n      }\n    }\n    if (oldStartIdx > oldEndIdx) {\n      refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;\n      addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);\n    } else if (newStartIdx > newEndIdx) {\n      removeVnodes(oldCh, oldStartIdx, oldEndIdx);\n    }\n  }\n\n  function checkDuplicateKeys (children) {\n    var seenKeys = {};\n    for (var i = 0; i < children.length; i++) {\n      var vnode = children[i];\n      var key = vnode.key;\n      if (isDef(key)) {\n        if (seenKeys[key]) {\n          warn(\n            (\"Duplicate keys detected: '\" + key + \"'. This may cause an update error.\"),\n            vnode.context\n          );\n        } else {\n          seenKeys[key] = true;\n        }\n      }\n    }\n  }\n\n  function findIdxInOld (node, oldCh, start, end) {\n    for (var i = start; i < end; i++) {\n      var c = oldCh[i];\n      if (isDef(c) && sameVnode(node, c)) { return i }\n    }\n  }\n\n  function patchVnode (\n    oldVnode,\n    vnode,\n    insertedVnodeQueue,\n    ownerArray,\n    index,\n    removeOnly\n  ) {\n    if (oldVnode === vnode) {\n      return\n    }\n\n    if (isDef(vnode.elm) && isDef(ownerArray)) {\n      // clone reused vnode\n      vnode = ownerArray[index] = cloneVNode(vnode);\n    }\n\n    var elm = vnode.elm = oldVnode.elm;\n\n    if (isTrue(oldVnode.isAsyncPlaceholder)) {\n      if (isDef(vnode.asyncFactory.resolved)) {\n        hydrate(oldVnode.elm, vnode, insertedVnodeQueue);\n      } else {\n        vnode.isAsyncPlaceholder = true;\n      }\n      return\n    }\n\n    // reuse element for static trees.\n    // note we only do this if the vnode is cloned -\n    // if the new node is not cloned it means the render functions have been\n    // reset by the hot-reload-api and we need to do a proper re-render.\n    if (isTrue(vnode.isStatic) &&\n      isTrue(oldVnode.isStatic) &&\n      vnode.key === oldVnode.key &&\n      (isTrue(vnode.isCloned) || isTrue(vnode.isOnce))\n    ) {\n      vnode.componentInstance = oldVnode.componentInstance;\n      return\n    }\n\n    var i;\n    var data = vnode.data;\n    if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {\n      i(oldVnode, vnode);\n    }\n\n    var oldCh = oldVnode.children;\n    var ch = vnode.children;\n    if (isDef(data) && isPatchable(vnode)) {\n      for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }\n      if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }\n    }\n    if (isUndef(vnode.text)) {\n      if (isDef(oldCh) && isDef(ch)) {\n        if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }\n      } else if (isDef(ch)) {\n        if (process.env.NODE_ENV !== 'production') {\n          checkDuplicateKeys(ch);\n        }\n        if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }\n        addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);\n      } else if (isDef(oldCh)) {\n        removeVnodes(oldCh, 0, oldCh.length - 1);\n      } else if (isDef(oldVnode.text)) {\n        nodeOps.setTextContent(elm, '');\n      }\n    } else if (oldVnode.text !== vnode.text) {\n      nodeOps.setTextContent(elm, vnode.text);\n    }\n    if (isDef(data)) {\n      if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }\n    }\n  }\n\n  function invokeInsertHook (vnode, queue, initial) {\n    // delay insert hooks for component root nodes, invoke them after the\n    // element is really inserted\n    if (isTrue(initial) && isDef(vnode.parent)) {\n      vnode.parent.data.pendingInsert = queue;\n    } else {\n      for (var i = 0; i < queue.length; ++i) {\n        queue[i].data.hook.insert(queue[i]);\n      }\n    }\n  }\n\n  var hydrationBailed = false;\n  // list of modules that can skip create hook during hydration because they\n  // are already rendered on the client or has no need for initialization\n  // Note: style is excluded because it relies on initial clone for future\n  // deep updates (#7063).\n  var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key');\n\n  // Note: this is a browser-only function so we can assume elms are DOM nodes.\n  function hydrate (elm, vnode, insertedVnodeQueue, inVPre) {\n    var i;\n    var tag = vnode.tag;\n    var data = vnode.data;\n    var children = vnode.children;\n    inVPre = inVPre || (data && data.pre);\n    vnode.elm = elm;\n\n    if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {\n      vnode.isAsyncPlaceholder = true;\n      return true\n    }\n    // assert node match\n    if (process.env.NODE_ENV !== 'production') {\n      if (!assertNodeMatch(elm, vnode, inVPre)) {\n        return false\n      }\n    }\n    if (isDef(data)) {\n      if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }\n      if (isDef(i = vnode.componentInstance)) {\n        // child component. it should have hydrated its own tree.\n        initComponent(vnode, insertedVnodeQueue);\n        return true\n      }\n    }\n    if (isDef(tag)) {\n      if (isDef(children)) {\n        // empty element, allow client to pick up and populate children\n        if (!elm.hasChildNodes()) {\n          createChildren(vnode, children, insertedVnodeQueue);\n        } else {\n          // v-html and domProps: innerHTML\n          if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {\n            if (i !== elm.innerHTML) {\n              /* istanbul ignore if */\n              if (process.env.NODE_ENV !== 'production' &&\n                typeof console !== 'undefined' &&\n                !hydrationBailed\n              ) {\n                hydrationBailed = true;\n                console.warn('Parent: ', elm);\n                console.warn('server innerHTML: ', i);\n                console.warn('client innerHTML: ', elm.innerHTML);\n              }\n              return false\n            }\n          } else {\n            // iterate and compare children lists\n            var childrenMatch = true;\n            var childNode = elm.firstChild;\n            for (var i$1 = 0; i$1 < children.length; i$1++) {\n              if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {\n                childrenMatch = false;\n                break\n              }\n              childNode = childNode.nextSibling;\n            }\n            // if childNode is not null, it means the actual childNodes list is\n            // longer than the virtual children list.\n            if (!childrenMatch || childNode) {\n              /* istanbul ignore if */\n              if (process.env.NODE_ENV !== 'production' &&\n                typeof console !== 'undefined' &&\n                !hydrationBailed\n              ) {\n                hydrationBailed = true;\n                console.warn('Parent: ', elm);\n                console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);\n              }\n              return false\n            }\n          }\n        }\n      }\n      if (isDef(data)) {\n        var fullInvoke = false;\n        for (var key in data) {\n          if (!isRenderedModule(key)) {\n            fullInvoke = true;\n            invokeCreateHooks(vnode, insertedVnodeQueue);\n            break\n          }\n        }\n        if (!fullInvoke && data['class']) {\n          // ensure collecting deps for deep class bindings for future updates\n          traverse(data['class']);\n        }\n      }\n    } else if (elm.data !== vnode.text) {\n      elm.data = vnode.text;\n    }\n    return true\n  }\n\n  function assertNodeMatch (node, vnode, inVPre) {\n    if (isDef(vnode.tag)) {\n      return vnode.tag.indexOf('vue-component') === 0 || (\n        !isUnknownElement$$1(vnode, inVPre) &&\n        vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())\n      )\n    } else {\n      return node.nodeType === (vnode.isComment ? 8 : 3)\n    }\n  }\n\n  return function patch (oldVnode, vnode, hydrating, removeOnly) {\n    if (isUndef(vnode)) {\n      if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }\n      return\n    }\n\n    var isInitialPatch = false;\n    var insertedVnodeQueue = [];\n\n    if (isUndef(oldVnode)) {\n      // empty mount (likely as component), create new root element\n      isInitialPatch = true;\n      createElm(vnode, insertedVnodeQueue);\n    } else {\n      var isRealElement = isDef(oldVnode.nodeType);\n      if (!isRealElement && sameVnode(oldVnode, vnode)) {\n        // patch existing root node\n        patchVnode(oldVnode, vnode, insertedVnodeQueue, null, null, removeOnly);\n      } else {\n        if (isRealElement) {\n          // mounting to a real element\n          // check if this is server-rendered content and if we can perform\n          // a successful hydration.\n          if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {\n            oldVnode.removeAttribute(SSR_ATTR);\n            hydrating = true;\n          }\n          if (isTrue(hydrating)) {\n            if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {\n              invokeInsertHook(vnode, insertedVnodeQueue, true);\n              return oldVnode\n            } else if (process.env.NODE_ENV !== 'production') {\n              warn(\n                'The client-side rendered virtual DOM tree is not matching ' +\n                'server-rendered content. This is likely caused by incorrect ' +\n                'HTML markup, for example nesting block-level elements inside ' +\n                '<p>, or missing <tbody>. Bailing hydration and performing ' +\n                'full client-side render.'\n              );\n            }\n          }\n          // either not server-rendered, or hydration failed.\n          // create an empty node and replace it\n          oldVnode = emptyNodeAt(oldVnode);\n        }\n\n        // replacing existing element\n        var oldElm = oldVnode.elm;\n        var parentElm = nodeOps.parentNode(oldElm);\n\n        // create new node\n        createElm(\n          vnode,\n          insertedVnodeQueue,\n          // extremely rare edge case: do not insert if old element is in a\n          // leaving transition. Only happens when combining transition +\n          // keep-alive + HOCs. (#4590)\n          oldElm._leaveCb ? null : parentElm,\n          nodeOps.nextSibling(oldElm)\n        );\n\n        // update parent placeholder node element, recursively\n        if (isDef(vnode.parent)) {\n          var ancestor = vnode.parent;\n          var patchable = isPatchable(vnode);\n          while (ancestor) {\n            for (var i = 0; i < cbs.destroy.length; ++i) {\n              cbs.destroy[i](ancestor);\n            }\n            ancestor.elm = vnode.elm;\n            if (patchable) {\n              for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n                cbs.create[i$1](emptyNode, ancestor);\n              }\n              // #6513\n              // invoke insert hooks that may have been merged by create hooks.\n              // e.g. for directives that uses the \"inserted\" hook.\n              var insert = ancestor.data.hook.insert;\n              if (insert.merged) {\n                // start at index 1 to avoid re-invoking component mounted hook\n                for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {\n                  insert.fns[i$2]();\n                }\n              }\n            } else {\n              registerRef(ancestor);\n            }\n            ancestor = ancestor.parent;\n          }\n        }\n\n        // destroy old node\n        if (isDef(parentElm)) {\n          removeVnodes([oldVnode], 0, 0);\n        } else if (isDef(oldVnode.tag)) {\n          invokeDestroyHook(oldVnode);\n        }\n      }\n    }\n\n    invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);\n    return vnode.elm\n  }\n}\n\n/*  */\n\nvar directives = {\n  create: updateDirectives,\n  update: updateDirectives,\n  destroy: function unbindDirectives (vnode) {\n    updateDirectives(vnode, emptyNode);\n  }\n};\n\nfunction updateDirectives (oldVnode, vnode) {\n  if (oldVnode.data.directives || vnode.data.directives) {\n    _update(oldVnode, vnode);\n  }\n}\n\nfunction _update (oldVnode, vnode) {\n  var isCreate = oldVnode === emptyNode;\n  var isDestroy = vnode === emptyNode;\n  var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);\n  var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);\n\n  var dirsWithInsert = [];\n  var dirsWithPostpatch = [];\n\n  var key, oldDir, dir;\n  for (key in newDirs) {\n    oldDir = oldDirs[key];\n    dir = newDirs[key];\n    if (!oldDir) {\n      // new directive, bind\n      callHook$1(dir, 'bind', vnode, oldVnode);\n      if (dir.def && dir.def.inserted) {\n        dirsWithInsert.push(dir);\n      }\n    } else {\n      // existing directive, update\n      dir.oldValue = oldDir.value;\n      dir.oldArg = oldDir.arg;\n      callHook$1(dir, 'update', vnode, oldVnode);\n      if (dir.def && dir.def.componentUpdated) {\n        dirsWithPostpatch.push(dir);\n      }\n    }\n  }\n\n  if (dirsWithInsert.length) {\n    var callInsert = function () {\n      for (var i = 0; i < dirsWithInsert.length; i++) {\n        callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);\n      }\n    };\n    if (isCreate) {\n      mergeVNodeHook(vnode, 'insert', callInsert);\n    } else {\n      callInsert();\n    }\n  }\n\n  if (dirsWithPostpatch.length) {\n    mergeVNodeHook(vnode, 'postpatch', function () {\n      for (var i = 0; i < dirsWithPostpatch.length; i++) {\n        callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);\n      }\n    });\n  }\n\n  if (!isCreate) {\n    for (key in oldDirs) {\n      if (!newDirs[key]) {\n        // no longer present, unbind\n        callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);\n      }\n    }\n  }\n}\n\nvar emptyModifiers = Object.create(null);\n\nfunction normalizeDirectives$1 (\n  dirs,\n  vm\n) {\n  var res = Object.create(null);\n  if (!dirs) {\n    // $flow-disable-line\n    return res\n  }\n  var i, dir;\n  for (i = 0; i < dirs.length; i++) {\n    dir = dirs[i];\n    if (!dir.modifiers) {\n      // $flow-disable-line\n      dir.modifiers = emptyModifiers;\n    }\n    res[getRawDirName(dir)] = dir;\n    dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);\n  }\n  // $flow-disable-line\n  return res\n}\n\nfunction getRawDirName (dir) {\n  return dir.rawName || ((dir.name) + \".\" + (Object.keys(dir.modifiers || {}).join('.')))\n}\n\nfunction callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {\n  var fn = dir.def && dir.def[hook];\n  if (fn) {\n    try {\n      fn(vnode.elm, dir, vnode, oldVnode, isDestroy);\n    } catch (e) {\n      handleError(e, vnode.context, (\"directive \" + (dir.name) + \" \" + hook + \" hook\"));\n    }\n  }\n}\n\nvar baseModules = [\n  ref,\n  directives\n];\n\n/*  */\n\nfunction updateAttrs (oldVnode, vnode) {\n  var opts = vnode.componentOptions;\n  if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {\n    return\n  }\n  if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {\n    return\n  }\n  var key, cur, old;\n  var elm = vnode.elm;\n  var oldAttrs = oldVnode.data.attrs || {};\n  var attrs = vnode.data.attrs || {};\n  // clone observed objects, as the user probably wants to mutate it\n  if (isDef(attrs.__ob__)) {\n    attrs = vnode.data.attrs = extend({}, attrs);\n  }\n\n  for (key in attrs) {\n    cur = attrs[key];\n    old = oldAttrs[key];\n    if (old !== cur) {\n      setAttr(elm, key, cur);\n    }\n  }\n  // #4391: in IE9, setting type can reset value for input[type=radio]\n  // #6666: IE/Edge forces progress value down to 1 before setting a max\n  /* istanbul ignore if */\n  if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {\n    setAttr(elm, 'value', attrs.value);\n  }\n  for (key in oldAttrs) {\n    if (isUndef(attrs[key])) {\n      if (isXlink(key)) {\n        elm.removeAttributeNS(xlinkNS, getXlinkProp(key));\n      } else if (!isEnumeratedAttr(key)) {\n        elm.removeAttribute(key);\n      }\n    }\n  }\n}\n\nfunction setAttr (el, key, value) {\n  if (el.tagName.indexOf('-') > -1) {\n    baseSetAttr(el, key, value);\n  } else if (isBooleanAttr(key)) {\n    // set attribute for blank value\n    // e.g. <option disabled>Select one</option>\n    if (isFalsyAttrValue(value)) {\n      el.removeAttribute(key);\n    } else {\n      // technically allowfullscreen is a boolean attribute for <iframe>,\n      // but Flash expects a value of \"true\" when used on <embed> tag\n      value = key === 'allowfullscreen' && el.tagName === 'EMBED'\n        ? 'true'\n        : key;\n      el.setAttribute(key, value);\n    }\n  } else if (isEnumeratedAttr(key)) {\n    el.setAttribute(key, convertEnumeratedValue(key, value));\n  } else if (isXlink(key)) {\n    if (isFalsyAttrValue(value)) {\n      el.removeAttributeNS(xlinkNS, getXlinkProp(key));\n    } else {\n      el.setAttributeNS(xlinkNS, key, value);\n    }\n  } else {\n    baseSetAttr(el, key, value);\n  }\n}\n\nfunction baseSetAttr (el, key, value) {\n  if (isFalsyAttrValue(value)) {\n    el.removeAttribute(key);\n  } else {\n    // #7138: IE10 & 11 fires input event when setting placeholder on\n    // <textarea>... block the first input event and remove the blocker\n    // immediately.\n    /* istanbul ignore if */\n    if (\n      isIE && !isIE9 &&\n      el.tagName === 'TEXTAREA' &&\n      key === 'placeholder' && value !== '' && !el.__ieph\n    ) {\n      var blocker = function (e) {\n        e.stopImmediatePropagation();\n        el.removeEventListener('input', blocker);\n      };\n      el.addEventListener('input', blocker);\n      // $flow-disable-line\n      el.__ieph = true; /* IE placeholder patched */\n    }\n    el.setAttribute(key, value);\n  }\n}\n\nvar attrs = {\n  create: updateAttrs,\n  update: updateAttrs\n};\n\n/*  */\n\nfunction updateClass (oldVnode, vnode) {\n  var el = vnode.elm;\n  var data = vnode.data;\n  var oldData = oldVnode.data;\n  if (\n    isUndef(data.staticClass) &&\n    isUndef(data.class) && (\n      isUndef(oldData) || (\n        isUndef(oldData.staticClass) &&\n        isUndef(oldData.class)\n      )\n    )\n  ) {\n    return\n  }\n\n  var cls = genClassForVnode(vnode);\n\n  // handle transition classes\n  var transitionClass = el._transitionClasses;\n  if (isDef(transitionClass)) {\n    cls = concat(cls, stringifyClass(transitionClass));\n  }\n\n  // set the class\n  if (cls !== el._prevClass) {\n    el.setAttribute('class', cls);\n    el._prevClass = cls;\n  }\n}\n\nvar klass = {\n  create: updateClass,\n  update: updateClass\n};\n\n/*  */\n\nvar validDivisionCharRE = /[\\w).+\\-_$\\]]/;\n\nfunction parseFilters (exp) {\n  var inSingle = false;\n  var inDouble = false;\n  var inTemplateString = false;\n  var inRegex = false;\n  var curly = 0;\n  var square = 0;\n  var paren = 0;\n  var lastFilterIndex = 0;\n  var c, prev, i, expression, filters;\n\n  for (i = 0; i < exp.length; i++) {\n    prev = c;\n    c = exp.charCodeAt(i);\n    if (inSingle) {\n      if (c === 0x27 && prev !== 0x5C) { inSingle = false; }\n    } else if (inDouble) {\n      if (c === 0x22 && prev !== 0x5C) { inDouble = false; }\n    } else if (inTemplateString) {\n      if (c === 0x60 && prev !== 0x5C) { inTemplateString = false; }\n    } else if (inRegex) {\n      if (c === 0x2f && prev !== 0x5C) { inRegex = false; }\n    } else if (\n      c === 0x7C && // pipe\n      exp.charCodeAt(i + 1) !== 0x7C &&\n      exp.charCodeAt(i - 1) !== 0x7C &&\n      !curly && !square && !paren\n    ) {\n      if (expression === undefined) {\n        // first filter, end of expression\n        lastFilterIndex = i + 1;\n        expression = exp.slice(0, i).trim();\n      } else {\n        pushFilter();\n      }\n    } else {\n      switch (c) {\n        case 0x22: inDouble = true; break         // \"\n        case 0x27: inSingle = true; break         // '\n        case 0x60: inTemplateString = true; break // `\n        case 0x28: paren++; break                 // (\n        case 0x29: paren--; break                 // )\n        case 0x5B: square++; break                // [\n        case 0x5D: square--; break                // ]\n        case 0x7B: curly++; break                 // {\n        case 0x7D: curly--; break                 // }\n      }\n      if (c === 0x2f) { // /\n        var j = i - 1;\n        var p = (void 0);\n        // find first non-whitespace prev char\n        for (; j >= 0; j--) {\n          p = exp.charAt(j);\n          if (p !== ' ') { break }\n        }\n        if (!p || !validDivisionCharRE.test(p)) {\n          inRegex = true;\n        }\n      }\n    }\n  }\n\n  if (expression === undefined) {\n    expression = exp.slice(0, i).trim();\n  } else if (lastFilterIndex !== 0) {\n    pushFilter();\n  }\n\n  function pushFilter () {\n    (filters || (filters = [])).push(exp.slice(lastFilterIndex, i).trim());\n    lastFilterIndex = i + 1;\n  }\n\n  if (filters) {\n    for (i = 0; i < filters.length; i++) {\n      expression = wrapFilter(expression, filters[i]);\n    }\n  }\n\n  return expression\n}\n\nfunction wrapFilter (exp, filter) {\n  var i = filter.indexOf('(');\n  if (i < 0) {\n    // _f: resolveFilter\n    return (\"_f(\\\"\" + filter + \"\\\")(\" + exp + \")\")\n  } else {\n    var name = filter.slice(0, i);\n    var args = filter.slice(i + 1);\n    return (\"_f(\\\"\" + name + \"\\\")(\" + exp + (args !== ')' ? ',' + args : args))\n  }\n}\n\n/*  */\n\n\n\n/* eslint-disable no-unused-vars */\nfunction baseWarn (msg, range) {\n  console.error((\"[Vue compiler]: \" + msg));\n}\n/* eslint-enable no-unused-vars */\n\nfunction pluckModuleFunction (\n  modules,\n  key\n) {\n  return modules\n    ? modules.map(function (m) { return m[key]; }).filter(function (_) { return _; })\n    : []\n}\n\nfunction addProp (el, name, value, range, dynamic) {\n  (el.props || (el.props = [])).push(rangeSetItem({ name: name, value: value, dynamic: dynamic }, range));\n  el.plain = false;\n}\n\nfunction addAttr (el, name, value, range, dynamic) {\n  var attrs = dynamic\n    ? (el.dynamicAttrs || (el.dynamicAttrs = []))\n    : (el.attrs || (el.attrs = []));\n  attrs.push(rangeSetItem({ name: name, value: value, dynamic: dynamic }, range));\n  el.plain = false;\n}\n\n// add a raw attr (use this in preTransforms)\nfunction addRawAttr (el, name, value, range) {\n  el.attrsMap[name] = value;\n  el.attrsList.push(rangeSetItem({ name: name, value: value }, range));\n}\n\nfunction addDirective (\n  el,\n  name,\n  rawName,\n  value,\n  arg,\n  isDynamicArg,\n  modifiers,\n  range\n) {\n  (el.directives || (el.directives = [])).push(rangeSetItem({\n    name: name,\n    rawName: rawName,\n    value: value,\n    arg: arg,\n    isDynamicArg: isDynamicArg,\n    modifiers: modifiers\n  }, range));\n  el.plain = false;\n}\n\nfunction prependModifierMarker (symbol, name, dynamic) {\n  return dynamic\n    ? (\"_p(\" + name + \",\\\"\" + symbol + \"\\\")\")\n    : symbol + name // mark the event as captured\n}\n\nfunction addHandler (\n  el,\n  name,\n  value,\n  modifiers,\n  important,\n  warn,\n  range,\n  dynamic\n) {\n  modifiers = modifiers || emptyObject;\n  // warn prevent and passive modifier\n  /* istanbul ignore if */\n  if (\n    process.env.NODE_ENV !== 'production' && warn &&\n    modifiers.prevent && modifiers.passive\n  ) {\n    warn(\n      'passive and prevent can\\'t be used together. ' +\n      'Passive handler can\\'t prevent default event.',\n      range\n    );\n  }\n\n  // normalize click.right and click.middle since they don't actually fire\n  // this is technically browser-specific, but at least for now browsers are\n  // the only target envs that have right/middle clicks.\n  if (modifiers.right) {\n    if (dynamic) {\n      name = \"(\" + name + \")==='click'?'contextmenu':(\" + name + \")\";\n    } else if (name === 'click') {\n      name = 'contextmenu';\n      delete modifiers.right;\n    }\n  } else if (modifiers.middle) {\n    if (dynamic) {\n      name = \"(\" + name + \")==='click'?'mouseup':(\" + name + \")\";\n    } else if (name === 'click') {\n      name = 'mouseup';\n    }\n  }\n\n  // check capture modifier\n  if (modifiers.capture) {\n    delete modifiers.capture;\n    name = prependModifierMarker('!', name, dynamic);\n  }\n  if (modifiers.once) {\n    delete modifiers.once;\n    name = prependModifierMarker('~', name, dynamic);\n  }\n  /* istanbul ignore if */\n  if (modifiers.passive) {\n    delete modifiers.passive;\n    name = prependModifierMarker('&', name, dynamic);\n  }\n\n  var events;\n  if (modifiers.native) {\n    delete modifiers.native;\n    events = el.nativeEvents || (el.nativeEvents = {});\n  } else {\n    events = el.events || (el.events = {});\n  }\n\n  var newHandler = rangeSetItem({ value: value.trim(), dynamic: dynamic }, range);\n  if (modifiers !== emptyObject) {\n    newHandler.modifiers = modifiers;\n  }\n\n  var handlers = events[name];\n  /* istanbul ignore if */\n  if (Array.isArray(handlers)) {\n    important ? handlers.unshift(newHandler) : handlers.push(newHandler);\n  } else if (handlers) {\n    events[name] = important ? [newHandler, handlers] : [handlers, newHandler];\n  } else {\n    events[name] = newHandler;\n  }\n\n  el.plain = false;\n}\n\nfunction getRawBindingAttr (\n  el,\n  name\n) {\n  return el.rawAttrsMap[':' + name] ||\n    el.rawAttrsMap['v-bind:' + name] ||\n    el.rawAttrsMap[name]\n}\n\nfunction getBindingAttr (\n  el,\n  name,\n  getStatic\n) {\n  var dynamicValue =\n    getAndRemoveAttr(el, ':' + name) ||\n    getAndRemoveAttr(el, 'v-bind:' + name);\n  if (dynamicValue != null) {\n    return parseFilters(dynamicValue)\n  } else if (getStatic !== false) {\n    var staticValue = getAndRemoveAttr(el, name);\n    if (staticValue != null) {\n      return JSON.stringify(staticValue)\n    }\n  }\n}\n\n// note: this only removes the attr from the Array (attrsList) so that it\n// doesn't get processed by processAttrs.\n// By default it does NOT remove it from the map (attrsMap) because the map is\n// needed during codegen.\nfunction getAndRemoveAttr (\n  el,\n  name,\n  removeFromMap\n) {\n  var val;\n  if ((val = el.attrsMap[name]) != null) {\n    var list = el.attrsList;\n    for (var i = 0, l = list.length; i < l; i++) {\n      if (list[i].name === name) {\n        list.splice(i, 1);\n        break\n      }\n    }\n  }\n  if (removeFromMap) {\n    delete el.attrsMap[name];\n  }\n  return val\n}\n\nfunction getAndRemoveAttrByRegex (\n  el,\n  name\n) {\n  var list = el.attrsList;\n  for (var i = 0, l = list.length; i < l; i++) {\n    var attr = list[i];\n    if (name.test(attr.name)) {\n      list.splice(i, 1);\n      return attr\n    }\n  }\n}\n\nfunction rangeSetItem (\n  item,\n  range\n) {\n  if (range) {\n    if (range.start != null) {\n      item.start = range.start;\n    }\n    if (range.end != null) {\n      item.end = range.end;\n    }\n  }\n  return item\n}\n\n/*  */\n\n/**\n * Cross-platform code generation for component v-model\n */\nfunction genComponentModel (\n  el,\n  value,\n  modifiers\n) {\n  var ref = modifiers || {};\n  var number = ref.number;\n  var trim = ref.trim;\n\n  var baseValueExpression = '$$v';\n  var valueExpression = baseValueExpression;\n  if (trim) {\n    valueExpression =\n      \"(typeof \" + baseValueExpression + \" === 'string'\" +\n      \"? \" + baseValueExpression + \".trim()\" +\n      \": \" + baseValueExpression + \")\";\n  }\n  if (number) {\n    valueExpression = \"_n(\" + valueExpression + \")\";\n  }\n  var assignment = genAssignmentCode(value, valueExpression);\n\n  el.model = {\n    value: (\"(\" + value + \")\"),\n    expression: JSON.stringify(value),\n    callback: (\"function (\" + baseValueExpression + \") {\" + assignment + \"}\")\n  };\n}\n\n/**\n * Cross-platform codegen helper for generating v-model value assignment code.\n */\nfunction genAssignmentCode (\n  value,\n  assignment\n) {\n  var res = parseModel(value);\n  if (res.key === null) {\n    return (value + \"=\" + assignment)\n  } else {\n    return (\"$set(\" + (res.exp) + \", \" + (res.key) + \", \" + assignment + \")\")\n  }\n}\n\n/**\n * Parse a v-model expression into a base path and a final key segment.\n * Handles both dot-path and possible square brackets.\n *\n * Possible cases:\n *\n * - test\n * - test[key]\n * - test[test1[key]]\n * - test[\"a\"][key]\n * - xxx.test[a[a].test1[key]]\n * - test.xxx.a[\"asa\"][test1[key]]\n *\n */\n\nvar len, str, chr, index$1, expressionPos, expressionEndPos;\n\n\n\nfunction parseModel (val) {\n  // Fix https://github.com/vuejs/vue/pull/7730\n  // allow v-model=\"obj.val \" (trailing whitespace)\n  val = val.trim();\n  len = val.length;\n\n  if (val.indexOf('[') < 0 || val.lastIndexOf(']') < len - 1) {\n    index$1 = val.lastIndexOf('.');\n    if (index$1 > -1) {\n      return {\n        exp: val.slice(0, index$1),\n        key: '\"' + val.slice(index$1 + 1) + '\"'\n      }\n    } else {\n      return {\n        exp: val,\n        key: null\n      }\n    }\n  }\n\n  str = val;\n  index$1 = expressionPos = expressionEndPos = 0;\n\n  while (!eof()) {\n    chr = next();\n    /* istanbul ignore if */\n    if (isStringStart(chr)) {\n      parseString(chr);\n    } else if (chr === 0x5B) {\n      parseBracket(chr);\n    }\n  }\n\n  return {\n    exp: val.slice(0, expressionPos),\n    key: val.slice(expressionPos + 1, expressionEndPos)\n  }\n}\n\nfunction next () {\n  return str.charCodeAt(++index$1)\n}\n\nfunction eof () {\n  return index$1 >= len\n}\n\nfunction isStringStart (chr) {\n  return chr === 0x22 || chr === 0x27\n}\n\nfunction parseBracket (chr) {\n  var inBracket = 1;\n  expressionPos = index$1;\n  while (!eof()) {\n    chr = next();\n    if (isStringStart(chr)) {\n      parseString(chr);\n      continue\n    }\n    if (chr === 0x5B) { inBracket++; }\n    if (chr === 0x5D) { inBracket--; }\n    if (inBracket === 0) {\n      expressionEndPos = index$1;\n      break\n    }\n  }\n}\n\nfunction parseString (chr) {\n  var stringQuote = chr;\n  while (!eof()) {\n    chr = next();\n    if (chr === stringQuote) {\n      break\n    }\n  }\n}\n\n/*  */\n\nvar warn$1;\n\n// in some cases, the event used has to be determined at runtime\n// so we used some reserved tokens during compile.\nvar RANGE_TOKEN = '__r';\nvar CHECKBOX_RADIO_TOKEN = '__c';\n\nfunction model (\n  el,\n  dir,\n  _warn\n) {\n  warn$1 = _warn;\n  var value = dir.value;\n  var modifiers = dir.modifiers;\n  var tag = el.tag;\n  var type = el.attrsMap.type;\n\n  if (process.env.NODE_ENV !== 'production') {\n    // inputs with type=\"file\" are read only and setting the input's\n    // value will throw an error.\n    if (tag === 'input' && type === 'file') {\n      warn$1(\n        \"<\" + (el.tag) + \" v-model=\\\"\" + value + \"\\\" type=\\\"file\\\">:\\n\" +\n        \"File inputs are read only. Use a v-on:change listener instead.\",\n        el.rawAttrsMap['v-model']\n      );\n    }\n  }\n\n  if (el.component) {\n    genComponentModel(el, value, modifiers);\n    // component v-model doesn't need extra runtime\n    return false\n  } else if (tag === 'select') {\n    genSelect(el, value, modifiers);\n  } else if (tag === 'input' && type === 'checkbox') {\n    genCheckboxModel(el, value, modifiers);\n  } else if (tag === 'input' && type === 'radio') {\n    genRadioModel(el, value, modifiers);\n  } else if (tag === 'input' || tag === 'textarea') {\n    genDefaultModel(el, value, modifiers);\n  } else if (!config.isReservedTag(tag)) {\n    genComponentModel(el, value, modifiers);\n    // component v-model doesn't need extra runtime\n    return false\n  } else if (process.env.NODE_ENV !== 'production') {\n    warn$1(\n      \"<\" + (el.tag) + \" v-model=\\\"\" + value + \"\\\">: \" +\n      \"v-model is not supported on this element type. \" +\n      'If you are working with contenteditable, it\\'s recommended to ' +\n      'wrap a library dedicated for that purpose inside a custom component.',\n      el.rawAttrsMap['v-model']\n    );\n  }\n\n  // ensure runtime directive metadata\n  return true\n}\n\nfunction genCheckboxModel (\n  el,\n  value,\n  modifiers\n) {\n  var number = modifiers && modifiers.number;\n  var valueBinding = getBindingAttr(el, 'value') || 'null';\n  var trueValueBinding = getBindingAttr(el, 'true-value') || 'true';\n  var falseValueBinding = getBindingAttr(el, 'false-value') || 'false';\n  addProp(el, 'checked',\n    \"Array.isArray(\" + value + \")\" +\n    \"?_i(\" + value + \",\" + valueBinding + \")>-1\" + (\n      trueValueBinding === 'true'\n        ? (\":(\" + value + \")\")\n        : (\":_q(\" + value + \",\" + trueValueBinding + \")\")\n    )\n  );\n  addHandler(el, 'change',\n    \"var $$a=\" + value + \",\" +\n        '$$el=$event.target,' +\n        \"$$c=$$el.checked?(\" + trueValueBinding + \"):(\" + falseValueBinding + \");\" +\n    'if(Array.isArray($$a)){' +\n      \"var $$v=\" + (number ? '_n(' + valueBinding + ')' : valueBinding) + \",\" +\n          '$$i=_i($$a,$$v);' +\n      \"if($$el.checked){$$i<0&&(\" + (genAssignmentCode(value, '$$a.concat([$$v])')) + \")}\" +\n      \"else{$$i>-1&&(\" + (genAssignmentCode(value, '$$a.slice(0,$$i).concat($$a.slice($$i+1))')) + \")}\" +\n    \"}else{\" + (genAssignmentCode(value, '$$c')) + \"}\",\n    null, true\n  );\n}\n\nfunction genRadioModel (\n  el,\n  value,\n  modifiers\n) {\n  var number = modifiers && modifiers.number;\n  var valueBinding = getBindingAttr(el, 'value') || 'null';\n  valueBinding = number ? (\"_n(\" + valueBinding + \")\") : valueBinding;\n  addProp(el, 'checked', (\"_q(\" + value + \",\" + valueBinding + \")\"));\n  addHandler(el, 'change', genAssignmentCode(value, valueBinding), null, true);\n}\n\nfunction genSelect (\n  el,\n  value,\n  modifiers\n) {\n  var number = modifiers && modifiers.number;\n  var selectedVal = \"Array.prototype.filter\" +\n    \".call($event.target.options,function(o){return o.selected})\" +\n    \".map(function(o){var val = \\\"_value\\\" in o ? o._value : o.value;\" +\n    \"return \" + (number ? '_n(val)' : 'val') + \"})\";\n\n  var assignment = '$event.target.multiple ? $$selectedVal : $$selectedVal[0]';\n  var code = \"var $$selectedVal = \" + selectedVal + \";\";\n  code = code + \" \" + (genAssignmentCode(value, assignment));\n  addHandler(el, 'change', code, null, true);\n}\n\nfunction genDefaultModel (\n  el,\n  value,\n  modifiers\n) {\n  var type = el.attrsMap.type;\n\n  // warn if v-bind:value conflicts with v-model\n  // except for inputs with v-bind:type\n  if (process.env.NODE_ENV !== 'production') {\n    var value$1 = el.attrsMap['v-bind:value'] || el.attrsMap[':value'];\n    var typeBinding = el.attrsMap['v-bind:type'] || el.attrsMap[':type'];\n    if (value$1 && !typeBinding) {\n      var binding = el.attrsMap['v-bind:value'] ? 'v-bind:value' : ':value';\n      warn$1(\n        binding + \"=\\\"\" + value$1 + \"\\\" conflicts with v-model on the same element \" +\n        'because the latter already expands to a value binding internally',\n        el.rawAttrsMap[binding]\n      );\n    }\n  }\n\n  var ref = modifiers || {};\n  var lazy = ref.lazy;\n  var number = ref.number;\n  var trim = ref.trim;\n  var needCompositionGuard = !lazy && type !== 'range';\n  var event = lazy\n    ? 'change'\n    : type === 'range'\n      ? RANGE_TOKEN\n      : 'input';\n\n  var valueExpression = '$event.target.value';\n  if (trim) {\n    valueExpression = \"$event.target.value.trim()\";\n  }\n  if (number) {\n    valueExpression = \"_n(\" + valueExpression + \")\";\n  }\n\n  var code = genAssignmentCode(value, valueExpression);\n  if (needCompositionGuard) {\n    code = \"if($event.target.composing)return;\" + code;\n  }\n\n  addProp(el, 'value', (\"(\" + value + \")\"));\n  addHandler(el, event, code, null, true);\n  if (trim || number) {\n    addHandler(el, 'blur', '$forceUpdate()');\n  }\n}\n\n/*  */\n\n// normalize v-model event tokens that can only be determined at runtime.\n// it's important to place the event as the first in the array because\n// the whole point is ensuring the v-model callback gets called before\n// user-attached handlers.\nfunction normalizeEvents (on) {\n  /* istanbul ignore if */\n  if (isDef(on[RANGE_TOKEN])) {\n    // IE input[type=range] only supports `change` event\n    var event = isIE ? 'change' : 'input';\n    on[event] = [].concat(on[RANGE_TOKEN], on[event] || []);\n    delete on[RANGE_TOKEN];\n  }\n  // This was originally intended to fix #4521 but no longer necessary\n  // after 2.5. Keeping it for backwards compat with generated code from < 2.4\n  /* istanbul ignore if */\n  if (isDef(on[CHECKBOX_RADIO_TOKEN])) {\n    on.change = [].concat(on[CHECKBOX_RADIO_TOKEN], on.change || []);\n    delete on[CHECKBOX_RADIO_TOKEN];\n  }\n}\n\nvar target$1;\n\nfunction createOnceHandler$1 (event, handler, capture) {\n  var _target = target$1; // save current target element in closure\n  return function onceHandler () {\n    var res = handler.apply(null, arguments);\n    if (res !== null) {\n      remove$2(event, onceHandler, capture, _target);\n    }\n  }\n}\n\n// #9446: Firefox <= 53 (in particular, ESR 52) has incorrect Event.timeStamp\n// implementation and does not fire microtasks in between event propagation, so\n// safe to exclude.\nvar useMicrotaskFix = isUsingMicroTask && !(isFF && Number(isFF[1]) <= 53);\n\nfunction add$1 (\n  name,\n  handler,\n  capture,\n  passive\n) {\n  // async edge case #6566: inner click event triggers patch, event handler\n  // attached to outer element during patch, and triggered again. This\n  // happens because browsers fire microtask ticks between event propagation.\n  // the solution is simple: we save the timestamp when a handler is attached,\n  // and the handler would only fire if the event passed to it was fired\n  // AFTER it was attached.\n  if (useMicrotaskFix) {\n    var attachedTimestamp = currentFlushTimestamp;\n    var original = handler;\n    handler = original._wrapper = function (e) {\n      if (\n        // no bubbling, should always fire.\n        // this is just a safety net in case event.timeStamp is unreliable in\n        // certain weird environments...\n        e.target === e.currentTarget ||\n        // event is fired after handler attachment\n        e.timeStamp >= attachedTimestamp ||\n        // bail for environments that have buggy event.timeStamp implementations\n        // #9462 iOS 9 bug: event.timeStamp is 0 after history.pushState\n        // #9681 QtWebEngine event.timeStamp is negative value\n        e.timeStamp <= 0 ||\n        // #9448 bail if event is fired in another document in a multi-page\n        // electron/nw.js app, since event.timeStamp will be using a different\n        // starting reference\n        e.target.ownerDocument !== document\n      ) {\n        return original.apply(this, arguments)\n      }\n    };\n  }\n  target$1.addEventListener(\n    name,\n    handler,\n    supportsPassive\n      ? { capture: capture, passive: passive }\n      : capture\n  );\n}\n\nfunction remove$2 (\n  name,\n  handler,\n  capture,\n  _target\n) {\n  (_target || target$1).removeEventListener(\n    name,\n    handler._wrapper || handler,\n    capture\n  );\n}\n\nfunction updateDOMListeners (oldVnode, vnode) {\n  if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) {\n    return\n  }\n  var on = vnode.data.on || {};\n  var oldOn = oldVnode.data.on || {};\n  target$1 = vnode.elm;\n  normalizeEvents(on);\n  updateListeners(on, oldOn, add$1, remove$2, createOnceHandler$1, vnode.context);\n  target$1 = undefined;\n}\n\nvar events = {\n  create: updateDOMListeners,\n  update: updateDOMListeners\n};\n\n/*  */\n\nvar svgContainer;\n\nfunction updateDOMProps (oldVnode, vnode) {\n  if (isUndef(oldVnode.data.domProps) && isUndef(vnode.data.domProps)) {\n    return\n  }\n  var key, cur;\n  var elm = vnode.elm;\n  var oldProps = oldVnode.data.domProps || {};\n  var props = vnode.data.domProps || {};\n  // clone observed objects, as the user probably wants to mutate it\n  if (isDef(props.__ob__)) {\n    props = vnode.data.domProps = extend({}, props);\n  }\n\n  for (key in oldProps) {\n    if (!(key in props)) {\n      elm[key] = '';\n    }\n  }\n\n  for (key in props) {\n    cur = props[key];\n    // ignore children if the node has textContent or innerHTML,\n    // as these will throw away existing DOM nodes and cause removal errors\n    // on subsequent patches (#3360)\n    if (key === 'textContent' || key === 'innerHTML') {\n      if (vnode.children) { vnode.children.length = 0; }\n      if (cur === oldProps[key]) { continue }\n      // #6601 work around Chrome version <= 55 bug where single textNode\n      // replaced by innerHTML/textContent retains its parentNode property\n      if (elm.childNodes.length === 1) {\n        elm.removeChild(elm.childNodes[0]);\n      }\n    }\n\n    if (key === 'value' && elm.tagName !== 'PROGRESS') {\n      // store value as _value as well since\n      // non-string values will be stringified\n      elm._value = cur;\n      // avoid resetting cursor position when value is the same\n      var strCur = isUndef(cur) ? '' : String(cur);\n      if (shouldUpdateValue(elm, strCur)) {\n        elm.value = strCur;\n      }\n    } else if (key === 'innerHTML' && isSVG(elm.tagName) && isUndef(elm.innerHTML)) {\n      // IE doesn't support innerHTML for SVG elements\n      svgContainer = svgContainer || document.createElement('div');\n      svgContainer.innerHTML = \"<svg>\" + cur + \"</svg>\";\n      var svg = svgContainer.firstChild;\n      while (elm.firstChild) {\n        elm.removeChild(elm.firstChild);\n      }\n      while (svg.firstChild) {\n        elm.appendChild(svg.firstChild);\n      }\n    } else if (\n      // skip the update if old and new VDOM state is the same.\n      // `value` is handled separately because the DOM value may be temporarily\n      // out of sync with VDOM state due to focus, composition and modifiers.\n      // This  #4521 by skipping the unnecesarry `checked` update.\n      cur !== oldProps[key]\n    ) {\n      // some property updates can throw\n      // e.g. `value` on <progress> w/ non-finite value\n      try {\n        elm[key] = cur;\n      } catch (e) {}\n    }\n  }\n}\n\n// check platforms/web/util/attrs.js acceptValue\n\n\nfunction shouldUpdateValue (elm, checkVal) {\n  return (!elm.composing && (\n    elm.tagName === 'OPTION' ||\n    isNotInFocusAndDirty(elm, checkVal) ||\n    isDirtyWithModifiers(elm, checkVal)\n  ))\n}\n\nfunction isNotInFocusAndDirty (elm, checkVal) {\n  // return true when textbox (.number and .trim) loses focus and its value is\n  // not equal to the updated value\n  var notInFocus = true;\n  // #6157\n  // work around IE bug when accessing document.activeElement in an iframe\n  try { notInFocus = document.activeElement !== elm; } catch (e) {}\n  return notInFocus && elm.value !== checkVal\n}\n\nfunction isDirtyWithModifiers (elm, newVal) {\n  var value = elm.value;\n  var modifiers = elm._vModifiers; // injected by v-model runtime\n  if (isDef(modifiers)) {\n    if (modifiers.number) {\n      return toNumber(value) !== toNumber(newVal)\n    }\n    if (modifiers.trim) {\n      return value.trim() !== newVal.trim()\n    }\n  }\n  return value !== newVal\n}\n\nvar domProps = {\n  create: updateDOMProps,\n  update: updateDOMProps\n};\n\n/*  */\n\nvar parseStyleText = cached(function (cssText) {\n  var res = {};\n  var listDelimiter = /;(?![^(]*\\))/g;\n  var propertyDelimiter = /:(.+)/;\n  cssText.split(listDelimiter).forEach(function (item) {\n    if (item) {\n      var tmp = item.split(propertyDelimiter);\n      tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());\n    }\n  });\n  return res\n});\n\n// merge static and dynamic style data on the same vnode\nfunction normalizeStyleData (data) {\n  var style = normalizeStyleBinding(data.style);\n  // static style is pre-processed into an object during compilation\n  // and is always a fresh object, so it's safe to merge into it\n  return data.staticStyle\n    ? extend(data.staticStyle, style)\n    : style\n}\n\n// normalize possible array / string values into Object\nfunction normalizeStyleBinding (bindingStyle) {\n  if (Array.isArray(bindingStyle)) {\n    return toObject(bindingStyle)\n  }\n  if (typeof bindingStyle === 'string') {\n    return parseStyleText(bindingStyle)\n  }\n  return bindingStyle\n}\n\n/**\n * parent component style should be after child's\n * so that parent component's style could override it\n */\nfunction getStyle (vnode, checkChild) {\n  var res = {};\n  var styleData;\n\n  if (checkChild) {\n    var childNode = vnode;\n    while (childNode.componentInstance) {\n      childNode = childNode.componentInstance._vnode;\n      if (\n        childNode && childNode.data &&\n        (styleData = normalizeStyleData(childNode.data))\n      ) {\n        extend(res, styleData);\n      }\n    }\n  }\n\n  if ((styleData = normalizeStyleData(vnode.data))) {\n    extend(res, styleData);\n  }\n\n  var parentNode = vnode;\n  while ((parentNode = parentNode.parent)) {\n    if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {\n      extend(res, styleData);\n    }\n  }\n  return res\n}\n\n/*  */\n\nvar cssVarRE = /^--/;\nvar importantRE = /\\s*!important$/;\nvar setProp = function (el, name, val) {\n  /* istanbul ignore if */\n  if (cssVarRE.test(name)) {\n    el.style.setProperty(name, val);\n  } else if (importantRE.test(val)) {\n    el.style.setProperty(hyphenate(name), val.replace(importantRE, ''), 'important');\n  } else {\n    var normalizedName = normalize(name);\n    if (Array.isArray(val)) {\n      // Support values array created by autoprefixer, e.g.\n      // {display: [\"-webkit-box\", \"-ms-flexbox\", \"flex\"]}\n      // Set them one by one, and the browser will only set those it can recognize\n      for (var i = 0, len = val.length; i < len; i++) {\n        el.style[normalizedName] = val[i];\n      }\n    } else {\n      el.style[normalizedName] = val;\n    }\n  }\n};\n\nvar vendorNames = ['Webkit', 'Moz', 'ms'];\n\nvar emptyStyle;\nvar normalize = cached(function (prop) {\n  emptyStyle = emptyStyle || document.createElement('div').style;\n  prop = camelize(prop);\n  if (prop !== 'filter' && (prop in emptyStyle)) {\n    return prop\n  }\n  var capName = prop.charAt(0).toUpperCase() + prop.slice(1);\n  for (var i = 0; i < vendorNames.length; i++) {\n    var name = vendorNames[i] + capName;\n    if (name in emptyStyle) {\n      return name\n    }\n  }\n});\n\nfunction updateStyle (oldVnode, vnode) {\n  var data = vnode.data;\n  var oldData = oldVnode.data;\n\n  if (isUndef(data.staticStyle) && isUndef(data.style) &&\n    isUndef(oldData.staticStyle) && isUndef(oldData.style)\n  ) {\n    return\n  }\n\n  var cur, name;\n  var el = vnode.elm;\n  var oldStaticStyle = oldData.staticStyle;\n  var oldStyleBinding = oldData.normalizedStyle || oldData.style || {};\n\n  // if static style exists, stylebinding already merged into it when doing normalizeStyleData\n  var oldStyle = oldStaticStyle || oldStyleBinding;\n\n  var style = normalizeStyleBinding(vnode.data.style) || {};\n\n  // store normalized style under a different key for next diff\n  // make sure to clone it if it's reactive, since the user likely wants\n  // to mutate it.\n  vnode.data.normalizedStyle = isDef(style.__ob__)\n    ? extend({}, style)\n    : style;\n\n  var newStyle = getStyle(vnode, true);\n\n  for (name in oldStyle) {\n    if (isUndef(newStyle[name])) {\n      setProp(el, name, '');\n    }\n  }\n  for (name in newStyle) {\n    cur = newStyle[name];\n    if (cur !== oldStyle[name]) {\n      // ie9 setting to null has no effect, must use empty string\n      setProp(el, name, cur == null ? '' : cur);\n    }\n  }\n}\n\nvar style = {\n  create: updateStyle,\n  update: updateStyle\n};\n\n/*  */\n\nvar whitespaceRE = /\\s+/;\n\n/**\n * Add class with compatibility for SVG since classList is not supported on\n * SVG elements in IE\n */\nfunction addClass (el, cls) {\n  /* istanbul ignore if */\n  if (!cls || !(cls = cls.trim())) {\n    return\n  }\n\n  /* istanbul ignore else */\n  if (el.classList) {\n    if (cls.indexOf(' ') > -1) {\n      cls.split(whitespaceRE).forEach(function (c) { return el.classList.add(c); });\n    } else {\n      el.classList.add(cls);\n    }\n  } else {\n    var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n    if (cur.indexOf(' ' + cls + ' ') < 0) {\n      el.setAttribute('class', (cur + cls).trim());\n    }\n  }\n}\n\n/**\n * Remove class with compatibility for SVG since classList is not supported on\n * SVG elements in IE\n */\nfunction removeClass (el, cls) {\n  /* istanbul ignore if */\n  if (!cls || !(cls = cls.trim())) {\n    return\n  }\n\n  /* istanbul ignore else */\n  if (el.classList) {\n    if (cls.indexOf(' ') > -1) {\n      cls.split(whitespaceRE).forEach(function (c) { return el.classList.remove(c); });\n    } else {\n      el.classList.remove(cls);\n    }\n    if (!el.classList.length) {\n      el.removeAttribute('class');\n    }\n  } else {\n    var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n    var tar = ' ' + cls + ' ';\n    while (cur.indexOf(tar) >= 0) {\n      cur = cur.replace(tar, ' ');\n    }\n    cur = cur.trim();\n    if (cur) {\n      el.setAttribute('class', cur);\n    } else {\n      el.removeAttribute('class');\n    }\n  }\n}\n\n/*  */\n\nfunction resolveTransition (def$$1) {\n  if (!def$$1) {\n    return\n  }\n  /* istanbul ignore else */\n  if (typeof def$$1 === 'object') {\n    var res = {};\n    if (def$$1.css !== false) {\n      extend(res, autoCssTransition(def$$1.name || 'v'));\n    }\n    extend(res, def$$1);\n    return res\n  } else if (typeof def$$1 === 'string') {\n    return autoCssTransition(def$$1)\n  }\n}\n\nvar autoCssTransition = cached(function (name) {\n  return {\n    enterClass: (name + \"-enter\"),\n    enterToClass: (name + \"-enter-to\"),\n    enterActiveClass: (name + \"-enter-active\"),\n    leaveClass: (name + \"-leave\"),\n    leaveToClass: (name + \"-leave-to\"),\n    leaveActiveClass: (name + \"-leave-active\")\n  }\n});\n\nvar hasTransition = inBrowser && !isIE9;\nvar TRANSITION = 'transition';\nvar ANIMATION = 'animation';\n\n// Transition property/event sniffing\nvar transitionProp = 'transition';\nvar transitionEndEvent = 'transitionend';\nvar animationProp = 'animation';\nvar animationEndEvent = 'animationend';\nif (hasTransition) {\n  /* istanbul ignore if */\n  if (window.ontransitionend === undefined &&\n    window.onwebkittransitionend !== undefined\n  ) {\n    transitionProp = 'WebkitTransition';\n    transitionEndEvent = 'webkitTransitionEnd';\n  }\n  if (window.onanimationend === undefined &&\n    window.onwebkitanimationend !== undefined\n  ) {\n    animationProp = 'WebkitAnimation';\n    animationEndEvent = 'webkitAnimationEnd';\n  }\n}\n\n// binding to window is necessary to make hot reload work in IE in strict mode\nvar raf = inBrowser\n  ? window.requestAnimationFrame\n    ? window.requestAnimationFrame.bind(window)\n    : setTimeout\n  : /* istanbul ignore next */ function (fn) { return fn(); };\n\nfunction nextFrame (fn) {\n  raf(function () {\n    raf(fn);\n  });\n}\n\nfunction addTransitionClass (el, cls) {\n  var transitionClasses = el._transitionClasses || (el._transitionClasses = []);\n  if (transitionClasses.indexOf(cls) < 0) {\n    transitionClasses.push(cls);\n    addClass(el, cls);\n  }\n}\n\nfunction removeTransitionClass (el, cls) {\n  if (el._transitionClasses) {\n    remove(el._transitionClasses, cls);\n  }\n  removeClass(el, cls);\n}\n\nfunction whenTransitionEnds (\n  el,\n  expectedType,\n  cb\n) {\n  var ref = getTransitionInfo(el, expectedType);\n  var type = ref.type;\n  var timeout = ref.timeout;\n  var propCount = ref.propCount;\n  if (!type) { return cb() }\n  var event = type === TRANSITION ? transitionEndEvent : animationEndEvent;\n  var ended = 0;\n  var end = function () {\n    el.removeEventListener(event, onEnd);\n    cb();\n  };\n  var onEnd = function (e) {\n    if (e.target === el) {\n      if (++ended >= propCount) {\n        end();\n      }\n    }\n  };\n  setTimeout(function () {\n    if (ended < propCount) {\n      end();\n    }\n  }, timeout + 1);\n  el.addEventListener(event, onEnd);\n}\n\nvar transformRE = /\\b(transform|all)(,|$)/;\n\nfunction getTransitionInfo (el, expectedType) {\n  var styles = window.getComputedStyle(el);\n  // JSDOM may return undefined for transition properties\n  var transitionDelays = (styles[transitionProp + 'Delay'] || '').split(', ');\n  var transitionDurations = (styles[transitionProp + 'Duration'] || '').split(', ');\n  var transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n  var animationDelays = (styles[animationProp + 'Delay'] || '').split(', ');\n  var animationDurations = (styles[animationProp + 'Duration'] || '').split(', ');\n  var animationTimeout = getTimeout(animationDelays, animationDurations);\n\n  var type;\n  var timeout = 0;\n  var propCount = 0;\n  /* istanbul ignore if */\n  if (expectedType === TRANSITION) {\n    if (transitionTimeout > 0) {\n      type = TRANSITION;\n      timeout = transitionTimeout;\n      propCount = transitionDurations.length;\n    }\n  } else if (expectedType === ANIMATION) {\n    if (animationTimeout > 0) {\n      type = ANIMATION;\n      timeout = animationTimeout;\n      propCount = animationDurations.length;\n    }\n  } else {\n    timeout = Math.max(transitionTimeout, animationTimeout);\n    type = timeout > 0\n      ? transitionTimeout > animationTimeout\n        ? TRANSITION\n        : ANIMATION\n      : null;\n    propCount = type\n      ? type === TRANSITION\n        ? transitionDurations.length\n        : animationDurations.length\n      : 0;\n  }\n  var hasTransform =\n    type === TRANSITION &&\n    transformRE.test(styles[transitionProp + 'Property']);\n  return {\n    type: type,\n    timeout: timeout,\n    propCount: propCount,\n    hasTransform: hasTransform\n  }\n}\n\nfunction getTimeout (delays, durations) {\n  /* istanbul ignore next */\n  while (delays.length < durations.length) {\n    delays = delays.concat(delays);\n  }\n\n  return Math.max.apply(null, durations.map(function (d, i) {\n    return toMs(d) + toMs(delays[i])\n  }))\n}\n\n// Old versions of Chromium (below 61.0.3163.100) formats floating pointer numbers\n// in a locale-dependent way, using a comma instead of a dot.\n// If comma is not replaced with a dot, the input will be rounded down (i.e. acting\n// as a floor function) causing unexpected behaviors\nfunction toMs (s) {\n  return Number(s.slice(0, -1).replace(',', '.')) * 1000\n}\n\n/*  */\n\nfunction enter (vnode, toggleDisplay) {\n  var el = vnode.elm;\n\n  // call leave callback now\n  if (isDef(el._leaveCb)) {\n    el._leaveCb.cancelled = true;\n    el._leaveCb();\n  }\n\n  var data = resolveTransition(vnode.data.transition);\n  if (isUndef(data)) {\n    return\n  }\n\n  /* istanbul ignore if */\n  if (isDef(el._enterCb) || el.nodeType !== 1) {\n    return\n  }\n\n  var css = data.css;\n  var type = data.type;\n  var enterClass = data.enterClass;\n  var enterToClass = data.enterToClass;\n  var enterActiveClass = data.enterActiveClass;\n  var appearClass = data.appearClass;\n  var appearToClass = data.appearToClass;\n  var appearActiveClass = data.appearActiveClass;\n  var beforeEnter = data.beforeEnter;\n  var enter = data.enter;\n  var afterEnter = data.afterEnter;\n  var enterCancelled = data.enterCancelled;\n  var beforeAppear = data.beforeAppear;\n  var appear = data.appear;\n  var afterAppear = data.afterAppear;\n  var appearCancelled = data.appearCancelled;\n  var duration = data.duration;\n\n  // activeInstance will always be the <transition> component managing this\n  // transition. One edge case to check is when the <transition> is placed\n  // as the root node of a child component. In that case we need to check\n  // <transition>'s parent for appear check.\n  var context = activeInstance;\n  var transitionNode = activeInstance.$vnode;\n  while (transitionNode && transitionNode.parent) {\n    context = transitionNode.context;\n    transitionNode = transitionNode.parent;\n  }\n\n  var isAppear = !context._isMounted || !vnode.isRootInsert;\n\n  if (isAppear && !appear && appear !== '') {\n    return\n  }\n\n  var startClass = isAppear && appearClass\n    ? appearClass\n    : enterClass;\n  var activeClass = isAppear && appearActiveClass\n    ? appearActiveClass\n    : enterActiveClass;\n  var toClass = isAppear && appearToClass\n    ? appearToClass\n    : enterToClass;\n\n  var beforeEnterHook = isAppear\n    ? (beforeAppear || beforeEnter)\n    : beforeEnter;\n  var enterHook = isAppear\n    ? (typeof appear === 'function' ? appear : enter)\n    : enter;\n  var afterEnterHook = isAppear\n    ? (afterAppear || afterEnter)\n    : afterEnter;\n  var enterCancelledHook = isAppear\n    ? (appearCancelled || enterCancelled)\n    : enterCancelled;\n\n  var explicitEnterDuration = toNumber(\n    isObject(duration)\n      ? duration.enter\n      : duration\n  );\n\n  if (process.env.NODE_ENV !== 'production' && explicitEnterDuration != null) {\n    checkDuration(explicitEnterDuration, 'enter', vnode);\n  }\n\n  var expectsCSS = css !== false && !isIE9;\n  var userWantsControl = getHookArgumentsLength(enterHook);\n\n  var cb = el._enterCb = once(function () {\n    if (expectsCSS) {\n      removeTransitionClass(el, toClass);\n      removeTransitionClass(el, activeClass);\n    }\n    if (cb.cancelled) {\n      if (expectsCSS) {\n        removeTransitionClass(el, startClass);\n      }\n      enterCancelledHook && enterCancelledHook(el);\n    } else {\n      afterEnterHook && afterEnterHook(el);\n    }\n    el._enterCb = null;\n  });\n\n  if (!vnode.data.show) {\n    // remove pending leave element on enter by injecting an insert hook\n    mergeVNodeHook(vnode, 'insert', function () {\n      var parent = el.parentNode;\n      var pendingNode = parent && parent._pending && parent._pending[vnode.key];\n      if (pendingNode &&\n        pendingNode.tag === vnode.tag &&\n        pendingNode.elm._leaveCb\n      ) {\n        pendingNode.elm._leaveCb();\n      }\n      enterHook && enterHook(el, cb);\n    });\n  }\n\n  // start enter transition\n  beforeEnterHook && beforeEnterHook(el);\n  if (expectsCSS) {\n    addTransitionClass(el, startClass);\n    addTransitionClass(el, activeClass);\n    nextFrame(function () {\n      removeTransitionClass(el, startClass);\n      if (!cb.cancelled) {\n        addTransitionClass(el, toClass);\n        if (!userWantsControl) {\n          if (isValidDuration(explicitEnterDuration)) {\n            setTimeout(cb, explicitEnterDuration);\n          } else {\n            whenTransitionEnds(el, type, cb);\n          }\n        }\n      }\n    });\n  }\n\n  if (vnode.data.show) {\n    toggleDisplay && toggleDisplay();\n    enterHook && enterHook(el, cb);\n  }\n\n  if (!expectsCSS && !userWantsControl) {\n    cb();\n  }\n}\n\nfunction leave (vnode, rm) {\n  var el = vnode.elm;\n\n  // call enter callback now\n  if (isDef(el._enterCb)) {\n    el._enterCb.cancelled = true;\n    el._enterCb();\n  }\n\n  var data = resolveTransition(vnode.data.transition);\n  if (isUndef(data) || el.nodeType !== 1) {\n    return rm()\n  }\n\n  /* istanbul ignore if */\n  if (isDef(el._leaveCb)) {\n    return\n  }\n\n  var css = data.css;\n  var type = data.type;\n  var leaveClass = data.leaveClass;\n  var leaveToClass = data.leaveToClass;\n  var leaveActiveClass = data.leaveActiveClass;\n  var beforeLeave = data.beforeLeave;\n  var leave = data.leave;\n  var afterLeave = data.afterLeave;\n  var leaveCancelled = data.leaveCancelled;\n  var delayLeave = data.delayLeave;\n  var duration = data.duration;\n\n  var expectsCSS = css !== false && !isIE9;\n  var userWantsControl = getHookArgumentsLength(leave);\n\n  var explicitLeaveDuration = toNumber(\n    isObject(duration)\n      ? duration.leave\n      : duration\n  );\n\n  if (process.env.NODE_ENV !== 'production' && isDef(explicitLeaveDuration)) {\n    checkDuration(explicitLeaveDuration, 'leave', vnode);\n  }\n\n  var cb = el._leaveCb = once(function () {\n    if (el.parentNode && el.parentNode._pending) {\n      el.parentNode._pending[vnode.key] = null;\n    }\n    if (expectsCSS) {\n      removeTransitionClass(el, leaveToClass);\n      removeTransitionClass(el, leaveActiveClass);\n    }\n    if (cb.cancelled) {\n      if (expectsCSS) {\n        removeTransitionClass(el, leaveClass);\n      }\n      leaveCancelled && leaveCancelled(el);\n    } else {\n      rm();\n      afterLeave && afterLeave(el);\n    }\n    el._leaveCb = null;\n  });\n\n  if (delayLeave) {\n    delayLeave(performLeave);\n  } else {\n    performLeave();\n  }\n\n  function performLeave () {\n    // the delayed leave may have already been cancelled\n    if (cb.cancelled) {\n      return\n    }\n    // record leaving element\n    if (!vnode.data.show && el.parentNode) {\n      (el.parentNode._pending || (el.parentNode._pending = {}))[(vnode.key)] = vnode;\n    }\n    beforeLeave && beforeLeave(el);\n    if (expectsCSS) {\n      addTransitionClass(el, leaveClass);\n      addTransitionClass(el, leaveActiveClass);\n      nextFrame(function () {\n        removeTransitionClass(el, leaveClass);\n        if (!cb.cancelled) {\n          addTransitionClass(el, leaveToClass);\n          if (!userWantsControl) {\n            if (isValidDuration(explicitLeaveDuration)) {\n              setTimeout(cb, explicitLeaveDuration);\n            } else {\n              whenTransitionEnds(el, type, cb);\n            }\n          }\n        }\n      });\n    }\n    leave && leave(el, cb);\n    if (!expectsCSS && !userWantsControl) {\n      cb();\n    }\n  }\n}\n\n// only used in dev mode\nfunction checkDuration (val, name, vnode) {\n  if (typeof val !== 'number') {\n    warn(\n      \"<transition> explicit \" + name + \" duration is not a valid number - \" +\n      \"got \" + (JSON.stringify(val)) + \".\",\n      vnode.context\n    );\n  } else if (isNaN(val)) {\n    warn(\n      \"<transition> explicit \" + name + \" duration is NaN - \" +\n      'the duration expression might be incorrect.',\n      vnode.context\n    );\n  }\n}\n\nfunction isValidDuration (val) {\n  return typeof val === 'number' && !isNaN(val)\n}\n\n/**\n * Normalize a transition hook's argument length. The hook may be:\n * - a merged hook (invoker) with the original in .fns\n * - a wrapped component method (check ._length)\n * - a plain function (.length)\n */\nfunction getHookArgumentsLength (fn) {\n  if (isUndef(fn)) {\n    return false\n  }\n  var invokerFns = fn.fns;\n  if (isDef(invokerFns)) {\n    // invoker\n    return getHookArgumentsLength(\n      Array.isArray(invokerFns)\n        ? invokerFns[0]\n        : invokerFns\n    )\n  } else {\n    return (fn._length || fn.length) > 1\n  }\n}\n\nfunction _enter (_, vnode) {\n  if (vnode.data.show !== true) {\n    enter(vnode);\n  }\n}\n\nvar transition = inBrowser ? {\n  create: _enter,\n  activate: _enter,\n  remove: function remove$$1 (vnode, rm) {\n    /* istanbul ignore else */\n    if (vnode.data.show !== true) {\n      leave(vnode, rm);\n    } else {\n      rm();\n    }\n  }\n} : {};\n\nvar platformModules = [\n  attrs,\n  klass,\n  events,\n  domProps,\n  style,\n  transition\n];\n\n/*  */\n\n// the directive module should be applied last, after all\n// built-in modules have been applied.\nvar modules = platformModules.concat(baseModules);\n\nvar patch = createPatchFunction({ nodeOps: nodeOps, modules: modules });\n\n/**\n * Not type checking this file because flow doesn't like attaching\n * properties to Elements.\n */\n\n/* istanbul ignore if */\nif (isIE9) {\n  // http://www.matts411.com/post/internet-explorer-9-oninput/\n  document.addEventListener('selectionchange', function () {\n    var el = document.activeElement;\n    if (el && el.vmodel) {\n      trigger(el, 'input');\n    }\n  });\n}\n\nvar directive = {\n  inserted: function inserted (el, binding, vnode, oldVnode) {\n    if (vnode.tag === 'select') {\n      // #6903\n      if (oldVnode.elm && !oldVnode.elm._vOptions) {\n        mergeVNodeHook(vnode, 'postpatch', function () {\n          directive.componentUpdated(el, binding, vnode);\n        });\n      } else {\n        setSelected(el, binding, vnode.context);\n      }\n      el._vOptions = [].map.call(el.options, getValue);\n    } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {\n      el._vModifiers = binding.modifiers;\n      if (!binding.modifiers.lazy) {\n        el.addEventListener('compositionstart', onCompositionStart);\n        el.addEventListener('compositionend', onCompositionEnd);\n        // Safari < 10.2 & UIWebView doesn't fire compositionend when\n        // switching focus before confirming composition choice\n        // this also fixes the issue where some browsers e.g. iOS Chrome\n        // fires \"change\" instead of \"input\" on autocomplete.\n        el.addEventListener('change', onCompositionEnd);\n        /* istanbul ignore if */\n        if (isIE9) {\n          el.vmodel = true;\n        }\n      }\n    }\n  },\n\n  componentUpdated: function componentUpdated (el, binding, vnode) {\n    if (vnode.tag === 'select') {\n      setSelected(el, binding, vnode.context);\n      // in case the options rendered by v-for have changed,\n      // it's possible that the value is out-of-sync with the rendered options.\n      // detect such cases and filter out values that no longer has a matching\n      // option in the DOM.\n      var prevOptions = el._vOptions;\n      var curOptions = el._vOptions = [].map.call(el.options, getValue);\n      if (curOptions.some(function (o, i) { return !looseEqual(o, prevOptions[i]); })) {\n        // trigger change event if\n        // no matching option found for at least one value\n        var needReset = el.multiple\n          ? binding.value.some(function (v) { return hasNoMatchingOption(v, curOptions); })\n          : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions);\n        if (needReset) {\n          trigger(el, 'change');\n        }\n      }\n    }\n  }\n};\n\nfunction setSelected (el, binding, vm) {\n  actuallySetSelected(el, binding, vm);\n  /* istanbul ignore if */\n  if (isIE || isEdge) {\n    setTimeout(function () {\n      actuallySetSelected(el, binding, vm);\n    }, 0);\n  }\n}\n\nfunction actuallySetSelected (el, binding, vm) {\n  var value = binding.value;\n  var isMultiple = el.multiple;\n  if (isMultiple && !Array.isArray(value)) {\n    process.env.NODE_ENV !== 'production' && warn(\n      \"<select multiple v-model=\\\"\" + (binding.expression) + \"\\\"> \" +\n      \"expects an Array value for its binding, but got \" + (Object.prototype.toString.call(value).slice(8, -1)),\n      vm\n    );\n    return\n  }\n  var selected, option;\n  for (var i = 0, l = el.options.length; i < l; i++) {\n    option = el.options[i];\n    if (isMultiple) {\n      selected = looseIndexOf(value, getValue(option)) > -1;\n      if (option.selected !== selected) {\n        option.selected = selected;\n      }\n    } else {\n      if (looseEqual(getValue(option), value)) {\n        if (el.selectedIndex !== i) {\n          el.selectedIndex = i;\n        }\n        return\n      }\n    }\n  }\n  if (!isMultiple) {\n    el.selectedIndex = -1;\n  }\n}\n\nfunction hasNoMatchingOption (value, options) {\n  return options.every(function (o) { return !looseEqual(o, value); })\n}\n\nfunction getValue (option) {\n  return '_value' in option\n    ? option._value\n    : option.value\n}\n\nfunction onCompositionStart (e) {\n  e.target.composing = true;\n}\n\nfunction onCompositionEnd (e) {\n  // prevent triggering an input event for no reason\n  if (!e.target.composing) { return }\n  e.target.composing = false;\n  trigger(e.target, 'input');\n}\n\nfunction trigger (el, type) {\n  var e = document.createEvent('HTMLEvents');\n  e.initEvent(type, true, true);\n  el.dispatchEvent(e);\n}\n\n/*  */\n\n// recursively search for possible transition defined inside the component root\nfunction locateNode (vnode) {\n  return vnode.componentInstance && (!vnode.data || !vnode.data.transition)\n    ? locateNode(vnode.componentInstance._vnode)\n    : vnode\n}\n\nvar show = {\n  bind: function bind (el, ref, vnode) {\n    var value = ref.value;\n\n    vnode = locateNode(vnode);\n    var transition$$1 = vnode.data && vnode.data.transition;\n    var originalDisplay = el.__vOriginalDisplay =\n      el.style.display === 'none' ? '' : el.style.display;\n    if (value && transition$$1) {\n      vnode.data.show = true;\n      enter(vnode, function () {\n        el.style.display = originalDisplay;\n      });\n    } else {\n      el.style.display = value ? originalDisplay : 'none';\n    }\n  },\n\n  update: function update (el, ref, vnode) {\n    var value = ref.value;\n    var oldValue = ref.oldValue;\n\n    /* istanbul ignore if */\n    if (!value === !oldValue) { return }\n    vnode = locateNode(vnode);\n    var transition$$1 = vnode.data && vnode.data.transition;\n    if (transition$$1) {\n      vnode.data.show = true;\n      if (value) {\n        enter(vnode, function () {\n          el.style.display = el.__vOriginalDisplay;\n        });\n      } else {\n        leave(vnode, function () {\n          el.style.display = 'none';\n        });\n      }\n    } else {\n      el.style.display = value ? el.__vOriginalDisplay : 'none';\n    }\n  },\n\n  unbind: function unbind (\n    el,\n    binding,\n    vnode,\n    oldVnode,\n    isDestroy\n  ) {\n    if (!isDestroy) {\n      el.style.display = el.__vOriginalDisplay;\n    }\n  }\n};\n\nvar platformDirectives = {\n  model: directive,\n  show: show\n};\n\n/*  */\n\nvar transitionProps = {\n  name: String,\n  appear: Boolean,\n  css: Boolean,\n  mode: String,\n  type: String,\n  enterClass: String,\n  leaveClass: String,\n  enterToClass: String,\n  leaveToClass: String,\n  enterActiveClass: String,\n  leaveActiveClass: String,\n  appearClass: String,\n  appearActiveClass: String,\n  appearToClass: String,\n  duration: [Number, String, Object]\n};\n\n// in case the child is also an abstract component, e.g. <keep-alive>\n// we want to recursively retrieve the real component to be rendered\nfunction getRealChild (vnode) {\n  var compOptions = vnode && vnode.componentOptions;\n  if (compOptions && compOptions.Ctor.options.abstract) {\n    return getRealChild(getFirstComponentChild(compOptions.children))\n  } else {\n    return vnode\n  }\n}\n\nfunction extractTransitionData (comp) {\n  var data = {};\n  var options = comp.$options;\n  // props\n  for (var key in options.propsData) {\n    data[key] = comp[key];\n  }\n  // events.\n  // extract listeners and pass them directly to the transition methods\n  var listeners = options._parentListeners;\n  for (var key$1 in listeners) {\n    data[camelize(key$1)] = listeners[key$1];\n  }\n  return data\n}\n\nfunction placeholder (h, rawChild) {\n  if (/\\d-keep-alive$/.test(rawChild.tag)) {\n    return h('keep-alive', {\n      props: rawChild.componentOptions.propsData\n    })\n  }\n}\n\nfunction hasParentTransition (vnode) {\n  while ((vnode = vnode.parent)) {\n    if (vnode.data.transition) {\n      return true\n    }\n  }\n}\n\nfunction isSameChild (child, oldChild) {\n  return oldChild.key === child.key && oldChild.tag === child.tag\n}\n\nvar isNotTextNode = function (c) { return c.tag || isAsyncPlaceholder(c); };\n\nvar isVShowDirective = function (d) { return d.name === 'show'; };\n\nvar Transition = {\n  name: 'transition',\n  props: transitionProps,\n  abstract: true,\n\n  render: function render (h) {\n    var this$1 = this;\n\n    var children = this.$slots.default;\n    if (!children) {\n      return\n    }\n\n    // filter out text nodes (possible whitespaces)\n    children = children.filter(isNotTextNode);\n    /* istanbul ignore if */\n    if (!children.length) {\n      return\n    }\n\n    // warn multiple elements\n    if (process.env.NODE_ENV !== 'production' && children.length > 1) {\n      warn(\n        '<transition> can only be used on a single element. Use ' +\n        '<transition-group> for lists.',\n        this.$parent\n      );\n    }\n\n    var mode = this.mode;\n\n    // warn invalid mode\n    if (process.env.NODE_ENV !== 'production' &&\n      mode && mode !== 'in-out' && mode !== 'out-in'\n    ) {\n      warn(\n        'invalid <transition> mode: ' + mode,\n        this.$parent\n      );\n    }\n\n    var rawChild = children[0];\n\n    // if this is a component root node and the component's\n    // parent container node also has transition, skip.\n    if (hasParentTransition(this.$vnode)) {\n      return rawChild\n    }\n\n    // apply transition data to child\n    // use getRealChild() to ignore abstract components e.g. keep-alive\n    var child = getRealChild(rawChild);\n    /* istanbul ignore if */\n    if (!child) {\n      return rawChild\n    }\n\n    if (this._leaving) {\n      return placeholder(h, rawChild)\n    }\n\n    // ensure a key that is unique to the vnode type and to this transition\n    // component instance. This key will be used to remove pending leaving nodes\n    // during entering.\n    var id = \"__transition-\" + (this._uid) + \"-\";\n    child.key = child.key == null\n      ? child.isComment\n        ? id + 'comment'\n        : id + child.tag\n      : isPrimitive(child.key)\n        ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)\n        : child.key;\n\n    var data = (child.data || (child.data = {})).transition = extractTransitionData(this);\n    var oldRawChild = this._vnode;\n    var oldChild = getRealChild(oldRawChild);\n\n    // mark v-show\n    // so that the transition module can hand over the control to the directive\n    if (child.data.directives && child.data.directives.some(isVShowDirective)) {\n      child.data.show = true;\n    }\n\n    if (\n      oldChild &&\n      oldChild.data &&\n      !isSameChild(child, oldChild) &&\n      !isAsyncPlaceholder(oldChild) &&\n      // #6687 component root is a comment node\n      !(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)\n    ) {\n      // replace old child transition data with fresh one\n      // important for dynamic transitions!\n      var oldData = oldChild.data.transition = extend({}, data);\n      // handle transition mode\n      if (mode === 'out-in') {\n        // return placeholder node and queue update when leave finishes\n        this._leaving = true;\n        mergeVNodeHook(oldData, 'afterLeave', function () {\n          this$1._leaving = false;\n          this$1.$forceUpdate();\n        });\n        return placeholder(h, rawChild)\n      } else if (mode === 'in-out') {\n        if (isAsyncPlaceholder(child)) {\n          return oldRawChild\n        }\n        var delayedLeave;\n        var performLeave = function () { delayedLeave(); };\n        mergeVNodeHook(data, 'afterEnter', performLeave);\n        mergeVNodeHook(data, 'enterCancelled', performLeave);\n        mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });\n      }\n    }\n\n    return rawChild\n  }\n};\n\n/*  */\n\nvar props = extend({\n  tag: String,\n  moveClass: String\n}, transitionProps);\n\ndelete props.mode;\n\nvar TransitionGroup = {\n  props: props,\n\n  beforeMount: function beforeMount () {\n    var this$1 = this;\n\n    var update = this._update;\n    this._update = function (vnode, hydrating) {\n      var restoreActiveInstance = setActiveInstance(this$1);\n      // force removing pass\n      this$1.__patch__(\n        this$1._vnode,\n        this$1.kept,\n        false, // hydrating\n        true // removeOnly (!important, avoids unnecessary moves)\n      );\n      this$1._vnode = this$1.kept;\n      restoreActiveInstance();\n      update.call(this$1, vnode, hydrating);\n    };\n  },\n\n  render: function render (h) {\n    var tag = this.tag || this.$vnode.data.tag || 'span';\n    var map = Object.create(null);\n    var prevChildren = this.prevChildren = this.children;\n    var rawChildren = this.$slots.default || [];\n    var children = this.children = [];\n    var transitionData = extractTransitionData(this);\n\n    for (var i = 0; i < rawChildren.length; i++) {\n      var c = rawChildren[i];\n      if (c.tag) {\n        if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {\n          children.push(c);\n          map[c.key] = c\n          ;(c.data || (c.data = {})).transition = transitionData;\n        } else if (process.env.NODE_ENV !== 'production') {\n          var opts = c.componentOptions;\n          var name = opts ? (opts.Ctor.options.name || opts.tag || '') : c.tag;\n          warn((\"<transition-group> children must be keyed: <\" + name + \">\"));\n        }\n      }\n    }\n\n    if (prevChildren) {\n      var kept = [];\n      var removed = [];\n      for (var i$1 = 0; i$1 < prevChildren.length; i$1++) {\n        var c$1 = prevChildren[i$1];\n        c$1.data.transition = transitionData;\n        c$1.data.pos = c$1.elm.getBoundingClientRect();\n        if (map[c$1.key]) {\n          kept.push(c$1);\n        } else {\n          removed.push(c$1);\n        }\n      }\n      this.kept = h(tag, null, kept);\n      this.removed = removed;\n    }\n\n    return h(tag, null, children)\n  },\n\n  updated: function updated () {\n    var children = this.prevChildren;\n    var moveClass = this.moveClass || ((this.name || 'v') + '-move');\n    if (!children.length || !this.hasMove(children[0].elm, moveClass)) {\n      return\n    }\n\n    // we divide the work into three loops to avoid mixing DOM reads and writes\n    // in each iteration - which helps prevent layout thrashing.\n    children.forEach(callPendingCbs);\n    children.forEach(recordPosition);\n    children.forEach(applyTranslation);\n\n    // force reflow to put everything in position\n    // assign to this to avoid being removed in tree-shaking\n    // $flow-disable-line\n    this._reflow = document.body.offsetHeight;\n\n    children.forEach(function (c) {\n      if (c.data.moved) {\n        var el = c.elm;\n        var s = el.style;\n        addTransitionClass(el, moveClass);\n        s.transform = s.WebkitTransform = s.transitionDuration = '';\n        el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) {\n          if (e && e.target !== el) {\n            return\n          }\n          if (!e || /transform$/.test(e.propertyName)) {\n            el.removeEventListener(transitionEndEvent, cb);\n            el._moveCb = null;\n            removeTransitionClass(el, moveClass);\n          }\n        });\n      }\n    });\n  },\n\n  methods: {\n    hasMove: function hasMove (el, moveClass) {\n      /* istanbul ignore if */\n      if (!hasTransition) {\n        return false\n      }\n      /* istanbul ignore if */\n      if (this._hasMove) {\n        return this._hasMove\n      }\n      // Detect whether an element with the move class applied has\n      // CSS transitions. Since the element may be inside an entering\n      // transition at this very moment, we make a clone of it and remove\n      // all other transition classes applied to ensure only the move class\n      // is applied.\n      var clone = el.cloneNode();\n      if (el._transitionClasses) {\n        el._transitionClasses.forEach(function (cls) { removeClass(clone, cls); });\n      }\n      addClass(clone, moveClass);\n      clone.style.display = 'none';\n      this.$el.appendChild(clone);\n      var info = getTransitionInfo(clone);\n      this.$el.removeChild(clone);\n      return (this._hasMove = info.hasTransform)\n    }\n  }\n};\n\nfunction callPendingCbs (c) {\n  /* istanbul ignore if */\n  if (c.elm._moveCb) {\n    c.elm._moveCb();\n  }\n  /* istanbul ignore if */\n  if (c.elm._enterCb) {\n    c.elm._enterCb();\n  }\n}\n\nfunction recordPosition (c) {\n  c.data.newPos = c.elm.getBoundingClientRect();\n}\n\nfunction applyTranslation (c) {\n  var oldPos = c.data.pos;\n  var newPos = c.data.newPos;\n  var dx = oldPos.left - newPos.left;\n  var dy = oldPos.top - newPos.top;\n  if (dx || dy) {\n    c.data.moved = true;\n    var s = c.elm.style;\n    s.transform = s.WebkitTransform = \"translate(\" + dx + \"px,\" + dy + \"px)\";\n    s.transitionDuration = '0s';\n  }\n}\n\nvar platformComponents = {\n  Transition: Transition,\n  TransitionGroup: TransitionGroup\n};\n\n/*  */\n\n// install platform specific utils\nVue.config.mustUseProp = mustUseProp;\nVue.config.isReservedTag = isReservedTag;\nVue.config.isReservedAttr = isReservedAttr;\nVue.config.getTagNamespace = getTagNamespace;\nVue.config.isUnknownElement = isUnknownElement;\n\n// install platform runtime directives & components\nextend(Vue.options.directives, platformDirectives);\nextend(Vue.options.components, platformComponents);\n\n// install platform patch function\nVue.prototype.__patch__ = inBrowser ? patch : noop;\n\n// public mount method\nVue.prototype.$mount = function (\n  el,\n  hydrating\n) {\n  el = el && inBrowser ? query(el) : undefined;\n  return mountComponent(this, el, hydrating)\n};\n\n// devtools global hook\n/* istanbul ignore next */\nif (inBrowser) {\n  setTimeout(function () {\n    if (config.devtools) {\n      if (devtools) {\n        devtools.emit('init', Vue);\n      } else if (\n        process.env.NODE_ENV !== 'production' &&\n        process.env.NODE_ENV !== 'test'\n      ) {\n        console[console.info ? 'info' : 'log'](\n          'Download the Vue Devtools extension for a better development experience:\\n' +\n          'https://github.com/vuejs/vue-devtools'\n        );\n      }\n    }\n    if (process.env.NODE_ENV !== 'production' &&\n      process.env.NODE_ENV !== 'test' &&\n      config.productionTip !== false &&\n      typeof console !== 'undefined'\n    ) {\n      console[console.info ? 'info' : 'log'](\n        \"You are running Vue in development mode.\\n\" +\n        \"Make sure to turn on production mode when deploying for production.\\n\" +\n        \"See more tips at https://vuejs.org/guide/deployment.html\"\n      );\n    }\n  }, 0);\n}\n\n/*  */\n\nvar defaultTagRE = /\\{\\{((?:.|\\r?\\n)+?)\\}\\}/g;\nvar regexEscapeRE = /[-.*+?^${}()|[\\]\\/\\\\]/g;\n\nvar buildRegex = cached(function (delimiters) {\n  var open = delimiters[0].replace(regexEscapeRE, '\\\\$&');\n  var close = delimiters[1].replace(regexEscapeRE, '\\\\$&');\n  return new RegExp(open + '((?:.|\\\\n)+?)' + close, 'g')\n});\n\n\n\nfunction parseText (\n  text,\n  delimiters\n) {\n  var tagRE = delimiters ? buildRegex(delimiters) : defaultTagRE;\n  if (!tagRE.test(text)) {\n    return\n  }\n  var tokens = [];\n  var rawTokens = [];\n  var lastIndex = tagRE.lastIndex = 0;\n  var match, index, tokenValue;\n  while ((match = tagRE.exec(text))) {\n    index = match.index;\n    // push text token\n    if (index > lastIndex) {\n      rawTokens.push(tokenValue = text.slice(lastIndex, index));\n      tokens.push(JSON.stringify(tokenValue));\n    }\n    // tag token\n    var exp = parseFilters(match[1].trim());\n    tokens.push((\"_s(\" + exp + \")\"));\n    rawTokens.push({ '@binding': exp });\n    lastIndex = index + match[0].length;\n  }\n  if (lastIndex < text.length) {\n    rawTokens.push(tokenValue = text.slice(lastIndex));\n    tokens.push(JSON.stringify(tokenValue));\n  }\n  return {\n    expression: tokens.join('+'),\n    tokens: rawTokens\n  }\n}\n\n/*  */\n\nfunction transformNode (el, options) {\n  var warn = options.warn || baseWarn;\n  var staticClass = getAndRemoveAttr(el, 'class');\n  if (process.env.NODE_ENV !== 'production' && staticClass) {\n    var res = parseText(staticClass, options.delimiters);\n    if (res) {\n      warn(\n        \"class=\\\"\" + staticClass + \"\\\": \" +\n        'Interpolation inside attributes has been removed. ' +\n        'Use v-bind or the colon shorthand instead. For example, ' +\n        'instead of <div class=\"{{ val }}\">, use <div :class=\"val\">.',\n        el.rawAttrsMap['class']\n      );\n    }\n  }\n  if (staticClass) {\n    el.staticClass = JSON.stringify(staticClass);\n  }\n  var classBinding = getBindingAttr(el, 'class', false /* getStatic */);\n  if (classBinding) {\n    el.classBinding = classBinding;\n  }\n}\n\nfunction genData (el) {\n  var data = '';\n  if (el.staticClass) {\n    data += \"staticClass:\" + (el.staticClass) + \",\";\n  }\n  if (el.classBinding) {\n    data += \"class:\" + (el.classBinding) + \",\";\n  }\n  return data\n}\n\nvar klass$1 = {\n  staticKeys: ['staticClass'],\n  transformNode: transformNode,\n  genData: genData\n};\n\n/*  */\n\nfunction transformNode$1 (el, options) {\n  var warn = options.warn || baseWarn;\n  var staticStyle = getAndRemoveAttr(el, 'style');\n  if (staticStyle) {\n    /* istanbul ignore if */\n    if (process.env.NODE_ENV !== 'production') {\n      var res = parseText(staticStyle, options.delimiters);\n      if (res) {\n        warn(\n          \"style=\\\"\" + staticStyle + \"\\\": \" +\n          'Interpolation inside attributes has been removed. ' +\n          'Use v-bind or the colon shorthand instead. For example, ' +\n          'instead of <div style=\"{{ val }}\">, use <div :style=\"val\">.',\n          el.rawAttrsMap['style']\n        );\n      }\n    }\n    el.staticStyle = JSON.stringify(parseStyleText(staticStyle));\n  }\n\n  var styleBinding = getBindingAttr(el, 'style', false /* getStatic */);\n  if (styleBinding) {\n    el.styleBinding = styleBinding;\n  }\n}\n\nfunction genData$1 (el) {\n  var data = '';\n  if (el.staticStyle) {\n    data += \"staticStyle:\" + (el.staticStyle) + \",\";\n  }\n  if (el.styleBinding) {\n    data += \"style:(\" + (el.styleBinding) + \"),\";\n  }\n  return data\n}\n\nvar style$1 = {\n  staticKeys: ['staticStyle'],\n  transformNode: transformNode$1,\n  genData: genData$1\n};\n\n/*  */\n\nvar decoder;\n\nvar he = {\n  decode: function decode (html) {\n    decoder = decoder || document.createElement('div');\n    decoder.innerHTML = html;\n    return decoder.textContent\n  }\n};\n\n/*  */\n\nvar isUnaryTag = makeMap(\n  'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +\n  'link,meta,param,source,track,wbr'\n);\n\n// Elements that you can, intentionally, leave open\n// (and which close themselves)\nvar canBeLeftOpenTag = makeMap(\n  'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source'\n);\n\n// HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3\n// Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content\nvar isNonPhrasingTag = makeMap(\n  'address,article,aside,base,blockquote,body,caption,col,colgroup,dd,' +\n  'details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,' +\n  'h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,' +\n  'optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,' +\n  'title,tr,track'\n);\n\n/**\n * Not type-checking this file because it's mostly vendor code.\n */\n\n// Regular Expressions for parsing tags and attributes\nvar attribute = /^\\s*([^\\s\"'<>\\/=]+)(?:\\s*(=)\\s*(?:\"([^\"]*)\"+|'([^']*)'+|([^\\s\"'=<>`]+)))?/;\nvar dynamicArgAttribute = /^\\s*((?:v-[\\w-]+:|@|:|#)\\[[^=]+\\][^\\s\"'<>\\/=]*)(?:\\s*(=)\\s*(?:\"([^\"]*)\"+|'([^']*)'+|([^\\s\"'=<>`]+)))?/;\nvar ncname = \"[a-zA-Z_][\\\\-\\\\.0-9_a-zA-Z\" + (unicodeRegExp.source) + \"]*\";\nvar qnameCapture = \"((?:\" + ncname + \"\\\\:)?\" + ncname + \")\";\nvar startTagOpen = new RegExp((\"^<\" + qnameCapture));\nvar startTagClose = /^\\s*(\\/?)>/;\nvar endTag = new RegExp((\"^<\\\\/\" + qnameCapture + \"[^>]*>\"));\nvar doctype = /^<!DOCTYPE [^>]+>/i;\n// #7298: escape - to avoid being passed as HTML comment when inlined in page\nvar comment = /^<!\\--/;\nvar conditionalComment = /^<!\\[/;\n\n// Special Elements (can contain anything)\nvar isPlainTextElement = makeMap('script,style,textarea', true);\nvar reCache = {};\n\nvar decodingMap = {\n  '&lt;': '<',\n  '&gt;': '>',\n  '&quot;': '\"',\n  '&amp;': '&',\n  '&#10;': '\\n',\n  '&#9;': '\\t',\n  '&#39;': \"'\"\n};\nvar encodedAttr = /&(?:lt|gt|quot|amp|#39);/g;\nvar encodedAttrWithNewLines = /&(?:lt|gt|quot|amp|#39|#10|#9);/g;\n\n// #5992\nvar isIgnoreNewlineTag = makeMap('pre,textarea', true);\nvar shouldIgnoreFirstNewline = function (tag, html) { return tag && isIgnoreNewlineTag(tag) && html[0] === '\\n'; };\n\nfunction decodeAttr (value, shouldDecodeNewlines) {\n  var re = shouldDecodeNewlines ? encodedAttrWithNewLines : encodedAttr;\n  return value.replace(re, function (match) { return decodingMap[match]; })\n}\n\nfunction parseHTML (html, options) {\n  var stack = [];\n  var expectHTML = options.expectHTML;\n  var isUnaryTag$$1 = options.isUnaryTag || no;\n  var canBeLeftOpenTag$$1 = options.canBeLeftOpenTag || no;\n  var index = 0;\n  var last, lastTag;\n  while (html) {\n    last = html;\n    // Make sure we're not in a plaintext content element like script/style\n    if (!lastTag || !isPlainTextElement(lastTag)) {\n      var textEnd = html.indexOf('<');\n      if (textEnd === 0) {\n        // Comment:\n        if (comment.test(html)) {\n          var commentEnd = html.indexOf('-->');\n\n          if (commentEnd >= 0) {\n            if (options.shouldKeepComment) {\n              options.comment(html.substring(4, commentEnd), index, index + commentEnd + 3);\n            }\n            advance(commentEnd + 3);\n            continue\n          }\n        }\n\n        // http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment\n        if (conditionalComment.test(html)) {\n          var conditionalEnd = html.indexOf(']>');\n\n          if (conditionalEnd >= 0) {\n            advance(conditionalEnd + 2);\n            continue\n          }\n        }\n\n        // Doctype:\n        var doctypeMatch = html.match(doctype);\n        if (doctypeMatch) {\n          advance(doctypeMatch[0].length);\n          continue\n        }\n\n        // End tag:\n        var endTagMatch = html.match(endTag);\n        if (endTagMatch) {\n          var curIndex = index;\n          advance(endTagMatch[0].length);\n          parseEndTag(endTagMatch[1], curIndex, index);\n          continue\n        }\n\n        // Start tag:\n        var startTagMatch = parseStartTag();\n        if (startTagMatch) {\n          handleStartTag(startTagMatch);\n          if (shouldIgnoreFirstNewline(startTagMatch.tagName, html)) {\n            advance(1);\n          }\n          continue\n        }\n      }\n\n      var text = (void 0), rest = (void 0), next = (void 0);\n      if (textEnd >= 0) {\n        rest = html.slice(textEnd);\n        while (\n          !endTag.test(rest) &&\n          !startTagOpen.test(rest) &&\n          !comment.test(rest) &&\n          !conditionalComment.test(rest)\n        ) {\n          // < in plain text, be forgiving and treat it as text\n          next = rest.indexOf('<', 1);\n          if (next < 0) { break }\n          textEnd += next;\n          rest = html.slice(textEnd);\n        }\n        text = html.substring(0, textEnd);\n      }\n\n      if (textEnd < 0) {\n        text = html;\n      }\n\n      if (text) {\n        advance(text.length);\n      }\n\n      if (options.chars && text) {\n        options.chars(text, index - text.length, index);\n      }\n    } else {\n      var endTagLength = 0;\n      var stackedTag = lastTag.toLowerCase();\n      var reStackedTag = reCache[stackedTag] || (reCache[stackedTag] = new RegExp('([\\\\s\\\\S]*?)(</' + stackedTag + '[^>]*>)', 'i'));\n      var rest$1 = html.replace(reStackedTag, function (all, text, endTag) {\n        endTagLength = endTag.length;\n        if (!isPlainTextElement(stackedTag) && stackedTag !== 'noscript') {\n          text = text\n            .replace(/<!\\--([\\s\\S]*?)-->/g, '$1') // #7298\n            .replace(/<!\\[CDATA\\[([\\s\\S]*?)]]>/g, '$1');\n        }\n        if (shouldIgnoreFirstNewline(stackedTag, text)) {\n          text = text.slice(1);\n        }\n        if (options.chars) {\n          options.chars(text);\n        }\n        return ''\n      });\n      index += html.length - rest$1.length;\n      html = rest$1;\n      parseEndTag(stackedTag, index - endTagLength, index);\n    }\n\n    if (html === last) {\n      options.chars && options.chars(html);\n      if (process.env.NODE_ENV !== 'production' && !stack.length && options.warn) {\n        options.warn((\"Mal-formatted tag at end of template: \\\"\" + html + \"\\\"\"), { start: index + html.length });\n      }\n      break\n    }\n  }\n\n  // Clean up any remaining tags\n  parseEndTag();\n\n  function advance (n) {\n    index += n;\n    html = html.substring(n);\n  }\n\n  function parseStartTag () {\n    var start = html.match(startTagOpen);\n    if (start) {\n      var match = {\n        tagName: start[1],\n        attrs: [],\n        start: index\n      };\n      advance(start[0].length);\n      var end, attr;\n      while (!(end = html.match(startTagClose)) && (attr = html.match(dynamicArgAttribute) || html.match(attribute))) {\n        attr.start = index;\n        advance(attr[0].length);\n        attr.end = index;\n        match.attrs.push(attr);\n      }\n      if (end) {\n        match.unarySlash = end[1];\n        advance(end[0].length);\n        match.end = index;\n        return match\n      }\n    }\n  }\n\n  function handleStartTag (match) {\n    var tagName = match.tagName;\n    var unarySlash = match.unarySlash;\n\n    if (expectHTML) {\n      if (lastTag === 'p' && isNonPhrasingTag(tagName)) {\n        parseEndTag(lastTag);\n      }\n      if (canBeLeftOpenTag$$1(tagName) && lastTag === tagName) {\n        parseEndTag(tagName);\n      }\n    }\n\n    var unary = isUnaryTag$$1(tagName) || !!unarySlash;\n\n    var l = match.attrs.length;\n    var attrs = new Array(l);\n    for (var i = 0; i < l; i++) {\n      var args = match.attrs[i];\n      var value = args[3] || args[4] || args[5] || '';\n      var shouldDecodeNewlines = tagName === 'a' && args[1] === 'href'\n        ? options.shouldDecodeNewlinesForHref\n        : options.shouldDecodeNewlines;\n      attrs[i] = {\n        name: args[1],\n        value: decodeAttr(value, shouldDecodeNewlines)\n      };\n      if (process.env.NODE_ENV !== 'production' && options.outputSourceRange) {\n        attrs[i].start = args.start + args[0].match(/^\\s*/).length;\n        attrs[i].end = args.end;\n      }\n    }\n\n    if (!unary) {\n      stack.push({ tag: tagName, lowerCasedTag: tagName.toLowerCase(), attrs: attrs, start: match.start, end: match.end });\n      lastTag = tagName;\n    }\n\n    if (options.start) {\n      options.start(tagName, attrs, unary, match.start, match.end);\n    }\n  }\n\n  function parseEndTag (tagName, start, end) {\n    var pos, lowerCasedTagName;\n    if (start == null) { start = index; }\n    if (end == null) { end = index; }\n\n    // Find the closest opened tag of the same type\n    if (tagName) {\n      lowerCasedTagName = tagName.toLowerCase();\n      for (pos = stack.length - 1; pos >= 0; pos--) {\n        if (stack[pos].lowerCasedTag === lowerCasedTagName) {\n          break\n        }\n      }\n    } else {\n      // If no tag name is provided, clean shop\n      pos = 0;\n    }\n\n    if (pos >= 0) {\n      // Close all the open elements, up the stack\n      for (var i = stack.length - 1; i >= pos; i--) {\n        if (process.env.NODE_ENV !== 'production' &&\n          (i > pos || !tagName) &&\n          options.warn\n        ) {\n          options.warn(\n            (\"tag <\" + (stack[i].tag) + \"> has no matching end tag.\"),\n            { start: stack[i].start, end: stack[i].end }\n          );\n        }\n        if (options.end) {\n          options.end(stack[i].tag, start, end);\n        }\n      }\n\n      // Remove the open elements from the stack\n      stack.length = pos;\n      lastTag = pos && stack[pos - 1].tag;\n    } else if (lowerCasedTagName === 'br') {\n      if (options.start) {\n        options.start(tagName, [], true, start, end);\n      }\n    } else if (lowerCasedTagName === 'p') {\n      if (options.start) {\n        options.start(tagName, [], false, start, end);\n      }\n      if (options.end) {\n        options.end(tagName, start, end);\n      }\n    }\n  }\n}\n\n/*  */\n\nvar onRE = /^@|^v-on:/;\nvar dirRE = /^v-|^@|^:|^#/;\nvar forAliasRE = /([\\s\\S]*?)\\s+(?:in|of)\\s+([\\s\\S]*)/;\nvar forIteratorRE = /,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/;\nvar stripParensRE = /^\\(|\\)$/g;\nvar dynamicArgRE = /^\\[.*\\]$/;\n\nvar argRE = /:(.*)$/;\nvar bindRE = /^:|^\\.|^v-bind:/;\nvar modifierRE = /\\.[^.\\]]+(?=[^\\]]*$)/g;\n\nvar slotRE = /^v-slot(:|$)|^#/;\n\nvar lineBreakRE = /[\\r\\n]/;\nvar whitespaceRE$1 = /\\s+/g;\n\nvar invalidAttributeRE = /[\\s\"'<>\\/=]/;\n\nvar decodeHTMLCached = cached(he.decode);\n\nvar emptySlotScopeToken = \"_empty_\";\n\n// configurable state\nvar warn$2;\nvar delimiters;\nvar transforms;\nvar preTransforms;\nvar postTransforms;\nvar platformIsPreTag;\nvar platformMustUseProp;\nvar platformGetTagNamespace;\nvar maybeComponent;\n\nfunction createASTElement (\n  tag,\n  attrs,\n  parent\n) {\n  return {\n    type: 1,\n    tag: tag,\n    attrsList: attrs,\n    attrsMap: makeAttrsMap(attrs),\n    rawAttrsMap: {},\n    parent: parent,\n    children: []\n  }\n}\n\n/**\n * Convert HTML string to AST.\n */\nfunction parse (\n  template,\n  options\n) {\n  warn$2 = options.warn || baseWarn;\n\n  platformIsPreTag = options.isPreTag || no;\n  platformMustUseProp = options.mustUseProp || no;\n  platformGetTagNamespace = options.getTagNamespace || no;\n  var isReservedTag = options.isReservedTag || no;\n  maybeComponent = function (el) { return !!el.component || !isReservedTag(el.tag); };\n\n  transforms = pluckModuleFunction(options.modules, 'transformNode');\n  preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');\n  postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');\n\n  delimiters = options.delimiters;\n\n  var stack = [];\n  var preserveWhitespace = options.preserveWhitespace !== false;\n  var whitespaceOption = options.whitespace;\n  var root;\n  var currentParent;\n  var inVPre = false;\n  var inPre = false;\n  var warned = false;\n\n  function warnOnce (msg, range) {\n    if (!warned) {\n      warned = true;\n      warn$2(msg, range);\n    }\n  }\n\n  function closeElement (element) {\n    trimEndingWhitespace(element);\n    if (!inVPre && !element.processed) {\n      element = processElement(element, options);\n    }\n    // tree management\n    if (!stack.length && element !== root) {\n      // allow root elements with v-if, v-else-if and v-else\n      if (root.if && (element.elseif || element.else)) {\n        if (process.env.NODE_ENV !== 'production') {\n          checkRootConstraints(element);\n        }\n        addIfCondition(root, {\n          exp: element.elseif,\n          block: element\n        });\n      } else if (process.env.NODE_ENV !== 'production') {\n        warnOnce(\n          \"Component template should contain exactly one root element. \" +\n          \"If you are using v-if on multiple elements, \" +\n          \"use v-else-if to chain them instead.\",\n          { start: element.start }\n        );\n      }\n    }\n    if (currentParent && !element.forbidden) {\n      if (element.elseif || element.else) {\n        processIfConditions(element, currentParent);\n      } else {\n        if (element.slotScope) {\n          // scoped slot\n          // keep it in the children list so that v-else(-if) conditions can\n          // find it as the prev node.\n          var name = element.slotTarget || '\"default\"'\n          ;(currentParent.scopedSlots || (currentParent.scopedSlots = {}))[name] = element;\n        }\n        currentParent.children.push(element);\n        element.parent = currentParent;\n      }\n    }\n\n    // final children cleanup\n    // filter out scoped slots\n    element.children = element.children.filter(function (c) { return !(c).slotScope; });\n    // remove trailing whitespace node again\n    trimEndingWhitespace(element);\n\n    // check pre state\n    if (element.pre) {\n      inVPre = false;\n    }\n    if (platformIsPreTag(element.tag)) {\n      inPre = false;\n    }\n    // apply post-transforms\n    for (var i = 0; i < postTransforms.length; i++) {\n      postTransforms[i](element, options);\n    }\n  }\n\n  function trimEndingWhitespace (el) {\n    // remove trailing whitespace node\n    if (!inPre) {\n      var lastNode;\n      while (\n        (lastNode = el.children[el.children.length - 1]) &&\n        lastNode.type === 3 &&\n        lastNode.text === ' '\n      ) {\n        el.children.pop();\n      }\n    }\n  }\n\n  function checkRootConstraints (el) {\n    if (el.tag === 'slot' || el.tag === 'template') {\n      warnOnce(\n        \"Cannot use <\" + (el.tag) + \"> as component root element because it may \" +\n        'contain multiple nodes.',\n        { start: el.start }\n      );\n    }\n    if (el.attrsMap.hasOwnProperty('v-for')) {\n      warnOnce(\n        'Cannot use v-for on stateful component root element because ' +\n        'it renders multiple elements.',\n        el.rawAttrsMap['v-for']\n      );\n    }\n  }\n\n  parseHTML(template, {\n    warn: warn$2,\n    expectHTML: options.expectHTML,\n    isUnaryTag: options.isUnaryTag,\n    canBeLeftOpenTag: options.canBeLeftOpenTag,\n    shouldDecodeNewlines: options.shouldDecodeNewlines,\n    shouldDecodeNewlinesForHref: options.shouldDecodeNewlinesForHref,\n    shouldKeepComment: options.comments,\n    outputSourceRange: options.outputSourceRange,\n    start: function start (tag, attrs, unary, start$1, end) {\n      // check namespace.\n      // inherit parent ns if there is one\n      var ns = (currentParent && currentParent.ns) || platformGetTagNamespace(tag);\n\n      // handle IE svg bug\n      /* istanbul ignore if */\n      if (isIE && ns === 'svg') {\n        attrs = guardIESVGBug(attrs);\n      }\n\n      var element = createASTElement(tag, attrs, currentParent);\n      if (ns) {\n        element.ns = ns;\n      }\n\n      if (process.env.NODE_ENV !== 'production') {\n        if (options.outputSourceRange) {\n          element.start = start$1;\n          element.end = end;\n          element.rawAttrsMap = element.attrsList.reduce(function (cumulated, attr) {\n            cumulated[attr.name] = attr;\n            return cumulated\n          }, {});\n        }\n        attrs.forEach(function (attr) {\n          if (invalidAttributeRE.test(attr.name)) {\n            warn$2(\n              \"Invalid dynamic argument expression: attribute names cannot contain \" +\n              \"spaces, quotes, <, >, / or =.\",\n              {\n                start: attr.start + attr.name.indexOf(\"[\"),\n                end: attr.start + attr.name.length\n              }\n            );\n          }\n        });\n      }\n\n      if (isForbiddenTag(element) && !isServerRendering()) {\n        element.forbidden = true;\n        process.env.NODE_ENV !== 'production' && warn$2(\n          'Templates should only be responsible for mapping the state to the ' +\n          'UI. Avoid placing tags with side-effects in your templates, such as ' +\n          \"<\" + tag + \">\" + ', as they will not be parsed.',\n          { start: element.start }\n        );\n      }\n\n      // apply pre-transforms\n      for (var i = 0; i < preTransforms.length; i++) {\n        element = preTransforms[i](element, options) || element;\n      }\n\n      if (!inVPre) {\n        processPre(element);\n        if (element.pre) {\n          inVPre = true;\n        }\n      }\n      if (platformIsPreTag(element.tag)) {\n        inPre = true;\n      }\n      if (inVPre) {\n        processRawAttrs(element);\n      } else if (!element.processed) {\n        // structural directives\n        processFor(element);\n        processIf(element);\n        processOnce(element);\n      }\n\n      if (!root) {\n        root = element;\n        if (process.env.NODE_ENV !== 'production') {\n          checkRootConstraints(root);\n        }\n      }\n\n      if (!unary) {\n        currentParent = element;\n        stack.push(element);\n      } else {\n        closeElement(element);\n      }\n    },\n\n    end: function end (tag, start, end$1) {\n      var element = stack[stack.length - 1];\n      // pop stack\n      stack.length -= 1;\n      currentParent = stack[stack.length - 1];\n      if (process.env.NODE_ENV !== 'production' && options.outputSourceRange) {\n        element.end = end$1;\n      }\n      closeElement(element);\n    },\n\n    chars: function chars (text, start, end) {\n      if (!currentParent) {\n        if (process.env.NODE_ENV !== 'production') {\n          if (text === template) {\n            warnOnce(\n              'Component template requires a root element, rather than just text.',\n              { start: start }\n            );\n          } else if ((text = text.trim())) {\n            warnOnce(\n              (\"text \\\"\" + text + \"\\\" outside root element will be ignored.\"),\n              { start: start }\n            );\n          }\n        }\n        return\n      }\n      // IE textarea placeholder bug\n      /* istanbul ignore if */\n      if (isIE &&\n        currentParent.tag === 'textarea' &&\n        currentParent.attrsMap.placeholder === text\n      ) {\n        return\n      }\n      var children = currentParent.children;\n      if (inPre || text.trim()) {\n        text = isTextTag(currentParent) ? text : decodeHTMLCached(text);\n      } else if (!children.length) {\n        // remove the whitespace-only node right after an opening tag\n        text = '';\n      } else if (whitespaceOption) {\n        if (whitespaceOption === 'condense') {\n          // in condense mode, remove the whitespace node if it contains\n          // line break, otherwise condense to a single space\n          text = lineBreakRE.test(text) ? '' : ' ';\n        } else {\n          text = ' ';\n        }\n      } else {\n        text = preserveWhitespace ? ' ' : '';\n      }\n      if (text) {\n        if (!inPre && whitespaceOption === 'condense') {\n          // condense consecutive whitespaces into single space\n          text = text.replace(whitespaceRE$1, ' ');\n        }\n        var res;\n        var child;\n        if (!inVPre && text !== ' ' && (res = parseText(text, delimiters))) {\n          child = {\n            type: 2,\n            expression: res.expression,\n            tokens: res.tokens,\n            text: text\n          };\n        } else if (text !== ' ' || !children.length || children[children.length - 1].text !== ' ') {\n          child = {\n            type: 3,\n            text: text\n          };\n        }\n        if (child) {\n          if (process.env.NODE_ENV !== 'production' && options.outputSourceRange) {\n            child.start = start;\n            child.end = end;\n          }\n          children.push(child);\n        }\n      }\n    },\n    comment: function comment (text, start, end) {\n      // adding anyting as a sibling to the root node is forbidden\n      // comments should still be allowed, but ignored\n      if (currentParent) {\n        var child = {\n          type: 3,\n          text: text,\n          isComment: true\n        };\n        if (process.env.NODE_ENV !== 'production' && options.outputSourceRange) {\n          child.start = start;\n          child.end = end;\n        }\n        currentParent.children.push(child);\n      }\n    }\n  });\n  return root\n}\n\nfunction processPre (el) {\n  if (getAndRemoveAttr(el, 'v-pre') != null) {\n    el.pre = true;\n  }\n}\n\nfunction processRawAttrs (el) {\n  var list = el.attrsList;\n  var len = list.length;\n  if (len) {\n    var attrs = el.attrs = new Array(len);\n    for (var i = 0; i < len; i++) {\n      attrs[i] = {\n        name: list[i].name,\n        value: JSON.stringify(list[i].value)\n      };\n      if (list[i].start != null) {\n        attrs[i].start = list[i].start;\n        attrs[i].end = list[i].end;\n      }\n    }\n  } else if (!el.pre) {\n    // non root node in pre blocks with no attributes\n    el.plain = true;\n  }\n}\n\nfunction processElement (\n  element,\n  options\n) {\n  processKey(element);\n\n  // determine whether this is a plain element after\n  // removing structural attributes\n  element.plain = (\n    !element.key &&\n    !element.scopedSlots &&\n    !element.attrsList.length\n  );\n\n  processRef(element);\n  processSlotContent(element);\n  processSlotOutlet(element);\n  processComponent(element);\n  for (var i = 0; i < transforms.length; i++) {\n    element = transforms[i](element, options) || element;\n  }\n  processAttrs(element);\n  return element\n}\n\nfunction processKey (el) {\n  var exp = getBindingAttr(el, 'key');\n  if (exp) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (el.tag === 'template') {\n        warn$2(\n          \"<template> cannot be keyed. Place the key on real elements instead.\",\n          getRawBindingAttr(el, 'key')\n        );\n      }\n      if (el.for) {\n        var iterator = el.iterator2 || el.iterator1;\n        var parent = el.parent;\n        if (iterator && iterator === exp && parent && parent.tag === 'transition-group') {\n          warn$2(\n            \"Do not use v-for index as key on <transition-group> children, \" +\n            \"this is the same as not using keys.\",\n            getRawBindingAttr(el, 'key'),\n            true /* tip */\n          );\n        }\n      }\n    }\n    el.key = exp;\n  }\n}\n\nfunction processRef (el) {\n  var ref = getBindingAttr(el, 'ref');\n  if (ref) {\n    el.ref = ref;\n    el.refInFor = checkInFor(el);\n  }\n}\n\nfunction processFor (el) {\n  var exp;\n  if ((exp = getAndRemoveAttr(el, 'v-for'))) {\n    var res = parseFor(exp);\n    if (res) {\n      extend(el, res);\n    } else if (process.env.NODE_ENV !== 'production') {\n      warn$2(\n        (\"Invalid v-for expression: \" + exp),\n        el.rawAttrsMap['v-for']\n      );\n    }\n  }\n}\n\n\n\nfunction parseFor (exp) {\n  var inMatch = exp.match(forAliasRE);\n  if (!inMatch) { return }\n  var res = {};\n  res.for = inMatch[2].trim();\n  var alias = inMatch[1].trim().replace(stripParensRE, '');\n  var iteratorMatch = alias.match(forIteratorRE);\n  if (iteratorMatch) {\n    res.alias = alias.replace(forIteratorRE, '').trim();\n    res.iterator1 = iteratorMatch[1].trim();\n    if (iteratorMatch[2]) {\n      res.iterator2 = iteratorMatch[2].trim();\n    }\n  } else {\n    res.alias = alias;\n  }\n  return res\n}\n\nfunction processIf (el) {\n  var exp = getAndRemoveAttr(el, 'v-if');\n  if (exp) {\n    el.if = exp;\n    addIfCondition(el, {\n      exp: exp,\n      block: el\n    });\n  } else {\n    if (getAndRemoveAttr(el, 'v-else') != null) {\n      el.else = true;\n    }\n    var elseif = getAndRemoveAttr(el, 'v-else-if');\n    if (elseif) {\n      el.elseif = elseif;\n    }\n  }\n}\n\nfunction processIfConditions (el, parent) {\n  var prev = findPrevElement(parent.children);\n  if (prev && prev.if) {\n    addIfCondition(prev, {\n      exp: el.elseif,\n      block: el\n    });\n  } else if (process.env.NODE_ENV !== 'production') {\n    warn$2(\n      \"v-\" + (el.elseif ? ('else-if=\"' + el.elseif + '\"') : 'else') + \" \" +\n      \"used on element <\" + (el.tag) + \"> without corresponding v-if.\",\n      el.rawAttrsMap[el.elseif ? 'v-else-if' : 'v-else']\n    );\n  }\n}\n\nfunction findPrevElement (children) {\n  var i = children.length;\n  while (i--) {\n    if (children[i].type === 1) {\n      return children[i]\n    } else {\n      if (process.env.NODE_ENV !== 'production' && children[i].text !== ' ') {\n        warn$2(\n          \"text \\\"\" + (children[i].text.trim()) + \"\\\" between v-if and v-else(-if) \" +\n          \"will be ignored.\",\n          children[i]\n        );\n      }\n      children.pop();\n    }\n  }\n}\n\nfunction addIfCondition (el, condition) {\n  if (!el.ifConditions) {\n    el.ifConditions = [];\n  }\n  el.ifConditions.push(condition);\n}\n\nfunction processOnce (el) {\n  var once$$1 = getAndRemoveAttr(el, 'v-once');\n  if (once$$1 != null) {\n    el.once = true;\n  }\n}\n\n// handle content being passed to a component as slot,\n// e.g. <template slot=\"xxx\">, <div slot-scope=\"xxx\">\nfunction processSlotContent (el) {\n  var slotScope;\n  if (el.tag === 'template') {\n    slotScope = getAndRemoveAttr(el, 'scope');\n    /* istanbul ignore if */\n    if (process.env.NODE_ENV !== 'production' && slotScope) {\n      warn$2(\n        \"the \\\"scope\\\" attribute for scoped slots have been deprecated and \" +\n        \"replaced by \\\"slot-scope\\\" since 2.5. The new \\\"slot-scope\\\" attribute \" +\n        \"can also be used on plain elements in addition to <template> to \" +\n        \"denote scoped slots.\",\n        el.rawAttrsMap['scope'],\n        true\n      );\n    }\n    el.slotScope = slotScope || getAndRemoveAttr(el, 'slot-scope');\n  } else if ((slotScope = getAndRemoveAttr(el, 'slot-scope'))) {\n    /* istanbul ignore if */\n    if (process.env.NODE_ENV !== 'production' && el.attrsMap['v-for']) {\n      warn$2(\n        \"Ambiguous combined usage of slot-scope and v-for on <\" + (el.tag) + \"> \" +\n        \"(v-for takes higher priority). Use a wrapper <template> for the \" +\n        \"scoped slot to make it clearer.\",\n        el.rawAttrsMap['slot-scope'],\n        true\n      );\n    }\n    el.slotScope = slotScope;\n  }\n\n  // slot=\"xxx\"\n  var slotTarget = getBindingAttr(el, 'slot');\n  if (slotTarget) {\n    el.slotTarget = slotTarget === '\"\"' ? '\"default\"' : slotTarget;\n    el.slotTargetDynamic = !!(el.attrsMap[':slot'] || el.attrsMap['v-bind:slot']);\n    // preserve slot as an attribute for native shadow DOM compat\n    // only for non-scoped slots.\n    if (el.tag !== 'template' && !el.slotScope) {\n      addAttr(el, 'slot', slotTarget, getRawBindingAttr(el, 'slot'));\n    }\n  }\n\n  // 2.6 v-slot syntax\n  {\n    if (el.tag === 'template') {\n      // v-slot on <template>\n      var slotBinding = getAndRemoveAttrByRegex(el, slotRE);\n      if (slotBinding) {\n        if (process.env.NODE_ENV !== 'production') {\n          if (el.slotTarget || el.slotScope) {\n            warn$2(\n              \"Unexpected mixed usage of different slot syntaxes.\",\n              el\n            );\n          }\n          if (el.parent && !maybeComponent(el.parent)) {\n            warn$2(\n              \"<template v-slot> can only appear at the root level inside \" +\n              \"the receiving component\",\n              el\n            );\n          }\n        }\n        var ref = getSlotName(slotBinding);\n        var name = ref.name;\n        var dynamic = ref.dynamic;\n        el.slotTarget = name;\n        el.slotTargetDynamic = dynamic;\n        el.slotScope = slotBinding.value || emptySlotScopeToken; // force it into a scoped slot for perf\n      }\n    } else {\n      // v-slot on component, denotes default slot\n      var slotBinding$1 = getAndRemoveAttrByRegex(el, slotRE);\n      if (slotBinding$1) {\n        if (process.env.NODE_ENV !== 'production') {\n          if (!maybeComponent(el)) {\n            warn$2(\n              \"v-slot can only be used on components or <template>.\",\n              slotBinding$1\n            );\n          }\n          if (el.slotScope || el.slotTarget) {\n            warn$2(\n              \"Unexpected mixed usage of different slot syntaxes.\",\n              el\n            );\n          }\n          if (el.scopedSlots) {\n            warn$2(\n              \"To avoid scope ambiguity, the default slot should also use \" +\n              \"<template> syntax when there are other named slots.\",\n              slotBinding$1\n            );\n          }\n        }\n        // add the component's children to its default slot\n        var slots = el.scopedSlots || (el.scopedSlots = {});\n        var ref$1 = getSlotName(slotBinding$1);\n        var name$1 = ref$1.name;\n        var dynamic$1 = ref$1.dynamic;\n        var slotContainer = slots[name$1] = createASTElement('template', [], el);\n        slotContainer.slotTarget = name$1;\n        slotContainer.slotTargetDynamic = dynamic$1;\n        slotContainer.children = el.children.filter(function (c) {\n          if (!c.slotScope) {\n            c.parent = slotContainer;\n            return true\n          }\n        });\n        slotContainer.slotScope = slotBinding$1.value || emptySlotScopeToken;\n        // remove children as they are returned from scopedSlots now\n        el.children = [];\n        // mark el non-plain so data gets generated\n        el.plain = false;\n      }\n    }\n  }\n}\n\nfunction getSlotName (binding) {\n  var name = binding.name.replace(slotRE, '');\n  if (!name) {\n    if (binding.name[0] !== '#') {\n      name = 'default';\n    } else if (process.env.NODE_ENV !== 'production') {\n      warn$2(\n        \"v-slot shorthand syntax requires a slot name.\",\n        binding\n      );\n    }\n  }\n  return dynamicArgRE.test(name)\n    // dynamic [name]\n    ? { name: name.slice(1, -1), dynamic: true }\n    // static name\n    : { name: (\"\\\"\" + name + \"\\\"\"), dynamic: false }\n}\n\n// handle <slot/> outlets\nfunction processSlotOutlet (el) {\n  if (el.tag === 'slot') {\n    el.slotName = getBindingAttr(el, 'name');\n    if (process.env.NODE_ENV !== 'production' && el.key) {\n      warn$2(\n        \"`key` does not work on <slot> because slots are abstract outlets \" +\n        \"and can possibly expand into multiple elements. \" +\n        \"Use the key on a wrapping element instead.\",\n        getRawBindingAttr(el, 'key')\n      );\n    }\n  }\n}\n\nfunction processComponent (el) {\n  var binding;\n  if ((binding = getBindingAttr(el, 'is'))) {\n    el.component = binding;\n  }\n  if (getAndRemoveAttr(el, 'inline-template') != null) {\n    el.inlineTemplate = true;\n  }\n}\n\nfunction processAttrs (el) {\n  var list = el.attrsList;\n  var i, l, name, rawName, value, modifiers, syncGen, isDynamic;\n  for (i = 0, l = list.length; i < l; i++) {\n    name = rawName = list[i].name;\n    value = list[i].value;\n    if (dirRE.test(name)) {\n      // mark element as dynamic\n      el.hasBindings = true;\n      // modifiers\n      modifiers = parseModifiers(name.replace(dirRE, ''));\n      // support .foo shorthand syntax for the .prop modifier\n      if (modifiers) {\n        name = name.replace(modifierRE, '');\n      }\n      if (bindRE.test(name)) { // v-bind\n        name = name.replace(bindRE, '');\n        value = parseFilters(value);\n        isDynamic = dynamicArgRE.test(name);\n        if (isDynamic) {\n          name = name.slice(1, -1);\n        }\n        if (\n          process.env.NODE_ENV !== 'production' &&\n          value.trim().length === 0\n        ) {\n          warn$2(\n            (\"The value for a v-bind expression cannot be empty. Found in \\\"v-bind:\" + name + \"\\\"\")\n          );\n        }\n        if (modifiers) {\n          if (modifiers.prop && !isDynamic) {\n            name = camelize(name);\n            if (name === 'innerHtml') { name = 'innerHTML'; }\n          }\n          if (modifiers.camel && !isDynamic) {\n            name = camelize(name);\n          }\n          if (modifiers.sync) {\n            syncGen = genAssignmentCode(value, \"$event\");\n            if (!isDynamic) {\n              addHandler(\n                el,\n                (\"update:\" + (camelize(name))),\n                syncGen,\n                null,\n                false,\n                warn$2,\n                list[i]\n              );\n              if (hyphenate(name) !== camelize(name)) {\n                addHandler(\n                  el,\n                  (\"update:\" + (hyphenate(name))),\n                  syncGen,\n                  null,\n                  false,\n                  warn$2,\n                  list[i]\n                );\n              }\n            } else {\n              // handler w/ dynamic event name\n              addHandler(\n                el,\n                (\"\\\"update:\\\"+(\" + name + \")\"),\n                syncGen,\n                null,\n                false,\n                warn$2,\n                list[i],\n                true // dynamic\n              );\n            }\n          }\n        }\n        if ((modifiers && modifiers.prop) || (\n          !el.component && platformMustUseProp(el.tag, el.attrsMap.type, name)\n        )) {\n          addProp(el, name, value, list[i], isDynamic);\n        } else {\n          addAttr(el, name, value, list[i], isDynamic);\n        }\n      } else if (onRE.test(name)) { // v-on\n        name = name.replace(onRE, '');\n        isDynamic = dynamicArgRE.test(name);\n        if (isDynamic) {\n          name = name.slice(1, -1);\n        }\n        addHandler(el, name, value, modifiers, false, warn$2, list[i], isDynamic);\n      } else { // normal directives\n        name = name.replace(dirRE, '');\n        // parse arg\n        var argMatch = name.match(argRE);\n        var arg = argMatch && argMatch[1];\n        isDynamic = false;\n        if (arg) {\n          name = name.slice(0, -(arg.length + 1));\n          if (dynamicArgRE.test(arg)) {\n            arg = arg.slice(1, -1);\n            isDynamic = true;\n          }\n        }\n        addDirective(el, name, rawName, value, arg, isDynamic, modifiers, list[i]);\n        if (process.env.NODE_ENV !== 'production' && name === 'model') {\n          checkForAliasModel(el, value);\n        }\n      }\n    } else {\n      // literal attribute\n      if (process.env.NODE_ENV !== 'production') {\n        var res = parseText(value, delimiters);\n        if (res) {\n          warn$2(\n            name + \"=\\\"\" + value + \"\\\": \" +\n            'Interpolation inside attributes has been removed. ' +\n            'Use v-bind or the colon shorthand instead. For example, ' +\n            'instead of <div id=\"{{ val }}\">, use <div :id=\"val\">.',\n            list[i]\n          );\n        }\n      }\n      addAttr(el, name, JSON.stringify(value), list[i]);\n      // #6887 firefox doesn't update muted state if set via attribute\n      // even immediately after element creation\n      if (!el.component &&\n          name === 'muted' &&\n          platformMustUseProp(el.tag, el.attrsMap.type, name)) {\n        addProp(el, name, 'true', list[i]);\n      }\n    }\n  }\n}\n\nfunction checkInFor (el) {\n  var parent = el;\n  while (parent) {\n    if (parent.for !== undefined) {\n      return true\n    }\n    parent = parent.parent;\n  }\n  return false\n}\n\nfunction parseModifiers (name) {\n  var match = name.match(modifierRE);\n  if (match) {\n    var ret = {};\n    match.forEach(function (m) { ret[m.slice(1)] = true; });\n    return ret\n  }\n}\n\nfunction makeAttrsMap (attrs) {\n  var map = {};\n  for (var i = 0, l = attrs.length; i < l; i++) {\n    if (\n      process.env.NODE_ENV !== 'production' &&\n      map[attrs[i].name] && !isIE && !isEdge\n    ) {\n      warn$2('duplicate attribute: ' + attrs[i].name, attrs[i]);\n    }\n    map[attrs[i].name] = attrs[i].value;\n  }\n  return map\n}\n\n// for script (e.g. type=\"x/template\") or style, do not decode content\nfunction isTextTag (el) {\n  return el.tag === 'script' || el.tag === 'style'\n}\n\nfunction isForbiddenTag (el) {\n  return (\n    el.tag === 'style' ||\n    (el.tag === 'script' && (\n      !el.attrsMap.type ||\n      el.attrsMap.type === 'text/javascript'\n    ))\n  )\n}\n\nvar ieNSBug = /^xmlns:NS\\d+/;\nvar ieNSPrefix = /^NS\\d+:/;\n\n/* istanbul ignore next */\nfunction guardIESVGBug (attrs) {\n  var res = [];\n  for (var i = 0; i < attrs.length; i++) {\n    var attr = attrs[i];\n    if (!ieNSBug.test(attr.name)) {\n      attr.name = attr.name.replace(ieNSPrefix, '');\n      res.push(attr);\n    }\n  }\n  return res\n}\n\nfunction checkForAliasModel (el, value) {\n  var _el = el;\n  while (_el) {\n    if (_el.for && _el.alias === value) {\n      warn$2(\n        \"<\" + (el.tag) + \" v-model=\\\"\" + value + \"\\\">: \" +\n        \"You are binding v-model directly to a v-for iteration alias. \" +\n        \"This will not be able to modify the v-for source array because \" +\n        \"writing to the alias is like modifying a function local variable. \" +\n        \"Consider using an array of objects and use v-model on an object property instead.\",\n        el.rawAttrsMap['v-model']\n      );\n    }\n    _el = _el.parent;\n  }\n}\n\n/*  */\n\nfunction preTransformNode (el, options) {\n  if (el.tag === 'input') {\n    var map = el.attrsMap;\n    if (!map['v-model']) {\n      return\n    }\n\n    var typeBinding;\n    if (map[':type'] || map['v-bind:type']) {\n      typeBinding = getBindingAttr(el, 'type');\n    }\n    if (!map.type && !typeBinding && map['v-bind']) {\n      typeBinding = \"(\" + (map['v-bind']) + \").type\";\n    }\n\n    if (typeBinding) {\n      var ifCondition = getAndRemoveAttr(el, 'v-if', true);\n      var ifConditionExtra = ifCondition ? (\"&&(\" + ifCondition + \")\") : \"\";\n      var hasElse = getAndRemoveAttr(el, 'v-else', true) != null;\n      var elseIfCondition = getAndRemoveAttr(el, 'v-else-if', true);\n      // 1. checkbox\n      var branch0 = cloneASTElement(el);\n      // process for on the main node\n      processFor(branch0);\n      addRawAttr(branch0, 'type', 'checkbox');\n      processElement(branch0, options);\n      branch0.processed = true; // prevent it from double-processed\n      branch0.if = \"(\" + typeBinding + \")==='checkbox'\" + ifConditionExtra;\n      addIfCondition(branch0, {\n        exp: branch0.if,\n        block: branch0\n      });\n      // 2. add radio else-if condition\n      var branch1 = cloneASTElement(el);\n      getAndRemoveAttr(branch1, 'v-for', true);\n      addRawAttr(branch1, 'type', 'radio');\n      processElement(branch1, options);\n      addIfCondition(branch0, {\n        exp: \"(\" + typeBinding + \")==='radio'\" + ifConditionExtra,\n        block: branch1\n      });\n      // 3. other\n      var branch2 = cloneASTElement(el);\n      getAndRemoveAttr(branch2, 'v-for', true);\n      addRawAttr(branch2, ':type', typeBinding);\n      processElement(branch2, options);\n      addIfCondition(branch0, {\n        exp: ifCondition,\n        block: branch2\n      });\n\n      if (hasElse) {\n        branch0.else = true;\n      } else if (elseIfCondition) {\n        branch0.elseif = elseIfCondition;\n      }\n\n      return branch0\n    }\n  }\n}\n\nfunction cloneASTElement (el) {\n  return createASTElement(el.tag, el.attrsList.slice(), el.parent)\n}\n\nvar model$1 = {\n  preTransformNode: preTransformNode\n};\n\nvar modules$1 = [\n  klass$1,\n  style$1,\n  model$1\n];\n\n/*  */\n\nfunction text (el, dir) {\n  if (dir.value) {\n    addProp(el, 'textContent', (\"_s(\" + (dir.value) + \")\"), dir);\n  }\n}\n\n/*  */\n\nfunction html (el, dir) {\n  if (dir.value) {\n    addProp(el, 'innerHTML', (\"_s(\" + (dir.value) + \")\"), dir);\n  }\n}\n\nvar directives$1 = {\n  model: model,\n  text: text,\n  html: html\n};\n\n/*  */\n\nvar baseOptions = {\n  expectHTML: true,\n  modules: modules$1,\n  directives: directives$1,\n  isPreTag: isPreTag,\n  isUnaryTag: isUnaryTag,\n  mustUseProp: mustUseProp,\n  canBeLeftOpenTag: canBeLeftOpenTag,\n  isReservedTag: isReservedTag,\n  getTagNamespace: getTagNamespace,\n  staticKeys: genStaticKeys(modules$1)\n};\n\n/*  */\n\nvar isStaticKey;\nvar isPlatformReservedTag;\n\nvar genStaticKeysCached = cached(genStaticKeys$1);\n\n/**\n * Goal of the optimizer: walk the generated template AST tree\n * and detect sub-trees that are purely static, i.e. parts of\n * the DOM that never needs to change.\n *\n * Once we detect these sub-trees, we can:\n *\n * 1. Hoist them into constants, so that we no longer need to\n *    create fresh nodes for them on each re-render;\n * 2. Completely skip them in the patching process.\n */\nfunction optimize (root, options) {\n  if (!root) { return }\n  isStaticKey = genStaticKeysCached(options.staticKeys || '');\n  isPlatformReservedTag = options.isReservedTag || no;\n  // first pass: mark all non-static nodes.\n  markStatic$1(root);\n  // second pass: mark static roots.\n  markStaticRoots(root, false);\n}\n\nfunction genStaticKeys$1 (keys) {\n  return makeMap(\n    'type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap' +\n    (keys ? ',' + keys : '')\n  )\n}\n\nfunction markStatic$1 (node) {\n  node.static = isStatic(node);\n  if (node.type === 1) {\n    // do not make component slot content static. this avoids\n    // 1. components not able to mutate slot nodes\n    // 2. static slot content fails for hot-reloading\n    if (\n      !isPlatformReservedTag(node.tag) &&\n      node.tag !== 'slot' &&\n      node.attrsMap['inline-template'] == null\n    ) {\n      return\n    }\n    for (var i = 0, l = node.children.length; i < l; i++) {\n      var child = node.children[i];\n      markStatic$1(child);\n      if (!child.static) {\n        node.static = false;\n      }\n    }\n    if (node.ifConditions) {\n      for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {\n        var block = node.ifConditions[i$1].block;\n        markStatic$1(block);\n        if (!block.static) {\n          node.static = false;\n        }\n      }\n    }\n  }\n}\n\nfunction markStaticRoots (node, isInFor) {\n  if (node.type === 1) {\n    if (node.static || node.once) {\n      node.staticInFor = isInFor;\n    }\n    // For a node to qualify as a static root, it should have children that\n    // are not just static text. Otherwise the cost of hoisting out will\n    // outweigh the benefits and it's better off to just always render it fresh.\n    if (node.static && node.children.length && !(\n      node.children.length === 1 &&\n      node.children[0].type === 3\n    )) {\n      node.staticRoot = true;\n      return\n    } else {\n      node.staticRoot = false;\n    }\n    if (node.children) {\n      for (var i = 0, l = node.children.length; i < l; i++) {\n        markStaticRoots(node.children[i], isInFor || !!node.for);\n      }\n    }\n    if (node.ifConditions) {\n      for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {\n        markStaticRoots(node.ifConditions[i$1].block, isInFor);\n      }\n    }\n  }\n}\n\nfunction isStatic (node) {\n  if (node.type === 2) { // expression\n    return false\n  }\n  if (node.type === 3) { // text\n    return true\n  }\n  return !!(node.pre || (\n    !node.hasBindings && // no dynamic bindings\n    !node.if && !node.for && // not v-if or v-for or v-else\n    !isBuiltInTag(node.tag) && // not a built-in\n    isPlatformReservedTag(node.tag) && // not a component\n    !isDirectChildOfTemplateFor(node) &&\n    Object.keys(node).every(isStaticKey)\n  ))\n}\n\nfunction isDirectChildOfTemplateFor (node) {\n  while (node.parent) {\n    node = node.parent;\n    if (node.tag !== 'template') {\n      return false\n    }\n    if (node.for) {\n      return true\n    }\n  }\n  return false\n}\n\n/*  */\n\nvar fnExpRE = /^([\\w$_]+|\\([^)]*?\\))\\s*=>|^function(?:\\s+[\\w$]+)?\\s*\\(/;\nvar fnInvokeRE = /\\([^)]*?\\);*$/;\nvar simplePathRE = /^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*|\\['[^']*?']|\\[\"[^\"]*?\"]|\\[\\d+]|\\[[A-Za-z_$][\\w$]*])*$/;\n\n// KeyboardEvent.keyCode aliases\nvar keyCodes = {\n  esc: 27,\n  tab: 9,\n  enter: 13,\n  space: 32,\n  up: 38,\n  left: 37,\n  right: 39,\n  down: 40,\n  'delete': [8, 46]\n};\n\n// KeyboardEvent.key aliases\nvar keyNames = {\n  // #7880: IE11 and Edge use `Esc` for Escape key name.\n  esc: ['Esc', 'Escape'],\n  tab: 'Tab',\n  enter: 'Enter',\n  // #9112: IE11 uses `Spacebar` for Space key name.\n  space: [' ', 'Spacebar'],\n  // #7806: IE11 uses key names without `Arrow` prefix for arrow keys.\n  up: ['Up', 'ArrowUp'],\n  left: ['Left', 'ArrowLeft'],\n  right: ['Right', 'ArrowRight'],\n  down: ['Down', 'ArrowDown'],\n  // #9112: IE11 uses `Del` for Delete key name.\n  'delete': ['Backspace', 'Delete', 'Del']\n};\n\n// #4868: modifiers that prevent the execution of the listener\n// need to explicitly return null so that we can determine whether to remove\n// the listener for .once\nvar genGuard = function (condition) { return (\"if(\" + condition + \")return null;\"); };\n\nvar modifierCode = {\n  stop: '$event.stopPropagation();',\n  prevent: '$event.preventDefault();',\n  self: genGuard(\"$event.target !== $event.currentTarget\"),\n  ctrl: genGuard(\"!$event.ctrlKey\"),\n  shift: genGuard(\"!$event.shiftKey\"),\n  alt: genGuard(\"!$event.altKey\"),\n  meta: genGuard(\"!$event.metaKey\"),\n  left: genGuard(\"'button' in $event && $event.button !== 0\"),\n  middle: genGuard(\"'button' in $event && $event.button !== 1\"),\n  right: genGuard(\"'button' in $event && $event.button !== 2\")\n};\n\nfunction genHandlers (\n  events,\n  isNative\n) {\n  var prefix = isNative ? 'nativeOn:' : 'on:';\n  var staticHandlers = \"\";\n  var dynamicHandlers = \"\";\n  for (var name in events) {\n    var handlerCode = genHandler(events[name]);\n    if (events[name] && events[name].dynamic) {\n      dynamicHandlers += name + \",\" + handlerCode + \",\";\n    } else {\n      staticHandlers += \"\\\"\" + name + \"\\\":\" + handlerCode + \",\";\n    }\n  }\n  staticHandlers = \"{\" + (staticHandlers.slice(0, -1)) + \"}\";\n  if (dynamicHandlers) {\n    return prefix + \"_d(\" + staticHandlers + \",[\" + (dynamicHandlers.slice(0, -1)) + \"])\"\n  } else {\n    return prefix + staticHandlers\n  }\n}\n\nfunction genHandler (handler) {\n  if (!handler) {\n    return 'function(){}'\n  }\n\n  if (Array.isArray(handler)) {\n    return (\"[\" + (handler.map(function (handler) { return genHandler(handler); }).join(',')) + \"]\")\n  }\n\n  var isMethodPath = simplePathRE.test(handler.value);\n  var isFunctionExpression = fnExpRE.test(handler.value);\n  var isFunctionInvocation = simplePathRE.test(handler.value.replace(fnInvokeRE, ''));\n\n  if (!handler.modifiers) {\n    if (isMethodPath || isFunctionExpression) {\n      return handler.value\n    }\n    return (\"function($event){\" + (isFunctionInvocation ? (\"return \" + (handler.value)) : handler.value) + \"}\") // inline statement\n  } else {\n    var code = '';\n    var genModifierCode = '';\n    var keys = [];\n    for (var key in handler.modifiers) {\n      if (modifierCode[key]) {\n        genModifierCode += modifierCode[key];\n        // left/right\n        if (keyCodes[key]) {\n          keys.push(key);\n        }\n      } else if (key === 'exact') {\n        var modifiers = (handler.modifiers);\n        genModifierCode += genGuard(\n          ['ctrl', 'shift', 'alt', 'meta']\n            .filter(function (keyModifier) { return !modifiers[keyModifier]; })\n            .map(function (keyModifier) { return (\"$event.\" + keyModifier + \"Key\"); })\n            .join('||')\n        );\n      } else {\n        keys.push(key);\n      }\n    }\n    if (keys.length) {\n      code += genKeyFilter(keys);\n    }\n    // Make sure modifiers like prevent and stop get executed after key filtering\n    if (genModifierCode) {\n      code += genModifierCode;\n    }\n    var handlerCode = isMethodPath\n      ? (\"return \" + (handler.value) + \"($event)\")\n      : isFunctionExpression\n        ? (\"return (\" + (handler.value) + \")($event)\")\n        : isFunctionInvocation\n          ? (\"return \" + (handler.value))\n          : handler.value;\n    return (\"function($event){\" + code + handlerCode + \"}\")\n  }\n}\n\nfunction genKeyFilter (keys) {\n  return (\n    // make sure the key filters only apply to KeyboardEvents\n    // #9441: can't use 'keyCode' in $event because Chrome autofill fires fake\n    // key events that do not have keyCode property...\n    \"if(!$event.type.indexOf('key')&&\" +\n    (keys.map(genFilterCode).join('&&')) + \")return null;\"\n  )\n}\n\nfunction genFilterCode (key) {\n  var keyVal = parseInt(key, 10);\n  if (keyVal) {\n    return (\"$event.keyCode!==\" + keyVal)\n  }\n  var keyCode = keyCodes[key];\n  var keyName = keyNames[key];\n  return (\n    \"_k($event.keyCode,\" +\n    (JSON.stringify(key)) + \",\" +\n    (JSON.stringify(keyCode)) + \",\" +\n    \"$event.key,\" +\n    \"\" + (JSON.stringify(keyName)) +\n    \")\"\n  )\n}\n\n/*  */\n\nfunction on (el, dir) {\n  if (process.env.NODE_ENV !== 'production' && dir.modifiers) {\n    warn(\"v-on without argument does not support modifiers.\");\n  }\n  el.wrapListeners = function (code) { return (\"_g(\" + code + \",\" + (dir.value) + \")\"); };\n}\n\n/*  */\n\nfunction bind$1 (el, dir) {\n  el.wrapData = function (code) {\n    return (\"_b(\" + code + \",'\" + (el.tag) + \"',\" + (dir.value) + \",\" + (dir.modifiers && dir.modifiers.prop ? 'true' : 'false') + (dir.modifiers && dir.modifiers.sync ? ',true' : '') + \")\")\n  };\n}\n\n/*  */\n\nvar baseDirectives = {\n  on: on,\n  bind: bind$1,\n  cloak: noop\n};\n\n/*  */\n\n\n\n\n\nvar CodegenState = function CodegenState (options) {\n  this.options = options;\n  this.warn = options.warn || baseWarn;\n  this.transforms = pluckModuleFunction(options.modules, 'transformCode');\n  this.dataGenFns = pluckModuleFunction(options.modules, 'genData');\n  this.directives = extend(extend({}, baseDirectives), options.directives);\n  var isReservedTag = options.isReservedTag || no;\n  this.maybeComponent = function (el) { return !!el.component || !isReservedTag(el.tag); };\n  this.onceId = 0;\n  this.staticRenderFns = [];\n  this.pre = false;\n};\n\n\n\nfunction generate (\n  ast,\n  options\n) {\n  var state = new CodegenState(options);\n  var code = ast ? genElement(ast, state) : '_c(\"div\")';\n  return {\n    render: (\"with(this){return \" + code + \"}\"),\n    staticRenderFns: state.staticRenderFns\n  }\n}\n\nfunction genElement (el, state) {\n  if (el.parent) {\n    el.pre = el.pre || el.parent.pre;\n  }\n\n  if (el.staticRoot && !el.staticProcessed) {\n    return genStatic(el, state)\n  } else if (el.once && !el.onceProcessed) {\n    return genOnce(el, state)\n  } else if (el.for && !el.forProcessed) {\n    return genFor(el, state)\n  } else if (el.if && !el.ifProcessed) {\n    return genIf(el, state)\n  } else if (el.tag === 'template' && !el.slotTarget && !state.pre) {\n    return genChildren(el, state) || 'void 0'\n  } else if (el.tag === 'slot') {\n    return genSlot(el, state)\n  } else {\n    // component or element\n    var code;\n    if (el.component) {\n      code = genComponent(el.component, el, state);\n    } else {\n      var data;\n      if (!el.plain || (el.pre && state.maybeComponent(el))) {\n        data = genData$2(el, state);\n      }\n\n      var children = el.inlineTemplate ? null : genChildren(el, state, true);\n      code = \"_c('\" + (el.tag) + \"'\" + (data ? (\",\" + data) : '') + (children ? (\",\" + children) : '') + \")\";\n    }\n    // module transforms\n    for (var i = 0; i < state.transforms.length; i++) {\n      code = state.transforms[i](el, code);\n    }\n    return code\n  }\n}\n\n// hoist static sub-trees out\nfunction genStatic (el, state) {\n  el.staticProcessed = true;\n  // Some elements (templates) need to behave differently inside of a v-pre\n  // node.  All pre nodes are static roots, so we can use this as a location to\n  // wrap a state change and reset it upon exiting the pre node.\n  var originalPreState = state.pre;\n  if (el.pre) {\n    state.pre = el.pre;\n  }\n  state.staticRenderFns.push((\"with(this){return \" + (genElement(el, state)) + \"}\"));\n  state.pre = originalPreState;\n  return (\"_m(\" + (state.staticRenderFns.length - 1) + (el.staticInFor ? ',true' : '') + \")\")\n}\n\n// v-once\nfunction genOnce (el, state) {\n  el.onceProcessed = true;\n  if (el.if && !el.ifProcessed) {\n    return genIf(el, state)\n  } else if (el.staticInFor) {\n    var key = '';\n    var parent = el.parent;\n    while (parent) {\n      if (parent.for) {\n        key = parent.key;\n        break\n      }\n      parent = parent.parent;\n    }\n    if (!key) {\n      process.env.NODE_ENV !== 'production' && state.warn(\n        \"v-once can only be used inside v-for that is keyed. \",\n        el.rawAttrsMap['v-once']\n      );\n      return genElement(el, state)\n    }\n    return (\"_o(\" + (genElement(el, state)) + \",\" + (state.onceId++) + \",\" + key + \")\")\n  } else {\n    return genStatic(el, state)\n  }\n}\n\nfunction genIf (\n  el,\n  state,\n  altGen,\n  altEmpty\n) {\n  el.ifProcessed = true; // avoid recursion\n  return genIfConditions(el.ifConditions.slice(), state, altGen, altEmpty)\n}\n\nfunction genIfConditions (\n  conditions,\n  state,\n  altGen,\n  altEmpty\n) {\n  if (!conditions.length) {\n    return altEmpty || '_e()'\n  }\n\n  var condition = conditions.shift();\n  if (condition.exp) {\n    return (\"(\" + (condition.exp) + \")?\" + (genTernaryExp(condition.block)) + \":\" + (genIfConditions(conditions, state, altGen, altEmpty)))\n  } else {\n    return (\"\" + (genTernaryExp(condition.block)))\n  }\n\n  // v-if with v-once should generate code like (a)?_m(0):_m(1)\n  function genTernaryExp (el) {\n    return altGen\n      ? altGen(el, state)\n      : el.once\n        ? genOnce(el, state)\n        : genElement(el, state)\n  }\n}\n\nfunction genFor (\n  el,\n  state,\n  altGen,\n  altHelper\n) {\n  var exp = el.for;\n  var alias = el.alias;\n  var iterator1 = el.iterator1 ? (\",\" + (el.iterator1)) : '';\n  var iterator2 = el.iterator2 ? (\",\" + (el.iterator2)) : '';\n\n  if (process.env.NODE_ENV !== 'production' &&\n    state.maybeComponent(el) &&\n    el.tag !== 'slot' &&\n    el.tag !== 'template' &&\n    !el.key\n  ) {\n    state.warn(\n      \"<\" + (el.tag) + \" v-for=\\\"\" + alias + \" in \" + exp + \"\\\">: component lists rendered with \" +\n      \"v-for should have explicit keys. \" +\n      \"See https://vuejs.org/guide/list.html#key for more info.\",\n      el.rawAttrsMap['v-for'],\n      true /* tip */\n    );\n  }\n\n  el.forProcessed = true; // avoid recursion\n  return (altHelper || '_l') + \"((\" + exp + \"),\" +\n    \"function(\" + alias + iterator1 + iterator2 + \"){\" +\n      \"return \" + ((altGen || genElement)(el, state)) +\n    '})'\n}\n\nfunction genData$2 (el, state) {\n  var data = '{';\n\n  // directives first.\n  // directives may mutate the el's other properties before they are generated.\n  var dirs = genDirectives(el, state);\n  if (dirs) { data += dirs + ','; }\n\n  // key\n  if (el.key) {\n    data += \"key:\" + (el.key) + \",\";\n  }\n  // ref\n  if (el.ref) {\n    data += \"ref:\" + (el.ref) + \",\";\n  }\n  if (el.refInFor) {\n    data += \"refInFor:true,\";\n  }\n  // pre\n  if (el.pre) {\n    data += \"pre:true,\";\n  }\n  // record original tag name for components using \"is\" attribute\n  if (el.component) {\n    data += \"tag:\\\"\" + (el.tag) + \"\\\",\";\n  }\n  // module data generation functions\n  for (var i = 0; i < state.dataGenFns.length; i++) {\n    data += state.dataGenFns[i](el);\n  }\n  // attributes\n  if (el.attrs) {\n    data += \"attrs:\" + (genProps(el.attrs)) + \",\";\n  }\n  // DOM props\n  if (el.props) {\n    data += \"domProps:\" + (genProps(el.props)) + \",\";\n  }\n  // event handlers\n  if (el.events) {\n    data += (genHandlers(el.events, false)) + \",\";\n  }\n  if (el.nativeEvents) {\n    data += (genHandlers(el.nativeEvents, true)) + \",\";\n  }\n  // slot target\n  // only for non-scoped slots\n  if (el.slotTarget && !el.slotScope) {\n    data += \"slot:\" + (el.slotTarget) + \",\";\n  }\n  // scoped slots\n  if (el.scopedSlots) {\n    data += (genScopedSlots(el, el.scopedSlots, state)) + \",\";\n  }\n  // component v-model\n  if (el.model) {\n    data += \"model:{value:\" + (el.model.value) + \",callback:\" + (el.model.callback) + \",expression:\" + (el.model.expression) + \"},\";\n  }\n  // inline-template\n  if (el.inlineTemplate) {\n    var inlineTemplate = genInlineTemplate(el, state);\n    if (inlineTemplate) {\n      data += inlineTemplate + \",\";\n    }\n  }\n  data = data.replace(/,$/, '') + '}';\n  // v-bind dynamic argument wrap\n  // v-bind with dynamic arguments must be applied using the same v-bind object\n  // merge helper so that class/style/mustUseProp attrs are handled correctly.\n  if (el.dynamicAttrs) {\n    data = \"_b(\" + data + \",\\\"\" + (el.tag) + \"\\\",\" + (genProps(el.dynamicAttrs)) + \")\";\n  }\n  // v-bind data wrap\n  if (el.wrapData) {\n    data = el.wrapData(data);\n  }\n  // v-on data wrap\n  if (el.wrapListeners) {\n    data = el.wrapListeners(data);\n  }\n  return data\n}\n\nfunction genDirectives (el, state) {\n  var dirs = el.directives;\n  if (!dirs) { return }\n  var res = 'directives:[';\n  var hasRuntime = false;\n  var i, l, dir, needRuntime;\n  for (i = 0, l = dirs.length; i < l; i++) {\n    dir = dirs[i];\n    needRuntime = true;\n    var gen = state.directives[dir.name];\n    if (gen) {\n      // compile-time directive that manipulates AST.\n      // returns true if it also needs a runtime counterpart.\n      needRuntime = !!gen(el, dir, state.warn);\n    }\n    if (needRuntime) {\n      hasRuntime = true;\n      res += \"{name:\\\"\" + (dir.name) + \"\\\",rawName:\\\"\" + (dir.rawName) + \"\\\"\" + (dir.value ? (\",value:(\" + (dir.value) + \"),expression:\" + (JSON.stringify(dir.value))) : '') + (dir.arg ? (\",arg:\" + (dir.isDynamicArg ? dir.arg : (\"\\\"\" + (dir.arg) + \"\\\"\"))) : '') + (dir.modifiers ? (\",modifiers:\" + (JSON.stringify(dir.modifiers))) : '') + \"},\";\n    }\n  }\n  if (hasRuntime) {\n    return res.slice(0, -1) + ']'\n  }\n}\n\nfunction genInlineTemplate (el, state) {\n  var ast = el.children[0];\n  if (process.env.NODE_ENV !== 'production' && (\n    el.children.length !== 1 || ast.type !== 1\n  )) {\n    state.warn(\n      'Inline-template components must have exactly one child element.',\n      { start: el.start }\n    );\n  }\n  if (ast && ast.type === 1) {\n    var inlineRenderFns = generate(ast, state.options);\n    return (\"inlineTemplate:{render:function(){\" + (inlineRenderFns.render) + \"},staticRenderFns:[\" + (inlineRenderFns.staticRenderFns.map(function (code) { return (\"function(){\" + code + \"}\"); }).join(',')) + \"]}\")\n  }\n}\n\nfunction genScopedSlots (\n  el,\n  slots,\n  state\n) {\n  // by default scoped slots are considered \"stable\", this allows child\n  // components with only scoped slots to skip forced updates from parent.\n  // but in some cases we have to bail-out of this optimization\n  // for example if the slot contains dynamic names, has v-if or v-for on them...\n  var needsForceUpdate = el.for || Object.keys(slots).some(function (key) {\n    var slot = slots[key];\n    return (\n      slot.slotTargetDynamic ||\n      slot.if ||\n      slot.for ||\n      containsSlotChild(slot) // is passing down slot from parent which may be dynamic\n    )\n  });\n\n  // #9534: if a component with scoped slots is inside a conditional branch,\n  // it's possible for the same component to be reused but with different\n  // compiled slot content. To avoid that, we generate a unique key based on\n  // the generated code of all the slot contents.\n  var needsKey = !!el.if;\n\n  // OR when it is inside another scoped slot or v-for (the reactivity may be\n  // disconnected due to the intermediate scope variable)\n  // #9438, #9506\n  // TODO: this can be further optimized by properly analyzing in-scope bindings\n  // and skip force updating ones that do not actually use scope variables.\n  if (!needsForceUpdate) {\n    var parent = el.parent;\n    while (parent) {\n      if (\n        (parent.slotScope && parent.slotScope !== emptySlotScopeToken) ||\n        parent.for\n      ) {\n        needsForceUpdate = true;\n        break\n      }\n      if (parent.if) {\n        needsKey = true;\n      }\n      parent = parent.parent;\n    }\n  }\n\n  var generatedSlots = Object.keys(slots)\n    .map(function (key) { return genScopedSlot(slots[key], state); })\n    .join(',');\n\n  return (\"scopedSlots:_u([\" + generatedSlots + \"]\" + (needsForceUpdate ? \",null,true\" : \"\") + (!needsForceUpdate && needsKey ? (\",null,false,\" + (hash(generatedSlots))) : \"\") + \")\")\n}\n\nfunction hash(str) {\n  var hash = 5381;\n  var i = str.length;\n  while(i) {\n    hash = (hash * 33) ^ str.charCodeAt(--i);\n  }\n  return hash >>> 0\n}\n\nfunction containsSlotChild (el) {\n  if (el.type === 1) {\n    if (el.tag === 'slot') {\n      return true\n    }\n    return el.children.some(containsSlotChild)\n  }\n  return false\n}\n\nfunction genScopedSlot (\n  el,\n  state\n) {\n  var isLegacySyntax = el.attrsMap['slot-scope'];\n  if (el.if && !el.ifProcessed && !isLegacySyntax) {\n    return genIf(el, state, genScopedSlot, \"null\")\n  }\n  if (el.for && !el.forProcessed) {\n    return genFor(el, state, genScopedSlot)\n  }\n  var slotScope = el.slotScope === emptySlotScopeToken\n    ? \"\"\n    : String(el.slotScope);\n  var fn = \"function(\" + slotScope + \"){\" +\n    \"return \" + (el.tag === 'template'\n      ? el.if && isLegacySyntax\n        ? (\"(\" + (el.if) + \")?\" + (genChildren(el, state) || 'undefined') + \":undefined\")\n        : genChildren(el, state) || 'undefined'\n      : genElement(el, state)) + \"}\";\n  // reverse proxy v-slot without scope on this.$slots\n  var reverseProxy = slotScope ? \"\" : \",proxy:true\";\n  return (\"{key:\" + (el.slotTarget || \"\\\"default\\\"\") + \",fn:\" + fn + reverseProxy + \"}\")\n}\n\nfunction genChildren (\n  el,\n  state,\n  checkSkip,\n  altGenElement,\n  altGenNode\n) {\n  var children = el.children;\n  if (children.length) {\n    var el$1 = children[0];\n    // optimize single v-for\n    if (children.length === 1 &&\n      el$1.for &&\n      el$1.tag !== 'template' &&\n      el$1.tag !== 'slot'\n    ) {\n      var normalizationType = checkSkip\n        ? state.maybeComponent(el$1) ? \",1\" : \",0\"\n        : \"\";\n      return (\"\" + ((altGenElement || genElement)(el$1, state)) + normalizationType)\n    }\n    var normalizationType$1 = checkSkip\n      ? getNormalizationType(children, state.maybeComponent)\n      : 0;\n    var gen = altGenNode || genNode;\n    return (\"[\" + (children.map(function (c) { return gen(c, state); }).join(',')) + \"]\" + (normalizationType$1 ? (\",\" + normalizationType$1) : ''))\n  }\n}\n\n// determine the normalization needed for the children array.\n// 0: no normalization needed\n// 1: simple normalization needed (possible 1-level deep nested array)\n// 2: full normalization needed\nfunction getNormalizationType (\n  children,\n  maybeComponent\n) {\n  var res = 0;\n  for (var i = 0; i < children.length; i++) {\n    var el = children[i];\n    if (el.type !== 1) {\n      continue\n    }\n    if (needsNormalization(el) ||\n        (el.ifConditions && el.ifConditions.some(function (c) { return needsNormalization(c.block); }))) {\n      res = 2;\n      break\n    }\n    if (maybeComponent(el) ||\n        (el.ifConditions && el.ifConditions.some(function (c) { return maybeComponent(c.block); }))) {\n      res = 1;\n    }\n  }\n  return res\n}\n\nfunction needsNormalization (el) {\n  return el.for !== undefined || el.tag === 'template' || el.tag === 'slot'\n}\n\nfunction genNode (node, state) {\n  if (node.type === 1) {\n    return genElement(node, state)\n  } else if (node.type === 3 && node.isComment) {\n    return genComment(node)\n  } else {\n    return genText(node)\n  }\n}\n\nfunction genText (text) {\n  return (\"_v(\" + (text.type === 2\n    ? text.expression // no need for () because already wrapped in _s()\n    : transformSpecialNewlines(JSON.stringify(text.text))) + \")\")\n}\n\nfunction genComment (comment) {\n  return (\"_e(\" + (JSON.stringify(comment.text)) + \")\")\n}\n\nfunction genSlot (el, state) {\n  var slotName = el.slotName || '\"default\"';\n  var children = genChildren(el, state);\n  var res = \"_t(\" + slotName + (children ? (\",\" + children) : '');\n  var attrs = el.attrs || el.dynamicAttrs\n    ? genProps((el.attrs || []).concat(el.dynamicAttrs || []).map(function (attr) { return ({\n        // slot props are camelized\n        name: camelize(attr.name),\n        value: attr.value,\n        dynamic: attr.dynamic\n      }); }))\n    : null;\n  var bind$$1 = el.attrsMap['v-bind'];\n  if ((attrs || bind$$1) && !children) {\n    res += \",null\";\n  }\n  if (attrs) {\n    res += \",\" + attrs;\n  }\n  if (bind$$1) {\n    res += (attrs ? '' : ',null') + \",\" + bind$$1;\n  }\n  return res + ')'\n}\n\n// componentName is el.component, take it as argument to shun flow's pessimistic refinement\nfunction genComponent (\n  componentName,\n  el,\n  state\n) {\n  var children = el.inlineTemplate ? null : genChildren(el, state, true);\n  return (\"_c(\" + componentName + \",\" + (genData$2(el, state)) + (children ? (\",\" + children) : '') + \")\")\n}\n\nfunction genProps (props) {\n  var staticProps = \"\";\n  var dynamicProps = \"\";\n  for (var i = 0; i < props.length; i++) {\n    var prop = props[i];\n    var value = transformSpecialNewlines(prop.value);\n    if (prop.dynamic) {\n      dynamicProps += (prop.name) + \",\" + value + \",\";\n    } else {\n      staticProps += \"\\\"\" + (prop.name) + \"\\\":\" + value + \",\";\n    }\n  }\n  staticProps = \"{\" + (staticProps.slice(0, -1)) + \"}\";\n  if (dynamicProps) {\n    return (\"_d(\" + staticProps + \",[\" + (dynamicProps.slice(0, -1)) + \"])\")\n  } else {\n    return staticProps\n  }\n}\n\n// #3895, #4268\nfunction transformSpecialNewlines (text) {\n  return text\n    .replace(/\\u2028/g, '\\\\u2028')\n    .replace(/\\u2029/g, '\\\\u2029')\n}\n\n/*  */\n\n\n\n// these keywords should not appear inside expressions, but operators like\n// typeof, instanceof and in are allowed\nvar prohibitedKeywordRE = new RegExp('\\\\b' + (\n  'do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' +\n  'super,throw,while,yield,delete,export,import,return,switch,default,' +\n  'extends,finally,continue,debugger,function,arguments'\n).split(',').join('\\\\b|\\\\b') + '\\\\b');\n\n// these unary operators should not be used as property/method names\nvar unaryOperatorsRE = new RegExp('\\\\b' + (\n  'delete,typeof,void'\n).split(',').join('\\\\s*\\\\([^\\\\)]*\\\\)|\\\\b') + '\\\\s*\\\\([^\\\\)]*\\\\)');\n\n// strip strings in expressions\nvar stripStringRE = /'(?:[^'\\\\]|\\\\.)*'|\"(?:[^\"\\\\]|\\\\.)*\"|`(?:[^`\\\\]|\\\\.)*\\$\\{|\\}(?:[^`\\\\]|\\\\.)*`|`(?:[^`\\\\]|\\\\.)*`/g;\n\n// detect problematic expressions in a template\nfunction detectErrors (ast, warn) {\n  if (ast) {\n    checkNode(ast, warn);\n  }\n}\n\nfunction checkNode (node, warn) {\n  if (node.type === 1) {\n    for (var name in node.attrsMap) {\n      if (dirRE.test(name)) {\n        var value = node.attrsMap[name];\n        if (value) {\n          var range = node.rawAttrsMap[name];\n          if (name === 'v-for') {\n            checkFor(node, (\"v-for=\\\"\" + value + \"\\\"\"), warn, range);\n          } else if (name === 'v-slot' || name[0] === '#') {\n            checkFunctionParameterExpression(value, (name + \"=\\\"\" + value + \"\\\"\"), warn, range);\n          } else if (onRE.test(name)) {\n            checkEvent(value, (name + \"=\\\"\" + value + \"\\\"\"), warn, range);\n          } else {\n            checkExpression(value, (name + \"=\\\"\" + value + \"\\\"\"), warn, range);\n          }\n        }\n      }\n    }\n    if (node.children) {\n      for (var i = 0; i < node.children.length; i++) {\n        checkNode(node.children[i], warn);\n      }\n    }\n  } else if (node.type === 2) {\n    checkExpression(node.expression, node.text, warn, node);\n  }\n}\n\nfunction checkEvent (exp, text, warn, range) {\n  var stripped = exp.replace(stripStringRE, '');\n  var keywordMatch = stripped.match(unaryOperatorsRE);\n  if (keywordMatch && stripped.charAt(keywordMatch.index - 1) !== '$') {\n    warn(\n      \"avoid using JavaScript unary operator as property name: \" +\n      \"\\\"\" + (keywordMatch[0]) + \"\\\" in expression \" + (text.trim()),\n      range\n    );\n  }\n  checkExpression(exp, text, warn, range);\n}\n\nfunction checkFor (node, text, warn, range) {\n  checkExpression(node.for || '', text, warn, range);\n  checkIdentifier(node.alias, 'v-for alias', text, warn, range);\n  checkIdentifier(node.iterator1, 'v-for iterator', text, warn, range);\n  checkIdentifier(node.iterator2, 'v-for iterator', text, warn, range);\n}\n\nfunction checkIdentifier (\n  ident,\n  type,\n  text,\n  warn,\n  range\n) {\n  if (typeof ident === 'string') {\n    try {\n      new Function((\"var \" + ident + \"=_\"));\n    } catch (e) {\n      warn((\"invalid \" + type + \" \\\"\" + ident + \"\\\" in expression: \" + (text.trim())), range);\n    }\n  }\n}\n\nfunction checkExpression (exp, text, warn, range) {\n  try {\n    new Function((\"return \" + exp));\n  } catch (e) {\n    var keywordMatch = exp.replace(stripStringRE, '').match(prohibitedKeywordRE);\n    if (keywordMatch) {\n      warn(\n        \"avoid using JavaScript keyword as property name: \" +\n        \"\\\"\" + (keywordMatch[0]) + \"\\\"\\n  Raw expression: \" + (text.trim()),\n        range\n      );\n    } else {\n      warn(\n        \"invalid expression: \" + (e.message) + \" in\\n\\n\" +\n        \"    \" + exp + \"\\n\\n\" +\n        \"  Raw expression: \" + (text.trim()) + \"\\n\",\n        range\n      );\n    }\n  }\n}\n\nfunction checkFunctionParameterExpression (exp, text, warn, range) {\n  try {\n    new Function(exp, '');\n  } catch (e) {\n    warn(\n      \"invalid function parameter expression: \" + (e.message) + \" in\\n\\n\" +\n      \"    \" + exp + \"\\n\\n\" +\n      \"  Raw expression: \" + (text.trim()) + \"\\n\",\n      range\n    );\n  }\n}\n\n/*  */\n\nvar range = 2;\n\nfunction generateCodeFrame (\n  source,\n  start,\n  end\n) {\n  if ( start === void 0 ) start = 0;\n  if ( end === void 0 ) end = source.length;\n\n  var lines = source.split(/\\r?\\n/);\n  var count = 0;\n  var res = [];\n  for (var i = 0; i < lines.length; i++) {\n    count += lines[i].length + 1;\n    if (count >= start) {\n      for (var j = i - range; j <= i + range || end > count; j++) {\n        if (j < 0 || j >= lines.length) { continue }\n        res.push((\"\" + (j + 1) + (repeat$1(\" \", 3 - String(j + 1).length)) + \"|  \" + (lines[j])));\n        var lineLength = lines[j].length;\n        if (j === i) {\n          // push underline\n          var pad = start - (count - lineLength) + 1;\n          var length = end > count ? lineLength - pad : end - start;\n          res.push(\"   |  \" + repeat$1(\" \", pad) + repeat$1(\"^\", length));\n        } else if (j > i) {\n          if (end > count) {\n            var length$1 = Math.min(end - count, lineLength);\n            res.push(\"   |  \" + repeat$1(\"^\", length$1));\n          }\n          count += lineLength + 1;\n        }\n      }\n      break\n    }\n  }\n  return res.join('\\n')\n}\n\nfunction repeat$1 (str, n) {\n  var result = '';\n  if (n > 0) {\n    while (true) { // eslint-disable-line\n      if (n & 1) { result += str; }\n      n >>>= 1;\n      if (n <= 0) { break }\n      str += str;\n    }\n  }\n  return result\n}\n\n/*  */\n\n\n\nfunction createFunction (code, errors) {\n  try {\n    return new Function(code)\n  } catch (err) {\n    errors.push({ err: err, code: code });\n    return noop\n  }\n}\n\nfunction createCompileToFunctionFn (compile) {\n  var cache = Object.create(null);\n\n  return function compileToFunctions (\n    template,\n    options,\n    vm\n  ) {\n    options = extend({}, options);\n    var warn$$1 = options.warn || warn;\n    delete options.warn;\n\n    /* istanbul ignore if */\n    if (process.env.NODE_ENV !== 'production') {\n      // detect possible CSP restriction\n      try {\n        new Function('return 1');\n      } catch (e) {\n        if (e.toString().match(/unsafe-eval|CSP/)) {\n          warn$$1(\n            'It seems you are using the standalone build of Vue.js in an ' +\n            'environment with Content Security Policy that prohibits unsafe-eval. ' +\n            'The template compiler cannot work in this environment. Consider ' +\n            'relaxing the policy to allow unsafe-eval or pre-compiling your ' +\n            'templates into render functions.'\n          );\n        }\n      }\n    }\n\n    // check cache\n    var key = options.delimiters\n      ? String(options.delimiters) + template\n      : template;\n    if (cache[key]) {\n      return cache[key]\n    }\n\n    // compile\n    var compiled = compile(template, options);\n\n    // check compilation errors/tips\n    if (process.env.NODE_ENV !== 'production') {\n      if (compiled.errors && compiled.errors.length) {\n        if (options.outputSourceRange) {\n          compiled.errors.forEach(function (e) {\n            warn$$1(\n              \"Error compiling template:\\n\\n\" + (e.msg) + \"\\n\\n\" +\n              generateCodeFrame(template, e.start, e.end),\n              vm\n            );\n          });\n        } else {\n          warn$$1(\n            \"Error compiling template:\\n\\n\" + template + \"\\n\\n\" +\n            compiled.errors.map(function (e) { return (\"- \" + e); }).join('\\n') + '\\n',\n            vm\n          );\n        }\n      }\n      if (compiled.tips && compiled.tips.length) {\n        if (options.outputSourceRange) {\n          compiled.tips.forEach(function (e) { return tip(e.msg, vm); });\n        } else {\n          compiled.tips.forEach(function (msg) { return tip(msg, vm); });\n        }\n      }\n    }\n\n    // turn code into functions\n    var res = {};\n    var fnGenErrors = [];\n    res.render = createFunction(compiled.render, fnGenErrors);\n    res.staticRenderFns = compiled.staticRenderFns.map(function (code) {\n      return createFunction(code, fnGenErrors)\n    });\n\n    // check function generation errors.\n    // this should only happen if there is a bug in the compiler itself.\n    // mostly for codegen development use\n    /* istanbul ignore if */\n    if (process.env.NODE_ENV !== 'production') {\n      if ((!compiled.errors || !compiled.errors.length) && fnGenErrors.length) {\n        warn$$1(\n          \"Failed to generate render function:\\n\\n\" +\n          fnGenErrors.map(function (ref) {\n            var err = ref.err;\n            var code = ref.code;\n\n            return ((err.toString()) + \" in\\n\\n\" + code + \"\\n\");\n        }).join('\\n'),\n          vm\n        );\n      }\n    }\n\n    return (cache[key] = res)\n  }\n}\n\n/*  */\n\nfunction createCompilerCreator (baseCompile) {\n  return function createCompiler (baseOptions) {\n    function compile (\n      template,\n      options\n    ) {\n      var finalOptions = Object.create(baseOptions);\n      var errors = [];\n      var tips = [];\n\n      var warn = function (msg, range, tip) {\n        (tip ? tips : errors).push(msg);\n      };\n\n      if (options) {\n        if (process.env.NODE_ENV !== 'production' && options.outputSourceRange) {\n          // $flow-disable-line\n          var leadingSpaceLength = template.match(/^\\s*/)[0].length;\n\n          warn = function (msg, range, tip) {\n            var data = { msg: msg };\n            if (range) {\n              if (range.start != null) {\n                data.start = range.start + leadingSpaceLength;\n              }\n              if (range.end != null) {\n                data.end = range.end + leadingSpaceLength;\n              }\n            }\n            (tip ? tips : errors).push(data);\n          };\n        }\n        // merge custom modules\n        if (options.modules) {\n          finalOptions.modules =\n            (baseOptions.modules || []).concat(options.modules);\n        }\n        // merge custom directives\n        if (options.directives) {\n          finalOptions.directives = extend(\n            Object.create(baseOptions.directives || null),\n            options.directives\n          );\n        }\n        // copy other options\n        for (var key in options) {\n          if (key !== 'modules' && key !== 'directives') {\n            finalOptions[key] = options[key];\n          }\n        }\n      }\n\n      finalOptions.warn = warn;\n\n      var compiled = baseCompile(template.trim(), finalOptions);\n      if (process.env.NODE_ENV !== 'production') {\n        detectErrors(compiled.ast, warn);\n      }\n      compiled.errors = errors;\n      compiled.tips = tips;\n      return compiled\n    }\n\n    return {\n      compile: compile,\n      compileToFunctions: createCompileToFunctionFn(compile)\n    }\n  }\n}\n\n/*  */\n\n// `createCompilerCreator` allows creating compilers that use alternative\n// parser/optimizer/codegen, e.g the SSR optimizing compiler.\n// Here we just export a default compiler using the default parts.\nvar createCompiler = createCompilerCreator(function baseCompile (\n  template,\n  options\n) {\n  var ast = parse(template.trim(), options);\n  if (options.optimize !== false) {\n    optimize(ast, options);\n  }\n  var code = generate(ast, options);\n  return {\n    ast: ast,\n    render: code.render,\n    staticRenderFns: code.staticRenderFns\n  }\n});\n\n/*  */\n\nvar ref$1 = createCompiler(baseOptions);\nvar compile = ref$1.compile;\nvar compileToFunctions = ref$1.compileToFunctions;\n\n/*  */\n\n// check whether current browser encodes a char inside attribute values\nvar div;\nfunction getShouldDecode (href) {\n  div = div || document.createElement('div');\n  div.innerHTML = href ? \"<a href=\\\"\\n\\\"/>\" : \"<div a=\\\"\\n\\\"/>\";\n  return div.innerHTML.indexOf('&#10;') > 0\n}\n\n// #3663: IE encodes newlines inside attribute values while other browsers don't\nvar shouldDecodeNewlines = inBrowser ? getShouldDecode(false) : false;\n// #6828: chrome encodes content in a[href]\nvar shouldDecodeNewlinesForHref = inBrowser ? getShouldDecode(true) : false;\n\n/*  */\n\nvar idToTemplate = cached(function (id) {\n  var el = query(id);\n  return el && el.innerHTML\n});\n\nvar mount = Vue.prototype.$mount;\nVue.prototype.$mount = function (\n  el,\n  hydrating\n) {\n  el = el && query(el);\n\n  /* istanbul ignore if */\n  if (el === document.body || el === document.documentElement) {\n    process.env.NODE_ENV !== 'production' && warn(\n      \"Do not mount Vue to <html> or <body> - mount to normal elements instead.\"\n    );\n    return this\n  }\n\n  var options = this.$options;\n  // resolve template/el and convert to render function\n  if (!options.render) {\n    var template = options.template;\n    if (template) {\n      if (typeof template === 'string') {\n        if (template.charAt(0) === '#') {\n          template = idToTemplate(template);\n          /* istanbul ignore if */\n          if (process.env.NODE_ENV !== 'production' && !template) {\n            warn(\n              (\"Template element not found or is empty: \" + (options.template)),\n              this\n            );\n          }\n        }\n      } else if (template.nodeType) {\n        template = template.innerHTML;\n      } else {\n        if (process.env.NODE_ENV !== 'production') {\n          warn('invalid template option:' + template, this);\n        }\n        return this\n      }\n    } else if (el) {\n      template = getOuterHTML(el);\n    }\n    if (template) {\n      /* istanbul ignore if */\n      if (process.env.NODE_ENV !== 'production' && config.performance && mark) {\n        mark('compile');\n      }\n\n      var ref = compileToFunctions(template, {\n        outputSourceRange: process.env.NODE_ENV !== 'production',\n        shouldDecodeNewlines: shouldDecodeNewlines,\n        shouldDecodeNewlinesForHref: shouldDecodeNewlinesForHref,\n        delimiters: options.delimiters,\n        comments: options.comments\n      }, this);\n      var render = ref.render;\n      var staticRenderFns = ref.staticRenderFns;\n      options.render = render;\n      options.staticRenderFns = staticRenderFns;\n\n      /* istanbul ignore if */\n      if (process.env.NODE_ENV !== 'production' && config.performance && mark) {\n        mark('compile end');\n        measure((\"vue \" + (this._name) + \" compile\"), 'compile', 'compile end');\n      }\n    }\n  }\n  return mount.call(this, el, hydrating)\n};\n\n/**\n * Get outerHTML of elements, taking care\n * of SVG elements in IE as well.\n */\nfunction getOuterHTML (el) {\n  if (el.outerHTML) {\n    return el.outerHTML\n  } else {\n    var container = document.createElement('div');\n    container.appendChild(el.cloneNode(true));\n    return container.innerHTML\n  }\n}\n\nVue.compile = compileToFunctions;\n\nexport default Vue;\n\n\n/*** EXPORTS FROM esm-exports-loader ***/\nexport {enter, leave};\n","/* globals __webpack_amd_options__ */\r\nmodule.exports = __webpack_amd_options__;\r\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1, eval)(\"this\");\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","module.exports = function(originalModule) {\n\tif (!originalModule.webpackPolyfill) {\n\t\tvar module = Object.create(originalModule);\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"exports\", {\n\t\t\tenumerable: true\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * SprÃ¡vce virtuÃ¡lnÃ­ klÃ¡vesnice pro standardnÃ­ webovÃ© technologie.\n * PÅ™edpoklÃ¡dÃ¡ se, Å¾e web platforma virtuÃ¡lnÃ­ klÃ¡vesnici nevyvolÃ¡.\n * @implements {VirtualKeyboardManager}\n * @memberof AdapterWeb\n */\nclass VirtualKeyboardManager {\n  /**\n   * @param {VirtualKeyboardHiddenFactory} factory\n   */\n  constructor (factory) {\n    this.factory = factory;\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // PrÃ¡zdnÃ¡ metoda pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /** @inheritdoc */\n  getInfo () {\n    return new Promise((resolve) => resolve(\n      this.factory.create()\n    ));\n  }\n\n  /** @inheritdoc */\n  on (type, callback) {\n    // PrÃ¡zdnÃ¡ metoda pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /** @inheritdoc */\n  off (type, callback) {\n    // PrÃ¡zdnÃ¡ metoda pro splnÄ›nÃ­ rozhranÃ­.\n  }\n}\n\nexport default VirtualKeyboardManager;\n","/* eslint-disable max-lines, header/header */\n// TODO Refaktorizovat.\n\n/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\nimport has from 'lodash/has';\nimport isEmpty from 'lodash/isEmpty';\nimport isNil from 'lodash/isNil';\nimport isNumber from 'lodash/isNumber';\nimport isObject from 'lodash/isObject';\nimport isString from 'lodash/isString';\nimport isUndefined from 'lodash/isUndefined';\nimport objectHash from 'object-hash';\nimport URI from 'urijs';\n\nimport FileTransferRequest from '../../../core/file/transfer/file-transfer-request';\n\n/**\n * SCAP Storage adaptÃ©r binÃ¡rnÃ­ch souborÅ¯ pro js-data.\n * @implements {DsBinaryAdapter}\n * @memberof AdapterWebosSignage3_0\n */\nclass DsBinaryAdapter {\n  /**\n   * Constructs adapter.\n   * @param {FileArchiveManager} fileArchiveManager SprÃ¡vce archivÅ¯.\n   * @param {FileSystemPathFactory} fileSystemPathFactory TovÃ¡rna na cesty v souborovÃ©m systÃ©mu.\n   * @param {FileSystemManager} fileSystemManager SprÃ¡vce souborovÃ©ho systÃ©mu.\n   * @param {FileSystemMapper} fileSystemMapper MapovaÄ� cest souborovÃ©ho systÃ©mu.\n   * @param {FileTransferManager} fileTransferManager SprÃ¡vce stahovÃ¡nÃ­.\n   * @param {DsBinaryOptions|null} options Configuration options.\n   * @returns {DsBinaryAdapter} Adapter instance.\n   */\n  constructor (fileArchiveManager, fileSystemPathFactory, fileSystemManager, fileSystemMapper, fileTransferManager, options) {\n    // VÃ½chozÃ­ nastavenÃ­ pro adaptÃ©r.\n    this.defaultOptions = {\n      checksumAttribute: 'checksum',\n      extract: false,\n      fileAttribute: 'fileUrl',\n      localhostAttribute: 'localhostUrl',\n      temporaryExtension: 'tmp',\n      remoteAttribute: 'url'\n    };\n    // NastavenÃ­ pro instanci adaptÃ©ru.\n    this.instanceOptions = options;\n    // File API.\n    this.fileArchiveManager = fileArchiveManager;\n    this.fileSystemPathFactory = fileSystemPathFactory;\n    this.fileSystemManager = fileSystemManager;\n    this.fileSystemMapper = fileSystemMapper;\n    this.fileTransferManager = fileTransferManager;\n  }\n\n  /** @inheritdoc */\n  clean (resource, options) {\n    // Validace vstupÅ¯.\n    DsBinaryAdapter.validateCommon(resource, options);\n    return (\n      this.listFile(resource, options)\n      .then((fileArray) => {\n        const failedFileArray = [];\n        return (\n          // Vyberou se pouze doÄ�asnÃ© soubory.\n          fileArray.filter((file) => !file.injectable)\n          // SÃ©riovÃ© volÃ¡nÃ­ smazÃ¡nÃ­ souborÅ¯.\n          .reduce(\n            (accumulator, file) => (\n              accumulator.then(() => file.entry.remove({recursive: true}))\n              .catch(() => {\n                // OÅ¡etÅ™enÃ­ chyb pomocÃ­ rejekce.\n                // DalÅ¡Ã­ variantou je emit odchycenÃ©ho error, ale nenÃ­ jasnÃ¡ podpora v JSData.\n                // Vznik jednÃ© chyby nezablokuje pokus o smazÃ¡nÃ­ ostatnÃ­ch souborÅ¯.\n                failedFileArray.push(file);\n              })\n            ),\n            Promise.resolve()\n          )\n          .then(() => {\n            if (failedFileArray.length) {\n              const failedString = (\n                failedFileArray.map((file) => file.entry.getPath())\n                .join(', ')\n              );\n              throw new Error(`Unable to remove files: ${failedString}.`);\n            }\n          })\n        );\n      })\n    );\n  }\n\n  /** @inheritdoc */\n  create (resource, attrs, options) {\n    // Validace vstupÅ¯.\n    DsBinaryAdapter.validateCommon(resource, options);\n    DsBinaryAdapter.validateAttrs(attrs);\n    // TODO #169 DodateÄ�nÄ› dle potÅ™eby refaktorizovat.\n    // eslint-disable-next-line max-statements\n    return new Promise((resolve) => {\n      // VÃ½bÄ›r sloÅ¾ky pro uloÅ¾enÃ­ souboru.\n      const workspacePath = this.getWorkspacePath(resource, options);\n      // VzdÃ¡lenÃ¡ URL, na kterÃ© je uloÅ¾enÃ½ binÃ¡rnÃ­ obsah.\n      const remoteAttribute = this.getOption(resource, 'remoteAttribute', options);\n      const remoteUrl = attrs[remoteAttribute];\n      // ZjiÅ¡tÄ›nÃ­ nÃ¡zvu souboru, validace a parsovÃ¡nÃ­ jeho pÅ™Ã­pony.\n      const remoteUri = new URI(remoteUrl);\n      const remoteFilename = remoteUri.filename();\n      this.validateFilename(resource, remoteFilename, options);\n      const remoteExtension = DsBinaryAdapter.parseExtension(remoteFilename);\n      // UrÄ�enÃ­ identifikÃ¡toru novÃ©ho souboru.\n      const id = this.getId(resource, attrs, options);\n      // PÅ™Ã­znak, jestli se mÃ¡ staÅ¾enÃ½ soubor rozbalit do sloÅ¾ky.\n      const extract = this.getOption(resource, 'extract', options);\n      // NÃ¡zev cÃ­lovÃ©ho vytvoÅ™enÃ©ho souboru.\n      let targetFilePath;\n      if (extract) {\n        // Archivy se rozbalujÃ­ do sloÅ¾ky pojmenovanÃ© dle id.\n        targetFilePath = this.fileSystemPathFactory.fromInfo({stem: id});\n      } else {\n        // Soubory se pojmenovÃ¡vajÃ­ dle id a zachovÃ¡vÃ¡ se koncovka.\n        targetFilePath = this.fileSystemPathFactory.fromInfo({extension: remoteExtension, stem: id});\n      }\n      // Cesta k vytvoÅ™enÃ©mu souboru.\n      const targetPath = this.fileSystemPathFactory.join(workspacePath, targetFilePath);\n      // DoÄ�asnÃ¡ lokÃ¡lnÃ­ URL souboru na kterou se uklÃ¡dÃ¡ bÄ›hem stahovÃ¡nÃ­.\n      // Nebo URL archivu, pÅ™ed jeho rozbalenÃ­m a smazÃ¡nÃ­m.\n      const temporaryExtension = this.getOption(resource, 'temporaryExtension', options);\n      const temporaryFilePath = this.fileSystemPathFactory.fromInfo({extension: temporaryExtension, stem: id});\n      const temporaryPath = this.fileSystemPathFactory.join(workspacePath, temporaryFilePath);\n      return resolve(\n        this.fileSystemManager.hasDirectory(workspacePath)\n        .then((workspaceExists) => {\n          if (workspaceExists) {\n            return (\n              this.hasTarget(targetPath, extract)\n              .then((targetExists) => {\n                if (targetExists) {\n                  // CÃ­lovÃ½ zÃ¡znam jiÅ¾ existuje. NenÃ­ tÅ™eba nic dÄ›lat.\n                  return Promise.resolve();\n                }\n                // CÃ­lovÃ½ zÃ¡znam neexistuje. VytvoÅ™Ã­ se.\n                return this.createTarget(targetPath, temporaryPath, remoteUrl, extract);\n              })\n            );\n          }\n          // PracovnÃ­ sloÅ¾ka neexistuje. VytvoÅ™Ã­ se spoleÄ�nÄ› s prvnÃ­m cÃ­lovÃ½m zÃ¡znamem.\n          return (\n            this.fileSystemManager.createDirectory(workspacePath)\n            .then(() => this.createTarget(targetPath, temporaryPath, remoteUrl, extract))\n          );\n        })\n        // VrÃ¡cenÃ­ vÃ½stupnÃ­ch atributÅ¯.\n        .then(() => this.generateAttrs(resource, id, targetPath, options))\n      );\n    });\n  }\n\n  /**\n   * VytvoÅ™Ã­ cÃ­lovÃ½ zÃ¡znam v souborovÃ©m systÃ©mu.\n   * @param {FileSystemPath} targetPath Cesta, na kterÃ© vytvoÅ™it cÃ­lovÃ½ zÃ¡znam.\n   * @param {FileSystemPath} temporaryPath Cesta, na kterÃ© vytvoÅ™it doÄ�asnÃ½ soubor.\n   * @param {string} remoteUrl URL, ze kterÃ© se mÃ¡ soubor stÃ¡hnout.\n   * @param {boolean} extract PÅ™Ã­znak, jestli se mÃ¡ staÅ¾enÃ½ soubor rozbalit do sloÅ¾ky.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  createTarget (targetPath, temporaryPath, remoteUrl, extract) {\n    return new Promise((resolve) => {\n      // StaÅ¾enÃ­ souboru ze vzdÃ¡lenÃ©ho zdroje do doÄ�asnÃ©ho umÃ­stÄ›nÃ­.\n      const request = new FileTransferRequest(remoteUrl);\n      const connection = this.fileTransferManager.download(temporaryPath, request);\n      return resolve(\n        connection.getResponse()\n        .then((response) => {\n          if (!response.isOk()) {\n            throw new RangeError(`Download failed with status ${response.getStatus()}.`);\n          }\n          const temporaryFile = response.getFile();\n          // Archivy se do cÃ­lovÃ©ho umÃ­stÄ›nÃ­ rozbalujÃ­.\n          // TODO #225 NemÄ›lo by se pro jistotu rozbalovat v temp?\n          // - KdyÅ¾ se nepodaÅ™Ã­ dokonÄ�it, tak pak nelze detekovat!\n          if (extract) {\n            return (\n              this.fileSystemManager.createDirectory(targetPath)\n              .then(() => this.fileArchiveManager.getVolume(temporaryPath))\n              .then((volume) => volume.extract(targetPath))\n              // SmazÃ¡nÃ­ archivu pro uvolnÄ›nÃ­ mÃ­sta.\n              .then(() => temporaryFile.remove())\n            );\n          }\n          // Soubory se do cÃ­lovÃ©ho umÃ­stÄ›nÃ­ pÅ™esunujÃ­.\n          return temporaryFile.move(targetPath);\n        })\n      );\n    });\n  }\n\n  /** @inheritdoc */\n  destroy (resource, id, options) {\n    // Validace vstupÅ¯.\n    DsBinaryAdapter.validateCommon(resource, options);\n    DsBinaryAdapter.validateId(id);\n    return (\n      this.listFile(resource, options)\n      .then((fileArray) => {\n        const entryArray = (\n          fileArray.filter((file) => (file.injectable && id === file.id))\n          .map((file) => file.entry)\n        );\n        switch (entryArray.length) {\n          case 0:\n            return Promise.resolve();\n          case 1:\n            return entryArray[0].remove({recursive: true});\n          default:\n            throw new RangeError('Too many files found!');\n        }\n      })\n    );\n  }\n\n  /** @inheritdoc */\n  destroyAll (resource, params, options) {\n    // Validace vstupÅ¯.\n    DsBinaryAdapter.validateCommon(resource, options);\n    DsBinaryAdapter.validateParams(params);\n    return (\n      this.listFile(resource, options)\n      .then((fileArray) => (\n        // DoÄ�asnÃ© soubory se ignorujÃ­.\n        fileArray.filter((file) => file.injectable)\n        // SÃ©riovÃ© volÃ¡nÃ­ smazÃ¡nÃ­ souborÅ¯.\n        .reduce(\n          (accumulator, file) => accumulator.then(() => file.entry.remove({recursive: true})),\n          Promise.resolve()\n        )\n      ))\n    );\n  }\n\n  /** @inheritdoc */\n  find (resource, id, options) {\n    // Validace vstupÅ¯.\n    DsBinaryAdapter.validateCommon(resource, options);\n    DsBinaryAdapter.validateId(id);\n    return (\n      this.listFile(resource, options)\n      .then((listedFileArray) => {\n        const fileArray = listedFileArray.filter((file) => (file.injectable && id === file.id));\n        switch (fileArray.length) {\n          case 0:\n            throw new Error('Not Found!');\n          case 1:\n            return this.generateAttrs(resource, id, fileArray[0].entry.getPath(), options);\n          default:\n            throw new RangeError('Too many files found!');\n        }\n      })\n    );\n  }\n\n  /** @inheritdoc */\n  findAll (resource, params, options) {\n    // Validace vstupÅ¯.\n    DsBinaryAdapter.validateCommon(resource, options);\n    DsBinaryAdapter.validateParams(params);\n    return (\n      this.listFile(resource, options)\n      .then((fileArray) => {\n        const attrsArray = [];\n        return (\n          fileArray.filter((file) => file.injectable)\n          .reduce(\n            (acc, file) => acc.then(() => (\n              this.generateAttrs(resource, file.id, file.entry.getPath(), options)\n              .then((attrs) => {\n                attrsArray.push(attrs);\n              })\n            )),\n            Promise.resolve()\n          )\n          .then(() => attrsArray)\n        );\n      })\n    );\n  }\n\n  /**\n   * Generates an attrs to return to the store.\n   * @param {DsResource} resource The resource to use.\n   * @param {DsId} id The primary key of the item to generate.\n   * @param {FileSystemPath} path Path to the item's entry in the file system.\n   * @param {DsBinaryOptions|null} options Configuration options.\n   * @private\n   * @returns {Promise.<DsAttrs>} Attrs to create a store record from.\n   */\n  generateAttrs (resource, id, path, options) {\n    return new Promise((resolve) => resolve(\n      this.getFileUrl(path)\n      .then((fileUrl) => (\n        this.getLocalhostUrl(path)\n        .then((localhostUrl) => {\n          const fileAttribute = this.getOption(resource, 'fileAttribute', options);\n          const idAttribute = this.getOption(resource, 'idAttribute', options);\n          const localhostAttribute = this.getOption(resource, 'localhostAttribute', options);\n          const attrs = {};\n          attrs[fileAttribute] = fileUrl;\n          attrs[idAttribute] = id;\n          attrs[localhostAttribute] = localhostUrl;\n          return attrs;\n        })\n      ))\n    ));\n  }\n\n  /** @inheritdoc */\n  getId (resource, attrs, options) {\n    // Validace vstupÅ¯.\n    DsBinaryAdapter.validateCommon(resource, options);\n    DsBinaryAdapter.validateAttrs(attrs);\n    // PrimÃ¡rnÃ­m zdrojem identifikÃ¡toru je kontrolnÃ­ souÄ�et souboru.\n    const checksumAttribute = this.getOption(resource, 'checksumAttribute', options);\n    const checksum = attrs[checksumAttribute];\n    if (!isNil(checksum)) {\n      return checksum;\n    }\n    // SekundÃ¡rnÃ­m zdrojem identifikÃ¡toru je URL, na kterÃ© je uloÅ¾enÃ½ binÃ¡rnÃ­ obsah.\n    // Na URL se jeÅ¡tÄ› provede hash.\n    // To odstranÃ­ problÃ©my se speciÃ¡lnÃ­mi znaky v nÃ¡zvu souboru a dÃ©lkou jeho pojmenovÃ¡nÃ­.\n    const remoteAttribute = this.getOption(resource, 'remoteAttribute', options);\n    const url = attrs[remoteAttribute];\n    if (!isNil(url)) {\n      return objectHash(url);\n    }\n    // DÃ¡le jiÅ¾ nenÃ­ z Ä�eho identifikÃ¡tor urÄ�it.\n    throw new Error(`Unable to get id from attrs ${attrs}.`);\n  }\n\n  /**\n   * Gets an URL to the file protocol to be generated to attrs.\n   * @param {FileSystemPath} path Path to the item's entry in the file system.\n   * @private\n   * @returns {null|string} URL if any available.\n   */\n  getFileUrl (path) {\n    return new Promise((resolve) => {\n      if (!this.fileSystemMapper.hasFile()) {\n        return resolve(null);\n      }\n      return resolve(this.fileSystemMapper.toFileUrl(path));\n    });\n  }\n\n  /**\n   * Gets an URL to the localhost server to be generated to attrs.\n   * @param {FileSystemPath} path Path to the item's entry in the file system.\n   * @private\n   * @returns {null|string} URL if any available.\n   */\n  getLocalhostUrl (path) {\n    return new Promise((resolve) => {\n      if (!this.fileSystemMapper.hasLocalhost()) {\n        return resolve(null);\n      }\n      return resolve(this.fileSystemMapper.toLocalhostUrl(path));\n    });\n  }\n\n  /**\n   * Gets a value of an option.\n   * @param {DsResource} resource The resource to use.\n   * @param {string} key Name of the option to get.\n   * @param {DsBinaryOptions|null} options Configuration options passed in method invocation.\n   * @private\n   * @returns {null|string} Value od the option.\n   */\n  getOption (resource, key, options) {\n    // MusÃ­ ingorovat hodnoty z prototypu.\n    // - JsData vÄ›tÅ¡inou nastavujÃ­ z nÄ›jakÃ©ho dÅ¯vodu prototyp na resource.\n    // - Dojde tak k nechtÄ›nÃ©mu ignorovÃ¡nÃ­ instanceOptions a defaultOptions na Ãºkor resource.\n    if (has(options, key)) {\n      return options[key];\n    }\n    const instanceValue = get(this.instanceOptions, key);\n    if (!isUndefined(instanceValue)) {\n      return instanceValue;\n    }\n    const defaultValue = this.defaultOptions[key];\n    if (!isUndefined(defaultValue)) {\n      return defaultValue;\n    }\n    return resource[key];\n  }\n\n  /**\n   * Gets a folder for a requested resource.\n   * @param {DsResource} resource The resource to use.\n   * @param {DsBinaryOptions|null} options Configuration options.\n   * @private\n   * @returns {FileSystemPath} Path to a folder from a root.\n   */\n  getWorkspacePath (resource, options) {\n    // VÃ½bÄ›r endpoint pro vytvoÅ™enÃ­ sloÅ¾ky datovÃ©ho zdroje.\n    const endpoint = this.getOption(resource, 'endpoint', options);\n    if (!endpoint) {\n      throw new TypeError(`Missing endpoint for resource \"${resource}\".`);\n    }\n    // VÃ½bÄ›r basePath pro vytvoÅ™enÃ­ sloÅ¾ky datovÃ©ho skladu.\n    const basePath = this.getOption(resource, 'basePath', options);\n    // SpojenÃ­ Ä�Ã¡stÃ­ cesty do vÃ½slednÃ©.\n    return this.fileSystemPathFactory.join(\n      this.fileSystemPathFactory.fromValue(basePath),\n      this.fileSystemPathFactory.fromInfo({stem: endpoint})\n    );\n  }\n\n  /**\n   * OvÄ›Å™Ã­, jestli je cÃ­lovÃ½ zÃ¡znam pÅ™Ã­tomnÃ½ v souborovÃ©m systÃ©mu.\n   * @param {FileSystemPath} targetPath Cesta, na kterÃ© by mÄ›l bÃ½t cÃ­lovÃ½ zÃ¡znam.\n   * @param {boolean} extract PÅ™Ã­znak, jestli se mÃ¡ staÅ¾enÃ½ soubor rozbalit do sloÅ¾ky.\n   * @private\n   * @returns {boolean} PÅ™Ã­znak, jestli je zÃ¡znam pÅ™Ã­tomnÃ½.\n   */\n  hasTarget (targetPath, extract) {\n    return new Promise((resolve) => {\n      const {fileSystemManager} = this;\n      if (extract) {\n        return resolve(fileSystemManager.hasDirectory(targetPath));\n      }\n      return resolve(fileSystemManager.hasFile(targetPath));\n    });\n  }\n\n  /**\n   * Lists all files with detailed information for a requested resource.\n   * @param {DsResource} resource The resource to use.\n   * @param {DsBinaryOptions|null} options Configuration options.\n   * @private\n   * @returns {Array.<FileInfo>} List of infos about files.\n   */\n  listFile (resource, options) {\n    // NalezenÃ­ nastavenÃ­.\n    const temporaryExtension = this.getOption(resource, 'temporaryExtension', options);\n    // Cesta ke sloÅ¾ce pro uloÅ¾enÃ­ souboru.\n    const workspacePath = this.getWorkspacePath(resource, options);\n    return (\n      this.fileSystemManager.hasDirectory(workspacePath)\n      .then((exists) => {\n        if (!exists) {\n          // Pokud sloÅ¾ka s workspace neexistuje, povaÅ¾uje se za prÃ¡zdnou.\n          return [];\n        }\n        return (\n          this.fileSystemManager.getDirectory(workspacePath)\n          .then((directory) => directory.list())\n          .then((entryArray) => (\n            // V prvnÃ­m prÅ¯chodu se zjistÃ­ informace o vÅ¡ech naÄ�tenÃ½ch soborech.\n            entryArray.map((entry) => this.parseFile(entry, temporaryExtension))\n            // V druhÃ©m prÅ¯chodu se odstranÃ­ duplikovanÃ© soubory.\n            // NapÅ™. je neÅ¾Ã¡doucÃ­ mÃ­t soubory se stejnÃ½m id a rÅ¯znÃ½mi koncovkami.\n            // DÃ¡le se takto oznaÄ�Ã­ takÃ© napÅ¯l rozbalenÃ© archivy (zip + sloÅ¾ka).\n            .map((fileInfo, index, fileArray) => {\n              const {id} = fileInfo;\n              // TODO Detekce duplikÃ¡tÅ¯ by Å¡la napsat s lepÅ¡Ã­ Ä�asovou sloÅ¾itostÃ­ neÅ¾ N^2.\n              const duplicatedFileInfo = fileArray.find(\n                (anotherFile, anotherIndex) => (id === anotherFile.id) && !(index === anotherIndex)\n              );\n              return {...fileInfo, injectable: !fileInfo.temporary && !duplicatedFileInfo};\n            })\n          ))\n        );\n      })\n    );\n  }\n\n  /**\n   * Parses an information about a file.\n   * @param {FileSystemEntry} entry File's entry in the file system.\n   * @param {string} temporaryExtension File extension which annotates temporary file.\n   * @private\n   * @returns {FileInfo} Info about the file.\n   */\n  parseFile (entry, temporaryExtension) {\n    const name = entry.getName();\n    const filenameInfo = DsBinaryAdapter.parseFilename(name, temporaryExtension);\n    return {\n      entry,\n      id: filenameInfo.id,\n      // TODO Zpracovat lÃ©pe, neÅ¾ urÄ�ovat `injectable` na dvou mÃ­stech.\n      injectable: null,\n      temporary: filenameInfo.temporary\n    };\n  }\n\n  /**\n   * Parses an information about a name of a file.\n   * @param {string} filename Name of a file.\n   * @param {string} temporaryExtension File extension which annotates temporary file.\n   * @private\n   * @returns {FilenameInfo} Info about the file.\n   * @static\n   */\n  static parseFilename (filename, temporaryExtension) {\n    const temporarySuffix = `.${temporaryExtension}`;\n    const temporary = filename.endsWith(temporarySuffix);\n    let basename;\n    if (temporary) {\n      basename = filename.slice(0, -1 * temporarySuffix.length);\n    } else {\n      basename = filename;\n    }\n    // TODO ZvÃ¡Å¾it, jestli dovolit parsovat tmp + pÅ™Ã­ponu (nenÃ­ pouÅ¾Ã­vÃ¡no).\n    const extension = DsBinaryAdapter.parseExtension(basename);\n    let id;\n    if (extension) {\n      const extensionSuffix = `.${extension}`;\n      id = basename.slice(0, -1 * extensionSuffix.length);\n    } else {\n      id = basename;\n    }\n    return {id, temporary};\n  }\n\n  /**\n   * Parses an file extension.\n   * @param {string} filename Full name of a file.\n   * @private\n   * @returns {string} File extension.\n   * @static\n   */\n  static parseExtension (filename) {\n    // Implementace na zÃ¡kladÄ› https://stackoverflow.com/a/12900504/8315965\n    // eslint-disable-next-line no-bitwise\n    return filename.slice((filename.lastIndexOf('.') - 1 >>> 0) + 2);\n  }\n\n  /** @inheritdoc */\n  update (resource, id, attrs, options) {\n    return Promise.reject(new Error('Not implemented!'));\n  }\n\n  /** @inheritdoc */\n  updateAll (resource, attrs, params, options) {\n    return Promise.reject(new Error('Not implemented!'));\n  }\n\n  /**\n   * Validates a properties.\n   * @param {DsAttrs} attrs The properties for validation.\n   * @private\n   * @returns {undefined} Nic.\n   * @static\n   */\n  static validateAttrs (attrs) {\n    if (!isObject(attrs)) {\n      throw new TypeError(`Invalid attrs \"${attrs}\".`);\n    }\n  }\n\n  /**\n   * Validates a common input of public methods.\n   * @param {DsResource} resource The resource for validation.\n   * @param {DsBinaryOptions|null} options The configuration options for validation.\n   * @private\n   * @returns {undefined} Nic.\n   * @static\n   */\n  static validateCommon (resource, options) {\n    if (!isObject(resource)) {\n      throw new TypeError(`Invalid resource \"${resource}\".`);\n    }\n    if (!isNil(options) && !isObject(options)) {\n      throw new TypeError(`Invalid options \"${options}\".`);\n    }\n  }\n\n  /**\n   * Validates a file name to download.\n   * @param {DsResource} resource The resource to use.\n   * @param {string} filename The name of a file for validation.\n   * @param {DsBinaryOptions|null} options Configuration options.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  validateFilename (resource, filename, options) {\n    // OÅ¡etÅ™enÃ­ remoteUrl ve formÃ¡tu \"file.tmp\"?\n    // - To je problÃ©m:\n    //   - VytvoÅ™Ã­ se \"${id}.tmp.tmp\" to jeÅ¡tÄ› nevadÃ­.\n    //   - Po staÅ¾enÃ­ se pÅ™esune na \"${id}.tmp\", kterÃ½ ale bude stÃ¡le povaÅ¾ovanÃ½ za doÄ�asnÃ½.\n    //   - find a findAll tento soubor nevrÃ¡tÃ­, protoÅ¾e nevracÃ­ doÄ�asnÃ©.\n    // - Å˜eÅ¡enÃ­:\n    //   - ZakÃ¡zat stahovÃ¡nÃ­ tmp souborÅ¯, aby ke kolizi nemohlo dojÃ­t.\n    //   - Vynutit pouÅ¾itÃ­ pÅ™Ã­pon v pojmenovÃ¡nÃ­, aby se odliÅ¡ili od pÅ™Ã­znaku tmp. NapÅ™. \"file..tmp\" => \"file.\"\n    //   - ZatÃ­m zakÃ¡zÃ¡no.\n    const temporaryExtension = this.getOption(resource, 'temporaryExtension', options);\n    const temporarySuffix = `.${temporaryExtension}`;\n    if (isString(filename) && filename.endsWith(temporarySuffix)) {\n      throw new TypeError(`Invalid filename \"${filename}\".`);\n    }\n  }\n\n  /**\n   * Validates a primary key.\n   * @param {DsId} id The primary key for validation.\n   * @private\n   * @returns {undefined} Nic.\n   * @static\n   */\n  static validateId (id) {\n    if (!isString(id) && !isNumber(id)) {\n      throw new TypeError(`Invalid id \"${id}\".`);\n    }\n  }\n\n  /**\n   * Validates a query parameters.\n   * @param {DsParams|null} params Query parameters for validation.\n   * @private\n   * @returns {undefined} Nic.\n   * @static\n   */\n  static validateParams (params) {\n    if (!isEmpty(params)) {\n      throw new Error('Using params attribute is not supported.');\n    }\n  }\n}\n\nexport default DsBinaryAdapter;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ErrorLevel from './core/error/error-level';\nimport OrientationEnum from './core/orientation/orientation-enum';\n\nexport default {\n  // IdentifikÃ¡tor aplikace.\n  name: 'player-lighter',\n  // VÃ½chozÃ­ hodnota deaktivace preventivnÃ­ restartu.\n  // Pokud je \"true\", ostatnÃ­ preventivnÃ­ restart se neprovÃ¡nÃ­\n  // a ostatnÃ­ nastavenÃ­ se ignorujÃ­.\n  // PouÅ¾ije se v pÅ™Ã­padÄ›, Å¾e toto nastavenÃ­ nenÃ­ vyplnÄ›no na serveru.\n  autorebootDefaultDisabled: false,\n  // VÃ½chozÃ­ interval, ve kterÃ©m se zaÅ™Ã­zenÃ­ preventivnÄ› restartuje. [ms]\n  // PouÅ¾ije se v pÅ™Ã­padÄ›, Å¾e toto nastavenÃ­ nenÃ­ vyplnÄ›no na serveru.\n  autorebootDefaultInterval: 48 * 60 * 60 * 1000,\n  // MinimÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na automatickÃ½ restart zaÅ™Ã­zenÃ­.\n  // PÅ™Ã­liÅ¡ nÃ­zkÃ¡ hodnota mÅ¯Å¾e zpÅ¯sobit zacyklenÃ­ zaÅ™Ã­zenÃ­ v nekoneÄ�nÃ©\n  // smyÄ�ce restrartÅ¯.\n  // PÅ™Ã­liÅ¡ vysokÃ¡ hodnota znesnadnÃ­ E2E testy dlouhÃ½m Ä�ekÃ¡nÃ­m.\n  autorebootMinInterval: 15 * 60 * 1000,\n  // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na Cordova deviceready. [ms]\n  // Hodnota pochÃ¡zÃ­ z Cordova implementace, kterÃ¡ provÃ¡dÃ­ vlastnÃ­ kontrolu\n  // a vÃ½pis do konzole.\n  cordovaBootDelay: 5 * 1000,\n  // ZaÅ™Ã­zenÃ­.\n  device: {\n    // StahovaÄ� souborÅ¯.\n    downloader: {\n      // VÃ½chozÃ­ velikost souboru, pro kterou se mÃ¡ uvolnit mÃ­sto. [B]\n      defaultSize: 1024 * 1024 * 1024\n    },\n    // KomunikÃ¡tor se serverem.\n    communicator: {\n      // VÃ½chozÃ­ doba Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem o synchronizaci. [ms]\n      syncDelayBase: 60 * 1000\n      // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem o synchronizaci po neÃºspÄ›chu. [ms]\n      // TODO #5 ZatÃ­m deaktivovÃ¡no. Zpracovat dle novÃ© logiky.\n      // syncDelayMax: 4 * 60 * 1000,\n      // NÃ¡sobitel doby Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem pÅ™i neÃºspÄ›chu.\n      // TODO #5 ZatÃ­m deaktivovÃ¡no. Zpracovat dle novÃ© logiky.\n      // syncDelayMultiplier: 2\n    },\n    // Orientace zaÅ™Ã­zenÃ­.\n    orientation: {\n      // VÃ½chozÃ­ orientace zaÅ™Ã­zenÃ­.\n      defaultOrientationEnum: OrientationEnum.CLOCKWISE_0\n    },\n    // SezenÃ­ - rÅ¯znÃ© konfigurace zaÅ™Ã­zenÃ­.\n    session: {\n      // IdentifikÃ¡tor session, kterÃ¡ se naÄ�te pÅ™i startu aplikace.\n      defaultId: 'default'\n    }\n  },\n  // Port, na kterÃ©m je spuÅ¡tÄ›nÃ½ localhost HTTP server se souborovÃ½m systÃ©mem.\n  fileSystemLocalhostPort: 7587,\n  // Firmware zaÅ™Ã­zenÃ­.\n  firmware: {\n    // VÃ½chozÃ­ velikost firmware, pro kterou se mÃ¡ uvolnit mÃ­sto. [B]\n    defaultSize: 1024 * 1024 * 1024\n  },\n  // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na naÄ�tenÃ­ iframe. [ms]\n  htmlIframeLoadDelay: 60 * 1000,\n  // MaximÃ¡lnÃ­ poÄ�et plÃ¡novÃ¡nÃ­ opakovanÃ½ch udÃ¡lostÃ­, kterÃ½ je nutnÃ½\n  // pro prevenci zacyklenÃ­ a zkrÃ¡cenÃ­ doby vÃ½poÄ�tu v kalendÃ¡Å™i.\n  // Omezuje se poÄ�et opakovÃ¡nÃ­, nikoliv doba, po kterou se opakovÃ¡nÃ­ provÃ¡dÃ­.\n  // NejmenÅ¡Ã­ interval opakovÃ¡nÃ­ je jeden den, z Ä�ehoÅ¾ lze pÅ™i vÃ½poÄ�tu vychÃ¡zet.\n  // OstatnÃ­ druh opakovÃ¡nÃ­ (tÃ½dennÃ­, ...) se budou opakovat po delÅ¡Ã­ dobu.\n  // TaktÃ©Å¾ opakovÃ¡nÃ­ ve vÄ›tÅ¡Ã­m intervalu (2 dny, ...) nebudou tolik omezenÃ©.\n  // VÃ½chozÃ­ hodnotou IcalExpander je 1000 opakovÃ¡nÃ­, tedy cca. 3 roky.\n  // Na serveru je kalendÃ¡Å™ v rozsahu +-5 let od aktuÃ¡lnÃ­ho data\n  // tzn. rozsah 10 let, coÅ¾ je v nejhorÅ¡Ã­m pÅ™Ã­padÄ› 10 * 365 opakovÃ¡nÃ­.\n  icalPlannerMaxIterations: 5 * 365,\n  // Rozsah verzÃ­ Ki-Wi Lighter API se kterÃ½mi je aplikace kompatibilnÃ­.\n  // Je zaloÅ¾eno na semver specifikaci a lze vyuÅ¾Ã­t jejÃ­ syntaxi.\n  // Typicky se pouÅ¾Ã­vÃ¡ syntaxe '^1.3.7', coÅ¾ znamenÃ¡ \"kompatibilnÃ­ s 1.3.7\"\n  // a pÅ™esnÄ› to odpovÃ­dÃ¡ rozsahu verzÃ­ >=1.3.7 a <2.0.0.\n  kiwiLighterApiVersion: '0.11.*',\n  // MaximÃ¡lnÃ­ doba, na kterou je moÅ¾nÃ© nastavit Ä�asovaÄ�.\n  // Hodnota odpovÃ­dÃ¡ maximu pro 32 bitovÃ½ integer a vychÃ¡zÃ­ z implementace,\n  // kterou pouÅ¾Ã­vÃ¡ vÄ›tÅ¡ina rozÅ¡Ã­Å™enÃ½ch prohlÃ­Å¾eÄ�Å¯.\n  longTimersMaxDelay: Math.pow(2, 31) - 1,\n  // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na navÃ¡zÃ¡nÃ­ komunikace s PDF prohlÃ­Å¾eÄ�em. [ms]\n  pdfConnectionTimeout: 5 * 1000,\n  // PoÄ�et strÃ¡nek PDF dokumentu, kterÃ© se pÅ™ehrajÃ­ za jednu vteÅ™inu. [Hz]\n  // Na zÃ¡kladÄ› tÃ©to hodnoty se urÄ�uje vÃ½chozÃ­ rychlost pÅ™ehrÃ¡vÃ¡nÃ­ PDF dokumentu.\n  pdfPageRate: 0.1,\n  // MaximÃ¡lnÃ­ poÄ�et souÄ�asnÄ› zobrazovanÃ½ch PDF.\n  pdfSourceMax: 3,\n  // PlatformnÄ› specifickÃ¡ nastavenÃ­.\n  platform: {\n    tizenSssp4: {\n      // MinimÃ¡lnÃ­ poÄ�et sekund od zaÄ�Ã¡tku epochy, po kterÃ©m se aplikace mÅ¯Å¾e spustit. [s]\n      booterClockLimit: new Date(2000, 0).getTime(),\n      // Interval, ve kterÃ©m se kontroluje, jestli je jiÅ¾ prostÅ™edÃ­ pÅ™ipraveno\n      // pro start aplikace. [ms]\n      // SouvisÃ­ s Tizen bugem, kdy nÄ›kdy nenÃ­ dostupnÃ½ aktuÃ¡lnÃ­ Ä�as (viz #230).\n      booterRetryDelay: 500,\n      // Prodleva pÅ™ed synchronizacÃ­ globÃ¡lnÃ­ch a B2B hodin. [ms]\n      // Televize Samsung obsahujÃ­ dvoje hodiny -- jedny globÃ¡lnÃ­, ke kterÃ½m se\n      // pÅ™istupuje pomocÃ­ standardnÃ­ho JavaScriptovÃ©ho API (`Date` apod.), druhÃ©\n      // v rÃ¡mci B2B API. Tyto dva zdroje nejsou synchronizovanÃ© a B2B hodiny se\n      // navÃ­c pÅ™i provozu samovolnÄ› zpoÅ¾Ä�ujÃ­. ÄŒasovaÄ�e zapnutÃ­ a vypnutÃ­ se Å™Ã­dÃ­\n      // prÃ¡vÄ› B2B hodinami, proto je naÅ¡Ã­m niternÃ½m zÃ¡jmem, aby byly bÄ›hem provozu\n      // aktuÃ¡lnÃ­ a co nejmÃ©nÄ› pozadu.\n      clockSyncInterval: 24 * 60 * 60 * 1000\n    }\n  },\n  // ÃšroveÅˆ dÅ¯leÅ¾itosti chyby, od kterÃ© se zaÄ�Ã­najÃ­ odesÃ­lat udÃ¡losti na Sentry.\n  // Chyby s niÅ¾Å¡Ã­ prioritou jsou zalogovÃ¡ny jako breadcrumbs a jsou odeslÃ¡ny\n  // pouze jako dodateÄ�nÃ¡ informace k nÄ›jakÃ© budoucÃ­ chybÄ›, kterÃ¡ bude mÃ­t\n  // stejnou nebo vyÅ¡Å¡Ã­ prioritu, neÅ¾ je zde stanovenÃ¡ ÃºroveÅˆ.\n  sentryCaptureErrorLevel: ErrorLevel.Error,\n  // MaximÃ¡lnÃ­ poÄ�et perzistentnÄ› uloÅ¾enÃ½ch vÃ½jimek v offline stavu.\n  // Je nutnÃ© nastavit na nÃ­zkou hodnotu, jinak hrozÃ­ zaplnÄ›nÃ­ localStorage.\n  sentryMaxEvents: 5,\n  // Setup Wizard pro instalaci zaÅ™Ã­zenÃ­.\n  setup: {\n    // Doba mezi pokusy o automatickou registraci na zÃ¡kladÄ› otisku. [ms]\n    automaticDelay: 60 * 1000,\n    // VÃ½chozÃ­ hodnota formulÃ¡Å™ovÃ©ho pole s nÃ¡zvem zaÅ™Ã­zenÃ­.\n    deviceName: '',\n    // VÃ½chozÃ­ doba Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem pÅ™i neÃºspÄ›chu. [ms]\n    failureDelayBase: 60 * 1000,\n    // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem po neÃºspÄ›chu. [ms]\n    failureDelayMax: 4 * 60 * 1000,\n    // NÃ¡sobitel doby Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem pÅ™i neÃºspÄ›chu.\n    failureDelayMultiplier: 2,\n    // VÃ½chozÃ­ hodnota formulÃ¡Å™ovÃ©ho pole s heslem uÅ¾ivatele.\n    password: '',\n    // VÃ½chozÃ­ hodnota formulÃ¡Å™ovÃ©ho pole s URL serveru.\n    serverUrl: 'https://server.ki-wi.cz/kiwi-server',\n    // Doba Ä�ekÃ¡nÃ­ pÅ™i zobrazenÃ­ obazovky o ÃºspÄ›Å¡nÃ©n nastavenÃ­. [ms]\n    successDelay: 5 * 1000,\n    // VÃ½chozÃ­ hodnota formulÃ¡Å™ovÃ©ho pole s pÅ™ihlaÅ¡ovacÃ­m jmÃ©nem uÅ¾ivatele.\n    username: ''\n  },\n  // VÃ½chozÃ­ mÃ©dia typ streamÅ¯, kterÃ½ se pouÅ¾ije,\n  // pokud nemÃ¡ mÃ©dium Å¾Ã¡dnÃ½ typ definovÃ¡n.\n  streamDefaultContainer: 'video/mp4',\n  // MaximÃ¡lnÃ­ poÄ�et Ä�asovaÄ�Å¯, kterÃ½ je dovolen nastavit.\n  // Na SSSP je poÄ�et omezen na 7 Ä�asovaÄ�Å¯ zapnutÃ­ a 7 Ä�asovaÄ�Å¯ vypnutÃ­.\n  // ÄŒasovaÄ�e nad tento limit jsou ignorovÃ¡ny.\n  // Na webOS je situace podobnÃ¡ a TV nedovolÃ­ nastavit vÃ­ce Ä�asovaÄ�Å¯ 7 + 7.\n  // PÅ™i pokusu o nastavenÃ­ dalÅ¡Ã­ho Ä�asovaÄ�e dojde k chybÄ› pÅ™i volÃ¡nÃ­ metody.\n  // Informace o tomto limitu v dokumentaci chybÃ­, ale byla potvrzena na fÃ³ru.\n  timerMax: 7,\n  // ProlÃ­naÄ� mÃ©diÃ­.\n  viewer: {\n    // ZpoÅ¾dÄ›nÃ­, kterÃ© se aplikuje pÅ™i detekovanÃ©m zacyklenÃ­. [ms]\n    errorDelay: 1 * 1000,\n    // PoÄ�et po sobÄ› jdoucÃ­ch selhanÃ½ch mÃ©diÃ­, kterÃ© se povaÅ¾ujÃ­ za zacyklenÃ­.\n    errorLimit: 10,\n    // MaximÃ¡lnÃ­ poÄ�et mÃ©diÃ­, kterÃ© se pÅ™eskoÄ�Ã­ pÅ™i pokusu o pÅ™ednaÄ�tenÃ­ nÃ¡sledujÃ­cÃ­ho slajdu.\n    // Po dosaÅ¾enÃ­ limitu se pokus o naÄ�tenÃ­ zruÅ¡Ã­ a nÃ¡sledujÃ­cÃ­ mÃ©dium pÅ™ehraje bez pÅ™ednaÄ�tenÃ­.\n    // ÄŒÃ­m vÄ›tÅ¡Ã­ hodnota, tÃ­m nÃ¡roÄ�nÄ›jÅ¡Ã­ je vyhledÃ¡nÃ­ slajdu k naÄ�tenÃ­.\n    // Pokud by bylo neomezeno, tak hrozÃ­ deadlock,\n    // kdy se mÅ¯Å¾e hledat vhodnÃ© mÃ©dium do nekoneÄ�na a nedojde k uvolnÄ›nÃ­ pÅ™ehrÃ¡vanÃ©ho zdroje.\n    loadLimit: 10\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nexport default {\n  name: 'analyticsCounter',\n  relations: {\n    belongsTo: {\n      analyticsGroup: {\n        localField: 'analyticsGroup',\n        localKey: 'analyticsGroupId'\n      },\n      medium: {\n        localField: 'medium',\n        localKey: 'mediumId'\n      }\n    }\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nexport default {\n  name: 'analyticsGroup'\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\n\n/**\n * AnalytickÃ½ cyklus.\n * Spravuje sbÄ›r analytickÃ½ch dat do skupin v danÃ½ch intervalech.\n * @implements {Destroyable}\n * @implements {EventBus}\n */\nclass AnalyticsCycle {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Store} store DatovÃ½ sklad s analytickÃ½mi daty.\n   * @returns {AnalyticsCycle} NovÃ¡ instance.\n   */\n  constructor (store) {\n    // Validace argumentÅ¯.\n    if (!isObject(store)) {\n      throw new TypeError(`Invalid store \"${store}\".`);\n    }\n    /**\n     * Skupina svÃ¡zanÃ¡ s aktuÃ¡lnÄ› spuÅ¡tÄ›nÃ½m analytickÃ½m cyklem.\n     * Hodnota je zaruÄ�enÄ› nastavena, pokud je cyklus spuÅ¡tÄ›nÃ½.\n     * @readonly\n     * @type {?AnalyticsGroup}\n     */\n    this.analyticsGroup = null;\n    /**\n     * Doba, kterou trvÃ¡ perioda aktuÃ¡lnÄ› spuÅ¡tÄ›nÃ©ho analytickÃ©ho cyklu. [ms]\n     * Hodnota je zaruÄ�enÄ› nastavena, pokud je cyklus spuÅ¡tÄ›nÃ½.\n     * @readonly\n     * @type {?number}\n     */\n    this.analyticsPeriod = null;\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    /**\n     * DatovÃ½ sklad s analytickÃ½mi daty.\n     * @private\n     * @type {Store}\n     */\n    this.store = store;\n    /**\n     * ÄŒasovaÄ� s naplÃ¡novanÃ½m ukonÄ�enÃ­m spuÅ¡tÄ›nÃ©ho analytickÃ©ho cyklu.\n     * @private\n     * @type {?number}\n     */\n    this.timeout = null;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onError = this.onError.bind(this);\n    this.onTimeout = this.onTimeout.bind(this);\n  }\n\n  /**\n   * ZruÅ¡Ã­ naplÃ¡novanÃ½ konec cyklu.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  cancelTimeout () {\n    const {timeout} = this;\n    // Kontrola nastavenÃ­ timeoutu ke zruÅ¡enÃ­.\n    if (!timeout) {\n      throw new Error('Timeout is not set.');\n    }\n    // PÅ™eruÅ¡enÃ­ Ä�asovaÄ�e ukonÄ�enÃ­ cyklu.\n    clearTimeout(timeout);\n    this.timeout = null;\n  }\n\n  /**\n   * UzavÅ™e analytickou skupinu.\n   * @param {AnalyticsGroup} analyticsGroup Skupina, kterÃ¡ se mÃ¡ uzavÅ™Ã­t.\n   * @returns {Promise.<AnalyticsGroup>} VyÅ™eÅ¡Ã­ se po uzavÅ™enÃ­.\n   */\n  closeGroup (analyticsGroup) {\n    return new Promise((resolve) => resolve(\n      this.store.update('analyticsGroup', analyticsGroup.id, {\n        // NastavenÃ­ closed dle aktuÃ¡lnÃ­ho Ä�asu.\n        closed: new Date().toISOString()\n      })\n    ));\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    clearTimeout(this.timeout);\n  }\n\n  /**\n   * Zkontroluje, jestli je analytickÃ½ cyklus spuÅ¡tÄ›nÃ½.\n   * SpuÅ¡tÄ›nÃ½ cyklus zaruÄ�uje pÅ™Ã­tomnost `analyticsGroup` a `analyticsPeriod`.\n   * @returns {boolean} PÅ™Ã­znak, Å¾e je cyklus spuÅ¡tÄ›nÃ½.\n   */\n  isStarted () {\n    // Pro kontrolu se pouÅ¾Ã­vÃ¡ analytickÃ¡ skupina, kterÃ¡ je vÅ¾dy nastavenÃ¡.\n    // Kdyby nastavenÃ¡ nebyla, tak by dochÃ¡zelo k ignoraci.\n    // Pozor na timeout, kterÃ½ v nÄ›kterÃ½ch okamÅ¾icÃ­ch (napÅ™. restart) nemusÃ­ bÃ½t nastavenÃ½.\n    return !isNil(this.analyticsGroup);\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na chybu.\n   * @fires AnalyticsCycle#error\n   * @param {Error} error ChybovÃ½ objekt.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onError (error) {\n    this.emitter.emit('error', error);\n  }\n\n  /**\n   * Reakce na uplynutÃ­ konce cyklu.\n   * UkonÄ�Ã­ probÃ­hajÃ­cÃ­ iteraci cyklu a spustÃ­ novou.\n   * @fires AnalyticsCycle#ended\n   * @fires AnalyticsCycle#error\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onTimeout () {\n    try {\n      // Reset identifikÃ¡toru prÃ¡vÄ› vyvolanÃ©ho timeout.\n      this.timeout = null;\n      // Restart skonÄ�enÃ© iterace.\n      this.restartIteration(this.analyticsPeriod)\n      .catch(this.onError);\n    } catch (error) {\n      this.onError(error);\n    }\n  }\n\n  /**\n   * OtevÅ™e novou analytickou skupinu.\n   * @returns {Promise.<AnalyticsGroup>} VyÅ™eÅ¡Ã­ se po otevÅ™enÃ­.\n   */\n  openGroup () {\n    return new Promise((resolve) => resolve(\n      this.store.create('analyticsGroup', {\n        // NastavenÃ­ opened dle aktuÃ¡lnÃ­ho Ä�asu.\n        opened: new Date().toISOString()\n      })\n    ));\n  }\n\n  /**\n   * PÅ™edÄ�asnÄ› zastavÃ­ probÃ­hajÃ­cÃ­ analytickÃ½ cyklus a spustÃ­ novÃ½.\n   * NarozdÃ­l od oddÄ›lenÃ©ho zastavenÃ­ a spuÅ¡tÄ›nÃ­ nepÅ™eruÅ¡Ã­ nastavenÃ­ navÃ¡zanÃ© skupiny.\n   * @fires AnalyticsCycle#ended\n   * @fires AnalyticsCycle#error\n   * @param {number} analyticsPeriod Doba, kterou trvÃ¡ analytickÃ½ cyklus. [ms]\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po spuÅ¡tÄ›nÃ­ analytickÃ©ho cyklu.\n   */\n  restart (analyticsPeriod) {\n    return new Promise((resolve) => {\n      // Kontrola stavu cyklu.\n      if (!this.isStarted()) {\n        throw new Error('Cycle is not in progress.');\n      }\n      // ZruÅ¡enÃ­ naplÃ¡novanÃ©ho konce iterace.\n      this.cancelTimeout();\n      // Restart probÃ­hajÃ­cÃ­ iterace.\n      return resolve(\n        this.restartIteration(analyticsPeriod)\n      );\n    });\n  }\n\n  /**\n   * ZastavÃ­ probÃ­hajÃ­cÃ­ iteraci analytickÃ©ho cyklu a spustÃ­ novou.\n   * @fires AnalyticsCycle#ended\n   * @fires AnalyticsCycle#error\n   * @param {number} analyticsPeriod Doba, kterou trvÃ¡ analytickÃ½ cyklus. [ms]\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po spuÅ¡tÄ›nÃ­ iterace analytickÃ©ho cyklu.\n   */\n  restartIteration (analyticsPeriod) {\n    // TODO #121 OÅ¡etÅ™it opakovanÃ© spouÅ¡tÄ›nÃ­.\n    return new Promise((resolve) => {\n      // UloÅ¾enÃ­ ukonÄ�ovanÃ© analytickÃ© skupiny.\n      const oldAnalyticsGroup = this.analyticsGroup;\n      return resolve(\n        // UzavÅ™enÃ­ ukonÄ�ovanÃ© analytickÃ© skupiny.\n        this.closeGroup(oldAnalyticsGroup)\n        // OtevÅ™enÃ­ novÃ© analytickÃ© skupiny.\n        .then(() => this.openGroup())\n        // SynchronnÃ­ vÃ½mÄ›na ukonÄ�ovanÃ© analytickÃ© skupiny za novou.\n        // Je totiÅ¾ nutnÃ© mÃ­t neustÃ¡le nastavenou nÄ›jakou aktivnÃ­ skupinu.\n        .then((newAnalyticsGroup) => {\n          // NastavenÃ­ aktivnÃ­ skupiny cyklu.\n          this.analyticsGroup = newAnalyticsGroup;\n          // UloÅ¾enÃ­ periody pro dalÅ¡Ã­ iterace cyklu.\n          this.analyticsPeriod = analyticsPeriod;\n          // NaplÃ¡novÃ¡nÃ­ konce novÃ© iterace cyklu.\n          this.startTimeout(analyticsPeriod);\n          // VyvolÃ¡nÃ­ udÃ¡losti po dokonÄ�enÃ­ vÃ½mÄ›ny.\n          this.emitter.emit('ended', oldAnalyticsGroup);\n        })\n      );\n    });\n  }\n\n  /**\n   * SpustÃ­ novÃ½ analytickÃ½ cyklus.\n   * @fires AnalyticsCycle#ended\n   * @fires AnalyticsCycle#error\n   * @param {number} analyticsPeriod Doba, kterou trvÃ¡ analytickÃ½ cyklus. [ms]\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po spuÅ¡tÄ›nÃ­ analytickÃ©ho cyklu.\n   */\n  start (analyticsPeriod) {\n    // TODO #121 OÅ¡etÅ™it opakovanÃ© spouÅ¡tÄ›nÃ­.\n    return new Promise((resolve) => {\n      // Kontrola stavu cyklu.\n      if (this.isStarted()) {\n        throw new Error('Another cycle is in progress.');\n      }\n      // Start prvnÃ­ iterace analytickÃ©ho cyklu.\n      return resolve(\n        // OtevÅ™enÃ­ novÃ© analytickÃ© skupiny.\n        this.openGroup()\n        // SpuÅ¡tÄ›nÃ­ iterace analytickÃ©ho cyklu.\n        .then((analyticsGroup) => {\n          // NastavenÃ­ aktivnÃ­ skupiny cyklu.\n          this.analyticsGroup = analyticsGroup;\n          // UloÅ¾enÃ­ periody pro dalÅ¡Ã­ iterace cyklu.\n          this.analyticsPeriod = analyticsPeriod;\n          // NaplÃ¡novÃ¡nÃ­ konce iterace cyklu.\n          this.startTimeout(analyticsPeriod);\n        })\n      );\n    });\n  }\n\n  /**\n   * NaplÃ¡nuje konec jednÃ© iterace analytickÃ©ho cyklu.\n   * @fires AnalyticsCycle#ended\n   * @fires AnalyticsCycle#error\n   * @param {number} analyticsPeriod Doba, kterou trvÃ¡ analytickÃ½ cyklus. [ms]\n   * @private\n   * @returns {undefined} Nic.\n   */\n  startTimeout (analyticsPeriod) {\n    // Kontrola duplikÃ¡tnÃ­ho spuÅ¡tÄ›nÃ­ timeoutu.\n    if (this.timeout) {\n      throw new Error('Timeout is already set.');\n    }\n    // Kontrola periody cyklu.\n    // Pro jistotu se pouÅ¾Ã­vÃ¡ oÅ¡etÅ™enÃ­ minimÃ¡lnÃ­ i maximÃ¡lnÃ­ hodnoty pro prevenci zacyklenÃ­ s `delay = 0`.\n    // VÃ­ce informacÃ­ https://stackoverflow.com/questions/3468607/why-does-settimeout-break-for-large-millisecond-delay-values\n    // TODO ZvÃ¡Å¾it obecnÃ© Å™eÅ¡enÃ­ tohoto problÃ©mu jako v jinÃ½ch projektech.\n    if (!Number.isFinite(analyticsPeriod)) {\n      throw new TypeError(`Invalid cycle period \"${analyticsPeriod}\".`);\n    }\n    if (!(analyticsPeriod > 0 && analyticsPeriod < 0x7FFFFFFF)) {\n      throw new RangeError(`Cycle period \"${analyticsPeriod}\" is out of range.`);\n    }\n    this.timeout = setTimeout(this.onTimeout, analyticsPeriod);\n  }\n\n  /**\n   * PÅ™edÄ�asnÄ› zastavÃ­ spuÅ¡tÄ›nÃ½ analytickÃ½ cyklus.\n   * @fires AnalyticsCycle#ended\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po zastavenÃ­ analytickÃ©ho cyklu.\n   */\n  stop () {\n    return new Promise((resolve) => {\n      // Kontrola stavu cyklu.\n      if (!this.isStarted()) {\n        throw new Error('Cycle is not in progress.');\n      }\n      // ZruÅ¡enÃ­ naplÃ¡novanÃ©ho konce iterace.\n      this.cancelTimeout();\n      // UloÅ¾enÃ­ ukonÄ�ovanÃ© analytickÃ© skupiny.\n      const {analyticsGroup} = this;\n      // Reset analytickÃ© skupiny a periody do vÃ½chozÃ­ho stavu.\n      this.analyticsGroup = null;\n      this.analyticsPeriod = null;\n      return resolve(\n        // UzavÅ™enÃ­ ukonÄ�ovanÃ© analytickÃ© skupiny.\n        this.closeGroup(analyticsGroup)\n        // VyvolÃ¡nÃ­ udÃ¡losti po dokonÄ�enÃ­ vÃ½mÄ›ny.\n        .then(() => {\n          this.emitter.emit('ended', analyticsGroup);\n        })\n      );\n    });\n  }\n}\n\n/**\n * Konec jednÃ© iterace analytickÃ©ho cyklu.\n * Nebere ohled na to, jestli byl cyklus pÅ™eruÅ¡enÃ½ pÅ™edbÄ›Å¾nÄ›, nebo po uplyutÃ­ poÅ¾adovanÃ© periody.\n * @event AnalyticsCycle#ended\n * @param {AnalyticsGroup} analyticsGroup AnalytickÃ¡ skupina ukonÄ�enÃ©ho cyklu.\n */\n\n/**\n * ChybovÃ¡ udÃ¡lost.\n * @event AnalyticsCycle#error\n * @param {Error} error ChybovÃ© hlÃ¡Å¡enÃ­.\n */\n\nexport default AnalyticsCycle;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport isObject from 'lodash/isObject';\nimport sortBy from 'lodash/sortBy';\n\nimport AnalyticsCycle from '../cycle/analytics-cycle';\nimport AnalyticsTransport from '../transport/analytics-transport';\n\n/**\n * SprÃ¡vce analytickÃ½ch dat.\n * PÅ™ijÃ­mÃ¡ zaznamenanÃ¡ data a zÃ¡lohuje je.\n * Å˜Ã­dÃ­ analytickÃ½ cyklus a odesÃ­lÃ¡nÃ­ uzavÅ™enÃ½ch skupin na server.\n * @implements {EventBus}\n */\nclass AnalyticsTracker {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {QueueFactory} queueFactory TovÃ¡rna na fronty asynchronnÃ­ch akcÃ­.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Store} store DatovÃ½ sklad s analytickÃ½mi daty.\n   * @returns {AnalyticsTracker} NovÃ¡ instance.\n   */\n  constructor (queueFactory, session, store) {\n    if (!isObject(queueFactory)) {\n      throw new TypeError(`Invalid queue factory \"${queueFactory}\".`);\n    }\n    if (!isObject(session)) {\n      throw new TypeError(`Invalid session \"${session}\".`);\n    }\n    if (!isObject(store)) {\n      throw new TypeError(`Invalid store \"${store}\".`);\n    }\n    /**\n     * AnalytickÃ½ cyklus.\n     * @private\n     * @type {AnalyticsCycle}\n     */\n    this.analyticsCycle = new AnalyticsCycle(store);\n    /**\n     * TransportÃ©r analytickÃ½ch dat.\n     * @private\n     * @type {AnalyticsTransport}\n     */\n    this.analyticsTransport = new AnalyticsTransport();\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    /**\n     * Fronta asynchronnÃ­ch zÃ¡znamenÃ¡nÃ­ analytickÃ½ch dat.\n     * @private\n     * @type {Queue}\n     */\n    this.queue = queueFactory.create();\n    /**\n     * SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n     * @private\n     * @type {Session}\n     */\n    this.session = session;\n    /**\n     * DatovÃ½ sklad s analytickÃ½mi daty.\n     * @private\n     * @type {Store}\n     */\n    this.store = store;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onCycleEnded = this.onCycleEnded.bind(this);\n    this.onError = this.onError.bind(this);\n    this.onTransportSuccess = this.onTransportSuccess.bind(this);\n    // NaslouchÃ¡nÃ­ udÃ¡lostem.\n    this.analyticsCycle.on('ended', this.onCycleEnded);\n    this.analyticsCycle.on('error', this.onError);\n  }\n\n  /**\n   * UvolnÃ­ vÅ¡echny zdroje pro garbage collection.\n   * @returns {undefined} Nic.\n   */\n  destroy () {\n    // ZruÅ¡enÃ­ naslouchÃ¡nÃ­ udÃ¡lostem.\n    this.analyticsCycle.off('ended', this.onCycleEnded);\n    this.analyticsCycle.destroy();\n  }\n\n  /**\n   * ZvÃ½Å¡Ã­ existujÃ­cÃ­ poÄ�Ã­tadlo o jedno pÅ™ehrÃ¡nÃ­.\n   * @param {AnalyticsCounter} analyticsCounter PoÄ�Ã­tadlo ke zvÃ½Å¡enÃ­.\n   * @private\n   * @returns {Promise.<AnalyticsCounter>} ZvÃ½Å¡enÃ© poÄ�Ã­tadlo.\n   */\n  incrementCounter (analyticsCounter) {\n    return new Promise((resolve) => {\n      const played = analyticsCounter.played + 1;\n      return resolve(\n        this.store.update('analyticsCounter', analyticsCounter.id, {played})\n      );\n    });\n  }\n\n  /**\n   * ZaznamenÃ¡ analytickÃ¡ data.\n   * @param {ScheduleInfo} scheduleInfo Informace o pÅ™ehranÃ©m mÃ©diu k zaznamenÃ¡nÃ­.\n   * @returns {Promise.<AnalyticsCounter>} AgregovanÃ¡ data, do kterÃ½ch byl proveden zÃ¡znam.\n   */\n  hit (scheduleInfo) {\n    return new Promise((resolve) => resolve(\n      this.queue.enqueue(() => {\n        if (!scheduleInfo.hasMedium()) {\n          // Data jsou zaznamenÃ¡na pouze pokud bylo pÅ™ehrÃ¡no mÃ©dium.\n          return;\n        }\n        const {analyticsCycle} = this;\n        if (!analyticsCycle.isStarted()) {\n          // Data jsou zaznamenÃ¡na pouze pokud je spuÅ¡tÄ›nÃ½ analytickÃ½ cyklus.\n          // TODO #309 ProÄ� nefunguje analytika?\n          // - VypadÃ¡ to, Å¾e se z nÄ›jakÃ©ho dÅ¯vodu nenastavÃ­ `session.analyticsPeriod`.\n          // - Zde se pak logovÃ¡nÃ­ zastavÃ­.\n          return;\n        }\n        // ZjiÅ¡tÄ›nÃ­ identifikÃ¡torÅ¯ potÅ™ebnÃ½ch pro vyhledÃ¡nÃ­ analytickÃ©ho poÄ�Ã­tadla.\n        const {analyticsGroup} = analyticsCycle;\n        const analyticsGroupId = analyticsGroup.id;\n        const medium = scheduleInfo.getMedium();\n        const mediumId = medium.id;\n        // NalezenÃ­ odpovÃ­dajÃ­cÃ­ho analytickÃ©ho poÄ�Ã­tadla.\n        const analyticsCounterArray = (\n          this.store.filter('analyticsCounter')\n          .filter((analyticsCounter) => (\n            analyticsGroupId === analyticsCounter.analyticsGroupId &&\n            mediumId === analyticsCounter.mediumId\n          ))\n        );\n        // RozhodnutÃ­ jakou operaci provÃ©st dle poÄ�tu nalezenÃ½ch poÄ�Ã­tadel.\n        switch (analyticsCounterArray.length) {\n          case 0:\n            // Pokud poÄ�Ã­tadlo neexistuje, vytvoÅ™Ã­ se novÃ©.\n            return this.openCounter(analyticsGroup, medium);\n          case 1:\n            // Pokud bylo nalezeno odpovÃ­dajÃ­cÃ­ poÄ�Ã­tadlo, tak se zvÃ½Å¡Ã­ jeho poÄ�et.\n            return this.incrementCounter(analyticsCounterArray[0]);\n          default:\n            // NalezenÃ­ jinÃ©ho poÄ�tu poÄ�Ã­tadel znaÄ�Ã­ nÄ›jakou chybu v logice.\n            throw new Error(`Too many matching counters.`);\n        }\n      })\n    ));\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na konec analytickÃ©ho cyklu.\n   * @param {AnalyticsGroup} analyticsGroup UkonÄ�enÃ¡ analytickÃ¡ skupina.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onCycleEnded (analyticsGroup) {\n    try {\n      this.send(analyticsGroup)\n      .catch(this.onError);\n    } catch (error) {\n      this.onError(error);\n    }\n  }\n\n  /**\n   * Reakce na chybu.\n   * @param {Error} error ChybovÃ½ objekt.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onError (error) {\n    this.emitter.emit('error', error);\n  }\n\n  /**\n   * Reakce na ÃºspÄ›Å¡nÃ© odeslÃ¡nÃ­ analytickÃ½ch dat.\n   * @param {Array.<AnalyticsCounter>} analyticsCounterArray OdeslanÃ¡ analytickÃ¡ poÄ�Ã­tadla.\n   * @param {AnalyticsGroup} analyticsGroup OdeslanÃ¡ analytickÃ¡ skupina.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onTransportSuccess (analyticsCounterArray, analyticsGroup) {\n    try {\n      this.remove(analyticsCounterArray, analyticsGroup)\n      .catch(this.onError);\n    } catch (error) {\n      this.onError(error);\n    }\n  }\n\n  /**\n   * OtevÅ™e novÃ© analytickÃ© poÄ�Ã­tadlo.\n   * @param {AnalyticsGroup} analyticsGroup AnalytickÃ¡ skupina, do kterÃ© poÄ�Ã­tadlo patÅ™Ã­.\n   * @param {Medium} medium PÅ™ehranÃ© mÃ©dium, ke kterÃ©mu se poÄ�Ã­tadlo vztahuje.\n   * @private\n   * @returns {Promise.<AnalyticsCounter>} OtevÅ™enÃ© poÄ�Ã­tadlo.\n   */\n  openCounter (analyticsGroup, medium) {\n    return new Promise((resolve) => resolve(\n      this.store.create('analyticsCounter', {\n        analyticsGroupId: analyticsGroup.id,\n        mediumId: medium.id,\n        name: medium.name,\n        played: 1,\n        type: medium.type\n      })\n    ));\n  }\n\n  /**\n   * OdeÅ¡le analytickou skupinu na server.\n   * @param {AnalyticsGroup} analyticsGroup AnalytickÃ¡ skupina k odeslÃ¡nÃ­.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po zaÅ™azenÃ­ k odeslÃ¡nÃ­, nebo po odebrÃ¡nÃ­ prÃ¡zdnÃ© skupiny.\n   */\n  send (analyticsGroup) {\n    return new Promise((resolve) => {\n      const {session} = this;\n      const analyticsGroupId = analyticsGroup.id;\n      const analyticsCounterArray = (\n        this.store.filter('analyticsCounter')\n        .filter((analyticsCounter) => analyticsGroupId === analyticsCounter.analyticsGroupId)\n      );\n      let result;\n      if (analyticsCounterArray.length) {\n        // OdeslÃ¡nÃ­ analytickÃ© skupiny a jejÃ­ch poÄ�Ã­tadel.\n        // TODO #121 PÅ™Ã­prava na implementaci fronty.\n        // - NeÄ�ekÃ¡ se na vÃ½sledek, ten bude emitovÃ¡n.\n        // - DemonstraÄ�nÃ­ emit udÃ¡losti.\n        // - Doplnit reakci na neÃºspÄ›ch AnalyticsTransport#send.\n        this.analyticsTransport.send(\n          analyticsCounterArray,\n          analyticsGroup,\n          session.deviceId,\n          session.serverUrl\n        )\n        .then(() => this.onTransportSuccess(analyticsCounterArray, analyticsGroup))\n        .catch(this.onError);\n      } else {\n        // Pokud by v analytickÃ© skupinÄ› nebylo Å¾Ã¡dnÃ© poÄ�Ã­tadlo, tak se nic neposÃ­lÃ¡.\n        // AnalytickÃ¡ skupina je ihned smazÃ¡na.\n        result = this.remove(analyticsCounterArray, analyticsGroup);\n      }\n      return resolve(result);\n    });\n  }\n\n  /**\n   * SmaÅ¾e nepotÅ™ebnÃ¡ analytickÃ¡ data ze zÃ¡lohy.\n   * @param {Array.<AnalyticsCounter>} analyticsCounterArray AnalytickÃ¡ poÄ�Ã­tadla ke smazÃ¡nÃ­.\n   * @param {AnalyticsGroup} analyticsGroup AnalytickÃ¡ skupina ke smazÃ¡nÃ­.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po smazÃ¡nÃ­ dat.\n   */\n  remove (analyticsCounterArray, analyticsGroup) {\n    return new Promise((resolve) => {\n      const {store} = this;\n      // SmazÃ¡nÃ­ analytickÃ½ch objektÅ¯ ve vhodnÃ©m poÅ™adÃ­ pro pÅ™Ã­pad selhÃ¡nÃ­.\n      return resolve(\n        store.destroyMany('analyticsCounter',\n          analyticsCounterArray.map((analyticsCounter) => analyticsCounter.id)\n        )\n        .then(() => store.destroy('analyticsGroup', analyticsGroup.id))\n      );\n    });\n  }\n\n  /**\n   * Aktualizuje analytickÃ©ho sprÃ¡vce dle novÃ©ho nastavenÃ­ v obsahu.\n   * Dle nastavenÃ­ ovlÃ¡dÃ¡ zapnutÃ­, vypnutÃ­ a restart analytickÃ©ho cyklu.\n   * @returns {Promise.<AnalyticsGroup>} VyÅ™eÅ¡Ã­ se po aktualizaci.\n   */\n  replace () {\n    return new Promise((resolve) => {\n      let result;\n      const {analyticsGroup} = this.analyticsCycle;\n      const {analyticsPeriod} = this.session;\n      if (analyticsGroup) {\n        if (analyticsPeriod) {\n          // Pokud je analytickÃ½ cyklus spuÅ¡tÄ›nÃ½ a je nastavena perioda, provede se restart.\n          result = this.analyticsCycle.restart(analyticsPeriod);\n        } else {\n          // Pokud je analytickÃ½ cyklus spuÅ¡tÄ›nÃ½ a nenÃ­ nastavena perioda, vypne se.\n          result = this.analyticsCycle.stop();\n        }\n      } else if (analyticsPeriod) {\n        // Pokud je analytickÃ½ cyklus vypnutÃ½ a je nastavena perioda, zapne se.\n        result = this.analyticsCycle.start(analyticsPeriod);\n      }\n      // Pokud je vÅ¡e vypnuto, nedÄ›lÃ¡ se nic.\n      return resolve(result);\n    });\n  }\n\n  /**\n   * SpustÃ­ analytickÃ©ho sprÃ¡vce.\n   * ObnovÃ­ zÃ¡lohovanÃ¡ data, uzavÅ™e skupiny, odeÅ¡le je na server a pokusÃ­ se o spuÅ¡tÄ›nÃ­ prvnÃ­ho cyklu.\n   * @returns {Promise.<AnalyticsGroup>} VyÅ™eÅ¡Ã­ se po spuÅ¡tÄ›nÃ­.\n   */\n  start () {\n    return new Promise((resolve) => {\n      if (this.analyticsCycle.analyticsGroup) {\n        throw new Error('Another cycle is in progress.');\n      }\n      const {store} = this;\n      return resolve(\n        // ObnovenÃ­ uloÅ¾enÃ½ch agregovanÃ½ch dat.\n        store.findAll('analyticsCounter')\n        // ObnovenÃ­ uloÅ¾enÃ½ch intervalÅ¯.\n        .then(() => store.findAll('analyticsGroup'))\n        // Operace s obnovenÃ½mi intervaly.\n        .then((analyticsGroupArray) => (\n          // UzavÅ™enÃ­ vÅ¡ech otevÅ™enÃ½ch intervalÅ¯.\n          // NeuzavÅ™enÃ© intervaly pÅ™i vypnutÃ­ zaÅ™Ã­zenÃ­ tak budou mÃ­t konec nastavenÃ½ dle dalÅ¡Ã­ho zapnutÃ­.\n          analyticsGroupArray.filter((analyticsGroup) => !analyticsGroup.closed)\n          .reduce(\n            (acc, analyticsGroup) => acc.then(() => this.analyticsCycle.closeGroup(analyticsGroup)),\n            Promise.resolve()\n          )\n          // OdeslÃ¡nÃ­ vÅ¡ech intervalÅ¯.\n          .then(() => (\n            // SeÅ™azenÃ­ vÅ¡ech (nynÃ­ jiÅ¾ uzavÅ™enÃ½ch) intervalÅ¯ podle data vytvoÅ™enÃ­.\n            // DÃ­ky tomu bodou odeslÃ¡ny ve stejnÃ©m poÅ™adÃ­ jako pÅ™ed obnovenÃ­m.\n            sortBy(analyticsGroupArray, 'opened')\n            .reduce(\n              (acc, analyticsGroup) => acc.then(() => this.send(analyticsGroup)),\n              Promise.resolve()\n            )\n          ))\n        ))\n        // Pokus o spuÅ¡tÄ›nÃ­ analytiky.\n        .then(() => {\n          const {analyticsPeriod} = this.session;\n          let result;\n          if (analyticsPeriod) {\n            // ZahÃ¡jenÃ­ analytickÃ©ho cyklu.\n            result = this.analyticsCycle.start(analyticsPeriod);\n          }\n          return result;\n        })\n      );\n    });\n  }\n}\n\n/**\n * ChybovÃ¡ udÃ¡lost.\n * @event AnalyticsTracker#error\n * @param {Error} error ChybovÃ© hlÃ¡Å¡enÃ­.\n */\n\nexport default AnalyticsTracker;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport ErrorLevel from '../../error/error-level';\n\n/**\n * TransportÃ©r analytickÃ½ch dat.\n * OdesÃ­lÃ¡ analytickÃ¡ data na Ki-Wi Server.\n */\nclass AnalyticsTransport {\n  /**\n   * Vygeneruje analytickÃ© poÄ�Ã­tadlo ve formÃ¡tu pro server.\n   * @param {AnalyticsCounter} analyticsCounter AnalytickÃ© poÄ�Ã­tadlo k vygenerovÃ¡nÃ­.\n   * @private\n   * @returns {Object} AnalytickÃ¡ data ve formÃ¡tu pro server.\n   */\n  generateCounter (analyticsCounter) {\n    // SestavenÃ­ obsahu a odfiltrovÃ¡nÃ­ prÃ¡zdnÃ½ch hodnot.\n    return Object.fromEntries(\n      Object.entries({\n        count: analyticsCounter.played,\n        // PosÃ­lÃ¡nÃ­ `name` mÃ­sto `filename` je zÃ¡mÄ›rnÃ©.\n        filename: analyticsCounter.name,\n        id: analyticsCounter.mediumId,\n        mimetype: analyticsCounter.type\n      })\n      .filter(([key, value]) => !isNil(value))\n    );\n  }\n\n  /**\n   * Vygeneruje analytickou skupinu ve formÃ¡tu pro server.\n   * @param {Array.<AnalyticsCounter>} analyticsCounterArray AnalytickÃ¡ poÄ�Ã­tadla k vygenerovÃ¡nÃ­.\n   * @param {AnalyticsGroup} analyticsGroup Skupina analytickÃ½ch dat k vygenerovÃ¡nÃ­.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {Object} AnalytickÃ¡ data ve formÃ¡tu pro server.\n   */\n  generateGroup (analyticsCounterArray, analyticsGroup, deviceId) {\n    // SestavenÃ­ obsahu a odfiltrovÃ¡nÃ­ prÃ¡zdnÃ½ch hodnot.\n    return Object.fromEntries(\n      Object.entries({\n        deviceId,\n        end: analyticsGroup.closed,\n        media: analyticsCounterArray.map(\n          (analyticsCounter) => this.generateCounter(analyticsCounter)\n        ),\n        start: analyticsGroup.opened\n      })\n      .filter(([key, value]) => !isNil(value))\n    );\n  }\n\n  /**\n   * OdeÅ¡le analytickÃ¡ data na server.\n   * @param {Array.<AnalyticsCounter>} analyticsCounterArray AnalytickÃ¡ data pro mÃ©dia.\n   * @param {AnalyticsGroup} analyticsGroup Skupina analytickÃ½ch dat.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­.\n   * @param {string} serverUrl URL adresa Ki-Wi Server pro komunikaci.\n   * @returns {Promise.<undefined>} Nic.\n   */\n  send (analyticsCounterArray, analyticsGroup, deviceId, serverUrl) {\n    return (\n      fetch(`${serverUrl}/api/device/${deviceId}/analytics`, {\n        body: JSON.stringify(this.generateGroup(analyticsCounterArray, analyticsGroup, deviceId)),\n        headers: {'Content-type': 'application/json'},\n        method: 'POST'\n      })\n      // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby sÃ­Å¥ovÃ©ho spojenÃ­.\n      .catch((error) => {\n        error.level = ErrorLevel.Warning;\n        throw error;\n      })\n      .then((response) => {\n        // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby ze serveru.\n        if (!response.ok) {\n          const error = new RangeError(`Invalid HTTP status \"${response.status}\".`);\n          error.level = ErrorLevel.Warning;\n          throw error;\n        }\n      })\n    );\n  }\n}\n\nexport default AnalyticsTransport;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nexport default {\n  defaultAdapter: 'binary',\n  name: 'asset'\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport CommunicatorUtility from '../communicator/utility/communicator-utility';\n\n/**\n * KomunikÃ¡tor automatickÃ©ho restartu pro Ki-Wi Server.\n */\nclass AutorebootCommunicator {\n  /**\n   * @param {CommunicatorSettings} settings\n   * @returns {number|null}\n   */\n  getTnterval (settings) {\n    const value = settings.get('autoreboot.interval');\n    const hours = CommunicatorUtility.parseNumber(value);\n    if (isNil(hours)) {\n      return null;\n    }\n    return hours * 60 * 60 * 1000;\n  }\n\n  /**\n   * @param {CommunicatorSettings} settings\n   * @returns {boolean|null}\n   */\n  isDisabled (settings) {\n    const value = settings.get('autoreboot.disabled');\n    return CommunicatorUtility.parseBoolean(value);\n  }\n}\n\nexport default AutorebootCommunicator;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\n/**\n * SprÃ¡vce automatickÃ©ho restartu zaÅ™Ã­zenÃ­, kterÃ½ poskytuje rozhranÃ­\n * pro ovlÃ¡dÃ¡nÃ­ Ä�asovaÄ�e, kterÃ½ po svÃ©m uplynutÃ­ zpÅ¯sobÃ­ restart.\n */\nclass AutorebootManager {\n  /**\n   * @param {Logger} logger\n   * @param {number} minInterval\n   * @param {PowerManager} powerManager\n   * @param {Timers} timers\n   */\n  constructor (logger, minInterval, powerManager, timers) {\n    this.interval = null;\n    this.logger = logger;\n    this.minInterval = minInterval;\n    this.onTimeout = this.onTimeout.bind(this);\n    this.powerManager = powerManager;\n    this.timeout = null;\n    this.timers = timers;\n  }\n\n  /**\n   * ZjistÃ­, v jakÃ©m intervalu se prÃ¡vÄ› provÃ¡dÃ­ automatickÃ½ reboot.\n   * Pokud, nenÃ­ Å¾Ã¡dnÃ½ restart naplÃ¡novanÃ½, vracÃ­ se `null`.\n   * @returns {null|number}\n   */\n  getInterval () {\n    return this.interval;\n  }\n\n  /**\n   * ZjistÃ­, jestli se provÃ¡dÃ­ automatickÃ½ restart.\n   * @returns {boolean}\n   */\n  isStarted () {\n    return !isNil(this.timeout);\n  }\n\n  /**\n   * Reakce na uplynutÃ­ Ä�asovaÄ�e automatickÃ©ho restartu.\n   * @private\n   * @returns {undefined}\n   */\n  onTimeout () {\n    new Promise((resolve) => resolve(\n      this.powerManager.reboot()\n    ))\n    .catch((error) => this.logger.error(error));\n  }\n\n  /**\n   * SpustÃ­ automatickÃ½ restart.\n   * @param {number} interval\n   * @returns {undefined}\n   */\n  start (interval) {\n    if (this.isStarted()) {\n      throw new Error('Autoreboot is already started.');\n    }\n    const safeDelay = Math.max(this.minInterval, interval);\n    this.interval = interval;\n    this.timeout = this.timers.setTimeout(this.onTimeout, safeDelay);\n  }\n\n  /**\n   * ZastavÃ­ automatickÃ½ restart.\n   * @returns {undefined}\n   */\n  stop () {\n    this.timers.clearTimeout(this.timeout);\n    this.interval = null;\n    this.timeout = null;\n  }\n}\n\nexport default AutorebootManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\n/**\n * NahrazovaÄ� pro autoreboot, kterÃ½ provÃ¡dÃ­ synchronizaci Ä�asovaÄ�e automatickÃ©ho\n * restartu zaÅ™Ã­zenÃ­, dle nastavenÃ­ v obsahu zaÅ™Ã­zenÃ­.\n */\nclass AutorebootReplacer {\n  /**\n   * @param {boolean} defaultDisabled VÃ½chozÃ­ hodnota deaktivace\n   * preventivnÃ­ restartu.\n   * @param {number} defaultInterval VÃ½chozÃ­ interval, ve kterÃ©m se zaÅ™Ã­zenÃ­\n   * preventivnÄ› restartuje. [ms]\n   * @param {AutorebootManager} manager\n   */\n  constructor (defaultDisabled, defaultInterval, manager) {\n    this.defaultDisabled = defaultDisabled;\n    this.defaultInterval = defaultInterval;\n    this.manager = manager;\n  }\n\n  /**\n   * @param {number} [interval] NastavenÃ­ intervalu preventivnÃ­ restartu\n   * z obsahu zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {number}\n   */\n  getInterval (interval) {\n    if (isNil(interval)) {\n      return this.defaultInterval;\n    }\n    return interval;\n  }\n\n  /**\n   * @param {boolean} [disabled] NastavenÃ­ deaktivace preventivnÃ­ restartu\n   * z obsahu zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {boolean}\n   */\n  isDisabled (disabled) {\n    if (isNil(disabled)) {\n      return this.defaultDisabled;\n    }\n    return disabled;\n  }\n\n  /**\n   * NastavÃ­ Ä�asovaÄ�e dle obsahu zaÅ™Ã­zenÃ­.\n   * @param {ContentInfo} contentInfo\n   * @returns {Promise.<undefined>}\n   */\n  replace (contentInfo) {\n    return new Promise((resolve) => {\n      const {manager} = this;\n      const {session} = contentInfo;\n      const disabled = this.isDisabled(session.autorebootDisabled);\n      if (disabled) {\n        // Pokud je autoreboot zakÃ¡zanÃ½, pokuze se zastavÃ­ Ä�asovaÄ�.\n        manager.stop();\n        return resolve();\n      }\n      const interval = this.getInterval(session.autorebootInterval);\n      if (!manager.isStarted()) {\n        // Pokud je autoreboot vypnutÃ½, zapne se s poÅ¾adovanÃ½m intervalem.\n        manager.start(interval);\n        return resolve();\n      }\n      const currentInterval = manager.getInterval();\n      if (interval === currentInterval) {\n        // Pokud je autoreboot zapnutÃ½ a poÅ¾adovanÃ½ interval se nezmÄ›nil,\n        // nic se nedÄ›lÃ¡ a nechÃ¡ se dÃ¡l bÄ›Å¾et.\n        return resolve();\n      }\n      // Interval se zmÄ›nil, Ä�asovaÄ� se restartuje s novÃ½m intervalem.\n      manager.stop();\n      manager.start(interval);\n      return resolve();\n    });\n  }\n}\n\nexport default AutorebootReplacer;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\n\n/**\n * ÄŒistiÄ� mÃ­sta na disku.\n * SnaÅ¾Ã­ se zajistit dostatek volnÃ©ho mÃ­sta pro novÃ½ obsah.\n * @implements {EventBus}\n */\nclass Cleaner {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Store} primaryStore HlavnÃ­ datovÃ½ sklad ve kterÃ©m je uloÅ¾en pÅ™ehrÃ¡vanÃ½ obsah.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @returns {Cleaner} NovÃ¡ instance.\n   */\n  constructor (primaryStore, session) {\n    if (!isObject(primaryStore)) {\n      throw new TypeError(`Invalid store \"${primaryStore}\".`);\n    }\n    if (!isObject(session)) {\n      throw new TypeError(`Invalid session \"${session}\".`);\n    }\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    this.primaryStore = primaryStore;\n    this.session = session;\n  }\n\n  /**\n   * VyÄ�istÃ­ mÃ­sto na disku pro novÃ½ obsah.\n   * @param {ContentInfo} contentInfo Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n   * @returns {Promise.<CleanerInfo>} Informace o vyÄ�iÅ¡tÄ›nÃ½ch datovÃ½ch modelech.\n   */\n  clean (contentInfo) {\n    const {primaryStore} = this;\n    // VÅ¡echna aktuÃ¡lnÄ› pÅ™Ã­tomnÃ¡ mÃ©dia se rozdÄ›lÃ­ dle k nim pÅ™iÅ™azenÃ½m assetÅ¯m.\n    const mediumArrayByAssetId = (\n      primaryStore.filter('medium')\n      .reduce(\n        (acc, medium) => {\n          const {assetId} = medium;\n          if (!isNil(assetId)) {\n            acc[assetId] = acc[assetId] || [];\n            acc[assetId].push(medium);\n          }\n          return acc;\n        },\n        {}\n      )\n    );\n    // PÅ™edpoÄ�Ã­tajÃ­ se identifikÃ¡tory mÃ©diÃ­ v novÃ©m obsahu pro rychlejÅ¡Ã­ vyhledÃ¡vÃ¡nÃ­.\n    const contentMediumIdArray = contentInfo.mediumArray.map((medium) => medium.id);\n    // K aktuÃ¡lnÄ› pÅ™Ã­tomnÃ½m assetÅ¯m se pÅ™idÃ¡ seznam mÃ©diÃ­, kterÃ© na nÄ› majÃ­ vazbu.\n    // Pokud je nÄ›jakÃ© mÃ©dium v novÃ©m obsahu, tak se asset odfiltruje pryÄ�.\n    const cleanerGroupArray = (\n      primaryStore.filter('asset')\n      .map((asset) => ({\n        asset,\n        mediumArray: mediumArrayByAssetId[asset.id] || []\n      }))\n      .filter((cleanerGroup) => !cleanerGroup.mediumArray.some((medium) => contentMediumIdArray.includes(medium.id)))\n    );\n    // Pokud se bude nÄ›jakÃ½ asset mazat, tak se napÅ™ed zastavÃ­ obsah.\n    if (cleanerGroupArray.length) {\n      // PoÅ¾adavek na zastavenÃ­ aktuÃ¡lnÄ› pÅ™ehrÃ¡vanÃ©ho obsahu.\n      this.emitter.emit('content', {\n        firmwareRelease: null,\n        layerArray: [],\n        layoutArray: [],\n        mediumArray: [],\n        playlistArray: [],\n        // ZachovÃ¡ se obsah aktuÃ¡lnÃ­ session.\n        // PÅ™i zruÅ¡enÃ­ hodnot by mohlo dojÃ­t ke zbyteÄ�nÃ© zmÄ›nÄ› rotace obrazovky apod.\n        session: this.session,\n        store: primaryStore,\n        taskArray: [],\n        timerArray: [],\n        trackArray: []\n      });\n    }\n    return cleanerGroupArray.reduce(\n      (acc, cleanerGroup) => acc.then((cleanerInfo) => (\n        // ZruÅ¡Ã­ se vazby mÃ©diÃ­ na odstraÅˆovanÃ½ asset.\n        cleanerGroup.mediumArray.reduce(\n          (updateAcc, medium) => updateAcc.then(() => (\n            primaryStore.update('medium', medium.id, {assetId: null})\n            .then(() => {\n              // ÃšspÄ›Å¡nÄ› aktualizovanÃ© mÃ©dium se pÅ™idÃ¡ do vÃ½stupu.\n              cleanerInfo.mediumArray.push(medium);\n            })\n          )),\n          Promise.resolve()\n        )\n        // Odebere se asset.\n        .then(() => (\n          primaryStore.destroy('asset', cleanerGroup.asset.id)\n          .then(() => {\n            // ÃšspÄ›Å¡nÄ› odebranÃ½ asset se pÅ™idÃ¡ do vÃ½stupu.\n            cleanerInfo.assetArray.push(cleanerGroup.asset);\n          })\n        ))\n        // Pokud nÄ›co selÅ¾e, tak se pÅ™eskoÄ�Ã­ na dalÅ¡Ã­ asset.\n        .catch((error) => {\n          this.emitter.emit('error', error);\n        })\n        // PÅ™edÃ¡nÃ­ akumulovanÃ½ch vÃ½sledkÅ¯ pro dalÅ¡Ã­ asset.\n        .then(() => cleanerInfo)\n      )),\n      Promise.resolve({assetArray: [], mediumArray: []})\n    );\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n}\n\n/**\n * NovÃ½ obsah zaÅ™Ã­zenÃ­ k zobrazenÃ­.\n * PouÅ¾Ã­vÃ¡ se pro pÅ™eruÅ¡enÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ aktuÃ¡lnÃ­ho obsahu, aby mohl bÃ½t vyÄ�iÅ¡tÄ›n.\n * @event Cleaner#content\n * @param {ContentInfo} contentInfo Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n */\n\n/**\n * ChybovÃ¡ udÃ¡lost.\n * @event Cleaner#error\n * @param {Error} error ChybovÃ© hlÃ¡Å¡enÃ­.\n */\n\nexport default Cleaner;\n","module.exports = \"<span v-text=\\\"value\\\"></span>\\n\";","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport template from './clock-root.html';\n\nexport default {\n  name: 'ClockRoot',\n  template,\n  created () {\n    this.interval = setInterval(this.refresh, this.delay);\n    this.refresh();\n  },\n  data () {\n    return {\n      value: null\n    };\n  },\n  destroyed () {\n    clearInterval(this.interval);\n  },\n  methods: {\n    refresh () {\n      const now = new Date();\n      const hours = String(now.getHours());\n      const minutes = String(now.getMinutes()).padStart(2, '0');\n      this.value = `${hours}:${minutes}`;\n    }\n  },\n  props: {\n    delay: {\n      type: Number,\n      required: true\n    }\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k pÅ™Ã­kazÅ¯ pro zaÅ™Ã­zenÃ­.\n * @enum {string}\n * @name CommandEnum\n */\nexport default {\n  POWER_OFF: 'POWER_OFF',\n  POWER_ON: 'POWER_ON',\n  REBOOT: 'REBOOT',\n  REPORT: 'REPORT'\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isObject from 'lodash/isObject';\n\n/**\n * KomunikÃ¡tor analytickÃ½ch dat pro Ki-Wi Server.\n */\nclass CommunicatorAnalytics {\n  /**\n   * Zpracuje periodu zasÃ­lÃ¡nÃ­ analytickÃ½ch dat.\n   * @param {Object} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s nastavenÃ­m analÃ½zy.\n   * @returns {number|null} Doba, kterou mÃ¡ trvat analytickÃ½ cyklus. [ms]\n   */\n  static parse (json) {\n    let result;\n    if (isObject(json) && json.type === 'server' && json.frequency > 0) {\n      result = json.frequency * 1000;\n    } else {\n      result = null;\n    }\n    return result;\n  }\n}\n\nexport default CommunicatorAnalytics;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport CommandEnum from '../../command-enum';\n\n/**\n * KomunikÃ¡tor pÅ™Ã­kazÅ¯ pro Ki-Wi Server.\n */\nclass CommunicatorCommand {\n  /**\n   * Zpracuje pÅ™Ã­kaz pro zaÅ™Ã­zenÃ­.\n   * @param {string} [value] PÅ™Ã­kaz pro zaÅ™Ã­zenÃ­ ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {CommandEnum|null} PÅ™Ã­kaz pro zaÅ™Ã­zenÃ­.\n   */\n  static parse (value) {\n    let result;\n    switch (value) {\n      case 'info':\n        result = CommandEnum.REPORT;\n        break;\n      case 'restart':\n        result = CommandEnum.REBOOT;\n        break;\n      case 'shutdown':\n        result = CommandEnum.POWER_OFF;\n        break;\n      default:\n        result = null;\n    }\n    return result;\n  }\n}\n\nexport default CommunicatorCommand;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport isNil from 'lodash/isNil';\nimport isNull from 'lodash/isNull';\nimport isObject from 'lodash/isObject';\n\nimport CommunicatorHeartbeat from './heartbeat/communicator-heartbeat';\nimport CommunicatorManifest from './manifest/communicator-manifest';\nimport CommunicatorQueue from './queue/communicator-queue';\nimport CommunicatorReport from './report/communicator-report';\nimport CommunicatorUpdate from './update/communicator-update';\nimport ErrorLevel from '../error/error-level';\nimport Store from '../store/store';\nimport config from '../../config';\n\n// TODO #94 PÅ™idat unit testy pro novÃ© funkcionality spojenÃ© s offline mÃ³dem.\n/**\n * KomunikÃ¡tor pro Ki-Wi Server\n * @implements {EventBus}\n */\nclass Communicator {\n  /**\n   * VytvoÅ™Ã­ komunikÃ¡tor zaÅ™Ã­zenÃ­ se serverem.\n   * @param {ContentCommunicator} contentCommunicator\n   */\n  constructor (contentCommunicator) {\n    // KomunikÃ¡tory\n    this.CommunicatorManifest = CommunicatorManifest;\n    this.communicatorHeartbeat = new CommunicatorHeartbeat();\n    this.communicatorQueue = new CommunicatorQueue();\n    this.communicatorReport = new CommunicatorReport();\n    this.communicatorUpdate = new CommunicatorUpdate();\n    // PÅ™Ã­znak, jestli je synchronizace zapnuta.\n    this.connected = false;\n    this.contentCommunicator = contentCommunicator;\n    this.emitter = new EventEmitter();\n    this.latestTimestamp = null;\n    // VÃ½chozÃ­ doba Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem o synchronizaci.\n    this.syncDelayBase = config.device.communicator.syncDelayBase;\n    // IdentifikÃ¡tor intervalu ve kterÃ©m probÃ­hÃ¡ synchronizace.\n    this.syncInterval = null;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onError = this.onError.bind(this);\n  }\n\n  /**\n   * SpustÃ­ kontinuÃ¡lnÃ­ synchronizaci obsahu zaÅ™Ã­zenÃ­.\n   *\n   * Vracet objekty ve store, kterÃ© byly bÄ›hem operace naÄ�teny.\n   *\n   * Vracet plain objekty. Player aplikace sama rozhoduje, jakÃ© datovÃ½ sklad bude pouÅ¾Ã­vat.\n   * ZÃ¡roveÅˆ by nemÄ›la mÃ­t pÅ™Ã­stup k internÃ­m datÅ¯m device.\n   *\n   * Vracet mapu polÃ­ modelÅ¯. KlÃ­Ä�em v mapÄ› je nÃ¡zev datovÃ©ho zdroje.\n   * NapÅ™. `result.medium[0]` bude mÃ­t obsah mÃ©dia prvnÃ­ho naÄ�tenÃ©ho mÃ©dia.\n   * MoÅ¾nÃ¡ jeÅ¡tÄ› zvÃ¡Å¾it mapu map modelÅ¯, kde by druhÃ½m klÃ­Ä�em bylo id modelu.\n   * NapÅ™. `result.medium.foo` bude mÃ­t obsah mÃ©dia s identifikÃ¡torem `foo`.\n   * @param {string} serverUrl URL adresa Ki-Wi Serveru pro komunikaci.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­.\n   * @param {string} [contentTimestamp] ÄŒasovÃ½ otisk poslednÃ­ho ÃºspÄ›Å¡nÄ› synchronizovanÃ©ho obsahu.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se pod dokonÄ�enÃ­ prvnÃ­ synchronizace.\n   */\n  connect (serverUrl, deviceId, contentTimestamp) {\n    return new Promise((resolve) => {\n      if (this.connected) {\n        throw new Error('Already connected.');\n      }\n      // UzamÄ�e dalÅ¡Ã­ spuÅ¡tÄ›nÃ­ synchronizace.\n      this.connected = true;\n      // NastavenÃ­ poslednÃ­ho ÃºspÄ›Å¡nÄ› synchronizovanÃ©ho obsahu.\n      this.latestTimestamp = contentTimestamp;\n      // NaplÃ¡nuje interval, ve kterÃ©m se bude spuÅ¡tÄ›t synchronizace.\n      this.syncInterval = setInterval(() => this.onSyncInterval(serverUrl, deviceId), this.syncDelayBase);\n      // SpustÃ­ prvnÃ­ synchronizaci ihned.\n      return resolve(\n        this.fetchHeartbeat(serverUrl, deviceId)\n        .catch(this.onError)\n      );\n    });\n  }\n\n  /**\n   * UvolnÃ­ vÅ¡echny zdroje pro garbage collection.\n   * @returns {undefined} Nic.\n   */\n  destroy () {\n    // ZruÅ¡Ã­ interval synchronizace.\n    clearInterval(this.syncInterval);\n    this.syncInterval = null;\n  }\n\n  /**\n   * DoruÄ�Ã­ jeden pÅ™Ã­kaz z fronty pÅ™Ã­kazÅ¯ zaÅ™Ã­zenÃ­.\n   * @param {string} serverUrl URL adresa Ki-Wi Serveru pro komunikaci.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­.\n   * @param {Array.<string>} [queueIdArray] Seznam identifikÃ¡torÅ¯ front pÅ™Ã­kazÅ¯.\n   * @returns {Promise.<CommandEnum|null>} DoruÄ�enÃ½ pÅ™Ã­kaz, pokud je nÄ›jakÃ½ dostupnÃ½.\n   */\n  fetchCommand (serverUrl, deviceId, queueIdArray) {\n    return new Promise((resolve) => {\n      if (isNil(queueIdArray) || queueIdArray.length === 0) {\n        // Bez fronty pÅ™Ã­kazÅ¯ nenÃ­ nic dostupnÃ©.\n        return resolve();\n      }\n      // Vybere se prvnÃ­ dostupnÃ¡ fronta.\n      const queueId = queueIdArray[0];\n      return resolve(\n        this.communicatorQueue.fetch(queueId, deviceId, serverUrl)\n      );\n    });\n  }\n\n  /**\n   * DoruÄ�Ã­ obsah zaÅ™Ã­zenÃ­.\n   * @param {string} serverUrl URL adresa Ki-Wi Serveru pro komunikaci.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­.\n   * @param {string} heartbeatTimestamp ÄŒasovÃ½ otisk okamÅ¾iku synchronizace.\n   * @returns {Promise.<ContentInfo|null>} DoruÄ�enÃ½ obsah, pokud je nÄ›jakÃ½ dostupnÃ½.\n   */\n  fetchContent (serverUrl, deviceId, heartbeatTimestamp) {\n    return new Promise((resolve) => {\n      // Kontrola, Å¾e je heartbeat timestamp novÄ›jÅ¡Ã­, neÅ¾ aktuÃ¡lnÄ› pÅ™ehrÃ¡vanÃ½ obsah.\n      if (!Communicator.isBefore(heartbeatTimestamp, this.latestTimestamp)) {\n        return resolve();\n      }\n      // VytvoÅ™enÃ­ novÃ©ho datovÃ©ho skladu, do kterÃ©ho se bude vklÃ¡dat novÃ½ obsah.\n      // TODO #84 DatovÃ½ sklad s novÃ½m obsahem:\n      // - PostupnÄ› nahradit implementacÃ­ datovÃ©ho skladu i do komunikÃ¡toru.\n      // - VytvÃ¡Å™et pro kaÅ¾dÃ½ obsah novÃ½ datovÃ½ sklad? Nebo recyklovat jeden lokÃ¡lnÃ­?\n      // - Do budoucna vyÄ�lenit inicializaci do co nejvyÅ¡Å¡Ã­ ÃºrovnÄ›.\n      const store = new Store();\n      return resolve(\n        // StÃ¡hne obsah.\n        this.contentCommunicator.fetch(store, heartbeatTimestamp, deviceId, serverUrl)\n        .then((contentInfo) => {\n          if (isObject(contentInfo)) {\n            const receivedTimestamp = contentInfo.session.contentTimestamp;\n            // TODO #84 ProvÄ›Å™it logiku pÅ™epÃ­nÃ¡nÃ­ obsahu https://gitlab.com/ki-wi/player-light/player-lighter/issues/67\n            // Kontrola, Å¾e je timestamp naÄ�tenÃ©ho obsahu novÄ›jÅ¡Ã­, neÅ¾ aktuÃ¡lnÄ› pÅ™ehrÃ¡vanÃ½ obsah.\n            if (Communicator.isBefore(receivedTimestamp, this.latestTimestamp)) {\n              this.latestTimestamp = receivedTimestamp;\n              // Do vÃ½sledku se pÅ™idÃ¡ datovÃ½ sklad, aby s nÃ­m mohl pÅ™Ã­jemce operovat.\n              // TODO #84 Do budoucna vyÄ�lenit inicializaci skladu do co vyÅ¡Å¡Ã­ ÃºrovnÄ› a nebude tÅ™eba pÅ™edÃ¡vat.\n              return contentInfo;\n            }\n          }\n        })\n      );\n    });\n  }\n\n  /**\n   * DoruÄ�Ã­ heartbeat s push daty pro zaÅ™Ã­zenÃ­.\n   * @param {string} serverUrl URL adresa Ki-Wi Serveru pro komunikaci.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {Promise.<HeartbeatInfo|null>} Push data, pokud se je podaÅ™ilo doruÄ�it.\n   */\n  fetchHeartbeat (serverUrl, deviceId) {\n    return (\n      // StÃ¡hne push data.\n      this.communicatorHeartbeat.fetch(deviceId, serverUrl)\n      // TODO #44 ZpracovÃ¡nÃ­ reakce na heartbeat a posloupnost content / queue / version.\n      // TODO #44 Co kdyÅ¾ heartbeat pÅ™ijde dÅ™Ã­ve, neÅ¾ jsou pÅ™edchozÃ­ informace zpracovÃ¡ny?\n      .then((heartbeat) => {\n        if (!isObject(heartbeat)) {\n          // Pokud se nepodaÅ™ilo heartbeat naÄ�Ã­st, tak se nic nedÄ›lÃ¡.\n          return;\n        }\n        // Pokud se podaÅ™ilo heartbeat naÄ�Ã­st, tak se vyvolÃ¡ udÃ¡lost, kterÃ¡ o nÄ›m informuje.\n        this.emitter.emit('heartbeatFetched', heartbeat);\n      })\n    );\n  }\n\n  /**\n   * PorovnÃ¡ Ä�asovÃ© otisky, jestli se obsah zmÄ›nil a je nutnÃ© ho stahovat.\n   * @param {string} [newTimestamp] NovÃ½ Ä�asovÃ½ otisk.\n   * @param {string} [oldTimestamp] StarÃ½ Ä�asovÃ½ otisk.\n   * @private\n   * @returns {boolean} PÅ™Ã­znak, jestli je datum novÄ›jÅ¡Ã­.\n   */\n  static isBefore (newTimestamp, oldTimestamp) {\n    let result;\n    const newDate = new Date(newTimestamp);\n    if (isNaN(newDate) || isNull(newTimestamp)) {\n      // Pokud nenÃ­ dostupnÃ½ novÃ½ timestamp, nestÃ¡hne se obsah.\n      result = false;\n    } else {\n      const oldDate = new Date(oldTimestamp);\n      if (isNaN(oldDate) || isNull(oldTimestamp)) {\n        // Pokud nenÃ­ dostupnÃ½ starÃ½ timestamp, stÃ¡hne se obsah.\n        result = true;\n      } else {\n        // Pokud je novÃ½ timestamp novÄ›jÅ¡Ã­, stÃ¡hne se obsah.\n        result = newDate > oldDate;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Reakce na chybu.\n   * @param {Error} error ChybovÃ½ objekt.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onError (error) {\n    this.emitter.emit('error', error);\n  }\n\n  /** @inheritdoc */\n  off (type, callback) {\n    this.emitter.off(type, callback);\n  }\n\n  /** @inheritdoc */\n  on (type, callback) {\n    this.emitter.on(type, callback);\n  }\n\n  /**\n   * Reakce uplynutÃ­ intervalu ve kterÃ©m se synchronizuje obsah.\n   * @param {string} serverUrl URL adresa Ki-Wi Serveru pro komunikaci.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onSyncInterval (serverUrl, deviceId) {\n    // SpustÃ­ jednorÃ¡zovou synchronizaci.\n    this.fetchHeartbeat(serverUrl, deviceId)\n    .catch(this.onError);\n  }\n\n  /**\n   * OdeÅ¡le informace o zaÅ™Ã­zenÃ­ na server.\n   * @param {string} serverUrl URL adresa Ki-Wi Serveru pro komunikaci.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­.\n   * @param {ReportInfo} reportInfo Informace o zaÅ™Ã­zenÃ­.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po ÃºspÄ›Å¡nÃ©m dokonÄ�enÃ­.\n   */\n  report (serverUrl, deviceId, reportInfo) {\n    return this.communicatorReport.fetch(reportInfo, deviceId, serverUrl);\n  }\n\n  /**\n   * DoruÄ�Ã­ vÅ¡echny potÅ™ebnÃ© informace pro aktualizaci zaÅ™Ã­zenÃ­.\n   * @param {string} serverUrl URL adresa Ki-Wi Serveru pro komunikaci.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­.\n   * @param {FormatEnum} formatEnum FormÃ¡t, ve kterÃ©m provÃ©st aktualizaci.\n   * @param {UpdatePlatform} updatePlatform Platforma, ve kterÃ© provÃ©st aktualizaci.\n   * @returns {Promise.<Object>} Informace pro aktualizaci zaÅ™Ã­zenÃ­.\n   */\n  update (serverUrl, deviceId, formatEnum, updatePlatform) {\n    return new Promise((resolve) => {\n      // Kontrola vstupÅ¯.\n      if (!formatEnum) {\n        throw new TypeError('Invalid formatEnum.');\n      }\n      if (!updatePlatform) {\n        throw new TypeError('Invalid updatePlatform.');\n      }\n      return resolve(\n        // ZjistÃ­ se informace o verzi a dostupnÃ½ch manifestech.\n        this.communicatorUpdate.fetch(deviceId, serverUrl)\n        // TODO #44 Na co v tomto API poloÅ¾ka version? Ta uÅ¾ byla kontrolovÃ¡na v heartbeat.\n        .then(({urlArray, version}) => {\n          // Pokud nenÃ­ definovÃ¡na verze, nic neaktualizujeme.\n          if (!version) {\n            return Promise.resolve();\n          }\n          // Kontrola dostupnÃ½ch manifestÅ¯.\n          if (!urlArray.length) {\n            throw new Error('No version manifest available.');\n          }\n          // StaÅ¾enÃ­ manifestÅ¯.\n          return (\n            // JednotlivÃ© manifesty se zaÄ�nou sÃ©riovÄ› naÄ�Ã­tat, dokud nÄ›jakÃ½ nenalezne vyhovujÃ­cÃ­ build.\n            urlArray.reduce(\n              (acc, url) => acc.catch(() => {\n                const communicatorManifest = new this.CommunicatorManifest(url);\n                return (\n                  // ZjistÃ­ se informace z manifestu.\n                  communicatorManifest.fetch()\n                  .then((manifestData) => {\n                    // Profiltruje se seznam dostupnÃ½ch buildÅ¯, aby odpovÃ­dal poÅ¾adavkÅ¯m ve vstupu.\n                    const buildArray = manifestData.buildArray.filter(\n                      (build) => build.formatEnum === formatEnum && build.updatePlatform === updatePlatform\n                    );\n                    // Pokud se build nenalezne, tak se vyvolÃ¡ jednotnÃ© chybovÃ© hlÃ¡Å¡enÃ­.\n                    // ChybÄ› se snÃ­Å¾Ã­ priorita, nenÃ­ pro logovÃ¡nÃ­ dÅ¯leÅ¾itÃ¡.\n                    if (!buildArray.length) {\n                      const error = new Error('No matching build found.');\n                      error.level = ErrorLevel.Warning;\n                      throw error;\n                    }\n                    // VrÃ¡tÃ­ se informace o prvnÃ­m vyhovujÃ­cÃ­m buildu.\n                    // TODO #44 Co kdyby bylo odfilrovanÃ½ch buildÅ¯ vÃ­ce? Throw?\n                    const [build] = buildArray;\n                    return Promise.resolve({\n                      buildId: build.buildId,\n                      url: build.url,\n                      version: manifestData.version\n                    });\n                  })\n                  .catch((error) => {\n                    this.onError(error);\n                    throw error;\n                  })\n                );\n              }),\n              // Pouze pro inicializaci sÃ©rie, nedostane se mimo metodu.\n              // eslint-disable-next-line prefer-promise-reject-errors\n              Promise.reject()\n            )\n            // Pokud neuspÄ›je Å¾Ã¡dnÃ½, vyvolÃ¡ se jednotnÃ© chybovÃ© hlÃ¡Å¡enÃ­.\n            // ChybÄ› se snÃ­Å¾Ã­ priorita, nenÃ­ pro logovÃ¡nÃ­ dÅ¯leÅ¾itÃ¡.\n            .catch(() => {\n              const error = new Error('No version manifest satisfied requirements.');\n              error.level = ErrorLevel.Warning;\n              throw error;\n            })\n          );\n        })\n      );\n    });\n  }\n}\n\n/**\n * Byla zÃ­skÃ¡na push data ze serveru.\n * @event Communicator#heartbeatFetched\n * @param {HeartbeatInfo} heartbeat Push data.\n */\n\nexport default Communicator;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport CommunicatorUtility from '../utility/communicator-utility';\n\n/**\n * KomunikÃ¡tor nastavenÃ­ ovlÃ¡dÃ¡nÃ­ zaÅ™Ã­zenÃ­ pro Ki-Wi Server.\n */\nclass CommunicatorControl {\n  /**\n   * NaÄ�te z nastavenÃ­ vÃ½jimky z ovlÃ¡dÃ¡nÃ­.\n   * @param {boolean} [power] PÅ™Ã­znak z nastavenÃ­ serveru.\n   * @private\n   * @returns {ControlExceptions|null} VrÃ¡tÃ­ `null`, pokud Å¾Ã¡dnÃ© vÃ½jimky nejsou.\n   */\n  parseExceptions (power) {\n    if (!power) {\n      return null;\n    }\n    return {power};\n  }\n\n  /**\n   * NaÄ�te z nastavenÃ­ zÃ¡mek ovlÃ¡dÃ¡nÃ­ pro tlaÄ�Ã­tka umÃ­stÄ›nÃ© pÅ™Ã­mo na zaÅ™Ã­zenÃ­.\n   * @param {CommunicatorSettings} settings NastavenÃ­ ze serveru.\n   * @returns {ControlLock|null} VrÃ¡tÃ­ `null`, pokud se zÃ¡mek nemÃ¡ nastavit.\n   */\n  parseLocalLock (settings) {\n    return this.parseLock(\n      settings.get('control.local.locked'),\n      settings.get('control.local.exceptions.power')\n    );\n  }\n\n  /**\n   * NaÄ�te z nastavenÃ­ obecnÃ½ zÃ¡mek ovlÃ¡dÃ¡nÃ­.\n   * @param {string} [lockedString] PÅ™Ã­znak jako Å™etÄ›zec z nastavenÃ­ serveru.\n   * @param {string} [powerString] PÅ™Ã­znak jako Å™etÄ›zec z nastavenÃ­ serveru.\n   * @private\n   * @returns {ControlLock|null} VrÃ¡tÃ­ `null`, pokud se zÃ¡mek nemÃ¡ nastavit.\n   */\n  parseLock (lockedString, powerString) {\n    const lockedBoolean = CommunicatorUtility.parseBoolean(lockedString);\n    const powerBoolean = CommunicatorUtility.parseBoolean(powerString);\n    const locked = this.parseLocked(lockedBoolean, powerBoolean);\n    const exceptions = this.parseExceptions(powerBoolean);\n    if (isNil(locked)) {\n      return null;\n    }\n    if (isNil(exceptions)) {\n      return {locked};\n    }\n    return {exceptions, locked};\n  }\n\n  /**\n   * NaÄ�te z nastavenÃ­ pÅ™Ã­znak jestli se mÃ¡ zÃ¡mek ovlÃ¡dÃ¡nÃ­ zamknout.\n   * @param {boolean} locked PÅ™Ã­znak z nastavenÃ­ serveru.\n   * @param {boolean} power PÅ™Ã­znak z nastavenÃ­ serveru.\n   * @private\n   * @returns {boolean|null} PÅ™Ã­znak pro zÃ¡mek ovlÃ¡dÃ¡nÃ­.\n   * VrÃ¡tÃ­ `null`, pokud se zÃ¡mek nemÃ¡ nastavit.\n   */\n  parseLocked (locked, power) {\n    if (isNil(locked) && isNil(power)) {\n      return null;\n    }\n    if (isNil(locked)) {\n      return false;\n    }\n    return locked;\n  }\n\n  /**\n   * NaÄ�te z nastavenÃ­ zÃ¡mek ovlÃ¡dÃ¡nÃ­ pro tlaÄ�Ã­tka na dÃ¡lkovÃ©m ovlÃ¡dÃ¡nÃ­.\n   * @param {CommunicatorSettings} settings NastavenÃ­ ze serveru.\n   * @returns {ControlLock|null} VrÃ¡tÃ­ `null`, pokud se zÃ¡mek nemÃ¡ nastavit.\n   */\n  parseRemoteLock (settings) {\n    return this.parseLock(\n      settings.get('control.remote.locked'),\n      settings.get('control.remote.exceptions.power')\n    );\n  }\n}\n\nexport default CommunicatorControl;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport CommunicatorUtility from '../utility/communicator-utility';\n\n/**\n * KomunikÃ¡tor firmware zaÅ™Ã­zenÃ­ pro Ki-Wi Server.\n */\nclass CommunicatorFirmware {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Object} config Konfigurace aplikace.\n   * @returns {CommunicatorFirmware} NovÃ¡ instance.\n   */\n  constructor (config) {\n    this.config = config;\n  }\n\n  /**\n   * NaÄ�te vhodnÃ© vydÃ¡nÃ­ firmware pro zaÅ™Ã­zenÃ­.\n   * @param {CommunicatorSettings} communicatorSettings KomunikÃ¡tor nastavenÃ­ ze serveru.\n   * @param {FirmwareInfo} firmwareInfo Informace o aktuÃ¡lnÃ­m firmware zaÅ™Ã­zenÃ­.\n   * @returns {FirmwareRelease|null} VydÃ¡nÃ­ firmware urÄ�enÃ© pro zaÅ™Ã­zenÃ­.\n   */\n  parse (communicatorSettings, firmwareInfo) {\n    // Kontrola informacÃ­ z aktuÃ¡lnÃ­ho firmware.\n    const {manufacturer, modelName, version} = firmwareInfo;\n    if (isNil(manufacturer) || isNil(modelName) || isNil(version)) {\n      return null;\n    }\n    // Kontrola nastavenÃ­ pÅ™Ã­znaku deaktivace firmware na serveru.\n    const disabled = CommunicatorUtility.parseBoolean(communicatorSettings.get('firmware.disabled'));\n    if (disabled) {\n      return null;\n    }\n    // Do tÃ©to cesty jsou sdruÅ¾eny informace odpovÃ­dajÃ­cÃ­ aktuÃ¡lnÃ­mu firmware.\n    const path = `firmware.${manufacturer}.${modelName}`;\n    // Kontrola cesty k firmware.\n    const url = CommunicatorUtility.parseString(communicatorSettings.get(`${path}.url`));\n    if (isNil(url)) {\n      return null;\n    }\n    // Kontrola verze k firmware.\n    const releaseVersion = CommunicatorUtility.parseString(communicatorSettings.get(`${path}.version`));\n    if (isNil(releaseVersion) || releaseVersion === version) {\n      return null;\n    }\n    return {\n      manufacturer,\n      modelName,\n      // Velikost firmware zatÃ­m na serveru urÄ�it nejde, ale je zde ta moÅ¾nost.\n      // DoplnÃ­ se vÃ½chozÃ­ pÅ™edpoklÃ¡danÃ¡ velikost firmware.\n      size: this.config.firmware.defaultSize,\n      url,\n      version: releaseVersion\n    };\n  }\n}\n\nexport default CommunicatorFirmware;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport FormatEnum from '../../format-enum';\n\n/**\n * KomunikÃ¡tor formÃ¡tÅ¯ aktualizacÃ­ aplikace pro Ki-Wi Server.\n */\nclass CommunicatorFormat {\n  /**\n   * Zpracuje formÃ¡t aktualizace.\n   * @param {string} [value] FormÃ¡t aktualizace ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {FormatEnum|null} FormÃ¡t aktualizace z Ä�Ã­selnÃ­ku.\n   */\n  static parse (value) {\n    let result;\n    switch (value) {\n      case 'html':\n        result = FormatEnum.HTML;\n        break;\n      case 'ipk':\n        result = FormatEnum.IPK;\n        break;\n      case 'wgt':\n        result = FormatEnum.WGT;\n        break;\n      case 'zip':\n        result = FormatEnum.ZIP;\n        break;\n      default:\n        result = null;\n    }\n    return result;\n  }\n}\n\nexport default CommunicatorFormat;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\nimport isObject from 'lodash/isObject';\n\nimport CommunicatorUtility from '../utility/communicator-utility';\nimport ErrorLevel from '../../error/error-level';\n\n// TODO #94 PÅ™idat unit testy pro novÃ© funkcionality spojenÃ© s offline mÃ³dem.\n/**\n * KomunikÃ¡tor push dat zaÅ™Ã­zenÃ­ pro Ki-Wi Server.\n */\nclass CommunicatorHeartbeat {\n  /**\n   * VytvoÅ™Ã­ komunikÃ¡tor zaÅ™Ã­zenÃ­ se serverem.\n   * @returns {CommunicatorHeartbeat} NovÃ½ komunikÃ¡tor push dat zaÅ™Ã­zenÃ­.\n   */\n  constructor () {\n    this.fetching = false;\n  }\n\n  /**\n   * Informuje server o online stavu a zÃ¡roveÅˆ doruÄ�Ã­ push data pro zaÅ™Ã­zenÃ­.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­, kterÃ© chce komunikovat.\n   * @param {string} serverUrl URL adresa Ki-Wi Server pro komunikaci.\n   * @returns {Promise.<HeartbeatInfo|null>} Push data, pokud se je podaÅ™ilo doruÄ�it.\n   */\n  fetch (deviceId, serverUrl) {\n    // TODO #94 OmezenÃ­ paralelnÃ­ho fetch:\n    // - ZvÃ¡Å¾it umÃ­stÄ›nÃ­ tÃ©to funkcionality.\n    // - Napsat unit testy:\n    //   - VyuÅ¾Ã­t zpoÅ¾dÄ›nÃ­ fetch. https://github.com/wheresrhys/fetch-mock/issues/75\n    //   - DuplikÃ¡tnÃ­ fetch vracÃ­ null.\n    //   - Nezablokuje se pÅ™i resolve.\n    //   - Nezablokuje se pÅ™i reject.\n    let result;\n    if (this.fetching) {\n      // TODO Mohlo by reagovat jinak. NapÅ™. vrÃ¡cenÃ­m probÃ­hajÃ­cÃ­ho poÅ¾davku.\n      result = Promise.resolve(null);\n    } else {\n      this.fetching = true;\n      result = (\n        fetch(`${serverUrl}/api/device/${deviceId}/heartbeat`, {method: 'POST'})\n        // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby sÃ­Å¥ovÃ©ho spojenÃ­.\n        .catch((error) => {\n          error.level = ErrorLevel.Warning;\n          throw error;\n        })\n        .then((response) => {\n          // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby ze serveru.\n          if (!response.ok) {\n            const error = new RangeError(`Invalid HTTP status \"${response.status}\".`);\n            error.level = ErrorLevel.Warning;\n            throw error;\n          }\n          return response.json();\n        })\n        .then((json) => CommunicatorHeartbeat.parse(json))\n        .finally(() => {\n          this.fetching = false;\n        })\n      );\n    }\n    return result;\n  }\n\n  /**\n   * Zpracuje push data zaÅ™Ã­zenÃ­.\n   * @param {Object} [json] OdpovÄ›Ä� na push data zaÅ™Ã­zenÃ­.\n   * @returns {Object} Push data.\n   */\n  static parse (json) {\n    return {\n      contentTimestamp: CommunicatorUtility.parseDate(get(json, 'contentTimestamp')),\n      queueIdArray: CommunicatorHeartbeat.parseQueue(get(json, 'queues')),\n      version: CommunicatorUtility.parseString(get(json, 'appVersion'))\n    };\n  }\n\n  /**\n   * Zpracuje seznam front.\n   * @param {Object} [value] IdentifikÃ¡tory front ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {Array} Seznam identifikÃ¡torÅ¯ front pÅ™Ã­kazÅ¯.\n   */\n  static parseQueue (value) {\n    let result;\n    if (isObject(value)) {\n      result = Object.keys(value);\n    } else {\n      result = [];\n    }\n    return result;\n  }\n}\n\nexport default CommunicatorHeartbeat;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport objectHash from 'object-hash';\nimport isNil from 'lodash/isNil';\n\nimport CommunicatorNumber from '../number/communicator-number';\nimport CommunicatorUtility from '../utility/communicator-utility';\n\n/**\n * KomunikÃ¡tor vrstev Å¡ablon pro Ki-Wi Server.\n */\nclass CommunicatorLayer {\n  /**\n   * Vygeneruje identifikÃ¡tor vrstvy.\n   * @param {DsId} parentLayoutId IdentifikÃ¡tor Å¡ablony, do kterÃ© vrstva patÅ™Ã­.\n   * @param {number} index PoÅ™adÃ­ vrstvy v Å¡ablonÄ›.\n   * @private\n   * @returns {string} IdentifikÃ¡tor.\n   */\n  generateId (parentLayoutId, index) {\n    if (isNil(parentLayoutId)) {\n      throw new TypeError(`Missing parent layout id.`);\n    }\n    if (isNil(index)) {\n      throw new TypeError(`Missing layer index.`);\n    }\n    return objectHash({index, parentLayoutId});\n  }\n\n  /**\n   * NaÄ�te vrstvu z JSON.\n   * @param {Store} store DatovÃ½ sklad ke vloÅ¾enÃ­ vrstvy.\n   * @param {Object} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s vrstvou.\n   * @param {DsId} parentLayoutId IdentifikÃ¡tor Å¡ablony, do kterÃ© vrstva patÅ™Ã­.\n   * @param {number} index PoÅ™adÃ­ vrstvy v Å¡ablonÄ›.\n   * @returns {Layer} Vrstva.\n   */\n  parse (store, json, parentLayoutId, index) {\n    return store.inject('layer', {\n      height: this.parsePercentage(json.height),\n      id: this.generateId(parentLayoutId, index),\n      index,\n      left: this.parsePercentage(json.posX),\n      mediumId: CommunicatorUtility.parseReference(json.ref, 'media'),\n      parentLayoutId,\n      playlistId: CommunicatorUtility.parseReference(json.ref, 'playlist'),\n      top: this.parsePercentage(json.posY),\n      width: this.parsePercentage(json.width),\n      zIndex: json.posZ\n    });\n  }\n\n  /**\n   * NaÄ�te poÄ�et procent v\n   * [CSS formÃ¡tu](https://developer.mozilla.org/en-US/docs/Web/CSS/percentage).\n   * @param {string} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s procenty.\n   * @private\n   * @returns {string} PoÄ�et procent.\n   */\n  parsePercentage (json) {\n    const number = CommunicatorNumber.fromString(json);\n    return `${number}%`;\n  }\n}\n\nexport default CommunicatorLayer;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\n\nimport CommunicatorUtility from '../utility/communicator-utility';\n\n/**\n * KomunikÃ¡tor Å¡ablon pro Ki-Wi Server.\n */\nclass CommunicatorLayout {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {CommunicatorLayer} communicatorLayer KomunikÃ¡tor vrstev Å¡ablon.\n   * @returns {CommunicatorLayout} NovÃ¡ instance.\n   */\n  constructor (communicatorLayer) {\n    this.communicatorLayer = communicatorLayer;\n  }\n\n  /**\n   * NaÄ�te Å¡ablonu z JSON.\n   * @param {Store} store DatovÃ½ sklad ke vloÅ¾enÃ­ Å¡ablony.\n   * @param {Object} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ se Å¡ablonou.\n   * @returns {Layout} Å ablona.\n   */\n  parse (store, json) {\n    return store.inject('layout', {\n      backgroundColor: json.bgColor,\n      id: json.id,\n      mediumId: CommunicatorUtility.parseReference(json.bgImage.ref, 'media'),\n      name: json.name,\n      playDuration: CommunicatorUtility.parseTime(get(json, 'playLength.timeLength'))\n    });\n  }\n\n  /**\n   * NaÄ�te vrstvy Å¡ablony z JSON.\n   * @param {Store} store DatovÃ½ sklad ke vloÅ¾enÃ­ vrstev.\n   * @param {Object} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ se Å¡ablonou.\n   * @returns {Array.<Layer>} Seznam vrstev.\n   */\n  parseLayers (store, json) {\n    return json.items.map((item, index) => this.communicatorLayer.parse(store, item, json.id, index));\n  }\n}\n\nexport default CommunicatorLayout;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\nimport isArray from 'lodash/isArray';\nimport URI from 'urijs';\n\nimport CommunicatorFormat from '../format/communicator-format';\nimport CommunicatorUtility from '../utility/communicator-utility';\nimport ErrorLevel from '../../error/error-level';\nimport UpdatePlatformUtil from '../../update/update-platform-util';\n\n/**\n * KomunikÃ¡tor zaÅ™Ã­zenÃ­ s manifestem verze.\n */\nclass CommunicatorManifest {\n  /**\n   * VytvoÅ™Ã­ komunikÃ¡tor s manifestem verze.\n   * @param {string} url URL adresa pro staÅ¾enÃ­ manifestu.\n   * @returns {CommunicatorManifest} NovÃ½ komunikÃ¡tor s manifestem verze.\n   */\n  constructor (url) {\n    if (arguments.length < 1) {\n      throw new TypeError('Missing arguments.');\n    }\n    this.url = url;\n  }\n\n  /**\n   * DoruÄ�Ã­ informace o verzi.\n   * @returns {Promise.<Object>} Informace o verzi a jejÃ­ch sestavenÃ­.\n   */\n  fetch () {\n    const {url} = this;\n    return (\n      fetch(url, {method: 'GET'})\n      // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby sÃ­Å¥ovÃ©ho spojenÃ­.\n      .catch((error) => {\n        error.level = ErrorLevel.Warning;\n        throw error;\n      })\n      .then((response) => {\n        // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby ze serveru.\n        if (!response.ok) {\n          const error = new RangeError(`Invalid HTTP status \"${response.status}\".`);\n          error.level = ErrorLevel.Warning;\n          throw error;\n        }\n        return response.json();\n      })\n      .then((json) => CommunicatorManifest.parse(json, url))\n    );\n  }\n\n  /**\n   * Zpracuje informace o verzi.\n   * @param {Object} [json] OdpovÄ›Ä� na manifest verze.\n   * @param {string} url URL adresa manifestu verze.\n   * @returns {Object} Informace o verzi a jejÃ­ch sestavenÃ­.\n   */\n  static parse (json, url) {\n    if (arguments.length < 2) {\n      throw new TypeError('Missing arguments.');\n    }\n    let buildArray;\n    const builds = get(json, 'builds');\n    if (isArray(builds)) {\n      buildArray = builds.map((build) => CommunicatorManifest.parseBuild(build, url));\n    } else {\n      buildArray = [];\n    }\n    return {\n      buildArray,\n      version: CommunicatorUtility.parseString(get(json, 'appVersion'))\n    };\n  }\n\n  /**\n   * Zpracuje informace o jednom sestavenÃ­ aplikace.\n   * @param {Object} [json] ÄŒÃ¡st odpovÄ›Ä�i manifestu verze s jednÃ­m sestavenÃ­m.\n   * @param {string} url URL adresa manifestu verze.\n   * @returns {Object} Informace o sestavenÃ­.\n   */\n  static parseBuild (json, url) {\n    if (arguments.length < 2) {\n      throw new TypeError('Missing arguments.');\n    }\n    return {\n      buildId: json.buildId,\n      formatEnum: CommunicatorFormat.parse(json.type),\n      updatePlatform: UpdatePlatformUtil.parse(json.platform),\n      url: (\n        URI(json.url)\n        .absoluteTo(url)\n        .toString()\n      )\n    };\n  }\n}\n\nexport default CommunicatorManifest;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\nimport isString from 'lodash/isString';\n\nimport CommunicatorStretch from '../stretch/communicator-stretch';\nimport CommunicatorUtility from '../utility/communicator-utility';\n\n/**\n * KomunikÃ¡tor mÃ©diÃ­ pro Ki-Wi Server.\n */\nclass CommunicatorMedium {\n  /**\n   * Zpracuje seznam mÃ©diÃ­ a zanoÅ™enÃ½ch modelÅ¯.\n   * @param {Array.<Object>} jsonArray ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ se seznamem mÃ©diÃ­.\n   * @returns {DsMap} Mapa datovÃ½ch atributÅ¯ ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  static parseMany (jsonArray) {\n    const emptyMap = {medium: {}};\n    return CommunicatorUtility.parseMany(jsonArray, CommunicatorMedium.parseOne, emptyMap);\n  }\n\n  /**\n   * Zpracuje jedno mÃ©dium bez zanoÅ™enÃ½ch modelÅ¯.\n   * @param {Object} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s jednÃ­m mÃ©diem.\n   * @param {DsId} [id] IdentifikÃ¡tor mÃ©dia, kterÃ¡ se mÃ¡ zpracovat.\n   * @returns {DsAttrs} Obsah mÃ©dia ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  static parseModel (json, id) {\n    return {\n      assetId: null,\n      checksum: CommunicatorUtility.parseString(json.md5),\n      id,\n      name: CommunicatorUtility.parseString(json.name),\n      params: CommunicatorMedium.parseParams(json.params),\n      playDuration: CommunicatorUtility.parseTime(json.playLength.timeLength),\n      stretchEnum: CommunicatorStretch.parse(json.stretching),\n      type: json.type,\n      url: json.url,\n      volume: CommunicatorUtility.parseVolume(json.volume)\n    };\n  }\n\n  /**\n   * Zpracuje parametry mÃ©dia.\n   * @param {Object} [json] ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s parametry mÃ©dia.\n   * @returns {DsAttrs|null} Parametry ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  static parseParams (json) {\n    if (!isObject(json)) {\n      return null;\n    }\n    return Object.fromEntries(\n      Object.entries(json)\n      .reduce(\n        (acc, [key, value]) => {\n          if (isString(value)) {\n            // DekÃ³dovÃ¡nÃ­ URI, kterÃ© server provÃ¡dÃ­.\n            // Lze pouÅ¾Ã­t jednotnÃ© sestavenÃ­ URI, kterÃ© automaticky provÃ¡dÃ­ encode.\n            // UÅ¡etÅ™Ã­ mÃ­sto v datovÃ©m skladu.\n            acc.push([key, decodeURIComponent(value)]);\n          } else if (!isObject(value)) {\n            // Zbytek primitivnÃ­ch typÅ¯ se zkopÃ­ruje beze zmÄ›ny.\n            acc.push([key, value]);\n          }\n          return acc;\n        },\n        []\n      )\n    );\n  }\n\n  /**\n   * Zpracuje jedno mÃ©dium a zanoÅ™enÃ© modely.\n   * @param {Object} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s jednÃ­m mÃ©diem.\n   * @returns {DsMap} Mapa datovÃ½ch atributÅ¯ ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  static parseOne (json) {\n    let result;\n    const {id} = json;\n    if (isNil(id)) {\n      result = {medium: {}};\n    } else {\n      const model = CommunicatorMedium.parseModel(json, id);\n      result = {medium: {[id]: model}};\n    }\n    return result;\n  }\n}\n\nexport default CommunicatorMedium;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\nimport isNumber from 'lodash/isNumber';\nimport isString from 'lodash/isString';\n\n/**\n * KomunikÃ¡tor Ä�Ã­sel pro Ki-Wi Server.\n */\nclass CommunicatorNumber {\n  /**\n   * NaÄ�te Ä�Ã­slo.\n   * @param {number} [value] ÄŒÃ­slo ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {null|number} ÄŒÃ­slo.\n   */\n  static fromNumber (value) {\n    if (isNil(value)) {\n      return null;\n    }\n    if (!isNumber(value)) {\n      throw new TypeError(`Invalid value \"${value}\".`);\n    }\n    return value;\n  }\n\n  /**\n   * NaÄ�te Ä�Ã­slo z Å™etÄ›zce.\n   * @param {string} [value] ÄŒÃ­slo jako Å™etÄ›zec ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {null|number} ÄŒÃ­slo.\n   */\n  static fromString (value) {\n    if (isNil(value)) {\n      return null;\n    }\n    if (!isString(value)) {\n      throw new TypeError(`Invalid value \"${value}\".`);\n    }\n    // OdebrÃ¡nÃ­ okolnÃ­ho whitespace.\n    const trimmed = value.trim();\n    // PrÃ¡zdnÃ½ string se parsuje jako null.\n    if (!trimmed.length) {\n      return null;\n    }\n    // Detekce speciÃ¡lnÃ­ho zÃ¡pisu Ä�Ã­sel: binary, octal, hexadecimal, exponentiation.\n    if (trimmed.match(/b|e|o|x/i)) {\n      return NaN;\n    }\n    return Number(trimmed);\n  }\n}\n\nexport default CommunicatorNumber;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport OrientationEnum from '../../orientation/orientation-enum';\n\n/**\n * KomunikÃ¡tor orientacÃ­ obrazovky pro Ki-Wi Server.\n */\nclass CommunicatorOrientation {\n  /**\n   * Vygeneruje orientaci obrazovky.\n   * @param {OrientationEnum} [value] Orientace obrazovky.\n   * @returns {null|number} Orientace obrazovky ve formÃ¡tu pro server.\n   */\n  static generate (value) {\n    let result;\n    switch (value) {\n      case OrientationEnum.CLOCKWISE_0:\n        result = 0;\n        break;\n      case OrientationEnum.CLOCKWISE_90:\n        result = 90;\n        break;\n      case OrientationEnum.CLOCKWISE_180:\n        result = 180;\n        break;\n      case OrientationEnum.CLOCKWISE_270:\n        result = 270;\n        break;\n      default:\n        result = null;\n    }\n    return result;\n  }\n\n  /**\n   * Zpracuje orientaci obrazovky.\n   * @param {number} [value] NastavenÃ­ orientace ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {OrientationEnum|null} Orientace obrazovky.\n   */\n  static parse (value) {\n    let result;\n    switch (value) {\n      case 0:\n        result = OrientationEnum.CLOCKWISE_0;\n        break;\n      case 90:\n        result = OrientationEnum.CLOCKWISE_90;\n        break;\n      case 180:\n        result = OrientationEnum.CLOCKWISE_180;\n        break;\n      case 270:\n        result = OrientationEnum.CLOCKWISE_270;\n        break;\n      default:\n        result = null;\n    }\n    return result;\n  }\n}\n\nexport default CommunicatorOrientation;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\nimport isString from 'lodash/isString';\n\nimport CommunicatorCommand from '../command/communicator-command';\nimport ErrorLevel from '../../error/error-level';\n\n/**\n * KomunikÃ¡tor front pÅ™Ã­kazÅ¯ zaÅ™Ã­zenÃ­ pro Ki-Wi Server.\n */\nclass CommunicatorQueue {\n  /**\n   * DoruÄ�Ã­ pÅ™Ã­kaz z fronty pÅ™Ã­kazÅ¯ zaÅ™Ã­zenÃ­.\n   * @param {string} queueId IdentifikÃ¡tor fronty.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­, kterÃ© chce komunikovat.\n   * @param {string} serverUrl URL adresa Ki-Wi Server pro komunikaci.\n   * @returns {Promise.<CommandEnum>} PÅ™Ã­kaz pro zaÅ™Ã­zenÃ­.\n   */\n  fetch (queueId, deviceId, serverUrl) {\n    if (!isString(queueId)) {\n      throw new TypeError('Missing queueId.');\n    }\n    return (\n      fetch(`${serverUrl}/api/device/${deviceId}/queue/${queueId}`, {method: 'POST'})\n      // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby sÃ­Å¥ovÃ©ho spojenÃ­.\n      .catch((error) => {\n        error.level = ErrorLevel.Warning;\n        throw error;\n      })\n      .then((response) => {\n        // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby ze serveru.\n        if (!response.ok) {\n          const error = new RangeError(`Invalid HTTP status \"${response.status}\".`);\n          error.level = ErrorLevel.Warning;\n          throw error;\n        }\n        return response.json();\n      })\n      .then((json) => CommunicatorQueue.parse(json))\n    );\n  }\n\n  /**\n   * Zpracuje frontu pÅ™Ã­kazÅ¯ zaÅ™Ã­zenÃ­.\n   * @param {Object} [json] OdpovÄ›Ä� na frontu pÅ™Ã­kazÅ¯ zaÅ™Ã­zenÃ­.\n   * @returns {CommandEnum|null} PÅ™Ã­kaz pro zaÅ™Ã­zenÃ­.\n   */\n  static parse (json) {\n    return CommunicatorCommand.parse(get(json, 'command'));\n  }\n}\n\nexport default CommunicatorQueue;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\nimport isNil from 'lodash/isNil';\n\nimport CommunicatorOrientation from '../orientation/communicator-orientation';\nimport DriveEnum from '../../drive/drive-enum';\nimport DriveUtil from '../../drive/drive-util';\nimport ErrorLevel from '../../error/error-level';\nimport PlatformUtil from '../../../platform/platform-util';\nimport UpdatePlatformUtil from '../../update/update-platform-util';\n\n/**\n * KomunikÃ¡tor informacÃ­ o zaÅ™Ã­zenÃ­ pro Ki-Wi Server.\n */\nclass CommunicatorReport {\n  /**\n   * OdeÅ¡le informace o zaÅ™Ã­zenÃ­.\n   * @param {ReportInfo} reportInfo Informace o zaÅ™Ã­zenÃ­.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­, kterÃ© chce komunikovat.\n   * @param {string} serverUrl URL adresa Ki-Wi Server pro komunikaci.\n   * @returns {Promise.<undefined>} Nic.\n   */\n  fetch (reportInfo, deviceId, serverUrl) {\n    return (\n      fetch(`${serverUrl}/api/device/${deviceId}/status`, {\n        body: JSON.stringify(this.filterReport(this.generateReport(reportInfo))),\n        headers: {'Content-type': 'application/json'},\n        method: 'POST'\n      })\n      // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby sÃ­Å¥ovÃ©ho spojenÃ­.\n      .catch((error) => {\n        error.level = ErrorLevel.Warning;\n        throw error;\n      })\n      .then((response) => {\n        // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby ze serveru.\n        if (!response.ok) {\n          const error = new RangeError(`Invalid HTTP status \"${response.status}\".`);\n          error.level = ErrorLevel.Warning;\n          throw error;\n        }\n      })\n    );\n  }\n\n  /**\n   * Odfiltruje prÃ¡zdnÃ© hodnoty z informacÃ­ o zaÅ™Ã­zenÃ­.\n   * @param {Object} mapped Informace o zaÅ™Ã­zenÃ­ ve formÃ¡tu pro server s prÃ¡zdnÃ½mi hodnotami.\n   * @private\n   * @returns {Object} Informace o zaÅ™Ã­zenÃ­ ve formÃ¡tu pro server.\n   */\n  filterReport (mapped) {\n    return Object.fromEntries(\n      Object.entries(mapped)\n      .filter(([key, value]) => !isNil(value))\n    );\n  }\n\n  /**\n   * PÅ™evede Ä�Ã¡st informacÃ­ s externÃ­mi ÃºloÅ¾iÅ¡ti do formÃ¡tu pro server.\n   * @param {ReportInfo} reportInfo\n   * @private\n   * @returns {Object} Informace o zaÅ™Ã­zenÃ­ ve formÃ¡tu pro server.\n   */\n  generateExternalDrives (reportInfo) {\n    const {driveInfo} = reportInfo;\n    if (isNil(driveInfo)) {\n      return {};\n    }\n    return (\n      driveInfo.driveUnitArray\n      .filter((driveUnit) => driveUnit.driveEnum === DriveEnum.EXTERNAL)\n      .reduce(\n        (acc, driveUnit) => {\n          const {id} = driveUnit;\n          return {\n            ...acc,\n            [`totalExternal.${id}`]: driveUnit.total,\n            [`usedExternal.${id}`]: driveUnit.used\n          };\n        },\n        {}\n      )\n    );\n  }\n\n  /**\n   * PÅ™evede Ä�Ã¡st informacÃ­ s internÃ­m ÃºloÅ¾iÅ¡tÄ›m do formÃ¡tu pro server.\n   * @param {ReportInfo} reportInfo\n   * @private\n   * @returns {Object} Informace o zaÅ™Ã­zenÃ­ ve formÃ¡tu pro server.\n   */\n  generateInternalDrive (reportInfo) {\n    const {driveInfo} = reportInfo;\n    if (isNil(driveInfo)) {\n      return {};\n    }\n    const driveUnit = DriveUtil.find(driveInfo.driveUnitArray);\n    if (isNil(driveUnit)) {\n      return {};\n    }\n    return {\n      totalInternal: driveUnit.total,\n      usedInternal: driveUnit.used\n    };\n  }\n\n  /**\n   * PÅ™evede vÅ¡echny informace o zaÅ™Ã­zenÃ­ do formÃ¡tu pro server.\n   * @param {ReportInfo} reportInfo Informace o zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {Object} Informace o zaÅ™Ã­zenÃ­ ve formÃ¡tu pro server.\n   */\n  generateReport (reportInfo) {\n    const {localControlLock, remoteControlLock} = reportInfo;\n    return {\n      ...this.generateExternalDrives(reportInfo),\n      ...this.generateInternalDrive(reportInfo),\n      bootTimestamp: reportInfo.bootTimestamp,\n      brightness: reportInfo.brightness,\n      buildId: reportInfo.buildId,\n      contentTimestamp: reportInfo.contentTimestamp,\n      controlLocalExceptionsPower: this.isControlPower(localControlLock),\n      controlLocalLocked: this.isControlLocked(localControlLock),\n      controlRemoteExceptionsPower: this.isControlPower(remoteControlLock),\n      controlRemoteLocked: this.isControlLocked(remoteControlLock),\n      firmwareVersion: reportInfo.firmwareVersion,\n      image: reportInfo.image,\n      // PÅ™ejmenovÃ¡nÃ­ \"now\" na \"local\".\n      localTimestamp: reportInfo.nowTimestamp,\n      manufacturer: reportInfo.manufacturer,\n      modelName: reportInfo.modelName,\n      muted: reportInfo.muted,\n      // Orientace v Ä�Ã­selnÃ­ku pouÅ¾Ã­vanÃ©m na serveru.\n      orientation: CommunicatorOrientation.generate(reportInfo.orientationEnum),\n      // Platforma v Ä�Ã­selnÃ­ku pouÅ¾Ã­vanÃ©m na serveru.\n      runtimePlatform: PlatformUtil.generate(reportInfo.runtimePlatform),\n      serialNumber: reportInfo.serialNumber,\n      temperature: reportInfo.temperature,\n      timezone: reportInfo.timezone,\n      totalRam: reportInfo.totalRam,\n      // Update platforma v Ä�Ã­selnÃ­ku pouÅ¾Ã­vanÃ©m na serveru.\n      updatePlatform: UpdatePlatformUtil.generate(reportInfo.updatePlatform),\n      updateUrl: reportInfo.updateUrl,\n      usedRam: reportInfo.usedRam,\n      version: reportInfo.version,\n      volume: reportInfo.volume,\n      wiredIpAddress: reportInfo.wiredIpAddress,\n      wiredMacAddress: reportInfo.wiredMacAddress,\n      wirelessIpAddress: reportInfo.wirelessIpAddress,\n      wirelessMacAddress: reportInfo.wirelessMacAddress\n    };\n  }\n\n  /**\n   * PÅ™evede zÃ¡mek ovlÃ¡dÃ¡nÃ­ do pÅ™Ã­znaku `locked`, kterÃ½ se posÃ­lÃ¡ na server.\n   * Pokud zÃ¡mek chybÃ­ tak do reportu nevloÅ¾Ã­ nic (napÅ™. zaÅ™Ã­zenÃ­ nepodporuje).\n   * Pokud je zÃ¡mek pÅ™Ã­tomnÃ½ (zaÅ™Ã­zenÃ­ omezenÃ­ podporuje), tak je vÅ¾dy `locked`\n   * nastaveno na `true` nebo `false` dle stavu uzamÄ�enÃ­.\n   * @param {?ControlLock} controlLock\n   * @private\n   * @returns {boolean|null}\n   */\n  isControlLocked (controlLock) {\n    return get(controlLock, 'locked', null);\n  }\n\n  /**\n   * PÅ™evede zÃ¡mek ovlÃ¡dÃ¡nÃ­ do pÅ™Ã­znaku `power`, kterÃ½ se posÃ­lÃ¡ na server.\n   * PÅ™Ã­znak `power` se odesÃ­lÃ¡ pouze v pÅ™Ã­padÄ›, Å¾e je nastaven na `true`.\n   * @param {ControlLock} controlLock\n   * @private\n   * @returns {boolean|null}\n   */\n  isControlPower (controlLock) {\n    const power = get(controlLock, 'exceptions.power');\n    if (power) {\n      return true;\n    }\n    return null;\n  }\n}\n\nexport default CommunicatorReport;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ScheduleEnum from '../../schedule/schedule-enum';\n\n/**\n * KomunikÃ¡tor plÃ¡nÅ¯ pÅ™ehrÃ¡vÃ¡nÃ­ pro Ki-Wi Server.\n */\nclass CommunicatorSchedule {\n  /**\n   * Zpracuje plÃ¡n pÅ™ehrÃ¡vÃ¡nÃ­.\n   * @param {string} [value] PlÃ¡n ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {ScheduleEnum|null} PlÃ¡n pÅ™ehrÃ¡vÃ¡nÃ­ ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  static parse (value) {\n    switch (value) {\n      case 'dynamic':\n        return ScheduleEnum.DYNAMIC;\n      case 'linear':\n        return ScheduleEnum.STATIC;\n      case 'shuffle':\n        return ScheduleEnum.RANDOM;\n      default:\n        return null;\n    }\n  }\n}\n\nexport default CommunicatorSchedule;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\n\nimport CommunicatorAnalytics from '../analytics/communicator-analytics';\nimport CommunicatorOrientation from '../orientation/communicator-orientation';\nimport CommunicatorStretch from '../stretch/communicator-stretch';\nimport CommunicatorUtility from '../utility/communicator-utility';\n\n/**\n * KomunikÃ¡tor sezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­ pro Ki-Wi Server.\n */\nclass CommunicatorSession {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {AutorebootCommunicator} communicatorAutoreboot\n   * @param {CommunicatorControl} communicatorControl\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @returns {CommunicatorSession} NovÃ¡ instance.\n   */\n  constructor (communicatorAutoreboot, communicatorControl, session) {\n    this.communicatorAutoreboot = communicatorAutoreboot;\n    this.communicatorControl = communicatorControl;\n    this.session = session;\n  }\n\n  /**\n   * Zpracuje nastavenÃ­ zaÅ™Ã­zenÃ­.\n   * @param {CommunicatorSettings} communicatorSettings\n   * @param {Object} [json] OdpovÄ›Ä� na obsah zaÅ™Ã­zenÃ­.\n   * @param {Store} store DatovÃ½ sklad ke vloÅ¾enÃ­ nastavenÃ­ zaÅ™Ã­zenÃ­.\n   * @returns {ContentInfo} Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n   */\n  parse (communicatorSettings, json, store) {\n    const mainJson = get(json, 'main');\n    const deviceJson = get(mainJson, 'module.media[0]');\n    const visualJson = get(mainJson, 'visualController');\n    const {communicatorAutoreboot, communicatorControl} = this;\n    return store.inject('session', {\n      analyticsPeriod: CommunicatorAnalytics.parse(get(deviceJson, 'log')),\n      autorebootDisabled: communicatorAutoreboot.isDisabled(communicatorSettings),\n      autorebootInterval: communicatorAutoreboot.getTnterval(communicatorSettings),\n      contentTimestamp: CommunicatorUtility.parseDate(get(mainJson, 'info.updateTimestamp')),\n      id: this.session.id,\n      localControlLock: communicatorControl.parseLocalLock(communicatorSettings),\n      orientationEnum: CommunicatorOrientation.parse(get(visualJson, 'screen[0].orientation')),\n      remoteControlLock: communicatorControl.parseRemoteLock(communicatorSettings),\n      stretchEnum: CommunicatorStretch.parse(get(deviceJson, 'stretching')),\n      volume: CommunicatorUtility.parseVolume(get(visualJson, 'volume'))\n    });\n  }\n}\n\nexport default CommunicatorSession;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na komunikÃ¡tory univerzÃ¡lnÃ­ho nastavenÃ­ pro Ki-Wi Server.\n */\nclass CommunicatorSettingsFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<CommunicatorSettings>} CommunicatorSettings\n   */\n  constructor (CommunicatorSettings) {\n    this.CommunicatorSettings = CommunicatorSettings;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ komunikÃ¡tor nastavenÃ­.\n   * @param {Object.<string, string>} [json] ÄŒÃ¡st obsahu zaÅ™Ã­zenÃ­ ze serveru s nastavenÃ­m.\n   * @returns {CommunicatorSettings}\n   */\n  create (json) {\n    return new this.CommunicatorSettings(json);\n  }\n}\n\nexport default CommunicatorSettingsFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport has from 'lodash/has';\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\nimport isString from 'lodash/isString';\n\n/**\n * KomunikÃ¡tor univerzÃ¡lnÃ­ho nastavenÃ­ pro Ki-Wi Server.\n * Knihovna utilit pro oprace s nastavenÃ­m zaÅ™Ã­zenÃ­ v `key:value` formÃ¡tu.\n */\nclass CommunicatorSettings {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Object.<string, string>} [json] ÄŒÃ¡st obsahu zaÅ™Ã­zenÃ­ ze serveru s nastavenÃ­m.\n   * @returns {CommunicatorSettings} NovÃ¡ instance.\n   */\n  constructor (json) {\n    if (!isNil(json) && !isObject(json)) {\n      throw new TypeError(`Invalid json \"${json}\".`);\n    }\n    this.json = json;\n  }\n\n  /**\n   * ZjistÃ­ hodnotu poloÅ¾ky nastavenÃ­.\n   * @param {string} key KlÃ­Ä�, jehoÅ¾ hodnota se mÃ¡ naÄ�Ã­st.\n   * @returns {null|string} Hodnota nalezenÃ© poloÅ¾ky nebo `null`.\n   */\n  get (key) {\n    if (!isString(key)) {\n      throw new TypeError(`Invalid key \"${key}\".`);\n    }\n    const {json} = this;\n    if (!has(json, key)) {\n      return null;\n    }\n    const value = json[key];\n    if (isNil(value)) {\n      return null;\n    }\n    if (!isString(value)) {\n      throw new TypeError(`Invalid value \"${value}\" for \"${key}\".`);\n    }\n    return value;\n  }\n}\n\nexport default CommunicatorSettings;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport StretchEnum from '../../stretch/stretch-enum';\n\n/**\n * KomunikÃ¡tor roztaÅ¾enÃ­ mÃ©dia pro Ki-Wi Server.\n */\nclass CommunicatorStretch {\n  /**\n   * Zpracuje roztaÅ¾enÃ­ mÃ©dia.\n   * @param {string} [value] RoztaÅ¾enÃ­ ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {StretchEnum|null} RoztaÅ¾enÃ­ mÃ©dia.\n   */\n  static parse (value) {\n    let result;\n    switch (value) {\n      case 'fill':\n        result = StretchEnum.FILL;\n        break;\n      case 'uniform':\n        result = StretchEnum.CONTAIN;\n        break;\n      case 'uniformToFill':\n        result = StretchEnum.COVER;\n        break;\n      default:\n        result = null;\n    }\n    return result;\n  }\n}\n\nexport default CommunicatorStretch;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport TargetEnum from '../../target-enum';\n\n/**\n * KomunikÃ¡tor cÃ­lÅ¯ ÃºkolÅ¯ pro Ki-Wi Server.\n */\nclass CommunicatorTarget {\n  /**\n   * Zpracuje cÃ­l Ãºkolu.\n   * @param {string} [value] CÃ­l ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {TargetEnum|null} CÃ­l Ãºkolu.\n   */\n  static parse (value) {\n    let result;\n    switch (value) {\n      case 'display1.primary':\n        result = TargetEnum.PRIMARY;\n        break;\n      default:\n        result = null;\n    }\n    return result;\n  }\n}\n\nexport default CommunicatorTarget;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\nimport merge from 'lodash/merge';\n\nimport CommandEnum from '../../command-enum';\nimport TaskEnum from '../../task/task-enum';\nimport CommunicatorNumber from '../number/communicator-number';\nimport CommunicatorTarget from '../target/communicator-target';\nimport CommunicatorTimer from '../timer/communicator-timer';\nimport CommunicatorUtility from '../utility/communicator-utility';\n\n/**\n * KomunikÃ¡tor Ãºloh pro Ki-Wi Server.\n */\nclass CommunicatorTask {\n  /**\n   * Zpracuje Ä�Ã­selnÃ­k typÅ¯ Ãºloh.\n   * @param {string} [value] Typ Ãºlohy ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {TaskEnum|null} PlÃ¡n pÅ™ehrÃ¡vÃ¡nÃ­ ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  static parseEnum (value) {\n    let result;\n    switch (value) {\n      case 'content':\n        result = TaskEnum.CONTENT;\n        break;\n      case 'shutdown':\n        result = TaskEnum.POWER;\n        break;\n      default:\n        result = null;\n    }\n    return result;\n  }\n\n  /**\n   * Zpracuje seznam Ãºloh a zanoÅ™enÃ½ch modelÅ¯.\n   * @param {Array.<Object>} jsonArray ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ se seznamem Ãºloh.\n   * @returns {DsMap} Mapa datovÃ½ch atributÅ¯ ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  static parseMany (jsonArray) {\n    const emptyMap = {\n      task: {},\n      timer: {}\n    };\n    return CommunicatorUtility.parseMany(jsonArray, CommunicatorTask.parseOne, emptyMap);\n  }\n\n  /**\n   * Zpracuje jednu Ãºlohu bez zanoÅ™enÃ½ch modelÅ¯.\n   * @param {Object} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s jednou Ãºlohou.\n   * @param {DsId} [id] IdentifikÃ¡tor Ãºlohy, kterÃ¡ se mÃ¡ zpracovat.\n   * @returns {DsAttrs} Obsah Ãºlohy ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  static parseModel (json, id) {\n    return {\n      id,\n      layoutId: CommunicatorUtility.parseReference(json.ref, 'layout'),\n      mediumId: CommunicatorUtility.parseReference(json.ref, 'media'),\n      playlistId: CommunicatorUtility.parseReference(json.ref, 'playlist'),\n      priority: CommunicatorNumber.fromNumber(json.priority),\n      targetEnum: CommunicatorTarget.parse(json.target),\n      taskEnum: CommunicatorTask.parseEnum(json.type)\n    };\n  }\n\n  /**\n   * Zpracuje jednu Ãºlohu a zanoÅ™enÃ© modely.\n   * @param {Object} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s jednou Ãºlohou.\n   * @returns {DsMap} Mapa datovÃ½ch atributÅ¯ ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  static parseOne (json) {\n    let result;\n    const {daysOfWeek, id} = json;\n    if (isNil(id)) {\n      result = {\n        task: {},\n        timer: {}\n      };\n    } else {\n      const taskModel = CommunicatorTask.parseModel(json, id);\n      const taskMap = {task: {[id]: taskModel}};\n      const offTimerMap = CommunicatorTimer.parseMany(json.startTimes, id, CommandEnum.POWER_OFF, daysOfWeek);\n      const onTimerMap = CommunicatorTimer.parseMany(json.endTimes, id, CommandEnum.POWER_ON, daysOfWeek);\n      result = merge({}, offTimerMap, onTimerMap, taskMap);\n    }\n    return result;\n  }\n}\n\nexport default CommunicatorTask;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\nimport objectHash from 'object-hash';\n\nimport CommunicatorNumber from '../number/communicator-number';\nimport CommunicatorUtility from '../utility/communicator-utility';\n\n/**\n * KomunikÃ¡tor Ä�asovaÄ�Å¯ Å™Ã­dÃ­cÃ­ch Ãºloh pro Ki-Wi Server.\n */\nclass CommunicatorTimer {\n  /**\n   * Vygeneruje novÃ½ identifikÃ¡tor.\n   * @param {DsId} [taskId] IdentifikÃ¡tor Ãºlohy, do kterÃ© Ä�asovaÄ� patÅ™Ã­.\n   * @param {CommandEnum} commandEnum PÅ™Ã­kaz k provedenÃ­ Ä�asovaÄ�em.\n   * @param {number} day Den v tÃ½dnu k provedenÃ­ Ä�asovaÄ�e.\n   * @returns {null|string} IdentifikÃ¡tor Ä�asovaÄ�e.\n   */\n  static generateId (taskId, commandEnum, day) {\n    return objectHash({commandEnum, day, taskId});\n  }\n\n  /**\n   * ZjistÃ­, jestli je pro den nastaven pÅ™Ã­znak pouÅ¾itÃ­.\n   * @param {number} [binaryWeek] ZakÃ³dovanÃ© binÃ¡rnÃ­ pÅ™Ã­znaky, kterÃ© dny se majÃ­ pouÅ¾Ã­t.\n   * @param {number} day Den, kterÃ½ se ovÄ›Å™uje.\n   * @returns {boolean} PÅ™Ã­znak, jestli se mÃ¡ den pouÅ¾Ã­t.\n   */\n  static includesDay (binaryWeek, day) {\n    // PoÄ�et bitovÃ½ch pÅ™Ã­znakÅ¯ zakÃ³dovanÃ½ch v Ä�Ã­sle.\n    const flagCount = 7;\n    // Å˜Ã¡d Ä�Ã­sla, ve kterÃ©m je pÅ™Ã­znak uloÅ¾en.\n    // Posun o jednu pozici (0 pro pondÄ›lÃ­ mÃ­sto nedÄ›le).\n    const flagPosition = (flagCount + day - 1) % flagCount;\n    // ÄŒÃ­slo, kterÃ© mÃ¡ nastaven pouze hledanÃ½ Å™Ã¡d.\n    const flagValue = Math.pow(2, flagPosition);\n    // Kontrola, jestli je ovÄ›Å™ovanÃ½ bit nastaven.\n    // ZÃ¡mÄ›rnÃ© pouÅ¾itÃ­ bitwise operÃ¡toru.\n    // eslint-disable-next-line no-bitwise\n    return Boolean(binaryWeek & flagValue);\n  }\n\n  /**\n   * Zpracuje seznam Ä�asovaÄ�Å¯ a zanoÅ™enÃ½ch modelÅ¯.\n   * @param {Array.<string>} jsonArray ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ se seznamem Ä�asovaÄ�Å¯.\n   * @param {DsId} [taskId] IdentifikÃ¡tor Ãºlohy, do kterÃ© Ä�asovaÄ� patÅ™Ã­.\n   * @param {CommandEnum} commandEnum PÅ™Ã­kaz k provedenÃ­ Ä�asovaÄ�em.\n   * @param {string} [binaryWeekString] ZakÃ³dovanÃ© binÃ¡rnÃ­ pÅ™Ã­znaky, kterÃ© dny se majÃ­ pouÅ¾Ã­t.\n   * @returns {DsMap} Mapa datovÃ½ch atributÅ¯ ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  static parseMany (jsonArray, taskId, commandEnum, binaryWeekString) {\n    const emptyMap = {timer: {}};\n    const binaryWeekNumber = CommunicatorNumber.fromString(binaryWeekString);\n    return CommunicatorUtility.parseMany(\n      jsonArray,\n      (jsonString, index) => CommunicatorTimer.parseOne(jsonString, taskId, commandEnum, binaryWeekNumber, index),\n      emptyMap\n    );\n  }\n\n  /**\n   * Zpracuje jeden Ä�asovaÄ� bez zanoÅ™enÃ½ch modelÅ¯.\n   * @param {string} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s jednÃ­m Ä�asovaÄ�em.\n   * @param {DsId} [id] IdentifikÃ¡tor Ä�asovaÄ�e, kterÃ¡ se mÃ¡ zpracovat.\n   * @param {DsId} [taskId] IdentifikÃ¡tor Ãºlohy, do kterÃ© Ä�asovaÄ� patÅ™Ã­.\n   * @param {CommandEnum} commandEnum PÅ™Ã­kaz k provedenÃ­ Ä�asovaÄ�em.\n   * @param {number} day Den v tÃ½dnu k provedenÃ­ Ä�asovaÄ�e.\n   * @returns {DsAttrs} Obsah Ä�asovaÄ�e ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  static parseModel (json, id, taskId, commandEnum, day) {\n    const clock = CommunicatorUtility.parseClock(json);\n    return {\n      commandEnum,\n      day,\n      hour: clock.hour,\n      id,\n      minute: clock.minute,\n      second: clock.second,\n      taskId\n    };\n  }\n\n  /**\n   * Zpracuje jeden Ä�asovaÄ� a zanoÅ™enÃ© modely.\n   * @param {string} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s jednÃ­m Ä�asovaÄ�em.\n   * @param {DsId} [taskId] IdentifikÃ¡tor Ãºlohy, do kterÃ© Ä�asovaÄ� patÅ™Ã­.\n   * @param {CommandEnum} commandEnum PÅ™Ã­kaz k provedenÃ­ Ä�asovaÄ�em.\n   * @param {number} [binaryWeek] ZakÃ³dovanÃ© binÃ¡rnÃ­ pÅ™Ã­znaky, kterÃ© dny se majÃ­ pouÅ¾Ã­t.\n   * @param {number} index PoÅ™adÃ­ Ä�asovaÄ�e v seznamu Ä�asovaÄ�Å¯.\n   * @returns {DsMap} Mapa datovÃ½ch atributÅ¯ ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  static parseOne (json, taskId, commandEnum, binaryWeek, index) {\n    let result;\n    const day = CommunicatorUtility.parseDay(index);\n    const id = CommunicatorTimer.generateId(taskId, commandEnum, day);\n    if (isNil(id) || !CommunicatorTimer.includesDay(binaryWeek, day)) {\n      result = {timer: {}};\n    } else {\n      const model = CommunicatorTimer.parseModel(json, id, taskId, commandEnum, day);\n      result = {timer: {[id]: model}};\n    }\n    return result;\n  }\n}\n\nexport default CommunicatorTimer;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\nimport isArray from 'lodash/isArray';\n\nimport CommunicatorUtility from '../utility/communicator-utility';\nimport ErrorLevel from '../../error/error-level';\n\n/**\n * KomunikÃ¡tor aktualizacÃ­ zaÅ™Ã­zenÃ­ pro Ki-Wi Server.\n */\nclass CommunicatorUpdate {\n  /**\n   * DoruÄ�Ã­ informace o aktualizaci zaÅ™Ã­zenÃ­.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­, kterÃ© chce komunikovat.\n   * @param {string} serverUrl URL adresa Ki-Wi Server pro komunikaci.\n   * @returns {Promise.<Object>} Informace o aktualizaci.\n   */\n  fetch (deviceId, serverUrl) {\n    return (\n      fetch(`${serverUrl}/api/device/${deviceId}/update`, {method: 'GET'})\n      // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby sÃ­Å¥ovÃ©ho spojenÃ­.\n      .catch((error) => {\n        error.level = ErrorLevel.Warning;\n        throw error;\n      })\n      .then((response) => {\n        // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby ze serveru.\n        if (!response.ok) {\n          const error = new RangeError(`Invalid HTTP status \"${response.status}\".`);\n          error.level = ErrorLevel.Warning;\n          throw error;\n        }\n        return response.json();\n      })\n      .then((json) => CommunicatorUpdate.parse(json))\n    );\n  }\n\n  /**\n   * Zpracuje aktualizaci zaÅ™Ã­zenÃ­.\n   * @param {Object} [json] OdpovÄ›Ä� na aktualizaci zaÅ™Ã­zenÃ­.\n   * @returns {Object|null} Informace o aktualizaci.\n   */\n  static parse (json) {\n    let urlArray;\n    const urls = get(json, 'urls');\n    if (isArray(urls)) {\n      urlArray = urls.map((url) => CommunicatorUtility.parseString(url));\n    } else {\n      urlArray = [];\n    }\n    return {\n      urlArray,\n      version: CommunicatorUtility.parseString(get(json, 'appVersion'))\n    };\n  }\n}\n\nexport default CommunicatorUpdate;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport CommunicatorNumber from '../number/communicator-number';\n\nimport get from 'lodash/get';\nimport isArray from 'lodash/isArray';\nimport isNil from 'lodash/isNil';\nimport isNull from 'lodash/isNull';\nimport isNumber from 'lodash/isNumber';\nimport isObject from 'lodash/isObject';\nimport isString from 'lodash/isString';\nimport merge from 'lodash/merge';\n\n/**\n * Utility komunikÃ¡toru pro Ki-Wi Server.\n */\nclass CommunicatorUtility {\n  /**\n   * Zpracuje samostatnÃ½ Ä�as bez datumu.\n   * @param {string} [inputString] ÄŒas ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {Object} Objekt s hodnotami v `Date#getHours`, `Date#getMinutes` a `Date#getSeconds` formÃ¡tu.\n   */\n  static parseClock (inputString) {\n    // VÃ½stupnÃ­ hodnoty s pomocnÃ½mi daty seÅ™azenÃ© od nejniÅ¾Å¡Ã­ho Å™Ã¡du.\n    const resultArray = [\n      {key: 'second', max: 60},\n      {key: 'minute', max: 60},\n      {key: 'hour', max: 24}\n    ];\n    const {length} = resultArray;\n    if (isString(inputString)) {\n      // NaÄ�tenÃ­ hodnot oddÄ›lenÃ½ch dvojteÄ�kou.\n      const inputArray = inputString.split(':', length);\n      // OmezenÃ­ naÄ�tenÃ½ch hodnot dle poÄ�tu vstupÅ¯.\n      inputArray.length = length;\n      // SeÅ™azenÃ­ naÄ�tenÃ½ch hodnot od nejniÅ¾Å¡Ã­ho Å™Ã¡du.\n      inputArray.reverse();\n      // VÃ½poÄ�et jednotlivÃ½ch vÃ½stupÅ¯.\n      resultArray.forEach((result, index, array) => {\n        let overflow;\n        let value;\n        // NaÄ�tenÃ­ hodnoty aktuÃ¡lnÃ­ho Å™Ã¡du.\n        const inputNumber = CommunicatorNumber.fromString(inputArray[index]);\n        if (isNull(inputNumber) || !Number.isFinite(inputNumber)) {\n          overflow = null;\n          value = null;\n        } else {\n          // PÅ™eteÄ�enÃ­ z niÅ¾Å¡Ã­ho Å™Ã¡du.\n          const carry = get(array[index - 1], 'overflow', 0);\n          // Hodnota aktuÃ¡lnÃ­ho Å™Ã¡du s pÅ™eteÄ�enÃ­m.\n          const total = inputNumber + carry;\n          overflow = Math.max(0, total - result.max + 1);\n          value = total % result.max;\n        }\n        // PÅ™eteÄ�enÃ­ do vyÅ¡Å¡Ã­ho Å™Ã¡du.\n        result.overflow = overflow;\n        // VÃ½slednÃ¡ hodnota aktuÃ¡lnÃ­ho Å™Ã¡du.\n        result.value = value;\n      });\n    } else {\n      // VÃ½chozÃ­ hodnoty.\n      resultArray.forEach((result) => {\n        result.value = null;\n      });\n    }\n    // SpojenÃ­ pole vÃ½stupnÃ­ch hodnot do objektu.\n    return resultArray.reduce(\n      (acc, result) => {\n        acc[result.key] = result.value;\n        return acc;\n      },\n      {}\n    );\n  }\n\n  /**\n   * NaÄ�te pravdivostnÃ­ hodnotu.\n   * @param {string} [value] PÅ™Ã­znak ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {boolean|null} PÅ™Ã­znak jako `boolean`.\n   */\n  static parseBoolean (value) {\n    if (isNil(value)) {\n      return null;\n    }\n    if (!isString(value)) {\n      throw new TypeError(`Invalid boolean \"${value}\".`);\n    }\n    return value === 'true';\n  }\n\n  /**\n   * Zpracuje datum.\n   * @param {number|string} [value] Datum ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {string|null} Datum v ISO formÃ¡tu.\n   */\n  static parseDate (value) {\n    let result;\n    if (isString(value) || isNumber(value)) {\n      const date = new Date(value);\n      if (isNaN(date)) {\n        result = null;\n      } else {\n        result = date.toISOString();\n      }\n    } else {\n      result = null;\n    }\n    return result;\n  }\n\n  /**\n   * Zpracuje den v tÃ½dnu.\n   * @param {number} value ÄŒÃ­slo dne ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {number} Datum v `Date#getDay` formÃ¡tu (0 = nedÄ›le).\n   */\n  static parseDay (value) {\n    const number = CommunicatorUtility.parseNumber(value);\n    if (isNull(number) || !Number.isFinite(number)) {\n      return null;\n    }\n    return (value + 1) % 7;\n  }\n\n  // TODO #151 ZruÅ¡it v rÃ¡mci opuÅ¡tÄ›nÃ­ rozhranÃ­ DsMap.\n  /**\n   * Zpracuje seznam modelÅ¯ vÄ�etnÄ› zanoÅ™enÃ½ch.\n   * @param {Array.<Object>} jsonArray ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ se seznamem modelÅ¯.\n   * @param {Function} iterator Callback funkce pro zpracovÃ¡nÃ­ jednÃ© poloÅ¾ky modelu.\n   * @param {DsMap} initial PrÃ¡zdnÃ¡ mapa datovÃ½ch atributÅ¯.\n   * @returns {DsMap} Mapa datovÃ½ch atributÅ¯ ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  static parseMany (jsonArray, iterator, initial) {\n    let result;\n    if (isArray(jsonArray)) {\n      result = jsonArray.reduce(\n        (accumulator, ...args) => merge(accumulator, iterator(...args)),\n        initial\n      );\n    } else {\n      result = initial;\n    }\n    return result;\n  }\n\n  // TODO SamostatnÃ© metody pro vstupy `number` a `string`.\n  // - ZruÅ¡it po odstranÄ›nÃ­ poslednÃ­ch zÃ¡vislostÃ­.\n  /**\n   * Zpracuje Ä�Ã­slo.\n   * @deprecated PouÅ¾Ã­vat CommunicatorNumber dle vstupnÃ­ho typu.\n   * @param {number|string} [value] ÄŒÃ­slo ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {null|number} KoneÄ�nÃ© Ä�Ã­slo.\n   */\n  static parseNumber (value) {\n    if (isNil(value)) {\n      return null;\n    } else if (isNumber(value)) {\n      return CommunicatorNumber.fromNumber(value);\n    } else if (isString(value)) {\n      return CommunicatorNumber.fromString(value);\n    }\n    throw new TypeError(`Invalid number \"${value}\".`);\n  }\n\n  /**\n   * Zpracuje odkaz na jinÃ½ objekt.\n   * @param {Object} [json] ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s jednÃ­m odkazem.\n   * @param {string} key KlÃ­Ä� relace, kterÃ¡ se mÃ¡ naÄ�Ã­st.\n   * @returns {DsId|null} IdentifikÃ¡tor na kterÃ½ se odkazuje.\n   */\n  static parseReference (json, key) {\n    let result;\n    if (!isString(key)) {\n      throw new TypeError(`Invalid key \"${key}\".`);\n    }\n    if (isObject(json)) {\n      const {id, type} = json;\n      if ((isString(id) || Number.isFinite(id)) && type === key) {\n        result = id;\n      } else {\n        result = null;\n      }\n    } else {\n      result = null;\n    }\n    return result;\n  }\n\n  /**\n   * NaÄ�te Å™etÄ›zec.\n   * @param {string} [value] Å˜etÄ›zec ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {null|string} Å˜etÄ›zec jako `string`.\n   */\n  static parseString (value) {\n    if (isNil(value)) {\n      return null;\n    }\n    if (!isString(value)) {\n      throw new TypeError(`Invalid string \"${value}\".`);\n    }\n    return value;\n  }\n\n  // TODO SamostatnÃ© metody pro vstupy `number` a `string`.\n  // - PÅ™esunou do samostatnÃ©ho modulu a rozdÄ›li na 2 metody.\n  // - ZvÃ¡Å¾it jestli nepovolit vÃ½stup NaN apod.\n  /**\n   * Zpracuje Ä�asovÃ½ Ãºdaj.\n   * @param {number|string} [value] ÄŒas ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {null|number} PoÄ�et ms.\n   */\n  static parseTime (value) {\n    const number = CommunicatorUtility.parseNumber(value);\n    if (isNull(number) || !Number.isFinite(number)) {\n      return null;\n    }\n    return Math.round(number * 1000);\n  }\n\n  // TODO SamostatnÃ© metody pro vstupy `number` a `string`.\n  // - PÅ™esunou do samostatnÃ©ho modulu a rozdÄ›li na 2 metody.\n  // - ZvÃ¡Å¾it jestli nepovolit vÃ½stup NaN apod.\n  /**\n   * Zpracuje hlasitost.\n   * @param {number|string} [value] Hlasitost ve formÃ¡tu, kterÃ½ vracÃ­ server.\n   * @returns {null|number} Hlasitost na Å¡kÃ¡le od 0.0 (potichu) do 1.0 (nahlas).\n   */\n  static parseVolume (value) {\n    const number = CommunicatorUtility.parseNumber(value);\n    if (isNull(number) || !Number.isFinite(number)) {\n      return null;\n    }\n    return number / 100;\n  }\n}\n\nexport default CommunicatorUtility;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na zaznamenÃ¡vaÄ�e vÃ½jimek pro Console API.\n */\nclass ConsoleLoggerFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<ConsoleLogger>} ConsoleLogger\n   * @param {Console} console\n   * @param {ErrorLevelFactory} errorLevelFactory\n   */\n  constructor (ConsoleLogger, console, errorLevelFactory) {\n    this.ConsoleLogger = ConsoleLogger;\n    this.console = console;\n    this.errorLevelFactory = errorLevelFactory;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ zaznamenÃ¡vaÄ� vÃ½jimek.\n   * @returns {ConsoleLogger}\n   */\n  create () {\n    return new this.ConsoleLogger(this.console, this.errorLevelFactory);\n  }\n}\n\nexport default ConsoleLoggerFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ErrorLevel from '../error/error-level';\n\n/**\n * ZaznamenÃ¡vaÄ� vÃ½jimek pro Console API.\n * Vypisuje chyby do vÃ½vojÃ¡Å™skÃ© konzole v prohlÃ­Å¾eÄ�i.\n * @implements {Logger}\n */\nclass ConsoleLogger {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Console} console\n   * @param {ErrorLevelFactory} errorLevelFactory\n   */\n  constructor (console, errorLevelFactory) {\n    this.console = console;\n    this.errorLevelFactory = errorLevelFactory;\n  }\n\n  /**\n   * ZaznamenÃ¡ libovolnou hodnotu,\n   * pÅ™iÄ�emÅ¾ se hodnota ÃºrovnÄ› chyby pouÅ¾ije primÃ¡rnÄ› z tÃ©to hodnoty\n   * a sekundÃ¡rnÄ› z nÃ¡zvu metody zanamenÃ¡vaÄ�e chyb,\n   * pÅ™es kterou byla chyba pÅ™edÃ¡na.\n   * @param {ErrorLevel} methodLevel ÃšroveÅˆ chyby, kterÃ¡ pÅ™Ã­sluÅ¡Ã­ metodÄ›,\n   * kterÃ¡ byla na zaznamenÃ¡vaÄ�i vÃ½jimek volÃ¡na.\n   * @param {*} value LibovolnÃ¡ hodnota k zalogovÃ¡nÃ­.\n   * @private\n   * @returns {undefined}\n   */\n  capture (methodLevel, value) {\n    const {console} = this;\n    const valueLevel = this.errorLevelFactory.fromValue(value);\n    const level = valueLevel || methodLevel;\n    switch (level) {\n      case ErrorLevel.Debug:\n        return console.debug(value);\n      case ErrorLevel.Error:\n        return console.error(value);\n      case ErrorLevel.Info:\n        return console.info(value);\n      case ErrorLevel.Log:\n        return console.log(value);\n      case ErrorLevel.Warning:\n        return console.warn(value);\n      default:\n        throw new RangeError(`Unknown level \"${level}\".`);\n    }\n  }\n\n  /** @inheritdoc */\n  debug (value) {\n    return this.capture(ErrorLevel.Debug, value);\n  }\n\n  /** @inheritdoc */\n  error (value) {\n    return this.capture(ErrorLevel.Error, value);\n  }\n\n  /** @inheritdoc */\n  info (value) {\n    return this.console.info(value);\n  }\n\n  /** @inheritdoc */\n  log (value) {\n    return this.capture(ErrorLevel.Log, value);\n  }\n\n  /** @inheritdoc */\n  setInfo (loggerInfo) {\n    // PrÃ¡zdnÃ¡ metoda pro splnÄ›nÃ­ rozhranÃ­.\n    // Do vÃ½vojÃ¡Å™skÃ© konzole se Å¾Ã¡dnÃ© dodateÄ�nÃ© informace nevypisujÃ­.\n  }\n\n  /** @inheritdoc */\n  warn (value) {\n    return this.capture(ErrorLevel.Warning, value);\n  }\n}\n\nexport default ConsoleLogger;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\nimport isNull from 'lodash/isNull';\nimport merge from 'lodash/merge';\n\nimport CommunicatorFirmware from '../communicator/firmware/communicator-firmware';\nimport CommunicatorLayer from '../communicator/layer/communicator-layer';\nimport CommunicatorLayout from '../communicator/layout/communicator-layout';\nimport CommunicatorMedium from '../communicator/medium/communicator-medium';\nimport CommunicatorTask from '../communicator/task/communicator-task';\nimport ErrorLevel from '../error/error-level';\n\n// TODO #94 PÅ™idat unit testy pro novÃ© funkcionality spojenÃ© s offline mÃ³dem.\n/**\n * KomunikÃ¡tor obsahu zaÅ™Ã­zenÃ­ pro Ki-Wi Server\n */\nclass ContentCommunicator {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {CommunicatorSession} communicatorSession\n   * @param {CommunicatorSettingsFactory} communicatorSettingsFactory\n   * @param {Object} config Konfigurace aplikace.\n   * @param {FirmwareManager} firmwareManager\n   * @param {PlaylistCommunicator} playlistCommunicator\n   */\n  constructor (communicatorSession, communicatorSettingsFactory, config, firmwareManager, playlistCommunicator) {\n    const communicatorLayer = new CommunicatorLayer();\n    this.communicatorFirmware = new CommunicatorFirmware(config);\n    this.communicatorLayer = communicatorLayer;\n    this.communicatorLayout = new CommunicatorLayout(communicatorLayer);\n    this.communicatorSession = communicatorSession;\n    this.communicatorSettingsFactory = communicatorSettingsFactory;\n    this.fetching = false;\n    this.firmwareManager = firmwareManager;\n    this.latestTimestamp = null;\n    this.playlistCommunicator = playlistCommunicator;\n  }\n\n  /**\n   * PorovnÃ¡, jestli obdrÅ¾enÃ½ Ä�asovÃ½ otisk uspokojÃ­ poÅ¾adovanÃ½ Ä�asovÃ½ otisk.\n   * @param {string} [receivedTimestamp] ObdrÅ¾enÃ½ Ä�asovÃ½ otisk z obsahovÃ©ho API.\n   * @param {string} [latestTimestamp] PoÅ¾adovanÃ½ Ä�asovÃ½ otisk z heartbeat API.\n   * @private\n   * @returns {boolean} PÅ™Ã­znak, jestli Ä�asovÃ½ otisk uspokojÃ­ poÅ¾adovanÃ½.\n   */\n  static compareReceived (receivedTimestamp, latestTimestamp) {\n    const receivedDate = new Date(receivedTimestamp);\n    const receivedValid = !isNull(receivedTimestamp) && !isNaN(receivedDate);\n    const latestDate = new Date(latestTimestamp);\n    const latestValid = !isNull(latestTimestamp) && !isNaN(latestDate);\n    return receivedValid && (!latestValid || !(receivedDate < latestDate));\n  }\n\n  /**\n   * PorovnÃ¡, jestli mÃ¡ poÅ¾adovanÃ½ Ä�asovÃ½ otisk nahradit pÅ™edchozÃ­ Ä�asovÃ½ otisk.\n   * @param {string} [requiredTimestamp] NovÄ› poÅ¾adovanÃ½ Ä�asovÃ½ otisk z heartbeat API.\n   * @param {string} [latestTimestamp] PÅ™edchozÃ­ poÅ¾adovanÃ½ Ä�asovÃ½ otisk z heartbeat API.\n   * @private\n   * @returns {boolean} PÅ™Ã­znak, jestli mÃ¡ novÃ½ Ä�asovÃ½ otisk nahradit pÅ™edchozÃ­.\n   */\n  static compareRequired (requiredTimestamp, latestTimestamp) {\n    const requiredDate = new Date(requiredTimestamp);\n    const requiredValid = !isNull(requiredTimestamp) && !isNaN(requiredDate);\n    const latestDate = new Date(latestTimestamp);\n    const latestValid = !isNull(latestTimestamp) && !isNaN(latestDate);\n    return requiredValid && (!latestValid || requiredDate > latestDate);\n  }\n\n  /**\n   * DoruÄ�Ã­ obsah zaÅ™Ã­zenÃ­.\n   * @param {Store} store DatovÃ½ sklad ke vloÅ¾enÃ­ obsahu zaÅ™Ã­zenÃ­.\n   * @param {string} [requiredTimestamp] ÄŒasovÃ½ otisk, kterÃ½ by mÄ›l obsah mÃ­t.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­, kterÃ© chce komunikovat.\n   * @param {string} serverUrl URL adresa Ki-Wi Server pro komunikaci.\n   * @returns {Promise.<ContentInfo|null>} Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n   */\n  fetch (store, requiredTimestamp, deviceId, serverUrl) {\n    // TODO #94 OmezenÃ­ paralelnÃ­ho fetch:\n    // - Napsat unit testy.\n    // TODO #84 Reakce pÅ™i chybÄ› nebo neaktuÃ¡lnÃ­m obsahu.\n    // - PonechÃ¡ny debug vÃ½pisy pro usnadÄ›nÃ­ testovÃ¡nÃ­.\n    // - ZatÃ­m je Å™Ã­zeno z heartbeat. PropracovanÄ›jÅ¡Ã­ verze by mÄ›la Å™eÅ¡it problÃ©m zde.\n    // - ObecnÄ› jde o to, Å¾e pokud se stahuje obsah 1 a mezitÃ­m pÅ™ijde poÅ¾adavek na obsah 2.\n    // - V tom pÅ™Ã­padÄ› by se mÄ›lo poÄ�kat na staÅ¾enÃ­ 1, zahodit a potom (ihned?) stÃ¡hnout obsah 2.\n    // - NynÃ­ se spolÃ©hÃ¡ na to, Å¾e pÅ™ijde dalÅ¡Ã­ heartbeat, kterÃ½ novÃ½ obsah stÃ¡hne.\n    // UloÅ¾enÃ­ nejnovÄ›jÅ¡Ã­ho poÅ¾adovanÃ©ho contentTimestamp.\n    if (ContentCommunicator.compareRequired(requiredTimestamp, this.latestTimestamp)) {\n      this.latestTimestamp = requiredTimestamp;\n    }\n    if (this.fetching) {\n      // Pokud se jiÅ¾ nÄ›jakÃ½ obsah stahuje, tak se jiÅ¾ nic jinÃ©ho nedÄ›lat.\n      return Promise.resolve(null);\n    }\n    this.fetching = true;\n    return (\n      // StaÅ¾enÃ­ JSON obsahu zaÅ™Ã­zenÃ­.\n      fetch(`${serverUrl}/device/generator/${deviceId}/3`)\n      // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby sÃ­Å¥ovÃ©ho spojenÃ­.\n      .catch((error) => {\n        error.level = ErrorLevel.Warning;\n        throw error;\n      })\n      .then((response) => {\n        // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby ze serveru.\n        if (!response.ok) {\n          const error = new RangeError(`Invalid HTTP status \"${response.status}\".`);\n          error.level = ErrorLevel.Warning;\n          throw error;\n        }\n        return response.json();\n      })\n      .then((json) => (\n        this.firmwareManager.getInfo()\n        .then((firmwareInfo) => {\n          const contentInfo = this.parse(store, json, firmwareInfo);\n          const receivedTimestamp = contentInfo.session.contentTimestamp;\n          if (ContentCommunicator.compareReceived(receivedTimestamp, this.latestTimestamp)) {\n            return contentInfo;\n          }\n          return null;\n        })\n      ))\n      .finally(() => {\n        this.fetching = false;\n      })\n    );\n  }\n\n  /**\n   * Zpracuje obsah zaÅ™Ã­zenÃ­.\n   * @param {Store} store DatovÃ½ sklad ke vloÅ¾enÃ­ obsahu zaÅ™Ã­zenÃ­.\n   * @param {Object} [json] OdpovÄ›Ä� na obsah zaÅ™Ã­zenÃ­.\n   * @param {FirmwareInfo} firmwareInfo Informace o aktuÃ¡lnÃ­m firmware zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {ContentInfo} Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n   */\n  parse (store, json, firmwareInfo) {\n    // NaÄ�tenÃ­ nastavenÃ­ zaÅ™Ã­zenÃ­.\n    const communicatorSettings = this.communicatorSettingsFactory.create(get(json, 'main.module.media[0].settings'));\n    // NaÄ�tenÃ­ jednotlivÃ½ch Ä�Ã¡stÃ­ obsahu.\n    const contentTaskDsMap = CommunicatorTask.parseMany(get(json, 'main.commonContent.task'));\n    const mediumDsMap = CommunicatorMedium.parseMany(get(json, 'main.commonContent.medium'));\n    const playlistDsMap = this.playlistCommunicator.parseMany(get(json, 'main.commonContent.playlist'));\n    const powerTaskDsMap = CommunicatorTask.parseMany(get(json, 'main.module.task'));\n    const layoutArrayJson = get(json, 'main.commonContent.layout', []);\n    const {layerArray, layoutArray} = layoutArrayJson.reduce(\n      (acc, layoutJson) => {\n        const layout = this.communicatorLayout.parse(store, layoutJson);\n        // OdebÃ­rÃ¡ se vÃ½chozÃ­ vklÃ¡dÃ¡nÃ½ layout.\n        // NenÃ­ k niÄ�emu pouÅ¾Ã­vanÃ½ a ani se nezdÃ¡ k nÄ›Ä�emu vhodnÃ½.\n        if (layout.id !== 'mainLayout') {\n          acc.layoutArray.push(layout);\n          acc.layerArray.push(...this.communicatorLayout.parseLayers(store, layoutJson));\n        }\n        return acc;\n      },\n      {layerArray: [], layoutArray: []}\n    );\n    // SloÅ¾enÃ­ vÃ½slednÃ©ho obsahu z jednotlivÃ½ch Ä�Ã¡stÃ­.\n    return {\n      firmwareRelease: this.communicatorFirmware.parse(communicatorSettings, firmwareInfo),\n      layerArray,\n      layoutArray,\n      mediumArray: store.inject('medium', Object.values(mediumDsMap.medium)),\n      playlistArray: store.inject('playlist', Object.values(playlistDsMap.playlist)),\n      session: this.communicatorSession.parse(communicatorSettings, json, store),\n      store,\n      taskArray: store.inject('task', Object.values(merge({}, contentTaskDsMap.task, powerTaskDsMap.task))),\n      timerArray: store.inject('timer', Object.values(merge({}, contentTaskDsMap.timer, powerTaskDsMap.timer))),\n      trackArray: store.inject('track', Object.values(playlistDsMap.track))\n    };\n  }\n}\n\nexport default ContentCommunicator;\n","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO ZatÃ­m se nerozliÅ¡uje mezi zdrojem na kterÃ©m byla klÃ¡vesa stisknuta.\n// - PÅ™idat dalÅ¡Ã­ Ä�Ã­selnÃ­k ControlSource.\n// - PÅ™Ã­klady: HW klÃ¡vesnice, virtuÃ¡lnÃ­ klÃ¡vesnice, dÃ¡lkovÃ½ ovladaÄ�, na zaÅ™Ã­zenÃ­, ...\n/**\n * ÄŒÃ­selnÃ­k ovlÃ¡dacÃ­ch tlaÄ�Ã­tek.\n * JmÃ©na pÅ™evzata ze standardnÃ­ch hodnot podle MDN:\n * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values\n * @enum {string}\n */\nconst ControlButton = {\n  /** Å ipka dolÅ¯. */\n  ArrowDown: 'ArrowDown',\n  /** Å ipka vlevo. */\n  ArrowLeft: 'ArrowLeft',\n  /** Å ipka vpravo. */\n  ArrowRight: 'ArrowRight',\n  /** Å ipka nahoru. */\n  ArrowUp: 'ArrowUp',\n  /**\n   * TlaÄ�Ã­tko pro nÃ¡vrat zpÄ›t v historii.\n   * Na standardnÃ­ klÃ¡vesnici se vÄ›tÅ¡inou nenachÃ¡zÃ­.\n   * Na dÃ¡lkovÃ½ch ovladaÄ�Ã­ch je to tlaÄ�Ã­tko se Å¡ipkou zpÄ›t.\n   * TypickÃ© je takÃ© jako HW tlaÄ�Ã­tko na Android.\n   */\n  Back: 'Back',\n  /**\n   * TlaÄ�Ã­tko pro potvrzenÃ­ zadÃ¡nÃ­.\n   * Na klÃ¡vesnicÃ­ch je to klÃ¡vesa enter.\n   * Na dÃ¡lkovÃ½ch ovladaÄ�Ã­ch je to tlaÄ�Ã­tko umÃ­stÄ›nÃ© mezi Å¡ipkami.\n   */\n  Enter: 'Enter'\n};\n\nexport default ControlButton;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Utilita pro ZIP archivy vyuÅ¾Ã­vajÃ­cÃ­ `CordovaPluginZip`.\n * StarÃ¡ se o promisifikaci nezvyklÃ©ho callback systÃ©mu.\n * ProvÃ¡dÃ­ pÅ™evod mezi univerzÃ¡lnÃ­mi cestami a cestami pro Cordovu.\n */\nclass CordovaArchiver {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {CordovaPluginZip} zip\n   */\n  constructor (zip) {\n    this.zip = zip;\n  }\n\n  /**\n   * RozbalÃ­ ZIP archiv\n   * @param {Url} zipUrl PlatformovÄ› specifickÃ¡ URL ZIP archivu, kterÃ½ se mÃ¡ rozbalit.\n   * @param {Url} toUrl PlatformovÄ› specifickÃ¡ URL sloÅ¾ky, do kterÃ© se mÃ¡ obsah archivu rozbalit.\n   * @returns {Promise.<undefined>}\n   */\n  unzip (zipUrl, toUrl) {\n    return new Promise((resolve, reject) => {\n      this.zip.unzip(zipUrl, toUrl, (result) => {\n        if (result === 0) {\n          return resolve();\n        }\n        // TODO Zjistit podrobnosti o chybÄ›.\n        // - Musel by se volat pÅ™Ã­mo Cordova exec, jehoÅ¾ callback vracÃ­ popis.\n        // - TakÃ© by chyba mohla obsahovat cestu k archivu a sloÅ¾ce.\n        // - https://github.com/MobileChromeApps/cordova-plugin-zip/blob/master/zip.js#L26\n        return reject(new Error(`Cordova unzip failure at \"${zipUrl}\".`));\n      });\n    });\n  }\n}\n\nexport default CordovaArchiver;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ErrorName from '../error/error-name';\n\n/**\n * Utilita pro souborovÃ½ systÃ©m vyuÅ¾Ã­vajÃ­cÃ­ `CordovaPluginFile`.\n * Obsahuje operace, kterÃ© systÃ©m opakovanÄ› provÃ¡dÃ­.\n * ProvÃ¡dÃ­ pÅ™evod mezi univerzÃ¡lnÃ­mi cestami a cestami pro Cordovu.\n */\nclass CordovaResolver {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {CordovaLocalFileSystem} localFileSystem\n   * @param {KiwiLighter1PromisifyFile} promisify\n   */\n  constructor (localFileSystem, promisify) {\n    this.localFileSystem = localFileSystem;\n    this.promisify = promisify;\n  }\n\n  /**\n   * ZjistÃ­ sloÅ¾ku, kterÃ¡ je umÃ­stÄ›nÃ¡ na danÃ© cestÄ›.\n   * @param {Url} url PlatformovÄ› specifickÃ¡ URL sloÅ¾ky.\n   * @returns {Promise.<CordovaDirectoryEntry>}\n   * @throws {NotFoundError} ZÃ¡znam na cestÄ› neexistuje.\n   * @throws {TypeError} Na cestÄ› nenÃ­ sloÅ¾ka, ale jinÃ½ zÃ¡znam.\n   */\n  getDirectory (url) {\n    return new Promise((resolve) => resolve(\n      this.getEntry(url)\n      .then((entry) => {\n        if (!entry.isDirectory) {\n          throw new TypeError(`Entry is not a directory at \"${url}\".`);\n        }\n        return entry;\n      })\n    ));\n  }\n\n  /**\n   * ZjistÃ­ zÃ¡znam, kterÃ½ je umÃ­stÄ›nÃ½ na danÃ© cestÄ›.\n   * @param {Url} url PlatformovÄ› specifickÃ¡ URL zÃ¡znamu.\n   * @returns {Promise.<CordovaEntry>}\n   * @throws {NotFoundError} ZÃ¡znam na cestÄ› neexistuje.\n   */\n  getEntry (url) {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.localFileSystem, 'resolveLocalFileSystemURL')(url)\n    ));\n  }\n\n  /**\n   * ZjistÃ­ soubor, kterÃ½ je umÃ­stÄ›nÃ½ na danÃ© cestÄ›.\n   * @param {Url} url PlatformovÄ› specifickÃ¡ URL souboru.\n   * @returns {Promise.<CordovaFileEntry>}\n   * @throws {NotFoundError} ZÃ¡znam na cestÄ› neexistuje.\n   * @throws {TypeError} Na cestÄ› nenÃ­ soubor, ale jinÃ½ zÃ¡znam.\n   */\n  getFile (url) {\n    return new Promise((resolve) => resolve(\n      this.getEntry(url)\n      .then((entry) => {\n        if (!entry.isFile) {\n          throw new TypeError(`Entry is not a file at \"${url}\".`);\n        }\n        return entry;\n      })\n    ));\n  }\n\n  /**\n   * ZjistÃ­, jestli na danÃ© cestÄ› existuje sloÅ¾ka.\n   * @param {Url} url PlatformovÄ› specifickÃ¡ URL sloÅ¾ky.\n   * @returns {Promise.<boolean>}\n   */\n  hasDirectory (url) {\n    return new Promise((resolve) => resolve(\n      this.getEntry(url)\n      .then((entry) => entry.isDirectory)\n      .catch((error) => {\n        if (error.name === ErrorName.NotFoundError) {\n          return false;\n        }\n        throw error;\n      })\n    ));\n  }\n\n  /**\n   * ZjistÃ­, jestli na danÃ© cestÄ› existuje zÃ¡znam.\n   * @param {Url} url PlatformovÄ› specifickÃ¡ URL zÃ¡znamu.\n   * @returns {Promise.<boolean>}\n   */\n  hasEntry (url) {\n    return new Promise((resolve) => resolve(\n      this.getEntry(url)\n      .then(() => true)\n      .catch((error) => {\n        if (error.name === ErrorName.NotFoundError) {\n          return false;\n        }\n        throw error;\n      })\n    ));\n  }\n\n  /**\n   * ZjistÃ­, jestli na danÃ© cestÄ› existuje soubor.\n   * @param {Url} url PlatformovÄ› specifickÃ¡ URL souboru.\n   * @returns {Promise.<boolean>}\n   */\n  hasFile (url) {\n    return new Promise((resolve) => resolve(\n      this.getEntry(url)\n      .then((entry) => entry.isFile)\n      .catch((error) => {\n        if (error.name === ErrorName.NotFoundError) {\n          return false;\n        }\n        throw error;\n      })\n    ));\n  }\n}\n\nexport default CordovaResolver;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport ErrorName from '../error/error-name';\nimport FileSystemPurpose from '../file/system/file-system-purpose';\n\n/**\n * Zdroj jednotek v souborovÃ©ho systÃ©mu v Cordova File API pro Ki-Wi Lighter API.\n *\n * Poskytuje lepÅ¡Ã­ rozhranÃ­ pro prÃ¡ci s jednotkami, neÅ¾ je prochÃ¡zenÃ­ Cordova File Ä�Ã­selnÃ­ku.\n * Jinak je zachovÃ¡no chovÃ¡nÃ­ Ä�Ã­selnÃ­ku,\n * jako je napÅ™. moÅ¾nost zmÄ›ny URL dle pÅ™ipojenÃ­ nebo odpojenÃ­ zaÅ™Ã­zenÃ­.\n */\nclass CordovaUnitResource {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<CordovaUnit>} CordovaUnit Konstruktor pro novÃ© jednotky.\n   * @param {CordovaFileLayout} cordovaLayout\n   */\n  constructor (CordovaUnit, cordovaLayout) {\n    // Jednotky jsou napevno definovÃ¡ny, stejnÄ› jako v Cordova File API.\n    this.unitArray = [\n      new CordovaUnit(cordovaLayout, 'applicationDirectory', 'application', FileSystemPurpose.Install),\n      new CordovaUnit(cordovaLayout, 'cacheDirectory', 'cache', FileSystemPurpose.Temp),\n      new CordovaUnit(cordovaLayout, 'dataDirectory', 'data', FileSystemPurpose.Data),\n      new CordovaUnit(cordovaLayout, 'externalCacheDirectory', 'external-cache', FileSystemPurpose.Temp),\n      new CordovaUnit(cordovaLayout, 'externalDataDirectory', 'external-data', FileSystemPurpose.Data)\n    ];\n  }\n\n  /**\n   * ZjistÃ­ jednu pÅ™ipojenou jednotku.\n   * @param {FileSystemName} name NÃ¡zev poÅ¾adovanÃ© jednotky.\n   * @returns {CordovaUnit} Jednotka.\n   * @throws {NotFoundError} Jednotka neexistuje, nebo nenÃ­ pÅ™ipojena.\n   */\n  get (name) {\n    const foundUnit = this.unitArray.find((unit) => unit.getName() === name);\n    if (isNil(foundUnit) || !foundUnit.hasUrl()) {\n      const error = new Error(`Unit \"${name}\" not found.`);\n      error.name = ErrorName.NotFoundError;\n      throw error;\n    }\n    return foundUnit;\n  }\n\n  /**\n   * ZjistÃ­ vÅ¡echny pÅ™ipojenÃ© jednotky.\n   * @returns {Array.<CordovaUnit>} Seznam jednotek.\n   */\n  getAll () {\n    return this.unitArray.filter((cordovaUnit) => cordovaUnit.hasUrl());\n  }\n}\n\nexport default CordovaUnitResource;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport ErrorName from '../error/error-name';\n\n/**\n * Jednotka v souborovÃ©ho systÃ©mu v Cordova File API pro Ki-Wi Lighter API.\n *\n * Ke kaÅ¾dÃ© jednotce je pÅ™ipojen nÃ¡zev, kterÃ½ splÅˆuje omezenÃ­ na tvorbu cesty.\n * DÃ¡le je pÅ™ipojen ÃºÄ�el jednotky, kterÃ½ je v\n * [Cordova dokumentaci](https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/index.html#where-to-store-files)\n * popsÃ¡n pouze textovÄ›.\n *\n * Jinak je zachovÃ¡no chovÃ¡nÃ­ Cordova File Ä�Ã­selnÃ­ku,\n * jako je napÅ™. moÅ¾nost zmÄ›ny URL dle pÅ™ipojenÃ­ nebo odpojenÃ­ zaÅ™Ã­zenÃ­.\n */\nclass CordovaUnit {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {CordovaFileLayout} cordovaLayout\n   * @param {string} cordovaName NÃ¡zev sloÅ¾ky odkazujÃ­cÃ­ na poloÅ¾ku Ä�Ã­selnÃ­ku v Cordova File API.\n   * @param {FileSystemName} name NÃ¡zev jednotky.\n   * @param {FileSystemPurpose} purpose ÃšÄ�el jednotky.\n   */\n  constructor (cordovaLayout, cordovaName, name, purpose) {\n    this.cordovaLayout = cordovaLayout;\n    this.cordovaName = cordovaName;\n    this.name = name;\n    this.purpose = purpose;\n  }\n\n  /**\n   * ZjistÃ­ nÃ¡zev jednotky.\n   * @returns {FileSystemName} NÃ¡zev.\n   */\n  getName () {\n    return this.name;\n  }\n\n  /**\n   * ZjistÃ­ ÃºÄ�el jednotky.\n   * @returns {FileSystemPurpose} ÃšÄ�el.\n   */\n  getPurpose () {\n    return this.purpose;\n  }\n\n  /**\n   * ZjistÃ­ platformovÄ› specifickou URL k root sloÅ¾ce jednotky.\n   * @returns {string} URL.\n   */\n  getUrl () {\n    // Kontroluje se vÅ¾dy aktuÃ¡lnÃ­ stav v Cordova API.\n    // U externÃ­ch jednotek se mÅ¯Å¾e stav pÅ™ipojenÃ­ zmÄ›nit.\n    const url = this.cordovaLayout[this.cordovaName];\n    if (isNil(url)) {\n      const error = new Error(`Unit \"${this.name}\" not found.`);\n      error.name = ErrorName.NotFoundError;\n      throw error;\n    }\n    return url;\n  }\n\n  /**\n   * ZjistÃ­, jestli mÃ¡ jednotka pÅ™idÄ›lenu platformovÄ› specifickou URL k root sloÅ¾ce.\n   *\n   * Pokud nemÃ¡ jednotka URL pÅ™idÄ›lenu, znamenÃ¡ to dle\n   * [Cordova dokumentace](https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/index.html#android-file-system-layout),\n   * Å¾e nenÃ­ pÅ™ipojena a dostupnÃ¡.\n   * @returns {boolean} PÅ™Ã­znak.\n   */\n  hasUrl () {\n    return !isNil(this.cordovaLayout[this.cordovaName]);\n  }\n}\n\nexport default CordovaUnit;\n","module.exports = \"<span><span v-text=\\\"remaining\\\"></span></span>\\n\";","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport template from './countdown-root.html';\n\n// TODO neumÃ­ reagovat na zmÄ›ny v prop end\n// TODO nenÃ­ oÅ¡etÅ™eno na nevyplnÄ›nÃ­ a nevalidnÃ­ vstupy (napÅ™. -1)\n// TODO vÅ¾dy emitovat end pÅ™i zmÄ›nÄ› v prop end\n// http://fareez.info/blog/countdown-timer-using-vuejs/\n// http://flipclockjs.com/\nexport default {\n  name: 'CountdownRoot',\n  template,\n  data () {\n    return {\n      remaining: 0\n    };\n  },\n  destroyed () {\n    this.stop();\n  },\n  methods: {\n    getDelay () {\n      return this.end - Date.now();\n    },\n    onEnd () {\n      this.endTimeout = null;\n      clearInterval(this.tickInterval);\n      this.tickInterval = null;\n      this.onTick();\n      this.$emit('end');\n    },\n    onTick () {\n      const delay = this.getDelay();\n      this.remaining = Math.max(0, Math.round(delay / 1000));\n    },\n    start () {\n      if (this.endTimeout || this.tickInterval) {\n        throw new Error('Already started.');\n      }\n      const delay = this.getDelay();\n      this.endTimeout = setTimeout(this.onEnd, delay);\n      this.tickInterval = setInterval(this.onTick, 1000);\n      this.onTick();\n    },\n    stop () {\n      clearTimeout(this.endTimeout);\n      this.endTimeout = null;\n      clearInterval(this.tickInterval);\n      this.tickInterval = null;\n    }\n  },\n  mounted () {\n    this.start();\n  },\n  props: {\n    // TODO mohl by podporovat vÃ­ce vstupnÃ­ch typÅ¯ (String, Date?)\n    end: {type: Number}\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport DriveUtil from '../drive/drive-util';\n\nimport isNil from 'lodash/isNil';\n\n/**\n * Detektor volnÃ©ho mÃ­sta na disku.\n */\nclass Detector {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {DriveManager} driveManager\n   * @returns {Detector} NovÃ¡ instance.\n   */\n  constructor (driveManager) {\n    this.driveManager = driveManager;\n  }\n\n  /**\n   * Detekuje, jestli je na disku dostatek volnÃ©ho mÃ­sta.\n   * @param {Byte} size Velikost poÅ¾adovanÃ©ho mÃ­sta.\n   * @returns {Promise.<boolean>} PÅ™Ã­znak, jestli je dostatek volnÃ©ho mÃ­sta.\n   */\n  detect (size) {\n    return new Promise((resolve) => {\n      if (!Number.isFinite(size)) {\n        throw new TypeError(`Invalid size ${size}.`);\n      }\n      return resolve(\n        this.driveManager.getInfo()\n        .then((driveInfo) => {\n          // VÃ½bÄ›r hlavnÃ­ho disku.\n          const driveUnit = DriveUtil.find(driveInfo.driveUnitArray);\n          if (isNil(driveUnit)) {\n            throw new Error(`No drive unit found.`);\n          }\n          // PorovnÃ¡nÃ­ volnÃ©ho mÃ­sta s poÅ¾adovanÃ½m.\n          return driveUnit.free >= size;\n        })\n      );\n    });\n  }\n}\n\nexport default Detector;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\n// TODO ProvÃ¡dÄ›t pÅ™Ã­mÃ© parsovÃ¡nÃ­ hodnot.\n// - NynÄ›jÅ¡Ã­ implementace je kompromisem mezi sloÅ¾itostÃ­, funkcemi, vÃ½konem\n//   a mnoÅ¾stvÃ­m kÃ³du.\n//   Implementace je jednoduchÃ¡, parsovÃ¡nÃ­ obstarÃ¡vÃ¡ knihovna.\n//   Funkcionalita je pokrytÃ¡ z vÄ›tÅ¡Ã­ Ä�Ã¡sti originÃ¡lnÃ­ DHTMLX implementace,\n//   ale jsou zde nÄ›kterÃ© problÃ©my (YY, %W, ...).\n//   VÃ½kon nenÃ­ ideÃ¡lnÃ­, kdyÅ¾ se provÃ¡dÃ­ pÅ™evod z DHTMLX do fecha formÃ¡tu.\n//   MnoÅ¾stvÃ­ kÃ³du je pÅ™ijatelnÃ© ve srovnÃ¡nÃ­ s originÃ¡lnÃ­ implemenetacÃ­.\n// - ÃšplnÄ› nÄ›jlepÅ¡Ã­ by asi bylo vytvoÅ™it univerzÃ¡lnÃ­ parser datumÅ¯,\n//   do kterÃ©ho by se v konstruktoru pÅ™edal seznam pravidel (RegExp)\n//   a transformaci (Function), kterÃ¡ by vytvoÅ™ila hodnoty pro danÃ½ Date.\n// TODO Hodnoty z fecha formÃ¡tu (napÅ™. YY, T, ..) by se nemÄ›li formÃ¡tovat.\n// - MÄ›l by se provÃ©st escape hodnot, kterÃ© nejsou ve formÃ¡tu DHTMLX.\n//   VypadÃ¡ to ale, Å¾e knihovna fecha to nepodporuje.\n// - Å lo by pÅ™idat do mappings jako poloÅ¾ky bez definovanÃ©ho dhtmlx.\n//   VÅ¡echny type mappings pak escapovat.\n// TODO Fecha nepodporuje week number\n// - %W - the ISO-8601 week number of the year. Weeks start on Monday\n// - PÅ™idat jako poloÅ¾ku s nedefinovanou fecha?\n//   PÅ™i vyhodnocenÃ­ pak provÃ©st nejprve match a bez fecha vyhodit chybu?\n/**\n * NaÄ�Ã­taÄ� datumÅ¯ dle formÃ¡tÅ¯ DXHTML.\n *\n * Zdroje:\n * - [date_format config](https://docs.dhtmlx.com/scheduler/api__scheduler_date_format_config.html)\n * - [Date Format Specification](https://docs.dhtmlx.com/scheduler/settings_format.html)\n * - [parse_date API](https://docs.dhtmlx.com/scheduler/api__scheduler_parse_date_template.html)\n */\nclass DhtmlxDateParser {\n  /**\n   * @param {Fecha} fecha\n   */\n  constructor (fecha) {\n    this.fecha = fecha;\n    this.mappings = [\n      // the year as a two-digit number (00 to 99)\n      {dhtmlx: '%y', fecha: 'YY'},\n      // the year as a four-digit number (1900-9999)\n      {dhtmlx: '%Y', fecha: 'YYYY'},\n      // the month as a number with a leading zero (01 to 12)\n      {dhtmlx: '%m', fecha: 'MM'},\n      // the month as a number without a leading zero (1 to 12)\n      {dhtmlx: '%n', fecha: 'M'},\n      // the month as an abbreviation (Jan to Dec)\n      {dhtmlx: '%M', fecha: 'MMM'},\n      // the month as a full name (January to December)\n      {dhtmlx: '%F', fecha: 'MMMM'},\n      // the day as a number with a leading zero (01 to 31)\n      {dhtmlx: '%d', fecha: 'DD'},\n      // the day as a number without a leading zero (1 to 31)\n      {dhtmlx: '%j', fecha: 'D'},\n      // the day as an abbreviation (Sun to Sat)\n      {dhtmlx: '%D', fecha: 'ddd'},\n      // the day as a full name (Sunday to Saturday)\n      {dhtmlx: '%l', fecha: 'dddd'},\n      // the hour based on the 12-hour clock (00 to 11)\n      {dhtmlx: '%h', fecha: 'hh'},\n      // the hour based on the 24-hour clock (00 to 23)\n      {dhtmlx: '%H', fecha: 'HH'},\n      // the hour based on the 12-hour clock without a leading zero (1 to 12)\n      {dhtmlx: '%g', fecha: 'h'},\n      // the hour based on the 24-hour clock without a leading zero (0 to 23)\n      {dhtmlx: '%G', fecha: 'H'},\n      // the minute as a number with a leading zero (00 to 59)\n      {dhtmlx: '%i', fecha: 'mm'},\n      // the second as a number with a leading zero (00 to 59)\n      {dhtmlx: '%s', fecha: 'ss'},\n      // displays am (from midnight until noon) and pm (from noon till midnight)\n      {dhtmlx: '%a', fecha: 'a'},\n      // displays AM (from midnight until noon) and PM (from noon till midnight)\n      {dhtmlx: '%A', fecha: 'A'}\n    ];\n  }\n\n  /**\n   * NaÄ�te datum z Å™etÄ›zce v konkrÃ©tnÃ­m formÃ¡tu.\n   * @param {string} string Å˜etÄ›zec s konkrÃ©tnÃ­m datumem\n   * @param {string} format FormÃ¡t Å™etÄ›zce s datumem dle\n   * [DHTMLX specifikace](https://docs.dhtmlx.com/scheduler/settings_format.html)\n   * @returns {Date} KonkrÃ©tnÃ­ datum naÄ�tenÃ© z Å™etÄ›zce.\n   */\n  parse (string, format) {\n    const mappedFormat = this.mappings.reduce(\n      (acc, mapping) => acc.replace(mapping.dhtmlx, mapping.fecha),\n      format\n    );\n    const jsDate = this.fecha.parse(string, mappedFormat);\n    if (isNil(jsDate)) {\n      throw new Error('String does not match the format.');\n    }\n    return jsDate;\n  }\n}\n\nexport default DhtmlxDateParser;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Frekvence opakovÃ¡nÃ­ DHTMLX Scheduler udÃ¡losti\n *\n * V dokumentaci je Ä�asto oznaÄ�ovÃ¡no jako \"type\", ale stejnÄ› je pojmenovÃ¡n\n * i celÃ½ Å™etÄ›zec \"rec_type\", takÅ¾e bylo zvoleno pojmenovÃ¡nÃ­ \"frequency\",\n * aby se pÅ™edeÅ¡lo zmatku.\n * PodobnÃ© pojmenovÃ¡nÃ­ pro tento Ä�Ã­selnÃ­k pouÅ¾Ã­vÃ¡ i iCalendar (FREQ).\n *\n * Zdroje:\n * - [type v DHTMLX Recurring Events](https://docs.dhtmlx.com/scheduler/recurring_events.html)\n * @enum {string}\n */\nconst DhtmlRecFrequency = {\n  Day: 'day',\n  Week: 'week',\n  Month: 'month',\n  Year: 'year'\n};\n\nexport default DhtmlRecFrequency;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na DHTMLX Scheduler udÃ¡losti s informacemi v iCalendar formÃ¡tu\n */\nclass DhtmlxToIcalEventFactory {\n  /**\n   * @param {Class.<DhtmlxToIcalEvent>} DhtmlxToIcalEvent\n   * @param {IcalApi} ICAL\n   * @param {DhtmlxDateParser} dateParser\n   */\n  constructor (DhtmlxToIcalEvent, ICAL, dateParser) {\n    this.DhtmlxToIcalEvent = DhtmlxToIcalEvent;\n    this.ICAL = ICAL;\n    this.dateParser = dateParser;\n  }\n\n  /**\n   * @param {string} dateFormat FormÃ¡t datumÅ¯ v DHTML udÃ¡losti\n   * @param {DhtmlxEvent} event DHTMLX udÃ¡lost\n   * @returns {DhtmlxToIcalEvent}\n   */\n  create (dateFormat, event) {\n    return new this.DhtmlxToIcalEvent(\n      this.ICAL, dateFormat, this.dateParser, event\n    );\n  }\n}\n\nexport default DhtmlxToIcalEventFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * DHTMLX Scheduler udÃ¡lost s informacemi v iCalendar formÃ¡tu\n */\nclass DhtmlxToIcalEvent {\n  /**\n   * @param {IcalApi} ICAL\n   * @param {string} dateFormat FormÃ¡t datumÅ¯ v DHTML udÃ¡losti\n   * @param {DhtmlxDateParser} dateParser\n   * @param {DhtmlxEvent} event DHTMLX udÃ¡lost\n   */\n  constructor (ICAL, dateFormat, dateParser, event) {\n    this.ICAL = ICAL;\n    this.dateFormat = dateFormat;\n    this.dateParser = dateParser;\n    this.event = event;\n  }\n\n  /**\n   * Datum konce udÃ¡losti viz. {@link DhtmlxEvent#end_date}\n   * @returns {IcalApi.Time}\n   */\n  getEndDate () {\n    const jsDate = this.dateParser.parse(this.event.end_date, this.dateFormat);\n    return this.ICAL.Time.fromJSDate(jsDate);\n  }\n\n  /**\n   * IdentifikÃ¡tor udÃ¡losti viz. {@link DhtmlxEvent#id}\n   * @returns {string}\n   */\n  getId () {\n    return this.event.id;\n  }\n\n  /**\n   * DÃ©lka udÃ¡losti jako viz. {@link DhtmlxEvent#event_length}\n   * @returns {number}\n   */\n  getLength () {\n    // TODO KdyÅ¾ by byl event_length \"\", nemÄ›lo by bÃ½t null?\n    return Number(this.event.event_length);\n  }\n\n  /**\n   * IdentifikÃ¡tor rodiÄ�ovskÃ© udÃ¡losti viz. {@link DhtmlxEvent#event_pid}\n   * @returns {string}\n   */\n  getParentId () {\n    return this.event.event_pid;\n  }\n\n  /**\n   * Parametry pro opakovÃ¡nÃ­ udÃ¡losti viz. {@link DhtmlxEvent#rec_type}\n   * @returns {string}\n   */\n  getRecType () {\n    return this.event.rec_type;\n  }\n\n  /**\n   * Datum zaÄ�Ã¡tku udÃ¡losti viz. {@link DhtmlxEvent#start_date}\n   * @returns {IcalApi.Time}\n   */\n  getStartDate () {\n    const jsDate = this.dateParser.parse(this.event.start_date, this.dateFormat);\n    return this.ICAL.Time.fromJSDate(jsDate);\n  }\n\n  /**\n   * Popis udÃ¡losti viz. {@link DhtmlxEvent#text}\n   * @returns {string}\n   */\n  getText () {\n    return this.event.text;\n  }\n}\n\nexport default DhtmlxToIcalEvent;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport groupBy from 'lodash/groupBy';\nimport isNil from 'lodash/isNil';\n\n// TODO Podpora pro moÅ¾nost volby poÄ�Ã¡teÄ�nÃ­ho dne v tÃ½dnu (WKST)\n// - V DHTMLX se nastavuje v konfiguraci jako start_on_monday.\n//   DÃ¡le pak je tu nastavenÃ­ recurring_workdays, ale to asi vliv nemÃ¡.\n// - Na druhou stranu toto nastavenÃ­ mÅ¯Å¾e ovlivnit vÃ½sledek\n//   (viz. pÅ™Ã­klad \"days generated makes a difference\" ve specifikaci).\n//   This is significant when a WEEKLY \"RRULE\" has an interval greater than 1,\n//   and a BYDAY rule part is specified.\n// - The default value is MO. => takÅ¾e nynÃ­ nenÃ­ kritickÃ©.\n// - ZvÃ¡Å¾it ale pÅ™idat jako volitelnou konfiguraci,\n//   kterÃ¡ pÅ™i MO do ics nevypÃ­Å¡e nic (kompatibilita, menÅ¡Ã­ data).\n// TODO Podpora pro DHTMLX udÃ¡losti bez recurring extension:\n// - PÅ™inÃ¡Å¡Ã­ moÅ¾nost nevyplnÄ›nÃ­ hodnot bez recurring extension.\n//   V podstatÄ› asi pÅ¯jde o to poÄ�Ã­tat nejen s \"\" ale i s undefined.\n// - Nebo pouÅ¾Ã­vat vÃ½chozÃ­ hodnoty a pak vÅ¾dy spolÃ©hat, Å¾e jsou vyplnÄ›nÃ©?\n// TODO Podpora pro Ä�asovÃ© zÃ³ny, ne jen pouze floating TZ.\n// - Toto nastavenÃ­ v DHTMLX skuteÄ�nÄ› existuje, ale na serveru se nepouÅ¾Ã­vÃ¡.\n//   Pro nÃ¡Å¡ pÅ™Ã­pad tedy zatÃ­m zbyteÄ�nÃ©.\n//   Pro univerzÃ¡lnÃ­ pÅ™evodnÃ­k DHTMLX2iCal by asi mÄ›lo bÃ½t podporovÃ¡no.\n// - server_utc, occurrence_timestamp_in_utc\n// TODO Podpora pro rÅ¯znÃ© datovÃ© typy v DHTMLX udÃ¡lostech.\n// - Dle dokumentace to vypadÃ¡, Å¾e nÄ›kterÃ© typ mohou bÃ½t kromÄ› string,\n//   takÃ© typu number konkrÃ©tnÄ›: id, event_pid a event_length.\n// - ZmÄ›nu je nutnÃ© promÃ­tnout do DhtmlxEvent.\n// - ZvÃ¡Å¾it i zmÄ›nu TrackPlanCommunicator, kde by se Ä�Ã­sla zbyteÄ�nÄ› nepÅ™evÃ¡dÄ›li\n//   na string a pak pÅ™i exportu zase zpÄ›t.\n// - https://docs.dhtmlx.com/scheduler/loading_data.html#databasestructure\n// TODO Podpora pro nastavenÃ­ include_end_by.\n// - NenÃ­ ÃºplnÄ› jistÃ©, jestli mÃ¡ nÄ›jakÃ½ vliv na formÃ¡t dat.\n// - https://docs.dhtmlx.com/scheduler/api__scheduler_include_end_by_config.html\n// TODO Podpora pro vyjÃ¡dÅ™enÃ­ konce udÃ¡losti definicÃ­ dÃ©lky jejÃ­ho trvÃ¡nÃ­.\n// - MoÅ¾nÃ¡ pÅ™idat konfiguraci Ä�Ã­selnÃ­kem:\n//   - \"EndDate\" by fungovalo jako nynÃ­.\n//   - \"Duration\" by vÅ¾dy pÅ™epoÄ�Ã­tÃ¡valo na DURATION.\n//     KdyÅ¾ je definovÃ¡n length, tak pÅ™ehrat hodnotu z nÄ›j (mimo vÃ½jimek).\n//     Jinak doby vypoÄ�Ã­tat z rozdÃ­lu DTSTART a DTEND.\n//   - \"Auto\" by pouÅ¾Ã­valo odliÅ¡nÃ© zpÅ¯soby u odliÅ¡nÃ½ch typÅ¯ udÃ¡losti dle DHTMLX.\n//     U rekurzivnÃ­ch udÃ¡lostÃ­ pouÅ¾Ã­t DURATION.\n//     U obyÄ�ejnÃ½ch udÃ¡lostÃ­ a u vyjÃ­mek pouÅ¾Ã­t DTEND.\n// - VÃ½hody:\n//   - Pokud je DURATION 1 den, nenÃ­ tÅ™eba uvÃ¡dÄ›t => menÅ¡Ã­ vÃ½stup.\n//   - JednoduÅ¡Å¡Ã­ vÃ½poÄ�et bez nutnosti pÅ™evodu na UNIX time.\n//   - ZachovÃ¡nÃ­ dÃ©lky pÅ™i zmÄ›ny DTSTART\n//     (DTEND je tÅ™eba pÅ™epoÄ�Ã­tÃ¡vat).\n// - NevÃ½hody:\n//   - V DHTMLX je event_length je definovanÃ½ pouze u recurring expansion!\n//     Tzn. buÄ� podporovat pouze tento formÃ¡t, anebo se bude muset Å™eÅ¡it\n//     fallback na parseRecurringEndDate.\n//     NejlepÅ¡Ã­m Å™eÅ¡enÃ­m asi bude vyÅ¾adovat recurring format\n//     a pokud by mÄ›kterÃ© poloÅ¾ky chybÄ›li, tak je v komunikÃ¡toru pÅ™idat.\n// TODO NevalidnÃ­ iCalendar formÃ¡t u zmÄ›nÄ›nÃ½ch instancÃ­ opakovÃ¡nÃ­:\n// - ChybovÃ© hlÃ¡Å¡enÃ­: UID value is not unique, duplicate found\n// - Lze pouÅ¾Ã­t *.ics z test38 - test42, kterÃ© chybu ve validÃ¡toru vyvolajÃ­.\n// - S nejvÄ›tÅ¡Ã­ pravdÄ›podobnostÃ­ jde o bug validÃ¡toru.\n//   Takto to totiÅ¾ dÄ›lÃ¡ nejen DHTMLX PHP, Mozilla, ale dokonce i specifikace.\n// - Bylo reportovÃ¡no https://gitlab.ki-wi.cz/light/player-lighter/-/issues/373#note_77634\n// - https://tools.ietf.org/html/rfc5546#section-4.4.8\n// - https://tools.ietf.org/html/rfc5545#section-3.8.4.4\n// - https://tools.ietf.org/html/rfc5545#section-3.8.4.7\n/**\n * ExportÃ©r z formÃ¡tu DHTMLX Scheduler do formÃ¡tu iCalendar\n *\n * Byl vytvoÅ™en na zÃ¡kladÄ› transpilace oficiÃ¡lnÃ­ho exportÃ©ru v PHP do JS\n * a nÃ¡slednÃ© optimalizace.\n * ZÃ¡kladem byl DHTMLX Scheduler verze 4.0.1, kterÃ½ se pouÅ¾Ã­vÃ¡ na serveru.\n *\n * Zdroje:\n * - [RFC 5545](https://tools.ietf.org/html/rfc5545)\n * - [Creating basic iCalendar](https://github.com/mozilla-comm/ical.js/wiki/Creating-basic-iCalendar)\n * - [DHTMLX iCal export/import](https://docs.dhtmlx.com/scheduler/ical_export_import.html)\n */\nclass DhtmlxToIcalExporter {\n  /**\n   * @param {IcalApi} ICAL\n   * @param {DhtmlxToIcalEventFactory} eventFactory\n   * @param {DhtmlxToIcalRecTypeFactory} recTypeFactory\n   * @param {IcalUtil} util\n   */\n  constructor (ICAL, eventFactory, recTypeFactory, util) {\n    this.ICAL = ICAL;\n    this.eventFactory = eventFactory;\n    this.recTypeFactory = recTypeFactory;\n    this.util = util;\n  }\n\n  /**\n   * Exportuje DHTMLX Scheduler udÃ¡losti do iCalendar.\n   * @param {Array.<DhtmlxEvent>} dhtmlxEvents DHTMLX udÃ¡losti\n   * @param {Object} [opts={}]\n   * @param {string} [opts.dateFormat] FormÃ¡t datumÅ¯ v DHTMLX udÃ¡lostech\n   * @param {Date} [opts.nowDate] AktuÃ¡lnÃ­ datum pro vytvoÅ™enÃ­ Ä�asovÃ©ho otisku\n   * @returns {null|string} ExportovanÃ½ kalendÃ¡Å™ ve formÃ¡tu iCalendar,\n   * nebo `null` pokud vstup neobsahoval Å¾Ã¡dnÃ© udÃ¡losti.\n   * To je z dÅ¯vodu, Å¾e iCalendar formÃ¡t vyÅ¾aduje pÅ™Ã­tomnost vÃ­ce jak jednÃ©\n   * udÃ¡losti v celÃ©m kalendÃ¡Å™i, ale poÄ�et DHTMLX udÃ¡lostÃ­ omezenÃ½ nenÃ­.\n   */\n  export (dhtmlxEvents, {\n    dateFormat = '%Y-%m-%d %H:%i',\n    nowDate = new Date()\n  } = {}) {\n    // VytvoÅ™Ã­ se pomocnÃ© tÅ™Ã­dy pro pÅ™evod mezi formÃ¡ty udÃ¡lostÃ­.\n    const dhtmlxToIcalEvents = dhtmlxEvents.map((dhtmlxEvent) => (\n      this.eventFactory.create(dateFormat, dhtmlxEvent)\n    ));\n    // UdÃ¡losti se pro optimalizaci vÃ½konu v jednom prÅ¯chodu rozdÄ›lÃ­ dle jejich\n    // event_pid, kterÃ© urÄ�uje, jestli jde o rodiÄ�ovskou udÃ¡lost,\n    // nebo o udÃ¡lost potomka.\n    // TODO UdÃ¡losti, kterÃ© nemajÃ­ rodiÄ�ovskou, jsou potichu zahozenÃ©.\n    // - MÃ­sto toho radÄ›ji vyhazovat chybu, nebo je pÅ™idat i tak?\n    const eventGroups = groupBy(dhtmlxToIcalEvents, (dhtmlxToIcalEvent) => (\n      dhtmlxToIcalEvent.getParentId()\n    ));\n    // UrÄ�Ã­ se seznam rodiÄ�ovskÃ½ch udÃ¡lostÃ­, kterÃ© nemajÃ­ Å¾Ã¡dnÃ© event_pid.\n    const parentEvents = eventGroups[''] || [];\n    // Bez udÃ¡lostÃ­ nelze vytvoÅ™it validnÃ­ kaledÃ¡Å™.\n    if (!parentEvents.length) {\n      return null;\n    }\n    // ÄŒas vytvoÅ™enÃ­ se pÅ™evede na iCalendar formÃ¡t.\n    // PouÅ¾Ã­vÃ¡ se pro synchronizaci zmÄ›n v kalendÃ¡Å™i pomocÃ­ DTSTAMP.\n    // TODO Hard-coded deaktivace timezone.\n    const nowIcalDate = this.ICAL.Time.fromJSDate(nowDate, true);\n    // VytvoÅ™Ã­ se novÃ½ kalendÃ¡Å™ pomocÃ­ API.\n    const vcalendar = this.util.createVCalendar({\n      // IdentifikÃ¡tor aplikace, kterÃ¡ kalendÃ¡Å™ vygenerovala.\n      // PouÅ¾Ã­vÃ¡ se formÃ¡t dle RFC 3151, jak to doporuÄ�uje RFC 5545:\n      // prefix//owner-identifier//text-class text-description//language\n      // - prefix + znamenÃ¡, Å¾e jde o registrovanÃ½ identifikÃ¡tor (dÃ­ky IDN),\n      //   kterÃ½ by mÄ›l bÃ½t jedineÄ�nÃ½ na pro vÅ¡echny vydavatele SW.\n      // - owner-identifier je v IDN formÃ¡tu, kterÃ½ vydavatele spojuje\n      //   s majitelem uvedenÃ© domÃ©ny\n      // - text-class NONSGML oznaÄ�uje, Å¾e dokument nenÃ­ v jazyce SGML.\n      // - text-description s nÃ¡zvem aplikace\n      // - language s jazykem aplikace\n      // TODO VklÃ¡dat do PRODID text-description verzi aplikace.\n      // TODO MoÅ¾nost nastavenÃ­ hodnot (nÃ¡zvy v konfiguraci, verze z package)\n      prodid: '+//IDN ki-wi.cz//NONSGML Player Lighter//EN',\n      // JednotlivÃ© skupiny DHTMLX udÃ¡lostÃ­ (rodiÄ� + jeho dÄ›ti) se transformujÃ­\n      // na iCalendar udÃ¡losti a spojÃ­ se do jednoho vÃ½slednÃ©ho seznamu.\n      subcomponents: parentEvents.reduce(\n        (acc, event) => {\n          const id = event.getId();\n          const childEvents = eventGroups[id] || [];\n          const vevents = this.parseEvents(event, childEvents, nowIcalDate);\n          acc.push(...vevents);\n          return acc;\n        },\n        []\n      ),\n      // Verze iCalendar\n      version: '2.0'\n    });\n    // Objekt kalendÃ¡Å™e se pÅ™evede na Å™etÄ›zec dle RFC 5545.\n    return vcalendar.toString();\n  }\n\n  /**\n   * NaÄ�te skupinu souvisejÃ­cÃ­ch DHTMLX Scheduler udÃ¡lostÃ­.\n   * Skupina je tvoÅ™ena jednou rodiÄ�ovskou udÃ¡lostÃ­ a libovolnÃ½m poÄ�tem udÃ¡lostÃ­\n   * potomkÅ¯, kterÃ© na rodiÄ�ovskou udÃ¡lost odkazujÃ­.\n   * UdÃ¡losti potomkÅ¯ se pouÅ¾Ã­vajÃ­ pouze u opakovanÃ½ch udÃ¡lostÃ­ a dÄ›lÃ­ se\n   * na dvÄ› skupiny: zruÅ¡enÃ­ a zmÄ›na jednÃ© instance opakovÃ¡nÃ­.\n   * @param {DhtmlxToIcalEvent} parentEvent RodiÄ�ovskÃ¡ udÃ¡lost\n   * @param {Array.<DhtmlxToIcalEvent>} childEvents UdÃ¡losti potomkÅ¯\n   * @param {IcalApi.Time} nowDate AktuÃ¡lnÃ­ datum pro vytvoÅ™enÃ­ Ä�asovÃ©ho otisku\n   * @private\n   * @returns {Array.<IcalApi.Component>}\n   */\n  parseEvents (parentEvent, childEvents, nowDate) {\n    // Pokud nemÃ¡ DHTMLX udÃ¡lost rec_type, tak jde o udÃ¡lost bez opakovÃ¡nÃ­.\n    // TODO UdÃ¡losti, kterÃ© majÃ­ rodiÄ�ovskou udÃ¡lost bez rec_type, jsou potichu zahozenÃ©.\n    // - MÃ­sto toho radÄ›ji vyhazovat chybu, nebo je pÅ™idat i tak?\n    if (parentEvent.getRecType() === '') {\n      return [this.parseOneTimeEvent(parentEvent, nowDate)];\n    }\n    // UdÃ¡losti potomkÅ¯ se pro optimalizaci vÃ½konu v jednom prÅ¯chodu rozdÄ›lÃ­\n    // dle jejich rec_type, kterÃ© urÄ�uje, jestli jde o zruÅ¡enÃ­ nebo zmÄ›nu\n    // jednÃ© instance opakovÃ¡nÃ­.\n    const eventsGroup = groupBy(childEvents, (childEvent) => (\n      childEvent.getRecType()\n    ));\n    const excludedEvents = eventsGroup.none || [];\n    const updatedEvents = eventsGroup[''] || [];\n    // VÃ½sledky vÅ¡ech typÅ¯ DHTMLX udÃ¡lostÃ­ se slouÄ�Ã­ do jednoho seznamu\n    // iCalendar udÃ¡lostÃ­.\n    // V iCalendar formÃ¡tu se zruÅ¡enÃ­ instancÃ­ opakovÃ¡nÃ­ vklÃ¡dÃ¡ do udÃ¡losti\n    // s opakovÃ¡nÃ­, takÅ¾e je nÄ›kolik DHTMLX udÃ¡lostÃ­ pÅ™evedeno na jednu\n    // iCalendar udÃ¡lost.\n    return [\n      this.parseRecurringEvent(parentEvent, excludedEvents, nowDate),\n      ...updatedEvents.map((updatedEvent) => (\n        this.parseExceptionEvent(updatedEvent, nowDate)\n      ))\n    ];\n  }\n\n  /**\n   * NaÄ�te DHTMLX Scheduler udÃ¡lost se zmÄ›nou jednÃ© instance opakovÃ¡nÃ­.\n   * @param {DhtmlxToIcalEvent} event UdÃ¡lost\n   * @param {IcalApi.Time} nowDate AktuÃ¡lnÃ­ datum pro vytvoÅ™enÃ­ Ä�asovÃ©ho otisku\n   * @private\n   * @returns {IcalApi.Component}\n   */\n  parseExceptionEvent (event, nowDate) {\n    return this.util.createVEvent({\n      endDate: event.getEndDate(),\n      // Odkaz na mÄ›nÄ›nou instanci opakovÃ¡nÃ­ je pÅ™ekvapivÄ› uloÅ¾en jako\n      // \"event_length\", kde je uloÅ¾en UNIX Ä�as [s] zaÄ�Ã¡tku instance.\n      // The \"RECURRENCE-ID\" property allows the reference to an individual\n      // instance within the recurrence set.\n      recurrenceDate: this.util.fromUnixTime(event.getLength()),\n      stamp: nowDate,\n      startDate: event.getStartDate(),\n      summary: event.getText(),\n      // The full range of calendar components specified by a\n      // recurrence set is referenced by referring to just the \"UID\"\n      // property value corresponding to the calendar component.\n      uid: event.getParentId()\n    });\n  }\n\n  /**\n   * NaÄ�te DHTMLX Scheduler jednorÃ¡zovou udÃ¡lost bez opakovÃ¡nÃ­.\n   * @param {DhtmlxToIcalEvent} event UdÃ¡lost\n   * @param {IcalApi.Time} nowDate AktuÃ¡lnÃ­ datum pro vytvoÅ™enÃ­ Ä�asovÃ©ho otisku\n   * @private\n   * @returns {IcalApi.Component}\n   */\n  parseOneTimeEvent (event, nowDate) {\n    return this.util.createVEvent({\n      endDate: event.getEndDate(),\n      stamp: nowDate,\n      startDate: event.getStartDate(),\n      summary: event.getText(),\n      uid: event.getId()\n    });\n  }\n\n  /**\n   * NaÄ�te datum konce opakovanÃ© udÃ¡losti.\n   *\n   * V iCalendar formÃ¡tu mÃ¡ bÃ½t u opakovanÃ© udÃ¡lost datum konce prvnÃ­ instance.\n   * V DHTML formÃ¡tu je tam naopak datum konce poslednÃ­ instance.\n   * Proto je nutnÃ© pÅ™evÃ©st pÅ™epoÄ�et.\n   *\n   * Jsou zde 2 zpÅ¯soby jak definovat konec udÃ¡losti:\n   * - definovÃ¡nÃ­m data ukonÄ�enÃ­ udÃ¡losti (`end_date`, `DTEND`)\n   * - definovÃ¡nÃ­m doby trvÃ¡nÃ­ udÃ¡losti (`event_length`, `DURATION`)\n   *\n   * iCalendar formÃ¡t dovoluje pouÅ¾Ã­t libovolnÃ½ zpÅ¯sob, ale vÅ¾dy prÃ¡vÄ› jeden.\n   * DHTMLX formÃ¡t nÄ›kdy informace duplikuje, nÄ›kdy nenÃ­ dostupnÃ©\n   * `end_date` (u opakovanÃ½ch udÃ¡lostÃ­) a jindy zase nenÃ­ dostupnÃ¡\n   * `event_length` (bez recurring extension).\n   *\n   * Pro jednotnÃ½ pÅ™Ã­stup ke vÅ¡em udÃ¡lostem a shodnÄ› s oficiÃ¡lnÃ­m PHP exportÃ©rem\n   * a GUI kalendÃ¡Å™em bylo provedeno rozhodnutÃ­, Å¾e se konec udÃ¡losti bude\n   * definovat pomocÃ­ data ukonÄ�enÃ­.\n   *\n   * Zdroje:\n   * - [DHTMLX auto_end_date](https://docs.dhtmlx.com/scheduler/api__scheduler_auto_end_date_config.html)\n   * @param {number} length\n   * @param {IcalApi.Time} startDate\n   * @private\n   * @returns {IcalApi.Time}\n   */\n  parseRecurringEndDate (length, startDate) {\n    const endUnixTime = startDate.toUnixTime() + length;\n    return this.util.fromUnixTime(endUnixTime);\n  }\n\n  /**\n   * NaÄ�te DHTMLX Scheduler udÃ¡lost s opakovÃ¡nÃ­m.\n   * @param {DhtmlxToIcalEvent} parentEvent\n   * @param {Array.<DhtmlxToIcalEvent>} excludedEvents\n   * @param {IcalApi.Time} nowDate AktuÃ¡lnÃ­ datum pro vytvoÅ™enÃ­ Ä�asovÃ©ho otisku\n   * @private\n   * @returns {IcalApi.Component}\n   */\n  parseRecurringEvent (parentEvent, excludedEvents, nowDate) {\n    // VytvoÅ™Ã­ se pomocnÃ¡ tÅ™Ã­da pro pÅ™evod mezi formÃ¡ty opakovÃ¡nÃ­.\n    const recType = this.recTypeFactory.create(parentEvent);\n    const recurStartDate = parentEvent.getStartDate();\n    const length = parentEvent.getLength();\n    const recur = recType.getRecur();\n    // PÅ™epoÄ�et data zaÄ�Ã¡tku dle odliÅ¡nostÃ­ iCalendar formÃ¡tu\n    const firstStartDate = this.parseRecurringStartDate(recur, recurStartDate);\n    return this.util.createVEvent({\n      // PÅ™epoÄ�et data konce dle odliÅ¡nostÃ­ iCalendar formÃ¡tu\n      endDate: this.parseRecurringEndDate(length, firstStartDate),\n      // DHTMLX udÃ¡losti zruÅ¡enÃ­ instance opakovÃ¡nÃ­ se transformujÃ­ na EXDATE.\n      // Odkaz na mÄ›nÄ›nou instanci opakovÃ¡nÃ­ je pÅ™ekvapivÄ› uloÅ¾en jako\n      // \"event_length\", kde je uloÅ¾en UNIX Ä�as [s] zaÄ�Ã¡tku instance.\n      excludedDates: excludedEvents.map((event) => (\n        this.util.fromUnixTime(event.getLength())\n      )),\n      // TransformovanÃ¡ konfigurace opakovÃ¡nÃ­\n      recur,\n      stamp: nowDate,\n      startDate: firstStartDate,\n      summary: parentEvent.getText(),\n      uid: parentEvent.getId()\n    });\n  }\n\n  /**\n   * NaÄ�te datum zaÄ�Ã¡tku opakovanÃ© udÃ¡losti.\n   *\n   * iCalendar formÃ¡t vyÅ¾aduje, aby bylo u opakovanÃ© udÃ¡losti nastaveno\n   * na datum prvnÃ­ instance.\n   * DHTMLX formÃ¡t poÅ™adavky specifikuje podobnÄ›, ale ve skuteÄ�nosti se mnohdy\n   * objevÃ­ datum, na kterÃ© uÅ¾ivatel kliknul, neÅ¾ datum zaÄ�Ã¡tku prvnÃ­ instance.\n   * Proto je nutnÃ© pÅ™evÃ©st pÅ™epoÄ�et tak, jak to dÄ›lÃ¡ i oficiÃ¡lnÃ­ PHP exportÃ©r.\n   * NarozdÃ­l od nÄ›j, je zde ale k vÃ½poÄ�tu pouÅ¾ito ICAL Recur API.\n   * @param {IcalApi.Recur} recur\n   * @param {IcalApi.Time} recurStartDate\n   * @private\n   * @returns {IcalApi.Time}\n   */\n  parseRecurringStartDate (recur, recurStartDate) {\n    // PomocÃ­ iterÃ¡toru se nalezne prvnÃ­ vÃ½skyt udÃ¡losti od zaÄ�Ã¡tku opakovÃ¡nÃ­.\n    const iterator = recur.iterator(recurStartDate);\n    const firstDate = iterator.next();\n    // PÅ™i nenalezenÃ­ prvnÃ­ho vÃ½skytu se pouÅ¾ije originÃ¡lnÃ­ datum zaÄ�Ã¡tku.\n    if (isNil(firstDate)) {\n      return recurStartDate;\n    }\n    // VrÃ¡cenÃ­ datumu prvnÃ­ho vÃ½skytu.\n    return firstDate;\n  }\n}\n\nexport default DhtmlxToIcalExporter;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na DHTMLX Scheduler rec_type s informacemi v iCalendar formÃ¡tu\n */\nclass DhtmlxToIcalRecTypeFactory {\n  /**\n   * @param {Class.<DhtmlxToIcalRecType>} DhtmlxToIcalRecType\n   * @param {IcalApi} ICAL\n   * @param {IcalUtil} util\n   */\n  constructor (DhtmlxToIcalRecType, ICAL, util) {\n    this.DhtmlxToIcalRecType = DhtmlxToIcalRecType;\n    this.ICAL = ICAL;\n    this.util = util;\n  }\n\n  /**\n   * @param {DhtmlxEvent} event\n   * @returns {DhtmlxToIcalRecType}\n   */\n  create (event) {\n    return new this.DhtmlxToIcalRecType(this.ICAL, event, this.util);\n  }\n}\n\nexport default DhtmlxToIcalRecTypeFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport DhtmlRecFrequency from '../dhtmlx-rec-frequency';\nimport IcalFreq from '../../ical/ical-freq';\n\n// TODO LepÅ¡Ã­ parsovÃ¡nÃ­ `rec_type` formÃ¡tu:\n// - VyÄ�lenit do samostatnÃ© tÅ™Ã­dy, nevhodnÃ© vÃ½poÄ�ty v konstruktoru.\n// - MoÅ¾nost lazy-parsovÃ¡nÃ­, aÅ¾ kdyÅ¾ je hodnota poÅ¾adovÃ¡na.\n// - MoÅ¾nost pouÅ¾itÃ­ regex mÃ­sto 2x split.\n//   AktuÃ¡lnÃ­ implementace je kompromisem mezi sloÅ¾itostÃ­ implementace\n//   a dodÅ¾enÃ­m ne ÃºplnÄ› jasnÄ› specifikovanÃ©ho DHTMLX rec_type formÃ¡tu.\n//   Takto hodnotu parsuje vzorovÃ½ PHP.\n// - Kontrolovat validitu naparsovanÃ½ch hodnot (NaN, null, whitespace).\n// TODO Opravdu podporovat i poloÅ¾ky days bez hodnot?\n// - NedÃ¡vÃ¡ moc smysl, ale ve vÃ½stupu z PHP pÅ™edvodu (z iCalendar do DHTMLX)\n//   se obÄ�as objevuje vÄ�etnÄ› znakÅ¯ jako `\\r` apod.\n// TODO LepÅ¡Ã­ pÅ™Ã­stup k parsovÃ¡nÃ­m hodnot dle typu / frekvence opakovÃ¡nÃ­.\n// - FormÃ¡t DHTMLX obecnÄ› vychÃ¡zÃ­ z typu (day, week, ...) a dle toho se pouÅ¾ijÃ­\n//   vybranÃ© hodnoty a ostatnÃ­ se ignorujÃ­.\n//   MoÅ¾nÃ¡ by bylo lepÅ¡Ã­ postavit parsovÃ¡nÃ­ na tÄ›chto typech a pro kaÅ¾dÃ½ typ\n//   vracet odliÅ¡nÃ½ ICAL.Recur objekt pouze s hodnotamy, kterÃ© jsou pro danÃ½\n//   typ platnÃ©.\n// - NynÃ­ se parsuje \"vÅ¡e v jednom\" a vÃ½stup se urÄ�uje spÃ­Å¡e podle pÅ™Ã­tomnosti\n//   jednotlivÃ½ch parametrÅ¯.\n// TODO Bug v ical.js s DTSTART a BY*\n// - https://github.com/mozilla-comm/ical.js/issues/434\n// - Projevuje se napÅ™. u test18:\n//   Pokud se nepÅ™idÃ¡ BYMONTH, tak se vÃ½poÄ�ty neprovÃ¡dÄ›jÃ­ korektnÄ›.\n//   PrvnÃ­ vÃ½skyt se udÃ¡vÃ¡: 20210108T000000\n// - PÅ™i vÃ½poÄ�tu \"z hlavy\" a takÃ© v Thunderbirdu by ale poÄ�Ã¡teÄ�nÃ­ datum\n//   mÄ›lo bÃ½t 20200814T000000.\n// - Po explicitnÃ­m pÅ™idÃ¡nÃ­ BYMONTH je jiÅ¾ vÅ¡e v poÅ™Ã¡dku.\n// - ObecnÄ› jde o to, Å¾e pÅ™i roÄ�nÃ­m opakovÃ¡nÃ­ bez BYMONTH by se mÄ›la tato\n//   hodnota pÅ™evzÃ­t z mÄ›sÃ­ce u DTSTART, ale mÃ­sto toho se to interpretuje\n//   jako leden (1. mÄ›sÃ­c).\n// - Jako hotfix jsou zatÃ­m pÅ™idÃ¡ny explicitnÃ­ definice BYMONTH\n//   a BYMONTHDAY, i kdyÅ¾ by tam vÅ¯bec nemuseli bÃ½t.\n//   DÃ­ky tomu je vÃ½stup zbyteÄ�nÄ› velikÃ½.\n//   TakÃ© se provÃ¡dÄ›jÃ­ zbyteÄ�nÄ› sloÅ¾itÃ© vÃ½poÄ�ty, hlavnÄ› v getByMonthDay.\n/**\n * DHTMLX Scheduler rec_type s informacemi v iCalendar formÃ¡tu\n *\n * Zdroje:\n * - [DHTMLX Recurring Events](https://docs.dhtmlx.com/scheduler/recurring_events.html)\n * - [iCalendar Recurrence Rule](https://tools.ietf.org/html/rfc5545#section-3.3.10)\n */\nclass DhtmlxToIcalRecType {\n  // TODO Bug v eslint\n  // eslint-disable-next-line jsdoc/require-returns\n  /**\n   * @param {IcalApi} ICAL\n   * @param {DhtmlxEvent} event\n   * @param {IcalUtil} util\n   */\n  constructor (ICAL, event, util) {\n    const [base, extra] = event.getRecType().split('#');\n    const [type, count, day, count2, daysString] = base.split('_');\n    const days = daysString.split(',').filter((string) => string !== '');\n    this.ICAL = ICAL;\n    this.count = count;\n    this.count2 = count2;\n    this.day = day;\n    this.days = days;\n    this.extra = extra;\n    this.type = type;\n    this.event = event;\n    this.util = util;\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st BYDAY z iCalendar RRULE.\n   * Jde o znaÄ�nÄ› omezenou funkcionalitu, neÅ¾ podporuje iCalendar.\n   * U tÃ½dennÃ­ho plÃ¡novÃ¡ni je definovÃ¡n seznam dnÅ¯, ale bez \"count2\".\n   * U mÄ›sÃ­Ä�nÃ­ho a roÄ�nÃ­ho plÃ¡novÃ¡nÃ­ je zde jen jeden den a \"count2\".\n   * TakÃ© nepodporuje zÃ¡pornÃ© hodnoty jako iCalendar.\n   * @returns {Array.<string>}\n   */\n  getByDay () {\n    const {day, count2} = this;\n    if (day === '' || count2 === '') {\n      return this.days.map((d) => this.util.parseRecurDay(Number(d)));\n    }\n    return [`${count2}${this.util.parseRecurDay(Number(day))}`];\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st BYMONTH z iCalendar RRULE.\n   * @returns {Array.<number>}\n   */\n  getByMonth () {\n    const {type} = this;\n    if (type !== DhtmlRecFrequency.Year) {\n      return [];\n    }\n    return [this.event.getStartDate().month];\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st BYMONTHDAY z iCalendar RRULE.\n   * @returns {Array.<number>}\n   */\n  getByMonthDay () {\n    const {type} = this;\n    if (type !== DhtmlRecFrequency.Month && type !== DhtmlRecFrequency.Year) {\n      return [];\n    }\n    if (this.getByDay().length) {\n      return [];\n    }\n    return [this.event.getStartDate().day];\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st COUNT z iCalendar RRULE.\n   * @returns {number}\n   */\n  getCount () {\n    const {extra} = this;\n    if (extra === '' || extra === 'no') {\n      return null;\n    }\n    return Number(extra);\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st FREQ z iCalendar RRULE.\n   * @returns {IcalFreq}\n   */\n  getFreq () {\n    switch (this.type) {\n      case DhtmlRecFrequency.Day:\n        return IcalFreq.Daily;\n      case DhtmlRecFrequency.Week:\n        return IcalFreq.Weekly;\n      case DhtmlRecFrequency.Month:\n        return IcalFreq.Monthly;\n      case DhtmlRecFrequency.Year:\n        return IcalFreq.Yearly;\n      default:\n        throw new RangeError('Unknown type');\n    }\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st INTERVAL z iCalendar RRULE.\n   * @returns {number}\n   */\n  getInterval () {\n    // TODO KdyÅ¾ by byl count \"\", nemÄ›lo by bÃ½t null?\n    return Number(this.count);\n  }\n\n  /**\n   * ZjistÃ­ celÃ© iCalendar RRULE.\n   * @returns {IcalApi.Recur}\n   */\n  getRecur () {\n    const opts = {\n      count: this.getCount(),\n      freq: this.getFreq(),\n      interval: this.getInterval(),\n      until: this.getUntil()\n    };\n    // ICAL nedokÃ¡Å¾e ignorovat prÃ¡zdnÃ© pole v byday.\n    const byDay = this.getByDay();\n    if (byDay.length) {\n      opts.byday = byDay;\n    }\n    // ICAL nedokÃ¡Å¾e ignorovat prÃ¡zdnÃ© pole v bymonthday.\n    const byMonthDay = this.getByMonthDay();\n    if (byMonthDay.length) {\n      opts.bymonthday = byMonthDay;\n    }\n    // ICAL nedokÃ¡Å¾e ignorovat prÃ¡zdnÃ© pole v bymonth.\n    const byMonth = this.getByMonth();\n    if (byMonth.length) {\n      opts.bymonth = byMonth;\n    }\n    return new this.ICAL.Recur(opts);\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st UNTIL z iCalendar RRULE.\n   * @returns {IcalApi.Time}\n   */\n  getUntil () {\n    // Pokud je definovÃ¡n poÄ�et opakovÃ¡nÃ­, nebo je poÄ�et neomezenÃ½,\n    // tak se UNTIL nesmÃ­ vypsat, jelikoÅ¾ by nebylo jasnÃ©, kterÃ¡ z hodnot platÃ­.\n    if (this.extra !== '') {\n      return null;\n    }\n    // Bez poÄ�tu opakovÃ¡nÃ­ se pouÅ¾ije hodnota v \"end_date\".\n    return this.event.getEndDate();\n  }\n}\n\nexport default DhtmlxToIcalRecType;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO Unit testy.\n/**\n * Poskytovatel zdrojÅ¯ pro zobrazovÃ¡nÃ­ HTML img elementÅ¯..\n * Implementuje nÃ¡vrhovÃ½ vzor Factory pro tvorbu zdrojÅ¯.\n * Pro kaÅ¾dÃ© zapÅ¯jÄ�enÃ­ je vytvoÅ™enÃ½ novÃ½ zdroj.\n * MÃ­sto vracenÃ­ zdroje ho vÅ¾dy smaÅ¾e.\n * @implements {ViewerSourceCreator}\n */\nclass DivViewerSourceCreator {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {PoolFactory} poolFactory\n   * @param {ViewerSourceFactory} sourceFactory TovÃ¡rna na zdroje, kterÃ© se poskytujÃ­.\n   */\n  constructor (poolFactory, sourceFactory) {\n    this.pool = poolFactory.create(sourceFactory);\n    this.sourceFactory = sourceFactory;\n  }\n\n  /** @inheritdoc */\n  delete (source) {\n    return new Promise((resolve) => resolve(\n      this.pool.delete(source)\n    ));\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    this.pool.destroy();\n  }\n\n  /** @inheritdoc */\n  getLent () {\n    return this.pool.getLent();\n  }\n\n  /** @inheritdoc */\n  getMax () {\n    return this.pool.getMax();\n  }\n\n  /** @inheritdoc */\n  lend (parentEl, scheduleInfo) {\n    return new Promise((resolve) => {\n      // NastavÃ­ se rodiÄ�ovskÃ½ element tovÃ¡rny, aby do nÄ›j vytvÃ¡Å™ela novÃ© zdroje.\n      // Nastavuje se dopÅ™edu, aby byl rodiÄ�ovskÃ½ element dostupnÃ½ v okamÅ¾iku plnÄ›nÃ­ bazÃ©nu.\n      this.sourceFactory.setParentEl(parentEl);\n      const source = this.pool.lend();\n      source.setParentEl(parentEl);\n      return resolve(source);\n    });\n  }\n\n  /** @inheritdoc */\n  receive (source) {\n    return new Promise((resolve) => resolve(\n      this.pool.delete(source)\n    ));\n  }\n\n  /** @inheritdoc */\n  replace () {\n    // NenÃ­ tÅ™eba nic provÃ©st.\n    return Promise.resolve();\n  }\n}\n\nexport default DivViewerSourceCreator;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO Unit testy.\n/**\n * TovÃ¡rna na zdroje funkcionalit v podobÄ› HTML image elementÅ¯.\n * @implements {ViewerSourceFactory}\n */\nclass DivViewerSourceFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<DivViewerSource>} DivViewerSource Konstruktor zdroje obrÃ¡zkovÃ©ho elementu.\n   * @param {ViewerFrameFactory} frameFactory\n   */\n  constructor (DivViewerSource, frameFactory) {\n    this.DivViewerSource = DivViewerSource;\n    this.frameFactory = frameFactory;\n    this.parentEl = null;\n  }\n\n  /** @inheritdoc */\n  create () {\n    return new this.DivViewerSource(this.frameFactory, this.parentEl);\n  }\n\n  /** @inheritdoc */\n  delete (source) {\n    return source.destroy();\n  }\n\n  /** @inheritdoc */\n  setParentEl (parentEl) {\n    this.parentEl = parentEl;\n  }\n}\n\nexport default DivViewerSourceFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\n\n// TODO Unit testy.\n/**\n * Zdroj zobrazovÃ¡nÃ­ mÃ©diÃ­ v podobÄ› HTML image elementu.\n * ZdrojovÃ½ element je obalenÃ½ do rÃ¡mujÃ­cÃ­ho div a s nÃ­m vloÅ¾en na urÄ�enÃ© mÃ­sto do DOM.\n * @implements {ViewerSource}\n */\nclass DivViewerSource {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {ViewerFrameFactory} frameFactory\n   * @param {HTMLElement} parentEl RodiÄ�ovskÃ½ element, urÄ�enÃ½ pro vklÃ¡dÃ¡nÃ­ elementÅ¯ zdroje.\n   */\n  constructor (frameFactory, parentEl) {\n    if (!isObject(parentEl)) {\n      // ZakÃ¡zÃ¡no vytvÃ¡Å™enÃ­ bez rodiÄ�ovskÃ©ho elementu, jinak nemÃ¡ pÅ™Ã­prava objektÅ¯ v bazÃ©nu smysl.\n      throw new TypeError(`Invalid parent element ${parentEl}.`);\n    }\n    // TODO VyÄ�lenit vytvoÅ™enÃ­ elementÅ¯ do samostatnÃ© public metody, neÅ¾ je mÃ­t v konstruktoru?\n    const frame = frameFactory.create();\n    const frameEl = frame.getEl();\n    const el = document.createElement('div');\n    frameEl.appendChild(el);\n    parentEl.appendChild(frameEl);\n    this.el = el;\n    this.frame = frame;\n    this.parentEl = parentEl;\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // UvolnÄ›nÃ­ img elementu zruÅ¡enÃ­m jeho src.\n    this.el.removeAttribute('src');\n    // OdebrÃ¡nÃ­ frame elementu z DOM.\n    const frameEl = this.frame.getEl();\n    this.parentEl.removeChild(frameEl);\n  }\n\n  /** @inheritdoc */\n  getEl () {\n    const {el} = this;\n    if (isNil(el)) {\n      throw new TypeError(`Missing element.`);\n    }\n    return el;\n  }\n\n  /** @inheritdoc */\n  getFrame () {\n    return this.frame;\n  }\n\n  /** @inheritdoc */\n  setParentEl (parentEl) {\n    if (!isObject(parentEl)) {\n      throw new TypeError(`Invalid parent element ${parentEl}.`);\n    }\n    if (parentEl === this.parentEl) {\n      // Pokud se rodiÄ�ovskÃ½ element nezmÄ›nÃ­, tak se pÅ™esun neprovÃ¡dÃ­.\n      return;\n    }\n    // PÅ™esun elementu do novÃ©ho rodiÄ�e.\n    // TODO PlatformovÄ› specifickÃ© prolÃ­naÄ�e. Pro Samsung moÅ¾no pÅ™idat omezenÃ­ nebo oÅ¡etÅ™enÃ­ pÅ™esunu.\n    // - PÅ™Ã­klad speciÃ¡lnÃ­ implementace, kterÃ¡ by nedovolila pÅ™esun elementu?\n    const frameEl = this.frame.getEl();\n    parentEl.appendChild(frameEl);\n    this.parentEl = parentEl;\n  }\n}\n\nexport default DivViewerSource;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport noop from 'lodash/noop';\nimport isNil from 'lodash/isNil';\n\nimport Cleaner from '../cleaner/cleaner';\n\n// TODO #84 PÅ™eruÅ¡enÃ­ stahovÃ¡nÃ­.\n// - Downloader#cancel()\n// - ZruÅ¡Ã­ probÃ­hajÃ­cÃ­ stahovÃ¡nÃ­.\n// - Zde by se mÄ›lo pokusit pÅ™eruÅ¡it aktuÃ¡lnÃ­ stahovÃ¡nÃ­. KaÅ¾dopÃ¡dnÄ› pÅ™eruÅ¡it sÃ©rii.\n// - NemÄ›l by bÃ½t vstupem downloadPromise, pokud by bylo v budoucnu vÃ­ce paralelnÃ­ch stahovÃ¡nÃ­?\n// - MoÅ¾nÃ¡ inspirace rozhranÃ­m $timeout: https://docs.angularjs.org/api/ng/service/$timeout\n/**\n * StahovaÄ� binÃ¡rnÃ­ch souborÅ¯.\n *\n * ![Diagram tÅ™Ã­d](./core/downloader/downloader-class.doc.png)\n *\n * ![Diagram aktivit](./core/downloader/downloader-activity.doc.png)\n * @implements {EventBus}\n */\nclass Downloader {\n  /**\n   * VytvoÅ™Ã­ stahovaÄ� binÃ¡rnÃ­ch souborÅ¯.\n   * @param {Object} config Konfigurace aplikace.\n   * @param {Detector} detector\n   * @param {Store} primaryStore HlavnÃ­ datovÃ½ sklad ve kterÃ©m jsou uloÅ¾eny binÃ¡rnÃ­ soubory a pÅ™ehrÃ¡vanÃ½ obsah.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   * @returns {Downloader} NovÃ½ instalÃ¡tor zaÅ™Ã­zenÃ­.\n   */\n  constructor (config, detector, primaryStore, session, viewerRegistry) {\n    const cleaner = new Cleaner(primaryStore, session);\n    this.cleaner = cleaner;\n    this.config = config;\n    this.detector = detector;\n    this.downloadPromise = Promise.resolve();\n    this.downloading = false;\n    this.viewerRegistry = viewerRegistry;\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    this.primaryStore = primaryStore;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onContent = this.onContent.bind(this);\n    this.onError = this.onError.bind(this);\n    // NaslouchÃ¡nÃ­ udÃ¡lostem.\n    cleaner.on('content', this.onContent);\n    cleaner.on('error', this.onError);\n  }\n\n  /**\n   * UvolnÃ­ vÅ¡echny zdroje pro garbage collection.\n   * @returns {undefined} Nic.\n   */\n  destroy () {\n    // TODO #84 PÅ™eruÅ¡enÃ­ stahovÃ¡nÃ­.\n    // - PÅ¯jde synchronnÄ›? Asi ne.\n    // - MinimÃ¡lnÄ› volat cancel.\n    const {cleaner} = this;\n    cleaner.off('content', this.onContent);\n    cleaner.off('error', this.onError);\n  }\n\n  /**\n   * StÃ¡hne binÃ¡rnÃ­ soubory k novÃ©mu obsahu.\n   * @param {ContentInfo} contentInfo Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n   * @returns {Promise.<Array.<Asset>>} Seznam identifikÃ¡torÅ¯ staÅ¾enÃ½ch asset.\n   */\n  download (contentInfo) {\n    return new Promise((resolve) => {\n      if (this.downloading) {\n        throw new Error('Download already in progress');\n      }\n      // ZablokovÃ¡nÃ­ dalÅ¡Ã­ch stahovÃ¡nÃ­.\n      this.downloading = true;\n      // StaÅ¾enÃ­ binÃ¡rnÃ­ch dat k vybranÃ½m mÃ©diÃ­m a aktualizace datovÃ½ch ÃºloÅ¾iÅ¡Å¥.\n      const downloadPromise = this.fetch(contentInfo);\n      // OÅ¡etÅ™enÃ­ ukonÄ�enÃ­ stahovÃ¡nÃ­ pro internÃ­ reakce na nÄ›j.\n      this.downloadPromise = (\n        downloadPromise.catch(noop)\n        .then(() => {\n          // OdblokovÃ¡nÃ­ dalÅ¡Ã­ch stahovÃ¡nÃ­.\n          this.downloading = false;\n        })\n      );\n      return resolve(downloadPromise);\n    });\n  }\n\n  /**\n   * StÃ¡hne binÃ¡rnÃ­ soubory k novÃ©mu obsahu bez oÅ¡etÅ™enÃ­ paralelnÃ­ho pÅ™Ã­stupu.\n   * @param {ContentInfo} contentInfo Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {Promise.<Array.<Asset>>} Seznam staÅ¾enÃ½ch assetÅ¯.\n   */\n  fetch (contentInfo) {\n    const {defaultSize} = this.config.device.downloader;\n    // TODO #84 ZvÃ¡Å¾it, jak signalizovat pÅ™eruÅ¡enÃ­ stahovÃ¡nÃ­:\n    // - MÃ­sto assetIdArray vracet null.\n    //   - Ignorovat rozestahovanÃ© soubory?\n    // - Vracet assetIdArray a pÅ™Ã­znak pÅ™eruÅ¡enÃ­.\n    //   - RodiÄ� rozhodne co se soubory pÅ™i pÅ™eruÅ¡enÃ­.\n    return (\n      // VÃ½bÄ›r mÃ©diÃ­ ke staÅ¾enÃ­.\n      // TODO #84 Stahovat pouze uÅ¾iteÄ�nÃ© soubory:\n      // - IdeÃ¡lnÄ› pouze z hlavnÃ­ho tasku a z jeho mÃ©diÃ­.\n      // - MoÅ¾nost pouÅ¾Ã­t ScheduleManager#findTask().\n      // - Zohlednit jak se bude stahovat obsah s vÃ­ce plÃ¡novanÃ½mi Ãºkoly.\n      contentInfo.mediumArray.map((medium) => ({\n        medium,\n        viewerType: this.viewerRegistry.find(medium.type)\n      }))\n      .filter(({viewerType}) => viewerType && viewerType.isOfflineable())\n      // SÃ©riovÃ© stahovÃ¡nÃ­ souborÅ¯ pro jednotlivÃ¡ mÃ©dia.\n      .reduce(\n        (accumulator, {medium, viewerType}) => accumulator.then((assetArray) => (\n          // NalezenÃ­, nebo vytvoÅ™enÃ­ souboru, kterÃ½ patÅ™Ã­ k mÃ©diu.\n          new Promise((resolve) => {\n            // Nejprve se urÄ�Ã­, jakÃ½ identifikÃ¡tor by mÄ›l soubor mÃ©dia.\n            const {primaryStore} = this;\n            const resource = primaryStore.definitions.asset;\n            const adapter = resource.getAdapter(resource);\n            const assetAttrs = {checksum: medium.checksum, url: medium.url};\n            const assetOptions = {extract: viewerType.isExtractable()};\n            const assetId = adapter.getId(resource, assetAttrs, assetOptions);\n            // VyhledÃ¡nÃ­ souboru, kterÃ½ patÅ™Ã­ k mÃ©diu.\n            const asset = primaryStore.get('asset', assetId);\n            if (!isNil(asset)) {\n              // Pokud jiÅ¾ soubor existuje, tak se pouÅ¾ije.\n              return resolve(asset);\n            }\n            // Pokud soubor neexistuje, tak se stÃ¡hne a vytvoÅ™Ã­.\n            return resolve(\n              // Detekce dostateÄ�nÃ©ho mÃ­sta k uloÅ¾enÃ­ souboru.\n              // ZatÃ­m se pouÅ¾Ã­vÃ¡ pouze vÃ½chozÃ­ hodnota z konfigurace.\n              // NezjiÅ¡Å¥uje se skuteÄ�nÃ¡ velikost souboru.\n              this.detector.detect(defaultSize)\n              .then((detected) => {\n                if (detected) {\n                  // Pokud je dostatek mÃ­sta, lze soubor stÃ¡hnout.\n                  return Promise.resolve();\n                }\n                return (\n                  // Pokud nenÃ­ dostatek mÃ­sta, provede se pokus o jeho uvolnÄ›nÃ­.\n                  this.cleaner.clean(contentInfo)\n                  .then(() => this.detector.detect(defaultSize))\n                  .then((detectedAfterClean) => {\n                    if (!detectedAfterClean) {\n                      // Pokud ani po uvolnÄ›nÃ­ nenÃ­ dostatek mÃ­sta, nelze soubor stÃ¡hnout.\n                      throw Error(`Unable to clean space for medium ${medium}.`);\n                    }\n                    // Uvolnil se dostatek mÃ­sta, soubor lze stÃ¡hnout.\n                    return Promise.resolve();\n                  })\n                );\n              })\n              // PersistentnÃ­ uloÅ¾enÃ­ souboru do hlavnÃ­ho datovÃ©ho skladu.\n              .then(() => primaryStore.create('asset', assetAttrs, assetOptions))\n            );\n          })\n          // NavÃ¡zÃ¡nÃ­ mÃ©dia na vytvoÅ™enÃ½ soubor.\n          .then((asset) => {\n            // PÅ™Ã­prava napojenÃ­ mÃ©dia v novÃ©m obsahu na asset, kterÃ½ byl staÅ¾en.\n            // NapojenÃ­ se aktivuje aÅ¾ v okamÅ¾iku vloÅ¾enÃ­ novÃ©ho obsahu do hlavnÃ­ho datovÃ©ho skladu.\n            contentInfo.store.inject('medium', {assetId: asset.id, id: medium.id});\n            // ÃšspÄ›Å¡nÄ› staÅ¾enÃ½ asset se pÅ™idÃ¡ do vÃ½stupu.\n            assetArray.push(asset);\n          })\n          // TODO #84 Zde by se mÄ›lo kontrolovat, jestli nebylo vyÅ¾Ã¡dÃ¡no pÅ™eruÅ¡enÃ­.\n          // Pokud nÄ›co selÅ¾e, tak se pÅ™eskoÄ�Ã­ na dalÅ¡Ã­ mÃ©dium.\n          .catch((error) => {\n            this.emitter.emit('error', error);\n          })\n          // PÅ™edÃ¡nÃ­ akumulovanÃ½ch vÃ½sledkÅ¯ pro dalÅ¡Ã­ mÃ©dium.\n          .then(() => assetArray)\n        )),\n        Promise.resolve([])\n      )\n    );\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na poÅ¾adavek na pÅ™epnutÃ­ obsahu z Ä�istiÄ�e obsahu.\n   * @param {ContentInfo} contentInfo Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onContent (contentInfo) {\n    this.emitter.emit('content', contentInfo);\n  }\n\n  /**\n   * Reakce na chybu.\n   * @param {Error} error ChybovÃ½ objekt.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onError (error) {\n    this.emitter.emit('error', error);\n  }\n\n  /**\n   * ObnovÃ­ obsah datovÃ©ho zdroje s binÃ¡rnÃ­mi soubory.\n   * @returns {Promise.<Array.<Asset>>} Seznam obnovenÃ½ch assetÅ¯.\n   */\n  start () {\n    const resource = this.primaryStore.definitions.asset;\n    const adapter = resource.getAdapter(resource);\n    return (\n      // VyÄ�istÃ­ se vadnÃ© soubory datovÃ©ho zdroje.\n      adapter.clean(resource)\n      .catch((error) => {\n        this.emitter.emit('error', error);\n      })\n      // ObnovÃ­ se obsah datovÃ©ho zdroje.\n      .then(() => this.primaryStore.findAll('asset'))\n    );\n  }\n}\n\n/**\n * NovÃ½ obsah zaÅ™Ã­zenÃ­ k zobrazenÃ­.\n * PouÅ¾Ã­vÃ¡ se pro pÅ™eruÅ¡enÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ aktuÃ¡lnÃ­ho obsahu, aby mohl bÃ½t vyÄ�iÅ¡tÄ›n.\n * @event Downloader#content\n * @param {ContentInfo} contentInfo Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n */\n\n/**\n * ChybovÃ¡ udÃ¡lost.\n * @event Downloader#error\n * @param {Error} error ChybovÃ© hlÃ¡Å¡enÃ­.\n */\n\nexport default Downloader;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k typÅ¯ ÃºloÅ¾nÃ½ch jednotek zaÅ™Ã­zenÃ­.\n * @enum {string}\n */\nconst DriveEnum = {\n  /** ÃšloÅ¾nÃ¡ jednotka, kterÃ¡ mÅ¯Å¾e bÃ½t ze zaÅ™Ã­zenÃ­ odebrÃ¡na. */\n  EXTERNAL: 'EXTERNAL',\n  /** ÃšloÅ¾nÃ¡ jednotka, kterÃ¡ je vnitÅ™nÃ­ souÄ�Ã¡stÃ­ zaÅ™Ã­zenÃ­. */\n  INTERNAL: 'INTERNAL'\n};\n\nexport default DriveEnum;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport DriveEnum from './drive-enum';\n\n/**\n * Utility pro prÃ¡ci s ÃºloÅ¾nÃ½mi jednotkami.\n */\nclass DriveUtil {\n  /**\n   * Nalezne jednotku k uloÅ¾enÃ­ obsahu.\n   * ZatÃ­m vÅ¾dy vybere internÃ­ jednotku, u kterÃ© oÄ�ekÃ¡vÃ¡, Å¾e bude jedinÃ¡ pÅ™Ã­tomnÃ¡ tohoto typu.\n   * DoÄ�asnÃ¡ nÃ¡hrada pÅ™ed implementacÃ­ pokroÄ�ilejÅ¡Ã­ho vÃ½bÄ›ru vhodnÃ½ch jednotek.\n   * @param {Array.<DriveUnit>} driveUnitArray Seznam ÃºloÅ¾nÃ½ch jednotek.\n   * @returns {DriveUnit|null} NalezenÃ¡ primÃ¡rnÃ­ jednotka.\n   */\n  static find (driveUnitArray) {\n    const externalDriveUnitArray = [];\n    const internalDriveUnitArray = [];\n    driveUnitArray.forEach((driveUnit) => {\n      switch (driveUnit.driveEnum) {\n        case DriveEnum.EXTERNAL:\n          externalDriveUnitArray.push(driveUnit);\n          break;\n        case DriveEnum.INTERNAL:\n          internalDriveUnitArray.push(driveUnit);\n          break;\n        default:\n          throw new RangeError(`Unknown drive unit \"${driveUnit}\".`);\n      }\n    });\n    switch (internalDriveUnitArray.length) {\n      case 0:\n        if (externalDriveUnitArray.length === 1) {\n          return externalDriveUnitArray[0];\n        }\n        return null;\n      case 1:\n        return internalDriveUnitArray[0];\n      default:\n        return null;\n    }\n  }\n}\n\nexport default DriveUtil;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k prostÅ™edÃ­ sestavenÃ© aplikace.\n * @enum {string}\n * @name EnvEnum\n */\nexport default {\n  /** ProstÅ™edÃ­ pro vÃ½vojÃ¡Å™e. */\n  DEV: 'DEV',\n  /** ProdukÄ�nÃ­ prostÅ™edÃ­. */\n  PROD: 'PROD',\n  /** ProstÅ™edÃ­ pro automatizovanÃ© testovÃ¡nÃ­. */\n  TEST: 'TEST'\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EnvEnum from './env-enum';\n\n// TODO Mohlo by se odstranit opakovÃ¡nÃ­ napÅ™Ã­Ä� rÅ¯znÃ½mi prostÅ™edÃ­mi (multi-platformnÃ­ kÃ³d).\n// - /util.js parseEnv.\n// - Budou asi hlavnÄ› problÃ©my s importy.\n/**\n * Utility pro prÃ¡ci s Ä�Ã­selnÃ­kem prostÅ™edÃ­.\n */\nclass EnvUtil {\n  /**\n   * Vygeneruje textovou reprezentaci prostÅ™edÃ­.\n   * @param {EnvEnum|null} value ProstÅ™edÃ­ z Ä�Ã­selnÃ­ku.\n   * @returns {string|null} ProstÅ™edÃ­ jako text.\n   * @static\n   */\n  static generate (value) {\n    switch (value) {\n      case EnvEnum.DEV:\n        return 'development';\n      case EnvEnum.PROD:\n        return 'production';\n      case EnvEnum.TEST:\n        return 'testing';\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * NaÄ�te prostÅ™edÃ­ z textovÃ©ho Å™etÄ›zce.\n   * @param {string|null} value ProstÅ™edÃ­ jako text.\n   * @returns {EnvEnum|null} ProstÅ™edÃ­ z Ä�Ã­selnÃ­ku.\n   * @static\n   */\n  static parse (value) {\n    switch (value) {\n      case 'dev':\n      case 'development':\n        return EnvEnum.DEV;\n      case 'prod':\n      case 'production':\n        return EnvEnum.PROD;\n      case 'test':\n      case 'testing':\n        return EnvEnum.TEST;\n      default:\n        return null;\n    }\n  }\n}\n\nexport default EnvUtil;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport has from 'lodash/has';\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\n\nimport ErrorLevel from '../error/error-level';\n\n/**\n * TovÃ¡rna na ÃºrovnÄ› obecnÃ½ch chyb.\n */\nclass ErrorLevelFactory {\n  /** VytvoÅ™Ã­ instanci. */\n  constructor () {\n    this.priorityMap = new Map(\n      ['Debug', 'Log', 'Info', 'Warning', 'Error']\n      .map((key, index) => [ErrorLevel[key], index])\n    );\n  }\n\n  /**\n   * PorovnÃ¡ dvÄ› ÃºrovnÄ› chyb.\n   * @param {ErrorLevel} first\n   * @param {ErrorLevel} second\n   * @returns {number} ÄŒÃ­slo -1, 0, 1 dle konvencÃ­ z `Array.sort`.\n   */\n  compare (first, second) {\n    const firstPriority = this.priorityMap.get(first);\n    if (isNil(firstPriority)) {\n      throw new RangeError(`Unknown error level \"${first}\".`);\n    }\n    const secondPriority = this.priorityMap.get(second);\n    if (isNil(secondPriority)) {\n      throw new RangeError(`Unknown error level \"${second}\".`);\n    }\n    if (firstPriority < secondPriority) {\n      return -1;\n    }\n    if (firstPriority > secondPriority) {\n      return 1;\n    }\n    return 0;\n  }\n\n  /**\n   * Identifikuje ÃºroveÅˆ chyby z libovolnÃ© hodnoty.\n   * PouÅ¾Ã­vÃ¡ se k tomu speciÃ¡lnÃ­ klÃ­Ä� `level`,\n   * kterÃ½ lze nastavit libovolnÃ©mu objektu.\n   * @param {*} value\n   * @private\n   * @returns {ErrorLevel|null} IdentifikovanÃ¡ ÃºroveÅˆ, nebo `null`,\n   * pokud Å¾Ã¡dnÃ¡ nebyla nalezena.\n   */\n  fromValue (value) {\n    // Pokud nenÃ­ hodnota objektem, tak se pouÅ¾ije ÃºroveÅˆ chyby dle metody.\n    if (!isObject(value)) {\n      return null;\n    }\n    // Z objektu lze naÄ�Ã­st specifickou hodnotu \"level\".\n    const valueLevel = value.level;\n    // Pokud nenÃ­ definovanÃ¡, nebo nenÃ­ v Ä�Ã­selnÃ­ku,\n    // tak se pouÅ¾ije ÃºroveÅˆ chyby dle metody.\n    if (isNil(valueLevel) || !this.isErrorLevel(valueLevel)) {\n      return null;\n    }\n    // Pokud se v logovanÃ© hodnotÄ› podaÅ™ila nalÃ©zt ÃºroveÅˆ, tak se pouÅ¾ije.\n    return valueLevel;\n  }\n\n  /**\n   * UrÄ�Ã­, jestli je hodnota platnou ÃºrovnÃ­ chyby.\n   * @param {*} value\n   * @returns {boolean}\n   */\n  isErrorLevel (value) {\n    return has(ErrorLevel, value);\n  }\n}\n\nexport default ErrorLevelFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÃšroveÅˆ dÅ¯leÅ¾itosti chyby.\n * VychÃ¡zÃ­ z ÃºrovnÃ­ zavedenÃ½ch v Console API pod pojmenovÃ¡nÃ­m `logLevel`.\n * ÃšrovnÄ› majÃ­ nÃ¡sledujÃ­cÃ­ prioritu:\n * `Error` > `Warning` > `Info` > `Log` > `Debug`.\n *\n * Zdroje:\n * - [Console API](https://console.spec.whatwg.org/)\n * @enum {string}\n */\nconst ErrorLevel = {\n  /** Verbose debug log which is usually hidden by default. */\n  Debug: 'Debug',\n  /** Critical error which can lead to an unexpected bahaviour or a crash. */\n  Error: 'Error',\n  /** Informative log with a slightly higher than low significance. */\n  Info: 'Info',\n  /** Common log with a low significance. */\n  Log: 'Log',\n  /** Warning about an unusual state which won't affect the script execution. */\n  Warning: 'Warning'\n};\n\nexport default ErrorLevel;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k nÃ¡zvÅ¯ chybovÃ½ch hlÃ¡Å¡enÃ­.\n *\n * Spojuje nÄ›kolik nativnÃ­ch rozhranÃ­:\n * [W3C error name](https://heycam.github.io/webidl/#dfn-exception-error-name),\n * [W3C DOMException](https://developer.mozilla.org/en-US/docs/Web/API/DOMException),\n * [W3C Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error),\n * [W3C FileException](https://developer.mozilla.org/en-US/docs/Web/API/FileException),\n * [W3C FileError](https://developer.mozilla.org/en-US/docs/Web/API/FileError),\n * [W3C DOMError](https://developer.mozilla.org/en-US/docs/Web/API/DOMError),\n * [Cordova](https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/index.html#list-of-error-codes-and-meanings),\n * [webOS](http://webossignage.developer.lge.com/api/scap-api/scap14/errorcode/),\n * [Tizen](http://www.samsungdforum.com/B2B/Guide/APIReference/SSSP4/tizen961/index.html#::Tizen::WebAPIError).\n *\n * | Error name | W3C Error | W3C DOMException | Cordova | webOS |\n * | --- | --- | --- | --- | --- |\n * | `AbortError` | - | `AbortError` | `ABORT_ERR` | - |\n * | `EncodingError` | - | `EncodingError` | `ENCODING_ERR` | - |\n * | `Error` | `Error` | - | - | - |\n * | `InvalidModificationError` | - | `InvalidModificationError` | `INVALID_MODIFICATION_ERR` | - |\n * | `InvalidStateError` | - | `InvalidStateError` | `INVALID_STATE_ERR` | - |\n * | `MediaError` | - | - | - | - |\n * | `NetworkError` | - | `NetworkError` | - | `NETWORK_ERROR` |\n * | `NoModificationAllowedError` | - | `NoModificationAllowedError` | `NO_MODIFICATION_ALLOWED_ERR` | - |\n * | `NotFoundError` | - | `NotFoundError` | `NOT_FOUND_ERR` | [2] |\n * | `NotReadableError` | - | - | `NOT_READABLE_ERR` | `DEVICE_ERROR`, `IO_ERROR` |\n * | `NotSupportedError` | - | `NotSupportedError` | - | - |\n * | `PathExistsError` | - | - | `PATH_EXISTS_ERR` | [2] |\n * | `QuotaExceededError` | - | `QuotaExceededError` | `QUOTA_EXCEEDED_ERR` | - |\n * | `RangeError` | `RangeError` | - | - | - |\n * | `ReferenceError` | `ReferenceError` | - | - | - |\n * | `SecurityError` | - | `SecurityError` | `SECURITY_ERR` | - |\n * | `SyntaxError` | [1] | `SyntaxError` | `SYNTAX_ERR` | - |\n * | `TimeoutError` | - | `TimeoutError` | - | - |\n * | `TypeError` | `TypeError` | `TypeMismatchError`[3] | `TYPE_MISMATCH_ERR` | `BAD_PARAMETER` |\n *\n * * [1] ZÃ¡mÄ›rnÄ› nenÃ­ uvedenÃ½ [SyntaxError](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError),\n *   kterÃ½ by mÄ›l vyhazovat pouze interpret.\n *   [PodrobnÄ›jÅ¡Ã­ informace lze nalÃ©zt u W3C.](https://heycam.github.io/webidl/#idl-DOMException-error-names)\n * * [2] Lze zjistit pomocÃ­ `Storage#exists`.\n * * [3] Deprecated. Nahrazuje TypeError.\n *\n * Jsou vynechÃ¡ny nÄ›kterÃ© typy W3C Error: `EvalError`, `SyntaxError` a `URIError`,\n * kterÃ© by mÄ›li bÃ½t vyvolÃ¡vÃ¡ny pouze nativnÃ­mi metodami.\n * @enum {string}\n */\nconst ErrorName = {\n  /** The operation was aborted. */\n  AbortError: 'AbortError',\n  /** The encoding or decoding operation failed. */\n  EncodingError: 'EncodingError',\n  /** Common unspecified error. */\n  Error: 'Error',\n  /**\n   * The object can not be modified in this way, because it makes no sense.\n   * For example, the app might be trying to move a directory into its own child or\n   * moving a file into its parent directory without changing its name.\n   */\n  InvalidModificationError: 'InvalidModificationError',\n  /**\n   * The object is in an invalid state.\n   * For example, the state that was cached in an interface object has changed\n   * since it was last read from disk.\n   */\n  InvalidStateError: 'InvalidStateError',\n  /**\n   * The MediaError represents an error which occurred while handling media\n   * in an HTML media element based on HTMLMediaElement, such as <audio> or <video>.\n   */\n  MediaError: 'MediaError',\n  /** The network connection has failed. */\n  NetworkError: 'NetworkError',\n  /**\n   * The object can not be modified, because it isn't allowed for some reason.\n   * For example, the state of the underlying file system prevents any writing to a file or a directory.\n   */\n  NoModificationAllowedError: 'NoModificationAllowedError',\n  /**\n   * The object can not be found here.\n   * For example, a file did not exist but was being opened.\n   * A required file or directory could not be found at the time an operation was processed.\n   */\n  NotFoundError: 'NotFoundError',\n  /**\n   * The input/output read operation failed.\n   * Typically due to permission problems that occur after a reference to a file has been acquired.\n   * For example, the file or directory is concurrently locked by another application.\n   */\n  NotReadableError: 'NotReadableError',\n  /** The operation is not supported. */\n  NotSupportedError: 'NotSupportedError',\n  /** The file or directory with the same path already exists. */\n  PathExistsError: 'PathExistsError',\n  /** The operation failed because it would cause the application to exceed its storage quota. */\n  QuotaExceededError: 'QuotaExceededError',\n  /** The value is not in the set or range of allowed values. */\n  RangeError: 'RangeError',\n  /** De-referencing an invalid reference. */\n  ReferenceError: 'ReferenceError',\n  /**\n   * The operation is insecure.\n   * For example, a required file was unsafe for access within a Web application.\n   * Too many calls are being made on resources.\n   */\n  SecurityError: 'SecurityError',\n  /**\n   * An error occurred during the registration of the device on a remote server.\n   * See {@link SetupError} for details.\n   */\n  SetupError: 'SetupError',\n  /** The string did not match the expected pattern. */\n  SyntaxError: 'SyntaxError',\n  /** The operation has timed out. */\n  TimeoutError: 'TimeoutError',\n  /**\n   * Variable or parameter is not of a valid type.\n   * For example, the app is asking for a directory, when the entry is really a file.\n   */\n  TypeError: 'TypeError'\n};\n\nexport default ErrorName;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Zdroj vÃ½jimek pÅ™edstavujÃ­cÃ­ chybovÃ© hlÃ¡Å¡enÃ­ ve starÃ©m Sentry Raven API.\n * K vÃ½jimce se pÅ™idÃ¡vajÃ­ dalÅ¡Ã­ dodateÄ�nÃ© informace.\n * @deprecated Tento starÃ½ formÃ¡t se jiÅ¾ nepouÅ¾Ã­vÃ¡.\n * PonechÃ¡no pouze pro ÃºmoÅ¾nÄ›nÃ­ smazÃ¡nÃ­ dÅ™Ã­ve zÃ¡lohovanÃ½ch vÃ½jimek.\n */\nconst ExceptionResource = {\n  name: 'exception'\n};\n\nexport default ExceptionResource;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isArray from 'lodash/isArray';\nimport isString from 'lodash/isString';\n\n/**\n * TovÃ¡rna na cesty v souborovÃ©m systÃ©mu.\n */\nclass FileSystemPathFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<FileSystemPath>} FileSystemPath Konstruktor cesty.\n   * @param {PathBrowserify} pathBrowserify\n   * @returns {FileSystemPath} NovÃ¡ instance.\n   */\n  constructor (FileSystemPath, pathBrowserify) {\n    this.FileSystemPath = FileSystemPath;\n    this.pathBrowserify = pathBrowserify;\n  }\n\n  /**\n   * VytvoÅ™Ã­ cestu z informacÃ­ o jejÃ­ch Ä�Ã¡stech.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {FileSystemName} [opts.base=''] NÃ¡zev zÃ¡znamu.\n   * @param {FileSystemName} [opts.extension=''] Koncovka nÃ¡zvu zÃ¡znamu.\n   * @param {FileSystemName} [opts.unit=''] NÃ¡zev jednotky.\n   * @param {Array.<FileSystemName>} [opts.parents=[]] Seznam nÃ¡zvÅ¯ rodiÄ�ovskÃ½ch sloÅ¾ek.\n   * @param {FileSystemName} [opts.stem=''] ÄŒÃ¡st nÃ¡zvu zÃ¡znamu bez koncovky.\n   * @returns {FileSystemPath} NovÃ¡ instance.\n   */\n  fromInfo ({base = '', extension = '', unit = '', parents = [], stem = ''} = {}) {\n    const segmentArray = [];\n    if (!isString(unit)) {\n      throw new TypeError(`Invalid unit \"${unit}\".`);\n    }\n    if (unit) {\n      segmentArray.push(`/${unit}`);\n    }\n    if (!isArray(parents)) {\n      throw new TypeError(`Invalid parents \"${parents}\".`);\n    }\n    parents.forEach((parent) => {\n      if (!isString(parent)) {\n        throw new TypeError(`Invalid parent \"${parent}\".`);\n      }\n      segmentArray.push(parent);\n    });\n    if (!isString(base)) {\n      throw new TypeError(`Invalid base \"${base}\".`);\n    }\n    if (base) {\n      segmentArray.push(base);\n    } else {\n      const altBase = this.getBase({extension, stem});\n      if (altBase) {\n        segmentArray.push(altBase);\n      }\n    }\n    const value = segmentArray.join('/');\n    return new this.FileSystemPath(value, this.pathBrowserify);\n  }\n\n  /**\n   * VytvoÅ™Ã­ cestu z jejÃ­ hodnoty reprezentovanÃ© Å™etÄ›zcem.\n   * @param {string} value Å˜etÄ›zec s cestou.\n   * @returns {FileSystemPath} NovÃ¡ instance.\n   */\n  fromValue (value) {\n    return new this.FileSystemPath(value, this.pathBrowserify);\n  }\n\n  /**\n   * ZjistÃ­ nÃ¡zev zÃ¡znamu z jeho podÄ�Ã¡stÃ­.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {FileSystemName} [opts.extension=''] Koncovka nÃ¡zvu zÃ¡znamu.\n   * @param {FileSystemName} [opts.stem=''] ÄŒÃ¡st nÃ¡zvu zÃ¡znamu bez koncovky.\n   * @private\n   * @returns {FileSystemName} NÃ¡zev zÃ¡znamu.\n   */\n  getBase ({extension = '', stem = ''} = {}) {\n    const segmentArray = [];\n    if (!isString(stem)) {\n      throw new TypeError(`Invalid stem \"${stem}\".`);\n    }\n    if (stem) {\n      segmentArray.push(stem);\n    }\n    if (!isString(extension)) {\n      throw new TypeError(`Invalid extension \"${extension}\".`);\n    }\n    if (extension) {\n      segmentArray.push(`.${extension}`);\n    }\n    return segmentArray.join('');\n  }\n\n  /**\n   * SpojÃ­ cesty do jednÃ© vÃ½slednÃ© cesty.\n   * @param {...FileSystemPath} pathArray Seznam cest ke spojenÃ­.\n   * @returns {FileSystemPath} SpojenÃ¡ a normalizovanÃ¡ cesta.\n   */\n  join (...pathArray) {\n    const valueArray = pathArray.map((path) => path.getValue());\n    const value = this.pathBrowserify.join(...valueArray);\n    return new this.FileSystemPath(value, this.pathBrowserify);\n  }\n\n  /**\n   * ZjistÃ­ relativnÃ­ cestu mezi dvÄ›mi absolutnÃ­mi.\n   * @param {FileSystemPath} fromPath VÃ½chozÃ­ cesta.\n   * @param {FileSystemPath} toPath CÃ­lovÃ¡ cesta.\n   * @returns {FileSystemPath} RelativnÃ­ cesta.\n   */\n  relative (fromPath, toPath) {\n    const pathArray = [fromPath, toPath];\n    const valueArray = pathArray.map((path) => path.getValue());\n    const value = this.pathBrowserify.relative(...valueArray);\n    return new this.FileSystemPath(value, this.pathBrowserify);\n  }\n\n  /**\n   * SpojÃ­ cesty do jednÃ© absolutnÃ­ cesty.\n   * @param {...FileSystemPath} pathArray Seznam cest ke spojenÃ­.\n   * @returns {FileSystemPath} SpojenÃ¡ a normalizovanÃ¡ cesta.\n   */\n  resolve (...pathArray) {\n    const valueArray = pathArray.map((path) => path.getValue());\n    const value = this.pathBrowserify.resolve(...valueArray);\n    return new this.FileSystemPath(value, this.pathBrowserify);\n  }\n}\n\nexport default FileSystemPathFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Cesta v souborovÃ©m systÃ©mu.\n *\n * Je to Å™etÄ›zec, kterÃ½ jednoznaÄ�nÄ› idetnifikuje jakoukoliv `FileSystemEntry` v celÃ©m souborovÃ©m systÃ©mu.\n *\n * MaximÃ¡lnÃ­ dÃ©lka cesty u kterÃ© je garantovanÃ¡ bezproblÃ©movÃ¡ funkcionalita je 255 znakÅ¯.\n *\n * Cesta je tvoÅ™ena hierarchiÃ­ `FileSystemName` oddÄ›lenÃ½ch znakem `/`.\n *\n * ![Diagram](./core/file/system/file-system-path.doc.png)\n *\n * PÅ™edchozÃ­ diagram znÃ¡zorÅˆuje strukturu absolutnÃ­ cesty, kde:\n *\n * - Unit je nÃ¡zev logickÃ© jednotky.\n * - Parents jsou nÃ¡zvy sloÅ¾ek, do kterÃ½ch je zanoÅ™enÃ½ zÃ¡kladnÃ­ zÃ¡znam.\n * - Base je zÃ¡kladnÃ­ zÃ¡znam (sloÅ¾ka nebo soubor), na kterÃ½ cesta odkazuje.\n *\n * UkÃ¡zka moÅ¾nÃ½ch nÃ¡zvÅ¯ logickÃ½ch jednotek: `data`, `install`, `temp`, `sdcard`, `usb`, `usb.2`.\n * ObecnÄ› jejich pÅ™esnou hodnotu urÄ�uje platforma, takÅ¾e se mohou vzÃ¡jemnÄ› liÅ¡it dle implementace.\n *\n * UkÃ¡zka moÅ¾nÃ½ch cest:\n *\n * - `/internal` je hlavnÃ­ sloÅ¾ka jednotky `internal`\n * - `/internal/crocodile.txt` je soubor `crocodile.txt` na hlavnÃ­ Ãºrovni jednotky `internal`\n * - `/internal/dogs` je sloÅ¾ka `dogs` na hlavnÃ­ Ãºrovni jednotky `internal`\n * - `/usb/cats/bengal.txt` je soubor `bengal.txt` ve sloÅ¾ce `cats` na jednotce `usb`\n *\n * Implementace je zaloÅ¾enÃ¡ na Node.js Path rozhranÃ­ v POSIX variantÄ›.\n * Proto je snaha se od nÄ›j co nejmÃ©nÄ› liÅ¡it. PÅ™esto zde jsou nÄ›kterÃ© vÃ½jimky:\n *\n * - Parents nahrazujÃ­ dir. NeobsahujÃ­ root. MÃ­sto Å™etÄ›zce s odÄ›lovaÄ�i vracÃ­ pole Å™etÄ›zcÅ¯.\n * - PrvnÃ­ ÃºroveÅˆ absolutnÃ­ cesty se vracÃ­ jako unit.\n * - PrvnÃ­ ÃºroveÅˆ absolutnÃ­ cesty nenÃ­ zahrnutÃ¡ do parents.\n * - AutomatickÃ¡ normalizace cesty. KvÅ¯li problÃ©mÅ¯m s urÄ�enÃ­m unit bez normalizace.\n *   MyÅ¡lenka je takovÃ¡, Å¾e prvnÃ­ ÃºroveÅˆ absolutnÃ­ path urÄ�uje unit.\n *   JenÅ¾e co u cest jako: `/./foo` nebo `/bar/../foo`? Tam se oÄ�ekÃ¡vÃ¡ vÃ½sledek `foo`.\n *   TÃ­m pÃ¡dem nenÃ­ vhodnÃ© pro urÄ�ovÃ¡nÃ­ jednotek pouÅ¾Ã­vat nenormalizovanÃ© cesty.\n * - SouÄ�Ã¡stÃ­ koncovky nenÃ­ teÄ�ka.\n *\n * U cest je moÅ¾nÃ© pouÅ¾Ã­vat ukonÄ�enÃ­ lomÃ­tkem navÃ­c, ale nenÃ­ to doporuÄ�eno ani testovÃ¡no.\n * Podpora je zachovÃ¡na kvÅ¯li kompatibilitÄ› s Node.js.\n *\n * Dokumentace:\n * [Cordova](https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/index.html#cdvfile-protocol),\n * [Entries API](https://wicg.github.io/entries-api/#names-paths),\n * [Node.js](https://nodejs.org/dist/latest-v10.x/docs/api/path.html),\n * [Tizen](http://www.samsungdforum.com/B2B/Guide/APIReference/SSSP4/tizen971/index.html),\n * [webOS](http://webossignage.developer.lge.com/api/scap-api/scap-library/file-pathname/).\n * @implements {Serializable}\n * @implements {Stringable}\n */\nclass FileSystemPath {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {string} value Cesta jako Å™etÄ›zec.\n   * @param {PathBrowserify} pathBrowserify\n   * @returns {FileSystemPath} NovÃ¡ instance.\n   */\n  constructor (value, pathBrowserify) {\n    const normalized = pathBrowserify.normalize(value);\n    this.normalized = normalized;\n    this.pathBrowserify = pathBrowserify;\n    this.pathObject = pathBrowserify.parse(normalized);\n    this.value = value;\n  }\n\n  /**\n   * ZjistÃ­ nÃ¡zev zÃ¡znamu, na kterÃ½ cesta odkazuje.\n   *\n   * PojmenovÃ¡nÃ­ vychÃ¡zÃ­ z [Node.js a POSIX basename](https://nodejs.org/docs/latest-v10.x/api/path.html#path_path_basename_path_ext).\n   * @returns {FileSystemName} NÃ¡zev zÃ¡znamu.\n   */\n  getBase () {\n    if (this.isRoot()) {\n      return '';\n    }\n    return this.pathObject.base;\n  }\n\n  /**\n   * ZjistÃ­ jednotlivÃ© segmenty, ze kterÃ½ch se sklÃ¡dÃ¡ cesta.\n   * @private\n   * @returns {Array.<FileSystemName>} Seznam nÃ¡zvÅ¯ jednotlivÃ½ch segmentÅ¯.\n   */\n  getSegments () {\n    const {pathObject} = this;\n    const dirString = pathObject.dir.slice(pathObject.root.length);\n    const segments = [];\n    if (dirString) {\n      segments.push(...dirString.split('/'));\n    }\n    const {base} = pathObject;\n    if (base) {\n      segments.push(base);\n    }\n    return segments;\n  }\n\n  /**\n   * ZjistÃ­ koncovku zÃ¡znamu, na kterÃ½ cesta odkazuje.\n   *\n   * Koncovka neobsahuje teÄ�ku.\n   * @returns {FileSystemName} Koncovka zÃ¡znamu.\n   */\n  getExtension () {\n    if (this.isRoot()) {\n      return '';\n    }\n    return this.pathObject.ext.slice(1);\n  }\n\n  /**\n   * ZjistÃ­ normalizovanou cestu jako Å™etÄ›zec.\n   * @returns {string} Cesta.\n   */\n  getNormalized () {\n    return this.normalized;\n  }\n\n  /**\n   * ZjistÃ­ seznam nÃ¡zvÅ¯ rodiÄ�ovskÃ½ch sloÅ¾ek.\n   * @returns {Array.<FileSystemName>} Seznam nÃ¡zvÅ¯ sloÅ¾ek.\n   */\n  getParents () {\n    const segments = this.getSegments();\n    if (this.isAbsolute()) {\n      return segments.slice(1, -1);\n    }\n    return segments.slice(0, -1);\n  }\n\n  /**\n   * ZjistÃ­ nÃ¡zev zÃ¡znamu bez koncovky, na kterÃ½ cesta odkazuje.\n   *\n   * PojmenovÃ¡nÃ­ vychÃ¡zÃ­ z C++, kterÃ© jako jedinÃ© pouÅ¾Ã­vÃ¡ jedineÄ�nÃ© pojmenovÃ¡nÃ­.\n   * NÄ›kdy nazÃ½vÃ¡no \"base name\", coÅ¾ koliduje s Node.js (respektive POSIX) \"basename\".\n   * NÄ›kdy nazÃ½vÃ¡no \"root name\", coÅ¾ opÄ›t koliduje s Node.js \"root\" (Windows jednotka).\n   * V Node.js nazÃ½vÃ¡no jen \"name\", coÅ¾ zase koliduje s pojmenovÃ¡nÃ­m Entries API.\n   * NavÃ­c v podstatÄ› vÅ¡echny Ä�Ã¡sti path jsou nÄ›jakÃ© \"name\".\n   * @returns {FileSystemName} NÃ¡zev zÃ¡znamu bez koncovky.\n   */\n  getStem () {\n    if (this.isRoot()) {\n      return '';\n    }\n    const {ext, name} = this.pathObject;\n    if (ext.length === 1) {\n      // Pokud je ext tvoÅ™ena jen jednÃ­m znakem (teÄ�kou), tak se kompenzuje jejÃ­ odebrÃ¡nÃ­ z extension.\n      // DÃ­ky tomu lze libovolnÄ› pÅ™evÃ¡dÄ›t stem a extension na base a zpÄ›t.\n      return name + ext;\n    }\n    return name;\n  }\n\n  /**\n   * ZjistÃ­ nÃ¡zev jednotky, na kterou cesta odkazuje.\n   * @returns {FileSystemName} NÃ¡zev jednotky.\n   */\n  getUnit () {\n    const segments = this.getSegments();\n    if (this.isAbsolute() && segments.length) {\n      return segments[0];\n    }\n    return '';\n  }\n\n  /**\n   * ZjistÃ­ cestu jako Å™etÄ›zec v pÅ¯vodnÃ­ podobÄ› bez normalizace.\n   * @returns {string} Cesta.\n   */\n  getValue () {\n    return this.value;\n  }\n\n  /**\n   * ZjistÃ­, jestli je cesta absolutnÃ­.\n   * @returns {boolean} PÅ™Ã­znak.\n   */\n  isAbsolute () {\n    return this.pathBrowserify.isAbsolute(this.normalized);\n  }\n\n  /**\n   * ZjistÃ­, jestli cesta odkazuje na koÅ™enovou sloÅ¾ku.\n   * @returns {boolean} PÅ™Ã­znak.\n   */\n  isRoot () {\n    return this.isAbsolute() && this.getSegments().length < 2;\n  }\n\n  /** @inheritdoc */\n  toJSON () {\n    // PÅ™i exportu dat do JSON se pouÅ¾Ã­vÃ¡ originÃ¡lnÃ­ hodnota Å™etÄ›zce s cestou.\n    // Tak v pÅ™Ã­padÄ› zmÄ›n v implementaci pÅ¯jde zpracovat jinak.\n    return this.getValue();\n  }\n\n  /** @inheritdoc */\n  toString () {\n    // PÅ™i exportu do Å™etÄ›zce se pouÅ¾ije normalizovanÃ¡ cesta.\n    // Ta je kratÅ¡Ã­ a srozumitelnÄ›jÅ¡Ã­ pro Ä�lovÄ›ka.\n    return this.getNormalized();\n  }\n}\n\nexport default FileSystemPath;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k ÃºÄ�elÅ¯ jednotek souborovÃ©ho systÃ©mu.\n * PouÅ¾Ã­vÃ¡ se pro roztÅ™Ã­dÄ›nÃ­ jednotek na rÅ¯znÃ½ch platformÃ¡ch do podobnÃ½ch skupin.\n * Inspirace u zpracovÃ¡nÃ­ knihovny\n * [Cordova](https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/index.html#where-to-store-files).\n * @enum {string}\n */\nconst FileSystemPurpose = {\n  /** Persistent and private data storage within the application's sandbox. */\n  Data: 'Data',\n  /** Read-only directory where the application is installed. */\n  Install: 'Install',\n  /** Temp directory that the OS can clear at will. */\n  Temp: 'Temp'\n};\n\nexport default FileSystemPurpose;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isObject from 'lodash/isObject';\n\n/**\n * SpojenÃ­ pro staÅ¾enÃ­ nebo nahrÃ¡nÃ­ souboru.\n */\nclass FileTransferConnection {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Promise.<FileTransferResponse>} response ProbÃ­hajÃ­cÃ­ poÅ¾adavek na odpovÄ›Ä�.\n   * @returns {FileTransferConnection} NovÃ¡ instance.\n   */\n  constructor (response) {\n    if (!isObject(response)) {\n      throw new TypeError(`Invalid response \"${response}\".`);\n    }\n    this.response = response;\n  }\n\n  /**\n   * ZjistÃ­ odpovÄ›Ä� na poÅ¾adavek, kterÃ½ odeslÃ¡n na server.\n   * @returns {Promise.<FileTransferResponse>} VyÅ™eÅ¡Ã­ se po pÅ™ijetÃ­ odpovÄ›di ze serveru (i chybovÃ©).\n   * OdmÃ­tne se, pokud byl poÅ¾adavek pÅ™eruÅ¡en pÅ™ed dokonÄ�enÃ­m,\n   * nebo nebyl na server doruÄ�en, nebo nebyla doruÄ�ena jeho odpovÄ›Ä�.\n   * @throws {NetworkError} SpojenÃ­ selhalo kvÅ¯li problÃ©mu v sÃ­ti.\n   * @throws {NotFoundError} RodiÄ�ovskÃ¡ sloÅ¾ka na cestÄ› neexistuje. (download)\n   * @throws {PathExistsError} CÃ­lovÃ¡ cesta jiÅ¾ existuje. (download)\n   * @throws {QuotaExceededError} StaÅ¾enÃ­ souboru pÅ™esÃ¡hlo kvÃ³tu dostupnÃ©ho mÃ­sta. (download)\n   */\n  getResponse () {\n    return this.response;\n  }\n}\n\nexport default FileTransferConnection;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * PoÅ¾adavek na staÅ¾enÃ­ nebo nahrÃ¡nÃ­ souboru.\n *\n * InspirovÃ¡no nativnÃ­ implementacÃ­ [Request](https://developer.mozilla.org/en-US/docs/Web/API/Request).\n */\nclass FileTransferRequest {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Url} url URL, na kterou smÄ›Å™uje poÅ¾adavek.\n   * @returns {FileTransferRequest} NovÃ¡ instance.\n   */\n  constructor (url) {\n    this.url = url;\n  }\n\n  /**\n   * ZjistÃ­ URL, na kterou smÄ›Å™uje poÅ¾adavek.\n   * @returns {Url} URL.\n   */\n  getUrl () {\n    return this.url;\n  }\n}\n\nexport default FileTransferRequest;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\n\nimport ErrorName from '../../error/error-name';\n\n/**\n * OdpovÄ›Ä� na staÅ¾enÃ­ nebo nahrÃ¡nÃ­ souboru.\n *\n * InspirovÃ¡no nativnÃ­ implementacÃ­ [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response).\n */\nclass FileTransferResponse {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {FileSystemFile} [opts.file] Soubor, kterÃ½ byl staÅ¾enÃ½.\n   * @param {number} [opts.status=200] HTTP status odpovÄ›di.\n   * @returns {FileTransferResponse} NovÃ¡ instance.\n   */\n  constructor ({file, status = 200} = {}) {\n    if (!isNil(file) && !isObject(file)) {\n      throw new TypeError(`Invalid file ${file}.`);\n    }\n    if (!FileTransferResponse.isStatus(status)) {\n      throw new TypeError(`Invalid status ${status}.`);\n    }\n    this.file = file;\n    this.status = status;\n  }\n\n  /**\n   * ZjistÃ­ soubor, kterÃ½ byl staÅ¾enÃ½.\n   * @returns {FileSystemFile} StaÅ¾enÃ½ soubor.\n   * @throws {NotFoundError} Å½Ã¡dnÃ½ soubor nebyl staÅ¾enÃ½.\n   */\n  getFile () {\n    const {file} = this;\n    if (isNil(file)) {\n      const error = new Error('Missing file.');\n      error.name = ErrorName.NotFoundError;\n      throw error;\n    }\n    return file;\n  }\n\n  /**\n   * ZjistÃ­ HTTP status odpovÄ›di.\n   * @returns {number} Status.\n   */\n  getStatus () {\n    return this.status;\n  }\n\n  /**\n   * ZjistÃ­, jestli byl nÄ›jakÃ½ soubor staÅ¾enÃ½.\n   * @returns {boolean}\n   */\n  hasFile () {\n    return !isNil(this.file);\n  }\n\n  /**\n   * ZjistÃ­ jestli je HTTP status odpovÄ›di ÃºspÄ›Å¡nÃ½.\n   *\n   * ÃšspÄ›Å¡nÃ½ status je v intervalu <200, 299>.\n   * @returns {boolean} PÅ™Ã­znak.\n   */\n  isOk () {\n    const {status} = this;\n    return status >= 200 && status <= 299;\n  }\n\n  /**\n   * ZjistÃ­ jestli je status validnÃ­.\n   *\n   * ValidnÃ­ status je celÃ© Ä�Ã­slo v intervalu <200, 599>.\n   * @param {number} value Status k validaci.\n   * @private\n   * @returns {boolean} PÅ™Ã­znak.\n   */\n  static isStatus (value) {\n    return Number.isInteger(value) && value >= 200 && value <= 599;\n  }\n}\n\nexport default FileTransferResponse;\n","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isObject from 'lodash/isObject';\n\nimport Fingerprint2 from 'fingerprintjs2';\n\n/**\n * GenerÃ¡tor informacÃ­ pro otisk zaÅ™Ã­zenÃ­ z informacÃ­ dostupnÃ½ch ve webovÃ©m prohlÃ­Å¾eÄ�i.\n * @implements {FingerprintManager}\n */\nclass FingerprintBrowser {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {FingerprintHasher} hasher Objekt pro hashovÃ¡nÃ­ informacÃ­.\n   * @returns {FingerprintBrowser} NovÃ¡ instance.\n   */\n  constructor (hasher) {\n    if (!isObject(hasher)) {\n      throw new TypeError(`Invalid fingerprint hasher \"${hasher}\".`);\n    }\n    this.hasher = hasher;\n  }\n\n  /** @inheritdoc */\n  generate () {\n    return new Promise((resolve) => resolve(\n      this.getInfo()\n      .then((info) => this.hasher.hashObject(info))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ seznam informacÃ­ z prohlÃ­Å¾eÄ�e, ze kterÃ½ch lze generovat otisk.\n   * @private\n   * @returns {Promise.<Object>} Objekt s komponentami otisku.\n   * NÃ¡zvy komponent Fingerprint2 tvoÅ™Ã­ klÃ­Ä�e objektu.\n   * Jejich vÃ½sledky jsou hodnotami objektu.\n   */\n  getInfo () {\n    return new Promise((resolve) => resolve(\n      Fingerprint2.getPromise({\n        // Komponenty otisku, kterÃ© se pÅ™i generovÃ¡nÃ­ neberou v potaz.\n        excludes: {\n          // HodnÄ› zÃ¡leÅ¾Ã­ na detekÄ�nÃ­m algoritmu a verzi a nastavenÃ­ adBlock.\n          adBlock: true,\n          // Viz `screenResolution`.\n          availableScreenResolution: true,\n          // Na Windows nenÃ­ spolehlivÃ©.\n          enumerateDevices: true,\n          // NepouÅ¾Ã­vÃ¡me Flash.\n          fontsFlash: true,\n          // Viz `screenResolution`.\n          hasLiedResolution: true,\n          // PomÄ›r velikosti pixelÅ¯ zÃ¡visÃ­ na zoomu, kterÃ½ ale detekovat nelze.\n          pixelRatio: true,\n          // Nezahrnujeme rozliÅ¡enÃ­, protoÅ¾e se mÄ›nÃ­ pÅ™i zmÄ›nÄ› velikosti okna prohlÃ­Å¾eÄ�e.\n          screenResolution: true,\n          // MÄ›nÃ­ se bÄ›hem roku napÅ™. pÅ™i letnÃ­m / zimnÃ­m Ä�ase.\n          timezoneOffset: true\n        },\n        plugins: {\n          excludeIE: true\n        }\n      })\n      // Seznam komponent se pÅ™evede na objekt.\n      // PoÅ™adÃ­ komponent nenÃ­ zajÃ­mavÃ©.\n      .then((componentArray) => componentArray.reduce(\n        (acc, component) => {\n          acc[component.key] = component.value;\n          return acc;\n        },\n        {}\n      ))\n    ));\n  }\n}\n\nexport default FingerprintBrowser;\n","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isObject from 'lodash/isObject';\n\n/**\n * GenerÃ¡tor otisku zaÅ™Ã­zenÃ­ z nejlepÅ¡Ã­ch dostupnÃ½ch informacÃ­. Automaticky\n * vybere aktuÃ¡lnÄ› nejlepÅ¡Ã­ moÅ¾nou metodu. PrimÃ¡rnÄ› preferuje otisk z hardwarovÃ½ch\n * a sÃ­Å¥ovÃ½ch informacÃ­. Pokud tyto informace nelze zjistit, generuje se otisk\n * z ÃºdajÅ¯ o prohlÃ­Å¾eÄ�i.\n * @implements {FingerprintManager}\n */\nclass FingerprintFallback {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {FingerprintBrowser} browser GenerÃ¡tor otisku z informacÃ­, kterÃ© poskytuje prohlÃ­Å¾eÄ�.\n   * @param {FingerprintHardware} hardware GenerÃ¡tor otisku z hardwarovÃ½ch informacÃ­.\n   * @returns {FingerprintFallback} NovÃ¡ instance.\n   */\n  constructor (browser, hardware) {\n    if (!isObject(browser)) {\n      throw new TypeError(`Invalid browser fingerprint generator \"${browser}\".`);\n    }\n    if (!isObject(hardware)) {\n      throw new TypeError(`Invalid hardware fingerprint generator \"${hardware}\".`);\n    }\n    this.browser = browser;\n    this.hardware = hardware;\n  }\n\n  /** @inheritdoc */\n  generate () {\n    return new Promise((resolve) => resolve(\n      this.hardware.generate()\n      // Pokud nelze zÃ­skat informace z hardwaru, pokusÃ­me se generovat otisk\n      // z prohlÃ­Å¾eÄ�e.\n      .catch((_error) => this.browser.generate())\n    ));\n  }\n}\n\nexport default FingerprintFallback;\n","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport groupBy from 'lodash/groupBy';\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\nimport isString from 'lodash/isString';\n\nimport NetworkType from '../network/network-type';\n\n/**\n * GenerÃ¡tor informacÃ­ pro otisk z informacÃ­ dostupnÃ½ch z hardwaru zaÅ™Ã­zenÃ­.\n * @implements {FingerprintManager}\n */\nclass FingerprintHardware {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {FirmwareManager} firmwareManager SprÃ¡vce firmware.\n   * @param {FingerprintHasher} hasher Objekt pro hashovÃ¡nÃ­ informacÃ­.\n   * @param {NetworkManager} networkManager SprÃ¡vce sÃ­Å¥ovÃ½ch pÅ™ipojenÃ­.\n   * @returns {FingerprintHardware} NovÃ¡ instance.\n   */\n  constructor (firmwareManager, hasher, networkManager) {\n    if (!isObject(firmwareManager)) {\n      throw new TypeError(`Invalid firmware manager \"${firmwareManager}\".`);\n    }\n    if (!isObject(hasher)) {\n      throw new TypeError(`Invalid fingerprint hasher \"${hasher}\".`);\n    }\n    if (!isObject(networkManager)) {\n      throw new TypeError(`Invalid network manager \"${networkManager}\".`);\n    }\n    this.firmwareManager = firmwareManager;\n    this.hasher = hasher;\n    this.networkManager = networkManager;\n  }\n\n  /**\n   * Najde vhodnou MAC adresu pro generovÃ¡nÃ­ otisku. V prvnÃ­ Å™adÄ› se vybere\n   * lexikograficky nejmenÅ¡Ã­ MAC adresa ethernetovÃ©ho adaptÃ©ru. Pokud takovÃ¡\n   * neexistuje, vybere se lexikograficky nejmenÅ¡Ã­ adresa Wi-Fi adaptÃ©ru. Pokud\n   * ani tato neexistuje, vrÃ¡tÃ­ null.\n   * @private\n   * @returns {Promise.<string|null>} MAC adresa nebo null, pokud nelze Å¾Ã¡dnou vhodnou najÃ­t.\n   */\n  findMac () {\n    return new Promise((resolve) => resolve(\n      this.networkManager.getAllConnections()\n      .then((connectionArray) => groupBy(connectionArray, (connection) => connection.getType()))\n      .then((connectionMap) => {\n        // Pokud mÃ¡me pevnÃ¡ pÅ™ipojenÃ­, vybereme adresu z nich.\n        if (NetworkType.Ethernet in connectionMap) {\n          // Pokud je klÃ­Ä� v tabulce, musÃ­ bÃ½t odpovÃ­dajÃ­cÃ­ seznam neprÃ¡zdnÃ½.\n          return this.getLeastMac(connectionMap[NetworkType.Ethernet]);\n        }\n        // Pokud jsou k dispozici bezdrÃ¡tovÃ¡ pÅ™ipojenÃ­, vybereme adresu z nich.\n        if (NetworkType.Wifi in connectionMap) {\n          // Pokud je klÃ­Ä� v tabulce, musÃ­ bÃ½t odpovÃ­dajÃ­cÃ­ seznam neprÃ¡zdnÃ½.\n          return this.getLeastMac(connectionMap[NetworkType.Wifi]);\n        }\n        // Jinak nemÃ¡me co vÃ­c Å™Ã­ct.\n        return null;\n      })\n    ));\n  }\n\n  /** @inheritdoc */\n  generate () {\n    return new Promise((resolve) => resolve(\n      this.getInfo()\n      .then((info) => this.hasher.hashObject(info))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ informace z hardwaru, ze kterÃ½ch lze generovat otisk.\n   * @private\n   * @returns {Promise.<Object>} Komponenty otisku zaÅ™Ã­zenÃ­.\n   * ZatÃ­m se pouÅ¾Ã­vajÃ­ poloÅ¾ky `mac` a `serialNumber`.\n   */\n  getInfo () {\n    return new Promise((resolve) => resolve(\n      this.findMac()\n      .then((mac) => {\n        if (isNil(mac)) {\n          // Pokud nebyla nalezena vhodnÃ¡ MAC adresa, nemÃ¡me s Ä�Ã­m pracovat a\n          // vyhodÃ­me chybu.\n          throw new Error(`Cannot find a suitable MAC address.`);\n        }\n        return (\n          this.firmwareManager.getSerialNumber()\n          .then((serialNumber) => ({mac, serialNumber}))\n        );\n      })\n    ));\n  }\n\n  /**\n   * Najde lexikograficky nejmenÅ¡Ã­ MAC adresu z danÃ½ch sÃ­Å¥ovÃ½ch pÅ™ipojenÃ­.\n   * @param {Array.<NetworkConnection>} connectionArray Seznam sÃ­Å¥ovÃ½ch pÅ™ipojenÃ­.\n   * @private\n   * @returns {string} NormalizovanÃ¡ MAC adresa.\n   */\n  getLeastMac (connectionArray) {\n    return (\n      connectionArray\n      .map((connection) => connection.getMac())\n      .map((mac) => this.normalizeMac(mac))\n      .sort()[0]\n    );\n  }\n\n  /**\n   * Normalizuje MAC adresu na spoleÄ�nÃ½ formÃ¡t, tj. dvanÃ¡ct minuskulnÃ­ch\n   * hexadecimÃ¡lnÃ­ch Ä�Ã­slic oddÄ›lenÃ½ch po dvou dvouteÄ�kou.\n   * @param {string} mac VstupnÃ­ MAC adresa.\n   * @private\n   * @returns {string} NormalizovanÃ¡ MAC adresa.\n   */\n  normalizeMac (mac) {\n    // RegulÃ¡rnÃ­ vÃ½raz pro normalizovanou MAC adresu.\n    const macRegex = /^[0-9a-f]{2}(:[0-9a-f]{2}){5}$/i;\n    if (!isString(mac) || !macRegex.test(mac)) {\n      throw new Error(`Invalid MAC address \"${mac}\".`);\n    }\n    const normalized = mac.toLowerCase();\n    return normalized;\n  }\n}\n\nexport default FingerprintHardware;\n","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport objectHash from 'object-hash';\n\n/**\n * TÅ™Ã­dÃ¡ pro hashovÃ¡nÃ­ informacÃ­ urÄ�enÃ½ch ke generovÃ¡nÃ­ otisku zaÅ™Ã­zenÃ­.\n */\nclass FingerprintHasher {\n  /**\n   * Hashuje JavaScriptovou hodnotu.\n   * @param {*} value Hodnota, kterÃ¡ se mÃ¡ hashovat.\n   * @returns {string} Å˜etÄ›zec hexadecimÃ¡lnÃ­ch Ä�Ã­slic.\n   */\n  hashObject (value) {\n    return objectHash(value, {\n      algorithm: 'sha1',\n      encoding: 'hex',\n      // NezahrnujÃ­ se funkce.\n      respectFunctionNames: false,\n      respectFunctionProperties: false,\n      // NezahrnujÃ­ se speciÃ¡lnÃ­ vlastnosti jako `prototype` apod.\n      respectType: false\n    });\n  }\n}\n\nexport default FingerprintHasher;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\n// InspirovÃ¡no vzorovÃ½m zpracovÃ¡nÃ­m\n// - https://vuejs.org/v2/guide/custom-directive.html#simplest-directive-example\nexport default {\n  inserted (el, binding) {\n    if (isNil(binding.value) || binding.value) {\n      el.focus();\n    }\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\n/**\n * NavigÃ¡tor mezi prvky na kterÃ© lze zamÄ›Å™it focus.\n * Dokumentace:\n * [HTML 5.2 Focus Specification](https://www.w3.org/TR/html52/editing.html#focus),\n * [Document.activeElement](https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement).\n */\nclass FocusNavigator {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Document} document\n   * @returns {FocusNavigator} NovÃ¡ instance.\n   */\n  constructor (document) {\n    this.document = document;\n  }\n\n  /**\n   * PÅ™enese focus na element s libovolnÃ½m offsetem.\n   * @param {number} offset PoÄ�et elementÅ¯ o kolik se mÃ¡ pÅ™ejÃ­t.\n   * @private\n   * @returns {?HTMLElement} Element na kterÃ½ byl pÅ™enesenÃ½ focus, nebo `null`.\n   */\n  change (offset) {\n    const elArray = this.queryElements();\n    const el = this.findElement(elArray, offset, {current: this.document.activeElement});\n    if (!isNil(el)) {\n      el.focus();\n    }\n    return el;\n  }\n\n  /**\n   * Najde element v poli s libovolnÃ½m offsetem od aktuÃ¡lnÃ­ho.\n   * @param {Array.<HTMLElement>} array Pole s elementy.\n   * @param {number} offset PoÄ�et elementÅ¯ o kolik se mÃ¡ pÅ™ejÃ­t.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {HTMLElement} [opts.current] AktuÃ¡lnÃ­ element v poli, od kterÃ©ho se poÄ�Ã­tÃ¡.\n   * @private\n   * @returns {?HTMLElement} Element na kterÃ½ byl pÅ™enesenÃ½ focus, nebo `null`.\n   */\n  findElement (array, offset, {current} = {}) {\n    const fromIndex = this.findFromIndex(array, {current});\n    const toIndex = this.findToIndex(fromIndex, array.length, offset);\n    if (toIndex === -1) {\n      return null;\n    }\n    return array[toIndex];\n  }\n\n  /**\n   * Najde index aktuÃ¡lnÃ­ho elementu v poli.\n   * @param {Array.<HTMLElement>} array Pole s elementy.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {HTMLElement} [opts.current] AktuÃ¡lnÃ­ element v poli, jehoÅ¾ index se hledÃ¡.\n   * @private\n   * @returns {number}\n   */\n  findFromIndex (array, {current} = {}) {\n    const index = array.indexOf(current);\n    if (index === -1) {\n      // Pokud aktuÃ¡lnÄ› focusovanÃ½ prvek nenÃ­ v seznamu akceptovanÃ½ch,\n      // pÅ™enese se focus na prvnÃ­ takovÃ½ prvek.\n      return 0;\n    }\n    return index;\n  }\n\n  /**\n   * Najde index elementu s offsetem.\n   * @param {number} current Index aktuÃ¡lnÃ­ho elementu.\n   * @param {number} length CelkovÃ½ poÄ�et elementÅ¯.\n   * @param {number} offset PoÄ�et elementÅ¯ o kolik se mÃ¡ pÅ™ejÃ­t.\n   * @private\n   * @returns {number} NalezenÃ½ index, nebo `-1`.\n   */\n  findToIndex (current, length, offset) {\n    if (length === 0) {\n      // Pokud nejsou dostupnÃ© Å¾Ã¡dnÃ© elementy, nelze nic dÄ›lat.\n      return -1;\n    }\n    if (offset < 0) {\n      // Najde index pÅ™i zÃ¡pornÃ©m offsetu.\n      return (current + length + offset) % length;\n    }\n    // Najde index pÅ™i nulovÃ©m, nebo kladnÃ©m offsetu.\n    return (current + offset) % length;\n  }\n\n  /**\n   * PÅ™enese focus na dalÅ¡Ã­ element.\n   * Emuluje chovÃ¡nÃ­ jako pÅ™i stisku klÃ¡vesy `Tab`.\n   * @returns {?HTMLElement} Element na kterÃ½ byl pÅ™enesenÃ½ focus, nebo `null`.\n   */\n  next () {\n    return this.change(1);\n  }\n\n  /**\n   * PÅ™enese focus na pÅ™edchÃ¡zejÃ­cÃ­ element.\n   * Emuluje chovÃ¡nÃ­ jako pÅ™i stisku klÃ¡ves `Shift + Tab`.\n   * @returns {?HTMLElement} Element na kterÃ½ byl pÅ™enesenÃ½ focus, nebo `null`.\n   */\n  previous () {\n    return this.change(-1);\n  }\n\n  /**\n   * VyhledÃ¡ seznam prvkÅ¯, na kterÃ© lze pÅ™enÃ©st focus.\n   * Velice zjednoduÅ¡enÃ¡ implementace, kterÃ¡ ignoruje Å™adu poÅ¾adavkÅ¯ ze specifikace, mimo jinÃ©:\n   * `<area>`, `<dialog>`, `<object>`, `<fieldset disabled>`, `tabindex`, `display`, `visibility`, `Selection`, `click`.\n   * PropracovanÄ›jÅ¡Ã­ implementaci lze nalÃ©zt tÅ™eba\n   * u [jQuery UI](https://github.com/jquery/jquery-ui/blob/0b7246b6eeadfa9e2696e22f3230f6452f8129dc/ui/focusable.js).\n   * @private\n   * @returns {Array.<Element>}\n   */\n  queryElements () {\n    return (\n      Array.from(this.document.querySelectorAll('a, button, input, select, textarea'))\n      .filter((el) => {\n        if (el.tagName.toLowerCase() === 'a') {\n          // Odkaz musÃ­ mÃ­t definovanÃ½ href.\n          return el.href;\n        }\n        // FormulÃ¡Å™ovÃ© prvky nesmÄ›jÃ­ bÃ½t disabled.\n        return !el.disabled;\n      })\n    );\n  }\n}\n\nexport default FocusNavigator;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * PrÃ¡zdnÃ¡ implementace pro platformy, kterÃ© podporujÃ­ nativnÃ­ focus.\n * @implements {FocusManager}\n */\nclass FocusNoop {\n  /** @inheritdoc */\n  start () {\n    // PrÃ¡zdnÃ¡ metoda pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /** @inheritdoc */\n  stop () {\n    // PrÃ¡zdnÃ¡ metoda pro splnÄ›nÃ­ rozhranÃ­.\n  }\n}\n\nexport default FocusNoop;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k formÃ¡tÅ¯ pro aktualizaci aplikace.\n * @enum {string}\n * @name FormatEnum\n */\nexport default {\n  HTML: 'HTML',\n  IPK: 'IPK',\n  WGT: 'WGT',\n  ZIP: 'ZIP'\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * OpravÃ¡Å™ [HTML elementÅ¯](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement).\n */\nclass HtmlElementRepairer {\n  /**\n   * ObnovÃ­ HTML element do vÃ½chozÃ­ho stavu.\n   *\n   * DÅ¯leÅ¾itÃ© je, aby bylo uvolnÄ›no maximÃ¡lnÃ­ mnoÅ¾stvÃ­ pamÄ›ti.\n   * NastavujÃ­ se pouze znÃ¡mÃ© vlastnosti danÃ©ho elementu,\n   * ostatnÃ­ jsou ignorovÃ¡ny.\n   * Atributy elementu jsou odstranÄ›ny vÅ¾dy.\n   * Do obnovenÃ­ nenÃ­ zahrnuta zmÄ›na DOM struktury a propojenÃ­ jejÃ­ch uzlÅ¯.\n   *\n   * Do obnovenÃ­ nejsou zahrnuty vlastnosti pro callback funkce jako je\n   * napÅ™. [onclick](https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onclick).\n   * UÅ¾ivatel elementu by mÄ›l vÅ¾dy vyuÅ¾Ã­vat alternativnÃ­ naslouchÃ¡nÃ­ pomocÃ­\n   * [EventTarget](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget).\n   * UÅ¾ivatel je zÃ¡roveÅˆ zodpovÄ›dnÃ½ za to,\n   * Å¾e vÅ¡echny svoje naslouchÃ¡nÃ­ pÅ™ed opravou odebere.\n   * @param {HTMLElement} el Element k opravenÃ­.\n   * @param {Object} [opts={}]\n   * @param {Array.<string>} [opts.omitAttributes=[]] Seznam nÃ¡zvÅ¯ atributÅ¯, kterÃ© pÅ™i Ä�iÅ¡tÄ›nÃ­ pÅ™eskoÄ�it.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se, jakmile je element opraven.\n   */\n  repair (el, {omitAttributes = []} = {}) {\n    return new Promise((resolve) => {\n      // Odeberou se vÅ¡echny standardnÃ­ a nestandardnÃ­ atributy.\n      // U novÄ› vytvoÅ™enÃ©ho elementu Å¾Ã¡dnÃ© atributy nejsou.\n      Array.from(el.attributes)\n      .filter((attribute) => !omitAttributes.includes(attribute.name))\n      .forEach((attribute) => {\n        el.removeAttribute(attribute.name);\n      });\n      // Reset scrollovÃ¡nÃ­ v elementu.\n      // NenÃ­ moÅ¾nÃ© pouÅ¾Ã­t metod `scroll` nebo `scrollTo`,\n      // kterÃ© nejsou na starÅ¡Ã­ch prohlÃ­Å¾eÄ�Ã­ch dostupnÃ©.\n      el.scrollLeft = 0;\n      el.scrollTop = 0;\n      return resolve();\n    });\n  }\n}\n\nexport default HtmlElementRepairer;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO PÅ™idat unit testy pro zjiÅ¡tÄ›nÃ© hodnoty u prohlÃ­Å¾eÄ�Å¯.\n// - ZatÃ­m nejde, protoÅ¾e xhr-mock nepodporuje nastavenÃ­ `responseURL`.\n// - https://github.com/jameslnewell/xhr-mock/issues/73\n/**\n * Utilita pro pÅ™Ã­pravu na zobrazenÃ­ HTML iframe elementÅ¯,\n * kterÃ¡ podporuje odliÅ¡nÃ© implementace dle protokolu preflightovanÃ© URL.\n *\n * Nefunguje ve 100% pÅ™Ã­padÅ¯:\n *\n * - NeumÃ­ detekovat zablokovÃ¡nÃ­ zobrazenÃ­ strÃ¡nky v iframe pomocÃ­\n * [HTTP hlaviÄ�ky `X-Frame-Options`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options).\n * - NeumÃ­ detekovat chybu v HTML, JS apod.\n * - Mezi preflight a zobrazenÃ­m v iframe mÅ¯Å¾e dojÃ­t ke zmÄ›nÄ› obsahu URL.\n * - Bez podpory [`XMLHttpRequest.responseURL`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseURL)\n *   jsou prÃ¡zdnÃ© soubory povaÅ¾ovÃ¡ny za neexistujÃ­cÃ­.\n *   To platÃ­ napÅ™. pro Chromium 31, kterÃ© je na SSSP 4.\n *\n * ZjiÅ¡tÄ›nÃ© hodnoty pro jednotlivÃ© prohlÃ­Å¾eÄ�e:\n *\n * - Chrome 31 non-existing file:\n *   - `{response: '', responseText: '', responseURL: undefined}`\n * - Chrome 31 existing file:\n *   - `{response: '...', responseText: '...', responseURL: undefined}`\n * - Chrome 73 non-existing file:\n *   - `{response: '', responseText: '', responseURL: ''}`\n * - Chrome 73 existing file:\n *   - `{response: '...', responseText: '...', responseURL: 'file:///...'}`\n * @implements {HtmlIframePreflighter}\n */\nclass HtmlIframePreflighterFile {\n  /**\n   * @param {XhrFetcher} xhrFetcher\n   */\n  constructor (xhrFetcher) {\n    this.xhrFetcher = xhrFetcher;\n  }\n\n  /** @inheritdoc */\n  preflight (url) {\n    // Pro file protokol je nutnÃ© pouÅ¾Ã­t `XMLHttpRequest`.\n    // Fetch API tento protokol nepodporuje.\n    return new Promise((resolve) => resolve(\n      // The HTTP request method is ignored for non-HTTP(S) URLs.\n      this.xhrFetcher.fetch(url)\n      .then((request) => {\n        // Pokud je pÅ™Ã­tomnÃ© responseURL, tak soubor urÄ�itÄ› existuje.\n        // Bez podpory responseURL, se pÅ™Ã­tomnost urÄ�uje z obsahu.\n        // Nejde pak ale rozpoznat prÃ¡zdnÃ½ a neexistujÃ­cÃ­ soubor.\n        if (!request.responseURL && !request.response) {\n          // ChybovÃ© hlÃ¡Å¡enÃ­ podobnÃ© Fetch API.\n          throw new TypeError('Failed to fetch.');\n        }\n      })\n    ));\n  }\n}\n\nexport default HtmlIframePreflighterFile;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport noop from 'lodash/noop';\n\n/**\n * Utilita pro pÅ™Ã­pravu na zobrazenÃ­ HTML iframe elementÅ¯,\n * kterÃ¡ podporuje odliÅ¡nÃ© implementace dle protokolu preflightovanÃ© URL.\n *\n * Nefunguje ve 100% pÅ™Ã­padÅ¯:\n *\n * - NeumÃ­ detekovat zablokovÃ¡nÃ­ zobrazenÃ­ strÃ¡nky v iframe pomocÃ­\n * [HTTP hlaviÄ�ky `X-Frame-Options`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options).\n * - NeumÃ­ detekovat chybu v HTML, JS apod.\n * - Mezi preflight a zobrazenÃ­m v iframe mÅ¯Å¾e dojÃ­t ke zmÄ›nÄ› obsahu URL.\n * @implements {HtmlIframePreflighter}\n */\nclass HtmlIframePreflighterHttp {\n  /** @inheritdoc */\n  preflight (url) {\n    // Pro HTTP a HTTPS protokoly se pouÅ¾ije metoda HEAD, kterÃ¡ nestahuje obsah.\n    return new Promise((resolve) => resolve(\n      fetch(url, {method: 'HEAD', mode: 'no-cors'})\n      .then(noop)\n    ));\n  }\n}\n\nexport default HtmlIframePreflighterHttp;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Utilita pro pÅ™Ã­pravu na zobrazenÃ­ HTML iframe elementÅ¯,\n * kterÃ¡ neprovÃ¡dÃ­ Å¾Ã¡dnÃ© operace.\n * PouÅ¾Ã­vÃ¡ se, kdyÅ¾ nenÃ­ Å¾Ã¡doucÃ­ provÃ¡dÄ›t preflight\n * (spamovÃ¡nÃ­ webÅ¯ dotazy, unit testy, ...).\n * @implements {HtmlIframePreflighter}\n */\nclass HtmlIframePreflighterNoop {\n  /** @inheritdoc */\n  preflight (url) {\n    return Promise.resolve();\n  }\n}\n\nexport default HtmlIframePreflighterNoop;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\n/**\n * Utilita pro pÅ™Ã­pravu na zobrazenÃ­ HTML iframe elementÅ¯,\n * kterÃ¡ podporuje odliÅ¡nÃ© implementace dle protokolu preflightovanÃ© URL.\n * TakÃ© pÅ™idÃ¡vÃ¡ podporu pro relativnÃ­ cesty.\n * @implements {HtmlIframePreflighter}\n */\nclass HtmlIframePreflighterRegistry {\n  /**\n   * @param {Class.<UriJs>} URI\n   * @param {Location} location\n   * @param {HtmlIframePreflighter} preflighterFile Preflighter pro file protokol.\n   * @param {HtmlIframePreflighter} preflighterHttp Preflighter pro HTTP(S) protokol.\n   */\n  constructor (URI, location, preflighterFile, preflighterHttp) {\n    this.URI = URI;\n    this.location = location;\n    this.preflighterMap = {\n      file: preflighterFile,\n      http: preflighterHttp,\n      https: preflighterHttp\n    };\n  }\n\n  /** @inheritdoc */\n  preflight (url) {\n    return new Promise((resolve) => {\n      const uri = new this.URI(url).absoluteTo(this.location.href);\n      const protocol = uri.protocol();\n      const preflighter = this.preflighterMap[protocol];\n      if (isNil(preflighter)) {\n        throw new TypeError(`Unknow protocol \"${protocol}\".`);\n      }\n      return resolve(\n        preflighter.preflight(uri.toString())\n      );\n    });\n  }\n}\n\nexport default HtmlIframePreflighterRegistry;\n","module.exports = __webpack_public_path__ + \"assets/91e42db1.png\";","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\nimport toPairsIn from 'lodash/toPairsIn';\n\nimport ErrorName from '../error/error-name';\n\n// TODO #266 Refaktorizovat na nÄ›co jako `new HtmlMediaError(mediaError)`.\n// - NutnÃ© napÅ™ed zavÃ©st podporu pro `extends Error` .\n/**\n * Utility pro [HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement).\n */\nclass HtmlMediaUtil {\n  /**\n   * VytvoÅ™Ã­ Error objekt na zÃ¡kladÄ› informacÃ­ z HTMLMediaElement.\n   * VyuÅ¾Ã­vÃ¡ rozhranÃ­ [MediaError](https://developer.mozilla.org/en-US/docs/Web/API/MediaError).\n   * Typicky se pouÅ¾Ã­vÃ¡ v reakci na udÃ¡lost `error`,\n   * kterÃ¡ sama o sobÄ› moc informacÃ­ neobsahuje.\n   * @param {HTMLMediaElement} el\n   * @returns {Error}\n   */\n  createError (el) {\n    const mediaError = el.error;\n    if (isNil(mediaError)) {\n      return new Error('Missing MediaError object.');\n    }\n    const message = this.getMessage(mediaError);\n    const error = new Error(message);\n    error.name = ErrorName.MediaError;\n    return error;\n  }\n\n  /**\n   * ZÃ­skÃ¡ textovou reprezentaci chybovÃ©ho kÃ³du.\n   * VyuÅ¾Ã­vÃ¡ pÅ™Ã­tomnosti popiskÅ¯ v prototypu MediaError.\n   * Je nutnÃ© iterovat pÅ™es error objekt,\n   * prototoÅ¾e prototyp obsahuje takÃ© gettery.\n   * @param {MediaError} error\n   * @private\n   * @returns {string}\n   */\n  getCode (error) {\n    const codeKey = 'code';\n    const codeValue = error[codeKey];\n    const entries = toPairsIn(error);\n    const foundEntry = entries.find(([key, value]) => value === codeValue && key !== codeKey);\n    if (isNil(foundEntry)) {\n      return `Code ${codeValue}.`;\n    }\n    return foundEntry[0];\n  }\n\n  /**\n   * ZÃ­skÃ¡ textovou reprezentaci chybovÃ©ho objektu.\n   * @param {MediaError} error\n   * @private\n   * @returns {string}\n   */\n  getMessage (error) {\n    const codeText = this.getCode(error);\n    const {message} = error;\n    // AÄ�koliv to specifikace nepÅ™ipouÅ¡Ã­, Chromium 31 vracÃ­ undefined.\n    if (isNil(message) || !message.length) {\n      return codeText;\n    }\n    return `${codeText} ${message}`;\n  }\n}\n\nexport default HtmlMediaUtil;\n","module.exports = __webpack_public_path__ + \"assets/6f0b124e.mp4\";","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\n/**\n * OpravÃ¡Å™ [HTML video elementÅ¯](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement).\n */\nclass HtmlVideoRepairer {\n  /**\n   * @param {string} blankSrc Zdroj videa reprezentujÃ­cÃ­ prÃ¡zdnÃ½ obsah.\n   * NÄ›kterÃ© platformy majÃ­ problÃ©m s ruÅ¡enÃ­m `src`,\n   * takÅ¾e se mÃ­sto toho nastavuje toto video.\n   * @param {HtmlElementRepairer} elementRepairer\n   * @param {HtmlMediaUtil} mediaUtil\n   */\n  constructor (blankSrc, elementRepairer, mediaUtil) {\n    this.blankSrc = blankSrc;\n    this.elementRepairer = elementRepairer;\n    this.mediaUtil = mediaUtil;\n  }\n\n  // TODO Podporovat opravu source a track elementÅ¯.\n  /**\n   * ObnovÃ­ DOM element do vÃ½chozÃ­ho stavu.\n   * Za vÃ½chozÃ­ se povaÅ¾uje stav,\n   * ve kterÃ©m je element po volÃ¡nÃ­ `document.createElement('video')`.\n   *\n   * DÅ¯leÅ¾itÃ© je, aby bylo uvolnÄ›no maximÃ¡lnÃ­ mnoÅ¾stvÃ­ pamÄ›ti.\n   * NastavujÃ­ se pouze znÃ¡mÃ© vlastnosti danÃ©ho elementu,\n   * ostatnÃ­ jsou ignorovÃ¡ny.\n   * Atributy elementu jsou odstranÄ›ny vÅ¾dy.\n   * Do obnovenÃ­ nenÃ­ zahrnuta zmÄ›na DOM struktury a propojenÃ­ jejÃ­ch uzlÅ¯,\n   * kromÄ› odebrÃ¡nÃ­ pÅ™Ã­mÃ½ch potomkÅ¯\n   * [source elementÅ¯](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source).\n   *\n   * Do obnovenÃ­ nejsou zahrnuty vlastnosti pro callback funkce jako je\n   * napÅ™. [onclick](https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onclick).\n   * UÅ¾ivatel elementu by mÄ›l vÅ¾dy vyuÅ¾Ã­vat alternativnÃ­ naslouchÃ¡nÃ­ pomocÃ­\n   * [EventTarget](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget).\n   * UÅ¾ivatel je zÃ¡roveÅˆ zodpovÄ›dnÃ½ za to,\n   * Å¾e vÅ¡echny svoje naslouchÃ¡nÃ­ pÅ™ed opravou odebere.\n   *\n   * Neopravuje vlastnost [src](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/src),\n   * protoÅ¾e nÄ›kterÃ© platformy (SSSP4) majÃ­ problÃ©my s ruÅ¡enÃ­m `src` u video elementÅ¯.\n   * MÃ­sto toho je `src` nastaveno na \"blank\" video tj. co nejmenÅ¡Ã­ lokÃ¡lnÄ› uloÅ¾enÃ© video.\n   * Ve vÃ½chozÃ­m stavu se pouÅ¾Ã­vÃ¡ Ä�ernÃ© MP4 video s vteÅ™inovou dobou pÅ™ehrÃ¡vÃ¡nÃ­.\n   * Video bylo vytvoÅ™eno pomocÃ­ ffmpeg nÃ¡sledujÃ­cÃ­m pÅ™Ã­kazem:\n   * `ffmpeg -t 1 -f lavfi -i color=c=black:s=160x120 -c:v libx264 -tune stillimage -pix_fmt yuv420p output.mp4`\n   *\n   * NeumÃ­ opravit vlastnost\n   * [currentSrc](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/currentSrc).\n   * PÅ™i prvnÃ­m pouÅ¾itÃ­ je `\"\"`, po opravenÃ­ bude nastaveno na \"blank\" video.\n   * NovÃ© Chrome (verze 72) opravu provedou sprÃ¡vnÄ›,\n   * ale starÅ¡Ã­ (verze 31) bohuÅ¾el ne.\n   *\n   * NeumÃ­ opravit vlastnost\n   * [networkState](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/networkState).\n   * PÅ™i prvnÃ­m pouÅ¾itÃ­ je `NETWORK_EMPTY`,\n   * po opravenÃ­ je `NETWORK_NO_SOURCE`.\n   *\n   * NeumÃ­ opravit\n   * [track elementy](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track).\n   * @param {HTMLMediaElement} el Element k opravenÃ­.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se, jakmile je element opraven.\n   */\n  repair (el) {\n    // U atributÅ¯ se spolÃ©ha na to, Å¾e jsou odstranÄ›ny v HtmlElementRepairer.\n    // - autoplay, controls, loop, muted, preload\n    return new Promise((resolve) => resolve(\n      this.repairSources(el)\n      .then(() => this.repairSrc(el))\n      .then(() => this.repairSrcObject(el))\n      .then(() => {\n        el.defaultPlaybackRate = 1;\n        el.muted = false;\n        el.playbackRate = 1;\n        el.volume = 1;\n      })\n      .then(() => this.elementRepairer.repair(el, {omitAttributes: ['src']}))\n    ));\n  }\n\n  /**\n   * ZruÅ¡Ã­ elementy <source>, pokud se v elementu el nachÃ¡zÃ­\n   * @param {HTMLMediaElement} el\n   * @private\n   * @returns {Promise.<undefined>}\n   */\n  repairSources (el) {\n    return new Promise((resolve) => resolve(\n      Array.from(el.childNodes)\n      .filter((node) => node.tagName === 'SOURCE')\n      .forEach((item) => item.remove())\n    ));\n  }\n\n  /**\n   * ZruÅ¡Ã­ vlastnost `src`, pokud ji mÃ¡ element nastavenou.\n   * @param {HTMLMediaElement} el\n   * @private\n   * @returns {Promise.<undefined>}\n   */\n  repairSrc (el) {\n    let onCanplay;\n    let onError;\n    return (\n      new Promise((resolve, reject) => {\n        const {blankSrc} = this;\n        if (!el.hasAttribute('src') || el.src === blankSrc) {\n          return resolve();\n        }\n        onCanplay = () => resolve();\n        onError = () => reject(this.mediaUtil.createError(el));\n        el.addEventListener('canplay', onCanplay);\n        el.addEventListener('error', onError);\n        el.src = blankSrc;\n        el.load();\n      })\n      .finally(() => {\n        el.removeEventListener('canplay', onCanplay);\n        el.removeEventListener('error', onError);\n      })\n    );\n  }\n\n  /**\n   * ZruÅ¡Ã­ vlastnost `srcObject`, pokud ji mÃ¡ element nastavenou.\n   * [Zdroj](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/stop#Stopping_a_video_stream).\n   * @param {HTMLMediaElement} el\n   * @private\n   * @returns {Promise.<undefined>}\n   */\n  repairSrcObject (el) {\n    return new Promise((resolve) => {\n      const {srcObject} = el;\n      if (isNil(srcObject)) {\n        return resolve();\n      }\n      if (srcObject instanceof MediaStream) {\n        srcObject.getTracks()\n        .forEach((track) => {\n          track.stop();\n        });\n        el.srcObject = null;\n        return resolve();\n      }\n      throw new Error(`Unknown srcObject \"${srcObject}\".`);\n    });\n  }\n}\n\nexport default HtmlVideoRepairer;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * iCalendar frekvence opakovÃ¡nÃ­ udÃ¡losti\n *\n * Zdroje:\n * - [freq v iCalendar Recurrence Rule](https://tools.ietf.org/html/rfc5545#section-3.3.10)\n * @enum {string}\n */\nconst IcalFreq = {\n  Secondly: 'SECONDLY',\n  Minutely: 'MINUTELY',\n  Hourly: 'HOURLY',\n  Daily: 'DAILY',\n  Weekly: 'WEEKLY',\n  Monthly: 'MONTHLY',\n  Yearly: 'YEARLY'\n};\n\nexport default IcalFreq;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO IoC/DI\nimport IcalExpander from 'ical-expander';\n\n// TODO IoC/DI\nimport config from '../../config';\n\n// TODO Hotfix nefunkÄ�nÃ­ho plÃ¡novÃ¡nÃ­ se zmÄ›nami instancÃ­ opakovÃ¡nÃ­.\n// - https://github.com/mifi/ical-expander/issues/14\n// - VyÅ™eÅ¡ilo se pÅ™idÃ¡nÃ­m \"ical.js\": \"^1.4.0\" do \"resolutions\" v \"package.json\".\n/**\n * PlÃ¡novaÄ� iCalendar udÃ¡lostÃ­\n *\n * Zdroje:\n * - [ical.js issue - expanding repeating event](https://github.com/mozilla-comm/ical.js/issues/285)\n * - [ical-expander](https://github.com/mifi/ical-expander)\n */\nclass IcalPlanner {\n  /** VytvoÅ™Ã­ instanci. */\n  constructor () {\n    // TODO IoC/DI + konfigurace v testech, kterÃ© na nÃ­ zÃ¡leÅ¾Ã­\n    this.maxIterations = config.icalPlannerMaxIterations;\n  }\n\n  /**\n   * ZjistÃ­, jestli je v kalendÃ¡Å™i nÄ›jakÃ¡ aktivnÃ­ udÃ¡lost pro datum na vstupu.\n   * @param {string} ical Å˜etÄ›zec s iCalendar dle RFC 5545\n   * @param {Date} date Datum pro kterÃ© hledat udÃ¡lost\n   * @returns {boolean}\n   */\n  hasEventOnDate (ical, date) {\n    // Inicializace API pro vyhledÃ¡vÃ¡nÃ­ udÃ¡lostÃ­ dle Ä�asu\n    const expander = new IcalExpander({ics: ical, maxIterations: this.maxIterations});\n    // VyhledÃ¡nÃ­ udÃ¡lostÃ­ v jedinÃ½ okamÅ¾Ã­k (od = do)\n    const match = expander.between(date, date);\n    // VrÃ¡tÃ­ true, pokud existuje alespoÅˆ jedna udÃ¡lost, nebo vÃ½skyt opakovÃ¡nÃ­.\n    return Boolean(match.events.length || match.occurrences.length);\n  }\n}\n\nexport default IcalPlanner;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport IcalWeekday from './ical-weekday';\n\n/**\n * Utility pro formÃ¡t iCalendar\n */\nclass IcalUtil {\n  /**\n   * @param {IcalApi} ICAL\n   */\n  constructor (ICAL) {\n    this.ICAL = ICAL;\n  }\n\n  // TODO Jak lÃ©pe pÅ™idat EXDATE?\n  // - PÅ™i pouÅ¾itÃ­ addPropertyWithValue nelze pÅ™idat vÃ­ce hodnot.\n  // - https://github.com/mozilla-comm/ical.js/issues/436\n  /**\n   * VytvoÅ™Ã­ EXDATE s vÃ­ce datumy oddÄ›lenÃ½mi Ä�Ã¡rkou.\n   * @param {Array.<IcalApi.Time>} times\n   * @returns {IcalApi.Property}\n   */\n  createExdateProperty (times) {\n    const strings = times.map((time) => time.toICALString());\n    return new this.ICAL.Property(['exdate', {}, 'date-time', ...strings]);\n  }\n\n  /**\n   * VytvoÅ™Ã­ VCALENDAR s pohodlnÄ›jÅ¡Ã­m API.\n   *\n   * DÅ¯vody:\n   * - JednotnÃ© poÅ™adÃ­ poloÅ¾ek na vÃ½stupu, bez ohledu poÅ™adÃ­ vstupÅ¯.\n   * - Immutable pÅ™Ã­stup k vytvÃ¡Å™enÃ­ udÃ¡lostÃ­,\n   *   neÅ¾ postupnÃ© pÅ™idÃ¡vÃ¡nÃ­ hodnot do jiÅ¾ vytvoÅ™enÃ©ho objektu.\n   * @param {Object} opts\n   * @param {string} opts.prodid\n   * @param {Array.<IcalApi.Component>} [opts.subcomponents]\n   * @param {string} opts.version\n   * @returns {IcalApi.Component}\n   */\n  createVCalendar ({prodid, subcomponents = [], version}) {\n    const vcalendar = new this.ICAL.Component(['vcalendar', [], []]);\n    vcalendar.updatePropertyWithValue('version', version);\n    vcalendar.updatePropertyWithValue('prodid', prodid);\n    subcomponents.forEach((subcomponent) => {\n      vcalendar.addSubcomponent(subcomponent);\n    });\n    return vcalendar;\n  }\n\n  /**\n   * VytvoÅ™Ã­ VEVENT s pohodlnÄ›jÅ¡Ã­m API.\n   *\n   * DÅ¯vody:\n   * - ICAL nemÃ¡ vhodnÄ› oÅ¡etÅ™enu rekaci na vstupy jako `\"\"` a `[]`.\n   *   VytvÃ¡Å™Ã­ prÃ¡zdnÃ© komponenty, nebo vyhazuje chyby.\n   *   Tato metoda takovÃ© vstupy povaÅ¾uje za nevyplnÄ›nÃ© poloÅ¾ky.\n   * - JednotnÃ© poÅ™adÃ­ poloÅ¾ek na vÃ½stupu, bez ohledu poÅ™adÃ­ vstupÅ¯.\n   * - Immutable pÅ™Ã­stup k vytvÃ¡Å™enÃ­ udÃ¡lostÃ­,\n   *   neÅ¾ postupnÃ© pÅ™idÃ¡vÃ¡nÃ­ hodnot do jiÅ¾ vytvoÅ™enÃ©ho objektu.\n   * @param {Object} opts\n   * @param {IcalApi.Time} opts.endDate\n   * @param {Array.<IcalApi.Time>} [opts.excludedDates]\n   * @param {IcalApi.Recur} [opts.recur]\n   * @param {IcalApi.Time} [opts.recurrenceDate]\n   * @param {IcalApi.Time} opts.stamp\n   * @param {IcalApi.Time} opts.startDate\n   * @param {string} [opts.summary]\n   * @param {string} opts.uid\n   * @returns {IcalApi.Component}\n   */\n  createVEvent ({\n    endDate,\n    excludedDates = [],\n    recur,\n    recurrenceDate,\n    stamp,\n    startDate,\n    summary = '',\n    uid\n  }) {\n    const {ICAL} = this;\n    const vevent = new ICAL.Component('vevent');\n    const ievent = new ICAL.Event(vevent);\n    ievent.uid = uid;\n    vevent.addPropertyWithValue('dtstamp', stamp);\n    ievent.startDate = startDate;\n    ievent.endDate = endDate;\n    if (!isNil(recur)) {\n      vevent.addPropertyWithValue('rrule', recur);\n    }\n    if (excludedDates.length) {\n      const property = this.createExdateProperty(excludedDates);\n      vevent.addProperty(property);\n    }\n    if (!isNil(recurrenceDate)) {\n      ievent.recurrenceId = recurrenceDate;\n    }\n    if (summary.length) {\n      ievent.summary = summary;\n    }\n    return vevent;\n  }\n\n  // TODO ProÄ� nenÃ­ dostupnÃ½ `ICAL.Time.fromUnixTime`?\n  // - https://github.com/mozilla-comm/ical.js/issues/435\n  /**\n   * VytvoÅ™Ã­ ICAL reprezentaci data a Ä�asu z UNIX Ä�asu.\n   * Tato metoda nepochopitelnÄ› chybÃ­ v `ICAL.Time.fromUnixTime`.\n   * Je pÅ™Ã­tomnÃ¡ pouze jako metoda u vytvoÅ™enÃ© instance.\n   * U ostatnÃ­ch `from*` jsou statickÃ© metody pÅ™Ã­tomnÃ©.\n   * @param {number} unixTime UNIX Ä�as [s]\n   * @returns {IcalApi.Time}\n   */\n  fromUnixTime (unixTime) {\n    const {ICAL} = this;\n    const icalTime = new ICAL.Time();\n    icalTime.fromUnixTime(unixTime);\n    // TODO PouÅ¾itÃ­ nedokumentovanÃ© hodnoty timezone.\n    // TODO VynucenÃ­ zahozenÃ­ timezone.\n    return new ICAL.Time({...icalTime.toJSON(), timezone: null});\n  }\n\n  /**\n   * PÅ™evede JS den v tÃ½dnu na iCalendar den v tÃ½dnu,\n   * pro pouÅ¾itÃ­ u opakovanÃ½ch udÃ¡lostÃ­.\n   * @param {number} jsWeekday JS formÃ¡t: 0 = Sunday, 1 = Monday, ...,\n   * 6 = Saturday\n   * @returns {IcalWeekday}\n   */\n  parseRecurDay (jsWeekday) {\n    switch (jsWeekday) {\n      case 0:\n        return IcalWeekday.Sunday;\n      case 1:\n        return IcalWeekday.Monday;\n      case 2:\n        return IcalWeekday.Tuesday;\n      case 3:\n        return IcalWeekday.Wednesday;\n      case 4:\n        return IcalWeekday.Thursday;\n      case 5:\n        return IcalWeekday.Friday;\n      case 6:\n        return IcalWeekday.Saturday;\n      default:\n        throw new RangeError('Unknown day');\n    }\n  }\n}\n\nexport default IcalUtil;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * iCalendar den v tÃ½dnu\n *\n * Zdroje:\n * - [weekday v iCalendar Recurrence Rule](https://tools.ietf.org/html/rfc5545#section-3.3.10)\n * @enum {string}\n */\nconst IcalWeekday = {\n  Sunday: 'SU',\n  Monday: 'MO',\n  Tuesday: 'TU',\n  Wednesday: 'WE',\n  Thursday: 'TH',\n  Friday: 'FR',\n  Saturday: 'SA'\n};\n\nexport default IcalWeekday;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * GenerÃ¡tor nÃ¡hodnÃ½ch identifikÃ¡torÅ¯ objektÅ¯.\n */\nclass IdGenerator {\n  /**\n   * @param {NanoidModule} nanoid\n   */\n  constructor (nanoid) {\n    this.nanoid = nanoid;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ nÃ¡hodnÃ½ identifikÃ¡tor.\n   * PovolenÃ© znaky: 0-9, A-Z, a-z, podtrÅ¾Ã­tko a pomlÄ�ka\n   * Entropie (mnoÅ¾stvÃ­ moÅ¾nÃ½ch id) by mÄ›la bÃ½t podobnÃ¡ jako u UUID.\n   * @returns {string}\n   */\n  generate () {\n    return this.nanoid.nanoid();\n  }\n}\n\nexport default IdGenerator;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\n\n/**\n * Typ mÃ©dia obrÃ¡zek s podporou pÅ™ehrÃ¡vÃ¡nÃ­ v offline stavu pomocÃ­ `file://` URL.\n * ObrÃ¡zek se stÃ¡hne z URL v sÃ­ti a pak se zobrazuje z lokÃ¡lnÃ­ho ÃºloÅ¾iÅ¡tÄ›.\n * D9ky tomu lze obrÃ¡zek zobrazovat v online i offline stavu.\n * @implements {ViewerType}\n */\nclass ImageFileViewerType {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {ImageViewerControllerFactory} controllerFactory\n   * @param {ViewerSourceCreator} sourceCreator\n   */\n  constructor (controllerFactory, sourceCreator) {\n    this.controllerFactory = controllerFactory;\n    this.sourceCreator = sourceCreator;\n  }\n\n  /** @inheritdoc */\n  createController () {\n    return this.controllerFactory.create();\n  }\n\n  /** @inheritdoc */\n  getSourceCreator () {\n    return this.sourceCreator;\n  }\n\n  /** @inheritdoc */\n  getUrl (medium) {\n    return get(medium.asset, 'fileUrl', null);\n  }\n\n  /** @inheritdoc */\n  isExtractable () {\n    return false;\n  }\n\n  /** @inheritdoc */\n  isOfflineable () {\n    return true;\n  }\n\n  /** @inheritdoc */\n  isPreloadable (medium) {\n    return true;\n  }\n}\n\nexport default ImageFileViewerType;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na ovladaÄ�e pro zobrazovÃ¡nÃ­ obrÃ¡zkovÃ½ch souborÅ¯.\n */\nclass ImageViewerControllerFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<ImageViewerController>} ImageViewerController\n   * @param {ViewerLifeCycleFactory} lifeCycleFactory\n   */\n  constructor (ImageViewerController, lifeCycleFactory) {\n    this.ImageViewerController = ImageViewerController;\n    this.lifeCycleFactory = lifeCycleFactory;\n  }\n\n  /**\n   * VytvoÅ™Ã­ ovladaÄ�.\n   * @returns {ImageViewerController}\n   */\n  create () {\n    return new this.ImageViewerController(this.lifeCycleFactory);\n  }\n}\n\nexport default ImageViewerControllerFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\n\nimport StretchEnum from '../stretch/stretch-enum';\n\n/**\n * OvladaÄ� pro zobrazovÃ¡nÃ­ obrÃ¡zkovÃ½ch souborÅ¯.\n * NamÃ­sto standardnÃ­ho zobrazovÃ¡nÃ­ v `<img>`, provÃ¡dÃ­ ovladaÄ� zobrazenÃ­\n * obrÃ¡zkÅ¯ jako CSS background-image na obyÄ�ejnÃ©m `<div>`.\n * Tento pÅ™Ã­stup byl zvolen, protoÅ¾e mÃ¡ lepÅ¡Ã­ vÃ½kon.\n * U naÄ�Ã­tÃ¡nÃ­ `<img>` na starÅ¡Ã­ch zaÅ™Ã­zenÃ­ch dochÃ¡zÃ­ k chvilkovÃ©mu zaseknunÃ­\n * vykreslovÃ¡nÃ­ prohlÃ­Å¾eÄ�e, coÅ¾ vadÃ­ u vÃ½konu zobrazovanÃ½ch mÃ©diÃ­.\n * ProblÃ©m je viditelnÃ½ pÅ™edevÅ¡Ã­m na animacÃ­ch typu marqee.\n * KvÅ¯li omezenÃ­m CSS neumÃ­ ovladaÄ� detekovat dokonÄ�enÃ­ naÄ�tenÃ­ obrÃ¡zku,\n * udÃ¡lost se vyvolÃ¡ ihned po zaÄ�Ã¡tku naÄ�Ã­tÃ¡nÃ­.\n * TakÃ© se neprovÃ¡dÃ­ Å¾Ã¡dnÃ¡ detekce selhÃ¡nÃ­ pÅ™i naÄ�Ã­tÃ¡nÃ­ obrÃ¡zku.\n * @implements {ViewerController}\n */\nclass ImageViewerController {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {ViewerLifeCycleFactory} lifeCycleFactory\n   */\n  constructor (lifeCycleFactory) {\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    this.scheduleInfo = null;\n    this.viewerLifeCycle = lifeCycleFactory.create();\n    this.viewerSource = null;\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // PrÃ¡zdnÃ¡ metoda pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /** @inheritdoc */\n  enter () {\n    return this.viewerLifeCycle.enter(() => {\n      // ZobrazenÃ­ obalujÃ­cÃ­ho elementu.\n      const viewerFrame = this.viewerSource.getFrame();\n      viewerFrame.enter();\n    });\n  }\n\n  /**\n   * UrÄ�Ã­ CSS tÅ™Ã­du s roztaÅ¾enÃ­m, kterÃ¡ se mÃ¡ pÅ™iÅ™adit elementu.\n   * @param {StretchEnum} stretchEnum\n   * @private\n   * @returns {string} NÃ¡zev CSS tÅ™Ã­dy.\n   */\n  getStretchClassName (stretchEnum) {\n    switch (stretchEnum) {\n      case StretchEnum.CONTAIN:\n        return 'image-viewer-controller--stretch-contain';\n      case StretchEnum.COVER:\n        return 'image-viewer-controller--stretch-cover';\n      case StretchEnum.FILL:\n        return 'image-viewer-controller--stretch-fill';\n      default:\n        throw new Error(`Invalid stretch \"${stretchEnum}\".`);\n    }\n  }\n\n  /** @inheritdoc */\n  leave () {\n    return this.viewerLifeCycle.leave(() => {\n      // SkrytÃ­ obalujÃ­cÃ­ho elementu.\n      const viewerFrame = this.viewerSource.getFrame();\n      viewerFrame.leave();\n    });\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /** @inheritdoc */\n  release () {\n    return this.viewerLifeCycle.release(() => {\n      const {viewerSource} = this;\n      // UvolnÄ›nÃ­ obalujÃ­cÃ­ho elementu.\n      const viewerFrame = viewerSource.getFrame();\n      viewerFrame.release();\n      // ZruÅ¡enÃ­ hodnot v instanci.\n      this.scheduleInfo = null;\n      this.viewerSource = null;\n    });\n  }\n\n  /** @inheritdoc */\n  seize (scheduleInfo, viewerSource) {\n    return this.viewerLifeCycle.seize(() => {\n      // NastavenÃ­ zÃ¡kladnÃ­ch hodnot.\n      this.scheduleInfo = scheduleInfo;\n      this.viewerSource = viewerSource;\n      // UrÄ�enÃ­ vÅ¡ech potÅ™ebnÃ½ch hodnot.\n      const stretchEnum = scheduleInfo.getStretchEnum();\n      const url = scheduleInfo.getUrl();\n      const el = viewerSource.getEl();\n      const viewerFrame = viewerSource.getFrame();\n      const stretchClassName = this.getStretchClassName(stretchEnum);\n      // PÅ™Ã­prava obalujÃ­cÃ­ho elementu.\n      viewerFrame.seize(scheduleInfo);\n      // PÅ™Ã­prava zdrojovÃ©ho elementu.\n      el.classList.add('image-viewer-controller', stretchClassName);\n      // NastavenÃ­ zdroje.\n      el.style.backgroundImage = `url(\"${url}\")`;\n      // U CSS pozadÃ­ nelze sledovat okamÅ¾ik dokonÄ�enÃ­.\n      // UdÃ¡lost se tedy vyvolÃ¡ alespoÅˆ ihned,\n      // i kdyÅ¾ moÅ¾nÃ¡ nenÃ­ naÄ�tenÃ­ provedeno.\n      this.emitter.emit('loaded');\n    });\n  }\n}\n\nexport default ImageViewerController;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ViewerControllerIframe from '../viewer/controller/viewer-controller-iframe';\n\n/**\n * @implements {ViewerType}\n */\nclass KioskViewerType {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {number} loadDelay\n   * @param {HtmlIframePreflighter} preflighter\n   * @param {ViewerSourceCreator} sourceCreator\n   */\n  constructor (loadDelay, preflighter, sourceCreator) {\n    this.loadDelay = loadDelay;\n    this.preflighter = preflighter;\n    this.sourceCreator = sourceCreator;\n  }\n\n  /** @inheritdoc */\n  createController () {\n    return new ViewerControllerIframe(this.loadDelay, this.preflighter, {scroll: true});\n  }\n\n  /** @inheritdoc */\n  getSourceCreator () {\n    return this.sourceCreator;\n  }\n\n  /** @inheritdoc */\n  getUrl (medium) {\n    return medium.url;\n  }\n\n  /** @inheritdoc */\n  isExtractable () {\n    return false;\n  }\n\n  /** @inheritdoc */\n  isOfflineable () {\n    return false;\n  }\n\n  /** @inheritdoc */\n  isPreloadable (medium) {\n    // U kioskÅ¯ se moc nepoÄ�Ã­tÃ¡ s tÃ­m, Å¾e by byly spuÅ¡tÄ›nÃ© nÄ›kde na pozadÃ­.\n    // DÄ›lÃ¡ to problÃ©my pÅ™i naslouchÃ¡nÃ­ na udÃ¡losti, napÅ™. udÃ¡losti ovlÃ¡dÃ¡nÃ­.\n    // Byl Å™eÅ¡en problÃ©m s autofocus, kterÃ½ se nechoval pÅ™i preloadu sprÃ¡vnÄ›.\n    // TakÃ© nelze jednoduÅ¡e vypnout zvuky, kterÃ© mohou vznikat.\n    // Proto je preload zakÃ¡zanÃ½.\n    return false;\n  }\n}\n\nexport default KioskViewerType;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport FormatEnum from '../../format-enum';\nimport UpdatePlatform from '../../update/update-platform';\nimport Platform from '../../../platform/platform';\n\n/**\n * SprÃ¡vce aplikace pro Ki-Wi Lighter API.\n * @implements {AppManager}\n */\nclass KiwiLighter1AppManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {KiwiLighterApiAppManager} lighterApp\n   * @param {KiwiLighter1PromisifyLighter} promisify\n   */\n  constructor (lighterApp, promisify) {\n    this.lighterApp = lighterApp;\n    this.promisify = promisify;\n  }\n\n  /** @inheritdoc */\n  exit () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterApp, 'exit')()\n    ));\n  }\n\n  /** @inheritdoc */\n  finishUpdate () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterApp, 'finishUpdate')()\n    ));\n  }\n\n  /** @inheritdoc */\n  getBuildPlatform () {\n    return Promise.resolve(Platform.KiwiLighter1);\n  }\n\n  /** @inheritdoc */\n  getFormat () {\n    return Promise.resolve(FormatEnum.WGT);\n  }\n\n  /** @inheritdoc */\n  getRuntimePlatform () {\n    return Promise.resolve(Platform.KiwiLighter1);\n  }\n\n  /** @inheritdoc */\n  getUpdatePlatform () {\n    return Promise.resolve(UpdatePlatform.KiwiLighter1);\n  }\n\n  /** @inheritdoc */\n  getUpdateUrl () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterApp, 'getUpdateUrl')()\n    ));\n  }\n\n  /** @inheritdoc */\n  update (url) {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterApp, 'update')(url)\n    ));\n  }\n}\n\nexport default KiwiLighter1AppManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * SprÃ¡vce boot aplikace, kterÃ½ se spuÅ¡tÃ­ pÅ™ed hlavnÃ­ aplikacÃ­.\n * MÃ¡ za Ãºkol pÅ™ipravit prostÅ™edÃ­ do stavu, ve kterÃ©m by se mohla hlavnÃ­\n * aplikace spustit.\n * @implements {Destroyable}\n */\nclass KiwiLighter1BootManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {number} delay MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na Cordova deviceready.\n   * @param {Document} document\n   */\n  constructor (delay, document) {\n    this.delay = delay;\n    this.document = document;\n    this.onDeviceReady = this.onDeviceReady.bind(this);\n    this.onTimeout = this.onTimeout.bind(this);\n    this.reject = null;\n    this.resolve = null;\n    this.started = false;\n    this.timeout = null;\n  }\n\n  /**\n   * Provede boot aplikace. Po dokonÄ�enÃ­ boot lze spustit hlavnÃ­ aplkaci.\n   * @returns {Promise.<undefined>}\n   */\n  boot () {\n    return new Promise((resolve, reject) => {\n      if (this.started) {\n        throw new Error(`Already started.`);\n      }\n      this.started = true;\n      this.reject = reject;\n      this.resolve = resolve;\n      this.document.addEventListener('deviceready', this.onDeviceReady);\n      setTimeout(this.onTimeout, this.delay);\n    });\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    clearTimeout(this.timeout);\n    this.document.removeEventListener('deviceready', this.onDeviceReady);\n  }\n\n  /**\n   * Reakce na vyvolÃ¡nÃ­ udÃ¡losti `deviceready`.\n   * @private\n   * @returns {undefined}\n   */\n  onDeviceReady () {\n    this.destroy();\n    this.resolve();\n  }\n\n  /**\n   * Reakce na uplynutÃ­ Ä�asovaÄ�e s maximÃ¡lnÃ­ dobou Ä�ekÃ¡nÃ­.\n   * @private\n   * @returns {undefined}\n   */\n  onTimeout () {\n    this.destroy();\n    const error = new Error(`Waiting for deviceready has timed out.`);\n    this.reject(error);\n  }\n}\n\nexport default KiwiLighter1BootManager;\n","module.exports = __webpack_public_path__ + \"config.xml\";","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * NaslouchaÄ� udÃ¡lostem v ovlÃ¡dÃ¡nÃ­ pro Ki-Wi Lighter API.\n * @implements {ControlListener}\n */\nclass KiwiLighter1ControlListener {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {EventTarget} eventTarget Zdroj udÃ¡lostÃ­ z Ki-Wi Lighter API.\n   * @param {KiwiLighter1ControlParser} parser PÅ™evadÄ›Ä� kÃ³dÅ¯ tlaÄ�Ã­tek na Ä�Ã­selnÃ­k.\n   */\n  constructor (eventTarget, parser) {\n    this.eventTarget = eventTarget;\n    this.listenerMap = new Map();\n    this.parser = parser;\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // PrÃ¡zdnÃ¡ metoda pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /** @inheritdoc */\n  off (type, callback) {\n    const {listenerMap} = this;\n    // ZatÃ­m je podporovÃ¡na pouze udÃ¡lost buttonDown, ostatnÃ­ jsou ignorovÃ¡ny.\n    if (type !== 'buttonDown') {\n      return;\n    }\n    // OdebÃ­rÃ¡nÃ­ neexistujÃ­cÃ­ch callbackÅ¯ je ignorovÃ¡no.\n    if (!listenerMap.has(callback)) {\n      return;\n    }\n    // VyhledÃ¡ se odpovÃ­dajÃ­cÃ­ listener a odregistruje se.\n    const listener = listenerMap.get(callback);\n    listenerMap.delete(callback);\n    return this.eventTarget.removeEventListener('kiwiControl.buttonDown', listener);\n  }\n\n  /** @inheritdoc */\n  on (type, callback) {\n    const {listenerMap} = this;\n    // ZatÃ­m je podporovÃ¡na pouze udÃ¡lost buttonDown, ostatnÃ­ jsou ignorovÃ¡ny.\n    if (type !== 'buttonDown') {\n      return;\n    }\n    // OpakovanÃ© pÅ™idÃ¡nÃ­ stejnÃ©ho callbacku je ignorovÃ¡no.\n    if (listenerMap.has(callback)) {\n      return;\n    }\n    // VytvoÅ™Ã­ se novÃ½ listener a zaregistruje se.\n    const listener = (event) => {\n      const controlButton = this.parser.parseKeyCode(event.detail.button);\n      if (!controlButton) {\n        return;\n      }\n      return callback(controlButton);\n    };\n    listenerMap.set(callback, listener);\n    return this.eventTarget.addEventListener('kiwiControl.buttonDown', listener);\n  }\n}\n\nexport default KiwiLighter1ControlListener;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * SprÃ¡vce ovlÃ¡dÃ¡nÃ­ pro Ki-Wi Lighter API.\n * @implements {ControlManager}\n */\nclass KiwiLighter1ControlManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {KiwiLighterApiControlManager} lighterControl\n   * @param {ControlListener} listener NaslouchaÄ� udÃ¡lostem v ovlÃ¡dÃ¡nÃ­.\n   * @param {KiwiLighter1PromisifyLighter} promisify\n   */\n  constructor (lighterControl, listener, promisify) {\n    this.lighterControl = lighterControl;\n    this.listener = listener;\n    this.promisify = promisify;\n  }\n\n  /** @inheritdoc */\n  getLocalLock () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterControl, 'getLocalLock')()\n    ));\n  }\n\n  /** @inheritdoc */\n  getRemoteLock () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterControl, 'getRemoteLock')()\n    ));\n  }\n\n  /** @inheritdoc */\n  off (type, callback) {\n    this.listener.off(type, callback);\n  }\n\n  /** @inheritdoc */\n  on (type, callback) {\n    this.listener.on(type, callback);\n  }\n\n  /** @inheritdoc */\n  setLocalLock (lock) {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterControl, 'setLocalLock')(lock)\n    ));\n  }\n\n  /** @inheritdoc */\n  setRemoteLock (lock) {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterControl, 'setRemoteLock')(lock)\n    ));\n  }\n}\n\nexport default KiwiLighter1ControlManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ControlButton from '../../../core/control/control-button';\nimport KiwiLighterApiControlButton from '../../kiwi-lighter-api/kiwi-lighter-api-control-button';\n\n/**\n * PÅ™evadÄ›Ä� informacÃ­ o ovlÃ¡dÃ¡nÃ­ pro Ki-Wi Lighter API.\n */\nclass KiwiLighter1ControlParser {\n  /**\n   * VrÃ¡tÃ­ poloÅ¾ku z Ä�Ã­selnÃ­ku odpovÃ­dajÃ­cÃ­ danÃ©mu kÃ³du tlaÄ�Ã­tka.\n   * @param {string} button KÃ³d stistknutÃ©ho tlaÄ�Ã­tka.\n   * @returns {ControlButton|null} IdentifikÃ¡tor tlaÄ�Ã­tka z Ä�Ã­selnÃ­ku nebo null,\n   * pokud tlaÄ�Ã­tko nenÃ­ podporovÃ¡no.\n   */\n  parseKeyCode (button) {\n    switch (button) {\n      case KiwiLighterApiControlButton.Back:\n        return ControlButton.Back;\n      default:\n        return null;\n    }\n  }\n}\n\nexport default KiwiLighter1ControlParser;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport DriveEnum from '../../drive/drive-enum';\nimport KiwiLighterApiDriveType from '../../kiwi-lighter-api/kiwi-lighter-api-drive-type';\n\n/**\n * SprÃ¡vce fyzickÃ½ch datovÃ½ch ÃºloÅ¾iÅ¡Å¥ pro Ki-Wi Lighter API.\n * @implements {DriveManager}\n */\nclass KiwiLighter1DriveManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {KiwiLighterApiDriveManager} lighterDrive\n   * @param {KiwiLighter1PromisifyLighter} promisify\n   */\n  constructor (lighterDrive, promisify) {\n    this.lighterDrive = lighterDrive;\n    this.promisify = promisify;\n  }\n\n  /** @inheritdoc */\n  getAllUnits () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterDrive, 'getAllUnits')()\n      .then((unitArray) => unitArray.map((unit) => ({\n        driveEnum: this.parseType(unit.type),\n        free: unit.free,\n        id: unit.id,\n        total: unit.total,\n        used: unit.used\n      })))\n    ));\n  }\n\n  /** @inheritdoc */\n  getInfo () {\n    return new Promise((resolve) => resolve(\n      this.getAllUnits()\n      .then((driveUnitArray) => ({driveUnitArray}))\n    ));\n  }\n\n  /**\n   * Naparsuje typ datovÃ©ho ÃºloÅ¾iÅ¡tÄ› z Cordova formÃ¡tu.\n   * @param {string} cordovaType Typy pevnÃ©ho disku pro Ki-Wi Lighter API.\n   * @private\n   * @returns {DriveType} Typ ÃºloÅ¾iÅ¡tÄ›.\n   */\n  parseType (cordovaType) {\n    switch (cordovaType) {\n      case KiwiLighterApiDriveType.External:\n        return DriveEnum.EXTERNAL;\n      case KiwiLighterApiDriveType.Internal:\n        return DriveEnum.INTERNAL;\n      default:\n        throw new RangeError(`Unknown drive type \"${cordovaType}\".`);\n    }\n  }\n}\n\nexport default KiwiLighter1DriveManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * SprÃ¡vce souborovÃ½ch archivÅ¯ pro Ki-Wi Lighter API.\n * @implements {FileArchiveManager}\n */\nclass KiwiLighter1FileArchiveManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {FileSystemManager} fileSystemManager\n   * @param {KiwiLighter1FileArchiveVolumeFactory} volumeFactory\n   */\n  constructor (fileSystemManager, volumeFactory) {\n    this.fileSystemManager = fileSystemManager;\n    this.volumeFactory = volumeFactory;\n  }\n\n  /** @inheritdoc */\n  getVolume (path) {\n    return new Promise((resolve) => resolve(\n      // ZatÃ­m se pouze zjiÅ¡Å¥uje, jestli je na cestÄ› soubor.\n      // PouÅ¾Ã­vanÃ½ plugin neÃºmoÅ¾Åˆuje podrobnÄ›jÅ¡Ã­ test.\n      this.fileSystemManager.getFile(path)\n      .then((file) => this.volumeFactory.create(file))\n    ));\n  }\n}\n\nexport default KiwiLighter1FileArchiveManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na svazky archivu souborÅ¯ pro Ki-Wi Lighter API.\n */\nclass KiwiLighter1FileArchiveVolumeFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<KiwiLighter1FileArchiveVolume>} FileArchiveVolume\n   * @param {CordovaArchiver} cordovaArchiver\n   * @param {FileSystemManager} fileSystemManager\n   * @param {FileSystemMapper} mapper\n   * @param {FileSystemPathFactory} pathFactory\n   */\n  constructor (FileArchiveVolume, cordovaArchiver, fileSystemManager, mapper, pathFactory) {\n    this.FileArchiveVolume = FileArchiveVolume;\n    this.cordovaArchiver = cordovaArchiver;\n    this.fileSystemManager = fileSystemManager;\n    this.mapper = mapper;\n    this.pathFactory = pathFactory;\n  }\n\n  /**\n   * @param {FileSystemFile} file Soubor v souborovÃ©m systÃ©mu, kde je archiv uloÅ¾en.\n   * @returns {FileArchiveVolume}\n   */\n  create (file) {\n    return new this.FileArchiveVolume(this.cordovaArchiver, file, this.fileSystemManager, this.mapper, this.pathFactory);\n  }\n}\n\nexport default KiwiLighter1FileArchiveVolumeFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Svazek archivu souborÅ¯ pro Ki-Wi Lighter API.\n * @implements {FileArchiveVolume}\n */\nclass KiwiLighter1FileArchiveVolume {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {CordovaArchiver} cordovaArchiver\n   * @param {FileSystemFile} file Soubor v souborovÃ©m systÃ©mu, kde je archiv uloÅ¾en.\n   * @param {FileSystemManager} fileSystemManager\n   * @param {FileSystemMapper} mapper\n   * @param {FileSystemPathFactory} pathFactory\n   */\n  constructor (cordovaArchiver, file, fileSystemManager, mapper, pathFactory) {\n    this.cordovaArchiver = cordovaArchiver;\n    this.file = file;\n    this.fileSystemManager = fileSystemManager;\n    this.mapper = mapper;\n    this.pathFactory = pathFactory;\n  }\n\n  /** @inheritdoc */\n  extract (toPath) {\n    return new Promise((resolve) => {\n      // UrÄ�Ã­ se absolutnÃ­ cesta, kam se soubor rozbalit.\n      // Cesta se urÄ�Ã­ procesem \"resolve path\" z aktuÃ¡lnÃ­ rodiÄ�ovskÃ© sloÅ¾ky do poÅ¾adovanÃ© cesty.\n      const fromPath = this.file.getPath();\n      const {mapper, pathFactory} = this;\n      const toPathAbs = pathFactory.resolve(fromPath, pathFactory.fromValue('..'), toPath);\n      return resolve(\n        this.fileSystemManager.getDirectory(toPathAbs)\n        .then((toDirectory) => (\n          mapper.toFileUrl(fromPath)\n          .then((zipUrl) => (\n            mapper.toFileUrl(toPathAbs)\n            .then((toUrl) => this.cordovaArchiver.unzip(zipUrl, toUrl))\n          ))\n          .then(() => toDirectory)\n        ))\n      );\n    });\n  }\n\n  /** @inheritdoc */\n  getPath () {\n    return this.file.getPath();\n  }\n}\n\nexport default KiwiLighter1FileArchiveVolume;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ErrorName from '../../../error/error-name';\n\n/**\n * SloÅ¾ka v souborovÃ©m systÃ©mu pro Ki-Wi Lighter API.\n * @implements {FileSystemDirectory}\n */\nclass KiwiLighter1FileSystemDirectory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {CordovaDirectoryEntry} cordovaDirectory\n   * @param {CordovaResolver} cordovaResolver\n   * @param {KiwiLighter1FileSystemEntryFactory} entryFactory\n   * @param {FileSystemMapper} mapper\n   * @param {FileSystemPath} path Cesta ke sloÅ¾ce.\n   * @param {FileSystemPathFactory} pathFactory\n   * @param {KiwiLighter1PromisifyFile} promisify\n   */\n  constructor (cordovaDirectory, cordovaResolver, entryFactory, mapper, path, pathFactory, promisify) {\n    this.cordovaDirectory = cordovaDirectory;\n    this.cordovaResolver = cordovaResolver;\n    this.entryFactory = entryFactory;\n    this.mapper = mapper;\n    this.path = path;\n    this.pathFactory = pathFactory;\n    this.promisify = promisify;\n  }\n\n  /** @inheritdoc */\n  getName () {\n    return this.path.getBase();\n  }\n\n  /** @inheritdoc */\n  getPath () {\n    return this.path;\n  }\n\n  /** @inheritdoc */\n  isDirectory () {\n    return true;\n  }\n\n  /** @inheritdoc */\n  isFile () {\n    return false;\n  }\n\n  /** @inheritdoc */\n  list () {\n    return (\n      new Promise((resolve, reject) => {\n        this.cordovaDirectory.createReader().readEntries(resolve, reject);\n      })\n      .then((entries) => entries.map((entry) => {\n        const {pathFactory} = this;\n        const filePath = pathFactory.fromInfo({base: entry.name});\n        const listedPath = pathFactory.join(this.path, filePath);\n        return this.entryFactory.createEntry(entry, listedPath);\n      }))\n    );\n  }\n\n  /** @inheritdoc */\n  move (toPath) {\n    return new Promise((resolve) => {\n      // UrÄ�Ã­ se absolutnÃ­ cesta, kam se mÃ¡ sloÅ¾ka pÅ™esunout.\n      // Cesta se urÄ�Ã­ procesem \"resolve path\" z aktuÃ¡lnÃ­ rodiÄ�ovskÃ© sloÅ¾ky do poÅ¾adovanÃ© cesty.\n      const {mapper, pathFactory} = this;\n      const toPathAbs = pathFactory.resolve(this.path, pathFactory.fromValue('..'), toPath);\n      return resolve(\n        // Zkontroluje se, jestli je cÃ­lovÃ¡ cesta prÃ¡zdnÃ¡.\n        mapper.toFileUrl(toPathAbs)\n        .then((url) => this.cordovaResolver.hasEntry(url))\n        .then((exists) => {\n          if (exists) {\n            const error = new Error(`Entry already exists at \"${toPathAbs}\".`);\n            error.name = ErrorName.PathExistsError;\n            throw error;\n          }\n        })\n        // ZÃ­skÃ¡ se rodiÄ�ovskÃ¡ sloÅ¾ka pro cÃ­lovou cestu.\n        .then(() => mapper.toFileUrl(pathFactory.resolve(toPathAbs, pathFactory.fromValue('..'))))\n        .then((url) => this.cordovaResolver.getDirectory(url))\n        // SloÅ¾ka se pÅ™esune na cÃ­lovou cestu, tj. do cÃ­lovÃ© rodiÄ�ovskÃ© sloÅ¾ky s poÅ¾adovanÃ½m nÃ¡zvem.\n        .then((parent) => this.promisify.method(this.cordovaDirectory, 'moveTo')(parent, toPathAbs.getBase()))\n        .then((toCordovaDirectory) => this.entryFactory.createDirectory(toCordovaDirectory, toPathAbs))\n      );\n    });\n  }\n\n  /** @inheritdoc */\n  remove ({recursive = false} = {}) {\n    return new Promise((resolve) => {\n      const {cordovaDirectory, path} = this;\n      if (path.isRoot()) {\n        const error = new Error(`Unable to remove the root directory at \"${path}\".`);\n        error.name = ErrorName.NoModificationAllowedError;\n        throw error;\n      }\n      if (recursive) {\n        return resolve(this.promisify.method(cordovaDirectory, 'removeRecursively')());\n      }\n      return resolve(this.promisify.method(cordovaDirectory, 'remove')());\n    });\n  }\n}\n\nexport default KiwiLighter1FileSystemDirectory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na zÃ¡znamy v souborovÃ©m systÃ©mu pro Ki-Wi Lighter API.\n */\nclass KiwiLighter1FileSystemEntryFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<KiwiLighter1FileSystemDirectory>} FileSystemDirectory\n   * @param {Class.<KiwiLighter1FileSystemFile>} FileSystemFile\n   * @param {CordovaResolver} cordovaResolver\n   * @param {FileSystemMapper} mapper\n   * @param {FileSystemPathFactory} pathFactory\n   * @param {KiwiLighter1PromisifyFile} promisify\n   */\n  constructor (FileSystemDirectory, FileSystemFile, cordovaResolver, mapper, pathFactory, promisify) {\n    this.FileSystemDirectory = FileSystemDirectory;\n    this.FileSystemFile = FileSystemFile;\n    this.cordovaResolver = cordovaResolver;\n    this.mapper = mapper;\n    this.pathFactory = pathFactory;\n    this.promisify = promisify;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ© informace o sloÅ¾ce.\n   * @param {CordovaDirectoryEntry} cordovaDirectory\n   * @param {FileSystemPath} path Cesta ke sloÅ¾ce.\n   * @returns {FileSystemDirectory}\n   */\n  createDirectory (cordovaDirectory, path) {\n    return new this.FileSystemDirectory(cordovaDirectory, this.cordovaResolver, this, this.mapper, path, this.pathFactory, this.promisify);\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ© informace o zÃ¡znamu.\n   * @param {CordovaEntry} cordovaEntry\n   * @param {FileSystemPath} path Cesta k zÃ¡znamu.\n   * @returns {FileSystemEntry}\n   */\n  createEntry (cordovaEntry, path) {\n    if (cordovaEntry.isDirectory) {\n      return this.createDirectory(cordovaEntry, path);\n    }\n    if (cordovaEntry.isFile) {\n      return this.createFile(cordovaEntry, path);\n    }\n    return new TypeError(`Invalid entry type at \"${path}\".`);\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ© informace o souboru.\n   * @param {CordovaFileEntry} cordovaFile\n   * @param {FileSystemPath} path Cesta k souboru.\n   * @returns {FileSystemFile}\n   */\n  createFile (cordovaFile, path) {\n    return new this.FileSystemFile(cordovaFile, this.cordovaResolver, this, this.mapper, path, this.pathFactory, this.promisify);\n  }\n}\n\nexport default KiwiLighter1FileSystemEntryFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ErrorName from '../../../error/error-name';\n\n/**\n * Soubor v souborovÃ©m systÃ©mu pro Ki-Wi Lighter API.\n * @implements {FileSystemFile}\n */\nclass KiwiLighter1FileSystemFile {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {CordovaFileEntry} cordovaFile\n   * @param {CordovaResolver} cordovaResolver\n   * @param {KiwiLighter1FileSystemEntryFactory} entryFactory\n   * @param {FileSystemMapper} mapper\n   * @param {FileSystemPath} path Cesta ke sloÅ¾ce.\n   * @param {FileSystemPathFactory} pathFactory\n   * @param {KiwiLighter1PromisifyFile} promisify\n   */\n  constructor (cordovaFile, cordovaResolver, entryFactory, mapper, path, pathFactory, promisify) {\n    this.cordovaFile = cordovaFile;\n    this.cordovaResolver = cordovaResolver;\n    this.entryFactory = entryFactory;\n    this.mapper = mapper;\n    this.path = path;\n    this.pathFactory = pathFactory;\n    this.promisify = promisify;\n  }\n\n  /** @inheritdoc */\n  getName () {\n    return this.path.getBase();\n  }\n\n  /** @inheritdoc */\n  getPath () {\n    return this.path;\n  }\n\n  /** @inheritdoc */\n  isDirectory () {\n    return false;\n  }\n\n  /** @inheritdoc */\n  isFile () {\n    return true;\n  }\n\n  /** @inheritdoc */\n  move (toPath) {\n    return new Promise((resolve) => {\n      // UrÄ�Ã­ se absolutnÃ­ cesta, kam se mÃ¡ soubor pÅ™esunout.\n      // Cesta se urÄ�Ã­ procesem \"resolve path\" z aktuÃ¡lnÃ­ rodiÄ�ovskÃ© sloÅ¾ky do poÅ¾adovanÃ© cesty.\n      const {mapper, pathFactory} = this;\n      const toPathAbs = pathFactory.resolve(this.path, pathFactory.fromValue('..'), toPath);\n      return resolve(\n        // Zkontroluje se, jestli je cÃ­lovÃ¡ cesta prÃ¡zdnÃ¡.\n        mapper.toFileUrl(toPathAbs)\n        .then((url) => this.cordovaResolver.hasEntry(url))\n        .then((exists) => {\n          if (exists) {\n            const error = new Error(`Entry already exists at \"${toPathAbs}\".`);\n            error.name = ErrorName.PathExistsError;\n            throw error;\n          }\n        })\n        // ZÃ­skÃ¡ se rodiÄ�ovskÃ¡ sloÅ¾ka pro cÃ­lovou cestu.\n        .then(() => mapper.toFileUrl(pathFactory.resolve(toPathAbs, pathFactory.fromValue('..'))))\n        .then((url) => this.cordovaResolver.getDirectory(url))\n        // Soubor se pÅ™esune na cÃ­lovou cestu, tj. do cÃ­lovÃ© rodiÄ�ovskÃ© sloÅ¾ky s poÅ¾adovanÃ½m nÃ¡zvem.\n        .then((parent) => this.promisify.method(this.cordovaFile, 'moveTo')(parent, toPathAbs.getBase()))\n        .then((toCordovaFile) => this.entryFactory.createFile(toCordovaFile, toPathAbs))\n      );\n    });\n  }\n\n  /** @inheritdoc */\n  remove (opts) {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.cordovaFile, 'remove')()\n    ));\n  }\n}\n\nexport default KiwiLighter1FileSystemFile;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * SprÃ¡vce souborovÃ©ho systÃ©mu pro Ki-Wi Lighter API.\n * @implements {FileSystemManager}\n */\nclass KiwiLighter1FileSystemManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {CordovaResolver} cordovaResolver\n   * @param {CordovaUnitResource} cordovaUnitResource\n   * @param {KiwiLighter1FileSystemEntryFactory} entryFactory\n   * @param {FileSystemMapper} mapper\n   * @param {FileSystemPathFactory} pathFactory\n   * @param {KiwiLighter1PromisifyFile} promisify\n   * @param {KiwiLighter1FileSystemUnitFactory} unitFactory\n   */\n  constructor (cordovaResolver, cordovaUnitResource, entryFactory, mapper, pathFactory, promisify, unitFactory) {\n    this.cordovaResolver = cordovaResolver;\n    this.cordovaUnitResource = cordovaUnitResource;\n    this.entryFactory = entryFactory;\n    this.mapper = mapper;\n    this.pathFactory = pathFactory;\n    this.promisify = promisify;\n    this.unitFactory = unitFactory;\n  }\n\n  /** @inheritdoc */\n  createDirectory (path) {\n    return new Promise((resolve) => resolve(\n      // ZjistÃ­ se root sloÅ¾ka.\n      this.mapper.toFileUrl(this.pathFactory.fromInfo({unit: path.getUnit()}))\n      .then((url) => this.cordovaResolver.getDirectory(url))\n      // Pro kaÅ¾dÃ©ho parent na cestÄ› se zajistÃ­ pÅ™Ã­tomnost sloÅ¾ky.\n      .then((rootDirectory) => (\n        path.getParents()\n        .reduce(\n          (acc, parentName) => acc.then((accDirectory) => (\n            this.promisify.method(accDirectory, 'getDirectory')(parentName, {create: true, exclusive: false})\n          )),\n          Promise.resolve(rootDirectory)\n        )\n      ))\n      // CÃ­lovÃ¡ sloÅ¾ka se vytvoÅ™Ã­ s exkluzivitou.\n      .then((parentDirectory) => this.promisify.method(parentDirectory, 'getDirectory')(path.getBase(), {create: true, exclusive: true}))\n      .then((baseDirectory) => this.entryFactory.createDirectory(baseDirectory, path))\n    ));\n  }\n\n  /** @inheritdoc */\n  getAllUnits () {\n    return new Promise((resolve) => resolve(\n      this.cordovaUnitResource.getAll()\n      .reduce(\n        (acc, cordovaUnit) => acc.then((unitArray) => {\n          const name = cordovaUnit.getName();\n          const purpose = cordovaUnit.getPurpose();\n          const url = cordovaUnit.getUrl();\n          return (\n            this.cordovaResolver.getDirectory(url)\n            .then((cordovaDirectory) => unitArray.concat(\n              this.unitFactory.create(cordovaDirectory, name, purpose)\n            ))\n          );\n        }),\n        Promise.resolve([])\n      )\n    ));\n  }\n\n  /** @inheritdoc */\n  getDirectory (path) {\n    return new Promise((resolve) => resolve(\n      this.mapper.toFileUrl(path)\n      .then((url) => this.cordovaResolver.getDirectory(url))\n      .then((cordovaDirectory) => this.entryFactory.createDirectory(cordovaDirectory, path))\n    ));\n  }\n\n  /** @inheritdoc */\n  getEntry (path) {\n    return new Promise((resolve) => resolve(\n      this.mapper.toFileUrl(path)\n      .then((url) => this.cordovaResolver.getEntry(url))\n      .then((entry) => this.entryFactory.createEntry(entry, path))\n    ));\n  }\n\n  /** @inheritdoc */\n  getFile (path) {\n    return new Promise((resolve) => resolve(\n      this.mapper.toFileUrl(path)\n      .then((url) => this.cordovaResolver.getFile(url))\n      .then((cordovaFile) => this.entryFactory.createFile(cordovaFile, path))\n    ));\n  }\n\n  /** @inheritdoc */\n  getUnit (name) {\n    return new Promise((resolve) => {\n      const cordovaUnit = this.cordovaUnitResource.get(name);\n      const purpose = cordovaUnit.getPurpose();\n      const url = cordovaUnit.getUrl();\n      return resolve(\n        this.cordovaResolver.getDirectory(url)\n        .then((cordovaDirectory) => this.unitFactory.create(cordovaDirectory, name, purpose))\n      );\n    });\n  }\n\n  /** @inheritdoc */\n  hasDirectory (path) {\n    return new Promise((resolve) => resolve(\n      this.mapper.toFileUrl(path)\n      .then((url) => this.cordovaResolver.hasDirectory(url))\n    ));\n  }\n\n  /** @inheritdoc */\n  hasEntry (path) {\n    return new Promise((resolve) => resolve(\n      this.mapper.toFileUrl(path)\n      .then((url) => this.cordovaResolver.hasEntry(url))\n    ));\n  }\n\n  /** @inheritdoc */\n  hasFile (path) {\n    return new Promise((resolve) => resolve(\n      this.mapper.toFileUrl(path)\n      .then((url) => this.cordovaResolver.hasFile(url))\n    ));\n  }\n}\n\nexport default KiwiLighter1FileSystemManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isObject from 'lodash/isObject';\n\n/**\n * MapovaÄ� cest souborovÃ©ho systÃ©mu pro Ki-Wi Lighter API.\n * @implements {FileSystemMapper}\n */\nclass KiwiLighter1FileSystemMapper {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {number} localhostPort Port, na kterÃ©m je spuÅ¡tÄ›nÃ½ localhost\n   * HTTP server se souborovÃ½m systÃ©mem.\n   * @param {PathBrowserify} pathBrowserify\n   * @param {CordovaUnitResource} unitResource Zdroj jednotek a jejich URL cest.\n   */\n  constructor (localhostPort, pathBrowserify, unitResource) {\n    this.localhostPort = localhostPort;\n    this.pathBrowserify = pathBrowserify;\n    this.unitResource = unitResource;\n  }\n\n  /** @inheritdoc */\n  hasFile () {\n    return true;\n  }\n\n  /** @inheritdoc */\n  hasLocalhost () {\n    return true;\n  }\n\n  /** @inheritdoc */\n  toFileUrl (path) {\n    return new Promise((resolve) => {\n      if (!isObject(path)) {\n        throw new TypeError(`Invalid path ${path}.`);\n      }\n      const unitName = path.getUnit();\n      if (!unitName) {\n        throw new Error(`Missing unit at \"${path}\".`);\n      }\n      const cordovaUnit = this.unitResource.get(unitName);\n      const unitUrl = cordovaUnit.getUrl();\n      const location = this.pathBrowserify.join(...path.getParents(), path.getBase());\n      if (location === '.') {\n        return resolve(unitUrl);\n      }\n      return resolve(unitUrl + location);\n    });\n  }\n\n  /** @inheritdoc */\n  toLocalhostUrl (path) {\n    return new Promise((resolve) => resolve(\n      this.toFileUrl(path)\n      .then((url) => {\n        const prefix = 'file:///';\n        if (!url.startsWith(prefix)) {\n          throw new Error(`Invalid URL prefix at \"${url}\".`);\n        }\n        const rest = url.slice(prefix.length);\n        return `http://localhost:${this.localhostPort}/${rest}`;\n      })\n    ));\n  }\n}\n\nexport default KiwiLighter1FileSystemMapper;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na informace o jednotkÃ¡ch v souborovÃ©m systÃ©mu pro Ki-Wi Lighter API.\n */\nclass KiwiLighter1FileSystemUnitFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<KiwiLighter1FileSystemUnit>} FileSystemUnit\n   * @param {KiwiLighter1FileSystemEntryFactory} entryFactory\n   * @param {FileSystemPathFactory} pathFactory\n   */\n  constructor (FileSystemUnit, entryFactory, pathFactory) {\n    this.FileSystemUnit = FileSystemUnit;\n    this.entryFactory = entryFactory;\n    this.pathFactory = pathFactory;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novou jednotku.\n   * @param {CordovaDirectoryEntry} cordovaDirectory KoÅ™enovÃ¡ sloÅ¾ka jednotky.\n   * @param {string} name NÃ¡zev jednotky.\n   * @param {FileSystemPurpose} purpose ÃšÄ�el jednotky.\n   * @returns {KiwiLighter1FileSystemUnit}\n   */\n  create (cordovaDirectory, name, purpose) {\n    return new this.FileSystemUnit(cordovaDirectory, this.entryFactory, name, this.pathFactory, purpose);\n  }\n}\n\nexport default KiwiLighter1FileSystemUnitFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * LogickÃ¡ jednotka souborovÃ©ho systÃ©mu pro Ki-Wi Lighter API.\n * @implements {FileSystemUnit}\n */\nclass KiwiLighter1FileSystemUnit {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {CordovaDirectoryEntry} cordovaDirectory KoÅ™enovÃ¡ sloÅ¾ka jednotky.\n   * @param {KiwiLighter1FileSystemEntryFactory} entryFactory\n   * @param {string} name NÃ¡zev jednotky.\n   * @param {FileSystemPathFactory} pathFactory\n   * @param {FileSystemPurpose} purpose ÃšÄ�el jednotky.\n   */\n  constructor (cordovaDirectory, entryFactory, name, pathFactory, purpose) {\n    this.cordovaDirectory = cordovaDirectory;\n    this.entryFactory = entryFactory;\n    this.name = name;\n    this.pathFactory = pathFactory;\n    this.purpose = purpose;\n  }\n\n  /** @inheritdoc */\n  getName () {\n    return this.name;\n  }\n\n  /** @inheritdoc */\n  getPurpose () {\n    return this.purpose;\n  }\n\n  /** @inheritdoc */\n  getRoot () {\n    return new Promise((resolve) => {\n      const path = this.pathFactory.fromInfo({unit: this.name});\n      const directory = this.entryFactory.createDirectory(this.cordovaDirectory, path);\n      return resolve(directory);\n    });\n  }\n}\n\nexport default KiwiLighter1FileSystemUnit;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na sprÃ¡vce staÅ¾enÃ­ jednoho souboru pro Ki-Wi Lighter API.\n */\nclass KiwiLighter1FileTransferDownloadFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<KiwiLighter1FileTransferDownload>} FileTransferDownload\n   * @param {CordovaResolver} cordovaResolver\n   * @param {KiwiLighter1FileSystemEntryFactory} entryFactory\n   * @param {KiwiLighterApiFileTransferManager} lighterFileTransfer\n   * @param {FileSystemMapper} mapper\n   * @param {KiwiLighter1PromisifyLighter} promisify\n   */\n  constructor (\n    FileTransferDownload, cordovaResolver, entryFactory, lighterFileTransfer,\n    mapper, promisify\n  ) {\n    this.FileTransferDownload = FileTransferDownload;\n    this.cordovaResolver = cordovaResolver;\n    this.entryFactory = entryFactory;\n    this.lighterFileTransfer = lighterFileTransfer;\n    this.mapper = mapper;\n    this.promisify = promisify;\n  }\n\n  /**\n   * @param {FileTransferRequest} request PoÅ™adavek na staÅ¾enÃ­ souboru, kterÃ½ se pÅ™i spojenÃ­ odeÅ¡le na server.\n   * @param {FileSystemPath} toPath Cesta, kam se mÃ¡ staÅ¾enÃ½ soubor uloÅ¾it.\n   * @returns {FileTransferDownload}\n   */\n  create (request, toPath) {\n    return new this.FileTransferDownload(\n      this.cordovaResolver, this.entryFactory, this.lighterFileTransfer,\n      this.mapper, this.promisify, request, toPath\n    );\n  }\n}\n\nexport default KiwiLighter1FileTransferDownloadFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport FileTransferConnection from '../../../file/transfer/file-transfer-connection';\nimport FileTransferResponse from '../../../file/transfer/file-transfer-response';\n\n/**\n * SprÃ¡vce staÅ¾enÃ­ jednoho souboru pro Ki-Wi Lighter API.\n * OÅ¡etÅ™uje zÃ¡pis velkÃ½ch souborÅ¯ v Cordova File API.\n * PouÅ¾itÃ­ fetch pÅ™i zÃ¡pisu vÄ›tÅ¡Ã­ch souborÅ¯ (cca. nad 650 MB) shodÃ­ aplikaci.\n * PouÅ¾itÃ­ XMLHttpRequest je doporuÄ�ovÃ¡no jako nÃ¡hrada deprecated Transfer Pluginu.\n * Dokumentace:\n * [Cordova File Transfer Plugin](https://cordova.apache.org/blog/2017/10/18/from-filetransfer-to-xhr2.html)\n * @implements {FileTransferDownload}\n */\nclass KiwiLighter1FileTransferDownload {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {CordovaResolver} cordovaResolver\n   * @param {KiwiLighter1FileSystemEntryFactory} entryFactory\n   * @param {KiwiLighterApiFileTransferManager} lighterFileTransfer\n   * @param {FileSystemMapper} mapper\n   * @param {KiwiLighter1PromisifyLighter} promisify\n   * @param {FileTransferRequest} request PoÅ™adavek na staÅ¾enÃ­ souboru, kterÃ½ se pÅ™i spojenÃ­ odeÅ¡le na server.\n   * @param {FileSystemPath} toPath Cesta, kam se mÃ¡ staÅ¾enÃ½ soubor uloÅ¾it.\n   */\n  constructor (\n    cordovaResolver, entryFactory, lighterFileTransfer, mapper, promisify,\n    request, toPath\n  ) {\n    this.cordovaResolver = cordovaResolver;\n    this.entryFactory = entryFactory;\n    this.lighterFileTransfer = lighterFileTransfer;\n    this.mapper = mapper;\n    this.promisify = promisify;\n    this.request = request;\n    this.toPath = toPath;\n  }\n\n  /** @inheritdoc */\n  start () {\n    return new FileTransferConnection(\n      new Promise((resolve) => resolve(\n        // StaÅ¾enÃ­ souboru pomocÃ­ nativnÃ­ metody do souboru.\n        this.promisify.method(this.lighterFileTransfer, 'download')(\n          this.toPath.toString(),\n          {url: this.request.getUrl()}\n        )\n        .then(\n          // StaÅ¾enÃ­ bylo ÃºspÄ›Å¡nÃ© a soubor byl vytvoÅ™en.\n          () => (\n            // Je nutnÃ© zÃ­skat Cordova File API objekt pro staÅ¾enÃ½ soubor.\n            this.mapper.toFileUrl(this.toPath)\n            .then((url) => this.cordovaResolver.getFile(url))\n            // VrÃ¡cenÃ­ ÃºspÄ›chu se staÅ¾enÃ½m souborem.\n            .then((cordovaFile) => {\n              const file = this.entryFactory.createFile(cordovaFile, this.toPath);\n              return new FileTransferResponse({file, status: 200});\n            })\n          ),\n          // StaÅ¾enÃ­ nebylo ÃºspÄ›Å¡nÃ© a soubor nebyl vytvoÅ™en.\n          (error) => {\n            // SelhÃ¡nÃ­ poÅ¾adavku se u nativnÃ­ metody povaÅ¾uje za neÃºspÄ›ch.\n            // PÅ™evede se tedy na ÃºspÄ›ch s pÅ™edanÃ½m statusem.\n            if (error.name === 'FileTransferError') {\n              return new FileTransferResponse({status: error.status});\n            }\n            throw error;\n          }\n        )\n      ))\n    );\n  }\n}\n\nexport default KiwiLighter1FileTransferDownload;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * SprÃ¡vce pÅ™enosÅ¯ souborÅ¯ po sÃ­ti pro Ki-Wi Lighter API.\n * @implements {FileTransferManager}\n */\nclass KiwiLighter1FileTransferManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {KiwiLighter1FileTransferDownloadFactory} downloadFactory\n   */\n  constructor (downloadFactory) {\n    this.downloadFactory = downloadFactory;\n  }\n\n  /** @inheritdoc */\n  download (toPath, request) {\n    return (\n      this.downloadFactory.create(request, toPath)\n      .start()\n    );\n  }\n}\n\nexport default KiwiLighter1FileTransferManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * SprÃ¡vce firmware pro Ki-Wi Lighter API.\n * @implements {FirmwareManager}\n */\nclass KiwiLighter1FirmwareManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {KiwiLighterApiFirmwareManager} lighterFirmware\n   * @param {KiwiLighter1PromisifyLighter} promisify\n   */\n  constructor (lighterFirmware, promisify) {\n    this.lighterFirmware = lighterFirmware;\n    this.promisify = promisify;\n  }\n\n  /** @inheritdoc */\n  getInfo () {\n    return new Promise((resolve) => resolve(\n      [\n        () => (\n          this.getManufacturer()\n          .then((manufacturer) => ({manufacturer}))\n        ),\n        () => (\n          this.getModelName()\n          .then((modelName) => ({modelName}))\n        ),\n        () => (\n          this.getVersion()\n          .then((version) => ({version}))\n        )\n      ]\n      .reduce(\n        (accPromise, getter) => (\n          accPromise.then((accObject) => (\n            getter()\n            .then((result) => Object.assign(accObject, result))\n          ))\n        ),\n        Promise.resolve({})\n      )\n    ));\n  }\n\n  /** @inheritdoc */\n  getManufacturer () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterFirmware, 'getManufacturer')()\n    ));\n  }\n\n  /** @inheritdoc */\n  getModelName () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterFirmware, 'getModelName')()\n    ));\n  }\n\n  /** @inheritdoc */\n  getSerialNumber () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterFirmware, 'getSerialNumber')()\n    ));\n  }\n\n  /** @inheritdoc */\n  getVersion () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterFirmware, 'getVersion')()\n    ));\n  }\n\n  /** @inheritdoc */\n  update (firmwareRelease) {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterFirmware, 'update')({\n        size: firmwareRelease.size,\n        url: firmwareRelease.url\n      })\n    ));\n  }\n}\n\nexport default KiwiLighter1FirmwareManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @author Petr MikuÅ¡ek <petr.mikusek@ki-wi.cz>\n * @copyright Ki-Wi Digital s.r.o.\n * @file HlavnÃ­ skript platformy [Ki-Wi Lighter API](https://gitlab.com/ki-wi/player-light/kiwi-lighter-api).\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// One-line definice zÃ¡vislostÃ­ pro snaÅ¾Å¡Ã­ merge.\n/* eslint-disable max-len */\n\n// Toto je jedinÃ½ skript, kterÃ½ by mÄ›l pÅ™istupovat k neobvyklÃ½m globÃ¡lnÃ­m promÄ›nnÃ½m.\n// Pokud jsou ve zbytku aplikace potÅ™eba jejich data, tak by jim mÄ›li bÃ½t pÅ™edÃ¡ny v konstruktoru.\n/* global cordova, kiwi, process, zip */\n\n// Polyfill se naÄ�Ã­tajÃ­ jako prvnÃ­ modul aplikace\nimport '../../polyfill';\n\nimport './config.xml';\n\nimport * as SentryBrowser from '@sentry/browser';\nimport * as SentryIntegrations from '@sentry/integrations';\nimport Bottle from 'bottlejs';\nimport cssValue from 'css-value';\nimport fecha from 'fecha';\nimport genericPool from 'generic-pool-browser';\nimport ICAL from 'ical.js';\nimport DsLocalStorageAdapter from 'js-data-localstorage';\nimport JavascriptStateMachine from 'javascript-state-machine';\nimport * as nanoid from 'nanoid/non-secure';\nimport PathBrowserify from 'path-browserify';\nimport connectToChild from 'penpal/lib/connectToChild';\nimport semver from 'semver';\nimport URI from 'urijs/src/URI.fragmentQuery';\nimport VeeValidate from 'vee-validate';\nimport Vue from 'vue';\n\nimport AnalyticsTracker from '../analytics/tracker/analytics-tracker';\nimport AutorebootCommunicator from '../autoreboot/autoreboot-communicator';\nimport AutorebootManager from '../autoreboot/autoreboot-manager';\nimport AutorebootReplacer from '../autoreboot/autoreboot-replacer';\nimport Communicator from '../communicator/communicator';\nimport CommunicatorControl from '../communicator/control/communicator-control';\nimport CommunicatorSession from '../communicator/session/communicator-session';\nimport CommunicatorSettings from '../communicator/settings/communicator-settings';\nimport CommunicatorSettingsFactory from '../communicator/settings/communicator-settings-factory';\nimport ConsoleLogger from '../console/console-logger';\nimport ConsoleLoggerFactory from '../console/console-logger-factory';\nimport ContentCommunicator from '../content/content-communicator';\nimport CordovaArchiver from '../cordova/cordova-archiver';\nimport CordovaResolver from '../cordova/cordova-resolver';\nimport CordovaUnit from '../cordova/cordova-unit';\nimport CordovaUnitResource from '../cordova/cordova-unit-resource';\nimport Detector from '../detector/detector';\nimport Device from '../../device/device';\nimport DhtmlxDateParser from '../dhtmlx/date/dhtmlx-date-parser';\nimport DhtmlxToIcalEvent from '../dhtmlx/to-ical/dhtmlx-to-ical-event';\nimport DhtmlxToIcalEventFactory from '../dhtmlx/to-ical/dhtmlx-to-ical-event-factory';\nimport DhtmlxToIcalExporter from '../dhtmlx/to-ical/dhtmlx-to-ical-exporter';\nimport DhtmlxToIcalRecType from '../dhtmlx/to-ical/dhtmlx-to-ical-rec-type';\nimport DhtmlxToIcalRecTypeFactory from '../dhtmlx/to-ical/dhtmlx-to-ical-rec-type-factory';\nimport DivViewerSource from '../div/div-viewer-source';\nimport DivViewerSourceCreator from '../div/div-viewer-source-creator';\nimport DivViewerSourceFactory from '../div/div-viewer-source-factory';\nimport Downloader from '../downloader/downloader';\nimport DsBinaryAdapter from '../../adapter/webos-signage-3.0/ds-binary-adapter/ds-binary-adapter';\nimport ErrorLevelFactory from '../error/error-level-factory';\nimport FileSystemPath from '../file/system/file-system-path';\nimport FileSystemPathFactory from '../file/system/file-system-path-factory';\nimport FingerprintBrowser from '../fingerprint/fingerprint-browser';\nimport FingerprintFallback from '../fingerprint/fingerprint-fallback';\nimport FingerprintHardware from '../fingerprint/fingerprint-hardware';\nimport FingerprintHasher from '../fingerprint/fingerprint-hasher';\nimport FocusNavigator from '../focus/focus-navigator';\nimport FocusNoop from '../focus/focus-noop';\nimport HtmlElementRepairer from '../html/html-element-repairer';\nimport HtmlIframePreflighterFile from '../html/html-iframe-preflighter-file';\nimport HtmlIframePreflighterHttp from '../html/html-iframe-preflighter-http';\nimport HtmlIframePreflighterNoop from '../html/html-iframe-preflighter-noop';\nimport HtmlIframePreflighterRegistry from '../html/html-iframe-preflighter-registry';\nimport HtmlMediaUtil from '../html/html-media-util';\nimport HtmlVideoRepairer from '../html/html-video-repairer';\nimport IcalUtil from '../ical/ical-util';\nimport IdGenerator from '../id/id-generator';\nimport ImageFileViewerType from '../image/image-file-viewer-type';\nimport ImageViewerController from '../image/image-viewer-controller';\nimport ImageViewerControllerFactory from '../image/image-viewer-controller-factory';\nimport KioskViewerType from '../kiosk/kiosk-viewer-type';\nimport KiwiLighter1AppManager from './app/kiwi-lighter-1-app-manager';\nimport KiwiLighter1BootManager from './boot/kiwi-lighter-1-boot-manager';\nimport KiwiLighter1ControlListener from './control/kiwi-lighter-1-control-listener';\nimport KiwiLighter1ControlManager from './control/kiwi-lighter-1-control-manager';\nimport KiwiLighter1ControlParser from './control/kiwi-lighter-1-control-parser';\nimport KiwiLighter1DriveManager from './drive/kiwi-lighter-1-drive-manager';\nimport KiwiLighter1FileArchiveManager from './file/archive/kiwi-lighter-1-file-archive-manager';\nimport KiwiLighter1FileArchiveVolume from './file/archive/kiwi-lighter-1-file-archive-volume';\nimport KiwiLighter1FileArchiveVolumeFactory from './file/archive/kiwi-lighter-1-file-archive-volume-factory';\nimport KiwiLighter1FileSystemDirectory from './file/system/kiwi-lighter-1-file-system-directory';\nimport KiwiLighter1FileSystemEntryFactory from './file/system/kiwi-lighter-1-file-system-entry-factory';\nimport KiwiLighter1FileSystemFile from './file/system/kiwi-lighter-1-file-system-file';\nimport KiwiLighter1FileSystemManager from './file/system/kiwi-lighter-1-file-system-manager';\nimport KiwiLighter1FileSystemMapper from './file/system/kiwi-lighter-1-file-system-mapper';\nimport KiwiLighter1FileSystemUnit from './file/system/kiwi-lighter-1-file-system-unit';\nimport KiwiLighter1FileSystemUnitFactory from './file/system/kiwi-lighter-1-file-system-unit-factory';\nimport KiwiLighter1FileTransferDownload from './file/transfer/kiwi-lighter-1-file-transfer-download';\nimport KiwiLighter1FileTransferDownloadFactory from './file/transfer/kiwi-lighter-1-file-transfer-download-factory';\nimport KiwiLighter1FileTransferManager from './file/transfer/kiwi-lighter-1-file-transfer-manager';\nimport KiwiLighter1FirmwareManager from './firmware/kiwi-lighter-1-firmware-manager';\nimport KiwiLighter1MemoryManager from './memory/kiwi-lighter-1-memory-manager';\nimport KiwiLighter1NetworkManager from './network/kiwi-lighter-1-network-manager';\nimport KiwiLighter1OrientationMapper from './orientation/kiwi-lighter-1-orientation-mapper';\nimport KiwiLighter1PowerManager from './power/kiwi-lighter-1-power-manager';\nimport KiwiLighter1PromisifyFile from './promisify/kiwi-lighter-1-promisify-file';\nimport KiwiLighter1PromisifyLighter from './promisify/kiwi-lighter-1-promisify-lighter';\nimport KiwiLighter1ScreenManager from './screen/kiwi-lighter-1-screen-manager';\nimport KiwiLighter1SensorManager from './sensor/kiwi-lighter-1-sensor-manager';\nimport KiwiLighter1SoundManager from './sound/kiwi-lighter-1-sound-manager';\nimport KiwiLighter1StartupManager from './startup/kiwi-lighter-1-startup-manager';\nimport KiwiLighter1TimeManager from './time/kiwi-lighter-1-time-manager';\nimport KiwiLighter1VideoViewerController from './video/kiwi-lighter-1-video-viewer-controller';\nimport KiwiLighter1VideoViewerControllerFactory from './video/kiwi-lighter-1-video-viewer-controller-factory';\nimport KiwiLighter1VideoViewerType from './video/kiwi-lighter-1-video-viewer-type';\nimport KiwiLighter1ViewerRegistry from './viewer/kiwi-lighter-1-viewer-registry';\nimport KiwiLighter1WidgetViewerType from './widget/kiwi-lighter-1-widget-viewer-type';\nimport KiwiLighterApiNetworkTypeFactory from '../kiwi-lighter-api/kiwi-lighter-api-network-type-factory';\nimport LoggerFactory from '../logger/logger-factory';\nimport LoggerManager from '../logger/logger-manager';\nimport LongTimers from '../long-timers/long-timers';\nimport MediumRegistry from '../medium/medium-registry';\nimport NetworkConnection from '../network/network-connection';\nimport NetworkConnectionFactory from '../network/network-connection-factory';\nimport OrganizationHelper from '../organization/organization-helper';\nimport PdfFileViewerType from '../pdf/pdf-file-viewer-type';\nimport PdfParent from '../pdf/pdf-parent';\nimport PdfParentFactory from '../pdf/pdf-parent-factory';\nimport PdfRecycler from '../pdf/pdf-recycler';\nimport PdfViewerController from '../pdf/pdf-viewer-controller';\nimport PdfViewerControllerFactory from '../pdf/pdf-viewer-controller-factory';\nimport PdfViewerSource from '../pdf/pdf-viewer-source';\nimport PdfViewerSourceCreator from '../pdf/pdf-viewer-source-creator';\nimport PdfViewerSourceFactory from '../pdf/pdf-viewer-source-factory';\nimport Player from '../../player/player';\nimport PlaylistCommunicator from '../playlist/playlist-communicator';\nimport Pool from '../pool/pool';\nimport PoolAsync from '../pool/pool-async';\nimport PoolAsyncFactory from '../pool/pool-async-factory';\nimport PoolFactory from '../pool/pool-factory';\nimport PositionFrame from '../position/position-frame';\nimport PositionFrameFactory from '../position/position-frame-factory';\nimport Promisify from '../promisify/promisify';\nimport Queue from '../queue/queue';\nimport QueueFactory from '../queue/queue-factory';\nimport Replacer from '../replacer/replacer';\nimport ReplacerControl from '../replacer/control/replacer-control';\nimport ReplacerPower from '../replacer/power/replacer-power';\nimport ReplacerScreen from '../replacer/screen/replacer-screen';\nimport ReplacerSound from '../replacer/sound/replacer-sound';\nimport ReportManager from '../report/report-manager';\nimport ScheduleManager from '../schedule/schedule-manager';\nimport SentryLogger from '../sentry/sentry-logger';\nimport SentryLoggerFactory from '../sentry/sentry-logger-factory';\nimport SentryOfflineIntegration from '../sentry/sentry-offline-integration';\nimport SentrySeverityFactory from '../sentry/sentry-severity-factory';\nimport SetupError from '../setup/setup-error';\nimport SetupErrorFactory from '../setup/setup-error-factory';\nimport SetupManager from '../setup/setup-manager';\nimport StateMachine from '../state-machine/state-machine';\nimport StateMachineFactory from '../state-machine/state-machine-factory';\nimport Store from '../store/store';\nimport StreamViewerType from '../stream/stream-viewer-type';\nimport StretchNative from '../stretch/stretch-native';\nimport TrackCommunicator from '../track/track-communicator';\nimport TrackPlanCommunicator from '../track/track-plan-communicator';\nimport Updater from '../updater/updater';\nimport ViewerDelayer from '../viewer/delayer/viewer-delayer';\nimport ViewerDelayerFactory from '../viewer/delayer/viewer-delayer-factory';\nimport ViewerDirector from '../viewer/director/viewer-director';\nimport ViewerDirectorFactory from '../viewer/director/viewer-director-factory';\nimport ViewerDirectorResource from '../viewer/director/viewer-director-resource';\nimport ViewerLifeCycle from '../viewer/life-cycle/viewer-life-cycle';\nimport ViewerLifeCycleFactory from '../viewer/life-cycle/viewer-life-cycle-factory';\nimport ViewerSlide from '../viewer/slide/viewer-slide';\nimport ViewerSlideFactory from '../viewer/slide/viewer-slide-factory';\nimport ViewerSourceIframe from '../viewer/source/viewer-source-iframe';\nimport ViewerSourceIframeCreator from '../viewer/source/viewer-source-iframe-creator';\nimport ViewerSourceIframeFactory from '../viewer/source/viewer-source-iframe-factory';\nimport ViewerSourceVideo from '../viewer/source/viewer-source-video';\nimport ViewerSourceVideoCreator from '../viewer/source/viewer-source-video-creator';\nimport ViewerSourceVideoFactory from '../viewer/source/viewer-source-video-factory';\nimport ViewerThread from '../viewer/thread/viewer-thread';\nimport ViewerThreadFactory from '../viewer/thread/viewer-thread-factory';\nimport ViewerTypeWeb from '../viewer/type/viewer-type-web';\nimport VirtualKeyboardHidden from '../virtual-keyboard/virtual-keyboard-hidden';\nimport VirtualKeyboardHiddenFactory from '../virtual-keyboard/virtual-keyboard-hidden-factory';\nimport VirtualKeyboardManager from '../../adapter/web/virtual-keyboard/virtual-keyboard-manager';\nimport VueFactory from '../vue/vue-factory';\nimport WebNetworkListener from '../web/web-network-listener';\nimport XhrFetcher from '../xhr/xhr-fetcher';\nimport config from '../../config';\nimport htmlVideoBlank from '../html/html-video-blank.mp4';\n\n// TODO Ãšpravy v Lighter API:\n// - Opravit importy, jakmile to nebude problÃ©m pro merge.\n//   SeÅ™adit vÅ¡e dle abecedy bez ohledu na cestu?\n// - PÅ™ejmenovat na KiwiLighterApi1.\n// - DoÅ™eÅ¡it odkazy na definice - mÄ›li by ukazovat na v1 a ne master.\n\n// Inicializace IoC/DI knihovny.\nBottle.config.strict = true;\nconst bottle = new Bottle();\n// Inicializace loggeru, aby Å¡lo zaznamenat chyby co nejdÅ™Ã­ve.\nnew Promise((resolve) => resolve(\n  bottle\n  .constant('Console', console)\n  .constant('ConsoleLoggerConstructor', ConsoleLogger)\n  .constant('SentryBrowser', SentryBrowser)\n  .constant('SentryLoggerConstructor', SentryLogger)\n  .constant('SentryOfflineIntegrationOptions', {key: `${config.name}/sentryEvent`, maxEvents: config.sentryMaxEvents})\n  .constant('SentryVueIntegrationOptions', {Vue})\n  .constant('buildId', kiwi.buildId)\n  .constant('env', process.env.NODE_ENV)\n  .constant('sentryCaptureErrorLevel', config.sentryCaptureErrorLevel)\n  .constant('sentryDsn', kiwi.sentryDsn)\n  .service('ConsoleLoggerFactory', ConsoleLoggerFactory, 'ConsoleLoggerConstructor', 'Console', 'ErrorLevelFactory')\n  .service('ErrorLevelFactory', ErrorLevelFactory)\n  .service('SentryLoggerFactory', SentryLoggerFactory, 'SentryBrowser', 'SentryLoggerConstructor', 'sentryCaptureErrorLevel', 'ErrorLevelFactory', 'SentryOfflineIntegration', 'SentrySeverityFactory', 'SentryVueIntegration')\n  .service('SentryOfflineIntegration', SentryOfflineIntegration, 'SentryOfflineIntegrationOptions')\n  .service('SentrySeverityFactory', SentrySeverityFactory)\n  .service('SentryVueIntegration', SentryIntegrations.Vue, 'SentryVueIntegrationOptions')\n  .serviceFactory('Logger', LoggerFactory, 'buildId', 'ConsoleLoggerFactory', 'env', 'sentryDsn', 'SentryLoggerFactory')\n  .container.Logger\n))\n// Inicializace a spuÅ¡tÄ›nÃ­ booter aplikace.\n.then(() => (\n  bottle\n  .constant('cordovaBootDelay', config.cordovaBootDelay)\n  .constant('Document', document)\n  .service('KiwiLighter1BootManager', KiwiLighter1BootManager, 'cordovaBootDelay', 'Document')\n  .container.KiwiLighter1BootManager.boot()\n))\n// Inicializace a spuÅ¡tÄ›nÃ­ Player aplikace.\n.then(() => (\n  bottle\n  .constant('CommunicatorSettingsConstructor', CommunicatorSettings)\n  .constant('Config', config)\n  .constant('CordovaLocalFileSystem', cordova.file)\n  .constant('CordovaPluginZip', zip)\n  .constant('CordovaUnitConstructor', CordovaUnit)\n  .constant('CssValue', cssValue)\n  .constant('DhtmlxToIcalEventConstructor', DhtmlxToIcalEvent)\n  .constant('DhtmlxToIcalRecTypeConstructor', DhtmlxToIcalRecType)\n  .constant('DivViewerSourceConstructor', DivViewerSource)\n  .constant('DsBinaryAdapterOptions', {basePath: `/external-data/html`})\n  .constant('DsLocalStorageAdapterOptions', {basePath: config.name})\n  .constant('Fecha', fecha)\n  .constant('FileArchiveVolumeConstructor', KiwiLighter1FileArchiveVolume)\n  .constant('FileSystemDirectoryConstructor', KiwiLighter1FileSystemDirectory)\n  .constant('FileSystemFileConstructor', KiwiLighter1FileSystemFile)\n  .constant('FileSystemPathConstructor', FileSystemPath)\n  .constant('FileSystemUnitConstructor', KiwiLighter1FileSystemUnit)\n  .constant('FileTransferDownloadConstructor', KiwiLighter1FileTransferDownload)\n  .constant('GenericPool', genericPool)\n  .constant('IcalApi', ICAL)\n  .constant('ImageViewerControllerConstructor', ImageViewerController)\n  .constant('JavascriptStateMachine', JavascriptStateMachine)\n  .constant('KiwiLighter1VideoViewerControllerConstructor', KiwiLighter1VideoViewerController)\n  .constant('LighterApp', cordova.plugins.kiwiApp)\n  .constant('LighterControl', cordova.plugins.kiwiControl)\n  .constant('LighterDrive', cordova.plugins.kiwiDrive)\n  .constant('LighterFileTransfer', cordova.plugins.kiwiFileTransfer)\n  .constant('LighterFirmware', cordova.plugins.kiwiFirmware)\n  .constant('LighterMemory', cordova.plugins.kiwiMemory)\n  .constant('LighterNetwork', cordova.plugins.kiwiNetwork)\n  .constant('LighterPower', cordova.plugins.kiwiPower)\n  .constant('LighterScreen', cordova.plugins.kiwiScreen)\n  .constant('LighterSensor', cordova.plugins.kiwiSensor)\n  .constant('LighterSound', cordova.plugins.kiwiSound)\n  .constant('LighterTime', cordova.plugins.kiwiTime)\n  .constant('Location', location)\n  .constant('MediumRegistryConstructor', MediumRegistry)\n  .constant('Nanoid', nanoid)\n  .constant('Navigator', navigator)\n  .constant('NetworkConnectionConstructor', NetworkConnection)\n  .constant('PathBrowserify', PathBrowserify)\n  .constant('PdfParentConstructor', PdfParent)\n  .constant('PdfViewerControllerConstructor', PdfViewerController)\n  .constant('PdfViewerSourceConstructor', PdfViewerSource)\n  .constant('PenpalConnectToChild', connectToChild)\n  .constant('PoolAsyncConstructor', PoolAsync)\n  .constant('PoolConstructor', Pool)\n  .constant('PositionFrameConstructor', PositionFrame)\n  .constant('QueueConstructor', Queue)\n  .constant('Semver', semver)\n  .constant('SetupErrorConstructor', SetupError)\n  .constant('StateMachineConstructor', StateMachine)\n  .constant('UriJsConstructor', URI)\n  .constant('VeeValidate', VeeValidate)\n  .constant('ViewerDelayerConstructor', ViewerDelayer)\n  .constant('ViewerDelayerOptions', {delay: config.viewer.errorDelay, limit: config.viewer.errorLimit})\n  .constant('ViewerDirectorConstructor', ViewerDirector)\n  .constant('ViewerLifeCycleConstructor', ViewerLifeCycle)\n  .constant('ViewerSlideConstructor', ViewerSlide)\n  .constant('ViewerSourceIframeConstructor', ViewerSourceIframe)\n  .constant('ViewerSourceVideoConstructor', ViewerSourceVideo)\n  .constant('ViewerThreadConstructor', ViewerThread)\n  .constant('ViewerThreadOptions', {loadLimit: config.viewer.loadLimit})\n  .constant('VirtualKeyboardHiddenConstructor', VirtualKeyboardHidden)\n  .constant('VueConstructor', Vue)\n  .constant('Window', window)\n  .constant('autorebootDefaultDisabled', config.autorebootDefaultDisabled)\n  .constant('autorebootDefaultInterval', config.autorebootDefaultInterval)\n  .constant('autorebootMinInterval', config.autorebootMinInterval)\n  .constant('defaultOrientationEnum', config.device.orientation.defaultOrientationEnum)\n  .constant('fileSystemLocalhostPort', config.fileSystemLocalhostPort)\n  .constant('htmlIframeLoadDelay', config.htmlIframeLoadDelay)\n  .constant('htmlVideoBlank', htmlVideoBlank)\n  .constant('kiwiLighterApiVersion', config.kiwiLighterApiVersion)\n  .constant('longTimersMaxDelay', config.longTimersMaxDelay)\n  .constant('origin', location.origin)\n  .constant('pdfConnectionTimeout', config.pdfConnectionTimeout)\n  .constant('pdfSourceMax', config.pdfSourceMax)\n  .service('AnalyticsTracker', AnalyticsTracker, 'QueueFactory', 'Session', 'Store')\n  .service('AppManager', KiwiLighter1AppManager, 'LighterApp', 'PromisifyLighter')\n  .service('AutorebootCommunicator', AutorebootCommunicator)\n  .service('AutorebootManager', AutorebootManager, 'Logger', 'autorebootMinInterval', 'PowerManager', 'LongTimers')\n  .service('AutorebootReplacer', AutorebootReplacer, 'autorebootDefaultDisabled', 'autorebootDefaultInterval', 'AutorebootManager')\n  .service('Communicator', Communicator, 'ContentCommunicator')\n  .service('CommunicatorControl', CommunicatorControl)\n  .service('CommunicatorSession', CommunicatorSession, 'AutorebootCommunicator', 'CommunicatorControl', 'Session')\n  .service('CommunicatorSettingsFactory', CommunicatorSettingsFactory, 'CommunicatorSettingsConstructor')\n  .service('ContentCommunicator', ContentCommunicator, 'CommunicatorSession', 'CommunicatorSettingsFactory', 'Config', 'FirmwareManager', 'PlaylistCommunicator')\n  .service('ControlListener', KiwiLighter1ControlListener, 'Window', 'ControlParser')\n  .service('ControlManager', KiwiLighter1ControlManager, 'LighterControl', 'ControlListener', 'PromisifyLighter')\n  .service('ControlParser', KiwiLighter1ControlParser)\n  .service('CordovaArchiver', CordovaArchiver, 'CordovaPluginZip')\n  .service('CordovaResolver', CordovaResolver, 'Window', 'PromisifyFile')\n  .service('CordovaUnitResource', CordovaUnitResource, 'CordovaUnitConstructor', 'CordovaLocalFileSystem')\n  .service('Detector', Detector, 'DriveManager')\n  .service('Device', Device, 'buildId', 'AnalyticsTracker', 'Communicator', 'FingerprintFallback', 'FirmwareManager', 'Logger', 'LoggerManager', 'NetworkListener', 'PowerManager', 'Replacer', 'ReportManager', 'ScheduleManager', 'Session', 'StartupManager', 'Store', 'Updater', 'ViewerDirectorResource', 'ViewerRegistry')\n  .service('DhtmlxDateParser', DhtmlxDateParser, 'Fecha')\n  .service('DhtmlxToIcalEventFactory', DhtmlxToIcalEventFactory, 'DhtmlxToIcalEventConstructor', 'IcalApi', 'DhtmlxDateParser')\n  .service('DhtmlxToIcalExporter', DhtmlxToIcalExporter, 'IcalApi', 'DhtmlxToIcalEventFactory', 'DhtmlxToIcalRecTypeFactory', 'IcalUtil')\n  .service('DhtmlxToIcalRecTypeFactory', DhtmlxToIcalRecTypeFactory, 'DhtmlxToIcalRecTypeConstructor', 'IcalApi', 'IcalUtil')\n  .service('DivViewerSourceCreator', DivViewerSourceCreator, 'PoolFactory', 'DivViewerSourceFactory')\n  .service('DivViewerSourceFactory', DivViewerSourceFactory, 'DivViewerSourceConstructor', 'PositionFrameFactory')\n  .service('Downloader', Downloader, 'Config', 'Detector', 'Store', 'Session', 'ViewerRegistry')\n  .service('DriveManager', KiwiLighter1DriveManager, 'LighterDrive', 'PromisifyLighter')\n  .service('DsBinaryAdapter', DsBinaryAdapter, 'FileArchiveManager', 'FileSystemPathFactory', 'FileSystemManager', 'FileSystemMapper', 'FileTransferManager', 'DsBinaryAdapterOptions')\n  .service('DsLocalStorageAdapter', DsLocalStorageAdapter, 'DsLocalStorageAdapterOptions')\n  .service('FileArchiveManager', KiwiLighter1FileArchiveManager, 'FileSystemManager', 'FileArchiveVolumeFactory')\n  .service('FileArchiveVolumeFactory', KiwiLighter1FileArchiveVolumeFactory, 'FileArchiveVolumeConstructor', 'CordovaArchiver', 'FileSystemManager', 'FileSystemMapper', 'FileSystemPathFactory')\n  .service('FileSystemEntryFactory', KiwiLighter1FileSystemEntryFactory, 'FileSystemDirectoryConstructor', 'FileSystemFileConstructor', 'CordovaResolver', 'FileSystemMapper', 'FileSystemPathFactory', 'PromisifyFile')\n  .service('FileSystemManager', KiwiLighter1FileSystemManager, 'CordovaResolver', 'CordovaUnitResource', 'FileSystemEntryFactory', 'FileSystemMapper', 'FileSystemPathFactory', 'PromisifyFile', 'FileSystemUnitFactory')\n  .service('FileSystemMapper', KiwiLighter1FileSystemMapper, 'fileSystemLocalhostPort', 'PathBrowserify', 'CordovaUnitResource')\n  .service('FileSystemPathFactory', FileSystemPathFactory, 'FileSystemPathConstructor', 'PathBrowserify')\n  .service('FileSystemUnitFactory', KiwiLighter1FileSystemUnitFactory, 'FileSystemUnitConstructor', 'FileSystemEntryFactory', 'FileSystemPathFactory')\n  .service('FileTransferDownloadFactory', KiwiLighter1FileTransferDownloadFactory, 'FileTransferDownloadConstructor', 'CordovaResolver', 'FileSystemEntryFactory', 'LighterFileTransfer', 'FileSystemMapper', 'PromisifyLighter')\n  .service('FileTransferManager', KiwiLighter1FileTransferManager, 'FileTransferDownloadFactory')\n  .service('FingerprintBrowser', FingerprintBrowser, 'FingerprintHasher')\n  .service('FingerprintFallback', FingerprintFallback, 'FingerprintBrowser', 'FingerprintHardware')\n  .service('FingerprintHardware', FingerprintHardware, 'FirmwareManager', 'FingerprintHasher', 'NetworkManager')\n  .service('FingerprintHasher', FingerprintHasher)\n  .service('FirmwareManager', KiwiLighter1FirmwareManager, 'LighterFirmware', 'PromisifyLighter')\n  .service('FocusManager', FocusNoop, 'ControlManager', 'FocusNavigator')\n  .service('FocusNavigator', FocusNavigator, 'Document')\n  .service('HtmlElementRepairer', HtmlElementRepairer)\n  .service('HtmlIframePreflighterFile', HtmlIframePreflighterFile, 'XhrFetcher')\n  .service('HtmlIframePreflighterHttp', HtmlIframePreflighterHttp)\n  .service('HtmlIframePreflighterNoop', HtmlIframePreflighterNoop)\n  .service('HtmlIframePreflighterRegistry', HtmlIframePreflighterRegistry, 'UriJsConstructor', 'Location', 'HtmlIframePreflighterFile', 'HtmlIframePreflighterHttp')\n  .service('HtmlMediaUtil', HtmlMediaUtil)\n  .service('HtmlVideoRepairer', HtmlVideoRepairer, 'htmlVideoBlank', 'HtmlElementRepairer', 'HtmlMediaUtil')\n  .service('IcalUtil', IcalUtil, 'IcalApi')\n  .service('IdGenerator', IdGenerator, 'Nanoid')\n  .service('ImageViewerControllerFactory', ImageViewerControllerFactory, 'ImageViewerControllerConstructor', 'ViewerLifeCycleFactory')\n  .service('ImageViewerType', ImageFileViewerType, 'ImageViewerControllerFactory', 'DivViewerSourceCreator')\n  .service('KioskViewerType', KioskViewerType, 'htmlIframeLoadDelay', 'HtmlIframePreflighterNoop', 'ViewerSourceIframeCreator')\n  .service('KiwiLighterApiNetworkTypeFactory', KiwiLighterApiNetworkTypeFactory)\n  .service('LoggerManager', LoggerManager, 'AppManager', 'FirmwareManager', 'Logger')\n  .service('LongTimers', LongTimers, 'longTimersMaxDelay')\n  .service('MemoryManager', KiwiLighter1MemoryManager, 'LighterMemory', 'PromisifyLighter')\n  .service('NetworkConnectionFactory', NetworkConnectionFactory, 'NetworkConnectionConstructor')\n  .service('NetworkListener', WebNetworkListener, 'Window', 'Navigator')\n  .service('NetworkManager', KiwiLighter1NetworkManager, 'NetworkConnectionFactory', 'LighterNetwork', 'KiwiLighterApiNetworkTypeFactory', 'PromisifyLighter')\n  .service('OrganizationHelper', OrganizationHelper)\n  .service('OrientationMapper', KiwiLighter1OrientationMapper)\n  .service('PdfFileViewerType', PdfFileViewerType, 'PdfViewerControllerFactory', 'PdfViewerSourceCreator')\n  .service('PdfParentFactory', PdfParentFactory, 'PdfParentConstructor', 'PenpalConnectToChild', 'origin', 'pdfConnectionTimeout')\n  .service('PdfRecycler', PdfRecycler)\n  .service('PdfViewerControllerFactory', PdfViewerControllerFactory, 'PdfViewerControllerConstructor', 'ViewerLifeCycleFactory')\n  .service('PdfViewerSourceCreator', PdfViewerSourceCreator, 'pdfSourceMax', 'PoolAsyncFactory', 'PdfRecycler', 'PdfViewerSourceFactory')\n  .service('PdfViewerSourceFactory', PdfViewerSourceFactory, 'PdfViewerSourceConstructor', 'ViewerSourceIframeCreator', 'PdfParentFactory')\n  .service('Player', Player, 'AppManager', 'ControlManager', 'Device', 'FocusManager', 'Logger', 'NetworkListener', 'ScreenManager', 'Session', 'SetupManager', 'VirtualKeyboardManager', 'VueFactory')\n  .service('PlaylistCommunicator', PlaylistCommunicator, 'TrackCommunicator')\n  .service('PoolAsyncFactory', PoolAsyncFactory, 'PoolAsyncConstructor', 'GenericPool')\n  .service('PoolFactory', PoolFactory, 'PoolConstructor')\n  .service('PositionFrameFactory', PositionFrameFactory, 'PositionFrameConstructor', 'CssValue', 'StateMachineFactory')\n  .service('PowerManager', KiwiLighter1PowerManager, 'LighterPower', 'PromisifyLighter')\n  .service('Promisify', Promisify)\n  .service('PromisifyFile', KiwiLighter1PromisifyFile, 'Promisify')\n  .service('PromisifyLighter', KiwiLighter1PromisifyLighter, 'Promisify')\n  .service('QueueFactory', QueueFactory, 'QueueConstructor')\n  .service('Replacer', Replacer, 'AutorebootReplacer', 'Downloader', 'Logger', 'Store', 'QueueFactory', 'ReplacerControl', 'ReplacerPower', 'ReplacerSound', 'ReplacerScreen', 'Session')\n  .service('ReplacerControl', ReplacerControl, 'ControlManager', 'Logger')\n  .service('ReplacerPower', ReplacerPower, 'PowerManager')\n  .service('ReplacerScreen', ReplacerScreen, 'defaultOrientationEnum', 'ScreenManager')\n  .service('ReplacerSound', ReplacerSound, 'SoundManager')\n  .service('ReportManager', ReportManager, 'AppManager', 'ControlManager', 'DriveManager', 'FirmwareManager', 'Logger', 'MemoryManager', 'NetworkManager', 'PowerManager', 'ScreenManager', 'SensorManager', 'SoundManager', 'TimeManager')\n  .service('ScheduleManager', ScheduleManager, 'ViewerRegistry')\n  .service('ScreenManager', KiwiLighter1ScreenManager, 'LighterScreen', 'OrientationMapper', 'PromisifyLighter')\n  .service('SensorManager', KiwiLighter1SensorManager, 'LighterSensor', 'PromisifyLighter')\n  .service('SetupErrorFactory', SetupErrorFactory, 'SetupErrorConstructor')\n  .service('SetupManager', SetupManager, 'OrganizationHelper', 'SetupErrorFactory')\n  .service('SoundManager', KiwiLighter1SoundManager, 'LighterSound', 'PromisifyLighter')\n  .service('StartupManager', KiwiLighter1StartupManager, 'LighterFirmware', 'PromisifyLighter', 'kiwiLighterApiVersion', 'Semver')\n  .service('StateMachineFactory', StateMachineFactory, 'JavascriptStateMachine', 'StateMachineConstructor')\n  .service('StreamViewerType', StreamViewerType, 'VideoViewerControllerFactory', 'VideoViewerSourceCreator')\n  .service('StretchNative', StretchNative)\n  .service('TimeManager', KiwiLighter1TimeManager, 'LighterTime', 'PromisifyLighter')\n  .service('TrackCommunicator', TrackCommunicator, 'TrackPlanCommunicator')\n  .service('TrackPlanCommunicator', TrackPlanCommunicator, 'DhtmlxToIcalExporter')\n  .service('Updater', Updater, 'AppManager', 'buildId', 'Communicator', 'Session', 'Store')\n  .service('VideoViewerControllerFactory', KiwiLighter1VideoViewerControllerFactory, 'KiwiLighter1VideoViewerControllerConstructor', 'HtmlMediaUtil', 'StretchNative', 'ViewerLifeCycleFactory')\n  .service('VideoViewerSourceCreator', ViewerSourceVideoCreator, 'PoolFactory', 'HtmlVideoRepairer', 'VideoViewerSourceFactory')\n  .service('VideoViewerSourceFactory', ViewerSourceVideoFactory, 'ViewerSourceVideoConstructor', 'PositionFrameFactory')\n  .service('VideoViewerType', KiwiLighter1VideoViewerType, 'VideoViewerSourceCreator')\n  .service('ViewerDelayerFactory', ViewerDelayerFactory, 'ViewerDelayerConstructor', 'ViewerDelayerOptions')\n  .service('ViewerDirectorFactory', ViewerDirectorFactory, 'ViewerDirectorConstructor', 'QueueFactory', 'ViewerThreadFactory')\n  .service('ViewerDirectorResource', ViewerDirectorResource, 'ViewerDirectorFactory')\n  .service('ViewerLifeCycleFactory', ViewerLifeCycleFactory, 'ViewerLifeCycleConstructor', 'StateMachineFactory')\n  .service('ViewerRegistry', KiwiLighter1ViewerRegistry, 'MediumRegistryConstructor', 'ImageViewerType', 'KioskViewerType', 'PdfFileViewerType', 'StreamViewerType', 'VideoViewerType', 'ViewerTypeWeb', 'ViewerTypeWidget')\n  .service('ViewerSlideFactory', ViewerSlideFactory, 'ViewerSlideConstructor', 'StateMachineFactory')\n  .service('ViewerSourceIframeCreator', ViewerSourceIframeCreator, 'PoolFactory', 'ViewerSourceIframeFactory')\n  .service('ViewerSourceIframeFactory', ViewerSourceIframeFactory, 'ViewerSourceIframeConstructor', 'PositionFrameFactory')\n  .service('ViewerThreadFactory', ViewerThreadFactory, 'ViewerThreadConstructor', 'ViewerDelayerFactory', 'Logger', 'NetworkListener', 'ViewerSlideFactory', 'ViewerThreadOptions')\n  .service('ViewerTypeWeb', ViewerTypeWeb, 'htmlIframeLoadDelay', 'HtmlIframePreflighterNoop', 'ViewerSourceIframeCreator')\n  .service('ViewerTypeWidget', KiwiLighter1WidgetViewerType, 'htmlIframeLoadDelay', 'HtmlIframePreflighterRegistry', 'ViewerSourceIframeCreator')\n  .service('VirtualKeyboardHiddenFactory', VirtualKeyboardHiddenFactory, 'VirtualKeyboardHiddenConstructor')\n  .service('VirtualKeyboardManager', VirtualKeyboardManager, 'VirtualKeyboardHiddenFactory')\n  .service('VueFactory', VueFactory, 'VeeValidate', 'VueConstructor')\n  .service('XhrFetcher', XhrFetcher)\n  .serviceFactory(\n    'Session',\n    (store) => store.inject('session', {id: config.device.session.defaultId}),\n    'Store'\n  )\n  .serviceFactory(\n    'Store',\n    (binary, storage) => new Store({binary, storage}),\n    'DsBinaryAdapter',\n    'DsLocalStorageAdapter'\n  )\n  .container.Player.start('#player')\n))\n.catch((error) => bottle.container.Logger.error(error));\n","// removed by extract-text-webpack-plugin","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport MemoryInfo from '../../memory/memory-info';\n\n/**\n * SprÃ¡vce operaÄ�nÃ­ pamÄ›ti pro Ki-Wi Lighter API.\n * @implements {MemoryManager}\n */\nclass KiwiLighter1MemoryManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {KiwiLighterApiMemoryManager} lighterMemory\n   * @param {KiwiLighter1PromisifyLighter} promisify\n   */\n  constructor (lighterMemory, promisify) {\n    this.lighterMemory = lighterMemory;\n    this.promisify = promisify;\n  }\n\n  /** @inheritdoc */\n  getInfo () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterMemory, 'getInfo')()\n      .then((info) => new MemoryInfo(info.free, info.total, info.used))\n    ));\n  }\n}\n\nexport default KiwiLighter1MemoryManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * SprÃ¡vce pÅ™ipojenÃ­ k sÃ­ti pro Ki-Wi Lighter API.\n * @implements {NetworkManager}\n */\nclass KiwiLighter1NetworkManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {NetworkConnectionFactory} connectionFactory TovÃ¡rna na informace o pÅ™ipojenÃ­ k sÃ­ti.\n   * @param {KiwiLighterApiNetworkManager} networkManager\n   * @param {KiwiLighterApiNetworkTypeFactory} networkTypeFactory\n   * @param {KiwiLighter1PromisifyLighter} promisify\n   */\n  constructor (connectionFactory, networkManager, networkTypeFactory, promisify) {\n    this.connectionFactory = connectionFactory;\n    this.networkManager = networkManager;\n    this.networkTypeFactory = networkTypeFactory;\n    this.promisify = promisify;\n  }\n\n  /** @inheritdoc */\n  getAllConnections () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.networkManager, 'getAllConnections')()\n      .then((connectionArray) => connectionArray.map((connection) => {\n        const type = this.networkTypeFactory.toNetworkType(connection.type);\n        return this.connectionFactory.create(connection.mac, type, {ip: connection.ip});\n      }))\n    ));\n  }\n}\n\nexport default KiwiLighter1NetworkManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport KiwiLighterApiOrientation from '../../kiwi-lighter-api/kiwi-lighter-api-orientation';\nimport OrientationEnum from '../../orientation/orientation-enum';\n\n/**\n * PÅ™evodnÃ­k mezi Ä�Ã­selnÃ­kem orientace v aplikaci a v Lighter API.\n * @implements {OrientationMapper}\n */\nclass KiwiLighter1OrientationMapper {\n  /**\n   * PÅ™evede poloÅ¾ku z Ä�Ã­selnÃ­ku orientace aplikace do Ä�Ã­selnÃ­ku Lighter API.\n   * @param {OrientationEnum} orientationEnum Orientace aplikace.\n   * @returns {string} Orientace Lighter API.\n   */\n  fromEnum (orientationEnum) {\n    switch (orientationEnum) {\n      case OrientationEnum.CLOCKWISE_0:\n        return KiwiLighterApiOrientation.Clockwise0;\n      case OrientationEnum.CLOCKWISE_90:\n        return KiwiLighterApiOrientation.Clockwise90;\n      case OrientationEnum.CLOCKWISE_180:\n        return KiwiLighterApiOrientation.Clockwise180;\n      case OrientationEnum.CLOCKWISE_270:\n        return KiwiLighterApiOrientation.Clockwise270;\n      default:\n        throw new RangeError(`Unknown orientation \"${orientationEnum}\".`);\n    }\n  }\n\n  /**\n   * PÅ™evede poloÅ¾ku z Ä�Ã­selnÃ­ku orientace Lighter API do Ä�Ã­selnÃ­ku aplikace.\n   * @param {string} orientationString Orientace Lighter API.\n   * @returns {OrientationEnum} Orientace aplikace.\n   */\n  toEnum (orientationString) {\n    switch (orientationString) {\n      case KiwiLighterApiOrientation.Clockwise0:\n        return OrientationEnum.CLOCKWISE_0;\n      case KiwiLighterApiOrientation.Clockwise90:\n        return OrientationEnum.CLOCKWISE_90;\n      case KiwiLighterApiOrientation.Clockwise180:\n        return OrientationEnum.CLOCKWISE_180;\n      case KiwiLighterApiOrientation.Clockwise270:\n        return OrientationEnum.CLOCKWISE_270;\n      default:\n        throw new RangeError(`Unknown orientation \"${orientationString}\".`);\n    }\n  }\n}\n\nexport default KiwiLighter1OrientationMapper;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isString from 'lodash/isString';\n\nimport CommandEnum from '../../command-enum';\nimport KiwiLighterApiPowerCommand from '../../kiwi-lighter-api/kiwi-lighter-api-power-command';\n\n/**\n * SprÃ¡vce napÃ¡jenÃ­ pro Ki-Wi Lighter API.\n * @implements {PowerManager}\n */\nclass KiwiLighter1PowerManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {KiwiLighterApiPowerManager} lighterPower\n   * @param {PromisifyLAdapterKiwiLighter1.PromisifyLighterighter} promisify PromisifikaÄ�nÃ­ utilita pro Ki-Wi Lighter API.\n   */\n  constructor (lighterPower, promisify) {\n    this.lighterPower = lighterPower;\n    this.promisify = promisify;\n  }\n\n  /** @inheritdoc */\n  createTimers (taskArray, timerArray) {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterPower, 'createTimers')(\n        timerArray.map((timer) => ({\n          command: this.parseCommand(timer.commandEnum),\n          day: timer.day,\n          hour: timer.hour,\n          minute: timer.minute,\n          second: timer.second\n        }))\n      )\n    ));\n  }\n\n  /** @inheritdoc */\n  deleteAllTimers () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterPower, 'deleteAllTimers')()\n    ));\n  }\n\n  /** @inheritdoc */\n  getBootDate () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterPower, 'getBootDate')()\n      .then((isoString) => {\n        if (!isString(isoString)) {\n          throw new TypeError(`Invalid string \"${isoString}\".`);\n        }\n        const date = new Date(isoString);\n        if (isNaN(date)) {\n          throw new TypeError(`Invalid date \"${isoString}\".`);\n        }\n        return date;\n      })\n    ));\n  }\n\n  /**\n   * NaÄ�te pÅ™Ã­kaz pro Ä�asovaÄ� v Lighter API Ä�Ã­selnÃ­ku.\n   * @param {CommandEnum} commandEnum PÅ™Ã­kaz v aplikaci.\n   * @private\n   * @returns {string} PÅ™Ã­kaz v Lighter API.\n   */\n  parseCommand (commandEnum) {\n    switch (commandEnum) {\n      case CommandEnum.POWER_OFF:\n        return KiwiLighterApiPowerCommand.Off;\n      case CommandEnum.POWER_ON:\n        return KiwiLighterApiPowerCommand.On;\n      default:\n        throw new RangeError(`Invalid command \"${commandEnum}\".`);\n    }\n  }\n\n  /** @inheritdoc */\n  reboot () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterPower, 'reboot')()\n    ));\n  }\n\n  /** @inheritdoc */\n  shutdown () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterPower, 'shutdown')()\n    ));\n  }\n}\n\nexport default KiwiLighter1PowerManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\nimport isError from 'lodash/isError';\n\nimport ErrorName from '../../error/error-name';\n\n/**\n * PromisifikaÄ�nÃ­ utilita pro Cordova File API.\n *\n * Cordova pouÅ¾Ã­vÃ¡ starÃ© ES5 zpracovÃ¡nÃ­ asynchronnÃ­ch volÃ¡nÃ­ pomocÃ­ callbackÅ¯.\n * Styl callbackÅ¯ neodpovÃ­dÃ¡ Node.js konvencÃ­m.\n * Callbacky jsou pÅ™edÃ¡vÃ¡ny aÅ¾ jako poslednÃ­ dvÄ› funkce.\n *\n * TakÃ© se provÃ¡dÃ­ konverze nÃ¡zvÅ¯ chyb v Error objektech.\n * Knihovny vracÃ­ starÃ© chybovÃ© kÃ³dy, mÃ­sto nÃ¡zvÅ¯.\n */\nclass KiwiLighter1PromisifyFile {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Promisify} promisify\n   */\n  constructor (promisify) {\n    this.promisify = promisify;\n  }\n\n  /**\n   * Konverze chyb na nativnÃ­ `Error` objekty.\n   * @param {PromisifySettlement} settlement\n   * @private\n   * @returns {Error}\n   */\n  failureTransform (settlement) {\n    const fromError = settlement.callbackArgArray[0];\n    if (isError(fromError)) {\n      return fromError;\n    }\n    const fromCode = get(fromError, 'code');\n    const name = this.getName(fromCode);\n    const message = this.getMessage(settlement);\n    switch (name) {\n      case ErrorName.Error:\n        return new Error(message);\n      case ErrorName.RangeError:\n        return new RangeError(message);\n      case ErrorName.ReferenceError:\n        return new ReferenceError(message);\n      case ErrorName.TypeError:\n        return new TypeError(message);\n      default:\n        // Nic.\n    }\n    const error = new Error(message);\n    error.name = name;\n    return error;\n  }\n\n  /**\n   * ZjistÃ­ zprÃ¡vu chyby doplnÄ›nou o debug informace.\n   * @param {PromisifySettlement} settlement\n   * @private\n   * @returns {ErrorName}\n   */\n  getMessage (settlement) {\n    return `@ ${settlement.key}`;\n  }\n\n  /**\n   * ZjistÃ­ nÃ¡zev chyby.\n   * @param {number} code KÃ³d chyby v Cordova File Plugin.\n   * [Dokumentace](https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/#list-of-error-codes-and-meanings)\n   * @private\n   * @returns {ErrorName}\n   */\n  getName (code) {\n    switch (code) {\n      case 1:\n        return ErrorName.NotFoundError;\n      case 2:\n        return ErrorName.SecurityError;\n      case 3:\n        return ErrorName.AbortError;\n      case 4:\n        return ErrorName.NotReadableError;\n      case 5:\n        return ErrorName.EncodingError;\n      case 6:\n        return ErrorName.NoModificationAllowedError;\n      case 7:\n        return ErrorName.InvalidStateError;\n      case 8:\n        return ErrorName.SyntaxError;\n      case 9:\n        return ErrorName.InvalidModificationError;\n      case 10:\n        return ErrorName.QuotaExceededError;\n      case 11:\n        return ErrorName.TypeError;\n      case 12:\n        return ErrorName.PathExistsError;\n      default:\n        return ErrorName.Error;\n    }\n  }\n\n  /**\n   * Provede promisifikaci metody s callbacky.\n   * Metoda je uloÅ¾ena v objektu, kterÃ½ mÃ¡ bÃ½t nastaven jako jejÃ­ kontext.\n   * @param {Object} context [Kontext funkce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this#Function_context).\n   * @param {number|string} key KlÃ­Ä�, pod kterÃ½m je metoda dostupnÃ¡ v kontextu.\n   * @returns {Function} PromisifikovanÃ¡ funkce, kterÃ© lze pÅ™edÃ¡vat parametry.\n   */\n  method (context, key) {\n    return this.promisify.method(context, key, {\n      failureIndex: -1,\n      failureTransform: (...args) => this.failureTransform(...args),\n      successIndex: -2\n    });\n  }\n}\n\nexport default KiwiLighter1PromisifyFile;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * PromisifikaÄ�nÃ­ utilita pro Ki-Wi Lighter API.\n */\nclass KiwiLighter1PromisifyLighter {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Promisify} promisify\n   */\n  constructor (promisify) {\n    this.promisify = promisify;\n  }\n\n  /**\n   * Konverze chybovÃ½ch objektÅ¯ na nativnÃ­ `Error` objekty.\n   * @param {PromisifySettlement} settlement\n   * @private\n   * @returns {Error}\n   */\n  failureTransform (settlement) {\n    const errorObject = settlement.callbackArgArray[0];\n    // VytvoÅ™enÃ­ standardnÃ­ho error objektu.\n    const error = new Error(errorObject.message);\n    error.name = errorObject.name;\n    // PÅ™idÃ¡nÃ­ dodateÄ�nÃ½ch dat z chybovÃ©ho objektu.\n    Object.entries(errorObject)\n    .forEach(([key, value]) => {\n      if (key === 'message' || key === 'name') {\n        return;\n      }\n      error[key] = value;\n    });\n    return error;\n  }\n\n  /**\n   * Provede promisifikaci metody s callbacky.\n   * Metoda je uloÅ¾ena v objektu, kterÃ½ mÃ¡ bÃ½t nastaven jako jejÃ­ kontext.\n   * @param {Object} context [Kontext funkce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this#Function_context).\n   * @param {number|string} key KlÃ­Ä�, pod kterÃ½m je metoda dostupnÃ¡ v kontextu.\n   * @returns {Function} PromisifikovanÃ¡ funkce, kterÃ© lze pÅ™edÃ¡vat parametry.\n   */\n  method (context, key) {\n    return this.promisify.method(context, key, {\n      failureIndex: 1,\n      failureTransform: (...args) => this.failureTransform(...args),\n      successIndex: 0\n    });\n  }\n}\n\nexport default KiwiLighter1PromisifyLighter;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport OrientationEnum from '../../orientation/orientation-enum';\n\n/**\n * SprÃ¡vce obrazovky pro Ki-Wi Lighter API.\n * @implements {ScreenManager}\n */\nclass KiwiLighter1ScreenManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {KiwiLighterApiScreenManager} lighterScreen\n   * @param {KiwiLighter1OrientationMapper} orientationMapper PÅ™evodnÃ­k mezi Ä�Ã­selnÃ­ky orientace.\n   * @param {KiwiLighter1PromisifyLighter} promisify\n   */\n  constructor (lighterScreen, orientationMapper, promisify) {\n    this.lighterScreen = lighterScreen;\n    this.orientationMapper = orientationMapper;\n    this.promisify = promisify;\n  }\n\n  /** @inheritdoc */\n  createScreenshot () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterScreen, 'createScreenshot')()\n    ));\n  }\n\n  /** @inheritdoc */\n  getBrightness () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterScreen, 'getBrightness')()\n    ));\n  }\n\n  /** @inheritdoc */\n  getCssOrientation () {\n    return new Promise((resolve) => resolve(\n      OrientationEnum.CLOCKWISE_0\n    ));\n  }\n\n  /** @inheritdoc */\n  getOrientation () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterScreen, 'getOrientation')()\n      .then((orientationString) => this.orientationMapper.toEnum(orientationString))\n    ));\n  }\n\n  /** @inheritdoc */\n  setOrientation (orientationEnum) {\n    return new Promise((resolve) => {\n      const orientationString = this.orientationMapper.fromEnum(orientationEnum);\n      return resolve(\n        this.promisify.method(this.lighterScreen, 'setOrientation')(orientationString)\n      );\n    });\n  }\n}\n\nexport default KiwiLighter1ScreenManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * SprÃ¡vce fyzickÃ½ch senzorÅ¯ pro Ki-Wi Lighter API.\n * @implements {SensorManager}\n */\nclass KiwiLighter1SensorManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {KiwiLighterApiSensorManager} lighterSensor\n   * @param {KiwiLighter1PromisifyLighter} promisify\n   */\n  constructor (lighterSensor, promisify) {\n    this.lighterSensor = lighterSensor;\n    this.promisify = promisify;\n  }\n\n  /** @inheritdoc */\n  getTemperature () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterSensor, 'getTemperature')()\n    ));\n  }\n}\n\nexport default KiwiLighter1SensorManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * SprÃ¡vce zvuku pro Ki-Wi Lighter API.\n * @implements {SoundManager}\n */\nclass KiwiLighter1SoundManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {KiwiLighterApiSoundManager} lighterSound\n   * @param {KiwiLighter1PromisifyLighter} promisify\n   */\n  constructor (lighterSound, promisify) {\n    this.lighterSound = lighterSound;\n    this.promisify = promisify;\n  }\n\n  /** @inheritdoc */\n  getVolume () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterSound, 'getVolume')()\n    ));\n  }\n\n  /** @inheritdoc */\n  isMuted () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterSound, 'isMuted')()\n    ));\n  }\n\n  /** @inheritdoc */\n  setVolume (volume) {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterSound, 'setVolume')(volume)\n    ));\n  }\n}\n\nexport default KiwiLighter1SoundManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * SprÃ¡vce spuÅ¡tÄ›nÃ­ pro Ki-Wi Lighter API.\n * @implements {StartupManager}\n */\nclass KiwiLighter1StartupManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {KiwiLighterApiFirmwareManager} firmwareManager\n   * @param {KiwiLighter1PromisifyLighter} promisify\n   * @param {string} range Semver rozsah, kterÃ½ musÃ­ API splÅˆovat.\n   * @param {Semver} semver\n   */\n  constructor (firmwareManager, promisify, range, semver) {\n    this.firmwareManager = firmwareManager;\n    this.promisify = promisify;\n    this.range = range;\n    this.semver = semver;\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // PrÃ¡zdnÃ¡ metoda pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /** @inheritdoc */\n  start () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.firmwareManager, 'getInterfaceVersion')()\n      .then((version) => {\n        const {range} = this;\n        if (!this.semver.satisfies(version, range)) {\n          throw new RangeError(`API version \"${version}\" is out of the expected range \"${range}\".`);\n        }\n      })\n    ));\n  }\n}\n\nexport default KiwiLighter1StartupManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * SprÃ¡vce Ä�asu a Ä�asovÃ½ch zÃ³n pro Ki-Wi Lighter API.\n * @implements {TimeManager}\n */\nclass KiwiLighter1TimeManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {KiwiLighterApiTimeManager} lighterTime\n   * @param {KiwiLighter1PromisifyLighter} promisify\n   */\n  constructor (lighterTime, promisify) {\n    this.lighterTime = lighterTime;\n    this.promisify = promisify;\n  }\n\n  /** @inheritdoc */\n  getZone () {\n    return new Promise((resolve) => resolve(\n      this.promisify.method(this.lighterTime, 'getZone')()\n    ));\n  }\n}\n\nexport default KiwiLighter1TimeManager;\n","/**\n * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na ovladaÄ�e pro zobrazovÃ¡nÃ­ video souborÅ¯.\n */\nclass KiwiLighter1VideoViewerControllerFactory {\n  /**\n   * VytvoÅ™Ã­ instanci\n   * @param {Class.<KiwiLighter1VideoViewerController>} KiwiLighter1VideoViewerController\n   * @param {HtmlMediaUtil} mediaUtil\n   * @param {StretchNative} stretchNative\n   * @param {ViewerLifeCycleFactory} viewerLifeCycleFactory\n   */\n  constructor (KiwiLighter1VideoViewerController, mediaUtil, stretchNative, viewerLifeCycleFactory) {\n    // TODO VyuÅ¾Ã­t pÅ™ipravenÃ© zÃ¡vislosti.\n    // - Bude nutnÃ½ builder pro testy.\n    this.KiwiLighter1VideoViewerController = KiwiLighter1VideoViewerController;\n    this.mediaUtil = mediaUtil;\n    this.stretchNative = stretchNative;\n    this.viewerLifeCycleFactory = viewerLifeCycleFactory;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ ovladaÄ�.\n   * @returns {KiwiLighter1VideoViewerController}\n   */\n  create () {\n    return new this.KiwiLighter1VideoViewerController();\n  }\n}\n\nexport default KiwiLighter1VideoViewerControllerFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport JavascriptStateMachine from 'javascript-state-machine';\nimport isNil from 'lodash/isNil';\n\nimport htmlImageBlank from '../../html/html-image-blank.png';\nimport HtmlMediaUtil from '../../html/html-media-util';\nimport StateMachine from '../../state-machine/state-machine';\nimport StateMachineFactory from '../../state-machine/state-machine-factory';\nimport StretchNative from '../../stretch/stretch-native';\nimport ViewerLifeCycle from '../../viewer/life-cycle/viewer-life-cycle';\n\n// TODO SdÃ­lÃ­ spoustu kÃ³du s ostatnÃ­mi ovladaÄ�i, DRY.\n// - ViewerControllerVideo (pro web)\n// - TizenSssp4VideoViewerController\n// - WebosSignage3_0StreamViewerController\n// TODO SdÃ­lÃ­ CSS tÅ™Ã­du viewer-controller-video s ostatnÃ­mi ovladaÄ�i.\n// - To je nevhodnÃ© z pohledu organizace, kde by mÄ›lo bÃ½t jmÃ©no dle tÅ™Ã­dy.\n// - Na druhou stranu aktuÃ¡lnÃ­ pÅ™Ã­stup, kdy se tÅ™Ã­dy odebÃ­rajÃ­ a pÅ™idÃ¡vajÃ­\n//   pÅ™i kaÅ¾dÃ© zmÄ›nÄ› mÃ©dia se takÃ© neosvÄ›dÄ�il, protoÅ¾e na krÃ¡tkÃ½ okamÅ¾ik nemusÃ­\n//   mÃ­t video element Å¾Ã¡dnou tÅ™Ã­du, takÅ¾e se zbyteÄ�nÄ› mÄ›nÃ­ jeho rozmÄ›ry.\n// - ZatÃ­m tedy ponechÃ¡no takto, dokud nedojde k refaktorizaci na lepÅ¡Ã­ Å™eÅ¡enÃ­.\n/**\n * OvladaÄ� pro zobrazovÃ¡nÃ­ video souborÅ¯ pro Ki-Wi Lighter API.\n * @implements {ViewerController}\n */\nclass KiwiLighter1VideoViewerController {\n  /** VytvoÅ™Ã­ instanci. */\n  constructor () {\n    this.stretchNative = new StretchNative();\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    /**\n     * @private\n     * @type {HtmlMediaUtil}\n     */\n    this.mediaUtil = new HtmlMediaUtil();\n    /**\n     * Callback pro selhÃ¡nÃ­ spouÅ¡tÄ›nÃ­ videa, pokud nÄ›jakÃ© probÃ­hÃ¡.\n     * @private\n     * @type {?Function}\n     */\n    this.playReject = null;\n    /**\n     * Callback pro ÃºspÄ›ch spouÅ¡tÄ›nÃ­ videa, pokud nÄ›jakÃ© probÃ­hÃ¡.\n     * @private\n     * @type {?Function}\n     */\n    this.playResolve = null;\n    /**\n     * ÄŒasovaÄ� pro maximÃ¡lnÃ­ dobu Ä�ekÃ¡nÃ­ na spuÅ¡tÄ›nÃ­ pÅ™ehrÃ¡vÃ¡nÃ­.\n     * @private\n     * @type {?number}\n     */\n    this.playTimeout = null;\n    this.scheduleInfo = null;\n    const stateMachineFactory = new StateMachineFactory(JavascriptStateMachine, StateMachine);\n    this.viewerLifeCycle = new ViewerLifeCycle(stateMachineFactory);\n    this.viewerSource = null;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onCanplaythrough = this.onCanplaythrough.bind(this);\n    this.onEnded = this.onEnded.bind(this);\n    this.onError = this.onError.bind(this);\n    this.onPlaying = this.onPlaying.bind(this);\n  }\n\n  /**\n   * NavÃ¡Å¾e naslouchÃ¡nÃ­ udÃ¡lostem z elementu.\n   * @param {HTMLVideoElement} el Element, kterÃ©mu se naslouchÃ¡.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  bindElement (el) {\n    el.addEventListener('canplaythrough', this.onCanplaythrough);\n    el.addEventListener('ended', this.onEnded);\n    el.addEventListener('error', this.onError);\n    el.addEventListener('playing', this.onPlaying);\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    clearTimeout(this.playTimeout);\n    const {viewerSource} = this;\n    if (!isNil(viewerSource)) {\n      const el = viewerSource.getEl();\n      this.unbindElement(el);\n    }\n  }\n\n  /** @inheritdoc */\n  enter () {\n    return this.viewerLifeCycle.enter(() => {\n      const {scheduleInfo, viewerSource} = this;\n      // UrÄ�enÃ­ vÅ¡ech potÅ™ebnÃ½ch hodnot.\n      const volume = scheduleInfo.getVolume();\n      const el = viewerSource.getEl();\n      const viewerFrame = viewerSource.getFrame();\n      // ZobrazenÃ­ obalujÃ­cÃ­ho elementu.\n      viewerFrame.enter();\n      // ZapnutÃ­ zvuku videa, pouze pokud je potÅ™eba.\n      // ZapnutÃ­ pÅ™i volume na 0 mÅ¯Å¾e pÅ™eruÅ¡it pÅ™ehrÃ¡vÃ¡nÃ­ zvuku jinÃ©ho videa.\n      if (volume > 0) {\n        el.muted = false;\n      }\n      // ZahÃ¡jenÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ videa.\n      return this.play(el);\n    });\n  }\n\n  /** @inheritdoc */\n  leave () {\n    return this.viewerLifeCycle.leave(() => {\n      const {viewerSource} = this;\n      // UrÄ�enÃ­ vÅ¡ech potÅ™ebnÃ½ch hodnot.\n      const el = viewerSource.getEl();\n      const viewerFrame = viewerSource.getFrame();\n      // SkrytÃ­ obalujÃ­cÃ­ho elementu.\n      viewerFrame.leave();\n      // Video se zastavÃ­.\n      el.pause();\n    });\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na dostateÄ�nÃ© naÄ�tenÃ­ zdroje v elementu.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onCanplaythrough () {\n    const el = this.viewerSource.getEl();\n    this.emitter.emit('loaded');\n    // OÅ¡etÅ™enÃ­ neoÄ�ekÃ¡vanÃ©ho opakovanÃ©ho vyvolanÃ­ udÃ¡losti `canplaythrough`.\n    // DochÃ¡zÃ­ k nÄ›mu v kaÅ¾dÃ© iteraci pÅ™ehrÃ¡vÃ¡nÃ­ pÅ™i nastavenÃ­ `loop`.\n    // PozorovÃ¡no ale i jindy, napÅ™. pÅ™i minimalizaci okna prohlÃ­Å¾eÄ�e.\n    el.removeEventListener('canplaythrough', this.onCanplaythrough);\n  }\n\n  /**\n   * DosaÅ¾enÃ­ konce pÅ™ehrÃ¡vÃ¡nÃ­.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onEnded () {\n    this.emitter.emit('played');\n  }\n\n  /**\n   * Reakce na chybu v elementu.\n   *\n   * Pokud probÃ­hÃ¡ pokus o spuÅ¡tÄ›nÃ­ videa,\n   * tak se chybovÃ¡ udÃ¡lost interpretuje jako jeho selhÃ¡nÃ­.\n   * V opaÄ�nÃ©m pÅ™Ã­padÄ› se chyba emituje.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onError () {\n    const el = this.viewerSource.getEl();\n    const error = this.mediaUtil.createError(el);\n    const {playReject} = this;\n    if (!isNil(playReject)) {\n      return playReject(error);\n    }\n    this.emitter.emit('error', error);\n  }\n\n  /**\n   * Reakce na skuteÄ�nÃ½ zaÄ�Ã¡tek pÅ™ehrÃ¡vÃ¡nÃ­.\n   * Pokud probÃ­hÃ¡ pokus o spuÅ¡tÄ›nÃ­ videa,\n   * tak se udÃ¡lost se zaÄ�Ã¡tkem pÅ™ehrÃ¡vÃ¡nÃ­m interpretuje jako jeho dokonÄ�enÃ­.\n   * V opaÄ�nÃ©m pÅ™Ã­padÄ› se nedÄ›lÃ¡ nic.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onPlaying () {\n    const {playResolve} = this;\n    if (!isNil(playResolve)) {\n      return playResolve();\n    }\n  }\n\n  /**\n   * SpustÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ video elementu.\n   *\n   * Vzhledem ke zpÄ›tnÃ© kompatibilitÄ› se starÃ½mi Chrome se naslouchÃ¡ udÃ¡losti `playing`,\n   * mÃ­sto spolehÃ¡nÃ­ na `Promise` vrÃ¡cenou metodou `play`.\n   *\n   * Je nutnÃ© naslouchat na udÃ¡lost `playing`, kterÃ¡ informuje o skuteÄ�nÃ©m zaÄ�Ã¡tku pÅ™ehrÃ¡vÃ¡nÃ­.\n   * UdÃ¡lost `play` informuje pouze o zaÄ�Ã¡tku pokusu o spuÅ¡tÄ›nÃ­.\n   * ExerimentÃ¡lnÄ› bylo zjiÅ¡tÄ›no, Å¾e stejnÄ› se chovÃ¡ i `Promise`,\n   * kterÃ¡ byla vrÃ¡cena pÅ™i volÃ¡nÃ­ `HTMLMediaElement.play`.\n   *\n   * Dokumentace:\n   * [HTMLMediaElement.play returns a Promise](https://developers.google.com/web/updates/2016/03/play-returns-promise).\n   * @param {HTMLVideoElement} el Element, kterÃ½ se mÃ¡ pÅ™ehrÃ¡t.\n   * @private\n   * @returns {Promise.<undefined>}\n   */\n  play (el) {\n    return (\n      new Promise((resolve, reject) => {\n        this.playReject = reject;\n        this.playResolve = resolve;\n        const promise = el.play();\n        if (!isNil(promise)) {\n          promise.catch((error) => reject(error));\n        }\n        this.playTimeout = setTimeout(\n          () => reject(new Error('Play request timed out.')),\n          // TODO Jakou hodnotu zvolit? PÅ™idat do konfigurace.\n          30 * 1000\n        );\n      })\n      .finally(() => {\n        this.playReject = null;\n        this.playResolve = null;\n        clearTimeout(this.playTimeout);\n      })\n    );\n  }\n\n  /** @inheritdoc */\n  release () {\n    return this.viewerLifeCycle.release(() => {\n      const {viewerSource} = this;\n      // UrÄ�enÃ­ vÅ¡ech potÅ™ebnÃ½ch hodnot.\n      const el = viewerSource.getEl();\n      const viewerFrame = viewerSource.getFrame();\n      // UvolnÄ›nÃ­ obalujÃ­cÃ­ho elementu.\n      viewerFrame.release();\n      // UvolnÄ›nÃ­ zdrojovÃ©ho elementu.\n      this.unbindElement(el);\n      // ZruÅ¡enÃ­ hodnot v instanci.\n      this.scheduleInfo = null;\n      this.viewerSource = null;\n    });\n  }\n\n  /** @inheritdoc */\n  seize (scheduleInfo, viewerSource) {\n    return this.viewerLifeCycle.seize(() => {\n      // NastavenÃ­ zÃ¡kladnÃ­ch hodnot.\n      this.scheduleInfo = scheduleInfo;\n      this.viewerSource = viewerSource;\n      // UrÄ�enÃ­ vÅ¡ech potÅ™ebnÃ½ch hodnot.\n      const stretchEnum = scheduleInfo.getStretchEnum();\n      const stretchClassName = this.stretchNative.getClassName(stretchEnum);\n      const url = scheduleInfo.getUrl();\n      const volume = scheduleInfo.getVolume();\n      const el = viewerSource.getEl();\n      const viewerFrame = viewerSource.getFrame();\n      // PÅ™Ã­prava obalujÃ­cÃ­ho elementu.\n      viewerFrame.seize(scheduleInfo);\n      // ZahÃ¡jÃ­ se naslouchÃ¡nÃ­ udÃ¡lostem z video elementu.\n      this.bindElement(el);\n      // NastavÃ­ se CSS tÅ™Ã­dy.\n      el.classList.add('viewer-controller-video', stretchClassName);\n      // Zablokuje se zpracovÃ¡nÃ­ zvuku preloadovanÃ©ho videa.\n      // NÄ›kterÃ© platformy podporujÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ pouze jednoho zdroje zvuku\n      // a bez muted by mohlo zruÅ¡it zvuk u jinÃ©ho videa.\n      el.muted = true;\n      // Android nedodrÅ¾uje standard a mÃ¡ vlastnÃ­ poster obrÃ¡zek, vynutÃ­ se prÃ¡zdnÃ½.\n      // NastavenÃ­ tohoto atributu ale rozhodÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ videa u webOS 4.0,\n      // proto je vyÄ�lenÄ›no do samostatnÃ© implementace.\n      el.poster = htmlImageBlank;\n      // NastavÃ­ se hlasitost, ve kterÃ© se video pozdÄ›ji pÅ™ehraje.\n      el.volume = volume;\n      // NastavÃ­ se zdroj, coÅ¾ zahÃ¡jÃ­ naÄ�Ã­tÃ¡nÃ­ videa.\n      el.src = url;\n    });\n  }\n\n  /**\n   * UvolnÃ­ naslouchÃ¡nÃ­ udÃ¡lostem z elementu.\n   * @param {HTMLVideoElement} el Element, kterÃ©mu se naslouchÃ¡.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  unbindElement (el) {\n    el.removeEventListener('canplaythrough', this.onCanplaythrough);\n    el.removeEventListener('ended', this.onEnded);\n    el.removeEventListener('error', this.onError);\n    el.removeEventListener('playing', this.onPlaying);\n  }\n}\n\nexport default KiwiLighter1VideoViewerController;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\n\nimport KiwiLighter1VideoViewerController from './kiwi-lighter-1-video-viewer-controller';\n\n/**\n * Typ mÃ©dia video pro Ki-Wi Lighter API.\n * PouÅ¾Ã­vÃ¡ se pouze lokÃ¡lnÄ› staÅ¾enÃ½ obsah podporujÃ­cÃ­ offline stav.\n * @implements {ViewerType}\n */\nclass KiwiLighter1VideoViewerType {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {ViewerSourceCreator} sourceCreator\n   */\n  constructor (sourceCreator) {\n    this.sourceCreator = sourceCreator;\n  }\n\n  /** @inheritdoc */\n  createController () {\n    return new KiwiLighter1VideoViewerController();\n  }\n\n  /** @inheritdoc */\n  getSourceCreator () {\n    return this.sourceCreator;\n  }\n\n  /** @inheritdoc */\n  getUrl (medium) {\n    return get(medium.asset, 'fileUrl', null);\n  }\n\n  /** @inheritdoc */\n  isExtractable () {\n    return false;\n  }\n\n  /** @inheritdoc */\n  isOfflineable () {\n    return true;\n  }\n\n  /** @inheritdoc */\n  isPreloadable (medium) {\n    return true;\n  }\n}\n\nexport default KiwiLighter1VideoViewerType;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Registr informacÃ­ o typech mÃ©diÃ­ pro Ki-Wi Lighter API.\n * @implements {ViewerRegistry}\n */\nclass KiwiLighter1ViewerRegistry {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<MediumRegistry>} MediumRegistry Konstruktror registru mÃ©diÃ­.\n   * @param {ViewerType} imageType ZÃ¡znam registru pro obrÃ¡zky.\n   * @param {ViewerType} kioskType ZÃ¡znam registru pro kiosky.\n   * @param {ViewerType} pdfType ZÃ¡znam registru pro Pdf.\n   * @param {ViewerType} streamType ZÃ¡znam registru pro stream.\n   * @param {ViewerType} videoType ZÃ¡znam registru pro videa.\n   * @param {ViewerType} webType ZÃ¡znam registru pro web.\n   * @param {ViewerType} widgetType ZÃ¡znam registru pro widgety.\n   */\n  constructor (MediumRegistry, imageType, kioskType, pdfType, streamType, videoType, webType, widgetType) {\n    // VytvoÅ™enÃ­ novÃ©ho registru.\n    const mediumRegistry = new MediumRegistry();\n    // Registrace zÃ¡znamÅ¯ registru.\n    // TODO Å˜eÅ¡it pÅ™esnÃ½ seznam podporovanÃ½ch typÅ¯?\n    // - https://developer.android.com/guide/topics/media/media-formats\n    mediumRegistry.register('image/*', imageType);\n    mediumRegistry.register('application/pdf', pdfType);\n    mediumRegistry.register('application/x-http-stream', streamType);\n    mediumRegistry.register('application/x-kiwi-kiosk-1', kioskType);\n    mediumRegistry.register('video/*', videoType);\n    mediumRegistry.register('text/html', webType);\n    mediumRegistry.register('application/x-kiwi-web-1', widgetType);\n    this.mediumRegistry = mediumRegistry;\n  }\n\n  /** @inheritdoc */\n  find (mediumType) {\n    return this.mediumRegistry.find(mediumType);\n  }\n\n  /** @inheritdoc */\n  getAll () {\n    return this.mediumRegistry.getAll();\n  }\n}\n\nexport default KiwiLighter1ViewerRegistry;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\nimport isNil from 'lodash/isNil';\nimport URI from 'urijs/src/URI.fragmentQuery';\n\nimport ViewerControllerIframe from '../../viewer/controller/viewer-controller-iframe';\n\n/**\n * Typ mÃ©dia widget s web aplikacÃ­ pro Ki-Wi Lighter API.\n * PouÅ¾Ã­vÃ¡ se pouze lokÃ¡lnÄ› staÅ¾enÃ½ obsah podporujÃ­cÃ­ offline stav.\n * Po staÅ¾enÃ­ se mÃ©dia rozbalÃ­ a spouÅ¡tÃ­ se s poÅ¾adovanÃ½mi parametry.\n * @implements {ViewerType}\n */\nclass KiwiLighter1WidgetViewerType {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {number} loadDelay\n   * @param {HtmlIframePreflighter} preflighter\n   * @param {ViewerSourceCreator} sourceCreator\n   */\n  constructor (loadDelay, preflighter, sourceCreator) {\n    this.loadDelay = loadDelay;\n    this.preflighter = preflighter;\n    this.sourceCreator = sourceCreator;\n  }\n\n  /** @inheritdoc */\n  createController () {\n    return new ViewerControllerIframe(this.loadDelay, this.preflighter);\n  }\n\n  /** @inheritdoc */\n  getSourceCreator () {\n    return this.sourceCreator;\n  }\n\n  /** @inheritdoc */\n  getUrl (medium) {\n    const url = get(medium.asset, 'localhostUrl');\n    // Test jestli je dostupnÃ¡ lokÃ¡lnÄ› staÅ¾enÃ¡ kopie.\n    if (isNil(url)) {\n      return null;\n    }\n    return (\n      // PÅ™idÃ¡ se adresa k souboru uvnitÅ™ archivu.\n      // TODO #107 Parsovat z XML ve widgetu.\n      new URI(`${url}/index.html`)\n      // PÅ™idajÃ­ se URL parametry.\n      .setSearch(medium.params)\n      .toString()\n    );\n  }\n\n  /** @inheritdoc */\n  isExtractable () {\n    return true;\n  }\n\n  /** @inheritdoc */\n  isOfflineable () {\n    return true;\n  }\n\n  /** @inheritdoc */\n  isPreloadable (medium) {\n    // U widgetÅ¯ se moc nepoÄ�Ã­tÃ¡ s tÃ­m, Å¾e by byly spuÅ¡tÄ›nÃ© nÄ›kde na pozadÃ­.\n    // DÄ›lÃ¡ to problÃ©my pÅ™i naslouchÃ¡nÃ­ na udÃ¡losti, napÅ™. udÃ¡losti ovlÃ¡dÃ¡nÃ­.\n    // Byl Å™eÅ¡en problÃ©m s autofocus, kterÃ½ se nechoval pÅ™i preloadu sprÃ¡vnÄ›.\n    // TakÃ© nelze jednoduÅ¡e vypnout zvuky, kterÃ© mohou vznikat.\n    // Proto je preload zakÃ¡zanÃ½.\n    return false;\n  }\n}\n\nexport default KiwiLighter1WidgetViewerType;\n","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k ovlÃ¡dacÃ­ch tlaÄ�Ã­tek.\n * [TypeScript rozhranÃ­](https://gitlab.com/ki-wi/player-light/kiwi-lighter-api/blob/master/src/control-button.d.ts)\n * @enum {string}\n */\nconst KiwiLighterApiControlButton = {\n  Back: 'Back'\n};\n\nexport default KiwiLighterApiControlButton;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Typ pevnÃ©ho disku pro Ki-Wi Lighter API.\n * [TypeScript rozhranÃ­](https://gitlab.com/ki-wi/player-light/kiwi-lighter-api/blob/master/src/drive-type.d.ts)\n * @enum {string}\n */\nconst KiwiLighterApiDriveType = {\n  External: 'External',\n  Internal: 'Internal'\n};\n\nexport default KiwiLighterApiDriveType;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport NetworkType from '../network/network-type';\nimport KiwiLighterApiNetworkType from './kiwi-lighter-api-network-type';\n\n/**\n * TovÃ¡rna na typy pÅ™ipojenÃ­ zaÅ™Ã­zenÃ­ k sÃ­ti pro Ki-Wi Lighter API.\n */\nclass KiwiLighterApiNetworkTypeFactory {\n  /**\n   * Naparsuje typ sÃ­Å¥ovÃ©ho pÅ™ipojenÃ­ z Lighter API do Lighter Player.\n   * @param {KiwiLighterApiNetworkType} type\n   * @private\n   * @returns {NetworkType}\n   */\n  toNetworkType (type) {\n    switch (type) {\n      case KiwiLighterApiNetworkType.Ethernet:\n        return NetworkType.Ethernet;\n      case KiwiLighterApiNetworkType.Wifi:\n        return NetworkType.Wifi;\n      default:\n        throw new RangeError(`Unknown type \"${type}\".`);\n    }\n  }\n}\n\nexport default KiwiLighterApiNetworkTypeFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Typ pÅ™ipojenÃ­ zaÅ™Ã­zenÃ­ k sÃ­ti pro Ki-Wi Lighter API.\n * [TypeScript rozhranÃ­](https://gitlab.com/ki-wi/player-light/kiwi-lighter-api/blob/master/src/network-type.d.ts)\n * @enum {string}\n */\nconst KiwiLighterApiNetworkType = {\n  Ethernet: 'Ethernet',\n  Wifi: 'Wifi'\n};\n\nexport default KiwiLighterApiNetworkType;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Orientace obrazovky zaÅ™Ã­zenÃ­ pro Ki-Wi Lighter API.\n * [TypeScript rozhranÃ­](https://gitlab.com/ki-wi/player-light/kiwi-lighter-api/blob/master/src/orientation.d.ts)\n * @enum {string}\n */\nconst KiwiLighterApiOrientation = {\n  Clockwise0: 'Clockwise0',\n  Clockwise90: 'Clockwise90',\n  Clockwise180: 'Clockwise180',\n  Clockwise270: 'Clockwise270'\n};\n\nexport default KiwiLighterApiOrientation;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * PÅ™Ã­kaz pro zmÄ›nu napÃ¡jenÃ­ zaÅ™Ã­zenÃ­ pro Ki-Wi Lighter API.\n * [TypeScript rozhranÃ­](https://gitlab.com/ki-wi/player-light/kiwi-lighter-api/blob/master/src/power-command.d.ts)\n * @enum {string}\n */\nconst KiwiLighterApiPowerCommand = {\n  Off: 'Off',\n  On: 'On'\n};\n\nexport default KiwiLighterApiPowerCommand;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nexport default {\n  name: 'layer',\n  relations: {\n    belongsTo: {\n      layout: {\n        localField: 'parentLayout',\n        localKey: 'parentLayoutId'\n      },\n      medium: {\n        localField: 'medium',\n        localKey: 'mediumId'\n      },\n      playlist: {\n        localField: 'playlist',\n        localKey: 'playlistId'\n      }\n    }\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nexport default {\n  name: 'layout',\n  relations: {\n    belongsTo: {\n      medium: {\n        localField: 'medium',\n        localKey: 'mediumId'\n      }\n    }\n  }\n};\n","module.exports = \"<div class=\\\"container container--narrow\\\">\\n  <div class=\\\"wrap wrap-large\\\">\\n    <div class=\\\"gap-large\\\">\\n      <div class=\\\"gap-small\\\"><span class=\\\"icon icon-spinner icon-spin loader-icon\\\"></span></div>\\n      <div class=\\\"gap-small\\\"><slot>Loading, please wait...</slot></div>\\n    </div>\\n  </div>\\n</div>\\n\";","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport template from './loader-container.html';\n\nexport default {\n  name: 'LoaderContainer',\n  template\n};\n","module.exports = \"<div class=\\\"grid grid-table layout-root\\\">\\n  <div class=\\\"grid-item align-x-center align-y-center\\\">\\n    <loader-container><slot></slot></loader-container>\\n  </div>\\n</div>\\n\";","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport LoaderContainer from './loader-container';\n\nimport template from './loader-root.html';\n\nexport default {\n  name: 'LoaderRoot',\n  template,\n  components: {LoaderContainer}\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport EnvUtil from '../env-util';\n\n/**\n * TovÃ¡rnÃ­ metoda na zaznamenÃ¡vaÄ�e vÃ½jimek.\n * @param {string} [buildId] IdentifikÃ¡tor sestavenÃ­.\n * @param {ConsoleLoggerFactory} consoleFactory\n * @param {string} env `NODE_ENV` prostÅ™edÃ­ aplikace\n * @param {string} [sentryDsn] Sentry DSN adresa k odesÃ­lÃ¡nÃ­ zÃ¡znamÅ¯.\n * @param {SentryLoggerFactory} sentryFactory\n * @returns {Logger}\n */\nfunction LoggerFactory (buildId, consoleFactory, env, sentryDsn, sentryFactory) {\n  /**\n   * @returns {Logger}\n   */\n  function createLogger () {\n    if (isNil(sentryDsn)) {\n      return consoleFactory.create();\n    }\n    return sentryFactory.create(sentryDsn);\n  }\n\n  const logger = createLogger();\n  logger.setInfo({buildId, envEnum: EnvUtil.parse(env)});\n  return logger;\n}\n\nexport default LoggerFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ErrorName from '../error/error-name';\n\n// TODO RozÅ¡Ã­Å™it i o infomace pÅ™idanÃ© v Device#getLoggerInfo\n// - Bude moÅ¾nÃ© aÅ¾ po migraci vÅ¡ech platforem na multiplatformnÃ­ Adapter.\n// - PÅ™idÃ¡ poloÅ¾ky: deviceId, online, version.\n/**\n * SprÃ¡vce informacÃ­ pro logovÃ¡nÃ­.\n */\nclass LoggerManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {AppManager} appManager SprÃ¡vce aplikace.\n   * @param {FirmwareManager} firmwareManager SprÃ¡vce firmware.\n   * @param {Logger} logger\n   * @returns {LoggerManager} NovÃ¡ instance.\n   */\n  constructor (appManager, firmwareManager, logger) {\n    this.appManager = appManager;\n    this.firmwareManager = firmwareManager;\n    this.logger = logger;\n  }\n\n  /**\n   * ZjistÃ­ informace pro logovÃ¡nÃ­.\n   * @returns {Promise.<LoggerInfo>} Informace.\n   */\n  getInfo () {\n    return new Promise((resolve) => resolve(\n      [\n        () => this.getManufacturer(),\n        () => this.getModelName(),\n        () => this.getRuntimePlatform(),\n        () => this.getUpdatePlatform(),\n        () => this.getUpdateUrl()\n      ]\n      .reduce(\n        (accPromise, getter) => (\n          accPromise.then((accObject) => (\n            getter()\n            .then((result) => Object.assign(accObject, result))\n            .catch((error) => {\n              // Chyby vychÃ¡zejÃ­cÃ­ z nedostupnosti informacÃ­ se ignorujÃ­.\n              if (error.name !== ErrorName.NotSupportedError) {\n                this.logger.error(error);\n              }\n              return accObject;\n            })\n          ))\n        ),\n        Promise.resolve({})\n      )\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s vÃ½robcem zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {Promise.<LoggerInfo>} Informace.\n   */\n  getManufacturer () {\n    return new Promise((resolve) => resolve(\n      this.firmwareManager.getManufacturer()\n      .then((manufacturer) => ({manufacturer}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s modelem zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {Promise.<LoggerInfo>} Informace.\n   */\n  getModelName () {\n    return new Promise((resolve) => resolve(\n      this.firmwareManager.getModelName()\n      .then((modelName) => ({modelName}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ identifikÃ¡tor platformy, na kterÃ© ja aplikace momentÃ¡lnÄ› spuÅ¡tÄ›nÃ¡.\n   * @private\n   * @returns {Promise.<LoggerInfo>} Informace.\n   */\n  getRuntimePlatform () {\n    return new Promise((resolve) => resolve(\n      this.appManager.getRuntimePlatform()\n      .then((runtimePlatform) => ({runtimePlatform}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s platformou pro aktualizace.\n   * @private\n   * @returns {Promise.<LoggerInfo>} Informace.\n   */\n  getUpdatePlatform () {\n    return new Promise((resolve) => resolve(\n      this.appManager.getUpdatePlatform()\n      .then((updatePlatform) => ({updatePlatform}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s aktualizaÄ�nÃ­ URL.\n   * @private\n   * @returns {Promise.<LoggerInfo>} Informace.\n   */\n  getUpdateUrl () {\n    return new Promise((resolve) => resolve(\n      this.appManager.getUpdateUrl()\n      .then((updateUrl) => ({updateUrl}))\n    ));\n  }\n}\n\nexport default LoggerManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNumber from 'lodash/isNumber';\n\n// TODO Implementovat skuteÄ�nou podporu pro dlouhÃ© Ä�asovaÄ�e.\n// - ZatÃ­m se provÃ¡dÃ­ primitivnÃ­ omezenÃ­ na maximÃ¡lnÃ­ podporovanou hodnotu,\n//   coÅ¾ je ale stÃ¡le o mnoho lepÅ¡Ã­, neÅ¾ okamÅ¾itÃ© vyvolÃ¡nÃ­.\n//   ZatÃ­m se nepouÅ¾Ã­vÃ¡ z Å¾Ã¡dnÃ©ho kriticky dÅ¯leÅ¾itÃ©ho mÃ­sta,\n//   takÅ¾e toto zpracovÃ¡nÃ­ postaÄ�uje.\n// - PropracovanÃ© Å™eÅ¡enÃ­ by rozdÄ›lovalo kaÅ¾dÃ½ problematickÃ½ Ä�asovaÄ� na nÄ›kolik\n//   kratÅ¡Ã­ch intervalÅ¯, kterÃ© nepÅ™esÃ¡hnou podporovanÃ© maximum.\n//   PÅ™itom bude nutnÃ© udrÅ¾ovat vlastnÃ­ databÃ¡zi identifikÃ¡torÅ¯ Ä�asovaÄ�Å¯ tak,\n//   aby byl uÅ¾ivatel odstÃ­nÄ›nÃ½ od rozdÄ›lenÃ­ na vÃ­ce Ä�asovaÄ�Å¯.\n//   UÅ¾ivatel vÅ¾dy pracuje s jednÃ­m identifikÃ¡torem,\n//   kterÃ©mu v jeden okamÅ¾ik odpovÃ­dÃ¡ prÃ¡vÄ› jeden \"skuteÄ�nÃ½\" identifikÃ¡tor.\n// - https://github.com/nodejs/node-v0.x-archive/issues/8656#issuecomment-67355269\n// - https://stackoverflow.com/a/18182660/8315965\n// TODO OÅ¡etÅ™it nepÅ™esnost Ä�asovaÄ�Å¯ u dlouhÃ½ch Ä�asovaÄ�Å¯.\n// - HodnÄ› propracovanÃ© Å™eÅ¡enÃ­ by oÅ¡etÅ™ovalo i moÅ¾nou nepÅ™esnost Ä�asovaÄ�Å¯,\n//   kterÃ¡ se bude zhorÅ¡ovat pÅ™i rozdÄ›lenÃ­ na vÃ­ce intervalÅ¯.\n//   PÅ™i tomto rozdÄ›lenÃ­ se napÅ™. poslednÃ­ interval zmenÅ¡Ã­ o nabranÃ© zpoÅ¾dÄ›nÃ­\n//   nebo zrychlenÃ­.\n// - Pro Ä�asovaÄ�e kratÅ¡Ã­ neÅ¾ maximum pravdÄ›podobnÄ› nemÃ¡ smysl, ty uÅ¾ pÅ™esnÄ›jÅ¡Ã­\n//   nebudou, nepÅ™esnost vznikÃ¡ aÅ¾ s opakovanÃ½m nastavovÃ¡nÃ­m Ä�asÅ¯vaÄ�Å¯.\n// - https://thecodersblog.com/increase-javascript-timoeout-accuracy/\n// - https://medium.com/@abhi9bakshi/why-javascript-timer-is-unreliable-and-how-can-you-fix-it-9ff5e6d34ee0\n// - https://github.com/dbkaplun/driftless\n// - https://stackoverflow.com/questions/21097421/what-is-the-reason-javascript-settimeout-is-so-inaccurate\n// - https://stackoverflow.com/questions/985670/will-setinterval-drift\n/**\n * DlouhÃ© JS Ä�asovaÄ�e, kterÃ© nemajÃ­ omezenÃ­ na maximÃ¡lnÃ­ dobu.\n * AÄ�koliv to specifikace nezmiÅˆuje, vÄ›tÅ¡ina prohlÃ­Å¾eÄ�Å¯ nedovoluje nastavit\n * Ä�asovaÄ� na dobu delÅ¡Ã­, neÅ¾ 25 dnÃ­.\n * NavÃ­c v tom pÅ™Ã­padÄ› dojde k okamÅ¾itÃ©mu vyvolÃ¡nÃ­ Ä�asovaÄ�e,\n * jako by se jednalo o neplatnÃ© Ä�Ã­slo.\n *\n * Implementace 100% dodrÅ¾uje standardizovanÃ© API Ä�asovaÄ�Å¯,\n * pro co nejsnaÅ¾Å¡Ã­ migraci existujÃ­cÃ­ho kÃ³du a pro snadnou pochopitelnost.\n *\n * Dokumentace:\n * - [MDN](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout#Maximum_delay_value)\n * - [StackOverflow](https://stackoverflow.com/questions/3468607/why-does-settimeout-break-for-large-millisecond-delay-values)\n * @implements {Timers}\n */\nclass LongTimers {\n  /**\n   * @param {number} maxDelay MaximÃ¡lnÃ­ doba, na kterou prohlÃ­Å¾eÄ� podporuje nastavit\n   * Ä�asovaÄ�e, bez jejich okamÅ¾itÃ©ho vyvolÃ¡nÃ­.\n   */\n  constructor (maxDelay) {\n    this.maxDelay = maxDelay;\n  }\n\n  /** @inheritdoc */\n  clearInterval (id) {\n    return clearInterval(id);\n  }\n\n  /** @inheritdoc */\n  clearTimeout (id) {\n    return clearTimeout(id);\n  }\n\n  /**\n   * OmezÃ­ zpoÅ¾dÄ›nÃ­ Ä�asovaÄ�e na bezpeÄ�nou hodnotu.\n   *\n   * NenÃ­ ÃºplnÄ› jasnÃ©, jak mÃ¡ fungovat pro obÄ› `Infinity`.\n   * Specifikace Å¾Ã¡dnÃ© speciÃ¡lnÃ­ oÅ¡etÅ™enÃ­ nezmiÅˆuje.\n   * Jsou zmiÅˆovÃ¡na omezenÃ­ jako \"less than 0\", nebo \"greater than 5\".\n   * Hodnota `Infinity` je kompatibilnÃ­ s lorovnÃ¡nÃ­m,\n   * takÅ¾e omezenÃ­ na maximum podlÃ©hÃ¡.\n   *\n   * PouÅ¾Ã­vÃ¡ se pÅ™Ã­stup Ãºpravy seznamu argumentÅ¯, pro usnadnÄ›nÃ­ prÃ¡ce\n   * s `undefined` hodnotami.\n   * @param {Array.<*>} args Pole argumentÅ¯ ze `setInterval` nebo `setTimeout`.\n   * @private\n   * @returns {Array.<*>}\n   */\n  mapSetArgs (args) {\n    const delayIndex = 1;\n    const delay = args[delayIndex];\n    if (!isNumber(delay) || isNaN(delay)) {\n      return args;\n    }\n    return [\n      ...args.slice(0, delayIndex),\n      Math.min(delay, this.maxDelay),\n      ...args.slice(delayIndex + 1)\n    ];\n  }\n\n  /** @inheritdoc */\n  setInterval (...args) {\n    const mappedArgs = this.mapSetArgs(args);\n    return setInterval(...mappedArgs);\n  }\n\n  /** @inheritdoc */\n  setTimeout (...args) {\n    const mappedArgs = this.mapSetArgs(args);\n    return setTimeout(...mappedArgs);\n  }\n}\n\nexport default LongTimers;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isArray from 'lodash/isArray';\n\nimport MediumType from './medium-type';\n\n// TODO PÅ™epracovat na `MediumRegistry<T>`.\n/**\n * Registr hodnot dle typÅ¯ mÃ©diÃ­.\n * SlouÅ¾Ã­ k vÃ½bÄ›ru vhodnÃ©ho typu mÃ©dia a zÃ­skÃ¡nÃ­ na nÄ›j navÃ¡zanÃ½ch hodnot.\n *\n * Pro porovnÃ¡vÃ¡nÃ­ typÅ¯ mÃ©dia dle priority se pouÅ¾Ã­vÃ¡ definice v [RFC 2616](https://tools.ietf.org/html/rfc2616#section-14).\n * KonkrÃ©tnÄ› zjednoduÅ¡enÃ½ algoritmus popsanÃ½ v sekci 14.\n *\n * NeuvaÅ¾uje se suffix typu mÃ©dia, jelikoÅ¾ nenÃ­ definovÃ¡no jak podle nÄ›j Å™adit (a vybrat vhodnÃ½).\n *\n * DÃ¡le se neuvaÅ¾ujÃ­ parametry typu mÃ©dia. NapÅ™. `q` nebo `level` pÅ™i Å™azenÃ­.\n */\nclass MediumRegistry {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @returns {MediumRegistry} NovÃ¡ instance.\n   */\n  constructor () {\n    /**\n     * Seznam registrovanÃ½ch zÃ¡znamÅ¯.\n     * @private\n     * @type {Array.<MediumRecord>}\n     */\n    this.mediumRecordArray = [];\n  }\n\n  /**\n   * Nalezne nejlÃ©pe odpovÃ­dajÃ­cÃ­ zÃ¡znam mezi registrovanÃ½mi.\n   * @param {string} mediumType Typ mÃ©dia pro kterÃ½ se majÃ­ nalÃ©zt informace.\n   * @returns {*|null} NalezenÃ½ zÃ¡znam v registru nebo null.\n   */\n  find (mediumType) {\n    // ParsovÃ¡nÃ­ typu mÃ©dia.\n    const parsedMediumType = new MediumType(mediumType);\n    if (parsedMediumType.type === '*' || parsedMediumType.subtype === '*') {\n      throw new SyntaxError('Type range is not supported.');\n    }\n    const mediumRecordArray = (\n      // VyhledÃ¡nÃ­ zÃ¡znamÅ¯ v registru a vÃ½bÄ›r vhodnÃ©ho z nalezenÃ½ch.\n      this.mediumRecordArray.filter((mediumRecord) => parsedMediumType.match(mediumRecord.mediumType))\n      .sort((aMediumRecord, bMediumRecord) => (\n        MediumType.comparator(aMediumRecord.mediumType, bMediumRecord.mediumType)\n      ))\n    );\n    let result;\n    if (mediumRecordArray.length) {\n      // ZÃ­skÃ¡nÃ­ a vrÃ¡cenÃ­ informace o mÃ©diu z nejlÃ©pe odpovÃ­dajÃ­cÃ­mu zÃ¡znamu.\n      result = mediumRecordArray[0].value;\n    } else {\n      // VrÃ¡cenÃ­ vÃ½chozÃ­ hodnoty, pokud nebylo nic nalezeno.\n      result = null;\n    }\n    return result;\n  }\n\n  /**\n   * ZjistÃ­ vÅ¡echny zaregistrovanÃ© zÃ¡znamy.\n   * @returns {Array.<*>}\n   */\n  getAll () {\n    return this.mediumRecordArray.map((mediumRecord) => mediumRecord.value);\n  }\n\n  /**\n   * Zaregistruje zÃ¡znam do registru.\n   * @param {Array.<string>|string} mediumType Typ mÃ©dia, nebo rozsah typÅ¯ pro kterÃ½ se mÃ¡ zÃ¡znam pouÅ¾Ã­t.\n   * @param {*} value NovÃ¡ hodnota k registraci do registru.\n   * @returns {undefined} Nic.\n   */\n  register (mediumType, value) {\n    if (isArray(mediumType)) {\n      this.registerMany(mediumType, value);\n    } else {\n      this.registerOne(mediumType, value);\n    }\n  }\n\n  /**\n   * Zaregistruje jeden datovÃ½ typ pro jeden zÃ¡znam.\n   * @param {string} mediumType Typ mÃ©dia, nebo rozsah typÅ¯ pro kterÃ½ se mÃ¡ zÃ¡znam pouÅ¾Ã­t.\n   * @param {*} value NovÃ¡ hodnota k registraci do registru.\n   * @private\n   * @returns {MediumRecord} ZaregistrovanÃ½ zÃ¡znam.\n   */\n  registerOne (mediumType, value) {\n    // ParsovÃ¡nÃ­ typu mÃ©dia.\n    const parsedMediumType = new MediumType(mediumType);\n    if (Object.keys(parsedMediumType.parameters).length) {\n      throw new SyntaxError('Parameters are not supported.');\n    }\n    // Kontrola, jestli jiÅ¾ tento typ nenÃ­ registrovanÃ½.\n    // TODO #60 Å lo by optimalizovat pÅ™i vÃ­ce poloÅ¾kÃ¡ch.\n    // - Prohledat narÃ¡z.\n    // - Nedovolit vloÅ¾it novÃ© poloÅ¾ky dokud vÅ¡echny neuspÄ›jÃ­.\n    const foundMediumRecord = this.mediumRecordArray.find(\n      (mediumRecord) => parsedMediumType.equals(mediumRecord.mediumType)\n    );\n    if (foundMediumRecord) {\n      throw new Error('Similar media type is already registered.');\n    }\n    // VloÅ¾enÃ­ novÃ©ho zÃ¡znamu do registru.\n    // TODO #60 Å lo by optimalizovat pÅ™i vÃ­ce poloÅ¾kÃ¡ch.\n    // - VklÃ¡dÃ¡nÃ­ narÃ¡z a ne po jednÃ© poloÅ¾ce.\n    const mediumRecord = {mediumType: parsedMediumType, value};\n    this.mediumRecordArray.push(mediumRecord);\n    return mediumRecord;\n  }\n\n  /**\n   * Zaregistruje vÃ­ce datovÃ½ch typÅ¯ pro jeden zÃ¡znam.\n   * @param {Array.<string>} mediumTypeArray Typy mÃ©diÃ­, nebo rozsahy typÅ¯ pro kterÃ© se mÃ¡ zÃ¡znam pouÅ¾Ã­t.\n   * @param {*} value NovÃ¡ hodnota k registraci do registru.\n   * @private\n   * @returns {Array.<MediumRecord>} Seznam zaregistrovanÃ½ch zÃ¡znamÅ¯.\n   */\n  registerMany (mediumTypeArray, value) {\n    return mediumTypeArray.map((mediumType) => this.registerOne(mediumType, value));\n  }\n}\n\nexport default MediumRegistry;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nexport default {\n  name: 'medium',\n  methods: {\n    toString () {\n      return `Medium {id: \"${this.id}\"}`;\n    }\n  },\n  relations: {\n    belongsTo: {\n      asset: {\n        localField: 'asset',\n        localKey: 'assetId'\n      }\n    }\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isUndefined from 'lodash/isUndefined';\n\nimport MediumTypeLibrary from 'medium-type';\n\n// TODO Hotfix neopravenÃ½ch bugÅ¯ pomocÃ­ extends na knihovnÄ›.\n/**\n * Media type.\n * Also known as MIME type or content type.\n *\n * Specification:\n * [RFC 2045](https://tools.ietf.org/html/rfc2045),\n * [RFC 2616](https://tools.ietf.org/html/rfc2616#section-14),\n * [RFC 3023](https://tools.ietf.org/html/rfc3023),\n * [RFC 6657](https://tools.ietf.org/html/rfc6657),\n * [RFC 6838](https://tools.ietf.org/html/rfc6838),\n * [RFC 6839](https://tools.ietf.org/html/rfc6839),\n * [RFC 7231](https://tools.ietf.org/html/rfc7231).\n *\n * Based on [medium-type](https://github.com/moll/js-medium-type) library.\n * @property {Object} parameters Parameters of the media type.\n * @property {string} subtype Subtype of the media type.\n * @property {string} suffix Suffix of the media type.\n * @property {string} type Top-level type of the media type.\n */\nclass MediumType extends MediumTypeLibrary {\n  /**\n   * Creates a new instance.\n   * @param {Object|string} type Media type as a plain string or a map of properties.\n   * @returns {MediumType} New media type instance.\n   */\n  constructor (type) {\n    // TODO Oprava dosud neopravenÃ©ho bugu s parsovÃ¡nÃ­m undefined.\n    // - https://github.com/moll/js-medium-type/issues/4\n    if (isUndefined(type)) {\n      throw new SyntaxError(`Invalid Media Type: ${type}`);\n    }\n    const mediumType = super(type);\n    // TODO NemÄ›lo by bÃ½t podporovÃ¡no, ale plugin to neÅ™eÅ¡Ã­.\n    // - https://github.com/moll/js-medium-type/issues/1\n    if (mediumType.type === '*' && mediumType.subtype !== '*') {\n      throw new SyntaxError(`Invalid top-level type range: ${type}`);\n    }\n  }\n\n  /**\n   * Check for the strict equality with another media type.\n   * @param {MediumType} mediumType Media type to check for equality.\n   * @returns {boolean} True if both media types are equal in all of their parts.\n   */\n  equals (mediumType) {\n    // TODO PÅ™idÃ¡no porovnÃ¡nÃ­ striktnÃ­ rovnosti typÅ¯ (bez rozsahÅ¯).\n    // - MÄ›lo by bÃ½t souÄ�Ã¡stÃ­ knihovny.\n    // - NaivnÃ­ zpracovÃ¡nÃ­, bez dÅ¯kladnÄ›jÅ¡Ã­ho oÅ¡etÅ™enÃ­.\n    // - https://github.com/moll/js-medium-type/issues/2\n    return this.toString() === mediumType.toString();\n  }\n}\n\n/**\n * Compare function to use with `Array#sort`.\n * This method is not documented in medium-type library,\n * but it [should work](https://github.com/moll/js-medium-type/issues/3).\n * @function\n * @name MediumType.comparator\n * @param {MediumType} aType First media type instance.\n * @param {MediumType} bType Second media type instance.\n * @returns {number} Result of a comparation: `0`, `1` or `-1`.\n */\n\n/**\n * Matches a given media type pattern to the current media type.\n * Supports wildcards (`*`) for type and subtype.\n * @function\n * @name MediumType#match\n * @param {MediumType} type Media type instance to match to.\n * @returns {boolean} True if media type matches.\n */\n\n/**\n * Stringifies a media type to a canonical string when passing it to `JSON.stringify`.\n * @function\n * @name MediumType#toJSON\n * @returns {string} Media type as JSON string.\n */\n\n/**\n * Stringifies a media type to canonical form.\n * @function\n * @name MediumType#toString\n * @returns {string} Media type as a plain string.\n */\n\nexport default MediumType;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO MemoryInfoFactory\n// TODO Ponechat MemoryInfo jako @interface s plain hodnotami?\n/**\n * Informace o operaÄ�nÃ­ pamÄ›ti zaÅ™Ã­zenÃ­.\n */\nclass MemoryInfo {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Byte} free VolnÃ¡ pamÄ›Å¥.\n   * @param {Byte} total CelkovÃ¡ pamÄ›Å¥.\n   * @param {Byte} used VyuÅ¾Ã­vanÃ¡ pamÄ›Å¥.\n   * @returns {MemoryInfo} NovÃ¡ instance.\n   */\n  constructor (free, total, used) {\n    this.free = free;\n    this.total = total;\n    this.used = used;\n  }\n\n  /**\n   * ZjistÃ­ velikost volnÃ© pamÄ›ti.\n   * @returns {Byte} VolnÃ¡ pamÄ›Å¥.\n   */\n  getFree () {\n    return this.free;\n  }\n\n  /**\n   * ZjistÃ­ celkovou velikost pamÄ›ti.\n   * @returns {Byte} CelkovÃ¡ pamÄ›Å¥.\n   */\n  getTotal () {\n    return this.total;\n  }\n\n  /**\n   * ZjistÃ­ velikost vyuÅ¾Ã­vanÃ© pamÄ›ti.\n   * @returns {Byte} VyuÅ¾Ã­vanÃ¡ pamÄ›Å¥.\n   */\n  getUsed () {\n    return this.used;\n  }\n}\n\nexport default MemoryInfo;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na informace o pÅ™ipojenÃ­ k sÃ­ti.\n */\nclass NetworkConnectionFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<NetworkConnection>} NetworkConnection Konstruktor informacÃ­ o pÅ™ipojenÃ­ k sÃ­ti.\n   * @returns {NetworkConnectionFactory} NovÃ¡ instance.\n   */\n  constructor (NetworkConnection) {\n    this.NetworkConnection = NetworkConnection;\n  }\n\n  /**\n   * VytvoÅ™Ã­ informace o pÅ™ipojenÃ­ k sÃ­ti.\n   * @param {string} mac MAC adresa.\n   * @param {NetworkType} type Typ pÅ™ipojenÃ­.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {string} [opts.ip] IP adresa.\n   * @returns {NetworkConnection} VytvoÅ™enÃ© pÅ™ipojenÃ­.\n   */\n  create (mac, type, {ip} = {}) {\n    return new this.NetworkConnection(mac, type, {ip});\n  }\n}\n\nexport default NetworkConnectionFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\nimport pick from 'lodash/pick';\n\n/**\n * Informace o jednom pÅ™ipojenÃ­ k sÃ­ti.\n * @implements {Serializable}\n */\nclass NetworkConnection {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {string} mac MAC adresa.\n   * @param {NetworkType} type Typ pÅ™ipojenÃ­.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {string} [opts.ip] IP adresa.\n   * @returns {NetworkConnection} NovÃ¡ instance.\n   */\n  constructor (mac, type, {ip = null} = {}) {\n    this.ip = ip;\n    this.mac = mac;\n    this.type = type;\n  }\n\n  /**\n   * ZjistÃ­ IP adresu pÅ™ipojenÃ­.\n   * @returns {string} IP adresa.\n   */\n  getIp () {\n    if (!this.hasIp()) {\n      throw new TypeError('Missing IP adress.');\n    }\n    return this.ip;\n  }\n\n  /**\n   * ZjistÃ­ MAC adresu pÅ™ipojenÃ­.\n   * @returns {string} MAC adresa.\n   */\n  getMac () {\n    return this.mac;\n  }\n\n  /**\n   * ZjistÃ­ typ pÅ™ipojenÃ­.\n   * @returns {NetworkType} Typ pÅ™ipojenÃ­.\n   */\n  getType () {\n    return this.type;\n  }\n\n  /**\n   * ZjistÃ­, jestli mÃ¡ pÅ™ipojenÃ­ pÅ™idÄ›leno IP adresu.\n   * @returns {boolean} PÅ™Ã­znak.\n   */\n  hasIp () {\n    return !isNil(this.ip);\n  }\n\n  /** @inheritdoc */\n  toJSON () {\n    return pick(this, 'ip', 'mac', 'type');\n  }\n}\n\nexport default NetworkConnection;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Typ pÅ™ipojenÃ­ zaÅ™Ã­zenÃ­ k sÃ­ti.\n * @enum {string}\n */\nconst NetworkType = {\n  /** PÅ™ipojenÃ­ pÅ™es pevnÃ© ethernet pÅ™ipojenÃ­. */\n  Ethernet: 'Ethernet',\n  /** PÅ™ipojenÃ­ pÅ™es bezdrÃ¡tovÃ© Wi-Fi pÅ™ipojenÃ­. */\n  Wifi: 'Wifi'\n};\n\nexport default NetworkType;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Knihovna utilit pro prÃ¡ci s Ä�Ã­sly.\n */\nclass Numeric {\n  /**\n   * UrÄ�Ã­, jestli je pÅ™edanÃ¡ hodnota platnÃ½m indexem pole.\n   * Index je celÃ© Ä�Ã­slo v intervalu `<0, Infinity)`.\n   * @param {number} value Hodnota k ovÄ›Å™enÃ­.\n   * @returns {boolean} PÅ™Ã­znak, jestli jsou poÅ¾adavky splnÄ›ny.\n   */\n  static isIndex (value) {\n    return Number.isInteger(value) && value > -1;\n  }\n}\n\nexport default Numeric;\n","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport pick from 'lodash/pick';\n\n/**\n * PomocnÃ¡ tÅ™Ã­dÃ¡ pro prÃ¡ci se stromovou strukturou organizacÃ­ vrÃ¡cenou ze serveru.\n */\nclass OrganizationHelper {\n  /**\n   * PÅ™evede stromovou strukturu organizacÃ­ na plochÃ½ seznam.\n   * @param {Object} organization KoÅ™enovÃ¡ organizace, ve formÃ¡tu, kterÃ½ poslal server.\n   * @returns {Array.<Organization>} Seznam organizacÃ­ v poÅ™adÃ­ preorder.\n   */\n  flatten (organization) {\n    const {child = []} = organization;\n    return child.reduce(\n      (orgArray, childOrganization) => (\n        orgArray.concat(this.flatten(childOrganization))\n      ),\n      [pick(organization, 'id', 'name')]\n    );\n  }\n}\n\nexport default OrganizationHelper;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k orientacÃ­ obrazovky.\n * @enum {string}\n * @name OrientationEnum\n */\nexport default {\n  CLOCKWISE_0: 'CLOCKWISE_0',\n  CLOCKWISE_90: 'CLOCKWISE_90',\n  CLOCKWISE_180: 'CLOCKWISE_180',\n  CLOCKWISE_270: 'CLOCKWISE_270'\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\n\n/**\n * Typ mÃ©dia PDF.\n * Soubory se lokÃ¡lnÄ› uklÃ¡dajÃ­ a spouÅ¡tÄ›jÃ­ pÅ™es `file://` protokol.\n * @implements {ViewerType}\n */\nclass PdfFileViewerType {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {PdfViewerControllerFactory} controllerFactory\n   * @param {PdfViewerSourceCreator} sourceCreator\n   */\n  constructor (controllerFactory, sourceCreator) {\n    this.controllerFactory = controllerFactory;\n    this.sourceCreator = sourceCreator;\n  }\n\n  /** @inheritdoc */\n  createController () {\n    return this.controllerFactory.create();\n  }\n\n  /** @inheritdoc */\n  getSourceCreator () {\n    return this.sourceCreator;\n  }\n\n  /** @inheritdoc */\n  getUrl (medium) {\n    return get(medium.asset, 'fileUrl', null);\n  }\n\n  /** @inheritdoc */\n  isExtractable () {\n    return false;\n  }\n\n  /** @inheritdoc */\n  isOfflineable () {\n    return true;\n  }\n\n  /** @inheritdoc */\n  isPreloadable (medium) {\n    return false;\n  }\n}\n\nexport default PdfFileViewerType;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na rodiÄ�e pÅ™i komunikaci s pÅ™ehrÃ¡vaÄ�em PDF.\n */\nclass PdfParentFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<PdfParent>} PdfParent\n   * @param {PenpalConnectToChild} connectToChild\n   * @param {string} origin Origin, kterÃ½ budou mÃ­t zprÃ¡vy od potomka.\n   * @param {number} timeout MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na navÃ¡zÃ¡nÃ­ komunikace. [ms]\n   * @returns {undefined}\n   */\n  constructor (PdfParent, connectToChild, origin, timeout) {\n    this.PdfParent = PdfParent;\n    this.connectToChild = connectToChild;\n    this.origin = origin;\n    this.timeout = timeout;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ©ho rodiÄ�e.\n   * @param {HTMLIFrameElement} iframe Iframe, do kterÃ©ho se naÄ�te potomek s PDF prohlÃ­Å¾eÄ�em.\n   * @returns {PdfParent}\n   */\n  create (iframe) {\n    return new this.PdfParent(this.connectToChild, iframe, this.origin, this.timeout);\n  }\n}\n\nexport default PdfParentFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\n\n// TODO #295 Zrevidovat odchytÃ¡vÃ¡nÃ­ chyb.\n// TODO #295 LepÅ¡Ã­ napojenÃ­ child?\n// - ZatÃ­m vÅ¡ude volÃ¡nÃ­ `connection.promise` pro pÅ™Ã­stup k child.\n// - RozdÄ›lit aktuÃ¡lnÃ­ tÅ™Ã­du na dvÄ›,\n//   pÅ™iÄ�emÅ¾ v konstruktoru jednoho bude child a u druhÃ©ho iframe apod.\n//   Jak ale pak zpracovat `connectToParent`, kde je nutnÃ© navÃ¡zat metody?\n// TODO Upravit pÅ™Ã­stup k dobÄ› pÅ™ehrÃ¡vÃ¡nÃ­ dle HTML mÃ©diÃ­:\n// - VÃ½chozÃ­ je hodnota pageRate, kterÃ¡ se zadÃ¡ v konfiguraci.\n// - Po naÄ�tenÃ­ poÄ�tu stran v PDF se vypoÄ�te duration = pagesCount / pageRate.\n//   VypoÄ�tenÃ¡ hodnota se sdÄ›lÃ­ v udÃ¡losti durationchange rodiÄ�i a ovladaÄ�i.\n//   PÅ™edchozÃ­ read-only hodnota duration byla NaN.\n// - Pokud ovladaÄ� nynÃ­ spustÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ pouÅ¾ije se vÃ½chozÃ­ rychlost.\n// - OvladaÄ� mÃ¡ ale moÅ¾nost na zÃ¡kladÄ› znÃ¡mÃ© a poÅ¾adovanÃ© duration upravit hodnotu playbackRate\n//   a tÃ­m ovlivnit fyzickou dÃ©lku pÅ™ehrÃ¡vÃ¡nÃ­ PDF.\n// - https://developer.mozilla.org/en-US/docs/Web/Guide/Audio_and_video_delivery/WebAudio_playbackRate_explained\n// - https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/duration\n// - https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/playbackRate\n// - https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/durationchange_event\n// - https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/defaultPlaybackRate\n// - https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/ratechange_event\n// TODO #295 ProblÃ©m s vertikÃ¡lnÃ­m centrovÃ¡nÃ­m stran.\n// - https://github.com/mozilla/pdf.js/issues/10906\n// TODO #295 ProblÃ©m se zobrazenÃ­m vÃ­ce stran.\n// - https://github.com/mozilla/pdf.js/issues/10907\n// TODO #295 PouÅ¾Ã­vat sync metody mÃ­sto async? VyÅ¾adovalo by pÅ™esun logiky sem.\n// - Jak tÅ™eba okamÅ¾itÄ› zastavit pÅ™ehrÃ¡vÃ¡nÃ­, kdyÅ¾ se operace provede async?\n/**\n * RodiÄ� pÅ™i komunikaci s pÅ™ehrÃ¡vaÄ�em PDF.\n * OvlÃ¡dÃ¡ iframe a vyvÃ¡Å™Ã­ v nÄ›m potomka,\n * kterÃ½ ovlÃ¡dÃ¡ PDF pÅ™ehrÃ¡vaÄ� bÄ›Å¾Ã­cÃ­ uvnitÅ™ iframe.\n *\n * RozhranÃ­ se snaÅ¾Ã­ dodrÅ¾ovat konvence zavedenÃ© v\n * [HTMLVideoElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)\n * a [HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement).\n * V zÃ¡kladnÃ­ logice je pÅ™ehrÃ¡vÃ¡nÃ­ videa a PDF stejnÃ©, frame videa odpovÃ­dÃ¡ stranÄ› PDF.\n * PÅ™esto je zde nÄ›kolik rozdÃ­lÅ¯:\n *\n * - MÃ­sto `addEventListener` a `removeEventListener`\n *   se pouÅ¾Ã­vÃ¡ `on` a `off`.\n * - Nejsou dostupnÃ© varianty naslouchÃ¡nÃ­ jako `onerror` apod.\n * - MÃ­sto ES5 getterÅ¯ a setterÅ¯ se pouÅ¾Ã­vajÃ­ metody.\n *   NapÅ™. mÃ­sto vlastnosti `src` jsou zde dvÄ› metody `getSrc` a `setSrc`.\n * - VÅ¡echny metody jsou asynchronnÃ­, protoÅ¾e se pÅ™edÃ¡vajÃ­ pÅ™es iframe do jinÃ© aplikace.\n * - ÄŒÃ­slovÃ¡nÃ­ strÃ¡nek je od 1, ale Ä�Ã­slovÃ¡nÃ­ frame od 0.\n * - U HTML videa je `currentFrame` nedostupnÃ½, coÅ¾ vychÃ¡zÃ­ z vysokÃ© rychlosti pÅ™ehrÃ¡vÃ¡nÃ­\n *   a nutnosti synchronizace s rÅ¯znÃ½mi displeji.\n *   U PDF existuje `currentPage` s pÅ™esnÃ½m Ä�Ã­slem aktuÃ¡lnÄ› zobrazenÃ© strany.\n *   DÃ­ky tomu lze jednoduÅ¡e pÅ™epnout na poÅ¾adovanou stranu,\n *   aniÅ¾ by bylo nutnÃ© Å™eÅ¡it problÃ©my se zaokrouhlovÃ¡nÃ­m Ä�asu.\n *   NapÅ™. PDF s dÃ©lkou 10s na 3 strany se tÄ›Å¾ko pÅ™epne na druhou stranu,\n *   aniÅ¾ by problikla prvnÃ­.\n *   Na druhou stranu nelze tÃ­mto pÅ™Ã­stupem pÅ™ehrÃ¡vÃ¡nÃ­ nastavit pÅ™esnÃ½ okamÅ¾ik pÅ™ehrÃ¡vÃ¡nÃ­.\n *   NapÅ™. pÅ™esun doprostÅ™ed Ä�asovÃ© osy u PDF se tÅ™emi stranami.\n *   PouÅ¾itÃ­ tohoto pÅ™Ã­stupu nijak neomezuje budoucÃ­ nasazenÃ­ `currentTime` vedle `currentPage`.\n * - NarozdÃ­l od videa dovoluje libovolnÄ› nastavit `duration`.\n *\n * Pro sprÃ¡vnou funkcionalitu PDF prohlÃ­Å¾eÄ�e na `file://` protokolu\n * je nutnÃ© na Chrome pouÅ¾Ã­t argument `--allow-file-access-from-files`.\n * Jinak nedojde ke spÃ¡rovÃ¡nÃ­ origin u `postMessage` API\n * a takÃ© knihovna PDF.js naÄ�Ã­tÃ¡ nÄ›kterÃ© soubory za bÄ›hu.\n * @implements {Destroyable}\n * @implements {EventBus}\n */\nclass PdfParent {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {PenpalConnectToChild} connectToChild\n   * @param {HTMLIFrameElement} iframe Iframe, do kterÃ©ho se naÄ�te potomek s PDF prohlÃ­Å¾eÄ�em.\n   * @param {string} origin Origin, kterÃ½ budou mÃ­t zprÃ¡vy od potomka.\n   * @param {number} timeout MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na navÃ¡zÃ¡nÃ­ komunikace. [ms]\n   */\n  constructor (connectToChild, iframe, origin, timeout) {\n    this.emitter = new EventEmitter();\n    // NavÃ¡zÃ¡nÃ­ spojenÃ­ s aplikacÃ­ potomka.\n    this.connection = connectToChild({\n      childOrigin: origin,\n      iframe,\n      methods: {\n        durationchange: this.onDurationchange.bind(this),\n        ended: this.onEnded.bind(this),\n        error: this.onError.bind(this)\n      },\n      timeout\n    });\n    iframe.src = 'pdf-viewer/viewer.html';\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    this.connection.destroy();\n  }\n\n  /**\n   * ZjistÃ­ zdroj PDF.\n   * Zdroje:\n   * [HTMLMediaElement.src](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/src).\n   * @returns {Promise.<string>} URL adresa souboru s PDF.\n   */\n  getSrc () {\n    return new Promise((resolve) => resolve(\n      this.connection.promise\n      .then((child) => child.getSrc())\n    ));\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na zmÄ›nu dÃ©lky pÅ™ehrÃ¡vÃ¡nÃ­ PDF.\n   * Zdroje:\n   * [HTMLMediaElement durationchange](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/durationchange_event).\n   * @param {number} duration DÃ©lka pÅ™ehrÃ¡vÃ¡nÃ­. [s]\n   * @private\n   * @returns {Promise.<undefined>}\n   */\n  onDurationchange (duration) {\n    return this.emitter.emit('durationchange', duration);\n  }\n\n  /**\n   * Reakce na dokonÄ�enÃ­ pÅ™ehrÃ¡nÃ­ PDF.\n   * @private\n   * @returns {undefined}\n   */\n  onEnded () {\n    return this.emitter.emit('ended');\n  }\n\n  /**\n   * Reakce na chybu z PDF pÅ™ehrÃ¡vaÄ�e.\n   * @param {string} message\n   * @private\n   * @returns {undefined}\n   */\n  onError (message) {\n    const error = new Error(message);\n    return this.emitter.emit('error', error);\n  }\n\n  /**\n   * PozastavÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ PDF.\n   * Zdroje:\n   * [HTMLMediaElement.pause](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/pause).\n   * @returns {Promise.<undefined>}\n   */\n  pause () {\n    return new Promise((resolve) => resolve(\n      this.connection.promise\n      .then((child) => child.pause())\n    ));\n  }\n\n  /**\n   * SpustÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ PDF, bÄ›hem kterÃ©ho se v poÅ¾adovanÃ©m intervalu\n   * prochÃ¡zÃ­ jednotlivÃ½mi strÃ¡nkami dokumentu.\n   * Zdroje:\n   * [HTMLMediaElement.play](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play).\n   * @returns {Promise.<undefined>}\n   */\n  play () {\n    return new Promise((resolve) => resolve(\n      this.connection.promise\n      .then((child) => child.play())\n    ));\n  }\n\n  /**\n   * NastavÃ­ aktuÃ¡lnÄ› zobrazenou stranu v PDF.\n   * Zdroje:\n   * [HTMLMediaElement.currentTime](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/currentTime).\n   * @param {number} page ÄŒÃ­slo strany, prvnÃ­ je 1.\n   * @returns {Promise.<undefined>}\n   */\n  setCurrentPage (page) {\n    return new Promise((resolve) => resolve(\n      this.connection.promise\n      .then((child) => child.setCurrentPage(page))\n    ));\n  }\n\n  /**\n   * NastavÃ­ rychlost pÅ™ehrÃ¡vÃ¡nÃ­ PDF.\n   * Zdroje:\n   * [HTMLMediaElement.playbackRate](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/playbackRate).\n   * @param {number} playbackRate Rychlost pÅ™ehrÃ¡vÃ¡nÃ­ PDF, kde 0 je zastaveno a 1 je vÃ½chozÃ­ rychlost.\n   * @returns {Promise.<undefined>}\n   */\n  setPlaybackRate (playbackRate) {\n    return new Promise((resolve) => resolve(\n      this.connection.promise\n      .then((child) => child.setPlaybackRate(playbackRate))\n    ));\n  }\n\n  /**\n   * NastavÃ­ zdroj PDF.\n   * Zdroje:\n   * [HTMLMediaElement.src](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/src).\n   * @param {string} src URL adresa souboru s PDF.\n   * @returns {Promise.<undefined>}\n   */\n  setSrc (src) {\n    return new Promise((resolve) => resolve(\n      this.connection.promise\n      .then((child) => child.setSrc(src))\n    ));\n  }\n}\n\n/**\n * The `durationchange` event is fired when the `duration` attribute has been updated.\n * Zdroje:\n * [HTMLMediaElement.durationchange](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/durationchange_event).\n * @event PdfParent#durationchange\n * @param {number} duration\n */\n\n/**\n * The `ended` event is fired when playback or streaming has stopped\n * because the end of the media was reached or because no further data is available.\n * Zdroje:\n * [HTMLMediaElement.ended](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/ended_event).\n * @event PdfParent#ended\n */\n\n/**\n * The `error` event is fired when the resource could not be loaded due to an error\n * Zdroje:\n * [HTMLMediaElement.error](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/error_event).\n * @event PdfParent#error\n * @param {string} message\n */\n\nexport default PdfParent;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * RecyklÃ¡tor PDF prohlÃ­Å¾eÄ�Å¯.\n */\nclass PdfRecycler {\n  /**\n   * ObnovÃ­ PDF prohlÃ­Å¾eÄ� do vÃ½chozÃ­ho stavu.\n   * Za vÃ½chozÃ­ se povaÅ¾uje stav,\n   * ve kterÃ©m je prohlÃ­Å¾eÄ� po vytvoÅ™enÃ­.\n   *\n   * Neopravuje vlastnost [src](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/src),\n   * protoÅ¾e je tato operace nÃ¡roÄ�nÃ¡ na pamÄ›Å¥ a je zde vÅ¾dy moÅ¾nost,\n   * Å¾e se bude otevÃ­rat stejnÃ© PDF.\n   * PÅ™ijemce mÃ¡ vÅ¾dy moÅ¾nost nastavit novÃ© `src` dle potÅ™eby,\n   * jistota, Å¾e je pÅ™echozÃ­ hodnota prÃ¡zdnÃ¡, nenÃ­ aÅ¾ tak dÅ¯leÅ¾itÃ¡.\n   * @param {PdfParent} parent RodiÄ�ovskÃ¡ tÅ™Ã­da PDF prohlÃ­Å¾eÄ�e k opravenÃ­.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se, jakmile je prohlÃ­Å¾eÄ� opraven.\n   */\n  recycle (parent) {\n    return new Promise((resolve) => resolve(\n      parent.pause()\n      .then(() => parent.setPlaybackRate(1))\n      .then(() => parent.setCurrentPage(1))\n    ));\n  }\n}\n\nexport default PdfRecycler;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna pro potÅ™eby ovladaÄ�e PDF souborÅ¯.\n */\nclass PdfViewerControllerFactory {\n  /**\n   * VytvoÅ™Ã­ instanci\n   * @param {Class.<PdfViewerController>} PdfViewerController\n   * @param {ViewerLifeCycleFactory} viewerLifeCycleFactory\n   */\n  constructor (PdfViewerController, viewerLifeCycleFactory) {\n    this.PdfViewerController = PdfViewerController;\n    this.viewerLifeCycleFactory = viewerLifeCycleFactory;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ ovladaÄ� pro zobrazenÃ­ video streamu.\n   * @returns {PdfViewerController} VytvoÅ™enÃ½ ovladaÄ�.\n   */\n  create () {\n    return new this.PdfViewerController(this.viewerLifeCycleFactory);\n  }\n}\n\nexport default PdfViewerControllerFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport isNil from 'lodash/isNil';\n\n// TODO #295 NejasnÃ© rozdÄ›lenÃ­ odpovÄ›dnosti mezi ovladaÄ�em a PdfParent:\n// - Oba pÅ™istupujÃ­ k elementÅ¯. Kdo mÃ¡ co dÄ›lat?\n// - OvladaÄ� zatÃ­m vÅ¾dy Å™eÅ¡il pozicovÃ¡nÃ­, tak by k nÄ›mu mÄ›l mÃ­t pÅ™Ã­stup.\n// - PdfParent potÅ™ebuje iframe pro komunikaci, takÅ¾e zde je takÃ© pÅ™Ã­stup poÅ¾adovanÃ½.\n/**\n * OvladaÄ� pro zobrazovÃ¡nÃ­ PDF souborÅ¯.\n * @implements {ViewerController}\n */\nclass PdfViewerController {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {ViewerLifeCycleFactory} viewerLifeCycleFactory\n   */\n  constructor (viewerLifeCycleFactory) {\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    this.onDurationchange = this.onDurationchange.bind(this);\n    this.onElementError = this.onElementError.bind(this);\n    this.onEnded = this.onEnded.bind(this);\n    this.onParentError = this.onParentError.bind(this);\n    this.parent = null;\n    this.scheduleInfo = null;\n    this.viewerLifeCycle = viewerLifeCycleFactory.create();\n    this.viewerSource = null;\n  }\n\n  /**\n   * NavÃ¡Å¾e naslouchÃ¡nÃ­ udÃ¡lostem z elementu.\n   * @param {HTMLIFrameElement} el Element, kterÃ©mu se naslouchÃ¡.\n   * @private\n   * @returns {undefined}\n   */\n  bindElement (el) {\n    el.addEventListener('error', this.onElementError);\n  }\n\n  /**\n   * NavÃ¡Å¾e naslouchÃ¡nÃ­ udÃ¡lostem z PDF pÅ™ehrÃ¡vaÄ�e.\n   * @param {PdfParent} parent\n   * @private\n   * @returns {undefined}\n   */\n  bindParent (parent) {\n    parent.on('durationchange', this.onDurationchange);\n    parent.on('ended', this.onEnded);\n    parent.on('error', this.onParentError);\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    const {parent, viewerSource} = this;\n    if (!isNil(parent)) {\n      this.unbindParent(parent);\n    }\n    if (!isNil(viewerSource)) {\n      const el = viewerSource.getEl();\n      this.unbindElement(el);\n    }\n  }\n\n  /** @inheritdoc */\n  enter () {\n    return this.viewerLifeCycle.enter(() => {\n      // ZobrazenÃ­ obalujÃ­cÃ­ho elementu.\n      const frame = this.viewerSource.getFrame();\n      frame.enter();\n      // SpuÅ¡tÄ›nÃ­ pÅ™ehrÃ¡vÃ¡nÃ­.\n      return this.parent.play();\n    });\n  }\n\n  /** @inheritdoc */\n  leave () {\n    return this.viewerLifeCycle.leave(() => {\n      // SkrytÃ­ obalujÃ­cÃ­ho elementu.\n      const frame = this.viewerSource.getFrame();\n      frame.leave();\n      // ZastavenÃ­ pÅ™ehrÃ¡vÃ¡nÃ­.\n      return this.parent.pause();\n    });\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na zmÄ›nu doby pÅ™ehrÃ¡vÃ¡nÃ­.\n   * @param {number} duration DÃ©lka pÅ™ehrÃ¡vÃ¡nÃ­. [s]\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onDurationchange (duration) {\n    const requestedDuration = this.scheduleInfo.getPlayDuration();\n    if (requestedDuration === 0) {\n      // Pokud je poÅ¾adovanÃ¡ doba pÅ™ehrÃ¡vÃ¡nÃ­ nulovÃ¡, pouÅ¾ije se vÃ½chozÃ­ doba pÅ™ehrÃ¡vÃ¡nÃ­.\n      return;\n    }\n    // Dle skuteÄ�nÃ© a poÅ¾adovanÃ© doby pÅ™ehrÃ¡vÃ¡nÃ­ se urÄ�Ã­ rychlost.\n    const playbackRate = duration * 1000 / requestedDuration;\n    return this.parent.setPlaybackRate(playbackRate);\n  }\n\n  /**\n   * Reakce na chybu v elementu.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onElementError () {\n    const error = new Error(`Unknown HTMLIframeElement error.`);\n    this.emitter.emit('error', error);\n  }\n\n  /**\n   * DosaÅ¾enÃ­ konce pÅ™ehrÃ¡vÃ¡nÃ­.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onEnded () {\n    this.emitter.emit('played');\n  }\n\n  /**\n   * Reakce na chybu z PDF pÅ™ehrÃ¡vaÄ�e.\n   * @param {Error} error\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onParentError (error) {\n    this.emitter.emit('error', error);\n  }\n\n  /** @inheritdoc */\n  release () {\n    return this.viewerLifeCycle.release(() => {\n      const {viewerSource} = this;\n      // UvolnÄ›nÃ­ obalujÃ­cÃ­ho elementu.\n      const frame = viewerSource.getFrame();\n      frame.release();\n      // UvolnÄ›nÃ­ zdrojovÃ©ho elementu.\n      const el = viewerSource.getEl();\n      this.unbindElement(el);\n      // ZruÅ¡enÃ­ hodnot v instanci.\n      this.scheduleInfo = null;\n      this.viewerSource = null;\n    });\n  }\n\n  /** @inheritdoc */\n  seize (scheduleInfo, viewerSource) {\n    return this.viewerLifeCycle.seize(() => {\n      // NastavenÃ­ zÃ¡kladnÃ­ch hodnot.\n      this.scheduleInfo = scheduleInfo;\n      this.viewerSource = viewerSource;\n      // PÅ™Ã­prava obalujÃ­cÃ­ho elementu.\n      const frame = viewerSource.getFrame();\n      frame.seize(scheduleInfo);\n      // PÅ™Ã­prava zdrojovÃ©ho elementu.\n      const el = viewerSource.getEl();\n      this.bindElement(el);\n      el.classList.add('pdf-viewer-controller');\n      el.sandbox = 'allow-forms allow-same-origin allow-scripts';\n      // Deaktivace scrollovÃ¡nÃ­ v iframe.\n      // OznaÄ�eno jako deprecated, ale nÄ›kterÃ© prohlÃ­Å¾eÄ�e ho vyÅ¾adujÃ­.\n      el.scrolling = 'no';\n      // NastavenÃ­ zdroje.\n      const url = scheduleInfo.getUrl();\n      const parent = viewerSource.getParent();\n      this.parent = parent;\n      this.bindParent(parent);\n      return parent.setSrc(url);\n    });\n  }\n\n  /**\n   * UvolnÃ­ naslouchÃ¡nÃ­ udÃ¡lostem z elementu.\n   * @param {HTMLIFrameElement} el Element, kterÃ©mu se naslouchÃ¡.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  unbindElement (el) {\n    el.removeEventListener('error', this.onElementError);\n  }\n\n  /**\n   * UvolnÃ­ naslouchÃ¡nÃ­ udÃ¡lostem z PDF serveru.\n   * @param {PdfParent} parent\n   * @private\n   * @returns {undefined}\n   */\n  unbindParent (parent) {\n    parent.off('durationchange', this.onDurationchange);\n    parent.off('ended', this.onEnded);\n    parent.off('error', this.onParentError);\n  }\n}\n\nexport default PdfViewerController;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\n// TODO Unit testy.\n/**\n * Poskytovatel zdrojÅ¯ pro zobrazovÃ¡nÃ­ PDF dokumentÅ¯.\n * @implements {ViewerSourceCreator}\n */\nclass PdfViewerSourceCreator {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {number} max MaximÃ¡lnÃ­ poÄ�et souÄ�asnÄ› zobrazovanÃ½ch PDF.\n   * @param {PoolAsyncFactory} poolFactory\n   * @param {PdfRecycler} recycler\n   * @param {PdfViewerSourceFactory} sourceFactory\n   */\n  constructor (max, poolFactory, recycler, sourceFactory) {\n    this.pool = poolFactory.create(sourceFactory, {max});\n    this.poolFactory = poolFactory;\n    this.poolMap = {};\n    this.recycler = recycler;\n    this.sourceFactory = sourceFactory;\n  }\n\n  /** @inheritdoc */\n  delete (source) {\n    return new Promise((resolve) => {\n      source.getFrame().repair();\n      const pool = this.findPool(source);\n      return resolve(pool.delete(source));\n    });\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // PrÃ¡zdnÃ¡ metoda pro splnÄ›nÃ­ rozhranÃ­.\n    // TODO #295 Zrevidovat ruÅ¡enÃ­ u ViewerSourceCreator?\n  }\n\n  /**\n   * Nalezne pool, ke kterÃ©mu patÅ™Ã­ vybranÃ½ zdroj.\n   * @param {PdfViewerSource} source\n   * @private\n   * @returns {PoolAsync}\n   */\n  findPool (source) {\n    const foundPool = (\n      Object.values(this.poolMap)\n      .find((pool) => pool.isLent(source))\n    );\n    if (isNil(foundPool)) {\n      throw new Error(`Object ${source} is not lent.`);\n    }\n    return foundPool;\n  }\n\n  /** @inheritdoc */\n  getLent () {\n    return (\n      Object.values(this.poolMap)\n      .reduce(\n        (acc, pool) => acc - pool.getAvailable(),\n        this.pool.getLent()\n      )\n    );\n  }\n\n  /** @inheritdoc */\n  getMax () {\n    return this.pool.getMax();\n  }\n\n  /** @inheritdoc */\n  lend (parentEl, scheduleInfo) {\n    return new Promise((resolve) => {\n      const {poolMap, sourceFactory} = this;\n      sourceFactory.setParentEl(parentEl);\n      sourceFactory.setScheduleInfo(scheduleInfo);\n      const url = scheduleInfo.getUrl();\n      const existingPool = poolMap[url];\n      if (!isNil(existingPool)) {\n        return resolve(existingPool.lend());\n      }\n      // TODO #295 Nejprve vypÅ¯jÄ�it a aÅ¾ pak tvoÅ™it novÃ½ pool?\n      const createdPool = this.poolFactory.create({\n        create: () => this.pool.lend(),\n        delete: (source) => this.pool.delete(source)\n      });\n      poolMap[url] = createdPool;\n      return resolve(createdPool.lend());\n    });\n  }\n\n  /** @inheritdoc */\n  receive (source) {\n    return new Promise((resolve) => resolve(\n      this.recycler.recycle(source.getParent())\n      .then(() => {\n        const pool = this.findPool(source);\n        pool.receive(source);\n      })\n    ));\n  }\n\n  /** @inheritdoc */\n  replace () {\n    return new Promise((resolve) => resolve(\n      Object.entries(this.poolMap)\n      .reduce(\n        (acc, [url, pool]) => acc.then(() => {\n          if (pool.getLent() > 0) {\n            return;\n          }\n          return (\n            pool.destroy()\n            .then(() => {\n              delete this.poolMap[url];\n            })\n          );\n        }),\n        Promise.resolve()\n      )\n    ));\n  }\n}\n\nexport default PdfViewerSourceCreator;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * AsynchronnÃ­ tovÃ¡rna na zdroje zobrazovÃ¡nÃ­ PDF mÃ©diÃ­\n * v podobÄ› HTML iframe elementu\n * ve kterÃ©m je naÄ�tenÃ¡ aplikace PDF prohlÃ­Å¾eÄ�e.\n */\nclass PdfViewerSourceFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<PdfViewerSource>} PdfViewerSource\n   * @param {ViewerSourceIframeCreator} iframeCreator\n   * @param {PdfParentFactory} parentFactory\n   */\n  constructor (PdfViewerSource, iframeCreator, parentFactory) {\n    this.PdfViewerSource = PdfViewerSource;\n    this.iframeCreator = iframeCreator;\n    this.parentEl = null;\n    this.parentFactory = parentFactory;\n    this.scheduleInfo = null;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ zdroj pro zobrazenÃ­ PDF mÃ©dia.\n   * @returns {Promise.<PdfViewerSource>}\n   */\n  create () {\n    return new Promise((resolve) => resolve(\n      this.iframeCreator.lend(this.parentEl, this.scheduleInfo)\n      .then((sourceIframe) => {\n        const iframe = sourceIframe.getEl();\n        const parent = this.parentFactory.create(iframe);\n        return new this.PdfViewerSource(parent, sourceIframe);\n      })\n    ));\n  }\n\n  /**\n   * SmaÅ¾e zdroj pro zobrazenÃ­ mÃ©dia.\n   * @param {PdfViewerSource} source Zdroj ke smazÃ¡nÃ­.\n   * @returns {Promise.<undefined>}\n   */\n  delete (source) {\n    return source.destroy();\n  }\n\n  /**\n   * NastavÃ­ rodiÄ�ovskÃ½ element, urÄ�enÃ½ pro vklÃ¡dÃ¡nÃ­ elementÅ¯ zdroje.\n   * @param {HTMLElement} parentEl\n   * @returns {undefined}\n   */\n  setParentEl (parentEl) {\n    this.parentEl = parentEl;\n  }\n\n  /**\n   * NastavÃ­ naplÃ¡novanÃ© mÃ©dium, urÄ�enÃ© pro Å¾Ã¡dost o iframe element.\n   * @param {ScheduleInfo} scheduleInfo\n   * @returns {undefined}\n   */\n  setScheduleInfo (scheduleInfo) {\n    this.scheduleInfo = scheduleInfo;\n  }\n}\n\nexport default PdfViewerSourceFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Zdroj zobrazovÃ¡nÃ­ PDF mÃ©diÃ­ v podobÄ› HTML iframe elementu\n * ve kterÃ©m je naÄ�tenÃ¡ aplikace PDF prohlÃ­Å¾eÄ�e.\n * @implements {ViewerSource}\n */\nclass PdfViewerSource {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {PdfParent} parent\n   * @param {ViewerSourceIframe} sourceIframe\n   */\n  constructor (parent, sourceIframe) {\n    this.parent = parent;\n    this.sourceIframe = sourceIframe;\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // TODO #295 RuÅ¡it iframe zdroj a parent zde, nebo ve vyÅ¡Å¡Ã­ Ãºrovni?\n    this.parent.destroy();\n    this.sourceIframe.destroy();\n  }\n\n  /** @inheritdoc */\n  getEl () {\n    return this.sourceIframe.getEl();\n  }\n\n  /** @inheritdoc */\n  getFrame () {\n    return this.sourceIframe.getFrame();\n  }\n\n  /**\n   * ZjistÃ­ rodiÄ�ovskÃ© API pÅ™i komunikaci s pÅ™ehrÃ¡vaÄ�em PDF.\n   * @returns {PdfParent}\n   */\n  getParent () {\n    return this.parent;\n  }\n\n  /** @inheritdoc */\n  setParentEl (parentEl) {\n    return this.sourceIframe.setParentEl(parentEl);\n  }\n}\n\nexport default PdfViewerSource;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\nimport merge from 'lodash/merge';\n\nimport CommunicatorSchedule from '../communicator/schedule/communicator-schedule';\nimport CommunicatorUtility from '../communicator/utility/communicator-utility';\n\n/**\n * KomunikÃ¡tor playlistÅ¯ pro Ki-Wi Server.\n */\nclass PlaylistCommunicator {\n  /**\n   * @param {TrackCommunicator} trackCommunicator\n   */\n  constructor (trackCommunicator) {\n    this.trackCommunicator = trackCommunicator;\n  }\n\n  /**\n   * Zpracuje seznam playlistÅ¯ a zanoÅ™enÃ½ch modelÅ¯.\n   * @param {Array.<Object>} jsonArray ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ se seznamem playlistÅ¯.\n   * @returns {DsMap} Mapa datovÃ½ch atributÅ¯ ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  parseMany (jsonArray) {\n    return CommunicatorUtility.parseMany(\n      jsonArray,\n      (json) => this.parseOne(json),\n      {playlist: {}, track: {}}\n    );\n  }\n\n  /**\n   * Zpracuje jeden playlist bez zanoÅ™enÃ½ch modelÅ¯.\n   * @param {Object} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s jednÃ­m playlistem.\n   * @param {DsId} [id] IdentifikÃ¡tor playlistu, kterÃ½ se mÃ¡ zpracovat.\n   * @returns {DsAttrs} Obsah playlistu ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  parseModel (json, id) {\n    return {\n      id,\n      scheduleEnum: CommunicatorSchedule.parse(json.scheduler.type),\n      volume: CommunicatorUtility.parseVolume(json.volume)\n    };\n  }\n\n  /**\n   * Zpracuje jeden playlist a zanoÅ™enÃ© modely.\n   * @param {Object} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s jednÃ­m playlistem.\n   * @returns {DsMap} Mapa datovÃ½ch atributÅ¯ ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  parseOne (json) {\n    const {id} = json;\n    if (isNil(id)) {\n      return {playlist: {}, track: {}};\n    }\n    const playlistModel = this.parseModel(json, id);\n    const playlistMap = {playlist: {[id]: playlistModel}};\n    const trackMap = this.trackCommunicator.parseMany(json.tracks, id);\n    return merge({}, trackMap, playlistMap);\n  }\n}\n\nexport default PlaylistCommunicator;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nexport default {\n  name: 'playlist',\n  methods: {\n    toString () {\n      return `Playlist {id: \"${this.id}\"}`;\n    }\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na asynchronnÃ­ bazÃ©ny recyklovanÃ½ch objektÅ¯.\n */\nclass PoolAsyncFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<PoolAsync>} PoolAsync\n   * @param {GenericPool} genericPool\n   */\n  constructor (PoolAsync, genericPool) {\n    this.PoolAsync = PoolAsync;\n    this.genericPool = genericPool;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ bazÃ©n.\n   * @param {PoolObjectFactory} factory TovÃ¡rna pro vytvÃ¡Å™enÃ­ novÃ½ch objektÅ¯ umÃ­sÅ¥enÃ½ch v bazÃ©nu.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {number} [opts.max=Infinity] MaximÃ¡lnÃ­ poÄ�et objektÅ¯, kterÃ© mÃ¡ bazÃ©n vytvoÅ™it.\n   * @returns {PoolAsync}\n   */\n  create (factory, {max = Infinity} = {}) {\n    return new this.PoolAsync(factory, this.genericPool, max);\n  }\n}\n\nexport default PoolAsyncFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO #295 Bug v eslint.\n/* eslint-disable jsdoc/require-returns */\n\nimport Numeric from '../numeric/numeric';\n\n// TODO ChybÃ­ podpora pro drain:\n// - Sice je pÅ™Ã­tomnÃ¡ podobnÃ¡ metoda, ale ta neÃºmoÅ¾Åˆuje vybrat poÄ�et\n//   a po jejÃ­m volÃ¡nÃ­ je jiÅ¾ pool nepouÅ¾itelnÃ½.\n// - \"One side-effect of calling drain() is that subsequent calls to acquire() will throw an Error.\"\n// TODO ChybÃ­ podpora pro neomezenÃ½ pool.\n// - https://github.com/coopernurse/node-pool/issues/264\n// TODO Hotfix implementace metody `.fill`, viz. popis metody.\n// - https://github.com/coopernurse/node-pool/issues/265\n// TODO ChybÃ­ podpora pro operace s duplicitnÃ­mi objekty, kterÃ© mÅ¯Å¾e tovÃ¡rna vytvoÅ™it.\n// - PouÅ¾itÃ¡ knihovna pravdÄ›podobnÄ› eviduje objekty podle jejich identity.\n// - ZatÃ­m nenÃ­ pouÅ¾Ã­vÃ¡no, takÅ¾e byly pouze odstranÄ›ny testy.\n// - Nebylo nic reportovÃ¡no, nejde o \"must-have\" funkcionalitu.\n/**\n * AsynchronnÃ­ bazÃ©n recyklovanÃ½ch objektÅ¯.\n * Implementuje nÃ¡vrhovÃ½ vzor [Object pool](https://en.wikipedia.org/wiki/Object_pool_pattern).\n * ProvÃ¡dÃ­ recyklaci vrÃ¡cenÃ½ch objektÅ¯ pro dalÅ¡Ã­ pouÅ¾itÃ­.\n * PoÄ�et objektÅ¯ lze omezit maximem (nedovolÃ­ vytvÃ¡Å™enÃ­ dalÅ¡Ã­ch).\n * NarozdÃ­l od obyÄ�ejnÃ©ho bazÃ©nu na objekty\n * lze provÃ¡dÄ›t asynchronnÃ­ operace bÄ›hem vytvÃ¡Å™enÃ­ a mazÃ¡nÃ­ objektÅ¯.\n *\n * Implementace je orientovÃ¡na na maximÃ¡lnÃ­ vÃ½kon, jednoduchost a robustnost.\n *\n * Lze vyuÅ¾Ã­t pro redukci garbage collection, omezenÃ­ nÃ¡roÄ�nÃ© inicializace nebo destrukce,\n * splnÄ›nÃ­ omezenÃ­ na pÅ™Ã­stup ke zdrojÅ¯m apod.\n *\n * InspirovÃ¡no existujÃ­cÃ­mi knihovnami:\n * [generic-pool](https://github.com/coopernurse/node-pool),\n * [deePool](https://github.com/getify/deePool).\n */\nclass PoolAsync {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {PoolObjectFactory} factory TovÃ¡rna pro vytvÃ¡Å™enÃ­ novÃ½ch objektÅ¯ umÃ­sÅ¥enÃ½ch v bazÃ©nu.\n   * @param {GenericPool} genericPool\n   * @param {number} max MaximÃ¡lnÃ­ poÄ�et objektÅ¯, kterÃ© mÃ¡ bazÃ©n vytvoÅ™it.\n   */\n  constructor (factory, genericPool, max) {\n    const pool = genericPool.createPool(\n      {\n        create () {\n          return factory.create();\n        },\n        destroy (object) {\n          return factory.delete(object);\n        }\n      },\n      {\n        // ZahÃ¡jenÃ­ plnÄ›nÃ­ v konstruktoru je neÅ¾Ã¡doucÃ­.\n        autostart: false,\n        // OmezenÃ­ poÄ�tu objektÅ¯ v bazÃ©nu.\n        // TODO ChybÃ­ podpora pro neomezenÃ½ pool.\n        // eslint-disable-next-line no-ternary\n        max: max === Infinity ? Number.MAX_SAFE_INTEGER : max,\n        // ÄŒekÃ¡nÃ­ na uvolnÄ›nÃ­ zdrojÅ¯ je neÅ¾Ã¡doucÃ­.\n        maxWaitingClients: 0\n      }\n    );\n    // TODO Hotfix problÃ©mu se zacyklenÃ­m pool pÅ™i selhÃ¡nÃ­ `factory.create`.\n    // - Dle autora je jiÅ¾ problÃ©m znÃ¡mÃ½ nÄ›kolik let a stÃ¡le nenÃ­ opravenÃ½.\n    // - Je pouÅ¾itÃ½ hotfix s pÅ™Ã­stupem k private metodÃ¡m.\n    // - https://github.com/coopernurse/node-pool/issues/175#issuecomment-501826583\n    pool.on('factoryCreateError', (error) => {\n      // eslint-disable-next-line no-underscore-dangle\n      pool._waitingClientsQueue.dequeue()\n      .reject(error);\n    });\n    this.pool = pool;\n  }\n\n  /**\n   * ObdrÅ¾Ã­ zpÄ›t poÅ¡kozenÃ½ zapÅ¯jÄ�enÃ½ objekt.\n   * TakovÃ½ objekt nenÃ­ dÃ¡le recyklovanÃ½ a nahradÃ­ se pÅ™i dalÅ¡Ã­ zÃ¡pÅ¯jÄ�ce za novÃ½.\n   * VolajÃ­cÃ­ by mÄ›l pouÅ¾Ã­vat tuto metodu, pokud jiÅ¾ objekt nelze obnovit do stavu pro dalÅ¡Ã­ pouÅ¾itÃ­.\n   * @param {PoolObject} object VrÃ¡cenÃ½ objekt.\n   * @returns {Promise.<undefined>}\n   */\n  delete (object) {\n    return new Promise((resolve) => {\n      const {pool} = this;\n      if (!pool.isBorrowedResource(object)) {\n        throw new Error(`Object ${object} is not lent.`);\n      }\n      return resolve(\n        pool.destroy(object)\n      );\n    });\n  }\n\n  /**\n   * UvolnÃ­ vÅ¡echny zdroje pro garbage collection.\n   * PoÄ�kÃ¡ na vrÃ¡cenÃ­ vÅ¡ech zdrojÅ¯ a uvolnÃ­ je.\n   * @returns {Promise.<undefined>}\n   */\n  destroy () {\n    return new Promise((resolve) => {\n      const {pool} = this;\n      return resolve(\n        pool.drain()\n        .then(() => pool.clear())\n      );\n    });\n  }\n\n  /**\n   * NaplnÃ­ bazÃ©n objektÅ¯, kterÃ© jsou pak ihned pÅ™ipravenÃ© k zapÅ¯jÄ�enÃ­.\n   *\n   * Funguje Å¡patnÄ›, ale pouÅ¾Ã­vÃ¡ se jen v testech.\n   * VyuÅ¾Ã­vÃ¡ privÃ¡tnÃ­ Ä�leny zaÄ�Ã­najÃ­cÃ­ podtrÅ¾Ã­tkem,\n   * u kterÃ½ch nenÃ­ zaruÄ�ena kompatibilita.\n   * PouÅ¾itÃ¡ knihovna neÃºmoÅ¾Åˆuje Ä�ekat na naplnÄ›nÃ­.\n   * @param {number} count PoÄ�et objektÅ¯.\n   * @returns {Promise.<undefined>}\n   */\n  fill (count) {\n    return new Promise((resolve) => {\n      const {pool} = this;\n      if (!Numeric.isIndex(count)) {\n        throw new TypeError(`Invalid count ${count}.`);\n      }\n      if (count > this.getMax() - this.getLength()) {\n        throw new Error('Maximum count of objects exceeded.');\n      }\n      // eslint-disable-next-line no-underscore-dangle\n      pool._config.min = pool._count + count;\n      // eslint-disable-next-line no-underscore-dangle\n      pool._ensureMinimum();\n      // TODO Hotfix Ä�ekÃ¡nÃ­ na naplnÄ›nÃ­ pool.\n      setTimeout(resolve, 0);\n    });\n  }\n\n  /**\n   * ZjistÃ­ poÄ�et volnÃ½ch objektÅ¯, pÅ™ipravenÃ½ch na zapÅ¯jÄ�enÃ­.\n   * @returns {number} PoÄ�et objektÅ¯.\n   */\n  getAvailable () {\n    return this.pool.available;\n  }\n\n  /**\n   * ZjistÃ­ aktuÃ¡lnÃ­ poÄ�et vytvoÅ™enÃ½ch objektÅ¯ v bazÃ©nu.\n   * @returns {number} PoÄ�et objektÅ¯.\n   */\n  getLength () {\n    return this.pool.size;\n  }\n\n  /**\n   * ZjistÃ­ poÄ�et zapÅ¯jÄ�enÃ½ch objektÅ¯.\n   * @returns {number} PoÄ�et objektÅ¯.\n   */\n  getLent () {\n    return this.pool.borrowed;\n  }\n\n  /**\n   * ZjistÃ­ maximÃ¡lnÃ­ poÄ�et vytvoÅ™enÃ½ch objektÅ¯ v bazÃ©nu.\n   * @returns {number} PoÄ�et objektÅ¯, nebo `Infinity` pokud nenÃ­ omezeno.\n   */\n  getMax () {\n    // TODO ChybÃ­ podpora pro neomezenÃ½ pool.\n    const {max} = this.pool;\n    if (max === Number.MAX_SAFE_INTEGER) {\n      return Infinity;\n    }\n    return max;\n  }\n\n  /**\n   * OvÄ›Å™Ã­, jestli objekt patÅ™Ã­ mezi zapÅ¯jÄ�enÃ©.\n   * @param {PoolObject} object\n   * @returns {boolean}\n   */\n  isLent (object) {\n    return this.pool.isBorrowedResource(object);\n  }\n\n  /**\n   * ZapÅ¯jÄ�Ã­ volnÃ½ objekt z bazÃ©nu.\n   * @returns {Promise.<PoolObject>} PÅ™idÄ›lenÃ½ objekt, pokud je nÄ›jakÃ½ volnÃ½.\n   */\n  lend () {\n    return new Promise((resolve) => resolve(\n      this.pool.acquire()\n    ));\n  }\n\n  /**\n   * ObdrÅ¾Ã­ zpÄ›t zapÅ¯jÄ�enÃ½ objekt.\n   * TakovÃ½ objekt je dÃ¡le recyklovanÃ½ pro novÃ© zapÅ¯jÄ�enÃ­.\n   * Po volÃ¡nÃ­ tÃ©to metody je zakÃ¡zÃ¡no k vrÃ¡cenÃ©mu objektu pÅ™istupovat, nebo ho dokonce mÄ›nit.\n   * VolajÃ­cÃ­ je takÃ© zodpovÄ›dnÃ½ za to, Å¾e objekt je v takovÃ©m stavu, v jakÃ©m byl pÅ™i zapÅ¯jÄ�enÃ­.\n   * @param {PoolObject} object VrÃ¡cenÃ½ objekt.\n   * @returns {undefined}\n   */\n  receive (object) {\n    const {pool} = this;\n    if (!pool.isBorrowedResource(object)) {\n      throw new Error(`Object ${object} is not lent.`);\n    }\n    pool.release(object);\n  }\n}\n\nexport default PoolAsync;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na bazÃ©ny recyklovanÃ½ch objektÅ¯.\n */\nclass PoolFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<Pool>} Pool\n   */\n  constructor (Pool) {\n    this.Pool = Pool;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ bazÃ©n.\n   * @param {PoolObjectFactory} factory TovÃ¡rna pro vytvÃ¡Å™enÃ­ novÃ½ch objektÅ¯ umÃ­sÅ¥enÃ½ch v bazÃ©nu.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {number} [opts.max=Infinity] MaximÃ¡lnÃ­ poÄ�et objektÅ¯, kterÃ© mÃ¡ bazÃ©n vytvoÅ™it.\n   * @returns {Pool}\n   */\n  create (factory, {max = Infinity} = {}) {\n    return new this.Pool(factory, max);\n  }\n}\n\nexport default PoolFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isFunction from 'lodash/isFunction';\nimport isObject from 'lodash/isObject';\n\nimport Numeric from '../numeric/numeric';\n\n// TODO PÅ™idat vyvolÃ¡vÃ¡nÃ­ udÃ¡lostÃ­ o dÄ›nÃ­ v pool?\n// - eventy: lent, returned, deleted, filled, drained.\n// - ÃšmoÅ¾nilo by Ä�ekat na uvolnÄ›nÃ­ objekty.\n// TODO RuÅ¡enÃ­ zdrojÅ¯. PÅ™idat resetovÃ¡nÃ­ objektÅ¯ do vÃ½chozÃ­ho stavu?\n// - DoporuÄ�eno dle wiki.\n// - V aktuÃ¡lnÃ­ implementaci se zdÃ¡ vÃ½hodnÄ›jÅ¡Ã­ resetovat objekt uÅ¾ivatelem, kterÃ½ vÃ­ co zmÄ›nil.\n// - Resetovat libovolnÃ½(!) element do vÃ½chozÃ­ho stavu by bylo velice tÄ›Å¾kÃ© implementovat.\n// - MoÅ¾nÃ© Å™eÅ¡enÃ­ problÃ©mu se `srcObject`.\n// TODO ZruÅ¡it implmentaci maxima?\n// - Mohlo by bÃ½t nahrazeno sledovÃ¡nÃ­m udÃ¡lostÃ­ a Å™Ã­zeno z vyÅ¡Å¡Ã­ ÃºrovnÄ›.\n/**\n * BazÃ©n recyklovanÃ½ch objektÅ¯.\n * Implementuje nÃ¡vrhovÃ½ vzor [Object pool](https://en.wikipedia.org/wiki/Object_pool_pattern).\n * ProvÃ¡dÃ­ recyklaci vrÃ¡cenÃ½ch objektÅ¯ pro dalÅ¡Ã­ pouÅ¾itÃ­.\n * PoÄ�et objektÅ¯ lze omezit maximem (nedovolÃ­ vytvÃ¡Å™enÃ­ dalÅ¡Ã­ch).\n *\n * Implementace je orientovÃ¡na na maximÃ¡lnÃ­ vÃ½kon, jednoduchost a robustnost.\n *\n * Lze vyuÅ¾Ã­t pro redukci garbage collection, omezenÃ­ nÃ¡roÄ�nÃ© inicializace nebo destrukce,\n * splnÄ›nÃ­ omezenÃ­ na pÅ™Ã­stup ke zdrojÅ¯m apod.\n *\n * InspirovÃ¡no existujÃ­cÃ­mi knihovnami:\n * [generic-pool](https://github.com/coopernurse/node-pool),\n * [deePool](https://github.com/getify/deePool).\n * @implements {Destroyable}\n */\nclass Pool {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {PoolObjectFactory} factory TovÃ¡rna pro vytvÃ¡Å™enÃ­ novÃ½ch objektÅ¯ umÃ­sÅ¥enÃ½ch v bazÃ©nu.\n   * @param {number} max MaximÃ¡lnÃ­ poÄ�et objektÅ¯, kterÃ© mÃ¡ bazÃ©n vytvoÅ™it.\n   */\n  constructor (factory, max) {\n    // Kontrola povinnÃ½ch parametrÅ¯.\n    if (!Pool.isFactory(factory)) {\n      throw new TypeError(`Invalid factory ${factory}.`);\n    }\n    // Kontrola nepovinnÃ½ch parametrÅ¯.\n    if (!Pool.isMax(max)) {\n      throw new TypeError(`Invalid maximum ${max}.`);\n    }\n    /**\n     * Seznam volnÃ½ch objektÅ¯.\n     * Pro lepÅ¡Ã­ vÃ½kon se pÅ™i operacÃ­ch provÃ¡dÃ­ mutace jednoho pole.\n     * @private\n     * @type {Array.<PoolObject>}\n     */\n    this.availableArray = [];\n    /**\n     * TovÃ¡rna pro vytvÃ¡Å™enÃ­ novÃ½ch objektÅ¯.\n     * @private\n     * @type {PoolObjectFactory}\n     */\n    this.factory = factory;\n    /**\n     * Seznam zapÅ¯jÄ�enÃ½ch objektÅ¯.\n     * Pro lepÅ¡Ã­ vÃ½kon se pÅ™i operacÃ­ch provÃ¡dÃ­ mutace jednoho pole.\n     * @private\n     * @type {Array.<PoolObject>}\n     */\n    this.lentArray = [];\n    /**\n     * MaximÃ¡lnÃ­ poÄ�et objektÅ¯ v bazÃ©nu.\n     * @private\n     * @type {number}\n     */\n    this.max = max;\n  }\n\n  /**\n   * ObdrÅ¾Ã­ zpÄ›t poÅ¡kozenÃ½ zapÅ¯jÄ�enÃ½ objekt.\n   * TakovÃ½ objekt nenÃ­ dÃ¡le recyklovanÃ½ a nahradÃ­ se pÅ™i dalÅ¡Ã­ zÃ¡pÅ¯jÄ�ce za novÃ½.\n   * VolajÃ­cÃ­ by mÄ›l pouÅ¾Ã­vat tuto metodu, pokud jiÅ¾ objekt nelze obnovit do stavu pro dalÅ¡Ã­ pouÅ¾itÃ­.\n   * @param {PoolObject} object VrÃ¡cenÃ½ objekt.\n   * @returns {undefined} Nic.\n   */\n  delete (object) {\n    // Objekt se odebere ze zapÅ¯jÄ�enÃ½ch.\n    this.removeLent(object);\n    // Objekt se smaÅ¾e.\n    this.factory.delete(object);\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    const lent = this.getLent();\n    if (lent !== 0) {\n      throw new Error(`There are some lent objects (${lent}).`);\n    }\n    const available = this.getAvailable();\n    this.drain(available);\n  }\n\n  /**\n   * VypustÃ­ bazÃ©n objektÅ¯ tÃ­m, Å¾e smaÅ¾e nepouÅ¾Ã­vanÃ© objekty.\n   * @param {number} count PoÄ�et objektÅ¯.\n   * @returns {undefined} Nic.\n   */\n  drain (count) {\n    if (!Numeric.isIndex(count)) {\n      throw new TypeError(`Invalid count ${count}.`);\n    }\n    if (count > this.getAvailable()) {\n      throw new Error('Not enought objects available.');\n    }\n    Array(count).fill()\n    .forEach(() => {\n      const object = this.availableArray.pop();\n      this.factory.delete(object);\n    });\n  }\n\n  /**\n   * NaplnÃ­ bazÃ©n objektÅ¯, kterÃ© jsou pak ihned pÅ™ipravenÃ© k zapÅ¯jÄ�enÃ­.\n   * @param {number} count PoÄ�et objektÅ¯.\n   * @returns {undefined} Nic.\n   */\n  fill (count) {\n    if (!Numeric.isIndex(count)) {\n      throw new TypeError(`Invalid count ${count}.`);\n    }\n    if (count > this.getMax() - this.getLength()) {\n      throw new Error('Maximum count of objects exceeded.');\n    }\n    Array(count).fill()\n    .forEach(() => {\n      const object = this.factory.create();\n      this.availableArray.push(object);\n    });\n  }\n\n  /**\n   * ZjistÃ­ poÄ�et volnÃ½ch objektÅ¯, pÅ™ipravenÃ½ch na zapÅ¯jÄ�enÃ­.\n   * @returns {number} PoÄ�et objektÅ¯.\n   */\n  getAvailable () {\n    return this.availableArray.length;\n  }\n\n  /**\n   * ZjistÃ­ aktuÃ¡lnÃ­ poÄ�et vytvoÅ™enÃ½ch objektÅ¯ v bazÃ©nu.\n   * @returns {number} PoÄ�et objektÅ¯.\n   */\n  getLength () {\n    return this.getAvailable() + this.getLent();\n  }\n\n  /**\n   * ZjistÃ­ poÄ�et zapÅ¯jÄ�enÃ½ch objektÅ¯.\n   * @returns {number} PoÄ�et objektÅ¯.\n   */\n  getLent () {\n    return this.lentArray.length;\n  }\n\n  /**\n   * ZjistÃ­ maximÃ¡lnÃ­ poÄ�et vytvoÅ™enÃ½ch objektÅ¯ v bazÃ©nu.\n   * @returns {number} PoÄ�et objektÅ¯, nebo `Infinity` pokud nenÃ­ omezeno.\n   */\n  getMax () {\n    return this.max;\n  }\n\n  /**\n   * OvÄ›Å™Ã­, jestli vstup splÅˆuje poÅ¾adavky na tovÃ¡rnu objektÅ¯.\n   * @param {*} value Vstup k ovÄ›Å™enÃ­.\n   * @private\n   * @returns {boolean} PÅ™Ã­znak, jestli jsou poÅ¾adavky splnÄ›ny.\n   */\n  static isFactory (value) {\n    return isObject(value) && isFunction(value.create);\n  }\n\n  /**\n   * OvÄ›Å™Ã­, jestli objekt patÅ™Ã­ mezi zapÅ¯jÄ�enÃ©.\n   * @param {PoolObject} object\n   * @returns {boolean}\n   */\n  isLent (object) {\n    return this.lentArray.includes(object);\n  }\n\n  /**\n   * OvÄ›Å™Ã­, jestli vstup splÅˆuje poÅ¾adavky na definici maxima objektÅ¯.\n   * @param {*} value Vstup k ovÄ›Å™enÃ­.\n   * @private\n   * @returns {boolean} PÅ™Ã­znak, jestli jsou poÅ¾adavky splnÄ›ny.\n   */\n  static isMax (value) {\n    return value === Infinity || Numeric.isIndex(value);\n  }\n\n  /**\n   * ZapÅ¯jÄ�Ã­ volnÃ½ objekt z bazÃ©nu.\n   * @returns {PoolObject} PÅ™idÄ›lenÃ½ objekt, pokud je nÄ›jakÃ½ volnÃ½.\n   */\n  lend () {\n    // Pokud je nÄ›jakÃ½ objekt volnÃ½, tak zabrat a vrÃ¡tit.\n    const {availableArray, lentArray} = this;\n    if (this.getAvailable() > 0) {\n      // Z logiky vÄ›ci by mÄ›lo bÃ½t jedno, jakÃ½ objekt se z pool vybere.\n      // VÅ¡echny objekty by mÄ›li bÃ½t stejnÃ©.\n      // Proto se z pole vybÃ­rÃ¡ poslednÃ­, kterÃ½ lze vyjmout nejrychleji.\n      const object = availableArray.pop();\n      lentArray.push(object);\n      return object;\n    }\n    // Pokud je mÃ­sto pro novÃ½ objekt, tak vytvoÅ™it a vrÃ¡tit.\n    if (this.getMax() > this.getLength()) {\n      const object = this.factory.create();\n      lentArray.push(object);\n      return object;\n    }\n    // Jinak vyhodit chybu.\n    throw new Error('Maximum count of objects exceeded.');\n  }\n\n  /**\n   * ObdrÅ¾Ã­ zpÄ›t zapÅ¯jÄ�enÃ½ objekt.\n   * TakovÃ½ objekt je dÃ¡le recyklovanÃ½ pro novÃ© zapÅ¯jÄ�enÃ­.\n   * Po volÃ¡nÃ­ tÃ©to metody je zakÃ¡zÃ¡no k vrÃ¡cenÃ©mu objektu pÅ™istupovat, nebo ho dokonce mÄ›nit.\n   * VolajÃ­cÃ­ je takÃ© zodpovÄ›dnÃ½ za to, Å¾e objekt je v takovÃ©m stavu, v jakÃ©m byl pÅ™i zapÅ¯jÄ�enÃ­.\n   * @param {PoolObject} object VrÃ¡cenÃ½ objekt.\n   * @returns {undefined} Nic.\n   */\n  receive (object) {\n    // Objekt se odebere ze zapÅ¯jÄ�enÃ½ch.\n    this.removeLent(object);\n    // Objekt se pÅ™idÃ¡ do volnÃ½ch.\n    this.availableArray.push(object);\n  }\n\n  /**\n   * Odebere objekt ze zapÅ¯jÄ�enÃ½ch.\n   * @param {PoolObject} object Objekt k odebrÃ¡nÃ­.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  removeLent (object) {\n    // VracenÃ½ objekt se vyhledÃ¡ mezi zapÅ¯jÄ�enÃ½mi.\n    const {lentArray} = this;\n    const lentIndex = lentArray.indexOf(object);\n    if (lentIndex === -1) {\n      throw new Error(`Object ${object} is not lent.`);\n    }\n    // Odebere se ze zapÅ¯jÄ�enÃ½ch.\n    lentArray.splice(lentIndex, 1);\n  }\n}\n\nexport default Pool;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na rÃ¡my pro zobrazovÃ¡nÃ­ mÃ©diÃ­,\n * kterÃ© provÃ¡dÃ­ skrÃ½vÃ¡nÃ­ pomocÃ­ pozicovÃ¡nÃ­ rÃ¡mÅ¯ mimo obrazovku.\n * @implements {ViewerFrameFactory}\n */\nclass PositionFrameFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<PositionFrame>} PositionFrame\n   * @param {CssValue} cssValue\n   * @param {StateMachineFactory} stateMachineFactory\n   */\n  constructor (PositionFrame, cssValue, stateMachineFactory) {\n    this.PositionFrame = PositionFrame;\n    this.cssValue = cssValue;\n    this.stateMachineFactory = stateMachineFactory;\n  }\n\n  /** @returns {PositionFrame} */\n  create () {\n    return new this.PositionFrame(this.cssValue, this.stateMachineFactory);\n  }\n}\n\nexport default PositionFrameFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\nimport noop from 'lodash/noop';\n\n/**\n * RÃ¡m pro zobrazovÃ¡nÃ­ mÃ©dia,\n * kterÃ½ provÃ¡dÃ­ skrÃ½vÃ¡nÃ­ pomocÃ­ pozicovÃ¡nÃ­ rÃ¡mu mimo obrazovku.\n * @implements {ViewerFrame}\n */\nclass PositionFrame {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {CssValue} cssValue\n   * @param {StateMachineFactory} stateMachineFactory\n   */\n  constructor (cssValue, stateMachineFactory) {\n    const el = document.createElement('div');\n    el.classList.add('position-frame');\n    this.cssValue = cssValue;\n    this.el = el;\n    this.scheduleInfo = null;\n    this.stateMachine = stateMachineFactory.create({\n      init: 'released',\n      transitions: [\n        {name: 'enter', from: 'seized', to: 'entered'},\n        {name: 'leave', from: 'entered', to: 'left'},\n        {name: 'release', from: ['left', 'seized'], to: 'released'},\n        {name: 'repair', from: ['entered', 'left', 'released', 'seized'], to: 'released'},\n        {name: 'seize', from: 'released', to: 'seized'}\n      ]\n    });\n  }\n\n  /** @returns {undefined} */\n  enter () {\n    return this.stateMachine.transit('enter', () => {\n      const {scheduleInfo} = this;\n      Object.assign(this.el.style, {\n        left: scheduleInfo.getLeft(),\n        top: scheduleInfo.getTop()\n      });\n    });\n  }\n\n  /** @returns {HTMLDivElement} */\n  getEl () {\n    return this.el;\n  }\n\n  /**\n   * Skryje obalujÃ­cÃ­ element tak, aby nebyl na obrazovce vidÄ›t.\n   * Toho se dosÃ¡hne tak, Å¾e se se element pÅ™esune mimo obsah elementu,\n   * vzhledem ke kterÃ©mu je pozicovÃ¡n.\n   * Element se pÅ™esune o nejmenÅ¡Ã­ nutnou vzdÃ¡lenost mimo obsah,\n   * na kterou je to nutnÃ©, touto vzdÃ¡lenostÃ­ jsou rozmÄ›ry elementu.\n   * PouÅ¾itÃ­ zÃ¡pornÃ½ch hodnot zajistÃ­, Å¾e se nezobrazÃ­ posuvnÃ­k.\n   * SpolÃ©hÃ¡ se na to, Å¾e element ke kterÃ©mu se pozicuje obsah oÅ™Ã­zne.\n   * @param {ScheduleInfo} scheduleInfo\n   * @private\n   * @returns {undefined}\n   */\n  hide (scheduleInfo) {\n    const width = scheduleInfo.getWidth();\n    const height = scheduleInfo.getHeight();\n    Object.assign(this.el.style, {\n      left: this.negateCssValue(width),\n      top: this.negateCssValue(height)\n    });\n  }\n\n  /** @returns {undefined} */\n  leave () {\n    return this.stateMachine.transit('leave', () => {\n      this.hide(this.scheduleInfo);\n    });\n  }\n\n  /**\n   * PÅ™evede CSS Ä�Ã­slo na zÃ¡pornou hodnotu.\n   * Podporuje jednoduchÃ© hodnoty jako: `0`, `3px`, `50%`.\n   * @param {string} string Å˜etÄ›zec s CSS hodnotou.\n   * @private\n   * @returns {string} Å˜etÄ›zec s CSS hodnotou se znamÃ©nkem mÃ­nus.\n   */\n  negateCssValue (string) {\n    // TODO #295 VyÄ�lenit do samostatnÃ©ho modulu `CssUtil#negateValue()`.\n    // - VyÅ¾aduje nasazenÃ­ IoC/DI pro tuto tÅ™Ã­du.\n    // TODO #295 NeumÃ­ dobÅ™e parsovat vÅ¡echny Ä�Ã­sela.\n    // - https://github.com/reworkcss/css-value/issues/6\n    const parsedArray = this.cssValue(string);\n    if (parsedArray.length !== 1) {\n      throw new Error(`Invalid CSS token count in \"${string}\".`);\n    }\n    const {type, unit, value} = parsedArray[0];\n    if (type !== 'number') {\n      throw new Error(`Invalid CSS token type in \"${string}\".`);\n    }\n    return `-${Math.abs(value)}${unit}`;\n  }\n\n  /** @returns {undefined} */\n  release () {\n    // ZatÃ­m se Å¾Ã¡dnÃ¡ operace neprovÃ¡dÃ­.\n    // Do budoucna moÅ¾no libovolnÄ› reagovat (pÅ™epozicovÃ¡nÃ­, zruÅ¡enÃ­ hodnot v instanci, ...).\n    // SkrytÃ½ element si zachovÃ¡vÃ¡ styly dle poslednÃ­ho zobrazenÃ©ho mÃ©dia.\n    // DÃ­ky tomu se nemusÃ­ nic pÅ™epoÄ�Ã­tÃ¡vat a uÅ¡etÅ™Ã­ se vÃ½kon.\n    // ZÃ¡roveÅˆ pokud bude mÃ­t nÃ¡sledujÃ­cÃ­ mÃ©dium stejnÃ© rozmÄ›ry, tak se nemusÃ­ mÄ›nit nic.\n    return this.stateMachine.transit('release', noop);\n  }\n\n  /** @returns {undefined} */\n  repair () {\n    return this.stateMachine.transit('repair', () => {\n      const {scheduleInfo} = this;\n      if (!isNil(scheduleInfo)) {\n        // Skryje se element, pokud jiÅ¾ nÄ›jakÃ½ byl pÅ™iÅ™azen.\n        this.hide(scheduleInfo);\n      }\n    });\n  }\n\n  /**\n   * @param {ScheduleInfo} scheduleInfo\n   * @returns {undefined}\n   */\n  seize (scheduleInfo) {\n    return this.stateMachine.transit('seize', () => {\n      this.scheduleInfo = scheduleInfo;\n      // ZajistÃ­ se skrytÃ­ elementu, kterÃ© je zÃ¡vislÃ© na rozmÄ›rech mÃ©dia.\n      // TODO #295 Zde mÅ¯Å¾e teoreticky na chvÃ­li dojÃ­t k zobrazenÃ­.\n      // - Za pÅ™edpokladu, Å¾e byl pÅ™edchozÃ­ slajd menÅ¡Ã­, tak bude zobrazen pÅ™ed zmÄ›nou rozmÄ›rÅ¯.\n      // - PravdÄ›podobnÄ› by se museli pouÅ¾Ã­t odliÅ¡nÃ© algoritmy dle rozmÄ›rÅ¯.\n      // - Pozor i na z zmÄ›nu z portrait do lanscape\n      //   (widthA > widthB && heightA < heightB).\n      // - Pozor na poÅ™adÃ­, ve kterÃ©m se pÅ™iÅ™azujÃ­ CSS hodnoty.\n      this.hide(scheduleInfo);\n      // NastavenÃ­ rozmÄ›rÅ¯ a pozadÃ­ elementu, co nejdÅ™Ã­ve to jde.\n      // DÃ­ky tomu se mÃ©dium preloaduje ve stavu v jakÃ©m bude zobrazeno.\n      // TÃ­m se minimaliuzujÃ­ nutnÃ© zmÄ›ny a tÃ­m i rychlost zobrazenÃ­.\n      Object.assign(this.el.style, {\n        backgroundColor: scheduleInfo.getBackgroundColor(),\n        height: scheduleInfo.getHeight(),\n        width: scheduleInfo.getWidth(),\n        zIndex: scheduleInfo.getZIndex()\n      });\n    });\n  }\n}\n\nexport default PositionFrame;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isFunction from 'lodash/isFunction';\nimport isNil from 'lodash/isNil';\nimport isNumber from 'lodash/isNumber';\nimport isObject from 'lodash/isObject';\nimport isString from 'lodash/isString';\n\n// TODO MoÅ¾nost pÅ™idÃ¡nÃ­ novÃ© public metody pro funkce bez kontextu.\n// - PohodlnÄ›jÅ¡Ã­ zadÃ¡vÃ¡nÃ­, podobnÃ© ostatnÃ­m pluginÅ¯m.\n// - ZachovÃ¡nÃ­ ovlÃ¡dÃ¡nÃ­ callbackÅ¯.\n// - Promisify#fn(fn: Function, opts: PromisifyOptions): Function\n// TODO MoÅ¾nost pÅ™idÃ¡nÃ­ novÃ© public metody pro automatickou promisifikaci celÃ©ho modulu.\n// - Obdoba #method s tÃ­m, Å¾e jsou automaticky pÅ™evedeny vÅ¡echny `key` v context.\n// - Co kdyÅ¾ by mÄ›li nÄ›kterÃ© metody\n// - Promisify#object(context: Object, opts: PromisifyOptions)\n// TODO Podpora pro Node.js callback styl.\n// - Jeden callback, kterÃ½ mÅ¯Å¾e provÃ©st resolve i reject.\n// - PromisifyOptions: #fulfillIndex, #fulfillTransform\n/**\n * Utilita pro pÅ™evod callbackÅ¯ na promise.\n *\n * Konverze na ES6 Promise nabÃ­zÃ­ dalÅ¡Ã­ moÅ¾nosti jak s volÃ¡nÃ­m pracovat (serializace, paralelizace apod.).\n *\n * Implementace je silnÄ› inspirovÃ¡na [pify](https://github.com/sindresorhus/pify).\n * Jen je stavÄ›nÃ¡ na mÃ­ru webOS JS knihovnÃ¡m, se specifickÃ½m callback stylem a chybovÃ½mi objekty.\n * TakÃ© podporuje zachovÃ¡nÃ­ kontextu pÅ™i volÃ¡nÃ­ metody, coÅ¾ nÄ›kterÃ© knihovny vyÅ¾adujÃ­.\n *\n * DalÅ¡Ã­ podobnÃ© pluginy:\n *\n * * [Node.js](https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original)\n * * [bluebird](http://bluebirdjs.com/docs/api/promise.promisify.html)\n * * [es6-promisify](https://www.npmjs.com/package/es6-promisify)\n */\nclass Promisify {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {PromisifyOptions} [opts={}] NastavenÃ­ promisifikace.\n   * @returns {Promisify} NovÃ¡ instance.\n   */\n  constructor (opts = {}) {\n    if (!isObject(opts)) {\n      throw new TypeError(`Invalid options \"${opts}\".`);\n    }\n    this.opts = opts;\n  }\n\n  /**\n   * ZjistÃ­ argumenty pro pÅ™edÃ¡nÃ­ promisifikovanÃ© metodÄ›.\n   * @param {Array.<*>} callArgArray Argumenty, kterÃ© byly pÅ™edÃ¡ny pÅ™i volÃ¡nÃ­ promisifikace.\n   * @param {Object} context Kontext funkce.\n   * @param {number|string} key KlÃ­Ä�, pod kterÃ½m je metoda dostupnÃ¡ v kontextu.\n   * @param {Function} resolve Callback pro vyÅ™eÅ¡enÃ­ promise.\n   * @param {Function} reject Callback pro zruÅ¡enÃ­ promise.\n   * @param {PromisifyOptions} [opts={}] NastavenÃ­ promisifikace.\n   * @private\n   * @returns {Array.<*>} Argumenty.\n   */\n  getArgs (callArgArray, context, key, resolve, reject, opts) {\n    const options = {...this.opts, ...opts};\n    const failureLabel = 'failure';\n    const failureIndex = this.getIndex(options.failureIndex, failureLabel);\n    const failureTransform = this.getTransform(options.failureTransform, failureLabel);\n    const successLabel = 'success';\n    const successIndex = this.getIndex(options.successIndex, successLabel);\n    const successTransform = this.getTransform(options.successTransform, successLabel);\n    const successFn = (...callbackArgArray) => resolve(successTransform({callArgArray, callbackArgArray, context, key}));\n    const failureFn = (...callbackArgArray) => reject(failureTransform({callArgArray, callbackArgArray, context, key}));\n    const callbackArray = [\n      {fn: successFn, index: successIndex},\n      {fn: failureFn, index: failureIndex}\n    ];\n    return this.mergeArgs(callArgArray, callbackArray);\n  }\n\n  /**\n   * ZjistÃ­ poÅ™adÃ­ callback funkce v argumentech.\n   * @param {number} [value] PoÅ™adÃ­ callback funkce z nastavenÃ­.\n   * @param {string} label Popisek pro chybovÃ© hlÃ¡Å¡enÃ­.\n   * @private\n   * @returns {number} PoÅ™adÃ­ callback funkce.\n   */\n  getIndex (value, label) {\n    if (isNil(value)) {\n      return null;\n    }\n    if (!Number.isInteger(value)) {\n      throw new TypeError(`Invalid ${label} index \"${value}\".`);\n    }\n    return value;\n  }\n\n  /**\n   * ZjistÃ­ transformaÄ�nÃ­ funkci pro callback funkce v argumentech.\n   * @param {Function} [fn] TransformaÄ�nÃ­ funkce z nastavenÃ­.\n   * @param {string} label Popisek pro chybovÃ© hlÃ¡Å¡enÃ­.\n   * @private\n   * @returns {Function} TransformaÄ�nÃ­ funkce .\n   */\n  getTransform (fn, label) {\n    if (isNil(fn)) {\n      // VÃ½chozÃ­ transformacÃ­ je vrÃ¡cenÃ­ prvnÃ­ho argumetu se kterÃ½m byl volÃ¡n.\n      // StejnÄ› se chovajÃ­ i ostatnÃ­ pluginy (vÃ½chozÃ­ hodnota multiArgs je false).\n      // StejnÃ¡ je i Promise implementace, kterÃ¡ ignoruje dalÅ¡Ã­ parametry pÅ™i resolve a reject.\n      return ({callbackArgArray}) => callbackArgArray[0];\n    }\n    if (!isFunction(fn)) {\n      throw new TypeError(`Invalid ${label} transformation \"${fn}\".`);\n    }\n    return fn;\n  }\n\n  /**\n   * SlouÄ�Ã­ argumenty s callbacky pro pÅ™edÃ¡nÃ­ promisifikovanÃ© metodÄ›.\n   * @param {Array.<*>} callArgArray Argumenty, kterÃ© byly pÅ™edÃ¡ny pÅ™i volÃ¡nÃ­ promisifikace.\n   * @param {Array.<PromisifyCallback>} callbackArray Seznam callbackÅ¯ pro vloÅ¾enÃ­ do argumentÅ¯.\n   * @private\n   * @returns {Array.<*>} Argumenty.\n   */\n  mergeArgs (callArgArray, callbackArray) {\n    // VklÃ¡dajÃ­ se pouze callbacky s vyplnÄ›nÃ½m indexem.\n    const definedCallbackArray = callbackArray.filter((callback) => !isNil(callback.index));\n    // UrÄ�Ã­ se nejvÄ›tÅ¡Ã­ absolutnÃ­ index.\n    const maxIndex = Math.max(...definedCallbackArray.map((callback) => {\n      const {index} = callback;\n      if (index < 0) {\n        return Math.abs(index) - 1;\n      }\n      return index;\n    }));\n    // Argumenty majÃ­ buÄ� dÃ©lku dle nejvÄ›tÅ¡Ã­ho indexu, nebo souÄ�et poÄ�tu indexÅ¯ a argumentÅ¯ z volÃ¡nÃ­.\n    const argLength = Math.max(maxIndex + 1, callArgArray.length + definedCallbackArray.length);\n    // VytvoÅ™Ã­ se pole argumentÅ¯ a vyplnÃ­ se undefined.\n    const argArray = Array(argLength).fill();\n    // VloÅ¾enÃ­ callbackÅ¯ na jejich indexy.\n    definedCallbackArray.forEach(({index, fn}) => {\n      let argIndex;\n      if (index < 0) {\n        argIndex = argLength + index;\n      } else {\n        argIndex = index;\n      }\n      if (isFunction(argArray[argIndex])) {\n        throw new Error(`Callback already exists at \"${argIndex}\".`);\n      }\n      argArray[argIndex] = fn;\n    });\n    // VyplnÄ›nÃ­ volnÃ½ch mÃ­st argumenty z volÃ¡nÃ­.\n    let callArgIndex = -1;\n    return argArray.map((arg) => {\n      if (isFunction(arg)) {\n        return arg;\n      }\n      callArgIndex += 1;\n      return callArgArray[callArgIndex];\n    });\n  }\n\n  /**\n   * Provede promisifikaci metody s callbacky.\n   * Metoda je uloÅ¾ena v objektu, kterÃ½ mÃ¡ bÃ½t nastaven jako jejÃ­ kontext.\n   *\n   * PÅ™i promisifikaci se vyhazujÃ­ pouze zjevnÃ© chyby v parametrech.\n   * VeÅ¡kerÃ© ostatnÃ­ operace se provÃ¡dÄ›ji aÅ¾ pÅ™i volÃ¡nÃ­ a vytvÃ¡Å™enÃ­ promise.\n   * Hodnoty se tak mezi volÃ¡nÃ­mi nemusÃ­ udrÅ¾ovat v pamÄ›ti.\n   * OstatnÃ­ chyby se odchytÃ¡vajÃ­ pohodlnÄ› pomocÃ­ `Promise#catch`, bez nutnosti obalovat do try-catch.\n   * @example\n   * const context = {delay: 1000, wait: (done) => setTimeout(done, this.delay)};\n   * const promisify = new Promisify({successIndex: 0});\n   * promisify(context, 'wait')\n   * .then(() => {\n   *   // Bude spuÅ¡tÄ›no po jednÃ© vteÅ™inÄ›.\n   * })\n   * @param {Object} context [Kontext funkce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this#Function_context).\n   * @param {number|string} key KlÃ­Ä�, pod kterÃ½m je metoda dostupnÃ¡ v kontextu.\n   * @param {PromisifyOptions} [opts={}] NastavenÃ­ promisifikace.\n   * @returns {Function} PromisifikovanÃ¡ funkce, kterÃ© lze pÅ™edÃ¡vat parametry.\n   * Funkce obaluje metodu v kontextu a pÅ™edÃ¡vÃ¡ jÃ­ argumenty.\n   * Funkce je asynchronnÃ­, vracÃ­ vÅ¾dy instance `Promise`.\n   */\n  method (context, key, opts = {}) {\n    if (!isObject(context)) {\n      throw new TypeError(`Invalid context \"${context}\".`);\n    }\n    if (!isString(key) && !isNumber(key)) {\n      throw new TypeError(`Invalid key \"${key}\".`);\n    }\n    if (!isObject(opts)) {\n      throw new TypeError(`Invalid options \"${opts}\".`);\n    }\n    return (...callArgArray) => new Promise((resolve, reject) => {\n      // Kontrola pÅ™Ã­tomnosti metody.\n      if (!isFunction(context[key])) {\n        throw new TypeError(`Invalid context function at \"${key}\".`);\n      }\n      // ZjiÅ¡tÄ›nÃ­ argumentÅ¯ pro pÅ™edÃ¡nÃ­ promisifikovanÃ© metodÄ›.\n      const argArray = this.getArgs(callArgArray, context, key, resolve, reject, opts);\n      // VolÃ¡nÃ­ metody v kontextu.\n      // RadÄ›ji se volÃ­ zkrÃ¡cenÃ½ zÃ¡pis mÃ­sto Function#call, kterÃ½ nemusÃ­ u nÄ›kterÃ½ch nativnÃ­ch metod fungovat.\n      context[key](...argArray);\n    });\n  }\n}\n\nexport default Promisify;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isObject from 'lodash/isObject';\n\n/**\n * TovÃ¡rna na fronty asynchronnÃ­ch akcÃ­.\n */\nclass QueueFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<Queue>} Queue Konstruktor fronty asynchronnÃ­ch akcÃ­.\n   * @returns {QueueFactory} NovÃ¡ instance.\n   */\n  constructor (Queue) {\n    if (!isObject(Queue)) {\n      throw new TypeError(`Invalid queue constructor ${Queue}.`);\n    }\n    this.Queue = Queue;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novou frontu asynchronnÃ­ch akcÃ­.\n   * @returns {Queue} VytvoÅ™enÃ¡ fronta.\n   */\n  create () {\n    return new this.Queue();\n  }\n}\n\nexport default QueueFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport noop from 'lodash/noop';\n\n/**\n * Fronta asynchronnÃ­ch akcÃ­.\n * Akce se Å™adÃ­ do fronty a postupnÄ› vyvolÃ¡vÃ¡jÃ­ po obslouÅ¾enÃ­ pÅ™edchozÃ­ch akcÃ­ (FIFO).\n */\nclass Queue {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @returns {Queue} NovÃ¡ instance.\n   */\n  constructor () {\n    /**\n     * SÅ™etÄ›zenÃ¡ promise, kterÃ¡ se sklÃ¡dÃ¡ z jednotlivÃ½ch akcÃ­.\n     * @private\n     * @type {Promise}\n     */\n    this.promise = Promise.resolve();\n  }\n\n  /**\n   * ZaÅ™adÃ­ novou akci do fronty.\n   * @param {Queue~onDequeue} cb Callback pÅ™i vyÅ™azenÃ­ akce.\n   * @returns {Promise.<*>} VÃ½sledek callbacku pÅ™i vyÅ™azenÃ­ akce.\n   */\n  enqueue (cb) {\n    return new Promise((resolve) => {\n      const promise = (\n        // PoÄ�kÃ¡ se na vÃ½sledek pÅ™edchozÃ­ch akcÃ­.\n        this.promise.catch(noop)\n        // Prevede se poÅ¾adovanÃ¡ akce.\n        .then(() => cb())\n      );\n      // Aktualizuje se sÅ™etÄ›zenÃ¡ promise o novou akci.\n      this.promise = promise;\n      // VracÃ­ se vÃ½sledek po provedenÃ­ poÅ¾adovanÃ© akce.\n      return resolve(promise);\n    });\n  }\n}\n\n/**\n * Callback, kterÃ½ se vyvolÃ¡vÃ¡ v okamÅ¾iku, kdy se akce vyÅ™azuje z fronty.\n * @callback Queue~onDequeue\n * @returns {Promise.<*>} Promise s libovolnÃ½m vÃ½sledkem.\n */\n\nexport default Queue;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isObject from 'lodash/isObject';\n\n/**\n * NahrazovaÄ� obecnÃ½ch datovÃ©ho zdroje.\n * StarÃ¡ se o kompletnÃ­ nahrazenÃ­ vybranÃ½ch datovÃ½ch zdrojÅ¯ dle novÃ©ho obsahu.\n */\nclass ReplacerCommon {\n  /**\n   * VytvoÅ™Ã­ nahrazovaÄ� datovÃ½ch zdrojÅ¯.\n   * @param {Store} primaryStore HlavnÃ­ datovÃ½ sklad ve kterÃ©m je uloÅ¾en pÅ™ehrÃ¡vanÃ½ obsah.\n   */\n  constructor (primaryStore) {\n    if (!isObject(primaryStore)) {\n      throw new TypeError(`Invalid store \"${primaryStore}\".`);\n    }\n    this.primaryStore = primaryStore;\n    // NÃ¡zvy datovÃ½ch zdrojÅ¯ ke kompletnÃ­ vÃ½mÄ›nÄ›.\n    this.resourceNameArray = ['layer', 'layout', 'medium', 'playlist', 'task', 'timer', 'track'];\n  }\n\n  // TODO #151 PÅ™epracovat na ContentInfo.\n  // - PÅ™istupovat jen k vyjmenovanÃ½m modelÅ¯m a ne ke vÅ¡em v contentStore.\n  /**\n   * NahradÃ­ stÃ¡vajÃ­cÃ­ obsah datovÃ½ch zdrojÅ¯ za novÃ½.\n   * @param {Store} contentStore DatovÃ½ sklad s novÃ½m obsahem.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po nahrazenÃ­ obsahu.\n   */\n  replace (contentStore) {\n    // TODO #95 Co kdyÅ¾ selÅ¾e?\n    // - PÅ™eruÅ¡it obnovovÃ¡nÃ­ v sÃ©rii po jednotlivÃ½ch datovÃ½ch skladech? Ano.\n    // - Co s tÄ›mi co uÅ¾ uspÄ›li? Pokusit se vrÃ¡tit zpÄ›t.\n    // - Co s nekonzistentnÃ­m stavem, kterÃ½ to vyvolÃ¡? PÅ™edejÃ­t mu. BuÄ� beze zmÄ›ny, nebo prÃ¡zdnÃ½ obsah.\n    // - Ale to je obecnÄ› problÃ©m v celÃ©m replace algoritmu. ProvÄ›Å™it vÅ¡ude.\n    // - Pokusit se smazat obsah, jako zotavenÃ­? A novÃ½ pokus? NovÃ½ pokus by mÄ›l asi Å™Ã­dit heartbeat. MÄ›lo by bÃ½t stejnÃ© pro vÅ¡echny kroky Replaceru.\n    // - DatovÃ½ sklad v pamÄ›ti musÃ­ bÃ½t vÅ¾dy konzistentnÃ­!\n    // - PouÅ¾Ã­vat inject aÅ¾ po vÅ¡ech dokonÄ�enÃ½ch findAll.\n    // - CelÃ© toto bude pravdÄ›podobnÄ› nutnÃ© Å™Ã­dit z vyÅ¡Å¡Ã­ ÃºrovnÄ› (napÅ™. i v session).\n    //   - PÅ™edÃ¡vat attrsArray, attrsMap?\n    //   - [{idArray: ['abc', ...], resourceName: 'medium'}, ...]\n    //   - Pokud se v budoucnu zmÄ›nÃ­ rozhodnutÃ­ co pÅ™edÃ¡vat, lze upravit tÅ™eba na {recordArray, resourceName}.\n    // TODO #95 No a to celÃ© bude nutno slouÄ�it se ReplacerSession, jeslikoÅ¾ jsou data propojenÃ¡.\n    // TODO #95 ObecnÄ› musÃ­ bÃ½t celÃ¡ operace nahrazenÃ­ obsahu atomickÃ¡ a dovolit jen 3 stavy:\n    //   - ÃšspÄ›ch => Obsah byl nahrazen.\n    //   - NeÃºspÄ›ch => Obsah zÅ¯stal pÅ¯vodnÃ­.\n    //   - KritickÃ½ neÃºspÄ›ch => PrÃ¡zdnÃ½ obsah, ale ne namixovanÃ½, nebo nezotavitelnÃ½.\n    // TODO #95 Algoritmus s jednÃ­m datovÃ½m zdrojem:\n    // - PrvnÃ­ async krok by mÄ›l nastavit prÃ¡zdnÃ½ obsah (session), aby se pÅ™i neÃºspÄ›chu nezobrazil nÄ›jakÃ½ mix.\n    // - SÃ©riovÄ›(!) pro kaÅ¾dÃ½ datovÃ½ zdroj (session poslednÃ­):\n    //   - Vyfiltrovat obsah z contentStore.\n    //   - ProvÃ©st replaceAsync na primaryStore bez ovlivnÄ›nÃ­ aktuÃ¡lnÃ­ pamÄ›ti (obsah co se pÅ™ehrÃ¡vÃ¡).\n    //   - http://www.js-data.io/v2.9/docs/dsdefaults#section-cacheresponse\n    // - SÃ©riovÄ›(!) pro kaÅ¾dÃ½ datovÃ½ zdroj (session poslednÃ­):\n    //   - ProvÃ©st replace (sync) na primaryStore pro vÅ¡echny nynÃ­ komplentÄ› naÄ�tenÃ©.\n    // - Pokud nÄ›co selÅ¾e (jen u async?):\n    //   - Pokusit se vrÃ¡tit pÅ¯vodnÃ­ obsah u vÅ¡ech zmÄ›nÄ›nÃ½ch datovÃ½ch zdrojÅ¯. SÃ©riovÄ›. Session poslednÃ­. Pak throw.\n    //   - Pokud i to selÅ¾e, tak smazat vÅ¡echna data? Co session?\n    //     - Ta uÅ¾ by teoreticky mÄ›la bÃ½t smazanÃ¡ z prvnÃ­ho kroku.\n    //     - MoÅ¾nÃ¡ urÄ�it co smazat ze session podle toho, co by pÅ™epsal content.\n    //     - Anebo tyto informace vyÄ�lenit do novÃ©ho datovÃ©ho zdroje a ten bez Å™eÅ¡enÃ­ podrobnostÃ­ replacovat?\n    // TODO #95 Algoritmus se dvÄ›ma datovÃ½mi zdroji:\n    // - Jeden datovÃ½ zdroj s pÅ™ehrÃ¡vanÃ½m obsahem a druhÃ½ s novÃ½m. StÅ™Ã­dajÃ­ se.\n    // - TÃ­m, Å¾e se datovÃ© zdroje vymÄ›nÃ­, tak nenÃ­ tÅ™eba Å™eÅ¡it nekonzistenci nÃ¡hradou v rÃ¡mci jednoho.\n    // - PÅ™i kaÅ¾dÃ© zmÄ›nÄ› obsahu se pÅ™edÃ¡vÃ¡ i odkaz na kompletnÄ› novÃ½ datovÃ½ sklad.\n    // - StarÃ½ se pak na pozadÃ­ vyÄ�istÃ­ a pÅ™ipravÃ­ pro novÃ½ obsah.\n    // - Co s hodnotami v sessions, kterÃ© nejsou souÄ�Ã¡stÃ­ obsahu?\n    return new Promise((resolve) => resolve(\n      // SÃ©riovÃ© volÃ¡nÃ­ nahrazenÃ­ pro vÅ¡echny datovÃ© zdroje.\n      this.resourceNameArray.reduce(\n        (acc, resourceName) => acc.then(() => {\n          // ZÃ­skÃ¡nÃ­ datovÃ½ch plain objektÅ¯ z datovÃ©ho skladu s novÃ½m obsahem.\n          const attrsArray = (\n            contentStore.filter(resourceName)\n            .map((model) => JSON.parse(JSON.stringify(model)))\n          );\n          // NahrazenÃ­ obsahu v hlavnÃ­m datovÃ©m skladu.\n          // TODO #95 ZvÃ¡Å¾it pÅ™esun implementace replaceAsync ze store sem.\n          return this.primaryStore.replaceAsync(resourceName, attrsArray, null, {onConflict: 'replace'});\n        }),\n        Promise.resolve()\n      )\n    ));\n  }\n\n  /**\n   * ObnovÃ­ obsah datovÃ½ch zdrojÅ¯ v datovÃ©m skladÄ›.\n   * @returns {Promise.<Array.<StoreReferences>>} Reference na obnovenÃ½ obsah.\n   */\n  start () {\n    return new Promise((resolve) => resolve(\n      // SÃ©riovÃ© volÃ¡nÃ­ obnovenÃ­ pro vÅ¡echny datovÃ© zdroje.\n      this.resourceNameArray.reduce(\n        (acc, resourceName) => acc.then((resultArray) => (\n          this.primaryStore.findAll(resourceName)\n          .then((modelArray) => {\n            resultArray.push({\n              idArray: modelArray.map((model) => model.id),\n              resourceName\n            });\n            return resultArray;\n          })\n        )),\n        Promise.resolve([])\n      )\n    ));\n  }\n}\n\nexport default ReplacerCommon;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport ErrorName from '../../error/error-name';\n\n/**\n * NahrazovaÄ� nastavenÃ­ ovlÃ¡dÃ¡nÃ­ zaÅ™Ã­zenÃ­.\n * StarÃ¡ se o omezenÃ­ ovlÃ¡dÃ¡nÃ­ zaÅ™Ã­zenÃ­ dle obsahu datovÃ©ho skladu.\n */\nclass ReplacerControl {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {ControlManager} controlManager\n   * @param {Logger} logger\n   */\n  constructor (controlManager, logger) {\n    this.controlManager = controlManager;\n    this.logger = logger;\n  }\n\n  /**\n   * ProvedenÃ­ specifickÃ½ch reakcÃ­ na chyby pÅ™i zmÄ›nÄ› omezenÃ­ ovlÃ¡dÃ¡nÃ­.\n   * Chyby souvisejÃ­cÃ­ s podporou zaÅ™Ã­zenÃ­ nejsou dÅ¯leÅ¾itÃ©\n   * a zalogujÃ­ se s nÃ­zkou prioritou.\n   * V tÄ›chto pÅ™Ã­padech se sprÃ¡vce chovÃ¡, jako by vÅ¡e probÄ›hlo bez problÃ©mÅ¯.\n   * OstatnÃ­ chyby oÅ¡etÅ™uje ten, kdo metodu vyvolal.\n   * @param {Error} error\n   * @private\n   * @returns {undefined}\n   */\n  handleError (error) {\n    // IgnorovÃ¡nÃ­ chyb zpÅ¯sobenÃ½ch nepodporovÃ¡nÃ­m omezenÃ­ ovlÃ¡dÃ¡nÃ­.\n    if (error.name === ErrorName.NotSupportedError) {\n      return this.logger.warn(error);\n    }\n    throw error;\n  }\n\n  /**\n   * NahradÃ­ stÃ¡vajÃ­cÃ­ nastavenÃ­ ovlÃ¡dÃ¡nÃ­ dle obsahu zaÅ™Ã­zenÃ­.\n   * @param {ContentInfo} contentInfo Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po dokonÄ�enÃ­ zmÄ›ny.\n   */\n  replace (contentInfo) {\n    return new Promise((resolve) => resolve(\n      this.replaceLocalLock(contentInfo)\n      .then(() => this.replaceRemoteLock(contentInfo))\n    ));\n  }\n\n  /**\n   * NahradÃ­ zÃ¡mek ovlÃ¡dÃ¡nÃ­ pro tlaÄ�Ã­tka umÃ­stÄ›nÃ© pÅ™Ã­mo na zaÅ™Ã­zenÃ­.\n   * @param {ContentInfo} contentInfo\n   * @private\n   * @returns {Promise.<undefined>}\n   */\n  replaceLocalLock (contentInfo) {\n    return new Promise((resolve) => {\n      const lock = contentInfo.session.localControlLock;\n      if (isNil(lock)) {\n        return resolve();\n      }\n      return resolve(\n        this.controlManager.setLocalLock(lock)\n        .catch((error) => this.handleError(error))\n      );\n    });\n  }\n\n  /**\n   * NahradÃ­ zÃ¡mek ovlÃ¡dÃ¡nÃ­ pro tlaÄ�Ã­tka na dÃ¡lkovÃ©m ovlÃ¡dÃ¡nÃ­.\n   * @param {ContentInfo} contentInfo\n   * @private\n   * @returns {Promise.<undefined>}\n   */\n  replaceRemoteLock (contentInfo) {\n    return new Promise((resolve) => {\n      const lock = contentInfo.session.remoteControlLock;\n      if (isNil(lock)) {\n        return resolve();\n      }\n      return resolve(\n        this.controlManager.setRemoteLock(lock)\n        .catch((error) => this.handleError(error))\n      );\n    });\n  }\n}\n\nexport default ReplacerControl;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * NahrazovaÄ� Ãºloh a Ä�asovaÄ�Å¯ pro vypnutÃ­ a zapnutÃ­ zaÅ™Ã­zenÃ­.\n * StarÃ¡ se o aktualizaci Ä�asovaÄ�Å¯ zaÅ™Ã­zenÃ­ dle obsahu datovÃ©ho skladu.\n */\nclass ReplacerPower {\n  /**\n   * VytvoÅ™Ã­ nahrazovaÄ� Ä�asovaÄ�Å¯.\n   * @param {PowerManager} powerManager\n   */\n  constructor (powerManager) {\n    this.powerManager = powerManager;\n  }\n\n  /**\n   * ZmÄ›nÃ­ Ä�asovaÄ�e zaÅ™Ã­zenÃ­ dle datovÃ©ho skladu.\n   * @param {ContentInfo} contentInfo\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po dokonÄ�enÃ­ pÅ™eplÃ¡novÃ¡nÃ­.\n   */\n  replace (contentInfo) {\n    return new Promise((resolve) => resolve(\n      // OdstranÃ­ se vÅ¡echny nastavenÃ© Ä�asovaÄ�e.\n      this.powerManager.deleteAllTimers()\n      // NastavÃ­ se novÃ© Ä�asovaÄ�e.\n      .then(() => this.powerManager.createTimers(\n        contentInfo.taskArray,\n        contentInfo.timerArray\n      ))\n    ));\n  }\n}\n\nexport default ReplacerPower;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\n\nimport ReplacerCommon from './common/replacer-common';\nimport ReplacerSession from './session/replacer-session';\n\n/**\n * NahrazovaÄ� obsahu.\n * @implements {EventBus}\n */\nclass Replacer {\n  /**\n   * VytvoÅ™Ã­ nahrazovaÄ� obsahu.\n   * @param {AutorebootReplacer} autorebootReplacer\n   * @param {Downloader} downloader\n   * @param {Logger} logger\n   * @param {Store} primaryStore HlavnÃ­ datovÃ½ sklad ve kterÃ©m je uloÅ¾en pÅ™ehrÃ¡vanÃ½ obsah.\n   * @param {QueueFactory} queueFactory TovÃ¡rna na fronty asynchronnÃ­ch akcÃ­.\n   * @param {ReplacerControl} replacerControl\n   * @param {ReplacerPower} replacerPower\n   * @param {ReplacerSound} replacerSound\n   * @param {ReplacerScreen} replacerScreen\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   */\n  constructor (\n    autorebootReplacer, downloader, logger, primaryStore, queueFactory,\n    replacerControl, replacerPower, replacerSound, replacerScreen, session\n  ) {\n    this.autorebootReplacer = autorebootReplacer;\n    this.downloader = downloader;\n    this.logger = logger;\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    this.primaryStore = primaryStore;\n    /**\n     * Fronta asynchronnÃ­ch zmÄ›n obsahu.\n     * @private\n     * @type {Queue}\n     */\n    this.queue = queueFactory.create();\n    this.replacerScreen = replacerScreen;\n    this.session = session;\n    this.replacerCommon = new ReplacerCommon(primaryStore);\n    this.replacerControl = replacerControl;\n    this.replacerPower = replacerPower;\n    this.replacerSession = new ReplacerSession(primaryStore, session.id);\n    this.replacerSound = replacerSound;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onContent = this.onContent.bind(this);\n    this.onError = this.onError.bind(this);\n    // NaslouchÃ¡nÃ­ udÃ¡lostem.\n    downloader.on('content', this.onContent);\n    downloader.on('error', this.onError);\n  }\n\n  /**\n   * Aplikuje obsah na zaÅ™Ã­zenÃ­.\n   * V tÃ©to akci se synchronizuje nastavenÃ­ zaÅ™Ã­zenÃ­ s obsahem.\n   * Jde o Ä�istÄ› stavovÃ© operace, nenÃ­ zde Å¾Ã¡dnÃ½ vÃ½sledek,\n   * pouze se nastavÃ­ to, co je poÅ¾adovÃ¡no v obsahu.\n   * @param {ContentInfo} contentInfo\n   * @private\n   * @returns {undefined}\n   */\n  applyContent (contentInfo) {\n    return new Promise((resolve) => resolve(\n      // Seznam akcÃ­, kterÃ© se majÃ­ provÃ©st.\n      [\n        () => this.autorebootReplacer.replace(contentInfo),\n        () => this.replacerControl.replace(contentInfo),\n        () => this.replacerSound.replace(contentInfo),\n        () => this.replacerPower.replace(contentInfo),\n        () => this.replacerScreen.replace(contentInfo)\n      ]\n      // SÃ©riovÃ© volÃ¡nÃ­ vÅ¡ech akcÃ­.\n      .reduce(\n        (acc, callback) => acc.then(() => (\n          callback()\n          // SelhÃ¡nÃ­ jednÃ© akce, nepÅ™eruÅ¡Ã­ spuÅ¡tÄ›nÃ­ ostatnÃ­ch.\n          .catch((error) => this.logger.error(error))\n        )),\n        Promise.resolve()\n      )\n    ));\n  }\n\n  /**\n   * UvolnÃ­ vÅ¡echny zdroje pro garbage collection.\n   * @returns {undefined} Nic.\n   */\n  destroy () {\n    // ZruÅ¡enÃ­ stahovaÄ�e souborÅ¯.\n    this.downloader.off('content', this.onContent);\n    this.downloader.off('error', this.onError);\n    this.downloader.destroy();\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na poÅ¾adavek na pÅ™epnutÃ­ obsahu ze stahovaÄ�e.\n   * @param {ContentInfo} contentInfo Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onContent (contentInfo) {\n    this.emitter.emit('content', contentInfo);\n  }\n\n  /**\n   * Reakce na chybu.\n   * @param {Error} error ChybovÃ½ objekt.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onError (error) {\n    this.logger.error(error);\n  }\n\n  /**\n   * NahradÃ­ stÃ¡vajÃ­cÃ­ obsah za novÃ½.\n   * @param {ContentInfo} contentInfo Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n   * @returns {Promise.<ContentInfo>} NahrazenÃ½ obsah.\n   */\n  replace (contentInfo) {\n    // TODO #84 Propracovat lÃ©pe nahrazenÃ­ obsahu s pÅ™eruÅ¡enÃ­m stahovÃ¡nÃ­.\n    // - VyuÅ¾Ã­vat pÅ™ipravenÃ© metody Downloader.cancel()\n    // - ProblematickÃ½ pÅ™Ã­pad:\n    //   - Stahuje se velikÃ½ soubor, kterÃ½ nelze rychle pÅ™eruÅ¡it.\n    //   - PÅ™ijde novÃ½ obsah, kterÃ½ vyÅ¾Ã¡dÃ¡ pÅ™eruÅ¡enÃ­ a Ä�ekÃ¡ neÅ¾ je dokonÄ�eno.\n    //   - PÅ™ijde dalÅ¡Ã­ novÃ½ obsah, kterÃ½ by mÄ›l zruÅ¡it Ä�ekajÃ­cÃ­ a zaÅ™adit se v Ä�ekÃ¡nÃ­ na jeho mÃ­sto.\n    //   - Atd. dokud nenÃ­ pÅ™eruÅ¡enÃ­ stahovÃ¡nÃ­ dokonÄ�eno. Pak se spustÃ­ stahovÃ¡nÃ­ Ä�ekajÃ­cÃ­ho obsahu.\n    // - AnalogickÃ½ problematickÃ½ pÅ™Ã­pad nastavÃ¡ u nÃ¡hrady datovÃ©ho skladu, kterÃ½ nejde pÅ™eruÅ¡it.\n    //   - Zde je Å¡ance na vyvolÃ¡nÃ­ mnohem niÅ¾Å¡Ã­ (je rychle provedenÃ½), ale stÃ¡le teoreticky moÅ¾nÃ¡.\n    // - Implementace:\n    //   - PÅ™Ã­znak replacing, podle kterÃ©ho se rozhodne, jestli pÅ™i spuÅ¡tÄ›nÃ­ ruÅ¡it download.\n    //   - ÄŒekajÃ­cÃ­ obsah s moÅ¾nostÃ­ jeho okamÅ¾itÃ©ho ukonÄ�enÃ­.\n    // - Unit testy.\n    return new Promise((resolve) => resolve(\n      this.queue.enqueue(() => (\n        this.replaceContent(contentInfo)\n        .then((replacedContentInfo) => (\n          this.applyContent(replacedContentInfo)\n          .then(() => replacedContentInfo)\n        ))\n      ))\n    ));\n  }\n\n  /**\n   * NahradÃ­ stÃ¡vajÃ­cÃ­ obsah za novÃ½.\n   * Obsahuje akce stahujÃ­cÃ­ obsah a nahrazenÃ­ datovÃ©ho skladu.\n   * @param {ContentInfo} contentInfo\n   * @returns {ContentInfo}\n   */\n  replaceContent (contentInfo) {\n    return new Promise((resolve) => resolve(\n      // StaÅ¾enÃ­ binÃ¡rnÃ­ch souborÅ¯.\n      this.downloader.download(contentInfo)\n      // Aktualizace datovÃ½ch zdrojÅ¯.\n      .then(() => this.replacerSession.replace(contentInfo.store))\n      .then(() => this.replacerCommon.replace(contentInfo.store))\n      .then(() => {\n        // TODO #151 Hotfix vytvoÅ™enÃ­ obsahu pomocÃ­ `Store#filter`.\n        // - Tyto informace by mÄ›li vracet: ReplacerCommon, ReplacerSession.\n        // - NÃ¡slednÄ› pÅ™idat unit testy ovÄ›Å™ujÃ­cÃ­ sloÅ¾enÃ­ informacÃ­ ze stubÅ¯.\n        // - SlouÄ�it ReplacerCommon a ReplacerSession do ReplacerStore,\n        //   kterÃ½ bude vracet contentInfo.\n        const {primaryStore} = this;\n        return {\n          ...contentInfo,\n          layerArray: primaryStore.filter('layer'),\n          layoutArray: primaryStore.filter('layout'),\n          mediumArray: primaryStore.filter('medium'),\n          playlistArray: primaryStore.filter('playlist'),\n          session: this.session,\n          store: primaryStore,\n          taskArray: primaryStore.filter('task'),\n          timerArray: primaryStore.filter('timer'),\n          trackArray: primaryStore.filter('track')\n        };\n      })\n    ));\n  }\n\n  /**\n   * ObnovÃ­ obsah z perzistentÃ­ho ÃºloÅ¾iÅ¡tÄ› a pÅ™Ã­padnÄ› ho proÄ�istÃ­.\n   * @returns {ContentInfo}\n   */\n  restoreContent () {\n    return new Promise((resolve) => resolve(\n      // ObnovenÃ­ staÅ¾enÃ½ch binÃ¡rnÃ­ch souborÅ¯.\n      this.downloader.start()\n      // ObnovÃ­ datovÃ© zdroje.\n      .then(() => this.replacerSession.start())\n      .then(() => this.replacerCommon.start())\n      .then(() => {\n        // TODO #151 Hotfix vytvoÅ™enÃ­ obsahu pomocÃ­ `Store#filter`.\n        // - Tyto informace by mÄ›li vracet: ReplacerCommon, ReplacerSession.\n        // - NÃ¡slednÄ› pÅ™idat unit testy ovÄ›Å™ujÃ­cÃ­ sloÅ¾enÃ­ informacÃ­ ze stubÅ¯.\n        // - SlouÄ�it ReplacerCommon a ReplacerSession do ReplacerStore,\n        //   kterÃ½ bude vracet contentInfo.\n        const {primaryStore} = this;\n        return {\n          firmwareRelease: null,\n          layerArray: primaryStore.filter('layer'),\n          layoutArray: primaryStore.filter('layout'),\n          mediumArray: primaryStore.filter('medium'),\n          playlistArray: primaryStore.filter('playlist'),\n          session: this.session,\n          store: primaryStore,\n          taskArray: primaryStore.filter('task'),\n          timerArray: primaryStore.filter('timer'),\n          trackArray: primaryStore.filter('track')\n        };\n      })\n    ));\n  }\n\n  /**\n   * ObnovÃ­ stÃ¡vajÃ­cÃ­ obsah.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po obnovenÃ­ obsahu.\n   */\n  start () {\n    return new Promise((resolve) => resolve(\n      this.restoreContent()\n      .then((contentInfo) => (\n        this.applyContent(contentInfo)\n      ))\n    ));\n  }\n}\n\n/**\n * NahrazenÃ½ obsah zaÅ™Ã­zenÃ­ k nastavenÃ­.\n * V rÃ¡mci jednoho nahrazenÃ­ mÅ¯Å¾e bÃ½t vyvolÃ¡no vÃ­ce udÃ¡lostÃ­.\n * @event Replacer#content\n * @param {ContentInfo} contentInfo Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n */\n\nexport default Replacer;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\n/**\n * NahrazovaÄ� nastavenÃ­ obrazovky zaÅ™Ã­zenÃ­.\n * StarÃ¡ se o aktualizaci orientace zaÅ™Ã­zenÃ­ dle obsahu datovÃ©ho skladu.\n */\nclass ReplacerScreen {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {OrientationEnum} defaultOrientationEnum\n   * @param {ScreenManager} screenManager\n   */\n  constructor (defaultOrientationEnum, screenManager) {\n    this.defaultOrientationEnum = defaultOrientationEnum;\n    this.screenManager = screenManager;\n  }\n\n  /**\n   * ZjistÃ­ orientaci i pro pÅ™Ã­pady, Å¾e v obsahu nenÃ­ definovanÃ¡.\n   * @param {OrientationEnum} [orientationEnum] Orientace z obsahu.\n   * @private\n   * @returns {OrientationEnum} VÅ¾dy definovanÃ¡ orientace.\n   */\n  getOrientation (orientationEnum) {\n    if (isNil(orientationEnum)) {\n      // Pokud nenÃ­ Å¾Ã¡dnÃ¡ preferovanÃ¡ orientace dostupnÃ¡ (napÅ™. u novÃ©ho zaÅ™Ã­zenÃ­),\n      // tak se pouÅ¾ije vÃ½chozÃ­ hodnota.\n      return this.defaultOrientationEnum;\n    }\n    return orientationEnum;\n  }\n\n  /**\n   * ZmÄ›nÃ­ nastavenÃ­ obrazovky dle obsahu.\n   * @param {ContentInfo} contentInfo\n   * @returns {Promise.<undefined>}\n   */\n  replace (contentInfo) {\n    return new Promise((resolve) => resolve(\n      this.screenManager.setOrientation(\n        this.getOrientation(contentInfo.session.orientationEnum)\n      )\n    ));\n  }\n}\n\nexport default ReplacerScreen;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNumber from 'lodash/isNumber';\nimport isObject from 'lodash/isObject';\nimport isString from 'lodash/isString';\n\n// TODO #151 MoÅ¾nÃ¡ rovnou i refaktorizovat sessionId -> session.\n/**\n * NahrazovaÄ� datovÃ©ho zdroje session.\n * StarÃ¡ se o aktualizaci datovÃ©ho zdroje s nastavenÃ­m zaÅ™Ã­zenÃ­ dle novÃ©ho obsahu.\n */\nclass ReplacerSession {\n  /**\n   * VytvoÅ™Ã­ nahrazovaÄ� session.\n   * @param {Store} primaryStore HlavnÃ­ datovÃ½ sklad ve kterÃ©m je uloÅ¾en pÅ™ehrÃ¡vanÃ½ obsah.\n   * @param {DsId} sessionId IdentifikÃ¡tor datovÃ©ho modelu s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   */\n  constructor (primaryStore, sessionId) {\n    if (!isObject(primaryStore)) {\n      throw new TypeError(`Invalid store \"${primaryStore}\".`);\n    }\n    if (!isString(sessionId) && !isNumber(sessionId)) {\n      throw new TypeError(`Invalid session id \"${sessionId}\".`);\n    }\n    this.primaryStore = primaryStore;\n    this.sessionId = sessionId;\n  }\n\n  // TODO #151 PÅ™epracovat na ContentInfo.\n  // - MoÅ¾nÃ¡ bude staÄ�it jen session.\n  /**\n   * VymÄ›nÃ­ stÃ¡vajÃ­cÃ­ obsah datovÃ©ho zdroje s nastavenÃ­m zaÅ™Ã­zenÃ­ za novÃ½.\n   * @param {Store} contentStore DatovÃ½ sklad s novÃ½m obsahem.\n   * @returns {Promise.<DsId|null>} IdentifikÃ¡tor upravenÃ© session.\n   */\n  replace (contentStore) {\n    return new Promise((resolve) => {\n      const {sessionId} = this;\n      const session = contentStore.get('session', sessionId);\n      if (!session) {\n        return resolve(null);\n      }\n      const attrs = JSON.parse(JSON.stringify(session));\n      return resolve(\n        this.primaryStore.update('session', sessionId, attrs)\n        .then(() => sessionId)\n      );\n    });\n  }\n\n  /**\n   * ObnovÃ­ obsah datovÃ©ho zdroje s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @returns {Promise.<DsId>} IdentifikÃ¡tor obnovenÃ© session.\n   */\n  start () {\n    const {sessionId, primaryStore} = this;\n    return (\n      // ObnovenÃ­ pÅ™edchozÃ­ session.\n      primaryStore.find('session', sessionId)\n      // VytvoÅ™enÃ­ novÃ© session, pokud se nepodaÅ™ilo obnovit.\n      .catch(() => primaryStore.create('session', {id: sessionId}))\n      .then((session) => session.id)\n    );\n  }\n}\n\nexport default ReplacerSession;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\n/**\n * NahrazovaÄ� hlasitosti zaÅ™Ã­zenÃ­.\n * StarÃ¡ se o aktualizaci master hlasitosti zaÅ™Ã­zenÃ­ dle obsahu datovÃ©ho skladu.\n */\nclass ReplacerSound {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {SoundManager} soundManager\n   */\n  constructor (soundManager) {\n    this.soundManager = soundManager;\n  }\n\n  /**\n   * ZmÄ›nÃ­ hlasitost zaÅ™Ã­zenÃ­ dle datovÃ©ho skladu.\n   * @param {ContentInfo} contentInfo\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po dokonÄ�enÃ­ zmÄ›ny.\n   */\n  replace (contentInfo) {\n    return new Promise((resolve) => {\n      // ZjiÅ¡tÄ›nÃ­ hodnoty hlasitosti.\n      const {volume} = contentInfo.session;\n      // Pokud hlasitost chybÃ­, tak se zachovÃ¡ aktuÃ¡lnÄ› nastavenÃ¡.\n      if (isNil(volume)) {\n        return resolve();\n      }\n      // ZmÄ›na hlasitosti, pokud nÄ›jakÃ¡ je.\n      return resolve(this.soundManager.setVolume(volume));\n    });\n  }\n}\n\nexport default ReplacerSound;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport ErrorName from '../error/error-name';\nimport NetworkType from '../network/network-type';\n\n// TODO RozÅ¡Ã­Å™it i o infomace pÅ™idanÃ© v Device#getReportInfo\n// - Bude moÅ¾nÃ© aÅ¾ po migraci vÅ¡ech platforem na multiplatformnÃ­ Adapter.\n// - PÅ™idÃ¡ poloÅ¾ky: buildId, contentTimestamp, version.\n/**\n * SprÃ¡vce informacÃ­ pro reportovÃ¡nÃ­.\n * @extends EventBus\n */\nclass ReportManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {AppManager} appManager SprÃ¡vce aplikace.\n   * @param {ControlManager} controlManager SprÃ¡vce ovlÃ¡dÃ¡nÃ­.\n   * @param {DriveManager} driveManager SprÃ¡vce fyzickÃ½ch datovÃ½ch ÃºloÅ¾iÅ¡Å¥.\n   * @param {FirmwareManager} firmwareManager SprÃ¡vce firmware.\n   * @param {Logger} logger\n   * @param {MemoryManager} memoryManager SprÃ¡vce operaÄ�nÃ­ pamÄ›ti.\n   * @param {NetworkManager} networkManager SprÃ¡vce pÅ™ipojenÃ­ k sÃ­ti.\n   * @param {PowerManager} powerManager SprÃ¡vce napÃ¡jenÃ­.\n   * @param {ScreenManager} screenManager SprÃ¡vce obrazovky.\n   * @param {SensorManager} sensorManager SprÃ¡vce fyzickÃ½ch senzorÅ¯.\n   * @param {SoundManager} soundManager SprÃ¡vce zvuku.\n   * @param {TimeManager} timeManager SprÃ¡vce Ä�asu a Ä�asovÃ½ch zÃ³n.\n   * @returns {ReportManager} NovÃ¡ instance.\n   */\n  constructor (\n    appManager, controlManager, driveManager, firmwareManager, logger,\n    memoryManager, networkManager, powerManager, screenManager, sensorManager,\n    soundManager, timeManager\n  ) {\n    this.appManager = appManager;\n    this.controlManager = controlManager;\n    this.driveManager = driveManager;\n    this.firmwareManager = firmwareManager;\n    this.logger = logger;\n    this.memoryManager = memoryManager;\n    this.networkManager = networkManager;\n    this.powerManager = powerManager;\n    this.screenManager = screenManager;\n    this.sensorManager = sensorManager;\n    this.soundManager = soundManager;\n    this.timeManager = timeManager;\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s Ä�asem zapnutÃ­ zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getBootTimestamp () {\n    return new Promise((resolve) => resolve(\n      this.powerManager.getBootDate()\n      .then((date) => ({bootTimestamp: date.toISOString()}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s jasem obrazovky.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getBrightness () {\n    return new Promise((resolve) => resolve(\n      this.screenManager.getBrightness()\n      .then((brightness) => ({brightness}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s fyzickÃ½mi datovÃ½mi ÃºloÅ¾iÅ¡Å¥i.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getDriveInfo () {\n    return new Promise((resolve) => resolve(\n      this.driveManager.getInfo()\n      .then((driveInfo) => ({driveInfo}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s verzÃ­ firmware.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getFirmwareVersion () {\n    return new Promise((resolve) => resolve(\n      this.firmwareManager.getVersion()\n      .then((firmwareVersion) => ({firmwareVersion}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ se snÃ­mkem obrazovky.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getImage () {\n    return new Promise((resolve) => resolve(\n      this.screenManager.createScreenshot()\n      .then((image) => ({image}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ informace pro reportovÃ¡nÃ­.\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getInfo () {\n    return new Promise((resolve) => resolve(\n      [\n        () => this.getBootTimestamp(),\n        () => this.getBrightness(),\n        () => this.getDriveInfo(),\n        () => this.getFirmwareVersion(),\n        () => this.getImage(),\n        () => this.getLocalControlLock(),\n        () => this.getManufacturer(),\n        () => this.getMemory(),\n        () => this.getModelName(),\n        () => this.getMuted(),\n        () => this.getNetwork(),\n        () => this.getNowTimestamp(),\n        () => this.getOrientation(),\n        () => this.getRemoteControlLock(),\n        () => this.getRuntimePlatform(),\n        () => this.getSerialNumber(),\n        () => this.getTemperature(),\n        () => this.getTimezone(),\n        () => this.getUpdatePlatform(),\n        () => this.getUpdateUrl(),\n        () => this.getVolume()\n      ]\n      .reduce(\n        (accPromise, getter) => (\n          accPromise.then((accObject) => (\n            getter()\n            .then((result) => Object.assign(accObject, result))\n            .catch((error) => {\n              // Chyby vychÃ¡zejÃ­cÃ­ z nedostupnosti informacÃ­ se ignorujÃ­.\n              if (error.name !== ErrorName.NotSupportedError) {\n                this.logger.error(error);\n              }\n              return accObject;\n            })\n          ))\n        ),\n        Promise.resolve({})\n      )\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ se zÃ¡mkem ovlÃ¡dÃ¡nÃ­ pro tlaÄ�Ã­tka umÃ­stÄ›nÃ©\n   * pÅ™Ã­mo na zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {Promise.<ReportInfo>}\n   */\n  getLocalControlLock () {\n    return new Promise((resolve) => resolve(\n      this.controlManager.getLocalLock()\n      .then((lock) => ({localControlLock: lock}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s vÃ½robcem zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getManufacturer () {\n    return new Promise((resolve) => resolve(\n      this.firmwareManager.getManufacturer()\n      .then((manufacturer) => ({manufacturer}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s operaÄ�nÃ­ pamÄ›tÃ­.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getMemory () {\n    return new Promise((resolve) => resolve(\n      this.memoryManager.getInfo()\n      .then((memoryInfo) => ({\n        totalRam: memoryInfo.total,\n        usedRam: memoryInfo.used\n      }))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s modelem zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getModelName () {\n    return new Promise((resolve) => resolve(\n      this.firmwareManager.getModelName()\n      .then((modelName) => ({modelName}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s vypnutÃ­m zvuku.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getMuted () {\n    return new Promise((resolve) => resolve(\n      this.soundManager.isMuted()\n      .then((muted) => ({muted}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s pÅ™ipojenÃ­m k sÃ­ti.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getNetwork () {\n    return new Promise((resolve) => resolve(\n      this.networkManager.getAllConnections()\n      .then((connectionArray) => {\n        const wiredInfo = this.getWired(connectionArray);\n        const wirelessInfo = this.getWireless(connectionArray);\n        return {...wiredInfo, ...wirelessInfo};\n      })\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s aktuÃ¡lnÃ­m Ä�asem.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getNowTimestamp () {\n    return new Promise((resolve) => resolve({\n      nowTimestamp: new Date().toISOString()\n    }));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s orientacÃ­ obrazovky.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getOrientation () {\n    return new Promise((resolve) => resolve(\n      this.screenManager.getOrientation()\n      .then((orientationEnum) => ({orientationEnum}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ se zÃ¡mkem ovlÃ¡dÃ¡nÃ­ pro tlaÄ�Ã­tka na dÃ¡lkovÃ©m ovlÃ¡dÃ¡nÃ­.\n   * @private\n   * @returns {Promise.<ReportInfo>}\n   */\n  getRemoteControlLock () {\n    return new Promise((resolve) => resolve(\n      this.controlManager.getRemoteLock()\n      .then((lock) => ({remoteControlLock: lock}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ identifikÃ¡tor platformy, na kterÃ© ja aplikace momentÃ¡lnÄ› spuÅ¡tÄ›nÃ¡.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getRuntimePlatform () {\n    return new Promise((resolve) => resolve(\n      this.appManager.getRuntimePlatform()\n      .then((runtimePlatform) => ({runtimePlatform}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ se sÃ©riovÃ½m Ä�Ã­slem zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getSerialNumber () {\n    return new Promise((resolve) => resolve(\n      this.firmwareManager.getSerialNumber()\n      .then((serialNumber) => ({serialNumber}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s teplotou zaÅ™Ã­zenÃ­.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getTemperature () {\n    return new Promise((resolve) => resolve(\n      this.sensorManager.getTemperature()\n      .then((temperature) => ({temperature}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s Ä�asovou zÃ³nou.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getTimezone () {\n    return new Promise((resolve) => resolve(\n      this.timeManager.getZone()\n      .then((timezone) => ({timezone}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s platformou pro aktualizace.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getUpdatePlatform () {\n    return new Promise((resolve) => resolve(\n      this.appManager.getUpdatePlatform()\n      .then((updatePlatform) => ({updatePlatform}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s aktualizaÄ�nÃ­ URL.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getUpdateUrl () {\n    return new Promise((resolve) => resolve(\n      this.appManager.getUpdateUrl()\n      .then((updateUrl) => ({updateUrl}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s hlasitostÃ­ zvuku.\n   * @private\n   * @returns {Promise.<ReportInfo>} Informace.\n   */\n  getVolume () {\n    return new Promise((resolve) => resolve(\n      this.soundManager.getVolume()\n      .then((volume) => ({volume}))\n    ));\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s pevnÃ½m pÅ™ipojenÃ­m k sÃ­ti.\n   * @param {Array.<NetworkConnection>} connectionArray Seznam dostupnÃ½ch pÅ™ipojenÃ­.\n   * @private\n   * @returns {ReportInfo} Informace.\n   */\n  getWired (connectionArray) {\n    const foundConnection = connectionArray.find((connection) => connection.getType() === NetworkType.Ethernet);\n    if (isNil(foundConnection)) {\n      return {};\n    }\n    const wiredIpInfo = this.getWiredIp(foundConnection);\n    return {\n      ...wiredIpInfo,\n      wiredMacAddress: foundConnection.getMac()\n    };\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s IP adresou pevÃ©ho pÅ™ipojenÃ­ k sÃ­ti.\n   * @param {NetworkConnection} connection PÅ™ipojenÃ­.\n   * @private\n   * @returns {ReportInfo} Informace.\n   */\n  getWiredIp (connection) {\n    if (!connection.hasIp()) {\n      return {};\n    }\n    return {wiredIpAddress: connection.getIp()};\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s bezdrÃ¡tovÃ½m pÅ™ipojenÃ­m k sÃ­ti.\n   * @param {Array.<NetworkConnection>} connectionArray Seznam dostupnÃ½ch pÅ™ipojenÃ­.\n   * @private\n   * @returns {ReportInfo} Informace.\n   */\n  getWireless (connectionArray) {\n    const foundConnection = connectionArray.find((connection) => connection.getType() === NetworkType.Wifi);\n    if (isNil(foundConnection)) {\n      return {};\n    }\n    const wirelessIpInfo = this.getWirelessIp(foundConnection);\n    return {\n      ...wirelessIpInfo,\n      wirelessMacAddress: foundConnection.getMac()\n    };\n  }\n\n  /**\n   * ZjistÃ­ Ä�Ã¡st informacÃ­ s IP adresou bezdrÃ¡tovÃ©ho pÅ™ipojenÃ­ k sÃ­ti.\n   * @param {NetworkConnection} connection PÅ™ipojenÃ­.\n   * @private\n   * @returns {ReportInfo} Informace.\n   */\n  getWirelessIp (connection) {\n    if (!connection.hasIp()) {\n      return {};\n    }\n    return {wirelessIpAddress: connection.getIp()};\n  }\n}\n\nexport default ReportManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\n\nimport Numeric from '../numeric/numeric';\nimport ScheduleInfo from './schedule-info';\n\n/**\n * Strategie pÅ™ehrÃ¡vÃ¡nÃ­ pro pozadÃ­ Å¡ablony.\n * @implements {ScheduleStrategy}\n */\nclass ScheduleBackground {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Layout} layout Å ablona, pro kterou se plÃ¡nuje pozadÃ­.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   * @returns {ScheduleBackground} NovÃ¡ instance.\n   */\n  constructor (session, layout, viewerRegistry) {\n    if (!isObject(session)) {\n      throw new TypeError(`Invalid session ${session}.`);\n    }\n    if (!isObject(layout)) {\n      throw new TypeError(`Invalid layout ${layout}.`);\n    }\n    if (!isObject(viewerRegistry)) {\n      throw new TypeError(`Invalid viewer registry ${viewerRegistry}.`);\n    }\n    this.cycleIndex = 0;\n    this.emitter = new EventEmitter();\n    this.layout = layout;\n    this.session = session;\n    this.viewerRegistry = viewerRegistry;\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // NenÃ­ potÅ™eba nic ruÅ¡it.\n    // PÅ™Ã­tomno pouze pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /**\n   * UrÄ�Ã­ informace pro pÅ™ehrÃ¡nÃ­ mÃ©dia.\n   * @param {number} cycleIndex PoÅ™adÃ­ cyklu, ke kterÃ©mu vytvoÅ™it informace.\n   * @private\n   * @returns {ScheduleInfo} Informace pro pÅ™ehrÃ¡nÃ­ mÃ©dia.\n   */\n  getInfo (cycleIndex) {\n    const iterationIndex = 0;\n    if (cycleIndex > 0) {\n      return new ScheduleInfo({cycleIndex, iterationIndex});\n    }\n    const {layout} = this;\n    const {medium} = layout;\n    if (isNil(medium)) {\n      // TODO #270 Jak zobrazovat samostatnÃ© pozadÃ­?\n      return new ScheduleInfo({cycleIndex, iterationIndex});\n    }\n    // NapojenÃ­ na registr informacÃ­ o typu mÃ©diu.\n    return new ScheduleInfo({\n      cycleIndex,\n      iterationIndex,\n      layout,\n      medium,\n      session: this.session,\n      viewerRegistry: this.viewerRegistry\n    });\n  }\n\n  /** @inheritdoc */\n  go () {\n    const cycleIndex = this.cycleIndex;\n    const scheduleInfo = this.getInfo(cycleIndex);\n    this.cycleIndex = cycleIndex + 1;\n    // VyvolÃ¡nÃ­ udÃ¡losti a vrÃ¡cenÃ­ vÃ½sledku.\n    this.emitter.emit('gone', scheduleInfo);\n    return scheduleInfo;\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /** @inheritdoc */\n  plan (offset) {\n    if (!Numeric.isIndex(offset)) {\n      throw new TypeError(`Invalid offset ${offset}.`);\n    }\n    return (\n      Array(offset).fill()\n      .map((value, index) => this.getInfo(this.cycleIndex + index))\n    );\n  }\n\n  /** @inheritdoc */\n  skip () {\n    // NenÃ­ potÅ™eba nic pÅ™eskakovat.\n    // PÅ™Ã­tomno pouze pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /** @inheritdoc */\n  stop () {\n    // NenÃ­ potÅ™eba nic zastavovat.\n    // PÅ™Ã­tomno pouze pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /** @inheritdoc */\n  toString () {\n    return `ScheduleBackground {layoutId: ${this.layout.id}}`;\n  }\n}\n\nexport default ScheduleBackground;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\n\nimport Numeric from '../numeric/numeric';\nimport ScheduleInfo from './schedule-info';\n\n/**\n * Strategie pÅ™ehrÃ¡vÃ¡nÃ­ pro prÃ¡zdnÃ½ obsah.\n * @implements {ScheduleStrategy}\n */\nclass ScheduleEmpty {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @returns {ScheduleEmpty} NovÃ¡ instance.\n   */\n  constructor () {\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // NenÃ­ potÅ™eba nic ruÅ¡it.\n    // PÅ™Ã­tomno pouze pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /** @inheritdoc */\n  go () {\n    const scheduleInfo = new ScheduleInfo();\n    this.emitter.emit('gone', scheduleInfo);\n    return scheduleInfo;\n  }\n\n  /** @inheritdoc */\n  plan (offset) {\n    if (!Numeric.isIndex(offset)) {\n      throw new TypeError(`Invalid offset ${offset}.`);\n    }\n    return (\n      Array(offset).fill()\n      .map(() => new ScheduleInfo())\n    );\n  }\n\n  /** @inheritdoc */\n  skip () {\n    // NenÃ­ potÅ™eba nic pÅ™eskakovat.\n    // PÅ™Ã­tomno pouze pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /** @inheritdoc */\n  stop () {\n    // NenÃ­ potÅ™eba nic zastavovat.\n    // PÅ™Ã­tomno pouze pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /** @inheritdoc */\n  toString () {\n    return `ScheduleEmpty`;\n  }\n}\n\nexport default ScheduleEmpty;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k plÃ¡nÅ¯ pÅ™ehrÃ¡vÃ¡nÃ­.\n * @enum {string}\n */\nconst ScheduleEnum = {\n  /** Playlist bude pÅ™ehrÃ¡n dle poÅ™adÃ­ stop. V kaÅ¾dÃ©m opakovÃ¡nÃ­ se pÅ™ehraje jen vybranÃ½ poÄ�et stop. */\n  DYNAMIC: 'DYNAMIC',\n  /** Playlist bude pÅ™ehrÃ¡n dle nÃ¡hodnÃ©ho poÅ™adÃ­ stop. PoÅ™adÃ­ se pÅ™i opakovÃ¡nÃ­ nemÄ›nÃ­. */\n  RANDOM: 'RANDOM',\n  /** Playlist bude pÅ™ehrÃ¡n dle poÅ™adÃ­ stop. */\n  STATIC: 'STATIC'\n};\n\nexport default ScheduleEnum;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\nimport isEqual from 'lodash/isEqual';\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\nimport isUndefined from 'lodash/isUndefined';\n\nimport Numeric from '../numeric/numeric';\n// TODO IoC/DI\nimport IcalPlanner from '../ical/ical-planner';\n\n// TODO #271 Refaktorizovat na menÅ¡Ã­ tÅ™Ã­dy?\n// - Funkcionalita souvisejÃ­cÃ­ s rozmÄ›ry a pozicovÃ¡nÃ­m (width, top, zIndex, ...).\n//   - LepÅ¡Ã­ zpracovÃ¡nÃ­ metod pro zjiÅ¡Å¥ovÃ¡nÃ­ rozmÄ›rÅ¯ (DRY, defaults)?\n// - Funkcionalita souvisejÃ­cÃ­ s poÅ™adÃ­m (cycleIndex a iterationIndex).\n//   - Pomohlo by hackÅ¯m pÅ™i plÃ¡novÃ¡nÃ­ ScheduleLinear\n// TODO #272 Pro zanoÅ™enÃ© Å¡ablony budou nutnÃ© Ãºpravy v konstruktoru:\n// - `layerArray` mÃ­sto `layer` a `layoutArray` mÃ­sto `layout`\n// - MoÅ¾nÃ¡ rozliÅ¡ovat i rÅ¯znÃ© vazby Å¡ablony `childLayout` vs. `parentLayout` (respektive `parentLayoutArray`).\n//   Nebo bude staÄ�it `layerArray` (rodiÄ�ovskÃ©) a `layer` (potomek, alternativa k medium)?\n// TODO #138 PÅ™epracovat pÅ™Ã­stup k prÃ¡zdnÃ©mu `ScheduleInfo`.\n// - PÅ™edchozÃ­ stav:\n//   - PrÃ¡zdnÃ½ slajd je reprezentovÃ¡n jako `null`.\n//   - ObecnÄ› nynÃ­ vÅ¡echny strategie vracejÃ­ buÄ� samÃ© slajdy, nebo samÃ© `null`.\n//   - PÅ™i plÃ¡novÃ¡nÃ­ jsou prÃ¡zdnÃ© slajdy pÅ™eskakovÃ¡ny.\n// - AktuÃ¡lnÃ­ stav:\n//   - Byly refaktorizovÃ¡ny vÅ¡echny `null` na `new ScheduleInfo()`.\n//   - K detekci se pouÅ¾Ã­vÃ¡ `ScheduleInfo#isEmpty`\n// - ObjevenÃ½ problÃ©m:\n//   - NastavÃ¡ v okamÅ¾iku sluÄ�ovÃ¡nÃ­ obsahÅ¯ z vnitÅ™nÃ­ch strategiÃ­, kdy je tÅ™eba seÅ™adit jejich vÃ½sledky.\n//   - JelikoÅ¾ u prÃ¡zdnÃ©ho slajdu nelze urÄ�it `cycleIndex` a `iterationIndex`, je nutnÃ© prÃ¡zdnÃ© slajdy ze sluÄ�ovÃ¡nÃ­ vyjmout.\n//   - To pak ale zpÅ¯sobuje dopÅ™edu nepÅ™edvÃ­datelnÃ© zkracovÃ¡nÃ­ plÃ¡nÅ¯ z vnitÅ™nÃ­ch strategiÃ­.\n//   - Teoreticky mÅ¯Å¾e nÄ›jakÃ¡ strategie vracet zÃ¡roveÅˆ prÃ¡zdnÃ© i neprÃ¡zdnÃ© slajdy.\n//   - Pak nelze dopÅ™edu odhadnout kolik jejÃ­ch slajdÅ¯ se mÃ¡ plÃ¡novat (hrozba zacyklenÃ­).\n// - AktuÃ¡lnÃ­ Å™eÅ¡enÃ­:\n//   - SpolÃ©hÃ¡ se na to, Å¾e vÃ½sledkem jsou buÄ� samÃ© neprÃ¡zdnÃ© slajdy, nebo samÃ© prÃ¡zdnÃ© slajdy.\n//   - VÅ¡echny prÃ¡zdnÃ© slajdy se od zaÄ�Ã¡tku odeberou a nahradÃ­ za ostatnÃ­ slajdy.\n//   - Pokud zde nejsou Å¾Ã¡dnÃ© neprÃ¡zdnÃ© slajdy, tak se vracejÃ­ samÃ© prÃ¡zdnÃ© slajdy.\n// - LepÅ¡Ã­ oÅ¡etÅ™enÃ­:\n//   - Jinak zpracovat systÃ©m sluÄ�ovÃ¡nÃ­ plÃ¡nÅ¯?\n// TODO #295 VylepÅ¡it implementaci. NenÃ­ tÅ™eba hledat v registru opakovanÄ›.\n// - `isPreloadable`, `isViewable` + jeÅ¡tÄ› i pÅ™Ã­stup k `getViewerType` pÅ¯sobÃ­ pÅ™Ã­liÅ¡ duplicitnÄ›.\n// - IdÃ¡lnÄ› by se asi mÄ›l v konstruktoru nahradit `ViewerRegistry` za jiÅ¾ vyhledanÃ½ `ViewerType`.\n//   Ten pak zpÅ™istupnit pomocÃ­ getViewerType a dÃ¡le v tÃ©to tÅ™Ã­dÄ› neÅ™eÅ¡it.\n// - VÅ¯bec nedovolit vytvoÅ™enÃ­ `ScheduleInfo` bez `ViewerType`, aby nebylo nutnÃ© Å™eÅ¡it jeho chybÄ›nÃ­?\n/**\n * Informace potÅ™ebnÃ© k pÅ™ehrÃ¡nÃ­ mÃ©dia.\n * UrÄ�enÃ© pro pouÅ¾itÃ­ mimo plÃ¡novaÄ�.\n * Obsahuje hodnoty vypoÄ�tenÃ© v urÄ�itÃ½ okamÅ¾ik.\n * SlouÅ¾Ã­ pro odstÃ­nÄ›nÃ­ logiky urÄ�enÃ­ hodnot dle nÄ›jakÃ© strategie.\n * KaÅ¾dÃ¡ strategie urÄ�uje hodnoty jinak, ale vracÃ­ je v tomto jednotnÃ©m formÃ¡tu.\n * Obsahuje vÅ¡echny informace, kterÃ© mÅ¯Å¾e potÅ™ebovat prolÃ­naÄ�, rodiÄ�ovskÃ¡ strategie, analytika, ...\n * @implements {Serializable}\n * @implements {Stringable}\n */\nclass ScheduleInfo {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {number} [opts.cycleIndex] PoÅ™adÃ­ cyklu do kterÃ©ho slajd patÅ™Ã­.\n   * @param {number} [opts.iterationIndex] PoÅ™adÃ­ slajdu v rÃ¡mci aktuÃ¡lnÄ› pÅ™ehrÃ¡vanÃ©ho cyklu.\n   * @param {Layer} [opts.layer] Vrstva, do kterÃ© se pÅ™ehrÃ¡vanÃ© mÃ©dium vykresluje.\n   * @param {Layout} [opts.layout] Å ablona, do kterÃ© se pÅ™ehrÃ¡vanÃ© mÃ©dium vykresluje.\n   * @param {Medium} [opts.medium] MÃ©dium k pÅ™ehrÃ¡nÃ­.\n   * @param {Array.<Playlist>} [opts.playlistArray] Seznam playlistÅ¯, do kterÃ½ch mÃ©dium patÅ™Ã­.\n   * @param {Session} [opts.session] NastavenÃ­ zaÅ™Ã­zenÃ­, na kterÃ©m se mÃ©dium pÅ™ehrÃ¡vÃ¡.\n   * @param {Array.<Track>} [opts.trackArray] Seznam stop playlistÅ¯, do kterÃ½ch mÃ©dium patÅ™Ã­.\n   * @param {ViewerRegistry} [opts.viewerRegistry] Registr informacÃ­ o typech mÃ©diÃ­.\n   * @returns {ScheduleInfo} NovÃ¡ instance.\n   */\n  constructor ({cycleIndex, iterationIndex, layer, layout, medium, playlistArray = [], session, trackArray = [], viewerRegistry} = {}) {\n    this.cycleIndex = cycleIndex;\n    this.iterationIndex = iterationIndex;\n    this.layer = layer;\n    this.layout = layout;\n    this.medium = medium;\n    this.playlistArray = playlistArray;\n    this.session = session;\n    this.trackArray = trackArray;\n    this.viewerRegistry = viewerRegistry;\n  }\n\n  /**\n   * ZjistÃ­ barvu pozadÃ­ slajdu.\n   * Hodnota odpovÃ­dÃ¡ [CSS vlastnosti background-color](https://developer.mozilla.org/en-US/docs/Web/CSS/background-color).\n   * @returns {string} Barva.\n   */\n  getBackgroundColor () {\n    // TODO #270 Prototyp nastavenÃ­ pozadÃ­, jak zpracovat lÃ©pe?\n    // - PÅ™edÃ¡vat do ScheduleInfo layout? Jak pak identifikovat vrstvu s pozadÃ­m?\n    //   - AktuÃ¡lnÃ­ zpracovÃ¡nÃ­ s tÃ­m, Å¾e se doÄ�asnÄ› pozadÃ­ identifikuje jako ScheduleInfo se Å¡ablonou, ale bez vrstvy.\n    // - VytvoÅ™it novou implementaci ScheduleInfo?\n    //   - To by vyÅ¾adovalo propojenÃ­ jednotlivÃ½ch ScheduleInfo do stromu.\n    //     DelegovÃ¡nÃ­ poÅ¾adavkÅ¯ na podÅ™Ã­zenÃ© ScheduleInfo a rekace jde jejich vÃ½sledkÅ¯?\n    // - PÅ™edÃ¡vat do ScheduleInfo backgroundColor?\n    //   - To nebude fungovat, jakmile budou Å¡ablony zanoÅ™enÃ©.\n    //     Hodnotu pÅ™epÃ­Å¡e rodiÄ�ovskÃ¡ Schedule info pro vrstvu.\n    //   - Toto asi nebude vhodnÃ©, jelikoÅ¾ to odpovÃ­dÃ¡ starÃ©mu opuÅ¡tÄ›nÃ©mu stylu.\n    const {layer, layout} = this;\n    if (!isNil(layer)) {\n      // VÃ½chozÃ­ barva pro pozadÃ­ vrstev.\n      return '#000000';\n    }\n    if (!isNil(layout)) {\n      // Barva pro pozadÃ­ Å¡ablony.\n      const {backgroundColor} = layout;\n      if (isNil(backgroundColor)) {\n        throw new TypeError(`Missing background color.`);\n      }\n      return backgroundColor;\n    }\n    // VÃ½chozÃ­ barva pro slajdy bez Å¡ablon.\n    return '#000000';\n  }\n\n  /**\n   * ZjistÃ­ poÅ™adÃ­ cyklu do kterÃ©ho slajd patÅ™Ã­.\n   * Cyklus je sÃ©rie slajdÅ¯ po kterÃ½ch se zaÄ�nou mÃ©dia opakovat.\n   * @returns {number} PoÅ™adÃ­.\n   */\n  getCycleIndex () {\n    const {cycleIndex} = this;\n    if (isNil(cycleIndex)) {\n      throw new TypeError(`Missing cycle index.`);\n    }\n    return cycleIndex;\n  }\n\n  /**\n   * ZjistÃ­ vÃ½Å¡ku, ve kterÃ© se mÃ¡ mÃ©dium zobrazit.\n   * Hodnota odpovÃ­dÃ¡ [CSS vlastnosti height](https://developer.mozilla.org/en-US/docs/Web/CSS/height).\n   * @returns {string} VÃ½Å¡ka.\n   */\n  getHeight () {\n    const {layer} = this;\n    if (isNil(layer)) {\n      return '100%';\n    }\n    return layer.height;\n  }\n\n  /**\n   * ZjistÃ­ poÅ™adÃ­ slajdu v rÃ¡mci aktuÃ¡lnÄ› pÅ™ehrÃ¡vanÃ©ho cyklu.\n   * Nastavuje se v intervalu `<0, length)`, kde `length` je poÄ�et slajdÅ¯ v cyklu.\n   * @returns {number} PoÅ™adÃ­.\n   */\n  getIterationIndex () {\n    const {iterationIndex} = this;\n    if (isNil(iterationIndex)) {\n      throw new TypeError(`Missing iteration index.`);\n    }\n    return iterationIndex;\n  }\n\n  // TODO #271 VyuÅ¾Ã­t #getLayout v implementaci.\n  // - Alternativa pro ScheduleInfo#getMedium()\n  // - Na jeho pÅ™Ã­tomnost by se mÄ›lo reagovat tak, Å¾e pro kaÅ¾dÃ½ Layer se vytvoÅ™Ã­ novÃ¡ ScheduleStrategy.\n  // - Touto zmÄ›nou se stane Medium nepovinnÃ©.\n  // - NynÃ­ se jiÅ¾ ScheduleInfo#layout pouÅ¾Ã­vÃ¡ pro rodiÄ�ovskou Å¡ablonu. Refaktorizovat pÅ™ed pouÅ¾itÃ­m!\n  // /**\n  //  * ZjistÃ­ Å¡ablonu k pÅ™ehrÃ¡nÃ­.\n  //  * @returns {Layout} Å ablona.\n  //  */\n  // getLayout () {\n  //   const {layout} = this;\n  //   if (isNil(layout)) {\n  //     throw new TypeError(`Missing layout.`);\n  //   }\n  //   return layout;\n  // }\n\n  /**\n   * ZjistÃ­ vzdÃ¡lenost od levÃ©ho okraje obrazovky, ve kterÃ© se mÃ¡ mÃ©dium zobrazit.\n   * Hodnota odpovÃ­dÃ¡ [CSS vlastnosti left](https://developer.mozilla.org/en-US/docs/Web/CSS/left).\n   * @returns {string} VzdÃ¡lenost.\n   */\n  getLeft () {\n    const {layer} = this;\n    if (isNil(layer)) {\n      return '0%';\n    }\n    return layer.left;\n  }\n\n  /**\n   * ZjistÃ­ mÃ©dium k pÅ™ehrÃ¡nÃ­.\n   * @returns {Medium} MÃ©dium.\n   */\n  getMedium () {\n    const {medium} = this;\n    if (isNil(medium)) {\n      throw new TypeError(`Missing medium.`);\n    }\n    return medium;\n  }\n\n  /**\n   * ZjistÃ­ dobu pÅ™ehrÃ¡vÃ¡nÃ­, po kterou mÃ¡ bÃ½t slajd zobrazen.\n   * V playlistu je to doba pÅ™ehrÃ¡vÃ¡nÃ­ tracku, jinak mÃ©dia.\n   * @returns {number}\n   */\n  getPlayDuration () {\n    // TODO NenÃ­ propojeno s Ä�asovaÄ�i, kterÃ© se odpoÄ�Ã­tÃ¡vajÃ­ ve strategiÃ­ch.\n    // - Pouze se spolÃ©hÃ¡ na to, Å¾e implementace budou stejnÃ©.\n    // - Promyslet a sjednotit urÄ�ovÃ¡nÃ­ doby pÅ™ehrÃ¡vÃ¡nÃ­ na jedno mÃ­sto.\n    const trackDuration = get(this.trackArray[0], 'playDuration');\n    if (!isNil(trackDuration)) {\n      return trackDuration;\n    }\n    const mediumDuration = get(this.medium, 'playDuration');\n    if (!isNil(mediumDuration)) {\n      return mediumDuration;\n    }\n    throw new TypeError(`Missing play duration.`);\n  }\n\n  /**\n   * ZjistÃ­ roztaÅ¾enÃ­, kterÃ© se mÃ¡ nastavit mÃ©diu.\n   * @returns {StretchEnum} RoztaÅ¾enÃ­.\n   */\n  getStretchEnum () {\n    const mediumStretchEnum = get(this.medium, 'stretchEnum');\n    if (!isNil(mediumStretchEnum)) {\n      return mediumStretchEnum;\n    }\n    const sessionStretchEnum = get(this.session, 'stretchEnum');\n    if (!isNil(sessionStretchEnum)) {\n      return sessionStretchEnum;\n    }\n    throw new TypeError(`Missing stretch.`);\n  }\n\n  /**\n   * ZjistÃ­ vzdÃ¡lenost od hornÃ­ho okraje obrazovky, ve kterÃ© se mÃ¡ mÃ©dium zobrazit.\n   * Hodnota odpovÃ­dÃ¡ [CSS vlastnosti top](https://developer.mozilla.org/en-US/docs/Web/CSS/top).\n   * @returns {string} VzdÃ¡lenost.\n   */\n  getTop () {\n    const {layer} = this;\n    if (isNil(layer)) {\n      return '0%';\n    }\n    return layer.top;\n  }\n\n  /**\n   * ZjistÃ­ URL, kterÃ¡ se mÃ¡ nastavit jako zdroj.\n   * @returns {string} URL.\n   */\n  getUrl () {\n    const viewerType = this.getViewerType();\n    const url = viewerType.getUrl(this.medium);\n    if (isNil(url)) {\n      throw new TypeError(`Missing URL.`);\n    }\n    return url;\n  }\n\n  /**\n   * ZjistÃ­ informace o typu mÃ©dia k pÅ™ehrÃ¡nÃ­.\n   * @returns {ViewerType} Typ mÃ©dia.\n   */\n  getViewerType () {\n    const viewerType = this.viewerRegistry.find(this.medium.type);\n    if (isNil(viewerType)) {\n      throw new TypeError(`Missing viewer type.`);\n    }\n    return viewerType;\n  }\n\n  /**\n   * ZjistÃ­ hlasitost, kterÃ¡ se mÃ¡ nastavit mÃ©diu.\n   * @returns {number} Hlasitost [0-1].\n   */\n  getVolume () {\n    const volume = (\n      [this.getMedium().volume]\n      .concat(\n        this.trackArray.map((track) => track.volume),\n        this.playlistArray.map((playlist) => playlist.volume)\n      )\n      .reduce(\n        (accVolume, currentVolume) => {\n          if (isNil(currentVolume)) {\n            return accVolume;\n          }\n          if (isNil(accVolume)) {\n            return currentVolume;\n          }\n          return accVolume * currentVolume;\n        },\n        null\n      )\n    );\n    if (isNil(volume)) {\n      throw new TypeError(`Missing volume.`);\n    }\n    return volume;\n  }\n\n  /**\n   * ZjistÃ­ Å¡Ã­Å™ku, ve kterÃ© se mÃ¡ mÃ©dium zobrazit.\n   * Hodnota odpovÃ­dÃ¡ [CSS vlastnosti height](https://developer.mozilla.org/en-US/docs/Web/CSS/height).\n   * @returns {string} Å Ã­Å™ka.\n   */\n  getWidth () {\n    const {layer} = this;\n    if (isNil(layer)) {\n      return '100%';\n    }\n    return layer.width;\n  }\n\n  /**\n   * ZjistÃ­ umÃ­stÄ›nÃ­ na ose Z, ve kterÃ© se mÃ¡ mÃ©dium zobrazit.\n   * Hodnota odpovÃ­dÃ¡ [CSS vlastnosti z-index](https://developer.mozilla.org/en-US/docs/Web/CSS/z-index).\n   * @returns {string} Z-index.\n   */\n  getZIndex () {\n    const {layer} = this;\n    if (isNil(layer)) {\n      // PozadÃ­ mÃ¡ z-index 1. NulovÃ½ index odpovÃ­dÃ¡ elementÅ¯m bez specifickÃ©ho z-index.\n      return '1';\n    }\n    // Z-index vrstev je tÅ™eba pÅ™emapovat: <0, Infinty) -> <2, Infinty)\n    const zIndex = Number(layer.zIndex);\n    if (!Numeric.isIndex(zIndex)) {\n      throw new TypeError(`Invalid layer z-index ${zIndex}.`);\n    }\n    return String(zIndex + 2);\n  }\n\n  /**\n   * ZjistÃ­, jestli informace obsahujÃ­ cyklu do kterÃ©ho slajd patÅ™Ã­.\n   * @returns {boolean} PÅ™Ã­znak.\n   */\n  hasCycleIndex () {\n    return !isNil(this.cycleIndex);\n  }\n\n  /**\n   * ZjistÃ­, jestli informace obsahujÃ­ poÅ™adÃ­ v rÃ¡mci aktuÃ¡lnÄ› pÅ™ehrÃ¡vanÃ©ho cyklu.\n   * @returns {boolean} PÅ™Ã­znak.\n   */\n  hasIterationIndex () {\n    return !isNil(this.iterationIndex);\n  }\n\n  // TODO #271 VyuÅ¾Ã­t #hasLayout v implementaci.\n  // - NynÃ­ se jiÅ¾ ScheduleInfo#layout pouÅ¾Ã­vÃ¡ pro rodiÄ�ovskou Å¡ablonu. Refaktorizovat pÅ™ed pouÅ¾itÃ­m!\n  // /**\n  //  * ZjistÃ­, jestli informace obsahujÃ­ Å¡ablonu k pÅ™ehrÃ¡nÃ­.\n  //  * @returns {boolean} PÅ™Ã­znak.\n  //  */\n  // hasLayout () {\n  //   return !isNil(this.layout);\n  // }\n\n  /**\n   * ZjistÃ­, jestli informace obsahujÃ­ mÃ©dium k pÅ™ehrÃ¡nÃ­.\n   * @returns {boolean} PÅ™Ã­znak.\n   */\n  hasMedium () {\n    return !isNil(this.medium);\n  }\n\n  /**\n   * ZjistÃ­, jestli informace obsahujÃ­ nÄ›jakÃ½ objekt k pÅ™ehrÃ¡nÃ­.\n   * Objekt k pÅ™ehrÃ¡nÃ­ nemusÃ­ bÃ½t dostupnÃ½ u prÃ¡zdnÃ©ho playlistu,\n   * u prÃ¡zdnÃ© Å¡ablony, bez obsahovÃ© Ãºlohy apod.\n   * @returns {boolean} PÅ™Ã­znak.\n   */\n  isEmpty () {\n    return isNil(this.medium);\n    // TODO #271 Prototyp zpracovÃ¡nÃ­ se zobrazenÃ­m celÃ© Å¡ablony.\n    // - NynÃ­ se jiÅ¾ ScheduleInfo#layout pouÅ¾Ã­vÃ¡ pro rodiÄ�ovskou Å¡ablonu. Refaktorizovat pÅ™ed pouÅ¾itÃ­m!\n    // return isNil(this.layout) && isNil(this.medium);\n  }\n\n  /**\n   * ZjistÃ­, jestli lze mÃ©dium pÅ™ipravovat na pozadÃ­,\n   * zatÃ­mco je pÅ™ehrÃ¡vÃ¡no jinÃ©.\n   * @returns {boolean}\n   */\n  isPreloadable () {\n    // Pokud nejsou dostupnÃ© nÄ›jakÃ© hodnoty, tak se preload povolÃ­.\n    // Jde o technickÃ½ dluh, jinak by se preload vÅ¾dy na podobnÃ©m slajdu zaseknul, coÅ¾ nenÃ­ Å¾Ã¡doucÃ­.\n    // Å½Ã¡doucÃ­ je, aby byl takovÃ½ slajd pÅ™eskoÄ�en pÅ™i pokusu o jeho preload.\n    const {viewerRegistry} = this;\n    if (isNil(viewerRegistry)) {\n      return true;\n    }\n    const {medium} = this;\n    const mediumType = get(medium, 'type');\n    if (isNil(mediumType)) {\n      return true;\n    }\n    const viewerType = viewerRegistry.find(mediumType);\n    if (isNil(viewerType)) {\n      return true;\n    }\n    // VÃ½sledek se urÄ�Ã­ dle typu mÃ©dia.\n    return viewerType.isPreloadable(medium);\n  }\n\n  // TODO PokroÄ�ilÃ© porovnÃ¡vÃ¡nÃ­ slajdÅ¯:\n  // - NynÃ­ je trochu zmatek, Å¾e `ScheduleInfo` se neporovnÃ¡vajÃ­ dle strict equality.\n  // - PÅ™itom tÅ™eba `ScheduleInfo#medium` uÅ¾ strict porovnÃ¡nÃ­m je.\n  // - Pokus o deep porovnÃ¡nÃ­ pÅ™es `lodash.isEqualWith` zpÅ¯sobuje problÃ©my a odebÃ­rÃ¡ moÅ¾nost vydefinovat klÃ­Ä�e k porovnÃ¡nÃ­.\n  // - MoÅ¾nÃ¡ by mÄ›lo vyuÅ¾Ã­vat obdobnÃ© metody `Medium#isEqual` a `ViewerType#isEqual`?\n  // - MoÅ¾nÃ¡ rovnou napojit na nÄ›jakÃ½ systÃ©m pro serializaci objektÅ¯ podobnÄ› jako `#toJson` a podle nich porovnÃ¡vat?\n  // - Nebo netrvat na vÃ½Ä�tu klÃ­Ä�Å¯? ZamÃ½Å¡leno pro kompatibilitu s dalÅ¡Ã­mi rozhranÃ­mi v tÅ™Ã­dÄ› a optimalizaci vÃ½konu.\n  /**\n   * ZjistÃ­, jestli je slajd podobnÃ½ jinÃ©mu.\n   * PodobnÃ© slajdy majÃ­ stejnÃ© vazby na objekty, ale mohou bÃ½t odliÅ¡nÃ½mi instancemi.\n   * NeprovÃ¡nÃ­ se deep porovnÃ¡nÃ­.\n   * PorovnÃ¡vajÃ­ se pouze vlastnosti, kterÃ© patÅ™Ã­ ke slajdÅ¯m.\n   * @param {ScheduleInfo} scheduleInfo Slajd k porovnÃ¡nÃ­.\n   * @returns {boolean} PÅ™Ã­znak, jestli majÃ­ slajdy stejnÃ½ obsah.\n   */\n  isEqual (scheduleInfo) {\n    // Validace druhÃ©ho slajdu.\n    if (!isObject(scheduleInfo)) {\n      throw new TypeError(`Invalid schedule info ${scheduleInfo}.`);\n    }\n    if (this.isEmpty() && scheduleInfo.isEmpty()) {\n      // Pokud nejsou naÄ�teny oba slajdy jde o schodu.\n      return true;\n    } else if (!this.isEmpty() && !scheduleInfo.isEmpty()) {\n      // Pokud jsou naÄ�teny oba slajdy, tak se porovnajÃ­ jejich vÃ½znamnÃ© hodnoty.\n      return isEqual(this.toJSON(), scheduleInfo.toJSON());\n    }\n    // JinÃ¡ kombinace slajdÅ¯ nenÃ­ shodou.\n    return false;\n  }\n\n  /**\n   * ZjistÃ­, jestli lze mÃ©dium zobrazit v aktuÃ¡lnÃ­ch podmÃ­nkÃ¡ch.\n   * @param {boolean} online PÅ™Ã­znak, jestli je zaÅ™Ã­zenÃ­ pÅ™ipojeno k sÃ­ti.\n   * @returns {boolean} PÅ™Ã­znak, jestli lze mÃ©dium zobrazit.\n   */\n  isViewable (online) {\n    // TODO #271 PÅ™edÃ¡vat NetworkManager do ScheduleInfo.\n    // - PÅ™epracovÃ¡nÃ­ `#isViewable` na async metodu.\n    // - ZruÅ¡it vstup online a mÃ­sto toho si zde vyÅ¾Ã¡dat informace ze sluÅ¾by NetworkManager.\n    // - ZruÅ¡it pÅ™edÃ¡vÃ¡nÃ­ NetworkManager do ViewerThread.\n    // MusÃ­ mÃ­t registr informacÃ­ o typech mÃ©diÃ­.\n    const {viewerRegistry} = this;\n    if (isNil(viewerRegistry)) {\n      return false;\n    }\n    // MusÃ­ mÃ­t mÃ©dium a konkrÃ©tnÃ­ typ.\n    const mediumType = get(this.medium, 'type');\n    if (isNil(mediumType)) {\n      return false;\n    }\n    // V registru nenÃ­ zÃ¡znam odpovÃ­dajÃ­cÃ­ typu mÃ©dia.\n    const viewerType = viewerRegistry.find(mediumType);\n    if (isNil(viewerType)) {\n      return false;\n    }\n    // MusÃ­ bÃ½t online, nebo spustitelnÃ© v offline.\n    if (!online && !viewerType.isOfflineable()) {\n      return false;\n    }\n    const isIcalValid = this.trackArray.every((track) => {\n      const {planIcal} = track;\n      return isNil(planIcal) || new IcalPlanner().hasEventOnDate(planIcal, new Date());\n    });\n    if (!isIcalValid) {\n      return false;\n    }\n    // MusÃ­ mÃ­t volnÃ½ zdroj k pÅ™ehrÃ¡nÃ­.\n    const viewerSourceCreator = viewerType.getSourceCreator();\n    return viewerSourceCreator.getLent() < viewerSourceCreator.getMax();\n  }\n\n  /** @inheritdoc */\n  toJSON () {\n    return {\n      cycleIndex: this.cycleIndex,\n      iterationIndex: this.iterationIndex,\n      layerId: get(this.layer, 'id', null),\n      layoutId: get(this.layout, 'id', null),\n      mediumId: get(this.medium, 'id', null),\n      playlistIdArray: this.playlistArray.map((playlist) => playlist.id),\n      sessionId: get(this.session, 'id', null),\n      trackIdArray: this.trackArray.map((track) => track.id)\n    };\n  }\n\n  /** @inheritdoc */\n  toString () {\n    return `ScheduleInfo ${JSON.stringify(this)}`;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ© informace slouÄ�enÃ­m s aktuÃ¡lnÃ­mi.\n   * @param {Object} [opts={}] NepovinnÃ© parametry z konstruktoru.\n   * @returns {ScheduleInfo} VytvoÅ™enÃ© informace.\n   */\n  merge (opts) {\n    return new ScheduleInfo(\n      []\n      .concat(\n        // PoloÅ¾ky, kterÃ© se nahrazujÃ­.\n        ['cycleIndex', 'iterationIndex', 'layer', 'layout', 'medium', 'session', 'viewerRegistry']\n        .map((key) => {\n          let value;\n          if (isUndefined(opts[key])) {\n            value = this[key];\n          } else {\n            value = opts[key];\n          }\n          return [key, value];\n        }),\n        // Pole, kterÃ© se sluÄ�ujÃ­.\n        ['playlistArray', 'trackArray']\n        .map((key) => {\n          let value;\n          if (isUndefined(opts[key])) {\n            value = this[key];\n          } else {\n            value = this[key].concat(opts[key]);\n          }\n          return [key, value];\n        })\n      )\n      // PÅ™evod seznamu [key, value] na objekt.\n      .reduce(\n        (acc, [key, value]) => ({...acc, [key]: value}),\n        {}\n      )\n    );\n  }\n}\n\nexport default ScheduleInfo;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\n\nimport ScheduleEmpty from './schedule-empty';\nimport ScheduleMedium from './schedule-medium';\nimport ScheduleOrphan from './schedule-orphan';\nimport SchedulePlaylist from './schedule-playlist';\n\n/**\n * Strategie pÅ™ehrÃ¡vÃ¡nÃ­ pro vrstvu Å¡ablony.\n * @implements {ScheduleStrategy}\n */\nclass ScheduleLayer {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {DS} store DatovÃ½ sklad.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Layer} layer Vrstva, kterou strategie pÅ™ehrÃ¡vÃ¡.\n   * @param {Layout} layout Å ablona vrstvy, kterou strategie pÅ™ehrÃ¡vÃ¡.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   * @returns {ScheduleLayer} NovÃ¡ instance.\n   */\n  constructor (store, session, layer, layout, viewerRegistry) {\n    if (!isObject(layer)) {\n      throw new TypeError(`Invalid layer ${layer}.`);\n    }\n    this.emitter = new EventEmitter();\n    this.layer = layer;\n    this.layout = layout;\n    const scheduleStrategy = ScheduleLayer.detectStrategy(store, session, layer, viewerRegistry);\n    this.scheduleStrategy = scheduleStrategy;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onGone = this.onGone.bind(this);\n    this.onPlayed = this.onPlayed.bind(this);\n    // NaslouchÃ¡nÃ­ udÃ¡lostem.\n    scheduleStrategy.on('gone', this.onGone);\n    scheduleStrategy.on('played', this.onPlayed);\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    const {scheduleStrategy} = this;\n    scheduleStrategy.off('gone', this.onGone);\n    scheduleStrategy.off('played', this.onPlayed);\n    scheduleStrategy.destroy();\n  }\n\n  /**\n   * Detekuje strategii pro vrstvu a vytvoÅ™Ã­ jejÃ­ instanci.\n   * @param {DS} store DatovÃ½ sklad.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Layer} layer Vrstva Å¡ablony.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   * @private\n   * @returns {ScheduleStrategy} DetekovanÃ¡ strategie plÃ¡novÃ¡nÃ­.\n   */\n  static detectStrategy (store, session, layer, viewerRegistry) {\n    // TODO #138 ZavÃ©st registry pro detekce strategiÃ­?\n    const {medium, playlist} = layer;\n    const hasMedium = !isNil(medium);\n    const hasPlaylist = !isNil(playlist);\n    if (hasMedium && !hasPlaylist) {\n      const scheduleMedium = new ScheduleMedium(session, medium, viewerRegistry);\n      return new ScheduleOrphan(medium.playDuration, scheduleMedium);\n    }\n    if (hasPlaylist && !hasMedium) {\n      return new SchedulePlaylist(store, session, playlist, viewerRegistry);\n    }\n    if (!hasPlaylist && !hasMedium) {\n      return new ScheduleEmpty();\n    }\n    throw new Error(`Unable to detect strategy for layer ${layer}.`);\n  }\n\n  /**\n   * UrÄ�Ã­ informace pro pÅ™ehrÃ¡nÃ­ mÃ©dia.\n   * @param {ScheduleInfo} scheduleInfo Informace z podÅ™Ã­zenÃ© strategie.\n   * @private\n   * @returns {ScheduleInfo} Informace pro pÅ™ehrÃ¡nÃ­ mÃ©dia.\n   */\n  getInfo (scheduleInfo) {\n    return scheduleInfo.merge({\n      layer: this.layer,\n      layout: this.layout\n    });\n  }\n\n  /** @inheritdoc */\n  go () {\n    const scheduleInfo = this.scheduleStrategy.go();\n    return this.getInfo(scheduleInfo);\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na pÅ™echod na dalÅ¡Ã­ slajd.\n   * @param {ScheduleInfo} scheduleInfo Informace potÅ™ebnÃ© k pÅ™ehrÃ¡nÃ­ slajdu, na kterÃ© byl proveden pÅ™echod.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onGone (scheduleInfo) {\n    this.emitter.emit('gone', this.getInfo(scheduleInfo));\n  }\n\n  /**\n   * Reakce na pÅ™ehrÃ¡nÃ­ slajdu.\n   * @param {ScheduleInfo} scheduleInfo Informace o slajdu, kterÃ½ byl pÅ™ehrÃ¡n.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onPlayed (scheduleInfo) {\n    this.emitter.emit('played', this.getInfo(scheduleInfo));\n  }\n\n  /** @inheritdoc */\n  plan (offset) {\n    return (\n      this.scheduleStrategy.plan(offset)\n      .map((scheduleInfo) => this.getInfo(scheduleInfo))\n    );\n  }\n\n  /** @inheritdoc */\n  skip () {\n    this.scheduleStrategy.skip();\n  }\n\n  /** @inheritdoc */\n  stop () {\n    this.scheduleStrategy.stop();\n  }\n\n  /** @inheritdoc */\n  toString () {\n    return `ScheduleLayer {layer: ${this.layer}}`;\n  }\n}\n\nexport default ScheduleLayer;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO #271 Importy pro prototypy.\n// import EventEmitter from 'eventemitter3';\n// import get from 'lodash/get';\n// import isNil from 'lodash/isNil';\n// import isObject from 'lodash/isObject';\n\n// import Numeric from '../numeric/numeric';\nimport ScheduleBackground from './schedule-background';\n// import ScheduleEmpty from './schedule-empty';\n// import ScheduleInfo from './schedule-info';\nimport ScheduleLayer from './schedule-layer';\n\n// TODO #271 Unit testy.\n/**\n * Utilita pro plÃ¡novÃ¡nÃ­ Å¡ablon.\n */\nclass ScheduleLayout {\n  /**\n   * Detekuje a vytvoÅ™Ã­ strategie pro Å¡ablonu.\n   * @param {DS} store DatovÃ½ sklad.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Array.<Layer>} layerArray Seznam vrstev.\n   * @param {Layout} layout Å ablona.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   * @returns {Array.<ScheduleStrategy>} Seznam detekovanÃ½ch strategiÃ­.\n   */\n  static createStrategies (store, session, layerArray, layout, viewerRegistry) {\n    // TODO #138 ZavÃ©st registry pro detekce strategiÃ­?\n    return (\n      layerArray.filter((layer) => layer.parentLayoutId === layout.id)\n      .map((layer) => new ScheduleLayer(store, session, layer, layout, viewerRegistry))\n      .concat(new ScheduleBackground(session, layout, viewerRegistry))\n    );\n  }\n}\n\nexport default ScheduleLayout;\n\n// TODO #271 Prototyp zpracovÃ¡nÃ­ se zobrazenÃ­m celÃ© Å¡ablony.\n// - NynÃ­ se jiÅ¾ ScheduleInfo#layout pouÅ¾Ã­vÃ¡ pro rodiÄ�ovskou Å¡ablonu. Refaktorizovat pÅ™ed pouÅ¾itÃ­m!\n// /**\n//  * Strategie pÅ™ehrÃ¡vÃ¡nÃ­ pro Å¡ablonu.\n//  * @implements {ScheduleStrategy}\n//  */\n// class ScheduleLayout {\n//   /**\n//    * VytvoÅ™Ã­ instanci.\n//    * @param {DS} store DatovÃ½ sklad.\n//    * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n//    * @param {Array.<Layer>} layerArray Seznam vÅ¡ech vrstev.\n//    * @param {Layout} layout Å ablona.\n//    * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n//    * @returns {ScheduleLayout} NovÃ¡ instance.\n//    */\n//   constructor (store, session, layerArray, layout, viewerRegistry) {\n//     if (!isObject(layout)) {\n//       throw new TypeError(`Invalid layout ${layout}.`);\n//     }\n//     this.emitter = new EventEmitter();\n//     this.layout = layout;\n//     this.schedulePlan = null;\n//     this.session = session;\n//     this.viewerRegistry = viewerRegistry;\n//   }\n\n//   /** @inheritdoc */\n//   destroy () {\n//     // NenÃ­ potÅ™eba nic ruÅ¡it.\n//     // PÅ™Ã­tomno pouze pro splnÄ›nÃ­ rozhranÃ­.\n//   }\n\n//   /**\n//    * UrÄ�Ã­ informace pro pÅ™ehrÃ¡nÃ­ mÃ©dia.\n//    * @param {number} cycleIndex PoÅ™adÃ­ cyklu, ke kterÃ©mu vytvoÅ™it informace.\n//    * @private\n//    * @returns {ScheduleInfo} Informace pro pÅ™ehrÃ¡nÃ­ mÃ©dia.\n//    */\n//   getInfo (cycleIndex) {\n//     const {layout} = this;\n//     // TODO #271 Hotfix zobrazenÃ­ Å¡ablony jako pozadÃ­.\n//     const {medium} = layout;\n//     if (isNil(medium)) {\n//       return new ScheduleInfo({\n//         cycleIndex,\n//         iterationIndex: 0,\n//         layout,\n//         session: this.session\n//       });\n//     }\n//     return new ScheduleInfo({\n//       cycleIndex,\n//       iterationIndex: 0,\n//       layout,\n//       medium,\n//       session: this.session,\n//       viewerRegistry: this.viewerRegistry\n//     });\n//   }\n\n//   /** @inheritdoc */\n//   go () {\n//     const fromSchedulePlan = this.schedulePlan;\n//     const fromCycleIndex = get(fromSchedulePlan, 'cycleIndex', null);\n//     const toCycleIndex = this.planCycleIndex(fromCycleIndex);\n//     const toSchedulePlan = {\n//       cycleIndex: toCycleIndex,\n//       scheduleInfo: this.getInfo(toCycleIndex)\n//     };\n//     const toScheduleInfo = toSchedulePlan.scheduleInfo;\n//     this.schedulePlan = toSchedulePlan;\n//     // VyvolÃ¡nÃ­ udÃ¡losti a vrÃ¡cenÃ­ vÃ½sledku.\n//     this.emitter.emit('gone', toScheduleInfo);\n//     return toScheduleInfo;\n//   }\n\n//   /** @inheritdoc */\n//   off (...args) {\n//     this.emitter.off(...args);\n//   }\n\n//   /** @inheritdoc */\n//   on (...args) {\n//     this.emitter.on(...args);\n//   }\n\n//   /** @inheritdoc */\n//   plan (offset) {\n//     if (!Numeric.isIndex(offset)) {\n//       throw new TypeError(`Invalid offset ${offset}.`);\n//     }\n//     return (\n//       Array(offset).fill()\n//       .reduce(\n//         (acc) => {\n//           const previousSchedulePlan = acc[acc.length - 1];\n//           const previousCycleIndex = get(previousSchedulePlan, 'cycleIndex', null);\n//           const cycleIndex = this.planCycleIndex(previousCycleIndex);\n//           const scheduleInfo = this.getInfo(cycleIndex);\n//           return acc.concat({cycleIndex, scheduleInfo});\n//         },\n//         [this.schedulePlan]\n//       )\n//       .slice(1)\n//       .map((schedulePlan) => schedulePlan.scheduleInfo)\n//     );\n//   }\n\n//   /**\n//    * NaplÃ¡nuje poÅ™adÃ­ cyklu nÃ¡sledujÃ­cÃ­ho slajdu.\n//    * @param {null|number} fromCycleIndex PoÅ™adÃ­ cyklu pÅ™edchozÃ­ho slajdu.\n//    * @private\n//    * @returns {number} PoÅ™adÃ­ cyklu.\n//    */\n//   planCycleIndex (fromCycleIndex) {\n//     if (isNil(fromCycleIndex)) {\n//       // Bez vÃ½chozÃ­ho cyklu se urÄ�ujÃ­ cykly od zaÄ�Ã¡tku. ÄŒÃ­slovÃ¡nÃ­ od nuly.\n//       return 0;\n//     }\n//     // PÅ™iÄ�tenÃ­ offsetu k aktuÃ¡lnÃ­mu cyklu.\n//     return fromCycleIndex + 1;\n//   }\n\n//   /** @inheritdoc */\n//   skip () {\n//     // NenÃ­ potÅ™eba nic pÅ™eskakovat.\n//     // PÅ™Ã­tomno pouze pro splnÄ›nÃ­ rozhranÃ­.\n//   }\n\n//   /** @inheritdoc */\n//   stop () {\n//     // NenÃ­ potÅ™eba nic zastavovat.\n//     // PÅ™Ã­tomno pouze pro splnÄ›nÃ­ rozhranÃ­.\n//   }\n\n//   /** @inheritdoc */\n//   toString () {\n//     return `ScheduleLayout {layout: ${this.layout}}`;\n//   }\n// }\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport get from 'lodash/get';\nimport isArray from 'lodash/isArray';\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\nimport sortBy from 'lodash/sortBy';\n\nimport Numeric from '../numeric/numeric';\n\nimport ScheduleInfo from './schedule-info';\nimport ScheduleTrack from './schedule-track';\n\n/**\n * Strategie pÅ™ehrÃ¡vÃ¡nÃ­ pro lineÃ¡rnÃ­ playlisty.\n * Jde o pomocnou tÅ™Ã­du pro playlisty, kterÃ© pÅ™ehrÃ¡vajÃ­ vÅ¡echny stopy v rÃ¡mci jednoho cyklu.\n * ÃšmoÅ¾Åˆuje zvolit zpÅ¯sob seÅ™azenÃ­ stop, kterÃ½ je pak stejnÃ½ pro vÅ¡echny pÅ™ehrÃ¡vacÃ­ cykly.\n * @implements {ScheduleStrategy}\n */\nclass ScheduleLinear {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {DS} store DatovÃ½ sklad.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Playlist} playlist Playlist pro aplikaci strategie.\n   * @param {Array.<Track>} trackArray Seznam stop playlistu pro aplikaci strategie. PoÅ™adÃ­ stop je pÅ™i plÃ¡novÃ¡nÃ­ dodrÅ¾eno.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   * @returns {ScheduleLinear} NovÃ¡ instance.\n   */\n  constructor (store, session, playlist, trackArray, viewerRegistry) {\n    if (!isObject(store)) {\n      throw new TypeError(`Invalid store \"${store}\".`);\n    }\n    if (!isObject(playlist)) {\n      throw new TypeError(`Invalid playlist \"${playlist}\".`);\n    }\n    if (!isArray(trackArray)) {\n      throw new TypeError(`Invalid track array \"${trackArray}\".`);\n    }\n    const scheduleEdgeArray = trackArray.map((track, index) => {\n      const scheduleStrategy = new ScheduleTrack(store, session, track, viewerRegistry);\n      return {\n        // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n        onPlayed: this.onPlayed.bind(this, scheduleStrategy),\n        scheduleStrategy\n      };\n    });\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    this.playlist = playlist;\n    this.scheduleEdgeArray = scheduleEdgeArray;\n    this.schedulePlan = null;\n    this.store = store;\n    // NaslouchÃ¡nÃ­ udÃ¡lostem.\n    scheduleEdgeArray.forEach((scheduleEdge) => {\n      scheduleEdge.scheduleStrategy.on('played', scheduleEdge.onPlayed);\n    });\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    this.scheduleEdgeArray.forEach((scheduleEdge) => {\n      const {scheduleStrategy} = scheduleEdge;\n      scheduleStrategy.off('played', scheduleEdge.onPlayed);\n      scheduleStrategy.destroy();\n    });\n  }\n\n  /**\n   * Najde poÅ™adÃ­ hrany v seznamu hran tÃ©to strategie.\n   * @param {ScheduleEdge} scheduleEdge Hrana, pro kterou se mÃ¡ urÄ�it poÅ™adÃ­.\n   * @private\n   * @returns {number} PoÅ™adÃ­ hrany.\n   */\n  findEdgeIndex (scheduleEdge) {\n    // UrÄ�enÃ­ indexu aktuÃ¡lnÃ­ stopy z vÃ½chozÃ­.\n    const scheduleEdgeIndex = this.scheduleEdgeArray.indexOf(scheduleEdge);\n    if (scheduleEdgeIndex === -1) {\n      throw new RangeError(`Playlist does not contain ${scheduleEdge.scheduleStrategy}.`);\n    }\n    return scheduleEdgeIndex;\n  }\n\n  /** @inheritdoc */\n  go () {\n    let toSchedulePlan;\n    const fromSchedulePlan = this.schedulePlan;\n    if (isNil(fromSchedulePlan)) {\n      // Pokud nenÃ­ nic naplÃ¡novÃ¡no, pÅ™ejde se na nÃ¡sledujÃ­cÃ­ (= prvnÃ­) slajd na tÃ©to Ãºrovni.\n      toSchedulePlan = this.goNext(fromSchedulePlan);\n    } else {\n      // Pokud je pÅ™Ã­tomnÃ½ plÃ¡n, tak se rozhodne dle jeho nÃ¡sledujÃ­cÃ­ho slajdu.\n      const {scheduleStrategy} = fromSchedulePlan.scheduleEdge;\n      const childScheduleInfo = scheduleStrategy.plan(1)[0];\n      // Detekce pÅ™eskoÄ�enÃ­ na dalÅ¡Ã­ stopu na tÃ©to Ãºrovni.\n      // BuÄ� pokud mÃ¡ aktuÃ¡lnÃ­ stopa prÃ¡zdnÃ½ obsah.\n      // Nebo pokud stopa pÅ™ehrÃ¡la vÅ¡echny slajdy v aktuÃ¡lnÃ­m cyklu.\n      if (childScheduleInfo.isEmpty() || (childScheduleInfo.getCycleIndex() > fromSchedulePlan.cycleIndex)) {\n        // ZastavÃ­ se vÅ¡echny Ä�asovaÄ�e v opouÅ¡tÄ›nÃ© vÄ›tvi.\n        scheduleStrategy.stop();\n        // PÅ™ejde se na dalÅ¡Ã­ stopu v aktuÃ¡lnÃ­ Ãºrovni.\n        toSchedulePlan = this.goNext(fromSchedulePlan);\n      } else {\n        // PÅ™ejde se na dalÅ¡Ã­ stopu ve vnitÅ™nÃ­m playlistu.\n        toSchedulePlan = this.goDeep(fromSchedulePlan);\n      }\n    }\n    // TODO #138 PÅ™epracovat pÅ™Ã­stup k prÃ¡zdnÃ©mu `SchedulePlan`.\n    const toScheduleInfo = get(toSchedulePlan, 'scheduleInfo', new ScheduleInfo());\n    this.schedulePlan = toSchedulePlan;\n    // VyvolÃ¡nÃ­ udÃ¡losti a vrÃ¡cenÃ­ vÃ½sledku.\n    this.emitter.emit('gone', toScheduleInfo);\n    return toScheduleInfo;\n  }\n\n  /**\n   * PÅ™echod na dalÅ¡Ã­ plÃ¡n ve vnitÅ™nÃ­m playlistu.\n   * @param {SchedulePlan} fromSchedulePlan PlÃ¡n, ze kterÃ©ho se vychÃ¡zÃ­.\n   * @private\n   * @returns {SchedulePlan} PlÃ¡n, na kterÃ½ se mÃ¡ provÃ©st pÅ™echod.\n   */\n  goDeep (fromSchedulePlan) {\n    const fromCycleIndex = fromSchedulePlan.cycleIndex;\n    const fromIterationIndex = fromSchedulePlan.iterationIndex;\n    const fromScheduleEdge = fromSchedulePlan.scheduleEdge;\n    const childScheduleInfo = fromScheduleEdge.scheduleStrategy.go();\n    const toIterationIndex = this.nextIterationIndex(fromCycleIndex, fromIterationIndex, fromCycleIndex);\n    return {\n      cycleIndex: fromCycleIndex,\n      iterationIndex: toIterationIndex,\n      scheduleEdge: fromScheduleEdge,\n      scheduleInfo: childScheduleInfo.merge({\n        cycleIndex: fromCycleIndex,\n        iterationIndex: toIterationIndex,\n        playlistArray: [this.playlist]\n      })\n    };\n  }\n\n  /**\n   * PÅ™echod na dalÅ¡Ã­ plÃ¡n v aktuÃ¡lnÃ­ Ãºrovni.\n   * @param {SchedulePlan} [fromSchedulePlan] PlÃ¡n, ze kterÃ©ho se vychÃ¡zÃ­.\n   * @private\n   * @returns {SchedulePlan|null} PlÃ¡n, na kterÃ½ se mÃ¡ provÃ©st pÅ™echod.\n   */\n  goNext (fromSchedulePlan) {\n    let toSchedulePlan;\n    const fromCycleIndex = get(fromSchedulePlan, 'cycleIndex');\n    const fromIterationIndex = get(fromSchedulePlan, 'iterationIndex');\n    const fromScheduleEdge = get(fromSchedulePlan, 'scheduleEdge', null);\n    const toScheduleEdgeIndex = this.nextEdgeIndex(fromScheduleEdge);\n    // SestavÃ­ se seznam stop seÅ™azenÃ½ od aktuÃ¡lnÄ› pÅ™ehrÃ¡vanÃ© stopy.\n    const {scheduleEdgeArray} = this;\n    scheduleEdgeArray.slice(toScheduleEdgeIndex)\n    .concat(scheduleEdgeArray.slice(0, toScheduleEdgeIndex))\n    // HledÃ¡ se stopa, kterÃ¡ umÃ­ naplÃ¡novat dalÅ¡Ã­ slajd. PrÃ¡zdnÃ© se pÅ™eskakujÃ­.\n    .some((scheduleEdge) => {\n      const childScheduleStrategy = scheduleEdge.scheduleStrategy;\n      const childScheduleInfo = childScheduleStrategy.go();\n      if (childScheduleInfo.isEmpty()) {\n        childScheduleStrategy.stop();\n        return false;\n      }\n      // VhodnÃ¡ stopa nalezena. VracÃ­ se jejÃ­ vÃ½sledek.\n      const toCycleIndex = this.nextCycleIndex(fromCycleIndex, fromScheduleEdge);\n      const toIterationIndex = this.nextIterationIndex(fromCycleIndex, fromIterationIndex, toCycleIndex);\n      toSchedulePlan = {\n        cycleIndex: toCycleIndex,\n        iterationIndex: toIterationIndex,\n        scheduleEdge,\n        scheduleInfo: childScheduleInfo.merge({\n          cycleIndex: toCycleIndex,\n          iterationIndex: toIterationIndex,\n          playlistArray: [this.playlist]\n        })\n      };\n      return true;\n    });\n    if (isNil(toSchedulePlan)) {\n      // Pokud se pÅ™eskoÄ�Ã­ vÅ¡echny stopy, tak se vracÃ­ prÃ¡zdnÃ½ slajd.\n      // TODO #138 PÅ™epracovat pÅ™Ã­stup k prÃ¡zdnÃ©mu `SchedulePlan`.\n      // - PÅ™idat pÅ™Ã­znak? Dovolit `null`? Zachovat hodnoty `cycleIndex` a dalÅ¡Ã­?\n      toSchedulePlan = null;\n    }\n    return toSchedulePlan;\n  }\n\n  /**\n   * OvÄ›Å™Ã­, jestli je hrana poslednÃ­ v seznamu hran tÃ©to strategie.\n   * @param {ScheduleEdge} scheduleEdge Hrana, pro kterou se mÃ¡ ovÄ›Å™it poÅ™adÃ­.\n   * @private\n   * @returns {number} PÅ™Ã­znak, jestli je hrana poslednÃ­.\n   */\n  isLastEdge (scheduleEdge) {\n    const {scheduleEdgeArray} = this;\n    const {length} = scheduleEdgeArray;\n    return length > 0 && scheduleEdge === scheduleEdgeArray[length - 1];\n  }\n\n  /**\n   * UrÄ�Ã­ poÅ™adÃ­ cyklu pro nÃ¡sledujÃ­cÃ­ plÃ¡n.\n   * UvaÅ¾uje pouze aktuÃ¡lnÃ­ ÃºroveÅˆ. Nekontroluje obsah vnitÅ™nÃ­ch strategiÃ­.\n   * @param {null|number} fromCycleIndex PoÅ™adÃ­ cyklu, ze kterÃ©ho se vychÃ¡zÃ­.\n   * @param {ScheduleEdge|null} fromScheduleEdge Hrana, ze kterÃ© se vychÃ¡zÃ­.\n   * @private\n   * @returns {number} PoÅ™adÃ­ cyklu, kterÃ© mÃ¡ nÃ¡sledujÃ­cÃ­ plÃ¡n.\n   */\n  nextCycleIndex (fromCycleIndex, fromScheduleEdge) {\n    if (isNil(fromCycleIndex) || isNil(fromScheduleEdge)) {\n      // Bez vÃ½chozÃ­ stopy se Ä�Ã­sluje od nuly.\n      return 0;\n    }\n    if (this.isLastEdge(fromScheduleEdge)) {\n      return fromCycleIndex + 1;\n    }\n    // UrÄ�enÃ­ cyklu aktuÃ¡lnÃ­ stopy z vÃ½chozÃ­.\n    return fromCycleIndex;\n  }\n\n  /**\n   * UrÄ�Ã­ poÅ™adÃ­ hrany pro nÃ¡sledujÃ­cÃ­ plÃ¡n.\n   * @param {ScheduleEdge|null} fromScheduleEdge Hrana, ze kterÃ© se vychÃ¡zÃ­.\n   * @private\n   * @returns {number} PoÅ™adÃ­ hrany, kterÃ© mÃ¡ nÃ¡sledujÃ­cÃ­ plÃ¡n.\n   */\n  nextEdgeIndex (fromScheduleEdge) {\n    if (isNil(fromScheduleEdge)) {\n      // Bez vÃ½chozÃ­ stopy se Ä�Ã­sluje od nuly.\n      return 0;\n    }\n    const scheduleEdgeIndex = this.findEdgeIndex(fromScheduleEdge);\n    return (scheduleEdgeIndex + 1) % this.scheduleEdgeArray.length;\n  }\n\n  /**\n   * UrÄ�Ã­ poÅ™adÃ­ iterace pro nÃ¡sledujÃ­cÃ­ plÃ¡n.\n   * @param {null|number} fromCycleIndex PoÅ™adÃ­ cyklu, ze kterÃ©ho se vychÃ¡zÃ­.\n   * @param {null|number} fromIterationIndex PoÅ™adÃ­ iterace, ze kterÃ©ho se vychÃ¡zÃ­.\n   * @param {number} toCycleIndex PoÅ™adÃ­ cyklu, kterÃ© mÃ¡ nÃ¡sledujÃ­cÃ­ plÃ¡n.\n   * @private\n   * @returns {number} PoÅ™adÃ­ iterace, kterÃ© mÃ¡ nÃ¡sledujÃ­cÃ­ plÃ¡n.\n   */\n  nextIterationIndex (fromCycleIndex, fromIterationIndex, toCycleIndex) {\n    if (fromCycleIndex === toCycleIndex) {\n      // Pokud se nespustil novÃ½ cyklus, tak se hodnota inkrementuje.\n      if (isNil(fromIterationIndex)) {\n        return 0;\n      }\n      return fromIterationIndex + 1;\n    }\n    if (isNil(fromCycleIndex) || fromCycleIndex < toCycleIndex) {\n      // Pokud jde o prvnÃ­ plÃ¡n, nebo se cyklus zvÃ½Å¡il, zaÄ�Ã­nÃ¡ se poÄ�Ã­tat od nuly.\n      return 0;\n    }\n    throw new Error(`Invalid cycle change from ${fromCycleIndex} to ${toCycleIndex}.`);\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na pÅ™ehrÃ¡nÃ­ slajdu.\n   * @param {ScheduleStrategy} scheduleStrategy VnitÅ™nÃ­ strategie, kterÃ¡ byla pÅ™ehrÃ¡na.\n   * @param {ScheduleInfo} scheduleInfo Informace o slajdu, kterÃ½ byl pÅ™ehrÃ¡n.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onPlayed (scheduleStrategy, scheduleInfo) {\n    const {schedulePlan} = this;\n    // Zkontroluje se, Å¾e udÃ¡lost pÅ™ichÃ¡zÃ­ z vÄ›tve aktivnÃ­ stopy.\n    if (scheduleStrategy !== schedulePlan.scheduleEdge.scheduleStrategy) {\n      throw new Error(`Unexpected played event from ${scheduleStrategy}.`);\n    }\n    // PÅ™edÃ¡nÃ­ udÃ¡losti o pÅ™ehrÃ¡nÃ­ vÃ½Å¡e.\n    this.emitter.emit('played', schedulePlan.scheduleInfo);\n  }\n\n  /** @inheritdoc */\n  plan (offset) {\n    if (!Numeric.isIndex(offset)) {\n      throw new TypeError(`Invalid offset ${offset}.`);\n    }\n    const {scheduleEdgeArray, schedulePlan} = this;\n    const fromCycleIndex = get(schedulePlan, 'cycleIndex');\n    const fromIterationIndex = get(schedulePlan, 'iterationIndex');\n    const fromScheduleEdge = get(schedulePlan, 'scheduleEdge', null);\n    // VÅ¡echny podÅ™azenÃ© stopy se seÅ™adÃ­ od aktuÃ¡lnÄ› pÅ™ehrÃ¡vanÃ© po pÅ™edchozÃ­.\n    // V tomto poÅ™adÃ­ se budou urÄ�ovat naplÃ¡novanÃ© informace.\n    let sliceIndex;\n    if (isNil(fromScheduleEdge)) {\n      sliceIndex = 0;\n    } else {\n      sliceIndex = this.findEdgeIndex(fromScheduleEdge);\n    }\n    return (\n      scheduleEdgeArray.slice(sliceIndex)\n      .concat(scheduleEdgeArray.slice(0, sliceIndex))\n      // NaplÃ¡nujÃ­ se informace ze vÅ¡ech stop v poÅ¾adovanÃ© dÃ©lce.\n      // ProvÃ¡dÃ­ se pouze jeden prÅ¯chod vÅ¡ech stop a jednorÃ¡zovÃ© urÄ�enÃ­ jejich plÃ¡novacÃ­ch informacÃ­.\n      // Informace z jednolivÃ½ch stop se spojÃ­ dohromady ve vÃ½slednÃ©m plÃ¡novacÃ­m poÅ™adÃ­.\n      // ZjednoduÅ¡enÃ¡ ukÃ¡zka oÄ�ekÃ¡vanÃ½ vÃ½stupÅ¯ pro nestedSuite a offset 7:\n      // - t3: m0, m0, m0, m0, m0, m0, m0\n      // - t6: m1, m1, m1, m1, m1, m1\n      // - t7: m2, m2, m2, m2, m2\n      // - t4: m1, m2, m1, m2, m1, m2\n      // - t5: m3, m3, m3, m3\n      // - t0: m0, m1, m2, m3, m0, m1, m2\n      // - t1: m4, m4, m4\n      // - t6: m1, m1\n      // - t7: m2\n      // - t2: m1, m2\n      // - result: m0, m1, m2, m3, m4, m1, m2\n      .reduce(\n        (acc, scheduleEdge) => {\n          const accCycleIndex = acc.cycleIndex;\n          const accOffest = acc.offset;\n          const childScheduleInfoArray = (\n            scheduleEdge.scheduleStrategy.plan(accOffest)\n            // TODO #138 PÅ™epracovat pÅ™Ã­stup k prÃ¡zdnÃ©mu `ScheduleInfo`.\n            // - Hotfix odfiltrovÃ¡nÃ­ prÃ¡zdnÃ½ch slajdÅ¯, kterÃ© nejde setÅ™Ã­dit podle `cycleIndex` a `iterationIndex`.\n            .filter((childScheduleInfo) => !childScheduleInfo.isEmpty())\n            // ProzatÃ­m se nahradÃ­ poÅ™adÃ­ v iteraci za Ä�Ã­slo stopy, aby Å¡lo podle nÄ›j Å™adit.\n            .map((childScheduleInfo) => childScheduleInfo.merge({iterationIndex: this.findEdgeIndex(scheduleEdge)}))\n          );\n          // Najdou se naplÃ¡novanÃ© informace, kterÃ© odpovÃ­dajÃ­ aktuÃ¡lnÃ­mu cyklu plÃ¡novaÄ�e.\n          // Tyto naplÃ¡novanÃ© informace budou najisto pouÅ¾ity ve vÃ½sledku plÃ¡novÃ¡nÃ­ tÃ©to ÃºrovnÄ›.\n          const foundOffset = (\n            childScheduleInfoArray.filter((scheduleInfo) => {\n              const cycleIndex = scheduleInfo.getCycleIndex();\n              if (isNil(accCycleIndex)) {\n                return cycleIndex === 0;\n              }\n              return cycleIndex === accCycleIndex;\n            })\n            .length\n          );\n          return {\n            cycleIndex: this.nextCycleIndex(accCycleIndex, scheduleEdge),\n            // Optimalizace vÃ½konu snÃ­Å¾enÃ­m poÄ�tu plÃ¡novanÃ½ch slajdÅ¯ v dalÅ¡Ã­ch stopÃ¡ch.\n            // NenÃ­ je tÅ™eba jiÅ¾ plÃ¡novat na celou dÃ©lku, protoÅ¾e jiÅ¾ poÅ¾adovanÃ© vÃ½sledky obsadili pÅ™edchozÃ­ stopy.\n            offset: accOffest - foundOffset,\n            // SlouÄ�Ã­ se naplÃ¡novanÃ½ obsah z rÅ¯znÃ½ch stop. DodrÅ¾uje se poÅ™adÃ­ naplÃ¡novÃ¡nÃ­.\n            // Ze slouÄ�enÃ©ho seznamu se odÅ™Ã­zne konec, kterÃ½ pÅ™esahuje poÅ¾adovanÃ© plÃ¡novÃ¡nÃ­.\n            // SniÅ¾uje se tÃ­m sloÅ¾itost na zatÅ™Ã­zenÃ­ dalÅ¡Ã­ stopy.\n            scheduleInfoArray: (\n              sortBy(acc.scheduleInfoArray.concat(childScheduleInfoArray), [\n                (scheduleInfo) => scheduleInfo.getCycleIndex(),\n                (scheduleInfo) => scheduleInfo.getIterationIndex()\n              ])\n              .slice(0, offset)\n            )\n          };\n        },\n        {\n          cycleIndex: fromCycleIndex,\n          offset,\n          scheduleInfoArray: []\n        }\n      )\n      .scheduleInfoArray\n      // NynÃ­ jsou znÃ¡mÃ© naplÃ¡novanÃ© informace a jejich cykly.\n      // DoplnÃ­ se poÅ™adÃ­ informacÃ­, tak jak byly za sebou v cyklech naplÃ¡novÃ¡ny.\n      // DÃ¡le se doplnÃ­ dalÅ¡Ã­ informace, kterÃ© byly v pÅ™edchozÃ­ch vÃ½poÄ�tech zbyteÄ�nÃ© (hlasitost).\n      .reduce(\n        (acc, scheduleInfo) => {\n          const previousScheduleInfo = acc[acc.length - 1];\n          let previousCycleIndex;\n          if (previousScheduleInfo.hasCycleIndex()) {\n            previousCycleIndex = previousScheduleInfo.getCycleIndex();\n          } else {\n            previousCycleIndex = null;\n          }\n          let previousIterationIndex;\n          if (previousScheduleInfo.hasIterationIndex()) {\n            previousIterationIndex = previousScheduleInfo.getIterationIndex();\n          } else {\n            previousIterationIndex = null;\n          }\n          const toScheduleInfo = scheduleInfo.merge({\n            iterationIndex: this.nextIterationIndex(previousCycleIndex, previousIterationIndex, scheduleInfo.getCycleIndex()),\n            playlistArray: [this.playlist]\n          });\n          return acc.concat(toScheduleInfo);\n        },\n        [new ScheduleInfo({cycleIndex: fromCycleIndex, iterationIndex: fromIterationIndex})]\n      )\n      .slice(1)\n      // TODO #138 PÅ™epracovat pÅ™Ã­stup k prÃ¡zdnÃ©mu `ScheduleInfo`.\n      // - Hotfix doplnÄ›nÃ­ prÃ¡zdnÃ½mi slajdy, pokud byly nÄ›jakÃ© odfiltrovÃ¡ny.\n      .concat(Array(offset).fill(new ScheduleInfo()))\n      .slice(0, offset)\n    );\n  }\n\n  /** @inheritdoc */\n  skip () {\n    // TODO #138 PokroÄ�ilÃ© zpracovÃ¡nÃ­ `#skip`:\n    // - AktuÃ¡lnÃ­ zpracovÃ¡nÃ­ nenÃ­ dokonalÃ©, ale vyhovuje poÅ¾adavkÅ¯m:\n    //   - MÅ¯Å¾e zacyklit, napÅ™. pokud by byl nÄ›jakÃ½ vnitÅ™nÃ­ playlist nekoneÄ�nÃ½ a nepÅ™eÅ¡el na dalÅ¡Ã­ `cycleIndex`.\n    //   - OvlivÅˆuje (nÄ›kdy!) Ä�asovaÄ�, coÅ¾ nemusÃ­ bÃ½t ÃºplnÄ› oÄ�ekÃ¡vanÃ© chovÃ¡nÃ­ pÅ™i pÅ™eskakovÃ¡nÃ­ cyklu.\n    //   - ZatÃ­m zmÄ›na Ä�asovaÄ�Å¯ nevadÃ­, protoÅ¾e se pak vÅ¾dy volÃ¡ `#stop`. Pro dopÅ™ednou kompatibilitu ponechÃ¡no mimo tuto metodu.\n    // - Byla zde snaha o zavedenÃ­ novÃ©ho algoritmu:\n    //   - VÅ¡em (nebo jen nÃ¡sledujÃ­cÃ­m) `scheduleEdge` se pÅ™epoÅ¡le informace, Å¾e se majÃ­ pÅ™eskoÄ�it.\n    //   - NÄ›jakÃ½m zpÅ¯sobem (testovÃ¡no nastavenÃ­m `scheduleEdge` na poslednÃ­) zajistit, aby pÅ™Ã­Å¡tÃ­ volÃ¡nÃ­ `#go` pÅ™eÅ¡lo na nÃ¡sledujÃ­cÃ­c cyklus.\n    // - NovÃ½ algoritmus ale pÅ™inesl Å™adu vedlejÅ¡Ã­ch problÃ©mÅ¯:\n    //   - U mÃ©diÃ­ je oÄ�ekÃ¡vÃ¡no, Å¾e `#skip` neprovede nic, tÃ­m pÃ¡dem ale zÅ¯stanou mÃ©dia v playlistu \"zaseknutÃ¡\" na pÅ™edchozÃ­m cyklu.\n    //   - To by tedy vyÅ¾adovalo pÅ™epracovÃ¡nÃ­ `#plan` algoritmu, aby tyto \"zaseknnutÃ¡\" mÃ©dia pÅ™eskoÄ�il, coÅ¾ by ho asi jeÅ¡tÄ› vÃ­ce zesloÅ¾itilo a zpomalilo.\n    //   - DalÅ¡Ã­ problÃ©m je s Ä�asovaÄ�em, pÅ™i vyvolÃ¡nÃ­ `played` udÃ¡losti na `scheduleEdge`, ze kterÃ© bylo volÃ¡no `#skip`.\n    //   - TakovÃ¡ udÃ¡lost by nesplÅˆovala podmÃ­ku, Å¾e `played` udÃ¡losti chodÃ­ jen z aktuÃ¡lnÃ­ho `scheduleEdge`.\n    //   - ProtoÅ¾e `scheduleEdge` jiÅ¾ mÅ¯Å¾e bÃ½t kvÅ¯li pÅ™eskoÄ�enÃ­ nastaven jinde (na poslednÃ­m `scheduleEdge`).\n    // - PoÅ¾adavky na algoritmus nejsou aktuÃ¡lnÄ› pÅ™Ã­liÅ¡ striktnÃ­. ZvÃ¡Å¾it do budoucna upÅ™esnÄ›nÃ­:\n    //   - MÃ¡ pÅ™eskoÄ�enÃ­ ovlivnit Ä�Ã­slovÃ¡nÃ­ `iterationIndex` v rodiÄ�ovskÃ©m playlistu?\n    //     - NapÅ™. je pÅ™ijatelnÃ½ vÃ½stup: 0, 1, 4, 5, 8, 19?\n    //     - Nebo vÅ¾dy dodrÅ¾ovat sekvenci: 0, 1, 2, 3, ...\n    //   - NechÃ¡vat ukazatel na poslednÃ­m, nebo na `null`? VÃ½kon a nekoneÄ�nost vs. vÃ½poÄ�et `iterationIndex`.\n    //   - ZvÃ¡Å¾it jestli pÅ™idat nÄ›jakou hodnotu na vÃ½stup (napÅ™. poslednÃ­ `#go`, poÄ�et pÅ™eskoÄ�enÃ½ch...)?\n    const fromSchedulePlan = this.schedulePlan;\n    if (!isNil(fromSchedulePlan)) {\n      while (true) {\n        const {scheduleEdge} = this.schedulePlan;\n        const {scheduleStrategy} = scheduleEdge;\n        const childScheduleInfo = scheduleStrategy.plan(1)[0];\n        if (this.isLastEdge(scheduleEdge) && (childScheduleInfo.isEmpty() || (childScheduleInfo.getCycleIndex() > fromSchedulePlan.cycleIndex))) {\n          break;\n        } else {\n          this.go();\n        }\n      }\n    }\n  }\n\n  /** @inheritdoc */\n  stop () {\n    const {schedulePlan} = this;\n    if (schedulePlan) {\n      const {scheduleStrategy} = schedulePlan.scheduleEdge;\n      scheduleStrategy.stop();\n    }\n  }\n\n  /** @inheritdoc */\n  toString () {\n    return `ScheduleLinear {playlist: ${this.playlist}}`;\n  }\n}\n\nexport default ScheduleLinear;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport TargetEnum from '../target-enum';\nimport TaskEnum from '../task/task-enum';\nimport ScheduleLayout from './schedule-layout';\nimport ScheduleMedium from './schedule-medium';\nimport ScheduleOrphan from './schedule-orphan';\nimport SchedulePlaylist from './schedule-playlist';\n\n// TODO #271 Schedule vrstvy:\n// 1. Vrstva Ãºloh (ScheduleManager)\n//   - Je tÅ™eba vybrat Ãºlohu, kterÃ¡ se mÃ¡ zobrazovat v nÄ›jakÃ©m okamÅ¾iku (teÄ�).\n//   - NynÃ­ se vybere vÅ¾dy jedna Ãºloha. NÃ¡slednÄ› bude propracovÃ¡no pÅ™i plÃ¡novÃ¡nÃ­ dle kalendÃ¡Å™e.\n// 2. Vrstva slotÅ¯ (ScheduleLayout)\n//   - RozdÄ›lenÃ­ plochy na paralelnÃ­ pÅ™ehrÃ¡vaÄ�e mÃ©diÃ­.\n//   - Dovolit zanoÅ™ovÃ¡nÃ­, nebo Å™eÅ¡it v plochÃ© struktuÅ™e?\n// 3. Vrstva strategiÃ­ (ScheduleStrategy)\n//   - SÃ©riovÃ© pÅ™ehrÃ¡vÃ¡nÃ­ mÃ©diÃ­.\n// TODO #271 ManaÅ¾er by mÄ›l spravovat ruÅ¡enÃ­ vytvoÅ™enÃ½ch ScheduleStrategy.\n// - NynÃ­ ho ruÅ¡Ã­ ViewerThread.\n/**\n * SprÃ¡vce plÃ¡novÃ¡nÃ­ obsahu.\n * ![Diagram tÅ™Ã­d](./core/schedule/schedule.doc.png)\n */\nclass ScheduleManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   */\n  constructor (viewerRegistry) {\n    this.viewerRegistry = viewerRegistry;\n  }\n\n  /**\n   * Detekuje a vytvoÅ™Ã­ strategie pro plÃ¡novÃ¡nÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ obsahu.\n   * @param {Array.<Layer>} layerArray Seznam vrstev.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {DS} store DatovÃ½ sklad.\n   * @param {Array.<Task>} taskArray Seznam Ãºloh.\n   * @returns {Array.<ScheduleStrategy>} Seznam detekovanÃ½ch strategiÃ­.\n   */\n  createStrategies (layerArray, session, store, taskArray) {\n    // Detekce Ãºlohy k pÅ™ehrÃ¡nÃ­.\n    const task = this.findTask(taskArray);\n    // TODO #138 ZavÃ©st registry pro detekce strategiÃ­?\n    if (isNil(task)) {\n      return [];\n    }\n    // TODO #138 ZavÃ©st registry pro detekce strategiÃ­?\n    const {viewerRegistry} = this;\n    const {layout, medium, playlist} = task;\n    const hasLayout = !isNil(layout);\n    const hasMedium = !isNil(medium);\n    const hasPlaylist = !isNil(playlist);\n    if (hasLayout && !hasMedium && !hasPlaylist) {\n      return ScheduleLayout.createStrategies(store, session, layerArray, layout, viewerRegistry);\n      // TODO #271 Jak v budoucnu zpracovat layout.playDuration?\n      // const scheduleLayout = new ScheduleLayout(store, session, layerArray, layout, this.viewerRegistry);\n      // return [new ScheduleOrphan(layout.playDuration, scheduleLayout)];\n    }\n    if (hasMedium && !hasLayout && !hasPlaylist) {\n      const scheduleMedium = new ScheduleMedium(session, medium, viewerRegistry);\n      return [new ScheduleOrphan(medium.playDuration, scheduleMedium)];\n    }\n    if (hasPlaylist && !hasLayout && !hasMedium) {\n      return [new SchedulePlaylist(store, session, playlist, viewerRegistry)];\n    }\n    throw new Error(`Unable to detect strategy for task ${task}.`);\n  }\n\n  /**\n   * Vybere hlavnÃ­ obsahovou Ãºlohu k pÅ™ehrÃ¡nÃ­ na zaÅ™Ã­zenÃ­.\n   * @param {Array.<Task>} taskArray Seznam Ãºloh k vÃ½bÄ›ru.\n   * @private\n   * @returns {Promise.<Task|null>} VybranÃ¡ Ãºloha.\n   */\n  findTask (taskArray) {\n    // TODO Do budoucna findTask(contentStore, date) => task\n    // - VyvolÃ¡vÃ¡nÃ­ udÃ¡lostÃ­, kdyÅ¾ bude tÅ™eba zmÄ›nit obsah apod.\n    // - Jak se zajistÃ­, Å¾e se ke stejnÃ©mu obsahu stÃ¡hnou binÃ¡rnÃ­ soubory?\n    // NalezenÃ­ vÅ¡ech dostupnÃ½ch obsahovÃ½ch Ãºloh.\n    const filteredTaskArray = taskArray.filter((task) => (\n      task.priority === -1 &&\n      task.targetEnum === TargetEnum.PRIMARY &&\n      task.taskEnum === TaskEnum.CONTENT\n    ));\n    // VÃ½bÄ›r obsahovÃ© Ãºlohy k pÅ™ehrÃ¡vÃ¡nÃ­.\n    switch (filteredTaskArray.length) {\n      case 0:\n        return null;\n      case 1:\n        return filteredTaskArray[0];\n      default:\n        throw new Error('Unexpected count of content tasks.');\n    }\n  }\n}\n\nexport default ScheduleManager;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport get from 'lodash/get';\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\n\nimport Numeric from '../numeric/numeric';\n\nimport ScheduleInfo from './schedule-info';\n\n/**\n * Strategie pÅ™ehrÃ¡vÃ¡nÃ­ pro libovolnÃ© mÃ©dium.\n * VhodnÃ© pro pouÅ¾itÃ­ jako samostatnÃ© mÃ©dium i v rÃ¡mci playlistu.\n * @implements {ScheduleStrategy}\n */\nclass ScheduleMedium {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Medium} medium MÃ©dium pro aplikaci strategie.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   * @returns {ScheduleMedium} NovÃ¡ instance.\n   */\n  constructor (session, medium, viewerRegistry) {\n    if (!isObject(session)) {\n      throw new TypeError(`Invalid session ${session}.`);\n    }\n    if (!isObject(medium)) {\n      throw new TypeError(`Invalid medium ${medium}.`);\n    }\n    if (!isObject(viewerRegistry)) {\n      throw new TypeError(`Invalid viewer registry ${viewerRegistry}.`);\n    }\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    this.medium = medium;\n    /**\n     * AktuÃ¡lnÄ› naplÃ¡novanÃ© pÅ™ehrÃ¡vÃ¡nÃ­.\n     * @private\n     * @type {SchedulePlan|null}\n     */\n    this.schedulePlan = null;\n    this.session = session;\n    this.viewerRegistry = viewerRegistry;\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // NenÃ­ potÅ™eba nic ruÅ¡it.\n    // PÅ™Ã­tomno pouze pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /**\n   * UrÄ�Ã­ informace pro pÅ™ehrÃ¡nÃ­ mÃ©dia.\n   * @param {number} cycleIndex PoÅ™adÃ­ cyklu, ke kterÃ©mu vytvoÅ™it informace.\n   * @private\n   * @returns {ScheduleInfo} Informace pro pÅ™ehrÃ¡nÃ­ mÃ©dia.\n   */\n  getInfo (cycleIndex) {\n    const {medium} = this;\n    // NapojenÃ­ na registr informacÃ­ o typu mÃ©diu.\n    return new ScheduleInfo({\n      cycleIndex,\n      iterationIndex: 0,\n      medium,\n      session: this.session,\n      viewerRegistry: this.viewerRegistry\n    });\n  }\n\n  /** @inheritdoc */\n  go () {\n    const fromSchedulePlan = this.schedulePlan;\n    const fromCycleIndex = get(fromSchedulePlan, 'cycleIndex', null);\n    const toCycleIndex = this.planCycleIndex(fromCycleIndex);\n    const toSchedulePlan = {\n      cycleIndex: toCycleIndex,\n      scheduleInfo: this.getInfo(toCycleIndex)\n    };\n    const toScheduleInfo = toSchedulePlan.scheduleInfo;\n    this.schedulePlan = toSchedulePlan;\n    // VyvolÃ¡nÃ­ udÃ¡losti a vrÃ¡cenÃ­ vÃ½sledku.\n    this.emitter.emit('gone', toScheduleInfo);\n    return toScheduleInfo;\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /** @inheritdoc */\n  plan (offset) {\n    if (!Numeric.isIndex(offset)) {\n      throw new TypeError(`Invalid offset ${offset}.`);\n    }\n    return (\n      Array(offset).fill()\n      .reduce(\n        (acc) => {\n          const previousSchedulePlan = acc[acc.length - 1];\n          const previousCycleIndex = get(previousSchedulePlan, 'cycleIndex', null);\n          const cycleIndex = this.planCycleIndex(previousCycleIndex);\n          const scheduleInfo = this.getInfo(cycleIndex);\n          return acc.concat({cycleIndex, scheduleInfo});\n        },\n        [this.schedulePlan]\n      )\n      .slice(1)\n      .map((schedulePlan) => schedulePlan.scheduleInfo)\n    );\n  }\n\n  /**\n   * NaplÃ¡nuje poÅ™adÃ­ cyklu nÃ¡sledujÃ­cÃ­ho slajdu.\n   * @param {null|number} fromCycleIndex PoÅ™adÃ­ cyklu pÅ™edchozÃ­ho slajdu.\n   * @private\n   * @returns {number} PoÅ™adÃ­ cyklu.\n   */\n  planCycleIndex (fromCycleIndex) {\n    if (isNil(fromCycleIndex)) {\n      // Bez vÃ½chozÃ­ho cyklu se urÄ�ujÃ­ cykly od zaÄ�Ã¡tku. ÄŒÃ­slovÃ¡nÃ­ od nuly.\n      return 0;\n    }\n    // PÅ™iÄ�tenÃ­ offsetu k aktuÃ¡lnÃ­mu cyklu.\n    return fromCycleIndex + 1;\n  }\n\n  /** @inheritdoc */\n  skip () {\n    // NenÃ­ potÅ™eba nic pÅ™eskakovat.\n    // PÅ™Ã­tomno pouze pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /** @inheritdoc */\n  stop () {\n    // NenÃ­ potÅ™eba nic zastavovat.\n    // PÅ™Ã­tomno pouze pro splnÄ›nÃ­ rozhranÃ­.\n  }\n\n  /** @inheritdoc */\n  toString () {\n    return `ScheduleMedium {medium: ${this.medium}}`;\n  }\n}\n\nexport default ScheduleMedium;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\n\nimport SchedulePlayer from './schedule-player';\n\n/**\n * Strategie pÅ™ehrÃ¡vÃ¡nÃ­ pro samostatnÃ© (osiÅ™elÃ©) mÃ©dium nebo Å¡ablonu.\n * PÅ™idÃ¡vÃ¡ k pÅ¯vodnÃ­ strategii vlastnÃ­ Ä�asovaÄ� pÅ™ehrÃ¡vÃ¡nÃ­.\n * V jinÃ© situaci nenÃ­ doba pÅ™ehrÃ¡vÃ¡nÃ­ pouÅ¾Ã­vÃ¡na.\n * @implements {ScheduleStrategy}\n */\nclass ScheduleOrphan {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {number} playDuration Doba pÅ™ehrÃ¡vÃ¡nÃ­ mÃ©dia nebo Å¡ablony. [ms]\n   * @param {ScheduleStrategy} scheduleStrategy Strategie pro pÅ™ehrÃ¡vÃ¡nÃ­ bez Ä�asovaÄ�e.\n   * @returns {ScheduleOrphan} NovÃ¡ instance.\n   */\n  constructor (playDuration, scheduleStrategy) {\n    const schedulePlayer = new SchedulePlayer();\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    this.playDuration = playDuration;\n    /**\n     * AktuÃ¡lnÃ­ informace o pÅ™ehrÃ¡vÃ¡nÃ­.\n     * @private\n     * @type {?ScheduleInfo}\n     */\n    this.scheduleInfo = null;\n    this.schedulePlayer = schedulePlayer;\n    this.scheduleStrategy = scheduleStrategy;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onGone = this.onGone.bind(this);\n    this.onPlayed = this.onPlayed.bind(this);\n    // NaslouchÃ¡nÃ­ udÃ¡lostem.\n    schedulePlayer.on('played', this.onPlayed);\n    scheduleStrategy.on('gone', this.onGone);\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    const {schedulePlayer, scheduleStrategy} = this;\n    schedulePlayer.off('played', this.onPlayed);\n    schedulePlayer.destroy();\n    scheduleStrategy.off('gone', this.onGone);\n    scheduleStrategy.destroy();\n  }\n\n  /** @inheritdoc */\n  go () {\n    const {schedulePlayer} = this;\n    // ZastavÃ­ se pÅ™Ã­padnÃ© pÅ™ehrÃ¡vÃ¡nÃ­ z pÅ™edchozÃ­ho cyklu.\n    schedulePlayer.stop();\n    // SpuÅ¡tÄ›nÃ­ novÃ©ho pÅ™ehrÃ¡vÃ¡nÃ­.\n    schedulePlayer.play(this.playDuration);\n    // PÅ™echod na dalÅ¡Ã­ slajd.\n    return this.scheduleStrategy.go();\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na pÅ™echod na dalÅ¡Ã­ slajd.\n   * @param {ScheduleInfo} scheduleInfo Informace potÅ™ebnÃ© k pÅ™ehrÃ¡nÃ­ slajdu, na kterÃ© byl proveden pÅ™echod.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onGone (scheduleInfo) {\n    this.scheduleInfo = scheduleInfo;\n    this.emitter.emit('gone', scheduleInfo);\n  }\n\n  /**\n   * Reakce na pÅ™ehrÃ¡nÃ­ slajdu.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onPlayed () {\n    this.emitter.emit('played', this.scheduleInfo);\n  }\n\n  /** @inheritdoc */\n  plan (offset) {\n    return this.scheduleStrategy.plan(offset);\n  }\n\n  /** @inheritdoc */\n  skip () {\n    this.scheduleStrategy.skip();\n  }\n\n  /** @inheritdoc */\n  stop () {\n    this.schedulePlayer.stop();\n  }\n\n  /** @inheritdoc */\n  toString () {\n    return `ScheduleOrphan {scheduleStrategy: ${this.scheduleStrategy}}`;\n  }\n}\n\nexport default ScheduleOrphan;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport isNil from 'lodash/isNil';\nimport isNumber from 'lodash/isNumber';\n\n/**\n * PÅ™ehrÃ¡vaÄ� plÃ¡novÃ¡nÃ­.\n * StarÃ¡ se Ä�asovaÄ� vyuÅ¾Ã­vanÃ½ k odpoÄ�tu Ä�asu pro pÅ™ehrÃ¡vÃ¡nÃ­ slajdÅ¯.\n * @implements {Destroyable}\n * @implements {EventBus}\n */\nclass SchedulePlayer {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @returns {SchedulePlayer} NovÃ¡ instance.\n   */\n  constructor () {\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    /**\n     * PÅ™Ã­znak, urÄ�ujÃ­cÃ­ jestli probÃ­hÃ¡ pÅ™ehrÃ¡vÃ¡nÃ­.\n     * @private\n     * @type {boolean}\n     */\n    this.playing = false;\n    /**\n     * ÄŒasovaÄ� pro pÅ™ehrÃ¡vÃ¡nÃ­.\n     * @private\n     * @type {?number}\n     */\n    this.timeout = null;\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    clearTimeout(this.timeout);\n    this.timeout = null;\n  }\n\n  /**\n   * UrÄ�Ã­, jestli probÃ­hÃ¡ pÅ™ehrÃ¡vÃ¡nÃ­.\n   * @returns {boolean} PÅ™Ã­znak, jestli probÃ­hÃ¡ pÅ™ehrÃ¡vÃ¡nÃ­.\n   */\n  isPlaying () {\n    return this.playing;\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na vyprÅ¡enÃ­ Ä�asovaÄ�e.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onTimeout () {\n    this.playing = false;\n    this.timeout = null;\n    this.emitter.emit('played');\n  }\n\n  /**\n   * SpustÃ­ pÅ™ehrÃ¡vÃ¡nÃ­.\n   * Pokud je urÄ�ena dÃ©lka pÅ™ehrÃ¡vÃ¡nÃ­, tak se naplÃ¡nuje konec.\n   * Pokud nenÃ­, tak je pÅ™ehrÃ¡vÃ¡no navÅ¾dy.\n   * @param {null|number} duration Doba pÅ™ehrÃ¡vÃ¡nÃ­.\n   * @returns {undefined} Nic.\n   */\n  play (duration) {\n    if (!isNil(duration) && !isNumber(duration)) {\n      throw new TypeError(`Invalid duration ${duration}.`);\n    }\n    if (this.playing) {\n      throw new Error('Already playing.');\n    }\n    if (duration > 0) {\n      this.timeout = setTimeout(() => this.onTimeout(), duration);\n    }\n    this.playing = true;\n  }\n\n  /**\n   * ZastavÃ­ pÅ™ehrÃ¡vÃ¡nÃ­.\n   * @returns {undefined} Nic.\n   */\n  stop () {\n    clearTimeout(this.timeout);\n    this.playing = false;\n    this.timeout = null;\n  }\n}\n\n/**\n * UplynutÃ­ Ä�asovaÄ�e pÅ™ehrÃ¡vÃ¡nÃ­.\n * @event SchedulePlayer#played\n */\n\nexport default SchedulePlayer;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isObject from 'lodash/isObject';\n\nimport ScheduleEnum from './schedule-enum';\nimport ScheduleRandom from './schedule-random';\nimport ScheduleStatic from './schedule-static';\n\n/**\n * Strategie pÅ™ehrÃ¡vÃ¡nÃ­ pro playlist.\n * Å˜Ã­zenÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ zaloÅ¾enÃ© na zobrazenÃ­ jednoho playlistu s libovolnÃ½m typem.\n * Strategie automaticky zjiÅ¡Å¥uje jakÃ©ho je playlist typu a dle toho plÃ¡nuje.\n * @implements {ScheduleStrategy}\n */\nclass SchedulePlaylist {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {DS} store DatovÃ½ sklad.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Playlist} playlist Playlist pro aplikaci strategie.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   * @returns {SchedulePlaylist} NovÃ¡ instance.\n   */\n  constructor (store, session, playlist, viewerRegistry) {\n    if (!isObject(store)) {\n      throw new TypeError(`Invalid store ${store}.`);\n    }\n    if (!isObject(playlist)) {\n      throw new TypeError(`Invalid playlist ${playlist}.`);\n    }\n    // VyhledÃ¡nÃ­ stop playlistu.\n    const trackArray = SchedulePlaylist.getTrackArray(store, playlist);\n    // NastavenÃ­ vhodnÃ© strategie.\n    this.scheduleStrategy = SchedulePlaylist.detectStrategy(store, session, playlist, trackArray, viewerRegistry);\n  }\n\n  /**\n   * ZjistÃ­ seznam stopy playlistu z datovÃ©ho skladu.\n   * @param {DS} store DatovÃ½ sklad.\n   * @param {Playlist} playlist Playlist pro vÃ½bÄ›r stop.\n   * @private\n   * @returns {Array.<Track>} Seznam stop.\n   */\n  static getTrackArray (store, playlist) {\n    return (\n      // TODO #151 PÅ™epracovat na ContentInfo.\n      // - PÅ™edÃ¡vat v konstruktorech mÃ­sto `store` a `session`.\n      // - Jde o poslednÃ­ zÃ¡vislost Schedule na Store.\n      // - Store asi ponechat, kdyby v budoucnu bylo potÅ™eba nÄ›co uklÃ¡dat.\n      store.filter('track')\n      .filter((track) => track.parentPlaylistId === playlist.id)\n    );\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    this.scheduleStrategy.destroy();\n  }\n\n  /**\n   * Detekuje strategii pro playlist a vytvoÅ™Ã­ jejÃ­ instanci.\n   * @param {DS} store DatovÃ½ sklad.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Playlist} playlist Playlist pro detekci strategie.\n   * @param {Array.<Track>} trackArray Seznam stop playlistu pro detekci strategie.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   * @private\n   * @returns {ScheduleStrategy} DetekovanÃ¡ strategie plÃ¡novÃ¡nÃ­.\n   */\n  static detectStrategy (store, session, playlist, trackArray, viewerRegistry) {\n    // TODO #138 ZavÃ©st registry pro detekce strategiÃ­?\n    // Z playlistu se stopami se podle scheduleEnum zjistÃ­, kterou strategii pouÅ¾Ã­t.\n    switch (playlist.scheduleEnum) {\n      case ScheduleEnum.RANDOM:\n        return new ScheduleRandom(store, session, playlist, trackArray, viewerRegistry);\n      // DynamickÃ© playlisty jsou zatÃ­m plÃ¡novÃ¡ny jako statickÃ©.\n      case ScheduleEnum.DYNAMIC:\n      case ScheduleEnum.STATIC:\n        return new ScheduleStatic(store, session, playlist, trackArray, viewerRegistry);\n      default:\n        throw new Error(`Unable to detect strategy for playlist ${playlist}.`);\n    }\n  }\n\n  /** @inheritdoc */\n  go () {\n    return this.scheduleStrategy.go();\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.scheduleStrategy.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.scheduleStrategy.on(...args);\n  }\n\n  /** @inheritdoc */\n  plan (offset) {\n    return this.scheduleStrategy.plan(offset);\n  }\n\n  /** @inheritdoc */\n  skip () {\n    this.scheduleStrategy.skip();\n  }\n\n  /** @inheritdoc */\n  stop () {\n    this.scheduleStrategy.stop();\n  }\n\n  /** @inheritdoc */\n  toString () {\n    return `SchedulePlaylist {playlist: ${this.playlist}}`;\n  }\n}\n\nexport default SchedulePlaylist;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isArray from 'lodash/isArray';\nimport shuffle from 'lodash/shuffle';\n\nimport ScheduleLinear from './schedule-linear';\n\n/**\n * NÃ¡hodnÃ¡ strategie pÅ™ehrÃ¡vÃ¡nÃ­.\n * Å˜Ã­zenÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ kterÃ© pÅ™ehrÃ¡nÃ¡ mÃ©dia v nÃ¡hodnÃ©m poÅ™adÃ­.\n * PoÅ™adÃ­ je nÃ¡hodnÄ› vygenerovÃ¡no pÅ™i vytvoÅ™enÃ­ a pak dodrÅ¾ovÃ¡no.\n * @implements {ScheduleStrategy}\n */\nclass ScheduleRandom {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {DS} store DatovÃ½ sklad.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Playlist} playlist Playlist pro aplikaci strategie.\n   * @param {Array.<Track>} trackArray Seznam stop playlistu pro aplikaci strategie. Na poÅ™adÃ­ nezÃ¡leÅ¾Ã­.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   * @returns {ScheduleRandom} NovÃ¡ instance.\n   */\n  constructor (store, session, playlist, trackArray, viewerRegistry) {\n    if (!isArray(trackArray)) {\n      throw new TypeError(`Invalid track array ${trackArray}.`);\n    }\n    this.scheduleLinear = new ScheduleLinear(store, session, playlist, shuffle(trackArray), viewerRegistry);\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    this.scheduleLinear.destroy();\n  }\n\n  /** @inheritdoc */\n  go () {\n    return this.scheduleLinear.go();\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.scheduleLinear.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.scheduleLinear.on(...args);\n  }\n\n  /** @inheritdoc */\n  plan (offset) {\n    return this.scheduleLinear.plan(offset);\n  }\n\n  /** @inheritdoc */\n  skip () {\n    this.scheduleLinear.skip();\n  }\n\n  /** @inheritdoc */\n  stop () {\n    this.scheduleLinear.stop();\n  }\n\n  /** @inheritdoc */\n  toString () {\n    return `ScheduleRandom {playlist: ${this.playlist}}`;\n  }\n}\n\nexport default ScheduleRandom;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isArray from 'lodash/isArray';\n\nimport ScheduleLinear from './schedule-linear';\n\n/**\n * StatickÃ¡ strategie pÅ™ehrÃ¡vÃ¡nÃ­.\n * Å˜Ã­zenÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ zaloÅ¾enÃ© na poÅ™adÃ­ stop v rÃ¡mci playlistu.\n * @implements {ScheduleStrategy}\n */\nclass ScheduleStatic {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {DS} store DatovÃ½ sklad.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Playlist} playlist Playlist pro aplikaci strategie.\n   * @param {Array.<Track>} trackArray Seznam stop playlistu pro aplikaci strategie. Na poÅ™adÃ­ nezÃ¡leÅ¾Ã­.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   * @returns {ScheduleStatic} NovÃ¡ instance.\n   */\n  constructor (store, session, playlist, trackArray, viewerRegistry) {\n    if (!isArray(trackArray)) {\n      throw new TypeError(`Invalid track array ${trackArray}.`);\n    }\n    const sortedTrackArray = trackArray.sort((a, b) => a.index - b.index);\n    this.scheduleLinear = new ScheduleLinear(store, session, playlist, sortedTrackArray, viewerRegistry);\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    this.scheduleLinear.destroy();\n  }\n\n  /** @inheritdoc */\n  go () {\n    return this.scheduleLinear.go();\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.scheduleLinear.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.scheduleLinear.on(...args);\n  }\n\n  /** @inheritdoc */\n  plan (offset) {\n    return this.scheduleLinear.plan(offset);\n  }\n\n  /** @inheritdoc */\n  skip () {\n    this.scheduleLinear.skip();\n  }\n\n  /** @inheritdoc */\n  stop () {\n    this.scheduleLinear.stop();\n  }\n\n  /** @inheritdoc */\n  toString () {\n    return `ScheduleStatic {playlist: ${this.playlist}}`;\n  }\n}\n\nexport default ScheduleStatic;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\n\nimport ScheduleEmpty from './schedule-empty';\nimport ScheduleMedium from './schedule-medium';\nimport SchedulePlayer from './schedule-player';\nimport SchedulePlaylist from './schedule-playlist';\n\n/**\n * Strategie pÅ™ehrÃ¡vÃ¡nÃ­ pro obsahovou Ãºlohu.\n * Strategie automaticky zjiÅ¡Å¥uje jakÃ©ho je Ãºloha typu a dle toho plÃ¡nuje.\n * @implements {ScheduleStrategy}\n */\nclass ScheduleTrack {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {DS} store DatovÃ½ sklad.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Track} track Stopa pro aplikaci strategie.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   * @returns {ScheduleTrack} NovÃ¡ instance.\n   */\n  constructor (store, session, track, viewerRegistry) {\n    if (!isObject(track)) {\n      throw new TypeError(`Invalid track ${track}.`);\n    }\n    const schedulePlayer = new SchedulePlayer();\n    const scheduleStrategy = ScheduleTrack.detectStrategy(store, session, track, viewerRegistry);\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    this.scheduleInfo = null;\n    this.schedulePlayer = schedulePlayer;\n    this.scheduleStrategy = scheduleStrategy;\n    this.track = track;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onPlayerPlayed = this.onPlayerPlayed.bind(this);\n    this.onStrategyPlayed = this.onStrategyPlayed.bind(this);\n    // NaslouchÃ¡nÃ­ udÃ¡lostem.\n    schedulePlayer.on('played', this.onPlayerPlayed);\n    scheduleStrategy.on('played', this.onStrategyPlayed);\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    const {schedulePlayer, scheduleStrategy} = this;\n    schedulePlayer.off('played', this.onPlayerPlayed);\n    scheduleStrategy.off('played', this.onStrategyPlayed);\n    schedulePlayer.destroy();\n    scheduleStrategy.destroy();\n  }\n\n  /**\n   * Detekuje strategii pro stopu playlistu a vytvoÅ™Ã­ jejÃ­ instanci.\n   * @param {DS} store DatovÃ½ sklad.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Track} track Stopa pro detekci strategie.\n   * @param {ViewerRegistry} viewerRegistry Registr informacÃ­ o typech mÃ©diÃ­.\n   * @private\n   * @returns {ScheduleStrategy} DetekovanÃ¡ strategie plÃ¡novÃ¡nÃ­.\n   */\n  static detectStrategy (store, session, track, viewerRegistry) {\n    // TODO #138 ZavÃ©st registry pro detekce strategiÃ­?\n    const {childPlaylist, layout, medium} = track;\n    const hasMedium = !isNil(medium);\n    const hasPlaylist = !isNil(childPlaylist);\n    const hasLayout = !isNil(layout);\n    if (hasMedium && !hasPlaylist && !hasLayout) {\n      return new ScheduleMedium(session, medium, viewerRegistry);\n    }\n    if (hasPlaylist && !hasMedium && !hasLayout) {\n      return new SchedulePlaylist(store, session, childPlaylist, viewerRegistry);\n    }\n    if (hasLayout && !hasMedium && !hasPlaylist) {\n      // TODO #271 Å ablony v playlistech.\n      return new ScheduleEmpty();\n    }\n    throw new Error(`Unable to detect strategy for track ${track}.`);\n  }\n\n  /**\n   * UrÄ�Ã­ informace pro pÅ™ehrÃ¡nÃ­ mÃ©dia.\n   * @param {ScheduleInfo} childScheduleInfo Informace z niÅ¾Å¡Ã­ch ÃºrovnÃ­.\n   * @private\n   * @returns {ScheduleInfo} Informace pro pÅ™ehrÃ¡nÃ­ mÃ©dia.\n   */\n  getInfo (childScheduleInfo) {\n    return childScheduleInfo.merge({\n      trackArray: [this.track]\n    });\n  }\n\n  /** @inheritdoc */\n  go () {\n    const childScheduleInfo = this.scheduleStrategy.go();\n    const toScheduleInfo = this.getInfo(childScheduleInfo);\n    // ÄŒasovaÄ� ignoruje pÅ™echody mezi slajdy.\n    // OdpoÄ�Ã­tÃ¡vÃ¡ celkovÃ½ Ä�as od prvnÃ­ho `#go`, aÅ¾ po uplynutÃ­, nebo volÃ¡nÃ­ `#stop`.\n    // ZastavenÃ­ musÃ­ Å™eÅ¡it nadÅ™azenÃ¡ strategie. NapÅ™. lineÃ¡rnÃ­ playlist zastavuje stopu po pÅ™echodu na dalÅ¡Ã­.\n    if (!this.schedulePlayer.isPlaying()) {\n      this.schedulePlayer.play(this.track.playDuration);\n    }\n    this.scheduleInfo = toScheduleInfo;\n    // TODO #138 PokroÄ�ilÃ© zpracovÃ¡nÃ­ `#skip`:\n    // - Zde dochÃ¡zÃ­ k odfiltrovÃ¡nÃ­ `gone` udÃ¡lostÃ­ z podÅ™azenÃ© strategie.\n    // - VyvolÃ¡vajÃ­ se pouze `gone` udÃ¡losti, kterÃ© vznikly na tÃ©to strategii.\n    // - DÅ¯vodem je, Å¾e `#skip` vyvolÃ¡vÃ¡ `gone` udÃ¡losti, kterÃ© je neÅ¾Ã¡doucÃ­ pÅ™edÃ¡vat vÃ½Å¡e.\n    // - LepÅ¡Ã­m Å™eÅ¡enÃ­m by bylo naslouchat na `gone` z podÅ™azenÃ© strategie, neÅ¾ zde vytvÃ¡Å™et vlastnÃ­.\n    this.emitter.emit('gone', toScheduleInfo);\n    return toScheduleInfo;\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na pÅ™ehrÃ¡nÃ­ Ä�asovaÄ�e aktuÃ¡lnÃ­ stopy.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onPlayerPlayed () {\n    this.scheduleStrategy.skip();\n    this.scheduleStrategy.stop();\n    this.emitter.emit('played', this.scheduleInfo);\n  }\n\n  /**\n   * Reakce na pÅ™ehrÃ¡nÃ­ vnitÅ™nÃ­ strategie.\n   * @param {ScheduleInfo} scheduleInfo Informace o slajdu, kterÃ½ byl pÅ™ehrÃ¡n.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onStrategyPlayed (scheduleInfo) {\n    this.emitter.emit('played', scheduleInfo);\n  }\n\n  /** @inheritdoc */\n  plan (offset) {\n    return (\n      this.scheduleStrategy.plan(offset)\n      .map((childScheduleInfo) => this.getInfo(childScheduleInfo))\n    );\n  }\n\n  /** @inheritdoc */\n  skip () {\n    this.scheduleStrategy.skip();\n  }\n\n  /** @inheritdoc */\n  stop () {\n    this.schedulePlayer.stop();\n    this.scheduleStrategy.stop();\n  }\n\n  /** @inheritdoc */\n  toString () {\n    return `ScheduleTrack {track: ${this.track}}`;\n  }\n}\n\nexport default ScheduleTrack;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na zaznamenÃ¡vaÄ�e vÃ½jimek pro Sentry API.\n */\nclass SentryLoggerFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {SentryBrowser} Sentry\n   * @param {Class.<SentryLogger>} SentryLogger\n   * @param {ErrorLevel} captureErrorLevel ÃšroveÅˆ dÅ¯leÅ¾itosti chyby,\n   * od kterÃ© se zaÄ�Ã­najÃ­ odesÃ­lat udÃ¡losti na Sentry.\n   * @param {ErrorLevelFactory} errorLevelFactory\n   * @param {SentryOfflineIntegration} offlineIntegration\n   * @param {SentrySeverityFactory} severityFactory\n   * @param {SentryVueIntegration} vueIntegration\n   */\n  constructor (\n    Sentry, SentryLogger, captureErrorLevel, errorLevelFactory,\n    offlineIntegration, severityFactory, vueIntegration\n  ) {\n    this.Sentry = Sentry;\n    this.SentryLogger = SentryLogger;\n    this.captureErrorLevel = captureErrorLevel;\n    this.errorLevelFactory = errorLevelFactory;\n    this.offlineIntegration = offlineIntegration;\n    this.severityFactory = severityFactory;\n    this.vueIntegration = vueIntegration;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ zaznamenÃ¡vaÄ� vÃ½jimek.\n   * @param {string} dsn Sentry DSN adresa k odesÃ­lÃ¡nÃ­ zÃ¡znamÅ¯.\n   * @returns {SentryLogger}\n   */\n  create (dsn) {\n    return new this.SentryLogger(\n      this.Sentry, this.captureErrorLevel, dsn, this.errorLevelFactory,\n      this.offlineIntegration, this.severityFactory, this.vueIntegration\n    );\n  }\n}\n\nexport default SentryLoggerFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isError from 'lodash/isError';\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\nimport isString from 'lodash/isString';\n\nimport PlatformUtil from '../../platform/platform-util';\nimport EnvUtil from '../env-util';\nimport UpdatePlatformUtil from '../update/update-platform-util';\n\nimport ErrorLevel from '../error/error-level';\n\n// TODO ChybÃ­ unit testy:\n// - PÅ¯vodnÃ­ myÅ¡lenka byla takovÃ¡, Å¾e se pro testy zachovÃ¡ originÃ¡lnÃ­\n//   Sentry knihovna a bude se mockovat fetch, jako vÃ½stup z tÃ©to knihovny.\n//   To ale bohuÅ¾el nenÃ­ moÅ¾nÃ©, protoÅ¾e Sentry nedovoluje opakovanou\n//   inicializaci, stejnÄ› jako nepodporuje zruÅ¡enÃ­ jiÅ¾ inicializovanÃ© instance.\n//   ProblÃ©my s opakovanou inicializacÃ­ se tÃ½kajÃ­ napÅ™. nevyvolÃ¡nÃ­ metody\n//   `setupOnce` v integracÃ­ch.\n//   V kombinaci naslouchÃ¡nÃ­ naudÃ¡losti `error` u `window` a dalÅ¡Ã­,\n//   nenÃ­ vhodnÃ© tuto knihovnu inicializovat v rÃ¡mci unit testÅ¯.\n// - DalÅ¡Ã­ variantou je tedy vytvoÅ™enÃ­ mocku Sentry API.\n/**\n * ZaznamenÃ¡vaÄ� vÃ½jimek pro Sentry API.\n * OdesÃ­lÃ¡ chyby na Sentry server.\n * @implements {Logger}\n */\nclass SentryLogger {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {SentryBrowser} Sentry\n   * @param {ErrorLevel} captureErrorLevel ÃšroveÅˆ dÅ¯leÅ¾itosti chyby,\n   * od kterÃ© se zaÄ�Ã­najÃ­ odesÃ­lat udÃ¡losti na Sentry.\n   * @param {string} dsn Sentry DSN adresa k odesÃ­lÃ¡nÃ­ zÃ¡znamÅ¯.\n   * @param {ErrorLevelFactory} errorLevelFactory\n   * @param {SentryOfflineIntegration} offlineIntegration\n   * @param {SentrySeverityFactory} severityFactory\n   * @param {SentryVueIntegration} vueIntegration\n   */\n  constructor (\n    Sentry, captureErrorLevel, dsn, errorLevelFactory,\n    offlineIntegration, severityFactory, vueIntegration\n  ) {\n    // TODO Sentry integrace umÄ›jÃ­ fungovat pouze s vÃ½chozÃ­m hubem.\n    // - NenÃ­ tedy moÅ¾nÃ© pouÅ¾Ã­vat vÃ­ce instancÃ­ zÃ½roveÅˆ.\n    // - https://github.com/getsentry/sentry-javascript/issues/2389\n    Sentry.init({\n      dsn,\n      integrations: (integrations) => [\n        ...integrations,\n        vueIntegration,\n        offlineIntegration\n      ]\n    });\n    offlineIntegration.sendEvents();\n    const hub = Sentry.getCurrentHub();\n    const client = hub.getClient();\n    this.captureErrorLevel = captureErrorLevel;\n    this.client = client;\n    this.errorLevelFactory = errorLevelFactory;\n    this.hub = hub;\n    this.severityFactory = severityFactory;\n  }\n\n  /**\n   * ZaznamenÃ¡ libovolnou hodnotu,\n   * pÅ™iÄ�emÅ¾ se hodnota ÃºrovnÄ› chyby pouÅ¾ije primÃ¡rnÄ› z tÃ©to hodnoty\n   * a sekundÃ¡rnÄ› z nÃ¡zvu metody zanamenÃ¡vaÄ�e chyb,\n   * pÅ™es kterou byla chyba pÅ™edÃ¡na.\n   * @param {ErrorLevel} methodLevel ÃšroveÅˆ chyby, kterÃ¡ pÅ™Ã­sluÅ¡Ã­ metodÄ›,\n   * kterÃ¡ byla na zaznamenÃ¡vaÄ�i vÃ½jimek volÃ¡na.\n   * @param {*} value\n   * @private\n   * @returns {undefined}\n   */\n  capture (methodLevel, value) {\n    const valueLevel = this.errorLevelFactory.fromValue(value);\n    const level = valueLevel || methodLevel;\n    if (isError(value)) {\n      return this.captureError(level, value);\n    }\n    if (isObject(value)) {\n      return this.captureObject(level, value);\n    }\n    return this.captureString(level, String(value));\n  }\n\n  /**\n   * ZaznamenÃ¡ chybovÃ½ objekt s poÅ¾adovanou ÃºrovnÃ­ dÅ¯leÅ¾itosti.\n   * @param {ErrorLevel} level\n   * @param {Error} error\n   * @private\n   * @returns {undefined}\n   */\n  captureError (level, error) {\n    const {hub} = this;\n    const severity = this.severityFactory.fromErrorLevel(level);\n    if (this.isBreadcrumb(level)) {\n      hub.addBreadcrumb({\n        message: error.toString(),\n        level: severity\n      });\n      return;\n    }\n    hub.withScope((scope) => {\n      scope.setLevel(severity);\n      hub.captureException(error);\n    });\n  }\n\n  /**\n   * ZaznamenÃ¡ obecnÃ½ objekt s poÅ¾adovanou ÃºrovnÃ­ dÅ¯leÅ¾itosti.\n   * @param {ErrorLevel} level\n   * @param {Object} object\n   * @private\n   * @returns {undefined}\n   */\n  captureObject (level, object) {\n    const {message, name} = object;\n    if (!isString(message)) {\n      return this.captureString(level, String(object));\n    }\n    if (!isString(name)) {\n      return this.captureString(level, message);\n    }\n    return this.captureString(level, `${name}: ${message}`);\n  }\n\n  /**\n   * ZaznamenÃ¡ Å™etÄ›zec s poÅ¾adovanou ÃºrovnÃ­ dÅ¯leÅ¾itosti.\n   * @param {ErrorLevel} level\n   * @param {string} string\n   * @private\n   * @returns {undefined}\n   */\n  captureString (level, string) {\n    const {hub} = this;\n    const severity = this.severityFactory.fromErrorLevel(level);\n    if (this.isBreadcrumb(level)) {\n      hub.addBreadcrumb({message: string, level: severity});\n      return;\n    }\n    hub.captureMessage(string, severity);\n  }\n\n  /** @inheritdoc */\n  debug (value) {\n    return this.capture(ErrorLevel.Debug, value);\n  }\n\n  /** @inheritdoc */\n  error (value) {\n    return this.capture(ErrorLevel.Error, value);\n  }\n\n  /** @inheritdoc */\n  info (value) {\n    return this.capture(ErrorLevel.Info, value);\n  }\n\n  /**\n   * UrÄ�Ã­, jestli se mÃ¡ danÃ¡ ÃºroveÅˆ dÅ¯leÅ¾itosti zalogovat jako Sentry\n   * breadcrumb, kterÃ¡ se samostatnÄ› neodesÃ­lÃ¡ na server, nebo jako plnohodnotnÃ¡\n   * chyba, kterÃ¡ se ihned odeÅ¡le na server i s pÅ™edchozÃ­mi breadcrumb.\n   * @param {ErrorLevel} level\n   * @private\n   * @returns {boolean}\n   */\n  isBreadcrumb (level) {\n    return this.errorLevelFactory.compare(level, this.captureErrorLevel) === -1;\n  }\n\n  /** @inheritdoc */\n  log (value) {\n    return this.capture(ErrorLevel.Log, value);\n  }\n\n  /**\n   * @param {string} [buildId]\n   * @private\n   * @returns {undefined}\n   */\n  setBuildId (buildId) {\n    if (isNil(buildId)) {\n      return;\n    }\n    this.hub.setExtra('buildId', buildId);\n  }\n\n  /**\n   * @param {string} [deviceId]\n   * @private\n   * @returns {undefined}\n   */\n  setDeviceId (deviceId) {\n    if (isNil(deviceId)) {\n      return;\n    }\n    this.hub.setUser({id: deviceId});\n  }\n\n  /**\n   * @param {EnvEnum} [envEnum]\n   * @private\n   * @returns {undefined}\n   */\n  setEnvEnum (envEnum) {\n    if (isNil(envEnum)) {\n      return;\n    }\n    // TODO ZmÄ›na environment po inicializaci nenÃ­ oficiÃ¡lnÄ› podporovÃ¡na.\n    // - https://github.com/getsentry/sentry-javascript/issues/2388\n    // eslint-disable-next-line no-underscore-dangle\n    this.client._options.environment = EnvUtil.generate(envEnum);\n  }\n\n  /** @inheritdoc */\n  setInfo (loggerInfo) {\n    this.setBuildId(loggerInfo.buildId);\n    this.setDeviceId(loggerInfo.deviceId);\n    this.setEnvEnum(loggerInfo.envEnum);\n    this.setManufacturer(loggerInfo.manufacturer);\n    this.setModelName(loggerInfo.modelName);\n    this.setOnline(loggerInfo.online);\n    this.setRuntimePlatform(loggerInfo.runtimePlatform);\n    this.setUpdatePlatform(loggerInfo.updatePlatform);\n    this.setUpdateUrl(loggerInfo.updateUrl);\n    this.setVersion(loggerInfo.version);\n  }\n\n  /**\n   * @param {string} [manufacturer]\n   * @private\n   * @returns {undefined}\n   */\n  setManufacturer (manufacturer) {\n    if (isNil(manufacturer)) {\n      return;\n    }\n    this.hub.setExtra('manufacturer', manufacturer);\n  }\n\n  /**\n   * @param {string} [modelName]\n   * @private\n   * @returns {undefined}\n   */\n  setModelName (modelName) {\n    if (isNil(modelName)) {\n      return;\n    }\n    this.hub.setExtra('modelName', modelName);\n  }\n\n  /**\n   * @param {boolean} [online]\n   * @private\n   * @returns {undefined}\n   */\n  setOnline (online) {\n    if (isNil(online)) {\n      return;\n    }\n    this.hub.setExtra('online', online);\n  }\n\n  /**\n   * @param {Platform} [runtimePlatform]\n   * @private\n   * @returns {undefined}\n   */\n  setRuntimePlatform (runtimePlatform) {\n    if (isNil(runtimePlatform)) {\n      return;\n    }\n    this.hub.setExtra(\n      'runtimePlatform',\n      PlatformUtil.generate(runtimePlatform)\n    );\n  }\n\n  /**\n   * @param {UpdatePlatform} [updatePlatform]\n   * @private\n   * @returns {undefined}\n   */\n  setUpdatePlatform (updatePlatform) {\n    if (isNil(updatePlatform)) {\n      return;\n    }\n    this.hub.setExtra(\n      'updatePlatform',\n      UpdatePlatformUtil.generate(updatePlatform)\n    );\n  }\n\n  /**\n   * @param {Url} [updateUrl]\n   * @private\n   * @returns {undefined}\n   */\n  setUpdateUrl (updateUrl) {\n    if (isNil(updateUrl)) {\n      return;\n    }\n    this.hub.setExtra('updateUrl', updateUrl);\n  }\n\n  /**\n   * @param {string} [version]\n   * @private\n   * @returns {undefined}\n   */\n  setVersion (version) {\n    if (isNil(version)) {\n      return;\n    }\n    // TODO ZmÄ›na release po inicializaci nenÃ­ oficiÃ¡lnÄ› podporovÃ¡na.\n    // - https://github.com/getsentry/sentry-javascript/issues/2387\n    // eslint-disable-next-line no-underscore-dangle\n    this.client._options.release = version;\n  }\n\n  /** @inheritdoc */\n  warn (value) {\n    return this.capture(ErrorLevel.Warning, value);\n  }\n}\n\nexport default SentryLogger;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport {timestampWithMs} from '@sentry/utils';\n\n/**\n * Sentry integration for browser which saves the error events to LocalStorage\n * when the device is offline and resends them when it goes back online.\n *\n * This integration should be inserted as last in the integrations array,\n * because it won't back up changes made to events by any latter integrations.\n *\n * You should call method `sendEvents` to try send the stored events after\n * the Sentry is inicialized.\n * Integration can't do that on it's own.\n *\n * You should add the integration only to the current Sentry hub,\n * due to the limitations of integrations API.\n * The restored events will be reported using the hub which was current during\n * the integration setup.\n *\n * ```javascript\n * const offlineIntegration = new SentryOfflineIntegration();\n * Sentry.init({\n *   dsn: 'https://...',\n *   integrations: (integrations) => [...integrations, offlineIntegration]\n * })\n * offlineIntegration.sendEvents();\n * ```\n */\nclass SentryOfflineIntegration {\n  /**\n   * @param {Object} [opts={}]\n   * @param {EventTarget} [opts.eventTarget] Source of online / offline events\n   * @param {string} [opts.key] Storage key, where the Sentry events are stored.\n   * @param {number} [opts.maxEvents] Maximum of Sentry events stored.\n   * High values can fill up the storage and disable the back-up.\n   * @param {NavigatorOnLine} [opts.navigator] Provider of current onLine value\n   * @param {Storage} [opts.storage] Web Storage for backing up Sentry events\n   */\n  constructor ({\n    eventTarget = window,\n    key = 'SentryOfflineIntegration',\n    maxEvents = 5,\n    navigator = window.navigator,\n    storage = window.localStorage\n  } = {}) {\n    this.eventTarget = eventTarget;\n    this.hub = null;\n    this.key = key;\n    this.maxEvents = maxEvents;\n    this.name = SentryOfflineIntegration.id;\n    this.navigator = navigator;\n    this.storage = storage;\n  }\n\n  /**\n   * Clear all Sentry events from the storage.\n   * @private\n   * @returns {undefined}\n   */\n  clearEvents () {\n    this.storage.removeItem(this.key);\n  }\n\n  /**\n   * Process the global Sentry event and back it up, if necessary.\n   * @param {SentryEvent} event\n   * @private\n   * @returns {SentryEvent|null} Processed event or null to ignore it\n   */\n  processEvent (event) {\n    // If the device is online, do nothing and send the event immediately.\n    if (this.navigator.onLine) {\n      return event;\n    }\n    // If the device is offline, add the event to the backup.\n    this.storeEvent(event);\n    return null;\n  }\n\n  /**\n   * Restore all Sentry events from the storage.\n   * @private\n   * @returns {Array.<SentryEvent>}\n   */\n  restoreEvents () {\n    const json = this.storage.getItem(this.key);\n    if (json === null) {\n      return [];\n    }\n    return JSON.parse(json);\n  }\n\n  /**\n   * Send all stored Sentry events to server and clear them from the storage.\n   * Events are sent at once, Sentry should handle queing etc.\n   * You can use this method to send the stored events after client setup.\n   * @returns {undefined}\n   */\n  sendEvents () {\n    const {hub} = this;\n    const client = hub.getClient();\n    if (!client) {\n      // Do not send the events if hub is not initialized.\n      return;\n    }\n    const dsn = client.getDsn();\n    if (!dsn) {\n      // Do not send the events if client doesn't have DSN.\n      return;\n    }\n    if (!this.navigator.onLine) {\n      // Do not send the events when offline.\n      return;\n    }\n    const events = this.restoreEvents();\n    events.forEach((event) => hub.captureEvent(event));\n    this.clearEvents();\n  }\n\n  /**\n   * Setup the Sentry integration.\n   * @param {Function} addGlobalEventProcessor\n   * @param {Function} getCurrentHub\n   * @returns {undefined}\n   */\n  setupOnce (addGlobalEventProcessor, getCurrentHub) {\n    // Try to use the hub, where the integration was created.\n    this.hub = getCurrentHub();\n    // Start processing the events.\n    addGlobalEventProcessor((...args) => this.processEvent(...args));\n    // Start watching for online events.\n    this.eventTarget.addEventListener('online', () => this.sendEvents());\n  }\n\n  /**\n   * Store Sentry event in the storage.\n   * This can remove the oldest backed up event, if maximum is reached.\n   * @param {SentryEvent} event\n   * @private\n   * @returns {undefined}\n   */\n  storeEvent (event) {\n    // Ensure the event timestamp is set to time, when the event is processed,\n    // otherwise it will be set to time when the event is sent.\n    event.timestamp = timestampWithMs();\n    // Add the event to persistent backup.\n    const events = (\n      this.restoreEvents()\n      .concat(event)\n      .slice(-1 * this.maxEvents)\n    );\n    const json = JSON.stringify(events);\n    this.storage.setItem(this.key, json);\n  }\n}\n\nSentryOfflineIntegration.id = 'Offline';\n\nexport default SentryOfflineIntegration;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ErrorLevel from '../error/error-level';\nimport SentrySeverity from './sentry-severity';\n\n/**\n * TovÃ¡rna na ÃºrovnÄ› chyb v Sentry API.\n */\nclass SentrySeverityFactory {\n  /**\n   * VytvoÅ™Ã­ Sentry ÃºroveÅˆ chyby z obecnÃ©ho Ä�Ã­selnÃ­ku chyb.\n   * @param {ErrorLevel} errorLevel\n   * @returns {SentrySeverity}\n   */\n  fromErrorLevel (errorLevel) {\n    switch (errorLevel) {\n      case ErrorLevel.Debug:\n        return SentrySeverity.Debug;\n      case ErrorLevel.Error:\n        return SentrySeverity.Error;\n      case ErrorLevel.Info:\n        return SentrySeverity.Info;\n      case ErrorLevel.Log:\n        return SentrySeverity.Log;\n      case ErrorLevel.Warning:\n        return SentrySeverity.Warning;\n      default:\n        throw new RangeError(`Unknown error level \"${errorLevel}\".`);\n    }\n  }\n}\n\nexport default SentrySeverityFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Sentry ÃºroveÅˆ chyby.\n *\n * Zdroje:\n * - [TypeScript rozhranÃ­](https://github.com/getsentry/sentry-javascript/blob/master/packages/types/src/severity.ts)\n * - [Dokumentace](https://docs.sentry.io/platforms/javascript/#level)\n * @enum {string}\n */\nconst SentrySeverity = {\n  Critical: 'critical',\n  Debug: 'debug',\n  Error: 'error',\n  Fatal: 'fatal',\n  Info: 'info',\n  Log: 'log',\n  Warning: 'warning'\n};\n\nexport default SentrySeverity;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nexport default {\n  name: 'session',\n  methods: {\n    isInstalled () {\n      return !isNil(this.deviceId) && !isNil(this.serverUrl);\n    }\n  }\n};\n","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna pro vytvÃ¡Å™enÃ­ chybovÃ½ch objektÅ¯ pÅ™i registraci zaÅ™Ã­zenÃ­.\n */\nclass SetupErrorFactory {\n  /**\n   * VytvoÅ™Ã­ instanci tovÃ¡rny.\n   * @param {Class.<SetupError>} SetupError Konstruktor registraÄ�nÃ­ chyby.\n   */\n  constructor (SetupError) {\n    this.SetupError = SetupError;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ chybovÃ½ objekt.\n   * @param {SetupErrorType} type\n   * @returns {SetupError}\n   */\n  create (type) {\n    return new this.SetupError(type);\n  }\n}\n\nexport default SetupErrorFactory;\n","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k typÅ¯ chyb pÅ™i registraci zaÅ™Ã­zenÃ­ na serveru.\n * @enum {string}\n */\nconst SetupErrorType = {\n  /** ChybÃ­ otisk zaÅ™Ã­zenÃ­. */\n  AccessCodeMissing: 'AccessCodeMissing',\n  /** ZaÅ™Ã­zenÃ­ s danÃ½m ID je jiÅ¾ registrovÃ¡no. */\n  DeviceExists: 'DeviceExists',\n  /** PÅ™ekroÄ�en poÄ�et povolenÃ½ch licencÃ­. */\n  DeviceLimitExceeded: 'DeviceLimitExceeded',\n  /** ZaÅ™Ã­zenÃ­ jiÅ¾ bylo registrovÃ¡no v jinÃ© organizaci. */\n  DeviceRegistered: 'DeviceRegistered',\n  /** Nelze pÅ™idat zaÅ™Ã­zenÃ­ do organizace. */\n  OrganizationInvalid: 'OrganizationInvalid',\n  /** NeexistujÃ­cÃ­ organizace. */\n  OrganizationMissing: 'OrganizationMissing',\n  /** NeplatnÃ½ poÅ¾adavek. */\n  RequestInvalid: 'RequestInvalid',\n  /** Chyba pÅ™i uklÃ¡dÃ¡nÃ­. */\n  SaveError: 'SaveError',\n  /** NeplatnÃ© pÅ™ihlaÅ¡ovacÃ­ Ãºdaje. */\n  UserInvalid: 'UserInvalid'\n};\n\nexport default SetupErrorType;\n","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport ErrorName from '../error/error-name';\nimport SetupErrorType from './setup-error-type';\n\n// TODO AktuÃ¡lnÃ­ Babel 6.26 nepodporuje `class SetupError extends Error`.\n// - Proto je zatÃ­m jako hotfix pouÅ¾ito ES5 zpracovÃ¡nÃ­.\n// - Do budoucna buÄ� aktualizovat Babel,\n//   nebo vyÄ�lenit do nÄ›jakÃ©ho univerzÃ¡lnÃ­ho Å™eÅ¡enÃ­ pro vlastnÃ­ error objekty.\n// TODO Mohlo by bÃ½t zpracovÃ¡no lÃ©pe z pohledu OOP, neÅ¾ jen jako Ä�Ã­selnÃ­k se switch.\n// - VyÅ¾adovalo by nasazenÃ­ jednoduchÃ©ho zpÅ¯sobu jak rozÅ¡iÅ™ovat Error.\n// - Spousta nativnÃ­ch errorÅ¯ takÃ© pouÅ¾Ã­vÃ¡ internÃ­ kÃ³dy napÅ™. MediaError, DOMException.\n// - Kompromis mezi opakovÃ¡nÃ­m kÃ³du, OOP good-practices a sloÅ¾itostÃ­.\n// - Po omezenÃ­ funkcionality navÃ­c nakonec nenÃ­ pÅ™Ã­liÅ¡ vyuÅ¾Ã­vÃ¡no.\n//   ZatÃ­m ponechÃ¡no minimÃ¡lnÄ› jako zÃ¡klad pro budoucÃ­ vlastnÃ­ error.\n/**\n * Chyba vyskytujÃ­cÃ­ se pÅ™i registraci zaÅ™Ã­zenÃ­ na serveru.\n * @class\n * @classdesc VytvoÅ™Ã­ instanci.\n * @implements {Error}\n * @name SetupError\n * @param {SetupErrorType} type\n */\nfunction SetupError (type) {\n  const message = SetupError.getMessage(type);\n  // VytvoÅ™Ã­ se nativnÃ­ error, kterÃ½ mÃ¡ schopnost zachytit zÃ¡sobnÃ­k volÃ¡nÃ­.\n  const error = new Error(message);\n  // NastavÃ­ se nÃ¡zev nativnÃ­mu error objektu, aby se zobrazil v jeho zprÃ¡vÄ›.\n  error.name = ErrorName.SetupError;\n  // Definuje se vlastnost se zprÃ¡vou jako u nativnÃ­ho objektu.\n  if (!isNil(message)) {\n    Object.defineProperty(this, 'message', {\n      configurable: true,\n      value: error.message,\n      writable: true\n    });\n  }\n  // Definuje se vlastnost se zÃ¡sobnÃ­kem jako u nativnÃ­ho objektu.\n  // InternÄ› se pÅ™i vyhodnocenÃ­ zÃ¡sobnÃ­ku pouÅ¾ije pÅ™ipravenÃ¡ zprÃ¡va.\n  Object.defineProperty(this, 'stack', {\n    configurable: true,\n    value: error.stack,\n    writable: true\n  });\n}\n\n/**\n * ZjistÃ­ zprÃ¡vu dle typu chyby.\n * @function\n * @name SetupError.getMessage\n * @param {SetupErrorType} type\n * @returns {?string}\n */\nSetupError.getMessage = function getMessage (type) {\n  switch (type) {\n    case SetupErrorType.AccessCodeMissing:\n      return 'Missing device access code.';\n    case SetupErrorType.DeviceExists:\n      return 'Device ID already exists.';\n    case SetupErrorType.DeviceLimitExceeded:\n      return 'License limit for number of devices was exceeded.';\n    case SetupErrorType.DeviceRegistered:\n      return 'Device is already registered.';\n    case SetupErrorType.OrganizationInvalid:\n      return 'Unable to add the device to organization.';\n    case SetupErrorType.OrganizationMissing:\n      return 'Missing device organization.';\n    case SetupErrorType.RequestInvalid:\n      return 'Invalid request format.';\n    case SetupErrorType.SaveError:\n      return 'Unable to save the device.';\n    case SetupErrorType.UserInvalid:\n      return 'Invalid username or password.';\n    default:\n      // Ve vÃ½chozÃ­m stavu nenÃ­ definovÃ¡no.\n  }\n};\n\nSetupError.prototype = Object.create(Error.prototype, {\n  constructor: {\n    configurable: true,\n    value: SetupError,\n    writable: true\n  },\n  message: {\n    configurable: true,\n    value: '',\n    writable: true\n  },\n  name: {\n    configurable: true,\n    value: ErrorName.SetupError,\n    writable: true\n  },\n  toString: {\n    configurable: true,\n    value: function toString () {\n      return this.error.toString();\n    },\n    writable: true\n  }\n});\n\nexport default SetupError;\n","module.exports = \"<div class=\\\"container container--narrow setup-failure\\\">\\n  <div class=\\\"wrap wrap-large\\\">\\n    <div class=\\\"gap-large\\\">\\n      <div class=\\\"gap-base\\\">\\n          <span class=\\\"icon icon-warning setup-icon setup-icon--failure\\\"></span>\\n      </div>\\n      <div class=\\\"gap-base\\\">\\n        <span v-text=\\\"message\\\"></span>\\n        Retry after <countdown-root\\n          v-bind:end=\\\"retryTime\\\"\\n          v-on:end=\\\"onEnd\\\"\\n        ></countdown-root>...\\n      </div>\\n    </div>\\n    <div class=\\\"grid grid-inline grid-base gap-large\\\">\\n      <div class=\\\"grid-item align-y-top width-1-2\\\">\\n        <button\\n          type=\\\"button\\\"\\n          class=\\\"button button--secondary\\\"\\n          v-focus\\n          v-on:click=\\\"onBack\\\"\\n        >Back</button>\\n      </div>\\n      <div class=\\\"grid-item align-y-top width-1-2\\\">\\n        <button\\n          type=\\\"button\\\"\\n          class=\\\"button\\\"\\n          v-on:click=\\\"onRetry\\\"\\n        >Retry now</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport CountdownRoot from '../countdown/countdown-root';\nimport focus from '../focus/focus-directive';\nimport template from './setup-failure.html';\n\nexport default {\n  name: 'SetupFailure',\n  template,\n  components: {CountdownRoot},\n  directives: {focus},\n  methods: {\n    onBack () {\n      this.$emit('back');\n    },\n    onEnd () {\n      this.retry();\n    },\n    onRetry () {\n      this.retry();\n    },\n    retry () {\n      this.$emit('retry');\n    }\n  },\n  props: ['message', 'retryTime']\n};\n","module.exports = \"<header class=\\\"grid grid-inline grid-base align-x-left\\\">\\n  <div class=\\\"grid-item width-1-6\\\">\\n    <button\\n      type=\\\"button\\\"\\n      class=\\\"button button--square\\\"\\n      v-on:click=\\\"onBack\\\"\\n    ><span class=\\\"icon icon-arrow-left\\\"></span></button>\\n  </div>\\n  <div class=\\\"grid-item width-5-6 align-y-center\\\">\\n    <div v-text=\\\"title\\\"></div>\\n    <div v-if=\\\"!isOnline\\\" class=\\\"header-alert gap-tiny\\\">\\n      <span class=\\\"icon icon-warning\\\"></span>\\n      Manual setup requires internet connection\\n    </div>\\n  </div>\\n</header>\\n\";","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport template from './setup-header.html';\n\nexport default {\n  name: 'SetupHeader',\n  template,\n  methods: {\n    onBack () {\n      this.$emit('back');\n    }\n  },\n  props: ['isOnline', 'title']\n};\n","module.exports = __webpack_public_path__ + \"assets/924178c7.svg\";","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\nimport isNil from 'lodash/isNil';\n\nimport SetupErrorType from './setup-error-type';\n\n/**\n * PomocnÃ¡ tÅ™ida pro registraci zaÅ™Ã­zenÃ­ na vzdÃ¡lenÃ©m serveru.\n */\nclass SetupManager {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {OrganizationHelper} organizationHelper PomocnÃ­k pro zpracovÃ¡nÃ­ struktury organizacÃ­.\n   * @param {SetupErrorFactory} errorFactory TovÃ¡rna na chybovÃ© objekty.\n   * @returns {SetupManager} NovÃ¡ instance.\n   */\n  constructor (organizationHelper, errorFactory) {\n    this.errorFactory = errorFactory;\n    this.organizationHelper = organizationHelper;\n  }\n\n  /**\n   * VytvoÅ™Ã­ chybovÃ½ objekt pro selhÃ¡nÃ­ pÅ™i registraci.\n   * @param {number} status HTTP status kÃ³d chybnÃ© registrace.\n   * @param {string} text TÄ›lo odpovÄ›di chybnÃ© registrace jako prostÃ½ text.\n   * @private\n   * @returns {Error}\n   */\n  createError (status, text) {\n    const errorType = this.parseErrorType(text);\n    if (isNil(errorType)) {\n      return new Error(`HTTP status ${status}.`);\n    }\n    return this.errorFactory.create(errorType);\n  }\n\n  /**\n   * ZjistÃ­ seznam organizacÃ­ na serveru, do kterÃ½ch lze zaÅ™Ã­zenÃ­ pÅ™iÅ™adit.\n   * @param {string} serverUrl Adresa serveru, na kterÃ©m se zaÅ™Ã­zenÃ­ registruje.\n   * @param {string} username JmÃ©no uÅ¾ivatele na serveru.\n   * @param {string} password Heslo uÅ¾ivatele na serveru.\n   * @returns {Promise.<Array.<Organization>>} Seznam organizacÃ­.\n   * @throws {SetupError} PÅ™i registraci se vyskytla chyba.\n   */\n  fetchOrganizations (serverUrl, username, password) {\n    return new Promise((resolve) => resolve(\n      // OdeÅ¡le se poÅ¾adavek s pÅ™ihlaÅ¡ovacÃ­mi Ãºdaji na server.\n      fetch(`${serverUrl}/api/register/verify`, {\n        body: JSON.stringify({username, password}),\n        headers: {'Content-type': 'application/json'},\n        method: 'POST'\n      })\n      .then((response) => {\n        // Pokud je odpovÄ›Ä� v poÅ™Ã¡dku, pokusÃ­me se ji zpracovat jako JSON.\n        if (response.ok) {\n          return (\n            response.json()\n            .then((json) => this.parseOrganizations(json))\n          );\n        }\n        // JakÃ¡koliv jinÃ¡ odpovÄ›Ä� serveru se povaÅ¾uje za chybu.\n        // VytvoÅ™Ã­ se specifickÃ¡ chyba s dodateÄ�nÃ½mi informacemi, kterÃ© server nahlÃ¡sil.\n        return (\n          response.text()\n          .then((text) => {\n            throw this.createError(response.status, text);\n          })\n        );\n      })\n    ));\n  }\n\n  /**\n   * ZjistÃ­ URL adresu pro registraci zaÅ™Ã­zenÃ­ na serveru pomocÃ­ QR kÃ³du.\n   * Adresa se mÃ¡ otevÅ™Ã­t v prohlÃ­Å¾eÄ�i pÅ™es kterÃ© se provede vytvoÅ™enÃ­ zaÅ™Ã­zenÃ­.\n   * @param {string} serverUrl Adresa serveru, na kterÃ©m se zaÅ™Ã­zenÃ­ registruje.\n   * @param {string} fingerprint JedineÄ�nÃ½ otisk zaÅ™Ã­zenÃ­, kterÃ½ se mÃ¡ zaregistrovat.\n   * @returns {string} URL pro manuÃ¡lnÃ­ registraci.\n   */\n  getQrUrl (serverUrl, fingerprint) {\n    return `${serverUrl}/api/register/url/lighter/${fingerprint}`;\n  }\n\n  /**\n   * ZjistÃ­ typ chyby registrace.\n   * @param {string} text TÄ›lo odpovÄ›di chybnÃ© registrace jako prostÃ½ text.\n   * @private\n   * @returns {SetupErrorType}\n   */\n  parseErrorType (text) {\n    switch (text) {\n      case 'device.alreadyExists':\n        return SetupErrorType.DeviceExists;\n      case 'device.alreadyRegistered':\n        return SetupErrorType.DeviceRegistered;\n      case 'device.missingAccessCode':\n        return SetupErrorType.AccessCodeMissing;\n      case 'device.saveError':\n        return SetupErrorType.SaveError;\n      case 'organization.deviceLimitExceeded':\n        return SetupErrorType.DeviceLimitExceeded;\n      case 'organization.invalid':\n        return SetupErrorType.OrganizationInvalid;\n      case 'organization.missingOrganization':\n        return SetupErrorType.OrganizationMissing;\n      case 'request.invalid':\n        return SetupErrorType.RequestInvalid;\n      case 'user.invalid':\n        return SetupErrorType.UserInvalid;\n      default:\n        // NeznÃ¡mÃ½ typ chyby\n    }\n  }\n\n  /**\n   * ZjistÃ­ identifikÃ¡tor zaÅ™Ã­zenÃ­ z ÃºspÄ›Å¡nÃ© registrace.\n   * @param {Object} json TÄ›lo odpovÄ›di ÃºspÄ›Å¡nÃ© registrace jako JSON objekt.\n   * @private\n   * @returns {string}\n   */\n  parseDeviceId (json) {\n    return json.device.deviceId;\n  }\n\n  /**\n   * ZjistÃ­ seznam organizacÃ­ z ÃºspÄ›Å¡nÃ© odpovÄ›di.\n   * @param {Object} json TÄ›lo odpovÄ›di ÃºspÄ›Å¡nÄ› staÅ¾enÃ½ch organizacÃ­ jako JSON objekt.\n   * @private\n   * @returns {Array.<Organization>}\n   */\n  parseOrganizations (json) {\n    // KoÅ™enovÃ¡ organizace vrÃ¡cenÃ© struktury.\n    // Pokud neexistuje, vrÃ¡tÃ­me prÃ¡zdnÃ½ seznam.\n    const root = get(json, 'organization');\n    if (isNil(root)) {\n      return [];\n    }\n    // Ze stromovÃ© struktury organizacÃ­ udÄ›lÃ¡me plochÃ½ seznam.\n    return this.organizationHelper.flatten(root);\n  }\n\n  /**\n   * Automaticky zaregistruje zaÅ™Ã­zenÃ­ na vzdÃ¡lenÃ©m serveru.\n   * StaÄ�Ã­ znÃ¡t otisk ke kterÃ©mu se nalezne vytvoÅ™enÃ© zaÅ™Ã­zenÃ­ na serveru.\n   * ZaÅ™Ã­zenÃ­ se na serveru vytvoÅ™Ã­ napÅ™. pomocÃ­ odkazu z QR kÃ³du.\n   * @param {string} serverUrl Adresa serveru, na kterÃ©m se zaÅ™Ã­zenÃ­ registruje.\n   * @param {string} fingerprint JedineÄ�nÃ½ otisk zaÅ™Ã­zenÃ­.\n   * @returns {Promise.<string|null>} IdentifikÃ¡tor, kterÃ½ je danÃ©mu zaÅ™Ã­zenÃ­\n   * pÅ™iÅ™azen na serveru, nebo `null` pokud zaÅ™Ã­zenÃ­ nenÃ­ registrovanÃ©.\n   * @throws {SetupError} PÅ™i registraci se vyskytla chyba.\n   */\n  registerAutomatic (serverUrl, fingerprint) {\n    return new Promise((resolve) => resolve(\n      // OdeÅ¡leme na server poÅ¾adavek s otiskem zaÅ™Ã­zenÃ­.\n      fetch(`${serverUrl}/api/register/sync`, {\n        body: JSON.stringify({accessCode: fingerprint}),\n        headers: {'Content-type': 'application/json'},\n        method: 'POST'\n      })\n      .then((response) => {\n        if (response.ok) {\n          // Pokud je odpovÄ›Ä� v poÅ™Ã¡dku, pokusÃ­me se ji zpracovat jako JSON.\n          return (\n            response.json()\n            .then((json) => this.parseDeviceId(json))\n          );\n        }\n        // Status 404 znaÄ�Ã­, Å¾e nebylo nalezeno zaÅ™Ã­zenÃ­ s pÅ™edanÃ½m otiskem.\n        // VracÃ­ se tedy null.\n        const {status} = response;\n        if (response.status === 404) {\n          return null;\n        }\n        // JakÃ¡koliv jinÃ¡ odpovÄ›Ä� serveru se povaÅ¾uje za chybu.\n        throw new Error(`HTTP status ${status}.`);\n      })\n    ));\n  }\n\n  /**\n   * ManuÃ¡lnÄ› zaregistruje zaÅ™Ã­zenÃ­ na vzdÃ¡lenÃ©m serveru.\n   * K tomu je potÅ™eba znÃ¡t uÅ¾ivatele a organizaci do kterÃ© se mÃ¡ zaÅ™Ã­zenÃ­ vytvoÅ™it.\n   * @param {string} serverUrl Adresa serveru, na kterÃ©m se zaÅ™Ã­zenÃ­ registruje.\n   * @param {string} fingerprint JedineÄ�nÃ½ otisk zaÅ™Ã­zenÃ­.\n   * @param {string} username JmÃ©no uÅ¾ivatele na serveru.\n   * @param {string} password Heslo uÅ¾ivatele na serveru.\n   * @param {string} deviceName NÃ¡zev zaÅ™Ã­zenÃ­ na serveru.\n   * @param {number} organizationId IdentifikÃ¡tor organizace, do kterÃ© se mÃ¡ zaÅ™Ã­zenÃ­ pÅ™iÅ™adit.\n   * @returns {Promise.<string>} IdentifikÃ¡tor prÃ¡vÄ› registrovanÃ©ho zaÅ™Ã­zenÃ­.\n   * @throws {SetupError} PÅ™i registraci se vyskytla chyba.\n   */\n  registerManual (serverUrl, fingerprint, username, password, deviceName, organizationId) {\n    return new Promise((resolve) => resolve(\n      fetch(`${serverUrl}/api/register/device`, {\n        body: JSON.stringify({\n          accessCode: fingerprint,\n          deviceName,\n          deviceType: 'lighter',\n          organizationId,\n          password,\n          username\n        }),\n        headers: {'Content-type': 'application/json'},\n        method: 'POST'\n      })\n      .then((response) => {\n        if (response.ok) {\n          // Pokud je odpovÄ›Ä� v poÅ™Ã¡dku, pokusÃ­me se ji zpracovat jako JSON.\n          return (\n            response.json()\n            .then((json) => this.parseDeviceId(json))\n          );\n        }\n        // JakÃ¡koliv jinÃ¡ odpovÄ›Ä� serveru se povaÅ¾uje za chybu.\n        // VytvoÅ™Ã­ se specifickÃ¡ chyba s dodateÄ�nÃ½mi informacemi, kterÃ© server nahlÃ¡sil.\n        return (\n          response.text()\n          .then((text) => {\n            throw this.createError(response.status, text);\n          })\n        );\n      })\n    ));\n  }\n}\n\nexport default SetupManager;\n","module.exports = \"<form\\n  class=\\\"container container--narrow\\\"\\n  novalidate\\n  v-on:submit.prevent\\n>\\n  <div class=\\\"wrap wrap-large\\\">\\n    <setup-header\\n      class=\\\"gap-large\\\"\\n      title=\\\"Manual device setup\\\"\\n      v-bind:isOnline=\\\"isOnline\\\"\\n      v-on:back=\\\"onBack\\\"\\n    ></setup-header>\\n    <div class=\\\"gap-large\\\">\\n      <div class=\\\"form-field gap-base\\\">\\n        <label\\n          class=\\\"form-label\\\"\\n          for=\\\"username\\\"\\n          v-text=\\\"field.username.label\\\"\\n        ></label>\\n        <input\\n          type=\\\"text\\\"\\n          class=\\\"form-control\\\"\\n          v-bind:class=\\\"{invalid: errors.has('username')}\\\"\\n          id=\\\"username\\\"\\n          name=\\\"username\\\"\\n          v-bind:data-vv-as=\\\"field.username.label\\\"\\n          v-focus\\n          v-model=\\\"field.username.value\\\"\\n          v-on:change=\\\"onChange\\\"\\n          v-validate=\\\"field.username.validator\\\"\\n        >\\n        <div\\n          class=\\\"align-x-left form-alert gap-tiny\\\"\\n          v-if=\\\"errors.has('username')\\\"\\n        >\\n          <span class=\\\"icon icon-warning\\\"></span>\\n          <span v-text=\\\"errors.first('username')\\\"></span>\\n        </div>\\n      </div>\\n      <div class=\\\"form-field gap-base\\\">\\n        <label\\n          class=\\\"form-label\\\"\\n          for=\\\"password\\\"\\n          v-text=\\\"field.password.label\\\"\\n        ></label>\\n        <input\\n          type=\\\"password\\\"\\n          class=\\\"form-control\\\"\\n          v-bind:class=\\\"{invalid: errors.has('password')}\\\"\\n          id=\\\"password\\\"\\n          name=\\\"password\\\"\\n          v-bind:data-vv-as=\\\"field.password.label\\\"\\n          v-model=\\\"field.password.value\\\"\\n          v-on:change=\\\"onChange\\\"\\n          v-validate=\\\"field.password.validator\\\"\\n        >\\n        <div\\n          class=\\\"align-x-left form-alert gap-tiny\\\"\\n          v-if=\\\"errors.has('password')\\\"\\n        >\\n          <span class=\\\"icon icon-warning\\\"></span>\\n          <span v-text=\\\"errors.first('password')\\\"></span>\\n        </div>\\n      </div>\\n      <div class=\\\"form-field gap-base\\\">\\n        <label\\n          class=\\\"form-label\\\"\\n          for=\\\"deviceName\\\"\\n          v-text=\\\"field.deviceName.label\\\"\\n        ></label>\\n        <input\\n          type=\\\"text\\\"\\n          class=\\\"form-control\\\"\\n          id=\\\"deviceName\\\"\\n          name=\\\"deviceName\\\"\\n          v-bind:data-vv-as=\\\"field.deviceName.label\\\"\\n          v-on:change=\\\"onChange\\\"\\n          v-model=\\\"field.deviceName.value\\\"\\n        >\\n      </div>\\n      <div class=\\\"gap-base\\\">\\n        <button\\n          type=\\\"button\\\"\\n          class=\\\"button\\\"\\n          v-bind:disabled=\\\"!isOnline\\\"\\n          v-on:click=\\\"onSubmit\\\"\\n        >Connect</button>\\n      </div>\\n    </div>\\n  </div>\\n</form>\\n\";","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport focus from '../focus/focus-directive';\n\nimport SetupHeader from './setup-header';\nimport template from './setup-manual.html';\n\nexport default {\n  name: 'SetupManual',\n  template,\n  components: {SetupHeader},\n  created () {\n    this.submitted = false;\n  },\n  directives: {focus},\n  data () {\n    return {\n      field: {\n        deviceName: {\n          label: 'Device name (optional)',\n          value: this.deviceName\n        },\n        password: {\n          label: 'Password',\n          validator: 'required',\n          value: this.password\n        },\n        username: {\n          label: 'Username',\n          validator: 'required',\n          value: this.username\n        }\n      }\n    };\n  },\n  methods: {\n    handleError (error) {\n      this.$root.logger.error(error);\n    },\n    onBack () {\n      this.$emit('back');\n    },\n    onChange () {\n      new Promise((resolve) => {\n        if (!this.submitted) {\n          return resolve();\n        }\n        return resolve(\n          this.$validator.validateAll()\n        );\n      })\n      .catch((error) => this.handleError(error));\n    },\n    onSubmit () {\n      new Promise((resolve) => {\n        this.submitted = true;\n        return resolve(\n          this.$validator.validateAll()\n        );\n      })\n      .then((valid) => {\n        if (!valid) {\n          return;\n        }\n        const {field} = this;\n        this.$emit('submit', field.deviceName.value, field.username.value, field.password.value);\n      })\n      .catch((error) => this.handleError(error));\n    }\n  },\n  props: ['deviceName', 'isOnline', 'password', 'username']\n};\n","module.exports = \"<div class=\\\"container container--narrow\\\">\\n  <div class=\\\"wrap wrap-large\\\">\\n    <setup-header\\n      class=\\\"gap-large\\\"\\n      title=\\\"Assign to organization\\\"\\n      v-bind:isOnline=\\\"isOnline\\\"\\n      v-on:back=\\\"onBack\\\"\\n    ></setup-header>\\n    <div class=\\\"gap-large\\\" v-if=\\\"organizationArray.length\\\">\\n      <button\\n        class=\\\"button button--clear gap-small\\\"\\n        type=\\\"button\\\"\\n        v-bind:disabled=\\\"!isOnline\\\"\\n        v-bind:key=\\\"organization.id\\\"\\n        v-focus=\\\"i === 0\\\"\\n        v-for=\\\"(organization, i) in organizationArray\\\"\\n        v-on:click=\\\"onSubmit(organization)\\\"\\n        v-text=\\\"organization.name\\\"\\n      ></button>\\n    </div>\\n  </div>\\n</div>\\n\";","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport focus from '../focus/focus-directive';\nimport SetupHeader from './setup-header';\nimport template from './setup-organization.html';\n\nexport default {\n  name: 'SetupOrganization',\n  template,\n  components: {SetupHeader},\n  directives: {focus},\n  methods: {\n    onBack () {\n      this.$emit('back');\n    },\n    onSubmit (organization) {\n      this.$emit('submit', organization);\n    }\n  },\n  props: ['isOnline', 'organizationArray']\n};\n","module.exports = \"<div class=\\\"setup-panel setup-panel--position-left\\\">\\n  <div class=\\\"grid grid-small grid-table setup-panel__grid\\\">\\n    <div class=\\\"align-y-center grid-item\\\">\\n      <img class=\\\"setup-logo\\\" src=\\\"\" + require(\"./setup-logo.svg\") + \"\\\">\\n    </div>\\n  </div>\\n</div>\\n\";","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport template from './setup-panel-left.html';\n\nexport default {\n  name: 'SetupPanelLeft',\n  template\n};\n","module.exports = \"<div class=\\\"setup-panel setup-panel--position-right\\\">\\n  <div class=\\\"grid grid-small grid-table setup-panel__grid\\\">\\n    <div class=\\\"grid-item align-y-center\\\">\\n      <div class=\\\"setup-connectivity\\\" v-bind:class=\\\"className\\\"></div>\\n    </div>\\n    <div class=\\\"grid-item align-y-center setup-clock\\\">\\n      <clock-root v-bind:delay=\\\"delay\\\"></clock-root>\\n    </div>\\n  </div>\\n</div>\\n\";","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ClockRoot from '../clock/clock-root';\n\nimport template from './setup-panel-right.html';\n\nexport default {\n  name: 'SetupPanelRight',\n  template,\n  components: {ClockRoot},\n  computed: {\n    className () {\n      if (this.isOnline) {\n        return 'setup-connectivity--online';\n      }\n      return 'setup-connectivity--offline';\n    }\n  },\n  data () {\n    return {\n      delay: 1000\n    };\n  },\n  props: ['isOnline']\n};\n","module.exports = \"<div class=\\\"container container--narrow\\\">\\n  <div class=\\\"wrap wrap-large\\\">\\n    <div class=\\\"gap-large\\\">\\n      <div class=\\\"gap-base setup-title\\\">Device setup via QR code</div>\\n      <div class=\\\"gap-base\\\">\\n        <canvas class=\\\"setup-qr\\\" id=\\\"setupQr\\\" ref=\\\"canvasEl\\\"></canvas>\\n      </div>\\n      <div class=\\\"gap-base\\\">Scan the QR code and log in on your mobile device</div>\\n    </div>\\n    <div class=\\\"gap-large\\\">\\n      <div class=\\\"gap-small\\\">\\n        <button\\n          class=\\\"button\\\"\\n          id=\\\"setupManual\\\"\\n          type=\\\"button\\\"\\n          v-focus\\n          v-on:click=\\\"onManual\\\"\\n        >Manual device setup</button>\\n      </div>\\n      <div class=\\\"gap-small\\\">\\n        <button\\n          class=\\\"button\\\"\\n          id=\\\"setupSettings\\\"\\n          type=\\\"button\\\"\\n          v-on:click=\\\"onSettings\\\"\\n        >Additional settings</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport QRious from 'qrious';\n\nimport focus from '../focus/focus-directive';\nimport template from './setup-qr.html';\n\nexport default {\n  name: 'SetupQr',\n  template,\n  directives: {focus},\n  methods: {\n    onManual () {\n      this.$emit('manual');\n    },\n    onSettings () {\n      this.$emit('settings');\n    }\n  },\n  mounted () {\n    this.qriuous = new QRious({\n      element: this.$refs.canvasEl,\n      level: 'L',\n      size: 340,\n      value: this.$root.setupManager.getQrUrl(this.serverUrl, this.$root.session.fingerprint)\n    });\n  },\n  props: ['serverUrl']\n};\n","module.exports = \"<div\\n  class=\\\"grid grid-table setup-root layout-root\\\"\\n  v-bind:style=\\\"rootStyle\\\"\\n>\\n  <div class=\\\"grid-item align-x-center align-y-center\\\">\\n    <setup-failure\\n      v-bind:message=\\\"failureMessage\\\"\\n      v-bind:retryTime=\\\"failureRetryTime\\\"\\n      v-if=\\\"page === 'failure'\\\"\\n      v-on:back=\\\"onFailureBack\\\"\\n      v-on:retry=\\\"onFailureRetry\\\"\\n    ></setup-failure>\\n    <loader-container\\n      v-else-if=\\\"page === 'loader'\\\"\\n    >Verifying the device. Please wait...</loader-container>\\n    <setup-manual\\n      v-bind:deviceName=\\\"deviceName\\\"\\n      v-bind:isOnline=\\\"isOnline\\\"\\n      v-bind:password=\\\"password\\\"\\n      v-bind:username=\\\"username\\\"\\n      v-else-if=\\\"page === 'manual'\\\"\\n      v-on:back=\\\"onManualBack\\\"\\n      v-on:submit=\\\"onManualSubmit\\\"\\n    ></setup-manual>\\n    <setup-organization\\n      v-bind:isOnline=\\\"isOnline\\\"\\n      v-bind:organizationArray=\\\"organizationArray\\\"\\n      v-else-if=\\\"page === 'organization'\\\"\\n      v-on:back=\\\"onOrganizationBack\\\"\\n      v-on:submit=\\\"onOrganizationSubmit\\\"\\n    ></setup-organization>\\n    <setup-qr\\n      v-bind:serverUrl=\\\"serverUrl\\\"\\n      v-else-if=\\\"page === 'qr'\\\"\\n      v-on:manual=\\\"onManual\\\"\\n      v-on:settings=\\\"onSettings\\\"\\n    ></setup-qr>\\n    <setup-settings\\n      v-bind:defaultServerUrl=\\\"defaultServerUrl\\\"\\n      v-bind:isOnline=\\\"isOnline\\\"\\n      v-bind:serverUrl=\\\"serverUrl\\\"\\n      v-else-if=\\\"page === 'settings'\\\"\\n      v-on:back=\\\"onSettingsBack\\\"\\n      v-on:submit=\\\"onSettingsSubmit\\\"\\n    ></setup-settings>\\n    <setup-success\\n      v-bind:time=\\\"successTime\\\"\\n      v-else-if=\\\"page === 'success'\\\"\\n      v-on:finish=\\\"onFinish\\\"\\n    ></setup-success>\\n  </div>\\n  <setup-panel-left></setup-panel-left>\\n  <setup-panel-right v-bind:isOnline=\\\"isOnline\\\"></setup-panel-right>\\n</div>\\n\";","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport config from '../../config';\nimport ControlButton from '../control/control-button';\nimport ErrorName from '../error/error-name';\nimport LoaderContainer from '../loader/loader-container';\nimport SetupFailure from './setup-failure';\nimport SetupManual from './setup-manual';\nimport SetupOrganization from './setup-organization';\nimport SetupPanelLeft from './setup-panel-left';\nimport SetupPanelRight from './setup-panel-right';\nimport SetupQr from './setup-qr';\nimport SetupSettings from './setup-settings';\nimport SetupSuccess from './setup-success';\nimport template from './setup-root.html';\n\n// TODO UniverzÃ¡lnÃ­ komponenta `FormField`. NynÃ­ se kÃ³d opakuje.\n// TODO AutomatickÃ¡ synchronizace v GUI.\n// - MÄ›lo by provÃ¡dÄ›nÃ­ sync bÃ½t opravdu tak agresivnÃ­? ZaÅ™Ã­zenÃ­ jiÅ¾ pak nelze jednoduÅ¡e odinstalovat.\n// - Co kdyÅ¾ bude uÅ¾ivatel chtÃ­t zaÅ™Ã­zenÃ­ zaregistrovat na jinÃ©m serveru? Sync ihned spÃ¡ruje vÃ½chozÃ­ server.\n// - Detekci vÅ¾dy nechat potvrdit v GUI.\n// - Co tÅ™eba tlaÄ�Ã­tko \"Automatic device setup\", kterÃ© by signalizovalo naÄ�Ã­tÃ¡nÃ­ / ÃºspÄ›ch / neÃºspÄ›ch.\n// TODO Panely na menÅ¡Ã­ch rozliÅ¡enÃ­ch pÅ™ekrÃ½vajÃ­ obsah.\n// - ZatÃ­m se neÅ™eÅ¡ilo, protoÅ¾e nenÃ­ poptÃ¡vka po takto malÃ½ch zaÅ™Ã­zenÃ­ch.\n// - V ideÃ¡lnÃ­m pÅ™Ã­padÄ› by se panely mÄ›li posklÃ¡dat pod sebe a za nimi obsah.\nexport default {\n  name: 'SetupRoot',\n  template,\n  components: {\n    LoaderContainer,\n    SetupFailure,\n    SetupManual,\n    SetupOrganization,\n    SetupPanelLeft,\n    SetupPanelRight,\n    SetupQr,\n    SetupSettings,\n    SetupSuccess\n  },\n  created () {\n    const {$root} = this;\n    const {virtualKeyboardManager} = $root;\n    this.automaticEnabled = false;\n    this.automaticTimeout = null;\n    this.deviceId = null;\n    this.organization = null;\n    // Pracuje se vÅ¾dy s otiskem, kterÃ½ byl nastavenÃ½ v okamÅ¾iku vytvoÅ™enÃ­ komponenty.\n    this.fingerprint = $root.session.fingerprint;\n    // SledovÃ¡nÃ­ ovlÃ¡dacÃ­ch tlaÄ�Ã­tek.\n    $root.controlManager.on('buttonDown', this.onButtonDown);\n    // SpuÅ¡tÄ›nÃ­ podpory pro focus.\n    $root.focusManager.start();\n    // SledovÃ¡nÃ­ stavu pÅ™ipojenÃ­ k sÃ­ti.\n    $root.networkListener.on('onlineChanged', this.onOnlineChanged);\n    // SledovÃ¡nÃ­ virtuÃ¡lnÃ­ klÃ¡vesnice.\n    virtualKeyboardManager.on('infoChanged', this.onVirtualKeyboardChanged);\n    // Inicializace stavu virtuÃ¡lnÃ­ klÃ¡vesnice.\n    virtualKeyboardManager.getInfo()\n    .then((info) => {\n      this.rootStyle = this.getRootStyle(info);\n    })\n    // SpustÃ­ automatickou registraci se serverem na zÃ¡kladÄ› otisku.\n    .then(() => this.startAutomatic())\n    .catch((error) => this.handleError(error));\n  },\n  data () {\n    const {serverUrl} = config.setup;\n    return {\n      defaultServerUrl: serverUrl,\n      deviceName: config.setup.deviceName,\n      failureMessage: null,\n      failureRetryDelay: null,\n      failureRetryTime: null,\n      isOnline: this.$root.networkListener.isOnline(),\n      organizationArray: [],\n      page: 'qr',\n      password: config.setup.password,\n      rootStyle: null,\n      serverUrl,\n      successTime: null,\n      username: config.setup.username\n    };\n  },\n  destroyed () {\n    const {$root} = this;\n    this.stopAutomatic();\n    $root.controlManager.off('buttonDown', this.onButtonDown);\n    $root.focusManager.start();\n    $root.networkListener.off('onlineChanged', this.onOnlineChanged);\n    $root.virtualKeyboardManager.off('infoChanged', this.onVirtualKeyboardChanged);\n  },\n  methods: {\n    back () {\n      // TODO Å lo by zpracovat lÃ©pe.\n      // - Mohli by sledovat jednotlivÃ© strÃ¡nky a vyvolÃ¡vat \"back\".\n      // - ObecnÄ› by pomohlo nasazenÃ­ routeru.\n      // - TakÃ© by se nemÄ›li vyvolÃ¡vat on* metody.\n      switch (this.page) {\n        case 'failure':\n          return this.onFailureBack();\n        case 'manual':\n          return this.onManualBack();\n        case 'organization':\n          return this.onOrganizationBack();\n        case 'settings':\n          return this.onSettingsBack();\n        default:\n          // VÃ½chozÃ­ operacÃ­ je vypnutÃ­ aplikace.\n          return this.$root.appManager.exit();\n      }\n    },\n    getRootStyle (info) {\n      if (info.isOverlapping()) {\n        // Pokud klÃ¡vesnice pÅ™ekrÃ½vÃ¡ obsah, vytvoÅ™Ã­ se mÃ­sto pro jejÃ­ zobrazenÃ­.\n        return {paddingBottom: info.getHeight()};\n      }\n      // Bez virtuÃ¡lnÃ­ klÃ¡vesnice se zarovnÃ¡nÃ­ na vÃ½Å¡ku neupravuje.\n      return null;\n    },\n    handleError (error) {\n      this.$root.logger.error(error);\n    },\n    install (deviceId, serverUrl) {\n      return new Promise((resolve) => resolve(\n        this.$root.device.install(deviceId, serverUrl)\n        .then(() => this.showSuccess())\n      ));\n    },\n    onAutomatic () {\n      // Provede se pokus o registraci.\n      new Promise((resolve) => resolve(\n        this.registerAutomatic()\n      ))\n      .catch((error) => this.handleError(error))\n      // Pokud nebyla registrace provedena, tak se po zpoÅ¾dÄ›nÃ­ provede dalÅ¡Ã­ pokus.\n      .finally(() => {\n        if (this.automaticEnabled) {\n          this.automaticTimeout = setTimeout(this.onAutomatic, config.setup.automaticDelay);\n        }\n      });\n    },\n    onButtonDown (controlButton) {\n      if (controlButton === ControlButton.Back) {\n        this.back();\n      }\n    },\n    onFailureBack () {\n      this.showManual();\n    },\n    onFailureRetry () {\n      new Promise((resolve) => {\n        const {failureDelayMultiplier, failureDelayMax} = config.setup;\n        this.failureRetryDelay = Math.min(this.failureRetryDelay * failureDelayMultiplier, failureDelayMax);\n        this.showLoader();\n        const {organization} = this;\n        if (!isNil(organization)) {\n          return resolve(\n            this.registerManualComplete(this.serverUrl, this.username, this.password, organization.id, this.deviceName)\n          );\n        }\n        return resolve(\n          this.registerManualSimple(this.serverUrl, this.username, this.password, this.deviceName)\n        );\n      })\n      .catch((error) => this.showFailure(error));\n    },\n    onFinish () {\n      this.$emit('finish');\n    },\n    onManual () {\n      this.showManual();\n    },\n    onManualBack () {\n      this.showQr();\n    },\n    onManualSubmit (deviceName, username, password) {\n      new Promise((resolve) => {\n        // NovÃ½ pokus, resetuje se zpoÅ¾dÄ›nÃ­.\n        this.failureRetryDelay = config.setup.failureDelayBase;\n        // ZadanÃ© Ãºdaje se uloÅ¾Ã­ pro pÅ™Ã­padnÃ© opakovanÃ© pokusy.\n        this.deviceName = deviceName;\n        this.password = password;\n        this.username = username;\n        this.showLoader();\n        return resolve(\n          this.registerManualSimple(this.serverUrl, username, password, deviceName)\n        );\n      })\n      .catch((error) => this.showFailure(error));\n    },\n    onOnlineChanged (online) {\n      this.isOnline = online;\n    },\n    onOrganizationBack () {\n      this.showManual();\n    },\n    onOrganizationSubmit (organization) {\n      new Promise((resolve) => {\n        // NovÃ½ pokus, resetuje se zpoÅ¾dÄ›nÃ­.\n        this.failureRetryDelay = config.setup.failureDelayBase;\n        // VybranÃ¡ organizace se uloÅ¾Ã­ pro pÅ™Ã­padnÃ© opakovanÃ© pokusy.\n        this.organization = organization;\n        this.showLoader();\n        return resolve(\n          this.registerManualComplete(this.serverUrl, this.username, this.password, organization.id, this.deviceName)\n        );\n      })\n      .catch((error) => this.showFailure(error));\n    },\n    onSettings () {\n      this.showSettings();\n    },\n    onSettingsBack () {\n      this.showQr();\n    },\n    onSettingsSubmit (serverUrl) {\n      this.serverUrl = serverUrl;\n      this.showQr();\n    },\n    onVirtualKeyboardChanged (info) {\n      this.rootStyle = this.getRootStyle(info);\n    },\n    registerAutomatic () {\n      return new Promise((resolve) => {\n        // PÅ™i synchronizaci se pouÅ¾ije adresa serveru pÅ™Ã­tomnÃ¡ v okamÅ¾iku spuÅ¡tÄ›nÃ­.\n        // Pokud se adresa serveru zmÄ›nÃ­, pouÅ¾ije se automaticky pÅ™i dalÅ¡Ã­m pokusu.\n        const {serverUrl} = this;\n        return resolve(\n          this.$root.setupManager\n          .registerAutomatic(serverUrl, this.fingerprint)\n          .then((deviceId) => {\n            if (isNil(deviceId)) {\n              // Pokud zaÅ™Ã­zenÃ­ nebylo nalezeno, nic nedÄ›lÃ¡me.\n              return;\n            }\n            return this.install(deviceId, serverUrl);\n          })\n        );\n      });\n    },\n    registerManualSimple (serverUrl, username, password, deviceName) {\n      return new Promise((resolve) => resolve(\n        // OdeÅ¡leme na server pÅ™ihlaÅ¡ovacÃ­ Ãºdaje a zjistÃ­me seznam organizacÃ­.\n        this.$root.setupManager\n        .fetchOrganizations(serverUrl, username, password)\n        .then((organizationArray) => {\n          // ZjiÅ¡tÄ›nÃ½ seznam se uloÅ¾Ã­ pro pÅ™Ã­padnÃ© opakovanÃ© pokusy.\n          this.organizationArray = organizationArray;\n          // Bez organizacÃ­ se dÃ¡le nedÃ¡ nic dÄ›lat.\n          if (!organizationArray.length) {\n            throw new Error(`No organizations available.`);\n          }\n          // Pokud mÃ¡me na vÃ½bÄ›r pouze z jednÃ© organizace, vyberem ji bez ptanÃ­.\n          if (organizationArray.length === 1) {\n            const organization = organizationArray[0];\n            // ZjiÅ¡tÄ›nÃ¡ organizace se uloÅ¾Ã­ pro pÅ™Ã­padnÃ© opakovanÃ© pokusy.\n            this.organization = organization;\n            return this.registerManualComplete(serverUrl, username, password, organization.id, deviceName);\n          }\n          // Pokud je organizacÃ­ vÃ­ce, zobrazÃ­me jejich seznam.\n          this.showOrganization();\n        })\n      ));\n    },\n    registerManualComplete (serverUrl, username, password, organizationId, deviceName) {\n      return new Promise((resolve) => resolve(\n        // OdeÅ¡leme na server pÅ™ihlaÅ¡ovacÃ­ Ãºdaje a vybranou organizaci a zÃ­skÃ¡me\n        // ID zaÅ™Ã­zenÃ­.\n        this.$root.setupManager\n        .registerManual(serverUrl, this.fingerprint, username, password, deviceName, organizationId)\n        .then((deviceId) => {\n          // ZjiÅ¡tÄ›nÃ¡ hodnota deviceId se uloÅ¾Ã­ pro pÅ™Ã­padnÃ© opakovanÃ© pokusy.\n          this.deviceId = deviceId;\n          return this.install(deviceId, serverUrl);\n        })\n      ));\n    },\n    showFailure (error) {\n      this.failureMessage = error.message;\n      this.failureRetryTime = Date.now() + this.failureRetryDelay;\n      this.page = 'failure';\n      if (error.name === ErrorName.SetupError) {\n        // ZnÃ¡mÃ¡ registraÄ�nÃ­ chyba se povaÅ¾uje za oÅ¡etÅ™enou jejÃ­m zobrazenÃ­m v GUI.\n        return;\n      }\n      // NeznÃ¡mÃ© chyby se logujÃ­ na Sentry.\n      this.handleError(error);\n    },\n    showLoader () {\n      this.page = 'loader';\n    },\n    showManual () {\n      this.stopAutomatic();\n      this.page = 'manual';\n    },\n    showOrganization () {\n      this.page = 'organization';\n    },\n    showQr () {\n      this.startAutomatic();\n      this.page = 'qr';\n    },\n    showSettings () {\n      this.page = 'settings';\n    },\n    showSuccess () {\n      this.stopAutomatic();\n      this.successTime = Date.now() + config.setup.successDelay;\n      this.page = 'success';\n    },\n    startAutomatic () {\n      // Jestli jiÅ¾ synchronizace probÃ­hÃ¡, tak se nic nedÄ›lÃ¡.\n      if (this.automaticEnabled) {\n        return;\n      }\n      // Jinak se ihned provede prvnÃ­ synchronizace.\n      this.automaticEnabled = true;\n      this.onAutomatic();\n    },\n    stopAutomatic () {\n      clearInterval(this.automaticTimeout);\n      this.automaticTimeout = null;\n      this.automaticEnabled = false;\n    }\n  }\n};\n","module.exports = \"<form\\n  class=\\\"container container--narrow\\\"\\n  novalidate\\n  v-on:submit.prevent\\n>\\n  <div class=\\\"wrap wrap-large\\\">\\n    <setup-header\\n      class=\\\"gap-large\\\"\\n      title=\\\"Additional settings\\\"\\n      v-bind:isOnline=\\\"isOnline\\\"\\n      v-on:back=\\\"onBack\\\"\\n    ></setup-header>\\n    <div class=\\\"gap-large\\\">\\n      <div class=\\\"form-field gap-base\\\">\\n        <label\\n          class=\\\"form-label\\\"\\n          for=\\\"serverUrl\\\"\\n          v-text=\\\"field.serverUrl.label\\\"\\n        ></label>\\n        <input\\n          type=\\\"url\\\"\\n          class=\\\"form-control\\\"\\n          v-bind:class=\\\"{invalid: errors.has('serverUrl')}\\\"\\n          id=\\\"serverUrl\\\"\\n          name=\\\"serverUrl\\\"\\n          v-bind:data-vv-as=\\\"field.serverUrl.label\\\"\\n          v-focus\\n          v-model=\\\"field.serverUrl.value\\\"\\n          v-on:change=\\\"onChange\\\"\\n          v-validate=\\\"field.serverUrl.validator\\\"\\n        >\\n        <div\\n          class=\\\"align-x-left form-alert gap-tiny\\\"\\n          v-if=\\\"errors.has('serverUrl')\\\"\\n        >\\n          <span class=\\\"icon icon-warning\\\"></span>\\n          <span v-text=\\\"errors.first('serverUrl')\\\"></span>\\n        </div>\\n      </div>\\n      <div class=\\\"grid grid-inline grid-base gap-base\\\">\\n        <div class=\\\"grid-item width-1 width-md-1-2\\\">\\n          <button type=\\\"button\\\" class=\\\"button\\\" v-on:click=\\\"onSubmit\\\">Save</button>\\n        </div>\\n        <div class=\\\"grid-item width-1 width-md-1-2\\\">\\n          <button type=\\\"button\\\" class=\\\"button\\\" v-on:click=\\\"onReset\\\">Reset</button>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</form>\\n\";","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport focus from '../focus/focus-directive';\nimport SetupHeader from './setup-header';\nimport template from './setup-settings.html';\n\n// TODO UniverzÃ¡lnÃ­ komponenta `FormField`. NynÃ­ se kÃ³d opakuje.\nexport default {\n  name: 'SetupSettings',\n  template,\n  components: {SetupHeader},\n  created () {\n    this.submitted = false;\n  },\n  directives: {focus},\n  data () {\n    return {\n      field: {\n        serverUrl: {\n          label: 'Server URL',\n          validator: {\n            required: true,\n            url: {require_tld: false}\n          },\n          value: this.serverUrl\n        }\n      }\n    };\n  },\n  methods: {\n    handleError (error) {\n      this.$root.logger.error(error);\n    },\n    onBack () {\n      this.$emit('back');\n    },\n    onChange () {\n      new Promise((resolve) => {\n        if (!this.submitted) {\n          return resolve();\n        }\n        return resolve(\n          this.$validator.validateAll()\n        );\n      })\n      .catch((error) => this.handleError(error));\n    },\n    onReset () {\n      this.field.serverUrl.value = this.defaultServerUrl;\n    },\n    onSubmit () {\n      new Promise((resolve) => {\n        this.submitted = true;\n        return resolve(\n          this.$validator.validateAll()\n        );\n      })\n      .then((valid) => {\n        if (!valid) {\n          return;\n        }\n        this.$emit('submit', this.field.serverUrl.value);\n      })\n      .catch((error) => this.handleError(error));\n    }\n  },\n  props: ['defaultServerUrl', 'isOnline', 'serverUrl']\n};\n","module.exports = \"<div class=\\\"container container--narrow setup-success\\\">\\n  <div class=\\\"wrap wrap-large\\\">\\n    <div class=\\\"gap-large\\\">\\n      <div class=\\\"gap-base\\\">\\n        <span class=\\\"icon icon-check-circle setup-icon setup-icon--success\\\"></span>\\n      </div>\\n      <div class=\\\"setup-title gap-base\\\">\\n        The player has been registered successfully\\n      </div>\\n      <div class=\\\"gap-base\\\">\\n        It will start automatically in\\n        <countdown-root\\n          v-bind:end=\\\"time\\\"\\n          v-on:end=\\\"onEnd\\\"\\n        ></countdown-root>...\\n      </div>\\n    </div>\\n    <div class=\\\"gap-large\\\">\\n      <button\\n        type=\\\"button\\\"\\n        class=\\\"button\\\"\\n        v-focus\\n        v-on:click=\\\"onClick\\\"\\n      >Start now</button>\\n    </div>\\n  </div>\\n</div>\\n\";","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport focus from '../focus/focus-directive';\nimport CountdownRoot from '../countdown/countdown-root';\nimport template from './setup-success.html';\n\nexport default {\n  name: 'SetupSuccess',\n  template,\n  components: {CountdownRoot},\n  directives: {focus},\n  methods: {\n    finish () {\n      this.$emit('finish');\n    },\n    onClick () {\n      this.finish();\n    },\n    onEnd () {\n      this.finish();\n    }\n  },\n  props: ['time']\n};\n","/**\n * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na koneÄ�nÃ½ stavovÃ½ automat.\n */\nclass StateMachineFactory {\n  /**\n   * VytvoÅ™Ã­ instanci\n   * @param {Class.<JavascriptStateMachine>} JavascriptStateMachine\n   * @param {Class.<StateMachine>} StateMachine\n   * @returns {StateMachineFactory} NovÃ¡ instance\n   */\n  constructor (JavascriptStateMachine, StateMachine) {\n    this.JavascriptStateMachine = JavascriptStateMachine;\n    this.StateMachine = StateMachine;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ koneÄ�nÃ½ stavovÃ½ automat.\n   * @param {Object} options\n   * @returns {StateMachine} VytvoÅ™enÃ½ koneÄ�nÃ½ stavovÃ½ automat.\n   */\n  create (options) {\n    return new this.StateMachine(this.JavascriptStateMachine, options);\n  }\n}\n\nexport default StateMachineFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isFunction from 'lodash/isFunction';\nimport isNil from 'lodash/isNil';\n\n/**\n * KoneÄ�nÃ½ stavovÃ½ automat.\n * VyuÅ¾Ã­vÃ¡ plugin\n * [Javascript State Machine (JSM)](https://github.com/jakesgordon/javascript-state-machine/tree/7ae0a4e02e30a2627b357e8e44fbf0c6a871bcb7),\n * od kterÃ©ho pÅ™ebÃ­rÃ¡ vÄ›tÅ¡inu rozhranÃ­.\n */\nclass StateMachine {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<JavascriptStateMachine>} JavascriptStateMachine\n   * @param {Object} options NastavenÃ­ ve formÃ¡tu JSM. KromÄ› poloÅ¾ky `methods`.\n   * @returns {StateMachine} NovÃ¡ instance.\n   */\n  constructor (JavascriptStateMachine, options) {\n    /**\n     * Async operace, kterÃ© se majÃ­ provÃ©st pÅ™i pÅ™echodech.\n     * @private\n     * @type {?Promise}\n     */\n    this.pendingPromise = null;\n    /**\n     * Plugin realizujÃ­cÃ­ vÄ›tÅ¡inu funkcionality stavovÃ©ho automatu.\n     * @private\n     * @type {JavascriptStateMachine}\n     */\n    this.jsm = new JavascriptStateMachine({\n      ...options,\n      methods: {\n        onBeforeTransition: (...argArray) => this.onBeforeTransition(...argArray),\n        onInvalidTransition: (...argArray) => this.onInvalidTransition(...argArray),\n        onPendingTransition: (...argArray) => this.onPendingTransition(...argArray)\n      }\n    });\n  }\n\n  /**\n   * ZjistÃ­ aktuÃ¡lnÃ­ stav automatu.\n   * @returns {string} NÃ¡zev stavu.\n   */\n  getState () {\n    return this.jsm.state;\n  }\n\n  /**\n   * Reakce na zaÄ�Ã¡tek pÅ™echodu.\n   * @private\n   * @returns {Promise|undefined} PoÅ¾adovanÃ¡ async operace.\n   */\n  onBeforeTransition () {\n    return this.pendingPromise;\n  }\n\n  /**\n   * Reakce na neplatnÃ½ pÅ™echod.\n   * @param {string} transition NÃ¡zev pÅ™echodu, kterÃ½ selhal.\n   * @param {string} from NÃ¡zev stavu, na kterÃ©m byl poÅ¾adovÃ¡n pÅ™echod.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onInvalidTransition (transition, from) {\n    throw new Error(`Invalid transition \"${transition}\" from the state \"${from}\".`);\n  }\n\n  /**\n   * Reakce na pÅ™echod, bez dokonÄ�enÃ­ pÅ™edchozÃ­ho.\n   * @param {string} transition NÃ¡zev pÅ™echodu, kterÃ½ selhal.\n   * @param {string} from NÃ¡zev stavu, na kterÃ©m byl poÅ¾adovÃ¡n pÅ™echod.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onPendingTransition (transition, from) {\n    throw new Error(`Can not transition \"${transition}\" from the state \"${from}\". Another transition is pending.`);\n  }\n\n  /**\n   * VytvoÅ™Ã­ bezpeÄ�nÃ½ synchronnÃ­ pÅ™echod mezi stavy.\n   * Kontroluje platnost pÅ™echodu pÅ™ed provedenÃ­m operacÃ­.\n   * PÅ™i selhÃ¡nÃ­ operacÃ­ se pÅ™echod neprovede.\n   * @param {string} transition NÃ¡zev pÅ™echodu.\n   * @param {Function} cb Funkce, kterÃ¡ se zavolÃ¡ pÅ™i pÅ™echodu.\n   * @returns {*} VÃ½sledek funkce.\n   */\n  transit (transition, cb) {\n    // Kontrola vstupu.\n    if (!isFunction(cb)) {\n      throw TypeError(`Invalid callback ${cb}.`);\n    }\n    const {jsm} = this;\n    // Kontrola, jestli lze pÅ™echod provÃ©st.\n    if (jsm.cannot(transition)) {\n      this.onInvalidTransition(transition, jsm.state);\n    }\n    // ProvedenÃ­ funkce.\n    // ProvÃ¡dÃ­ se pouze jednou a se zÃ¡mÄ›rem provÃ©st dalÅ¡Ã­ operace po dokonÄ�enÃ­.\n    // To splÅˆuje poÅ¾adavky ESLint a pÅ™esto selhÃ¡vÃ¡. Uvedeno jako \"Known Limitations\".\n    // eslint-disable-next-line callback-return\n    const result = cb();\n    // ProvedenÃ­ pÅ™echodu.\n    jsm[transition]();\n    // VrÃ¡cenÃ­ vÃ½sledku funkce.\n    return result;\n  }\n\n  /**\n   * VytvoÅ™Ã­ bezpeÄ�nÃ½ asynchronnÃ­ pÅ™echod mezi stavy.\n   * BÄ›hem operacÃ­ jsou blokovÃ¡ny ostatnÃ­ poÅ¾adavky na pÅ™echod.\n   * PÅ™i selhÃ¡nÃ­ operacÃ­ se pÅ™echod neprovede.\n   * @param {string} transition NÃ¡zev pÅ™echodu.\n   * @param {Function} cb Funkce, na kterou se Ä�ekÃ¡ pÅ™i pÅ™echodu.\n   * @returns {Promise.<*>} VÃ½sledek funkce.\n   */\n  transitAsync (transition, cb) {\n    return new Promise((resolve) => {\n      // Kontrola vstupu.\n      if (!isFunction(cb)) {\n        throw TypeError(`Invalid callback ${cb}.`);\n      }\n      // Kontrola, jestli neprobÃ­hÃ¡ jinÃ½ asynchronnÃ­ pÅ™echod.\n      const {jsm, pendingPromise} = this;\n      if (!isNil(pendingPromise)) {\n        this.onPendingTransition(transition, jsm.state);\n      }\n      // Kontrola, jestli lze pÅ™echod provÃ©st.\n      if (jsm.cannot(transition)) {\n        this.onInvalidTransition(transition, jsm.state);\n      }\n      // ZÃ­skÃ¡nÃ­ Promise, na kterou se mÃ¡ Ä�ekat.\n      const promise = this.wrapPromise(cb);\n      // UloÅ¾enÃ­ Promise pro pÅ™edÃ¡nÃ­ do FSM pÅ™es \"Lifecycle Events\".\n      // https://github.com/jakesgordon/javascript-state-machine/blob/ca1a2f380384d83f85ddc669c9798a9a96d6aca6/docs/async-transitions.md\n      this.pendingPromise = promise;\n      // ProvedenÃ­ pÅ™echodu a vrÃ¡cenÃ­ vÃ½sledku Promise.\n      // SpolÃ©hÃ¡ se na to, Å¾e vrÃ¡cenÃ­ promise v `onBeforeTransition` zpÅ¯sobÃ­ vrÃ¡cenÃ­ tÃ© stejnÃ© promise pÅ™i pÅ™echodu.\n      // PÅ™echod ve skuteÄ�nosti vracÃ­ jinou promise, kterÃ¡ \"obaluje\" tu vloÅ¾enou v `onBeforeTransition`.\n      // Je nutnÃ© Ä�ekat na \"obalujÃ­cÃ­\" promise, jinak dochÃ¡zÃ­ ke vzniku chyb `Uncaught (in promise)`.\n      // BohuÅ¾el ale \"obalujÃ­cÃ­\" promise nevracÃ­ vÃ½sledek vstupnÃ­ promise, proto je nakonec vynceno jeho vrÃ¡cenÃ­.\n      // TODO NeÅ¡lo by aktivovat pÅ™echod univerzÃ¡lnÄ›ji? MÅ¯Å¾e kolidovat s nÃ¡zvy jako `state`, `can`...\n      // - Lze pomocÃ­ `jsm._fsm.fire(transition, [])`.\n      // - Je otÃ¡zkou, co to vyÅ™eÅ¡Ã­. Muselo by se asi kompletnÄ› pÅ™ejÃ­t na pouÅ¾Ã­vÃ¡nÃ­ `_fsm`.\n      // - KdyÅ¾ by byl napÅ™. definovÃ¡n stav `cannot`, tak nelze pouÅ¾Ã­vat `jsm.cannot(transition)`, ale `jsm._fsm.cannot(transition)`.\n      // - Je otÃ¡zkou, jestli kompletnÃ­ pÅ™esun implementace na privÃ¡tnÃ­ rozhranÃ­ `_fsm` nenÃ­ horÅ¡Ã­ pÅ™Ã­stup, neÅ¾ Å™eÅ¡enÃ½ problÃ©m.\n      // - MoÅ¾nÃ¡ reportovat do issues? Asi by vyÅ¾adovalo vÃ­ce testÅ¯, jak se v tomto pÅ™Ã­padÄ› bude FSM chovat.\n      // - MoÅ¾nÃ¡ zkusit vyÅ™eÅ¡it volÃ¡nÃ­m `jsm.prototype.cannot`. Ale pravdÄ›podobnÄ› jsou vÅ¡echny tyto metody napojeny pÅ™Ã­mo na instanci.\n      return resolve(\n        this.jsm[transition]()\n        .then(() => promise)\n        .finally(() => {\n          this.pendingPromise = null;\n        })\n      );\n    });\n  }\n\n  /**\n   * ZÃ­skÃ¡ vÃ½sledek funkce a obalÃ­ ho do Promise, kdyby funkce vrÃ¡tila nÄ›co jinÃ©ho.\n   * To je obvyklejÅ¡Ã­ pÅ™Ã­stup, neÅ¾ kontrolovat, jestli byla vrÃ¡cena skuteÄ�nÄ› Promise.\n   * @param {Function} cb Funkce, jejÃ­Å¾ vÃ½sledek se mÃ¡ obalit.\n   * @private\n   * @returns {Promise.<*>} VÃ½sledek funkce jako Promise.\n   */\n  wrapPromise (cb) {\n    return new Promise((resolve) => resolve(cb()));\n  }\n}\n\nexport default StateMachine;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport {DS, DSErrors, DSUtils} from 'js-data';\nimport differenceBy from 'lodash/differenceBy';\nimport isArray from 'lodash/isArray';\nimport isObject from 'lodash/isObject';\n\nimport analyticsCounterResource from '../analytics/analytics-counter-resource';\nimport analyticsGroupResource from '../analytics/analytics-group-resource';\nimport assetResource from '../asset/asset-resource';\nimport exceptionResource from '../exception/exception-resource';\nimport layerResource from '../layer/layer-resource';\nimport layoutResource from '../layout/layout-resource';\nimport mediumResource from '../medium/medium-resource';\nimport playlistResource from '../playlist/playlist-resource';\nimport sessionResource from '../session/session-resource';\nimport taskResource from '../task/task-resource';\nimport timerResource from '../timer/timer-resource';\nimport trackResource from '../track/track-resource';\n\n/**\n * DatovÃ½ sklad postavenÃ½ na knihovnÄ› JSData.\n *\n * ![Diagram tÅ™Ã­d](./core/store/store.doc.png)\n * @extends DS\n */\nclass Store extends DS {\n  /**\n   * VytvoÅ™Ã­ datovÃ½ sklad.\n   * @param {Object.<string, DsAdapter>|null} dsAdapterMap Mapa adaptÃ©rÅ¯ pro JSData.\n   * @returns {Store} NovÃ½ datovÃ½ sklad.\n   */\n  constructor (dsAdapterMap) {\n    super({\n      // Simple where mÅ¯Å¾e zpÅ¯sobit nechtÄ›nÃ© operace napÅ™. {limit: 1} mÃ¡ filtrovat, nebo strÃ¡nkovat?\n      allowSimpleWhere: false,\n      // NaÄ�Ã­tÃ¡nÃ­ z cache pouze na vyÅ¾Ã¡dÃ¡nÃ­. MÅ¯Å¾e zpÅ¯sobit nepÅ™Ã­liÅ¡ oÄ�ekÃ¡vanÃ© chovÃ¡nÃ­.\n      bypassCache: true,\n      defaultAdapter: 'storage',\n      // Optimalizace vÃ½konu. Naslouchat na zmÄ›ny u datovÃ½ch zdrojÅ¯.\n      instanceEvents: false,\n      // Optimalizace vÃ½konu. Deprecated computed properties. PouÅ¾Ã­vat radÄ›ji getter / setter styl.\n      watchChanges: false\n    });\n    // Registrace adaptÃ©rÅ¯\n    if (isObject(dsAdapterMap)) {\n      Object.entries(dsAdapterMap)\n      .forEach(([key, dsAdapter]) => {\n        this.registerAdapter(key, dsAdapter);\n      });\n    }\n    // Registrace datovÃ½ch zdrojÅ¯\n    this.defineResource(analyticsCounterResource);\n    this.defineResource(analyticsGroupResource);\n    this.defineResource(assetResource);\n    this.defineResource(exceptionResource);\n    this.defineResource(layerResource);\n    this.defineResource(layoutResource);\n    this.defineResource(mediumResource);\n    this.defineResource(playlistResource);\n    this.defineResource(sessionResource);\n    this.defineResource(taskResource);\n    this.defineResource(timerResource);\n    this.defineResource(trackResource);\n  }\n\n  /**\n   * VytvoÅ™enÃ­ vÃ­ce objektÅ¯ persistentnÄ› zÃ¡roveÅˆ.\n   * SlouÅ¾Ã­ pÅ™edevÅ¡Ã­m k optimalizaci vÃ½konu: omezenÃ­ emitovanÃ½ch udÃ¡lostÃ­ a operacÃ­ s adaptÃ©rem.\n   * @param {string} resourceName NÃ¡zev datovÃ©ho zdroje.\n   * @param {Array.<DsAttrs>} attrsArray Objekty ke vloÅ¾enÃ­ v poli.\n   * @param {DsOptions} options NastavenÃ­ JSData.\n   * @returns {Promise.<Array.<Model>>} OdebranÃ© modely.\n   */\n  createMany (resourceName, attrsArray, options) {\n    // TODO Hotfix implementace. VyuÅ¾Ã­vat adapter.createMany a inject(attrsArray).\n    // - https://github.com/js-data/js-data/blob/2.10.0/src/datastore/async_methods/create.js\n    return Promise.all(attrsArray.map((attrs) => this.create(resourceName, attrs, options)));\n  }\n\n  /**\n   * OdebrÃ¡nÃ­ vÃ­ce objektÅ¯ persistentnÄ› zÃ¡roveÅˆ.\n   * SlouÅ¾Ã­ pÅ™edevÅ¡Ã­m k optimalizaci vÃ½konu: omezenÃ­ emitovanÃ½ch udÃ¡lostÃ­ a operacÃ­ s adaptÃ©rem.\n   * @param {string} resourceName NÃ¡zev datovÃ©ho zdroje.\n   * @param {Array.<DsId>} idArray IdentifikÃ¡tory k odebrÃ¡nÃ­ v poli.\n   * @param {DsOptions} options NastavenÃ­ JSData.\n   * @returns {Promise.<Array.<Model>>} OdebranÃ© modely.\n   */\n  destroyMany (resourceName, idArray, options) {\n    // TODO Hotfix implementace. VyuÅ¾Ã­vat adapter.destroyMany a ejectMany(idArray).\n    // - https://github.com/js-data/js-data/blob/2.10.0/src/datastore/async_methods/destroy.js\n    // - https://github.com/js-data/js-data/blob/2.10.0/src/datastore/async_methods/destroyAll.js\n    return Promise.all(idArray.map((id) => this.destroy(resourceName, id, options)));\n  }\n\n  /**\n   * OdebrÃ¡nÃ­ vÃ­ce objektÅ¯ v pamÄ›ti zÃ¡roveÅˆ.\n   * SlouÅ¾Ã­ pÅ™edevÅ¡Ã­m k optimalizaci vÃ½konu: omezenÃ­ emitovanÃ½ch udÃ¡lostÃ­ a operacÃ­ s adaptÃ©rem.\n   * Do budoucna by nemÄ›lo vyuÅ¾Ã­vat eject, ale maximÃ¡lnÄ› optimalizovat vÃ½kon hromadnÃ½m odebrÃ¡nÃ­m.\n   * Podporuje pouze notify a ne uÅ¾ pÅ™Ã­mÃ© volÃ¡nÃ­ definition.beforeEject + definition.afterEject.\n   * IdeÃ¡lnÄ› by asi mÄ›lo bÃ½t pÅ™Ã­mo souÄ�Ã¡stÃ­ eject, stejnÄ› jako inject, kterÃ½ podporuje vklÃ¡dÃ¡nÃ­ vÃ­ce objektÅ¯.\n   * @param {string} resourceName NÃ¡zev datovÃ©ho zdroje.\n   * @param {Array.<DsId>} idArray IdentifikÃ¡tory k odebrÃ¡nÃ­ v poli.\n   * @param {DsOptions} options NastavenÃ­ JSData.\n   * @returns {Array.<Model>} OdebranÃ© modely.\n   */\n  ejectMany (resourceName, idArray, options) {\n    let result;\n    const definition = this.definitions[resourceName];\n    if (!definition) {\n      throw new DSErrors.NER(resourceName);\n    }\n    if (!isArray(idArray)) {\n      throw new DSErrors.IA(`${resourceName}.ejectMany: \"idArray\" must be an array!`);\n    }\n    // NalezenÃ­ pÅ™Ã­sluÅ¡nÃ½ch modelÅ¯, aby Å¡lo pÅ™edem urÄ�it, jestli emitovat beforeEject.\n    const modelArray = (\n      idArray.map((id) => this.get(resourceName, id))\n      .filter((model) => model)\n    );\n    // Bez nalezenÃ½ch modelÅ¯ se Å¾Ã¡dnÃ© operace neprovÃ¡dÄ›jÃ­.\n    if (modelArray.length) {\n      const {idAttribute} = definition;\n      // SpojenÃ­ nastavenÃ­ ze vstupu a z resource.\n      const inheritedOptions = DSUtils._(definition, options);\n      // VyvolÃ¡nÃ­ lifecycle udÃ¡losti pro vÅ¡echny modely.\n      if (inheritedOptions.notify) {\n        definition.emit('DS.beforeEject', definition, modelArray);\n      }\n      // OdebrÃ¡nÃ­ vÅ¡ech modelÅ¯ pomocÃ­ eject bez vyvolÃ¡nÃ­ udÃ¡lostÃ­.\n      const ejectOptions = {...options, notify: false};\n      result = modelArray.map((model) => this.eject(resourceName, model[idAttribute], ejectOptions));\n      // VyvolÃ¡nÃ­ lifecycle udÃ¡losti pro vÅ¡echny modely.\n      if (inheritedOptions.notify) {\n        definition.emit('DS.afterEject', definition, modelArray);\n      }\n    } else {\n      result = [];\n    }\n    return result;\n  }\n\n  /**\n   * NahradÃ­ obsah datovÃ©ho zdroje v pamÄ›ti za novou sadu objektÅ¯.\n   * @param {string} resourceName NÃ¡zev datovÃ©ho zdroje.\n   * @param {Array.<DsAttrs>} attrsArray Objekty ke vloÅ¾enÃ­ v poli.\n   * @param {DsParams|null} params FiltrovacÃ­ kritÃ©ria JSData.\n   * @param {DsOptions} options NastavenÃ­ JSData.\n   * @returns {Array.<Model>} NovÄ› vloÅ¾enÃ© modely.\n   */\n  replace (resourceName, attrsArray, params, options) {\n    let result;\n    const definition = this.definitions[resourceName];\n    if (!definition) {\n      throw new DSErrors.NER(resourceName);\n    }\n    if (!isArray(attrsArray)) {\n      throw new DSErrors.IA(`${resourceName}.replace: \"attrs\" must be an array!`);\n    }\n    const {idAttribute} = definition;\n    const currentModelArray = this.filter(resourceName, params, options);\n    const ejectModelArray = differenceBy(currentModelArray, attrsArray, idAttribute);\n    // OdebrÃ¡nÃ­ vÅ¡ech ostatnÃ­ch modelÅ¯.\n    if (ejectModelArray.length) {\n      const ejectIdArray = ejectModelArray.map((model) => model[idAttribute]);\n      this.ejectMany(resourceName, ejectIdArray, options);\n    }\n    // PÅ™idÃ¡nÃ­ novÃ½ch modelÅ¯.\n    if (attrsArray.length) {\n      result = this.inject(resourceName, attrsArray, options);\n    } else {\n      result = [];\n    }\n    return result;\n  }\n\n  /**\n   * NahradÃ­ obsah datovÃ©ho zdroje persistentnÄ› za novou sadu objektÅ¯.\n   * @param {string} resourceName NÃ¡zev datovÃ©ho zdroje.\n   * @param {Array.<DsAttrs>} attrsArray Objekty ke vloÅ¾enÃ­ v poli.\n   * @param {DsParams|null} params FiltrovacÃ­ kritÃ©ria JSData.\n   * @param {DsOptions} options NastavenÃ­ JSData.\n   * @returns {Promise.<Array.<Model>>} NovÄ› vloÅ¾enÃ© modely.\n   */\n  replaceAsync (resourceName, attrsArray, params, options) {\n    const definition = this.definitions[resourceName];\n    if (!definition) {\n      throw new DSErrors.NER(resourceName);\n    }\n    if (!isArray(attrsArray)) {\n      throw new DSErrors.IA(`${resourceName}.replaceAsync: \"attrs\" must be an array!`);\n    }\n    const {idAttribute} = definition;\n    return (\n      this.findAll(resourceName, params, options)\n      .then((currentModelArray) => {\n        let result;\n        const ejectModelArray = differenceBy(currentModelArray, attrsArray, idAttribute);\n        // OdebrÃ¡nÃ­ vÅ¡ech ostatnÃ­ch modelÅ¯.\n        if (ejectModelArray.length) {\n          const ejectIdArray = ejectModelArray.map((model) => model[idAttribute]);\n          result = this.destroyMany(resourceName, ejectIdArray, options);\n        }\n        return result;\n      })\n      .then(() => {\n        let result;\n        // PÅ™idÃ¡nÃ­ novÃ½ch modelÅ¯.\n        if (attrsArray.length) {\n          result = this.createMany(resourceName, attrsArray, options);\n        } else {\n          result = [];\n        }\n        return result;\n      })\n    );\n  }\n}\n\nexport default Store;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Typ mÃ©dia video stream.\n * PouÅ¾Ã­vÃ¡ se pouze URL ze serveru bez podpory offline stavu.\n * @implements {ViewerType}\n */\nclass StreamViewerType {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {ViewerControllerVideoFactory|WebosSignage3_0StreamViewerControllerFactory} controllerFactory\n   * @param {ViewerSourceCreator} sourceCreator\n   */\n  constructor (controllerFactory, sourceCreator) {\n    // TODO LepÅ¡Ã­ organizace Viewer modulu.\n    // - Zde by se hodilo mÃ­t inteface VideoViewerControllerFactory.\n    // - ZatÃ­m Å™eÅ¡eno jako vÃ½Ä�et typÅ¯ a zde se spolÃ©hÃ¡ na stejnÃ© parametry u create,\n    //   coÅ¾ nenÃ­ ÃºplnÄ› vhodnÃ©.\n    // - TakÃ© by mÄ›l existovat VideoViewerSourceCreator a ne jen obecnÃ© rozhranÃ­.\n    this.controllerFactory = controllerFactory;\n    this.sourceCreator = sourceCreator;\n  }\n\n  /** @inheritdoc */\n  createController () {\n    return this.controllerFactory.create();\n  }\n\n  /** @inheritdoc */\n  getSourceCreator () {\n    return this.sourceCreator;\n  }\n\n  /** @inheritdoc */\n  getUrl (medium) {\n    return medium.url;\n  }\n\n  /** @inheritdoc */\n  isExtractable () {\n    return false;\n  }\n\n  /** @inheritdoc */\n  isOfflineable () {\n    return false;\n  }\n\n  /** @inheritdoc */\n  isPreloadable (medium) {\n    return true;\n  }\n}\n\nexport default StreamViewerType;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO #4 Do budoucna je zde moÅ¾nost dalÅ¡Ã­ch nastavenÃ­ stretch.\n// - https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit\n/**\n * ÄŒÃ­selnÃ­k roztaÅ¾enÃ­ mÃ©diÃ­.\n * @enum {string}\n */\nconst StretchEnum = {\n  /** ZobrazÃ­ celÃ© mÃ©dium uvnitÅ™ rÃ¡mu. ZachovÃ¡ pomÄ›r stran. MÅ¯Å¾e bÃ½t zobrazeno Ä�ernÃ© pozadÃ­. */\n  CONTAIN: 'CONTAIN',\n  /** VyplnÃ­ celÃ½ rÃ¡m mÃ©diem. ZachovÃ¡ pomÄ›r stran. MÅ¯Å¾e dojÃ­t k oÅ™ezu mÃ©dia. */\n  COVER: 'COVER',\n  /** RoztÃ¡hne mÃ©dium na velikost rÃ¡mu. NezachovÃ¡ pomÄ›r stran. */\n  FILL: 'FILL'\n};\n\nexport default StretchEnum;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport StretchEnum from './stretch-enum';\n\n/**\n * Knihovna pro urÄ�ovÃ¡nÃ­ roztaÅ¾enÃ­ zaloÅ¾enÃ¡ na nativnÃ­m web zpracovÃ¡nÃ­.\n * VyuÅ¾Ã­vÃ¡ CSS vlastnost `object-fit`.\n */\nclass StretchNative {\n  /**\n   * UrÄ�Ã­ CSS tÅ™Ã­du s roztaÅ¾enÃ­m, kterÃ¡ se mÃ¡ pÅ™iÅ™adit elementu.\n   * @param {StretchEnum} stretchEnum RoztaÅ¾enÃ­ mÃ©dia.\n   * @returns {string} NÃ¡zev CSS tÅ™Ã­dy.\n   */\n  getClassName (stretchEnum) {\n    switch (stretchEnum) {\n      case StretchEnum.CONTAIN:\n        return 'stretch-native--contain';\n      case StretchEnum.COVER:\n        return 'stretch-native--cover';\n      case StretchEnum.FILL:\n        return 'stretch-native--fill';\n      default:\n        throw new Error(`Invalid stretch \"${stretchEnum}\".`);\n    }\n  }\n}\n\nexport default StretchNative;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k cÃ­lÅ¯ ÃºkolÅ¯.\n * @enum {string}\n * @name TargetEnum\n */\nexport default {\n  PRIMARY: 'PRIMARY'\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k typÅ¯ Ãºloh pro zaÅ™Ã­zenÃ­.\n * @enum {string}\n */\nconst TaskEnum = {\n  /**\n   * ObsahovÃ¡ Ãºloha.\n   * Odkazuje na objekt, kterÃ½ se mÃ¡ pÅ™ehrÃ¡t (medium, playlist, Å¡ablona).\n   */\n  CONTENT: 'CONTENT',\n  /**\n   * Å˜Ã­dÃ­cÃ­ Ãºloha.\n   * SdruÅ¾uje Ä�asovaÄ�e napÃ¡jenÃ­ zaÅ™Ã­zenÃ­.\n   */\n  POWER: 'POWER'\n};\n\nexport default TaskEnum;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nexport default {\n  name: 'task',\n  methods: {\n    toString () {\n      return `Task {id: \"${this.id}\"}`;\n    }\n  },\n  relations: {\n    belongsTo: {\n      layout: {\n        localField: 'layout',\n        localKey: 'layoutId'\n      },\n      medium: {\n        localField: 'medium',\n        localKey: 'mediumId'\n      },\n      playlist: {\n        localField: 'playlist',\n        localKey: 'playlistId'\n      }\n    }\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nexport default {\n  name: 'timer',\n  relations: {\n    belongsTo: {\n      task: {\n        localField: 'task',\n        localKey: 'taskId'\n      }\n    }\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport get from 'lodash/get';\nimport isNil from 'lodash/isNil';\nimport objectHash from 'object-hash';\n\nimport CommunicatorUtility from '../communicator/utility/communicator-utility';\n\n/**\n * KomunikÃ¡tor pÅ™ehrÃ¡vanÃ½ch stop playlistu pro Ki-Wi Server.\n */\nclass TrackCommunicator {\n  /**\n   * @param {TrackPlanCommunicator} trackPlanCommunicator\n   */\n  constructor (trackPlanCommunicator) {\n    this.trackPlanCommunicator = trackPlanCommunicator;\n  }\n\n  /**\n   * Zpracuje seznam stop a zanoÅ™enÃ½ch modelÅ¯.\n   * @param {Array.<Object>} jsonArray ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ se seznamem stop.\n   * @param {DsId} parentPlaylistId IdentifikÃ¡tor playlistu, do kterÃ©ho stopa patÅ™Ã­.\n   * @returns {DsMap} Mapa datovÃ½ch atributÅ¯ ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  parseMany (jsonArray, parentPlaylistId) {\n    return CommunicatorUtility.parseMany(\n      jsonArray,\n      (jsonObject, index) => this.parseOne(jsonObject, parentPlaylistId, index),\n      {track: {}}\n    );\n  }\n\n  /**\n   * Zpracuje jednu stopu bez zanoÅ™enÃ½ch modelÅ¯.\n   * @param {Object} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s jednou stopou.\n   * @param {DsId} parentPlaylistId IdentifikÃ¡tor playlistu, do kterÃ©ho stopa patÅ™Ã­.\n   * @param {number} index PoÅ™adÃ­ stopy v rodiÄ�ovskÃ©m playlistu.\n   * @private\n   * @returns {TrackAttrs}\n   */\n  parseModel (json, parentPlaylistId, index) {\n    if (isNil(parentPlaylistId)) {\n      throw new TypeError('Missing parent playlist.');\n    }\n    if (isNil(index)) {\n      throw new TypeError('Missing index.');\n    }\n    // NaÄ�te se seznam poloÅ¾ek `TrackPlan` ve formÃ¡tu DHTMLX Scheduler.\n    const trackPlans = get(json, 'trackPlans', []);\n    return {\n      childPlaylistId: CommunicatorUtility.parseReference(json.ref, 'playlist'),\n      // TODO V datech chybÃ­ id.\n      // - Bude dochÃ¡zet ke zbyteÄ�nÃ½m zmÄ›nÃ¡m pÅ™i zmÄ›nÄ› poÅ™adÃ­.\n      // - Å lo by vylepÅ¡it navÃ¡zÃ¡nÃ­m na childPlaylistId nebo mediumId, ale ty mohou bÃ½t duplikovanÃ©.\n      // - Tato duplikace by se jeÅ¡tÄ› musela oÅ¡etÅ™it napÅ™. identifikÃ¡tor sestavit jako 1. mediumId v danÃ©m seznamu.\n      id: objectHash({parentPlaylistId, index}),\n      index,\n      layoutId: CommunicatorUtility.parseReference(json.ref, 'layout'),\n      mediumId: CommunicatorUtility.parseReference(json.ref, 'media'),\n      parentPlaylistId,\n      // PÅ™evedou se udÃ¡losti z DHTMLX do iCalendar formÃ¡tu.\n      planIcal: this.trackPlanCommunicator.parseIcal(trackPlans),\n      playDuration: CommunicatorUtility.parseTime(json.schedule.duration),\n      volume: CommunicatorUtility.parseVolume(json.schedule.volume)\n    };\n  }\n\n  /**\n   * Zpracuje jednu stopu a zanoÅ™enÃ© modely.\n   * @param {Object} json ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s jednou stopou.\n   * @param {DsId} parentPlaylistId IdentifikÃ¡tor playlistu, do kterÃ©ho stopa patÅ™Ã­.\n   * @param {number} index PoÅ™adÃ­ stopy v rodiÄ�ovskÃ©m playlistu.\n   * @private\n   * @returns {DsMap} Mapa datovÃ½ch atributÅ¯ ke vloÅ¾enÃ­ do datovÃ©ho skladu.\n   */\n  parseOne (json, parentPlaylistId, index) {\n    // VytvoÅ™Ã­ se stopa playlistu.\n    const track = this.parseModel(json, parentPlaylistId, index);\n    // VytvoÅ™Ã­ se mapa se stopami playlistu.\n    const trackMap = {[track.id]: track};\n    return {track: trackMap};\n  }\n}\n\nexport default TrackCommunicator;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\n/**\n * KomunikÃ¡tor mÃ©diaplÃ¡nÅ¯ pÅ™ehrÃ¡vanÃ½ch stop playlistu pro Ki-Wi Server.\n */\nclass TrackPlanCommunicator {\n  /**\n   * @param {DhtmlxToIcalExporter} dhtmlxToIcalExporter\n   */\n  constructor (dhtmlxToIcalExporter) {\n    this.dhtmlxToIcalExporter = dhtmlxToIcalExporter;\n  }\n\n  /**\n   * NaÄ�te DHTMLX Scheduler udÃ¡lost z formÃ¡tu mÃ©diaplÃ¡nÅ¯ pÅ™ehrÃ¡vanÃ½ch stop.\n   * @param {Object} trackPlan ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­ s jednou udÃ¡lostÃ­\n   * mÃ©diaplÃ¡nu stopy.\n   * @returns {DhtmlxEvent}\n   */\n  parseDhtmlxEvent (trackPlan) {\n    return {\n      event_pid: this.parseString(trackPlan.event_pid),\n      event_length: this.parseString(trackPlan.event_length),\n      end_date: trackPlan.endDate,\n      rec_type: trackPlan.rec_type,\n      id: String(trackPlan.id),\n      // Popis udÃ¡losti se zahodÃ­, nenÃ­ potÅ™eba.\n      text: '',\n      start_date: trackPlan.startDate\n    };\n  }\n\n  /**\n   * NaÄ�te ze stopy kalendÃ¡Å™ s mÃ©diaplÃ¡nem, pokud stapa nÄ›jakÃ½ obsahuje.\n   * @param {Array.<Object>} trackPlans ÄŒÃ¡st odpovÄ›di na obsah zaÅ™Ã­zenÃ­\n   * se seznamem udÃ¡lostÃ­ mÃ©diaplÃ¡nu stopy.\n   * PouÅ¾Ã­vÃ¡ se mÃ­rnÄ› upravenÃ½ DHTMLX Scheduler formÃ¡t udÃ¡lostÃ­.\n   * @returns {null|string}\n   */\n  parseIcal (trackPlans) {\n    // PÅ™evod poloÅ¾ek `TrackPlan` na `DhtmlxEvent`\n    const dhtmlxEvents = trackPlans.map((trackPlan) => (\n      this.parseDhtmlxEvent(trackPlan)\n    ));\n    // PÅ™evod seznamu poloÅ¾ek `DhtmlxEvent` na Å™etÄ›zec ve formÃ¡tu na iCalendar.\n    const ical = this.dhtmlxToIcalExporter.export(dhtmlxEvents);\n    // Pokud je vÃ½sledek `null` (iCalendar nepodporuje kalendÃ¡Å™ bez udÃ¡lostÃ­),\n    // tak to znamenÃ¡, Å¾e zde nejsou Å¾Ã¡dnÃ© validnÃ­ iCalendar udÃ¡losti.\n    // To znamenÃ¡ Å¾e zde nebyly ani Å¾Ã¡dnÃ© DHTMLX udÃ¡losti, nebo tyto udÃ¡losti\n    // nevytvoÅ™ili Å¾Ã¡dnou hlavnÃ­ iCalendar udÃ¡lost.\n    // DruhÃ¡ varianta by se mohla stÃ¡t pouze teoreticky pÅ™i poÅ¡kozenÃ©m vstupu.\n    if (isNil(ical)) {\n      return null;\n    }\n    // PodaÅ™ilo se nÄ›jakÃ½ validnÃ­ iCalendar vytvoÅ™it.\n    return ical;\n  }\n\n  /**\n   * NaÄ�te zpÄ›t Å™etÄ›zec z hodnot, kterÃ© server pÅ™evÃ¡dÃ­ na Ä�Ã­sla.\n   * Pro vyjÃ¡dÅ™enÃ­ prÃ¡zdnÃ©ho Å™etÄ›zce se pouÅ¾Ã­vÃ¡ Ä�Ã­slo -1.\n   * @param {number} number\n   * @private\n   * @returns {string}\n   */\n  parseString (number) {\n    if (number === -1) {\n      return '';\n    }\n    return String(number);\n  }\n}\n\nexport default TrackPlanCommunicator;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nexport default {\n  name: 'track',\n  methods: {\n    toString () {\n      return `Track {index: ${this.index}, parentPlaylist: ${this.parentPlaylist}}`;\n    }\n  },\n  relations: {\n    belongsTo: {\n      layout: {\n        localField: 'layout',\n        localKey: 'layoutId'\n      },\n      medium: {\n        localField: 'medium',\n        localKey: 'mediumId'\n      },\n      playlist: [\n        {\n          localField: 'childPlaylist',\n          localKey: 'childPlaylistId'\n        },\n        {\n          localField: 'parentPlaylist',\n          localKey: 'parentPlaylistId'\n        }\n      ]\n    }\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport UpdatePlatform from './update-platform';\n\n// TODO Mohlo by se odstranit opakovÃ¡nÃ­ napÅ™Ã­Ä� rÅ¯znÃ½mi prostÅ™edÃ­mi (multi-platformnÃ­ kÃ³d).\n// - /util.js parsePlatform.\n// - Budou asi hlavnÄ› problÃ©my s importy.\n/**\n * Utility pro prÃ¡ci s Ä�Ã­selnÃ­kem platforem.\n */\nclass UpdatePlatformUtil {\n  /**\n   * Vygeneruje textovou reprezentaci platformy.\n   * @param {UpdatePlatform|null} value Platforma z Ä�Ã­selnÃ­ku.\n   * @returns {string|null} Platforma jako text.\n   * @static\n   */\n  static generate (value) {\n    switch (value) {\n      case UpdatePlatform.KiwiLighter1:\n        return 'kiwi-lighter-1';\n      case UpdatePlatform.TizenSssp4:\n        return 'tizen-sssp-4';\n      case UpdatePlatform.Web:\n        return 'web';\n      case UpdatePlatform.WebosSignage3_0:\n        return 'webos-signage-3.0';\n      case UpdatePlatform.WebosSignage3_2:\n        return 'webos-signage-3.2';\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * NaÄ�te platformu z textovÃ©ho Å™etÄ›zce.\n   * @param {string|null} value Platforma jako text.\n   * @returns {UpdatePlatform|null} Platforma z Ä�Ã­selnÃ­ku.\n   * @static\n   */\n  static parse (value) {\n    switch (value) {\n      case 'kiwi-lighter-1':\n        return UpdatePlatform.KiwiLighter1;\n      case 'tizen-sssp-4':\n        return UpdatePlatform.TizenSssp4;\n      case 'web':\n        return UpdatePlatform.Web;\n      case 'webos-signage-3.0':\n        return UpdatePlatform.WebosSignage3_0;\n      case 'webos-signage-3.2':\n        return UpdatePlatform.WebosSignage3_2;\n      default:\n        return null;\n    }\n  }\n}\n\nexport default UpdatePlatformUtil;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k platforem, kterÃ© se v rÃ¡mci aktualizaÄ�nÃ­ho procesu povaÅ¾ujÃ­ za odliÅ¡nÃ©.\n * ObsahovÄ› vychÃ¡zÃ­ z Ä�Ã­selnÃ­ku `Platform` v `util.js`, ale zjemÅˆuje jej\n * o informace, kterÃ© se mohou mÄ›nit aÅ¾ po sestavenÃ­ danÃ© platformy. JednÃ¡ se\n * napÅ™. o informaci o orientaci zaÅ™Ã­zenÃ­ u platformy SSSP 4. ZatÃ­mco\n * `Platform` odpovÃ­dÃ¡ adresÃ¡Å™Å¯m v `src/platform` a tedy moÅ¾nÃ½m Ä�istÃ½m\n * sestavenÃ­m aplikace, `UpdatePlatform` odpovÃ­dÃ¡ publikovanÃ½m balÃ­Ä�kÅ¯m,\n * tedy hodnotÃ¡m v update manifestu.\n * @enum {string}\n */\nconst UpdatePlatform = {\n  /** Platforma pro Ki-Wi Lighter API ve verzi 1. */\n  KiwiLighter1: 'KiwiLighter1',\n  /** Platforma pro Samsung Smart Signage Platform verze 4. */\n  TizenSssp4: 'TizenSssp4',\n  /** Platforma pro standardnÃ­ webovÃ© technologie. */\n  Web: 'Web',\n  /** Platforma pro LG webOS Smart Signage Platform ve verzi 3.0. */\n  WebosSignage3_0: 'WebosSignage3_0',\n  /** Platforma pro LG webOS Smart Signage Platform ve verzi 3.2. */\n  WebosSignage3_2: 'WebosSignage3_2'\n};\n\nexport default UpdatePlatform;\n","/**\n * @author MatÄ›j GrabovskÃ½ <matej.grabovsky@ki-wi.cz>\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * AktualizÃ¡tor zaÅ™Ã­zenÃ­.\n */\nclass Updater {\n  /**\n   * VytvoÅ™Ã­ aktualizÃ¡tor.\n   * @param {AppManager} appManager\n   * @param {string} [buildId] IdentifikÃ¡tor sestavenÃ­.\n   * @param {Communicator} communicator\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {Store} store DatovÃ½ sklad s pÅ™ehrÃ¡vanÃ½m obsahem.\n   * @returns {Updater} NovÃ½ aktualizÃ¡tor.\n   */\n  constructor (appManager, buildId, communicator, session, store) {\n    this.appManager = appManager;\n    this.buildId = buildId;\n    this.communicator = communicator;\n    this.session = session;\n    this.store = store;\n    this.updatePending = false;\n  }\n\n  /**\n   * ObnovÃ­ nastavenÃ­ aktualizÃ¡toru pÅ™i startu zaÅ™Ã­zenÃ­.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po obnovenÃ­ aktualizÃ¡toru.\n   */\n  start () {\n    let result;\n    if (this.buildId === this.session.buildId) {\n      // Pokud je identifikÃ¡tor sestavenÃ­ stejnÃ½ jako pÅ™i minulÃ©m spuÅ¡tÄ›nÃ­, tak se nic nedÄ›lÃ¡.\n      result = Promise.resolve();\n    } else {\n      // Pokud je spuÅ¡tÄ›no jinÃ© sestavenÃ­ aplikace neÅ¾ minule, aktualizuje se nastavenÃ­ aplikace.\n      result = this.store.update('session', this.session.id, {\n        // TODO #84 Nebude vadit \"buildId: undefined\"?\n        buildId: this.buildId,\n        version: null\n      });\n    }\n    return result;\n  }\n\n  // TODO NepouÅ¾Ã­vanÃ¡ implementace pro zmÄ›nu orientace pÅ™es update.\n  // /**\n  //  * Aktualizujce aplikaci na danou platformu bez ohledu na verzi.\n  //  * @param {UpdatePlatform} updatePlatform IdentifikÃ¡tor platformy, na kterou se mÃ¡ aktualizovat.\n  //  * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po dokonÄ�enÃ­ aktualizace.\n  //  */\n  // updatePlatform (updatePlatform) {\n  //   return new Promise((resolve) => {\n  //     if (this.updatePending) {\n  //       // Pokud uÅ¾ probÃ­hÃ¡ aktualizace, vyhodÃ­me vÃ½jimku.\n  //       throw new Error('An update is already pending.');\n  //     }\n  //     // ZablokujÃ­ se dalÅ¡Ã­ aktualizace.\n  //     this.updatePending = true;\n  //     const {session} = this;\n  //     return resolve(\n  //       // Detekce poÅ¾adovanÃ©ho formÃ¡tu aplikace.\n  //       this.appManager.getFormat()\n  //       // VyhledÃ¡nÃ­ vhodnÃ© aktualizace na serveru.\n  //       .then((formatEnum) => this.communicator.update(session.serverUrl, session.deviceId, formatEnum, updatePlatform))\n  //       .then((updateResult) => {\n  //         // PokraÄ�ujeme v aktualizaci, pouze pokud mÃ¡me co aktualizovat.\n  //         if (!updateResult) {\n  //           // Tato aktualizace je dokonÄ�enÃ¡.\n  //           return;\n  //         }\n  //         return (\n  //           this.appManager.update(updateResult.url)\n  //           .then(() => this.store.update('session', session.id, {\n  //             // IdentifikÃ¡tor sestavenÃ­, aby Å¡la detekovat zmÄ›na verze z jinÃ©ho zdroje, neÅ¾ je tento aktualizaÄ�nÃ­ proces.\n  //             buildId: updateResult.buildId,\n  //             // NaÄ�tenÃ¡ logickÃ¡ verze, aby se jiÅ¾ pÅ™Ã­Å¡tÄ› opakovanÄ› nestahovala.\n  //             version: updateResult.version\n  //           }))\n  //           // DokonÄ�Ã­ se aktualizace spuÅ¡tÄ›nÃ­m aktualizovanÃ© aplikace.\n  //           .then(() => this.appManager.finishUpdate())\n  //         );\n  //       })\n  //       .finally(() => {\n  //         // OdblokujÃ­ se dalÅ¡Ã­ aktualizace.\n  //         this.updatePending = false;\n  //       })\n  //     );\n  //   });\n  // }\n\n  /**\n   * Aktualizuje aplikaci na novou verzi.\n   * @param {string} version Verze aplikace, na kterou aktualizovat.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po dokonÄ�enÃ­ aktualizace.\n   */\n  updateVersion (version) {\n    return new Promise((resolve) => {\n      if (!this.buildId || version === this.session.version) {\n        // Pokud nenÃ­ dostupnÃ© buildId (dev verze), tak se aktualizace neprovÃ¡dÃ­.\n        // Pokud se verze aplikace nezmÄ›nila, takÃ© se aktualizace neprovÃ¡dÃ­.\n        return resolve();\n      }\n      // Pokud uÅ¾ probÃ­hÃ¡ aktualizace, vyhodÃ­me vÃ½jimku.\n      if (this.updatePending) {\n        throw new Error('An update is already pending.');\n      }\n      this.updatePending = true;\n      // ProvedenÃ­ aktualizace aplikace.\n      return resolve(\n        // Detekce platformy na kterÃ© je aplikace spuÅ¡tÄ›na.\n        this.appManager.getUpdatePlatform()\n        .then((updatePlatform) => (\n          // Detekce poÅ¾adovanÃ©ho formÃ¡tu aplikace.\n          this.appManager.getFormat()\n          // VyhledÃ¡nÃ­ vhodnÃ© aktualizace na serveru.\n          .then((formatEnum) => {\n            const {session} = this;\n            return this.communicator.update(session.serverUrl, session.deviceId, formatEnum, updatePlatform);\n          })\n        ))\n        .then((updateResult) => {\n          // PokraÄ�ujeme v aktualizaci, pouze pokud mÃ¡me co aktualizovat.\n          if (!updateResult) {\n            // Tato aktualizace je dokonÄ�enÃ¡.\n            return;\n          }\n          // PorovnÃ¡ se identifikÃ¡tor sestavenÃ­ spuÅ¡tÄ›nÃ© a aktualizovanÃ© aplikace. Pokud jsou stejnÃ©, nenÃ­ tÅ™eba aktualizaci provÃ¡dÄ›t.\n          const buildIdMatched = this.buildId === updateResult.buildId;\n          let updatePromise = Promise.resolve();\n          if (!buildIdMatched) {\n            // Pokud mÃ¡ aktualizace jinÃ½ identifikÃ¡tor sestavenÃ­, tak se aplikace aktualizuje.\n            updatePromise = updatePromise.then(() => this.appManager.update(updateResult.url));\n          }\n          // UloÅ¾enÃ­ hodnot do persistentnÃ­ho datovÃ©ho skladu, pro porovÃ¡nÃ­ pÅ™i dalÅ¡Ã­m spuÅ¡tÄ›nÃ­.\n          updatePromise = updatePromise.then(() => this.store.update('session', this.session.id, {\n            // IdentifikÃ¡tor sestavenÃ­, aby Å¡la detekovat zmÄ›na verze z jinÃ©ho zdroje, neÅ¾ je tento aktualizaÄ�nÃ­ proces.\n            buildId: updateResult.buildId,\n            // NaÄ�tenÃ¡ logickÃ¡ verze, aby se jiÅ¾ pÅ™Ã­Å¡tÄ› opakovanÄ› nestahovala.\n            version: updateResult.version\n          }));\n          if (!buildIdMatched) {\n            // Pokud mÃ¡ aktualizace jinÃ½ identifikÃ¡tor sestavenÃ­, tak se zaÅ™Ã­zenÃ­ po aktualizaci restartuje.\n            // DokonÄ�Ã­ se aktualizace spuÅ¡tÄ›nÃ­m aktualizovanÃ© aplikace.\n            updatePromise = updatePromise.then(() => this.appManager.finishUpdate());\n          }\n          return updatePromise;\n        })\n        .finally(() => {\n          // OdblokujÃ­ se dalÅ¡Ã­ aktualizace.\n          this.updatePending = false;\n        })\n      );\n    });\n  }\n}\n\nexport default Updater;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport JavascriptStateMachine from 'javascript-state-machine';\nimport isNil from 'lodash/isNil';\n\nimport ErrorLevel from '../../error/error-level';\nimport StateMachineFactory from '../../state-machine/state-machine-factory';\nimport StateMachine from '../../state-machine/state-machine';\nimport ViewerLifeCycle from '../life-cycle/viewer-life-cycle';\n\n// TODO ZabezpeÄ�enÃ­:\n// - KvÅ¯li problÃ©mÅ¯m s funkÄ�nostÃ­ web aplikacÃ­ je u sandbox povoleno \"allow-same-origin\".\n// - To je bezpeÄ�nostnÃ­m rizikem, obzvlÃ¡Å¡tÄ› pÅ™i spuÅ¡tÄ›nÃ­ aplikace ze stejnÃ©ho origin.\n//   - MÅ¯Å¾e napÅ™. zavolat `localstorage.clear()` a tÃ­m v podstatÄ› odinstalovat lighter zaÅ™Ã­zenÃ­.\n// - OÅ¡etÅ™enÃ­ do budoucna:\n//   - PÅ™idat na serveru pÅ™epÃ­naÄ� \"vypnout zabezpeÄ�enÃ­\", kterÃ½ by toto udÄ›lal jen pro vybranÃ© dÅ¯vÄ›ryhodnÃ© weby.\n//   - PÅ™es message channel poskytovat speciÃ¡lnÃ­ lighter rozhranÃ­ pro prÃ¡ci s localstorage a pÅ™Ã­padnÃ© dalÅ¡Ã­ sluÅ¾by.\n//   - MoÅ¾nÃ¡ zkusit zakÃ¡zat URL zaÄ�Ã­najÃ­cÃ­ `file://` a zabrÃ¡nit shodÄ› origin.\n//     - Ale je otÃ¡zkou jestli to nejde obejÃ­t (aliasy apod.).\n/**\n * OvladaÄ� pro zobrazovÃ¡nÃ­ webovÃ½ch strÃ¡nek.\n * @implements {ViewerController}\n */\nclass ViewerControllerIframe {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {number} loadDelay\n   * @param {HtmlIframePreflighter} preflighter\n   * @param {Object} [opts={}]\n   * @param {boolean} [opts.scroll] ÃšmoÅ¾nit scroll v iframe.\n   * @returns {ViewerControllerIframe} NovÃ¡ instance.\n   */\n  constructor (loadDelay, preflighter, {scroll = false} = {}) {\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    this.loadDelay = loadDelay;\n    /**\n     * Timeout ID pro odpoÄ�et do maximÃ¡lnÃ­ doby Ä�ekÃ¡nÃ­ na naÄ�tenÃ­ iframe.\n     * Dokumentace:\n     * [Stack Overflow](https://stackoverflow.com/questions/375710/detect-failure-to-load-contents-of-an-iframe).\n     * @private\n     * @type {?number}\n     */\n    this.loadTimeout = null;\n    this.preflighter = preflighter;\n    this.scheduleInfo = null;\n    this.scroll = scroll;\n    const stateMachineFactory = new StateMachineFactory(JavascriptStateMachine, StateMachine);\n    this.viewerLifeCycle = new ViewerLifeCycle(stateMachineFactory);\n    this.viewerSource = null;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onElementError = this.onElementError.bind(this);\n    this.onElementLoad = this.onElementLoad.bind(this);\n    this.onLoadTimeout = this.onLoadTimeout.bind(this);\n  }\n\n  /**\n   * NavÃ¡Å¾e naslouchÃ¡nÃ­ udÃ¡lostem z elementu.\n   * @param {HTMLIframeElement} el Element, kterÃ©mu se naslouchÃ¡.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  bindElement (el) {\n    el.addEventListener('error', this.onElementError);\n    el.addEventListener('load', this.onElementLoad);\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    const {viewerSource} = this;\n    if (!isNil(viewerSource)) {\n      const el = viewerSource.getEl();\n      this.unbindElement(el);\n    }\n  }\n\n  /** @inheritdoc */\n  enter () {\n    return this.viewerLifeCycle.enter(() => {\n      // ZobrazenÃ­ obalujÃ­cÃ­ho elementu.\n      const viewerFrame = this.viewerSource.getFrame();\n      viewerFrame.enter();\n    });\n  }\n\n  /** @inheritdoc */\n  leave () {\n    return this.viewerLifeCycle.leave(() => {\n      // SkrytÃ­ obalujÃ­cÃ­ho elementu.\n      const viewerFrame = this.viewerSource.getFrame();\n      viewerFrame.leave();\n    });\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na chybu v elementu.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onElementError () {\n    clearTimeout(this.loadTimeout);\n    const error = new Error(`Unknown HTMLIframeElement error.`);\n    this.emitter.emit('error', error);\n  }\n\n  /**\n   * Reakce na naÄ�tenÃ­ zdroje v elementu.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onElementLoad () {\n    clearTimeout(this.loadTimeout);\n    this.emitter.emit('loaded');\n  }\n\n  /**\n   * Reakce na vyprÅ¡enÃ­ Ä�asovaÄ�e pro load.\n   * @private\n   * @returns {undefined}\n   */\n  onLoadTimeout () {\n    const error = new Error(`HTMLIframeElement load timed out.`);\n    this.emitter.emit('error', error);\n  }\n\n  /**\n   * Reakce na chybu pÅ™i testovÃ¡nÃ­ dostupnosti URL pro iframe.\n   * @param {Error} error\n   * @private\n   * @returns {undefined}\n   */\n  onPreflightError (error) {\n    // SnÃ­Å¾enÃ­ priority logovÃ¡nÃ­ pro chyby sÃ­Å¥ovÃ©ho spojenÃ­.\n    error.level = ErrorLevel.Warning;\n    this.emitter.emit('error', error);\n  }\n\n  /** @inheritdoc */\n  release () {\n    return this.viewerLifeCycle.release(() => {\n      const {viewerSource} = this;\n      // UvolnÄ›nÃ­ obalujÃ­cÃ­ho elementu.\n      const viewerFrame = viewerSource.getFrame();\n      viewerFrame.release();\n      // UvolnÄ›nÃ­ zdrojovÃ©ho elementu.\n      const el = viewerSource.getEl();\n      this.unbindElement(el);\n      // ÄŒasovaÄ� pro naÄ�tenÃ­.\n      clearTimeout(this.loadTimeout);\n      // ZruÅ¡enÃ­ hodnot v instanci.\n      this.scheduleInfo = null;\n      this.viewerSource = null;\n    });\n  }\n\n  /** @inheritdoc */\n  seize (scheduleInfo, viewerSource) {\n    return this.viewerLifeCycle.seize(() => {\n      // NastavenÃ­ zÃ¡kladnÃ­ch hodnot.\n      this.scheduleInfo = scheduleInfo;\n      this.viewerSource = viewerSource;\n      // PÅ™Ã­prava obalujÃ­cÃ­ho elementu.\n      const viewerFrame = viewerSource.getFrame();\n      viewerFrame.seize(scheduleInfo);\n      // PÅ™Ã­prava zdrojovÃ©ho elementu.\n      const el = viewerSource.getEl();\n      this.bindElement(el);\n      el.classList.add('viewer-controller-iframe');\n      el.sandbox = 'allow-forms allow-same-origin allow-scripts';\n      // Deaktivace scrollovÃ¡nÃ­ v iframe.\n      if (!this.scroll) {\n        el.classList.add('viewer-controller-iframe--no-scroll');\n        // OznaÄ�eno jako deprecated, ale nÄ›kterÃ© prohlÃ­Å¾eÄ�e ho vyÅ¾adujÃ­.\n        el.scrolling = 'no';\n      }\n      const url = scheduleInfo.getUrl();\n      // Otestuje se, jestli je URL dostupnÃ¡.\n      // PÅ™es pÅ™iÅ™azenÃ­ do iframe to nelze zjistit.\n      // Na vÃ½sledek dotazu se neÄ�ekÃ¡, stejnÄ› jako na nastavenÃ­ zdroje.\n      this.preflighter.preflight(url)\n      .catch((error) => this.onPreflightError(error));\n      // ÄŒasovaÄ� pro naÄ�tenÃ­.\n      this.loadTimeout = setTimeout(this.onLoadTimeout, this.loadDelay);\n      // NastavenÃ­ zdroje.\n      el.src = url;\n    });\n  }\n\n  /**\n   * UvolnÃ­ naslouchÃ¡nÃ­ udÃ¡lostem z elementu.\n   * @param {HTMLIframeElement} el Element, kterÃ©mu se naslouchÃ¡.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  unbindElement (el) {\n    el.removeEventListener('error', this.onElementError);\n    el.removeEventListener('load', this.onElementLoad);\n  }\n}\n\nexport default ViewerControllerIframe;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\nimport isNumber from 'lodash/isNumber';\nimport isObject from 'lodash/isObject';\n\n// TODO Unit testy.\n/**\n * TovÃ¡rna na sprÃ¡vce zpoÅ¾dÄ›nÃ­.\n * @implements {Destroyable}\n */\nclass ViewerDelayerFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<ViewerDelayer>} ViewerDelayer Konstruktor pro sprÃ¡vce zpoÅ¾dÄ›nÃ­.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {number} [opts.delay] ZpoÅ¾dÄ›nÃ­, kterÃ© se aplikuje pÅ™i detekovanÃ©m zacyklenÃ­.\n   * @param {number} [opts.limit] PoÄ�et selhÃ¡nÃ­ v Å™adÄ›, kterÃ½ se povaÅ¾uje za zacyklenÃ­.\n   * @returns {ViewerDelayerFactory} NovÃ¡ instance.\n   */\n  constructor (ViewerDelayer, {delay, limit} = {}) {\n    if (!isObject(ViewerDelayer)) {\n      throw new TypeError(`Invalid viewer delayer constructor ${ViewerDelayer}.`);\n    }\n    if (!isNil(delay) && !isNumber(delay)) {\n      throw new TypeError(`Invalid delay ${delay}.`);\n    }\n    if (!isNil(limit) && !isNumber(limit)) {\n      throw new TypeError(`Invalid limit ${limit}.`);\n    }\n    this.ViewerDelayer = ViewerDelayer;\n    this.delay = delay;\n    this.limit = limit;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ©ho sprÃ¡vce zpoÅ¾dÄ›nÃ­.\n   * @returns {ViewerDelayer} VytvoÅ™enÃ½ sprÃ¡vce zpoÅ¾dÄ›nÃ­.\n   */\n  create () {\n    return new this.ViewerDelayer({delay: this.delay, limit: this.limit});\n  }\n}\n\nexport default ViewerDelayerFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNumber from 'lodash/isNumber';\n\n// TODO Unit testy.\n/**\n * SprÃ¡vce zpoÅ¾dÄ›nÃ­, jako ochrany proti zacyklenÃ­ prolÃ­naÄ�e.\n * Detekuje prÅ¯chod celÃ½m cyklem pÅ™ehrÃ¡vanÃ½ch mÃ©diÃ­ a aplikuje zpoÅ¾dÄ›nÃ­.\n * @implements {Destroyable}\n */\nclass ViewerDelayer {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {number} [opts.delay=0] ZpoÅ¾dÄ›nÃ­, kterÃ© se aplikuje pÅ™i detekovanÃ©m zacyklenÃ­.\n   * @param {number} [opts.limit=Infinity] PoÄ�et selhÃ¡nÃ­ v Å™adÄ›, kterÃ½ se povaÅ¾uje za zacyklenÃ­.\n   * @returns {ViewerDelayer} NovÃ¡ instance.\n   */\n  constructor ({delay = 0, limit = Infinity} = {}) {\n    if (!isNumber(delay)) {\n      throw new TypeError(`Invalid delay ${delay}.`);\n    }\n    if (!isNumber(limit)) {\n      throw new TypeError(`Invalid limit ${limit}.`);\n    }\n    // AktuÃ¡lnÃ­ poÄ�et selhÃ¡nÃ­ v Å™adÄ›.\n    this.count = 0;\n    this.delay = delay;\n    this.limit = limit;\n    this.timeout = null;\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    clearTimeout(this.timeout);\n  }\n\n  /**\n   * Informuje o selhÃ¡nÃ­ pÅ™i zobrazenÃ­ mÃ©dia.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po oÅ¡etÅ™enÃ­ zacyklenÃ­ pÅ™i selhÃ¡nÃ­.\n   */\n  fail () {\n    return new Promise((resolve) => {\n      // UrÄ�Ã­ se aktuÃ¡lnÃ­ poÄ�et selhÃ¡nÃ­.\n      const count = this.count + 1;\n      if (count > this.limit) {\n        // PÅ™i pÅ™esaÅ¾enÃ­ povolenÃ©ho poÄ�tu selhÃ¡nÃ­ se poÄ�Ã­tadlo resetuje.\n        this.count = 0;\n        // Aktivuje se pozdrÅ¾enÃ­ reakce na chybovÃ© udÃ¡losti, aby neochÃ¡zelo k zacyklenÃ­.\n        // Pokud je zotavenÃ­ pozdrÅ¾eno, provede se aÅ¾ po zvolenÃ©m zpoÅ¾dÄ›nÃ­.\n        return setTimeout(resolve, this.delay);\n      }\n      // Bez pÅ™esaÅ¾enÃ­ se poÄ�et uloÅ¾Ã­ pro dalÅ¡Ã­ pouÅ¾itÃ­.\n      this.count = count;\n      return resolve();\n    });\n  }\n\n  /**\n   * Informuje o ÃºspÄ›chu pÅ™i zobrazenÃ­ mÃ©dia.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po oÅ¡etÅ™enÃ­ zacyklenÃ­ pÅ™i ÃºspÄ›chu.\n   */\n  succeed () {\n    return new Promise((resolve) => {\n      // PÅ™i ÃºspÄ›Å¡nÄ› naÄ�tenÃ©m slajdu se resetuje poÄ�Ã­tadlo selhÃ¡nÃ­.\n      this.count = 0;\n      // ZpoÅ¾dÄ›nÃ­ u ÃºspÄ›chu se zatÃ­m neaplikuje nikdy.\n      return resolve();\n    });\n  }\n}\n\nexport default ViewerDelayer;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na organizÃ¡tory zobrazovÃ¡nÃ­ obsahu.\n */\nclass ViewerDirectorFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<ViewerDirector>} ViewerDirector Konstruktor pro organizÃ¡tory.\n   * @param {QueueFactory} queueFactory TovÃ¡rna na fronty asynchronnÃ­ch akcÃ­.\n   * @param {ViewerThreadFactory} threadFactory TovÃ¡rna na vlÃ¡kna zobrazujÃ­cÃ­ obsah.\n   */\n  constructor (ViewerDirector, queueFactory, threadFactory) {\n    this.ViewerDirector = ViewerDirector;\n    this.queueFactory = queueFactory;\n    this.threadFactory = threadFactory;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ organizÃ¡tor zobrazovÃ¡nÃ­ obsahu.\n   * @param {HTMLElement} el ELement, do kterÃ©ho se prolÃ­naÄ� vykresluje.\n   * @returns {ViewerDirector} VytvoÅ™enÃ½ organizÃ¡tor.\n   */\n  create (el) {\n    return new this.ViewerDirector(el, this.queueFactory, this.threadFactory);\n  }\n}\n\nexport default ViewerDirectorFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Zdroj organizÃ¡torÅ¯ zobrazovÃ¡nÃ­ obsahu.\n * Dovoluje pÅ™Ã­stup ke vÅ¡em vytvoÅ™enÃ½m organizÃ¡torÅ¯m.\n * AktuÃ¡lnÄ› je organizÃ¡tor v danÃ½ okamÅ¾ik pouze jeden,\n * nebo Å¾Ã¡dnÃ½ (pÅ™ed spuÅ¡tÄ›nÃ­m, po odinstalaci).\n */\nclass ViewerDirectorResource {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {ViewerDirectorFactory} factory\n   */\n  constructor (factory) {\n    this.directorArray = [];\n    this.factory = factory;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ organizÃ¡tor zobrazovÃ¡nÃ­ obsahu.\n   * @param {HTMLElement} el ELement, do kterÃ©ho se prolÃ­naÄ� vykresluje.\n   * @returns {ViewerDirector} VytvoÅ™enÃ½ organizÃ¡tor.\n   */\n  create (el) {\n    const director = this.factory.create(el);\n    this.directorArray.push(director);\n    return director;\n  }\n\n  /**\n   * ZruÅ¡Ã­ vytvoÅ™enÃ½ organizÃ¡tor zobrazovÃ¡nÃ­ obsahu.\n   * @param {ViewerDirector} director\n   * @returns {undefined}\n   */\n  destroy (director) {\n    const {directorArray} = this;\n    const index = directorArray.indexOf(director);\n    if (index === -1) {\n      throw new Error(`Unknown director \"${director}\".`);\n    }\n    directorArray.splice(index, 1);\n    director.destroy();\n  }\n\n  /**\n   * ZjistÃ­ vÅ¡echny aktuÃ¡lnÄ› vytvoÅ™enÃ© organizÃ¡tory zobrazovÃ¡nÃ­ obsahu.\n   * @returns {Array.<ViewerDirector>}\n   */\n  getAll () {\n    return Array.from(this.directorArray);\n  }\n}\n\nexport default ViewerDirectorResource;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\n\n/**\n * OrganizÃ¡tor hlavnÃ­ho procesu zobrazovÃ¡nÃ­ obsahu v prolÃ­naÄ�i.\n * @implements {Destroyable}\n * @implements {EventBus}\n */\nclass ViewerDirector {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {HTMLElement} el ELement, do kterÃ©ho se prolÃ­naÄ� vykresluje.\n   * @param {QueueFactory} queueFactory TovÃ¡rna na fronty asynchronnÃ­ch akcÃ­.\n   * @param {ViewerThreadFactory} threadFactory TovÃ¡rna na vlÃ¡kna zobrazujÃ­cÃ­ obsah.\n   */\n  constructor (el, queueFactory, threadFactory) {\n    this.el = el;\n    this.emitter = new EventEmitter();\n    /**\n     * Fronta asynchronnÃ­ch zmÄ›n v plÃ¡novÃ¡nÃ­.\n     * @private\n     * @type {Queue}\n     */\n    this.queue = queueFactory.create();\n    /**\n     * Seznam vlÃ¡ken, kterÃ© zobrazujÃ­ obsah.\n     * @private\n     * @type {Array.<ViewerThread>}\n     */\n    this.threadArray = [];\n    this.threadFactory = threadFactory;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onEntered = this.onEntered.bind(this);\n    this.onError = this.onError.bind(this);\n    this.onPlayed = this.onPlayed.bind(this);\n  }\n\n  /**\n   * NavÃ¡Å¾e naslouchÃ¡nÃ­ udÃ¡lostem z vlÃ¡kna.\n   * @param {ViewerThread} thread VlÃ¡kno, kterÃ©mu se naslouchÃ¡.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  bindThread (thread) {\n    thread.on('error', this.onError);\n    thread.on('entered', this.onEntered);\n    thread.on('played', this.onPlayed);\n  }\n\n  /**\n   * SpustÃ­ novÃ© vykreslovacÃ­ vlÃ¡kno.\n   * @param {ScheduleStrategy} scheduleStrategy Strategie pÅ™ehrÃ¡vÃ¡nÃ­, kterou se mÃ¡ vlÃ¡kno Å™Ã­dit.\n   * @private\n   * @returns {undefined} NovÃ© vlÃ¡kno.\n   */\n  createThread (scheduleStrategy) {\n    const thread = this.threadFactory.create(this.el, scheduleStrategy);\n    this.bindThread(thread);\n    thread.start();\n    return thread;\n  }\n\n  /**\n   * VytvoÅ™Ã­ a spustÃ­ pÅ™ehrÃ¡vacÃ­ vlÃ¡kna pro danÃ© strategie.\n   * @param {Array<ScheduleStrategy>} scheduleStrategyArray Seznam strategiÃ­ k pÅ™ehrÃ¡nÃ­.\n   * @returns {Promise.<undefined>} Nic.\n   */\n  createThreads (scheduleStrategyArray) {\n    return new Promise((resolve) => resolve(\n      this.queue.enqueue(() => {\n        const threadArray = scheduleStrategyArray.map((scheduleStrategy) => (\n          this.createThread(scheduleStrategy)\n        ));\n        this.threadArray = this.threadArray.concat(threadArray);\n      })\n    ));\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    this.threadArray.forEach((thread) => {\n      this.unbindThread(thread);\n      thread.destroy();\n    });\n  }\n\n  /**\n   * ZastavÃ­ vykreslovacÃ­ vlÃ¡kno.\n   * @param {ViewerThread} thread VlÃ¡kno ke zruÅ¡enÃ­.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  destroyThread (thread) {\n    this.unbindThread(thread);\n    return (\n      thread.stop()\n      .then(() => thread.destroy())\n    );\n  }\n\n  /**\n   * ZastavÃ­ a zruÅ¡Ã­ vÅ¡echna pÅ™ehrÃ¡vacÃ­ vlÃ¡kna.\n   * @returns {Promise.<undefined>} Nic.\n   */\n  destroyThreads () {\n    return new Promise((resolve) => resolve(\n      this.queue.enqueue(() => (\n        this.threadArray.reduce(\n          (acc, thread) => acc.then(() => (\n            this.destroyThread(thread)\n          )),\n          Promise.resolve()\n        )\n        .then(() => {\n          this.threadArray = [];\n        })\n      ))\n    ));\n  }\n\n  /**\n   * OÅ¡etÅ™enÃ­ vzniklÃ© asynchronnÃ­ chyby.\n   * @param {Error} error NativnÃ­ chybovÃ½ objekt.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  handleError (error) {\n    this.emitter.emit('error', error);\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na zobrazenÃ­ slajdu.\n   * @param {ScheduleInfo} scheduleInfo Informace o naplÃ¡novanÃ©m mÃ©diu.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onEntered (scheduleInfo) {\n    this.emitter.emit('entered', scheduleInfo);\n  }\n\n  /**\n   * Reakce na vyvolÃ¡nÃ­ chyby.\n   * @param {Error} error NativnÃ­ chybovÃ½ objekt.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onError (error) {\n    this.handleError(error);\n  }\n\n  /**\n   * Reakce na pÅ™ehrÃ¡nÃ­ slajdu.\n   * @param {ScheduleInfo} scheduleInfo Informace o naplÃ¡novanÃ©m mÃ©diu.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onPlayed (scheduleInfo) {\n    this.emitter.emit('played', scheduleInfo);\n  }\n\n  /**\n   * UvolnÃ­ naslouchÃ¡nÃ­ udÃ¡lostem z vlÃ¡kna.\n   * @param {ViewerThread} thread VlÃ¡kno, kterÃ©mu se naslouchÃ¡.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  unbindThread (thread) {\n    thread.off('error', this.onError);\n    thread.off('entered', this.onEntered);\n    thread.off('played', this.onPlayed);\n  }\n}\n\n/**\n * ZobrazenÃ­ mÃ©dia.\n * @event ViewerDirector#entered\n * @param {ScheduleInfo} scheduleInfo Informace o naplÃ¡novanÃ©m mÃ©diu, kterÃ© byly zobrazeny.\n */\n\n/**\n * ChybovÃ¡ udÃ¡lost.\n * @event ViewerDirector#error\n * @param {Error} error ChybovÃ© hlÃ¡Å¡enÃ­.\n */\n\n/**\n * DosaÅ¾enÃ­ konce pÅ™ehrÃ¡vÃ¡nÃ­ mÃ©dia.\n * @event ViewerDirector#played\n * @param {ScheduleInfo} scheduleInfo Informace o naplÃ¡novanÃ©m mÃ©diu, kterÃ© byly pÅ™ehrÃ¡ny.\n */\n\nexport default ViewerDirector;\n","/**\n * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna pro stavovÃ½ automat Å¾ivotnÃ­ho cyklu.\n */\nclass ViewerLifeCycleFactory {\n  /**\n   * VytvoÅ™Ã­ instanci\n   * @param {Class.<ViewerLifeCycle>} ViewerLifeCycle\n   * @param {StateMachineFactory} stateMachineFactory\n   * @returns {ViewerLifeCycleFactory} NovÃ¡ instance.\n   */\n  constructor (ViewerLifeCycle, stateMachineFactory) {\n    this.ViewerLifeCycle = ViewerLifeCycle;\n    this.stateMachineFactory = stateMachineFactory;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ stavovÃ½ automat Å¾ivotnÃ­ho cyklu.\n   * @returns {ViewerLifeCycle} VytvoÅ™enÃ½ stavovÃ½ automat.\n   */\n  create () {\n    return new this.ViewerLifeCycle(this.stateMachineFactory);\n  }\n}\n\nexport default ViewerLifeCycleFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Å½ivotnÃ­ cyklus ovladaÄ�e pro zobrazovÃ¡nÃ­ mÃ©diÃ­.\n * PomocnÃ¡ tÅ™Ã­da pro kontrolu sprÃ¡vnÃ© posloupnosti volÃ¡nÃ­ metod.\n *\n * ![Diagram stavovÃ©ho automatu](./core/viewer/life-cycle/viewer-life-cycle.doc.png)\n */\nclass ViewerLifeCycle {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {StateMachineFactory} stateMachineFactory\n   * @returns {ViewerLifeCycle} NovÃ¡ instance.\n   */\n  constructor (stateMachineFactory) {\n    /**\n     * StavovÃ½ automat Å¾ivotnÃ­ho cyklu.\n     * @private\n     * @type {StateMachine}\n     */\n    this.stateMachine = stateMachineFactory.create({\n      init: 'created',\n      transitions: [\n        {name: 'enter', from: 'seized', to: 'entered'},\n        {name: 'leave', from: 'entered', to: 'left'},\n        {name: 'release', from: ['left', 'seized'], to: 'released'},\n        {name: 'seize', from: 'created', to: 'seized'}\n      ]\n    });\n  }\n\n  /**\n   * ZahÃ¡jÃ­ zobrazenÃ­ mÃ©dia a jeho pÅ™ehrÃ¡vÃ¡nÃ­.\n   * @param {Function} cb Async operace, kterÃ© se provÃ¡dÄ›jÃ­ pÅ™i zobrazenÃ­.\n   * @returns {Promise.<*>} VÃ½sledek operacÃ­ pÅ™i zobrazenÃ­.\n   */\n  enter (cb) {\n    return this.stateMachine.transitAsync('enter', cb);\n  }\n\n  /**\n   * ZahÃ¡jÃ­ skrytÃ­ mÃ©dia a ukonÄ�enÃ­ jeho pÅ™ehrÃ¡vÃ¡nÃ­.\n   * @param {Function} cb Async operace, kterÃ© se provÃ¡dÄ›jÃ­ pÅ™i skrytÃ­.\n   * @returns {Promise.<*>} VÃ½sledek operacÃ­ pÅ™i skrytÃ­.\n   */\n  leave (cb) {\n    return this.stateMachine.transitAsync('leave', cb);\n  }\n\n  /**\n   * UvolnÃ­ sdÃ­lenÃ½ element k dalÅ¡Ã­mu pouÅ¾itÃ­.\n   * @param {Function} cb Async operace, kterÃ© se provÃ¡dÄ›jÃ­ pÅ™i uvolnÄ›nÃ­.\n   * @returns {Promise.<*>} VÃ½sledek operacÃ­ pÅ™i uvolnÄ›nÃ­.\n   */\n  release (cb) {\n    return this.stateMachine.transitAsync('release', cb);\n  }\n\n  /**\n   * PÅ™evezme kontrolu nad sdÃ­lenÃ½m elementem.\n   * @param {Function} cb Async operace, kterÃ© se provÃ¡dÄ›jÃ­ pÅ™i pÅ™ebÃ­rÃ¡nÃ­.\n   * @returns {Promise.<*>} VÃ½sledek operacÃ­ pÅ™i pÅ™ebÃ­rÃ¡nÃ­.\n   */\n  seize (cb) {\n    return this.stateMachine.transitAsync('seize', cb);\n  }\n}\n\nexport default ViewerLifeCycle;\n","module.exports = \"<div\\n  class=\\\"viewer-root\\\"\\n  v-bind:class=\\\"className\\\"\\n  v-if=\\\"rootVisible\\\"\\n></div>\\n<div\\n  class=\\\"viewer-root\\\"\\n  v-bind:class=\\\"className\\\"\\n  v-else-if=\\\"loaderVisible\\\"\\n>\\n  <loader-root>Loading the device content. Please wait...</loader-root>\\n</div>\\n\";","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\n\nimport OrientationEnum from '../../orientation/orientation-enum';\nimport LoaderRoot from '../../loader/loader-root';\nimport template from './viewer-root.html';\n\n// TODO #295 PÅ™esunout loading mimo tuto tÅ™Ã­du.\n// - IdeÃ¡lnÄ› do nÄ›Ä�eho jako LoaderService,\n//   kterÃ¡ bude napojenÃ¡ na loader vygenerovanÃ­ v `index.html`.\n//   HTML kÃ³d loading by mÄ›l zÅ¯stat zachovÃ¡n bez zbyteÄ�nÃ©ho odebÃ­rÃ¡nÃ­ z DOM.\n//   DÃ­ky tomu by do budoucna nebylo nutnÃ© Å™eÅ¡it Ä�ekÃ¡nÃ­ na `rootVisible`.\n// - ZatÃ­m je pouÅ¾itÃ½ hotfix s pÅ™epÃ­nÃ¡nÃ­m mezi dvÄ›ma elementy `viewer-root`.\n//   PÅ™i pouÅ¾itÃ­ samostatnÃ©ho `v-if` bez `v-else` se vklÃ¡dÃ¡ ruÅ¡ivÃ½ komentÃ¡Å™.\n//   Na pozadÃ­ stejnÄ› Vue `viewer-root` element recykluje,\n//   takÅ¾e se pÅ™i pÅ™epnutÃ­ zachovÃ¡.\n// TODO PÅ™idat UML diagram s posloupnostÃ­ spouÅ¡tÄ›nÃ­ prolÃ­naÄ�e (orientace, obsah, loading).\nexport default {\n  name: 'ViewerRoot',\n  template,\n  components: {LoaderRoot},\n  computed: {\n    className () {\n      const {orientationEnum} = this;\n      switch (orientationEnum) {\n        case OrientationEnum.CLOCKWISE_0:\n          return 'viewer-root--orientation-0';\n        case OrientationEnum.CLOCKWISE_90:\n          return 'viewer-root--orientation-90';\n        case OrientationEnum.CLOCKWISE_180:\n          return 'viewer-root--orientation-180';\n        case OrientationEnum.CLOCKWISE_270:\n          return 'viewer-root--orientation-270';\n        default:\n          return '';\n      }\n    },\n    loaderVisible () {\n      // MusÃ­ bÃ½t znÃ¡ma orientace,\n      // aby se mohli urÄ�it rozmÄ›ry do kterÃ½ch se bude vykreslovat.\n      return this.orientationEnum;\n    },\n    rootVisible () {\n      // Dokud nenÃ­ doruÄ�en nÄ›jakÃ½ obsah,\n      // tak se zobrazuje loading animace.\n      return this.contentReady && this.orientationEnum;\n    }\n  },\n  created () {\n    const {device} = this.$root;\n    // NaslouchÃ¡nÃ­ udÃ¡lostem.\n    device.on('content', this.onContent);\n    // Aktualizace orientace zaÅ™Ã­zenÃ­.\n    this.refresh();\n    // SpuÅ¡tÄ›nÃ­ synchronizace.\n    device.connect()\n    .catch((error) => this.handleError(error));\n  },\n  data () {\n    return {\n      contentReady: !isNil(this.$root.session.contentTimestamp),\n      orientationEnum: null\n    };\n  },\n  destroyed () {\n    const {device} = this.$root;\n    // ZruÅ¡enÃ­ naslouchÃ¡nÃ­ udÃ¡lostem.\n    device.off('content', this.onContent);\n    const {director} = this;\n    if (!isNil(director)) {\n      this.destroyDirector(director);\n    }\n  },\n  methods: {\n    createDirector () {\n      const director = this.$root.device.createDirector(this.$el);\n      director.on('error', this.onError);\n      director.on('entered', this.onEntered);\n      director.on('played', this.onPlayed);\n      return director;\n    },\n    destroyDirector (director) {\n      director.off('error', this.onError);\n      director.off('entered', this.onEntered);\n      director.off('played', this.onPlayed);\n      this.$root.device.destroyDirector(director);\n    },\n    handleError (error) {\n      this.$emit('error', error);\n    },\n    onContent () {\n      this.contentReady = true;\n      // Aktualizace orientace zaÅ™Ã­zenÃ­.\n      // TODO LogiÄ�tÄ›jÅ¡Ã­ by asi bylo, aby reagovalo na zmÄ›nu orientace a ne obsahu.\n      this.refresh();\n    },\n    onEntered (scheduleInfo) {\n      this.$emit('entered', scheduleInfo);\n    },\n    onError (error) {\n      this.handleError(error);\n    },\n    onPlayed (scheduleInfo) {\n      this.$root.device.hit(scheduleInfo)\n      .catch((error) => this.handleError(error));\n    },\n    refresh () {\n      this.$root.screenManager.getCssOrientation()\n      .then((orientationEnum) => {\n        this.orientationEnum = orientationEnum;\n      })\n      .catch((error) => this.handleError(error));\n    }\n  },\n  watch: {\n    // TODO #295 Hotfix spuÅ¡tÄ›nÃ­ prolÃ­naÄ�e.\n    // - TechnickÃ½ dluh z pÅ™edchozÃ­ implementace se zanoÅ™enÃ­m do ViewerList.\n    // - SpolÃ©hÃ¡ se, Å¾e jiÅ¾ prolÃ­naÄ� nebude deaktivovÃ¡n,\n    //   Å¾e se nebude vytvÃ¡Å™et opakovanÄ› apod.\n    // - IdeÃ¡lnÄ› by se komponenta nemÄ›la zobrazovat,\n    //   dokud nebudou pÅ™ebnÃ© informace dostupnÃ© (orientace, obsah, ...).\n    rootVisible (value) {\n      if (!value || this.director) {\n        // Dokud nejsou informace dostupnÃ©, nic se nedÄ›lÃ¡.\n        // OpakovanÃ¡ volÃ¡nÃ­ jsou takÃ© ignorovÃ¡na.\n        return;\n      }\n      // PoÄ�kÃ¡ se na vykreslenÃ­ elementu a zahÃ¡jÃ­ se zobrazovÃ¡nÃ­ prolÃ­naÄ�e.\n      // Vue nedovoluje pokroÄ�ilou sprÃ¡vu elementÅ¯,\n      // takÅ¾e nelze pro implmentaci prolÃ­naÄ�e pouÅ¾Ã­t.\n      this.$nextTick(() => {\n        const director = this.createDirector();\n        this.director = director;\n      });\n    }\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isObject from 'lodash/isObject';\n\n/**\n * TovÃ¡rna na slajdy pro pÅ™ehrÃ¡vaÄ�e obsahu.\n */\nclass ViewerSlideFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<ViewerSlide>} ViewerSlide Konstruktor pro slajdy.\n   * @param {StateMachineFactory} stateMachineFactory\n   * @returns {ViewerSlideFactory} NovÃ¡ instance.\n   */\n  constructor (ViewerSlide, stateMachineFactory) {\n    if (!isObject(ViewerSlide)) {\n      throw new TypeError(`Invalid viewer slide constructor ${ViewerSlide}.`);\n    }\n    this.ViewerSlide = ViewerSlide;\n    this.stateMachineFactory = stateMachineFactory;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ slajd pro pÅ™ehrÃ¡vaÄ�e obsahu.\n   * @param {HTMLElement} parentEl RodiÄ�ovskÃ½ element, do kterÃ©ho se vloÅ¾Ã­ elementy slajdu.\n   * @param {ScheduleInfo} scheduleInfo Informace o pÅ™ehrÃ¡nÃ­ mÃ©dia, kterÃ© mÃ¡ slajd pÅ™ehrÃ¡t.\n   * @returns {ViewerSlide} VytvoÅ™enÃ½ slajd.\n   */\n  create (parentEl, scheduleInfo) {\n    return new this.ViewerSlide(parentEl, scheduleInfo, this.stateMachineFactory);\n  }\n}\n\nexport default ViewerSlideFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport isBoolean from 'lodash/isBoolean';\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\n\n// TODO Unit testy.\n// - NapÅ™ed vyÄ�lenit testy `StateMachine` z `ViewerLifeCycle`.\n// TODO ProblÃ©m s navazavÃ¡nÃ­ udÃ¡lostÃ­ na seznam slajdÅ¯.\n// - ProlÃ­naÄ� mÃ¡ nÄ›kolik slajdÅ¯ a je nutnÃ© identifikovat, kterÃ½ udÃ¡lost vyvolal.\n// - ZÃ¡roveÅˆ je ale nutnÃ© mÃ­t listeren uloÅ¾enÃ½, aby Å¡el pÅ™idat pÅ™i #off.\n// - MoÅ¾nÃ¡ Å™eÅ¡enÃ­:\n//   - AktuÃ¡lnÄ› hotfixovÄ› pÅ™idÃ¡vÃ¡ argument samotnÃ½ viewerSlide: .emit('played', this).\n//   - ZneuÅ¾Ã­t #on argument context {viewerList, viewerSlide} mÃ­sto viewerList.\n//   - ÃšplnÄ› nejlÃ©pe by mÄ›lo bÃ½t ÃºmoÅ¾nÄ›no pÅ™i #on vklÃ¡dat parametry, kterÃ© by se pak pÅ™edali.\n//   - PÅ™Ã­padnÄ› mÃ­t `onPlayingError` a pÅ™epÃ­nat naslouchÃ¡nÃ­ dle zmÄ›n ve pÅ™iÅ™azenÃ­ slajdu.\n//   - NejhorÅ¡Ã­ varianta asi uklÃ¡dat listener pro kaÅ¾dÃ½ slajd v obalovacÃ­m objektu objetku: {viewerSlide, onError, onPlayed, ...}\n/**\n * Slajd pÅ™ehrÃ¡vaÄ�e obsahu.\n * Reprezentuje pÅ™ehrÃ¡nÃ­ naplÃ¡novanÃ©ho mÃ©dia v danÃ½ okamÅ¾ik na danÃ©m zdroji.\n * NarozdÃ­l od mÃ©dia se slajd pÅ™i pÅ™ehrÃ¡nÃ­ nikdy neopakuje.\n * Pro kaÅ¾dÃ© opakovanÃ© pÅ™ehrÃ¡nÃ­ mÃ©dia se vÅ¾dy vytvÃ¡Å™Ã­ novÃ½ slajd.\n *\n * ![Diagram stavovÃ©ho automatu](./core/viewer/slide/viewer-slide.doc.png)\n * @implements {Destroyable}\n * @implements {EventBus}\n */\nclass ViewerSlide {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {HTMLElement} parentEl RodiÄ�ovskÃ½ element, do kterÃ©ho se vloÅ¾Ã­ elementy slajdu.\n   * @param {ScheduleInfo} scheduleInfo Informace o pÅ™ehrÃ¡nÃ­ mÃ©dia, kterÃ© mÃ¡ slajd pÅ™ehrÃ¡t.\n   * @param {StateMachineFactory} stateMachineFactory\n   * @returns {ViewerSlide} NovÃ¡ instance.\n   */\n  constructor (parentEl, scheduleInfo, stateMachineFactory) {\n    if (!isObject(parentEl)) {\n      throw new TypeError(`Invalid parent element ${parentEl}.`);\n    }\n    if (!isObject(scheduleInfo)) {\n      throw new TypeError(`Invalid schedule info ${scheduleInfo}.`);\n    }\n    /**\n     * OvladaÄ�, kterÃ½ Å™Ã­dÃ­ zobrazenÃ­ slajdu.\n     * @private\n     * @type {?ViewerController}\n     */\n    this.controller = null;\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    this.failed = false;\n    this.parentEl = parentEl;\n    this.played = false;\n    this.scheduleInfo = scheduleInfo;\n    /**\n     * Zdroj, kterÃ½ poskytuje prostÅ™edky pro zobrazenÃ­ slajdu.\n     * @private\n     * @type {?ViewerSource}\n     */\n    this.source = null;\n    /**\n     * StavovÃ½ automat Å¾ivotnÃ­ho cyklu.\n     * @private\n     * @type {StateMachine}\n     */\n    this.stateMachine = stateMachineFactory.create({\n      init: 'created',\n      transitions: [\n        {name: 'delete', from: ['created', 'entered', 'left', 'seized'], to: 'deleted'},\n        {name: 'enter', from: 'seized', to: 'entered'},\n        {name: 'leave', from: 'entered', to: 'left'},\n        {name: 'release', from: ['left', 'seized'], to: 'released'},\n        {name: 'seize', from: 'created', to: 'seized'}\n      ]\n    });\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onError = this.onError.bind(this);\n    this.onLoaded = this.onLoaded.bind(this);\n    this.onPlayed = this.onPlayed.bind(this);\n  }\n\n  /**\n   * VytvoÅ™Ã­ ovladaÄ� a navÃ¡Å¾e naslouchÃ¡nÃ­ jeho udÃ¡lostem.\n   * @param {ViewerType} viewerType Typ mÃ©dia, kterÃ½ mÃ¡ ovladaÄ� vytvoÅ™it.\n   * @private\n   * @returns {ViewerController} VytvoÅ™enÃ½ ovladaÄ�.\n   */\n  createController (viewerType) {\n    const controller = viewerType.createController();\n    controller.on('error', this.onError);\n    controller.on('loaded', this.onLoaded);\n    controller.on('played', this.onPlayed);\n    return controller;\n  }\n\n  /**\n   * SmaÅ¾e poÅ¡kozenÃ½ slajd.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po smazÃ¡nÃ­.\n   */\n  delete () {\n    return this.stateMachine.transitAsync('delete', () => {\n      const {controller} = this;\n      if (!isNil(controller)) {\n        this.destroyController(controller);\n        this.controller = null;\n      }\n      const {source} = this;\n      if (isNil(source)) {\n        return;\n      }\n      return (\n        this.deleteSource(source)\n        .then(() => {\n          this.source = null;\n        })\n      );\n    });\n  }\n\n  /**\n   * SmaÅ¾e poÅ¡kozenÃ½ zdroj zobrazovÃ¡nÃ­ slajdu.\n   * @param {ViewerSource} source Zdroj, kterÃ½ se mÃ¡ smazat.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po smazÃ¡nÃ­.\n   */\n  deleteSource (source) {\n    // ZruÅ¡enÃ­ zdroje.\n    const viewerType = this.scheduleInfo.getViewerType();\n    const sourceCreator = viewerType.getSourceCreator();\n    return sourceCreator.delete(source);\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // TODO #271 ZatÃ­m nenÃ­ oficiÃ¡lnÄ› podporovanÃ½ a otestovanÃ½ destroy v jinÃ©m stavu, neÅ¾ po volÃ¡nÃ­ #release.\n    const {controller} = this;\n    if (!isNil(controller)) {\n      this.destroyController(controller);\n    }\n  }\n\n  /**\n   * ZruÅ¡Ã­ ovladaÄ� a uvolnÃ­ naslouchÃ¡nÃ­ jeho udÃ¡lostem.\n   * @param {ViewerController} controller OvladaÄ�, kterÃ½ se mÃ¡ zruÅ¡it.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  destroyController (controller) {\n    controller.off('error', this.onError);\n    controller.off('loaded', this.onLoaded);\n    controller.off('played', this.onPlayed);\n    controller.destroy();\n  }\n\n  /**\n   * ZahÃ¡jÃ­ zobrazenÃ­ a pÅ™ehrÃ¡vÃ¡nÃ­ slajdu.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po zobrazenÃ­.\n   */\n  enter () {\n    return this.stateMachine.transitAsync('enter', () => this.controller.enter());\n  }\n\n  /**\n   * ZjistÃ­ informace o pÅ™ehrÃ¡nÃ­ mÃ©dia, kterÃ© slajd zobrazuje.\n   * @returns {ScheduleInfo} Informace o pÅ™ehrÃ¡nÃ­ mÃ©dia.\n   */\n  getScheduleInfo () {\n    return this.scheduleInfo;\n  }\n\n  /**\n   * ZjistÃ­, jestli byl slajd oznaÄ�en jako poÅ¡kozenÃ½.\n   * @returns {boolean} PÅ™Ã­znak, Å¾e je slajd poÅ¡kozenÃ½.\n   */\n  isFailed () {\n    return this.failed;\n  }\n\n  /**\n   * ZjistÃ­, jestli byl slajd oznaÄ�en jako pÅ™ehranÃ½.\n   * @returns {boolean} PÅ™Ã­znak, Å¾e je slajd pÅ™ehranÃ½.\n   */\n  isPlayed () {\n    return this.played;\n  }\n\n  /**\n   * UkonÄ�Ã­ zobrazenÃ­ a pÅ™ehrÃ¡vÃ¡nÃ­ slajdu.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po skrytÃ­ slajdu.\n   */\n  leave () {\n    return this.stateMachine.transitAsync('leave', () => this.controller.leave());\n  }\n\n  /**\n   * UvolnÃ­ zdroj zobrazovÃ¡nÃ­ slajdu.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po uvolnÄ›nÃ­.\n   */\n  release () {\n    // TODO VyÄ�lenit metodu #return pro operace s ViewerSource?\n    return this.stateMachine.transitAsync('release', () => {\n      const {controller} = this;\n      return (\n        controller.release()\n        .then(() => {\n          this.destroyController(controller);\n          this.controller = null;\n          const viewerType = this.scheduleInfo.getViewerType();\n          const sourceCreator = viewerType.getSourceCreator();\n          return (\n            sourceCreator.receive(this.source)\n            .then(() => {\n              this.source = null;\n            })\n          );\n        })\n      );\n    });\n  }\n\n  /**\n   * Zabere zdroj a zaÄ�ne naÄ�Ã­tat slajd.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po zabrÃ¡nÃ­.\n   */\n  seize () {\n    // TODO VyÄ�lenit metodu #borrow pro operace s ViewerSource?\n    return this.stateMachine.transitAsync('seize', () => {\n      const {scheduleInfo} = this;\n      const viewerType = scheduleInfo.getViewerType();\n      const sourceCreator = viewerType.getSourceCreator();\n      return (\n        sourceCreator.lend(this.parentEl, scheduleInfo)\n        .then((source) => {\n          this.source = source;\n          const controller = this.createController(viewerType);\n          this.controller = controller;\n          return controller.seize(scheduleInfo, source);\n        })\n      );\n    });\n  }\n\n  /**\n   * OznaÄ�Ã­ slajd jako poÅ¡kozenÃ½.\n   * @param {boolean} value PÅ™Ã­znak, jestli je slajd poÅ¡kozenÃ½.\n   * @returns {undefined} Nic.\n   */\n  setFailed (value) {\n    if (!isBoolean(value)) {\n      throw new TypeError(`Invalid value ${value}.`);\n    }\n    this.failed = value;\n  }\n\n  /**\n   * OznaÄ�Ã­ slajd jako pÅ™ehranÃ½.\n   * @param {boolean} value PÅ™Ã­znak, jestli je slajd pÅ™ehranÃ½.\n   * @returns {undefined} Nic.\n   */\n  setPlayed (value) {\n    if (!isBoolean(value)) {\n      throw new TypeError(`Invalid value ${value}.`);\n    }\n    this.played = value;\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na chybu.\n   * @param {Error} error ChybovÃ½ objekt.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onError (error) {\n    this.emitter.emit('error', this, error);\n  }\n\n  /**\n   * Reakce na naÄ�tenÃ­ slajdu.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onLoaded () {\n    this.emitter.emit('loaded', this);\n  }\n\n  /**\n   * Reakce na pÅ™ehrÃ¡nÃ­ slajdu.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onPlayed () {\n    this.emitter.emit('played', this);\n  }\n}\n\n/**\n * ChybovÃ¡ udÃ¡lost.\n * @event ViewerSlide#error\n * @param {ViewerSlide} viewerSlide Slajd, ve kterÃ©m udÃ¡lost vznikla.\n * @param {Error} error ChybovÃ© hlÃ¡Å¡enÃ­.\n */\n\n/**\n * DokonÄ�enÃ­ naÄ�Ã­tÃ¡nÃ­ slajdu.\n * MusÃ­ bÃ½t vyvolÃ¡no jednou po pÅ™evzetÃ­ elementu.\n * @event ViewerSlide#loaded\n * @param {ViewerSlide} viewerSlide Slajd, ve kterÃ©m udÃ¡lost vznikla.\n */\n\n/**\n * DosaÅ¾enÃ­ konce pÅ™ehrÃ¡vÃ¡nÃ­ slajdu.\n * NÄ›kterÃ© slajdy nemusÃ­ vyvolat, pokud mÃ©dium nenÃ­ urÄ�eno k pÅ™ehrÃ¡nÃ­.\n * @event ViewerSlide#played\n * @param {ViewerSlide} viewerSlide Slajd, ve kterÃ©m udÃ¡lost vznikla.\n */\n\nexport default ViewerSlide;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO Unit testy.\n/**\n * Poskytovatel zdrojÅ¯ pro zobrazovÃ¡nÃ­ HTML iframe elementÅ¯.\n * Implementuje nÃ¡vrhovÃ½ vzor Object pool pro tvorbu zdrojÅ¯.\n * ProvÃ¡dÃ­ recyklaci vrÃ¡cenÃ½ch zdrojÅ¯ pro dalÅ¡Ã­ pouÅ¾itÃ­.\n * @implements {ViewerSourceCreator}\n */\nclass ViewerSourceIframeCreator {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {PoolFactory} poolFactory\n   * @param {ViewerSourceFactory} sourceFactory TovÃ¡rna na zdroje, kterÃ© se poskytujÃ­.\n   */\n  constructor (poolFactory, sourceFactory) {\n    this.pool = poolFactory.create(sourceFactory);\n    this.sourceFactory = sourceFactory;\n  }\n\n  /** @inheritdoc */\n  delete (source) {\n    return new Promise((resolve) => resolve(\n      this.pool.delete(source)\n    ));\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    this.pool.destroy();\n  }\n\n  /** @inheritdoc */\n  getLent () {\n    return this.pool.getLent();\n  }\n\n  /** @inheritdoc */\n  getMax () {\n    return this.pool.getMax();\n  }\n\n  /** @inheritdoc */\n  lend (parentEl, scheduleInfo) {\n    return new Promise((resolve) => {\n      const {pool} = this;\n      // NastavÃ­ se rodiÄ�ovskÃ½ element tovÃ¡rny, aby do nÄ›j vytvÃ¡Å™ela novÃ© zdroje.\n      // Nastavuje se dopÅ™edu, aby byl rodiÄ�ovskÃ½ element dostupnÃ½ v okamÅ¾iku plnÄ›nÃ­ bazÃ©nu.\n      this.sourceFactory.setParentEl(parentEl);\n      // VypÅ¯jÄ�enÃ­ zdroje z bazÃ©nu.\n      const source = pool.lend();\n      // NastavÃ­ se rodiÄ�ovskÃ½ element tovÃ¡rny, aby do nÄ›j vytvÃ¡Å™ela novÃ© zdroje.\n      // Nastavuje se duplicitnÄ›, protoÅ¾e nenÃ­ jistota, Å¾e datovÃ½ zdroj vytvoÅ™Ã­ tovÃ¡rna.\n      // MÅ¯Å¾e dojÃ­t k recyklaci a zdroj mÅ¯Å¾e mÃ­t nastaven starÃ½ rodiÄ�ovskÃ½ element.\n      source.setParentEl(parentEl);\n      return resolve(source);\n    });\n  }\n\n  /** @inheritdoc */\n  receive (source) {\n    return new Promise((resolve) => resolve(\n      this.pool.delete(source)\n    ));\n  }\n\n  /** @inheritdoc */\n  replace () {\n    // NenÃ­ tÅ™eba nic provÃ©st.\n    return Promise.resolve();\n  }\n}\n\nexport default ViewerSourceIframeCreator;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO Unit testy.\n/**\n * TovÃ¡rna na zdroje funkcionalit v podobÄ› HTML iframe elementÅ¯.\n * @implements {ViewerSourceFactory}\n */\nclass ViewerSourceIframeFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<ViewerSourceIframe>} ViewerSourceIframe Konstruktor zdroje iframe elementu.\n   * @param {ViewerFrameFactory} frameFactory\n   * @returns {ViewerSourceIframeFactory} NovÃ¡ instance.\n   */\n  constructor (ViewerSourceIframe, frameFactory) {\n    this.ViewerSourceIframe = ViewerSourceIframe;\n    this.frameFactory = frameFactory;\n    this.parentEl = null;\n  }\n\n  /** @inheritdoc */\n  create () {\n    return new this.ViewerSourceIframe(this.frameFactory, this.parentEl);\n  }\n\n  /** @inheritdoc */\n  delete (source) {\n    return source.destroy();\n  }\n\n  /** @inheritdoc */\n  setParentEl (parentEl) {\n    this.parentEl = parentEl;\n  }\n}\n\nexport default ViewerSourceIframeFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\n\n// TODO Unit testy.\n/**\n * Zdroj zobrazovÃ¡nÃ­ mÃ©diÃ­ v podobÄ› HTML iframe elementu.\n * ZdrojovÃ½ element je obalenÃ½ do rÃ¡mujÃ­cÃ­ho div a s nÃ­m vloÅ¾en na urÄ�enÃ© mÃ­sto do DOM.\n * @implements {ViewerSource}\n */\nclass ViewerSourceIframe {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {ViewerFrameFactory} frameFactory\n   * @param {HTMLElement} parentEl RodiÄ�ovskÃ½ element, urÄ�enÃ½ pro vklÃ¡dÃ¡nÃ­ elementÅ¯ zdroje.\n   * @returns {ViewerSourceIframe} NovÃ¡ instance.\n   */\n  constructor (frameFactory, parentEl) {\n    if (!isObject(parentEl)) {\n      // ZakÃ¡zÃ¡no vytvÃ¡Å™enÃ­ bez rodiÄ�ovskÃ©ho elementu, jinak nemÃ¡ pÅ™Ã­prava objektÅ¯ v bazÃ©nu smysl.\n      throw new TypeError(`Invalid parent element ${parentEl}.`);\n    }\n    // TODO VyÄ�lenit vytvoÅ™enÃ­ elementÅ¯ do samostatnÃ© public metody, neÅ¾ je mÃ­t v konstruktoru?\n    const frame = frameFactory.create();\n    const frameEl = frame.getEl();\n    const el = document.createElement('iframe');\n    frameEl.appendChild(el);\n    parentEl.appendChild(frameEl);\n    this.el = el;\n    this.frame = frame;\n    this.parentEl = parentEl;\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // UvolnÄ›nÃ­ img elementu zruÅ¡enÃ­m jeho src.\n    this.el.removeAttribute('src');\n    // OdebrÃ¡nÃ­ frame elementu z DOM.\n    const frameEl = this.frame.getEl();\n    this.parentEl.removeChild(frameEl);\n  }\n\n  /** @inheritdoc */\n  getEl () {\n    const {el} = this;\n    if (isNil(el)) {\n      throw new TypeError(`Missing element.`);\n    }\n    return el;\n  }\n\n  /** @inheritdoc */\n  getFrame () {\n    return this.frame;\n  }\n\n  /** @inheritdoc */\n  setParentEl (parentEl) {\n    if (!isObject(parentEl)) {\n      throw new TypeError(`Invalid parent element ${parentEl}.`);\n    }\n    if (parentEl === this.parentEl) {\n      // Pokud se rodiÄ�ovskÃ½ element nezmÄ›nÃ­, tak se pÅ™esun neprovÃ¡dÃ­.\n      return;\n    }\n    // PÅ™esun elementu do novÃ©ho rodiÄ�e.\n    // TODO PlatformovÄ› specifickÃ© prolÃ­naÄ�e. Pro Samsung moÅ¾no pÅ™idat omezenÃ­ nebo oÅ¡etÅ™enÃ­ pÅ™esunu.\n    // - PÅ™Ã­klad speciÃ¡lnÃ­ implementace, kterÃ¡ by nedovolila pÅ™esun elementu?\n    // - `AdapterTizenSssp4.ViewerSourceIframe`\n    const frameEl = this.frame.getEl();\n    parentEl.appendChild(frameEl);\n    this.parentEl = parentEl;\n  }\n}\n\nexport default ViewerSourceIframe;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO Unit testy.\n/**\n * Poskytovatel zdrojÅ¯ pro zobrazovÃ¡nÃ­ HTML video elementÅ¯.\n * Implementuje nÃ¡vrhovÃ½ vzor Object pool pro tvorbu zdrojÅ¯.\n * ProvÃ¡dÃ­ recyklaci vrÃ¡cenÃ½ch zdrojÅ¯ pro dalÅ¡Ã­ pouÅ¾itÃ­.\n * @implements {ViewerSourceCreator}\n */\nclass ViewerSourceVideoCreator {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {PoolFactory} poolFactory\n   * @param {HtmlVideoRepairer} repairer\n   * @param {ViewerSourceFactory} sourceFactory TovÃ¡rna na zdroje, kterÃ© se poskytujÃ­.\n   */\n  constructor (poolFactory, repairer, sourceFactory) {\n    this.pool = poolFactory.create(sourceFactory);\n    this.repairer = repairer;\n    this.sourceFactory = sourceFactory;\n  }\n\n  /** @inheritdoc */\n  delete (source) {\n    // PÅ™i odebÃ­rÃ¡nÃ­ velkÃ©ho poÄ�tu video elementÅ¯ z DOM dochÃ¡zÃ­ ve vÄ›tÅ¡inÄ› prohlÃ­Å¾eÄ�Å¯ k pamÄ›Å¥ovÃ½m ÃºnikÅ¯m.\n    // Proto se mÃ­sto odebrÃ¡nÃ­ provede pokus o vyÄ�iÅ¡tÄ›nÃ­ zdroje a jeho nÃ¡slednÃ© vrÃ¡cenÃ­ do pool pro dalÅ¡Ã­ pouÅ¾itÃ­.\n    return new Promise((resolve) => {\n      source.getFrame().repair();\n      return resolve(\n        this.repairer.repair(source.getEl())\n        .then(() => this.pool.receive(source))\n      );\n    });\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    this.pool.destroy();\n  }\n\n  /** @inheritdoc */\n  getLent () {\n    return this.pool.getLent();\n  }\n\n  /** @inheritdoc */\n  getMax () {\n    return this.pool.getMax();\n  }\n\n  /** @inheritdoc */\n  lend (parentEl, scheduleInfo) {\n    return new Promise((resolve) => {\n      // NastavÃ­ se rodiÄ�ovskÃ½ element tovÃ¡rny, aby do nÄ›j vytvÃ¡Å™ela novÃ© zdroje.\n      // Nastavuje se dopÅ™edu, aby byl rodiÄ�ovskÃ½ element dostupnÃ½ v okamÅ¾iku plnÄ›nÃ­ bazÃ©nu.\n      this.sourceFactory.setParentEl(parentEl);\n      // VypÅ¯jÄ�enÃ­ zdroje z bazÃ©nu.\n      const source = this.pool.lend();\n      // NastavÃ­ se rodiÄ�ovskÃ½ element tovÃ¡rny, aby do nÄ›j vytvÃ¡Å™ela novÃ© zdroje.\n      // Nastavuje se duplicitnÄ›, protoÅ¾e nenÃ­ jistota, Å¾e datovÃ½ zdroj vytvoÅ™Ã­ tovÃ¡rna.\n      // MÅ¯Å¾e dojÃ­t k recyklaci a zdroj mÅ¯Å¾e mÃ­t nastaven starÃ½ rodiÄ�ovskÃ½ element.\n      source.setParentEl(parentEl);\n      return resolve(source);\n    });\n  }\n\n  /** @inheritdoc */\n  receive (source) {\n    return new Promise((resolve) => resolve(\n      this.repairer.repair(source.getEl())\n      .then(() => this.pool.receive(source))\n    ));\n  }\n\n  /** @inheritdoc */\n  replace () {\n    // NenÃ­ tÅ™eba nic provÃ©st.\n    return Promise.resolve();\n  }\n}\n\nexport default ViewerSourceVideoCreator;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO Unit testy.\n/**\n * TovÃ¡rna na zdroje funkcionalit v podobÄ› HTML video elementÅ¯.\n * @implements {ViewerSourceFactory}\n */\nclass ViewerSourceVideoFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<ViewerSourceVideo>} ViewerSourceVideo Konstruktor zdroje video elementu.\n   * @param {ViewerFrameFactory} frameFactory\n   * @returns {ViewerSourceVideoFactory} NovÃ¡ instance.\n   */\n  constructor (ViewerSourceVideo, frameFactory) {\n    this.ViewerSourceVideo = ViewerSourceVideo;\n    this.frameFactory = frameFactory;\n    this.parentEl = null;\n  }\n\n  /** @inheritdoc */\n  create () {\n    return new this.ViewerSourceVideo(this.frameFactory, this.parentEl);\n  }\n\n  /** @inheritdoc */\n  delete (source) {\n    return source.destroy();\n  }\n\n  /** @inheritdoc */\n  setParentEl (parentEl) {\n    this.parentEl = parentEl;\n  }\n}\n\nexport default ViewerSourceVideoFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport isNil from 'lodash/isNil';\nimport isObject from 'lodash/isObject';\n\n// TODO Unit testy.\n/**\n * Zdroj zobrazovÃ¡nÃ­ mÃ©diÃ­ v podobÄ› HTML video elementu.\n * ZdrojovÃ½ element je obalenÃ½ do rÃ¡mujÃ­cÃ­ho div a s nÃ­m vloÅ¾en na urÄ�enÃ© mÃ­sto do DOM.\n * @implements {ViewerSource}\n */\nclass ViewerSourceVideo {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {ViewerFrameFactory} frameFactory\n   * @param {HTMLElement} parentEl RodiÄ�ovskÃ½ element, urÄ�enÃ½ pro vklÃ¡dÃ¡nÃ­ elementÅ¯ zdroje.\n   * @returns {ViewerSourceVideo} NovÃ¡ instance.\n   */\n  constructor (frameFactory, parentEl) {\n    if (!isObject(parentEl)) {\n      // ZakÃ¡zÃ¡no vytvÃ¡Å™enÃ­ bez rodiÄ�ovskÃ©ho elementu, jinak nemÃ¡ pÅ™Ã­prava objektÅ¯ v bazÃ©nu smysl.\n      throw new TypeError(`Invalid parent element ${parentEl}.`);\n    }\n    // TODO VyÄ�lenit vytvoÅ™enÃ­ elementÅ¯ do samostatnÃ© public metody, neÅ¾ je mÃ­t v konstruktoru?\n    const frame = frameFactory.create();\n    const frameEl = frame.getEl();\n    const el = document.createElement('video');\n    frameEl.appendChild(el);\n    parentEl.appendChild(frameEl);\n    this.el = el;\n    this.frame = frame;\n    this.parentEl = parentEl;\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // UvolnÄ›nÃ­ video elementu dle doporuÄ�enÃ­ ze SO.\n    // https://stackoverflow.com/questions/3258587/how-to-properly-unload-destroy-a-video-element\n    // TODO Je lepÅ¡Ã­, neÅ¾ prostÃ© odebrÃ¡nÃ­ z DOM. PÅ™esto dochÃ¡zÃ­ k pamÄ›Å¥ovÃ½m ÃºnikÅ¯m. PouÅ¾Ã­vat jen v pÅ™Ã­padÄ› nutnosti.\n    const {el} = this;\n    el.pause();\n    el.removeAttribute('src');\n    el.load();\n    // OdebrÃ¡nÃ­ frame elementu z DOM.\n    const frameEl = this.frame.getEl();\n    this.parentEl.removeChild(frameEl);\n  }\n\n  /** @inheritdoc */\n  getEl () {\n    const {el} = this;\n    if (isNil(el)) {\n      throw new TypeError(`Missing element.`);\n    }\n    return el;\n  }\n\n  /** @inheritdoc */\n  getFrame () {\n    return this.frame;\n  }\n\n  /** @inheritdoc */\n  setParentEl (parentEl) {\n    if (!isObject(parentEl)) {\n      throw new TypeError(`Invalid parent element ${parentEl}.`);\n    }\n    if (parentEl === this.parentEl) {\n      // Pokud se rodiÄ�ovskÃ½ element nezmÄ›nÃ­, tak se pÅ™esun neprovÃ¡dÃ­.\n      return;\n    }\n    // PÅ™esun elementu do novÃ©ho rodiÄ�e.\n    // TODO PlatformovÄ› specifickÃ© prolÃ­naÄ�e. Pro Samsung moÅ¾no pÅ™idat omezenÃ­ nebo oÅ¡etÅ™enÃ­ pÅ™esunu.\n    // - PÅ™Ã­klad speciÃ¡lnÃ­ implementace, kterÃ¡ by nedovolila pÅ™esun elementu?\n    // - `AdapterTizenSssp4.ViewerSourceVideo`\n    const frameEl = this.frame.getEl();\n    parentEl.appendChild(frameEl);\n    this.parentEl = parentEl;\n  }\n}\n\nexport default ViewerSourceVideo;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na vlÃ¡kna zobrazujÃ­cÃ­ obsah.\n * @implements {Destroyable}\n * @implements {EventBus}\n */\nclass ViewerThreadFactory {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {Class.<ViewerThread>} ViewerThread Konstruktor pro vlÃ¡kna.\n   * @param {ViewerDelayerFactory} delayerFactory TovÃ¡rna na sprÃ¡vce zpoÅ¾dÄ›nÃ­.\n   * @param {Logger} logger\n   * @param {NetworkListener} networkListener\n   * @param {ViewerSlideFactory} slideFactory TovÃ¡rna na slajdy pro pÅ™ehrÃ¡vaÄ�e obsahu.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {number} [opts.loadLimit] MaximÃ¡lnÃ­ poÄ�et mÃ©diÃ­, kterÃ© se pÅ™eskoÄ�Ã­ pÅ™i pokusu o pÅ™ednaÄ�tenÃ­ nÃ¡sledujÃ­cÃ­ho slajdu.\n   * @returns {ViewerThreadFactory} NovÃ¡ instance.\n   */\n  constructor (ViewerThread, delayerFactory, logger, networkListener, slideFactory, {loadLimit} = {}) {\n    this.ViewerThread = ViewerThread;\n    this.delayerFactory = delayerFactory;\n    this.loadLimit = loadLimit;\n    this.logger = logger;\n    this.networkListener = networkListener;\n    this.slideFactory = slideFactory;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ© vlÃ¡kno zobrazujÃ­cÃ­ obsah.\n   * @param {HTMLElement} el RodiÄ�ovskÃ½ eLement, do kterÃ©ho se vlÃ¡kno vykresluje.\n   * @param {ScheduleStrategy} scheduleStrategy Strategie pÅ™ehrÃ¡vÃ¡nÃ­ obsahu, kterÃ½ Å™Ã­dÃ­, co vlÃ¡kno zobrazuje.\n   * @returns {ViewerThread} VytvoÅ™enÃ© vlÃ¡kno.\n   */\n  create (el, scheduleStrategy) {\n    return new this.ViewerThread(\n      this.delayerFactory, el, this.logger, this.networkListener,\n      scheduleStrategy, this.slideFactory, {loadLimit: this.loadLimit}\n    );\n  }\n}\n\nexport default ViewerThreadFactory;\n","/* eslint-disable max-lines, max-statements, header/header */\n// TODO Refaktorizovat do vÃ­ce menÅ¡Ã­ch tÅ™Ã­d.\n// - SprÃ¡va ScheduleManager a operace spojenÃ© se zmÄ›nou obsahu.\n// - Fronta poÅ¾adavkÅ¯ na pÅ™echody.\n// - Operace s pÅ™ehrÃ¡vanÃ½m slajdem.\n// - Operace s naÄ�Ã­tanÃ½m slajdem.\n\n/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO Refaktorizovat do vÃ­ce menÅ¡Ã­ch tÅ™Ã­d.\n// - SprÃ¡va ScheduleManager a operace spojenÃ© se zmÄ›nou obsahu.\n// - Fronta poÅ¾adavkÅ¯ na pÅ™echody.\n// - Operace s pÅ™ehrÃ¡vanÃ½m slajdem.\n// - Operace s naÄ�Ã­tanÃ½m slajdem.\n/* eslint-disable max-statements */\n\nimport EventEmitter from 'eventemitter3';\nimport isNil from 'lodash/isNil';\n\n// TODO #271 Kdy mÃ¡ bÃ½t Å¡ablona oznaÄ�ena jako preloadovanÃ¡?\n// - Po naÄ�tenÃ­ vrstev? Po naÄ�tenÃ­ pozadÃ­?\n// - Ihned. Na nic neÄ�ekat.\n// TODO Unit testy.\n// TODO SkrÃ½vÃ¡nÃ­ elementÅ¯.\n// - Je vhodnÃ© zaÄ�Ã­nat s elementy ve skrytÃ©m stavu, aby se pÅ™edeÅ¡lo problikÃ¡vÃ¡nÃ­ apod.\n// - PÅ™i uvolnÄ›nÃ­ by mÄ›l bÃ½t element opÄ›t skrytÃ½.\n// - NynÃ­ se spolÃ©hÃ¡ na to, Å¾e se vÅ¾dy pÅ™ed uvolnÄ›nÃ­m zavolÃ¡ leave. VylepÅ¡it?\n// - NynÃ­ vÅ¡echny ovladaÄ�e sdÃ­lejÃ­ CSS tÅ™Ã­du \"viewer-frame\". OddÄ›lit?\n// - DoÅ™eÅ¡it v rÃ¡mci pÅ™Ã­mÃ©ho pÅ™Ã­stupu mezi `ViewerList` a `ViewerController` (bez elementÅ¯).\n/**\n * Jedno vlÃ¡kno zobrazujÃ­cÃ­ obsah v prolÃ­naÄ�i.\n * Zobrazuje posloupnost slajdÅ¯ s mÃ©dii.\n * ![Diagram aktivit](./core/viewer/thread/viewer-thread.doc.png)\n * @implements {Destroyable}\n * @implements {EventBus}\n */\nclass ViewerThread {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {ViewerDelayerFactory} delayerFactory TovÃ¡rna na sprÃ¡vce zpoÅ¾dÄ›nÃ­.\n   * @param {HTMLElement} el RodiÄ�ovskÃ½ eLement, do kterÃ©ho se vlÃ¡kno vykresluje.\n   * @param {Logger} logger\n   * @param {NetworkListener} networkListener SprÃ¡vce pÅ™ipojenÃ­ k sÃ­ti.\n   * @param {ScheduleStrategy} scheduleStrategy Strategie pÅ™ehrÃ¡vÃ¡nÃ­ obsahu, kterÃ½ Å™Ã­dÃ­, co vlÃ¡kno zobrazuje.\n   * @param {ViewerSlideFactory} slideFactory TovÃ¡rna na slajdy pro pÅ™ehrÃ¡vaÄ�e obsahu.\n   * @param {Object} [opts={}] NepovinnÃ© parametry.\n   * @param {number} [opts.loadLimit=Infinity] MaximÃ¡lnÃ­ poÄ�et mÃ©diÃ­, kterÃ© se pÅ™eskoÄ�Ã­ pÅ™i pokusu o pÅ™ednaÄ�tenÃ­ nÃ¡sledujÃ­cÃ­ho slajdu.\n   * @returns {ViewerThread} NovÃ¡ instance.\n   */\n  constructor (\n    delayerFactory, el, logger, networkListener, scheduleStrategy, slideFactory,\n    {loadLimit = Infinity} = {}\n  ) {\n    /**\n     * SprÃ¡vce zpoÅ¾dÄ›nÃ­.\n     * @private\n     * @type {ViewerDelayer}\n     */\n    this.delayer = delayerFactory.create();\n    /**\n     * RodiÄ�ovskÃ½ eLement, do kterÃ©ho se vlÃ¡kno vykresluje.\n     * @private\n     * @type {HTMLElement}\n     */\n    this.el = el;\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    this.loadLimit = loadLimit;\n    /**\n     * PÅ™Ã­znak, jestli byl vyÅ¾Ã¡dÃ¡no naÄ�tenÃ­ dalÅ¡Ã­ho slajdu.\n     * @private\n     * @type {boolean}\n     */\n    this.loadRequested = false;\n    /**\n     * NaÄ�Ã­tanÃ½ slajd, kterÃ½ se pÅ™ipravuje na pozadÃ­.\n     * @private\n     * @type {ViewerSlide}\n     */\n    this.loadingSlide = null;\n    this.logger = logger;\n    /**\n     * SprÃ¡vce pÅ™ipojenÃ­ k sÃ­ti.\n     * @private\n     * @type {NetworkListener}\n     */\n    this.networkListener = networkListener;\n    /**\n     * PÅ™Ã­znak, jestli byl vyÅ¾Ã¡dÃ¡no pÅ™ehrÃ¡nÃ­ dalÅ¡Ã­ho slajdu.\n     * @private\n     * @type {boolean}\n     */\n    this.playRequested = false;\n    /**\n     * PÅ™ehrÃ¡vanÃ½ slajd, kterÃ½ se zobrazuje na popÅ™edÃ­.\n     * @private\n     * @type {ViewerSlide}\n     */\n    this.playingSlide = null;\n    /**\n     * Fronta po sobÄ› provÃ¡dÄ›nÃ½ch asynchronÃ­ch operacÃ­.\n     * PouÅ¾Ã­vÃ¡ se pro zamezenÃ­ paralelnÃ­ch pÅ™echodÅ¯ mezi slajdy.\n     * VÅ¡echny poÅ¾adavky na naÄ�tenÃ­ a pÅ™ehrÃ¡nÃ­ musÃ­ bÃ½t provÃ¡dÄ›ny sÃ©riovÄ›.\n     * Pokud je definovÃ¡na, tak to znamenÃ¡, Å¾e prÃ¡vÄ› probÃ­hajÃ­ nÄ›jakÃ© operace,\n     * kterÃ© se ukonÄ�Ã­ v okamÅ¾iku vyÅ™eÅ¡enÃ­ promise.\n     * Pokud je nastavena na `null`, tak to znamenÃ¡, Å¾e Å¾Ã¡dnÃ¡ operace neprobÃ­hÃ¡.\n     * @private\n     * @type {?Promise}\n     */\n    this.queuePromise = null;\n    /**\n     * Strategie pÅ™ehrÃ¡vÃ¡nÃ­ obsahu, kterÃ½ Å™Ã­dÃ­, co vlÃ¡kno zobrazuje.\n     * @private\n     * @type {ScheduleStrategy}\n     */\n    this.scheduleStrategy = scheduleStrategy;\n    this.slideFactory = slideFactory;\n    /**\n     * PÅ™Ã­znak, jestli byl vyÅ¾Ã¡dÃ¡no zruÅ¡enÃ­ organizÃ¡toru.\n     * @private\n     * @type {boolean}\n     */\n    this.stopRequested = false;\n    /**\n     * Timeout pro zpoÅ¾dÄ›nÃ­ pÅ™i zmÄ›nÄ› slajdÅ¯.\n     * @private\n     * @type {?number}\n     */\n    this.timeout = null;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onOnlineChanged = this.onOnlineChanged.bind(this);\n    this.onSchedulePlayed = this.onSchedulePlayed.bind(this);\n    this.onSlideError = this.onSlideError.bind(this);\n    this.onSlidePlayed = this.onSlidePlayed.bind(this);\n  }\n\n  /**\n   * PÅ™esune naÄ�Ã­tanÃ½ slajd do pÅ™ehrÃ¡vanÃ©ho.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  activateLoading () {\n    this.playingSlide = this.loadingSlide;\n    this.loadingSlide = null;\n  }\n\n  /**\n   * NavÃ¡Å¾e naslouchÃ¡nÃ­ udÃ¡lostem ze slajdu.\n   * @param {ViewerSlide} slide Slajd, kterÃ©mu se naslouchÃ¡.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  bindSlide (slide) {\n    slide.on('error', this.onSlideError);\n    slide.on('played', this.onSlidePlayed);\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ naÄ�Ã­tanÃ½ slajd.\n   * @param {ScheduleInfo} scheduleInfo NaplÃ¡novanÃ© mÃ©dium, kterÃ© se mÃ¡ zobrazit ve slajdu.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po vytvoÅ™enÃ­.\n   */\n  createLoading (scheduleInfo) {\n    // TODO #271 Zde bude nutnÃ© napojit Å¡ablony.\n    // - NeprovÃ¡dÄ›t nic.\n    return new Promise((resolve) => {\n      const slide = this.createSlide(scheduleInfo);\n      this.loadingSlide = slide;\n      return resolve(slide.seize());\n    });\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ pÅ™ehrÃ¡vanÃ½ slajd.\n   * @param {ScheduleInfo} scheduleInfo NaplÃ¡novanÃ© mÃ©dium, kterÃ© se mÃ¡ zobrazit ve slajdu.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po vytvoÅ™enÃ­.\n   */\n  createPlaying (scheduleInfo) {\n    // TODO #271 Zde bude nutnÃ© napojit Å¡ablony.\n    // - VytvoÅ™it novÃ© `Schedule`.\n    return new Promise((resolve) => {\n      const slide = this.createSlide(scheduleInfo);\n      this.playingSlide = slide;\n      return resolve(slide.seize());\n    });\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ slajd a navÃ¡Å¾e naslouchÃ¡nÃ­ jeho udÃ¡lostem.\n   * @param {ScheduleInfo} scheduleInfo NaplÃ¡novanÃ© mÃ©dium, kterÃ© se mÃ¡ zobrazit ve slajdu.\n   * @private\n   * @returns {ViewerSlide} VytvoÅ™enÃ½ slajd.\n   */\n  createSlide (scheduleInfo) {\n    const slide = this.slideFactory.create(this.el, scheduleInfo);\n    this.bindSlide(slide);\n    return slide;\n  }\n\n  /**\n   * Odebere zdroje naÄ�Ã­tanÃ©ho slajdu.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po odebrÃ¡nÃ­.\n   */\n  deleteLoading () {\n    return (\n      this.deleteSlide(this.loadingSlide)\n      .then(() => {\n        this.loadingSlide = null;\n      })\n    );\n  }\n\n  /**\n   * Odebere zdroje pÅ™ehrÃ¡vanÃ©ho slajdu.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po odebrÃ¡nÃ­.\n   */\n  deletePlaying () {\n    return (\n      this.deleteSlide(this.playingSlide)\n      .then(() => {\n        this.playingSlide = null;\n      })\n    );\n  }\n\n  /**\n   * Odebere zdroje slajdu a zruÅ¡Ã­ ho.\n   * @param {ViewerSlide} slide Slajd k odebrÃ¡nÃ­.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po odebrÃ¡nÃ­.\n   */\n  deleteSlide (slide) {\n    return new Promise((resolve) => resolve(\n      slide.delete()\n      .then(() => this.destroySlide(slide))\n    ));\n  }\n\n  /**\n   * ZruÅ¡Ã­ slajd a naslouchÃ¡nÃ­ jeho udÃ¡lostem.\n   * @param {ViewerSlide} slide Slajd ke zruÅ¡enÃ­.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po odebrÃ¡nÃ­.\n   */\n  destroySlide (slide) {\n    this.unbindSlide(slide);\n    slide.destroy();\n  }\n\n  /**\n   * PostupnÄ› odebere poÅ¾adavky na pÅ™echody z fronty a provede je.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po provedenÃ­ vÅ¡ech pÅ™echodÅ¯ ve frontÄ›.\n   */\n  dequeue () {\n    return new Promise((resolve) => {\n      if (this.stopRequested) {\n        this.playRequested = false;\n        this.loadRequested = false;\n        return resolve(\n          this.unsetLoading()\n          .then(() => this.unsetPlaying())\n        );\n      }\n      if (this.playRequested) {\n        this.playRequested = false;\n        this.loadRequested = false;\n        return resolve(\n          this.playUnsafe()\n          .then((success) => {\n            const {delayer} = this;\n            if (!success) {\n              this.playRequested = true;\n              return (\n                delayer.fail()\n                .then(() => this.dequeue())\n              );\n            }\n            return (\n              delayer.succeed()\n              .then(() => this.wait())\n              .then(() => this.loadUnsafe())\n              .then(() => this.dequeue())\n            );\n          })\n        );\n      }\n      if (this.loadRequested) {\n        this.loadRequested = false;\n        return resolve(\n          this.wait()\n          .then(() => this.loadUnsafe())\n          .then(() => this.dequeue())\n        );\n      }\n      return resolve();\n    });\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    // TODO #271 ZatÃ­m nenÃ­ oficiÃ¡lnÄ› podporovanÃ½ a otestovanÃ½ destroy v jinÃ©m stavu, neÅ¾ po volÃ¡nÃ­ #stop.\n    // ZruÅ¡enÃ­ timeoutu.\n    clearTimeout(this.timeout);\n    // ZruÅ¡enÃ­ slajdÅ¯.\n    const {loadingSlide, playingSlide} = this;\n    if (!isNil(loadingSlide)) {\n      this.destroySlide(loadingSlide);\n    }\n    if (!isNil(playingSlide)) {\n      this.destroySlide(playingSlide);\n    }\n    // ZruÅ¡enÃ­ napojenÃ­ na sprÃ¡vce sÃ­tÄ›.\n    this.networkListener.off('onlineChanged', this.onOnlineChanged);\n    // ZruÅ¡enÃ­ strategie.\n    // TODO #271 Kdo je zodpovÄ›dnÃ½ za zruÅ¡enÃ­ ScheduleStrategy? NemÄ›l by to bÃ½t ten, kdo ji vytvoÅ™il?\n    this.scheduleStrategy.off('played', this.onSchedulePlayed);\n    this.scheduleStrategy.destroy();\n    // ZruÅ¡enÃ­ zpoÅ¾Ä�ovaÄ�e.\n    this.delayer.destroy();\n  }\n\n  /**\n   * ZobrazÃ­ pÅ™ehrÃ¡vanÃ½ slajd.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po zobrazenÃ­.\n   */\n  enterPlaying () {\n    return new Promise((resolve) => {\n      const {playingSlide} = this;\n      return resolve(\n        playingSlide.enter()\n        .then(() => {\n          this.emitter.emit('entered', playingSlide.getScheduleInfo());\n        })\n      );\n    });\n  }\n\n  /**\n   * ZaÅ™adÃ­ poÅ¾adavek na pÅ™echod do fronty.\n   * @private\n   * @returns {Promise.<undefined>}\n   * Pokud nenÃ­ jinÃ½ poÅ¾adavek ve frontÄ›, vyÅ™eÅ¡Ã­ se po provedenÃ­ poÅ¾adavku a vÅ¡ech ostatnÃ­ch, kterÃ© se za nÄ›j zaÅ™adÃ­.\n   * Pokud je jinÃ½ poÅ¾adavek ve frontÄ›, vyÅ™eÅ¡Ã­ se po jeho zaÅ™azenÃ­ do fronty.\n   */\n  enqueue () {\n    return new Promise((resolve) => {\n      const currentPromise = this.queuePromise;\n      if (!isNil(currentPromise)) {\n        // TODO Hotfix Ä�ekÃ¡nÃ­ na zastavenÃ­ vlÃ¡kna pÅ™i jeho ruÅ¡enÃ­.\n        // - ProblÃ©m: PÅ™i ruÅ¡enÃ­ vlÃ¡kna je potÅ™eba poÄ�kat na dokonÄ�enÃ­ probÃ­hajÃ­cÃ­ch operacÃ­.\n        //   Jde o jedinou operaci, u kterÃ© je poÅ¾adovÃ¡no znÃ¡t okamÅ¾ik jeho dokonÄ�enÃ­.\n        //   OstatnÃ­ operace jsou iniciovÃ¡ny bez zÃ¡jmu znÃ¡t okamÅ¾ik jejich dokonÄ�enÃ­.\n        //   DÅ™Ã­ve se poÅ¾adavek na `#enqueue` ihned ukonÄ�il, pokud nebyla fronta prÃ¡zdnÃ¡.\n        //   To pak zpÅ¯sobilo signalizaci dokonÄ�enÃ­ zastavenÃ­, kdyÅ¾ pÅ™itom bylo pouze ve frontÄ›.\n        // - Reprodukce: Nastavit krÃ¡tkou dobu pÅ™ehrÃ¡vÃ¡nÃ­ mÃ©diÃ­ a dlouho prodlevu pÅ™i `#wait`.\n        //   NaslednÄ› obsah zruÅ¡it a zÅ¯stane zaseknutÃ½.\n        // - Hotfix: VÅ¡echny operace ve frontÄ› se nynÃ­ uklÃ¡dajÃ­ do `queuePromise`.\n        //   Ta se vracÃ­ v okamÅ¾iku, kdy dojde k zaÅ™azenÃ­ operace do fronty.\n        //   Å˜eÅ¡enÃ­ by mÄ›lo nynÃ­ postaÄ�ovat, kdyÅ¾ jedinÃ¡ operace, kterou dokonÄ�enÃ­ zajÃ­mÃ¡,\n        //   zpÅ¯sobuje vyprÃ¡zdnÄ›nÃ­ celÃ© fronty.\n        // - FinÃ¡lnÃ­ Å™eÅ¡enÃ­: Zpracovat frontu sofistiovanÄ›ji,\n        //   aby dochÃ¡zelo k vyÅ™eÅ¡enÃ­ poÅ™adavku v okamÅ¾iku jeho dokonÄ�enÃ­, nebo vyÅ™azenÃ­ z fronty.\n        //   NynÃ­ se vyÅ™eÅ¡Ã­ aÅ¾ v okamÅ¾iku dokonÄ�enÃ­ vÅ¡ech operacÃ­ ve frontÄ›.\n        return resolve(currentPromise);\n      }\n      const nextPromise = (\n        this.dequeue()\n        .finally(() => {\n          this.queuePromise = null;\n        })\n      );\n      this.queuePromise = nextPromise;\n      return resolve(nextPromise);\n    });\n  }\n\n  /**\n   * OÅ¡etÅ™Ã­ vzniklou chybu.\n   * @param {Error} error ChybovÃ½ objekt.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  handleError (error) {\n    this.emitter.emit('error', error);\n  }\n\n  /**\n   * NaÄ�te dalÅ¡Ã­ mÃ©dium.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po nastavenÃ­ naÄ�tÃ­tanÃ©ho mÃ©dia.\n   */\n  load () {\n    return (\n      new Promise((resolve) => {\n        this.loadRequested = true;\n        return resolve(this.enqueue());\n      })\n      // TODO NemÄ›lo by bÃ½t toto oÅ¡etÅ™eno spÃ­Å¡e v on* metodÃ¡ch?\n      .catch((error) => this.handleError(error))\n    );\n  }\n\n  /**\n   * VyhledÃ¡ mÃ©dium vhodnÃ© k naÄ�tenÃ­.\n   * @param {number} offset PoÄ�et slajdÅ¯ od aktuÃ¡lnÄ› pÅ™ehrÃ¡vanÃ©ho mÃ©dia.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po nastavenÃ­ naÄ�tÃ­tanÃ©ho mÃ©dia.\n   */\n  loadStep (offset) {\n    return new Promise((resolve) => {\n      if (offset > this.loadLimit) {\n        // Byl pÅ™ekroÄ�en limit preloadovanÃ½ch slajdÅ¯.\n        // VyhledÃ¡vÃ¡nÃ­ se ukonÄ�Ã­ a naÄ�Ã­tanÃ½ slajd se ponechÃ¡, tÅ™eba se bude hodit.\n        return resolve();\n      }\n      const scheduleInfo = this.scheduleStrategy.plan(offset)[offset - 1];\n      if (!scheduleInfo.isPreloadable()) {\n        // MÃ©dium nenÃ­ urÄ�eno k preloadu.\n        // VyhledÃ¡vÃ¡nÃ­ se ukonÄ�Ã­ a naÄ�Ã­tanÃ½ slajd se ponechÃ¡, tÅ™eba se bude hodit.\n        // AÅ¾ se na mÃ©dium provede pÅ™echod, tak se zobrazÃ­ rovnou bez preloadu.\n        return resolve();\n      }\n      if (scheduleInfo.isEmpty()) {\n        // Obsah je prÃ¡zdnÃ½.\n        // VyhledÃ¡vÃ¡nÃ­ se ukonÄ�Ã­ a naÄ�Ã­tanÃ½ slajd se zruÅ¡Ã­.\n        return resolve(this.unsetLoading());\n      }\n      const {loadingSlide} = this;\n      if (!isNil(loadingSlide) && scheduleInfo.isEqual(loadingSlide.getScheduleInfo())) {\n        // V naÄ�Ã­tanÃ©m slajdu je jiÅ¾ poÅ¾adovanÃ© mÃ©dium pÅ™ipraveno.\n        // VyhledÃ¡vÃ¡nÃ­ se ukonÄ�Ã­ a naÄ�Ã­tanÃ½ slajd se ponechÃ¡, kdyÅ¾ je jiÅ¾ sprÃ¡vnÄ› pÅ™ipraven.\n        return resolve();\n      }\n      // Je nutnÃ© nastavit novÃ½ naÄ�Ã­tanÃ½ slajd.\n      return resolve(\n        this.unsetLoading()\n        .then(() => {\n          const online = this.networkListener.isOnline();\n          if (!scheduleInfo.isViewable(online)) {\n            return this.loadStep(offset + 1);\n          }\n          return (\n            this.setLoading(scheduleInfo)\n            .then((success) => {\n              if (!success) {\n                return this.loadStep(offset + 1);\n              }\n            })\n          );\n        })\n      );\n    });\n  }\n\n  /**\n   * NaÄ�te dalÅ¡Ã­ mÃ©dium bez oÅ¡etÅ™enÃ­ paralelnÃ­ho spuÅ¡tÄ›nÃ­.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po nastavenÃ­ naÄ�tÃ­tanÃ©ho mÃ©dia.\n   */\n  loadUnsafe () {\n    return this.loadStep(1);\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na zmÄ›nu pÅ™ipojenÃ­ k sÃ­ti.\n   * @param {boolean} online PÅ™Ã­znak, jestli je zaÅ™Ã­zenÃ­ pÅ™ipojeno k sÃ­ti.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onOnlineChanged (online) {\n    const {playingSlide} = this;\n    if (!isNil(playingSlide) && !playingSlide.getScheduleInfo().isViewable(online)) {\n      return this.play();\n    }\n    const {loadingSlide} = this;\n    if (!isNil(loadingSlide) && !loadingSlide.getScheduleInfo().isViewable(online)) {\n      return this.load();\n    }\n  }\n\n  /**\n   * Reakce na pÅ™ehrÃ¡nÃ­ Ä�asovaÄ�e mÃ©dia v plÃ¡novaÄ�i.\n   * @param {ScheduleInfo} scheduleInfo NaplÃ¡novanÃ© informace, kterÃ© byly pÅ™ehrÃ¡ny.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onSchedulePlayed (scheduleInfo) {\n    const {playingSlide} = this;\n    if (isNil(playingSlide)) {\n      throw new Error('Missing playing slide.');\n    }\n    const playingScheduleInfo = playingSlide.getScheduleInfo();\n    if (!playingScheduleInfo.isEqual(scheduleInfo)) {\n      throw new Error('Unexpected played slide.');\n    }\n    playingSlide.setPlayed(true);\n    this.play();\n  }\n\n  /**\n   * Reakce na chybu ve slajdu.\n   * @param {ViewerSlide} slide Slajd, kterÃ½ vyvolal chybu.\n   * @param {Error} error ChybovÃ½ objekt.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onSlideError (slide, error) {\n    // IgnorovÃ¡nÃ­ chyb z ViewerSlide.\n    this.logger.warn(error);\n    slide.setFailed(true);\n    if (slide === this.playingSlide) {\n      this.play();\n    }\n  }\n\n  /**\n   * Reakce na fyzickÃ© pÅ™ehrÃ¡nÃ­ mÃ©dia ve slajdu.\n   * @param {ViewerSlide} slide Slajd, kterÃ½ byl pÅ™ehrÃ¡n.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onSlidePlayed (slide) {\n    if (slide.isPlayed()) {\n      return;\n    }\n    slide.setPlayed(true);\n    this.play();\n  }\n\n  /**\n   * PÅ™ehraje dalÅ¡Ã­ mÃ©dium.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po nastavenÃ­ pÅ™ehrÃ¡vanÃ©ho mÃ©dia.\n   */\n  play () {\n    return (\n      new Promise((resolve) => {\n        this.playRequested = true;\n        return resolve(this.enqueue());\n      })\n      // TODO NemÄ›lo by bÃ½t toto oÅ¡etÅ™eno spÃ­Å¡e v on* metodÃ¡ch?\n      .catch((error) => this.handleError(error))\n    );\n  }\n\n  /**\n   * VyhledÃ¡ mÃ©dium vhodnÃ© k pÅ™ehrÃ¡nÃ­.\n   * @private\n   * @returns {Promise.<boolean>} PÅ™Ã­znak, jestli bylo nastaveno pÅ™ehrÃ¡vanÃ© mÃ©dium.\n   */\n  playStep () {\n    return new Promise((resolve) => {\n      const scheduleInfo = this.scheduleStrategy.go();\n      if (scheduleInfo.isEmpty()) {\n        return resolve(true);\n      }\n      const online = this.networkListener.isOnline();\n      if (!scheduleInfo.isViewable(online)) {\n        return resolve(false);\n      }\n      return resolve(\n        this.setPlaying(scheduleInfo)\n      );\n    });\n  }\n\n  /**\n   * PÅ™ehraje dalÅ¡Ã­ mÃ©dium bez oÅ¡etÅ™enÃ­ paralelnÃ­ho spuÅ¡tÄ›nÃ­.\n   * @private\n   * @returns {Promise.<boolean>} PÅ™Ã­znak, jestli bylo mÃ©dium pÅ™ehrÃ¡no.\n   */\n  playUnsafe () {\n    return (\n      this.unsetPlaying()\n      .then(() => this.playStep())\n    );\n  }\n\n  /**\n   * UvolnÃ­ zdroje naÄ�Ã­tanÃ©ho slajdu.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po uvolnÄ›nÃ­.\n   */\n  releaseLoading () {\n    return (\n      this.releaseSlide(this.loadingSlide)\n      .then(() => {\n        this.loadingSlide = null;\n      })\n    );\n  }\n\n  /**\n   * UvolnÃ­ zdroje pÅ™ehrÃ¡vanÃ©ho slajdu.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po uvolnÄ›nÃ­.\n   */\n  releasePlaying () {\n    return (\n      this.releaseSlide(this.playingSlide)\n      .then(() => {\n        this.playingSlide = null;\n      })\n    );\n  }\n\n  /**\n   * UvolnÃ­ zdroje slajdu a uvolnÃ­ naslouchÃ¡nÃ­ jeho udÃ¡lostem.\n   * @param {ViewerSlide} slide Slajd k uvolnÄ›nÃ­.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po uvolnÄ›nÃ­.\n   */\n  releaseSlide (slide) {\n    return new Promise((resolve) => resolve(\n      slide.release()\n      .then(() => this.unbindSlide(slide))\n    ));\n  }\n\n  /**\n   * PÅ™idÃ¡ naÄ�Ã­tanÃ½ slajd.\n   * @param {ScheduleInfo} scheduleInfo NaplÃ¡novanÃ© mÃ©dium, kterÃ© se mÃ¡ zobrazit ve slajdu.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po pÅ™idÃ¡nÃ­.\n   */\n  setLoading (scheduleInfo) {\n    return (\n      this.createLoading(scheduleInfo)\n      .then(() => true)\n      .catch((error) => {\n        // IgnorovÃ¡nÃ­ chyb z ViewerSlide.\n        // Zde je pÅ™Ã­tomno kvÅ¯li odfiltrovÃ¡nÃ­ chyb vznilÃ½ch pÅ™i zÃ­skÃ¡vÃ¡nÃ­\n        // zdrojÅ¯ (napÅ™. vyÄ�erpÃ¡nÃ­ PDF).\n        this.logger.warn(error);\n        if (!isNil(this.loadingSlide)) {\n          return (\n            this.deleteLoading()\n            .then(() => false)\n          );\n        }\n        return false;\n      })\n    );\n  }\n\n  /**\n   * PÅ™idÃ¡ pÅ™ehrÃ¡vanÃ½ slajd.\n   * @param {ScheduleInfo} scheduleInfo NaplÃ¡novanÃ© mÃ©dium, kterÃ© se mÃ¡ zobrazit ve slajdu.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po pÅ™idÃ¡nÃ­.\n   */\n  setPlaying (scheduleInfo) {\n    return (\n      new Promise((resolve) => {\n        const {loadingSlide} = this;\n        if (!isNil(loadingSlide) && scheduleInfo.isEqual(loadingSlide.getScheduleInfo())) {\n          if (loadingSlide.isFailed()) {\n            return resolve(false);\n          }\n          this.activateLoading();\n          return resolve(\n            this.enterPlaying()\n            .then(() => true)\n          );\n        }\n        return resolve(\n          this.createPlaying(scheduleInfo)\n          .then(() => {\n            if (this.playingSlide.isFailed()) {\n              return resolve(false);\n            }\n            return (\n              this.enterPlaying()\n              .then(() => true)\n            );\n          })\n        );\n      })\n      .catch((error) => {\n        // IgnorovÃ¡nÃ­ chyb z ViewerSlide.\n        // Zde je pÅ™Ã­tomno kvÅ¯li odfiltrovÃ¡nÃ­ HTMLMediaError, kterÃ© vznikly\n        // bÄ›hem enter (respektive play) u video ovladaÄ�Å¯.\n        this.logger.warn(error);\n        if (!isNil(this.playingSlide)) {\n          return (\n            this.deletePlaying()\n            .then(() => false)\n          );\n        }\n        return false;\n      })\n    );\n  }\n\n  /**\n   * SpustÃ­ zobrazovÃ¡nÃ­ obsahu ve vlÃ¡knu.\n   * @returns {undefined} Nic.\n   */\n  start () {\n    // NaslouchÃ¡nÃ­ udÃ¡lostem.\n    this.networkListener.on('onlineChanged', this.onOnlineChanged);\n    this.scheduleStrategy.on('played', this.onSchedulePlayed);\n    // SpustÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ prvnÃ­ho mÃ©dia.\n    this.play();\n  }\n\n  /**\n   * ZastavÃ­ zobrazovÃ¡nÃ­ obsahu ve vlÃ¡knu.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po zastavenÃ­ a uvolnÄ›nÃ­ vÅ¡ech zdrojÅ¯.\n   */\n  stop () {\n    // TODO Refaktrorizovat proces zruÅ¡enÃ­ a zpracovÃ¡nÃ­ front akcÃ­, protoÅ¾e teÄ� uÅ¾ je trochu nepÅ™ehlednÃ©.\n    // - Nejprve, se zruÅ¡Ã­ naslouchÃ¡nÃ­ statickÃ½m zdrojÅ¯m, kterÃ© zpÅ¯sobujÃ­ enqueue akcÃ­ (networkListener, scheduleStrategy).\n    // - NÃ¡slednÄ› se postupnÄ› zruÅ¡Ã­ vÅ¡echny slajdy, kterÃ© takÃ© zpÅ¯sobujÃ­ enqueue (unsetLoading, unsetPlaying).\n    //   Toho se dosÃ¡hne pomocÃ­ dalÅ¡Ã­ akce, kterÃ¡ se Å™adÃ­ do fronty a aktivuje se bÄ›hem dequeue.\n    //   Priorita tÃ©to akce je nejvyÅ¡Å¡Ã­ a zpÅ¯sobÃ­ vyprÃ¡zdnÄ›nÃ­ fronty, uvolnÄ›nÃ­ zdrojÅ¯ pÅ™ehrÃ¡vÃ¡nÃ­.\n    // - Na zÃ¡vÄ›r dequeue se jiÅ¾ nevolÃ¡ enqueue, takÅ¾e udÃ¡losti, kterÃ© vyvolali slajdy pÅ™i ruÅ¡enÃ­ se ignorujÃ­.\n    //   NovÃ© enqueue jiÅ¾ pak nemajÃ­ jak vznikat a Ä�innost vlÃ¡kna je ukonÄ�ena\n    // - Nakonec se zruÅ¡Ã­ doÄ�asnÃ© zdroje, kterÃ© se pouÅ¾Ã­vali (scheduleStrategy, delayer).\n    this.networkListener.off('onlineChanged', this.onOnlineChanged);\n    this.scheduleStrategy.off('played', this.onSchedulePlayed);\n    this.stopRequested = true;\n    return this.enqueue();\n  }\n\n  /**\n   * UvolnÃ­ naslouchÃ¡nÃ­ udÃ¡lostem ze slajdu.\n   * @param {ViewerSlide} slide Slajd, kterÃ©mu se naslouchÃ¡.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  unbindSlide (slide) {\n    slide.off('error', this.onSlideError);\n    slide.off('played', this.onSlidePlayed);\n  }\n\n  /**\n   * Odebere naÄ�Ã­tanÃ½ slajd.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po odebrÃ¡nÃ­.\n   */\n  unsetLoading () {\n    return new Promise((resolve) => {\n      const {loadingSlide} = this;\n      if (isNil(loadingSlide)) {\n        return resolve();\n      }\n      if (loadingSlide.isFailed()) {\n        return resolve(this.deleteLoading());\n      }\n      return resolve(\n        this.releaseLoading()\n        .catch((error) => {\n          this.handleError(error);\n          return this.deleteLoading();\n        })\n      );\n    });\n  }\n\n  /**\n   * Odebere pÅ™ehrÃ¡vanÃ½ slajd.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po odebrÃ¡nÃ­.\n   */\n  unsetPlaying () {\n    return new Promise((resolve) => {\n      const {playingSlide} = this;\n      if (isNil(playingSlide)) {\n        return resolve();\n      }\n      if (playingSlide.isFailed()) {\n        return resolve(this.deletePlaying());\n      }\n      this.emitter.emit('played', playingSlide.getScheduleInfo());\n      return resolve(\n        playingSlide.leave()\n        .then(() => this.releasePlaying())\n        .catch((error) => {\n          this.handleError(error);\n          return this.deletePlaying();\n        })\n      );\n    });\n  }\n\n  /**\n   * Aplikuje zpoÅ¾dÄ›nÃ­ vyÅ¾adovanÃ© platformou Tizen.\n   * @private\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po zpoÅ¾dÄ›nÃ­.\n   */\n  wait () {\n    // TODO PlatformovÄ› specifickÃ© prolÃ­naÄ�e. Aplikovat zpoÅ¾dÄ›nÃ­ pouze pro platformu Tizen.\n    return new Promise((resolve) => {\n      // DÃ©lka zpoÅ¾dÄ›nÃ­ byla zjiÅ¡tÄ›na experimentÃ¡lnÄ› na TV.\n      this.timeout = setTimeout(resolve, 200);\n    });\n  }\n}\n\n/**\n * ZobrazenÃ­ mÃ©dia.\n * @event ViewerThread#entered\n * @param {ScheduleInfo} scheduleInfo Informace o naplÃ¡novanÃ©m mÃ©diu, kterÃ© byly zobrazeny.\n */\n\n/**\n * ChybovÃ¡ udÃ¡lost.\n * @event ViewerThread#error\n * @param {Error} error ChybovÃ© hlÃ¡Å¡enÃ­.\n */\n\n/**\n * DosaÅ¾enÃ­ konce pÅ™ehrÃ¡vÃ¡nÃ­ mÃ©dia.\n * @event ViewerThread#played\n * @param {ScheduleInfo} scheduleInfo Informace o naplÃ¡novanÃ©m mÃ©diu, kterÃ© byly pÅ™ehrÃ¡ny.\n */\n\nexport default ViewerThread;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ViewerControllerIframe from '../controller/viewer-controller-iframe';\n\n// TODO PÅ™ejmenovat na WebsiteViewerType, aby se nepletlo s web platformou.\n/**\n * Typ mÃ©dia web aplikace.\n * PouÅ¾Ã­vÃ¡ se pouze URL ze serveru bez podpory offline stavu.\n * @implements {ViewerType}\n */\nclass ViewerTypeWeb {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {number} loadDelay\n   * @param {HtmlIframePreflighter} preflighter\n   * @param {ViewerSourceCreator} sourceCreator\n   * @returns {ViewerTypeWeb} NovÃ¡ instance.\n   */\n  constructor (loadDelay, preflighter, sourceCreator) {\n    this.loadDelay = loadDelay;\n    this.preflighter = preflighter;\n    this.sourceCreator = sourceCreator;\n  }\n\n  /** @inheritdoc */\n  createController () {\n    return new ViewerControllerIframe(this.loadDelay, this.preflighter);\n  }\n\n  /** @inheritdoc */\n  getSourceCreator () {\n    return this.sourceCreator;\n  }\n\n  /** @inheritdoc */\n  getUrl (medium) {\n    return medium.url;\n  }\n\n  /** @inheritdoc */\n  isExtractable () {\n    return false;\n  }\n\n  /** @inheritdoc */\n  isOfflineable () {\n    return false;\n  }\n\n  /** @inheritdoc */\n  isPreloadable (medium) {\n    // U webovÃ½ch strÃ¡nek se moc nepoÄ�Ã­tÃ¡ s tÃ­m, Å¾e by byly spuÅ¡tÄ›nÃ© na pozadÃ­.\n    // DÄ›lÃ¡ to problÃ©my pÅ™i naslouchÃ¡nÃ­ na udÃ¡losti, napÅ™. udÃ¡losti ovlÃ¡dÃ¡nÃ­.\n    // Byl Å™eÅ¡en problÃ©m s autofocus, kterÃ½ se nechoval pÅ™i preloadu sprÃ¡vnÄ›.\n    // TakÃ© nelze jednoduÅ¡e vypnout zvuky, kterÃ© mohou vznikat.\n    // Proto je preload zakÃ¡zanÃ½.\n    return false;\n  }\n}\n\nexport default ViewerTypeWeb;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * TovÃ¡rna na informace o skrytÃ© virtuÃ¡lnÃ­ klÃ¡vesnici.\n */\nclass VirtualKeyboardHiddenFactory {\n  /**\n   * @param {Class.<VirtualKeyboardHidden>} VirtualKeyboardHidden\n   */\n  constructor (VirtualKeyboardHidden) {\n    this.VirtualKeyboardHidden = VirtualKeyboardHidden;\n  }\n\n  /**\n   * @returns {VirtualKeyboardHidden}\n   */\n  create () {\n    return new this.VirtualKeyboardHidden();\n  }\n}\n\nexport default VirtualKeyboardHiddenFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Informace o skrytÃ© virtuÃ¡lnÃ­ klÃ¡vesnici.\n * @implements {VirtualKeyboardInfo}\n */\nclass VirtualKeyboardHidden {\n  /** @inheritdoc */\n  getHeight () {\n    return '0';\n  }\n\n  /** @inheritdoc */\n  isDisplayed () {\n    return false;\n  }\n\n  /** @inheritdoc */\n  isOverlapping () {\n    return false;\n  }\n}\n\nexport default VirtualKeyboardHidden;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO ÄŒÃ¡st Vue konfigurace probÃ­hÃ¡ takÃ© v Logger.\n// - PÅ™idat metodu Logger#addVue a volat ji odsud.\n/**\n * TovÃ¡rna na [instance Vue objektÅ¯](https://vuejs.org/v2/guide/instance.html).\n * StarÃ¡ se o [globÃ¡lnÃ­ konfiguraci](https://vuejs.org/v2/api/).\n */\nclass VueFactory {\n  /**\n   * @param {VeeValidate} VeeValidate\n   * @param {VueConstructor} Vue\n   */\n  constructor (VeeValidate, Vue) {\n    Vue.config.productionTip = false;\n    Vue.use(VeeValidate, {\n      enableAutoClasses: true,\n      // ZpracovÃ¡nÃ­ reakce na udÃ¡losti je nedokonalÃ©.\n      // Validace se provÃ¡dÃ­ jeÅ¡tÄ› pÅ™ed odeslÃ¡nÃ­m formulÃ¡Å™e a mate uÅ¾ivatele.\n      // NavÃ­c nelze udÃ¡losti mÄ›nit napÅ™. v zÃ¡vislosti na odeslÃ¡nÃ­ formulÃ¡Å™e.\n      // Reakce jsou deaktivovÃ¡ny nastavenÃ­m \"none\".\n      // UdÃ¡losti je tÅ™eba sledovat ruÄ�nÄ› a reagovat na nÄ› dle potÅ™eby.\n      events: 'none',\n      classNames: {\n        valid: 'valid',\n        invalid: 'invalid'\n      },\n      locale: 'en'\n    });\n    this.Vue = Vue;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novou Vue instanci.\n   * @param {Object} [options] Vue Options.\n   * @returns {Vue}\n   */\n  create (options) {\n    return new this.Vue(options);\n  }\n}\n\nexport default VueFactory;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO NemÄ›lo by se pravidlo aktivovat jen pro Node.js?\n/* eslint-disable standard/no-callback-literal */\n\nimport EventEmitter from 'eventemitter3';\n\n/**\n * NaslouchaÄ� zmÄ›nÃ¡m v pÅ™ipojenÃ­ k sÃ­ti pro standardnÃ­ webovÃ© API.\n * @implements {NetworkListener}\n */\nclass WebNetworkListener {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {EventTarget} eventTarget Zdroj udÃ¡lostÃ­ `online` a `offline`.\n   * @param {NavigatorOnLine} navigator Zdroj hodonty `onLine`.\n   */\n  constructor (eventTarget, navigator) {\n    /**\n     * SprÃ¡vce udÃ¡lostÃ­.\n     * @private\n     * @type {EventEmitter}\n     */\n    this.emitter = new EventEmitter();\n    this.eventTarget = eventTarget;\n    this.listenerMap = new Map();\n    this.navigator = navigator;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onOffline = this.onOffline.bind(this);\n    this.onOnline = this.onOnline.bind(this);\n  }\n\n  /**\n   * ZjistÃ­, jestli je zaÅ™Ã­zenÃ­ aktuÃ¡lnÄ› pÅ™ipojeno k sÃ­ti.\n   * @returns {boolean} PÅ™Ã­znak, jestli je zaÅ™Ã­zenÃ­ pÅ™ipojeno k sÃ­ti.\n   */\n  isOnline () {\n    return this.navigator.onLine;\n  }\n\n  /** @inheritdoc */\n  off (type, callback) {\n    const {eventTarget, listenerMap} = this;\n    // ZatÃ­m je podporovÃ¡na pouze udÃ¡lost onlineChanged, ostatnÃ­ jsou ignorovÃ¡ny.\n    if (type !== 'onlineChanged') {\n      return;\n    }\n    // OdebÃ­rÃ¡nÃ­ neexistujÃ­cÃ­ch callbackÅ¯ je ignorovÃ¡no.\n    if (!listenerMap.has(callback)) {\n      return;\n    }\n    // VyhledÃ¡ se odpovÃ­dajÃ­cÃ­ listener a odregistruje se.\n    const {onOffline, onOnline} = listenerMap.get(callback);\n    listenerMap.delete(callback);\n    eventTarget.removeEventListener('offline', onOffline);\n    eventTarget.removeEventListener('online', onOnline);\n  }\n\n  /** @inheritdoc */\n  on (type, callback) {\n    const {eventTarget, listenerMap} = this;\n    // ZatÃ­m je podporovÃ¡na pouze udÃ¡lost onlineChanged, ostatnÃ­ jsou ignorovÃ¡ny.\n    if (type !== 'onlineChanged') {\n      return;\n    }\n    // OpakovanÃ© pÅ™idÃ¡nÃ­ stejnÃ©ho callbacku je ignorovÃ¡no.\n    if (listenerMap.has(callback)) {\n      return;\n    }\n    // VytvoÅ™Ã­ se novÃ½ listener a zaregistruje se.\n    const onOffline = () => callback(false);\n    const onOnline = () => callback(true);\n    listenerMap.set(callback, {onOffline, onOnline});\n    eventTarget.addEventListener('offline', onOffline);\n    eventTarget.addEventListener('online', onOnline);\n  }\n\n  /**\n   * Reakce na pÅ™echod do offline stavu.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onOffline () {\n    this.emitter.emit('onlineChanged', false);\n  }\n\n  /**\n   * Reakce na pÅ™echod do online stavu.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onOnline () {\n    this.emitter.emit('onlineChanged', true);\n  }\n}\n\nexport default WebNetworkListener;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * Utilita pro promisifikaci XHR poÅ¾adavkÅ¯.\n * Dokumentace:\n * [Go Make Things](https://gomakethings.com/promise-based-xhr/).\n */\nclass XhrFetcher {\n  /**\n   * Provede kompletnÃ­ XHR dotaz.\n   * PodobnÄ› jako Fetch API neselÅ¾e pÅ™i chybovÃ©m HTTP statusu.\n   * @param {Url} url URL, na kterou se mÃ¡ dotaz provÃ©st.\n   * @param {Object} [opts={}]\n   * @param {string} [opts.method='GET'] [HTTP request method](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods).\n   * @param {string} [opts.responseType=''] [XHR response type](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType).\n   * @private\n   * @returns {Promise.<XMLHttpRequest>} VyÅ™eÅ¡Ã­ se po dokonÄ�enÃ­ celÃ©ho XHR dotazu,\n   * kdy je ve stavu `DONE` (4).\n   */\n  fetch (url, {method = 'GET', responseType = ''} = {}) {\n    return new Promise((resolve) => {\n      // Create the XHR request\n      const xhr = new XMLHttpRequest();\n      // Setup our listener to process compeleted requests\n      xhr.onreadystatechange = () => {\n        // Only run if the request is complete\n        if (xhr.readyState !== 4) {\n          return;\n        }\n        return resolve(xhr);\n      };\n      xhr.responseType = responseType;\n      // Setup our HTTP request\n      xhr.open(method, url, true);\n      // Send the request\n      xhr.send();\n    });\n  }\n}\n\nexport default XhrFetcher;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// TODO #169 Refaktorizovat adaptÃ©ry a device.\n/* eslint-disable max-statements */\n\nimport EventEmitter from 'eventemitter3';\nimport isNil from 'lodash/isNil';\n\nimport CommandEnum from '../core/command-enum';\n\n// TODO #44 Dopsat E2E testy pro update. Jak nastavovat na serveru?\n// TODO #93 PlÃ¡n:\n// - Installer: Algoritmus spuÅ¡tÄ›nÃ­ zaÅ™Ã­zenÃ­:\n//   - pokud je zaÅ™Ã­zenÃ­ jiÅ¾ spuÅ¡tÄ›nÃ©, vyhodit chybu.\n//   - start adaptÃ©ru (naslouchÃ¡nÃ­ teplotÄ› apod.)\n//   - detekce platformy (pro aktualizaci apod.)\n//   - obnovenÃ­ hodnot z datovÃ©ho skladu (JSON + binÃ¡rnÃ­)\n//   - pokud zaÅ™Ã­zenÃ­ nenÃ­ nainstalovanÃ©, tak se zobrazÃ­ setup wizard a do jeho vyplnÄ›nÃ­ se nic dÃ¡le neprovÃ¡dÃ­. Po odeslÃ¡nÃ­ se zaÅ™Ã­zenÃ­ zaÄ�ne pÅ™ipojovat.\n//   - pokud jiÅ¾ zaÅ™Ã­zenÃ­ nÄ›kdy obdrÅ¾elo obsah, tak se zobrazÃ­ poslednÃ­ kompletnÄ› naÄ�tenÃ½.\n//      - To mÅ¯Å¾e bÃ½t prolÃ­naÄ�, ale takÃ© tÅ™eba Ä�ernÃ¡ obrazovka, pokud byl takto obsah pÅ™i vypnutÃ­ nastaven.\n//   - jinak se zobrazuje naÄ�Ã­tacÃ­ animace, dokud se nepodaÅ™Ã­ poprvÃ© kompletnÄ› naÄ�Ã­st obsah.\n//   - spuÅ¡tÄ›nÃ­ pÅ™ipojenÃ­ zaÅ™Ã­zenÃ­\n// - Communicator: Algoritmus pÅ™ipojenÃ­ zaÅ™Ã­zenÃ­ (serverUrl, deviceId):\n//   - pokud je zaÅ™Ã­zenÃ­ jiÅ¾ pÅ™ipojenÃ©, vyhodit chybu.\n//   - naplÃ¡novat provÃ¡dÄ›nÃ­ heartbeat opakovanÄ› v intervalu bez ohledu na vÃ½sledek.\n//   - provedenÃ­ prvnÃ­ho heartbeat.\n// - CommunicatorHeartbeat: Algoritmus provedenÃ­ heartbeat:\n//   - pokud se jiÅ¾ nÄ›jakÃ½ heartbeat provÃ¡dÃ­, tak tuto iteraci nedÄ›lat nic.\n//   - staÅ¾enÃ­ heartbeat\n//   - porovnajÃ­ se pÅ™ijatÃ© hodnoty s pÅ™edchozÃ­mi a v pÅ™Ã­padÄ› zmÄ›n se spouÅ¡tÃ­ paralelnÄ›:\n//     - provedenÃ­ aktualizace (mÄ›lo by bÃ½t jasnÃ©)\n//     - spuÅ¡tÄ›nÃ­ pÅ™Ã­kazÅ¯ (mÄ›lo by bÃ½t jasnÃ©)\n//     - staÅ¾enÃ­ JSON obsahu.\n// - ContentCommunicator: Algoritmus stahovÃ¡nÃ­ JSON obsahu (contentTimestamp):\n//   - uloÅ¾enÃ­ nejnovÄ›jÅ¡Ã­ho poÅ¾adovanÃ©ho contentTimestamp.\n//   - pokud se jiÅ¾ nÄ›jakÃ½ obsah stahuje, tak se jiÅ¾ nic jinÃ©ho nedÄ›lat.\n//   - staÅ¾enÃ­ JSON obsahu\n//   - pokud staÅ¾enÃ­ neuspÄ›je, nebo naÄ�tenÃ½ JSON obsah neodpovÃ­dÃ¡ uloÅ¾enÃ©mu contentTimestamp (tj. nejnovÄ›jÅ¡Ã­ poÅ¾adovanÃ½ bÄ›hem stahovÃ¡nÃ­)\n//       - poÄ�kat urÄ�itÃ½ poÄ�et vteÅ™in a pak opakovat staÅ¾enÃ­.\n//   - uloÅ¾enÃ­ dat z JSON obsahu do samostatnÃ©ho datovÃ©ho skladu contentStore.\n//   - staÅ¾enÃ­ binÃ¡rnÃ­ch souborÅ¯.\n// - Downloader: Algoritmus stahovÃ¡nÃ­ binÃ¡rnÃ­ho obsahu (contentStore):\n//   - pokud se jiÅ¾ nÄ›jakÃ½ obsah stahuje, tak se vyÅ¾Ã¡dÃ¡ jeho pÅ™eruÅ¡enÃ­ (a vymazÃ¡nÃ­?), potom se pokraÄ�uje.\n//   - (sÃ©riovÃ©?) staÅ¾enÃ­ vÅ¡ech potÅ™ebnÃ½ch souborÅ¯ z contentStore na disk zaÅ™Ã­zenÃ­, neuspÄ›Å¡nÃ© (URL neexistuje, nenÃ­ mÃ­sto na disku...) se ignorujÃ­.\n//   - narozdÃ­l od JSON obsahu je zde datovÃ© ÃºloÅ¾iÅ¡tÄ› binÃ¡rnÃ­ch souborÅ¯ sdÃ­lenÃ© s aktuÃ¡lnÄ› pÅ™ehrÃ¡vanÃ½m obsahem (nestahuje se znova, jen se pÅ™idÃ¡vajÃ­ novÃ©).\n//   - vÃ½mÄ›na obsahu.\n// - Replacer: Algoritmus vÃ½mÄ›ny obsahu (contentStore):\n//   - nahrazenÃ­ nynÃ­ kompletnÄ› staÅ¾enÃ©ho contentStore za aktuÃ¡lnÄ› pÅ™ehrÃ¡vanÃ½ obsah.\n//   - zobrazenÃ­ novÃ©ho obsahu.\n//   - oznaÄ�enÃ­ starÃ©ho binÃ¡rnÃ­ho obsahu pro moÅ¾nÃ© uvolnÄ›nÃ­ pÅ™i garbage collection?\n// TODO #93 Struktura:\n// - Installer\n// - Communicator\n//   - CommunicatorHeartbeat\n//   - ContentCommunicator\n// - Replacer\n//   - Downloader\n// - Commander\n// - Updater\n// - Reporter\n// TODO #295 Refaktorizovat Å™Ã­zenÃ­ prolÃ­naÄ�e:\n// - VytvoÅ™it ViewerManager:\n//   - constructor (scheduleManager, viewerDirectorResource, viewerRegistry)\n//   - createDirector(): ViewerDirector\n//   - destroyDirector(director): undefined\n//   - getContent(): ContentInfo\n//   - setContent(contentInfo): Promise.<undefined>\n// - ZatÃ­m nenÃ­ implementovÃ¡no, protoÅ¾e by to vyÅ¾adovalo moc zmÄ›n v souÄ�asnÃ© logice.\n//   RadÄ›ji je zachovÃ¡na souÄ�asnÃ¡ logika se specifickÃ½mi reakcemi na rÅ¯znÃ© zmÄ›ny.\n//   Asi by bylo vhodnÃ© pÅ™idruÅ¾it k nÄ›jakÃ© promyÅ¡lenÃ© top-level reorganizaci.\n// - Za zaÄ�Ã¡tku je zde prÃ¡zdnÃ½ obsah.\n//   BÄ›hem startu se obsah obnovÃ­ z localStorage.\n//   DÃ¡le se aktualizuje dle zmÄ›n obsahu z komunikÃ¡toru.\n//   Obsah je kdykoliv pÅ™ipraven, aby z nÄ›j mohlo bÃ½t plÃ¡novÃ¡no pÅ™ehrÃ¡vÃ¡nÃ­.\n// - Je dÅ¯leÅ¾itÃ©, aby byly plÃ¡novacÃ­ strategie vytvÃ¡Å™eny pro kaÅ¾dÃ½ prolÃ­naÄ� samostatnÄ›.\n//   KdyÅ¾ by zde byly dva ViewerDirector, tak by si vzÃ¡jemnÄ› pÅ™eskakovali mÃ©dia.\n//   TakÃ© jejich stavy budou odliÅ¡nÃ©, kdyÅ¾ zÃ¡leÅ¾Ã­ na dobÄ› fyzickÃ©ho pÅ™ehrÃ¡nÃ­ mÃ©dia,\n//   nebo takÃ© mohou rÅ¯znÄ› pÅ™eskakovat mÃ©dia kvÅ¯li vyÄ�erpÃ¡nÃ­ zdrojÅ¯.\n//   VÅ¾dy se tedy uchovÃ¡vÃ¡ aktuÃ¡lnÃ­ obsah a aÅ¾ on-demand se vytvÃ¡Å™Ã­ novÃ¡ sada strategiÃ­.\n/**\n * ZaÅ™Ã­zenÃ­, kterÃ© posktytuje sluÅ¾by pomocÃ­ libovolnÃ©ho adaptÃ©ru.\n * Do budoucna z nÄ›j bude vyÄ�lenÄ›na tÅ™Ã­da Client, kterÃ¡ bude poskytovat Ä�Ã¡st jeho rozhranÃ­ pÅ™es MessageChannel.\n * @implements {EventBus}\n */\nclass Device {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {string} [buildId]\n   * @param {AnalyticsTracker} analyticsTracker\n   * @param {Communicator} communicator\n   * @param {FingerprintManager} fingerprintManager\n   * @param {FirmwareManager} firmwareManager\n   * @param {Logger} logger\n   * @param {LoggerManager} loggerManager\n   * @param {NetworkListener} networkListener\n   * @param {PowerManager} powerManager\n   * @param {Replacer} replacer\n   * @param {ReportManager} reportManager\n   * @param {ScheduleManager} scheduleManager\n   * @param {Session} session\n   * @param {StartupManager} startupManager\n   * @param {Store} store\n   * @param {Updater} updater\n   * @param {ViewerDirectorResource} viewerDirectorResource\n   * @param {ViewerRegistry} viewerRegistry\n   * @returns {Device}\n   */\n  constructor (\n    buildId, analyticsTracker, communicator, fingerprintManager,\n    firmwareManager, logger, loggerManager, networkListener, powerManager,\n    replacer, reportManager, scheduleManager, session, startupManager, store,\n    updater, viewerDirectorResource, viewerRegistry\n  ) {\n    this.analyticsTracker = analyticsTracker;\n    this.buildId = buildId;\n    this.communicator = communicator;\n    this.contentInfo = {\n      firmwareRelease: null,\n      layerArray: [],\n      layoutArray: [],\n      mediumArray: [],\n      playlistArray: [],\n      session,\n      store,\n      taskArray: [],\n      timerArray: [],\n      trackArray: []\n    };\n    this.emitter = new EventEmitter();\n    this.fingerprintManager = fingerprintManager;\n    this.firmwareManager = firmwareManager;\n    this.logger = logger;\n    this.loggerManager = loggerManager;\n    this.networkListener = networkListener;\n    this.powerManager = powerManager;\n    this.replacer = replacer;\n    this.reportManager = reportManager;\n    this.scheduleManager = scheduleManager;\n    this.session = session;\n    this.startupManager = startupManager;\n    this.store = store;\n    this.updater = updater;\n    this.viewerDirectorResource = viewerDirectorResource;\n    this.viewerRegistry = viewerRegistry;\n    // NavÃ¡zÃ¡nÃ­ naslouchÃ¡nÃ­ na instanci.\n    this.onContentCleaned = this.onContentCleaned.bind(this);\n    this.onError = this.onError.bind(this);\n    this.onHeartbeatFetched = this.onHeartbeatFetched.bind(this);\n    this.onOnlineChanged = this.onOnlineChanged.bind(this);\n    analyticsTracker.on('error', this.onError);\n    networkListener.on('onlineChanged', this.onOnlineChanged);\n    replacer.on('content', this.onContentCleaned);\n  }\n\n  /**\n   * SpustÃ­ kontinuÃ¡lnÃ­ synchronizaci obsahu zaÅ™Ã­zenÃ­ se spÃ¡rovanÃ½m serverem.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se pod dokonÄ�enÃ­ prvnÃ­ synchronizace.\n   */\n  connect () {\n    const {communicator, session} = this;\n    // NaslouchÃ¡nÃ­ udÃ¡lostem.\n    communicator.on('error', this.onError);\n    communicator.on('heartbeatFetched', this.onHeartbeatFetched);\n    return communicator.connect(session.serverUrl, session.deviceId, session.contentTimestamp);\n  }\n\n  /**\n   * VytvoÅ™Ã­ novÃ½ organizÃ¡tor zobrazovÃ¡nÃ­ obsahu.\n   * @param {HTMLElement} el ELement, do kterÃ©ho se prolÃ­naÄ� vykresluje.\n   * @returns {ViewerDirector}\n   */\n  createDirector (el) {\n    const director = this.viewerDirectorResource.create(el);\n    const {layerArray, session, store, taskArray} = this.contentInfo;\n    const scheduleStrategyArray = this.scheduleManager.createStrategies(layerArray, session, store, taskArray);\n    // Na vÃ½sledek se neÄ�ekÃ¡, kvÅ¯li zpÄ›tnÃ© kompatibilitÄ›,\n    // aby mohlo bÃ½t GUI kdykoliv ukonÄ�eno a pÅ™itom doÅ¡lo i ke zruÅ¡enÃ­ vlÃ¡ken.\n    director.createThreads(scheduleStrategyArray);\n    return director;\n  }\n\n  /**\n   * UvolnÃ­ vÅ¡echny zdroje pro garbage collection.\n   * @returns {undefined} Nic.\n   */\n  destroy () {\n    const {communicator} = this;\n    this.analyticsTracker.off('error', this.onError);\n    communicator.off('error', this.onError);\n    communicator.off('heartbeatFetched', this.onHeartbeatFetched);\n    this.networkListener.off('onlineChanged', this.onOnlineChanged);\n    this.replacer.off('content', this.onContentCleaned);\n  }\n\n  /**\n   * ZruÅ¡Ã­ vytvoÅ™enÃ½ organizÃ¡tor zobrazovÃ¡nÃ­ obsahu.\n   * @param {ViewerDirector} director\n   * @returns {undefined}\n   */\n  destroyDirector (director) {\n    this.viewerDirectorResource.destroy(director);\n  }\n\n  /**\n   * SpuÅ¡tÄ›nÃ­ pÅ™Ã­kazu pro zaÅ™Ã­zenÃ­.\n   * @param {CommandEnum} commandEnum PÅ™Ã­kaz.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po provedenÃ­ pÅ™Ã­kazu.\n   */\n  execute (commandEnum) {\n    // TODO Refktorizovat s vyuÅ¾itÃ­m polymorfismu mÃ­sto switch.\n    // - VytvoÅ™it rozhranÃ­ Command s metodou #execute().\n    // - Implementovat rozhranÃ­ pro kaÅ¾dÃ½ typ pÅ™Ã­kazu. V konstruktoru sluÅ¾by, kterÃ© pÅ™Ã­kaz provedou.\n    // - VytvoÅ™it tÅ™Ã­du CommandFactory s metodou #create(commandEnum): Command.\n    //   Nebo tovÃ¡rna pro kaÅ¾dÃ½ typ? Nebo registr pÅ™Ã­kazÅ¯ s #register(commandEnum, commandFactory)?\n    switch (commandEnum) {\n      case CommandEnum.POWER_OFF:\n        return this.powerManager.shutdown();\n      case CommandEnum.REBOOT:\n        return this.powerManager.reboot();\n      case CommandEnum.REPORT:\n        return this.report();\n      default:\n        return Promise.reject(new RangeError(`Unknown command \"${commandEnum}\".`));\n    }\n  }\n\n  /**\n   * ZÃ­skÃ¡ dodateÄ�nÃ© informace pro chybovÃ© udÃ¡losti.\n   * @returns {Promise.<LoggerInfo>} DodateÄ�nÃ© informace.\n   */\n  getLoggerInfo () {\n    return (\n      Promise.all([\n        this.loggerManager.getInfo()\n        .catch((error) => {\n          this.logger.error(error);\n          return {};\n        }),\n        new Promise((resolve) => {\n          const {session} = this;\n          const online = this.networkListener.isOnline();\n          return resolve({\n            deviceId: session.deviceId,\n            online,\n            version: session.version\n          });\n        })\n        .catch((error) => {\n          this.logger.error(error);\n          return {\n            deviceId: null,\n            online: null,\n            version: null\n          };\n        })\n      ])\n      .then((loggerInfoArray) => Object.assign({}, ...loggerInfoArray))\n    );\n  }\n\n  /**\n   * ZjistÃ­ informace o zaÅ™Ã­zenÃ­.\n   * @returns {Promise.<ReportInfo>} Informace o zaÅ™Ã­zenÃ­.\n   */\n  getReportInfo () {\n    return (\n      this.reportManager.getInfo()\n      .catch((error) => {\n        this.logger.error(error);\n        return {};\n      })\n      .then((reportInfo) => {\n        const {session} = this;\n        return {\n          ...reportInfo,\n          buildId: this.buildId,\n          contentTimestamp: session.contentTimestamp,\n          version: session.version\n        };\n      })\n    );\n  }\n\n  /**\n   * ZaznamenÃ¡ analytickÃ¡ data.\n   * @param {ScheduleInfo} scheduleInfo Informace o pÅ™ehranÃ©m mÃ©diu.\n   * @returns {Promise.<AnalyticsCounter>} AgregovanÃ¡ data, do kterÃ½ch byl proveden zÃ¡znam.\n   */\n  hit (scheduleInfo) {\n    return this.analyticsTracker.hit(scheduleInfo);\n  }\n\n  /**\n   * Nainstaluje zaÅ™Ã­zenÃ­ a zmÄ›nÃ­ jeho spÃ¡rovÃ¡nÃ­ se serverem.\n   * @param {string} deviceId IdentifikÃ¡tor Ki-Wi zaÅ™Ã­zenÃ­ pro spÃ¡rovÃ¡nÃ­.\n   * @param {string} serverUrl URL adresa Ki-Wi Server pro spÃ¡rovÃ¡nÃ­.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po dokonÄ�enÃ­ instalace.\n   */\n  install (deviceId, serverUrl) {\n    return (\n      this.store.update('session', this.session.id, {deviceId, serverUrl})\n      .then(() => {\n        this.logger.setInfo({deviceId});\n      })\n    );\n  }\n\n  /** @inheritdoc */\n  off (...args) {\n    this.emitter.off(...args);\n  }\n\n  /** @inheritdoc */\n  on (...args) {\n    this.emitter.on(...args);\n  }\n\n  /**\n   * Reakce na poÅ¾adavek na zastavenÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ obsahu pÅ™i Ä�iÅ¡tÄ›nÃ­ mÃ­sta na disku.\n   * @param {ContentInfo} contentInfo PrÃ¡zdnÃ½ obsah.\n   * @returns {undefined} Nic.\n   */\n  onContentCleaned (contentInfo) {\n    // TODO #295 Hotfix zastavenÃ­ obsahu pÅ™ed spuÅ¡tÄ›nÃ­m Ä�iÅ¡tÄ›nÃ­.\n    // - Zrevidovat celou funkcionalitu. NenÃ­ ÃºplnÄ› 100% dokonalÃ¡ a elegantnÃ­.\n    // - ObecnÄ› se udÃ¡lost pÅ™edÃ¡vÃ¡ takto: Cleaner -> Downloader -> Replacer -> Device.\n    // - TakÃ© by nemuselo posÃ­lat obsah, spÃ­Å¡e poÅ¾adavek na zastavenÃ­ vlÃ¡ken prohlÃ­Å¾eÄ�e.\n    // - NarozdÃ­l od bÄ›Å¾nÃ© zmÄ›ny obsahu se neprovÃ¡dÃ­ nÄ›kterÃ© akce i kdyÅ¾ by moÅ¾nÃ¡ mÄ›li.\n    // - TakÃ© se zbyteÄ�nÄ› volÃ¡ `createThreads`. PÅ™eci jen je zde moÅ¾nost, Å¾e by cleaner nÄ›jakÃ½ obah vloÅ¾il.\n    //   PÅ™epracovat aÅ¾ s pÅ™Ã­padnou refaktorizacÃ­ Ä�iÅ¡tÄ›nÃ­.\n    this.contentInfo = contentInfo;\n    const {layerArray, session, store, taskArray} = contentInfo;\n    const scheduleStrategyArray = this.scheduleManager.createStrategies(layerArray, session, store, taskArray);\n    this.viewerDirectorResource.getAll()\n    .forEach((director) => (\n      director.destroyThreads()\n      .then(() => director.createThreads(scheduleStrategyArray))\n    ));\n  }\n\n  /**\n   * Reakce na chybu.\n   * @param {Error} error ChybovÃ½ objekt.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onError (error) {\n    this.logger.error(error);\n  }\n\n  /**\n   * Reakce na doruÄ�enÃ­ push dat ze serveru.\n   * @param {HeartbeatInfo} heartbeat Push data.\n   * @returns {undefined} Nic.\n   */\n  onHeartbeatFetched (heartbeat) {\n    const {deviceId, serverUrl} = this.session;\n    // Synchronizace fronty pÅ™Ã­kazÅ¯ z heartbeat.\n    this.communicator.fetchCommand(serverUrl, deviceId, heartbeat.queueIdArray)\n    .then((commandEnum) => {\n      if (isNil(commandEnum)) {\n        return;\n      }\n      return this.execute(commandEnum);\n    })\n    // Synchronizace obsahu s novÃ½m heartbeat timestamp.\n    .then(() => this.communicator.fetchContent(serverUrl, deviceId, heartbeat.contentTimestamp))\n    .then((fetchedContentInfo) => {\n      if (isNil(fetchedContentInfo)) {\n        // Pokud nebyl novÃ½ obsah staÅ¾en, tak se provede pouze aktualizace aplikace.\n        return this.updater.updateVersion(heartbeat.version);\n      }\n      // Pokud byl obsah staÅ¾en, tak se nahradÃ­ za aktuÃ¡lnÃ­.\n      return (\n        this.replacer.replace(fetchedContentInfo)\n        .then((replacedContentInfo) => {\n          // VyvolÃ¡nÃ­ udÃ¡losti informujÃ­cÃ­m o novÃ©m obsahu.\n          // TODO #295 Refaktorizovat udÃ¡lost s obsahem.\n          // - ZatÃ­m je vyvolÃ¡no zde pro zachovÃ¡nÃ­ zpÄ›tnÃ© kompatibility.\n          //   DÃ¡valo by smysl vyvolÃ¡vat aÅ¾ po dokonÄ�enÃ­ zmÄ›ny.\n          // - Do budoucna odebrat veÅ¡kerÃ© Å™Ã­zenÃ­ z GUI a vÅ¡e Å™eÅ¡it ve sluÅ¾bÃ¡ch.\n          this.emitter.emit('content', replacedContentInfo);\n          this.contentInfo = replacedContentInfo;\n          const {layerArray, session, store, taskArray} = replacedContentInfo;\n          const scheduleStrategyArray = this.scheduleManager.createStrategies(layerArray, session, store, taskArray);\n          const directorArray = this.viewerDirectorResource.getAll();\n          return (\n            // ZastavenÃ­ vÅ¡ech vlÃ¡ken pÅ™ehrÃ¡vaÄ�e.\n            directorArray.reduce(\n              (accDirector, director) => accDirector.then(\n                director.destroyThreads()\n              ),\n              Promise.resolve()\n            )\n            // InformovÃ¡nÃ­ zdrojÅ¯ zobrazovÃ¡nÃ­ o zmÄ›nÄ› obsahu.\n            // Zdroje tak mohou provÃ©st ÃºdrÅ¾bu, kdyÅ¾ je jistÃ©, Å¾e Å¾Ã¡dnÃ½ nenÃ­ vypÅ¯jÄ�enÃ½.\n            .then(() => (\n              this.viewerRegistry.getAll()\n              .reduce(\n                (accType, viewerType) => accType.then(() => (\n                  viewerType.getSourceCreator().replace()\n                )),\n                Promise.resolve()\n              )\n            ))\n            // PÅ™epnutÃ­ analytickÃ½ch intervalÅ¯.\n            // ProvÃ¡dÃ­ se nynÃ­, protoÅ¾e je jistÃ©, Å¾e byly vÅ¡echny slajdy skrytÃ©,\n            // mÄ›lo by se tak pÅ™edejÃ­t nÃ¡sledujÃ­cÃ­mu problÃ©mu:\n            // Pro odeslÃ¡nÃ­ se pouÅ¾Ã­vÃ¡ udÃ¡lost \"left\". NÄ›kterÃ¡ mÃ©dia mohou \"pÅ™etÃ©kat\" do jinÃ½ch intervalÅ¯.\n            // NovÃ½ obsah = novÃ½ interval. Slajd vyvolÃ¡ \"left\" aÅ¾ kdyÅ¾ je jiÅ¾ pÅ™Ã­tomnÃ½ novÃ½ obsah.\n            // Chyba nezpÅ¯sobÃ­ zaseknutÃ­ aktualizace.\n            .then(() => (\n              this.analyticsTracker.replace()\n              .catch((error) => this.logger.error(error))\n            ))\n            // SpuÅ¡tÄ›nÃ­ vlÃ¡ken pÅ™ehrÃ¡vaÄ�e pro novÃ½ obsah.\n            .then(() => directorArray.reduce(\n              (accDirector, director) => accDirector.then(\n                director.createThreads(scheduleStrategyArray)\n              ),\n              Promise.resolve()\n            ))\n            // Aktualizace aplikace.\n            .then(() => this.updater.updateVersion(heartbeat.version))\n            // Aktualizace firmware.\n            .then(() => {\n              const {firmwareRelease} = replacedContentInfo;\n              if (isNil(firmwareRelease)) {\n                // Pokud nebylo vybrÃ¡no Å¾Ã¡dnÃ© vhodnÃ© vydÃ¡nÃ­ firmware, tak se aktualizace neprovede.\n                return;\n              }\n              return this.firmwareManager.update(firmwareRelease);\n            })\n          );\n        })\n      );\n    })\n    .catch((error) => this.logger.error(error));\n  }\n\n  /**\n   * Reakce na zmÄ›nu pÅ™ipojenÃ­ zaÅ™Ã­zenÃ­ k sÃ­ti.\n   * @param {boolean} online PÅ™Ã­znak, jestli je zaÅ™Ã­zenÃ­ online.\n   * @private\n   * @returns {undefined} Nic.\n   */\n  onOnlineChanged (online) {\n    this.logger.setInfo({online});\n  }\n\n  /**\n   * Detekuje informace o zaÅ™Ã­zenÃ­ a odeÅ¡le je na server.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po ÃºspÄ›Å¡nÃ©m dokonÄ�enÃ­.\n   */\n  report () {\n    return (\n      this.getReportInfo()\n      .then((reportInfo) => {\n        const {session} = this;\n        return this.communicator.report(session.serverUrl, session.deviceId, reportInfo);\n      })\n    );\n  }\n\n  /**\n   * SpustÃ­ zaÅ™Ã­zenÃ­ a obnovÃ­ jeho spÃ¡rovÃ¡nÃ­ se serverem.\n   * PÅ™i obnovenÃ­ se jiÅ¾ neprovÃ¡dÃ­ ovÄ›Å™enÃ­ zaÅ™Ã­zenÃ­ na serveru. VÅ¡echny Ãºdaje by mÄ›li bÃ½t pÅ™ed zÃ¡lohou ovÄ›Å™eny.\n   * To ovÅ¡em neznamenÃ¡, Å¾e v okamÅ¾iku obnovenÃ­ budou jeÅ¡tÄ› stÃ¡le platnÃ©, ale to Å¾e kdysi platnÃ© byly.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po obnovenÃ­ zaÅ™Ã­zenÃ­.\n   */\n  start () {\n    return (\n      // SpuÅ¡tÄ›nÃ­ platformovÄ› specifickÃ©ho kÃ³du.\n      // Chyba nezpÅ¯sobÃ­ zaseknutÃ­ spuÅ¡tÄ›nÃ­.\n      this.startupManager.start()\n      .catch((error) => this.logger.error(error))\n      // ObnovenÃ­ persistentnÃ­ch dat z minulÃ©ho spuÅ¡tÄ›nÃ­.\n      .then(() => this.replacer.start())\n      // Kontrola informacÃ­ o aktualizacÃ­ch z minulÃ©ho spuÅ¡tÄ›nÃ­.\n      .then(() => this.updater.start())\n      // Kontrola otisku zaÅ™Ã­zenÃ­.\n      // TODO PÅ™esunout do ReplacerFingerprint nebo RaplacerSession?\n      .then(() => {\n        if (!isNil(this.session.fingerprint)) {\n          // Pokud jiÅ¾ otisk existuje, nic se nedÄ›lÃ¡.\n          return;\n        }\n        // VygenerovÃ¡nÃ­ a uloÅ¾enÃ­ otisku zaÅ™Ã­zenÃ­.\n        return (\n          this.fingerprintManager.generate()\n          .then((fingerprint) => this.store.update('session', this.session.id, {fingerprint}))\n        );\n      })\n      // TODO #295 Refaktorizovat inicializaci obsahu.\n      // - IdeÃ¡lnÄ› by mÄ›lo bÃ½t vÃ½stupem z Replacer, nebo z ViewerManager#start.\n      .then(() => {\n        const {store} = this;\n        this.contentInfo = {\n          firmwareRelease: null,\n          layerArray: store.filter('layer'),\n          layoutArray: store.filter('layout'),\n          mediumArray: store.filter('medium'),\n          playlistArray: store.filter('playlist'),\n          session: this.session,\n          store,\n          taskArray: store.filter('task'),\n          timerArray: store.filter('timer'),\n          trackArray: store.filter('track')\n        };\n      })\n      // PÅ™idÃ¡nÃ­ dodateÄ�nÃ½ch informacÃ­ pro logovÃ¡nÃ­ chyb\n      // a datovÃ©ho skladu pro zÃ¡lohu vÃ½jimek.\n      // Chyba nezpÅ¯sobÃ­ zaseknutÃ­ spuÅ¡tÄ›nÃ­.\n      .then(() => (\n        this.getLoggerInfo()\n        .then((loggerInfo) => this.logger.setInfo(loggerInfo))\n        .catch((error) => this.logger.error(error))\n      ))\n      // ZruÅ¡enÃ­ starÃ½ch jiÅ¾ nepouÅ¾Ã­vanÃ½ch zdrojÅ¯, aby nezabÃ­rali mÃ­sto.\n      // Chyba nezpÅ¯sobÃ­ zaseknutÃ­ spuÅ¡tÄ›nÃ­.\n      .then(() => (\n        this.store.destroyAll('exception')\n        .catch((error) => this.logger.error(error))\n      ))\n      // Inicializace analyzÃ¡toru.\n      // Chyba nezpÅ¯sobÃ­ zaseknutÃ­ spuÅ¡tÄ›nÃ­.\n      .then(() => (\n        this.analyticsTracker.start()\n        .catch((error) => this.logger.error(error))\n      ))\n    );\n  }\n}\n\n/**\n * NovÃ½ obsah zaÅ™Ã­zenÃ­ k zobrazenÃ­.\n * @event Device#content\n * @param {ContentInfo} contentInfo Informace o novÃ©m obsahu zaÅ™Ã­zenÃ­.\n */\n\nexport default Device;\n","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.GenericPoolBrowser=e():t.GenericPoolBrowser=e()}(window,function(){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=t,i.c=e,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},i.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&\"object\"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var r in t)i.d(n,r,function(e){return t[e]}.bind(null,r));return n},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,\"a\",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p=\"\",i(i.s=33)}([function(t,e){t.exports=function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}},function(t,e){t.exports=function(t){return t&&t.__esModule?t:{default:t}}},function(t,e){function i(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}t.exports=function(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}},function(t,e){function i(e){return t.exports=i=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},i(e)}t.exports=i},function(t,e,i){var n=i(8);t.exports=function(t,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function\");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&n(t,e)}},function(t,e,i){var n=i(31),r=i(14);t.exports=function(t,e){return!e||\"object\"!==n(e)&&\"function\"!=typeof e?r(t):e}},function(t,e,i){\"use strict\";var n=i(1),r=n(i(0)),s=n(i(2)),o=i(11),u=i(10),a=function(){function t(){(0,r.default)(this,t),this._list=new o}return(0,s.default)(t,[{key:\"shift\",value:function(){if(0!==this.length){var t=this._list.head;return this._list.remove(t),t.data}}},{key:\"unshift\",value:function(t){var e=o.createNode(t);this._list.insertBeginning(e)}},{key:\"push\",value:function(t){var e=o.createNode(t);this._list.insertEnd(e)}},{key:\"pop\",value:function(){if(0!==this.length){var t=this._list.tail;return this._list.remove(t),t.data}}},{key:Symbol.iterator,value:function(){return new u(this._list)}},{key:\"iterator\",value:function(){return new u(this._list)}},{key:\"reverseIterator\",value:function(){return new u(this._list,!0)}},{key:\"head\",get:function(){if(0!==this.length)return this._list.head.data}},{key:\"tail\",get:function(){if(0!==this.length)return this._list.tail.data}},{key:\"length\",get:function(){return this._list.length}}]),t}();t.exports=a},function(t,e,i){\"use strict\";var n=i(1),r=n(i(0)),s=n(i(2)),o=function(){function t(e){var i=this;(0,r.default)(this,t),this._state=t.PENDING,this._resolve=void 0,this._reject=void 0,this._promise=new e(function(t,e){i._resolve=t,i._reject=e})}return(0,s.default)(t,[{key:\"reject\",value:function(e){this._state===t.PENDING&&(this._state=t.REJECTED,this._reject(e))}},{key:\"resolve\",value:function(e){this._state===t.PENDING&&(this._state=t.FULFILLED,this._resolve(e))}},{key:\"state\",get:function(){return this._state}},{key:\"promise\",get:function(){return this._promise}}]),t}();o.PENDING=\"PENDING\",o.FULFILLED=\"FULFILLED\",o.REJECTED=\"REJECTED\",t.exports=o},function(t,e){function i(e,n){return t.exports=i=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},i(e,n)}t.exports=i},function(t,e,i){\"use strict\";var n=i(1),r=n(i(0)),s=n(i(2)),o=i(16),u=function(){function t(e){(0,r.default)(this,t),this._size=Math.max(0|+e,1),this._slots=[];for(var i=0;i<this._size;i++)this._slots.push(new o)}return(0,s.default)(t,[{key:\"enqueue\",value:function(t,e){(e=e&&0|+e||0)&&(e<0||e>=this._size)&&(e=this._size-1),this._slots[e].push(t)}},{key:\"dequeue\",value:function(){for(var t=0,e=this._slots.length;t<e;t+=1)if(this._slots[t].length)return this._slots[t].shift()}},{key:\"length\",get:function(){for(var t=0,e=0,i=this._slots.length;e<i;e++)t+=this._slots[e].length;return t}},{key:\"head\",get:function(){for(var t=0,e=this._slots.length;t<e;t+=1)if(this._slots[t].length>0)return this._slots[t].head}},{key:\"tail\",get:function(){for(var t=this._slots.length-1;t>=0;t--)if(this._slots[t].length>0)return this._slots[t].tail}}]),t}();t.exports=u},function(t,e,i){\"use strict\";var n=i(1),r=n(i(0)),s=n(i(2)),o=n(i(5)),u=n(i(3)),a=n(i(13)),l=n(i(4)),c=function(t){function e(){return(0,r.default)(this,e),(0,o.default)(this,(0,u.default)(e).apply(this,arguments))}return(0,l.default)(e,t),(0,s.default)(e,[{key:\"next\",value:function(){var t=(0,a.default)((0,u.default)(e.prototype),\"next\",this).call(this);return t.value&&(t.value=t.value.data),t}}]),e}(i(17));t.exports=c},function(t,e,i){\"use strict\";var n=i(1),r=n(i(0)),s=n(i(2)),o=function(){function t(){(0,r.default)(this,t),this.head=null,this.tail=null,this.length=0}return(0,s.default)(t,[{key:\"insertBeginning\",value:function(t){null===this.head?(this.head=t,this.tail=t,t.prev=null,t.next=null,this.length++):this.insertBefore(this.head,t)}},{key:\"insertEnd\",value:function(t){null===this.tail?this.insertBeginning(t):this.insertAfter(this.tail,t)}},{key:\"insertAfter\",value:function(t,e){e.prev=t,e.next=t.next,null===t.next?this.tail=e:t.next.prev=e,t.next=e,this.length++}},{key:\"insertBefore\",value:function(t,e){e.prev=t.prev,e.next=t,null===t.prev?this.head=e:t.prev.next=e,t.prev=e,this.length++}},{key:\"remove\",value:function(t){null===t.prev?this.head=t.next:t.prev.next=t.next,null===t.next?this.tail=t.prev:t.next.prev=t.prev,t.prev=null,t.next=null,this.length--}}],[{key:\"createNode\",value:function(t){return{prev:null,next:null,data:t}}}]),t}();t.exports=o},function(t,e,i){\"use strict\";var n=i(1),r=n(i(0)),s=n(i(2)),o=function(){function t(){(0,r.default)(this,t)}return(0,s.default)(t,[{key:\"evict\",value:function(t,e,i){var n=Date.now()-e.lastIdleTime;return t.softIdleTimeoutMillis>0&&t.softIdleTimeoutMillis<n&&t.min<i||t.idleTimeoutMillis<n}}]),t}();t.exports=o},function(t,e,i){i(3);var n=i(25);function r(e,i,s){return\"undefined\"!=typeof Reflect&&Reflect.get?t.exports=r=Reflect.get:t.exports=r=function(t,e,i){var r=n(t,e);if(r){var s=Object.getOwnPropertyDescriptor(r,e);return s.get?s.get.call(i):s.value}},r(e,i,s||e)}t.exports=r},function(t,e){t.exports=function(t){if(void 0===t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return t}},function(t,e,i){\"use strict\";function n(){}e.reflector=function(t){return t.then(n,n)}},function(t,e,i){\"use strict\";var n=i(1),r=n(i(0)),s=n(i(2)),o=n(i(5)),u=n(i(3)),a=n(i(4)),l=i(11),c=function(t){function e(){return(0,r.default)(this,e),(0,o.default)(this,(0,u.default)(e).apply(this,arguments))}return(0,a.default)(e,t),(0,s.default)(e,[{key:\"push\",value:function(t){var e=l.createNode(t);t.promise.catch(this._createTimeoutRejectionHandler(e)),this._list.insertEnd(e)}},{key:\"_createTimeoutRejectionHandler\",value:function(t){var e=this;return function(i){\"TimeoutError\"===i.name&&e._list.remove(t)}}}]),e}(i(6));t.exports=c},function(t,e,i){\"use strict\";var n=i(1),r=n(i(0)),s=n(i(2)),o=function(){function t(e,i){(0,r.default)(this,t),this._list=e,this._direction=!0===i?\"prev\":\"next\",this._startPosition=!0===i?\"tail\":\"head\",this._started=!1,this._cursor=null,this._done=!1}return(0,s.default)(t,[{key:\"_start\",value:function(){this._cursor=this._list[this._startPosition],this._started=!0}},{key:\"_advanceCursor\",value:function(){if(!1===this._started)return this._started=!0,void(this._cursor=this._list[this._startPosition]);this._cursor=this._cursor[this._direction]}},{key:\"reset\",value:function(){this._done=!1,this._started=!1,this._cursor=null}},{key:\"remove\",value:function(){if(!1===this._started||!0===this._done||this._isCursorDetached())return!1;this._list.remove(this._cursor)}},{key:\"next\",value:function(){return!0===this._done?{done:!0}:(this._advanceCursor(),null===this._cursor||this._isCursorDetached()?(this._done=!0,{done:!0}):{value:this._cursor,done:!1})}},{key:\"_isCursorDetached\",value:function(){return null===this._cursor.prev&&null===this._cursor.next&&this._list.tail!==this._cursor&&this._list.head!==this._cursor}}]),t}();t.exports=o},function(t,e,i){\"use strict\";t.exports={ALLOCATED:\"ALLOCATED\",IDLE:\"IDLE\",INVALID:\"INVALID\",RETURNING:\"RETURNING\",VALIDATION:\"VALIDATION\"}},function(t,e,i){\"use strict\";var n=i(1),r=n(i(0)),s=n(i(2)),o=i(18),u=function(){function t(e){(0,r.default)(this,t),this.creationTime=Date.now(),this.lastReturnTime=null,this.lastBorrowTime=null,this.lastIdleTime=null,this.obj=e,this.state=o.IDLE}return(0,s.default)(t,[{key:\"allocate\",value:function(){this.lastBorrowTime=Date.now(),this.state=o.ALLOCATED}},{key:\"deallocate\",value:function(){this.lastReturnTime=Date.now(),this.state=o.IDLE}},{key:\"invalidate\",value:function(){this.state=o.INVALID}},{key:\"test\",value:function(){this.state=o.VALIDATION}},{key:\"idle\",value:function(){this.lastIdleTime=Date.now(),this.state=o.IDLE}},{key:\"returning\",value:function(){this.state=o.RETURNING}}]),t}();t.exports=u},function(t,e,i){\"use strict\";var n=i(1),r=n(i(0)),s=n(i(2)),o=n(i(5)),u=n(i(3)),a=n(i(4)),l=function(t){function e(t,i){var n;return(0,r.default)(this,e),(n=(0,o.default)(this,(0,u.default)(e).call(this,i)))._creationTimestamp=Date.now(),n.pooledResource=t,n}return(0,a.default)(e,t),(0,s.default)(e,[{key:\"reject\",value:function(){}}]),e}(i(7));t.exports=l},function(t,e,i){var n=i(8);function r(e,i,s){return!function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}()?t.exports=r=function(t,e,i){var r=[null];r.push.apply(r,e);var s=new(Function.bind.apply(t,r));return i&&n(s,i.prototype),s}:t.exports=r=Reflect.construct,r.apply(null,arguments)}t.exports=r},function(t,e){t.exports=function(t){return-1!==Function.toString.call(t).indexOf(\"[native code]\")}},function(t,e,i){var n=i(3),r=i(8),s=i(22),o=i(21);function u(e){var i=\"function\"==typeof Map?new Map:void 0;return t.exports=u=function(t){if(null===t||!s(t))return t;if(\"function\"!=typeof t)throw new TypeError(\"Super expression must either be null or a function\");if(void 0!==i){if(i.has(t))return i.get(t);i.set(t,e)}function e(){return o(t,arguments,n(this).constructor)}return e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),r(e,t)},u(e)}t.exports=u},function(t,e,i){\"use strict\";var n=i(1),r=n(i(0)),s=n(i(5)),o=n(i(3)),u=n(i(14)),a=n(i(4)),l=function(t){function e(t){return(0,r.default)(this,e),(0,s.default)(this,(0,o.default)(e).call(this,t))}return(0,a.default)(e,t),e}(function(t){function e(t){var i;return(0,r.default)(this,e),(i=(0,s.default)(this,(0,o.default)(e).call(this,t))).name=i.constructor.name,i.message=t,\"function\"==typeof Error.captureStackTrace?Error.captureStackTrace((0,u.default)(i),i.constructor):i.stack=new Error(t).stack,i}return(0,a.default)(e,t),e}((0,n(i(23)).default)(Error)));t.exports={TimeoutError:l}},function(t,e,i){var n=i(3);t.exports=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=n(t)););return t}},function(t,e,i){\"use strict\";var n=i(1),r=n(i(0)),s=n(i(2)),o=n(i(5)),u=n(i(3)),a=n(i(13)),l=n(i(4)),c=i(7),h=i(24);var f=function(t){function e(t,i){var n;return(0,r.default)(this,e),(n=(0,o.default)(this,(0,u.default)(e).call(this,i)))._creationTimestamp=Date.now(),n._timeout=null,void 0!==t&&n.setTimeout(t),n}return(0,l.default)(e,t),(0,s.default)(e,[{key:\"setTimeout\",value:function(t){function e(e){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}(function(t){if(this._state===e.PENDING){var i=parseInt(t,10);if(isNaN(i)||i<=0)throw new Error(\"delay must be a positive int\");var n,r,s=Date.now()-this._creationTimestamp;this._timeout&&this.removeTimeout(),this._timeout=setTimeout((n=this._fireTimeout,r=this,function(){return n.apply(r,arguments)}),Math.max(i-s,0))}})},{key:\"removeTimeout\",value:function(){this._timeout&&clearTimeout(this._timeout),this._timeout=null}},{key:\"_fireTimeout\",value:function(){this.reject(new h.TimeoutError(\"ResourceRequest timed out\"))}},{key:\"reject\",value:function(t){this.removeTimeout(),(0,a.default)((0,u.default)(e.prototype),\"reject\",this).call(this,t)}},{key:\"resolve\",value:function(t){this.removeTimeout(),(0,a.default)((0,u.default)(e.prototype),\"resolve\",this).call(this,t)}}]),e}(c);t.exports=f},function(t,e,i){\"use strict\";var n=i(1)(i(0));t.exports=function t(){(0,n.default)(this,t),this.fifo=!0,this.priorityRange=1,this.testOnBorrow=!1,this.testOnReturn=!1,this.autostart=!0,this.evictionRunIntervalMillis=0,this.numTestsPerEvictionRun=3,this.softIdleTimeoutMillis=-1,this.idleTimeoutMillis=3e4,this.acquireTimeoutMillis=null,this.maxWaitingClients=null,this.min=null,this.max=null,this.Promise=Promise}},function(t,e,i){\"use strict\";var n=i(1)(i(0)),r=i(27);t.exports=function t(e){(0,n.default)(this,t);var i=new r;e=e||{},this.fifo=\"boolean\"==typeof e.fifo?e.fifo:i.fifo,this.priorityRange=e.priorityRange||i.priorityRange,this.testOnBorrow=\"boolean\"==typeof e.testOnBorrow?e.testOnBorrow:i.testOnBorrow,this.testOnReturn=\"boolean\"==typeof e.testOnReturn?e.testOnReturn:i.testOnReturn,this.autostart=\"boolean\"==typeof e.autostart?e.autostart:i.autostart,e.acquireTimeoutMillis&&(this.acquireTimeoutMillis=parseInt(e.acquireTimeoutMillis,10)),void 0!==e.maxWaitingClients&&(this.maxWaitingClients=parseInt(e.maxWaitingClients,10)),this.max=parseInt(e.max,10),this.min=parseInt(e.min,10),this.max=Math.max(isNaN(this.max)?1:this.max,1),this.min=Math.min(isNaN(this.min)?0:this.min,this.max),this.evictionRunIntervalMillis=e.evictionRunIntervalMillis||i.evictionRunIntervalMillis,this.numTestsPerEvictionRun=e.numTestsPerEvictionRun||i.numTestsPerEvictionRun,this.softIdleTimeoutMillis=e.softIdleTimeoutMillis||i.softIdleTimeoutMillis,this.idleTimeoutMillis=e.idleTimeoutMillis||i.idleTimeoutMillis,this.Promise=null!=e.Promise?e.Promise:i.Promise}},function(t,e,i){\"use strict\";t.exports=function(t){if(\"function\"!=typeof t.create)throw new TypeError(\"factory.create must be a function\");if(\"function\"!=typeof t.destroy)throw new TypeError(\"factory.destroy must be a function\");if(void 0!==t.validate&&\"function\"!=typeof t.validate)throw new TypeError(\"factory.validate must be a function\")}},function(t,e){function i(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(t){return\"function\"==typeof t}function r(t){return\"object\"==typeof t&&null!==t}function s(t){return void 0===t}t.exports=i,i.EventEmitter=i,i.prototype._events=void 0,i.prototype._maxListeners=void 0,i.defaultMaxListeners=10,i.prototype.setMaxListeners=function(t){if(\"number\"!=typeof t||t<0||isNaN(t))throw TypeError(\"n must be a positive number\");return this._maxListeners=t,this},i.prototype.emit=function(t){var e,i,o,u,a,l;if(this._events||(this._events={}),\"error\"===t&&(!this._events.error||r(this._events.error)&&!this._events.error.length)){if((e=arguments[1])instanceof Error)throw e;var c=new Error('Uncaught, unspecified \"error\" event. ('+e+\")\");throw c.context=e,c}if(s(i=this._events[t]))return!1;if(n(i))switch(arguments.length){case 1:i.call(this);break;case 2:i.call(this,arguments[1]);break;case 3:i.call(this,arguments[1],arguments[2]);break;default:u=Array.prototype.slice.call(arguments,1),i.apply(this,u)}else if(r(i))for(u=Array.prototype.slice.call(arguments,1),o=(l=i.slice()).length,a=0;a<o;a++)l[a].apply(this,u);return!0},i.prototype.addListener=function(t,e){var o;if(!n(e))throw TypeError(\"listener must be a function\");return this._events||(this._events={}),this._events.newListener&&this.emit(\"newListener\",t,n(e.listener)?e.listener:e),this._events[t]?r(this._events[t])?this._events[t].push(e):this._events[t]=[this._events[t],e]:this._events[t]=e,r(this._events[t])&&!this._events[t].warned&&(o=s(this._maxListeners)?i.defaultMaxListeners:this._maxListeners)&&o>0&&this._events[t].length>o&&(this._events[t].warned=!0,console.error(\"(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.\",this._events[t].length),\"function\"==typeof console.trace&&console.trace()),this},i.prototype.on=i.prototype.addListener,i.prototype.once=function(t,e){if(!n(e))throw TypeError(\"listener must be a function\");var i=!1;function r(){this.removeListener(t,r),i||(i=!0,e.apply(this,arguments))}return r.listener=e,this.on(t,r),this},i.prototype.removeListener=function(t,e){var i,s,o,u;if(!n(e))throw TypeError(\"listener must be a function\");if(!this._events||!this._events[t])return this;if(o=(i=this._events[t]).length,s=-1,i===e||n(i.listener)&&i.listener===e)delete this._events[t],this._events.removeListener&&this.emit(\"removeListener\",t,e);else if(r(i)){for(u=o;u-- >0;)if(i[u]===e||i[u].listener&&i[u].listener===e){s=u;break}if(s<0)return this;1===i.length?(i.length=0,delete this._events[t]):i.splice(s,1),this._events.removeListener&&this.emit(\"removeListener\",t,e)}return this},i.prototype.removeAllListeners=function(t){var e,i;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)\"removeListener\"!==e&&this.removeAllListeners(e);return this.removeAllListeners(\"removeListener\"),this._events={},this}if(n(i=this._events[t]))this.removeListener(t,i);else if(i)for(;i.length;)this.removeListener(t,i[i.length-1]);return delete this._events[t],this},i.prototype.listeners=function(t){return this._events&&this._events[t]?n(this._events[t])?[this._events[t]]:this._events[t].slice():[]},i.prototype.listenerCount=function(t){if(this._events){var e=this._events[t];if(n(e))return 1;if(e)return e.length}return 0},i.listenerCount=function(t,e){return t.listenerCount(e)}},function(t,e){function i(t){return(i=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t})(t)}function n(e){return\"function\"==typeof Symbol&&\"symbol\"===i(Symbol.iterator)?t.exports=n=function(t){return i(t)}:t.exports=n=function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":i(t)},n(e)}t.exports=n},function(t,e,i){\"use strict\";var n=i(1),r=n(i(0)),s=n(i(2)),o=n(i(5)),u=n(i(3)),a=n(i(4)),l=i(30).EventEmitter,c=i(29),h=i(28),f=i(26),v=i(20),_=i(19),d=(i(12),i(6),i(7)),p=(i(9),i(10),i(15).reflector),y=function(t){function e(t,i,n,s,a){var l;return(0,r.default)(this,e),l=(0,o.default)(this,(0,u.default)(e).call(this)),c(s),l._config=new h(a),l._Promise=l._config.Promise,l._factory=s,l._draining=!1,l._started=!1,l._waitingClientsQueue=new n(l._config.priorityRange),l._factoryCreateOperations=new Set,l._factoryDestroyOperations=new Set,l._availableObjects=new i,l._testOnBorrowResources=new Set,l._testOnReturnResources=new Set,l._validationOperations=new Set,l._allObjects=new Set,l._resourceLoans=new Map,l._evictionIterator=l._availableObjects.iterator(),l._evictor=new t,l._scheduledEviction=null,!0===l._config.autostart&&l.start(),l}return(0,a.default)(e,t),(0,s.default)(e,[{key:\"_destroy\",value:function(t){var e=this;t.invalidate(),this._allObjects.delete(t);var i=this._factory.destroy(t.obj),n=this._Promise.resolve(i);this._trackOperation(n,this._factoryDestroyOperations).catch(function(t){e.emit(\"factoryDestroyError\",t)}),this._ensureMinimum()}},{key:\"_testOnBorrow\",value:function(){var t=this;if(this._availableObjects.length<1)return!1;var e=this._availableObjects.shift();e.test(),this._testOnBorrowResources.add(e);var i=this._factory.validate(e.obj),n=this._Promise.resolve(i);return this._trackOperation(n,this._validationOperations).then(function(i){if(t._testOnBorrowResources.delete(e),!1===i)return e.invalidate(),t._destroy(e),void t._dispense();t._dispatchPooledResourceToNextWaitingClient(e)}),!0}},{key:\"_dispatchResource\",value:function(){if(this._availableObjects.length<1)return!1;var t=this._availableObjects.shift();return this._dispatchPooledResourceToNextWaitingClient(t),!1}},{key:\"_dispense\",value:function(){var t=this._waitingClientsQueue.length;if(!(t<1)){for(var e=t-this._potentiallyAllocableResourceCount,i=Math.min(this.spareResourceCapacity,e),n=0;i>n;n++)this._createResource();if(!0===this._config.testOnBorrow)for(var r=t-this._testOnBorrowResources.size,s=Math.min(this._availableObjects.length,r),o=0;s>o;o++)this._testOnBorrow();if(!1===this._config.testOnBorrow)for(var u=Math.min(this._availableObjects.length,t),a=0;u>a;a++)this._dispatchResource()}}},{key:\"_dispatchPooledResourceToNextWaitingClient\",value:function(t){var e=this._waitingClientsQueue.dequeue();if(void 0===e||e.state!==d.PENDING)return this._addPooledResourceToAvailableObjects(t),!1;var i=new v(t,this._Promise);return this._resourceLoans.set(t.obj,i),t.allocate(),e.resolve(t.obj),!0}},{key:\"_trackOperation\",value:function(t,e){var i=this;return e.add(t),t.then(function(n){return e.delete(t),i._Promise.resolve(n)},function(n){return e.delete(t),i._Promise.reject(n)})}},{key:\"_createResource\",value:function(){var t=this,e=this._factory.create(),i=this._Promise.resolve(e).then(function(e){var i=new _(e);t._allObjects.add(i),t._addPooledResourceToAvailableObjects(i)});this._trackOperation(i,this._factoryCreateOperations).then(function(){return t._dispense(),null}).catch(function(e){t.emit(\"factoryCreateError\",e),t._dispense()})}},{key:\"_ensureMinimum\",value:function(){if(!0!==this._draining)for(var t=this._config.min-this._count,e=0;e<t;e++)this._createResource()}},{key:\"_evict\",value:function(){for(var t=Math.min(this._config.numTestsPerEvictionRun,this._availableObjects.length),e={softIdleTimeoutMillis:this._config.softIdleTimeoutMillis,idleTimeoutMillis:this._config.idleTimeoutMillis,min:this._config.min},i=0;i<t;){var n=this._evictionIterator.next();if(!0===n.done&&this._availableObjects.length<1)return void this._evictionIterator.reset();if(!0===n.done&&this._availableObjects.length>0)this._evictionIterator.reset();else{var r=n.value;i++,!0===this._evictor.evict(e,r,this._availableObjects.length)&&(this._evictionIterator.remove(),this._destroy(r))}}}},{key:\"_scheduleEvictorRun\",value:function(){var t=this;this._config.evictionRunIntervalMillis>0&&(this._scheduledEviction=setTimeout(function(){t._evict(),t._scheduleEvictorRun()},this._config.evictionRunIntervalMillis))}},{key:\"_descheduleEvictorRun\",value:function(){this._scheduledEviction&&clearTimeout(this._scheduledEviction),this._scheduledEviction=null}},{key:\"start\",value:function(){!0!==this._draining&&!0!==this._started&&(this._started=!0,this._scheduleEvictorRun(),this._ensureMinimum())}},{key:\"acquire\",value:function(t){if(!1===this._started&&!1===this._config.autostart&&this.start(),this._draining)return this._Promise.reject(new Error(\"pool is draining and cannot accept work\"));if(this.spareResourceCapacity<1&&this._availableObjects.length<1&&void 0!==this._config.maxWaitingClients&&this._waitingClientsQueue.length>=this._config.maxWaitingClients)return this._Promise.reject(new Error(\"max waitingClients count exceeded\"));var e=new f(this._config.acquireTimeoutMillis,this._Promise);return this._waitingClientsQueue.enqueue(e,t),this._dispense(),e.promise}},{key:\"use\",value:function(t){var e=this;return this.acquire().then(function(i){return t(i).then(function(t){return e.release(i),t},function(t){throw e.destroy(i),t})})}},{key:\"isBorrowedResource\",value:function(t){return this._resourceLoans.has(t)}},{key:\"release\",value:function(t){var e=this._resourceLoans.get(t);if(void 0===e)return this._Promise.reject(new Error(\"Resource not currently part of this pool\"));this._resourceLoans.delete(t),e.resolve();var i=e.pooledResource;return i.deallocate(),this._addPooledResourceToAvailableObjects(i),this._dispense(),this._Promise.resolve()}},{key:\"destroy\",value:function(t){var e=this._resourceLoans.get(t);if(void 0===e)return this._Promise.reject(new Error(\"Resource not currently part of this pool\"));this._resourceLoans.delete(t),e.resolve();var i=e.pooledResource;return i.deallocate(),this._destroy(i),this._dispense(),this._Promise.resolve()}},{key:\"_addPooledResourceToAvailableObjects\",value:function(t){t.idle(),!0===this._config.fifo?this._availableObjects.push(t):this._availableObjects.unshift(t)}},{key:\"drain\",value:function(){var t=this;return this._draining=!0,this.__allResourceRequestsSettled().then(function(){return t.__allResourcesReturned()}).then(function(){t._descheduleEvictorRun()})}},{key:\"__allResourceRequestsSettled\",value:function(){return this._waitingClientsQueue.length>0?p(this._waitingClientsQueue.tail.promise):this._Promise.resolve()}},{key:\"__allResourcesReturned\",value:function(){var t=Array.from(this._resourceLoans.values()).map(function(t){return t.promise}).map(p);return this._Promise.all(t)}},{key:\"clear\",value:function(){var t=this,e=Array.from(this._factoryCreateOperations).map(p);return this._Promise.all(e).then(function(){var e=!0,i=!1,n=void 0;try{for(var r,s=t._availableObjects[Symbol.iterator]();!(e=(r=s.next()).done);e=!0){var o=r.value;t._destroy(o)}}catch(t){i=!0,n=t}finally{try{e||null==s.return||s.return()}finally{if(i)throw n}}var u=Array.from(t._factoryDestroyOperations).map(p);return p(t._Promise.all(u))})}},{key:\"_potentiallyAllocableResourceCount\",get:function(){return this._availableObjects.length+this._testOnBorrowResources.size+this._testOnReturnResources.size+this._factoryCreateOperations.size}},{key:\"_count\",get:function(){return this._allObjects.size+this._factoryCreateOperations.size}},{key:\"spareResourceCapacity\",get:function(){return this._config.max-(this._allObjects.size+this._factoryCreateOperations.size)}},{key:\"size\",get:function(){return this._count}},{key:\"available\",get:function(){return this._availableObjects.length}},{key:\"borrowed\",get:function(){return this._resourceLoans.size}},{key:\"pending\",get:function(){return this._waitingClientsQueue.length}},{key:\"max\",get:function(){return this._config.max}},{key:\"min\",get:function(){return this._config.min}}]),e}(l);t.exports=y},function(t,e,i){\"use strict\";var n=i(32),r=i(6),s=i(9),o=i(12);t.exports={Pool:n,Deque:r,PriorityQueue:s,DefaultEvictor:o,createPool:function(t,e){return new n(o,r,s,t,e)}}}])});","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @file Customized file from whatwg-fetch@2.0.3\n * Changes:\n * - CHANGE 1: We have disabled the blob support, because of it's buggy implementation.\n *   The files downloaded with this polyfill produce invalid paths on the webOS platform like\n *   `file:///media/developer/apps/usr/palm/applications/com.lg.app.signage/[object%20Blob]`.\n *   Similar problems are reported at the gitlab issues:\n *   [Don't use responseType = blob | safari fails](https://github.com/github/fetch/issues/481),\n *   [Make use of responseType=blob conditional](https://github.com/github/fetch/issues/490)\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n(function(self) {\n  'use strict';\n\n  if (self.fetch) {\n    return\n  }\n\n  var support = {\n    searchParams: 'URLSearchParams' in self,\n    iterable: 'Symbol' in self && 'iterator' in Symbol,\n    // CHANGE 1\n    // blob: 'FileReader' in self && 'Blob' in self && (function() {\n    //   try {\n    //     new Blob()\n    //     return true\n    //   } catch(e) {\n    //     return false\n    //   }\n    // })(),\n    // CHANGE 1\n    blob: false,\n    formData: 'FormData' in self,\n    arrayBuffer: 'ArrayBuffer' in self\n  }\n\n  if (support.arrayBuffer) {\n    var viewClasses = [\n      '[object Int8Array]',\n      '[object Uint8Array]',\n      '[object Uint8ClampedArray]',\n      '[object Int16Array]',\n      '[object Uint16Array]',\n      '[object Int32Array]',\n      '[object Uint32Array]',\n      '[object Float32Array]',\n      '[object Float64Array]'\n    ]\n\n    var isDataView = function(obj) {\n      return obj && DataView.prototype.isPrototypeOf(obj)\n    }\n\n    var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n      return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n    }\n  }\n\n  function normalizeName(name) {\n    if (typeof name !== 'string') {\n      name = String(name)\n    }\n    if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n      throw new TypeError('Invalid character in header field name')\n    }\n    return name.toLowerCase()\n  }\n\n  function normalizeValue(value) {\n    if (typeof value !== 'string') {\n      value = String(value)\n    }\n    return value\n  }\n\n  // Build a destructive iterator for the value list\n  function iteratorFor(items) {\n    var iterator = {\n      next: function() {\n        var value = items.shift()\n        return {done: value === undefined, value: value}\n      }\n    }\n\n    if (support.iterable) {\n      iterator[Symbol.iterator] = function() {\n        return iterator\n      }\n    }\n\n    return iterator\n  }\n\n  function Headers(headers) {\n    this.map = {}\n\n    if (headers instanceof Headers) {\n      headers.forEach(function(value, name) {\n        this.append(name, value)\n      }, this)\n    } else if (Array.isArray(headers)) {\n      headers.forEach(function(header) {\n        this.append(header[0], header[1])\n      }, this)\n    } else if (headers) {\n      Object.getOwnPropertyNames(headers).forEach(function(name) {\n        this.append(name, headers[name])\n      }, this)\n    }\n  }\n\n  Headers.prototype.append = function(name, value) {\n    name = normalizeName(name)\n    value = normalizeValue(value)\n    var oldValue = this.map[name]\n    this.map[name] = oldValue ? oldValue+','+value : value\n  }\n\n  Headers.prototype['delete'] = function(name) {\n    delete this.map[normalizeName(name)]\n  }\n\n  Headers.prototype.get = function(name) {\n    name = normalizeName(name)\n    return this.has(name) ? this.map[name] : null\n  }\n\n  Headers.prototype.has = function(name) {\n    return this.map.hasOwnProperty(normalizeName(name))\n  }\n\n  Headers.prototype.set = function(name, value) {\n    this.map[normalizeName(name)] = normalizeValue(value)\n  }\n\n  Headers.prototype.forEach = function(callback, thisArg) {\n    for (var name in this.map) {\n      if (this.map.hasOwnProperty(name)) {\n        callback.call(thisArg, this.map[name], name, this)\n      }\n    }\n  }\n\n  Headers.prototype.keys = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push(name) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.values = function() {\n    var items = []\n    this.forEach(function(value) { items.push(value) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.entries = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push([name, value]) })\n    return iteratorFor(items)\n  }\n\n  if (support.iterable) {\n    Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n  }\n\n  function consumed(body) {\n    if (body.bodyUsed) {\n      return Promise.reject(new TypeError('Already read'))\n    }\n    body.bodyUsed = true\n  }\n\n  function fileReaderReady(reader) {\n    return new Promise(function(resolve, reject) {\n      reader.onload = function() {\n        resolve(reader.result)\n      }\n      reader.onerror = function() {\n        reject(reader.error)\n      }\n    })\n  }\n\n  function readBlobAsArrayBuffer(blob) {\n    var reader = new FileReader()\n    var promise = fileReaderReady(reader)\n    reader.readAsArrayBuffer(blob)\n    return promise\n  }\n\n  function readBlobAsText(blob) {\n    var reader = new FileReader()\n    var promise = fileReaderReady(reader)\n    reader.readAsText(blob)\n    return promise\n  }\n\n  function readArrayBufferAsText(buf) {\n    var view = new Uint8Array(buf)\n    var chars = new Array(view.length)\n\n    for (var i = 0; i < view.length; i++) {\n      chars[i] = String.fromCharCode(view[i])\n    }\n    return chars.join('')\n  }\n\n  function bufferClone(buf) {\n    if (buf.slice) {\n      return buf.slice(0)\n    } else {\n      var view = new Uint8Array(buf.byteLength)\n      view.set(new Uint8Array(buf))\n      return view.buffer\n    }\n  }\n\n  function Body() {\n    this.bodyUsed = false\n\n    this._initBody = function(body) {\n      this._bodyInit = body\n      if (!body) {\n        this._bodyText = ''\n      } else if (typeof body === 'string') {\n        this._bodyText = body\n      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n        this._bodyBlob = body\n      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n        this._bodyFormData = body\n      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n        this._bodyText = body.toString()\n      } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n        this._bodyArrayBuffer = bufferClone(body.buffer)\n        // IE 10-11 can't handle a DataView body.\n        this._bodyInit = new Blob([this._bodyArrayBuffer])\n      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n        this._bodyArrayBuffer = bufferClone(body)\n      } else {\n        throw new Error('unsupported BodyInit type')\n      }\n\n      if (!this.headers.get('content-type')) {\n        if (typeof body === 'string') {\n          this.headers.set('content-type', 'text/plain;charset=UTF-8')\n        } else if (this._bodyBlob && this._bodyBlob.type) {\n          this.headers.set('content-type', this._bodyBlob.type)\n        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n        }\n      }\n    }\n\n    if (support.blob) {\n      this.blob = function() {\n        var rejected = consumed(this)\n        if (rejected) {\n          return rejected\n        }\n\n        if (this._bodyBlob) {\n          return Promise.resolve(this._bodyBlob)\n        } else if (this._bodyArrayBuffer) {\n          return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n        } else if (this._bodyFormData) {\n          throw new Error('could not read FormData body as blob')\n        } else {\n          return Promise.resolve(new Blob([this._bodyText]))\n        }\n      }\n\n      this.arrayBuffer = function() {\n        if (this._bodyArrayBuffer) {\n          return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n        } else {\n          return this.blob().then(readBlobAsArrayBuffer)\n        }\n      }\n    }\n\n    this.text = function() {\n      var rejected = consumed(this)\n      if (rejected) {\n        return rejected\n      }\n\n      if (this._bodyBlob) {\n        return readBlobAsText(this._bodyBlob)\n      } else if (this._bodyArrayBuffer) {\n        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n      } else if (this._bodyFormData) {\n        throw new Error('could not read FormData body as text')\n      } else {\n        return Promise.resolve(this._bodyText)\n      }\n    }\n\n    if (support.formData) {\n      this.formData = function() {\n        return this.text().then(decode)\n      }\n    }\n\n    this.json = function() {\n      return this.text().then(JSON.parse)\n    }\n\n    return this\n  }\n\n  // HTTP methods whose capitalization should be normalized\n  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n  function normalizeMethod(method) {\n    var upcased = method.toUpperCase()\n    return (methods.indexOf(upcased) > -1) ? upcased : method\n  }\n\n  function Request(input, options) {\n    options = options || {}\n    var body = options.body\n\n    if (input instanceof Request) {\n      if (input.bodyUsed) {\n        throw new TypeError('Already read')\n      }\n      this.url = input.url\n      this.credentials = input.credentials\n      if (!options.headers) {\n        this.headers = new Headers(input.headers)\n      }\n      this.method = input.method\n      this.mode = input.mode\n      if (!body && input._bodyInit != null) {\n        body = input._bodyInit\n        input.bodyUsed = true\n      }\n    } else {\n      this.url = String(input)\n    }\n\n    this.credentials = options.credentials || this.credentials || 'omit'\n    if (options.headers || !this.headers) {\n      this.headers = new Headers(options.headers)\n    }\n    this.method = normalizeMethod(options.method || this.method || 'GET')\n    this.mode = options.mode || this.mode || null\n    this.referrer = null\n\n    if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n      throw new TypeError('Body not allowed for GET or HEAD requests')\n    }\n    this._initBody(body)\n  }\n\n  Request.prototype.clone = function() {\n    return new Request(this, { body: this._bodyInit })\n  }\n\n  function decode(body) {\n    var form = new FormData()\n    body.trim().split('&').forEach(function(bytes) {\n      if (bytes) {\n        var split = bytes.split('=')\n        var name = split.shift().replace(/\\+/g, ' ')\n        var value = split.join('=').replace(/\\+/g, ' ')\n        form.append(decodeURIComponent(name), decodeURIComponent(value))\n      }\n    })\n    return form\n  }\n\n  function parseHeaders(rawHeaders) {\n    var headers = new Headers()\n    rawHeaders.split(/\\r?\\n/).forEach(function(line) {\n      var parts = line.split(':')\n      var key = parts.shift().trim()\n      if (key) {\n        var value = parts.join(':').trim()\n        headers.append(key, value)\n      }\n    })\n    return headers\n  }\n\n  Body.call(Request.prototype)\n\n  function Response(bodyInit, options) {\n    if (!options) {\n      options = {}\n    }\n\n    this.type = 'default'\n    this.status = 'status' in options ? options.status : 200\n    this.ok = this.status >= 200 && this.status < 300\n    this.statusText = 'statusText' in options ? options.statusText : 'OK'\n    this.headers = new Headers(options.headers)\n    this.url = options.url || ''\n    this._initBody(bodyInit)\n  }\n\n  Body.call(Response.prototype)\n\n  Response.prototype.clone = function() {\n    return new Response(this._bodyInit, {\n      status: this.status,\n      statusText: this.statusText,\n      headers: new Headers(this.headers),\n      url: this.url\n    })\n  }\n\n  Response.error = function() {\n    var response = new Response(null, {status: 0, statusText: ''})\n    response.type = 'error'\n    return response\n  }\n\n  var redirectStatuses = [301, 302, 303, 307, 308]\n\n  Response.redirect = function(url, status) {\n    if (redirectStatuses.indexOf(status) === -1) {\n      throw new RangeError('Invalid status code')\n    }\n\n    return new Response(null, {status: status, headers: {location: url}})\n  }\n\n  self.Headers = Headers\n  self.Request = Request\n  self.Response = Response\n\n  self.fetch = function(input, init) {\n    return new Promise(function(resolve, reject) {\n      var request = new Request(input, init)\n      var xhr = new XMLHttpRequest()\n\n      xhr.onload = function() {\n        var options = {\n          status: xhr.status,\n          statusText: xhr.statusText,\n          headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n        }\n        options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n        var body = 'response' in xhr ? xhr.response : xhr.responseText\n        resolve(new Response(body, options))\n      }\n\n      xhr.onerror = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.ontimeout = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.open(request.method, request.url, true)\n\n      if (request.credentials === 'include') {\n        xhr.withCredentials = true\n      }\n\n      if ('responseType' in xhr && support.blob) {\n        xhr.responseType = 'blob'\n      }\n\n      request.headers.forEach(function(value, name) {\n        xhr.setRequestHeader(name, value)\n      })\n\n      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n    })\n  }\n  self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport Platform from './platform';\n\n// TODO Mohlo by se odstranit opakovÃ¡nÃ­ napÅ™Ã­Ä� rÅ¯znÃ½mi prostÅ™edÃ­mi (multi-platformnÃ­ kÃ³d).\n// - /util.js parsePlatform.\n// - Budou asi hlavnÄ› problÃ©my s importy.\n/**\n * Utility pro prÃ¡ci s Ä�Ã­selnÃ­kem platforem.\n */\nclass PlatformUtil {\n  /**\n   * Vygeneruje textovou reprezentaci platformy.\n   * @param {Platform|null} value Platforma z Ä�Ã­selnÃ­ku.\n   * @returns {string|null} Platforma jako text.\n   * @static\n   */\n  static generate (value) {\n    switch (value) {\n      case Platform.KiwiLighter1:\n        return 'kiwi-lighter-1';\n      case Platform.TizenSssp4:\n        return 'tizen-sssp-4';\n      case Platform.TizenSssp5:\n        return 'tizen-sssp-5';\n      case Platform.TizenSssp6:\n        return 'tizen-sssp-6';\n      case Platform.Web:\n        return 'web';\n      case Platform.WebosSignage3_0:\n        return 'webos-signage-3.0';\n      case Platform.WebosSignage3_2:\n        return 'webos-signage-3.2';\n      case Platform.WebosSignage4_0:\n        return 'webos-signage-4.0';\n      case Platform.WebosSignage4_1:\n        return 'webos-signage-4.1';\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * NaÄ�te platformu z textovÃ©ho Å™etÄ›zce.\n   * @param {string|null} value Platforma jako text.\n   * @returns {Platform|null} Platforma z Ä�Ã­selnÃ­ku.\n   * @static\n   */\n  static parse (value) {\n    switch (value) {\n      case 'kiwi-lighter-1':\n        return Platform.KiwiLighter1;\n      case 'tizen-sssp-4':\n        return Platform.TizenSssp4;\n      case 'tizen-sssp-5':\n        return Platform.TizenSssp5;\n      case 'tizen-sssp-6':\n        return Platform.TizenSssp6;\n      case 'web':\n        return Platform.Web;\n      case 'webos-signage-3.0':\n        return Platform.WebosSignage3_0;\n      case 'webos-signage-3.2':\n        return Platform.WebosSignage3_2;\n      case 'webos-signage-4.0':\n        return Platform.WebosSignage4_0;\n      case 'webos-signage-4.1':\n        return Platform.WebosSignage4_1;\n      default:\n        return null;\n    }\n  }\n}\n\nexport default PlatformUtil;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k vÅ¡ech podporovanÃ½ch platforem.\n * Platforma pÅ™edstavuje prostÅ™edÃ­, ve kterÃ©m se aplikace spouÅ¡tÃ­.\n * Platforma urÄ�uje dostupnÃ© funkcionality, kterÃ½ch mÅ¯Å¾e aplikace vyuÅ¾Ã­t.\n * @enum {string}\n */\nconst Platform = {\n  /** Platforma Ki-Wi Lighter API. */\n  KiwiLighter1: 'KiwiLighter1',\n  /** Platforma Samsung Smart Signage Platform ve verzi 4. */\n  TizenSssp4: 'TizenSssp4',\n  /** Platforma Samsung Smart Signage Platform ve verzi 5. */\n  TizenSssp5: 'TizenSssp5',\n  /** Platforma Samsung Smart Signage Platform ve verzi 6. */\n  TizenSssp6: 'TizenSssp6',\n  /** Platforma standardnÃ­ch webovÃ½ch technologiÃ­. */\n  Web: 'Web',\n  /** Platforma LG webOS Smart Signage Platform ve verzi 3.0. */\n  WebosSignage3_0: 'WebosSignage3_0',\n  /** Platforma LG webOS Smart Signage Platform ve verzi 3.2. */\n  WebosSignage3_2: 'WebosSignage3_2',\n  /** Platforma LG webOS Smart Signage Platform ve verzi 4.0. */\n  WebosSignage4_0: 'WebosSignage4_0',\n  /** Platforma LG webOS Smart Signage Platform ve verzi 4.1. */\n  WebosSignage4_1: 'WebosSignage4_1'\n};\n\nexport default Platform;\n","module.exports = \"<viewer-root\\n  v-if=\\\"viewerVisible\\\"\\n  v-on:entered=\\\"onViewerEntered\\\"\\n  v-on:error=\\\"onError\\\"\\n></viewer-root>\\n<setup-root\\n  v-else-if=\\\"setupVisible\\\"\\n  v-on:finish=\\\"onSetupFinish\\\"\\n></setup-root>\\n\";","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ControlButton from '../core/control/control-button';\nimport SetupRoot from '../core/setup/setup-root';\nimport ViewerRoot from '../core/viewer/root/viewer-root';\nimport template from './player-root.html';\n\nexport default {\n  name: 'PlayerRoot',\n  template,\n  components: {SetupRoot, ViewerRoot},\n  created () {\n    // PÅ™Ã­znak, Å¾e se mÃ¡ po dokonÄ�enÃ­ zobrazenÃ­ dalÅ¡Ã­ho slajdu odeslat report.\n    this.reportEnabled = true;\n    // ZpoÅ¾dÄ›nÃ­, kvÅ¯li pomalÃ©mu vykreslovÃ¡nÃ­. Hodnota urÄ�ena experimentÃ¡lnÄ› na emulÃ¡toru.\n    // TODO #84 PÅ™idat do konfigurace, nebo lÃ©pe oÅ¡etÅ™it.\n    this.reportDelay = 250;\n    // ÄŒasovaÄ� zpoÅ¾dÄ›nÃ­. ZÃ¡roveÅˆ slouÅ¾Ã­ k zablokovÃ¡nÃ­ paralelnÃ­ho odeslÃ¡nÃ­ reportÅ¯.\n    this.reportTimeout = null;\n    // NaslouchÃ¡nÃ­ udÃ¡lostem.\n    const {controlManager, device} = this.$root;\n    controlManager.on('buttonDown', this.onButtonDown);\n    device.on('content', this.onContent);\n    // Aktualizace, jakÃ½ modul zobrazovat.\n    this.refresh();\n  },\n  data () {\n    return {\n      setupVisible: false,\n      viewerVisible: false\n    };\n  },\n  destroyed () {\n    // ZruÅ¡enÃ­ naslouchÃ¡nÃ­ udÃ¡lostem.\n    const {controlManager, device} = this.$root;\n    controlManager.off('buttonDown', this.onButtonDown);\n    device.off('content', this.onContent);\n    // ZruÅ¡enÃ­ Ä�asovaÄ�Å¯.\n    clearTimeout(this.reportTimeout);\n  },\n  methods: {\n    back () {\n      if (this.setupVisible) {\n        // Setup spravuje tlaÄ�Ã­tko zpÄ›t samostatnÄ›.\n        return;\n      }\n      this.$root.appManager.exit();\n    },\n    handleError (error) {\n      this.$root.logger.error(error);\n    },\n    onButtonDown (controlButton) {\n      if (controlButton === ControlButton.Back) {\n        this.back();\n      }\n    },\n    onContent () {\n      // NovÃ½ obsah, odblokovÃ¡nÃ­ odesÃ­lÃ¡nÃ­ obsahu na prvnÃ­m slajdu.\n      this.reportEnabled = true;\n    },\n    onError (error) {\n      this.handleError(error);\n    },\n    onSetupFinish () {\n      this.refresh();\n    },\n    onViewerEntered () {\n      this.report();\n    },\n    refresh () {\n      const installed = this.$root.session.isInstalled();\n      this.setupVisible = !installed;\n      this.viewerVisible = installed;\n    },\n    report () {\n      // Report informacÃ­ o zaÅ™Ã­zenÃ­ se odesÃ­lÃ¡ pouze u prvnÃ­ho slajdu a neduplikuje se.\n      if (this.reportEnabled && !this.reportTimeout) {\n        // PoÄ�kÃ¡ se na vykreslenÃ­ DOM.\n        this.$nextTick()\n        .then(() => {\n          // KvÅ¯li pomalÃ©mu vykreslovÃ¡nÃ­ se pÅ™idÃ¡ krÃ¡tkÃ© zpoÅ¾dÄ›nÃ­.\n          // TODO #84 Hotfix zpoÅ¾dÄ›nÃ­ pÅ™i HW reportu.\n          this.reportTimeout = setTimeout(\n            () => {\n              // OdblokovÃ¡nÃ­ spuÅ¡tÄ›nÃ­ se zpoÅ¾dÄ›nÃ­m.\n              this.reportTimeout = null;\n              // OdeslÃ¡nÃ­ reportu.\n              this.$root.device.report()\n              .catch((error) => this.handleError(error));\n            },\n            this.reportDelay\n          );\n        })\n        .catch((error) => this.handleError(error));\n      }\n      // ZablokovÃ¡nÃ­ odesÃ­lÃ¡nÃ­ obsahu na jinÃ©m neÅ¾ prvnÃ­m slajdu.\n      this.reportEnabled = false;\n    }\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport PlayerRoot from './player-root';\n\n/**\n * Player aplikace.\n */\nclass Player {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {AppManager} appManager\n   * @param {ControlManager} controlManager SprÃ¡vce ovlÃ¡dÃ¡nÃ­.\n   * @param {Device} device ZaÅ™Ã­zenÃ­.\n   * @param {FocusManager} focusManager\n   * @param {Logger} logger ZaznamenÃ¡vaÄ� chyb.\n   * @param {NetworkListener} networkListener\n   * @param {ScreenManager} screenManager SprÃ¡vce obrazovky.\n   * @param {Session} session SezenÃ­ s nastavenÃ­m zaÅ™Ã­zenÃ­.\n   * @param {SetupManager} setupManager SluÅ¾ba pro registraci zaÅ™Ã­zenÃ­.\n   * @param {VirtualKeyboardManager} virtualKeyboardManager\n   * @param {VueFactory} vueFactory\n   * @returns {Player} NovÃ¡ instance.\n   */\n  constructor (\n    appManager, controlManager, device, focusManager, logger, networkListener,\n    screenManager, session, setupManager, virtualKeyboardManager, vueFactory\n  ) {\n    this.appManager = appManager;\n    this.controlManager = controlManager;\n    this.device = device;\n    this.focusManager = focusManager;\n    this.logger = logger;\n    this.networkListener = networkListener;\n    this.screenManager = screenManager;\n    this.session = session;\n    this.setupManager = setupManager;\n    this.virtualKeyboardManager = virtualKeyboardManager;\n    this.vueFactory = vueFactory;\n  }\n\n  /**\n   * VytvoÅ™Ã­ novou instanci Vue.\n   * @param {HTMLElement|null|string} el DOM element pro pÅ™ipnutÃ­ Vue.\n   * @private\n   * @returns {Promise.<Vue>} VytvoÅ™enÃ¡ a do DOM vloÅ¾enÃ¡ Vue instance.\n   */\n  createVue (el) {\n    return new Promise((resolve) => {\n      const self = this;\n      this.vueFactory.create({\n        components: {PlayerRoot},\n        el,\n        template: '<PlayerRoot/>',\n        // Private scope for non-reactive data and methods\n        // https://github.com/vuejs/vue/issues/1988#issuecomment-163013818\n        created () {\n          // TODO PÅ™edÃ¡vat zde celou instanci BottleJs, mÃ­sto zbyteÄ�nÃ©ho vÃ½Ä�tu?\n          this.appManager = self.appManager;\n          this.controlManager = self.controlManager;\n          this.device = self.device;\n          this.focusManager = self.focusManager;\n          this.logger = self.logger;\n          this.networkListener = self.networkListener;\n          this.screenManager = self.screenManager;\n          this.session = self.session;\n          this.setupManager = self.setupManager;\n          this.virtualKeyboardManager = self.virtualKeyboardManager;\n        },\n        mounted: resolve\n      });\n    });\n  }\n\n  /**\n   * SpustÃ­ player aplikaci.\n   * @param {HTMLElement|null|string} el DOM element pro pÅ™ipnutÃ­ aplikace.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po pÅ™idÃ¡nÃ­ spuÅ¡tÄ›nÃ© aplikace do DOM.\n   */\n  start (el) {\n    return new Promise((resolve) => resolve(\n      // Nejprve se pÅ™ipravÃ­ zaÅ™Ã­zenÃ­.\n      this.device.start()\n      // AÅ¾ potÃ© se zaÄ�ne vykreslovat GUI.\n      .then(() => this.createVue(el))\n    ));\n  }\n}\n\nexport default Player;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport Promise from 'es6-promise';\n\n// Polyfill pro ECMAScript.\nimport 'core-js/features/array';\nimport 'core-js/features/map';\nimport 'core-js/features/number';\nimport 'core-js/features/object';\nimport 'core-js/features/set';\nimport 'core-js/features/string';\nimport 'geometry-polyfill';\n// Zde je pouÅ¾itÃ½ modifikovanÃ½ whatwg-fetch.\n// Na webOS emulÃ¡toru fetch selÅ¾e, kvÅ¯li problÃ©mÅ¯m s Blob a FileReader.\n// MoÅ¾nÃ¡ je problÃ©m i v zabezpeÄ�enÃ­.\n// Å˜eÅ¡enÃ­m je deaktivovat \"support.blob\", coÅ¾ ale plugin z vnÄ›jÅ¡ku nepodporuje.\nimport 'whatwg-fetch';\n\n// PouÅ¾Ã­vÃ¡ odliÅ¡nÃ½ polyfill pro Promise.\n// Core.js polyfill mÃ¡ totiÅ¾ problÃ©my v kombinaci s fetch.\n// VÃ­ce informacÃ­ v issue #194.\nif (!('Promise' in window)) {\n  window.Promise = Promise;\n} else if (!('finally' in window.Promise.prototype)) {\n  window.Promise.prototype.finally = Promise.prototype.finally;\n}\n"],"sourceRoot":""}/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__webpack_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__webpack_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __webpack_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__webpack_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ({

/***/ "./node_modules/@babel/runtime/helpers/classCallCheck.js":
/*!***************************************************************!*\
  !*** ./node_modules/@babel/runtime/helpers/classCallCheck.js ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

function _classCallCheck(instance, Constructor) {
  if (!(instance instanceof Constructor)) {
    throw new TypeError("Cannot call a class as a function");
  }
}

module.exports = _classCallCheck;

/***/ }),

/***/ "./node_modules/@babel/runtime/helpers/createClass.js":
/*!************************************************************!*\
  !*** ./node_modules/@babel/runtime/helpers/createClass.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

function _defineProperties(target, props) {
  for (var i = 0; i < props.length; i++) {
    var descriptor = props[i];
    descriptor.enumerable = descriptor.enumerable || false;
    descriptor.configurable = true;
    if ("value" in descriptor) descriptor.writable = true;
    Object.defineProperty(target, descriptor.key, descriptor);
  }
}

function _createClass(Constructor, protoProps, staticProps) {
  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
  if (staticProps) _defineProperties(Constructor, staticProps);
  return Constructor;
}

module.exports = _createClass;

/***/ }),

/***/ "./node_modules/bottlejs/dist/bottle.js":
/*!**********************************************!*\
  !*** ./node_modules/bottlejs/dist/bottle.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;;(function(undefined) {
    'use strict';
    /**
     * BottleJS v1.7.1 - 2018-05-03
     * A powerful dependency injection micro container
     *
     * Copyright (c) 2018 Stephen Young
     * Licensed MIT
     */
    var Bottle;
    
    /**
     * String constants
     */
    var DELIMITER = '.';
    var FUNCTION_TYPE = 'function';
    var STRING_TYPE = 'string';
    var GLOBAL_NAME = '__global__';
    var PROVIDER_SUFFIX = 'Provider';
    
    /**
     * Unique id counter;
     *
     * @type Number
     */
    var id = 0;
    
    /**
     * Local slice alias
     *
     * @type Functions
     */
    var slice = Array.prototype.slice;
    
    /**
     * Iterator used to walk down a nested object.
     *
     * If Bottle.config.strict is true, this method will throw an exception if it encounters an
     * undefined path
     *
     * @param Object obj
     * @param String prop
     * @return mixed
     * @throws Error if Bottle is unable to resolve the requested service.
     */
    var getNested = function getNested(obj, prop) {
        var service = obj[prop];
        if (service === undefined && Bottle.config.strict) {
            throw new Error('Bottle was unable to resolve a service.  `' + prop + '` is undefined.');
        }
        return service;
    };
    
    /**
     * Get a nested bottle. Will set and return if not set.
     *
     * @param String name
     * @return Bottle
     */
    var getNestedBottle = function getNestedBottle(name) {
        var bottle;
        if (!this.nested[name]) {
            bottle = Bottle.pop();
            this.nested[name] = bottle;
            this.factory(name, function SubProviderFactory() {
                return bottle.container;
            });
        }
        return this.nested[name];
    };
    
    /**
     * Get a service stored under a nested key
     *
     * @param String fullname
     * @return Service
     */
    var getNestedService = function getNestedService(fullname) {
        return fullname.split(DELIMITER).reduce(getNested, this);
    };
    
    /**
     * Function used by provider to set up middleware for each request.
     *
     * @param Number id
     * @param String name
     * @param Object instance
     * @param Object container
     * @return void
     */
    var applyMiddleware = function applyMiddleware(middleware, name, instance, container) {
        var descriptor = {
            configurable : true,
            enumerable : true
        };
        if (middleware.length) {
            descriptor.get = function getWithMiddlewear() {
                var index = 0;
                var next = function nextMiddleware(err) {
                    if (err) {
                        throw err;
                    }
                    if (middleware[index]) {
                        middleware[index++](instance, next);
                    }
                };
                next();
                return instance;
            };
        } else {
            descriptor.value = instance;
            descriptor.writable = true;
        }
    
        Object.defineProperty(container, name, descriptor);
    
        return container[name];
    };
    
    /**
     * Register middleware.
     *
     * @param String name
     * @param Function func
     * @return Bottle
     */
    var middleware = function middleware(fullname, func) {
        var parts, name;
        if (typeof fullname === FUNCTION_TYPE) {
            func = fullname;
            fullname = GLOBAL_NAME;
        }
    
        parts = fullname.split(DELIMITER);
        name = parts.shift();
        if (parts.length) {
            getNestedBottle.call(this, name).middleware(parts.join(DELIMITER), func);
        } else {
            if (!this.middlewares[name]) {
                this.middlewares[name] = [];
            }
            this.middlewares[name].push(func);
        }
        return this;
    };
    
    /**
     * Used to process decorators in the provider
     *
     * @param Object instance
     * @param Function func
     * @return Mixed
     */
    var reducer = function reducer(instance, func) {
        return func(instance);
    };
    
    
    /**
     * Get decorators and middleware including globals
     *
     * @return array
     */
    var getWithGlobal = function getWithGlobal(collection, name) {
        return (collection[name] || []).concat(collection.__global__ || []);
    };
    
    
    /**
     * Create the provider properties on the container
     *
     * @param String name
     * @param Function Provider
     * @return Bottle
     */
    var createProvider = function createProvider(name, Provider) {
        var providerName, properties, container, id, decorators, middlewares;
    
        id = this.id;
        container = this.container;
        decorators = this.decorators;
        middlewares = this.middlewares;
        providerName = name + PROVIDER_SUFFIX;
    
        properties = Object.create(null);
        properties[providerName] = {
            configurable : true,
            enumerable : true,
            get : function getProvider() {
                var instance = new Provider();
                delete container[providerName];
                container[providerName] = instance;
                return instance;
            }
        };
    
        properties[name] = {
            configurable : true,
            enumerable : true,
            get : function getService() {
                var provider = container[providerName];
                var instance;
                if (provider) {
                    // filter through decorators
                    instance = getWithGlobal(decorators, name).reduce(reducer, provider.$get(container));
    
                    delete container[providerName];
                    delete container[name];
                }
                return instance === undefined ? instance : applyMiddleware(getWithGlobal(middlewares, name),
                    name, instance, container);
            }
        };
    
        Object.defineProperties(container, properties);
        return this;
    };
    
    
    /**
     * Register a provider.
     *
     * @param String fullname
     * @param Function Provider
     * @return Bottle
     */
    var provider = function provider(fullname, Provider) {
        var parts, name;
        parts = fullname.split(DELIMITER);
        if (this.providerMap[fullname] && parts.length === 1 && !this.container[fullname + PROVIDER_SUFFIX]) {
            return console.error(fullname + ' provider already instantiated.');
        }
        this.originalProviders[fullname] = Provider;
        this.providerMap[fullname] = true;
    
        name = parts.shift();
    
        if (parts.length) {
            getNestedBottle.call(this, name).provider(parts.join(DELIMITER), Provider);
            return this;
        }
        return createProvider.call(this, name, Provider);
    };
    
    /**
     * Register a factory inside a generic provider.
     *
     * @param String name
     * @param Function Factory
     * @return Bottle
     */
    var factory = function factory(name, Factory) {
        return provider.call(this, name, function GenericProvider() {
            this.$get = Factory;
        });
    };
    
    /**
     * Private helper for creating service and service factories.
     *
     * @param String name
     * @param Function Service
     * @return Bottle
     */
    var createService = function createService(name, Service, isClass) {
        var deps = arguments.length > 3 ? slice.call(arguments, 3) : [];
        var bottle = this;
        return factory.call(this, name, function GenericFactory() {
            var serviceFactory = Service; // alias for jshint
            var args = deps.map(getNestedService, bottle.container);
    
            if (!isClass) {
                return serviceFactory.apply(null, args);
            }
            return new (Service.bind.apply(Service, [null].concat(args)))();
        });
    };
    
    /**
     * Register a class service
     *
     * @param String name
     * @param Function Service
     * @return Bottle
     */
    var service = function service(name, Service) {
        return createService.apply(this, [name, Service, true].concat(slice.call(arguments, 2)));
    };
    
    /**
     * Register a function service
     */
    var serviceFactory = function serviceFactory(name, factoryService) {
        return createService.apply(this, [name, factoryService, false].concat(slice.call(arguments, 2)));
    };
    
    /**
     * Define a mutable property on the container.
     *
     * @param String name
     * @param mixed val
     * @return void
     * @scope container
     */
    var defineValue = function defineValue(name, val) {
        Object.defineProperty(this, name, {
            configurable : true,
            enumerable : true,
            value : val,
            writable : true
        });
    };
    
    /**
     * Iterator for setting a plain object literal via defineValue
     *
     * @param Object container
     * @param string name
     */
    var setValueObject = function setValueObject(container, name) {
        var nestedContainer = container[name];
        if (!nestedContainer) {
            nestedContainer = {};
            defineValue.call(container, name, nestedContainer);
        }
        return nestedContainer;
    };
    
    
    /**
     * Register a value
     *
     * @param String name
     * @param mixed val
     * @return Bottle
     */
    var value = function value(name, val) {
        var parts;
        parts = name.split(DELIMITER);
        name = parts.pop();
        defineValue.call(parts.reduce(setValueObject, this.container), name, val);
        return this;
    };
    
    /**
     * Define an enumerable, non-configurable, non-writable value.
     *
     * @param String name
     * @param mixed value
     * @return undefined
     */
    var defineConstant = function defineConstant(name, value) {
        Object.defineProperty(this, name, {
            configurable : false,
            enumerable : true,
            value : value,
            writable : false
        });
    };
    
    /**
     * Register a constant
     *
     * @param String name
     * @param mixed value
     * @return Bottle
     */
    var constant = function constant(name, value) {
        var parts = name.split(DELIMITER);
        name = parts.pop();
        defineConstant.call(parts.reduce(setValueObject, this.container), name, value);
        return this;
    };
    
    /**
     * Register decorator.
     *
     * @param String fullname
     * @param Function func
     * @return Bottle
     */
    var decorator = function decorator(fullname, func) {
        var parts, name;
        if (typeof fullname === FUNCTION_TYPE) {
            func = fullname;
            fullname = GLOBAL_NAME;
        }
    
        parts = fullname.split(DELIMITER);
        name = parts.shift();
        if (parts.length) {
            getNestedBottle.call(this, name).decorator(parts.join(DELIMITER), func);
        } else {
            if (!this.decorators[name]) {
                this.decorators[name] = [];
            }
            this.decorators[name].push(func);
        }
        return this;
    };
    
    /**
     * Register a function that will be executed when Bottle#resolve is called.
     *
     * @param Function func
     * @return Bottle
     */
    var defer = function defer(func) {
        this.deferred.push(func);
        return this;
    };
    
    
    /**
     * Immediately instantiates the provided list of services and returns them.
     *
     * @param Array services
     * @return Array Array of instances (in the order they were provided)
     */
    var digest = function digest(services) {
        return (services || []).map(getNestedService, this.container);
    };
    
    /**
     * Register an instance factory inside a generic factory.
     *
     * @param {String} name - The name of the service
     * @param {Function} Factory - The factory function, matches the signature required for the
     * `factory` method
     * @return Bottle
     */
    var instanceFactory = function instanceFactory(name, Factory) {
        return factory.call(this, name, function GenericInstanceFactory(container) {
            return {
                instance : Factory.bind(Factory, container)
            };
        });
    };
    
    /**
     * A filter function for removing bottle container methods and providers from a list of keys
     */
    var byMethod = function byMethod(name) {
        return !/^\$(?:decorator|register|list)$|Provider$/.test(name);
    };
    
    /**
     * List the services registered on the container.
     *
     * @param Object container
     * @return Array
     */
    var list = function list(container) {
        return Object.keys(container || this.container || {}).filter(byMethod);
    };
    
    /**
     * Named bottle instances
     *
     * @type Object
     */
    var bottles = {};
    
    /**
     * Get an instance of bottle.
     *
     * If a name is provided the instance will be stored in a local hash.  Calling Bottle.pop multiple
     * times with the same name will return the same instance.
     *
     * @param String name
     * @return Bottle
     */
    var pop = function pop(name) {
        var instance;
        if (typeof name === STRING_TYPE) {
            instance = bottles[name];
            if (!instance) {
                bottles[name] = instance = new Bottle();
                instance.constant('BOTTLE_NAME', name);
            }
            return instance;
        }
        return new Bottle();
    };
    
    /**
     * Clear all named bottles.
     */
    var clear = function clear(name) {
        if (typeof name === STRING_TYPE) {
            delete bottles[name];
        } else {
            bottles = {};
        }
    };
    
    /**
     * Register a service, factory, provider, or value based on properties on the object.
     *
     * properties:
     *  * Obj.$name   String required ex: `'Thing'`
     *  * Obj.$type   String optional 'service', 'factory', 'provider', 'value'.  Default: 'service'
     *  * Obj.$inject Mixed  optional only useful with $type 'service' name or array of names
     *  * Obj.$value  Mixed  optional Normally Obj is registered on the container.  However, if this
     *                       property is included, it's value will be registered on the container
     *                       instead of the object itsself.  Useful for registering objects on the
     *                       bottle container without modifying those objects with bottle specific keys.
     *
     * @param Function Obj
     * @return Bottle
     */
    var register = function register(Obj) {
        var value = Obj.$value === undefined ? Obj : Obj.$value;
        return this[Obj.$type || 'service'].apply(this, [Obj.$name, value].concat(Obj.$inject || []));
    };
    
    /**
     * Deletes providers from the map and container.
     *
     * @param String name
     * @return void
     */
    var removeProviderMap = function resetProvider(name) {
        delete this.providerMap[name];
        delete this.container[name];
        delete this.container[name + PROVIDER_SUFFIX];
    };
    
    /**
     * Resets providers on a bottle instance. If 'names' array is provided, only the named providers will be reset.
     *
     * @param Array names
     * @return void
     */
    var resetProviders = function resetProviders(names) {
        var tempProviders = this.originalProviders;
        var shouldFilter = Array.isArray(names);
    
        Object.keys(this.originalProviders).forEach(function resetProvider(originalProviderName) {
            if (shouldFilter && names.indexOf(originalProviderName) === -1) {
                return;
            }
            var parts = originalProviderName.split(DELIMITER);
            if (parts.length > 1) {
                parts.forEach(removeProviderMap, getNestedBottle.call(this, parts[0]));
            }
            removeProviderMap.call(this, originalProviderName);
            this.provider(originalProviderName, tempProviders[originalProviderName]);
        }, this);
    };
    
    
    /**
     * Execute any deferred functions
     *
     * @param Mixed data
     * @return Bottle
     */
    var resolve = function resolve(data) {
        this.deferred.forEach(function deferredIterator(func) {
            func(data);
        });
    
        return this;
    };
    
    
    /**
     * Bottle constructor
     *
     * @param String name Optional name for functional construction
     */
    Bottle = function Bottle(name) {
        if (!(this instanceof Bottle)) {
            return Bottle.pop(name);
        }
    
        this.id = id++;
    
        this.decorators = {};
        this.middlewares = {};
        this.nested = {};
        this.providerMap = {};
        this.originalProviders = {};
        this.deferred = [];
        this.container = {
            $decorator : decorator.bind(this),
            $register : register.bind(this),
            $list : list.bind(this)
        };
    };
    
    /**
     * Bottle prototype
     */
    Bottle.prototype = {
        constant : constant,
        decorator : decorator,
        defer : defer,
        digest : digest,
        factory : factory,
        instanceFactory: instanceFactory,
        list : list,
        middleware : middleware,
        provider : provider,
        resetProviders : resetProviders,
        register : register,
        resolve : resolve,
        service : service,
        serviceFactory : serviceFactory,
        value : value
    };
    
    /**
     * Bottle static
     */
    Bottle.pop = pop;
    Bottle.clear = clear;
    Bottle.list = list;
    
    /**
     * Global config
     */
    Bottle.config = {
        strict : false
    };
    
    /**
     * Exports script adapted from lodash v2.4.1 Modern Build
     *
     * @see http://lodash.com/
     */
    
    /**
     * Valid object type map
     *
     * @type Object
     */
    var objectTypes = {
        'function' : true,
        'object' : true
    };
    
    (function exportBottle(root) {
    
        /**
         * Free variable exports
         *
         * @type Function
         */
        var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
    
        /**
         * Free variable module
         *
         * @type Object
         */
        var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
    
        /**
         * CommonJS module.exports
         *
         * @type Function
         */
        var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;
    
        /**
         * Free variable `global`
         *
         * @type Object
         */
        var freeGlobal = objectTypes[typeof global] && global;
        if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {
            root = freeGlobal;
        }
    
        /**
         * Export
         */
        if ("function" === FUNCTION_TYPE && typeof __webpack_require__(/*! !webpack amd options */ "./node_modules/webpack/buildin/amd-options.js") === 'object' && __webpack_require__(/*! !webpack amd options */ "./node_modules/webpack/buildin/amd-options.js")) {
            root.Bottle = Bottle;
            !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { return Bottle; }).call(exports, __webpack_require__, exports, module),
				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
        } else if (freeExports && freeModule) {
            if (moduleExports) {
                (freeModule.exports = Bottle).Bottle = Bottle;
            } else {
                freeExports.Bottle = Bottle;
            }
        } else {
            root.Bottle = Bottle;
        }
    }((objectTypes[typeof window] && window) || this));
    
}.call(this));
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module), __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))

/***/ }),

/***/ "./node_modules/lodash/noop.js":
/*!*************************************!*\
  !*** ./node_modules/lodash/noop.js ***!
  \*************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/**
 * This method returns `undefined`.
 *
 * @static
 * @memberOf _
 * @since 2.3.0
 * @category Util
 * @example
 *
 * _.times(2, _.noop);
 * // => [undefined, undefined]
 */
function noop() {
  // No operation performed.
}

module.exports = noop;


/***/ }),

/***/ "./node_modules/penpal/lib/connectCallReceiver.js":
/*!********************************************************!*\
  !*** ./node_modules/penpal/lib/connectCallReceiver.js ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _constants = __webpack_require__(/*! ./constants */ "./node_modules/penpal/lib/constants.js");

var _errorSerialization = __webpack_require__(/*! ./errorSerialization */ "./node_modules/penpal/lib/errorSerialization.js");
/**
 * Listens for "call" messages coming from the remote, executes the corresponding method, and
 * responds with the return value.
 * @param {Object} info Information about the local and remote windows.
 * @param {Object} methods The keys are the names of the methods that can be called by the remote
 * while the values are the method functions.
 * @param {Promise} destructionPromise A promise resolved when destroy() is called on the penpal
 * connection.
 * @returns {Function} A function that may be called to disconnect the receiver.
 */


var _default = function _default(info, methods, log) {
  var localName = info.localName,
      local = info.local,
      remote = info.remote,
      originForSending = info.originForSending,
      originForReceiving = info.originForReceiving;
  var destroyed = false;
  log("".concat(localName, ": Connecting call receiver"));

  var handleMessageEvent = function handleMessageEvent(event) {
    if (event.source !== remote || event.data.penpal !== _constants.CALL) {
      return;
    }

    if (event.origin !== originForReceiving) {
      log("".concat(localName, " received message from origin ").concat(event.origin, " which did not match expected origin ").concat(originForReceiving));
      return;
    }

    var _event$data = event.data,
        methodName = _event$data.methodName,
        args = _event$data.args,
        id = _event$data.id;
    log("".concat(localName, ": Received ").concat(methodName, "() call"));

    var createPromiseHandler = function createPromiseHandler(resolution) {
      return function (returnValue) {
        log("".concat(localName, ": Sending ").concat(methodName, "() reply"));

        if (destroyed) {
          // It's possible to throw an error here, but it would need to be thrown asynchronously
          // and would only be catchable using window.onerror. This is because the consumer
          // is merely returning a value from their method and not calling any function
          // that they could wrap in a try-catch. Even if the consumer were to catch the error,
          // the value of doing so is questionable. Instead, we'll just log a message.
          log("".concat(localName, ": Unable to send ").concat(methodName, "() reply due to destroyed connection"));
          return;
        }

        var message = {
          penpal: _constants.REPLY,
          id: id,
          resolution: resolution,
          returnValue: returnValue
        };

        if (resolution === _constants.REJECTED && returnValue instanceof Error) {
          message.returnValue = (0, _errorSerialization.serializeError)(returnValue);
          message.returnValueIsError = true;
        }

        try {
          remote.postMessage(message, originForSending);
        } catch (err) {
          // If a consumer attempts to send an object that's not cloneable (e.g., window),
          // we want to ensure the receiver's promise gets rejected.
          if (err.name === _constants.DATA_CLONE_ERROR) {
            remote.postMessage({
              penpal: _constants.REPLY,
              id: id,
              resolution: _constants.REJECTED,
              returnValue: (0, _errorSerialization.serializeError)(err),
              returnValueIsError: true
            }, originForSending);
          }

          throw err;
        }
      };
    };

    new Promise(function (resolve) {
      return resolve(methods[methodName].apply(methods, args));
    }).then(createPromiseHandler(_constants.FULFILLED), createPromiseHandler(_constants.REJECTED));
  };

  local.addEventListener(_constants.MESSAGE, handleMessageEvent);
  return function () {
    destroyed = true;
    local.removeEventListener(_constants.MESSAGE, handleMessageEvent);
  };
};

exports.default = _default;
module.exports = exports.default;

/***/ }),

/***/ "./node_modules/penpal/lib/connectCallSender.js":
/*!******************************************************!*\
  !*** ./node_modules/penpal/lib/connectCallSender.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _constants = __webpack_require__(/*! ./constants */ "./node_modules/penpal/lib/constants.js");

var _errorCodes = __webpack_require__(/*! ./errorCodes */ "./node_modules/penpal/lib/errorCodes.js");

var _generateId = _interopRequireDefault(__webpack_require__(/*! ./generateId */ "./node_modules/penpal/lib/generateId.js"));

var _errorSerialization = __webpack_require__(/*! ./errorSerialization */ "./node_modules/penpal/lib/errorSerialization.js");

function _interopRequireDefault(obj) {
  return obj && obj.__esModule ? obj : {
    default: obj
  };
}
/**
 * Augments an object with methods that match those defined by the remote. When these methods are
 * called, a "call" message will be sent to the remote, the remote's corresponding method will be
 * executed, and the method's return value will be returned via a message.
 * @param {Object} callSender Sender object that should be augmented with methods.
 * @param {Object} info Information about the local and remote windows.
 * @param {Array} methodNames Names of methods available to be called on the remote.
 * @param {Promise} destructionPromise A promise resolved when destroy() is called on the penpal
 * connection.
 * @returns {Object} The call sender object with methods that may be called.
 */


var _default = function _default(callSender, info, methodNames, destroyConnection, log) {
  var localName = info.localName,
      local = info.local,
      remote = info.remote,
      originForSending = info.originForSending,
      originForReceiving = info.originForReceiving;
  var destroyed = false;
  log("".concat(localName, ": Connecting call sender"));

  var createMethodProxy = function createMethodProxy(methodName) {
    return function () {
      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
        args[_key] = arguments[_key];
      }

      log("".concat(localName, ": Sending ").concat(methodName, "() call")); // This handles the case where the iframe has been removed from the DOM
      // (and therefore its window closed), the consumer has not yet
      // called destroy(), and the user calls a method exposed by
      // the remote. We detect the iframe has been removed and force
      // a destroy() immediately so that the consumer sees the error saying
      // the connection has been destroyed. We wrap this check in a try catch
      // because Edge throws an "Object expected" error when accessing
      // contentWindow.closed on a contentWindow from an iframe that's been
      // removed from the DOM.

      var iframeRemoved;

      try {
        if (remote.closed) {
          iframeRemoved = true;
        }
      } catch (e) {
        iframeRemoved = true;
      }

      if (iframeRemoved) {
        destroyConnection();
      }

      if (destroyed) {
        var error = new Error("Unable to send ".concat(methodName, "() call due ") + "to destroyed connection");
        error.code = _errorCodes.ERR_CONNECTION_DESTROYED;
        throw error;
      }

      return new Promise(function (resolve, reject) {
        var id = (0, _generateId.default)();

        var handleMessageEvent = function handleMessageEvent(event) {
          if (event.source !== remote || event.data.penpal !== _constants.REPLY || event.data.id !== id) {
            return;
          }

          if (event.origin !== originForReceiving) {
            log("".concat(localName, " received message from origin ").concat(event.origin, " which did not match expected origin ").concat(originForReceiving));
            return;
          }

          log("".concat(localName, ": Received ").concat(methodName, "() reply"));
          local.removeEventListener(_constants.MESSAGE, handleMessageEvent);
          var returnValue = event.data.returnValue;

          if (event.data.returnValueIsError) {
            returnValue = (0, _errorSerialization.deserializeError)(returnValue);
          }

          (event.data.resolution === _constants.FULFILLED ? resolve : reject)(returnValue);
        };

        local.addEventListener(_constants.MESSAGE, handleMessageEvent);
        remote.postMessage({
          penpal: _constants.CALL,
          id: id,
          methodName: methodName,
          args: args
        }, originForSending);
      });
    };
  };

  methodNames.reduce(function (api, methodName) {
    api[methodName] = createMethodProxy(methodName);
    return api;
  }, callSender);
  return function () {
    destroyed = true;
  };
};

exports.default = _default;
module.exports = exports.default;

/***/ }),

/***/ "./node_modules/penpal/lib/connectToParent.js":
/*!****************************************************!*\
  !*** ./node_modules/penpal/lib/connectToParent.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _constants = __webpack_require__(/*! ./constants */ "./node_modules/penpal/lib/constants.js");

var _errorCodes = __webpack_require__(/*! ./errorCodes */ "./node_modules/penpal/lib/errorCodes.js");

var _createDestructor2 = _interopRequireDefault(__webpack_require__(/*! ./createDestructor */ "./node_modules/penpal/lib/createDestructor.js"));

var _connectCallReceiver = _interopRequireDefault(__webpack_require__(/*! ./connectCallReceiver */ "./node_modules/penpal/lib/connectCallReceiver.js"));

var _connectCallSender = _interopRequireDefault(__webpack_require__(/*! ./connectCallSender */ "./node_modules/penpal/lib/connectCallSender.js"));

var _createLogger = _interopRequireDefault(__webpack_require__(/*! ./createLogger */ "./node_modules/penpal/lib/createLogger.js"));

function _interopRequireDefault(obj) {
  return obj && obj.__esModule ? obj : {
    default: obj
  };
}
/**
 * @typedef {Object} Parent
 * @property {Promise} promise A promise which will be resolved once a connection has
 * been established.
 * @property {Function} destroy A method that, when called, will disconnect any
 * messaging channels. You may call this even before a connection has been established.
 */

/**
 * Attempts to establish communication with the parent window.
 * @param {Object} options
 * @param {string} [options.parentOrigin=*] Valid parent origin used to restrict communication.
 * @param {Object} [options.methods={}] Methods that may be called by the parent window.
 * @param {Number} [options.timeout] The amount of time, in milliseconds, Penpal should wait
 * for the parent to respond before rejecting the connection promise.
 * @return {Parent}
 */


var _default = function _default() {
  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
      _ref$parentOrigin = _ref.parentOrigin,
      parentOrigin = _ref$parentOrigin === void 0 ? '*' : _ref$parentOrigin,
      _ref$methods = _ref.methods,
      methods = _ref$methods === void 0 ? {} : _ref$methods,
      timeout = _ref.timeout,
      debug = _ref.debug;

  var log = (0, _createLogger.default)(debug);

  if (window === window.top) {
    var error = new Error('connectToParent() must be called within an iframe');
    error.code = _errorCodes.ERR_NOT_IN_IFRAME;
    throw error;
  }

  var _createDestructor = (0, _createDestructor2.default)(),
      destroy = _createDestructor.destroy,
      onDestroy = _createDestructor.onDestroy;

  var child = window;
  var parent = child.parent;
  var promise = new Promise(function (resolveConnectionPromise, reject) {
    var connectionTimeoutId;

    if (timeout !== undefined) {
      connectionTimeoutId = setTimeout(function () {
        var error = new Error("Connection to parent timed out after ".concat(timeout, "ms"));
        error.code = _errorCodes.ERR_CONNECTION_TIMEOUT;
        reject(error);
        destroy();
      }, timeout);
    }

    var handleMessageEvent = function handleMessageEvent(event) {
      // Under niche scenarios, we get into this function after
      // the iframe has been removed from the DOM. In Edge, this
      // results in "Object expected" errors being thrown when we
      // try to access properties on window (global properties).
      // For this reason, we try to access a global up front (clearTimeout)
      // and if it fails we can assume the iframe has been removed
      // and we ignore the message event.
      try {
        clearTimeout();
      } catch (e) {
        return;
      }

      if (event.source !== parent || event.data.penpal !== _constants.HANDSHAKE_REPLY) {
        return;
      }

      if (parentOrigin !== '*' && parentOrigin !== event.origin) {
        log("Child received handshake reply from origin ".concat(event.origin, " which did not match expected origin ").concat(parentOrigin));
        return;
      }

      log('Child: Received handshake reply');
      child.removeEventListener(_constants.MESSAGE, handleMessageEvent);
      var info = {
        localName: 'Child',
        local: child,
        remote: parent,
        originForSending: event.origin === 'null' ? '*' : event.origin,
        originForReceiving: event.origin
      };
      var callSender = {};
      var destroyCallReceiver = (0, _connectCallReceiver.default)(info, methods, log);
      onDestroy(destroyCallReceiver);
      var destroyCallSender = (0, _connectCallSender.default)(callSender, info, event.data.methodNames, destroy, log);
      onDestroy(destroyCallSender);
      clearTimeout(connectionTimeoutId);
      resolveConnectionPromise(callSender);
    };

    child.addEventListener(_constants.MESSAGE, handleMessageEvent);
    onDestroy(function () {
      child.removeEventListener(_constants.MESSAGE, handleMessageEvent);
      var error = new Error('Connection destroyed');
      error.code = _errorCodes.ERR_CONNECTION_DESTROYED;
      reject(error);
    });
    log('Child: Sending handshake');
    parent.postMessage({
      penpal: _constants.HANDSHAKE,
      methodNames: Object.keys(methods)
    }, parentOrigin);
  });
  return {
    promise: promise,
    destroy: destroy
  };
};

exports.default = _default;
module.exports = exports.default;

/***/ }),

/***/ "./node_modules/penpal/lib/constants.js":
/*!**********************************************!*\
  !*** ./node_modules/penpal/lib/constants.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.DATA_CLONE_ERROR = exports.MESSAGE = exports.REJECTED = exports.FULFILLED = exports.REPLY = exports.CALL = exports.HANDSHAKE_REPLY = exports.HANDSHAKE = void 0;
var HANDSHAKE = 'handshake';
exports.HANDSHAKE = HANDSHAKE;
var HANDSHAKE_REPLY = 'handshake-reply';
exports.HANDSHAKE_REPLY = HANDSHAKE_REPLY;
var CALL = 'call';
exports.CALL = CALL;
var REPLY = 'reply';
exports.REPLY = REPLY;
var FULFILLED = 'fulfilled';
exports.FULFILLED = FULFILLED;
var REJECTED = 'rejected';
exports.REJECTED = REJECTED;
var MESSAGE = 'message';
exports.MESSAGE = MESSAGE;
var DATA_CLONE_ERROR = 'DataCloneError';
exports.DATA_CLONE_ERROR = DATA_CLONE_ERROR;

/***/ }),

/***/ "./node_modules/penpal/lib/createDestructor.js":
/*!*****************************************************!*\
  !*** ./node_modules/penpal/lib/createDestructor.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _default = function _default() {
  var callbacks = [];
  var destroyed = false;
  return {
    destroy: function destroy() {
      destroyed = true;
      callbacks.forEach(function (callback) {
        callback();
      });
    },
    onDestroy: function onDestroy(callback) {
      destroyed ? callback() : callbacks.push(callback);
    }
  };
};

exports.default = _default;
module.exports = exports.default;

/***/ }),

/***/ "./node_modules/penpal/lib/createLogger.js":
/*!*************************************************!*\
  !*** ./node_modules/penpal/lib/createLogger.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _default = function _default(debug) {
  return function () {
    if (debug) {
      var _console;

      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
        args[_key] = arguments[_key];
      }

      (_console = console).log.apply(_console, ['[Penpal]'].concat(args)); // eslint-disable-line no-console

    }
  };
};

exports.default = _default;
module.exports = exports.default;

/***/ }),

/***/ "./node_modules/penpal/lib/errorCodes.js":
/*!***********************************************!*\
  !*** ./node_modules/penpal/lib/errorCodes.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ERR_NO_IFRAME_SRC = exports.ERR_NOT_IN_IFRAME = exports.ERR_CONNECTION_TIMEOUT = exports.ERR_CONNECTION_DESTROYED = void 0;
var ERR_CONNECTION_DESTROYED = 'ConnectionDestroyed';
exports.ERR_CONNECTION_DESTROYED = ERR_CONNECTION_DESTROYED;
var ERR_CONNECTION_TIMEOUT = 'ConnectionTimeout';
exports.ERR_CONNECTION_TIMEOUT = ERR_CONNECTION_TIMEOUT;
var ERR_NOT_IN_IFRAME = 'NotInIframe';
exports.ERR_NOT_IN_IFRAME = ERR_NOT_IN_IFRAME;
var ERR_NO_IFRAME_SRC = 'NoIframeSrc';
exports.ERR_NO_IFRAME_SRC = ERR_NO_IFRAME_SRC;

/***/ }),

/***/ "./node_modules/penpal/lib/errorSerialization.js":
/*!*******************************************************!*\
  !*** ./node_modules/penpal/lib/errorSerialization.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.deserializeError = exports.serializeError = void 0;
/**
 * Converts an error object into a plain object.
 * @param {Error} Error object.
 * @returns {Object}
 */

var serializeError = function serializeError(_ref) {
  var name = _ref.name,
      message = _ref.message,
      stack = _ref.stack;
  return {
    name: name,
    message: message,
    stack: stack
  };
};
/**
 * Converts a plain object into an error object.
 * @param {Object} Object with error properties.
 * @returns {Error}
 */


exports.serializeError = serializeError;

var deserializeError = function deserializeError(obj) {
  var deserializedError = new Error();
  Object.keys(obj).forEach(function (key) {
    return deserializedError[key] = obj[key];
  });
  return deserializedError;
};

exports.deserializeError = deserializeError;

/***/ }),

/***/ "./node_modules/penpal/lib/generateId.js":
/*!***********************************************!*\
  !*** ./node_modules/penpal/lib/generateId.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var id = 0;
/**
 * @return {number} A unique ID (not universally unique)
 */

var _default = function _default() {
  return ++id;
};

exports.default = _default;
module.exports = exports.default;

/***/ }),

/***/ "./node_modules/webpack/buildin/amd-options.js":
/*!****************************************!*\
  !*** (webpack)/buildin/amd-options.js ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */
module.exports = __webpack_amd_options__;

/* WEBPACK VAR INJECTION */}.call(this, {}))

/***/ }),

/***/ "./node_modules/webpack/buildin/global.js":
/*!***********************************!*\
  !*** (webpack)/buildin/global.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

var g;

// This works in non-strict mode
g = (function() {
	return this;
})();

try {
	// This works if eval is allowed (see CSP)
	g = g || Function("return this")() || (1, eval)("this");
} catch (e) {
	// This works if the window reference is available
	if (typeof window === "object") g = window;
}

// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}

module.exports = g;


/***/ }),

/***/ "./node_modules/webpack/buildin/module.js":
/*!***********************************!*\
  !*** (webpack)/buildin/module.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

module.exports = function(module) {
	if (!module.webpackPolyfill) {
		module.deprecate = function() {};
		module.paths = [];
		// module.parent = undefined by default
		if (!module.children) module.children = [];
		Object.defineProperty(module, "loaded", {
			enumerable: true,
			get: function() {
				return module.l;
			}
		});
		Object.defineProperty(module, "id", {
			enumerable: true,
			get: function() {
				return module.i;
			}
		});
		module.webpackPolyfill = 1;
	}
	return module;
};


/***/ }),

/***/ "./src/config.js":
/*!***********************!*\
  !*** ./src/config.js ***!
  \***********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _core_error_error_level__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/error/error-level */ "./src/core/error/error-level.js");
/* harmony import */ var _core_orientation_orientation_enum__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/orientation/orientation-enum */ "./src/core/orientation/orientation-enum.js");
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */


/* harmony default export */ __webpack_exports__["default"] = ({
  // IdentifikÃ¡tor aplikace.
  name: 'player-lighter',
  // VÃ½chozÃ­ hodnota deaktivace preventivnÃ­ restartu.
  // Pokud je "true", ostatnÃ­ preventivnÃ­ restart se neprovÃ¡nÃ­
  // a ostatnÃ­ nastavenÃ­ se ignorujÃ­.
  // PouÅ¾ije se v pÅ™Ã­padÄ›, Å¾e toto nastavenÃ­ nenÃ­ vyplnÄ›no na serveru.
  autorebootDefaultDisabled: false,
  // VÃ½chozÃ­ interval, ve kterÃ©m se zaÅ™Ã­zenÃ­ preventivnÄ› restartuje. [ms]
  // PouÅ¾ije se v pÅ™Ã­padÄ›, Å¾e toto nastavenÃ­ nenÃ­ vyplnÄ›no na serveru.
  autorebootDefaultInterval: 48 * 60 * 60 * 1000,
  // MinimÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na automatickÃ½ restart zaÅ™Ã­zenÃ­.
  // PÅ™Ã­liÅ¡ nÃ­zkÃ¡ hodnota mÅ¯Å¾e zpÅ¯sobit zacyklenÃ­ zaÅ™Ã­zenÃ­ v nekoneÄ�nÃ©
  // smyÄ�ce restrartÅ¯.
  // PÅ™Ã­liÅ¡ vysokÃ¡ hodnota znesnadnÃ­ E2E testy dlouhÃ½m Ä�ekÃ¡nÃ­m.
  autorebootMinInterval: 15 * 60 * 1000,
  // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na Cordova deviceready. [ms]
  // Hodnota pochÃ¡zÃ­ z Cordova implementace, kterÃ¡ provÃ¡dÃ­ vlastnÃ­ kontrolu
  // a vÃ½pis do konzole.
  cordovaBootDelay: 5 * 1000,
  // ZaÅ™Ã­zenÃ­.
  device: {
    // StahovaÄ� souborÅ¯.
    downloader: {
      // VÃ½chozÃ­ velikost souboru, pro kterou se mÃ¡ uvolnit mÃ­sto. [B]
      defaultSize: 1024 * 1024 * 1024
    },
    // KomunikÃ¡tor se serverem.
    communicator: {
      // VÃ½chozÃ­ doba Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem o synchronizaci. [ms]
      syncDelayBase: 60 * 1000 // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem o synchronizaci po neÃºspÄ›chu. [ms]
      // TODO #5 ZatÃ­m deaktivovÃ¡no. Zpracovat dle novÃ© logiky.
      // syncDelayMax: 4 * 60 * 1000,
      // NÃ¡sobitel doby Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem pÅ™i neÃºspÄ›chu.
      // TODO #5 ZatÃ­m deaktivovÃ¡no. Zpracovat dle novÃ© logiky.
      // syncDelayMultiplier: 2

    },
    // Orientace zaÅ™Ã­zenÃ­.
    orientation: {
      // VÃ½chozÃ­ orientace zaÅ™Ã­zenÃ­.
      defaultOrientationEnum: _core_orientation_orientation_enum__WEBPACK_IMPORTED_MODULE_1__["default"].CLOCKWISE_0
    },
    // SezenÃ­ - rÅ¯znÃ© konfigurace zaÅ™Ã­zenÃ­.
    session: {
      // IdentifikÃ¡tor session, kterÃ¡ se naÄ�te pÅ™i startu aplikace.
      defaultId: 'default'
    }
  },
  // Port, na kterÃ©m je spuÅ¡tÄ›nÃ½ localhost HTTP server se souborovÃ½m systÃ©mem.
  fileSystemLocalhostPort: 7587,
  // Firmware zaÅ™Ã­zenÃ­.
  firmware: {
    // VÃ½chozÃ­ velikost firmware, pro kterou se mÃ¡ uvolnit mÃ­sto. [B]
    defaultSize: 1024 * 1024 * 1024
  },
  // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na naÄ�tenÃ­ iframe. [ms]
  htmlIframeLoadDelay: 60 * 1000,
  // MaximÃ¡lnÃ­ poÄ�et plÃ¡novÃ¡nÃ­ opakovanÃ½ch udÃ¡lostÃ­, kterÃ½ je nutnÃ½
  // pro prevenci zacyklenÃ­ a zkrÃ¡cenÃ­ doby vÃ½poÄ�tu v kalendÃ¡Å™i.
  // Omezuje se poÄ�et opakovÃ¡nÃ­, nikoliv doba, po kterou se opakovÃ¡nÃ­ provÃ¡dÃ­.
  // NejmenÅ¡Ã­ interval opakovÃ¡nÃ­ je jeden den, z Ä�ehoÅ¾ lze pÅ™i vÃ½poÄ�tu vychÃ¡zet.
  // OstatnÃ­ druh opakovÃ¡nÃ­ (tÃ½dennÃ­, ...) se budou opakovat po delÅ¡Ã­ dobu.
  // TaktÃ©Å¾ opakovÃ¡nÃ­ ve vÄ›tÅ¡Ã­m intervalu (2 dny, ...) nebudou tolik omezenÃ©.
  // VÃ½chozÃ­ hodnotou IcalExpander je 1000 opakovÃ¡nÃ­, tedy cca. 3 roky.
  // Na serveru je kalendÃ¡Å™ v rozsahu +-5 let od aktuÃ¡lnÃ­ho data
  // tzn. rozsah 10 let, coÅ¾ je v nejhorÅ¡Ã­m pÅ™Ã­padÄ› 10 * 365 opakovÃ¡nÃ­.
  icalPlannerMaxIterations: 5 * 365,
  // Rozsah verzÃ­ Ki-Wi Lighter API se kterÃ½mi je aplikace kompatibilnÃ­.
  // Je zaloÅ¾eno na semver specifikaci a lze vyuÅ¾Ã­t jejÃ­ syntaxi.
  // Typicky se pouÅ¾Ã­vÃ¡ syntaxe '^1.3.7', coÅ¾ znamenÃ¡ "kompatibilnÃ­ s 1.3.7"
  // a pÅ™esnÄ› to odpovÃ­dÃ¡ rozsahu verzÃ­ >=1.3.7 a <2.0.0.
  kiwiLighterApiVersion: '0.11.*',
  // MaximÃ¡lnÃ­ doba, na kterou je moÅ¾nÃ© nastavit Ä�asovaÄ�.
  // Hodnota odpovÃ­dÃ¡ maximu pro 32 bitovÃ½ integer a vychÃ¡zÃ­ z implementace,
  // kterou pouÅ¾Ã­vÃ¡ vÄ›tÅ¡ina rozÅ¡Ã­Å™enÃ½ch prohlÃ­Å¾eÄ�Å¯.
  longTimersMaxDelay: Math.pow(2, 31) - 1,
  // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na navÃ¡zÃ¡nÃ­ komunikace s PDF prohlÃ­Å¾eÄ�em. [ms]
  pdfConnectionTimeout: 5 * 1000,
  // PoÄ�et strÃ¡nek PDF dokumentu, kterÃ© se pÅ™ehrajÃ­ za jednu vteÅ™inu. [Hz]
  // Na zÃ¡kladÄ› tÃ©to hodnoty se urÄ�uje vÃ½chozÃ­ rychlost pÅ™ehrÃ¡vÃ¡nÃ­ PDF dokumentu.
  pdfPageRate: 0.1,
  // MaximÃ¡lnÃ­ poÄ�et souÄ�asnÄ› zobrazovanÃ½ch PDF.
  pdfSourceMax: 3,
  // PlatformnÄ› specifickÃ¡ nastavenÃ­.
  platform: {
    tizenSssp4: {
      // MinimÃ¡lnÃ­ poÄ�et sekund od zaÄ�Ã¡tku epochy, po kterÃ©m se aplikace mÅ¯Å¾e spustit. [s]
      booterClockLimit: new Date(2000, 0).getTime(),
      // Interval, ve kterÃ©m se kontroluje, jestli je jiÅ¾ prostÅ™edÃ­ pÅ™ipraveno
      // pro start aplikace. [ms]
      // SouvisÃ­ s Tizen bugem, kdy nÄ›kdy nenÃ­ dostupnÃ½ aktuÃ¡lnÃ­ Ä�as (viz #230).
      booterRetryDelay: 500,
      // Prodleva pÅ™ed synchronizacÃ­ globÃ¡lnÃ­ch a B2B hodin. [ms]
      // Televize Samsung obsahujÃ­ dvoje hodiny -- jedny globÃ¡lnÃ­, ke kterÃ½m se
      // pÅ™istupuje pomocÃ­ standardnÃ­ho JavaScriptovÃ©ho API (`Date` apod.), druhÃ©
      // v rÃ¡mci B2B API. Tyto dva zdroje nejsou synchronizovanÃ© a B2B hodiny se
      // navÃ­c pÅ™i provozu samovolnÄ› zpoÅ¾Ä�ujÃ­. ÄŒasovaÄ�e zapnutÃ­ a vypnutÃ­ se Å™Ã­dÃ­
      // prÃ¡vÄ› B2B hodinami, proto je naÅ¡Ã­m niternÃ½m zÃ¡jmem, aby byly bÄ›hem provozu
      // aktuÃ¡lnÃ­ a co nejmÃ©nÄ› pozadu.
      clockSyncInterval: 24 * 60 * 60 * 1000
    }
  },
  // ÃšroveÅˆ dÅ¯leÅ¾itosti chyby, od kterÃ© se zaÄ�Ã­najÃ­ odesÃ­lat udÃ¡losti na Sentry.
  // Chyby s niÅ¾Å¡Ã­ prioritou jsou zalogovÃ¡ny jako breadcrumbs a jsou odeslÃ¡ny
  // pouze jako dodateÄ�nÃ¡ informace k nÄ›jakÃ© budoucÃ­ chybÄ›, kterÃ¡ bude mÃ­t
  // stejnou nebo vyÅ¡Å¡Ã­ prioritu, neÅ¾ je zde stanovenÃ¡ ÃºroveÅˆ.
  sentryCaptureErrorLevel: _core_error_error_level__WEBPACK_IMPORTED_MODULE_0__["default"].Error,
  // MaximÃ¡lnÃ­ poÄ�et perzistentnÄ› uloÅ¾enÃ½ch vÃ½jimek v offline stavu.
  // Je nutnÃ© nastavit na nÃ­zkou hodnotu, jinak hrozÃ­ zaplnÄ›nÃ­ localStorage.
  sentryMaxEvents: 5,
  // Setup Wizard pro instalaci zaÅ™Ã­zenÃ­.
  setup: {
    // Doba mezi pokusy o automatickou registraci na zÃ¡kladÄ› otisku. [ms]
    automaticDelay: 60 * 1000,
    // VÃ½chozÃ­ hodnota formulÃ¡Å™ovÃ©ho pole s nÃ¡zvem zaÅ™Ã­zenÃ­.
    deviceName: '',
    // VÃ½chozÃ­ doba Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem pÅ™i neÃºspÄ›chu. [ms]
    failureDelayBase: 60 * 1000,
    // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem po neÃºspÄ›chu. [ms]
    failureDelayMax: 4 * 60 * 1000,
    // NÃ¡sobitel doby Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem pÅ™i neÃºspÄ›chu.
    failureDelayMultiplier: 2,
    // VÃ½chozÃ­ hodnota formulÃ¡Å™ovÃ©ho pole s heslem uÅ¾ivatele.
    password: '',
    // VÃ½chozÃ­ hodnota formulÃ¡Å™ovÃ©ho pole s URL serveru.
    serverUrl: 'https://server.ki-wi.cz/kiwi-server',
    // Doba Ä�ekÃ¡nÃ­ pÅ™i zobrazenÃ­ obazovky o ÃºspÄ›Å¡nÃ©n nastavenÃ­. [ms]
    successDelay: 5 * 1000,
    // VÃ½chozÃ­ hodnota formulÃ¡Å™ovÃ©ho pole s pÅ™ihlaÅ¡ovacÃ­m jmÃ©nem uÅ¾ivatele.
    username: ''
  },
  // VÃ½chozÃ­ mÃ©dia typ streamÅ¯, kterÃ½ se pouÅ¾ije,
  // pokud nemÃ¡ mÃ©dium Å¾Ã¡dnÃ½ typ definovÃ¡n.
  streamDefaultContainer: 'video/mp4',
  // MaximÃ¡lnÃ­ poÄ�et Ä�asovaÄ�Å¯, kterÃ½ je dovolen nastavit.
  // Na SSSP je poÄ�et omezen na 7 Ä�asovaÄ�Å¯ zapnutÃ­ a 7 Ä�asovaÄ�Å¯ vypnutÃ­.
  // ÄŒasovaÄ�e nad tento limit jsou ignorovÃ¡ny.
  // Na webOS je situace podobnÃ¡ a TV nedovolÃ­ nastavit vÃ­ce Ä�asovaÄ�Å¯ 7 + 7.
  // PÅ™i pokusu o nastavenÃ­ dalÅ¡Ã­ho Ä�asovaÄ�e dojde k chybÄ› pÅ™i volÃ¡nÃ­ metody.
  // Informace o tomto limitu v dokumentaci chybÃ­, ale byla potvrzena na fÃ³ru.
  timerMax: 7,
  // ProlÃ­naÄ� mÃ©diÃ­.
  viewer: {
    // ZpoÅ¾dÄ›nÃ­, kterÃ© se aplikuje pÅ™i detekovanÃ©m zacyklenÃ­. [ms]
    errorDelay: 1 * 1000,
    // PoÄ�et po sobÄ› jdoucÃ­ch selhanÃ½ch mÃ©diÃ­, kterÃ© se povaÅ¾ujÃ­ za zacyklenÃ­.
    errorLimit: 10,
    // MaximÃ¡lnÃ­ poÄ�et mÃ©diÃ­, kterÃ© se pÅ™eskoÄ�Ã­ pÅ™i pokusu o pÅ™ednaÄ�tenÃ­ nÃ¡sledujÃ­cÃ­ho slajdu.
    // Po dosaÅ¾enÃ­ limitu se pokus o naÄ�tenÃ­ zruÅ¡Ã­ a nÃ¡sledujÃ­cÃ­ mÃ©dium pÅ™ehraje bez pÅ™ednaÄ�tenÃ­.
    // ÄŒÃ­m vÄ›tÅ¡Ã­ hodnota, tÃ­m nÃ¡roÄ�nÄ›jÅ¡Ã­ je vyhledÃ¡nÃ­ slajdu k naÄ�tenÃ­.
    // Pokud by bylo neomezeno, tak hrozÃ­ deadlock,
    // kdy se mÅ¯Å¾e hledat vhodnÃ© mÃ©dium do nekoneÄ�na a nedojde k uvolnÄ›nÃ­ pÅ™ehrÃ¡vanÃ©ho zdroje.
    loadLimit: 10
  }
});

/***/ }),

/***/ "./src/core/error/error-level.js":
/*!***************************************!*\
  !*** ./src/core/error/error-level.js ***!
  \***************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

/**
 * ÃšroveÅˆ dÅ¯leÅ¾itosti chyby.
 * VychÃ¡zÃ­ z ÃºrovnÃ­ zavedenÃ½ch v Console API pod pojmenovÃ¡nÃ­m `logLevel`.
 * ÃšrovnÄ› majÃ­ nÃ¡sledujÃ­cÃ­ prioritu:
 * `Error` > `Warning` > `Info` > `Log` > `Debug`.
 *
 * Zdroje:
 * - [Console API](https://console.spec.whatwg.org/)
 * @enum {string}
 */
var ErrorLevel = {
  /** Verbose debug log which is usually hidden by default. */
  Debug: 'Debug',

  /** Critical error which can lead to an unexpected bahaviour or a crash. */
  Error: 'Error',

  /** Informative log with a slightly higher than low significance. */
  Info: 'Info',

  /** Common log with a low significance. */
  Log: 'Log',

  /** Warning about an unusual state which won't affect the script execution. */
  Warning: 'Warning'
};
/* harmony default export */ __webpack_exports__["default"] = (ErrorLevel);

/***/ }),

/***/ "./src/core/orientation/orientation-enum.js":
/*!**************************************************!*\
  !*** ./src/core/orientation/orientation-enum.js ***!
  \**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

/**
 * ÄŒÃ­selnÃ­k orientacÃ­ obrazovky.
 * @enum {string}
 * @name OrientationEnum
 */
/* harmony default export */ __webpack_exports__["default"] = ({
  CLOCKWISE_0: 'CLOCKWISE_0',
  CLOCKWISE_90: 'CLOCKWISE_90',
  CLOCKWISE_180: 'CLOCKWISE_180',
  CLOCKWISE_270: 'CLOCKWISE_270'
});

/***/ }),

/***/ "./src/core/pdf/pdf-child-main.js":
/*!****************************************!*\
  !*** ./src/core/pdf/pdf-child-main.js ***!
  \****************************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var bottlejs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! bottlejs */ "./node_modules/bottlejs/dist/bottle.js");
/* harmony import */ var bottlejs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(bottlejs__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var penpal_lib_connectToParent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! penpal/lib/connectToParent */ "./node_modules/penpal/lib/connectToParent.js");
/* harmony import */ var penpal_lib_connectToParent__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(penpal_lib_connectToParent__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config */ "./src/config.js");
/* harmony import */ var _pdf_child__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pdf-child */ "./src/core/pdf/pdf-child.js");
/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @file HlavnÃ­ skript PDF aplikace potomka, kterÃ½ ovlÃ¡dÃ¡ PDF pÅ™ehrÃ¡vaÄ�.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
// One-line definice zÃ¡vislostÃ­ pro snaÅ¾Å¡Ã­ merge.

/* eslint-disable max-len */
// Toto je jedinÃ½ skript, kterÃ½ by mÄ›l pÅ™istupovat k neobvyklÃ½m globÃ¡lnÃ­m promÄ›nnÃ½m.
// Pokud jsou ve zbytku aplikace potÅ™eba jejich data, tak by jim mÄ›li bÃ½t pÅ™edÃ¡ny v konstruktoru.

/* global PDFViewerApplication, PDFViewerApplicationOptions */

 // TODO #238 ZbyteÄ�nÃ¡ duplikace vÅ¡ech config hodnot.



document.addEventListener('webviewerloaded', function () {
  // SestavenÃ­ zÃ¡vislostÃ­ a spuÅ¡tÄ›nÃ­ aplikace.
  bottlejs__WEBPACK_IMPORTED_MODULE_0___default.a.config.strict = true;
  new bottlejs__WEBPACK_IMPORTED_MODULE_0___default.a().constant('Document', document).constant('PDFViewerApplication', PDFViewerApplication).constant('PDFViewerApplicationOptions', PDFViewerApplicationOptions).constant('PenpalConnectToParent', penpal_lib_connectToParent__WEBPACK_IMPORTED_MODULE_1___default.a).constant('origin', location.origin).constant('pdfPageRate', _config__WEBPACK_IMPORTED_MODULE_2__["default"].pdfPageRate).service('PdfChild', _pdf_child__WEBPACK_IMPORTED_MODULE_3__["default"], 'PDFViewerApplication', 'PDFViewerApplicationOptions', 'PenpalConnectToParent', 'Document', 'origin', 'pdfPageRate').container.PdfChild.start();
});

/***/ }),

/***/ "./src/core/pdf/pdf-child.js":
/*!***********************************!*\
  !*** ./src/core/pdf/pdf-child.js ***!
  \***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js");
/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js");
/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var lodash_noop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/noop */ "./node_modules/lodash/noop.js");
/* harmony import */ var lodash_noop__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_noop__WEBPACK_IMPORTED_MODULE_2__);



/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */
 // TODO #295 Zrevidovat odchytÃ¡vÃ¡nÃ­ chyb.
// TODO #295 LepÅ¡Ã­ napojenÃ­ parent?
// - ZatÃ­m vÅ¡ude volÃ¡nÃ­ `connection.promise` pro pÅ™Ã­stup k parent.
// - PÅ™edÃ¡vat parent v parametrech? NynÃ­ je to hroznÃ½ zmatek.
// - RozdÄ›lit aktuÃ¡lnÃ­ tÅ™Ã­du na dvÄ›,
//   pÅ™iÄ�emÅ¾ v konstruktoru jednoho bude parent a u druhÃ©ho origin.
//   Jak ale pak zpracovat `connectToParent`, kde je nutnÃ© navÃ¡zat metody?

/**
 * Potomek, kterÃ½ ovlÃ¡dÃ¡ PDF pÅ™ehrÃ¡vaÄ�.
 * Je naÄ�tenÃ½ uvnitÅ™ iframe a komunikuje s rodiÄ�em,
 * kterÃ½ ho vytvoÅ™il.
 * PodrobnÄ›jÅ¡Ã­ popis mechanizmu lze nalÃ©zt u {@link PdfParent}.
 * @implements {Destroyable}
 * @implements {PdfMessage}
 */

var PdfChild =
/*#__PURE__*/
function () {
  /**
   * VytvoÅ™Ã­ instanci.
   * @param {PDFViewerApplication} app
   * @param {PDFViewerApplicationOptions} appOptions
   * @param {PenpalConnectToParent} connectToParent
   * @param {Document} document
   * @param {string} origin Origin, kterÃ½ budou mÃ­t zprÃ¡vy od rodiÄ�e.
   * @param {number} pageRate PoÄ�et strÃ¡nek, kterÃ© se pÅ™ehrajÃ­ za jednu vteÅ™inu. [Hz]
   */
  function PdfChild(app, appOptions, connectToParent, document, origin, pageRate) {
    _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, PdfChild);

    this.app = app;
    this.appOptions = appOptions;
    this.canplay = false;
    this.document = document;
    this.duration = NaN;
    this.interval = null;
    this.onError = this.onError.bind(this);
    this.onInterval = this.onInterval.bind(this);
    this.onPagesinit = this.onPagesinit.bind(this);
    this.onPassword = this.onPassword.bind(this);
    this.pageRate = pageRate;
    this.paused = true;
    this.playbackRate = 1;
    this.src = ''; // NavÃ¡zÃ¡nÃ­ spojenÃ­ s rodiÄ�ovskou aplikacÃ­.

    this.connection = connectToParent({
      methods: {
        getSrc: this.getSrc.bind(this),
        pause: this.pause.bind(this),
        play: this.play.bind(this),
        setCurrentPage: this.setCurrentPage.bind(this),
        setPlaybackRate: this.setPlaybackRate.bind(this),
        setSrc: this.setSrc.bind(this)
      },
      parentOrigin: origin
    });
  }
  /** @inheritdoc */


  _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(PdfChild, [{
    key: "destroy",
    value: function destroy() {
      var document = this.document;
      document.removeEventListener('PDFViewerApplicationError', this.onError);
      document.removeEventListener('PDFViewerApplicationPassword', this.onPassword);
      document.removeEventListener('pagesinit', this.onPagesinit);
      this.connection.destroy();
      this.pause();
    }
    /**
     * ZjistÃ­ zdroj PDF.
     * Zdroje:
     * [HTMLMediaElement.src](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/src).
     * @returns {string} URL adresa souboru s PDF.
     */

  }, {
    key: "getSrc",
    value: function getSrc() {
      return this.src;
    }
    /**
     * OÅ¡etÅ™enÃ­ chyby jejÃ­m zaslÃ¡nÃ­ rodiÄ�ovi.
     * @param {Error} error
     * @private
     * @returns {Promise.<undefined>}
     */

  }, {
    key: "handleError",
    value: function handleError(error) {
      return this.connection.promise.then(function (parent) {
        return parent.error(error.message);
      });
    }
    /**
     * Resetuje naÄ�tenÃ­ PDF do vÃ½chozÃ­ho stavu.
     * Zdroje:
     * [HTMLMediaElement.load](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/load).
     * @private
     * @returns {undefined}
     */

  }, {
    key: "load",
    value: function load() {
      // TODO #295 Implementace load dle specifikace:
      // - https://html.spec.whatwg.org/multipage/media.html#media-element-load-algorithm
      // - ZatÃ­m nenÃ­ zveÅ™ejnÄ›no v PdfParent, kvÅ¯li nedokonalosti.
      // - OpakovanÃ© volÃ¡nÃ­ nefunguje spolehlivÄ› vÄ�etnÄ› pakovanÃ©ho nastavenÃ­ src.
      // - If the paused attribute is false, then...
      // - Set the current playback position to 0.
      // - Update the duration attribute to Not-a-Number (NaN).
      //   The user agent will not fire a durationchange event for this particular change of the duration.
      var src = this.src;

      if (src === this.app.url) {
        this.processMetadata();
        return;
      }

      this.canplay = false; // OtevÅ™enÃ­ dokumentu PDF aplikacÃ­.
      // Na vÃ½sledek se neÄ�ekÃ¡, komunikace se realizuje pÅ™es udÃ¡losti.

      this.app.open(this.src) // Chyby se odchytÃ¡vajÃ­ pomocÃ­ udÃ¡lostÃ­. Zde se ignorujÃ­.
      .catch(lodash_noop__WEBPACK_IMPORTED_MODULE_2___default.a);
    }
    /**
     * Reakce na vznik chyby v PDF prohlÃ­Å¾eÄ�i.
     * PÅ¯vodnÃ­ reakcÃ­ je vÃ½pis tÄ›chto informacÃ­ do GUI
     * @param {CustomEvent.<PDFViewerApplicationError>} event
     * @private
     * @returns {undefined}
     */

  }, {
    key: "onError",
    value: function onError(event) {
      // TODO #295 VyuÅ¾Ã­t data v PDFViewerApplicationError#moreInfo.
      // TODO #295 NemÄ›lo by se dle specifikace zastavit pÅ™ehrÃ¡vÃ¡nÃ­?
      var error = new Error(event.detail.message);
      this.handleError(error);
    }
    /**
     * Reakce na aktivaci intervalu pÅ™ehrÃ¡vÃ¡nÃ­.
     * V tomto intervalu se pÅ™epÃ­nÃ¡ na dalÅ¡Ã­ strÃ¡nku.
     * @private
     * @returns {undefined}
     */

  }, {
    key: "onInterval",
    value: function onInterval() {
      var _this = this;

      this.connection.promise.then(function (parent) {
        var app = _this.app;
        var nextPage = app.page + 1;

        if (app.pagesCount < nextPage) {
          // Po dosaÅ¾enÃ­ konce dokumentu se zastavÃ­ pÅ™ehrÃ¡vÃ¡nÃ­
          // a odeÅ¡le se zprÃ¡va na server.
          _this.pause();

          return parent.ended();
        }

        app.page = nextPage;
      });
    }
    /**
     * Reakce na vygenerovÃ¡nÃ­ vÅ¡ech strÃ¡nek PDF dokumentu do HTML.
     * SamotnÃ© strÃ¡nky jsou prÃ¡zdnÃ© a zaÄ�Ã­nÃ¡ jejich vykreslovÃ¡nÃ­ dle aktuÃ¡lnÄ› zobrazenÃ©.
     * NejdÅ™Ã­ve v tento okamÅ¾ik je moÅ¾nÃ© pÅ™epnout do fullscreen.
     * LimitujÃ­cÃ­ je test na `viewer.hasChildNodes()`.
     * TakÃ© je od tohoto okamÅ¾iku moÅ¾nÃ½ posuv v dokumentu.
     * @private
     * @returns {undefined}
     */

  }, {
    key: "onPagesinit",
    value: function onPagesinit() {
      this.app.requestPresentationMode();
      this.canplay = true;
      this.processMetadata();
    }
    /**
     * Reakce na poÅ¾adavek na zadÃ¡nÃ­ hesla.
     * NenÃ­ zde uÅ¾ivatel, kterÃ½ by heslo zadal,
     * tak se vyvolÃ¡ chyba.
     * @private
     * @returns {undefined}
     */

  }, {
    key: "onPassword",
    value: function onPassword() {
      this.connection.promise.then(function (parent) {
        parent.error('PDF is password protected.');
      });
    }
    /**
     * PozastavÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ PDF.
     * Zdroje:
     * [HTMLMediaElement.pause](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/pause).
     * @returns {undefined}
     */

  }, {
    key: "pause",
    value: function pause() {
      this.stopInterval();
      this.paused = true;
    }
    /**
     * SpustÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ PDF, bÄ›hem kterÃ©ho se v poÅ¾adovanÃ©m intervalu
     * prochÃ¡zÃ­ jednotlivÃ½mi strÃ¡nkami dokumentu.
     * Zdroje:
     * [HTMLMediaElement.play](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play).
     * @returns {undefined}
     */

  }, {
    key: "play",
    value: function play() {
      // TODO #295 Implementace play dle specifikace:
      // - https://html.spec.whatwg.org/multipage/media.html#playing-the-media-resource
      // - Nefunguje napÅ™. volÃ¡nÃ­ play bez src a dalÅ¡Ã­ krajnÃ­ stavy.
      this.paused = false; // ZjednoduÅ¡enÃ¡ implementace nahrazujÃ­cÃ­ task queue.

      if (!this.canplay) {
        // Pokud jeÅ¡tÄ› nenÃ­ dokument pÅ™ipravenÃ½ na strÃ¡nkovÃ¡nÃ­,
        // tak se nic nedÄ›je.
        return;
      }

      return this.startInterval();
    }
    /**
     * Once enough of the media data has been fetched
     * to determine the duration of the media resource, its dimensions, and other metadata.
     * @returns {undefined}
     */

  }, {
    key: "processMetadata",
    value: function processMetadata() {
      var _this2 = this;

      this.connection.promise.then(function (parent) {
        // Set the playback position to the earliest possible position.
        _this2.app.page = 1; // Update the duration attribute with the time of the last frame of the resource.

        var duration = _this2.app.pagesCount / _this2.pageRate;
        _this2.duration = duration; // Fire an event named durationchange at the element at this point.

        parent.durationchange(duration); // ZjednoduÅ¡enÃ¡ implementace nahrazujÃ­cÃ­ task queue.

        if (_this2.paused) {
          // Pokud nenÃ­ poÅ¾adovÃ¡no zahÃ¡jenÃ­ pÅ™ehrÃ¡vÃ¡nÃ­,
          // tak se nic nedÄ›je.
          return;
        }

        return _this2.startInterval();
      });
    }
    /**
     * Restart intervalu pÅ™ehrÃ¡vÃ¡nÃ­, bÄ›hem kterÃ©ho se
     * prochÃ¡zÃ­ jednotlivÃ½mi strÃ¡nkami dokumentu.
     * @private
     * @returns {undefined}
     */

  }, {
    key: "restartInterval",
    value: function restartInterval() {
      this.stopInterval();
      this.startInterval();
    }
    /**
     * NastavÃ­ aktuÃ¡lnÄ› zobrazenou stranu v PDF.
     * Zdroje:
     * [HTMLMediaElement.currentTime](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/currentTime).
     * @param {number} page ÄŒÃ­slo strany, prvnÃ­ je 1.
     * @returns {undefined}
     */

  }, {
    key: "setCurrentPage",
    value: function setCurrentPage(page) {
      if (!this.paused) {
        // Restart intervalu zobrazenÃ­ strany pÅ™i pÅ™ehrÃ¡vÃ¡nÃ­.
        this.restartInterval();
      }

      this.app.page = page;
    }
    /**
     * NastavÃ­ rychlost pÅ™ehrÃ¡vÃ¡nÃ­ PDF.
     * Zdroje:
     * [HTMLMediaElement.playbackRate](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/playbackRate).
     * @param {number} playbackRate Rychlost pÅ™ehrÃ¡vÃ¡nÃ­ PDF, kde 0 je zastaveno a 1 je vÃ½chozÃ­ rychlost.
     * @returns {Promise.<undefined>}
     */

  }, {
    key: "setPlaybackRate",
    value: function setPlaybackRate(playbackRate) {
      try {
        if (!(Number.isFinite(playbackRate) && playbackRate > 0)) {
          // TODO NenÃ­ podporovÃ¡na nulovÃ¡ hodnota.
          // - The element's playbackRate can be 0.0,
          //   in which case the current playback position doesn't move,
          //   despite playback not being paused (paused doesn't become true,
          //   and the pause event doesn't fire).
          // - V tÃ©to implementaci by mÄ›lo odpovÃ­dat nespuÅ¡tÄ›nÃ­ intervalu,
          //   to by mohlo vyÅ¾adovat nÄ›jakÃ© Ãºpravy, zatÃ­m asi zakÃ¡zat.
          // TODO NenÃ­ podporovÃ¡na zÃ¡pornÃ¡ hodnota.
          // - Specifikace dovoluje, ale vÄ›tÅ¡ina prohlÃ­Å¾eÄ�Å¯ stejnÄ› nepodporuje.
          // TODO Je vyÅ¾adovÃ¡n typ number, specifikace dovoluje tÅ™eba i string.
          // TODO If the given value is not supported by the user agent, then throw a "NotSupportedError" DOMException.
          throw new TypeError('Playback rate is not a finite possitive floating-point value.');
        }

        this.playbackRate = playbackRate;

        if (!this.paused) {
          // If the element is potentially playing, change the playback speed.
          // A media element is said to be potentially playing when its paused attribute is false.
          // TODO Hotfix implementace restartovÃ¡nÃ­m intervalu pÅ™ehrÃ¡vÃ¡nÃ­.
          // - V ideÃ¡lnÃ­m pÅ™Ã­padÄ› by se mÄ›l odeÄ�Ã­st Ä�as, kterÃ½ jiÅ¾ uplynul na aktuÃ¡lnÃ­ stranÄ›.
          this.restartInterval();
        }
      } catch (error) {
        this.handleError(error);
      }
    }
    /**
     * NastavÃ­ zdroj PDF.
     * Zdroje:
     * [HTMLMediaElement.src](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/src).
     * @param {string} src URL adresa souboru s PDF.
     * @returns {undefined}
     */

  }, {
    key: "setSrc",
    value: function setSrc(src) {
      this.src = src; // If a src attribute of a media element is set or changed,
      // the user agent must invoke the media element's media element load algorithm.

      this.load();
    }
    /**
     * SpustÃ­ aplikaci potomka.
     * Je nutnÃ© ihned zaÄ�Ã­t naslouchat zmÄ›nÃ¡m v PDF pÅ™ehrÃ¡vaÄ�i,
     * kterÃ½ neÄ�ekÃ¡ a pokraÄ�uje v inicializaci.
     * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po navÃ¡zÃ¡nÃ­ komunikace s potomkem.
     */

  }, {
    key: "start",
    value: function start() {
      var _this3 = this;

      return new Promise(function (resolve) {
        var appOptions = _this3.appOptions,
            document = _this3.document;
        document.addEventListener('PDFViewerApplicationError', _this3.onError);
        document.addEventListener('PDFViewerApplicationPassword', _this3.onPassword);
        document.addEventListener('pagesinit', _this3.onPagesinit); // Deaktivace vÃ½chozÃ­ho PDF souboru. OtevÃ­rÃ¡ se aÅ¾ vyÅ¾Ã¡danÃ½ soubor.

        appOptions.set('defaultUrl', ''); // Deaktivace naÄ�Ã­tÃ¡nÃ­ odebranÃ½ch chearacter maps.
        // Je nutnÃ© deaktivovat i cMapUrl, aby neprobÄ›hly pokusy o jejich staÅ¾enÃ­.

        appOptions.set('cMapPacked', false);
        appOptions.set('cMapUrl', false); // VynutÃ­ se vÃ½chozÃ­ jazyk, jinak se pouÅ¾ije nastavenÃ½ prohlÃ­Å¾eÄ�i.
        // S jedinÃ½m jazykem lze snÃ­Å¾it velikost buildu.
        // V lokalizaci "en-GB" chybÃ­ nÄ›kterÃ© texty, tak je pouÅ¾ita vÃ½chozÃ­ z PDF.js.

        appOptions.set('locale', 'en-US'); // Ãšprava cesty k workeru, dle slouÄ�enÃ­ "build" a "web" do jednÃ© vÃ½stupnÃ­ sloÅ¾ky.

        appOptions.set('workerSrc', 'pdf.worker.js');
        return resolve(_this3.connection.promise);
      });
    }
    /**
     * ZahÃ¡jenÃ­ intervalu pÅ™ehrÃ¡vÃ¡nÃ­, bÄ›hem kterÃ©ho se
     * prochÃ¡zÃ­ jednotlivÃ½mi strÃ¡nkami dokumentu.
     * NarozdÃ­l od obyÄ�ejnÃ©ho `play` je volÃ¡no aÅ¾ pÅ™i skuteÄ�nÃ©m zahÃ¡jenÃ­ pÅ™ehrÃ¡vÃ¡nÃ­.
     * @private
     * @returns {undefined}
     */

  }, {
    key: "startInterval",
    value: function startInterval() {
      if (this.interval) {
        // Pokud se jiÅ¾ pÅ™ehrÃ¡vÃ¡, nic se nedÄ›lÃ¡.
        return;
      } // ZaÄ�Ã¡tek pÅ™ehrÃ¡vÃ¡nÃ­. V pravidelnÃ©m intervalu se mÄ›nÃ­ strany.
      // DÃ©lka pÅ™ehrÃ¡vÃ¡nÃ­ se rovnomÄ›rnÄ› rozdÄ›lÃ­ mezi jednotlivÃ© strany PDF.
      // NapÅ™. pÅ™i pÅ™ehrÃ¡vÃ¡nÃ­ PDF s 5 stranami v dÃ©lce 10 vteÅ™in
      // se kaÅ¾dÃ¡ strana bude zobrazovat 2 vteÅ™iny.


      var delay = this.duration * 1000 / this.playbackRate / this.app.pagesCount;
      this.interval = setInterval(this.onInterval, delay);
    }
    /**
     * ZastavenÃ­ intervalu pÅ™ehrÃ¡vÃ¡nÃ­, bÄ›hem kterÃ©ho se
     * prochÃ¡zÃ­ jednotlivÃ½mi strÃ¡nkami dokumentu.
     * @private
     * @returns {undefined}
     */

  }, {
    key: "stopInterval",
    value: function stopInterval() {
      clearInterval(this.interval);
      this.interval = null;
    }
  }]);

  return PdfChild;
}();

/* harmony default export */ __webpack_exports__["default"] = (PdfChild);

/***/ }),

/***/ 0:
/*!**********************************************!*\
  !*** multi ./src/core/pdf/pdf-child-main.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

module.exports = __webpack_require__(/*! /builds/ki-wi/player-light/player-lighter/src/core/pdf/pdf-child-main.js */"./src/core/pdf/pdf-child-main.js");


/***/ })

/******/ });
//# sourceMappingURL=pdf-child.js.map{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/@babel/runtime/helpers/classCallCheck.js","webpack:///./node_modules/@babel/runtime/helpers/createClass.js","webpack:///./node_modules/bottlejs/dist/bottle.js","webpack:///./node_modules/lodash/noop.js","webpack:///./node_modules/penpal/lib/connectCallReceiver.js","webpack:///./node_modules/penpal/lib/connectCallSender.js","webpack:///./node_modules/penpal/lib/connectToParent.js","webpack:///./node_modules/penpal/lib/constants.js","webpack:///./node_modules/penpal/lib/createDestructor.js","webpack:///./node_modules/penpal/lib/createLogger.js","webpack:///./node_modules/penpal/lib/errorCodes.js","webpack:///./node_modules/penpal/lib/errorSerialization.js","webpack:///./node_modules/penpal/lib/generateId.js","webpack:///(webpack)/buildin/amd-options.js","webpack:///(webpack)/buildin/global.js","webpack:///(webpack)/buildin/module.js","webpack:///./src/config.js","webpack:///./src/core/error/error-level.js","webpack:///./src/core/orientation/orientation-enum.js","webpack:///./src/core/pdf/pdf-child-main.js","webpack:///./src/core/pdf/pdf-child.js"],"names":["Object","defineProperty","exports","value","default","_constants","_errorSerialization","_default","info","methods","log","localName","local","remote","originForSending","originForReceiving","destroyed","handleMessageEvent","event","source","data","penpal","CALL","origin","_event$data","methodName","args","id","createPromiseHandler","resolution","returnValue","message","REPLY","REJECTED","Error","serializeError","returnValueIsError","postMessage","err","name","DATA_CLONE_ERROR","Promise","resolve","apply","then","FULFILLED","addEventListener","MESSAGE","removeEventListener","module","_errorCodes","_generateId","_interopRequireDefault","obj","__esModule","callSender","methodNames","destroyConnection","createMethodProxy","_len","arguments","length","Array","_key","iframeRemoved","closed","e","error","code","ERR_CONNECTION_DESTROYED","reject","deserializeError","reduce","api","_createDestructor2","_connectCallReceiver","_connectCallSender","_createLogger","_ref","undefined","_ref$parentOrigin","parentOrigin","_ref$methods","timeout","debug","window","top","ERR_NOT_IN_IFRAME","_createDestructor","destroy","onDestroy","child","parent","promise","resolveConnectionPromise","connectionTimeoutId","setTimeout","ERR_CONNECTION_TIMEOUT","clearTimeout","HANDSHAKE_REPLY","destroyCallReceiver","destroyCallSender","HANDSHAKE","keys","callbacks","forEach","callback","push","console","ERR_NO_IFRAME_SRC","stack","deserializedError","key","autorebootDefaultDisabled","autorebootDefaultInterval","autorebootMinInterval","cordovaBootDelay","device","downloader","defaultSize","communicator","syncDelayBase","orientation","defaultOrientationEnum","CLOCKWISE_0","session","defaultId","fileSystemLocalhostPort","firmware","htmlIframeLoadDelay","icalPlannerMaxIterations","kiwiLighterApiVersion","longTimersMaxDelay","Math","pow","pdfConnectionTimeout","pdfPageRate","pdfSourceMax","platform","tizenSssp4","booterClockLimit","Date","getTime","booterRetryDelay","clockSyncInterval","sentryCaptureErrorLevel","sentryMaxEvents","setup","automaticDelay","deviceName","failureDelayBase","failureDelayMax","failureDelayMultiplier","password","serverUrl","successDelay","username","streamDefaultContainer","timerMax","viewer","errorDelay","errorLimit","loadLimit","ErrorLevel","Debug","Info","Log","Warning","CLOCKWISE_90","CLOCKWISE_180","CLOCKWISE_270","document","Bottle","config","strict","constant","PDFViewerApplication","PDFViewerApplicationOptions","location","service","container","PdfChild","start","app","appOptions","connectToParent","pageRate","canplay","duration","NaN","interval","onError","bind","onInterval","onPagesinit","onPassword","paused","playbackRate","src","connection","getSrc","pause","play","setCurrentPage","setPlaybackRate","setSrc","url","processMetadata","open","catch","detail","handleError","nextPage","page","pagesCount","ended","requestPresentationMode","stopInterval","startInterval","durationchange","restartInterval","Number","isFinite","TypeError","load","set","delay","setInterval","clearInterval"],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;AClFA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;;;;;;ACNA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,8B;;;;;;;;;;;sDChBA,mCAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,OAAO;AACtB,eAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;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","file":"pdf-viewer/pdf-child.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","function _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nmodule.exports = _createClass;",";(function(undefined) {\n    'use strict';\n    /**\n     * BottleJS v1.7.1 - 2018-05-03\n     * A powerful dependency injection micro container\n     *\n     * Copyright (c) 2018 Stephen Young\n     * Licensed MIT\n     */\n    var Bottle;\n    \n    /**\n     * String constants\n     */\n    var DELIMITER = '.';\n    var FUNCTION_TYPE = 'function';\n    var STRING_TYPE = 'string';\n    var GLOBAL_NAME = '__global__';\n    var PROVIDER_SUFFIX = 'Provider';\n    \n    /**\n     * Unique id counter;\n     *\n     * @type Number\n     */\n    var id = 0;\n    \n    /**\n     * Local slice alias\n     *\n     * @type Functions\n     */\n    var slice = Array.prototype.slice;\n    \n    /**\n     * Iterator used to walk down a nested object.\n     *\n     * If Bottle.config.strict is true, this method will throw an exception if it encounters an\n     * undefined path\n     *\n     * @param Object obj\n     * @param String prop\n     * @return mixed\n     * @throws Error if Bottle is unable to resolve the requested service.\n     */\n    var getNested = function getNested(obj, prop) {\n        var service = obj[prop];\n        if (service === undefined && Bottle.config.strict) {\n            throw new Error('Bottle was unable to resolve a service.  `' + prop + '` is undefined.');\n        }\n        return service;\n    };\n    \n    /**\n     * Get a nested bottle. Will set and return if not set.\n     *\n     * @param String name\n     * @return Bottle\n     */\n    var getNestedBottle = function getNestedBottle(name) {\n        var bottle;\n        if (!this.nested[name]) {\n            bottle = Bottle.pop();\n            this.nested[name] = bottle;\n            this.factory(name, function SubProviderFactory() {\n                return bottle.container;\n            });\n        }\n        return this.nested[name];\n    };\n    \n    /**\n     * Get a service stored under a nested key\n     *\n     * @param String fullname\n     * @return Service\n     */\n    var getNestedService = function getNestedService(fullname) {\n        return fullname.split(DELIMITER).reduce(getNested, this);\n    };\n    \n    /**\n     * Function used by provider to set up middleware for each request.\n     *\n     * @param Number id\n     * @param String name\n     * @param Object instance\n     * @param Object container\n     * @return void\n     */\n    var applyMiddleware = function applyMiddleware(middleware, name, instance, container) {\n        var descriptor = {\n            configurable : true,\n            enumerable : true\n        };\n        if (middleware.length) {\n            descriptor.get = function getWithMiddlewear() {\n                var index = 0;\n                var next = function nextMiddleware(err) {\n                    if (err) {\n                        throw err;\n                    }\n                    if (middleware[index]) {\n                        middleware[index++](instance, next);\n                    }\n                };\n                next();\n                return instance;\n            };\n        } else {\n            descriptor.value = instance;\n            descriptor.writable = true;\n        }\n    \n        Object.defineProperty(container, name, descriptor);\n    \n        return container[name];\n    };\n    \n    /**\n     * Register middleware.\n     *\n     * @param String name\n     * @param Function func\n     * @return Bottle\n     */\n    var middleware = function middleware(fullname, func) {\n        var parts, name;\n        if (typeof fullname === FUNCTION_TYPE) {\n            func = fullname;\n            fullname = GLOBAL_NAME;\n        }\n    \n        parts = fullname.split(DELIMITER);\n        name = parts.shift();\n        if (parts.length) {\n            getNestedBottle.call(this, name).middleware(parts.join(DELIMITER), func);\n        } else {\n            if (!this.middlewares[name]) {\n                this.middlewares[name] = [];\n            }\n            this.middlewares[name].push(func);\n        }\n        return this;\n    };\n    \n    /**\n     * Used to process decorators in the provider\n     *\n     * @param Object instance\n     * @param Function func\n     * @return Mixed\n     */\n    var reducer = function reducer(instance, func) {\n        return func(instance);\n    };\n    \n    \n    /**\n     * Get decorators and middleware including globals\n     *\n     * @return array\n     */\n    var getWithGlobal = function getWithGlobal(collection, name) {\n        return (collection[name] || []).concat(collection.__global__ || []);\n    };\n    \n    \n    /**\n     * Create the provider properties on the container\n     *\n     * @param String name\n     * @param Function Provider\n     * @return Bottle\n     */\n    var createProvider = function createProvider(name, Provider) {\n        var providerName, properties, container, id, decorators, middlewares;\n    \n        id = this.id;\n        container = this.container;\n        decorators = this.decorators;\n        middlewares = this.middlewares;\n        providerName = name + PROVIDER_SUFFIX;\n    \n        properties = Object.create(null);\n        properties[providerName] = {\n            configurable : true,\n            enumerable : true,\n            get : function getProvider() {\n                var instance = new Provider();\n                delete container[providerName];\n                container[providerName] = instance;\n                return instance;\n            }\n        };\n    \n        properties[name] = {\n            configurable : true,\n            enumerable : true,\n            get : function getService() {\n                var provider = container[providerName];\n                var instance;\n                if (provider) {\n                    // filter through decorators\n                    instance = getWithGlobal(decorators, name).reduce(reducer, provider.$get(container));\n    \n                    delete container[providerName];\n                    delete container[name];\n                }\n                return instance === undefined ? instance : applyMiddleware(getWithGlobal(middlewares, name),\n                    name, instance, container);\n            }\n        };\n    \n        Object.defineProperties(container, properties);\n        return this;\n    };\n    \n    \n    /**\n     * Register a provider.\n     *\n     * @param String fullname\n     * @param Function Provider\n     * @return Bottle\n     */\n    var provider = function provider(fullname, Provider) {\n        var parts, name;\n        parts = fullname.split(DELIMITER);\n        if (this.providerMap[fullname] && parts.length === 1 && !this.container[fullname + PROVIDER_SUFFIX]) {\n            return console.error(fullname + ' provider already instantiated.');\n        }\n        this.originalProviders[fullname] = Provider;\n        this.providerMap[fullname] = true;\n    \n        name = parts.shift();\n    \n        if (parts.length) {\n            getNestedBottle.call(this, name).provider(parts.join(DELIMITER), Provider);\n            return this;\n        }\n        return createProvider.call(this, name, Provider);\n    };\n    \n    /**\n     * Register a factory inside a generic provider.\n     *\n     * @param String name\n     * @param Function Factory\n     * @return Bottle\n     */\n    var factory = function factory(name, Factory) {\n        return provider.call(this, name, function GenericProvider() {\n            this.$get = Factory;\n        });\n    };\n    \n    /**\n     * Private helper for creating service and service factories.\n     *\n     * @param String name\n     * @param Function Service\n     * @return Bottle\n     */\n    var createService = function createService(name, Service, isClass) {\n        var deps = arguments.length > 3 ? slice.call(arguments, 3) : [];\n        var bottle = this;\n        return factory.call(this, name, function GenericFactory() {\n            var serviceFactory = Service; // alias for jshint\n            var args = deps.map(getNestedService, bottle.container);\n    \n            if (!isClass) {\n                return serviceFactory.apply(null, args);\n            }\n            return new (Service.bind.apply(Service, [null].concat(args)))();\n        });\n    };\n    \n    /**\n     * Register a class service\n     *\n     * @param String name\n     * @param Function Service\n     * @return Bottle\n     */\n    var service = function service(name, Service) {\n        return createService.apply(this, [name, Service, true].concat(slice.call(arguments, 2)));\n    };\n    \n    /**\n     * Register a function service\n     */\n    var serviceFactory = function serviceFactory(name, factoryService) {\n        return createService.apply(this, [name, factoryService, false].concat(slice.call(arguments, 2)));\n    };\n    \n    /**\n     * Define a mutable property on the container.\n     *\n     * @param String name\n     * @param mixed val\n     * @return void\n     * @scope container\n     */\n    var defineValue = function defineValue(name, val) {\n        Object.defineProperty(this, name, {\n            configurable : true,\n            enumerable : true,\n            value : val,\n            writable : true\n        });\n    };\n    \n    /**\n     * Iterator for setting a plain object literal via defineValue\n     *\n     * @param Object container\n     * @param string name\n     */\n    var setValueObject = function setValueObject(container, name) {\n        var nestedContainer = container[name];\n        if (!nestedContainer) {\n            nestedContainer = {};\n            defineValue.call(container, name, nestedContainer);\n        }\n        return nestedContainer;\n    };\n    \n    \n    /**\n     * Register a value\n     *\n     * @param String name\n     * @param mixed val\n     * @return Bottle\n     */\n    var value = function value(name, val) {\n        var parts;\n        parts = name.split(DELIMITER);\n        name = parts.pop();\n        defineValue.call(parts.reduce(setValueObject, this.container), name, val);\n        return this;\n    };\n    \n    /**\n     * Define an enumerable, non-configurable, non-writable value.\n     *\n     * @param String name\n     * @param mixed value\n     * @return undefined\n     */\n    var defineConstant = function defineConstant(name, value) {\n        Object.defineProperty(this, name, {\n            configurable : false,\n            enumerable : true,\n            value : value,\n            writable : false\n        });\n    };\n    \n    /**\n     * Register a constant\n     *\n     * @param String name\n     * @param mixed value\n     * @return Bottle\n     */\n    var constant = function constant(name, value) {\n        var parts = name.split(DELIMITER);\n        name = parts.pop();\n        defineConstant.call(parts.reduce(setValueObject, this.container), name, value);\n        return this;\n    };\n    \n    /**\n     * Register decorator.\n     *\n     * @param String fullname\n     * @param Function func\n     * @return Bottle\n     */\n    var decorator = function decorator(fullname, func) {\n        var parts, name;\n        if (typeof fullname === FUNCTION_TYPE) {\n            func = fullname;\n            fullname = GLOBAL_NAME;\n        }\n    \n        parts = fullname.split(DELIMITER);\n        name = parts.shift();\n        if (parts.length) {\n            getNestedBottle.call(this, name).decorator(parts.join(DELIMITER), func);\n        } else {\n            if (!this.decorators[name]) {\n                this.decorators[name] = [];\n            }\n            this.decorators[name].push(func);\n        }\n        return this;\n    };\n    \n    /**\n     * Register a function that will be executed when Bottle#resolve is called.\n     *\n     * @param Function func\n     * @return Bottle\n     */\n    var defer = function defer(func) {\n        this.deferred.push(func);\n        return this;\n    };\n    \n    \n    /**\n     * Immediately instantiates the provided list of services and returns them.\n     *\n     * @param Array services\n     * @return Array Array of instances (in the order they were provided)\n     */\n    var digest = function digest(services) {\n        return (services || []).map(getNestedService, this.container);\n    };\n    \n    /**\n     * Register an instance factory inside a generic factory.\n     *\n     * @param {String} name - The name of the service\n     * @param {Function} Factory - The factory function, matches the signature required for the\n     * `factory` method\n     * @return Bottle\n     */\n    var instanceFactory = function instanceFactory(name, Factory) {\n        return factory.call(this, name, function GenericInstanceFactory(container) {\n            return {\n                instance : Factory.bind(Factory, container)\n            };\n        });\n    };\n    \n    /**\n     * A filter function for removing bottle container methods and providers from a list of keys\n     */\n    var byMethod = function byMethod(name) {\n        return !/^\\$(?:decorator|register|list)$|Provider$/.test(name);\n    };\n    \n    /**\n     * List the services registered on the container.\n     *\n     * @param Object container\n     * @return Array\n     */\n    var list = function list(container) {\n        return Object.keys(container || this.container || {}).filter(byMethod);\n    };\n    \n    /**\n     * Named bottle instances\n     *\n     * @type Object\n     */\n    var bottles = {};\n    \n    /**\n     * Get an instance of bottle.\n     *\n     * If a name is provided the instance will be stored in a local hash.  Calling Bottle.pop multiple\n     * times with the same name will return the same instance.\n     *\n     * @param String name\n     * @return Bottle\n     */\n    var pop = function pop(name) {\n        var instance;\n        if (typeof name === STRING_TYPE) {\n            instance = bottles[name];\n            if (!instance) {\n                bottles[name] = instance = new Bottle();\n                instance.constant('BOTTLE_NAME', name);\n            }\n            return instance;\n        }\n        return new Bottle();\n    };\n    \n    /**\n     * Clear all named bottles.\n     */\n    var clear = function clear(name) {\n        if (typeof name === STRING_TYPE) {\n            delete bottles[name];\n        } else {\n            bottles = {};\n        }\n    };\n    \n    /**\n     * Register a service, factory, provider, or value based on properties on the object.\n     *\n     * properties:\n     *  * Obj.$name   String required ex: `'Thing'`\n     *  * Obj.$type   String optional 'service', 'factory', 'provider', 'value'.  Default: 'service'\n     *  * Obj.$inject Mixed  optional only useful with $type 'service' name or array of names\n     *  * Obj.$value  Mixed  optional Normally Obj is registered on the container.  However, if this\n     *                       property is included, it's value will be registered on the container\n     *                       instead of the object itsself.  Useful for registering objects on the\n     *                       bottle container without modifying those objects with bottle specific keys.\n     *\n     * @param Function Obj\n     * @return Bottle\n     */\n    var register = function register(Obj) {\n        var value = Obj.$value === undefined ? Obj : Obj.$value;\n        return this[Obj.$type || 'service'].apply(this, [Obj.$name, value].concat(Obj.$inject || []));\n    };\n    \n    /**\n     * Deletes providers from the map and container.\n     *\n     * @param String name\n     * @return void\n     */\n    var removeProviderMap = function resetProvider(name) {\n        delete this.providerMap[name];\n        delete this.container[name];\n        delete this.container[name + PROVIDER_SUFFIX];\n    };\n    \n    /**\n     * Resets providers on a bottle instance. If 'names' array is provided, only the named providers will be reset.\n     *\n     * @param Array names\n     * @return void\n     */\n    var resetProviders = function resetProviders(names) {\n        var tempProviders = this.originalProviders;\n        var shouldFilter = Array.isArray(names);\n    \n        Object.keys(this.originalProviders).forEach(function resetProvider(originalProviderName) {\n            if (shouldFilter && names.indexOf(originalProviderName) === -1) {\n                return;\n            }\n            var parts = originalProviderName.split(DELIMITER);\n            if (parts.length > 1) {\n                parts.forEach(removeProviderMap, getNestedBottle.call(this, parts[0]));\n            }\n            removeProviderMap.call(this, originalProviderName);\n            this.provider(originalProviderName, tempProviders[originalProviderName]);\n        }, this);\n    };\n    \n    \n    /**\n     * Execute any deferred functions\n     *\n     * @param Mixed data\n     * @return Bottle\n     */\n    var resolve = function resolve(data) {\n        this.deferred.forEach(function deferredIterator(func) {\n            func(data);\n        });\n    \n        return this;\n    };\n    \n    \n    /**\n     * Bottle constructor\n     *\n     * @param String name Optional name for functional construction\n     */\n    Bottle = function Bottle(name) {\n        if (!(this instanceof Bottle)) {\n            return Bottle.pop(name);\n        }\n    \n        this.id = id++;\n    \n        this.decorators = {};\n        this.middlewares = {};\n        this.nested = {};\n        this.providerMap = {};\n        this.originalProviders = {};\n        this.deferred = [];\n        this.container = {\n            $decorator : decorator.bind(this),\n            $register : register.bind(this),\n            $list : list.bind(this)\n        };\n    };\n    \n    /**\n     * Bottle prototype\n     */\n    Bottle.prototype = {\n        constant : constant,\n        decorator : decorator,\n        defer : defer,\n        digest : digest,\n        factory : factory,\n        instanceFactory: instanceFactory,\n        list : list,\n        middleware : middleware,\n        provider : provider,\n        resetProviders : resetProviders,\n        register : register,\n        resolve : resolve,\n        service : service,\n        serviceFactory : serviceFactory,\n        value : value\n    };\n    \n    /**\n     * Bottle static\n     */\n    Bottle.pop = pop;\n    Bottle.clear = clear;\n    Bottle.list = list;\n    \n    /**\n     * Global config\n     */\n    Bottle.config = {\n        strict : false\n    };\n    \n    /**\n     * Exports script adapted from lodash v2.4.1 Modern Build\n     *\n     * @see http://lodash.com/\n     */\n    \n    /**\n     * Valid object type map\n     *\n     * @type Object\n     */\n    var objectTypes = {\n        'function' : true,\n        'object' : true\n    };\n    \n    (function exportBottle(root) {\n    \n        /**\n         * Free variable exports\n         *\n         * @type Function\n         */\n        var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n    \n        /**\n         * Free variable module\n         *\n         * @type Object\n         */\n        var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n    \n        /**\n         * CommonJS module.exports\n         *\n         * @type Function\n         */\n        var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n    \n        /**\n         * Free variable `global`\n         *\n         * @type Object\n         */\n        var freeGlobal = objectTypes[typeof global] && global;\n        if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n            root = freeGlobal;\n        }\n    \n        /**\n         * Export\n         */\n        if (typeof define === FUNCTION_TYPE && typeof define.amd === 'object' && define.amd) {\n            root.Bottle = Bottle;\n            define(function() { return Bottle; });\n        } else if (freeExports && freeModule) {\n            if (moduleExports) {\n                (freeModule.exports = Bottle).Bottle = Bottle;\n            } else {\n                freeExports.Bottle = Bottle;\n            }\n        } else {\n            root.Bottle = Bottle;\n        }\n    }((objectTypes[typeof window] && window) || this));\n    \n}.call(this));","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _constants = require(\"./constants\");\n\nvar _errorSerialization = require(\"./errorSerialization\");\n\n/**\n * Listens for \"call\" messages coming from the remote, executes the corresponding method, and\n * responds with the return value.\n * @param {Object} info Information about the local and remote windows.\n * @param {Object} methods The keys are the names of the methods that can be called by the remote\n * while the values are the method functions.\n * @param {Promise} destructionPromise A promise resolved when destroy() is called on the penpal\n * connection.\n * @returns {Function} A function that may be called to disconnect the receiver.\n */\nvar _default = (info, methods, log) => {\n  const localName = info.localName,\n        local = info.local,\n        remote = info.remote,\n        originForSending = info.originForSending,\n        originForReceiving = info.originForReceiving;\n  let destroyed = false;\n  log(`${localName}: Connecting call receiver`);\n\n  const handleMessageEvent = event => {\n    if (event.source !== remote || event.data.penpal !== _constants.CALL) {\n      return;\n    }\n\n    if (event.origin !== originForReceiving) {\n      log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);\n      return;\n    }\n\n    const _event$data = event.data,\n          methodName = _event$data.methodName,\n          args = _event$data.args,\n          id = _event$data.id;\n    log(`${localName}: Received ${methodName}() call`);\n\n    const createPromiseHandler = resolution => {\n      return returnValue => {\n        log(`${localName}: Sending ${methodName}() reply`);\n\n        if (destroyed) {\n          // It's possible to throw an error here, but it would need to be thrown asynchronously\n          // and would only be catchable using window.onerror. This is because the consumer\n          // is merely returning a value from their method and not calling any function\n          // that they could wrap in a try-catch. Even if the consumer were to catch the error,\n          // the value of doing so is questionable. Instead, we'll just log a message.\n          log(`${localName}: Unable to send ${methodName}() reply due to destroyed connection`);\n          return;\n        }\n\n        const message = {\n          penpal: _constants.REPLY,\n          id,\n          resolution,\n          returnValue\n        };\n\n        if (resolution === _constants.REJECTED && returnValue instanceof Error) {\n          message.returnValue = (0, _errorSerialization.serializeError)(returnValue);\n          message.returnValueIsError = true;\n        }\n\n        try {\n          remote.postMessage(message, originForSending);\n        } catch (err) {\n          // If a consumer attempts to send an object that's not cloneable (e.g., window),\n          // we want to ensure the receiver's promise gets rejected.\n          if (err.name === _constants.DATA_CLONE_ERROR) {\n            remote.postMessage({\n              penpal: _constants.REPLY,\n              id,\n              resolution: _constants.REJECTED,\n              returnValue: (0, _errorSerialization.serializeError)(err),\n              returnValueIsError: true\n            }, originForSending);\n          }\n\n          throw err;\n        }\n      };\n    };\n\n    new Promise(resolve => resolve(methods[methodName].apply(methods, args))).then(createPromiseHandler(_constants.FULFILLED), createPromiseHandler(_constants.REJECTED));\n  };\n\n  local.addEventListener(_constants.MESSAGE, handleMessageEvent);\n  return () => {\n    destroyed = true;\n    local.removeEventListener(_constants.MESSAGE, handleMessageEvent);\n  };\n};\n\nexports.default = _default;\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _constants = require(\"./constants\");\n\nvar _errorCodes = require(\"./errorCodes\");\n\nvar _generateId = _interopRequireDefault(require(\"./generateId\"));\n\nvar _errorSerialization = require(\"./errorSerialization\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Augments an object with methods that match those defined by the remote. When these methods are\n * called, a \"call\" message will be sent to the remote, the remote's corresponding method will be\n * executed, and the method's return value will be returned via a message.\n * @param {Object} callSender Sender object that should be augmented with methods.\n * @param {Object} info Information about the local and remote windows.\n * @param {Array} methodNames Names of methods available to be called on the remote.\n * @param {Promise} destructionPromise A promise resolved when destroy() is called on the penpal\n * connection.\n * @returns {Object} The call sender object with methods that may be called.\n */\nvar _default = (callSender, info, methodNames, destroyConnection, log) => {\n  const localName = info.localName,\n        local = info.local,\n        remote = info.remote,\n        originForSending = info.originForSending,\n        originForReceiving = info.originForReceiving;\n  let destroyed = false;\n  log(`${localName}: Connecting call sender`);\n\n  const createMethodProxy = methodName => {\n    return function () {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      log(`${localName}: Sending ${methodName}() call`); // This handles the case where the iframe has been removed from the DOM\n      // (and therefore its window closed), the consumer has not yet\n      // called destroy(), and the user calls a method exposed by\n      // the remote. We detect the iframe has been removed and force\n      // a destroy() immediately so that the consumer sees the error saying\n      // the connection has been destroyed. We wrap this check in a try catch\n      // because Edge throws an \"Object expected\" error when accessing\n      // contentWindow.closed on a contentWindow from an iframe that's been\n      // removed from the DOM.\n\n      let iframeRemoved;\n\n      try {\n        if (remote.closed) {\n          iframeRemoved = true;\n        }\n      } catch (e) {\n        iframeRemoved = true;\n      }\n\n      if (iframeRemoved) {\n        destroyConnection();\n      }\n\n      if (destroyed) {\n        const error = new Error(`Unable to send ${methodName}() call due ` + `to destroyed connection`);\n        error.code = _errorCodes.ERR_CONNECTION_DESTROYED;\n        throw error;\n      }\n\n      return new Promise((resolve, reject) => {\n        const id = (0, _generateId.default)();\n\n        const handleMessageEvent = event => {\n          if (event.source !== remote || event.data.penpal !== _constants.REPLY || event.data.id !== id) {\n            return;\n          }\n\n          if (event.origin !== originForReceiving) {\n            log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);\n            return;\n          }\n\n          log(`${localName}: Received ${methodName}() reply`);\n          local.removeEventListener(_constants.MESSAGE, handleMessageEvent);\n          let returnValue = event.data.returnValue;\n\n          if (event.data.returnValueIsError) {\n            returnValue = (0, _errorSerialization.deserializeError)(returnValue);\n          }\n\n          (event.data.resolution === _constants.FULFILLED ? resolve : reject)(returnValue);\n        };\n\n        local.addEventListener(_constants.MESSAGE, handleMessageEvent);\n        remote.postMessage({\n          penpal: _constants.CALL,\n          id,\n          methodName,\n          args\n        }, originForSending);\n      });\n    };\n  };\n\n  methodNames.reduce((api, methodName) => {\n    api[methodName] = createMethodProxy(methodName);\n    return api;\n  }, callSender);\n  return () => {\n    destroyed = true;\n  };\n};\n\nexports.default = _default;\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _constants = require(\"./constants\");\n\nvar _errorCodes = require(\"./errorCodes\");\n\nvar _createDestructor2 = _interopRequireDefault(require(\"./createDestructor\"));\n\nvar _connectCallReceiver = _interopRequireDefault(require(\"./connectCallReceiver\"));\n\nvar _connectCallSender = _interopRequireDefault(require(\"./connectCallSender\"));\n\nvar _createLogger = _interopRequireDefault(require(\"./createLogger\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @typedef {Object} Parent\n * @property {Promise} promise A promise which will be resolved once a connection has\n * been established.\n * @property {Function} destroy A method that, when called, will disconnect any\n * messaging channels. You may call this even before a connection has been established.\n */\n\n/**\n * Attempts to establish communication with the parent window.\n * @param {Object} options\n * @param {string} [options.parentOrigin=*] Valid parent origin used to restrict communication.\n * @param {Object} [options.methods={}] Methods that may be called by the parent window.\n * @param {Number} [options.timeout] The amount of time, in milliseconds, Penpal should wait\n * for the parent to respond before rejecting the connection promise.\n * @return {Parent}\n */\nvar _default = function _default() {\n  let _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n      _ref$parentOrigin = _ref.parentOrigin,\n      parentOrigin = _ref$parentOrigin === void 0 ? '*' : _ref$parentOrigin,\n      _ref$methods = _ref.methods,\n      methods = _ref$methods === void 0 ? {} : _ref$methods,\n      timeout = _ref.timeout,\n      debug = _ref.debug;\n\n  const log = (0, _createLogger.default)(debug);\n\n  if (window === window.top) {\n    const error = new Error('connectToParent() must be called within an iframe');\n    error.code = _errorCodes.ERR_NOT_IN_IFRAME;\n    throw error;\n  }\n\n  const _createDestructor = (0, _createDestructor2.default)(),\n        destroy = _createDestructor.destroy,\n        onDestroy = _createDestructor.onDestroy;\n\n  const child = window;\n  const parent = child.parent;\n  const promise = new Promise((resolveConnectionPromise, reject) => {\n    let connectionTimeoutId;\n\n    if (timeout !== undefined) {\n      connectionTimeoutId = setTimeout(() => {\n        const error = new Error(`Connection to parent timed out after ${timeout}ms`);\n        error.code = _errorCodes.ERR_CONNECTION_TIMEOUT;\n        reject(error);\n        destroy();\n      }, timeout);\n    }\n\n    const handleMessageEvent = event => {\n      // Under niche scenarios, we get into this function after\n      // the iframe has been removed from the DOM. In Edge, this\n      // results in \"Object expected\" errors being thrown when we\n      // try to access properties on window (global properties).\n      // For this reason, we try to access a global up front (clearTimeout)\n      // and if it fails we can assume the iframe has been removed\n      // and we ignore the message event.\n      try {\n        clearTimeout();\n      } catch (e) {\n        return;\n      }\n\n      if (event.source !== parent || event.data.penpal !== _constants.HANDSHAKE_REPLY) {\n        return;\n      }\n\n      if (parentOrigin !== '*' && parentOrigin !== event.origin) {\n        log(`Child received handshake reply from origin ${event.origin} which did not match expected origin ${parentOrigin}`);\n        return;\n      }\n\n      log('Child: Received handshake reply');\n      child.removeEventListener(_constants.MESSAGE, handleMessageEvent);\n      const info = {\n        localName: 'Child',\n        local: child,\n        remote: parent,\n        originForSending: event.origin === 'null' ? '*' : event.origin,\n        originForReceiving: event.origin\n      };\n      const callSender = {};\n      const destroyCallReceiver = (0, _connectCallReceiver.default)(info, methods, log);\n      onDestroy(destroyCallReceiver);\n      const destroyCallSender = (0, _connectCallSender.default)(callSender, info, event.data.methodNames, destroy, log);\n      onDestroy(destroyCallSender);\n      clearTimeout(connectionTimeoutId);\n      resolveConnectionPromise(callSender);\n    };\n\n    child.addEventListener(_constants.MESSAGE, handleMessageEvent);\n    onDestroy(() => {\n      child.removeEventListener(_constants.MESSAGE, handleMessageEvent);\n      const error = new Error('Connection destroyed');\n      error.code = _errorCodes.ERR_CONNECTION_DESTROYED;\n      reject(error);\n    });\n    log('Child: Sending handshake');\n    parent.postMessage({\n      penpal: _constants.HANDSHAKE,\n      methodNames: Object.keys(methods)\n    }, parentOrigin);\n  });\n  return {\n    promise,\n    destroy\n  };\n};\n\nexports.default = _default;\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DATA_CLONE_ERROR = exports.MESSAGE = exports.REJECTED = exports.FULFILLED = exports.REPLY = exports.CALL = exports.HANDSHAKE_REPLY = exports.HANDSHAKE = void 0;\nconst HANDSHAKE = 'handshake';\nexports.HANDSHAKE = HANDSHAKE;\nconst HANDSHAKE_REPLY = 'handshake-reply';\nexports.HANDSHAKE_REPLY = HANDSHAKE_REPLY;\nconst CALL = 'call';\nexports.CALL = CALL;\nconst REPLY = 'reply';\nexports.REPLY = REPLY;\nconst FULFILLED = 'fulfilled';\nexports.FULFILLED = FULFILLED;\nconst REJECTED = 'rejected';\nexports.REJECTED = REJECTED;\nconst MESSAGE = 'message';\nexports.MESSAGE = MESSAGE;\nconst DATA_CLONE_ERROR = 'DataCloneError';\nexports.DATA_CLONE_ERROR = DATA_CLONE_ERROR;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _default = () => {\n  const callbacks = [];\n  let destroyed = false;\n  return {\n    destroy() {\n      destroyed = true;\n      callbacks.forEach(callback => {\n        callback();\n      });\n    },\n\n    onDestroy(callback) {\n      destroyed ? callback() : callbacks.push(callback);\n    }\n\n  };\n};\n\nexports.default = _default;\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _default = debug => {\n  return function () {\n    if (debug) {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      console.log('[Penpal]', ...args); // eslint-disable-line no-console\n    }\n  };\n};\n\nexports.default = _default;\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ERR_NO_IFRAME_SRC = exports.ERR_NOT_IN_IFRAME = exports.ERR_CONNECTION_TIMEOUT = exports.ERR_CONNECTION_DESTROYED = void 0;\nconst ERR_CONNECTION_DESTROYED = 'ConnectionDestroyed';\nexports.ERR_CONNECTION_DESTROYED = ERR_CONNECTION_DESTROYED;\nconst ERR_CONNECTION_TIMEOUT = 'ConnectionTimeout';\nexports.ERR_CONNECTION_TIMEOUT = ERR_CONNECTION_TIMEOUT;\nconst ERR_NOT_IN_IFRAME = 'NotInIframe';\nexports.ERR_NOT_IN_IFRAME = ERR_NOT_IN_IFRAME;\nconst ERR_NO_IFRAME_SRC = 'NoIframeSrc';\nexports.ERR_NO_IFRAME_SRC = ERR_NO_IFRAME_SRC;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.deserializeError = exports.serializeError = void 0;\n\n/**\n * Converts an error object into a plain object.\n * @param {Error} Error object.\n * @returns {Object}\n */\nconst serializeError = (_ref) => {\n  let name = _ref.name,\n      message = _ref.message,\n      stack = _ref.stack;\n  return {\n    name,\n    message,\n    stack\n  };\n};\n/**\n * Converts a plain object into an error object.\n * @param {Object} Object with error properties.\n * @returns {Error}\n */\n\n\nexports.serializeError = serializeError;\n\nconst deserializeError = obj => {\n  const deserializedError = new Error();\n  Object.keys(obj).forEach(key => deserializedError[key] = obj[key]);\n  return deserializedError;\n};\n\nexports.deserializeError = deserializeError;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nlet id = 0;\n/**\n * @return {number} A unique ID (not universally unique)\n */\n\nvar _default = () => ++id;\n\nexports.default = _default;\nmodule.exports = exports.default;","/* globals __webpack_amd_options__ */\r\nmodule.exports = __webpack_amd_options__;\r\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1, eval)(\"this\");\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport ErrorLevel from './core/error/error-level';\nimport OrientationEnum from './core/orientation/orientation-enum';\n\nexport default {\n  // IdentifikÃ¡tor aplikace.\n  name: 'player-lighter',\n  // VÃ½chozÃ­ hodnota deaktivace preventivnÃ­ restartu.\n  // Pokud je \"true\", ostatnÃ­ preventivnÃ­ restart se neprovÃ¡nÃ­\n  // a ostatnÃ­ nastavenÃ­ se ignorujÃ­.\n  // PouÅ¾ije se v pÅ™Ã­padÄ›, Å¾e toto nastavenÃ­ nenÃ­ vyplnÄ›no na serveru.\n  autorebootDefaultDisabled: false,\n  // VÃ½chozÃ­ interval, ve kterÃ©m se zaÅ™Ã­zenÃ­ preventivnÄ› restartuje. [ms]\n  // PouÅ¾ije se v pÅ™Ã­padÄ›, Å¾e toto nastavenÃ­ nenÃ­ vyplnÄ›no na serveru.\n  autorebootDefaultInterval: 48 * 60 * 60 * 1000,\n  // MinimÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na automatickÃ½ restart zaÅ™Ã­zenÃ­.\n  // PÅ™Ã­liÅ¡ nÃ­zkÃ¡ hodnota mÅ¯Å¾e zpÅ¯sobit zacyklenÃ­ zaÅ™Ã­zenÃ­ v nekoneÄ�nÃ©\n  // smyÄ�ce restrartÅ¯.\n  // PÅ™Ã­liÅ¡ vysokÃ¡ hodnota znesnadnÃ­ E2E testy dlouhÃ½m Ä�ekÃ¡nÃ­m.\n  autorebootMinInterval: 15 * 60 * 1000,\n  // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na Cordova deviceready. [ms]\n  // Hodnota pochÃ¡zÃ­ z Cordova implementace, kterÃ¡ provÃ¡dÃ­ vlastnÃ­ kontrolu\n  // a vÃ½pis do konzole.\n  cordovaBootDelay: 5 * 1000,\n  // ZaÅ™Ã­zenÃ­.\n  device: {\n    // StahovaÄ� souborÅ¯.\n    downloader: {\n      // VÃ½chozÃ­ velikost souboru, pro kterou se mÃ¡ uvolnit mÃ­sto. [B]\n      defaultSize: 1024 * 1024 * 1024\n    },\n    // KomunikÃ¡tor se serverem.\n    communicator: {\n      // VÃ½chozÃ­ doba Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem o synchronizaci. [ms]\n      syncDelayBase: 60 * 1000\n      // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem o synchronizaci po neÃºspÄ›chu. [ms]\n      // TODO #5 ZatÃ­m deaktivovÃ¡no. Zpracovat dle novÃ© logiky.\n      // syncDelayMax: 4 * 60 * 1000,\n      // NÃ¡sobitel doby Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem pÅ™i neÃºspÄ›chu.\n      // TODO #5 ZatÃ­m deaktivovÃ¡no. Zpracovat dle novÃ© logiky.\n      // syncDelayMultiplier: 2\n    },\n    // Orientace zaÅ™Ã­zenÃ­.\n    orientation: {\n      // VÃ½chozÃ­ orientace zaÅ™Ã­zenÃ­.\n      defaultOrientationEnum: OrientationEnum.CLOCKWISE_0\n    },\n    // SezenÃ­ - rÅ¯znÃ© konfigurace zaÅ™Ã­zenÃ­.\n    session: {\n      // IdentifikÃ¡tor session, kterÃ¡ se naÄ�te pÅ™i startu aplikace.\n      defaultId: 'default'\n    }\n  },\n  // Port, na kterÃ©m je spuÅ¡tÄ›nÃ½ localhost HTTP server se souborovÃ½m systÃ©mem.\n  fileSystemLocalhostPort: 7587,\n  // Firmware zaÅ™Ã­zenÃ­.\n  firmware: {\n    // VÃ½chozÃ­ velikost firmware, pro kterou se mÃ¡ uvolnit mÃ­sto. [B]\n    defaultSize: 1024 * 1024 * 1024\n  },\n  // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na naÄ�tenÃ­ iframe. [ms]\n  htmlIframeLoadDelay: 60 * 1000,\n  // MaximÃ¡lnÃ­ poÄ�et plÃ¡novÃ¡nÃ­ opakovanÃ½ch udÃ¡lostÃ­, kterÃ½ je nutnÃ½\n  // pro prevenci zacyklenÃ­ a zkrÃ¡cenÃ­ doby vÃ½poÄ�tu v kalendÃ¡Å™i.\n  // Omezuje se poÄ�et opakovÃ¡nÃ­, nikoliv doba, po kterou se opakovÃ¡nÃ­ provÃ¡dÃ­.\n  // NejmenÅ¡Ã­ interval opakovÃ¡nÃ­ je jeden den, z Ä�ehoÅ¾ lze pÅ™i vÃ½poÄ�tu vychÃ¡zet.\n  // OstatnÃ­ druh opakovÃ¡nÃ­ (tÃ½dennÃ­, ...) se budou opakovat po delÅ¡Ã­ dobu.\n  // TaktÃ©Å¾ opakovÃ¡nÃ­ ve vÄ›tÅ¡Ã­m intervalu (2 dny, ...) nebudou tolik omezenÃ©.\n  // VÃ½chozÃ­ hodnotou IcalExpander je 1000 opakovÃ¡nÃ­, tedy cca. 3 roky.\n  // Na serveru je kalendÃ¡Å™ v rozsahu +-5 let od aktuÃ¡lnÃ­ho data\n  // tzn. rozsah 10 let, coÅ¾ je v nejhorÅ¡Ã­m pÅ™Ã­padÄ› 10 * 365 opakovÃ¡nÃ­.\n  icalPlannerMaxIterations: 5 * 365,\n  // Rozsah verzÃ­ Ki-Wi Lighter API se kterÃ½mi je aplikace kompatibilnÃ­.\n  // Je zaloÅ¾eno na semver specifikaci a lze vyuÅ¾Ã­t jejÃ­ syntaxi.\n  // Typicky se pouÅ¾Ã­vÃ¡ syntaxe '^1.3.7', coÅ¾ znamenÃ¡ \"kompatibilnÃ­ s 1.3.7\"\n  // a pÅ™esnÄ› to odpovÃ­dÃ¡ rozsahu verzÃ­ >=1.3.7 a <2.0.0.\n  kiwiLighterApiVersion: '0.11.*',\n  // MaximÃ¡lnÃ­ doba, na kterou je moÅ¾nÃ© nastavit Ä�asovaÄ�.\n  // Hodnota odpovÃ­dÃ¡ maximu pro 32 bitovÃ½ integer a vychÃ¡zÃ­ z implementace,\n  // kterou pouÅ¾Ã­vÃ¡ vÄ›tÅ¡ina rozÅ¡Ã­Å™enÃ½ch prohlÃ­Å¾eÄ�Å¯.\n  longTimersMaxDelay: Math.pow(2, 31) - 1,\n  // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ na navÃ¡zÃ¡nÃ­ komunikace s PDF prohlÃ­Å¾eÄ�em. [ms]\n  pdfConnectionTimeout: 5 * 1000,\n  // PoÄ�et strÃ¡nek PDF dokumentu, kterÃ© se pÅ™ehrajÃ­ za jednu vteÅ™inu. [Hz]\n  // Na zÃ¡kladÄ› tÃ©to hodnoty se urÄ�uje vÃ½chozÃ­ rychlost pÅ™ehrÃ¡vÃ¡nÃ­ PDF dokumentu.\n  pdfPageRate: 0.1,\n  // MaximÃ¡lnÃ­ poÄ�et souÄ�asnÄ› zobrazovanÃ½ch PDF.\n  pdfSourceMax: 3,\n  // PlatformnÄ› specifickÃ¡ nastavenÃ­.\n  platform: {\n    tizenSssp4: {\n      // MinimÃ¡lnÃ­ poÄ�et sekund od zaÄ�Ã¡tku epochy, po kterÃ©m se aplikace mÅ¯Å¾e spustit. [s]\n      booterClockLimit: new Date(2000, 0).getTime(),\n      // Interval, ve kterÃ©m se kontroluje, jestli je jiÅ¾ prostÅ™edÃ­ pÅ™ipraveno\n      // pro start aplikace. [ms]\n      // SouvisÃ­ s Tizen bugem, kdy nÄ›kdy nenÃ­ dostupnÃ½ aktuÃ¡lnÃ­ Ä�as (viz #230).\n      booterRetryDelay: 500,\n      // Prodleva pÅ™ed synchronizacÃ­ globÃ¡lnÃ­ch a B2B hodin. [ms]\n      // Televize Samsung obsahujÃ­ dvoje hodiny -- jedny globÃ¡lnÃ­, ke kterÃ½m se\n      // pÅ™istupuje pomocÃ­ standardnÃ­ho JavaScriptovÃ©ho API (`Date` apod.), druhÃ©\n      // v rÃ¡mci B2B API. Tyto dva zdroje nejsou synchronizovanÃ© a B2B hodiny se\n      // navÃ­c pÅ™i provozu samovolnÄ› zpoÅ¾Ä�ujÃ­. ÄŒasovaÄ�e zapnutÃ­ a vypnutÃ­ se Å™Ã­dÃ­\n      // prÃ¡vÄ› B2B hodinami, proto je naÅ¡Ã­m niternÃ½m zÃ¡jmem, aby byly bÄ›hem provozu\n      // aktuÃ¡lnÃ­ a co nejmÃ©nÄ› pozadu.\n      clockSyncInterval: 24 * 60 * 60 * 1000\n    }\n  },\n  // ÃšroveÅˆ dÅ¯leÅ¾itosti chyby, od kterÃ© se zaÄ�Ã­najÃ­ odesÃ­lat udÃ¡losti na Sentry.\n  // Chyby s niÅ¾Å¡Ã­ prioritou jsou zalogovÃ¡ny jako breadcrumbs a jsou odeslÃ¡ny\n  // pouze jako dodateÄ�nÃ¡ informace k nÄ›jakÃ© budoucÃ­ chybÄ›, kterÃ¡ bude mÃ­t\n  // stejnou nebo vyÅ¡Å¡Ã­ prioritu, neÅ¾ je zde stanovenÃ¡ ÃºroveÅˆ.\n  sentryCaptureErrorLevel: ErrorLevel.Error,\n  // MaximÃ¡lnÃ­ poÄ�et perzistentnÄ› uloÅ¾enÃ½ch vÃ½jimek v offline stavu.\n  // Je nutnÃ© nastavit na nÃ­zkou hodnotu, jinak hrozÃ­ zaplnÄ›nÃ­ localStorage.\n  sentryMaxEvents: 5,\n  // Setup Wizard pro instalaci zaÅ™Ã­zenÃ­.\n  setup: {\n    // Doba mezi pokusy o automatickou registraci na zÃ¡kladÄ› otisku. [ms]\n    automaticDelay: 60 * 1000,\n    // VÃ½chozÃ­ hodnota formulÃ¡Å™ovÃ©ho pole s nÃ¡zvem zaÅ™Ã­zenÃ­.\n    deviceName: '',\n    // VÃ½chozÃ­ doba Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem pÅ™i neÃºspÄ›chu. [ms]\n    failureDelayBase: 60 * 1000,\n    // MaximÃ¡lnÃ­ doba Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem po neÃºspÄ›chu. [ms]\n    failureDelayMax: 4 * 60 * 1000,\n    // NÃ¡sobitel doby Ä�ekÃ¡nÃ­ pÅ™ed novÃ½m pokusem pÅ™i neÃºspÄ›chu.\n    failureDelayMultiplier: 2,\n    // VÃ½chozÃ­ hodnota formulÃ¡Å™ovÃ©ho pole s heslem uÅ¾ivatele.\n    password: '',\n    // VÃ½chozÃ­ hodnota formulÃ¡Å™ovÃ©ho pole s URL serveru.\n    serverUrl: 'https://server.ki-wi.cz/kiwi-server',\n    // Doba Ä�ekÃ¡nÃ­ pÅ™i zobrazenÃ­ obazovky o ÃºspÄ›Å¡nÃ©n nastavenÃ­. [ms]\n    successDelay: 5 * 1000,\n    // VÃ½chozÃ­ hodnota formulÃ¡Å™ovÃ©ho pole s pÅ™ihlaÅ¡ovacÃ­m jmÃ©nem uÅ¾ivatele.\n    username: ''\n  },\n  // VÃ½chozÃ­ mÃ©dia typ streamÅ¯, kterÃ½ se pouÅ¾ije,\n  // pokud nemÃ¡ mÃ©dium Å¾Ã¡dnÃ½ typ definovÃ¡n.\n  streamDefaultContainer: 'video/mp4',\n  // MaximÃ¡lnÃ­ poÄ�et Ä�asovaÄ�Å¯, kterÃ½ je dovolen nastavit.\n  // Na SSSP je poÄ�et omezen na 7 Ä�asovaÄ�Å¯ zapnutÃ­ a 7 Ä�asovaÄ�Å¯ vypnutÃ­.\n  // ÄŒasovaÄ�e nad tento limit jsou ignorovÃ¡ny.\n  // Na webOS je situace podobnÃ¡ a TV nedovolÃ­ nastavit vÃ­ce Ä�asovaÄ�Å¯ 7 + 7.\n  // PÅ™i pokusu o nastavenÃ­ dalÅ¡Ã­ho Ä�asovaÄ�e dojde k chybÄ› pÅ™i volÃ¡nÃ­ metody.\n  // Informace o tomto limitu v dokumentaci chybÃ­, ale byla potvrzena na fÃ³ru.\n  timerMax: 7,\n  // ProlÃ­naÄ� mÃ©diÃ­.\n  viewer: {\n    // ZpoÅ¾dÄ›nÃ­, kterÃ© se aplikuje pÅ™i detekovanÃ©m zacyklenÃ­. [ms]\n    errorDelay: 1 * 1000,\n    // PoÄ�et po sobÄ› jdoucÃ­ch selhanÃ½ch mÃ©diÃ­, kterÃ© se povaÅ¾ujÃ­ za zacyklenÃ­.\n    errorLimit: 10,\n    // MaximÃ¡lnÃ­ poÄ�et mÃ©diÃ­, kterÃ© se pÅ™eskoÄ�Ã­ pÅ™i pokusu o pÅ™ednaÄ�tenÃ­ nÃ¡sledujÃ­cÃ­ho slajdu.\n    // Po dosaÅ¾enÃ­ limitu se pokus o naÄ�tenÃ­ zruÅ¡Ã­ a nÃ¡sledujÃ­cÃ­ mÃ©dium pÅ™ehraje bez pÅ™ednaÄ�tenÃ­.\n    // ÄŒÃ­m vÄ›tÅ¡Ã­ hodnota, tÃ­m nÃ¡roÄ�nÄ›jÅ¡Ã­ je vyhledÃ¡nÃ­ slajdu k naÄ�tenÃ­.\n    // Pokud by bylo neomezeno, tak hrozÃ­ deadlock,\n    // kdy se mÅ¯Å¾e hledat vhodnÃ© mÃ©dium do nekoneÄ�na a nedojde k uvolnÄ›nÃ­ pÅ™ehrÃ¡vanÃ©ho zdroje.\n    loadLimit: 10\n  }\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÃšroveÅˆ dÅ¯leÅ¾itosti chyby.\n * VychÃ¡zÃ­ z ÃºrovnÃ­ zavedenÃ½ch v Console API pod pojmenovÃ¡nÃ­m `logLevel`.\n * ÃšrovnÄ› majÃ­ nÃ¡sledujÃ­cÃ­ prioritu:\n * `Error` > `Warning` > `Info` > `Log` > `Debug`.\n *\n * Zdroje:\n * - [Console API](https://console.spec.whatwg.org/)\n * @enum {string}\n */\nconst ErrorLevel = {\n  /** Verbose debug log which is usually hidden by default. */\n  Debug: 'Debug',\n  /** Critical error which can lead to an unexpected bahaviour or a crash. */\n  Error: 'Error',\n  /** Informative log with a slightly higher than low significance. */\n  Info: 'Info',\n  /** Common log with a low significance. */\n  Log: 'Log',\n  /** Warning about an unusual state which won't affect the script execution. */\n  Warning: 'Warning'\n};\n\nexport default ErrorLevel;\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n/**\n * ÄŒÃ­selnÃ­k orientacÃ­ obrazovky.\n * @enum {string}\n * @name OrientationEnum\n */\nexport default {\n  CLOCKWISE_0: 'CLOCKWISE_0',\n  CLOCKWISE_90: 'CLOCKWISE_90',\n  CLOCKWISE_180: 'CLOCKWISE_180',\n  CLOCKWISE_270: 'CLOCKWISE_270'\n};\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @file HlavnÃ­ skript PDF aplikace potomka, kterÃ½ ovlÃ¡dÃ¡ PDF pÅ™ehrÃ¡vaÄ�.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\n// One-line definice zÃ¡vislostÃ­ pro snaÅ¾Å¡Ã­ merge.\n/* eslint-disable max-len */\n\n// Toto je jedinÃ½ skript, kterÃ½ by mÄ›l pÅ™istupovat k neobvyklÃ½m globÃ¡lnÃ­m promÄ›nnÃ½m.\n// Pokud jsou ve zbytku aplikace potÅ™eba jejich data, tak by jim mÄ›li bÃ½t pÅ™edÃ¡ny v konstruktoru.\n/* global PDFViewerApplication, PDFViewerApplicationOptions */\n\nimport Bottle from 'bottlejs';\nimport connectToParent from 'penpal/lib/connectToParent';\n\n// TODO #238 ZbyteÄ�nÃ¡ duplikace vÅ¡ech config hodnot.\nimport config from '../../config';\nimport PdfChild from './pdf-child';\n\ndocument.addEventListener('webviewerloaded', () => {\n  // SestavenÃ­ zÃ¡vislostÃ­ a spuÅ¡tÄ›nÃ­ aplikace.\n  Bottle.config.strict = true;\n  new Bottle()\n  .constant('Document', document)\n  .constant('PDFViewerApplication', PDFViewerApplication)\n  .constant('PDFViewerApplicationOptions', PDFViewerApplicationOptions)\n  .constant('PenpalConnectToParent', connectToParent)\n  .constant('origin', location.origin)\n  .constant('pdfPageRate', config.pdfPageRate)\n  .service('PdfChild', PdfChild, 'PDFViewerApplication', 'PDFViewerApplicationOptions', 'PenpalConnectToParent', 'Document', 'origin', 'pdfPageRate')\n  .container.PdfChild.start();\n});\n","/**\n * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>\n * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>\n * @copyright Ki-Wi Digital s.r.o.\n * @license\n * All Rights Reserved.\n * Unauthorized copying of this file is strictly prohibited.\n * Proprietary and confidential.\n */\n\nimport noop from 'lodash/noop';\n\n// TODO #295 Zrevidovat odchytÃ¡vÃ¡nÃ­ chyb.\n// TODO #295 LepÅ¡Ã­ napojenÃ­ parent?\n// - ZatÃ­m vÅ¡ude volÃ¡nÃ­ `connection.promise` pro pÅ™Ã­stup k parent.\n// - PÅ™edÃ¡vat parent v parametrech? NynÃ­ je to hroznÃ½ zmatek.\n// - RozdÄ›lit aktuÃ¡lnÃ­ tÅ™Ã­du na dvÄ›,\n//   pÅ™iÄ�emÅ¾ v konstruktoru jednoho bude parent a u druhÃ©ho origin.\n//   Jak ale pak zpracovat `connectToParent`, kde je nutnÃ© navÃ¡zat metody?\n/**\n * Potomek, kterÃ½ ovlÃ¡dÃ¡ PDF pÅ™ehrÃ¡vaÄ�.\n * Je naÄ�tenÃ½ uvnitÅ™ iframe a komunikuje s rodiÄ�em,\n * kterÃ½ ho vytvoÅ™il.\n * PodrobnÄ›jÅ¡Ã­ popis mechanizmu lze nalÃ©zt u {@link PdfParent}.\n * @implements {Destroyable}\n * @implements {PdfMessage}\n */\nclass PdfChild {\n  /**\n   * VytvoÅ™Ã­ instanci.\n   * @param {PDFViewerApplication} app\n   * @param {PDFViewerApplicationOptions} appOptions\n   * @param {PenpalConnectToParent} connectToParent\n   * @param {Document} document\n   * @param {string} origin Origin, kterÃ½ budou mÃ­t zprÃ¡vy od rodiÄ�e.\n   * @param {number} pageRate PoÄ�et strÃ¡nek, kterÃ© se pÅ™ehrajÃ­ za jednu vteÅ™inu. [Hz]\n   */\n  constructor (app, appOptions, connectToParent, document, origin, pageRate) {\n    this.app = app;\n    this.appOptions = appOptions;\n    this.canplay = false;\n    this.document = document;\n    this.duration = NaN;\n    this.interval = null;\n    this.onError = this.onError.bind(this);\n    this.onInterval = this.onInterval.bind(this);\n    this.onPagesinit = this.onPagesinit.bind(this);\n    this.onPassword = this.onPassword.bind(this);\n    this.pageRate = pageRate;\n    this.paused = true;\n    this.playbackRate = 1;\n    this.src = '';\n    // NavÃ¡zÃ¡nÃ­ spojenÃ­ s rodiÄ�ovskou aplikacÃ­.\n    this.connection = connectToParent({\n      methods: {\n        getSrc: this.getSrc.bind(this),\n        pause: this.pause.bind(this),\n        play: this.play.bind(this),\n        setCurrentPage: this.setCurrentPage.bind(this),\n        setPlaybackRate: this.setPlaybackRate.bind(this),\n        setSrc: this.setSrc.bind(this)\n      },\n      parentOrigin: origin\n    });\n  }\n\n  /** @inheritdoc */\n  destroy () {\n    const {document} = this;\n    document.removeEventListener('PDFViewerApplicationError', this.onError);\n    document.removeEventListener('PDFViewerApplicationPassword', this.onPassword);\n    document.removeEventListener('pagesinit', this.onPagesinit);\n    this.connection.destroy();\n    this.pause();\n  }\n\n  /**\n   * ZjistÃ­ zdroj PDF.\n   * Zdroje:\n   * [HTMLMediaElement.src](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/src).\n   * @returns {string} URL adresa souboru s PDF.\n   */\n  getSrc () {\n    return this.src;\n  }\n\n  /**\n   * OÅ¡etÅ™enÃ­ chyby jejÃ­m zaslÃ¡nÃ­ rodiÄ�ovi.\n   * @param {Error} error\n   * @private\n   * @returns {Promise.<undefined>}\n   */\n  handleError (error) {\n    return this.connection.promise.then((parent) => (\n      parent.error(error.message)\n    ));\n  }\n\n  /**\n   * Resetuje naÄ�tenÃ­ PDF do vÃ½chozÃ­ho stavu.\n   * Zdroje:\n   * [HTMLMediaElement.load](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/load).\n   * @private\n   * @returns {undefined}\n   */\n  load () {\n    // TODO #295 Implementace load dle specifikace:\n    // - https://html.spec.whatwg.org/multipage/media.html#media-element-load-algorithm\n    // - ZatÃ­m nenÃ­ zveÅ™ejnÄ›no v PdfParent, kvÅ¯li nedokonalosti.\n    // - OpakovanÃ© volÃ¡nÃ­ nefunguje spolehlivÄ› vÄ�etnÄ› pakovanÃ©ho nastavenÃ­ src.\n    // - If the paused attribute is false, then...\n    // - Set the current playback position to 0.\n    // - Update the duration attribute to Not-a-Number (NaN).\n    //   The user agent will not fire a durationchange event for this particular change of the duration.\n    const {src} = this;\n    if (src === this.app.url) {\n      this.processMetadata();\n      return;\n    }\n    this.canplay = false;\n    // OtevÅ™enÃ­ dokumentu PDF aplikacÃ­.\n    // Na vÃ½sledek se neÄ�ekÃ¡, komunikace se realizuje pÅ™es udÃ¡losti.\n    this.app.open(this.src)\n    // Chyby se odchytÃ¡vajÃ­ pomocÃ­ udÃ¡lostÃ­. Zde se ignorujÃ­.\n    .catch(noop);\n  }\n\n  /**\n   * Reakce na vznik chyby v PDF prohlÃ­Å¾eÄ�i.\n   * PÅ¯vodnÃ­ reakcÃ­ je vÃ½pis tÄ›chto informacÃ­ do GUI\n   * @param {CustomEvent.<PDFViewerApplicationError>} event\n   * @private\n   * @returns {undefined}\n   */\n  onError (event) {\n    // TODO #295 VyuÅ¾Ã­t data v PDFViewerApplicationError#moreInfo.\n    // TODO #295 NemÄ›lo by se dle specifikace zastavit pÅ™ehrÃ¡vÃ¡nÃ­?\n    const error = new Error(event.detail.message);\n    this.handleError(error);\n  }\n\n  /**\n   * Reakce na aktivaci intervalu pÅ™ehrÃ¡vÃ¡nÃ­.\n   * V tomto intervalu se pÅ™epÃ­nÃ¡ na dalÅ¡Ã­ strÃ¡nku.\n   * @private\n   * @returns {undefined}\n   */\n  onInterval () {\n    this.connection.promise.then((parent) => {\n      const {app} = this;\n      const nextPage = app.page + 1;\n      if (app.pagesCount < nextPage) {\n        // Po dosaÅ¾enÃ­ konce dokumentu se zastavÃ­ pÅ™ehrÃ¡vÃ¡nÃ­\n        // a odeÅ¡le se zprÃ¡va na server.\n        this.pause();\n        return parent.ended();\n      }\n      app.page = nextPage;\n    });\n  }\n\n  /**\n   * Reakce na vygenerovÃ¡nÃ­ vÅ¡ech strÃ¡nek PDF dokumentu do HTML.\n   * SamotnÃ© strÃ¡nky jsou prÃ¡zdnÃ© a zaÄ�Ã­nÃ¡ jejich vykreslovÃ¡nÃ­ dle aktuÃ¡lnÄ› zobrazenÃ©.\n   * NejdÅ™Ã­ve v tento okamÅ¾ik je moÅ¾nÃ© pÅ™epnout do fullscreen.\n   * LimitujÃ­cÃ­ je test na `viewer.hasChildNodes()`.\n   * TakÃ© je od tohoto okamÅ¾iku moÅ¾nÃ½ posuv v dokumentu.\n   * @private\n   * @returns {undefined}\n   */\n  onPagesinit () {\n    this.app.requestPresentationMode();\n    this.canplay = true;\n    this.processMetadata();\n  }\n\n  /**\n   * Reakce na poÅ¾adavek na zadÃ¡nÃ­ hesla.\n   * NenÃ­ zde uÅ¾ivatel, kterÃ½ by heslo zadal,\n   * tak se vyvolÃ¡ chyba.\n   * @private\n   * @returns {undefined}\n   */\n  onPassword () {\n    this.connection.promise.then((parent) => {\n      parent.error('PDF is password protected.');\n    });\n  }\n\n  /**\n   * PozastavÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ PDF.\n   * Zdroje:\n   * [HTMLMediaElement.pause](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/pause).\n   * @returns {undefined}\n   */\n  pause () {\n    this.stopInterval();\n    this.paused = true;\n  }\n\n  /**\n   * SpustÃ­ pÅ™ehrÃ¡vÃ¡nÃ­ PDF, bÄ›hem kterÃ©ho se v poÅ¾adovanÃ©m intervalu\n   * prochÃ¡zÃ­ jednotlivÃ½mi strÃ¡nkami dokumentu.\n   * Zdroje:\n   * [HTMLMediaElement.play](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play).\n   * @returns {undefined}\n   */\n  play () {\n    // TODO #295 Implementace play dle specifikace:\n    // - https://html.spec.whatwg.org/multipage/media.html#playing-the-media-resource\n    // - Nefunguje napÅ™. volÃ¡nÃ­ play bez src a dalÅ¡Ã­ krajnÃ­ stavy.\n    this.paused = false;\n    // ZjednoduÅ¡enÃ¡ implementace nahrazujÃ­cÃ­ task queue.\n    if (!this.canplay) {\n      // Pokud jeÅ¡tÄ› nenÃ­ dokument pÅ™ipravenÃ½ na strÃ¡nkovÃ¡nÃ­,\n      // tak se nic nedÄ›je.\n      return;\n    }\n    return this.startInterval();\n  }\n\n  /**\n   * Once enough of the media data has been fetched\n   * to determine the duration of the media resource, its dimensions, and other metadata.\n   * @returns {undefined}\n   */\n  processMetadata () {\n    this.connection.promise.then((parent) => {\n      // Set the playback position to the earliest possible position.\n      this.app.page = 1;\n      // Update the duration attribute with the time of the last frame of the resource.\n      const duration = this.app.pagesCount / this.pageRate;\n      this.duration = duration;\n      // Fire an event named durationchange at the element at this point.\n      parent.durationchange(duration);\n      // ZjednoduÅ¡enÃ¡ implementace nahrazujÃ­cÃ­ task queue.\n      if (this.paused) {\n        // Pokud nenÃ­ poÅ¾adovÃ¡no zahÃ¡jenÃ­ pÅ™ehrÃ¡vÃ¡nÃ­,\n        // tak se nic nedÄ›je.\n        return;\n      }\n      return this.startInterval();\n    });\n  }\n\n  /**\n   * Restart intervalu pÅ™ehrÃ¡vÃ¡nÃ­, bÄ›hem kterÃ©ho se\n   * prochÃ¡zÃ­ jednotlivÃ½mi strÃ¡nkami dokumentu.\n   * @private\n   * @returns {undefined}\n   */\n  restartInterval () {\n    this.stopInterval();\n    this.startInterval();\n  }\n\n  /**\n   * NastavÃ­ aktuÃ¡lnÄ› zobrazenou stranu v PDF.\n   * Zdroje:\n   * [HTMLMediaElement.currentTime](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/currentTime).\n   * @param {number} page ÄŒÃ­slo strany, prvnÃ­ je 1.\n   * @returns {undefined}\n   */\n  setCurrentPage (page) {\n    if (!this.paused) {\n      // Restart intervalu zobrazenÃ­ strany pÅ™i pÅ™ehrÃ¡vÃ¡nÃ­.\n      this.restartInterval();\n    }\n    this.app.page = page;\n  }\n\n  /**\n   * NastavÃ­ rychlost pÅ™ehrÃ¡vÃ¡nÃ­ PDF.\n   * Zdroje:\n   * [HTMLMediaElement.playbackRate](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/playbackRate).\n   * @param {number} playbackRate Rychlost pÅ™ehrÃ¡vÃ¡nÃ­ PDF, kde 0 je zastaveno a 1 je vÃ½chozÃ­ rychlost.\n   * @returns {Promise.<undefined>}\n   */\n  setPlaybackRate (playbackRate) {\n    try {\n      if (!(Number.isFinite(playbackRate) && playbackRate > 0)) {\n        // TODO NenÃ­ podporovÃ¡na nulovÃ¡ hodnota.\n        // - The element's playbackRate can be 0.0,\n        //   in which case the current playback position doesn't move,\n        //   despite playback not being paused (paused doesn't become true,\n        //   and the pause event doesn't fire).\n        // - V tÃ©to implementaci by mÄ›lo odpovÃ­dat nespuÅ¡tÄ›nÃ­ intervalu,\n        //   to by mohlo vyÅ¾adovat nÄ›jakÃ© Ãºpravy, zatÃ­m asi zakÃ¡zat.\n        // TODO NenÃ­ podporovÃ¡na zÃ¡pornÃ¡ hodnota.\n        // - Specifikace dovoluje, ale vÄ›tÅ¡ina prohlÃ­Å¾eÄ�Å¯ stejnÄ› nepodporuje.\n        // TODO Je vyÅ¾adovÃ¡n typ number, specifikace dovoluje tÅ™eba i string.\n        // TODO If the given value is not supported by the user agent, then throw a \"NotSupportedError\" DOMException.\n        throw new TypeError('Playback rate is not a finite possitive floating-point value.');\n      }\n      this.playbackRate = playbackRate;\n      if (!this.paused) {\n        // If the element is potentially playing, change the playback speed.\n        // A media element is said to be potentially playing when its paused attribute is false.\n        // TODO Hotfix implementace restartovÃ¡nÃ­m intervalu pÅ™ehrÃ¡vÃ¡nÃ­.\n        // - V ideÃ¡lnÃ­m pÅ™Ã­padÄ› by se mÄ›l odeÄ�Ã­st Ä�as, kterÃ½ jiÅ¾ uplynul na aktuÃ¡lnÃ­ stranÄ›.\n        this.restartInterval();\n      }\n    } catch (error) {\n      this.handleError(error);\n    }\n  }\n\n  /**\n   * NastavÃ­ zdroj PDF.\n   * Zdroje:\n   * [HTMLMediaElement.src](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/src).\n   * @param {string} src URL adresa souboru s PDF.\n   * @returns {undefined}\n   */\n  setSrc (src) {\n    this.src = src;\n    // If a src attribute of a media element is set or changed,\n    // the user agent must invoke the media element's media element load algorithm.\n    this.load();\n  }\n\n  /**\n   * SpustÃ­ aplikaci potomka.\n   * Je nutnÃ© ihned zaÄ�Ã­t naslouchat zmÄ›nÃ¡m v PDF pÅ™ehrÃ¡vaÄ�i,\n   * kterÃ½ neÄ�ekÃ¡ a pokraÄ�uje v inicializaci.\n   * @returns {Promise.<undefined>} VyÅ™eÅ¡Ã­ se po navÃ¡zÃ¡nÃ­ komunikace s potomkem.\n   */\n  start () {\n    return new Promise((resolve) => {\n      const {appOptions, document} = this;\n      document.addEventListener('PDFViewerApplicationError', this.onError);\n      document.addEventListener('PDFViewerApplicationPassword', this.onPassword);\n      document.addEventListener('pagesinit', this.onPagesinit);\n      // Deaktivace vÃ½chozÃ­ho PDF souboru. OtevÃ­rÃ¡ se aÅ¾ vyÅ¾Ã¡danÃ½ soubor.\n      appOptions.set('defaultUrl', '');\n      // Deaktivace naÄ�Ã­tÃ¡nÃ­ odebranÃ½ch chearacter maps.\n      // Je nutnÃ© deaktivovat i cMapUrl, aby neprobÄ›hly pokusy o jejich staÅ¾enÃ­.\n      appOptions.set('cMapPacked', false);\n      appOptions.set('cMapUrl', false);\n      // VynutÃ­ se vÃ½chozÃ­ jazyk, jinak se pouÅ¾ije nastavenÃ½ prohlÃ­Å¾eÄ�i.\n      // S jedinÃ½m jazykem lze snÃ­Å¾it velikost buildu.\n      // V lokalizaci \"en-GB\" chybÃ­ nÄ›kterÃ© texty, tak je pouÅ¾ita vÃ½chozÃ­ z PDF.js.\n      appOptions.set('locale', 'en-US');\n      // Ãšprava cesty k workeru, dle slouÄ�enÃ­ \"build\" a \"web\" do jednÃ© vÃ½stupnÃ­ sloÅ¾ky.\n      appOptions.set('workerSrc', 'pdf.worker.js');\n      return resolve(this.connection.promise);\n    });\n  }\n\n  /**\n   * ZahÃ¡jenÃ­ intervalu pÅ™ehrÃ¡vÃ¡nÃ­, bÄ›hem kterÃ©ho se\n   * prochÃ¡zÃ­ jednotlivÃ½mi strÃ¡nkami dokumentu.\n   * NarozdÃ­l od obyÄ�ejnÃ©ho `play` je volÃ¡no aÅ¾ pÅ™i skuteÄ�nÃ©m zahÃ¡jenÃ­ pÅ™ehrÃ¡vÃ¡nÃ­.\n   * @private\n   * @returns {undefined}\n   */\n  startInterval () {\n    if (this.interval) {\n      // Pokud se jiÅ¾ pÅ™ehrÃ¡vÃ¡, nic se nedÄ›lÃ¡.\n      return;\n    }\n    // ZaÄ�Ã¡tek pÅ™ehrÃ¡vÃ¡nÃ­. V pravidelnÃ©m intervalu se mÄ›nÃ­ strany.\n    // DÃ©lka pÅ™ehrÃ¡vÃ¡nÃ­ se rovnomÄ›rnÄ› rozdÄ›lÃ­ mezi jednotlivÃ© strany PDF.\n    // NapÅ™. pÅ™i pÅ™ehrÃ¡vÃ¡nÃ­ PDF s 5 stranami v dÃ©lce 10 vteÅ™in\n    // se kaÅ¾dÃ¡ strana bude zobrazovat 2 vteÅ™iny.\n    const delay = this.duration * 1000 / this.playbackRate / this.app.pagesCount;\n    this.interval = setInterval(this.onInterval, delay);\n  }\n\n  /**\n   * ZastavenÃ­ intervalu pÅ™ehrÃ¡vÃ¡nÃ­, bÄ›hem kterÃ©ho se\n   * prochÃ¡zÃ­ jednotlivÃ½mi strÃ¡nkami dokumentu.\n   * @private\n   * @returns {undefined}\n   */\n  stopInterval () {\n    clearInterval(this.interval);\n    this.interval = null;\n  }\n}\n\nexport default PdfChild;\n"],"sourceRoot":""}/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @file Customized file from pdfjs-dist@2.1.266
 * Changes:
 * - CHANGE 1: We have removed references to `.map` files, which won't work after changes.
 * - CHANGE 2: We have added es6-shim@0.35.4 for compatibility with older Chrome.
 * - CHANGE 3: We have added whatwg-fetch@2.0.3 and forced it's usage for all the fetch requests,
 *   because the native fetch doesn't support the `file://` protocol
 *   unlike the XHR request used in the polyfill.
 *   We have removed the leading `if (self.fetch) {return;}` to force the polyfill.
 *   We have also disabled the blob support, because of it's buggy implementation in the polyfill.
 *   Finally we have minified the source.
 * - CHANGE 4: We have disabled the access to the `Content-Length` header
 *   which is not available on the `file://` protocol.
 * - CHANGE 5: We have disabled the access to the `Content-Disposition` header
 *   which is not available on the `file://` protocol.
 * - CHANGE 6: We have disabled the check for the Mozilla specific response type `moz-chunked-arraybuffer`.
 * - CHANGE 7: We have disabled the `isSameOrigin` check to support the `file://` protocol.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

/**
 * @licstart The following is the entire license notice for the
 * Javascript code in this page
 *
 * Copyright 2018 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.
 *
 * @licend The above is the entire license notice for the
 * Javascript code in this page
 */

// CHANGE 2
/*!
 * https://github.com/paulmillr/es6-shim
 * @license es6-shim Copyright 2013-2016 by Paul Miller (http://paulmillr.com)
 *   and contributors,  MIT License
 * es6-shim: v0.35.4
 * see https://github.com/paulmillr/es6-shim/blob/0.35.3/LICENSE
 * Details and documentation:
 * https://github.com/paulmillr/es6-shim/
 */
(function(e,t){if(typeof define==="function"&&define.amd){define(t)}else if(typeof exports==="object"){module.exports=t()}else{e.returnExports=t()}})(this,function(){"use strict";var e=Function.call.bind(Function.apply);var t=Function.call.bind(Function.call);var r=Array.isArray;var n=Object.keys;var o=function notThunker(t){return function notThunk(){return!e(t,this,arguments)}};var i=function(e){try{e();return false}catch(t){return true}};var a=function valueOrFalseIfThrows(e){try{return e()}catch(t){return false}};var u=o(i);var f=function(){return!i(function(){return Object.defineProperty({},"x",{get:function(){}})})};var s=!!Object.defineProperty&&f();var c=function foo(){}.name==="foo";var l=Function.call.bind(Array.prototype.forEach);var p=Function.call.bind(Array.prototype.reduce);var v=Function.call.bind(Array.prototype.filter);var y=Function.call.bind(Array.prototype.some);var h=function(e,t,r,n){if(!n&&t in e){return}if(s){Object.defineProperty(e,t,{configurable:true,enumerable:false,writable:true,value:r})}else{e[t]=r}};var b=function(e,t,r){l(n(t),function(n){var o=t[n];h(e,n,o,!!r)})};var g=Function.call.bind(Object.prototype.toString);var d=typeof/abc/==="function"?function IsCallableSlow(e){return typeof e==="function"&&g(e)==="[object Function]"}:function IsCallableFast(e){return typeof e==="function"};var m={getter:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}Object.defineProperty(e,t,{configurable:true,enumerable:false,get:r})},proxy:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,{configurable:n.configurable,enumerable:n.enumerable,get:function getKey(){return e[t]},set:function setKey(r){e[t]=r}})},redefine:function(e,t,r){if(s){var n=Object.getOwnPropertyDescriptor(e,t);n.value=r;Object.defineProperty(e,t,n)}else{e[t]=r}},defineByDescriptor:function(e,t,r){if(s){Object.defineProperty(e,t,r)}else if("value"in r){e[t]=r.value}},preserveToString:function(e,t){if(t&&d(t.toString)){h(e,"toString",t.toString.bind(t),true)}}};var O=Object.create||function(e,t){var r=function Prototype(){};r.prototype=e;var o=new r;if(typeof t!=="undefined"){n(t).forEach(function(e){m.defineByDescriptor(o,e,t[e])})}return o};var w=function(e,t){if(!Object.setPrototypeOf){return false}return a(function(){var r=function Subclass(t){var r=new e(t);Object.setPrototypeOf(r,Subclass.prototype);return r};Object.setPrototypeOf(r,e);r.prototype=O(e.prototype,{constructor:{value:r}});return t(r)})};var j=function(){if(typeof self!=="undefined"){return self}if(typeof window!=="undefined"){return window}if(typeof global!=="undefined"){return global}throw new Error("unable to locate global object")};var S=j();var T=S.isFinite;var I=Function.call.bind(String.prototype.indexOf);var E=Function.apply.bind(Array.prototype.indexOf);var P=Function.call.bind(Array.prototype.concat);var C=Function.call.bind(String.prototype.slice);var M=Function.call.bind(Array.prototype.push);var x=Function.apply.bind(Array.prototype.push);var N=Function.call.bind(Array.prototype.shift);var A=Math.max;var R=Math.min;var _=Math.floor;var k=Math.abs;var L=Math.exp;var F=Math.log;var D=Math.sqrt;var z=Function.call.bind(Object.prototype.hasOwnProperty);var q;var W=function(){};var G=S.Map;var H=G&&G.prototype["delete"];var V=G&&G.prototype.get;var B=G&&G.prototype.has;var U=G&&G.prototype.set;var $=S.Symbol||{};var J=$.species||"@@species";var X=Number.isNaN||function isNaN(e){return e!==e};var K=Number.isFinite||function isFinite(e){return typeof e==="number"&&T(e)};var Z=d(Math.sign)?Math.sign:function sign(e){var t=Number(e);if(t===0){return t}if(X(t)){return t}return t<0?-1:1};var Y=function log1p(e){var t=Number(e);if(t<-1||X(t)){return NaN}if(t===0||t===Infinity){return t}if(t===-1){return-Infinity}return 1+t-1===0?t:t*(F(1+t)/(1+t-1))};var Q=function isArguments(e){return g(e)==="[object Arguments]"};var ee=function isArguments(e){return e!==null&&typeof e==="object"&&typeof e.length==="number"&&e.length>=0&&g(e)!=="[object Array]"&&g(e.callee)==="[object Function]"};var te=Q(arguments)?Q:ee;var re={primitive:function(e){return e===null||typeof e!=="function"&&typeof e!=="object"},string:function(e){return g(e)==="[object String]"},regex:function(e){return g(e)==="[object RegExp]"},symbol:function(e){return typeof S.Symbol==="function"&&typeof e==="symbol"}};var ne=function overrideNative(e,t,r){var n=e[t];h(e,t,r,true);m.preserveToString(e[t],n)};var oe=typeof $==="function"&&typeof $["for"]==="function"&&re.symbol($());var ie=re.symbol($.iterator)?$.iterator:"_es6-shim iterator_";if(S.Set&&typeof(new S.Set)["@@iterator"]==="function"){ie="@@iterator"}if(!S.Reflect){h(S,"Reflect",{},true)}var ae=S.Reflect;var ue=String;var fe=typeof document==="undefined"||!document?null:document.all;var se=fe==null?function isNullOrUndefined(e){return e==null}:function isNullOrUndefinedAndNotDocumentAll(e){return e==null&&e!==fe};var ce={Call:function Call(t,r){var n=arguments.length>2?arguments[2]:[];if(!ce.IsCallable(t)){throw new TypeError(t+" is not a function")}return e(t,r,n)},RequireObjectCoercible:function(e,t){if(se(e)){throw new TypeError(t||"Cannot call method on "+e)}return e},TypeIsObject:function(e){if(e===void 0||e===null||e===true||e===false){return false}return typeof e==="function"||typeof e==="object"||e===fe},ToObject:function(e,t){return Object(ce.RequireObjectCoercible(e,t))},IsCallable:d,IsConstructor:function(e){return ce.IsCallable(e)},ToInt32:function(e){return ce.ToNumber(e)>>0},ToUint32:function(e){return ce.ToNumber(e)>>>0},ToNumber:function(e){if(g(e)==="[object Symbol]"){throw new TypeError("Cannot convert a Symbol value to a number")}return+e},ToInteger:function(e){var t=ce.ToNumber(e);if(X(t)){return 0}if(t===0||!K(t)){return t}return(t>0?1:-1)*_(k(t))},ToLength:function(e){var t=ce.ToInteger(e);if(t<=0){return 0}if(t>Number.MAX_SAFE_INTEGER){return Number.MAX_SAFE_INTEGER}return t},SameValue:function(e,t){if(e===t){if(e===0){return 1/e===1/t}return true}return X(e)&&X(t)},SameValueZero:function(e,t){return e===t||X(e)&&X(t)},IsIterable:function(e){return ce.TypeIsObject(e)&&(typeof e[ie]!=="undefined"||te(e))},GetIterator:function(e){if(te(e)){return new q(e,"value")}var t=ce.GetMethod(e,ie);if(!ce.IsCallable(t)){throw new TypeError("value is not an iterable")}var r=ce.Call(t,e);if(!ce.TypeIsObject(r)){throw new TypeError("bad iterator")}return r},GetMethod:function(e,t){var r=ce.ToObject(e)[t];if(se(r)){return void 0}if(!ce.IsCallable(r)){throw new TypeError("Method not callable: "+t)}return r},IteratorComplete:function(e){return!!e.done},IteratorClose:function(e,t){var r=ce.GetMethod(e,"return");if(r===void 0){return}var n,o;try{n=ce.Call(r,e)}catch(i){o=i}if(t){return}if(o){throw o}if(!ce.TypeIsObject(n)){throw new TypeError("Iterator's return method returned a non-object.")}},IteratorNext:function(e){var t=arguments.length>1?e.next(arguments[1]):e.next();if(!ce.TypeIsObject(t)){throw new TypeError("bad iterator")}return t},IteratorStep:function(e){var t=ce.IteratorNext(e);var r=ce.IteratorComplete(t);return r?false:t},Construct:function(e,t,r,n){var o=typeof r==="undefined"?e:r;if(!n&&ae.construct){return ae.construct(e,t,o)}var i=o.prototype;if(!ce.TypeIsObject(i)){i=Object.prototype}var a=O(i);var u=ce.Call(e,a,t);return ce.TypeIsObject(u)?u:a},SpeciesConstructor:function(e,t){var r=e.constructor;if(r===void 0){return t}if(!ce.TypeIsObject(r)){throw new TypeError("Bad constructor")}var n=r[J];if(se(n)){return t}if(!ce.IsConstructor(n)){throw new TypeError("Bad @@species")}return n},CreateHTML:function(e,t,r,n){var o=ce.ToString(e);var i="<"+t;if(r!==""){var a=ce.ToString(n);var u=a.replace(/"/g,"&quot;");i+=" "+r+'="'+u+'"'}var f=i+">";var s=f+o;return s+"</"+t+">"},IsRegExp:function IsRegExp(e){if(!ce.TypeIsObject(e)){return false}var t=e[$.match];if(typeof t!=="undefined"){return!!t}return re.regex(e)},ToString:function ToString(e){return ue(e)}};if(s&&oe){var le=function defineWellKnownSymbol(e){if(re.symbol($[e])){return $[e]}var t=$["for"]("Symbol."+e);Object.defineProperty($,e,{configurable:false,enumerable:false,writable:false,value:t});return t};if(!re.symbol($.search)){var pe=le("search");var ve=String.prototype.search;h(RegExp.prototype,pe,function search(e){return ce.Call(ve,e,[this])});var ye=function search(e){var t=ce.RequireObjectCoercible(this);if(!se(e)){var r=ce.GetMethod(e,pe);if(typeof r!=="undefined"){return ce.Call(r,e,[t])}}return ce.Call(ve,t,[ce.ToString(e)])};ne(String.prototype,"search",ye)}if(!re.symbol($.replace)){var he=le("replace");var be=String.prototype.replace;h(RegExp.prototype,he,function replace(e,t){return ce.Call(be,e,[this,t])});var ge=function replace(e,t){var r=ce.RequireObjectCoercible(this);if(!se(e)){var n=ce.GetMethod(e,he);if(typeof n!=="undefined"){return ce.Call(n,e,[r,t])}}return ce.Call(be,r,[ce.ToString(e),t])};ne(String.prototype,"replace",ge)}if(!re.symbol($.split)){var de=le("split");var me=String.prototype.split;h(RegExp.prototype,de,function split(e,t){return ce.Call(me,e,[this,t])});var Oe=function split(e,t){var r=ce.RequireObjectCoercible(this);if(!se(e)){var n=ce.GetMethod(e,de);if(typeof n!=="undefined"){return ce.Call(n,e,[r,t])}}return ce.Call(me,r,[ce.ToString(e),t])};ne(String.prototype,"split",Oe)}var we=re.symbol($.match);var je=we&&function(){var e={};e[$.match]=function(){return 42};return"a".match(e)!==42}();if(!we||je){var Se=le("match");var Te=String.prototype.match;h(RegExp.prototype,Se,function match(e){return ce.Call(Te,e,[this])});var Ie=function match(e){var t=ce.RequireObjectCoercible(this);if(!se(e)){var r=ce.GetMethod(e,Se);if(typeof r!=="undefined"){return ce.Call(r,e,[t])}}return ce.Call(Te,t,[ce.ToString(e)])};ne(String.prototype,"match",Ie)}}var Ee=function wrapConstructor(e,t,r){m.preserveToString(t,e);if(Object.setPrototypeOf){Object.setPrototypeOf(e,t)}if(s){l(Object.getOwnPropertyNames(e),function(n){if(n in W||r[n]){return}m.proxy(e,n,t)})}else{l(Object.keys(e),function(n){if(n in W||r[n]){return}t[n]=e[n]})}t.prototype=e.prototype;m.redefine(e.prototype,"constructor",t)};var Pe=function(){return this};var Ce=function(e){if(s&&!z(e,J)){m.getter(e,J,Pe)}};var Me=function(e,t){var r=t||function iterator(){return this};h(e,ie,r);if(!e[ie]&&re.symbol(ie)){e[ie]=r}};var xe=function createDataProperty(e,t,r){if(s){Object.defineProperty(e,t,{configurable:true,enumerable:true,writable:true,value:r})}else{e[t]=r}};var Ne=function createDataPropertyOrThrow(e,t,r){xe(e,t,r);if(!ce.SameValue(e[t],r)){throw new TypeError("property is nonconfigurable")}};var Ae=function(e,t,r,n){if(!ce.TypeIsObject(e)){throw new TypeError("Constructor requires `new`: "+t.name)}var o=t.prototype;if(!ce.TypeIsObject(o)){o=r}var i=O(o);for(var a in n){if(z(n,a)){var u=n[a];h(i,a,u,true)}}return i};if(String.fromCodePoint&&String.fromCodePoint.length!==1){var Re=String.fromCodePoint;ne(String,"fromCodePoint",function fromCodePoint(e){return ce.Call(Re,this,arguments)})}var _e={fromCodePoint:function fromCodePoint(e){var t=[];var r;for(var n=0,o=arguments.length;n<o;n++){r=Number(arguments[n]);if(!ce.SameValue(r,ce.ToInteger(r))||r<0||r>1114111){throw new RangeError("Invalid code point "+r)}if(r<65536){M(t,String.fromCharCode(r))}else{r-=65536;M(t,String.fromCharCode((r>>10)+55296));M(t,String.fromCharCode(r%1024+56320))}}return t.join("")},raw:function raw(e){var t=ce.ToObject(e,"bad callSite");var r=ce.ToObject(t.raw,"bad raw value");var n=r.length;var o=ce.ToLength(n);if(o<=0){return""}var i=[];var a=0;var u,f,s,c;while(a<o){u=ce.ToString(a);s=ce.ToString(r[u]);M(i,s);if(a+1>=o){break}f=a+1<arguments.length?arguments[a+1]:"";c=ce.ToString(f);M(i,c);a+=1}return i.join("")}};if(String.raw&&String.raw({raw:{0:"x",1:"y",length:2}})!=="xy"){ne(String,"raw",_e.raw)}b(String,_e);var ke=function repeat(e,t){if(t<1){return""}if(t%2){return repeat(e,t-1)+e}var r=repeat(e,t/2);return r+r};var Le=Infinity;var Fe={repeat:function repeat(e){var t=ce.ToString(ce.RequireObjectCoercible(this));var r=ce.ToInteger(e);if(r<0||r>=Le){throw new RangeError("repeat count must be less than infinity and not overflow maximum string size")}return ke(t,r)},startsWith:function startsWith(e){var t=ce.ToString(ce.RequireObjectCoercible(this));if(ce.IsRegExp(e)){throw new TypeError('Cannot call method "startsWith" with a regex')}var r=ce.ToString(e);var n;if(arguments.length>1){n=arguments[1]}var o=A(ce.ToInteger(n),0);return C(t,o,o+r.length)===r},endsWith:function endsWith(e){var t=ce.ToString(ce.RequireObjectCoercible(this));if(ce.IsRegExp(e)){throw new TypeError('Cannot call method "endsWith" with a regex')}var r=ce.ToString(e);var n=t.length;var o;if(arguments.length>1){o=arguments[1]}var i=typeof o==="undefined"?n:ce.ToInteger(o);var a=R(A(i,0),n);return C(t,a-r.length,a)===r},includes:function includes(e){if(ce.IsRegExp(e)){throw new TypeError('"includes" does not accept a RegExp')}var t=ce.ToString(e);var r;if(arguments.length>1){r=arguments[1]}return I(this,t,r)!==-1},codePointAt:function codePointAt(e){var t=ce.ToString(ce.RequireObjectCoercible(this));var r=ce.ToInteger(e);var n=t.length;if(r>=0&&r<n){var o=t.charCodeAt(r);var i=r+1===n;if(o<55296||o>56319||i){return o}var a=t.charCodeAt(r+1);if(a<56320||a>57343){return o}return(o-55296)*1024+(a-56320)+65536}}};if(String.prototype.includes&&"a".includes("a",Infinity)!==false){ne(String.prototype,"includes",Fe.includes)}if(String.prototype.startsWith&&String.prototype.endsWith){var De=i(function(){return"/a/".startsWith(/a/)});var ze=a(function(){return"abc".startsWith("a",Infinity)===false});if(!De||!ze){ne(String.prototype,"startsWith",Fe.startsWith);ne(String.prototype,"endsWith",Fe.endsWith)}}if(oe){var qe=a(function(){var e=/a/;e[$.match]=false;return"/a/".startsWith(e)});if(!qe){ne(String.prototype,"startsWith",Fe.startsWith)}var We=a(function(){var e=/a/;e[$.match]=false;return"/a/".endsWith(e)});if(!We){ne(String.prototype,"endsWith",Fe.endsWith)}var Ge=a(function(){var e=/a/;e[$.match]=false;return"/a/".includes(e)});if(!Ge){ne(String.prototype,"includes",Fe.includes)}}b(String.prototype,Fe);var He=["\t\n\x0B\f\r \xa0\u1680\u180e\u2000\u2001\u2002\u2003","\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028","\u2029\ufeff"].join("");var Ve=new RegExp("(^["+He+"]+)|(["+He+"]+$)","g");var Be=function trim(){return ce.ToString(ce.RequireObjectCoercible(this)).replace(Ve,"")};var Ue=["\x85","\u200b","\ufffe"].join("");var $e=new RegExp("["+Ue+"]","g");var Je=/^[-+]0x[0-9a-f]+$/i;var Xe=Ue.trim().length!==Ue.length;h(String.prototype,"trim",Be,Xe);var Ke=function(e){return{value:e,done:arguments.length===0}};var Ze=function(e){ce.RequireObjectCoercible(e);this._s=ce.ToString(e);this._i=0};Ze.prototype.next=function(){var e=this._s;var t=this._i;if(typeof e==="undefined"||t>=e.length){this._s=void 0;return Ke()}var r=e.charCodeAt(t);var n,o;if(r<55296||r>56319||t+1===e.length){o=1}else{n=e.charCodeAt(t+1);o=n<56320||n>57343?1:2}this._i=t+o;return Ke(e.substr(t,o))};Me(Ze.prototype);Me(String.prototype,function(){return new Ze(this)});var Ye={from:function from(e){var r=this;var n;if(arguments.length>1){n=arguments[1]}var o,i;if(typeof n==="undefined"){o=false}else{if(!ce.IsCallable(n)){throw new TypeError("Array.from: when provided, the second argument must be a function")}if(arguments.length>2){i=arguments[2]}o=true}var a=typeof(te(e)||ce.GetMethod(e,ie))!=="undefined";var u,f,s;if(a){f=ce.IsConstructor(r)?Object(new r):[];var c=ce.GetIterator(e);var l,p;s=0;while(true){l=ce.IteratorStep(c);if(l===false){break}p=l.value;try{if(o){p=typeof i==="undefined"?n(p,s):t(n,i,p,s)}f[s]=p}catch(v){ce.IteratorClose(c,true);throw v}s+=1}u=s}else{var y=ce.ToObject(e);u=ce.ToLength(y.length);f=ce.IsConstructor(r)?Object(new r(u)):new Array(u);var h;for(s=0;s<u;++s){h=y[s];if(o){h=typeof i==="undefined"?n(h,s):t(n,i,h,s)}Ne(f,s,h)}}f.length=u;return f},of:function of(){var e=arguments.length;var t=this;var n=r(t)||!ce.IsCallable(t)?new Array(e):ce.Construct(t,[e]);for(var o=0;o<e;++o){Ne(n,o,arguments[o])}n.length=e;return n}};b(Array,Ye);Ce(Array);q=function(e,t){this.i=0;this.array=e;this.kind=t};b(q.prototype,{next:function(){var e=this.i;var t=this.array;if(!(this instanceof q)){throw new TypeError("Not an ArrayIterator")}if(typeof t!=="undefined"){var r=ce.ToLength(t.length);for(;e<r;e++){var n=this.kind;var o;if(n==="key"){o=e}else if(n==="value"){o=t[e]}else if(n==="entry"){o=[e,t[e]]}this.i=e+1;return Ke(o)}}this.array=void 0;return Ke()}});Me(q.prototype);var Qe=Array.of===Ye.of||function(){var e=function Foo(e){this.length=e};e.prototype=[];var t=Array.of.apply(e,[1,2]);return t instanceof e&&t.length===2}();if(!Qe){ne(Array,"of",Ye.of)}var et={copyWithin:function copyWithin(e,t){var r=ce.ToObject(this);var n=ce.ToLength(r.length);var o=ce.ToInteger(e);var i=ce.ToInteger(t);var a=o<0?A(n+o,0):R(o,n);var u=i<0?A(n+i,0):R(i,n);var f;if(arguments.length>2){f=arguments[2]}var s=typeof f==="undefined"?n:ce.ToInteger(f);var c=s<0?A(n+s,0):R(s,n);var l=R(c-u,n-a);var p=1;if(u<a&&a<u+l){p=-1;u+=l-1;a+=l-1}while(l>0){if(u in r){r[a]=r[u]}else{delete r[a]}u+=p;a+=p;l-=1}return r},fill:function fill(e){var t;if(arguments.length>1){t=arguments[1]}var r;if(arguments.length>2){r=arguments[2]}var n=ce.ToObject(this);var o=ce.ToLength(n.length);t=ce.ToInteger(typeof t==="undefined"?0:t);r=ce.ToInteger(typeof r==="undefined"?o:r);var i=t<0?A(o+t,0):R(t,o);var a=r<0?o+r:r;for(var u=i;u<o&&u<a;++u){n[u]=e}return n},find:function find(e){var r=ce.ToObject(this);var n=ce.ToLength(r.length);if(!ce.IsCallable(e)){throw new TypeError("Array#find: predicate must be a function")}var o=arguments.length>1?arguments[1]:null;for(var i=0,a;i<n;i++){a=r[i];if(o){if(t(e,o,a,i,r)){return a}}else if(e(a,i,r)){return a}}},findIndex:function findIndex(e){var r=ce.ToObject(this);var n=ce.ToLength(r.length);if(!ce.IsCallable(e)){throw new TypeError("Array#findIndex: predicate must be a function")}var o=arguments.length>1?arguments[1]:null;for(var i=0;i<n;i++){if(o){if(t(e,o,r[i],i,r)){return i}}else if(e(r[i],i,r)){return i}}return-1},keys:function keys(){return new q(this,"key")},values:function values(){return new q(this,"value")},entries:function entries(){return new q(this,"entry")}};if(Array.prototype.keys&&!ce.IsCallable([1].keys().next)){delete Array.prototype.keys}if(Array.prototype.entries&&!ce.IsCallable([1].entries().next)){delete Array.prototype.entries}if(Array.prototype.keys&&Array.prototype.entries&&!Array.prototype.values&&Array.prototype[ie]){b(Array.prototype,{values:Array.prototype[ie]});if(re.symbol($.unscopables)){Array.prototype[$.unscopables].values=true}}if(c&&Array.prototype.values&&Array.prototype.values.name!=="values"){var tt=Array.prototype.values;ne(Array.prototype,"values",function values(){return ce.Call(tt,this,arguments)});h(Array.prototype,ie,Array.prototype.values,true)}b(Array.prototype,et);if(1/[true].indexOf(true,-0)<0){h(Array.prototype,"indexOf",function indexOf(e){var t=E(this,arguments);if(t===0&&1/t<0){return 0}return t},true)}Me(Array.prototype,function(){return this.values()});if(Object.getPrototypeOf){Me(Object.getPrototypeOf([].values()))}var rt=function(){return a(function(){return Array.from({length:-1}).length===0})}();var nt=function(){var e=Array.from([0].entries());return e.length===1&&r(e[0])&&e[0][0]===0&&e[0][1]===0}();if(!rt||!nt){ne(Array,"from",Ye.from)}var ot=function(){return a(function(){return Array.from([0],void 0)})}();if(!ot){var it=Array.from;ne(Array,"from",function from(e){if(arguments.length>1&&typeof arguments[1]!=="undefined"){return ce.Call(it,this,arguments)}else{return t(it,this,e)}})}var at=-(Math.pow(2,32)-1);var ut=function(e,r){var n={length:at};n[r?(n.length>>>0)-1:0]=true;return a(function(){t(e,n,function(){throw new RangeError("should not reach here")},[]);return true})};if(!ut(Array.prototype.forEach)){var ft=Array.prototype.forEach;ne(Array.prototype,"forEach",function forEach(e){return ce.Call(ft,this.length>=0?this:[],arguments)},true)}if(!ut(Array.prototype.map)){var st=Array.prototype.map;ne(Array.prototype,"map",function map(e){return ce.Call(st,this.length>=0?this:[],arguments)},true)}if(!ut(Array.prototype.filter)){var ct=Array.prototype.filter;ne(Array.prototype,"filter",function filter(e){return ce.Call(ct,this.length>=0?this:[],arguments)},true)}if(!ut(Array.prototype.some)){var lt=Array.prototype.some;ne(Array.prototype,"some",function some(e){return ce.Call(lt,this.length>=0?this:[],arguments)},true)}if(!ut(Array.prototype.every)){var pt=Array.prototype.every;ne(Array.prototype,"every",function every(e){return ce.Call(pt,this.length>=0?this:[],arguments)},true)}if(!ut(Array.prototype.reduce)){var vt=Array.prototype.reduce;ne(Array.prototype,"reduce",function reduce(e){return ce.Call(vt,this.length>=0?this:[],arguments)},true)}if(!ut(Array.prototype.reduceRight,true)){var yt=Array.prototype.reduceRight;ne(Array.prototype,"reduceRight",function reduceRight(e){return ce.Call(yt,this.length>=0?this:[],arguments)},true)}var ht=Number("0o10")!==8;var bt=Number("0b10")!==2;var gt=y(Ue,function(e){return Number(e+0+e)===0});if(ht||bt||gt){var dt=Number;var mt=/^0b[01]+$/i;var Ot=/^0o[0-7]+$/i;var wt=mt.test.bind(mt);var jt=Ot.test.bind(Ot);var St=function(e){var t;if(typeof e.valueOf==="function"){t=e.valueOf();if(re.primitive(t)){return t}}if(typeof e.toString==="function"){t=e.toString();if(re.primitive(t)){return t}}throw new TypeError("No default value")};var Tt=$e.test.bind($e);var It=Je.test.bind(Je);var Et=function(){var e=function Number(t){var r;if(arguments.length>0){r=re.primitive(t)?t:St(t,"number")}else{r=0}if(typeof r==="string"){r=ce.Call(Be,r);if(wt(r)){r=parseInt(C(r,2),2)}else if(jt(r)){r=parseInt(C(r,2),8)}else if(Tt(r)||It(r)){r=NaN}}var n=this;var o=a(function(){dt.prototype.valueOf.call(n);return true});if(n instanceof e&&!o){return new dt(r)}return dt(r)};return e}();Ee(dt,Et,{});b(Et,{NaN:dt.NaN,MAX_VALUE:dt.MAX_VALUE,MIN_VALUE:dt.MIN_VALUE,NEGATIVE_INFINITY:dt.NEGATIVE_INFINITY,POSITIVE_INFINITY:dt.POSITIVE_INFINITY});Number=Et;m.redefine(S,"Number",Et)}var Pt=Math.pow(2,53)-1;b(Number,{MAX_SAFE_INTEGER:Pt,MIN_SAFE_INTEGER:-Pt,EPSILON:2.220446049250313e-16,parseInt:S.parseInt,parseFloat:S.parseFloat,isFinite:K,isInteger:function isInteger(e){return K(e)&&ce.ToInteger(e)===e},isSafeInteger:function isSafeInteger(e){return Number.isInteger(e)&&k(e)<=Number.MAX_SAFE_INTEGER},isNaN:X});h(Number,"parseInt",S.parseInt,Number.parseInt!==S.parseInt);if([,1].find(function(){return true})===1){ne(Array.prototype,"find",et.find)}if([,1].findIndex(function(){return true})!==0){ne(Array.prototype,"findIndex",et.findIndex)}var Ct=Function.bind.call(Function.bind,Object.prototype.propertyIsEnumerable);var Mt=function ensureEnumerable(e,t){if(s&&Ct(e,t)){Object.defineProperty(e,t,{enumerable:false})}};var xt=function sliceArgs(){var e=Number(this);var t=arguments.length;var r=t-e;var n=new Array(r<0?0:r);for(var o=e;o<t;++o){n[o-e]=arguments[o]}return n};var Nt=function assignTo(e){return function assignToSource(t,r){t[r]=e[r];return t}};var At=function(e,t){var r=n(Object(t));var o;if(ce.IsCallable(Object.getOwnPropertySymbols)){o=v(Object.getOwnPropertySymbols(Object(t)),Ct(t))}return p(P(r,o||[]),Nt(t),e)};var Rt={assign:function(e,t){var r=ce.ToObject(e,"Cannot convert undefined or null to object");return p(ce.Call(xt,1,arguments),At,r)},is:function is(e,t){return ce.SameValue(e,t)}};var _t=Object.assign&&Object.preventExtensions&&function(){var e=Object.preventExtensions({1:2});try{Object.assign(e,"xy")}catch(t){return e[1]==="y"}}();if(_t){ne(Object,"assign",Rt.assign)}b(Object,Rt);if(s){var kt={setPrototypeOf:function(e,r){var n;var o=function(e,t){if(!ce.TypeIsObject(e)){throw new TypeError("cannot set prototype on a non-object")}if(!(t===null||ce.TypeIsObject(t))){throw new TypeError("can only set prototype to an object or null"+t)}};var i=function(e,r){o(e,r);t(n,e,r);return e};try{n=e.getOwnPropertyDescriptor(e.prototype,r).set;t(n,{},null)}catch(a){if(e.prototype!=={}[r]){return}n=function(e){this[r]=e};i.polyfill=i(i({},null),e.prototype)instanceof e}return i}(Object,"__proto__")};b(Object,kt)}if(Object.setPrototypeOf&&Object.getPrototypeOf&&Object.getPrototypeOf(Object.setPrototypeOf({},null))!==null&&Object.getPrototypeOf(Object.create(null))===null){(function(){var e=Object.create(null);var t=Object.getPrototypeOf;var r=Object.setPrototypeOf;Object.getPrototypeOf=function(r){var n=t(r);return n===e?null:n};Object.setPrototypeOf=function(t,n){var o=n===null?e:n;return r(t,o)};Object.setPrototypeOf.polyfill=false})()}var Lt=!i(function(){return Object.keys("foo")});if(!Lt){var Ft=Object.keys;ne(Object,"keys",function keys(e){return Ft(ce.ToObject(e))});n=Object.keys}var Dt=i(function(){return Object.keys(/a/g)});if(Dt){var zt=Object.keys;ne(Object,"keys",function keys(e){if(re.regex(e)){var t=[];for(var r in e){if(z(e,r)){M(t,r)}}return t}return zt(e)});n=Object.keys}if(Object.getOwnPropertyNames){var qt=!i(function(){return Object.getOwnPropertyNames("foo")});if(!qt){var Wt=typeof window==="object"?Object.getOwnPropertyNames(window):[];var Gt=Object.getOwnPropertyNames;ne(Object,"getOwnPropertyNames",function getOwnPropertyNames(e){var t=ce.ToObject(e);if(g(t)==="[object Window]"){try{return Gt(t)}catch(r){return P([],Wt)}}return Gt(t)})}}if(Object.getOwnPropertyDescriptor){var Ht=!i(function(){return Object.getOwnPropertyDescriptor("foo","bar")});if(!Ht){var Vt=Object.getOwnPropertyDescriptor;ne(Object,"getOwnPropertyDescriptor",function getOwnPropertyDescriptor(e,t){return Vt(ce.ToObject(e),t)})}}if(Object.seal){var Bt=!i(function(){return Object.seal("foo")});if(!Bt){var Ut=Object.seal;ne(Object,"seal",function seal(e){if(!ce.TypeIsObject(e)){return e}return Ut(e)})}}if(Object.isSealed){var $t=!i(function(){return Object.isSealed("foo")});if(!$t){var Jt=Object.isSealed;ne(Object,"isSealed",function isSealed(e){if(!ce.TypeIsObject(e)){return true}return Jt(e)})}}if(Object.freeze){var Xt=!i(function(){return Object.freeze("foo")});if(!Xt){var Kt=Object.freeze;ne(Object,"freeze",function freeze(e){if(!ce.TypeIsObject(e)){return e}return Kt(e)})}}if(Object.isFrozen){var Zt=!i(function(){return Object.isFrozen("foo")});if(!Zt){var Yt=Object.isFrozen;ne(Object,"isFrozen",function isFrozen(e){if(!ce.TypeIsObject(e)){return true}return Yt(e)})}}if(Object.preventExtensions){var Qt=!i(function(){return Object.preventExtensions("foo")});if(!Qt){var er=Object.preventExtensions;ne(Object,"preventExtensions",function preventExtensions(e){if(!ce.TypeIsObject(e)){return e}return er(e)})}}if(Object.isExtensible){var tr=!i(function(){return Object.isExtensible("foo")});if(!tr){var rr=Object.isExtensible;ne(Object,"isExtensible",function isExtensible(e){if(!ce.TypeIsObject(e)){return false}return rr(e)})}}if(Object.getPrototypeOf){var nr=!i(function(){return Object.getPrototypeOf("foo")});if(!nr){var or=Object.getPrototypeOf;ne(Object,"getPrototypeOf",function getPrototypeOf(e){return or(ce.ToObject(e))})}}var ir=s&&function(){var e=Object.getOwnPropertyDescriptor(RegExp.prototype,"flags");return e&&ce.IsCallable(e.get)}();if(s&&!ir){var ar=function flags(){if(!ce.TypeIsObject(this)){throw new TypeError("Method called on incompatible type: must be an object.")}var e="";if(this.global){e+="g"}if(this.ignoreCase){e+="i"}if(this.multiline){e+="m"}if(this.unicode){e+="u"}if(this.sticky){e+="y"}return e};m.getter(RegExp.prototype,"flags",ar)}var ur=s&&a(function(){return String(new RegExp(/a/g,"i"))==="/a/i"});var fr=oe&&s&&function(){var e=/./;e[$.match]=false;return RegExp(e)===e}();var sr=a(function(){return RegExp.prototype.toString.call({source:"abc"})==="/abc/"});var cr=sr&&a(function(){return RegExp.prototype.toString.call({source:"a",flags:"b"})==="/a/b"});if(!sr||!cr){var lr=RegExp.prototype.toString;h(RegExp.prototype,"toString",function toString(){var e=ce.RequireObjectCoercible(this);if(re.regex(e)){return t(lr,e)}var r=ue(e.source);var n=ue(e.flags);return"/"+r+"/"+n},true);m.preserveToString(RegExp.prototype.toString,lr)}if(s&&(!ur||fr)){var pr=Object.getOwnPropertyDescriptor(RegExp.prototype,"flags").get;var vr=Object.getOwnPropertyDescriptor(RegExp.prototype,"source")||{};var yr=function(){return this.source};var hr=ce.IsCallable(vr.get)?vr.get:yr;var br=RegExp;var gr=function(){return function RegExp(e,t){var r=ce.IsRegExp(e);var n=this instanceof RegExp;if(!n&&r&&typeof t==="undefined"&&e.constructor===RegExp){return e}var o=e;var i=t;if(re.regex(e)){o=ce.Call(hr,e);i=typeof t==="undefined"?ce.Call(pr,e):t;return new RegExp(o,i)}else if(r){o=e.source;i=typeof t==="undefined"?e.flags:t}return new br(e,t)}}();Ee(br,gr,{$input:true});RegExp=gr;m.redefine(S,"RegExp",gr)}if(s){var dr={input:"$_",lastMatch:"$&",lastParen:"$+",leftContext:"$`",rightContext:"$'"};l(n(dr),function(e){if(e in RegExp&&!(dr[e]in RegExp)){m.getter(RegExp,dr[e],function get(){return RegExp[e]})}})}Ce(RegExp);var mr=1/Number.EPSILON;var Or=function roundTiesToEven(e){return e+mr-mr};var wr=Math.pow(2,-23);var jr=Math.pow(2,127)*(2-wr);var Sr=Math.pow(2,-126);var Tr=Math.E;var Ir=Math.LOG2E;var Er=Math.LOG10E;var Pr=Number.prototype.clz;delete Number.prototype.clz;var Cr={acosh:function acosh(e){var t=Number(e);if(X(t)||e<1){return NaN}if(t===1){return 0}if(t===Infinity){return t}var r=1/(t*t);if(t<2){return Y(t-1+D(1-r)*t)}var n=t/2;return Y(n+D(1-r)*n-1)+1/Ir},asinh:function asinh(e){var t=Number(e);if(t===0||!T(t)){return t}var r=k(t);var n=r*r;var o=Z(t);if(r<1){return o*Y(r+n/(D(n+1)+1))}return o*(Y(r/2+D(1+1/n)*r/2-1)+1/Ir)},atanh:function atanh(e){var t=Number(e);if(t===0){return t}if(t===-1){return-Infinity}if(t===1){return Infinity}if(X(t)||t<-1||t>1){return NaN}var r=k(t);return Z(t)*Y(2*r/(1-r))/2},cbrt:function cbrt(e){var t=Number(e);if(t===0){return t}var r=t<0;var n;if(r){t=-t}if(t===Infinity){n=Infinity}else{n=L(F(t)/3);n=(t/(n*n)+2*n)/3}return r?-n:n},clz32:function clz32(e){var t=Number(e);var r=ce.ToUint32(t);if(r===0){return 32}return Pr?ce.Call(Pr,r):31-_(F(r+.5)*Ir)},cosh:function cosh(e){var t=Number(e);if(t===0){return 1}if(X(t)){return NaN}if(!T(t)){return Infinity}var r=L(k(t)-1);return(r+1/(r*Tr*Tr))*(Tr/2)},expm1:function expm1(e){var t=Number(e);if(t===-Infinity){return-1}if(!T(t)||t===0){return t}if(k(t)>.5){return L(t)-1}var r=t;var n=0;var o=1;while(n+r!==n){n+=r;o+=1;r*=t/o}return n},hypot:function hypot(e,t){var r=0;var n=0;for(var o=0;o<arguments.length;++o){var i=k(Number(arguments[o]));if(n<i){r*=n/i*(n/i);r+=1;n=i}else{r+=i>0?i/n*(i/n):i}}return n===Infinity?Infinity:n*D(r)},log2:function log2(e){return F(e)*Ir},log10:function log10(e){return F(e)*Er},log1p:Y,sign:Z,sinh:function sinh(e){var t=Number(e);if(!T(t)||t===0){return t}var r=k(t);if(r<1){var n=Math.expm1(r);return Z(t)*n*(1+1/(n+1))/2}var o=L(r-1);return Z(t)*(o-1/(o*Tr*Tr))*(Tr/2)},tanh:function tanh(e){var t=Number(e);if(X(t)||t===0){return t}if(t>=20){return 1}if(t<=-20){return-1}return(Math.expm1(t)-Math.expm1(-t))/(L(t)+L(-t))},trunc:function trunc(e){var t=Number(e);return t<0?-_(-t):_(t)},imul:function imul(e,t){var r=ce.ToUint32(e);var n=ce.ToUint32(t);var o=r>>>16&65535;var i=r&65535;var a=n>>>16&65535;var u=n&65535;return i*u+(o*u+i*a<<16>>>0)|0},fround:function fround(e){var t=Number(e);if(t===0||t===Infinity||t===-Infinity||X(t)){return t}var r=Z(t);var n=k(t);if(n<Sr){return r*Or(n/Sr/wr)*Sr*wr}var o=(1+wr/Number.EPSILON)*n;var i=o-(o-n);if(i>jr||X(i)){return r*Infinity}return r*i}};var Mr=function withinULPDistance(e,t,r){return k(1-e/t)/Number.EPSILON<(r||8)};b(Math,Cr);h(Math,"sinh",Cr.sinh,Math.sinh(710)===Infinity);h(Math,"cosh",Cr.cosh,Math.cosh(710)===Infinity);h(Math,"log1p",Cr.log1p,Math.log1p(-1e-17)!==-1e-17);h(Math,"asinh",Cr.asinh,Math.asinh(-1e7)!==-Math.asinh(1e7));h(Math,"asinh",Cr.asinh,Math.asinh(1e300)===Infinity);h(Math,"atanh",Cr.atanh,Math.atanh(1e-300)===0);h(Math,"tanh",Cr.tanh,Math.tanh(-2e-17)!==-2e-17);
  h(Math,"acosh",Cr.acosh,Math.acosh(Number.MAX_VALUE)===Infinity);h(Math,"acosh",Cr.acosh,!Mr(Math.acosh(1+Number.EPSILON),Math.sqrt(2*Number.EPSILON)));h(Math,"cbrt",Cr.cbrt,!Mr(Math.cbrt(1e-300),1e-100));h(Math,"sinh",Cr.sinh,Math.sinh(-2e-17)!==-2e-17);var xr=Math.expm1(10);h(Math,"expm1",Cr.expm1,xr>22025.465794806718||xr<22025.465794806718);var Nr=Math.round;var Ar=Math.round(.5-Number.EPSILON/4)===0&&Math.round(-.5+Number.EPSILON/3.99)===1;var Rr=mr+1;var _r=2*mr-1;var kr=[Rr,_r].every(function(e){return Math.round(e)===e});h(Math,"round",function round(e){var t=_(e);var r=t===-1?-0:t+1;return e-t<.5?t:r},!Ar||!kr);m.preserveToString(Math.round,Nr);var Lr=Math.imul;if(Math.imul(4294967295,5)!==-5){Math.imul=Cr.imul;m.preserveToString(Math.imul,Lr)}if(Math.imul.length!==2){ne(Math,"imul",function imul(e,t){return ce.Call(Lr,Math,arguments)})}var Fr=function(){var e=S.setTimeout;if(typeof e!=="function"&&typeof e!=="object"){return}ce.IsPromise=function(e){if(!ce.TypeIsObject(e)){return false}if(typeof e._promise==="undefined"){return false}return true};var r=function(e){if(!ce.IsConstructor(e)){throw new TypeError("Bad promise constructor")}var t=this;var r=function(e,r){if(t.resolve!==void 0||t.reject!==void 0){throw new TypeError("Bad Promise implementation!")}t.resolve=e;t.reject=r};t.resolve=void 0;t.reject=void 0;t.promise=new e(r);if(!(ce.IsCallable(t.resolve)&&ce.IsCallable(t.reject))){throw new TypeError("Bad promise constructor")}};var n;if(typeof window!=="undefined"&&ce.IsCallable(window.postMessage)){n=function(){var e=[];var t="zero-timeout-message";var r=function(r){M(e,r);window.postMessage(t,"*")};var n=function(r){if(r.source===window&&r.data===t){r.stopPropagation();if(e.length===0){return}var n=N(e);n()}};window.addEventListener("message",n,true);return r}}var o=function(){var e=S.Promise;var t=e&&e.resolve&&e.resolve();return t&&function(e){return t.then(e)}};var i=ce.IsCallable(S.setImmediate)?S.setImmediate:typeof process==="object"&&process.nextTick?process.nextTick:o()||(ce.IsCallable(n)?n():function(t){e(t,0)});var a=function(e){return e};var u=function(e){throw e};var f=0;var s=1;var c=2;var l=0;var p=1;var v=2;var y={};var h=function(e,t,r){i(function(){g(e,t,r)})};var g=function(e,t,r){var n,o;if(t===y){return e(r)}try{n=e(r);o=t.resolve}catch(i){n=i;o=t.reject}o(n)};var d=function(e,t){var r=e._promise;var n=r.reactionLength;if(n>0){h(r.fulfillReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o<n;o++,i+=3){h(r[i+l],r[i+v],t);e[i+l]=void 0;e[i+p]=void 0;e[i+v]=void 0}}}r.result=t;r.state=s;r.reactionLength=0};var m=function(e,t){var r=e._promise;var n=r.reactionLength;if(n>0){h(r.rejectReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o<n;o++,i+=3){h(r[i+p],r[i+v],t);e[i+l]=void 0;e[i+p]=void 0;e[i+v]=void 0}}}r.result=t;r.state=c;r.reactionLength=0};var O=function(e){var t=false;var r=function(r){var n;if(t){return}t=true;if(r===e){return m(e,new TypeError("Self resolution"))}if(!ce.TypeIsObject(r)){return d(e,r)}try{n=r.then}catch(o){return m(e,o)}if(!ce.IsCallable(n)){return d(e,r)}i(function(){j(e,r,n)})};var n=function(r){if(t){return}t=true;return m(e,r)};return{resolve:r,reject:n}};var w=function(e,r,n,o){if(e===I){t(e,r,n,o,y)}else{t(e,r,n,o)}};var j=function(e,t,r){var n=O(e);var o=n.resolve;var i=n.reject;try{w(r,t,o,i)}catch(a){i(a)}};var T,I;var E=function(){var e=function Promise(t){if(!(this instanceof e)){throw new TypeError('Constructor Promise requires "new"')}if(this&&this._promise){throw new TypeError("Bad construction")}if(!ce.IsCallable(t)){throw new TypeError("not a valid resolver")}var r=Ae(this,e,T,{_promise:{result:void 0,state:f,reactionLength:0,fulfillReactionHandler0:void 0,rejectReactionHandler0:void 0,reactionCapability0:void 0}});var n=O(r);var o=n.reject;try{t(n.resolve,o)}catch(i){o(i)}return r};return e}();T=E.prototype;var P=function(e,t,r,n){var o=false;return function(i){if(o){return}o=true;t[e]=i;if(--n.count===0){var a=r.resolve;a(t)}}};var C=function(e,t,r){var n=e.iterator;var o=[];var i={count:1};var a,u;var f=0;while(true){try{a=ce.IteratorStep(n);if(a===false){e.done=true;break}u=a.value}catch(s){e.done=true;throw s}o[f]=void 0;var c=t.resolve(u);var l=P(f,o,r,i);i.count+=1;w(c.then,c,l,r.reject);f+=1}if(--i.count===0){var p=r.resolve;p(o)}return r.promise};var x=function(e,t,r){var n=e.iterator;var o,i,a;while(true){try{o=ce.IteratorStep(n);if(o===false){e.done=true;break}i=o.value}catch(u){e.done=true;throw u}a=t.resolve(i);w(a.then,a,r.resolve,r.reject)}return r.promise};b(E,{all:function all(e){var t=this;if(!ce.TypeIsObject(t)){throw new TypeError("Promise is not object")}var n=new r(t);var o,i;try{o=ce.GetIterator(e);i={iterator:o,done:false};return C(i,t,n)}catch(a){var u=a;if(i&&!i.done){try{ce.IteratorClose(o,true)}catch(f){u=f}}var s=n.reject;s(u);return n.promise}},race:function race(e){var t=this;if(!ce.TypeIsObject(t)){throw new TypeError("Promise is not object")}var n=new r(t);var o,i;try{o=ce.GetIterator(e);i={iterator:o,done:false};return x(i,t,n)}catch(a){var u=a;if(i&&!i.done){try{ce.IteratorClose(o,true)}catch(f){u=f}}var s=n.reject;s(u);return n.promise}},reject:function reject(e){var t=this;if(!ce.TypeIsObject(t)){throw new TypeError("Bad promise constructor")}var n=new r(t);var o=n.reject;o(e);return n.promise},resolve:function resolve(e){var t=this;if(!ce.TypeIsObject(t)){throw new TypeError("Bad promise constructor")}if(ce.IsPromise(e)){var n=e.constructor;if(n===t){return e}}var o=new r(t);var i=o.resolve;i(e);return o.promise}});b(T,{"catch":function(e){return this.then(null,e)},then:function then(e,t){var n=this;if(!ce.IsPromise(n)){throw new TypeError("not a promise")}var o=ce.SpeciesConstructor(n,E);var i;var b=arguments.length>2&&arguments[2]===y;if(b&&o===E){i=y}else{i=new r(o)}var g=ce.IsCallable(e)?e:a;var d=ce.IsCallable(t)?t:u;var m=n._promise;var O;if(m.state===f){if(m.reactionLength===0){m.fulfillReactionHandler0=g;m.rejectReactionHandler0=d;m.reactionCapability0=i}else{var w=3*(m.reactionLength-1);m[w+l]=g;m[w+p]=d;m[w+v]=i}m.reactionLength+=1}else if(m.state===s){O=m.result;h(g,i,O)}else if(m.state===c){O=m.result;h(d,i,O)}else{throw new TypeError("unexpected Promise state")}return i.promise}});y=new r(E);I=T.then;return E}();if(S.Promise){delete S.Promise.accept;delete S.Promise.defer;delete S.Promise.prototype.chain}if(typeof Fr==="function"){b(S,{Promise:Fr});var Dr=w(S.Promise,function(e){return e.resolve(42).then(function(){})instanceof e});var zr=!i(function(){return S.Promise.reject(42).then(null,5).then(null,W)});var qr=i(function(){return S.Promise.call(3,W)});var Wr=function(e){var t=e.resolve(5);t.constructor={};var r=e.resolve(t);try{r.then(null,W).then(null,W)}catch(n){return true}return t===r}(S.Promise);var Gr=s&&function(){var e=0;var t=Object.defineProperty({},"then",{get:function(){e+=1}});Promise.resolve(t);return e===1}();var Hr=function BadResolverPromise(e){var t=new Promise(e);e(3,function(){});this.then=t.then;this.constructor=BadResolverPromise};Hr.prototype=Promise.prototype;Hr.all=Promise.all;var Vr=a(function(){return!!Hr.all([1,2])});if(!Dr||!zr||!qr||Wr||!Gr||Vr){Promise=Fr;ne(S,"Promise",Fr)}if(Promise.all.length!==1){var Br=Promise.all;ne(Promise,"all",function all(e){return ce.Call(Br,this,arguments)})}if(Promise.race.length!==1){var Ur=Promise.race;ne(Promise,"race",function race(e){return ce.Call(Ur,this,arguments)})}if(Promise.resolve.length!==1){var $r=Promise.resolve;ne(Promise,"resolve",function resolve(e){return ce.Call($r,this,arguments)})}if(Promise.reject.length!==1){var Jr=Promise.reject;ne(Promise,"reject",function reject(e){return ce.Call(Jr,this,arguments)})}Mt(Promise,"all");Mt(Promise,"race");Mt(Promise,"resolve");Mt(Promise,"reject");Ce(Promise)}var Xr=function(e){var t=n(p(e,function(e,t){e[t]=true;return e},{}));return e.join(":")===t.join(":")};var Kr=Xr(["z","a","bb"]);var Zr=Xr(["z",1,"a","3",2]);if(s){var Yr=function fastkey(e,t){if(!t&&!Kr){return null}if(se(e)){return"^"+ce.ToString(e)}else if(typeof e==="string"){return"$"+e}else if(typeof e==="number"){if(!Zr){return"n"+e}return e}else if(typeof e==="boolean"){return"b"+e}return null};var Qr=function emptyObject(){return Object.create?Object.create(null):{}};var en=function addIterableToMap(e,n,o){if(r(o)||re.string(o)){l(o,function(e){if(!ce.TypeIsObject(e)){throw new TypeError("Iterator value "+e+" is not an entry object")}n.set(e[0],e[1])})}else if(o instanceof e){t(e.prototype.forEach,o,function(e,t){n.set(t,e)})}else{var i,a;if(!se(o)){a=n.set;if(!ce.IsCallable(a)){throw new TypeError("bad map")}i=ce.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=ce.IteratorStep(i);if(u===false){break}var f=u.value;try{if(!ce.TypeIsObject(f)){throw new TypeError("Iterator value "+f+" is not an entry object")}t(a,n,f[0],f[1])}catch(s){ce.IteratorClose(i,true);throw s}}}}};var tn=function addIterableToSet(e,n,o){if(r(o)||re.string(o)){l(o,function(e){n.add(e)})}else if(o instanceof e){t(e.prototype.forEach,o,function(e){n.add(e)})}else{var i,a;if(!se(o)){a=n.add;if(!ce.IsCallable(a)){throw new TypeError("bad set")}i=ce.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=ce.IteratorStep(i);if(u===false){break}var f=u.value;try{t(a,n,f)}catch(s){ce.IteratorClose(i,true);throw s}}}}};var rn={Map:function(){var e={};var r=function MapEntry(e,t){this.key=e;this.value=t;this.next=null;this.prev=null};r.prototype.isRemoved=function isRemoved(){return this.key===e};var n=function isMap(e){return!!e._es6map};var o=function requireMapSlot(e,t){if(!ce.TypeIsObject(e)||!n(e)){throw new TypeError("Method Map.prototype."+t+" called on incompatible receiver "+ce.ToString(e))}};var i=function MapIterator(e,t){o(e,"[[MapIterator]]");this.head=e._head;this.i=this.head;this.kind=t};i.prototype={isMapIterator:true,next:function next(){if(!this.isMapIterator){throw new TypeError("Not a MapIterator")}var e=this.i;var t=this.kind;var r=this.head;if(typeof this.i==="undefined"){return Ke()}while(e.isRemoved()&&e!==r){e=e.prev}var n;while(e.next!==r){e=e.next;if(!e.isRemoved()){if(t==="key"){n=e.key}else if(t==="value"){n=e.value}else{n=[e.key,e.value]}this.i=e;return Ke(n)}}this.i=void 0;return Ke()}};Me(i.prototype);var a;var u=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}if(this&&this._es6map){throw new TypeError("Bad construction")}var e=Ae(this,Map,a,{_es6map:true,_head:null,_map:G?new G:null,_size:0,_storage:Qr()});var t=new r(null,null);t.next=t.prev=t;e._head=t;if(arguments.length>0){en(Map,e,arguments[0])}return e};a=u.prototype;m.getter(a,"size",function(){if(typeof this._size==="undefined"){throw new TypeError("size method called on incompatible Map")}return this._size});b(a,{get:function get(e){o(this,"get");var t;var r=Yr(e,true);if(r!==null){t=this._storage[r];if(t){return t.value}else{return}}if(this._map){t=V.call(this._map,e);if(t){return t.value}else{return}}var n=this._head;var i=n;while((i=i.next)!==n){if(ce.SameValueZero(i.key,e)){return i.value}}},has:function has(e){o(this,"has");var t=Yr(e,true);if(t!==null){return typeof this._storage[t]!=="undefined"}if(this._map){return B.call(this._map,e)}var r=this._head;var n=r;while((n=n.next)!==r){if(ce.SameValueZero(n.key,e)){return true}}return false},set:function set(e,t){o(this,"set");var n=this._head;var i=n;var a;var u=Yr(e,true);if(u!==null){if(typeof this._storage[u]!=="undefined"){this._storage[u].value=t;return this}else{a=this._storage[u]=new r(e,t);i=n.prev}}else if(this._map){if(B.call(this._map,e)){V.call(this._map,e).value=t}else{a=new r(e,t);U.call(this._map,e,a);i=n.prev}}while((i=i.next)!==n){if(ce.SameValueZero(i.key,e)){i.value=t;return this}}a=a||new r(e,t);if(ce.SameValue(-0,e)){a.key=+0}a.next=this._head;a.prev=this._head.prev;a.prev.next=a;a.next.prev=a;this._size+=1;return this},"delete":function(t){o(this,"delete");var r=this._head;var n=r;var i=Yr(t,true);if(i!==null){if(typeof this._storage[i]==="undefined"){return false}n=this._storage[i].prev;delete this._storage[i]}else if(this._map){if(!B.call(this._map,t)){return false}n=V.call(this._map,t).prev;H.call(this._map,t)}while((n=n.next)!==r){if(ce.SameValueZero(n.key,t)){n.key=e;n.value=e;n.prev.next=n.next;n.next.prev=n.prev;this._size-=1;return true}}return false},clear:function clear(){o(this,"clear");this._map=G?new G:null;this._size=0;this._storage=Qr();var t=this._head;var r=t;var n=r.next;while((r=n)!==t){r.key=e;r.value=e;n=r.next;r.next=r.prev=t}t.next=t.prev=t},keys:function keys(){o(this,"keys");return new i(this,"key")},values:function values(){o(this,"values");return new i(this,"value")},entries:function entries(){o(this,"entries");return new i(this,"key+value")},forEach:function forEach(e){o(this,"forEach");var r=arguments.length>1?arguments[1]:null;var n=this.entries();for(var i=n.next();!i.done;i=n.next()){if(r){t(e,r,i.value[1],i.value[0],this)}else{e(i.value[1],i.value[0],this)}}}});Me(a,a.entries);return u}(),Set:function(){var e=function isSet(e){return e._es6set&&typeof e._storage!=="undefined"};var r=function requireSetSlot(t,r){if(!ce.TypeIsObject(t)||!e(t)){throw new TypeError("Set.prototype."+r+" called on incompatible receiver "+ce.ToString(t))}};var o;var i=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}if(this&&this._es6set){throw new TypeError("Bad construction")}var e=Ae(this,Set,o,{_es6set:true,"[[SetData]]":null,_storage:Qr()});if(!e._es6set){throw new TypeError("bad set")}if(arguments.length>0){tn(Set,e,arguments[0])}return e};o=i.prototype;var a=function(e){var t=e;if(t==="^null"){return null}else if(t==="^undefined"){return void 0}else{var r=t.charAt(0);if(r==="$"){return C(t,1)}else if(r==="n"){return+C(t,1)}else if(r==="b"){return t==="btrue"}}return+t};var u=function ensureMap(e){if(!e["[[SetData]]"]){var t=new rn.Map;e["[[SetData]]"]=t;l(n(e._storage),function(e){var r=a(e);t.set(r,r)});e["[[SetData]]"]=t}e._storage=null};m.getter(i.prototype,"size",function(){r(this,"size");if(this._storage){return n(this._storage).length}u(this);return this["[[SetData]]"].size});b(i.prototype,{has:function has(e){r(this,"has");var t;if(this._storage&&(t=Yr(e))!==null){return!!this._storage[t]}u(this);return this["[[SetData]]"].has(e)},add:function add(e){r(this,"add");var t;if(this._storage&&(t=Yr(e))!==null){this._storage[t]=true;return this}u(this);this["[[SetData]]"].set(e,e);return this},"delete":function(e){r(this,"delete");var t;if(this._storage&&(t=Yr(e))!==null){var n=z(this._storage,t);return delete this._storage[t]&&n}u(this);return this["[[SetData]]"]["delete"](e)},clear:function clear(){r(this,"clear");if(this._storage){this._storage=Qr()}if(this["[[SetData]]"]){this["[[SetData]]"].clear()}},values:function values(){r(this,"values");u(this);return new f(this["[[SetData]]"].values())},entries:function entries(){r(this,"entries");u(this);return new f(this["[[SetData]]"].entries())},forEach:function forEach(e){r(this,"forEach");var n=arguments.length>1?arguments[1]:null;var o=this;u(o);this["[[SetData]]"].forEach(function(r,i){if(n){t(e,n,i,i,o)}else{e(i,i,o)}})}});h(i.prototype,"keys",i.prototype.values,true);Me(i.prototype,i.prototype.values);var f=function SetIterator(e){this.it=e};f.prototype={isSetIterator:true,next:function next(){if(!this.isSetIterator){throw new TypeError("Not a SetIterator")}return this.it.next()}};Me(f.prototype);return i}()};var nn=S.Set&&!Set.prototype["delete"]&&Set.prototype.remove&&Set.prototype.items&&Set.prototype.map&&Array.isArray((new Set).keys);if(nn){S.Set=rn.Set}if(S.Map||S.Set){var on=a(function(){return new Map([[1,2]]).get(1)===2});if(!on){S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new G;if(arguments.length>0){en(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,S.Map.prototype);return e};S.Map.prototype=O(G.prototype);h(S.Map.prototype,"constructor",S.Map,true);m.preserveToString(S.Map,G)}var an=new Map;var un=function(){var e=new Map([[1,0],[2,0],[3,0],[4,0]]);e.set(-0,e);return e.get(0)===e&&e.get(-0)===e&&e.has(0)&&e.has(-0)}();var fn=an.set(1,2)===an;if(!un||!fn){ne(Map.prototype,"set",function set(e,r){t(U,this,e===0?0:e,r);return this})}if(!un){b(Map.prototype,{get:function get(e){return t(V,this,e===0?0:e)},has:function has(e){return t(B,this,e===0?0:e)}},true);m.preserveToString(Map.prototype.get,V);m.preserveToString(Map.prototype.has,B)}var sn=new Set;var cn=Set.prototype["delete"]&&Set.prototype.add&&Set.prototype.has&&function(e){e["delete"](0);e.add(-0);return!e.has(0)}(sn);var ln=sn.add(1)===sn;if(!cn||!ln){var pn=Set.prototype.add;Set.prototype.add=function add(e){t(pn,this,e===0?0:e);return this};m.preserveToString(Set.prototype.add,pn)}if(!cn){var vn=Set.prototype.has;Set.prototype.has=function has(e){return t(vn,this,e===0?0:e)};m.preserveToString(Set.prototype.has,vn);var yn=Set.prototype["delete"];Set.prototype["delete"]=function SetDelete(e){return t(yn,this,e===0?0:e)};m.preserveToString(Set.prototype["delete"],yn)}var hn=w(S.Map,function(e){var t=new e([]);t.set(42,42);return t instanceof e});var bn=Object.setPrototypeOf&&!hn;var gn=function(){try{return!(S.Map()instanceof S.Map)}catch(e){return e instanceof TypeError}}();if(S.Map.length!==0||bn||!gn){S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new G;if(arguments.length>0){en(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Map.prototype);return e};S.Map.prototype=G.prototype;h(S.Map.prototype,"constructor",S.Map,true);m.preserveToString(S.Map,G)}var dn=w(S.Set,function(e){var t=new e([]);t.add(42,42);return t instanceof e});var mn=Object.setPrototypeOf&&!dn;var On=function(){try{return!(S.Set()instanceof S.Set)}catch(e){return e instanceof TypeError}}();if(S.Set.length!==0||mn||!On){var wn=S.Set;S.Set=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}var e=new wn;if(arguments.length>0){tn(Set,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Set.prototype);return e};S.Set.prototype=wn.prototype;h(S.Set.prototype,"constructor",S.Set,true);m.preserveToString(S.Set,wn)}var jn=new S.Map;var Sn=!a(function(){return jn.keys().next().done});if(typeof S.Map.prototype.clear!=="function"||(new S.Set).size!==0||jn.size!==0||typeof S.Map.prototype.keys!=="function"||typeof S.Set.prototype.keys!=="function"||typeof S.Map.prototype.forEach!=="function"||typeof S.Set.prototype.forEach!=="function"||u(S.Map)||u(S.Set)||typeof jn.keys().next!=="function"||Sn||!hn){b(S,{Map:rn.Map,Set:rn.Set},true)}if(S.Set.prototype.keys!==S.Set.prototype.values){h(S.Set.prototype,"keys",S.Set.prototype.values,true)}Me(Object.getPrototypeOf((new S.Map).keys()));Me(Object.getPrototypeOf((new S.Set).keys()));if(c&&S.Set.prototype.has.name!=="has"){var Tn=S.Set.prototype.has;ne(S.Set.prototype,"has",function has(e){return t(Tn,this,e)})}}b(S,rn);Ce(S.Map);Ce(S.Set)}var In=function throwUnlessTargetIsObject(e){if(!ce.TypeIsObject(e)){throw new TypeError("target must be an object")}};var En={apply:function apply(){return ce.Call(ce.Call,null,arguments)},construct:function construct(e,t){if(!ce.IsConstructor(e)){throw new TypeError("First argument must be a constructor.")}var r=arguments.length>2?arguments[2]:e;if(!ce.IsConstructor(r)){throw new TypeError("new.target must be a constructor.")}return ce.Construct(e,t,r,"internal")},deleteProperty:function deleteProperty(e,t){In(e);if(s){var r=Object.getOwnPropertyDescriptor(e,t);if(r&&!r.configurable){return false}}return delete e[t]},has:function has(e,t){In(e);return t in e}};if(Object.getOwnPropertyNames){Object.assign(En,{ownKeys:function ownKeys(e){In(e);var t=Object.getOwnPropertyNames(e);if(ce.IsCallable(Object.getOwnPropertySymbols)){x(t,Object.getOwnPropertySymbols(e))}return t}})}var Pn=function ConvertExceptionToBoolean(e){return!i(e)};if(Object.preventExtensions){Object.assign(En,{isExtensible:function isExtensible(e){In(e);return Object.isExtensible(e)},preventExtensions:function preventExtensions(e){In(e);return Pn(function(){return Object.preventExtensions(e)})}})}if(s){var Cn=function get(e,t,r){var n=Object.getOwnPropertyDescriptor(e,t);if(!n){var o=Object.getPrototypeOf(e);if(o===null){return void 0}return Cn(o,t,r)}if("value"in n){return n.value}if(n.get){return ce.Call(n.get,r)}return void 0};var Mn=function set(e,r,n,o){var i=Object.getOwnPropertyDescriptor(e,r);if(!i){var a=Object.getPrototypeOf(e);if(a!==null){return Mn(a,r,n,o)}i={value:void 0,writable:true,enumerable:true,configurable:true}}if("value"in i){if(!i.writable){return false}if(!ce.TypeIsObject(o)){return false}var u=Object.getOwnPropertyDescriptor(o,r);if(u){return ae.defineProperty(o,r,{value:n})}else{return ae.defineProperty(o,r,{value:n,writable:true,enumerable:true,configurable:true})}}if(i.set){t(i.set,o,n);return true}return false};Object.assign(En,{defineProperty:function defineProperty(e,t,r){In(e);return Pn(function(){return Object.defineProperty(e,t,r)})},getOwnPropertyDescriptor:function getOwnPropertyDescriptor(e,t){In(e);return Object.getOwnPropertyDescriptor(e,t)},get:function get(e,t){In(e);var r=arguments.length>2?arguments[2]:e;return Cn(e,t,r)},set:function set(e,t,r){In(e);var n=arguments.length>3?arguments[3]:e;return Mn(e,t,r,n)}})}if(Object.getPrototypeOf){var xn=Object.getPrototypeOf;En.getPrototypeOf=function getPrototypeOf(e){In(e);return xn(e)}}if(Object.setPrototypeOf&&En.getPrototypeOf){var Nn=function(e,t){var r=t;while(r){if(e===r){return true}r=En.getPrototypeOf(r)}return false};Object.assign(En,{setPrototypeOf:function setPrototypeOf(e,t){In(e);if(t!==null&&!ce.TypeIsObject(t)){throw new TypeError("proto must be an object or null")}if(t===ae.getPrototypeOf(e)){return true}if(ae.isExtensible&&!ae.isExtensible(e)){return false}if(Nn(e,t)){return false}Object.setPrototypeOf(e,t);return true}})}var An=function(e,t){if(!ce.IsCallable(S.Reflect[e])){h(S.Reflect,e,t)}else{var r=a(function(){S.Reflect[e](1);S.Reflect[e](NaN);S.Reflect[e](true);return true});if(r){ne(S.Reflect,e,t)}}};Object.keys(En).forEach(function(e){An(e,En[e])});var Rn=S.Reflect.getPrototypeOf;if(c&&Rn&&Rn.name!=="getPrototypeOf"){ne(S.Reflect,"getPrototypeOf",function getPrototypeOf(e){return t(Rn,S.Reflect,e)})}if(S.Reflect.setPrototypeOf){if(a(function(){S.Reflect.setPrototypeOf(1,{});return true})){ne(S.Reflect,"setPrototypeOf",En.setPrototypeOf)}}if(S.Reflect.defineProperty){if(!a(function(){var e=!S.Reflect.defineProperty(1,"test",{value:1});var t=typeof Object.preventExtensions!=="function"||!S.Reflect.defineProperty(Object.preventExtensions({}),"test",{});return e&&t})){ne(S.Reflect,"defineProperty",En.defineProperty)}}if(S.Reflect.construct){if(!a(function(){var e=function F(){};return S.Reflect.construct(function(){},[],e)instanceof e})){ne(S.Reflect,"construct",En.construct)}}if(String(new Date(NaN))!=="Invalid Date"){var _n=Date.prototype.toString;var kn=function toString(){var e=+this;if(e!==e){return"Invalid Date"}return ce.Call(_n,this)};ne(Date.prototype,"toString",kn)}var Ln={anchor:function anchor(e){return ce.CreateHTML(this,"a","name",e)},big:function big(){return ce.CreateHTML(this,"big","","")},blink:function blink(){return ce.CreateHTML(this,"blink","","")},bold:function bold(){return ce.CreateHTML(this,"b","","")},fixed:function fixed(){return ce.CreateHTML(this,"tt","","")},fontcolor:function fontcolor(e){return ce.CreateHTML(this,"font","color",e)},fontsize:function fontsize(e){return ce.CreateHTML(this,"font","size",e)},italics:function italics(){return ce.CreateHTML(this,"i","","")},link:function link(e){return ce.CreateHTML(this,"a","href",e)},small:function small(){return ce.CreateHTML(this,"small","","")},strike:function strike(){return ce.CreateHTML(this,"strike","","")},sub:function sub(){return ce.CreateHTML(this,"sub","","")},sup:function sub(){return ce.CreateHTML(this,"sup","","")}};l(Object.keys(Ln),function(e){var r=String.prototype[e];var n=false;if(ce.IsCallable(r)){var o=t(r,"",' " ');var i=P([],o.match(/"/g)).length;n=o!==o.toLowerCase()||i>2}else{n=true}if(n){ne(String.prototype,e,Ln[e])}});var Fn=function(){if(!oe){return false}var e=typeof JSON==="object"&&typeof JSON.stringify==="function"?JSON.stringify:null;if(!e){return false}if(typeof e($())!=="undefined"){return true}if(e([$()])!=="[null]"){return true}var t={a:$()};t[$()]=true;if(e(t)!=="{}"){return true}return false}();var Dn=a(function(){if(!oe){return true}return JSON.stringify(Object($()))==="{}"&&JSON.stringify([Object($())])==="[{}]"});if(Fn||!Dn){var zn=JSON.stringify;ne(JSON,"stringify",function stringify(e){if(typeof e==="symbol"){return}var n;if(arguments.length>1){n=arguments[1]}var o=[e];if(!r(n)){var i=ce.IsCallable(n)?n:null;var a=function(e,r){var n=i?t(i,this,e,r):r;if(typeof n!=="symbol"){if(re.symbol(n)){return Nt({})(n)}else{return n}}};o.push(a)}else{o.push(n)}if(arguments.length>2){o.push(arguments[2])}return zn.apply(this,o)})}return S});

// CHANGE 3
/*!
 * Copyright (c) 2014-2016 GitHub, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
!function(t){"use strict";var e={searchParams:"URLSearchParams"in t,iterable:"Symbol"in t&&"iterator"in Symbol,blob:!1,formData:"FormData"in t,arrayBuffer:"ArrayBuffer"in t};if(e.arrayBuffer)var r=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],o=function(t){return t&&DataView.prototype.isPrototypeOf(t)},n=ArrayBuffer.isView||function(t){return t&&r.indexOf(Object.prototype.toString.call(t))>-1};function i(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return t.toLowerCase()}function s(t){return"string"!=typeof t&&(t=String(t)),t}function a(t){var r={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return e.iterable&&(r[Symbol.iterator]=function(){return r}),r}function h(t){this.map={},t instanceof h?t.forEach(function(t,e){this.append(e,t)},this):Array.isArray(t)?t.forEach(function(t){this.append(t[0],t[1])},this):t&&Object.getOwnPropertyNames(t).forEach(function(e){this.append(e,t[e])},this)}function u(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function f(t){return new Promise(function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}})}function d(t){var e=new FileReader,r=f(e);return e.readAsArrayBuffer(t),r}function y(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function p(){return this.bodyUsed=!1,this._initBody=function(t){if(this._bodyInit=t,t)if("string"==typeof t)this._bodyText=t;else if(e.blob&&Blob.prototype.isPrototypeOf(t))this._bodyBlob=t;else if(e.formData&&FormData.prototype.isPrototypeOf(t))this._bodyFormData=t;else if(e.searchParams&&URLSearchParams.prototype.isPrototypeOf(t))this._bodyText=t.toString();else if(e.arrayBuffer&&e.blob&&o(t))this._bodyArrayBuffer=y(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer]);else{if(!e.arrayBuffer||!ArrayBuffer.prototype.isPrototypeOf(t)&&!n(t))throw new Error("unsupported BodyInit type");this._bodyArrayBuffer=y(t)}else this._bodyText="";this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):e.searchParams&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},e.blob&&(this.blob=function(){var t=u(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?u(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(d)}),this.text=function(){var t,e,r,o=u(this);if(o)return o;if(this._bodyBlob)return t=this._bodyBlob,e=new FileReader,r=f(e),e.readAsText(t),r;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),o=0;o<e.length;o++)r[o]=String.fromCharCode(e[o]);return r.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},e.formData&&(this.formData=function(){return this.text().then(b)}),this.json=function(){return this.text().then(JSON.parse)},this}h.prototype.append=function(t,e){t=i(t),e=s(e);var r=this.map[t];this.map[t]=r?r+","+e:e},h.prototype.delete=function(t){delete this.map[i(t)]},h.prototype.get=function(t){return t=i(t),this.has(t)?this.map[t]:null},h.prototype.has=function(t){return this.map.hasOwnProperty(i(t))},h.prototype.set=function(t,e){this.map[i(t)]=s(e)},h.prototype.forEach=function(t,e){for(var r in this.map)this.map.hasOwnProperty(r)&&t.call(e,this.map[r],r,this)},h.prototype.keys=function(){var t=[];return this.forEach(function(e,r){t.push(r)}),a(t)},h.prototype.values=function(){var t=[];return this.forEach(function(e){t.push(e)}),a(t)},h.prototype.entries=function(){var t=[];return this.forEach(function(e,r){t.push([r,e])}),a(t)},e.iterable&&(h.prototype[Symbol.iterator]=h.prototype.entries);var l=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];function c(t,e){var r,o,n=(e=e||{}).body;if(t instanceof c){if(t.bodyUsed)throw new TypeError("Already read");this.url=t.url,this.credentials=t.credentials,e.headers||(this.headers=new h(t.headers)),this.method=t.method,this.mode=t.mode,n||null==t._bodyInit||(n=t._bodyInit,t.bodyUsed=!0)}else this.url=String(t);if(this.credentials=e.credentials||this.credentials||"omit",!e.headers&&this.headers||(this.headers=new h(e.headers)),this.method=(r=e.method||this.method||"GET",o=r.toUpperCase(),l.indexOf(o)>-1?o:r),this.mode=e.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n)}function b(t){var e=new FormData;return t.trim().split("&").forEach(function(t){if(t){var r=t.split("="),o=r.shift().replace(/\+/g," "),n=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(o),decodeURIComponent(n))}}),e}function m(t,e){e||(e={}),this.type="default",this.status="status"in e?e.status:200,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new h(e.headers),this.url=e.url||"",this._initBody(t)}c.prototype.clone=function(){return new c(this,{body:this._bodyInit})},p.call(c.prototype),p.call(m.prototype),m.prototype.clone=function(){return new m(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new h(this.headers),url:this.url})},m.error=function(){var t=new m(null,{status:0,statusText:""});return t.type="error",t};var w=[301,302,303,307,308];m.redirect=function(t,e){if(-1===w.indexOf(e))throw new RangeError("Invalid status code");return new m(null,{status:e,headers:{location:t}})},t.Headers=h,t.Request=c,t.Response=m,t.fetch=function(t,r){return new Promise(function(o,n){var i=new c(t,r),s=new XMLHttpRequest;s.onload=function(){var t,e,r={status:s.status,statusText:s.statusText,headers:(t=s.getAllResponseHeaders()||"",e=new h,t.split(/\r?\n/).forEach(function(t){var r=t.split(":"),o=r.shift().trim();if(o){var n=r.join(":").trim();e.append(o,n)}}),e)};r.url="responseURL"in s?s.responseURL:r.headers.get("X-Request-URL");var n="response"in s?s.response:s.responseText;o(new m(n,r))},s.onerror=function(){n(new TypeError("Network request failed"))},s.ontimeout=function(){n(new TypeError("Network request failed"))},s.open(i.method,i.url,!0),"include"===i.credentials&&(s.withCredentials=!0),"responseType"in s&&e.blob&&(s.responseType="blob"),i.headers.forEach(function(t,e){s.setRequestHeader(e,t)}),s.send(void 0===i._bodyInit?null:i._bodyInit)})},t.fetch.polyfill=!0}("undefined"!=typeof self?self:this);

(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define("pdfjs-dist/build/pdf", [], factory);
	else if(typeof exports === 'object')
		exports["pdfjs-dist/build/pdf"] = factory();
	else
		root["pdfjs-dist/build/pdf"] = root.pdfjsLib = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __w_pdfjs_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__w_pdfjs_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__w_pdfjs_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__w_pdfjs_require__.d = function(exports, name, getter) {
/******/ 		if(!__w_pdfjs_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__w_pdfjs_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__w_pdfjs_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __w_pdfjs_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__w_pdfjs_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __w_pdfjs_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__w_pdfjs_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__w_pdfjs_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__w_pdfjs_require__.p = "";
/******/
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __w_pdfjs_require__(__w_pdfjs_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var pdfjsVersion = '2.1.266';
var pdfjsBuild = '81f5835c';

var pdfjsSharedUtil = __w_pdfjs_require__(1);

var pdfjsDisplayAPI = __w_pdfjs_require__(146);

var pdfjsDisplayTextLayer = __w_pdfjs_require__(162);

var pdfjsDisplayAnnotationLayer = __w_pdfjs_require__(163);

var pdfjsDisplayDOMUtils = __w_pdfjs_require__(151);

var pdfjsDisplaySVG = __w_pdfjs_require__(164);

var pdfjsDisplayWorkerOptions = __w_pdfjs_require__(156);

var pdfjsDisplayAPICompatibility = __w_pdfjs_require__(153);

{
  var isNodeJS = __w_pdfjs_require__(4);

  if (isNodeJS()) {
    var PDFNodeStream = __w_pdfjs_require__(165).PDFNodeStream;

    pdfjsDisplayAPI.setPDFNetworkStreamFactory(function (params) {
      return new PDFNodeStream(params);
    });
  } else if (typeof Response !== 'undefined' && 'body' in Response.prototype && typeof ReadableStream !== 'undefined') {
    var PDFFetchStream = __w_pdfjs_require__(168).PDFFetchStream;

    pdfjsDisplayAPI.setPDFNetworkStreamFactory(function (params) {
      return new PDFFetchStream(params);
    });
  } else {
    var PDFNetworkStream = __w_pdfjs_require__(169).PDFNetworkStream;

    pdfjsDisplayAPI.setPDFNetworkStreamFactory(function (params) {
      return new PDFNetworkStream(params);
    });
  }
}
exports.build = pdfjsDisplayAPI.build;
exports.version = pdfjsDisplayAPI.version;
exports.getDocument = pdfjsDisplayAPI.getDocument;
exports.LoopbackPort = pdfjsDisplayAPI.LoopbackPort;
exports.PDFDataRangeTransport = pdfjsDisplayAPI.PDFDataRangeTransport;
exports.PDFWorker = pdfjsDisplayAPI.PDFWorker;
exports.renderTextLayer = pdfjsDisplayTextLayer.renderTextLayer;
exports.AnnotationLayer = pdfjsDisplayAnnotationLayer.AnnotationLayer;
exports.createPromiseCapability = pdfjsSharedUtil.createPromiseCapability;
exports.PasswordResponses = pdfjsSharedUtil.PasswordResponses;
exports.InvalidPDFException = pdfjsSharedUtil.InvalidPDFException;
exports.MissingPDFException = pdfjsSharedUtil.MissingPDFException;
exports.SVGGraphics = pdfjsDisplaySVG.SVGGraphics;
exports.NativeImageDecoding = pdfjsSharedUtil.NativeImageDecoding;
exports.CMapCompressionType = pdfjsSharedUtil.CMapCompressionType;
exports.PermissionFlag = pdfjsSharedUtil.PermissionFlag;
exports.UnexpectedResponseException = pdfjsSharedUtil.UnexpectedResponseException;
exports.OPS = pdfjsSharedUtil.OPS;
exports.VerbosityLevel = pdfjsSharedUtil.VerbosityLevel;
exports.UNSUPPORTED_FEATURES = pdfjsSharedUtil.UNSUPPORTED_FEATURES;
exports.createValidAbsoluteUrl = pdfjsSharedUtil.createValidAbsoluteUrl;
exports.createObjectURL = pdfjsSharedUtil.createObjectURL;
exports.removeNullCharacters = pdfjsSharedUtil.removeNullCharacters;
exports.shadow = pdfjsSharedUtil.shadow;
exports.Util = pdfjsSharedUtil.Util;
exports.ReadableStream = pdfjsSharedUtil.ReadableStream;
exports.URL = pdfjsSharedUtil.URL;
exports.RenderingCancelledException = pdfjsDisplayDOMUtils.RenderingCancelledException;
exports.getFilenameFromUrl = pdfjsDisplayDOMUtils.getFilenameFromUrl;
exports.LinkTarget = pdfjsDisplayDOMUtils.LinkTarget;
exports.addLinkAttributes = pdfjsDisplayDOMUtils.addLinkAttributes;
exports.loadScript = pdfjsDisplayDOMUtils.loadScript;
exports.GlobalWorkerOptions = pdfjsDisplayWorkerOptions.GlobalWorkerOptions;
exports.apiCompatibilityParams = pdfjsDisplayAPICompatibility.apiCompatibilityParams;

/***/ }),
/* 1 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.toRomanNumerals = toRomanNumerals;
exports.arrayByteLength = arrayByteLength;
exports.arraysToBytes = arraysToBytes;
exports.assert = assert;
exports.bytesToString = bytesToString;
exports.createPromiseCapability = createPromiseCapability;
exports.deprecated = deprecated;
exports.getInheritableProperty = getInheritableProperty;
exports.getLookupTableFactory = getLookupTableFactory;
exports.getVerbosityLevel = getVerbosityLevel;
exports.info = info;
exports.isArrayBuffer = isArrayBuffer;
exports.isBool = isBool;
exports.isEmptyObj = isEmptyObj;
exports.isNum = isNum;
exports.isString = isString;
exports.isSpace = isSpace;
exports.isSameOrigin = isSameOrigin;
exports.createValidAbsoluteUrl = createValidAbsoluteUrl;
exports.isLittleEndian = isLittleEndian;
exports.isEvalSupported = isEvalSupported;
exports.log2 = log2;
exports.readInt8 = readInt8;
exports.readUint16 = readUint16;
exports.readUint32 = readUint32;
exports.removeNullCharacters = removeNullCharacters;
exports.setVerbosityLevel = setVerbosityLevel;
exports.shadow = shadow;
exports.string32 = string32;
exports.stringToBytes = stringToBytes;
exports.stringToPDFString = stringToPDFString;
exports.stringToUTF8String = stringToUTF8String;
exports.utf8StringToString = utf8StringToString;
exports.warn = warn;
exports.unreachable = unreachable;
Object.defineProperty(exports, "ReadableStream", {
  enumerable: true,
  get: function get() {
    return _streams_polyfill.ReadableStream;
  }
});
Object.defineProperty(exports, "URL", {
  enumerable: true,
  get: function get() {
    return _url_polyfill.URL;
  }
});
exports.createObjectURL = exports.FormatError = exports.XRefParseException = exports.XRefEntryException = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.NativeImageDecoding = exports.MissingPDFException = exports.MissingDataException = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VerbosityLevel = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = void 0;

__w_pdfjs_require__(2);

var _streams_polyfill = __w_pdfjs_require__(142);

var _url_polyfill = __w_pdfjs_require__(144);

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
exports.IDENTITY_MATRIX = IDENTITY_MATRIX;
var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX;
var NativeImageDecoding = {
  NONE: 'none',
  DECODE: 'decode',
  DISPLAY: 'display'
};
exports.NativeImageDecoding = NativeImageDecoding;
var PermissionFlag = {
  PRINT: 0x04,
  MODIFY_CONTENTS: 0x08,
  COPY: 0x10,
  MODIFY_ANNOTATIONS: 0x20,
  FILL_INTERACTIVE_FORMS: 0x100,
  COPY_FOR_ACCESSIBILITY: 0x200,
  ASSEMBLE: 0x400,
  PRINT_HIGH_QUALITY: 0x800
};
exports.PermissionFlag = PermissionFlag;
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
};
exports.TextRenderingMode = TextRenderingMode;
var ImageKind = {
  GRAYSCALE_1BPP: 1,
  RGB_24BPP: 2,
  RGBA_32BPP: 3
};
exports.ImageKind = ImageKind;
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
};
exports.AnnotationType = AnnotationType;
var AnnotationFlag = {
  INVISIBLE: 0x01,
  HIDDEN: 0x02,
  PRINT: 0x04,
  NOZOOM: 0x08,
  NOROTATE: 0x10,
  NOVIEW: 0x20,
  READONLY: 0x40,
  LOCKED: 0x80,
  TOGGLENOVIEW: 0x100,
  LOCKEDCONTENTS: 0x200
};
exports.AnnotationFlag = AnnotationFlag;
var AnnotationFieldFlag = {
  READONLY: 0x0000001,
  REQUIRED: 0x0000002,
  NOEXPORT: 0x0000004,
  MULTILINE: 0x0001000,
  PASSWORD: 0x0002000,
  NOTOGGLETOOFF: 0x0004000,
  RADIO: 0x0008000,
  PUSHBUTTON: 0x0010000,
  COMBO: 0x0020000,
  EDIT: 0x0040000,
  SORT: 0x0080000,
  FILESELECT: 0x0100000,
  MULTISELECT: 0x0200000,
  DONOTSPELLCHECK: 0x0400000,
  DONOTSCROLL: 0x0800000,
  COMB: 0x1000000,
  RICHTEXT: 0x2000000,
  RADIOSINUNISON: 0x2000000,
  COMMITONSELCHANGE: 0x4000000
};
exports.AnnotationFieldFlag = AnnotationFieldFlag;
var AnnotationBorderStyleType = {
  SOLID: 1,
  DASHED: 2,
  BEVELED: 3,
  INSET: 4,
  UNDERLINE: 5
};
exports.AnnotationBorderStyleType = AnnotationBorderStyleType;
var StreamType = {
  UNKNOWN: 0,
  FLATE: 1,
  LZW: 2,
  DCT: 3,
  JPX: 4,
  JBIG: 5,
  A85: 6,
  AHX: 7,
  CCF: 8,
  RL: 9
};
exports.StreamType = StreamType;
var FontType = {
  UNKNOWN: 0,
  TYPE1: 1,
  TYPE1C: 2,
  CIDFONTTYPE0: 3,
  CIDFONTTYPE0C: 4,
  TRUETYPE: 5,
  CIDFONTTYPE2: 6,
  TYPE3: 7,
  OPENTYPE: 8,
  TYPE0: 9,
  MMTYPE1: 10
};
exports.FontType = FontType;
var VerbosityLevel = {
  ERRORS: 0,
  WARNINGS: 1,
  INFOS: 5
};
exports.VerbosityLevel = VerbosityLevel;
var CMapCompressionType = {
  NONE: 0,
  BINARY: 1,
  STREAM: 2
};
exports.CMapCompressionType = CMapCompressionType;
var OPS = {
  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
};
exports.OPS = OPS;
var UNSUPPORTED_FEATURES = {
  unknown: 'unknown',
  forms: 'forms',
  javaScript: 'javaScript',
  smask: 'smask',
  shadingPattern: 'shadingPattern',
  font: 'font'
};
exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES;
var PasswordResponses = {
  NEED_PASSWORD: 1,
  INCORRECT_PASSWORD: 2
};
exports.PasswordResponses = PasswordResponses;
var verbosity = VerbosityLevel.WARNINGS;

function setVerbosityLevel(level) {
  if (Number.isInteger(level)) {
    verbosity = level;
  }
}

function getVerbosityLevel() {
  return verbosity;
}

function info(msg) {
  if (verbosity >= VerbosityLevel.INFOS) {
    console.log('Info: ' + msg);
  }
}

function warn(msg) {
  if (verbosity >= VerbosityLevel.WARNINGS) {
    console.log('Warning: ' + msg);
  }
}

function deprecated(details) {
  console.log('Deprecated API usage: ' + details);
}

function unreachable(msg) {
  throw new Error(msg);
}

function assert(cond, msg) {
  if (!cond) {
    unreachable(msg);
  }
}

function isSameOrigin(baseUrl, otherUrl) {
  try {
    var base = new _url_polyfill.URL(baseUrl);

    if (!base.origin || base.origin === 'null') {
      return false;
    }
  } catch (e) {
    return false;
  }

  var other = new _url_polyfill.URL(otherUrl, base);
  return base.origin === other.origin;
}

function _isValidProtocol(url) {
  if (!url) {
    return false;
  }

  switch (url.protocol) {
    case 'http:':
    case 'https:':
    case 'ftp:':
    case 'mailto:':
    case 'tel:':
      return true;

    default:
      return false;
  }
}

function createValidAbsoluteUrl(url, baseUrl) {
  if (!url) {
    return null;
  }

  try {
    var absoluteUrl = baseUrl ? new _url_polyfill.URL(url, baseUrl) : new _url_polyfill.URL(url);

    if (_isValidProtocol(absoluteUrl)) {
      return absoluteUrl;
    }
  } catch (ex) {}

  return null;
}

function shadow(obj, prop, value) {
  Object.defineProperty(obj, prop, {
    value: value,
    enumerable: true,
    configurable: true,
    writable: false
  });
  return value;
}

function getLookupTableFactory(initializer) {
  var lookup;
  return function () {
    if (initializer) {
      lookup = Object.create(null);
      initializer(lookup);
      initializer = null;
    }

    return lookup;
  };
}

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;
}();

exports.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;
}();

exports.UnknownErrorException = UnknownErrorException;

var InvalidPDFException = function InvalidPDFExceptionClosure() {
  function InvalidPDFException(msg) {
    this.name = 'InvalidPDFException';
    this.message = msg;
  }

  InvalidPDFException.prototype = new Error();
  InvalidPDFException.constructor = InvalidPDFException;
  return InvalidPDFException;
}();

exports.InvalidPDFException = InvalidPDFException;

var MissingPDFException = function MissingPDFExceptionClosure() {
  function MissingPDFException(msg) {
    this.name = 'MissingPDFException';
    this.message = msg;
  }

  MissingPDFException.prototype = new Error();
  MissingPDFException.constructor = MissingPDFException;
  return MissingPDFException;
}();

exports.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;
}();

exports.UnexpectedResponseException = UnexpectedResponseException;

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;
}();

exports.MissingDataException = MissingDataException;

var XRefEntryException = function XRefEntryExceptionClosure() {
  function XRefEntryException(msg) {
    this.message = msg;
  }

  XRefEntryException.prototype = new Error();
  XRefEntryException.prototype.name = 'XRefEntryException';
  XRefEntryException.constructor = XRefEntryException;
  return XRefEntryException;
}();

exports.XRefEntryException = XRefEntryException;

var XRefParseException = function XRefParseExceptionClosure() {
  function XRefParseException(msg) {
    this.message = msg;
  }

  XRefParseException.prototype = new Error();
  XRefParseException.prototype.name = 'XRefParseException';
  XRefParseException.constructor = XRefParseException;
  return XRefParseException;
}();

exports.XRefParseException = XRefParseException;

var FormatError = function FormatErrorClosure() {
  function FormatError(msg) {
    this.message = msg;
  }

  FormatError.prototype = new Error();
  FormatError.prototype.name = 'FormatError';
  FormatError.constructor = FormatError;
  return FormatError;
}();

exports.FormatError = FormatError;

var AbortException = function AbortExceptionClosure() {
  function AbortException(msg) {
    this.name = 'AbortException';
    this.message = msg;
  }

  AbortException.prototype = new Error();
  AbortException.constructor = AbortException;
  return AbortException;
}();

exports.AbortException = AbortException;
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, '');
}

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 arrayByteLength(arr) {
  if (arr.length !== undefined) {
    return arr.length;
  }

  assert(arr.byteLength !== undefined);
  return arr.byteLength;
}

function arraysToBytes(arr) {
  if (arr.length === 1 && arr[0] instanceof Uint8Array) {
    return arr[0];
  }

  var resultLength = 0;
  var i,
      ii = arr.length;
  var item, itemLength;

  for (i = 0; i < ii; i++) {
    item = arr[i];
    itemLength = arrayByteLength(item);
    resultLength += itemLength;
  }

  var pos = 0;
  var data = new Uint8Array(resultLength);

  for (i = 0; i < ii; i++) {
    item = arr[i];

    if (!(item instanceof Uint8Array)) {
      if (typeof item === 'string') {
        item = stringToBytes(item);
      } else {
        item = new Uint8Array(item);
      }
    }

    itemLength = item.byteLength;
    data.set(item, pos);
    pos += itemLength;
  }

  return data;
}

function string32(value) {
  return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);
}

function log2(x) {
  if (x <= 0) {
    return 0;
  }

  return Math.ceil(Math.log2(x));
}

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;
}

function isLittleEndian() {
  var buffer8 = new Uint8Array(4);
  buffer8[0] = 1;
  var view32 = new Uint32Array(buffer8.buffer, 0, 1);
  return view32[0] === 1;
}

function isEvalSupported() {
  try {
    new Function('');
    return true;
  } catch (e) {
    return false;
  }
}

function getInheritableProperty(_ref) {
  var dict = _ref.dict,
      key = _ref.key,
      _ref$getArray = _ref.getArray,
      getArray = _ref$getArray === void 0 ? false : _ref$getArray,
      _ref$stopWhenFound = _ref.stopWhenFound,
      stopWhenFound = _ref$stopWhenFound === void 0 ? true : _ref$stopWhenFound;
  var LOOP_LIMIT = 100;
  var loopCount = 0;
  var values;

  while (dict) {
    var value = getArray ? dict.getArray(key) : dict.get(key);

    if (value !== undefined) {
      if (stopWhenFound) {
        return value;
      }

      if (!values) {
        values = [];
      }

      values.push(value);
    }

    if (++loopCount > LOOP_LIMIT) {
      warn("getInheritableProperty: maximum loop count exceeded for \"".concat(key, "\""));
      break;
    }

    dict = dict.get('Parent');
  }

  return values;
}

var Util = function UtilClosure() {
  function Util() {}

  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];

  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
    rgbBuf[1] = r;
    rgbBuf[3] = g;
    rgbBuf[5] = b;
    return rgbBuf.join('');
  };

  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]];
  };

  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];
  };

  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];
  };

  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]];
  };

  Util.singularValueDecompose2dScale = function Util_singularValueDecompose2dScale(m) {
    var transpose = [m[0], m[2], m[1], m[3]];
    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];
    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;
    return [Math.sqrt(sx), Math.sqrt(sy)];
  };

  Util.normalizeRect = function Util_normalizeRect(rect) {
    var r = rect.slice(0);

    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;
  };

  Util.intersect = function Util_intersect(rect1, rect2) {
    function compare(a, b) {
      return a - b;
    }

    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);

    if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) {
      result[0] = orderedX[1];
      result[2] = orderedX[2];
    } else {
      return false;
    }

    if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {
      result[1] = orderedY[1];
      result[3] = orderedY[2];
    } else {
      return false;
    }

    return result;
  };

  return Util;
}();

exports.Util = Util;
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'];

function toRomanNumerals(number) {
  var lowerCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  assert(Number.isInteger(number) && number > 0, 'The number should be a positive integer.');
  var pos,
      romanBuf = [];

  while (number >= 1000) {
    number -= 1000;
    romanBuf.push('M');
  }

  pos = number / 100 | 0;
  number %= 100;
  romanBuf.push(ROMAN_NUMBER_MAP[pos]);
  pos = number / 10 | 0;
  number %= 10;
  romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);
  romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);
  var romanStr = romanBuf.join('');
  return lowerCase ? romanStr.toLowerCase() : romanStr;
}

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') {
    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 isNum(v) {
  return typeof v === 'number';
}

function isString(v) {
  return typeof v === 'string';
}

function isArrayBuffer(v) {
  return _typeof(v) === 'object' && v !== null && v.byteLength !== undefined;
}

function isSpace(ch) {
  return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A;
}

function createPromiseCapability() {
  var capability = Object.create(null);
  var isSettled = false;
  Object.defineProperty(capability, 'settled', {
    get: function get() {
      return isSettled;
    }
  });
  capability.promise = new Promise(function (resolve, reject) {
    capability.resolve = function (data) {
      isSettled = true;
      resolve(data);
    };

    capability.reject = function (reason) {
      isSettled = true;
      reject(reason);
    };
  });
  return capability;
}

var createObjectURL = function createObjectURLClosure() {
  var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  return function createObjectURL(data, contentType) {
    var forceDataSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;

    if (!forceDataSchema && _url_polyfill.URL.createObjectURL) {
      var blob = new Blob([data], {
        type: contentType
      });
      return _url_polyfill.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;
  };
}();

exports.createObjectURL = createObjectURL;

/***/ }),
/* 2 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var globalScope = __w_pdfjs_require__(3);

if (!globalScope._pdfjsCompatibilityChecked) {
  globalScope._pdfjsCompatibilityChecked = true;

  var isNodeJS = __w_pdfjs_require__(4);

  var hasDOM = (typeof window === "undefined" ? "undefined" : _typeof(window)) === 'object' && (typeof document === "undefined" ? "undefined" : _typeof(document)) === 'object';

  (function checkNodeBtoa() {
    if (globalScope.btoa || !isNodeJS()) {
      return;
    }

    globalScope.btoa = function (chars) {
      return Buffer.from(chars, 'binary').toString('base64');
    };
  })();

  (function checkNodeAtob() {
    if (globalScope.atob || !isNodeJS()) {
      return;
    }

    globalScope.atob = function (input) {
      return Buffer.from(input, 'base64').toString('binary');
    };
  })();

  (function checkChildNodeRemove() {
    if (!hasDOM) {
      return;
    }

    if (typeof Element.prototype.remove !== 'undefined') {
      return;
    }

    Element.prototype.remove = function () {
      if (this.parentNode) {
        this.parentNode.removeChild(this);
      }
    };
  })();

  (function checkDOMTokenListAddRemove() {
    if (!hasDOM || isNodeJS()) {
      return;
    }

    var div = document.createElement('div');
    div.classList.add('testOne', 'testTwo');

    if (div.classList.contains('testOne') === true && div.classList.contains('testTwo') === true) {
      return;
    }

    var OriginalDOMTokenListAdd = DOMTokenList.prototype.add;
    var OriginalDOMTokenListRemove = DOMTokenList.prototype.remove;

    DOMTokenList.prototype.add = function () {
      for (var _len = arguments.length, tokens = new Array(_len), _key = 0; _key < _len; _key++) {
        tokens[_key] = arguments[_key];
      }

      for (var _i = 0; _i < tokens.length; _i++) {
        var token = tokens[_i];
        OriginalDOMTokenListAdd.call(this, token);
      }
    };

    DOMTokenList.prototype.remove = function () {
      for (var _len2 = arguments.length, tokens = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
        tokens[_key2] = arguments[_key2];
      }

      for (var _i2 = 0; _i2 < tokens.length; _i2++) {
        var token = tokens[_i2];
        OriginalDOMTokenListRemove.call(this, token);
      }
    };
  })();

  (function checkDOMTokenListToggle() {
    if (!hasDOM || isNodeJS()) {
      return;
    }

    var div = document.createElement('div');

    if (div.classList.toggle('test', 0) === false) {
      return;
    }

    DOMTokenList.prototype.toggle = function (token) {
      var force = arguments.length > 1 ? !!arguments[1] : !this.contains(token);
      return this[force ? 'add' : 'remove'](token), force;
    };
  })();

  (function checkStringStartsWith() {
    if (String.prototype.startsWith) {
      return;
    }

    __w_pdfjs_require__(5);
  })();

  (function checkStringEndsWith() {
    if (String.prototype.endsWith) {
      return;
    }

    __w_pdfjs_require__(35);
  })();

  (function checkStringIncludes() {
    if (String.prototype.includes) {
      return;
    }

    __w_pdfjs_require__(37);
  })();

  (function checkArrayIncludes() {
    if (Array.prototype.includes) {
      return;
    }

    __w_pdfjs_require__(39);
  })();

  (function checkArrayFrom() {
    if (Array.from) {
      return;
    }

    __w_pdfjs_require__(46);
  })();

  (function checkObjectAssign() {
    if (Object.assign) {
      return;
    }

    __w_pdfjs_require__(69);
  })();

  (function checkMathLog2() {
    if (Math.log2) {
      return;
    }

    Math.log2 = __w_pdfjs_require__(74);
  })();

  (function checkNumberIsNaN() {
    if (Number.isNaN) {
      return;
    }

    Number.isNaN = __w_pdfjs_require__(76);
  })();

  (function checkNumberIsInteger() {
    if (Number.isInteger) {
      return;
    }

    Number.isInteger = __w_pdfjs_require__(78);
  })();

  (function checkPromise() {
    if (globalScope.Promise && globalScope.Promise.prototype && globalScope.Promise.prototype.finally) {
      return;
    }

    globalScope.Promise = __w_pdfjs_require__(81);
  })();

  (function checkWeakMap() {
    if (globalScope.WeakMap) {
      return;
    }

    globalScope.WeakMap = __w_pdfjs_require__(101);
  })();

  (function checkWeakSet() {
    if (globalScope.WeakSet) {
      return;
    }

    globalScope.WeakSet = __w_pdfjs_require__(118);
  })();

  (function checkStringCodePointAt() {
    if (String.codePointAt) {
      return;
    }

    String.codePointAt = __w_pdfjs_require__(122);
  })();

  (function checkStringFromCodePoint() {
    if (String.fromCodePoint) {
      return;
    }

    String.fromCodePoint = __w_pdfjs_require__(124);
  })();

  (function checkSymbol() {
    if (globalScope.Symbol) {
      return;
    }

    __w_pdfjs_require__(126);
  })();

  (function checkStringPadStart() {
    if (String.prototype.padStart) {
      return;
    }

    __w_pdfjs_require__(133);
  })();

  (function checkStringPadEnd() {
    if (String.prototype.padEnd) {
      return;
    }

    __w_pdfjs_require__(137);
  })();

  (function checkObjectValues() {
    if (Object.values) {
      return;
    }

    Object.values = __w_pdfjs_require__(139);
  })();
}

/***/ }),
/* 3 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = typeof window !== 'undefined' && window.Math === Math ? window : typeof global !== 'undefined' && global.Math === Math ? global : typeof self !== 'undefined' && self.Math === Math ? self : {};

/***/ }),
/* 4 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

module.exports = function isNodeJS() {
  return (typeof process === "undefined" ? "undefined" : _typeof(process)) === 'object' && process + '' === '[object process]' && !process.versions['nw'];
};

/***/ }),
/* 5 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(6);

module.exports = __w_pdfjs_require__(9).String.startsWith;

/***/ }),
/* 6 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

var toLength = __w_pdfjs_require__(25);

var context = __w_pdfjs_require__(27);

var STARTS_WITH = 'startsWith';
var $startsWith = ''[STARTS_WITH];
$export($export.P + $export.F * __w_pdfjs_require__(34)(STARTS_WITH), 'String', {
  startsWith: function startsWith(searchString) {
    var that = context(this, searchString, STARTS_WITH);
    var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));
    var search = String(searchString);
    return $startsWith ? $startsWith.call(that, search, index) : that.slice(index, index + search.length) === search;
  }
});

/***/ }),
/* 7 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(8);

var core = __w_pdfjs_require__(9);

var hide = __w_pdfjs_require__(10);

var redefine = __w_pdfjs_require__(20);

var ctx = __w_pdfjs_require__(23);

var PROTOTYPE = 'prototype';

var $export = function $export(type, name, source) {
  var IS_FORCED = type & $export.F;
  var IS_GLOBAL = type & $export.G;
  var IS_STATIC = type & $export.S;
  var IS_PROTO = type & $export.P;
  var IS_BIND = type & $export.B;
  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];
  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
  var key, own, out, exp;
  if (IS_GLOBAL) source = name;

  for (key in source) {
    own = !IS_FORCED && target && target[key] !== undefined;
    out = (own ? target : source)[key];
    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
    if (target) redefine(target, key, out, type & $export.U);
    if (exports[key] != out) hide(exports, key, exp);
    if (IS_PROTO && expProto[key] != out) expProto[key] = out;
  }
};

global.core = core;
$export.F = 1;
$export.G = 2;
$export.S = 4;
$export.P = 8;
$export.B = 16;
$export.W = 32;
$export.U = 64;
$export.R = 128;
module.exports = $export;

/***/ }),
/* 8 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
if (typeof __g == 'number') __g = global;

/***/ }),
/* 9 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var core = module.exports = {
  version: '2.6.2'
};
if (typeof __e == 'number') __e = core;

/***/ }),
/* 10 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var dP = __w_pdfjs_require__(11);

var createDesc = __w_pdfjs_require__(19);

module.exports = __w_pdfjs_require__(15) ? function (object, key, value) {
  return dP.f(object, key, createDesc(1, value));
} : function (object, key, value) {
  object[key] = value;
  return object;
};

/***/ }),
/* 11 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var anObject = __w_pdfjs_require__(12);

var IE8_DOM_DEFINE = __w_pdfjs_require__(14);

var toPrimitive = __w_pdfjs_require__(18);

var dP = Object.defineProperty;
exports.f = __w_pdfjs_require__(15) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
  anObject(O);
  P = toPrimitive(P, true);
  anObject(Attributes);
  if (IE8_DOM_DEFINE) try {
    return dP(O, P, Attributes);
  } catch (e) {}
  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
  if ('value' in Attributes) O[P] = Attributes.value;
  return O;
};

/***/ }),
/* 12 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(13);

module.exports = function (it) {
  if (!isObject(it)) throw TypeError(it + ' is not an object!');
  return it;
};

/***/ }),
/* 13 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

module.exports = function (it) {
  return _typeof(it) === 'object' ? it !== null : typeof it === 'function';
};

/***/ }),
/* 14 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = !__w_pdfjs_require__(15) && !__w_pdfjs_require__(16)(function () {
  return Object.defineProperty(__w_pdfjs_require__(17)('div'), 'a', {
    get: function get() {
      return 7;
    }
  }).a != 7;
});

/***/ }),
/* 15 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = !__w_pdfjs_require__(16)(function () {
  return Object.defineProperty({}, 'a', {
    get: function get() {
      return 7;
    }
  }).a != 7;
});

/***/ }),
/* 16 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (exec) {
  try {
    return !!exec();
  } catch (e) {
    return true;
  }
};

/***/ }),
/* 17 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(13);

var document = __w_pdfjs_require__(8).document;

var is = isObject(document) && isObject(document.createElement);

module.exports = function (it) {
  return is ? document.createElement(it) : {};
};

/***/ }),
/* 18 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(13);

module.exports = function (it, S) {
  if (!isObject(it)) return it;
  var fn, val;
  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
  throw TypeError("Can't convert object to primitive value");
};

/***/ }),
/* 19 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (bitmap, value) {
  return {
    enumerable: !(bitmap & 1),
    configurable: !(bitmap & 2),
    writable: !(bitmap & 4),
    value: value
  };
};

/***/ }),
/* 20 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(8);

var hide = __w_pdfjs_require__(10);

var has = __w_pdfjs_require__(21);

var SRC = __w_pdfjs_require__(22)('src');

var TO_STRING = 'toString';
var $toString = Function[TO_STRING];
var TPL = ('' + $toString).split(TO_STRING);

__w_pdfjs_require__(9).inspectSource = function (it) {
  return $toString.call(it);
};

(module.exports = function (O, key, val, safe) {
  var isFunction = typeof val == 'function';
  if (isFunction) has(val, 'name') || hide(val, 'name', key);
  if (O[key] === val) return;
  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));

  if (O === global) {
    O[key] = val;
  } else if (!safe) {
    delete O[key];
    hide(O, key, val);
  } else if (O[key]) {
    O[key] = val;
  } else {
    hide(O, key, val);
  }
})(Function.prototype, TO_STRING, function toString() {
  return typeof this == 'function' && this[SRC] || $toString.call(this);
});

/***/ }),
/* 21 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var hasOwnProperty = {}.hasOwnProperty;

module.exports = function (it, key) {
  return hasOwnProperty.call(it, key);
};

/***/ }),
/* 22 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var id = 0;
var px = Math.random();

module.exports = function (key) {
  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
};

/***/ }),
/* 23 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var aFunction = __w_pdfjs_require__(24);

module.exports = function (fn, that, length) {
  aFunction(fn);
  if (that === undefined) return fn;

  switch (length) {
    case 1:
      return function (a) {
        return fn.call(that, a);
      };

    case 2:
      return function (a, b) {
        return fn.call(that, a, b);
      };

    case 3:
      return function (a, b, c) {
        return fn.call(that, a, b, c);
      };
  }

  return function () {
    return fn.apply(that, arguments);
  };
};

/***/ }),
/* 24 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (it) {
  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
  return it;
};

/***/ }),
/* 25 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toInteger = __w_pdfjs_require__(26);

var min = Math.min;

module.exports = function (it) {
  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0;
};

/***/ }),
/* 26 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var ceil = Math.ceil;
var floor = Math.floor;

module.exports = function (it) {
  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
};

/***/ }),
/* 27 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isRegExp = __w_pdfjs_require__(28);

var defined = __w_pdfjs_require__(33);

module.exports = function (that, searchString, NAME) {
  if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!");
  return String(defined(that));
};

/***/ }),
/* 28 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(13);

var cof = __w_pdfjs_require__(29);

var MATCH = __w_pdfjs_require__(30)('match');

module.exports = function (it) {
  var isRegExp;
  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');
};

/***/ }),
/* 29 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toString = {}.toString;

module.exports = function (it) {
  return toString.call(it).slice(8, -1);
};

/***/ }),
/* 30 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var store = __w_pdfjs_require__(31)('wks');

var uid = __w_pdfjs_require__(22);

var _Symbol = __w_pdfjs_require__(8).Symbol;

var USE_SYMBOL = typeof _Symbol == 'function';

var $exports = module.exports = function (name) {
  return store[name] || (store[name] = USE_SYMBOL && _Symbol[name] || (USE_SYMBOL ? _Symbol : uid)('Symbol.' + name));
};

$exports.store = store;

/***/ }),
/* 31 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var core = __w_pdfjs_require__(9);

var global = __w_pdfjs_require__(8);

var SHARED = '__core-js_shared__';
var store = global[SHARED] || (global[SHARED] = {});
(module.exports = function (key, value) {
  return store[key] || (store[key] = value !== undefined ? value : {});
})('versions', []).push({
  version: core.version,
  mode: __w_pdfjs_require__(32) ? 'pure' : 'global',
  copyright: 'Â© 2019 Denis Pushkarev (zloirock.ru)'
});

/***/ }),
/* 32 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = false;

/***/ }),
/* 33 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (it) {
  if (it == undefined) throw TypeError("Can't call method on  " + it);
  return it;
};

/***/ }),
/* 34 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var MATCH = __w_pdfjs_require__(30)('match');

module.exports = function (KEY) {
  var re = /./;

  try {
    '/./'[KEY](re);
  } catch (e) {
    try {
      re[MATCH] = false;
      return !'/./'[KEY](re);
    } catch (f) {}
  }

  return true;
};

/***/ }),
/* 35 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(36);

module.exports = __w_pdfjs_require__(9).String.endsWith;

/***/ }),
/* 36 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

var toLength = __w_pdfjs_require__(25);

var context = __w_pdfjs_require__(27);

var ENDS_WITH = 'endsWith';
var $endsWith = ''[ENDS_WITH];
$export($export.P + $export.F * __w_pdfjs_require__(34)(ENDS_WITH), 'String', {
  endsWith: function endsWith(searchString) {
    var that = context(this, searchString, ENDS_WITH);
    var endPosition = arguments.length > 1 ? arguments[1] : undefined;
    var len = toLength(that.length);
    var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);
    var search = String(searchString);
    return $endsWith ? $endsWith.call(that, search, end) : that.slice(end - search.length, end) === search;
  }
});

/***/ }),
/* 37 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(38);

module.exports = __w_pdfjs_require__(9).String.includes;

/***/ }),
/* 38 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

var context = __w_pdfjs_require__(27);

var INCLUDES = 'includes';
$export($export.P + $export.F * __w_pdfjs_require__(34)(INCLUDES), 'String', {
  includes: function includes(searchString) {
    return !!~context(this, searchString, INCLUDES).indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
  }
});

/***/ }),
/* 39 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(40);

module.exports = __w_pdfjs_require__(9).Array.includes;

/***/ }),
/* 40 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

var $includes = __w_pdfjs_require__(41)(true);

$export($export.P, 'Array', {
  includes: function includes(el) {
    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
  }
});

__w_pdfjs_require__(45)('includes');

/***/ }),
/* 41 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toIObject = __w_pdfjs_require__(42);

var toLength = __w_pdfjs_require__(25);

var toAbsoluteIndex = __w_pdfjs_require__(44);

module.exports = function (IS_INCLUDES) {
  return function ($this, el, fromIndex) {
    var O = toIObject($this);
    var length = toLength(O.length);
    var index = toAbsoluteIndex(fromIndex, length);
    var value;
    if (IS_INCLUDES && el != el) while (length > index) {
      value = O[index++];
      if (value != value) return true;
    } else for (; length > index; index++) {
      if (IS_INCLUDES || index in O) {
        if (O[index] === el) return IS_INCLUDES || index || 0;
      }
    }
    return !IS_INCLUDES && -1;
  };
};

/***/ }),
/* 42 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var IObject = __w_pdfjs_require__(43);

var defined = __w_pdfjs_require__(33);

module.exports = function (it) {
  return IObject(defined(it));
};

/***/ }),
/* 43 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var cof = __w_pdfjs_require__(29);

module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
  return cof(it) == 'String' ? it.split('') : Object(it);
};

/***/ }),
/* 44 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toInteger = __w_pdfjs_require__(26);

var max = Math.max;
var min = Math.min;

module.exports = function (index, length) {
  index = toInteger(index);
  return index < 0 ? max(index + length, 0) : min(index, length);
};

/***/ }),
/* 45 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var UNSCOPABLES = __w_pdfjs_require__(30)('unscopables');

var ArrayProto = Array.prototype;
if (ArrayProto[UNSCOPABLES] == undefined) __w_pdfjs_require__(10)(ArrayProto, UNSCOPABLES, {});

module.exports = function (key) {
  ArrayProto[UNSCOPABLES][key] = true;
};

/***/ }),
/* 46 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(47);

__w_pdfjs_require__(62);

module.exports = __w_pdfjs_require__(9).Array.from;

/***/ }),
/* 47 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $at = __w_pdfjs_require__(48)(true);

__w_pdfjs_require__(49)(String, 'String', function (iterated) {
  this._t = String(iterated);
  this._i = 0;
}, function () {
  var O = this._t;
  var index = this._i;
  var point;
  if (index >= O.length) return {
    value: undefined,
    done: true
  };
  point = $at(O, index);
  this._i += point.length;
  return {
    value: point,
    done: false
  };
});

/***/ }),
/* 48 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toInteger = __w_pdfjs_require__(26);

var defined = __w_pdfjs_require__(33);

module.exports = function (TO_STRING) {
  return function (that, pos) {
    var s = String(defined(that));
    var i = toInteger(pos);
    var l = s.length;
    var a, b;
    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
    a = s.charCodeAt(i);
    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
  };
};

/***/ }),
/* 49 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var LIBRARY = __w_pdfjs_require__(32);

var $export = __w_pdfjs_require__(7);

var redefine = __w_pdfjs_require__(20);

var hide = __w_pdfjs_require__(10);

var Iterators = __w_pdfjs_require__(50);

var $iterCreate = __w_pdfjs_require__(51);

var setToStringTag = __w_pdfjs_require__(59);

var getPrototypeOf = __w_pdfjs_require__(60);

var ITERATOR = __w_pdfjs_require__(30)('iterator');

var BUGGY = !([].keys && 'next' in [].keys());
var FF_ITERATOR = '@@iterator';
var KEYS = 'keys';
var VALUES = 'values';

var returnThis = function returnThis() {
  return this;
};

module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
  $iterCreate(Constructor, NAME, next);

  var getMethod = function getMethod(kind) {
    if (!BUGGY && kind in proto) return proto[kind];

    switch (kind) {
      case KEYS:
        return function keys() {
          return new Constructor(this, kind);
        };

      case VALUES:
        return function values() {
          return new Constructor(this, kind);
        };
    }

    return function entries() {
      return new Constructor(this, kind);
    };
  };

  var TAG = NAME + ' Iterator';
  var DEF_VALUES = DEFAULT == VALUES;
  var VALUES_BUG = false;
  var proto = Base.prototype;
  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
  var $default = $native || getMethod(DEFAULT);
  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
  var methods, key, IteratorPrototype;

  if ($anyNative) {
    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));

    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
      setToStringTag(IteratorPrototype, TAG, true);
      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
    }
  }

  if (DEF_VALUES && $native && $native.name !== VALUES) {
    VALUES_BUG = true;

    $default = function values() {
      return $native.call(this);
    };
  }

  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
    hide(proto, ITERATOR, $default);
  }

  Iterators[NAME] = $default;
  Iterators[TAG] = returnThis;

  if (DEFAULT) {
    methods = {
      values: DEF_VALUES ? $default : getMethod(VALUES),
      keys: IS_SET ? $default : getMethod(KEYS),
      entries: $entries
    };
    if (FORCED) for (key in methods) {
      if (!(key in proto)) redefine(proto, key, methods[key]);
    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
  }

  return methods;
};

/***/ }),
/* 50 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = {};

/***/ }),
/* 51 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var create = __w_pdfjs_require__(52);

var descriptor = __w_pdfjs_require__(19);

var setToStringTag = __w_pdfjs_require__(59);

var IteratorPrototype = {};

__w_pdfjs_require__(10)(IteratorPrototype, __w_pdfjs_require__(30)('iterator'), function () {
  return this;
});

module.exports = function (Constructor, NAME, next) {
  Constructor.prototype = create(IteratorPrototype, {
    next: descriptor(1, next)
  });
  setToStringTag(Constructor, NAME + ' Iterator');
};

/***/ }),
/* 52 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var anObject = __w_pdfjs_require__(12);

var dPs = __w_pdfjs_require__(53);

var enumBugKeys = __w_pdfjs_require__(57);

var IE_PROTO = __w_pdfjs_require__(56)('IE_PROTO');

var Empty = function Empty() {};

var PROTOTYPE = 'prototype';

var _createDict = function createDict() {
  var iframe = __w_pdfjs_require__(17)('iframe');

  var i = enumBugKeys.length;
  var lt = '<';
  var gt = '>';
  var iframeDocument;
  iframe.style.display = 'none';

  __w_pdfjs_require__(58).appendChild(iframe);

  iframe.src = 'javascript:';
  iframeDocument = iframe.contentWindow.document;
  iframeDocument.open();
  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
  iframeDocument.close();
  _createDict = iframeDocument.F;

  while (i--) {
    delete _createDict[PROTOTYPE][enumBugKeys[i]];
  }

  return _createDict();
};

module.exports = Object.create || function create(O, Properties) {
  var result;

  if (O !== null) {
    Empty[PROTOTYPE] = anObject(O);
    result = new Empty();
    Empty[PROTOTYPE] = null;
    result[IE_PROTO] = O;
  } else result = _createDict();

  return Properties === undefined ? result : dPs(result, Properties);
};

/***/ }),
/* 53 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var dP = __w_pdfjs_require__(11);

var anObject = __w_pdfjs_require__(12);

var getKeys = __w_pdfjs_require__(54);

module.exports = __w_pdfjs_require__(15) ? Object.defineProperties : function defineProperties(O, Properties) {
  anObject(O);
  var keys = getKeys(Properties);
  var length = keys.length;
  var i = 0;
  var P;

  while (length > i) {
    dP.f(O, P = keys[i++], Properties[P]);
  }

  return O;
};

/***/ }),
/* 54 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $keys = __w_pdfjs_require__(55);

var enumBugKeys = __w_pdfjs_require__(57);

module.exports = Object.keys || function keys(O) {
  return $keys(O, enumBugKeys);
};

/***/ }),
/* 55 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var has = __w_pdfjs_require__(21);

var toIObject = __w_pdfjs_require__(42);

var arrayIndexOf = __w_pdfjs_require__(41)(false);

var IE_PROTO = __w_pdfjs_require__(56)('IE_PROTO');

module.exports = function (object, names) {
  var O = toIObject(object);
  var i = 0;
  var result = [];
  var key;

  for (key in O) {
    if (key != IE_PROTO) has(O, key) && result.push(key);
  }

  while (names.length > i) {
    if (has(O, key = names[i++])) {
      ~arrayIndexOf(result, key) || result.push(key);
    }
  }

  return result;
};

/***/ }),
/* 56 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var shared = __w_pdfjs_require__(31)('keys');

var uid = __w_pdfjs_require__(22);

module.exports = function (key) {
  return shared[key] || (shared[key] = uid(key));
};

/***/ }),
/* 57 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',');

/***/ }),
/* 58 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var document = __w_pdfjs_require__(8).document;

module.exports = document && document.documentElement;

/***/ }),
/* 59 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var def = __w_pdfjs_require__(11).f;

var has = __w_pdfjs_require__(21);

var TAG = __w_pdfjs_require__(30)('toStringTag');

module.exports = function (it, tag, stat) {
  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, {
    configurable: true,
    value: tag
  });
};

/***/ }),
/* 60 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var has = __w_pdfjs_require__(21);

var toObject = __w_pdfjs_require__(61);

var IE_PROTO = __w_pdfjs_require__(56)('IE_PROTO');

var ObjectProto = Object.prototype;

module.exports = Object.getPrototypeOf || function (O) {
  O = toObject(O);
  if (has(O, IE_PROTO)) return O[IE_PROTO];

  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
    return O.constructor.prototype;
  }

  return O instanceof Object ? ObjectProto : null;
};

/***/ }),
/* 61 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var defined = __w_pdfjs_require__(33);

module.exports = function (it) {
  return Object(defined(it));
};

/***/ }),
/* 62 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var ctx = __w_pdfjs_require__(23);

var $export = __w_pdfjs_require__(7);

var toObject = __w_pdfjs_require__(61);

var call = __w_pdfjs_require__(63);

var isArrayIter = __w_pdfjs_require__(64);

var toLength = __w_pdfjs_require__(25);

var createProperty = __w_pdfjs_require__(65);

var getIterFn = __w_pdfjs_require__(66);

$export($export.S + $export.F * !__w_pdfjs_require__(68)(function (iter) {
  Array.from(iter);
}), 'Array', {
  from: function from(arrayLike) {
    var O = toObject(arrayLike);
    var C = typeof this == 'function' ? this : Array;
    var aLen = arguments.length;
    var mapfn = aLen > 1 ? arguments[1] : undefined;
    var mapping = mapfn !== undefined;
    var index = 0;
    var iterFn = getIterFn(O);
    var length, result, step, iterator;
    if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);

    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {
      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);
      }
    } else {
      length = toLength(O.length);

      for (result = new C(length); length > index; index++) {
        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
      }
    }

    result.length = index;
    return result;
  }
});

/***/ }),
/* 63 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var anObject = __w_pdfjs_require__(12);

module.exports = function (iterator, fn, value, entries) {
  try {
    return entries ? fn(anObject(value)[0], value[1]) : fn(value);
  } catch (e) {
    var ret = iterator['return'];
    if (ret !== undefined) anObject(ret.call(iterator));
    throw e;
  }
};

/***/ }),
/* 64 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var Iterators = __w_pdfjs_require__(50);

var ITERATOR = __w_pdfjs_require__(30)('iterator');

var ArrayProto = Array.prototype;

module.exports = function (it) {
  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
};

/***/ }),
/* 65 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $defineProperty = __w_pdfjs_require__(11);

var createDesc = __w_pdfjs_require__(19);

module.exports = function (object, index, value) {
  if (index in object) $defineProperty.f(object, index, createDesc(0, value));else object[index] = value;
};

/***/ }),
/* 66 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var classof = __w_pdfjs_require__(67);

var ITERATOR = __w_pdfjs_require__(30)('iterator');

var Iterators = __w_pdfjs_require__(50);

module.exports = __w_pdfjs_require__(9).getIteratorMethod = function (it) {
  if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)];
};

/***/ }),
/* 67 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var cof = __w_pdfjs_require__(29);

var TAG = __w_pdfjs_require__(30)('toStringTag');

var ARG = cof(function () {
  return arguments;
}()) == 'Arguments';

var tryGet = function tryGet(it, key) {
  try {
    return it[key];
  } catch (e) {}
};

module.exports = function (it) {
  var O, T, B;
  return it === undefined ? 'Undefined' : it === null ? 'Null' : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T : ARG ? cof(O) : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
};

/***/ }),
/* 68 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var ITERATOR = __w_pdfjs_require__(30)('iterator');

var SAFE_CLOSING = false;

try {
  var riter = [7][ITERATOR]();

  riter['return'] = function () {
    SAFE_CLOSING = true;
  };

  Array.from(riter, function () {
    throw 2;
  });
} catch (e) {}

module.exports = function (exec, skipClosing) {
  if (!skipClosing && !SAFE_CLOSING) return false;
  var safe = false;

  try {
    var arr = [7];
    var iter = arr[ITERATOR]();

    iter.next = function () {
      return {
        done: safe = true
      };
    };

    arr[ITERATOR] = function () {
      return iter;
    };

    exec(arr);
  } catch (e) {}

  return safe;
};

/***/ }),
/* 69 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(70);

module.exports = __w_pdfjs_require__(9).Object.assign;

/***/ }),
/* 70 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

$export($export.S + $export.F, 'Object', {
  assign: __w_pdfjs_require__(71)
});

/***/ }),
/* 71 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var getKeys = __w_pdfjs_require__(54);

var gOPS = __w_pdfjs_require__(72);

var pIE = __w_pdfjs_require__(73);

var toObject = __w_pdfjs_require__(61);

var IObject = __w_pdfjs_require__(43);

var $assign = Object.assign;
module.exports = !$assign || __w_pdfjs_require__(16)(function () {
  var A = {};
  var B = {};
  var S = Symbol();
  var K = 'abcdefghijklmnopqrst';
  A[S] = 7;
  K.split('').forEach(function (k) {
    B[k] = k;
  });
  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
}) ? function assign(target, source) {
  var T = toObject(target);
  var aLen = arguments.length;
  var index = 1;
  var getSymbols = gOPS.f;
  var isEnum = pIE.f;

  while (aLen > index) {
    var S = IObject(arguments[index++]);
    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);
    var length = keys.length;
    var j = 0;
    var key;

    while (length > j) {
      if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
    }
  }

  return T;
} : $assign;

/***/ }),
/* 72 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


exports.f = Object.getOwnPropertySymbols;

/***/ }),
/* 73 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


exports.f = {}.propertyIsEnumerable;

/***/ }),
/* 74 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(75);

module.exports = __w_pdfjs_require__(9).Math.log2;

/***/ }),
/* 75 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

$export($export.S, 'Math', {
  log2: function log2(x) {
    return Math.log(x) / Math.LN2;
  }
});

/***/ }),
/* 76 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(77);

module.exports = __w_pdfjs_require__(9).Number.isNaN;

/***/ }),
/* 77 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

$export($export.S, 'Number', {
  isNaN: function isNaN(number) {
    return number != number;
  }
});

/***/ }),
/* 78 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(79);

module.exports = __w_pdfjs_require__(9).Number.isInteger;

/***/ }),
/* 79 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

$export($export.S, 'Number', {
  isInteger: __w_pdfjs_require__(80)
});

/***/ }),
/* 80 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(13);

var floor = Math.floor;

module.exports = function isInteger(it) {
  return !isObject(it) && isFinite(it) && floor(it) === it;
};

/***/ }),
/* 81 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(82);

__w_pdfjs_require__(47);

__w_pdfjs_require__(83);

__w_pdfjs_require__(86);

__w_pdfjs_require__(99);

__w_pdfjs_require__(100);

module.exports = __w_pdfjs_require__(9).Promise;

/***/ }),
/* 82 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var classof = __w_pdfjs_require__(67);

var test = {};
test[__w_pdfjs_require__(30)('toStringTag')] = 'z';

if (test + '' != '[object z]') {
  __w_pdfjs_require__(20)(Object.prototype, 'toString', function toString() {
    return '[object ' + classof(this) + ']';
  }, true);
}

/***/ }),
/* 83 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $iterators = __w_pdfjs_require__(84);

var getKeys = __w_pdfjs_require__(54);

var redefine = __w_pdfjs_require__(20);

var global = __w_pdfjs_require__(8);

var hide = __w_pdfjs_require__(10);

var Iterators = __w_pdfjs_require__(50);

var wks = __w_pdfjs_require__(30);

var ITERATOR = wks('iterator');
var TO_STRING_TAG = wks('toStringTag');
var ArrayValues = Iterators.Array;
var DOMIterables = {
  CSSRuleList: true,
  CSSStyleDeclaration: false,
  CSSValueList: false,
  ClientRectList: false,
  DOMRectList: false,
  DOMStringList: false,
  DOMTokenList: true,
  DataTransferItemList: false,
  FileList: false,
  HTMLAllCollection: false,
  HTMLCollection: false,
  HTMLFormElement: false,
  HTMLSelectElement: false,
  MediaList: true,
  MimeTypeArray: false,
  NamedNodeMap: false,
  NodeList: true,
  PaintRequestList: false,
  Plugin: false,
  PluginArray: false,
  SVGLengthList: false,
  SVGNumberList: false,
  SVGPathSegList: false,
  SVGPointList: false,
  SVGStringList: false,
  SVGTransformList: false,
  SourceBufferList: false,
  StyleSheetList: true,
  TextTrackCueList: false,
  TextTrackList: false,
  TouchList: false
};

for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {
  var NAME = collections[i];
  var explicit = DOMIterables[NAME];
  var Collection = global[NAME];
  var proto = Collection && Collection.prototype;
  var key;

  if (proto) {
    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);
    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
    Iterators[NAME] = ArrayValues;
    if (explicit) for (key in $iterators) {
      if (!proto[key]) redefine(proto, key, $iterators[key], true);
    }
  }
}

/***/ }),
/* 84 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var addToUnscopables = __w_pdfjs_require__(45);

var step = __w_pdfjs_require__(85);

var Iterators = __w_pdfjs_require__(50);

var toIObject = __w_pdfjs_require__(42);

module.exports = __w_pdfjs_require__(49)(Array, 'Array', function (iterated, kind) {
  this._t = toIObject(iterated);
  this._i = 0;
  this._k = kind;
}, function () {
  var O = this._t;
  var kind = this._k;
  var index = this._i++;

  if (!O || index >= O.length) {
    this._t = undefined;
    return step(1);
  }

  if (kind == 'keys') return step(0, index);
  if (kind == 'values') return step(0, O[index]);
  return step(0, [index, O[index]]);
}, 'values');
Iterators.Arguments = Iterators.Array;
addToUnscopables('keys');
addToUnscopables('values');
addToUnscopables('entries');

/***/ }),
/* 85 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (done, value) {
  return {
    value: value,
    done: !!done
  };
};

/***/ }),
/* 86 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var LIBRARY = __w_pdfjs_require__(32);

var global = __w_pdfjs_require__(8);

var ctx = __w_pdfjs_require__(23);

var classof = __w_pdfjs_require__(67);

var $export = __w_pdfjs_require__(7);

var isObject = __w_pdfjs_require__(13);

var aFunction = __w_pdfjs_require__(24);

var anInstance = __w_pdfjs_require__(87);

var forOf = __w_pdfjs_require__(88);

var speciesConstructor = __w_pdfjs_require__(89);

var task = __w_pdfjs_require__(90).set;

var microtask = __w_pdfjs_require__(92)();

var newPromiseCapabilityModule = __w_pdfjs_require__(93);

var perform = __w_pdfjs_require__(94);

var userAgent = __w_pdfjs_require__(95);

var promiseResolve = __w_pdfjs_require__(96);

var PROMISE = 'Promise';
var TypeError = global.TypeError;
var process = global.process;
var versions = process && process.versions;
var v8 = versions && versions.v8 || '';
var $Promise = global[PROMISE];
var isNode = classof(process) == 'process';

var empty = function empty() {};

var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;
var USE_NATIVE = !!function () {
  try {
    var promise = $Promise.resolve(1);

    var FakePromise = (promise.constructor = {})[__w_pdfjs_require__(30)('species')] = function (exec) {
      exec(empty, empty);
    };

    return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise && v8.indexOf('6.6') !== 0 && userAgent.indexOf('Chrome/66') === -1;
  } catch (e) {}
}();

var isThenable = function isThenable(it) {
  var then;
  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
};

var notify = function notify(promise, isReject) {
  if (promise._n) return;
  promise._n = true;
  var chain = promise._c;
  microtask(function () {
    var value = promise._v;
    var ok = promise._s == 1;
    var i = 0;

    var run = function run(reaction) {
      var handler = ok ? reaction.ok : reaction.fail;
      var resolve = reaction.resolve;
      var reject = reaction.reject;
      var domain = reaction.domain;
      var result, then, exited;

      try {
        if (handler) {
          if (!ok) {
            if (promise._h == 2) onHandleUnhandled(promise);
            promise._h = 1;
          }

          if (handler === true) result = value;else {
            if (domain) domain.enter();
            result = handler(value);

            if (domain) {
              domain.exit();
              exited = true;
            }
          }

          if (result === reaction.promise) {
            reject(TypeError('Promise-chain cycle'));
          } else if (then = isThenable(result)) {
            then.call(result, resolve, reject);
          } else resolve(result);
        } else reject(value);
      } catch (e) {
        if (domain && !exited) domain.exit();
        reject(e);
      }
    };

    while (chain.length > i) {
      run(chain[i++]);
    }

    promise._c = [];
    promise._n = false;
    if (isReject && !promise._h) onUnhandled(promise);
  });
};

var onUnhandled = function onUnhandled(promise) {
  task.call(global, function () {
    var value = promise._v;
    var unhandled = isUnhandled(promise);
    var result, handler, console;

    if (unhandled) {
      result = perform(function () {
        if (isNode) {
          process.emit('unhandledRejection', value, promise);
        } else if (handler = global.onunhandledrejection) {
          handler({
            promise: promise,
            reason: value
          });
        } else if ((console = global.console) && console.error) {
          console.error('Unhandled promise rejection', value);
        }
      });
      promise._h = isNode || isUnhandled(promise) ? 2 : 1;
    }

    promise._a = undefined;
    if (unhandled && result.e) throw result.v;
  });
};

var isUnhandled = function isUnhandled(promise) {
  return promise._h !== 1 && (promise._a || promise._c).length === 0;
};

var onHandleUnhandled = function onHandleUnhandled(promise) {
  task.call(global, function () {
    var handler;

    if (isNode) {
      process.emit('rejectionHandled', promise);
    } else if (handler = global.onrejectionhandled) {
      handler({
        promise: promise,
        reason: promise._v
      });
    }
  });
};

var $reject = function $reject(value) {
  var promise = this;
  if (promise._d) return;
  promise._d = true;
  promise = promise._w || promise;
  promise._v = value;
  promise._s = 2;
  if (!promise._a) promise._a = promise._c.slice();
  notify(promise, true);
};

var $resolve = function $resolve(value) {
  var promise = this;
  var then;
  if (promise._d) return;
  promise._d = true;
  promise = promise._w || promise;

  try {
    if (promise === value) throw TypeError("Promise can't be resolved itself");

    if (then = isThenable(value)) {
      microtask(function () {
        var wrapper = {
          _w: promise,
          _d: false
        };

        try {
          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));
        } catch (e) {
          $reject.call(wrapper, e);
        }
      });
    } else {
      promise._v = value;
      promise._s = 1;
      notify(promise, false);
    }
  } catch (e) {
    $reject.call({
      _w: promise,
      _d: false
    }, e);
  }
};

if (!USE_NATIVE) {
  $Promise = function Promise(executor) {
    anInstance(this, $Promise, PROMISE, '_h');
    aFunction(executor);
    Internal.call(this);

    try {
      executor(ctx($resolve, this, 1), ctx($reject, this, 1));
    } catch (err) {
      $reject.call(this, err);
    }
  };

  Internal = function Promise(executor) {
    this._c = [];
    this._a = undefined;
    this._s = 0;
    this._d = false;
    this._v = undefined;
    this._h = 0;
    this._n = false;
  };

  Internal.prototype = __w_pdfjs_require__(97)($Promise.prototype, {
    then: function then(onFulfilled, onRejected) {
      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
      reaction.fail = typeof onRejected == 'function' && onRejected;
      reaction.domain = isNode ? process.domain : undefined;

      this._c.push(reaction);

      if (this._a) this._a.push(reaction);
      if (this._s) notify(this, false);
      return reaction.promise;
    },
    'catch': function _catch(onRejected) {
      return this.then(undefined, onRejected);
    }
  });

  OwnPromiseCapability = function OwnPromiseCapability() {
    var promise = new Internal();
    this.promise = promise;
    this.resolve = ctx($resolve, promise, 1);
    this.reject = ctx($reject, promise, 1);
  };

  newPromiseCapabilityModule.f = newPromiseCapability = function newPromiseCapability(C) {
    return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C);
  };
}

$export($export.G + $export.W + $export.F * !USE_NATIVE, {
  Promise: $Promise
});

__w_pdfjs_require__(59)($Promise, PROMISE);

__w_pdfjs_require__(98)(PROMISE);

Wrapper = __w_pdfjs_require__(9)[PROMISE];
$export($export.S + $export.F * !USE_NATIVE, PROMISE, {
  reject: function reject(r) {
    var capability = newPromiseCapability(this);
    var $$reject = capability.reject;
    $$reject(r);
    return capability.promise;
  }
});
$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {
  resolve: function resolve(x) {
    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);
  }
});
$export($export.S + $export.F * !(USE_NATIVE && __w_pdfjs_require__(68)(function (iter) {
  $Promise.all(iter)['catch'](empty);
})), PROMISE, {
  all: function all(iterable) {
    var C = this;
    var capability = newPromiseCapability(C);
    var resolve = capability.resolve;
    var reject = capability.reject;
    var result = perform(function () {
      var values = [];
      var index = 0;
      var remaining = 1;
      forOf(iterable, false, function (promise) {
        var $index = index++;
        var alreadyCalled = false;
        values.push(undefined);
        remaining++;
        C.resolve(promise).then(function (value) {
          if (alreadyCalled) return;
          alreadyCalled = true;
          values[$index] = value;
          --remaining || resolve(values);
        }, reject);
      });
      --remaining || resolve(values);
    });
    if (result.e) reject(result.v);
    return capability.promise;
  },
  race: function race(iterable) {
    var C = this;
    var capability = newPromiseCapability(C);
    var reject = capability.reject;
    var result = perform(function () {
      forOf(iterable, false, function (promise) {
        C.resolve(promise).then(capability.resolve, reject);
      });
    });
    if (result.e) reject(result.v);
    return capability.promise;
  }
});

/***/ }),
/* 87 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (it, Constructor, name, forbiddenField) {
  if (!(it instanceof Constructor) || forbiddenField !== undefined && forbiddenField in it) {
    throw TypeError(name + ': incorrect invocation!');
  }

  return it;
};

/***/ }),
/* 88 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var ctx = __w_pdfjs_require__(23);

var call = __w_pdfjs_require__(63);

var isArrayIter = __w_pdfjs_require__(64);

var anObject = __w_pdfjs_require__(12);

var toLength = __w_pdfjs_require__(25);

var getIterFn = __w_pdfjs_require__(66);

var BREAK = {};
var RETURN = {};

var _exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
  var iterFn = ITERATOR ? function () {
    return iterable;
  } : getIterFn(iterable);
  var f = ctx(fn, that, entries ? 2 : 1);
  var index = 0;
  var length, step, iterator, result;
  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {
    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
    if (result === BREAK || result === RETURN) return result;
  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
    result = call(iterator, f, step.value, entries);
    if (result === BREAK || result === RETURN) return result;
  }
};

_exports.BREAK = BREAK;
_exports.RETURN = RETURN;

/***/ }),
/* 89 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var anObject = __w_pdfjs_require__(12);

var aFunction = __w_pdfjs_require__(24);

var SPECIES = __w_pdfjs_require__(30)('species');

module.exports = function (O, D) {
  var C = anObject(O).constructor;
  var S;
  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);
};

/***/ }),
/* 90 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var ctx = __w_pdfjs_require__(23);

var invoke = __w_pdfjs_require__(91);

var html = __w_pdfjs_require__(58);

var cel = __w_pdfjs_require__(17);

var global = __w_pdfjs_require__(8);

var process = global.process;
var setTask = global.setImmediate;
var clearTask = global.clearImmediate;
var MessageChannel = global.MessageChannel;
var Dispatch = global.Dispatch;
var counter = 0;
var queue = {};
var ONREADYSTATECHANGE = 'onreadystatechange';
var defer, channel, port;

var run = function run() {
  var id = +this;

  if (queue.hasOwnProperty(id)) {
    var fn = queue[id];
    delete queue[id];
    fn();
  }
};

var listener = function listener(event) {
  run.call(event.data);
};

if (!setTask || !clearTask) {
  setTask = function setImmediate(fn) {
    var args = [];
    var i = 1;

    while (arguments.length > i) {
      args.push(arguments[i++]);
    }

    queue[++counter] = function () {
      invoke(typeof fn == 'function' ? fn : Function(fn), args);
    };

    defer(counter);
    return counter;
  };

  clearTask = function clearImmediate(id) {
    delete queue[id];
  };

  if (__w_pdfjs_require__(29)(process) == 'process') {
    defer = function defer(id) {
      process.nextTick(ctx(run, id, 1));
    };
  } else if (Dispatch && Dispatch.now) {
    defer = function defer(id) {
      Dispatch.now(ctx(run, id, 1));
    };
  } else if (MessageChannel) {
    channel = new MessageChannel();
    port = channel.port2;
    channel.port1.onmessage = listener;
    defer = ctx(port.postMessage, port, 1);
  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {
    defer = function defer(id) {
      global.postMessage(id + '', '*');
    };

    global.addEventListener('message', listener, false);
  } else if (ONREADYSTATECHANGE in cel('script')) {
    defer = function defer(id) {
      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {
        html.removeChild(this);
        run.call(id);
      };
    };
  } else {
    defer = function defer(id) {
      setTimeout(ctx(run, id, 1), 0);
    };
  }
}

module.exports = {
  set: setTask,
  clear: clearTask
};

/***/ }),
/* 91 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (fn, args, that) {
  var un = that === undefined;

  switch (args.length) {
    case 0:
      return un ? fn() : fn.call(that);

    case 1:
      return un ? fn(args[0]) : fn.call(that, args[0]);

    case 2:
      return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]);

    case 3:
      return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]);

    case 4:
      return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]);
  }

  return fn.apply(that, args);
};

/***/ }),
/* 92 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(8);

var macrotask = __w_pdfjs_require__(90).set;

var Observer = global.MutationObserver || global.WebKitMutationObserver;
var process = global.process;
var Promise = global.Promise;
var isNode = __w_pdfjs_require__(29)(process) == 'process';

module.exports = function () {
  var head, last, notify;

  var flush = function flush() {
    var parent, fn;
    if (isNode && (parent = process.domain)) parent.exit();

    while (head) {
      fn = head.fn;
      head = head.next;

      try {
        fn();
      } catch (e) {
        if (head) notify();else last = undefined;
        throw e;
      }
    }

    last = undefined;
    if (parent) parent.enter();
  };

  if (isNode) {
    notify = function notify() {
      process.nextTick(flush);
    };
  } else if (Observer && !(global.navigator && global.navigator.standalone)) {
    var toggle = true;
    var node = document.createTextNode('');
    new Observer(flush).observe(node, {
      characterData: true
    });

    notify = function notify() {
      node.data = toggle = !toggle;
    };
  } else if (Promise && Promise.resolve) {
    var promise = Promise.resolve(undefined);

    notify = function notify() {
      promise.then(flush);
    };
  } else {
    notify = function notify() {
      macrotask.call(global, flush);
    };
  }

  return function (fn) {
    var task = {
      fn: fn,
      next: undefined
    };
    if (last) last.next = task;

    if (!head) {
      head = task;
      notify();
    }

    last = task;
  };
};

/***/ }),
/* 93 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var aFunction = __w_pdfjs_require__(24);

function PromiseCapability(C) {
  var resolve, reject;
  this.promise = new C(function ($$resolve, $$reject) {
    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
    resolve = $$resolve;
    reject = $$reject;
  });
  this.resolve = aFunction(resolve);
  this.reject = aFunction(reject);
}

module.exports.f = function (C) {
  return new PromiseCapability(C);
};

/***/ }),
/* 94 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (exec) {
  try {
    return {
      e: false,
      v: exec()
    };
  } catch (e) {
    return {
      e: true,
      v: e
    };
  }
};

/***/ }),
/* 95 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(8);

var navigator = global.navigator;
module.exports = navigator && navigator.userAgent || '';

/***/ }),
/* 96 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var anObject = __w_pdfjs_require__(12);

var isObject = __w_pdfjs_require__(13);

var newPromiseCapability = __w_pdfjs_require__(93);

module.exports = function (C, x) {
  anObject(C);
  if (isObject(x) && x.constructor === C) return x;
  var promiseCapability = newPromiseCapability.f(C);
  var resolve = promiseCapability.resolve;
  resolve(x);
  return promiseCapability.promise;
};

/***/ }),
/* 97 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var redefine = __w_pdfjs_require__(20);

module.exports = function (target, src, safe) {
  for (var key in src) {
    redefine(target, key, src[key], safe);
  }

  return target;
};

/***/ }),
/* 98 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(8);

var dP = __w_pdfjs_require__(11);

var DESCRIPTORS = __w_pdfjs_require__(15);

var SPECIES = __w_pdfjs_require__(30)('species');

module.exports = function (KEY) {
  var C = global[KEY];
  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {
    configurable: true,
    get: function get() {
      return this;
    }
  });
};

/***/ }),
/* 99 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

var core = __w_pdfjs_require__(9);

var global = __w_pdfjs_require__(8);

var speciesConstructor = __w_pdfjs_require__(89);

var promiseResolve = __w_pdfjs_require__(96);

$export($export.P + $export.R, 'Promise', {
  'finally': function _finally(onFinally) {
    var C = speciesConstructor(this, core.Promise || global.Promise);
    var isFunction = typeof onFinally == 'function';
    return this.then(isFunction ? function (x) {
      return promiseResolve(C, onFinally()).then(function () {
        return x;
      });
    } : onFinally, isFunction ? function (e) {
      return promiseResolve(C, onFinally()).then(function () {
        throw e;
      });
    } : onFinally);
  }
});

/***/ }),
/* 100 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

var newPromiseCapability = __w_pdfjs_require__(93);

var perform = __w_pdfjs_require__(94);

$export($export.S, 'Promise', {
  'try': function _try(callbackfn) {
    var promiseCapability = newPromiseCapability.f(this);
    var result = perform(callbackfn);
    (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);
    return promiseCapability.promise;
  }
});

/***/ }),
/* 101 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(82);

__w_pdfjs_require__(83);

__w_pdfjs_require__(102);

__w_pdfjs_require__(114);

__w_pdfjs_require__(116);

module.exports = __w_pdfjs_require__(9).WeakMap;

/***/ }),
/* 102 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var each = __w_pdfjs_require__(103)(0);

var redefine = __w_pdfjs_require__(20);

var meta = __w_pdfjs_require__(107);

var assign = __w_pdfjs_require__(71);

var weak = __w_pdfjs_require__(108);

var isObject = __w_pdfjs_require__(13);

var fails = __w_pdfjs_require__(16);

var validate = __w_pdfjs_require__(109);

var WEAK_MAP = 'WeakMap';
var getWeak = meta.getWeak;
var isExtensible = Object.isExtensible;
var uncaughtFrozenStore = weak.ufstore;
var tmp = {};
var InternalMap;

var wrapper = function wrapper(get) {
  return function WeakMap() {
    return get(this, arguments.length > 0 ? arguments[0] : undefined);
  };
};

var methods = {
  get: function get(key) {
    if (isObject(key)) {
      var data = getWeak(key);
      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);
      return data ? data[this._i] : undefined;
    }
  },
  set: function set(key, value) {
    return weak.def(validate(this, WEAK_MAP), key, value);
  }
};

var $WeakMap = module.exports = __w_pdfjs_require__(110)(WEAK_MAP, wrapper, methods, weak, true, true);

if (fails(function () {
  return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7;
})) {
  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);
  assign(InternalMap.prototype, methods);
  meta.NEED = true;
  each(['delete', 'has', 'get', 'set'], function (key) {
    var proto = $WeakMap.prototype;
    var method = proto[key];
    redefine(proto, key, function (a, b) {
      if (isObject(a) && !isExtensible(a)) {
        if (!this._f) this._f = new InternalMap();

        var result = this._f[key](a, b);

        return key == 'set' ? this : result;
      }

      return method.call(this, a, b);
    });
  });
}

/***/ }),
/* 103 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var ctx = __w_pdfjs_require__(23);

var IObject = __w_pdfjs_require__(43);

var toObject = __w_pdfjs_require__(61);

var toLength = __w_pdfjs_require__(25);

var asc = __w_pdfjs_require__(104);

module.exports = function (TYPE, $create) {
  var IS_MAP = TYPE == 1;
  var IS_FILTER = TYPE == 2;
  var IS_SOME = TYPE == 3;
  var IS_EVERY = TYPE == 4;
  var IS_FIND_INDEX = TYPE == 6;
  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
  var create = $create || asc;
  return function ($this, callbackfn, that) {
    var O = toObject($this);
    var self = IObject(O);
    var f = ctx(callbackfn, that, 3);
    var length = toLength(self.length);
    var index = 0;
    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
    var val, res;

    for (; length > index; index++) {
      if (NO_HOLES || index in self) {
        val = self[index];
        res = f(val, index, O);

        if (TYPE) {
          if (IS_MAP) result[index] = res;else if (res) switch (TYPE) {
            case 3:
              return true;

            case 5:
              return val;

            case 6:
              return index;

            case 2:
              result.push(val);
          } else if (IS_EVERY) return false;
        }
      }
    }

    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
  };
};

/***/ }),
/* 104 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var speciesConstructor = __w_pdfjs_require__(105);

module.exports = function (original, length) {
  return new (speciesConstructor(original))(length);
};

/***/ }),
/* 105 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(13);

var isArray = __w_pdfjs_require__(106);

var SPECIES = __w_pdfjs_require__(30)('species');

module.exports = function (original) {
  var C;

  if (isArray(original)) {
    C = original.constructor;
    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;

    if (isObject(C)) {
      C = C[SPECIES];
      if (C === null) C = undefined;
    }
  }

  return C === undefined ? Array : C;
};

/***/ }),
/* 106 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var cof = __w_pdfjs_require__(29);

module.exports = Array.isArray || function isArray(arg) {
  return cof(arg) == 'Array';
};

/***/ }),
/* 107 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var META = __w_pdfjs_require__(22)('meta');

var isObject = __w_pdfjs_require__(13);

var has = __w_pdfjs_require__(21);

var setDesc = __w_pdfjs_require__(11).f;

var id = 0;

var isExtensible = Object.isExtensible || function () {
  return true;
};

var FREEZE = !__w_pdfjs_require__(16)(function () {
  return isExtensible(Object.preventExtensions({}));
});

var setMeta = function setMeta(it) {
  setDesc(it, META, {
    value: {
      i: 'O' + ++id,
      w: {}
    }
  });
};

var fastKey = function fastKey(it, create) {
  if (!isObject(it)) return _typeof(it) == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;

  if (!has(it, META)) {
    if (!isExtensible(it)) return 'F';
    if (!create) return 'E';
    setMeta(it);
  }

  return it[META].i;
};

var getWeak = function getWeak(it, create) {
  if (!has(it, META)) {
    if (!isExtensible(it)) return true;
    if (!create) return false;
    setMeta(it);
  }

  return it[META].w;
};

var onFreeze = function onFreeze(it) {
  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
  return it;
};

var meta = module.exports = {
  KEY: META,
  NEED: false,
  fastKey: fastKey,
  getWeak: getWeak,
  onFreeze: onFreeze
};

/***/ }),
/* 108 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var redefineAll = __w_pdfjs_require__(97);

var getWeak = __w_pdfjs_require__(107).getWeak;

var anObject = __w_pdfjs_require__(12);

var isObject = __w_pdfjs_require__(13);

var anInstance = __w_pdfjs_require__(87);

var forOf = __w_pdfjs_require__(88);

var createArrayMethod = __w_pdfjs_require__(103);

var $has = __w_pdfjs_require__(21);

var validate = __w_pdfjs_require__(109);

var arrayFind = createArrayMethod(5);
var arrayFindIndex = createArrayMethod(6);
var id = 0;

var uncaughtFrozenStore = function uncaughtFrozenStore(that) {
  return that._l || (that._l = new UncaughtFrozenStore());
};

var UncaughtFrozenStore = function UncaughtFrozenStore() {
  this.a = [];
};

var findUncaughtFrozen = function findUncaughtFrozen(store, key) {
  return arrayFind(store.a, function (it) {
    return it[0] === key;
  });
};

UncaughtFrozenStore.prototype = {
  get: function get(key) {
    var entry = findUncaughtFrozen(this, key);
    if (entry) return entry[1];
  },
  has: function has(key) {
    return !!findUncaughtFrozen(this, key);
  },
  set: function set(key, value) {
    var entry = findUncaughtFrozen(this, key);
    if (entry) entry[1] = value;else this.a.push([key, value]);
  },
  'delete': function _delete(key) {
    var index = arrayFindIndex(this.a, function (it) {
      return it[0] === key;
    });
    if (~index) this.a.splice(index, 1);
    return !!~index;
  }
};
module.exports = {
  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {
    var C = wrapper(function (that, iterable) {
      anInstance(that, C, NAME, '_i');
      that._t = NAME;
      that._i = id++;
      that._l = undefined;
      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
    });
    redefineAll(C.prototype, {
      'delete': function _delete(key) {
        if (!isObject(key)) return false;
        var data = getWeak(key);
        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);
        return data && $has(data, this._i) && delete data[this._i];
      },
      has: function has(key) {
        if (!isObject(key)) return false;
        var data = getWeak(key);
        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);
        return data && $has(data, this._i);
      }
    });
    return C;
  },
  def: function def(that, key, value) {
    var data = getWeak(anObject(key), true);
    if (data === true) uncaughtFrozenStore(that).set(key, value);else data[that._i] = value;
    return that;
  },
  ufstore: uncaughtFrozenStore
};

/***/ }),
/* 109 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(13);

module.exports = function (it, TYPE) {
  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
  return it;
};

/***/ }),
/* 110 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(8);

var $export = __w_pdfjs_require__(7);

var redefine = __w_pdfjs_require__(20);

var redefineAll = __w_pdfjs_require__(97);

var meta = __w_pdfjs_require__(107);

var forOf = __w_pdfjs_require__(88);

var anInstance = __w_pdfjs_require__(87);

var isObject = __w_pdfjs_require__(13);

var fails = __w_pdfjs_require__(16);

var $iterDetect = __w_pdfjs_require__(68);

var setToStringTag = __w_pdfjs_require__(59);

var inheritIfRequired = __w_pdfjs_require__(111);

module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
  var Base = global[NAME];
  var C = Base;
  var ADDER = IS_MAP ? 'set' : 'add';
  var proto = C && C.prototype;
  var O = {};

  var fixMethod = function fixMethod(KEY) {
    var fn = proto[KEY];
    redefine(proto, KEY, KEY == 'delete' ? function (a) {
      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
    } : KEY == 'has' ? function has(a) {
      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
    } : KEY == 'get' ? function get(a) {
      return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);
    } : KEY == 'add' ? function add(a) {
      fn.call(this, a === 0 ? 0 : a);
      return this;
    } : function set(a, b) {
      fn.call(this, a === 0 ? 0 : a, b);
      return this;
    });
  };

  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {
    new C().entries().next();
  }))) {
    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
    redefineAll(C.prototype, methods);
    meta.NEED = true;
  } else {
    var instance = new C();
    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
    var THROWS_ON_PRIMITIVES = fails(function () {
      instance.has(1);
    });
    var ACCEPT_ITERABLES = $iterDetect(function (iter) {
      new C(iter);
    });
    var BUGGY_ZERO = !IS_WEAK && fails(function () {
      var $instance = new C();
      var index = 5;

      while (index--) {
        $instance[ADDER](index, index);
      }

      return !$instance.has(-0);
    });

    if (!ACCEPT_ITERABLES) {
      C = wrapper(function (target, iterable) {
        anInstance(target, C, NAME);
        var that = inheritIfRequired(new Base(), target, C);
        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
        return that;
      });
      C.prototype = proto;
      proto.constructor = C;
    }

    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
      fixMethod('delete');
      fixMethod('has');
      IS_MAP && fixMethod('get');
    }

    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
    if (IS_WEAK && proto.clear) delete proto.clear;
  }

  setToStringTag(C, NAME);
  O[NAME] = C;
  $export($export.G + $export.W + $export.F * (C != Base), O);
  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
  return C;
};

/***/ }),
/* 111 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(13);

var setPrototypeOf = __w_pdfjs_require__(112).set;

module.exports = function (that, target, C) {
  var S = target.constructor;
  var P;

  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {
    setPrototypeOf(that, P);
  }

  return that;
};

/***/ }),
/* 112 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(13);

var anObject = __w_pdfjs_require__(12);

var check = function check(O, proto) {
  anObject(O);
  if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
};

module.exports = {
  set: Object.setPrototypeOf || ('__proto__' in {} ? function (test, buggy, set) {
    try {
      set = __w_pdfjs_require__(23)(Function.call, __w_pdfjs_require__(113).f(Object.prototype, '__proto__').set, 2);
      set(test, []);
      buggy = !(test instanceof Array);
    } catch (e) {
      buggy = true;
    }

    return function setPrototypeOf(O, proto) {
      check(O, proto);
      if (buggy) O.__proto__ = proto;else set(O, proto);
      return O;
    };
  }({}, false) : undefined),
  check: check
};

/***/ }),
/* 113 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var pIE = __w_pdfjs_require__(73);

var createDesc = __w_pdfjs_require__(19);

var toIObject = __w_pdfjs_require__(42);

var toPrimitive = __w_pdfjs_require__(18);

var has = __w_pdfjs_require__(21);

var IE8_DOM_DEFINE = __w_pdfjs_require__(14);

var gOPD = Object.getOwnPropertyDescriptor;
exports.f = __w_pdfjs_require__(15) ? gOPD : function getOwnPropertyDescriptor(O, P) {
  O = toIObject(O);
  P = toPrimitive(P, true);
  if (IE8_DOM_DEFINE) try {
    return gOPD(O, P);
  } catch (e) {}
  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
};

/***/ }),
/* 114 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(115)('WeakMap');

/***/ }),
/* 115 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

module.exports = function (COLLECTION) {
  $export($export.S, COLLECTION, {
    of: function of() {
      var length = arguments.length;
      var A = new Array(length);

      while (length--) {
        A[length] = arguments[length];
      }

      return new this(A);
    }
  });
};

/***/ }),
/* 116 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(117)('WeakMap');

/***/ }),
/* 117 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

var aFunction = __w_pdfjs_require__(24);

var ctx = __w_pdfjs_require__(23);

var forOf = __w_pdfjs_require__(88);

module.exports = function (COLLECTION) {
  $export($export.S, COLLECTION, {
    from: function from(source) {
      var mapFn = arguments[1];
      var mapping, A, n, cb;
      aFunction(this);
      mapping = mapFn !== undefined;
      if (mapping) aFunction(mapFn);
      if (source == undefined) return new this();
      A = [];

      if (mapping) {
        n = 0;
        cb = ctx(mapFn, arguments[2], 2);
        forOf(source, false, function (nextItem) {
          A.push(cb(nextItem, n++));
        });
      } else {
        forOf(source, false, A.push, A);
      }

      return new this(A);
    }
  });
};

/***/ }),
/* 118 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(82);

__w_pdfjs_require__(83);

__w_pdfjs_require__(119);

__w_pdfjs_require__(120);

__w_pdfjs_require__(121);

module.exports = __w_pdfjs_require__(9).WeakSet;

/***/ }),
/* 119 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var weak = __w_pdfjs_require__(108);

var validate = __w_pdfjs_require__(109);

var WEAK_SET = 'WeakSet';

__w_pdfjs_require__(110)(WEAK_SET, function (get) {
  return function WeakSet() {
    return get(this, arguments.length > 0 ? arguments[0] : undefined);
  };
}, {
  add: function add(value) {
    return weak.def(validate(this, WEAK_SET), value, true);
  }
}, weak, false, true);

/***/ }),
/* 120 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(115)('WeakSet');

/***/ }),
/* 121 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(117)('WeakSet');

/***/ }),
/* 122 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(123);

module.exports = __w_pdfjs_require__(9).String.codePointAt;

/***/ }),
/* 123 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

var $at = __w_pdfjs_require__(48)(false);

$export($export.P, 'String', {
  codePointAt: function codePointAt(pos) {
    return $at(this, pos);
  }
});

/***/ }),
/* 124 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(125);

module.exports = __w_pdfjs_require__(9).String.fromCodePoint;

/***/ }),
/* 125 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

var toAbsoluteIndex = __w_pdfjs_require__(44);

var fromCharCode = String.fromCharCode;
var $fromCodePoint = String.fromCodePoint;
$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
  fromCodePoint: function fromCodePoint(x) {
    var res = [];
    var aLen = arguments.length;
    var i = 0;
    var code;

    while (aLen > i) {
      code = +arguments[i++];
      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');
      res.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00));
    }

    return res.join('');
  }
});

/***/ }),
/* 126 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(127);

__w_pdfjs_require__(82);

module.exports = __w_pdfjs_require__(9).Symbol;

/***/ }),
/* 127 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var global = __w_pdfjs_require__(8);

var has = __w_pdfjs_require__(21);

var DESCRIPTORS = __w_pdfjs_require__(15);

var $export = __w_pdfjs_require__(7);

var redefine = __w_pdfjs_require__(20);

var META = __w_pdfjs_require__(107).KEY;

var $fails = __w_pdfjs_require__(16);

var shared = __w_pdfjs_require__(31);

var setToStringTag = __w_pdfjs_require__(59);

var uid = __w_pdfjs_require__(22);

var wks = __w_pdfjs_require__(30);

var wksExt = __w_pdfjs_require__(128);

var wksDefine = __w_pdfjs_require__(129);

var enumKeys = __w_pdfjs_require__(130);

var isArray = __w_pdfjs_require__(106);

var anObject = __w_pdfjs_require__(12);

var isObject = __w_pdfjs_require__(13);

var toIObject = __w_pdfjs_require__(42);

var toPrimitive = __w_pdfjs_require__(18);

var createDesc = __w_pdfjs_require__(19);

var _create = __w_pdfjs_require__(52);

var gOPNExt = __w_pdfjs_require__(131);

var $GOPD = __w_pdfjs_require__(113);

var $DP = __w_pdfjs_require__(11);

var $keys = __w_pdfjs_require__(54);

var gOPD = $GOPD.f;
var dP = $DP.f;
var gOPN = gOPNExt.f;
var $Symbol = global.Symbol;
var $JSON = global.JSON;

var _stringify = $JSON && $JSON.stringify;

var PROTOTYPE = 'prototype';
var HIDDEN = wks('_hidden');
var TO_PRIMITIVE = wks('toPrimitive');
var isEnum = {}.propertyIsEnumerable;
var SymbolRegistry = shared('symbol-registry');
var AllSymbols = shared('symbols');
var OPSymbols = shared('op-symbols');
var ObjectProto = Object[PROTOTYPE];
var USE_NATIVE = typeof $Symbol == 'function';
var QObject = global.QObject;
var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
var setSymbolDesc = DESCRIPTORS && $fails(function () {
  return _create(dP({}, 'a', {
    get: function get() {
      return dP(this, 'a', {
        value: 7
      }).a;
    }
  })).a != 7;
}) ? function (it, key, D) {
  var protoDesc = gOPD(ObjectProto, key);
  if (protoDesc) delete ObjectProto[key];
  dP(it, key, D);
  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
} : dP;

var wrap = function wrap(tag) {
  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);

  sym._k = tag;
  return sym;
};

var isSymbol = USE_NATIVE && _typeof($Symbol.iterator) == 'symbol' ? function (it) {
  return _typeof(it) == 'symbol';
} : function (it) {
  return it instanceof $Symbol;
};

var $defineProperty = function defineProperty(it, key, D) {
  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
  anObject(it);
  key = toPrimitive(key, true);
  anObject(D);

  if (has(AllSymbols, key)) {
    if (!D.enumerable) {
      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
      it[HIDDEN][key] = true;
    } else {
      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
      D = _create(D, {
        enumerable: createDesc(0, false)
      });
    }

    return setSymbolDesc(it, key, D);
  }

  return dP(it, key, D);
};

var $defineProperties = function defineProperties(it, P) {
  anObject(it);
  var keys = enumKeys(P = toIObject(P));
  var i = 0;
  var l = keys.length;
  var key;

  while (l > i) {
    $defineProperty(it, key = keys[i++], P[key]);
  }

  return it;
};

var $create = function create(it, P) {
  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
};

var $propertyIsEnumerable = function propertyIsEnumerable(key) {
  var E = isEnum.call(this, key = toPrimitive(key, true));
  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
};

var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
  it = toIObject(it);
  key = toPrimitive(key, true);
  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
  var D = gOPD(it, key);
  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
  return D;
};

var $getOwnPropertyNames = function getOwnPropertyNames(it) {
  var names = gOPN(toIObject(it));
  var result = [];
  var i = 0;
  var key;

  while (names.length > i) {
    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
  }

  return result;
};

var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
  var IS_OP = it === ObjectProto;
  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
  var result = [];
  var i = 0;
  var key;

  while (names.length > i) {
    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
  }

  return result;
};

if (!USE_NATIVE) {
  $Symbol = function _Symbol() {
    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);

    var $set = function $set(value) {
      if (this === ObjectProto) $set.call(OPSymbols, value);
      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
      setSymbolDesc(this, tag, createDesc(1, value));
    };

    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, {
      configurable: true,
      set: $set
    });
    return wrap(tag);
  };

  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
    return this._k;
  });
  $GOPD.f = $getOwnPropertyDescriptor;
  $DP.f = $defineProperty;
  __w_pdfjs_require__(132).f = gOPNExt.f = $getOwnPropertyNames;
  __w_pdfjs_require__(73).f = $propertyIsEnumerable;
  __w_pdfjs_require__(72).f = $getOwnPropertySymbols;

  if (DESCRIPTORS && !__w_pdfjs_require__(32)) {
    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
  }

  wksExt.f = function (name) {
    return wrap(wks(name));
  };
}

$export($export.G + $export.W + $export.F * !USE_NATIVE, {
  Symbol: $Symbol
});

for (var es6Symbols = 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','), j = 0; es6Symbols.length > j;) {
  wks(es6Symbols[j++]);
}

for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) {
  wksDefine(wellKnownSymbols[k++]);
}

$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
  'for': function _for(key) {
    return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key);
  },
  keyFor: function keyFor(sym) {
    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');

    for (var key in SymbolRegistry) {
      if (SymbolRegistry[key] === sym) return key;
    }
  },
  useSetter: function useSetter() {
    setter = true;
  },
  useSimple: function useSimple() {
    setter = false;
  }
});
$export($export.S + $export.F * !USE_NATIVE, 'Object', {
  create: $create,
  defineProperty: $defineProperty,
  defineProperties: $defineProperties,
  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
  getOwnPropertyNames: $getOwnPropertyNames,
  getOwnPropertySymbols: $getOwnPropertySymbols
});
$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
  var S = $Symbol();
  return _stringify([S]) != '[null]' || _stringify({
    a: S
  }) != '{}' || _stringify(Object(S)) != '{}';
})), 'JSON', {
  stringify: function stringify(it) {
    var args = [it];
    var i = 1;
    var replacer, $replacer;

    while (arguments.length > i) {
      args.push(arguments[i++]);
    }

    $replacer = replacer = args[1];
    if (!isObject(replacer) && it === undefined || isSymbol(it)) return;
    if (!isArray(replacer)) replacer = function replacer(key, value) {
      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
      if (!isSymbol(value)) return value;
    };
    args[1] = replacer;
    return _stringify.apply($JSON, args);
  }
});
$Symbol[PROTOTYPE][TO_PRIMITIVE] || __w_pdfjs_require__(10)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
setToStringTag($Symbol, 'Symbol');
setToStringTag(Math, 'Math', true);
setToStringTag(global.JSON, 'JSON', true);

/***/ }),
/* 128 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


exports.f = __w_pdfjs_require__(30);

/***/ }),
/* 129 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(8);

var core = __w_pdfjs_require__(9);

var LIBRARY = __w_pdfjs_require__(32);

var wksExt = __w_pdfjs_require__(128);

var defineProperty = __w_pdfjs_require__(11).f;

module.exports = function (name) {
  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, {
    value: wksExt.f(name)
  });
};

/***/ }),
/* 130 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var getKeys = __w_pdfjs_require__(54);

var gOPS = __w_pdfjs_require__(72);

var pIE = __w_pdfjs_require__(73);

module.exports = function (it) {
  var result = getKeys(it);
  var getSymbols = gOPS.f;

  if (getSymbols) {
    var symbols = getSymbols(it);
    var isEnum = pIE.f;
    var i = 0;
    var key;

    while (symbols.length > i) {
      if (isEnum.call(it, key = symbols[i++])) result.push(key);
    }
  }

  return result;
};

/***/ }),
/* 131 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var toIObject = __w_pdfjs_require__(42);

var gOPN = __w_pdfjs_require__(132).f;

var toString = {}.toString;
var windowNames = (typeof window === "undefined" ? "undefined" : _typeof(window)) == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];

var getWindowNames = function getWindowNames(it) {
  try {
    return gOPN(it);
  } catch (e) {
    return windowNames.slice();
  }
};

module.exports.f = function getOwnPropertyNames(it) {
  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
};

/***/ }),
/* 132 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $keys = __w_pdfjs_require__(55);

var hiddenKeys = __w_pdfjs_require__(57).concat('length', 'prototype');

exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
  return $keys(O, hiddenKeys);
};

/***/ }),
/* 133 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(134);

module.exports = __w_pdfjs_require__(9).String.padStart;

/***/ }),
/* 134 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

var $pad = __w_pdfjs_require__(135);

var userAgent = __w_pdfjs_require__(95);

$export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', {
  padStart: function padStart(maxLength) {
    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);
  }
});

/***/ }),
/* 135 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toLength = __w_pdfjs_require__(25);

var repeat = __w_pdfjs_require__(136);

var defined = __w_pdfjs_require__(33);

module.exports = function (that, maxLength, fillString, left) {
  var S = String(defined(that));
  var stringLength = S.length;
  var fillStr = fillString === undefined ? ' ' : String(fillString);
  var intMaxLength = toLength(maxLength);
  if (intMaxLength <= stringLength || fillStr == '') return S;
  var fillLen = intMaxLength - stringLength;
  var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));
  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);
  return left ? stringFiller + S : S + stringFiller;
};

/***/ }),
/* 136 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toInteger = __w_pdfjs_require__(26);

var defined = __w_pdfjs_require__(33);

module.exports = function repeat(count) {
  var str = String(defined(this));
  var res = '';
  var n = toInteger(count);
  if (n < 0 || n == Infinity) throw RangeError("Count can't be negative");

  for (; n > 0; (n >>>= 1) && (str += str)) {
    if (n & 1) res += str;
  }

  return res;
};

/***/ }),
/* 137 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(138);

module.exports = __w_pdfjs_require__(9).String.padEnd;

/***/ }),
/* 138 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

var $pad = __w_pdfjs_require__(135);

var userAgent = __w_pdfjs_require__(95);

$export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', {
  padEnd: function padEnd(maxLength) {
    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);
  }
});

/***/ }),
/* 139 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(140);

module.exports = __w_pdfjs_require__(9).Object.values;

/***/ }),
/* 140 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(7);

var $values = __w_pdfjs_require__(141)(false);

$export($export.S, 'Object', {
  values: function values(it) {
    return $values(it);
  }
});

/***/ }),
/* 141 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var getKeys = __w_pdfjs_require__(54);

var toIObject = __w_pdfjs_require__(42);

var isEnum = __w_pdfjs_require__(73).f;

module.exports = function (isEntries) {
  return function (it) {
    var O = toIObject(it);
    var keys = getKeys(O);
    var length = keys.length;
    var i = 0;
    var result = [];
    var key;

    while (length > i) {
      if (isEnum.call(O, key = keys[i++])) {
        result.push(isEntries ? [key, O[key]] : O[key]);
      }
    }

    return result;
  };
};

/***/ }),
/* 142 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


{
  var isReadableStreamSupported = false;

  if (typeof ReadableStream !== 'undefined') {
    try {
      new ReadableStream({
        start: function start(controller) {
          controller.close();
        }
      });
      isReadableStreamSupported = true;
    } catch (e) {}
  }

  if (isReadableStreamSupported) {
    exports.ReadableStream = ReadableStream;
  } else {
    exports.ReadableStream = __w_pdfjs_require__(143).ReadableStream;
  }
}

/***/ }),
/* 143 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); }

(function (e, a) {
  for (var i in a) {
    e[i] = a[i];
  }
})(exports, function (modules) {
  var installedModules = {};

  function __w_pdfjs_require__(moduleId) {
    if (installedModules[moduleId]) return installedModules[moduleId].exports;
    var module = installedModules[moduleId] = {
      i: moduleId,
      l: false,
      exports: {}
    };
    modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);
    module.l = true;
    return module.exports;
  }

  __w_pdfjs_require__.m = modules;
  __w_pdfjs_require__.c = installedModules;

  __w_pdfjs_require__.i = function (value) {
    return value;
  };

  __w_pdfjs_require__.d = function (exports, name, getter) {
    if (!__w_pdfjs_require__.o(exports, name)) {
      Object.defineProperty(exports, name, {
        configurable: false,
        enumerable: true,
        get: getter
      });
    }
  };

  __w_pdfjs_require__.n = function (module) {
    var getter = module && module.__esModule ? function getDefault() {
      return module['default'];
    } : function getModuleExports() {
      return module;
    };

    __w_pdfjs_require__.d(getter, 'a', getter);

    return getter;
  };

  __w_pdfjs_require__.o = function (object, property) {
    return Object.prototype.hasOwnProperty.call(object, property);
  };

  __w_pdfjs_require__.p = "";
  return __w_pdfjs_require__(__w_pdfjs_require__.s = 7);
}([function (module, exports, __w_pdfjs_require__) {
  "use strict";

  var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
    return _typeof2(obj);
  } : function (obj) {
    return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj);
  };

  var _require = __w_pdfjs_require__(1),
      assert = _require.assert;

  function IsPropertyKey(argument) {
    return typeof argument === 'string' || (typeof argument === 'undefined' ? 'undefined' : _typeof(argument)) === 'symbol';
  }

  exports.typeIsObject = function (x) {
    return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x !== null || typeof x === 'function';
  };

  exports.createDataProperty = function (o, p, v) {
    assert(exports.typeIsObject(o));
    Object.defineProperty(o, p, {
      value: v,
      writable: true,
      enumerable: true,
      configurable: true
    });
  };

  exports.createArrayFromList = function (elements) {
    return elements.slice();
  };

  exports.ArrayBufferCopy = function (dest, destOffset, src, srcOffset, n) {
    new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);
  };

  exports.CreateIterResultObject = function (value, done) {
    assert(typeof done === 'boolean');
    var obj = {};
    Object.defineProperty(obj, 'value', {
      value: value,
      enumerable: true,
      writable: true,
      configurable: true
    });
    Object.defineProperty(obj, 'done', {
      value: done,
      enumerable: true,
      writable: true,
      configurable: true
    });
    return obj;
  };

  exports.IsFiniteNonNegativeNumber = function (v) {
    if (Number.isNaN(v)) {
      return false;
    }

    if (v === Infinity) {
      return false;
    }

    if (v < 0) {
      return false;
    }

    return true;
  };

  function Call(F, V, args) {
    if (typeof F !== 'function') {
      throw new TypeError('Argument is not a function');
    }

    return Function.prototype.apply.call(F, V, args);
  }

  exports.InvokeOrNoop = function (O, P, args) {
    assert(O !== undefined);
    assert(IsPropertyKey(P));
    assert(Array.isArray(args));
    var method = O[P];

    if (method === undefined) {
      return undefined;
    }

    return Call(method, O, args);
  };

  exports.PromiseInvokeOrNoop = function (O, P, args) {
    assert(O !== undefined);
    assert(IsPropertyKey(P));
    assert(Array.isArray(args));

    try {
      return Promise.resolve(exports.InvokeOrNoop(O, P, args));
    } catch (returnValueE) {
      return Promise.reject(returnValueE);
    }
  };

  exports.PromiseInvokeOrPerformFallback = function (O, P, args, F, argsF) {
    assert(O !== undefined);
    assert(IsPropertyKey(P));
    assert(Array.isArray(args));
    assert(Array.isArray(argsF));
    var method = void 0;

    try {
      method = O[P];
    } catch (methodE) {
      return Promise.reject(methodE);
    }

    if (method === undefined) {
      return F.apply(null, argsF);
    }

    try {
      return Promise.resolve(Call(method, O, args));
    } catch (e) {
      return Promise.reject(e);
    }
  };

  exports.TransferArrayBuffer = function (O) {
    return O.slice();
  };

  exports.ValidateAndNormalizeHighWaterMark = function (highWaterMark) {
    highWaterMark = Number(highWaterMark);

    if (Number.isNaN(highWaterMark) || highWaterMark < 0) {
      throw new RangeError('highWaterMark property of a queuing strategy must be non-negative and non-NaN');
    }

    return highWaterMark;
  };

  exports.ValidateAndNormalizeQueuingStrategy = function (size, highWaterMark) {
    if (size !== undefined && typeof size !== 'function') {
      throw new TypeError('size property of a queuing strategy must be a function');
    }

    highWaterMark = exports.ValidateAndNormalizeHighWaterMark(highWaterMark);
    return {
      size: size,
      highWaterMark: highWaterMark
    };
  };
}, function (module, exports, __w_pdfjs_require__) {
  "use strict";

  function rethrowAssertionErrorRejection(e) {
    if (e && e.constructor === AssertionError) {
      setTimeout(function () {
        throw e;
      }, 0);
    }
  }

  function AssertionError(message) {
    this.name = 'AssertionError';
    this.message = message || '';
    this.stack = new Error().stack;
  }

  AssertionError.prototype = Object.create(Error.prototype);
  AssertionError.prototype.constructor = AssertionError;

  function assert(value, message) {
    if (!value) {
      throw new AssertionError(message);
    }
  }

  module.exports = {
    rethrowAssertionErrorRejection: rethrowAssertionErrorRejection,
    AssertionError: AssertionError,
    assert: assert
  };
}, function (module, exports, __w_pdfjs_require__) {
  "use strict";

  var _createClass = function () {
    function defineProperties(target, props) {
      for (var i = 0; i < props.length; i++) {
        var descriptor = props[i];
        descriptor.enumerable = descriptor.enumerable || false;
        descriptor.configurable = true;
        if ("value" in descriptor) descriptor.writable = true;
        Object.defineProperty(target, descriptor.key, descriptor);
      }
    }

    return function (Constructor, protoProps, staticProps) {
      if (protoProps) defineProperties(Constructor.prototype, protoProps);
      if (staticProps) defineProperties(Constructor, staticProps);
      return Constructor;
    };
  }();

  function _classCallCheck(instance, Constructor) {
    if (!(instance instanceof Constructor)) {
      throw new TypeError("Cannot call a class as a function");
    }
  }

  var _require = __w_pdfjs_require__(0),
      InvokeOrNoop = _require.InvokeOrNoop,
      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,
      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,
      typeIsObject = _require.typeIsObject;

  var _require2 = __w_pdfjs_require__(1),
      assert = _require2.assert,
      rethrowAssertionErrorRejection = _require2.rethrowAssertionErrorRejection;

  var _require3 = __w_pdfjs_require__(3),
      DequeueValue = _require3.DequeueValue,
      EnqueueValueWithSize = _require3.EnqueueValueWithSize,
      PeekQueueValue = _require3.PeekQueueValue,
      ResetQueue = _require3.ResetQueue;

  var WritableStream = function () {
    function WritableStream() {
      var underlyingSink = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
          size = _ref.size,
          _ref$highWaterMark = _ref.highWaterMark,
          highWaterMark = _ref$highWaterMark === undefined ? 1 : _ref$highWaterMark;

      _classCallCheck(this, WritableStream);

      this._state = 'writable';
      this._storedError = undefined;
      this._writer = undefined;
      this._writableStreamController = undefined;
      this._writeRequests = [];
      this._inFlightWriteRequest = undefined;
      this._closeRequest = undefined;
      this._inFlightCloseRequest = undefined;
      this._pendingAbortRequest = undefined;
      this._backpressure = false;
      var type = underlyingSink.type;

      if (type !== undefined) {
        throw new RangeError('Invalid type is specified');
      }

      this._writableStreamController = new WritableStreamDefaultController(this, underlyingSink, size, highWaterMark);

      this._writableStreamController.__startSteps();
    }

    _createClass(WritableStream, [{
      key: 'abort',
      value: function abort(reason) {
        if (IsWritableStream(this) === false) {
          return Promise.reject(streamBrandCheckException('abort'));
        }

        if (IsWritableStreamLocked(this) === true) {
          return Promise.reject(new TypeError('Cannot abort a stream that already has a writer'));
        }

        return WritableStreamAbort(this, reason);
      }
    }, {
      key: 'getWriter',
      value: function getWriter() {
        if (IsWritableStream(this) === false) {
          throw streamBrandCheckException('getWriter');
        }

        return AcquireWritableStreamDefaultWriter(this);
      }
    }, {
      key: 'locked',
      get: function get() {
        if (IsWritableStream(this) === false) {
          throw streamBrandCheckException('locked');
        }

        return IsWritableStreamLocked(this);
      }
    }]);

    return WritableStream;
  }();

  module.exports = {
    AcquireWritableStreamDefaultWriter: AcquireWritableStreamDefaultWriter,
    IsWritableStream: IsWritableStream,
    IsWritableStreamLocked: IsWritableStreamLocked,
    WritableStream: WritableStream,
    WritableStreamAbort: WritableStreamAbort,
    WritableStreamDefaultControllerError: WritableStreamDefaultControllerError,
    WritableStreamDefaultWriterCloseWithErrorPropagation: WritableStreamDefaultWriterCloseWithErrorPropagation,
    WritableStreamDefaultWriterRelease: WritableStreamDefaultWriterRelease,
    WritableStreamDefaultWriterWrite: WritableStreamDefaultWriterWrite,
    WritableStreamCloseQueuedOrInFlight: WritableStreamCloseQueuedOrInFlight
  };

  function AcquireWritableStreamDefaultWriter(stream) {
    return new WritableStreamDefaultWriter(stream);
  }

  function IsWritableStream(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) {
      return false;
    }

    return true;
  }

  function IsWritableStreamLocked(stream) {
    assert(IsWritableStream(stream) === true, 'IsWritableStreamLocked should only be used on known writable streams');

    if (stream._writer === undefined) {
      return false;
    }

    return true;
  }

  function WritableStreamAbort(stream, reason) {
    var state = stream._state;

    if (state === 'closed') {
      return Promise.resolve(undefined);
    }

    if (state === 'errored') {
      return Promise.reject(stream._storedError);
    }

    var error = new TypeError('Requested to abort');

    if (stream._pendingAbortRequest !== undefined) {
      return Promise.reject(error);
    }

    assert(state === 'writable' || state === 'erroring', 'state must be writable or erroring');
    var wasAlreadyErroring = false;

    if (state === 'erroring') {
      wasAlreadyErroring = true;
      reason = undefined;
    }

    var promise = new Promise(function (resolve, reject) {
      stream._pendingAbortRequest = {
        _resolve: resolve,
        _reject: reject,
        _reason: reason,
        _wasAlreadyErroring: wasAlreadyErroring
      };
    });

    if (wasAlreadyErroring === false) {
      WritableStreamStartErroring(stream, error);
    }

    return promise;
  }

  function WritableStreamAddWriteRequest(stream) {
    assert(IsWritableStreamLocked(stream) === true);
    assert(stream._state === 'writable');
    var promise = new Promise(function (resolve, reject) {
      var writeRequest = {
        _resolve: resolve,
        _reject: reject
      };

      stream._writeRequests.push(writeRequest);
    });
    return promise;
  }

  function WritableStreamDealWithRejection(stream, error) {
    var state = stream._state;

    if (state === 'writable') {
      WritableStreamStartErroring(stream, error);
      return;
    }

    assert(state === 'erroring');
    WritableStreamFinishErroring(stream);
  }

  function WritableStreamStartErroring(stream, reason) {
    assert(stream._storedError === undefined, 'stream._storedError === undefined');
    assert(stream._state === 'writable', 'state must be writable');
    var controller = stream._writableStreamController;
    assert(controller !== undefined, 'controller must not be undefined');
    stream._state = 'erroring';
    stream._storedError = reason;
    var writer = stream._writer;

    if (writer !== undefined) {
      WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);
    }

    if (WritableStreamHasOperationMarkedInFlight(stream) === false && controller._started === true) {
      WritableStreamFinishErroring(stream);
    }
  }

  function WritableStreamFinishErroring(stream) {
    assert(stream._state === 'erroring', 'stream._state === erroring');
    assert(WritableStreamHasOperationMarkedInFlight(stream) === false, 'WritableStreamHasOperationMarkedInFlight(stream) === false');
    stream._state = 'errored';

    stream._writableStreamController.__errorSteps();

    var storedError = stream._storedError;

    for (var i = 0; i < stream._writeRequests.length; i++) {
      var writeRequest = stream._writeRequests[i];

      writeRequest._reject(storedError);
    }

    stream._writeRequests = [];

    if (stream._pendingAbortRequest === undefined) {
      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
      return;
    }

    var abortRequest = stream._pendingAbortRequest;
    stream._pendingAbortRequest = undefined;

    if (abortRequest._wasAlreadyErroring === true) {
      abortRequest._reject(storedError);

      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
      return;
    }

    var promise = stream._writableStreamController.__abortSteps(abortRequest._reason);

    promise.then(function () {
      abortRequest._resolve();

      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
    }, function (reason) {
      abortRequest._reject(reason);

      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
    });
  }

  function WritableStreamFinishInFlightWrite(stream) {
    assert(stream._inFlightWriteRequest !== undefined);

    stream._inFlightWriteRequest._resolve(undefined);

    stream._inFlightWriteRequest = undefined;
  }

  function WritableStreamFinishInFlightWriteWithError(stream, error) {
    assert(stream._inFlightWriteRequest !== undefined);

    stream._inFlightWriteRequest._reject(error);

    stream._inFlightWriteRequest = undefined;
    assert(stream._state === 'writable' || stream._state === 'erroring');
    WritableStreamDealWithRejection(stream, error);
  }

  function WritableStreamFinishInFlightClose(stream) {
    assert(stream._inFlightCloseRequest !== undefined);

    stream._inFlightCloseRequest._resolve(undefined);

    stream._inFlightCloseRequest = undefined;
    var state = stream._state;
    assert(state === 'writable' || state === 'erroring');

    if (state === 'erroring') {
      stream._storedError = undefined;

      if (stream._pendingAbortRequest !== undefined) {
        stream._pendingAbortRequest._resolve();

        stream._pendingAbortRequest = undefined;
      }
    }

    stream._state = 'closed';
    var writer = stream._writer;

    if (writer !== undefined) {
      defaultWriterClosedPromiseResolve(writer);
    }

    assert(stream._pendingAbortRequest === undefined, 'stream._pendingAbortRequest === undefined');
    assert(stream._storedError === undefined, 'stream._storedError === undefined');
  }

  function WritableStreamFinishInFlightCloseWithError(stream, error) {
    assert(stream._inFlightCloseRequest !== undefined);

    stream._inFlightCloseRequest._reject(error);

    stream._inFlightCloseRequest = undefined;
    assert(stream._state === 'writable' || stream._state === 'erroring');

    if (stream._pendingAbortRequest !== undefined) {
      stream._pendingAbortRequest._reject(error);

      stream._pendingAbortRequest = undefined;
    }

    WritableStreamDealWithRejection(stream, error);
  }

  function WritableStreamCloseQueuedOrInFlight(stream) {
    if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) {
      return false;
    }

    return true;
  }

  function WritableStreamHasOperationMarkedInFlight(stream) {
    if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) {
      return false;
    }

    return true;
  }

  function WritableStreamMarkCloseRequestInFlight(stream) {
    assert(stream._inFlightCloseRequest === undefined);
    assert(stream._closeRequest !== undefined);
    stream._inFlightCloseRequest = stream._closeRequest;
    stream._closeRequest = undefined;
  }

  function WritableStreamMarkFirstWriteRequestInFlight(stream) {
    assert(stream._inFlightWriteRequest === undefined, 'there must be no pending write request');
    assert(stream._writeRequests.length !== 0, 'writeRequests must not be empty');
    stream._inFlightWriteRequest = stream._writeRequests.shift();
  }

  function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {
    assert(stream._state === 'errored', '_stream_.[[state]] is `"errored"`');

    if (stream._closeRequest !== undefined) {
      assert(stream._inFlightCloseRequest === undefined);

      stream._closeRequest._reject(stream._storedError);

      stream._closeRequest = undefined;
    }

    var writer = stream._writer;

    if (writer !== undefined) {
      defaultWriterClosedPromiseReject(writer, stream._storedError);

      writer._closedPromise.catch(function () {});
    }
  }

  function WritableStreamUpdateBackpressure(stream, backpressure) {
    assert(stream._state === 'writable');
    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);
    var writer = stream._writer;

    if (writer !== undefined && backpressure !== stream._backpressure) {
      if (backpressure === true) {
        defaultWriterReadyPromiseReset(writer);
      } else {
        assert(backpressure === false);
        defaultWriterReadyPromiseResolve(writer);
      }
    }

    stream._backpressure = backpressure;
  }

  var WritableStreamDefaultWriter = function () {
    function WritableStreamDefaultWriter(stream) {
      _classCallCheck(this, WritableStreamDefaultWriter);

      if (IsWritableStream(stream) === false) {
        throw new TypeError('WritableStreamDefaultWriter can only be constructed with a WritableStream instance');
      }

      if (IsWritableStreamLocked(stream) === true) {
        throw new TypeError('This stream has already been locked for exclusive writing by another writer');
      }

      this._ownerWritableStream = stream;
      stream._writer = this;
      var state = stream._state;

      if (state === 'writable') {
        if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._backpressure === true) {
          defaultWriterReadyPromiseInitialize(this);
        } else {
          defaultWriterReadyPromiseInitializeAsResolved(this);
        }

        defaultWriterClosedPromiseInitialize(this);
      } else if (state === 'erroring') {
        defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError);

        this._readyPromise.catch(function () {});

        defaultWriterClosedPromiseInitialize(this);
      } else if (state === 'closed') {
        defaultWriterReadyPromiseInitializeAsResolved(this);
        defaultWriterClosedPromiseInitializeAsResolved(this);
      } else {
        assert(state === 'errored', 'state must be errored');
        var storedError = stream._storedError;
        defaultWriterReadyPromiseInitializeAsRejected(this, storedError);

        this._readyPromise.catch(function () {});

        defaultWriterClosedPromiseInitializeAsRejected(this, storedError);

        this._closedPromise.catch(function () {});
      }
    }

    _createClass(WritableStreamDefaultWriter, [{
      key: 'abort',
      value: function abort(reason) {
        if (IsWritableStreamDefaultWriter(this) === false) {
          return Promise.reject(defaultWriterBrandCheckException('abort'));
        }

        if (this._ownerWritableStream === undefined) {
          return Promise.reject(defaultWriterLockException('abort'));
        }

        return WritableStreamDefaultWriterAbort(this, reason);
      }
    }, {
      key: 'close',
      value: function close() {
        if (IsWritableStreamDefaultWriter(this) === false) {
          return Promise.reject(defaultWriterBrandCheckException('close'));
        }

        var stream = this._ownerWritableStream;

        if (stream === undefined) {
          return Promise.reject(defaultWriterLockException('close'));
        }

        if (WritableStreamCloseQueuedOrInFlight(stream) === true) {
          return Promise.reject(new TypeError('cannot close an already-closing stream'));
        }

        return WritableStreamDefaultWriterClose(this);
      }
    }, {
      key: 'releaseLock',
      value: function releaseLock() {
        if (IsWritableStreamDefaultWriter(this) === false) {
          throw defaultWriterBrandCheckException('releaseLock');
        }

        var stream = this._ownerWritableStream;

        if (stream === undefined) {
          return;
        }

        assert(stream._writer !== undefined);
        WritableStreamDefaultWriterRelease(this);
      }
    }, {
      key: 'write',
      value: function write(chunk) {
        if (IsWritableStreamDefaultWriter(this) === false) {
          return Promise.reject(defaultWriterBrandCheckException('write'));
        }

        if (this._ownerWritableStream === undefined) {
          return Promise.reject(defaultWriterLockException('write to'));
        }

        return WritableStreamDefaultWriterWrite(this, chunk);
      }
    }, {
      key: 'closed',
      get: function get() {
        if (IsWritableStreamDefaultWriter(this) === false) {
          return Promise.reject(defaultWriterBrandCheckException('closed'));
        }

        return this._closedPromise;
      }
    }, {
      key: 'desiredSize',
      get: function get() {
        if (IsWritableStreamDefaultWriter(this) === false) {
          throw defaultWriterBrandCheckException('desiredSize');
        }

        if (this._ownerWritableStream === undefined) {
          throw defaultWriterLockException('desiredSize');
        }

        return WritableStreamDefaultWriterGetDesiredSize(this);
      }
    }, {
      key: 'ready',
      get: function get() {
        if (IsWritableStreamDefaultWriter(this) === false) {
          return Promise.reject(defaultWriterBrandCheckException('ready'));
        }

        return this._readyPromise;
      }
    }]);

    return WritableStreamDefaultWriter;
  }();

  function IsWritableStreamDefaultWriter(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) {
      return false;
    }

    return true;
  }

  function WritableStreamDefaultWriterAbort(writer, reason) {
    var stream = writer._ownerWritableStream;
    assert(stream !== undefined);
    return WritableStreamAbort(stream, reason);
  }

  function WritableStreamDefaultWriterClose(writer) {
    var stream = writer._ownerWritableStream;
    assert(stream !== undefined);
    var state = stream._state;

    if (state === 'closed' || state === 'errored') {
      return Promise.reject(new TypeError('The stream (in ' + state + ' state) is not in the writable state and cannot be closed'));
    }

    assert(state === 'writable' || state === 'erroring');
    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);
    var promise = new Promise(function (resolve, reject) {
      var closeRequest = {
        _resolve: resolve,
        _reject: reject
      };
      stream._closeRequest = closeRequest;
    });

    if (stream._backpressure === true && state === 'writable') {
      defaultWriterReadyPromiseResolve(writer);
    }

    WritableStreamDefaultControllerClose(stream._writableStreamController);
    return promise;
  }

  function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) {
    var stream = writer._ownerWritableStream;
    assert(stream !== undefined);
    var state = stream._state;

    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {
      return Promise.resolve();
    }

    if (state === 'errored') {
      return Promise.reject(stream._storedError);
    }

    assert(state === 'writable' || state === 'erroring');
    return WritableStreamDefaultWriterClose(writer);
  }

  function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {
    if (writer._closedPromiseState === 'pending') {
      defaultWriterClosedPromiseReject(writer, error);
    } else {
      defaultWriterClosedPromiseResetToRejected(writer, error);
    }

    writer._closedPromise.catch(function () {});
  }

  function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {
    if (writer._readyPromiseState === 'pending') {
      defaultWriterReadyPromiseReject(writer, error);
    } else {
      defaultWriterReadyPromiseResetToRejected(writer, error);
    }

    writer._readyPromise.catch(function () {});
  }

  function WritableStreamDefaultWriterGetDesiredSize(writer) {
    var stream = writer._ownerWritableStream;
    var state = stream._state;

    if (state === 'errored' || state === 'erroring') {
      return null;
    }

    if (state === 'closed') {
      return 0;
    }

    return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController);
  }

  function WritableStreamDefaultWriterRelease(writer) {
    var stream = writer._ownerWritableStream;
    assert(stream !== undefined);
    assert(stream._writer === writer);
    var releasedError = new TypeError('Writer was released and can no longer be used to monitor the stream\'s closedness');
    WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);
    WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);
    stream._writer = undefined;
    writer._ownerWritableStream = undefined;
  }

  function WritableStreamDefaultWriterWrite(writer, chunk) {
    var stream = writer._ownerWritableStream;
    assert(stream !== undefined);
    var controller = stream._writableStreamController;
    var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk);

    if (stream !== writer._ownerWritableStream) {
      return Promise.reject(defaultWriterLockException('write to'));
    }

    var state = stream._state;

    if (state === 'errored') {
      return Promise.reject(stream._storedError);
    }

    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {
      return Promise.reject(new TypeError('The stream is closing or closed and cannot be written to'));
    }

    if (state === 'erroring') {
      return Promise.reject(stream._storedError);
    }

    assert(state === 'writable');
    var promise = WritableStreamAddWriteRequest(stream);
    WritableStreamDefaultControllerWrite(controller, chunk, chunkSize);
    return promise;
  }

  var WritableStreamDefaultController = function () {
    function WritableStreamDefaultController(stream, underlyingSink, size, highWaterMark) {
      _classCallCheck(this, WritableStreamDefaultController);

      if (IsWritableStream(stream) === false) {
        throw new TypeError('WritableStreamDefaultController can only be constructed with a WritableStream instance');
      }

      if (stream._writableStreamController !== undefined) {
        throw new TypeError('WritableStreamDefaultController instances can only be created by the WritableStream constructor');
      }

      this._controlledWritableStream = stream;
      this._underlyingSink = underlyingSink;
      this._queue = undefined;
      this._queueTotalSize = undefined;
      ResetQueue(this);
      this._started = false;
      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);
      this._strategySize = normalizedStrategy.size;
      this._strategyHWM = normalizedStrategy.highWaterMark;
      var backpressure = WritableStreamDefaultControllerGetBackpressure(this);
      WritableStreamUpdateBackpressure(stream, backpressure);
    }

    _createClass(WritableStreamDefaultController, [{
      key: 'error',
      value: function error(e) {
        if (IsWritableStreamDefaultController(this) === false) {
          throw new TypeError('WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController');
        }

        var state = this._controlledWritableStream._state;

        if (state !== 'writable') {
          return;
        }

        WritableStreamDefaultControllerError(this, e);
      }
    }, {
      key: '__abortSteps',
      value: function __abortSteps(reason) {
        return PromiseInvokeOrNoop(this._underlyingSink, 'abort', [reason]);
      }
    }, {
      key: '__errorSteps',
      value: function __errorSteps() {
        ResetQueue(this);
      }
    }, {
      key: '__startSteps',
      value: function __startSteps() {
        var _this = this;

        var startResult = InvokeOrNoop(this._underlyingSink, 'start', [this]);
        var stream = this._controlledWritableStream;
        Promise.resolve(startResult).then(function () {
          assert(stream._state === 'writable' || stream._state === 'erroring');
          _this._started = true;
          WritableStreamDefaultControllerAdvanceQueueIfNeeded(_this);
        }, function (r) {
          assert(stream._state === 'writable' || stream._state === 'erroring');
          _this._started = true;
          WritableStreamDealWithRejection(stream, r);
        }).catch(rethrowAssertionErrorRejection);
      }
    }]);

    return WritableStreamDefaultController;
  }();

  function WritableStreamDefaultControllerClose(controller) {
    EnqueueValueWithSize(controller, 'close', 0);
    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
  }

  function WritableStreamDefaultControllerGetChunkSize(controller, chunk) {
    var strategySize = controller._strategySize;

    if (strategySize === undefined) {
      return 1;
    }

    try {
      return strategySize(chunk);
    } catch (chunkSizeE) {
      WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);
      return 1;
    }
  }

  function WritableStreamDefaultControllerGetDesiredSize(controller) {
    return controller._strategyHWM - controller._queueTotalSize;
  }

  function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) {
    var writeRecord = {
      chunk: chunk
    };

    try {
      EnqueueValueWithSize(controller, writeRecord, chunkSize);
    } catch (enqueueE) {
      WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);
      return;
    }

    var stream = controller._controlledWritableStream;

    if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._state === 'writable') {
      var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
      WritableStreamUpdateBackpressure(stream, backpressure);
    }

    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
  }

  function IsWritableStreamDefaultController(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSink')) {
      return false;
    }

    return true;
  }

  function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {
    var stream = controller._controlledWritableStream;

    if (controller._started === false) {
      return;
    }

    if (stream._inFlightWriteRequest !== undefined) {
      return;
    }

    var state = stream._state;

    if (state === 'closed' || state === 'errored') {
      return;
    }

    if (state === 'erroring') {
      WritableStreamFinishErroring(stream);
      return;
    }

    if (controller._queue.length === 0) {
      return;
    }

    var writeRecord = PeekQueueValue(controller);

    if (writeRecord === 'close') {
      WritableStreamDefaultControllerProcessClose(controller);
    } else {
      WritableStreamDefaultControllerProcessWrite(controller, writeRecord.chunk);
    }
  }

  function WritableStreamDefaultControllerErrorIfNeeded(controller, error) {
    if (controller._controlledWritableStream._state === 'writable') {
      WritableStreamDefaultControllerError(controller, error);
    }
  }

  function WritableStreamDefaultControllerProcessClose(controller) {
    var stream = controller._controlledWritableStream;
    WritableStreamMarkCloseRequestInFlight(stream);
    DequeueValue(controller);
    assert(controller._queue.length === 0, 'queue must be empty once the final write record is dequeued');
    var sinkClosePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'close', []);
    sinkClosePromise.then(function () {
      WritableStreamFinishInFlightClose(stream);
    }, function (reason) {
      WritableStreamFinishInFlightCloseWithError(stream, reason);
    }).catch(rethrowAssertionErrorRejection);
  }

  function WritableStreamDefaultControllerProcessWrite(controller, chunk) {
    var stream = controller._controlledWritableStream;
    WritableStreamMarkFirstWriteRequestInFlight(stream);
    var sinkWritePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'write', [chunk, controller]);
    sinkWritePromise.then(function () {
      WritableStreamFinishInFlightWrite(stream);
      var state = stream._state;
      assert(state === 'writable' || state === 'erroring');
      DequeueValue(controller);

      if (WritableStreamCloseQueuedOrInFlight(stream) === false && state === 'writable') {
        var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
        WritableStreamUpdateBackpressure(stream, backpressure);
      }

      WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
    }, function (reason) {
      WritableStreamFinishInFlightWriteWithError(stream, reason);
    }).catch(rethrowAssertionErrorRejection);
  }

  function WritableStreamDefaultControllerGetBackpressure(controller) {
    var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller);
    return desiredSize <= 0;
  }

  function WritableStreamDefaultControllerError(controller, error) {
    var stream = controller._controlledWritableStream;
    assert(stream._state === 'writable');
    WritableStreamStartErroring(stream, error);
  }

  function streamBrandCheckException(name) {
    return new TypeError('WritableStream.prototype.' + name + ' can only be used on a WritableStream');
  }

  function defaultWriterBrandCheckException(name) {
    return new TypeError('WritableStreamDefaultWriter.prototype.' + name + ' can only be used on a WritableStreamDefaultWriter');
  }

  function defaultWriterLockException(name) {
    return new TypeError('Cannot ' + name + ' a stream using a released writer');
  }

  function defaultWriterClosedPromiseInitialize(writer) {
    writer._closedPromise = new Promise(function (resolve, reject) {
      writer._closedPromise_resolve = resolve;
      writer._closedPromise_reject = reject;
      writer._closedPromiseState = 'pending';
    });
  }

  function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) {
    writer._closedPromise = Promise.reject(reason);
    writer._closedPromise_resolve = undefined;
    writer._closedPromise_reject = undefined;
    writer._closedPromiseState = 'rejected';
  }

  function defaultWriterClosedPromiseInitializeAsResolved(writer) {
    writer._closedPromise = Promise.resolve(undefined);
    writer._closedPromise_resolve = undefined;
    writer._closedPromise_reject = undefined;
    writer._closedPromiseState = 'resolved';
  }

  function defaultWriterClosedPromiseReject(writer, reason) {
    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');
    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');
    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');

    writer._closedPromise_reject(reason);

    writer._closedPromise_resolve = undefined;
    writer._closedPromise_reject = undefined;
    writer._closedPromiseState = 'rejected';
  }

  function defaultWriterClosedPromiseResetToRejected(writer, reason) {
    assert(writer._closedPromise_resolve === undefined, 'writer._closedPromise_resolve === undefined');
    assert(writer._closedPromise_reject === undefined, 'writer._closedPromise_reject === undefined');
    assert(writer._closedPromiseState !== 'pending', 'writer._closedPromiseState is not pending');
    writer._closedPromise = Promise.reject(reason);
    writer._closedPromiseState = 'rejected';
  }

  function defaultWriterClosedPromiseResolve(writer) {
    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');
    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');
    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');

    writer._closedPromise_resolve(undefined);

    writer._closedPromise_resolve = undefined;
    writer._closedPromise_reject = undefined;
    writer._closedPromiseState = 'resolved';
  }

  function defaultWriterReadyPromiseInitialize(writer) {
    writer._readyPromise = new Promise(function (resolve, reject) {
      writer._readyPromise_resolve = resolve;
      writer._readyPromise_reject = reject;
    });
    writer._readyPromiseState = 'pending';
  }

  function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) {
    writer._readyPromise = Promise.reject(reason);
    writer._readyPromise_resolve = undefined;
    writer._readyPromise_reject = undefined;
    writer._readyPromiseState = 'rejected';
  }

  function defaultWriterReadyPromiseInitializeAsResolved(writer) {
    writer._readyPromise = Promise.resolve(undefined);
    writer._readyPromise_resolve = undefined;
    writer._readyPromise_reject = undefined;
    writer._readyPromiseState = 'fulfilled';
  }

  function defaultWriterReadyPromiseReject(writer, reason) {
    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');
    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');

    writer._readyPromise_reject(reason);

    writer._readyPromise_resolve = undefined;
    writer._readyPromise_reject = undefined;
    writer._readyPromiseState = 'rejected';
  }

  function defaultWriterReadyPromiseReset(writer) {
    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');
    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');
    writer._readyPromise = new Promise(function (resolve, reject) {
      writer._readyPromise_resolve = resolve;
      writer._readyPromise_reject = reject;
    });
    writer._readyPromiseState = 'pending';
  }

  function defaultWriterReadyPromiseResetToRejected(writer, reason) {
    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');
    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');
    writer._readyPromise = Promise.reject(reason);
    writer._readyPromiseState = 'rejected';
  }

  function defaultWriterReadyPromiseResolve(writer) {
    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');
    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');

    writer._readyPromise_resolve(undefined);

    writer._readyPromise_resolve = undefined;
    writer._readyPromise_reject = undefined;
    writer._readyPromiseState = 'fulfilled';
  }
}, function (module, exports, __w_pdfjs_require__) {
  "use strict";

  var _require = __w_pdfjs_require__(0),
      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber;

  var _require2 = __w_pdfjs_require__(1),
      assert = _require2.assert;

  exports.DequeueValue = function (container) {
    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');
    assert(container._queue.length > 0, 'Spec-level failure: should never dequeue from an empty queue.');

    var pair = container._queue.shift();

    container._queueTotalSize -= pair.size;

    if (container._queueTotalSize < 0) {
      container._queueTotalSize = 0;
    }

    return pair.value;
  };

  exports.EnqueueValueWithSize = function (container, value, size) {
    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and ' + '[[queueTotalSize]].');
    size = Number(size);

    if (!IsFiniteNonNegativeNumber(size)) {
      throw new RangeError('Size must be a finite, non-NaN, non-negative number.');
    }

    container._queue.push({
      value: value,
      size: size
    });

    container._queueTotalSize += size;
  };

  exports.PeekQueueValue = function (container) {
    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');
    assert(container._queue.length > 0, 'Spec-level failure: should never peek at an empty queue.');
    var pair = container._queue[0];
    return pair.value;
  };

  exports.ResetQueue = function (container) {
    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]].');
    container._queue = [];
    container._queueTotalSize = 0;
  };
}, function (module, exports, __w_pdfjs_require__) {
  "use strict";

  var _createClass = function () {
    function defineProperties(target, props) {
      for (var i = 0; i < props.length; i++) {
        var descriptor = props[i];
        descriptor.enumerable = descriptor.enumerable || false;
        descriptor.configurable = true;
        if ("value" in descriptor) descriptor.writable = true;
        Object.defineProperty(target, descriptor.key, descriptor);
      }
    }

    return function (Constructor, protoProps, staticProps) {
      if (protoProps) defineProperties(Constructor.prototype, protoProps);
      if (staticProps) defineProperties(Constructor, staticProps);
      return Constructor;
    };
  }();

  function _classCallCheck(instance, Constructor) {
    if (!(instance instanceof Constructor)) {
      throw new TypeError("Cannot call a class as a function");
    }
  }

  var _require = __w_pdfjs_require__(0),
      ArrayBufferCopy = _require.ArrayBufferCopy,
      CreateIterResultObject = _require.CreateIterResultObject,
      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber,
      InvokeOrNoop = _require.InvokeOrNoop,
      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,
      TransferArrayBuffer = _require.TransferArrayBuffer,
      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,
      ValidateAndNormalizeHighWaterMark = _require.ValidateAndNormalizeHighWaterMark;

  var _require2 = __w_pdfjs_require__(0),
      createArrayFromList = _require2.createArrayFromList,
      createDataProperty = _require2.createDataProperty,
      typeIsObject = _require2.typeIsObject;

  var _require3 = __w_pdfjs_require__(1),
      assert = _require3.assert,
      rethrowAssertionErrorRejection = _require3.rethrowAssertionErrorRejection;

  var _require4 = __w_pdfjs_require__(3),
      DequeueValue = _require4.DequeueValue,
      EnqueueValueWithSize = _require4.EnqueueValueWithSize,
      ResetQueue = _require4.ResetQueue;

  var _require5 = __w_pdfjs_require__(2),
      AcquireWritableStreamDefaultWriter = _require5.AcquireWritableStreamDefaultWriter,
      IsWritableStream = _require5.IsWritableStream,
      IsWritableStreamLocked = _require5.IsWritableStreamLocked,
      WritableStreamAbort = _require5.WritableStreamAbort,
      WritableStreamDefaultWriterCloseWithErrorPropagation = _require5.WritableStreamDefaultWriterCloseWithErrorPropagation,
      WritableStreamDefaultWriterRelease = _require5.WritableStreamDefaultWriterRelease,
      WritableStreamDefaultWriterWrite = _require5.WritableStreamDefaultWriterWrite,
      WritableStreamCloseQueuedOrInFlight = _require5.WritableStreamCloseQueuedOrInFlight;

  var ReadableStream = function () {
    function ReadableStream() {
      var underlyingSource = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
          size = _ref.size,
          highWaterMark = _ref.highWaterMark;

      _classCallCheck(this, ReadableStream);

      this._state = 'readable';
      this._reader = undefined;
      this._storedError = undefined;
      this._disturbed = false;
      this._readableStreamController = undefined;
      var type = underlyingSource.type;
      var typeString = String(type);

      if (typeString === 'bytes') {
        if (highWaterMark === undefined) {
          highWaterMark = 0;
        }

        this._readableStreamController = new ReadableByteStreamController(this, underlyingSource, highWaterMark);
      } else if (type === undefined) {
        if (highWaterMark === undefined) {
          highWaterMark = 1;
        }

        this._readableStreamController = new ReadableStreamDefaultController(this, underlyingSource, size, highWaterMark);
      } else {
        throw new RangeError('Invalid type is specified');
      }
    }

    _createClass(ReadableStream, [{
      key: 'cancel',
      value: function cancel(reason) {
        if (IsReadableStream(this) === false) {
          return Promise.reject(streamBrandCheckException('cancel'));
        }

        if (IsReadableStreamLocked(this) === true) {
          return Promise.reject(new TypeError('Cannot cancel a stream that already has a reader'));
        }

        return ReadableStreamCancel(this, reason);
      }
    }, {
      key: 'getReader',
      value: function getReader() {
        var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
            mode = _ref2.mode;

        if (IsReadableStream(this) === false) {
          throw streamBrandCheckException('getReader');
        }

        if (mode === undefined) {
          return AcquireReadableStreamDefaultReader(this);
        }

        mode = String(mode);

        if (mode === 'byob') {
          return AcquireReadableStreamBYOBReader(this);
        }

        throw new RangeError('Invalid mode is specified');
      }
    }, {
      key: 'pipeThrough',
      value: function pipeThrough(_ref3, options) {
        var writable = _ref3.writable,
            readable = _ref3.readable;
        var promise = this.pipeTo(writable, options);
        ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise);
        return readable;
      }
    }, {
      key: 'pipeTo',
      value: function pipeTo(dest) {
        var _this = this;

        var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
            preventClose = _ref4.preventClose,
            preventAbort = _ref4.preventAbort,
            preventCancel = _ref4.preventCancel;

        if (IsReadableStream(this) === false) {
          return Promise.reject(streamBrandCheckException('pipeTo'));
        }

        if (IsWritableStream(dest) === false) {
          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo\'s first argument must be a WritableStream'));
        }

        preventClose = Boolean(preventClose);
        preventAbort = Boolean(preventAbort);
        preventCancel = Boolean(preventCancel);

        if (IsReadableStreamLocked(this) === true) {
          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream'));
        }

        if (IsWritableStreamLocked(dest) === true) {
          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream'));
        }

        var reader = AcquireReadableStreamDefaultReader(this);
        var writer = AcquireWritableStreamDefaultWriter(dest);
        var shuttingDown = false;
        var currentWrite = Promise.resolve();
        return new Promise(function (resolve, reject) {
          function pipeLoop() {
            currentWrite = Promise.resolve();

            if (shuttingDown === true) {
              return Promise.resolve();
            }

            return writer._readyPromise.then(function () {
              return ReadableStreamDefaultReaderRead(reader).then(function (_ref5) {
                var value = _ref5.value,
                    done = _ref5.done;

                if (done === true) {
                  return;
                }

                currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {});
              });
            }).then(pipeLoop);
          }

          isOrBecomesErrored(_this, reader._closedPromise, function (storedError) {
            if (preventAbort === false) {
              shutdownWithAction(function () {
                return WritableStreamAbort(dest, storedError);
              }, true, storedError);
            } else {
              shutdown(true, storedError);
            }
          });
          isOrBecomesErrored(dest, writer._closedPromise, function (storedError) {
            if (preventCancel === false) {
              shutdownWithAction(function () {
                return ReadableStreamCancel(_this, storedError);
              }, true, storedError);
            } else {
              shutdown(true, storedError);
            }
          });
          isOrBecomesClosed(_this, reader._closedPromise, function () {
            if (preventClose === false) {
              shutdownWithAction(function () {
                return WritableStreamDefaultWriterCloseWithErrorPropagation(writer);
              });
            } else {
              shutdown();
            }
          });

          if (WritableStreamCloseQueuedOrInFlight(dest) === true || dest._state === 'closed') {
            var destClosed = new TypeError('the destination writable stream closed before all data could be piped to it');

            if (preventCancel === false) {
              shutdownWithAction(function () {
                return ReadableStreamCancel(_this, destClosed);
              }, true, destClosed);
            } else {
              shutdown(true, destClosed);
            }
          }

          pipeLoop().catch(function (err) {
            currentWrite = Promise.resolve();
            rethrowAssertionErrorRejection(err);
          });

          function waitForWritesToFinish() {
            var oldCurrentWrite = currentWrite;
            return currentWrite.then(function () {
              return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined;
            });
          }

          function isOrBecomesErrored(stream, promise, action) {
            if (stream._state === 'errored') {
              action(stream._storedError);
            } else {
              promise.catch(action).catch(rethrowAssertionErrorRejection);
            }
          }

          function isOrBecomesClosed(stream, promise, action) {
            if (stream._state === 'closed') {
              action();
            } else {
              promise.then(action).catch(rethrowAssertionErrorRejection);
            }
          }

          function shutdownWithAction(action, originalIsError, originalError) {
            if (shuttingDown === true) {
              return;
            }

            shuttingDown = true;

            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
              waitForWritesToFinish().then(doTheRest);
            } else {
              doTheRest();
            }

            function doTheRest() {
              action().then(function () {
                return finalize(originalIsError, originalError);
              }, function (newError) {
                return finalize(true, newError);
              }).catch(rethrowAssertionErrorRejection);
            }
          }

          function shutdown(isError, error) {
            if (shuttingDown === true) {
              return;
            }

            shuttingDown = true;

            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
              waitForWritesToFinish().then(function () {
                return finalize(isError, error);
              }).catch(rethrowAssertionErrorRejection);
            } else {
              finalize(isError, error);
            }
          }

          function finalize(isError, error) {
            WritableStreamDefaultWriterRelease(writer);
            ReadableStreamReaderGenericRelease(reader);

            if (isError) {
              reject(error);
            } else {
              resolve(undefined);
            }
          }
        });
      }
    }, {
      key: 'tee',
      value: function tee() {
        if (IsReadableStream(this) === false) {
          throw streamBrandCheckException('tee');
        }

        var branches = ReadableStreamTee(this, false);
        return createArrayFromList(branches);
      }
    }, {
      key: 'locked',
      get: function get() {
        if (IsReadableStream(this) === false) {
          throw streamBrandCheckException('locked');
        }

        return IsReadableStreamLocked(this);
      }
    }]);

    return ReadableStream;
  }();

  module.exports = {
    ReadableStream: ReadableStream,
    IsReadableStreamDisturbed: IsReadableStreamDisturbed,
    ReadableStreamDefaultControllerClose: ReadableStreamDefaultControllerClose,
    ReadableStreamDefaultControllerEnqueue: ReadableStreamDefaultControllerEnqueue,
    ReadableStreamDefaultControllerError: ReadableStreamDefaultControllerError,
    ReadableStreamDefaultControllerGetDesiredSize: ReadableStreamDefaultControllerGetDesiredSize
  };

  function AcquireReadableStreamBYOBReader(stream) {
    return new ReadableStreamBYOBReader(stream);
  }

  function AcquireReadableStreamDefaultReader(stream) {
    return new ReadableStreamDefaultReader(stream);
  }

  function IsReadableStream(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) {
      return false;
    }

    return true;
  }

  function IsReadableStreamDisturbed(stream) {
    assert(IsReadableStream(stream) === true, 'IsReadableStreamDisturbed should only be used on known readable streams');
    return stream._disturbed;
  }

  function IsReadableStreamLocked(stream) {
    assert(IsReadableStream(stream) === true, 'IsReadableStreamLocked should only be used on known readable streams');

    if (stream._reader === undefined) {
      return false;
    }

    return true;
  }

  function ReadableStreamTee(stream, cloneForBranch2) {
    assert(IsReadableStream(stream) === true);
    assert(typeof cloneForBranch2 === 'boolean');
    var reader = AcquireReadableStreamDefaultReader(stream);
    var teeState = {
      closedOrErrored: false,
      canceled1: false,
      canceled2: false,
      reason1: undefined,
      reason2: undefined
    };
    teeState.promise = new Promise(function (resolve) {
      teeState._resolve = resolve;
    });
    var pull = create_ReadableStreamTeePullFunction();
    pull._reader = reader;
    pull._teeState = teeState;
    pull._cloneForBranch2 = cloneForBranch2;
    var cancel1 = create_ReadableStreamTeeBranch1CancelFunction();
    cancel1._stream = stream;
    cancel1._teeState = teeState;
    var cancel2 = create_ReadableStreamTeeBranch2CancelFunction();
    cancel2._stream = stream;
    cancel2._teeState = teeState;
    var underlyingSource1 = Object.create(Object.prototype);
    createDataProperty(underlyingSource1, 'pull', pull);
    createDataProperty(underlyingSource1, 'cancel', cancel1);
    var branch1Stream = new ReadableStream(underlyingSource1);
    var underlyingSource2 = Object.create(Object.prototype);
    createDataProperty(underlyingSource2, 'pull', pull);
    createDataProperty(underlyingSource2, 'cancel', cancel2);
    var branch2Stream = new ReadableStream(underlyingSource2);
    pull._branch1 = branch1Stream._readableStreamController;
    pull._branch2 = branch2Stream._readableStreamController;

    reader._closedPromise.catch(function (r) {
      if (teeState.closedOrErrored === true) {
        return;
      }

      ReadableStreamDefaultControllerError(pull._branch1, r);
      ReadableStreamDefaultControllerError(pull._branch2, r);
      teeState.closedOrErrored = true;
    });

    return [branch1Stream, branch2Stream];
  }

  function create_ReadableStreamTeePullFunction() {
    function f() {
      var reader = f._reader,
          branch1 = f._branch1,
          branch2 = f._branch2,
          teeState = f._teeState;
      return ReadableStreamDefaultReaderRead(reader).then(function (result) {
        assert(typeIsObject(result));
        var value = result.value;
        var done = result.done;
        assert(typeof done === 'boolean');

        if (done === true && teeState.closedOrErrored === false) {
          if (teeState.canceled1 === false) {
            ReadableStreamDefaultControllerClose(branch1);
          }

          if (teeState.canceled2 === false) {
            ReadableStreamDefaultControllerClose(branch2);
          }

          teeState.closedOrErrored = true;
        }

        if (teeState.closedOrErrored === true) {
          return;
        }

        var value1 = value;
        var value2 = value;

        if (teeState.canceled1 === false) {
          ReadableStreamDefaultControllerEnqueue(branch1, value1);
        }

        if (teeState.canceled2 === false) {
          ReadableStreamDefaultControllerEnqueue(branch2, value2);
        }
      });
    }

    return f;
  }

  function create_ReadableStreamTeeBranch1CancelFunction() {
    function f(reason) {
      var stream = f._stream,
          teeState = f._teeState;
      teeState.canceled1 = true;
      teeState.reason1 = reason;

      if (teeState.canceled2 === true) {
        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);
        var cancelResult = ReadableStreamCancel(stream, compositeReason);

        teeState._resolve(cancelResult);
      }

      return teeState.promise;
    }

    return f;
  }

  function create_ReadableStreamTeeBranch2CancelFunction() {
    function f(reason) {
      var stream = f._stream,
          teeState = f._teeState;
      teeState.canceled2 = true;
      teeState.reason2 = reason;

      if (teeState.canceled1 === true) {
        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);
        var cancelResult = ReadableStreamCancel(stream, compositeReason);

        teeState._resolve(cancelResult);
      }

      return teeState.promise;
    }

    return f;
  }

  function ReadableStreamAddReadIntoRequest(stream) {
    assert(IsReadableStreamBYOBReader(stream._reader) === true);
    assert(stream._state === 'readable' || stream._state === 'closed');
    var promise = new Promise(function (resolve, reject) {
      var readIntoRequest = {
        _resolve: resolve,
        _reject: reject
      };

      stream._reader._readIntoRequests.push(readIntoRequest);
    });
    return promise;
  }

  function ReadableStreamAddReadRequest(stream) {
    assert(IsReadableStreamDefaultReader(stream._reader) === true);
    assert(stream._state === 'readable');
    var promise = new Promise(function (resolve, reject) {
      var readRequest = {
        _resolve: resolve,
        _reject: reject
      };

      stream._reader._readRequests.push(readRequest);
    });
    return promise;
  }

  function ReadableStreamCancel(stream, reason) {
    stream._disturbed = true;

    if (stream._state === 'closed') {
      return Promise.resolve(undefined);
    }

    if (stream._state === 'errored') {
      return Promise.reject(stream._storedError);
    }

    ReadableStreamClose(stream);

    var sourceCancelPromise = stream._readableStreamController.__cancelSteps(reason);

    return sourceCancelPromise.then(function () {
      return undefined;
    });
  }

  function ReadableStreamClose(stream) {
    assert(stream._state === 'readable');
    stream._state = 'closed';
    var reader = stream._reader;

    if (reader === undefined) {
      return undefined;
    }

    if (IsReadableStreamDefaultReader(reader) === true) {
      for (var i = 0; i < reader._readRequests.length; i++) {
        var _resolve = reader._readRequests[i]._resolve;

        _resolve(CreateIterResultObject(undefined, true));
      }

      reader._readRequests = [];
    }

    defaultReaderClosedPromiseResolve(reader);
    return undefined;
  }

  function ReadableStreamError(stream, e) {
    assert(IsReadableStream(stream) === true, 'stream must be ReadableStream');
    assert(stream._state === 'readable', 'state must be readable');
    stream._state = 'errored';
    stream._storedError = e;
    var reader = stream._reader;

    if (reader === undefined) {
      return undefined;
    }

    if (IsReadableStreamDefaultReader(reader) === true) {
      for (var i = 0; i < reader._readRequests.length; i++) {
        var readRequest = reader._readRequests[i];

        readRequest._reject(e);
      }

      reader._readRequests = [];
    } else {
      assert(IsReadableStreamBYOBReader(reader), 'reader must be ReadableStreamBYOBReader');

      for (var _i = 0; _i < reader._readIntoRequests.length; _i++) {
        var readIntoRequest = reader._readIntoRequests[_i];

        readIntoRequest._reject(e);
      }

      reader._readIntoRequests = [];
    }

    defaultReaderClosedPromiseReject(reader, e);

    reader._closedPromise.catch(function () {});
  }

  function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) {
    var reader = stream._reader;
    assert(reader._readIntoRequests.length > 0);

    var readIntoRequest = reader._readIntoRequests.shift();

    readIntoRequest._resolve(CreateIterResultObject(chunk, done));
  }

  function ReadableStreamFulfillReadRequest(stream, chunk, done) {
    var reader = stream._reader;
    assert(reader._readRequests.length > 0);

    var readRequest = reader._readRequests.shift();

    readRequest._resolve(CreateIterResultObject(chunk, done));
  }

  function ReadableStreamGetNumReadIntoRequests(stream) {
    return stream._reader._readIntoRequests.length;
  }

  function ReadableStreamGetNumReadRequests(stream) {
    return stream._reader._readRequests.length;
  }

  function ReadableStreamHasBYOBReader(stream) {
    var reader = stream._reader;

    if (reader === undefined) {
      return false;
    }

    if (IsReadableStreamBYOBReader(reader) === false) {
      return false;
    }

    return true;
  }

  function ReadableStreamHasDefaultReader(stream) {
    var reader = stream._reader;

    if (reader === undefined) {
      return false;
    }

    if (IsReadableStreamDefaultReader(reader) === false) {
      return false;
    }

    return true;
  }

  var ReadableStreamDefaultReader = function () {
    function ReadableStreamDefaultReader(stream) {
      _classCallCheck(this, ReadableStreamDefaultReader);

      if (IsReadableStream(stream) === false) {
        throw new TypeError('ReadableStreamDefaultReader can only be constructed with a ReadableStream instance');
      }

      if (IsReadableStreamLocked(stream) === true) {
        throw new TypeError('This stream has already been locked for exclusive reading by another reader');
      }

      ReadableStreamReaderGenericInitialize(this, stream);
      this._readRequests = [];
    }

    _createClass(ReadableStreamDefaultReader, [{
      key: 'cancel',
      value: function cancel(reason) {
        if (IsReadableStreamDefaultReader(this) === false) {
          return Promise.reject(defaultReaderBrandCheckException('cancel'));
        }

        if (this._ownerReadableStream === undefined) {
          return Promise.reject(readerLockException('cancel'));
        }

        return ReadableStreamReaderGenericCancel(this, reason);
      }
    }, {
      key: 'read',
      value: function read() {
        if (IsReadableStreamDefaultReader(this) === false) {
          return Promise.reject(defaultReaderBrandCheckException('read'));
        }

        if (this._ownerReadableStream === undefined) {
          return Promise.reject(readerLockException('read from'));
        }

        return ReadableStreamDefaultReaderRead(this);
      }
    }, {
      key: 'releaseLock',
      value: function releaseLock() {
        if (IsReadableStreamDefaultReader(this) === false) {
          throw defaultReaderBrandCheckException('releaseLock');
        }

        if (this._ownerReadableStream === undefined) {
          return;
        }

        if (this._readRequests.length > 0) {
          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');
        }

        ReadableStreamReaderGenericRelease(this);
      }
    }, {
      key: 'closed',
      get: function get() {
        if (IsReadableStreamDefaultReader(this) === false) {
          return Promise.reject(defaultReaderBrandCheckException('closed'));
        }

        return this._closedPromise;
      }
    }]);

    return ReadableStreamDefaultReader;
  }();

  var ReadableStreamBYOBReader = function () {
    function ReadableStreamBYOBReader(stream) {
      _classCallCheck(this, ReadableStreamBYOBReader);

      if (!IsReadableStream(stream)) {
        throw new TypeError('ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a ' + 'byte source');
      }

      if (IsReadableByteStreamController(stream._readableStreamController) === false) {
        throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + 'source');
      }

      if (IsReadableStreamLocked(stream)) {
        throw new TypeError('This stream has already been locked for exclusive reading by another reader');
      }

      ReadableStreamReaderGenericInitialize(this, stream);
      this._readIntoRequests = [];
    }

    _createClass(ReadableStreamBYOBReader, [{
      key: 'cancel',
      value: function cancel(reason) {
        if (!IsReadableStreamBYOBReader(this)) {
          return Promise.reject(byobReaderBrandCheckException('cancel'));
        }

        if (this._ownerReadableStream === undefined) {
          return Promise.reject(readerLockException('cancel'));
        }

        return ReadableStreamReaderGenericCancel(this, reason);
      }
    }, {
      key: 'read',
      value: function read(view) {
        if (!IsReadableStreamBYOBReader(this)) {
          return Promise.reject(byobReaderBrandCheckException('read'));
        }

        if (this._ownerReadableStream === undefined) {
          return Promise.reject(readerLockException('read from'));
        }

        if (!ArrayBuffer.isView(view)) {
          return Promise.reject(new TypeError('view must be an array buffer view'));
        }

        if (view.byteLength === 0) {
          return Promise.reject(new TypeError('view must have non-zero byteLength'));
        }

        return ReadableStreamBYOBReaderRead(this, view);
      }
    }, {
      key: 'releaseLock',
      value: function releaseLock() {
        if (!IsReadableStreamBYOBReader(this)) {
          throw byobReaderBrandCheckException('releaseLock');
        }

        if (this._ownerReadableStream === undefined) {
          return;
        }

        if (this._readIntoRequests.length > 0) {
          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');
        }

        ReadableStreamReaderGenericRelease(this);
      }
    }, {
      key: 'closed',
      get: function get() {
        if (!IsReadableStreamBYOBReader(this)) {
          return Promise.reject(byobReaderBrandCheckException('closed'));
        }

        return this._closedPromise;
      }
    }]);

    return ReadableStreamBYOBReader;
  }();

  function IsReadableStreamBYOBReader(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) {
      return false;
    }

    return true;
  }

  function IsReadableStreamDefaultReader(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) {
      return false;
    }

    return true;
  }

  function ReadableStreamReaderGenericInitialize(reader, stream) {
    reader._ownerReadableStream = stream;
    stream._reader = reader;

    if (stream._state === 'readable') {
      defaultReaderClosedPromiseInitialize(reader);
    } else if (stream._state === 'closed') {
      defaultReaderClosedPromiseInitializeAsResolved(reader);
    } else {
      assert(stream._state === 'errored', 'state must be errored');
      defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError);

      reader._closedPromise.catch(function () {});
    }
  }

  function ReadableStreamReaderGenericCancel(reader, reason) {
    var stream = reader._ownerReadableStream;
    assert(stream !== undefined);
    return ReadableStreamCancel(stream, reason);
  }

  function ReadableStreamReaderGenericRelease(reader) {
    assert(reader._ownerReadableStream !== undefined);
    assert(reader._ownerReadableStream._reader === reader);

    if (reader._ownerReadableStream._state === 'readable') {
      defaultReaderClosedPromiseReject(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness'));
    } else {
      defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness'));
    }

    reader._closedPromise.catch(function () {});

    reader._ownerReadableStream._reader = undefined;
    reader._ownerReadableStream = undefined;
  }

  function ReadableStreamBYOBReaderRead(reader, view) {
    var stream = reader._ownerReadableStream;
    assert(stream !== undefined);
    stream._disturbed = true;

    if (stream._state === 'errored') {
      return Promise.reject(stream._storedError);
    }

    return ReadableByteStreamControllerPullInto(stream._readableStreamController, view);
  }

  function ReadableStreamDefaultReaderRead(reader) {
    var stream = reader._ownerReadableStream;
    assert(stream !== undefined);
    stream._disturbed = true;

    if (stream._state === 'closed') {
      return Promise.resolve(CreateIterResultObject(undefined, true));
    }

    if (stream._state === 'errored') {
      return Promise.reject(stream._storedError);
    }

    assert(stream._state === 'readable');
    return stream._readableStreamController.__pullSteps();
  }

  var ReadableStreamDefaultController = function () {
    function ReadableStreamDefaultController(stream, underlyingSource, size, highWaterMark) {
      _classCallCheck(this, ReadableStreamDefaultController);

      if (IsReadableStream(stream) === false) {
        throw new TypeError('ReadableStreamDefaultController can only be constructed with a ReadableStream instance');
      }

      if (stream._readableStreamController !== undefined) {
        throw new TypeError('ReadableStreamDefaultController instances can only be created by the ReadableStream constructor');
      }

      this._controlledReadableStream = stream;
      this._underlyingSource = underlyingSource;
      this._queue = undefined;
      this._queueTotalSize = undefined;
      ResetQueue(this);
      this._started = false;
      this._closeRequested = false;
      this._pullAgain = false;
      this._pulling = false;
      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);
      this._strategySize = normalizedStrategy.size;
      this._strategyHWM = normalizedStrategy.highWaterMark;
      var controller = this;
      var startResult = InvokeOrNoop(underlyingSource, 'start', [this]);
      Promise.resolve(startResult).then(function () {
        controller._started = true;
        assert(controller._pulling === false);
        assert(controller._pullAgain === false);
        ReadableStreamDefaultControllerCallPullIfNeeded(controller);
      }, function (r) {
        ReadableStreamDefaultControllerErrorIfNeeded(controller, r);
      }).catch(rethrowAssertionErrorRejection);
    }

    _createClass(ReadableStreamDefaultController, [{
      key: 'close',
      value: function close() {
        if (IsReadableStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('close');
        }

        if (this._closeRequested === true) {
          throw new TypeError('The stream has already been closed; do not close it again!');
        }

        var state = this._controlledReadableStream._state;

        if (state !== 'readable') {
          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');
        }

        ReadableStreamDefaultControllerClose(this);
      }
    }, {
      key: 'enqueue',
      value: function enqueue(chunk) {
        if (IsReadableStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('enqueue');
        }

        if (this._closeRequested === true) {
          throw new TypeError('stream is closed or draining');
        }

        var state = this._controlledReadableStream._state;

        if (state !== 'readable') {
          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');
        }

        return ReadableStreamDefaultControllerEnqueue(this, chunk);
      }
    }, {
      key: 'error',
      value: function error(e) {
        if (IsReadableStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('error');
        }

        var stream = this._controlledReadableStream;

        if (stream._state !== 'readable') {
          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');
        }

        ReadableStreamDefaultControllerError(this, e);
      }
    }, {
      key: '__cancelSteps',
      value: function __cancelSteps(reason) {
        ResetQueue(this);
        return PromiseInvokeOrNoop(this._underlyingSource, 'cancel', [reason]);
      }
    }, {
      key: '__pullSteps',
      value: function __pullSteps() {
        var stream = this._controlledReadableStream;

        if (this._queue.length > 0) {
          var chunk = DequeueValue(this);

          if (this._closeRequested === true && this._queue.length === 0) {
            ReadableStreamClose(stream);
          } else {
            ReadableStreamDefaultControllerCallPullIfNeeded(this);
          }

          return Promise.resolve(CreateIterResultObject(chunk, false));
        }

        var pendingPromise = ReadableStreamAddReadRequest(stream);
        ReadableStreamDefaultControllerCallPullIfNeeded(this);
        return pendingPromise;
      }
    }, {
      key: 'desiredSize',
      get: function get() {
        if (IsReadableStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('desiredSize');
        }

        return ReadableStreamDefaultControllerGetDesiredSize(this);
      }
    }]);

    return ReadableStreamDefaultController;
  }();

  function IsReadableStreamDefaultController(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSource')) {
      return false;
    }

    return true;
  }

  function ReadableStreamDefaultControllerCallPullIfNeeded(controller) {
    var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller);

    if (shouldPull === false) {
      return undefined;
    }

    if (controller._pulling === true) {
      controller._pullAgain = true;
      return undefined;
    }

    assert(controller._pullAgain === false);
    controller._pulling = true;
    var pullPromise = PromiseInvokeOrNoop(controller._underlyingSource, 'pull', [controller]);
    pullPromise.then(function () {
      controller._pulling = false;

      if (controller._pullAgain === true) {
        controller._pullAgain = false;
        return ReadableStreamDefaultControllerCallPullIfNeeded(controller);
      }

      return undefined;
    }, function (e) {
      ReadableStreamDefaultControllerErrorIfNeeded(controller, e);
    }).catch(rethrowAssertionErrorRejection);
    return undefined;
  }

  function ReadableStreamDefaultControllerShouldCallPull(controller) {
    var stream = controller._controlledReadableStream;

    if (stream._state === 'closed' || stream._state === 'errored') {
      return false;
    }

    if (controller._closeRequested === true) {
      return false;
    }

    if (controller._started === false) {
      return false;
    }

    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
      return true;
    }

    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);

    if (desiredSize > 0) {
      return true;
    }

    return false;
  }

  function ReadableStreamDefaultControllerClose(controller) {
    var stream = controller._controlledReadableStream;
    assert(controller._closeRequested === false);
    assert(stream._state === 'readable');
    controller._closeRequested = true;

    if (controller._queue.length === 0) {
      ReadableStreamClose(stream);
    }
  }

  function ReadableStreamDefaultControllerEnqueue(controller, chunk) {
    var stream = controller._controlledReadableStream;
    assert(controller._closeRequested === false);
    assert(stream._state === 'readable');

    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
      ReadableStreamFulfillReadRequest(stream, chunk, false);
    } else {
      var chunkSize = 1;

      if (controller._strategySize !== undefined) {
        var strategySize = controller._strategySize;

        try {
          chunkSize = strategySize(chunk);
        } catch (chunkSizeE) {
          ReadableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);
          throw chunkSizeE;
        }
      }

      try {
        EnqueueValueWithSize(controller, chunk, chunkSize);
      } catch (enqueueE) {
        ReadableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);
        throw enqueueE;
      }
    }

    ReadableStreamDefaultControllerCallPullIfNeeded(controller);
    return undefined;
  }

  function ReadableStreamDefaultControllerError(controller, e) {
    var stream = controller._controlledReadableStream;
    assert(stream._state === 'readable');
    ResetQueue(controller);
    ReadableStreamError(stream, e);
  }

  function ReadableStreamDefaultControllerErrorIfNeeded(controller, e) {
    if (controller._controlledReadableStream._state === 'readable') {
      ReadableStreamDefaultControllerError(controller, e);
    }
  }

  function ReadableStreamDefaultControllerGetDesiredSize(controller) {
    var stream = controller._controlledReadableStream;
    var state = stream._state;

    if (state === 'errored') {
      return null;
    }

    if (state === 'closed') {
      return 0;
    }

    return controller._strategyHWM - controller._queueTotalSize;
  }

  var ReadableStreamBYOBRequest = function () {
    function ReadableStreamBYOBRequest(controller, view) {
      _classCallCheck(this, ReadableStreamBYOBRequest);

      this._associatedReadableByteStreamController = controller;
      this._view = view;
    }

    _createClass(ReadableStreamBYOBRequest, [{
      key: 'respond',
      value: function respond(bytesWritten) {
        if (IsReadableStreamBYOBRequest(this) === false) {
          throw byobRequestBrandCheckException('respond');
        }

        if (this._associatedReadableByteStreamController === undefined) {
          throw new TypeError('This BYOB request has been invalidated');
        }

        ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten);
      }
    }, {
      key: 'respondWithNewView',
      value: function respondWithNewView(view) {
        if (IsReadableStreamBYOBRequest(this) === false) {
          throw byobRequestBrandCheckException('respond');
        }

        if (this._associatedReadableByteStreamController === undefined) {
          throw new TypeError('This BYOB request has been invalidated');
        }

        if (!ArrayBuffer.isView(view)) {
          throw new TypeError('You can only respond with array buffer views');
        }

        ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view);
      }
    }, {
      key: 'view',
      get: function get() {
        return this._view;
      }
    }]);

    return ReadableStreamBYOBRequest;
  }();

  var ReadableByteStreamController = function () {
    function ReadableByteStreamController(stream, underlyingByteSource, highWaterMark) {
      _classCallCheck(this, ReadableByteStreamController);

      if (IsReadableStream(stream) === false) {
        throw new TypeError('ReadableByteStreamController can only be constructed with a ReadableStream instance given ' + 'a byte source');
      }

      if (stream._readableStreamController !== undefined) {
        throw new TypeError('ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte ' + 'source');
      }

      this._controlledReadableStream = stream;
      this._underlyingByteSource = underlyingByteSource;
      this._pullAgain = false;
      this._pulling = false;
      ReadableByteStreamControllerClearPendingPullIntos(this);
      this._queue = this._queueTotalSize = undefined;
      ResetQueue(this);
      this._closeRequested = false;
      this._started = false;
      this._strategyHWM = ValidateAndNormalizeHighWaterMark(highWaterMark);
      var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize;

      if (autoAllocateChunkSize !== undefined) {
        if (Number.isInteger(autoAllocateChunkSize) === false || autoAllocateChunkSize <= 0) {
          throw new RangeError('autoAllocateChunkSize must be a positive integer');
        }
      }

      this._autoAllocateChunkSize = autoAllocateChunkSize;
      this._pendingPullIntos = [];
      var controller = this;
      var startResult = InvokeOrNoop(underlyingByteSource, 'start', [this]);
      Promise.resolve(startResult).then(function () {
        controller._started = true;
        assert(controller._pulling === false);
        assert(controller._pullAgain === false);
        ReadableByteStreamControllerCallPullIfNeeded(controller);
      }, function (r) {
        if (stream._state === 'readable') {
          ReadableByteStreamControllerError(controller, r);
        }
      }).catch(rethrowAssertionErrorRejection);
    }

    _createClass(ReadableByteStreamController, [{
      key: 'close',
      value: function close() {
        if (IsReadableByteStreamController(this) === false) {
          throw byteStreamControllerBrandCheckException('close');
        }

        if (this._closeRequested === true) {
          throw new TypeError('The stream has already been closed; do not close it again!');
        }

        var state = this._controlledReadableStream._state;

        if (state !== 'readable') {
          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');
        }

        ReadableByteStreamControllerClose(this);
      }
    }, {
      key: 'enqueue',
      value: function enqueue(chunk) {
        if (IsReadableByteStreamController(this) === false) {
          throw byteStreamControllerBrandCheckException('enqueue');
        }

        if (this._closeRequested === true) {
          throw new TypeError('stream is closed or draining');
        }

        var state = this._controlledReadableStream._state;

        if (state !== 'readable') {
          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');
        }

        if (!ArrayBuffer.isView(chunk)) {
          throw new TypeError('You can only enqueue array buffer views when using a ReadableByteStreamController');
        }

        ReadableByteStreamControllerEnqueue(this, chunk);
      }
    }, {
      key: 'error',
      value: function error(e) {
        if (IsReadableByteStreamController(this) === false) {
          throw byteStreamControllerBrandCheckException('error');
        }

        var stream = this._controlledReadableStream;

        if (stream._state !== 'readable') {
          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');
        }

        ReadableByteStreamControllerError(this, e);
      }
    }, {
      key: '__cancelSteps',
      value: function __cancelSteps(reason) {
        if (this._pendingPullIntos.length > 0) {
          var firstDescriptor = this._pendingPullIntos[0];
          firstDescriptor.bytesFilled = 0;
        }

        ResetQueue(this);
        return PromiseInvokeOrNoop(this._underlyingByteSource, 'cancel', [reason]);
      }
    }, {
      key: '__pullSteps',
      value: function __pullSteps() {
        var stream = this._controlledReadableStream;
        assert(ReadableStreamHasDefaultReader(stream) === true);

        if (this._queueTotalSize > 0) {
          assert(ReadableStreamGetNumReadRequests(stream) === 0);

          var entry = this._queue.shift();

          this._queueTotalSize -= entry.byteLength;
          ReadableByteStreamControllerHandleQueueDrain(this);
          var view = void 0;

          try {
            view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength);
          } catch (viewE) {
            return Promise.reject(viewE);
          }

          return Promise.resolve(CreateIterResultObject(view, false));
        }

        var autoAllocateChunkSize = this._autoAllocateChunkSize;

        if (autoAllocateChunkSize !== undefined) {
          var buffer = void 0;

          try {
            buffer = new ArrayBuffer(autoAllocateChunkSize);
          } catch (bufferE) {
            return Promise.reject(bufferE);
          }

          var pullIntoDescriptor = {
            buffer: buffer,
            byteOffset: 0,
            byteLength: autoAllocateChunkSize,
            bytesFilled: 0,
            elementSize: 1,
            ctor: Uint8Array,
            readerType: 'default'
          };

          this._pendingPullIntos.push(pullIntoDescriptor);
        }

        var promise = ReadableStreamAddReadRequest(stream);
        ReadableByteStreamControllerCallPullIfNeeded(this);
        return promise;
      }
    }, {
      key: 'byobRequest',
      get: function get() {
        if (IsReadableByteStreamController(this) === false) {
          throw byteStreamControllerBrandCheckException('byobRequest');
        }

        if (this._byobRequest === undefined && this._pendingPullIntos.length > 0) {
          var firstDescriptor = this._pendingPullIntos[0];
          var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled);
          this._byobRequest = new ReadableStreamBYOBRequest(this, view);
        }

        return this._byobRequest;
      }
    }, {
      key: 'desiredSize',
      get: function get() {
        if (IsReadableByteStreamController(this) === false) {
          throw byteStreamControllerBrandCheckException('desiredSize');
        }

        return ReadableByteStreamControllerGetDesiredSize(this);
      }
    }]);

    return ReadableByteStreamController;
  }();

  function IsReadableByteStreamController(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingByteSource')) {
      return false;
    }

    return true;
  }

  function IsReadableStreamBYOBRequest(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) {
      return false;
    }

    return true;
  }

  function ReadableByteStreamControllerCallPullIfNeeded(controller) {
    var shouldPull = ReadableByteStreamControllerShouldCallPull(controller);

    if (shouldPull === false) {
      return undefined;
    }

    if (controller._pulling === true) {
      controller._pullAgain = true;
      return undefined;
    }

    assert(controller._pullAgain === false);
    controller._pulling = true;
    var pullPromise = PromiseInvokeOrNoop(controller._underlyingByteSource, 'pull', [controller]);
    pullPromise.then(function () {
      controller._pulling = false;

      if (controller._pullAgain === true) {
        controller._pullAgain = false;
        ReadableByteStreamControllerCallPullIfNeeded(controller);
      }
    }, function (e) {
      if (controller._controlledReadableStream._state === 'readable') {
        ReadableByteStreamControllerError(controller, e);
      }
    }).catch(rethrowAssertionErrorRejection);
    return undefined;
  }

  function ReadableByteStreamControllerClearPendingPullIntos(controller) {
    ReadableByteStreamControllerInvalidateBYOBRequest(controller);
    controller._pendingPullIntos = [];
  }

  function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) {
    assert(stream._state !== 'errored', 'state must not be errored');
    var done = false;

    if (stream._state === 'closed') {
      assert(pullIntoDescriptor.bytesFilled === 0);
      done = true;
    }

    var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);

    if (pullIntoDescriptor.readerType === 'default') {
      ReadableStreamFulfillReadRequest(stream, filledView, done);
    } else {
      assert(pullIntoDescriptor.readerType === 'byob');
      ReadableStreamFulfillReadIntoRequest(stream, filledView, done);
    }
  }

  function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) {
    var bytesFilled = pullIntoDescriptor.bytesFilled;
    var elementSize = pullIntoDescriptor.elementSize;
    assert(bytesFilled <= pullIntoDescriptor.byteLength);
    assert(bytesFilled % elementSize === 0);
    return new pullIntoDescriptor.ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize);
  }

  function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) {
    controller._queue.push({
      buffer: buffer,
      byteOffset: byteOffset,
      byteLength: byteLength
    });

    controller._queueTotalSize += byteLength;
  }

  function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) {
    var elementSize = pullIntoDescriptor.elementSize;
    var currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize;
    var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled);
    var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy;
    var maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize;
    var totalBytesToCopyRemaining = maxBytesToCopy;
    var ready = false;

    if (maxAlignedBytes > currentAlignedBytes) {
      totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled;
      ready = true;
    }

    var queue = controller._queue;

    while (totalBytesToCopyRemaining > 0) {
      var headOfQueue = queue[0];
      var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength);
      var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
      ArrayBufferCopy(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy);

      if (headOfQueue.byteLength === bytesToCopy) {
        queue.shift();
      } else {
        headOfQueue.byteOffset += bytesToCopy;
        headOfQueue.byteLength -= bytesToCopy;
      }

      controller._queueTotalSize -= bytesToCopy;
      ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor);
      totalBytesToCopyRemaining -= bytesToCopy;
    }

    if (ready === false) {
      assert(controller._queueTotalSize === 0, 'queue must be empty');
      assert(pullIntoDescriptor.bytesFilled > 0);
      assert(pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize);
    }

    return ready;
  }

  function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) {
    assert(controller._pendingPullIntos.length === 0 || controller._pendingPullIntos[0] === pullIntoDescriptor);
    ReadableByteStreamControllerInvalidateBYOBRequest(controller);
    pullIntoDescriptor.bytesFilled += size;
  }

  function ReadableByteStreamControllerHandleQueueDrain(controller) {
    assert(controller._controlledReadableStream._state === 'readable');

    if (controller._queueTotalSize === 0 && controller._closeRequested === true) {
      ReadableStreamClose(controller._controlledReadableStream);
    } else {
      ReadableByteStreamControllerCallPullIfNeeded(controller);
    }
  }

  function ReadableByteStreamControllerInvalidateBYOBRequest(controller) {
    if (controller._byobRequest === undefined) {
      return;
    }

    controller._byobRequest._associatedReadableByteStreamController = undefined;
    controller._byobRequest._view = undefined;
    controller._byobRequest = undefined;
  }

  function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) {
    assert(controller._closeRequested === false);

    while (controller._pendingPullIntos.length > 0) {
      if (controller._queueTotalSize === 0) {
        return;
      }

      var pullIntoDescriptor = controller._pendingPullIntos[0];

      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {
        ReadableByteStreamControllerShiftPendingPullInto(controller);
        ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);
      }
    }
  }

  function ReadableByteStreamControllerPullInto(controller, view) {
    var stream = controller._controlledReadableStream;
    var elementSize = 1;

    if (view.constructor !== DataView) {
      elementSize = view.constructor.BYTES_PER_ELEMENT;
    }

    var ctor = view.constructor;
    var pullIntoDescriptor = {
      buffer: view.buffer,
      byteOffset: view.byteOffset,
      byteLength: view.byteLength,
      bytesFilled: 0,
      elementSize: elementSize,
      ctor: ctor,
      readerType: 'byob'
    };

    if (controller._pendingPullIntos.length > 0) {
      pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);

      controller._pendingPullIntos.push(pullIntoDescriptor);

      return ReadableStreamAddReadIntoRequest(stream);
    }

    if (stream._state === 'closed') {
      var emptyView = new view.constructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0);
      return Promise.resolve(CreateIterResultObject(emptyView, true));
    }

    if (controller._queueTotalSize > 0) {
      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {
        var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);
        ReadableByteStreamControllerHandleQueueDrain(controller);
        return Promise.resolve(CreateIterResultObject(filledView, false));
      }

      if (controller._closeRequested === true) {
        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
        ReadableByteStreamControllerError(controller, e);
        return Promise.reject(e);
      }
    }

    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);

    controller._pendingPullIntos.push(pullIntoDescriptor);

    var promise = ReadableStreamAddReadIntoRequest(stream);
    ReadableByteStreamControllerCallPullIfNeeded(controller);
    return promise;
  }

  function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) {
    firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer);
    assert(firstDescriptor.bytesFilled === 0, 'bytesFilled must be 0');
    var stream = controller._controlledReadableStream;

    if (ReadableStreamHasBYOBReader(stream) === true) {
      while (ReadableStreamGetNumReadIntoRequests(stream) > 0) {
        var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller);
        ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor);
      }
    }
  }

  function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) {
    if (pullIntoDescriptor.bytesFilled + bytesWritten > pullIntoDescriptor.byteLength) {
      throw new RangeError('bytesWritten out of range');
    }

    ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor);

    if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) {
      return;
    }

    ReadableByteStreamControllerShiftPendingPullInto(controller);
    var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize;

    if (remainderSize > 0) {
      var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
      var remainder = pullIntoDescriptor.buffer.slice(end - remainderSize, end);
      ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength);
    }

    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
    pullIntoDescriptor.bytesFilled -= remainderSize;
    ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);
    ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
  }

  function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) {
    var firstDescriptor = controller._pendingPullIntos[0];
    var stream = controller._controlledReadableStream;

    if (stream._state === 'closed') {
      if (bytesWritten !== 0) {
        throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream');
      }

      ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor);
    } else {
      assert(stream._state === 'readable');
      ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor);
    }
  }

  function ReadableByteStreamControllerShiftPendingPullInto(controller) {
    var descriptor = controller._pendingPullIntos.shift();

    ReadableByteStreamControllerInvalidateBYOBRequest(controller);
    return descriptor;
  }

  function ReadableByteStreamControllerShouldCallPull(controller) {
    var stream = controller._controlledReadableStream;

    if (stream._state !== 'readable') {
      return false;
    }

    if (controller._closeRequested === true) {
      return false;
    }

    if (controller._started === false) {
      return false;
    }

    if (ReadableStreamHasDefaultReader(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
      return true;
    }

    if (ReadableStreamHasBYOBReader(stream) === true && ReadableStreamGetNumReadIntoRequests(stream) > 0) {
      return true;
    }

    if (ReadableByteStreamControllerGetDesiredSize(controller) > 0) {
      return true;
    }

    return false;
  }

  function ReadableByteStreamControllerClose(controller) {
    var stream = controller._controlledReadableStream;
    assert(controller._closeRequested === false);
    assert(stream._state === 'readable');

    if (controller._queueTotalSize > 0) {
      controller._closeRequested = true;
      return;
    }

    if (controller._pendingPullIntos.length > 0) {
      var firstPendingPullInto = controller._pendingPullIntos[0];

      if (firstPendingPullInto.bytesFilled > 0) {
        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
        ReadableByteStreamControllerError(controller, e);
        throw e;
      }
    }

    ReadableStreamClose(stream);
  }

  function ReadableByteStreamControllerEnqueue(controller, chunk) {
    var stream = controller._controlledReadableStream;
    assert(controller._closeRequested === false);
    assert(stream._state === 'readable');
    var buffer = chunk.buffer;
    var byteOffset = chunk.byteOffset;
    var byteLength = chunk.byteLength;
    var transferredBuffer = TransferArrayBuffer(buffer);

    if (ReadableStreamHasDefaultReader(stream) === true) {
      if (ReadableStreamGetNumReadRequests(stream) === 0) {
        ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
      } else {
        assert(controller._queue.length === 0);
        var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength);
        ReadableStreamFulfillReadRequest(stream, transferredView, false);
      }
    } else if (ReadableStreamHasBYOBReader(stream) === true) {
      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
      ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
    } else {
      assert(IsReadableStreamLocked(stream) === false, 'stream must not be locked');
      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
    }
  }

  function ReadableByteStreamControllerError(controller, e) {
    var stream = controller._controlledReadableStream;
    assert(stream._state === 'readable');
    ReadableByteStreamControllerClearPendingPullIntos(controller);
    ResetQueue(controller);
    ReadableStreamError(stream, e);
  }

  function ReadableByteStreamControllerGetDesiredSize(controller) {
    var stream = controller._controlledReadableStream;
    var state = stream._state;

    if (state === 'errored') {
      return null;
    }

    if (state === 'closed') {
      return 0;
    }

    return controller._strategyHWM - controller._queueTotalSize;
  }

  function ReadableByteStreamControllerRespond(controller, bytesWritten) {
    bytesWritten = Number(bytesWritten);

    if (IsFiniteNonNegativeNumber(bytesWritten) === false) {
      throw new RangeError('bytesWritten must be a finite');
    }

    assert(controller._pendingPullIntos.length > 0);
    ReadableByteStreamControllerRespondInternal(controller, bytesWritten);
  }

  function ReadableByteStreamControllerRespondWithNewView(controller, view) {
    assert(controller._pendingPullIntos.length > 0);
    var firstDescriptor = controller._pendingPullIntos[0];

    if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) {
      throw new RangeError('The region specified by view does not match byobRequest');
    }

    if (firstDescriptor.byteLength !== view.byteLength) {
      throw new RangeError('The buffer of view has different capacity than byobRequest');
    }

    firstDescriptor.buffer = view.buffer;
    ReadableByteStreamControllerRespondInternal(controller, view.byteLength);
  }

  function streamBrandCheckException(name) {
    return new TypeError('ReadableStream.prototype.' + name + ' can only be used on a ReadableStream');
  }

  function readerLockException(name) {
    return new TypeError('Cannot ' + name + ' a stream using a released reader');
  }

  function defaultReaderBrandCheckException(name) {
    return new TypeError('ReadableStreamDefaultReader.prototype.' + name + ' can only be used on a ReadableStreamDefaultReader');
  }

  function defaultReaderClosedPromiseInitialize(reader) {
    reader._closedPromise = new Promise(function (resolve, reject) {
      reader._closedPromise_resolve = resolve;
      reader._closedPromise_reject = reject;
    });
  }

  function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) {
    reader._closedPromise = Promise.reject(reason);
    reader._closedPromise_resolve = undefined;
    reader._closedPromise_reject = undefined;
  }

  function defaultReaderClosedPromiseInitializeAsResolved(reader) {
    reader._closedPromise = Promise.resolve(undefined);
    reader._closedPromise_resolve = undefined;
    reader._closedPromise_reject = undefined;
  }

  function defaultReaderClosedPromiseReject(reader, reason) {
    assert(reader._closedPromise_resolve !== undefined);
    assert(reader._closedPromise_reject !== undefined);

    reader._closedPromise_reject(reason);

    reader._closedPromise_resolve = undefined;
    reader._closedPromise_reject = undefined;
  }

  function defaultReaderClosedPromiseResetToRejected(reader, reason) {
    assert(reader._closedPromise_resolve === undefined);
    assert(reader._closedPromise_reject === undefined);
    reader._closedPromise = Promise.reject(reason);
  }

  function defaultReaderClosedPromiseResolve(reader) {
    assert(reader._closedPromise_resolve !== undefined);
    assert(reader._closedPromise_reject !== undefined);

    reader._closedPromise_resolve(undefined);

    reader._closedPromise_resolve = undefined;
    reader._closedPromise_reject = undefined;
  }

  function byobReaderBrandCheckException(name) {
    return new TypeError('ReadableStreamBYOBReader.prototype.' + name + ' can only be used on a ReadableStreamBYOBReader');
  }

  function defaultControllerBrandCheckException(name) {
    return new TypeError('ReadableStreamDefaultController.prototype.' + name + ' can only be used on a ReadableStreamDefaultController');
  }

  function byobRequestBrandCheckException(name) {
    return new TypeError('ReadableStreamBYOBRequest.prototype.' + name + ' can only be used on a ReadableStreamBYOBRequest');
  }

  function byteStreamControllerBrandCheckException(name) {
    return new TypeError('ReadableByteStreamController.prototype.' + name + ' can only be used on a ReadableByteStreamController');
  }

  function ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise) {
    try {
      Promise.prototype.then.call(promise, undefined, function () {});
    } catch (e) {}
  }
}, function (module, exports, __w_pdfjs_require__) {
  "use strict";

  var transformStream = __w_pdfjs_require__(6);

  var readableStream = __w_pdfjs_require__(4);

  var writableStream = __w_pdfjs_require__(2);

  exports.TransformStream = transformStream.TransformStream;
  exports.ReadableStream = readableStream.ReadableStream;
  exports.IsReadableStreamDisturbed = readableStream.IsReadableStreamDisturbed;
  exports.ReadableStreamDefaultControllerClose = readableStream.ReadableStreamDefaultControllerClose;
  exports.ReadableStreamDefaultControllerEnqueue = readableStream.ReadableStreamDefaultControllerEnqueue;
  exports.ReadableStreamDefaultControllerError = readableStream.ReadableStreamDefaultControllerError;
  exports.ReadableStreamDefaultControllerGetDesiredSize = readableStream.ReadableStreamDefaultControllerGetDesiredSize;
  exports.AcquireWritableStreamDefaultWriter = writableStream.AcquireWritableStreamDefaultWriter;
  exports.IsWritableStream = writableStream.IsWritableStream;
  exports.IsWritableStreamLocked = writableStream.IsWritableStreamLocked;
  exports.WritableStream = writableStream.WritableStream;
  exports.WritableStreamAbort = writableStream.WritableStreamAbort;
  exports.WritableStreamDefaultControllerError = writableStream.WritableStreamDefaultControllerError;
  exports.WritableStreamDefaultWriterCloseWithErrorPropagation = writableStream.WritableStreamDefaultWriterCloseWithErrorPropagation;
  exports.WritableStreamDefaultWriterRelease = writableStream.WritableStreamDefaultWriterRelease;
  exports.WritableStreamDefaultWriterWrite = writableStream.WritableStreamDefaultWriterWrite;
}, function (module, exports, __w_pdfjs_require__) {
  "use strict";

  var _createClass = function () {
    function defineProperties(target, props) {
      for (var i = 0; i < props.length; i++) {
        var descriptor = props[i];
        descriptor.enumerable = descriptor.enumerable || false;
        descriptor.configurable = true;
        if ("value" in descriptor) descriptor.writable = true;
        Object.defineProperty(target, descriptor.key, descriptor);
      }
    }

    return function (Constructor, protoProps, staticProps) {
      if (protoProps) defineProperties(Constructor.prototype, protoProps);
      if (staticProps) defineProperties(Constructor, staticProps);
      return Constructor;
    };
  }();

  function _classCallCheck(instance, Constructor) {
    if (!(instance instanceof Constructor)) {
      throw new TypeError("Cannot call a class as a function");
    }
  }

  var _require = __w_pdfjs_require__(1),
      assert = _require.assert;

  var _require2 = __w_pdfjs_require__(0),
      InvokeOrNoop = _require2.InvokeOrNoop,
      PromiseInvokeOrPerformFallback = _require2.PromiseInvokeOrPerformFallback,
      PromiseInvokeOrNoop = _require2.PromiseInvokeOrNoop,
      typeIsObject = _require2.typeIsObject;

  var _require3 = __w_pdfjs_require__(4),
      ReadableStream = _require3.ReadableStream,
      ReadableStreamDefaultControllerClose = _require3.ReadableStreamDefaultControllerClose,
      ReadableStreamDefaultControllerEnqueue = _require3.ReadableStreamDefaultControllerEnqueue,
      ReadableStreamDefaultControllerError = _require3.ReadableStreamDefaultControllerError,
      ReadableStreamDefaultControllerGetDesiredSize = _require3.ReadableStreamDefaultControllerGetDesiredSize;

  var _require4 = __w_pdfjs_require__(2),
      WritableStream = _require4.WritableStream,
      WritableStreamDefaultControllerError = _require4.WritableStreamDefaultControllerError;

  function TransformStreamCloseReadable(transformStream) {
    if (transformStream._errored === true) {
      throw new TypeError('TransformStream is already errored');
    }

    if (transformStream._readableClosed === true) {
      throw new TypeError('Readable side is already closed');
    }

    TransformStreamCloseReadableInternal(transformStream);
  }

  function TransformStreamEnqueueToReadable(transformStream, chunk) {
    if (transformStream._errored === true) {
      throw new TypeError('TransformStream is already errored');
    }

    if (transformStream._readableClosed === true) {
      throw new TypeError('Readable side is already closed');
    }

    var controller = transformStream._readableController;

    try {
      ReadableStreamDefaultControllerEnqueue(controller, chunk);
    } catch (e) {
      transformStream._readableClosed = true;
      TransformStreamErrorIfNeeded(transformStream, e);
      throw transformStream._storedError;
    }

    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);
    var maybeBackpressure = desiredSize <= 0;

    if (maybeBackpressure === true && transformStream._backpressure === false) {
      TransformStreamSetBackpressure(transformStream, true);
    }
  }

  function TransformStreamError(transformStream, e) {
    if (transformStream._errored === true) {
      throw new TypeError('TransformStream is already errored');
    }

    TransformStreamErrorInternal(transformStream, e);
  }

  function TransformStreamCloseReadableInternal(transformStream) {
    assert(transformStream._errored === false);
    assert(transformStream._readableClosed === false);

    try {
      ReadableStreamDefaultControllerClose(transformStream._readableController);
    } catch (e) {
      assert(false);
    }

    transformStream._readableClosed = true;
  }

  function TransformStreamErrorIfNeeded(transformStream, e) {
    if (transformStream._errored === false) {
      TransformStreamErrorInternal(transformStream, e);
    }
  }

  function TransformStreamErrorInternal(transformStream, e) {
    assert(transformStream._errored === false);
    transformStream._errored = true;
    transformStream._storedError = e;

    if (transformStream._writableDone === false) {
      WritableStreamDefaultControllerError(transformStream._writableController, e);
    }

    if (transformStream._readableClosed === false) {
      ReadableStreamDefaultControllerError(transformStream._readableController, e);
    }
  }

  function TransformStreamReadableReadyPromise(transformStream) {
    assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');

    if (transformStream._backpressure === false) {
      return Promise.resolve();
    }

    assert(transformStream._backpressure === true, '_backpressure should have been initialized');
    return transformStream._backpressureChangePromise;
  }

  function TransformStreamSetBackpressure(transformStream, backpressure) {
    assert(transformStream._backpressure !== backpressure, 'TransformStreamSetBackpressure() should be called only when backpressure is changed');

    if (transformStream._backpressureChangePromise !== undefined) {
      transformStream._backpressureChangePromise_resolve(backpressure);
    }

    transformStream._backpressureChangePromise = new Promise(function (resolve) {
      transformStream._backpressureChangePromise_resolve = resolve;
    });

    transformStream._backpressureChangePromise.then(function (resolution) {
      assert(resolution !== backpressure, '_backpressureChangePromise should be fulfilled only when backpressure is changed');
    });

    transformStream._backpressure = backpressure;
  }

  function TransformStreamDefaultTransform(chunk, transformStreamController) {
    var transformStream = transformStreamController._controlledTransformStream;
    TransformStreamEnqueueToReadable(transformStream, chunk);
    return Promise.resolve();
  }

  function TransformStreamTransform(transformStream, chunk) {
    assert(transformStream._errored === false);
    assert(transformStream._transforming === false);
    assert(transformStream._backpressure === false);
    transformStream._transforming = true;
    var transformer = transformStream._transformer;
    var controller = transformStream._transformStreamController;
    var transformPromise = PromiseInvokeOrPerformFallback(transformer, 'transform', [chunk, controller], TransformStreamDefaultTransform, [chunk, controller]);
    return transformPromise.then(function () {
      transformStream._transforming = false;
      return TransformStreamReadableReadyPromise(transformStream);
    }, function (e) {
      TransformStreamErrorIfNeeded(transformStream, e);
      return Promise.reject(e);
    });
  }

  function IsTransformStreamDefaultController(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) {
      return false;
    }

    return true;
  }

  function IsTransformStream(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) {
      return false;
    }

    return true;
  }

  var TransformStreamSink = function () {
    function TransformStreamSink(transformStream, startPromise) {
      _classCallCheck(this, TransformStreamSink);

      this._transformStream = transformStream;
      this._startPromise = startPromise;
    }

    _createClass(TransformStreamSink, [{
      key: 'start',
      value: function start(c) {
        var transformStream = this._transformStream;
        transformStream._writableController = c;
        return this._startPromise.then(function () {
          return TransformStreamReadableReadyPromise(transformStream);
        });
      }
    }, {
      key: 'write',
      value: function write(chunk) {
        var transformStream = this._transformStream;
        return TransformStreamTransform(transformStream, chunk);
      }
    }, {
      key: 'abort',
      value: function abort() {
        var transformStream = this._transformStream;
        transformStream._writableDone = true;
        TransformStreamErrorInternal(transformStream, new TypeError('Writable side aborted'));
      }
    }, {
      key: 'close',
      value: function close() {
        var transformStream = this._transformStream;
        assert(transformStream._transforming === false);
        transformStream._writableDone = true;
        var flushPromise = PromiseInvokeOrNoop(transformStream._transformer, 'flush', [transformStream._transformStreamController]);
        return flushPromise.then(function () {
          if (transformStream._errored === true) {
            return Promise.reject(transformStream._storedError);
          }

          if (transformStream._readableClosed === false) {
            TransformStreamCloseReadableInternal(transformStream);
          }

          return Promise.resolve();
        }).catch(function (r) {
          TransformStreamErrorIfNeeded(transformStream, r);
          return Promise.reject(transformStream._storedError);
        });
      }
    }]);

    return TransformStreamSink;
  }();

  var TransformStreamSource = function () {
    function TransformStreamSource(transformStream, startPromise) {
      _classCallCheck(this, TransformStreamSource);

      this._transformStream = transformStream;
      this._startPromise = startPromise;
    }

    _createClass(TransformStreamSource, [{
      key: 'start',
      value: function start(c) {
        var transformStream = this._transformStream;
        transformStream._readableController = c;
        return this._startPromise.then(function () {
          assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');

          if (transformStream._backpressure === true) {
            return Promise.resolve();
          }

          assert(transformStream._backpressure === false, '_backpressure should have been initialized');
          return transformStream._backpressureChangePromise;
        });
      }
    }, {
      key: 'pull',
      value: function pull() {
        var transformStream = this._transformStream;
        assert(transformStream._backpressure === true, 'pull() should be never called while _backpressure is false');
        assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
        TransformStreamSetBackpressure(transformStream, false);
        return transformStream._backpressureChangePromise;
      }
    }, {
      key: 'cancel',
      value: function cancel() {
        var transformStream = this._transformStream;
        transformStream._readableClosed = true;
        TransformStreamErrorInternal(transformStream, new TypeError('Readable side canceled'));
      }
    }]);

    return TransformStreamSource;
  }();

  var TransformStreamDefaultController = function () {
    function TransformStreamDefaultController(transformStream) {
      _classCallCheck(this, TransformStreamDefaultController);

      if (IsTransformStream(transformStream) === false) {
        throw new TypeError('TransformStreamDefaultController can only be ' + 'constructed with a TransformStream instance');
      }

      if (transformStream._transformStreamController !== undefined) {
        throw new TypeError('TransformStreamDefaultController instances can ' + 'only be created by the TransformStream constructor');
      }

      this._controlledTransformStream = transformStream;
    }

    _createClass(TransformStreamDefaultController, [{
      key: 'enqueue',
      value: function enqueue(chunk) {
        if (IsTransformStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('enqueue');
        }

        TransformStreamEnqueueToReadable(this._controlledTransformStream, chunk);
      }
    }, {
      key: 'close',
      value: function close() {
        if (IsTransformStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('close');
        }

        TransformStreamCloseReadable(this._controlledTransformStream);
      }
    }, {
      key: 'error',
      value: function error(reason) {
        if (IsTransformStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('error');
        }

        TransformStreamError(this._controlledTransformStream, reason);
      }
    }, {
      key: 'desiredSize',
      get: function get() {
        if (IsTransformStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('desiredSize');
        }

        var transformStream = this._controlledTransformStream;
        var readableController = transformStream._readableController;
        return ReadableStreamDefaultControllerGetDesiredSize(readableController);
      }
    }]);

    return TransformStreamDefaultController;
  }();

  var TransformStream = function () {
    function TransformStream() {
      var transformer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

      _classCallCheck(this, TransformStream);

      this._transformer = transformer;
      var readableStrategy = transformer.readableStrategy,
          writableStrategy = transformer.writableStrategy;
      this._transforming = false;
      this._errored = false;
      this._storedError = undefined;
      this._writableController = undefined;
      this._readableController = undefined;
      this._transformStreamController = undefined;
      this._writableDone = false;
      this._readableClosed = false;
      this._backpressure = undefined;
      this._backpressureChangePromise = undefined;
      this._backpressureChangePromise_resolve = undefined;
      this._transformStreamController = new TransformStreamDefaultController(this);
      var startPromise_resolve = void 0;
      var startPromise = new Promise(function (resolve) {
        startPromise_resolve = resolve;
      });
      var source = new TransformStreamSource(this, startPromise);
      this._readable = new ReadableStream(source, readableStrategy);
      var sink = new TransformStreamSink(this, startPromise);
      this._writable = new WritableStream(sink, writableStrategy);
      assert(this._writableController !== undefined);
      assert(this._readableController !== undefined);
      var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(this._readableController);
      TransformStreamSetBackpressure(this, desiredSize <= 0);
      var transformStream = this;
      var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]);
      startPromise_resolve(startResult);
      startPromise.catch(function (e) {
        if (transformStream._errored === false) {
          transformStream._errored = true;
          transformStream._storedError = e;
        }
      });
    }

    _createClass(TransformStream, [{
      key: 'readable',
      get: function get() {
        if (IsTransformStream(this) === false) {
          throw streamBrandCheckException('readable');
        }

        return this._readable;
      }
    }, {
      key: 'writable',
      get: function get() {
        if (IsTransformStream(this) === false) {
          throw streamBrandCheckException('writable');
        }

        return this._writable;
      }
    }]);

    return TransformStream;
  }();

  module.exports = {
    TransformStream: TransformStream
  };

  function defaultControllerBrandCheckException(name) {
    return new TypeError('TransformStreamDefaultController.prototype.' + name + ' can only be used on a TransformStreamDefaultController');
  }

  function streamBrandCheckException(name) {
    return new TypeError('TransformStream.prototype.' + name + ' can only be used on a TransformStream');
  }
}, function (module, exports, __w_pdfjs_require__) {
  module.exports = __w_pdfjs_require__(5);
}]));

/***/ }),
/* 144 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

{
  var isURLSupported = 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';
      isURLSupported = u.href === 'http://a/c%20d';
    }
  } catch (ex) {}

  if (isURLSupported) {
    exports.URL = URL;
  } else {
    var PolyfillURL = __w_pdfjs_require__(145).URL;

    var OriginalURL = __w_pdfjs_require__(3).URL;

    if (OriginalURL) {
      PolyfillURL.createObjectURL = function (blob) {
        return OriginalURL.createObjectURL.apply(OriginalURL, arguments);
      };

      PolyfillURL.revokeObjectURL = function (url) {
        OriginalURL.revokeObjectURL(url);
      };
    }

    exports.URL = PolyfillURL;
  }
}

/***/ }),
/* 145 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


(function URLConstructorClosure() {
  'use strict';

  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);
    }

    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) {
    var unicode = c.charCodeAt(0);

    if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) === -1) {
      return c;
    }

    return encodeURIComponent(c);
  }

  var EOF,
      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();
            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();
          } else if (c === ':') {
            this._scheme = buffer;
            buffer = '';

            if (stateOverride) {
              break loop;
            }

            if (isRelativeScheme(this._scheme)) {
              this._isRelative = true;
            }

            if (this._scheme === 'file') {
              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 (c === EOF) {
            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 {
            if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
              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 (this._scheme !== 'file') {
            this._scheme = base._scheme;
          }

          if (c === EOF) {
            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 (this._scheme !== 'file' || !ALPHA.test(c) || nextC !== ':' && nextC !== '|' || nextNextC !== EOF && 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 (this._scheme === 'file') {
              state = 'file host';
            } else {
              state = 'authority ignore slashes';
            }
          } else {
            if (this._scheme !== 'file') {
              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 (cp === '\t' || cp === '\n' || cp === '\r') {
                err('Invalid whitespace in authority.');
                continue;
              }

              if (cp === ':' && this._password === null) {
                this._password = '';
                continue;
              }

              var tempC = percentEscape(cp);

              if (this._password !== null) {
                this._password += tempC;
              } else {
                this._username += tempC;
              }
            }

            buffer = '';
          } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') {
            cursor -= buffer.length;
            buffer = '';
            state = 'host';
            continue;
          } else {
            buffer += c;
          }

          break;

        case 'file host':
          if (c === EOF || 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 (c === '\t' || c === '\n' || c === '\r') {
            err('Invalid whitespace in file host.');
          } else {
            buffer += c;
          }

          break;

        case 'host':
        case 'hostname':
          if (c === ':' && !seenBracket) {
            this._host = IDNAToASCII.call(this, buffer);
            buffer = '';
            state = 'port';

            if (stateOverride === 'hostname') {
              break loop;
            }
          } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') {
            this._host = IDNAToASCII.call(this, buffer);
            buffer = '';
            state = 'relative path start';

            if (stateOverride) {
              break loop;
            }

            continue;
          } else if (c !== '\t' && c !== '\n' && c !== '\r') {
            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 (c === EOF || 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 (c === '\t' || c === '\n' || c === '\r') {
            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 (c === EOF || 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 (this._scheme === 'file' && 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 (c !== '\t' && c !== '\n' && c !== '\r') {
            buffer += percentEscape(c);
          }

          break;

        case 'query':
          if (!stateOverride && c === '#') {
            this._fragment = '#';
            state = 'fragment';
          } else if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
            this._query += percentEscapeQuery(c);
          }

          break;

        case 'fragment':
          if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
            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;
  }

  function JURL(url, base) {
    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, '');
    parse.call(this, input, null, base);
  }

  JURL.prototype = {
    toString: function toString() {
      return this.href;
    },

    get href() {
      if (this._isInvalid) {
        return this._url;
      }

      var authority = '';

      if (this._username !== '' || this._password !== null) {
        authority = this._username + (this._password !== null ? ':' + this._password : '') + '@';
      }

      return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment;
    },

    set href(value) {
      clear.call(this);
      parse.call(this, value);
    },

    get protocol() {
      return this._scheme + ':';
    },

    set protocol(value) {
      if (this._isInvalid) {
        return;
      }

      parse.call(this, value + ':', 'scheme start');
    },

    get host() {
      return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host;
    },

    set host(value) {
      if (this._isInvalid || !this._isRelative) {
        return;
      }

      parse.call(this, value, 'host');
    },

    get hostname() {
      return this._host;
    },

    set hostname(value) {
      if (this._isInvalid || !this._isRelative) {
        return;
      }

      parse.call(this, value, 'hostname');
    },

    get port() {
      return this._port;
    },

    set port(value) {
      if (this._isInvalid || !this._isRelative) {
        return;
      }

      parse.call(this, value, 'port');
    },

    get pathname() {
      return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData;
    },

    set pathname(value) {
      if (this._isInvalid || !this._isRelative) {
        return;
      }

      this._path = [];
      parse.call(this, value, 'relative path start');
    },

    get search() {
      return this._isInvalid || !this._query || this._query === '?' ? '' : this._query;
    },

    set search(value) {
      if (this._isInvalid || !this._isRelative) {
        return;
      }

      this._query = '?';

      if (value[0] === '?') {
        value = value.slice(1);
      }

      parse.call(this, value, 'query');
    },

    get hash() {
      return this._isInvalid || !this._fragment || this._fragment === '#' ? '' : this._fragment;
    },

    set hash(value) {
      if (this._isInvalid) {
        return;
      }

      this._fragment = '#';

      if (value[0] === '#') {
        value = value.slice(1);
      }

      parse.call(this, value, 'fragment');
    },

    get origin() {
      var host;

      if (this._isInvalid || !this._scheme) {
        return '';
      }

      switch (this._scheme) {
        case 'data':
        case 'file':
        case 'javascript':
        case 'mailto':
          return 'null';

        case 'blob':
          try {
            return new JURL(this._schemeData).origin || 'null';
          } catch (_) {}

          return 'null';
      }

      host = this.host;

      if (!host) {
        return '';
      }

      return this._scheme + '://' + host;
    }

  };
  exports.URL = JURL;
})();

/***/ }),
/* 146 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getDocument = getDocument;
exports.setPDFNetworkStreamFactory = setPDFNetworkStreamFactory;
exports.build = exports.version = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFWorker = exports.PDFDataRangeTransport = exports.LoopbackPort = void 0;

var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147));

var _util = __w_pdfjs_require__(1);

var _dom_utils = __w_pdfjs_require__(151);

var _font_loader = __w_pdfjs_require__(152);

var _api_compatibility = __w_pdfjs_require__(153);

var _canvas = __w_pdfjs_require__(154);

var _global_scope = _interopRequireDefault(__w_pdfjs_require__(3));

var _worker_options = __w_pdfjs_require__(156);

var _message_handler = __w_pdfjs_require__(157);

var _metadata = __w_pdfjs_require__(158);

var _transport_stream = __w_pdfjs_require__(160);

var _webgl = __w_pdfjs_require__(161);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var DEFAULT_RANGE_CHUNK_SIZE = 65536;
var isWorkerDisabled = false;
var fallbackWorkerSrc;
var fakeWorkerFilesLoader = null;
{
  var useRequireEnsure = false;

  if (typeof window === 'undefined') {
    isWorkerDisabled = true;

    if (typeof require.ensure === 'undefined') {
      require.ensure = require('node-ensure');
    }

    useRequireEnsure = true;
  } else if (typeof require !== 'undefined' && typeof require.ensure === 'function') {
    useRequireEnsure = true;
  }

  if (typeof requirejs !== 'undefined' && requirejs.toUrl) {
    fallbackWorkerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js');
  }

  var dynamicLoaderSupported = typeof requirejs !== 'undefined' && requirejs.load;
  fakeWorkerFilesLoader = useRequireEnsure ? function () {
    return new Promise(function (resolve, reject) {
      require.ensure([], function () {
        try {
          var worker;
          worker = require('./pdf.worker.js');
          resolve(worker.WorkerMessageHandler);
        } catch (ex) {
          reject(ex);
        }
      }, reject, 'pdfjsWorker');
    });
  } : dynamicLoaderSupported ? function () {
    return new Promise(function (resolve, reject) {
      requirejs(['pdfjs-dist/build/pdf.worker'], function (worker) {
        try {
          resolve(worker.WorkerMessageHandler);
        } catch (ex) {
          reject(ex);
        }
      }, reject);
    });
  } : null;

  if (!fallbackWorkerSrc && (typeof document === "undefined" ? "undefined" : _typeof(document)) === 'object' && 'currentScript' in document) {
    var pdfjsFilePath = document.currentScript && document.currentScript.src;

    if (pdfjsFilePath) {
      fallbackWorkerSrc = pdfjsFilePath.replace(/(\.(?:min\.)?js)(\?.*)?$/i, '.worker$1$2');
    }
  }
}
var createPDFNetworkStream;

function setPDFNetworkStreamFactory(pdfNetworkStreamFactory) {
  createPDFNetworkStream = pdfNetworkStreamFactory;
}

function getDocument(src) {
  var task = new PDFDocumentLoadingTask();
  var source;

  if (typeof src === 'string') {
    source = {
      url: src
    };
  } else if ((0, _util.isArrayBuffer)(src)) {
    source = {
      data: src
    };
  } else if (src instanceof PDFDataRangeTransport) {
    source = {
      range: src
    };
  } else {
    if (_typeof(src) !== 'object') {
      throw new Error('Invalid parameter in getDocument, ' + 'need either Uint8Array, string or a parameter object');
    }

    if (!src.url && !src.data && !src.range) {
      throw new Error('Invalid parameter object: need either .data, .range or .url');
    }

    source = src;
  }

  var params = Object.create(null);
  var rangeTransport = null,
      worker = null;

  for (var key in source) {
    if (key === 'url' && typeof window !== 'undefined') {
      params[key] = new _util.URL(source[key], window.location).href;
      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)) {
      var pdfBytes = source[key];

      if (typeof pdfBytes === 'string') {
        params[key] = (0, _util.stringToBytes)(pdfBytes);
      } else if (_typeof(pdfBytes) === 'object' && pdfBytes !== null && !isNaN(pdfBytes.length)) {
        params[key] = new Uint8Array(pdfBytes);
      } else if ((0, _util.isArrayBuffer)(pdfBytes)) {
        params[key] = new Uint8Array(pdfBytes);
      } else {
        throw new 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;
  params.CMapReaderFactory = params.CMapReaderFactory || _dom_utils.DOMCMapReaderFactory;
  params.ignoreErrors = params.stopAtErrors !== true;
  params.pdfBug = params.pdfBug === true;
  var NativeImageDecoderValues = Object.values(_util.NativeImageDecoding);

  if (params.nativeImageDecoderSupport === undefined || !NativeImageDecoderValues.includes(params.nativeImageDecoderSupport)) {
    params.nativeImageDecoderSupport = _api_compatibility.apiCompatibilityParams.nativeImageDecoderSupport || _util.NativeImageDecoding.DECODE;
  }

  if (!Number.isInteger(params.maxImageSize)) {
    params.maxImageSize = -1;
  }

  if (typeof params.isEvalSupported !== 'boolean') {
    params.isEvalSupported = true;
  }

  if (typeof params.disableFontFace !== 'boolean') {
    params.disableFontFace = _api_compatibility.apiCompatibilityParams.disableFontFace || false;
  }

  if (typeof params.disableRange !== 'boolean') {
    params.disableRange = false;
  }

  if (typeof params.disableStream !== 'boolean') {
    params.disableStream = false;
  }

  if (typeof params.disableAutoFetch !== 'boolean') {
    params.disableAutoFetch = false;
  }

  if (typeof params.disableCreateObjectURL !== 'boolean') {
    params.disableCreateObjectURL = _api_compatibility.apiCompatibilityParams.disableCreateObjectURL || false;
  }

  (0, _util.setVerbosityLevel)(params.verbosity);

  if (!worker) {
    var workerParams = {
      postMessageTransfers: params.postMessageTransfers,
      verbosity: params.verbosity,
      port: _worker_options.GlobalWorkerOptions.workerPort
    };
    worker = workerParams.port ? PDFWorker.fromPort(workerParams) : new PDFWorker(workerParams);
    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 networkStream;

      if (rangeTransport) {
        networkStream = new _transport_stream.PDFDataTransportStream({
          length: params.length,
          initialData: params.initialData,
          disableRange: params.disableRange,
          disableStream: params.disableStream
        }, rangeTransport);
      } else if (!params.data) {
        networkStream = createPDFNetworkStream({
          url: params.url,
          length: params.length,
          httpHeaders: params.httpHeaders,
          withCredentials: params.withCredentials,
          rangeChunkSize: params.rangeChunkSize,
          disableRange: params.disableRange,
          disableStream: params.disableStream
        });
      }

      var messageHandler = new _message_handler.MessageHandler(docId, workerId, worker.port);
      messageHandler.postMessageTransfers = worker.postMessageTransfers;
      var transport = new WorkerTransport(messageHandler, task, networkStream, params);
      task._transport = transport;
      messageHandler.send('Ready', null);
    });
  }).catch(task._capability.reject);
  return task;
}

function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
  if (worker.destroyed) {
    return Promise.reject(new Error('Worker was destroyed'));
  }

  if (pdfDataRangeTransport) {
    source.length = pdfDataRangeTransport.length;
    source.initialData = pdfDataRangeTransport.initialData;
  }

  return worker.messageHandler.sendWithPromise('GetDocRequest', {
    docId: docId,
    apiVersion: '2.1.266',
    source: {
      data: source.data,
      url: source.url,
      password: source.password,
      disableAutoFetch: source.disableAutoFetch,
      rangeChunkSize: source.rangeChunkSize,
      length: source.length
    },
    maxImageSize: source.maxImageSize,
    disableFontFace: source.disableFontFace,
    disableCreateObjectURL: source.disableCreateObjectURL,
    postMessageTransfers: worker.postMessageTransfers,
    docBaseUrl: source.docBaseUrl,
    nativeImageDecoderSupport: source.nativeImageDecoderSupport,
    ignoreErrors: source.ignoreErrors,
    isEvalSupported: source.isEvalSupported
  }).then(function (workerId) {
    if (worker.destroyed) {
      throw new Error('Worker was destroyed');
    }

    return workerId;
  });
}

var PDFDocumentLoadingTask = function PDFDocumentLoadingTaskClosure() {
  var nextDocumentId = 0;

  var PDFDocumentLoadingTask =
  /*#__PURE__*/
  function () {
    function PDFDocumentLoadingTask() {
      _classCallCheck(this, PDFDocumentLoadingTask);

      this._capability = (0, _util.createPromiseCapability)();
      this._transport = null;
      this._worker = null;
      this.docId = 'd' + nextDocumentId++;
      this.destroyed = false;
      this.onPassword = null;
      this.onProgress = null;
      this.onUnsupportedFeature = null;
    }

    _createClass(PDFDocumentLoadingTask, [{
      key: "destroy",
      value: function destroy() {
        var _this = this;

        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;
          }
        });
      }
    }, {
      key: "then",
      value: function then(onFulfilled, onRejected) {
        (0, _util.deprecated)('PDFDocumentLoadingTask.then method, ' + 'use the `promise` getter instead.');
        return this.promise.then.apply(this.promise, arguments);
      }
    }, {
      key: "promise",
      get: function get() {
        return this._capability.promise;
      }
    }]);

    return PDFDocumentLoadingTask;
  }();

  return PDFDocumentLoadingTask;
}();

var PDFDataRangeTransport =
/*#__PURE__*/
function () {
  function PDFDataRangeTransport(length, initialData) {
    _classCallCheck(this, PDFDataRangeTransport);

    this.length = length;
    this.initialData = initialData;
    this._rangeListeners = [];
    this._progressListeners = [];
    this._progressiveReadListeners = [];
    this._readyCapability = (0, _util.createPromiseCapability)();
  }

  _createClass(PDFDataRangeTransport, [{
    key: "addRangeListener",
    value: function addRangeListener(listener) {
      this._rangeListeners.push(listener);
    }
  }, {
    key: "addProgressListener",
    value: function addProgressListener(listener) {
      this._progressListeners.push(listener);
    }
  }, {
    key: "addProgressiveReadListener",
    value: function addProgressiveReadListener(listener) {
      this._progressiveReadListeners.push(listener);
    }
  }, {
    key: "onDataRange",
    value: function onDataRange(begin, chunk) {
      var _iteratorNormalCompletion = true;
      var _didIteratorError = false;
      var _iteratorError = undefined;

      try {
        for (var _iterator = this._rangeListeners[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
          var listener = _step.value;
          listener(begin, chunk);
        }
      } catch (err) {
        _didIteratorError = true;
        _iteratorError = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion && _iterator.return != null) {
            _iterator.return();
          }
        } finally {
          if (_didIteratorError) {
            throw _iteratorError;
          }
        }
      }
    }
  }, {
    key: "onDataProgress",
    value: function onDataProgress(loaded) {
      var _this2 = this;

      this._readyCapability.promise.then(function () {
        var _iteratorNormalCompletion2 = true;
        var _didIteratorError2 = false;
        var _iteratorError2 = undefined;

        try {
          for (var _iterator2 = _this2._progressListeners[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
            var listener = _step2.value;
            listener(loaded);
          }
        } catch (err) {
          _didIteratorError2 = true;
          _iteratorError2 = err;
        } finally {
          try {
            if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
              _iterator2.return();
            }
          } finally {
            if (_didIteratorError2) {
              throw _iteratorError2;
            }
          }
        }
      });
    }
  }, {
    key: "onDataProgressiveRead",
    value: function onDataProgressiveRead(chunk) {
      var _this3 = this;

      this._readyCapability.promise.then(function () {
        var _iteratorNormalCompletion3 = true;
        var _didIteratorError3 = false;
        var _iteratorError3 = undefined;

        try {
          for (var _iterator3 = _this3._progressiveReadListeners[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
            var listener = _step3.value;
            listener(chunk);
          }
        } catch (err) {
          _didIteratorError3 = true;
          _iteratorError3 = err;
        } finally {
          try {
            if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
              _iterator3.return();
            }
          } finally {
            if (_didIteratorError3) {
              throw _iteratorError3;
            }
          }
        }
      });
    }
  }, {
    key: "transportReady",
    value: function transportReady() {
      this._readyCapability.resolve();
    }
  }, {
    key: "requestDataRange",
    value: function requestDataRange(begin, end) {
      (0, _util.unreachable)('Abstract method PDFDataRangeTransport.requestDataRange');
    }
  }, {
    key: "abort",
    value: function abort() {}
  }]);

  return PDFDataRangeTransport;
}();

exports.PDFDataRangeTransport = PDFDataRangeTransport;

var PDFDocumentProxy =
/*#__PURE__*/
function () {
  function PDFDocumentProxy(pdfInfo, transport, loadingTask) {
    _classCallCheck(this, PDFDocumentProxy);

    this.loadingTask = loadingTask;
    this._pdfInfo = pdfInfo;
    this._transport = transport;
  }

  _createClass(PDFDocumentProxy, [{
    key: "getPage",
    value: function getPage(pageNumber) {
      return this._transport.getPage(pageNumber);
    }
  }, {
    key: "getPageIndex",
    value: function getPageIndex(ref) {
      return this._transport.getPageIndex(ref);
    }
  }, {
    key: "getDestinations",
    value: function getDestinations() {
      return this._transport.getDestinations();
    }
  }, {
    key: "getDestination",
    value: function getDestination(id) {
      return this._transport.getDestination(id);
    }
  }, {
    key: "getPageLabels",
    value: function getPageLabels() {
      return this._transport.getPageLabels();
    }
  }, {
    key: "getPageMode",
    value: function getPageMode() {
      return this._transport.getPageMode();
    }
  }, {
    key: "getOpenActionDestination",
    value: function getOpenActionDestination() {
      return this._transport.getOpenActionDestination();
    }
  }, {
    key: "getAttachments",
    value: function getAttachments() {
      return this._transport.getAttachments();
    }
  }, {
    key: "getJavaScript",
    value: function getJavaScript() {
      return this._transport.getJavaScript();
    }
  }, {
    key: "getOutline",
    value: function getOutline() {
      return this._transport.getOutline();
    }
  }, {
    key: "getPermissions",
    value: function getPermissions() {
      return this._transport.getPermissions();
    }
  }, {
    key: "getMetadata",
    value: function getMetadata() {
      return this._transport.getMetadata();
    }
  }, {
    key: "getData",
    value: function getData() {
      return this._transport.getData();
    }
  }, {
    key: "getDownloadInfo",
    value: function getDownloadInfo() {
      return this._transport.downloadInfoCapability.promise;
    }
  }, {
    key: "getStats",
    value: function getStats() {
      return this._transport.getStats();
    }
  }, {
    key: "cleanup",
    value: function cleanup() {
      this._transport.startCleanup();
    }
  }, {
    key: "destroy",
    value: function destroy() {
      return this.loadingTask.destroy();
    }
  }, {
    key: "numPages",
    get: function get() {
      return this._pdfInfo.numPages;
    }
  }, {
    key: "fingerprint",
    get: function get() {
      return this._pdfInfo.fingerprint;
    }
  }, {
    key: "loadingParams",
    get: function get() {
      return this._transport.loadingParams;
    }
  }]);

  return PDFDocumentProxy;
}();

exports.PDFDocumentProxy = PDFDocumentProxy;

var PDFPageProxy =
/*#__PURE__*/
function () {
  function PDFPageProxy(pageIndex, pageInfo, transport) {
    var pdfBug = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;

    _classCallCheck(this, PDFPageProxy);

    this.pageIndex = pageIndex;
    this._pageInfo = pageInfo;
    this._transport = transport;
    this._stats = pdfBug ? new _dom_utils.StatTimer() : _dom_utils.DummyStatTimer;
    this._pdfBug = pdfBug;
    this.commonObjs = transport.commonObjs;
    this.objs = new PDFObjects();
    this.cleanupAfterRender = false;
    this.pendingCleanup = false;
    this.intentStates = Object.create(null);
    this.destroyed = false;
  }

  _createClass(PDFPageProxy, [{
    key: "getViewport",
    value: function getViewport() {
      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
          scale = _ref.scale,
          _ref$rotation = _ref.rotation,
          rotation = _ref$rotation === void 0 ? this.rotate : _ref$rotation,
          _ref$dontFlip = _ref.dontFlip,
          dontFlip = _ref$dontFlip === void 0 ? false : _ref$dontFlip;

      if (arguments.length > 1 || typeof arguments[0] === 'number') {
        (0, _util.deprecated)('getViewport is called with obsolete arguments.');
        scale = arguments[0];
        rotation = typeof arguments[1] === 'number' ? arguments[1] : this.rotate;
        dontFlip = typeof arguments[2] === 'boolean' ? arguments[2] : false;
      }

      return new _dom_utils.PageViewport({
        viewBox: this.view,
        scale: scale,
        rotation: rotation,
        dontFlip: dontFlip
      });
    }
  }, {
    key: "getAnnotations",
    value: function getAnnotations() {
      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
          _ref2$intent = _ref2.intent,
          intent = _ref2$intent === void 0 ? null : _ref2$intent;

      if (!this.annotationsPromise || this.annotationsIntent !== intent) {
        this.annotationsPromise = this._transport.getAnnotations(this.pageIndex, intent);
        this.annotationsIntent = intent;
      }

      return this.annotationsPromise;
    }
  }, {
    key: "render",
    value: function render(_ref3) {
      var _this4 = this;

      var canvasContext = _ref3.canvasContext,
          viewport = _ref3.viewport,
          _ref3$intent = _ref3.intent,
          intent = _ref3$intent === void 0 ? 'display' : _ref3$intent,
          _ref3$enableWebGL = _ref3.enableWebGL,
          enableWebGL = _ref3$enableWebGL === void 0 ? false : _ref3$enableWebGL,
          _ref3$renderInteracti = _ref3.renderInteractiveForms,
          renderInteractiveForms = _ref3$renderInteracti === void 0 ? false : _ref3$renderInteracti,
          _ref3$transform = _ref3.transform,
          transform = _ref3$transform === void 0 ? null : _ref3$transform,
          _ref3$imageLayer = _ref3.imageLayer,
          imageLayer = _ref3$imageLayer === void 0 ? null : _ref3$imageLayer,
          _ref3$canvasFactory = _ref3.canvasFactory,
          canvasFactory = _ref3$canvasFactory === void 0 ? null : _ref3$canvasFactory,
          _ref3$background = _ref3.background,
          background = _ref3$background === void 0 ? null : _ref3$background;
      var stats = this._stats;
      stats.time('Overall');
      this.pendingCleanup = false;
      var renderingIntent = intent === 'print' ? 'print' : 'display';
      var canvasFactoryInstance = canvasFactory || new _dom_utils.DOMCanvasFactory();
      var webGLContext = new _webgl.WebGLContext({
        enable: enableWebGL
      });

      if (!this.intentStates[renderingIntent]) {
        this.intentStates[renderingIntent] = Object.create(null);
      }

      var intentState = this.intentStates[renderingIntent];

      if (!intentState.displayReadyCapability) {
        intentState.receivingOperatorList = true;
        intentState.displayReadyCapability = (0, _util.createPromiseCapability)();
        intentState.operatorList = {
          fnArray: [],
          argsArray: [],
          lastChunk: false
        };
        stats.time('Page Request');

        this._transport.messageHandler.send('RenderPageRequest', {
          pageIndex: this.pageNumber - 1,
          intent: renderingIntent,
          renderInteractiveForms: renderInteractiveForms === true
        });
      }

      var complete = function complete(error) {
        var i = intentState.renderTasks.indexOf(internalRenderTask);

        if (i >= 0) {
          intentState.renderTasks.splice(i, 1);
        }

        if (_this4.cleanupAfterRender) {
          _this4.pendingCleanup = true;
        }

        _this4._tryCleanup();

        if (error) {
          internalRenderTask.capability.reject(error);
        } else {
          internalRenderTask.capability.resolve();
        }

        stats.timeEnd('Rendering');
        stats.timeEnd('Overall');
      };

      var internalRenderTask = new InternalRenderTask({
        callback: complete,
        params: {
          canvasContext: canvasContext,
          viewport: viewport,
          transform: transform,
          imageLayer: imageLayer,
          background: background
        },
        objs: this.objs,
        commonObjs: this.commonObjs,
        operatorList: intentState.operatorList,
        pageNumber: this.pageNumber,
        canvasFactory: canvasFactoryInstance,
        webGLContext: webGLContext,
        useRequestAnimationFrame: renderingIntent !== 'print',
        pdfBug: this._pdfBug
      });

      if (!intentState.renderTasks) {
        intentState.renderTasks = [];
      }

      intentState.renderTasks.push(internalRenderTask);
      var renderTask = internalRenderTask.task;
      intentState.displayReadyCapability.promise.then(function (transparency) {
        if (_this4.pendingCleanup) {
          complete();
          return;
        }

        stats.time('Rendering');
        internalRenderTask.initializeGraphics(transparency);
        internalRenderTask.operatorListChanged();
      }).catch(complete);
      return renderTask;
    }
  }, {
    key: "getOperatorList",
    value: function getOperatorList() {
      function operatorListChanged() {
        if (intentState.operatorList.lastChunk) {
          intentState.opListReadCapability.resolve(intentState.operatorList);
          var i = intentState.renderTasks.indexOf(opListTask);

          if (i >= 0) {
            intentState.renderTasks.splice(i, 1);
          }
        }
      }

      var renderingIntent = 'oplist';

      if (!this.intentStates[renderingIntent]) {
        this.intentStates[renderingIntent] = Object.create(null);
      }

      var intentState = this.intentStates[renderingIntent];
      var opListTask;

      if (!intentState.opListReadCapability) {
        opListTask = {};
        opListTask.operatorListChanged = operatorListChanged;
        intentState.receivingOperatorList = true;
        intentState.opListReadCapability = (0, _util.createPromiseCapability)();
        intentState.renderTasks = [];
        intentState.renderTasks.push(opListTask);
        intentState.operatorList = {
          fnArray: [],
          argsArray: [],
          lastChunk: false
        };

        this._stats.time('Page Request');

        this._transport.messageHandler.send('RenderPageRequest', {
          pageIndex: this.pageIndex,
          intent: renderingIntent
        });
      }

      return intentState.opListReadCapability.promise;
    }
  }, {
    key: "streamTextContent",
    value: function streamTextContent() {
      var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
          _ref4$normalizeWhites = _ref4.normalizeWhitespace,
          normalizeWhitespace = _ref4$normalizeWhites === void 0 ? false : _ref4$normalizeWhites,
          _ref4$disableCombineT = _ref4.disableCombineTextItems,
          disableCombineTextItems = _ref4$disableCombineT === void 0 ? false : _ref4$disableCombineT;

      var TEXT_CONTENT_CHUNK_SIZE = 100;
      return this._transport.messageHandler.sendWithStream('GetTextContent', {
        pageIndex: this.pageNumber - 1,
        normalizeWhitespace: normalizeWhitespace === true,
        combineTextItems: disableCombineTextItems !== true
      }, {
        highWaterMark: TEXT_CONTENT_CHUNK_SIZE,
        size: function size(textContent) {
          return textContent.items.length;
        }
      });
    }
  }, {
    key: "getTextContent",
    value: function getTextContent() {
      var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
      var readableStream = this.streamTextContent(params);
      return new Promise(function (resolve, reject) {
        function pump() {
          reader.read().then(function (_ref5) {
            var _textContent$items;

            var value = _ref5.value,
                done = _ref5.done;

            if (done) {
              resolve(textContent);
              return;
            }

            Object.assign(textContent.styles, value.styles);

            (_textContent$items = textContent.items).push.apply(_textContent$items, _toConsumableArray(value.items));

            pump();
          }, reject);
        }

        var reader = readableStream.getReader();
        var textContent = {
          items: [],
          styles: Object.create(null)
        };
        pump();
      });
    }
  }, {
    key: "_destroy",
    value: function _destroy() {
      this.destroyed = true;
      this._transport.pageCache[this.pageIndex] = null;
      var waitOn = [];
      Object.keys(this.intentStates).forEach(function (intent) {
        if (intent === 'oplist') {
          return;
        }

        var intentState = this.intentStates[intent];
        intentState.renderTasks.forEach(function (renderTask) {
          var renderCompleted = renderTask.capability.promise.catch(function () {});
          waitOn.push(renderCompleted);
          renderTask.cancel();
        });
      }, this);
      this.objs.clear();
      this.annotationsPromise = null;
      this.pendingCleanup = false;
      return Promise.all(waitOn);
    }
  }, {
    key: "cleanup",
    value: function cleanup() {
      var resetStats = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
      this.pendingCleanup = true;

      this._tryCleanup(resetStats);
    }
  }, {
    key: "_tryCleanup",
    value: function _tryCleanup() {
      var resetStats = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;

      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;

      if (resetStats && this._stats instanceof _dom_utils.StatTimer) {
        this._stats = new _dom_utils.StatTimer();
      }

      this.pendingCleanup = false;
    }
  }, {
    key: "_startRenderPage",
    value: function _startRenderPage(transparency, intent) {
      var intentState = this.intentStates[intent];

      if (intentState.displayReadyCapability) {
        intentState.displayReadyCapability.resolve(transparency);
      }
    }
  }, {
    key: "_renderPageChunk",
    value: function _renderPageChunk(operatorListChunk, intent) {
      var intentState = this.intentStates[intent];

      for (var 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;

      for (var _i = 0; _i < intentState.renderTasks.length; _i++) {
        intentState.renderTasks[_i].operatorListChanged();
      }

      if (operatorListChunk.lastChunk) {
        intentState.receivingOperatorList = false;

        this._tryCleanup();
      }
    }
  }, {
    key: "pageNumber",
    get: function get() {
      return this.pageIndex + 1;
    }
  }, {
    key: "rotate",
    get: function get() {
      return this._pageInfo.rotate;
    }
  }, {
    key: "ref",
    get: function get() {
      return this._pageInfo.ref;
    }
  }, {
    key: "userUnit",
    get: function get() {
      return this._pageInfo.userUnit;
    }
  }, {
    key: "view",
    get: function get() {
      return this._pageInfo.view;
    }
  }, {
    key: "stats",
    get: function get() {
      return this._stats instanceof _dom_utils.StatTimer ? this._stats : null;
    }
  }]);

  return PDFPageProxy;
}();

exports.PDFPageProxy = PDFPageProxy;

var LoopbackPort =
/*#__PURE__*/
function () {
  function LoopbackPort() {
    var defer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;

    _classCallCheck(this, LoopbackPort);

    this._listeners = [];
    this._defer = defer;
    this._deferred = Promise.resolve(undefined);
  }

  _createClass(LoopbackPort, [{
    key: "postMessage",
    value: function postMessage(obj, transfers) {
      var _this5 = this;

      function cloneValue(value) {
        if (_typeof(value) !== 'object' || value === null) {
          return value;
        }

        if (cloned.has(value)) {
          return cloned.get(value);
        }

        var buffer, result;

        if ((buffer = value.buffer) && (0, _util.isArrayBuffer)(buffer)) {
          var transferable = transfers && transfers.includes(buffer);

          if (value === buffer) {
            result = value;
          } else if (transferable) {
            result = new value.constructor(buffer, value.byteOffset, value.byteLength);
          } else {
            result = new value.constructor(value);
          }

          cloned.set(value, result);
          return result;
        }

        result = Array.isArray(value) ? [] : {};
        cloned.set(value, result);

        for (var i in value) {
          var desc = void 0,
              p = value;

          while (!(desc = Object.getOwnPropertyDescriptor(p, i))) {
            p = Object.getPrototypeOf(p);
          }

          if (typeof desc.value === 'undefined' || typeof desc.value === 'function') {
            continue;
          }

          result[i] = cloneValue(desc.value);
        }

        return result;
      }

      if (!this._defer) {
        this._listeners.forEach(function (listener) {
          listener.call(this, {
            data: obj
          });
        }, this);

        return;
      }

      var cloned = new WeakMap();
      var e = {
        data: cloneValue(obj)
      };

      this._deferred.then(function () {
        _this5._listeners.forEach(function (listener) {
          listener.call(this, e);
        }, _this5);
      });
    }
  }, {
    key: "addEventListener",
    value: function addEventListener(name, listener) {
      this._listeners.push(listener);
    }
  }, {
    key: "removeEventListener",
    value: function removeEventListener(name, listener) {
      var i = this._listeners.indexOf(listener);

      this._listeners.splice(i, 1);
    }
  }, {
    key: "terminate",
    value: function terminate() {
      this._listeners = [];
    }
  }]);

  return LoopbackPort;
}();

exports.LoopbackPort = LoopbackPort;

var PDFWorker = function PDFWorkerClosure() {
  var pdfWorkerPorts = new WeakMap();
  var nextFakeWorkerId = 0;
  var fakeWorkerFilesLoadedCapability;

  function _getWorkerSrc() {
    if (_worker_options.GlobalWorkerOptions.workerSrc) {
      return _worker_options.GlobalWorkerOptions.workerSrc;
    }

    if (typeof fallbackWorkerSrc !== 'undefined') {
      return fallbackWorkerSrc;
    }

    throw new Error('No "GlobalWorkerOptions.workerSrc" specified.');
  }

  function getMainThreadWorkerMessageHandler() {
    try {
      if (typeof window !== 'undefined') {
        return window.pdfjsWorker && window.pdfjsWorker.WorkerMessageHandler;
      }
    } catch (ex) {}

    return null;
  }

  function setupFakeWorkerGlobal() {
    if (fakeWorkerFilesLoadedCapability) {
      return fakeWorkerFilesLoadedCapability.promise;
    }

    fakeWorkerFilesLoadedCapability = (0, _util.createPromiseCapability)();
    var mainWorkerMessageHandler = getMainThreadWorkerMessageHandler();

    if (mainWorkerMessageHandler) {
      fakeWorkerFilesLoadedCapability.resolve(mainWorkerMessageHandler);
      return fakeWorkerFilesLoadedCapability.promise;
    }

    var loader = fakeWorkerFilesLoader || function () {
      return (0, _dom_utils.loadScript)(_getWorkerSrc()).then(function () {
        return window.pdfjsWorker.WorkerMessageHandler;
      });
    };

    loader().then(fakeWorkerFilesLoadedCapability.resolve, fakeWorkerFilesLoadedCapability.reject);
    return fakeWorkerFilesLoadedCapability.promise;
  }

  function createCDNWrapper(url) {
    var wrapper = 'importScripts(\'' + url + '\');';
    return _util.URL.createObjectURL(new Blob([wrapper]));
  }

  var PDFWorker =
  /*#__PURE__*/
  function () {
    function PDFWorker() {
      var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
          _ref6$name = _ref6.name,
          name = _ref6$name === void 0 ? null : _ref6$name,
          _ref6$port = _ref6.port,
          port = _ref6$port === void 0 ? null : _ref6$port,
          _ref6$postMessageTran = _ref6.postMessageTransfers,
          postMessageTransfers = _ref6$postMessageTran === void 0 ? true : _ref6$postMessageTran,
          _ref6$verbosity = _ref6.verbosity,
          verbosity = _ref6$verbosity === void 0 ? (0, _util.getVerbosityLevel)() : _ref6$verbosity;

      _classCallCheck(this, PDFWorker);

      if (port && pdfWorkerPorts.has(port)) {
        throw new Error('Cannot use more than one PDFWorker per port');
      }

      this.name = name;
      this.destroyed = false;
      this.postMessageTransfers = postMessageTransfers !== false;
      this.verbosity = verbosity;
      this._readyCapability = (0, _util.createPromiseCapability)();
      this._port = null;
      this._webWorker = null;
      this._messageHandler = null;

      if (port) {
        pdfWorkerPorts.set(port, this);

        this._initializeFromPort(port);

        return;
      }

      this._initialize();
    }

    _createClass(PDFWorker, [{
      key: "_initializeFromPort",
      value: function _initializeFromPort(port) {
        this._port = port;
        this._messageHandler = new _message_handler.MessageHandler('main', 'worker', port);

        this._messageHandler.on('ready', function () {});

        this._readyCapability.resolve();
      }
    }, {
      key: "_initialize",
      value: function _initialize() {
        var _this6 = this;

        if (typeof Worker !== 'undefined' && !isWorkerDisabled && !getMainThreadWorkerMessageHandler()) {
          var workerSrc = _getWorkerSrc();

          try {
            // CHANGE 7
            // if (!(0, _util.isSameOrigin)(window.location.href, workerSrc)) {
            //   workerSrc = createCDNWrapper(new _util.URL(workerSrc, window.location).href);
            // }

            var worker = new Worker(workerSrc);
            var messageHandler = new _message_handler.MessageHandler('main', 'worker', worker);

            var terminateEarly = function terminateEarly() {
              worker.removeEventListener('error', onWorkerError);
              messageHandler.destroy();
              worker.terminate();

              if (_this6.destroyed) {
                _this6._readyCapability.reject(new Error('Worker was destroyed'));
              } else {
                _this6._setupFakeWorker();
              }
            };

            var onWorkerError = function onWorkerError() {
              if (!_this6._webWorker) {
                terminateEarly();
              }
            };

            worker.addEventListener('error', onWorkerError);
            messageHandler.on('test', function (data) {
              worker.removeEventListener('error', onWorkerError);

              if (_this6.destroyed) {
                terminateEarly();
                return;
              }

              if (data && data.supportTypedArray) {
                _this6._messageHandler = messageHandler;
                _this6._port = worker;
                _this6._webWorker = worker;

                if (!data.supportTransfers) {
                  _this6.postMessageTransfers = false;
                }

                _this6._readyCapability.resolve();

                messageHandler.send('configure', {
                  verbosity: _this6.verbosity
                });
              } else {
                _this6._setupFakeWorker();

                messageHandler.destroy();
                worker.terminate();
              }
            });
            messageHandler.on('ready', function (data) {
              worker.removeEventListener('error', onWorkerError);

              if (_this6.destroyed) {
                terminateEarly();
                return;
              }

              try {
                sendTest();
              } catch (e) {
                _this6._setupFakeWorker();
              }
            });

            var sendTest = function sendTest() {
              var testObj = new Uint8Array([_this6.postMessageTransfers ? 255 : 0]);

              try {
                messageHandler.send('test', testObj, [testObj.buffer]);
              } catch (ex) {
                (0, _util.info)('Cannot use postMessage transfers');
                testObj[0] = 0;
                messageHandler.send('test', testObj);
              }
            };

            sendTest();
            return;
          } catch (e) {
            (0, _util.info)('The worker has been disabled.');
          }
        }

        this._setupFakeWorker();
      }
    }, {
      key: "_setupFakeWorker",
      value: function _setupFakeWorker() {
        var _this7 = this;

        if (!isWorkerDisabled) {
          (0, _util.warn)('Setting up fake worker.');
          isWorkerDisabled = true;
        }

        setupFakeWorkerGlobal().then(function (WorkerMessageHandler) {
          if (_this7.destroyed) {
            _this7._readyCapability.reject(new Error('Worker was destroyed'));

            return;
          }

          var port = new LoopbackPort();
          _this7._port = port;
          var id = 'fake' + nextFakeWorkerId++;
          var workerHandler = new _message_handler.MessageHandler(id + '_worker', id, port);
          WorkerMessageHandler.setup(workerHandler, port);
          var messageHandler = new _message_handler.MessageHandler(id, id + '_worker', port);
          _this7._messageHandler = messageHandler;

          _this7._readyCapability.resolve();
        }).catch(function (reason) {
          _this7._readyCapability.reject(new Error("Setting up fake worker failed: \"".concat(reason.message, "\".")));
        });
      }
    }, {
      key: "destroy",
      value: function destroy() {
        this.destroyed = true;

        if (this._webWorker) {
          this._webWorker.terminate();

          this._webWorker = null;
        }

        pdfWorkerPorts.delete(this._port);
        this._port = null;

        if (this._messageHandler) {
          this._messageHandler.destroy();

          this._messageHandler = null;
        }
      }
    }, {
      key: "promise",
      get: function get() {
        return this._readyCapability.promise;
      }
    }, {
      key: "port",
      get: function get() {
        return this._port;
      }
    }, {
      key: "messageHandler",
      get: function get() {
        return this._messageHandler;
      }
    }], [{
      key: "fromPort",
      value: function fromPort(params) {
        if (!params || !params.port) {
          throw new Error('PDFWorker.fromPort - invalid method signature.');
        }

        if (pdfWorkerPorts.has(params.port)) {
          return pdfWorkerPorts.get(params.port);
        }

        return new PDFWorker(params);
      }
    }, {
      key: "getWorkerSrc",
      value: function getWorkerSrc() {
        return _getWorkerSrc();
      }
    }]);

    return PDFWorker;
  }();

  return PDFWorker;
}();

exports.PDFWorker = PDFWorker;

var WorkerTransport =
/*#__PURE__*/
function () {
  function WorkerTransport(messageHandler, loadingTask, networkStream, params) {
    _classCallCheck(this, WorkerTransport);

    this.messageHandler = messageHandler;
    this.loadingTask = loadingTask;
    this.commonObjs = new PDFObjects();
    this.fontLoader = new _font_loader.FontLoader({
      docId: loadingTask.docId,
      onUnsupportedFeature: this._onUnsupportedFeature.bind(this)
    });
    this._params = params;
    this.CMapReaderFactory = new params.CMapReaderFactory({
      baseUrl: params.cMapUrl,
      isCompressed: params.cMapPacked
    });
    this.destroyed = false;
    this.destroyCapability = null;
    this._passwordCapability = null;
    this._networkStream = networkStream;
    this._fullReader = null;
    this._lastProgress = null;
    this.pageCache = [];
    this.pagePromises = [];
    this.downloadInfoCapability = (0, _util.createPromiseCapability)();
    this.setupMessageHandler();
  }

  _createClass(WorkerTransport, [{
    key: "destroy",
    value: function destroy() {
      var _this8 = this;

      if (this.destroyCapability) {
        return this.destroyCapability.promise;
      }

      this.destroyed = true;
      this.destroyCapability = (0, _util.createPromiseCapability)();

      if (this._passwordCapability) {
        this._passwordCapability.reject(new Error('Worker was destroyed during onPassword callback'));
      }

      var waitOn = [];
      this.pageCache.forEach(function (page) {
        if (page) {
          waitOn.push(page._destroy());
        }
      });
      this.pageCache = [];
      this.pagePromises = [];
      var terminated = this.messageHandler.sendWithPromise('Terminate', null);
      waitOn.push(terminated);
      Promise.all(waitOn).then(function () {
        _this8.fontLoader.clear();

        if (_this8._networkStream) {
          _this8._networkStream.cancelAllRequests();
        }

        if (_this8.messageHandler) {
          _this8.messageHandler.destroy();

          _this8.messageHandler = null;
        }

        _this8.destroyCapability.resolve();
      }, this.destroyCapability.reject);
      return this.destroyCapability.promise;
    }
  }, {
    key: "setupMessageHandler",
    value: function setupMessageHandler() {
      var messageHandler = this.messageHandler,
          loadingTask = this.loadingTask;
      messageHandler.on('GetReader', function (data, sink) {
        var _this9 = this;

        (0, _util.assert)(this._networkStream);
        this._fullReader = this._networkStream.getFullReader();

        this._fullReader.onProgress = function (evt) {
          _this9._lastProgress = {
            loaded: evt.loaded,
            total: evt.total
          };
        };

        sink.onPull = function () {
          _this9._fullReader.read().then(function (_ref7) {
            var value = _ref7.value,
                done = _ref7.done;

            if (done) {
              sink.close();
              return;
            }

            (0, _util.assert)((0, _util.isArrayBuffer)(value));
            sink.enqueue(new Uint8Array(value), 1, [value]);
          }).catch(function (reason) {
            sink.error(reason);
          });
        };

        sink.onCancel = function (reason) {
          _this9._fullReader.cancel(reason);
        };
      }, this);
      messageHandler.on('ReaderHeadersReady', function (data) {
        var _this10 = this;

        var headersCapability = (0, _util.createPromiseCapability)();
        var fullReader = this._fullReader;
        fullReader.headersReady.then(function () {
          if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) {
            if (_this10._lastProgress && loadingTask.onProgress) {
              loadingTask.onProgress(_this10._lastProgress);
            }

            fullReader.onProgress = function (evt) {
              if (loadingTask.onProgress) {
                loadingTask.onProgress({
                  loaded: evt.loaded,
                  total: evt.total
                });
              }
            };
          }

          headersCapability.resolve({
            isStreamingSupported: fullReader.isStreamingSupported,
            isRangeSupported: fullReader.isRangeSupported,
            contentLength: fullReader.contentLength
          });
        }, headersCapability.reject);
        return headersCapability.promise;
      }, this);
      messageHandler.on('GetRangeReader', function (data, sink) {
        (0, _util.assert)(this._networkStream);

        var rangeReader = this._networkStream.getRangeReader(data.begin, data.end);

        sink.onPull = function () {
          rangeReader.read().then(function (_ref8) {
            var value = _ref8.value,
                done = _ref8.done;

            if (done) {
              sink.close();
              return;
            }

            (0, _util.assert)((0, _util.isArrayBuffer)(value));
            sink.enqueue(new Uint8Array(value), 1, [value]);
          }).catch(function (reason) {
            sink.error(reason);
          });
        };

        sink.onCancel = function (reason) {
          rangeReader.cancel(reason);
        };
      }, this);
      messageHandler.on('GetDoc', function (_ref9) {
        var pdfInfo = _ref9.pdfInfo;
        this.numPages = pdfInfo.numPages;
        this.pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask);

        loadingTask._capability.resolve(this.pdfDocument);
      }, this);
      messageHandler.on('PasswordRequest', function (exception) {
        var _this11 = this;

        this._passwordCapability = (0, _util.createPromiseCapability)();

        if (loadingTask.onPassword) {
          var updatePassword = function updatePassword(password) {
            _this11._passwordCapability.resolve({
              password: password
            });
          };

          try {
            loadingTask.onPassword(updatePassword, exception.code);
          } catch (ex) {
            this._passwordCapability.reject(ex);
          }
        } else {
          this._passwordCapability.reject(new _util.PasswordException(exception.message, exception.code));
        }

        return this._passwordCapability.promise;
      }, this);
      messageHandler.on('PasswordException', function (exception) {
        loadingTask._capability.reject(new _util.PasswordException(exception.message, exception.code));
      }, this);
      messageHandler.on('InvalidPDF', function (exception) {
        loadingTask._capability.reject(new _util.InvalidPDFException(exception.message));
      }, this);
      messageHandler.on('MissingPDF', function (exception) {
        loadingTask._capability.reject(new _util.MissingPDFException(exception.message));
      }, this);
      messageHandler.on('UnexpectedResponse', function (exception) {
        loadingTask._capability.reject(new _util.UnexpectedResponseException(exception.message, exception.status));
      }, this);
      messageHandler.on('UnknownError', function (exception) {
        loadingTask._capability.reject(new _util.UnknownErrorException(exception.message, exception.details));
      }, this);
      messageHandler.on('DataLoaded', function (data) {
        if (loadingTask.onProgress) {
          loadingTask.onProgress({
            loaded: data.length,
            total: data.length
          });
        }

        this.downloadInfoCapability.resolve(data);
      }, this);
      messageHandler.on('StartRenderPage', function (data) {
        if (this.destroyed) {
          return;
        }

        var page = this.pageCache[data.pageIndex];

        page._stats.timeEnd('Page Request');

        page._startRenderPage(data.transparency, data.intent);
      }, this);
      messageHandler.on('RenderPageChunk', function (data) {
        if (this.destroyed) {
          return;
        }

        var page = this.pageCache[data.pageIndex];

        page._renderPageChunk(data.operatorList, data.intent);
      }, this);
      messageHandler.on('commonobj', function (data) {
        var _this12 = this;

        if (this.destroyed) {
          return;
        }

        var _data = _slicedToArray(data, 3),
            id = _data[0],
            type = _data[1],
            exportedData = _data[2];

        if (this.commonObjs.has(id)) {
          return;
        }

        switch (type) {
          case 'Font':
            var params = this._params;

            if ('error' in exportedData) {
              var exportedError = exportedData.error;
              (0, _util.warn)("Error during font loading: ".concat(exportedError));
              this.commonObjs.resolve(id, exportedError);
              break;
            }

            var fontRegistry = null;

            if (params.pdfBug && _global_scope.default.FontInspector && _global_scope.default.FontInspector.enabled) {
              fontRegistry = {
                registerFont: function registerFont(font, url) {
                  _global_scope.default['FontInspector'].fontAdded(font, url);
                }
              };
            }

            var font = new _font_loader.FontFaceObject(exportedData, {
              isEvalSupported: params.isEvalSupported,
              disableFontFace: params.disableFontFace,
              ignoreErrors: params.ignoreErrors,
              onUnsupportedFeature: this._onUnsupportedFeature.bind(this),
              fontRegistry: fontRegistry
            });
            this.fontLoader.bind(font).then(function () {
              _this12.commonObjs.resolve(id, font);
            }, function (reason) {
              messageHandler.sendWithPromise('FontFallback', {
                id: id
              }).finally(function () {
                _this12.commonObjs.resolve(id, font);
              });
            });
            break;

          case 'FontPath':
            this.commonObjs.resolve(id, exportedData);
            break;

          default:
            throw new Error("Got unknown common object type ".concat(type));
        }
      }, this);
      messageHandler.on('obj', function (data) {
        if (this.destroyed) {
          return;
        }

        var _data2 = _slicedToArray(data, 4),
            id = _data2[0],
            pageIndex = _data2[1],
            type = _data2[2],
            imageData = _data2[3];

        var pageProxy = this.pageCache[pageIndex];

        if (pageProxy.objs.has(id)) {
          return;
        }

        switch (type) {
          case 'JpegStream':
            return new Promise(function (resolve, reject) {
              var img = new Image();

              img.onload = function () {
                resolve(img);
              };

              img.onerror = function () {
                reject(new Error('Error during JPEG image loading'));
              };

              img.src = imageData;
            }).then(function (img) {
              pageProxy.objs.resolve(id, img);
            });

          case 'Image':
            pageProxy.objs.resolve(id, imageData);
            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:
            throw new Error("Got unknown object type ".concat(type));
        }
      }, this);
      messageHandler.on('DocProgress', function (data) {
        if (this.destroyed) {
          return;
        }

        if (loadingTask.onProgress) {
          loadingTask.onProgress({
            loaded: data.loaded,
            total: data.total
          });
        }
      }, this);
      messageHandler.on('PageError', function (data) {
        if (this.destroyed) {
          return;
        }

        var page = this.pageCache[data.pageNum - 1];
        var intentState = page.intentStates[data.intent];

        if (intentState.displayReadyCapability) {
          intentState.displayReadyCapability.reject(data.error);
        } else {
          throw new Error(data.error);
        }

        if (intentState.operatorList) {
          intentState.operatorList.lastChunk = true;

          for (var i = 0; i < intentState.renderTasks.length; i++) {
            intentState.renderTasks[i].operatorListChanged();
          }
        }
      }, this);
      messageHandler.on('UnsupportedFeature', this._onUnsupportedFeature, this);
      messageHandler.on('JpegDecode', function (data) {
        if (this.destroyed) {
          return Promise.reject(new Error('Worker was destroyed'));
        }

        if (typeof document === 'undefined') {
          return Promise.reject(new Error('"document" is not defined.'));
        }

        var _data3 = _slicedToArray(data, 2),
            imageUrl = _data3[0],
            components = _data3[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 Uint8ClampedArray(size * components);
            var tmpCanvas = document.createElement('canvas');
            tmpCanvas.width = width;
            tmpCanvas.height = height;
            var tmpCtx = tmpCanvas.getContext('2d');
            tmpCtx.drawImage(img, 0, 0);
            var data = tmpCtx.getImageData(0, 0, width, height).data;

            if (components === 3) {
              for (var 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 (var _i2 = 0, _j = 0; _i2 < rgbaLength; _i2 += 4, _j++) {
                buf[_j] = data[_i2];
              }
            }

            resolve({
              data: buf,
              width: width,
              height: height
            });
          };

          img.onerror = function () {
            reject(new Error('JpegDecode failed to load image'));
          };

          img.src = imageUrl;
        });
      }, this);
      messageHandler.on('FetchBuiltInCMap', function (data) {
        if (this.destroyed) {
          return Promise.reject(new Error('Worker was destroyed'));
        }

        return this.CMapReaderFactory.fetch({
          name: data.name
        });
      }, this);
    }
  }, {
    key: "_onUnsupportedFeature",
    value: function _onUnsupportedFeature(_ref10) {
      var featureId = _ref10.featureId;

      if (this.destroyed) {
        return;
      }

      if (this.loadingTask.onUnsupportedFeature) {
        this.loadingTask.onUnsupportedFeature(featureId);
      }
    }
  }, {
    key: "getData",
    value: function getData() {
      return this.messageHandler.sendWithPromise('GetData', null);
    }
  }, {
    key: "getPage",
    value: function getPage(pageNumber) {
      var _this13 = this;

      if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this.numPages) {
        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 (_this13.destroyed) {
          throw new Error('Transport destroyed');
        }

        var page = new PDFPageProxy(pageIndex, pageInfo, _this13, _this13._params.pdfBug);
        _this13.pageCache[pageIndex] = page;
        return page;
      });
      this.pagePromises[pageIndex] = promise;
      return promise;
    }
  }, {
    key: "getPageIndex",
    value: function getPageIndex(ref) {
      return this.messageHandler.sendWithPromise('GetPageIndex', {
        ref: ref
      }).catch(function (reason) {
        return Promise.reject(new Error(reason));
      });
    }
  }, {
    key: "getAnnotations",
    value: function getAnnotations(pageIndex, intent) {
      return this.messageHandler.sendWithPromise('GetAnnotations', {
        pageIndex: pageIndex,
        intent: intent
      });
    }
  }, {
    key: "getDestinations",
    value: function getDestinations() {
      return this.messageHandler.sendWithPromise('GetDestinations', null);
    }
  }, {
    key: "getDestination",
    value: function getDestination(id) {
      if (typeof id !== 'string') {
        return Promise.reject(new Error('Invalid destination request.'));
      }

      return this.messageHandler.sendWithPromise('GetDestination', {
        id: id
      });
    }
  }, {
    key: "getPageLabels",
    value: function getPageLabels() {
      return this.messageHandler.sendWithPromise('GetPageLabels', null);
    }
  }, {
    key: "getPageMode",
    value: function getPageMode() {
      return this.messageHandler.sendWithPromise('GetPageMode', null);
    }
  }, {
    key: "getOpenActionDestination",
    value: function getOpenActionDestination() {
      return this.messageHandler.sendWithPromise('getOpenActionDestination', null);
    }
  }, {
    key: "getAttachments",
    value: function getAttachments() {
      return this.messageHandler.sendWithPromise('GetAttachments', null);
    }
  }, {
    key: "getJavaScript",
    value: function getJavaScript() {
      return this.messageHandler.sendWithPromise('GetJavaScript', null);
    }
  }, {
    key: "getOutline",
    value: function getOutline() {
      return this.messageHandler.sendWithPromise('GetOutline', null);
    }
  }, {
    key: "getPermissions",
    value: function getPermissions() {
      return this.messageHandler.sendWithPromise('GetPermissions', null);
    }
  }, {
    key: "getMetadata",
    value: function getMetadata() {
      var _this14 = this;

      return this.messageHandler.sendWithPromise('GetMetadata', null).then(function (results) {
        return {
          info: results[0],
          metadata: results[1] ? new _metadata.Metadata(results[1]) : null,
          contentDispositionFilename: _this14._fullReader ? _this14._fullReader.filename : null
        };
      });
    }
  }, {
    key: "getStats",
    value: function getStats() {
      return this.messageHandler.sendWithPromise('GetStats', null);
    }
  }, {
    key: "startCleanup",
    value: function startCleanup() {
      var _this15 = this;

      this.messageHandler.sendWithPromise('Cleanup', null).then(function () {
        for (var i = 0, ii = _this15.pageCache.length; i < ii; i++) {
          var page = _this15.pageCache[i];

          if (page) {
            page.cleanup();
          }
        }

        _this15.commonObjs.clear();

        _this15.fontLoader.clear();
      });
    }
  }, {
    key: "loadingParams",
    get: function get() {
      var params = this._params;
      return (0, _util.shadow)(this, 'loadingParams', {
        disableAutoFetch: params.disableAutoFetch,
        disableCreateObjectURL: params.disableCreateObjectURL,
        disableFontFace: params.disableFontFace,
        nativeImageDecoderSupport: params.nativeImageDecoderSupport
      });
    }
  }]);

  return WorkerTransport;
}();

var PDFObjects =
/*#__PURE__*/
function () {
  function PDFObjects() {
    _classCallCheck(this, PDFObjects);

    this._objs = Object.create(null);
  }

  _createClass(PDFObjects, [{
    key: "_ensureObj",
    value: function _ensureObj(objId) {
      if (this._objs[objId]) {
        return this._objs[objId];
      }

      return this._objs[objId] = {
        capability: (0, _util.createPromiseCapability)(),
        data: null,
        resolved: false
      };
    }
  }, {
    key: "get",
    value: function get(objId) {
      var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;

      if (callback) {
        this._ensureObj(objId).capability.promise.then(callback);

        return null;
      }

      var obj = this._objs[objId];

      if (!obj || !obj.resolved) {
        throw new Error("Requesting object that isn't resolved yet ".concat(objId, "."));
      }

      return obj.data;
    }
  }, {
    key: "has",
    value: function has(objId) {
      var obj = this._objs[objId];
      return obj ? obj.resolved : false;
    }
  }, {
    key: "resolve",
    value: function resolve(objId, data) {
      var obj = this._ensureObj(objId);

      obj.resolved = true;
      obj.data = data;
      obj.capability.resolve(data);
    }
  }, {
    key: "clear",
    value: function clear() {
      this._objs = Object.create(null);
    }
  }]);

  return PDFObjects;
}();

var RenderTask =
/*#__PURE__*/
function () {
  function RenderTask(internalRenderTask) {
    _classCallCheck(this, RenderTask);

    this._internalRenderTask = internalRenderTask;
    this.onContinue = null;
  }

  _createClass(RenderTask, [{
    key: "cancel",
    value: function cancel() {
      this._internalRenderTask.cancel();
    }
  }, {
    key: "then",
    value: function then(onFulfilled, onRejected) {
      (0, _util.deprecated)('RenderTask.then method, use the `promise` getter instead.');
      return this.promise.then.apply(this.promise, arguments);
    }
  }, {
    key: "promise",
    get: function get() {
      return this._internalRenderTask.capability.promise;
    }
  }]);

  return RenderTask;
}();

var InternalRenderTask = function InternalRenderTaskClosure() {
  var canvasInRendering = new WeakSet();

  var InternalRenderTask =
  /*#__PURE__*/
  function () {
    function InternalRenderTask(_ref11) {
      var callback = _ref11.callback,
          params = _ref11.params,
          objs = _ref11.objs,
          commonObjs = _ref11.commonObjs,
          operatorList = _ref11.operatorList,
          pageNumber = _ref11.pageNumber,
          canvasFactory = _ref11.canvasFactory,
          webGLContext = _ref11.webGLContext,
          _ref11$useRequestAnim = _ref11.useRequestAnimationFrame,
          useRequestAnimationFrame = _ref11$useRequestAnim === void 0 ? false : _ref11$useRequestAnim,
          _ref11$pdfBug = _ref11.pdfBug,
          pdfBug = _ref11$pdfBug === void 0 ? false : _ref11$pdfBug;

      _classCallCheck(this, InternalRenderTask);

      this.callback = callback;
      this.params = params;
      this.objs = objs;
      this.commonObjs = commonObjs;
      this.operatorListIdx = null;
      this.operatorList = operatorList;
      this.pageNumber = pageNumber;
      this.canvasFactory = canvasFactory;
      this.webGLContext = webGLContext;
      this._pdfBug = pdfBug;
      this.running = false;
      this.graphicsReadyCallback = null;
      this.graphicsReady = false;
      this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== 'undefined';
      this.cancelled = false;
      this.capability = (0, _util.createPromiseCapability)();
      this.task = new RenderTask(this);
      this._continueBound = this._continue.bind(this);
      this._scheduleNextBound = this._scheduleNext.bind(this);
      this._nextBound = this._next.bind(this);
      this._canvas = params.canvasContext.canvas;
    }

    _createClass(InternalRenderTask, [{
      key: "initializeGraphics",
      value: function initializeGraphics() {
        var transparency = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;

        if (this.cancelled) {
          return;
        }

        if (this._canvas) {
          if (canvasInRendering.has(this._canvas)) {
            throw new Error('Cannot use the same canvas during multiple render() operations. ' + 'Use different canvas or ensure previous operations were ' + 'cancelled or completed.');
          }

          canvasInRendering.add(this._canvas);
        }

        if (this._pdfBug && _global_scope.default.StepperManager && _global_scope.default.StepperManager.enabled) {
          this.stepper = _global_scope.default.StepperManager.create(this.pageNumber - 1);
          this.stepper.init(this.operatorList);
          this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();
        }

        var _this$params = this.params,
            canvasContext = _this$params.canvasContext,
            viewport = _this$params.viewport,
            transform = _this$params.transform,
            imageLayer = _this$params.imageLayer,
            background = _this$params.background;
        this.gfx = new _canvas.CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.webGLContext, imageLayer);
        this.gfx.beginDrawing({
          transform: transform,
          viewport: viewport,
          transparency: transparency,
          background: background
        });
        this.operatorListIdx = 0;
        this.graphicsReady = true;

        if (this.graphicsReadyCallback) {
          this.graphicsReadyCallback();
        }
      }
    }, {
      key: "cancel",
      value: function cancel() {
        var error = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
        this.running = false;
        this.cancelled = true;

        if (this.gfx) {
          this.gfx.endDrawing();
        }

        if (this._canvas) {
          canvasInRendering.delete(this._canvas);
        }

        this.callback(error || new _dom_utils.RenderingCancelledException("Rendering cancelled, page ".concat(this.pageNumber), 'canvas'));
      }
    }, {
      key: "operatorListChanged",
      value: function 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();
      }
    }, {
      key: "_continue",
      value: function _continue() {
        this.running = true;

        if (this.cancelled) {
          return;
        }

        if (this.task.onContinue) {
          this.task.onContinue(this._scheduleNextBound);
        } else {
          this._scheduleNext();
        }
      }
    }, {
      key: "_scheduleNext",
      value: function _scheduleNext() {
        var _this16 = this;

        if (this._useRequestAnimationFrame) {
          window.requestAnimationFrame(function () {
            _this16._nextBound().catch(_this16.cancel.bind(_this16));
          });
        } else {
          Promise.resolve().then(this._nextBound).catch(this.cancel.bind(this));
        }
      }
    }, {
      key: "_next",
      value: function () {
        var _next2 = _asyncToGenerator(
        /*#__PURE__*/
        _regenerator.default.mark(function _callee() {
          return _regenerator.default.wrap(function _callee$(_context) {
            while (1) {
              switch (_context.prev = _context.next) {
                case 0:
                  if (!this.cancelled) {
                    _context.next = 2;
                    break;
                  }

                  return _context.abrupt("return");

                case 2:
                  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();

                      if (this._canvas) {
                        canvasInRendering.delete(this._canvas);
                      }

                      this.callback();
                    }
                  }

                case 4:
                case "end":
                  return _context.stop();
              }
            }
          }, _callee, this);
        }));

        function _next() {
          return _next2.apply(this, arguments);
        }

        return _next;
      }()
    }]);

    return InternalRenderTask;
  }();

  return InternalRenderTask;
}();

var version = '2.1.266';
exports.version = version;
var build = '81f5835c';
exports.build = build;

/***/ }),
/* 147 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = __w_pdfjs_require__(148);

/***/ }),
/* 148 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var g = function () {
  return this || (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self;
}() || Function("return this")();

var hadRuntime = g.regeneratorRuntime && Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
var oldRuntime = hadRuntime && g.regeneratorRuntime;
g.regeneratorRuntime = undefined;
module.exports = __w_pdfjs_require__(149);

if (hadRuntime) {
  g.regeneratorRuntime = oldRuntime;
} else {
  try {
    delete g.regeneratorRuntime;
  } catch (e) {
    g.regeneratorRuntime = undefined;
  }
}

/***/ }),
/* 149 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(module) {

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

!function (global) {
  "use strict";

  var Op = Object.prototype;
  var hasOwn = Op.hasOwnProperty;
  var undefined;
  var $Symbol = typeof Symbol === "function" ? Symbol : {};
  var iteratorSymbol = $Symbol.iterator || "@@iterator";
  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  var inModule = ( false ? undefined : _typeof(module)) === "object";
  var runtime = global.regeneratorRuntime;

  if (runtime) {
    if (inModule) {
      module.exports = runtime;
    }

    return;
  }

  runtime = global.regeneratorRuntime = inModule ? module.exports : {};

  function wrap(innerFn, outerFn, self, tryLocsList) {
    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
    var generator = Object.create(protoGenerator.prototype);
    var context = new Context(tryLocsList || []);
    generator._invoke = makeInvokeMethod(innerFn, self, context);
    return generator;
  }

  runtime.wrap = wrap;

  function tryCatch(fn, obj, arg) {
    try {
      return {
        type: "normal",
        arg: fn.call(obj, arg)
      };
    } catch (err) {
      return {
        type: "throw",
        arg: err
      };
    }
  }

  var GenStateSuspendedStart = "suspendedStart";
  var GenStateSuspendedYield = "suspendedYield";
  var GenStateExecuting = "executing";
  var GenStateCompleted = "completed";
  var ContinueSentinel = {};

  function Generator() {}

  function GeneratorFunction() {}

  function GeneratorFunctionPrototype() {}

  var IteratorPrototype = {};

  IteratorPrototype[iteratorSymbol] = function () {
    return this;
  };

  var getProto = Object.getPrototypeOf;
  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));

  if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
    IteratorPrototype = NativeIteratorPrototype;
  }

  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  GeneratorFunctionPrototype.constructor = GeneratorFunction;
  GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction";

  function defineIteratorMethods(prototype) {
    ["next", "throw", "return"].forEach(function (method) {
      prototype[method] = function (arg) {
        return this._invoke(method, arg);
      };
    });
  }

  runtime.isGeneratorFunction = function (genFun) {
    var ctor = typeof genFun === "function" && genFun.constructor;
    return ctor ? ctor === GeneratorFunction || (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
  };

  runtime.mark = function (genFun) {
    if (Object.setPrototypeOf) {
      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
    } else {
      genFun.__proto__ = GeneratorFunctionPrototype;

      if (!(toStringTagSymbol in genFun)) {
        genFun[toStringTagSymbol] = "GeneratorFunction";
      }
    }

    genFun.prototype = Object.create(Gp);
    return genFun;
  };

  runtime.awrap = function (arg) {
    return {
      __await: arg
    };
  };

  function AsyncIterator(generator) {
    function invoke(method, arg, resolve, reject) {
      var record = tryCatch(generator[method], generator, arg);

      if (record.type === "throw") {
        reject(record.arg);
      } else {
        var result = record.arg;
        var value = result.value;

        if (value && _typeof(value) === "object" && hasOwn.call(value, "__await")) {
          return Promise.resolve(value.__await).then(function (value) {
            invoke("next", value, resolve, reject);
          }, function (err) {
            invoke("throw", err, resolve, reject);
          });
        }

        return Promise.resolve(value).then(function (unwrapped) {
          result.value = unwrapped;
          resolve(result);
        }, function (error) {
          return invoke("throw", error, resolve, reject);
        });
      }
    }

    var previousPromise;

    function enqueue(method, arg) {
      function callInvokeWithMethodAndArg() {
        return new Promise(function (resolve, reject) {
          invoke(method, arg, resolve, reject);
        });
      }

      return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
    }

    this._invoke = enqueue;
  }

  defineIteratorMethods(AsyncIterator.prototype);

  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
    return this;
  };

  runtime.AsyncIterator = AsyncIterator;

  runtime.async = function (innerFn, outerFn, self, tryLocsList) {
    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));
    return runtime.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
      return result.done ? result.value : iter.next();
    });
  };

  function makeInvokeMethod(innerFn, self, context) {
    var state = GenStateSuspendedStart;
    return function invoke(method, arg) {
      if (state === GenStateExecuting) {
        throw new Error("Generator is already running");
      }

      if (state === GenStateCompleted) {
        if (method === "throw") {
          throw arg;
        }

        return doneResult();
      }

      context.method = method;
      context.arg = arg;

      while (true) {
        var delegate = context.delegate;

        if (delegate) {
          var delegateResult = maybeInvokeDelegate(delegate, context);

          if (delegateResult) {
            if (delegateResult === ContinueSentinel) continue;
            return delegateResult;
          }
        }

        if (context.method === "next") {
          context.sent = context._sent = context.arg;
        } else if (context.method === "throw") {
          if (state === GenStateSuspendedStart) {
            state = GenStateCompleted;
            throw context.arg;
          }

          context.dispatchException(context.arg);
        } else if (context.method === "return") {
          context.abrupt("return", context.arg);
        }

        state = GenStateExecuting;
        var record = tryCatch(innerFn, self, context);

        if (record.type === "normal") {
          state = context.done ? GenStateCompleted : GenStateSuspendedYield;

          if (record.arg === ContinueSentinel) {
            continue;
          }

          return {
            value: record.arg,
            done: context.done
          };
        } else if (record.type === "throw") {
          state = GenStateCompleted;
          context.method = "throw";
          context.arg = record.arg;
        }
      }
    };
  }

  function maybeInvokeDelegate(delegate, context) {
    var method = delegate.iterator[context.method];

    if (method === undefined) {
      context.delegate = null;

      if (context.method === "throw") {
        if (delegate.iterator.return) {
          context.method = "return";
          context.arg = undefined;
          maybeInvokeDelegate(delegate, context);

          if (context.method === "throw") {
            return ContinueSentinel;
          }
        }

        context.method = "throw";
        context.arg = new TypeError("The iterator does not provide a 'throw' method");
      }

      return ContinueSentinel;
    }

    var record = tryCatch(method, delegate.iterator, context.arg);

    if (record.type === "throw") {
      context.method = "throw";
      context.arg = record.arg;
      context.delegate = null;
      return ContinueSentinel;
    }

    var info = record.arg;

    if (!info) {
      context.method = "throw";
      context.arg = new TypeError("iterator result is not an object");
      context.delegate = null;
      return ContinueSentinel;
    }

    if (info.done) {
      context[delegate.resultName] = info.value;
      context.next = delegate.nextLoc;

      if (context.method !== "return") {
        context.method = "next";
        context.arg = undefined;
      }
    } else {
      return info;
    }

    context.delegate = null;
    return ContinueSentinel;
  }

  defineIteratorMethods(Gp);
  Gp[toStringTagSymbol] = "Generator";

  Gp[iteratorSymbol] = function () {
    return this;
  };

  Gp.toString = function () {
    return "[object Generator]";
  };

  function pushTryEntry(locs) {
    var entry = {
      tryLoc: locs[0]
    };

    if (1 in locs) {
      entry.catchLoc = locs[1];
    }

    if (2 in locs) {
      entry.finallyLoc = locs[2];
      entry.afterLoc = locs[3];
    }

    this.tryEntries.push(entry);
  }

  function resetTryEntry(entry) {
    var record = entry.completion || {};
    record.type = "normal";
    delete record.arg;
    entry.completion = record;
  }

  function Context(tryLocsList) {
    this.tryEntries = [{
      tryLoc: "root"
    }];
    tryLocsList.forEach(pushTryEntry, this);
    this.reset(true);
  }

  runtime.keys = function (object) {
    var keys = [];

    for (var key in object) {
      keys.push(key);
    }

    keys.reverse();
    return function next() {
      while (keys.length) {
        var key = keys.pop();

        if (key in object) {
          next.value = key;
          next.done = false;
          return next;
        }
      }

      next.done = true;
      return next;
    };
  };

  function values(iterable) {
    if (iterable) {
      var iteratorMethod = iterable[iteratorSymbol];

      if (iteratorMethod) {
        return iteratorMethod.call(iterable);
      }

      if (typeof iterable.next === "function") {
        return iterable;
      }

      if (!isNaN(iterable.length)) {
        var i = -1,
            next = function next() {
          while (++i < iterable.length) {
            if (hasOwn.call(iterable, i)) {
              next.value = iterable[i];
              next.done = false;
              return next;
            }
          }

          next.value = undefined;
          next.done = true;
          return next;
        };

        return next.next = next;
      }
    }

    return {
      next: doneResult
    };
  }

  runtime.values = values;

  function doneResult() {
    return {
      value: undefined,
      done: true
    };
  }

  Context.prototype = {
    constructor: Context,
    reset: function reset(skipTempReset) {
      this.prev = 0;
      this.next = 0;
      this.sent = this._sent = undefined;
      this.done = false;
      this.delegate = null;
      this.method = "next";
      this.arg = undefined;
      this.tryEntries.forEach(resetTryEntry);

      if (!skipTempReset) {
        for (var name in this) {
          if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
            this[name] = undefined;
          }
        }
      }
    },
    stop: function stop() {
      this.done = true;
      var rootEntry = this.tryEntries[0];
      var rootRecord = rootEntry.completion;

      if (rootRecord.type === "throw") {
        throw rootRecord.arg;
      }

      return this.rval;
    },
    dispatchException: function dispatchException(exception) {
      if (this.done) {
        throw exception;
      }

      var context = this;

      function handle(loc, caught) {
        record.type = "throw";
        record.arg = exception;
        context.next = loc;

        if (caught) {
          context.method = "next";
          context.arg = undefined;
        }

        return !!caught;
      }

      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        var record = entry.completion;

        if (entry.tryLoc === "root") {
          return handle("end");
        }

        if (entry.tryLoc <= this.prev) {
          var hasCatch = hasOwn.call(entry, "catchLoc");
          var hasFinally = hasOwn.call(entry, "finallyLoc");

          if (hasCatch && hasFinally) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            } else if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }
          } else if (hasCatch) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            }
          } else if (hasFinally) {
            if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }
          } else {
            throw new Error("try statement without catch or finally");
          }
        }
      }
    },
    abrupt: function abrupt(type, arg) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
          var finallyEntry = entry;
          break;
        }
      }

      if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
        finallyEntry = null;
      }

      var record = finallyEntry ? finallyEntry.completion : {};
      record.type = type;
      record.arg = arg;

      if (finallyEntry) {
        this.method = "next";
        this.next = finallyEntry.finallyLoc;
        return ContinueSentinel;
      }

      return this.complete(record);
    },
    complete: function complete(record, afterLoc) {
      if (record.type === "throw") {
        throw record.arg;
      }

      if (record.type === "break" || record.type === "continue") {
        this.next = record.arg;
      } else if (record.type === "return") {
        this.rval = this.arg = record.arg;
        this.method = "return";
        this.next = "end";
      } else if (record.type === "normal" && afterLoc) {
        this.next = afterLoc;
      }

      return ContinueSentinel;
    },
    finish: function finish(finallyLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.finallyLoc === finallyLoc) {
          this.complete(entry.completion, entry.afterLoc);
          resetTryEntry(entry);
          return ContinueSentinel;
        }
      }
    },
    "catch": function _catch(tryLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.tryLoc === tryLoc) {
          var record = entry.completion;

          if (record.type === "throw") {
            var thrown = record.arg;
            resetTryEntry(entry);
          }

          return thrown;
        }
      }

      throw new Error("illegal catch attempt");
    },
    delegateYield: function delegateYield(iterable, resultName, nextLoc) {
      this.delegate = {
        iterator: values(iterable),
        resultName: resultName,
        nextLoc: nextLoc
      };

      if (this.method === "next") {
        this.arg = undefined;
      }

      return ContinueSentinel;
    }
  };
}(function () {
  return this || (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self;
}() || Function("return this")());
/* WEBPACK VAR INJECTION */}.call(this, __w_pdfjs_require__(150)(module)))

/***/ }),
/* 150 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (module) {
  if (!module.webpackPolyfill) {
    module.deprecate = function () {};

    module.paths = [];
    if (!module.children) module.children = [];
    Object.defineProperty(module, "loaded", {
      enumerable: true,
      get: function get() {
        return module.l;
      }
    });
    Object.defineProperty(module, "id", {
      enumerable: true,
      get: function get() {
        return module.i;
      }
    });
    module.webpackPolyfill = 1;
  }

  return module;
};

/***/ }),
/* 151 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.addLinkAttributes = addLinkAttributes;
exports.getFilenameFromUrl = getFilenameFromUrl;
exports.loadScript = loadScript;
exports.DummyStatTimer = exports.StatTimer = exports.DOMSVGFactory = exports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = exports.LinkTarget = exports.RenderingCancelledException = exports.PageViewport = void 0;

var _util = __w_pdfjs_require__(1);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var DEFAULT_LINK_REL = 'noopener noreferrer nofollow';
exports.DEFAULT_LINK_REL = DEFAULT_LINK_REL;
var SVG_NS = 'http://www.w3.org/2000/svg';

var DOMCanvasFactory =
/*#__PURE__*/
function () {
  function DOMCanvasFactory() {
    _classCallCheck(this, DOMCanvasFactory);
  }

  _createClass(DOMCanvasFactory, [{
    key: "create",
    value: function create(width, height) {
      if (width <= 0 || height <= 0) {
        throw new Error('invalid canvas size');
      }

      var canvas = document.createElement('canvas');
      var context = canvas.getContext('2d');
      canvas.width = width;
      canvas.height = height;
      return {
        canvas: canvas,
        context: context
      };
    }
  }, {
    key: "reset",
    value: function reset(canvasAndContext, width, height) {
      if (!canvasAndContext.canvas) {
        throw new Error('canvas is not specified');
      }

      if (width <= 0 || height <= 0) {
        throw new Error('invalid canvas size');
      }

      canvasAndContext.canvas.width = width;
      canvasAndContext.canvas.height = height;
    }
  }, {
    key: "destroy",
    value: function destroy(canvasAndContext) {
      if (!canvasAndContext.canvas) {
        throw new Error('canvas is not specified');
      }

      canvasAndContext.canvas.width = 0;
      canvasAndContext.canvas.height = 0;
      canvasAndContext.canvas = null;
      canvasAndContext.context = null;
    }
  }]);

  return DOMCanvasFactory;
}();

exports.DOMCanvasFactory = DOMCanvasFactory;

var DOMCMapReaderFactory =
/*#__PURE__*/
function () {
  function DOMCMapReaderFactory(_ref) {
    var _ref$baseUrl = _ref.baseUrl,
        baseUrl = _ref$baseUrl === void 0 ? null : _ref$baseUrl,
        _ref$isCompressed = _ref.isCompressed,
        isCompressed = _ref$isCompressed === void 0 ? false : _ref$isCompressed;

    _classCallCheck(this, DOMCMapReaderFactory);

    this.baseUrl = baseUrl;
    this.isCompressed = isCompressed;
  }

  _createClass(DOMCMapReaderFactory, [{
    key: "fetch",
    value: function fetch(_ref2) {
      var _this = this;

      var name = _ref2.name;

      if (!this.baseUrl) {
        return Promise.reject(new Error('The CMap "baseUrl" parameter must be specified, ensure that ' + 'the "cMapUrl" and "cMapPacked" API parameters are provided.'));
      }

      if (!name) {
        return Promise.reject(new Error('CMap name must be specified.'));
      }

      return new Promise(function (resolve, reject) {
        var url = _this.baseUrl + name + (_this.isCompressed ? '.bcmap' : '');
        var request = new XMLHttpRequest();
        request.open('GET', url, true);

        if (_this.isCompressed) {
          request.responseType = 'arraybuffer';
        }

        request.onreadystatechange = function () {
          if (request.readyState !== XMLHttpRequest.DONE) {
            return;
          }

          if (request.status === 200 || request.status === 0) {
            var data;

            if (_this.isCompressed && request.response) {
              data = new Uint8Array(request.response);
            } else if (!_this.isCompressed && request.responseText) {
              data = (0, _util.stringToBytes)(request.responseText);
            }

            if (data) {
              resolve({
                cMapData: data,
                compressionType: _this.isCompressed ? _util.CMapCompressionType.BINARY : _util.CMapCompressionType.NONE
              });
              return;
            }
          }

          reject(new Error('Unable to load ' + (_this.isCompressed ? 'binary ' : '') + 'CMap at: ' + url));
        };

        request.send(null);
      });
    }
  }]);

  return DOMCMapReaderFactory;
}();

exports.DOMCMapReaderFactory = DOMCMapReaderFactory;

var DOMSVGFactory =
/*#__PURE__*/
function () {
  function DOMSVGFactory() {
    _classCallCheck(this, DOMSVGFactory);
  }

  _createClass(DOMSVGFactory, [{
    key: "create",
    value: function create(width, height) {
      (0, _util.assert)(width > 0 && height > 0, 'Invalid SVG dimensions');
      var svg = document.createElementNS(SVG_NS, 'svg:svg');
      svg.setAttribute('version', '1.1');
      svg.setAttribute('width', width + 'px');
      svg.setAttribute('height', height + 'px');
      svg.setAttribute('preserveAspectRatio', 'none');
      svg.setAttribute('viewBox', '0 0 ' + width + ' ' + height);
      return svg;
    }
  }, {
    key: "createElement",
    value: function createElement(type) {
      (0, _util.assert)(typeof type === 'string', 'Invalid SVG element type');
      return document.createElementNS(SVG_NS, type);
    }
  }]);

  return DOMSVGFactory;
}();

exports.DOMSVGFactory = DOMSVGFactory;

var PageViewport =
/*#__PURE__*/
function () {
  function PageViewport(_ref3) {
    var viewBox = _ref3.viewBox,
        scale = _ref3.scale,
        rotation = _ref3.rotation,
        _ref3$offsetX = _ref3.offsetX,
        offsetX = _ref3$offsetX === void 0 ? 0 : _ref3$offsetX,
        _ref3$offsetY = _ref3.offsetY,
        offsetY = _ref3$offsetY === void 0 ? 0 : _ref3$offsetY,
        _ref3$dontFlip = _ref3.dontFlip,
        dontFlip = _ref3$dontFlip === void 0 ? false : _ref3$dontFlip;

    _classCallCheck(this, PageViewport);

    this.viewBox = viewBox;
    this.scale = scale;
    this.rotation = rotation;
    this.offsetX = offsetX;
    this.offsetY = offsetY;
    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;

      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;
    }

    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;
  }

  _createClass(PageViewport, [{
    key: "clone",
    value: function clone() {
      var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
          _ref4$scale = _ref4.scale,
          scale = _ref4$scale === void 0 ? this.scale : _ref4$scale,
          _ref4$rotation = _ref4.rotation,
          rotation = _ref4$rotation === void 0 ? this.rotation : _ref4$rotation,
          _ref4$dontFlip = _ref4.dontFlip,
          dontFlip = _ref4$dontFlip === void 0 ? false : _ref4$dontFlip;

      return new PageViewport({
        viewBox: this.viewBox.slice(),
        scale: scale,
        rotation: rotation,
        offsetX: this.offsetX,
        offsetY: this.offsetY,
        dontFlip: dontFlip
      });
    }
  }, {
    key: "convertToViewportPoint",
    value: function convertToViewportPoint(x, y) {
      return _util.Util.applyTransform([x, y], this.transform);
    }
  }, {
    key: "convertToViewportRectangle",
    value: function convertToViewportRectangle(rect) {
      var tl = _util.Util.applyTransform([rect[0], rect[1]], this.transform);

      var br = _util.Util.applyTransform([rect[2], rect[3]], this.transform);

      return [tl[0], tl[1], br[0], br[1]];
    }
  }, {
    key: "convertToPdfPoint",
    value: function convertToPdfPoint(x, y) {
      return _util.Util.applyInverseTransform([x, y], this.transform);
    }
  }]);

  return PageViewport;
}();

exports.PageViewport = PageViewport;

var RenderingCancelledException = function RenderingCancelledException() {
  function RenderingCancelledException(msg, type) {
    this.message = msg;
    this.type = type;
  }

  RenderingCancelledException.prototype = new Error();
  RenderingCancelledException.prototype.name = 'RenderingCancelledException';
  RenderingCancelledException.constructor = RenderingCancelledException;
  return RenderingCancelledException;
}();

exports.RenderingCancelledException = RenderingCancelledException;
var LinkTarget = {
  NONE: 0,
  SELF: 1,
  BLANK: 2,
  PARENT: 3,
  TOP: 4
};
exports.LinkTarget = LinkTarget;
var LinkTargetStringMap = ['', '_self', '_blank', '_parent', '_top'];

function addLinkAttributes(link) {
  var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
      url = _ref5.url,
      target = _ref5.target,
      rel = _ref5.rel;

  link.href = link.title = url ? (0, _util.removeNullCharacters)(url) : '';

  if (url) {
    var LinkTargetValues = Object.values(LinkTarget);
    var targetIndex = LinkTargetValues.includes(target) ? target : LinkTarget.NONE;
    link.target = LinkTargetStringMap[targetIndex];
    link.rel = typeof rel === 'string' ? rel : DEFAULT_LINK_REL;
  }
}

function getFilenameFromUrl(url) {
  var anchor = url.indexOf('#');
  var query = url.indexOf('?');
  var end = Math.min(anchor > 0 ? anchor : url.length, query > 0 ? query : url.length);
  return url.substring(url.lastIndexOf('/', end) + 1, end);
}

var StatTimer =
/*#__PURE__*/
function () {
  function StatTimer() {
    var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;

    _classCallCheck(this, StatTimer);

    this.enabled = !!enable;
    this.started = Object.create(null);
    this.times = [];
  }

  _createClass(StatTimer, [{
    key: "time",
    value: function time(name) {
      if (!this.enabled) {
        return;
      }

      if (name in this.started) {
        (0, _util.warn)('Timer is already running for ' + name);
      }

      this.started[name] = Date.now();
    }
  }, {
    key: "timeEnd",
    value: function timeEnd(name) {
      if (!this.enabled) {
        return;
      }

      if (!(name in this.started)) {
        (0, _util.warn)('Timer has not been started for ' + name);
      }

      this.times.push({
        'name': name,
        'start': this.started[name],
        'end': Date.now()
      });
      delete this.started[name];
    }
  }, {
    key: "toString",
    value: function toString() {
      var times = this.times;
      var out = '',
          longest = 0;

      for (var i = 0, ii = times.length; i < ii; ++i) {
        var name = times[i]['name'];

        if (name.length > longest) {
          longest = name.length;
        }
      }

      for (var _i = 0, _ii = times.length; _i < _ii; ++_i) {
        var span = times[_i];
        var duration = span.end - span.start;
        out += "".concat(span['name'].padEnd(longest), " ").concat(duration, "ms\n");
      }

      return out;
    }
  }]);

  return StatTimer;
}();

exports.StatTimer = StatTimer;

var DummyStatTimer =
/*#__PURE__*/
function () {
  function DummyStatTimer() {
    _classCallCheck(this, DummyStatTimer);

    (0, _util.unreachable)('Cannot initialize DummyStatTimer.');
  }

  _createClass(DummyStatTimer, null, [{
    key: "time",
    value: function time(name) {}
  }, {
    key: "timeEnd",
    value: function timeEnd(name) {}
  }, {
    key: "toString",
    value: function toString() {
      return '';
    }
  }]);

  return DummyStatTimer;
}();

exports.DummyStatTimer = DummyStatTimer;

function loadScript(src) {
  return new Promise(function (resolve, reject) {
    var script = document.createElement('script');
    script.src = src;
    script.onload = resolve;

    script.onerror = function () {
      reject(new Error("Cannot load script at: ".concat(script.src)));
    };

    (document.head || document.documentElement).appendChild(script);
  });
}

/***/ }),
/* 152 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.FontLoader = exports.FontFaceObject = void 0;

var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147));

var _util = __w_pdfjs_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var BaseFontLoader =
/*#__PURE__*/
function () {
  function BaseFontLoader(_ref) {
    var docId = _ref.docId,
        onUnsupportedFeature = _ref.onUnsupportedFeature;

    _classCallCheck(this, BaseFontLoader);

    if (this.constructor === BaseFontLoader) {
      (0, _util.unreachable)('Cannot initialize BaseFontLoader.');
    }

    this.docId = docId;
    this._onUnsupportedFeature = onUnsupportedFeature;
    this.nativeFontFaces = [];
    this.styleElement = null;
  }

  _createClass(BaseFontLoader, [{
    key: "addNativeFontFace",
    value: function addNativeFontFace(nativeFontFace) {
      this.nativeFontFaces.push(nativeFontFace);
      document.fonts.add(nativeFontFace);
    }
  }, {
    key: "insertRule",
    value: function insertRule(rule) {
      var styleElement = this.styleElement;

      if (!styleElement) {
        styleElement = this.styleElement = document.createElement('style');
        styleElement.id = "PDFJS_FONT_STYLE_TAG_".concat(this.docId);
        document.documentElement.getElementsByTagName('head')[0].appendChild(styleElement);
      }

      var styleSheet = styleElement.sheet;
      styleSheet.insertRule(rule, styleSheet.cssRules.length);
    }
  }, {
    key: "clear",
    value: function clear() {
      this.nativeFontFaces.forEach(function (nativeFontFace) {
        document.fonts.delete(nativeFontFace);
      });
      this.nativeFontFaces.length = 0;

      if (this.styleElement) {
        this.styleElement.remove();
        this.styleElement = null;
      }
    }
  }, {
    key: "bind",
    value: function () {
      var _bind = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee(font) {
        var _this = this;

        var nativeFontFace, rule;
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                if (!(font.attached || font.missingFile)) {
                  _context.next = 2;
                  break;
                }

                return _context.abrupt("return");

              case 2:
                font.attached = true;

                if (!this.isFontLoadingAPISupported) {
                  _context.next = 19;
                  break;
                }

                nativeFontFace = font.createNativeFontFace();

                if (!nativeFontFace) {
                  _context.next = 18;
                  break;
                }

                this.addNativeFontFace(nativeFontFace);
                _context.prev = 7;
                _context.next = 10;
                return nativeFontFace.loaded;

              case 10:
                _context.next = 18;
                break;

              case 12:
                _context.prev = 12;
                _context.t0 = _context["catch"](7);

                this._onUnsupportedFeature({
                  featureId: _util.UNSUPPORTED_FEATURES.font
                });

                (0, _util.warn)("Failed to load font '".concat(nativeFontFace.family, "': '").concat(_context.t0, "'."));
                font.disableFontFace = true;
                throw _context.t0;

              case 18:
                return _context.abrupt("return");

              case 19:
                rule = font.createFontFaceRule();

                if (!rule) {
                  _context.next = 25;
                  break;
                }

                this.insertRule(rule);

                if (!this.isSyncFontLoadingSupported) {
                  _context.next = 24;
                  break;
                }

                return _context.abrupt("return");

              case 24:
                return _context.abrupt("return", new Promise(function (resolve) {
                  var request = _this._queueLoadingCallback(resolve);

                  _this._prepareFontLoadEvent([rule], [font], request);
                }));

              case 25:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this, [[7, 12]]);
      }));

      function bind(_x) {
        return _bind.apply(this, arguments);
      }

      return bind;
    }()
  }, {
    key: "_queueLoadingCallback",
    value: function _queueLoadingCallback(callback) {
      (0, _util.unreachable)('Abstract method `_queueLoadingCallback`.');
    }
  }, {
    key: "_prepareFontLoadEvent",
    value: function _prepareFontLoadEvent(rules, fontsToLoad, request) {
      (0, _util.unreachable)('Abstract method `_prepareFontLoadEvent`.');
    }
  }, {
    key: "isFontLoadingAPISupported",
    get: function get() {
      (0, _util.unreachable)('Abstract method `isFontLoadingAPISupported`.');
    }
  }, {
    key: "isSyncFontLoadingSupported",
    get: function get() {
      (0, _util.unreachable)('Abstract method `isSyncFontLoadingSupported`.');
    }
  }, {
    key: "_loadTestFont",
    get: function get() {
      (0, _util.unreachable)('Abstract method `_loadTestFont`.');
    }
  }]);

  return BaseFontLoader;
}();

var FontLoader;
exports.FontLoader = FontLoader;
{
  exports.FontLoader = FontLoader =
  /*#__PURE__*/
  function (_BaseFontLoader) {
    _inherits(GenericFontLoader, _BaseFontLoader);

    function GenericFontLoader(docId) {
      var _this2;

      _classCallCheck(this, GenericFontLoader);

      _this2 = _possibleConstructorReturn(this, _getPrototypeOf(GenericFontLoader).call(this, docId));
      _this2.loadingContext = {
        requests: [],
        nextRequestId: 0
      };
      _this2.loadTestFontId = 0;
      return _this2;
    }

    _createClass(GenericFontLoader, [{
      key: "_queueLoadingCallback",
      value: function _queueLoadingCallback(callback) {
        function completeRequest() {
          (0, _util.assert)(!request.done, 'completeRequest() cannot be called twice.');
          request.done = true;

          while (context.requests.length > 0 && context.requests[0].done) {
            var otherRequest = context.requests.shift();
            setTimeout(otherRequest.callback, 0);
          }
        }

        var context = this.loadingContext;
        var request = {
          id: "pdfjs-font-loading-".concat(context.nextRequestId++),
          done: false,
          complete: completeRequest,
          callback: callback
        };
        context.requests.push(request);
        return request;
      }
    }, {
      key: "_prepareFontLoadEvent",
      value: function _prepareFontLoadEvent(rules, fonts, request) {
        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.substring(0, offset);
          var chunk2 = s.substring(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++;

          if (called > 30) {
            (0, _util.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".concat(Date.now()).concat(this.loadTestFontId++);
        var data = this._loadTestFont;
        var COMMENT_OFFSET = 976;
        data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId);
        var CFF_CHECKSUM_OFFSET = 16;
        var XXXX_VALUE = 0x58585858;
        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) {
          checksum = checksum - XXXX_VALUE + int32(loadTestFontId + 'XXX', i) | 0;
        }

        data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, (0, _util.string32)(checksum));
        var url = "url(data:font/opentype;base64,".concat(btoa(data), ");");
        var rule = "@font-face {font-family:\"".concat(loadTestFontId, "\";src:").concat(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();
        });
      }
    }, {
      key: "isFontLoadingAPISupported",
      get: function get() {
        var supported = typeof document !== 'undefined' && !!document.fonts;

        if (supported && typeof navigator !== 'undefined') {
          var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent);

          if (m && m[1] < 63) {
            supported = false;
          }
        }

        return (0, _util.shadow)(this, 'isFontLoadingAPISupported', supported);
      }
    }, {
      key: "isSyncFontLoadingSupported",
      get: function get() {
        var supported = false;

        if (typeof navigator === 'undefined') {
          supported = true;
        } else {
          var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent);

          if (m && m[1] >= 14) {
            supported = true;
          }
        }

        return (0, _util.shadow)(this, 'isSyncFontLoadingSupported', supported);
      }
    }, {
      key: "_loadTestFont",
      get: function get() {
        var getLoadTestFont = function getLoadTestFont() {
          return atob('T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA' + 'FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA' + 'ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA' + 'AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1' + 'AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD' + '6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM' + 'AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D' + 'IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA' + 'AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA' + 'AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB' + 'AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY' + 'AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA' + 'AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA' + 'AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC' + 'AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3' + 'Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj' + 'FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==');
        };

        return (0, _util.shadow)(this, '_loadTestFont', getLoadTestFont());
      }
    }]);

    return GenericFontLoader;
  }(BaseFontLoader);
}
var IsEvalSupportedCached = {
  get value() {
    return (0, _util.shadow)(this, 'value', (0, _util.isEvalSupported)());
  }

};

var FontFaceObject =
/*#__PURE__*/
function () {
  function FontFaceObject(translatedData, _ref2) {
    var _ref2$isEvalSupported = _ref2.isEvalSupported,
        isEvalSupported = _ref2$isEvalSupported === void 0 ? true : _ref2$isEvalSupported,
        _ref2$disableFontFace = _ref2.disableFontFace,
        disableFontFace = _ref2$disableFontFace === void 0 ? false : _ref2$disableFontFace,
        _ref2$ignoreErrors = _ref2.ignoreErrors,
        ignoreErrors = _ref2$ignoreErrors === void 0 ? false : _ref2$ignoreErrors,
        _ref2$onUnsupportedFe = _ref2.onUnsupportedFeature,
        onUnsupportedFeature = _ref2$onUnsupportedFe === void 0 ? null : _ref2$onUnsupportedFe,
        _ref2$fontRegistry = _ref2.fontRegistry,
        fontRegistry = _ref2$fontRegistry === void 0 ? null : _ref2$fontRegistry;

    _classCallCheck(this, FontFaceObject);

    this.compiledGlyphs = Object.create(null);

    for (var i in translatedData) {
      this[i] = translatedData[i];
    }

    this.isEvalSupported = isEvalSupported !== false;
    this.disableFontFace = disableFontFace === true;
    this.ignoreErrors = ignoreErrors === true;
    this._onUnsupportedFeature = onUnsupportedFeature;
    this.fontRegistry = fontRegistry;
  }

  _createClass(FontFaceObject, [{
    key: "createNativeFontFace",
    value: function createNativeFontFace() {
      if (!this.data || this.disableFontFace) {
        return null;
      }

      var nativeFontFace = new FontFace(this.loadedName, this.data, {});

      if (this.fontRegistry) {
        this.fontRegistry.registerFont(this);
      }

      return nativeFontFace;
    }
  }, {
    key: "createFontFaceRule",
    value: function createFontFaceRule() {
      if (!this.data || this.disableFontFace) {
        return null;
      }

      var data = (0, _util.bytesToString)(new Uint8Array(this.data));
      var url = "url(data:".concat(this.mimetype, ";base64,").concat(btoa(data), ");");
      var rule = "@font-face {font-family:\"".concat(this.loadedName, "\";src:").concat(url, "}");

      if (this.fontRegistry) {
        this.fontRegistry.registerFont(this, url);
      }

      return rule;
    }
  }, {
    key: "getPathGenerator",
    value: function getPathGenerator(objs, character) {
      if (this.compiledGlyphs[character] !== undefined) {
        return this.compiledGlyphs[character];
      }

      var cmds, current;

      try {
        cmds = objs.get(this.loadedName + '_path_' + character);
      } catch (ex) {
        if (!this.ignoreErrors) {
          throw ex;
        }

        if (this._onUnsupportedFeature) {
          this._onUnsupportedFeature({
            featureId: _util.UNSUPPORTED_FEATURES.font
          });
        }

        (0, _util.warn)("getPathGenerator - ignoring character: \"".concat(ex, "\"."));
        return this.compiledGlyphs[character] = function (c, size) {};
      }

      if (this.isEvalSupported && IsEvalSupportedCached.value) {
        var args,
            js = '';

        for (var i = 0, ii = cmds.length; i < ii; i++) {
          current = cmds[i];

          if (current.args !== undefined) {
            args = current.args.join(',');
          } else {
            args = '';
          }

          js += 'c.' + current.cmd + '(' + args + ');\n';
        }

        return this.compiledGlyphs[character] = new Function('c', 'size', js);
      }

      return this.compiledGlyphs[character] = function (c, size) {
        for (var _i = 0, _ii = cmds.length; _i < _ii; _i++) {
          current = cmds[_i];

          if (current.cmd === 'scale') {
            current.args = [size, -size];
          }

          c[current.cmd].apply(c, current.args);
        }
      };
    }
  }]);

  return FontFaceObject;
}();

exports.FontFaceObject = FontFaceObject;

/***/ }),
/* 153 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var compatibilityParams = Object.create(null);
{
  var isNodeJS = __w_pdfjs_require__(4);

  var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || '';
  var isIE = /Trident/.test(userAgent);
  var isIOSChrome = /CriOS/.test(userAgent);

  (function checkOnBlobSupport() {
    if (isIE || isIOSChrome) {
      compatibilityParams.disableCreateObjectURL = true;
    }
  })();

  (function checkFontFaceAndImage() {
    if (isNodeJS()) {
      compatibilityParams.disableFontFace = true;
      compatibilityParams.nativeImageDecoderSupport = 'none';
    }
  })();
}
exports.apiCompatibilityParams = Object.freeze(compatibilityParams);

/***/ }),
/* 154 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CanvasGraphics = void 0;

var _util = __w_pdfjs_require__(1);

var _pattern_helper = __w_pdfjs_require__(155);

var MIN_FONT_SIZE = 16;
var MAX_FONT_SIZE = 100;
var MAX_GROUP_SIZE = 4096;
var MIN_WIDTH_FACTOR = 0.65;
var COMPILE_TYPE3_GLYPHS = true;
var MAX_SIZE_TO_COMPILE = 1000;
var FULL_CHUNK_HEIGHT = 16;
var IsLittleEndianCached = {
  get value() {
    return (0, _util.shadow)(IsLittleEndianCached, 'value', (0, _util.isLittleEndian)());
  }

};

function addContextCurrentTransform(ctx) {
  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() {
        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(canvasFactory) {
    this.canvasFactory = canvasFactory;
    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];
        this.canvasFactory.reset(canvasEntry, width, height);
        canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);
      } else {
        canvasEntry = this.canvasFactory.create(width, height);
        this.cache[id] = canvasEntry;
      }

      if (trackTransform) {
        addContextCurrentTransform(canvasEntry.context);
      }

      return canvasEntry;
    },
    clear: function clear() {
      for (var id in this.cache) {
        var canvasEntry = this.cache[id];
        this.canvasFactory.destroy(canvasEntry);
        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]);
  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;
    }
  }

  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;
    }

    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;
  }

  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) {
        type = pp;
        points[p] = 0;
      } else {
        type = pp & 0x33 * type >> 4;
        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 drawOutline(c) {
    c.save();
    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() {
    this.alphaIsShape = false;
    this.fontSize = 0;
    this.fontSizeScale = 1;
    this.textMatrix = _util.IDENTITY_MATRIX;
    this.textMatrixScale = 1;
    this.fontMatrix = _util.FONT_IDENTITY_MATRIX;
    this.leading = 0;
    this.x = 0;
    this.y = 0;
    this.lineX = 0;
    this.lineY = 0;
    this.charSpacing = 0;
    this.wordSpacing = 0;
    this.textHScale = 1;
    this.textRenderingMode = _util.TextRenderingMode.FILL;
    this.textRise = 0;
    this.fillColor = '#000000';
    this.strokeColor = '#000000';
    this.patternFill = false;
    this.fillAlpha = 1;
    this.strokeAlpha = 1;
    this.lineWidth = 1;
    this.activeSMask = null;
    this.resumeSMaskCtx = null;
  }

  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() {
  var EXECUTION_TIME = 15;
  var EXECUTION_STEPS = 10;

  function CanvasGraphics(canvasCtx, commonObjs, objs, canvasFactory, webGLContext, 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.canvasFactory = canvasFactory;
    this.webGLContext = webGLContext;
    this.imageLayer = imageLayer;
    this.groupStack = [];
    this.processingType3 = null;
    this.baseTransform = null;
    this.baseTransformStack = [];
    this.groupLevel = 0;
    this.smaskStack = [];
    this.smaskCounter = 0;
    this.tempSMask = null;
    this.cachedCanvases = new CachedCanvases(this.canvasFactory);

    if (canvasCtx) {
      addContextCurrentTransform(canvasCtx);
    }

    this._cachedGetSinglePixelWidth = null;
  }

  function putBinaryImageData(ctx, imgData) {
    if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {
      ctx.putImageData(imgData, 0, 0);
      return;
    }

    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;

    if (imgData.kind === _util.ImageKind.GRAYSCALE_1BPP) {
      var srcLength = src.byteLength;
      var dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);
      var dest32DataLength = dest32.length;
      var fullSrcDiff = width + 7 >> 3;
      var white = 0xFFFFFFFF;
      var black = IsLittleEndianCached.value ? 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;
          }
        }

        while (destPos < dest32DataLength) {
          dest32[destPos++] = 0;
        }

        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
      }
    } else if (imgData.kind === _util.ImageKind.RGBA_32BPP) {
      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 === _util.ImageKind.RGB_24BPP) {
      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 {
      throw new Error("bad image kind: ".concat(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;
      var destPos = 3;

      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;
    }
  }

  function resetCtxToDefault(ctx) {
    ctx.strokeStyle = '#000000';
    ctx.fillStyle = '#000000';
    ctx.fillRule = 'nonzero';
    ctx.globalAlpha = 1;
    ctx.lineWidth = 1;
    ctx.lineCap = 'butt';
    ctx.lineJoin = 'miter';
    ctx.miterLimit = 10;
    ctx.globalCompositeOperation = 'source-over';
    ctx.font = '10px sans-serif';

    if (ctx.setLineDash !== undefined) {
      ctx.setLineDash([]);
      ctx.lineDashOffset = 0;
    }
  }

  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 + maskData[i - 2] * 152 + maskData[i - 1] * 28;
      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;
    }

    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, webGLContext) {
    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 && webGLContext.isEnabled) {
      var composed = webGLContext.composeSMask({
        layer: layerCtx.canvas,
        mask: mask,
        properties: {
          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 beginDrawing(_ref) {
      var transform = _ref.transform,
          viewport = _ref.viewport,
          _ref$transparency = _ref.transparency,
          transparency = _ref$transparency === void 0 ? false : _ref$transparency,
          _ref$background = _ref.background,
          background = _ref$background === void 0 ? null : _ref$background;
      var width = this.ctx.canvas.width;
      var height = this.ctx.canvas.height;
      this.ctx.save();
      this.ctx.fillStyle = background || '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();
        this.ctx.transform.apply(this.ctx, this.compositeCtx.mozCurrentTransform);
      }

      this.ctx.save();
      resetCtxToDefault(this.ctx);

      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;

      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 !== _util.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 (!objsPool.has(depObjId)) {
              objsPool.get(depObjId, continueCallback);
              return i;
            }
          }
        }

        i++;

        if (i === argsArrayLen) {
          return i;
        }

        if (chunkOperations && ++steps > EXECUTION_STEPS) {
          if (Date.now() > endTime) {
            continueCallback();
            return i;
          }

          steps = 0;
        }
      }
    },
    endDrawing: function CanvasGraphics_endDrawing() {
      if (this.current.activeSMask !== null) {
        this.endSMaskGroup();
      }

      this.ctx.restore();

      if (this.transparentCanvas) {
        this.ctx = this.compositeCtx;
        this.ctx.save();
        this.ctx.setTransform(1, 0, 0, 1, 0, 0);
        this.ctx.drawImage(this.transparentCanvas, 0, 0);
        this.ctx.restore();
        this.transparentCanvas = null;
      }

      this.cachedCanvases.clear();
      this.webGLContext.clear();

      if (this.imageLayer) {
        this.imageLayer.endLayout();
      }
    },
    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;
      }
    },
    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {},
    setFlatness: function CanvasGraphics_setFlatness(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':
            this.ctx.globalCompositeOperation = value;
            break;

          case 'SMask':
            if (this.current.activeSMask) {
              if (this.stateStack.length > 0 && this.stateStack[this.stateStack.length - 1].activeSMask === this.current.activeSMask) {
                this.suspendSMaskGroup();
              } else {
                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);
      activeSMask.startTransformInverse = groupCtx.mozCurrentTransformInverse;
      copyCtxState(currentCtx, groupCtx);
      this.ctx = groupCtx;
      this.setGState([['BM', 'source-over'], ['ca', 1], ['CA', 1]]);
      this.groupStack.push(currentCtx);
      this.groupLevel++;
    },
    suspendSMaskGroup: function CanvasGraphics_endSMaskGroup() {
      var groupCtx = this.ctx;
      this.groupLevel--;
      this.ctx = this.groupStack.pop();
      composeSMask(this.ctx, this.current.activeSMask, groupCtx, this.webGLContext);
      this.ctx.restore();
      this.ctx.save();
      copyCtxState(groupCtx, this.ctx);
      this.current.resumeSMaskCtx = groupCtx;

      var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform);

      this.ctx.transform.apply(this.ctx, deltaTransform);
      groupCtx.save();
      groupCtx.setTransform(1, 0, 0, 1, 0, 0);
      groupCtx.clearRect(0, 0, groupCtx.canvas.width, groupCtx.canvas.height);
      groupCtx.restore();
    },
    resumeSMaskGroup: function CanvasGraphics_endSMaskGroup() {
      var groupCtx = this.current.resumeSMaskCtx;
      var currentCtx = this.ctx;
      this.ctx = groupCtx;
      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.webGLContext);
      this.ctx.restore();
      copyCtxState(groupCtx, this.ctx);

      var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform);

      this.ctx.transform.apply(this.ctx, deltaTransform);
    },
    save: function CanvasGraphics_save() {
      this.ctx.save();
      var old = this.current;
      this.stateStack.push(old);
      this.current = old.clone();
      this.current.resumeSMaskCtx = null;
    },
    restore: function CanvasGraphics_restore() {
      if (this.current.resumeSMaskCtx) {
        this.resumeSMaskGroup();
      }

      if (this.current.activeSMask !== null && (this.stateStack.length === 0 || this.stateStack[this.stateStack.length - 1].activeSMask !== this.current.activeSMask)) {
        this.endSMaskGroup();
      }

      if (this.stateStack.length !== 0) {
        this.current = this.stateStack.pop();
        this.ctx.restore();
        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;
    },
    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 _util.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 _util.OPS.moveTo:
            x = args[j++];
            y = args[j++];
            ctx.moveTo(x, y);
            break;

          case _util.OPS.lineTo:
            x = args[j++];
            y = args[j++];
            ctx.lineTo(x, y);
            break;

          case _util.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 _util.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 _util.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 _util.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;
      ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth);
      ctx.globalAlpha = this.current.strokeAlpha;

      if (strokeColor && strokeColor.hasOwnProperty('type') && strokeColor.type === 'Pattern') {
        ctx.save();
        ctx.strokeStyle = strokeColor.getPattern(ctx, this);
        ctx.stroke();
        ctx.restore();
      } else {
        ctx.stroke();
      }

      if (consumePath) {
        this.consumePath();
      }

      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) {
        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();
    },
    clip: function CanvasGraphics_clip() {
      this.pendingClip = NORMAL_CLIP;
    },
    eoClip: function CanvasGraphics_eoClip() {
      this.pendingClip = EO_CLIP;
    },
    beginText: function CanvasGraphics_beginText() {
      this.current.textMatrix = _util.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) {
        throw new Error("Can't find font for ".concat(fontRefName));
      }

      current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix : _util.FONT_IDENTITY_MATRIX;

      if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {
        (0, _util.warn)('Invalid font matrix for font ' + fontRefName);
      }

      if (size < 0) {
        size = -size;
        current.fontDirection = -1;
      } else {
        current.fontDirection = 1;
      }

      this.current.font = fontObj;
      this.current.fontSize = size;

      if (fontObj.isType3Font) {
        return;
      }

      var name = fontObj.loadedName || 'sans-serif';
      var bold = fontObj.black ? '900' : fontObj.bold ? 'bold' : 'normal';
      var italic = fontObj.italic ? 'italic' : 'normal';
      var typeface = "\"".concat(name, "\", ").concat(fontObj.fallbackName);
      var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE : size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size;
      this.current.fontSizeScale = size / browserFontSize;
      this.ctx.font = "".concat(italic, " ").concat(bold, " ").concat(browserFontSize, "px ").concat(typeface);
    },
    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 paintChar(character, x, y, patternTransform) {
      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 & _util.TextRenderingMode.FILL_STROKE_MASK;
      var isAddToPathSet = !!(textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);
      var patternFill = current.patternFill && font.data;
      var addToPath;

      if (font.disableFontFace || isAddToPathSet || patternFill) {
        addToPath = font.getPathGenerator(this.commonObjs, character);
      }

      if (font.disableFontFace || patternFill) {
        ctx.save();
        ctx.translate(x, y);
        ctx.beginPath();
        addToPath(ctx, fontSize);

        if (patternTransform) {
          ctx.setTransform.apply(ctx, patternTransform);
        }

        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
          ctx.fill();
        }

        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
          ctx.stroke();
        }

        ctx.restore();
      } else {
        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
          ctx.fillText(character, x, y);
        }

        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.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() {
      var ctx = this.canvasFactory.create(10, 10).context;
      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 (0, _util.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 === _util.TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill;
      ctx.save();
      var patternTransform;

      if (current.patternFill) {
        ctx.save();
        var pattern = current.fillColor.getPattern(ctx, this);
        patternTransform = ctx.mozCurrentTransform;
        ctx.restore();
        ctx.fillStyle = pattern;
      }

      ctx.transform.apply(ctx, current.textMatrix);
      ctx.translate(current.x, current.y + current.textRise);

      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 & _util.TextRenderingMode.FILL_STROKE_MASK;

        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.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 ((0, _util.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) {
          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 (glyph.isInFont || font.missingFile) {
          if (simpleFillText && !accent) {
            ctx.fillText(character, scaledX, scaledY);
          } else {
            this.paintChar(character, scaledX, scaledY, patternTransform);

            if (accent) {
              scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
              scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
              this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform);
            }
          }
        }

        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) {
      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 || _util.FONT_IDENTITY_MATRIX;
      var glyphsLength = glyphs.length;
      var isTextInvisible = current.textRenderingMode === _util.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 ((0, _util.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) {
          (0, _util.warn)("Type3 character \"".concat(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.Util.applyTransform([glyph.width, 0], fontMatrix);

        width = transformed[0] * fontSize + spacing;
        ctx.translate(width, 0);
        current.x += width * textHScale;
      }

      ctx.restore();
      this.processingType3 = null;
    },
    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {},
    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) {
      this.ctx.rect(llx, lly, urx - llx, ury - lly);
      this.clip();
      this.endPath();
    },
    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {
      var _this = this;

      var pattern;

      if (IR[0] === 'TilingPattern') {
        var color = IR[1];
        var baseTransform = this.baseTransform || this.ctx.mozCurrentTransform.slice();
        var canvasGraphicsFactory = {
          createCanvasGraphics: function createCanvasGraphics(ctx) {
            return new CanvasGraphics(ctx, _this.commonObjs, _this.objs, _this.canvasFactory, _this.webGLContext);
          }
        };
        pattern = new _pattern_helper.TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform);
      } else {
        pattern = (0, _pattern_helper.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.Util.makeCssRgb(r, g, b);

      this.ctx.strokeStyle = color;
      this.current.strokeColor = color;
    },
    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
      var color = _util.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 = (0, _pattern_helper.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.Util.applyTransform([0, 0], inv);

        var br = _util.Util.applyTransform([0, height], inv);

        var ul = _util.Util.applyTransform([width, 0], inv);

        var ur = _util.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 {
        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
      }

      this.restore();
    },
    beginInlineImage: function CanvasGraphics_beginInlineImage() {
      (0, _util.unreachable)('Should not call beginInlineImage');
    },
    beginImageData: function CanvasGraphics_beginImageData() {
      (0, _util.unreachable)('Should not call beginImageData');
    },
    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix, bbox) {
      this.save();
      this.baseTransformStack.push(this.baseTransform);

      if (Array.isArray(matrix) && matrix.length === 6) {
        this.transform.apply(this, matrix);
      }

      this.baseTransform = this.ctx.mozCurrentTransform;

      if (bbox) {
        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;

      if (!group.isolated) {
        (0, _util.info)('TODO: Support non-isolated groups.');
      }

      if (group.knockout) {
        (0, _util.warn)('Knockout groups not supported.');
      }

      var currentTransform = currentCtx.mozCurrentTransform;

      if (group.matrix) {
        currentCtx.transform.apply(currentCtx, group.matrix);
      }

      if (!group.bbox) {
        throw new Error('Bounding box is required.');
      }

      var bounds = _util.Util.getAxialAlignedBoundingBox(group.bbox, currentCtx.mozCurrentTransform);

      var canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height];
      bounds = _util.Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];
      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) {
        cacheId += '_smask_' + this.smaskCounter++ % 2;
      }

      var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);
      var groupCtx = scratchCanvas.context;
      groupCtx.scale(1 / scaleX, 1 / scaleY);
      groupCtx.translate(-offsetX, -offsetY);
      groupCtx.transform.apply(groupCtx, currentTransform);

      if (group.smask) {
        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,
          startTransformInverse: null
        });
      } else {
        currentCtx.setTransform(1, 0, 0, 1, 0, 0);
        currentCtx.translate(offsetX, offsetY);
        currentCtx.scale(scaleX, scaleY);
      }

      copyCtxState(currentCtx, groupCtx);
      this.ctx = groupCtx;
      this.setGState([['BM', 'source-over'], ['ca', 1], ['CA', 1]]);
      this.groupStack.push(currentCtx);
      this.groupLevel++;
      this.current.activeSMask = null;
    },
    endGroup: function CanvasGraphics_endGroup(group) {
      this.groupLevel--;
      var groupCtx = this.ctx;
      this.ctx = this.groupStack.pop();

      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();

      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();
      resetCtxToDefault(this.ctx);
      this.current = new CanvasExtraState();

      if (Array.isArray(rect) && rect.length === 4) {
        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) {
        (0, _util.warn)('Dependent image isn\'t ready yet');
        return;
      }

      this.save();
      var ctx = this.ctx;
      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) {
        (0, _util.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) {
        (0, _util.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();
      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;

      if (typeof HTMLElement === 'function' && 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';

      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() {
      (0, _util.warn)('Unsupported \'paintXObject\' command.');
    },
    markPoint: function CanvasGraphics_markPoint(tag) {},
    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {},
    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {},
    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(tag, properties) {},
    endMarkedContent: function CanvasGraphics_endMarkedContent() {},
    beginCompat: function CanvasGraphics_beginCompat() {},
    endCompat: function CanvasGraphics_endCompat() {},
    consumePath: function CanvasGraphics_consumePath() {
      var ctx = this.ctx;

      if (this.pendingClip) {
        if (this.pendingClip === EO_CLIP) {
          ctx.clip('evenodd');
        } else {
          ctx.clip();
        }

        this.pendingClip = null;
      }

      ctx.beginPath();
    },
    getSinglePixelWidth: function getSinglePixelWidth(scale) {
      if (this._cachedGetSinglePixelWidth === null) {
        var inverse = this.ctx.mozCurrentTransformInverse;
        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 _util.OPS) {
    CanvasGraphics.prototype[_util.OPS[op]] = CanvasGraphics.prototype[op];
  }

  return CanvasGraphics;
}();

exports.CanvasGraphics = CanvasGraphics;

/***/ }),
/* 155 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getShadingPatternFromIR = getShadingPatternFromIR;
exports.TilingPattern = void 0;

var _util = __w_pdfjs_require__(1);

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) {
    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:
        throw new Error('illegal figure');
    }
  }

  function createMeshCanvas(bounds, combinesScale, coords, colors, figures, backgroundColor, cachedCanvases, webGLContext) {
    var EXPECTED_SCALE = 1.1;
    var MAX_PATTERN_SIZE = 3000;
    var BORDER_SIZE = 2;
    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 paddedWidth = width + BORDER_SIZE * 2;
    var paddedHeight = height + BORDER_SIZE * 2;
    var canvas, tmpCanvas, i, ii;

    if (webGLContext.isEnabled) {
      canvas = webGLContext.drawFigures({
        width: width,
        height: height,
        backgroundColor: backgroundColor,
        figures: figures,
        context: context
      });
      tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, false);
      tmpCanvas.context.drawImage(canvas, BORDER_SIZE, BORDER_SIZE);
      canvas = tmpCanvas.canvas;
    } else {
      tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, 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, BORDER_SIZE, BORDER_SIZE);
      canvas = tmpCanvas.canvas;
    }

    return {
      canvas: canvas,
      offsetX: offsetX - BORDER_SIZE * scaleX,
      offsetY: offsetY - BORDER_SIZE * scaleY,
      scaleX: scaleX,
      scaleY: scaleY
    };
  }

  return createMeshCanvas;
}();

ShadingIRs.Mesh = {
  fromIR: function Mesh_fromIR(raw) {
    var coords = raw[2];
    var colors = raw[3];
    var figures = raw[4];
    var bounds = raw[5];
    var matrix = raw[6];
    var background = raw[8];
    return {
      type: 'Pattern',
      getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {
        var scale;

        if (shadingFill) {
          scale = _util.Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);
        } else {
          scale = _util.Util.singularValueDecompose2dScale(owner.baseTransform);

          if (matrix) {
            var matrixScale = _util.Util.singularValueDecompose2dScale(matrix);

            scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]];
          }
        }

        var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, colors, figures, shadingFill ? null : background, owner.cachedCanvases, owner.webGLContext);

        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) {
    throw new Error("Unknown IR type: ".concat(raw[0]));
  }

  return shadingIR.fromIR(raw);
}

var TilingPattern = function TilingPatternClosure() {
  var PaintType = {
    COLORED: 1,
    UNCOLORED: 2
  };
  var MAX_PATTERN_SIZE = 3000;

  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;
      (0, _util.info)('TilingType: ' + tilingType);
      var x0 = bbox[0],
          y0 = bbox[1],
          x1 = bbox[2],
          y1 = bbox[3];
      var topLeft = [x0, y0];
      var botRight = [x0 + xstep, y0 + ystep];
      var width = botRight[0] - topLeft[0];
      var height = botRight[1] - topLeft[1];

      var matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix);

      var curMatrixScale = _util.Util.singularValueDecompose2dScale(this.baseTransform);

      var combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]];
      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(graphics, paintType, color);
      this.setScale(width, height, xstep, ystep);
      this.transformToScale(graphics);
      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 (Array.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(graphics, paintType, color) {
      var context = graphics.ctx,
          current = graphics.current;

      switch (paintType) {
        case PaintType.COLORED:
          var ctx = this.ctx;
          context.fillStyle = ctx.fillStyle;
          context.strokeStyle = ctx.strokeStyle;
          current.fillColor = ctx.fillStyle;
          current.strokeColor = ctx.strokeStyle;
          break;

        case PaintType.UNCOLORED:
          var cssColor = _util.Util.makeCssRgb(color[0], color[1], color[2]);

          context.fillStyle = cssColor;
          context.strokeStyle = cssColor;
          current.fillColor = cssColor;
          current.strokeColor = cssColor;
          break;

        default:
          throw new _util.FormatError("Unsupported paint type: ".concat(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.TilingPattern = TilingPattern;

/***/ }),
/* 156 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.GlobalWorkerOptions = void 0;
var GlobalWorkerOptions = Object.create(null);
exports.GlobalWorkerOptions = GlobalWorkerOptions;
GlobalWorkerOptions.workerPort = GlobalWorkerOptions.workerPort === undefined ? null : GlobalWorkerOptions.workerPort;
GlobalWorkerOptions.workerSrc = GlobalWorkerOptions.workerSrc === undefined ? '' : GlobalWorkerOptions.workerSrc;

/***/ }),
/* 157 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MessageHandler = MessageHandler;

var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147));

var _util = __w_pdfjs_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function resolveCall(_x, _x2) {
  return _resolveCall.apply(this, arguments);
}

function _resolveCall() {
  _resolveCall = _asyncToGenerator(
  /*#__PURE__*/
  _regenerator.default.mark(function _callee(fn, args) {
    var thisArg,
        _args = arguments;
    return _regenerator.default.wrap(function _callee$(_context) {
      while (1) {
        switch (_context.prev = _context.next) {
          case 0:
            thisArg = _args.length > 2 && _args[2] !== undefined ? _args[2] : null;

            if (fn) {
              _context.next = 3;
              break;
            }

            return _context.abrupt("return");

          case 3:
            return _context.abrupt("return", fn.apply(thisArg, args));

          case 4:
          case "end":
            return _context.stop();
        }
      }
    }, _callee, this);
  }));
  return _resolveCall.apply(this, arguments);
}

function wrapReason(reason) {
  if (_typeof(reason) !== 'object') {
    return reason;
  }

  switch (reason.name) {
    case 'AbortException':
      return new _util.AbortException(reason.message);

    case 'MissingPDFException':
      return new _util.MissingPDFException(reason.message);

    case 'UnexpectedResponseException':
      return new _util.UnexpectedResponseException(reason.message, reason.status);

    default:
      return new _util.UnknownErrorException(reason.message, reason.details);
  }
}

function makeReasonSerializable(reason) {
  if (!(reason instanceof Error) || reason instanceof _util.AbortException || reason instanceof _util.MissingPDFException || reason instanceof _util.UnexpectedResponseException || reason instanceof _util.UnknownErrorException) {
    return reason;
  }

  return new _util.UnknownErrorException(reason.message, reason.toString());
}

function resolveOrReject(capability, success, reason) {
  if (success) {
    capability.resolve();
  } else {
    capability.reject(reason);
  }
}

function finalize(promise) {
  return Promise.resolve(promise).catch(function () {});
}

function MessageHandler(sourceName, targetName, comObj) {
  var _this = this;

  this.sourceName = sourceName;
  this.targetName = targetName;
  this.comObj = comObj;
  this.callbackId = 1;
  this.streamId = 1;
  this.postMessageTransfers = true;
  this.streamSinks = Object.create(null);
  this.streamControllers = Object.create(null);
  var callbacksCapabilities = this.callbacksCapabilities = Object.create(null);
  var ah = this.actionHandler = Object.create(null);

  this._onComObjOnMessage = function (event) {
    var data = event.data;

    if (data.targetName !== _this.sourceName) {
      return;
    }

    if (data.stream) {
      _this._processStreamMessage(data);
    } else 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(wrapReason(data.error));
        } else {
          callback.resolve(data.data);
        }
      } else {
        throw new Error("Cannot resolve callback ".concat(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) {
          comObj.postMessage({
            sourceName: _sourceName,
            targetName: _targetName,
            isReply: true,
            callbackId: data.callbackId,
            error: makeReasonSerializable(reason)
          });
        });
      } else if (data.streamId) {
        _this._createStreamSink(data);
      } else {
        action[0].call(action[1], data.data);
      }
    } else {
      throw new Error("Unknown action from worker: ".concat(data.action));
    }
  };

  comObj.addEventListener('message', this._onComObjOnMessage);
}

MessageHandler.prototype = {
  on: function on(actionName, handler, scope) {
    var ah = this.actionHandler;

    if (ah[actionName]) {
      throw new Error("There is already an actionName called \"".concat(actionName, "\""));
    }

    ah[actionName] = [handler, scope];
  },
  send: function send(actionName, data, transfers) {
    var message = {
      sourceName: this.sourceName,
      targetName: this.targetName,
      action: actionName,
      data: data
    };
    this.postMessage(message, transfers);
  },
  sendWithPromise: function sendWithPromise(actionName, data, transfers) {
    var callbackId = this.callbackId++;
    var message = {
      sourceName: this.sourceName,
      targetName: this.targetName,
      action: actionName,
      data: data,
      callbackId: callbackId
    };
    var capability = (0, _util.createPromiseCapability)();
    this.callbacksCapabilities[callbackId] = capability;

    try {
      this.postMessage(message, transfers);
    } catch (e) {
      capability.reject(e);
    }

    return capability.promise;
  },
  sendWithStream: function sendWithStream(actionName, data, queueingStrategy, transfers) {
    var _this2 = this;

    var streamId = this.streamId++;
    var sourceName = this.sourceName;
    var targetName = this.targetName;
    return new _util.ReadableStream({
      start: function start(controller) {
        var startCapability = (0, _util.createPromiseCapability)();
        _this2.streamControllers[streamId] = {
          controller: controller,
          startCall: startCapability,
          isClosed: false
        };

        _this2.postMessage({
          sourceName: sourceName,
          targetName: targetName,
          action: actionName,
          streamId: streamId,
          data: data,
          desiredSize: controller.desiredSize
        });

        return startCapability.promise;
      },
      pull: function pull(controller) {
        var pullCapability = (0, _util.createPromiseCapability)();
        _this2.streamControllers[streamId].pullCall = pullCapability;

        _this2.postMessage({
          sourceName: sourceName,
          targetName: targetName,
          stream: 'pull',
          streamId: streamId,
          desiredSize: controller.desiredSize
        });

        return pullCapability.promise;
      },
      cancel: function cancel(reason) {
        var cancelCapability = (0, _util.createPromiseCapability)();
        _this2.streamControllers[streamId].cancelCall = cancelCapability;
        _this2.streamControllers[streamId].isClosed = true;

        _this2.postMessage({
          sourceName: sourceName,
          targetName: targetName,
          stream: 'cancel',
          reason: reason,
          streamId: streamId
        });

        return cancelCapability.promise;
      }
    }, queueingStrategy);
  },
  _createStreamSink: function _createStreamSink(data) {
    var _this3 = this;

    var self = this;
    var action = this.actionHandler[data.action];
    var streamId = data.streamId;
    var desiredSize = data.desiredSize;
    var sourceName = this.sourceName;
    var targetName = data.sourceName;
    var capability = (0, _util.createPromiseCapability)();

    var sendStreamRequest = function sendStreamRequest(_ref) {
      var stream = _ref.stream,
          chunk = _ref.chunk,
          transfers = _ref.transfers,
          success = _ref.success,
          reason = _ref.reason;

      _this3.postMessage({
        sourceName: sourceName,
        targetName: targetName,
        stream: stream,
        streamId: streamId,
        chunk: chunk,
        success: success,
        reason: reason
      }, transfers);
    };

    var streamSink = {
      enqueue: function enqueue(chunk) {
        var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
        var transfers = arguments.length > 2 ? arguments[2] : undefined;

        if (this.isCancelled) {
          return;
        }

        var lastDesiredSize = this.desiredSize;
        this.desiredSize -= size;

        if (lastDesiredSize > 0 && this.desiredSize <= 0) {
          this.sinkCapability = (0, _util.createPromiseCapability)();
          this.ready = this.sinkCapability.promise;
        }

        sendStreamRequest({
          stream: 'enqueue',
          chunk: chunk,
          transfers: transfers
        });
      },
      close: function close() {
        if (this.isCancelled) {
          return;
        }

        this.isCancelled = true;
        sendStreamRequest({
          stream: 'close'
        });
        delete self.streamSinks[streamId];
      },
      error: function error(reason) {
        if (this.isCancelled) {
          return;
        }

        this.isCancelled = true;
        sendStreamRequest({
          stream: 'error',
          reason: reason
        });
      },
      sinkCapability: capability,
      onPull: null,
      onCancel: null,
      isCancelled: false,
      desiredSize: desiredSize,
      ready: null
    };
    streamSink.sinkCapability.resolve();
    streamSink.ready = streamSink.sinkCapability.promise;
    this.streamSinks[streamId] = streamSink;
    resolveCall(action[0], [data.data, streamSink], action[1]).then(function () {
      sendStreamRequest({
        stream: 'start_complete',
        success: true
      });
    }, function (reason) {
      sendStreamRequest({
        stream: 'start_complete',
        success: false,
        reason: reason
      });
    });
  },
  _processStreamMessage: function _processStreamMessage(data) {
    var _this4 = this;

    var sourceName = this.sourceName;
    var targetName = data.sourceName;
    var streamId = data.streamId;

    var sendStreamResponse = function sendStreamResponse(_ref2) {
      var stream = _ref2.stream,
          success = _ref2.success,
          reason = _ref2.reason;

      _this4.comObj.postMessage({
        sourceName: sourceName,
        targetName: targetName,
        stream: stream,
        success: success,
        streamId: streamId,
        reason: reason
      });
    };

    var deleteStreamController = function deleteStreamController() {
      Promise.all([_this4.streamControllers[data.streamId].startCall, _this4.streamControllers[data.streamId].pullCall, _this4.streamControllers[data.streamId].cancelCall].map(function (capability) {
        return capability && finalize(capability.promise);
      })).then(function () {
        delete _this4.streamControllers[data.streamId];
      });
    };

    switch (data.stream) {
      case 'start_complete':
        resolveOrReject(this.streamControllers[data.streamId].startCall, data.success, wrapReason(data.reason));
        break;

      case 'pull_complete':
        resolveOrReject(this.streamControllers[data.streamId].pullCall, data.success, wrapReason(data.reason));
        break;

      case 'pull':
        if (!this.streamSinks[data.streamId]) {
          sendStreamResponse({
            stream: 'pull_complete',
            success: true
          });
          break;
        }

        if (this.streamSinks[data.streamId].desiredSize <= 0 && data.desiredSize > 0) {
          this.streamSinks[data.streamId].sinkCapability.resolve();
        }

        this.streamSinks[data.streamId].desiredSize = data.desiredSize;
        resolveCall(this.streamSinks[data.streamId].onPull).then(function () {
          sendStreamResponse({
            stream: 'pull_complete',
            success: true
          });
        }, function (reason) {
          sendStreamResponse({
            stream: 'pull_complete',
            success: false,
            reason: reason
          });
        });
        break;

      case 'enqueue':
        (0, _util.assert)(this.streamControllers[data.streamId], 'enqueue should have stream controller');

        if (!this.streamControllers[data.streamId].isClosed) {
          this.streamControllers[data.streamId].controller.enqueue(data.chunk);
        }

        break;

      case 'close':
        (0, _util.assert)(this.streamControllers[data.streamId], 'close should have stream controller');

        if (this.streamControllers[data.streamId].isClosed) {
          break;
        }

        this.streamControllers[data.streamId].isClosed = true;
        this.streamControllers[data.streamId].controller.close();
        deleteStreamController();
        break;

      case 'error':
        (0, _util.assert)(this.streamControllers[data.streamId], 'error should have stream controller');
        this.streamControllers[data.streamId].controller.error(wrapReason(data.reason));
        deleteStreamController();
        break;

      case 'cancel_complete':
        resolveOrReject(this.streamControllers[data.streamId].cancelCall, data.success, wrapReason(data.reason));
        deleteStreamController();
        break;

      case 'cancel':
        if (!this.streamSinks[data.streamId]) {
          break;
        }

        resolveCall(this.streamSinks[data.streamId].onCancel, [wrapReason(data.reason)]).then(function () {
          sendStreamResponse({
            stream: 'cancel_complete',
            success: true
          });
        }, function (reason) {
          sendStreamResponse({
            stream: 'cancel_complete',
            success: false,
            reason: reason
          });
        });
        this.streamSinks[data.streamId].sinkCapability.reject(wrapReason(data.reason));
        this.streamSinks[data.streamId].isCancelled = true;
        delete this.streamSinks[data.streamId];
        break;

      default:
        throw new Error('Unexpected stream case');
    }
  },
  postMessage: function postMessage(message, transfers) {
    if (transfers && this.postMessageTransfers) {
      this.comObj.postMessage(message, transfers);
    } else {
      this.comObj.postMessage(message);
    }
  },
  destroy: function destroy() {
    this.comObj.removeEventListener('message', this._onComObjOnMessage);
  }
};

/***/ }),
/* 158 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Metadata = void 0;

var _util = __w_pdfjs_require__(1);

var _xml_parser = __w_pdfjs_require__(159);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var Metadata =
/*#__PURE__*/
function () {
  function Metadata(data) {
    _classCallCheck(this, Metadata);

    (0, _util.assert)(typeof data === 'string', 'Metadata: input is not a string');
    data = this._repair(data);
    var parser = new _xml_parser.SimpleXMLParser();
    var xmlDocument = parser.parseFromString(data);
    this._metadata = Object.create(null);

    if (xmlDocument) {
      this._parse(xmlDocument);
    }
  }

  _createClass(Metadata, [{
    key: "_repair",
    value: function _repair(data) {
      return data.replace(/^([^<]+)/, '').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);
        }).replace(/&(amp|apos|gt|lt|quot);/g, function (str, name) {
          switch (name) {
            case 'amp':
              return '&';

            case 'apos':
              return '\'';

            case 'gt':
              return '>';

            case 'lt':
              return '<';

            case 'quot':
              return '\"';
          }

          throw new Error("_repair: ".concat(name, " isn't defined."));
        });
        var chars = '';

        for (var i = 0, ii = bytes.length; i < ii; i += 2) {
          var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);

          if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) {
            chars += String.fromCharCode(code);
          } else {
            chars += '&#x' + (0x10000 + code).toString(16).substring(1) + ';';
          }
        }

        return '>' + chars;
      });
    }
  }, {
    key: "_parse",
    value: function _parse(xmlDocument) {
      var rdf = xmlDocument.documentElement;

      if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') {
        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;

      for (var i = 0, ii = children.length; i < ii; i++) {
        var desc = children[i];

        if (desc.nodeName.toLowerCase() !== 'rdf:description') {
          continue;
        }

        for (var j = 0, jj = desc.childNodes.length; j < jj; j++) {
          if (desc.childNodes[j].nodeName.toLowerCase() !== '#text') {
            var entry = desc.childNodes[j];
            var name = entry.nodeName.toLowerCase();
            this._metadata[name] = entry.textContent.trim();
          }
        }
      }
    }
  }, {
    key: "get",
    value: function get(name) {
      var data = this._metadata[name];
      return typeof data !== 'undefined' ? data : null;
    }
  }, {
    key: "getAll",
    value: function getAll() {
      return this._metadata;
    }
  }, {
    key: "has",
    value: function has(name) {
      return typeof this._metadata[name] !== 'undefined';
    }
  }]);

  return Metadata;
}();

exports.Metadata = Metadata;

/***/ }),
/* 159 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.SimpleXMLParser = void 0;

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }

function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var XMLParserErrorCode = {
  NoError: 0,
  EndOfDocument: -1,
  UnterminatedCdat: -2,
  UnterminatedXmlDeclaration: -3,
  UnterminatedDoctypeDeclaration: -4,
  UnterminatedComment: -5,
  MalformedElement: -6,
  OutOfMemory: -7,
  UnterminatedAttributeValue: -8,
  UnterminatedElement: -9,
  ElementNeverBegun: -10
};

function isWhitespace(s, index) {
  var ch = s[index];
  return ch === ' ' || ch === '\n' || ch === '\r' || ch === '\t';
}

function isWhitespaceString(s) {
  for (var i = 0, ii = s.length; i < ii; i++) {
    if (!isWhitespace(s, i)) {
      return false;
    }
  }

  return true;
}

var XMLParserBase =
/*#__PURE__*/
function () {
  function XMLParserBase() {
    _classCallCheck(this, XMLParserBase);
  }

  _createClass(XMLParserBase, [{
    key: "_resolveEntities",
    value: function _resolveEntities(s) {
      var _this = this;

      return s.replace(/&([^;]+);/g, function (all, entity) {
        if (entity.substring(0, 2) === '#x') {
          return String.fromCharCode(parseInt(entity.substring(2), 16));
        } else if (entity.substring(0, 1) === '#') {
          return String.fromCharCode(parseInt(entity.substring(1), 10));
        }

        switch (entity) {
          case 'lt':
            return '<';

          case 'gt':
            return '>';

          case 'amp':
            return '&';

          case 'quot':
            return '\"';
        }

        return _this.onResolveEntity(entity);
      });
    }
  }, {
    key: "_parseContent",
    value: function _parseContent(s, start) {
      var pos = start,
          name,
          attributes = [];

      function skipWs() {
        while (pos < s.length && isWhitespace(s, pos)) {
          ++pos;
        }
      }

      while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== '>' && s[pos] !== '/') {
        ++pos;
      }

      name = s.substring(start, pos);
      skipWs();

      while (pos < s.length && s[pos] !== '>' && s[pos] !== '/' && s[pos] !== '?') {
        skipWs();
        var attrName = '',
            attrValue = '';

        while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== '=') {
          attrName += s[pos];
          ++pos;
        }

        skipWs();

        if (s[pos] !== '=') {
          return null;
        }

        ++pos;
        skipWs();
        var attrEndChar = s[pos];

        if (attrEndChar !== '\"' && attrEndChar !== '\'') {
          return null;
        }

        var attrEndIndex = s.indexOf(attrEndChar, ++pos);

        if (attrEndIndex < 0) {
          return null;
        }

        attrValue = s.substring(pos, attrEndIndex);
        attributes.push({
          name: attrName,
          value: this._resolveEntities(attrValue)
        });
        pos = attrEndIndex + 1;
        skipWs();
      }

      return {
        name: name,
        attributes: attributes,
        parsed: pos - start
      };
    }
  }, {
    key: "_parseProcessingInstruction",
    value: function _parseProcessingInstruction(s, start) {
      var pos = start,
          name,
          value;

      function skipWs() {
        while (pos < s.length && isWhitespace(s, pos)) {
          ++pos;
        }
      }

      while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== '>' && s[pos] !== '/') {
        ++pos;
      }

      name = s.substring(start, pos);
      skipWs();
      var attrStart = pos;

      while (pos < s.length && (s[pos] !== '?' || s[pos + 1] !== '>')) {
        ++pos;
      }

      value = s.substring(attrStart, pos);
      return {
        name: name,
        value: value,
        parsed: pos - start
      };
    }
  }, {
    key: "parseXml",
    value: function parseXml(s) {
      var i = 0;

      while (i < s.length) {
        var ch = s[i];
        var j = i;

        if (ch === '<') {
          ++j;
          var ch2 = s[j];
          var q = void 0;

          switch (ch2) {
            case '/':
              ++j;
              q = s.indexOf('>', j);

              if (q < 0) {
                this.onError(XMLParserErrorCode.UnterminatedElement);
                return;
              }

              this.onEndElement(s.substring(j, q));
              j = q + 1;
              break;

            case '?':
              ++j;

              var pi = this._parseProcessingInstruction(s, j);

              if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== '?>') {
                this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration);
                return;
              }

              this.onPi(pi.name, pi.value);
              j += pi.parsed + 2;
              break;

            case '!':
              if (s.substring(j + 1, j + 3) === '--') {
                q = s.indexOf('-->', j + 3);

                if (q < 0) {
                  this.onError(XMLParserErrorCode.UnterminatedComment);
                  return;
                }

                this.onComment(s.substring(j + 3, q));
                j = q + 3;
              } else if (s.substring(j + 1, j + 8) === '[CDATA[') {
                q = s.indexOf(']]>', j + 8);

                if (q < 0) {
                  this.onError(XMLParserErrorCode.UnterminatedCdat);
                  return;
                }

                this.onCdata(s.substring(j + 8, q));
                j = q + 3;
              } else if (s.substring(j + 1, j + 8) === 'DOCTYPE') {
                var q2 = s.indexOf('[', j + 8);
                var complexDoctype = false;
                q = s.indexOf('>', j + 8);

                if (q < 0) {
                  this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);
                  return;
                }

                if (q2 > 0 && q > q2) {
                  q = s.indexOf(']>', j + 8);

                  if (q < 0) {
                    this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);
                    return;
                  }

                  complexDoctype = true;
                }

                var doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0));
                this.onDoctype(doctypeContent);
                j = q + (complexDoctype ? 2 : 1);
              } else {
                this.onError(XMLParserErrorCode.MalformedElement);
                return;
              }

              break;

            default:
              var content = this._parseContent(s, j);

              if (content === null) {
                this.onError(XMLParserErrorCode.MalformedElement);
                return;
              }

              var isClosed = false;

              if (s.substring(j + content.parsed, j + content.parsed + 2) === '/>') {
                isClosed = true;
              } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== '>') {
                this.onError(XMLParserErrorCode.UnterminatedElement);
                return;
              }

              this.onBeginElement(content.name, content.attributes, isClosed);
              j += content.parsed + (isClosed ? 2 : 1);
              break;
          }
        } else {
          while (j < s.length && s[j] !== '<') {
            j++;
          }

          var text = s.substring(i, j);
          this.onText(this._resolveEntities(text));
        }

        i = j;
      }
    }
  }, {
    key: "onResolveEntity",
    value: function onResolveEntity(name) {
      return "&".concat(name, ";");
    }
  }, {
    key: "onPi",
    value: function onPi(name, value) {}
  }, {
    key: "onComment",
    value: function onComment(text) {}
  }, {
    key: "onCdata",
    value: function onCdata(text) {}
  }, {
    key: "onDoctype",
    value: function onDoctype(doctypeContent) {}
  }, {
    key: "onText",
    value: function onText(text) {}
  }, {
    key: "onBeginElement",
    value: function onBeginElement(name, attributes, isEmpty) {}
  }, {
    key: "onEndElement",
    value: function onEndElement(name) {}
  }, {
    key: "onError",
    value: function onError(code) {}
  }]);

  return XMLParserBase;
}();

var SimpleDOMNode =
/*#__PURE__*/
function () {
  function SimpleDOMNode(nodeName, nodeValue) {
    _classCallCheck(this, SimpleDOMNode);

    this.nodeName = nodeName;
    this.nodeValue = nodeValue;
    Object.defineProperty(this, 'parentNode', {
      value: null,
      writable: true
    });
  }

  _createClass(SimpleDOMNode, [{
    key: "hasChildNodes",
    value: function hasChildNodes() {
      return this.childNodes && this.childNodes.length > 0;
    }
  }, {
    key: "firstChild",
    get: function get() {
      return this.childNodes && this.childNodes[0];
    }
  }, {
    key: "nextSibling",
    get: function get() {
      var childNodes = this.parentNode.childNodes;

      if (!childNodes) {
        return undefined;
      }

      var index = childNodes.indexOf(this);

      if (index === -1) {
        return undefined;
      }

      return childNodes[index + 1];
    }
  }, {
    key: "textContent",
    get: function get() {
      if (!this.childNodes) {
        return this.nodeValue || '';
      }

      return this.childNodes.map(function (child) {
        return child.textContent;
      }).join('');
    }
  }]);

  return SimpleDOMNode;
}();

var SimpleXMLParser =
/*#__PURE__*/
function (_XMLParserBase) {
  _inherits(SimpleXMLParser, _XMLParserBase);

  function SimpleXMLParser() {
    var _this2;

    _classCallCheck(this, SimpleXMLParser);

    _this2 = _possibleConstructorReturn(this, _getPrototypeOf(SimpleXMLParser).call(this));
    _this2._currentFragment = null;
    _this2._stack = null;
    _this2._errorCode = XMLParserErrorCode.NoError;
    return _this2;
  }

  _createClass(SimpleXMLParser, [{
    key: "parseFromString",
    value: function parseFromString(data) {
      this._currentFragment = [];
      this._stack = [];
      this._errorCode = XMLParserErrorCode.NoError;
      this.parseXml(data);

      if (this._errorCode !== XMLParserErrorCode.NoError) {
        return undefined;
      }

      var _this$_currentFragmen = _slicedToArray(this._currentFragment, 1),
          documentElement = _this$_currentFragmen[0];

      if (!documentElement) {
        return undefined;
      }

      return {
        documentElement: documentElement
      };
    }
  }, {
    key: "onResolveEntity",
    value: function onResolveEntity(name) {
      switch (name) {
        case 'apos':
          return '\'';
      }

      return _get(_getPrototypeOf(SimpleXMLParser.prototype), "onResolveEntity", this).call(this, name);
    }
  }, {
    key: "onText",
    value: function onText(text) {
      if (isWhitespaceString(text)) {
        return;
      }

      var node = new SimpleDOMNode('#text', text);

      this._currentFragment.push(node);
    }
  }, {
    key: "onCdata",
    value: function onCdata(text) {
      var node = new SimpleDOMNode('#text', text);

      this._currentFragment.push(node);
    }
  }, {
    key: "onBeginElement",
    value: function onBeginElement(name, attributes, isEmpty) {
      var node = new SimpleDOMNode(name);
      node.childNodes = [];

      this._currentFragment.push(node);

      if (isEmpty) {
        return;
      }

      this._stack.push(this._currentFragment);

      this._currentFragment = node.childNodes;
    }
  }, {
    key: "onEndElement",
    value: function onEndElement(name) {
      this._currentFragment = this._stack.pop() || [];
      var lastElement = this._currentFragment[this._currentFragment.length - 1];

      if (!lastElement) {
        return;
      }

      for (var i = 0, ii = lastElement.childNodes.length; i < ii; i++) {
        lastElement.childNodes[i].parentNode = lastElement;
      }
    }
  }, {
    key: "onError",
    value: function onError(code) {
      this._errorCode = code;
    }
  }]);

  return SimpleXMLParser;
}(XMLParserBase);

exports.SimpleXMLParser = SimpleXMLParser;

/***/ }),
/* 160 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFDataTransportStream = void 0;

var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147));

var _util = __w_pdfjs_require__(1);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var PDFDataTransportStream = function PDFDataTransportStreamClosure() {
  function PDFDataTransportStream(params, pdfDataRangeTransport) {
    var _this = this;

    (0, _util.assert)(pdfDataRangeTransport);
    this._queuedChunks = [];
    var initialData = params.initialData;

    if (initialData && initialData.length > 0) {
      var buffer = new Uint8Array(initialData).buffer;

      this._queuedChunks.push(buffer);
    }

    this._pdfDataRangeTransport = pdfDataRangeTransport;
    this._isStreamingSupported = !params.disableStream;
    this._isRangeSupported = !params.disableRange;
    this._contentLength = params.length;
    this._fullRequestReader = null;
    this._rangeReaders = [];

    this._pdfDataRangeTransport.addRangeListener(function (begin, chunk) {
      _this._onReceiveData({
        begin: begin,
        chunk: chunk
      });
    });

    this._pdfDataRangeTransport.addProgressListener(function (loaded) {
      _this._onProgress({
        loaded: loaded
      });
    });

    this._pdfDataRangeTransport.addProgressiveReadListener(function (chunk) {
      _this._onReceiveData({
        chunk: chunk
      });
    });

    this._pdfDataRangeTransport.transportReady();
  }

  PDFDataTransportStream.prototype = {
    _onReceiveData: function PDFDataTransportStream_onReceiveData(args) {
      var buffer = new Uint8Array(args.chunk).buffer;

      if (args.begin === undefined) {
        if (this._fullRequestReader) {
          this._fullRequestReader._enqueue(buffer);
        } else {
          this._queuedChunks.push(buffer);
        }
      } else {
        var found = this._rangeReaders.some(function (rangeReader) {
          if (rangeReader._begin !== args.begin) {
            return false;
          }

          rangeReader._enqueue(buffer);

          return true;
        });

        (0, _util.assert)(found);
      }
    },
    _onProgress: function PDFDataTransportStream_onDataProgress(evt) {
      if (this._rangeReaders.length > 0) {
        var firstReader = this._rangeReaders[0];

        if (firstReader.onProgress) {
          firstReader.onProgress({
            loaded: evt.loaded
          });
        }
      }
    },
    _removeRangeReader: function PDFDataTransportStream_removeRangeReader(reader) {
      var i = this._rangeReaders.indexOf(reader);

      if (i >= 0) {
        this._rangeReaders.splice(i, 1);
      }
    },
    getFullReader: function PDFDataTransportStream_getFullReader() {
      (0, _util.assert)(!this._fullRequestReader);
      var queuedChunks = this._queuedChunks;
      this._queuedChunks = null;
      return new PDFDataTransportStreamReader(this, queuedChunks);
    },
    getRangeReader: function PDFDataTransportStream_getRangeReader(begin, end) {
      var reader = new PDFDataTransportStreamRangeReader(this, begin, end);

      this._pdfDataRangeTransport.requestDataRange(begin, end);

      this._rangeReaders.push(reader);

      return reader;
    },
    cancelAllRequests: function PDFDataTransportStream_cancelAllRequests(reason) {
      if (this._fullRequestReader) {
        this._fullRequestReader.cancel(reason);
      }

      var readers = this._rangeReaders.slice(0);

      readers.forEach(function (rangeReader) {
        rangeReader.cancel(reason);
      });

      this._pdfDataRangeTransport.abort();
    }
  };

  function PDFDataTransportStreamReader(stream, queuedChunks) {
    this._stream = stream;
    this._done = false;
    this._filename = null;
    this._queuedChunks = queuedChunks || [];
    this._requests = [];
    this._headersReady = Promise.resolve();
    stream._fullRequestReader = this;
    this.onProgress = null;
  }

  PDFDataTransportStreamReader.prototype = {
    _enqueue: function PDFDataTransportStreamReader_enqueue(chunk) {
      if (this._done) {
        return;
      }

      if (this._requests.length > 0) {
        var requestCapability = this._requests.shift();

        requestCapability.resolve({
          value: chunk,
          done: false
        });
        return;
      }

      this._queuedChunks.push(chunk);
    },

    get headersReady() {
      return this._headersReady;
    },

    get filename() {
      return this._filename;
    },

    get isRangeSupported() {
      return this._stream._isRangeSupported;
    },

    get isStreamingSupported() {
      return this._stream._isStreamingSupported;
    },

    get contentLength() {
      return this._stream._contentLength;
    },

    read: function () {
      var _read = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee() {
        var chunk, requestCapability;
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                if (!(this._queuedChunks.length > 0)) {
                  _context.next = 3;
                  break;
                }

                chunk = this._queuedChunks.shift();
                return _context.abrupt("return", {
                  value: chunk,
                  done: false
                });

              case 3:
                if (!this._done) {
                  _context.next = 5;
                  break;
                }

                return _context.abrupt("return", {
                  value: undefined,
                  done: true
                });

              case 5:
                requestCapability = (0, _util.createPromiseCapability)();

                this._requests.push(requestCapability);

                return _context.abrupt("return", requestCapability.promise);

              case 8:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function read() {
        return _read.apply(this, arguments);
      }

      return read;
    }(),
    cancel: function PDFDataTransportStreamReader_cancel(reason) {
      this._done = true;

      this._requests.forEach(function (requestCapability) {
        requestCapability.resolve({
          value: undefined,
          done: true
        });
      });

      this._requests = [];
    }
  };

  function PDFDataTransportStreamRangeReader(stream, begin, end) {
    this._stream = stream;
    this._begin = begin;
    this._end = end;
    this._queuedChunk = null;
    this._requests = [];
    this._done = false;
    this.onProgress = null;
  }

  PDFDataTransportStreamRangeReader.prototype = {
    _enqueue: function PDFDataTransportStreamRangeReader_enqueue(chunk) {
      if (this._done) {
        return;
      }

      if (this._requests.length === 0) {
        this._queuedChunk = chunk;
      } else {
        var requestsCapability = this._requests.shift();

        requestsCapability.resolve({
          value: chunk,
          done: false
        });

        this._requests.forEach(function (requestCapability) {
          requestCapability.resolve({
            value: undefined,
            done: true
          });
        });

        this._requests = [];
      }

      this._done = true;

      this._stream._removeRangeReader(this);
    },

    get isStreamingSupported() {
      return false;
    },

    read: function () {
      var _read2 = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee2() {
        var chunk, requestCapability;
        return _regenerator.default.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                if (!this._queuedChunk) {
                  _context2.next = 4;
                  break;
                }

                chunk = this._queuedChunk;
                this._queuedChunk = null;
                return _context2.abrupt("return", {
                  value: chunk,
                  done: false
                });

              case 4:
                if (!this._done) {
                  _context2.next = 6;
                  break;
                }

                return _context2.abrupt("return", {
                  value: undefined,
                  done: true
                });

              case 6:
                requestCapability = (0, _util.createPromiseCapability)();

                this._requests.push(requestCapability);

                return _context2.abrupt("return", requestCapability.promise);

              case 9:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      function read() {
        return _read2.apply(this, arguments);
      }

      return read;
    }(),
    cancel: function PDFDataTransportStreamRangeReader_cancel(reason) {
      this._done = true;

      this._requests.forEach(function (requestCapability) {
        requestCapability.resolve({
          value: undefined,
          done: true
        });
      });

      this._requests = [];

      this._stream._removeRangeReader(this);
    }
  };
  return PDFDataTransportStream;
}();

exports.PDFDataTransportStream = PDFDataTransportStream;

/***/ }),
/* 161 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.WebGLContext = void 0;

var _util = __w_pdfjs_require__(1);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var WebGLContext =
/*#__PURE__*/
function () {
  function WebGLContext(_ref) {
    var _ref$enable = _ref.enable,
        enable = _ref$enable === void 0 ? false : _ref$enable;

    _classCallCheck(this, WebGLContext);

    this._enabled = enable === true;
  }

  _createClass(WebGLContext, [{
    key: "composeSMask",
    value: function composeSMask(_ref2) {
      var layer = _ref2.layer,
          mask = _ref2.mask,
          properties = _ref2.properties;
      return WebGLUtils.composeSMask(layer, mask, properties);
    }
  }, {
    key: "drawFigures",
    value: function drawFigures(_ref3) {
      var width = _ref3.width,
          height = _ref3.height,
          backgroundColor = _ref3.backgroundColor,
          figures = _ref3.figures,
          context = _ref3.context;
      return WebGLUtils.drawFigures(width, height, backgroundColor, figures, context);
    }
  }, {
    key: "clear",
    value: function clear() {
      WebGLUtils.cleanup();
    }
  }, {
    key: "isEnabled",
    get: function get() {
      var enabled = this._enabled;

      if (enabled) {
        enabled = WebGLUtils.tryInitGL();
      }

      return (0, _util.shadow)(this, 'isEnabled', enabled);
    }
  }]);

  return WebGLContext;
}();

exports.WebGLContext = WebGLContext;

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);
    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);
    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;
    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');
    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);
    var texture = createTexture(gl, layer, gl.TEXTURE0);
    var maskTexture = createTexture(gl, mask, gl.TEXTURE1);
    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);
    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;
    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);
    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;
      }
    }

    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;
      }
    }

    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;
  }

  return {
    tryInitGL: function tryInitGL() {
      try {
        generateGL();
        return !!currentGL;
      } catch (ex) {}

      return false;
    },
    composeSMask: composeSMask,
    drawFigures: drawFigures,
    cleanup: 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;
    }
  };
}();

/***/ }),
/* 162 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.renderTextLayer = void 0;

var _util = __w_pdfjs_require__(1);

var _global_scope = _interopRequireDefault(__w_pdfjs_require__(3));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var renderTextLayer = function renderTextLayerClosure() {
  var MAX_TEXT_DIVS_TO_RENDER = 100000;
  var NonWhitespaceRegexp = /\S/;

  function isAllWhitespace(str) {
    return !NonWhitespaceRegexp.test(str);
  }

  var styleBuf = ['left: ', 0, 'px; top: ', 0, 'px; font-size: ', 0, 'px; font-family: ', '', ';'];

  function appendText(task, geom, styles) {
    var textDiv = document.createElement('span');
    var textDivProperties = {
      style: null,
      angle: 0,
      canvasWidth: 0,
      isWhitespace: false,
      originalTransform: null,
      paddingBottom: 0,
      paddingLeft: 0,
      paddingRight: 0,
      paddingTop: 0,
      scale: 1
    };

    task._textDivs.push(textDiv);

    if (isAllWhitespace(geom.str)) {
      textDivProperties.isWhitespace = true;

      task._textDivProperties.set(textDiv, textDivProperties);

      return;
    }

    var tx = _util.Util.transform(task._viewport.transform, geom.transform);

    var angle = Math.atan2(tx[1], tx[0]);
    var style = styles[geom.fontName];

    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);
    }

    styleBuf[1] = left;
    styleBuf[3] = top;
    styleBuf[5] = fontHeight;
    styleBuf[7] = style.fontFamily;
    textDivProperties.style = styleBuf.join('');
    textDiv.setAttribute('style', textDivProperties.style);
    textDiv.textContent = geom.str;

    if (task._fontInspectorEnabled) {
      textDiv.dataset.fontName = geom.fontName;
    }

    if (angle !== 0) {
      textDivProperties.angle = angle * (180 / Math.PI);
    }

    if (geom.str.length > 1) {
      if (style.vertical) {
        textDivProperties.canvasWidth = geom.height * task._viewport.scale;
      } else {
        textDivProperties.canvasWidth = geom.width * task._viewport.scale;
      }
    }

    task._textDivProperties.set(textDiv, textDivProperties);

    if (task._textContentStream) {
      task._layoutText(textDiv);
    }

    if (task._enhanceTextSelection) {
      var angleCos = 1,
          angleSin = 0;

      if (angle !== 0) {
        angleCos = Math.cos(angle);
        angleSin = Math.sin(angle);
      }

      var divWidth = (style.vertical ? geom.height : geom.width) * task._viewport.scale;
      var divHeight = fontHeight;
      var m, b;

      if (angle !== 0) {
        m = [angleCos, angleSin, -angleSin, angleCos, left, top];
        b = _util.Util.getAxialAlignedBoundingBox([0, 0, divWidth, divHeight], m);
      } else {
        b = [left, top, left + divWidth, top + divHeight];
      }

      task._bounds.push({
        left: b[0],
        top: b[1],
        right: b[2],
        bottom: b[3],
        div: textDiv,
        size: [divWidth, divHeight],
        m: m
      });
    }
  }

  function render(task) {
    if (task._canceled) {
      return;
    }

    var textDivs = task._textDivs;
    var capability = task._capability;
    var textDivsLength = textDivs.length;

    if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {
      task._renderingDone = true;
      capability.resolve();
      return;
    }

    if (!task._textContentStream) {
      for (var i = 0; i < textDivsLength; i++) {
        task._layoutText(textDivs[i]);
      }
    }

    task._renderingDone = true;
    capability.resolve();
  }

  function expand(task) {
    var bounds = task._bounds;
    var viewport = task._viewport;
    var expanded = expandBounds(viewport.width, viewport.height, bounds);

    for (var i = 0; i < expanded.length; i++) {
      var div = bounds[i].div;

      var divProperties = task._textDivProperties.get(div);

      if (divProperties.angle === 0) {
        divProperties.paddingLeft = bounds[i].left - expanded[i].left;
        divProperties.paddingTop = bounds[i].top - expanded[i].top;
        divProperties.paddingRight = expanded[i].right - bounds[i].right;
        divProperties.paddingBottom = expanded[i].bottom - bounds[i].bottom;

        task._textDivProperties.set(div, divProperties);

        continue;
      }

      var e = expanded[i],
          b = bounds[i];
      var m = b.m,
          c = m[0],
          s = m[1];
      var points = [[0, 0], [0, b.size[1]], [b.size[0], 0], b.size];
      var ts = new Float64Array(64);
      points.forEach(function (p, i) {
        var t = _util.Util.applyTransform(p, m);

        ts[i + 0] = c && (e.left - t[0]) / c;
        ts[i + 4] = s && (e.top - t[1]) / s;
        ts[i + 8] = c && (e.right - t[0]) / c;
        ts[i + 12] = s && (e.bottom - t[1]) / s;
        ts[i + 16] = s && (e.left - t[0]) / -s;
        ts[i + 20] = c && (e.top - t[1]) / c;
        ts[i + 24] = s && (e.right - t[0]) / -s;
        ts[i + 28] = c && (e.bottom - t[1]) / c;
        ts[i + 32] = c && (e.left - t[0]) / -c;
        ts[i + 36] = s && (e.top - t[1]) / -s;
        ts[i + 40] = c && (e.right - t[0]) / -c;
        ts[i + 44] = s && (e.bottom - t[1]) / -s;
        ts[i + 48] = s && (e.left - t[0]) / s;
        ts[i + 52] = c && (e.top - t[1]) / -c;
        ts[i + 56] = s && (e.right - t[0]) / s;
        ts[i + 60] = c && (e.bottom - t[1]) / -c;
      });

      var findPositiveMin = function findPositiveMin(ts, offset, count) {
        var result = 0;

        for (var i = 0; i < count; i++) {
          var t = ts[offset++];

          if (t > 0) {
            result = result ? Math.min(t, result) : t;
          }
        }

        return result;
      };

      var boxScale = 1 + Math.min(Math.abs(c), Math.abs(s));
      divProperties.paddingLeft = findPositiveMin(ts, 32, 16) / boxScale;
      divProperties.paddingTop = findPositiveMin(ts, 48, 16) / boxScale;
      divProperties.paddingRight = findPositiveMin(ts, 0, 16) / boxScale;
      divProperties.paddingBottom = findPositiveMin(ts, 16, 16) / boxScale;

      task._textDivProperties.set(div, divProperties);
    }
  }

  function expandBounds(width, height, boxes) {
    var bounds = boxes.map(function (box, i) {
      return {
        x1: box.left,
        y1: box.top,
        x2: box.right,
        y2: box.bottom,
        index: i,
        x1New: undefined,
        x2New: undefined
      };
    });
    expandBoundsLTR(width, bounds);
    var expanded = new Array(boxes.length);
    bounds.forEach(function (b) {
      var i = b.index;
      expanded[i] = {
        left: b.x1New,
        top: 0,
        right: b.x2New,
        bottom: 0
      };
    });
    boxes.map(function (box, i) {
      var e = expanded[i],
          b = bounds[i];
      b.x1 = box.top;
      b.y1 = width - e.right;
      b.x2 = box.bottom;
      b.y2 = width - e.left;
      b.index = i;
      b.x1New = undefined;
      b.x2New = undefined;
    });
    expandBoundsLTR(height, bounds);
    bounds.forEach(function (b) {
      var i = b.index;
      expanded[i].top = b.x1New;
      expanded[i].bottom = b.x2New;
    });
    return expanded;
  }

  function expandBoundsLTR(width, bounds) {
    bounds.sort(function (a, b) {
      return a.x1 - b.x1 || a.index - b.index;
    });
    var fakeBoundary = {
      x1: -Infinity,
      y1: -Infinity,
      x2: 0,
      y2: Infinity,
      index: -1,
      x1New: 0,
      x2New: 0
    };
    var horizon = [{
      start: -Infinity,
      end: Infinity,
      boundary: fakeBoundary
    }];
    bounds.forEach(function (boundary) {
      var i = 0;

      while (i < horizon.length && horizon[i].end <= boundary.y1) {
        i++;
      }

      var j = horizon.length - 1;

      while (j >= 0 && horizon[j].start >= boundary.y2) {
        j--;
      }

      var horizonPart, affectedBoundary;
      var q,
          k,
          maxXNew = -Infinity;

      for (q = i; q <= j; q++) {
        horizonPart = horizon[q];
        affectedBoundary = horizonPart.boundary;
        var xNew;

        if (affectedBoundary.x2 > boundary.x1) {
          xNew = affectedBoundary.index > boundary.index ? affectedBoundary.x1New : boundary.x1;
        } else if (affectedBoundary.x2New === undefined) {
          xNew = (affectedBoundary.x2 + boundary.x1) / 2;
        } else {
          xNew = affectedBoundary.x2New;
        }

        if (xNew > maxXNew) {
          maxXNew = xNew;
        }
      }

      boundary.x1New = maxXNew;

      for (q = i; q <= j; q++) {
        horizonPart = horizon[q];
        affectedBoundary = horizonPart.boundary;

        if (affectedBoundary.x2New === undefined) {
          if (affectedBoundary.x2 > boundary.x1) {
            if (affectedBoundary.index > boundary.index) {
              affectedBoundary.x2New = affectedBoundary.x2;
            }
          } else {
            affectedBoundary.x2New = maxXNew;
          }
        } else if (affectedBoundary.x2New > maxXNew) {
          affectedBoundary.x2New = Math.max(maxXNew, affectedBoundary.x2);
        }
      }

      var changedHorizon = [],
          lastBoundary = null;

      for (q = i; q <= j; q++) {
        horizonPart = horizon[q];
        affectedBoundary = horizonPart.boundary;
        var useBoundary = affectedBoundary.x2 > boundary.x2 ? affectedBoundary : boundary;

        if (lastBoundary === useBoundary) {
          changedHorizon[changedHorizon.length - 1].end = horizonPart.end;
        } else {
          changedHorizon.push({
            start: horizonPart.start,
            end: horizonPart.end,
            boundary: useBoundary
          });
          lastBoundary = useBoundary;
        }
      }

      if (horizon[i].start < boundary.y1) {
        changedHorizon[0].start = boundary.y1;
        changedHorizon.unshift({
          start: horizon[i].start,
          end: boundary.y1,
          boundary: horizon[i].boundary
        });
      }

      if (boundary.y2 < horizon[j].end) {
        changedHorizon[changedHorizon.length - 1].end = boundary.y2;
        changedHorizon.push({
          start: boundary.y2,
          end: horizon[j].end,
          boundary: horizon[j].boundary
        });
      }

      for (q = i; q <= j; q++) {
        horizonPart = horizon[q];
        affectedBoundary = horizonPart.boundary;

        if (affectedBoundary.x2New !== undefined) {
          continue;
        }

        var used = false;

        for (k = i - 1; !used && k >= 0 && horizon[k].start >= affectedBoundary.y1; k--) {
          used = horizon[k].boundary === affectedBoundary;
        }

        for (k = j + 1; !used && k < horizon.length && horizon[k].end <= affectedBoundary.y2; k++) {
          used = horizon[k].boundary === affectedBoundary;
        }

        for (k = 0; !used && k < changedHorizon.length; k++) {
          used = changedHorizon[k].boundary === affectedBoundary;
        }

        if (!used) {
          affectedBoundary.x2New = maxXNew;
        }
      }

      Array.prototype.splice.apply(horizon, [i, j - i + 1].concat(changedHorizon));
    });
    horizon.forEach(function (horizonPart) {
      var affectedBoundary = horizonPart.boundary;

      if (affectedBoundary.x2New === undefined) {
        affectedBoundary.x2New = Math.max(width, affectedBoundary.x2);
      }
    });
  }

  function TextLayerRenderTask(_ref) {
    var textContent = _ref.textContent,
        textContentStream = _ref.textContentStream,
        container = _ref.container,
        viewport = _ref.viewport,
        textDivs = _ref.textDivs,
        textContentItemsStr = _ref.textContentItemsStr,
        enhanceTextSelection = _ref.enhanceTextSelection;
    this._textContent = textContent;
    this._textContentStream = textContentStream;
    this._container = container;
    this._viewport = viewport;
    this._textDivs = textDivs || [];
    this._textContentItemsStr = textContentItemsStr || [];
    this._enhanceTextSelection = !!enhanceTextSelection;
    this._fontInspectorEnabled = !!(_global_scope.default.FontInspector && _global_scope.default.FontInspector.enabled);
    this._reader = null;
    this._layoutTextLastFontSize = null;
    this._layoutTextLastFontFamily = null;
    this._layoutTextCtx = null;
    this._textDivProperties = new WeakMap();
    this._renderingDone = false;
    this._canceled = false;
    this._capability = (0, _util.createPromiseCapability)();
    this._renderTimer = null;
    this._bounds = [];
  }

  TextLayerRenderTask.prototype = {
    get promise() {
      return this._capability.promise;
    },

    cancel: function TextLayer_cancel() {
      if (this._reader) {
        this._reader.cancel(new _util.AbortException('text layer task cancelled'));

        this._reader = null;
      }

      this._canceled = true;

      if (this._renderTimer !== null) {
        clearTimeout(this._renderTimer);
        this._renderTimer = null;
      }

      this._capability.reject('canceled');
    },
    _processItems: function _processItems(items, styleCache) {
      for (var i = 0, len = items.length; i < len; i++) {
        this._textContentItemsStr.push(items[i].str);

        appendText(this, items[i], styleCache);
      }
    },
    _layoutText: function _layoutText(textDiv) {
      var textLayerFrag = this._container;

      var textDivProperties = this._textDivProperties.get(textDiv);

      if (textDivProperties.isWhitespace) {
        return;
      }

      var fontSize = textDiv.style.fontSize;
      var fontFamily = textDiv.style.fontFamily;

      if (fontSize !== this._layoutTextLastFontSize || fontFamily !== this._layoutTextLastFontFamily) {
        this._layoutTextCtx.font = fontSize + ' ' + fontFamily;
        this._layoutTextLastFontSize = fontSize;
        this._layoutTextLastFontFamily = fontFamily;
      }

      var width = this._layoutTextCtx.measureText(textDiv.textContent).width;

      var transform = '';

      if (textDivProperties.canvasWidth !== 0 && width > 0) {
        textDivProperties.scale = textDivProperties.canvasWidth / width;
        transform = "scaleX(".concat(textDivProperties.scale, ")");
      }

      if (textDivProperties.angle !== 0) {
        transform = "rotate(".concat(textDivProperties.angle, "deg) ").concat(transform);
      }

      if (transform.length > 0) {
        textDivProperties.originalTransform = transform;
        textDiv.style.transform = transform;
      }

      this._textDivProperties.set(textDiv, textDivProperties);

      textLayerFrag.appendChild(textDiv);
    },
    _render: function TextLayer_render(timeout) {
      var _this = this;

      var capability = (0, _util.createPromiseCapability)();
      var styleCache = Object.create(null);
      var canvas = document.createElement('canvas');
      canvas.mozOpaque = true;
      this._layoutTextCtx = canvas.getContext('2d', {
        alpha: false
      });

      if (this._textContent) {
        var textItems = this._textContent.items;
        var textStyles = this._textContent.styles;

        this._processItems(textItems, textStyles);

        capability.resolve();
      } else if (this._textContentStream) {
        var pump = function pump() {
          _this._reader.read().then(function (_ref2) {
            var value = _ref2.value,
                done = _ref2.done;

            if (done) {
              capability.resolve();
              return;
            }

            Object.assign(styleCache, value.styles);

            _this._processItems(value.items, styleCache);

            pump();
          }, capability.reject);
        };

        this._reader = this._textContentStream.getReader();
        pump();
      } else {
        throw new Error('Neither "textContent" nor "textContentStream"' + ' parameters specified.');
      }

      capability.promise.then(function () {
        styleCache = null;

        if (!timeout) {
          render(_this);
        } else {
          _this._renderTimer = setTimeout(function () {
            render(_this);
            _this._renderTimer = null;
          }, timeout);
        }
      }, this._capability.reject);
    },
    expandTextDivs: function TextLayer_expandTextDivs(expandDivs) {
      if (!this._enhanceTextSelection || !this._renderingDone) {
        return;
      }

      if (this._bounds !== null) {
        expand(this);
        this._bounds = null;
      }

      for (var i = 0, ii = this._textDivs.length; i < ii; i++) {
        var div = this._textDivs[i];

        var divProperties = this._textDivProperties.get(div);

        if (divProperties.isWhitespace) {
          continue;
        }

        if (expandDivs) {
          var transform = '',
              padding = '';

          if (divProperties.scale !== 1) {
            transform = 'scaleX(' + divProperties.scale + ')';
          }

          if (divProperties.angle !== 0) {
            transform = 'rotate(' + divProperties.angle + 'deg) ' + transform;
          }

          if (divProperties.paddingLeft !== 0) {
            padding += ' padding-left: ' + divProperties.paddingLeft / divProperties.scale + 'px;';
            transform += ' translateX(' + -divProperties.paddingLeft / divProperties.scale + 'px)';
          }

          if (divProperties.paddingTop !== 0) {
            padding += ' padding-top: ' + divProperties.paddingTop + 'px;';
            transform += ' translateY(' + -divProperties.paddingTop + 'px)';
          }

          if (divProperties.paddingRight !== 0) {
            padding += ' padding-right: ' + divProperties.paddingRight / divProperties.scale + 'px;';
          }

          if (divProperties.paddingBottom !== 0) {
            padding += ' padding-bottom: ' + divProperties.paddingBottom + 'px;';
          }

          if (padding !== '') {
            div.setAttribute('style', divProperties.style + padding);
          }

          if (transform !== '') {
            div.style.transform = transform;
          }
        } else {
          div.style.padding = 0;
          div.style.transform = divProperties.originalTransform || '';
        }
      }
    }
  };

  function renderTextLayer(renderParameters) {
    var task = new TextLayerRenderTask({
      textContent: renderParameters.textContent,
      textContentStream: renderParameters.textContentStream,
      container: renderParameters.container,
      viewport: renderParameters.viewport,
      textDivs: renderParameters.textDivs,
      textContentItemsStr: renderParameters.textContentItemsStr,
      enhanceTextSelection: renderParameters.enhanceTextSelection
    });

    task._render(renderParameters.timeout);

    return task;
  }

  return renderTextLayer;
}();

exports.renderTextLayer = renderTextLayer;

/***/ }),
/* 163 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.AnnotationLayer = void 0;

var _dom_utils = __w_pdfjs_require__(151);

var _util = __w_pdfjs_require__(1);

function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }

function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var AnnotationElementFactory =
/*#__PURE__*/
function () {
  function AnnotationElementFactory() {
    _classCallCheck(this, AnnotationElementFactory);
  }

  _createClass(AnnotationElementFactory, null, [{
    key: "create",
    value: function create(parameters) {
      var subtype = parameters.data.annotationType;

      switch (subtype) {
        case _util.AnnotationType.LINK:
          return new LinkAnnotationElement(parameters);

        case _util.AnnotationType.TEXT:
          return new TextAnnotationElement(parameters);

        case _util.AnnotationType.WIDGET:
          var fieldType = parameters.data.fieldType;

          switch (fieldType) {
            case 'Tx':
              return new TextWidgetAnnotationElement(parameters);

            case 'Btn':
              if (parameters.data.radioButton) {
                return new RadioButtonWidgetAnnotationElement(parameters);
              } else if (parameters.data.checkBox) {
                return new CheckboxWidgetAnnotationElement(parameters);
              }

              return new PushButtonWidgetAnnotationElement(parameters);

            case 'Ch':
              return new ChoiceWidgetAnnotationElement(parameters);
          }

          return new WidgetAnnotationElement(parameters);

        case _util.AnnotationType.POPUP:
          return new PopupAnnotationElement(parameters);

        case _util.AnnotationType.LINE:
          return new LineAnnotationElement(parameters);

        case _util.AnnotationType.SQUARE:
          return new SquareAnnotationElement(parameters);

        case _util.AnnotationType.CIRCLE:
          return new CircleAnnotationElement(parameters);

        case _util.AnnotationType.POLYLINE:
          return new PolylineAnnotationElement(parameters);

        case _util.AnnotationType.INK:
          return new InkAnnotationElement(parameters);

        case _util.AnnotationType.POLYGON:
          return new PolygonAnnotationElement(parameters);

        case _util.AnnotationType.HIGHLIGHT:
          return new HighlightAnnotationElement(parameters);

        case _util.AnnotationType.UNDERLINE:
          return new UnderlineAnnotationElement(parameters);

        case _util.AnnotationType.SQUIGGLY:
          return new SquigglyAnnotationElement(parameters);

        case _util.AnnotationType.STRIKEOUT:
          return new StrikeOutAnnotationElement(parameters);

        case _util.AnnotationType.STAMP:
          return new StampAnnotationElement(parameters);

        case _util.AnnotationType.FILEATTACHMENT:
          return new FileAttachmentAnnotationElement(parameters);

        default:
          return new AnnotationElement(parameters);
      }
    }
  }]);

  return AnnotationElementFactory;
}();

var AnnotationElement =
/*#__PURE__*/
function () {
  function AnnotationElement(parameters) {
    var isRenderable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
    var ignoreBorder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;

    _classCallCheck(this, AnnotationElement);

    this.isRenderable = isRenderable;
    this.data = parameters.data;
    this.layer = parameters.layer;
    this.page = parameters.page;
    this.viewport = parameters.viewport;
    this.linkService = parameters.linkService;
    this.downloadManager = parameters.downloadManager;
    this.imageResourcesPath = parameters.imageResourcesPath;
    this.renderInteractiveForms = parameters.renderInteractiveForms;
    this.svgFactory = parameters.svgFactory;

    if (isRenderable) {
      this.container = this._createContainer(ignoreBorder);
    }
  }

  _createClass(AnnotationElement, [{
    key: "_createContainer",
    value: function _createContainer() {
      var ignoreBorder = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
      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);

      var rect = _util.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]]);

      container.style.transform = 'matrix(' + viewport.transform.join(',') + ')';
      container.style.transformOrigin = -rect[0] + 'px ' + -rect[1] + 'px';

      if (!ignoreBorder && data.borderStyle.width > 0) {
        container.style.borderWidth = data.borderStyle.width + 'px';

        if (data.borderStyle.style !== _util.AnnotationBorderStyleType.UNDERLINE) {
          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';
          container.style.borderRadius = radius;
        }

        switch (data.borderStyle.style) {
          case _util.AnnotationBorderStyleType.SOLID:
            container.style.borderStyle = 'solid';
            break;

          case _util.AnnotationBorderStyleType.DASHED:
            container.style.borderStyle = 'dashed';
            break;

          case _util.AnnotationBorderStyleType.BEVELED:
            (0, _util.warn)('Unimplemented border style: beveled');
            break;

          case _util.AnnotationBorderStyleType.INSET:
            (0, _util.warn)('Unimplemented border style: inset');
            break;

          case _util.AnnotationBorderStyleType.UNDERLINE:
            container.style.borderBottomStyle = 'solid';
            break;

          default:
            break;
        }

        if (data.color) {
          container.style.borderColor = _util.Util.makeCssRgb(data.color[0] | 0, data.color[1] | 0, data.color[2] | 0);
        } else {
          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;
    }
  }, {
    key: "_createPopup",
    value: function _createPopup(container, trigger, data) {
      if (!trigger) {
        trigger = document.createElement('div');
        trigger.style.height = container.style.height;
        trigger.style.width = container.style.width;
        container.appendChild(trigger);
      }

      var popupElement = new PopupElement({
        container: container,
        trigger: trigger,
        color: data.color,
        title: data.title,
        contents: data.contents,
        hideWrapper: true
      });
      var popup = popupElement.render();
      popup.style.left = container.style.width;
      container.appendChild(popup);
    }
  }, {
    key: "render",
    value: function render() {
      (0, _util.unreachable)('Abstract method `AnnotationElement.render` called');
    }
  }]);

  return AnnotationElement;
}();

var LinkAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement) {
  _inherits(LinkAnnotationElement, _AnnotationElement);

  function LinkAnnotationElement(parameters) {
    _classCallCheck(this, LinkAnnotationElement);

    var isRenderable = !!(parameters.data.url || parameters.data.dest || parameters.data.action);
    return _possibleConstructorReturn(this, _getPrototypeOf(LinkAnnotationElement).call(this, parameters, isRenderable));
  }

  _createClass(LinkAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = 'linkAnnotation';
      var data = this.data,
          linkService = this.linkService;
      var link = document.createElement('a');
      (0, _dom_utils.addLinkAttributes)(link, {
        url: data.url,
        target: data.newWindow ? _dom_utils.LinkTarget.BLANK : linkService.externalLinkTarget,
        rel: linkService.externalLinkRel
      });

      if (!data.url) {
        if (data.action) {
          this._bindNamedAction(link, data.action);
        } else {
          this._bindLink(link, data.dest);
        }
      }

      this.container.appendChild(link);
      return this.container;
    }
  }, {
    key: "_bindLink",
    value: function _bindLink(link, destination) {
      var _this = this;

      link.href = this.linkService.getDestinationHash(destination);

      link.onclick = function () {
        if (destination) {
          _this.linkService.navigateTo(destination);
        }

        return false;
      };

      if (destination) {
        link.className = 'internalLink';
      }
    }
  }, {
    key: "_bindNamedAction",
    value: function _bindNamedAction(link, action) {
      var _this2 = this;

      link.href = this.linkService.getAnchorUrl('');

      link.onclick = function () {
        _this2.linkService.executeNamedAction(action);

        return false;
      };

      link.className = 'internalLink';
    }
  }]);

  return LinkAnnotationElement;
}(AnnotationElement);

var TextAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement2) {
  _inherits(TextAnnotationElement, _AnnotationElement2);

  function TextAnnotationElement(parameters) {
    _classCallCheck(this, TextAnnotationElement);

    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
    return _possibleConstructorReturn(this, _getPrototypeOf(TextAnnotationElement).call(this, parameters, isRenderable));
  }

  _createClass(TextAnnotationElement, [{
    key: "render",
    value: function 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 = this.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) {
        this._createPopup(this.container, image, this.data);
      }

      this.container.appendChild(image);
      return this.container;
    }
  }]);

  return TextAnnotationElement;
}(AnnotationElement);

var WidgetAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement3) {
  _inherits(WidgetAnnotationElement, _AnnotationElement3);

  function WidgetAnnotationElement() {
    _classCallCheck(this, WidgetAnnotationElement);

    return _possibleConstructorReturn(this, _getPrototypeOf(WidgetAnnotationElement).apply(this, arguments));
  }

  _createClass(WidgetAnnotationElement, [{
    key: "render",
    value: function render() {
      return this.container;
    }
  }]);

  return WidgetAnnotationElement;
}(AnnotationElement);

var TextWidgetAnnotationElement =
/*#__PURE__*/
function (_WidgetAnnotationElem) {
  _inherits(TextWidgetAnnotationElement, _WidgetAnnotationElem);

  function TextWidgetAnnotationElement(parameters) {
    _classCallCheck(this, TextWidgetAnnotationElement);

    var isRenderable = parameters.renderInteractiveForms || !parameters.data.hasAppearance && !!parameters.data.fieldValue;
    return _possibleConstructorReturn(this, _getPrototypeOf(TextWidgetAnnotationElement).call(this, parameters, isRenderable));
  }

  _createClass(TextWidgetAnnotationElement, [{
    key: "render",
    value: function render() {
      var TEXT_ALIGNMENT = ['left', 'center', 'right'];
      this.container.className = 'textWidgetAnnotation';
      var element = null;

      if (this.renderInteractiveForms) {
        if (this.data.multiLine) {
          element = document.createElement('textarea');
          element.textContent = this.data.fieldValue;
        } else {
          element = document.createElement('input');
          element.type = 'text';
          element.setAttribute('value', this.data.fieldValue);
        }

        element.disabled = this.data.readOnly;

        if (this.data.maxLen !== null) {
          element.maxLength = this.data.maxLen;
        }

        if (this.data.comb) {
          var fieldWidth = this.data.rect[2] - this.data.rect[0];
          var combWidth = fieldWidth / this.data.maxLen;
          element.classList.add('comb');
          element.style.letterSpacing = 'calc(' + combWidth + 'px - 1ch)';
        }
      } else {
        element = document.createElement('div');
        element.textContent = this.data.fieldValue;
        element.style.verticalAlign = 'middle';
        element.style.display = 'table-cell';
        var font = null;

        if (this.data.fontRefName && this.page.commonObjs.has(this.data.fontRefName)) {
          font = this.page.commonObjs.get(this.data.fontRefName);
        }

        this._setTextStyle(element, font);
      }

      if (this.data.textAlignment !== null) {
        element.style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];
      }

      this.container.appendChild(element);
      return this.container;
    }
  }, {
    key: "_setTextStyle",
    value: function _setTextStyle(element, font) {
      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';
      var fontFamily = font.loadedName ? '"' + font.loadedName + '", ' : '';
      var fallbackName = font.fallbackName || 'Helvetica, sans-serif';
      style.fontFamily = fontFamily + fallbackName;
    }
  }]);

  return TextWidgetAnnotationElement;
}(WidgetAnnotationElement);

var CheckboxWidgetAnnotationElement =
/*#__PURE__*/
function (_WidgetAnnotationElem2) {
  _inherits(CheckboxWidgetAnnotationElement, _WidgetAnnotationElem2);

  function CheckboxWidgetAnnotationElement(parameters) {
    _classCallCheck(this, CheckboxWidgetAnnotationElement);

    return _possibleConstructorReturn(this, _getPrototypeOf(CheckboxWidgetAnnotationElement).call(this, parameters, parameters.renderInteractiveForms));
  }

  _createClass(CheckboxWidgetAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = 'buttonWidgetAnnotation checkBox';
      var element = document.createElement('input');
      element.disabled = this.data.readOnly;
      element.type = 'checkbox';

      if (this.data.fieldValue && this.data.fieldValue !== 'Off') {
        element.setAttribute('checked', true);
      }

      this.container.appendChild(element);
      return this.container;
    }
  }]);

  return CheckboxWidgetAnnotationElement;
}(WidgetAnnotationElement);

var RadioButtonWidgetAnnotationElement =
/*#__PURE__*/
function (_WidgetAnnotationElem3) {
  _inherits(RadioButtonWidgetAnnotationElement, _WidgetAnnotationElem3);

  function RadioButtonWidgetAnnotationElement(parameters) {
    _classCallCheck(this, RadioButtonWidgetAnnotationElement);

    return _possibleConstructorReturn(this, _getPrototypeOf(RadioButtonWidgetAnnotationElement).call(this, parameters, parameters.renderInteractiveForms));
  }

  _createClass(RadioButtonWidgetAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = 'buttonWidgetAnnotation radioButton';
      var element = document.createElement('input');
      element.disabled = this.data.readOnly;
      element.type = 'radio';
      element.name = this.data.fieldName;

      if (this.data.fieldValue === this.data.buttonValue) {
        element.setAttribute('checked', true);
      }

      this.container.appendChild(element);
      return this.container;
    }
  }]);

  return RadioButtonWidgetAnnotationElement;
}(WidgetAnnotationElement);

var PushButtonWidgetAnnotationElement =
/*#__PURE__*/
function (_LinkAnnotationElemen) {
  _inherits(PushButtonWidgetAnnotationElement, _LinkAnnotationElemen);

  function PushButtonWidgetAnnotationElement() {
    _classCallCheck(this, PushButtonWidgetAnnotationElement);

    return _possibleConstructorReturn(this, _getPrototypeOf(PushButtonWidgetAnnotationElement).apply(this, arguments));
  }

  _createClass(PushButtonWidgetAnnotationElement, [{
    key: "render",
    value: function render() {
      var container = _get(_getPrototypeOf(PushButtonWidgetAnnotationElement.prototype), "render", this).call(this);

      container.className = 'buttonWidgetAnnotation pushButton';
      return container;
    }
  }]);

  return PushButtonWidgetAnnotationElement;
}(LinkAnnotationElement);

var ChoiceWidgetAnnotationElement =
/*#__PURE__*/
function (_WidgetAnnotationElem4) {
  _inherits(ChoiceWidgetAnnotationElement, _WidgetAnnotationElem4);

  function ChoiceWidgetAnnotationElement(parameters) {
    _classCallCheck(this, ChoiceWidgetAnnotationElement);

    return _possibleConstructorReturn(this, _getPrototypeOf(ChoiceWidgetAnnotationElement).call(this, parameters, parameters.renderInteractiveForms));
  }

  _createClass(ChoiceWidgetAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = 'choiceWidgetAnnotation';
      var selectElement = document.createElement('select');
      selectElement.disabled = this.data.readOnly;

      if (!this.data.combo) {
        selectElement.size = this.data.options.length;

        if (this.data.multiSelect) {
          selectElement.multiple = true;
        }
      }

      for (var i = 0, ii = this.data.options.length; i < ii; i++) {
        var option = this.data.options[i];
        var optionElement = document.createElement('option');
        optionElement.textContent = option.displayValue;
        optionElement.value = option.exportValue;

        if (this.data.fieldValue.includes(option.displayValue)) {
          optionElement.setAttribute('selected', true);
        }

        selectElement.appendChild(optionElement);
      }

      this.container.appendChild(selectElement);
      return this.container;
    }
  }]);

  return ChoiceWidgetAnnotationElement;
}(WidgetAnnotationElement);

var PopupAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement4) {
  _inherits(PopupAnnotationElement, _AnnotationElement4);

  function PopupAnnotationElement(parameters) {
    _classCallCheck(this, PopupAnnotationElement);

    var isRenderable = !!(parameters.data.title || parameters.data.contents);
    return _possibleConstructorReturn(this, _getPrototypeOf(PopupAnnotationElement).call(this, parameters, isRenderable));
  }

  _createClass(PopupAnnotationElement, [{
    key: "render",
    value: function render() {
      var IGNORE_TYPES = ['Line', 'Square', 'Circle', 'PolyLine', 'Polygon', 'Ink'];
      this.container.className = 'popupAnnotation';

      if (IGNORE_TYPES.includes(this.data.parentType)) {
        return this.container;
      }

      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
      });
      var parentLeft = parseFloat(parentElement.style.left);
      var parentWidth = parseFloat(parentElement.style.width);
      this.container.style.transformOrigin = -(parentLeft + parentWidth) + 'px -' + parentElement.style.top;
      this.container.style.left = parentLeft + parentWidth + 'px';
      this.container.appendChild(popup.render());
      return this.container;
    }
  }]);

  return PopupAnnotationElement;
}(AnnotationElement);

var PopupElement =
/*#__PURE__*/
function () {
  function PopupElement(parameters) {
    _classCallCheck(this, PopupElement);

    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;
  }

  _createClass(PopupElement, [{
    key: "render",
    value: function render() {
      var BACKGROUND_ENLIGHT = 0.7;
      var wrapper = document.createElement('div');
      wrapper.className = 'popupWrapper';
      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) {
        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.Util.makeCssRgb(r | 0, g | 0, b | 0);
      }

      var contents = this._formatContents(this.contents);

      var title = document.createElement('h1');
      title.textContent = this.title;
      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;
    }
  }, {
    key: "_formatContents",
    value: function _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;
    }
  }, {
    key: "_toggle",
    value: function _toggle() {
      if (this.pinned) {
        this._hide(true);
      } else {
        this._show(true);
      }
    }
  }, {
    key: "_show",
    value: function _show() {
      var pin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;

      if (pin) {
        this.pinned = true;
      }

      if (this.hideElement.hasAttribute('hidden')) {
        this.hideElement.removeAttribute('hidden');
        this.container.style.zIndex += 1;
      }
    }
  }, {
    key: "_hide",
    value: function _hide() {
      var unpin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;

      if (unpin) {
        this.pinned = false;
      }

      if (!this.hideElement.hasAttribute('hidden') && !this.pinned) {
        this.hideElement.setAttribute('hidden', true);
        this.container.style.zIndex -= 1;
      }
    }
  }]);

  return PopupElement;
}();

var LineAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement5) {
  _inherits(LineAnnotationElement, _AnnotationElement5);

  function LineAnnotationElement(parameters) {
    _classCallCheck(this, LineAnnotationElement);

    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
    return _possibleConstructorReturn(this, _getPrototypeOf(LineAnnotationElement).call(this, parameters, isRenderable, true));
  }

  _createClass(LineAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = 'lineAnnotation';
      var data = this.data;
      var width = data.rect[2] - data.rect[0];
      var height = data.rect[3] - data.rect[1];
      var svg = this.svgFactory.create(width, height);
      var line = this.svgFactory.createElement('svg:line');
      line.setAttribute('x1', data.rect[2] - data.lineCoordinates[0]);
      line.setAttribute('y1', data.rect[3] - data.lineCoordinates[1]);
      line.setAttribute('x2', data.rect[2] - data.lineCoordinates[2]);
      line.setAttribute('y2', data.rect[3] - data.lineCoordinates[3]);
      line.setAttribute('stroke-width', data.borderStyle.width);
      line.setAttribute('stroke', 'transparent');
      svg.appendChild(line);
      this.container.append(svg);

      this._createPopup(this.container, line, data);

      return this.container;
    }
  }]);

  return LineAnnotationElement;
}(AnnotationElement);

var SquareAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement6) {
  _inherits(SquareAnnotationElement, _AnnotationElement6);

  function SquareAnnotationElement(parameters) {
    _classCallCheck(this, SquareAnnotationElement);

    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
    return _possibleConstructorReturn(this, _getPrototypeOf(SquareAnnotationElement).call(this, parameters, isRenderable, true));
  }

  _createClass(SquareAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = 'squareAnnotation';
      var data = this.data;
      var width = data.rect[2] - data.rect[0];
      var height = data.rect[3] - data.rect[1];
      var svg = this.svgFactory.create(width, height);
      var borderWidth = data.borderStyle.width;
      var square = this.svgFactory.createElement('svg:rect');
      square.setAttribute('x', borderWidth / 2);
      square.setAttribute('y', borderWidth / 2);
      square.setAttribute('width', width - borderWidth);
      square.setAttribute('height', height - borderWidth);
      square.setAttribute('stroke-width', borderWidth);
      square.setAttribute('stroke', 'transparent');
      square.setAttribute('fill', 'none');
      svg.appendChild(square);
      this.container.append(svg);

      this._createPopup(this.container, square, data);

      return this.container;
    }
  }]);

  return SquareAnnotationElement;
}(AnnotationElement);

var CircleAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement7) {
  _inherits(CircleAnnotationElement, _AnnotationElement7);

  function CircleAnnotationElement(parameters) {
    _classCallCheck(this, CircleAnnotationElement);

    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
    return _possibleConstructorReturn(this, _getPrototypeOf(CircleAnnotationElement).call(this, parameters, isRenderable, true));
  }

  _createClass(CircleAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = 'circleAnnotation';
      var data = this.data;
      var width = data.rect[2] - data.rect[0];
      var height = data.rect[3] - data.rect[1];
      var svg = this.svgFactory.create(width, height);
      var borderWidth = data.borderStyle.width;
      var circle = this.svgFactory.createElement('svg:ellipse');
      circle.setAttribute('cx', width / 2);
      circle.setAttribute('cy', height / 2);
      circle.setAttribute('rx', width / 2 - borderWidth / 2);
      circle.setAttribute('ry', height / 2 - borderWidth / 2);
      circle.setAttribute('stroke-width', borderWidth);
      circle.setAttribute('stroke', 'transparent');
      circle.setAttribute('fill', 'none');
      svg.appendChild(circle);
      this.container.append(svg);

      this._createPopup(this.container, circle, data);

      return this.container;
    }
  }]);

  return CircleAnnotationElement;
}(AnnotationElement);

var PolylineAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement8) {
  _inherits(PolylineAnnotationElement, _AnnotationElement8);

  function PolylineAnnotationElement(parameters) {
    var _this3;

    _classCallCheck(this, PolylineAnnotationElement);

    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
    _this3 = _possibleConstructorReturn(this, _getPrototypeOf(PolylineAnnotationElement).call(this, parameters, isRenderable, true));
    _this3.containerClassName = 'polylineAnnotation';
    _this3.svgElementName = 'svg:polyline';
    return _this3;
  }

  _createClass(PolylineAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = this.containerClassName;
      var data = this.data;
      var width = data.rect[2] - data.rect[0];
      var height = data.rect[3] - data.rect[1];
      var svg = this.svgFactory.create(width, height);
      var vertices = data.vertices;
      var points = [];

      for (var i = 0, ii = vertices.length; i < ii; i++) {
        var x = vertices[i].x - data.rect[0];
        var y = data.rect[3] - vertices[i].y;
        points.push(x + ',' + y);
      }

      points = points.join(' ');
      var borderWidth = data.borderStyle.width;
      var polyline = this.svgFactory.createElement(this.svgElementName);
      polyline.setAttribute('points', points);
      polyline.setAttribute('stroke-width', borderWidth);
      polyline.setAttribute('stroke', 'transparent');
      polyline.setAttribute('fill', 'none');
      svg.appendChild(polyline);
      this.container.append(svg);

      this._createPopup(this.container, polyline, data);

      return this.container;
    }
  }]);

  return PolylineAnnotationElement;
}(AnnotationElement);

var PolygonAnnotationElement =
/*#__PURE__*/
function (_PolylineAnnotationEl) {
  _inherits(PolygonAnnotationElement, _PolylineAnnotationEl);

  function PolygonAnnotationElement(parameters) {
    var _this4;

    _classCallCheck(this, PolygonAnnotationElement);

    _this4 = _possibleConstructorReturn(this, _getPrototypeOf(PolygonAnnotationElement).call(this, parameters));
    _this4.containerClassName = 'polygonAnnotation';
    _this4.svgElementName = 'svg:polygon';
    return _this4;
  }

  return PolygonAnnotationElement;
}(PolylineAnnotationElement);

var InkAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement9) {
  _inherits(InkAnnotationElement, _AnnotationElement9);

  function InkAnnotationElement(parameters) {
    var _this5;

    _classCallCheck(this, InkAnnotationElement);

    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
    _this5 = _possibleConstructorReturn(this, _getPrototypeOf(InkAnnotationElement).call(this, parameters, isRenderable, true));
    _this5.containerClassName = 'inkAnnotation';
    _this5.svgElementName = 'svg:polyline';
    return _this5;
  }

  _createClass(InkAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = this.containerClassName;
      var data = this.data;
      var width = data.rect[2] - data.rect[0];
      var height = data.rect[3] - data.rect[1];
      var svg = this.svgFactory.create(width, height);
      var inkLists = data.inkLists;

      for (var i = 0, ii = inkLists.length; i < ii; i++) {
        var inkList = inkLists[i];
        var points = [];

        for (var j = 0, jj = inkList.length; j < jj; j++) {
          var x = inkList[j].x - data.rect[0];
          var y = data.rect[3] - inkList[j].y;
          points.push(x + ',' + y);
        }

        points = points.join(' ');
        var borderWidth = data.borderStyle.width;
        var polyline = this.svgFactory.createElement(this.svgElementName);
        polyline.setAttribute('points', points);
        polyline.setAttribute('stroke-width', borderWidth);
        polyline.setAttribute('stroke', 'transparent');
        polyline.setAttribute('fill', 'none');

        this._createPopup(this.container, polyline, data);

        svg.appendChild(polyline);
      }

      this.container.append(svg);
      return this.container;
    }
  }]);

  return InkAnnotationElement;
}(AnnotationElement);

var HighlightAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement10) {
  _inherits(HighlightAnnotationElement, _AnnotationElement10);

  function HighlightAnnotationElement(parameters) {
    _classCallCheck(this, HighlightAnnotationElement);

    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
    return _possibleConstructorReturn(this, _getPrototypeOf(HighlightAnnotationElement).call(this, parameters, isRenderable, true));
  }

  _createClass(HighlightAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = 'highlightAnnotation';

      if (!this.data.hasPopup) {
        this._createPopup(this.container, null, this.data);
      }

      return this.container;
    }
  }]);

  return HighlightAnnotationElement;
}(AnnotationElement);

var UnderlineAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement11) {
  _inherits(UnderlineAnnotationElement, _AnnotationElement11);

  function UnderlineAnnotationElement(parameters) {
    _classCallCheck(this, UnderlineAnnotationElement);

    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
    return _possibleConstructorReturn(this, _getPrototypeOf(UnderlineAnnotationElement).call(this, parameters, isRenderable, true));
  }

  _createClass(UnderlineAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = 'underlineAnnotation';

      if (!this.data.hasPopup) {
        this._createPopup(this.container, null, this.data);
      }

      return this.container;
    }
  }]);

  return UnderlineAnnotationElement;
}(AnnotationElement);

var SquigglyAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement12) {
  _inherits(SquigglyAnnotationElement, _AnnotationElement12);

  function SquigglyAnnotationElement(parameters) {
    _classCallCheck(this, SquigglyAnnotationElement);

    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
    return _possibleConstructorReturn(this, _getPrototypeOf(SquigglyAnnotationElement).call(this, parameters, isRenderable, true));
  }

  _createClass(SquigglyAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = 'squigglyAnnotation';

      if (!this.data.hasPopup) {
        this._createPopup(this.container, null, this.data);
      }

      return this.container;
    }
  }]);

  return SquigglyAnnotationElement;
}(AnnotationElement);

var StrikeOutAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement13) {
  _inherits(StrikeOutAnnotationElement, _AnnotationElement13);

  function StrikeOutAnnotationElement(parameters) {
    _classCallCheck(this, StrikeOutAnnotationElement);

    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
    return _possibleConstructorReturn(this, _getPrototypeOf(StrikeOutAnnotationElement).call(this, parameters, isRenderable, true));
  }

  _createClass(StrikeOutAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = 'strikeoutAnnotation';

      if (!this.data.hasPopup) {
        this._createPopup(this.container, null, this.data);
      }

      return this.container;
    }
  }]);

  return StrikeOutAnnotationElement;
}(AnnotationElement);

var StampAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement14) {
  _inherits(StampAnnotationElement, _AnnotationElement14);

  function StampAnnotationElement(parameters) {
    _classCallCheck(this, StampAnnotationElement);

    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
    return _possibleConstructorReturn(this, _getPrototypeOf(StampAnnotationElement).call(this, parameters, isRenderable, true));
  }

  _createClass(StampAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = 'stampAnnotation';

      if (!this.data.hasPopup) {
        this._createPopup(this.container, null, this.data);
      }

      return this.container;
    }
  }]);

  return StampAnnotationElement;
}(AnnotationElement);

var FileAttachmentAnnotationElement =
/*#__PURE__*/
function (_AnnotationElement15) {
  _inherits(FileAttachmentAnnotationElement, _AnnotationElement15);

  function FileAttachmentAnnotationElement(parameters) {
    var _this6;

    _classCallCheck(this, FileAttachmentAnnotationElement);

    _this6 = _possibleConstructorReturn(this, _getPrototypeOf(FileAttachmentAnnotationElement).call(this, parameters, true));
    var _this6$data$file = _this6.data.file,
        filename = _this6$data$file.filename,
        content = _this6$data$file.content;
    _this6.filename = (0, _dom_utils.getFilenameFromUrl)(filename);
    _this6.content = content;

    if (_this6.linkService.eventBus) {
      _this6.linkService.eventBus.dispatch('fileattachmentannotation', {
        source: _assertThisInitialized(_assertThisInitialized(_this6)),
        id: (0, _util.stringToPDFString)(filename),
        filename: filename,
        content: content
      });
    }

    return _this6;
  }

  _createClass(FileAttachmentAnnotationElement, [{
    key: "render",
    value: function render() {
      this.container.className = 'fileAttachmentAnnotation';
      var trigger = document.createElement('div');
      trigger.style.height = this.container.style.height;
      trigger.style.width = this.container.style.width;
      trigger.addEventListener('dblclick', this._download.bind(this));

      if (!this.data.hasPopup && (this.data.title || this.data.contents)) {
        this._createPopup(this.container, trigger, this.data);
      }

      this.container.appendChild(trigger);
      return this.container;
    }
  }, {
    key: "_download",
    value: function _download() {
      if (!this.downloadManager) {
        (0, _util.warn)('Download cannot be started due to unavailable download manager');
        return;
      }

      this.downloadManager.downloadData(this.content, this.filename, '');
    }
  }]);

  return FileAttachmentAnnotationElement;
}(AnnotationElement);

var AnnotationLayer =
/*#__PURE__*/
function () {
  function AnnotationLayer() {
    _classCallCheck(this, AnnotationLayer);
  }

  _createClass(AnnotationLayer, null, [{
    key: "render",
    value: function render(parameters) {
      for (var i = 0, ii = parameters.annotations.length; i < ii; i++) {
        var data = parameters.annotations[i];

        if (!data) {
          continue;
        }

        var element = AnnotationElementFactory.create({
          data: data,
          layer: parameters.div,
          page: parameters.page,
          viewport: parameters.viewport,
          linkService: parameters.linkService,
          downloadManager: parameters.downloadManager,
          imageResourcesPath: parameters.imageResourcesPath || '',
          renderInteractiveForms: parameters.renderInteractiveForms || false,
          svgFactory: new _dom_utils.DOMSVGFactory()
        });

        if (element.isRenderable) {
          parameters.div.appendChild(element.render());
        }
      }
    }
  }, {
    key: "update",
    value: function 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) {
          element.style.transform = 'matrix(' + parameters.viewport.transform.join(',') + ')';
        }
      }

      parameters.div.removeAttribute('hidden');
    }
  }]);

  return AnnotationLayer;
}();

exports.AnnotationLayer = AnnotationLayer;

/***/ }),
/* 164 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.SVGGraphics = void 0;

var _util = __w_pdfjs_require__(1);

var _dom_utils = __w_pdfjs_require__(151);

var _is_node = _interopRequireDefault(__w_pdfjs_require__(4));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var SVGGraphics = function SVGGraphics() {
  throw new Error('Not implemented: SVGGraphics');
};

exports.SVGGraphics = SVGGraphics;
{
  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 deflateSync(literals) {
      if (!(0, _is_node.default)()) {
        return deflateSyncUncompressed(literals);
      }

      try {
        var input;

        if (parseInt(process.versions.node) >= 8) {
          input = literals;
        } else {
          input = new Buffer(literals);
        }

        var output = require('zlib').deflateSync(input, {
          level: 9
        });

        return output instanceof Uint8Array ? output : new Uint8Array(output);
      } catch (e) {
        (0, _util.warn)('Not compressing PNG because zlib.deflateSync is unavailable: ' + e);
      }

      return deflateSyncUncompressed(literals);
    }

    function deflateSyncUncompressed(literals) {
      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;
      idat[pi++] = 0x9c;
      var pos = 0;

      while (len > maxBlockLength) {
        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;
      }

      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);
      idat[pi++] = adler >> 24 & 0xff;
      idat[pi++] = adler >> 16 & 0xff;
      idat[pi++] = adler >> 8 & 0xff;
      idat[pi++] = adler & 0xff;
      return idat;
    }

    function encode(imgData, kind, forceDataSchema, isMask) {
      var width = imgData.width;
      var height = imgData.height;
      var bitDepth, colorType, lineSize;
      var bytes = imgData.data;

      switch (kind) {
        case _util.ImageKind.GRAYSCALE_1BPP:
          colorType = 0;
          bitDepth = 1;
          lineSize = width + 7 >> 3;
          break;

        case _util.ImageKind.RGB_24BPP:
          colorType = 2;
          bitDepth = 8;
          lineSize = width * 3;
          break;

        case _util.ImageKind.RGBA_32BPP:
          colorType = 6;
          bitDepth = 8;
          lineSize = width * 4;
          break;

        default:
          throw new Error('invalid format');
      }

      var literals = new Uint8Array((1 + lineSize) * height);
      var offsetLiterals = 0,
          offsetBytes = 0;
      var y, i;

      for (y = 0; y < height; ++y) {
        literals[offsetLiterals++] = 0;
        literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), offsetLiterals);
        offsetBytes += lineSize;
        offsetLiterals += lineSize;
      }

      if (kind === _util.ImageKind.GRAYSCALE_1BPP && isMask) {
        offsetLiterals = 0;

        for (y = 0; y < height; y++) {
          offsetLiterals++;

          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, colorType, 0x00, 0x00, 0x00]);
      var idat = deflateSync(literals);
      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 (0, _util.createObjectURL)(data, 'image/png', forceDataSchema);
    }

    return function convertImgDataToPng(imgData, forceDataSchema, isMask) {
      var kind = imgData.kind === undefined ? _util.ImageKind.GRAYSCALE_1BPP : imgData.kind;
      return encode(imgData, kind, forceDataSchema, isMask);
    };
  }();

  var SVGExtraState = function SVGExtraStateClosure() {
    function SVGExtraState() {
      this.fontSizeScale = 1;
      this.fontWeight = SVG_DEFAULTS.fontWeight;
      this.fontSize = 0;
      this.textMatrix = _util.IDENTITY_MATRIX;
      this.fontMatrix = _util.FONT_IDENTITY_MATRIX;
      this.leading = 0;
      this.textRenderingMode = _util.TextRenderingMode.FILL;
      this.x = 0;
      this.y = 0;
      this.lineX = 0;
      this.lineY = 0;
      this.charSpacing = 0;
      this.wordSpacing = 0;
      this.textHScale = 1;
      this.textRise = 0;
      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 = [];
      this.activeClipUrl = null;
      this.clipGroup = null;
      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;
  }();

  exports.SVGGraphics = SVGGraphics = function SVGGraphicsClosure() {
    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;
    }

    function pf(value) {
      if (Number.isInteger(value)) {
        return value.toString();
      }

      var s = value.toFixed(10);
      var i = s.length - 1;

      if (s[i] !== '0') {
        return s;
      }

      do {
        i--;
      } while (s[i] === '0');

      return s.substring(0, s[i] === '.' ? i : i + 1);
    }

    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, forceDataSchema) {
      this.svgFactory = new _dom_utils.DOMSVGFactory();
      this.current = new SVGExtraState();
      this.transformMatrix = _util.IDENTITY_MATRIX;
      this.transformStack = [];
      this.extraStack = [];
      this.commonObjs = commonObjs;
      this.objs = objs;
      this.pendingClip = null;
      this.pendingEOFill = false;
      this.embedFonts = false;
      this.embeddedFonts = Object.create(null);
      this.cssStyle = null;
      this.forceDataSchema = !!forceDataSchema;
    }

    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.pendingClip = null;
        this.tgrp = null;
      },
      group: function SVGGraphics_group(items) {
        this.save();
        this.executeOpTree(items);
        this.restore();
      },
      loadDependencies: function SVGGraphics_loadDependencies(operatorList) {
        var _this = this;

        var fnArray = operatorList.fnArray;
        var fnArrayLen = fnArray.length;
        var argsArray = operatorList.argsArray;

        for (var i = 0; i < fnArrayLen; i++) {
          if (_util.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) {
                  _this.commonObjs.get(obj, resolve);
                });
              } else {
                promise = new Promise(function (resolve) {
                  _this.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 = _util.Util.transform(this.transformMatrix, transformMatrix);
        this.tgrp = null;
      },
      getSVG: function SVGGraphics_getSVG(operatorList, viewport) {
        var _this2 = this;

        this.viewport = viewport;

        var svgElement = this._initialize(viewport);

        return this.loadDependencies(operatorList).then(function () {
          _this2.transformMatrix = _util.IDENTITY_MATRIX;

          var opTree = _this2.convertOpList(operatorList);

          _this2.executeOpTree(opTree);

          return svgElement;
        });
      },
      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 _util.OPS) {
          REVOPS[_util.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 _util.OPS.beginText:
              this.beginText();
              break;

            case _util.OPS.dependency:
              break;

            case _util.OPS.setLeading:
              this.setLeading(args);
              break;

            case _util.OPS.setLeadingMoveText:
              this.setLeadingMoveText(args[0], args[1]);
              break;

            case _util.OPS.setFont:
              this.setFont(args);
              break;

            case _util.OPS.showText:
              this.showText(args[0]);
              break;

            case _util.OPS.showSpacedText:
              this.showText(args[0]);
              break;

            case _util.OPS.endText:
              this.endText();
              break;

            case _util.OPS.moveText:
              this.moveText(args[0], args[1]);
              break;

            case _util.OPS.setCharSpacing:
              this.setCharSpacing(args[0]);
              break;

            case _util.OPS.setWordSpacing:
              this.setWordSpacing(args[0]);
              break;

            case _util.OPS.setHScale:
              this.setHScale(args[0]);
              break;

            case _util.OPS.setTextMatrix:
              this.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
              break;

            case _util.OPS.setTextRise:
              this.setTextRise(args[0]);
              break;

            case _util.OPS.setTextRenderingMode:
              this.setTextRenderingMode(args[0]);
              break;

            case _util.OPS.setLineWidth:
              this.setLineWidth(args[0]);
              break;

            case _util.OPS.setLineJoin:
              this.setLineJoin(args[0]);
              break;

            case _util.OPS.setLineCap:
              this.setLineCap(args[0]);
              break;

            case _util.OPS.setMiterLimit:
              this.setMiterLimit(args[0]);
              break;

            case _util.OPS.setFillRGBColor:
              this.setFillRGBColor(args[0], args[1], args[2]);
              break;

            case _util.OPS.setStrokeRGBColor:
              this.setStrokeRGBColor(args[0], args[1], args[2]);
              break;

            case _util.OPS.setDash:
              this.setDash(args[0], args[1]);
              break;

            case _util.OPS.setGState:
              this.setGState(args[0]);
              break;

            case _util.OPS.fill:
              this.fill();
              break;

            case _util.OPS.eoFill:
              this.eoFill();
              break;

            case _util.OPS.stroke:
              this.stroke();
              break;

            case _util.OPS.fillStroke:
              this.fillStroke();
              break;

            case _util.OPS.eoFillStroke:
              this.eoFillStroke();
              break;

            case _util.OPS.clip:
              this.clip('nonzero');
              break;

            case _util.OPS.eoClip:
              this.clip('evenodd');
              break;

            case _util.OPS.paintSolidColorImageMask:
              this.paintSolidColorImageMask();
              break;

            case _util.OPS.paintJpegXObject:
              this.paintJpegXObject(args[0], args[1], args[2]);
              break;

            case _util.OPS.paintImageXObject:
              this.paintImageXObject(args[0]);
              break;

            case _util.OPS.paintInlineImageXObject:
              this.paintInlineImageXObject(args[0]);
              break;

            case _util.OPS.paintImageMaskXObject:
              this.paintImageMaskXObject(args[0]);
              break;

            case _util.OPS.paintFormXObjectBegin:
              this.paintFormXObjectBegin(args[0], args[1]);
              break;

            case _util.OPS.paintFormXObjectEnd:
              this.paintFormXObjectEnd();
              break;

            case _util.OPS.closePath:
              this.closePath();
              break;

            case _util.OPS.closeStroke:
              this.closeStroke();
              break;

            case _util.OPS.closeFillStroke:
              this.closeFillStroke();
              break;

            case _util.OPS.closeEOFillStroke:
              this.closeEOFillStroke();
              break;

            case _util.OPS.nextLine:
              this.nextLine();
              break;

            case _util.OPS.transform:
              this.transform(args[0], args[1], args[2], args[3], args[4], args[5]);
              break;

            case _util.OPS.constructPath:
              this.constructPath(args[0], args[1]);
              break;

            case _util.OPS.endPath:
              this.endPath();
              break;

            case 92:
              this.group(opTree[x].items);
              break;

            default:
              (0, _util.warn)('Unimplemented operator ' + 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 = this.svgFactory.createElement('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 = this.svgFactory.createElement('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 = _util.IDENTITY_MATRIX;
        this.current.lineMatrix = _util.IDENTITY_MATRIX;
        this.current.tspan = this.svgFactory.createElement('svg:tspan');
        this.current.txtElement = this.svgFactory.createElement('svg:text');
        this.current.txtgrp = this.svgFactory.createElement('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 = this.svgFactory.createElement('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) {
            x += fontDirection * wordSpacing;
            continue;
          } else if ((0, _util.isNum)(glyph)) {
            x += -glyph * fontSize * 0.001;
            continue;
          }

          var width = glyph.width;
          var character = glyph.fontChar;
          var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
          var charWidth = width * widthAdvanceScale + spacing * fontDirection;

          if (!glyph.isInFont && !font.missingFile) {
            x += charWidth;
            continue;
          }

          current.xcoords.push(current.x + x * textHScale);
          current.tspan.textContent += character;
          x += charWidth;
        }

        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);
        }

        var fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;

        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
          if (current.fillColor !== SVG_DEFAULTS.fillColor) {
            current.tspan.setAttributeNS(null, 'fill', current.fillColor);
          }

          if (current.fillAlpha < 1) {
            current.tspan.setAttributeNS(null, 'fill-opacity', current.fillAlpha);
          }
        } else if (current.textRenderingMode === _util.TextRenderingMode.ADD_TO_PATH) {
          current.tspan.setAttributeNS(null, 'fill', 'transparent');
        } else {
          current.tspan.setAttributeNS(null, 'fill', 'none');
        }

        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
          this._setStrokeAttributes(current.tspan);
        }

        var textMatrix = current.textMatrix;

        if (current.textRise !== 0) {
          textMatrix = textMatrix.slice();
          textMatrix[5] += current.textRise;
        }

        current.txtElement.setAttributeNS(null, 'transform', pm(textMatrix) + ' scale(1, -1)');
        current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');
        current.txtElement.appendChild(current.tspan);
        current.txtgrp.appendChild(current.txtElement);

        this._ensureTransformGroup().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 = this.svgFactory.createElement('svg:style');
          this.cssStyle.setAttributeNS(null, 'type', 'text/css');
          this.defs.appendChild(this.cssStyle);
        }

        var url = (0, _util.createObjectURL)(fontObj.data, fontObj.mimetype, this.forceDataSchema);
        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 : _util.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 = this.svgFactory.createElement('svg:tspan');
        current.tspan.setAttributeNS(null, 'y', pf(-current.y));
        current.xcoords = [];
      },
      endText: function endText() {
        var current = this.current;

        if (current.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG && current.txtElement && current.txtElement.hasChildNodes()) {
          current.element = current.txtElement;
          this.clip('nonzero');
          this.endPath();
        }
      },
      setLineWidth: function SVGGraphics_setLineWidth(width) {
        if (width > 0) {
          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;
      },
      setStrokeAlpha: function SVGGraphics_setStrokeAlpha(strokeAlpha) {
        this.current.strokeAlpha = strokeAlpha;
      },
      setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) {
        var color = _util.Util.makeCssRgb(r, g, b);

        this.current.strokeColor = color;
      },
      setFillAlpha: function SVGGraphics_setFillAlpha(fillAlpha) {
        this.current.fillAlpha = fillAlpha;
      },
      setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) {
        var color = _util.Util.makeCssRgb(r, g, b);

        this.current.fillColor = color;
        this.current.tspan = this.svgFactory.createElement('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 = this.svgFactory.createElement('svg:path');
        var d = [];
        var opLength = ops.length;

        for (var i = 0, j = 0; i < opLength; i++) {
          switch (ops[i] | 0) {
            case _util.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 _util.OPS.moveTo:
              x = args[j++];
              y = args[j++];
              d.push('M', pf(x), pf(y));
              break;

            case _util.OPS.lineTo:
              x = args[j++];
              y = args[j++];
              d.push('L', pf(x), pf(y));
              break;

            case _util.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 _util.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 _util.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 _util.OPS.closePath:
              d.push('Z');
              break;
          }
        }

        current.path.setAttributeNS(null, 'd', d.join(' '));
        current.path.setAttributeNS(null, 'fill', 'none');

        this._ensureTransformGroup().appendChild(current.path);

        current.element = current.path;
        current.setCurrentPoint(x, y);
      },
      endPath: function SVGGraphics_endPath() {
        if (!this.pendingClip) {
          return;
        }

        var current = this.current;
        var clipId = 'clippath' + clipCount;
        clipCount++;
        var clipPath = this.svgFactory.createElement('svg:clipPath');
        clipPath.setAttributeNS(null, 'id', clipId);
        clipPath.setAttributeNS(null, 'transform', pm(this.transformMatrix));
        var clipElement = current.element.cloneNode(true);

        if (this.pendingClip === 'evenodd') {
          clipElement.setAttributeNS(null, 'clip-rule', 'evenodd');
        } else {
          clipElement.setAttributeNS(null, 'clip-rule', 'nonzero');
        }

        this.pendingClip = null;
        clipPath.appendChild(clipElement);
        this.defs.appendChild(clipPath);

        if (current.activeClipUrl) {
          current.clipGroup = null;
          this.extraStack.forEach(function (prev) {
            prev.clipGroup = null;
          });
          clipPath.setAttributeNS(null, 'clip-path', current.activeClipUrl);
        }

        current.activeClipUrl = 'url(#' + clipId + ')';
        this.tgrp = null;
      },
      clip: function SVGGraphics_clip(type) {
        this.pendingClip = type;
      },
      closePath: function SVGGraphics_closePath() {
        var current = this.current;

        if (current.path) {
          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;
      },
      setTextRenderingMode: function setTextRenderingMode(textRenderingMode) {
        this.current.textRenderingMode = textRenderingMode;
      },
      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 'Font':
              this.setFont(value);
              break;

            case 'CA':
              this.setStrokeAlpha(value);
              break;

            case 'ca':
              this.setFillAlpha(value);
              break;

            default:
              (0, _util.warn)('Unimplemented graphic state ' + key);
              break;
          }
        }
      },
      fill: function SVGGraphics_fill() {
        var current = this.current;

        if (current.element) {
          current.element.setAttributeNS(null, 'fill', current.fillColor);
          current.element.setAttributeNS(null, 'fill-opacity', current.fillAlpha);
          this.endPath();
        }
      },
      stroke: function SVGGraphics_stroke() {
        var current = this.current;

        if (current.element) {
          this._setStrokeAttributes(current.element);

          current.element.setAttributeNS(null, 'fill', 'none');
          this.endPath();
        }
      },
      _setStrokeAttributes: function _setStrokeAttributes(element) {
        var current = this.current;
        element.setAttributeNS(null, 'stroke', current.strokeColor);
        element.setAttributeNS(null, 'stroke-opacity', current.strokeAlpha);
        element.setAttributeNS(null, 'stroke-miterlimit', pf(current.miterLimit));
        element.setAttributeNS(null, 'stroke-linecap', current.lineCap);
        element.setAttributeNS(null, 'stroke-linejoin', current.lineJoin);
        element.setAttributeNS(null, 'stroke-width', pf(current.lineWidth) + 'px');
        element.setAttributeNS(null, 'stroke-dasharray', current.dashArray.map(pf).join(' '));
        element.setAttributeNS(null, 'stroke-dashoffset', pf(current.dashPhase) + 'px');
      },
      eoFill: function SVGGraphics_eoFill() {
        if (this.current.element) {
          this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
        }

        this.fill();
      },
      fillStroke: function SVGGraphics_fillStroke() {
        this.stroke();
        this.fill();
      },
      eoFillStroke: function SVGGraphics_eoFillStroke() {
        if (this.current.element) {
          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();
      },
      closeEOFillStroke: function closeEOFillStroke() {
        this.closePath();
        this.eoFillStroke();
      },
      paintSolidColorImageMask: function SVGGraphics_paintSolidColorImageMask() {
        var current = this.current;
        var rect = this.svgFactory.createElement('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._ensureTransformGroup().appendChild(rect);
      },
      paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) {
        var imgObj = this.objs.get(objId);
        var imgEl = this.svgFactory.createElement('svg:image');
        imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src);
        imgEl.setAttributeNS(null, 'width', pf(w));
        imgEl.setAttributeNS(null, 'height', pf(h));
        imgEl.setAttributeNS(null, 'x', '0');
        imgEl.setAttributeNS(null, 'y', pf(-h));
        imgEl.setAttributeNS(null, 'transform', 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')');

        this._ensureTransformGroup().appendChild(imgEl);
      },
      paintImageXObject: function SVGGraphics_paintImageXObject(objId) {
        var imgData = this.objs.get(objId);

        if (!imgData) {
          (0, _util.warn)('Dependent image isn\'t ready yet');
          return;
        }

        this.paintInlineImageXObject(imgData);
      },
      paintInlineImageXObject: function SVGGraphics_paintInlineImageXObject(imgData, mask) {
        var width = imgData.width;
        var height = imgData.height;
        var imgSrc = convertImgDataToPng(imgData, this.forceDataSchema, !!mask);
        var cliprect = this.svgFactory.createElement('svg:rect');
        cliprect.setAttributeNS(null, 'x', '0');
        cliprect.setAttributeNS(null, 'y', '0');
        cliprect.setAttributeNS(null, 'width', pf(width));
        cliprect.setAttributeNS(null, 'height', pf(height));
        this.current.element = cliprect;
        this.clip('nonzero');
        var imgEl = this.svgFactory.createElement('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._ensureTransformGroup().appendChild(imgEl);
        }
      },
      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 = this.svgFactory.createElement('svg:mask');
        mask.setAttributeNS(null, 'id', current.maskId);
        var rect = this.svgFactory.createElement('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._ensureTransformGroup().appendChild(rect);

        this.paintInlineImageXObject(imgData, mask);
      },
      paintFormXObjectBegin: function SVGGraphics_paintFormXObjectBegin(matrix, bbox) {
        if (Array.isArray(matrix) && matrix.length === 6) {
          this.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
        }

        if (bbox) {
          var width = bbox[2] - bbox[0];
          var height = bbox[3] - bbox[1];
          var cliprect = this.svgFactory.createElement('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() {},
      _initialize: function _initialize(viewport) {
        var svg = this.svgFactory.create(viewport.width, viewport.height);
        var definitions = this.svgFactory.createElement('svg:defs');
        svg.appendChild(definitions);
        this.defs = definitions;
        var rootGroup = this.svgFactory.createElement('svg:g');
        rootGroup.setAttributeNS(null, 'transform', pm(viewport.transform));
        svg.appendChild(rootGroup);
        this.svg = rootGroup;
        return svg;
      },
      _ensureClipGroup: function SVGGraphics_ensureClipGroup() {
        if (!this.current.clipGroup) {
          var clipGroup = this.svgFactory.createElement('svg:g');
          clipGroup.setAttributeNS(null, 'clip-path', this.current.activeClipUrl);
          this.svg.appendChild(clipGroup);
          this.current.clipGroup = clipGroup;
        }

        return this.current.clipGroup;
      },
      _ensureTransformGroup: function SVGGraphics_ensureTransformGroup() {
        if (!this.tgrp) {
          this.tgrp = this.svgFactory.createElement('svg:g');
          this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));

          if (this.current.activeClipUrl) {
            this._ensureClipGroup().appendChild(this.tgrp);
          } else {
            this.svg.appendChild(this.tgrp);
          }
        }

        return this.tgrp;
      }
    };
    return SVGGraphics;
  }();
}

/***/ }),
/* 165 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFNodeStream = void 0;

var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147));

var _util = __w_pdfjs_require__(1);

var _network_utils = __w_pdfjs_require__(166);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var fs = require('fs');

var http = require('http');

var https = require('https');

var url = require('url');

var fileUriRegex = /^file:\/\/\/[a-zA-Z]:\//;

function parseUrl(sourceUrl) {
  var parsedUrl = url.parse(sourceUrl);

  if (parsedUrl.protocol === 'file:' || parsedUrl.host) {
    return parsedUrl;
  }

  if (/^[a-z]:[/\\]/i.test(sourceUrl)) {
    return url.parse("file:///".concat(sourceUrl));
  }

  if (!parsedUrl.host) {
    parsedUrl.protocol = 'file:';
  }

  return parsedUrl;
}

var PDFNodeStream =
/*#__PURE__*/
function () {
  function PDFNodeStream(source) {
    _classCallCheck(this, PDFNodeStream);

    this.source = source;
    this.url = parseUrl(source.url);
    this.isHttp = this.url.protocol === 'http:' || this.url.protocol === 'https:';
    this.isFsUrl = this.url.protocol === 'file:';
    this.httpHeaders = this.isHttp && source.httpHeaders || {};
    this._fullRequest = null;
    this._rangeRequestReaders = [];
  }

  _createClass(PDFNodeStream, [{
    key: "getFullReader",
    value: function getFullReader() {
      (0, _util.assert)(!this._fullRequest);
      this._fullRequest = this.isFsUrl ? new PDFNodeStreamFsFullReader(this) : new PDFNodeStreamFullReader(this);
      return this._fullRequest;
    }
  }, {
    key: "getRangeReader",
    value: function getRangeReader(start, end) {
      var rangeReader = this.isFsUrl ? new PDFNodeStreamFsRangeReader(this, start, end) : new PDFNodeStreamRangeReader(this, start, end);

      this._rangeRequestReaders.push(rangeReader);

      return rangeReader;
    }
  }, {
    key: "cancelAllRequests",
    value: function cancelAllRequests(reason) {
      if (this._fullRequest) {
        this._fullRequest.cancel(reason);
      }

      var readers = this._rangeRequestReaders.slice(0);

      readers.forEach(function (reader) {
        reader.cancel(reason);
      });
    }
  }]);

  return PDFNodeStream;
}();

exports.PDFNodeStream = PDFNodeStream;

var BaseFullReader =
/*#__PURE__*/
function () {
  function BaseFullReader(stream) {
    _classCallCheck(this, BaseFullReader);

    this._url = stream.url;
    this._done = false;
    this._storedError = null;
    this.onProgress = null;
    var source = stream.source;
    this._contentLength = source.length;
    this._loaded = 0;
    this._filename = null;
    this._disableRange = source.disableRange || false;
    this._rangeChunkSize = source.rangeChunkSize;

    if (!this._rangeChunkSize && !this._disableRange) {
      this._disableRange = true;
    }

    this._isStreamingSupported = !source.disableStream;
    this._isRangeSupported = !source.disableRange;
    this._readableStream = null;
    this._readCapability = (0, _util.createPromiseCapability)();
    this._headersCapability = (0, _util.createPromiseCapability)();
  }

  _createClass(BaseFullReader, [{
    key: "read",
    value: function () {
      var _read = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee() {
        var chunk, buffer;
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                _context.next = 2;
                return this._readCapability.promise;

              case 2:
                if (!this._done) {
                  _context.next = 4;
                  break;
                }

                return _context.abrupt("return", {
                  value: undefined,
                  done: true
                });

              case 4:
                if (!this._storedError) {
                  _context.next = 6;
                  break;
                }

                throw this._storedError;

              case 6:
                chunk = this._readableStream.read();

                if (!(chunk === null)) {
                  _context.next = 10;
                  break;
                }

                this._readCapability = (0, _util.createPromiseCapability)();
                return _context.abrupt("return", this.read());

              case 10:
                this._loaded += chunk.length;

                if (this.onProgress) {
                  this.onProgress({
                    loaded: this._loaded,
                    total: this._contentLength
                  });
                }

                buffer = new Uint8Array(chunk).buffer;
                return _context.abrupt("return", {
                  value: buffer,
                  done: false
                });

              case 14:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function read() {
        return _read.apply(this, arguments);
      }

      return read;
    }()
  }, {
    key: "cancel",
    value: function cancel(reason) {
      if (!this._readableStream) {
        this._error(reason);

        return;
      }

      this._readableStream.destroy(reason);
    }
  }, {
    key: "_error",
    value: function _error(reason) {
      this._storedError = reason;

      this._readCapability.resolve();
    }
  }, {
    key: "_setReadableStream",
    value: function _setReadableStream(readableStream) {
      var _this = this;

      this._readableStream = readableStream;
      readableStream.on('readable', function () {
        _this._readCapability.resolve();
      });
      readableStream.on('end', function () {
        readableStream.destroy();
        _this._done = true;

        _this._readCapability.resolve();
      });
      readableStream.on('error', function (reason) {
        _this._error(reason);
      });

      if (!this._isStreamingSupported && this._isRangeSupported) {
        this._error(new _util.AbortException('streaming is disabled'));
      }

      if (this._storedError) {
        this._readableStream.destroy(this._storedError);
      }
    }
  }, {
    key: "headersReady",
    get: function get() {
      return this._headersCapability.promise;
    }
  }, {
    key: "filename",
    get: function get() {
      return this._filename;
    }
  }, {
    key: "contentLength",
    get: function get() {
      return this._contentLength;
    }
  }, {
    key: "isRangeSupported",
    get: function get() {
      return this._isRangeSupported;
    }
  }, {
    key: "isStreamingSupported",
    get: function get() {
      return this._isStreamingSupported;
    }
  }]);

  return BaseFullReader;
}();

var BaseRangeReader =
/*#__PURE__*/
function () {
  function BaseRangeReader(stream) {
    _classCallCheck(this, BaseRangeReader);

    this._url = stream.url;
    this._done = false;
    this._storedError = null;
    this.onProgress = null;
    this._loaded = 0;
    this._readableStream = null;
    this._readCapability = (0, _util.createPromiseCapability)();
    var source = stream.source;
    this._isStreamingSupported = !source.disableStream;
  }

  _createClass(BaseRangeReader, [{
    key: "read",
    value: function () {
      var _read2 = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee2() {
        var chunk, buffer;
        return _regenerator.default.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                _context2.next = 2;
                return this._readCapability.promise;

              case 2:
                if (!this._done) {
                  _context2.next = 4;
                  break;
                }

                return _context2.abrupt("return", {
                  value: undefined,
                  done: true
                });

              case 4:
                if (!this._storedError) {
                  _context2.next = 6;
                  break;
                }

                throw this._storedError;

              case 6:
                chunk = this._readableStream.read();

                if (!(chunk === null)) {
                  _context2.next = 10;
                  break;
                }

                this._readCapability = (0, _util.createPromiseCapability)();
                return _context2.abrupt("return", this.read());

              case 10:
                this._loaded += chunk.length;

                if (this.onProgress) {
                  this.onProgress({
                    loaded: this._loaded
                  });
                }

                buffer = new Uint8Array(chunk).buffer;
                return _context2.abrupt("return", {
                  value: buffer,
                  done: false
                });

              case 14:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      function read() {
        return _read2.apply(this, arguments);
      }

      return read;
    }()
  }, {
    key: "cancel",
    value: function cancel(reason) {
      if (!this._readableStream) {
        this._error(reason);

        return;
      }

      this._readableStream.destroy(reason);
    }
  }, {
    key: "_error",
    value: function _error(reason) {
      this._storedError = reason;

      this._readCapability.resolve();
    }
  }, {
    key: "_setReadableStream",
    value: function _setReadableStream(readableStream) {
      var _this2 = this;

      this._readableStream = readableStream;
      readableStream.on('readable', function () {
        _this2._readCapability.resolve();
      });
      readableStream.on('end', function () {
        readableStream.destroy();
        _this2._done = true;

        _this2._readCapability.resolve();
      });
      readableStream.on('error', function (reason) {
        _this2._error(reason);
      });

      if (this._storedError) {
        this._readableStream.destroy(this._storedError);
      }
    }
  }, {
    key: "isStreamingSupported",
    get: function get() {
      return this._isStreamingSupported;
    }
  }]);

  return BaseRangeReader;
}();

function createRequestOptions(url, headers) {
  return {
    protocol: url.protocol,
    auth: url.auth,
    host: url.hostname,
    port: url.port,
    path: url.path,
    method: 'GET',
    headers: headers
  };
}

var PDFNodeStreamFullReader =
/*#__PURE__*/
function (_BaseFullReader) {
  _inherits(PDFNodeStreamFullReader, _BaseFullReader);

  function PDFNodeStreamFullReader(stream) {
    var _this3;

    _classCallCheck(this, PDFNodeStreamFullReader);

    _this3 = _possibleConstructorReturn(this, _getPrototypeOf(PDFNodeStreamFullReader).call(this, stream));

    var handleResponse = function handleResponse(response) {
      if (response.statusCode === 404) {
        var error = new _util.MissingPDFException("Missing PDF \"".concat(_this3._url, "\"."));
        _this3._storedError = error;

        _this3._headersCapability.reject(error);

        return;
      }

      _this3._headersCapability.resolve();

      _this3._setReadableStream(response);

      var getResponseHeader = function getResponseHeader(name) {
        return _this3._readableStream.headers[name.toLowerCase()];
      };

      var _validateRangeRequest = (0, _network_utils.validateRangeRequestCapabilities)({
        getResponseHeader: getResponseHeader,
        isHttp: stream.isHttp,
        rangeChunkSize: _this3._rangeChunkSize,
        disableRange: _this3._disableRange
      }),
          allowRangeRequests = _validateRangeRequest.allowRangeRequests,
          suggestedLength = _validateRangeRequest.suggestedLength;

      _this3._isRangeSupported = allowRangeRequests;
      _this3._contentLength = suggestedLength || _this3._contentLength;
      _this3._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader);
    };

    _this3._request = null;

    if (_this3._url.protocol === 'http:') {
      _this3._request = http.request(createRequestOptions(_this3._url, stream.httpHeaders), handleResponse);
    } else {
      _this3._request = https.request(createRequestOptions(_this3._url, stream.httpHeaders), handleResponse);
    }

    _this3._request.on('error', function (reason) {
      _this3._storedError = reason;

      _this3._headersCapability.reject(reason);
    });

    _this3._request.end();

    return _this3;
  }

  return PDFNodeStreamFullReader;
}(BaseFullReader);

var PDFNodeStreamRangeReader =
/*#__PURE__*/
function (_BaseRangeReader) {
  _inherits(PDFNodeStreamRangeReader, _BaseRangeReader);

  function PDFNodeStreamRangeReader(stream, start, end) {
    var _this4;

    _classCallCheck(this, PDFNodeStreamRangeReader);

    _this4 = _possibleConstructorReturn(this, _getPrototypeOf(PDFNodeStreamRangeReader).call(this, stream));
    _this4._httpHeaders = {};

    for (var property in stream.httpHeaders) {
      var value = stream.httpHeaders[property];

      if (typeof value === 'undefined') {
        continue;
      }

      _this4._httpHeaders[property] = value;
    }

    _this4._httpHeaders['Range'] = "bytes=".concat(start, "-").concat(end - 1);

    var handleResponse = function handleResponse(response) {
      if (response.statusCode === 404) {
        var error = new _util.MissingPDFException("Missing PDF \"".concat(_this4._url, "\"."));
        _this4._storedError = error;
        return;
      }

      _this4._setReadableStream(response);
    };

    _this4._request = null;

    if (_this4._url.protocol === 'http:') {
      _this4._request = http.request(createRequestOptions(_this4._url, _this4._httpHeaders), handleResponse);
    } else {
      _this4._request = https.request(createRequestOptions(_this4._url, _this4._httpHeaders), handleResponse);
    }

    _this4._request.on('error', function (reason) {
      _this4._storedError = reason;
    });

    _this4._request.end();

    return _this4;
  }

  return PDFNodeStreamRangeReader;
}(BaseRangeReader);

var PDFNodeStreamFsFullReader =
/*#__PURE__*/
function (_BaseFullReader2) {
  _inherits(PDFNodeStreamFsFullReader, _BaseFullReader2);

  function PDFNodeStreamFsFullReader(stream) {
    var _this5;

    _classCallCheck(this, PDFNodeStreamFsFullReader);

    _this5 = _possibleConstructorReturn(this, _getPrototypeOf(PDFNodeStreamFsFullReader).call(this, stream));
    var path = decodeURIComponent(_this5._url.path);

    if (fileUriRegex.test(_this5._url.href)) {
      path = path.replace(/^\//, '');
    }

    fs.lstat(path, function (error, stat) {
      if (error) {
        if (error.code === 'ENOENT') {
          error = new _util.MissingPDFException("Missing PDF \"".concat(path, "\"."));
        }

        _this5._storedError = error;

        _this5._headersCapability.reject(error);

        return;
      }

      _this5._contentLength = stat.size;

      _this5._setReadableStream(fs.createReadStream(path));

      _this5._headersCapability.resolve();
    });
    return _this5;
  }

  return PDFNodeStreamFsFullReader;
}(BaseFullReader);

var PDFNodeStreamFsRangeReader =
/*#__PURE__*/
function (_BaseRangeReader2) {
  _inherits(PDFNodeStreamFsRangeReader, _BaseRangeReader2);

  function PDFNodeStreamFsRangeReader(stream, start, end) {
    var _this6;

    _classCallCheck(this, PDFNodeStreamFsRangeReader);

    _this6 = _possibleConstructorReturn(this, _getPrototypeOf(PDFNodeStreamFsRangeReader).call(this, stream));
    var path = decodeURIComponent(_this6._url.path);

    if (fileUriRegex.test(_this6._url.href)) {
      path = path.replace(/^\//, '');
    }

    _this6._setReadableStream(fs.createReadStream(path, {
      start: start,
      end: end - 1
    }));

    return _this6;
  }

  return PDFNodeStreamFsRangeReader;
}(BaseRangeReader);

/***/ }),
/* 166 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createResponseStatusError = createResponseStatusError;
exports.extractFilenameFromHeader = extractFilenameFromHeader;
exports.validateRangeRequestCapabilities = validateRangeRequestCapabilities;
exports.validateResponseStatus = validateResponseStatus;

var _util = __w_pdfjs_require__(1);

var _content_disposition = __w_pdfjs_require__(167);

function validateRangeRequestCapabilities(_ref) {
  var getResponseHeader = _ref.getResponseHeader,
      isHttp = _ref.isHttp,
      rangeChunkSize = _ref.rangeChunkSize,
      disableRange = _ref.disableRange;
  (0, _util.assert)(rangeChunkSize > 0, 'Range chunk size must be larger than zero');
  var returnValues = {
    allowRangeRequests: false,
    suggestedLength: undefined
  };
  // CHANGE 4
  // var length = parseInt(getResponseHeader('Content-Length'), 10);
  // CHANGE 4
  var length = NaN;

  if (!Number.isInteger(length)) {
    return returnValues;
  }

  returnValues.suggestedLength = length;

  if (length <= 2 * rangeChunkSize) {
    return returnValues;
  }

  if (disableRange || !isHttp) {
    return returnValues;
  }

  if (getResponseHeader('Accept-Ranges') !== 'bytes') {
    return returnValues;
  }

  var contentEncoding = getResponseHeader('Content-Encoding') || 'identity';

  if (contentEncoding !== 'identity') {
    return returnValues;
  }

  returnValues.allowRangeRequests = true;
  return returnValues;
}

function extractFilenameFromHeader(getResponseHeader) {
  // CHANGE 5
  // var contentDisposition = getResponseHeader('Content-Disposition');
  // if (contentDisposition) {
  //   var filename = (0, _content_disposition.getFilenameFromContentDispositionHeader)(contentDisposition);
  //   if (/\.pdf$/i.test(filename)) {
  //     return filename;
  //   }
  // }
  return null;
}

function createResponseStatusError(status, url) {
  if (status === 404 || status === 0 && /^file:/.test(url)) {
    return new _util.MissingPDFException('Missing PDF "' + url + '".');
  }

  return new _util.UnexpectedResponseException('Unexpected server response (' + status + ') while retrieving PDF "' + url + '".', status);
}

function validateResponseStatus(status) {
  return status === 200 || status === 206;
}

/***/ }),
/* 167 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getFilenameFromContentDispositionHeader = getFilenameFromContentDispositionHeader;

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function getFilenameFromContentDispositionHeader(contentDisposition) {
  var needsEncodingFixup = true;
  var tmp = toParamRegExp('filename\\*', 'i').exec(contentDisposition);

  if (tmp) {
    tmp = tmp[1];
    var filename = rfc2616unquote(tmp);
    filename = unescape(filename);
    filename = rfc5987decode(filename);
    filename = rfc2047decode(filename);
    return fixupEncoding(filename);
  }

  tmp = rfc2231getparam(contentDisposition);

  if (tmp) {
    var _filename = rfc2047decode(tmp);

    return fixupEncoding(_filename);
  }

  tmp = toParamRegExp('filename', 'i').exec(contentDisposition);

  if (tmp) {
    tmp = tmp[1];

    var _filename2 = rfc2616unquote(tmp);

    _filename2 = rfc2047decode(_filename2);
    return fixupEncoding(_filename2);
  }

  function toParamRegExp(attributePattern, flags) {
    return new RegExp('(?:^|;)\\s*' + attributePattern + '\\s*=\\s*' + '(' + '[^";\\s][^;\\s]*' + '|' + '"(?:[^"\\\\]|\\\\"?)+"?' + ')', flags);
  }

  function textdecode(encoding, value) {
    if (encoding) {
      if (!/^[\x00-\xFF]+$/.test(value)) {
        return value;
      }

      try {
        var decoder = new TextDecoder(encoding, {
          fatal: true
        });
        var bytes = Array.from(value, function (ch) {
          return ch.charCodeAt(0) & 0xFF;
        });
        value = decoder.decode(new Uint8Array(bytes));
        needsEncodingFixup = false;
      } catch (e) {
        if (/^utf-?8$/i.test(encoding)) {
          try {
            value = decodeURIComponent(escape(value));
            needsEncodingFixup = false;
          } catch (err) {}
        }
      }
    }

    return value;
  }

  function fixupEncoding(value) {
    if (needsEncodingFixup && /[\x80-\xff]/.test(value)) {
      value = textdecode('utf-8', value);

      if (needsEncodingFixup) {
        value = textdecode('iso-8859-1', value);
      }
    }

    return value;
  }

  function rfc2231getparam(contentDisposition) {
    var matches = [],
        match;
    var iter = toParamRegExp('filename\\*((?!0\\d)\\d+)(\\*?)', 'ig');

    while ((match = iter.exec(contentDisposition)) !== null) {
      var _match = match,
          _match2 = _slicedToArray(_match, 4),
          n = _match2[1],
          quot = _match2[2],
          part = _match2[3];

      n = parseInt(n, 10);

      if (n in matches) {
        if (n === 0) {
          break;
        }

        continue;
      }

      matches[n] = [quot, part];
    }

    var parts = [];

    for (var n = 0; n < matches.length; ++n) {
      if (!(n in matches)) {
        break;
      }

      var _matches$n = _slicedToArray(matches[n], 2),
          quot = _matches$n[0],
          part = _matches$n[1];

      part = rfc2616unquote(part);

      if (quot) {
        part = unescape(part);

        if (n === 0) {
          part = rfc5987decode(part);
        }
      }

      parts.push(part);
    }

    return parts.join('');
  }

  function rfc2616unquote(value) {
    if (value.startsWith('"')) {
      var parts = value.slice(1).split('\\"');

      for (var i = 0; i < parts.length; ++i) {
        var quotindex = parts[i].indexOf('"');

        if (quotindex !== -1) {
          parts[i] = parts[i].slice(0, quotindex);
          parts.length = i + 1;
        }

        parts[i] = parts[i].replace(/\\(.)/g, '$1');
      }

      value = parts.join('"');
    }

    return value;
  }

  function rfc5987decode(extvalue) {
    var encodingend = extvalue.indexOf('\'');

    if (encodingend === -1) {
      return extvalue;
    }

    var encoding = extvalue.slice(0, encodingend);
    var langvalue = extvalue.slice(encodingend + 1);
    var value = langvalue.replace(/^[^']*'/, '');
    return textdecode(encoding, value);
  }

  function rfc2047decode(value) {
    if (!value.startsWith('=?') || /[\x00-\x19\x80-\xff]/.test(value)) {
      return value;
    }

    return value.replace(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function (_, charset, encoding, text) {
      if (encoding === 'q' || encoding === 'Q') {
        text = text.replace(/_/g, ' ');
        text = text.replace(/=([0-9a-fA-F]{2})/g, function (_, hex) {
          return String.fromCharCode(parseInt(hex, 16));
        });
        return textdecode(charset, text);
      }

      try {
        text = atob(text);
      } catch (e) {}

      return textdecode(charset, text);
    });
  }

  return '';
}

/***/ }),
/* 168 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFFetchStream = void 0;

var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147));

var _util = __w_pdfjs_require__(1);

var _network_utils = __w_pdfjs_require__(166);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function createFetchOptions(headers, withCredentials, abortController) {
  return {
    method: 'GET',
    headers: headers,
    signal: abortController && abortController.signal,
    mode: 'cors',
    credentials: withCredentials ? 'include' : 'same-origin',
    redirect: 'follow'
  };
}

var PDFFetchStream =
/*#__PURE__*/
function () {
  function PDFFetchStream(source) {
    _classCallCheck(this, PDFFetchStream);

    this.source = source;
    this.isHttp = /^https?:/i.test(source.url);
    this.httpHeaders = this.isHttp && source.httpHeaders || {};
    this._fullRequestReader = null;
    this._rangeRequestReaders = [];
  }

  _createClass(PDFFetchStream, [{
    key: "getFullReader",
    value: function getFullReader() {
      (0, _util.assert)(!this._fullRequestReader);
      this._fullRequestReader = new PDFFetchStreamReader(this);
      return this._fullRequestReader;
    }
  }, {
    key: "getRangeReader",
    value: function getRangeReader(begin, end) {
      var reader = new PDFFetchStreamRangeReader(this, begin, end);

      this._rangeRequestReaders.push(reader);

      return reader;
    }
  }, {
    key: "cancelAllRequests",
    value: function cancelAllRequests(reason) {
      if (this._fullRequestReader) {
        this._fullRequestReader.cancel(reason);
      }

      var readers = this._rangeRequestReaders.slice(0);

      readers.forEach(function (reader) {
        reader.cancel(reason);
      });
    }
  }]);

  return PDFFetchStream;
}();

exports.PDFFetchStream = PDFFetchStream;

var PDFFetchStreamReader =
/*#__PURE__*/
function () {
  function PDFFetchStreamReader(stream) {
    var _this = this;

    _classCallCheck(this, PDFFetchStreamReader);

    this._stream = stream;
    this._reader = null;
    this._loaded = 0;
    this._filename = null;
    var source = stream.source;
    this._withCredentials = source.withCredentials;
    this._contentLength = source.length;
    this._headersCapability = (0, _util.createPromiseCapability)();
    this._disableRange = source.disableRange || false;
    this._rangeChunkSize = source.rangeChunkSize;

    if (!this._rangeChunkSize && !this._disableRange) {
      this._disableRange = true;
    }

    if (typeof AbortController !== 'undefined') {
      this._abortController = new AbortController();
    }

    this._isStreamingSupported = !source.disableStream;
    this._isRangeSupported = !source.disableRange;
    this._headers = new Headers();

    for (var property in this._stream.httpHeaders) {
      var value = this._stream.httpHeaders[property];

      if (typeof value === 'undefined') {
        continue;
      }

      this._headers.append(property, value);
    }

    var url = source.url;
    fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(function (response) {
      if (!(0, _network_utils.validateResponseStatus)(response.status)) {
        throw (0, _network_utils.createResponseStatusError)(response.status, url);
      }

      _this._reader = response.body.getReader();

      _this._headersCapability.resolve();

      var getResponseHeader = function getResponseHeader(name) {
        return response.headers.get(name);
      };

      var _validateRangeRequest = (0, _network_utils.validateRangeRequestCapabilities)({
        getResponseHeader: getResponseHeader,
        isHttp: _this._stream.isHttp,
        rangeChunkSize: _this._rangeChunkSize,
        disableRange: _this._disableRange
      }),
          allowRangeRequests = _validateRangeRequest.allowRangeRequests,
          suggestedLength = _validateRangeRequest.suggestedLength;

      _this._isRangeSupported = allowRangeRequests;
      _this._contentLength = suggestedLength || _this._contentLength;
      _this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader);

      if (!_this._isStreamingSupported && _this._isRangeSupported) {
        _this.cancel(new _util.AbortException('streaming is disabled'));
      }
    }).catch(this._headersCapability.reject);
    this.onProgress = null;
  }

  _createClass(PDFFetchStreamReader, [{
    key: "read",
    value: function () {
      var _read = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee() {
        var _ref, value, done, buffer;

        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                _context.next = 2;
                return this._headersCapability.promise;

              case 2:
                _context.next = 4;
                return this._reader.read();

              case 4:
                _ref = _context.sent;
                value = _ref.value;
                done = _ref.done;

                if (!done) {
                  _context.next = 9;
                  break;
                }

                return _context.abrupt("return", {
                  value: value,
                  done: done
                });

              case 9:
                this._loaded += value.byteLength;

                if (this.onProgress) {
                  this.onProgress({
                    loaded: this._loaded,
                    total: this._contentLength
                  });
                }

                buffer = new Uint8Array(value).buffer;
                return _context.abrupt("return", {
                  value: buffer,
                  done: false
                });

              case 13:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function read() {
        return _read.apply(this, arguments);
      }

      return read;
    }()
  }, {
    key: "cancel",
    value: function cancel(reason) {
      if (this._reader) {
        this._reader.cancel(reason);
      }

      if (this._abortController) {
        this._abortController.abort();
      }
    }
  }, {
    key: "headersReady",
    get: function get() {
      return this._headersCapability.promise;
    }
  }, {
    key: "filename",
    get: function get() {
      return this._filename;
    }
  }, {
    key: "contentLength",
    get: function get() {
      return this._contentLength;
    }
  }, {
    key: "isRangeSupported",
    get: function get() {
      return this._isRangeSupported;
    }
  }, {
    key: "isStreamingSupported",
    get: function get() {
      return this._isStreamingSupported;
    }
  }]);

  return PDFFetchStreamReader;
}();

var PDFFetchStreamRangeReader =
/*#__PURE__*/
function () {
  function PDFFetchStreamRangeReader(stream, begin, end) {
    var _this2 = this;

    _classCallCheck(this, PDFFetchStreamRangeReader);

    this._stream = stream;
    this._reader = null;
    this._loaded = 0;
    var source = stream.source;
    this._withCredentials = source.withCredentials;
    this._readCapability = (0, _util.createPromiseCapability)();
    this._isStreamingSupported = !source.disableStream;

    if (typeof AbortController !== 'undefined') {
      this._abortController = new AbortController();
    }

    this._headers = new Headers();

    for (var property in this._stream.httpHeaders) {
      var value = this._stream.httpHeaders[property];

      if (typeof value === 'undefined') {
        continue;
      }

      this._headers.append(property, value);
    }

    var rangeStr = begin + '-' + (end - 1);

    this._headers.append('Range', 'bytes=' + rangeStr);

    var url = source.url;
    fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(function (response) {
      if (!(0, _network_utils.validateResponseStatus)(response.status)) {
        throw (0, _network_utils.createResponseStatusError)(response.status, url);
      }

      _this2._readCapability.resolve();

      _this2._reader = response.body.getReader();
    });
    this.onProgress = null;
  }

  _createClass(PDFFetchStreamRangeReader, [{
    key: "read",
    value: function () {
      var _read2 = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee2() {
        var _ref2, value, done, buffer;

        return _regenerator.default.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                _context2.next = 2;
                return this._readCapability.promise;

              case 2:
                _context2.next = 4;
                return this._reader.read();

              case 4:
                _ref2 = _context2.sent;
                value = _ref2.value;
                done = _ref2.done;

                if (!done) {
                  _context2.next = 9;
                  break;
                }

                return _context2.abrupt("return", {
                  value: value,
                  done: done
                });

              case 9:
                this._loaded += value.byteLength;

                if (this.onProgress) {
                  this.onProgress({
                    loaded: this._loaded
                  });
                }

                buffer = new Uint8Array(value).buffer;
                return _context2.abrupt("return", {
                  value: buffer,
                  done: false
                });

              case 13:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      function read() {
        return _read2.apply(this, arguments);
      }

      return read;
    }()
  }, {
    key: "cancel",
    value: function cancel(reason) {
      if (this._reader) {
        this._reader.cancel(reason);
      }

      if (this._abortController) {
        this._abortController.abort();
      }
    }
  }, {
    key: "isStreamingSupported",
    get: function get() {
      return this._isStreamingSupported;
    }
  }]);

  return PDFFetchStreamRangeReader;
}();

/***/ }),
/* 169 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFNetworkStream = PDFNetworkStream;
exports.NetworkManager = NetworkManager;

var _regenerator = _interopRequireDefault(__w_pdfjs_require__(147));

var _util = __w_pdfjs_require__(1);

var _network_utils = __w_pdfjs_require__(166);

var _global_scope = _interopRequireDefault(__w_pdfjs_require__(3));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

;
var OK_RESPONSE = 200;
var PARTIAL_CONTENT_RESPONSE = 206;

function NetworkManager(url, args) {
  this.url = url;
  args = args || {};
  this.isHttp = /^https?:/i.test(url);
  this.httpHeaders = this.isHttp && args.httpHeaders || {};
  this.withCredentials = args.withCredentials || false;

  this.getXhr = args.getXhr || function NetworkManager_getXhr() {
    return new XMLHttpRequest();
  };

  this.currXhrId = 0;
  this.pendingRequests = Object.create(null);
  this.loadedRequests = Object.create(null);
}

function getArrayBuffer(xhr) {
  var data = xhr.response;

  if (typeof data !== 'string') {
    return data;
  }

  var array = (0, _util.stringToBytes)(data);
  return array.buffer;
}

// CHANGE 6
// var supportsMozChunked = function supportsMozChunkedClosure() {
//   try {
//     var x = new XMLHttpRequest();
//     x.open('GET', _global_scope2.default.location.href);
//     x.responseType = 'moz-chunked-arraybuffer';
//     return x.responseType === 'moz-chunked-arraybuffer';
//   } catch (e) {
//     return false;
//   }
// }();
// CHANGE 6
var supportsMozChunked = false;

NetworkManager.prototype = {
  requestRange: function NetworkManager_requestRange(begin, end, listeners) {
    var args = {
      begin: begin,
      end: end
    };

    for (var prop in listeners) {
      args[prop] = listeners[prop];
    }

    return this.request(args);
  },
  requestFull: function NetworkManager_requestFull(listeners) {
    return this.request(listeners);
  },
  request: function NetworkManager_request(args) {
    var xhr = this.getXhr();
    var xhrId = this.currXhrId++;
    var pendingRequest = this.pendingRequests[xhrId] = {
      xhr: xhr
    };
    xhr.open('GET', this.url);
    xhr.withCredentials = this.withCredentials;

    for (var property in this.httpHeaders) {
      var value = this.httpHeaders[property];

      if (typeof value === 'undefined') {
        continue;
      }

      xhr.setRequestHeader(property, value);
    }

    if (this.isHttp && 'begin' in args && 'end' in args) {
      var rangeStr = args.begin + '-' + (args.end - 1);
      xhr.setRequestHeader('Range', 'bytes=' + rangeStr);
      pendingRequest.expectedStatus = 206;
    } else {
      pendingRequest.expectedStatus = 200;
    }

    var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData;

    if (useMozChunkedLoading) {
      xhr.responseType = 'moz-chunked-arraybuffer';
      pendingRequest.onProgressiveData = args.onProgressiveData;
      pendingRequest.mozChunked = true;
    } else {
      xhr.responseType = 'arraybuffer';
    }

    if (args.onError) {
      xhr.onerror = function (evt) {
        args.onError(xhr.status);
      };
    }

    xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);
    xhr.onprogress = this.onProgress.bind(this, xhrId);
    pendingRequest.onHeadersReceived = args.onHeadersReceived;
    pendingRequest.onDone = args.onDone;
    pendingRequest.onError = args.onError;
    pendingRequest.onProgress = args.onProgress;
    xhr.send(null);
    return xhrId;
  },
  onProgress: function NetworkManager_onProgress(xhrId, evt) {
    var pendingRequest = this.pendingRequests[xhrId];

    if (!pendingRequest) {
      return;
    }

    if (pendingRequest.mozChunked) {
      var chunk = getArrayBuffer(pendingRequest.xhr);
      pendingRequest.onProgressiveData(chunk);
    }

    var onProgress = pendingRequest.onProgress;

    if (onProgress) {
      onProgress(evt);
    }
  },
  onStateChange: function NetworkManager_onStateChange(xhrId, evt) {
    var pendingRequest = this.pendingRequests[xhrId];

    if (!pendingRequest) {
      return;
    }

    var xhr = pendingRequest.xhr;

    if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {
      pendingRequest.onHeadersReceived();
      delete pendingRequest.onHeadersReceived;
    }

    if (xhr.readyState !== 4) {
      return;
    }

    if (!(xhrId in this.pendingRequests)) {
      return;
    }

    delete this.pendingRequests[xhrId];

    if (xhr.status === 0 && this.isHttp) {
      if (pendingRequest.onError) {
        pendingRequest.onError(xhr.status);
      }

      return;
    }

    var xhrStatus = xhr.status || OK_RESPONSE;
    var ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;

    if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) {
      if (pendingRequest.onError) {
        pendingRequest.onError(xhr.status);
      }

      return;
    }

    this.loadedRequests[xhrId] = true;
    var chunk = getArrayBuffer(xhr);

    if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {
      var rangeHeader = xhr.getResponseHeader('Content-Range');
      var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
      var begin = parseInt(matches[1], 10);
      pendingRequest.onDone({
        begin: begin,
        chunk: chunk
      });
    } else if (pendingRequest.onProgressiveData) {
      pendingRequest.onDone(null);
    } else if (chunk) {
      pendingRequest.onDone({
        begin: 0,
        chunk: chunk
      });
    } else if (pendingRequest.onError) {
      pendingRequest.onError(xhr.status);
    }
  },
  hasPendingRequests: function NetworkManager_hasPendingRequests() {
    for (var xhrId in this.pendingRequests) {
      return true;
    }

    return false;
  },
  getRequestXhr: function NetworkManager_getXhr(xhrId) {
    return this.pendingRequests[xhrId].xhr;
  },
  isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) {
    return !!this.pendingRequests[xhrId].onProgressiveData;
  },
  isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {
    return xhrId in this.pendingRequests;
  },
  isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {
    return xhrId in this.loadedRequests;
  },
  abortAllRequests: function NetworkManager_abortAllRequests() {
    for (var xhrId in this.pendingRequests) {
      this.abortRequest(xhrId | 0);
    }
  },
  abortRequest: function NetworkManager_abortRequest(xhrId) {
    var xhr = this.pendingRequests[xhrId].xhr;
    delete this.pendingRequests[xhrId];
    xhr.abort();
  }
};

function PDFNetworkStream(source) {
  this._source = source;
  this._manager = new NetworkManager(source.url, {
    httpHeaders: source.httpHeaders,
    withCredentials: source.withCredentials
  });
  this._rangeChunkSize = source.rangeChunkSize;
  this._fullRequestReader = null;
  this._rangeRequestReaders = [];
}

PDFNetworkStream.prototype = {
  _onRangeRequestReaderClosed: function PDFNetworkStream_onRangeRequestReaderClosed(reader) {
    var i = this._rangeRequestReaders.indexOf(reader);

    if (i >= 0) {
      this._rangeRequestReaders.splice(i, 1);
    }
  },
  getFullReader: function PDFNetworkStream_getFullReader() {
    (0, _util.assert)(!this._fullRequestReader);
    this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source);
    return this._fullRequestReader;
  },
  getRangeReader: function PDFNetworkStream_getRangeReader(begin, end) {
    var reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end);
    reader.onClosed = this._onRangeRequestReaderClosed.bind(this);

    this._rangeRequestReaders.push(reader);

    return reader;
  },
  cancelAllRequests: function PDFNetworkStream_cancelAllRequests(reason) {
    if (this._fullRequestReader) {
      this._fullRequestReader.cancel(reason);
    }

    var readers = this._rangeRequestReaders.slice(0);

    readers.forEach(function (reader) {
      reader.cancel(reason);
    });
  }
};

function PDFNetworkStreamFullRequestReader(manager, source) {
  this._manager = manager;
  var args = {
    onHeadersReceived: this._onHeadersReceived.bind(this),
    onProgressiveData: source.disableStream ? null : this._onProgressiveData.bind(this),
    onDone: this._onDone.bind(this),
    onError: this._onError.bind(this),
    onProgress: this._onProgress.bind(this)
  };
  this._url = source.url;
  this._fullRequestId = manager.requestFull(args);
  this._headersReceivedCapability = (0, _util.createPromiseCapability)();
  this._disableRange = source.disableRange || false;
  this._contentLength = source.length;
  this._rangeChunkSize = source.rangeChunkSize;

  if (!this._rangeChunkSize && !this._disableRange) {
    this._disableRange = true;
  }

  this._isStreamingSupported = false;
  this._isRangeSupported = false;
  this._cachedChunks = [];
  this._requests = [];
  this._done = false;
  this._storedError = undefined;
  this._filename = null;
  this.onProgress = null;
}

PDFNetworkStreamFullRequestReader.prototype = {
  _onHeadersReceived: function PDFNetworkStreamFullRequestReader_onHeadersReceived() {
    var fullRequestXhrId = this._fullRequestId;

    var fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId);

    var getResponseHeader = function getResponseHeader(name) {
      return fullRequestXhr.getResponseHeader(name);
    };

    var _validateRangeRequest = (0, _network_utils.validateRangeRequestCapabilities)({
      getResponseHeader: getResponseHeader,
      isHttp: this._manager.isHttp,
      rangeChunkSize: this._rangeChunkSize,
      disableRange: this._disableRange
    }),
        allowRangeRequests = _validateRangeRequest.allowRangeRequests,
        suggestedLength = _validateRangeRequest.suggestedLength;

    if (allowRangeRequests) {
      this._isRangeSupported = true;
    }

    this._contentLength = suggestedLength || this._contentLength;
    this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader);
    var networkManager = this._manager;

    if (networkManager.isStreamingRequest(fullRequestXhrId)) {
      this._isStreamingSupported = true;
    } else if (this._isRangeSupported) {
      networkManager.abortRequest(fullRequestXhrId);
    }

    this._headersReceivedCapability.resolve();
  },
  _onProgressiveData: function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk) {
    if (this._requests.length > 0) {
      var requestCapability = this._requests.shift();

      requestCapability.resolve({
        value: chunk,
        done: false
      });
    } else {
      this._cachedChunks.push(chunk);
    }
  },
  _onDone: function PDFNetworkStreamFullRequestReader_onDone(args) {
    if (args) {
      this._onProgressiveData(args.chunk);
    }

    this._done = true;

    if (this._cachedChunks.length > 0) {
      return;
    }

    this._requests.forEach(function (requestCapability) {
      requestCapability.resolve({
        value: undefined,
        done: true
      });
    });

    this._requests = [];
  },
  _onError: function PDFNetworkStreamFullRequestReader_onError(status) {
    var url = this._url;
    var exception = (0, _network_utils.createResponseStatusError)(status, url);
    this._storedError = exception;

    this._headersReceivedCapability.reject(exception);

    this._requests.forEach(function (requestCapability) {
      requestCapability.reject(exception);
    });

    this._requests = [];
    this._cachedChunks = [];
  },
  _onProgress: function PDFNetworkStreamFullRequestReader_onProgress(data) {
    if (this.onProgress) {
      this.onProgress({
        loaded: data.loaded,
        total: data.lengthComputable ? data.total : this._contentLength
      });
    }
  },

  get filename() {
    return this._filename;
  },

  get isRangeSupported() {
    return this._isRangeSupported;
  },

  get isStreamingSupported() {
    return this._isStreamingSupported;
  },

  get contentLength() {
    return this._contentLength;
  },

  get headersReady() {
    return this._headersReceivedCapability.promise;
  },

  read: function () {
    var _read = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee() {
      var chunk, requestCapability;
      return _regenerator.default.wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              if (!this._storedError) {
                _context.next = 2;
                break;
              }

              throw this._storedError;

            case 2:
              if (!(this._cachedChunks.length > 0)) {
                _context.next = 5;
                break;
              }

              chunk = this._cachedChunks.shift();
              return _context.abrupt("return", {
                value: chunk,
                done: false
              });

            case 5:
              if (!this._done) {
                _context.next = 7;
                break;
              }

              return _context.abrupt("return", {
                value: undefined,
                done: true
              });

            case 7:
              requestCapability = (0, _util.createPromiseCapability)();

              this._requests.push(requestCapability);

              return _context.abrupt("return", requestCapability.promise);

            case 10:
            case "end":
              return _context.stop();
          }
        }
      }, _callee, this);
    }));

    function read() {
      return _read.apply(this, arguments);
    }

    return read;
  }(),
  cancel: function PDFNetworkStreamFullRequestReader_cancel(reason) {
    this._done = true;

    this._headersReceivedCapability.reject(reason);

    this._requests.forEach(function (requestCapability) {
      requestCapability.resolve({
        value: undefined,
        done: true
      });
    });

    this._requests = [];

    if (this._manager.isPendingRequest(this._fullRequestId)) {
      this._manager.abortRequest(this._fullRequestId);
    }

    this._fullRequestReader = null;
  }
};

function PDFNetworkStreamRangeRequestReader(manager, begin, end) {
  this._manager = manager;
  var args = {
    onDone: this._onDone.bind(this),
    onProgress: this._onProgress.bind(this)
  };
  this._requestId = manager.requestRange(begin, end, args);
  this._requests = [];
  this._queuedChunk = null;
  this._done = false;
  this.onProgress = null;
  this.onClosed = null;
}

PDFNetworkStreamRangeRequestReader.prototype = {
  _close: function PDFNetworkStreamRangeRequestReader_close() {
    if (this.onClosed) {
      this.onClosed(this);
    }
  },
  _onDone: function PDFNetworkStreamRangeRequestReader_onDone(data) {
    var chunk = data.chunk;

    if (this._requests.length > 0) {
      var requestCapability = this._requests.shift();

      requestCapability.resolve({
        value: chunk,
        done: false
      });
    } else {
      this._queuedChunk = chunk;
    }

    this._done = true;

    this._requests.forEach(function (requestCapability) {
      requestCapability.resolve({
        value: undefined,
        done: true
      });
    });

    this._requests = [];

    this._close();
  },
  _onProgress: function PDFNetworkStreamRangeRequestReader_onProgress(evt) {
    if (!this.isStreamingSupported && this.onProgress) {
      this.onProgress({
        loaded: evt.loaded
      });
    }
  },

  get isStreamingSupported() {
    return false;
  },

  read: function () {
    var _read2 = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee2() {
      var chunk, requestCapability;
      return _regenerator.default.wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              if (!(this._queuedChunk !== null)) {
                _context2.next = 4;
                break;
              }

              chunk = this._queuedChunk;
              this._queuedChunk = null;
              return _context2.abrupt("return", {
                value: chunk,
                done: false
              });

            case 4:
              if (!this._done) {
                _context2.next = 6;
                break;
              }

              return _context2.abrupt("return", {
                value: undefined,
                done: true
              });

            case 6:
              requestCapability = (0, _util.createPromiseCapability)();

              this._requests.push(requestCapability);

              return _context2.abrupt("return", requestCapability.promise);

            case 9:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2, this);
    }));

    function read() {
      return _read2.apply(this, arguments);
    }

    return read;
  }(),
  cancel: function PDFNetworkStreamRangeRequestReader_cancel(reason) {
    this._done = true;

    this._requests.forEach(function (requestCapability) {
      requestCapability.resolve({
        value: undefined,
        done: true
      });
    });

    this._requests = [];

    if (this._manager.isPendingRequest(this._requestId)) {
      this._manager.abortRequest(this._requestId);
    }

    this._close();
  }
};

/***/ })
/******/ ]);
});/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @file Customized file from pdfjs-dist@2.1.266
 * Changes:
 * - CHANGE 1: We have removed references to `.map` files, which won't work after changes.
 * - CHANGE 2: We have added es6-shim@0.35.4 for compatibility with older Chrome.
 * - CHANGE 3: We have added console-polyfill@0.3.0 for compatibility with older Chrome.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

/**
 * @licstart The following is the entire license notice for the
 * Javascript code in this page
 *
 * Copyright 2018 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.
 *
 * @licend The above is the entire license notice for the
 * Javascript code in this page
 */

// CHANGE 2
/*!
 * https://github.com/paulmillr/es6-shim
 * @license es6-shim Copyright 2013-2016 by Paul Miller (http://paulmillr.com)
 *   and contributors,  MIT License
 * es6-shim: v0.35.4
 * see https://github.com/paulmillr/es6-shim/blob/0.35.3/LICENSE
 * Details and documentation:
 * https://github.com/paulmillr/es6-shim/
 */
(function(e,t){if(typeof define==="function"&&define.amd){define(t)}else if(typeof exports==="object"){module.exports=t()}else{e.returnExports=t()}})(this,function(){"use strict";var e=Function.call.bind(Function.apply);var t=Function.call.bind(Function.call);var r=Array.isArray;var n=Object.keys;var o=function notThunker(t){return function notThunk(){return!e(t,this,arguments)}};var i=function(e){try{e();return false}catch(t){return true}};var a=function valueOrFalseIfThrows(e){try{return e()}catch(t){return false}};var u=o(i);var f=function(){return!i(function(){return Object.defineProperty({},"x",{get:function(){}})})};var s=!!Object.defineProperty&&f();var c=function foo(){}.name==="foo";var l=Function.call.bind(Array.prototype.forEach);var p=Function.call.bind(Array.prototype.reduce);var v=Function.call.bind(Array.prototype.filter);var y=Function.call.bind(Array.prototype.some);var h=function(e,t,r,n){if(!n&&t in e){return}if(s){Object.defineProperty(e,t,{configurable:true,enumerable:false,writable:true,value:r})}else{e[t]=r}};var b=function(e,t,r){l(n(t),function(n){var o=t[n];h(e,n,o,!!r)})};var g=Function.call.bind(Object.prototype.toString);var d=typeof/abc/==="function"?function IsCallableSlow(e){return typeof e==="function"&&g(e)==="[object Function]"}:function IsCallableFast(e){return typeof e==="function"};var m={getter:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}Object.defineProperty(e,t,{configurable:true,enumerable:false,get:r})},proxy:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,{configurable:n.configurable,enumerable:n.enumerable,get:function getKey(){return e[t]},set:function setKey(r){e[t]=r}})},redefine:function(e,t,r){if(s){var n=Object.getOwnPropertyDescriptor(e,t);n.value=r;Object.defineProperty(e,t,n)}else{e[t]=r}},defineByDescriptor:function(e,t,r){if(s){Object.defineProperty(e,t,r)}else if("value"in r){e[t]=r.value}},preserveToString:function(e,t){if(t&&d(t.toString)){h(e,"toString",t.toString.bind(t),true)}}};var O=Object.create||function(e,t){var r=function Prototype(){};r.prototype=e;var o=new r;if(typeof t!=="undefined"){n(t).forEach(function(e){m.defineByDescriptor(o,e,t[e])})}return o};var w=function(e,t){if(!Object.setPrototypeOf){return false}return a(function(){var r=function Subclass(t){var r=new e(t);Object.setPrototypeOf(r,Subclass.prototype);return r};Object.setPrototypeOf(r,e);r.prototype=O(e.prototype,{constructor:{value:r}});return t(r)})};var j=function(){if(typeof self!=="undefined"){return self}if(typeof window!=="undefined"){return window}if(typeof global!=="undefined"){return global}throw new Error("unable to locate global object")};var S=j();var T=S.isFinite;var I=Function.call.bind(String.prototype.indexOf);var E=Function.apply.bind(Array.prototype.indexOf);var P=Function.call.bind(Array.prototype.concat);var C=Function.call.bind(String.prototype.slice);var M=Function.call.bind(Array.prototype.push);var x=Function.apply.bind(Array.prototype.push);var N=Function.call.bind(Array.prototype.shift);var A=Math.max;var R=Math.min;var _=Math.floor;var k=Math.abs;var L=Math.exp;var F=Math.log;var D=Math.sqrt;var z=Function.call.bind(Object.prototype.hasOwnProperty);var q;var W=function(){};var G=S.Map;var H=G&&G.prototype["delete"];var V=G&&G.prototype.get;var B=G&&G.prototype.has;var U=G&&G.prototype.set;var $=S.Symbol||{};var J=$.species||"@@species";var X=Number.isNaN||function isNaN(e){return e!==e};var K=Number.isFinite||function isFinite(e){return typeof e==="number"&&T(e)};var Z=d(Math.sign)?Math.sign:function sign(e){var t=Number(e);if(t===0){return t}if(X(t)){return t}return t<0?-1:1};var Y=function log1p(e){var t=Number(e);if(t<-1||X(t)){return NaN}if(t===0||t===Infinity){return t}if(t===-1){return-Infinity}return 1+t-1===0?t:t*(F(1+t)/(1+t-1))};var Q=function isArguments(e){return g(e)==="[object Arguments]"};var ee=function isArguments(e){return e!==null&&typeof e==="object"&&typeof e.length==="number"&&e.length>=0&&g(e)!=="[object Array]"&&g(e.callee)==="[object Function]"};var te=Q(arguments)?Q:ee;var re={primitive:function(e){return e===null||typeof e!=="function"&&typeof e!=="object"},string:function(e){return g(e)==="[object String]"},regex:function(e){return g(e)==="[object RegExp]"},symbol:function(e){return typeof S.Symbol==="function"&&typeof e==="symbol"}};var ne=function overrideNative(e,t,r){var n=e[t];h(e,t,r,true);m.preserveToString(e[t],n)};var oe=typeof $==="function"&&typeof $["for"]==="function"&&re.symbol($());var ie=re.symbol($.iterator)?$.iterator:"_es6-shim iterator_";if(S.Set&&typeof(new S.Set)["@@iterator"]==="function"){ie="@@iterator"}if(!S.Reflect){h(S,"Reflect",{},true)}var ae=S.Reflect;var ue=String;var fe=typeof document==="undefined"||!document?null:document.all;var se=fe==null?function isNullOrUndefined(e){return e==null}:function isNullOrUndefinedAndNotDocumentAll(e){return e==null&&e!==fe};var ce={Call:function Call(t,r){var n=arguments.length>2?arguments[2]:[];if(!ce.IsCallable(t)){throw new TypeError(t+" is not a function")}return e(t,r,n)},RequireObjectCoercible:function(e,t){if(se(e)){throw new TypeError(t||"Cannot call method on "+e)}return e},TypeIsObject:function(e){if(e===void 0||e===null||e===true||e===false){return false}return typeof e==="function"||typeof e==="object"||e===fe},ToObject:function(e,t){return Object(ce.RequireObjectCoercible(e,t))},IsCallable:d,IsConstructor:function(e){return ce.IsCallable(e)},ToInt32:function(e){return ce.ToNumber(e)>>0},ToUint32:function(e){return ce.ToNumber(e)>>>0},ToNumber:function(e){if(g(e)==="[object Symbol]"){throw new TypeError("Cannot convert a Symbol value to a number")}return+e},ToInteger:function(e){var t=ce.ToNumber(e);if(X(t)){return 0}if(t===0||!K(t)){return t}return(t>0?1:-1)*_(k(t))},ToLength:function(e){var t=ce.ToInteger(e);if(t<=0){return 0}if(t>Number.MAX_SAFE_INTEGER){return Number.MAX_SAFE_INTEGER}return t},SameValue:function(e,t){if(e===t){if(e===0){return 1/e===1/t}return true}return X(e)&&X(t)},SameValueZero:function(e,t){return e===t||X(e)&&X(t)},IsIterable:function(e){return ce.TypeIsObject(e)&&(typeof e[ie]!=="undefined"||te(e))},GetIterator:function(e){if(te(e)){return new q(e,"value")}var t=ce.GetMethod(e,ie);if(!ce.IsCallable(t)){throw new TypeError("value is not an iterable")}var r=ce.Call(t,e);if(!ce.TypeIsObject(r)){throw new TypeError("bad iterator")}return r},GetMethod:function(e,t){var r=ce.ToObject(e)[t];if(se(r)){return void 0}if(!ce.IsCallable(r)){throw new TypeError("Method not callable: "+t)}return r},IteratorComplete:function(e){return!!e.done},IteratorClose:function(e,t){var r=ce.GetMethod(e,"return");if(r===void 0){return}var n,o;try{n=ce.Call(r,e)}catch(i){o=i}if(t){return}if(o){throw o}if(!ce.TypeIsObject(n)){throw new TypeError("Iterator's return method returned a non-object.")}},IteratorNext:function(e){var t=arguments.length>1?e.next(arguments[1]):e.next();if(!ce.TypeIsObject(t)){throw new TypeError("bad iterator")}return t},IteratorStep:function(e){var t=ce.IteratorNext(e);var r=ce.IteratorComplete(t);return r?false:t},Construct:function(e,t,r,n){var o=typeof r==="undefined"?e:r;if(!n&&ae.construct){return ae.construct(e,t,o)}var i=o.prototype;if(!ce.TypeIsObject(i)){i=Object.prototype}var a=O(i);var u=ce.Call(e,a,t);return ce.TypeIsObject(u)?u:a},SpeciesConstructor:function(e,t){var r=e.constructor;if(r===void 0){return t}if(!ce.TypeIsObject(r)){throw new TypeError("Bad constructor")}var n=r[J];if(se(n)){return t}if(!ce.IsConstructor(n)){throw new TypeError("Bad @@species")}return n},CreateHTML:function(e,t,r,n){var o=ce.ToString(e);var i="<"+t;if(r!==""){var a=ce.ToString(n);var u=a.replace(/"/g,"&quot;");i+=" "+r+'="'+u+'"'}var f=i+">";var s=f+o;return s+"</"+t+">"},IsRegExp:function IsRegExp(e){if(!ce.TypeIsObject(e)){return false}var t=e[$.match];if(typeof t!=="undefined"){return!!t}return re.regex(e)},ToString:function ToString(e){return ue(e)}};if(s&&oe){var le=function defineWellKnownSymbol(e){if(re.symbol($[e])){return $[e]}var t=$["for"]("Symbol."+e);Object.defineProperty($,e,{configurable:false,enumerable:false,writable:false,value:t});return t};if(!re.symbol($.search)){var pe=le("search");var ve=String.prototype.search;h(RegExp.prototype,pe,function search(e){return ce.Call(ve,e,[this])});var ye=function search(e){var t=ce.RequireObjectCoercible(this);if(!se(e)){var r=ce.GetMethod(e,pe);if(typeof r!=="undefined"){return ce.Call(r,e,[t])}}return ce.Call(ve,t,[ce.ToString(e)])};ne(String.prototype,"search",ye)}if(!re.symbol($.replace)){var he=le("replace");var be=String.prototype.replace;h(RegExp.prototype,he,function replace(e,t){return ce.Call(be,e,[this,t])});var ge=function replace(e,t){var r=ce.RequireObjectCoercible(this);if(!se(e)){var n=ce.GetMethod(e,he);if(typeof n!=="undefined"){return ce.Call(n,e,[r,t])}}return ce.Call(be,r,[ce.ToString(e),t])};ne(String.prototype,"replace",ge)}if(!re.symbol($.split)){var de=le("split");var me=String.prototype.split;h(RegExp.prototype,de,function split(e,t){return ce.Call(me,e,[this,t])});var Oe=function split(e,t){var r=ce.RequireObjectCoercible(this);if(!se(e)){var n=ce.GetMethod(e,de);if(typeof n!=="undefined"){return ce.Call(n,e,[r,t])}}return ce.Call(me,r,[ce.ToString(e),t])};ne(String.prototype,"split",Oe)}var we=re.symbol($.match);var je=we&&function(){var e={};e[$.match]=function(){return 42};return"a".match(e)!==42}();if(!we||je){var Se=le("match");var Te=String.prototype.match;h(RegExp.prototype,Se,function match(e){return ce.Call(Te,e,[this])});var Ie=function match(e){var t=ce.RequireObjectCoercible(this);if(!se(e)){var r=ce.GetMethod(e,Se);if(typeof r!=="undefined"){return ce.Call(r,e,[t])}}return ce.Call(Te,t,[ce.ToString(e)])};ne(String.prototype,"match",Ie)}}var Ee=function wrapConstructor(e,t,r){m.preserveToString(t,e);if(Object.setPrototypeOf){Object.setPrototypeOf(e,t)}if(s){l(Object.getOwnPropertyNames(e),function(n){if(n in W||r[n]){return}m.proxy(e,n,t)})}else{l(Object.keys(e),function(n){if(n in W||r[n]){return}t[n]=e[n]})}t.prototype=e.prototype;m.redefine(e.prototype,"constructor",t)};var Pe=function(){return this};var Ce=function(e){if(s&&!z(e,J)){m.getter(e,J,Pe)}};var Me=function(e,t){var r=t||function iterator(){return this};h(e,ie,r);if(!e[ie]&&re.symbol(ie)){e[ie]=r}};var xe=function createDataProperty(e,t,r){if(s){Object.defineProperty(e,t,{configurable:true,enumerable:true,writable:true,value:r})}else{e[t]=r}};var Ne=function createDataPropertyOrThrow(e,t,r){xe(e,t,r);if(!ce.SameValue(e[t],r)){throw new TypeError("property is nonconfigurable")}};var Ae=function(e,t,r,n){if(!ce.TypeIsObject(e)){throw new TypeError("Constructor requires `new`: "+t.name)}var o=t.prototype;if(!ce.TypeIsObject(o)){o=r}var i=O(o);for(var a in n){if(z(n,a)){var u=n[a];h(i,a,u,true)}}return i};if(String.fromCodePoint&&String.fromCodePoint.length!==1){var Re=String.fromCodePoint;ne(String,"fromCodePoint",function fromCodePoint(e){return ce.Call(Re,this,arguments)})}var _e={fromCodePoint:function fromCodePoint(e){var t=[];var r;for(var n=0,o=arguments.length;n<o;n++){r=Number(arguments[n]);if(!ce.SameValue(r,ce.ToInteger(r))||r<0||r>1114111){throw new RangeError("Invalid code point "+r)}if(r<65536){M(t,String.fromCharCode(r))}else{r-=65536;M(t,String.fromCharCode((r>>10)+55296));M(t,String.fromCharCode(r%1024+56320))}}return t.join("")},raw:function raw(e){var t=ce.ToObject(e,"bad callSite");var r=ce.ToObject(t.raw,"bad raw value");var n=r.length;var o=ce.ToLength(n);if(o<=0){return""}var i=[];var a=0;var u,f,s,c;while(a<o){u=ce.ToString(a);s=ce.ToString(r[u]);M(i,s);if(a+1>=o){break}f=a+1<arguments.length?arguments[a+1]:"";c=ce.ToString(f);M(i,c);a+=1}return i.join("")}};if(String.raw&&String.raw({raw:{0:"x",1:"y",length:2}})!=="xy"){ne(String,"raw",_e.raw)}b(String,_e);var ke=function repeat(e,t){if(t<1){return""}if(t%2){return repeat(e,t-1)+e}var r=repeat(e,t/2);return r+r};var Le=Infinity;var Fe={repeat:function repeat(e){var t=ce.ToString(ce.RequireObjectCoercible(this));var r=ce.ToInteger(e);if(r<0||r>=Le){throw new RangeError("repeat count must be less than infinity and not overflow maximum string size")}return ke(t,r)},startsWith:function startsWith(e){var t=ce.ToString(ce.RequireObjectCoercible(this));if(ce.IsRegExp(e)){throw new TypeError('Cannot call method "startsWith" with a regex')}var r=ce.ToString(e);var n;if(arguments.length>1){n=arguments[1]}var o=A(ce.ToInteger(n),0);return C(t,o,o+r.length)===r},endsWith:function endsWith(e){var t=ce.ToString(ce.RequireObjectCoercible(this));if(ce.IsRegExp(e)){throw new TypeError('Cannot call method "endsWith" with a regex')}var r=ce.ToString(e);var n=t.length;var o;if(arguments.length>1){o=arguments[1]}var i=typeof o==="undefined"?n:ce.ToInteger(o);var a=R(A(i,0),n);return C(t,a-r.length,a)===r},includes:function includes(e){if(ce.IsRegExp(e)){throw new TypeError('"includes" does not accept a RegExp')}var t=ce.ToString(e);var r;if(arguments.length>1){r=arguments[1]}return I(this,t,r)!==-1},codePointAt:function codePointAt(e){var t=ce.ToString(ce.RequireObjectCoercible(this));var r=ce.ToInteger(e);var n=t.length;if(r>=0&&r<n){var o=t.charCodeAt(r);var i=r+1===n;if(o<55296||o>56319||i){return o}var a=t.charCodeAt(r+1);if(a<56320||a>57343){return o}return(o-55296)*1024+(a-56320)+65536}}};if(String.prototype.includes&&"a".includes("a",Infinity)!==false){ne(String.prototype,"includes",Fe.includes)}if(String.prototype.startsWith&&String.prototype.endsWith){var De=i(function(){return"/a/".startsWith(/a/)});var ze=a(function(){return"abc".startsWith("a",Infinity)===false});if(!De||!ze){ne(String.prototype,"startsWith",Fe.startsWith);ne(String.prototype,"endsWith",Fe.endsWith)}}if(oe){var qe=a(function(){var e=/a/;e[$.match]=false;return"/a/".startsWith(e)});if(!qe){ne(String.prototype,"startsWith",Fe.startsWith)}var We=a(function(){var e=/a/;e[$.match]=false;return"/a/".endsWith(e)});if(!We){ne(String.prototype,"endsWith",Fe.endsWith)}var Ge=a(function(){var e=/a/;e[$.match]=false;return"/a/".includes(e)});if(!Ge){ne(String.prototype,"includes",Fe.includes)}}b(String.prototype,Fe);var He=["\t\n\x0B\f\r \xa0\u1680\u180e\u2000\u2001\u2002\u2003","\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028","\u2029\ufeff"].join("");var Ve=new RegExp("(^["+He+"]+)|(["+He+"]+$)","g");var Be=function trim(){return ce.ToString(ce.RequireObjectCoercible(this)).replace(Ve,"")};var Ue=["\x85","\u200b","\ufffe"].join("");var $e=new RegExp("["+Ue+"]","g");var Je=/^[-+]0x[0-9a-f]+$/i;var Xe=Ue.trim().length!==Ue.length;h(String.prototype,"trim",Be,Xe);var Ke=function(e){return{value:e,done:arguments.length===0}};var Ze=function(e){ce.RequireObjectCoercible(e);this._s=ce.ToString(e);this._i=0};Ze.prototype.next=function(){var e=this._s;var t=this._i;if(typeof e==="undefined"||t>=e.length){this._s=void 0;return Ke()}var r=e.charCodeAt(t);var n,o;if(r<55296||r>56319||t+1===e.length){o=1}else{n=e.charCodeAt(t+1);o=n<56320||n>57343?1:2}this._i=t+o;return Ke(e.substr(t,o))};Me(Ze.prototype);Me(String.prototype,function(){return new Ze(this)});var Ye={from:function from(e){var r=this;var n;if(arguments.length>1){n=arguments[1]}var o,i;if(typeof n==="undefined"){o=false}else{if(!ce.IsCallable(n)){throw new TypeError("Array.from: when provided, the second argument must be a function")}if(arguments.length>2){i=arguments[2]}o=true}var a=typeof(te(e)||ce.GetMethod(e,ie))!=="undefined";var u,f,s;if(a){f=ce.IsConstructor(r)?Object(new r):[];var c=ce.GetIterator(e);var l,p;s=0;while(true){l=ce.IteratorStep(c);if(l===false){break}p=l.value;try{if(o){p=typeof i==="undefined"?n(p,s):t(n,i,p,s)}f[s]=p}catch(v){ce.IteratorClose(c,true);throw v}s+=1}u=s}else{var y=ce.ToObject(e);u=ce.ToLength(y.length);f=ce.IsConstructor(r)?Object(new r(u)):new Array(u);var h;for(s=0;s<u;++s){h=y[s];if(o){h=typeof i==="undefined"?n(h,s):t(n,i,h,s)}Ne(f,s,h)}}f.length=u;return f},of:function of(){var e=arguments.length;var t=this;var n=r(t)||!ce.IsCallable(t)?new Array(e):ce.Construct(t,[e]);for(var o=0;o<e;++o){Ne(n,o,arguments[o])}n.length=e;return n}};b(Array,Ye);Ce(Array);q=function(e,t){this.i=0;this.array=e;this.kind=t};b(q.prototype,{next:function(){var e=this.i;var t=this.array;if(!(this instanceof q)){throw new TypeError("Not an ArrayIterator")}if(typeof t!=="undefined"){var r=ce.ToLength(t.length);for(;e<r;e++){var n=this.kind;var o;if(n==="key"){o=e}else if(n==="value"){o=t[e]}else if(n==="entry"){o=[e,t[e]]}this.i=e+1;return Ke(o)}}this.array=void 0;return Ke()}});Me(q.prototype);var Qe=Array.of===Ye.of||function(){var e=function Foo(e){this.length=e};e.prototype=[];var t=Array.of.apply(e,[1,2]);return t instanceof e&&t.length===2}();if(!Qe){ne(Array,"of",Ye.of)}var et={copyWithin:function copyWithin(e,t){var r=ce.ToObject(this);var n=ce.ToLength(r.length);var o=ce.ToInteger(e);var i=ce.ToInteger(t);var a=o<0?A(n+o,0):R(o,n);var u=i<0?A(n+i,0):R(i,n);var f;if(arguments.length>2){f=arguments[2]}var s=typeof f==="undefined"?n:ce.ToInteger(f);var c=s<0?A(n+s,0):R(s,n);var l=R(c-u,n-a);var p=1;if(u<a&&a<u+l){p=-1;u+=l-1;a+=l-1}while(l>0){if(u in r){r[a]=r[u]}else{delete r[a]}u+=p;a+=p;l-=1}return r},fill:function fill(e){var t;if(arguments.length>1){t=arguments[1]}var r;if(arguments.length>2){r=arguments[2]}var n=ce.ToObject(this);var o=ce.ToLength(n.length);t=ce.ToInteger(typeof t==="undefined"?0:t);r=ce.ToInteger(typeof r==="undefined"?o:r);var i=t<0?A(o+t,0):R(t,o);var a=r<0?o+r:r;for(var u=i;u<o&&u<a;++u){n[u]=e}return n},find:function find(e){var r=ce.ToObject(this);var n=ce.ToLength(r.length);if(!ce.IsCallable(e)){throw new TypeError("Array#find: predicate must be a function")}var o=arguments.length>1?arguments[1]:null;for(var i=0,a;i<n;i++){a=r[i];if(o){if(t(e,o,a,i,r)){return a}}else if(e(a,i,r)){return a}}},findIndex:function findIndex(e){var r=ce.ToObject(this);var n=ce.ToLength(r.length);if(!ce.IsCallable(e)){throw new TypeError("Array#findIndex: predicate must be a function")}var o=arguments.length>1?arguments[1]:null;for(var i=0;i<n;i++){if(o){if(t(e,o,r[i],i,r)){return i}}else if(e(r[i],i,r)){return i}}return-1},keys:function keys(){return new q(this,"key")},values:function values(){return new q(this,"value")},entries:function entries(){return new q(this,"entry")}};if(Array.prototype.keys&&!ce.IsCallable([1].keys().next)){delete Array.prototype.keys}if(Array.prototype.entries&&!ce.IsCallable([1].entries().next)){delete Array.prototype.entries}if(Array.prototype.keys&&Array.prototype.entries&&!Array.prototype.values&&Array.prototype[ie]){b(Array.prototype,{values:Array.prototype[ie]});if(re.symbol($.unscopables)){Array.prototype[$.unscopables].values=true}}if(c&&Array.prototype.values&&Array.prototype.values.name!=="values"){var tt=Array.prototype.values;ne(Array.prototype,"values",function values(){return ce.Call(tt,this,arguments)});h(Array.prototype,ie,Array.prototype.values,true)}b(Array.prototype,et);if(1/[true].indexOf(true,-0)<0){h(Array.prototype,"indexOf",function indexOf(e){var t=E(this,arguments);if(t===0&&1/t<0){return 0}return t},true)}Me(Array.prototype,function(){return this.values()});if(Object.getPrototypeOf){Me(Object.getPrototypeOf([].values()))}var rt=function(){return a(function(){return Array.from({length:-1}).length===0})}();var nt=function(){var e=Array.from([0].entries());return e.length===1&&r(e[0])&&e[0][0]===0&&e[0][1]===0}();if(!rt||!nt){ne(Array,"from",Ye.from)}var ot=function(){return a(function(){return Array.from([0],void 0)})}();if(!ot){var it=Array.from;ne(Array,"from",function from(e){if(arguments.length>1&&typeof arguments[1]!=="undefined"){return ce.Call(it,this,arguments)}else{return t(it,this,e)}})}var at=-(Math.pow(2,32)-1);var ut=function(e,r){var n={length:at};n[r?(n.length>>>0)-1:0]=true;return a(function(){t(e,n,function(){throw new RangeError("should not reach here")},[]);return true})};if(!ut(Array.prototype.forEach)){var ft=Array.prototype.forEach;ne(Array.prototype,"forEach",function forEach(e){return ce.Call(ft,this.length>=0?this:[],arguments)},true)}if(!ut(Array.prototype.map)){var st=Array.prototype.map;ne(Array.prototype,"map",function map(e){return ce.Call(st,this.length>=0?this:[],arguments)},true)}if(!ut(Array.prototype.filter)){var ct=Array.prototype.filter;ne(Array.prototype,"filter",function filter(e){return ce.Call(ct,this.length>=0?this:[],arguments)},true)}if(!ut(Array.prototype.some)){var lt=Array.prototype.some;ne(Array.prototype,"some",function some(e){return ce.Call(lt,this.length>=0?this:[],arguments)},true)}if(!ut(Array.prototype.every)){var pt=Array.prototype.every;ne(Array.prototype,"every",function every(e){return ce.Call(pt,this.length>=0?this:[],arguments)},true)}if(!ut(Array.prototype.reduce)){var vt=Array.prototype.reduce;ne(Array.prototype,"reduce",function reduce(e){return ce.Call(vt,this.length>=0?this:[],arguments)},true)}if(!ut(Array.prototype.reduceRight,true)){var yt=Array.prototype.reduceRight;ne(Array.prototype,"reduceRight",function reduceRight(e){return ce.Call(yt,this.length>=0?this:[],arguments)},true)}var ht=Number("0o10")!==8;var bt=Number("0b10")!==2;var gt=y(Ue,function(e){return Number(e+0+e)===0});if(ht||bt||gt){var dt=Number;var mt=/^0b[01]+$/i;var Ot=/^0o[0-7]+$/i;var wt=mt.test.bind(mt);var jt=Ot.test.bind(Ot);var St=function(e){var t;if(typeof e.valueOf==="function"){t=e.valueOf();if(re.primitive(t)){return t}}if(typeof e.toString==="function"){t=e.toString();if(re.primitive(t)){return t}}throw new TypeError("No default value")};var Tt=$e.test.bind($e);var It=Je.test.bind(Je);var Et=function(){var e=function Number(t){var r;if(arguments.length>0){r=re.primitive(t)?t:St(t,"number")}else{r=0}if(typeof r==="string"){r=ce.Call(Be,r);if(wt(r)){r=parseInt(C(r,2),2)}else if(jt(r)){r=parseInt(C(r,2),8)}else if(Tt(r)||It(r)){r=NaN}}var n=this;var o=a(function(){dt.prototype.valueOf.call(n);return true});if(n instanceof e&&!o){return new dt(r)}return dt(r)};return e}();Ee(dt,Et,{});b(Et,{NaN:dt.NaN,MAX_VALUE:dt.MAX_VALUE,MIN_VALUE:dt.MIN_VALUE,NEGATIVE_INFINITY:dt.NEGATIVE_INFINITY,POSITIVE_INFINITY:dt.POSITIVE_INFINITY});Number=Et;m.redefine(S,"Number",Et)}var Pt=Math.pow(2,53)-1;b(Number,{MAX_SAFE_INTEGER:Pt,MIN_SAFE_INTEGER:-Pt,EPSILON:2.220446049250313e-16,parseInt:S.parseInt,parseFloat:S.parseFloat,isFinite:K,isInteger:function isInteger(e){return K(e)&&ce.ToInteger(e)===e},isSafeInteger:function isSafeInteger(e){return Number.isInteger(e)&&k(e)<=Number.MAX_SAFE_INTEGER},isNaN:X});h(Number,"parseInt",S.parseInt,Number.parseInt!==S.parseInt);if([,1].find(function(){return true})===1){ne(Array.prototype,"find",et.find)}if([,1].findIndex(function(){return true})!==0){ne(Array.prototype,"findIndex",et.findIndex)}var Ct=Function.bind.call(Function.bind,Object.prototype.propertyIsEnumerable);var Mt=function ensureEnumerable(e,t){if(s&&Ct(e,t)){Object.defineProperty(e,t,{enumerable:false})}};var xt=function sliceArgs(){var e=Number(this);var t=arguments.length;var r=t-e;var n=new Array(r<0?0:r);for(var o=e;o<t;++o){n[o-e]=arguments[o]}return n};var Nt=function assignTo(e){return function assignToSource(t,r){t[r]=e[r];return t}};var At=function(e,t){var r=n(Object(t));var o;if(ce.IsCallable(Object.getOwnPropertySymbols)){o=v(Object.getOwnPropertySymbols(Object(t)),Ct(t))}return p(P(r,o||[]),Nt(t),e)};var Rt={assign:function(e,t){var r=ce.ToObject(e,"Cannot convert undefined or null to object");return p(ce.Call(xt,1,arguments),At,r)},is:function is(e,t){return ce.SameValue(e,t)}};var _t=Object.assign&&Object.preventExtensions&&function(){var e=Object.preventExtensions({1:2});try{Object.assign(e,"xy")}catch(t){return e[1]==="y"}}();if(_t){ne(Object,"assign",Rt.assign)}b(Object,Rt);if(s){var kt={setPrototypeOf:function(e,r){var n;var o=function(e,t){if(!ce.TypeIsObject(e)){throw new TypeError("cannot set prototype on a non-object")}if(!(t===null||ce.TypeIsObject(t))){throw new TypeError("can only set prototype to an object or null"+t)}};var i=function(e,r){o(e,r);t(n,e,r);return e};try{n=e.getOwnPropertyDescriptor(e.prototype,r).set;t(n,{},null)}catch(a){if(e.prototype!=={}[r]){return}n=function(e){this[r]=e};i.polyfill=i(i({},null),e.prototype)instanceof e}return i}(Object,"__proto__")};b(Object,kt)}if(Object.setPrototypeOf&&Object.getPrototypeOf&&Object.getPrototypeOf(Object.setPrototypeOf({},null))!==null&&Object.getPrototypeOf(Object.create(null))===null){(function(){var e=Object.create(null);var t=Object.getPrototypeOf;var r=Object.setPrototypeOf;Object.getPrototypeOf=function(r){var n=t(r);return n===e?null:n};Object.setPrototypeOf=function(t,n){var o=n===null?e:n;return r(t,o)};Object.setPrototypeOf.polyfill=false})()}var Lt=!i(function(){return Object.keys("foo")});if(!Lt){var Ft=Object.keys;ne(Object,"keys",function keys(e){return Ft(ce.ToObject(e))});n=Object.keys}var Dt=i(function(){return Object.keys(/a/g)});if(Dt){var zt=Object.keys;ne(Object,"keys",function keys(e){if(re.regex(e)){var t=[];for(var r in e){if(z(e,r)){M(t,r)}}return t}return zt(e)});n=Object.keys}if(Object.getOwnPropertyNames){var qt=!i(function(){return Object.getOwnPropertyNames("foo")});if(!qt){var Wt=typeof window==="object"?Object.getOwnPropertyNames(window):[];var Gt=Object.getOwnPropertyNames;ne(Object,"getOwnPropertyNames",function getOwnPropertyNames(e){var t=ce.ToObject(e);if(g(t)==="[object Window]"){try{return Gt(t)}catch(r){return P([],Wt)}}return Gt(t)})}}if(Object.getOwnPropertyDescriptor){var Ht=!i(function(){return Object.getOwnPropertyDescriptor("foo","bar")});if(!Ht){var Vt=Object.getOwnPropertyDescriptor;ne(Object,"getOwnPropertyDescriptor",function getOwnPropertyDescriptor(e,t){return Vt(ce.ToObject(e),t)})}}if(Object.seal){var Bt=!i(function(){return Object.seal("foo")});if(!Bt){var Ut=Object.seal;ne(Object,"seal",function seal(e){if(!ce.TypeIsObject(e)){return e}return Ut(e)})}}if(Object.isSealed){var $t=!i(function(){return Object.isSealed("foo")});if(!$t){var Jt=Object.isSealed;ne(Object,"isSealed",function isSealed(e){if(!ce.TypeIsObject(e)){return true}return Jt(e)})}}if(Object.freeze){var Xt=!i(function(){return Object.freeze("foo")});if(!Xt){var Kt=Object.freeze;ne(Object,"freeze",function freeze(e){if(!ce.TypeIsObject(e)){return e}return Kt(e)})}}if(Object.isFrozen){var Zt=!i(function(){return Object.isFrozen("foo")});if(!Zt){var Yt=Object.isFrozen;ne(Object,"isFrozen",function isFrozen(e){if(!ce.TypeIsObject(e)){return true}return Yt(e)})}}if(Object.preventExtensions){var Qt=!i(function(){return Object.preventExtensions("foo")});if(!Qt){var er=Object.preventExtensions;ne(Object,"preventExtensions",function preventExtensions(e){if(!ce.TypeIsObject(e)){return e}return er(e)})}}if(Object.isExtensible){var tr=!i(function(){return Object.isExtensible("foo")});if(!tr){var rr=Object.isExtensible;ne(Object,"isExtensible",function isExtensible(e){if(!ce.TypeIsObject(e)){return false}return rr(e)})}}if(Object.getPrototypeOf){var nr=!i(function(){return Object.getPrototypeOf("foo")});if(!nr){var or=Object.getPrototypeOf;ne(Object,"getPrototypeOf",function getPrototypeOf(e){return or(ce.ToObject(e))})}}var ir=s&&function(){var e=Object.getOwnPropertyDescriptor(RegExp.prototype,"flags");return e&&ce.IsCallable(e.get)}();if(s&&!ir){var ar=function flags(){if(!ce.TypeIsObject(this)){throw new TypeError("Method called on incompatible type: must be an object.")}var e="";if(this.global){e+="g"}if(this.ignoreCase){e+="i"}if(this.multiline){e+="m"}if(this.unicode){e+="u"}if(this.sticky){e+="y"}return e};m.getter(RegExp.prototype,"flags",ar)}var ur=s&&a(function(){return String(new RegExp(/a/g,"i"))==="/a/i"});var fr=oe&&s&&function(){var e=/./;e[$.match]=false;return RegExp(e)===e}();var sr=a(function(){return RegExp.prototype.toString.call({source:"abc"})==="/abc/"});var cr=sr&&a(function(){return RegExp.prototype.toString.call({source:"a",flags:"b"})==="/a/b"});if(!sr||!cr){var lr=RegExp.prototype.toString;h(RegExp.prototype,"toString",function toString(){var e=ce.RequireObjectCoercible(this);if(re.regex(e)){return t(lr,e)}var r=ue(e.source);var n=ue(e.flags);return"/"+r+"/"+n},true);m.preserveToString(RegExp.prototype.toString,lr)}if(s&&(!ur||fr)){var pr=Object.getOwnPropertyDescriptor(RegExp.prototype,"flags").get;var vr=Object.getOwnPropertyDescriptor(RegExp.prototype,"source")||{};var yr=function(){return this.source};var hr=ce.IsCallable(vr.get)?vr.get:yr;var br=RegExp;var gr=function(){return function RegExp(e,t){var r=ce.IsRegExp(e);var n=this instanceof RegExp;if(!n&&r&&typeof t==="undefined"&&e.constructor===RegExp){return e}var o=e;var i=t;if(re.regex(e)){o=ce.Call(hr,e);i=typeof t==="undefined"?ce.Call(pr,e):t;return new RegExp(o,i)}else if(r){o=e.source;i=typeof t==="undefined"?e.flags:t}return new br(e,t)}}();Ee(br,gr,{$input:true});RegExp=gr;m.redefine(S,"RegExp",gr)}if(s){var dr={input:"$_",lastMatch:"$&",lastParen:"$+",leftContext:"$`",rightContext:"$'"};l(n(dr),function(e){if(e in RegExp&&!(dr[e]in RegExp)){m.getter(RegExp,dr[e],function get(){return RegExp[e]})}})}Ce(RegExp);var mr=1/Number.EPSILON;var Or=function roundTiesToEven(e){return e+mr-mr};var wr=Math.pow(2,-23);var jr=Math.pow(2,127)*(2-wr);var Sr=Math.pow(2,-126);var Tr=Math.E;var Ir=Math.LOG2E;var Er=Math.LOG10E;var Pr=Number.prototype.clz;delete Number.prototype.clz;var Cr={acosh:function acosh(e){var t=Number(e);if(X(t)||e<1){return NaN}if(t===1){return 0}if(t===Infinity){return t}var r=1/(t*t);if(t<2){return Y(t-1+D(1-r)*t)}var n=t/2;return Y(n+D(1-r)*n-1)+1/Ir},asinh:function asinh(e){var t=Number(e);if(t===0||!T(t)){return t}var r=k(t);var n=r*r;var o=Z(t);if(r<1){return o*Y(r+n/(D(n+1)+1))}return o*(Y(r/2+D(1+1/n)*r/2-1)+1/Ir)},atanh:function atanh(e){var t=Number(e);if(t===0){return t}if(t===-1){return-Infinity}if(t===1){return Infinity}if(X(t)||t<-1||t>1){return NaN}var r=k(t);return Z(t)*Y(2*r/(1-r))/2},cbrt:function cbrt(e){var t=Number(e);if(t===0){return t}var r=t<0;var n;if(r){t=-t}if(t===Infinity){n=Infinity}else{n=L(F(t)/3);n=(t/(n*n)+2*n)/3}return r?-n:n},clz32:function clz32(e){var t=Number(e);var r=ce.ToUint32(t);if(r===0){return 32}return Pr?ce.Call(Pr,r):31-_(F(r+.5)*Ir)},cosh:function cosh(e){var t=Number(e);if(t===0){return 1}if(X(t)){return NaN}if(!T(t)){return Infinity}var r=L(k(t)-1);return(r+1/(r*Tr*Tr))*(Tr/2)},expm1:function expm1(e){var t=Number(e);if(t===-Infinity){return-1}if(!T(t)||t===0){return t}if(k(t)>.5){return L(t)-1}var r=t;var n=0;var o=1;while(n+r!==n){n+=r;o+=1;r*=t/o}return n},hypot:function hypot(e,t){var r=0;var n=0;for(var o=0;o<arguments.length;++o){var i=k(Number(arguments[o]));if(n<i){r*=n/i*(n/i);r+=1;n=i}else{r+=i>0?i/n*(i/n):i}}return n===Infinity?Infinity:n*D(r)},log2:function log2(e){return F(e)*Ir},log10:function log10(e){return F(e)*Er},log1p:Y,sign:Z,sinh:function sinh(e){var t=Number(e);if(!T(t)||t===0){return t}var r=k(t);if(r<1){var n=Math.expm1(r);return Z(t)*n*(1+1/(n+1))/2}var o=L(r-1);return Z(t)*(o-1/(o*Tr*Tr))*(Tr/2)},tanh:function tanh(e){var t=Number(e);if(X(t)||t===0){return t}if(t>=20){return 1}if(t<=-20){return-1}return(Math.expm1(t)-Math.expm1(-t))/(L(t)+L(-t))},trunc:function trunc(e){var t=Number(e);return t<0?-_(-t):_(t)},imul:function imul(e,t){var r=ce.ToUint32(e);var n=ce.ToUint32(t);var o=r>>>16&65535;var i=r&65535;var a=n>>>16&65535;var u=n&65535;return i*u+(o*u+i*a<<16>>>0)|0},fround:function fround(e){var t=Number(e);if(t===0||t===Infinity||t===-Infinity||X(t)){return t}var r=Z(t);var n=k(t);if(n<Sr){return r*Or(n/Sr/wr)*Sr*wr}var o=(1+wr/Number.EPSILON)*n;var i=o-(o-n);if(i>jr||X(i)){return r*Infinity}return r*i}};var Mr=function withinULPDistance(e,t,r){return k(1-e/t)/Number.EPSILON<(r||8)};b(Math,Cr);h(Math,"sinh",Cr.sinh,Math.sinh(710)===Infinity);h(Math,"cosh",Cr.cosh,Math.cosh(710)===Infinity);h(Math,"log1p",Cr.log1p,Math.log1p(-1e-17)!==-1e-17);h(Math,"asinh",Cr.asinh,Math.asinh(-1e7)!==-Math.asinh(1e7));h(Math,"asinh",Cr.asinh,Math.asinh(1e300)===Infinity);h(Math,"atanh",Cr.atanh,Math.atanh(1e-300)===0);h(Math,"tanh",Cr.tanh,Math.tanh(-2e-17)!==-2e-17);
  h(Math,"acosh",Cr.acosh,Math.acosh(Number.MAX_VALUE)===Infinity);h(Math,"acosh",Cr.acosh,!Mr(Math.acosh(1+Number.EPSILON),Math.sqrt(2*Number.EPSILON)));h(Math,"cbrt",Cr.cbrt,!Mr(Math.cbrt(1e-300),1e-100));h(Math,"sinh",Cr.sinh,Math.sinh(-2e-17)!==-2e-17);var xr=Math.expm1(10);h(Math,"expm1",Cr.expm1,xr>22025.465794806718||xr<22025.465794806718);var Nr=Math.round;var Ar=Math.round(.5-Number.EPSILON/4)===0&&Math.round(-.5+Number.EPSILON/3.99)===1;var Rr=mr+1;var _r=2*mr-1;var kr=[Rr,_r].every(function(e){return Math.round(e)===e});h(Math,"round",function round(e){var t=_(e);var r=t===-1?-0:t+1;return e-t<.5?t:r},!Ar||!kr);m.preserveToString(Math.round,Nr);var Lr=Math.imul;if(Math.imul(4294967295,5)!==-5){Math.imul=Cr.imul;m.preserveToString(Math.imul,Lr)}if(Math.imul.length!==2){ne(Math,"imul",function imul(e,t){return ce.Call(Lr,Math,arguments)})}var Fr=function(){var e=S.setTimeout;if(typeof e!=="function"&&typeof e!=="object"){return}ce.IsPromise=function(e){if(!ce.TypeIsObject(e)){return false}if(typeof e._promise==="undefined"){return false}return true};var r=function(e){if(!ce.IsConstructor(e)){throw new TypeError("Bad promise constructor")}var t=this;var r=function(e,r){if(t.resolve!==void 0||t.reject!==void 0){throw new TypeError("Bad Promise implementation!")}t.resolve=e;t.reject=r};t.resolve=void 0;t.reject=void 0;t.promise=new e(r);if(!(ce.IsCallable(t.resolve)&&ce.IsCallable(t.reject))){throw new TypeError("Bad promise constructor")}};var n;if(typeof window!=="undefined"&&ce.IsCallable(window.postMessage)){n=function(){var e=[];var t="zero-timeout-message";var r=function(r){M(e,r);window.postMessage(t,"*")};var n=function(r){if(r.source===window&&r.data===t){r.stopPropagation();if(e.length===0){return}var n=N(e);n()}};window.addEventListener("message",n,true);return r}}var o=function(){var e=S.Promise;var t=e&&e.resolve&&e.resolve();return t&&function(e){return t.then(e)}};var i=ce.IsCallable(S.setImmediate)?S.setImmediate:typeof process==="object"&&process.nextTick?process.nextTick:o()||(ce.IsCallable(n)?n():function(t){e(t,0)});var a=function(e){return e};var u=function(e){throw e};var f=0;var s=1;var c=2;var l=0;var p=1;var v=2;var y={};var h=function(e,t,r){i(function(){g(e,t,r)})};var g=function(e,t,r){var n,o;if(t===y){return e(r)}try{n=e(r);o=t.resolve}catch(i){n=i;o=t.reject}o(n)};var d=function(e,t){var r=e._promise;var n=r.reactionLength;if(n>0){h(r.fulfillReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o<n;o++,i+=3){h(r[i+l],r[i+v],t);e[i+l]=void 0;e[i+p]=void 0;e[i+v]=void 0}}}r.result=t;r.state=s;r.reactionLength=0};var m=function(e,t){var r=e._promise;var n=r.reactionLength;if(n>0){h(r.rejectReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o<n;o++,i+=3){h(r[i+p],r[i+v],t);e[i+l]=void 0;e[i+p]=void 0;e[i+v]=void 0}}}r.result=t;r.state=c;r.reactionLength=0};var O=function(e){var t=false;var r=function(r){var n;if(t){return}t=true;if(r===e){return m(e,new TypeError("Self resolution"))}if(!ce.TypeIsObject(r)){return d(e,r)}try{n=r.then}catch(o){return m(e,o)}if(!ce.IsCallable(n)){return d(e,r)}i(function(){j(e,r,n)})};var n=function(r){if(t){return}t=true;return m(e,r)};return{resolve:r,reject:n}};var w=function(e,r,n,o){if(e===I){t(e,r,n,o,y)}else{t(e,r,n,o)}};var j=function(e,t,r){var n=O(e);var o=n.resolve;var i=n.reject;try{w(r,t,o,i)}catch(a){i(a)}};var T,I;var E=function(){var e=function Promise(t){if(!(this instanceof e)){throw new TypeError('Constructor Promise requires "new"')}if(this&&this._promise){throw new TypeError("Bad construction")}if(!ce.IsCallable(t)){throw new TypeError("not a valid resolver")}var r=Ae(this,e,T,{_promise:{result:void 0,state:f,reactionLength:0,fulfillReactionHandler0:void 0,rejectReactionHandler0:void 0,reactionCapability0:void 0}});var n=O(r);var o=n.reject;try{t(n.resolve,o)}catch(i){o(i)}return r};return e}();T=E.prototype;var P=function(e,t,r,n){var o=false;return function(i){if(o){return}o=true;t[e]=i;if(--n.count===0){var a=r.resolve;a(t)}}};var C=function(e,t,r){var n=e.iterator;var o=[];var i={count:1};var a,u;var f=0;while(true){try{a=ce.IteratorStep(n);if(a===false){e.done=true;break}u=a.value}catch(s){e.done=true;throw s}o[f]=void 0;var c=t.resolve(u);var l=P(f,o,r,i);i.count+=1;w(c.then,c,l,r.reject);f+=1}if(--i.count===0){var p=r.resolve;p(o)}return r.promise};var x=function(e,t,r){var n=e.iterator;var o,i,a;while(true){try{o=ce.IteratorStep(n);if(o===false){e.done=true;break}i=o.value}catch(u){e.done=true;throw u}a=t.resolve(i);w(a.then,a,r.resolve,r.reject)}return r.promise};b(E,{all:function all(e){var t=this;if(!ce.TypeIsObject(t)){throw new TypeError("Promise is not object")}var n=new r(t);var o,i;try{o=ce.GetIterator(e);i={iterator:o,done:false};return C(i,t,n)}catch(a){var u=a;if(i&&!i.done){try{ce.IteratorClose(o,true)}catch(f){u=f}}var s=n.reject;s(u);return n.promise}},race:function race(e){var t=this;if(!ce.TypeIsObject(t)){throw new TypeError("Promise is not object")}var n=new r(t);var o,i;try{o=ce.GetIterator(e);i={iterator:o,done:false};return x(i,t,n)}catch(a){var u=a;if(i&&!i.done){try{ce.IteratorClose(o,true)}catch(f){u=f}}var s=n.reject;s(u);return n.promise}},reject:function reject(e){var t=this;if(!ce.TypeIsObject(t)){throw new TypeError("Bad promise constructor")}var n=new r(t);var o=n.reject;o(e);return n.promise},resolve:function resolve(e){var t=this;if(!ce.TypeIsObject(t)){throw new TypeError("Bad promise constructor")}if(ce.IsPromise(e)){var n=e.constructor;if(n===t){return e}}var o=new r(t);var i=o.resolve;i(e);return o.promise}});b(T,{"catch":function(e){return this.then(null,e)},then:function then(e,t){var n=this;if(!ce.IsPromise(n)){throw new TypeError("not a promise")}var o=ce.SpeciesConstructor(n,E);var i;var b=arguments.length>2&&arguments[2]===y;if(b&&o===E){i=y}else{i=new r(o)}var g=ce.IsCallable(e)?e:a;var d=ce.IsCallable(t)?t:u;var m=n._promise;var O;if(m.state===f){if(m.reactionLength===0){m.fulfillReactionHandler0=g;m.rejectReactionHandler0=d;m.reactionCapability0=i}else{var w=3*(m.reactionLength-1);m[w+l]=g;m[w+p]=d;m[w+v]=i}m.reactionLength+=1}else if(m.state===s){O=m.result;h(g,i,O)}else if(m.state===c){O=m.result;h(d,i,O)}else{throw new TypeError("unexpected Promise state")}return i.promise}});y=new r(E);I=T.then;return E}();if(S.Promise){delete S.Promise.accept;delete S.Promise.defer;delete S.Promise.prototype.chain}if(typeof Fr==="function"){b(S,{Promise:Fr});var Dr=w(S.Promise,function(e){return e.resolve(42).then(function(){})instanceof e});var zr=!i(function(){return S.Promise.reject(42).then(null,5).then(null,W)});var qr=i(function(){return S.Promise.call(3,W)});var Wr=function(e){var t=e.resolve(5);t.constructor={};var r=e.resolve(t);try{r.then(null,W).then(null,W)}catch(n){return true}return t===r}(S.Promise);var Gr=s&&function(){var e=0;var t=Object.defineProperty({},"then",{get:function(){e+=1}});Promise.resolve(t);return e===1}();var Hr=function BadResolverPromise(e){var t=new Promise(e);e(3,function(){});this.then=t.then;this.constructor=BadResolverPromise};Hr.prototype=Promise.prototype;Hr.all=Promise.all;var Vr=a(function(){return!!Hr.all([1,2])});if(!Dr||!zr||!qr||Wr||!Gr||Vr){Promise=Fr;ne(S,"Promise",Fr)}if(Promise.all.length!==1){var Br=Promise.all;ne(Promise,"all",function all(e){return ce.Call(Br,this,arguments)})}if(Promise.race.length!==1){var Ur=Promise.race;ne(Promise,"race",function race(e){return ce.Call(Ur,this,arguments)})}if(Promise.resolve.length!==1){var $r=Promise.resolve;ne(Promise,"resolve",function resolve(e){return ce.Call($r,this,arguments)})}if(Promise.reject.length!==1){var Jr=Promise.reject;ne(Promise,"reject",function reject(e){return ce.Call(Jr,this,arguments)})}Mt(Promise,"all");Mt(Promise,"race");Mt(Promise,"resolve");Mt(Promise,"reject");Ce(Promise)}var Xr=function(e){var t=n(p(e,function(e,t){e[t]=true;return e},{}));return e.join(":")===t.join(":")};var Kr=Xr(["z","a","bb"]);var Zr=Xr(["z",1,"a","3",2]);if(s){var Yr=function fastkey(e,t){if(!t&&!Kr){return null}if(se(e)){return"^"+ce.ToString(e)}else if(typeof e==="string"){return"$"+e}else if(typeof e==="number"){if(!Zr){return"n"+e}return e}else if(typeof e==="boolean"){return"b"+e}return null};var Qr=function emptyObject(){return Object.create?Object.create(null):{}};var en=function addIterableToMap(e,n,o){if(r(o)||re.string(o)){l(o,function(e){if(!ce.TypeIsObject(e)){throw new TypeError("Iterator value "+e+" is not an entry object")}n.set(e[0],e[1])})}else if(o instanceof e){t(e.prototype.forEach,o,function(e,t){n.set(t,e)})}else{var i,a;if(!se(o)){a=n.set;if(!ce.IsCallable(a)){throw new TypeError("bad map")}i=ce.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=ce.IteratorStep(i);if(u===false){break}var f=u.value;try{if(!ce.TypeIsObject(f)){throw new TypeError("Iterator value "+f+" is not an entry object")}t(a,n,f[0],f[1])}catch(s){ce.IteratorClose(i,true);throw s}}}}};var tn=function addIterableToSet(e,n,o){if(r(o)||re.string(o)){l(o,function(e){n.add(e)})}else if(o instanceof e){t(e.prototype.forEach,o,function(e){n.add(e)})}else{var i,a;if(!se(o)){a=n.add;if(!ce.IsCallable(a)){throw new TypeError("bad set")}i=ce.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=ce.IteratorStep(i);if(u===false){break}var f=u.value;try{t(a,n,f)}catch(s){ce.IteratorClose(i,true);throw s}}}}};var rn={Map:function(){var e={};var r=function MapEntry(e,t){this.key=e;this.value=t;this.next=null;this.prev=null};r.prototype.isRemoved=function isRemoved(){return this.key===e};var n=function isMap(e){return!!e._es6map};var o=function requireMapSlot(e,t){if(!ce.TypeIsObject(e)||!n(e)){throw new TypeError("Method Map.prototype."+t+" called on incompatible receiver "+ce.ToString(e))}};var i=function MapIterator(e,t){o(e,"[[MapIterator]]");this.head=e._head;this.i=this.head;this.kind=t};i.prototype={isMapIterator:true,next:function next(){if(!this.isMapIterator){throw new TypeError("Not a MapIterator")}var e=this.i;var t=this.kind;var r=this.head;if(typeof this.i==="undefined"){return Ke()}while(e.isRemoved()&&e!==r){e=e.prev}var n;while(e.next!==r){e=e.next;if(!e.isRemoved()){if(t==="key"){n=e.key}else if(t==="value"){n=e.value}else{n=[e.key,e.value]}this.i=e;return Ke(n)}}this.i=void 0;return Ke()}};Me(i.prototype);var a;var u=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}if(this&&this._es6map){throw new TypeError("Bad construction")}var e=Ae(this,Map,a,{_es6map:true,_head:null,_map:G?new G:null,_size:0,_storage:Qr()});var t=new r(null,null);t.next=t.prev=t;e._head=t;if(arguments.length>0){en(Map,e,arguments[0])}return e};a=u.prototype;m.getter(a,"size",function(){if(typeof this._size==="undefined"){throw new TypeError("size method called on incompatible Map")}return this._size});b(a,{get:function get(e){o(this,"get");var t;var r=Yr(e,true);if(r!==null){t=this._storage[r];if(t){return t.value}else{return}}if(this._map){t=V.call(this._map,e);if(t){return t.value}else{return}}var n=this._head;var i=n;while((i=i.next)!==n){if(ce.SameValueZero(i.key,e)){return i.value}}},has:function has(e){o(this,"has");var t=Yr(e,true);if(t!==null){return typeof this._storage[t]!=="undefined"}if(this._map){return B.call(this._map,e)}var r=this._head;var n=r;while((n=n.next)!==r){if(ce.SameValueZero(n.key,e)){return true}}return false},set:function set(e,t){o(this,"set");var n=this._head;var i=n;var a;var u=Yr(e,true);if(u!==null){if(typeof this._storage[u]!=="undefined"){this._storage[u].value=t;return this}else{a=this._storage[u]=new r(e,t);i=n.prev}}else if(this._map){if(B.call(this._map,e)){V.call(this._map,e).value=t}else{a=new r(e,t);U.call(this._map,e,a);i=n.prev}}while((i=i.next)!==n){if(ce.SameValueZero(i.key,e)){i.value=t;return this}}a=a||new r(e,t);if(ce.SameValue(-0,e)){a.key=+0}a.next=this._head;a.prev=this._head.prev;a.prev.next=a;a.next.prev=a;this._size+=1;return this},"delete":function(t){o(this,"delete");var r=this._head;var n=r;var i=Yr(t,true);if(i!==null){if(typeof this._storage[i]==="undefined"){return false}n=this._storage[i].prev;delete this._storage[i]}else if(this._map){if(!B.call(this._map,t)){return false}n=V.call(this._map,t).prev;H.call(this._map,t)}while((n=n.next)!==r){if(ce.SameValueZero(n.key,t)){n.key=e;n.value=e;n.prev.next=n.next;n.next.prev=n.prev;this._size-=1;return true}}return false},clear:function clear(){o(this,"clear");this._map=G?new G:null;this._size=0;this._storage=Qr();var t=this._head;var r=t;var n=r.next;while((r=n)!==t){r.key=e;r.value=e;n=r.next;r.next=r.prev=t}t.next=t.prev=t},keys:function keys(){o(this,"keys");return new i(this,"key")},values:function values(){o(this,"values");return new i(this,"value")},entries:function entries(){o(this,"entries");return new i(this,"key+value")},forEach:function forEach(e){o(this,"forEach");var r=arguments.length>1?arguments[1]:null;var n=this.entries();for(var i=n.next();!i.done;i=n.next()){if(r){t(e,r,i.value[1],i.value[0],this)}else{e(i.value[1],i.value[0],this)}}}});Me(a,a.entries);return u}(),Set:function(){var e=function isSet(e){return e._es6set&&typeof e._storage!=="undefined"};var r=function requireSetSlot(t,r){if(!ce.TypeIsObject(t)||!e(t)){throw new TypeError("Set.prototype."+r+" called on incompatible receiver "+ce.ToString(t))}};var o;var i=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}if(this&&this._es6set){throw new TypeError("Bad construction")}var e=Ae(this,Set,o,{_es6set:true,"[[SetData]]":null,_storage:Qr()});if(!e._es6set){throw new TypeError("bad set")}if(arguments.length>0){tn(Set,e,arguments[0])}return e};o=i.prototype;var a=function(e){var t=e;if(t==="^null"){return null}else if(t==="^undefined"){return void 0}else{var r=t.charAt(0);if(r==="$"){return C(t,1)}else if(r==="n"){return+C(t,1)}else if(r==="b"){return t==="btrue"}}return+t};var u=function ensureMap(e){if(!e["[[SetData]]"]){var t=new rn.Map;e["[[SetData]]"]=t;l(n(e._storage),function(e){var r=a(e);t.set(r,r)});e["[[SetData]]"]=t}e._storage=null};m.getter(i.prototype,"size",function(){r(this,"size");if(this._storage){return n(this._storage).length}u(this);return this["[[SetData]]"].size});b(i.prototype,{has:function has(e){r(this,"has");var t;if(this._storage&&(t=Yr(e))!==null){return!!this._storage[t]}u(this);return this["[[SetData]]"].has(e)},add:function add(e){r(this,"add");var t;if(this._storage&&(t=Yr(e))!==null){this._storage[t]=true;return this}u(this);this["[[SetData]]"].set(e,e);return this},"delete":function(e){r(this,"delete");var t;if(this._storage&&(t=Yr(e))!==null){var n=z(this._storage,t);return delete this._storage[t]&&n}u(this);return this["[[SetData]]"]["delete"](e)},clear:function clear(){r(this,"clear");if(this._storage){this._storage=Qr()}if(this["[[SetData]]"]){this["[[SetData]]"].clear()}},values:function values(){r(this,"values");u(this);return new f(this["[[SetData]]"].values())},entries:function entries(){r(this,"entries");u(this);return new f(this["[[SetData]]"].entries())},forEach:function forEach(e){r(this,"forEach");var n=arguments.length>1?arguments[1]:null;var o=this;u(o);this["[[SetData]]"].forEach(function(r,i){if(n){t(e,n,i,i,o)}else{e(i,i,o)}})}});h(i.prototype,"keys",i.prototype.values,true);Me(i.prototype,i.prototype.values);var f=function SetIterator(e){this.it=e};f.prototype={isSetIterator:true,next:function next(){if(!this.isSetIterator){throw new TypeError("Not a SetIterator")}return this.it.next()}};Me(f.prototype);return i}()};var nn=S.Set&&!Set.prototype["delete"]&&Set.prototype.remove&&Set.prototype.items&&Set.prototype.map&&Array.isArray((new Set).keys);if(nn){S.Set=rn.Set}if(S.Map||S.Set){var on=a(function(){return new Map([[1,2]]).get(1)===2});if(!on){S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new G;if(arguments.length>0){en(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,S.Map.prototype);return e};S.Map.prototype=O(G.prototype);h(S.Map.prototype,"constructor",S.Map,true);m.preserveToString(S.Map,G)}var an=new Map;var un=function(){var e=new Map([[1,0],[2,0],[3,0],[4,0]]);e.set(-0,e);return e.get(0)===e&&e.get(-0)===e&&e.has(0)&&e.has(-0)}();var fn=an.set(1,2)===an;if(!un||!fn){ne(Map.prototype,"set",function set(e,r){t(U,this,e===0?0:e,r);return this})}if(!un){b(Map.prototype,{get:function get(e){return t(V,this,e===0?0:e)},has:function has(e){return t(B,this,e===0?0:e)}},true);m.preserveToString(Map.prototype.get,V);m.preserveToString(Map.prototype.has,B)}var sn=new Set;var cn=Set.prototype["delete"]&&Set.prototype.add&&Set.prototype.has&&function(e){e["delete"](0);e.add(-0);return!e.has(0)}(sn);var ln=sn.add(1)===sn;if(!cn||!ln){var pn=Set.prototype.add;Set.prototype.add=function add(e){t(pn,this,e===0?0:e);return this};m.preserveToString(Set.prototype.add,pn)}if(!cn){var vn=Set.prototype.has;Set.prototype.has=function has(e){return t(vn,this,e===0?0:e)};m.preserveToString(Set.prototype.has,vn);var yn=Set.prototype["delete"];Set.prototype["delete"]=function SetDelete(e){return t(yn,this,e===0?0:e)};m.preserveToString(Set.prototype["delete"],yn)}var hn=w(S.Map,function(e){var t=new e([]);t.set(42,42);return t instanceof e});var bn=Object.setPrototypeOf&&!hn;var gn=function(){try{return!(S.Map()instanceof S.Map)}catch(e){return e instanceof TypeError}}();if(S.Map.length!==0||bn||!gn){S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new G;if(arguments.length>0){en(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Map.prototype);return e};S.Map.prototype=G.prototype;h(S.Map.prototype,"constructor",S.Map,true);m.preserveToString(S.Map,G)}var dn=w(S.Set,function(e){var t=new e([]);t.add(42,42);return t instanceof e});var mn=Object.setPrototypeOf&&!dn;var On=function(){try{return!(S.Set()instanceof S.Set)}catch(e){return e instanceof TypeError}}();if(S.Set.length!==0||mn||!On){var wn=S.Set;S.Set=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}var e=new wn;if(arguments.length>0){tn(Set,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Set.prototype);return e};S.Set.prototype=wn.prototype;h(S.Set.prototype,"constructor",S.Set,true);m.preserveToString(S.Set,wn)}var jn=new S.Map;var Sn=!a(function(){return jn.keys().next().done});if(typeof S.Map.prototype.clear!=="function"||(new S.Set).size!==0||jn.size!==0||typeof S.Map.prototype.keys!=="function"||typeof S.Set.prototype.keys!=="function"||typeof S.Map.prototype.forEach!=="function"||typeof S.Set.prototype.forEach!=="function"||u(S.Map)||u(S.Set)||typeof jn.keys().next!=="function"||Sn||!hn){b(S,{Map:rn.Map,Set:rn.Set},true)}if(S.Set.prototype.keys!==S.Set.prototype.values){h(S.Set.prototype,"keys",S.Set.prototype.values,true)}Me(Object.getPrototypeOf((new S.Map).keys()));Me(Object.getPrototypeOf((new S.Set).keys()));if(c&&S.Set.prototype.has.name!=="has"){var Tn=S.Set.prototype.has;ne(S.Set.prototype,"has",function has(e){return t(Tn,this,e)})}}b(S,rn);Ce(S.Map);Ce(S.Set)}var In=function throwUnlessTargetIsObject(e){if(!ce.TypeIsObject(e)){throw new TypeError("target must be an object")}};var En={apply:function apply(){return ce.Call(ce.Call,null,arguments)},construct:function construct(e,t){if(!ce.IsConstructor(e)){throw new TypeError("First argument must be a constructor.")}var r=arguments.length>2?arguments[2]:e;if(!ce.IsConstructor(r)){throw new TypeError("new.target must be a constructor.")}return ce.Construct(e,t,r,"internal")},deleteProperty:function deleteProperty(e,t){In(e);if(s){var r=Object.getOwnPropertyDescriptor(e,t);if(r&&!r.configurable){return false}}return delete e[t]},has:function has(e,t){In(e);return t in e}};if(Object.getOwnPropertyNames){Object.assign(En,{ownKeys:function ownKeys(e){In(e);var t=Object.getOwnPropertyNames(e);if(ce.IsCallable(Object.getOwnPropertySymbols)){x(t,Object.getOwnPropertySymbols(e))}return t}})}var Pn=function ConvertExceptionToBoolean(e){return!i(e)};if(Object.preventExtensions){Object.assign(En,{isExtensible:function isExtensible(e){In(e);return Object.isExtensible(e)},preventExtensions:function preventExtensions(e){In(e);return Pn(function(){return Object.preventExtensions(e)})}})}if(s){var Cn=function get(e,t,r){var n=Object.getOwnPropertyDescriptor(e,t);if(!n){var o=Object.getPrototypeOf(e);if(o===null){return void 0}return Cn(o,t,r)}if("value"in n){return n.value}if(n.get){return ce.Call(n.get,r)}return void 0};var Mn=function set(e,r,n,o){var i=Object.getOwnPropertyDescriptor(e,r);if(!i){var a=Object.getPrototypeOf(e);if(a!==null){return Mn(a,r,n,o)}i={value:void 0,writable:true,enumerable:true,configurable:true}}if("value"in i){if(!i.writable){return false}if(!ce.TypeIsObject(o)){return false}var u=Object.getOwnPropertyDescriptor(o,r);if(u){return ae.defineProperty(o,r,{value:n})}else{return ae.defineProperty(o,r,{value:n,writable:true,enumerable:true,configurable:true})}}if(i.set){t(i.set,o,n);return true}return false};Object.assign(En,{defineProperty:function defineProperty(e,t,r){In(e);return Pn(function(){return Object.defineProperty(e,t,r)})},getOwnPropertyDescriptor:function getOwnPropertyDescriptor(e,t){In(e);return Object.getOwnPropertyDescriptor(e,t)},get:function get(e,t){In(e);var r=arguments.length>2?arguments[2]:e;return Cn(e,t,r)},set:function set(e,t,r){In(e);var n=arguments.length>3?arguments[3]:e;return Mn(e,t,r,n)}})}if(Object.getPrototypeOf){var xn=Object.getPrototypeOf;En.getPrototypeOf=function getPrototypeOf(e){In(e);return xn(e)}}if(Object.setPrototypeOf&&En.getPrototypeOf){var Nn=function(e,t){var r=t;while(r){if(e===r){return true}r=En.getPrototypeOf(r)}return false};Object.assign(En,{setPrototypeOf:function setPrototypeOf(e,t){In(e);if(t!==null&&!ce.TypeIsObject(t)){throw new TypeError("proto must be an object or null")}if(t===ae.getPrototypeOf(e)){return true}if(ae.isExtensible&&!ae.isExtensible(e)){return false}if(Nn(e,t)){return false}Object.setPrototypeOf(e,t);return true}})}var An=function(e,t){if(!ce.IsCallable(S.Reflect[e])){h(S.Reflect,e,t)}else{var r=a(function(){S.Reflect[e](1);S.Reflect[e](NaN);S.Reflect[e](true);return true});if(r){ne(S.Reflect,e,t)}}};Object.keys(En).forEach(function(e){An(e,En[e])});var Rn=S.Reflect.getPrototypeOf;if(c&&Rn&&Rn.name!=="getPrototypeOf"){ne(S.Reflect,"getPrototypeOf",function getPrototypeOf(e){return t(Rn,S.Reflect,e)})}if(S.Reflect.setPrototypeOf){if(a(function(){S.Reflect.setPrototypeOf(1,{});return true})){ne(S.Reflect,"setPrototypeOf",En.setPrototypeOf)}}if(S.Reflect.defineProperty){if(!a(function(){var e=!S.Reflect.defineProperty(1,"test",{value:1});var t=typeof Object.preventExtensions!=="function"||!S.Reflect.defineProperty(Object.preventExtensions({}),"test",{});return e&&t})){ne(S.Reflect,"defineProperty",En.defineProperty)}}if(S.Reflect.construct){if(!a(function(){var e=function F(){};return S.Reflect.construct(function(){},[],e)instanceof e})){ne(S.Reflect,"construct",En.construct)}}if(String(new Date(NaN))!=="Invalid Date"){var _n=Date.prototype.toString;var kn=function toString(){var e=+this;if(e!==e){return"Invalid Date"}return ce.Call(_n,this)};ne(Date.prototype,"toString",kn)}var Ln={anchor:function anchor(e){return ce.CreateHTML(this,"a","name",e)},big:function big(){return ce.CreateHTML(this,"big","","")},blink:function blink(){return ce.CreateHTML(this,"blink","","")},bold:function bold(){return ce.CreateHTML(this,"b","","")},fixed:function fixed(){return ce.CreateHTML(this,"tt","","")},fontcolor:function fontcolor(e){return ce.CreateHTML(this,"font","color",e)},fontsize:function fontsize(e){return ce.CreateHTML(this,"font","size",e)},italics:function italics(){return ce.CreateHTML(this,"i","","")},link:function link(e){return ce.CreateHTML(this,"a","href",e)},small:function small(){return ce.CreateHTML(this,"small","","")},strike:function strike(){return ce.CreateHTML(this,"strike","","")},sub:function sub(){return ce.CreateHTML(this,"sub","","")},sup:function sub(){return ce.CreateHTML(this,"sup","","")}};l(Object.keys(Ln),function(e){var r=String.prototype[e];var n=false;if(ce.IsCallable(r)){var o=t(r,"",' " ');var i=P([],o.match(/"/g)).length;n=o!==o.toLowerCase()||i>2}else{n=true}if(n){ne(String.prototype,e,Ln[e])}});var Fn=function(){if(!oe){return false}var e=typeof JSON==="object"&&typeof JSON.stringify==="function"?JSON.stringify:null;if(!e){return false}if(typeof e($())!=="undefined"){return true}if(e([$()])!=="[null]"){return true}var t={a:$()};t[$()]=true;if(e(t)!=="{}"){return true}return false}();var Dn=a(function(){if(!oe){return true}return JSON.stringify(Object($()))==="{}"&&JSON.stringify([Object($())])==="[{}]"});if(Fn||!Dn){var zn=JSON.stringify;ne(JSON,"stringify",function stringify(e){if(typeof e==="symbol"){return}var n;if(arguments.length>1){n=arguments[1]}var o=[e];if(!r(n)){var i=ce.IsCallable(n)?n:null;var a=function(e,r){var n=i?t(i,this,e,r):r;if(typeof n!=="symbol"){if(re.symbol(n)){return Nt({})(n)}else{return n}}};o.push(a)}else{o.push(n)}if(arguments.length>2){o.push(arguments[2])}return zn.apply(this,o)})}return S});

// CHANGE 3
// Console-polyfill. MIT license.
// https://github.com/paulmillr/console-polyfill
// Make it safe to do console.log() always.
(function(global) {
  'use strict';
  if (!global.console) {
    global.console = {};
  }
  var con = global.console;
  var prop, method;
  var dummy = function() {};
  var properties = ['memory'];
  var methods = ('assert,clear,count,debug,dir,dirxml,error,exception,group,' +
    'groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,' +
    'show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn').split(',');
  while (prop = properties.pop()) if (!con[prop]) con[prop] = {};
  while (method = methods.pop()) if (!con[method]) con[method] = dummy;
  // Using `this` for web workers & supports Browserify / Webpack.
})(typeof window === 'undefined' ? this : window);

(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define("pdfjs-dist/build/pdf.worker", [], factory);
	else if(typeof exports === 'object')
		exports["pdfjs-dist/build/pdf.worker"] = factory();
	else
		root["pdfjs-dist/build/pdf.worker"] = root.pdfjsWorker = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __w_pdfjs_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__w_pdfjs_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__w_pdfjs_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__w_pdfjs_require__.d = function(exports, name, getter) {
/******/ 		if(!__w_pdfjs_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__w_pdfjs_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__w_pdfjs_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __w_pdfjs_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__w_pdfjs_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __w_pdfjs_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__w_pdfjs_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__w_pdfjs_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__w_pdfjs_require__.p = "";
/******/
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __w_pdfjs_require__(__w_pdfjs_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var pdfjsVersion = '2.1.266';
var pdfjsBuild = '81f5835c';

var pdfjsCoreWorker = __w_pdfjs_require__(1);

exports.WorkerMessageHandler = pdfjsCoreWorker.WorkerMessageHandler;

/***/ }),
/* 1 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.WorkerMessageHandler = exports.WorkerTask = void 0;

var _regenerator = _interopRequireDefault(__w_pdfjs_require__(2));

var _util = __w_pdfjs_require__(6);

var _pdf_manager = __w_pdfjs_require__(151);

var _is_node = _interopRequireDefault(__w_pdfjs_require__(9));

var _message_handler = __w_pdfjs_require__(189);

var _primitives = __w_pdfjs_require__(155);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var WorkerTask = function WorkerTaskClosure() {
  function WorkerTask(name) {
    this.name = name;
    this.terminated = false;
    this._capability = (0, _util.createPromiseCapability)();
  }

  WorkerTask.prototype = {
    get finished() {
      return this._capability.promise;
    },

    finish: function finish() {
      this._capability.resolve();
    },
    terminate: function terminate() {
      this.terminated = true;
    },
    ensureNotTerminated: function ensureNotTerminated() {
      if (this.terminated) {
        throw new Error('Worker task was terminated');
      }
    }
  };
  return WorkerTask;
}();

exports.WorkerTask = WorkerTask;

var PDFWorkerStream = function PDFWorkerStreamClosure() {
  function PDFWorkerStream(msgHandler) {
    this._msgHandler = msgHandler;
    this._contentLength = null;
    this._fullRequestReader = null;
    this._rangeRequestReaders = [];
  }

  PDFWorkerStream.prototype = {
    getFullReader: function getFullReader() {
      (0, _util.assert)(!this._fullRequestReader);
      this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler);
      return this._fullRequestReader;
    },
    getRangeReader: function getRangeReader(begin, end) {
      var reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler);

      this._rangeRequestReaders.push(reader);

      return reader;
    },
    cancelAllRequests: function cancelAllRequests(reason) {
      if (this._fullRequestReader) {
        this._fullRequestReader.cancel(reason);
      }

      var readers = this._rangeRequestReaders.slice(0);

      readers.forEach(function (reader) {
        reader.cancel(reason);
      });
    }
  };

  function PDFWorkerStreamReader(msgHandler) {
    var _this = this;

    this._msgHandler = msgHandler;
    this._contentLength = null;
    this._isRangeSupported = false;
    this._isStreamingSupported = false;

    var readableStream = this._msgHandler.sendWithStream('GetReader');

    this._reader = readableStream.getReader();
    this._headersReady = this._msgHandler.sendWithPromise('ReaderHeadersReady').then(function (data) {
      _this._isStreamingSupported = data.isStreamingSupported;
      _this._isRangeSupported = data.isRangeSupported;
      _this._contentLength = data.contentLength;
    });
  }

  PDFWorkerStreamReader.prototype = {
    get headersReady() {
      return this._headersReady;
    },

    get contentLength() {
      return this._contentLength;
    },

    get isStreamingSupported() {
      return this._isStreamingSupported;
    },

    get isRangeSupported() {
      return this._isRangeSupported;
    },

    read: function read() {
      return this._reader.read().then(function (_ref) {
        var value = _ref.value,
            done = _ref.done;

        if (done) {
          return {
            value: undefined,
            done: true
          };
        }

        return {
          value: value.buffer,
          done: false
        };
      });
    },
    cancel: function cancel(reason) {
      this._reader.cancel(reason);
    }
  };

  function PDFWorkerStreamRangeReader(begin, end, msgHandler) {
    this._msgHandler = msgHandler;
    this.onProgress = null;

    var readableStream = this._msgHandler.sendWithStream('GetRangeReader', {
      begin: begin,
      end: end
    });

    this._reader = readableStream.getReader();
  }

  PDFWorkerStreamRangeReader.prototype = {
    get isStreamingSupported() {
      return false;
    },

    read: function read() {
      return this._reader.read().then(function (_ref2) {
        var value = _ref2.value,
            done = _ref2.done;

        if (done) {
          return {
            value: undefined,
            done: true
          };
        }

        return {
          value: value.buffer,
          done: false
        };
      });
    },
    cancel: function cancel(reason) {
      this._reader.cancel(reason);
    }
  };
  return PDFWorkerStream;
}();

var WorkerMessageHandler = {
  setup: function setup(handler, port) {
    var testMessageProcessed = false;
    handler.on('test', function wphSetupTest(data) {
      if (testMessageProcessed) {
        return;
      }

      testMessageProcessed = true;

      if (!(data instanceof Uint8Array)) {
        handler.send('test', false);
        return;
      }

      var supportTransfers = data[0] === 255;
      handler.postMessageTransfers = supportTransfers;
      var xhr = new XMLHttpRequest();
      var responseExists = 'response' in xhr;

      try {
        xhr.responseType;
      } catch (e) {
        responseExists = false;
      }

      if (!responseExists) {
        handler.send('test', false);
        return;
      }

      handler.send('test', {
        supportTypedArray: true,
        supportTransfers: supportTransfers
      });
    });
    handler.on('configure', function wphConfigure(data) {
      (0, _util.setVerbosityLevel)(data.verbosity);
    });
    handler.on('GetDocRequest', function wphSetupDoc(data) {
      return WorkerMessageHandler.createDocumentHandler(data, port);
    });
  },
  createDocumentHandler: function createDocumentHandler(docParams, port) {
    var pdfManager;
    var terminated = false;
    var cancelXHRs = null;
    var WorkerTasks = [];
    var apiVersion = docParams.apiVersion;
    var workerVersion = '2.1.266';

    if (apiVersion !== workerVersion) {
      throw new Error("The API version \"".concat(apiVersion, "\" does not match ") + "the Worker version \"".concat(workerVersion, "\"."));
    }

    var docId = docParams.docId;
    var docBaseUrl = docParams.docBaseUrl;
    var workerHandlerName = docParams.docId + '_worker';
    var handler = new _message_handler.MessageHandler(workerHandlerName, docId, port);
    handler.postMessageTransfers = docParams.postMessageTransfers;

    function ensureNotTerminated() {
      if (terminated) {
        throw new Error('Worker was terminated');
      }
    }

    function startWorkerTask(task) {
      WorkerTasks.push(task);
    }

    function finishWorkerTask(task) {
      task.finish();
      var i = WorkerTasks.indexOf(task);
      WorkerTasks.splice(i, 1);
    }

    function loadDocument(_x) {
      return _loadDocument.apply(this, arguments);
    }

    function _loadDocument() {
      _loadDocument = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee(recoveryMode) {
        var _ref6, _ref7, numPages, fingerprint;

        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                _context.next = 2;
                return pdfManager.ensureDoc('checkHeader');

              case 2:
                _context.next = 4;
                return pdfManager.ensureDoc('parseStartXRef');

              case 4:
                _context.next = 6;
                return pdfManager.ensureDoc('parse', [recoveryMode]);

              case 6:
                if (recoveryMode) {
                  _context.next = 9;
                  break;
                }

                _context.next = 9;
                return pdfManager.ensureDoc('checkFirstPage');

              case 9:
                _context.next = 11;
                return Promise.all([pdfManager.ensureDoc('numPages'), pdfManager.ensureDoc('fingerprint')]);

              case 11:
                _ref6 = _context.sent;
                _ref7 = _slicedToArray(_ref6, 2);
                numPages = _ref7[0];
                fingerprint = _ref7[1];
                return _context.abrupt("return", {
                  numPages: numPages,
                  fingerprint: fingerprint
                });

              case 16:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));
      return _loadDocument.apply(this, arguments);
    }

    function getPdfManager(data, evaluatorOptions) {
      var pdfManagerCapability = (0, _util.createPromiseCapability)();
      var pdfManager;
      var source = data.source;

      if (source.data) {
        try {
          pdfManager = new _pdf_manager.LocalPdfManager(docId, source.data, source.password, evaluatorOptions, docBaseUrl);
          pdfManagerCapability.resolve(pdfManager);
        } catch (ex) {
          pdfManagerCapability.reject(ex);
        }

        return pdfManagerCapability.promise;
      }

      var pdfStream,
          cachedChunks = [];

      try {
        pdfStream = new PDFWorkerStream(handler);
      } catch (ex) {
        pdfManagerCapability.reject(ex);
        return pdfManagerCapability.promise;
      }

      var fullRequest = pdfStream.getFullReader();
      fullRequest.headersReady.then(function () {
        if (!fullRequest.isRangeSupported) {
          return;
        }

        var disableAutoFetch = source.disableAutoFetch || fullRequest.isStreamingSupported;
        pdfManager = new _pdf_manager.NetworkPdfManager(docId, pdfStream, {
          msgHandler: handler,
          password: source.password,
          length: fullRequest.contentLength,
          disableAutoFetch: disableAutoFetch,
          rangeChunkSize: source.rangeChunkSize
        }, evaluatorOptions, docBaseUrl);

        for (var i = 0; i < cachedChunks.length; i++) {
          pdfManager.sendProgressiveData(cachedChunks[i]);
        }

        cachedChunks = [];
        pdfManagerCapability.resolve(pdfManager);
        cancelXHRs = null;
      }).catch(function (reason) {
        pdfManagerCapability.reject(reason);
        cancelXHRs = null;
      });
      var loaded = 0;

      var flushChunks = function flushChunks() {
        var pdfFile = (0, _util.arraysToBytes)(cachedChunks);

        if (source.length && pdfFile.length !== source.length) {
          (0, _util.warn)('reported HTTP length is different from actual');
        }

        try {
          pdfManager = new _pdf_manager.LocalPdfManager(docId, pdfFile, source.password, evaluatorOptions, docBaseUrl);
          pdfManagerCapability.resolve(pdfManager);
        } catch (ex) {
          pdfManagerCapability.reject(ex);
        }

        cachedChunks = [];
      };

      var readPromise = new Promise(function (resolve, reject) {
        var readChunk = function readChunk(chunk) {
          try {
            ensureNotTerminated();

            if (chunk.done) {
              if (!pdfManager) {
                flushChunks();
              }

              cancelXHRs = null;
              return;
            }

            var data = chunk.value;
            loaded += (0, _util.arrayByteLength)(data);

            if (!fullRequest.isStreamingSupported) {
              handler.send('DocProgress', {
                loaded: loaded,
                total: Math.max(loaded, fullRequest.contentLength || 0)
              });
            }

            if (pdfManager) {
              pdfManager.sendProgressiveData(data);
            } else {
              cachedChunks.push(data);
            }

            fullRequest.read().then(readChunk, reject);
          } catch (e) {
            reject(e);
          }
        };

        fullRequest.read().then(readChunk, reject);
      });
      readPromise.catch(function (e) {
        pdfManagerCapability.reject(e);
        cancelXHRs = null;
      });

      cancelXHRs = function cancelXHRs() {
        pdfStream.cancelAllRequests('abort');
      };

      return pdfManagerCapability.promise;
    }

    function setupDoc(data) {
      function onSuccess(doc) {
        ensureNotTerminated();
        handler.send('GetDoc', {
          pdfInfo: doc
        });
      }

      function onFailure(e) {
        ensureNotTerminated();

        if (e instanceof _util.PasswordException) {
          var task = new WorkerTask('PasswordException: response ' + e.code);
          startWorkerTask(task);
          handler.sendWithPromise('PasswordRequest', e).then(function (data) {
            finishWorkerTask(task);
            pdfManager.updatePassword(data.password);
            pdfManagerReady();
          }).catch(function (boundException) {
            finishWorkerTask(task);
            handler.send('PasswordException', boundException);
          }.bind(null, e));
        } else if (e instanceof _util.InvalidPDFException) {
          handler.send('InvalidPDF', e);
        } else if (e instanceof _util.MissingPDFException) {
          handler.send('MissingPDF', e);
        } else if (e instanceof _util.UnexpectedResponseException) {
          handler.send('UnexpectedResponse', e);
        } else {
          handler.send('UnknownError', new _util.UnknownErrorException(e.message, e.toString()));
        }
      }

      function pdfManagerReady() {
        ensureNotTerminated();
        loadDocument(false).then(onSuccess, function loadFailure(ex) {
          ensureNotTerminated();

          if (!(ex instanceof _util.XRefParseException)) {
            onFailure(ex);
            return;
          }

          pdfManager.requestLoadedStream();
          pdfManager.onLoadedStream().then(function () {
            ensureNotTerminated();
            loadDocument(true).then(onSuccess, onFailure);
          });
        }, onFailure);
      }

      ensureNotTerminated();
      var evaluatorOptions = {
        forceDataSchema: data.disableCreateObjectURL,
        maxImageSize: data.maxImageSize,
        disableFontFace: data.disableFontFace,
        nativeImageDecoderSupport: data.nativeImageDecoderSupport,
        ignoreErrors: data.ignoreErrors,
        isEvalSupported: data.isEvalSupported
      };
      getPdfManager(data, evaluatorOptions).then(function (newPdfManager) {
        if (terminated) {
          newPdfManager.terminate();
          throw new Error('Worker was terminated');
        }

        pdfManager = newPdfManager;
        pdfManager.onLoadedStream().then(function (stream) {
          handler.send('DataLoaded', {
            length: stream.bytes.byteLength
          });
        });
      }).then(pdfManagerReady, onFailure);
    }

    handler.on('GetPage', function wphSetupGetPage(data) {
      return pdfManager.getPage(data.pageIndex).then(function (page) {
        return Promise.all([pdfManager.ensure(page, 'rotate'), pdfManager.ensure(page, 'ref'), pdfManager.ensure(page, 'userUnit'), pdfManager.ensure(page, 'view')]).then(function (_ref3) {
          var _ref4 = _slicedToArray(_ref3, 4),
              rotate = _ref4[0],
              ref = _ref4[1],
              userUnit = _ref4[2],
              view = _ref4[3];

          return {
            rotate: rotate,
            ref: ref,
            userUnit: userUnit,
            view: view
          };
        });
      });
    });
    handler.on('GetPageIndex', function wphSetupGetPageIndex(data) {
      var ref = new _primitives.Ref(data.ref.num, data.ref.gen);
      var catalog = pdfManager.pdfDocument.catalog;
      return catalog.getPageIndex(ref);
    });
    handler.on('GetDestinations', function wphSetupGetDestinations(data) {
      return pdfManager.ensureCatalog('destinations');
    });
    handler.on('GetDestination', function wphSetupGetDestination(data) {
      return pdfManager.ensureCatalog('getDestination', [data.id]);
    });
    handler.on('GetPageLabels', function wphSetupGetPageLabels(data) {
      return pdfManager.ensureCatalog('pageLabels');
    });
    handler.on('GetPageMode', function wphSetupGetPageMode(data) {
      return pdfManager.ensureCatalog('pageMode');
    });
    handler.on('getOpenActionDestination', function (data) {
      return pdfManager.ensureCatalog('openActionDestination');
    });
    handler.on('GetAttachments', function wphSetupGetAttachments(data) {
      return pdfManager.ensureCatalog('attachments');
    });
    handler.on('GetJavaScript', function wphSetupGetJavaScript(data) {
      return pdfManager.ensureCatalog('javaScript');
    });
    handler.on('GetOutline', function wphSetupGetOutline(data) {
      return pdfManager.ensureCatalog('documentOutline');
    });
    handler.on('GetPermissions', function (data) {
      return pdfManager.ensureCatalog('permissions');
    });
    handler.on('GetMetadata', function wphSetupGetMetadata(data) {
      return Promise.all([pdfManager.ensureDoc('documentInfo'), pdfManager.ensureCatalog('metadata')]);
    });
    handler.on('GetData', function wphSetupGetData(data) {
      pdfManager.requestLoadedStream();
      return pdfManager.onLoadedStream().then(function (stream) {
        return stream.bytes;
      });
    });
    handler.on('GetStats', function wphSetupGetStats(data) {
      return pdfManager.pdfDocument.xref.stats;
    });
    handler.on('GetAnnotations', function (_ref5) {
      var pageIndex = _ref5.pageIndex,
          intent = _ref5.intent;
      return pdfManager.getPage(pageIndex).then(function (page) {
        return page.getAnnotationsData(intent);
      });
    });
    handler.on('RenderPageRequest', function wphSetupRenderPage(data) {
      var pageIndex = data.pageIndex;
      pdfManager.getPage(pageIndex).then(function (page) {
        var task = new WorkerTask('RenderPageRequest: page ' + pageIndex);
        startWorkerTask(task);
        var pageNum = pageIndex + 1;
        var start = Date.now();
        page.getOperatorList({
          handler: handler,
          task: task,
          intent: data.intent,
          renderInteractiveForms: data.renderInteractiveForms
        }).then(function (operatorList) {
          finishWorkerTask(task);
          (0, _util.info)('page=' + pageNum + ' - getOperatorList: time=' + (Date.now() - start) + 'ms, len=' + operatorList.totalLength);
        }, function (e) {
          finishWorkerTask(task);

          if (task.terminated) {
            return;
          }

          handler.send('UnsupportedFeature', {
            featureId: _util.UNSUPPORTED_FEATURES.unknown
          });
          var minimumStackMessage = 'worker.js: while trying to getPage() and getOperatorList()';
          var wrappedException;

          if (typeof e === 'string') {
            wrappedException = {
              message: e,
              stack: minimumStackMessage
            };
          } else if (_typeof(e) === 'object') {
            wrappedException = {
              message: e.message || e.toString(),
              stack: e.stack || minimumStackMessage
            };
          } else {
            wrappedException = {
              message: 'Unknown exception type: ' + _typeof(e),
              stack: minimumStackMessage
            };
          }

          handler.send('PageError', {
            pageNum: pageNum,
            error: wrappedException,
            intent: data.intent
          });
        });
      });
    }, this);
    handler.on('GetTextContent', function wphExtractText(data, sink) {
      var pageIndex = data.pageIndex;

      sink.onPull = function (desiredSize) {};

      sink.onCancel = function (reason) {};

      pdfManager.getPage(pageIndex).then(function (page) {
        var task = new WorkerTask('GetTextContent: page ' + pageIndex);
        startWorkerTask(task);
        var pageNum = pageIndex + 1;
        var start = Date.now();
        page.extractTextContent({
          handler: handler,
          task: task,
          sink: sink,
          normalizeWhitespace: data.normalizeWhitespace,
          combineTextItems: data.combineTextItems
        }).then(function () {
          finishWorkerTask(task);
          (0, _util.info)('text indexing: page=' + pageNum + ' - time=' + (Date.now() - start) + 'ms');
          sink.close();
        }, function (reason) {
          finishWorkerTask(task);

          if (task.terminated) {
            return;
          }

          sink.error(reason);
          throw reason;
        });
      });
    });
    handler.on('FontFallback', function (data) {
      return pdfManager.fontFallback(data.id, handler);
    });
    handler.on('Cleanup', function wphCleanup(data) {
      return pdfManager.cleanup();
    });
    handler.on('Terminate', function wphTerminate(data) {
      terminated = true;

      if (pdfManager) {
        pdfManager.terminate();
        pdfManager = null;
      }

      if (cancelXHRs) {
        cancelXHRs();
      }

      var waitOn = [];
      WorkerTasks.forEach(function (task) {
        waitOn.push(task.finished);
        task.terminate();
      });
      return Promise.all(waitOn).then(function () {
        handler.destroy();
        handler = null;
      });
    });
    handler.on('Ready', function wphReady(data) {
      setupDoc(docParams);
      docParams = null;
    });
    return workerHandlerName;
  },
  initializeFromPort: function initializeFromPort(port) {
    var handler = new _message_handler.MessageHandler('worker', 'main', port);
    WorkerMessageHandler.setup(handler, port);
    handler.send('ready', null);
  }
};
exports.WorkerMessageHandler = WorkerMessageHandler;

function isMessagePort(maybePort) {
  return typeof maybePort.postMessage === 'function' && 'onmessage' in maybePort;
}

if (typeof window === 'undefined' && !(0, _is_node.default)() && typeof self !== 'undefined' && isMessagePort(self)) {
  WorkerMessageHandler.initializeFromPort(self);
}

/***/ }),
/* 2 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = __w_pdfjs_require__(3);

/***/ }),
/* 3 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var g = function () {
  return this || (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self;
}() || Function("return this")();

var hadRuntime = g.regeneratorRuntime && Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
var oldRuntime = hadRuntime && g.regeneratorRuntime;
g.regeneratorRuntime = undefined;
module.exports = __w_pdfjs_require__(4);

if (hadRuntime) {
  g.regeneratorRuntime = oldRuntime;
} else {
  try {
    delete g.regeneratorRuntime;
  } catch (e) {
    g.regeneratorRuntime = undefined;
  }
}

/***/ }),
/* 4 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(module) {

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

!function (global) {
  "use strict";

  var Op = Object.prototype;
  var hasOwn = Op.hasOwnProperty;
  var undefined;
  var $Symbol = typeof Symbol === "function" ? Symbol : {};
  var iteratorSymbol = $Symbol.iterator || "@@iterator";
  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  var inModule = ( false ? undefined : _typeof(module)) === "object";
  var runtime = global.regeneratorRuntime;

  if (runtime) {
    if (inModule) {
      module.exports = runtime;
    }

    return;
  }

  runtime = global.regeneratorRuntime = inModule ? module.exports : {};

  function wrap(innerFn, outerFn, self, tryLocsList) {
    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
    var generator = Object.create(protoGenerator.prototype);
    var context = new Context(tryLocsList || []);
    generator._invoke = makeInvokeMethod(innerFn, self, context);
    return generator;
  }

  runtime.wrap = wrap;

  function tryCatch(fn, obj, arg) {
    try {
      return {
        type: "normal",
        arg: fn.call(obj, arg)
      };
    } catch (err) {
      return {
        type: "throw",
        arg: err
      };
    }
  }

  var GenStateSuspendedStart = "suspendedStart";
  var GenStateSuspendedYield = "suspendedYield";
  var GenStateExecuting = "executing";
  var GenStateCompleted = "completed";
  var ContinueSentinel = {};

  function Generator() {}

  function GeneratorFunction() {}

  function GeneratorFunctionPrototype() {}

  var IteratorPrototype = {};

  IteratorPrototype[iteratorSymbol] = function () {
    return this;
  };

  var getProto = Object.getPrototypeOf;
  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));

  if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
    IteratorPrototype = NativeIteratorPrototype;
  }

  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  GeneratorFunctionPrototype.constructor = GeneratorFunction;
  GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction";

  function defineIteratorMethods(prototype) {
    ["next", "throw", "return"].forEach(function (method) {
      prototype[method] = function (arg) {
        return this._invoke(method, arg);
      };
    });
  }

  runtime.isGeneratorFunction = function (genFun) {
    var ctor = typeof genFun === "function" && genFun.constructor;
    return ctor ? ctor === GeneratorFunction || (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
  };

  runtime.mark = function (genFun) {
    if (Object.setPrototypeOf) {
      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
    } else {
      genFun.__proto__ = GeneratorFunctionPrototype;

      if (!(toStringTagSymbol in genFun)) {
        genFun[toStringTagSymbol] = "GeneratorFunction";
      }
    }

    genFun.prototype = Object.create(Gp);
    return genFun;
  };

  runtime.awrap = function (arg) {
    return {
      __await: arg
    };
  };

  function AsyncIterator(generator) {
    function invoke(method, arg, resolve, reject) {
      var record = tryCatch(generator[method], generator, arg);

      if (record.type === "throw") {
        reject(record.arg);
      } else {
        var result = record.arg;
        var value = result.value;

        if (value && _typeof(value) === "object" && hasOwn.call(value, "__await")) {
          return Promise.resolve(value.__await).then(function (value) {
            invoke("next", value, resolve, reject);
          }, function (err) {
            invoke("throw", err, resolve, reject);
          });
        }

        return Promise.resolve(value).then(function (unwrapped) {
          result.value = unwrapped;
          resolve(result);
        }, function (error) {
          return invoke("throw", error, resolve, reject);
        });
      }
    }

    var previousPromise;

    function enqueue(method, arg) {
      function callInvokeWithMethodAndArg() {
        return new Promise(function (resolve, reject) {
          invoke(method, arg, resolve, reject);
        });
      }

      return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
    }

    this._invoke = enqueue;
  }

  defineIteratorMethods(AsyncIterator.prototype);

  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
    return this;
  };

  runtime.AsyncIterator = AsyncIterator;

  runtime.async = function (innerFn, outerFn, self, tryLocsList) {
    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));
    return runtime.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
      return result.done ? result.value : iter.next();
    });
  };

  function makeInvokeMethod(innerFn, self, context) {
    var state = GenStateSuspendedStart;
    return function invoke(method, arg) {
      if (state === GenStateExecuting) {
        throw new Error("Generator is already running");
      }

      if (state === GenStateCompleted) {
        if (method === "throw") {
          throw arg;
        }

        return doneResult();
      }

      context.method = method;
      context.arg = arg;

      while (true) {
        var delegate = context.delegate;

        if (delegate) {
          var delegateResult = maybeInvokeDelegate(delegate, context);

          if (delegateResult) {
            if (delegateResult === ContinueSentinel) continue;
            return delegateResult;
          }
        }

        if (context.method === "next") {
          context.sent = context._sent = context.arg;
        } else if (context.method === "throw") {
          if (state === GenStateSuspendedStart) {
            state = GenStateCompleted;
            throw context.arg;
          }

          context.dispatchException(context.arg);
        } else if (context.method === "return") {
          context.abrupt("return", context.arg);
        }

        state = GenStateExecuting;
        var record = tryCatch(innerFn, self, context);

        if (record.type === "normal") {
          state = context.done ? GenStateCompleted : GenStateSuspendedYield;

          if (record.arg === ContinueSentinel) {
            continue;
          }

          return {
            value: record.arg,
            done: context.done
          };
        } else if (record.type === "throw") {
          state = GenStateCompleted;
          context.method = "throw";
          context.arg = record.arg;
        }
      }
    };
  }

  function maybeInvokeDelegate(delegate, context) {
    var method = delegate.iterator[context.method];

    if (method === undefined) {
      context.delegate = null;

      if (context.method === "throw") {
        if (delegate.iterator.return) {
          context.method = "return";
          context.arg = undefined;
          maybeInvokeDelegate(delegate, context);

          if (context.method === "throw") {
            return ContinueSentinel;
          }
        }

        context.method = "throw";
        context.arg = new TypeError("The iterator does not provide a 'throw' method");
      }

      return ContinueSentinel;
    }

    var record = tryCatch(method, delegate.iterator, context.arg);

    if (record.type === "throw") {
      context.method = "throw";
      context.arg = record.arg;
      context.delegate = null;
      return ContinueSentinel;
    }

    var info = record.arg;

    if (!info) {
      context.method = "throw";
      context.arg = new TypeError("iterator result is not an object");
      context.delegate = null;
      return ContinueSentinel;
    }

    if (info.done) {
      context[delegate.resultName] = info.value;
      context.next = delegate.nextLoc;

      if (context.method !== "return") {
        context.method = "next";
        context.arg = undefined;
      }
    } else {
      return info;
    }

    context.delegate = null;
    return ContinueSentinel;
  }

  defineIteratorMethods(Gp);
  Gp[toStringTagSymbol] = "Generator";

  Gp[iteratorSymbol] = function () {
    return this;
  };

  Gp.toString = function () {
    return "[object Generator]";
  };

  function pushTryEntry(locs) {
    var entry = {
      tryLoc: locs[0]
    };

    if (1 in locs) {
      entry.catchLoc = locs[1];
    }

    if (2 in locs) {
      entry.finallyLoc = locs[2];
      entry.afterLoc = locs[3];
    }

    this.tryEntries.push(entry);
  }

  function resetTryEntry(entry) {
    var record = entry.completion || {};
    record.type = "normal";
    delete record.arg;
    entry.completion = record;
  }

  function Context(tryLocsList) {
    this.tryEntries = [{
      tryLoc: "root"
    }];
    tryLocsList.forEach(pushTryEntry, this);
    this.reset(true);
  }

  runtime.keys = function (object) {
    var keys = [];

    for (var key in object) {
      keys.push(key);
    }

    keys.reverse();
    return function next() {
      while (keys.length) {
        var key = keys.pop();

        if (key in object) {
          next.value = key;
          next.done = false;
          return next;
        }
      }

      next.done = true;
      return next;
    };
  };

  function values(iterable) {
    if (iterable) {
      var iteratorMethod = iterable[iteratorSymbol];

      if (iteratorMethod) {
        return iteratorMethod.call(iterable);
      }

      if (typeof iterable.next === "function") {
        return iterable;
      }

      if (!isNaN(iterable.length)) {
        var i = -1,
            next = function next() {
          while (++i < iterable.length) {
            if (hasOwn.call(iterable, i)) {
              next.value = iterable[i];
              next.done = false;
              return next;
            }
          }

          next.value = undefined;
          next.done = true;
          return next;
        };

        return next.next = next;
      }
    }

    return {
      next: doneResult
    };
  }

  runtime.values = values;

  function doneResult() {
    return {
      value: undefined,
      done: true
    };
  }

  Context.prototype = {
    constructor: Context,
    reset: function reset(skipTempReset) {
      this.prev = 0;
      this.next = 0;
      this.sent = this._sent = undefined;
      this.done = false;
      this.delegate = null;
      this.method = "next";
      this.arg = undefined;
      this.tryEntries.forEach(resetTryEntry);

      if (!skipTempReset) {
        for (var name in this) {
          if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
            this[name] = undefined;
          }
        }
      }
    },
    stop: function stop() {
      this.done = true;
      var rootEntry = this.tryEntries[0];
      var rootRecord = rootEntry.completion;

      if (rootRecord.type === "throw") {
        throw rootRecord.arg;
      }

      return this.rval;
    },
    dispatchException: function dispatchException(exception) {
      if (this.done) {
        throw exception;
      }

      var context = this;

      function handle(loc, caught) {
        record.type = "throw";
        record.arg = exception;
        context.next = loc;

        if (caught) {
          context.method = "next";
          context.arg = undefined;
        }

        return !!caught;
      }

      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        var record = entry.completion;

        if (entry.tryLoc === "root") {
          return handle("end");
        }

        if (entry.tryLoc <= this.prev) {
          var hasCatch = hasOwn.call(entry, "catchLoc");
          var hasFinally = hasOwn.call(entry, "finallyLoc");

          if (hasCatch && hasFinally) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            } else if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }
          } else if (hasCatch) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            }
          } else if (hasFinally) {
            if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }
          } else {
            throw new Error("try statement without catch or finally");
          }
        }
      }
    },
    abrupt: function abrupt(type, arg) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
          var finallyEntry = entry;
          break;
        }
      }

      if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
        finallyEntry = null;
      }

      var record = finallyEntry ? finallyEntry.completion : {};
      record.type = type;
      record.arg = arg;

      if (finallyEntry) {
        this.method = "next";
        this.next = finallyEntry.finallyLoc;
        return ContinueSentinel;
      }

      return this.complete(record);
    },
    complete: function complete(record, afterLoc) {
      if (record.type === "throw") {
        throw record.arg;
      }

      if (record.type === "break" || record.type === "continue") {
        this.next = record.arg;
      } else if (record.type === "return") {
        this.rval = this.arg = record.arg;
        this.method = "return";
        this.next = "end";
      } else if (record.type === "normal" && afterLoc) {
        this.next = afterLoc;
      }

      return ContinueSentinel;
    },
    finish: function finish(finallyLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.finallyLoc === finallyLoc) {
          this.complete(entry.completion, entry.afterLoc);
          resetTryEntry(entry);
          return ContinueSentinel;
        }
      }
    },
    "catch": function _catch(tryLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.tryLoc === tryLoc) {
          var record = entry.completion;

          if (record.type === "throw") {
            var thrown = record.arg;
            resetTryEntry(entry);
          }

          return thrown;
        }
      }

      throw new Error("illegal catch attempt");
    },
    delegateYield: function delegateYield(iterable, resultName, nextLoc) {
      this.delegate = {
        iterator: values(iterable),
        resultName: resultName,
        nextLoc: nextLoc
      };

      if (this.method === "next") {
        this.arg = undefined;
      }

      return ContinueSentinel;
    }
  };
}(function () {
  return this || (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self;
}() || Function("return this")());
/* WEBPACK VAR INJECTION */}.call(this, __w_pdfjs_require__(5)(module)))

/***/ }),
/* 5 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (module) {
  if (!module.webpackPolyfill) {
    module.deprecate = function () {};

    module.paths = [];
    if (!module.children) module.children = [];
    Object.defineProperty(module, "loaded", {
      enumerable: true,
      get: function get() {
        return module.l;
      }
    });
    Object.defineProperty(module, "id", {
      enumerable: true,
      get: function get() {
        return module.i;
      }
    });
    module.webpackPolyfill = 1;
  }

  return module;
};

/***/ }),
/* 6 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.toRomanNumerals = toRomanNumerals;
exports.arrayByteLength = arrayByteLength;
exports.arraysToBytes = arraysToBytes;
exports.assert = assert;
exports.bytesToString = bytesToString;
exports.createPromiseCapability = createPromiseCapability;
exports.deprecated = deprecated;
exports.getInheritableProperty = getInheritableProperty;
exports.getLookupTableFactory = getLookupTableFactory;
exports.getVerbosityLevel = getVerbosityLevel;
exports.info = info;
exports.isArrayBuffer = isArrayBuffer;
exports.isBool = isBool;
exports.isEmptyObj = isEmptyObj;
exports.isNum = isNum;
exports.isString = isString;
exports.isSpace = isSpace;
exports.isSameOrigin = isSameOrigin;
exports.createValidAbsoluteUrl = createValidAbsoluteUrl;
exports.isLittleEndian = isLittleEndian;
exports.isEvalSupported = isEvalSupported;
exports.log2 = log2;
exports.readInt8 = readInt8;
exports.readUint16 = readUint16;
exports.readUint32 = readUint32;
exports.removeNullCharacters = removeNullCharacters;
exports.setVerbosityLevel = setVerbosityLevel;
exports.shadow = shadow;
exports.string32 = string32;
exports.stringToBytes = stringToBytes;
exports.stringToPDFString = stringToPDFString;
exports.stringToUTF8String = stringToUTF8String;
exports.utf8StringToString = utf8StringToString;
exports.warn = warn;
exports.unreachable = unreachable;
Object.defineProperty(exports, "ReadableStream", {
  enumerable: true,
  get: function get() {
    return _streams_polyfill.ReadableStream;
  }
});
Object.defineProperty(exports, "URL", {
  enumerable: true,
  get: function get() {
    return _url_polyfill.URL;
  }
});
exports.createObjectURL = exports.FormatError = exports.XRefParseException = exports.XRefEntryException = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.NativeImageDecoding = exports.MissingPDFException = exports.MissingDataException = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VerbosityLevel = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = void 0;

__w_pdfjs_require__(7);

var _streams_polyfill = __w_pdfjs_require__(147);

var _url_polyfill = __w_pdfjs_require__(149);

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
exports.IDENTITY_MATRIX = IDENTITY_MATRIX;
var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX;
var NativeImageDecoding = {
  NONE: 'none',
  DECODE: 'decode',
  DISPLAY: 'display'
};
exports.NativeImageDecoding = NativeImageDecoding;
var PermissionFlag = {
  PRINT: 0x04,
  MODIFY_CONTENTS: 0x08,
  COPY: 0x10,
  MODIFY_ANNOTATIONS: 0x20,
  FILL_INTERACTIVE_FORMS: 0x100,
  COPY_FOR_ACCESSIBILITY: 0x200,
  ASSEMBLE: 0x400,
  PRINT_HIGH_QUALITY: 0x800
};
exports.PermissionFlag = PermissionFlag;
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
};
exports.TextRenderingMode = TextRenderingMode;
var ImageKind = {
  GRAYSCALE_1BPP: 1,
  RGB_24BPP: 2,
  RGBA_32BPP: 3
};
exports.ImageKind = ImageKind;
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
};
exports.AnnotationType = AnnotationType;
var AnnotationFlag = {
  INVISIBLE: 0x01,
  HIDDEN: 0x02,
  PRINT: 0x04,
  NOZOOM: 0x08,
  NOROTATE: 0x10,
  NOVIEW: 0x20,
  READONLY: 0x40,
  LOCKED: 0x80,
  TOGGLENOVIEW: 0x100,
  LOCKEDCONTENTS: 0x200
};
exports.AnnotationFlag = AnnotationFlag;
var AnnotationFieldFlag = {
  READONLY: 0x0000001,
  REQUIRED: 0x0000002,
  NOEXPORT: 0x0000004,
  MULTILINE: 0x0001000,
  PASSWORD: 0x0002000,
  NOTOGGLETOOFF: 0x0004000,
  RADIO: 0x0008000,
  PUSHBUTTON: 0x0010000,
  COMBO: 0x0020000,
  EDIT: 0x0040000,
  SORT: 0x0080000,
  FILESELECT: 0x0100000,
  MULTISELECT: 0x0200000,
  DONOTSPELLCHECK: 0x0400000,
  DONOTSCROLL: 0x0800000,
  COMB: 0x1000000,
  RICHTEXT: 0x2000000,
  RADIOSINUNISON: 0x2000000,
  COMMITONSELCHANGE: 0x4000000
};
exports.AnnotationFieldFlag = AnnotationFieldFlag;
var AnnotationBorderStyleType = {
  SOLID: 1,
  DASHED: 2,
  BEVELED: 3,
  INSET: 4,
  UNDERLINE: 5
};
exports.AnnotationBorderStyleType = AnnotationBorderStyleType;
var StreamType = {
  UNKNOWN: 0,
  FLATE: 1,
  LZW: 2,
  DCT: 3,
  JPX: 4,
  JBIG: 5,
  A85: 6,
  AHX: 7,
  CCF: 8,
  RL: 9
};
exports.StreamType = StreamType;
var FontType = {
  UNKNOWN: 0,
  TYPE1: 1,
  TYPE1C: 2,
  CIDFONTTYPE0: 3,
  CIDFONTTYPE0C: 4,
  TRUETYPE: 5,
  CIDFONTTYPE2: 6,
  TYPE3: 7,
  OPENTYPE: 8,
  TYPE0: 9,
  MMTYPE1: 10
};
exports.FontType = FontType;
var VerbosityLevel = {
  ERRORS: 0,
  WARNINGS: 1,
  INFOS: 5
};
exports.VerbosityLevel = VerbosityLevel;
var CMapCompressionType = {
  NONE: 0,
  BINARY: 1,
  STREAM: 2
};
exports.CMapCompressionType = CMapCompressionType;
var OPS = {
  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
};
exports.OPS = OPS;
var UNSUPPORTED_FEATURES = {
  unknown: 'unknown',
  forms: 'forms',
  javaScript: 'javaScript',
  smask: 'smask',
  shadingPattern: 'shadingPattern',
  font: 'font'
};
exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES;
var PasswordResponses = {
  NEED_PASSWORD: 1,
  INCORRECT_PASSWORD: 2
};
exports.PasswordResponses = PasswordResponses;
var verbosity = VerbosityLevel.WARNINGS;

function setVerbosityLevel(level) {
  if (Number.isInteger(level)) {
    verbosity = level;
  }
}

function getVerbosityLevel() {
  return verbosity;
}

function info(msg) {
  if (verbosity >= VerbosityLevel.INFOS) {
    console.log('Info: ' + msg);
  }
}

function warn(msg) {
  if (verbosity >= VerbosityLevel.WARNINGS) {
    console.log('Warning: ' + msg);
  }
}

function deprecated(details) {
  console.log('Deprecated API usage: ' + details);
}

function unreachable(msg) {
  throw new Error(msg);
}

function assert(cond, msg) {
  if (!cond) {
    unreachable(msg);
  }
}

function isSameOrigin(baseUrl, otherUrl) {
  try {
    var base = new _url_polyfill.URL(baseUrl);

    if (!base.origin || base.origin === 'null') {
      return false;
    }
  } catch (e) {
    return false;
  }

  var other = new _url_polyfill.URL(otherUrl, base);
  return base.origin === other.origin;
}

function _isValidProtocol(url) {
  if (!url) {
    return false;
  }

  switch (url.protocol) {
    case 'http:':
    case 'https:':
    case 'ftp:':
    case 'mailto:':
    case 'tel:':
      return true;

    default:
      return false;
  }
}

function createValidAbsoluteUrl(url, baseUrl) {
  if (!url) {
    return null;
  }

  try {
    var absoluteUrl = baseUrl ? new _url_polyfill.URL(url, baseUrl) : new _url_polyfill.URL(url);

    if (_isValidProtocol(absoluteUrl)) {
      return absoluteUrl;
    }
  } catch (ex) {}

  return null;
}

function shadow(obj, prop, value) {
  Object.defineProperty(obj, prop, {
    value: value,
    enumerable: true,
    configurable: true,
    writable: false
  });
  return value;
}

function getLookupTableFactory(initializer) {
  var lookup;
  return function () {
    if (initializer) {
      lookup = Object.create(null);
      initializer(lookup);
      initializer = null;
    }

    return lookup;
  };
}

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;
}();

exports.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;
}();

exports.UnknownErrorException = UnknownErrorException;

var InvalidPDFException = function InvalidPDFExceptionClosure() {
  function InvalidPDFException(msg) {
    this.name = 'InvalidPDFException';
    this.message = msg;
  }

  InvalidPDFException.prototype = new Error();
  InvalidPDFException.constructor = InvalidPDFException;
  return InvalidPDFException;
}();

exports.InvalidPDFException = InvalidPDFException;

var MissingPDFException = function MissingPDFExceptionClosure() {
  function MissingPDFException(msg) {
    this.name = 'MissingPDFException';
    this.message = msg;
  }

  MissingPDFException.prototype = new Error();
  MissingPDFException.constructor = MissingPDFException;
  return MissingPDFException;
}();

exports.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;
}();

exports.UnexpectedResponseException = UnexpectedResponseException;

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;
}();

exports.MissingDataException = MissingDataException;

var XRefEntryException = function XRefEntryExceptionClosure() {
  function XRefEntryException(msg) {
    this.message = msg;
  }

  XRefEntryException.prototype = new Error();
  XRefEntryException.prototype.name = 'XRefEntryException';
  XRefEntryException.constructor = XRefEntryException;
  return XRefEntryException;
}();

exports.XRefEntryException = XRefEntryException;

var XRefParseException = function XRefParseExceptionClosure() {
  function XRefParseException(msg) {
    this.message = msg;
  }

  XRefParseException.prototype = new Error();
  XRefParseException.prototype.name = 'XRefParseException';
  XRefParseException.constructor = XRefParseException;
  return XRefParseException;
}();

exports.XRefParseException = XRefParseException;

var FormatError = function FormatErrorClosure() {
  function FormatError(msg) {
    this.message = msg;
  }

  FormatError.prototype = new Error();
  FormatError.prototype.name = 'FormatError';
  FormatError.constructor = FormatError;
  return FormatError;
}();

exports.FormatError = FormatError;

var AbortException = function AbortExceptionClosure() {
  function AbortException(msg) {
    this.name = 'AbortException';
    this.message = msg;
  }

  AbortException.prototype = new Error();
  AbortException.constructor = AbortException;
  return AbortException;
}();

exports.AbortException = AbortException;
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, '');
}

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 arrayByteLength(arr) {
  if (arr.length !== undefined) {
    return arr.length;
  }

  assert(arr.byteLength !== undefined);
  return arr.byteLength;
}

function arraysToBytes(arr) {
  if (arr.length === 1 && arr[0] instanceof Uint8Array) {
    return arr[0];
  }

  var resultLength = 0;
  var i,
      ii = arr.length;
  var item, itemLength;

  for (i = 0; i < ii; i++) {
    item = arr[i];
    itemLength = arrayByteLength(item);
    resultLength += itemLength;
  }

  var pos = 0;
  var data = new Uint8Array(resultLength);

  for (i = 0; i < ii; i++) {
    item = arr[i];

    if (!(item instanceof Uint8Array)) {
      if (typeof item === 'string') {
        item = stringToBytes(item);
      } else {
        item = new Uint8Array(item);
      }
    }

    itemLength = item.byteLength;
    data.set(item, pos);
    pos += itemLength;
  }

  return data;
}

function string32(value) {
  return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);
}

function log2(x) {
  if (x <= 0) {
    return 0;
  }

  return Math.ceil(Math.log2(x));
}

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;
}

function isLittleEndian() {
  var buffer8 = new Uint8Array(4);
  buffer8[0] = 1;
  var view32 = new Uint32Array(buffer8.buffer, 0, 1);
  return view32[0] === 1;
}

function isEvalSupported() {
  try {
    new Function('');
    return true;
  } catch (e) {
    return false;
  }
}

function getInheritableProperty(_ref) {
  var dict = _ref.dict,
      key = _ref.key,
      _ref$getArray = _ref.getArray,
      getArray = _ref$getArray === void 0 ? false : _ref$getArray,
      _ref$stopWhenFound = _ref.stopWhenFound,
      stopWhenFound = _ref$stopWhenFound === void 0 ? true : _ref$stopWhenFound;
  var LOOP_LIMIT = 100;
  var loopCount = 0;
  var values;

  while (dict) {
    var value = getArray ? dict.getArray(key) : dict.get(key);

    if (value !== undefined) {
      if (stopWhenFound) {
        return value;
      }

      if (!values) {
        values = [];
      }

      values.push(value);
    }

    if (++loopCount > LOOP_LIMIT) {
      warn("getInheritableProperty: maximum loop count exceeded for \"".concat(key, "\""));
      break;
    }

    dict = dict.get('Parent');
  }

  return values;
}

var Util = function UtilClosure() {
  function Util() {}

  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];

  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
    rgbBuf[1] = r;
    rgbBuf[3] = g;
    rgbBuf[5] = b;
    return rgbBuf.join('');
  };

  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]];
  };

  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];
  };

  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];
  };

  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]];
  };

  Util.singularValueDecompose2dScale = function Util_singularValueDecompose2dScale(m) {
    var transpose = [m[0], m[2], m[1], m[3]];
    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];
    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;
    return [Math.sqrt(sx), Math.sqrt(sy)];
  };

  Util.normalizeRect = function Util_normalizeRect(rect) {
    var r = rect.slice(0);

    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;
  };

  Util.intersect = function Util_intersect(rect1, rect2) {
    function compare(a, b) {
      return a - b;
    }

    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);

    if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) {
      result[0] = orderedX[1];
      result[2] = orderedX[2];
    } else {
      return false;
    }

    if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {
      result[1] = orderedY[1];
      result[3] = orderedY[2];
    } else {
      return false;
    }

    return result;
  };

  return Util;
}();

exports.Util = Util;
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'];

function toRomanNumerals(number) {
  var lowerCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  assert(Number.isInteger(number) && number > 0, 'The number should be a positive integer.');
  var pos,
      romanBuf = [];

  while (number >= 1000) {
    number -= 1000;
    romanBuf.push('M');
  }

  pos = number / 100 | 0;
  number %= 100;
  romanBuf.push(ROMAN_NUMBER_MAP[pos]);
  pos = number / 10 | 0;
  number %= 10;
  romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);
  romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);
  var romanStr = romanBuf.join('');
  return lowerCase ? romanStr.toLowerCase() : romanStr;
}

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') {
    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 isNum(v) {
  return typeof v === 'number';
}

function isString(v) {
  return typeof v === 'string';
}

function isArrayBuffer(v) {
  return _typeof(v) === 'object' && v !== null && v.byteLength !== undefined;
}

function isSpace(ch) {
  return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A;
}

function createPromiseCapability() {
  var capability = Object.create(null);
  var isSettled = false;
  Object.defineProperty(capability, 'settled', {
    get: function get() {
      return isSettled;
    }
  });
  capability.promise = new Promise(function (resolve, reject) {
    capability.resolve = function (data) {
      isSettled = true;
      resolve(data);
    };

    capability.reject = function (reason) {
      isSettled = true;
      reject(reason);
    };
  });
  return capability;
}

var createObjectURL = function createObjectURLClosure() {
  var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  return function createObjectURL(data, contentType) {
    var forceDataSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;

    if (!forceDataSchema && _url_polyfill.URL.createObjectURL) {
      var blob = new Blob([data], {
        type: contentType
      });
      return _url_polyfill.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;
  };
}();

exports.createObjectURL = createObjectURL;

/***/ }),
/* 7 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var globalScope = __w_pdfjs_require__(8);

if (!globalScope._pdfjsCompatibilityChecked) {
  globalScope._pdfjsCompatibilityChecked = true;

  var isNodeJS = __w_pdfjs_require__(9);

  var hasDOM = (typeof window === "undefined" ? "undefined" : _typeof(window)) === 'object' && (typeof document === "undefined" ? "undefined" : _typeof(document)) === 'object';

  (function checkNodeBtoa() {
    if (globalScope.btoa || !isNodeJS()) {
      return;
    }

    globalScope.btoa = function (chars) {
      return Buffer.from(chars, 'binary').toString('base64');
    };
  })();

  (function checkNodeAtob() {
    if (globalScope.atob || !isNodeJS()) {
      return;
    }

    globalScope.atob = function (input) {
      return Buffer.from(input, 'base64').toString('binary');
    };
  })();

  (function checkChildNodeRemove() {
    if (!hasDOM) {
      return;
    }

    if (typeof Element.prototype.remove !== 'undefined') {
      return;
    }

    Element.prototype.remove = function () {
      if (this.parentNode) {
        this.parentNode.removeChild(this);
      }
    };
  })();

  (function checkDOMTokenListAddRemove() {
    if (!hasDOM || isNodeJS()) {
      return;
    }

    var div = document.createElement('div');
    div.classList.add('testOne', 'testTwo');

    if (div.classList.contains('testOne') === true && div.classList.contains('testTwo') === true) {
      return;
    }

    var OriginalDOMTokenListAdd = DOMTokenList.prototype.add;
    var OriginalDOMTokenListRemove = DOMTokenList.prototype.remove;

    DOMTokenList.prototype.add = function () {
      for (var _len = arguments.length, tokens = new Array(_len), _key = 0; _key < _len; _key++) {
        tokens[_key] = arguments[_key];
      }

      for (var _i = 0; _i < tokens.length; _i++) {
        var token = tokens[_i];
        OriginalDOMTokenListAdd.call(this, token);
      }
    };

    DOMTokenList.prototype.remove = function () {
      for (var _len2 = arguments.length, tokens = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
        tokens[_key2] = arguments[_key2];
      }

      for (var _i2 = 0; _i2 < tokens.length; _i2++) {
        var token = tokens[_i2];
        OriginalDOMTokenListRemove.call(this, token);
      }
    };
  })();

  (function checkDOMTokenListToggle() {
    if (!hasDOM || isNodeJS()) {
      return;
    }

    var div = document.createElement('div');

    if (div.classList.toggle('test', 0) === false) {
      return;
    }

    DOMTokenList.prototype.toggle = function (token) {
      var force = arguments.length > 1 ? !!arguments[1] : !this.contains(token);
      return this[force ? 'add' : 'remove'](token), force;
    };
  })();

  (function checkStringStartsWith() {
    if (String.prototype.startsWith) {
      return;
    }

    __w_pdfjs_require__(10);
  })();

  (function checkStringEndsWith() {
    if (String.prototype.endsWith) {
      return;
    }

    __w_pdfjs_require__(40);
  })();

  (function checkStringIncludes() {
    if (String.prototype.includes) {
      return;
    }

    __w_pdfjs_require__(42);
  })();

  (function checkArrayIncludes() {
    if (Array.prototype.includes) {
      return;
    }

    __w_pdfjs_require__(44);
  })();

  (function checkArrayFrom() {
    if (Array.from) {
      return;
    }

    __w_pdfjs_require__(51);
  })();

  (function checkObjectAssign() {
    if (Object.assign) {
      return;
    }

    __w_pdfjs_require__(74);
  })();

  (function checkMathLog2() {
    if (Math.log2) {
      return;
    }

    Math.log2 = __w_pdfjs_require__(79);
  })();

  (function checkNumberIsNaN() {
    if (Number.isNaN) {
      return;
    }

    Number.isNaN = __w_pdfjs_require__(81);
  })();

  (function checkNumberIsInteger() {
    if (Number.isInteger) {
      return;
    }

    Number.isInteger = __w_pdfjs_require__(83);
  })();

  (function checkPromise() {
    if (globalScope.Promise && globalScope.Promise.prototype && globalScope.Promise.prototype.finally) {
      return;
    }

    globalScope.Promise = __w_pdfjs_require__(86);
  })();

  (function checkWeakMap() {
    if (globalScope.WeakMap) {
      return;
    }

    globalScope.WeakMap = __w_pdfjs_require__(106);
  })();

  (function checkWeakSet() {
    if (globalScope.WeakSet) {
      return;
    }

    globalScope.WeakSet = __w_pdfjs_require__(123);
  })();

  (function checkStringCodePointAt() {
    if (String.codePointAt) {
      return;
    }

    String.codePointAt = __w_pdfjs_require__(127);
  })();

  (function checkStringFromCodePoint() {
    if (String.fromCodePoint) {
      return;
    }

    String.fromCodePoint = __w_pdfjs_require__(129);
  })();

  (function checkSymbol() {
    if (globalScope.Symbol) {
      return;
    }

    __w_pdfjs_require__(131);
  })();

  (function checkStringPadStart() {
    if (String.prototype.padStart) {
      return;
    }

    __w_pdfjs_require__(138);
  })();

  (function checkStringPadEnd() {
    if (String.prototype.padEnd) {
      return;
    }

    __w_pdfjs_require__(142);
  })();

  (function checkObjectValues() {
    if (Object.values) {
      return;
    }

    Object.values = __w_pdfjs_require__(144);
  })();
}

/***/ }),
/* 8 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = typeof window !== 'undefined' && window.Math === Math ? window : typeof global !== 'undefined' && global.Math === Math ? global : typeof self !== 'undefined' && self.Math === Math ? self : {};

/***/ }),
/* 9 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

module.exports = function isNodeJS() {
  return (typeof process === "undefined" ? "undefined" : _typeof(process)) === 'object' && process + '' === '[object process]' && !process.versions['nw'];
};

/***/ }),
/* 10 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(11);

module.exports = __w_pdfjs_require__(14).String.startsWith;

/***/ }),
/* 11 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

var toLength = __w_pdfjs_require__(30);

var context = __w_pdfjs_require__(32);

var STARTS_WITH = 'startsWith';
var $startsWith = ''[STARTS_WITH];
$export($export.P + $export.F * __w_pdfjs_require__(39)(STARTS_WITH), 'String', {
  startsWith: function startsWith(searchString) {
    var that = context(this, searchString, STARTS_WITH);
    var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));
    var search = String(searchString);
    return $startsWith ? $startsWith.call(that, search, index) : that.slice(index, index + search.length) === search;
  }
});

/***/ }),
/* 12 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(13);

var core = __w_pdfjs_require__(14);

var hide = __w_pdfjs_require__(15);

var redefine = __w_pdfjs_require__(25);

var ctx = __w_pdfjs_require__(28);

var PROTOTYPE = 'prototype';

var $export = function $export(type, name, source) {
  var IS_FORCED = type & $export.F;
  var IS_GLOBAL = type & $export.G;
  var IS_STATIC = type & $export.S;
  var IS_PROTO = type & $export.P;
  var IS_BIND = type & $export.B;
  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];
  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
  var key, own, out, exp;
  if (IS_GLOBAL) source = name;

  for (key in source) {
    own = !IS_FORCED && target && target[key] !== undefined;
    out = (own ? target : source)[key];
    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
    if (target) redefine(target, key, out, type & $export.U);
    if (exports[key] != out) hide(exports, key, exp);
    if (IS_PROTO && expProto[key] != out) expProto[key] = out;
  }
};

global.core = core;
$export.F = 1;
$export.G = 2;
$export.S = 4;
$export.P = 8;
$export.B = 16;
$export.W = 32;
$export.U = 64;
$export.R = 128;
module.exports = $export;

/***/ }),
/* 13 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
if (typeof __g == 'number') __g = global;

/***/ }),
/* 14 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var core = module.exports = {
  version: '2.6.2'
};
if (typeof __e == 'number') __e = core;

/***/ }),
/* 15 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var dP = __w_pdfjs_require__(16);

var createDesc = __w_pdfjs_require__(24);

module.exports = __w_pdfjs_require__(20) ? function (object, key, value) {
  return dP.f(object, key, createDesc(1, value));
} : function (object, key, value) {
  object[key] = value;
  return object;
};

/***/ }),
/* 16 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var anObject = __w_pdfjs_require__(17);

var IE8_DOM_DEFINE = __w_pdfjs_require__(19);

var toPrimitive = __w_pdfjs_require__(23);

var dP = Object.defineProperty;
exports.f = __w_pdfjs_require__(20) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
  anObject(O);
  P = toPrimitive(P, true);
  anObject(Attributes);
  if (IE8_DOM_DEFINE) try {
    return dP(O, P, Attributes);
  } catch (e) {}
  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
  if ('value' in Attributes) O[P] = Attributes.value;
  return O;
};

/***/ }),
/* 17 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(18);

module.exports = function (it) {
  if (!isObject(it)) throw TypeError(it + ' is not an object!');
  return it;
};

/***/ }),
/* 18 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

module.exports = function (it) {
  return _typeof(it) === 'object' ? it !== null : typeof it === 'function';
};

/***/ }),
/* 19 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = !__w_pdfjs_require__(20) && !__w_pdfjs_require__(21)(function () {
  return Object.defineProperty(__w_pdfjs_require__(22)('div'), 'a', {
    get: function get() {
      return 7;
    }
  }).a != 7;
});

/***/ }),
/* 20 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = !__w_pdfjs_require__(21)(function () {
  return Object.defineProperty({}, 'a', {
    get: function get() {
      return 7;
    }
  }).a != 7;
});

/***/ }),
/* 21 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (exec) {
  try {
    return !!exec();
  } catch (e) {
    return true;
  }
};

/***/ }),
/* 22 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(18);

var document = __w_pdfjs_require__(13).document;

var is = isObject(document) && isObject(document.createElement);

module.exports = function (it) {
  return is ? document.createElement(it) : {};
};

/***/ }),
/* 23 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(18);

module.exports = function (it, S) {
  if (!isObject(it)) return it;
  var fn, val;
  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
  throw TypeError("Can't convert object to primitive value");
};

/***/ }),
/* 24 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (bitmap, value) {
  return {
    enumerable: !(bitmap & 1),
    configurable: !(bitmap & 2),
    writable: !(bitmap & 4),
    value: value
  };
};

/***/ }),
/* 25 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(13);

var hide = __w_pdfjs_require__(15);

var has = __w_pdfjs_require__(26);

var SRC = __w_pdfjs_require__(27)('src');

var TO_STRING = 'toString';
var $toString = Function[TO_STRING];
var TPL = ('' + $toString).split(TO_STRING);

__w_pdfjs_require__(14).inspectSource = function (it) {
  return $toString.call(it);
};

(module.exports = function (O, key, val, safe) {
  var isFunction = typeof val == 'function';
  if (isFunction) has(val, 'name') || hide(val, 'name', key);
  if (O[key] === val) return;
  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));

  if (O === global) {
    O[key] = val;
  } else if (!safe) {
    delete O[key];
    hide(O, key, val);
  } else if (O[key]) {
    O[key] = val;
  } else {
    hide(O, key, val);
  }
})(Function.prototype, TO_STRING, function toString() {
  return typeof this == 'function' && this[SRC] || $toString.call(this);
});

/***/ }),
/* 26 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var hasOwnProperty = {}.hasOwnProperty;

module.exports = function (it, key) {
  return hasOwnProperty.call(it, key);
};

/***/ }),
/* 27 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var id = 0;
var px = Math.random();

module.exports = function (key) {
  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
};

/***/ }),
/* 28 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var aFunction = __w_pdfjs_require__(29);

module.exports = function (fn, that, length) {
  aFunction(fn);
  if (that === undefined) return fn;

  switch (length) {
    case 1:
      return function (a) {
        return fn.call(that, a);
      };

    case 2:
      return function (a, b) {
        return fn.call(that, a, b);
      };

    case 3:
      return function (a, b, c) {
        return fn.call(that, a, b, c);
      };
  }

  return function () {
    return fn.apply(that, arguments);
  };
};

/***/ }),
/* 29 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (it) {
  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
  return it;
};

/***/ }),
/* 30 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toInteger = __w_pdfjs_require__(31);

var min = Math.min;

module.exports = function (it) {
  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0;
};

/***/ }),
/* 31 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var ceil = Math.ceil;
var floor = Math.floor;

module.exports = function (it) {
  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
};

/***/ }),
/* 32 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isRegExp = __w_pdfjs_require__(33);

var defined = __w_pdfjs_require__(38);

module.exports = function (that, searchString, NAME) {
  if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!");
  return String(defined(that));
};

/***/ }),
/* 33 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(18);

var cof = __w_pdfjs_require__(34);

var MATCH = __w_pdfjs_require__(35)('match');

module.exports = function (it) {
  var isRegExp;
  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');
};

/***/ }),
/* 34 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toString = {}.toString;

module.exports = function (it) {
  return toString.call(it).slice(8, -1);
};

/***/ }),
/* 35 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var store = __w_pdfjs_require__(36)('wks');

var uid = __w_pdfjs_require__(27);

var _Symbol = __w_pdfjs_require__(13).Symbol;

var USE_SYMBOL = typeof _Symbol == 'function';

var $exports = module.exports = function (name) {
  return store[name] || (store[name] = USE_SYMBOL && _Symbol[name] || (USE_SYMBOL ? _Symbol : uid)('Symbol.' + name));
};

$exports.store = store;

/***/ }),
/* 36 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var core = __w_pdfjs_require__(14);

var global = __w_pdfjs_require__(13);

var SHARED = '__core-js_shared__';
var store = global[SHARED] || (global[SHARED] = {});
(module.exports = function (key, value) {
  return store[key] || (store[key] = value !== undefined ? value : {});
})('versions', []).push({
  version: core.version,
  mode: __w_pdfjs_require__(37) ? 'pure' : 'global',
  copyright: 'Â© 2019 Denis Pushkarev (zloirock.ru)'
});

/***/ }),
/* 37 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = false;

/***/ }),
/* 38 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (it) {
  if (it == undefined) throw TypeError("Can't call method on  " + it);
  return it;
};

/***/ }),
/* 39 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var MATCH = __w_pdfjs_require__(35)('match');

module.exports = function (KEY) {
  var re = /./;

  try {
    '/./'[KEY](re);
  } catch (e) {
    try {
      re[MATCH] = false;
      return !'/./'[KEY](re);
    } catch (f) {}
  }

  return true;
};

/***/ }),
/* 40 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(41);

module.exports = __w_pdfjs_require__(14).String.endsWith;

/***/ }),
/* 41 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

var toLength = __w_pdfjs_require__(30);

var context = __w_pdfjs_require__(32);

var ENDS_WITH = 'endsWith';
var $endsWith = ''[ENDS_WITH];
$export($export.P + $export.F * __w_pdfjs_require__(39)(ENDS_WITH), 'String', {
  endsWith: function endsWith(searchString) {
    var that = context(this, searchString, ENDS_WITH);
    var endPosition = arguments.length > 1 ? arguments[1] : undefined;
    var len = toLength(that.length);
    var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);
    var search = String(searchString);
    return $endsWith ? $endsWith.call(that, search, end) : that.slice(end - search.length, end) === search;
  }
});

/***/ }),
/* 42 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(43);

module.exports = __w_pdfjs_require__(14).String.includes;

/***/ }),
/* 43 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

var context = __w_pdfjs_require__(32);

var INCLUDES = 'includes';
$export($export.P + $export.F * __w_pdfjs_require__(39)(INCLUDES), 'String', {
  includes: function includes(searchString) {
    return !!~context(this, searchString, INCLUDES).indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
  }
});

/***/ }),
/* 44 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(45);

module.exports = __w_pdfjs_require__(14).Array.includes;

/***/ }),
/* 45 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

var $includes = __w_pdfjs_require__(46)(true);

$export($export.P, 'Array', {
  includes: function includes(el) {
    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
  }
});

__w_pdfjs_require__(50)('includes');

/***/ }),
/* 46 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toIObject = __w_pdfjs_require__(47);

var toLength = __w_pdfjs_require__(30);

var toAbsoluteIndex = __w_pdfjs_require__(49);

module.exports = function (IS_INCLUDES) {
  return function ($this, el, fromIndex) {
    var O = toIObject($this);
    var length = toLength(O.length);
    var index = toAbsoluteIndex(fromIndex, length);
    var value;
    if (IS_INCLUDES && el != el) while (length > index) {
      value = O[index++];
      if (value != value) return true;
    } else for (; length > index; index++) {
      if (IS_INCLUDES || index in O) {
        if (O[index] === el) return IS_INCLUDES || index || 0;
      }
    }
    return !IS_INCLUDES && -1;
  };
};

/***/ }),
/* 47 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var IObject = __w_pdfjs_require__(48);

var defined = __w_pdfjs_require__(38);

module.exports = function (it) {
  return IObject(defined(it));
};

/***/ }),
/* 48 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var cof = __w_pdfjs_require__(34);

module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
  return cof(it) == 'String' ? it.split('') : Object(it);
};

/***/ }),
/* 49 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toInteger = __w_pdfjs_require__(31);

var max = Math.max;
var min = Math.min;

module.exports = function (index, length) {
  index = toInteger(index);
  return index < 0 ? max(index + length, 0) : min(index, length);
};

/***/ }),
/* 50 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var UNSCOPABLES = __w_pdfjs_require__(35)('unscopables');

var ArrayProto = Array.prototype;
if (ArrayProto[UNSCOPABLES] == undefined) __w_pdfjs_require__(15)(ArrayProto, UNSCOPABLES, {});

module.exports = function (key) {
  ArrayProto[UNSCOPABLES][key] = true;
};

/***/ }),
/* 51 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(52);

__w_pdfjs_require__(67);

module.exports = __w_pdfjs_require__(14).Array.from;

/***/ }),
/* 52 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $at = __w_pdfjs_require__(53)(true);

__w_pdfjs_require__(54)(String, 'String', function (iterated) {
  this._t = String(iterated);
  this._i = 0;
}, function () {
  var O = this._t;
  var index = this._i;
  var point;
  if (index >= O.length) return {
    value: undefined,
    done: true
  };
  point = $at(O, index);
  this._i += point.length;
  return {
    value: point,
    done: false
  };
});

/***/ }),
/* 53 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toInteger = __w_pdfjs_require__(31);

var defined = __w_pdfjs_require__(38);

module.exports = function (TO_STRING) {
  return function (that, pos) {
    var s = String(defined(that));
    var i = toInteger(pos);
    var l = s.length;
    var a, b;
    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
    a = s.charCodeAt(i);
    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
  };
};

/***/ }),
/* 54 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var LIBRARY = __w_pdfjs_require__(37);

var $export = __w_pdfjs_require__(12);

var redefine = __w_pdfjs_require__(25);

var hide = __w_pdfjs_require__(15);

var Iterators = __w_pdfjs_require__(55);

var $iterCreate = __w_pdfjs_require__(56);

var setToStringTag = __w_pdfjs_require__(64);

var getPrototypeOf = __w_pdfjs_require__(65);

var ITERATOR = __w_pdfjs_require__(35)('iterator');

var BUGGY = !([].keys && 'next' in [].keys());
var FF_ITERATOR = '@@iterator';
var KEYS = 'keys';
var VALUES = 'values';

var returnThis = function returnThis() {
  return this;
};

module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
  $iterCreate(Constructor, NAME, next);

  var getMethod = function getMethod(kind) {
    if (!BUGGY && kind in proto) return proto[kind];

    switch (kind) {
      case KEYS:
        return function keys() {
          return new Constructor(this, kind);
        };

      case VALUES:
        return function values() {
          return new Constructor(this, kind);
        };
    }

    return function entries() {
      return new Constructor(this, kind);
    };
  };

  var TAG = NAME + ' Iterator';
  var DEF_VALUES = DEFAULT == VALUES;
  var VALUES_BUG = false;
  var proto = Base.prototype;
  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
  var $default = $native || getMethod(DEFAULT);
  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
  var methods, key, IteratorPrototype;

  if ($anyNative) {
    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));

    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
      setToStringTag(IteratorPrototype, TAG, true);
      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
    }
  }

  if (DEF_VALUES && $native && $native.name !== VALUES) {
    VALUES_BUG = true;

    $default = function values() {
      return $native.call(this);
    };
  }

  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
    hide(proto, ITERATOR, $default);
  }

  Iterators[NAME] = $default;
  Iterators[TAG] = returnThis;

  if (DEFAULT) {
    methods = {
      values: DEF_VALUES ? $default : getMethod(VALUES),
      keys: IS_SET ? $default : getMethod(KEYS),
      entries: $entries
    };
    if (FORCED) for (key in methods) {
      if (!(key in proto)) redefine(proto, key, methods[key]);
    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
  }

  return methods;
};

/***/ }),
/* 55 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = {};

/***/ }),
/* 56 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var create = __w_pdfjs_require__(57);

var descriptor = __w_pdfjs_require__(24);

var setToStringTag = __w_pdfjs_require__(64);

var IteratorPrototype = {};

__w_pdfjs_require__(15)(IteratorPrototype, __w_pdfjs_require__(35)('iterator'), function () {
  return this;
});

module.exports = function (Constructor, NAME, next) {
  Constructor.prototype = create(IteratorPrototype, {
    next: descriptor(1, next)
  });
  setToStringTag(Constructor, NAME + ' Iterator');
};

/***/ }),
/* 57 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var anObject = __w_pdfjs_require__(17);

var dPs = __w_pdfjs_require__(58);

var enumBugKeys = __w_pdfjs_require__(62);

var IE_PROTO = __w_pdfjs_require__(61)('IE_PROTO');

var Empty = function Empty() {};

var PROTOTYPE = 'prototype';

var _createDict = function createDict() {
  var iframe = __w_pdfjs_require__(22)('iframe');

  var i = enumBugKeys.length;
  var lt = '<';
  var gt = '>';
  var iframeDocument;
  iframe.style.display = 'none';

  __w_pdfjs_require__(63).appendChild(iframe);

  iframe.src = 'javascript:';
  iframeDocument = iframe.contentWindow.document;
  iframeDocument.open();
  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
  iframeDocument.close();
  _createDict = iframeDocument.F;

  while (i--) {
    delete _createDict[PROTOTYPE][enumBugKeys[i]];
  }

  return _createDict();
};

module.exports = Object.create || function create(O, Properties) {
  var result;

  if (O !== null) {
    Empty[PROTOTYPE] = anObject(O);
    result = new Empty();
    Empty[PROTOTYPE] = null;
    result[IE_PROTO] = O;
  } else result = _createDict();

  return Properties === undefined ? result : dPs(result, Properties);
};

/***/ }),
/* 58 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var dP = __w_pdfjs_require__(16);

var anObject = __w_pdfjs_require__(17);

var getKeys = __w_pdfjs_require__(59);

module.exports = __w_pdfjs_require__(20) ? Object.defineProperties : function defineProperties(O, Properties) {
  anObject(O);
  var keys = getKeys(Properties);
  var length = keys.length;
  var i = 0;
  var P;

  while (length > i) {
    dP.f(O, P = keys[i++], Properties[P]);
  }

  return O;
};

/***/ }),
/* 59 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $keys = __w_pdfjs_require__(60);

var enumBugKeys = __w_pdfjs_require__(62);

module.exports = Object.keys || function keys(O) {
  return $keys(O, enumBugKeys);
};

/***/ }),
/* 60 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var has = __w_pdfjs_require__(26);

var toIObject = __w_pdfjs_require__(47);

var arrayIndexOf = __w_pdfjs_require__(46)(false);

var IE_PROTO = __w_pdfjs_require__(61)('IE_PROTO');

module.exports = function (object, names) {
  var O = toIObject(object);
  var i = 0;
  var result = [];
  var key;

  for (key in O) {
    if (key != IE_PROTO) has(O, key) && result.push(key);
  }

  while (names.length > i) {
    if (has(O, key = names[i++])) {
      ~arrayIndexOf(result, key) || result.push(key);
    }
  }

  return result;
};

/***/ }),
/* 61 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var shared = __w_pdfjs_require__(36)('keys');

var uid = __w_pdfjs_require__(27);

module.exports = function (key) {
  return shared[key] || (shared[key] = uid(key));
};

/***/ }),
/* 62 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',');

/***/ }),
/* 63 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var document = __w_pdfjs_require__(13).document;

module.exports = document && document.documentElement;

/***/ }),
/* 64 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var def = __w_pdfjs_require__(16).f;

var has = __w_pdfjs_require__(26);

var TAG = __w_pdfjs_require__(35)('toStringTag');

module.exports = function (it, tag, stat) {
  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, {
    configurable: true,
    value: tag
  });
};

/***/ }),
/* 65 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var has = __w_pdfjs_require__(26);

var toObject = __w_pdfjs_require__(66);

var IE_PROTO = __w_pdfjs_require__(61)('IE_PROTO');

var ObjectProto = Object.prototype;

module.exports = Object.getPrototypeOf || function (O) {
  O = toObject(O);
  if (has(O, IE_PROTO)) return O[IE_PROTO];

  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
    return O.constructor.prototype;
  }

  return O instanceof Object ? ObjectProto : null;
};

/***/ }),
/* 66 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var defined = __w_pdfjs_require__(38);

module.exports = function (it) {
  return Object(defined(it));
};

/***/ }),
/* 67 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var ctx = __w_pdfjs_require__(28);

var $export = __w_pdfjs_require__(12);

var toObject = __w_pdfjs_require__(66);

var call = __w_pdfjs_require__(68);

var isArrayIter = __w_pdfjs_require__(69);

var toLength = __w_pdfjs_require__(30);

var createProperty = __w_pdfjs_require__(70);

var getIterFn = __w_pdfjs_require__(71);

$export($export.S + $export.F * !__w_pdfjs_require__(73)(function (iter) {
  Array.from(iter);
}), 'Array', {
  from: function from(arrayLike) {
    var O = toObject(arrayLike);
    var C = typeof this == 'function' ? this : Array;
    var aLen = arguments.length;
    var mapfn = aLen > 1 ? arguments[1] : undefined;
    var mapping = mapfn !== undefined;
    var index = 0;
    var iterFn = getIterFn(O);
    var length, result, step, iterator;
    if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);

    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {
      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);
      }
    } else {
      length = toLength(O.length);

      for (result = new C(length); length > index; index++) {
        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
      }
    }

    result.length = index;
    return result;
  }
});

/***/ }),
/* 68 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var anObject = __w_pdfjs_require__(17);

module.exports = function (iterator, fn, value, entries) {
  try {
    return entries ? fn(anObject(value)[0], value[1]) : fn(value);
  } catch (e) {
    var ret = iterator['return'];
    if (ret !== undefined) anObject(ret.call(iterator));
    throw e;
  }
};

/***/ }),
/* 69 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var Iterators = __w_pdfjs_require__(55);

var ITERATOR = __w_pdfjs_require__(35)('iterator');

var ArrayProto = Array.prototype;

module.exports = function (it) {
  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
};

/***/ }),
/* 70 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $defineProperty = __w_pdfjs_require__(16);

var createDesc = __w_pdfjs_require__(24);

module.exports = function (object, index, value) {
  if (index in object) $defineProperty.f(object, index, createDesc(0, value));else object[index] = value;
};

/***/ }),
/* 71 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var classof = __w_pdfjs_require__(72);

var ITERATOR = __w_pdfjs_require__(35)('iterator');

var Iterators = __w_pdfjs_require__(55);

module.exports = __w_pdfjs_require__(14).getIteratorMethod = function (it) {
  if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)];
};

/***/ }),
/* 72 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var cof = __w_pdfjs_require__(34);

var TAG = __w_pdfjs_require__(35)('toStringTag');

var ARG = cof(function () {
  return arguments;
}()) == 'Arguments';

var tryGet = function tryGet(it, key) {
  try {
    return it[key];
  } catch (e) {}
};

module.exports = function (it) {
  var O, T, B;
  return it === undefined ? 'Undefined' : it === null ? 'Null' : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T : ARG ? cof(O) : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
};

/***/ }),
/* 73 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var ITERATOR = __w_pdfjs_require__(35)('iterator');

var SAFE_CLOSING = false;

try {
  var riter = [7][ITERATOR]();

  riter['return'] = function () {
    SAFE_CLOSING = true;
  };

  Array.from(riter, function () {
    throw 2;
  });
} catch (e) {}

module.exports = function (exec, skipClosing) {
  if (!skipClosing && !SAFE_CLOSING) return false;
  var safe = false;

  try {
    var arr = [7];
    var iter = arr[ITERATOR]();

    iter.next = function () {
      return {
        done: safe = true
      };
    };

    arr[ITERATOR] = function () {
      return iter;
    };

    exec(arr);
  } catch (e) {}

  return safe;
};

/***/ }),
/* 74 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(75);

module.exports = __w_pdfjs_require__(14).Object.assign;

/***/ }),
/* 75 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

$export($export.S + $export.F, 'Object', {
  assign: __w_pdfjs_require__(76)
});

/***/ }),
/* 76 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var getKeys = __w_pdfjs_require__(59);

var gOPS = __w_pdfjs_require__(77);

var pIE = __w_pdfjs_require__(78);

var toObject = __w_pdfjs_require__(66);

var IObject = __w_pdfjs_require__(48);

var $assign = Object.assign;
module.exports = !$assign || __w_pdfjs_require__(21)(function () {
  var A = {};
  var B = {};
  var S = Symbol();
  var K = 'abcdefghijklmnopqrst';
  A[S] = 7;
  K.split('').forEach(function (k) {
    B[k] = k;
  });
  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
}) ? function assign(target, source) {
  var T = toObject(target);
  var aLen = arguments.length;
  var index = 1;
  var getSymbols = gOPS.f;
  var isEnum = pIE.f;

  while (aLen > index) {
    var S = IObject(arguments[index++]);
    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);
    var length = keys.length;
    var j = 0;
    var key;

    while (length > j) {
      if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
    }
  }

  return T;
} : $assign;

/***/ }),
/* 77 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


exports.f = Object.getOwnPropertySymbols;

/***/ }),
/* 78 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


exports.f = {}.propertyIsEnumerable;

/***/ }),
/* 79 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(80);

module.exports = __w_pdfjs_require__(14).Math.log2;

/***/ }),
/* 80 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

$export($export.S, 'Math', {
  log2: function log2(x) {
    return Math.log(x) / Math.LN2;
  }
});

/***/ }),
/* 81 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(82);

module.exports = __w_pdfjs_require__(14).Number.isNaN;

/***/ }),
/* 82 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

$export($export.S, 'Number', {
  isNaN: function isNaN(number) {
    return number != number;
  }
});

/***/ }),
/* 83 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(84);

module.exports = __w_pdfjs_require__(14).Number.isInteger;

/***/ }),
/* 84 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

$export($export.S, 'Number', {
  isInteger: __w_pdfjs_require__(85)
});

/***/ }),
/* 85 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(18);

var floor = Math.floor;

module.exports = function isInteger(it) {
  return !isObject(it) && isFinite(it) && floor(it) === it;
};

/***/ }),
/* 86 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(87);

__w_pdfjs_require__(52);

__w_pdfjs_require__(88);

__w_pdfjs_require__(91);

__w_pdfjs_require__(104);

__w_pdfjs_require__(105);

module.exports = __w_pdfjs_require__(14).Promise;

/***/ }),
/* 87 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var classof = __w_pdfjs_require__(72);

var test = {};
test[__w_pdfjs_require__(35)('toStringTag')] = 'z';

if (test + '' != '[object z]') {
  __w_pdfjs_require__(25)(Object.prototype, 'toString', function toString() {
    return '[object ' + classof(this) + ']';
  }, true);
}

/***/ }),
/* 88 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $iterators = __w_pdfjs_require__(89);

var getKeys = __w_pdfjs_require__(59);

var redefine = __w_pdfjs_require__(25);

var global = __w_pdfjs_require__(13);

var hide = __w_pdfjs_require__(15);

var Iterators = __w_pdfjs_require__(55);

var wks = __w_pdfjs_require__(35);

var ITERATOR = wks('iterator');
var TO_STRING_TAG = wks('toStringTag');
var ArrayValues = Iterators.Array;
var DOMIterables = {
  CSSRuleList: true,
  CSSStyleDeclaration: false,
  CSSValueList: false,
  ClientRectList: false,
  DOMRectList: false,
  DOMStringList: false,
  DOMTokenList: true,
  DataTransferItemList: false,
  FileList: false,
  HTMLAllCollection: false,
  HTMLCollection: false,
  HTMLFormElement: false,
  HTMLSelectElement: false,
  MediaList: true,
  MimeTypeArray: false,
  NamedNodeMap: false,
  NodeList: true,
  PaintRequestList: false,
  Plugin: false,
  PluginArray: false,
  SVGLengthList: false,
  SVGNumberList: false,
  SVGPathSegList: false,
  SVGPointList: false,
  SVGStringList: false,
  SVGTransformList: false,
  SourceBufferList: false,
  StyleSheetList: true,
  TextTrackCueList: false,
  TextTrackList: false,
  TouchList: false
};

for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {
  var NAME = collections[i];
  var explicit = DOMIterables[NAME];
  var Collection = global[NAME];
  var proto = Collection && Collection.prototype;
  var key;

  if (proto) {
    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);
    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
    Iterators[NAME] = ArrayValues;
    if (explicit) for (key in $iterators) {
      if (!proto[key]) redefine(proto, key, $iterators[key], true);
    }
  }
}

/***/ }),
/* 89 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var addToUnscopables = __w_pdfjs_require__(50);

var step = __w_pdfjs_require__(90);

var Iterators = __w_pdfjs_require__(55);

var toIObject = __w_pdfjs_require__(47);

module.exports = __w_pdfjs_require__(54)(Array, 'Array', function (iterated, kind) {
  this._t = toIObject(iterated);
  this._i = 0;
  this._k = kind;
}, function () {
  var O = this._t;
  var kind = this._k;
  var index = this._i++;

  if (!O || index >= O.length) {
    this._t = undefined;
    return step(1);
  }

  if (kind == 'keys') return step(0, index);
  if (kind == 'values') return step(0, O[index]);
  return step(0, [index, O[index]]);
}, 'values');
Iterators.Arguments = Iterators.Array;
addToUnscopables('keys');
addToUnscopables('values');
addToUnscopables('entries');

/***/ }),
/* 90 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (done, value) {
  return {
    value: value,
    done: !!done
  };
};

/***/ }),
/* 91 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var LIBRARY = __w_pdfjs_require__(37);

var global = __w_pdfjs_require__(13);

var ctx = __w_pdfjs_require__(28);

var classof = __w_pdfjs_require__(72);

var $export = __w_pdfjs_require__(12);

var isObject = __w_pdfjs_require__(18);

var aFunction = __w_pdfjs_require__(29);

var anInstance = __w_pdfjs_require__(92);

var forOf = __w_pdfjs_require__(93);

var speciesConstructor = __w_pdfjs_require__(94);

var task = __w_pdfjs_require__(95).set;

var microtask = __w_pdfjs_require__(97)();

var newPromiseCapabilityModule = __w_pdfjs_require__(98);

var perform = __w_pdfjs_require__(99);

var userAgent = __w_pdfjs_require__(100);

var promiseResolve = __w_pdfjs_require__(101);

var PROMISE = 'Promise';
var TypeError = global.TypeError;
var process = global.process;
var versions = process && process.versions;
var v8 = versions && versions.v8 || '';
var $Promise = global[PROMISE];
var isNode = classof(process) == 'process';

var empty = function empty() {};

var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;
var USE_NATIVE = !!function () {
  try {
    var promise = $Promise.resolve(1);

    var FakePromise = (promise.constructor = {})[__w_pdfjs_require__(35)('species')] = function (exec) {
      exec(empty, empty);
    };

    return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise && v8.indexOf('6.6') !== 0 && userAgent.indexOf('Chrome/66') === -1;
  } catch (e) {}
}();

var isThenable = function isThenable(it) {
  var then;
  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
};

var notify = function notify(promise, isReject) {
  if (promise._n) return;
  promise._n = true;
  var chain = promise._c;
  microtask(function () {
    var value = promise._v;
    var ok = promise._s == 1;
    var i = 0;

    var run = function run(reaction) {
      var handler = ok ? reaction.ok : reaction.fail;
      var resolve = reaction.resolve;
      var reject = reaction.reject;
      var domain = reaction.domain;
      var result, then, exited;

      try {
        if (handler) {
          if (!ok) {
            if (promise._h == 2) onHandleUnhandled(promise);
            promise._h = 1;
          }

          if (handler === true) result = value;else {
            if (domain) domain.enter();
            result = handler(value);

            if (domain) {
              domain.exit();
              exited = true;
            }
          }

          if (result === reaction.promise) {
            reject(TypeError('Promise-chain cycle'));
          } else if (then = isThenable(result)) {
            then.call(result, resolve, reject);
          } else resolve(result);
        } else reject(value);
      } catch (e) {
        if (domain && !exited) domain.exit();
        reject(e);
      }
    };

    while (chain.length > i) {
      run(chain[i++]);
    }

    promise._c = [];
    promise._n = false;
    if (isReject && !promise._h) onUnhandled(promise);
  });
};

var onUnhandled = function onUnhandled(promise) {
  task.call(global, function () {
    var value = promise._v;
    var unhandled = isUnhandled(promise);
    var result, handler, console;

    if (unhandled) {
      result = perform(function () {
        if (isNode) {
          process.emit('unhandledRejection', value, promise);
        } else if (handler = global.onunhandledrejection) {
          handler({
            promise: promise,
            reason: value
          });
        } else if ((console = global.console) && console.error) {
          console.error('Unhandled promise rejection', value);
        }
      });
      promise._h = isNode || isUnhandled(promise) ? 2 : 1;
    }

    promise._a = undefined;
    if (unhandled && result.e) throw result.v;
  });
};

var isUnhandled = function isUnhandled(promise) {
  return promise._h !== 1 && (promise._a || promise._c).length === 0;
};

var onHandleUnhandled = function onHandleUnhandled(promise) {
  task.call(global, function () {
    var handler;

    if (isNode) {
      process.emit('rejectionHandled', promise);
    } else if (handler = global.onrejectionhandled) {
      handler({
        promise: promise,
        reason: promise._v
      });
    }
  });
};

var $reject = function $reject(value) {
  var promise = this;
  if (promise._d) return;
  promise._d = true;
  promise = promise._w || promise;
  promise._v = value;
  promise._s = 2;
  if (!promise._a) promise._a = promise._c.slice();
  notify(promise, true);
};

var $resolve = function $resolve(value) {
  var promise = this;
  var then;
  if (promise._d) return;
  promise._d = true;
  promise = promise._w || promise;

  try {
    if (promise === value) throw TypeError("Promise can't be resolved itself");

    if (then = isThenable(value)) {
      microtask(function () {
        var wrapper = {
          _w: promise,
          _d: false
        };

        try {
          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));
        } catch (e) {
          $reject.call(wrapper, e);
        }
      });
    } else {
      promise._v = value;
      promise._s = 1;
      notify(promise, false);
    }
  } catch (e) {
    $reject.call({
      _w: promise,
      _d: false
    }, e);
  }
};

if (!USE_NATIVE) {
  $Promise = function Promise(executor) {
    anInstance(this, $Promise, PROMISE, '_h');
    aFunction(executor);
    Internal.call(this);

    try {
      executor(ctx($resolve, this, 1), ctx($reject, this, 1));
    } catch (err) {
      $reject.call(this, err);
    }
  };

  Internal = function Promise(executor) {
    this._c = [];
    this._a = undefined;
    this._s = 0;
    this._d = false;
    this._v = undefined;
    this._h = 0;
    this._n = false;
  };

  Internal.prototype = __w_pdfjs_require__(102)($Promise.prototype, {
    then: function then(onFulfilled, onRejected) {
      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
      reaction.fail = typeof onRejected == 'function' && onRejected;
      reaction.domain = isNode ? process.domain : undefined;

      this._c.push(reaction);

      if (this._a) this._a.push(reaction);
      if (this._s) notify(this, false);
      return reaction.promise;
    },
    'catch': function _catch(onRejected) {
      return this.then(undefined, onRejected);
    }
  });

  OwnPromiseCapability = function OwnPromiseCapability() {
    var promise = new Internal();
    this.promise = promise;
    this.resolve = ctx($resolve, promise, 1);
    this.reject = ctx($reject, promise, 1);
  };

  newPromiseCapabilityModule.f = newPromiseCapability = function newPromiseCapability(C) {
    return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C);
  };
}

$export($export.G + $export.W + $export.F * !USE_NATIVE, {
  Promise: $Promise
});

__w_pdfjs_require__(64)($Promise, PROMISE);

__w_pdfjs_require__(103)(PROMISE);

Wrapper = __w_pdfjs_require__(14)[PROMISE];
$export($export.S + $export.F * !USE_NATIVE, PROMISE, {
  reject: function reject(r) {
    var capability = newPromiseCapability(this);
    var $$reject = capability.reject;
    $$reject(r);
    return capability.promise;
  }
});
$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {
  resolve: function resolve(x) {
    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);
  }
});
$export($export.S + $export.F * !(USE_NATIVE && __w_pdfjs_require__(73)(function (iter) {
  $Promise.all(iter)['catch'](empty);
})), PROMISE, {
  all: function all(iterable) {
    var C = this;
    var capability = newPromiseCapability(C);
    var resolve = capability.resolve;
    var reject = capability.reject;
    var result = perform(function () {
      var values = [];
      var index = 0;
      var remaining = 1;
      forOf(iterable, false, function (promise) {
        var $index = index++;
        var alreadyCalled = false;
        values.push(undefined);
        remaining++;
        C.resolve(promise).then(function (value) {
          if (alreadyCalled) return;
          alreadyCalled = true;
          values[$index] = value;
          --remaining || resolve(values);
        }, reject);
      });
      --remaining || resolve(values);
    });
    if (result.e) reject(result.v);
    return capability.promise;
  },
  race: function race(iterable) {
    var C = this;
    var capability = newPromiseCapability(C);
    var reject = capability.reject;
    var result = perform(function () {
      forOf(iterable, false, function (promise) {
        C.resolve(promise).then(capability.resolve, reject);
      });
    });
    if (result.e) reject(result.v);
    return capability.promise;
  }
});

/***/ }),
/* 92 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (it, Constructor, name, forbiddenField) {
  if (!(it instanceof Constructor) || forbiddenField !== undefined && forbiddenField in it) {
    throw TypeError(name + ': incorrect invocation!');
  }

  return it;
};

/***/ }),
/* 93 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var ctx = __w_pdfjs_require__(28);

var call = __w_pdfjs_require__(68);

var isArrayIter = __w_pdfjs_require__(69);

var anObject = __w_pdfjs_require__(17);

var toLength = __w_pdfjs_require__(30);

var getIterFn = __w_pdfjs_require__(71);

var BREAK = {};
var RETURN = {};

var _exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
  var iterFn = ITERATOR ? function () {
    return iterable;
  } : getIterFn(iterable);
  var f = ctx(fn, that, entries ? 2 : 1);
  var index = 0;
  var length, step, iterator, result;
  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {
    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
    if (result === BREAK || result === RETURN) return result;
  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
    result = call(iterator, f, step.value, entries);
    if (result === BREAK || result === RETURN) return result;
  }
};

_exports.BREAK = BREAK;
_exports.RETURN = RETURN;

/***/ }),
/* 94 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var anObject = __w_pdfjs_require__(17);

var aFunction = __w_pdfjs_require__(29);

var SPECIES = __w_pdfjs_require__(35)('species');

module.exports = function (O, D) {
  var C = anObject(O).constructor;
  var S;
  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);
};

/***/ }),
/* 95 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var ctx = __w_pdfjs_require__(28);

var invoke = __w_pdfjs_require__(96);

var html = __w_pdfjs_require__(63);

var cel = __w_pdfjs_require__(22);

var global = __w_pdfjs_require__(13);

var process = global.process;
var setTask = global.setImmediate;
var clearTask = global.clearImmediate;
var MessageChannel = global.MessageChannel;
var Dispatch = global.Dispatch;
var counter = 0;
var queue = {};
var ONREADYSTATECHANGE = 'onreadystatechange';
var defer, channel, port;

var run = function run() {
  var id = +this;

  if (queue.hasOwnProperty(id)) {
    var fn = queue[id];
    delete queue[id];
    fn();
  }
};

var listener = function listener(event) {
  run.call(event.data);
};

if (!setTask || !clearTask) {
  setTask = function setImmediate(fn) {
    var args = [];
    var i = 1;

    while (arguments.length > i) {
      args.push(arguments[i++]);
    }

    queue[++counter] = function () {
      invoke(typeof fn == 'function' ? fn : Function(fn), args);
    };

    defer(counter);
    return counter;
  };

  clearTask = function clearImmediate(id) {
    delete queue[id];
  };

  if (__w_pdfjs_require__(34)(process) == 'process') {
    defer = function defer(id) {
      process.nextTick(ctx(run, id, 1));
    };
  } else if (Dispatch && Dispatch.now) {
    defer = function defer(id) {
      Dispatch.now(ctx(run, id, 1));
    };
  } else if (MessageChannel) {
    channel = new MessageChannel();
    port = channel.port2;
    channel.port1.onmessage = listener;
    defer = ctx(port.postMessage, port, 1);
  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {
    defer = function defer(id) {
      global.postMessage(id + '', '*');
    };

    global.addEventListener('message', listener, false);
  } else if (ONREADYSTATECHANGE in cel('script')) {
    defer = function defer(id) {
      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {
        html.removeChild(this);
        run.call(id);
      };
    };
  } else {
    defer = function defer(id) {
      setTimeout(ctx(run, id, 1), 0);
    };
  }
}

module.exports = {
  set: setTask,
  clear: clearTask
};

/***/ }),
/* 96 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (fn, args, that) {
  var un = that === undefined;

  switch (args.length) {
    case 0:
      return un ? fn() : fn.call(that);

    case 1:
      return un ? fn(args[0]) : fn.call(that, args[0]);

    case 2:
      return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]);

    case 3:
      return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]);

    case 4:
      return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]);
  }

  return fn.apply(that, args);
};

/***/ }),
/* 97 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(13);

var macrotask = __w_pdfjs_require__(95).set;

var Observer = global.MutationObserver || global.WebKitMutationObserver;
var process = global.process;
var Promise = global.Promise;
var isNode = __w_pdfjs_require__(34)(process) == 'process';

module.exports = function () {
  var head, last, notify;

  var flush = function flush() {
    var parent, fn;
    if (isNode && (parent = process.domain)) parent.exit();

    while (head) {
      fn = head.fn;
      head = head.next;

      try {
        fn();
      } catch (e) {
        if (head) notify();else last = undefined;
        throw e;
      }
    }

    last = undefined;
    if (parent) parent.enter();
  };

  if (isNode) {
    notify = function notify() {
      process.nextTick(flush);
    };
  } else if (Observer && !(global.navigator && global.navigator.standalone)) {
    var toggle = true;
    var node = document.createTextNode('');
    new Observer(flush).observe(node, {
      characterData: true
    });

    notify = function notify() {
      node.data = toggle = !toggle;
    };
  } else if (Promise && Promise.resolve) {
    var promise = Promise.resolve(undefined);

    notify = function notify() {
      promise.then(flush);
    };
  } else {
    notify = function notify() {
      macrotask.call(global, flush);
    };
  }

  return function (fn) {
    var task = {
      fn: fn,
      next: undefined
    };
    if (last) last.next = task;

    if (!head) {
      head = task;
      notify();
    }

    last = task;
  };
};

/***/ }),
/* 98 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var aFunction = __w_pdfjs_require__(29);

function PromiseCapability(C) {
  var resolve, reject;
  this.promise = new C(function ($$resolve, $$reject) {
    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
    resolve = $$resolve;
    reject = $$reject;
  });
  this.resolve = aFunction(resolve);
  this.reject = aFunction(reject);
}

module.exports.f = function (C) {
  return new PromiseCapability(C);
};

/***/ }),
/* 99 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


module.exports = function (exec) {
  try {
    return {
      e: false,
      v: exec()
    };
  } catch (e) {
    return {
      e: true,
      v: e
    };
  }
};

/***/ }),
/* 100 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(13);

var navigator = global.navigator;
module.exports = navigator && navigator.userAgent || '';

/***/ }),
/* 101 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var anObject = __w_pdfjs_require__(17);

var isObject = __w_pdfjs_require__(18);

var newPromiseCapability = __w_pdfjs_require__(98);

module.exports = function (C, x) {
  anObject(C);
  if (isObject(x) && x.constructor === C) return x;
  var promiseCapability = newPromiseCapability.f(C);
  var resolve = promiseCapability.resolve;
  resolve(x);
  return promiseCapability.promise;
};

/***/ }),
/* 102 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var redefine = __w_pdfjs_require__(25);

module.exports = function (target, src, safe) {
  for (var key in src) {
    redefine(target, key, src[key], safe);
  }

  return target;
};

/***/ }),
/* 103 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(13);

var dP = __w_pdfjs_require__(16);

var DESCRIPTORS = __w_pdfjs_require__(20);

var SPECIES = __w_pdfjs_require__(35)('species');

module.exports = function (KEY) {
  var C = global[KEY];
  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {
    configurable: true,
    get: function get() {
      return this;
    }
  });
};

/***/ }),
/* 104 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

var core = __w_pdfjs_require__(14);

var global = __w_pdfjs_require__(13);

var speciesConstructor = __w_pdfjs_require__(94);

var promiseResolve = __w_pdfjs_require__(101);

$export($export.P + $export.R, 'Promise', {
  'finally': function _finally(onFinally) {
    var C = speciesConstructor(this, core.Promise || global.Promise);
    var isFunction = typeof onFinally == 'function';
    return this.then(isFunction ? function (x) {
      return promiseResolve(C, onFinally()).then(function () {
        return x;
      });
    } : onFinally, isFunction ? function (e) {
      return promiseResolve(C, onFinally()).then(function () {
        throw e;
      });
    } : onFinally);
  }
});

/***/ }),
/* 105 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

var newPromiseCapability = __w_pdfjs_require__(98);

var perform = __w_pdfjs_require__(99);

$export($export.S, 'Promise', {
  'try': function _try(callbackfn) {
    var promiseCapability = newPromiseCapability.f(this);
    var result = perform(callbackfn);
    (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);
    return promiseCapability.promise;
  }
});

/***/ }),
/* 106 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(87);

__w_pdfjs_require__(88);

__w_pdfjs_require__(107);

__w_pdfjs_require__(119);

__w_pdfjs_require__(121);

module.exports = __w_pdfjs_require__(14).WeakMap;

/***/ }),
/* 107 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var each = __w_pdfjs_require__(108)(0);

var redefine = __w_pdfjs_require__(25);

var meta = __w_pdfjs_require__(112);

var assign = __w_pdfjs_require__(76);

var weak = __w_pdfjs_require__(113);

var isObject = __w_pdfjs_require__(18);

var fails = __w_pdfjs_require__(21);

var validate = __w_pdfjs_require__(114);

var WEAK_MAP = 'WeakMap';
var getWeak = meta.getWeak;
var isExtensible = Object.isExtensible;
var uncaughtFrozenStore = weak.ufstore;
var tmp = {};
var InternalMap;

var wrapper = function wrapper(get) {
  return function WeakMap() {
    return get(this, arguments.length > 0 ? arguments[0] : undefined);
  };
};

var methods = {
  get: function get(key) {
    if (isObject(key)) {
      var data = getWeak(key);
      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);
      return data ? data[this._i] : undefined;
    }
  },
  set: function set(key, value) {
    return weak.def(validate(this, WEAK_MAP), key, value);
  }
};

var $WeakMap = module.exports = __w_pdfjs_require__(115)(WEAK_MAP, wrapper, methods, weak, true, true);

if (fails(function () {
  return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7;
})) {
  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);
  assign(InternalMap.prototype, methods);
  meta.NEED = true;
  each(['delete', 'has', 'get', 'set'], function (key) {
    var proto = $WeakMap.prototype;
    var method = proto[key];
    redefine(proto, key, function (a, b) {
      if (isObject(a) && !isExtensible(a)) {
        if (!this._f) this._f = new InternalMap();

        var result = this._f[key](a, b);

        return key == 'set' ? this : result;
      }

      return method.call(this, a, b);
    });
  });
}

/***/ }),
/* 108 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var ctx = __w_pdfjs_require__(28);

var IObject = __w_pdfjs_require__(48);

var toObject = __w_pdfjs_require__(66);

var toLength = __w_pdfjs_require__(30);

var asc = __w_pdfjs_require__(109);

module.exports = function (TYPE, $create) {
  var IS_MAP = TYPE == 1;
  var IS_FILTER = TYPE == 2;
  var IS_SOME = TYPE == 3;
  var IS_EVERY = TYPE == 4;
  var IS_FIND_INDEX = TYPE == 6;
  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
  var create = $create || asc;
  return function ($this, callbackfn, that) {
    var O = toObject($this);
    var self = IObject(O);
    var f = ctx(callbackfn, that, 3);
    var length = toLength(self.length);
    var index = 0;
    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
    var val, res;

    for (; length > index; index++) {
      if (NO_HOLES || index in self) {
        val = self[index];
        res = f(val, index, O);

        if (TYPE) {
          if (IS_MAP) result[index] = res;else if (res) switch (TYPE) {
            case 3:
              return true;

            case 5:
              return val;

            case 6:
              return index;

            case 2:
              result.push(val);
          } else if (IS_EVERY) return false;
        }
      }
    }

    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
  };
};

/***/ }),
/* 109 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var speciesConstructor = __w_pdfjs_require__(110);

module.exports = function (original, length) {
  return new (speciesConstructor(original))(length);
};

/***/ }),
/* 110 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(18);

var isArray = __w_pdfjs_require__(111);

var SPECIES = __w_pdfjs_require__(35)('species');

module.exports = function (original) {
  var C;

  if (isArray(original)) {
    C = original.constructor;
    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;

    if (isObject(C)) {
      C = C[SPECIES];
      if (C === null) C = undefined;
    }
  }

  return C === undefined ? Array : C;
};

/***/ }),
/* 111 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var cof = __w_pdfjs_require__(34);

module.exports = Array.isArray || function isArray(arg) {
  return cof(arg) == 'Array';
};

/***/ }),
/* 112 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var META = __w_pdfjs_require__(27)('meta');

var isObject = __w_pdfjs_require__(18);

var has = __w_pdfjs_require__(26);

var setDesc = __w_pdfjs_require__(16).f;

var id = 0;

var isExtensible = Object.isExtensible || function () {
  return true;
};

var FREEZE = !__w_pdfjs_require__(21)(function () {
  return isExtensible(Object.preventExtensions({}));
});

var setMeta = function setMeta(it) {
  setDesc(it, META, {
    value: {
      i: 'O' + ++id,
      w: {}
    }
  });
};

var fastKey = function fastKey(it, create) {
  if (!isObject(it)) return _typeof(it) == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;

  if (!has(it, META)) {
    if (!isExtensible(it)) return 'F';
    if (!create) return 'E';
    setMeta(it);
  }

  return it[META].i;
};

var getWeak = function getWeak(it, create) {
  if (!has(it, META)) {
    if (!isExtensible(it)) return true;
    if (!create) return false;
    setMeta(it);
  }

  return it[META].w;
};

var onFreeze = function onFreeze(it) {
  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
  return it;
};

var meta = module.exports = {
  KEY: META,
  NEED: false,
  fastKey: fastKey,
  getWeak: getWeak,
  onFreeze: onFreeze
};

/***/ }),
/* 113 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var redefineAll = __w_pdfjs_require__(102);

var getWeak = __w_pdfjs_require__(112).getWeak;

var anObject = __w_pdfjs_require__(17);

var isObject = __w_pdfjs_require__(18);

var anInstance = __w_pdfjs_require__(92);

var forOf = __w_pdfjs_require__(93);

var createArrayMethod = __w_pdfjs_require__(108);

var $has = __w_pdfjs_require__(26);

var validate = __w_pdfjs_require__(114);

var arrayFind = createArrayMethod(5);
var arrayFindIndex = createArrayMethod(6);
var id = 0;

var uncaughtFrozenStore = function uncaughtFrozenStore(that) {
  return that._l || (that._l = new UncaughtFrozenStore());
};

var UncaughtFrozenStore = function UncaughtFrozenStore() {
  this.a = [];
};

var findUncaughtFrozen = function findUncaughtFrozen(store, key) {
  return arrayFind(store.a, function (it) {
    return it[0] === key;
  });
};

UncaughtFrozenStore.prototype = {
  get: function get(key) {
    var entry = findUncaughtFrozen(this, key);
    if (entry) return entry[1];
  },
  has: function has(key) {
    return !!findUncaughtFrozen(this, key);
  },
  set: function set(key, value) {
    var entry = findUncaughtFrozen(this, key);
    if (entry) entry[1] = value;else this.a.push([key, value]);
  },
  'delete': function _delete(key) {
    var index = arrayFindIndex(this.a, function (it) {
      return it[0] === key;
    });
    if (~index) this.a.splice(index, 1);
    return !!~index;
  }
};
module.exports = {
  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {
    var C = wrapper(function (that, iterable) {
      anInstance(that, C, NAME, '_i');
      that._t = NAME;
      that._i = id++;
      that._l = undefined;
      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
    });
    redefineAll(C.prototype, {
      'delete': function _delete(key) {
        if (!isObject(key)) return false;
        var data = getWeak(key);
        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);
        return data && $has(data, this._i) && delete data[this._i];
      },
      has: function has(key) {
        if (!isObject(key)) return false;
        var data = getWeak(key);
        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);
        return data && $has(data, this._i);
      }
    });
    return C;
  },
  def: function def(that, key, value) {
    var data = getWeak(anObject(key), true);
    if (data === true) uncaughtFrozenStore(that).set(key, value);else data[that._i] = value;
    return that;
  },
  ufstore: uncaughtFrozenStore
};

/***/ }),
/* 114 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(18);

module.exports = function (it, TYPE) {
  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
  return it;
};

/***/ }),
/* 115 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(13);

var $export = __w_pdfjs_require__(12);

var redefine = __w_pdfjs_require__(25);

var redefineAll = __w_pdfjs_require__(102);

var meta = __w_pdfjs_require__(112);

var forOf = __w_pdfjs_require__(93);

var anInstance = __w_pdfjs_require__(92);

var isObject = __w_pdfjs_require__(18);

var fails = __w_pdfjs_require__(21);

var $iterDetect = __w_pdfjs_require__(73);

var setToStringTag = __w_pdfjs_require__(64);

var inheritIfRequired = __w_pdfjs_require__(116);

module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
  var Base = global[NAME];
  var C = Base;
  var ADDER = IS_MAP ? 'set' : 'add';
  var proto = C && C.prototype;
  var O = {};

  var fixMethod = function fixMethod(KEY) {
    var fn = proto[KEY];
    redefine(proto, KEY, KEY == 'delete' ? function (a) {
      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
    } : KEY == 'has' ? function has(a) {
      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
    } : KEY == 'get' ? function get(a) {
      return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);
    } : KEY == 'add' ? function add(a) {
      fn.call(this, a === 0 ? 0 : a);
      return this;
    } : function set(a, b) {
      fn.call(this, a === 0 ? 0 : a, b);
      return this;
    });
  };

  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {
    new C().entries().next();
  }))) {
    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
    redefineAll(C.prototype, methods);
    meta.NEED = true;
  } else {
    var instance = new C();
    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
    var THROWS_ON_PRIMITIVES = fails(function () {
      instance.has(1);
    });
    var ACCEPT_ITERABLES = $iterDetect(function (iter) {
      new C(iter);
    });
    var BUGGY_ZERO = !IS_WEAK && fails(function () {
      var $instance = new C();
      var index = 5;

      while (index--) {
        $instance[ADDER](index, index);
      }

      return !$instance.has(-0);
    });

    if (!ACCEPT_ITERABLES) {
      C = wrapper(function (target, iterable) {
        anInstance(target, C, NAME);
        var that = inheritIfRequired(new Base(), target, C);
        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
        return that;
      });
      C.prototype = proto;
      proto.constructor = C;
    }

    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
      fixMethod('delete');
      fixMethod('has');
      IS_MAP && fixMethod('get');
    }

    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
    if (IS_WEAK && proto.clear) delete proto.clear;
  }

  setToStringTag(C, NAME);
  O[NAME] = C;
  $export($export.G + $export.W + $export.F * (C != Base), O);
  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
  return C;
};

/***/ }),
/* 116 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(18);

var setPrototypeOf = __w_pdfjs_require__(117).set;

module.exports = function (that, target, C) {
  var S = target.constructor;
  var P;

  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {
    setPrototypeOf(that, P);
  }

  return that;
};

/***/ }),
/* 117 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var isObject = __w_pdfjs_require__(18);

var anObject = __w_pdfjs_require__(17);

var check = function check(O, proto) {
  anObject(O);
  if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
};

module.exports = {
  set: Object.setPrototypeOf || ('__proto__' in {} ? function (test, buggy, set) {
    try {
      set = __w_pdfjs_require__(28)(Function.call, __w_pdfjs_require__(118).f(Object.prototype, '__proto__').set, 2);
      set(test, []);
      buggy = !(test instanceof Array);
    } catch (e) {
      buggy = true;
    }

    return function setPrototypeOf(O, proto) {
      check(O, proto);
      if (buggy) O.__proto__ = proto;else set(O, proto);
      return O;
    };
  }({}, false) : undefined),
  check: check
};

/***/ }),
/* 118 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var pIE = __w_pdfjs_require__(78);

var createDesc = __w_pdfjs_require__(24);

var toIObject = __w_pdfjs_require__(47);

var toPrimitive = __w_pdfjs_require__(23);

var has = __w_pdfjs_require__(26);

var IE8_DOM_DEFINE = __w_pdfjs_require__(19);

var gOPD = Object.getOwnPropertyDescriptor;
exports.f = __w_pdfjs_require__(20) ? gOPD : function getOwnPropertyDescriptor(O, P) {
  O = toIObject(O);
  P = toPrimitive(P, true);
  if (IE8_DOM_DEFINE) try {
    return gOPD(O, P);
  } catch (e) {}
  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
};

/***/ }),
/* 119 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(120)('WeakMap');

/***/ }),
/* 120 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

module.exports = function (COLLECTION) {
  $export($export.S, COLLECTION, {
    of: function of() {
      var length = arguments.length;
      var A = new Array(length);

      while (length--) {
        A[length] = arguments[length];
      }

      return new this(A);
    }
  });
};

/***/ }),
/* 121 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(122)('WeakMap');

/***/ }),
/* 122 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

var aFunction = __w_pdfjs_require__(29);

var ctx = __w_pdfjs_require__(28);

var forOf = __w_pdfjs_require__(93);

module.exports = function (COLLECTION) {
  $export($export.S, COLLECTION, {
    from: function from(source) {
      var mapFn = arguments[1];
      var mapping, A, n, cb;
      aFunction(this);
      mapping = mapFn !== undefined;
      if (mapping) aFunction(mapFn);
      if (source == undefined) return new this();
      A = [];

      if (mapping) {
        n = 0;
        cb = ctx(mapFn, arguments[2], 2);
        forOf(source, false, function (nextItem) {
          A.push(cb(nextItem, n++));
        });
      } else {
        forOf(source, false, A.push, A);
      }

      return new this(A);
    }
  });
};

/***/ }),
/* 123 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(87);

__w_pdfjs_require__(88);

__w_pdfjs_require__(124);

__w_pdfjs_require__(125);

__w_pdfjs_require__(126);

module.exports = __w_pdfjs_require__(14).WeakSet;

/***/ }),
/* 124 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var weak = __w_pdfjs_require__(113);

var validate = __w_pdfjs_require__(114);

var WEAK_SET = 'WeakSet';

__w_pdfjs_require__(115)(WEAK_SET, function (get) {
  return function WeakSet() {
    return get(this, arguments.length > 0 ? arguments[0] : undefined);
  };
}, {
  add: function add(value) {
    return weak.def(validate(this, WEAK_SET), value, true);
  }
}, weak, false, true);

/***/ }),
/* 125 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(120)('WeakSet');

/***/ }),
/* 126 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(122)('WeakSet');

/***/ }),
/* 127 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(128);

module.exports = __w_pdfjs_require__(14).String.codePointAt;

/***/ }),
/* 128 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

var $at = __w_pdfjs_require__(53)(false);

$export($export.P, 'String', {
  codePointAt: function codePointAt(pos) {
    return $at(this, pos);
  }
});

/***/ }),
/* 129 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(130);

module.exports = __w_pdfjs_require__(14).String.fromCodePoint;

/***/ }),
/* 130 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

var toAbsoluteIndex = __w_pdfjs_require__(49);

var fromCharCode = String.fromCharCode;
var $fromCodePoint = String.fromCodePoint;
$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
  fromCodePoint: function fromCodePoint(x) {
    var res = [];
    var aLen = arguments.length;
    var i = 0;
    var code;

    while (aLen > i) {
      code = +arguments[i++];
      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');
      res.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00));
    }

    return res.join('');
  }
});

/***/ }),
/* 131 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(132);

__w_pdfjs_require__(87);

module.exports = __w_pdfjs_require__(14).Symbol;

/***/ }),
/* 132 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var global = __w_pdfjs_require__(13);

var has = __w_pdfjs_require__(26);

var DESCRIPTORS = __w_pdfjs_require__(20);

var $export = __w_pdfjs_require__(12);

var redefine = __w_pdfjs_require__(25);

var META = __w_pdfjs_require__(112).KEY;

var $fails = __w_pdfjs_require__(21);

var shared = __w_pdfjs_require__(36);

var setToStringTag = __w_pdfjs_require__(64);

var uid = __w_pdfjs_require__(27);

var wks = __w_pdfjs_require__(35);

var wksExt = __w_pdfjs_require__(133);

var wksDefine = __w_pdfjs_require__(134);

var enumKeys = __w_pdfjs_require__(135);

var isArray = __w_pdfjs_require__(111);

var anObject = __w_pdfjs_require__(17);

var isObject = __w_pdfjs_require__(18);

var toIObject = __w_pdfjs_require__(47);

var toPrimitive = __w_pdfjs_require__(23);

var createDesc = __w_pdfjs_require__(24);

var _create = __w_pdfjs_require__(57);

var gOPNExt = __w_pdfjs_require__(136);

var $GOPD = __w_pdfjs_require__(118);

var $DP = __w_pdfjs_require__(16);

var $keys = __w_pdfjs_require__(59);

var gOPD = $GOPD.f;
var dP = $DP.f;
var gOPN = gOPNExt.f;
var $Symbol = global.Symbol;
var $JSON = global.JSON;

var _stringify = $JSON && $JSON.stringify;

var PROTOTYPE = 'prototype';
var HIDDEN = wks('_hidden');
var TO_PRIMITIVE = wks('toPrimitive');
var isEnum = {}.propertyIsEnumerable;
var SymbolRegistry = shared('symbol-registry');
var AllSymbols = shared('symbols');
var OPSymbols = shared('op-symbols');
var ObjectProto = Object[PROTOTYPE];
var USE_NATIVE = typeof $Symbol == 'function';
var QObject = global.QObject;
var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
var setSymbolDesc = DESCRIPTORS && $fails(function () {
  return _create(dP({}, 'a', {
    get: function get() {
      return dP(this, 'a', {
        value: 7
      }).a;
    }
  })).a != 7;
}) ? function (it, key, D) {
  var protoDesc = gOPD(ObjectProto, key);
  if (protoDesc) delete ObjectProto[key];
  dP(it, key, D);
  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
} : dP;

var wrap = function wrap(tag) {
  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);

  sym._k = tag;
  return sym;
};

var isSymbol = USE_NATIVE && _typeof($Symbol.iterator) == 'symbol' ? function (it) {
  return _typeof(it) == 'symbol';
} : function (it) {
  return it instanceof $Symbol;
};

var $defineProperty = function defineProperty(it, key, D) {
  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
  anObject(it);
  key = toPrimitive(key, true);
  anObject(D);

  if (has(AllSymbols, key)) {
    if (!D.enumerable) {
      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
      it[HIDDEN][key] = true;
    } else {
      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
      D = _create(D, {
        enumerable: createDesc(0, false)
      });
    }

    return setSymbolDesc(it, key, D);
  }

  return dP(it, key, D);
};

var $defineProperties = function defineProperties(it, P) {
  anObject(it);
  var keys = enumKeys(P = toIObject(P));
  var i = 0;
  var l = keys.length;
  var key;

  while (l > i) {
    $defineProperty(it, key = keys[i++], P[key]);
  }

  return it;
};

var $create = function create(it, P) {
  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
};

var $propertyIsEnumerable = function propertyIsEnumerable(key) {
  var E = isEnum.call(this, key = toPrimitive(key, true));
  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
};

var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
  it = toIObject(it);
  key = toPrimitive(key, true);
  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
  var D = gOPD(it, key);
  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
  return D;
};

var $getOwnPropertyNames = function getOwnPropertyNames(it) {
  var names = gOPN(toIObject(it));
  var result = [];
  var i = 0;
  var key;

  while (names.length > i) {
    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
  }

  return result;
};

var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
  var IS_OP = it === ObjectProto;
  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
  var result = [];
  var i = 0;
  var key;

  while (names.length > i) {
    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
  }

  return result;
};

if (!USE_NATIVE) {
  $Symbol = function _Symbol() {
    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);

    var $set = function $set(value) {
      if (this === ObjectProto) $set.call(OPSymbols, value);
      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
      setSymbolDesc(this, tag, createDesc(1, value));
    };

    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, {
      configurable: true,
      set: $set
    });
    return wrap(tag);
  };

  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
    return this._k;
  });
  $GOPD.f = $getOwnPropertyDescriptor;
  $DP.f = $defineProperty;
  __w_pdfjs_require__(137).f = gOPNExt.f = $getOwnPropertyNames;
  __w_pdfjs_require__(78).f = $propertyIsEnumerable;
  __w_pdfjs_require__(77).f = $getOwnPropertySymbols;

  if (DESCRIPTORS && !__w_pdfjs_require__(37)) {
    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
  }

  wksExt.f = function (name) {
    return wrap(wks(name));
  };
}

$export($export.G + $export.W + $export.F * !USE_NATIVE, {
  Symbol: $Symbol
});

for (var es6Symbols = 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','), j = 0; es6Symbols.length > j;) {
  wks(es6Symbols[j++]);
}

for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) {
  wksDefine(wellKnownSymbols[k++]);
}

$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
  'for': function _for(key) {
    return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key);
  },
  keyFor: function keyFor(sym) {
    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');

    for (var key in SymbolRegistry) {
      if (SymbolRegistry[key] === sym) return key;
    }
  },
  useSetter: function useSetter() {
    setter = true;
  },
  useSimple: function useSimple() {
    setter = false;
  }
});
$export($export.S + $export.F * !USE_NATIVE, 'Object', {
  create: $create,
  defineProperty: $defineProperty,
  defineProperties: $defineProperties,
  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
  getOwnPropertyNames: $getOwnPropertyNames,
  getOwnPropertySymbols: $getOwnPropertySymbols
});
$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
  var S = $Symbol();
  return _stringify([S]) != '[null]' || _stringify({
    a: S
  }) != '{}' || _stringify(Object(S)) != '{}';
})), 'JSON', {
  stringify: function stringify(it) {
    var args = [it];
    var i = 1;
    var replacer, $replacer;

    while (arguments.length > i) {
      args.push(arguments[i++]);
    }

    $replacer = replacer = args[1];
    if (!isObject(replacer) && it === undefined || isSymbol(it)) return;
    if (!isArray(replacer)) replacer = function replacer(key, value) {
      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
      if (!isSymbol(value)) return value;
    };
    args[1] = replacer;
    return _stringify.apply($JSON, args);
  }
});
$Symbol[PROTOTYPE][TO_PRIMITIVE] || __w_pdfjs_require__(15)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
setToStringTag($Symbol, 'Symbol');
setToStringTag(Math, 'Math', true);
setToStringTag(global.JSON, 'JSON', true);

/***/ }),
/* 133 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


exports.f = __w_pdfjs_require__(35);

/***/ }),
/* 134 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var global = __w_pdfjs_require__(13);

var core = __w_pdfjs_require__(14);

var LIBRARY = __w_pdfjs_require__(37);

var wksExt = __w_pdfjs_require__(133);

var defineProperty = __w_pdfjs_require__(16).f;

module.exports = function (name) {
  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, {
    value: wksExt.f(name)
  });
};

/***/ }),
/* 135 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var getKeys = __w_pdfjs_require__(59);

var gOPS = __w_pdfjs_require__(77);

var pIE = __w_pdfjs_require__(78);

module.exports = function (it) {
  var result = getKeys(it);
  var getSymbols = gOPS.f;

  if (getSymbols) {
    var symbols = getSymbols(it);
    var isEnum = pIE.f;
    var i = 0;
    var key;

    while (symbols.length > i) {
      if (isEnum.call(it, key = symbols[i++])) result.push(key);
    }
  }

  return result;
};

/***/ }),
/* 136 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var toIObject = __w_pdfjs_require__(47);

var gOPN = __w_pdfjs_require__(137).f;

var toString = {}.toString;
var windowNames = (typeof window === "undefined" ? "undefined" : _typeof(window)) == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];

var getWindowNames = function getWindowNames(it) {
  try {
    return gOPN(it);
  } catch (e) {
    return windowNames.slice();
  }
};

module.exports.f = function getOwnPropertyNames(it) {
  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
};

/***/ }),
/* 137 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $keys = __w_pdfjs_require__(60);

var hiddenKeys = __w_pdfjs_require__(62).concat('length', 'prototype');

exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
  return $keys(O, hiddenKeys);
};

/***/ }),
/* 138 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(139);

module.exports = __w_pdfjs_require__(14).String.padStart;

/***/ }),
/* 139 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

var $pad = __w_pdfjs_require__(140);

var userAgent = __w_pdfjs_require__(100);

$export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', {
  padStart: function padStart(maxLength) {
    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);
  }
});

/***/ }),
/* 140 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toLength = __w_pdfjs_require__(30);

var repeat = __w_pdfjs_require__(141);

var defined = __w_pdfjs_require__(38);

module.exports = function (that, maxLength, fillString, left) {
  var S = String(defined(that));
  var stringLength = S.length;
  var fillStr = fillString === undefined ? ' ' : String(fillString);
  var intMaxLength = toLength(maxLength);
  if (intMaxLength <= stringLength || fillStr == '') return S;
  var fillLen = intMaxLength - stringLength;
  var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));
  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);
  return left ? stringFiller + S : S + stringFiller;
};

/***/ }),
/* 141 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var toInteger = __w_pdfjs_require__(31);

var defined = __w_pdfjs_require__(38);

module.exports = function repeat(count) {
  var str = String(defined(this));
  var res = '';
  var n = toInteger(count);
  if (n < 0 || n == Infinity) throw RangeError("Count can't be negative");

  for (; n > 0; (n >>>= 1) && (str += str)) {
    if (n & 1) res += str;
  }

  return res;
};

/***/ }),
/* 142 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(143);

module.exports = __w_pdfjs_require__(14).String.padEnd;

/***/ }),
/* 143 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

var $pad = __w_pdfjs_require__(140);

var userAgent = __w_pdfjs_require__(100);

$export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', {
  padEnd: function padEnd(maxLength) {
    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);
  }
});

/***/ }),
/* 144 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


__w_pdfjs_require__(145);

module.exports = __w_pdfjs_require__(14).Object.values;

/***/ }),
/* 145 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var $export = __w_pdfjs_require__(12);

var $values = __w_pdfjs_require__(146)(false);

$export($export.S, 'Object', {
  values: function values(it) {
    return $values(it);
  }
});

/***/ }),
/* 146 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


var getKeys = __w_pdfjs_require__(59);

var toIObject = __w_pdfjs_require__(47);

var isEnum = __w_pdfjs_require__(78).f;

module.exports = function (isEntries) {
  return function (it) {
    var O = toIObject(it);
    var keys = getKeys(O);
    var length = keys.length;
    var i = 0;
    var result = [];
    var key;

    while (length > i) {
      if (isEnum.call(O, key = keys[i++])) {
        result.push(isEntries ? [key, O[key]] : O[key]);
      }
    }

    return result;
  };
};

/***/ }),
/* 147 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


{
  var isReadableStreamSupported = false;

  if (typeof ReadableStream !== 'undefined') {
    try {
      new ReadableStream({
        start: function start(controller) {
          controller.close();
        }
      });
      isReadableStreamSupported = true;
    } catch (e) {}
  }

  if (isReadableStreamSupported) {
    exports.ReadableStream = ReadableStream;
  } else {
    exports.ReadableStream = __w_pdfjs_require__(148).ReadableStream;
  }
}

/***/ }),
/* 148 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); }

(function (e, a) {
  for (var i in a) {
    e[i] = a[i];
  }
})(exports, function (modules) {
  var installedModules = {};

  function __w_pdfjs_require__(moduleId) {
    if (installedModules[moduleId]) return installedModules[moduleId].exports;
    var module = installedModules[moduleId] = {
      i: moduleId,
      l: false,
      exports: {}
    };
    modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);
    module.l = true;
    return module.exports;
  }

  __w_pdfjs_require__.m = modules;
  __w_pdfjs_require__.c = installedModules;

  __w_pdfjs_require__.i = function (value) {
    return value;
  };

  __w_pdfjs_require__.d = function (exports, name, getter) {
    if (!__w_pdfjs_require__.o(exports, name)) {
      Object.defineProperty(exports, name, {
        configurable: false,
        enumerable: true,
        get: getter
      });
    }
  };

  __w_pdfjs_require__.n = function (module) {
    var getter = module && module.__esModule ? function getDefault() {
      return module['default'];
    } : function getModuleExports() {
      return module;
    };

    __w_pdfjs_require__.d(getter, 'a', getter);

    return getter;
  };

  __w_pdfjs_require__.o = function (object, property) {
    return Object.prototype.hasOwnProperty.call(object, property);
  };

  __w_pdfjs_require__.p = "";
  return __w_pdfjs_require__(__w_pdfjs_require__.s = 7);
}([function (module, exports, __w_pdfjs_require__) {
  "use strict";

  var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
    return _typeof2(obj);
  } : function (obj) {
    return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj);
  };

  var _require = __w_pdfjs_require__(1),
      assert = _require.assert;

  function IsPropertyKey(argument) {
    return typeof argument === 'string' || (typeof argument === 'undefined' ? 'undefined' : _typeof(argument)) === 'symbol';
  }

  exports.typeIsObject = function (x) {
    return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x !== null || typeof x === 'function';
  };

  exports.createDataProperty = function (o, p, v) {
    assert(exports.typeIsObject(o));
    Object.defineProperty(o, p, {
      value: v,
      writable: true,
      enumerable: true,
      configurable: true
    });
  };

  exports.createArrayFromList = function (elements) {
    return elements.slice();
  };

  exports.ArrayBufferCopy = function (dest, destOffset, src, srcOffset, n) {
    new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);
  };

  exports.CreateIterResultObject = function (value, done) {
    assert(typeof done === 'boolean');
    var obj = {};
    Object.defineProperty(obj, 'value', {
      value: value,
      enumerable: true,
      writable: true,
      configurable: true
    });
    Object.defineProperty(obj, 'done', {
      value: done,
      enumerable: true,
      writable: true,
      configurable: true
    });
    return obj;
  };

  exports.IsFiniteNonNegativeNumber = function (v) {
    if (Number.isNaN(v)) {
      return false;
    }

    if (v === Infinity) {
      return false;
    }

    if (v < 0) {
      return false;
    }

    return true;
  };

  function Call(F, V, args) {
    if (typeof F !== 'function') {
      throw new TypeError('Argument is not a function');
    }

    return Function.prototype.apply.call(F, V, args);
  }

  exports.InvokeOrNoop = function (O, P, args) {
    assert(O !== undefined);
    assert(IsPropertyKey(P));
    assert(Array.isArray(args));
    var method = O[P];

    if (method === undefined) {
      return undefined;
    }

    return Call(method, O, args);
  };

  exports.PromiseInvokeOrNoop = function (O, P, args) {
    assert(O !== undefined);
    assert(IsPropertyKey(P));
    assert(Array.isArray(args));

    try {
      return Promise.resolve(exports.InvokeOrNoop(O, P, args));
    } catch (returnValueE) {
      return Promise.reject(returnValueE);
    }
  };

  exports.PromiseInvokeOrPerformFallback = function (O, P, args, F, argsF) {
    assert(O !== undefined);
    assert(IsPropertyKey(P));
    assert(Array.isArray(args));
    assert(Array.isArray(argsF));
    var method = void 0;

    try {
      method = O[P];
    } catch (methodE) {
      return Promise.reject(methodE);
    }

    if (method === undefined) {
      return F.apply(null, argsF);
    }

    try {
      return Promise.resolve(Call(method, O, args));
    } catch (e) {
      return Promise.reject(e);
    }
  };

  exports.TransferArrayBuffer = function (O) {
    return O.slice();
  };

  exports.ValidateAndNormalizeHighWaterMark = function (highWaterMark) {
    highWaterMark = Number(highWaterMark);

    if (Number.isNaN(highWaterMark) || highWaterMark < 0) {
      throw new RangeError('highWaterMark property of a queuing strategy must be non-negative and non-NaN');
    }

    return highWaterMark;
  };

  exports.ValidateAndNormalizeQueuingStrategy = function (size, highWaterMark) {
    if (size !== undefined && typeof size !== 'function') {
      throw new TypeError('size property of a queuing strategy must be a function');
    }

    highWaterMark = exports.ValidateAndNormalizeHighWaterMark(highWaterMark);
    return {
      size: size,
      highWaterMark: highWaterMark
    };
  };
}, function (module, exports, __w_pdfjs_require__) {
  "use strict";

  function rethrowAssertionErrorRejection(e) {
    if (e && e.constructor === AssertionError) {
      setTimeout(function () {
        throw e;
      }, 0);
    }
  }

  function AssertionError(message) {
    this.name = 'AssertionError';
    this.message = message || '';
    this.stack = new Error().stack;
  }

  AssertionError.prototype = Object.create(Error.prototype);
  AssertionError.prototype.constructor = AssertionError;

  function assert(value, message) {
    if (!value) {
      throw new AssertionError(message);
    }
  }

  module.exports = {
    rethrowAssertionErrorRejection: rethrowAssertionErrorRejection,
    AssertionError: AssertionError,
    assert: assert
  };
}, function (module, exports, __w_pdfjs_require__) {
  "use strict";

  var _createClass = function () {
    function defineProperties(target, props) {
      for (var i = 0; i < props.length; i++) {
        var descriptor = props[i];
        descriptor.enumerable = descriptor.enumerable || false;
        descriptor.configurable = true;
        if ("value" in descriptor) descriptor.writable = true;
        Object.defineProperty(target, descriptor.key, descriptor);
      }
    }

    return function (Constructor, protoProps, staticProps) {
      if (protoProps) defineProperties(Constructor.prototype, protoProps);
      if (staticProps) defineProperties(Constructor, staticProps);
      return Constructor;
    };
  }();

  function _classCallCheck(instance, Constructor) {
    if (!(instance instanceof Constructor)) {
      throw new TypeError("Cannot call a class as a function");
    }
  }

  var _require = __w_pdfjs_require__(0),
      InvokeOrNoop = _require.InvokeOrNoop,
      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,
      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,
      typeIsObject = _require.typeIsObject;

  var _require2 = __w_pdfjs_require__(1),
      assert = _require2.assert,
      rethrowAssertionErrorRejection = _require2.rethrowAssertionErrorRejection;

  var _require3 = __w_pdfjs_require__(3),
      DequeueValue = _require3.DequeueValue,
      EnqueueValueWithSize = _require3.EnqueueValueWithSize,
      PeekQueueValue = _require3.PeekQueueValue,
      ResetQueue = _require3.ResetQueue;

  var WritableStream = function () {
    function WritableStream() {
      var underlyingSink = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
          size = _ref.size,
          _ref$highWaterMark = _ref.highWaterMark,
          highWaterMark = _ref$highWaterMark === undefined ? 1 : _ref$highWaterMark;

      _classCallCheck(this, WritableStream);

      this._state = 'writable';
      this._storedError = undefined;
      this._writer = undefined;
      this._writableStreamController = undefined;
      this._writeRequests = [];
      this._inFlightWriteRequest = undefined;
      this._closeRequest = undefined;
      this._inFlightCloseRequest = undefined;
      this._pendingAbortRequest = undefined;
      this._backpressure = false;
      var type = underlyingSink.type;

      if (type !== undefined) {
        throw new RangeError('Invalid type is specified');
      }

      this._writableStreamController = new WritableStreamDefaultController(this, underlyingSink, size, highWaterMark);

      this._writableStreamController.__startSteps();
    }

    _createClass(WritableStream, [{
      key: 'abort',
      value: function abort(reason) {
        if (IsWritableStream(this) === false) {
          return Promise.reject(streamBrandCheckException('abort'));
        }

        if (IsWritableStreamLocked(this) === true) {
          return Promise.reject(new TypeError('Cannot abort a stream that already has a writer'));
        }

        return WritableStreamAbort(this, reason);
      }
    }, {
      key: 'getWriter',
      value: function getWriter() {
        if (IsWritableStream(this) === false) {
          throw streamBrandCheckException('getWriter');
        }

        return AcquireWritableStreamDefaultWriter(this);
      }
    }, {
      key: 'locked',
      get: function get() {
        if (IsWritableStream(this) === false) {
          throw streamBrandCheckException('locked');
        }

        return IsWritableStreamLocked(this);
      }
    }]);

    return WritableStream;
  }();

  module.exports = {
    AcquireWritableStreamDefaultWriter: AcquireWritableStreamDefaultWriter,
    IsWritableStream: IsWritableStream,
    IsWritableStreamLocked: IsWritableStreamLocked,
    WritableStream: WritableStream,
    WritableStreamAbort: WritableStreamAbort,
    WritableStreamDefaultControllerError: WritableStreamDefaultControllerError,
    WritableStreamDefaultWriterCloseWithErrorPropagation: WritableStreamDefaultWriterCloseWithErrorPropagation,
    WritableStreamDefaultWriterRelease: WritableStreamDefaultWriterRelease,
    WritableStreamDefaultWriterWrite: WritableStreamDefaultWriterWrite,
    WritableStreamCloseQueuedOrInFlight: WritableStreamCloseQueuedOrInFlight
  };

  function AcquireWritableStreamDefaultWriter(stream) {
    return new WritableStreamDefaultWriter(stream);
  }

  function IsWritableStream(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) {
      return false;
    }

    return true;
  }

  function IsWritableStreamLocked(stream) {
    assert(IsWritableStream(stream) === true, 'IsWritableStreamLocked should only be used on known writable streams');

    if (stream._writer === undefined) {
      return false;
    }

    return true;
  }

  function WritableStreamAbort(stream, reason) {
    var state = stream._state;

    if (state === 'closed') {
      return Promise.resolve(undefined);
    }

    if (state === 'errored') {
      return Promise.reject(stream._storedError);
    }

    var error = new TypeError('Requested to abort');

    if (stream._pendingAbortRequest !== undefined) {
      return Promise.reject(error);
    }

    assert(state === 'writable' || state === 'erroring', 'state must be writable or erroring');
    var wasAlreadyErroring = false;

    if (state === 'erroring') {
      wasAlreadyErroring = true;
      reason = undefined;
    }

    var promise = new Promise(function (resolve, reject) {
      stream._pendingAbortRequest = {
        _resolve: resolve,
        _reject: reject,
        _reason: reason,
        _wasAlreadyErroring: wasAlreadyErroring
      };
    });

    if (wasAlreadyErroring === false) {
      WritableStreamStartErroring(stream, error);
    }

    return promise;
  }

  function WritableStreamAddWriteRequest(stream) {
    assert(IsWritableStreamLocked(stream) === true);
    assert(stream._state === 'writable');
    var promise = new Promise(function (resolve, reject) {
      var writeRequest = {
        _resolve: resolve,
        _reject: reject
      };

      stream._writeRequests.push(writeRequest);
    });
    return promise;
  }

  function WritableStreamDealWithRejection(stream, error) {
    var state = stream._state;

    if (state === 'writable') {
      WritableStreamStartErroring(stream, error);
      return;
    }

    assert(state === 'erroring');
    WritableStreamFinishErroring(stream);
  }

  function WritableStreamStartErroring(stream, reason) {
    assert(stream._storedError === undefined, 'stream._storedError === undefined');
    assert(stream._state === 'writable', 'state must be writable');
    var controller = stream._writableStreamController;
    assert(controller !== undefined, 'controller must not be undefined');
    stream._state = 'erroring';
    stream._storedError = reason;
    var writer = stream._writer;

    if (writer !== undefined) {
      WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);
    }

    if (WritableStreamHasOperationMarkedInFlight(stream) === false && controller._started === true) {
      WritableStreamFinishErroring(stream);
    }
  }

  function WritableStreamFinishErroring(stream) {
    assert(stream._state === 'erroring', 'stream._state === erroring');
    assert(WritableStreamHasOperationMarkedInFlight(stream) === false, 'WritableStreamHasOperationMarkedInFlight(stream) === false');
    stream._state = 'errored';

    stream._writableStreamController.__errorSteps();

    var storedError = stream._storedError;

    for (var i = 0; i < stream._writeRequests.length; i++) {
      var writeRequest = stream._writeRequests[i];

      writeRequest._reject(storedError);
    }

    stream._writeRequests = [];

    if (stream._pendingAbortRequest === undefined) {
      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
      return;
    }

    var abortRequest = stream._pendingAbortRequest;
    stream._pendingAbortRequest = undefined;

    if (abortRequest._wasAlreadyErroring === true) {
      abortRequest._reject(storedError);

      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
      return;
    }

    var promise = stream._writableStreamController.__abortSteps(abortRequest._reason);

    promise.then(function () {
      abortRequest._resolve();

      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
    }, function (reason) {
      abortRequest._reject(reason);

      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
    });
  }

  function WritableStreamFinishInFlightWrite(stream) {
    assert(stream._inFlightWriteRequest !== undefined);

    stream._inFlightWriteRequest._resolve(undefined);

    stream._inFlightWriteRequest = undefined;
  }

  function WritableStreamFinishInFlightWriteWithError(stream, error) {
    assert(stream._inFlightWriteRequest !== undefined);

    stream._inFlightWriteRequest._reject(error);

    stream._inFlightWriteRequest = undefined;
    assert(stream._state === 'writable' || stream._state === 'erroring');
    WritableStreamDealWithRejection(stream, error);
  }

  function WritableStreamFinishInFlightClose(stream) {
    assert(stream._inFlightCloseRequest !== undefined);

    stream._inFlightCloseRequest._resolve(undefined);

    stream._inFlightCloseRequest = undefined;
    var state = stream._state;
    assert(state === 'writable' || state === 'erroring');

    if (state === 'erroring') {
      stream._storedError = undefined;

      if (stream._pendingAbortRequest !== undefined) {
        stream._pendingAbortRequest._resolve();

        stream._pendingAbortRequest = undefined;
      }
    }

    stream._state = 'closed';
    var writer = stream._writer;

    if (writer !== undefined) {
      defaultWriterClosedPromiseResolve(writer);
    }

    assert(stream._pendingAbortRequest === undefined, 'stream._pendingAbortRequest === undefined');
    assert(stream._storedError === undefined, 'stream._storedError === undefined');
  }

  function WritableStreamFinishInFlightCloseWithError(stream, error) {
    assert(stream._inFlightCloseRequest !== undefined);

    stream._inFlightCloseRequest._reject(error);

    stream._inFlightCloseRequest = undefined;
    assert(stream._state === 'writable' || stream._state === 'erroring');

    if (stream._pendingAbortRequest !== undefined) {
      stream._pendingAbortRequest._reject(error);

      stream._pendingAbortRequest = undefined;
    }

    WritableStreamDealWithRejection(stream, error);
  }

  function WritableStreamCloseQueuedOrInFlight(stream) {
    if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) {
      return false;
    }

    return true;
  }

  function WritableStreamHasOperationMarkedInFlight(stream) {
    if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) {
      return false;
    }

    return true;
  }

  function WritableStreamMarkCloseRequestInFlight(stream) {
    assert(stream._inFlightCloseRequest === undefined);
    assert(stream._closeRequest !== undefined);
    stream._inFlightCloseRequest = stream._closeRequest;
    stream._closeRequest = undefined;
  }

  function WritableStreamMarkFirstWriteRequestInFlight(stream) {
    assert(stream._inFlightWriteRequest === undefined, 'there must be no pending write request');
    assert(stream._writeRequests.length !== 0, 'writeRequests must not be empty');
    stream._inFlightWriteRequest = stream._writeRequests.shift();
  }

  function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {
    assert(stream._state === 'errored', '_stream_.[[state]] is `"errored"`');

    if (stream._closeRequest !== undefined) {
      assert(stream._inFlightCloseRequest === undefined);

      stream._closeRequest._reject(stream._storedError);

      stream._closeRequest = undefined;
    }

    var writer = stream._writer;

    if (writer !== undefined) {
      defaultWriterClosedPromiseReject(writer, stream._storedError);

      writer._closedPromise.catch(function () {});
    }
  }

  function WritableStreamUpdateBackpressure(stream, backpressure) {
    assert(stream._state === 'writable');
    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);
    var writer = stream._writer;

    if (writer !== undefined && backpressure !== stream._backpressure) {
      if (backpressure === true) {
        defaultWriterReadyPromiseReset(writer);
      } else {
        assert(backpressure === false);
        defaultWriterReadyPromiseResolve(writer);
      }
    }

    stream._backpressure = backpressure;
  }

  var WritableStreamDefaultWriter = function () {
    function WritableStreamDefaultWriter(stream) {
      _classCallCheck(this, WritableStreamDefaultWriter);

      if (IsWritableStream(stream) === false) {
        throw new TypeError('WritableStreamDefaultWriter can only be constructed with a WritableStream instance');
      }

      if (IsWritableStreamLocked(stream) === true) {
        throw new TypeError('This stream has already been locked for exclusive writing by another writer');
      }

      this._ownerWritableStream = stream;
      stream._writer = this;
      var state = stream._state;

      if (state === 'writable') {
        if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._backpressure === true) {
          defaultWriterReadyPromiseInitialize(this);
        } else {
          defaultWriterReadyPromiseInitializeAsResolved(this);
        }

        defaultWriterClosedPromiseInitialize(this);
      } else if (state === 'erroring') {
        defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError);

        this._readyPromise.catch(function () {});

        defaultWriterClosedPromiseInitialize(this);
      } else if (state === 'closed') {
        defaultWriterReadyPromiseInitializeAsResolved(this);
        defaultWriterClosedPromiseInitializeAsResolved(this);
      } else {
        assert(state === 'errored', 'state must be errored');
        var storedError = stream._storedError;
        defaultWriterReadyPromiseInitializeAsRejected(this, storedError);

        this._readyPromise.catch(function () {});

        defaultWriterClosedPromiseInitializeAsRejected(this, storedError);

        this._closedPromise.catch(function () {});
      }
    }

    _createClass(WritableStreamDefaultWriter, [{
      key: 'abort',
      value: function abort(reason) {
        if (IsWritableStreamDefaultWriter(this) === false) {
          return Promise.reject(defaultWriterBrandCheckException('abort'));
        }

        if (this._ownerWritableStream === undefined) {
          return Promise.reject(defaultWriterLockException('abort'));
        }

        return WritableStreamDefaultWriterAbort(this, reason);
      }
    }, {
      key: 'close',
      value: function close() {
        if (IsWritableStreamDefaultWriter(this) === false) {
          return Promise.reject(defaultWriterBrandCheckException('close'));
        }

        var stream = this._ownerWritableStream;

        if (stream === undefined) {
          return Promise.reject(defaultWriterLockException('close'));
        }

        if (WritableStreamCloseQueuedOrInFlight(stream) === true) {
          return Promise.reject(new TypeError('cannot close an already-closing stream'));
        }

        return WritableStreamDefaultWriterClose(this);
      }
    }, {
      key: 'releaseLock',
      value: function releaseLock() {
        if (IsWritableStreamDefaultWriter(this) === false) {
          throw defaultWriterBrandCheckException('releaseLock');
        }

        var stream = this._ownerWritableStream;

        if (stream === undefined) {
          return;
        }

        assert(stream._writer !== undefined);
        WritableStreamDefaultWriterRelease(this);
      }
    }, {
      key: 'write',
      value: function write(chunk) {
        if (IsWritableStreamDefaultWriter(this) === false) {
          return Promise.reject(defaultWriterBrandCheckException('write'));
        }

        if (this._ownerWritableStream === undefined) {
          return Promise.reject(defaultWriterLockException('write to'));
        }

        return WritableStreamDefaultWriterWrite(this, chunk);
      }
    }, {
      key: 'closed',
      get: function get() {
        if (IsWritableStreamDefaultWriter(this) === false) {
          return Promise.reject(defaultWriterBrandCheckException('closed'));
        }

        return this._closedPromise;
      }
    }, {
      key: 'desiredSize',
      get: function get() {
        if (IsWritableStreamDefaultWriter(this) === false) {
          throw defaultWriterBrandCheckException('desiredSize');
        }

        if (this._ownerWritableStream === undefined) {
          throw defaultWriterLockException('desiredSize');
        }

        return WritableStreamDefaultWriterGetDesiredSize(this);
      }
    }, {
      key: 'ready',
      get: function get() {
        if (IsWritableStreamDefaultWriter(this) === false) {
          return Promise.reject(defaultWriterBrandCheckException('ready'));
        }

        return this._readyPromise;
      }
    }]);

    return WritableStreamDefaultWriter;
  }();

  function IsWritableStreamDefaultWriter(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) {
      return false;
    }

    return true;
  }

  function WritableStreamDefaultWriterAbort(writer, reason) {
    var stream = writer._ownerWritableStream;
    assert(stream !== undefined);
    return WritableStreamAbort(stream, reason);
  }

  function WritableStreamDefaultWriterClose(writer) {
    var stream = writer._ownerWritableStream;
    assert(stream !== undefined);
    var state = stream._state;

    if (state === 'closed' || state === 'errored') {
      return Promise.reject(new TypeError('The stream (in ' + state + ' state) is not in the writable state and cannot be closed'));
    }

    assert(state === 'writable' || state === 'erroring');
    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);
    var promise = new Promise(function (resolve, reject) {
      var closeRequest = {
        _resolve: resolve,
        _reject: reject
      };
      stream._closeRequest = closeRequest;
    });

    if (stream._backpressure === true && state === 'writable') {
      defaultWriterReadyPromiseResolve(writer);
    }

    WritableStreamDefaultControllerClose(stream._writableStreamController);
    return promise;
  }

  function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) {
    var stream = writer._ownerWritableStream;
    assert(stream !== undefined);
    var state = stream._state;

    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {
      return Promise.resolve();
    }

    if (state === 'errored') {
      return Promise.reject(stream._storedError);
    }

    assert(state === 'writable' || state === 'erroring');
    return WritableStreamDefaultWriterClose(writer);
  }

  function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {
    if (writer._closedPromiseState === 'pending') {
      defaultWriterClosedPromiseReject(writer, error);
    } else {
      defaultWriterClosedPromiseResetToRejected(writer, error);
    }

    writer._closedPromise.catch(function () {});
  }

  function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {
    if (writer._readyPromiseState === 'pending') {
      defaultWriterReadyPromiseReject(writer, error);
    } else {
      defaultWriterReadyPromiseResetToRejected(writer, error);
    }

    writer._readyPromise.catch(function () {});
  }

  function WritableStreamDefaultWriterGetDesiredSize(writer) {
    var stream = writer._ownerWritableStream;
    var state = stream._state;

    if (state === 'errored' || state === 'erroring') {
      return null;
    }

    if (state === 'closed') {
      return 0;
    }

    return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController);
  }

  function WritableStreamDefaultWriterRelease(writer) {
    var stream = writer._ownerWritableStream;
    assert(stream !== undefined);
    assert(stream._writer === writer);
    var releasedError = new TypeError('Writer was released and can no longer be used to monitor the stream\'s closedness');
    WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);
    WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);
    stream._writer = undefined;
    writer._ownerWritableStream = undefined;
  }

  function WritableStreamDefaultWriterWrite(writer, chunk) {
    var stream = writer._ownerWritableStream;
    assert(stream !== undefined);
    var controller = stream._writableStreamController;
    var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk);

    if (stream !== writer._ownerWritableStream) {
      return Promise.reject(defaultWriterLockException('write to'));
    }

    var state = stream._state;

    if (state === 'errored') {
      return Promise.reject(stream._storedError);
    }

    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {
      return Promise.reject(new TypeError('The stream is closing or closed and cannot be written to'));
    }

    if (state === 'erroring') {
      return Promise.reject(stream._storedError);
    }

    assert(state === 'writable');
    var promise = WritableStreamAddWriteRequest(stream);
    WritableStreamDefaultControllerWrite(controller, chunk, chunkSize);
    return promise;
  }

  var WritableStreamDefaultController = function () {
    function WritableStreamDefaultController(stream, underlyingSink, size, highWaterMark) {
      _classCallCheck(this, WritableStreamDefaultController);

      if (IsWritableStream(stream) === false) {
        throw new TypeError('WritableStreamDefaultController can only be constructed with a WritableStream instance');
      }

      if (stream._writableStreamController !== undefined) {
        throw new TypeError('WritableStreamDefaultController instances can only be created by the WritableStream constructor');
      }

      this._controlledWritableStream = stream;
      this._underlyingSink = underlyingSink;
      this._queue = undefined;
      this._queueTotalSize = undefined;
      ResetQueue(this);
      this._started = false;
      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);
      this._strategySize = normalizedStrategy.size;
      this._strategyHWM = normalizedStrategy.highWaterMark;
      var backpressure = WritableStreamDefaultControllerGetBackpressure(this);
      WritableStreamUpdateBackpressure(stream, backpressure);
    }

    _createClass(WritableStreamDefaultController, [{
      key: 'error',
      value: function error(e) {
        if (IsWritableStreamDefaultController(this) === false) {
          throw new TypeError('WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController');
        }

        var state = this._controlledWritableStream._state;

        if (state !== 'writable') {
          return;
        }

        WritableStreamDefaultControllerError(this, e);
      }
    }, {
      key: '__abortSteps',
      value: function __abortSteps(reason) {
        return PromiseInvokeOrNoop(this._underlyingSink, 'abort', [reason]);
      }
    }, {
      key: '__errorSteps',
      value: function __errorSteps() {
        ResetQueue(this);
      }
    }, {
      key: '__startSteps',
      value: function __startSteps() {
        var _this = this;

        var startResult = InvokeOrNoop(this._underlyingSink, 'start', [this]);
        var stream = this._controlledWritableStream;
        Promise.resolve(startResult).then(function () {
          assert(stream._state === 'writable' || stream._state === 'erroring');
          _this._started = true;
          WritableStreamDefaultControllerAdvanceQueueIfNeeded(_this);
        }, function (r) {
          assert(stream._state === 'writable' || stream._state === 'erroring');
          _this._started = true;
          WritableStreamDealWithRejection(stream, r);
        }).catch(rethrowAssertionErrorRejection);
      }
    }]);

    return WritableStreamDefaultController;
  }();

  function WritableStreamDefaultControllerClose(controller) {
    EnqueueValueWithSize(controller, 'close', 0);
    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
  }

  function WritableStreamDefaultControllerGetChunkSize(controller, chunk) {
    var strategySize = controller._strategySize;

    if (strategySize === undefined) {
      return 1;
    }

    try {
      return strategySize(chunk);
    } catch (chunkSizeE) {
      WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);
      return 1;
    }
  }

  function WritableStreamDefaultControllerGetDesiredSize(controller) {
    return controller._strategyHWM - controller._queueTotalSize;
  }

  function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) {
    var writeRecord = {
      chunk: chunk
    };

    try {
      EnqueueValueWithSize(controller, writeRecord, chunkSize);
    } catch (enqueueE) {
      WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);
      return;
    }

    var stream = controller._controlledWritableStream;

    if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._state === 'writable') {
      var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
      WritableStreamUpdateBackpressure(stream, backpressure);
    }

    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
  }

  function IsWritableStreamDefaultController(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSink')) {
      return false;
    }

    return true;
  }

  function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {
    var stream = controller._controlledWritableStream;

    if (controller._started === false) {
      return;
    }

    if (stream._inFlightWriteRequest !== undefined) {
      return;
    }

    var state = stream._state;

    if (state === 'closed' || state === 'errored') {
      return;
    }

    if (state === 'erroring') {
      WritableStreamFinishErroring(stream);
      return;
    }

    if (controller._queue.length === 0) {
      return;
    }

    var writeRecord = PeekQueueValue(controller);

    if (writeRecord === 'close') {
      WritableStreamDefaultControllerProcessClose(controller);
    } else {
      WritableStreamDefaultControllerProcessWrite(controller, writeRecord.chunk);
    }
  }

  function WritableStreamDefaultControllerErrorIfNeeded(controller, error) {
    if (controller._controlledWritableStream._state === 'writable') {
      WritableStreamDefaultControllerError(controller, error);
    }
  }

  function WritableStreamDefaultControllerProcessClose(controller) {
    var stream = controller._controlledWritableStream;
    WritableStreamMarkCloseRequestInFlight(stream);
    DequeueValue(controller);
    assert(controller._queue.length === 0, 'queue must be empty once the final write record is dequeued');
    var sinkClosePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'close', []);
    sinkClosePromise.then(function () {
      WritableStreamFinishInFlightClose(stream);
    }, function (reason) {
      WritableStreamFinishInFlightCloseWithError(stream, reason);
    }).catch(rethrowAssertionErrorRejection);
  }

  function WritableStreamDefaultControllerProcessWrite(controller, chunk) {
    var stream = controller._controlledWritableStream;
    WritableStreamMarkFirstWriteRequestInFlight(stream);
    var sinkWritePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'write', [chunk, controller]);
    sinkWritePromise.then(function () {
      WritableStreamFinishInFlightWrite(stream);
      var state = stream._state;
      assert(state === 'writable' || state === 'erroring');
      DequeueValue(controller);

      if (WritableStreamCloseQueuedOrInFlight(stream) === false && state === 'writable') {
        var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
        WritableStreamUpdateBackpressure(stream, backpressure);
      }

      WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
    }, function (reason) {
      WritableStreamFinishInFlightWriteWithError(stream, reason);
    }).catch(rethrowAssertionErrorRejection);
  }

  function WritableStreamDefaultControllerGetBackpressure(controller) {
    var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller);
    return desiredSize <= 0;
  }

  function WritableStreamDefaultControllerError(controller, error) {
    var stream = controller._controlledWritableStream;
    assert(stream._state === 'writable');
    WritableStreamStartErroring(stream, error);
  }

  function streamBrandCheckException(name) {
    return new TypeError('WritableStream.prototype.' + name + ' can only be used on a WritableStream');
  }

  function defaultWriterBrandCheckException(name) {
    return new TypeError('WritableStreamDefaultWriter.prototype.' + name + ' can only be used on a WritableStreamDefaultWriter');
  }

  function defaultWriterLockException(name) {
    return new TypeError('Cannot ' + name + ' a stream using a released writer');
  }

  function defaultWriterClosedPromiseInitialize(writer) {
    writer._closedPromise = new Promise(function (resolve, reject) {
      writer._closedPromise_resolve = resolve;
      writer._closedPromise_reject = reject;
      writer._closedPromiseState = 'pending';
    });
  }

  function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) {
    writer._closedPromise = Promise.reject(reason);
    writer._closedPromise_resolve = undefined;
    writer._closedPromise_reject = undefined;
    writer._closedPromiseState = 'rejected';
  }

  function defaultWriterClosedPromiseInitializeAsResolved(writer) {
    writer._closedPromise = Promise.resolve(undefined);
    writer._closedPromise_resolve = undefined;
    writer._closedPromise_reject = undefined;
    writer._closedPromiseState = 'resolved';
  }

  function defaultWriterClosedPromiseReject(writer, reason) {
    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');
    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');
    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');

    writer._closedPromise_reject(reason);

    writer._closedPromise_resolve = undefined;
    writer._closedPromise_reject = undefined;
    writer._closedPromiseState = 'rejected';
  }

  function defaultWriterClosedPromiseResetToRejected(writer, reason) {
    assert(writer._closedPromise_resolve === undefined, 'writer._closedPromise_resolve === undefined');
    assert(writer._closedPromise_reject === undefined, 'writer._closedPromise_reject === undefined');
    assert(writer._closedPromiseState !== 'pending', 'writer._closedPromiseState is not pending');
    writer._closedPromise = Promise.reject(reason);
    writer._closedPromiseState = 'rejected';
  }

  function defaultWriterClosedPromiseResolve(writer) {
    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');
    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');
    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');

    writer._closedPromise_resolve(undefined);

    writer._closedPromise_resolve = undefined;
    writer._closedPromise_reject = undefined;
    writer._closedPromiseState = 'resolved';
  }

  function defaultWriterReadyPromiseInitialize(writer) {
    writer._readyPromise = new Promise(function (resolve, reject) {
      writer._readyPromise_resolve = resolve;
      writer._readyPromise_reject = reject;
    });
    writer._readyPromiseState = 'pending';
  }

  function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) {
    writer._readyPromise = Promise.reject(reason);
    writer._readyPromise_resolve = undefined;
    writer._readyPromise_reject = undefined;
    writer._readyPromiseState = 'rejected';
  }

  function defaultWriterReadyPromiseInitializeAsResolved(writer) {
    writer._readyPromise = Promise.resolve(undefined);
    writer._readyPromise_resolve = undefined;
    writer._readyPromise_reject = undefined;
    writer._readyPromiseState = 'fulfilled';
  }

  function defaultWriterReadyPromiseReject(writer, reason) {
    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');
    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');

    writer._readyPromise_reject(reason);

    writer._readyPromise_resolve = undefined;
    writer._readyPromise_reject = undefined;
    writer._readyPromiseState = 'rejected';
  }

  function defaultWriterReadyPromiseReset(writer) {
    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');
    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');
    writer._readyPromise = new Promise(function (resolve, reject) {
      writer._readyPromise_resolve = resolve;
      writer._readyPromise_reject = reject;
    });
    writer._readyPromiseState = 'pending';
  }

  function defaultWriterReadyPromiseResetToRejected(writer, reason) {
    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');
    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');
    writer._readyPromise = Promise.reject(reason);
    writer._readyPromiseState = 'rejected';
  }

  function defaultWriterReadyPromiseResolve(writer) {
    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');
    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');

    writer._readyPromise_resolve(undefined);

    writer._readyPromise_resolve = undefined;
    writer._readyPromise_reject = undefined;
    writer._readyPromiseState = 'fulfilled';
  }
}, function (module, exports, __w_pdfjs_require__) {
  "use strict";

  var _require = __w_pdfjs_require__(0),
      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber;

  var _require2 = __w_pdfjs_require__(1),
      assert = _require2.assert;

  exports.DequeueValue = function (container) {
    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');
    assert(container._queue.length > 0, 'Spec-level failure: should never dequeue from an empty queue.');

    var pair = container._queue.shift();

    container._queueTotalSize -= pair.size;

    if (container._queueTotalSize < 0) {
      container._queueTotalSize = 0;
    }

    return pair.value;
  };

  exports.EnqueueValueWithSize = function (container, value, size) {
    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and ' + '[[queueTotalSize]].');
    size = Number(size);

    if (!IsFiniteNonNegativeNumber(size)) {
      throw new RangeError('Size must be a finite, non-NaN, non-negative number.');
    }

    container._queue.push({
      value: value,
      size: size
    });

    container._queueTotalSize += size;
  };

  exports.PeekQueueValue = function (container) {
    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');
    assert(container._queue.length > 0, 'Spec-level failure: should never peek at an empty queue.');
    var pair = container._queue[0];
    return pair.value;
  };

  exports.ResetQueue = function (container) {
    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]].');
    container._queue = [];
    container._queueTotalSize = 0;
  };
}, function (module, exports, __w_pdfjs_require__) {
  "use strict";

  var _createClass = function () {
    function defineProperties(target, props) {
      for (var i = 0; i < props.length; i++) {
        var descriptor = props[i];
        descriptor.enumerable = descriptor.enumerable || false;
        descriptor.configurable = true;
        if ("value" in descriptor) descriptor.writable = true;
        Object.defineProperty(target, descriptor.key, descriptor);
      }
    }

    return function (Constructor, protoProps, staticProps) {
      if (protoProps) defineProperties(Constructor.prototype, protoProps);
      if (staticProps) defineProperties(Constructor, staticProps);
      return Constructor;
    };
  }();

  function _classCallCheck(instance, Constructor) {
    if (!(instance instanceof Constructor)) {
      throw new TypeError("Cannot call a class as a function");
    }
  }

  var _require = __w_pdfjs_require__(0),
      ArrayBufferCopy = _require.ArrayBufferCopy,
      CreateIterResultObject = _require.CreateIterResultObject,
      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber,
      InvokeOrNoop = _require.InvokeOrNoop,
      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,
      TransferArrayBuffer = _require.TransferArrayBuffer,
      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,
      ValidateAndNormalizeHighWaterMark = _require.ValidateAndNormalizeHighWaterMark;

  var _require2 = __w_pdfjs_require__(0),
      createArrayFromList = _require2.createArrayFromList,
      createDataProperty = _require2.createDataProperty,
      typeIsObject = _require2.typeIsObject;

  var _require3 = __w_pdfjs_require__(1),
      assert = _require3.assert,
      rethrowAssertionErrorRejection = _require3.rethrowAssertionErrorRejection;

  var _require4 = __w_pdfjs_require__(3),
      DequeueValue = _require4.DequeueValue,
      EnqueueValueWithSize = _require4.EnqueueValueWithSize,
      ResetQueue = _require4.ResetQueue;

  var _require5 = __w_pdfjs_require__(2),
      AcquireWritableStreamDefaultWriter = _require5.AcquireWritableStreamDefaultWriter,
      IsWritableStream = _require5.IsWritableStream,
      IsWritableStreamLocked = _require5.IsWritableStreamLocked,
      WritableStreamAbort = _require5.WritableStreamAbort,
      WritableStreamDefaultWriterCloseWithErrorPropagation = _require5.WritableStreamDefaultWriterCloseWithErrorPropagation,
      WritableStreamDefaultWriterRelease = _require5.WritableStreamDefaultWriterRelease,
      WritableStreamDefaultWriterWrite = _require5.WritableStreamDefaultWriterWrite,
      WritableStreamCloseQueuedOrInFlight = _require5.WritableStreamCloseQueuedOrInFlight;

  var ReadableStream = function () {
    function ReadableStream() {
      var underlyingSource = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
          size = _ref.size,
          highWaterMark = _ref.highWaterMark;

      _classCallCheck(this, ReadableStream);

      this._state = 'readable';
      this._reader = undefined;
      this._storedError = undefined;
      this._disturbed = false;
      this._readableStreamController = undefined;
      var type = underlyingSource.type;
      var typeString = String(type);

      if (typeString === 'bytes') {
        if (highWaterMark === undefined) {
          highWaterMark = 0;
        }

        this._readableStreamController = new ReadableByteStreamController(this, underlyingSource, highWaterMark);
      } else if (type === undefined) {
        if (highWaterMark === undefined) {
          highWaterMark = 1;
        }

        this._readableStreamController = new ReadableStreamDefaultController(this, underlyingSource, size, highWaterMark);
      } else {
        throw new RangeError('Invalid type is specified');
      }
    }

    _createClass(ReadableStream, [{
      key: 'cancel',
      value: function cancel(reason) {
        if (IsReadableStream(this) === false) {
          return Promise.reject(streamBrandCheckException('cancel'));
        }

        if (IsReadableStreamLocked(this) === true) {
          return Promise.reject(new TypeError('Cannot cancel a stream that already has a reader'));
        }

        return ReadableStreamCancel(this, reason);
      }
    }, {
      key: 'getReader',
      value: function getReader() {
        var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
            mode = _ref2.mode;

        if (IsReadableStream(this) === false) {
          throw streamBrandCheckException('getReader');
        }

        if (mode === undefined) {
          return AcquireReadableStreamDefaultReader(this);
        }

        mode = String(mode);

        if (mode === 'byob') {
          return AcquireReadableStreamBYOBReader(this);
        }

        throw new RangeError('Invalid mode is specified');
      }
    }, {
      key: 'pipeThrough',
      value: function pipeThrough(_ref3, options) {
        var writable = _ref3.writable,
            readable = _ref3.readable;
        var promise = this.pipeTo(writable, options);
        ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise);
        return readable;
      }
    }, {
      key: 'pipeTo',
      value: function pipeTo(dest) {
        var _this = this;

        var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
            preventClose = _ref4.preventClose,
            preventAbort = _ref4.preventAbort,
            preventCancel = _ref4.preventCancel;

        if (IsReadableStream(this) === false) {
          return Promise.reject(streamBrandCheckException('pipeTo'));
        }

        if (IsWritableStream(dest) === false) {
          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo\'s first argument must be a WritableStream'));
        }

        preventClose = Boolean(preventClose);
        preventAbort = Boolean(preventAbort);
        preventCancel = Boolean(preventCancel);

        if (IsReadableStreamLocked(this) === true) {
          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream'));
        }

        if (IsWritableStreamLocked(dest) === true) {
          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream'));
        }

        var reader = AcquireReadableStreamDefaultReader(this);
        var writer = AcquireWritableStreamDefaultWriter(dest);
        var shuttingDown = false;
        var currentWrite = Promise.resolve();
        return new Promise(function (resolve, reject) {
          function pipeLoop() {
            currentWrite = Promise.resolve();

            if (shuttingDown === true) {
              return Promise.resolve();
            }

            return writer._readyPromise.then(function () {
              return ReadableStreamDefaultReaderRead(reader).then(function (_ref5) {
                var value = _ref5.value,
                    done = _ref5.done;

                if (done === true) {
                  return;
                }

                currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {});
              });
            }).then(pipeLoop);
          }

          isOrBecomesErrored(_this, reader._closedPromise, function (storedError) {
            if (preventAbort === false) {
              shutdownWithAction(function () {
                return WritableStreamAbort(dest, storedError);
              }, true, storedError);
            } else {
              shutdown(true, storedError);
            }
          });
          isOrBecomesErrored(dest, writer._closedPromise, function (storedError) {
            if (preventCancel === false) {
              shutdownWithAction(function () {
                return ReadableStreamCancel(_this, storedError);
              }, true, storedError);
            } else {
              shutdown(true, storedError);
            }
          });
          isOrBecomesClosed(_this, reader._closedPromise, function () {
            if (preventClose === false) {
              shutdownWithAction(function () {
                return WritableStreamDefaultWriterCloseWithErrorPropagation(writer);
              });
            } else {
              shutdown();
            }
          });

          if (WritableStreamCloseQueuedOrInFlight(dest) === true || dest._state === 'closed') {
            var destClosed = new TypeError('the destination writable stream closed before all data could be piped to it');

            if (preventCancel === false) {
              shutdownWithAction(function () {
                return ReadableStreamCancel(_this, destClosed);
              }, true, destClosed);
            } else {
              shutdown(true, destClosed);
            }
          }

          pipeLoop().catch(function (err) {
            currentWrite = Promise.resolve();
            rethrowAssertionErrorRejection(err);
          });

          function waitForWritesToFinish() {
            var oldCurrentWrite = currentWrite;
            return currentWrite.then(function () {
              return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined;
            });
          }

          function isOrBecomesErrored(stream, promise, action) {
            if (stream._state === 'errored') {
              action(stream._storedError);
            } else {
              promise.catch(action).catch(rethrowAssertionErrorRejection);
            }
          }

          function isOrBecomesClosed(stream, promise, action) {
            if (stream._state === 'closed') {
              action();
            } else {
              promise.then(action).catch(rethrowAssertionErrorRejection);
            }
          }

          function shutdownWithAction(action, originalIsError, originalError) {
            if (shuttingDown === true) {
              return;
            }

            shuttingDown = true;

            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
              waitForWritesToFinish().then(doTheRest);
            } else {
              doTheRest();
            }

            function doTheRest() {
              action().then(function () {
                return finalize(originalIsError, originalError);
              }, function (newError) {
                return finalize(true, newError);
              }).catch(rethrowAssertionErrorRejection);
            }
          }

          function shutdown(isError, error) {
            if (shuttingDown === true) {
              return;
            }

            shuttingDown = true;

            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
              waitForWritesToFinish().then(function () {
                return finalize(isError, error);
              }).catch(rethrowAssertionErrorRejection);
            } else {
              finalize(isError, error);
            }
          }

          function finalize(isError, error) {
            WritableStreamDefaultWriterRelease(writer);
            ReadableStreamReaderGenericRelease(reader);

            if (isError) {
              reject(error);
            } else {
              resolve(undefined);
            }
          }
        });
      }
    }, {
      key: 'tee',
      value: function tee() {
        if (IsReadableStream(this) === false) {
          throw streamBrandCheckException('tee');
        }

        var branches = ReadableStreamTee(this, false);
        return createArrayFromList(branches);
      }
    }, {
      key: 'locked',
      get: function get() {
        if (IsReadableStream(this) === false) {
          throw streamBrandCheckException('locked');
        }

        return IsReadableStreamLocked(this);
      }
    }]);

    return ReadableStream;
  }();

  module.exports = {
    ReadableStream: ReadableStream,
    IsReadableStreamDisturbed: IsReadableStreamDisturbed,
    ReadableStreamDefaultControllerClose: ReadableStreamDefaultControllerClose,
    ReadableStreamDefaultControllerEnqueue: ReadableStreamDefaultControllerEnqueue,
    ReadableStreamDefaultControllerError: ReadableStreamDefaultControllerError,
    ReadableStreamDefaultControllerGetDesiredSize: ReadableStreamDefaultControllerGetDesiredSize
  };

  function AcquireReadableStreamBYOBReader(stream) {
    return new ReadableStreamBYOBReader(stream);
  }

  function AcquireReadableStreamDefaultReader(stream) {
    return new ReadableStreamDefaultReader(stream);
  }

  function IsReadableStream(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) {
      return false;
    }

    return true;
  }

  function IsReadableStreamDisturbed(stream) {
    assert(IsReadableStream(stream) === true, 'IsReadableStreamDisturbed should only be used on known readable streams');
    return stream._disturbed;
  }

  function IsReadableStreamLocked(stream) {
    assert(IsReadableStream(stream) === true, 'IsReadableStreamLocked should only be used on known readable streams');

    if (stream._reader === undefined) {
      return false;
    }

    return true;
  }

  function ReadableStreamTee(stream, cloneForBranch2) {
    assert(IsReadableStream(stream) === true);
    assert(typeof cloneForBranch2 === 'boolean');
    var reader = AcquireReadableStreamDefaultReader(stream);
    var teeState = {
      closedOrErrored: false,
      canceled1: false,
      canceled2: false,
      reason1: undefined,
      reason2: undefined
    };
    teeState.promise = new Promise(function (resolve) {
      teeState._resolve = resolve;
    });
    var pull = create_ReadableStreamTeePullFunction();
    pull._reader = reader;
    pull._teeState = teeState;
    pull._cloneForBranch2 = cloneForBranch2;
    var cancel1 = create_ReadableStreamTeeBranch1CancelFunction();
    cancel1._stream = stream;
    cancel1._teeState = teeState;
    var cancel2 = create_ReadableStreamTeeBranch2CancelFunction();
    cancel2._stream = stream;
    cancel2._teeState = teeState;
    var underlyingSource1 = Object.create(Object.prototype);
    createDataProperty(underlyingSource1, 'pull', pull);
    createDataProperty(underlyingSource1, 'cancel', cancel1);
    var branch1Stream = new ReadableStream(underlyingSource1);
    var underlyingSource2 = Object.create(Object.prototype);
    createDataProperty(underlyingSource2, 'pull', pull);
    createDataProperty(underlyingSource2, 'cancel', cancel2);
    var branch2Stream = new ReadableStream(underlyingSource2);
    pull._branch1 = branch1Stream._readableStreamController;
    pull._branch2 = branch2Stream._readableStreamController;

    reader._closedPromise.catch(function (r) {
      if (teeState.closedOrErrored === true) {
        return;
      }

      ReadableStreamDefaultControllerError(pull._branch1, r);
      ReadableStreamDefaultControllerError(pull._branch2, r);
      teeState.closedOrErrored = true;
    });

    return [branch1Stream, branch2Stream];
  }

  function create_ReadableStreamTeePullFunction() {
    function f() {
      var reader = f._reader,
          branch1 = f._branch1,
          branch2 = f._branch2,
          teeState = f._teeState;
      return ReadableStreamDefaultReaderRead(reader).then(function (result) {
        assert(typeIsObject(result));
        var value = result.value;
        var done = result.done;
        assert(typeof done === 'boolean');

        if (done === true && teeState.closedOrErrored === false) {
          if (teeState.canceled1 === false) {
            ReadableStreamDefaultControllerClose(branch1);
          }

          if (teeState.canceled2 === false) {
            ReadableStreamDefaultControllerClose(branch2);
          }

          teeState.closedOrErrored = true;
        }

        if (teeState.closedOrErrored === true) {
          return;
        }

        var value1 = value;
        var value2 = value;

        if (teeState.canceled1 === false) {
          ReadableStreamDefaultControllerEnqueue(branch1, value1);
        }

        if (teeState.canceled2 === false) {
          ReadableStreamDefaultControllerEnqueue(branch2, value2);
        }
      });
    }

    return f;
  }

  function create_ReadableStreamTeeBranch1CancelFunction() {
    function f(reason) {
      var stream = f._stream,
          teeState = f._teeState;
      teeState.canceled1 = true;
      teeState.reason1 = reason;

      if (teeState.canceled2 === true) {
        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);
        var cancelResult = ReadableStreamCancel(stream, compositeReason);

        teeState._resolve(cancelResult);
      }

      return teeState.promise;
    }

    return f;
  }

  function create_ReadableStreamTeeBranch2CancelFunction() {
    function f(reason) {
      var stream = f._stream,
          teeState = f._teeState;
      teeState.canceled2 = true;
      teeState.reason2 = reason;

      if (teeState.canceled1 === true) {
        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);
        var cancelResult = ReadableStreamCancel(stream, compositeReason);

        teeState._resolve(cancelResult);
      }

      return teeState.promise;
    }

    return f;
  }

  function ReadableStreamAddReadIntoRequest(stream) {
    assert(IsReadableStreamBYOBReader(stream._reader) === true);
    assert(stream._state === 'readable' || stream._state === 'closed');
    var promise = new Promise(function (resolve, reject) {
      var readIntoRequest = {
        _resolve: resolve,
        _reject: reject
      };

      stream._reader._readIntoRequests.push(readIntoRequest);
    });
    return promise;
  }

  function ReadableStreamAddReadRequest(stream) {
    assert(IsReadableStreamDefaultReader(stream._reader) === true);
    assert(stream._state === 'readable');
    var promise = new Promise(function (resolve, reject) {
      var readRequest = {
        _resolve: resolve,
        _reject: reject
      };

      stream._reader._readRequests.push(readRequest);
    });
    return promise;
  }

  function ReadableStreamCancel(stream, reason) {
    stream._disturbed = true;

    if (stream._state === 'closed') {
      return Promise.resolve(undefined);
    }

    if (stream._state === 'errored') {
      return Promise.reject(stream._storedError);
    }

    ReadableStreamClose(stream);

    var sourceCancelPromise = stream._readableStreamController.__cancelSteps(reason);

    return sourceCancelPromise.then(function () {
      return undefined;
    });
  }

  function ReadableStreamClose(stream) {
    assert(stream._state === 'readable');
    stream._state = 'closed';
    var reader = stream._reader;

    if (reader === undefined) {
      return undefined;
    }

    if (IsReadableStreamDefaultReader(reader) === true) {
      for (var i = 0; i < reader._readRequests.length; i++) {
        var _resolve = reader._readRequests[i]._resolve;

        _resolve(CreateIterResultObject(undefined, true));
      }

      reader._readRequests = [];
    }

    defaultReaderClosedPromiseResolve(reader);
    return undefined;
  }

  function ReadableStreamError(stream, e) {
    assert(IsReadableStream(stream) === true, 'stream must be ReadableStream');
    assert(stream._state === 'readable', 'state must be readable');
    stream._state = 'errored';
    stream._storedError = e;
    var reader = stream._reader;

    if (reader === undefined) {
      return undefined;
    }

    if (IsReadableStreamDefaultReader(reader) === true) {
      for (var i = 0; i < reader._readRequests.length; i++) {
        var readRequest = reader._readRequests[i];

        readRequest._reject(e);
      }

      reader._readRequests = [];
    } else {
      assert(IsReadableStreamBYOBReader(reader), 'reader must be ReadableStreamBYOBReader');

      for (var _i = 0; _i < reader._readIntoRequests.length; _i++) {
        var readIntoRequest = reader._readIntoRequests[_i];

        readIntoRequest._reject(e);
      }

      reader._readIntoRequests = [];
    }

    defaultReaderClosedPromiseReject(reader, e);

    reader._closedPromise.catch(function () {});
  }

  function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) {
    var reader = stream._reader;
    assert(reader._readIntoRequests.length > 0);

    var readIntoRequest = reader._readIntoRequests.shift();

    readIntoRequest._resolve(CreateIterResultObject(chunk, done));
  }

  function ReadableStreamFulfillReadRequest(stream, chunk, done) {
    var reader = stream._reader;
    assert(reader._readRequests.length > 0);

    var readRequest = reader._readRequests.shift();

    readRequest._resolve(CreateIterResultObject(chunk, done));
  }

  function ReadableStreamGetNumReadIntoRequests(stream) {
    return stream._reader._readIntoRequests.length;
  }

  function ReadableStreamGetNumReadRequests(stream) {
    return stream._reader._readRequests.length;
  }

  function ReadableStreamHasBYOBReader(stream) {
    var reader = stream._reader;

    if (reader === undefined) {
      return false;
    }

    if (IsReadableStreamBYOBReader(reader) === false) {
      return false;
    }

    return true;
  }

  function ReadableStreamHasDefaultReader(stream) {
    var reader = stream._reader;

    if (reader === undefined) {
      return false;
    }

    if (IsReadableStreamDefaultReader(reader) === false) {
      return false;
    }

    return true;
  }

  var ReadableStreamDefaultReader = function () {
    function ReadableStreamDefaultReader(stream) {
      _classCallCheck(this, ReadableStreamDefaultReader);

      if (IsReadableStream(stream) === false) {
        throw new TypeError('ReadableStreamDefaultReader can only be constructed with a ReadableStream instance');
      }

      if (IsReadableStreamLocked(stream) === true) {
        throw new TypeError('This stream has already been locked for exclusive reading by another reader');
      }

      ReadableStreamReaderGenericInitialize(this, stream);
      this._readRequests = [];
    }

    _createClass(ReadableStreamDefaultReader, [{
      key: 'cancel',
      value: function cancel(reason) {
        if (IsReadableStreamDefaultReader(this) === false) {
          return Promise.reject(defaultReaderBrandCheckException('cancel'));
        }

        if (this._ownerReadableStream === undefined) {
          return Promise.reject(readerLockException('cancel'));
        }

        return ReadableStreamReaderGenericCancel(this, reason);
      }
    }, {
      key: 'read',
      value: function read() {
        if (IsReadableStreamDefaultReader(this) === false) {
          return Promise.reject(defaultReaderBrandCheckException('read'));
        }

        if (this._ownerReadableStream === undefined) {
          return Promise.reject(readerLockException('read from'));
        }

        return ReadableStreamDefaultReaderRead(this);
      }
    }, {
      key: 'releaseLock',
      value: function releaseLock() {
        if (IsReadableStreamDefaultReader(this) === false) {
          throw defaultReaderBrandCheckException('releaseLock');
        }

        if (this._ownerReadableStream === undefined) {
          return;
        }

        if (this._readRequests.length > 0) {
          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');
        }

        ReadableStreamReaderGenericRelease(this);
      }
    }, {
      key: 'closed',
      get: function get() {
        if (IsReadableStreamDefaultReader(this) === false) {
          return Promise.reject(defaultReaderBrandCheckException('closed'));
        }

        return this._closedPromise;
      }
    }]);

    return ReadableStreamDefaultReader;
  }();

  var ReadableStreamBYOBReader = function () {
    function ReadableStreamBYOBReader(stream) {
      _classCallCheck(this, ReadableStreamBYOBReader);

      if (!IsReadableStream(stream)) {
        throw new TypeError('ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a ' + 'byte source');
      }

      if (IsReadableByteStreamController(stream._readableStreamController) === false) {
        throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + 'source');
      }

      if (IsReadableStreamLocked(stream)) {
        throw new TypeError('This stream has already been locked for exclusive reading by another reader');
      }

      ReadableStreamReaderGenericInitialize(this, stream);
      this._readIntoRequests = [];
    }

    _createClass(ReadableStreamBYOBReader, [{
      key: 'cancel',
      value: function cancel(reason) {
        if (!IsReadableStreamBYOBReader(this)) {
          return Promise.reject(byobReaderBrandCheckException('cancel'));
        }

        if (this._ownerReadableStream === undefined) {
          return Promise.reject(readerLockException('cancel'));
        }

        return ReadableStreamReaderGenericCancel(this, reason);
      }
    }, {
      key: 'read',
      value: function read(view) {
        if (!IsReadableStreamBYOBReader(this)) {
          return Promise.reject(byobReaderBrandCheckException('read'));
        }

        if (this._ownerReadableStream === undefined) {
          return Promise.reject(readerLockException('read from'));
        }

        if (!ArrayBuffer.isView(view)) {
          return Promise.reject(new TypeError('view must be an array buffer view'));
        }

        if (view.byteLength === 0) {
          return Promise.reject(new TypeError('view must have non-zero byteLength'));
        }

        return ReadableStreamBYOBReaderRead(this, view);
      }
    }, {
      key: 'releaseLock',
      value: function releaseLock() {
        if (!IsReadableStreamBYOBReader(this)) {
          throw byobReaderBrandCheckException('releaseLock');
        }

        if (this._ownerReadableStream === undefined) {
          return;
        }

        if (this._readIntoRequests.length > 0) {
          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');
        }

        ReadableStreamReaderGenericRelease(this);
      }
    }, {
      key: 'closed',
      get: function get() {
        if (!IsReadableStreamBYOBReader(this)) {
          return Promise.reject(byobReaderBrandCheckException('closed'));
        }

        return this._closedPromise;
      }
    }]);

    return ReadableStreamBYOBReader;
  }();

  function IsReadableStreamBYOBReader(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) {
      return false;
    }

    return true;
  }

  function IsReadableStreamDefaultReader(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) {
      return false;
    }

    return true;
  }

  function ReadableStreamReaderGenericInitialize(reader, stream) {
    reader._ownerReadableStream = stream;
    stream._reader = reader;

    if (stream._state === 'readable') {
      defaultReaderClosedPromiseInitialize(reader);
    } else if (stream._state === 'closed') {
      defaultReaderClosedPromiseInitializeAsResolved(reader);
    } else {
      assert(stream._state === 'errored', 'state must be errored');
      defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError);

      reader._closedPromise.catch(function () {});
    }
  }

  function ReadableStreamReaderGenericCancel(reader, reason) {
    var stream = reader._ownerReadableStream;
    assert(stream !== undefined);
    return ReadableStreamCancel(stream, reason);
  }

  function ReadableStreamReaderGenericRelease(reader) {
    assert(reader._ownerReadableStream !== undefined);
    assert(reader._ownerReadableStream._reader === reader);

    if (reader._ownerReadableStream._state === 'readable') {
      defaultReaderClosedPromiseReject(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness'));
    } else {
      defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness'));
    }

    reader._closedPromise.catch(function () {});

    reader._ownerReadableStream._reader = undefined;
    reader._ownerReadableStream = undefined;
  }

  function ReadableStreamBYOBReaderRead(reader, view) {
    var stream = reader._ownerReadableStream;
    assert(stream !== undefined);
    stream._disturbed = true;

    if (stream._state === 'errored') {
      return Promise.reject(stream._storedError);
    }

    return ReadableByteStreamControllerPullInto(stream._readableStreamController, view);
  }

  function ReadableStreamDefaultReaderRead(reader) {
    var stream = reader._ownerReadableStream;
    assert(stream !== undefined);
    stream._disturbed = true;

    if (stream._state === 'closed') {
      return Promise.resolve(CreateIterResultObject(undefined, true));
    }

    if (stream._state === 'errored') {
      return Promise.reject(stream._storedError);
    }

    assert(stream._state === 'readable');
    return stream._readableStreamController.__pullSteps();
  }

  var ReadableStreamDefaultController = function () {
    function ReadableStreamDefaultController(stream, underlyingSource, size, highWaterMark) {
      _classCallCheck(this, ReadableStreamDefaultController);

      if (IsReadableStream(stream) === false) {
        throw new TypeError('ReadableStreamDefaultController can only be constructed with a ReadableStream instance');
      }

      if (stream._readableStreamController !== undefined) {
        throw new TypeError('ReadableStreamDefaultController instances can only be created by the ReadableStream constructor');
      }

      this._controlledReadableStream = stream;
      this._underlyingSource = underlyingSource;
      this._queue = undefined;
      this._queueTotalSize = undefined;
      ResetQueue(this);
      this._started = false;
      this._closeRequested = false;
      this._pullAgain = false;
      this._pulling = false;
      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);
      this._strategySize = normalizedStrategy.size;
      this._strategyHWM = normalizedStrategy.highWaterMark;
      var controller = this;
      var startResult = InvokeOrNoop(underlyingSource, 'start', [this]);
      Promise.resolve(startResult).then(function () {
        controller._started = true;
        assert(controller._pulling === false);
        assert(controller._pullAgain === false);
        ReadableStreamDefaultControllerCallPullIfNeeded(controller);
      }, function (r) {
        ReadableStreamDefaultControllerErrorIfNeeded(controller, r);
      }).catch(rethrowAssertionErrorRejection);
    }

    _createClass(ReadableStreamDefaultController, [{
      key: 'close',
      value: function close() {
        if (IsReadableStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('close');
        }

        if (this._closeRequested === true) {
          throw new TypeError('The stream has already been closed; do not close it again!');
        }

        var state = this._controlledReadableStream._state;

        if (state !== 'readable') {
          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');
        }

        ReadableStreamDefaultControllerClose(this);
      }
    }, {
      key: 'enqueue',
      value: function enqueue(chunk) {
        if (IsReadableStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('enqueue');
        }

        if (this._closeRequested === true) {
          throw new TypeError('stream is closed or draining');
        }

        var state = this._controlledReadableStream._state;

        if (state !== 'readable') {
          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');
        }

        return ReadableStreamDefaultControllerEnqueue(this, chunk);
      }
    }, {
      key: 'error',
      value: function error(e) {
        if (IsReadableStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('error');
        }

        var stream = this._controlledReadableStream;

        if (stream._state !== 'readable') {
          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');
        }

        ReadableStreamDefaultControllerError(this, e);
      }
    }, {
      key: '__cancelSteps',
      value: function __cancelSteps(reason) {
        ResetQueue(this);
        return PromiseInvokeOrNoop(this._underlyingSource, 'cancel', [reason]);
      }
    }, {
      key: '__pullSteps',
      value: function __pullSteps() {
        var stream = this._controlledReadableStream;

        if (this._queue.length > 0) {
          var chunk = DequeueValue(this);

          if (this._closeRequested === true && this._queue.length === 0) {
            ReadableStreamClose(stream);
          } else {
            ReadableStreamDefaultControllerCallPullIfNeeded(this);
          }

          return Promise.resolve(CreateIterResultObject(chunk, false));
        }

        var pendingPromise = ReadableStreamAddReadRequest(stream);
        ReadableStreamDefaultControllerCallPullIfNeeded(this);
        return pendingPromise;
      }
    }, {
      key: 'desiredSize',
      get: function get() {
        if (IsReadableStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('desiredSize');
        }

        return ReadableStreamDefaultControllerGetDesiredSize(this);
      }
    }]);

    return ReadableStreamDefaultController;
  }();

  function IsReadableStreamDefaultController(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSource')) {
      return false;
    }

    return true;
  }

  function ReadableStreamDefaultControllerCallPullIfNeeded(controller) {
    var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller);

    if (shouldPull === false) {
      return undefined;
    }

    if (controller._pulling === true) {
      controller._pullAgain = true;
      return undefined;
    }

    assert(controller._pullAgain === false);
    controller._pulling = true;
    var pullPromise = PromiseInvokeOrNoop(controller._underlyingSource, 'pull', [controller]);
    pullPromise.then(function () {
      controller._pulling = false;

      if (controller._pullAgain === true) {
        controller._pullAgain = false;
        return ReadableStreamDefaultControllerCallPullIfNeeded(controller);
      }

      return undefined;
    }, function (e) {
      ReadableStreamDefaultControllerErrorIfNeeded(controller, e);
    }).catch(rethrowAssertionErrorRejection);
    return undefined;
  }

  function ReadableStreamDefaultControllerShouldCallPull(controller) {
    var stream = controller._controlledReadableStream;

    if (stream._state === 'closed' || stream._state === 'errored') {
      return false;
    }

    if (controller._closeRequested === true) {
      return false;
    }

    if (controller._started === false) {
      return false;
    }

    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
      return true;
    }

    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);

    if (desiredSize > 0) {
      return true;
    }

    return false;
  }

  function ReadableStreamDefaultControllerClose(controller) {
    var stream = controller._controlledReadableStream;
    assert(controller._closeRequested === false);
    assert(stream._state === 'readable');
    controller._closeRequested = true;

    if (controller._queue.length === 0) {
      ReadableStreamClose(stream);
    }
  }

  function ReadableStreamDefaultControllerEnqueue(controller, chunk) {
    var stream = controller._controlledReadableStream;
    assert(controller._closeRequested === false);
    assert(stream._state === 'readable');

    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
      ReadableStreamFulfillReadRequest(stream, chunk, false);
    } else {
      var chunkSize = 1;

      if (controller._strategySize !== undefined) {
        var strategySize = controller._strategySize;

        try {
          chunkSize = strategySize(chunk);
        } catch (chunkSizeE) {
          ReadableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);
          throw chunkSizeE;
        }
      }

      try {
        EnqueueValueWithSize(controller, chunk, chunkSize);
      } catch (enqueueE) {
        ReadableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);
        throw enqueueE;
      }
    }

    ReadableStreamDefaultControllerCallPullIfNeeded(controller);
    return undefined;
  }

  function ReadableStreamDefaultControllerError(controller, e) {
    var stream = controller._controlledReadableStream;
    assert(stream._state === 'readable');
    ResetQueue(controller);
    ReadableStreamError(stream, e);
  }

  function ReadableStreamDefaultControllerErrorIfNeeded(controller, e) {
    if (controller._controlledReadableStream._state === 'readable') {
      ReadableStreamDefaultControllerError(controller, e);
    }
  }

  function ReadableStreamDefaultControllerGetDesiredSize(controller) {
    var stream = controller._controlledReadableStream;
    var state = stream._state;

    if (state === 'errored') {
      return null;
    }

    if (state === 'closed') {
      return 0;
    }

    return controller._strategyHWM - controller._queueTotalSize;
  }

  var ReadableStreamBYOBRequest = function () {
    function ReadableStreamBYOBRequest(controller, view) {
      _classCallCheck(this, ReadableStreamBYOBRequest);

      this._associatedReadableByteStreamController = controller;
      this._view = view;
    }

    _createClass(ReadableStreamBYOBRequest, [{
      key: 'respond',
      value: function respond(bytesWritten) {
        if (IsReadableStreamBYOBRequest(this) === false) {
          throw byobRequestBrandCheckException('respond');
        }

        if (this._associatedReadableByteStreamController === undefined) {
          throw new TypeError('This BYOB request has been invalidated');
        }

        ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten);
      }
    }, {
      key: 'respondWithNewView',
      value: function respondWithNewView(view) {
        if (IsReadableStreamBYOBRequest(this) === false) {
          throw byobRequestBrandCheckException('respond');
        }

        if (this._associatedReadableByteStreamController === undefined) {
          throw new TypeError('This BYOB request has been invalidated');
        }

        if (!ArrayBuffer.isView(view)) {
          throw new TypeError('You can only respond with array buffer views');
        }

        ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view);
      }
    }, {
      key: 'view',
      get: function get() {
        return this._view;
      }
    }]);

    return ReadableStreamBYOBRequest;
  }();

  var ReadableByteStreamController = function () {
    function ReadableByteStreamController(stream, underlyingByteSource, highWaterMark) {
      _classCallCheck(this, ReadableByteStreamController);

      if (IsReadableStream(stream) === false) {
        throw new TypeError('ReadableByteStreamController can only be constructed with a ReadableStream instance given ' + 'a byte source');
      }

      if (stream._readableStreamController !== undefined) {
        throw new TypeError('ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte ' + 'source');
      }

      this._controlledReadableStream = stream;
      this._underlyingByteSource = underlyingByteSource;
      this._pullAgain = false;
      this._pulling = false;
      ReadableByteStreamControllerClearPendingPullIntos(this);
      this._queue = this._queueTotalSize = undefined;
      ResetQueue(this);
      this._closeRequested = false;
      this._started = false;
      this._strategyHWM = ValidateAndNormalizeHighWaterMark(highWaterMark);
      var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize;

      if (autoAllocateChunkSize !== undefined) {
        if (Number.isInteger(autoAllocateChunkSize) === false || autoAllocateChunkSize <= 0) {
          throw new RangeError('autoAllocateChunkSize must be a positive integer');
        }
      }

      this._autoAllocateChunkSize = autoAllocateChunkSize;
      this._pendingPullIntos = [];
      var controller = this;
      var startResult = InvokeOrNoop(underlyingByteSource, 'start', [this]);
      Promise.resolve(startResult).then(function () {
        controller._started = true;
        assert(controller._pulling === false);
        assert(controller._pullAgain === false);
        ReadableByteStreamControllerCallPullIfNeeded(controller);
      }, function (r) {
        if (stream._state === 'readable') {
          ReadableByteStreamControllerError(controller, r);
        }
      }).catch(rethrowAssertionErrorRejection);
    }

    _createClass(ReadableByteStreamController, [{
      key: 'close',
      value: function close() {
        if (IsReadableByteStreamController(this) === false) {
          throw byteStreamControllerBrandCheckException('close');
        }

        if (this._closeRequested === true) {
          throw new TypeError('The stream has already been closed; do not close it again!');
        }

        var state = this._controlledReadableStream._state;

        if (state !== 'readable') {
          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');
        }

        ReadableByteStreamControllerClose(this);
      }
    }, {
      key: 'enqueue',
      value: function enqueue(chunk) {
        if (IsReadableByteStreamController(this) === false) {
          throw byteStreamControllerBrandCheckException('enqueue');
        }

        if (this._closeRequested === true) {
          throw new TypeError('stream is closed or draining');
        }

        var state = this._controlledReadableStream._state;

        if (state !== 'readable') {
          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');
        }

        if (!ArrayBuffer.isView(chunk)) {
          throw new TypeError('You can only enqueue array buffer views when using a ReadableByteStreamController');
        }

        ReadableByteStreamControllerEnqueue(this, chunk);
      }
    }, {
      key: 'error',
      value: function error(e) {
        if (IsReadableByteStreamController(this) === false) {
          throw byteStreamControllerBrandCheckException('error');
        }

        var stream = this._controlledReadableStream;

        if (stream._state !== 'readable') {
          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');
        }

        ReadableByteStreamControllerError(this, e);
      }
    }, {
      key: '__cancelSteps',
      value: function __cancelSteps(reason) {
        if (this._pendingPullIntos.length > 0) {
          var firstDescriptor = this._pendingPullIntos[0];
          firstDescriptor.bytesFilled = 0;
        }

        ResetQueue(this);
        return PromiseInvokeOrNoop(this._underlyingByteSource, 'cancel', [reason]);
      }
    }, {
      key: '__pullSteps',
      value: function __pullSteps() {
        var stream = this._controlledReadableStream;
        assert(ReadableStreamHasDefaultReader(stream) === true);

        if (this._queueTotalSize > 0) {
          assert(ReadableStreamGetNumReadRequests(stream) === 0);

          var entry = this._queue.shift();

          this._queueTotalSize -= entry.byteLength;
          ReadableByteStreamControllerHandleQueueDrain(this);
          var view = void 0;

          try {
            view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength);
          } catch (viewE) {
            return Promise.reject(viewE);
          }

          return Promise.resolve(CreateIterResultObject(view, false));
        }

        var autoAllocateChunkSize = this._autoAllocateChunkSize;

        if (autoAllocateChunkSize !== undefined) {
          var buffer = void 0;

          try {
            buffer = new ArrayBuffer(autoAllocateChunkSize);
          } catch (bufferE) {
            return Promise.reject(bufferE);
          }

          var pullIntoDescriptor = {
            buffer: buffer,
            byteOffset: 0,
            byteLength: autoAllocateChunkSize,
            bytesFilled: 0,
            elementSize: 1,
            ctor: Uint8Array,
            readerType: 'default'
          };

          this._pendingPullIntos.push(pullIntoDescriptor);
        }

        var promise = ReadableStreamAddReadRequest(stream);
        ReadableByteStreamControllerCallPullIfNeeded(this);
        return promise;
      }
    }, {
      key: 'byobRequest',
      get: function get() {
        if (IsReadableByteStreamController(this) === false) {
          throw byteStreamControllerBrandCheckException('byobRequest');
        }

        if (this._byobRequest === undefined && this._pendingPullIntos.length > 0) {
          var firstDescriptor = this._pendingPullIntos[0];
          var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled);
          this._byobRequest = new ReadableStreamBYOBRequest(this, view);
        }

        return this._byobRequest;
      }
    }, {
      key: 'desiredSize',
      get: function get() {
        if (IsReadableByteStreamController(this) === false) {
          throw byteStreamControllerBrandCheckException('desiredSize');
        }

        return ReadableByteStreamControllerGetDesiredSize(this);
      }
    }]);

    return ReadableByteStreamController;
  }();

  function IsReadableByteStreamController(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingByteSource')) {
      return false;
    }

    return true;
  }

  function IsReadableStreamBYOBRequest(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) {
      return false;
    }

    return true;
  }

  function ReadableByteStreamControllerCallPullIfNeeded(controller) {
    var shouldPull = ReadableByteStreamControllerShouldCallPull(controller);

    if (shouldPull === false) {
      return undefined;
    }

    if (controller._pulling === true) {
      controller._pullAgain = true;
      return undefined;
    }

    assert(controller._pullAgain === false);
    controller._pulling = true;
    var pullPromise = PromiseInvokeOrNoop(controller._underlyingByteSource, 'pull', [controller]);
    pullPromise.then(function () {
      controller._pulling = false;

      if (controller._pullAgain === true) {
        controller._pullAgain = false;
        ReadableByteStreamControllerCallPullIfNeeded(controller);
      }
    }, function (e) {
      if (controller._controlledReadableStream._state === 'readable') {
        ReadableByteStreamControllerError(controller, e);
      }
    }).catch(rethrowAssertionErrorRejection);
    return undefined;
  }

  function ReadableByteStreamControllerClearPendingPullIntos(controller) {
    ReadableByteStreamControllerInvalidateBYOBRequest(controller);
    controller._pendingPullIntos = [];
  }

  function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) {
    assert(stream._state !== 'errored', 'state must not be errored');
    var done = false;

    if (stream._state === 'closed') {
      assert(pullIntoDescriptor.bytesFilled === 0);
      done = true;
    }

    var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);

    if (pullIntoDescriptor.readerType === 'default') {
      ReadableStreamFulfillReadRequest(stream, filledView, done);
    } else {
      assert(pullIntoDescriptor.readerType === 'byob');
      ReadableStreamFulfillReadIntoRequest(stream, filledView, done);
    }
  }

  function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) {
    var bytesFilled = pullIntoDescriptor.bytesFilled;
    var elementSize = pullIntoDescriptor.elementSize;
    assert(bytesFilled <= pullIntoDescriptor.byteLength);
    assert(bytesFilled % elementSize === 0);
    return new pullIntoDescriptor.ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize);
  }

  function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) {
    controller._queue.push({
      buffer: buffer,
      byteOffset: byteOffset,
      byteLength: byteLength
    });

    controller._queueTotalSize += byteLength;
  }

  function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) {
    var elementSize = pullIntoDescriptor.elementSize;
    var currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize;
    var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled);
    var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy;
    var maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize;
    var totalBytesToCopyRemaining = maxBytesToCopy;
    var ready = false;

    if (maxAlignedBytes > currentAlignedBytes) {
      totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled;
      ready = true;
    }

    var queue = controller._queue;

    while (totalBytesToCopyRemaining > 0) {
      var headOfQueue = queue[0];
      var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength);
      var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
      ArrayBufferCopy(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy);

      if (headOfQueue.byteLength === bytesToCopy) {
        queue.shift();
      } else {
        headOfQueue.byteOffset += bytesToCopy;
        headOfQueue.byteLength -= bytesToCopy;
      }

      controller._queueTotalSize -= bytesToCopy;
      ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor);
      totalBytesToCopyRemaining -= bytesToCopy;
    }

    if (ready === false) {
      assert(controller._queueTotalSize === 0, 'queue must be empty');
      assert(pullIntoDescriptor.bytesFilled > 0);
      assert(pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize);
    }

    return ready;
  }

  function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) {
    assert(controller._pendingPullIntos.length === 0 || controller._pendingPullIntos[0] === pullIntoDescriptor);
    ReadableByteStreamControllerInvalidateBYOBRequest(controller);
    pullIntoDescriptor.bytesFilled += size;
  }

  function ReadableByteStreamControllerHandleQueueDrain(controller) {
    assert(controller._controlledReadableStream._state === 'readable');

    if (controller._queueTotalSize === 0 && controller._closeRequested === true) {
      ReadableStreamClose(controller._controlledReadableStream);
    } else {
      ReadableByteStreamControllerCallPullIfNeeded(controller);
    }
  }

  function ReadableByteStreamControllerInvalidateBYOBRequest(controller) {
    if (controller._byobRequest === undefined) {
      return;
    }

    controller._byobRequest._associatedReadableByteStreamController = undefined;
    controller._byobRequest._view = undefined;
    controller._byobRequest = undefined;
  }

  function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) {
    assert(controller._closeRequested === false);

    while (controller._pendingPullIntos.length > 0) {
      if (controller._queueTotalSize === 0) {
        return;
      }

      var pullIntoDescriptor = controller._pendingPullIntos[0];

      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {
        ReadableByteStreamControllerShiftPendingPullInto(controller);
        ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);
      }
    }
  }

  function ReadableByteStreamControllerPullInto(controller, view) {
    var stream = controller._controlledReadableStream;
    var elementSize = 1;

    if (view.constructor !== DataView) {
      elementSize = view.constructor.BYTES_PER_ELEMENT;
    }

    var ctor = view.constructor;
    var pullIntoDescriptor = {
      buffer: view.buffer,
      byteOffset: view.byteOffset,
      byteLength: view.byteLength,
      bytesFilled: 0,
      elementSize: elementSize,
      ctor: ctor,
      readerType: 'byob'
    };

    if (controller._pendingPullIntos.length > 0) {
      pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);

      controller._pendingPullIntos.push(pullIntoDescriptor);

      return ReadableStreamAddReadIntoRequest(stream);
    }

    if (stream._state === 'closed') {
      var emptyView = new view.constructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0);
      return Promise.resolve(CreateIterResultObject(emptyView, true));
    }

    if (controller._queueTotalSize > 0) {
      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {
        var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);
        ReadableByteStreamControllerHandleQueueDrain(controller);
        return Promise.resolve(CreateIterResultObject(filledView, false));
      }

      if (controller._closeRequested === true) {
        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
        ReadableByteStreamControllerError(controller, e);
        return Promise.reject(e);
      }
    }

    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);

    controller._pendingPullIntos.push(pullIntoDescriptor);

    var promise = ReadableStreamAddReadIntoRequest(stream);
    ReadableByteStreamControllerCallPullIfNeeded(controller);
    return promise;
  }

  function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) {
    firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer);
    assert(firstDescriptor.bytesFilled === 0, 'bytesFilled must be 0');
    var stream = controller._controlledReadableStream;

    if (ReadableStreamHasBYOBReader(stream) === true) {
      while (ReadableStreamGetNumReadIntoRequests(stream) > 0) {
        var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller);
        ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor);
      }
    }
  }

  function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) {
    if (pullIntoDescriptor.bytesFilled + bytesWritten > pullIntoDescriptor.byteLength) {
      throw new RangeError('bytesWritten out of range');
    }

    ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor);

    if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) {
      return;
    }

    ReadableByteStreamControllerShiftPendingPullInto(controller);
    var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize;

    if (remainderSize > 0) {
      var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
      var remainder = pullIntoDescriptor.buffer.slice(end - remainderSize, end);
      ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength);
    }

    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
    pullIntoDescriptor.bytesFilled -= remainderSize;
    ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);
    ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
  }

  function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) {
    var firstDescriptor = controller._pendingPullIntos[0];
    var stream = controller._controlledReadableStream;

    if (stream._state === 'closed') {
      if (bytesWritten !== 0) {
        throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream');
      }

      ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor);
    } else {
      assert(stream._state === 'readable');
      ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor);
    }
  }

  function ReadableByteStreamControllerShiftPendingPullInto(controller) {
    var descriptor = controller._pendingPullIntos.shift();

    ReadableByteStreamControllerInvalidateBYOBRequest(controller);
    return descriptor;
  }

  function ReadableByteStreamControllerShouldCallPull(controller) {
    var stream = controller._controlledReadableStream;

    if (stream._state !== 'readable') {
      return false;
    }

    if (controller._closeRequested === true) {
      return false;
    }

    if (controller._started === false) {
      return false;
    }

    if (ReadableStreamHasDefaultReader(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
      return true;
    }

    if (ReadableStreamHasBYOBReader(stream) === true && ReadableStreamGetNumReadIntoRequests(stream) > 0) {
      return true;
    }

    if (ReadableByteStreamControllerGetDesiredSize(controller) > 0) {
      return true;
    }

    return false;
  }

  function ReadableByteStreamControllerClose(controller) {
    var stream = controller._controlledReadableStream;
    assert(controller._closeRequested === false);
    assert(stream._state === 'readable');

    if (controller._queueTotalSize > 0) {
      controller._closeRequested = true;
      return;
    }

    if (controller._pendingPullIntos.length > 0) {
      var firstPendingPullInto = controller._pendingPullIntos[0];

      if (firstPendingPullInto.bytesFilled > 0) {
        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
        ReadableByteStreamControllerError(controller, e);
        throw e;
      }
    }

    ReadableStreamClose(stream);
  }

  function ReadableByteStreamControllerEnqueue(controller, chunk) {
    var stream = controller._controlledReadableStream;
    assert(controller._closeRequested === false);
    assert(stream._state === 'readable');
    var buffer = chunk.buffer;
    var byteOffset = chunk.byteOffset;
    var byteLength = chunk.byteLength;
    var transferredBuffer = TransferArrayBuffer(buffer);

    if (ReadableStreamHasDefaultReader(stream) === true) {
      if (ReadableStreamGetNumReadRequests(stream) === 0) {
        ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
      } else {
        assert(controller._queue.length === 0);
        var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength);
        ReadableStreamFulfillReadRequest(stream, transferredView, false);
      }
    } else if (ReadableStreamHasBYOBReader(stream) === true) {
      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
      ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
    } else {
      assert(IsReadableStreamLocked(stream) === false, 'stream must not be locked');
      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
    }
  }

  function ReadableByteStreamControllerError(controller, e) {
    var stream = controller._controlledReadableStream;
    assert(stream._state === 'readable');
    ReadableByteStreamControllerClearPendingPullIntos(controller);
    ResetQueue(controller);
    ReadableStreamError(stream, e);
  }

  function ReadableByteStreamControllerGetDesiredSize(controller) {
    var stream = controller._controlledReadableStream;
    var state = stream._state;

    if (state === 'errored') {
      return null;
    }

    if (state === 'closed') {
      return 0;
    }

    return controller._strategyHWM - controller._queueTotalSize;
  }

  function ReadableByteStreamControllerRespond(controller, bytesWritten) {
    bytesWritten = Number(bytesWritten);

    if (IsFiniteNonNegativeNumber(bytesWritten) === false) {
      throw new RangeError('bytesWritten must be a finite');
    }

    assert(controller._pendingPullIntos.length > 0);
    ReadableByteStreamControllerRespondInternal(controller, bytesWritten);
  }

  function ReadableByteStreamControllerRespondWithNewView(controller, view) {
    assert(controller._pendingPullIntos.length > 0);
    var firstDescriptor = controller._pendingPullIntos[0];

    if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) {
      throw new RangeError('The region specified by view does not match byobRequest');
    }

    if (firstDescriptor.byteLength !== view.byteLength) {
      throw new RangeError('The buffer of view has different capacity than byobRequest');
    }

    firstDescriptor.buffer = view.buffer;
    ReadableByteStreamControllerRespondInternal(controller, view.byteLength);
  }

  function streamBrandCheckException(name) {
    return new TypeError('ReadableStream.prototype.' + name + ' can only be used on a ReadableStream');
  }

  function readerLockException(name) {
    return new TypeError('Cannot ' + name + ' a stream using a released reader');
  }

  function defaultReaderBrandCheckException(name) {
    return new TypeError('ReadableStreamDefaultReader.prototype.' + name + ' can only be used on a ReadableStreamDefaultReader');
  }

  function defaultReaderClosedPromiseInitialize(reader) {
    reader._closedPromise = new Promise(function (resolve, reject) {
      reader._closedPromise_resolve = resolve;
      reader._closedPromise_reject = reject;
    });
  }

  function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) {
    reader._closedPromise = Promise.reject(reason);
    reader._closedPromise_resolve = undefined;
    reader._closedPromise_reject = undefined;
  }

  function defaultReaderClosedPromiseInitializeAsResolved(reader) {
    reader._closedPromise = Promise.resolve(undefined);
    reader._closedPromise_resolve = undefined;
    reader._closedPromise_reject = undefined;
  }

  function defaultReaderClosedPromiseReject(reader, reason) {
    assert(reader._closedPromise_resolve !== undefined);
    assert(reader._closedPromise_reject !== undefined);

    reader._closedPromise_reject(reason);

    reader._closedPromise_resolve = undefined;
    reader._closedPromise_reject = undefined;
  }

  function defaultReaderClosedPromiseResetToRejected(reader, reason) {
    assert(reader._closedPromise_resolve === undefined);
    assert(reader._closedPromise_reject === undefined);
    reader._closedPromise = Promise.reject(reason);
  }

  function defaultReaderClosedPromiseResolve(reader) {
    assert(reader._closedPromise_resolve !== undefined);
    assert(reader._closedPromise_reject !== undefined);

    reader._closedPromise_resolve(undefined);

    reader._closedPromise_resolve = undefined;
    reader._closedPromise_reject = undefined;
  }

  function byobReaderBrandCheckException(name) {
    return new TypeError('ReadableStreamBYOBReader.prototype.' + name + ' can only be used on a ReadableStreamBYOBReader');
  }

  function defaultControllerBrandCheckException(name) {
    return new TypeError('ReadableStreamDefaultController.prototype.' + name + ' can only be used on a ReadableStreamDefaultController');
  }

  function byobRequestBrandCheckException(name) {
    return new TypeError('ReadableStreamBYOBRequest.prototype.' + name + ' can only be used on a ReadableStreamBYOBRequest');
  }

  function byteStreamControllerBrandCheckException(name) {
    return new TypeError('ReadableByteStreamController.prototype.' + name + ' can only be used on a ReadableByteStreamController');
  }

  function ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise) {
    try {
      Promise.prototype.then.call(promise, undefined, function () {});
    } catch (e) {}
  }
}, function (module, exports, __w_pdfjs_require__) {
  "use strict";

  var transformStream = __w_pdfjs_require__(6);

  var readableStream = __w_pdfjs_require__(4);

  var writableStream = __w_pdfjs_require__(2);

  exports.TransformStream = transformStream.TransformStream;
  exports.ReadableStream = readableStream.ReadableStream;
  exports.IsReadableStreamDisturbed = readableStream.IsReadableStreamDisturbed;
  exports.ReadableStreamDefaultControllerClose = readableStream.ReadableStreamDefaultControllerClose;
  exports.ReadableStreamDefaultControllerEnqueue = readableStream.ReadableStreamDefaultControllerEnqueue;
  exports.ReadableStreamDefaultControllerError = readableStream.ReadableStreamDefaultControllerError;
  exports.ReadableStreamDefaultControllerGetDesiredSize = readableStream.ReadableStreamDefaultControllerGetDesiredSize;
  exports.AcquireWritableStreamDefaultWriter = writableStream.AcquireWritableStreamDefaultWriter;
  exports.IsWritableStream = writableStream.IsWritableStream;
  exports.IsWritableStreamLocked = writableStream.IsWritableStreamLocked;
  exports.WritableStream = writableStream.WritableStream;
  exports.WritableStreamAbort = writableStream.WritableStreamAbort;
  exports.WritableStreamDefaultControllerError = writableStream.WritableStreamDefaultControllerError;
  exports.WritableStreamDefaultWriterCloseWithErrorPropagation = writableStream.WritableStreamDefaultWriterCloseWithErrorPropagation;
  exports.WritableStreamDefaultWriterRelease = writableStream.WritableStreamDefaultWriterRelease;
  exports.WritableStreamDefaultWriterWrite = writableStream.WritableStreamDefaultWriterWrite;
}, function (module, exports, __w_pdfjs_require__) {
  "use strict";

  var _createClass = function () {
    function defineProperties(target, props) {
      for (var i = 0; i < props.length; i++) {
        var descriptor = props[i];
        descriptor.enumerable = descriptor.enumerable || false;
        descriptor.configurable = true;
        if ("value" in descriptor) descriptor.writable = true;
        Object.defineProperty(target, descriptor.key, descriptor);
      }
    }

    return function (Constructor, protoProps, staticProps) {
      if (protoProps) defineProperties(Constructor.prototype, protoProps);
      if (staticProps) defineProperties(Constructor, staticProps);
      return Constructor;
    };
  }();

  function _classCallCheck(instance, Constructor) {
    if (!(instance instanceof Constructor)) {
      throw new TypeError("Cannot call a class as a function");
    }
  }

  var _require = __w_pdfjs_require__(1),
      assert = _require.assert;

  var _require2 = __w_pdfjs_require__(0),
      InvokeOrNoop = _require2.InvokeOrNoop,
      PromiseInvokeOrPerformFallback = _require2.PromiseInvokeOrPerformFallback,
      PromiseInvokeOrNoop = _require2.PromiseInvokeOrNoop,
      typeIsObject = _require2.typeIsObject;

  var _require3 = __w_pdfjs_require__(4),
      ReadableStream = _require3.ReadableStream,
      ReadableStreamDefaultControllerClose = _require3.ReadableStreamDefaultControllerClose,
      ReadableStreamDefaultControllerEnqueue = _require3.ReadableStreamDefaultControllerEnqueue,
      ReadableStreamDefaultControllerError = _require3.ReadableStreamDefaultControllerError,
      ReadableStreamDefaultControllerGetDesiredSize = _require3.ReadableStreamDefaultControllerGetDesiredSize;

  var _require4 = __w_pdfjs_require__(2),
      WritableStream = _require4.WritableStream,
      WritableStreamDefaultControllerError = _require4.WritableStreamDefaultControllerError;

  function TransformStreamCloseReadable(transformStream) {
    if (transformStream._errored === true) {
      throw new TypeError('TransformStream is already errored');
    }

    if (transformStream._readableClosed === true) {
      throw new TypeError('Readable side is already closed');
    }

    TransformStreamCloseReadableInternal(transformStream);
  }

  function TransformStreamEnqueueToReadable(transformStream, chunk) {
    if (transformStream._errored === true) {
      throw new TypeError('TransformStream is already errored');
    }

    if (transformStream._readableClosed === true) {
      throw new TypeError('Readable side is already closed');
    }

    var controller = transformStream._readableController;

    try {
      ReadableStreamDefaultControllerEnqueue(controller, chunk);
    } catch (e) {
      transformStream._readableClosed = true;
      TransformStreamErrorIfNeeded(transformStream, e);
      throw transformStream._storedError;
    }

    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);
    var maybeBackpressure = desiredSize <= 0;

    if (maybeBackpressure === true && transformStream._backpressure === false) {
      TransformStreamSetBackpressure(transformStream, true);
    }
  }

  function TransformStreamError(transformStream, e) {
    if (transformStream._errored === true) {
      throw new TypeError('TransformStream is already errored');
    }

    TransformStreamErrorInternal(transformStream, e);
  }

  function TransformStreamCloseReadableInternal(transformStream) {
    assert(transformStream._errored === false);
    assert(transformStream._readableClosed === false);

    try {
      ReadableStreamDefaultControllerClose(transformStream._readableController);
    } catch (e) {
      assert(false);
    }

    transformStream._readableClosed = true;
  }

  function TransformStreamErrorIfNeeded(transformStream, e) {
    if (transformStream._errored === false) {
      TransformStreamErrorInternal(transformStream, e);
    }
  }

  function TransformStreamErrorInternal(transformStream, e) {
    assert(transformStream._errored === false);
    transformStream._errored = true;
    transformStream._storedError = e;

    if (transformStream._writableDone === false) {
      WritableStreamDefaultControllerError(transformStream._writableController, e);
    }

    if (transformStream._readableClosed === false) {
      ReadableStreamDefaultControllerError(transformStream._readableController, e);
    }
  }

  function TransformStreamReadableReadyPromise(transformStream) {
    assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');

    if (transformStream._backpressure === false) {
      return Promise.resolve();
    }

    assert(transformStream._backpressure === true, '_backpressure should have been initialized');
    return transformStream._backpressureChangePromise;
  }

  function TransformStreamSetBackpressure(transformStream, backpressure) {
    assert(transformStream._backpressure !== backpressure, 'TransformStreamSetBackpressure() should be called only when backpressure is changed');

    if (transformStream._backpressureChangePromise !== undefined) {
      transformStream._backpressureChangePromise_resolve(backpressure);
    }

    transformStream._backpressureChangePromise = new Promise(function (resolve) {
      transformStream._backpressureChangePromise_resolve = resolve;
    });

    transformStream._backpressureChangePromise.then(function (resolution) {
      assert(resolution !== backpressure, '_backpressureChangePromise should be fulfilled only when backpressure is changed');
    });

    transformStream._backpressure = backpressure;
  }

  function TransformStreamDefaultTransform(chunk, transformStreamController) {
    var transformStream = transformStreamController._controlledTransformStream;
    TransformStreamEnqueueToReadable(transformStream, chunk);
    return Promise.resolve();
  }

  function TransformStreamTransform(transformStream, chunk) {
    assert(transformStream._errored === false);
    assert(transformStream._transforming === false);
    assert(transformStream._backpressure === false);
    transformStream._transforming = true;
    var transformer = transformStream._transformer;
    var controller = transformStream._transformStreamController;
    var transformPromise = PromiseInvokeOrPerformFallback(transformer, 'transform', [chunk, controller], TransformStreamDefaultTransform, [chunk, controller]);
    return transformPromise.then(function () {
      transformStream._transforming = false;
      return TransformStreamReadableReadyPromise(transformStream);
    }, function (e) {
      TransformStreamErrorIfNeeded(transformStream, e);
      return Promise.reject(e);
    });
  }

  function IsTransformStreamDefaultController(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) {
      return false;
    }

    return true;
  }

  function IsTransformStream(x) {
    if (!typeIsObject(x)) {
      return false;
    }

    if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) {
      return false;
    }

    return true;
  }

  var TransformStreamSink = function () {
    function TransformStreamSink(transformStream, startPromise) {
      _classCallCheck(this, TransformStreamSink);

      this._transformStream = transformStream;
      this._startPromise = startPromise;
    }

    _createClass(TransformStreamSink, [{
      key: 'start',
      value: function start(c) {
        var transformStream = this._transformStream;
        transformStream._writableController = c;
        return this._startPromise.then(function () {
          return TransformStreamReadableReadyPromise(transformStream);
        });
      }
    }, {
      key: 'write',
      value: function write(chunk) {
        var transformStream = this._transformStream;
        return TransformStreamTransform(transformStream, chunk);
      }
    }, {
      key: 'abort',
      value: function abort() {
        var transformStream = this._transformStream;
        transformStream._writableDone = true;
        TransformStreamErrorInternal(transformStream, new TypeError('Writable side aborted'));
      }
    }, {
      key: 'close',
      value: function close() {
        var transformStream = this._transformStream;
        assert(transformStream._transforming === false);
        transformStream._writableDone = true;
        var flushPromise = PromiseInvokeOrNoop(transformStream._transformer, 'flush', [transformStream._transformStreamController]);
        return flushPromise.then(function () {
          if (transformStream._errored === true) {
            return Promise.reject(transformStream._storedError);
          }

          if (transformStream._readableClosed === false) {
            TransformStreamCloseReadableInternal(transformStream);
          }

          return Promise.resolve();
        }).catch(function (r) {
          TransformStreamErrorIfNeeded(transformStream, r);
          return Promise.reject(transformStream._storedError);
        });
      }
    }]);

    return TransformStreamSink;
  }();

  var TransformStreamSource = function () {
    function TransformStreamSource(transformStream, startPromise) {
      _classCallCheck(this, TransformStreamSource);

      this._transformStream = transformStream;
      this._startPromise = startPromise;
    }

    _createClass(TransformStreamSource, [{
      key: 'start',
      value: function start(c) {
        var transformStream = this._transformStream;
        transformStream._readableController = c;
        return this._startPromise.then(function () {
          assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');

          if (transformStream._backpressure === true) {
            return Promise.resolve();
          }

          assert(transformStream._backpressure === false, '_backpressure should have been initialized');
          return transformStream._backpressureChangePromise;
        });
      }
    }, {
      key: 'pull',
      value: function pull() {
        var transformStream = this._transformStream;
        assert(transformStream._backpressure === true, 'pull() should be never called while _backpressure is false');
        assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
        TransformStreamSetBackpressure(transformStream, false);
        return transformStream._backpressureChangePromise;
      }
    }, {
      key: 'cancel',
      value: function cancel() {
        var transformStream = this._transformStream;
        transformStream._readableClosed = true;
        TransformStreamErrorInternal(transformStream, new TypeError('Readable side canceled'));
      }
    }]);

    return TransformStreamSource;
  }();

  var TransformStreamDefaultController = function () {
    function TransformStreamDefaultController(transformStream) {
      _classCallCheck(this, TransformStreamDefaultController);

      if (IsTransformStream(transformStream) === false) {
        throw new TypeError('TransformStreamDefaultController can only be ' + 'constructed with a TransformStream instance');
      }

      if (transformStream._transformStreamController !== undefined) {
        throw new TypeError('TransformStreamDefaultController instances can ' + 'only be created by the TransformStream constructor');
      }

      this._controlledTransformStream = transformStream;
    }

    _createClass(TransformStreamDefaultController, [{
      key: 'enqueue',
      value: function enqueue(chunk) {
        if (IsTransformStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('enqueue');
        }

        TransformStreamEnqueueToReadable(this._controlledTransformStream, chunk);
      }
    }, {
      key: 'close',
      value: function close() {
        if (IsTransformStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('close');
        }

        TransformStreamCloseReadable(this._controlledTransformStream);
      }
    }, {
      key: 'error',
      value: function error(reason) {
        if (IsTransformStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('error');
        }

        TransformStreamError(this._controlledTransformStream, reason);
      }
    }, {
      key: 'desiredSize',
      get: function get() {
        if (IsTransformStreamDefaultController(this) === false) {
          throw defaultControllerBrandCheckException('desiredSize');
        }

        var transformStream = this._controlledTransformStream;
        var readableController = transformStream._readableController;
        return ReadableStreamDefaultControllerGetDesiredSize(readableController);
      }
    }]);

    return TransformStreamDefaultController;
  }();

  var TransformStream = function () {
    function TransformStream() {
      var transformer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

      _classCallCheck(this, TransformStream);

      this._transformer = transformer;
      var readableStrategy = transformer.readableStrategy,
          writableStrategy = transformer.writableStrategy;
      this._transforming = false;
      this._errored = false;
      this._storedError = undefined;
      this._writableController = undefined;
      this._readableController = undefined;
      this._transformStreamController = undefined;
      this._writableDone = false;
      this._readableClosed = false;
      this._backpressure = undefined;
      this._backpressureChangePromise = undefined;
      this._backpressureChangePromise_resolve = undefined;
      this._transformStreamController = new TransformStreamDefaultController(this);
      var startPromise_resolve = void 0;
      var startPromise = new Promise(function (resolve) {
        startPromise_resolve = resolve;
      });
      var source = new TransformStreamSource(this, startPromise);
      this._readable = new ReadableStream(source, readableStrategy);
      var sink = new TransformStreamSink(this, startPromise);
      this._writable = new WritableStream(sink, writableStrategy);
      assert(this._writableController !== undefined);
      assert(this._readableController !== undefined);
      var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(this._readableController);
      TransformStreamSetBackpressure(this, desiredSize <= 0);
      var transformStream = this;
      var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]);
      startPromise_resolve(startResult);
      startPromise.catch(function (e) {
        if (transformStream._errored === false) {
          transformStream._errored = true;
          transformStream._storedError = e;
        }
      });
    }

    _createClass(TransformStream, [{
      key: 'readable',
      get: function get() {
        if (IsTransformStream(this) === false) {
          throw streamBrandCheckException('readable');
        }

        return this._readable;
      }
    }, {
      key: 'writable',
      get: function get() {
        if (IsTransformStream(this) === false) {
          throw streamBrandCheckException('writable');
        }

        return this._writable;
      }
    }]);

    return TransformStream;
  }();

  module.exports = {
    TransformStream: TransformStream
  };

  function defaultControllerBrandCheckException(name) {
    return new TypeError('TransformStreamDefaultController.prototype.' + name + ' can only be used on a TransformStreamDefaultController');
  }

  function streamBrandCheckException(name) {
    return new TypeError('TransformStream.prototype.' + name + ' can only be used on a TransformStream');
  }
}, function (module, exports, __w_pdfjs_require__) {
  module.exports = __w_pdfjs_require__(5);
}]));

/***/ }),
/* 149 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

{
  var isURLSupported = 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';
      isURLSupported = u.href === 'http://a/c%20d';
    }
  } catch (ex) {}

  if (isURLSupported) {
    exports.URL = URL;
  } else {
    var PolyfillURL = __w_pdfjs_require__(150).URL;

    var OriginalURL = __w_pdfjs_require__(8).URL;

    if (OriginalURL) {
      PolyfillURL.createObjectURL = function (blob) {
        return OriginalURL.createObjectURL.apply(OriginalURL, arguments);
      };

      PolyfillURL.revokeObjectURL = function (url) {
        OriginalURL.revokeObjectURL(url);
      };
    }

    exports.URL = PolyfillURL;
  }
}

/***/ }),
/* 150 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


(function URLConstructorClosure() {
  'use strict';

  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);
    }

    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) {
    var unicode = c.charCodeAt(0);

    if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) === -1) {
      return c;
    }

    return encodeURIComponent(c);
  }

  var EOF,
      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();
            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();
          } else if (c === ':') {
            this._scheme = buffer;
            buffer = '';

            if (stateOverride) {
              break loop;
            }

            if (isRelativeScheme(this._scheme)) {
              this._isRelative = true;
            }

            if (this._scheme === 'file') {
              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 (c === EOF) {
            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 {
            if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
              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 (this._scheme !== 'file') {
            this._scheme = base._scheme;
          }

          if (c === EOF) {
            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 (this._scheme !== 'file' || !ALPHA.test(c) || nextC !== ':' && nextC !== '|' || nextNextC !== EOF && 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 (this._scheme === 'file') {
              state = 'file host';
            } else {
              state = 'authority ignore slashes';
            }
          } else {
            if (this._scheme !== 'file') {
              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 (cp === '\t' || cp === '\n' || cp === '\r') {
                err('Invalid whitespace in authority.');
                continue;
              }

              if (cp === ':' && this._password === null) {
                this._password = '';
                continue;
              }

              var tempC = percentEscape(cp);

              if (this._password !== null) {
                this._password += tempC;
              } else {
                this._username += tempC;
              }
            }

            buffer = '';
          } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') {
            cursor -= buffer.length;
            buffer = '';
            state = 'host';
            continue;
          } else {
            buffer += c;
          }

          break;

        case 'file host':
          if (c === EOF || 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 (c === '\t' || c === '\n' || c === '\r') {
            err('Invalid whitespace in file host.');
          } else {
            buffer += c;
          }

          break;

        case 'host':
        case 'hostname':
          if (c === ':' && !seenBracket) {
            this._host = IDNAToASCII.call(this, buffer);
            buffer = '';
            state = 'port';

            if (stateOverride === 'hostname') {
              break loop;
            }
          } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') {
            this._host = IDNAToASCII.call(this, buffer);
            buffer = '';
            state = 'relative path start';

            if (stateOverride) {
              break loop;
            }

            continue;
          } else if (c !== '\t' && c !== '\n' && c !== '\r') {
            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 (c === EOF || 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 (c === '\t' || c === '\n' || c === '\r') {
            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 (c === EOF || 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 (this._scheme === 'file' && 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 (c !== '\t' && c !== '\n' && c !== '\r') {
            buffer += percentEscape(c);
          }

          break;

        case 'query':
          if (!stateOverride && c === '#') {
            this._fragment = '#';
            state = 'fragment';
          } else if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
            this._query += percentEscapeQuery(c);
          }

          break;

        case 'fragment':
          if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
            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;
  }

  function JURL(url, base) {
    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, '');
    parse.call(this, input, null, base);
  }

  JURL.prototype = {
    toString: function toString() {
      return this.href;
    },

    get href() {
      if (this._isInvalid) {
        return this._url;
      }

      var authority = '';

      if (this._username !== '' || this._password !== null) {
        authority = this._username + (this._password !== null ? ':' + this._password : '') + '@';
      }

      return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment;
    },

    set href(value) {
      clear.call(this);
      parse.call(this, value);
    },

    get protocol() {
      return this._scheme + ':';
    },

    set protocol(value) {
      if (this._isInvalid) {
        return;
      }

      parse.call(this, value + ':', 'scheme start');
    },

    get host() {
      return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host;
    },

    set host(value) {
      if (this._isInvalid || !this._isRelative) {
        return;
      }

      parse.call(this, value, 'host');
    },

    get hostname() {
      return this._host;
    },

    set hostname(value) {
      if (this._isInvalid || !this._isRelative) {
        return;
      }

      parse.call(this, value, 'hostname');
    },

    get port() {
      return this._port;
    },

    set port(value) {
      if (this._isInvalid || !this._isRelative) {
        return;
      }

      parse.call(this, value, 'port');
    },

    get pathname() {
      return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData;
    },

    set pathname(value) {
      if (this._isInvalid || !this._isRelative) {
        return;
      }

      this._path = [];
      parse.call(this, value, 'relative path start');
    },

    get search() {
      return this._isInvalid || !this._query || this._query === '?' ? '' : this._query;
    },

    set search(value) {
      if (this._isInvalid || !this._isRelative) {
        return;
      }

      this._query = '?';

      if (value[0] === '?') {
        value = value.slice(1);
      }

      parse.call(this, value, 'query');
    },

    get hash() {
      return this._isInvalid || !this._fragment || this._fragment === '#' ? '' : this._fragment;
    },

    set hash(value) {
      if (this._isInvalid) {
        return;
      }

      this._fragment = '#';

      if (value[0] === '#') {
        value = value.slice(1);
      }

      parse.call(this, value, 'fragment');
    },

    get origin() {
      var host;

      if (this._isInvalid || !this._scheme) {
        return '';
      }

      switch (this._scheme) {
        case 'data':
        case 'file':
        case 'javascript':
        case 'mailto':
          return 'null';

        case 'blob':
          try {
            return new JURL(this._schemeData).origin || 'null';
          } catch (_) {}

          return 'null';
      }

      host = this.host;

      if (!host) {
        return '';
      }

      return this._scheme + '://' + host;
    }

  };
  exports.URL = JURL;
})();

/***/ }),
/* 151 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.NetworkPdfManager = exports.LocalPdfManager = void 0;

var _regenerator = _interopRequireDefault(__w_pdfjs_require__(2));

var _util = __w_pdfjs_require__(6);

var _chunked_stream = __w_pdfjs_require__(152);

var _document = __w_pdfjs_require__(153);

var _stream = __w_pdfjs_require__(157);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var BasePdfManager =
/*#__PURE__*/
function () {
  function BasePdfManager() {
    _classCallCheck(this, BasePdfManager);

    if (this.constructor === BasePdfManager) {
      (0, _util.unreachable)('Cannot initialize BasePdfManager.');
    }
  }

  _createClass(BasePdfManager, [{
    key: "onLoadedStream",
    value: function onLoadedStream() {
      (0, _util.unreachable)('Abstract method `onLoadedStream` called');
    }
  }, {
    key: "ensureDoc",
    value: function ensureDoc(prop, args) {
      return this.ensure(this.pdfDocument, prop, args);
    }
  }, {
    key: "ensureXRef",
    value: function ensureXRef(prop, args) {
      return this.ensure(this.pdfDocument.xref, prop, args);
    }
  }, {
    key: "ensureCatalog",
    value: function ensureCatalog(prop, args) {
      return this.ensure(this.pdfDocument.catalog, prop, args);
    }
  }, {
    key: "getPage",
    value: function getPage(pageIndex) {
      return this.pdfDocument.getPage(pageIndex);
    }
  }, {
    key: "fontFallback",
    value: function fontFallback(id, handler) {
      return this.pdfDocument.fontFallback(id, handler);
    }
  }, {
    key: "cleanup",
    value: function cleanup() {
      return this.pdfDocument.cleanup();
    }
  }, {
    key: "ensure",
    value: function () {
      var _ensure = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee(obj, prop, args) {
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                (0, _util.unreachable)('Abstract method `ensure` called');

              case 1:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function ensure(_x, _x2, _x3) {
        return _ensure.apply(this, arguments);
      }

      return ensure;
    }()
  }, {
    key: "requestRange",
    value: function requestRange(begin, end) {
      (0, _util.unreachable)('Abstract method `requestRange` called');
    }
  }, {
    key: "requestLoadedStream",
    value: function requestLoadedStream() {
      (0, _util.unreachable)('Abstract method `requestLoadedStream` called');
    }
  }, {
    key: "sendProgressiveData",
    value: function sendProgressiveData(chunk) {
      (0, _util.unreachable)('Abstract method `sendProgressiveData` called');
    }
  }, {
    key: "updatePassword",
    value: function updatePassword(password) {
      this._password = password;
    }
  }, {
    key: "terminate",
    value: function terminate() {
      (0, _util.unreachable)('Abstract method `terminate` called');
    }
  }, {
    key: "docId",
    get: function get() {
      return this._docId;
    }
  }, {
    key: "password",
    get: function get() {
      return this._password;
    }
  }, {
    key: "docBaseUrl",
    get: function get() {
      var docBaseUrl = null;

      if (this._docBaseUrl) {
        var absoluteUrl = (0, _util.createValidAbsoluteUrl)(this._docBaseUrl);

        if (absoluteUrl) {
          docBaseUrl = absoluteUrl.href;
        } else {
          (0, _util.warn)("Invalid absolute docBaseUrl: \"".concat(this._docBaseUrl, "\"."));
        }
      }

      return (0, _util.shadow)(this, 'docBaseUrl', docBaseUrl);
    }
  }]);

  return BasePdfManager;
}();

var LocalPdfManager =
/*#__PURE__*/
function (_BasePdfManager) {
  _inherits(LocalPdfManager, _BasePdfManager);

  function LocalPdfManager(docId, data, password, evaluatorOptions, docBaseUrl) {
    var _this;

    _classCallCheck(this, LocalPdfManager);

    _this = _possibleConstructorReturn(this, _getPrototypeOf(LocalPdfManager).call(this));
    _this._docId = docId;
    _this._password = password;
    _this._docBaseUrl = docBaseUrl;
    _this.evaluatorOptions = evaluatorOptions;
    var stream = new _stream.Stream(data);
    _this.pdfDocument = new _document.PDFDocument(_assertThisInitialized(_assertThisInitialized(_this)), stream);
    _this._loadedStreamPromise = Promise.resolve(stream);
    return _this;
  }

  _createClass(LocalPdfManager, [{
    key: "ensure",
    value: function () {
      var _ensure2 = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee2(obj, prop, args) {
        var value;
        return _regenerator.default.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                value = obj[prop];

                if (!(typeof value === 'function')) {
                  _context2.next = 3;
                  break;
                }

                return _context2.abrupt("return", value.apply(obj, args));

              case 3:
                return _context2.abrupt("return", value);

              case 4:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      function ensure(_x4, _x5, _x6) {
        return _ensure2.apply(this, arguments);
      }

      return ensure;
    }()
  }, {
    key: "requestRange",
    value: function requestRange(begin, end) {
      return Promise.resolve();
    }
  }, {
    key: "requestLoadedStream",
    value: function requestLoadedStream() {}
  }, {
    key: "onLoadedStream",
    value: function onLoadedStream() {
      return this._loadedStreamPromise;
    }
  }, {
    key: "terminate",
    value: function terminate() {}
  }]);

  return LocalPdfManager;
}(BasePdfManager);

exports.LocalPdfManager = LocalPdfManager;

var NetworkPdfManager =
/*#__PURE__*/
function (_BasePdfManager2) {
  _inherits(NetworkPdfManager, _BasePdfManager2);

  function NetworkPdfManager(docId, pdfNetworkStream, args, evaluatorOptions, docBaseUrl) {
    var _this2;

    _classCallCheck(this, NetworkPdfManager);

    _this2 = _possibleConstructorReturn(this, _getPrototypeOf(NetworkPdfManager).call(this));
    _this2._docId = docId;
    _this2._password = args.password;
    _this2._docBaseUrl = docBaseUrl;
    _this2.msgHandler = args.msgHandler;
    _this2.evaluatorOptions = evaluatorOptions;
    _this2.streamManager = new _chunked_stream.ChunkedStreamManager(pdfNetworkStream, {
      msgHandler: args.msgHandler,
      length: args.length,
      disableAutoFetch: args.disableAutoFetch,
      rangeChunkSize: args.rangeChunkSize
    });
    _this2.pdfDocument = new _document.PDFDocument(_assertThisInitialized(_assertThisInitialized(_this2)), _this2.streamManager.getStream());
    return _this2;
  }

  _createClass(NetworkPdfManager, [{
    key: "ensure",
    value: function () {
      var _ensure3 = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee3(obj, prop, args) {
        var value;
        return _regenerator.default.wrap(function _callee3$(_context3) {
          while (1) {
            switch (_context3.prev = _context3.next) {
              case 0:
                _context3.prev = 0;
                value = obj[prop];

                if (!(typeof value === 'function')) {
                  _context3.next = 4;
                  break;
                }

                return _context3.abrupt("return", value.apply(obj, args));

              case 4:
                return _context3.abrupt("return", value);

              case 7:
                _context3.prev = 7;
                _context3.t0 = _context3["catch"](0);

                if (_context3.t0 instanceof _util.MissingDataException) {
                  _context3.next = 11;
                  break;
                }

                throw _context3.t0;

              case 11:
                _context3.next = 13;
                return this.requestRange(_context3.t0.begin, _context3.t0.end);

              case 13:
                return _context3.abrupt("return", this.ensure(obj, prop, args));

              case 14:
              case "end":
                return _context3.stop();
            }
          }
        }, _callee3, this, [[0, 7]]);
      }));

      function ensure(_x7, _x8, _x9) {
        return _ensure3.apply(this, arguments);
      }

      return ensure;
    }()
  }, {
    key: "requestRange",
    value: function requestRange(begin, end) {
      return this.streamManager.requestRange(begin, end);
    }
  }, {
    key: "requestLoadedStream",
    value: function requestLoadedStream() {
      this.streamManager.requestAllChunks();
    }
  }, {
    key: "sendProgressiveData",
    value: function sendProgressiveData(chunk) {
      this.streamManager.onReceiveData({
        chunk: chunk
      });
    }
  }, {
    key: "onLoadedStream",
    value: function onLoadedStream() {
      return this.streamManager.onLoadedStream();
    }
  }, {
    key: "terminate",
    value: function terminate() {
      this.streamManager.abort();
    }
  }]);

  return NetworkPdfManager;
}(BasePdfManager);

exports.NetworkPdfManager = NetworkPdfManager;

/***/ }),
/* 152 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ChunkedStreamManager = exports.ChunkedStream = void 0;

var _util = __w_pdfjs_require__(6);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var ChunkedStream =
/*#__PURE__*/
function () {
  function ChunkedStream(length, chunkSize, manager) {
    _classCallCheck(this, ChunkedStream);

    this.bytes = new Uint8Array(length);
    this.start = 0;
    this.pos = 0;
    this.end = length;
    this.chunkSize = chunkSize;
    this.loadedChunks = [];
    this.numChunksLoaded = 0;
    this.numChunks = Math.ceil(length / chunkSize);
    this.manager = manager;
    this.progressiveDataLength = 0;
    this.lastSuccessfulEnsureByteChunk = -1;
  }

  _createClass(ChunkedStream, [{
    key: "getMissingChunks",
    value: function getMissingChunks() {
      var chunks = [];

      for (var chunk = 0, n = this.numChunks; chunk < n; ++chunk) {
        if (!this.loadedChunks[chunk]) {
          chunks.push(chunk);
        }
      }

      return chunks;
    }
  }, {
    key: "getBaseStreams",
    value: function getBaseStreams() {
      return [this];
    }
  }, {
    key: "allChunksLoaded",
    value: function allChunksLoaded() {
      return this.numChunksLoaded === this.numChunks;
    }
  }, {
    key: "onReceiveData",
    value: function onReceiveData(begin, chunk) {
      var chunkSize = this.chunkSize;

      if (begin % chunkSize !== 0) {
        throw new Error("Bad begin offset: ".concat(begin));
      }

      var end = begin + chunk.byteLength;

      if (end % chunkSize !== 0 && end !== this.bytes.length) {
        throw new Error("Bad end offset: ".concat(end));
      }

      this.bytes.set(new Uint8Array(chunk), begin);
      var beginChunk = Math.floor(begin / chunkSize);
      var endChunk = Math.floor((end - 1) / chunkSize) + 1;

      for (var curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
        if (!this.loadedChunks[curChunk]) {
          this.loadedChunks[curChunk] = true;
          ++this.numChunksLoaded;
        }
      }
    }
  }, {
    key: "onReceiveProgressiveData",
    value: function onReceiveProgressiveData(data) {
      var position = this.progressiveDataLength;
      var beginChunk = Math.floor(position / this.chunkSize);
      this.bytes.set(new Uint8Array(data), position);
      position += data.byteLength;
      this.progressiveDataLength = position;
      var endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize);

      for (var curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
        if (!this.loadedChunks[curChunk]) {
          this.loadedChunks[curChunk] = true;
          ++this.numChunksLoaded;
        }
      }
    }
  }, {
    key: "ensureByte",
    value: function ensureByte(pos) {
      var chunk = Math.floor(pos / this.chunkSize);

      if (chunk === this.lastSuccessfulEnsureByteChunk) {
        return;
      }

      if (!this.loadedChunks[chunk]) {
        throw new _util.MissingDataException(pos, pos + 1);
      }

      this.lastSuccessfulEnsureByteChunk = chunk;
    }
  }, {
    key: "ensureRange",
    value: function ensureRange(begin, end) {
      if (begin >= end) {
        return;
      }

      if (end <= this.progressiveDataLength) {
        return;
      }

      var chunkSize = this.chunkSize;
      var beginChunk = Math.floor(begin / chunkSize);
      var endChunk = Math.floor((end - 1) / chunkSize) + 1;

      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
        if (!this.loadedChunks[chunk]) {
          throw new _util.MissingDataException(begin, end);
        }
      }
    }
  }, {
    key: "nextEmptyChunk",
    value: function nextEmptyChunk(beginChunk) {
      var numChunks = this.numChunks;

      for (var i = 0; i < numChunks; ++i) {
        var chunk = (beginChunk + i) % numChunks;

        if (!this.loadedChunks[chunk]) {
          return chunk;
        }
      }

      return null;
    }
  }, {
    key: "hasChunk",
    value: function hasChunk(chunk) {
      return !!this.loadedChunks[chunk];
    }
  }, {
    key: "getByte",
    value: function getByte() {
      var pos = this.pos;

      if (pos >= this.end) {
        return -1;
      }

      this.ensureByte(pos);
      return this.bytes[this.pos++];
    }
  }, {
    key: "getUint16",
    value: function getUint16() {
      var b0 = this.getByte();
      var b1 = this.getByte();

      if (b0 === -1 || b1 === -1) {
        return -1;
      }

      return (b0 << 8) + b1;
    }
  }, {
    key: "getInt32",
    value: function getInt32() {
      var b0 = this.getByte();
      var b1 = this.getByte();
      var b2 = this.getByte();
      var b3 = this.getByte();
      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
    }
  }, {
    key: "getBytes",
    value: function getBytes(length) {
      var forceClamped = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      var bytes = this.bytes;
      var pos = this.pos;
      var strEnd = this.end;

      if (!length) {
        this.ensureRange(pos, strEnd);

        var _subarray = bytes.subarray(pos, strEnd);

        return forceClamped ? new Uint8ClampedArray(_subarray) : _subarray;
      }

      var end = pos + length;

      if (end > strEnd) {
        end = strEnd;
      }

      this.ensureRange(pos, end);
      this.pos = end;
      var subarray = bytes.subarray(pos, end);
      return forceClamped ? new Uint8ClampedArray(subarray) : subarray;
    }
  }, {
    key: "peekByte",
    value: function peekByte() {
      var peekedByte = this.getByte();
      this.pos--;
      return peekedByte;
    }
  }, {
    key: "peekBytes",
    value: function peekBytes(length) {
      var forceClamped = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      var bytes = this.getBytes(length, forceClamped);
      this.pos -= bytes.length;
      return bytes;
    }
  }, {
    key: "getByteRange",
    value: function getByteRange(begin, end) {
      this.ensureRange(begin, end);
      return this.bytes.subarray(begin, end);
    }
  }, {
    key: "skip",
    value: function skip(n) {
      if (!n) {
        n = 1;
      }

      this.pos += n;
    }
  }, {
    key: "reset",
    value: function reset() {
      this.pos = this.start;
    }
  }, {
    key: "moveStart",
    value: function moveStart() {
      this.start = this.pos;
    }
  }, {
    key: "makeSubStream",
    value: function makeSubStream(start, length, dict) {
      this.ensureRange(start, start + length);

      function ChunkedStreamSubstream() {}

      ChunkedStreamSubstream.prototype = Object.create(this);

      ChunkedStreamSubstream.prototype.getMissingChunks = function () {
        var chunkSize = this.chunkSize;
        var beginChunk = Math.floor(this.start / chunkSize);
        var endChunk = Math.floor((this.end - 1) / chunkSize) + 1;
        var missingChunks = [];

        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
          if (!this.loadedChunks[chunk]) {
            missingChunks.push(chunk);
          }
        }

        return missingChunks;
      };

      var subStream = new ChunkedStreamSubstream();
      subStream.pos = subStream.start = start;
      subStream.end = start + length || this.end;
      subStream.dict = dict;
      return subStream;
    }
  }, {
    key: "length",
    get: function get() {
      return this.end - this.start;
    }
  }, {
    key: "isEmpty",
    get: function get() {
      return this.length === 0;
    }
  }]);

  return ChunkedStream;
}();

exports.ChunkedStream = ChunkedStream;

var ChunkedStreamManager =
/*#__PURE__*/
function () {
  function ChunkedStreamManager(pdfNetworkStream, args) {
    _classCallCheck(this, ChunkedStreamManager);

    this.length = args.length;
    this.chunkSize = args.rangeChunkSize;
    this.stream = new ChunkedStream(this.length, this.chunkSize, this);
    this.pdfNetworkStream = pdfNetworkStream;
    this.disableAutoFetch = args.disableAutoFetch;
    this.msgHandler = args.msgHandler;
    this.currRequestId = 0;
    this.chunksNeededByRequest = Object.create(null);
    this.requestsByChunk = Object.create(null);
    this.promisesByRequest = Object.create(null);
    this.progressiveDataLength = 0;
    this.aborted = false;
    this._loadedStreamCapability = (0, _util.createPromiseCapability)();
  }

  _createClass(ChunkedStreamManager, [{
    key: "onLoadedStream",
    value: function onLoadedStream() {
      return this._loadedStreamCapability.promise;
    }
  }, {
    key: "sendRequest",
    value: function sendRequest(begin, end) {
      var _this = this;

      var rangeReader = this.pdfNetworkStream.getRangeReader(begin, end);

      if (!rangeReader.isStreamingSupported) {
        rangeReader.onProgress = this.onProgress.bind(this);
      }

      var chunks = [],
          loaded = 0;
      var promise = new Promise(function (resolve, reject) {
        var readChunk = function readChunk(chunk) {
          try {
            if (!chunk.done) {
              var data = chunk.value;
              chunks.push(data);
              loaded += (0, _util.arrayByteLength)(data);

              if (rangeReader.isStreamingSupported) {
                _this.onProgress({
                  loaded: loaded
                });
              }

              rangeReader.read().then(readChunk, reject);
              return;
            }

            var chunkData = (0, _util.arraysToBytes)(chunks);
            chunks = null;
            resolve(chunkData);
          } catch (e) {
            reject(e);
          }
        };

        rangeReader.read().then(readChunk, reject);
      });
      promise.then(function (data) {
        if (_this.aborted) {
          return;
        }

        _this.onReceiveData({
          chunk: data,
          begin: begin
        });
      });
    }
  }, {
    key: "requestAllChunks",
    value: function requestAllChunks() {
      var missingChunks = this.stream.getMissingChunks();

      this._requestChunks(missingChunks);

      return this._loadedStreamCapability.promise;
    }
  }, {
    key: "_requestChunks",
    value: function _requestChunks(chunks) {
      var requestId = this.currRequestId++;
      var chunksNeeded = Object.create(null);
      this.chunksNeededByRequest[requestId] = chunksNeeded;
      var _iteratorNormalCompletion = true;
      var _didIteratorError = false;
      var _iteratorError = undefined;

      try {
        for (var _iterator = chunks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
          var _chunk = _step.value;

          if (!this.stream.hasChunk(_chunk)) {
            chunksNeeded[_chunk] = true;
          }
        }
      } catch (err) {
        _didIteratorError = true;
        _iteratorError = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion && _iterator.return != null) {
            _iterator.return();
          }
        } finally {
          if (_didIteratorError) {
            throw _iteratorError;
          }
        }
      }

      if ((0, _util.isEmptyObj)(chunksNeeded)) {
        return Promise.resolve();
      }

      var capability = (0, _util.createPromiseCapability)();
      this.promisesByRequest[requestId] = capability;
      var chunksToRequest = [];

      for (var chunk in chunksNeeded) {
        chunk = chunk | 0;

        if (!(chunk in this.requestsByChunk)) {
          this.requestsByChunk[chunk] = [];
          chunksToRequest.push(chunk);
        }

        this.requestsByChunk[chunk].push(requestId);
      }

      if (!chunksToRequest.length) {
        return capability.promise;
      }

      var groupedChunksToRequest = this.groupChunks(chunksToRequest);
      var _iteratorNormalCompletion2 = true;
      var _didIteratorError2 = false;
      var _iteratorError2 = undefined;

      try {
        for (var _iterator2 = groupedChunksToRequest[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
          var groupedChunk = _step2.value;
          var begin = groupedChunk.beginChunk * this.chunkSize;
          var end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length);
          this.sendRequest(begin, end);
        }
      } catch (err) {
        _didIteratorError2 = true;
        _iteratorError2 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
            _iterator2.return();
          }
        } finally {
          if (_didIteratorError2) {
            throw _iteratorError2;
          }
        }
      }

      return capability.promise;
    }
  }, {
    key: "getStream",
    value: function getStream() {
      return this.stream;
    }
  }, {
    key: "requestRange",
    value: function requestRange(begin, end) {
      end = Math.min(end, this.length);
      var beginChunk = this.getBeginChunk(begin);
      var endChunk = this.getEndChunk(end);
      var chunks = [];

      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
        chunks.push(chunk);
      }

      return this._requestChunks(chunks);
    }
  }, {
    key: "requestRanges",
    value: function requestRanges() {
      var ranges = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
      var chunksToRequest = [];
      var _iteratorNormalCompletion3 = true;
      var _didIteratorError3 = false;
      var _iteratorError3 = undefined;

      try {
        for (var _iterator3 = ranges[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
          var range = _step3.value;
          var beginChunk = this.getBeginChunk(range.begin);
          var endChunk = this.getEndChunk(range.end);

          for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
            if (!chunksToRequest.includes(chunk)) {
              chunksToRequest.push(chunk);
            }
          }
        }
      } catch (err) {
        _didIteratorError3 = true;
        _iteratorError3 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
            _iterator3.return();
          }
        } finally {
          if (_didIteratorError3) {
            throw _iteratorError3;
          }
        }
      }

      chunksToRequest.sort(function (a, b) {
        return a - b;
      });
      return this._requestChunks(chunksToRequest);
    }
  }, {
    key: "groupChunks",
    value: function groupChunks(chunks) {
      var groupedChunks = [];
      var beginChunk = -1;
      var prevChunk = -1;

      for (var i = 0, ii = chunks.length; i < ii; ++i) {
        var chunk = chunks[i];

        if (beginChunk < 0) {
          beginChunk = chunk;
        }

        if (prevChunk >= 0 && prevChunk + 1 !== chunk) {
          groupedChunks.push({
            beginChunk: beginChunk,
            endChunk: prevChunk + 1
          });
          beginChunk = chunk;
        }

        if (i + 1 === chunks.length) {
          groupedChunks.push({
            beginChunk: beginChunk,
            endChunk: chunk + 1
          });
        }

        prevChunk = chunk;
      }

      return groupedChunks;
    }
  }, {
    key: "onProgress",
    value: function onProgress(args) {
      this.msgHandler.send('DocProgress', {
        loaded: this.stream.numChunksLoaded * this.chunkSize + args.loaded,
        total: this.length
      });
    }
  }, {
    key: "onReceiveData",
    value: function onReceiveData(args) {
      var chunk = args.chunk;
      var isProgressive = args.begin === undefined;
      var begin = isProgressive ? this.progressiveDataLength : args.begin;
      var end = begin + chunk.byteLength;
      var beginChunk = Math.floor(begin / this.chunkSize);
      var endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize);

      if (isProgressive) {
        this.stream.onReceiveProgressiveData(chunk);
        this.progressiveDataLength = end;
      } else {
        this.stream.onReceiveData(begin, chunk);
      }

      if (this.stream.allChunksLoaded()) {
        this._loadedStreamCapability.resolve(this.stream);
      }

      var loadedRequests = [];

      for (var _chunk2 = beginChunk; _chunk2 < endChunk; ++_chunk2) {
        var requestIds = this.requestsByChunk[_chunk2] || [];
        delete this.requestsByChunk[_chunk2];
        var _iteratorNormalCompletion4 = true;
        var _didIteratorError4 = false;
        var _iteratorError4 = undefined;

        try {
          for (var _iterator4 = requestIds[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
            var requestId = _step4.value;
            var chunksNeeded = this.chunksNeededByRequest[requestId];

            if (_chunk2 in chunksNeeded) {
              delete chunksNeeded[_chunk2];
            }

            if (!(0, _util.isEmptyObj)(chunksNeeded)) {
              continue;
            }

            loadedRequests.push(requestId);
          }
        } catch (err) {
          _didIteratorError4 = true;
          _iteratorError4 = err;
        } finally {
          try {
            if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
              _iterator4.return();
            }
          } finally {
            if (_didIteratorError4) {
              throw _iteratorError4;
            }
          }
        }
      }

      if (!this.disableAutoFetch && (0, _util.isEmptyObj)(this.requestsByChunk)) {
        var nextEmptyChunk;

        if (this.stream.numChunksLoaded === 1) {
          var lastChunk = this.stream.numChunks - 1;

          if (!this.stream.hasChunk(lastChunk)) {
            nextEmptyChunk = lastChunk;
          }
        } else {
          nextEmptyChunk = this.stream.nextEmptyChunk(endChunk);
        }

        if (Number.isInteger(nextEmptyChunk)) {
          this._requestChunks([nextEmptyChunk]);
        }
      }

      for (var _i = 0; _i < loadedRequests.length; _i++) {
        var _requestId = loadedRequests[_i];
        var capability = this.promisesByRequest[_requestId];
        delete this.promisesByRequest[_requestId];
        capability.resolve();
      }

      this.msgHandler.send('DocProgress', {
        loaded: this.stream.numChunksLoaded * this.chunkSize,
        total: this.length
      });
    }
  }, {
    key: "onError",
    value: function onError(err) {
      this._loadedStreamCapability.reject(err);
    }
  }, {
    key: "getBeginChunk",
    value: function getBeginChunk(begin) {
      return Math.floor(begin / this.chunkSize);
    }
  }, {
    key: "getEndChunk",
    value: function getEndChunk(end) {
      return Math.floor((end - 1) / this.chunkSize) + 1;
    }
  }, {
    key: "abort",
    value: function abort() {
      this.aborted = true;

      if (this.pdfNetworkStream) {
        this.pdfNetworkStream.cancelAllRequests('abort');
      }

      for (var requestId in this.promisesByRequest) {
        this.promisesByRequest[requestId].reject(new Error('Request was aborted'));
      }
    }
  }]);

  return ChunkedStreamManager;
}();

exports.ChunkedStreamManager = ChunkedStreamManager;

/***/ }),
/* 153 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFDocument = exports.Page = void 0;

var _util = __w_pdfjs_require__(6);

var _obj = __w_pdfjs_require__(154);

var _primitives = __w_pdfjs_require__(155);

var _stream2 = __w_pdfjs_require__(157);

var _annotation = __w_pdfjs_require__(169);

var _crypto = __w_pdfjs_require__(167);

var _parser = __w_pdfjs_require__(156);

var _operator_list = __w_pdfjs_require__(170);

var _evaluator = __w_pdfjs_require__(171);

var _function = __w_pdfjs_require__(185);

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var DEFAULT_USER_UNIT = 1.0;
var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];

function isAnnotationRenderable(annotation, intent) {
  return intent === 'display' && annotation.viewable || intent === 'print' && annotation.printable;
}

var Page =
/*#__PURE__*/
function () {
  function Page(_ref) {
    var pdfManager = _ref.pdfManager,
        xref = _ref.xref,
        pageIndex = _ref.pageIndex,
        pageDict = _ref.pageDict,
        ref = _ref.ref,
        fontCache = _ref.fontCache,
        builtInCMapCache = _ref.builtInCMapCache,
        pdfFunctionFactory = _ref.pdfFunctionFactory;

    _classCallCheck(this, Page);

    this.pdfManager = pdfManager;
    this.pageIndex = pageIndex;
    this.pageDict = pageDict;
    this.xref = xref;
    this.ref = ref;
    this.fontCache = fontCache;
    this.builtInCMapCache = builtInCMapCache;
    this.pdfFunctionFactory = pdfFunctionFactory;
    this.evaluatorOptions = pdfManager.evaluatorOptions;
    this.resourcesPromise = null;
    var uniquePrefix = "p".concat(this.pageIndex, "_");
    var idCounters = {
      obj: 0
    };
    this.idFactory = {
      createObjId: function createObjId() {
        return uniquePrefix + ++idCounters.obj;
      }
    };
  }

  _createClass(Page, [{
    key: "_getInheritableProperty",
    value: function _getInheritableProperty(key) {
      var getArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      var value = (0, _util.getInheritableProperty)({
        dict: this.pageDict,
        key: key,
        getArray: getArray,
        stopWhenFound: false
      });

      if (!Array.isArray(value)) {
        return value;
      }

      if (value.length === 1 || !(0, _primitives.isDict)(value[0])) {
        return value[0];
      }

      return _primitives.Dict.merge(this.xref, value);
    }
  }, {
    key: "getContentStream",
    value: function getContentStream() {
      var content = this.content;
      var stream;

      if (Array.isArray(content)) {
        var xref = this.xref;
        var streams = [];
        var _iteratorNormalCompletion = true;
        var _didIteratorError = false;
        var _iteratorError = undefined;

        try {
          for (var _iterator = content[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
            var _stream = _step.value;
            streams.push(xref.fetchIfRef(_stream));
          }
        } catch (err) {
          _didIteratorError = true;
          _iteratorError = err;
        } finally {
          try {
            if (!_iteratorNormalCompletion && _iterator.return != null) {
              _iterator.return();
            }
          } finally {
            if (_didIteratorError) {
              throw _iteratorError;
            }
          }
        }

        stream = new _stream2.StreamsSequenceStream(streams);
      } else if ((0, _primitives.isStream)(content)) {
        stream = content;
      } else {
        stream = new _stream2.NullStream();
      }

      return stream;
    }
  }, {
    key: "loadResources",
    value: function loadResources(keys) {
      var _this = this;

      if (!this.resourcesPromise) {
        this.resourcesPromise = this.pdfManager.ensure(this, 'resources');
      }

      return this.resourcesPromise.then(function () {
        var objectLoader = new _obj.ObjectLoader(_this.resources, keys, _this.xref);
        return objectLoader.load();
      });
    }
  }, {
    key: "getOperatorList",
    value: function getOperatorList(_ref2) {
      var _this2 = this;

      var handler = _ref2.handler,
          task = _ref2.task,
          intent = _ref2.intent,
          renderInteractiveForms = _ref2.renderInteractiveForms;
      var contentStreamPromise = this.pdfManager.ensure(this, 'getContentStream');
      var resourcesPromise = this.loadResources(['ExtGState', 'ColorSpace', 'Pattern', 'Shading', 'XObject', 'Font']);
      var partialEvaluator = new _evaluator.PartialEvaluator({
        pdfManager: this.pdfManager,
        xref: this.xref,
        handler: handler,
        pageIndex: this.pageIndex,
        idFactory: this.idFactory,
        fontCache: this.fontCache,
        builtInCMapCache: this.builtInCMapCache,
        options: this.evaluatorOptions,
        pdfFunctionFactory: this.pdfFunctionFactory
      });
      var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);
      var pageListPromise = dataPromises.then(function (_ref3) {
        var _ref4 = _slicedToArray(_ref3, 1),
            contentStream = _ref4[0];

        var opList = new _operator_list.OperatorList(intent, handler, _this2.pageIndex);
        handler.send('StartRenderPage', {
          transparency: partialEvaluator.hasBlendModes(_this2.resources),
          pageIndex: _this2.pageIndex,
          intent: intent
        });
        return partialEvaluator.getOperatorList({
          stream: contentStream,
          task: task,
          resources: _this2.resources,
          operatorList: opList
        }).then(function () {
          return opList;
        });
      });
      return Promise.all([pageListPromise, this._parsedAnnotations]).then(function (_ref5) {
        var _ref6 = _slicedToArray(_ref5, 2),
            pageOpList = _ref6[0],
            annotations = _ref6[1];

        if (annotations.length === 0) {
          pageOpList.flush(true);
          return pageOpList;
        }

        var opListPromises = [];
        var _iteratorNormalCompletion2 = true;
        var _didIteratorError2 = false;
        var _iteratorError2 = undefined;

        try {
          for (var _iterator2 = annotations[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
            var annotation = _step2.value;

            if (isAnnotationRenderable(annotation, intent)) {
              opListPromises.push(annotation.getOperatorList(partialEvaluator, task, renderInteractiveForms));
            }
          }
        } catch (err) {
          _didIteratorError2 = true;
          _iteratorError2 = err;
        } finally {
          try {
            if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
              _iterator2.return();
            }
          } finally {
            if (_didIteratorError2) {
              throw _iteratorError2;
            }
          }
        }

        return Promise.all(opListPromises).then(function (opLists) {
          pageOpList.addOp(_util.OPS.beginAnnotations, []);
          var _iteratorNormalCompletion3 = true;
          var _didIteratorError3 = false;
          var _iteratorError3 = undefined;

          try {
            for (var _iterator3 = opLists[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
              var opList = _step3.value;
              pageOpList.addOpList(opList);
            }
          } catch (err) {
            _didIteratorError3 = true;
            _iteratorError3 = err;
          } finally {
            try {
              if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
                _iterator3.return();
              }
            } finally {
              if (_didIteratorError3) {
                throw _iteratorError3;
              }
            }
          }

          pageOpList.addOp(_util.OPS.endAnnotations, []);
          pageOpList.flush(true);
          return pageOpList;
        });
      });
    }
  }, {
    key: "extractTextContent",
    value: function extractTextContent(_ref7) {
      var _this3 = this;

      var handler = _ref7.handler,
          task = _ref7.task,
          normalizeWhitespace = _ref7.normalizeWhitespace,
          sink = _ref7.sink,
          combineTextItems = _ref7.combineTextItems;
      var contentStreamPromise = this.pdfManager.ensure(this, 'getContentStream');
      var resourcesPromise = this.loadResources(['ExtGState', 'XObject', 'Font']);
      var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);
      return dataPromises.then(function (_ref8) {
        var _ref9 = _slicedToArray(_ref8, 1),
            contentStream = _ref9[0];

        var partialEvaluator = new _evaluator.PartialEvaluator({
          pdfManager: _this3.pdfManager,
          xref: _this3.xref,
          handler: handler,
          pageIndex: _this3.pageIndex,
          idFactory: _this3.idFactory,
          fontCache: _this3.fontCache,
          builtInCMapCache: _this3.builtInCMapCache,
          options: _this3.evaluatorOptions,
          pdfFunctionFactory: _this3.pdfFunctionFactory
        });
        return partialEvaluator.getTextContent({
          stream: contentStream,
          task: task,
          resources: _this3.resources,
          normalizeWhitespace: normalizeWhitespace,
          combineTextItems: combineTextItems,
          sink: sink
        });
      });
    }
  }, {
    key: "getAnnotationsData",
    value: function getAnnotationsData(intent) {
      return this._parsedAnnotations.then(function (annotations) {
        var annotationsData = [];

        for (var i = 0, ii = annotations.length; i < ii; i++) {
          if (!intent || isAnnotationRenderable(annotations[i], intent)) {
            annotationsData.push(annotations[i].data);
          }
        }

        return annotationsData;
      });
    }
  }, {
    key: "content",
    get: function get() {
      return this.pageDict.get('Contents');
    }
  }, {
    key: "resources",
    get: function get() {
      return (0, _util.shadow)(this, 'resources', this._getInheritableProperty('Resources') || _primitives.Dict.empty);
    }
  }, {
    key: "mediaBox",
    get: function get() {
      var mediaBox = this._getInheritableProperty('MediaBox', true);

      if (!Array.isArray(mediaBox) || mediaBox.length !== 4) {
        return (0, _util.shadow)(this, 'mediaBox', LETTER_SIZE_MEDIABOX);
      }

      return (0, _util.shadow)(this, 'mediaBox', mediaBox);
    }
  }, {
    key: "cropBox",
    get: function get() {
      var cropBox = this._getInheritableProperty('CropBox', true);

      if (!Array.isArray(cropBox) || cropBox.length !== 4) {
        return (0, _util.shadow)(this, 'cropBox', this.mediaBox);
      }

      return (0, _util.shadow)(this, 'cropBox', cropBox);
    }
  }, {
    key: "userUnit",
    get: function get() {
      var obj = this.pageDict.get('UserUnit');

      if (!(0, _util.isNum)(obj) || obj <= 0) {
        obj = DEFAULT_USER_UNIT;
      }

      return (0, _util.shadow)(this, 'userUnit', obj);
    }
  }, {
    key: "view",
    get: function get() {
      var mediaBox = this.mediaBox,
          cropBox = this.cropBox;

      if (mediaBox === cropBox) {
        return (0, _util.shadow)(this, 'view', mediaBox);
      }

      var intersection = _util.Util.intersect(cropBox, mediaBox);

      return (0, _util.shadow)(this, 'view', intersection || mediaBox);
    }
  }, {
    key: "rotate",
    get: function get() {
      var rotate = this._getInheritableProperty('Rotate') || 0;

      if (rotate % 90 !== 0) {
        rotate = 0;
      } else if (rotate >= 360) {
        rotate = rotate % 360;
      } else if (rotate < 0) {
        rotate = (rotate % 360 + 360) % 360;
      }

      return (0, _util.shadow)(this, 'rotate', rotate);
    }
  }, {
    key: "annotations",
    get: function get() {
      return (0, _util.shadow)(this, 'annotations', this._getInheritableProperty('Annots') || []);
    }
  }, {
    key: "_parsedAnnotations",
    get: function get() {
      var _this4 = this;

      var parsedAnnotations = this.pdfManager.ensure(this, 'annotations').then(function () {
        var annotationRefs = _this4.annotations;
        var annotationPromises = [];

        for (var i = 0, ii = annotationRefs.length; i < ii; i++) {
          annotationPromises.push(_annotation.AnnotationFactory.create(_this4.xref, annotationRefs[i], _this4.pdfManager, _this4.idFactory));
        }

        return Promise.all(annotationPromises).then(function (annotations) {
          return annotations.filter(function isDefined(annotation) {
            return !!annotation;
          });
        }, function (reason) {
          (0, _util.warn)("_parsedAnnotations: \"".concat(reason, "\"."));
          return [];
        });
      });
      return (0, _util.shadow)(this, '_parsedAnnotations', parsedAnnotations);
    }
  }]);

  return Page;
}();

exports.Page = Page;
var FINGERPRINT_FIRST_BYTES = 1024;
var EMPTY_FINGERPRINT = '\x00\x00\x00\x00\x00\x00\x00' + '\x00\x00\x00\x00\x00\x00\x00\x00\x00';

function find(stream, needle, limit, backwards) {
  var pos = stream.pos;
  var end = stream.end;

  if (pos + limit > end) {
    limit = end - pos;
  }

  var strBuf = [];

  for (var i = 0; i < limit; ++i) {
    strBuf.push(String.fromCharCode(stream.getByte()));
  }

  var str = strBuf.join('');
  stream.pos = pos;
  var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);

  if (index === -1) {
    return false;
  }

  stream.pos += index;
  return true;
}

var PDFDocument =
/*#__PURE__*/
function () {
  function PDFDocument(pdfManager, arg) {
    _classCallCheck(this, PDFDocument);

    var stream;

    if ((0, _primitives.isStream)(arg)) {
      stream = arg;
    } else if ((0, _util.isArrayBuffer)(arg)) {
      stream = new _stream2.Stream(arg);
    } else {
      throw new Error('PDFDocument: Unknown argument type');
    }

    if (stream.length <= 0) {
      throw new Error('PDFDocument: Stream must have data');
    }

    this.pdfManager = pdfManager;
    this.stream = stream;
    this.xref = new _obj.XRef(stream, pdfManager);
    this.pdfFunctionFactory = new _function.PDFFunctionFactory({
      xref: this.xref,
      isEvalSupported: pdfManager.evaluatorOptions.isEvalSupported
    });
    this._pagePromises = [];
  }

  _createClass(PDFDocument, [{
    key: "parse",
    value: function parse(recoveryMode) {
      this.setup(recoveryMode);
      var version = this.catalog.catDict.get('Version');

      if ((0, _primitives.isName)(version)) {
        this.pdfFormatVersion = version.name;
      }

      try {
        this.acroForm = this.catalog.catDict.get('AcroForm');

        if (this.acroForm) {
          this.xfa = this.acroForm.get('XFA');
          var fields = this.acroForm.get('Fields');

          if ((!fields || !Array.isArray(fields) || fields.length === 0) && !this.xfa) {
            this.acroForm = null;
          }
        }
      } catch (ex) {
        if (ex instanceof _util.MissingDataException) {
          throw ex;
        }

        (0, _util.info)('Cannot fetch AcroForm entry; assuming no AcroForms are present');
        this.acroForm = null;
      }
    }
  }, {
    key: "checkHeader",
    value: function checkHeader() {
      var stream = this.stream;
      stream.reset();

      if (!find(stream, '%PDF-', 1024)) {
        return;
      }

      stream.moveStart();
      var MAX_PDF_VERSION_LENGTH = 12;
      var version = '',
          ch;

      while ((ch = stream.getByte()) > 0x20) {
        if (version.length >= MAX_PDF_VERSION_LENGTH) {
          break;
        }

        version += String.fromCharCode(ch);
      }

      if (!this.pdfFormatVersion) {
        this.pdfFormatVersion = version.substring(5);
      }
    }
  }, {
    key: "parseStartXRef",
    value: function parseStartXRef() {
      this.xref.setStartXRef(this.startXRef);
    }
  }, {
    key: "setup",
    value: function setup(recoveryMode) {
      this.xref.parse(recoveryMode);
      this.catalog = new _obj.Catalog(this.pdfManager, this.xref);
    }
  }, {
    key: "_getLinearizationPage",
    value: function _getLinearizationPage(pageIndex) {
      var catalog = this.catalog,
          linearization = this.linearization;
      (0, _util.assert)(linearization && linearization.pageFirst === pageIndex);
      var ref = new _primitives.Ref(linearization.objectNumberFirst, 0);
      return this.xref.fetchAsync(ref).then(function (obj) {
        if ((0, _primitives.isDict)(obj, 'Page') || (0, _primitives.isDict)(obj) && !obj.has('Type') && obj.has('Contents')) {
          if (ref && !catalog.pageKidsCountCache.has(ref)) {
            catalog.pageKidsCountCache.put(ref, 1);
          }

          return [obj, ref];
        }

        throw new _util.FormatError('The Linearization dictionary doesn\'t point ' + 'to a valid Page dictionary.');
      }).catch(function (reason) {
        (0, _util.info)(reason);
        return catalog.getPageDict(pageIndex);
      });
    }
  }, {
    key: "getPage",
    value: function getPage(pageIndex) {
      var _this5 = this;

      if (this._pagePromises[pageIndex] !== undefined) {
        return this._pagePromises[pageIndex];
      }

      var catalog = this.catalog,
          linearization = this.linearization;
      var promise = linearization && linearization.pageFirst === pageIndex ? this._getLinearizationPage(pageIndex) : catalog.getPageDict(pageIndex);
      return this._pagePromises[pageIndex] = promise.then(function (_ref10) {
        var _ref11 = _slicedToArray(_ref10, 2),
            pageDict = _ref11[0],
            ref = _ref11[1];

        return new Page({
          pdfManager: _this5.pdfManager,
          xref: _this5.xref,
          pageIndex: pageIndex,
          pageDict: pageDict,
          ref: ref,
          fontCache: catalog.fontCache,
          builtInCMapCache: catalog.builtInCMapCache,
          pdfFunctionFactory: _this5.pdfFunctionFactory
        });
      });
    }
  }, {
    key: "checkFirstPage",
    value: function checkFirstPage() {
      var _this6 = this;

      return this.getPage(0).catch(function (reason) {
        if (reason instanceof _util.XRefEntryException) {
          _this6._pagePromises.length = 0;

          _this6.cleanup();

          throw new _util.XRefParseException();
        }
      });
    }
  }, {
    key: "fontFallback",
    value: function fontFallback(id, handler) {
      return this.catalog.fontFallback(id, handler);
    }
  }, {
    key: "cleanup",
    value: function cleanup() {
      return this.catalog.cleanup();
    }
  }, {
    key: "linearization",
    get: function get() {
      var linearization = null;

      try {
        linearization = _parser.Linearization.create(this.stream);
      } catch (err) {
        if (err instanceof _util.MissingDataException) {
          throw err;
        }

        (0, _util.info)(err);
      }

      return (0, _util.shadow)(this, 'linearization', linearization);
    }
  }, {
    key: "startXRef",
    get: function get() {
      var stream = this.stream;
      var startXRef = 0;

      if (this.linearization) {
        stream.reset();

        if (find(stream, 'endobj', 1024)) {
          startXRef = stream.pos + 6;
        }
      } else {
        var step = 1024;
        var startXRefLength = 'startxref'.length;
        var found = false,
            pos = stream.end;

        while (!found && pos > 0) {
          pos -= step - startXRefLength;

          if (pos < 0) {
            pos = 0;
          }

          stream.pos = pos;
          found = find(stream, 'startxref', step, true);
        }

        if (found) {
          stream.skip(9);
          var ch;

          do {
            ch = stream.getByte();
          } while ((0, _util.isSpace)(ch));

          var str = '';

          while (ch >= 0x20 && ch <= 0x39) {
            str += String.fromCharCode(ch);
            ch = stream.getByte();
          }

          startXRef = parseInt(str, 10);

          if (isNaN(startXRef)) {
            startXRef = 0;
          }
        }
      }

      return (0, _util.shadow)(this, 'startXRef', startXRef);
    }
  }, {
    key: "numPages",
    get: function get() {
      var linearization = this.linearization;
      var num = linearization ? linearization.numPages : this.catalog.numPages;
      return (0, _util.shadow)(this, 'numPages', num);
    }
  }, {
    key: "documentInfo",
    get: function get() {
      var DocumentInfoValidators = {
        Title: _util.isString,
        Author: _util.isString,
        Subject: _util.isString,
        Keywords: _util.isString,
        Creator: _util.isString,
        Producer: _util.isString,
        CreationDate: _util.isString,
        ModDate: _util.isString,
        Trapped: _primitives.isName
      };
      var docInfo = {
        PDFFormatVersion: this.pdfFormatVersion,
        IsLinearized: !!this.linearization,
        IsAcroFormPresent: !!this.acroForm,
        IsXFAPresent: !!this.xfa
      };
      var infoDict;

      try {
        infoDict = this.xref.trailer.get('Info');
      } catch (err) {
        if (err instanceof _util.MissingDataException) {
          throw err;
        }

        (0, _util.info)('The document information dictionary is invalid.');
      }

      if ((0, _primitives.isDict)(infoDict)) {
        var _iteratorNormalCompletion4 = true;
        var _didIteratorError4 = false;
        var _iteratorError4 = undefined;

        try {
          for (var _iterator4 = infoDict.getKeys()[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
            var key = _step4.value;
            var value = infoDict.get(key);

            if (DocumentInfoValidators[key]) {
              if (DocumentInfoValidators[key](value)) {
                docInfo[key] = typeof value !== 'string' ? value : (0, _util.stringToPDFString)(value);
              } else {
                (0, _util.info)("Bad value in document info for \"".concat(key, "\"."));
              }
            } else if (typeof key === 'string') {
              var customValue = void 0;

              if ((0, _util.isString)(value)) {
                customValue = (0, _util.stringToPDFString)(value);
              } else if ((0, _primitives.isName)(value) || (0, _util.isNum)(value) || (0, _util.isBool)(value)) {
                customValue = value;
              } else {
                (0, _util.info)("Unsupported value in document info for (custom) \"".concat(key, "\"."));
                continue;
              }

              if (!docInfo['Custom']) {
                docInfo['Custom'] = Object.create(null);
              }

              docInfo['Custom'][key] = customValue;
            }
          }
        } catch (err) {
          _didIteratorError4 = true;
          _iteratorError4 = err;
        } finally {
          try {
            if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
              _iterator4.return();
            }
          } finally {
            if (_didIteratorError4) {
              throw _iteratorError4;
            }
          }
        }
      }

      return (0, _util.shadow)(this, 'documentInfo', docInfo);
    }
  }, {
    key: "fingerprint",
    get: function get() {
      var hash;
      var idArray = this.xref.trailer.get('ID');

      if (Array.isArray(idArray) && idArray[0] && (0, _util.isString)(idArray[0]) && idArray[0] !== EMPTY_FINGERPRINT) {
        hash = (0, _util.stringToBytes)(idArray[0]);
      } else {
        if (this.stream.ensureRange) {
          this.stream.ensureRange(0, Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end));
        }

        hash = (0, _crypto.calculateMD5)(this.stream.bytes.subarray(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES);
      }

      var fingerprint = '';

      for (var i = 0, ii = hash.length; i < ii; i++) {
        var hex = hash[i].toString(16);
        fingerprint += hex.length === 1 ? '0' + hex : hex;
      }

      return (0, _util.shadow)(this, 'fingerprint', fingerprint);
    }
  }]);

  return PDFDocument;
}();

exports.PDFDocument = PDFDocument;

/***/ }),
/* 154 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.FileSpec = exports.XRef = exports.ObjectLoader = exports.Catalog = void 0;

var _regenerator = _interopRequireDefault(__w_pdfjs_require__(2));

var _util = __w_pdfjs_require__(6);

var _primitives = __w_pdfjs_require__(155);

var _parser = __w_pdfjs_require__(156);

var _chunked_stream = __w_pdfjs_require__(152);

var _crypto = __w_pdfjs_require__(167);

var _colorspace = __w_pdfjs_require__(168);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function fetchDestination(dest) {
  return (0, _primitives.isDict)(dest) ? dest.get('D') : dest;
}

var Catalog =
/*#__PURE__*/
function () {
  function Catalog(pdfManager, xref) {
    _classCallCheck(this, Catalog);

    this.pdfManager = pdfManager;
    this.xref = xref;
    this.catDict = xref.getCatalogObj();

    if (!(0, _primitives.isDict)(this.catDict)) {
      throw new _util.FormatError('Catalog object is not a dictionary.');
    }

    this.fontCache = new _primitives.RefSetCache();
    this.builtInCMapCache = new Map();
    this.pageKidsCountCache = new _primitives.RefSetCache();
  }

  _createClass(Catalog, [{
    key: "_readDocumentOutline",
    value: function _readDocumentOutline() {
      var obj = this.catDict.get('Outlines');

      if (!(0, _primitives.isDict)(obj)) {
        return null;
      }

      obj = obj.getRaw('First');

      if (!(0, _primitives.isRef)(obj)) {
        return null;
      }

      var root = {
        items: []
      };
      var queue = [{
        obj: obj,
        parent: root
      }];
      var processed = new _primitives.RefSet();
      processed.put(obj);
      var xref = this.xref,
          blackColor = new Uint8ClampedArray(3);

      while (queue.length > 0) {
        var i = queue.shift();
        var outlineDict = xref.fetchIfRef(i.obj);

        if (outlineDict === null) {
          continue;
        }

        if (!outlineDict.has('Title')) {
          throw new _util.FormatError('Invalid outline item encountered.');
        }

        var data = {
          url: null,
          dest: null
        };
        Catalog.parseDestDictionary({
          destDict: outlineDict,
          resultObj: data,
          docBaseUrl: this.pdfManager.docBaseUrl
        });
        var title = outlineDict.get('Title');
        var flags = outlineDict.get('F') || 0;
        var color = outlineDict.getArray('C');
        var rgbColor = blackColor;

        if (Array.isArray(color) && color.length === 3 && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) {
          rgbColor = _colorspace.ColorSpace.singletons.rgb.getRgb(color, 0);
        }

        var outlineItem = {
          dest: data.dest,
          url: data.url,
          unsafeUrl: data.unsafeUrl,
          newWindow: data.newWindow,
          title: (0, _util.stringToPDFString)(title),
          color: rgbColor,
          count: outlineDict.get('Count'),
          bold: !!(flags & 2),
          italic: !!(flags & 1),
          items: []
        };
        i.parent.items.push(outlineItem);
        obj = outlineDict.getRaw('First');

        if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {
          queue.push({
            obj: obj,
            parent: outlineItem
          });
          processed.put(obj);
        }

        obj = outlineDict.getRaw('Next');

        if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {
          queue.push({
            obj: obj,
            parent: i.parent
          });
          processed.put(obj);
        }
      }

      return root.items.length > 0 ? root.items : null;
    }
  }, {
    key: "_readPermissions",
    value: function _readPermissions() {
      var encrypt = this.xref.trailer.get('Encrypt');

      if (!(0, _primitives.isDict)(encrypt)) {
        return null;
      }

      var flags = encrypt.get('P');

      if (!(0, _util.isNum)(flags)) {
        return null;
      }

      flags += Math.pow(2, 32);
      var permissions = [];

      for (var key in _util.PermissionFlag) {
        var value = _util.PermissionFlag[key];

        if (flags & value) {
          permissions.push(value);
        }
      }

      return permissions;
    }
  }, {
    key: "getDestination",
    value: function getDestination(destinationId) {
      var obj = this._readDests();

      if (obj instanceof NameTree || obj instanceof _primitives.Dict) {
        return fetchDestination(obj.get(destinationId) || null);
      }

      return null;
    }
  }, {
    key: "_readDests",
    value: function _readDests() {
      var obj = this.catDict.get('Names');

      if (obj && obj.has('Dests')) {
        return new NameTree(obj.getRaw('Dests'), this.xref);
      } else if (this.catDict.has('Dests')) {
        return this.catDict.get('Dests');
      }
    }
  }, {
    key: "_readPageLabels",
    value: function _readPageLabels() {
      var obj = this.catDict.getRaw('PageLabels');

      if (!obj) {
        return null;
      }

      var pageLabels = new Array(this.numPages);
      var style = null,
          prefix = '';
      var numberTree = new NumberTree(obj, this.xref);
      var nums = numberTree.getAll();
      var currentLabel = '',
          currentIndex = 1;

      for (var i = 0, ii = this.numPages; i < ii; i++) {
        if (i in nums) {
          var labelDict = nums[i];

          if (!(0, _primitives.isDict)(labelDict)) {
            throw new _util.FormatError('PageLabel is not a dictionary.');
          }

          if (labelDict.has('Type') && !(0, _primitives.isName)(labelDict.get('Type'), 'PageLabel')) {
            throw new _util.FormatError('Invalid type in PageLabel dictionary.');
          }

          if (labelDict.has('S')) {
            var s = labelDict.get('S');

            if (!(0, _primitives.isName)(s)) {
              throw new _util.FormatError('Invalid style in PageLabel dictionary.');
            }

            style = s.name;
          } else {
            style = null;
          }

          if (labelDict.has('P')) {
            var p = labelDict.get('P');

            if (!(0, _util.isString)(p)) {
              throw new _util.FormatError('Invalid prefix in PageLabel dictionary.');
            }

            prefix = (0, _util.stringToPDFString)(p);
          } else {
            prefix = '';
          }

          if (labelDict.has('St')) {
            var st = labelDict.get('St');

            if (!(Number.isInteger(st) && st >= 1)) {
              throw new _util.FormatError('Invalid start in PageLabel dictionary.');
            }

            currentIndex = st;
          } else {
            currentIndex = 1;
          }
        }

        switch (style) {
          case 'D':
            currentLabel = currentIndex;
            break;

          case 'R':
          case 'r':
            currentLabel = (0, _util.toRomanNumerals)(currentIndex, style === 'r');
            break;

          case 'A':
          case 'a':
            var LIMIT = 26;
            var A_UPPER_CASE = 0x41,
                A_LOWER_CASE = 0x61;
            var baseCharCode = style === 'a' ? A_LOWER_CASE : A_UPPER_CASE;
            var letterIndex = currentIndex - 1;
            var character = String.fromCharCode(baseCharCode + letterIndex % LIMIT);
            var charBuf = [];

            for (var j = 0, jj = letterIndex / LIMIT | 0; j <= jj; j++) {
              charBuf.push(character);
            }

            currentLabel = charBuf.join('');
            break;

          default:
            if (style) {
              throw new _util.FormatError("Invalid style \"".concat(style, "\" in PageLabel dictionary."));
            }

            currentLabel = '';
        }

        pageLabels[i] = prefix + currentLabel;
        currentIndex++;
      }

      return pageLabels;
    }
  }, {
    key: "fontFallback",
    value: function fontFallback(id, handler) {
      var promises = [];
      this.fontCache.forEach(function (promise) {
        promises.push(promise);
      });
      return Promise.all(promises).then(function (translatedFonts) {
        var _iteratorNormalCompletion = true;
        var _didIteratorError = false;
        var _iteratorError = undefined;

        try {
          for (var _iterator = translatedFonts[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
            var translatedFont = _step.value;

            if (translatedFont.loadedName === id) {
              translatedFont.fallback(handler);
              return;
            }
          }
        } catch (err) {
          _didIteratorError = true;
          _iteratorError = err;
        } finally {
          try {
            if (!_iteratorNormalCompletion && _iterator.return != null) {
              _iterator.return();
            }
          } finally {
            if (_didIteratorError) {
              throw _iteratorError;
            }
          }
        }
      });
    }
  }, {
    key: "cleanup",
    value: function cleanup() {
      var _this = this;

      this.pageKidsCountCache.clear();
      var promises = [];
      this.fontCache.forEach(function (promise) {
        promises.push(promise);
      });
      return Promise.all(promises).then(function (translatedFonts) {
        for (var i = 0, ii = translatedFonts.length; i < ii; i++) {
          var font = translatedFonts[i].dict;
          delete font.translated;
        }

        _this.fontCache.clear();

        _this.builtInCMapCache.clear();
      });
    }
  }, {
    key: "getPageDict",
    value: function getPageDict(pageIndex) {
      var capability = (0, _util.createPromiseCapability)();
      var nodesToVisit = [this.catDict.getRaw('Pages')];
      var xref = this.xref,
          pageKidsCountCache = this.pageKidsCountCache;
      var count,
          currentPageIndex = 0;

      function next() {
        var _loop = function _loop() {
          var currentNode = nodesToVisit.pop();

          if ((0, _primitives.isRef)(currentNode)) {
            count = pageKidsCountCache.get(currentNode);

            if (count > 0 && currentPageIndex + count < pageIndex) {
              currentPageIndex += count;
              return "continue";
            }

            xref.fetchAsync(currentNode).then(function (obj) {
              if ((0, _primitives.isDict)(obj, 'Page') || (0, _primitives.isDict)(obj) && !obj.has('Kids')) {
                if (pageIndex === currentPageIndex) {
                  if (currentNode && !pageKidsCountCache.has(currentNode)) {
                    pageKidsCountCache.put(currentNode, 1);
                  }

                  capability.resolve([obj, currentNode]);
                } else {
                  currentPageIndex++;
                  next();
                }

                return;
              }

              nodesToVisit.push(obj);
              next();
            }, capability.reject);
            return {
              v: void 0
            };
          }

          if (!(0, _primitives.isDict)(currentNode)) {
            capability.reject(new _util.FormatError('Page dictionary kid reference points to wrong type of object.'));
            return {
              v: void 0
            };
          }

          count = currentNode.get('Count');

          if (Number.isInteger(count) && count >= 0) {
            var objId = currentNode.objId;

            if (objId && !pageKidsCountCache.has(objId)) {
              pageKidsCountCache.put(objId, count);
            }

            if (currentPageIndex + count <= pageIndex) {
              currentPageIndex += count;
              return "continue";
            }
          }

          var kids = currentNode.get('Kids');

          if (!Array.isArray(kids)) {
            if ((0, _primitives.isName)(currentNode.get('Type'), 'Page') || !currentNode.has('Type') && currentNode.has('Contents')) {
              if (currentPageIndex === pageIndex) {
                capability.resolve([currentNode, null]);
                return {
                  v: void 0
                };
              }

              currentPageIndex++;
              return "continue";
            }

            capability.reject(new _util.FormatError('Page dictionary kids object is not an array.'));
            return {
              v: void 0
            };
          }

          for (var last = kids.length - 1; last >= 0; last--) {
            nodesToVisit.push(kids[last]);
          }
        };

        while (nodesToVisit.length) {
          var _ret = _loop();

          switch (_ret) {
            case "continue":
              continue;

            default:
              if (_typeof(_ret) === "object") return _ret.v;
          }
        }

        capability.reject(new Error("Page index ".concat(pageIndex, " not found.")));
      }

      next();
      return capability.promise;
    }
  }, {
    key: "getPageIndex",
    value: function getPageIndex(pageRef) {
      var xref = this.xref;

      function pagesBeforeRef(kidRef) {
        var total = 0,
            parentRef;
        return xref.fetchAsync(kidRef).then(function (node) {
          if ((0, _primitives.isRefsEqual)(kidRef, pageRef) && !(0, _primitives.isDict)(node, 'Page') && !((0, _primitives.isDict)(node) && !node.has('Type') && node.has('Contents'))) {
            throw new _util.FormatError('The reference does not point to a /Page dictionary.');
          }

          if (!node) {
            return null;
          }

          if (!(0, _primitives.isDict)(node)) {
            throw new _util.FormatError('Node must be a dictionary.');
          }

          parentRef = node.getRaw('Parent');
          return node.getAsync('Parent');
        }).then(function (parent) {
          if (!parent) {
            return null;
          }

          if (!(0, _primitives.isDict)(parent)) {
            throw new _util.FormatError('Parent must be a dictionary.');
          }

          return parent.getAsync('Kids');
        }).then(function (kids) {
          if (!kids) {
            return null;
          }

          var kidPromises = [];
          var found = false;

          for (var i = 0, ii = kids.length; i < ii; i++) {
            var kid = kids[i];

            if (!(0, _primitives.isRef)(kid)) {
              throw new _util.FormatError('Kid must be a reference.');
            }

            if ((0, _primitives.isRefsEqual)(kid, kidRef)) {
              found = true;
              break;
            }

            kidPromises.push(xref.fetchAsync(kid).then(function (kid) {
              if (!(0, _primitives.isDict)(kid)) {
                throw new _util.FormatError('Kid node must be a dictionary.');
              }

              if (kid.has('Count')) {
                total += kid.get('Count');
              } else {
                total++;
              }
            }));
          }

          if (!found) {
            throw new _util.FormatError('Kid reference not found in parent\'s kids.');
          }

          return Promise.all(kidPromises).then(function () {
            return [total, parentRef];
          });
        });
      }

      var total = 0;

      function next(ref) {
        return pagesBeforeRef(ref).then(function (args) {
          if (!args) {
            return total;
          }

          var _args = _slicedToArray(args, 2),
              count = _args[0],
              parentRef = _args[1];

          total += count;
          return next(parentRef);
        });
      }

      return next(pageRef);
    }
  }, {
    key: "metadata",
    get: function get() {
      var streamRef = this.catDict.getRaw('Metadata');

      if (!(0, _primitives.isRef)(streamRef)) {
        return (0, _util.shadow)(this, 'metadata', null);
      }

      var suppressEncryption = !(this.xref.encrypt && this.xref.encrypt.encryptMetadata);
      var stream = this.xref.fetch(streamRef, suppressEncryption);
      var metadata;

      if (stream && (0, _primitives.isDict)(stream.dict)) {
        var type = stream.dict.get('Type');
        var subtype = stream.dict.get('Subtype');

        if ((0, _primitives.isName)(type, 'Metadata') && (0, _primitives.isName)(subtype, 'XML')) {
          try {
            metadata = (0, _util.stringToUTF8String)((0, _util.bytesToString)(stream.getBytes()));
          } catch (e) {
            if (e instanceof _util.MissingDataException) {
              throw e;
            }

            (0, _util.info)('Skipping invalid metadata.');
          }
        }
      }

      return (0, _util.shadow)(this, 'metadata', metadata);
    }
  }, {
    key: "toplevelPagesDict",
    get: function get() {
      var pagesObj = this.catDict.get('Pages');

      if (!(0, _primitives.isDict)(pagesObj)) {
        throw new _util.FormatError('Invalid top-level pages dictionary.');
      }

      return (0, _util.shadow)(this, 'toplevelPagesDict', pagesObj);
    }
  }, {
    key: "documentOutline",
    get: function get() {
      var obj = null;

      try {
        obj = this._readDocumentOutline();
      } catch (ex) {
        if (ex instanceof _util.MissingDataException) {
          throw ex;
        }

        (0, _util.warn)('Unable to read document outline.');
      }

      return (0, _util.shadow)(this, 'documentOutline', obj);
    }
  }, {
    key: "permissions",
    get: function get() {
      var permissions = null;

      try {
        permissions = this._readPermissions();
      } catch (ex) {
        if (ex instanceof _util.MissingDataException) {
          throw ex;
        }

        (0, _util.warn)('Unable to read permissions.');
      }

      return (0, _util.shadow)(this, 'permissions', permissions);
    }
  }, {
    key: "numPages",
    get: function get() {
      var obj = this.toplevelPagesDict.get('Count');

      if (!Number.isInteger(obj)) {
        throw new _util.FormatError('Page count in top-level pages dictionary is not an integer.');
      }

      return (0, _util.shadow)(this, 'numPages', obj);
    }
  }, {
    key: "destinations",
    get: function get() {
      var obj = this._readDests(),
          dests = Object.create(null);

      if (obj instanceof NameTree) {
        var names = obj.getAll();

        for (var name in names) {
          dests[name] = fetchDestination(names[name]);
        }
      } else if (obj instanceof _primitives.Dict) {
        obj.forEach(function (key, value) {
          if (value) {
            dests[key] = fetchDestination(value);
          }
        });
      }

      return (0, _util.shadow)(this, 'destinations', dests);
    }
  }, {
    key: "pageLabels",
    get: function get() {
      var obj = null;

      try {
        obj = this._readPageLabels();
      } catch (ex) {
        if (ex instanceof _util.MissingDataException) {
          throw ex;
        }

        (0, _util.warn)('Unable to read page labels.');
      }

      return (0, _util.shadow)(this, 'pageLabels', obj);
    }
  }, {
    key: "pageMode",
    get: function get() {
      var obj = this.catDict.get('PageMode');
      var pageMode = 'UseNone';

      if ((0, _primitives.isName)(obj)) {
        switch (obj.name) {
          case 'UseNone':
          case 'UseOutlines':
          case 'UseThumbs':
          case 'FullScreen':
          case 'UseOC':
          case 'UseAttachments':
            pageMode = obj.name;
        }
      }

      return (0, _util.shadow)(this, 'pageMode', pageMode);
    }
  }, {
    key: "openActionDestination",
    get: function get() {
      var obj = this.catDict.get('OpenAction');
      var openActionDest = null;

      if ((0, _primitives.isDict)(obj)) {
        var destDict = new _primitives.Dict(this.xref);
        destDict.set('A', obj);
        var resultObj = {
          url: null,
          dest: null
        };
        Catalog.parseDestDictionary({
          destDict: destDict,
          resultObj: resultObj
        });

        if (Array.isArray(resultObj.dest)) {
          openActionDest = resultObj.dest;
        }
      } else if (Array.isArray(obj)) {
        openActionDest = obj;
      }

      return (0, _util.shadow)(this, 'openActionDestination', openActionDest);
    }
  }, {
    key: "attachments",
    get: function get() {
      var obj = this.catDict.get('Names');
      var attachments = null;

      if (obj && obj.has('EmbeddedFiles')) {
        var nameTree = new NameTree(obj.getRaw('EmbeddedFiles'), this.xref);
        var names = nameTree.getAll();

        for (var name in names) {
          var fs = new FileSpec(names[name], this.xref);

          if (!attachments) {
            attachments = Object.create(null);
          }

          attachments[(0, _util.stringToPDFString)(name)] = fs.serializable;
        }
      }

      return (0, _util.shadow)(this, 'attachments', attachments);
    }
  }, {
    key: "javaScript",
    get: function get() {
      var obj = this.catDict.get('Names');
      var javaScript = null;

      function appendIfJavaScriptDict(jsDict) {
        var type = jsDict.get('S');

        if (!(0, _primitives.isName)(type, 'JavaScript')) {
          return;
        }

        var js = jsDict.get('JS');

        if ((0, _primitives.isStream)(js)) {
          js = (0, _util.bytesToString)(js.getBytes());
        } else if (!(0, _util.isString)(js)) {
          return;
        }

        if (!javaScript) {
          javaScript = [];
        }

        javaScript.push((0, _util.stringToPDFString)(js));
      }

      if (obj && obj.has('JavaScript')) {
        var nameTree = new NameTree(obj.getRaw('JavaScript'), this.xref);
        var names = nameTree.getAll();

        for (var name in names) {
          var jsDict = names[name];

          if ((0, _primitives.isDict)(jsDict)) {
            appendIfJavaScriptDict(jsDict);
          }
        }
      }

      var openActionDict = this.catDict.get('OpenAction');

      if ((0, _primitives.isDict)(openActionDict, 'Action')) {
        var actionType = openActionDict.get('S');

        if ((0, _primitives.isName)(actionType, 'Named')) {
          var action = openActionDict.get('N');

          if ((0, _primitives.isName)(action, 'Print')) {
            if (!javaScript) {
              javaScript = [];
            }

            javaScript.push('print({});');
          }
        } else {
          appendIfJavaScriptDict(openActionDict);
        }
      }

      return (0, _util.shadow)(this, 'javaScript', javaScript);
    }
  }], [{
    key: "parseDestDictionary",
    value: function parseDestDictionary(params) {
      function addDefaultProtocolToUrl(url) {
        return url.startsWith('www.') ? "http://".concat(url) : url;
      }

      function tryConvertUrlEncoding(url) {
        try {
          return (0, _util.stringToUTF8String)(url);
        } catch (e) {
          return url;
        }
      }

      var destDict = params.destDict;

      if (!(0, _primitives.isDict)(destDict)) {
        (0, _util.warn)('parseDestDictionary: `destDict` must be a dictionary.');
        return;
      }

      var resultObj = params.resultObj;

      if (_typeof(resultObj) !== 'object') {
        (0, _util.warn)('parseDestDictionary: `resultObj` must be an object.');
        return;
      }

      var docBaseUrl = params.docBaseUrl || null;
      var action = destDict.get('A'),
          url,
          dest;

      if (!(0, _primitives.isDict)(action) && destDict.has('Dest')) {
        action = destDict.get('Dest');
      }

      if ((0, _primitives.isDict)(action)) {
        var actionType = action.get('S');

        if (!(0, _primitives.isName)(actionType)) {
          (0, _util.warn)('parseDestDictionary: Invalid type in Action dictionary.');
          return;
        }

        var actionName = actionType.name;

        switch (actionName) {
          case 'URI':
            url = action.get('URI');

            if ((0, _primitives.isName)(url)) {
              url = '/' + url.name;
            } else if ((0, _util.isString)(url)) {
              url = addDefaultProtocolToUrl(url);
            }

            break;

          case 'GoTo':
            dest = action.get('D');
            break;

          case 'Launch':
          case 'GoToR':
            var urlDict = action.get('F');

            if ((0, _primitives.isDict)(urlDict)) {
              url = urlDict.get('F') || null;
            } else if ((0, _util.isString)(urlDict)) {
              url = urlDict;
            }

            var remoteDest = action.get('D');

            if (remoteDest) {
              if ((0, _primitives.isName)(remoteDest)) {
                remoteDest = remoteDest.name;
              }

              if ((0, _util.isString)(url)) {
                var baseUrl = url.split('#')[0];

                if ((0, _util.isString)(remoteDest)) {
                  url = baseUrl + '#' + remoteDest;
                } else if (Array.isArray(remoteDest)) {
                  url = baseUrl + '#' + JSON.stringify(remoteDest);
                }
              }
            }

            var newWindow = action.get('NewWindow');

            if ((0, _util.isBool)(newWindow)) {
              resultObj.newWindow = newWindow;
            }

            break;

          case 'Named':
            var namedAction = action.get('N');

            if ((0, _primitives.isName)(namedAction)) {
              resultObj.action = namedAction.name;
            }

            break;

          case 'JavaScript':
            var jsAction = action.get('JS');
            var js;

            if ((0, _primitives.isStream)(jsAction)) {
              js = (0, _util.bytesToString)(jsAction.getBytes());
            } else if ((0, _util.isString)(jsAction)) {
              js = jsAction;
            }

            if (js) {
              var URL_OPEN_METHODS = ['app.launchURL', 'window.open'];
              var regex = new RegExp('^\\s*(' + URL_OPEN_METHODS.join('|').split('.').join('\\.') + ')\\((?:\'|\")([^\'\"]*)(?:\'|\")(?:,\\s*(\\w+)\\)|\\))', 'i');
              var jsUrl = regex.exec((0, _util.stringToPDFString)(js));

              if (jsUrl && jsUrl[2]) {
                url = jsUrl[2];

                if (jsUrl[3] === 'true' && jsUrl[1] === 'app.launchURL') {
                  resultObj.newWindow = true;
                }

                break;
              }
            }

          default:
            (0, _util.warn)("parseDestDictionary: unsupported action type \"".concat(actionName, "\"."));
            break;
        }
      } else if (destDict.has('Dest')) {
        dest = destDict.get('Dest');
      }

      if ((0, _util.isString)(url)) {
        url = tryConvertUrlEncoding(url);
        var absoluteUrl = (0, _util.createValidAbsoluteUrl)(url, docBaseUrl);

        if (absoluteUrl) {
          resultObj.url = absoluteUrl.href;
        }

        resultObj.unsafeUrl = url;
      }

      if (dest) {
        if ((0, _primitives.isName)(dest)) {
          dest = dest.name;
        }

        if ((0, _util.isString)(dest) || Array.isArray(dest)) {
          resultObj.dest = dest;
        }
      }
    }
  }]);

  return Catalog;
}();

exports.Catalog = Catalog;

var XRef = function XRefClosure() {
  function XRef(stream, pdfManager) {
    this.stream = stream;
    this.pdfManager = pdfManager;
    this.entries = [];
    this.xrefstms = Object.create(null);
    this.cache = [];
    this.stats = {
      streamTypes: [],
      fontTypes: []
    };
  }

  XRef.prototype = {
    setStartXRef: function XRef_setStartXRef(startXRef) {
      this.startXRefQueue = [startXRef];
    },
    parse: function XRef_parse(recoveryMode) {
      var trailerDict;

      if (!recoveryMode) {
        trailerDict = this.readXRef();
      } else {
        (0, _util.warn)('Indexing all PDF objects');
        trailerDict = this.indexObjects();
      }

      trailerDict.assignXref(this);
      this.trailer = trailerDict;
      var encrypt;

      try {
        encrypt = trailerDict.get('Encrypt');
      } catch (ex) {
        if (ex instanceof _util.MissingDataException) {
          throw ex;
        }

        (0, _util.warn)("XRef.parse - Invalid \"Encrypt\" reference: \"".concat(ex, "\"."));
      }

      if ((0, _primitives.isDict)(encrypt)) {
        var ids = trailerDict.get('ID');
        var fileId = ids && ids.length ? ids[0] : '';
        encrypt.suppressEncryption = true;
        this.encrypt = new _crypto.CipherTransformFactory(encrypt, fileId, this.pdfManager.password);
      }

      var root;

      try {
        root = trailerDict.get('Root');
      } catch (ex) {
        if (ex instanceof _util.MissingDataException) {
          throw ex;
        }

        (0, _util.warn)("XRef.parse - Invalid \"Root\" reference: \"".concat(ex, "\"."));
      }

      if ((0, _primitives.isDict)(root) && root.has('Pages')) {
        this.root = root;
      } else {
        if (!recoveryMode) {
          throw new _util.XRefParseException();
        }

        throw new _util.FormatError('Invalid root reference');
      }
    },
    processXRefTable: function XRef_processXRefTable(parser) {
      if (!('tableState' in this)) {
        this.tableState = {
          entryNum: 0,
          streamPos: parser.lexer.stream.pos,
          parserBuf1: parser.buf1,
          parserBuf2: parser.buf2
        };
      }

      var obj = this.readXRefTable(parser);

      if (!(0, _primitives.isCmd)(obj, 'trailer')) {
        throw new _util.FormatError('Invalid XRef table: could not find trailer dictionary');
      }

      var dict = parser.getObj();

      if (!(0, _primitives.isDict)(dict) && dict.dict) {
        dict = dict.dict;
      }

      if (!(0, _primitives.isDict)(dict)) {
        throw new _util.FormatError('Invalid XRef table: could not parse trailer dictionary');
      }

      delete this.tableState;
      return dict;
    },
    readXRefTable: function XRef_readXRefTable(parser) {
      var stream = parser.lexer.stream;
      var tableState = this.tableState;
      stream.pos = tableState.streamPos;
      parser.buf1 = tableState.parserBuf1;
      parser.buf2 = tableState.parserBuf2;
      var obj;

      while (true) {
        if (!('firstEntryNum' in tableState) || !('entryCount' in tableState)) {
          if ((0, _primitives.isCmd)(obj = parser.getObj(), 'trailer')) {
            break;
          }

          tableState.firstEntryNum = obj;
          tableState.entryCount = parser.getObj();
        }

        var first = tableState.firstEntryNum;
        var count = tableState.entryCount;

        if (!Number.isInteger(first) || !Number.isInteger(count)) {
          throw new _util.FormatError('Invalid XRef table: wrong types in subsection header');
        }

        for (var i = tableState.entryNum; i < count; i++) {
          tableState.streamPos = stream.pos;
          tableState.entryNum = i;
          tableState.parserBuf1 = parser.buf1;
          tableState.parserBuf2 = parser.buf2;
          var entry = {};
          entry.offset = parser.getObj();
          entry.gen = parser.getObj();
          var type = parser.getObj();

          if ((0, _primitives.isCmd)(type, 'f')) {
            entry.free = true;
          } else if ((0, _primitives.isCmd)(type, 'n')) {
            entry.uncompressed = true;
          }

          if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || entry.uncompressed)) {
            throw new _util.FormatError("Invalid entry in XRef subsection: ".concat(first, ", ").concat(count));
          }

          if (i === 0 && entry.free && first === 1) {
            first = 0;
          }

          if (!this.entries[i + first]) {
            this.entries[i + first] = entry;
          }
        }

        tableState.entryNum = 0;
        tableState.streamPos = stream.pos;
        tableState.parserBuf1 = parser.buf1;
        tableState.parserBuf2 = parser.buf2;
        delete tableState.firstEntryNum;
        delete tableState.entryCount;
      }

      if (this.entries[0] && !this.entries[0].free) {
        throw new _util.FormatError('Invalid XRef table: unexpected first object');
      }

      return obj;
    },
    processXRefStream: function XRef_processXRefStream(stream) {
      if (!('streamState' in this)) {
        var streamParameters = stream.dict;
        var byteWidths = streamParameters.get('W');
        var range = streamParameters.get('Index');

        if (!range) {
          range = [0, streamParameters.get('Size')];
        }

        this.streamState = {
          entryRanges: range,
          byteWidths: byteWidths,
          entryNum: 0,
          streamPos: stream.pos
        };
      }

      this.readXRefStream(stream);
      delete this.streamState;
      return stream.dict;
    },
    readXRefStream: function XRef_readXRefStream(stream) {
      var i, j;
      var streamState = this.streamState;
      stream.pos = streamState.streamPos;
      var byteWidths = streamState.byteWidths;
      var typeFieldWidth = byteWidths[0];
      var offsetFieldWidth = byteWidths[1];
      var generationFieldWidth = byteWidths[2];
      var entryRanges = streamState.entryRanges;

      while (entryRanges.length > 0) {
        var first = entryRanges[0];
        var n = entryRanges[1];

        if (!Number.isInteger(first) || !Number.isInteger(n)) {
          throw new _util.FormatError("Invalid XRef range fields: ".concat(first, ", ").concat(n));
        }

        if (!Number.isInteger(typeFieldWidth) || !Number.isInteger(offsetFieldWidth) || !Number.isInteger(generationFieldWidth)) {
          throw new _util.FormatError("Invalid XRef entry fields length: ".concat(first, ", ").concat(n));
        }

        for (i = streamState.entryNum; i < n; ++i) {
          streamState.entryNum = i;
          streamState.streamPos = stream.pos;
          var type = 0,
              offset = 0,
              generation = 0;

          for (j = 0; j < typeFieldWidth; ++j) {
            type = type << 8 | stream.getByte();
          }

          if (typeFieldWidth === 0) {
            type = 1;
          }

          for (j = 0; j < offsetFieldWidth; ++j) {
            offset = offset << 8 | stream.getByte();
          }

          for (j = 0; j < generationFieldWidth; ++j) {
            generation = generation << 8 | stream.getByte();
          }

          var entry = {};
          entry.offset = offset;
          entry.gen = generation;

          switch (type) {
            case 0:
              entry.free = true;
              break;

            case 1:
              entry.uncompressed = true;
              break;

            case 2:
              break;

            default:
              throw new _util.FormatError("Invalid XRef entry type: ".concat(type));
          }

          if (!this.entries[first + i]) {
            this.entries[first + i] = entry;
          }
        }

        streamState.entryNum = 0;
        streamState.streamPos = stream.pos;
        entryRanges.splice(0, 2);
      }
    },
    indexObjects: function XRef_indexObjects() {
      var TAB = 0x9,
          LF = 0xA,
          CR = 0xD,
          SPACE = 0x20;
      var PERCENT = 0x25,
          LT = 0x3C;

      function readToken(data, offset) {
        var token = '',
            ch = data[offset];

        while (ch !== LF && ch !== CR && ch !== LT) {
          if (++offset >= data.length) {
            break;
          }

          token += String.fromCharCode(ch);
          ch = data[offset];
        }

        return token;
      }

      function skipUntil(data, offset, what) {
        var length = what.length,
            dataLength = data.length;
        var skipped = 0;

        while (offset < dataLength) {
          var i = 0;

          while (i < length && data[offset + i] === what[i]) {
            ++i;
          }

          if (i >= length) {
            break;
          }

          offset++;
          skipped++;
        }

        return skipped;
      }

      var objRegExp = /^(\d+)\s+(\d+)\s+obj\b/;
      var endobjRegExp = /\bendobj[\b\s]$/;
      var nestedObjRegExp = /\s+(\d+\s+\d+\s+obj[\b\s<])$/;
      var CHECK_CONTENT_LENGTH = 25;
      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]);
      var objBytes = new Uint8Array([111, 98, 106]);
      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
      this.entries.length = 0;
      var stream = this.stream;
      stream.pos = 0;
      var buffer = stream.getBytes();
      var position = stream.start,
          length = buffer.length;
      var trailers = [],
          xrefStms = [];

      while (position < length) {
        var ch = buffer[position];

        if (ch === TAB || ch === LF || ch === CR || ch === SPACE) {
          ++position;
          continue;
        }

        if (ch === PERCENT) {
          do {
            ++position;

            if (position >= length) {
              break;
            }

            ch = buffer[position];
          } while (ch !== LF && ch !== CR);

          continue;
        }

        var token = readToken(buffer, position);
        var m;

        if (token.startsWith('xref') && (token.length === 4 || /\s/.test(token[4]))) {
          position += skipUntil(buffer, position, trailerBytes);
          trailers.push(position);
          position += skipUntil(buffer, position, startxrefBytes);
        } else if (m = objRegExp.exec(token)) {
          var num = m[1] | 0,
              gen = m[2] | 0;

          if (typeof this.entries[num] === 'undefined') {
            this.entries[num] = {
              offset: position - stream.start,
              gen: gen,
              uncompressed: true
            };
          }

          var contentLength = void 0,
              startPos = position + token.length;

          while (startPos < buffer.length) {
            var endPos = startPos + skipUntil(buffer, startPos, objBytes) + 4;
            contentLength = endPos - position;
            var checkPos = Math.max(endPos - CHECK_CONTENT_LENGTH, startPos);
            var tokenStr = (0, _util.bytesToString)(buffer.subarray(checkPos, endPos));

            if (endobjRegExp.test(tokenStr)) {
              break;
            } else {
              var objToken = nestedObjRegExp.exec(tokenStr);

              if (objToken && objToken[1]) {
                (0, _util.warn)('indexObjects: Found new "obj" inside of another "obj", ' + 'caused by missing "endobj" -- trying to recover.');
                contentLength -= objToken[1].length;
                break;
              }
            }

            startPos = endPos;
          }

          var content = buffer.subarray(position, position + contentLength);
          var xrefTagOffset = skipUntil(content, 0, xrefBytes);

          if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) {
            xrefStms.push(position - stream.start);
            this.xrefstms[position - stream.start] = 1;
          }

          position += contentLength;
        } else if (token.startsWith('trailer') && (token.length === 7 || /\s/.test(token[7]))) {
          trailers.push(position);
          position += skipUntil(buffer, position, startxrefBytes);
        } else {
          position += token.length + 1;
        }
      }

      var i, ii;

      for (i = 0, ii = xrefStms.length; i < ii; ++i) {
        this.startXRefQueue.push(xrefStms[i]);
        this.readXRef(true);
      }

      var trailerDict;

      for (i = 0, ii = trailers.length; i < ii; ++i) {
        stream.pos = trailers[i];
        var parser = new _parser.Parser(new _parser.Lexer(stream), true, this, true);
        var obj = parser.getObj();

        if (!(0, _primitives.isCmd)(obj, 'trailer')) {
          continue;
        }

        var dict = parser.getObj();

        if (!(0, _primitives.isDict)(dict)) {
          continue;
        }

        var rootDict = void 0;

        try {
          rootDict = dict.get('Root');
        } catch (ex) {
          if (ex instanceof _util.MissingDataException) {
            throw ex;
          }

          continue;
        }

        if (!(0, _primitives.isDict)(rootDict) || !rootDict.has('Pages')) {
          continue;
        }

        if (dict.has('ID')) {
          return dict;
        }

        trailerDict = dict;
      }

      if (trailerDict) {
        return trailerDict;
      }

      throw new _util.InvalidPDFException('Invalid PDF structure');
    },
    readXRef: function XRef_readXRef(recoveryMode) {
      var stream = this.stream;
      var startXRefParsedCache = Object.create(null);

      try {
        while (this.startXRefQueue.length) {
          var startXRef = this.startXRefQueue[0];

          if (startXRefParsedCache[startXRef]) {
            (0, _util.warn)('readXRef - skipping XRef table since it was already parsed.');
            this.startXRefQueue.shift();
            continue;
          }

          startXRefParsedCache[startXRef] = true;
          stream.pos = startXRef + stream.start;
          var parser = new _parser.Parser(new _parser.Lexer(stream), true, this);
          var obj = parser.getObj();
          var dict;

          if ((0, _primitives.isCmd)(obj, 'xref')) {
            dict = this.processXRefTable(parser);

            if (!this.topDict) {
              this.topDict = dict;
            }

            obj = dict.get('XRefStm');

            if (Number.isInteger(obj)) {
              var pos = obj;

              if (!(pos in this.xrefstms)) {
                this.xrefstms[pos] = 1;
                this.startXRefQueue.push(pos);
              }
            }
          } else if (Number.isInteger(obj)) {
            if (!Number.isInteger(parser.getObj()) || !(0, _primitives.isCmd)(parser.getObj(), 'obj') || !(0, _primitives.isStream)(obj = parser.getObj())) {
              throw new _util.FormatError('Invalid XRef stream');
            }

            dict = this.processXRefStream(obj);

            if (!this.topDict) {
              this.topDict = dict;
            }

            if (!dict) {
              throw new _util.FormatError('Failed to read XRef stream');
            }
          } else {
            throw new _util.FormatError('Invalid XRef stream header');
          }

          obj = dict.get('Prev');

          if (Number.isInteger(obj)) {
            this.startXRefQueue.push(obj);
          } else if ((0, _primitives.isRef)(obj)) {
            this.startXRefQueue.push(obj.num);
          }

          this.startXRefQueue.shift();
        }

        return this.topDict;
      } catch (e) {
        if (e instanceof _util.MissingDataException) {
          throw e;
        }

        (0, _util.info)('(while reading XRef): ' + e);
      }

      if (recoveryMode) {
        return;
      }

      throw new _util.XRefParseException();
    },
    getEntry: function XRef_getEntry(i) {
      var xrefEntry = this.entries[i];

      if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {
        return xrefEntry;
      }

      return null;
    },
    fetchIfRef: function XRef_fetchIfRef(obj, suppressEncryption) {
      if (!(0, _primitives.isRef)(obj)) {
        return obj;
      }

      return this.fetch(obj, suppressEncryption);
    },
    fetch: function XRef_fetch(ref, suppressEncryption) {
      if (!(0, _primitives.isRef)(ref)) {
        throw new Error('ref object is not a reference');
      }

      var num = ref.num;

      if (num in this.cache) {
        var cacheEntry = this.cache[num];

        if (cacheEntry instanceof _primitives.Dict && !cacheEntry.objId) {
          cacheEntry.objId = ref.toString();
        }

        return cacheEntry;
      }

      var xrefEntry = this.getEntry(num);

      if (xrefEntry === null) {
        return this.cache[num] = null;
      }

      if (xrefEntry.uncompressed) {
        xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption);
      } else {
        xrefEntry = this.fetchCompressed(ref, xrefEntry, suppressEncryption);
      }

      if ((0, _primitives.isDict)(xrefEntry)) {
        xrefEntry.objId = ref.toString();
      } else if ((0, _primitives.isStream)(xrefEntry)) {
        xrefEntry.dict.objId = ref.toString();
      }

      return xrefEntry;
    },
    fetchUncompressed: function fetchUncompressed(ref, xrefEntry) {
      var suppressEncryption = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
      var gen = ref.gen;
      var num = ref.num;

      if (xrefEntry.gen !== gen) {
        throw new _util.XRefEntryException("Inconsistent generation in XRef: ".concat(ref));
      }

      var stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start);
      var parser = new _parser.Parser(new _parser.Lexer(stream), true, this);
      var obj1 = parser.getObj();
      var obj2 = parser.getObj();
      var obj3 = parser.getObj();

      if (!Number.isInteger(obj1)) {
        obj1 = parseInt(obj1, 10);
      }

      if (!Number.isInteger(obj2)) {
        obj2 = parseInt(obj2, 10);
      }

      if (obj1 !== num || obj2 !== gen || !(0, _primitives.isCmd)(obj3)) {
        throw new _util.XRefEntryException("Bad (uncompressed) XRef entry: ".concat(ref));
      }

      if (obj3.cmd !== 'obj') {
        if (obj3.cmd.startsWith('obj')) {
          num = parseInt(obj3.cmd.substring(3), 10);

          if (!Number.isNaN(num)) {
            return num;
          }
        }

        throw new _util.XRefEntryException("Bad (uncompressed) XRef entry: ".concat(ref));
      }

      if (this.encrypt && !suppressEncryption) {
        xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen));
      } else {
        xrefEntry = parser.getObj();
      }

      if (!(0, _primitives.isStream)(xrefEntry)) {
        this.cache[num] = xrefEntry;
      }

      return xrefEntry;
    },
    fetchCompressed: function fetchCompressed(ref, xrefEntry) {
      var suppressEncryption = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
      var tableOffset = xrefEntry.offset;
      var stream = this.fetch(new _primitives.Ref(tableOffset, 0));

      if (!(0, _primitives.isStream)(stream)) {
        throw new _util.FormatError('bad ObjStm stream');
      }

      var first = stream.dict.get('First');
      var n = stream.dict.get('N');

      if (!Number.isInteger(first) || !Number.isInteger(n)) {
        throw new _util.FormatError('invalid first and n parameters for ObjStm stream');
      }

      var parser = new _parser.Parser(new _parser.Lexer(stream), false, this);
      parser.allowStreams = true;
      var i,
          entries = [],
          num,
          nums = [];

      for (i = 0; i < n; ++i) {
        num = parser.getObj();

        if (!Number.isInteger(num)) {
          throw new _util.FormatError("invalid object number in the ObjStm stream: ".concat(num));
        }

        nums.push(num);
        var offset = parser.getObj();

        if (!Number.isInteger(offset)) {
          throw new _util.FormatError("invalid object offset in the ObjStm stream: ".concat(offset));
        }
      }

      for (i = 0; i < n; ++i) {
        entries.push(parser.getObj());

        if ((0, _primitives.isCmd)(parser.buf1, 'endobj')) {
          parser.shift();
        }

        num = nums[i];
        var entry = this.entries[num];

        if (entry && entry.offset === tableOffset && entry.gen === i) {
          this.cache[num] = entries[i];
        }
      }

      xrefEntry = entries[xrefEntry.gen];

      if (xrefEntry === undefined) {
        throw new _util.XRefEntryException("Bad (compressed) XRef entry: ".concat(ref));
      }

      return xrefEntry;
    },
    fetchIfRefAsync: function () {
      var _fetchIfRefAsync = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee(obj, suppressEncryption) {
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                if ((0, _primitives.isRef)(obj)) {
                  _context.next = 2;
                  break;
                }

                return _context.abrupt("return", obj);

              case 2:
                return _context.abrupt("return", this.fetchAsync(obj, suppressEncryption));

              case 3:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function fetchIfRefAsync(_x, _x2) {
        return _fetchIfRefAsync.apply(this, arguments);
      }

      return fetchIfRefAsync;
    }(),
    fetchAsync: function () {
      var _fetchAsync = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee2(ref, suppressEncryption) {
        return _regenerator.default.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                _context2.prev = 0;
                return _context2.abrupt("return", this.fetch(ref, suppressEncryption));

              case 4:
                _context2.prev = 4;
                _context2.t0 = _context2["catch"](0);

                if (_context2.t0 instanceof _util.MissingDataException) {
                  _context2.next = 8;
                  break;
                }

                throw _context2.t0;

              case 8:
                _context2.next = 10;
                return this.pdfManager.requestRange(_context2.t0.begin, _context2.t0.end);

              case 10:
                return _context2.abrupt("return", this.fetchAsync(ref, suppressEncryption));

              case 11:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this, [[0, 4]]);
      }));

      function fetchAsync(_x3, _x4) {
        return _fetchAsync.apply(this, arguments);
      }

      return fetchAsync;
    }(),
    getCatalogObj: function XRef_getCatalogObj() {
      return this.root;
    }
  };
  return XRef;
}();

exports.XRef = XRef;

var NameOrNumberTree =
/*#__PURE__*/
function () {
  function NameOrNumberTree(root, xref, type) {
    _classCallCheck(this, NameOrNumberTree);

    if (this.constructor === NameOrNumberTree) {
      (0, _util.unreachable)('Cannot initialize NameOrNumberTree.');
    }

    this.root = root;
    this.xref = xref;
    this._type = type;
  }

  _createClass(NameOrNumberTree, [{
    key: "getAll",
    value: function getAll() {
      var dict = Object.create(null);

      if (!this.root) {
        return dict;
      }

      var xref = this.xref;
      var processed = new _primitives.RefSet();
      processed.put(this.root);
      var queue = [this.root];

      while (queue.length > 0) {
        var obj = xref.fetchIfRef(queue.shift());

        if (!(0, _primitives.isDict)(obj)) {
          continue;
        }

        if (obj.has('Kids')) {
          var kids = obj.get('Kids');

          for (var i = 0, ii = kids.length; i < ii; i++) {
            var kid = kids[i];

            if (processed.has(kid)) {
              throw new _util.FormatError("Duplicate entry in \"".concat(this._type, "\" tree."));
            }

            queue.push(kid);
            processed.put(kid);
          }

          continue;
        }

        var entries = obj.get(this._type);

        if (Array.isArray(entries)) {
          for (var _i2 = 0, _ii = entries.length; _i2 < _ii; _i2 += 2) {
            dict[xref.fetchIfRef(entries[_i2])] = xref.fetchIfRef(entries[_i2 + 1]);
          }
        }
      }

      return dict;
    }
  }, {
    key: "get",
    value: function get(key) {
      if (!this.root) {
        return null;
      }

      var xref = this.xref;
      var kidsOrEntries = xref.fetchIfRef(this.root);
      var loopCount = 0;
      var MAX_LEVELS = 10;

      while (kidsOrEntries.has('Kids')) {
        if (++loopCount > MAX_LEVELS) {
          (0, _util.warn)("Search depth limit reached for \"".concat(this._type, "\" tree."));
          return null;
        }

        var kids = kidsOrEntries.get('Kids');

        if (!Array.isArray(kids)) {
          return null;
        }

        var l = 0,
            r = kids.length - 1;

        while (l <= r) {
          var m = l + r >> 1;
          var kid = xref.fetchIfRef(kids[m]);
          var limits = kid.get('Limits');

          if (key < xref.fetchIfRef(limits[0])) {
            r = m - 1;
          } else if (key > xref.fetchIfRef(limits[1])) {
            l = m + 1;
          } else {
            kidsOrEntries = xref.fetchIfRef(kids[m]);
            break;
          }
        }

        if (l > r) {
          return null;
        }
      }

      var entries = kidsOrEntries.get(this._type);

      if (Array.isArray(entries)) {
        var _l = 0,
            _r = entries.length - 2;

        while (_l <= _r) {
          var tmp = _l + _r >> 1,
              _m = tmp + (tmp & 1);

          var currentKey = xref.fetchIfRef(entries[_m]);

          if (key < currentKey) {
            _r = _m - 2;
          } else if (key > currentKey) {
            _l = _m + 2;
          } else {
            return xref.fetchIfRef(entries[_m + 1]);
          }
        }

        (0, _util.info)("Falling back to an exhaustive search, for key \"".concat(key, "\", ") + "in \"".concat(this._type, "\" tree."));

        for (var _m2 = 0, mm = entries.length; _m2 < mm; _m2 += 2) {
          var _currentKey = xref.fetchIfRef(entries[_m2]);

          if (_currentKey === key) {
            (0, _util.warn)("The \"".concat(key, "\" key was found at an incorrect, ") + "i.e. out-of-order, position in \"".concat(this._type, "\" tree."));
            return xref.fetchIfRef(entries[_m2 + 1]);
          }
        }
      }

      return null;
    }
  }]);

  return NameOrNumberTree;
}();

var NameTree =
/*#__PURE__*/
function (_NameOrNumberTree) {
  _inherits(NameTree, _NameOrNumberTree);

  function NameTree(root, xref) {
    _classCallCheck(this, NameTree);

    return _possibleConstructorReturn(this, _getPrototypeOf(NameTree).call(this, root, xref, 'Names'));
  }

  return NameTree;
}(NameOrNumberTree);

var NumberTree =
/*#__PURE__*/
function (_NameOrNumberTree2) {
  _inherits(NumberTree, _NameOrNumberTree2);

  function NumberTree(root, xref) {
    _classCallCheck(this, NumberTree);

    return _possibleConstructorReturn(this, _getPrototypeOf(NumberTree).call(this, root, xref, 'Nums'));
  }

  return NumberTree;
}(NameOrNumberTree);

var FileSpec = function FileSpecClosure() {
  function FileSpec(root, xref) {
    if (!root || !(0, _primitives.isDict)(root)) {
      return;
    }

    this.xref = xref;
    this.root = root;

    if (root.has('FS')) {
      this.fs = root.get('FS');
    }

    this.description = root.has('Desc') ? (0, _util.stringToPDFString)(root.get('Desc')) : '';

    if (root.has('RF')) {
      (0, _util.warn)('Related file specifications are not supported');
    }

    this.contentAvailable = true;

    if (!root.has('EF')) {
      this.contentAvailable = false;
      (0, _util.warn)('Non-embedded file specifications are not supported');
    }
  }

  function pickPlatformItem(dict) {
    if (dict.has('UF')) {
      return dict.get('UF');
    } else if (dict.has('F')) {
      return dict.get('F');
    } else if (dict.has('Unix')) {
      return dict.get('Unix');
    } else if (dict.has('Mac')) {
      return dict.get('Mac');
    } else if (dict.has('DOS')) {
      return dict.get('DOS');
    }

    return null;
  }

  FileSpec.prototype = {
    get filename() {
      if (!this._filename && this.root) {
        var filename = pickPlatformItem(this.root) || 'unnamed';
        this._filename = (0, _util.stringToPDFString)(filename).replace(/\\\\/g, '\\').replace(/\\\//g, '/').replace(/\\/g, '/');
      }

      return this._filename;
    },

    get content() {
      if (!this.contentAvailable) {
        return null;
      }

      if (!this.contentRef && this.root) {
        this.contentRef = pickPlatformItem(this.root.get('EF'));
      }

      var content = null;

      if (this.contentRef) {
        var xref = this.xref;
        var fileObj = xref.fetchIfRef(this.contentRef);

        if (fileObj && (0, _primitives.isStream)(fileObj)) {
          content = fileObj.getBytes();
        } else {
          (0, _util.warn)('Embedded file specification points to non-existing/invalid ' + 'content');
        }
      } else {
        (0, _util.warn)('Embedded file specification does not have a content');
      }

      return content;
    },

    get serializable() {
      return {
        filename: this.filename,
        content: this.content
      };
    }

  };
  return FileSpec;
}();

exports.FileSpec = FileSpec;

var ObjectLoader = function () {
  function mayHaveChildren(value) {
    return (0, _primitives.isRef)(value) || (0, _primitives.isDict)(value) || Array.isArray(value) || (0, _primitives.isStream)(value);
  }

  function addChildren(node, nodesToVisit) {
    if ((0, _primitives.isDict)(node) || (0, _primitives.isStream)(node)) {
      var dict = (0, _primitives.isDict)(node) ? node : node.dict;
      var dictKeys = dict.getKeys();

      for (var i = 0, ii = dictKeys.length; i < ii; i++) {
        var rawValue = dict.getRaw(dictKeys[i]);

        if (mayHaveChildren(rawValue)) {
          nodesToVisit.push(rawValue);
        }
      }
    } else if (Array.isArray(node)) {
      for (var _i3 = 0, _ii2 = node.length; _i3 < _ii2; _i3++) {
        var value = node[_i3];

        if (mayHaveChildren(value)) {
          nodesToVisit.push(value);
        }
      }
    }
  }

  function ObjectLoader(dict, keys, xref) {
    this.dict = dict;
    this.keys = keys;
    this.xref = xref;
    this.refSet = null;
    this.capability = null;
  }

  ObjectLoader.prototype = {
    load: function load() {
      this.capability = (0, _util.createPromiseCapability)();

      if (!(this.xref.stream instanceof _chunked_stream.ChunkedStream) || this.xref.stream.getMissingChunks().length === 0) {
        this.capability.resolve();
        return this.capability.promise;
      }

      var keys = this.keys,
          dict = this.dict;
      this.refSet = new _primitives.RefSet();
      var nodesToVisit = [];

      for (var i = 0, ii = keys.length; i < ii; i++) {
        var rawValue = dict.getRaw(keys[i]);

        if (rawValue !== undefined) {
          nodesToVisit.push(rawValue);
        }
      }

      this._walk(nodesToVisit);

      return this.capability.promise;
    },
    _walk: function _walk(nodesToVisit) {
      var _this2 = this;

      var nodesToRevisit = [];
      var pendingRequests = [];

      while (nodesToVisit.length) {
        var currentNode = nodesToVisit.pop();

        if ((0, _primitives.isRef)(currentNode)) {
          if (this.refSet.has(currentNode)) {
            continue;
          }

          try {
            this.refSet.put(currentNode);
            currentNode = this.xref.fetch(currentNode);
          } catch (ex) {
            if (!(ex instanceof _util.MissingDataException)) {
              throw ex;
            }

            nodesToRevisit.push(currentNode);
            pendingRequests.push({
              begin: ex.begin,
              end: ex.end
            });
          }
        }

        if (currentNode && currentNode.getBaseStreams) {
          var baseStreams = currentNode.getBaseStreams();
          var foundMissingData = false;

          for (var i = 0, ii = baseStreams.length; i < ii; i++) {
            var stream = baseStreams[i];

            if (stream.getMissingChunks && stream.getMissingChunks().length) {
              foundMissingData = true;
              pendingRequests.push({
                begin: stream.start,
                end: stream.end
              });
            }
          }

          if (foundMissingData) {
            nodesToRevisit.push(currentNode);
          }
        }

        addChildren(currentNode, nodesToVisit);
      }

      if (pendingRequests.length) {
        this.xref.stream.manager.requestRanges(pendingRequests).then(function () {
          for (var _i4 = 0, _ii3 = nodesToRevisit.length; _i4 < _ii3; _i4++) {
            var node = nodesToRevisit[_i4];

            if ((0, _primitives.isRef)(node)) {
              _this2.refSet.remove(node);
            }
          }

          _this2._walk(nodesToRevisit);
        }, this.capability.reject);
        return;
      }

      this.refSet = null;
      this.capability.resolve();
    }
  };
  return ObjectLoader;
}();

exports.ObjectLoader = ObjectLoader;

/***/ }),
/* 155 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isEOF = isEOF;
exports.isCmd = isCmd;
exports.isDict = isDict;
exports.isName = isName;
exports.isRef = isRef;
exports.isRefsEqual = isRefsEqual;
exports.isStream = isStream;
exports.RefSetCache = exports.RefSet = exports.Ref = exports.Name = exports.Dict = exports.Cmd = exports.EOF = void 0;

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var EOF = {};
exports.EOF = EOF;

var Name = function NameClosure() {
  function Name(name) {
    this.name = name;
  }

  Name.prototype = {};
  var nameCache = Object.create(null);

  Name.get = function Name_get(name) {
    var nameValue = nameCache[name];
    return nameValue ? nameValue : nameCache[name] = new Name(name);
  };

  return Name;
}();

exports.Name = Name;

var Cmd = function CmdClosure() {
  function Cmd(cmd) {
    this.cmd = cmd;
  }

  Cmd.prototype = {};
  var cmdCache = Object.create(null);

  Cmd.get = function Cmd_get(cmd) {
    var cmdValue = cmdCache[cmd];
    return cmdValue ? cmdValue : cmdCache[cmd] = new Cmd(cmd);
  };

  return Cmd;
}();

exports.Cmd = Cmd;

var Dict = function DictClosure() {
  var nonSerializable = function nonSerializableClosure() {
    return nonSerializable;
  };

  function Dict(xref) {
    this._map = Object.create(null);
    this.xref = xref;
    this.objId = null;
    this.suppressEncryption = false;
    this.__nonSerializable__ = nonSerializable;
  }

  Dict.prototype = {
    assignXref: function Dict_assignXref(newXref) {
      this.xref = newXref;
    },
    get: function Dict_get(key1, key2, key3) {
      var value;
      var xref = this.xref,
          suppressEncryption = this.suppressEncryption;

      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {
        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
      }

      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {
        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
      }

      value = this._map[key3] || null;
      return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
    },
    getAsync: function Dict_getAsync(key1, key2, key3) {
      var value;
      var xref = this.xref,
          suppressEncryption = this.suppressEncryption;

      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {
        if (xref) {
          return xref.fetchIfRefAsync(value, suppressEncryption);
        }

        return Promise.resolve(value);
      }

      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {
        if (xref) {
          return xref.fetchIfRefAsync(value, suppressEncryption);
        }

        return Promise.resolve(value);
      }

      value = this._map[key3] || null;

      if (xref) {
        return xref.fetchIfRefAsync(value, suppressEncryption);
      }

      return Promise.resolve(value);
    },
    getArray: function Dict_getArray(key1, key2, key3) {
      var value = this.get(key1, key2, key3);
      var xref = this.xref,
          suppressEncryption = this.suppressEncryption;

      if (!Array.isArray(value) || !xref) {
        return value;
      }

      value = value.slice();

      for (var i = 0, ii = value.length; i < ii; i++) {
        if (!isRef(value[i])) {
          continue;
        }

        value[i] = xref.fetch(value[i], suppressEncryption);
      }

      return value;
    },
    getRaw: function Dict_getRaw(key) {
      return this._map[key];
    },
    getKeys: function Dict_getKeys() {
      return Object.keys(this._map);
    },
    set: function Dict_set(key, value) {
      this._map[key] = value;
    },
    has: function Dict_has(key) {
      return key in this._map;
    },
    forEach: function Dict_forEach(callback) {
      for (var key in this._map) {
        callback(key, this.get(key));
      }
    }
  };
  Dict.empty = new Dict(null);

  Dict.merge = function (xref, dictArray) {
    var mergedDict = new Dict(xref);

    for (var i = 0, ii = dictArray.length; i < ii; i++) {
      var dict = dictArray[i];

      if (!isDict(dict)) {
        continue;
      }

      for (var keyName in dict._map) {
        if (mergedDict._map[keyName] !== undefined) {
          continue;
        }

        mergedDict._map[keyName] = dict._map[keyName];
      }
    }

    return mergedDict;
  };

  return Dict;
}();

exports.Dict = Dict;

var Ref = function RefClosure() {
  function Ref(num, gen) {
    this.num = num;
    this.gen = gen;
  }

  Ref.prototype = {
    toString: function Ref_toString() {
      if (this.gen !== 0) {
        return "".concat(this.num, "R").concat(this.gen);
      }

      return "".concat(this.num, "R");
    }
  };
  return Ref;
}();

exports.Ref = Ref;

var RefSet = function RefSetClosure() {
  function RefSet() {
    this.dict = Object.create(null);
  }

  RefSet.prototype = {
    has: function RefSet_has(ref) {
      return ref.toString() in this.dict;
    },
    put: function RefSet_put(ref) {
      this.dict[ref.toString()] = true;
    },
    remove: function RefSet_remove(ref) {
      delete this.dict[ref.toString()];
    }
  };
  return RefSet;
}();

exports.RefSet = RefSet;

var RefSetCache = function RefSetCacheClosure() {
  function RefSetCache() {
    this.dict = Object.create(null);
  }

  RefSetCache.prototype = {
    get: function RefSetCache_get(ref) {
      return this.dict[ref.toString()];
    },
    has: function RefSetCache_has(ref) {
      return ref.toString() in this.dict;
    },
    put: function RefSetCache_put(ref, obj) {
      this.dict[ref.toString()] = obj;
    },
    putAlias: function RefSetCache_putAlias(ref, aliasRef) {
      this.dict[ref.toString()] = this.get(aliasRef);
    },
    forEach: function RefSetCache_forEach(fn, thisArg) {
      for (var i in this.dict) {
        fn.call(thisArg, this.dict[i]);
      }
    },
    clear: function RefSetCache_clear() {
      this.dict = Object.create(null);
    }
  };
  return RefSetCache;
}();

exports.RefSetCache = RefSetCache;

function isEOF(v) {
  return v === EOF;
}

function isName(v, name) {
  return v instanceof Name && (name === undefined || v.name === name);
}

function isCmd(v, cmd) {
  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);
}

function isDict(v, type) {
  return v instanceof Dict && (type === undefined || isName(v.get('Type'), type));
}

function isRef(v) {
  return v instanceof Ref;
}

function isRefsEqual(v1, v2) {
  return v1.num === v2.num && v1.gen === v2.gen;
}

function isStream(v) {
  return _typeof(v) === 'object' && v !== null && v.getBytes !== undefined;
}

/***/ }),
/* 156 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Parser = exports.Linearization = exports.Lexer = void 0;

var _stream = __w_pdfjs_require__(157);

var _util = __w_pdfjs_require__(6);

var _primitives = __w_pdfjs_require__(155);

var _ccitt_stream = __w_pdfjs_require__(158);

var _jbig2_stream = __w_pdfjs_require__(160);

var _jpeg_stream = __w_pdfjs_require__(163);

var _jpx_stream = __w_pdfjs_require__(165);

var MAX_LENGTH_TO_CACHE = 1000;
var MAX_ADLER32_LENGTH = 5552;

function computeAdler32(bytes) {
  var bytesLength = bytes.length;
  var a = 1,
      b = 0;

  for (var i = 0; i < bytesLength; ++i) {
    a += bytes[i] & 0xFF;
    b += a;
  }

  return b % 65521 << 16 | a % 65521;
}

var Parser = function ParserClosure() {
  function Parser(lexer, allowStreams, xref, recoveryMode) {
    this.lexer = lexer;
    this.allowStreams = allowStreams;
    this.xref = xref;
    this.recoveryMode = recoveryMode || false;
    this.imageCache = Object.create(null);
    this.refill();
  }

  Parser.prototype = {
    refill: function Parser_refill() {
      this.buf1 = this.lexer.getObj();
      this.buf2 = this.lexer.getObj();
    },
    shift: function Parser_shift() {
      if ((0, _primitives.isCmd)(this.buf2, 'ID')) {
        this.buf1 = this.buf2;
        this.buf2 = null;
      } else {
        this.buf1 = this.buf2;
        this.buf2 = this.lexer.getObj();
      }
    },
    tryShift: function Parser_tryShift() {
      try {
        this.shift();
        return true;
      } catch (e) {
        if (e instanceof _util.MissingDataException) {
          throw e;
        }

        return false;
      }
    },
    getObj: function Parser_getObj(cipherTransform) {
      var buf1 = this.buf1;
      this.shift();

      if (buf1 instanceof _primitives.Cmd) {
        switch (buf1.cmd) {
          case 'BI':
            return this.makeInlineImage(cipherTransform);

          case '[':
            var array = [];

            while (!(0, _primitives.isCmd)(this.buf1, ']') && !(0, _primitives.isEOF)(this.buf1)) {
              array.push(this.getObj(cipherTransform));
            }

            if ((0, _primitives.isEOF)(this.buf1)) {
              if (!this.recoveryMode) {
                throw new _util.FormatError('End of file inside array');
              }

              return array;
            }

            this.shift();
            return array;

          case '<<':
            var dict = new _primitives.Dict(this.xref);

            while (!(0, _primitives.isCmd)(this.buf1, '>>') && !(0, _primitives.isEOF)(this.buf1)) {
              if (!(0, _primitives.isName)(this.buf1)) {
                (0, _util.info)('Malformed dictionary: key must be a name object');
                this.shift();
                continue;
              }

              var key = this.buf1.name;
              this.shift();

              if ((0, _primitives.isEOF)(this.buf1)) {
                break;
              }

              dict.set(key, this.getObj(cipherTransform));
            }

            if ((0, _primitives.isEOF)(this.buf1)) {
              if (!this.recoveryMode) {
                throw new _util.FormatError('End of file inside dictionary');
              }

              return dict;
            }

            if ((0, _primitives.isCmd)(this.buf2, 'stream')) {
              return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict;
            }

            this.shift();
            return dict;

          default:
            return buf1;
        }
      }

      if (Number.isInteger(buf1)) {
        var num = buf1;

        if (Number.isInteger(this.buf1) && (0, _primitives.isCmd)(this.buf2, 'R')) {
          var ref = new _primitives.Ref(num, this.buf1);
          this.shift();
          this.shift();
          return ref;
        }

        return num;
      }

      if ((0, _util.isString)(buf1)) {
        var str = buf1;

        if (cipherTransform) {
          str = cipherTransform.decryptString(str);
        }

        return str;
      }

      return buf1;
    },
    findDefaultInlineStreamEnd: function findDefaultInlineStreamEnd(stream) {
      var E = 0x45,
          I = 0x49,
          SPACE = 0x20,
          LF = 0xA,
          CR = 0xD;
      var n = 10,
          NUL = 0x0;
      var startPos = stream.pos,
          state = 0,
          ch,
          maybeEIPos;

      while ((ch = stream.getByte()) !== -1) {
        if (state === 0) {
          state = ch === E ? 1 : 0;
        } else if (state === 1) {
          state = ch === I ? 2 : 0;
        } else {
          (0, _util.assert)(state === 2);

          if (ch === SPACE || ch === LF || ch === CR) {
            maybeEIPos = stream.pos;
            var followingBytes = stream.peekBytes(n);

            for (var i = 0, ii = followingBytes.length; i < ii; i++) {
              ch = followingBytes[i];

              if (ch === NUL && followingBytes[i + 1] !== NUL) {
                continue;
              }

              if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7F)) {
                state = 0;
                break;
              }
            }

            if (state === 2) {
              break;
            }
          } else {
            state = 0;
          }
        }
      }

      if (ch === -1) {
        (0, _util.warn)('findDefaultInlineStreamEnd: ' + 'Reached the end of the stream without finding a valid EI marker');

        if (maybeEIPos) {
          (0, _util.warn)('... trying to recover by using the last "EI" occurrence.');
          stream.skip(-(stream.pos - maybeEIPos));
        }
      }

      var endOffset = 4;
      stream.skip(-endOffset);
      ch = stream.peekByte();
      stream.skip(endOffset);

      if (!(0, _util.isSpace)(ch)) {
        endOffset--;
      }

      return stream.pos - endOffset - startPos;
    },
    findDCTDecodeInlineStreamEnd: function Parser_findDCTDecodeInlineStreamEnd(stream) {
      var startPos = stream.pos,
          foundEOI = false,
          b,
          markerLength,
          length;

      while ((b = stream.getByte()) !== -1) {
        if (b !== 0xFF) {
          continue;
        }

        switch (stream.getByte()) {
          case 0x00:
            break;

          case 0xFF:
            stream.skip(-1);
            break;

          case 0xD9:
            foundEOI = true;
            break;

          case 0xC0:
          case 0xC1:
          case 0xC2:
          case 0xC3:
          case 0xC5:
          case 0xC6:
          case 0xC7:
          case 0xC9:
          case 0xCA:
          case 0xCB:
          case 0xCD:
          case 0xCE:
          case 0xCF:
          case 0xC4:
          case 0xCC:
          case 0xDA:
          case 0xDB:
          case 0xDC:
          case 0xDD:
          case 0xDE:
          case 0xDF:
          case 0xE0:
          case 0xE1:
          case 0xE2:
          case 0xE3:
          case 0xE4:
          case 0xE5:
          case 0xE6:
          case 0xE7:
          case 0xE8:
          case 0xE9:
          case 0xEA:
          case 0xEB:
          case 0xEC:
          case 0xED:
          case 0xEE:
          case 0xEF:
          case 0xFE:
            markerLength = stream.getUint16();

            if (markerLength > 2) {
              stream.skip(markerLength - 2);
            } else {
              stream.skip(-2);
            }

            break;
        }

        if (foundEOI) {
          break;
        }
      }

      length = stream.pos - startPos;

      if (b === -1) {
        (0, _util.warn)('Inline DCTDecode image stream: ' + 'EOI marker not found, searching for /EI/ instead.');
        stream.skip(-length);
        return this.findDefaultInlineStreamEnd(stream);
      }

      this.inlineStreamSkipEI(stream);
      return length;
    },
    findASCII85DecodeInlineStreamEnd: function Parser_findASCII85DecodeInlineStreamEnd(stream) {
      var TILDE = 0x7E,
          GT = 0x3E;
      var startPos = stream.pos,
          ch,
          length;

      while ((ch = stream.getByte()) !== -1) {
        if (ch === TILDE && stream.peekByte() === GT) {
          stream.skip();
          break;
        }
      }

      length = stream.pos - startPos;

      if (ch === -1) {
        (0, _util.warn)('Inline ASCII85Decode image stream: ' + 'EOD marker not found, searching for /EI/ instead.');
        stream.skip(-length);
        return this.findDefaultInlineStreamEnd(stream);
      }

      this.inlineStreamSkipEI(stream);
      return length;
    },
    findASCIIHexDecodeInlineStreamEnd: function Parser_findASCIIHexDecodeInlineStreamEnd(stream) {
      var GT = 0x3E;
      var startPos = stream.pos,
          ch,
          length;

      while ((ch = stream.getByte()) !== -1) {
        if (ch === GT) {
          break;
        }
      }

      length = stream.pos - startPos;

      if (ch === -1) {
        (0, _util.warn)('Inline ASCIIHexDecode image stream: ' + 'EOD marker not found, searching for /EI/ instead.');
        stream.skip(-length);
        return this.findDefaultInlineStreamEnd(stream);
      }

      this.inlineStreamSkipEI(stream);
      return length;
    },
    inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) {
      var E = 0x45,
          I = 0x49;
      var state = 0,
          ch;

      while ((ch = stream.getByte()) !== -1) {
        if (state === 0) {
          state = ch === E ? 1 : 0;
        } else if (state === 1) {
          state = ch === I ? 2 : 0;
        } else if (state === 2) {
          break;
        }
      }
    },
    makeInlineImage: function Parser_makeInlineImage(cipherTransform) {
      var lexer = this.lexer;
      var stream = lexer.stream;
      var dict = new _primitives.Dict(this.xref),
          dictLength;

      while (!(0, _primitives.isCmd)(this.buf1, 'ID') && !(0, _primitives.isEOF)(this.buf1)) {
        if (!(0, _primitives.isName)(this.buf1)) {
          throw new _util.FormatError('Dictionary key must be a name object');
        }

        var key = this.buf1.name;
        this.shift();

        if ((0, _primitives.isEOF)(this.buf1)) {
          break;
        }

        dict.set(key, this.getObj(cipherTransform));
      }

      if (lexer.beginInlineImagePos !== -1) {
        dictLength = stream.pos - lexer.beginInlineImagePos;
      }

      var filter = dict.get('Filter', 'F'),
          filterName;

      if ((0, _primitives.isName)(filter)) {
        filterName = filter.name;
      } else if (Array.isArray(filter)) {
        var filterZero = this.xref.fetchIfRef(filter[0]);

        if ((0, _primitives.isName)(filterZero)) {
          filterName = filterZero.name;
        }
      }

      var startPos = stream.pos,
          length;

      if (filterName === 'DCTDecode' || filterName === 'DCT') {
        length = this.findDCTDecodeInlineStreamEnd(stream);
      } else if (filterName === 'ASCII85Decode' || filterName === 'A85') {
        length = this.findASCII85DecodeInlineStreamEnd(stream);
      } else if (filterName === 'ASCIIHexDecode' || filterName === 'AHx') {
        length = this.findASCIIHexDecodeInlineStreamEnd(stream);
      } else {
        length = this.findDefaultInlineStreamEnd(stream);
      }

      var imageStream = stream.makeSubStream(startPos, length, dict);
      var cacheKey;

      if (length < MAX_LENGTH_TO_CACHE && dictLength < MAX_ADLER32_LENGTH) {
        var imageBytes = imageStream.getBytes();
        imageStream.reset();
        var initialStreamPos = stream.pos;
        stream.pos = lexer.beginInlineImagePos;
        var dictBytes = stream.getBytes(dictLength);
        stream.pos = initialStreamPos;
        cacheKey = computeAdler32(imageBytes) + '_' + computeAdler32(dictBytes);
        var cacheEntry = this.imageCache[cacheKey];

        if (cacheEntry !== undefined) {
          this.buf2 = _primitives.Cmd.get('EI');
          this.shift();
          cacheEntry.reset();
          return cacheEntry;
        }
      }

      if (cipherTransform) {
        imageStream = cipherTransform.createStream(imageStream, length);
      }

      imageStream = this.filter(imageStream, dict, length);
      imageStream.dict = dict;

      if (cacheKey !== undefined) {
        imageStream.cacheKey = 'inline_' + length + '_' + cacheKey;
        this.imageCache[cacheKey] = imageStream;
      }

      this.buf2 = _primitives.Cmd.get('EI');
      this.shift();
      return imageStream;
    },
    _findStreamLength: function _findStreamLength(startPos, signature) {
      var stream = this.lexer.stream;
      stream.pos = startPos;
      var SCAN_BLOCK_LENGTH = 2048;
      var signatureLength = signature.length;

      while (stream.pos < stream.end) {
        var scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);
        var scanLength = scanBytes.length - signatureLength;

        if (scanLength <= 0) {
          break;
        }

        var pos = 0;

        while (pos < scanLength) {
          var j = 0;

          while (j < signatureLength && scanBytes[pos + j] === signature[j]) {
            j++;
          }

          if (j >= signatureLength) {
            stream.pos += pos;
            return stream.pos - startPos;
          }

          pos++;
        }

        stream.pos += scanLength;
      }

      return -1;
    },
    makeStream: function Parser_makeStream(dict, cipherTransform) {
      var lexer = this.lexer;
      var stream = lexer.stream;
      lexer.skipToNextLine();
      var startPos = stream.pos - 1;
      var length = dict.get('Length');

      if (!Number.isInteger(length)) {
        (0, _util.info)('Bad ' + length + ' attribute in stream');
        length = 0;
      }

      stream.pos = startPos + length;
      lexer.nextChar();

      if (this.tryShift() && (0, _primitives.isCmd)(this.buf2, 'endstream')) {
        this.shift();
      } else {
        var ENDSTREAM_SIGNATURE = new Uint8Array([0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6D]);

        var actualLength = this._findStreamLength(startPos, ENDSTREAM_SIGNATURE);

        if (actualLength < 0) {
          var MAX_TRUNCATION = 1;

          for (var i = 1; i <= MAX_TRUNCATION; i++) {
            var end = ENDSTREAM_SIGNATURE.length - i;
            var TRUNCATED_SIGNATURE = ENDSTREAM_SIGNATURE.slice(0, end);

            var maybeLength = this._findStreamLength(startPos, TRUNCATED_SIGNATURE);

            if (maybeLength >= 0) {
              var lastByte = stream.peekBytes(end + 1)[end];

              if (!(0, _util.isSpace)(lastByte)) {
                break;
              }

              (0, _util.info)("Found \"".concat((0, _util.bytesToString)(TRUNCATED_SIGNATURE), "\" when ") + 'searching for endstream command.');
              actualLength = maybeLength;
              break;
            }
          }

          if (actualLength < 0) {
            throw new _util.FormatError('Missing endstream command.');
          }
        }

        length = actualLength;
        lexer.nextChar();
        this.shift();
        this.shift();
      }

      this.shift();
      stream = stream.makeSubStream(startPos, length, dict);

      if (cipherTransform) {
        stream = cipherTransform.createStream(stream, length);
      }

      stream = this.filter(stream, dict, length);
      stream.dict = dict;
      return stream;
    },
    filter: function Parser_filter(stream, dict, length) {
      var filter = dict.get('Filter', 'F');
      var params = dict.get('DecodeParms', 'DP');

      if ((0, _primitives.isName)(filter)) {
        if (Array.isArray(params)) {
          (0, _util.warn)('/DecodeParms should not contain an Array, ' + 'when /Filter contains a Name.');
        }

        return this.makeFilter(stream, filter.name, length, params);
      }

      var maybeLength = length;

      if (Array.isArray(filter)) {
        var filterArray = filter;
        var paramsArray = params;

        for (var i = 0, ii = filterArray.length; i < ii; ++i) {
          filter = this.xref.fetchIfRef(filterArray[i]);

          if (!(0, _primitives.isName)(filter)) {
            throw new _util.FormatError('Bad filter name: ' + filter);
          }

          params = null;

          if (Array.isArray(paramsArray) && i in paramsArray) {
            params = this.xref.fetchIfRef(paramsArray[i]);
          }

          stream = this.makeFilter(stream, filter.name, maybeLength, params);
          maybeLength = null;
        }
      }

      return stream;
    },
    makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) {
      if (maybeLength === 0) {
        (0, _util.warn)('Empty "' + name + '" stream.');
        return new _stream.NullStream();
      }

      try {
        var xrefStreamStats = this.xref.stats.streamTypes;

        if (name === 'FlateDecode' || name === 'Fl') {
          xrefStreamStats[_util.StreamType.FLATE] = true;

          if (params) {
            return new _stream.PredictorStream(new _stream.FlateStream(stream, maybeLength), maybeLength, params);
          }

          return new _stream.FlateStream(stream, maybeLength);
        }

        if (name === 'LZWDecode' || name === 'LZW') {
          xrefStreamStats[_util.StreamType.LZW] = true;
          var earlyChange = 1;

          if (params) {
            if (params.has('EarlyChange')) {
              earlyChange = params.get('EarlyChange');
            }

            return new _stream.PredictorStream(new _stream.LZWStream(stream, maybeLength, earlyChange), maybeLength, params);
          }

          return new _stream.LZWStream(stream, maybeLength, earlyChange);
        }

        if (name === 'DCTDecode' || name === 'DCT') {
          xrefStreamStats[_util.StreamType.DCT] = true;
          return new _jpeg_stream.JpegStream(stream, maybeLength, stream.dict, params);
        }

        if (name === 'JPXDecode' || name === 'JPX') {
          xrefStreamStats[_util.StreamType.JPX] = true;
          return new _jpx_stream.JpxStream(stream, maybeLength, stream.dict, params);
        }

        if (name === 'ASCII85Decode' || name === 'A85') {
          xrefStreamStats[_util.StreamType.A85] = true;
          return new _stream.Ascii85Stream(stream, maybeLength);
        }

        if (name === 'ASCIIHexDecode' || name === 'AHx') {
          xrefStreamStats[_util.StreamType.AHX] = true;
          return new _stream.AsciiHexStream(stream, maybeLength);
        }

        if (name === 'CCITTFaxDecode' || name === 'CCF') {
          xrefStreamStats[_util.StreamType.CCF] = true;
          return new _ccitt_stream.CCITTFaxStream(stream, maybeLength, params);
        }

        if (name === 'RunLengthDecode' || name === 'RL') {
          xrefStreamStats[_util.StreamType.RL] = true;
          return new _stream.RunLengthStream(stream, maybeLength);
        }

        if (name === 'JBIG2Decode') {
          xrefStreamStats[_util.StreamType.JBIG] = true;
          return new _jbig2_stream.Jbig2Stream(stream, maybeLength, stream.dict, params);
        }

        (0, _util.warn)('filter "' + name + '" not supported yet');
        return stream;
      } catch (ex) {
        if (ex instanceof _util.MissingDataException) {
          throw ex;
        }

        (0, _util.warn)('Invalid stream: \"' + ex + '\"');
        return new _stream.NullStream();
      }
    }
  };
  return Parser;
}();

exports.Parser = Parser;

var Lexer = function LexerClosure() {
  function Lexer(stream, knownCommands) {
    this.stream = stream;
    this.nextChar();
    this.strBuf = [];
    this.knownCommands = knownCommands;
    this.beginInlineImagePos = -1;
  }

  var specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

  function toHexDigit(ch) {
    if (ch >= 0x30 && ch <= 0x39) {
      return ch & 0x0F;
    }

    if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {
      return (ch & 0x0F) + 9;
    }

    return -1;
  }

  Lexer.prototype = {
    nextChar: function Lexer_nextChar() {
      return this.currentChar = this.stream.getByte();
    },
    peekChar: function Lexer_peekChar() {
      return this.stream.peekByte();
    },
    getNumber: function Lexer_getNumber() {
      var ch = this.currentChar;
      var eNotation = false;
      var divideBy = 0;
      var sign = 0;

      if (ch === 0x2D) {
        sign = -1;
        ch = this.nextChar();

        if (ch === 0x2D) {
          ch = this.nextChar();
        }
      } else if (ch === 0x2B) {
        sign = 1;
        ch = this.nextChar();
      }

      if (ch === 0x0A || ch === 0x0D) {
        do {
          ch = this.nextChar();
        } while (ch === 0x0A || ch === 0x0D);
      }

      if (ch === 0x2E) {
        divideBy = 10;
        ch = this.nextChar();
      }

      if (ch < 0x30 || ch > 0x39) {
        if (divideBy === 10 && sign === 0 && ((0, _util.isSpace)(ch) || ch === -1)) {
          (0, _util.warn)('Lexer.getNumber - treating a single decimal point as zero.');
          return 0;
        }

        throw new _util.FormatError("Invalid number: ".concat(String.fromCharCode(ch), " (charCode ").concat(ch, ")"));
      }

      sign = sign || 1;
      var baseValue = ch - 0x30;
      var powerValue = 0;
      var powerValueSign = 1;

      while ((ch = this.nextChar()) >= 0) {
        if (0x30 <= ch && ch <= 0x39) {
          var currentDigit = ch - 0x30;

          if (eNotation) {
            powerValue = powerValue * 10 + currentDigit;
          } else {
            if (divideBy !== 0) {
              divideBy *= 10;
            }

            baseValue = baseValue * 10 + currentDigit;
          }
        } else if (ch === 0x2E) {
          if (divideBy === 0) {
            divideBy = 1;
          } else {
            break;
          }
        } else if (ch === 0x2D) {
          (0, _util.warn)('Badly formatted number');
        } else if (ch === 0x45 || ch === 0x65) {
          ch = this.peekChar();

          if (ch === 0x2B || ch === 0x2D) {
            powerValueSign = ch === 0x2D ? -1 : 1;
            this.nextChar();
          } else if (ch < 0x30 || ch > 0x39) {
            break;
          }

          eNotation = true;
        } else {
          break;
        }
      }

      if (divideBy !== 0) {
        baseValue /= divideBy;
      }

      if (eNotation) {
        baseValue *= Math.pow(10, powerValueSign * powerValue);
      }

      return sign * baseValue;
    },
    getString: function Lexer_getString() {
      var numParen = 1;
      var done = false;
      var strBuf = this.strBuf;
      strBuf.length = 0;
      var ch = this.nextChar();

      while (true) {
        var charBuffered = false;

        switch (ch | 0) {
          case -1:
            (0, _util.warn)('Unterminated string');
            done = true;
            break;

          case 0x28:
            ++numParen;
            strBuf.push('(');
            break;

          case 0x29:
            if (--numParen === 0) {
              this.nextChar();
              done = true;
            } else {
              strBuf.push(')');
            }

            break;

          case 0x5C:
            ch = this.nextChar();

            switch (ch) {
              case -1:
                (0, _util.warn)('Unterminated string');
                done = true;
                break;

              case 0x6E:
                strBuf.push('\n');
                break;

              case 0x72:
                strBuf.push('\r');
                break;

              case 0x74:
                strBuf.push('\t');
                break;

              case 0x62:
                strBuf.push('\b');
                break;

              case 0x66:
                strBuf.push('\f');
                break;

              case 0x5C:
              case 0x28:
              case 0x29:
                strBuf.push(String.fromCharCode(ch));
                break;

              case 0x30:
              case 0x31:
              case 0x32:
              case 0x33:
              case 0x34:
              case 0x35:
              case 0x36:
              case 0x37:
                var x = ch & 0x0F;
                ch = this.nextChar();
                charBuffered = true;

                if (ch >= 0x30 && ch <= 0x37) {
                  x = (x << 3) + (ch & 0x0F);
                  ch = this.nextChar();

                  if (ch >= 0x30 && ch <= 0x37) {
                    charBuffered = false;
                    x = (x << 3) + (ch & 0x0F);
                  }
                }

                strBuf.push(String.fromCharCode(x));
                break;

              case 0x0D:
                if (this.peekChar() === 0x0A) {
                  this.nextChar();
                }

                break;

              case 0x0A:
                break;

              default:
                strBuf.push(String.fromCharCode(ch));
                break;
            }

            break;

          default:
            strBuf.push(String.fromCharCode(ch));
            break;
        }

        if (done) {
          break;
        }

        if (!charBuffered) {
          ch = this.nextChar();
        }
      }

      return strBuf.join('');
    },
    getName: function Lexer_getName() {
      var ch, previousCh;
      var strBuf = this.strBuf;
      strBuf.length = 0;

      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
        if (ch === 0x23) {
          ch = this.nextChar();

          if (specialChars[ch]) {
            (0, _util.warn)('Lexer_getName: ' + 'NUMBER SIGN (#) should be followed by a hexadecimal number.');
            strBuf.push('#');
            break;
          }

          var x = toHexDigit(ch);

          if (x !== -1) {
            previousCh = ch;
            ch = this.nextChar();
            var x2 = toHexDigit(ch);

            if (x2 === -1) {
              (0, _util.warn)('Lexer_getName: Illegal digit (' + String.fromCharCode(ch) + ') in hexadecimal number.');
              strBuf.push('#', String.fromCharCode(previousCh));

              if (specialChars[ch]) {
                break;
              }

              strBuf.push(String.fromCharCode(ch));
              continue;
            }

            strBuf.push(String.fromCharCode(x << 4 | x2));
          } else {
            strBuf.push('#', String.fromCharCode(ch));
          }
        } else {
          strBuf.push(String.fromCharCode(ch));
        }
      }

      if (strBuf.length > 127) {
        (0, _util.warn)('name token is longer than allowed by the spec: ' + strBuf.length);
      }

      return _primitives.Name.get(strBuf.join(''));
    },
    getHexString: function Lexer_getHexString() {
      var strBuf = this.strBuf;
      strBuf.length = 0;
      var ch = this.currentChar;
      var isFirstHex = true;
      var firstDigit;
      var secondDigit;

      while (true) {
        if (ch < 0) {
          (0, _util.warn)('Unterminated hex string');
          break;
        } else if (ch === 0x3E) {
          this.nextChar();
          break;
        } else if (specialChars[ch] === 1) {
          ch = this.nextChar();
          continue;
        } else {
          if (isFirstHex) {
            firstDigit = toHexDigit(ch);

            if (firstDigit === -1) {
              (0, _util.warn)('Ignoring invalid character "' + ch + '" in hex string');
              ch = this.nextChar();
              continue;
            }
          } else {
            secondDigit = toHexDigit(ch);

            if (secondDigit === -1) {
              (0, _util.warn)('Ignoring invalid character "' + ch + '" in hex string');
              ch = this.nextChar();
              continue;
            }

            strBuf.push(String.fromCharCode(firstDigit << 4 | secondDigit));
          }

          isFirstHex = !isFirstHex;
          ch = this.nextChar();
        }
      }

      return strBuf.join('');
    },
    getObj: function Lexer_getObj() {
      var comment = false;
      var ch = this.currentChar;

      while (true) {
        if (ch < 0) {
          return _primitives.EOF;
        }

        if (comment) {
          if (ch === 0x0A || ch === 0x0D) {
            comment = false;
          }
        } else if (ch === 0x25) {
          comment = true;
        } else if (specialChars[ch] !== 1) {
          break;
        }

        ch = this.nextChar();
      }

      switch (ch | 0) {
        case 0x30:
        case 0x31:
        case 0x32:
        case 0x33:
        case 0x34:
        case 0x35:
        case 0x36:
        case 0x37:
        case 0x38:
        case 0x39:
        case 0x2B:
        case 0x2D:
        case 0x2E:
          return this.getNumber();

        case 0x28:
          return this.getString();

        case 0x2F:
          return this.getName();

        case 0x5B:
          this.nextChar();
          return _primitives.Cmd.get('[');

        case 0x5D:
          this.nextChar();
          return _primitives.Cmd.get(']');

        case 0x3C:
          ch = this.nextChar();

          if (ch === 0x3C) {
            this.nextChar();
            return _primitives.Cmd.get('<<');
          }

          return this.getHexString();

        case 0x3E:
          ch = this.nextChar();

          if (ch === 0x3E) {
            this.nextChar();
            return _primitives.Cmd.get('>>');
          }

          return _primitives.Cmd.get('>');

        case 0x7B:
          this.nextChar();
          return _primitives.Cmd.get('{');

        case 0x7D:
          this.nextChar();
          return _primitives.Cmd.get('}');

        case 0x29:
          this.nextChar();
          throw new _util.FormatError("Illegal character: ".concat(ch));
      }

      var str = String.fromCharCode(ch);
      var knownCommands = this.knownCommands;
      var knownCommandFound = knownCommands && knownCommands[str] !== undefined;

      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
        var possibleCommand = str + String.fromCharCode(ch);

        if (knownCommandFound && knownCommands[possibleCommand] === undefined) {
          break;
        }

        if (str.length === 128) {
          throw new _util.FormatError("Command token too long: ".concat(str.length));
        }

        str = possibleCommand;
        knownCommandFound = knownCommands && knownCommands[str] !== undefined;
      }

      if (str === 'true') {
        return true;
      }

      if (str === 'false') {
        return false;
      }

      if (str === 'null') {
        return null;
      }

      if (str === 'BI') {
        this.beginInlineImagePos = this.stream.pos;
      }

      return _primitives.Cmd.get(str);
    },
    skipToNextLine: function Lexer_skipToNextLine() {
      var ch = this.currentChar;

      while (ch >= 0) {
        if (ch === 0x0D) {
          ch = this.nextChar();

          if (ch === 0x0A) {
            this.nextChar();
          }

          break;
        } else if (ch === 0x0A) {
          this.nextChar();
          break;
        }

        ch = this.nextChar();
      }
    }
  };
  return Lexer;
}();

exports.Lexer = Lexer;
var Linearization = {
  create: function LinearizationCreate(stream) {
    function getInt(name, allowZeroValue) {
      var obj = linDict.get(name);

      if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {
        return obj;
      }

      throw new Error('The "' + name + '" parameter in the linearization ' + 'dictionary is invalid.');
    }

    function getHints() {
      var hints = linDict.get('H'),
          hintsLength,
          item;

      if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) {
        for (var index = 0; index < hintsLength; index++) {
          if (!(Number.isInteger(item = hints[index]) && item > 0)) {
            throw new Error('Hint (' + index + ') in the linearization dictionary is invalid.');
          }
        }

        return hints;
      }

      throw new Error('Hint array in the linearization dictionary is invalid.');
    }

    var parser = new Parser(new Lexer(stream), false, null);
    var obj1 = parser.getObj();
    var obj2 = parser.getObj();
    var obj3 = parser.getObj();
    var linDict = parser.getObj();
    var obj, length;

    if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && (0, _primitives.isCmd)(obj3, 'obj') && (0, _primitives.isDict)(linDict) && (0, _util.isNum)(obj = linDict.get('Linearized')) && obj > 0)) {
      return null;
    } else if ((length = getInt('L')) !== stream.length) {
      throw new Error('The "L" parameter in the linearization dictionary ' + 'does not equal the stream length.');
    }

    return {
      length: length,
      hints: getHints(),
      objectNumberFirst: getInt('O'),
      endFirst: getInt('E'),
      numPages: getInt('N'),
      mainXRefEntriesOffset: getInt('T'),
      pageFirst: linDict.has('P') ? getInt('P', true) : 0
    };
  }
};
exports.Linearization = Linearization;

/***/ }),
/* 157 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.LZWStream = exports.StringStream = exports.StreamsSequenceStream = exports.Stream = exports.RunLengthStream = exports.PredictorStream = exports.NullStream = exports.FlateStream = exports.DecodeStream = exports.DecryptStream = exports.AsciiHexStream = exports.Ascii85Stream = void 0;

var _util = __w_pdfjs_require__(6);

var _primitives = __w_pdfjs_require__(155);

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

var Stream = function StreamClosure() {
  function Stream(arrayBuffer, start, length, dict) {
    this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer);
    this.start = start || 0;
    this.pos = this.start;
    this.end = start + length || this.bytes.length;
    this.dict = dict;
  }

  Stream.prototype = {
    get length() {
      return this.end - this.start;
    },

    get isEmpty() {
      return this.length === 0;
    },

    getByte: function Stream_getByte() {
      if (this.pos >= this.end) {
        return -1;
      }

      return this.bytes[this.pos++];
    },
    getUint16: function Stream_getUint16() {
      var b0 = this.getByte();
      var b1 = this.getByte();

      if (b0 === -1 || b1 === -1) {
        return -1;
      }

      return (b0 << 8) + b1;
    },
    getInt32: function Stream_getInt32() {
      var b0 = this.getByte();
      var b1 = this.getByte();
      var b2 = this.getByte();
      var b3 = this.getByte();
      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
    },
    getBytes: function getBytes(length) {
      var forceClamped = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      var bytes = this.bytes;
      var pos = this.pos;
      var strEnd = this.end;

      if (!length) {
        var _subarray = bytes.subarray(pos, strEnd);

        return forceClamped ? new Uint8ClampedArray(_subarray) : _subarray;
      }

      var end = pos + length;

      if (end > strEnd) {
        end = strEnd;
      }

      this.pos = end;
      var subarray = bytes.subarray(pos, end);
      return forceClamped ? new Uint8ClampedArray(subarray) : subarray;
    },
    peekByte: function Stream_peekByte() {
      var peekedByte = this.getByte();
      this.pos--;
      return peekedByte;
    },
    peekBytes: function peekBytes(length) {
      var forceClamped = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      var bytes = this.getBytes(length, forceClamped);
      this.pos -= bytes.length;
      return bytes;
    },
    skip: function Stream_skip(n) {
      if (!n) {
        n = 1;
      }

      this.pos += n;
    },
    reset: function Stream_reset() {
      this.pos = this.start;
    },
    moveStart: function Stream_moveStart() {
      this.start = this.pos;
    },
    makeSubStream: function Stream_makeSubStream(start, length, dict) {
      return new Stream(this.bytes.buffer, start, length, dict);
    }
  };
  return Stream;
}();

exports.Stream = Stream;

var StringStream = function StringStreamClosure() {
  function StringStream(str) {
    var bytes = (0, _util.stringToBytes)(str);
    Stream.call(this, bytes);
  }

  StringStream.prototype = Stream.prototype;
  return StringStream;
}();

exports.StringStream = StringStream;

var DecodeStream = function DecodeStreamClosure() {
  var emptyBuffer = new Uint8Array(0);

  function DecodeStream(maybeMinBufferLength) {
    this._rawMinBufferLength = maybeMinBufferLength || 0;
    this.pos = 0;
    this.bufferLength = 0;
    this.eof = false;
    this.buffer = emptyBuffer;
    this.minBufferLength = 512;

    if (maybeMinBufferLength) {
      while (this.minBufferLength < maybeMinBufferLength) {
        this.minBufferLength *= 2;
      }
    }
  }

  DecodeStream.prototype = {
    get isEmpty() {
      while (!this.eof && this.bufferLength === 0) {
        this.readBlock();
      }

      return this.bufferLength === 0;
    },

    ensureBuffer: function DecodeStream_ensureBuffer(requested) {
      var buffer = this.buffer;

      if (requested <= buffer.byteLength) {
        return buffer;
      }

      var size = this.minBufferLength;

      while (size < requested) {
        size *= 2;
      }

      var buffer2 = new Uint8Array(size);
      buffer2.set(buffer);
      return this.buffer = buffer2;
    },
    getByte: function DecodeStream_getByte() {
      var pos = this.pos;

      while (this.bufferLength <= pos) {
        if (this.eof) {
          return -1;
        }

        this.readBlock();
      }

      return this.buffer[this.pos++];
    },
    getUint16: function DecodeStream_getUint16() {
      var b0 = this.getByte();
      var b1 = this.getByte();

      if (b0 === -1 || b1 === -1) {
        return -1;
      }

      return (b0 << 8) + b1;
    },
    getInt32: function DecodeStream_getInt32() {
      var b0 = this.getByte();
      var b1 = this.getByte();
      var b2 = this.getByte();
      var b3 = this.getByte();
      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
    },
    getBytes: function getBytes(length) {
      var forceClamped = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      var end,
          pos = this.pos;

      if (length) {
        this.ensureBuffer(pos + length);
        end = pos + length;

        while (!this.eof && this.bufferLength < end) {
          this.readBlock();
        }

        var bufEnd = this.bufferLength;

        if (end > bufEnd) {
          end = bufEnd;
        }
      } else {
        while (!this.eof) {
          this.readBlock();
        }

        end = this.bufferLength;
      }

      this.pos = end;
      var subarray = this.buffer.subarray(pos, end);
      return forceClamped && !(subarray instanceof Uint8ClampedArray) ? new Uint8ClampedArray(subarray) : subarray;
    },
    peekByte: function DecodeStream_peekByte() {
      var peekedByte = this.getByte();
      this.pos--;
      return peekedByte;
    },
    peekBytes: function peekBytes(length) {
      var forceClamped = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      var bytes = this.getBytes(length, forceClamped);
      this.pos -= bytes.length;
      return bytes;
    },
    makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {
      var end = start + length;

      while (this.bufferLength <= end && !this.eof) {
        this.readBlock();
      }

      return new Stream(this.buffer, start, length, dict);
    },
    skip: function DecodeStream_skip(n) {
      if (!n) {
        n = 1;
      }

      this.pos += n;
    },
    reset: function DecodeStream_reset() {
      this.pos = 0;
    },
    getBaseStreams: function DecodeStream_getBaseStreams() {
      if (this.str && this.str.getBaseStreams) {
        return this.str.getBaseStreams();
      }

      return [];
    }
  };
  return DecodeStream;
}();

exports.DecodeStream = DecodeStream;

var StreamsSequenceStream = function StreamsSequenceStreamClosure() {
  function StreamsSequenceStream(streams) {
    this.streams = streams;
    var maybeLength = 0;

    for (var i = 0, ii = streams.length; i < ii; i++) {
      var stream = streams[i];

      if (stream instanceof DecodeStream) {
        maybeLength += stream._rawMinBufferLength;
      } else {
        maybeLength += stream.length;
      }
    }

    DecodeStream.call(this, maybeLength);
  }

  StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);

  StreamsSequenceStream.prototype.readBlock = function streamSequenceStreamReadBlock() {
    var streams = this.streams;

    if (streams.length === 0) {
      this.eof = true;
      return;
    }

    var stream = streams.shift();
    var chunk = stream.getBytes();
    var bufferLength = this.bufferLength;
    var newLength = bufferLength + chunk.length;
    var buffer = this.ensureBuffer(newLength);
    buffer.set(chunk, bufferLength);
    this.bufferLength = newLength;
  };

  StreamsSequenceStream.prototype.getBaseStreams = function StreamsSequenceStream_getBaseStreams() {
    var baseStreams = [];

    for (var i = 0, ii = this.streams.length; i < ii; i++) {
      var stream = this.streams[i];

      if (stream.getBaseStreams) {
        baseStreams.push.apply(baseStreams, _toConsumableArray(stream.getBaseStreams()));
      }
    }

    return baseStreams;
  };

  return StreamsSequenceStream;
}();

exports.StreamsSequenceStream = StreamsSequenceStream;

var FlateStream = function FlateStreamClosure() {
  var codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
  var lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]);
  var distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]);
  var fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff]), 9];
  var fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5];

  function FlateStream(str, maybeLength) {
    this.str = str;
    this.dict = str.dict;
    var cmf = str.getByte();
    var flg = str.getByte();

    if (cmf === -1 || flg === -1) {
      throw new _util.FormatError("Invalid header in flate stream: ".concat(cmf, ", ").concat(flg));
    }

    if ((cmf & 0x0f) !== 0x08) {
      throw new _util.FormatError("Unknown compression method in flate stream: ".concat(cmf, ", ").concat(flg));
    }

    if (((cmf << 8) + flg) % 31 !== 0) {
      throw new _util.FormatError("Bad FCHECK in flate stream: ".concat(cmf, ", ").concat(flg));
    }

    if (flg & 0x20) {
      throw new _util.FormatError("FDICT bit set in flate stream: ".concat(cmf, ", ").concat(flg));
    }

    this.codeSize = 0;
    this.codeBuf = 0;
    DecodeStream.call(this, maybeLength);
  }

  FlateStream.prototype = Object.create(DecodeStream.prototype);

  FlateStream.prototype.getBits = function FlateStream_getBits(bits) {
    var str = this.str;
    var codeSize = this.codeSize;
    var codeBuf = this.codeBuf;
    var b;

    while (codeSize < bits) {
      if ((b = str.getByte()) === -1) {
        throw new _util.FormatError('Bad encoding in flate stream');
      }

      codeBuf |= b << codeSize;
      codeSize += 8;
    }

    b = codeBuf & (1 << bits) - 1;
    this.codeBuf = codeBuf >> bits;
    this.codeSize = codeSize -= bits;
    return b;
  };

  FlateStream.prototype.getCode = function FlateStream_getCode(table) {
    var str = this.str;
    var codes = table[0];
    var maxLen = table[1];
    var codeSize = this.codeSize;
    var codeBuf = this.codeBuf;
    var b;

    while (codeSize < maxLen) {
      if ((b = str.getByte()) === -1) {
        break;
      }

      codeBuf |= b << codeSize;
      codeSize += 8;
    }

    var code = codes[codeBuf & (1 << maxLen) - 1];
    var codeLen = code >> 16;
    var codeVal = code & 0xffff;

    if (codeLen < 1 || codeSize < codeLen) {
      throw new _util.FormatError('Bad encoding in flate stream');
    }

    this.codeBuf = codeBuf >> codeLen;
    this.codeSize = codeSize - codeLen;
    return codeVal;
  };

  FlateStream.prototype.generateHuffmanTable = function flateStreamGenerateHuffmanTable(lengths) {
    var n = lengths.length;
    var maxLen = 0;
    var i;

    for (i = 0; i < n; ++i) {
      if (lengths[i] > maxLen) {
        maxLen = lengths[i];
      }
    }

    var size = 1 << maxLen;
    var codes = new Int32Array(size);

    for (var len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) {
      for (var val = 0; val < n; ++val) {
        if (lengths[val] === len) {
          var code2 = 0;
          var t = code;

          for (i = 0; i < len; ++i) {
            code2 = code2 << 1 | t & 1;
            t >>= 1;
          }

          for (i = code2; i < size; i += skip) {
            codes[i] = len << 16 | val;
          }

          ++code;
        }
      }
    }

    return [codes, maxLen];
  };

  FlateStream.prototype.readBlock = function FlateStream_readBlock() {
    var buffer, len;
    var str = this.str;
    var hdr = this.getBits(3);

    if (hdr & 1) {
      this.eof = true;
    }

    hdr >>= 1;

    if (hdr === 0) {
      var b;

      if ((b = str.getByte()) === -1) {
        throw new _util.FormatError('Bad block header in flate stream');
      }

      var blockLen = b;

      if ((b = str.getByte()) === -1) {
        throw new _util.FormatError('Bad block header in flate stream');
      }

      blockLen |= b << 8;

      if ((b = str.getByte()) === -1) {
        throw new _util.FormatError('Bad block header in flate stream');
      }

      var check = b;

      if ((b = str.getByte()) === -1) {
        throw new _util.FormatError('Bad block header in flate stream');
      }

      check |= b << 8;

      if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) {
        throw new _util.FormatError('Bad uncompressed block length in flate stream');
      }

      this.codeBuf = 0;
      this.codeSize = 0;
      var bufferLength = this.bufferLength;
      buffer = this.ensureBuffer(bufferLength + blockLen);
      var end = bufferLength + blockLen;
      this.bufferLength = end;

      if (blockLen === 0) {
        if (str.peekByte() === -1) {
          this.eof = true;
        }
      } else {
        for (var n = bufferLength; n < end; ++n) {
          if ((b = str.getByte()) === -1) {
            this.eof = true;
            break;
          }

          buffer[n] = b;
        }
      }

      return;
    }

    var litCodeTable;
    var distCodeTable;

    if (hdr === 1) {
      litCodeTable = fixedLitCodeTab;
      distCodeTable = fixedDistCodeTab;
    } else if (hdr === 2) {
      var numLitCodes = this.getBits(5) + 257;
      var numDistCodes = this.getBits(5) + 1;
      var numCodeLenCodes = this.getBits(4) + 4;
      var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
      var i;

      for (i = 0; i < numCodeLenCodes; ++i) {
        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
      }

      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
      len = 0;
      i = 0;
      var codes = numLitCodes + numDistCodes;
      var codeLengths = new Uint8Array(codes);
      var bitsLength, bitsOffset, what;

      while (i < codes) {
        var code = this.getCode(codeLenCodeTab);

        if (code === 16) {
          bitsLength = 2;
          bitsOffset = 3;
          what = len;
        } else if (code === 17) {
          bitsLength = 3;
          bitsOffset = 3;
          what = len = 0;
        } else if (code === 18) {
          bitsLength = 7;
          bitsOffset = 11;
          what = len = 0;
        } else {
          codeLengths[i++] = len = code;
          continue;
        }

        var repeatLength = this.getBits(bitsLength) + bitsOffset;

        while (repeatLength-- > 0) {
          codeLengths[i++] = what;
        }
      }

      litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
      distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
    } else {
      throw new _util.FormatError('Unknown block type in flate stream');
    }

    buffer = this.buffer;
    var limit = buffer ? buffer.length : 0;
    var pos = this.bufferLength;

    while (true) {
      var code1 = this.getCode(litCodeTable);

      if (code1 < 256) {
        if (pos + 1 >= limit) {
          buffer = this.ensureBuffer(pos + 1);
          limit = buffer.length;
        }

        buffer[pos++] = code1;
        continue;
      }

      if (code1 === 256) {
        this.bufferLength = pos;
        return;
      }

      code1 -= 257;
      code1 = lengthDecode[code1];
      var code2 = code1 >> 16;

      if (code2 > 0) {
        code2 = this.getBits(code2);
      }

      len = (code1 & 0xffff) + code2;
      code1 = this.getCode(distCodeTable);
      code1 = distDecode[code1];
      code2 = code1 >> 16;

      if (code2 > 0) {
        code2 = this.getBits(code2);
      }

      var dist = (code1 & 0xffff) + code2;

      if (pos + len >= limit) {
        buffer = this.ensureBuffer(pos + len);
        limit = buffer.length;
      }

      for (var k = 0; k < len; ++k, ++pos) {
        buffer[pos] = buffer[pos - dist];
      }
    }
  };

  return FlateStream;
}();

exports.FlateStream = FlateStream;

var PredictorStream = function PredictorStreamClosure() {
  function PredictorStream(str, maybeLength, params) {
    if (!(0, _primitives.isDict)(params)) {
      return str;
    }

    var predictor = this.predictor = params.get('Predictor') || 1;

    if (predictor <= 1) {
      return str;
    }

    if (predictor !== 2 && (predictor < 10 || predictor > 15)) {
      throw new _util.FormatError("Unsupported predictor: ".concat(predictor));
    }

    if (predictor === 2) {
      this.readBlock = this.readBlockTiff;
    } else {
      this.readBlock = this.readBlockPng;
    }

    this.str = str;
    this.dict = str.dict;
    var colors = this.colors = params.get('Colors') || 1;
    var bits = this.bits = params.get('BitsPerComponent') || 8;
    var columns = this.columns = params.get('Columns') || 1;
    this.pixBytes = colors * bits + 7 >> 3;
    this.rowBytes = columns * colors * bits + 7 >> 3;
    DecodeStream.call(this, maybeLength);
    return this;
  }

  PredictorStream.prototype = Object.create(DecodeStream.prototype);

  PredictorStream.prototype.readBlockTiff = function predictorStreamReadBlockTiff() {
    var rowBytes = this.rowBytes;
    var bufferLength = this.bufferLength;
    var buffer = this.ensureBuffer(bufferLength + rowBytes);
    var bits = this.bits;
    var colors = this.colors;
    var rawBytes = this.str.getBytes(rowBytes);
    this.eof = !rawBytes.length;

    if (this.eof) {
      return;
    }

    var inbuf = 0,
        outbuf = 0;
    var inbits = 0,
        outbits = 0;
    var pos = bufferLength;
    var i;

    if (bits === 1 && colors === 1) {
      for (i = 0; i < rowBytes; ++i) {
        var c = rawBytes[i] ^ inbuf;
        c ^= c >> 1;
        c ^= c >> 2;
        c ^= c >> 4;
        inbuf = (c & 1) << 7;
        buffer[pos++] = c;
      }
    } else if (bits === 8) {
      for (i = 0; i < colors; ++i) {
        buffer[pos++] = rawBytes[i];
      }

      for (; i < rowBytes; ++i) {
        buffer[pos] = buffer[pos - colors] + rawBytes[i];
        pos++;
      }
    } else if (bits === 16) {
      var bytesPerPixel = colors * 2;

      for (i = 0; i < bytesPerPixel; ++i) {
        buffer[pos++] = rawBytes[i];
      }

      for (; i < rowBytes; i += 2) {
        var sum = ((rawBytes[i] & 0xFF) << 8) + (rawBytes[i + 1] & 0xFF) + ((buffer[pos - bytesPerPixel] & 0xFF) << 8) + (buffer[pos - bytesPerPixel + 1] & 0xFF);
        buffer[pos++] = sum >> 8 & 0xFF;
        buffer[pos++] = sum & 0xFF;
      }
    } else {
      var compArray = new Uint8Array(colors + 1);
      var bitMask = (1 << bits) - 1;
      var j = 0,
          k = bufferLength;
      var columns = this.columns;

      for (i = 0; i < columns; ++i) {
        for (var kk = 0; kk < colors; ++kk) {
          if (inbits < bits) {
            inbuf = inbuf << 8 | rawBytes[j++] & 0xFF;
            inbits += 8;
          }

          compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask;
          inbits -= bits;
          outbuf = outbuf << bits | compArray[kk];
          outbits += bits;

          if (outbits >= 8) {
            buffer[k++] = outbuf >> outbits - 8 & 0xFF;
            outbits -= 8;
          }
        }
      }

      if (outbits > 0) {
        buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1);
      }
    }

    this.bufferLength += rowBytes;
  };

  PredictorStream.prototype.readBlockPng = function predictorStreamReadBlockPng() {
    var rowBytes = this.rowBytes;
    var pixBytes = this.pixBytes;
    var predictor = this.str.getByte();
    var rawBytes = this.str.getBytes(rowBytes);
    this.eof = !rawBytes.length;

    if (this.eof) {
      return;
    }

    var bufferLength = this.bufferLength;
    var buffer = this.ensureBuffer(bufferLength + rowBytes);
    var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);

    if (prevRow.length === 0) {
      prevRow = new Uint8Array(rowBytes);
    }

    var i,
        j = bufferLength,
        up,
        c;

    switch (predictor) {
      case 0:
        for (i = 0; i < rowBytes; ++i) {
          buffer[j++] = rawBytes[i];
        }

        break;

      case 1:
        for (i = 0; i < pixBytes; ++i) {
          buffer[j++] = rawBytes[i];
        }

        for (; i < rowBytes; ++i) {
          buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xFF;
          j++;
        }

        break;

      case 2:
        for (i = 0; i < rowBytes; ++i) {
          buffer[j++] = prevRow[i] + rawBytes[i] & 0xFF;
        }

        break;

      case 3:
        for (i = 0; i < pixBytes; ++i) {
          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
        }

        for (; i < rowBytes; ++i) {
          buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xFF;
          j++;
        }

        break;

      case 4:
        for (i = 0; i < pixBytes; ++i) {
          up = prevRow[i];
          c = rawBytes[i];
          buffer[j++] = up + c;
        }

        for (; i < rowBytes; ++i) {
          up = prevRow[i];
          var upLeft = prevRow[i - pixBytes];
          var left = buffer[j - pixBytes];
          var p = left + up - upLeft;
          var pa = p - left;

          if (pa < 0) {
            pa = -pa;
          }

          var pb = p - up;

          if (pb < 0) {
            pb = -pb;
          }

          var pc = p - upLeft;

          if (pc < 0) {
            pc = -pc;
          }

          c = rawBytes[i];

          if (pa <= pb && pa <= pc) {
            buffer[j++] = left + c;
          } else if (pb <= pc) {
            buffer[j++] = up + c;
          } else {
            buffer[j++] = upLeft + c;
          }
        }

        break;

      default:
        throw new _util.FormatError("Unsupported predictor: ".concat(predictor));
    }

    this.bufferLength += rowBytes;
  };

  return PredictorStream;
}();

exports.PredictorStream = PredictorStream;

var DecryptStream = function DecryptStreamClosure() {
  function DecryptStream(str, maybeLength, decrypt) {
    this.str = str;
    this.dict = str.dict;
    this.decrypt = decrypt;
    this.nextChunk = null;
    this.initialized = false;
    DecodeStream.call(this, maybeLength);
  }

  var chunkSize = 512;
  DecryptStream.prototype = Object.create(DecodeStream.prototype);

  DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {
    var chunk;

    if (this.initialized) {
      chunk = this.nextChunk;
    } else {
      chunk = this.str.getBytes(chunkSize);
      this.initialized = true;
    }

    if (!chunk || chunk.length === 0) {
      this.eof = true;
      return;
    }

    this.nextChunk = this.str.getBytes(chunkSize);
    var hasMoreData = this.nextChunk && this.nextChunk.length > 0;
    var decrypt = this.decrypt;
    chunk = decrypt(chunk, !hasMoreData);
    var bufferLength = this.bufferLength;
    var i,
        n = chunk.length;
    var buffer = this.ensureBuffer(bufferLength + n);

    for (i = 0; i < n; i++) {
      buffer[bufferLength++] = chunk[i];
    }

    this.bufferLength = bufferLength;
  };

  return DecryptStream;
}();

exports.DecryptStream = DecryptStream;

var Ascii85Stream = function Ascii85StreamClosure() {
  function Ascii85Stream(str, maybeLength) {
    this.str = str;
    this.dict = str.dict;
    this.input = new Uint8Array(5);

    if (maybeLength) {
      maybeLength = 0.8 * maybeLength;
    }

    DecodeStream.call(this, maybeLength);
  }

  Ascii85Stream.prototype = Object.create(DecodeStream.prototype);

  Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {
    var TILDA_CHAR = 0x7E;
    var Z_LOWER_CHAR = 0x7A;
    var EOF = -1;
    var str = this.str;
    var c = str.getByte();

    while ((0, _util.isSpace)(c)) {
      c = str.getByte();
    }

    if (c === EOF || c === TILDA_CHAR) {
      this.eof = true;
      return;
    }

    var bufferLength = this.bufferLength,
        buffer;
    var i;

    if (c === Z_LOWER_CHAR) {
      buffer = this.ensureBuffer(bufferLength + 4);

      for (i = 0; i < 4; ++i) {
        buffer[bufferLength + i] = 0;
      }

      this.bufferLength += 4;
    } else {
      var input = this.input;
      input[0] = c;

      for (i = 1; i < 5; ++i) {
        c = str.getByte();

        while ((0, _util.isSpace)(c)) {
          c = str.getByte();
        }

        input[i] = c;

        if (c === EOF || c === TILDA_CHAR) {
          break;
        }
      }

      buffer = this.ensureBuffer(bufferLength + i - 1);
      this.bufferLength += i - 1;

      if (i < 5) {
        for (; i < 5; ++i) {
          input[i] = 0x21 + 84;
        }

        this.eof = true;
      }

      var t = 0;

      for (i = 0; i < 5; ++i) {
        t = t * 85 + (input[i] - 0x21);
      }

      for (i = 3; i >= 0; --i) {
        buffer[bufferLength + i] = t & 0xFF;
        t >>= 8;
      }
    }
  };

  return Ascii85Stream;
}();

exports.Ascii85Stream = Ascii85Stream;

var AsciiHexStream = function AsciiHexStreamClosure() {
  function AsciiHexStream(str, maybeLength) {
    this.str = str;
    this.dict = str.dict;
    this.firstDigit = -1;

    if (maybeLength) {
      maybeLength = 0.5 * maybeLength;
    }

    DecodeStream.call(this, maybeLength);
  }

  AsciiHexStream.prototype = Object.create(DecodeStream.prototype);

  AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {
    var UPSTREAM_BLOCK_SIZE = 8000;
    var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE);

    if (!bytes.length) {
      this.eof = true;
      return;
    }

    var maxDecodeLength = bytes.length + 1 >> 1;
    var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);
    var bufferLength = this.bufferLength;
    var firstDigit = this.firstDigit;

    for (var i = 0, ii = bytes.length; i < ii; i++) {
      var ch = bytes[i],
          digit;

      if (ch >= 0x30 && ch <= 0x39) {
        digit = ch & 0x0F;
      } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {
        digit = (ch & 0x0F) + 9;
      } else if (ch === 0x3E) {
        this.eof = true;
        break;
      } else {
        continue;
      }

      if (firstDigit < 0) {
        firstDigit = digit;
      } else {
        buffer[bufferLength++] = firstDigit << 4 | digit;
        firstDigit = -1;
      }
    }

    if (firstDigit >= 0 && this.eof) {
      buffer[bufferLength++] = firstDigit << 4;
      firstDigit = -1;
    }

    this.firstDigit = firstDigit;
    this.bufferLength = bufferLength;
  };

  return AsciiHexStream;
}();

exports.AsciiHexStream = AsciiHexStream;

var RunLengthStream = function RunLengthStreamClosure() {
  function RunLengthStream(str, maybeLength) {
    this.str = str;
    this.dict = str.dict;
    DecodeStream.call(this, maybeLength);
  }

  RunLengthStream.prototype = Object.create(DecodeStream.prototype);

  RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {
    var repeatHeader = this.str.getBytes(2);

    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {
      this.eof = true;
      return;
    }

    var buffer;
    var bufferLength = this.bufferLength;
    var n = repeatHeader[0];

    if (n < 128) {
      buffer = this.ensureBuffer(bufferLength + n + 1);
      buffer[bufferLength++] = repeatHeader[1];

      if (n > 0) {
        var source = this.str.getBytes(n);
        buffer.set(source, bufferLength);
        bufferLength += n;
      }
    } else {
      n = 257 - n;
      var b = repeatHeader[1];
      buffer = this.ensureBuffer(bufferLength + n + 1);

      for (var i = 0; i < n; i++) {
        buffer[bufferLength++] = b;
      }
    }

    this.bufferLength = bufferLength;
  };

  return RunLengthStream;
}();

exports.RunLengthStream = RunLengthStream;

var LZWStream = function LZWStreamClosure() {
  function LZWStream(str, maybeLength, earlyChange) {
    this.str = str;
    this.dict = str.dict;
    this.cachedData = 0;
    this.bitsCached = 0;
    var maxLzwDictionarySize = 4096;
    var lzwState = {
      earlyChange: earlyChange,
      codeLength: 9,
      nextCode: 258,
      dictionaryValues: new Uint8Array(maxLzwDictionarySize),
      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
      currentSequence: new Uint8Array(maxLzwDictionarySize),
      currentSequenceLength: 0
    };

    for (var i = 0; i < 256; ++i) {
      lzwState.dictionaryValues[i] = i;
      lzwState.dictionaryLengths[i] = 1;
    }

    this.lzwState = lzwState;
    DecodeStream.call(this, maybeLength);
  }

  LZWStream.prototype = Object.create(DecodeStream.prototype);

  LZWStream.prototype.readBits = function LZWStream_readBits(n) {
    var bitsCached = this.bitsCached;
    var cachedData = this.cachedData;

    while (bitsCached < n) {
      var c = this.str.getByte();

      if (c === -1) {
        this.eof = true;
        return null;
      }

      cachedData = cachedData << 8 | c;
      bitsCached += 8;
    }

    this.bitsCached = bitsCached -= n;
    this.cachedData = cachedData;
    this.lastCode = null;
    return cachedData >>> bitsCached & (1 << n) - 1;
  };

  LZWStream.prototype.readBlock = function LZWStream_readBlock() {
    var blockSize = 512;
    var estimatedDecodedSize = blockSize * 2,
        decodedSizeDelta = blockSize;
    var i, j, q;
    var lzwState = this.lzwState;

    if (!lzwState) {
      return;
    }

    var earlyChange = lzwState.earlyChange;
    var nextCode = lzwState.nextCode;
    var dictionaryValues = lzwState.dictionaryValues;
    var dictionaryLengths = lzwState.dictionaryLengths;
    var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
    var codeLength = lzwState.codeLength;
    var prevCode = lzwState.prevCode;
    var currentSequence = lzwState.currentSequence;
    var currentSequenceLength = lzwState.currentSequenceLength;
    var decodedLength = 0;
    var currentBufferLength = this.bufferLength;
    var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);

    for (i = 0; i < blockSize; i++) {
      var code = this.readBits(codeLength);
      var hasPrev = currentSequenceLength > 0;

      if (code < 256) {
        currentSequence[0] = code;
        currentSequenceLength = 1;
      } else if (code >= 258) {
        if (code < nextCode) {
          currentSequenceLength = dictionaryLengths[code];

          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
            currentSequence[j] = dictionaryValues[q];
            q = dictionaryPrevCodes[q];
          }
        } else {
          currentSequence[currentSequenceLength++] = currentSequence[0];
        }
      } else if (code === 256) {
        codeLength = 9;
        nextCode = 258;
        currentSequenceLength = 0;
        continue;
      } else {
        this.eof = true;
        delete this.lzwState;
        break;
      }

      if (hasPrev) {
        dictionaryPrevCodes[nextCode] = prevCode;
        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
        dictionaryValues[nextCode] = currentSequence[0];
        nextCode++;
        codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0;
      }

      prevCode = code;
      decodedLength += currentSequenceLength;

      if (estimatedDecodedSize < decodedLength) {
        do {
          estimatedDecodedSize += decodedSizeDelta;
        } while (estimatedDecodedSize < decodedLength);

        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
      }

      for (j = 0; j < currentSequenceLength; j++) {
        buffer[currentBufferLength++] = currentSequence[j];
      }
    }

    lzwState.nextCode = nextCode;
    lzwState.codeLength = codeLength;
    lzwState.prevCode = prevCode;
    lzwState.currentSequenceLength = currentSequenceLength;
    this.bufferLength = currentBufferLength;
  };

  return LZWStream;
}();

exports.LZWStream = LZWStream;

var NullStream = function NullStreamClosure() {
  function NullStream() {
    Stream.call(this, new Uint8Array(0));
  }

  NullStream.prototype = Stream.prototype;
  return NullStream;
}();

exports.NullStream = NullStream;

/***/ }),
/* 158 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CCITTFaxStream = void 0;

var _primitives = __w_pdfjs_require__(155);

var _ccitt = __w_pdfjs_require__(159);

var _stream = __w_pdfjs_require__(157);

var CCITTFaxStream = function CCITTFaxStreamClosure() {
  function CCITTFaxStream(str, maybeLength, params) {
    this.str = str;
    this.dict = str.dict;

    if (!(0, _primitives.isDict)(params)) {
      params = _primitives.Dict.empty;
    }

    var source = {
      next: function next() {
        return str.getByte();
      }
    };
    this.ccittFaxDecoder = new _ccitt.CCITTFaxDecoder(source, {
      K: params.get('K'),
      EndOfLine: params.get('EndOfLine'),
      EncodedByteAlign: params.get('EncodedByteAlign'),
      Columns: params.get('Columns'),
      Rows: params.get('Rows'),
      EndOfBlock: params.get('EndOfBlock'),
      BlackIs1: params.get('BlackIs1')
    });

    _stream.DecodeStream.call(this, maybeLength);
  }

  CCITTFaxStream.prototype = Object.create(_stream.DecodeStream.prototype);

  CCITTFaxStream.prototype.readBlock = function () {
    while (!this.eof) {
      var c = this.ccittFaxDecoder.readNextChar();

      if (c === -1) {
        this.eof = true;
        return;
      }

      this.ensureBuffer(this.bufferLength + 1);
      this.buffer[this.bufferLength++] = c;
    }
  };

  return CCITTFaxStream;
}();

exports.CCITTFaxStream = CCITTFaxStream;

/***/ }),
/* 159 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CCITTFaxDecoder = void 0;

var _util = __w_pdfjs_require__(6);

var CCITTFaxDecoder = function CCITTFaxDecoder() {
  var ccittEOL = -2;
  var ccittEOF = -1;
  var twoDimPass = 0;
  var twoDimHoriz = 1;
  var twoDimVert0 = 2;
  var twoDimVertR1 = 3;
  var twoDimVertL1 = 4;
  var twoDimVertR2 = 5;
  var twoDimVertL2 = 6;
  var twoDimVertR3 = 7;
  var twoDimVertL3 = 8;
  var twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0]];
  var whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]];
  var whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], [8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], [8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], [7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], [8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], [8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], [7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], [8, 0], [8, 0], [8, 320], [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 896], [9, 960], [9, 1024], [9, 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]];
  var blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 2048], [12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 2304], [11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 2368], [12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], [13, 768], [13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], [12, 59], [12, 59], [12, 60], [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], [11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]];
  var blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], [12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], [12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], [12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]];
  var blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 6], [4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]];

  function CCITTFaxDecoder(source) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    if (!source || typeof source.next !== 'function') {
      throw new Error('CCITTFaxDecoder - invalid "source" parameter.');
    }

    this.source = source;
    this.eof = false;
    this.encoding = options['K'] || 0;
    this.eoline = options['EndOfLine'] || false;
    this.byteAlign = options['EncodedByteAlign'] || false;
    this.columns = options['Columns'] || 1728;
    this.rows = options['Rows'] || 0;
    var eoblock = options['EndOfBlock'];

    if (eoblock === null || eoblock === undefined) {
      eoblock = true;
    }

    this.eoblock = eoblock;
    this.black = options['BlackIs1'] || false;
    this.codingLine = new Uint32Array(this.columns + 1);
    this.refLine = new Uint32Array(this.columns + 2);
    this.codingLine[0] = this.columns;
    this.codingPos = 0;
    this.row = 0;
    this.nextLine2D = this.encoding < 0;
    this.inputBits = 0;
    this.inputBuf = 0;
    this.outputBits = 0;
    this.rowsDone = false;
    var code1;

    while ((code1 = this._lookBits(12)) === 0) {
      this._eatBits(1);
    }

    if (code1 === 1) {
      this._eatBits(12);
    }

    if (this.encoding > 0) {
      this.nextLine2D = !this._lookBits(1);

      this._eatBits(1);
    }
  }

  CCITTFaxDecoder.prototype = {
    readNextChar: function readNextChar() {
      if (this.eof) {
        return -1;
      }

      var refLine = this.refLine;
      var codingLine = this.codingLine;
      var columns = this.columns;
      var refPos, blackPixels, bits, i;

      if (this.outputBits === 0) {
        if (this.rowsDone) {
          this.eof = true;
        }

        if (this.eof) {
          return -1;
        }

        this.err = false;
        var code1, code2, code3;

        if (this.nextLine2D) {
          for (i = 0; codingLine[i] < columns; ++i) {
            refLine[i] = codingLine[i];
          }

          refLine[i++] = columns;
          refLine[i] = columns;
          codingLine[0] = 0;
          this.codingPos = 0;
          refPos = 0;
          blackPixels = 0;

          while (codingLine[this.codingPos] < columns) {
            code1 = this._getTwoDimCode();

            switch (code1) {
              case twoDimPass:
                this._addPixels(refLine[refPos + 1], blackPixels);

                if (refLine[refPos + 1] < columns) {
                  refPos += 2;
                }

                break;

              case twoDimHoriz:
                code1 = code2 = 0;

                if (blackPixels) {
                  do {
                    code1 += code3 = this._getBlackCode();
                  } while (code3 >= 64);

                  do {
                    code2 += code3 = this._getWhiteCode();
                  } while (code3 >= 64);
                } else {
                  do {
                    code1 += code3 = this._getWhiteCode();
                  } while (code3 >= 64);

                  do {
                    code2 += code3 = this._getBlackCode();
                  } while (code3 >= 64);
                }

                this._addPixels(codingLine[this.codingPos] + code1, blackPixels);

                if (codingLine[this.codingPos] < columns) {
                  this._addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1);
                }

                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
                  refPos += 2;
                }

                break;

              case twoDimVertR3:
                this._addPixels(refLine[refPos] + 3, blackPixels);

                blackPixels ^= 1;

                if (codingLine[this.codingPos] < columns) {
                  ++refPos;

                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
                    refPos += 2;
                  }
                }

                break;

              case twoDimVertR2:
                this._addPixels(refLine[refPos] + 2, blackPixels);

                blackPixels ^= 1;

                if (codingLine[this.codingPos] < columns) {
                  ++refPos;

                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
                    refPos += 2;
                  }
                }

                break;

              case twoDimVertR1:
                this._addPixels(refLine[refPos] + 1, blackPixels);

                blackPixels ^= 1;

                if (codingLine[this.codingPos] < columns) {
                  ++refPos;

                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
                    refPos += 2;
                  }
                }

                break;

              case twoDimVert0:
                this._addPixels(refLine[refPos], blackPixels);

                blackPixels ^= 1;

                if (codingLine[this.codingPos] < columns) {
                  ++refPos;

                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
                    refPos += 2;
                  }
                }

                break;

              case twoDimVertL3:
                this._addPixelsNeg(refLine[refPos] - 3, blackPixels);

                blackPixels ^= 1;

                if (codingLine[this.codingPos] < columns) {
                  if (refPos > 0) {
                    --refPos;
                  } else {
                    ++refPos;
                  }

                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
                    refPos += 2;
                  }
                }

                break;

              case twoDimVertL2:
                this._addPixelsNeg(refLine[refPos] - 2, blackPixels);

                blackPixels ^= 1;

                if (codingLine[this.codingPos] < columns) {
                  if (refPos > 0) {
                    --refPos;
                  } else {
                    ++refPos;
                  }

                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
                    refPos += 2;
                  }
                }

                break;

              case twoDimVertL1:
                this._addPixelsNeg(refLine[refPos] - 1, blackPixels);

                blackPixels ^= 1;

                if (codingLine[this.codingPos] < columns) {
                  if (refPos > 0) {
                    --refPos;
                  } else {
                    ++refPos;
                  }

                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
                    refPos += 2;
                  }
                }

                break;

              case ccittEOF:
                this._addPixels(columns, 0);

                this.eof = true;
                break;

              default:
                (0, _util.info)('bad 2d code');

                this._addPixels(columns, 0);

                this.err = true;
            }
          }
        } else {
          codingLine[0] = 0;
          this.codingPos = 0;
          blackPixels = 0;

          while (codingLine[this.codingPos] < columns) {
            code1 = 0;

            if (blackPixels) {
              do {
                code1 += code3 = this._getBlackCode();
              } while (code3 >= 64);
            } else {
              do {
                code1 += code3 = this._getWhiteCode();
              } while (code3 >= 64);
            }

            this._addPixels(codingLine[this.codingPos] + code1, blackPixels);

            blackPixels ^= 1;
          }
        }

        var gotEOL = false;

        if (this.byteAlign) {
          this.inputBits &= ~7;
        }

        if (!this.eoblock && this.row === this.rows - 1) {
          this.rowsDone = true;
        } else {
          code1 = this._lookBits(12);

          if (this.eoline) {
            while (code1 !== ccittEOF && code1 !== 1) {
              this._eatBits(1);

              code1 = this._lookBits(12);
            }
          } else {
            while (code1 === 0) {
              this._eatBits(1);

              code1 = this._lookBits(12);
            }
          }

          if (code1 === 1) {
            this._eatBits(12);

            gotEOL = true;
          } else if (code1 === ccittEOF) {
            this.eof = true;
          }
        }

        if (!this.eof && this.encoding > 0 && !this.rowsDone) {
          this.nextLine2D = !this._lookBits(1);

          this._eatBits(1);
        }

        if (this.eoblock && gotEOL && this.byteAlign) {
          code1 = this._lookBits(12);

          if (code1 === 1) {
            this._eatBits(12);

            if (this.encoding > 0) {
              this._lookBits(1);

              this._eatBits(1);
            }

            if (this.encoding >= 0) {
              for (i = 0; i < 4; ++i) {
                code1 = this._lookBits(12);

                if (code1 !== 1) {
                  (0, _util.info)('bad rtc code: ' + code1);
                }

                this._eatBits(12);

                if (this.encoding > 0) {
                  this._lookBits(1);

                  this._eatBits(1);
                }
              }
            }

            this.eof = true;
          }
        } else if (this.err && this.eoline) {
          while (true) {
            code1 = this._lookBits(13);

            if (code1 === ccittEOF) {
              this.eof = true;
              return -1;
            }

            if (code1 >> 1 === 1) {
              break;
            }

            this._eatBits(1);
          }

          this._eatBits(12);

          if (this.encoding > 0) {
            this._eatBits(1);

            this.nextLine2D = !(code1 & 1);
          }
        }

        if (codingLine[0] > 0) {
          this.outputBits = codingLine[this.codingPos = 0];
        } else {
          this.outputBits = codingLine[this.codingPos = 1];
        }

        this.row++;
      }

      var c;

      if (this.outputBits >= 8) {
        c = this.codingPos & 1 ? 0 : 0xFF;
        this.outputBits -= 8;

        if (this.outputBits === 0 && codingLine[this.codingPos] < columns) {
          this.codingPos++;
          this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];
        }
      } else {
        bits = 8;
        c = 0;

        do {
          if (this.outputBits > bits) {
            c <<= bits;

            if (!(this.codingPos & 1)) {
              c |= 0xFF >> 8 - bits;
            }

            this.outputBits -= bits;
            bits = 0;
          } else {
            c <<= this.outputBits;

            if (!(this.codingPos & 1)) {
              c |= 0xFF >> 8 - this.outputBits;
            }

            bits -= this.outputBits;
            this.outputBits = 0;

            if (codingLine[this.codingPos] < columns) {
              this.codingPos++;
              this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];
            } else if (bits > 0) {
              c <<= bits;
              bits = 0;
            }
          }
        } while (bits);
      }

      if (this.black) {
        c ^= 0xFF;
      }

      return c;
    },
    _addPixels: function _addPixels(a1, blackPixels) {
      var codingLine = this.codingLine;
      var codingPos = this.codingPos;

      if (a1 > codingLine[codingPos]) {
        if (a1 > this.columns) {
          (0, _util.info)('row is wrong length');
          this.err = true;
          a1 = this.columns;
        }

        if (codingPos & 1 ^ blackPixels) {
          ++codingPos;
        }

        codingLine[codingPos] = a1;
      }

      this.codingPos = codingPos;
    },
    _addPixelsNeg: function _addPixelsNeg(a1, blackPixels) {
      var codingLine = this.codingLine;
      var codingPos = this.codingPos;

      if (a1 > codingLine[codingPos]) {
        if (a1 > this.columns) {
          (0, _util.info)('row is wrong length');
          this.err = true;
          a1 = this.columns;
        }

        if (codingPos & 1 ^ blackPixels) {
          ++codingPos;
        }

        codingLine[codingPos] = a1;
      } else if (a1 < codingLine[codingPos]) {
        if (a1 < 0) {
          (0, _util.info)('invalid code');
          this.err = true;
          a1 = 0;
        }

        while (codingPos > 0 && a1 < codingLine[codingPos - 1]) {
          --codingPos;
        }

        codingLine[codingPos] = a1;
      }

      this.codingPos = codingPos;
    },
    _findTableCode: function _findTableCode(start, end, table, limit) {
      var limitValue = limit || 0;

      for (var i = start; i <= end; ++i) {
        var code = this._lookBits(i);

        if (code === ccittEOF) {
          return [true, 1, false];
        }

        if (i < end) {
          code <<= end - i;
        }

        if (!limitValue || code >= limitValue) {
          var p = table[code - limitValue];

          if (p[0] === i) {
            this._eatBits(i);

            return [true, p[1], true];
          }
        }
      }

      return [false, 0, false];
    },
    _getTwoDimCode: function _getTwoDimCode() {
      var code = 0;
      var p;

      if (this.eoblock) {
        code = this._lookBits(7);
        p = twoDimTable[code];

        if (p && p[0] > 0) {
          this._eatBits(p[0]);

          return p[1];
        }
      } else {
        var result = this._findTableCode(1, 7, twoDimTable);

        if (result[0] && result[2]) {
          return result[1];
        }
      }

      (0, _util.info)('Bad two dim code');
      return ccittEOF;
    },
    _getWhiteCode: function _getWhiteCode() {
      var code = 0;
      var p;

      if (this.eoblock) {
        code = this._lookBits(12);

        if (code === ccittEOF) {
          return 1;
        }

        if (code >> 5 === 0) {
          p = whiteTable1[code];
        } else {
          p = whiteTable2[code >> 3];
        }

        if (p[0] > 0) {
          this._eatBits(p[0]);

          return p[1];
        }
      } else {
        var result = this._findTableCode(1, 9, whiteTable2);

        if (result[0]) {
          return result[1];
        }

        result = this._findTableCode(11, 12, whiteTable1);

        if (result[0]) {
          return result[1];
        }
      }

      (0, _util.info)('bad white code');

      this._eatBits(1);

      return 1;
    },
    _getBlackCode: function _getBlackCode() {
      var code, p;

      if (this.eoblock) {
        code = this._lookBits(13);

        if (code === ccittEOF) {
          return 1;
        }

        if (code >> 7 === 0) {
          p = blackTable1[code];
        } else if (code >> 9 === 0 && code >> 7 !== 0) {
          p = blackTable2[(code >> 1) - 64];
        } else {
          p = blackTable3[code >> 7];
        }

        if (p[0] > 0) {
          this._eatBits(p[0]);

          return p[1];
        }
      } else {
        var result = this._findTableCode(2, 6, blackTable3);

        if (result[0]) {
          return result[1];
        }

        result = this._findTableCode(7, 12, blackTable2, 64);

        if (result[0]) {
          return result[1];
        }

        result = this._findTableCode(10, 13, blackTable1);

        if (result[0]) {
          return result[1];
        }
      }

      (0, _util.info)('bad black code');

      this._eatBits(1);

      return 1;
    },
    _lookBits: function _lookBits(n) {
      var c;

      while (this.inputBits < n) {
        if ((c = this.source.next()) === -1) {
          if (this.inputBits === 0) {
            return ccittEOF;
          }

          return this.inputBuf << n - this.inputBits & 0xFFFF >> 16 - n;
        }

        this.inputBuf = this.inputBuf << 8 | c;
        this.inputBits += 8;
      }

      return this.inputBuf >> this.inputBits - n & 0xFFFF >> 16 - n;
    },
    _eatBits: function _eatBits(n) {
      if ((this.inputBits -= n) < 0) {
        this.inputBits = 0;
      }
    }
  };
  return CCITTFaxDecoder;
}();

exports.CCITTFaxDecoder = CCITTFaxDecoder;

/***/ }),
/* 160 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Jbig2Stream = void 0;

var _primitives = __w_pdfjs_require__(155);

var _stream = __w_pdfjs_require__(157);

var _jbig = __w_pdfjs_require__(161);

var _util = __w_pdfjs_require__(6);

var Jbig2Stream = function Jbig2StreamClosure() {
  function Jbig2Stream(stream, maybeLength, dict, params) {
    this.stream = stream;
    this.maybeLength = maybeLength;
    this.dict = dict;
    this.params = params;

    _stream.DecodeStream.call(this, maybeLength);
  }

  Jbig2Stream.prototype = Object.create(_stream.DecodeStream.prototype);
  Object.defineProperty(Jbig2Stream.prototype, 'bytes', {
    get: function get() {
      return (0, _util.shadow)(this, 'bytes', this.stream.getBytes(this.maybeLength));
    },
    configurable: true
  });

  Jbig2Stream.prototype.ensureBuffer = function (requested) {};

  Jbig2Stream.prototype.readBlock = function () {
    if (this.eof) {
      return;
    }

    var jbig2Image = new _jbig.Jbig2Image();
    var chunks = [];

    if ((0, _primitives.isDict)(this.params)) {
      var globalsStream = this.params.get('JBIG2Globals');

      if ((0, _primitives.isStream)(globalsStream)) {
        var globals = globalsStream.getBytes();
        chunks.push({
          data: globals,
          start: 0,
          end: globals.length
        });
      }
    }

    chunks.push({
      data: this.bytes,
      start: 0,
      end: this.bytes.length
    });
    var data = jbig2Image.parseChunks(chunks);
    var dataLength = data.length;

    for (var i = 0; i < dataLength; i++) {
      data[i] ^= 0xFF;
    }

    this.buffer = data;
    this.bufferLength = dataLength;
    this.eof = true;
  };

  return Jbig2Stream;
}();

exports.Jbig2Stream = Jbig2Stream;

/***/ }),
/* 161 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Jbig2Image = void 0;

var _util = __w_pdfjs_require__(6);

var _arithmetic_decoder = __w_pdfjs_require__(162);

var _ccitt = __w_pdfjs_require__(159);

var Jbig2Error = function Jbig2ErrorClosure() {
  function Jbig2Error(msg) {
    this.message = 'JBIG2 error: ' + msg;
  }

  Jbig2Error.prototype = new Error();
  Jbig2Error.prototype.name = 'Jbig2Error';
  Jbig2Error.constructor = Jbig2Error;
  return Jbig2Error;
}();

var Jbig2Image = function Jbig2ImageClosure() {
  function ContextCache() {}

  ContextCache.prototype = {
    getContexts: function getContexts(id) {
      if (id in this) {
        return this[id];
      }

      return this[id] = new Int8Array(1 << 16);
    }
  };

  function DecodingContext(data, start, end) {
    this.data = data;
    this.start = start;
    this.end = end;
  }

  DecodingContext.prototype = {
    get decoder() {
      var decoder = new _arithmetic_decoder.ArithmeticDecoder(this.data, this.start, this.end);
      return (0, _util.shadow)(this, 'decoder', decoder);
    },

    get contextCache() {
      var cache = new ContextCache();
      return (0, _util.shadow)(this, 'contextCache', cache);
    }

  };

  function decodeInteger(contextCache, procedure, decoder) {
    var contexts = contextCache.getContexts(procedure);
    var prev = 1;

    function readBits(length) {
      var v = 0;

      for (var i = 0; i < length; i++) {
        var bit = decoder.readBit(contexts, prev);
        prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256;
        v = v << 1 | bit;
      }

      return v >>> 0;
    }

    var sign = readBits(1);
    var value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2);
    return sign === 0 ? value : value > 0 ? -value : null;
  }

  function decodeIAID(contextCache, decoder, codeLength) {
    var contexts = contextCache.getContexts('IAID');
    var prev = 1;

    for (var i = 0; i < codeLength; i++) {
      var bit = decoder.readBit(contexts, prev);
      prev = prev << 1 | bit;
    }

    if (codeLength < 31) {
      return prev & (1 << codeLength) - 1;
    }

    return prev & 0x7FFFFFFF;
  }

  var SegmentTypes = ['SymbolDictionary', null, null, null, 'IntermediateTextRegion', null, 'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null, null, null, null, null, null, 'PatternDictionary', null, null, null, 'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion', 'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null, null, null, null, null, null, 'IntermediateGenericRegion', null, 'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion', 'IntermediateGenericRefinementRegion', null, 'ImmediateGenericRefinementRegion', 'ImmediateLosslessGenericRefinementRegion', null, null, null, null, 'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles', 'Tables', null, null, null, null, null, null, null, null, 'Extension'];
  var CodingTemplates = [[{
    x: -1,
    y: -2
  }, {
    x: 0,
    y: -2
  }, {
    x: 1,
    y: -2
  }, {
    x: -2,
    y: -1
  }, {
    x: -1,
    y: -1
  }, {
    x: 0,
    y: -1
  }, {
    x: 1,
    y: -1
  }, {
    x: 2,
    y: -1
  }, {
    x: -4,
    y: 0
  }, {
    x: -3,
    y: 0
  }, {
    x: -2,
    y: 0
  }, {
    x: -1,
    y: 0
  }], [{
    x: -1,
    y: -2
  }, {
    x: 0,
    y: -2
  }, {
    x: 1,
    y: -2
  }, {
    x: 2,
    y: -2
  }, {
    x: -2,
    y: -1
  }, {
    x: -1,
    y: -1
  }, {
    x: 0,
    y: -1
  }, {
    x: 1,
    y: -1
  }, {
    x: 2,
    y: -1
  }, {
    x: -3,
    y: 0
  }, {
    x: -2,
    y: 0
  }, {
    x: -1,
    y: 0
  }], [{
    x: -1,
    y: -2
  }, {
    x: 0,
    y: -2
  }, {
    x: 1,
    y: -2
  }, {
    x: -2,
    y: -1
  }, {
    x: -1,
    y: -1
  }, {
    x: 0,
    y: -1
  }, {
    x: 1,
    y: -1
  }, {
    x: -2,
    y: 0
  }, {
    x: -1,
    y: 0
  }], [{
    x: -3,
    y: -1
  }, {
    x: -2,
    y: -1
  }, {
    x: -1,
    y: -1
  }, {
    x: 0,
    y: -1
  }, {
    x: 1,
    y: -1
  }, {
    x: -4,
    y: 0
  }, {
    x: -3,
    y: 0
  }, {
    x: -2,
    y: 0
  }, {
    x: -1,
    y: 0
  }]];
  var RefinementTemplates = [{
    coding: [{
      x: 0,
      y: -1
    }, {
      x: 1,
      y: -1
    }, {
      x: -1,
      y: 0
    }],
    reference: [{
      x: 0,
      y: -1
    }, {
      x: 1,
      y: -1
    }, {
      x: -1,
      y: 0
    }, {
      x: 0,
      y: 0
    }, {
      x: 1,
      y: 0
    }, {
      x: -1,
      y: 1
    }, {
      x: 0,
      y: 1
    }, {
      x: 1,
      y: 1
    }]
  }, {
    coding: [{
      x: -1,
      y: -1
    }, {
      x: 0,
      y: -1
    }, {
      x: 1,
      y: -1
    }, {
      x: -1,
      y: 0
    }],
    reference: [{
      x: 0,
      y: -1
    }, {
      x: -1,
      y: 0
    }, {
      x: 0,
      y: 0
    }, {
      x: 1,
      y: 0
    }, {
      x: 0,
      y: 1
    }, {
      x: 1,
      y: 1
    }]
  }];
  var ReusedContexts = [0x9B25, 0x0795, 0x00E5, 0x0195];
  var RefinementReusedContexts = [0x0020, 0x0008];

  function decodeBitmapTemplate0(width, height, decodingContext) {
    var decoder = decodingContext.decoder;
    var contexts = decodingContext.contextCache.getContexts('GB');
    var contextLabel,
        i,
        j,
        pixel,
        row,
        row1,
        row2,
        bitmap = [];
    var OLD_PIXEL_MASK = 0x7BF7;

    for (i = 0; i < height; i++) {
      row = bitmap[i] = new Uint8Array(width);
      row1 = i < 1 ? row : bitmap[i - 1];
      row2 = i < 2 ? row : bitmap[i - 2];
      contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4;

      for (j = 0; j < width; j++) {
        row[j] = pixel = decoder.readBit(contexts, contextLabel);
        contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel;
      }
    }

    return bitmap;
  }

  function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) {
    if (mmr) {
      var input = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);
      return decodeMMRBitmap(input, width, height, false);
    }

    if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) {
      return decodeBitmapTemplate0(width, height, decodingContext);
    }

    var useskip = !!skip;
    var template = CodingTemplates[templateIndex].concat(at);
    template.sort(function (a, b) {
      return a.y - b.y || a.x - b.x;
    });
    var templateLength = template.length;
    var templateX = new Int8Array(templateLength);
    var templateY = new Int8Array(templateLength);
    var changingTemplateEntries = [];
    var reuseMask = 0,
        minX = 0,
        maxX = 0,
        minY = 0;
    var c, k;

    for (k = 0; k < templateLength; k++) {
      templateX[k] = template[k].x;
      templateY[k] = template[k].y;
      minX = Math.min(minX, template[k].x);
      maxX = Math.max(maxX, template[k].x);
      minY = Math.min(minY, template[k].y);

      if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) {
        reuseMask |= 1 << templateLength - 1 - k;
      } else {
        changingTemplateEntries.push(k);
      }
    }

    var changingEntriesLength = changingTemplateEntries.length;
    var changingTemplateX = new Int8Array(changingEntriesLength);
    var changingTemplateY = new Int8Array(changingEntriesLength);
    var changingTemplateBit = new Uint16Array(changingEntriesLength);

    for (c = 0; c < changingEntriesLength; c++) {
      k = changingTemplateEntries[c];
      changingTemplateX[c] = template[k].x;
      changingTemplateY[c] = template[k].y;
      changingTemplateBit[c] = 1 << templateLength - 1 - k;
    }

    var sbb_left = -minX;
    var sbb_top = -minY;
    var sbb_right = width - maxX;
    var pseudoPixelContext = ReusedContexts[templateIndex];
    var row = new Uint8Array(width);
    var bitmap = [];
    var decoder = decodingContext.decoder;
    var contexts = decodingContext.contextCache.getContexts('GB');
    var ltp = 0,
        j,
        i0,
        j0,
        contextLabel = 0,
        bit,
        shift;

    for (var i = 0; i < height; i++) {
      if (prediction) {
        var sltp = decoder.readBit(contexts, pseudoPixelContext);
        ltp ^= sltp;

        if (ltp) {
          bitmap.push(row);
          continue;
        }
      }

      row = new Uint8Array(row);
      bitmap.push(row);

      for (j = 0; j < width; j++) {
        if (useskip && skip[i][j]) {
          row[j] = 0;
          continue;
        }

        if (j >= sbb_left && j < sbb_right && i >= sbb_top) {
          contextLabel = contextLabel << 1 & reuseMask;

          for (k = 0; k < changingEntriesLength; k++) {
            i0 = i + changingTemplateY[k];
            j0 = j + changingTemplateX[k];
            bit = bitmap[i0][j0];

            if (bit) {
              bit = changingTemplateBit[k];
              contextLabel |= bit;
            }
          }
        } else {
          contextLabel = 0;
          shift = templateLength - 1;

          for (k = 0; k < templateLength; k++, shift--) {
            j0 = j + templateX[k];

            if (j0 >= 0 && j0 < width) {
              i0 = i + templateY[k];

              if (i0 >= 0) {
                bit = bitmap[i0][j0];

                if (bit) {
                  contextLabel |= bit << shift;
                }
              }
            }
          }
        }

        var pixel = decoder.readBit(contexts, contextLabel);
        row[j] = pixel;
      }
    }

    return bitmap;
  }

  function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) {
    var codingTemplate = RefinementTemplates[templateIndex].coding;

    if (templateIndex === 0) {
      codingTemplate = codingTemplate.concat([at[0]]);
    }

    var codingTemplateLength = codingTemplate.length;
    var codingTemplateX = new Int32Array(codingTemplateLength);
    var codingTemplateY = new Int32Array(codingTemplateLength);
    var k;

    for (k = 0; k < codingTemplateLength; k++) {
      codingTemplateX[k] = codingTemplate[k].x;
      codingTemplateY[k] = codingTemplate[k].y;
    }

    var referenceTemplate = RefinementTemplates[templateIndex].reference;

    if (templateIndex === 0) {
      referenceTemplate = referenceTemplate.concat([at[1]]);
    }

    var referenceTemplateLength = referenceTemplate.length;
    var referenceTemplateX = new Int32Array(referenceTemplateLength);
    var referenceTemplateY = new Int32Array(referenceTemplateLength);

    for (k = 0; k < referenceTemplateLength; k++) {
      referenceTemplateX[k] = referenceTemplate[k].x;
      referenceTemplateY[k] = referenceTemplate[k].y;
    }

    var referenceWidth = referenceBitmap[0].length;
    var referenceHeight = referenceBitmap.length;
    var pseudoPixelContext = RefinementReusedContexts[templateIndex];
    var bitmap = [];
    var decoder = decodingContext.decoder;
    var contexts = decodingContext.contextCache.getContexts('GR');
    var ltp = 0;

    for (var i = 0; i < height; i++) {
      if (prediction) {
        var sltp = decoder.readBit(contexts, pseudoPixelContext);
        ltp ^= sltp;

        if (ltp) {
          throw new Jbig2Error('prediction is not supported');
        }
      }

      var row = new Uint8Array(width);
      bitmap.push(row);

      for (var j = 0; j < width; j++) {
        var i0, j0;
        var contextLabel = 0;

        for (k = 0; k < codingTemplateLength; k++) {
          i0 = i + codingTemplateY[k];
          j0 = j + codingTemplateX[k];

          if (i0 < 0 || j0 < 0 || j0 >= width) {
            contextLabel <<= 1;
          } else {
            contextLabel = contextLabel << 1 | bitmap[i0][j0];
          }
        }

        for (k = 0; k < referenceTemplateLength; k++) {
          i0 = i + referenceTemplateY[k] - offsetY;
          j0 = j + referenceTemplateX[k] - offsetX;

          if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) {
            contextLabel <<= 1;
          } else {
            contextLabel = contextLabel << 1 | referenceBitmap[i0][j0];
          }
        }

        var pixel = decoder.readBit(contexts, contextLabel);
        row[j] = pixel;
      }
    }

    return bitmap;
  }

  function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext, huffmanInput) {
    if (huffman && refinement) {
      throw new Jbig2Error('symbol refinement with Huffman is not supported');
    }

    var newSymbols = [];
    var currentHeight = 0;
    var symbolCodeLength = (0, _util.log2)(symbols.length + numberOfNewSymbols);
    var decoder = decodingContext.decoder;
    var contextCache = decodingContext.contextCache;
    var tableB1, symbolWidths;

    if (huffman) {
      tableB1 = getStandardTable(1);
      symbolWidths = [];
      symbolCodeLength = Math.max(symbolCodeLength, 1);
    }

    while (newSymbols.length < numberOfNewSymbols) {
      var deltaHeight = huffman ? huffmanTables.tableDeltaHeight.decode(huffmanInput) : decodeInteger(contextCache, 'IADH', decoder);
      currentHeight += deltaHeight;
      var currentWidth = 0,
          totalWidth = 0;
      var firstSymbol = huffman ? symbolWidths.length : 0;

      while (true) {
        var deltaWidth = huffman ? huffmanTables.tableDeltaWidth.decode(huffmanInput) : decodeInteger(contextCache, 'IADW', decoder);

        if (deltaWidth === null) {
          break;
        }

        currentWidth += deltaWidth;
        totalWidth += currentWidth;
        var bitmap;

        if (refinement) {
          var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder);

          if (numberOfInstances > 1) {
            bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, 0, huffmanInput);
          } else {
            var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);
            var rdx = decodeInteger(contextCache, 'IARDX', decoder);
            var rdy = decodeInteger(contextCache, 'IARDY', decoder);
            var symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length];
            bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext);
          }

          newSymbols.push(bitmap);
        } else if (huffman) {
          symbolWidths.push(currentWidth);
        } else {
          bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext);
          newSymbols.push(bitmap);
        }
      }

      if (huffman && !refinement) {
        var bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput);
        huffmanInput.byteAlign();
        var collectiveBitmap = void 0;

        if (bitmapSize === 0) {
          collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth, currentHeight);
        } else {
          var originalEnd = huffmanInput.end;
          var bitmapEnd = huffmanInput.position + bitmapSize;
          huffmanInput.end = bitmapEnd;
          collectiveBitmap = decodeMMRBitmap(huffmanInput, totalWidth, currentHeight, false);
          huffmanInput.end = originalEnd;
          huffmanInput.position = bitmapEnd;
        }

        var numberOfSymbolsDecoded = symbolWidths.length;

        if (firstSymbol === numberOfSymbolsDecoded - 1) {
          newSymbols.push(collectiveBitmap);
        } else {
          var _i = void 0,
              y = void 0,
              xMin = 0,
              xMax = void 0,
              bitmapWidth = void 0,
              symbolBitmap = void 0;

          for (_i = firstSymbol; _i < numberOfSymbolsDecoded; _i++) {
            bitmapWidth = symbolWidths[_i];
            xMax = xMin + bitmapWidth;
            symbolBitmap = [];

            for (y = 0; y < currentHeight; y++) {
              symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));
            }

            newSymbols.push(symbolBitmap);
            xMin = xMax;
          }
        }
      }
    }

    var exportedSymbols = [];
    var flags = [],
        currentFlag = false;
    var totalSymbolsLength = symbols.length + numberOfNewSymbols;

    while (flags.length < totalSymbolsLength) {
      var runLength = huffman ? tableB1.decode(huffmanInput) : decodeInteger(contextCache, 'IAEX', decoder);

      while (runLength--) {
        flags.push(currentFlag);
      }

      currentFlag = !currentFlag;
    }

    for (var i = 0, ii = symbols.length; i < ii; i++) {
      if (flags[i]) {
        exportedSymbols.push(symbols[i]);
      }
    }

    for (var j = 0; j < numberOfNewSymbols; i++, j++) {
      if (flags[i]) {
        exportedSymbols.push(newSymbols[j]);
      }
    }

    return exportedSymbols;
  }

  function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, logStripSize, huffmanInput) {
    if (huffman && refinement) {
      throw new Jbig2Error('refinement with Huffman is not supported');
    }

    var bitmap = [];
    var i, row;

    for (i = 0; i < height; i++) {
      row = new Uint8Array(width);

      if (defaultPixelValue) {
        for (var j = 0; j < width; j++) {
          row[j] = defaultPixelValue;
        }
      }

      bitmap.push(row);
    }

    var decoder = decodingContext.decoder;
    var contextCache = decodingContext.contextCache;
    var stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) : -decodeInteger(contextCache, 'IADT', decoder);
    var firstS = 0;
    i = 0;

    while (i < numberOfSymbolInstances) {
      var deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) : decodeInteger(contextCache, 'IADT', decoder);
      stripT += deltaT;
      var deltaFirstS = huffman ? huffmanTables.tableFirstS.decode(huffmanInput) : decodeInteger(contextCache, 'IAFS', decoder);
      firstS += deltaFirstS;
      var currentS = firstS;

      do {
        var currentT = 0;

        if (stripSize > 1) {
          currentT = huffman ? huffmanInput.readBits(logStripSize) : decodeInteger(contextCache, 'IAIT', decoder);
        }

        var t = stripSize * stripT + currentT;
        var symbolId = huffman ? huffmanTables.symbolIDTable.decode(huffmanInput) : decodeIAID(contextCache, decoder, symbolCodeLength);
        var applyRefinement = refinement && (huffman ? huffmanInput.readBit() : decodeInteger(contextCache, 'IARI', decoder));
        var symbolBitmap = inputSymbols[symbolId];
        var symbolWidth = symbolBitmap[0].length;
        var symbolHeight = symbolBitmap.length;

        if (applyRefinement) {
          var rdw = decodeInteger(contextCache, 'IARDW', decoder);
          var rdh = decodeInteger(contextCache, 'IARDH', decoder);
          var rdx = decodeInteger(contextCache, 'IARDX', decoder);
          var rdy = decodeInteger(contextCache, 'IARDY', decoder);
          symbolWidth += rdw;
          symbolHeight += rdh;
          symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext);
        }

        var offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1);
        var offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0);
        var s2, t2, symbolRow;

        if (transposed) {
          for (s2 = 0; s2 < symbolHeight; s2++) {
            row = bitmap[offsetS + s2];

            if (!row) {
              continue;
            }

            symbolRow = symbolBitmap[s2];
            var maxWidth = Math.min(width - offsetT, symbolWidth);

            switch (combinationOperator) {
              case 0:
                for (t2 = 0; t2 < maxWidth; t2++) {
                  row[offsetT + t2] |= symbolRow[t2];
                }

                break;

              case 2:
                for (t2 = 0; t2 < maxWidth; t2++) {
                  row[offsetT + t2] ^= symbolRow[t2];
                }

                break;

              default:
                throw new Jbig2Error("operator ".concat(combinationOperator, " is not supported"));
            }
          }

          currentS += symbolHeight - 1;
        } else {
          for (t2 = 0; t2 < symbolHeight; t2++) {
            row = bitmap[offsetT + t2];

            if (!row) {
              continue;
            }

            symbolRow = symbolBitmap[t2];

            switch (combinationOperator) {
              case 0:
                for (s2 = 0; s2 < symbolWidth; s2++) {
                  row[offsetS + s2] |= symbolRow[s2];
                }

                break;

              case 2:
                for (s2 = 0; s2 < symbolWidth; s2++) {
                  row[offsetS + s2] ^= symbolRow[s2];
                }

                break;

              default:
                throw new Jbig2Error("operator ".concat(combinationOperator, " is not supported"));
            }
          }

          currentS += symbolWidth - 1;
        }

        i++;
        var deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) : decodeInteger(contextCache, 'IADS', decoder);

        if (deltaS === null) {
          break;
        }

        currentS += deltaS + dsOffset;
      } while (true);
    }

    return bitmap;
  }

  function decodePatternDictionary(mmr, patternWidth, patternHeight, maxPatternIndex, template, decodingContext) {
    var at = [];

    if (!mmr) {
      at.push({
        x: -patternWidth,
        y: 0
      });

      if (template === 0) {
        at.push({
          x: -3,
          y: -1
        });
        at.push({
          x: 2,
          y: -2
        });
        at.push({
          x: -2,
          y: -2
        });
      }
    }

    var collectiveWidth = (maxPatternIndex + 1) * patternWidth;
    var collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight, template, false, null, at, decodingContext);
    var patterns = [],
        i = 0,
        patternBitmap,
        xMin,
        xMax,
        y;

    while (i <= maxPatternIndex) {
      patternBitmap = [];
      xMin = patternWidth * i;
      xMax = xMin + patternWidth;

      for (y = 0; y < patternHeight; y++) {
        patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));
      }

      patterns.push(patternBitmap);
      i++;
    }

    return patterns;
  }

  function decodeHalftoneRegion(mmr, patterns, template, regionWidth, regionHeight, defaultPixelValue, enableSkip, combinationOperator, gridWidth, gridHeight, gridOffsetX, gridOffsetY, gridVectorX, gridVectorY, decodingContext) {
    var skip = null;

    if (enableSkip) {
      throw new Jbig2Error('skip is not supported');
    }

    if (combinationOperator !== 0) {
      throw new Jbig2Error('operator ' + combinationOperator + ' is not supported in halftone region');
    }

    var regionBitmap = [];
    var i, j, row;

    for (i = 0; i < regionHeight; i++) {
      row = new Uint8Array(regionWidth);

      if (defaultPixelValue) {
        for (j = 0; j < regionWidth; j++) {
          row[j] = defaultPixelValue;
        }
      }

      regionBitmap.push(row);
    }

    var numberOfPatterns = patterns.length;
    var pattern0 = patterns[0];
    var patternWidth = pattern0[0].length,
        patternHeight = pattern0.length;
    var bitsPerValue = (0, _util.log2)(numberOfPatterns);
    var at = [];

    if (!mmr) {
      at.push({
        x: template <= 1 ? 3 : 2,
        y: -1
      });

      if (template === 0) {
        at.push({
          x: -3,
          y: -1
        });
        at.push({
          x: 2,
          y: -2
        });
        at.push({
          x: -2,
          y: -2
        });
      }
    }

    var grayScaleBitPlanes = [],
        mmrInput,
        bitmap;

    if (mmr) {
      mmrInput = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);
    }

    for (i = bitsPerValue - 1; i >= 0; i--) {
      if (mmr) {
        bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true);
      } else {
        bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false, skip, at, decodingContext);
      }

      grayScaleBitPlanes[i] = bitmap;
    }

    var mg, ng, bit, patternIndex, patternBitmap, x, y, patternRow, regionRow;

    for (mg = 0; mg < gridHeight; mg++) {
      for (ng = 0; ng < gridWidth; ng++) {
        bit = 0;
        patternIndex = 0;

        for (j = bitsPerValue - 1; j >= 0; j--) {
          bit = grayScaleBitPlanes[j][mg][ng] ^ bit;
          patternIndex |= bit << j;
        }

        patternBitmap = patterns[patternIndex];
        x = gridOffsetX + mg * gridVectorY + ng * gridVectorX >> 8;
        y = gridOffsetY + mg * gridVectorX - ng * gridVectorY >> 8;

        if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 && y + patternHeight <= regionHeight) {
          for (i = 0; i < patternHeight; i++) {
            regionRow = regionBitmap[y + i];
            patternRow = patternBitmap[i];

            for (j = 0; j < patternWidth; j++) {
              regionRow[x + j] |= patternRow[j];
            }
          }
        } else {
          var regionX = void 0,
              regionY = void 0;

          for (i = 0; i < patternHeight; i++) {
            regionY = y + i;

            if (regionY < 0 || regionY >= regionHeight) {
              continue;
            }

            regionRow = regionBitmap[regionY];
            patternRow = patternBitmap[i];

            for (j = 0; j < patternWidth; j++) {
              regionX = x + j;

              if (regionX >= 0 && regionX < regionWidth) {
                regionRow[regionX] |= patternRow[j];
              }
            }
          }
        }
      }
    }

    return regionBitmap;
  }

  function readSegmentHeader(data, start) {
    var segmentHeader = {};
    segmentHeader.number = (0, _util.readUint32)(data, start);
    var flags = data[start + 4];
    var segmentType = flags & 0x3F;

    if (!SegmentTypes[segmentType]) {
      throw new Jbig2Error('invalid segment type: ' + segmentType);
    }

    segmentHeader.type = segmentType;
    segmentHeader.typeName = SegmentTypes[segmentType];
    segmentHeader.deferredNonRetain = !!(flags & 0x80);
    var pageAssociationFieldSize = !!(flags & 0x40);
    var referredFlags = data[start + 5];
    var referredToCount = referredFlags >> 5 & 7;
    var retainBits = [referredFlags & 31];
    var position = start + 6;

    if (referredFlags === 7) {
      referredToCount = (0, _util.readUint32)(data, position - 1) & 0x1FFFFFFF;
      position += 3;
      var bytes = referredToCount + 7 >> 3;
      retainBits[0] = data[position++];

      while (--bytes > 0) {
        retainBits.push(data[position++]);
      }
    } else if (referredFlags === 5 || referredFlags === 6) {
      throw new Jbig2Error('invalid referred-to flags');
    }

    segmentHeader.retainBits = retainBits;
    var referredToSegmentNumberSize = segmentHeader.number <= 256 ? 1 : segmentHeader.number <= 65536 ? 2 : 4;
    var referredTo = [];
    var i, ii;

    for (i = 0; i < referredToCount; i++) {
      var number = referredToSegmentNumberSize === 1 ? data[position] : referredToSegmentNumberSize === 2 ? (0, _util.readUint16)(data, position) : (0, _util.readUint32)(data, position);
      referredTo.push(number);
      position += referredToSegmentNumberSize;
    }

    segmentHeader.referredTo = referredTo;

    if (!pageAssociationFieldSize) {
      segmentHeader.pageAssociation = data[position++];
    } else {
      segmentHeader.pageAssociation = (0, _util.readUint32)(data, position);
      position += 4;
    }

    segmentHeader.length = (0, _util.readUint32)(data, position);
    position += 4;

    if (segmentHeader.length === 0xFFFFFFFF) {
      if (segmentType === 38) {
        var genericRegionInfo = readRegionSegmentInformation(data, position);
        var genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength];
        var genericRegionMmr = !!(genericRegionSegmentFlags & 1);
        var searchPatternLength = 6;
        var searchPattern = new Uint8Array(searchPatternLength);

        if (!genericRegionMmr) {
          searchPattern[0] = 0xFF;
          searchPattern[1] = 0xAC;
        }

        searchPattern[2] = genericRegionInfo.height >>> 24 & 0xFF;
        searchPattern[3] = genericRegionInfo.height >> 16 & 0xFF;
        searchPattern[4] = genericRegionInfo.height >> 8 & 0xFF;
        searchPattern[5] = genericRegionInfo.height & 0xFF;

        for (i = position, ii = data.length; i < ii; i++) {
          var j = 0;

          while (j < searchPatternLength && searchPattern[j] === data[i + j]) {
            j++;
          }

          if (j === searchPatternLength) {
            segmentHeader.length = i + searchPatternLength;
            break;
          }
        }

        if (segmentHeader.length === 0xFFFFFFFF) {
          throw new Jbig2Error('segment end was not found');
        }
      } else {
        throw new Jbig2Error('invalid unknown segment length');
      }
    }

    segmentHeader.headerEnd = position;
    return segmentHeader;
  }

  function readSegments(header, data, start, end) {
    var segments = [];
    var position = start;

    while (position < end) {
      var segmentHeader = readSegmentHeader(data, position);
      position = segmentHeader.headerEnd;
      var segment = {
        header: segmentHeader,
        data: data
      };

      if (!header.randomAccess) {
        segment.start = position;
        position += segmentHeader.length;
        segment.end = position;
      }

      segments.push(segment);

      if (segmentHeader.type === 51) {
        break;
      }
    }

    if (header.randomAccess) {
      for (var i = 0, ii = segments.length; i < ii; i++) {
        segments[i].start = position;
        position += segments[i].header.length;
        segments[i].end = position;
      }
    }

    return segments;
  }

  function readRegionSegmentInformation(data, start) {
    return {
      width: (0, _util.readUint32)(data, start),
      height: (0, _util.readUint32)(data, start + 4),
      x: (0, _util.readUint32)(data, start + 8),
      y: (0, _util.readUint32)(data, start + 12),
      combinationOperator: data[start + 16] & 7
    };
  }

  var RegionSegmentInformationFieldLength = 17;

  function processSegment(segment, visitor) {
    var header = segment.header;
    var data = segment.data,
        position = segment.start,
        end = segment.end;
    var args, at, i, atLength;

    switch (header.type) {
      case 0:
        var dictionary = {};
        var dictionaryFlags = (0, _util.readUint16)(data, position);
        dictionary.huffman = !!(dictionaryFlags & 1);
        dictionary.refinement = !!(dictionaryFlags & 2);
        dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3;
        dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3;
        dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1;
        dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1;
        dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);
        dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);
        dictionary.template = dictionaryFlags >> 10 & 3;
        dictionary.refinementTemplate = dictionaryFlags >> 12 & 1;
        position += 2;

        if (!dictionary.huffman) {
          atLength = dictionary.template === 0 ? 4 : 1;
          at = [];

          for (i = 0; i < atLength; i++) {
            at.push({
              x: (0, _util.readInt8)(data, position),
              y: (0, _util.readInt8)(data, position + 1)
            });
            position += 2;
          }

          dictionary.at = at;
        }

        if (dictionary.refinement && !dictionary.refinementTemplate) {
          at = [];

          for (i = 0; i < 2; i++) {
            at.push({
              x: (0, _util.readInt8)(data, position),
              y: (0, _util.readInt8)(data, position + 1)
            });
            position += 2;
          }

          dictionary.refinementAt = at;
        }

        dictionary.numberOfExportedSymbols = (0, _util.readUint32)(data, position);
        position += 4;
        dictionary.numberOfNewSymbols = (0, _util.readUint32)(data, position);
        position += 4;
        args = [dictionary, header.number, header.referredTo, data, position, end];
        break;

      case 6:
      case 7:
        var textRegion = {};
        textRegion.info = readRegionSegmentInformation(data, position);
        position += RegionSegmentInformationFieldLength;
        var textRegionSegmentFlags = (0, _util.readUint16)(data, position);
        position += 2;
        textRegion.huffman = !!(textRegionSegmentFlags & 1);
        textRegion.refinement = !!(textRegionSegmentFlags & 2);
        textRegion.logStripSize = textRegionSegmentFlags >> 2 & 3;
        textRegion.stripSize = 1 << textRegion.logStripSize;
        textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3;
        textRegion.transposed = !!(textRegionSegmentFlags & 64);
        textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3;
        textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1;
        textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27;
        textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1;

        if (textRegion.huffman) {
          var textRegionHuffmanFlags = (0, _util.readUint16)(data, position);
          position += 2;
          textRegion.huffmanFS = textRegionHuffmanFlags & 3;
          textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3;
          textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3;
          textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3;
          textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3;
          textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3;
          textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3;
          textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 0x4000);
        }

        if (textRegion.refinement && !textRegion.refinementTemplate) {
          at = [];

          for (i = 0; i < 2; i++) {
            at.push({
              x: (0, _util.readInt8)(data, position),
              y: (0, _util.readInt8)(data, position + 1)
            });
            position += 2;
          }

          textRegion.refinementAt = at;
        }

        textRegion.numberOfSymbolInstances = (0, _util.readUint32)(data, position);
        position += 4;
        args = [textRegion, header.referredTo, data, position, end];
        break;

      case 16:
        var patternDictionary = {};
        var patternDictionaryFlags = data[position++];
        patternDictionary.mmr = !!(patternDictionaryFlags & 1);
        patternDictionary.template = patternDictionaryFlags >> 1 & 3;
        patternDictionary.patternWidth = data[position++];
        patternDictionary.patternHeight = data[position++];
        patternDictionary.maxPatternIndex = (0, _util.readUint32)(data, position);
        position += 4;
        args = [patternDictionary, header.number, data, position, end];
        break;

      case 22:
      case 23:
        var halftoneRegion = {};
        halftoneRegion.info = readRegionSegmentInformation(data, position);
        position += RegionSegmentInformationFieldLength;
        var halftoneRegionFlags = data[position++];
        halftoneRegion.mmr = !!(halftoneRegionFlags & 1);
        halftoneRegion.template = halftoneRegionFlags >> 1 & 3;
        halftoneRegion.enableSkip = !!(halftoneRegionFlags & 8);
        halftoneRegion.combinationOperator = halftoneRegionFlags >> 4 & 7;
        halftoneRegion.defaultPixelValue = halftoneRegionFlags >> 7 & 1;
        halftoneRegion.gridWidth = (0, _util.readUint32)(data, position);
        position += 4;
        halftoneRegion.gridHeight = (0, _util.readUint32)(data, position);
        position += 4;
        halftoneRegion.gridOffsetX = (0, _util.readUint32)(data, position) & 0xFFFFFFFF;
        position += 4;
        halftoneRegion.gridOffsetY = (0, _util.readUint32)(data, position) & 0xFFFFFFFF;
        position += 4;
        halftoneRegion.gridVectorX = (0, _util.readUint16)(data, position);
        position += 2;
        halftoneRegion.gridVectorY = (0, _util.readUint16)(data, position);
        position += 2;
        args = [halftoneRegion, header.referredTo, data, position, end];
        break;

      case 38:
      case 39:
        var genericRegion = {};
        genericRegion.info = readRegionSegmentInformation(data, position);
        position += RegionSegmentInformationFieldLength;
        var genericRegionSegmentFlags = data[position++];
        genericRegion.mmr = !!(genericRegionSegmentFlags & 1);
        genericRegion.template = genericRegionSegmentFlags >> 1 & 3;
        genericRegion.prediction = !!(genericRegionSegmentFlags & 8);

        if (!genericRegion.mmr) {
          atLength = genericRegion.template === 0 ? 4 : 1;
          at = [];

          for (i = 0; i < atLength; i++) {
            at.push({
              x: (0, _util.readInt8)(data, position),
              y: (0, _util.readInt8)(data, position + 1)
            });
            position += 2;
          }

          genericRegion.at = at;
        }

        args = [genericRegion, data, position, end];
        break;

      case 48:
        var pageInfo = {
          width: (0, _util.readUint32)(data, position),
          height: (0, _util.readUint32)(data, position + 4),
          resolutionX: (0, _util.readUint32)(data, position + 8),
          resolutionY: (0, _util.readUint32)(data, position + 12)
        };

        if (pageInfo.height === 0xFFFFFFFF) {
          delete pageInfo.height;
        }

        var pageSegmentFlags = data[position + 16];
        (0, _util.readUint16)(data, position + 17);
        pageInfo.lossless = !!(pageSegmentFlags & 1);
        pageInfo.refinement = !!(pageSegmentFlags & 2);
        pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1;
        pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3;
        pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);
        pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);
        args = [pageInfo];
        break;

      case 49:
        break;

      case 50:
        break;

      case 51:
        break;

      case 53:
        args = [header.number, data, position, end];
        break;

      case 62:
        break;

      default:
        throw new Jbig2Error("segment type ".concat(header.typeName, "(").concat(header.type, ")") + ' is not implemented');
    }

    var callbackName = 'on' + header.typeName;

    if (callbackName in visitor) {
      visitor[callbackName].apply(visitor, args);
    }
  }

  function processSegments(segments, visitor) {
    for (var i = 0, ii = segments.length; i < ii; i++) {
      processSegment(segments[i], visitor);
    }
  }

  function parseJbig2Chunks(chunks) {
    var visitor = new SimpleSegmentVisitor();

    for (var i = 0, ii = chunks.length; i < ii; i++) {
      var chunk = chunks[i];
      var segments = readSegments({}, chunk.data, chunk.start, chunk.end);
      processSegments(segments, visitor);
    }

    return visitor.buffer;
  }

  function parseJbig2(data) {
    var position = 0,
        end = data.length;

    if (data[position] !== 0x97 || data[position + 1] !== 0x4A || data[position + 2] !== 0x42 || data[position + 3] !== 0x32 || data[position + 4] !== 0x0D || data[position + 5] !== 0x0A || data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) {
      throw new Jbig2Error('parseJbig2 - invalid header.');
    }

    var header = Object.create(null);
    position += 8;
    var flags = data[position++];
    header.randomAccess = !(flags & 1);

    if (!(flags & 2)) {
      header.numberOfPages = (0, _util.readUint32)(data, position);
      position += 4;
    }

    var segments = readSegments(header, data, position, end);
    var visitor = new SimpleSegmentVisitor();
    processSegments(segments, visitor);
    var _visitor$currentPageI = visitor.currentPageInfo,
        width = _visitor$currentPageI.width,
        height = _visitor$currentPageI.height;
    var bitPacked = visitor.buffer;
    var imgData = new Uint8ClampedArray(width * height);
    var q = 0,
        k = 0;

    for (var i = 0; i < height; i++) {
      var mask = 0,
          buffer = void 0;

      for (var j = 0; j < width; j++) {
        if (!mask) {
          mask = 128;
          buffer = bitPacked[k++];
        }

        imgData[q++] = buffer & mask ? 0 : 255;
        mask >>= 1;
      }
    }

    return {
      imgData: imgData,
      width: width,
      height: height
    };
  }

  function SimpleSegmentVisitor() {}

  SimpleSegmentVisitor.prototype = {
    onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {
      this.currentPageInfo = info;
      var rowSize = info.width + 7 >> 3;
      var buffer = new Uint8ClampedArray(rowSize * info.height);

      if (info.defaultPixelValue) {
        for (var i = 0, ii = buffer.length; i < ii; i++) {
          buffer[i] = 0xFF;
        }
      }

      this.buffer = buffer;
    },
    drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {
      var pageInfo = this.currentPageInfo;
      var width = regionInfo.width,
          height = regionInfo.height;
      var rowSize = pageInfo.width + 7 >> 3;
      var combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator;
      var buffer = this.buffer;
      var mask0 = 128 >> (regionInfo.x & 7);
      var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);
      var i, j, mask, offset;

      switch (combinationOperator) {
        case 0:
          for (i = 0; i < height; i++) {
            mask = mask0;
            offset = offset0;

            for (j = 0; j < width; j++) {
              if (bitmap[i][j]) {
                buffer[offset] |= mask;
              }

              mask >>= 1;

              if (!mask) {
                mask = 128;
                offset++;
              }
            }

            offset0 += rowSize;
          }

          break;

        case 2:
          for (i = 0; i < height; i++) {
            mask = mask0;
            offset = offset0;

            for (j = 0; j < width; j++) {
              if (bitmap[i][j]) {
                buffer[offset] ^= mask;
              }

              mask >>= 1;

              if (!mask) {
                mask = 128;
                offset++;
              }
            }

            offset0 += rowSize;
          }

          break;

        default:
          throw new Jbig2Error("operator ".concat(combinationOperator, " is not supported"));
      }
    },
    onImmediateGenericRegion: function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, start, end) {
      var regionInfo = region.info;
      var decodingContext = new DecodingContext(data, start, end);
      var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext);
      this.drawBitmap(regionInfo, bitmap);
    },
    onImmediateLosslessGenericRegion: function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() {
      this.onImmediateGenericRegion.apply(this, arguments);
    },
    onSymbolDictionary: function SimpleSegmentVisitor_onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) {
      var huffmanTables, huffmanInput;

      if (dictionary.huffman) {
        huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables);
        huffmanInput = new Reader(data, start, end);
      }

      var symbols = this.symbols;

      if (!symbols) {
        this.symbols = symbols = {};
      }

      var inputSymbols = [];

      for (var i = 0, ii = referredSegments.length; i < ii; i++) {
        var referredSymbols = symbols[referredSegments[i]];

        if (referredSymbols) {
          inputSymbols = inputSymbols.concat(referredSymbols);
        }
      }

      var decodingContext = new DecodingContext(data, start, end);
      symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, huffmanInput);
    },
    onImmediateTextRegion: function SimpleSegmentVisitor_onImmediateTextRegion(region, referredSegments, data, start, end) {
      var regionInfo = region.info;
      var huffmanTables, huffmanInput;
      var symbols = this.symbols;
      var inputSymbols = [];

      for (var i = 0, ii = referredSegments.length; i < ii; i++) {
        var referredSymbols = symbols[referredSegments[i]];

        if (referredSymbols) {
          inputSymbols = inputSymbols.concat(referredSymbols);
        }
      }

      var symbolCodeLength = (0, _util.log2)(inputSymbols.length);

      if (region.huffman) {
        huffmanInput = new Reader(data, start, end);
        huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, inputSymbols.length, huffmanInput);
      }

      var decodingContext = new DecodingContext(data, start, end);
      var bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext, region.logStripSize, huffmanInput);
      this.drawBitmap(regionInfo, bitmap);
    },
    onImmediateLosslessTextRegion: function SimpleSegmentVisitor_onImmediateLosslessTextRegion() {
      this.onImmediateTextRegion.apply(this, arguments);
    },
    onPatternDictionary: function onPatternDictionary(dictionary, currentSegment, data, start, end) {
      var patterns = this.patterns;

      if (!patterns) {
        this.patterns = patterns = {};
      }

      var decodingContext = new DecodingContext(data, start, end);
      patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext);
    },
    onImmediateHalftoneRegion: function onImmediateHalftoneRegion(region, referredSegments, data, start, end) {
      var patterns = this.patterns[referredSegments[0]];
      var regionInfo = region.info;
      var decodingContext = new DecodingContext(data, start, end);
      var bitmap = decodeHalftoneRegion(region.mmr, patterns, region.template, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.enableSkip, region.combinationOperator, region.gridWidth, region.gridHeight, region.gridOffsetX, region.gridOffsetY, region.gridVectorX, region.gridVectorY, decodingContext);
      this.drawBitmap(regionInfo, bitmap);
    },
    onImmediateLosslessHalftoneRegion: function onImmediateLosslessHalftoneRegion() {
      this.onImmediateHalftoneRegion.apply(this, arguments);
    },
    onTables: function onTables(currentSegment, data, start, end) {
      var customTables = this.customTables;

      if (!customTables) {
        this.customTables = customTables = {};
      }

      customTables[currentSegment] = decodeTablesSegment(data, start, end);
    }
  };

  function HuffmanLine(lineData) {
    if (lineData.length === 2) {
      this.isOOB = true;
      this.rangeLow = 0;
      this.prefixLength = lineData[0];
      this.rangeLength = 0;
      this.prefixCode = lineData[1];
      this.isLowerRange = false;
    } else {
      this.isOOB = false;
      this.rangeLow = lineData[0];
      this.prefixLength = lineData[1];
      this.rangeLength = lineData[2];
      this.prefixCode = lineData[3];
      this.isLowerRange = lineData[4] === 'lower';
    }
  }

  function HuffmanTreeNode(line) {
    this.children = [];

    if (line) {
      this.isLeaf = true;
      this.rangeLength = line.rangeLength;
      this.rangeLow = line.rangeLow;
      this.isLowerRange = line.isLowerRange;
      this.isOOB = line.isOOB;
    } else {
      this.isLeaf = false;
    }
  }

  HuffmanTreeNode.prototype = {
    buildTree: function buildTree(line, shift) {
      var bit = line.prefixCode >> shift & 1;

      if (shift <= 0) {
        this.children[bit] = new HuffmanTreeNode(line);
      } else {
        var node = this.children[bit];

        if (!node) {
          this.children[bit] = node = new HuffmanTreeNode(null);
        }

        node.buildTree(line, shift - 1);
      }
    },
    decodeNode: function decodeNode(reader) {
      if (this.isLeaf) {
        if (this.isOOB) {
          return null;
        }

        var htOffset = reader.readBits(this.rangeLength);
        return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset);
      }

      var node = this.children[reader.readBit()];

      if (!node) {
        throw new Jbig2Error('invalid Huffman data');
      }

      return node.decodeNode(reader);
    }
  };

  function HuffmanTable(lines, prefixCodesDone) {
    if (!prefixCodesDone) {
      this.assignPrefixCodes(lines);
    }

    this.rootNode = new HuffmanTreeNode(null);
    var i,
        ii = lines.length,
        line;

    for (i = 0; i < ii; i++) {
      line = lines[i];

      if (line.prefixLength > 0) {
        this.rootNode.buildTree(line, line.prefixLength - 1);
      }
    }
  }

  HuffmanTable.prototype = {
    decode: function decode(reader) {
      return this.rootNode.decodeNode(reader);
    },
    assignPrefixCodes: function assignPrefixCodes(lines) {
      var linesLength = lines.length,
          prefixLengthMax = 0,
          i;

      for (i = 0; i < linesLength; i++) {
        prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength);
      }

      var histogram = new Uint32Array(prefixLengthMax + 1);

      for (i = 0; i < linesLength; i++) {
        histogram[lines[i].prefixLength]++;
      }

      var currentLength = 1,
          firstCode = 0,
          currentCode,
          currentTemp,
          line;
      histogram[0] = 0;

      while (currentLength <= prefixLengthMax) {
        firstCode = firstCode + histogram[currentLength - 1] << 1;
        currentCode = firstCode;
        currentTemp = 0;

        while (currentTemp < linesLength) {
          line = lines[currentTemp];

          if (line.prefixLength === currentLength) {
            line.prefixCode = currentCode;
            currentCode++;
          }

          currentTemp++;
        }

        currentLength++;
      }
    }
  };

  function decodeTablesSegment(data, start, end) {
    var flags = data[start];
    var lowestValue = (0, _util.readUint32)(data, start + 1) & 0xFFFFFFFF;
    var highestValue = (0, _util.readUint32)(data, start + 5) & 0xFFFFFFFF;
    var reader = new Reader(data, start + 9, end);
    var prefixSizeBits = (flags >> 1 & 7) + 1;
    var rangeSizeBits = (flags >> 4 & 7) + 1;
    var lines = [];
    var prefixLength,
        rangeLength,
        currentRangeLow = lowestValue;

    do {
      prefixLength = reader.readBits(prefixSizeBits);
      rangeLength = reader.readBits(rangeSizeBits);
      lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0]));
      currentRangeLow += 1 << rangeLength;
    } while (currentRangeLow < highestValue);

    prefixLength = reader.readBits(prefixSizeBits);
    lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, 'lower']));
    prefixLength = reader.readBits(prefixSizeBits);
    lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0]));

    if (flags & 1) {
      prefixLength = reader.readBits(prefixSizeBits);
      lines.push(new HuffmanLine([prefixLength, 0]));
    }

    return new HuffmanTable(lines, false);
  }

  var standardTablesCache = {};

  function getStandardTable(number) {
    var table = standardTablesCache[number];

    if (table) {
      return table;
    }

    var lines;

    switch (number) {
      case 1:
        lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]];
        break;

      case 2:
        lines = [[0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xE], [11, 5, 6, 0x1E], [75, 6, 32, 0x3E], [6, 0x3F]];
        break;

      case 3:
        lines = [[-256, 8, 8, 0xFE], [0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xE], [11, 5, 6, 0x1E], [-257, 8, 32, 0xFF, 'lower'], [75, 7, 32, 0x7E], [6, 0x3E]];
        break;

      case 4:
        lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xE], [12, 5, 6, 0x1E], [76, 5, 32, 0x1F]];
        break;

      case 5:
        lines = [[-255, 7, 8, 0x7E], [1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xE], [12, 5, 6, 0x1E], [-256, 7, 32, 0x7F, 'lower'], [76, 6, 32, 0x3E]];
        break;

      case 6:
        lines = [[-2048, 5, 10, 0x1C], [-1024, 4, 9, 0x8], [-512, 4, 8, 0x9], [-256, 4, 7, 0xA], [-128, 5, 6, 0x1D], [-64, 5, 5, 0x1E], [-32, 4, 5, 0xB], [0, 2, 7, 0x0], [128, 3, 7, 0x2], [256, 3, 8, 0x3], [512, 4, 9, 0xC], [1024, 4, 10, 0xD], [-2049, 6, 32, 0x3E, 'lower'], [2048, 6, 32, 0x3F]];
        break;

      case 7:
        lines = [[-1024, 4, 9, 0x8], [-512, 3, 8, 0x0], [-256, 4, 7, 0x9], [-128, 5, 6, 0x1A], [-64, 5, 5, 0x1B], [-32, 4, 5, 0xA], [0, 4, 5, 0xB], [32, 5, 5, 0x1C], [64, 5, 6, 0x1D], [128, 4, 7, 0xC], [256, 3, 8, 0x1], [512, 3, 9, 0x2], [1024, 3, 10, 0x3], [-1025, 5, 32, 0x1E, 'lower'], [2048, 5, 32, 0x1F]];
        break;

      case 8:
        lines = [[-15, 8, 3, 0xFC], [-7, 9, 1, 0x1FC], [-5, 8, 1, 0xFD], [-3, 9, 0, 0x1FD], [-2, 7, 0, 0x7C], [-1, 4, 0, 0xA], [0, 2, 1, 0x0], [2, 5, 0, 0x1A], [3, 6, 0, 0x3A], [4, 3, 4, 0x4], [20, 6, 1, 0x3B], [22, 4, 4, 0xB], [38, 4, 5, 0xC], [70, 5, 6, 0x1B], [134, 5, 7, 0x1C], [262, 6, 7, 0x3C], [390, 7, 8, 0x7D], [646, 6, 10, 0x3D], [-16, 9, 32, 0x1FE, 'lower'], [1670, 9, 32, 0x1FF], [2, 0x1]];
        break;

      case 9:
        lines = [[-31, 8, 4, 0xFC], [-15, 9, 2, 0x1FC], [-11, 8, 2, 0xFD], [-7, 9, 1, 0x1FD], [-5, 7, 1, 0x7C], [-3, 4, 1, 0xA], [-1, 3, 1, 0x2], [1, 3, 1, 0x3], [3, 5, 1, 0x1A], [5, 6, 1, 0x3A], [7, 3, 5, 0x4], [39, 6, 2, 0x3B], [43, 4, 5, 0xB], [75, 4, 6, 0xC], [139, 5, 7, 0x1B], [267, 5, 8, 0x1C], [523, 6, 8, 0x3C], [779, 7, 9, 0x7D], [1291, 6, 11, 0x3D], [-32, 9, 32, 0x1FE, 'lower'], [3339, 9, 32, 0x1FF], [2, 0x0]];
        break;

      case 10:
        lines = [[-21, 7, 4, 0x7A], [-5, 8, 0, 0xFC], [-4, 7, 0, 0x7B], [-3, 5, 0, 0x18], [-2, 2, 2, 0x0], [2, 5, 0, 0x19], [3, 6, 0, 0x36], [4, 7, 0, 0x7C], [5, 8, 0, 0xFD], [6, 2, 6, 0x1], [70, 5, 5, 0x1A], [102, 6, 5, 0x37], [134, 6, 6, 0x38], [198, 6, 7, 0x39], [326, 6, 8, 0x3A], [582, 6, 9, 0x3B], [1094, 6, 10, 0x3C], [2118, 7, 11, 0x7D], [-22, 8, 32, 0xFE, 'lower'], [4166, 8, 32, 0xFF], [2, 0x2]];
        break;

      case 11:
        lines = [[1, 1, 0, 0x0], [2, 2, 1, 0x2], [4, 4, 0, 0xC], [5, 4, 1, 0xD], [7, 5, 1, 0x1C], [9, 5, 2, 0x1D], [13, 6, 2, 0x3C], [17, 7, 2, 0x7A], [21, 7, 3, 0x7B], [29, 7, 4, 0x7C], [45, 7, 5, 0x7D], [77, 7, 6, 0x7E], [141, 7, 32, 0x7F]];
        break;

      case 12:
        lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 1, 0x6], [5, 5, 0, 0x1C], [6, 5, 1, 0x1D], [8, 6, 1, 0x3C], [10, 7, 0, 0x7A], [11, 7, 1, 0x7B], [13, 7, 2, 0x7C], [17, 7, 3, 0x7D], [25, 7, 4, 0x7E], [41, 8, 5, 0xFE], [73, 8, 32, 0xFF]];
        break;

      case 13:
        lines = [[1, 1, 0, 0x0], [2, 3, 0, 0x4], [3, 4, 0, 0xC], [4, 5, 0, 0x1C], [5, 4, 1, 0xD], [7, 3, 3, 0x5], [15, 6, 1, 0x3A], [17, 6, 2, 0x3B], [21, 6, 3, 0x3C], [29, 6, 4, 0x3D], [45, 6, 5, 0x3E], [77, 7, 6, 0x7E], [141, 7, 32, 0x7F]];
        break;

      case 14:
        lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]];
        break;

      case 15:
        lines = [[-24, 7, 4, 0x7C], [-8, 6, 2, 0x3C], [-4, 5, 1, 0x1C], [-2, 4, 0, 0xC], [-1, 3, 0, 0x4], [0, 1, 0, 0x0], [1, 3, 0, 0x5], [2, 4, 0, 0xD], [3, 5, 1, 0x1D], [5, 6, 2, 0x3D], [9, 7, 4, 0x7D], [-25, 7, 32, 0x7E, 'lower'], [25, 7, 32, 0x7F]];
        break;

      default:
        throw new Jbig2Error("standard table B.".concat(number, " does not exist"));
    }

    var length = lines.length,
        i;

    for (i = 0; i < length; i++) {
      lines[i] = new HuffmanLine(lines[i]);
    }

    table = new HuffmanTable(lines, true);
    standardTablesCache[number] = table;
    return table;
  }

  function Reader(data, start, end) {
    this.data = data;
    this.start = start;
    this.end = end;
    this.position = start;
    this.shift = -1;
    this.currentByte = 0;
  }

  Reader.prototype = {
    readBit: function readBit() {
      if (this.shift < 0) {
        if (this.position >= this.end) {
          throw new Jbig2Error('end of data while reading bit');
        }

        this.currentByte = this.data[this.position++];
        this.shift = 7;
      }

      var bit = this.currentByte >> this.shift & 1;
      this.shift--;
      return bit;
    },
    readBits: function readBits(numBits) {
      var result = 0,
          i;

      for (i = numBits - 1; i >= 0; i--) {
        result |= this.readBit() << i;
      }

      return result;
    },
    byteAlign: function byteAlign() {
      this.shift = -1;
    },
    next: function next() {
      if (this.position >= this.end) {
        return -1;
      }

      return this.data[this.position++];
    }
  };

  function getCustomHuffmanTable(index, referredTo, customTables) {
    var currentIndex = 0,
        i,
        ii = referredTo.length,
        table;

    for (i = 0; i < ii; i++) {
      table = customTables[referredTo[i]];

      if (table) {
        if (index === currentIndex) {
          return table;
        }

        currentIndex++;
      }
    }

    throw new Jbig2Error('can\'t find custom Huffman table');
  }

  function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) {
    var codes = [],
        i,
        codeLength;

    for (i = 0; i <= 34; i++) {
      codeLength = reader.readBits(4);
      codes.push(new HuffmanLine([i, codeLength, 0, 0]));
    }

    var runCodesTable = new HuffmanTable(codes, false);
    codes.length = 0;

    for (i = 0; i < numberOfSymbols;) {
      codeLength = runCodesTable.decode(reader);

      if (codeLength >= 32) {
        var repeatedLength = void 0,
            numberOfRepeats = void 0,
            j = void 0;

        switch (codeLength) {
          case 32:
            if (i === 0) {
              throw new Jbig2Error('no previous value in symbol ID table');
            }

            numberOfRepeats = reader.readBits(2) + 3;
            repeatedLength = codes[i - 1].prefixLength;
            break;

          case 33:
            numberOfRepeats = reader.readBits(3) + 3;
            repeatedLength = 0;
            break;

          case 34:
            numberOfRepeats = reader.readBits(7) + 11;
            repeatedLength = 0;
            break;

          default:
            throw new Jbig2Error('invalid code length in symbol ID table');
        }

        for (j = 0; j < numberOfRepeats; j++) {
          codes.push(new HuffmanLine([i, repeatedLength, 0, 0]));
          i++;
        }
      } else {
        codes.push(new HuffmanLine([i, codeLength, 0, 0]));
        i++;
      }
    }

    reader.byteAlign();
    var symbolIDTable = new HuffmanTable(codes, false);
    var customIndex = 0,
        tableFirstS,
        tableDeltaS,
        tableDeltaT;

    switch (textRegion.huffmanFS) {
      case 0:
      case 1:
        tableFirstS = getStandardTable(textRegion.huffmanFS + 6);
        break;

      case 3:
        tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables);
        customIndex++;
        break;

      default:
        throw new Jbig2Error('invalid Huffman FS selector');
    }

    switch (textRegion.huffmanDS) {
      case 0:
      case 1:
      case 2:
        tableDeltaS = getStandardTable(textRegion.huffmanDS + 8);
        break;

      case 3:
        tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables);
        customIndex++;
        break;

      default:
        throw new Jbig2Error('invalid Huffman DS selector');
    }

    switch (textRegion.huffmanDT) {
      case 0:
      case 1:
      case 2:
        tableDeltaT = getStandardTable(textRegion.huffmanDT + 11);
        break;

      case 3:
        tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables);
        customIndex++;
        break;

      default:
        throw new Jbig2Error('invalid Huffman DT selector');
    }

    if (textRegion.refinement) {
      throw new Jbig2Error('refinement with Huffman is not supported');
    }

    return {
      symbolIDTable: symbolIDTable,
      tableFirstS: tableFirstS,
      tableDeltaS: tableDeltaS,
      tableDeltaT: tableDeltaT
    };
  }

  function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) {
    var customIndex = 0,
        tableDeltaHeight,
        tableDeltaWidth;

    switch (dictionary.huffmanDHSelector) {
      case 0:
      case 1:
        tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4);
        break;

      case 3:
        tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables);
        customIndex++;
        break;

      default:
        throw new Jbig2Error('invalid Huffman DH selector');
    }

    switch (dictionary.huffmanDWSelector) {
      case 0:
      case 1:
        tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2);
        break;

      case 3:
        tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables);
        customIndex++;
        break;

      default:
        throw new Jbig2Error('invalid Huffman DW selector');
    }

    var tableBitmapSize, tableAggregateInstances;

    if (dictionary.bitmapSizeSelector) {
      tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables);
      customIndex++;
    } else {
      tableBitmapSize = getStandardTable(1);
    }

    if (dictionary.aggregationInstancesSelector) {
      tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables);
    } else {
      tableAggregateInstances = getStandardTable(1);
    }

    return {
      tableDeltaHeight: tableDeltaHeight,
      tableDeltaWidth: tableDeltaWidth,
      tableBitmapSize: tableBitmapSize,
      tableAggregateInstances: tableAggregateInstances
    };
  }

  function readUncompressedBitmap(reader, width, height) {
    var bitmap = [],
        x,
        y,
        row;

    for (y = 0; y < height; y++) {
      row = new Uint8Array(width);
      bitmap.push(row);

      for (x = 0; x < width; x++) {
        row[x] = reader.readBit();
      }

      reader.byteAlign();
    }

    return bitmap;
  }

  function decodeMMRBitmap(input, width, height, endOfBlock) {
    var params = {
      K: -1,
      Columns: width,
      Rows: height,
      BlackIs1: true,
      EndOfBlock: endOfBlock
    };
    var decoder = new _ccitt.CCITTFaxDecoder(input, params);
    var bitmap = [],
        x,
        y,
        row,
        currentByte,
        shift,
        eof = false;

    for (y = 0; y < height; y++) {
      row = new Uint8Array(width);
      bitmap.push(row);
      shift = -1;

      for (x = 0; x < width; x++) {
        if (shift < 0) {
          currentByte = decoder.readNextChar();

          if (currentByte === -1) {
            currentByte = 0;
            eof = true;
          }

          shift = 7;
        }

        row[x] = currentByte >> shift & 1;
        shift--;
      }
    }

    if (endOfBlock && !eof) {
      var lookForEOFLimit = 5;

      for (var i = 0; i < lookForEOFLimit; i++) {
        if (decoder.readNextChar() === -1) {
          break;
        }
      }
    }

    return bitmap;
  }

  function Jbig2Image() {}

  Jbig2Image.prototype = {
    parseChunks: function parseChunks(chunks) {
      return parseJbig2Chunks(chunks);
    },
    parse: function parse(data) {
      var _parseJbig = parseJbig2(data),
          imgData = _parseJbig.imgData,
          width = _parseJbig.width,
          height = _parseJbig.height;

      this.width = width;
      this.height = height;
      return imgData;
    }
  };
  return Jbig2Image;
}();

exports.Jbig2Image = Jbig2Image;

/***/ }),
/* 162 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ArithmeticDecoder = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var QeTable = [{
  qe: 0x5601,
  nmps: 1,
  nlps: 1,
  switchFlag: 1
}, {
  qe: 0x3401,
  nmps: 2,
  nlps: 6,
  switchFlag: 0
}, {
  qe: 0x1801,
  nmps: 3,
  nlps: 9,
  switchFlag: 0
}, {
  qe: 0x0AC1,
  nmps: 4,
  nlps: 12,
  switchFlag: 0
}, {
  qe: 0x0521,
  nmps: 5,
  nlps: 29,
  switchFlag: 0
}, {
  qe: 0x0221,
  nmps: 38,
  nlps: 33,
  switchFlag: 0
}, {
  qe: 0x5601,
  nmps: 7,
  nlps: 6,
  switchFlag: 1
}, {
  qe: 0x5401,
  nmps: 8,
  nlps: 14,
  switchFlag: 0
}, {
  qe: 0x4801,
  nmps: 9,
  nlps: 14,
  switchFlag: 0
}, {
  qe: 0x3801,
  nmps: 10,
  nlps: 14,
  switchFlag: 0
}, {
  qe: 0x3001,
  nmps: 11,
  nlps: 17,
  switchFlag: 0
}, {
  qe: 0x2401,
  nmps: 12,
  nlps: 18,
  switchFlag: 0
}, {
  qe: 0x1C01,
  nmps: 13,
  nlps: 20,
  switchFlag: 0
}, {
  qe: 0x1601,
  nmps: 29,
  nlps: 21,
  switchFlag: 0
}, {
  qe: 0x5601,
  nmps: 15,
  nlps: 14,
  switchFlag: 1
}, {
  qe: 0x5401,
  nmps: 16,
  nlps: 14,
  switchFlag: 0
}, {
  qe: 0x5101,
  nmps: 17,
  nlps: 15,
  switchFlag: 0
}, {
  qe: 0x4801,
  nmps: 18,
  nlps: 16,
  switchFlag: 0
}, {
  qe: 0x3801,
  nmps: 19,
  nlps: 17,
  switchFlag: 0
}, {
  qe: 0x3401,
  nmps: 20,
  nlps: 18,
  switchFlag: 0
}, {
  qe: 0x3001,
  nmps: 21,
  nlps: 19,
  switchFlag: 0
}, {
  qe: 0x2801,
  nmps: 22,
  nlps: 19,
  switchFlag: 0
}, {
  qe: 0x2401,
  nmps: 23,
  nlps: 20,
  switchFlag: 0
}, {
  qe: 0x2201,
  nmps: 24,
  nlps: 21,
  switchFlag: 0
}, {
  qe: 0x1C01,
  nmps: 25,
  nlps: 22,
  switchFlag: 0
}, {
  qe: 0x1801,
  nmps: 26,
  nlps: 23,
  switchFlag: 0
}, {
  qe: 0x1601,
  nmps: 27,
  nlps: 24,
  switchFlag: 0
}, {
  qe: 0x1401,
  nmps: 28,
  nlps: 25,
  switchFlag: 0
}, {
  qe: 0x1201,
  nmps: 29,
  nlps: 26,
  switchFlag: 0
}, {
  qe: 0x1101,
  nmps: 30,
  nlps: 27,
  switchFlag: 0
}, {
  qe: 0x0AC1,
  nmps: 31,
  nlps: 28,
  switchFlag: 0
}, {
  qe: 0x09C1,
  nmps: 32,
  nlps: 29,
  switchFlag: 0
}, {
  qe: 0x08A1,
  nmps: 33,
  nlps: 30,
  switchFlag: 0
}, {
  qe: 0x0521,
  nmps: 34,
  nlps: 31,
  switchFlag: 0
}, {
  qe: 0x0441,
  nmps: 35,
  nlps: 32,
  switchFlag: 0
}, {
  qe: 0x02A1,
  nmps: 36,
  nlps: 33,
  switchFlag: 0
}, {
  qe: 0x0221,
  nmps: 37,
  nlps: 34,
  switchFlag: 0
}, {
  qe: 0x0141,
  nmps: 38,
  nlps: 35,
  switchFlag: 0
}, {
  qe: 0x0111,
  nmps: 39,
  nlps: 36,
  switchFlag: 0
}, {
  qe: 0x0085,
  nmps: 40,
  nlps: 37,
  switchFlag: 0
}, {
  qe: 0x0049,
  nmps: 41,
  nlps: 38,
  switchFlag: 0
}, {
  qe: 0x0025,
  nmps: 42,
  nlps: 39,
  switchFlag: 0
}, {
  qe: 0x0015,
  nmps: 43,
  nlps: 40,
  switchFlag: 0
}, {
  qe: 0x0009,
  nmps: 44,
  nlps: 41,
  switchFlag: 0
}, {
  qe: 0x0005,
  nmps: 45,
  nlps: 42,
  switchFlag: 0
}, {
  qe: 0x0001,
  nmps: 45,
  nlps: 43,
  switchFlag: 0
}, {
  qe: 0x5601,
  nmps: 46,
  nlps: 46,
  switchFlag: 0
}];

var ArithmeticDecoder =
/*#__PURE__*/
function () {
  function ArithmeticDecoder(data, start, end) {
    _classCallCheck(this, ArithmeticDecoder);

    this.data = data;
    this.bp = start;
    this.dataEnd = end;
    this.chigh = data[start];
    this.clow = 0;
    this.byteIn();
    this.chigh = this.chigh << 7 & 0xFFFF | this.clow >> 9 & 0x7F;
    this.clow = this.clow << 7 & 0xFFFF;
    this.ct -= 7;
    this.a = 0x8000;
  }

  _createClass(ArithmeticDecoder, [{
    key: "byteIn",
    value: function byteIn() {
      var data = this.data;
      var bp = this.bp;

      if (data[bp] === 0xFF) {
        if (data[bp + 1] > 0x8F) {
          this.clow += 0xFF00;
          this.ct = 8;
        } else {
          bp++;
          this.clow += data[bp] << 9;
          this.ct = 7;
          this.bp = bp;
        }
      } else {
        bp++;
        this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xFF00;
        this.ct = 8;
        this.bp = bp;
      }

      if (this.clow > 0xFFFF) {
        this.chigh += this.clow >> 16;
        this.clow &= 0xFFFF;
      }
    }
  }, {
    key: "readBit",
    value: function readBit(contexts, pos) {
      var cx_index = contexts[pos] >> 1,
          cx_mps = contexts[pos] & 1;
      var qeTableIcx = QeTable[cx_index];
      var qeIcx = qeTableIcx.qe;
      var d;
      var a = this.a - qeIcx;

      if (this.chigh < qeIcx) {
        if (a < qeIcx) {
          a = qeIcx;
          d = cx_mps;
          cx_index = qeTableIcx.nmps;
        } else {
          a = qeIcx;
          d = 1 ^ cx_mps;

          if (qeTableIcx.switchFlag === 1) {
            cx_mps = d;
          }

          cx_index = qeTableIcx.nlps;
        }
      } else {
        this.chigh -= qeIcx;

        if ((a & 0x8000) !== 0) {
          this.a = a;
          return cx_mps;
        }

        if (a < qeIcx) {
          d = 1 ^ cx_mps;

          if (qeTableIcx.switchFlag === 1) {
            cx_mps = d;
          }

          cx_index = qeTableIcx.nlps;
        } else {
          d = cx_mps;
          cx_index = qeTableIcx.nmps;
        }
      }

      do {
        if (this.ct === 0) {
          this.byteIn();
        }

        a <<= 1;
        this.chigh = this.chigh << 1 & 0xFFFF | this.clow >> 15 & 1;
        this.clow = this.clow << 1 & 0xFFFF;
        this.ct--;
      } while ((a & 0x8000) === 0);

      this.a = a;
      contexts[pos] = cx_index << 1 | cx_mps;
      return d;
    }
  }]);

  return ArithmeticDecoder;
}();

exports.ArithmeticDecoder = ArithmeticDecoder;

/***/ }),
/* 163 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.JpegStream = void 0;

var _util = __w_pdfjs_require__(6);

var _stream = __w_pdfjs_require__(157);

var _primitives = __w_pdfjs_require__(155);

var _jpg = __w_pdfjs_require__(164);

var JpegStream = function JpegStreamClosure() {
  function JpegStream(stream, maybeLength, dict, params) {
    var ch;

    while ((ch = stream.getByte()) !== -1) {
      if (ch === 0xFF) {
        stream.skip(-1);
        break;
      }
    }

    this.stream = stream;
    this.maybeLength = maybeLength;
    this.dict = dict;
    this.params = params;

    _stream.DecodeStream.call(this, maybeLength);
  }

  JpegStream.prototype = Object.create(_stream.DecodeStream.prototype);
  Object.defineProperty(JpegStream.prototype, 'bytes', {
    get: function JpegStream_bytes() {
      return (0, _util.shadow)(this, 'bytes', this.stream.getBytes(this.maybeLength));
    },
    configurable: true
  });

  JpegStream.prototype.ensureBuffer = function (requested) {};

  JpegStream.prototype.readBlock = function () {
    if (this.eof) {
      return;
    }

    var jpegOptions = {
      decodeTransform: undefined,
      colorTransform: undefined
    };
    var decodeArr = this.dict.getArray('Decode', 'D');

    if (this.forceRGB && Array.isArray(decodeArr)) {
      var bitsPerComponent = this.dict.get('BitsPerComponent') || 8;
      var decodeArrLength = decodeArr.length;
      var transform = new Int32Array(decodeArrLength);
      var transformNeeded = false;
      var maxValue = (1 << bitsPerComponent) - 1;

      for (var i = 0; i < decodeArrLength; i += 2) {
        transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0;
        transform[i + 1] = decodeArr[i] * maxValue | 0;

        if (transform[i] !== 256 || transform[i + 1] !== 0) {
          transformNeeded = true;
        }
      }

      if (transformNeeded) {
        jpegOptions.decodeTransform = transform;
      }
    }

    if ((0, _primitives.isDict)(this.params)) {
      var colorTransform = this.params.get('ColorTransform');

      if (Number.isInteger(colorTransform)) {
        jpegOptions.colorTransform = colorTransform;
      }
    }

    var jpegImage = new _jpg.JpegImage(jpegOptions);
    jpegImage.parse(this.bytes);
    var data = jpegImage.getData({
      width: this.drawWidth,
      height: this.drawHeight,
      forceRGB: this.forceRGB,
      isSourcePDF: true
    });
    this.buffer = data;
    this.bufferLength = data.length;
    this.eof = true;
  };

  JpegStream.prototype.getIR = function () {
    var forceDataSchema = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
    return (0, _util.createObjectURL)(this.bytes, 'image/jpeg', forceDataSchema);
  };

  return JpegStream;
}();

exports.JpegStream = JpegStream;

/***/ }),
/* 164 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.JpegImage = void 0;

var _util = __w_pdfjs_require__(6);

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var JpegError = function JpegErrorClosure() {
  function JpegError(msg) {
    this.message = 'JPEG error: ' + msg;
  }

  JpegError.prototype = new Error();
  JpegError.prototype.name = 'JpegError';
  JpegError.constructor = JpegError;
  return JpegError;
}();

var DNLMarkerError = function DNLMarkerErrorClosure() {
  function DNLMarkerError(message, scanLines) {
    this.message = message;
    this.scanLines = scanLines;
  }

  DNLMarkerError.prototype = new Error();
  DNLMarkerError.prototype.name = 'DNLMarkerError';
  DNLMarkerError.constructor = DNLMarkerError;
  return DNLMarkerError;
}();

var EOIMarkerError = function EOIMarkerErrorClosure() {
  function EOIMarkerError(message) {
    this.message = message;
  }

  EOIMarkerError.prototype = new Error();
  EOIMarkerError.prototype.name = 'EOIMarkerError';
  EOIMarkerError.constructor = EOIMarkerError;
  return EOIMarkerError;
}();

var JpegImage = function JpegImageClosure() {
  var dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);
  var dctCos1 = 4017;
  var dctSin1 = 799;
  var dctCos3 = 3406;
  var dctSin3 = 2276;
  var dctCos6 = 1567;
  var dctSin6 = 3784;
  var dctSqrt2 = 5793;
  var dctSqrt1d2 = 2896;

  function JpegImage() {
    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
        _ref$decodeTransform = _ref.decodeTransform,
        decodeTransform = _ref$decodeTransform === void 0 ? null : _ref$decodeTransform,
        _ref$colorTransform = _ref.colorTransform,
        colorTransform = _ref$colorTransform === void 0 ? -1 : _ref$colorTransform;

    this._decodeTransform = decodeTransform;
    this._colorTransform = colorTransform;
  }

  function buildHuffmanTable(codeLengths, values) {
    var k = 0,
        code = [],
        i,
        j,
        length = 16;

    while (length > 0 && !codeLengths[length - 1]) {
      length--;
    }

    code.push({
      children: [],
      index: 0
    });
    var p = code[0],
        q;

    for (i = 0; i < length; i++) {
      for (j = 0; j < codeLengths[i]; j++) {
        p = code.pop();
        p.children[p.index] = values[k];

        while (p.index > 0) {
          p = code.pop();
        }

        p.index++;
        code.push(p);

        while (code.length <= i) {
          code.push(q = {
            children: [],
            index: 0
          });
          p.children[p.index] = q.children;
          p = q;
        }

        k++;
      }

      if (i + 1 < length) {
        code.push(q = {
          children: [],
          index: 0
        });
        p.children[p.index] = q.children;
        p = q;
      }
    }

    return code[0].children;
  }

  function getBlockBufferOffset(component, row, col) {
    return 64 * ((component.blocksPerLine + 1) * row + col);
  }

  function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {
    var parseDNLMarker = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : false;
    var mcusPerLine = frame.mcusPerLine;
    var progressive = frame.progressive;
    var startOffset = offset,
        bitsData = 0,
        bitsCount = 0;

    function readBit() {
      if (bitsCount > 0) {
        bitsCount--;
        return bitsData >> bitsCount & 1;
      }

      bitsData = data[offset++];

      if (bitsData === 0xFF) {
        var nextByte = data[offset++];

        if (nextByte) {
          if (nextByte === 0xDC && parseDNLMarker) {
            offset += 2;
            var scanLines = data[offset++] << 8 | data[offset++];

            if (scanLines > 0 && scanLines !== frame.scanLines) {
              throw new DNLMarkerError('Found DNL marker (0xFFDC) while parsing scan data', scanLines);
            }
          } else if (nextByte === 0xD9) {
            throw new EOIMarkerError('Found EOI marker (0xFFD9) while parsing scan data');
          }

          throw new JpegError("unexpected marker ".concat((bitsData << 8 | nextByte).toString(16)));
        }
      }

      bitsCount = 7;
      return bitsData >>> 7;
    }

    function decodeHuffman(tree) {
      var node = tree;

      while (true) {
        node = node[readBit()];

        if (typeof node === 'number') {
          return node;
        }

        if (_typeof(node) !== 'object') {
          throw new JpegError('invalid huffman sequence');
        }
      }
    }

    function receive(length) {
      var n = 0;

      while (length > 0) {
        n = n << 1 | readBit();
        length--;
      }

      return n;
    }

    function receiveAndExtend(length) {
      if (length === 1) {
        return readBit() === 1 ? 1 : -1;
      }

      var n = receive(length);

      if (n >= 1 << length - 1) {
        return n;
      }

      return n + (-1 << length) + 1;
    }

    function decodeBaseline(component, offset) {
      var t = decodeHuffman(component.huffmanTableDC);
      var diff = t === 0 ? 0 : receiveAndExtend(t);
      component.blockData[offset] = component.pred += diff;
      var k = 1;

      while (k < 64) {
        var rs = decodeHuffman(component.huffmanTableAC);
        var s = rs & 15,
            r = rs >> 4;

        if (s === 0) {
          if (r < 15) {
            break;
          }

          k += 16;
          continue;
        }

        k += r;
        var z = dctZigZag[k];
        component.blockData[offset + z] = receiveAndExtend(s);
        k++;
      }
    }

    function decodeDCFirst(component, offset) {
      var t = decodeHuffman(component.huffmanTableDC);
      var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
      component.blockData[offset] = component.pred += diff;
    }

    function decodeDCSuccessive(component, offset) {
      component.blockData[offset] |= readBit() << successive;
    }

    var eobrun = 0;

    function decodeACFirst(component, offset) {
      if (eobrun > 0) {
        eobrun--;
        return;
      }

      var k = spectralStart,
          e = spectralEnd;

      while (k <= e) {
        var rs = decodeHuffman(component.huffmanTableAC);
        var s = rs & 15,
            r = rs >> 4;

        if (s === 0) {
          if (r < 15) {
            eobrun = receive(r) + (1 << r) - 1;
            break;
          }

          k += 16;
          continue;
        }

        k += r;
        var z = dctZigZag[k];
        component.blockData[offset + z] = receiveAndExtend(s) * (1 << successive);
        k++;
      }
    }

    var successiveACState = 0,
        successiveACNextValue;

    function decodeACSuccessive(component, offset) {
      var k = spectralStart;
      var e = spectralEnd;
      var r = 0;
      var s;
      var rs;

      while (k <= e) {
        var offsetZ = offset + dctZigZag[k];
        var sign = component.blockData[offsetZ] < 0 ? -1 : 1;

        switch (successiveACState) {
          case 0:
            rs = decodeHuffman(component.huffmanTableAC);
            s = rs & 15;
            r = rs >> 4;

            if (s === 0) {
              if (r < 15) {
                eobrun = receive(r) + (1 << r);
                successiveACState = 4;
              } else {
                r = 16;
                successiveACState = 1;
              }
            } else {
              if (s !== 1) {
                throw new JpegError('invalid ACn encoding');
              }

              successiveACNextValue = receiveAndExtend(s);
              successiveACState = r ? 2 : 3;
            }

            continue;

          case 1:
          case 2:
            if (component.blockData[offsetZ]) {
              component.blockData[offsetZ] += sign * (readBit() << successive);
            } else {
              r--;

              if (r === 0) {
                successiveACState = successiveACState === 2 ? 3 : 0;
              }
            }

            break;

          case 3:
            if (component.blockData[offsetZ]) {
              component.blockData[offsetZ] += sign * (readBit() << successive);
            } else {
              component.blockData[offsetZ] = successiveACNextValue << successive;
              successiveACState = 0;
            }

            break;

          case 4:
            if (component.blockData[offsetZ]) {
              component.blockData[offsetZ] += sign * (readBit() << successive);
            }

            break;
        }

        k++;
      }

      if (successiveACState === 4) {
        eobrun--;

        if (eobrun === 0) {
          successiveACState = 0;
        }
      }
    }

    function decodeMcu(component, decode, mcu, row, col) {
      var mcuRow = mcu / mcusPerLine | 0;
      var mcuCol = mcu % mcusPerLine;
      var blockRow = mcuRow * component.v + row;
      var blockCol = mcuCol * component.h + col;
      var offset = getBlockBufferOffset(component, blockRow, blockCol);
      decode(component, offset);
    }

    function decodeBlock(component, decode, mcu) {
      var blockRow = mcu / component.blocksPerLine | 0;
      var blockCol = mcu % component.blocksPerLine;
      var offset = getBlockBufferOffset(component, blockRow, blockCol);
      decode(component, offset);
    }

    var componentsLength = components.length;
    var component, i, j, k, n;
    var decodeFn;

    if (progressive) {
      if (spectralStart === 0) {
        decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
      } else {
        decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
      }
    } else {
      decodeFn = decodeBaseline;
    }

    var mcu = 0,
        fileMarker;
    var mcuExpected;

    if (componentsLength === 1) {
      mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
    } else {
      mcuExpected = mcusPerLine * frame.mcusPerColumn;
    }

    var h, v;

    while (mcu < mcuExpected) {
      var mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected;

      for (i = 0; i < componentsLength; i++) {
        components[i].pred = 0;
      }

      eobrun = 0;

      if (componentsLength === 1) {
        component = components[0];

        for (n = 0; n < mcuToRead; n++) {
          decodeBlock(component, decodeFn, mcu);
          mcu++;
        }
      } else {
        for (n = 0; n < mcuToRead; n++) {
          for (i = 0; i < componentsLength; i++) {
            component = components[i];
            h = component.h;
            v = component.v;

            for (j = 0; j < v; j++) {
              for (k = 0; k < h; k++) {
                decodeMcu(component, decodeFn, mcu, j, k);
              }
            }
          }

          mcu++;
        }
      }

      bitsCount = 0;
      fileMarker = findNextFileMarker(data, offset);

      if (fileMarker && fileMarker.invalid) {
        (0, _util.warn)('decodeScan - unexpected MCU data, current marker is: ' + fileMarker.invalid);
        offset = fileMarker.offset;
      }

      var marker = fileMarker && fileMarker.marker;

      if (!marker || marker <= 0xFF00) {
        throw new JpegError('marker was not found');
      }

      if (marker >= 0xFFD0 && marker <= 0xFFD7) {
        offset += 2;
      } else {
        break;
      }
    }

    fileMarker = findNextFileMarker(data, offset);

    if (fileMarker && fileMarker.invalid) {
      (0, _util.warn)('decodeScan - unexpected Scan data, current marker is: ' + fileMarker.invalid);
      offset = fileMarker.offset;
    }

    return offset - startOffset;
  }

  function quantizeAndInverse(component, blockBufferOffset, p) {
    var qt = component.quantizationTable,
        blockData = component.blockData;
    var v0, v1, v2, v3, v4, v5, v6, v7;
    var p0, p1, p2, p3, p4, p5, p6, p7;
    var t;

    if (!qt) {
      throw new JpegError('missing required Quantization Table.');
    }

    for (var row = 0; row < 64; row += 8) {
      p0 = blockData[blockBufferOffset + row];
      p1 = blockData[blockBufferOffset + row + 1];
      p2 = blockData[blockBufferOffset + row + 2];
      p3 = blockData[blockBufferOffset + row + 3];
      p4 = blockData[blockBufferOffset + row + 4];
      p5 = blockData[blockBufferOffset + row + 5];
      p6 = blockData[blockBufferOffset + row + 6];
      p7 = blockData[blockBufferOffset + row + 7];
      p0 *= qt[row];

      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
        t = dctSqrt2 * p0 + 512 >> 10;
        p[row] = t;
        p[row + 1] = t;
        p[row + 2] = t;
        p[row + 3] = t;
        p[row + 4] = t;
        p[row + 5] = t;
        p[row + 6] = t;
        p[row + 7] = t;
        continue;
      }

      p1 *= qt[row + 1];
      p2 *= qt[row + 2];
      p3 *= qt[row + 3];
      p4 *= qt[row + 4];
      p5 *= qt[row + 5];
      p6 *= qt[row + 6];
      p7 *= qt[row + 7];
      v0 = dctSqrt2 * p0 + 128 >> 8;
      v1 = dctSqrt2 * p4 + 128 >> 8;
      v2 = p2;
      v3 = p6;
      v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8;
      v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8;
      v5 = p3 << 4;
      v6 = p5 << 4;
      v0 = v0 + v1 + 1 >> 1;
      v1 = v0 - v1;
      t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8;
      v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8;
      v3 = t;
      v4 = v4 + v6 + 1 >> 1;
      v6 = v4 - v6;
      v7 = v7 + v5 + 1 >> 1;
      v5 = v7 - v5;
      v0 = v0 + v3 + 1 >> 1;
      v3 = v0 - v3;
      v1 = v1 + v2 + 1 >> 1;
      v2 = v1 - v2;
      t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
      v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
      v7 = t;
      t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
      v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
      v6 = t;
      p[row] = v0 + v7;
      p[row + 7] = v0 - v7;
      p[row + 1] = v1 + v6;
      p[row + 6] = v1 - v6;
      p[row + 2] = v2 + v5;
      p[row + 5] = v2 - v5;
      p[row + 3] = v3 + v4;
      p[row + 4] = v3 - v4;
    }

    for (var col = 0; col < 8; ++col) {
      p0 = p[col];
      p1 = p[col + 8];
      p2 = p[col + 16];
      p3 = p[col + 24];
      p4 = p[col + 32];
      p5 = p[col + 40];
      p6 = p[col + 48];
      p7 = p[col + 56];

      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
        t = dctSqrt2 * p0 + 8192 >> 14;
        t = t < -2040 ? 0 : t >= 2024 ? 255 : t + 2056 >> 4;
        blockData[blockBufferOffset + col] = t;
        blockData[blockBufferOffset + col + 8] = t;
        blockData[blockBufferOffset + col + 16] = t;
        blockData[blockBufferOffset + col + 24] = t;
        blockData[blockBufferOffset + col + 32] = t;
        blockData[blockBufferOffset + col + 40] = t;
        blockData[blockBufferOffset + col + 48] = t;
        blockData[blockBufferOffset + col + 56] = t;
        continue;
      }

      v0 = dctSqrt2 * p0 + 2048 >> 12;
      v1 = dctSqrt2 * p4 + 2048 >> 12;
      v2 = p2;
      v3 = p6;
      v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12;
      v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12;
      v5 = p3;
      v6 = p5;
      v0 = (v0 + v1 + 1 >> 1) + 4112;
      v1 = v0 - v1;
      t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12;
      v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12;
      v3 = t;
      v4 = v4 + v6 + 1 >> 1;
      v6 = v4 - v6;
      v7 = v7 + v5 + 1 >> 1;
      v5 = v7 - v5;
      v0 = v0 + v3 + 1 >> 1;
      v3 = v0 - v3;
      v1 = v1 + v2 + 1 >> 1;
      v2 = v1 - v2;
      t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
      v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
      v7 = t;
      t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
      v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
      v6 = t;
      p0 = v0 + v7;
      p7 = v0 - v7;
      p1 = v1 + v6;
      p6 = v1 - v6;
      p2 = v2 + v5;
      p5 = v2 - v5;
      p3 = v3 + v4;
      p4 = v3 - v4;
      p0 = p0 < 16 ? 0 : p0 >= 4080 ? 255 : p0 >> 4;
      p1 = p1 < 16 ? 0 : p1 >= 4080 ? 255 : p1 >> 4;
      p2 = p2 < 16 ? 0 : p2 >= 4080 ? 255 : p2 >> 4;
      p3 = p3 < 16 ? 0 : p3 >= 4080 ? 255 : p3 >> 4;
      p4 = p4 < 16 ? 0 : p4 >= 4080 ? 255 : p4 >> 4;
      p5 = p5 < 16 ? 0 : p5 >= 4080 ? 255 : p5 >> 4;
      p6 = p6 < 16 ? 0 : p6 >= 4080 ? 255 : p6 >> 4;
      p7 = p7 < 16 ? 0 : p7 >= 4080 ? 255 : p7 >> 4;
      blockData[blockBufferOffset + col] = p0;
      blockData[blockBufferOffset + col + 8] = p1;
      blockData[blockBufferOffset + col + 16] = p2;
      blockData[blockBufferOffset + col + 24] = p3;
      blockData[blockBufferOffset + col + 32] = p4;
      blockData[blockBufferOffset + col + 40] = p5;
      blockData[blockBufferOffset + col + 48] = p6;
      blockData[blockBufferOffset + col + 56] = p7;
    }
  }

  function buildComponentData(frame, component) {
    var blocksPerLine = component.blocksPerLine;
    var blocksPerColumn = component.blocksPerColumn;
    var computationBuffer = new Int16Array(64);

    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
      for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
        var offset = getBlockBufferOffset(component, blockRow, blockCol);
        quantizeAndInverse(component, offset, computationBuffer);
      }
    }

    return component.blockData;
  }

  function findNextFileMarker(data, currentPos) {
    var startPos = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : currentPos;

    function peekUint16(pos) {
      return data[pos] << 8 | data[pos + 1];
    }

    var maxPos = data.length - 1;
    var newPos = startPos < currentPos ? startPos : currentPos;

    if (currentPos >= maxPos) {
      return null;
    }

    var currentMarker = peekUint16(currentPos);

    if (currentMarker >= 0xFFC0 && currentMarker <= 0xFFFE) {
      return {
        invalid: null,
        marker: currentMarker,
        offset: currentPos
      };
    }

    var newMarker = peekUint16(newPos);

    while (!(newMarker >= 0xFFC0 && newMarker <= 0xFFFE)) {
      if (++newPos >= maxPos) {
        return null;
      }

      newMarker = peekUint16(newPos);
    }

    return {
      invalid: currentMarker.toString(16),
      marker: newMarker,
      offset: newPos
    };
  }

  JpegImage.prototype = {
    parse: function parse(data) {
      var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
          _ref2$dnlScanLines = _ref2.dnlScanLines,
          dnlScanLines = _ref2$dnlScanLines === void 0 ? null : _ref2$dnlScanLines;

      function readUint16() {
        var value = data[offset] << 8 | data[offset + 1];
        offset += 2;
        return value;
      }

      function readDataBlock() {
        var length = readUint16();
        var endOffset = offset + length - 2;
        var fileMarker = findNextFileMarker(data, endOffset, offset);

        if (fileMarker && fileMarker.invalid) {
          (0, _util.warn)('readDataBlock - incorrect length, current marker is: ' + fileMarker.invalid);
          endOffset = fileMarker.offset;
        }

        var array = data.subarray(offset, endOffset);
        offset += array.length;
        return array;
      }

      function prepareComponents(frame) {
        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);
        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);

        for (var i = 0; i < frame.components.length; i++) {
          component = frame.components[i];
          var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH);
          var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV);
          var blocksPerLineForMcu = mcusPerLine * component.h;
          var blocksPerColumnForMcu = mcusPerColumn * component.v;
          var blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1);
          component.blockData = new Int16Array(blocksBufferSize);
          component.blocksPerLine = blocksPerLine;
          component.blocksPerColumn = blocksPerColumn;
        }

        frame.mcusPerLine = mcusPerLine;
        frame.mcusPerColumn = mcusPerColumn;
      }

      var offset = 0;
      var jfif = null;
      var adobe = null;
      var frame, resetInterval;
      var numSOSMarkers = 0;
      var quantizationTables = [];
      var huffmanTablesAC = [],
          huffmanTablesDC = [];
      var fileMarker = readUint16();

      if (fileMarker !== 0xFFD8) {
        throw new JpegError('SOI not found');
      }

      fileMarker = readUint16();

      markerLoop: while (fileMarker !== 0xFFD9) {
        var i, j, l;

        switch (fileMarker) {
          case 0xFFE0:
          case 0xFFE1:
          case 0xFFE2:
          case 0xFFE3:
          case 0xFFE4:
          case 0xFFE5:
          case 0xFFE6:
          case 0xFFE7:
          case 0xFFE8:
          case 0xFFE9:
          case 0xFFEA:
          case 0xFFEB:
          case 0xFFEC:
          case 0xFFED:
          case 0xFFEE:
          case 0xFFEF:
          case 0xFFFE:
            var appData = readDataBlock();

            if (fileMarker === 0xFFE0) {
              if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {
                jfif = {
                  version: {
                    major: appData[5],
                    minor: appData[6]
                  },
                  densityUnits: appData[7],
                  xDensity: appData[8] << 8 | appData[9],
                  yDensity: appData[10] << 8 | appData[11],
                  thumbWidth: appData[12],
                  thumbHeight: appData[13],
                  thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
                };
              }
            }

            if (fileMarker === 0xFFEE) {
              if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F && appData[3] === 0x62 && appData[4] === 0x65) {
                adobe = {
                  version: appData[5] << 8 | appData[6],
                  flags0: appData[7] << 8 | appData[8],
                  flags1: appData[9] << 8 | appData[10],
                  transformCode: appData[11]
                };
              }
            }

            break;

          case 0xFFDB:
            var quantizationTablesLength = readUint16();
            var quantizationTablesEnd = quantizationTablesLength + offset - 2;
            var z;

            while (offset < quantizationTablesEnd) {
              var quantizationTableSpec = data[offset++];
              var tableData = new Uint16Array(64);

              if (quantizationTableSpec >> 4 === 0) {
                for (j = 0; j < 64; j++) {
                  z = dctZigZag[j];
                  tableData[z] = data[offset++];
                }
              } else if (quantizationTableSpec >> 4 === 1) {
                for (j = 0; j < 64; j++) {
                  z = dctZigZag[j];
                  tableData[z] = readUint16();
                }
              } else {
                throw new JpegError('DQT - invalid table spec');
              }

              quantizationTables[quantizationTableSpec & 15] = tableData;
            }

            break;

          case 0xFFC0:
          case 0xFFC1:
          case 0xFFC2:
            if (frame) {
              throw new JpegError('Only single frame JPEGs supported');
            }

            readUint16();
            frame = {};
            frame.extended = fileMarker === 0xFFC1;
            frame.progressive = fileMarker === 0xFFC2;
            frame.precision = data[offset++];
            var sofScanLines = readUint16();
            frame.scanLines = dnlScanLines || sofScanLines;
            frame.samplesPerLine = readUint16();
            frame.components = [];
            frame.componentIds = {};
            var componentsCount = data[offset++],
                componentId;
            var maxH = 0,
                maxV = 0;

            for (i = 0; i < componentsCount; i++) {
              componentId = data[offset];
              var h = data[offset + 1] >> 4;
              var v = data[offset + 1] & 15;

              if (maxH < h) {
                maxH = h;
              }

              if (maxV < v) {
                maxV = v;
              }

              var qId = data[offset + 2];
              l = frame.components.push({
                h: h,
                v: v,
                quantizationId: qId,
                quantizationTable: null
              });
              frame.componentIds[componentId] = l - 1;
              offset += 3;
            }

            frame.maxH = maxH;
            frame.maxV = maxV;
            prepareComponents(frame);
            break;

          case 0xFFC4:
            var huffmanLength = readUint16();

            for (i = 2; i < huffmanLength;) {
              var huffmanTableSpec = data[offset++];
              var codeLengths = new Uint8Array(16);
              var codeLengthSum = 0;

              for (j = 0; j < 16; j++, offset++) {
                codeLengthSum += codeLengths[j] = data[offset];
              }

              var huffmanValues = new Uint8Array(codeLengthSum);

              for (j = 0; j < codeLengthSum; j++, offset++) {
                huffmanValues[j] = data[offset];
              }

              i += 17 + codeLengthSum;
              (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues);
            }

            break;

          case 0xFFDD:
            readUint16();
            resetInterval = readUint16();
            break;

          case 0xFFDA:
            var parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines;
            readUint16();
            var selectorsCount = data[offset++];
            var components = [],
                component;

            for (i = 0; i < selectorsCount; i++) {
              var componentIndex = frame.componentIds[data[offset++]];
              component = frame.components[componentIndex];
              var tableSpec = data[offset++];
              component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
              component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
              components.push(component);
            }

            var spectralStart = data[offset++];
            var spectralEnd = data[offset++];
            var successiveApproximation = data[offset++];

            try {
              var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker);
              offset += processed;
            } catch (ex) {
              if (ex instanceof DNLMarkerError) {
                (0, _util.warn)("".concat(ex.message, " -- attempting to re-parse the JPEG image."));
                return this.parse(data, {
                  dnlScanLines: ex.scanLines
                });
              } else if (ex instanceof EOIMarkerError) {
                (0, _util.warn)("".concat(ex.message, " -- ignoring the rest of the image data."));
                break markerLoop;
              }

              throw ex;
            }

            break;

          case 0xFFDC:
            offset += 4;
            break;

          case 0xFFFF:
            if (data[offset] !== 0xFF) {
              offset--;
            }

            break;

          default:
            if (data[offset - 3] === 0xFF && data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {
              offset -= 3;
              break;
            }

            var nextFileMarker = findNextFileMarker(data, offset - 2);

            if (nextFileMarker && nextFileMarker.invalid) {
              (0, _util.warn)('JpegImage.parse - unexpected data, current marker is: ' + nextFileMarker.invalid);
              offset = nextFileMarker.offset;
              break;
            }

            throw new JpegError('unknown marker ' + fileMarker.toString(16));
        }

        fileMarker = readUint16();
      }

      this.width = frame.samplesPerLine;
      this.height = frame.scanLines;
      this.jfif = jfif;
      this.adobe = adobe;
      this.components = [];

      for (i = 0; i < frame.components.length; i++) {
        component = frame.components[i];
        var quantizationTable = quantizationTables[component.quantizationId];

        if (quantizationTable) {
          component.quantizationTable = quantizationTable;
        }

        this.components.push({
          output: buildComponentData(frame, component),
          scaleX: component.h / frame.maxH,
          scaleY: component.v / frame.maxV,
          blocksPerLine: component.blocksPerLine,
          blocksPerColumn: component.blocksPerColumn
        });
      }

      this.numComponents = this.components.length;
    },
    _getLinearizedBlockData: function _getLinearizedBlockData(width, height) {
      var isSourcePDF = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
      var scaleX = this.width / width,
          scaleY = this.height / height;
      var component, componentScaleX, componentScaleY, blocksPerScanline;
      var x, y, i, j, k;
      var index;
      var offset = 0;
      var output;
      var numComponents = this.components.length;
      var dataLength = width * height * numComponents;
      var data = new Uint8ClampedArray(dataLength);
      var xScaleBlockOffset = new Uint32Array(width);
      var mask3LSB = 0xfffffff8;

      for (i = 0; i < numComponents; i++) {
        component = this.components[i];
        componentScaleX = component.scaleX * scaleX;
        componentScaleY = component.scaleY * scaleY;
        offset = i;
        output = component.output;
        blocksPerScanline = component.blocksPerLine + 1 << 3;

        for (x = 0; x < width; x++) {
          j = 0 | x * componentScaleX;
          xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;
        }

        for (y = 0; y < height; y++) {
          j = 0 | y * componentScaleY;
          index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3;

          for (x = 0; x < width; x++) {
            data[offset] = output[index + xScaleBlockOffset[x]];
            offset += numComponents;
          }
        }
      }

      var transform = this._decodeTransform;

      if (!isSourcePDF && numComponents === 4 && !transform) {
        transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]);
      }

      if (transform) {
        for (i = 0; i < dataLength;) {
          for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {
            data[i] = (data[i] * transform[k] >> 8) + transform[k + 1];
          }
        }
      }

      return data;
    },

    get _isColorConversionNeeded() {
      if (this.adobe) {
        return !!this.adobe.transformCode;
      }

      if (this.numComponents === 3) {
        if (this._colorTransform === 0) {
          return false;
        }

        return true;
      }

      if (this._colorTransform === 1) {
        return true;
      }

      return false;
    },

    _convertYccToRgb: function convertYccToRgb(data) {
      var Y, Cb, Cr;

      for (var i = 0, length = data.length; i < length; i += 3) {
        Y = data[i];
        Cb = data[i + 1];
        Cr = data[i + 2];
        data[i] = Y - 179.456 + 1.402 * Cr;
        data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr;
        data[i + 2] = Y - 226.816 + 1.772 * Cb;
      }

      return data;
    },
    _convertYcckToRgb: function convertYcckToRgb(data) {
      var Y, Cb, Cr, k;
      var offset = 0;

      for (var i = 0, length = data.length; i < length; i += 4) {
        Y = data[i];
        Cb = data[i + 1];
        Cr = data[i + 2];
        k = data[i + 3];
        data[offset++] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776);
        data[offset++] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665);
        data[offset++] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407);
      }

      return data.subarray(0, offset);
    },
    _convertYcckToCmyk: function convertYcckToCmyk(data) {
      var Y, Cb, Cr;

      for (var i = 0, length = data.length; i < length; i += 4) {
        Y = data[i];
        Cb = data[i + 1];
        Cr = data[i + 2];
        data[i] = 434.456 - Y - 1.402 * Cr;
        data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr;
        data[i + 2] = 481.816 - Y - 1.772 * Cb;
      }

      return data;
    },
    _convertCmykToRgb: function convertCmykToRgb(data) {
      var c, m, y, k;
      var offset = 0;
      var scale = 1 / 255;

      for (var i = 0, length = data.length; i < length; i += 4) {
        c = data[i] * scale;
        m = data[i + 1] * scale;
        y = data[i + 2] * scale;
        k = data[i + 3] * scale;
        data[offset++] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k - 285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y - 17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) - k * (21.86122147463605 * k + 189.48180835922747);
        data[offset++] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k - 79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) - k * (20.737325471181034 * k + 187.80453709719578);
        data[offset++] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k - 14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k - 193.58209356861505) - k * (22.33816807309886 * k + 180.12613974708367);
      }

      return data.subarray(0, offset);
    },
    getData: function getData(_ref3) {
      var width = _ref3.width,
          height = _ref3.height,
          _ref3$forceRGB = _ref3.forceRGB,
          forceRGB = _ref3$forceRGB === void 0 ? false : _ref3$forceRGB,
          _ref3$isSourcePDF = _ref3.isSourcePDF,
          isSourcePDF = _ref3$isSourcePDF === void 0 ? false : _ref3$isSourcePDF;

      if (this.numComponents > 4) {
        throw new JpegError('Unsupported color mode');
      }

      var data = this._getLinearizedBlockData(width, height, isSourcePDF);

      if (this.numComponents === 1 && forceRGB) {
        var dataLength = data.length;
        var rgbData = new Uint8ClampedArray(dataLength * 3);
        var offset = 0;

        for (var i = 0; i < dataLength; i++) {
          var grayColor = data[i];
          rgbData[offset++] = grayColor;
          rgbData[offset++] = grayColor;
          rgbData[offset++] = grayColor;
        }

        return rgbData;
      } else if (this.numComponents === 3 && this._isColorConversionNeeded) {
        return this._convertYccToRgb(data);
      } else if (this.numComponents === 4) {
        if (this._isColorConversionNeeded) {
          if (forceRGB) {
            return this._convertYcckToRgb(data);
          }

          return this._convertYcckToCmyk(data);
        } else if (forceRGB) {
          return this._convertCmykToRgb(data);
        }
      }

      return data;
    }
  };
  return JpegImage;
}();

exports.JpegImage = JpegImage;

/***/ }),
/* 165 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.JpxStream = void 0;

var _stream = __w_pdfjs_require__(157);

var _jpx = __w_pdfjs_require__(166);

var _util = __w_pdfjs_require__(6);

var JpxStream = function JpxStreamClosure() {
  function JpxStream(stream, maybeLength, dict, params) {
    this.stream = stream;
    this.maybeLength = maybeLength;
    this.dict = dict;
    this.params = params;

    _stream.DecodeStream.call(this, maybeLength);
  }

  JpxStream.prototype = Object.create(_stream.DecodeStream.prototype);
  Object.defineProperty(JpxStream.prototype, 'bytes', {
    get: function JpxStream_bytes() {
      return (0, _util.shadow)(this, 'bytes', this.stream.getBytes(this.maybeLength));
    },
    configurable: true
  });

  JpxStream.prototype.ensureBuffer = function (requested) {};

  JpxStream.prototype.readBlock = function () {
    if (this.eof) {
      return;
    }

    var jpxImage = new _jpx.JpxImage();
    jpxImage.parse(this.bytes);
    var width = jpxImage.width;
    var height = jpxImage.height;
    var componentsCount = jpxImage.componentsCount;
    var tileCount = jpxImage.tiles.length;

    if (tileCount === 1) {
      this.buffer = jpxImage.tiles[0].items;
    } else {
      var data = new Uint8ClampedArray(width * height * componentsCount);

      for (var k = 0; k < tileCount; k++) {
        var tileComponents = jpxImage.tiles[k];
        var tileWidth = tileComponents.width;
        var tileHeight = tileComponents.height;
        var tileLeft = tileComponents.left;
        var tileTop = tileComponents.top;
        var src = tileComponents.items;
        var srcPosition = 0;
        var dataPosition = (width * tileTop + tileLeft) * componentsCount;
        var imgRowSize = width * componentsCount;
        var tileRowSize = tileWidth * componentsCount;

        for (var j = 0; j < tileHeight; j++) {
          var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize);
          data.set(rowBytes, dataPosition);
          srcPosition += tileRowSize;
          dataPosition += imgRowSize;
        }
      }

      this.buffer = data;
    }

    this.bufferLength = this.buffer.length;
    this.eof = true;
  };

  return JpxStream;
}();

exports.JpxStream = JpxStream;

/***/ }),
/* 166 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.JpxImage = void 0;

var _util = __w_pdfjs_require__(6);

var _arithmetic_decoder = __w_pdfjs_require__(162);

var JpxError = function JpxErrorClosure() {
  function JpxError(msg) {
    this.message = 'JPX error: ' + msg;
  }

  JpxError.prototype = new Error();
  JpxError.prototype.name = 'JpxError';
  JpxError.constructor = JpxError;
  return JpxError;
}();

var JpxImage = function JpxImageClosure() {
  var SubbandsGainLog2 = {
    'LL': 0,
    'LH': 1,
    'HL': 1,
    'HH': 2
  };

  function JpxImage() {
    this.failOnCorruptedImage = false;
  }

  JpxImage.prototype = {
    parse: function JpxImage_parse(data) {
      var head = (0, _util.readUint16)(data, 0);

      if (head === 0xFF4F) {
        this.parseCodestream(data, 0, data.length);
        return;
      }

      var position = 0,
          length = data.length;

      while (position < length) {
        var headerSize = 8;
        var lbox = (0, _util.readUint32)(data, position);
        var tbox = (0, _util.readUint32)(data, position + 4);
        position += headerSize;

        if (lbox === 1) {
          lbox = (0, _util.readUint32)(data, position) * 4294967296 + (0, _util.readUint32)(data, position + 4);
          position += 8;
          headerSize += 8;
        }

        if (lbox === 0) {
          lbox = length - position + headerSize;
        }

        if (lbox < headerSize) {
          throw new JpxError('Invalid box field size');
        }

        var dataLength = lbox - headerSize;
        var jumpDataLength = true;

        switch (tbox) {
          case 0x6A703268:
            jumpDataLength = false;
            break;

          case 0x636F6C72:
            var method = data[position];

            if (method === 1) {
              var colorspace = (0, _util.readUint32)(data, position + 3);

              switch (colorspace) {
                case 16:
                case 17:
                case 18:
                  break;

                default:
                  (0, _util.warn)('Unknown colorspace ' + colorspace);
                  break;
              }
            } else if (method === 2) {
              (0, _util.info)('ICC profile not supported');
            }

            break;

          case 0x6A703263:
            this.parseCodestream(data, position, position + dataLength);
            break;

          case 0x6A502020:
            if ((0, _util.readUint32)(data, position) !== 0x0d0a870a) {
              (0, _util.warn)('Invalid JP2 signature');
            }

            break;

          case 0x6A501A1A:
          case 0x66747970:
          case 0x72726571:
          case 0x72657320:
          case 0x69686472:
            break;

          default:
            var headerType = String.fromCharCode(tbox >> 24 & 0xFF, tbox >> 16 & 0xFF, tbox >> 8 & 0xFF, tbox & 0xFF);
            (0, _util.warn)('Unsupported header type ' + tbox + ' (' + headerType + ')');
            break;
        }

        if (jumpDataLength) {
          position += dataLength;
        }
      }
    },
    parseImageProperties: function JpxImage_parseImageProperties(stream) {
      var newByte = stream.getByte();

      while (newByte >= 0) {
        var oldByte = newByte;
        newByte = stream.getByte();
        var code = oldByte << 8 | newByte;

        if (code === 0xFF51) {
          stream.skip(4);
          var Xsiz = stream.getInt32() >>> 0;
          var Ysiz = stream.getInt32() >>> 0;
          var XOsiz = stream.getInt32() >>> 0;
          var YOsiz = stream.getInt32() >>> 0;
          stream.skip(16);
          var Csiz = stream.getUint16();
          this.width = Xsiz - XOsiz;
          this.height = Ysiz - YOsiz;
          this.componentsCount = Csiz;
          this.bitsPerComponent = 8;
          return;
        }
      }

      throw new JpxError('No size marker found in JPX stream');
    },
    parseCodestream: function JpxImage_parseCodestream(data, start, end) {
      var context = {};
      var doNotRecover = false;

      try {
        var position = start;

        while (position + 1 < end) {
          var code = (0, _util.readUint16)(data, position);
          position += 2;
          var length = 0,
              j,
              sqcd,
              spqcds,
              spqcdSize,
              scalarExpounded,
              tile;

          switch (code) {
            case 0xFF4F:
              context.mainHeader = true;
              break;

            case 0xFFD9:
              break;

            case 0xFF51:
              length = (0, _util.readUint16)(data, position);
              var siz = {};
              siz.Xsiz = (0, _util.readUint32)(data, position + 4);
              siz.Ysiz = (0, _util.readUint32)(data, position + 8);
              siz.XOsiz = (0, _util.readUint32)(data, position + 12);
              siz.YOsiz = (0, _util.readUint32)(data, position + 16);
              siz.XTsiz = (0, _util.readUint32)(data, position + 20);
              siz.YTsiz = (0, _util.readUint32)(data, position + 24);
              siz.XTOsiz = (0, _util.readUint32)(data, position + 28);
              siz.YTOsiz = (0, _util.readUint32)(data, position + 32);
              var componentsCount = (0, _util.readUint16)(data, position + 36);
              siz.Csiz = componentsCount;
              var components = [];
              j = position + 38;

              for (var i = 0; i < componentsCount; i++) {
                var component = {
                  precision: (data[j] & 0x7F) + 1,
                  isSigned: !!(data[j] & 0x80),
                  XRsiz: data[j + 1],
                  YRsiz: data[j + 2]
                };
                j += 3;
                calculateComponentDimensions(component, siz);
                components.push(component);
              }

              context.SIZ = siz;
              context.components = components;
              calculateTileGrids(context, components);
              context.QCC = [];
              context.COC = [];
              break;

            case 0xFF5C:
              length = (0, _util.readUint16)(data, position);
              var qcd = {};
              j = position + 2;
              sqcd = data[j++];

              switch (sqcd & 0x1F) {
                case 0:
                  spqcdSize = 8;
                  scalarExpounded = true;
                  break;

                case 1:
                  spqcdSize = 16;
                  scalarExpounded = false;
                  break;

                case 2:
                  spqcdSize = 16;
                  scalarExpounded = true;
                  break;

                default:
                  throw new Error('Invalid SQcd value ' + sqcd);
              }

              qcd.noQuantization = spqcdSize === 8;
              qcd.scalarExpounded = scalarExpounded;
              qcd.guardBits = sqcd >> 5;
              spqcds = [];

              while (j < length + position) {
                var spqcd = {};

                if (spqcdSize === 8) {
                  spqcd.epsilon = data[j++] >> 3;
                  spqcd.mu = 0;
                } else {
                  spqcd.epsilon = data[j] >> 3;
                  spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];
                  j += 2;
                }

                spqcds.push(spqcd);
              }

              qcd.SPqcds = spqcds;

              if (context.mainHeader) {
                context.QCD = qcd;
              } else {
                context.currentTile.QCD = qcd;
                context.currentTile.QCC = [];
              }

              break;

            case 0xFF5D:
              length = (0, _util.readUint16)(data, position);
              var qcc = {};
              j = position + 2;
              var cqcc;

              if (context.SIZ.Csiz < 257) {
                cqcc = data[j++];
              } else {
                cqcc = (0, _util.readUint16)(data, j);
                j += 2;
              }

              sqcd = data[j++];

              switch (sqcd & 0x1F) {
                case 0:
                  spqcdSize = 8;
                  scalarExpounded = true;
                  break;

                case 1:
                  spqcdSize = 16;
                  scalarExpounded = false;
                  break;

                case 2:
                  spqcdSize = 16;
                  scalarExpounded = true;
                  break;

                default:
                  throw new Error('Invalid SQcd value ' + sqcd);
              }

              qcc.noQuantization = spqcdSize === 8;
              qcc.scalarExpounded = scalarExpounded;
              qcc.guardBits = sqcd >> 5;
              spqcds = [];

              while (j < length + position) {
                spqcd = {};

                if (spqcdSize === 8) {
                  spqcd.epsilon = data[j++] >> 3;
                  spqcd.mu = 0;
                } else {
                  spqcd.epsilon = data[j] >> 3;
                  spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];
                  j += 2;
                }

                spqcds.push(spqcd);
              }

              qcc.SPqcds = spqcds;

              if (context.mainHeader) {
                context.QCC[cqcc] = qcc;
              } else {
                context.currentTile.QCC[cqcc] = qcc;
              }

              break;

            case 0xFF52:
              length = (0, _util.readUint16)(data, position);
              var cod = {};
              j = position + 2;
              var scod = data[j++];
              cod.entropyCoderWithCustomPrecincts = !!(scod & 1);
              cod.sopMarkerUsed = !!(scod & 2);
              cod.ephMarkerUsed = !!(scod & 4);
              cod.progressionOrder = data[j++];
              cod.layersCount = (0, _util.readUint16)(data, j);
              j += 2;
              cod.multipleComponentTransform = data[j++];
              cod.decompositionLevelsCount = data[j++];
              cod.xcb = (data[j++] & 0xF) + 2;
              cod.ycb = (data[j++] & 0xF) + 2;
              var blockStyle = data[j++];
              cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);
              cod.resetContextProbabilities = !!(blockStyle & 2);
              cod.terminationOnEachCodingPass = !!(blockStyle & 4);
              cod.verticallyStripe = !!(blockStyle & 8);
              cod.predictableTermination = !!(blockStyle & 16);
              cod.segmentationSymbolUsed = !!(blockStyle & 32);
              cod.reversibleTransformation = data[j++];

              if (cod.entropyCoderWithCustomPrecincts) {
                var precinctsSizes = [];

                while (j < length + position) {
                  var precinctsSize = data[j++];
                  precinctsSizes.push({
                    PPx: precinctsSize & 0xF,
                    PPy: precinctsSize >> 4
                  });
                }

                cod.precinctsSizes = precinctsSizes;
              }

              var unsupported = [];

              if (cod.selectiveArithmeticCodingBypass) {
                unsupported.push('selectiveArithmeticCodingBypass');
              }

              if (cod.resetContextProbabilities) {
                unsupported.push('resetContextProbabilities');
              }

              if (cod.terminationOnEachCodingPass) {
                unsupported.push('terminationOnEachCodingPass');
              }

              if (cod.verticallyStripe) {
                unsupported.push('verticallyStripe');
              }

              if (cod.predictableTermination) {
                unsupported.push('predictableTermination');
              }

              if (unsupported.length > 0) {
                doNotRecover = true;
                throw new Error('Unsupported COD options (' + unsupported.join(', ') + ')');
              }

              if (context.mainHeader) {
                context.COD = cod;
              } else {
                context.currentTile.COD = cod;
                context.currentTile.COC = [];
              }

              break;

            case 0xFF90:
              length = (0, _util.readUint16)(data, position);
              tile = {};
              tile.index = (0, _util.readUint16)(data, position + 2);
              tile.length = (0, _util.readUint32)(data, position + 4);
              tile.dataEnd = tile.length + position - 2;
              tile.partIndex = data[position + 8];
              tile.partsCount = data[position + 9];
              context.mainHeader = false;

              if (tile.partIndex === 0) {
                tile.COD = context.COD;
                tile.COC = context.COC.slice(0);
                tile.QCD = context.QCD;
                tile.QCC = context.QCC.slice(0);
              }

              context.currentTile = tile;
              break;

            case 0xFF93:
              tile = context.currentTile;

              if (tile.partIndex === 0) {
                initializeTile(context, tile.index);
                buildPackets(context);
              }

              length = tile.dataEnd - position;
              parseTilePackets(context, data, position, length);
              break;

            case 0xFF55:
            case 0xFF57:
            case 0xFF58:
            case 0xFF64:
              length = (0, _util.readUint16)(data, position);
              break;

            case 0xFF53:
              throw new Error('Codestream code 0xFF53 (COC) is ' + 'not implemented');

            default:
              throw new Error('Unknown codestream code: ' + code.toString(16));
          }

          position += length;
        }
      } catch (e) {
        if (doNotRecover || this.failOnCorruptedImage) {
          throw new JpxError(e.message);
        } else {
          (0, _util.warn)('JPX: Trying to recover from: ' + e.message);
        }
      }

      this.tiles = transformComponents(context);
      this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
      this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
      this.componentsCount = context.SIZ.Csiz;
    }
  };

  function calculateComponentDimensions(component, siz) {
    component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
    component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
    component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);
    component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);
    component.width = component.x1 - component.x0;
    component.height = component.y1 - component.y0;
  }

  function calculateTileGrids(context, components) {
    var siz = context.SIZ;
    var tile,
        tiles = [];
    var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
    var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);

    for (var q = 0; q < numYtiles; q++) {
      for (var p = 0; p < numXtiles; p++) {
        tile = {};
        tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);
        tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);
        tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);
        tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);
        tile.width = tile.tx1 - tile.tx0;
        tile.height = tile.ty1 - tile.ty0;
        tile.components = [];
        tiles.push(tile);
      }
    }

    context.tiles = tiles;
    var componentsCount = siz.Csiz;

    for (var i = 0, ii = componentsCount; i < ii; i++) {
      var component = components[i];

      for (var j = 0, jj = tiles.length; j < jj; j++) {
        var tileComponent = {};
        tile = tiles[j];
        tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);
        tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);
        tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);
        tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);
        tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;
        tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;
        tile.components[i] = tileComponent;
      }
    }
  }

  function getBlocksDimensions(context, component, r) {
    var codOrCoc = component.codingStyleParameters;
    var result = {};

    if (!codOrCoc.entropyCoderWithCustomPrecincts) {
      result.PPx = 15;
      result.PPy = 15;
    } else {
      result.PPx = codOrCoc.precinctsSizes[r].PPx;
      result.PPy = codOrCoc.precinctsSizes[r].PPy;
    }

    result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : Math.min(codOrCoc.xcb, result.PPx);
    result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : Math.min(codOrCoc.ycb, result.PPy);
    return result;
  }

  function buildPrecincts(context, resolution, dimensions) {
    var precinctWidth = 1 << dimensions.PPx;
    var precinctHeight = 1 << dimensions.PPy;
    var isZeroRes = resolution.resLevel === 0;
    var precinctWidthInSubband = 1 << dimensions.PPx + (isZeroRes ? 0 : -1);
    var precinctHeightInSubband = 1 << dimensions.PPy + (isZeroRes ? 0 : -1);
    var numprecinctswide = resolution.trx1 > resolution.trx0 ? Math.ceil(resolution.trx1 / precinctWidth) - Math.floor(resolution.trx0 / precinctWidth) : 0;
    var numprecinctshigh = resolution.try1 > resolution.try0 ? Math.ceil(resolution.try1 / precinctHeight) - Math.floor(resolution.try0 / precinctHeight) : 0;
    var numprecincts = numprecinctswide * numprecinctshigh;
    resolution.precinctParameters = {
      precinctWidth: precinctWidth,
      precinctHeight: precinctHeight,
      numprecinctswide: numprecinctswide,
      numprecinctshigh: numprecinctshigh,
      numprecincts: numprecincts,
      precinctWidthInSubband: precinctWidthInSubband,
      precinctHeightInSubband: precinctHeightInSubband
    };
  }

  function buildCodeblocks(context, subband, dimensions) {
    var xcb_ = dimensions.xcb_;
    var ycb_ = dimensions.ycb_;
    var codeblockWidth = 1 << xcb_;
    var codeblockHeight = 1 << ycb_;
    var cbx0 = subband.tbx0 >> xcb_;
    var cby0 = subband.tby0 >> ycb_;
    var cbx1 = subband.tbx1 + codeblockWidth - 1 >> xcb_;
    var cby1 = subband.tby1 + codeblockHeight - 1 >> ycb_;
    var precinctParameters = subband.resolution.precinctParameters;
    var codeblocks = [];
    var precincts = [];
    var i, j, codeblock, precinctNumber;

    for (j = cby0; j < cby1; j++) {
      for (i = cbx0; i < cbx1; i++) {
        codeblock = {
          cbx: i,
          cby: j,
          tbx0: codeblockWidth * i,
          tby0: codeblockHeight * j,
          tbx1: codeblockWidth * (i + 1),
          tby1: codeblockHeight * (j + 1)
        };
        codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);
        codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);
        codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);
        codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);
        var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / precinctParameters.precinctWidthInSubband);
        var pj = Math.floor((codeblock.tby0_ - subband.tby0) / precinctParameters.precinctHeightInSubband);
        precinctNumber = pi + pj * precinctParameters.numprecinctswide;
        codeblock.precinctNumber = precinctNumber;
        codeblock.subbandType = subband.type;
        codeblock.Lblock = 3;

        if (codeblock.tbx1_ <= codeblock.tbx0_ || codeblock.tby1_ <= codeblock.tby0_) {
          continue;
        }

        codeblocks.push(codeblock);
        var precinct = precincts[precinctNumber];

        if (precinct !== undefined) {
          if (i < precinct.cbxMin) {
            precinct.cbxMin = i;
          } else if (i > precinct.cbxMax) {
            precinct.cbxMax = i;
          }

          if (j < precinct.cbyMin) {
            precinct.cbxMin = j;
          } else if (j > precinct.cbyMax) {
            precinct.cbyMax = j;
          }
        } else {
          precincts[precinctNumber] = precinct = {
            cbxMin: i,
            cbyMin: j,
            cbxMax: i,
            cbyMax: j
          };
        }

        codeblock.precinct = precinct;
      }
    }

    subband.codeblockParameters = {
      codeblockWidth: xcb_,
      codeblockHeight: ycb_,
      numcodeblockwide: cbx1 - cbx0 + 1,
      numcodeblockhigh: cby1 - cby0 + 1
    };
    subband.codeblocks = codeblocks;
    subband.precincts = precincts;
  }

  function createPacket(resolution, precinctNumber, layerNumber) {
    var precinctCodeblocks = [];
    var subbands = resolution.subbands;

    for (var i = 0, ii = subbands.length; i < ii; i++) {
      var subband = subbands[i];
      var codeblocks = subband.codeblocks;

      for (var j = 0, jj = codeblocks.length; j < jj; j++) {
        var codeblock = codeblocks[j];

        if (codeblock.precinctNumber !== precinctNumber) {
          continue;
        }

        precinctCodeblocks.push(codeblock);
      }
    }

    return {
      layerNumber: layerNumber,
      codeblocks: precinctCodeblocks
    };
  }

  function LayerResolutionComponentPositionIterator(context) {
    var siz = context.SIZ;
    var tileIndex = context.currentTile.index;
    var tile = context.tiles[tileIndex];
    var layersCount = tile.codingStyleDefaultParameters.layersCount;
    var componentsCount = siz.Csiz;
    var maxDecompositionLevelsCount = 0;

    for (var q = 0; q < componentsCount; q++) {
      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount);
    }

    var l = 0,
        r = 0,
        i = 0,
        k = 0;

    this.nextPacket = function JpxImage_nextPacket() {
      for (; l < layersCount; l++) {
        for (; r <= maxDecompositionLevelsCount; r++) {
          for (; i < componentsCount; i++) {
            var component = tile.components[i];

            if (r > component.codingStyleParameters.decompositionLevelsCount) {
              continue;
            }

            var resolution = component.resolutions[r];
            var numprecincts = resolution.precinctParameters.numprecincts;

            for (; k < numprecincts;) {
              var packet = createPacket(resolution, k, l);
              k++;
              return packet;
            }

            k = 0;
          }

          i = 0;
        }

        r = 0;
      }

      throw new JpxError('Out of packets');
    };
  }

  function ResolutionLayerComponentPositionIterator(context) {
    var siz = context.SIZ;
    var tileIndex = context.currentTile.index;
    var tile = context.tiles[tileIndex];
    var layersCount = tile.codingStyleDefaultParameters.layersCount;
    var componentsCount = siz.Csiz;
    var maxDecompositionLevelsCount = 0;

    for (var q = 0; q < componentsCount; q++) {
      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount);
    }

    var r = 0,
        l = 0,
        i = 0,
        k = 0;

    this.nextPacket = function JpxImage_nextPacket() {
      for (; r <= maxDecompositionLevelsCount; r++) {
        for (; l < layersCount; l++) {
          for (; i < componentsCount; i++) {
            var component = tile.components[i];

            if (r > component.codingStyleParameters.decompositionLevelsCount) {
              continue;
            }

            var resolution = component.resolutions[r];
            var numprecincts = resolution.precinctParameters.numprecincts;

            for (; k < numprecincts;) {
              var packet = createPacket(resolution, k, l);
              k++;
              return packet;
            }

            k = 0;
          }

          i = 0;
        }

        l = 0;
      }

      throw new JpxError('Out of packets');
    };
  }

  function ResolutionPositionComponentLayerIterator(context) {
    var siz = context.SIZ;
    var tileIndex = context.currentTile.index;
    var tile = context.tiles[tileIndex];
    var layersCount = tile.codingStyleDefaultParameters.layersCount;
    var componentsCount = siz.Csiz;
    var l, r, c, p;
    var maxDecompositionLevelsCount = 0;

    for (c = 0; c < componentsCount; c++) {
      var component = tile.components[c];
      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, component.codingStyleParameters.decompositionLevelsCount);
    }

    var maxNumPrecinctsInLevel = new Int32Array(maxDecompositionLevelsCount + 1);

    for (r = 0; r <= maxDecompositionLevelsCount; ++r) {
      var maxNumPrecincts = 0;

      for (c = 0; c < componentsCount; ++c) {
        var resolutions = tile.components[c].resolutions;

        if (r < resolutions.length) {
          maxNumPrecincts = Math.max(maxNumPrecincts, resolutions[r].precinctParameters.numprecincts);
        }
      }

      maxNumPrecinctsInLevel[r] = maxNumPrecincts;
    }

    l = 0;
    r = 0;
    c = 0;
    p = 0;

    this.nextPacket = function JpxImage_nextPacket() {
      for (; r <= maxDecompositionLevelsCount; r++) {
        for (; p < maxNumPrecinctsInLevel[r]; p++) {
          for (; c < componentsCount; c++) {
            var component = tile.components[c];

            if (r > component.codingStyleParameters.decompositionLevelsCount) {
              continue;
            }

            var resolution = component.resolutions[r];
            var numprecincts = resolution.precinctParameters.numprecincts;

            if (p >= numprecincts) {
              continue;
            }

            for (; l < layersCount;) {
              var packet = createPacket(resolution, p, l);
              l++;
              return packet;
            }

            l = 0;
          }

          c = 0;
        }

        p = 0;
      }

      throw new JpxError('Out of packets');
    };
  }

  function PositionComponentResolutionLayerIterator(context) {
    var siz = context.SIZ;
    var tileIndex = context.currentTile.index;
    var tile = context.tiles[tileIndex];
    var layersCount = tile.codingStyleDefaultParameters.layersCount;
    var componentsCount = siz.Csiz;
    var precinctsSizes = getPrecinctSizesInImageScale(tile);
    var precinctsIterationSizes = precinctsSizes;
    var l = 0,
        r = 0,
        c = 0,
        px = 0,
        py = 0;

    this.nextPacket = function JpxImage_nextPacket() {
      for (; py < precinctsIterationSizes.maxNumHigh; py++) {
        for (; px < precinctsIterationSizes.maxNumWide; px++) {
          for (; c < componentsCount; c++) {
            var component = tile.components[c];
            var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;

            for (; r <= decompositionLevelsCount; r++) {
              var resolution = component.resolutions[r];
              var sizeInImageScale = precinctsSizes.components[c].resolutions[r];
              var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);

              if (k === null) {
                continue;
              }

              for (; l < layersCount;) {
                var packet = createPacket(resolution, k, l);
                l++;
                return packet;
              }

              l = 0;
            }

            r = 0;
          }

          c = 0;
        }

        px = 0;
      }

      throw new JpxError('Out of packets');
    };
  }

  function ComponentPositionResolutionLayerIterator(context) {
    var siz = context.SIZ;
    var tileIndex = context.currentTile.index;
    var tile = context.tiles[tileIndex];
    var layersCount = tile.codingStyleDefaultParameters.layersCount;
    var componentsCount = siz.Csiz;
    var precinctsSizes = getPrecinctSizesInImageScale(tile);
    var l = 0,
        r = 0,
        c = 0,
        px = 0,
        py = 0;

    this.nextPacket = function JpxImage_nextPacket() {
      for (; c < componentsCount; ++c) {
        var component = tile.components[c];
        var precinctsIterationSizes = precinctsSizes.components[c];
        var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;

        for (; py < precinctsIterationSizes.maxNumHigh; py++) {
          for (; px < precinctsIterationSizes.maxNumWide; px++) {
            for (; r <= decompositionLevelsCount; r++) {
              var resolution = component.resolutions[r];
              var sizeInImageScale = precinctsIterationSizes.resolutions[r];
              var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);

              if (k === null) {
                continue;
              }

              for (; l < layersCount;) {
                var packet = createPacket(resolution, k, l);
                l++;
                return packet;
              }

              l = 0;
            }

            r = 0;
          }

          px = 0;
        }

        py = 0;
      }

      throw new JpxError('Out of packets');
    };
  }

  function getPrecinctIndexIfExist(pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) {
    var posX = pxIndex * precinctIterationSizes.minWidth;
    var posY = pyIndex * precinctIterationSizes.minHeight;

    if (posX % sizeInImageScale.width !== 0 || posY % sizeInImageScale.height !== 0) {
      return null;
    }

    var startPrecinctRowIndex = posY / sizeInImageScale.width * resolution.precinctParameters.numprecinctswide;
    return posX / sizeInImageScale.height + startPrecinctRowIndex;
  }

  function getPrecinctSizesInImageScale(tile) {
    var componentsCount = tile.components.length;
    var minWidth = Number.MAX_VALUE;
    var minHeight = Number.MAX_VALUE;
    var maxNumWide = 0;
    var maxNumHigh = 0;
    var sizePerComponent = new Array(componentsCount);

    for (var c = 0; c < componentsCount; c++) {
      var component = tile.components[c];
      var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
      var sizePerResolution = new Array(decompositionLevelsCount + 1);
      var minWidthCurrentComponent = Number.MAX_VALUE;
      var minHeightCurrentComponent = Number.MAX_VALUE;
      var maxNumWideCurrentComponent = 0;
      var maxNumHighCurrentComponent = 0;
      var scale = 1;

      for (var r = decompositionLevelsCount; r >= 0; --r) {
        var resolution = component.resolutions[r];
        var widthCurrentResolution = scale * resolution.precinctParameters.precinctWidth;
        var heightCurrentResolution = scale * resolution.precinctParameters.precinctHeight;
        minWidthCurrentComponent = Math.min(minWidthCurrentComponent, widthCurrentResolution);
        minHeightCurrentComponent = Math.min(minHeightCurrentComponent, heightCurrentResolution);
        maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, resolution.precinctParameters.numprecinctswide);
        maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, resolution.precinctParameters.numprecinctshigh);
        sizePerResolution[r] = {
          width: widthCurrentResolution,
          height: heightCurrentResolution
        };
        scale <<= 1;
      }

      minWidth = Math.min(minWidth, minWidthCurrentComponent);
      minHeight = Math.min(minHeight, minHeightCurrentComponent);
      maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent);
      maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent);
      sizePerComponent[c] = {
        resolutions: sizePerResolution,
        minWidth: minWidthCurrentComponent,
        minHeight: minHeightCurrentComponent,
        maxNumWide: maxNumWideCurrentComponent,
        maxNumHigh: maxNumHighCurrentComponent
      };
    }

    return {
      components: sizePerComponent,
      minWidth: minWidth,
      minHeight: minHeight,
      maxNumWide: maxNumWide,
      maxNumHigh: maxNumHigh
    };
  }

  function buildPackets(context) {
    var siz = context.SIZ;
    var tileIndex = context.currentTile.index;
    var tile = context.tiles[tileIndex];
    var componentsCount = siz.Csiz;

    for (var c = 0; c < componentsCount; c++) {
      var component = tile.components[c];
      var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
      var resolutions = [];
      var subbands = [];

      for (var r = 0; r <= decompositionLevelsCount; r++) {
        var blocksDimensions = getBlocksDimensions(context, component, r);
        var resolution = {};
        var scale = 1 << decompositionLevelsCount - r;
        resolution.trx0 = Math.ceil(component.tcx0 / scale);
        resolution.try0 = Math.ceil(component.tcy0 / scale);
        resolution.trx1 = Math.ceil(component.tcx1 / scale);
        resolution.try1 = Math.ceil(component.tcy1 / scale);
        resolution.resLevel = r;
        buildPrecincts(context, resolution, blocksDimensions);
        resolutions.push(resolution);
        var subband;

        if (r === 0) {
          subband = {};
          subband.type = 'LL';
          subband.tbx0 = Math.ceil(component.tcx0 / scale);
          subband.tby0 = Math.ceil(component.tcy0 / scale);
          subband.tbx1 = Math.ceil(component.tcx1 / scale);
          subband.tby1 = Math.ceil(component.tcy1 / scale);
          subband.resolution = resolution;
          buildCodeblocks(context, subband, blocksDimensions);
          subbands.push(subband);
          resolution.subbands = [subband];
        } else {
          var bscale = 1 << decompositionLevelsCount - r + 1;
          var resolutionSubbands = [];
          subband = {};
          subband.type = 'HL';
          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
          subband.tby0 = Math.ceil(component.tcy0 / bscale);
          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
          subband.tby1 = Math.ceil(component.tcy1 / bscale);
          subband.resolution = resolution;
          buildCodeblocks(context, subband, blocksDimensions);
          subbands.push(subband);
          resolutionSubbands.push(subband);
          subband = {};
          subband.type = 'LH';
          subband.tbx0 = Math.ceil(component.tcx0 / bscale);
          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
          subband.tbx1 = Math.ceil(component.tcx1 / bscale);
          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
          subband.resolution = resolution;
          buildCodeblocks(context, subband, blocksDimensions);
          subbands.push(subband);
          resolutionSubbands.push(subband);
          subband = {};
          subband.type = 'HH';
          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
          subband.resolution = resolution;
          buildCodeblocks(context, subband, blocksDimensions);
          subbands.push(subband);
          resolutionSubbands.push(subband);
          resolution.subbands = resolutionSubbands;
        }
      }

      component.resolutions = resolutions;
      component.subbands = subbands;
    }

    var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;

    switch (progressionOrder) {
      case 0:
        tile.packetsIterator = new LayerResolutionComponentPositionIterator(context);
        break;

      case 1:
        tile.packetsIterator = new ResolutionLayerComponentPositionIterator(context);
        break;

      case 2:
        tile.packetsIterator = new ResolutionPositionComponentLayerIterator(context);
        break;

      case 3:
        tile.packetsIterator = new PositionComponentResolutionLayerIterator(context);
        break;

      case 4:
        tile.packetsIterator = new ComponentPositionResolutionLayerIterator(context);
        break;

      default:
        throw new JpxError("Unsupported progression order ".concat(progressionOrder));
    }
  }

  function parseTilePackets(context, data, offset, dataLength) {
    var position = 0;
    var buffer,
        bufferSize = 0,
        skipNextBit = false;

    function readBits(count) {
      while (bufferSize < count) {
        var b = data[offset + position];
        position++;

        if (skipNextBit) {
          buffer = buffer << 7 | b;
          bufferSize += 7;
          skipNextBit = false;
        } else {
          buffer = buffer << 8 | b;
          bufferSize += 8;
        }

        if (b === 0xFF) {
          skipNextBit = true;
        }
      }

      bufferSize -= count;
      return buffer >>> bufferSize & (1 << count) - 1;
    }

    function skipMarkerIfEqual(value) {
      if (data[offset + position - 1] === 0xFF && data[offset + position] === value) {
        skipBytes(1);
        return true;
      } else if (data[offset + position] === 0xFF && data[offset + position + 1] === value) {
        skipBytes(2);
        return true;
      }

      return false;
    }

    function skipBytes(count) {
      position += count;
    }

    function alignToByte() {
      bufferSize = 0;

      if (skipNextBit) {
        position++;
        skipNextBit = false;
      }
    }

    function readCodingpasses() {
      if (readBits(1) === 0) {
        return 1;
      }

      if (readBits(1) === 0) {
        return 2;
      }

      var value = readBits(2);

      if (value < 3) {
        return value + 3;
      }

      value = readBits(5);

      if (value < 31) {
        return value + 6;
      }

      value = readBits(7);
      return value + 37;
    }

    var tileIndex = context.currentTile.index;
    var tile = context.tiles[tileIndex];
    var sopMarkerUsed = context.COD.sopMarkerUsed;
    var ephMarkerUsed = context.COD.ephMarkerUsed;
    var packetsIterator = tile.packetsIterator;

    while (position < dataLength) {
      alignToByte();

      if (sopMarkerUsed && skipMarkerIfEqual(0x91)) {
        skipBytes(4);
      }

      var packet = packetsIterator.nextPacket();

      if (!readBits(1)) {
        continue;
      }

      var layerNumber = packet.layerNumber;
      var queue = [],
          codeblock;

      for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {
        codeblock = packet.codeblocks[i];
        var precinct = codeblock.precinct;
        var codeblockColumn = codeblock.cbx - precinct.cbxMin;
        var codeblockRow = codeblock.cby - precinct.cbyMin;
        var codeblockIncluded = false;
        var firstTimeInclusion = false;
        var valueReady;

        if (codeblock['included'] !== undefined) {
          codeblockIncluded = !!readBits(1);
        } else {
          precinct = codeblock.precinct;
          var inclusionTree, zeroBitPlanesTree;

          if (precinct['inclusionTree'] !== undefined) {
            inclusionTree = precinct.inclusionTree;
          } else {
            var width = precinct.cbxMax - precinct.cbxMin + 1;
            var height = precinct.cbyMax - precinct.cbyMin + 1;
            inclusionTree = new InclusionTree(width, height, layerNumber);
            zeroBitPlanesTree = new TagTree(width, height);
            precinct.inclusionTree = inclusionTree;
            precinct.zeroBitPlanesTree = zeroBitPlanesTree;
          }

          if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
            while (true) {
              if (readBits(1)) {
                valueReady = !inclusionTree.nextLevel();

                if (valueReady) {
                  codeblock.included = true;
                  codeblockIncluded = firstTimeInclusion = true;
                  break;
                }
              } else {
                inclusionTree.incrementValue(layerNumber);
                break;
              }
            }
          }
        }

        if (!codeblockIncluded) {
          continue;
        }

        if (firstTimeInclusion) {
          zeroBitPlanesTree = precinct.zeroBitPlanesTree;
          zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);

          while (true) {
            if (readBits(1)) {
              valueReady = !zeroBitPlanesTree.nextLevel();

              if (valueReady) {
                break;
              }
            } else {
              zeroBitPlanesTree.incrementValue();
            }
          }

          codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
        }

        var codingpasses = readCodingpasses();

        while (readBits(1)) {
          codeblock.Lblock++;
        }

        var codingpassesLog2 = (0, _util.log2)(codingpasses);
        var bits = (codingpasses < 1 << codingpassesLog2 ? codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;
        var codedDataLength = readBits(bits);
        queue.push({
          codeblock: codeblock,
          codingpasses: codingpasses,
          dataLength: codedDataLength
        });
      }

      alignToByte();

      if (ephMarkerUsed) {
        skipMarkerIfEqual(0x92);
      }

      while (queue.length > 0) {
        var packetItem = queue.shift();
        codeblock = packetItem.codeblock;

        if (codeblock['data'] === undefined) {
          codeblock.data = [];
        }

        codeblock.data.push({
          data: data,
          start: offset + position,
          end: offset + position + packetItem.dataLength,
          codingpasses: packetItem.codingpasses
        });
        position += packetItem.dataLength;
      }
    }

    return position;
  }

  function copyCoefficients(coefficients, levelWidth, levelHeight, subband, delta, mb, reversible, segmentationSymbolUsed) {
    var x0 = subband.tbx0;
    var y0 = subband.tby0;
    var width = subband.tbx1 - subband.tbx0;
    var codeblocks = subband.codeblocks;
    var right = subband.type.charAt(0) === 'H' ? 1 : 0;
    var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0;

    for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
      var codeblock = codeblocks[i];
      var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
      var blockHeight = codeblock.tby1_ - codeblock.tby0_;

      if (blockWidth === 0 || blockHeight === 0) {
        continue;
      }

      if (codeblock['data'] === undefined) {
        continue;
      }

      var bitModel, currentCodingpassType;
      bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, codeblock.zeroBitPlanes, mb);
      currentCodingpassType = 2;
      var data = codeblock.data,
          totalLength = 0,
          codingpasses = 0;
      var j, jj, dataItem;

      for (j = 0, jj = data.length; j < jj; j++) {
        dataItem = data[j];
        totalLength += dataItem.end - dataItem.start;
        codingpasses += dataItem.codingpasses;
      }

      var encodedData = new Uint8Array(totalLength);
      var position = 0;

      for (j = 0, jj = data.length; j < jj; j++) {
        dataItem = data[j];
        var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
        encodedData.set(chunk, position);
        position += chunk.length;
      }

      var decoder = new _arithmetic_decoder.ArithmeticDecoder(encodedData, 0, totalLength);
      bitModel.setDecoder(decoder);

      for (j = 0; j < codingpasses; j++) {
        switch (currentCodingpassType) {
          case 0:
            bitModel.runSignificancePropagationPass();
            break;

          case 1:
            bitModel.runMagnitudeRefinementPass();
            break;

          case 2:
            bitModel.runCleanupPass();

            if (segmentationSymbolUsed) {
              bitModel.checkSegmentationSymbol();
            }

            break;
        }

        currentCodingpassType = (currentCodingpassType + 1) % 3;
      }

      var offset = codeblock.tbx0_ - x0 + (codeblock.tby0_ - y0) * width;
      var sign = bitModel.coefficentsSign;
      var magnitude = bitModel.coefficentsMagnitude;
      var bitsDecoded = bitModel.bitsDecoded;
      var magnitudeCorrection = reversible ? 0 : 0.5;
      var k, n, nb;
      position = 0;
      var interleave = subband.type !== 'LL';

      for (j = 0; j < blockHeight; j++) {
        var row = offset / width | 0;
        var levelOffset = 2 * row * (levelWidth - width) + right + bottom;

        for (k = 0; k < blockWidth; k++) {
          n = magnitude[position];

          if (n !== 0) {
            n = (n + magnitudeCorrection) * delta;

            if (sign[position] !== 0) {
              n = -n;
            }

            nb = bitsDecoded[position];
            var pos = interleave ? levelOffset + (offset << 1) : offset;

            if (reversible && nb >= mb) {
              coefficients[pos] = n;
            } else {
              coefficients[pos] = n * (1 << mb - nb);
            }
          }

          offset++;
          position++;
        }

        offset += width - blockWidth;
      }
    }
  }

  function transformTile(context, tile, c) {
    var component = tile.components[c];
    var codingStyleParameters = component.codingStyleParameters;
    var quantizationParameters = component.quantizationParameters;
    var decompositionLevelsCount = codingStyleParameters.decompositionLevelsCount;
    var spqcds = quantizationParameters.SPqcds;
    var scalarExpounded = quantizationParameters.scalarExpounded;
    var guardBits = quantizationParameters.guardBits;
    var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;
    var precision = context.components[c].precision;
    var reversible = codingStyleParameters.reversibleTransformation;
    var transform = reversible ? new ReversibleTransform() : new IrreversibleTransform();
    var subbandCoefficients = [];
    var b = 0;

    for (var i = 0; i <= decompositionLevelsCount; i++) {
      var resolution = component.resolutions[i];
      var width = resolution.trx1 - resolution.trx0;
      var height = resolution.try1 - resolution.try0;
      var coefficients = new Float32Array(width * height);

      for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {
        var mu, epsilon;

        if (!scalarExpounded) {
          mu = spqcds[0].mu;
          epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
        } else {
          mu = spqcds[b].mu;
          epsilon = spqcds[b].epsilon;
          b++;
        }

        var subband = resolution.subbands[j];
        var gainLog2 = SubbandsGainLog2[subband.type];
        var delta = reversible ? 1 : Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048);
        var mb = guardBits + epsilon - 1;
        copyCoefficients(coefficients, width, height, subband, delta, mb, reversible, segmentationSymbolUsed);
      }

      subbandCoefficients.push({
        width: width,
        height: height,
        items: coefficients
      });
    }

    var result = transform.calculate(subbandCoefficients, component.tcx0, component.tcy0);
    return {
      left: component.tcx0,
      top: component.tcy0,
      width: result.width,
      height: result.height,
      items: result.items
    };
  }

  function transformComponents(context) {
    var siz = context.SIZ;
    var components = context.components;
    var componentsCount = siz.Csiz;
    var resultImages = [];

    for (var i = 0, ii = context.tiles.length; i < ii; i++) {
      var tile = context.tiles[i];
      var transformedTiles = [];
      var c;

      for (c = 0; c < componentsCount; c++) {
        transformedTiles[c] = transformTile(context, tile, c);
      }

      var tile0 = transformedTiles[0];
      var out = new Uint8ClampedArray(tile0.items.length * componentsCount);
      var result = {
        left: tile0.left,
        top: tile0.top,
        width: tile0.width,
        height: tile0.height,
        items: out
      };
      var shift, offset;
      var pos = 0,
          j,
          jj,
          y0,
          y1,
          y2;

      if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
        var fourComponents = componentsCount === 4;
        var y0items = transformedTiles[0].items;
        var y1items = transformedTiles[1].items;
        var y2items = transformedTiles[2].items;
        var y3items = fourComponents ? transformedTiles[3].items : null;
        shift = components[0].precision - 8;
        offset = (128 << shift) + 0.5;
        var component0 = tile.components[0];
        var alpha01 = componentsCount - 3;
        jj = y0items.length;

        if (!component0.codingStyleParameters.reversibleTransformation) {
          for (j = 0; j < jj; j++, pos += alpha01) {
            y0 = y0items[j] + offset;
            y1 = y1items[j];
            y2 = y2items[j];
            out[pos++] = y0 + 1.402 * y2 >> shift;
            out[pos++] = y0 - 0.34413 * y1 - 0.71414 * y2 >> shift;
            out[pos++] = y0 + 1.772 * y1 >> shift;
          }
        } else {
          for (j = 0; j < jj; j++, pos += alpha01) {
            y0 = y0items[j] + offset;
            y1 = y1items[j];
            y2 = y2items[j];
            var g = y0 - (y2 + y1 >> 2);
            out[pos++] = g + y2 >> shift;
            out[pos++] = g >> shift;
            out[pos++] = g + y1 >> shift;
          }
        }

        if (fourComponents) {
          for (j = 0, pos = 3; j < jj; j++, pos += 4) {
            out[pos] = y3items[j] + offset >> shift;
          }
        }
      } else {
        for (c = 0; c < componentsCount; c++) {
          var items = transformedTiles[c].items;
          shift = components[c].precision - 8;
          offset = (128 << shift) + 0.5;

          for (pos = c, j = 0, jj = items.length; j < jj; j++) {
            out[pos] = items[j] + offset >> shift;
            pos += componentsCount;
          }
        }
      }

      resultImages.push(result);
    }

    return resultImages;
  }

  function initializeTile(context, tileIndex) {
    var siz = context.SIZ;
    var componentsCount = siz.Csiz;
    var tile = context.tiles[tileIndex];

    for (var c = 0; c < componentsCount; c++) {
      var component = tile.components[c];
      var qcdOrQcc = context.currentTile.QCC[c] !== undefined ? context.currentTile.QCC[c] : context.currentTile.QCD;
      component.quantizationParameters = qcdOrQcc;
      var codOrCoc = context.currentTile.COC[c] !== undefined ? context.currentTile.COC[c] : context.currentTile.COD;
      component.codingStyleParameters = codOrCoc;
    }

    tile.codingStyleDefaultParameters = context.currentTile.COD;
  }

  var TagTree = function TagTreeClosure() {
    function TagTree(width, height) {
      var levelsLength = (0, _util.log2)(Math.max(width, height)) + 1;
      this.levels = [];

      for (var i = 0; i < levelsLength; i++) {
        var level = {
          width: width,
          height: height,
          items: []
        };
        this.levels.push(level);
        width = Math.ceil(width / 2);
        height = Math.ceil(height / 2);
      }
    }

    TagTree.prototype = {
      reset: function TagTree_reset(i, j) {
        var currentLevel = 0,
            value = 0,
            level;

        while (currentLevel < this.levels.length) {
          level = this.levels[currentLevel];
          var index = i + j * level.width;

          if (level.items[index] !== undefined) {
            value = level.items[index];
            break;
          }

          level.index = index;
          i >>= 1;
          j >>= 1;
          currentLevel++;
        }

        currentLevel--;
        level = this.levels[currentLevel];
        level.items[level.index] = value;
        this.currentLevel = currentLevel;
        delete this.value;
      },
      incrementValue: function TagTree_incrementValue() {
        var level = this.levels[this.currentLevel];
        level.items[level.index]++;
      },
      nextLevel: function TagTree_nextLevel() {
        var currentLevel = this.currentLevel;
        var level = this.levels[currentLevel];
        var value = level.items[level.index];
        currentLevel--;

        if (currentLevel < 0) {
          this.value = value;
          return false;
        }

        this.currentLevel = currentLevel;
        level = this.levels[currentLevel];
        level.items[level.index] = value;
        return true;
      }
    };
    return TagTree;
  }();

  var InclusionTree = function InclusionTreeClosure() {
    function InclusionTree(width, height, defaultValue) {
      var levelsLength = (0, _util.log2)(Math.max(width, height)) + 1;
      this.levels = [];

      for (var i = 0; i < levelsLength; i++) {
        var items = new Uint8Array(width * height);

        for (var j = 0, jj = items.length; j < jj; j++) {
          items[j] = defaultValue;
        }

        var level = {
          width: width,
          height: height,
          items: items
        };
        this.levels.push(level);
        width = Math.ceil(width / 2);
        height = Math.ceil(height / 2);
      }
    }

    InclusionTree.prototype = {
      reset: function InclusionTree_reset(i, j, stopValue) {
        var currentLevel = 0;

        while (currentLevel < this.levels.length) {
          var level = this.levels[currentLevel];
          var index = i + j * level.width;
          level.index = index;
          var value = level.items[index];

          if (value === 0xFF) {
            break;
          }

          if (value > stopValue) {
            this.currentLevel = currentLevel;
            this.propagateValues();
            return false;
          }

          i >>= 1;
          j >>= 1;
          currentLevel++;
        }

        this.currentLevel = currentLevel - 1;
        return true;
      },
      incrementValue: function InclusionTree_incrementValue(stopValue) {
        var level = this.levels[this.currentLevel];
        level.items[level.index] = stopValue + 1;
        this.propagateValues();
      },
      propagateValues: function InclusionTree_propagateValues() {
        var levelIndex = this.currentLevel;
        var level = this.levels[levelIndex];
        var currentValue = level.items[level.index];

        while (--levelIndex >= 0) {
          level = this.levels[levelIndex];
          level.items[level.index] = currentValue;
        }
      },
      nextLevel: function InclusionTree_nextLevel() {
        var currentLevel = this.currentLevel;
        var level = this.levels[currentLevel];
        var value = level.items[level.index];
        level.items[level.index] = 0xFF;
        currentLevel--;

        if (currentLevel < 0) {
          return false;
        }

        this.currentLevel = currentLevel;
        level = this.levels[currentLevel];
        level.items[level.index] = value;
        return true;
      }
    };
    return InclusionTree;
  }();

  var BitModel = function BitModelClosure() {
    var UNIFORM_CONTEXT = 17;
    var RUNLENGTH_CONTEXT = 18;
    var LLAndLHContextsLabel = new Uint8Array([0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8]);
    var HLContextLabel = new Uint8Array([0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8]);
    var HHContextLabel = new Uint8Array([0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8]);

    function BitModel(width, height, subband, zeroBitPlanes, mb) {
      this.width = width;
      this.height = height;
      this.contextLabelTable = subband === 'HH' ? HHContextLabel : subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel;
      var coefficientCount = width * height;
      this.neighborsSignificance = new Uint8Array(coefficientCount);
      this.coefficentsSign = new Uint8Array(coefficientCount);
      this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) : mb > 6 ? new Uint16Array(coefficientCount) : new Uint8Array(coefficientCount);
      this.processingFlags = new Uint8Array(coefficientCount);
      var bitsDecoded = new Uint8Array(coefficientCount);

      if (zeroBitPlanes !== 0) {
        for (var i = 0; i < coefficientCount; i++) {
          bitsDecoded[i] = zeroBitPlanes;
        }
      }

      this.bitsDecoded = bitsDecoded;
      this.reset();
    }

    BitModel.prototype = {
      setDecoder: function BitModel_setDecoder(decoder) {
        this.decoder = decoder;
      },
      reset: function BitModel_reset() {
        this.contexts = new Int8Array(19);
        this.contexts[0] = 4 << 1 | 0;
        this.contexts[UNIFORM_CONTEXT] = 46 << 1 | 0;
        this.contexts[RUNLENGTH_CONTEXT] = 3 << 1 | 0;
      },
      setNeighborsSignificance: function BitModel_setNeighborsSignificance(row, column, index) {
        var neighborsSignificance = this.neighborsSignificance;
        var width = this.width,
            height = this.height;
        var left = column > 0;
        var right = column + 1 < width;
        var i;

        if (row > 0) {
          i = index - width;

          if (left) {
            neighborsSignificance[i - 1] += 0x10;
          }

          if (right) {
            neighborsSignificance[i + 1] += 0x10;
          }

          neighborsSignificance[i] += 0x04;
        }

        if (row + 1 < height) {
          i = index + width;

          if (left) {
            neighborsSignificance[i - 1] += 0x10;
          }

          if (right) {
            neighborsSignificance[i + 1] += 0x10;
          }

          neighborsSignificance[i] += 0x04;
        }

        if (left) {
          neighborsSignificance[index - 1] += 0x01;
        }

        if (right) {
          neighborsSignificance[index + 1] += 0x01;
        }

        neighborsSignificance[index] |= 0x80;
      },
      runSignificancePropagationPass: function BitModel_runSignificancePropagationPass() {
        var decoder = this.decoder;
        var width = this.width,
            height = this.height;
        var coefficentsMagnitude = this.coefficentsMagnitude;
        var coefficentsSign = this.coefficentsSign;
        var neighborsSignificance = this.neighborsSignificance;
        var processingFlags = this.processingFlags;
        var contexts = this.contexts;
        var labels = this.contextLabelTable;
        var bitsDecoded = this.bitsDecoded;
        var processedInverseMask = ~1;
        var processedMask = 1;
        var firstMagnitudeBitMask = 2;

        for (var i0 = 0; i0 < height; i0 += 4) {
          for (var j = 0; j < width; j++) {
            var index = i0 * width + j;

            for (var i1 = 0; i1 < 4; i1++, index += width) {
              var i = i0 + i1;

              if (i >= height) {
                break;
              }

              processingFlags[index] &= processedInverseMask;

              if (coefficentsMagnitude[index] || !neighborsSignificance[index]) {
                continue;
              }

              var contextLabel = labels[neighborsSignificance[index]];
              var decision = decoder.readBit(contexts, contextLabel);

              if (decision) {
                var sign = this.decodeSignBit(i, j, index);
                coefficentsSign[index] = sign;
                coefficentsMagnitude[index] = 1;
                this.setNeighborsSignificance(i, j, index);
                processingFlags[index] |= firstMagnitudeBitMask;
              }

              bitsDecoded[index]++;
              processingFlags[index] |= processedMask;
            }
          }
        }
      },
      decodeSignBit: function BitModel_decodeSignBit(row, column, index) {
        var width = this.width,
            height = this.height;
        var coefficentsMagnitude = this.coefficentsMagnitude;
        var coefficentsSign = this.coefficentsSign;
        var contribution, sign0, sign1, significance1;
        var contextLabel, decoded;
        significance1 = column > 0 && coefficentsMagnitude[index - 1] !== 0;

        if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) {
          sign1 = coefficentsSign[index + 1];

          if (significance1) {
            sign0 = coefficentsSign[index - 1];
            contribution = 1 - sign1 - sign0;
          } else {
            contribution = 1 - sign1 - sign1;
          }
        } else if (significance1) {
          sign0 = coefficentsSign[index - 1];
          contribution = 1 - sign0 - sign0;
        } else {
          contribution = 0;
        }

        var horizontalContribution = 3 * contribution;
        significance1 = row > 0 && coefficentsMagnitude[index - width] !== 0;

        if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) {
          sign1 = coefficentsSign[index + width];

          if (significance1) {
            sign0 = coefficentsSign[index - width];
            contribution = 1 - sign1 - sign0 + horizontalContribution;
          } else {
            contribution = 1 - sign1 - sign1 + horizontalContribution;
          }
        } else if (significance1) {
          sign0 = coefficentsSign[index - width];
          contribution = 1 - sign0 - sign0 + horizontalContribution;
        } else {
          contribution = horizontalContribution;
        }

        if (contribution >= 0) {
          contextLabel = 9 + contribution;
          decoded = this.decoder.readBit(this.contexts, contextLabel);
        } else {
          contextLabel = 9 - contribution;
          decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1;
        }

        return decoded;
      },
      runMagnitudeRefinementPass: function BitModel_runMagnitudeRefinementPass() {
        var decoder = this.decoder;
        var width = this.width,
            height = this.height;
        var coefficentsMagnitude = this.coefficentsMagnitude;
        var neighborsSignificance = this.neighborsSignificance;
        var contexts = this.contexts;
        var bitsDecoded = this.bitsDecoded;
        var processingFlags = this.processingFlags;
        var processedMask = 1;
        var firstMagnitudeBitMask = 2;
        var length = width * height;
        var width4 = width * 4;

        for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) {
          indexNext = Math.min(length, index0 + width4);

          for (var j = 0; j < width; j++) {
            for (var index = index0 + j; index < indexNext; index += width) {
              if (!coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {
                continue;
              }

              var contextLabel = 16;

              if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) {
                processingFlags[index] ^= firstMagnitudeBitMask;
                var significance = neighborsSignificance[index] & 127;
                contextLabel = significance === 0 ? 15 : 14;
              }

              var bit = decoder.readBit(contexts, contextLabel);
              coefficentsMagnitude[index] = coefficentsMagnitude[index] << 1 | bit;
              bitsDecoded[index]++;
              processingFlags[index] |= processedMask;
            }
          }
        }
      },
      runCleanupPass: function BitModel_runCleanupPass() {
        var decoder = this.decoder;
        var width = this.width,
            height = this.height;
        var neighborsSignificance = this.neighborsSignificance;
        var coefficentsMagnitude = this.coefficentsMagnitude;
        var coefficentsSign = this.coefficentsSign;
        var contexts = this.contexts;
        var labels = this.contextLabelTable;
        var bitsDecoded = this.bitsDecoded;
        var processingFlags = this.processingFlags;
        var processedMask = 1;
        var firstMagnitudeBitMask = 2;
        var oneRowDown = width;
        var twoRowsDown = width * 2;
        var threeRowsDown = width * 3;
        var iNext;

        for (var i0 = 0; i0 < height; i0 = iNext) {
          iNext = Math.min(i0 + 4, height);
          var indexBase = i0 * width;
          var checkAllEmpty = i0 + 3 < height;

          for (var j = 0; j < width; j++) {
            var index0 = indexBase + j;
            var allEmpty = checkAllEmpty && processingFlags[index0] === 0 && processingFlags[index0 + oneRowDown] === 0 && processingFlags[index0 + twoRowsDown] === 0 && processingFlags[index0 + threeRowsDown] === 0 && neighborsSignificance[index0] === 0 && neighborsSignificance[index0 + oneRowDown] === 0 && neighborsSignificance[index0 + twoRowsDown] === 0 && neighborsSignificance[index0 + threeRowsDown] === 0;
            var i1 = 0,
                index = index0;
            var i = i0,
                sign;

            if (allEmpty) {
              var hasSignificantCoefficent = decoder.readBit(contexts, RUNLENGTH_CONTEXT);

              if (!hasSignificantCoefficent) {
                bitsDecoded[index0]++;
                bitsDecoded[index0 + oneRowDown]++;
                bitsDecoded[index0 + twoRowsDown]++;
                bitsDecoded[index0 + threeRowsDown]++;
                continue;
              }

              i1 = decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT);

              if (i1 !== 0) {
                i = i0 + i1;
                index += i1 * width;
              }

              sign = this.decodeSignBit(i, j, index);
              coefficentsSign[index] = sign;
              coefficentsMagnitude[index] = 1;
              this.setNeighborsSignificance(i, j, index);
              processingFlags[index] |= firstMagnitudeBitMask;
              index = index0;

              for (var i2 = i0; i2 <= i; i2++, index += width) {
                bitsDecoded[index]++;
              }

              i1++;
            }

            for (i = i0 + i1; i < iNext; i++, index += width) {
              if (coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {
                continue;
              }

              var contextLabel = labels[neighborsSignificance[index]];
              var decision = decoder.readBit(contexts, contextLabel);

              if (decision === 1) {
                sign = this.decodeSignBit(i, j, index);
                coefficentsSign[index] = sign;
                coefficentsMagnitude[index] = 1;
                this.setNeighborsSignificance(i, j, index);
                processingFlags[index] |= firstMagnitudeBitMask;
              }

              bitsDecoded[index]++;
            }
          }
        }
      },
      checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {
        var decoder = this.decoder;
        var contexts = this.contexts;
        var symbol = decoder.readBit(contexts, UNIFORM_CONTEXT) << 3 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 2 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT);

        if (symbol !== 0xA) {
          throw new JpxError('Invalid segmentation symbol');
        }
      }
    };
    return BitModel;
  }();

  var Transform = function TransformClosure() {
    function Transform() {}

    Transform.prototype.calculate = function transformCalculate(subbands, u0, v0) {
      var ll = subbands[0];

      for (var i = 1, ii = subbands.length; i < ii; i++) {
        ll = this.iterate(ll, subbands[i], u0, v0);
      }

      return ll;
    };

    Transform.prototype.extend = function extend(buffer, offset, size) {
      var i1 = offset - 1,
          j1 = offset + 1;
      var i2 = offset + size - 2,
          j2 = offset + size;
      buffer[i1--] = buffer[j1++];
      buffer[j2++] = buffer[i2--];
      buffer[i1--] = buffer[j1++];
      buffer[j2++] = buffer[i2--];
      buffer[i1--] = buffer[j1++];
      buffer[j2++] = buffer[i2--];
      buffer[i1] = buffer[j1];
      buffer[j2] = buffer[i2];
    };

    Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, u0, v0) {
      var llWidth = ll.width,
          llHeight = ll.height,
          llItems = ll.items;
      var width = hl_lh_hh.width;
      var height = hl_lh_hh.height;
      var items = hl_lh_hh.items;
      var i, j, k, l, u, v;

      for (k = 0, i = 0; i < llHeight; i++) {
        l = i * 2 * width;

        for (j = 0; j < llWidth; j++, k++, l += 2) {
          items[l] = llItems[k];
        }
      }

      llItems = ll.items = null;
      var bufferPadding = 4;
      var rowBuffer = new Float32Array(width + 2 * bufferPadding);

      if (width === 1) {
        if ((u0 & 1) !== 0) {
          for (v = 0, k = 0; v < height; v++, k += width) {
            items[k] *= 0.5;
          }
        }
      } else {
        for (v = 0, k = 0; v < height; v++, k += width) {
          rowBuffer.set(items.subarray(k, k + width), bufferPadding);
          this.extend(rowBuffer, bufferPadding, width);
          this.filter(rowBuffer, bufferPadding, width);
          items.set(rowBuffer.subarray(bufferPadding, bufferPadding + width), k);
        }
      }

      var numBuffers = 16;
      var colBuffers = [];

      for (i = 0; i < numBuffers; i++) {
        colBuffers.push(new Float32Array(height + 2 * bufferPadding));
      }

      var b,
          currentBuffer = 0;
      ll = bufferPadding + height;

      if (height === 1) {
        if ((v0 & 1) !== 0) {
          for (u = 0; u < width; u++) {
            items[u] *= 0.5;
          }
        }
      } else {
        for (u = 0; u < width; u++) {
          if (currentBuffer === 0) {
            numBuffers = Math.min(width - u, numBuffers);

            for (k = u, l = bufferPadding; l < ll; k += width, l++) {
              for (b = 0; b < numBuffers; b++) {
                colBuffers[b][l] = items[k + b];
              }
            }

            currentBuffer = numBuffers;
          }

          currentBuffer--;
          var buffer = colBuffers[currentBuffer];
          this.extend(buffer, bufferPadding, height);
          this.filter(buffer, bufferPadding, height);

          if (currentBuffer === 0) {
            k = u - numBuffers + 1;

            for (l = bufferPadding; l < ll; k += width, l++) {
              for (b = 0; b < numBuffers; b++) {
                items[k + b] = colBuffers[b][l];
              }
            }
          }
        }
      }

      return {
        width: width,
        height: height,
        items: items
      };
    };

    return Transform;
  }();

  var IrreversibleTransform = function IrreversibleTransformClosure() {
    function IrreversibleTransform() {
      Transform.call(this);
    }

    IrreversibleTransform.prototype = Object.create(Transform.prototype);

    IrreversibleTransform.prototype.filter = function irreversibleTransformFilter(x, offset, length) {
      var len = length >> 1;
      offset = offset | 0;
      var j, n, current, next;
      var alpha = -1.586134342059924;
      var beta = -0.052980118572961;
      var gamma = 0.882911075530934;
      var delta = 0.443506852043971;
      var K = 1.230174104914001;
      var K_ = 1 / K;
      j = offset - 3;

      for (n = len + 4; n--; j += 2) {
        x[j] *= K_;
      }

      j = offset - 2;
      current = delta * x[j - 1];

      for (n = len + 3; n--; j += 2) {
        next = delta * x[j + 1];
        x[j] = K * x[j] - current - next;

        if (n--) {
          j += 2;
          current = delta * x[j + 1];
          x[j] = K * x[j] - current - next;
        } else {
          break;
        }
      }

      j = offset - 1;
      current = gamma * x[j - 1];

      for (n = len + 2; n--; j += 2) {
        next = gamma * x[j + 1];
        x[j] -= current + next;

        if (n--) {
          j += 2;
          current = gamma * x[j + 1];
          x[j] -= current + next;
        } else {
          break;
        }
      }

      j = offset;
      current = beta * x[j - 1];

      for (n = len + 1; n--; j += 2) {
        next = beta * x[j + 1];
        x[j] -= current + next;

        if (n--) {
          j += 2;
          current = beta * x[j + 1];
          x[j] -= current + next;
        } else {
          break;
        }
      }

      if (len !== 0) {
        j = offset + 1;
        current = alpha * x[j - 1];

        for (n = len; n--; j += 2) {
          next = alpha * x[j + 1];
          x[j] -= current + next;

          if (n--) {
            j += 2;
            current = alpha * x[j + 1];
            x[j] -= current + next;
          } else {
            break;
          }
        }
      }
    };

    return IrreversibleTransform;
  }();

  var ReversibleTransform = function ReversibleTransformClosure() {
    function ReversibleTransform() {
      Transform.call(this);
    }

    ReversibleTransform.prototype = Object.create(Transform.prototype);

    ReversibleTransform.prototype.filter = function reversibleTransformFilter(x, offset, length) {
      var len = length >> 1;
      offset = offset | 0;
      var j, n;

      for (j = offset, n = len + 1; n--; j += 2) {
        x[j] -= x[j - 1] + x[j + 1] + 2 >> 2;
      }

      for (j = offset + 1, n = len; n--; j += 2) {
        x[j] += x[j - 1] + x[j + 1] >> 1;
      }
    };

    return ReversibleTransform;
  }();

  return JpxImage;
}();

exports.JpxImage = JpxImage;

/***/ }),
/* 167 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.calculateSHA512 = exports.calculateSHA384 = exports.calculateSHA256 = exports.calculateMD5 = exports.PDF20 = exports.PDF17 = exports.CipherTransformFactory = exports.ARCFourCipher = exports.AES256Cipher = exports.AES128Cipher = void 0;

var _util = __w_pdfjs_require__(6);

var _primitives = __w_pdfjs_require__(155);

var _stream = __w_pdfjs_require__(157);

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var ARCFourCipher = function ARCFourCipherClosure() {
  function ARCFourCipher(key) {
    this.a = 0;
    this.b = 0;
    var s = new Uint8Array(256);
    var i,
        j = 0,
        tmp,
        keyLength = key.length;

    for (i = 0; i < 256; ++i) {
      s[i] = i;
    }

    for (i = 0; i < 256; ++i) {
      tmp = s[i];
      j = j + tmp + key[i % keyLength] & 0xFF;
      s[i] = s[j];
      s[j] = tmp;
    }

    this.s = s;
  }

  ARCFourCipher.prototype = {
    encryptBlock: function ARCFourCipher_encryptBlock(data) {
      var i,
          n = data.length,
          tmp,
          tmp2;
      var a = this.a,
          b = this.b,
          s = this.s;
      var output = new Uint8Array(n);

      for (i = 0; i < n; ++i) {
        a = a + 1 & 0xFF;
        tmp = s[a];
        b = b + tmp & 0xFF;
        tmp2 = s[b];
        s[a] = tmp2;
        s[b] = tmp;
        output[i] = data[i] ^ s[tmp + tmp2 & 0xFF];
      }

      this.a = a;
      this.b = b;
      return output;
    }
  };
  ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
  return ARCFourCipher;
}();

exports.ARCFourCipher = ARCFourCipher;

var calculateMD5 = function calculateMD5Closure() {
  var r = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
  var k = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551]);

  function hash(data, offset, length) {
    var h0 = 1732584193,
        h1 = -271733879,
        h2 = -1732584194,
        h3 = 271733878;
    var paddedLength = length + 72 & ~63;
    var padded = new Uint8Array(paddedLength);
    var i, j, n;

    for (i = 0; i < length; ++i) {
      padded[i] = data[offset++];
    }

    padded[i++] = 0x80;
    n = paddedLength - 8;

    while (i < n) {
      padded[i++] = 0;
    }

    padded[i++] = length << 3 & 0xFF;
    padded[i++] = length >> 5 & 0xFF;
    padded[i++] = length >> 13 & 0xFF;
    padded[i++] = length >> 21 & 0xFF;
    padded[i++] = length >>> 29 & 0xFF;
    padded[i++] = 0;
    padded[i++] = 0;
    padded[i++] = 0;
    var w = new Int32Array(16);

    for (i = 0; i < paddedLength;) {
      for (j = 0; j < 16; ++j, i += 4) {
        w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24;
      }

      var a = h0,
          b = h1,
          c = h2,
          d = h3,
          f,
          g;

      for (j = 0; j < 64; ++j) {
        if (j < 16) {
          f = b & c | ~b & d;
          g = j;
        } else if (j < 32) {
          f = d & b | ~d & c;
          g = 5 * j + 1 & 15;
        } else if (j < 48) {
          f = b ^ c ^ d;
          g = 3 * j + 5 & 15;
        } else {
          f = c ^ (b | ~d);
          g = 7 * j & 15;
        }

        var tmp = d,
            rotateArg = a + f + k[j] + w[g] | 0,
            rotate = r[j];
        d = c;
        c = b;
        b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0;
        a = tmp;
      }

      h0 = h0 + a | 0;
      h1 = h1 + b | 0;
      h2 = h2 + c | 0;
      h3 = h3 + d | 0;
    }

    return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]);
  }

  return hash;
}();

exports.calculateMD5 = calculateMD5;

var Word64 = function Word64Closure() {
  function Word64(highInteger, lowInteger) {
    this.high = highInteger | 0;
    this.low = lowInteger | 0;
  }

  Word64.prototype = {
    and: function Word64_and(word) {
      this.high &= word.high;
      this.low &= word.low;
    },
    xor: function Word64_xor(word) {
      this.high ^= word.high;
      this.low ^= word.low;
    },
    or: function Word64_or(word) {
      this.high |= word.high;
      this.low |= word.low;
    },
    shiftRight: function Word64_shiftRight(places) {
      if (places >= 32) {
        this.low = this.high >>> places - 32 | 0;
        this.high = 0;
      } else {
        this.low = this.low >>> places | this.high << 32 - places;
        this.high = this.high >>> places | 0;
      }
    },
    shiftLeft: function Word64_shiftLeft(places) {
      if (places >= 32) {
        this.high = this.low << places - 32;
        this.low = 0;
      } else {
        this.high = this.high << places | this.low >>> 32 - places;
        this.low = this.low << places;
      }
    },
    rotateRight: function Word64_rotateRight(places) {
      var low, high;

      if (places & 32) {
        high = this.low;
        low = this.high;
      } else {
        low = this.low;
        high = this.high;
      }

      places &= 31;
      this.low = low >>> places | high << 32 - places;
      this.high = high >>> places | low << 32 - places;
    },
    not: function Word64_not() {
      this.high = ~this.high;
      this.low = ~this.low;
    },
    add: function Word64_add(word) {
      var lowAdd = (this.low >>> 0) + (word.low >>> 0);
      var highAdd = (this.high >>> 0) + (word.high >>> 0);

      if (lowAdd > 0xFFFFFFFF) {
        highAdd += 1;
      }

      this.low = lowAdd | 0;
      this.high = highAdd | 0;
    },
    copyTo: function Word64_copyTo(bytes, offset) {
      bytes[offset] = this.high >>> 24 & 0xFF;
      bytes[offset + 1] = this.high >> 16 & 0xFF;
      bytes[offset + 2] = this.high >> 8 & 0xFF;
      bytes[offset + 3] = this.high & 0xFF;
      bytes[offset + 4] = this.low >>> 24 & 0xFF;
      bytes[offset + 5] = this.low >> 16 & 0xFF;
      bytes[offset + 6] = this.low >> 8 & 0xFF;
      bytes[offset + 7] = this.low & 0xFF;
    },
    assign: function Word64_assign(word) {
      this.high = word.high;
      this.low = word.low;
    }
  };
  return Word64;
}();

var calculateSHA256 = function calculateSHA256Closure() {
  function rotr(x, n) {
    return x >>> n | x << 32 - n;
  }

  function ch(x, y, z) {
    return x & y ^ ~x & z;
  }

  function maj(x, y, z) {
    return x & y ^ x & z ^ y & z;
  }

  function sigma(x) {
    return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
  }

  function sigmaPrime(x) {
    return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
  }

  function littleSigma(x) {
    return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;
  }

  function littleSigmaPrime(x) {
    return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;
  }

  var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];

  function hash(data, offset, length) {
    var h0 = 0x6a09e667,
        h1 = 0xbb67ae85,
        h2 = 0x3c6ef372,
        h3 = 0xa54ff53a,
        h4 = 0x510e527f,
        h5 = 0x9b05688c,
        h6 = 0x1f83d9ab,
        h7 = 0x5be0cd19;
    var paddedLength = Math.ceil((length + 9) / 64) * 64;
    var padded = new Uint8Array(paddedLength);
    var i, j, n;

    for (i = 0; i < length; ++i) {
      padded[i] = data[offset++];
    }

    padded[i++] = 0x80;
    n = paddedLength - 8;

    while (i < n) {
      padded[i++] = 0;
    }

    padded[i++] = 0;
    padded[i++] = 0;
    padded[i++] = 0;
    padded[i++] = length >>> 29 & 0xFF;
    padded[i++] = length >> 21 & 0xFF;
    padded[i++] = length >> 13 & 0xFF;
    padded[i++] = length >> 5 & 0xFF;
    padded[i++] = length << 3 & 0xFF;
    var w = new Uint32Array(64);

    for (i = 0; i < paddedLength;) {
      for (j = 0; j < 16; ++j) {
        w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
        i += 4;
      }

      for (j = 16; j < 64; ++j) {
        w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0;
      }

      var a = h0,
          b = h1,
          c = h2,
          d = h3,
          e = h4,
          f = h5,
          g = h6,
          h = h7,
          t1,
          t2;

      for (j = 0; j < 64; ++j) {
        t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];
        t2 = sigma(a) + maj(a, b, c);
        h = g;
        g = f;
        f = e;
        e = d + t1 | 0;
        d = c;
        c = b;
        b = a;
        a = t1 + t2 | 0;
      }

      h0 = h0 + a | 0;
      h1 = h1 + b | 0;
      h2 = h2 + c | 0;
      h3 = h3 + d | 0;
      h4 = h4 + e | 0;
      h5 = h5 + f | 0;
      h6 = h6 + g | 0;
      h7 = h7 + h | 0;
    }

    return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]);
  }

  return hash;
}();

exports.calculateSHA256 = calculateSHA256;

var calculateSHA512 = function calculateSHA512Closure() {
  function ch(result, x, y, z, tmp) {
    result.assign(x);
    result.and(y);
    tmp.assign(x);
    tmp.not();
    tmp.and(z);
    result.xor(tmp);
  }

  function maj(result, x, y, z, tmp) {
    result.assign(x);
    result.and(y);
    tmp.assign(x);
    tmp.and(z);
    result.xor(tmp);
    tmp.assign(y);
    tmp.and(z);
    result.xor(tmp);
  }

  function sigma(result, x, tmp) {
    result.assign(x);
    result.rotateRight(28);
    tmp.assign(x);
    tmp.rotateRight(34);
    result.xor(tmp);
    tmp.assign(x);
    tmp.rotateRight(39);
    result.xor(tmp);
  }

  function sigmaPrime(result, x, tmp) {
    result.assign(x);
    result.rotateRight(14);
    tmp.assign(x);
    tmp.rotateRight(18);
    result.xor(tmp);
    tmp.assign(x);
    tmp.rotateRight(41);
    result.xor(tmp);
  }

  function littleSigma(result, x, tmp) {
    result.assign(x);
    result.rotateRight(1);
    tmp.assign(x);
    tmp.rotateRight(8);
    result.xor(tmp);
    tmp.assign(x);
    tmp.shiftRight(7);
    result.xor(tmp);
  }

  function littleSigmaPrime(result, x, tmp) {
    result.assign(x);
    result.rotateRight(19);
    tmp.assign(x);
    tmp.rotateRight(61);
    result.xor(tmp);
    tmp.assign(x);
    tmp.shiftRight(6);
    result.xor(tmp);
  }

  var k = [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)];

  function hash(data, offset, length, mode384) {
    mode384 = !!mode384;
    var h0, h1, h2, h3, h4, h5, h6, h7;

    if (!mode384) {
      h0 = new Word64(0x6a09e667, 0xf3bcc908);
      h1 = new Word64(0xbb67ae85, 0x84caa73b);
      h2 = new Word64(0x3c6ef372, 0xfe94f82b);
      h3 = new Word64(0xa54ff53a, 0x5f1d36f1);
      h4 = new Word64(0x510e527f, 0xade682d1);
      h5 = new Word64(0x9b05688c, 0x2b3e6c1f);
      h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);
      h7 = new Word64(0x5be0cd19, 0x137e2179);
    } else {
      h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);
      h1 = new Word64(0x629a292a, 0x367cd507);
      h2 = new Word64(0x9159015a, 0x3070dd17);
      h3 = new Word64(0x152fecd8, 0xf70e5939);
      h4 = new Word64(0x67332667, 0xffc00b31);
      h5 = new Word64(0x8eb44a87, 0x68581511);
      h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);
      h7 = new Word64(0x47b5481d, 0xbefa4fa4);
    }

    var paddedLength = Math.ceil((length + 17) / 128) * 128;
    var padded = new Uint8Array(paddedLength);
    var i, j, n;

    for (i = 0; i < length; ++i) {
      padded[i] = data[offset++];
    }

    padded[i++] = 0x80;
    n = paddedLength - 16;

    while (i < n) {
      padded[i++] = 0;
    }

    padded[i++] = 0;
    padded[i++] = 0;
    padded[i++] = 0;
    padded[i++] = 0;
    padded[i++] = 0;
    padded[i++] = 0;
    padded[i++] = 0;
    padded[i++] = 0;
    padded[i++] = 0;
    padded[i++] = 0;
    padded[i++] = 0;
    padded[i++] = length >>> 29 & 0xFF;
    padded[i++] = length >> 21 & 0xFF;
    padded[i++] = length >> 13 & 0xFF;
    padded[i++] = length >> 5 & 0xFF;
    padded[i++] = length << 3 & 0xFF;
    var w = new Array(80);

    for (i = 0; i < 80; i++) {
      w[i] = new Word64(0, 0);
    }

    var a = new Word64(0, 0),
        b = new Word64(0, 0),
        c = new Word64(0, 0);
    var d = new Word64(0, 0),
        e = new Word64(0, 0),
        f = new Word64(0, 0);
    var g = new Word64(0, 0),
        h = new Word64(0, 0);
    var t1 = new Word64(0, 0),
        t2 = new Word64(0, 0);
    var tmp1 = new Word64(0, 0),
        tmp2 = new Word64(0, 0),
        tmp3;

    for (i = 0; i < paddedLength;) {
      for (j = 0; j < 16; ++j) {
        w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
        w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7];
        i += 8;
      }

      for (j = 16; j < 80; ++j) {
        tmp3 = w[j];
        littleSigmaPrime(tmp3, w[j - 2], tmp2);
        tmp3.add(w[j - 7]);
        littleSigma(tmp1, w[j - 15], tmp2);
        tmp3.add(tmp1);
        tmp3.add(w[j - 16]);
      }

      a.assign(h0);
      b.assign(h1);
      c.assign(h2);
      d.assign(h3);
      e.assign(h4);
      f.assign(h5);
      g.assign(h6);
      h.assign(h7);

      for (j = 0; j < 80; ++j) {
        t1.assign(h);
        sigmaPrime(tmp1, e, tmp2);
        t1.add(tmp1);
        ch(tmp1, e, f, g, tmp2);
        t1.add(tmp1);
        t1.add(k[j]);
        t1.add(w[j]);
        sigma(t2, a, tmp2);
        maj(tmp1, a, b, c, tmp2);
        t2.add(tmp1);
        tmp3 = h;
        h = g;
        g = f;
        f = e;
        d.add(t1);
        e = d;
        d = c;
        c = b;
        b = a;
        tmp3.assign(t1);
        tmp3.add(t2);
        a = tmp3;
      }

      h0.add(a);
      h1.add(b);
      h2.add(c);
      h3.add(d);
      h4.add(e);
      h5.add(f);
      h6.add(g);
      h7.add(h);
    }

    var result;

    if (!mode384) {
      result = new Uint8Array(64);
      h0.copyTo(result, 0);
      h1.copyTo(result, 8);
      h2.copyTo(result, 16);
      h3.copyTo(result, 24);
      h4.copyTo(result, 32);
      h5.copyTo(result, 40);
      h6.copyTo(result, 48);
      h7.copyTo(result, 56);
    } else {
      result = new Uint8Array(48);
      h0.copyTo(result, 0);
      h1.copyTo(result, 8);
      h2.copyTo(result, 16);
      h3.copyTo(result, 24);
      h4.copyTo(result, 32);
      h5.copyTo(result, 40);
    }

    return result;
  }

  return hash;
}();

exports.calculateSHA512 = calculateSHA512;

var calculateSHA384 = function calculateSHA384Closure() {
  function hash(data, offset, length) {
    return calculateSHA512(data, offset, length, true);
  }

  return hash;
}();

exports.calculateSHA384 = calculateSHA384;

var NullCipher = function NullCipherClosure() {
  function NullCipher() {}

  NullCipher.prototype = {
    decryptBlock: function NullCipher_decryptBlock(data) {
      return data;
    }
  };
  return NullCipher;
}();

var AESBaseCipher =
/*#__PURE__*/
function () {
  function AESBaseCipher() {
    _classCallCheck(this, AESBaseCipher);

    if (this.constructor === AESBaseCipher) {
      (0, _util.unreachable)('Cannot initialize AESBaseCipher.');
    }

    this._s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]);
    this._inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]);
    this._mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
    this._mixCol = new Uint8Array(256);

    for (var i = 0; i < 256; i++) {
      if (i < 128) {
        this._mixCol[i] = i << 1;
      } else {
        this._mixCol[i] = i << 1 ^ 0x1b;
      }
    }

    this.buffer = new Uint8Array(16);
    this.bufferPosition = 0;
  }

  _createClass(AESBaseCipher, [{
    key: "_expandKey",
    value: function _expandKey(cipherKey) {
      (0, _util.unreachable)('Cannot call `_expandKey` on the base class');
    }
  }, {
    key: "_decrypt",
    value: function _decrypt(input, key) {
      var t, u, v;
      var state = new Uint8Array(16);
      state.set(input);

      for (var j = 0, k = this._keySize; j < 16; ++j, ++k) {
        state[j] ^= key[k];
      }

      for (var i = this._cyclesOfRepetition - 1; i >= 1; --i) {
        t = state[13];
        state[13] = state[9];
        state[9] = state[5];
        state[5] = state[1];
        state[1] = t;
        t = state[14];
        u = state[10];
        state[14] = state[6];
        state[10] = state[2];
        state[6] = t;
        state[2] = u;
        t = state[15];
        u = state[11];
        v = state[7];
        state[15] = state[3];
        state[11] = t;
        state[7] = u;
        state[3] = v;

        for (var _j = 0; _j < 16; ++_j) {
          state[_j] = this._inv_s[state[_j]];
        }

        for (var _j2 = 0, _k = i * 16; _j2 < 16; ++_j2, ++_k) {
          state[_j2] ^= key[_k];
        }

        for (var _j3 = 0; _j3 < 16; _j3 += 4) {
          var s0 = this._mix[state[_j3]];
          var s1 = this._mix[state[_j3 + 1]];
          var s2 = this._mix[state[_j3 + 2]];
          var s3 = this._mix[state[_j3 + 3]];
          t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8;
          state[_j3] = t >>> 24 & 0xFF;
          state[_j3 + 1] = t >> 16 & 0xFF;
          state[_j3 + 2] = t >> 8 & 0xFF;
          state[_j3 + 3] = t & 0xFF;
        }
      }

      t = state[13];
      state[13] = state[9];
      state[9] = state[5];
      state[5] = state[1];
      state[1] = t;
      t = state[14];
      u = state[10];
      state[14] = state[6];
      state[10] = state[2];
      state[6] = t;
      state[2] = u;
      t = state[15];
      u = state[11];
      v = state[7];
      state[15] = state[3];
      state[11] = t;
      state[7] = u;
      state[3] = v;

      for (var _j4 = 0; _j4 < 16; ++_j4) {
        state[_j4] = this._inv_s[state[_j4]];
        state[_j4] ^= key[_j4];
      }

      return state;
    }
  }, {
    key: "_encrypt",
    value: function _encrypt(input, key) {
      var s = this._s;
      var t, u, v;
      var state = new Uint8Array(16);
      state.set(input);

      for (var j = 0; j < 16; ++j) {
        state[j] ^= key[j];
      }

      for (var i = 1; i < this._cyclesOfRepetition; i++) {
        for (var _j5 = 0; _j5 < 16; ++_j5) {
          state[_j5] = s[state[_j5]];
        }

        v = state[1];
        state[1] = state[5];
        state[5] = state[9];
        state[9] = state[13];
        state[13] = v;
        v = state[2];
        u = state[6];
        state[2] = state[10];
        state[6] = state[14];
        state[10] = v;
        state[14] = u;
        v = state[3];
        u = state[7];
        t = state[11];
        state[3] = state[15];
        state[7] = v;
        state[11] = u;
        state[15] = t;

        for (var _j6 = 0; _j6 < 16; _j6 += 4) {
          var s0 = state[_j6 + 0];
          var s1 = state[_j6 + 1];
          var s2 = state[_j6 + 2];
          var s3 = state[_j6 + 3];
          t = s0 ^ s1 ^ s2 ^ s3;
          state[_j6 + 0] ^= t ^ this._mixCol[s0 ^ s1];
          state[_j6 + 1] ^= t ^ this._mixCol[s1 ^ s2];
          state[_j6 + 2] ^= t ^ this._mixCol[s2 ^ s3];
          state[_j6 + 3] ^= t ^ this._mixCol[s3 ^ s0];
        }

        for (var _j7 = 0, k = i * 16; _j7 < 16; ++_j7, ++k) {
          state[_j7] ^= key[k];
        }
      }

      for (var _j8 = 0; _j8 < 16; ++_j8) {
        state[_j8] = s[state[_j8]];
      }

      v = state[1];
      state[1] = state[5];
      state[5] = state[9];
      state[9] = state[13];
      state[13] = v;
      v = state[2];
      u = state[6];
      state[2] = state[10];
      state[6] = state[14];
      state[10] = v;
      state[14] = u;
      v = state[3];
      u = state[7];
      t = state[11];
      state[3] = state[15];
      state[7] = v;
      state[11] = u;
      state[15] = t;

      for (var _j9 = 0, _k2 = this._keySize; _j9 < 16; ++_j9, ++_k2) {
        state[_j9] ^= key[_k2];
      }

      return state;
    }
  }, {
    key: "_decryptBlock2",
    value: function _decryptBlock2(data, finalize) {
      var sourceLength = data.length;
      var buffer = this.buffer,
          bufferLength = this.bufferPosition;
      var result = [],
          iv = this.iv;

      for (var i = 0; i < sourceLength; ++i) {
        buffer[bufferLength] = data[i];
        ++bufferLength;

        if (bufferLength < 16) {
          continue;
        }

        var plain = this._decrypt(buffer, this._key);

        for (var j = 0; j < 16; ++j) {
          plain[j] ^= iv[j];
        }

        iv = buffer;
        result.push(plain);
        buffer = new Uint8Array(16);
        bufferLength = 0;
      }

      this.buffer = buffer;
      this.bufferLength = bufferLength;
      this.iv = iv;

      if (result.length === 0) {
        return new Uint8Array(0);
      }

      var outputLength = 16 * result.length;

      if (finalize) {
        var lastBlock = result[result.length - 1];
        var psLen = lastBlock[15];

        if (psLen <= 16) {
          for (var _i = 15, ii = 16 - psLen; _i >= ii; --_i) {
            if (lastBlock[_i] !== psLen) {
              psLen = 0;
              break;
            }
          }

          outputLength -= psLen;
          result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);
        }
      }

      var output = new Uint8Array(outputLength);

      for (var _i2 = 0, _j10 = 0, _ii = result.length; _i2 < _ii; ++_i2, _j10 += 16) {
        output.set(result[_i2], _j10);
      }

      return output;
    }
  }, {
    key: "decryptBlock",
    value: function decryptBlock(data, finalize) {
      var iv = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
      var sourceLength = data.length;
      var buffer = this.buffer,
          bufferLength = this.bufferPosition;

      if (iv) {
        this.iv = iv;
      } else {
        for (var i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {
          buffer[bufferLength] = data[i];
        }

        if (bufferLength < 16) {
          this.bufferLength = bufferLength;
          return new Uint8Array(0);
        }

        this.iv = buffer;
        data = data.subarray(16);
      }

      this.buffer = new Uint8Array(16);
      this.bufferLength = 0;
      this.decryptBlock = this._decryptBlock2;
      return this.decryptBlock(data, finalize);
    }
  }, {
    key: "encrypt",
    value: function encrypt(data, iv) {
      var sourceLength = data.length;
      var buffer = this.buffer,
          bufferLength = this.bufferPosition;
      var result = [];

      if (!iv) {
        iv = new Uint8Array(16);
      }

      for (var i = 0; i < sourceLength; ++i) {
        buffer[bufferLength] = data[i];
        ++bufferLength;

        if (bufferLength < 16) {
          continue;
        }

        for (var j = 0; j < 16; ++j) {
          buffer[j] ^= iv[j];
        }

        var cipher = this._encrypt(buffer, this._key);

        iv = cipher;
        result.push(cipher);
        buffer = new Uint8Array(16);
        bufferLength = 0;
      }

      this.buffer = buffer;
      this.bufferLength = bufferLength;
      this.iv = iv;

      if (result.length === 0) {
        return new Uint8Array(0);
      }

      var outputLength = 16 * result.length;
      var output = new Uint8Array(outputLength);

      for (var _i3 = 0, _j11 = 0, ii = result.length; _i3 < ii; ++_i3, _j11 += 16) {
        output.set(result[_i3], _j11);
      }

      return output;
    }
  }]);

  return AESBaseCipher;
}();

var AES128Cipher =
/*#__PURE__*/
function (_AESBaseCipher) {
  _inherits(AES128Cipher, _AESBaseCipher);

  function AES128Cipher(key) {
    var _this;

    _classCallCheck(this, AES128Cipher);

    _this = _possibleConstructorReturn(this, _getPrototypeOf(AES128Cipher).call(this));
    _this._cyclesOfRepetition = 10;
    _this._keySize = 160;
    _this._rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]);
    _this._key = _this._expandKey(key);
    return _this;
  }

  _createClass(AES128Cipher, [{
    key: "_expandKey",
    value: function _expandKey(cipherKey) {
      var b = 176;
      var s = this._s;
      var rcon = this._rcon;
      var result = new Uint8Array(b);
      result.set(cipherKey);

      for (var j = 16, i = 1; j < b; ++i) {
        var t1 = result[j - 3];
        var t2 = result[j - 2];
        var t3 = result[j - 1];
        var t4 = result[j - 4];
        t1 = s[t1];
        t2 = s[t2];
        t3 = s[t3];
        t4 = s[t4];
        t1 = t1 ^ rcon[i];

        for (var n = 0; n < 4; ++n) {
          result[j] = t1 ^= result[j - 16];
          j++;
          result[j] = t2 ^= result[j - 16];
          j++;
          result[j] = t3 ^= result[j - 16];
          j++;
          result[j] = t4 ^= result[j - 16];
          j++;
        }
      }

      return result;
    }
  }]);

  return AES128Cipher;
}(AESBaseCipher);

exports.AES128Cipher = AES128Cipher;

var AES256Cipher =
/*#__PURE__*/
function (_AESBaseCipher2) {
  _inherits(AES256Cipher, _AESBaseCipher2);

  function AES256Cipher(key) {
    var _this2;

    _classCallCheck(this, AES256Cipher);

    _this2 = _possibleConstructorReturn(this, _getPrototypeOf(AES256Cipher).call(this));
    _this2._cyclesOfRepetition = 14;
    _this2._keySize = 224;
    _this2._key = _this2._expandKey(key);
    return _this2;
  }

  _createClass(AES256Cipher, [{
    key: "_expandKey",
    value: function _expandKey(cipherKey) {
      var b = 240;
      var s = this._s;
      var result = new Uint8Array(b);
      result.set(cipherKey);
      var r = 1;
      var t1, t2, t3, t4;

      for (var j = 32, i = 1; j < b; ++i) {
        if (j % 32 === 16) {
          t1 = s[t1];
          t2 = s[t2];
          t3 = s[t3];
          t4 = s[t4];
        } else if (j % 32 === 0) {
          t1 = result[j - 3];
          t2 = result[j - 2];
          t3 = result[j - 1];
          t4 = result[j - 4];
          t1 = s[t1];
          t2 = s[t2];
          t3 = s[t3];
          t4 = s[t4];
          t1 = t1 ^ r;

          if ((r <<= 1) >= 256) {
            r = (r ^ 0x1b) & 0xFF;
          }
        }

        for (var n = 0; n < 4; ++n) {
          result[j] = t1 ^= result[j - 32];
          j++;
          result[j] = t2 ^= result[j - 32];
          j++;
          result[j] = t3 ^= result[j - 32];
          j++;
          result[j] = t4 ^= result[j - 32];
          j++;
        }
      }

      return result;
    }
  }]);

  return AES256Cipher;
}(AESBaseCipher);

exports.AES256Cipher = AES256Cipher;

var PDF17 = function PDF17Closure() {
  function compareByteArrays(array1, array2) {
    if (array1.length !== array2.length) {
      return false;
    }

    for (var i = 0; i < array1.length; i++) {
      if (array1[i] !== array2[i]) {
        return false;
      }
    }

    return true;
  }

  function PDF17() {}

  PDF17.prototype = {
    checkOwnerPassword: function PDF17_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {
      var hashData = new Uint8Array(password.length + 56);
      hashData.set(password, 0);
      hashData.set(ownerValidationSalt, password.length);
      hashData.set(userBytes, password.length + ownerValidationSalt.length);
      var result = calculateSHA256(hashData, 0, hashData.length);
      return compareByteArrays(result, ownerPassword);
    },
    checkUserPassword: function PDF17_checkUserPassword(password, userValidationSalt, userPassword) {
      var hashData = new Uint8Array(password.length + 8);
      hashData.set(password, 0);
      hashData.set(userValidationSalt, password.length);
      var result = calculateSHA256(hashData, 0, hashData.length);
      return compareByteArrays(result, userPassword);
    },
    getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {
      var hashData = new Uint8Array(password.length + 56);
      hashData.set(password, 0);
      hashData.set(ownerKeySalt, password.length);
      hashData.set(userBytes, password.length + ownerKeySalt.length);
      var key = calculateSHA256(hashData, 0, hashData.length);
      var cipher = new AES256Cipher(key);
      return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));
    },
    getUserKey: function PDF17_getUserKey(password, userKeySalt, userEncryption) {
      var hashData = new Uint8Array(password.length + 8);
      hashData.set(password, 0);
      hashData.set(userKeySalt, password.length);
      var key = calculateSHA256(hashData, 0, hashData.length);
      var cipher = new AES256Cipher(key);
      return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));
    }
  };
  return PDF17;
}();

exports.PDF17 = PDF17;

var PDF20 = function PDF20Closure() {
  function concatArrays(array1, array2) {
    var t = new Uint8Array(array1.length + array2.length);
    t.set(array1, 0);
    t.set(array2, array1.length);
    return t;
  }

  function calculatePDF20Hash(password, input, userBytes) {
    var k = calculateSHA256(input, 0, input.length).subarray(0, 32);
    var e = [0];
    var i = 0;

    while (i < 64 || e[e.length - 1] > i - 32) {
      var arrayLength = password.length + k.length + userBytes.length;
      var k1 = new Uint8Array(arrayLength * 64);
      var array = concatArrays(password, k);
      array = concatArrays(array, userBytes);

      for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) {
        k1.set(array, pos);
      }

      var cipher = new AES128Cipher(k.subarray(0, 16));
      e = cipher.encrypt(k1, k.subarray(16, 32));
      var remainder = 0;

      for (var z = 0; z < 16; z++) {
        remainder *= 256 % 3;
        remainder %= 3;
        remainder += (e[z] >>> 0) % 3;
        remainder %= 3;
      }

      if (remainder === 0) {
        k = calculateSHA256(e, 0, e.length);
      } else if (remainder === 1) {
        k = calculateSHA384(e, 0, e.length);
      } else if (remainder === 2) {
        k = calculateSHA512(e, 0, e.length);
      }

      i++;
    }

    return k.subarray(0, 32);
  }

  function PDF20() {}

  function compareByteArrays(array1, array2) {
    if (array1.length !== array2.length) {
      return false;
    }

    for (var i = 0; i < array1.length; i++) {
      if (array1[i] !== array2[i]) {
        return false;
      }
    }

    return true;
  }

  PDF20.prototype = {
    hash: function PDF20_hash(password, concatBytes, userBytes) {
      return calculatePDF20Hash(password, concatBytes, userBytes);
    },
    checkOwnerPassword: function PDF20_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {
      var hashData = new Uint8Array(password.length + 56);
      hashData.set(password, 0);
      hashData.set(ownerValidationSalt, password.length);
      hashData.set(userBytes, password.length + ownerValidationSalt.length);
      var result = calculatePDF20Hash(password, hashData, userBytes);
      return compareByteArrays(result, ownerPassword);
    },
    checkUserPassword: function PDF20_checkUserPassword(password, userValidationSalt, userPassword) {
      var hashData = new Uint8Array(password.length + 8);
      hashData.set(password, 0);
      hashData.set(userValidationSalt, password.length);
      var result = calculatePDF20Hash(password, hashData, []);
      return compareByteArrays(result, userPassword);
    },
    getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {
      var hashData = new Uint8Array(password.length + 56);
      hashData.set(password, 0);
      hashData.set(ownerKeySalt, password.length);
      hashData.set(userBytes, password.length + ownerKeySalt.length);
      var key = calculatePDF20Hash(password, hashData, userBytes);
      var cipher = new AES256Cipher(key);
      return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));
    },
    getUserKey: function PDF20_getUserKey(password, userKeySalt, userEncryption) {
      var hashData = new Uint8Array(password.length + 8);
      hashData.set(password, 0);
      hashData.set(userKeySalt, password.length);
      var key = calculatePDF20Hash(password, hashData, []);
      var cipher = new AES256Cipher(key);
      return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));
    }
  };
  return PDF20;
}();

exports.PDF20 = PDF20;

var CipherTransform = function CipherTransformClosure() {
  function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
    this.StringCipherConstructor = stringCipherConstructor;
    this.StreamCipherConstructor = streamCipherConstructor;
  }

  CipherTransform.prototype = {
    createStream: function CipherTransform_createStream(stream, length) {
      var cipher = new this.StreamCipherConstructor();
      return new _stream.DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) {
        return cipher.decryptBlock(data, finalize);
      });
    },
    decryptString: function CipherTransform_decryptString(s) {
      var cipher = new this.StringCipherConstructor();
      var data = (0, _util.stringToBytes)(s);
      data = cipher.decryptBlock(data, true);
      return (0, _util.bytesToString)(data);
    }
  };
  return CipherTransform;
}();

var CipherTransformFactory = function CipherTransformFactoryClosure() {
  var defaultPasswordBytes = new Uint8Array([0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);

  function createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) {
    if (password) {
      var passwordLength = Math.min(127, password.length);
      password = password.subarray(0, passwordLength);
    } else {
      password = [];
    }

    var pdfAlgorithm;

    if (revision === 6) {
      pdfAlgorithm = new PDF20();
    } else {
      pdfAlgorithm = new PDF17();
    }

    if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) {
      return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);
    } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) {
      return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption);
    }

    return null;
  }

  function prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) {
    var hashDataSize = 40 + ownerPassword.length + fileId.length;
    var hashData = new Uint8Array(hashDataSize),
        i = 0,
        j,
        n;

    if (password) {
      n = Math.min(32, password.length);

      for (; i < n; ++i) {
        hashData[i] = password[i];
      }
    }

    j = 0;

    while (i < 32) {
      hashData[i++] = defaultPasswordBytes[j++];
    }

    for (j = 0, n = ownerPassword.length; j < n; ++j) {
      hashData[i++] = ownerPassword[j];
    }

    hashData[i++] = flags & 0xFF;
    hashData[i++] = flags >> 8 & 0xFF;
    hashData[i++] = flags >> 16 & 0xFF;
    hashData[i++] = flags >>> 24 & 0xFF;

    for (j = 0, n = fileId.length; j < n; ++j) {
      hashData[i++] = fileId[j];
    }

    if (revision >= 4 && !encryptMetadata) {
      hashData[i++] = 0xFF;
      hashData[i++] = 0xFF;
      hashData[i++] = 0xFF;
      hashData[i++] = 0xFF;
    }

    var hash = calculateMD5(hashData, 0, i);
    var keyLengthInBytes = keyLength >> 3;

    if (revision >= 3) {
      for (j = 0; j < 50; ++j) {
        hash = calculateMD5(hash, 0, keyLengthInBytes);
      }
    }

    var encryptionKey = hash.subarray(0, keyLengthInBytes);
    var cipher, checkData;

    if (revision >= 3) {
      for (i = 0; i < 32; ++i) {
        hashData[i] = defaultPasswordBytes[i];
      }

      for (j = 0, n = fileId.length; j < n; ++j) {
        hashData[i++] = fileId[j];
      }

      cipher = new ARCFourCipher(encryptionKey);
      checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
      n = encryptionKey.length;
      var derivedKey = new Uint8Array(n),
          k;

      for (j = 1; j <= 19; ++j) {
        for (k = 0; k < n; ++k) {
          derivedKey[k] = encryptionKey[k] ^ j;
        }

        cipher = new ARCFourCipher(derivedKey);
        checkData = cipher.encryptBlock(checkData);
      }

      for (j = 0, n = checkData.length; j < n; ++j) {
        if (userPassword[j] !== checkData[j]) {
          return null;
        }
      }
    } else {
      cipher = new ARCFourCipher(encryptionKey);
      checkData = cipher.encryptBlock(defaultPasswordBytes);

      for (j = 0, n = checkData.length; j < n; ++j) {
        if (userPassword[j] !== checkData[j]) {
          return null;
        }
      }
    }

    return encryptionKey;
  }

  function decodeUserPassword(password, ownerPassword, revision, keyLength) {
    var hashData = new Uint8Array(32),
        i = 0,
        j,
        n;
    n = Math.min(32, password.length);

    for (; i < n; ++i) {
      hashData[i] = password[i];
    }

    j = 0;

    while (i < 32) {
      hashData[i++] = defaultPasswordBytes[j++];
    }

    var hash = calculateMD5(hashData, 0, i);
    var keyLengthInBytes = keyLength >> 3;

    if (revision >= 3) {
      for (j = 0; j < 50; ++j) {
        hash = calculateMD5(hash, 0, hash.length);
      }
    }

    var cipher, userPassword;

    if (revision >= 3) {
      userPassword = ownerPassword;
      var derivedKey = new Uint8Array(keyLengthInBytes),
          k;

      for (j = 19; j >= 0; j--) {
        for (k = 0; k < keyLengthInBytes; ++k) {
          derivedKey[k] = hash[k] ^ j;
        }

        cipher = new ARCFourCipher(derivedKey);
        userPassword = cipher.encryptBlock(userPassword);
      }
    } else {
      cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));
      userPassword = cipher.encryptBlock(ownerPassword);
    }

    return userPassword;
  }

  var identityName = _primitives.Name.get('Identity');

  function CipherTransformFactory(dict, fileId, password) {
    var filter = dict.get('Filter');

    if (!(0, _primitives.isName)(filter, 'Standard')) {
      throw new _util.FormatError('unknown encryption method');
    }

    this.dict = dict;
    var algorithm = dict.get('V');

    if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) {
      throw new _util.FormatError('unsupported encryption algorithm');
    }

    this.algorithm = algorithm;
    var keyLength = dict.get('Length');

    if (!keyLength) {
      if (algorithm <= 3) {
        keyLength = 40;
      } else {
        var cfDict = dict.get('CF');
        var streamCryptoName = dict.get('StmF');

        if ((0, _primitives.isDict)(cfDict) && (0, _primitives.isName)(streamCryptoName)) {
          cfDict.suppressEncryption = true;
          var handlerDict = cfDict.get(streamCryptoName.name);
          keyLength = handlerDict && handlerDict.get('Length') || 128;

          if (keyLength < 40) {
            keyLength <<= 3;
          }
        }
      }
    }

    if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) {
      throw new _util.FormatError('invalid key length');
    }

    var ownerPassword = (0, _util.stringToBytes)(dict.get('O')).subarray(0, 32);
    var userPassword = (0, _util.stringToBytes)(dict.get('U')).subarray(0, 32);
    var flags = dict.get('P');
    var revision = dict.get('R');
    var encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get('EncryptMetadata') !== false;
    this.encryptMetadata = encryptMetadata;
    var fileIdBytes = (0, _util.stringToBytes)(fileId);
    var passwordBytes;

    if (password) {
      if (revision === 6) {
        try {
          password = (0, _util.utf8StringToString)(password);
        } catch (ex) {
          (0, _util.warn)('CipherTransformFactory: ' + 'Unable to convert UTF8 encoded password.');
        }
      }

      passwordBytes = (0, _util.stringToBytes)(password);
    }

    var encryptionKey;

    if (algorithm !== 5) {
      encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);
    } else {
      var ownerValidationSalt = (0, _util.stringToBytes)(dict.get('O')).subarray(32, 40);
      var ownerKeySalt = (0, _util.stringToBytes)(dict.get('O')).subarray(40, 48);
      var uBytes = (0, _util.stringToBytes)(dict.get('U')).subarray(0, 48);
      var userValidationSalt = (0, _util.stringToBytes)(dict.get('U')).subarray(32, 40);
      var userKeySalt = (0, _util.stringToBytes)(dict.get('U')).subarray(40, 48);
      var ownerEncryption = (0, _util.stringToBytes)(dict.get('OE'));
      var userEncryption = (0, _util.stringToBytes)(dict.get('UE'));
      var perms = (0, _util.stringToBytes)(dict.get('Perms'));
      encryptionKey = createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms);
    }

    if (!encryptionKey && !password) {
      throw new _util.PasswordException('No password given', _util.PasswordResponses.NEED_PASSWORD);
    } else if (!encryptionKey && password) {
      var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength);
      encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);
    }

    if (!encryptionKey) {
      throw new _util.PasswordException('Incorrect Password', _util.PasswordResponses.INCORRECT_PASSWORD);
    }

    this.encryptionKey = encryptionKey;

    if (algorithm >= 4) {
      var cf = dict.get('CF');

      if ((0, _primitives.isDict)(cf)) {
        cf.suppressEncryption = true;
      }

      this.cf = cf;
      this.stmf = dict.get('StmF') || identityName;
      this.strf = dict.get('StrF') || identityName;
      this.eff = dict.get('EFF') || this.stmf;
    }
  }

  function buildObjectKey(num, gen, encryptionKey, isAes) {
    var key = new Uint8Array(encryptionKey.length + 9),
        i,
        n;

    for (i = 0, n = encryptionKey.length; i < n; ++i) {
      key[i] = encryptionKey[i];
    }

    key[i++] = num & 0xFF;
    key[i++] = num >> 8 & 0xFF;
    key[i++] = num >> 16 & 0xFF;
    key[i++] = gen & 0xFF;
    key[i++] = gen >> 8 & 0xFF;

    if (isAes) {
      key[i++] = 0x73;
      key[i++] = 0x41;
      key[i++] = 0x6C;
      key[i++] = 0x54;
    }

    var hash = calculateMD5(key, 0, i);
    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
  }

  function buildCipherConstructor(cf, name, num, gen, key) {
    if (!(0, _primitives.isName)(name)) {
      throw new _util.FormatError('Invalid crypt filter name.');
    }

    var cryptFilter = cf.get(name.name);
    var cfm;

    if (cryptFilter !== null && cryptFilter !== undefined) {
      cfm = cryptFilter.get('CFM');
    }

    if (!cfm || cfm.name === 'None') {
      return function cipherTransformFactoryBuildCipherConstructorNone() {
        return new NullCipher();
      };
    }

    if (cfm.name === 'V2') {
      return function cipherTransformFactoryBuildCipherConstructorV2() {
        return new ARCFourCipher(buildObjectKey(num, gen, key, false));
      };
    }

    if (cfm.name === 'AESV2') {
      return function cipherTransformFactoryBuildCipherConstructorAESV2() {
        return new AES128Cipher(buildObjectKey(num, gen, key, true));
      };
    }

    if (cfm.name === 'AESV3') {
      return function cipherTransformFactoryBuildCipherConstructorAESV3() {
        return new AES256Cipher(key);
      };
    }

    throw new _util.FormatError('Unknown crypto method');
  }

  CipherTransformFactory.prototype = {
    createCipherTransform: function CipherTransformFactory_createCipherTransform(num, gen) {
      if (this.algorithm === 4 || this.algorithm === 5) {
        return new CipherTransform(buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey), buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey));
      }

      var key = buildObjectKey(num, gen, this.encryptionKey, false);

      var cipherConstructor = function buildCipherCipherConstructor() {
        return new ARCFourCipher(key);
      };

      return new CipherTransform(cipherConstructor, cipherConstructor);
    }
  };
  return CipherTransformFactory;
}();

exports.CipherTransformFactory = CipherTransformFactory;

/***/ }),
/* 168 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ColorSpace = void 0;

var _util = __w_pdfjs_require__(6);

var _primitives = __w_pdfjs_require__(155);

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) {
  var COMPONENTS = 3;
  alpha01 = alpha01 !== 1 ? 0 : alpha01;
  var xRatio = w1 / w2;
  var yRatio = h1 / h2;
  var newIndex = 0,
      oldIndex;
  var xScaled = new Uint16Array(w2);
  var w1Scanline = w1 * COMPONENTS;

  for (var i = 0; i < w2; i++) {
    xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;
  }

  for (var _i = 0; _i < h2; _i++) {
    var py = Math.floor(_i * yRatio) * w1Scanline;

    for (var j = 0; j < w2; j++) {
      oldIndex = py + xScaled[j];
      dest[newIndex++] = src[oldIndex++];
      dest[newIndex++] = src[oldIndex++];
      dest[newIndex++] = src[oldIndex++];
      newIndex += alpha01;
    }
  }
}

var ColorSpace =
/*#__PURE__*/
function () {
  function ColorSpace(name, numComps) {
    _classCallCheck(this, ColorSpace);

    if (this.constructor === ColorSpace) {
      (0, _util.unreachable)('Cannot initialize ColorSpace.');
    }

    this.name = name;
    this.numComps = numComps;
  }

  _createClass(ColorSpace, [{
    key: "getRgb",
    value: function getRgb(src, srcOffset) {
      var rgb = new Uint8ClampedArray(3);
      this.getRgbItem(src, srcOffset, rgb, 0);
      return rgb;
    }
  }, {
    key: "getRgbItem",
    value: function getRgbItem(src, srcOffset, dest, destOffset) {
      (0, _util.unreachable)('Should not call ColorSpace.getRgbItem');
    }
  }, {
    key: "getRgbBuffer",
    value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
      (0, _util.unreachable)('Should not call ColorSpace.getRgbBuffer');
    }
  }, {
    key: "getOutputLength",
    value: function getOutputLength(inputLength, alpha01) {
      (0, _util.unreachable)('Should not call ColorSpace.getOutputLength');
    }
  }, {
    key: "isPassthrough",
    value: function isPassthrough(bits) {
      return false;
    }
  }, {
    key: "isDefaultDecode",
    value: function isDefaultDecode(decodeMap, bpc) {
      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
    }
  }, {
    key: "fillRgb",
    value: function fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) {
      var count = originalWidth * originalHeight;
      var rgbBuf = null;
      var numComponentColors = 1 << bpc;
      var needsResizing = originalHeight !== height || originalWidth !== width;

      if (this.isPassthrough(bpc)) {
        rgbBuf = comps;
      } else if (this.numComps === 1 && count > numComponentColors && this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') {
        var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors);

        for (var i = 0; i < numComponentColors; i++) {
          allColors[i] = i;
        }

        var colorMap = new Uint8ClampedArray(numComponentColors * 3);
        this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0);

        if (!needsResizing) {
          var destPos = 0;

          for (var _i2 = 0; _i2 < count; ++_i2) {
            var key = comps[_i2] * 3;
            dest[destPos++] = colorMap[key];
            dest[destPos++] = colorMap[key + 1];
            dest[destPos++] = colorMap[key + 2];
            destPos += alpha01;
          }
        } else {
          rgbBuf = new Uint8Array(count * 3);
          var rgbPos = 0;

          for (var _i3 = 0; _i3 < count; ++_i3) {
            var _key = comps[_i3] * 3;

            rgbBuf[rgbPos++] = colorMap[_key];
            rgbBuf[rgbPos++] = colorMap[_key + 1];
            rgbBuf[rgbPos++] = colorMap[_key + 2];
          }
        }
      } else {
        if (!needsResizing) {
          this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01);
        } else {
          rgbBuf = new Uint8ClampedArray(count * 3);
          this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0);
        }
      }

      if (rgbBuf) {
        if (needsResizing) {
          resizeRgbImage(rgbBuf, dest, originalWidth, originalHeight, width, height, alpha01);
        } else {
          var _destPos = 0,
              _rgbPos = 0;

          for (var _i4 = 0, ii = width * actualHeight; _i4 < ii; _i4++) {
            dest[_destPos++] = rgbBuf[_rgbPos++];
            dest[_destPos++] = rgbBuf[_rgbPos++];
            dest[_destPos++] = rgbBuf[_rgbPos++];
            _destPos += alpha01;
          }
        }
      }
    }
  }, {
    key: "usesZeroToOneRange",
    get: function get() {
      return (0, _util.shadow)(this, 'usesZeroToOneRange', true);
    }
  }], [{
    key: "parse",
    value: function parse(cs, xref, res, pdfFunctionFactory) {
      var IR = this.parseToIR(cs, xref, res, pdfFunctionFactory);
      return this.fromIR(IR);
    }
  }, {
    key: "fromIR",
    value: function fromIR(IR) {
      var name = Array.isArray(IR) ? IR[0] : IR;
      var whitePoint, blackPoint, gamma;

      switch (name) {
        case 'DeviceGrayCS':
          return this.singletons.gray;

        case 'DeviceRgbCS':
          return this.singletons.rgb;

        case 'DeviceCmykCS':
          return this.singletons.cmyk;

        case 'CalGrayCS':
          whitePoint = IR[1];
          blackPoint = IR[2];
          gamma = IR[3];
          return new CalGrayCS(whitePoint, blackPoint, gamma);

        case 'CalRGBCS':
          whitePoint = IR[1];
          blackPoint = IR[2];
          gamma = IR[3];
          var matrix = IR[4];
          return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);

        case 'PatternCS':
          var basePatternCS = IR[1];

          if (basePatternCS) {
            basePatternCS = this.fromIR(basePatternCS);
          }

          return new PatternCS(basePatternCS);

        case 'IndexedCS':
          var baseIndexedCS = IR[1];
          var hiVal = IR[2];
          var lookup = IR[3];
          return new IndexedCS(this.fromIR(baseIndexedCS), hiVal, lookup);

        case 'AlternateCS':
          var numComps = IR[1];
          var alt = IR[2];
          var tintFn = IR[3];
          return new AlternateCS(numComps, this.fromIR(alt), tintFn);

        case 'LabCS':
          whitePoint = IR[1];
          blackPoint = IR[2];
          var range = IR[3];
          return new LabCS(whitePoint, blackPoint, range);

        default:
          throw new _util.FormatError("Unknown colorspace name: ".concat(name));
      }
    }
  }, {
    key: "parseToIR",
    value: function parseToIR(cs, xref) {
      var res = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
      var pdfFunctionFactory = arguments.length > 3 ? arguments[3] : undefined;
      cs = xref.fetchIfRef(cs);

      if ((0, _primitives.isName)(cs)) {
        switch (cs.name) {
          case 'DeviceGray':
          case 'G':
            return 'DeviceGrayCS';

          case 'DeviceRGB':
          case 'RGB':
            return 'DeviceRgbCS';

          case 'DeviceCMYK':
          case 'CMYK':
            return 'DeviceCmykCS';

          case 'Pattern':
            return ['PatternCS', null];

          default:
            if ((0, _primitives.isDict)(res)) {
              var colorSpaces = res.get('ColorSpace');

              if ((0, _primitives.isDict)(colorSpaces)) {
                var resCS = colorSpaces.get(cs.name);

                if (resCS) {
                  if ((0, _primitives.isName)(resCS)) {
                    return this.parseToIR(resCS, xref, res, pdfFunctionFactory);
                  }

                  cs = resCS;
                  break;
                }
              }
            }

            throw new _util.FormatError("unrecognized colorspace ".concat(cs.name));
        }
      }

      if (Array.isArray(cs)) {
        var mode = xref.fetchIfRef(cs[0]).name;
        var numComps, params, alt, whitePoint, blackPoint, gamma;

        switch (mode) {
          case 'DeviceGray':
          case 'G':
            return 'DeviceGrayCS';

          case 'DeviceRGB':
          case 'RGB':
            return 'DeviceRgbCS';

          case 'DeviceCMYK':
          case 'CMYK':
            return 'DeviceCmykCS';

          case 'CalGray':
            params = xref.fetchIfRef(cs[1]);
            whitePoint = params.getArray('WhitePoint');
            blackPoint = params.getArray('BlackPoint');
            gamma = params.get('Gamma');
            return ['CalGrayCS', whitePoint, blackPoint, gamma];

          case 'CalRGB':
            params = xref.fetchIfRef(cs[1]);
            whitePoint = params.getArray('WhitePoint');
            blackPoint = params.getArray('BlackPoint');
            gamma = params.getArray('Gamma');
            var matrix = params.getArray('Matrix');
            return ['CalRGBCS', whitePoint, blackPoint, gamma, matrix];

          case 'ICCBased':
            var stream = xref.fetchIfRef(cs[1]);
            var dict = stream.dict;
            numComps = dict.get('N');
            alt = dict.get('Alternate');

            if (alt) {
              var altIR = this.parseToIR(alt, xref, res, pdfFunctionFactory);
              var altCS = this.fromIR(altIR, pdfFunctionFactory);

              if (altCS.numComps === numComps) {
                return altIR;
              }

              (0, _util.warn)('ICCBased color space: Ignoring incorrect /Alternate entry.');
            }

            if (numComps === 1) {
              return 'DeviceGrayCS';
            } else if (numComps === 3) {
              return 'DeviceRgbCS';
            } else if (numComps === 4) {
              return 'DeviceCmykCS';
            }

            break;

          case 'Pattern':
            var basePatternCS = cs[1] || null;

            if (basePatternCS) {
              basePatternCS = this.parseToIR(basePatternCS, xref, res, pdfFunctionFactory);
            }

            return ['PatternCS', basePatternCS];

          case 'Indexed':
          case 'I':
            var baseIndexedCS = this.parseToIR(cs[1], xref, res, pdfFunctionFactory);
            var hiVal = xref.fetchIfRef(cs[2]) + 1;
            var lookup = xref.fetchIfRef(cs[3]);

            if ((0, _primitives.isStream)(lookup)) {
              lookup = lookup.getBytes();
            }

            return ['IndexedCS', baseIndexedCS, hiVal, lookup];

          case 'Separation':
          case 'DeviceN':
            var name = xref.fetchIfRef(cs[1]);
            numComps = Array.isArray(name) ? name.length : 1;
            alt = this.parseToIR(cs[2], xref, res, pdfFunctionFactory);
            var tintFn = pdfFunctionFactory.create(xref.fetchIfRef(cs[3]));
            return ['AlternateCS', numComps, alt, tintFn];

          case 'Lab':
            params = xref.fetchIfRef(cs[1]);
            whitePoint = params.getArray('WhitePoint');
            blackPoint = params.getArray('BlackPoint');
            var range = params.getArray('Range');
            return ['LabCS', whitePoint, blackPoint, range];

          default:
            throw new _util.FormatError("unimplemented color space object \"".concat(mode, "\""));
        }
      }

      throw new _util.FormatError("unrecognized color space object: \"".concat(cs, "\""));
    }
  }, {
    key: "isDefaultDecode",
    value: function isDefaultDecode(decode, numComps) {
      if (!Array.isArray(decode)) {
        return true;
      }

      if (numComps * 2 !== decode.length) {
        (0, _util.warn)('The decode map is not the correct length');
        return true;
      }

      for (var i = 0, ii = decode.length; i < ii; i += 2) {
        if (decode[i] !== 0 || decode[i + 1] !== 1) {
          return false;
        }
      }

      return true;
    }
  }, {
    key: "singletons",
    get: function get() {
      return (0, _util.shadow)(this, 'singletons', {
        get gray() {
          return (0, _util.shadow)(this, 'gray', new DeviceGrayCS());
        },

        get rgb() {
          return (0, _util.shadow)(this, 'rgb', new DeviceRgbCS());
        },

        get cmyk() {
          return (0, _util.shadow)(this, 'cmyk', new DeviceCmykCS());
        }

      });
    }
  }]);

  return ColorSpace;
}();

exports.ColorSpace = ColorSpace;

var AlternateCS =
/*#__PURE__*/
function (_ColorSpace) {
  _inherits(AlternateCS, _ColorSpace);

  function AlternateCS(numComps, base, tintFn) {
    var _this;

    _classCallCheck(this, AlternateCS);

    _this = _possibleConstructorReturn(this, _getPrototypeOf(AlternateCS).call(this, 'Alternate', numComps));
    _this.base = base;
    _this.tintFn = tintFn;
    _this.tmpBuf = new Float32Array(base.numComps);
    return _this;
  }

  _createClass(AlternateCS, [{
    key: "getRgbItem",
    value: function getRgbItem(src, srcOffset, dest, destOffset) {
      var tmpBuf = this.tmpBuf;
      this.tintFn(src, srcOffset, tmpBuf, 0);
      this.base.getRgbItem(tmpBuf, 0, dest, destOffset);
    }
  }, {
    key: "getRgbBuffer",
    value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
      var tintFn = this.tintFn;
      var base = this.base;
      var scale = 1 / ((1 << bits) - 1);
      var baseNumComps = base.numComps;
      var usesZeroToOneRange = base.usesZeroToOneRange;
      var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0;
      var pos = isPassthrough ? destOffset : 0;
      var baseBuf = isPassthrough ? dest : new Uint8ClampedArray(baseNumComps * count);
      var numComps = this.numComps;
      var scaled = new Float32Array(numComps);
      var tinted = new Float32Array(baseNumComps);
      var i, j;

      for (i = 0; i < count; i++) {
        for (j = 0; j < numComps; j++) {
          scaled[j] = src[srcOffset++] * scale;
        }

        tintFn(scaled, 0, tinted, 0);

        if (usesZeroToOneRange) {
          for (j = 0; j < baseNumComps; j++) {
            baseBuf[pos++] = tinted[j] * 255;
          }
        } else {
          base.getRgbItem(tinted, 0, baseBuf, pos);
          pos += baseNumComps;
        }
      }

      if (!isPassthrough) {
        base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);
      }
    }
  }, {
    key: "getOutputLength",
    value: function getOutputLength(inputLength, alpha01) {
      return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01);
    }
  }]);

  return AlternateCS;
}(ColorSpace);

var PatternCS =
/*#__PURE__*/
function (_ColorSpace2) {
  _inherits(PatternCS, _ColorSpace2);

  function PatternCS(baseCS) {
    var _this2;

    _classCallCheck(this, PatternCS);

    _this2 = _possibleConstructorReturn(this, _getPrototypeOf(PatternCS).call(this, 'Pattern', null));
    _this2.base = baseCS;
    return _this2;
  }

  _createClass(PatternCS, [{
    key: "isDefaultDecode",
    value: function isDefaultDecode(decodeMap, bpc) {
      (0, _util.unreachable)('Should not call PatternCS.isDefaultDecode');
    }
  }]);

  return PatternCS;
}(ColorSpace);

var IndexedCS =
/*#__PURE__*/
function (_ColorSpace3) {
  _inherits(IndexedCS, _ColorSpace3);

  function IndexedCS(base, highVal, lookup) {
    var _this3;

    _classCallCheck(this, IndexedCS);

    _this3 = _possibleConstructorReturn(this, _getPrototypeOf(IndexedCS).call(this, 'Indexed', 1));
    _this3.base = base;
    _this3.highVal = highVal;
    var baseNumComps = base.numComps;
    var length = baseNumComps * highVal;

    if ((0, _primitives.isStream)(lookup)) {
      _this3.lookup = new Uint8Array(length);
      var bytes = lookup.getBytes(length);

      _this3.lookup.set(bytes);
    } else if ((0, _util.isString)(lookup)) {
      _this3.lookup = new Uint8Array(length);

      for (var i = 0; i < length; ++i) {
        _this3.lookup[i] = lookup.charCodeAt(i);
      }
    } else if (lookup instanceof Uint8Array) {
      _this3.lookup = lookup;
    } else {
      throw new _util.FormatError("Unrecognized lookup table: ".concat(lookup));
    }

    return _this3;
  }

  _createClass(IndexedCS, [{
    key: "getRgbItem",
    value: function getRgbItem(src, srcOffset, dest, destOffset) {
      var numComps = this.base.numComps;
      var start = src[srcOffset] * numComps;
      this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0);
    }
  }, {
    key: "getRgbBuffer",
    value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
      var base = this.base;
      var numComps = base.numComps;
      var outputDelta = base.getOutputLength(numComps, alpha01);
      var lookup = this.lookup;

      for (var i = 0; i < count; ++i) {
        var lookupPos = src[srcOffset++] * numComps;
        base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);
        destOffset += outputDelta;
      }
    }
  }, {
    key: "getOutputLength",
    value: function getOutputLength(inputLength, alpha01) {
      return this.base.getOutputLength(inputLength * this.base.numComps, alpha01);
    }
  }, {
    key: "isDefaultDecode",
    value: function isDefaultDecode(decodeMap, bpc) {
      if (!Array.isArray(decodeMap)) {
        return true;
      }

      if (decodeMap.length !== 2) {
        (0, _util.warn)('Decode map length is not correct');
        return true;
      }

      if (!Number.isInteger(bpc) || bpc < 1) {
        (0, _util.warn)('Bits per component is not correct');
        return true;
      }

      return decodeMap[0] === 0 && decodeMap[1] === (1 << bpc) - 1;
    }
  }]);

  return IndexedCS;
}(ColorSpace);

var DeviceGrayCS =
/*#__PURE__*/
function (_ColorSpace4) {
  _inherits(DeviceGrayCS, _ColorSpace4);

  function DeviceGrayCS() {
    _classCallCheck(this, DeviceGrayCS);

    return _possibleConstructorReturn(this, _getPrototypeOf(DeviceGrayCS).call(this, 'DeviceGray', 1));
  }

  _createClass(DeviceGrayCS, [{
    key: "getRgbItem",
    value: function getRgbItem(src, srcOffset, dest, destOffset) {
      var c = src[srcOffset] * 255;
      dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;
    }
  }, {
    key: "getRgbBuffer",
    value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
      var scale = 255 / ((1 << bits) - 1);
      var j = srcOffset,
          q = destOffset;

      for (var i = 0; i < count; ++i) {
        var c = scale * src[j++];
        dest[q++] = c;
        dest[q++] = c;
        dest[q++] = c;
        q += alpha01;
      }
    }
  }, {
    key: "getOutputLength",
    value: function getOutputLength(inputLength, alpha01) {
      return inputLength * (3 + alpha01);
    }
  }]);

  return DeviceGrayCS;
}(ColorSpace);

var DeviceRgbCS =
/*#__PURE__*/
function (_ColorSpace5) {
  _inherits(DeviceRgbCS, _ColorSpace5);

  function DeviceRgbCS() {
    _classCallCheck(this, DeviceRgbCS);

    return _possibleConstructorReturn(this, _getPrototypeOf(DeviceRgbCS).call(this, 'DeviceRGB', 3));
  }

  _createClass(DeviceRgbCS, [{
    key: "getRgbItem",
    value: function getRgbItem(src, srcOffset, dest, destOffset) {
      dest[destOffset] = src[srcOffset] * 255;
      dest[destOffset + 1] = src[srcOffset + 1] * 255;
      dest[destOffset + 2] = src[srcOffset + 2] * 255;
    }
  }, {
    key: "getRgbBuffer",
    value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
      if (bits === 8 && alpha01 === 0) {
        dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);
        return;
      }

      var scale = 255 / ((1 << bits) - 1);
      var j = srcOffset,
          q = destOffset;

      for (var i = 0; i < count; ++i) {
        dest[q++] = scale * src[j++];
        dest[q++] = scale * src[j++];
        dest[q++] = scale * src[j++];
        q += alpha01;
      }
    }
  }, {
    key: "getOutputLength",
    value: function getOutputLength(inputLength, alpha01) {
      return inputLength * (3 + alpha01) / 3 | 0;
    }
  }, {
    key: "isPassthrough",
    value: function isPassthrough(bits) {
      return bits === 8;
    }
  }]);

  return DeviceRgbCS;
}(ColorSpace);

var DeviceCmykCS = function DeviceCmykCSClosure() {
  function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {
    var c = src[srcOffset] * srcScale;
    var m = src[srcOffset + 1] * srcScale;
    var y = src[srcOffset + 2] * srcScale;
    var k = src[srcOffset + 3] * srcScale;
    dest[destOffset] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747);
    dest[destOffset + 1] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578);
    dest[destOffset + 2] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367);
  }

  var DeviceCmykCS =
  /*#__PURE__*/
  function (_ColorSpace6) {
    _inherits(DeviceCmykCS, _ColorSpace6);

    function DeviceCmykCS() {
      _classCallCheck(this, DeviceCmykCS);

      return _possibleConstructorReturn(this, _getPrototypeOf(DeviceCmykCS).call(this, 'DeviceCMYK', 4));
    }

    _createClass(DeviceCmykCS, [{
      key: "getRgbItem",
      value: function getRgbItem(src, srcOffset, dest, destOffset) {
        convertToRgb(src, srcOffset, 1, dest, destOffset);
      }
    }, {
      key: "getRgbBuffer",
      value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
        var scale = 1 / ((1 << bits) - 1);

        for (var i = 0; i < count; i++) {
          convertToRgb(src, srcOffset, scale, dest, destOffset);
          srcOffset += 4;
          destOffset += 3 + alpha01;
        }
      }
    }, {
      key: "getOutputLength",
      value: function getOutputLength(inputLength, alpha01) {
        return inputLength / 4 * (3 + alpha01) | 0;
      }
    }]);

    return DeviceCmykCS;
  }(ColorSpace);

  return DeviceCmykCS;
}();

var CalGrayCS = function CalGrayCSClosure() {
  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
    var A = src[srcOffset] * scale;
    var AG = Math.pow(A, cs.G);
    var L = cs.YW * AG;
    var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0);
    dest[destOffset] = val;
    dest[destOffset + 1] = val;
    dest[destOffset + 2] = val;
  }

  var CalGrayCS =
  /*#__PURE__*/
  function (_ColorSpace7) {
    _inherits(CalGrayCS, _ColorSpace7);

    function CalGrayCS(whitePoint, blackPoint, gamma) {
      var _this4;

      _classCallCheck(this, CalGrayCS);

      _this4 = _possibleConstructorReturn(this, _getPrototypeOf(CalGrayCS).call(this, 'CalGray', 1));

      if (!whitePoint) {
        throw new _util.FormatError('WhitePoint missing - required for color space CalGray');
      }

      blackPoint = blackPoint || [0, 0, 0];
      gamma = gamma || 1;
      _this4.XW = whitePoint[0];
      _this4.YW = whitePoint[1];
      _this4.ZW = whitePoint[2];
      _this4.XB = blackPoint[0];
      _this4.YB = blackPoint[1];
      _this4.ZB = blackPoint[2];
      _this4.G = gamma;

      if (_this4.XW < 0 || _this4.ZW < 0 || _this4.YW !== 1) {
        throw new _util.FormatError("Invalid WhitePoint components for ".concat(_this4.name) + ', no fallback available');
      }

      if (_this4.XB < 0 || _this4.YB < 0 || _this4.ZB < 0) {
        (0, _util.info)("Invalid BlackPoint for ".concat(_this4.name, ", falling back to default."));
        _this4.XB = _this4.YB = _this4.ZB = 0;
      }

      if (_this4.XB !== 0 || _this4.YB !== 0 || _this4.ZB !== 0) {
        (0, _util.warn)("".concat(_this4.name, ", BlackPoint: XB: ").concat(_this4.XB, ", YB: ").concat(_this4.YB, ", ") + "ZB: ".concat(_this4.ZB, ", only default values are supported."));
      }

      if (_this4.G < 1) {
        (0, _util.info)("Invalid Gamma: ".concat(_this4.G, " for ").concat(_this4.name, ", ") + 'falling back to default.');
        _this4.G = 1;
      }

      return _this4;
    }

    _createClass(CalGrayCS, [{
      key: "getRgbItem",
      value: function getRgbItem(src, srcOffset, dest, destOffset) {
        convertToRgb(this, src, srcOffset, dest, destOffset, 1);
      }
    }, {
      key: "getRgbBuffer",
      value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
        var scale = 1 / ((1 << bits) - 1);

        for (var i = 0; i < count; ++i) {
          convertToRgb(this, src, srcOffset, dest, destOffset, scale);
          srcOffset += 1;
          destOffset += 3 + alpha01;
        }
      }
    }, {
      key: "getOutputLength",
      value: function getOutputLength(inputLength, alpha01) {
        return inputLength * (3 + alpha01);
      }
    }]);

    return CalGrayCS;
  }(ColorSpace);

  return CalGrayCS;
}();

var CalRGBCS = function CalRGBCSClosure() {
  var BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296]);
  var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]);
  var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]);
  var FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);
  var tempNormalizeMatrix = new Float32Array(3);
  var tempConvertMatrix1 = new Float32Array(3);
  var tempConvertMatrix2 = new Float32Array(3);
  var DECODE_L_CONSTANT = Math.pow((8 + 16) / 116, 3) / 8.0;

  function matrixProduct(a, b, result) {
    result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
    result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];
    result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];
  }

  function convertToFlat(sourceWhitePoint, LMS, result) {
    result[0] = LMS[0] * 1 / sourceWhitePoint[0];
    result[1] = LMS[1] * 1 / sourceWhitePoint[1];
    result[2] = LMS[2] * 1 / sourceWhitePoint[2];
  }

  function convertToD65(sourceWhitePoint, LMS, result) {
    var D65X = 0.95047;
    var D65Y = 1;
    var D65Z = 1.08883;
    result[0] = LMS[0] * D65X / sourceWhitePoint[0];
    result[1] = LMS[1] * D65Y / sourceWhitePoint[1];
    result[2] = LMS[2] * D65Z / sourceWhitePoint[2];
  }

  function sRGBTransferFunction(color) {
    if (color <= 0.0031308) {
      return adjustToRange(0, 1, 12.92 * color);
    }

    return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055);
  }

  function adjustToRange(min, max, value) {
    return Math.max(min, Math.min(max, value));
  }

  function decodeL(L) {
    if (L < 0) {
      return -decodeL(-L);
    }

    if (L > 8.0) {
      return Math.pow((L + 16) / 116, 3);
    }

    return L * DECODE_L_CONSTANT;
  }

  function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {
    if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) {
      result[0] = XYZ_Flat[0];
      result[1] = XYZ_Flat[1];
      result[2] = XYZ_Flat[2];
      return;
    }

    var zeroDecodeL = decodeL(0);
    var X_DST = zeroDecodeL;
    var X_SRC = decodeL(sourceBlackPoint[0]);
    var Y_DST = zeroDecodeL;
    var Y_SRC = decodeL(sourceBlackPoint[1]);
    var Z_DST = zeroDecodeL;
    var Z_SRC = decodeL(sourceBlackPoint[2]);
    var X_Scale = (1 - X_DST) / (1 - X_SRC);
    var X_Offset = 1 - X_Scale;
    var Y_Scale = (1 - Y_DST) / (1 - Y_SRC);
    var Y_Offset = 1 - Y_Scale;
    var Z_Scale = (1 - Z_DST) / (1 - Z_SRC);
    var Z_Offset = 1 - Z_Scale;
    result[0] = XYZ_Flat[0] * X_Scale + X_Offset;
    result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;
    result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;
  }

  function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {
    if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {
      result[0] = XYZ_In[0];
      result[1] = XYZ_In[1];
      result[2] = XYZ_In[2];
      return;
    }

    var LMS = result;
    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
    var LMS_Flat = tempNormalizeMatrix;
    convertToFlat(sourceWhitePoint, LMS, LMS_Flat);
    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result);
  }

  function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {
    var LMS = result;
    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
    var LMS_D65 = tempNormalizeMatrix;
    convertToD65(sourceWhitePoint, LMS, LMS_D65);
    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result);
  }

  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
    var A = adjustToRange(0, 1, src[srcOffset] * scale);
    var B = adjustToRange(0, 1, src[srcOffset + 1] * scale);
    var C = adjustToRange(0, 1, src[srcOffset + 2] * scale);
    var AGR = Math.pow(A, cs.GR);
    var BGG = Math.pow(B, cs.GG);
    var CGB = Math.pow(C, cs.GB);
    var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB;
    var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB;
    var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB;
    var XYZ = tempConvertMatrix1;
    XYZ[0] = X;
    XYZ[1] = Y;
    XYZ[2] = Z;
    var XYZ_Flat = tempConvertMatrix2;
    normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat);
    var XYZ_Black = tempConvertMatrix1;
    compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black);
    var XYZ_D65 = tempConvertMatrix2;
    normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65);
    var SRGB = tempConvertMatrix1;
    matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);
    dest[destOffset] = sRGBTransferFunction(SRGB[0]) * 255;
    dest[destOffset + 1] = sRGBTransferFunction(SRGB[1]) * 255;
    dest[destOffset + 2] = sRGBTransferFunction(SRGB[2]) * 255;
  }

  var CalRGBCS =
  /*#__PURE__*/
  function (_ColorSpace8) {
    _inherits(CalRGBCS, _ColorSpace8);

    function CalRGBCS(whitePoint, blackPoint, gamma, matrix) {
      var _this5;

      _classCallCheck(this, CalRGBCS);

      _this5 = _possibleConstructorReturn(this, _getPrototypeOf(CalRGBCS).call(this, 'CalRGB', 3));

      if (!whitePoint) {
        throw new _util.FormatError('WhitePoint missing - required for color space CalRGB');
      }

      blackPoint = blackPoint || new Float32Array(3);
      gamma = gamma || new Float32Array([1, 1, 1]);
      matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);
      var XW = whitePoint[0];
      var YW = whitePoint[1];
      var ZW = whitePoint[2];
      _this5.whitePoint = whitePoint;
      var XB = blackPoint[0];
      var YB = blackPoint[1];
      var ZB = blackPoint[2];
      _this5.blackPoint = blackPoint;
      _this5.GR = gamma[0];
      _this5.GG = gamma[1];
      _this5.GB = gamma[2];
      _this5.MXA = matrix[0];
      _this5.MYA = matrix[1];
      _this5.MZA = matrix[2];
      _this5.MXB = matrix[3];
      _this5.MYB = matrix[4];
      _this5.MZB = matrix[5];
      _this5.MXC = matrix[6];
      _this5.MYC = matrix[7];
      _this5.MZC = matrix[8];

      if (XW < 0 || ZW < 0 || YW !== 1) {
        throw new _util.FormatError("Invalid WhitePoint components for ".concat(_this5.name) + ', no fallback available');
      }

      if (XB < 0 || YB < 0 || ZB < 0) {
        (0, _util.info)("Invalid BlackPoint for ".concat(_this5.name, " [").concat(XB, ", ").concat(YB, ", ").concat(ZB, "], ") + 'falling back to default.');
        _this5.blackPoint = new Float32Array(3);
      }

      if (_this5.GR < 0 || _this5.GG < 0 || _this5.GB < 0) {
        (0, _util.info)("Invalid Gamma [".concat(_this5.GR, ", ").concat(_this5.GG, ", ").concat(_this5.GB, "] for ") + "".concat(_this5.name, ", falling back to default."));
        _this5.GR = _this5.GG = _this5.GB = 1;
      }

      return _this5;
    }

    _createClass(CalRGBCS, [{
      key: "getRgbItem",
      value: function getRgbItem(src, srcOffset, dest, destOffset) {
        convertToRgb(this, src, srcOffset, dest, destOffset, 1);
      }
    }, {
      key: "getRgbBuffer",
      value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
        var scale = 1 / ((1 << bits) - 1);

        for (var i = 0; i < count; ++i) {
          convertToRgb(this, src, srcOffset, dest, destOffset, scale);
          srcOffset += 3;
          destOffset += 3 + alpha01;
        }
      }
    }, {
      key: "getOutputLength",
      value: function getOutputLength(inputLength, alpha01) {
        return inputLength * (3 + alpha01) / 3 | 0;
      }
    }]);

    return CalRGBCS;
  }(ColorSpace);

  return CalRGBCS;
}();

var LabCS = function LabCSClosure() {
  function fn_g(x) {
    var result;

    if (x >= 6 / 29) {
      result = x * x * x;
    } else {
      result = 108 / 841 * (x - 4 / 29);
    }

    return result;
  }

  function decode(value, high1, low2, high2) {
    return low2 + value * (high2 - low2) / high1;
  }

  function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {
    var Ls = src[srcOffset];
    var as = src[srcOffset + 1];
    var bs = src[srcOffset + 2];

    if (maxVal !== false) {
      Ls = decode(Ls, maxVal, 0, 100);
      as = decode(as, maxVal, cs.amin, cs.amax);
      bs = decode(bs, maxVal, cs.bmin, cs.bmax);
    }

    as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as;
    bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs;
    var M = (Ls + 16) / 116;
    var L = M + as / 500;
    var N = M - bs / 200;
    var X = cs.XW * fn_g(L);
    var Y = cs.YW * fn_g(M);
    var Z = cs.ZW * fn_g(N);
    var r, g, b;

    if (cs.ZW < 1) {
      r = X * 3.1339 + Y * -1.6170 + Z * -0.4906;
      g = X * -0.9785 + Y * 1.9160 + Z * 0.0333;
      b = X * 0.0720 + Y * -0.2290 + Z * 1.4057;
    } else {
      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;
      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;
      b = X * 0.0557 + Y * -0.2040 + Z * 1.0570;
    }

    dest[destOffset] = Math.sqrt(r) * 255;
    dest[destOffset + 1] = Math.sqrt(g) * 255;
    dest[destOffset + 2] = Math.sqrt(b) * 255;
  }

  var LabCS =
  /*#__PURE__*/
  function (_ColorSpace9) {
    _inherits(LabCS, _ColorSpace9);

    function LabCS(whitePoint, blackPoint, range) {
      var _this6;

      _classCallCheck(this, LabCS);

      _this6 = _possibleConstructorReturn(this, _getPrototypeOf(LabCS).call(this, 'Lab', 3));

      if (!whitePoint) {
        throw new _util.FormatError('WhitePoint missing - required for color space Lab');
      }

      blackPoint = blackPoint || [0, 0, 0];
      range = range || [-100, 100, -100, 100];
      _this6.XW = whitePoint[0];
      _this6.YW = whitePoint[1];
      _this6.ZW = whitePoint[2];
      _this6.amin = range[0];
      _this6.amax = range[1];
      _this6.bmin = range[2];
      _this6.bmax = range[3];
      _this6.XB = blackPoint[0];
      _this6.YB = blackPoint[1];
      _this6.ZB = blackPoint[2];

      if (_this6.XW < 0 || _this6.ZW < 0 || _this6.YW !== 1) {
        throw new _util.FormatError('Invalid WhitePoint components, no fallback available');
      }

      if (_this6.XB < 0 || _this6.YB < 0 || _this6.ZB < 0) {
        (0, _util.info)('Invalid BlackPoint, falling back to default');
        _this6.XB = _this6.YB = _this6.ZB = 0;
      }

      if (_this6.amin > _this6.amax || _this6.bmin > _this6.bmax) {
        (0, _util.info)('Invalid Range, falling back to defaults');
        _this6.amin = -100;
        _this6.amax = 100;
        _this6.bmin = -100;
        _this6.bmax = 100;
      }

      return _this6;
    }

    _createClass(LabCS, [{
      key: "getRgbItem",
      value: function getRgbItem(src, srcOffset, dest, destOffset) {
        convertToRgb(this, src, srcOffset, false, dest, destOffset);
      }
    }, {
      key: "getRgbBuffer",
      value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
        var maxVal = (1 << bits) - 1;

        for (var i = 0; i < count; i++) {
          convertToRgb(this, src, srcOffset, maxVal, dest, destOffset);
          srcOffset += 3;
          destOffset += 3 + alpha01;
        }
      }
    }, {
      key: "getOutputLength",
      value: function getOutputLength(inputLength, alpha01) {
        return inputLength * (3 + alpha01) / 3 | 0;
      }
    }, {
      key: "isDefaultDecode",
      value: function isDefaultDecode(decodeMap, bpc) {
        return true;
      }
    }, {
      key: "usesZeroToOneRange",
      get: function get() {
        return (0, _util.shadow)(this, 'usesZeroToOneRange', false);
      }
    }]);

    return LabCS;
  }(ColorSpace);

  return LabCS;
}();

/***/ }),
/* 169 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.AnnotationFactory = exports.AnnotationBorderStyle = exports.Annotation = void 0;

var _util = __w_pdfjs_require__(6);

var _obj = __w_pdfjs_require__(154);

var _primitives = __w_pdfjs_require__(155);

var _colorspace = __w_pdfjs_require__(168);

var _operator_list = __w_pdfjs_require__(170);

var _stream = __w_pdfjs_require__(157);

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }

function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var AnnotationFactory =
/*#__PURE__*/
function () {
  function AnnotationFactory() {
    _classCallCheck(this, AnnotationFactory);
  }

  _createClass(AnnotationFactory, null, [{
    key: "create",
    value: function create(xref, ref, pdfManager, idFactory) {
      return pdfManager.ensure(this, '_create', [xref, ref, pdfManager, idFactory]);
    }
  }, {
    key: "_create",
    value: function _create(xref, ref, pdfManager, idFactory) {
      var dict = xref.fetchIfRef(ref);

      if (!(0, _primitives.isDict)(dict)) {
        return;
      }

      var id = (0, _primitives.isRef)(ref) ? ref.toString() : 'annot_' + idFactory.createObjId();
      var subtype = dict.get('Subtype');
      subtype = (0, _primitives.isName)(subtype) ? subtype.name : null;
      var parameters = {
        xref: xref,
        dict: dict,
        ref: (0, _primitives.isRef)(ref) ? ref : null,
        subtype: subtype,
        id: id,
        pdfManager: pdfManager
      };

      switch (subtype) {
        case 'Link':
          return new LinkAnnotation(parameters);

        case 'Text':
          return new TextAnnotation(parameters);

        case 'Widget':
          var fieldType = (0, _util.getInheritableProperty)({
            dict: dict,
            key: 'FT'
          });
          fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;

          switch (fieldType) {
            case 'Tx':
              return new TextWidgetAnnotation(parameters);

            case 'Btn':
              return new ButtonWidgetAnnotation(parameters);

            case 'Ch':
              return new ChoiceWidgetAnnotation(parameters);
          }

          (0, _util.warn)('Unimplemented widget field type "' + fieldType + '", ' + 'falling back to base field type.');
          return new WidgetAnnotation(parameters);

        case 'Popup':
          return new PopupAnnotation(parameters);

        case 'Line':
          return new LineAnnotation(parameters);

        case 'Square':
          return new SquareAnnotation(parameters);

        case 'Circle':
          return new CircleAnnotation(parameters);

        case 'PolyLine':
          return new PolylineAnnotation(parameters);

        case 'Polygon':
          return new PolygonAnnotation(parameters);

        case 'Ink':
          return new InkAnnotation(parameters);

        case 'Highlight':
          return new HighlightAnnotation(parameters);

        case 'Underline':
          return new UnderlineAnnotation(parameters);

        case 'Squiggly':
          return new SquigglyAnnotation(parameters);

        case 'StrikeOut':
          return new StrikeOutAnnotation(parameters);

        case 'Stamp':
          return new StampAnnotation(parameters);

        case 'FileAttachment':
          return new FileAttachmentAnnotation(parameters);

        default:
          if (!subtype) {
            (0, _util.warn)('Annotation is missing the required /Subtype.');
          } else {
            (0, _util.warn)('Unimplemented annotation type "' + subtype + '", ' + 'falling back to base annotation.');
          }

          return new Annotation(parameters);
      }
    }
  }]);

  return AnnotationFactory;
}();

exports.AnnotationFactory = AnnotationFactory;

function getTransformMatrix(rect, bbox, matrix) {
  var bounds = _util.Util.getAxialAlignedBoundingBox(bbox, matrix);

  var minX = bounds[0];
  var minY = bounds[1];
  var maxX = bounds[2];
  var maxY = bounds[3];

  if (minX === maxX || minY === maxY) {
    return [1, 0, 0, 1, rect[0], rect[1]];
  }

  var xRatio = (rect[2] - rect[0]) / (maxX - minX);
  var yRatio = (rect[3] - rect[1]) / (maxY - minY);
  return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio];
}

var Annotation =
/*#__PURE__*/
function () {
  function Annotation(params) {
    _classCallCheck(this, Annotation);

    var dict = params.dict;
    this.setFlags(dict.get('F'));
    this.setRectangle(dict.getArray('Rect'));
    this.setColor(dict.getArray('C'));
    this.setBorderStyle(dict);
    this.setAppearance(dict);
    this.data = {
      annotationFlags: this.flags,
      borderStyle: this.borderStyle,
      color: this.color,
      hasAppearance: !!this.appearance,
      id: params.id,
      rect: this.rectangle,
      subtype: params.subtype
    };
  }

  _createClass(Annotation, [{
    key: "_hasFlag",
    value: function _hasFlag(flags, flag) {
      return !!(flags & flag);
    }
  }, {
    key: "_isViewable",
    value: function _isViewable(flags) {
      return !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, _util.AnnotationFlag.HIDDEN) && !this._hasFlag(flags, _util.AnnotationFlag.NOVIEW);
    }
  }, {
    key: "_isPrintable",
    value: function _isPrintable(flags) {
      return this._hasFlag(flags, _util.AnnotationFlag.PRINT) && !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, _util.AnnotationFlag.HIDDEN);
    }
  }, {
    key: "setFlags",
    value: function setFlags(flags) {
      this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0;
    }
  }, {
    key: "hasFlag",
    value: function hasFlag(flag) {
      return this._hasFlag(this.flags, flag);
    }
  }, {
    key: "setRectangle",
    value: function setRectangle(rectangle) {
      if (Array.isArray(rectangle) && rectangle.length === 4) {
        this.rectangle = _util.Util.normalizeRect(rectangle);
      } else {
        this.rectangle = [0, 0, 0, 0];
      }
    }
  }, {
    key: "setColor",
    value: function setColor(color) {
      var rgbColor = new Uint8ClampedArray(3);

      if (!Array.isArray(color)) {
        this.color = rgbColor;
        return;
      }

      switch (color.length) {
        case 0:
          this.color = null;
          break;

        case 1:
          _colorspace.ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0);

          this.color = rgbColor;
          break;

        case 3:
          _colorspace.ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0);

          this.color = rgbColor;
          break;

        case 4:
          _colorspace.ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0);

          this.color = rgbColor;
          break;

        default:
          this.color = rgbColor;
          break;
      }
    }
  }, {
    key: "setBorderStyle",
    value: function setBorderStyle(borderStyle) {
      this.borderStyle = new AnnotationBorderStyle();

      if (!(0, _primitives.isDict)(borderStyle)) {
        return;
      }

      if (borderStyle.has('BS')) {
        var dict = borderStyle.get('BS');
        var dictType = dict.get('Type');

        if (!dictType || (0, _primitives.isName)(dictType, 'Border')) {
          this.borderStyle.setWidth(dict.get('W'));
          this.borderStyle.setStyle(dict.get('S'));
          this.borderStyle.setDashArray(dict.getArray('D'));
        }
      } else if (borderStyle.has('Border')) {
        var array = borderStyle.getArray('Border');

        if (Array.isArray(array) && array.length >= 3) {
          this.borderStyle.setHorizontalCornerRadius(array[0]);
          this.borderStyle.setVerticalCornerRadius(array[1]);
          this.borderStyle.setWidth(array[2]);

          if (array.length === 4) {
            this.borderStyle.setDashArray(array[3]);
          }
        }
      } else {
        this.borderStyle.setWidth(0);
      }
    }
  }, {
    key: "setAppearance",
    value: function setAppearance(dict) {
      this.appearance = null;
      var appearanceStates = dict.get('AP');

      if (!(0, _primitives.isDict)(appearanceStates)) {
        return;
      }

      var normalAppearanceState = appearanceStates.get('N');

      if ((0, _primitives.isStream)(normalAppearanceState)) {
        this.appearance = normalAppearanceState;
        return;
      }

      if (!(0, _primitives.isDict)(normalAppearanceState)) {
        return;
      }

      var as = dict.get('AS');

      if (!(0, _primitives.isName)(as) || !normalAppearanceState.has(as.name)) {
        return;
      }

      this.appearance = normalAppearanceState.get(as.name);
    }
  }, {
    key: "_preparePopup",
    value: function _preparePopup(dict) {
      if (!dict.has('C')) {
        this.data.color = null;
      }

      this.data.hasPopup = dict.has('Popup');
      this.data.title = (0, _util.stringToPDFString)(dict.get('T') || '');
      this.data.contents = (0, _util.stringToPDFString)(dict.get('Contents') || '');
    }
  }, {
    key: "loadResources",
    value: function loadResources(keys) {
      return this.appearance.dict.getAsync('Resources').then(function (resources) {
        if (!resources) {
          return;
        }

        var objectLoader = new _obj.ObjectLoader(resources, keys, resources.xref);
        return objectLoader.load().then(function () {
          return resources;
        });
      });
    }
  }, {
    key: "getOperatorList",
    value: function getOperatorList(evaluator, task, renderForms) {
      var _this = this;

      if (!this.appearance) {
        return Promise.resolve(new _operator_list.OperatorList());
      }

      var data = this.data;
      var appearanceDict = this.appearance.dict;
      var resourcesPromise = this.loadResources(['ExtGState', 'ColorSpace', 'Pattern', 'Shading', 'XObject', 'Font']);
      var bbox = appearanceDict.getArray('BBox') || [0, 0, 1, 1];
      var matrix = appearanceDict.getArray('Matrix') || [1, 0, 0, 1, 0, 0];
      var transform = getTransformMatrix(data.rect, bbox, matrix);
      return resourcesPromise.then(function (resources) {
        var opList = new _operator_list.OperatorList();
        opList.addOp(_util.OPS.beginAnnotation, [data.rect, transform, matrix]);
        return evaluator.getOperatorList({
          stream: _this.appearance,
          task: task,
          resources: resources,
          operatorList: opList
        }).then(function () {
          opList.addOp(_util.OPS.endAnnotation, []);

          _this.appearance.reset();

          return opList;
        });
      });
    }
  }, {
    key: "viewable",
    get: function get() {
      if (this.flags === 0) {
        return true;
      }

      return this._isViewable(this.flags);
    }
  }, {
    key: "printable",
    get: function get() {
      if (this.flags === 0) {
        return false;
      }

      return this._isPrintable(this.flags);
    }
  }]);

  return Annotation;
}();

exports.Annotation = Annotation;

var AnnotationBorderStyle =
/*#__PURE__*/
function () {
  function AnnotationBorderStyle() {
    _classCallCheck(this, AnnotationBorderStyle);

    this.width = 1;
    this.style = _util.AnnotationBorderStyleType.SOLID;
    this.dashArray = [3];
    this.horizontalCornerRadius = 0;
    this.verticalCornerRadius = 0;
  }

  _createClass(AnnotationBorderStyle, [{
    key: "setWidth",
    value: function setWidth(width) {
      if ((0, _primitives.isName)(width)) {
        this.width = 0;
        return;
      }

      if (Number.isInteger(width)) {
        this.width = width;
      }
    }
  }, {
    key: "setStyle",
    value: function setStyle(style) {
      if (!(0, _primitives.isName)(style)) {
        return;
      }

      switch (style.name) {
        case 'S':
          this.style = _util.AnnotationBorderStyleType.SOLID;
          break;

        case 'D':
          this.style = _util.AnnotationBorderStyleType.DASHED;
          break;

        case 'B':
          this.style = _util.AnnotationBorderStyleType.BEVELED;
          break;

        case 'I':
          this.style = _util.AnnotationBorderStyleType.INSET;
          break;

        case 'U':
          this.style = _util.AnnotationBorderStyleType.UNDERLINE;
          break;

        default:
          break;
      }
    }
  }, {
    key: "setDashArray",
    value: function setDashArray(dashArray) {
      if (Array.isArray(dashArray) && dashArray.length > 0) {
        var isValid = true;
        var allZeros = true;

        for (var i = 0, len = dashArray.length; i < len; i++) {
          var element = dashArray[i];
          var validNumber = +element >= 0;

          if (!validNumber) {
            isValid = false;
            break;
          } else if (element > 0) {
            allZeros = false;
          }
        }

        if (isValid && !allZeros) {
          this.dashArray = dashArray;
        } else {
          this.width = 0;
        }
      } else if (dashArray) {
        this.width = 0;
      }
    }
  }, {
    key: "setHorizontalCornerRadius",
    value: function setHorizontalCornerRadius(radius) {
      if (Number.isInteger(radius)) {
        this.horizontalCornerRadius = radius;
      }
    }
  }, {
    key: "setVerticalCornerRadius",
    value: function setVerticalCornerRadius(radius) {
      if (Number.isInteger(radius)) {
        this.verticalCornerRadius = radius;
      }
    }
  }]);

  return AnnotationBorderStyle;
}();

exports.AnnotationBorderStyle = AnnotationBorderStyle;

var WidgetAnnotation =
/*#__PURE__*/
function (_Annotation) {
  _inherits(WidgetAnnotation, _Annotation);

  function WidgetAnnotation(params) {
    var _this2;

    _classCallCheck(this, WidgetAnnotation);

    _this2 = _possibleConstructorReturn(this, _getPrototypeOf(WidgetAnnotation).call(this, params));
    var dict = params.dict;
    var data = _this2.data;
    data.annotationType = _util.AnnotationType.WIDGET;
    data.fieldName = _this2._constructFieldName(dict);
    data.fieldValue = (0, _util.getInheritableProperty)({
      dict: dict,
      key: 'V',
      getArray: true
    });
    data.alternativeText = (0, _util.stringToPDFString)(dict.get('TU') || '');
    data.defaultAppearance = (0, _util.getInheritableProperty)({
      dict: dict,
      key: 'DA'
    }) || '';
    var fieldType = (0, _util.getInheritableProperty)({
      dict: dict,
      key: 'FT'
    });
    data.fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;
    _this2.fieldResources = (0, _util.getInheritableProperty)({
      dict: dict,
      key: 'DR'
    }) || _primitives.Dict.empty;
    data.fieldFlags = (0, _util.getInheritableProperty)({
      dict: dict,
      key: 'Ff'
    });

    if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) {
      data.fieldFlags = 0;
    }

    data.readOnly = _this2.hasFieldFlag(_util.AnnotationFieldFlag.READONLY);

    if (data.fieldType === 'Sig') {
      data.fieldValue = null;

      _this2.setFlags(_util.AnnotationFlag.HIDDEN);
    }

    return _this2;
  }

  _createClass(WidgetAnnotation, [{
    key: "_constructFieldName",
    value: function _constructFieldName(dict) {
      if (!dict.has('T') && !dict.has('Parent')) {
        (0, _util.warn)('Unknown field name, falling back to empty field name.');
        return '';
      }

      if (!dict.has('Parent')) {
        return (0, _util.stringToPDFString)(dict.get('T'));
      }

      var fieldName = [];

      if (dict.has('T')) {
        fieldName.unshift((0, _util.stringToPDFString)(dict.get('T')));
      }

      var loopDict = dict;

      while (loopDict.has('Parent')) {
        loopDict = loopDict.get('Parent');

        if (!(0, _primitives.isDict)(loopDict)) {
          break;
        }

        if (loopDict.has('T')) {
          fieldName.unshift((0, _util.stringToPDFString)(loopDict.get('T')));
        }
      }

      return fieldName.join('.');
    }
  }, {
    key: "hasFieldFlag",
    value: function hasFieldFlag(flag) {
      return !!(this.data.fieldFlags & flag);
    }
  }, {
    key: "getOperatorList",
    value: function getOperatorList(evaluator, task, renderForms) {
      if (renderForms) {
        return Promise.resolve(new _operator_list.OperatorList());
      }

      return _get(_getPrototypeOf(WidgetAnnotation.prototype), "getOperatorList", this).call(this, evaluator, task, renderForms);
    }
  }]);

  return WidgetAnnotation;
}(Annotation);

var TextWidgetAnnotation =
/*#__PURE__*/
function (_WidgetAnnotation) {
  _inherits(TextWidgetAnnotation, _WidgetAnnotation);

  function TextWidgetAnnotation(params) {
    var _this3;

    _classCallCheck(this, TextWidgetAnnotation);

    _this3 = _possibleConstructorReturn(this, _getPrototypeOf(TextWidgetAnnotation).call(this, params));
    var dict = params.dict;
    _this3.data.fieldValue = (0, _util.stringToPDFString)(_this3.data.fieldValue || '');
    var alignment = (0, _util.getInheritableProperty)({
      dict: dict,
      key: 'Q'
    });

    if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) {
      alignment = null;
    }

    _this3.data.textAlignment = alignment;
    var maximumLength = (0, _util.getInheritableProperty)({
      dict: dict,
      key: 'MaxLen'
    });

    if (!Number.isInteger(maximumLength) || maximumLength < 0) {
      maximumLength = null;
    }

    _this3.data.maxLen = maximumLength;
    _this3.data.multiLine = _this3.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE);
    _this3.data.comb = _this3.hasFieldFlag(_util.AnnotationFieldFlag.COMB) && !_this3.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE) && !_this3.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD) && !_this3.hasFieldFlag(_util.AnnotationFieldFlag.FILESELECT) && _this3.data.maxLen !== null;
    return _this3;
  }

  _createClass(TextWidgetAnnotation, [{
    key: "getOperatorList",
    value: function getOperatorList(evaluator, task, renderForms) {
      if (renderForms || this.appearance) {
        return _get(_getPrototypeOf(TextWidgetAnnotation.prototype), "getOperatorList", this).call(this, evaluator, task, renderForms);
      }

      var operatorList = new _operator_list.OperatorList();

      if (!this.data.defaultAppearance) {
        return Promise.resolve(operatorList);
      }

      var stream = new _stream.Stream((0, _util.stringToBytes)(this.data.defaultAppearance));
      return evaluator.getOperatorList({
        stream: stream,
        task: task,
        resources: this.fieldResources,
        operatorList: operatorList
      }).then(function () {
        return operatorList;
      });
    }
  }]);

  return TextWidgetAnnotation;
}(WidgetAnnotation);

var ButtonWidgetAnnotation =
/*#__PURE__*/
function (_WidgetAnnotation2) {
  _inherits(ButtonWidgetAnnotation, _WidgetAnnotation2);

  function ButtonWidgetAnnotation(params) {
    var _this4;

    _classCallCheck(this, ButtonWidgetAnnotation);

    _this4 = _possibleConstructorReturn(this, _getPrototypeOf(ButtonWidgetAnnotation).call(this, params));
    _this4.data.checkBox = !_this4.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !_this4.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);
    _this4.data.radioButton = _this4.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !_this4.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);
    _this4.data.pushButton = _this4.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);

    if (_this4.data.checkBox) {
      _this4._processCheckBox(params);
    } else if (_this4.data.radioButton) {
      _this4._processRadioButton(params);
    } else if (_this4.data.pushButton) {
      _this4._processPushButton(params);
    } else {
      (0, _util.warn)('Invalid field flags for button widget annotation');
    }

    return _this4;
  }

  _createClass(ButtonWidgetAnnotation, [{
    key: "_processCheckBox",
    value: function _processCheckBox(params) {
      if ((0, _primitives.isName)(this.data.fieldValue)) {
        this.data.fieldValue = this.data.fieldValue.name;
      }

      var customAppearance = params.dict.get('AP');

      if (!(0, _primitives.isDict)(customAppearance)) {
        return;
      }

      var exportValueOptionsDict = customAppearance.get('D');

      if (!(0, _primitives.isDict)(exportValueOptionsDict)) {
        return;
      }

      var exportValues = exportValueOptionsDict.getKeys();
      var hasCorrectOptionCount = exportValues.length === 2;

      if (!hasCorrectOptionCount) {
        return;
      }

      this.data.exportValue = exportValues[0] === 'Off' ? exportValues[1] : exportValues[0];
    }
  }, {
    key: "_processRadioButton",
    value: function _processRadioButton(params) {
      this.data.fieldValue = this.data.buttonValue = null;
      var fieldParent = params.dict.get('Parent');

      if ((0, _primitives.isDict)(fieldParent) && fieldParent.has('V')) {
        var fieldParentValue = fieldParent.get('V');

        if ((0, _primitives.isName)(fieldParentValue)) {
          this.data.fieldValue = fieldParentValue.name;
        }
      }

      var appearanceStates = params.dict.get('AP');

      if (!(0, _primitives.isDict)(appearanceStates)) {
        return;
      }

      var normalAppearanceState = appearanceStates.get('N');

      if (!(0, _primitives.isDict)(normalAppearanceState)) {
        return;
      }

      var keys = normalAppearanceState.getKeys();

      for (var i = 0, ii = keys.length; i < ii; i++) {
        if (keys[i] !== 'Off') {
          this.data.buttonValue = keys[i];
          break;
        }
      }
    }
  }, {
    key: "_processPushButton",
    value: function _processPushButton(params) {
      if (!params.dict.has('A')) {
        (0, _util.warn)('Push buttons without action dictionaries are not supported');
        return;
      }

      _obj.Catalog.parseDestDictionary({
        destDict: params.dict,
        resultObj: this.data,
        docBaseUrl: params.pdfManager.docBaseUrl
      });
    }
  }]);

  return ButtonWidgetAnnotation;
}(WidgetAnnotation);

var ChoiceWidgetAnnotation =
/*#__PURE__*/
function (_WidgetAnnotation3) {
  _inherits(ChoiceWidgetAnnotation, _WidgetAnnotation3);

  function ChoiceWidgetAnnotation(params) {
    var _this5;

    _classCallCheck(this, ChoiceWidgetAnnotation);

    _this5 = _possibleConstructorReturn(this, _getPrototypeOf(ChoiceWidgetAnnotation).call(this, params));
    _this5.data.options = [];
    var options = (0, _util.getInheritableProperty)({
      dict: params.dict,
      key: 'Opt'
    });

    if (Array.isArray(options)) {
      var xref = params.xref;

      for (var i = 0, ii = options.length; i < ii; i++) {
        var option = xref.fetchIfRef(options[i]);
        var isOptionArray = Array.isArray(option);
        _this5.data.options[i] = {
          exportValue: isOptionArray ? xref.fetchIfRef(option[0]) : option,
          displayValue: (0, _util.stringToPDFString)(isOptionArray ? xref.fetchIfRef(option[1]) : option)
        };
      }
    }

    if (!Array.isArray(_this5.data.fieldValue)) {
      _this5.data.fieldValue = [_this5.data.fieldValue];
    }

    _this5.data.combo = _this5.hasFieldFlag(_util.AnnotationFieldFlag.COMBO);
    _this5.data.multiSelect = _this5.hasFieldFlag(_util.AnnotationFieldFlag.MULTISELECT);
    return _this5;
  }

  return ChoiceWidgetAnnotation;
}(WidgetAnnotation);

var TextAnnotation =
/*#__PURE__*/
function (_Annotation2) {
  _inherits(TextAnnotation, _Annotation2);

  function TextAnnotation(parameters) {
    var _this6;

    _classCallCheck(this, TextAnnotation);

    var DEFAULT_ICON_SIZE = 22;
    _this6 = _possibleConstructorReturn(this, _getPrototypeOf(TextAnnotation).call(this, parameters));
    _this6.data.annotationType = _util.AnnotationType.TEXT;

    if (_this6.data.hasAppearance) {
      _this6.data.name = 'NoIcon';
    } else {
      _this6.data.rect[1] = _this6.data.rect[3] - DEFAULT_ICON_SIZE;
      _this6.data.rect[2] = _this6.data.rect[0] + DEFAULT_ICON_SIZE;
      _this6.data.name = parameters.dict.has('Name') ? parameters.dict.get('Name').name : 'Note';
    }

    _this6._preparePopup(parameters.dict);

    return _this6;
  }

  return TextAnnotation;
}(Annotation);

var LinkAnnotation =
/*#__PURE__*/
function (_Annotation3) {
  _inherits(LinkAnnotation, _Annotation3);

  function LinkAnnotation(params) {
    var _this7;

    _classCallCheck(this, LinkAnnotation);

    _this7 = _possibleConstructorReturn(this, _getPrototypeOf(LinkAnnotation).call(this, params));
    _this7.data.annotationType = _util.AnnotationType.LINK;

    _obj.Catalog.parseDestDictionary({
      destDict: params.dict,
      resultObj: _this7.data,
      docBaseUrl: params.pdfManager.docBaseUrl
    });

    return _this7;
  }

  return LinkAnnotation;
}(Annotation);

var PopupAnnotation =
/*#__PURE__*/
function (_Annotation4) {
  _inherits(PopupAnnotation, _Annotation4);

  function PopupAnnotation(parameters) {
    var _this8;

    _classCallCheck(this, PopupAnnotation);

    _this8 = _possibleConstructorReturn(this, _getPrototypeOf(PopupAnnotation).call(this, parameters));
    _this8.data.annotationType = _util.AnnotationType.POPUP;
    var dict = parameters.dict;
    var parentItem = dict.get('Parent');

    if (!parentItem) {
      (0, _util.warn)('Popup annotation has a missing or invalid parent annotation.');
      return _possibleConstructorReturn(_this8);
    }

    var parentSubtype = parentItem.get('Subtype');
    _this8.data.parentType = (0, _primitives.isName)(parentSubtype) ? parentSubtype.name : null;
    _this8.data.parentId = dict.getRaw('Parent').toString();
    _this8.data.title = (0, _util.stringToPDFString)(parentItem.get('T') || '');
    _this8.data.contents = (0, _util.stringToPDFString)(parentItem.get('Contents') || '');

    if (!parentItem.has('C')) {
      _this8.data.color = null;
    } else {
      _this8.setColor(parentItem.getArray('C'));

      _this8.data.color = _this8.color;
    }

    if (!_this8.viewable) {
      var parentFlags = parentItem.get('F');

      if (_this8._isViewable(parentFlags)) {
        _this8.setFlags(parentFlags);
      }
    }

    return _this8;
  }

  return PopupAnnotation;
}(Annotation);

var LineAnnotation =
/*#__PURE__*/
function (_Annotation5) {
  _inherits(LineAnnotation, _Annotation5);

  function LineAnnotation(parameters) {
    var _this9;

    _classCallCheck(this, LineAnnotation);

    _this9 = _possibleConstructorReturn(this, _getPrototypeOf(LineAnnotation).call(this, parameters));
    _this9.data.annotationType = _util.AnnotationType.LINE;
    var dict = parameters.dict;
    _this9.data.lineCoordinates = _util.Util.normalizeRect(dict.getArray('L'));

    _this9._preparePopup(dict);

    return _this9;
  }

  return LineAnnotation;
}(Annotation);

var SquareAnnotation =
/*#__PURE__*/
function (_Annotation6) {
  _inherits(SquareAnnotation, _Annotation6);

  function SquareAnnotation(parameters) {
    var _this10;

    _classCallCheck(this, SquareAnnotation);

    _this10 = _possibleConstructorReturn(this, _getPrototypeOf(SquareAnnotation).call(this, parameters));
    _this10.data.annotationType = _util.AnnotationType.SQUARE;

    _this10._preparePopup(parameters.dict);

    return _this10;
  }

  return SquareAnnotation;
}(Annotation);

var CircleAnnotation =
/*#__PURE__*/
function (_Annotation7) {
  _inherits(CircleAnnotation, _Annotation7);

  function CircleAnnotation(parameters) {
    var _this11;

    _classCallCheck(this, CircleAnnotation);

    _this11 = _possibleConstructorReturn(this, _getPrototypeOf(CircleAnnotation).call(this, parameters));
    _this11.data.annotationType = _util.AnnotationType.CIRCLE;

    _this11._preparePopup(parameters.dict);

    return _this11;
  }

  return CircleAnnotation;
}(Annotation);

var PolylineAnnotation =
/*#__PURE__*/
function (_Annotation8) {
  _inherits(PolylineAnnotation, _Annotation8);

  function PolylineAnnotation(parameters) {
    var _this12;

    _classCallCheck(this, PolylineAnnotation);

    _this12 = _possibleConstructorReturn(this, _getPrototypeOf(PolylineAnnotation).call(this, parameters));
    _this12.data.annotationType = _util.AnnotationType.POLYLINE;
    var dict = parameters.dict;
    var rawVertices = dict.getArray('Vertices');
    _this12.data.vertices = [];

    for (var i = 0, ii = rawVertices.length; i < ii; i += 2) {
      _this12.data.vertices.push({
        x: rawVertices[i],
        y: rawVertices[i + 1]
      });
    }

    _this12._preparePopup(dict);

    return _this12;
  }

  return PolylineAnnotation;
}(Annotation);

var PolygonAnnotation =
/*#__PURE__*/
function (_PolylineAnnotation) {
  _inherits(PolygonAnnotation, _PolylineAnnotation);

  function PolygonAnnotation(parameters) {
    var _this13;

    _classCallCheck(this, PolygonAnnotation);

    _this13 = _possibleConstructorReturn(this, _getPrototypeOf(PolygonAnnotation).call(this, parameters));
    _this13.data.annotationType = _util.AnnotationType.POLYGON;
    return _this13;
  }

  return PolygonAnnotation;
}(PolylineAnnotation);

var InkAnnotation =
/*#__PURE__*/
function (_Annotation9) {
  _inherits(InkAnnotation, _Annotation9);

  function InkAnnotation(parameters) {
    var _this14;

    _classCallCheck(this, InkAnnotation);

    _this14 = _possibleConstructorReturn(this, _getPrototypeOf(InkAnnotation).call(this, parameters));
    _this14.data.annotationType = _util.AnnotationType.INK;
    var dict = parameters.dict;
    var xref = parameters.xref;
    var originalInkLists = dict.getArray('InkList');
    _this14.data.inkLists = [];

    for (var i = 0, ii = originalInkLists.length; i < ii; ++i) {
      _this14.data.inkLists.push([]);

      for (var j = 0, jj = originalInkLists[i].length; j < jj; j += 2) {
        _this14.data.inkLists[i].push({
          x: xref.fetchIfRef(originalInkLists[i][j]),
          y: xref.fetchIfRef(originalInkLists[i][j + 1])
        });
      }
    }

    _this14._preparePopup(dict);

    return _this14;
  }

  return InkAnnotation;
}(Annotation);

var HighlightAnnotation =
/*#__PURE__*/
function (_Annotation10) {
  _inherits(HighlightAnnotation, _Annotation10);

  function HighlightAnnotation(parameters) {
    var _this15;

    _classCallCheck(this, HighlightAnnotation);

    _this15 = _possibleConstructorReturn(this, _getPrototypeOf(HighlightAnnotation).call(this, parameters));
    _this15.data.annotationType = _util.AnnotationType.HIGHLIGHT;

    _this15._preparePopup(parameters.dict);

    return _this15;
  }

  return HighlightAnnotation;
}(Annotation);

var UnderlineAnnotation =
/*#__PURE__*/
function (_Annotation11) {
  _inherits(UnderlineAnnotation, _Annotation11);

  function UnderlineAnnotation(parameters) {
    var _this16;

    _classCallCheck(this, UnderlineAnnotation);

    _this16 = _possibleConstructorReturn(this, _getPrototypeOf(UnderlineAnnotation).call(this, parameters));
    _this16.data.annotationType = _util.AnnotationType.UNDERLINE;

    _this16._preparePopup(parameters.dict);

    return _this16;
  }

  return UnderlineAnnotation;
}(Annotation);

var SquigglyAnnotation =
/*#__PURE__*/
function (_Annotation12) {
  _inherits(SquigglyAnnotation, _Annotation12);

  function SquigglyAnnotation(parameters) {
    var _this17;

    _classCallCheck(this, SquigglyAnnotation);

    _this17 = _possibleConstructorReturn(this, _getPrototypeOf(SquigglyAnnotation).call(this, parameters));
    _this17.data.annotationType = _util.AnnotationType.SQUIGGLY;

    _this17._preparePopup(parameters.dict);

    return _this17;
  }

  return SquigglyAnnotation;
}(Annotation);

var StrikeOutAnnotation =
/*#__PURE__*/
function (_Annotation13) {
  _inherits(StrikeOutAnnotation, _Annotation13);

  function StrikeOutAnnotation(parameters) {
    var _this18;

    _classCallCheck(this, StrikeOutAnnotation);

    _this18 = _possibleConstructorReturn(this, _getPrototypeOf(StrikeOutAnnotation).call(this, parameters));
    _this18.data.annotationType = _util.AnnotationType.STRIKEOUT;

    _this18._preparePopup(parameters.dict);

    return _this18;
  }

  return StrikeOutAnnotation;
}(Annotation);

var StampAnnotation =
/*#__PURE__*/
function (_Annotation14) {
  _inherits(StampAnnotation, _Annotation14);

  function StampAnnotation(parameters) {
    var _this19;

    _classCallCheck(this, StampAnnotation);

    _this19 = _possibleConstructorReturn(this, _getPrototypeOf(StampAnnotation).call(this, parameters));
    _this19.data.annotationType = _util.AnnotationType.STAMP;

    _this19._preparePopup(parameters.dict);

    return _this19;
  }

  return StampAnnotation;
}(Annotation);

var FileAttachmentAnnotation =
/*#__PURE__*/
function (_Annotation15) {
  _inherits(FileAttachmentAnnotation, _Annotation15);

  function FileAttachmentAnnotation(parameters) {
    var _this20;

    _classCallCheck(this, FileAttachmentAnnotation);

    _this20 = _possibleConstructorReturn(this, _getPrototypeOf(FileAttachmentAnnotation).call(this, parameters));
    var file = new _obj.FileSpec(parameters.dict.get('FS'), parameters.xref);
    _this20.data.annotationType = _util.AnnotationType.FILEATTACHMENT;
    _this20.data.file = file.serializable;

    _this20._preparePopup(parameters.dict);

    return _this20;
  }

  return FileAttachmentAnnotation;
}(Annotation);

/***/ }),
/* 170 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.OperatorList = void 0;

var _util = __w_pdfjs_require__(6);

var QueueOptimizer = function QueueOptimizerClosure() {
  function addState(parentState, pattern, checkFn, iterateFn, processFn) {
    var state = parentState;

    for (var i = 0, ii = pattern.length - 1; i < ii; i++) {
      var item = pattern[i];
      state = state[item] || (state[item] = []);
    }

    state[pattern[pattern.length - 1]] = {
      checkFn: checkFn,
      iterateFn: iterateFn,
      processFn: processFn
    };
  }

  function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray) {
    var iFirstPIMXO = iFirstSave + 2;

    for (var i = 0; i < count; i++) {
      var arg = argsArray[iFirstPIMXO + 4 * i];
      var imageMask = arg.length === 1 && arg[0];

      if (imageMask && imageMask.width === 1 && imageMask.height === 1 && (!imageMask.data.length || imageMask.data.length === 1 && imageMask.data[0] === 0)) {
        fnArray[iFirstPIMXO + 4 * i] = _util.OPS.paintSolidColorImageMask;
        continue;
      }

      break;
    }

    return count - i;
  }

  var InitialState = [];
  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintInlineImageXObject, _util.OPS.restore], null, function iterateInlineImageGroup(context, i) {
    var fnArray = context.fnArray;
    var iFirstSave = context.iCurr - 3;
    var pos = (i - iFirstSave) % 4;

    switch (pos) {
      case 0:
        return fnArray[i] === _util.OPS.save;

      case 1:
        return fnArray[i] === _util.OPS.transform;

      case 2:
        return fnArray[i] === _util.OPS.paintInlineImageXObject;

      case 3:
        return fnArray[i] === _util.OPS.restore;
    }
  }, function foundInlineImageGroup(context, i) {
    var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;
    var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;
    var MAX_WIDTH = 1000;
    var IMAGE_PADDING = 1;
    var fnArray = context.fnArray,
        argsArray = context.argsArray;
    var curr = context.iCurr;
    var iFirstSave = curr - 3;
    var iFirstTransform = curr - 2;
    var iFirstPIIXO = curr - 1;
    var count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);

    if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {
      return i - (i - iFirstSave) % 4;
    }

    var maxX = 0;
    var map = [],
        maxLineHeight = 0;
    var currentX = IMAGE_PADDING,
        currentY = IMAGE_PADDING;
    var q;

    for (q = 0; q < count; q++) {
      var transform = argsArray[iFirstTransform + (q << 2)];
      var img = argsArray[iFirstPIIXO + (q << 2)][0];

      if (currentX + img.width > MAX_WIDTH) {
        maxX = Math.max(maxX, currentX);
        currentY += maxLineHeight + 2 * IMAGE_PADDING;
        currentX = 0;
        maxLineHeight = 0;
      }

      map.push({
        transform: transform,
        x: currentX,
        y: currentY,
        w: img.width,
        h: img.height
      });
      currentX += img.width + 2 * IMAGE_PADDING;
      maxLineHeight = Math.max(maxLineHeight, img.height);
    }

    var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;
    var imgHeight = currentY + maxLineHeight + IMAGE_PADDING;
    var imgData = new Uint8ClampedArray(imgWidth * imgHeight * 4);
    var imgRowSize = imgWidth << 2;

    for (q = 0; q < count; q++) {
      var data = argsArray[iFirstPIIXO + (q << 2)][0].data;
      var rowSize = map[q].w << 2;
      var dataOffset = 0;
      var offset = map[q].x + map[q].y * imgWidth << 2;
      imgData.set(data.subarray(0, rowSize), offset - imgRowSize);

      for (var k = 0, kk = map[q].h; k < kk; k++) {
        imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);
        dataOffset += rowSize;
        offset += imgRowSize;
      }

      imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);

      while (offset >= 0) {
        data[offset - 4] = data[offset];
        data[offset - 3] = data[offset + 1];
        data[offset - 2] = data[offset + 2];
        data[offset - 1] = data[offset + 3];
        data[offset + rowSize] = data[offset + rowSize - 4];
        data[offset + rowSize + 1] = data[offset + rowSize - 3];
        data[offset + rowSize + 2] = data[offset + rowSize - 2];
        data[offset + rowSize + 3] = data[offset + rowSize - 1];
        offset -= imgRowSize;
      }
    }

    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintInlineImageXObjectGroup);
    argsArray.splice(iFirstSave, count * 4, [{
      width: imgWidth,
      height: imgHeight,
      kind: _util.ImageKind.RGBA_32BPP,
      data: imgData
    }, map]);
    return iFirstSave + 1;
  });
  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageMaskXObject, _util.OPS.restore], null, function iterateImageMaskGroup(context, i) {
    var fnArray = context.fnArray;
    var iFirstSave = context.iCurr - 3;
    var pos = (i - iFirstSave) % 4;

    switch (pos) {
      case 0:
        return fnArray[i] === _util.OPS.save;

      case 1:
        return fnArray[i] === _util.OPS.transform;

      case 2:
        return fnArray[i] === _util.OPS.paintImageMaskXObject;

      case 3:
        return fnArray[i] === _util.OPS.restore;
    }
  }, function foundImageMaskGroup(context, i) {
    var MIN_IMAGES_IN_MASKS_BLOCK = 10;
    var MAX_IMAGES_IN_MASKS_BLOCK = 100;
    var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;
    var fnArray = context.fnArray,
        argsArray = context.argsArray;
    var curr = context.iCurr;
    var iFirstSave = curr - 3;
    var iFirstTransform = curr - 2;
    var iFirstPIMXO = curr - 1;
    var count = Math.floor((i - iFirstSave) / 4);
    count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray);

    if (count < MIN_IMAGES_IN_MASKS_BLOCK) {
      return i - (i - iFirstSave) % 4;
    }

    var q;
    var isSameImage = false;
    var iTransform, transformArgs;
    var firstPIMXOArg0 = argsArray[iFirstPIMXO][0];

    if (argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0) {
      isSameImage = true;
      var firstTransformArg0 = argsArray[iFirstTransform][0];
      var firstTransformArg3 = argsArray[iFirstTransform][3];
      iTransform = iFirstTransform + 4;
      var iPIMXO = iFirstPIMXO + 4;

      for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {
        transformArgs = argsArray[iTransform];

        if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== 0 || transformArgs[2] !== 0 || transformArgs[3] !== firstTransformArg3) {
          if (q < MIN_IMAGES_IN_MASKS_BLOCK) {
            isSameImage = false;
          } else {
            count = q;
          }

          break;
        }
      }
    }

    if (isSameImage) {
      count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);
      var positions = new Float32Array(count * 2);
      iTransform = iFirstTransform;

      for (q = 0; q < count; q++, iTransform += 4) {
        transformArgs = argsArray[iTransform];
        positions[q << 1] = transformArgs[4];
        positions[(q << 1) + 1] = transformArgs[5];
      }

      fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectRepeat);
      argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]);
    } else {
      count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);
      var images = [];

      for (q = 0; q < count; q++) {
        transformArgs = argsArray[iFirstTransform + (q << 2)];
        var maskParams = argsArray[iFirstPIMXO + (q << 2)][0];
        images.push({
          data: maskParams.data,
          width: maskParams.width,
          height: maskParams.height,
          transform: transformArgs
        });
      }

      fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectGroup);
      argsArray.splice(iFirstSave, count * 4, [images]);
    }

    return iFirstSave + 1;
  });
  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageXObject, _util.OPS.restore], function (context) {
    var argsArray = context.argsArray;
    var iFirstTransform = context.iCurr - 2;
    return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0;
  }, function (context, i) {
    var fnArray = context.fnArray,
        argsArray = context.argsArray;
    var iFirstSave = context.iCurr - 3;
    var pos = (i - iFirstSave) % 4;

    switch (pos) {
      case 0:
        return fnArray[i] === _util.OPS.save;

      case 1:
        if (fnArray[i] !== _util.OPS.transform) {
          return false;
        }

        var iFirstTransform = context.iCurr - 2;
        var firstTransformArg0 = argsArray[iFirstTransform][0];
        var firstTransformArg3 = argsArray[iFirstTransform][3];

        if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || argsArray[i][3] !== firstTransformArg3) {
          return false;
        }

        return true;

      case 2:
        if (fnArray[i] !== _util.OPS.paintImageXObject) {
          return false;
        }

        var iFirstPIXO = context.iCurr - 1;
        var firstPIXOArg0 = argsArray[iFirstPIXO][0];

        if (argsArray[i][0] !== firstPIXOArg0) {
          return false;
        }

        return true;

      case 3:
        return fnArray[i] === _util.OPS.restore;
    }
  }, function (context, i) {
    var MIN_IMAGES_IN_BLOCK = 3;
    var MAX_IMAGES_IN_BLOCK = 1000;
    var fnArray = context.fnArray,
        argsArray = context.argsArray;
    var curr = context.iCurr;
    var iFirstSave = curr - 3;
    var iFirstTransform = curr - 2;
    var iFirstPIXO = curr - 1;
    var firstPIXOArg0 = argsArray[iFirstPIXO][0];
    var firstTransformArg0 = argsArray[iFirstTransform][0];
    var firstTransformArg3 = argsArray[iFirstTransform][3];
    var count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK);

    if (count < MIN_IMAGES_IN_BLOCK) {
      return i - (i - iFirstSave) % 4;
    }

    var positions = new Float32Array(count * 2);
    var iTransform = iFirstTransform;

    for (var q = 0; q < count; q++, iTransform += 4) {
      var transformArgs = argsArray[iTransform];
      positions[q << 1] = transformArgs[4];
      positions[(q << 1) + 1] = transformArgs[5];
    }

    var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions];
    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageXObjectRepeat);
    argsArray.splice(iFirstSave, count * 4, args);
    return iFirstSave + 1;
  });
  addState(InitialState, [_util.OPS.beginText, _util.OPS.setFont, _util.OPS.setTextMatrix, _util.OPS.showText, _util.OPS.endText], null, function (context, i) {
    var fnArray = context.fnArray,
        argsArray = context.argsArray;
    var iFirstSave = context.iCurr - 4;
    var pos = (i - iFirstSave) % 5;

    switch (pos) {
      case 0:
        return fnArray[i] === _util.OPS.beginText;

      case 1:
        return fnArray[i] === _util.OPS.setFont;

      case 2:
        return fnArray[i] === _util.OPS.setTextMatrix;

      case 3:
        if (fnArray[i] !== _util.OPS.showText) {
          return false;
        }

        var iFirstSetFont = context.iCurr - 3;
        var firstSetFontArg0 = argsArray[iFirstSetFont][0];
        var firstSetFontArg1 = argsArray[iFirstSetFont][1];

        if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) {
          return false;
        }

        return true;

      case 4:
        return fnArray[i] === _util.OPS.endText;
    }
  }, function (context, i) {
    var MIN_CHARS_IN_BLOCK = 3;
    var MAX_CHARS_IN_BLOCK = 1000;
    var fnArray = context.fnArray,
        argsArray = context.argsArray;
    var curr = context.iCurr;
    var iFirstBeginText = curr - 4;
    var iFirstSetFont = curr - 3;
    var iFirstSetTextMatrix = curr - 2;
    var iFirstShowText = curr - 1;
    var iFirstEndText = curr;
    var firstSetFontArg0 = argsArray[iFirstSetFont][0];
    var firstSetFontArg1 = argsArray[iFirstSetFont][1];
    var count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK);

    if (count < MIN_CHARS_IN_BLOCK) {
      return i - (i - iFirstBeginText) % 5;
    }

    var iFirst = iFirstBeginText;

    if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) {
      count++;
      iFirst -= 5;
    }

    var iEndText = iFirst + 4;

    for (var q = 1; q < count; q++) {
      fnArray.splice(iEndText, 3);
      argsArray.splice(iEndText, 3);
      iEndText += 2;
    }

    return iEndText + 1;
  });

  function QueueOptimizer(queue) {
    this.queue = queue;
    this.state = null;
    this.context = {
      iCurr: 0,
      fnArray: queue.fnArray,
      argsArray: queue.argsArray
    };
    this.match = null;
    this.lastProcessed = 0;
  }

  QueueOptimizer.prototype = {
    _optimize: function _optimize() {
      var fnArray = this.queue.fnArray;
      var i = this.lastProcessed,
          ii = fnArray.length;
      var state = this.state;
      var match = this.match;

      if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) {
        this.lastProcessed = ii;
        return;
      }

      var context = this.context;

      while (i < ii) {
        if (match) {
          var iterate = (0, match.iterateFn)(context, i);

          if (iterate) {
            i++;
            continue;
          }

          i = (0, match.processFn)(context, i + 1);
          ii = fnArray.length;
          match = null;
          state = null;

          if (i >= ii) {
            break;
          }
        }

        state = (state || InitialState)[fnArray[i]];

        if (!state || Array.isArray(state)) {
          i++;
          continue;
        }

        context.iCurr = i;
        i++;

        if (state.checkFn && !(0, state.checkFn)(context)) {
          state = null;
          continue;
        }

        match = state;
        state = null;
      }

      this.state = state;
      this.match = match;
      this.lastProcessed = i;
    },
    push: function push(fn, args) {
      this.queue.fnArray.push(fn);
      this.queue.argsArray.push(args);

      this._optimize();
    },
    flush: function flush() {
      while (this.match) {
        var length = this.queue.fnArray.length;
        this.lastProcessed = (0, this.match.processFn)(this.context, length);
        this.match = null;
        this.state = null;

        this._optimize();
      }
    },
    reset: function reset() {
      this.state = null;
      this.match = null;
      this.lastProcessed = 0;
    }
  };
  return QueueOptimizer;
}();

var NullOptimizer = function NullOptimizerClosure() {
  function NullOptimizer(queue) {
    this.queue = queue;
  }

  NullOptimizer.prototype = {
    push: function push(fn, args) {
      this.queue.fnArray.push(fn);
      this.queue.argsArray.push(args);
    },
    flush: function flush() {}
  };
  return NullOptimizer;
}();

var OperatorList = function OperatorListClosure() {
  var CHUNK_SIZE = 1000;
  var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5;

  function getTransfers(queue) {
    var transfers = [];
    var fnArray = queue.fnArray,
        argsArray = queue.argsArray;

    for (var i = 0, ii = queue.length; i < ii; i++) {
      switch (fnArray[i]) {
        case _util.OPS.paintInlineImageXObject:
        case _util.OPS.paintInlineImageXObjectGroup:
        case _util.OPS.paintImageMaskXObject:
          var arg = argsArray[i][0];
          ;

          if (!arg.cached) {
            transfers.push(arg.data.buffer);
          }

          break;
      }
    }

    return transfers;
  }

  function OperatorList(intent, messageHandler, pageIndex) {
    this.messageHandler = messageHandler;
    this.fnArray = [];
    this.argsArray = [];

    if (messageHandler && this.intent !== 'oplist') {
      this.optimizer = new QueueOptimizer(this);
    } else {
      this.optimizer = new NullOptimizer(this);
    }

    this.dependencies = Object.create(null);
    this._totalLength = 0;
    this.pageIndex = pageIndex;
    this.intent = intent;
    this.weight = 0;
  }

  OperatorList.prototype = {
    get length() {
      return this.argsArray.length;
    },

    get totalLength() {
      return this._totalLength + this.length;
    },

    addOp: function addOp(fn, args) {
      this.optimizer.push(fn, args);
      this.weight++;

      if (this.messageHandler) {
        if (this.weight >= CHUNK_SIZE) {
          this.flush();
        } else if (this.weight >= CHUNK_SIZE_ABOUT && (fn === _util.OPS.restore || fn === _util.OPS.endText)) {
          this.flush();
        }
      }
    },
    addDependency: function addDependency(dependency) {
      if (dependency in this.dependencies) {
        return;
      }

      this.dependencies[dependency] = true;
      this.addOp(_util.OPS.dependency, [dependency]);
    },
    addDependencies: function addDependencies(dependencies) {
      for (var key in dependencies) {
        this.addDependency(key);
      }
    },
    addOpList: function addOpList(opList) {
      Object.assign(this.dependencies, opList.dependencies);

      for (var i = 0, ii = opList.length; i < ii; i++) {
        this.addOp(opList.fnArray[i], opList.argsArray[i]);
      }
    },
    getIR: function getIR() {
      return {
        fnArray: this.fnArray,
        argsArray: this.argsArray,
        length: this.length
      };
    },
    flush: function flush(lastChunk) {
      this.optimizer.flush();
      var transfers = getTransfers(this);
      var length = this.length;
      this._totalLength += length;
      this.messageHandler.send('RenderPageChunk', {
        operatorList: {
          fnArray: this.fnArray,
          argsArray: this.argsArray,
          lastChunk: lastChunk,
          length: length
        },
        pageIndex: this.pageIndex,
        intent: this.intent
      }, transfers);
      this.dependencies = Object.create(null);
      this.fnArray.length = 0;
      this.argsArray.length = 0;
      this.weight = 0;
      this.optimizer.reset();
    }
  };
  return OperatorList;
}();

exports.OperatorList = OperatorList;

/***/ }),
/* 171 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PartialEvaluator = void 0;

var _regenerator = _interopRequireDefault(__w_pdfjs_require__(2));

var _util = __w_pdfjs_require__(6);

var _cmap = __w_pdfjs_require__(172);

var _stream = __w_pdfjs_require__(157);

var _primitives = __w_pdfjs_require__(155);

var _fonts = __w_pdfjs_require__(173);

var _encodings = __w_pdfjs_require__(176);

var _unicode = __w_pdfjs_require__(179);

var _standard_fonts = __w_pdfjs_require__(178);

var _pattern = __w_pdfjs_require__(182);

var _parser = __w_pdfjs_require__(156);

var _bidi = __w_pdfjs_require__(183);

var _colorspace = __w_pdfjs_require__(168);

var _glyphlist = __w_pdfjs_require__(177);

var _metrics = __w_pdfjs_require__(184);

var _function = __w_pdfjs_require__(185);

var _jpeg_stream = __w_pdfjs_require__(163);

var _murmurhash = __w_pdfjs_require__(187);

var _operator_list = __w_pdfjs_require__(170);

var _image = __w_pdfjs_require__(188);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var PartialEvaluator = function PartialEvaluatorClosure() {
  var DefaultPartialEvaluatorOptions = {
    forceDataSchema: false,
    maxImageSize: -1,
    disableFontFace: false,
    nativeImageDecoderSupport: _util.NativeImageDecoding.DECODE,
    ignoreErrors: false,
    isEvalSupported: true
  };

  function NativeImageDecoder(_ref) {
    var xref = _ref.xref,
        resources = _ref.resources,
        handler = _ref.handler,
        _ref$forceDataSchema = _ref.forceDataSchema,
        forceDataSchema = _ref$forceDataSchema === void 0 ? false : _ref$forceDataSchema,
        pdfFunctionFactory = _ref.pdfFunctionFactory;
    this.xref = xref;
    this.resources = resources;
    this.handler = handler;
    this.forceDataSchema = forceDataSchema;
    this.pdfFunctionFactory = pdfFunctionFactory;
  }

  NativeImageDecoder.prototype = {
    canDecode: function canDecode(image) {
      return image instanceof _jpeg_stream.JpegStream && NativeImageDecoder.isDecodable(image, this.xref, this.resources, this.pdfFunctionFactory);
    },
    decode: function decode(image) {
      var dict = image.dict;
      var colorSpace = dict.get('ColorSpace', 'CS');
      colorSpace = _colorspace.ColorSpace.parse(colorSpace, this.xref, this.resources, this.pdfFunctionFactory);
      return this.handler.sendWithPromise('JpegDecode', [image.getIR(this.forceDataSchema), colorSpace.numComps]).then(function (_ref2) {
        var data = _ref2.data,
            width = _ref2.width,
            height = _ref2.height;
        return new _stream.Stream(data, 0, data.length, image.dict);
      });
    }
  };

  NativeImageDecoder.isSupported = function (image, xref, res, pdfFunctionFactory) {
    var dict = image.dict;

    if (dict.has('DecodeParms') || dict.has('DP')) {
      return false;
    }

    var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res, pdfFunctionFactory);

    return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && cs.isDefaultDecode(dict.getArray('Decode', 'D'));
  };

  NativeImageDecoder.isDecodable = function (image, xref, res, pdfFunctionFactory) {
    var dict = image.dict;

    if (dict.has('DecodeParms') || dict.has('DP')) {
      return false;
    }

    var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res, pdfFunctionFactory);

    var bpc = dict.get('BitsPerComponent', 'BPC') || 1;
    return (cs.numComps === 1 || cs.numComps === 3) && cs.isDefaultDecode(dict.getArray('Decode', 'D'), bpc);
  };

  function PartialEvaluator(_ref3) {
    var _this = this;

    var pdfManager = _ref3.pdfManager,
        xref = _ref3.xref,
        handler = _ref3.handler,
        pageIndex = _ref3.pageIndex,
        idFactory = _ref3.idFactory,
        fontCache = _ref3.fontCache,
        builtInCMapCache = _ref3.builtInCMapCache,
        _ref3$options = _ref3.options,
        options = _ref3$options === void 0 ? null : _ref3$options,
        pdfFunctionFactory = _ref3.pdfFunctionFactory;
    this.pdfManager = pdfManager;
    this.xref = xref;
    this.handler = handler;
    this.pageIndex = pageIndex;
    this.idFactory = idFactory;
    this.fontCache = fontCache;
    this.builtInCMapCache = builtInCMapCache;
    this.options = options || DefaultPartialEvaluatorOptions;
    this.pdfFunctionFactory = pdfFunctionFactory;

    this.fetchBuiltInCMap =
    /*#__PURE__*/
    function () {
      var _ref4 = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee(name) {
        var data;
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                if (!_this.builtInCMapCache.has(name)) {
                  _context.next = 2;
                  break;
                }

                return _context.abrupt("return", _this.builtInCMapCache.get(name));

              case 2:
                _context.next = 4;
                return _this.handler.sendWithPromise('FetchBuiltInCMap', {
                  name: name
                });

              case 4:
                data = _context.sent;

                if (data.compressionType !== _util.CMapCompressionType.NONE) {
                  _this.builtInCMapCache.set(name, data);
                }

                return _context.abrupt("return", data);

              case 7:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      return function (_x) {
        return _ref4.apply(this, arguments);
      };
    }();
  }

  var TIME_SLOT_DURATION_MS = 20;
  var CHECK_TIME_EVERY = 100;

  function TimeSlotManager() {
    this.reset();
  }

  TimeSlotManager.prototype = {
    check: function TimeSlotManager_check() {
      if (++this.checked < CHECK_TIME_EVERY) {
        return false;
      }

      this.checked = 0;
      return this.endTime <= Date.now();
    },
    reset: function TimeSlotManager_reset() {
      this.endTime = Date.now() + TIME_SLOT_DURATION_MS;
      this.checked = 0;
    }
  };

  function normalizeBlendMode(value) {
    if (!(0, _primitives.isName)(value)) {
      return 'source-over';
    }

    switch (value.name) {
      case 'Normal':
      case 'Compatible':
        return 'source-over';

      case 'Multiply':
        return 'multiply';

      case 'Screen':
        return 'screen';

      case 'Overlay':
        return 'overlay';

      case 'Darken':
        return 'darken';

      case 'Lighten':
        return 'lighten';

      case 'ColorDodge':
        return 'color-dodge';

      case 'ColorBurn':
        return 'color-burn';

      case 'HardLight':
        return 'hard-light';

      case 'SoftLight':
        return 'soft-light';

      case 'Difference':
        return 'difference';

      case 'Exclusion':
        return 'exclusion';

      case 'Hue':
        return 'hue';

      case 'Saturation':
        return 'saturation';

      case 'Color':
        return 'color';

      case 'Luminosity':
        return 'luminosity';
    }

    (0, _util.warn)('Unsupported blend mode: ' + value.name);
    return 'source-over';
  }

  var deferred = Promise.resolve();
  var TILING_PATTERN = 1,
      SHADING_PATTERN = 2;
  PartialEvaluator.prototype = {
    clone: function clone() {
      var newOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DefaultPartialEvaluatorOptions;
      var newEvaluator = Object.create(this);
      newEvaluator.options = newOptions;
      return newEvaluator;
    },
    hasBlendModes: function PartialEvaluator_hasBlendModes(resources) {
      if (!(0, _primitives.isDict)(resources)) {
        return false;
      }

      var processed = Object.create(null);

      if (resources.objId) {
        processed[resources.objId] = true;
      }

      var nodes = [resources],
          xref = this.xref;

      while (nodes.length) {
        var key, i, ii;
        var node = nodes.shift();
        var graphicStates = node.get('ExtGState');

        if ((0, _primitives.isDict)(graphicStates)) {
          var graphicStatesKeys = graphicStates.getKeys();

          for (i = 0, ii = graphicStatesKeys.length; i < ii; i++) {
            key = graphicStatesKeys[i];
            var graphicState = graphicStates.get(key);
            var bm = graphicState.get('BM');

            if ((0, _primitives.isName)(bm) && bm.name !== 'Normal') {
              return true;
            }
          }
        }

        var xObjects = node.get('XObject');

        if (!(0, _primitives.isDict)(xObjects)) {
          continue;
        }

        var xObjectsKeys = xObjects.getKeys();

        for (i = 0, ii = xObjectsKeys.length; i < ii; i++) {
          key = xObjectsKeys[i];
          var xObject = xObjects.getRaw(key);

          if ((0, _primitives.isRef)(xObject)) {
            if (processed[xObject.toString()]) {
              continue;
            }

            xObject = xref.fetch(xObject);
          }

          if (!(0, _primitives.isStream)(xObject)) {
            continue;
          }

          if (xObject.dict.objId) {
            if (processed[xObject.dict.objId]) {
              continue;
            }

            processed[xObject.dict.objId] = true;
          }

          var xResources = xObject.dict.get('Resources');

          if ((0, _primitives.isDict)(xResources) && (!xResources.objId || !processed[xResources.objId])) {
            nodes.push(xResources);

            if (xResources.objId) {
              processed[xResources.objId] = true;
            }
          }
        }
      }

      return false;
    },
    buildFormXObject: function PartialEvaluator_buildFormXObject(resources, xobj, smask, operatorList, task, initialState) {
      var dict = xobj.dict;
      var matrix = dict.getArray('Matrix');
      var bbox = dict.getArray('BBox');

      if (Array.isArray(bbox) && bbox.length === 4) {
        bbox = _util.Util.normalizeRect(bbox);
      } else {
        bbox = null;
      }

      var group = dict.get('Group');

      if (group) {
        var groupOptions = {
          matrix: matrix,
          bbox: bbox,
          smask: smask,
          isolated: false,
          knockout: false
        };
        var groupSubtype = group.get('S');
        var colorSpace = null;

        if ((0, _primitives.isName)(groupSubtype, 'Transparency')) {
          groupOptions.isolated = group.get('I') || false;
          groupOptions.knockout = group.get('K') || false;

          if (group.has('CS')) {
            colorSpace = _colorspace.ColorSpace.parse(group.get('CS'), this.xref, resources, this.pdfFunctionFactory);
          }
        }

        if (smask && smask.backdrop) {
          colorSpace = colorSpace || _colorspace.ColorSpace.singletons.rgb;
          smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);
        }

        operatorList.addOp(_util.OPS.beginGroup, [groupOptions]);
      }

      operatorList.addOp(_util.OPS.paintFormXObjectBegin, [matrix, bbox]);
      return this.getOperatorList({
        stream: xobj,
        task: task,
        resources: dict.get('Resources') || resources,
        operatorList: operatorList,
        initialState: initialState
      }).then(function () {
        operatorList.addOp(_util.OPS.paintFormXObjectEnd, []);

        if (group) {
          operatorList.addOp(_util.OPS.endGroup, [groupOptions]);
        }
      });
    },
    buildPaintImageXObject: function buildPaintImageXObject(_ref5) {
      var _this2 = this;

      var resources = _ref5.resources,
          image = _ref5.image,
          _ref5$isInline = _ref5.isInline,
          isInline = _ref5$isInline === void 0 ? false : _ref5$isInline,
          operatorList = _ref5.operatorList,
          cacheKey = _ref5.cacheKey,
          imageCache = _ref5.imageCache,
          _ref5$forceDisableNat = _ref5.forceDisableNativeImageDecoder,
          forceDisableNativeImageDecoder = _ref5$forceDisableNat === void 0 ? false : _ref5$forceDisableNat;
      var dict = image.dict;
      var w = dict.get('Width', 'W');
      var h = dict.get('Height', 'H');

      if (!(w && (0, _util.isNum)(w)) || !(h && (0, _util.isNum)(h))) {
        (0, _util.warn)('Image dimensions are missing, or not numbers.');
        return Promise.resolve();
      }

      var maxImageSize = this.options.maxImageSize;

      if (maxImageSize !== -1 && w * h > maxImageSize) {
        (0, _util.warn)('Image exceeded maximum allowed size and was removed.');
        return Promise.resolve();
      }

      var imageMask = dict.get('ImageMask', 'IM') || false;
      var imgData, args;

      if (imageMask) {
        var width = dict.get('Width', 'W');
        var height = dict.get('Height', 'H');
        var bitStrideLength = width + 7 >> 3;
        var imgArray = image.getBytes(bitStrideLength * height, true);
        var decode = dict.getArray('Decode', 'D');
        imgData = _image.PDFImage.createMask({
          imgArray: imgArray,
          width: width,
          height: height,
          imageIsFromDecodeStream: image instanceof _stream.DecodeStream,
          inverseDecode: !!decode && decode[0] > 0
        });
        imgData.cached = true;
        args = [imgData];
        operatorList.addOp(_util.OPS.paintImageMaskXObject, args);

        if (cacheKey) {
          imageCache[cacheKey] = {
            fn: _util.OPS.paintImageMaskXObject,
            args: args
          };
        }

        return Promise.resolve();
      }

      var softMask = dict.get('SMask', 'SM') || false;
      var mask = dict.get('Mask') || false;
      var SMALL_IMAGE_DIMENSIONS = 200;

      if (isInline && !softMask && !mask && !(image instanceof _jpeg_stream.JpegStream) && w + h < SMALL_IMAGE_DIMENSIONS) {
        var imageObj = new _image.PDFImage({
          xref: this.xref,
          res: resources,
          image: image,
          isInline: isInline,
          pdfFunctionFactory: this.pdfFunctionFactory
        });
        imgData = imageObj.createImageData(true);
        operatorList.addOp(_util.OPS.paintInlineImageXObject, [imgData]);
        return Promise.resolve();
      }

      var nativeImageDecoderSupport = forceDisableNativeImageDecoder ? _util.NativeImageDecoding.NONE : this.options.nativeImageDecoderSupport;
      var objId = 'img_' + this.idFactory.createObjId();

      if (nativeImageDecoderSupport !== _util.NativeImageDecoding.NONE && !softMask && !mask && image instanceof _jpeg_stream.JpegStream && NativeImageDecoder.isSupported(image, this.xref, resources, this.pdfFunctionFactory)) {
        return this.handler.sendWithPromise('obj', [objId, this.pageIndex, 'JpegStream', image.getIR(this.options.forceDataSchema)]).then(function () {
          operatorList.addDependency(objId);
          args = [objId, w, h];
          operatorList.addOp(_util.OPS.paintJpegXObject, args);

          if (cacheKey) {
            imageCache[cacheKey] = {
              fn: _util.OPS.paintJpegXObject,
              args: args
            };
          }
        }, function (reason) {
          (0, _util.warn)('Native JPEG decoding failed -- trying to recover: ' + (reason && reason.message));
          return _this2.buildPaintImageXObject({
            resources: resources,
            image: image,
            isInline: isInline,
            operatorList: operatorList,
            cacheKey: cacheKey,
            imageCache: imageCache,
            forceDisableNativeImageDecoder: true
          });
        });
      }

      var nativeImageDecoder = null;

      if (nativeImageDecoderSupport === _util.NativeImageDecoding.DECODE && (image instanceof _jpeg_stream.JpegStream || mask instanceof _jpeg_stream.JpegStream || softMask instanceof _jpeg_stream.JpegStream)) {
        nativeImageDecoder = new NativeImageDecoder({
          xref: this.xref,
          resources: resources,
          handler: this.handler,
          forceDataSchema: this.options.forceDataSchema,
          pdfFunctionFactory: this.pdfFunctionFactory
        });
      }

      operatorList.addDependency(objId);
      args = [objId, w, h];

      _image.PDFImage.buildImage({
        handler: this.handler,
        xref: this.xref,
        res: resources,
        image: image,
        isInline: isInline,
        nativeDecoder: nativeImageDecoder,
        pdfFunctionFactory: this.pdfFunctionFactory
      }).then(function (imageObj) {
        var imgData = imageObj.createImageData(false);

        _this2.handler.send('obj', [objId, _this2.pageIndex, 'Image', imgData], [imgData.data.buffer]);
      }).catch(function (reason) {
        (0, _util.warn)('Unable to decode image: ' + reason);

        _this2.handler.send('obj', [objId, _this2.pageIndex, 'Image', null]);
      });

      operatorList.addOp(_util.OPS.paintImageXObject, args);

      if (cacheKey) {
        imageCache[cacheKey] = {
          fn: _util.OPS.paintImageXObject,
          args: args
        };
      }

      return Promise.resolve();
    },
    handleSMask: function PartialEvaluator_handleSmask(smask, resources, operatorList, task, stateManager) {
      var smaskContent = smask.get('G');
      var smaskOptions = {
        subtype: smask.get('S').name,
        backdrop: smask.get('BC')
      };
      var transferObj = smask.get('TR');

      if ((0, _function.isPDFFunction)(transferObj)) {
        var transferFn = this.pdfFunctionFactory.create(transferObj);
        var transferMap = new Uint8Array(256);
        var tmp = new Float32Array(1);

        for (var i = 0; i < 256; i++) {
          tmp[0] = i / 255;
          transferFn(tmp, 0, tmp, 0);
          transferMap[i] = tmp[0] * 255 | 0;
        }

        smaskOptions.transferMap = transferMap;
      }

      return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone());
    },
    handleTilingType: function handleTilingType(fn, args, resources, pattern, patternDict, operatorList, task) {
      var _this3 = this;

      var tilingOpList = new _operator_list.OperatorList();
      var resourcesArray = [patternDict.get('Resources'), resources];

      var patternResources = _primitives.Dict.merge(this.xref, resourcesArray);

      return this.getOperatorList({
        stream: pattern,
        task: task,
        resources: patternResources,
        operatorList: tilingOpList
      }).then(function () {
        return (0, _pattern.getTilingPatternIR)({
          fnArray: tilingOpList.fnArray,
          argsArray: tilingOpList.argsArray
        }, patternDict, args);
      }).then(function (tilingPatternIR) {
        operatorList.addDependencies(tilingOpList.dependencies);
        operatorList.addOp(fn, tilingPatternIR);
      }, function (reason) {
        if (_this3.options.ignoreErrors) {
          _this3.handler.send('UnsupportedFeature', {
            featureId: _util.UNSUPPORTED_FEATURES.unknown
          });

          (0, _util.warn)("handleTilingType - ignoring pattern: \"".concat(reason, "\"."));
          return;
        }

        throw reason;
      });
    },
    handleSetFont: function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef, operatorList, task, state) {
      var _this4 = this;

      var fontName;

      if (fontArgs) {
        fontArgs = fontArgs.slice();
        fontName = fontArgs[0].name;
      }

      return this.loadFont(fontName, fontRef, resources).then(function (translated) {
        if (!translated.font.isType3Font) {
          return translated;
        }

        return translated.loadType3Data(_this4, resources, operatorList, task).then(function () {
          return translated;
        }).catch(function (reason) {
          _this4.handler.send('UnsupportedFeature', {
            featureId: _util.UNSUPPORTED_FEATURES.font
          });

          return new TranslatedFont('g_font_error', new _fonts.ErrorFont('Type3 font load error: ' + reason), translated.font);
        });
      }).then(function (translated) {
        state.font = translated.font;
        translated.send(_this4.handler);
        return translated.loadedName;
      });
    },
    handleText: function handleText(chars, state) {
      var font = state.font;
      var glyphs = font.charsToGlyphs(chars);

      if (font.data) {
        var isAddToPathSet = !!(state.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);

        if (isAddToPathSet || state.fillColorSpace.name === 'Pattern' || font.disableFontFace || this.options.disableFontFace) {
          PartialEvaluator.buildFontPaths(font, glyphs, this.handler);
        }
      }

      return glyphs;
    },
    setGState: function PartialEvaluator_setGState(resources, gState, operatorList, task, stateManager) {
      var _this5 = this;

      var gStateObj = [];
      var gStateKeys = gState.getKeys();
      var promise = Promise.resolve();

      var _loop = function _loop() {
        var key = gStateKeys[i];
        var value = gState.get(key);

        switch (key) {
          case 'Type':
            break;

          case 'LW':
          case 'LC':
          case 'LJ':
          case 'ML':
          case 'D':
          case 'RI':
          case 'FL':
          case 'CA':
          case 'ca':
            gStateObj.push([key, value]);
            break;

          case 'Font':
            promise = promise.then(function () {
              return _this5.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state).then(function (loadedName) {
                operatorList.addDependency(loadedName);
                gStateObj.push([key, [loadedName, value[1]]]);
              });
            });
            break;

          case 'BM':
            gStateObj.push([key, normalizeBlendMode(value)]);
            break;

          case 'SMask':
            if ((0, _primitives.isName)(value, 'None')) {
              gStateObj.push([key, false]);
              break;
            }

            if ((0, _primitives.isDict)(value)) {
              promise = promise.then(function () {
                return _this5.handleSMask(value, resources, operatorList, task, stateManager);
              });
              gStateObj.push([key, true]);
            } else {
              (0, _util.warn)('Unsupported SMask type');
            }

            break;

          case 'OP':
          case 'op':
          case 'OPM':
          case 'BG':
          case 'BG2':
          case 'UCR':
          case 'UCR2':
          case 'TR':
          case 'TR2':
          case 'HT':
          case 'SM':
          case 'SA':
          case 'AIS':
          case 'TK':
            (0, _util.info)('graphic state operator ' + key);
            break;

          default:
            (0, _util.info)('Unknown graphic state operator ' + key);
            break;
        }
      };

      for (var i = 0, ii = gStateKeys.length; i < ii; i++) {
        _loop();
      }

      return promise.then(function () {
        if (gStateObj.length > 0) {
          operatorList.addOp(_util.OPS.setGState, [gStateObj]);
        }
      });
    },
    loadFont: function PartialEvaluator_loadFont(fontName, font, resources) {
      var _this6 = this;

      function errorFont() {
        return Promise.resolve(new TranslatedFont('g_font_error', new _fonts.ErrorFont('Font ' + fontName + ' is not available'), font));
      }

      var fontRef,
          xref = this.xref;

      if (font) {
        if (!(0, _primitives.isRef)(font)) {
          throw new Error('The "font" object should be a reference.');
        }

        fontRef = font;
      } else {
        var fontRes = resources.get('Font');

        if (fontRes) {
          fontRef = fontRes.getRaw(fontName);
        } else {
          (0, _util.warn)('fontRes not available');
          return errorFont();
        }
      }

      if (!fontRef) {
        (0, _util.warn)('fontRef not available');
        return errorFont();
      }

      if (this.fontCache.has(fontRef)) {
        return this.fontCache.get(fontRef);
      }

      font = xref.fetchIfRef(fontRef);

      if (!(0, _primitives.isDict)(font)) {
        return errorFont();
      }

      if (font.translated) {
        return font.translated;
      }

      var fontCapability = (0, _util.createPromiseCapability)();
      var preEvaluatedFont = this.preEvaluateFont(font);
      var descriptor = preEvaluatedFont.descriptor;
      var fontRefIsRef = (0, _primitives.isRef)(fontRef),
          fontID;

      if (fontRefIsRef) {
        fontID = fontRef.toString();
      }

      if ((0, _primitives.isDict)(descriptor)) {
        if (!descriptor.fontAliases) {
          descriptor.fontAliases = Object.create(null);
        }

        var fontAliases = descriptor.fontAliases;
        var hash = preEvaluatedFont.hash;

        if (fontAliases[hash]) {
          var aliasFontRef = fontAliases[hash].aliasRef;

          if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) {
            this.fontCache.putAlias(fontRef, aliasFontRef);
            return this.fontCache.get(fontRef);
          }
        } else {
          fontAliases[hash] = {
            fontID: _fonts.Font.getFontID()
          };
        }

        if (fontRefIsRef) {
          fontAliases[hash].aliasRef = fontRef;
        }

        fontID = fontAliases[hash].fontID;
      }

      if (fontRefIsRef) {
        this.fontCache.put(fontRef, fontCapability.promise);
      } else {
        if (!fontID) {
          fontID = this.idFactory.createObjId();
        }

        this.fontCache.put('id_' + fontID, fontCapability.promise);
      }

      (0, _util.assert)(fontID, 'The "fontID" must be defined.');
      font.loadedName = 'g_' + this.pdfManager.docId + '_f' + fontID;
      font.translated = fontCapability.promise;
      var translatedPromise;

      try {
        translatedPromise = this.translateFont(preEvaluatedFont);
      } catch (e) {
        translatedPromise = Promise.reject(e);
      }

      translatedPromise.then(function (translatedFont) {
        if (translatedFont.fontType !== undefined) {
          var xrefFontStats = xref.stats.fontTypes;
          xrefFontStats[translatedFont.fontType] = true;
        }

        fontCapability.resolve(new TranslatedFont(font.loadedName, translatedFont, font));
      }).catch(function (reason) {
        _this6.handler.send('UnsupportedFeature', {
          featureId: _util.UNSUPPORTED_FEATURES.font
        });

        try {
          var descriptor = preEvaluatedFont.descriptor;
          var fontFile3 = descriptor && descriptor.get('FontFile3');
          var subtype = fontFile3 && fontFile3.get('Subtype');
          var fontType = (0, _fonts.getFontType)(preEvaluatedFont.type, subtype && subtype.name);
          var xrefFontStats = xref.stats.fontTypes;
          xrefFontStats[fontType] = true;
        } catch (ex) {}

        fontCapability.resolve(new TranslatedFont(font.loadedName, new _fonts.ErrorFont(reason instanceof Error ? reason.message : reason), font));
      });
      return fontCapability.promise;
    },
    buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) {
      var lastIndex = operatorList.length - 1;

      if (!args) {
        args = [];
      }

      if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== _util.OPS.constructPath) {
        operatorList.addOp(_util.OPS.constructPath, [[fn], args]);
      } else {
        var opArgs = operatorList.argsArray[lastIndex];
        opArgs[0].push(fn);
        Array.prototype.push.apply(opArgs[1], args);
      }
    },
    handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args, cs, patterns, resources, task) {
      var patternName = args[args.length - 1];
      var pattern;

      if ((0, _primitives.isName)(patternName) && (pattern = patterns.get(patternName.name))) {
        var dict = (0, _primitives.isStream)(pattern) ? pattern.dict : pattern;
        var typeNum = dict.get('PatternType');

        if (typeNum === TILING_PATTERN) {
          var color = cs.base ? cs.base.getRgb(args, 0) : null;
          return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task);
        } else if (typeNum === SHADING_PATTERN) {
          var shading = dict.get('Shading');
          var matrix = dict.getArray('Matrix');
          pattern = _pattern.Pattern.parseShading(shading, matrix, this.xref, resources, this.handler, this.pdfFunctionFactory);
          operatorList.addOp(fn, pattern.getIR());
          return Promise.resolve();
        }

        return Promise.reject(new Error('Unknown PatternType: ' + typeNum));
      }

      operatorList.addOp(fn, args);
      return Promise.resolve();
    },
    getOperatorList: function getOperatorList(_ref6) {
      var _this7 = this;

      var stream = _ref6.stream,
          task = _ref6.task,
          resources = _ref6.resources,
          operatorList = _ref6.operatorList,
          _ref6$initialState = _ref6.initialState,
          initialState = _ref6$initialState === void 0 ? null : _ref6$initialState;
      resources = resources || _primitives.Dict.empty;
      initialState = initialState || new EvalState();

      if (!operatorList) {
        throw new Error('getOperatorList: missing "operatorList" parameter');
      }

      var self = this;
      var xref = this.xref;
      var imageCache = Object.create(null);

      var xobjs = resources.get('XObject') || _primitives.Dict.empty;

      var patterns = resources.get('Pattern') || _primitives.Dict.empty;

      var stateManager = new StateManager(initialState);
      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
      var timeSlotManager = new TimeSlotManager();

      function closePendingRestoreOPS(argument) {
        for (var i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {
          operatorList.addOp(_util.OPS.restore, []);
        }
      }

      return new Promise(function promiseBody(resolve, reject) {
        var next = function next(promise) {
          promise.then(function () {
            try {
              promiseBody(resolve, reject);
            } catch (ex) {
              reject(ex);
            }
          }, reject);
        };

        task.ensureNotTerminated();
        timeSlotManager.reset();
        var stop,
            operation = {},
            i,
            ii,
            cs;

        while (!(stop = timeSlotManager.check())) {
          operation.args = null;

          if (!preprocessor.read(operation)) {
            break;
          }

          var args = operation.args;
          var fn = operation.fn;

          switch (fn | 0) {
            case _util.OPS.paintXObject:
              var name = args[0].name;

              if (name && imageCache[name] !== undefined) {
                operatorList.addOp(imageCache[name].fn, imageCache[name].args);
                args = null;
                continue;
              }

              next(new Promise(function (resolveXObject, rejectXObject) {
                if (!name) {
                  throw new _util.FormatError('XObject must be referred to by name.');
                }

                var xobj = xobjs.get(name);

                if (!xobj) {
                  operatorList.addOp(fn, args);
                  resolveXObject();
                  return;
                }

                if (!(0, _primitives.isStream)(xobj)) {
                  throw new _util.FormatError('XObject should be a stream');
                }

                var type = xobj.dict.get('Subtype');

                if (!(0, _primitives.isName)(type)) {
                  throw new _util.FormatError('XObject should have a Name subtype');
                }

                if (type.name === 'Form') {
                  stateManager.save();
                  self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone()).then(function () {
                    stateManager.restore();
                    resolveXObject();
                  }, rejectXObject);
                  return;
                } else if (type.name === 'Image') {
                  self.buildPaintImageXObject({
                    resources: resources,
                    image: xobj,
                    operatorList: operatorList,
                    cacheKey: name,
                    imageCache: imageCache
                  }).then(resolveXObject, rejectXObject);
                  return;
                } else if (type.name === 'PS') {
                  (0, _util.info)('Ignored XObject subtype PS');
                } else {
                  throw new _util.FormatError("Unhandled XObject subtype ".concat(type.name));
                }

                resolveXObject();
              }).catch(function (reason) {
                if (self.options.ignoreErrors) {
                  self.handler.send('UnsupportedFeature', {
                    featureId: _util.UNSUPPORTED_FEATURES.unknown
                  });
                  (0, _util.warn)("getOperatorList - ignoring XObject: \"".concat(reason, "\"."));
                  return;
                }

                throw reason;
              }));
              return;

            case _util.OPS.setFont:
              var fontSize = args[1];
              next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state).then(function (loadedName) {
                operatorList.addDependency(loadedName);
                operatorList.addOp(_util.OPS.setFont, [loadedName, fontSize]);
              }));
              return;

            case _util.OPS.endInlineImage:
              var cacheKey = args[0].cacheKey;

              if (cacheKey) {
                var cacheEntry = imageCache[cacheKey];

                if (cacheEntry !== undefined) {
                  operatorList.addOp(cacheEntry.fn, cacheEntry.args);
                  args = null;
                  continue;
                }
              }

              next(self.buildPaintImageXObject({
                resources: resources,
                image: args[0],
                isInline: true,
                operatorList: operatorList,
                cacheKey: cacheKey,
                imageCache: imageCache
              }));
              return;

            case _util.OPS.showText:
              args[0] = self.handleText(args[0], stateManager.state);
              break;

            case _util.OPS.showSpacedText:
              var arr = args[0];
              var combinedGlyphs = [];
              var arrLength = arr.length;
              var state = stateManager.state;

              for (i = 0; i < arrLength; ++i) {
                var arrItem = arr[i];

                if ((0, _util.isString)(arrItem)) {
                  Array.prototype.push.apply(combinedGlyphs, self.handleText(arrItem, state));
                } else if ((0, _util.isNum)(arrItem)) {
                  combinedGlyphs.push(arrItem);
                }
              }

              args[0] = combinedGlyphs;
              fn = _util.OPS.showText;
              break;

            case _util.OPS.nextLineShowText:
              operatorList.addOp(_util.OPS.nextLine);
              args[0] = self.handleText(args[0], stateManager.state);
              fn = _util.OPS.showText;
              break;

            case _util.OPS.nextLineSetSpacingShowText:
              operatorList.addOp(_util.OPS.nextLine);
              operatorList.addOp(_util.OPS.setWordSpacing, [args.shift()]);
              operatorList.addOp(_util.OPS.setCharSpacing, [args.shift()]);
              args[0] = self.handleText(args[0], stateManager.state);
              fn = _util.OPS.showText;
              break;

            case _util.OPS.setTextRenderingMode:
              stateManager.state.textRenderingMode = args[0];
              break;

            case _util.OPS.setFillColorSpace:
              stateManager.state.fillColorSpace = _colorspace.ColorSpace.parse(args[0], xref, resources, self.pdfFunctionFactory);
              continue;

            case _util.OPS.setStrokeColorSpace:
              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.parse(args[0], xref, resources, self.pdfFunctionFactory);
              continue;

            case _util.OPS.setFillColor:
              cs = stateManager.state.fillColorSpace;
              args = cs.getRgb(args, 0);
              fn = _util.OPS.setFillRGBColor;
              break;

            case _util.OPS.setStrokeColor:
              cs = stateManager.state.strokeColorSpace;
              args = cs.getRgb(args, 0);
              fn = _util.OPS.setStrokeRGBColor;
              break;

            case _util.OPS.setFillGray:
              stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.gray;
              args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);
              fn = _util.OPS.setFillRGBColor;
              break;

            case _util.OPS.setStrokeGray:
              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;
              args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);
              fn = _util.OPS.setStrokeRGBColor;
              break;

            case _util.OPS.setFillCMYKColor:
              stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.cmyk;
              args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);
              fn = _util.OPS.setFillRGBColor;
              break;

            case _util.OPS.setStrokeCMYKColor:
              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.cmyk;
              args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);
              fn = _util.OPS.setStrokeRGBColor;
              break;

            case _util.OPS.setFillRGBColor:
              stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.rgb;
              args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);
              break;

            case _util.OPS.setStrokeRGBColor:
              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.rgb;
              args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);
              break;

            case _util.OPS.setFillColorN:
              cs = stateManager.state.fillColorSpace;

              if (cs.name === 'Pattern') {
                next(self.handleColorN(operatorList, _util.OPS.setFillColorN, args, cs, patterns, resources, task));
                return;
              }

              args = cs.getRgb(args, 0);
              fn = _util.OPS.setFillRGBColor;
              break;

            case _util.OPS.setStrokeColorN:
              cs = stateManager.state.strokeColorSpace;

              if (cs.name === 'Pattern') {
                next(self.handleColorN(operatorList, _util.OPS.setStrokeColorN, args, cs, patterns, resources, task));
                return;
              }

              args = cs.getRgb(args, 0);
              fn = _util.OPS.setStrokeRGBColor;
              break;

            case _util.OPS.shadingFill:
              var shadingRes = resources.get('Shading');

              if (!shadingRes) {
                throw new _util.FormatError('No shading resource found');
              }

              var shading = shadingRes.get(args[0].name);

              if (!shading) {
                throw new _util.FormatError('No shading object found');
              }

              var shadingFill = _pattern.Pattern.parseShading(shading, null, xref, resources, self.handler, self.pdfFunctionFactory);

              var patternIR = shadingFill.getIR();
              args = [patternIR];
              fn = _util.OPS.shadingFill;
              break;

            case _util.OPS.setGState:
              var dictName = args[0];
              var extGState = resources.get('ExtGState');

              if (!(0, _primitives.isDict)(extGState) || !extGState.has(dictName.name)) {
                break;
              }

              var gState = extGState.get(dictName.name);
              next(self.setGState(resources, gState, operatorList, task, stateManager));
              return;

            case _util.OPS.moveTo:
            case _util.OPS.lineTo:
            case _util.OPS.curveTo:
            case _util.OPS.curveTo2:
            case _util.OPS.curveTo3:
            case _util.OPS.closePath:
              self.buildPath(operatorList, fn, args);
              continue;

            case _util.OPS.rectangle:
              self.buildPath(operatorList, fn, args);
              continue;

            case _util.OPS.markPoint:
            case _util.OPS.markPointProps:
            case _util.OPS.beginMarkedContent:
            case _util.OPS.beginMarkedContentProps:
            case _util.OPS.endMarkedContent:
            case _util.OPS.beginCompat:
            case _util.OPS.endCompat:
              continue;

            default:
              if (args !== null) {
                for (i = 0, ii = args.length; i < ii; i++) {
                  if (args[i] instanceof _primitives.Dict) {
                    break;
                  }
                }

                if (i < ii) {
                  (0, _util.warn)('getOperatorList - ignoring operator: ' + fn);
                  continue;
                }
              }

          }

          operatorList.addOp(fn, args);
        }

        if (stop) {
          next(deferred);
          return;
        }

        closePendingRestoreOPS();
        resolve();
      }).catch(function (reason) {
        if (_this7.options.ignoreErrors) {
          _this7.handler.send('UnsupportedFeature', {
            featureId: _util.UNSUPPORTED_FEATURES.unknown
          });

          (0, _util.warn)("getOperatorList - ignoring errors during \"".concat(task.name, "\" ") + "task: \"".concat(reason, "\"."));
          closePendingRestoreOPS();
          return;
        }

        throw reason;
      });
    },
    getTextContent: function getTextContent(_ref7) {
      var _this8 = this;

      var stream = _ref7.stream,
          task = _ref7.task,
          resources = _ref7.resources,
          _ref7$stateManager = _ref7.stateManager,
          stateManager = _ref7$stateManager === void 0 ? null : _ref7$stateManager,
          _ref7$normalizeWhites = _ref7.normalizeWhitespace,
          normalizeWhitespace = _ref7$normalizeWhites === void 0 ? false : _ref7$normalizeWhites,
          _ref7$combineTextItem = _ref7.combineTextItems,
          combineTextItems = _ref7$combineTextItem === void 0 ? false : _ref7$combineTextItem,
          sink = _ref7.sink,
          _ref7$seenStyles = _ref7.seenStyles,
          seenStyles = _ref7$seenStyles === void 0 ? Object.create(null) : _ref7$seenStyles;
      resources = resources || _primitives.Dict.empty;
      stateManager = stateManager || new StateManager(new TextState());
      var WhitespaceRegexp = /\s/g;
      var textContent = {
        items: [],
        styles: Object.create(null)
      };
      var textContentItem = {
        initialized: false,
        str: [],
        width: 0,
        height: 0,
        vertical: false,
        lastAdvanceWidth: 0,
        lastAdvanceHeight: 0,
        textAdvanceScale: 0,
        spaceWidth: 0,
        fakeSpaceMin: Infinity,
        fakeMultiSpaceMin: Infinity,
        fakeMultiSpaceMax: -0,
        textRunBreakAllowed: false,
        transform: null,
        fontName: null
      };
      var SPACE_FACTOR = 0.3;
      var MULTI_SPACE_FACTOR = 1.5;
      var MULTI_SPACE_FACTOR_MAX = 4;
      var self = this;
      var xref = this.xref;
      var xobjs = null;
      var skipEmptyXObjs = Object.create(null);
      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
      var textState;

      function ensureTextContentItem() {
        if (textContentItem.initialized) {
          return textContentItem;
        }

        var font = textState.font;

        if (!(font.loadedName in seenStyles)) {
          seenStyles[font.loadedName] = true;
          textContent.styles[font.loadedName] = {
            fontFamily: font.fallbackName,
            ascent: font.ascent,
            descent: font.descent,
            vertical: !!font.vertical
          };
        }

        textContentItem.fontName = font.loadedName;
        var tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise];

        if (font.isType3Font && textState.fontMatrix !== _util.FONT_IDENTITY_MATRIX && textState.fontSize === 1) {
          var glyphHeight = font.bbox[3] - font.bbox[1];

          if (glyphHeight > 0) {
            glyphHeight = glyphHeight * textState.fontMatrix[3];
            tsm[3] *= glyphHeight;
          }
        }

        var trm = _util.Util.transform(textState.ctm, _util.Util.transform(textState.textMatrix, tsm));

        textContentItem.transform = trm;

        if (!font.vertical) {
          textContentItem.width = 0;
          textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]);
          textContentItem.vertical = false;
        } else {
          textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]);
          textContentItem.height = 0;
          textContentItem.vertical = true;
        }

        var a = textState.textLineMatrix[0];
        var b = textState.textLineMatrix[1];
        var scaleLineX = Math.sqrt(a * a + b * b);
        a = textState.ctm[0];
        b = textState.ctm[1];
        var scaleCtmX = Math.sqrt(a * a + b * b);
        textContentItem.textAdvanceScale = scaleCtmX * scaleLineX;
        textContentItem.lastAdvanceWidth = 0;
        textContentItem.lastAdvanceHeight = 0;
        var spaceWidth = font.spaceWidth / 1000 * textState.fontSize;

        if (spaceWidth) {
          textContentItem.spaceWidth = spaceWidth;
          textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR;
          textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR;
          textContentItem.fakeMultiSpaceMax = spaceWidth * MULTI_SPACE_FACTOR_MAX;
          textContentItem.textRunBreakAllowed = !font.isMonospace;
        } else {
          textContentItem.spaceWidth = 0;
          textContentItem.fakeSpaceMin = Infinity;
          textContentItem.fakeMultiSpaceMin = Infinity;
          textContentItem.fakeMultiSpaceMax = 0;
          textContentItem.textRunBreakAllowed = false;
        }

        textContentItem.initialized = true;
        return textContentItem;
      }

      function replaceWhitespace(str) {
        var i = 0,
            ii = str.length,
            code;

        while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) {
          i++;
        }

        return i < ii ? str.replace(WhitespaceRegexp, ' ') : str;
      }

      function runBidiTransform(textChunk) {
        var str = textChunk.str.join('');
        var bidiResult = (0, _bidi.bidi)(str, -1, textChunk.vertical);
        return {
          str: normalizeWhitespace ? replaceWhitespace(bidiResult.str) : bidiResult.str,
          dir: bidiResult.dir,
          width: textChunk.width,
          height: textChunk.height,
          transform: textChunk.transform,
          fontName: textChunk.fontName
        };
      }

      function handleSetFont(fontName, fontRef) {
        return self.loadFont(fontName, fontRef, resources).then(function (translated) {
          textState.font = translated.font;
          textState.fontMatrix = translated.font.fontMatrix || _util.FONT_IDENTITY_MATRIX;
        });
      }

      function buildTextContentItem(chars) {
        var font = textState.font;
        var textChunk = ensureTextContentItem();
        var width = 0;
        var height = 0;
        var glyphs = font.charsToGlyphs(chars);

        for (var i = 0; i < glyphs.length; i++) {
          var glyph = glyphs[i];
          var glyphWidth = null;

          if (font.vertical && glyph.vmetric) {
            glyphWidth = glyph.vmetric[0];
          } else {
            glyphWidth = glyph.width;
          }

          var glyphUnicode = glyph.unicode;
          var NormalizedUnicodes = (0, _unicode.getNormalizedUnicodes)();

          if (NormalizedUnicodes[glyphUnicode] !== undefined) {
            glyphUnicode = NormalizedUnicodes[glyphUnicode];
          }

          glyphUnicode = (0, _unicode.reverseIfRtl)(glyphUnicode);
          var charSpacing = textState.charSpacing;

          if (glyph.isSpace) {
            var wordSpacing = textState.wordSpacing;
            charSpacing += wordSpacing;

            if (wordSpacing > 0) {
              addFakeSpaces(wordSpacing, textChunk.str);
            }
          }

          var tx = 0;
          var ty = 0;

          if (!font.vertical) {
            var w0 = glyphWidth * textState.fontMatrix[0];
            tx = (w0 * textState.fontSize + charSpacing) * textState.textHScale;
            width += tx;
          } else {
            var w1 = glyphWidth * textState.fontMatrix[0];
            ty = w1 * textState.fontSize + charSpacing;
            height += ty;
          }

          textState.translateTextMatrix(tx, ty);
          textChunk.str.push(glyphUnicode);
        }

        if (!font.vertical) {
          textChunk.lastAdvanceWidth = width;
          textChunk.width += width;
        } else {
          textChunk.lastAdvanceHeight = height;
          textChunk.height += Math.abs(height);
        }

        return textChunk;
      }

      function addFakeSpaces(width, strBuf) {
        if (width < textContentItem.fakeSpaceMin) {
          return;
        }

        if (width < textContentItem.fakeMultiSpaceMin) {
          strBuf.push(' ');
          return;
        }

        var fakeSpaces = Math.round(width / textContentItem.spaceWidth);

        while (fakeSpaces-- > 0) {
          strBuf.push(' ');
        }
      }

      function flushTextContentItem() {
        if (!textContentItem.initialized) {
          return;
        }

        if (!textContentItem.vertical) {
          textContentItem.width *= textContentItem.textAdvanceScale;
        } else {
          textContentItem.height *= textContentItem.textAdvanceScale;
        }

        textContent.items.push(runBidiTransform(textContentItem));
        textContentItem.initialized = false;
        textContentItem.str.length = 0;
      }

      function enqueueChunk() {
        var length = textContent.items.length;

        if (length > 0) {
          sink.enqueue(textContent, length);
          textContent.items = [];
          textContent.styles = Object.create(null);
        }
      }

      var timeSlotManager = new TimeSlotManager();
      return new Promise(function promiseBody(resolve, reject) {
        var next = function next(promise) {
          enqueueChunk();
          Promise.all([promise, sink.ready]).then(function () {
            try {
              promiseBody(resolve, reject);
            } catch (ex) {
              reject(ex);
            }
          }, reject);
        };

        task.ensureNotTerminated();
        timeSlotManager.reset();
        var stop,
            operation = {},
            args = [];

        while (!(stop = timeSlotManager.check())) {
          args.length = 0;
          operation.args = args;

          if (!preprocessor.read(operation)) {
            break;
          }

          textState = stateManager.state;
          var fn = operation.fn;
          args = operation.args;
          var advance, diff;

          switch (fn | 0) {
            case _util.OPS.setFont:
              var fontNameArg = args[0].name,
                  fontSizeArg = args[1];

              if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) {
                break;
              }

              flushTextContentItem();
              textState.fontName = fontNameArg;
              textState.fontSize = fontSizeArg;
              next(handleSetFont(fontNameArg, null));
              return;

            case _util.OPS.setTextRise:
              flushTextContentItem();
              textState.textRise = args[0];
              break;

            case _util.OPS.setHScale:
              flushTextContentItem();
              textState.textHScale = args[0] / 100;
              break;

            case _util.OPS.setLeading:
              flushTextContentItem();
              textState.leading = args[0];
              break;

            case _util.OPS.moveText:
              var isSameTextLine = !textState.font ? false : (textState.font.vertical ? args[0] : args[1]) === 0;
              advance = args[0] - args[1];

              if (combineTextItems && isSameTextLine && textContentItem.initialized && advance > 0 && advance <= textContentItem.fakeMultiSpaceMax) {
                textState.translateTextLineMatrix(args[0], args[1]);
                textContentItem.width += args[0] - textContentItem.lastAdvanceWidth;
                textContentItem.height += args[1] - textContentItem.lastAdvanceHeight;
                diff = args[0] - textContentItem.lastAdvanceWidth - (args[1] - textContentItem.lastAdvanceHeight);
                addFakeSpaces(diff, textContentItem.str);
                break;
              }

              flushTextContentItem();
              textState.translateTextLineMatrix(args[0], args[1]);
              textState.textMatrix = textState.textLineMatrix.slice();
              break;

            case _util.OPS.setLeadingMoveText:
              flushTextContentItem();
              textState.leading = -args[1];
              textState.translateTextLineMatrix(args[0], args[1]);
              textState.textMatrix = textState.textLineMatrix.slice();
              break;

            case _util.OPS.nextLine:
              flushTextContentItem();
              textState.carriageReturn();
              break;

            case _util.OPS.setTextMatrix:
              advance = textState.calcTextLineMatrixAdvance(args[0], args[1], args[2], args[3], args[4], args[5]);

              if (combineTextItems && advance !== null && textContentItem.initialized && advance.value > 0 && advance.value <= textContentItem.fakeMultiSpaceMax) {
                textState.translateTextLineMatrix(advance.width, advance.height);
                textContentItem.width += advance.width - textContentItem.lastAdvanceWidth;
                textContentItem.height += advance.height - textContentItem.lastAdvanceHeight;
                diff = advance.width - textContentItem.lastAdvanceWidth - (advance.height - textContentItem.lastAdvanceHeight);
                addFakeSpaces(diff, textContentItem.str);
                break;
              }

              flushTextContentItem();
              textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
              textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
              break;

            case _util.OPS.setCharSpacing:
              textState.charSpacing = args[0];
              break;

            case _util.OPS.setWordSpacing:
              textState.wordSpacing = args[0];
              break;

            case _util.OPS.beginText:
              flushTextContentItem();
              textState.textMatrix = _util.IDENTITY_MATRIX.slice();
              textState.textLineMatrix = _util.IDENTITY_MATRIX.slice();
              break;

            case _util.OPS.showSpacedText:
              var items = args[0];
              var offset;

              for (var j = 0, jj = items.length; j < jj; j++) {
                if (typeof items[j] === 'string') {
                  buildTextContentItem(items[j]);
                } else if ((0, _util.isNum)(items[j])) {
                  ensureTextContentItem();
                  advance = items[j] * textState.fontSize / 1000;
                  var breakTextRun = false;

                  if (textState.font.vertical) {
                    offset = advance;
                    textState.translateTextMatrix(0, offset);
                    breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax;

                    if (!breakTextRun) {
                      textContentItem.height += offset;
                    }
                  } else {
                    advance = -advance;
                    offset = advance * textState.textHScale;
                    textState.translateTextMatrix(offset, 0);
                    breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax;

                    if (!breakTextRun) {
                      textContentItem.width += offset;
                    }
                  }

                  if (breakTextRun) {
                    flushTextContentItem();
                  } else if (advance > 0) {
                    addFakeSpaces(advance, textContentItem.str);
                  }
                }
              }

              break;

            case _util.OPS.showText:
              buildTextContentItem(args[0]);
              break;

            case _util.OPS.nextLineShowText:
              flushTextContentItem();
              textState.carriageReturn();
              buildTextContentItem(args[0]);
              break;

            case _util.OPS.nextLineSetSpacingShowText:
              flushTextContentItem();
              textState.wordSpacing = args[0];
              textState.charSpacing = args[1];
              textState.carriageReturn();
              buildTextContentItem(args[2]);
              break;

            case _util.OPS.paintXObject:
              flushTextContentItem();

              if (!xobjs) {
                xobjs = resources.get('XObject') || _primitives.Dict.empty;
              }

              var name = args[0].name;

              if (name && skipEmptyXObjs[name] !== undefined) {
                break;
              }

              next(new Promise(function (resolveXObject, rejectXObject) {
                if (!name) {
                  throw new _util.FormatError('XObject must be referred to by name.');
                }

                var xobj = xobjs.get(name);

                if (!xobj) {
                  resolveXObject();
                  return;
                }

                if (!(0, _primitives.isStream)(xobj)) {
                  throw new _util.FormatError('XObject should be a stream');
                }

                var type = xobj.dict.get('Subtype');

                if (!(0, _primitives.isName)(type)) {
                  throw new _util.FormatError('XObject should have a Name subtype');
                }

                if (type.name !== 'Form') {
                  skipEmptyXObjs[name] = true;
                  resolveXObject();
                  return;
                }

                var currentState = stateManager.state.clone();
                var xObjStateManager = new StateManager(currentState);
                var matrix = xobj.dict.getArray('Matrix');

                if (Array.isArray(matrix) && matrix.length === 6) {
                  xObjStateManager.transform(matrix);
                }

                enqueueChunk();
                var sinkWrapper = {
                  enqueueInvoked: false,
                  enqueue: function enqueue(chunk, size) {
                    this.enqueueInvoked = true;
                    sink.enqueue(chunk, size);
                  },

                  get desiredSize() {
                    return sink.desiredSize;
                  },

                  get ready() {
                    return sink.ready;
                  }

                };
                self.getTextContent({
                  stream: xobj,
                  task: task,
                  resources: xobj.dict.get('Resources') || resources,
                  stateManager: xObjStateManager,
                  normalizeWhitespace: normalizeWhitespace,
                  combineTextItems: combineTextItems,
                  sink: sinkWrapper,
                  seenStyles: seenStyles
                }).then(function () {
                  if (!sinkWrapper.enqueueInvoked) {
                    skipEmptyXObjs[name] = true;
                  }

                  resolveXObject();
                }, rejectXObject);
              }).catch(function (reason) {
                if (reason instanceof _util.AbortException) {
                  return;
                }

                if (self.options.ignoreErrors) {
                  (0, _util.warn)("getTextContent - ignoring XObject: \"".concat(reason, "\"."));
                  return;
                }

                throw reason;
              }));
              return;

            case _util.OPS.setGState:
              flushTextContentItem();
              var dictName = args[0];
              var extGState = resources.get('ExtGState');

              if (!(0, _primitives.isDict)(extGState) || !(0, _primitives.isName)(dictName)) {
                break;
              }

              var gState = extGState.get(dictName.name);

              if (!(0, _primitives.isDict)(gState)) {
                break;
              }

              var gStateFont = gState.get('Font');

              if (gStateFont) {
                textState.fontName = null;
                textState.fontSize = gStateFont[1];
                next(handleSetFont(null, gStateFont[0]));
                return;
              }

              break;
          }

          if (textContent.items.length >= sink.desiredSize) {
            stop = true;
            break;
          }
        }

        if (stop) {
          next(deferred);
          return;
        }

        flushTextContentItem();
        enqueueChunk();
        resolve();
      }).catch(function (reason) {
        if (reason instanceof _util.AbortException) {
          return;
        }

        if (_this8.options.ignoreErrors) {
          (0, _util.warn)("getTextContent - ignoring errors during \"".concat(task.name, "\" ") + "task: \"".concat(reason, "\"."));
          flushTextContentItem();
          enqueueChunk();
          return;
        }

        throw reason;
      });
    },
    extractDataStructures: function PartialEvaluator_extractDataStructures(dict, baseDict, properties) {
      var _this9 = this;

      var xref = this.xref;
      var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');
      var toUnicodePromise = toUnicode ? this.readToUnicode(toUnicode) : Promise.resolve(undefined);

      if (properties.composite) {
        var cidSystemInfo = dict.get('CIDSystemInfo');

        if ((0, _primitives.isDict)(cidSystemInfo)) {
          properties.cidSystemInfo = {
            registry: (0, _util.stringToPDFString)(cidSystemInfo.get('Registry')),
            ordering: (0, _util.stringToPDFString)(cidSystemInfo.get('Ordering')),
            supplement: cidSystemInfo.get('Supplement')
          };
        }

        var cidToGidMap = dict.get('CIDToGIDMap');

        if ((0, _primitives.isStream)(cidToGidMap)) {
          properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
        }
      }

      var differences = [];
      var baseEncodingName = null;
      var encoding;

      if (dict.has('Encoding')) {
        encoding = dict.get('Encoding');

        if ((0, _primitives.isDict)(encoding)) {
          baseEncodingName = encoding.get('BaseEncoding');
          baseEncodingName = (0, _primitives.isName)(baseEncodingName) ? baseEncodingName.name : null;

          if (encoding.has('Differences')) {
            var diffEncoding = encoding.get('Differences');
            var index = 0;

            for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
              var data = xref.fetchIfRef(diffEncoding[j]);

              if ((0, _util.isNum)(data)) {
                index = data;
              } else if ((0, _primitives.isName)(data)) {
                differences[index++] = data.name;
              } else {
                throw new _util.FormatError("Invalid entry in 'Differences' array: ".concat(data));
              }
            }
          }
        } else if ((0, _primitives.isName)(encoding)) {
          baseEncodingName = encoding.name;
        } else {
          throw new _util.FormatError('Encoding is not a Name nor a Dict');
        }

        if (baseEncodingName !== 'MacRomanEncoding' && baseEncodingName !== 'MacExpertEncoding' && baseEncodingName !== 'WinAnsiEncoding') {
          baseEncodingName = null;
        }
      }

      if (baseEncodingName) {
        properties.defaultEncoding = (0, _encodings.getEncoding)(baseEncodingName).slice();
      } else {
        var isSymbolicFont = !!(properties.flags & _fonts.FontFlags.Symbolic);
        var isNonsymbolicFont = !!(properties.flags & _fonts.FontFlags.Nonsymbolic);
        encoding = _encodings.StandardEncoding;

        if (properties.type === 'TrueType' && !isNonsymbolicFont) {
          encoding = _encodings.WinAnsiEncoding;
        }

        if (isSymbolicFont) {
          encoding = _encodings.MacRomanEncoding;

          if (!properties.file) {
            if (/Symbol/i.test(properties.name)) {
              encoding = _encodings.SymbolSetEncoding;
            } else if (/Dingbats/i.test(properties.name)) {
              encoding = _encodings.ZapfDingbatsEncoding;
            }
          }
        }

        properties.defaultEncoding = encoding;
      }

      properties.differences = differences;
      properties.baseEncodingName = baseEncodingName;
      properties.hasEncoding = !!baseEncodingName || differences.length > 0;
      properties.dict = dict;
      return toUnicodePromise.then(function (toUnicode) {
        properties.toUnicode = toUnicode;
        return _this9.buildToUnicode(properties);
      }).then(function (toUnicode) {
        properties.toUnicode = toUnicode;
        return properties;
      });
    },
    _buildSimpleFontToUnicode: function _buildSimpleFontToUnicode(properties) {
      (0, _util.assert)(!properties.composite, 'Must be a simple font.');
      var toUnicode = [],
          charcode,
          glyphName;
      var encoding = properties.defaultEncoding.slice();
      var baseEncodingName = properties.baseEncodingName;
      var differences = properties.differences;

      for (charcode in differences) {
        glyphName = differences[charcode];

        if (glyphName === '.notdef') {
          continue;
        }

        encoding[charcode] = glyphName;
      }

      var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();

      for (charcode in encoding) {
        glyphName = encoding[charcode];

        if (glyphName === '') {
          continue;
        } else if (glyphsUnicodeMap[glyphName] === undefined) {
          var code = 0;

          switch (glyphName[0]) {
            case 'G':
              if (glyphName.length === 3) {
                code = parseInt(glyphName.substring(1), 16);
              }

              break;

            case 'g':
              if (glyphName.length === 5) {
                code = parseInt(glyphName.substring(1), 16);
              }

              break;

            case 'C':
            case 'c':
              if (glyphName.length >= 3) {
                code = +glyphName.substring(1);
              }

              break;

            default:
              var unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);

              if (unicode !== -1) {
                code = unicode;
              }

          }

          if (code) {
            if (baseEncodingName && code === +charcode) {
              var baseEncoding = (0, _encodings.getEncoding)(baseEncodingName);

              if (baseEncoding && (glyphName = baseEncoding[charcode])) {
                toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);
                continue;
              }
            }

            toUnicode[charcode] = String.fromCodePoint(code);
          }

          continue;
        }

        toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);
      }

      return new _fonts.ToUnicodeMap(toUnicode);
    },
    buildToUnicode: function buildToUnicode(properties) {
      properties.hasIncludedToUnicodeMap = !!properties.toUnicode && properties.toUnicode.length > 0;

      if (properties.hasIncludedToUnicodeMap) {
        if (!properties.composite && properties.hasEncoding) {
          properties.fallbackToUnicode = this._buildSimpleFontToUnicode(properties);
        }

        return Promise.resolve(properties.toUnicode);
      }

      if (!properties.composite) {
        return Promise.resolve(this._buildSimpleFontToUnicode(properties));
      }

      if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof _cmap.IdentityCMap) || properties.cidSystemInfo.registry === 'Adobe' && (properties.cidSystemInfo.ordering === 'GB1' || properties.cidSystemInfo.ordering === 'CNS1' || properties.cidSystemInfo.ordering === 'Japan1' || properties.cidSystemInfo.ordering === 'Korea1'))) {
        var registry = properties.cidSystemInfo.registry;
        var ordering = properties.cidSystemInfo.ordering;

        var ucs2CMapName = _primitives.Name.get(registry + '-' + ordering + '-UCS2');

        return _cmap.CMapFactory.create({
          encoding: ucs2CMapName,
          fetchBuiltInCMap: this.fetchBuiltInCMap,
          useCMap: null
        }).then(function (ucs2CMap) {
          var cMap = properties.cMap;
          var toUnicode = [];
          cMap.forEach(function (charcode, cid) {
            if (cid > 0xffff) {
              throw new _util.FormatError('Max size of CID is 65,535');
            }

            var ucs2 = ucs2CMap.lookup(cid);

            if (ucs2) {
              toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) + ucs2.charCodeAt(1));
            }
          });
          return new _fonts.ToUnicodeMap(toUnicode);
        });
      }

      return Promise.resolve(new _fonts.IdentityToUnicodeMap(properties.firstChar, properties.lastChar));
    },
    readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) {
      var cmapObj = toUnicode;

      if ((0, _primitives.isName)(cmapObj)) {
        return _cmap.CMapFactory.create({
          encoding: cmapObj,
          fetchBuiltInCMap: this.fetchBuiltInCMap,
          useCMap: null
        }).then(function (cmap) {
          if (cmap instanceof _cmap.IdentityCMap) {
            return new _fonts.IdentityToUnicodeMap(0, 0xFFFF);
          }

          return new _fonts.ToUnicodeMap(cmap.getMap());
        });
      } else if ((0, _primitives.isStream)(cmapObj)) {
        return _cmap.CMapFactory.create({
          encoding: cmapObj,
          fetchBuiltInCMap: this.fetchBuiltInCMap,
          useCMap: null
        }).then(function (cmap) {
          if (cmap instanceof _cmap.IdentityCMap) {
            return new _fonts.IdentityToUnicodeMap(0, 0xFFFF);
          }

          var map = new Array(cmap.length);
          cmap.forEach(function (charCode, token) {
            var str = [];

            for (var k = 0; k < token.length; k += 2) {
              var w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);

              if ((w1 & 0xF800) !== 0xD800) {
                str.push(w1);
                continue;
              }

              k += 2;
              var w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);
              str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);
            }

            map[charCode] = String.fromCodePoint.apply(String, str);
          });
          return new _fonts.ToUnicodeMap(map);
        });
      }

      return Promise.resolve(null);
    },
    readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {
      var glyphsData = cidToGidStream.getBytes();
      var result = [];

      for (var j = 0, jj = glyphsData.length; j < jj; j++) {
        var glyphID = glyphsData[j++] << 8 | glyphsData[j];

        if (glyphID === 0) {
          continue;
        }

        var code = j >> 1;
        result[code] = glyphID;
      }

      return result;
    },
    extractWidths: function PartialEvaluator_extractWidths(dict, descriptor, properties) {
      var xref = this.xref;
      var glyphsWidths = [];
      var defaultWidth = 0;
      var glyphsVMetrics = [];
      var defaultVMetrics;
      var i, ii, j, jj, start, code, widths;

      if (properties.composite) {
        defaultWidth = dict.has('DW') ? dict.get('DW') : 1000;
        widths = dict.get('W');

        if (widths) {
          for (i = 0, ii = widths.length; i < ii; i++) {
            start = xref.fetchIfRef(widths[i++]);
            code = xref.fetchIfRef(widths[i]);

            if (Array.isArray(code)) {
              for (j = 0, jj = code.length; j < jj; j++) {
                glyphsWidths[start++] = xref.fetchIfRef(code[j]);
              }
            } else {
              var width = xref.fetchIfRef(widths[++i]);

              for (j = start; j <= code; j++) {
                glyphsWidths[j] = width;
              }
            }
          }
        }

        if (properties.vertical) {
          var vmetrics = dict.getArray('DW2') || [880, -1000];
          defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];
          vmetrics = dict.get('W2');

          if (vmetrics) {
            for (i = 0, ii = vmetrics.length; i < ii; i++) {
              start = xref.fetchIfRef(vmetrics[i++]);
              code = xref.fetchIfRef(vmetrics[i]);

              if (Array.isArray(code)) {
                for (j = 0, jj = code.length; j < jj; j++) {
                  glyphsVMetrics[start++] = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])];
                }
              } else {
                var vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i])];

                for (j = start; j <= code; j++) {
                  glyphsVMetrics[j] = vmetric;
                }
              }
            }
          }
        }
      } else {
        var firstChar = properties.firstChar;
        widths = dict.get('Widths');

        if (widths) {
          j = firstChar;

          for (i = 0, ii = widths.length; i < ii; i++) {
            glyphsWidths[j++] = xref.fetchIfRef(widths[i]);
          }

          defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;
        } else {
          var baseFontName = dict.get('BaseFont');

          if ((0, _primitives.isName)(baseFontName)) {
            var metrics = this.getBaseFontMetrics(baseFontName.name);
            glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties);
            defaultWidth = metrics.defaultWidth;
          }
        }
      }

      var isMonospace = true;
      var firstWidth = defaultWidth;

      for (var glyph in glyphsWidths) {
        var glyphWidth = glyphsWidths[glyph];

        if (!glyphWidth) {
          continue;
        }

        if (!firstWidth) {
          firstWidth = glyphWidth;
          continue;
        }

        if (firstWidth !== glyphWidth) {
          isMonospace = false;
          break;
        }
      }

      if (isMonospace) {
        properties.flags |= _fonts.FontFlags.FixedPitch;
      }

      properties.defaultWidth = defaultWidth;
      properties.widths = glyphsWidths;
      properties.defaultVMetrics = defaultVMetrics;
      properties.vmetrics = glyphsVMetrics;
    },
    isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) {
      var fontNameWoStyle = baseFontName.split('-')[0];
      return fontNameWoStyle in (0, _standard_fonts.getSerifFonts)() || fontNameWoStyle.search(/serif/gi) !== -1;
    },
    getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {
      var defaultWidth = 0;
      var widths = [];
      var monospace = false;
      var stdFontMap = (0, _standard_fonts.getStdFontMap)();
      var lookupName = stdFontMap[name] || name;
      var Metrics = (0, _metrics.getMetrics)();

      if (!(lookupName in Metrics)) {
        if (this.isSerifFont(name)) {
          lookupName = 'Times-Roman';
        } else {
          lookupName = 'Helvetica';
        }
      }

      var glyphWidths = Metrics[lookupName];

      if ((0, _util.isNum)(glyphWidths)) {
        defaultWidth = glyphWidths;
        monospace = true;
      } else {
        widths = glyphWidths();
      }

      return {
        defaultWidth: defaultWidth,
        monospace: monospace,
        widths: widths
      };
    },
    buildCharCodeToWidth: function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName, properties) {
      var widths = Object.create(null);
      var differences = properties.differences;
      var encoding = properties.defaultEncoding;

      for (var charCode = 0; charCode < 256; charCode++) {
        if (charCode in differences && widthsByGlyphName[differences[charCode]]) {
          widths[charCode] = widthsByGlyphName[differences[charCode]];
          continue;
        }

        if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {
          widths[charCode] = widthsByGlyphName[encoding[charCode]];
          continue;
        }
      }

      return widths;
    },
    preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict) {
      var baseDict = dict;
      var type = dict.get('Subtype');

      if (!(0, _primitives.isName)(type)) {
        throw new _util.FormatError('invalid font Subtype');
      }

      var composite = false;
      var uint8array;

      if (type.name === 'Type0') {
        var df = dict.get('DescendantFonts');

        if (!df) {
          throw new _util.FormatError('Descendant fonts are not specified');
        }

        dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df;
        type = dict.get('Subtype');

        if (!(0, _primitives.isName)(type)) {
          throw new _util.FormatError('invalid font Subtype');
        }

        composite = true;
      }

      var descriptor = dict.get('FontDescriptor');

      if (descriptor) {
        var hash = new _murmurhash.MurmurHash3_64();
        var encoding = baseDict.getRaw('Encoding');

        if ((0, _primitives.isName)(encoding)) {
          hash.update(encoding.name);
        } else if ((0, _primitives.isRef)(encoding)) {
          hash.update(encoding.toString());
        } else if ((0, _primitives.isDict)(encoding)) {
          var keys = encoding.getKeys();

          for (var i = 0, ii = keys.length; i < ii; i++) {
            var entry = encoding.getRaw(keys[i]);

            if ((0, _primitives.isName)(entry)) {
              hash.update(entry.name);
            } else if ((0, _primitives.isRef)(entry)) {
              hash.update(entry.toString());
            } else if (Array.isArray(entry)) {
              var diffLength = entry.length,
                  diffBuf = new Array(diffLength);

              for (var j = 0; j < diffLength; j++) {
                var diffEntry = entry[j];

                if ((0, _primitives.isName)(diffEntry)) {
                  diffBuf[j] = diffEntry.name;
                } else if ((0, _util.isNum)(diffEntry) || (0, _primitives.isRef)(diffEntry)) {
                  diffBuf[j] = diffEntry.toString();
                }
              }

              hash.update(diffBuf.join());
            }
          }
        }

        var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');

        if ((0, _primitives.isStream)(toUnicode)) {
          var stream = toUnicode.str || toUnicode;
          uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start);
          hash.update(uint8array);
        } else if ((0, _primitives.isName)(toUnicode)) {
          hash.update(toUnicode.name);
        }

        var widths = dict.get('Widths') || baseDict.get('Widths');

        if (widths) {
          uint8array = new Uint8Array(new Uint32Array(widths).buffer);
          hash.update(uint8array);
        }
      }

      return {
        descriptor: descriptor,
        dict: dict,
        baseDict: baseDict,
        composite: composite,
        type: type.name,
        hash: hash ? hash.hexdigest() : ''
      };
    },
    translateFont: function PartialEvaluator_translateFont(preEvaluatedFont) {
      var _this10 = this;

      var baseDict = preEvaluatedFont.baseDict;
      var dict = preEvaluatedFont.dict;
      var composite = preEvaluatedFont.composite;
      var descriptor = preEvaluatedFont.descriptor;
      var type = preEvaluatedFont.type;
      var maxCharIndex = composite ? 0xFFFF : 0xFF;
      var properties;

      if (!descriptor) {
        if (type === 'Type3') {
          descriptor = new _primitives.Dict(null);
          descriptor.set('FontName', _primitives.Name.get(type));
          descriptor.set('FontBBox', dict.getArray('FontBBox'));
        } else {
          var baseFontName = dict.get('BaseFont');

          if (!(0, _primitives.isName)(baseFontName)) {
            throw new _util.FormatError('Base font is not specified');
          }

          baseFontName = baseFontName.name.replace(/[,_]/g, '-');
          var metrics = this.getBaseFontMetrics(baseFontName);
          var fontNameWoStyle = baseFontName.split('-')[0];
          var flags = (this.isSerifFont(fontNameWoStyle) ? _fonts.FontFlags.Serif : 0) | (metrics.monospace ? _fonts.FontFlags.FixedPitch : 0) | ((0, _standard_fonts.getSymbolsFonts)()[fontNameWoStyle] ? _fonts.FontFlags.Symbolic : _fonts.FontFlags.Nonsymbolic);
          properties = {
            type: type,
            name: baseFontName,
            widths: metrics.widths,
            defaultWidth: metrics.defaultWidth,
            flags: flags,
            firstChar: 0,
            lastChar: maxCharIndex
          };
          return this.extractDataStructures(dict, dict, properties).then(function (properties) {
            properties.widths = _this10.buildCharCodeToWidth(metrics.widths, properties);
            return new _fonts.Font(baseFontName, null, properties);
          });
        }
      }

      var firstChar = dict.get('FirstChar') || 0;
      var lastChar = dict.get('LastChar') || maxCharIndex;
      var fontName = descriptor.get('FontName');
      var baseFont = dict.get('BaseFont');

      if ((0, _util.isString)(fontName)) {
        fontName = _primitives.Name.get(fontName);
      }

      if ((0, _util.isString)(baseFont)) {
        baseFont = _primitives.Name.get(baseFont);
      }

      if (type !== 'Type3') {
        var fontNameStr = fontName && fontName.name;
        var baseFontStr = baseFont && baseFont.name;

        if (fontNameStr !== baseFontStr) {
          (0, _util.info)("The FontDescriptor's FontName is \"".concat(fontNameStr, "\" but ") + "should be the same as the Font's BaseFont \"".concat(baseFontStr, "\"."));

          if (fontNameStr && baseFontStr && baseFontStr.startsWith(fontNameStr)) {
            fontName = baseFont;
          }
        }
      }

      fontName = fontName || baseFont;

      if (!(0, _primitives.isName)(fontName)) {
        throw new _util.FormatError('invalid font name');
      }

      var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');

      if (fontFile) {
        if (fontFile.dict) {
          var subtype = fontFile.dict.get('Subtype');

          if (subtype) {
            subtype = subtype.name;
          }

          var length1 = fontFile.dict.get('Length1');
          var length2 = fontFile.dict.get('Length2');
          var length3 = fontFile.dict.get('Length3');
        }
      }

      properties = {
        type: type,
        name: fontName.name,
        subtype: subtype,
        file: fontFile,
        length1: length1,
        length2: length2,
        length3: length3,
        loadedName: baseDict.loadedName,
        composite: composite,
        wideChars: composite,
        fixedPitch: false,
        fontMatrix: dict.getArray('FontMatrix') || _util.FONT_IDENTITY_MATRIX,
        firstChar: firstChar || 0,
        lastChar: lastChar || maxCharIndex,
        bbox: descriptor.getArray('FontBBox'),
        ascent: descriptor.get('Ascent'),
        descent: descriptor.get('Descent'),
        xHeight: descriptor.get('XHeight'),
        capHeight: descriptor.get('CapHeight'),
        flags: descriptor.get('Flags'),
        italicAngle: descriptor.get('ItalicAngle'),
        isType3Font: false
      };
      var cMapPromise;

      if (composite) {
        var cidEncoding = baseDict.get('Encoding');

        if ((0, _primitives.isName)(cidEncoding)) {
          properties.cidEncoding = cidEncoding.name;
        }

        cMapPromise = _cmap.CMapFactory.create({
          encoding: cidEncoding,
          fetchBuiltInCMap: this.fetchBuiltInCMap,
          useCMap: null
        }).then(function (cMap) {
          properties.cMap = cMap;
          properties.vertical = properties.cMap.vertical;
        });
      } else {
        cMapPromise = Promise.resolve(undefined);
      }

      return cMapPromise.then(function () {
        return _this10.extractDataStructures(dict, baseDict, properties);
      }).then(function (properties) {
        _this10.extractWidths(dict, descriptor, properties);

        if (type === 'Type3') {
          properties.isType3Font = true;
        }

        return new _fonts.Font(fontName.name, fontFile, properties);
      });
    }
  };

  PartialEvaluator.buildFontPaths = function (font, glyphs, handler) {
    function buildPath(fontChar) {
      if (font.renderer.hasBuiltPath(fontChar)) {
        return;
      }

      handler.send('commonobj', ["".concat(font.loadedName, "_path_").concat(fontChar), 'FontPath', font.renderer.getPathJs(fontChar)]);
    }

    var _iteratorNormalCompletion = true;
    var _didIteratorError = false;
    var _iteratorError = undefined;

    try {
      for (var _iterator = glyphs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
        var glyph = _step.value;
        buildPath(glyph.fontChar);
        var accent = glyph.accent;

        if (accent && accent.fontChar) {
          buildPath(accent.fontChar);
        }
      }
    } catch (err) {
      _didIteratorError = true;
      _iteratorError = err;
    } finally {
      try {
        if (!_iteratorNormalCompletion && _iterator.return != null) {
          _iterator.return();
        }
      } finally {
        if (_didIteratorError) {
          throw _iteratorError;
        }
      }
    }
  };

  return PartialEvaluator;
}();

exports.PartialEvaluator = PartialEvaluator;

var TranslatedFont = function TranslatedFontClosure() {
  function TranslatedFont(loadedName, font, dict) {
    this.loadedName = loadedName;
    this.font = font;
    this.dict = dict;
    this.type3Loaded = null;
    this.sent = false;
  }

  TranslatedFont.prototype = {
    send: function send(handler) {
      if (this.sent) {
        return;
      }

      this.sent = true;
      handler.send('commonobj', [this.loadedName, 'Font', this.font.exportData()]);
    },
    fallback: function fallback(handler) {
      if (!this.font.data) {
        return;
      }

      this.font.disableFontFace = true;
      var glyphs = this.font.glyphCacheValues;
      PartialEvaluator.buildFontPaths(this.font, glyphs, handler);
    },
    loadType3Data: function loadType3Data(evaluator, resources, parentOperatorList, task) {
      if (!this.font.isType3Font) {
        throw new Error('Must be a Type3 font.');
      }

      if (this.type3Loaded) {
        return this.type3Loaded;
      }

      var type3Options = Object.create(evaluator.options);
      type3Options.ignoreErrors = false;
      var type3Evaluator = evaluator.clone(type3Options);
      var translatedFont = this.font;
      var loadCharProcsPromise = Promise.resolve();
      var charProcs = this.dict.get('CharProcs');
      var fontResources = this.dict.get('Resources') || resources;
      var charProcKeys = charProcs.getKeys();
      var charProcOperatorList = Object.create(null);

      var _loop2 = function _loop2() {
        var key = charProcKeys[i];
        loadCharProcsPromise = loadCharProcsPromise.then(function () {
          var glyphStream = charProcs.get(key);
          var operatorList = new _operator_list.OperatorList();
          return type3Evaluator.getOperatorList({
            stream: glyphStream,
            task: task,
            resources: fontResources,
            operatorList: operatorList
          }).then(function () {
            charProcOperatorList[key] = operatorList.getIR();
            parentOperatorList.addDependencies(operatorList.dependencies);
          }).catch(function (reason) {
            (0, _util.warn)("Type3 font resource \"".concat(key, "\" is not available."));
            var operatorList = new _operator_list.OperatorList();
            charProcOperatorList[key] = operatorList.getIR();
          });
        });
      };

      for (var i = 0, n = charProcKeys.length; i < n; ++i) {
        _loop2();
      }

      this.type3Loaded = loadCharProcsPromise.then(function () {
        translatedFont.charProcOperatorList = charProcOperatorList;
      });
      return this.type3Loaded;
    }
  };
  return TranslatedFont;
}();

var StateManager = function StateManagerClosure() {
  function StateManager(initialState) {
    this.state = initialState;
    this.stateStack = [];
  }

  StateManager.prototype = {
    save: function save() {
      var old = this.state;
      this.stateStack.push(this.state);
      this.state = old.clone();
    },
    restore: function restore() {
      var prev = this.stateStack.pop();

      if (prev) {
        this.state = prev;
      }
    },
    transform: function transform(args) {
      this.state.ctm = _util.Util.transform(this.state.ctm, args);
    }
  };
  return StateManager;
}();

var TextState = function TextStateClosure() {
  function TextState() {
    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);
    this.fontName = null;
    this.fontSize = 0;
    this.font = null;
    this.fontMatrix = _util.FONT_IDENTITY_MATRIX;
    this.textMatrix = _util.IDENTITY_MATRIX.slice();
    this.textLineMatrix = _util.IDENTITY_MATRIX.slice();
    this.charSpacing = 0;
    this.wordSpacing = 0;
    this.leading = 0;
    this.textHScale = 1;
    this.textRise = 0;
  }

  TextState.prototype = {
    setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {
      var m = this.textMatrix;
      m[0] = a;
      m[1] = b;
      m[2] = c;
      m[3] = d;
      m[4] = e;
      m[5] = f;
    },
    setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {
      var m = this.textLineMatrix;
      m[0] = a;
      m[1] = b;
      m[2] = c;
      m[3] = d;
      m[4] = e;
      m[5] = f;
    },
    translateTextMatrix: function TextState_translateTextMatrix(x, y) {
      var m = this.textMatrix;
      m[4] = m[0] * x + m[2] * y + m[4];
      m[5] = m[1] * x + m[3] * y + m[5];
    },
    translateTextLineMatrix: function TextState_translateTextMatrix(x, y) {
      var m = this.textLineMatrix;
      m[4] = m[0] * x + m[2] * y + m[4];
      m[5] = m[1] * x + m[3] * y + m[5];
    },
    calcTextLineMatrixAdvance: function TextState_calcTextLineMatrixAdvance(a, b, c, d, e, f) {
      var font = this.font;

      if (!font) {
        return null;
      }

      var m = this.textLineMatrix;

      if (!(a === m[0] && b === m[1] && c === m[2] && d === m[3])) {
        return null;
      }

      var txDiff = e - m[4],
          tyDiff = f - m[5];

      if (font.vertical && txDiff !== 0 || !font.vertical && tyDiff !== 0) {
        return null;
      }

      var tx,
          ty,
          denominator = a * d - b * c;

      if (font.vertical) {
        tx = -tyDiff * c / denominator;
        ty = tyDiff * a / denominator;
      } else {
        tx = txDiff * d / denominator;
        ty = -txDiff * b / denominator;
      }

      return {
        width: tx,
        height: ty,
        value: font.vertical ? ty : tx
      };
    },
    calcRenderMatrix: function TextState_calcRendeMatrix(ctm) {
      var tsm = [this.fontSize * this.textHScale, 0, 0, this.fontSize, 0, this.textRise];
      return _util.Util.transform(ctm, _util.Util.transform(this.textMatrix, tsm));
    },
    carriageReturn: function TextState_carriageReturn() {
      this.translateTextLineMatrix(0, -this.leading);
      this.textMatrix = this.textLineMatrix.slice();
    },
    clone: function TextState_clone() {
      var clone = Object.create(this);
      clone.textMatrix = this.textMatrix.slice();
      clone.textLineMatrix = this.textLineMatrix.slice();
      clone.fontMatrix = this.fontMatrix.slice();
      return clone;
    }
  };
  return TextState;
}();

var EvalState = function EvalStateClosure() {
  function EvalState() {
    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);
    this.font = null;
    this.textRenderingMode = _util.TextRenderingMode.FILL;
    this.fillColorSpace = _colorspace.ColorSpace.singletons.gray;
    this.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;
  }

  EvalState.prototype = {
    clone: function CanvasExtraState_clone() {
      return Object.create(this);
    }
  };
  return EvalState;
}();

var EvaluatorPreprocessor = function EvaluatorPreprocessorClosure() {
  var getOPMap = (0, _util.getLookupTableFactory)(function (t) {
    t['w'] = {
      id: _util.OPS.setLineWidth,
      numArgs: 1,
      variableArgs: false
    };
    t['J'] = {
      id: _util.OPS.setLineCap,
      numArgs: 1,
      variableArgs: false
    };
    t['j'] = {
      id: _util.OPS.setLineJoin,
      numArgs: 1,
      variableArgs: false
    };
    t['M'] = {
      id: _util.OPS.setMiterLimit,
      numArgs: 1,
      variableArgs: false
    };
    t['d'] = {
      id: _util.OPS.setDash,
      numArgs: 2,
      variableArgs: false
    };
    t['ri'] = {
      id: _util.OPS.setRenderingIntent,
      numArgs: 1,
      variableArgs: false
    };
    t['i'] = {
      id: _util.OPS.setFlatness,
      numArgs: 1,
      variableArgs: false
    };
    t['gs'] = {
      id: _util.OPS.setGState,
      numArgs: 1,
      variableArgs: false
    };
    t['q'] = {
      id: _util.OPS.save,
      numArgs: 0,
      variableArgs: false
    };
    t['Q'] = {
      id: _util.OPS.restore,
      numArgs: 0,
      variableArgs: false
    };
    t['cm'] = {
      id: _util.OPS.transform,
      numArgs: 6,
      variableArgs: false
    };
    t['m'] = {
      id: _util.OPS.moveTo,
      numArgs: 2,
      variableArgs: false
    };
    t['l'] = {
      id: _util.OPS.lineTo,
      numArgs: 2,
      variableArgs: false
    };
    t['c'] = {
      id: _util.OPS.curveTo,
      numArgs: 6,
      variableArgs: false
    };
    t['v'] = {
      id: _util.OPS.curveTo2,
      numArgs: 4,
      variableArgs: false
    };
    t['y'] = {
      id: _util.OPS.curveTo3,
      numArgs: 4,
      variableArgs: false
    };
    t['h'] = {
      id: _util.OPS.closePath,
      numArgs: 0,
      variableArgs: false
    };
    t['re'] = {
      id: _util.OPS.rectangle,
      numArgs: 4,
      variableArgs: false
    };
    t['S'] = {
      id: _util.OPS.stroke,
      numArgs: 0,
      variableArgs: false
    };
    t['s'] = {
      id: _util.OPS.closeStroke,
      numArgs: 0,
      variableArgs: false
    };
    t['f'] = {
      id: _util.OPS.fill,
      numArgs: 0,
      variableArgs: false
    };
    t['F'] = {
      id: _util.OPS.fill,
      numArgs: 0,
      variableArgs: false
    };
    t['f*'] = {
      id: _util.OPS.eoFill,
      numArgs: 0,
      variableArgs: false
    };
    t['B'] = {
      id: _util.OPS.fillStroke,
      numArgs: 0,
      variableArgs: false
    };
    t['B*'] = {
      id: _util.OPS.eoFillStroke,
      numArgs: 0,
      variableArgs: false
    };
    t['b'] = {
      id: _util.OPS.closeFillStroke,
      numArgs: 0,
      variableArgs: false
    };
    t['b*'] = {
      id: _util.OPS.closeEOFillStroke,
      numArgs: 0,
      variableArgs: false
    };
    t['n'] = {
      id: _util.OPS.endPath,
      numArgs: 0,
      variableArgs: false
    };
    t['W'] = {
      id: _util.OPS.clip,
      numArgs: 0,
      variableArgs: false
    };
    t['W*'] = {
      id: _util.OPS.eoClip,
      numArgs: 0,
      variableArgs: false
    };
    t['BT'] = {
      id: _util.OPS.beginText,
      numArgs: 0,
      variableArgs: false
    };
    t['ET'] = {
      id: _util.OPS.endText,
      numArgs: 0,
      variableArgs: false
    };
    t['Tc'] = {
      id: _util.OPS.setCharSpacing,
      numArgs: 1,
      variableArgs: false
    };
    t['Tw'] = {
      id: _util.OPS.setWordSpacing,
      numArgs: 1,
      variableArgs: false
    };
    t['Tz'] = {
      id: _util.OPS.setHScale,
      numArgs: 1,
      variableArgs: false
    };
    t['TL'] = {
      id: _util.OPS.setLeading,
      numArgs: 1,
      variableArgs: false
    };
    t['Tf'] = {
      id: _util.OPS.setFont,
      numArgs: 2,
      variableArgs: false
    };
    t['Tr'] = {
      id: _util.OPS.setTextRenderingMode,
      numArgs: 1,
      variableArgs: false
    };
    t['Ts'] = {
      id: _util.OPS.setTextRise,
      numArgs: 1,
      variableArgs: false
    };
    t['Td'] = {
      id: _util.OPS.moveText,
      numArgs: 2,
      variableArgs: false
    };
    t['TD'] = {
      id: _util.OPS.setLeadingMoveText,
      numArgs: 2,
      variableArgs: false
    };
    t['Tm'] = {
      id: _util.OPS.setTextMatrix,
      numArgs: 6,
      variableArgs: false
    };
    t['T*'] = {
      id: _util.OPS.nextLine,
      numArgs: 0,
      variableArgs: false
    };
    t['Tj'] = {
      id: _util.OPS.showText,
      numArgs: 1,
      variableArgs: false
    };
    t['TJ'] = {
      id: _util.OPS.showSpacedText,
      numArgs: 1,
      variableArgs: false
    };
    t['\''] = {
      id: _util.OPS.nextLineShowText,
      numArgs: 1,
      variableArgs: false
    };
    t['"'] = {
      id: _util.OPS.nextLineSetSpacingShowText,
      numArgs: 3,
      variableArgs: false
    };
    t['d0'] = {
      id: _util.OPS.setCharWidth,
      numArgs: 2,
      variableArgs: false
    };
    t['d1'] = {
      id: _util.OPS.setCharWidthAndBounds,
      numArgs: 6,
      variableArgs: false
    };
    t['CS'] = {
      id: _util.OPS.setStrokeColorSpace,
      numArgs: 1,
      variableArgs: false
    };
    t['cs'] = {
      id: _util.OPS.setFillColorSpace,
      numArgs: 1,
      variableArgs: false
    };
    t['SC'] = {
      id: _util.OPS.setStrokeColor,
      numArgs: 4,
      variableArgs: true
    };
    t['SCN'] = {
      id: _util.OPS.setStrokeColorN,
      numArgs: 33,
      variableArgs: true
    };
    t['sc'] = {
      id: _util.OPS.setFillColor,
      numArgs: 4,
      variableArgs: true
    };
    t['scn'] = {
      id: _util.OPS.setFillColorN,
      numArgs: 33,
      variableArgs: true
    };
    t['G'] = {
      id: _util.OPS.setStrokeGray,
      numArgs: 1,
      variableArgs: false
    };
    t['g'] = {
      id: _util.OPS.setFillGray,
      numArgs: 1,
      variableArgs: false
    };
    t['RG'] = {
      id: _util.OPS.setStrokeRGBColor,
      numArgs: 3,
      variableArgs: false
    };
    t['rg'] = {
      id: _util.OPS.setFillRGBColor,
      numArgs: 3,
      variableArgs: false
    };
    t['K'] = {
      id: _util.OPS.setStrokeCMYKColor,
      numArgs: 4,
      variableArgs: false
    };
    t['k'] = {
      id: _util.OPS.setFillCMYKColor,
      numArgs: 4,
      variableArgs: false
    };
    t['sh'] = {
      id: _util.OPS.shadingFill,
      numArgs: 1,
      variableArgs: false
    };
    t['BI'] = {
      id: _util.OPS.beginInlineImage,
      numArgs: 0,
      variableArgs: false
    };
    t['ID'] = {
      id: _util.OPS.beginImageData,
      numArgs: 0,
      variableArgs: false
    };
    t['EI'] = {
      id: _util.OPS.endInlineImage,
      numArgs: 1,
      variableArgs: false
    };
    t['Do'] = {
      id: _util.OPS.paintXObject,
      numArgs: 1,
      variableArgs: false
    };
    t['MP'] = {
      id: _util.OPS.markPoint,
      numArgs: 1,
      variableArgs: false
    };
    t['DP'] = {
      id: _util.OPS.markPointProps,
      numArgs: 2,
      variableArgs: false
    };
    t['BMC'] = {
      id: _util.OPS.beginMarkedContent,
      numArgs: 1,
      variableArgs: false
    };
    t['BDC'] = {
      id: _util.OPS.beginMarkedContentProps,
      numArgs: 2,
      variableArgs: false
    };
    t['EMC'] = {
      id: _util.OPS.endMarkedContent,
      numArgs: 0,
      variableArgs: false
    };
    t['BX'] = {
      id: _util.OPS.beginCompat,
      numArgs: 0,
      variableArgs: false
    };
    t['EX'] = {
      id: _util.OPS.endCompat,
      numArgs: 0,
      variableArgs: false
    };
    t['BM'] = null;
    t['BD'] = null;
    t['true'] = null;
    t['fa'] = null;
    t['fal'] = null;
    t['fals'] = null;
    t['false'] = null;
    t['nu'] = null;
    t['nul'] = null;
    t['null'] = null;
  });
  var MAX_INVALID_PATH_OPS = 20;

  function EvaluatorPreprocessor(stream, xref, stateManager) {
    this.opMap = getOPMap();
    this.parser = new _parser.Parser(new _parser.Lexer(stream, this.opMap), false, xref);
    this.stateManager = stateManager;
    this.nonProcessedArgs = [];
    this._numInvalidPathOPS = 0;
  }

  EvaluatorPreprocessor.prototype = {
    get savedStatesDepth() {
      return this.stateManager.stateStack.length;
    },

    read: function EvaluatorPreprocessor_read(operation) {
      var args = operation.args;

      while (true) {
        var obj = this.parser.getObj();

        if ((0, _primitives.isCmd)(obj)) {
          var cmd = obj.cmd;
          var opSpec = this.opMap[cmd];

          if (!opSpec) {
            (0, _util.warn)("Unknown command \"".concat(cmd, "\"."));
            continue;
          }

          var fn = opSpec.id;
          var numArgs = opSpec.numArgs;
          var argsLength = args !== null ? args.length : 0;

          if (!opSpec.variableArgs) {
            if (argsLength !== numArgs) {
              var nonProcessedArgs = this.nonProcessedArgs;

              while (argsLength > numArgs) {
                nonProcessedArgs.push(args.shift());
                argsLength--;
              }

              while (argsLength < numArgs && nonProcessedArgs.length !== 0) {
                if (args === null) {
                  args = [];
                }

                args.unshift(nonProcessedArgs.pop());
                argsLength++;
              }
            }

            if (argsLength < numArgs) {
              var partialMsg = "command ".concat(cmd, ": expected ").concat(numArgs, " args, ") + "but received ".concat(argsLength, " args.");

              if (fn >= _util.OPS.moveTo && fn <= _util.OPS.endPath && ++this._numInvalidPathOPS > MAX_INVALID_PATH_OPS) {
                throw new _util.FormatError("Invalid ".concat(partialMsg));
              }

              (0, _util.warn)("Skipping ".concat(partialMsg));

              if (args !== null) {
                args.length = 0;
              }

              continue;
            }
          } else if (argsLength > numArgs) {
            (0, _util.info)("Command ".concat(cmd, ": expected [0, ").concat(numArgs, "] args, ") + "but received ".concat(argsLength, " args."));
          }

          this.preprocessCommand(fn, args);
          operation.fn = fn;
          operation.args = args;
          return true;
        }

        if ((0, _primitives.isEOF)(obj)) {
          return false;
        }

        if (obj !== null) {
          if (args === null) {
            args = [];
          }

          args.push(obj);

          if (args.length > 33) {
            throw new _util.FormatError('Too many arguments');
          }
        }
      }
    },
    preprocessCommand: function EvaluatorPreprocessor_preprocessCommand(fn, args) {
      switch (fn | 0) {
        case _util.OPS.save:
          this.stateManager.save();
          break;

        case _util.OPS.restore:
          this.stateManager.restore();
          break;

        case _util.OPS.transform:
          this.stateManager.transform(args);
          break;
      }
    }
  };
  return EvaluatorPreprocessor;
}();

/***/ }),
/* 172 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CMapFactory = exports.IdentityCMap = exports.CMap = void 0;

var _util = __w_pdfjs_require__(6);

var _primitives = __w_pdfjs_require__(155);

var _parser = __w_pdfjs_require__(156);

var _stream = __w_pdfjs_require__(157);

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var BUILT_IN_CMAPS = ['Adobe-GB1-UCS2', 'Adobe-CNS1-UCS2', 'Adobe-Japan1-UCS2', 'Adobe-Korea1-UCS2', '78-EUC-H', '78-EUC-V', '78-H', '78-RKSJ-H', '78-RKSJ-V', '78-V', '78ms-RKSJ-H', '78ms-RKSJ-V', '83pv-RKSJ-H', '90ms-RKSJ-H', '90ms-RKSJ-V', '90msp-RKSJ-H', '90msp-RKSJ-V', '90pv-RKSJ-H', '90pv-RKSJ-V', 'Add-H', 'Add-RKSJ-H', 'Add-RKSJ-V', 'Add-V', 'Adobe-CNS1-0', 'Adobe-CNS1-1', 'Adobe-CNS1-2', 'Adobe-CNS1-3', 'Adobe-CNS1-4', 'Adobe-CNS1-5', 'Adobe-CNS1-6', 'Adobe-GB1-0', 'Adobe-GB1-1', 'Adobe-GB1-2', 'Adobe-GB1-3', 'Adobe-GB1-4', 'Adobe-GB1-5', 'Adobe-Japan1-0', 'Adobe-Japan1-1', 'Adobe-Japan1-2', 'Adobe-Japan1-3', 'Adobe-Japan1-4', 'Adobe-Japan1-5', 'Adobe-Japan1-6', 'Adobe-Korea1-0', 'Adobe-Korea1-1', 'Adobe-Korea1-2', 'B5-H', 'B5-V', 'B5pc-H', 'B5pc-V', 'CNS-EUC-H', 'CNS-EUC-V', 'CNS1-H', 'CNS1-V', 'CNS2-H', 'CNS2-V', 'ETHK-B5-H', 'ETHK-B5-V', 'ETen-B5-H', 'ETen-B5-V', 'ETenms-B5-H', 'ETenms-B5-V', 'EUC-H', 'EUC-V', 'Ext-H', 'Ext-RKSJ-H', 'Ext-RKSJ-V', 'Ext-V', 'GB-EUC-H', 'GB-EUC-V', 'GB-H', 'GB-V', 'GBK-EUC-H', 'GBK-EUC-V', 'GBK2K-H', 'GBK2K-V', 'GBKp-EUC-H', 'GBKp-EUC-V', 'GBT-EUC-H', 'GBT-EUC-V', 'GBT-H', 'GBT-V', 'GBTpc-EUC-H', 'GBTpc-EUC-V', 'GBpc-EUC-H', 'GBpc-EUC-V', 'H', 'HKdla-B5-H', 'HKdla-B5-V', 'HKdlb-B5-H', 'HKdlb-B5-V', 'HKgccs-B5-H', 'HKgccs-B5-V', 'HKm314-B5-H', 'HKm314-B5-V', 'HKm471-B5-H', 'HKm471-B5-V', 'HKscs-B5-H', 'HKscs-B5-V', 'Hankaku', 'Hiragana', 'KSC-EUC-H', 'KSC-EUC-V', 'KSC-H', 'KSC-Johab-H', 'KSC-Johab-V', 'KSC-V', 'KSCms-UHC-H', 'KSCms-UHC-HW-H', 'KSCms-UHC-HW-V', 'KSCms-UHC-V', 'KSCpc-EUC-H', 'KSCpc-EUC-V', 'Katakana', 'NWP-H', 'NWP-V', 'RKSJ-H', 'RKSJ-V', 'Roman', 'UniCNS-UCS2-H', 'UniCNS-UCS2-V', 'UniCNS-UTF16-H', 'UniCNS-UTF16-V', 'UniCNS-UTF32-H', 'UniCNS-UTF32-V', 'UniCNS-UTF8-H', 'UniCNS-UTF8-V', 'UniGB-UCS2-H', 'UniGB-UCS2-V', 'UniGB-UTF16-H', 'UniGB-UTF16-V', 'UniGB-UTF32-H', 'UniGB-UTF32-V', 'UniGB-UTF8-H', 'UniGB-UTF8-V', 'UniJIS-UCS2-H', 'UniJIS-UCS2-HW-H', 'UniJIS-UCS2-HW-V', 'UniJIS-UCS2-V', 'UniJIS-UTF16-H', 'UniJIS-UTF16-V', 'UniJIS-UTF32-H', 'UniJIS-UTF32-V', 'UniJIS-UTF8-H', 'UniJIS-UTF8-V', 'UniJIS2004-UTF16-H', 'UniJIS2004-UTF16-V', 'UniJIS2004-UTF32-H', 'UniJIS2004-UTF32-V', 'UniJIS2004-UTF8-H', 'UniJIS2004-UTF8-V', 'UniJISPro-UCS2-HW-V', 'UniJISPro-UCS2-V', 'UniJISPro-UTF8-V', 'UniJISX0213-UTF32-H', 'UniJISX0213-UTF32-V', 'UniJISX02132004-UTF32-H', 'UniJISX02132004-UTF32-V', 'UniKS-UCS2-H', 'UniKS-UCS2-V', 'UniKS-UTF16-H', 'UniKS-UTF16-V', 'UniKS-UTF32-H', 'UniKS-UTF32-V', 'UniKS-UTF8-H', 'UniKS-UTF8-V', 'V', 'WP-Symbol'];

var CMap =
/*#__PURE__*/
function () {
  function CMap() {
    var builtInCMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;

    _classCallCheck(this, CMap);

    this.codespaceRanges = [[], [], [], []];
    this.numCodespaceRanges = 0;
    this._map = [];
    this.name = '';
    this.vertical = false;
    this.useCMap = null;
    this.builtInCMap = builtInCMap;
  }

  _createClass(CMap, [{
    key: "addCodespaceRange",
    value: function addCodespaceRange(n, low, high) {
      this.codespaceRanges[n - 1].push(low, high);
      this.numCodespaceRanges++;
    }
  }, {
    key: "mapCidRange",
    value: function mapCidRange(low, high, dstLow) {
      while (low <= high) {
        this._map[low++] = dstLow++;
      }
    }
  }, {
    key: "mapBfRange",
    value: function mapBfRange(low, high, dstLow) {
      var lastByte = dstLow.length - 1;

      while (low <= high) {
        this._map[low++] = dstLow;
        dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(dstLow.charCodeAt(lastByte) + 1);
      }
    }
  }, {
    key: "mapBfRangeToArray",
    value: function mapBfRangeToArray(low, high, array) {
      var i = 0,
          ii = array.length;

      while (low <= high && i < ii) {
        this._map[low] = array[i++];
        ++low;
      }
    }
  }, {
    key: "mapOne",
    value: function mapOne(src, dst) {
      this._map[src] = dst;
    }
  }, {
    key: "lookup",
    value: function lookup(code) {
      return this._map[code];
    }
  }, {
    key: "contains",
    value: function contains(code) {
      return this._map[code] !== undefined;
    }
  }, {
    key: "forEach",
    value: function forEach(callback) {
      var map = this._map;
      var length = map.length;

      if (length <= 0x10000) {
        for (var i = 0; i < length; i++) {
          if (map[i] !== undefined) {
            callback(i, map[i]);
          }
        }
      } else {
        for (var _i in map) {
          callback(_i, map[_i]);
        }
      }
    }
  }, {
    key: "charCodeOf",
    value: function charCodeOf(value) {
      var map = this._map;

      if (map.length <= 0x10000) {
        return map.indexOf(value);
      }

      for (var charCode in map) {
        if (map[charCode] === value) {
          return charCode | 0;
        }
      }

      return -1;
    }
  }, {
    key: "getMap",
    value: function getMap() {
      return this._map;
    }
  }, {
    key: "readCharCode",
    value: function readCharCode(str, offset, out) {
      var c = 0;
      var codespaceRanges = this.codespaceRanges;

      for (var n = 0, nn = codespaceRanges.length; n < nn; n++) {
        c = (c << 8 | str.charCodeAt(offset + n)) >>> 0;
        var codespaceRange = codespaceRanges[n];

        for (var k = 0, kk = codespaceRange.length; k < kk;) {
          var low = codespaceRange[k++];
          var high = codespaceRange[k++];

          if (c >= low && c <= high) {
            out.charcode = c;
            out.length = n + 1;
            return;
          }
        }
      }

      out.charcode = 0;
      out.length = 1;
    }
  }, {
    key: "length",
    get: function get() {
      return this._map.length;
    }
  }, {
    key: "isIdentityCMap",
    get: function get() {
      if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) {
        return false;
      }

      if (this._map.length !== 0x10000) {
        return false;
      }

      for (var i = 0; i < 0x10000; i++) {
        if (this._map[i] !== i) {
          return false;
        }
      }

      return true;
    }
  }]);

  return CMap;
}();

exports.CMap = CMap;

var IdentityCMap =
/*#__PURE__*/
function (_CMap) {
  _inherits(IdentityCMap, _CMap);

  function IdentityCMap(vertical, n) {
    var _this;

    _classCallCheck(this, IdentityCMap);

    _this = _possibleConstructorReturn(this, _getPrototypeOf(IdentityCMap).call(this));
    _this.vertical = vertical;

    _this.addCodespaceRange(n, 0, 0xffff);

    return _this;
  }

  _createClass(IdentityCMap, [{
    key: "mapCidRange",
    value: function mapCidRange(low, high, dstLow) {
      (0, _util.unreachable)('should not call mapCidRange');
    }
  }, {
    key: "mapBfRange",
    value: function mapBfRange(low, high, dstLow) {
      (0, _util.unreachable)('should not call mapBfRange');
    }
  }, {
    key: "mapBfRangeToArray",
    value: function mapBfRangeToArray(low, high, array) {
      (0, _util.unreachable)('should not call mapBfRangeToArray');
    }
  }, {
    key: "mapOne",
    value: function mapOne(src, dst) {
      (0, _util.unreachable)('should not call mapCidOne');
    }
  }, {
    key: "lookup",
    value: function lookup(code) {
      return Number.isInteger(code) && code <= 0xffff ? code : undefined;
    }
  }, {
    key: "contains",
    value: function contains(code) {
      return Number.isInteger(code) && code <= 0xffff;
    }
  }, {
    key: "forEach",
    value: function forEach(callback) {
      for (var i = 0; i <= 0xffff; i++) {
        callback(i, i);
      }
    }
  }, {
    key: "charCodeOf",
    value: function charCodeOf(value) {
      return Number.isInteger(value) && value <= 0xffff ? value : -1;
    }
  }, {
    key: "getMap",
    value: function getMap() {
      var map = new Array(0x10000);

      for (var i = 0; i <= 0xffff; i++) {
        map[i] = i;
      }

      return map;
    }
  }, {
    key: "length",
    get: function get() {
      return 0x10000;
    }
  }, {
    key: "isIdentityCMap",
    get: function get() {
      (0, _util.unreachable)('should not access .isIdentityCMap');
    }
  }]);

  return IdentityCMap;
}(CMap);

exports.IdentityCMap = IdentityCMap;

var BinaryCMapReader = function BinaryCMapReaderClosure() {
  function hexToInt(a, size) {
    var n = 0;

    for (var i = 0; i <= size; i++) {
      n = n << 8 | a[i];
    }

    return n >>> 0;
  }

  function hexToStr(a, size) {
    if (size === 1) {
      return String.fromCharCode(a[0], a[1]);
    }

    if (size === 3) {
      return String.fromCharCode(a[0], a[1], a[2], a[3]);
    }

    return String.fromCharCode.apply(null, a.subarray(0, size + 1));
  }

  function addHex(a, b, size) {
    var c = 0;

    for (var i = size; i >= 0; i--) {
      c += a[i] + b[i];
      a[i] = c & 255;
      c >>= 8;
    }
  }

  function incHex(a, size) {
    var c = 1;

    for (var i = size; i >= 0 && c > 0; i--) {
      c += a[i];
      a[i] = c & 255;
      c >>= 8;
    }
  }

  var MAX_NUM_SIZE = 16;
  var MAX_ENCODED_NUM_SIZE = 19;

  function BinaryCMapStream(data) {
    this.buffer = data;
    this.pos = 0;
    this.end = data.length;
    this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);
  }

  BinaryCMapStream.prototype = {
    readByte: function readByte() {
      if (this.pos >= this.end) {
        return -1;
      }

      return this.buffer[this.pos++];
    },
    readNumber: function readNumber() {
      var n = 0;
      var last;

      do {
        var b = this.readByte();

        if (b < 0) {
          throw new _util.FormatError('unexpected EOF in bcmap');
        }

        last = !(b & 0x80);
        n = n << 7 | b & 0x7F;
      } while (!last);

      return n;
    },
    readSigned: function readSigned() {
      var n = this.readNumber();
      return n & 1 ? ~(n >>> 1) : n >>> 1;
    },
    readHex: function readHex(num, size) {
      num.set(this.buffer.subarray(this.pos, this.pos + size + 1));
      this.pos += size + 1;
    },
    readHexNumber: function readHexNumber(num, size) {
      var last;
      var stack = this.tmpBuf,
          sp = 0;

      do {
        var b = this.readByte();

        if (b < 0) {
          throw new _util.FormatError('unexpected EOF in bcmap');
        }

        last = !(b & 0x80);
        stack[sp++] = b & 0x7F;
      } while (!last);

      var i = size,
          buffer = 0,
          bufferSize = 0;

      while (i >= 0) {
        while (bufferSize < 8 && stack.length > 0) {
          buffer = stack[--sp] << bufferSize | buffer;
          bufferSize += 7;
        }

        num[i] = buffer & 255;
        i--;
        buffer >>= 8;
        bufferSize -= 8;
      }
    },
    readHexSigned: function readHexSigned(num, size) {
      this.readHexNumber(num, size);
      var sign = num[size] & 1 ? 255 : 0;
      var c = 0;

      for (var i = 0; i <= size; i++) {
        c = (c & 1) << 8 | num[i];
        num[i] = c >> 1 ^ sign;
      }
    },
    readString: function readString() {
      var len = this.readNumber();
      var s = '';

      for (var i = 0; i < len; i++) {
        s += String.fromCharCode(this.readNumber());
      }

      return s;
    }
  };

  function processBinaryCMap(data, cMap, extend) {
    return new Promise(function (resolve, reject) {
      var stream = new BinaryCMapStream(data);
      var header = stream.readByte();
      cMap.vertical = !!(header & 1);
      var useCMap = null;
      var start = new Uint8Array(MAX_NUM_SIZE);
      var end = new Uint8Array(MAX_NUM_SIZE);
      var char = new Uint8Array(MAX_NUM_SIZE);
      var charCode = new Uint8Array(MAX_NUM_SIZE);
      var tmp = new Uint8Array(MAX_NUM_SIZE);
      var code;
      var b;

      while ((b = stream.readByte()) >= 0) {
        var type = b >> 5;

        if (type === 7) {
          switch (b & 0x1F) {
            case 0:
              stream.readString();
              break;

            case 1:
              useCMap = stream.readString();
              break;
          }

          continue;
        }

        var sequence = !!(b & 0x10);
        var dataSize = b & 15;

        if (dataSize + 1 > MAX_NUM_SIZE) {
          throw new Error('processBinaryCMap: Invalid dataSize.');
        }

        var ucs2DataSize = 1;
        var subitemsCount = stream.readNumber();
        var i;

        switch (type) {
          case 0:
            stream.readHex(start, dataSize);
            stream.readHexNumber(end, dataSize);
            addHex(end, start, dataSize);
            cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));

            for (i = 1; i < subitemsCount; i++) {
              incHex(end, dataSize);
              stream.readHexNumber(start, dataSize);
              addHex(start, end, dataSize);
              stream.readHexNumber(end, dataSize);
              addHex(end, start, dataSize);
              cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));
            }

            break;

          case 1:
            stream.readHex(start, dataSize);
            stream.readHexNumber(end, dataSize);
            addHex(end, start, dataSize);
            stream.readNumber();

            for (i = 1; i < subitemsCount; i++) {
              incHex(end, dataSize);
              stream.readHexNumber(start, dataSize);
              addHex(start, end, dataSize);
              stream.readHexNumber(end, dataSize);
              addHex(end, start, dataSize);
              stream.readNumber();
            }

            break;

          case 2:
            stream.readHex(char, dataSize);
            code = stream.readNumber();
            cMap.mapOne(hexToInt(char, dataSize), code);

            for (i = 1; i < subitemsCount; i++) {
              incHex(char, dataSize);

              if (!sequence) {
                stream.readHexNumber(tmp, dataSize);
                addHex(char, tmp, dataSize);
              }

              code = stream.readSigned() + (code + 1);
              cMap.mapOne(hexToInt(char, dataSize), code);
            }

            break;

          case 3:
            stream.readHex(start, dataSize);
            stream.readHexNumber(end, dataSize);
            addHex(end, start, dataSize);
            code = stream.readNumber();
            cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);

            for (i = 1; i < subitemsCount; i++) {
              incHex(end, dataSize);

              if (!sequence) {
                stream.readHexNumber(start, dataSize);
                addHex(start, end, dataSize);
              } else {
                start.set(end);
              }

              stream.readHexNumber(end, dataSize);
              addHex(end, start, dataSize);
              code = stream.readNumber();
              cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);
            }

            break;

          case 4:
            stream.readHex(char, ucs2DataSize);
            stream.readHex(charCode, dataSize);
            cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));

            for (i = 1; i < subitemsCount; i++) {
              incHex(char, ucs2DataSize);

              if (!sequence) {
                stream.readHexNumber(tmp, ucs2DataSize);
                addHex(char, tmp, ucs2DataSize);
              }

              incHex(charCode, dataSize);
              stream.readHexSigned(tmp, dataSize);
              addHex(charCode, tmp, dataSize);
              cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));
            }

            break;

          case 5:
            stream.readHex(start, ucs2DataSize);
            stream.readHexNumber(end, ucs2DataSize);
            addHex(end, start, ucs2DataSize);
            stream.readHex(charCode, dataSize);
            cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));

            for (i = 1; i < subitemsCount; i++) {
              incHex(end, ucs2DataSize);

              if (!sequence) {
                stream.readHexNumber(start, ucs2DataSize);
                addHex(start, end, ucs2DataSize);
              } else {
                start.set(end);
              }

              stream.readHexNumber(end, ucs2DataSize);
              addHex(end, start, ucs2DataSize);
              stream.readHex(charCode, dataSize);
              cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));
            }

            break;

          default:
            reject(new Error('processBinaryCMap: Unknown type: ' + type));
            return;
        }
      }

      if (useCMap) {
        resolve(extend(useCMap));
        return;
      }

      resolve(cMap);
    });
  }

  function BinaryCMapReader() {}

  BinaryCMapReader.prototype = {
    process: processBinaryCMap
  };
  return BinaryCMapReader;
}();

var CMapFactory = function CMapFactoryClosure() {
  function strToInt(str) {
    var a = 0;

    for (var i = 0; i < str.length; i++) {
      a = a << 8 | str.charCodeAt(i);
    }

    return a >>> 0;
  }

  function expectString(obj) {
    if (!(0, _util.isString)(obj)) {
      throw new _util.FormatError('Malformed CMap: expected string.');
    }
  }

  function expectInt(obj) {
    if (!Number.isInteger(obj)) {
      throw new _util.FormatError('Malformed CMap: expected int.');
    }
  }

  function parseBfChar(cMap, lexer) {
    while (true) {
      var obj = lexer.getObj();

      if ((0, _primitives.isEOF)(obj)) {
        break;
      }

      if ((0, _primitives.isCmd)(obj, 'endbfchar')) {
        return;
      }

      expectString(obj);
      var src = strToInt(obj);
      obj = lexer.getObj();
      expectString(obj);
      var dst = obj;
      cMap.mapOne(src, dst);
    }
  }

  function parseBfRange(cMap, lexer) {
    while (true) {
      var obj = lexer.getObj();

      if ((0, _primitives.isEOF)(obj)) {
        break;
      }

      if ((0, _primitives.isCmd)(obj, 'endbfrange')) {
        return;
      }

      expectString(obj);
      var low = strToInt(obj);
      obj = lexer.getObj();
      expectString(obj);
      var high = strToInt(obj);
      obj = lexer.getObj();

      if (Number.isInteger(obj) || (0, _util.isString)(obj)) {
        var dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj;
        cMap.mapBfRange(low, high, dstLow);
      } else if ((0, _primitives.isCmd)(obj, '[')) {
        obj = lexer.getObj();
        var array = [];

        while (!(0, _primitives.isCmd)(obj, ']') && !(0, _primitives.isEOF)(obj)) {
          array.push(obj);
          obj = lexer.getObj();
        }

        cMap.mapBfRangeToArray(low, high, array);
      } else {
        break;
      }
    }

    throw new _util.FormatError('Invalid bf range.');
  }

  function parseCidChar(cMap, lexer) {
    while (true) {
      var obj = lexer.getObj();

      if ((0, _primitives.isEOF)(obj)) {
        break;
      }

      if ((0, _primitives.isCmd)(obj, 'endcidchar')) {
        return;
      }

      expectString(obj);
      var src = strToInt(obj);
      obj = lexer.getObj();
      expectInt(obj);
      var dst = obj;
      cMap.mapOne(src, dst);
    }
  }

  function parseCidRange(cMap, lexer) {
    while (true) {
      var obj = lexer.getObj();

      if ((0, _primitives.isEOF)(obj)) {
        break;
      }

      if ((0, _primitives.isCmd)(obj, 'endcidrange')) {
        return;
      }

      expectString(obj);
      var low = strToInt(obj);
      obj = lexer.getObj();
      expectString(obj);
      var high = strToInt(obj);
      obj = lexer.getObj();
      expectInt(obj);
      var dstLow = obj;
      cMap.mapCidRange(low, high, dstLow);
    }
  }

  function parseCodespaceRange(cMap, lexer) {
    while (true) {
      var obj = lexer.getObj();

      if ((0, _primitives.isEOF)(obj)) {
        break;
      }

      if ((0, _primitives.isCmd)(obj, 'endcodespacerange')) {
        return;
      }

      if (!(0, _util.isString)(obj)) {
        break;
      }

      var low = strToInt(obj);
      obj = lexer.getObj();

      if (!(0, _util.isString)(obj)) {
        break;
      }

      var high = strToInt(obj);
      cMap.addCodespaceRange(obj.length, low, high);
    }

    throw new _util.FormatError('Invalid codespace range.');
  }

  function parseWMode(cMap, lexer) {
    var obj = lexer.getObj();

    if (Number.isInteger(obj)) {
      cMap.vertical = !!obj;
    }
  }

  function parseCMapName(cMap, lexer) {
    var obj = lexer.getObj();

    if ((0, _primitives.isName)(obj) && (0, _util.isString)(obj.name)) {
      cMap.name = obj.name;
    }
  }

  function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) {
    var previous;
    var embeddedUseCMap;

    objLoop: while (true) {
      try {
        var obj = lexer.getObj();

        if ((0, _primitives.isEOF)(obj)) {
          break;
        } else if ((0, _primitives.isName)(obj)) {
          if (obj.name === 'WMode') {
            parseWMode(cMap, lexer);
          } else if (obj.name === 'CMapName') {
            parseCMapName(cMap, lexer);
          }

          previous = obj;
        } else if ((0, _primitives.isCmd)(obj)) {
          switch (obj.cmd) {
            case 'endcmap':
              break objLoop;

            case 'usecmap':
              if ((0, _primitives.isName)(previous)) {
                embeddedUseCMap = previous.name;
              }

              break;

            case 'begincodespacerange':
              parseCodespaceRange(cMap, lexer);
              break;

            case 'beginbfchar':
              parseBfChar(cMap, lexer);
              break;

            case 'begincidchar':
              parseCidChar(cMap, lexer);
              break;

            case 'beginbfrange':
              parseBfRange(cMap, lexer);
              break;

            case 'begincidrange':
              parseCidRange(cMap, lexer);
              break;
          }
        }
      } catch (ex) {
        if (ex instanceof _util.MissingDataException) {
          throw ex;
        }

        (0, _util.warn)('Invalid cMap data: ' + ex);
        continue;
      }
    }

    if (!useCMap && embeddedUseCMap) {
      useCMap = embeddedUseCMap;
    }

    if (useCMap) {
      return extendCMap(cMap, fetchBuiltInCMap, useCMap);
    }

    return Promise.resolve(cMap);
  }

  function extendCMap(cMap, fetchBuiltInCMap, useCMap) {
    return createBuiltInCMap(useCMap, fetchBuiltInCMap).then(function (newCMap) {
      cMap.useCMap = newCMap;

      if (cMap.numCodespaceRanges === 0) {
        var useCodespaceRanges = cMap.useCMap.codespaceRanges;

        for (var i = 0; i < useCodespaceRanges.length; i++) {
          cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();
        }

        cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;
      }

      cMap.useCMap.forEach(function (key, value) {
        if (!cMap.contains(key)) {
          cMap.mapOne(key, cMap.useCMap.lookup(key));
        }
      });
      return cMap;
    });
  }

  function createBuiltInCMap(name, fetchBuiltInCMap) {
    if (name === 'Identity-H') {
      return Promise.resolve(new IdentityCMap(false, 2));
    } else if (name === 'Identity-V') {
      return Promise.resolve(new IdentityCMap(true, 2));
    }

    if (!BUILT_IN_CMAPS.includes(name)) {
      return Promise.reject(new Error('Unknown CMap name: ' + name));
    }

    if (!fetchBuiltInCMap) {
      return Promise.reject(new Error('Built-in CMap parameters are not provided.'));
    }

    return fetchBuiltInCMap(name).then(function (data) {
      var cMapData = data.cMapData,
          compressionType = data.compressionType;
      var cMap = new CMap(true);

      if (compressionType === _util.CMapCompressionType.BINARY) {
        return new BinaryCMapReader().process(cMapData, cMap, function (useCMap) {
          return extendCMap(cMap, fetchBuiltInCMap, useCMap);
        });
      }

      if (compressionType === _util.CMapCompressionType.NONE) {
        var lexer = new _parser.Lexer(new _stream.Stream(cMapData));
        return parseCMap(cMap, lexer, fetchBuiltInCMap, null);
      }

      return Promise.reject(new Error('TODO: Only BINARY/NONE CMap compression is currently supported.'));
    });
  }

  return {
    create: function create(params) {
      var encoding = params.encoding;
      var fetchBuiltInCMap = params.fetchBuiltInCMap;
      var useCMap = params.useCMap;

      if ((0, _primitives.isName)(encoding)) {
        return createBuiltInCMap(encoding.name, fetchBuiltInCMap);
      } else if ((0, _primitives.isStream)(encoding)) {
        var cMap = new CMap();
        var lexer = new _parser.Lexer(encoding);
        return parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap).then(function (parsedCMap) {
          if (parsedCMap.isIdentityCMap) {
            return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap);
          }

          return parsedCMap;
        });
      }

      return Promise.reject(new Error('Encoding required.'));
    }
  };
}();

exports.CMapFactory = CMapFactory;

/***/ }),
/* 173 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getFontType = getFontType;
exports.IdentityToUnicodeMap = exports.ToUnicodeMap = exports.FontFlags = exports.Font = exports.ErrorFont = exports.SEAC_ANALYSIS_ENABLED = void 0;

var _util = __w_pdfjs_require__(6);

var _cff_parser = __w_pdfjs_require__(174);

var _glyphlist = __w_pdfjs_require__(177);

var _encodings = __w_pdfjs_require__(176);

var _standard_fonts = __w_pdfjs_require__(178);

var _unicode = __w_pdfjs_require__(179);

var _font_renderer = __w_pdfjs_require__(180);

var _cmap = __w_pdfjs_require__(172);

var _stream = __w_pdfjs_require__(157);

var _type1_parser = __w_pdfjs_require__(181);

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

var PRIVATE_USE_AREAS = [[0xE000, 0xF8FF], [0x100000, 0x10FFFD]];
var PDF_GLYPH_SPACE_UNITS = 1000;
var SEAC_ANALYSIS_ENABLED = true;
exports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED;
var FontFlags = {
  FixedPitch: 1,
  Serif: 2,
  Symbolic: 4,
  Script: 8,
  Nonsymbolic: 32,
  Italic: 64,
  AllCap: 65536,
  SmallCap: 131072,
  ForceBold: 262144
};
exports.FontFlags = FontFlags;
var MacStandardGlyphOrdering = ['.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter', 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];

function adjustWidths(properties) {
  if (!properties.fontMatrix) {
    return;
  }

  if (properties.fontMatrix[0] === _util.FONT_IDENTITY_MATRIX[0]) {
    return;
  }

  var scale = 0.001 / properties.fontMatrix[0];
  var glyphsWidths = properties.widths;

  for (var glyph in glyphsWidths) {
    glyphsWidths[glyph] *= scale;
  }

  properties.defaultWidth *= scale;
}

function adjustToUnicode(properties, builtInEncoding) {
  if (properties.hasIncludedToUnicodeMap) {
    return;
  }

  if (properties.hasEncoding) {
    return;
  }

  if (builtInEncoding === properties.defaultEncoding) {
    return;
  }

  if (properties.toUnicode instanceof IdentityToUnicodeMap) {
    return;
  }

  var toUnicode = [],
      glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();

  for (var charCode in builtInEncoding) {
    var glyphName = builtInEncoding[charCode];
    var unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);

    if (unicode !== -1) {
      toUnicode[charCode] = String.fromCharCode(unicode);
    }
  }

  properties.toUnicode.amend(toUnicode);
}

function getFontType(type, subtype) {
  switch (type) {
    case 'Type1':
      return subtype === 'Type1C' ? _util.FontType.TYPE1C : _util.FontType.TYPE1;

    case 'CIDFontType0':
      return subtype === 'CIDFontType0C' ? _util.FontType.CIDFONTTYPE0C : _util.FontType.CIDFONTTYPE0;

    case 'OpenType':
      return _util.FontType.OPENTYPE;

    case 'TrueType':
      return _util.FontType.TRUETYPE;

    case 'CIDFontType2':
      return _util.FontType.CIDFONTTYPE2;

    case 'MMType1':
      return _util.FontType.MMTYPE1;

    case 'Type0':
      return _util.FontType.TYPE0;

    default:
      return _util.FontType.UNKNOWN;
  }
}

function recoverGlyphName(name, glyphsUnicodeMap) {
  if (glyphsUnicodeMap[name] !== undefined) {
    return name;
  }

  var unicode = (0, _unicode.getUnicodeForGlyph)(name, glyphsUnicodeMap);

  if (unicode !== -1) {
    for (var key in glyphsUnicodeMap) {
      if (glyphsUnicodeMap[key] === unicode) {
        return key;
      }
    }
  }

  (0, _util.info)('Unable to recover a standard glyph name for: ' + name);
  return name;
}

var Glyph = function GlyphClosure() {
  function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) {
    this.fontChar = fontChar;
    this.unicode = unicode;
    this.accent = accent;
    this.width = width;
    this.vmetric = vmetric;
    this.operatorListId = operatorListId;
    this.isSpace = isSpace;
    this.isInFont = isInFont;
  }

  Glyph.prototype.matchesForCache = function (fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) {
    return this.fontChar === fontChar && this.unicode === unicode && this.accent === accent && this.width === width && this.vmetric === vmetric && this.operatorListId === operatorListId && this.isSpace === isSpace && this.isInFont === isInFont;
  };

  return Glyph;
}();

var ToUnicodeMap = function ToUnicodeMapClosure() {
  function ToUnicodeMap() {
    var cmap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
    this._map = cmap;
  }

  ToUnicodeMap.prototype = {
    get length() {
      return this._map.length;
    },

    forEach: function forEach(callback) {
      for (var charCode in this._map) {
        callback(charCode, this._map[charCode].charCodeAt(0));
      }
    },
    has: function has(i) {
      return this._map[i] !== undefined;
    },
    get: function get(i) {
      return this._map[i];
    },
    charCodeOf: function charCodeOf(value) {
      var map = this._map;

      if (map.length <= 0x10000) {
        return map.indexOf(value);
      }

      for (var charCode in map) {
        if (map[charCode] === value) {
          return charCode | 0;
        }
      }

      return -1;
    },
    amend: function amend(map) {
      for (var charCode in map) {
        this._map[charCode] = map[charCode];
      }
    }
  };
  return ToUnicodeMap;
}();

exports.ToUnicodeMap = ToUnicodeMap;

var IdentityToUnicodeMap = function IdentityToUnicodeMapClosure() {
  function IdentityToUnicodeMap(firstChar, lastChar) {
    this.firstChar = firstChar;
    this.lastChar = lastChar;
  }

  IdentityToUnicodeMap.prototype = {
    get length() {
      return this.lastChar + 1 - this.firstChar;
    },

    forEach: function forEach(callback) {
      for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) {
        callback(i, i);
      }
    },
    has: function has(i) {
      return this.firstChar <= i && i <= this.lastChar;
    },
    get: function get(i) {
      if (this.firstChar <= i && i <= this.lastChar) {
        return String.fromCharCode(i);
      }

      return undefined;
    },
    charCodeOf: function charCodeOf(v) {
      return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar ? v : -1;
    },
    amend: function amend(map) {
      (0, _util.unreachable)('Should not call amend()');
    }
  };
  return IdentityToUnicodeMap;
}();

exports.IdentityToUnicodeMap = IdentityToUnicodeMap;

var OpenTypeFileBuilder = function OpenTypeFileBuilderClosure() {
  function writeInt16(dest, offset, num) {
    dest[offset] = num >> 8 & 0xFF;
    dest[offset + 1] = num & 0xFF;
  }

  function writeInt32(dest, offset, num) {
    dest[offset] = num >> 24 & 0xFF;
    dest[offset + 1] = num >> 16 & 0xFF;
    dest[offset + 2] = num >> 8 & 0xFF;
    dest[offset + 3] = num & 0xFF;
  }

  function writeData(dest, offset, data) {
    var i, ii;

    if (data instanceof Uint8Array) {
      dest.set(data, offset);
    } else if (typeof data === 'string') {
      for (i = 0, ii = data.length; i < ii; i++) {
        dest[offset++] = data.charCodeAt(i) & 0xFF;
      }
    } else {
      for (i = 0, ii = data.length; i < ii; i++) {
        dest[offset++] = data[i] & 0xFF;
      }
    }
  }

  function OpenTypeFileBuilder(sfnt) {
    this.sfnt = sfnt;
    this.tables = Object.create(null);
  }

  OpenTypeFileBuilder.getSearchParams = function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) {
    var maxPower2 = 1,
        log2 = 0;

    while ((maxPower2 ^ entriesCount) > maxPower2) {
      maxPower2 <<= 1;
      log2++;
    }

    var searchRange = maxPower2 * entrySize;
    return {
      range: searchRange,
      entry: log2,
      rangeShift: entrySize * entriesCount - searchRange
    };
  };

  var OTF_HEADER_SIZE = 12;
  var OTF_TABLE_ENTRY_SIZE = 16;
  OpenTypeFileBuilder.prototype = {
    toArray: function OpenTypeFileBuilder_toArray() {
      var sfnt = this.sfnt;
      var tables = this.tables;
      var tablesNames = Object.keys(tables);
      tablesNames.sort();
      var numTables = tablesNames.length;
      var i, j, jj, table, tableName;
      var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;
      var tableOffsets = [offset];

      for (i = 0; i < numTables; i++) {
        table = tables[tablesNames[i]];
        var paddedLength = (table.length + 3 & ~3) >>> 0;
        offset += paddedLength;
        tableOffsets.push(offset);
      }

      var file = new Uint8Array(offset);

      for (i = 0; i < numTables; i++) {
        table = tables[tablesNames[i]];
        writeData(file, tableOffsets[i], table);
      }

      if (sfnt === 'true') {
        sfnt = (0, _util.string32)(0x00010000);
      }

      file[0] = sfnt.charCodeAt(0) & 0xFF;
      file[1] = sfnt.charCodeAt(1) & 0xFF;
      file[2] = sfnt.charCodeAt(2) & 0xFF;
      file[3] = sfnt.charCodeAt(3) & 0xFF;
      writeInt16(file, 4, numTables);
      var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);
      writeInt16(file, 6, searchParams.range);
      writeInt16(file, 8, searchParams.entry);
      writeInt16(file, 10, searchParams.rangeShift);
      offset = OTF_HEADER_SIZE;

      for (i = 0; i < numTables; i++) {
        tableName = tablesNames[i];
        file[offset] = tableName.charCodeAt(0) & 0xFF;
        file[offset + 1] = tableName.charCodeAt(1) & 0xFF;
        file[offset + 2] = tableName.charCodeAt(2) & 0xFF;
        file[offset + 3] = tableName.charCodeAt(3) & 0xFF;
        var checksum = 0;

        for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {
          var quad = (0, _util.readUint32)(file, j);
          checksum = checksum + quad >>> 0;
        }

        writeInt32(file, offset + 4, checksum);
        writeInt32(file, offset + 8, tableOffsets[i]);
        writeInt32(file, offset + 12, tables[tableName].length);
        offset += OTF_TABLE_ENTRY_SIZE;
      }

      return file;
    },
    addTable: function OpenTypeFileBuilder_addTable(tag, data) {
      if (tag in this.tables) {
        throw new Error('Table ' + tag + ' already exists');
      }

      this.tables[tag] = data;
    }
  };
  return OpenTypeFileBuilder;
}();

var Font = function FontClosure() {
  function Font(name, file, properties) {
    var charCode;
    this.name = name;
    this.loadedName = properties.loadedName;
    this.isType3Font = properties.isType3Font;
    this.sizes = [];
    this.missingFile = false;
    this.glyphCache = Object.create(null);
    this.isSerifFont = !!(properties.flags & FontFlags.Serif);
    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
    this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);
    var type = properties.type;
    var subtype = properties.subtype;
    this.type = type;
    this.subtype = subtype;
    this.fallbackName = this.isMonospace ? 'monospace' : this.isSerifFont ? 'serif' : 'sans-serif';
    this.differences = properties.differences;
    this.widths = properties.widths;
    this.defaultWidth = properties.defaultWidth;
    this.composite = properties.composite;
    this.wideChars = properties.wideChars;
    this.cMap = properties.cMap;
    this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;
    this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;
    this.fontMatrix = properties.fontMatrix;
    this.bbox = properties.bbox;
    this.defaultEncoding = properties.defaultEncoding;
    this.toUnicode = properties.toUnicode;
    this.fallbackToUnicode = properties.fallbackToUnicode || new ToUnicodeMap();
    this.toFontChar = [];

    if (properties.type === 'Type3') {
      for (charCode = 0; charCode < 256; charCode++) {
        this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode];
      }

      this.fontType = _util.FontType.TYPE3;
      return;
    }

    this.cidEncoding = properties.cidEncoding;
    this.vertical = properties.vertical;

    if (this.vertical) {
      this.vmetrics = properties.vmetrics;
      this.defaultVMetrics = properties.defaultVMetrics;
    }

    if (!file || file.isEmpty) {
      if (file) {
        (0, _util.warn)('Font file is empty in "' + name + '" (' + this.loadedName + ')');
      }

      this.fallbackToSystemFont();
      return;
    }

    var _getFontFileType = getFontFileType(file, properties);

    var _getFontFileType2 = _slicedToArray(_getFontFileType, 2);

    type = _getFontFileType2[0];
    subtype = _getFontFileType2[1];

    if (type !== this.type || subtype !== this.subtype) {
      (0, _util.info)('Inconsistent font file Type/SubType, expected: ' + "".concat(this.type, "/").concat(this.subtype, " but found: ").concat(type, "/").concat(subtype, "."));
    }

    try {
      var data;

      switch (type) {
        case 'MMType1':
          (0, _util.info)('MMType1 font (' + name + '), falling back to Type1.');

        case 'Type1':
        case 'CIDFontType0':
          this.mimetype = 'font/opentype';
          var cff = subtype === 'Type1C' || subtype === 'CIDFontType0C' ? new CFFFont(file, properties) : new Type1Font(name, file, properties);
          adjustWidths(properties);
          data = this.convert(name, cff, properties);
          break;

        case 'OpenType':
        case 'TrueType':
        case 'CIDFontType2':
          this.mimetype = 'font/opentype';
          data = this.checkAndRepair(name, file, properties);

          if (this.isOpenType) {
            adjustWidths(properties);
            type = 'OpenType';
          }

          break;

        default:
          throw new _util.FormatError("Font ".concat(type, " is not supported"));
      }
    } catch (e) {
      (0, _util.warn)(e);
      this.fallbackToSystemFont();
      return;
    }

    this.data = data;
    this.fontType = getFontType(type, subtype);
    this.fontMatrix = properties.fontMatrix;
    this.widths = properties.widths;
    this.defaultWidth = properties.defaultWidth;
    this.toUnicode = properties.toUnicode;
    this.encoding = properties.baseEncoding;
    this.seacMap = properties.seacMap;
  }

  Font.getFontID = function () {
    var ID = 1;
    return function Font_getFontID() {
      return String(ID++);
    };
  }();

  function int16(b0, b1) {
    return (b0 << 8) + b1;
  }

  function writeSignedInt16(bytes, index, value) {
    bytes[index + 1] = value;
    bytes[index] = value >>> 8;
  }

  function signedInt16(b0, b1) {
    var value = (b0 << 8) + b1;
    return value & 1 << 15 ? value - 0x10000 : value;
  }

  function int32(b0, b1, b2, b3) {
    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
  }

  function string16(value) {
    return String.fromCharCode(value >> 8 & 0xff, value & 0xff);
  }

  function safeString16(value) {
    value = value > 0x7FFF ? 0x7FFF : value < -0x8000 ? -0x8000 : value;
    return String.fromCharCode(value >> 8 & 0xff, value & 0xff);
  }

  function isTrueTypeFile(file) {
    var header = file.peekBytes(4);
    return (0, _util.readUint32)(header, 0) === 0x00010000 || (0, _util.bytesToString)(header) === 'true';
  }

  function isTrueTypeCollectionFile(file) {
    var header = file.peekBytes(4);
    return (0, _util.bytesToString)(header) === 'ttcf';
  }

  function isOpenTypeFile(file) {
    var header = file.peekBytes(4);
    return (0, _util.bytesToString)(header) === 'OTTO';
  }

  function isType1File(file) {
    var header = file.peekBytes(2);

    if (header[0] === 0x25 && header[1] === 0x21) {
      return true;
    }

    if (header[0] === 0x80 && header[1] === 0x01) {
      return true;
    }

    return false;
  }

  function isCFFFile(file) {
    var header = file.peekBytes(4);

    if (header[0] >= 1 && header[3] >= 1 && header[3] <= 4) {
      return true;
    }

    return false;
  }

  function getFontFileType(file, _ref) {
    var type = _ref.type,
        subtype = _ref.subtype,
        composite = _ref.composite;
    var fileType, fileSubtype;

    if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) {
      if (composite) {
        fileType = 'CIDFontType2';
      } else {
        fileType = 'TrueType';
      }
    } else if (isOpenTypeFile(file)) {
      if (composite) {
        fileType = 'CIDFontType2';
      } else {
        fileType = 'OpenType';
      }
    } else if (isType1File(file)) {
      if (composite) {
        fileType = 'CIDFontType0';
      } else {
        fileType = type === 'MMType1' ? 'MMType1' : 'Type1';
      }
    } else if (isCFFFile(file)) {
      if (composite) {
        fileType = 'CIDFontType0';
        fileSubtype = 'CIDFontType0C';
      } else {
        fileType = type === 'MMType1' ? 'MMType1' : 'Type1';
        fileSubtype = 'Type1C';
      }
    } else {
      (0, _util.warn)('getFontFileType: Unable to detect correct font file Type/Subtype.');
      fileType = type;
      fileSubtype = subtype;
    }

    return [fileType, fileSubtype];
  }

  function buildToFontChar(encoding, glyphsUnicodeMap, differences) {
    var toFontChar = [],
        unicode;

    for (var i = 0, ii = encoding.length; i < ii; i++) {
      unicode = (0, _unicode.getUnicodeForGlyph)(encoding[i], glyphsUnicodeMap);

      if (unicode !== -1) {
        toFontChar[i] = unicode;
      }
    }

    for (var charCode in differences) {
      unicode = (0, _unicode.getUnicodeForGlyph)(differences[charCode], glyphsUnicodeMap);

      if (unicode !== -1) {
        toFontChar[+charCode] = unicode;
      }
    }

    return toFontChar;
  }

  function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId) {
    var newMap = Object.create(null);
    var toFontChar = [];
    var privateUseAreaIndex = 0;
    var nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];
    var privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];

    for (var originalCharCode in charCodeToGlyphId) {
      originalCharCode |= 0;
      var glyphId = charCodeToGlyphId[originalCharCode];

      if (!hasGlyph(glyphId)) {
        continue;
      }

      if (nextAvailableFontCharCode > privateUseOffetEnd) {
        privateUseAreaIndex++;

        if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) {
          (0, _util.warn)('Ran out of space in font private use area.');
          break;
        }

        nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];
        privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];
      }

      var fontCharCode = nextAvailableFontCharCode++;

      if (glyphId === 0) {
        glyphId = newGlyphZeroId;
      }

      newMap[fontCharCode] = glyphId;
      toFontChar[originalCharCode] = fontCharCode;
    }

    return {
      toFontChar: toFontChar,
      charCodeToGlyphId: newMap,
      nextAvailableFontCharCode: nextAvailableFontCharCode
    };
  }

  function getRanges(glyphs, numGlyphs) {
    var codes = [];

    for (var charCode in glyphs) {
      if (glyphs[charCode] >= numGlyphs) {
        continue;
      }

      codes.push({
        fontCharCode: charCode | 0,
        glyphId: glyphs[charCode]
      });
    }

    if (codes.length === 0) {
      codes.push({
        fontCharCode: 0,
        glyphId: 0
      });
    }

    codes.sort(function fontGetRangesSort(a, b) {
      return a.fontCharCode - b.fontCharCode;
    });
    var ranges = [];
    var length = codes.length;

    for (var n = 0; n < length;) {
      var start = codes[n].fontCharCode;
      var codeIndices = [codes[n].glyphId];
      ++n;
      var end = start;

      while (n < length && end + 1 === codes[n].fontCharCode) {
        codeIndices.push(codes[n].glyphId);
        ++end;
        ++n;

        if (end === 0xFFFF) {
          break;
        }
      }

      ranges.push([start, end, codeIndices]);
    }

    return ranges;
  }

  function createCmapTable(glyphs, numGlyphs) {
    var ranges = getRanges(glyphs, numGlyphs);
    var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1;
    var cmap = '\x00\x00' + string16(numTables) + '\x00\x03' + '\x00\x01' + (0, _util.string32)(4 + numTables * 8);
    var i, ii, j, jj;

    for (i = ranges.length - 1; i >= 0; --i) {
      if (ranges[i][0] <= 0xFFFF) {
        break;
      }
    }

    var bmpLength = i + 1;

    if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) {
      ranges[i][1] = 0xFFFE;
    }

    var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0;
    var segCount = bmpLength + trailingRangesCount;
    var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2);
    var startCount = '';
    var endCount = '';
    var idDeltas = '';
    var idRangeOffsets = '';
    var glyphsIds = '';
    var bias = 0;
    var range, start, end, codes;

    for (i = 0, ii = bmpLength; i < ii; i++) {
      range = ranges[i];
      start = range[0];
      end = range[1];
      startCount += string16(start);
      endCount += string16(end);
      codes = range[2];
      var contiguous = true;

      for (j = 1, jj = codes.length; j < jj; ++j) {
        if (codes[j] !== codes[j - 1] + 1) {
          contiguous = false;
          break;
        }
      }

      if (!contiguous) {
        var offset = (segCount - i) * 2 + bias * 2;
        bias += end - start + 1;
        idDeltas += string16(0);
        idRangeOffsets += string16(offset);

        for (j = 0, jj = codes.length; j < jj; ++j) {
          glyphsIds += string16(codes[j]);
        }
      } else {
        var startCode = codes[0];
        idDeltas += string16(startCode - start & 0xFFFF);
        idRangeOffsets += string16(0);
      }
    }

    if (trailingRangesCount > 0) {
      endCount += '\xFF\xFF';
      startCount += '\xFF\xFF';
      idDeltas += '\x00\x01';
      idRangeOffsets += '\x00\x00';
    }

    var format314 = '\x00\x00' + string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + '\x00\x00' + startCount + idDeltas + idRangeOffsets + glyphsIds;
    var format31012 = '';
    var header31012 = '';

    if (numTables > 1) {
      cmap += '\x00\x03' + '\x00\x0A' + (0, _util.string32)(4 + numTables * 8 + 4 + format314.length);
      format31012 = '';

      for (i = 0, ii = ranges.length; i < ii; i++) {
        range = ranges[i];
        start = range[0];
        codes = range[2];
        var code = codes[0];

        for (j = 1, jj = codes.length; j < jj; ++j) {
          if (codes[j] !== codes[j - 1] + 1) {
            end = range[0] + j - 1;
            format31012 += (0, _util.string32)(start) + (0, _util.string32)(end) + (0, _util.string32)(code);
            start = end + 1;
            code = codes[j];
          }
        }

        format31012 += (0, _util.string32)(start) + (0, _util.string32)(range[1]) + (0, _util.string32)(code);
      }

      header31012 = '\x00\x0C' + '\x00\x00' + (0, _util.string32)(format31012.length + 16) + '\x00\x00\x00\x00' + (0, _util.string32)(format31012.length / 12);
    }

    return cmap + '\x00\x04' + string16(format314.length + 4) + format314 + header31012 + format31012;
  }

  function validateOS2Table(os2) {
    var stream = new _stream.Stream(os2.data);
    var version = stream.getUint16();
    stream.getBytes(60);
    var selection = stream.getUint16();

    if (version < 4 && selection & 0x0300) {
      return false;
    }

    var firstChar = stream.getUint16();
    var lastChar = stream.getUint16();

    if (firstChar > lastChar) {
      return false;
    }

    stream.getBytes(6);
    var usWinAscent = stream.getUint16();

    if (usWinAscent === 0) {
      return false;
    }

    os2.data[8] = os2.data[9] = 0;
    return true;
  }

  function createOS2Table(properties, charstrings, override) {
    override = override || {
      unitsPerEm: 0,
      yMax: 0,
      yMin: 0,
      ascent: 0,
      descent: 0
    };
    var ulUnicodeRange1 = 0;
    var ulUnicodeRange2 = 0;
    var ulUnicodeRange3 = 0;
    var ulUnicodeRange4 = 0;
    var firstCharIndex = null;
    var lastCharIndex = 0;

    if (charstrings) {
      for (var code in charstrings) {
        code |= 0;

        if (firstCharIndex > code || !firstCharIndex) {
          firstCharIndex = code;
        }

        if (lastCharIndex < code) {
          lastCharIndex = code;
        }

        var position = (0, _unicode.getUnicodeRangeFor)(code);

        if (position < 32) {
          ulUnicodeRange1 |= 1 << position;
        } else if (position < 64) {
          ulUnicodeRange2 |= 1 << position - 32;
        } else if (position < 96) {
          ulUnicodeRange3 |= 1 << position - 64;
        } else if (position < 123) {
          ulUnicodeRange4 |= 1 << position - 96;
        } else {
          throw new _util.FormatError('Unicode ranges Bits > 123 are reserved for internal usage');
        }
      }

      if (lastCharIndex > 0xFFFF) {
        lastCharIndex = 0xFFFF;
      }
    } else {
      firstCharIndex = 0;
      lastCharIndex = 255;
    }

    var bbox = properties.bbox || [0, 0, 0, 0];
    var unitsPerEm = override.unitsPerEm || 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];
    var scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS;
    var typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3]));
    var typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1]));

    if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {
      typoDescent = -typoDescent;
    }

    var winAscent = override.yMax || typoAscent;
    var winDescent = -override.yMin || -typoDescent;
    return '\x00\x03' + '\x02\x24' + '\x01\xF4' + '\x00\x05' + '\x00\x00' + '\x02\x8A' + '\x02\xBB' + '\x00\x00' + '\x00\x8C' + '\x02\x8A' + '\x02\xBB' + '\x00\x00' + '\x01\xDF' + '\x00\x31' + '\x01\x02' + '\x00\x00' + '\x00\x00\x06' + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + '\x00\x00\x00\x00\x00\x00' + (0, _util.string32)(ulUnicodeRange1) + (0, _util.string32)(ulUnicodeRange2) + (0, _util.string32)(ulUnicodeRange3) + (0, _util.string32)(ulUnicodeRange4) + '\x2A\x32\x31\x2A' + string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + '\x00\x64' + string16(winAscent) + string16(winDescent) + '\x00\x00\x00\x00' + '\x00\x00\x00\x00' + string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || properties.firstChar) + '\x00\x03';
  }

  function createPostTable(properties) {
    var angle = Math.floor(properties.italicAngle * Math.pow(2, 16));
    return '\x00\x03\x00\x00' + (0, _util.string32)(angle) + '\x00\x00' + '\x00\x00' + (0, _util.string32)(properties.fixedPitch) + '\x00\x00\x00\x00' + '\x00\x00\x00\x00' + '\x00\x00\x00\x00' + '\x00\x00\x00\x00';
  }

  function createNameTable(name, proto) {
    if (!proto) {
      proto = [[], []];
    }

    var strings = [proto[0][0] || 'Original licence', proto[0][1] || name, proto[0][2] || 'Unknown', proto[0][3] || 'uniqueID', proto[0][4] || name, proto[0][5] || 'Version 0.11', proto[0][6] || '', proto[0][7] || 'Unknown', proto[0][8] || 'Unknown', proto[0][9] || 'Unknown'];
    var stringsUnicode = [];
    var i, ii, j, jj, str;

    for (i = 0, ii = strings.length; i < ii; i++) {
      str = proto[1][i] || strings[i];
      var strBufUnicode = [];

      for (j = 0, jj = str.length; j < jj; j++) {
        strBufUnicode.push(string16(str.charCodeAt(j)));
      }

      stringsUnicode.push(strBufUnicode.join(''));
    }

    var names = [strings, stringsUnicode];
    var platforms = ['\x00\x01', '\x00\x03'];
    var encodings = ['\x00\x00', '\x00\x01'];
    var languages = ['\x00\x00', '\x04\x09'];
    var namesRecordCount = strings.length * platforms.length;
    var nameTable = '\x00\x00' + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6);
    var strOffset = 0;

    for (i = 0, ii = platforms.length; i < ii; i++) {
      var strs = names[i];

      for (j = 0, jj = strs.length; j < jj; j++) {
        str = strs[j];
        var nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + string16(strOffset);
        nameTable += nameRecord;
        strOffset += str.length;
      }
    }

    nameTable += strings.join('') + stringsUnicode.join('');
    return nameTable;
  }

  Font.prototype = {
    name: null,
    font: null,
    mimetype: null,
    encoding: null,
    disableFontFace: false,

    get renderer() {
      var renderer = _font_renderer.FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED);

      return (0, _util.shadow)(this, 'renderer', renderer);
    },

    exportData: function Font_exportData() {
      var data = {};

      for (var i in this) {
        if (this.hasOwnProperty(i)) {
          data[i] = this[i];
        }
      }

      return data;
    },
    fallbackToSystemFont: function Font_fallbackToSystemFont() {
      var _this = this;

      this.missingFile = true;
      var charCode, unicode;
      var name = this.name;
      var type = this.type;
      var subtype = this.subtype;
      var fontName = name.replace(/[,_]/g, '-');
      var stdFontMap = (0, _standard_fonts.getStdFontMap)(),
          nonStdFontMap = (0, _standard_fonts.getNonStdFontMap)();
      var isStandardFont = !!stdFontMap[fontName] || !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]);
      fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
      this.bold = fontName.search(/bold/gi) !== -1;
      this.italic = fontName.search(/oblique/gi) !== -1 || fontName.search(/italic/gi) !== -1;
      this.black = name.search(/Black/g) !== -1;
      this.remeasure = Object.keys(this.widths).length > 0;

      if (isStandardFont && type === 'CIDFontType2' && this.cidEncoding.startsWith('Identity-')) {
        var GlyphMapForStandardFonts = (0, _standard_fonts.getGlyphMapForStandardFonts)();
        var map = [];

        for (charCode in GlyphMapForStandardFonts) {
          map[+charCode] = GlyphMapForStandardFonts[charCode];
        }

        if (/Arial-?Black/i.test(name)) {
          var SupplementalGlyphMapForArialBlack = (0, _standard_fonts.getSupplementalGlyphMapForArialBlack)();

          for (charCode in SupplementalGlyphMapForArialBlack) {
            map[+charCode] = SupplementalGlyphMapForArialBlack[charCode];
          }
        } else if (/Calibri/i.test(name)) {
          var SupplementalGlyphMapForCalibri = (0, _standard_fonts.getSupplementalGlyphMapForCalibri)();

          for (charCode in SupplementalGlyphMapForCalibri) {
            map[+charCode] = SupplementalGlyphMapForCalibri[charCode];
          }
        }

        var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap;

        if (!isIdentityUnicode) {
          this.toUnicode.forEach(function (charCode, unicodeCharCode) {
            map[+charCode] = unicodeCharCode;
          });
        }

        this.toFontChar = map;
        this.toUnicode = new ToUnicodeMap(map);
      } else if (/Symbol/i.test(fontName)) {
        this.toFontChar = buildToFontChar(_encodings.SymbolSetEncoding, (0, _glyphlist.getGlyphsUnicode)(), this.differences);
      } else if (/Dingbats/i.test(fontName)) {
        if (/Wingdings/i.test(name)) {
          (0, _util.warn)('Non-embedded Wingdings font, falling back to ZapfDingbats.');
        }

        this.toFontChar = buildToFontChar(_encodings.ZapfDingbatsEncoding, (0, _glyphlist.getDingbatsGlyphsUnicode)(), this.differences);
      } else if (isStandardFont) {
        this.toFontChar = buildToFontChar(this.defaultEncoding, (0, _glyphlist.getGlyphsUnicode)(), this.differences);
      } else {
        var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
        this.toUnicode.forEach(function (charCode, unicodeCharCode) {
          if (!_this.composite) {
            var glyphName = _this.differences[charCode] || _this.defaultEncoding[charCode];
            unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);

            if (unicode !== -1) {
              unicodeCharCode = unicode;
            }
          }

          _this.toFontChar[charCode] = unicodeCharCode;
        });
      }

      this.loadedName = fontName.split('-')[0];
      this.fontType = getFontType(type, subtype);
    },
    checkAndRepair: function Font_checkAndRepair(name, font, properties) {
      var VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF '];

      function readTables(file, numTables) {
        var tables = Object.create(null);
        tables['OS/2'] = null;
        tables['cmap'] = null;
        tables['head'] = null;
        tables['hhea'] = null;
        tables['hmtx'] = null;
        tables['maxp'] = null;
        tables['name'] = null;
        tables['post'] = null;

        for (var i = 0; i < numTables; i++) {
          var table = readTableEntry(font);

          if (!VALID_TABLES.includes(table.tag)) {
            continue;
          }

          if (table.length === 0) {
            continue;
          }

          tables[table.tag] = table;
        }

        return tables;
      }

      function readTableEntry(file) {
        var tag = (0, _util.bytesToString)(file.getBytes(4));
        var checksum = file.getInt32() >>> 0;
        var offset = file.getInt32() >>> 0;
        var length = file.getInt32() >>> 0;
        var previousPosition = file.pos;
        file.pos = file.start ? file.start : 0;
        file.skip(offset);
        var data = file.getBytes(length);
        file.pos = previousPosition;

        if (tag === 'head') {
          data[8] = data[9] = data[10] = data[11] = 0;
          data[17] |= 0x20;
        }

        return {
          tag: tag,
          checksum: checksum,
          length: length,
          offset: offset,
          data: data
        };
      }

      function readOpenTypeHeader(ttf) {
        return {
          version: (0, _util.bytesToString)(ttf.getBytes(4)),
          numTables: ttf.getUint16(),
          searchRange: ttf.getUint16(),
          entrySelector: ttf.getUint16(),
          rangeShift: ttf.getUint16()
        };
      }

      function readTrueTypeCollectionHeader(ttc) {
        var ttcTag = (0, _util.bytesToString)(ttc.getBytes(4));
        (0, _util.assert)(ttcTag === 'ttcf', 'Must be a TrueType Collection font.');
        var majorVersion = ttc.getUint16();
        var minorVersion = ttc.getUint16();
        var numFonts = ttc.getInt32() >>> 0;
        var offsetTable = [];

        for (var i = 0; i < numFonts; i++) {
          offsetTable.push(ttc.getInt32() >>> 0);
        }

        var header = {
          ttcTag: ttcTag,
          majorVersion: majorVersion,
          minorVersion: minorVersion,
          numFonts: numFonts,
          offsetTable: offsetTable
        };

        switch (majorVersion) {
          case 1:
            return header;

          case 2:
            header.dsigTag = ttc.getInt32() >>> 0;
            header.dsigLength = ttc.getInt32() >>> 0;
            header.dsigOffset = ttc.getInt32() >>> 0;
            return header;
        }

        throw new _util.FormatError("Invalid TrueType Collection majorVersion: ".concat(majorVersion, "."));
      }

      function readTrueTypeCollectionData(ttc, fontName) {
        var _readTrueTypeCollecti = readTrueTypeCollectionHeader(ttc),
            numFonts = _readTrueTypeCollecti.numFonts,
            offsetTable = _readTrueTypeCollecti.offsetTable;

        for (var i = 0; i < numFonts; i++) {
          ttc.pos = (ttc.start || 0) + offsetTable[i];
          var potentialHeader = readOpenTypeHeader(ttc);
          var potentialTables = readTables(ttc, potentialHeader.numTables);

          if (!potentialTables['name']) {
            throw new _util.FormatError('TrueType Collection font must contain a "name" table.');
          }

          var nameTable = readNameTable(potentialTables['name']);

          for (var j = 0, jj = nameTable.length; j < jj; j++) {
            for (var k = 0, kk = nameTable[j].length; k < kk; k++) {
              var nameEntry = nameTable[j][k];

              if (nameEntry && nameEntry.replace(/\s/g, '') === fontName) {
                return {
                  header: potentialHeader,
                  tables: potentialTables
                };
              }
            }
          }
        }

        throw new _util.FormatError("TrueType Collection does not contain \"".concat(fontName, "\" font."));
      }

      function readCmapTable(cmap, font, isSymbolicFont, hasEncoding) {
        if (!cmap) {
          (0, _util.warn)('No cmap table available.');
          return {
            platformId: -1,
            encodingId: -1,
            mappings: [],
            hasShortCmap: false
          };
        }

        var segment;
        var start = (font.start ? font.start : 0) + cmap.offset;
        font.pos = start;
        font.getUint16();
        var numTables = font.getUint16();
        var potentialTable;
        var canBreak = false;

        for (var i = 0; i < numTables; i++) {
          var platformId = font.getUint16();
          var encodingId = font.getUint16();
          var offset = font.getInt32() >>> 0;
          var useTable = false;

          if (potentialTable && potentialTable.platformId === platformId && potentialTable.encodingId === encodingId) {
            continue;
          }

          if (platformId === 0 && encodingId === 0) {
            useTable = true;
          } else if (platformId === 1 && encodingId === 0) {
            useTable = true;
          } else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) {
            useTable = true;

            if (!isSymbolicFont) {
              canBreak = true;
            }
          } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {
            useTable = true;
            canBreak = true;
          }

          if (useTable) {
            potentialTable = {
              platformId: platformId,
              encodingId: encodingId,
              offset: offset
            };
          }

          if (canBreak) {
            break;
          }
        }

        if (potentialTable) {
          font.pos = start + potentialTable.offset;
        }

        if (!potentialTable || font.peekByte() === -1) {
          (0, _util.warn)('Could not find a preferred cmap table.');
          return {
            platformId: -1,
            encodingId: -1,
            mappings: [],
            hasShortCmap: false
          };
        }

        var format = font.getUint16();
        font.getUint16();
        font.getUint16();
        var hasShortCmap = false;
        var mappings = [];
        var j, glyphId;

        if (format === 0) {
          for (j = 0; j < 256; j++) {
            var index = font.getByte();

            if (!index) {
              continue;
            }

            mappings.push({
              charCode: j,
              glyphId: index
            });
          }

          hasShortCmap = true;
        } else if (format === 4) {
          var segCount = font.getUint16() >> 1;
          font.getBytes(6);
          var segIndex,
              segments = [];

          for (segIndex = 0; segIndex < segCount; segIndex++) {
            segments.push({
              end: font.getUint16()
            });
          }

          font.getUint16();

          for (segIndex = 0; segIndex < segCount; segIndex++) {
            segments[segIndex].start = font.getUint16();
          }

          for (segIndex = 0; segIndex < segCount; segIndex++) {
            segments[segIndex].delta = font.getUint16();
          }

          var offsetsCount = 0;

          for (segIndex = 0; segIndex < segCount; segIndex++) {
            segment = segments[segIndex];
            var rangeOffset = font.getUint16();

            if (!rangeOffset) {
              segment.offsetIndex = -1;
              continue;
            }

            var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
            segment.offsetIndex = offsetIndex;
            offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1);
          }

          var offsets = [];

          for (j = 0; j < offsetsCount; j++) {
            offsets.push(font.getUint16());
          }

          for (segIndex = 0; segIndex < segCount; segIndex++) {
            segment = segments[segIndex];
            start = segment.start;
            var end = segment.end;
            var delta = segment.delta;
            offsetIndex = segment.offsetIndex;

            for (j = start; j <= end; j++) {
              if (j === 0xFFFF) {
                continue;
              }

              glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start];
              glyphId = glyphId + delta & 0xFFFF;
              mappings.push({
                charCode: j,
                glyphId: glyphId
              });
            }
          }
        } else if (format === 6) {
          var firstCode = font.getUint16();
          var entryCount = font.getUint16();

          for (j = 0; j < entryCount; j++) {
            glyphId = font.getUint16();
            var charCode = firstCode + j;
            mappings.push({
              charCode: charCode,
              glyphId: glyphId
            });
          }
        } else {
          (0, _util.warn)('cmap table has unsupported format: ' + format);
          return {
            platformId: -1,
            encodingId: -1,
            mappings: [],
            hasShortCmap: false
          };
        }

        mappings.sort(function (a, b) {
          return a.charCode - b.charCode;
        });

        for (i = 1; i < mappings.length; i++) {
          if (mappings[i - 1].charCode === mappings[i].charCode) {
            mappings.splice(i, 1);
            i--;
          }
        }

        return {
          platformId: potentialTable.platformId,
          encodingId: potentialTable.encodingId,
          mappings: mappings,
          hasShortCmap: hasShortCmap
        };
      }

      function sanitizeMetrics(font, header, metrics, numGlyphs) {
        if (!header) {
          if (metrics) {
            metrics.data = null;
          }

          return;
        }

        font.pos = (font.start ? font.start : 0) + header.offset;
        font.pos += 4;
        font.pos += 2;
        font.pos += 2;
        font.pos += 2;
        font.pos += 2;
        font.pos += 2;
        font.pos += 2;
        font.pos += 2;
        font.pos += 2;
        font.pos += 2;
        font.pos += 2;
        font.pos += 8;
        font.pos += 2;
        var numOfMetrics = font.getUint16();

        if (numOfMetrics > numGlyphs) {
          (0, _util.info)('The numOfMetrics (' + numOfMetrics + ') should not be ' + 'greater than the numGlyphs (' + numGlyphs + ')');
          numOfMetrics = numGlyphs;
          header.data[34] = (numOfMetrics & 0xff00) >> 8;
          header.data[35] = numOfMetrics & 0x00ff;
        }

        var numOfSidebearings = numGlyphs - numOfMetrics;
        var numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1);

        if (numMissing > 0) {
          var entries = new Uint8Array(metrics.length + numMissing * 2);
          entries.set(metrics.data);
          metrics.data = entries;
        }
      }

      function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) {
        var glyphProfile = {
          length: 0,
          sizeOfInstructions: 0
        };

        if (sourceEnd - sourceStart <= 12) {
          return glyphProfile;
        }

        var glyf = source.subarray(sourceStart, sourceEnd);
        var contoursCount = signedInt16(glyf[0], glyf[1]);

        if (contoursCount < 0) {
          contoursCount = -1;
          writeSignedInt16(glyf, 0, contoursCount);
          dest.set(glyf, destStart);
          glyphProfile.length = glyf.length;
          return glyphProfile;
        }

        var i,
            j = 10,
            flagsCount = 0;

        for (i = 0; i < contoursCount; i++) {
          var endPoint = glyf[j] << 8 | glyf[j + 1];
          flagsCount = endPoint + 1;
          j += 2;
        }

        var instructionsStart = j;
        var instructionsLength = glyf[j] << 8 | glyf[j + 1];
        glyphProfile.sizeOfInstructions = instructionsLength;
        j += 2 + instructionsLength;
        var instructionsEnd = j;
        var coordinatesLength = 0;

        for (i = 0; i < flagsCount; i++) {
          var flag = glyf[j++];

          if (flag & 0xC0) {
            glyf[j - 1] = flag & 0x3F;
          }

          var xyLength = (flag & 2 ? 1 : flag & 16 ? 0 : 2) + (flag & 4 ? 1 : flag & 32 ? 0 : 2);
          coordinatesLength += xyLength;

          if (flag & 8) {
            var repeat = glyf[j++];
            i += repeat;
            coordinatesLength += repeat * xyLength;
          }
        }

        if (coordinatesLength === 0) {
          return glyphProfile;
        }

        var glyphDataLength = j + coordinatesLength;

        if (glyphDataLength > glyf.length) {
          return glyphProfile;
        }

        if (!hintsValid && instructionsLength > 0) {
          dest.set(glyf.subarray(0, instructionsStart), destStart);
          dest.set([0, 0], destStart + instructionsStart);
          dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2);
          glyphDataLength -= instructionsLength;

          if (glyf.length - glyphDataLength > 3) {
            glyphDataLength = glyphDataLength + 3 & ~3;
          }

          glyphProfile.length = glyphDataLength;
          return glyphProfile;
        }

        if (glyf.length - glyphDataLength > 3) {
          glyphDataLength = glyphDataLength + 3 & ~3;
          dest.set(glyf.subarray(0, glyphDataLength), destStart);
          glyphProfile.length = glyphDataLength;
          return glyphProfile;
        }

        dest.set(glyf, destStart);
        glyphProfile.length = glyf.length;
        return glyphProfile;
      }

      function sanitizeHead(head, numGlyphs, locaLength) {
        var data = head.data;
        var version = int32(data[0], data[1], data[2], data[3]);

        if (version >> 16 !== 1) {
          (0, _util.info)('Attempting to fix invalid version in head table: ' + version);
          data[0] = 0;
          data[1] = 1;
          data[2] = 0;
          data[3] = 0;
        }

        var indexToLocFormat = int16(data[50], data[51]);

        if (indexToLocFormat < 0 || indexToLocFormat > 1) {
          (0, _util.info)('Attempting to fix invalid indexToLocFormat in head table: ' + indexToLocFormat);
          var numGlyphsPlusOne = numGlyphs + 1;

          if (locaLength === numGlyphsPlusOne << 1) {
            data[50] = 0;
            data[51] = 0;
          } else if (locaLength === numGlyphsPlusOne << 2) {
            data[50] = 0;
            data[51] = 1;
          } else {
            throw new _util.FormatError('Could not fix indexToLocFormat: ' + indexToLocFormat);
          }
        }
      }

      function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions) {
        var itemSize, itemDecode, itemEncode;

        if (isGlyphLocationsLong) {
          itemSize = 4;

          itemDecode = function fontItemDecodeLong(data, offset) {
            return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
          };

          itemEncode = function fontItemEncodeLong(data, offset, value) {
            data[offset] = value >>> 24 & 0xFF;
            data[offset + 1] = value >> 16 & 0xFF;
            data[offset + 2] = value >> 8 & 0xFF;
            data[offset + 3] = value & 0xFF;
          };
        } else {
          itemSize = 2;

          itemDecode = function fontItemDecode(data, offset) {
            return data[offset] << 9 | data[offset + 1] << 1;
          };

          itemEncode = function fontItemEncode(data, offset, value) {
            data[offset] = value >> 9 & 0xFF;
            data[offset + 1] = value >> 1 & 0xFF;
          };
        }

        var numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs;
        var locaData = loca.data;
        var locaDataSize = itemSize * (1 + numGlyphsOut);
        locaData = new Uint8Array(locaDataSize);
        locaData.set(loca.data.subarray(0, locaDataSize));
        loca.data = locaData;
        var oldGlyfData = glyf.data;
        var oldGlyfDataLength = oldGlyfData.length;
        var newGlyfData = new Uint8Array(oldGlyfDataLength);
        var startOffset = itemDecode(locaData, 0);
        var writeOffset = 0;
        var missingGlyphs = Object.create(null);
        itemEncode(locaData, 0, writeOffset);
        var i, j;

        for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
          var endOffset = itemDecode(locaData, j);

          if (endOffset === 0) {
            endOffset = startOffset;
          }

          if (endOffset > oldGlyfDataLength && (oldGlyfDataLength + 3 & ~3) === endOffset) {
            endOffset = oldGlyfDataLength;
          }

          if (endOffset > oldGlyfDataLength) {
            startOffset = endOffset;
          }

          var glyphProfile = sanitizeGlyph(oldGlyfData, startOffset, endOffset, newGlyfData, writeOffset, hintsValid);
          var newLength = glyphProfile.length;

          if (newLength === 0) {
            missingGlyphs[i] = true;
          }

          if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) {
            maxSizeOfInstructions = glyphProfile.sizeOfInstructions;
          }

          writeOffset += newLength;
          itemEncode(locaData, j, writeOffset);
          startOffset = endOffset;
        }

        if (writeOffset === 0) {
          var simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);

          for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) {
            itemEncode(locaData, j, simpleGlyph.length);
          }

          glyf.data = simpleGlyph;
        } else if (dupFirstEntry) {
          var firstEntryLength = itemDecode(locaData, itemSize);

          if (newGlyfData.length > firstEntryLength + writeOffset) {
            glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);
          } else {
            glyf.data = new Uint8Array(firstEntryLength + writeOffset);
            glyf.data.set(newGlyfData.subarray(0, writeOffset));
          }

          glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);
          itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength);
        } else {
          glyf.data = newGlyfData.subarray(0, writeOffset);
        }

        return {
          missingGlyphs: missingGlyphs,
          maxSizeOfInstructions: maxSizeOfInstructions
        };
      }

      function readPostScriptTable(post, properties, maxpNumGlyphs) {
        var start = (font.start ? font.start : 0) + post.offset;
        font.pos = start;
        var length = post.length,
            end = start + length;
        var version = font.getInt32();
        font.getBytes(28);
        var glyphNames;
        var valid = true;
        var i;

        switch (version) {
          case 0x00010000:
            glyphNames = MacStandardGlyphOrdering;
            break;

          case 0x00020000:
            var numGlyphs = font.getUint16();

            if (numGlyphs !== maxpNumGlyphs) {
              valid = false;
              break;
            }

            var glyphNameIndexes = [];

            for (i = 0; i < numGlyphs; ++i) {
              var index = font.getUint16();

              if (index >= 32768) {
                valid = false;
                break;
              }

              glyphNameIndexes.push(index);
            }

            if (!valid) {
              break;
            }

            var customNames = [];
            var strBuf = [];

            while (font.pos < end) {
              var stringLength = font.getByte();
              strBuf.length = stringLength;

              for (i = 0; i < stringLength; ++i) {
                strBuf[i] = String.fromCharCode(font.getByte());
              }

              customNames.push(strBuf.join(''));
            }

            glyphNames = [];

            for (i = 0; i < numGlyphs; ++i) {
              var j = glyphNameIndexes[i];

              if (j < 258) {
                glyphNames.push(MacStandardGlyphOrdering[j]);
                continue;
              }

              glyphNames.push(customNames[j - 258]);
            }

            break;

          case 0x00030000:
            break;

          default:
            (0, _util.warn)('Unknown/unsupported post table version ' + version);
            valid = false;

            if (properties.defaultEncoding) {
              glyphNames = properties.defaultEncoding;
            }

            break;
        }

        properties.glyphNames = glyphNames;
        return valid;
      }

      function readNameTable(nameTable) {
        var start = (font.start ? font.start : 0) + nameTable.offset;
        font.pos = start;
        var names = [[], []];
        var length = nameTable.length,
            end = start + length;
        var format = font.getUint16();
        var FORMAT_0_HEADER_LENGTH = 6;

        if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {
          return names;
        }

        var numRecords = font.getUint16();
        var stringsStart = font.getUint16();
        var records = [];
        var NAME_RECORD_LENGTH = 12;
        var i, ii;

        for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) {
          var r = {
            platform: font.getUint16(),
            encoding: font.getUint16(),
            language: font.getUint16(),
            name: font.getUint16(),
            length: font.getUint16(),
            offset: font.getUint16()
          };

          if (r.platform === 1 && r.encoding === 0 && r.language === 0 || r.platform === 3 && r.encoding === 1 && r.language === 0x409) {
            records.push(r);
          }
        }

        for (i = 0, ii = records.length; i < ii; i++) {
          var record = records[i];

          if (record.length <= 0) {
            continue;
          }

          var pos = start + stringsStart + record.offset;

          if (pos + record.length > end) {
            continue;
          }

          font.pos = pos;
          var nameIndex = record.name;

          if (record.encoding) {
            var str = '';

            for (var j = 0, jj = record.length; j < jj; j += 2) {
              str += String.fromCharCode(font.getUint16());
            }

            names[1][nameIndex] = str;
          } else {
            names[0][nameIndex] = (0, _util.bytesToString)(font.getBytes(record.length));
          }
        }

        return names;
      }

      var TTOpsStackDeltas = [0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2];

      function sanitizeTTProgram(table, ttContext) {
        var data = table.data;
        var i = 0,
            j,
            n,
            b,
            funcId,
            pc,
            lastEndf = 0,
            lastDeff = 0;
        var stack = [];
        var callstack = [];
        var functionsCalled = [];
        var tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions;
        var inFDEF = false,
            ifLevel = 0,
            inELSE = 0;

        for (var ii = data.length; i < ii;) {
          var op = data[i++];

          if (op === 0x40) {
            n = data[i++];

            if (inFDEF || inELSE) {
              i += n;
            } else {
              for (j = 0; j < n; j++) {
                stack.push(data[i++]);
              }
            }
          } else if (op === 0x41) {
            n = data[i++];

            if (inFDEF || inELSE) {
              i += n * 2;
            } else {
              for (j = 0; j < n; j++) {
                b = data[i++];
                stack.push(b << 8 | data[i++]);
              }
            }
          } else if ((op & 0xF8) === 0xB0) {
            n = op - 0xB0 + 1;

            if (inFDEF || inELSE) {
              i += n;
            } else {
              for (j = 0; j < n; j++) {
                stack.push(data[i++]);
              }
            }
          } else if ((op & 0xF8) === 0xB8) {
            n = op - 0xB8 + 1;

            if (inFDEF || inELSE) {
              i += n * 2;
            } else {
              for (j = 0; j < n; j++) {
                b = data[i++];
                stack.push(b << 8 | data[i++]);
              }
            }
          } else if (op === 0x2B && !tooComplexToFollowFunctions) {
            if (!inFDEF && !inELSE) {
              funcId = stack[stack.length - 1];

              if (isNaN(funcId)) {
                (0, _util.info)('TT: CALL empty stack (or invalid entry).');
              } else {
                ttContext.functionsUsed[funcId] = true;

                if (funcId in ttContext.functionsStackDeltas) {
                  var newStackLength = stack.length + ttContext.functionsStackDeltas[funcId];

                  if (newStackLength < 0) {
                    (0, _util.warn)('TT: CALL invalid functions stack delta.');
                    ttContext.hintsValid = false;
                    return;
                  }

                  stack.length = newStackLength;
                } else if (funcId in ttContext.functionsDefined && !functionsCalled.includes(funcId)) {
                  callstack.push({
                    data: data,
                    i: i,
                    stackTop: stack.length - 1
                  });
                  functionsCalled.push(funcId);
                  pc = ttContext.functionsDefined[funcId];

                  if (!pc) {
                    (0, _util.warn)('TT: CALL non-existent function');
                    ttContext.hintsValid = false;
                    return;
                  }

                  data = pc.data;
                  i = pc.i;
                }
              }
            }
          } else if (op === 0x2C && !tooComplexToFollowFunctions) {
            if (inFDEF || inELSE) {
              (0, _util.warn)('TT: nested FDEFs not allowed');
              tooComplexToFollowFunctions = true;
            }

            inFDEF = true;
            lastDeff = i;
            funcId = stack.pop();
            ttContext.functionsDefined[funcId] = {
              data: data,
              i: i
            };
          } else if (op === 0x2D) {
            if (inFDEF) {
              inFDEF = false;
              lastEndf = i;
            } else {
              pc = callstack.pop();

              if (!pc) {
                (0, _util.warn)('TT: ENDF bad stack');
                ttContext.hintsValid = false;
                return;
              }

              funcId = functionsCalled.pop();
              data = pc.data;
              i = pc.i;
              ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop;
            }
          } else if (op === 0x89) {
            if (inFDEF || inELSE) {
              (0, _util.warn)('TT: nested IDEFs not allowed');
              tooComplexToFollowFunctions = true;
            }

            inFDEF = true;
            lastDeff = i;
          } else if (op === 0x58) {
            ++ifLevel;
          } else if (op === 0x1B) {
            inELSE = ifLevel;
          } else if (op === 0x59) {
            if (inELSE === ifLevel) {
              inELSE = 0;
            }

            --ifLevel;
          } else if (op === 0x1C) {
            if (!inFDEF && !inELSE) {
              var offset = stack[stack.length - 1];

              if (offset > 0) {
                i += offset - 1;
              }
            }
          }

          if (!inFDEF && !inELSE) {
            var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] : op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0;

            if (op >= 0x71 && op <= 0x75) {
              n = stack.pop();

              if (!isNaN(n)) {
                stackDelta = -n * 2;
              }
            }

            while (stackDelta < 0 && stack.length > 0) {
              stack.pop();
              stackDelta++;
            }

            while (stackDelta > 0) {
              stack.push(NaN);
              stackDelta--;
            }
          }
        }

        ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;
        var content = [data];

        if (i > data.length) {
          content.push(new Uint8Array(i - data.length));
        }

        if (lastDeff > lastEndf) {
          (0, _util.warn)('TT: complementing a missing function tail');
          content.push(new Uint8Array([0x22, 0x2D]));
        }

        foldTTTable(table, content);
      }

      function checkInvalidFunctions(ttContext, maxFunctionDefs) {
        if (ttContext.tooComplexToFollowFunctions) {
          return;
        }

        if (ttContext.functionsDefined.length > maxFunctionDefs) {
          (0, _util.warn)('TT: more functions defined than expected');
          ttContext.hintsValid = false;
          return;
        }

        for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {
          if (j > maxFunctionDefs) {
            (0, _util.warn)('TT: invalid function id: ' + j);
            ttContext.hintsValid = false;
            return;
          }

          if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {
            (0, _util.warn)('TT: undefined function: ' + j);
            ttContext.hintsValid = false;
            return;
          }
        }
      }

      function foldTTTable(table, content) {
        if (content.length > 1) {
          var newLength = 0;
          var j, jj;

          for (j = 0, jj = content.length; j < jj; j++) {
            newLength += content[j].length;
          }

          newLength = newLength + 3 & ~3;
          var result = new Uint8Array(newLength);
          var pos = 0;

          for (j = 0, jj = content.length; j < jj; j++) {
            result.set(content[j], pos);
            pos += content[j].length;
          }

          table.data = result;
          table.length = newLength;
        }
      }

      function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) {
        var ttContext = {
          functionsDefined: [],
          functionsUsed: [],
          functionsStackDeltas: [],
          tooComplexToFollowFunctions: false,
          hintsValid: true
        };

        if (fpgm) {
          sanitizeTTProgram(fpgm, ttContext);
        }

        if (prep) {
          sanitizeTTProgram(prep, ttContext);
        }

        if (fpgm) {
          checkInvalidFunctions(ttContext, maxFunctionDefs);
        }

        if (cvt && cvt.length & 1) {
          var cvtData = new Uint8Array(cvt.length + 1);
          cvtData.set(cvt.data);
          cvt.data = cvtData;
        }

        return ttContext.hintsValid;
      }

      font = new _stream.Stream(new Uint8Array(font.getBytes()));
      var header, tables;

      if (isTrueTypeCollectionFile(font)) {
        var ttcData = readTrueTypeCollectionData(font, this.name);
        header = ttcData.header;
        tables = ttcData.tables;
      } else {
        header = readOpenTypeHeader(font);
        tables = readTables(font, header.numTables);
      }

      var cff, cffFile;
      var isTrueType = !tables['CFF '];

      if (!isTrueType) {
        var isComposite = properties.composite && ((properties.cidToGidMap || []).length > 0 || !(properties.cMap instanceof _cmap.IdentityCMap));

        if (header.version === 'OTTO' && !isComposite || !tables['head'] || !tables['hhea'] || !tables['maxp'] || !tables['post']) {
          cffFile = new _stream.Stream(tables['CFF '].data);
          cff = new CFFFont(cffFile, properties);
          adjustWidths(properties);
          return this.convert(name, cff, properties);
        }

        delete tables['glyf'];
        delete tables['loca'];
        delete tables['fpgm'];
        delete tables['prep'];
        delete tables['cvt '];
        this.isOpenType = true;
      } else {
        if (!tables['loca']) {
          throw new _util.FormatError('Required "loca" table is not found');
        }

        if (!tables['glyf']) {
          (0, _util.warn)('Required "glyf" table is not found -- trying to recover.');
          tables['glyf'] = {
            tag: 'glyf',
            data: new Uint8Array(0)
          };
        }

        this.isOpenType = false;
      }

      if (!tables['maxp']) {
        throw new _util.FormatError('Required "maxp" table is not found');
      }

      font.pos = (font.start || 0) + tables['maxp'].offset;
      var version = font.getInt32();
      var numGlyphs = font.getUint16();
      var numGlyphsOut = numGlyphs + 1;
      var dupFirstEntry = true;

      if (numGlyphsOut > 0xFFFF) {
        dupFirstEntry = false;
        numGlyphsOut = numGlyphs;
        (0, _util.warn)('Not enough space in glyfs to duplicate first glyph.');
      }

      var maxFunctionDefs = 0;
      var maxSizeOfInstructions = 0;

      if (version >= 0x00010000 && tables['maxp'].length >= 22) {
        font.pos += 8;
        var maxZones = font.getUint16();

        if (maxZones > 2) {
          tables['maxp'].data[14] = 0;
          tables['maxp'].data[15] = 2;
        }

        font.pos += 4;
        maxFunctionDefs = font.getUint16();
        font.pos += 4;
        maxSizeOfInstructions = font.getUint16();
      }

      tables['maxp'].data[4] = numGlyphsOut >> 8;
      tables['maxp'].data[5] = numGlyphsOut & 255;
      var hintsValid = sanitizeTTPrograms(tables['fpgm'], tables['prep'], tables['cvt '], maxFunctionDefs);

      if (!hintsValid) {
        delete tables['fpgm'];
        delete tables['prep'];
        delete tables['cvt '];
      }

      sanitizeMetrics(font, tables['hhea'], tables['hmtx'], numGlyphsOut);

      if (!tables['head']) {
        throw new _util.FormatError('Required "head" table is not found');
      }

      sanitizeHead(tables['head'], numGlyphs, isTrueType ? tables['loca'].length : 0);
      var missingGlyphs = Object.create(null);

      if (isTrueType) {
        var isGlyphLocationsLong = int16(tables['head'].data[50], tables['head'].data[51]);
        var glyphsInfo = sanitizeGlyphLocations(tables['loca'], tables['glyf'], numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions);
        missingGlyphs = glyphsInfo.missingGlyphs;

        if (version >= 0x00010000 && tables['maxp'].length >= 22) {
          tables['maxp'].data[26] = glyphsInfo.maxSizeOfInstructions >> 8;
          tables['maxp'].data[27] = glyphsInfo.maxSizeOfInstructions & 255;
        }
      }

      if (!tables['hhea']) {
        throw new _util.FormatError('Required "hhea" table is not found');
      }

      if (tables['hhea'].data[10] === 0 && tables['hhea'].data[11] === 0) {
        tables['hhea'].data[10] = 0xFF;
        tables['hhea'].data[11] = 0xFF;
      }

      var metricsOverride = {
        unitsPerEm: int16(tables['head'].data[18], tables['head'].data[19]),
        yMax: int16(tables['head'].data[42], tables['head'].data[43]),
        yMin: signedInt16(tables['head'].data[38], tables['head'].data[39]),
        ascent: int16(tables['hhea'].data[4], tables['hhea'].data[5]),
        descent: signedInt16(tables['hhea'].data[6], tables['hhea'].data[7])
      };
      this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm;
      this.descent = metricsOverride.descent / metricsOverride.unitsPerEm;

      if (tables['post']) {
        readPostScriptTable(tables['post'], properties, numGlyphs);
      }

      tables['post'] = {
        tag: 'post',
        data: createPostTable(properties)
      };
      var charCodeToGlyphId = [],
          charCode;

      function hasGlyph(glyphId) {
        return !missingGlyphs[glyphId];
      }

      if (properties.composite) {
        var cidToGidMap = properties.cidToGidMap || [];
        var isCidToGidMapEmpty = cidToGidMap.length === 0;
        properties.cMap.forEach(function (charCode, cid) {
          if (cid > 0xffff) {
            throw new _util.FormatError('Max size of CID is 65,535');
          }

          var glyphId = -1;

          if (isCidToGidMapEmpty) {
            glyphId = cid;
          } else if (cidToGidMap[cid] !== undefined) {
            glyphId = cidToGidMap[cid];
          }

          if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) {
            charCodeToGlyphId[charCode] = glyphId;
          }
        });
      } else {
        var cmapTable = readCmapTable(tables['cmap'], font, this.isSymbolicFont, properties.hasEncoding);
        var cmapPlatformId = cmapTable.platformId;
        var cmapEncodingId = cmapTable.encodingId;
        var cmapMappings = cmapTable.mappings;
        var cmapMappingsLength = cmapMappings.length;

        if (properties.hasEncoding && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0) || cmapPlatformId === -1 && cmapEncodingId === -1 && !!(0, _encodings.getEncoding)(properties.baseEncodingName)) {
          var baseEncoding = [];

          if (properties.baseEncodingName === 'MacRomanEncoding' || properties.baseEncodingName === 'WinAnsiEncoding') {
            baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);
          }

          var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();

          for (charCode = 0; charCode < 256; charCode++) {
            var glyphName, standardGlyphName;

            if (this.differences && charCode in this.differences) {
              glyphName = this.differences[charCode];
            } else if (charCode in baseEncoding && baseEncoding[charCode] !== '') {
              glyphName = baseEncoding[charCode];
            } else {
              glyphName = _encodings.StandardEncoding[charCode];
            }

            if (!glyphName) {
              continue;
            }

            standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);
            var unicodeOrCharCode;

            if (cmapPlatformId === 3 && cmapEncodingId === 1) {
              unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName];
            } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {
              unicodeOrCharCode = _encodings.MacRomanEncoding.indexOf(standardGlyphName);
            }

            var found = false;

            for (var i = 0; i < cmapMappingsLength; ++i) {
              if (cmapMappings[i].charCode !== unicodeOrCharCode) {
                continue;
              }

              charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
              found = true;
              break;
            }

            if (!found && properties.glyphNames) {
              var glyphId = properties.glyphNames.indexOf(glyphName);

              if (glyphId === -1 && standardGlyphName !== glyphName) {
                glyphId = properties.glyphNames.indexOf(standardGlyphName);
              }

              if (glyphId > 0 && hasGlyph(glyphId)) {
                charCodeToGlyphId[charCode] = glyphId;
              }
            }
          }
        } else if (cmapPlatformId === 0 && cmapEncodingId === 0) {
          for (var _i2 = 0; _i2 < cmapMappingsLength; ++_i2) {
            charCodeToGlyphId[cmapMappings[_i2].charCode] = cmapMappings[_i2].glyphId;
          }
        } else {
          for (var _i3 = 0; _i3 < cmapMappingsLength; ++_i3) {
            charCode = cmapMappings[_i3].charCode;

            if (cmapPlatformId === 3 && charCode >= 0xF000 && charCode <= 0xF0FF) {
              charCode &= 0xFF;
            }

            charCodeToGlyphId[charCode] = cmapMappings[_i3].glyphId;
          }
        }
      }

      if (charCodeToGlyphId.length === 0) {
        charCodeToGlyphId[0] = 0;
      }

      var glyphZeroId = numGlyphsOut - 1;

      if (!dupFirstEntry) {
        glyphZeroId = 0;
      }

      var newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId);
      this.toFontChar = newMapping.toFontChar;
      tables['cmap'] = {
        tag: 'cmap',
        data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphsOut)
      };

      if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) {
        tables['OS/2'] = {
          tag: 'OS/2',
          data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride)
        };
      }

      if (!isTrueType) {
        try {
          cffFile = new _stream.Stream(tables['CFF '].data);
          var parser = new _cff_parser.CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED);
          cff = parser.parse();
          cff.duplicateFirstGlyph();
          var compiler = new _cff_parser.CFFCompiler(cff);
          tables['CFF '].data = compiler.compile();
        } catch (e) {
          (0, _util.warn)('Failed to compile font ' + properties.loadedName);
        }
      }

      if (!tables['name']) {
        tables['name'] = {
          tag: 'name',
          data: createNameTable(this.name)
        };
      } else {
        var namePrototype = readNameTable(tables['name']);
        tables['name'].data = createNameTable(name, namePrototype);
      }

      var builder = new OpenTypeFileBuilder(header.version);

      for (var tableTag in tables) {
        builder.addTable(tableTag, tables[tableTag].data);
      }

      return builder.toArray();
    },
    convert: function Font_convert(fontName, font, properties) {
      properties.fixedPitch = false;

      if (properties.builtInEncoding) {
        adjustToUnicode(properties, properties.builtInEncoding);
      }

      var glyphZeroId = 1;

      if (font instanceof CFFFont) {
        glyphZeroId = font.numGlyphs - 1;
      }

      var mapping = font.getGlyphMapping(properties);
      var newMapping = adjustMapping(mapping, font.hasGlyphId.bind(font), glyphZeroId);
      this.toFontChar = newMapping.toFontChar;
      var numGlyphs = font.numGlyphs;

      function getCharCodes(charCodeToGlyphId, glyphId) {
        var charCodes = null;

        for (var charCode in charCodeToGlyphId) {
          if (glyphId === charCodeToGlyphId[charCode]) {
            if (!charCodes) {
              charCodes = [];
            }

            charCodes.push(charCode | 0);
          }
        }

        return charCodes;
      }

      function createCharCode(charCodeToGlyphId, glyphId) {
        for (var charCode in charCodeToGlyphId) {
          if (glyphId === charCodeToGlyphId[charCode]) {
            return charCode | 0;
          }
        }

        newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId;
        return newMapping.nextAvailableFontCharCode++;
      }

      var seacs = font.seacs;

      if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) {
        var matrix = properties.fontMatrix || _util.FONT_IDENTITY_MATRIX;
        var charset = font.getCharset();
        var seacMap = Object.create(null);

        for (var glyphId in seacs) {
          glyphId |= 0;
          var seac = seacs[glyphId];
          var baseGlyphName = _encodings.StandardEncoding[seac[2]];
          var accentGlyphName = _encodings.StandardEncoding[seac[3]];
          var baseGlyphId = charset.indexOf(baseGlyphName);
          var accentGlyphId = charset.indexOf(accentGlyphName);

          if (baseGlyphId < 0 || accentGlyphId < 0) {
            continue;
          }

          var accentOffset = {
            x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],
            y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5]
          };
          var charCodes = getCharCodes(mapping, glyphId);

          if (!charCodes) {
            continue;
          }

          for (var i = 0, ii = charCodes.length; i < ii; i++) {
            var charCode = charCodes[i];
            var charCodeToGlyphId = newMapping.charCodeToGlyphId;
            var baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId);
            var accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId);
            seacMap[charCode] = {
              baseFontCharCode: baseFontCharCode,
              accentFontCharCode: accentFontCharCode,
              accentOffset: accentOffset
            };
          }
        }

        properties.seacMap = seacMap;
      }

      var unitsPerEm = 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];
      var builder = new OpenTypeFileBuilder('\x4F\x54\x54\x4F');
      builder.addTable('CFF ', font.data);
      builder.addTable('OS/2', createOS2Table(properties, newMapping.charCodeToGlyphId));
      builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId, numGlyphs));
      builder.addTable('head', '\x00\x01\x00\x00' + '\x00\x00\x10\x00' + '\x00\x00\x00\x00' + '\x5F\x0F\x3C\xF5' + '\x00\x00' + safeString16(unitsPerEm) + '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + '\x00\x00' + safeString16(properties.descent) + '\x0F\xFF' + safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + '\x00\x11' + '\x00\x00' + '\x00\x00' + '\x00\x00');
      builder.addTable('hhea', '\x00\x01\x00\x00' + safeString16(properties.ascent) + safeString16(properties.descent) + '\x00\x00' + '\xFF\xFF' + '\x00\x00' + '\x00\x00' + '\x00\x00' + safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + '\x00\x00' + '\x00\x00' + '\x00\x00' + '\x00\x00' + '\x00\x00' + '\x00\x00' + string16(numGlyphs));
      builder.addTable('hmtx', function fontFieldsHmtx() {
        var charstrings = font.charstrings;
        var cffWidths = font.cff ? font.cff.widths : null;
        var hmtx = '\x00\x00\x00\x00';

        for (var i = 1, ii = numGlyphs; i < ii; i++) {
          var width = 0;

          if (charstrings) {
            var charstring = charstrings[i - 1];
            width = 'width' in charstring ? charstring.width : 0;
          } else if (cffWidths) {
            width = Math.ceil(cffWidths[i] || 0);
          }

          hmtx += string16(width) + string16(0);
        }

        return hmtx;
      }());
      builder.addTable('maxp', '\x00\x00\x50\x00' + string16(numGlyphs));
      builder.addTable('name', createNameTable(fontName));
      builder.addTable('post', createPostTable(properties));
      return builder.toArray();
    },

    get spaceWidth() {
      if ('_shadowWidth' in this) {
        return this._shadowWidth;
      }

      var possibleSpaceReplacements = ['space', 'minus', 'one', 'i', 'I'];
      var width;

      for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {
        var glyphName = possibleSpaceReplacements[i];

        if (glyphName in this.widths) {
          width = this.widths[glyphName];
          break;
        }

        var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
        var glyphUnicode = glyphsUnicodeMap[glyphName];
        var charcode = 0;

        if (this.composite) {
          if (this.cMap.contains(glyphUnicode)) {
            charcode = this.cMap.lookup(glyphUnicode);
          }
        }

        if (!charcode && this.toUnicode) {
          charcode = this.toUnicode.charCodeOf(glyphUnicode);
        }

        if (charcode <= 0) {
          charcode = glyphUnicode;
        }

        width = this.widths[charcode];

        if (width) {
          break;
        }
      }

      width = width || this.defaultWidth;
      this._shadowWidth = width;
      return width;
    },

    charToGlyph: function Font_charToGlyph(charcode, isSpace) {
      var fontCharCode, width, operatorListId;
      var widthCode = charcode;

      if (this.cMap && this.cMap.contains(charcode)) {
        widthCode = this.cMap.lookup(charcode);
      }

      width = this.widths[widthCode];
      width = (0, _util.isNum)(width) ? width : this.defaultWidth;
      var vmetric = this.vmetrics && this.vmetrics[widthCode];
      var unicode = this.toUnicode.get(charcode) || this.fallbackToUnicode.get(charcode) || charcode;

      if (typeof unicode === 'number') {
        unicode = String.fromCharCode(unicode);
      }

      var isInFont = charcode in this.toFontChar;
      fontCharCode = this.toFontChar[charcode] || charcode;

      if (this.missingFile) {
        fontCharCode = (0, _unicode.mapSpecialUnicodeValues)(fontCharCode);
      }

      if (this.isType3Font) {
        operatorListId = fontCharCode;
      }

      var accent = null;

      if (this.seacMap && this.seacMap[charcode]) {
        isInFont = true;
        var seac = this.seacMap[charcode];
        fontCharCode = seac.baseFontCharCode;
        accent = {
          fontChar: String.fromCodePoint(seac.accentFontCharCode),
          offset: seac.accentOffset
        };
      }

      var fontChar = typeof fontCharCode === 'number' ? String.fromCodePoint(fontCharCode) : '';
      var glyph = this.glyphCache[charcode];

      if (!glyph || !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont)) {
        glyph = new Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont);
        this.glyphCache[charcode] = glyph;
      }

      return glyph;
    },
    charsToGlyphs: function Font_charsToGlyphs(chars) {
      var charsCache = this.charsCache;
      var glyphs, glyph, charcode;

      if (charsCache) {
        glyphs = charsCache[chars];

        if (glyphs) {
          return glyphs;
        }
      }

      if (!charsCache) {
        charsCache = this.charsCache = Object.create(null);
      }

      glyphs = [];
      var charsCacheKey = chars;
      var i = 0,
          ii;

      if (this.cMap) {
        var c = Object.create(null);

        while (i < chars.length) {
          this.cMap.readCharCode(chars, i, c);
          charcode = c.charcode;
          var length = c.length;
          i += length;
          var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20;
          glyph = this.charToGlyph(charcode, isSpace);
          glyphs.push(glyph);
        }
      } else {
        for (i = 0, ii = chars.length; i < ii; ++i) {
          charcode = chars.charCodeAt(i);
          glyph = this.charToGlyph(charcode, charcode === 0x20);
          glyphs.push(glyph);
        }
      }

      return charsCache[charsCacheKey] = glyphs;
    },

    get glyphCacheValues() {
      return Object.values(this.glyphCache);
    }

  };
  return Font;
}();

exports.Font = Font;

var ErrorFont = function ErrorFontClosure() {
  function ErrorFont(error) {
    this.error = error;
    this.loadedName = 'g_font_error';
    this.missingFile = true;
  }

  ErrorFont.prototype = {
    charsToGlyphs: function ErrorFont_charsToGlyphs() {
      return [];
    },
    exportData: function ErrorFont_exportData() {
      return {
        error: this.error
      };
    }
  };
  return ErrorFont;
}();

exports.ErrorFont = ErrorFont;

function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {
  var charCodeToGlyphId = Object.create(null);
  var glyphId, charCode, baseEncoding;
  var isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);

  if (properties.baseEncodingName) {
    baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);

    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
      glyphId = glyphNames.indexOf(baseEncoding[charCode]);

      if (glyphId >= 0) {
        charCodeToGlyphId[charCode] = glyphId;
      } else {
        charCodeToGlyphId[charCode] = 0;
      }
    }
  } else if (isSymbolicFont) {
    for (charCode in builtInEncoding) {
      charCodeToGlyphId[charCode] = builtInEncoding[charCode];
    }
  } else {
    baseEncoding = _encodings.StandardEncoding;

    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
      glyphId = glyphNames.indexOf(baseEncoding[charCode]);

      if (glyphId >= 0) {
        charCodeToGlyphId[charCode] = glyphId;
      } else {
        charCodeToGlyphId[charCode] = 0;
      }
    }
  }

  var differences = properties.differences,
      glyphsUnicodeMap;

  if (differences) {
    for (charCode in differences) {
      var glyphName = differences[charCode];
      glyphId = glyphNames.indexOf(glyphName);

      if (glyphId === -1) {
        if (!glyphsUnicodeMap) {
          glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
        }

        var standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);

        if (standardGlyphName !== glyphName) {
          glyphId = glyphNames.indexOf(standardGlyphName);
        }
      }

      if (glyphId >= 0) {
        charCodeToGlyphId[charCode] = glyphId;
      } else {
        charCodeToGlyphId[charCode] = 0;
      }
    }
  }

  return charCodeToGlyphId;
}

var Type1Font = function Type1FontClosure() {
  function findBlock(streamBytes, signature, startIndex) {
    var streamBytesLength = streamBytes.length;
    var signatureLength = signature.length;
    var scanLength = streamBytesLength - signatureLength;
    var i = startIndex,
        j,
        found = false;

    while (i < scanLength) {
      j = 0;

      while (j < signatureLength && streamBytes[i + j] === signature[j]) {
        j++;
      }

      if (j >= signatureLength) {
        i += j;

        while (i < streamBytesLength && (0, _util.isSpace)(streamBytes[i])) {
          i++;
        }

        found = true;
        break;
      }

      i++;
    }

    return {
      found: found,
      length: i
    };
  }

  function getHeaderBlock(stream, suggestedLength) {
    var EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63];
    var streamStartPos = stream.pos;
    var headerBytes, headerBytesLength, block;

    try {
      headerBytes = stream.getBytes(suggestedLength);
      headerBytesLength = headerBytes.length;
    } catch (ex) {
      if (ex instanceof _util.MissingDataException) {
        throw ex;
      }
    }

    if (headerBytesLength === suggestedLength) {
      block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length);

      if (block.found && block.length === suggestedLength) {
        return {
          stream: new _stream.Stream(headerBytes),
          length: suggestedLength
        };
      }
    }

    (0, _util.warn)('Invalid "Length1" property in Type1 font -- trying to recover.');
    stream.pos = streamStartPos;
    var SCAN_BLOCK_LENGTH = 2048;
    var actualLength;

    while (true) {
      var scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);
      block = findBlock(scanBytes, EEXEC_SIGNATURE, 0);

      if (block.length === 0) {
        break;
      }

      stream.pos += block.length;

      if (block.found) {
        actualLength = stream.pos - streamStartPos;
        break;
      }
    }

    stream.pos = streamStartPos;

    if (actualLength) {
      return {
        stream: new _stream.Stream(stream.getBytes(actualLength)),
        length: actualLength
      };
    }

    (0, _util.warn)('Unable to recover "Length1" property in Type1 font -- using as is.');
    return {
      stream: new _stream.Stream(stream.getBytes(suggestedLength)),
      length: suggestedLength
    };
  }

  function getEexecBlock(stream, suggestedLength) {
    var eexecBytes = stream.getBytes();
    return {
      stream: new _stream.Stream(eexecBytes),
      length: eexecBytes.length
    };
  }

  function Type1Font(name, file, properties) {
    var PFB_HEADER_SIZE = 6;
    var headerBlockLength = properties.length1;
    var eexecBlockLength = properties.length2;
    var pfbHeader = file.peekBytes(PFB_HEADER_SIZE);
    var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;

    if (pfbHeaderPresent) {
      file.skip(PFB_HEADER_SIZE);
      headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];
    }

    var headerBlock = getHeaderBlock(file, headerBlockLength);
    var headerBlockParser = new _type1_parser.Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED);
    headerBlockParser.extractFontHeader(properties);

    if (pfbHeaderPresent) {
      pfbHeader = file.getBytes(PFB_HEADER_SIZE);
      eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];
    }

    var eexecBlock = getEexecBlock(file, eexecBlockLength);
    var eexecBlockParser = new _type1_parser.Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED);
    var data = eexecBlockParser.extractFontProgram();

    for (var info in data.properties) {
      properties[info] = data.properties[info];
    }

    var charstrings = data.charstrings;
    var type2Charstrings = this.getType2Charstrings(charstrings);
    var subrs = this.getType2Subrs(data.subrs);
    this.charstrings = charstrings;
    this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties);
    this.seacs = this.getSeacs(data.charstrings);
  }

  Type1Font.prototype = {
    get numGlyphs() {
      return this.charstrings.length + 1;
    },

    getCharset: function Type1Font_getCharset() {
      var charset = ['.notdef'];
      var charstrings = this.charstrings;

      for (var glyphId = 0; glyphId < charstrings.length; glyphId++) {
        charset.push(charstrings[glyphId].glyphName);
      }

      return charset;
    },
    getGlyphMapping: function Type1Font_getGlyphMapping(properties) {
      var charstrings = this.charstrings;
      var glyphNames = ['.notdef'],
          glyphId;

      for (glyphId = 0; glyphId < charstrings.length; glyphId++) {
        glyphNames.push(charstrings[glyphId].glyphName);
      }

      var encoding = properties.builtInEncoding;

      if (encoding) {
        var builtInEncoding = Object.create(null);

        for (var charCode in encoding) {
          glyphId = glyphNames.indexOf(encoding[charCode]);

          if (glyphId >= 0) {
            builtInEncoding[charCode] = glyphId;
          }
        }
      }

      return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);
    },
    hasGlyphId: function Type1Font_hasGlyphID(id) {
      if (id < 0 || id >= this.numGlyphs) {
        return false;
      }

      if (id === 0) {
        return true;
      }

      var glyph = this.charstrings[id - 1];
      return glyph.charstring.length > 0;
    },
    getSeacs: function Type1Font_getSeacs(charstrings) {
      var i, ii;
      var seacMap = [];

      for (i = 0, ii = charstrings.length; i < ii; i++) {
        var charstring = charstrings[i];

        if (charstring.seac) {
          seacMap[i + 1] = charstring.seac;
        }
      }

      return seacMap;
    },
    getType2Charstrings: function Type1Font_getType2Charstrings(type1Charstrings) {
      var type2Charstrings = [];

      for (var i = 0, ii = type1Charstrings.length; i < ii; i++) {
        type2Charstrings.push(type1Charstrings[i].charstring);
      }

      return type2Charstrings;
    },
    getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {
      var bias = 0;
      var count = type1Subrs.length;

      if (count < 1133) {
        bias = 107;
      } else if (count < 33769) {
        bias = 1131;
      } else {
        bias = 32768;
      }

      var type2Subrs = [];
      var i;

      for (i = 0; i < bias; i++) {
        type2Subrs.push([0x0B]);
      }

      for (i = 0; i < count; i++) {
        type2Subrs.push(type1Subrs[i]);
      }

      return type2Subrs;
    },
    wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {
      var cff = new _cff_parser.CFF();
      cff.header = new _cff_parser.CFFHeader(1, 0, 4, 4);
      cff.names = [name];
      var topDict = new _cff_parser.CFFTopDict();
      topDict.setByName('version', 391);
      topDict.setByName('Notice', 392);
      topDict.setByName('FullName', 393);
      topDict.setByName('FamilyName', 394);
      topDict.setByName('Weight', 395);
      topDict.setByName('Encoding', null);
      topDict.setByName('FontMatrix', properties.fontMatrix);
      topDict.setByName('FontBBox', properties.bbox);
      topDict.setByName('charset', null);
      topDict.setByName('CharStrings', null);
      topDict.setByName('Private', null);
      cff.topDict = topDict;
      var strings = new _cff_parser.CFFStrings();
      strings.add('Version 0.11');
      strings.add('See original notice');
      strings.add(name);
      strings.add(name);
      strings.add('Medium');
      cff.strings = strings;
      cff.globalSubrIndex = new _cff_parser.CFFIndex();
      var count = glyphs.length;
      var charsetArray = [0];
      var i, ii;

      for (i = 0; i < count; i++) {
        var index = _cff_parser.CFFStandardStrings.indexOf(charstrings[i].glyphName);

        if (index === -1) {
          index = 0;
        }

        charsetArray.push(index >> 8 & 0xff, index & 0xff);
      }

      cff.charset = new _cff_parser.CFFCharset(false, 0, [], charsetArray);
      var charStringsIndex = new _cff_parser.CFFIndex();
      charStringsIndex.add([0x8B, 0x0E]);

      for (i = 0; i < count; i++) {
        charStringsIndex.add(glyphs[i]);
      }

      cff.charStrings = charStringsIndex;
      var privateDict = new _cff_parser.CFFPrivateDict();
      privateDict.setByName('Subrs', null);
      var fields = ['BlueValues', 'OtherBlues', 'FamilyBlues', 'FamilyOtherBlues', 'StemSnapH', 'StemSnapV', 'BlueShift', 'BlueFuzz', 'BlueScale', 'LanguageGroup', 'ExpansionFactor', 'ForceBold', 'StdHW', 'StdVW'];

      for (i = 0, ii = fields.length; i < ii; i++) {
        var field = fields[i];

        if (!(field in properties.privateData)) {
          continue;
        }

        var value = properties.privateData[field];

        if (Array.isArray(value)) {
          for (var j = value.length - 1; j > 0; j--) {
            value[j] -= value[j - 1];
          }
        }

        privateDict.setByName(field, value);
      }

      cff.topDict.privateDict = privateDict;
      var subrIndex = new _cff_parser.CFFIndex();

      for (i = 0, ii = subrs.length; i < ii; i++) {
        subrIndex.add(subrs[i]);
      }

      privateDict.subrsIndex = subrIndex;
      var compiler = new _cff_parser.CFFCompiler(cff);
      return compiler.compile();
    }
  };
  return Type1Font;
}();

var CFFFont = function CFFFontClosure() {
  function CFFFont(file, properties) {
    this.properties = properties;
    var parser = new _cff_parser.CFFParser(file, properties, SEAC_ANALYSIS_ENABLED);
    this.cff = parser.parse();
    this.cff.duplicateFirstGlyph();
    var compiler = new _cff_parser.CFFCompiler(this.cff);
    this.seacs = this.cff.seacs;

    try {
      this.data = compiler.compile();
    } catch (e) {
      (0, _util.warn)('Failed to compile font ' + properties.loadedName);
      this.data = file;
    }
  }

  CFFFont.prototype = {
    get numGlyphs() {
      return this.cff.charStrings.count;
    },

    getCharset: function CFFFont_getCharset() {
      return this.cff.charset.charset;
    },
    getGlyphMapping: function CFFFont_getGlyphMapping() {
      var cff = this.cff;
      var properties = this.properties;
      var charsets = cff.charset.charset;
      var charCodeToGlyphId;
      var glyphId;

      if (properties.composite) {
        charCodeToGlyphId = Object.create(null);

        if (cff.isCIDFont) {
          for (glyphId = 0; glyphId < charsets.length; glyphId++) {
            var cid = charsets[glyphId];
            var charCode = properties.cMap.charCodeOf(cid);
            charCodeToGlyphId[charCode] = glyphId;
          }
        } else {
          for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {
            charCodeToGlyphId[glyphId] = glyphId;
          }
        }

        return charCodeToGlyphId;
      }

      var encoding = cff.encoding ? cff.encoding.encoding : null;
      charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);
      return charCodeToGlyphId;
    },
    hasGlyphId: function CFFFont_hasGlyphID(id) {
      return this.cff.hasGlyphId(id);
    }
  };
  return CFFFont;
}();

/***/ }),
/* 174 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CFFFDSelect = exports.CFFCompiler = exports.CFFPrivateDict = exports.CFFTopDict = exports.CFFCharset = exports.CFFIndex = exports.CFFStrings = exports.CFFHeader = exports.CFF = exports.CFFParser = exports.CFFStandardStrings = void 0;

var _util = __w_pdfjs_require__(6);

var _charsets = __w_pdfjs_require__(175);

var _encodings = __w_pdfjs_require__(176);

var MAX_SUBR_NESTING = 10;
var CFFStandardStrings = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003', 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'];
exports.CFFStandardStrings = CFFStandardStrings;

var CFFParser = function CFFParserClosure() {
  var CharstringValidationData = [null, {
    id: 'hstem',
    min: 2,
    stackClearing: true,
    stem: true
  }, null, {
    id: 'vstem',
    min: 2,
    stackClearing: true,
    stem: true
  }, {
    id: 'vmoveto',
    min: 1,
    stackClearing: true
  }, {
    id: 'rlineto',
    min: 2,
    resetStack: true
  }, {
    id: 'hlineto',
    min: 1,
    resetStack: true
  }, {
    id: 'vlineto',
    min: 1,
    resetStack: true
  }, {
    id: 'rrcurveto',
    min: 6,
    resetStack: true
  }, null, {
    id: 'callsubr',
    min: 1,
    undefStack: true
  }, {
    id: 'return',
    min: 0,
    undefStack: true
  }, null, null, {
    id: 'endchar',
    min: 0,
    stackClearing: true
  }, null, null, null, {
    id: 'hstemhm',
    min: 2,
    stackClearing: true,
    stem: true
  }, {
    id: 'hintmask',
    min: 0,
    stackClearing: true
  }, {
    id: 'cntrmask',
    min: 0,
    stackClearing: true
  }, {
    id: 'rmoveto',
    min: 2,
    stackClearing: true
  }, {
    id: 'hmoveto',
    min: 1,
    stackClearing: true
  }, {
    id: 'vstemhm',
    min: 2,
    stackClearing: true,
    stem: true
  }, {
    id: 'rcurveline',
    min: 8,
    resetStack: true
  }, {
    id: 'rlinecurve',
    min: 8,
    resetStack: true
  }, {
    id: 'vvcurveto',
    min: 4,
    resetStack: true
  }, {
    id: 'hhcurveto',
    min: 4,
    resetStack: true
  }, null, {
    id: 'callgsubr',
    min: 1,
    undefStack: true
  }, {
    id: 'vhcurveto',
    min: 4,
    resetStack: true
  }, {
    id: 'hvcurveto',
    min: 4,
    resetStack: true
  }];
  var CharstringValidationData12 = [null, null, null, {
    id: 'and',
    min: 2,
    stackDelta: -1
  }, {
    id: 'or',
    min: 2,
    stackDelta: -1
  }, {
    id: 'not',
    min: 1,
    stackDelta: 0
  }, null, null, null, {
    id: 'abs',
    min: 1,
    stackDelta: 0
  }, {
    id: 'add',
    min: 2,
    stackDelta: -1,
    stackFn: function stack_div(stack, index) {
      stack[index - 2] = stack[index - 2] + stack[index - 1];
    }
  }, {
    id: 'sub',
    min: 2,
    stackDelta: -1,
    stackFn: function stack_div(stack, index) {
      stack[index - 2] = stack[index - 2] - stack[index - 1];
    }
  }, {
    id: 'div',
    min: 2,
    stackDelta: -1,
    stackFn: function stack_div(stack, index) {
      stack[index - 2] = stack[index - 2] / stack[index - 1];
    }
  }, null, {
    id: 'neg',
    min: 1,
    stackDelta: 0,
    stackFn: function stack_div(stack, index) {
      stack[index - 1] = -stack[index - 1];
    }
  }, {
    id: 'eq',
    min: 2,
    stackDelta: -1
  }, null, null, {
    id: 'drop',
    min: 1,
    stackDelta: -1
  }, null, {
    id: 'put',
    min: 2,
    stackDelta: -2
  }, {
    id: 'get',
    min: 1,
    stackDelta: 0
  }, {
    id: 'ifelse',
    min: 4,
    stackDelta: -3
  }, {
    id: 'random',
    min: 0,
    stackDelta: 1
  }, {
    id: 'mul',
    min: 2,
    stackDelta: -1,
    stackFn: function stack_div(stack, index) {
      stack[index - 2] = stack[index - 2] * stack[index - 1];
    }
  }, null, {
    id: 'sqrt',
    min: 1,
    stackDelta: 0
  }, {
    id: 'dup',
    min: 1,
    stackDelta: 1
  }, {
    id: 'exch',
    min: 2,
    stackDelta: 0
  }, {
    id: 'index',
    min: 2,
    stackDelta: 0
  }, {
    id: 'roll',
    min: 3,
    stackDelta: -2
  }, null, null, null, {
    id: 'hflex',
    min: 7,
    resetStack: true
  }, {
    id: 'flex',
    min: 13,
    resetStack: true
  }, {
    id: 'hflex1',
    min: 9,
    resetStack: true
  }, {
    id: 'flex1',
    min: 11,
    resetStack: true
  }];

  function CFFParser(file, properties, seacAnalysisEnabled) {
    this.bytes = file.getBytes();
    this.properties = properties;
    this.seacAnalysisEnabled = !!seacAnalysisEnabled;
  }

  CFFParser.prototype = {
    parse: function CFFParser_parse() {
      var properties = this.properties;
      var cff = new CFF();
      this.cff = cff;
      var header = this.parseHeader();
      var nameIndex = this.parseIndex(header.endPos);
      var topDictIndex = this.parseIndex(nameIndex.endPos);
      var stringIndex = this.parseIndex(topDictIndex.endPos);
      var globalSubrIndex = this.parseIndex(stringIndex.endPos);
      var topDictParsed = this.parseDict(topDictIndex.obj.get(0));
      var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
      cff.header = header.obj;
      cff.names = this.parseNameIndex(nameIndex.obj);
      cff.strings = this.parseStringIndex(stringIndex.obj);
      cff.topDict = topDict;
      cff.globalSubrIndex = globalSubrIndex.obj;
      this.parsePrivateDict(cff.topDict);
      cff.isCIDFont = topDict.hasName('ROS');
      var charStringOffset = topDict.getByName('CharStrings');
      var charStringIndex = this.parseIndex(charStringOffset).obj;
      var fontMatrix = topDict.getByName('FontMatrix');

      if (fontMatrix) {
        properties.fontMatrix = fontMatrix;
      }

      var fontBBox = topDict.getByName('FontBBox');

      if (fontBBox) {
        properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
        properties.descent = Math.min(fontBBox[1], fontBBox[3]);
        properties.ascentScaled = true;
      }

      var charset, encoding;

      if (cff.isCIDFont) {
        var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;

        for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
          var dictRaw = fdArrayIndex.get(i);
          var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings);
          this.parsePrivateDict(fontDict);
          cff.fdArray.push(fontDict);
        }

        encoding = null;
        charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, true);
        cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'), charStringIndex.count);
      } else {
        charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, false);
        encoding = this.parseEncoding(topDict.getByName('Encoding'), properties, cff.strings, charset.charset);
      }

      cff.charset = charset;
      cff.encoding = encoding;
      var charStringsAndSeacs = this.parseCharStrings({
        charStrings: charStringIndex,
        localSubrIndex: topDict.privateDict.subrsIndex,
        globalSubrIndex: globalSubrIndex.obj,
        fdSelect: cff.fdSelect,
        fdArray: cff.fdArray,
        privateDict: topDict.privateDict
      });
      cff.charStrings = charStringsAndSeacs.charStrings;
      cff.seacs = charStringsAndSeacs.seacs;
      cff.widths = charStringsAndSeacs.widths;
      return cff;
    },
    parseHeader: function CFFParser_parseHeader() {
      var bytes = this.bytes;
      var bytesLength = bytes.length;
      var offset = 0;

      while (offset < bytesLength && bytes[offset] !== 1) {
        ++offset;
      }

      if (offset >= bytesLength) {
        throw new _util.FormatError('Invalid CFF header');
      }

      if (offset !== 0) {
        (0, _util.info)('cff data is shifted');
        bytes = bytes.subarray(offset);
        this.bytes = bytes;
      }

      var major = bytes[0];
      var minor = bytes[1];
      var hdrSize = bytes[2];
      var offSize = bytes[3];
      var header = new CFFHeader(major, minor, hdrSize, offSize);
      return {
        obj: header,
        endPos: hdrSize
      };
    },
    parseDict: function CFFParser_parseDict(dict) {
      var pos = 0;

      function parseOperand() {
        var value = dict[pos++];

        if (value === 30) {
          return parseFloatOperand();
        } else if (value === 28) {
          value = dict[pos++];
          value = (value << 24 | dict[pos++] << 16) >> 16;
          return value;
        } else if (value === 29) {
          value = dict[pos++];
          value = value << 8 | dict[pos++];
          value = value << 8 | dict[pos++];
          value = value << 8 | dict[pos++];
          return value;
        } else if (value >= 32 && value <= 246) {
          return value - 139;
        } else if (value >= 247 && value <= 250) {
          return (value - 247) * 256 + dict[pos++] + 108;
        } else if (value >= 251 && value <= 254) {
          return -((value - 251) * 256) - dict[pos++] - 108;
        }

        (0, _util.warn)('CFFParser_parseDict: "' + value + '" is a reserved command.');
        return NaN;
      }

      function parseFloatOperand() {
        var str = '';
        var eof = 15;
        var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'E', 'E-', null, '-'];
        var length = dict.length;

        while (pos < length) {
          var b = dict[pos++];
          var b1 = b >> 4;
          var b2 = b & 15;

          if (b1 === eof) {
            break;
          }

          str += lookup[b1];

          if (b2 === eof) {
            break;
          }

          str += lookup[b2];
        }

        return parseFloat(str);
      }

      var operands = [];
      var entries = [];
      pos = 0;
      var end = dict.length;

      while (pos < end) {
        var b = dict[pos];

        if (b <= 21) {
          if (b === 12) {
            b = b << 8 | dict[++pos];
          }

          entries.push([b, operands]);
          operands = [];
          ++pos;
        } else {
          operands.push(parseOperand());
        }
      }

      return entries;
    },
    parseIndex: function CFFParser_parseIndex(pos) {
      var cffIndex = new CFFIndex();
      var bytes = this.bytes;
      var count = bytes[pos++] << 8 | bytes[pos++];
      var offsets = [];
      var end = pos;
      var i, ii;

      if (count !== 0) {
        var offsetSize = bytes[pos++];
        var startPos = pos + (count + 1) * offsetSize - 1;

        for (i = 0, ii = count + 1; i < ii; ++i) {
          var offset = 0;

          for (var j = 0; j < offsetSize; ++j) {
            offset <<= 8;
            offset += bytes[pos++];
          }

          offsets.push(startPos + offset);
        }

        end = offsets[count];
      }

      for (i = 0, ii = offsets.length - 1; i < ii; ++i) {
        var offsetStart = offsets[i];
        var offsetEnd = offsets[i + 1];
        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
      }

      return {
        obj: cffIndex,
        endPos: end
      };
    },
    parseNameIndex: function CFFParser_parseNameIndex(index) {
      var names = [];

      for (var i = 0, ii = index.count; i < ii; ++i) {
        var name = index.get(i);
        names.push((0, _util.bytesToString)(name));
      }

      return names;
    },
    parseStringIndex: function CFFParser_parseStringIndex(index) {
      var strings = new CFFStrings();

      for (var i = 0, ii = index.count; i < ii; ++i) {
        var data = index.get(i);
        strings.add((0, _util.bytesToString)(data));
      }

      return strings;
    },
    createDict: function CFFParser_createDict(Type, dict, strings) {
      var cffDict = new Type(strings);

      for (var i = 0, ii = dict.length; i < ii; ++i) {
        var pair = dict[i];
        var key = pair[0];
        var value = pair[1];
        cffDict.setByKey(key, value);
      }

      return cffDict;
    },
    parseCharString: function CFFParser_parseCharString(state, data, localSubrIndex, globalSubrIndex) {
      if (!data || state.callDepth > MAX_SUBR_NESTING) {
        return false;
      }

      var stackSize = state.stackSize;
      var stack = state.stack;
      var length = data.length;

      for (var j = 0; j < length;) {
        var value = data[j++];
        var validationCommand = null;

        if (value === 12) {
          var q = data[j++];

          if (q === 0) {
            data[j - 2] = 139;
            data[j - 1] = 22;
            stackSize = 0;
          } else {
            validationCommand = CharstringValidationData12[q];
          }
        } else if (value === 28) {
          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16;
          j += 2;
          stackSize++;
        } else if (value === 14) {
          if (stackSize >= 4) {
            stackSize -= 4;

            if (this.seacAnalysisEnabled) {
              state.seac = stack.slice(stackSize, stackSize + 4);
              return false;
            }
          }

          validationCommand = CharstringValidationData[value];
        } else if (value >= 32 && value <= 246) {
          stack[stackSize] = value - 139;
          stackSize++;
        } else if (value >= 247 && value <= 254) {
          stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108;
          j++;
          stackSize++;
        } else if (value === 255) {
          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536;
          j += 4;
          stackSize++;
        } else if (value === 19 || value === 20) {
          state.hints += stackSize >> 1;
          j += state.hints + 7 >> 3;
          stackSize %= 2;
          validationCommand = CharstringValidationData[value];
        } else if (value === 10 || value === 29) {
          var subrsIndex;

          if (value === 10) {
            subrsIndex = localSubrIndex;
          } else {
            subrsIndex = globalSubrIndex;
          }

          if (!subrsIndex) {
            validationCommand = CharstringValidationData[value];
            (0, _util.warn)('Missing subrsIndex for ' + validationCommand.id);
            return false;
          }

          var bias = 32768;

          if (subrsIndex.count < 1240) {
            bias = 107;
          } else if (subrsIndex.count < 33900) {
            bias = 1131;
          }

          var subrNumber = stack[--stackSize] + bias;

          if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) {
            validationCommand = CharstringValidationData[value];
            (0, _util.warn)('Out of bounds subrIndex for ' + validationCommand.id);
            return false;
          }

          state.stackSize = stackSize;
          state.callDepth++;
          var valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex);

          if (!valid) {
            return false;
          }

          state.callDepth--;
          stackSize = state.stackSize;
          continue;
        } else if (value === 11) {
          state.stackSize = stackSize;
          return true;
        } else {
          validationCommand = CharstringValidationData[value];
        }

        if (validationCommand) {
          if (validationCommand.stem) {
            state.hints += stackSize >> 1;

            if (value === 3 || value === 23) {
              state.hasVStems = true;
            } else if (state.hasVStems && (value === 1 || value === 18)) {
              (0, _util.warn)('CFF stem hints are in wrong order');
              data[j - 1] = value === 1 ? 3 : 23;
            }
          }

          if ('min' in validationCommand) {
            if (!state.undefStack && stackSize < validationCommand.min) {
              (0, _util.warn)('Not enough parameters for ' + validationCommand.id + '; actual: ' + stackSize + ', expected: ' + validationCommand.min);
              return false;
            }
          }

          if (state.firstStackClearing && validationCommand.stackClearing) {
            state.firstStackClearing = false;
            stackSize -= validationCommand.min;

            if (stackSize >= 2 && validationCommand.stem) {
              stackSize %= 2;
            } else if (stackSize > 1) {
              (0, _util.warn)('Found too many parameters for stack-clearing command');
            }

            if (stackSize > 0 && stack[stackSize - 1] >= 0) {
              state.width = stack[stackSize - 1];
            }
          }

          if ('stackDelta' in validationCommand) {
            if ('stackFn' in validationCommand) {
              validationCommand.stackFn(stack, stackSize);
            }

            stackSize += validationCommand.stackDelta;
          } else if (validationCommand.stackClearing) {
            stackSize = 0;
          } else if (validationCommand.resetStack) {
            stackSize = 0;
            state.undefStack = false;
          } else if (validationCommand.undefStack) {
            stackSize = 0;
            state.undefStack = true;
            state.firstStackClearing = false;
          }
        }
      }

      state.stackSize = stackSize;
      return true;
    },
    parseCharStrings: function parseCharStrings(_ref) {
      var charStrings = _ref.charStrings,
          localSubrIndex = _ref.localSubrIndex,
          globalSubrIndex = _ref.globalSubrIndex,
          fdSelect = _ref.fdSelect,
          fdArray = _ref.fdArray,
          privateDict = _ref.privateDict;
      var seacs = [];
      var widths = [];
      var count = charStrings.count;

      for (var i = 0; i < count; i++) {
        var charstring = charStrings.get(i);
        var state = {
          callDepth: 0,
          stackSize: 0,
          stack: [],
          undefStack: true,
          hints: 0,
          firstStackClearing: true,
          seac: null,
          width: null,
          hasVStems: false
        };
        var valid = true;
        var localSubrToUse = null;
        var privateDictToUse = privateDict;

        if (fdSelect && fdArray.length) {
          var fdIndex = fdSelect.getFDIndex(i);

          if (fdIndex === -1) {
            (0, _util.warn)('Glyph index is not in fd select.');
            valid = false;
          }

          if (fdIndex >= fdArray.length) {
            (0, _util.warn)('Invalid fd index for glyph index.');
            valid = false;
          }

          if (valid) {
            privateDictToUse = fdArray[fdIndex].privateDict;
            localSubrToUse = privateDictToUse.subrsIndex;
          }
        } else if (localSubrIndex) {
          localSubrToUse = localSubrIndex;
        }

        if (valid) {
          valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex);
        }

        if (state.width !== null) {
          var nominalWidth = privateDictToUse.getByName('nominalWidthX');
          widths[i] = nominalWidth + state.width;
        } else {
          var defaultWidth = privateDictToUse.getByName('defaultWidthX');
          widths[i] = defaultWidth;
        }

        if (state.seac !== null) {
          seacs[i] = state.seac;
        }

        if (!valid) {
          charStrings.set(i, new Uint8Array([14]));
        }
      }

      return {
        charStrings: charStrings,
        seacs: seacs,
        widths: widths
      };
    },
    emptyPrivateDictionary: function CFFParser_emptyPrivateDictionary(parentDict) {
      var privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings);
      parentDict.setByKey(18, [0, 0]);
      parentDict.privateDict = privateDict;
    },
    parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
      if (!parentDict.hasName('Private')) {
        this.emptyPrivateDictionary(parentDict);
        return;
      }

      var privateOffset = parentDict.getByName('Private');

      if (!Array.isArray(privateOffset) || privateOffset.length !== 2) {
        parentDict.removeByName('Private');
        return;
      }

      var size = privateOffset[0];
      var offset = privateOffset[1];

      if (size === 0 || offset >= this.bytes.length) {
        this.emptyPrivateDictionary(parentDict);
        return;
      }

      var privateDictEnd = offset + size;
      var dictData = this.bytes.subarray(offset, privateDictEnd);
      var dict = this.parseDict(dictData);
      var privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings);
      parentDict.privateDict = privateDict;

      if (!privateDict.getByName('Subrs')) {
        return;
      }

      var subrsOffset = privateDict.getByName('Subrs');
      var relativeOffset = offset + subrsOffset;

      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
        this.emptyPrivateDictionary(parentDict);
        return;
      }

      var subrsIndex = this.parseIndex(relativeOffset);
      privateDict.subrsIndex = subrsIndex.obj;
    },
    parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {
      if (pos === 0) {
        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, _charsets.ISOAdobeCharset);
      } else if (pos === 1) {
        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, _charsets.ExpertCharset);
      } else if (pos === 2) {
        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, _charsets.ExpertSubsetCharset);
      }

      var bytes = this.bytes;
      var start = pos;
      var format = bytes[pos++];
      var charset = ['.notdef'];
      var id, count, i;
      length -= 1;

      switch (format) {
        case 0:
          for (i = 0; i < length; i++) {
            id = bytes[pos++] << 8 | bytes[pos++];
            charset.push(cid ? id : strings.get(id));
          }

          break;

        case 1:
          while (charset.length <= length) {
            id = bytes[pos++] << 8 | bytes[pos++];
            count = bytes[pos++];

            for (i = 0; i <= count; i++) {
              charset.push(cid ? id++ : strings.get(id++));
            }
          }

          break;

        case 2:
          while (charset.length <= length) {
            id = bytes[pos++] << 8 | bytes[pos++];
            count = bytes[pos++] << 8 | bytes[pos++];

            for (i = 0; i <= count; i++) {
              charset.push(cid ? id++ : strings.get(id++));
            }
          }

          break;

        default:
          throw new _util.FormatError('Unknown charset format');
      }

      var end = pos;
      var raw = bytes.subarray(start, end);
      return new CFFCharset(false, format, charset, raw);
    },
    parseEncoding: function CFFParser_parseEncoding(pos, properties, strings, charset) {
      var encoding = Object.create(null);
      var bytes = this.bytes;
      var predefined = false;
      var format, i, ii;
      var raw = null;

      function readSupplement() {
        var supplementsCount = bytes[pos++];

        for (i = 0; i < supplementsCount; i++) {
          var code = bytes[pos++];
          var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
          encoding[code] = charset.indexOf(strings.get(sid));
        }
      }

      if (pos === 0 || pos === 1) {
        predefined = true;
        format = pos;
        var baseEncoding = pos ? _encodings.ExpertEncoding : _encodings.StandardEncoding;

        for (i = 0, ii = charset.length; i < ii; i++) {
          var index = baseEncoding.indexOf(charset[i]);

          if (index !== -1) {
            encoding[index] = i;
          }
        }
      } else {
        var dataStart = pos;
        format = bytes[pos++];

        switch (format & 0x7f) {
          case 0:
            var glyphsCount = bytes[pos++];

            for (i = 1; i <= glyphsCount; i++) {
              encoding[bytes[pos++]] = i;
            }

            break;

          case 1:
            var rangesCount = bytes[pos++];
            var gid = 1;

            for (i = 0; i < rangesCount; i++) {
              var start = bytes[pos++];
              var left = bytes[pos++];

              for (var j = start; j <= start + left; j++) {
                encoding[j] = gid++;
              }
            }

            break;

          default:
            throw new _util.FormatError("Unknown encoding format: ".concat(format, " in CFF"));
        }

        var dataEnd = pos;

        if (format & 0x80) {
          bytes[dataStart] &= 0x7f;
          readSupplement();
        }

        raw = bytes.subarray(dataStart, dataEnd);
      }

      format = format & 0x7f;
      return new CFFEncoding(predefined, format, encoding, raw);
    },
    parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
      var bytes = this.bytes;
      var format = bytes[pos++];
      var fdSelect = [];
      var i;

      switch (format) {
        case 0:
          for (i = 0; i < length; ++i) {
            var id = bytes[pos++];
            fdSelect.push(id);
          }

          break;

        case 3:
          var rangesCount = bytes[pos++] << 8 | bytes[pos++];

          for (i = 0; i < rangesCount; ++i) {
            var first = bytes[pos++] << 8 | bytes[pos++];

            if (i === 0 && first !== 0) {
              (0, _util.warn)('parseFDSelect: The first range must have a first GID of 0' + ' -- trying to recover.');
              first = 0;
            }

            var fdIndex = bytes[pos++];
            var next = bytes[pos] << 8 | bytes[pos + 1];

            for (var j = first; j < next; ++j) {
              fdSelect.push(fdIndex);
            }
          }

          pos += 2;
          break;

        default:
          throw new _util.FormatError("parseFDSelect: Unknown format \"".concat(format, "\"."));
      }

      if (fdSelect.length !== length) {
        throw new _util.FormatError('parseFDSelect: Invalid font data.');
      }

      return new CFFFDSelect(format, fdSelect);
    }
  };
  return CFFParser;
}();

exports.CFFParser = CFFParser;

var CFF = function CFFClosure() {
  function CFF() {
    this.header = null;
    this.names = [];
    this.topDict = null;
    this.strings = new CFFStrings();
    this.globalSubrIndex = null;
    this.encoding = null;
    this.charset = null;
    this.charStrings = null;
    this.fdArray = [];
    this.fdSelect = null;
    this.isCIDFont = false;
  }

  CFF.prototype = {
    duplicateFirstGlyph: function CFF_duplicateFirstGlyph() {
      if (this.charStrings.count >= 65535) {
        (0, _util.warn)('Not enough space in charstrings to duplicate first glyph.');
        return;
      }

      var glyphZero = this.charStrings.get(0);
      this.charStrings.add(glyphZero);

      if (this.isCIDFont) {
        this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]);
      }
    },
    hasGlyphId: function CFF_hasGlyphID(id) {
      if (id < 0 || id >= this.charStrings.count) {
        return false;
      }

      var glyph = this.charStrings.get(id);
      return glyph.length > 0;
    }
  };
  return CFF;
}();

exports.CFF = CFF;

var CFFHeader = function CFFHeaderClosure() {
  function CFFHeader(major, minor, hdrSize, offSize) {
    this.major = major;
    this.minor = minor;
    this.hdrSize = hdrSize;
    this.offSize = offSize;
  }

  return CFFHeader;
}();

exports.CFFHeader = CFFHeader;

var CFFStrings = function CFFStringsClosure() {
  function CFFStrings() {
    this.strings = [];
  }

  CFFStrings.prototype = {
    get: function CFFStrings_get(index) {
      if (index >= 0 && index <= 390) {
        return CFFStandardStrings[index];
      }

      if (index - 391 <= this.strings.length) {
        return this.strings[index - 391];
      }

      return CFFStandardStrings[0];
    },
    add: function CFFStrings_add(value) {
      this.strings.push(value);
    },

    get count() {
      return this.strings.length;
    }

  };
  return CFFStrings;
}();

exports.CFFStrings = CFFStrings;

var CFFIndex = function CFFIndexClosure() {
  function CFFIndex() {
    this.objects = [];
    this.length = 0;
  }

  CFFIndex.prototype = {
    add: function CFFIndex_add(data) {
      this.length += data.length;
      this.objects.push(data);
    },
    set: function CFFIndex_set(index, data) {
      this.length += data.length - this.objects[index].length;
      this.objects[index] = data;
    },
    get: function CFFIndex_get(index) {
      return this.objects[index];
    },

    get count() {
      return this.objects.length;
    }

  };
  return CFFIndex;
}();

exports.CFFIndex = CFFIndex;

var CFFDict = function CFFDictClosure() {
  function CFFDict(tables, strings) {
    this.keyToNameMap = tables.keyToNameMap;
    this.nameToKeyMap = tables.nameToKeyMap;
    this.defaults = tables.defaults;
    this.types = tables.types;
    this.opcodes = tables.opcodes;
    this.order = tables.order;
    this.strings = strings;
    this.values = Object.create(null);
  }

  CFFDict.prototype = {
    setByKey: function CFFDict_setByKey(key, value) {
      if (!(key in this.keyToNameMap)) {
        return false;
      }

      var valueLength = value.length;

      if (valueLength === 0) {
        return true;
      }

      for (var i = 0; i < valueLength; i++) {
        if (isNaN(value[i])) {
          (0, _util.warn)('Invalid CFFDict value: "' + value + '" for key "' + key + '".');
          return true;
        }
      }

      var type = this.types[key];

      if (type === 'num' || type === 'sid' || type === 'offset') {
        value = value[0];
      }

      this.values[key] = value;
      return true;
    },
    setByName: function CFFDict_setByName(name, value) {
      if (!(name in this.nameToKeyMap)) {
        throw new _util.FormatError("Invalid dictionary name \"".concat(name, "\""));
      }

      this.values[this.nameToKeyMap[name]] = value;
    },
    hasName: function CFFDict_hasName(name) {
      return this.nameToKeyMap[name] in this.values;
    },
    getByName: function CFFDict_getByName(name) {
      if (!(name in this.nameToKeyMap)) {
        throw new _util.FormatError("Invalid dictionary name ".concat(name, "\""));
      }

      var key = this.nameToKeyMap[name];

      if (!(key in this.values)) {
        return this.defaults[key];
      }

      return this.values[key];
    },
    removeByName: function CFFDict_removeByName(name) {
      delete this.values[this.nameToKeyMap[name]];
    }
  };

  CFFDict.createTables = function CFFDict_createTables(layout) {
    var tables = {
      keyToNameMap: {},
      nameToKeyMap: {},
      defaults: {},
      types: {},
      opcodes: {},
      order: []
    };

    for (var i = 0, ii = layout.length; i < ii; ++i) {
      var entry = layout[i];
      var key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
      tables.keyToNameMap[key] = entry[1];
      tables.nameToKeyMap[entry[1]] = key;
      tables.types[key] = entry[2];
      tables.defaults[key] = entry[3];
      tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]];
      tables.order.push(key);
    }

    return tables;
  };

  return CFFDict;
}();

var CFFTopDict = function CFFTopDictClosure() {
  var layout = [[[12, 30], 'ROS', ['sid', 'sid', 'num'], null], [[12, 20], 'SyntheticBase', 'num', null], [0, 'version', 'sid', null], [1, 'Notice', 'sid', null], [[12, 0], 'Copyright', 'sid', null], [2, 'FullName', 'sid', null], [3, 'FamilyName', 'sid', null], [4, 'Weight', 'sid', null], [[12, 1], 'isFixedPitch', 'num', 0], [[12, 2], 'ItalicAngle', 'num', 0], [[12, 3], 'UnderlinePosition', 'num', -100], [[12, 4], 'UnderlineThickness', 'num', 50], [[12, 5], 'PaintType', 'num', 0], [[12, 6], 'CharstringType', 'num', 2], [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'], [0.001, 0, 0, 0.001, 0, 0]], [13, 'UniqueID', 'num', null], [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]], [[12, 8], 'StrokeWidth', 'num', 0], [14, 'XUID', 'array', null], [15, 'charset', 'offset', 0], [16, 'Encoding', 'offset', 0], [17, 'CharStrings', 'offset', 0], [18, 'Private', ['offset', 'offset'], null], [[12, 21], 'PostScript', 'sid', null], [[12, 22], 'BaseFontName', 'sid', null], [[12, 23], 'BaseFontBlend', 'delta', null], [[12, 31], 'CIDFontVersion', 'num', 0], [[12, 32], 'CIDFontRevision', 'num', 0], [[12, 33], 'CIDFontType', 'num', 0], [[12, 34], 'CIDCount', 'num', 8720], [[12, 35], 'UIDBase', 'num', null], [[12, 37], 'FDSelect', 'offset', null], [[12, 36], 'FDArray', 'offset', null], [[12, 38], 'FontName', 'sid', null]];
  var tables = null;

  function CFFTopDict(strings) {
    if (tables === null) {
      tables = CFFDict.createTables(layout);
    }

    CFFDict.call(this, tables, strings);
    this.privateDict = null;
  }

  CFFTopDict.prototype = Object.create(CFFDict.prototype);
  return CFFTopDict;
}();

exports.CFFTopDict = CFFTopDict;

var CFFPrivateDict = function CFFPrivateDictClosure() {
  var layout = [[6, 'BlueValues', 'delta', null], [7, 'OtherBlues', 'delta', null], [8, 'FamilyBlues', 'delta', null], [9, 'FamilyOtherBlues', 'delta', null], [[12, 9], 'BlueScale', 'num', 0.039625], [[12, 10], 'BlueShift', 'num', 7], [[12, 11], 'BlueFuzz', 'num', 1], [10, 'StdHW', 'num', null], [11, 'StdVW', 'num', null], [[12, 12], 'StemSnapH', 'delta', null], [[12, 13], 'StemSnapV', 'delta', null], [[12, 14], 'ForceBold', 'num', 0], [[12, 17], 'LanguageGroup', 'num', 0], [[12, 18], 'ExpansionFactor', 'num', 0.06], [[12, 19], 'initialRandomSeed', 'num', 0], [20, 'defaultWidthX', 'num', 0], [21, 'nominalWidthX', 'num', 0], [19, 'Subrs', 'offset', null]];
  var tables = null;

  function CFFPrivateDict(strings) {
    if (tables === null) {
      tables = CFFDict.createTables(layout);
    }

    CFFDict.call(this, tables, strings);
    this.subrsIndex = null;
  }

  CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
  return CFFPrivateDict;
}();

exports.CFFPrivateDict = CFFPrivateDict;
var CFFCharsetPredefinedTypes = {
  ISO_ADOBE: 0,
  EXPERT: 1,
  EXPERT_SUBSET: 2
};

var CFFCharset = function CFFCharsetClosure() {
  function CFFCharset(predefined, format, charset, raw) {
    this.predefined = predefined;
    this.format = format;
    this.charset = charset;
    this.raw = raw;
  }

  return CFFCharset;
}();

exports.CFFCharset = CFFCharset;

var CFFEncoding = function CFFEncodingClosure() {
  function CFFEncoding(predefined, format, encoding, raw) {
    this.predefined = predefined;
    this.format = format;
    this.encoding = encoding;
    this.raw = raw;
  }

  return CFFEncoding;
}();

var CFFFDSelect = function CFFFDSelectClosure() {
  function CFFFDSelect(format, fdSelect) {
    this.format = format;
    this.fdSelect = fdSelect;
  }

  CFFFDSelect.prototype = {
    getFDIndex: function CFFFDSelect_get(glyphIndex) {
      if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {
        return -1;
      }

      return this.fdSelect[glyphIndex];
    }
  };
  return CFFFDSelect;
}();

exports.CFFFDSelect = CFFFDSelect;

var CFFOffsetTracker = function CFFOffsetTrackerClosure() {
  function CFFOffsetTracker() {
    this.offsets = Object.create(null);
  }

  CFFOffsetTracker.prototype = {
    isTracking: function CFFOffsetTracker_isTracking(key) {
      return key in this.offsets;
    },
    track: function CFFOffsetTracker_track(key, location) {
      if (key in this.offsets) {
        throw new _util.FormatError("Already tracking location of ".concat(key));
      }

      this.offsets[key] = location;
    },
    offset: function CFFOffsetTracker_offset(value) {
      for (var key in this.offsets) {
        this.offsets[key] += value;
      }
    },
    setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, values, output) {
      if (!(key in this.offsets)) {
        throw new _util.FormatError("Not tracking location of ".concat(key));
      }

      var data = output.data;
      var dataOffset = this.offsets[key];
      var size = 5;

      for (var i = 0, ii = values.length; i < ii; ++i) {
        var offset0 = i * size + dataOffset;
        var offset1 = offset0 + 1;
        var offset2 = offset0 + 2;
        var offset3 = offset0 + 3;
        var offset4 = offset0 + 4;

        if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {
          throw new _util.FormatError('writing to an offset that is not empty');
        }

        var value = values[i];
        data[offset0] = 0x1d;
        data[offset1] = value >> 24 & 0xFF;
        data[offset2] = value >> 16 & 0xFF;
        data[offset3] = value >> 8 & 0xFF;
        data[offset4] = value & 0xFF;
      }
    }
  };
  return CFFOffsetTracker;
}();

var CFFCompiler = function CFFCompilerClosure() {
  function CFFCompiler(cff) {
    this.cff = cff;
  }

  CFFCompiler.prototype = {
    compile: function CFFCompiler_compile() {
      var cff = this.cff;
      var output = {
        data: [],
        length: 0,
        add: function CFFCompiler_add(data) {
          this.data = this.data.concat(data);
          this.length = this.data.length;
        }
      };
      var header = this.compileHeader(cff.header);
      output.add(header);
      var nameIndex = this.compileNameIndex(cff.names);
      output.add(nameIndex);

      if (cff.isCIDFont) {
        if (cff.topDict.hasName('FontMatrix')) {
          var base = cff.topDict.getByName('FontMatrix');
          cff.topDict.removeByName('FontMatrix');

          for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {
            var subDict = cff.fdArray[i];
            var matrix = base.slice(0);

            if (subDict.hasName('FontMatrix')) {
              matrix = _util.Util.transform(matrix, subDict.getByName('FontMatrix'));
            }

            subDict.setByName('FontMatrix', matrix);
          }
        }
      }

      cff.topDict.setByName('charset', 0);
      var compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont);
      output.add(compiled.output);
      var topDictTracker = compiled.trackers[0];
      var stringIndex = this.compileStringIndex(cff.strings.strings);
      output.add(stringIndex);
      var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
      output.add(globalSubrIndex);

      if (cff.encoding && cff.topDict.hasName('Encoding')) {
        if (cff.encoding.predefined) {
          topDictTracker.setEntryLocation('Encoding', [cff.encoding.format], output);
        } else {
          var encoding = this.compileEncoding(cff.encoding);
          topDictTracker.setEntryLocation('Encoding', [output.length], output);
          output.add(encoding);
        }
      }

      var charset = this.compileCharset(cff.charset);
      topDictTracker.setEntryLocation('charset', [output.length], output);
      output.add(charset);
      var charStrings = this.compileCharStrings(cff.charStrings);
      topDictTracker.setEntryLocation('CharStrings', [output.length], output);
      output.add(charStrings);

      if (cff.isCIDFont) {
        topDictTracker.setEntryLocation('FDSelect', [output.length], output);
        var fdSelect = this.compileFDSelect(cff.fdSelect);
        output.add(fdSelect);
        compiled = this.compileTopDicts(cff.fdArray, output.length, true);
        topDictTracker.setEntryLocation('FDArray', [output.length], output);
        output.add(compiled.output);
        var fontDictTrackers = compiled.trackers;
        this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
      }

      this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
      output.add([0]);
      return output.data;
    },
    encodeNumber: function CFFCompiler_encodeNumber(value) {
      if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) {
        return this.encodeInteger(value);
      }

      return this.encodeFloat(value);
    },
    encodeFloat: function CFFCompiler_encodeFloat(num) {
      var value = num.toString();
      var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value);

      if (m) {
        var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length));
        value = (Math.round(num * epsilon) / epsilon).toString();
      }

      var nibbles = '';
      var i, ii;

      for (i = 0, ii = value.length; i < ii; ++i) {
        var a = value[i];

        if (a === 'e') {
          nibbles += value[++i] === '-' ? 'c' : 'b';
        } else if (a === '.') {
          nibbles += 'a';
        } else if (a === '-') {
          nibbles += 'e';
        } else {
          nibbles += a;
        }
      }

      nibbles += nibbles.length & 1 ? 'f' : 'ff';
      var out = [30];

      for (i = 0, ii = nibbles.length; i < ii; i += 2) {
        out.push(parseInt(nibbles.substring(i, i + 2), 16));
      }

      return out;
    },
    encodeInteger: function CFFCompiler_encodeInteger(value) {
      var code;

      if (value >= -107 && value <= 107) {
        code = [value + 139];
      } else if (value >= 108 && value <= 1131) {
        value = value - 108;
        code = [(value >> 8) + 247, value & 0xFF];
      } else if (value >= -1131 && value <= -108) {
        value = -value - 108;
        code = [(value >> 8) + 251, value & 0xFF];
      } else if (value >= -32768 && value <= 32767) {
        code = [0x1c, value >> 8 & 0xFF, value & 0xFF];
      } else {
        code = [0x1d, value >> 24 & 0xFF, value >> 16 & 0xFF, value >> 8 & 0xFF, value & 0xFF];
      }

      return code;
    },
    compileHeader: function CFFCompiler_compileHeader(header) {
      return [header.major, header.minor, header.hdrSize, header.offSize];
    },
    compileNameIndex: function CFFCompiler_compileNameIndex(names) {
      var nameIndex = new CFFIndex();

      for (var i = 0, ii = names.length; i < ii; ++i) {
        var name = names[i];
        var length = Math.min(name.length, 127);
        var sanitizedName = new Array(length);

        for (var j = 0; j < length; j++) {
          var char = name[j];

          if (char < '!' || char > '~' || char === '[' || char === ']' || char === '(' || char === ')' || char === '{' || char === '}' || char === '<' || char === '>' || char === '/' || char === '%') {
            char = '_';
          }

          sanitizedName[j] = char;
        }

        sanitizedName = sanitizedName.join('');

        if (sanitizedName === '') {
          sanitizedName = 'Bad_Font_Name';
        }

        nameIndex.add((0, _util.stringToBytes)(sanitizedName));
      }

      return this.compileIndex(nameIndex);
    },
    compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length, removeCidKeys) {
      var fontDictTrackers = [];
      var fdArrayIndex = new CFFIndex();

      for (var i = 0, ii = dicts.length; i < ii; ++i) {
        var fontDict = dicts[i];

        if (removeCidKeys) {
          fontDict.removeByName('CIDFontVersion');
          fontDict.removeByName('CIDFontRevision');
          fontDict.removeByName('CIDFontType');
          fontDict.removeByName('CIDCount');
          fontDict.removeByName('UIDBase');
        }

        var fontDictTracker = new CFFOffsetTracker();
        var fontDictData = this.compileDict(fontDict, fontDictTracker);
        fontDictTrackers.push(fontDictTracker);
        fdArrayIndex.add(fontDictData);
        fontDictTracker.offset(length);
      }

      fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
      return {
        trackers: fontDictTrackers,
        output: fdArrayIndex
      };
    },
    compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts, trackers, output) {
      for (var i = 0, ii = dicts.length; i < ii; ++i) {
        var fontDict = dicts[i];
        var privateDict = fontDict.privateDict;

        if (!privateDict || !fontDict.hasName('Private')) {
          throw new _util.FormatError('There must be a private dictionary.');
        }

        var privateDictTracker = new CFFOffsetTracker();
        var privateDictData = this.compileDict(privateDict, privateDictTracker);
        var outputLength = output.length;
        privateDictTracker.offset(outputLength);

        if (!privateDictData.length) {
          outputLength = 0;
        }

        trackers[i].setEntryLocation('Private', [privateDictData.length, outputLength], output);
        output.add(privateDictData);

        if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
          var subrs = this.compileIndex(privateDict.subrsIndex);
          privateDictTracker.setEntryLocation('Subrs', [privateDictData.length], output);
          output.add(subrs);
        }
      }
    },
    compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
      var out = [];
      var order = dict.order;

      for (var i = 0; i < order.length; ++i) {
        var key = order[i];

        if (!(key in dict.values)) {
          continue;
        }

        var values = dict.values[key];
        var types = dict.types[key];

        if (!Array.isArray(types)) {
          types = [types];
        }

        if (!Array.isArray(values)) {
          values = [values];
        }

        if (values.length === 0) {
          continue;
        }

        for (var j = 0, jj = types.length; j < jj; ++j) {
          var type = types[j];
          var value = values[j];

          switch (type) {
            case 'num':
            case 'sid':
              out = out.concat(this.encodeNumber(value));
              break;

            case 'offset':
              var name = dict.keyToNameMap[key];

              if (!offsetTracker.isTracking(name)) {
                offsetTracker.track(name, out.length);
              }

              out = out.concat([0x1d, 0, 0, 0, 0]);
              break;

            case 'array':
            case 'delta':
              out = out.concat(this.encodeNumber(value));

              for (var k = 1, kk = values.length; k < kk; ++k) {
                out = out.concat(this.encodeNumber(values[k]));
              }

              break;

            default:
              throw new _util.FormatError("Unknown data type of ".concat(type));
          }
        }

        out = out.concat(dict.opcodes[key]);
      }

      return out;
    },
    compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
      var stringIndex = new CFFIndex();

      for (var i = 0, ii = strings.length; i < ii; ++i) {
        stringIndex.add((0, _util.stringToBytes)(strings[i]));
      }

      return this.compileIndex(stringIndex);
    },
    compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
      var globalSubrIndex = this.cff.globalSubrIndex;
      this.out.writeByteArray(this.compileIndex(globalSubrIndex));
    },
    compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
      var charStringsIndex = new CFFIndex();

      for (var i = 0; i < charStrings.count; i++) {
        var glyph = charStrings.get(i);

        if (glyph.length === 0) {
          charStringsIndex.add(new Uint8Array([0x8B, 0x0E]));
          continue;
        }

        charStringsIndex.add(glyph);
      }

      return this.compileIndex(charStringsIndex);
    },
    compileCharset: function CFFCompiler_compileCharset(charset) {
      var length = 1 + (this.cff.charStrings.count - 1) * 2;
      var out = new Uint8Array(length);
      return this.compileTypedArray(out);
    },
    compileEncoding: function CFFCompiler_compileEncoding(encoding) {
      return this.compileTypedArray(encoding.raw);
    },
    compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
      var format = fdSelect.format;
      var out, i;

      switch (format) {
        case 0:
          out = new Uint8Array(1 + fdSelect.fdSelect.length);
          out[0] = format;

          for (i = 0; i < fdSelect.fdSelect.length; i++) {
            out[i + 1] = fdSelect.fdSelect[i];
          }

          break;

        case 3:
          var start = 0;
          var lastFD = fdSelect.fdSelect[0];
          var ranges = [format, 0, 0, start >> 8 & 0xFF, start & 0xFF, lastFD];

          for (i = 1; i < fdSelect.fdSelect.length; i++) {
            var currentFD = fdSelect.fdSelect[i];

            if (currentFD !== lastFD) {
              ranges.push(i >> 8 & 0xFF, i & 0xFF, currentFD);
              lastFD = currentFD;
            }
          }

          var numRanges = (ranges.length - 3) / 3;
          ranges[1] = numRanges >> 8 & 0xFF;
          ranges[2] = numRanges & 0xFF;
          ranges.push(i >> 8 & 0xFF, i & 0xFF);
          out = new Uint8Array(ranges);
          break;
      }

      return this.compileTypedArray(out);
    },
    compileTypedArray: function CFFCompiler_compileTypedArray(data) {
      var out = [];

      for (var i = 0, ii = data.length; i < ii; ++i) {
        out[i] = data[i];
      }

      return out;
    },
    compileIndex: function CFFCompiler_compileIndex(index, trackers) {
      trackers = trackers || [];
      var objects = index.objects;
      var count = objects.length;

      if (count === 0) {
        return [0, 0, 0];
      }

      var data = [count >> 8 & 0xFF, count & 0xff];
      var lastOffset = 1,
          i;

      for (i = 0; i < count; ++i) {
        lastOffset += objects[i].length;
      }

      var offsetSize;

      if (lastOffset < 0x100) {
        offsetSize = 1;
      } else if (lastOffset < 0x10000) {
        offsetSize = 2;
      } else if (lastOffset < 0x1000000) {
        offsetSize = 3;
      } else {
        offsetSize = 4;
      }

      data.push(offsetSize);
      var relativeOffset = 1;

      for (i = 0; i < count + 1; i++) {
        if (offsetSize === 1) {
          data.push(relativeOffset & 0xFF);
        } else if (offsetSize === 2) {
          data.push(relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);
        } else if (offsetSize === 3) {
          data.push(relativeOffset >> 16 & 0xFF, relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);
        } else {
          data.push(relativeOffset >>> 24 & 0xFF, relativeOffset >> 16 & 0xFF, relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);
        }

        if (objects[i]) {
          relativeOffset += objects[i].length;
        }
      }

      for (i = 0; i < count; i++) {
        if (trackers[i]) {
          trackers[i].offset(data.length);
        }

        for (var j = 0, jj = objects[i].length; j < jj; j++) {
          data.push(objects[i][j]);
        }
      }

      return data;
    }
  };
  return CFFCompiler;
}();

exports.CFFCompiler = CFFCompiler;

/***/ }),
/* 175 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ExpertSubsetCharset = exports.ExpertCharset = exports.ISOAdobeCharset = void 0;
var ISOAdobeCharset = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron'];
exports.ISOAdobeCharset = ISOAdobeCharset;
var ExpertCharset = ['.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];
exports.ExpertCharset = ExpertCharset;
var ExpertSubsetCharset = ['.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior'];
exports.ExpertSubsetCharset = ExpertSubsetCharset;

/***/ }),
/* 176 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getEncoding = getEncoding;
exports.ExpertEncoding = exports.ZapfDingbatsEncoding = exports.SymbolSetEncoding = exports.MacRomanEncoding = exports.StandardEncoding = exports.WinAnsiEncoding = void 0;
var ExpertEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];
exports.ExpertEncoding = ExpertEncoding;
var MacExpertEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '', 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '', 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall', 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall', 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '', 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior', 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior', 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior', 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '', 'dollarinferior', '', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior', 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall', 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '', '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '', 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior', 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior', '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall', 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior', 'periodsuperior', 'Dotaccentsmall', 'Ringsmall', '', '', '', ''];
var MacRomanEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron'];
exports.MacRomanEncoding = MacRomanEncoding;
var StandardEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl', 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls', '', '', '', ''];
exports.StandardEncoding = StandardEncoding;
var WinAnsiEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron', 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft', 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash', 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet', 'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling', 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered', 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute', 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters', 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn', 'ydieresis'];
exports.WinAnsiEncoding = WinAnsiEncoding;
var SymbolSetEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent', 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus', 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi', 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau', 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex', 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho', 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal', 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree', 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional', 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence', 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn', 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply', 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset', 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element', 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif', 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot', 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup', 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp', 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex', 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex', '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt', 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp', 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid', 'bracerightbt', ''];
exports.SymbolSetEncoding = SymbolSetEncoding;
var ZapfDingbatsEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117', 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19', 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7', 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36', 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46', 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56', 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66', 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75', 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97', 'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205', 'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191', ''];
exports.ZapfDingbatsEncoding = ZapfDingbatsEncoding;

function getEncoding(encodingName) {
  switch (encodingName) {
    case 'WinAnsiEncoding':
      return WinAnsiEncoding;

    case 'StandardEncoding':
      return StandardEncoding;

    case 'MacRomanEncoding':
      return MacRomanEncoding;

    case 'SymbolSetEncoding':
      return SymbolSetEncoding;

    case 'ZapfDingbatsEncoding':
      return ZapfDingbatsEncoding;

    case 'ExpertEncoding':
      return ExpertEncoding;

    case 'MacExpertEncoding':
      return MacExpertEncoding;

    default:
      return null;
  }
}

/***/ }),
/* 177 */
/***/ (function(module, exports, __w_pdfjs_require__) {

var getLookupTableFactory = __w_pdfjs_require__(6).getLookupTableFactory;
var getGlyphsUnicode = getLookupTableFactory(function (t) {
 t['A'] = 0x0041;
 t['AE'] = 0x00C6;
 t['AEacute'] = 0x01FC;
 t['AEmacron'] = 0x01E2;
 t['AEsmall'] = 0xF7E6;
 t['Aacute'] = 0x00C1;
 t['Aacutesmall'] = 0xF7E1;
 t['Abreve'] = 0x0102;
 t['Abreveacute'] = 0x1EAE;
 t['Abrevecyrillic'] = 0x04D0;
 t['Abrevedotbelow'] = 0x1EB6;
 t['Abrevegrave'] = 0x1EB0;
 t['Abrevehookabove'] = 0x1EB2;
 t['Abrevetilde'] = 0x1EB4;
 t['Acaron'] = 0x01CD;
 t['Acircle'] = 0x24B6;
 t['Acircumflex'] = 0x00C2;
 t['Acircumflexacute'] = 0x1EA4;
 t['Acircumflexdotbelow'] = 0x1EAC;
 t['Acircumflexgrave'] = 0x1EA6;
 t['Acircumflexhookabove'] = 0x1EA8;
 t['Acircumflexsmall'] = 0xF7E2;
 t['Acircumflextilde'] = 0x1EAA;
 t['Acute'] = 0xF6C9;
 t['Acutesmall'] = 0xF7B4;
 t['Acyrillic'] = 0x0410;
 t['Adblgrave'] = 0x0200;
 t['Adieresis'] = 0x00C4;
 t['Adieresiscyrillic'] = 0x04D2;
 t['Adieresismacron'] = 0x01DE;
 t['Adieresissmall'] = 0xF7E4;
 t['Adotbelow'] = 0x1EA0;
 t['Adotmacron'] = 0x01E0;
 t['Agrave'] = 0x00C0;
 t['Agravesmall'] = 0xF7E0;
 t['Ahookabove'] = 0x1EA2;
 t['Aiecyrillic'] = 0x04D4;
 t['Ainvertedbreve'] = 0x0202;
 t['Alpha'] = 0x0391;
 t['Alphatonos'] = 0x0386;
 t['Amacron'] = 0x0100;
 t['Amonospace'] = 0xFF21;
 t['Aogonek'] = 0x0104;
 t['Aring'] = 0x00C5;
 t['Aringacute'] = 0x01FA;
 t['Aringbelow'] = 0x1E00;
 t['Aringsmall'] = 0xF7E5;
 t['Asmall'] = 0xF761;
 t['Atilde'] = 0x00C3;
 t['Atildesmall'] = 0xF7E3;
 t['Aybarmenian'] = 0x0531;
 t['B'] = 0x0042;
 t['Bcircle'] = 0x24B7;
 t['Bdotaccent'] = 0x1E02;
 t['Bdotbelow'] = 0x1E04;
 t['Becyrillic'] = 0x0411;
 t['Benarmenian'] = 0x0532;
 t['Beta'] = 0x0392;
 t['Bhook'] = 0x0181;
 t['Blinebelow'] = 0x1E06;
 t['Bmonospace'] = 0xFF22;
 t['Brevesmall'] = 0xF6F4;
 t['Bsmall'] = 0xF762;
 t['Btopbar'] = 0x0182;
 t['C'] = 0x0043;
 t['Caarmenian'] = 0x053E;
 t['Cacute'] = 0x0106;
 t['Caron'] = 0xF6CA;
 t['Caronsmall'] = 0xF6F5;
 t['Ccaron'] = 0x010C;
 t['Ccedilla'] = 0x00C7;
 t['Ccedillaacute'] = 0x1E08;
 t['Ccedillasmall'] = 0xF7E7;
 t['Ccircle'] = 0x24B8;
 t['Ccircumflex'] = 0x0108;
 t['Cdot'] = 0x010A;
 t['Cdotaccent'] = 0x010A;
 t['Cedillasmall'] = 0xF7B8;
 t['Chaarmenian'] = 0x0549;
 t['Cheabkhasiancyrillic'] = 0x04BC;
 t['Checyrillic'] = 0x0427;
 t['Chedescenderabkhasiancyrillic'] = 0x04BE;
 t['Chedescendercyrillic'] = 0x04B6;
 t['Chedieresiscyrillic'] = 0x04F4;
 t['Cheharmenian'] = 0x0543;
 t['Chekhakassiancyrillic'] = 0x04CB;
 t['Cheverticalstrokecyrillic'] = 0x04B8;
 t['Chi'] = 0x03A7;
 t['Chook'] = 0x0187;
 t['Circumflexsmall'] = 0xF6F6;
 t['Cmonospace'] = 0xFF23;
 t['Coarmenian'] = 0x0551;
 t['Csmall'] = 0xF763;
 t['D'] = 0x0044;
 t['DZ'] = 0x01F1;
 t['DZcaron'] = 0x01C4;
 t['Daarmenian'] = 0x0534;
 t['Dafrican'] = 0x0189;
 t['Dcaron'] = 0x010E;
 t['Dcedilla'] = 0x1E10;
 t['Dcircle'] = 0x24B9;
 t['Dcircumflexbelow'] = 0x1E12;
 t['Dcroat'] = 0x0110;
 t['Ddotaccent'] = 0x1E0A;
 t['Ddotbelow'] = 0x1E0C;
 t['Decyrillic'] = 0x0414;
 t['Deicoptic'] = 0x03EE;
 t['Delta'] = 0x2206;
 t['Deltagreek'] = 0x0394;
 t['Dhook'] = 0x018A;
 t['Dieresis'] = 0xF6CB;
 t['DieresisAcute'] = 0xF6CC;
 t['DieresisGrave'] = 0xF6CD;
 t['Dieresissmall'] = 0xF7A8;
 t['Digammagreek'] = 0x03DC;
 t['Djecyrillic'] = 0x0402;
 t['Dlinebelow'] = 0x1E0E;
 t['Dmonospace'] = 0xFF24;
 t['Dotaccentsmall'] = 0xF6F7;
 t['Dslash'] = 0x0110;
 t['Dsmall'] = 0xF764;
 t['Dtopbar'] = 0x018B;
 t['Dz'] = 0x01F2;
 t['Dzcaron'] = 0x01C5;
 t['Dzeabkhasiancyrillic'] = 0x04E0;
 t['Dzecyrillic'] = 0x0405;
 t['Dzhecyrillic'] = 0x040F;
 t['E'] = 0x0045;
 t['Eacute'] = 0x00C9;
 t['Eacutesmall'] = 0xF7E9;
 t['Ebreve'] = 0x0114;
 t['Ecaron'] = 0x011A;
 t['Ecedillabreve'] = 0x1E1C;
 t['Echarmenian'] = 0x0535;
 t['Ecircle'] = 0x24BA;
 t['Ecircumflex'] = 0x00CA;
 t['Ecircumflexacute'] = 0x1EBE;
 t['Ecircumflexbelow'] = 0x1E18;
 t['Ecircumflexdotbelow'] = 0x1EC6;
 t['Ecircumflexgrave'] = 0x1EC0;
 t['Ecircumflexhookabove'] = 0x1EC2;
 t['Ecircumflexsmall'] = 0xF7EA;
 t['Ecircumflextilde'] = 0x1EC4;
 t['Ecyrillic'] = 0x0404;
 t['Edblgrave'] = 0x0204;
 t['Edieresis'] = 0x00CB;
 t['Edieresissmall'] = 0xF7EB;
 t['Edot'] = 0x0116;
 t['Edotaccent'] = 0x0116;
 t['Edotbelow'] = 0x1EB8;
 t['Efcyrillic'] = 0x0424;
 t['Egrave'] = 0x00C8;
 t['Egravesmall'] = 0xF7E8;
 t['Eharmenian'] = 0x0537;
 t['Ehookabove'] = 0x1EBA;
 t['Eightroman'] = 0x2167;
 t['Einvertedbreve'] = 0x0206;
 t['Eiotifiedcyrillic'] = 0x0464;
 t['Elcyrillic'] = 0x041B;
 t['Elevenroman'] = 0x216A;
 t['Emacron'] = 0x0112;
 t['Emacronacute'] = 0x1E16;
 t['Emacrongrave'] = 0x1E14;
 t['Emcyrillic'] = 0x041C;
 t['Emonospace'] = 0xFF25;
 t['Encyrillic'] = 0x041D;
 t['Endescendercyrillic'] = 0x04A2;
 t['Eng'] = 0x014A;
 t['Enghecyrillic'] = 0x04A4;
 t['Enhookcyrillic'] = 0x04C7;
 t['Eogonek'] = 0x0118;
 t['Eopen'] = 0x0190;
 t['Epsilon'] = 0x0395;
 t['Epsilontonos'] = 0x0388;
 t['Ercyrillic'] = 0x0420;
 t['Ereversed'] = 0x018E;
 t['Ereversedcyrillic'] = 0x042D;
 t['Escyrillic'] = 0x0421;
 t['Esdescendercyrillic'] = 0x04AA;
 t['Esh'] = 0x01A9;
 t['Esmall'] = 0xF765;
 t['Eta'] = 0x0397;
 t['Etarmenian'] = 0x0538;
 t['Etatonos'] = 0x0389;
 t['Eth'] = 0x00D0;
 t['Ethsmall'] = 0xF7F0;
 t['Etilde'] = 0x1EBC;
 t['Etildebelow'] = 0x1E1A;
 t['Euro'] = 0x20AC;
 t['Ezh'] = 0x01B7;
 t['Ezhcaron'] = 0x01EE;
 t['Ezhreversed'] = 0x01B8;
 t['F'] = 0x0046;
 t['Fcircle'] = 0x24BB;
 t['Fdotaccent'] = 0x1E1E;
 t['Feharmenian'] = 0x0556;
 t['Feicoptic'] = 0x03E4;
 t['Fhook'] = 0x0191;
 t['Fitacyrillic'] = 0x0472;
 t['Fiveroman'] = 0x2164;
 t['Fmonospace'] = 0xFF26;
 t['Fourroman'] = 0x2163;
 t['Fsmall'] = 0xF766;
 t['G'] = 0x0047;
 t['GBsquare'] = 0x3387;
 t['Gacute'] = 0x01F4;
 t['Gamma'] = 0x0393;
 t['Gammaafrican'] = 0x0194;
 t['Gangiacoptic'] = 0x03EA;
 t['Gbreve'] = 0x011E;
 t['Gcaron'] = 0x01E6;
 t['Gcedilla'] = 0x0122;
 t['Gcircle'] = 0x24BC;
 t['Gcircumflex'] = 0x011C;
 t['Gcommaaccent'] = 0x0122;
 t['Gdot'] = 0x0120;
 t['Gdotaccent'] = 0x0120;
 t['Gecyrillic'] = 0x0413;
 t['Ghadarmenian'] = 0x0542;
 t['Ghemiddlehookcyrillic'] = 0x0494;
 t['Ghestrokecyrillic'] = 0x0492;
 t['Gheupturncyrillic'] = 0x0490;
 t['Ghook'] = 0x0193;
 t['Gimarmenian'] = 0x0533;
 t['Gjecyrillic'] = 0x0403;
 t['Gmacron'] = 0x1E20;
 t['Gmonospace'] = 0xFF27;
 t['Grave'] = 0xF6CE;
 t['Gravesmall'] = 0xF760;
 t['Gsmall'] = 0xF767;
 t['Gsmallhook'] = 0x029B;
 t['Gstroke'] = 0x01E4;
 t['H'] = 0x0048;
 t['H18533'] = 0x25CF;
 t['H18543'] = 0x25AA;
 t['H18551'] = 0x25AB;
 t['H22073'] = 0x25A1;
 t['HPsquare'] = 0x33CB;
 t['Haabkhasiancyrillic'] = 0x04A8;
 t['Hadescendercyrillic'] = 0x04B2;
 t['Hardsigncyrillic'] = 0x042A;
 t['Hbar'] = 0x0126;
 t['Hbrevebelow'] = 0x1E2A;
 t['Hcedilla'] = 0x1E28;
 t['Hcircle'] = 0x24BD;
 t['Hcircumflex'] = 0x0124;
 t['Hdieresis'] = 0x1E26;
 t['Hdotaccent'] = 0x1E22;
 t['Hdotbelow'] = 0x1E24;
 t['Hmonospace'] = 0xFF28;
 t['Hoarmenian'] = 0x0540;
 t['Horicoptic'] = 0x03E8;
 t['Hsmall'] = 0xF768;
 t['Hungarumlaut'] = 0xF6CF;
 t['Hungarumlautsmall'] = 0xF6F8;
 t['Hzsquare'] = 0x3390;
 t['I'] = 0x0049;
 t['IAcyrillic'] = 0x042F;
 t['IJ'] = 0x0132;
 t['IUcyrillic'] = 0x042E;
 t['Iacute'] = 0x00CD;
 t['Iacutesmall'] = 0xF7ED;
 t['Ibreve'] = 0x012C;
 t['Icaron'] = 0x01CF;
 t['Icircle'] = 0x24BE;
 t['Icircumflex'] = 0x00CE;
 t['Icircumflexsmall'] = 0xF7EE;
 t['Icyrillic'] = 0x0406;
 t['Idblgrave'] = 0x0208;
 t['Idieresis'] = 0x00CF;
 t['Idieresisacute'] = 0x1E2E;
 t['Idieresiscyrillic'] = 0x04E4;
 t['Idieresissmall'] = 0xF7EF;
 t['Idot'] = 0x0130;
 t['Idotaccent'] = 0x0130;
 t['Idotbelow'] = 0x1ECA;
 t['Iebrevecyrillic'] = 0x04D6;
 t['Iecyrillic'] = 0x0415;
 t['Ifraktur'] = 0x2111;
 t['Igrave'] = 0x00CC;
 t['Igravesmall'] = 0xF7EC;
 t['Ihookabove'] = 0x1EC8;
 t['Iicyrillic'] = 0x0418;
 t['Iinvertedbreve'] = 0x020A;
 t['Iishortcyrillic'] = 0x0419;
 t['Imacron'] = 0x012A;
 t['Imacroncyrillic'] = 0x04E2;
 t['Imonospace'] = 0xFF29;
 t['Iniarmenian'] = 0x053B;
 t['Iocyrillic'] = 0x0401;
 t['Iogonek'] = 0x012E;
 t['Iota'] = 0x0399;
 t['Iotaafrican'] = 0x0196;
 t['Iotadieresis'] = 0x03AA;
 t['Iotatonos'] = 0x038A;
 t['Ismall'] = 0xF769;
 t['Istroke'] = 0x0197;
 t['Itilde'] = 0x0128;
 t['Itildebelow'] = 0x1E2C;
 t['Izhitsacyrillic'] = 0x0474;
 t['Izhitsadblgravecyrillic'] = 0x0476;
 t['J'] = 0x004A;
 t['Jaarmenian'] = 0x0541;
 t['Jcircle'] = 0x24BF;
 t['Jcircumflex'] = 0x0134;
 t['Jecyrillic'] = 0x0408;
 t['Jheharmenian'] = 0x054B;
 t['Jmonospace'] = 0xFF2A;
 t['Jsmall'] = 0xF76A;
 t['K'] = 0x004B;
 t['KBsquare'] = 0x3385;
 t['KKsquare'] = 0x33CD;
 t['Kabashkircyrillic'] = 0x04A0;
 t['Kacute'] = 0x1E30;
 t['Kacyrillic'] = 0x041A;
 t['Kadescendercyrillic'] = 0x049A;
 t['Kahookcyrillic'] = 0x04C3;
 t['Kappa'] = 0x039A;
 t['Kastrokecyrillic'] = 0x049E;
 t['Kaverticalstrokecyrillic'] = 0x049C;
 t['Kcaron'] = 0x01E8;
 t['Kcedilla'] = 0x0136;
 t['Kcircle'] = 0x24C0;
 t['Kcommaaccent'] = 0x0136;
 t['Kdotbelow'] = 0x1E32;
 t['Keharmenian'] = 0x0554;
 t['Kenarmenian'] = 0x053F;
 t['Khacyrillic'] = 0x0425;
 t['Kheicoptic'] = 0x03E6;
 t['Khook'] = 0x0198;
 t['Kjecyrillic'] = 0x040C;
 t['Klinebelow'] = 0x1E34;
 t['Kmonospace'] = 0xFF2B;
 t['Koppacyrillic'] = 0x0480;
 t['Koppagreek'] = 0x03DE;
 t['Ksicyrillic'] = 0x046E;
 t['Ksmall'] = 0xF76B;
 t['L'] = 0x004C;
 t['LJ'] = 0x01C7;
 t['LL'] = 0xF6BF;
 t['Lacute'] = 0x0139;
 t['Lambda'] = 0x039B;
 t['Lcaron'] = 0x013D;
 t['Lcedilla'] = 0x013B;
 t['Lcircle'] = 0x24C1;
 t['Lcircumflexbelow'] = 0x1E3C;
 t['Lcommaaccent'] = 0x013B;
 t['Ldot'] = 0x013F;
 t['Ldotaccent'] = 0x013F;
 t['Ldotbelow'] = 0x1E36;
 t['Ldotbelowmacron'] = 0x1E38;
 t['Liwnarmenian'] = 0x053C;
 t['Lj'] = 0x01C8;
 t['Ljecyrillic'] = 0x0409;
 t['Llinebelow'] = 0x1E3A;
 t['Lmonospace'] = 0xFF2C;
 t['Lslash'] = 0x0141;
 t['Lslashsmall'] = 0xF6F9;
 t['Lsmall'] = 0xF76C;
 t['M'] = 0x004D;
 t['MBsquare'] = 0x3386;
 t['Macron'] = 0xF6D0;
 t['Macronsmall'] = 0xF7AF;
 t['Macute'] = 0x1E3E;
 t['Mcircle'] = 0x24C2;
 t['Mdotaccent'] = 0x1E40;
 t['Mdotbelow'] = 0x1E42;
 t['Menarmenian'] = 0x0544;
 t['Mmonospace'] = 0xFF2D;
 t['Msmall'] = 0xF76D;
 t['Mturned'] = 0x019C;
 t['Mu'] = 0x039C;
 t['N'] = 0x004E;
 t['NJ'] = 0x01CA;
 t['Nacute'] = 0x0143;
 t['Ncaron'] = 0x0147;
 t['Ncedilla'] = 0x0145;
 t['Ncircle'] = 0x24C3;
 t['Ncircumflexbelow'] = 0x1E4A;
 t['Ncommaaccent'] = 0x0145;
 t['Ndotaccent'] = 0x1E44;
 t['Ndotbelow'] = 0x1E46;
 t['Nhookleft'] = 0x019D;
 t['Nineroman'] = 0x2168;
 t['Nj'] = 0x01CB;
 t['Njecyrillic'] = 0x040A;
 t['Nlinebelow'] = 0x1E48;
 t['Nmonospace'] = 0xFF2E;
 t['Nowarmenian'] = 0x0546;
 t['Nsmall'] = 0xF76E;
 t['Ntilde'] = 0x00D1;
 t['Ntildesmall'] = 0xF7F1;
 t['Nu'] = 0x039D;
 t['O'] = 0x004F;
 t['OE'] = 0x0152;
 t['OEsmall'] = 0xF6FA;
 t['Oacute'] = 0x00D3;
 t['Oacutesmall'] = 0xF7F3;
 t['Obarredcyrillic'] = 0x04E8;
 t['Obarreddieresiscyrillic'] = 0x04EA;
 t['Obreve'] = 0x014E;
 t['Ocaron'] = 0x01D1;
 t['Ocenteredtilde'] = 0x019F;
 t['Ocircle'] = 0x24C4;
 t['Ocircumflex'] = 0x00D4;
 t['Ocircumflexacute'] = 0x1ED0;
 t['Ocircumflexdotbelow'] = 0x1ED8;
 t['Ocircumflexgrave'] = 0x1ED2;
 t['Ocircumflexhookabove'] = 0x1ED4;
 t['Ocircumflexsmall'] = 0xF7F4;
 t['Ocircumflextilde'] = 0x1ED6;
 t['Ocyrillic'] = 0x041E;
 t['Odblacute'] = 0x0150;
 t['Odblgrave'] = 0x020C;
 t['Odieresis'] = 0x00D6;
 t['Odieresiscyrillic'] = 0x04E6;
 t['Odieresissmall'] = 0xF7F6;
 t['Odotbelow'] = 0x1ECC;
 t['Ogoneksmall'] = 0xF6FB;
 t['Ograve'] = 0x00D2;
 t['Ogravesmall'] = 0xF7F2;
 t['Oharmenian'] = 0x0555;
 t['Ohm'] = 0x2126;
 t['Ohookabove'] = 0x1ECE;
 t['Ohorn'] = 0x01A0;
 t['Ohornacute'] = 0x1EDA;
 t['Ohorndotbelow'] = 0x1EE2;
 t['Ohorngrave'] = 0x1EDC;
 t['Ohornhookabove'] = 0x1EDE;
 t['Ohorntilde'] = 0x1EE0;
 t['Ohungarumlaut'] = 0x0150;
 t['Oi'] = 0x01A2;
 t['Oinvertedbreve'] = 0x020E;
 t['Omacron'] = 0x014C;
 t['Omacronacute'] = 0x1E52;
 t['Omacrongrave'] = 0x1E50;
 t['Omega'] = 0x2126;
 t['Omegacyrillic'] = 0x0460;
 t['Omegagreek'] = 0x03A9;
 t['Omegaroundcyrillic'] = 0x047A;
 t['Omegatitlocyrillic'] = 0x047C;
 t['Omegatonos'] = 0x038F;
 t['Omicron'] = 0x039F;
 t['Omicrontonos'] = 0x038C;
 t['Omonospace'] = 0xFF2F;
 t['Oneroman'] = 0x2160;
 t['Oogonek'] = 0x01EA;
 t['Oogonekmacron'] = 0x01EC;
 t['Oopen'] = 0x0186;
 t['Oslash'] = 0x00D8;
 t['Oslashacute'] = 0x01FE;
 t['Oslashsmall'] = 0xF7F8;
 t['Osmall'] = 0xF76F;
 t['Ostrokeacute'] = 0x01FE;
 t['Otcyrillic'] = 0x047E;
 t['Otilde'] = 0x00D5;
 t['Otildeacute'] = 0x1E4C;
 t['Otildedieresis'] = 0x1E4E;
 t['Otildesmall'] = 0xF7F5;
 t['P'] = 0x0050;
 t['Pacute'] = 0x1E54;
 t['Pcircle'] = 0x24C5;
 t['Pdotaccent'] = 0x1E56;
 t['Pecyrillic'] = 0x041F;
 t['Peharmenian'] = 0x054A;
 t['Pemiddlehookcyrillic'] = 0x04A6;
 t['Phi'] = 0x03A6;
 t['Phook'] = 0x01A4;
 t['Pi'] = 0x03A0;
 t['Piwrarmenian'] = 0x0553;
 t['Pmonospace'] = 0xFF30;
 t['Psi'] = 0x03A8;
 t['Psicyrillic'] = 0x0470;
 t['Psmall'] = 0xF770;
 t['Q'] = 0x0051;
 t['Qcircle'] = 0x24C6;
 t['Qmonospace'] = 0xFF31;
 t['Qsmall'] = 0xF771;
 t['R'] = 0x0052;
 t['Raarmenian'] = 0x054C;
 t['Racute'] = 0x0154;
 t['Rcaron'] = 0x0158;
 t['Rcedilla'] = 0x0156;
 t['Rcircle'] = 0x24C7;
 t['Rcommaaccent'] = 0x0156;
 t['Rdblgrave'] = 0x0210;
 t['Rdotaccent'] = 0x1E58;
 t['Rdotbelow'] = 0x1E5A;
 t['Rdotbelowmacron'] = 0x1E5C;
 t['Reharmenian'] = 0x0550;
 t['Rfraktur'] = 0x211C;
 t['Rho'] = 0x03A1;
 t['Ringsmall'] = 0xF6FC;
 t['Rinvertedbreve'] = 0x0212;
 t['Rlinebelow'] = 0x1E5E;
 t['Rmonospace'] = 0xFF32;
 t['Rsmall'] = 0xF772;
 t['Rsmallinverted'] = 0x0281;
 t['Rsmallinvertedsuperior'] = 0x02B6;
 t['S'] = 0x0053;
 t['SF010000'] = 0x250C;
 t['SF020000'] = 0x2514;
 t['SF030000'] = 0x2510;
 t['SF040000'] = 0x2518;
 t['SF050000'] = 0x253C;
 t['SF060000'] = 0x252C;
 t['SF070000'] = 0x2534;
 t['SF080000'] = 0x251C;
 t['SF090000'] = 0x2524;
 t['SF100000'] = 0x2500;
 t['SF110000'] = 0x2502;
 t['SF190000'] = 0x2561;
 t['SF200000'] = 0x2562;
 t['SF210000'] = 0x2556;
 t['SF220000'] = 0x2555;
 t['SF230000'] = 0x2563;
 t['SF240000'] = 0x2551;
 t['SF250000'] = 0x2557;
 t['SF260000'] = 0x255D;
 t['SF270000'] = 0x255C;
 t['SF280000'] = 0x255B;
 t['SF360000'] = 0x255E;
 t['SF370000'] = 0x255F;
 t['SF380000'] = 0x255A;
 t['SF390000'] = 0x2554;
 t['SF400000'] = 0x2569;
 t['SF410000'] = 0x2566;
 t['SF420000'] = 0x2560;
 t['SF430000'] = 0x2550;
 t['SF440000'] = 0x256C;
 t['SF450000'] = 0x2567;
 t['SF460000'] = 0x2568;
 t['SF470000'] = 0x2564;
 t['SF480000'] = 0x2565;
 t['SF490000'] = 0x2559;
 t['SF500000'] = 0x2558;
 t['SF510000'] = 0x2552;
 t['SF520000'] = 0x2553;
 t['SF530000'] = 0x256B;
 t['SF540000'] = 0x256A;
 t['Sacute'] = 0x015A;
 t['Sacutedotaccent'] = 0x1E64;
 t['Sampigreek'] = 0x03E0;
 t['Scaron'] = 0x0160;
 t['Scarondotaccent'] = 0x1E66;
 t['Scaronsmall'] = 0xF6FD;
 t['Scedilla'] = 0x015E;
 t['Schwa'] = 0x018F;
 t['Schwacyrillic'] = 0x04D8;
 t['Schwadieresiscyrillic'] = 0x04DA;
 t['Scircle'] = 0x24C8;
 t['Scircumflex'] = 0x015C;
 t['Scommaaccent'] = 0x0218;
 t['Sdotaccent'] = 0x1E60;
 t['Sdotbelow'] = 0x1E62;
 t['Sdotbelowdotaccent'] = 0x1E68;
 t['Seharmenian'] = 0x054D;
 t['Sevenroman'] = 0x2166;
 t['Shaarmenian'] = 0x0547;
 t['Shacyrillic'] = 0x0428;
 t['Shchacyrillic'] = 0x0429;
 t['Sheicoptic'] = 0x03E2;
 t['Shhacyrillic'] = 0x04BA;
 t['Shimacoptic'] = 0x03EC;
 t['Sigma'] = 0x03A3;
 t['Sixroman'] = 0x2165;
 t['Smonospace'] = 0xFF33;
 t['Softsigncyrillic'] = 0x042C;
 t['Ssmall'] = 0xF773;
 t['Stigmagreek'] = 0x03DA;
 t['T'] = 0x0054;
 t['Tau'] = 0x03A4;
 t['Tbar'] = 0x0166;
 t['Tcaron'] = 0x0164;
 t['Tcedilla'] = 0x0162;
 t['Tcircle'] = 0x24C9;
 t['Tcircumflexbelow'] = 0x1E70;
 t['Tcommaaccent'] = 0x0162;
 t['Tdotaccent'] = 0x1E6A;
 t['Tdotbelow'] = 0x1E6C;
 t['Tecyrillic'] = 0x0422;
 t['Tedescendercyrillic'] = 0x04AC;
 t['Tenroman'] = 0x2169;
 t['Tetsecyrillic'] = 0x04B4;
 t['Theta'] = 0x0398;
 t['Thook'] = 0x01AC;
 t['Thorn'] = 0x00DE;
 t['Thornsmall'] = 0xF7FE;
 t['Threeroman'] = 0x2162;
 t['Tildesmall'] = 0xF6FE;
 t['Tiwnarmenian'] = 0x054F;
 t['Tlinebelow'] = 0x1E6E;
 t['Tmonospace'] = 0xFF34;
 t['Toarmenian'] = 0x0539;
 t['Tonefive'] = 0x01BC;
 t['Tonesix'] = 0x0184;
 t['Tonetwo'] = 0x01A7;
 t['Tretroflexhook'] = 0x01AE;
 t['Tsecyrillic'] = 0x0426;
 t['Tshecyrillic'] = 0x040B;
 t['Tsmall'] = 0xF774;
 t['Twelveroman'] = 0x216B;
 t['Tworoman'] = 0x2161;
 t['U'] = 0x0055;
 t['Uacute'] = 0x00DA;
 t['Uacutesmall'] = 0xF7FA;
 t['Ubreve'] = 0x016C;
 t['Ucaron'] = 0x01D3;
 t['Ucircle'] = 0x24CA;
 t['Ucircumflex'] = 0x00DB;
 t['Ucircumflexbelow'] = 0x1E76;
 t['Ucircumflexsmall'] = 0xF7FB;
 t['Ucyrillic'] = 0x0423;
 t['Udblacute'] = 0x0170;
 t['Udblgrave'] = 0x0214;
 t['Udieresis'] = 0x00DC;
 t['Udieresisacute'] = 0x01D7;
 t['Udieresisbelow'] = 0x1E72;
 t['Udieresiscaron'] = 0x01D9;
 t['Udieresiscyrillic'] = 0x04F0;
 t['Udieresisgrave'] = 0x01DB;
 t['Udieresismacron'] = 0x01D5;
 t['Udieresissmall'] = 0xF7FC;
 t['Udotbelow'] = 0x1EE4;
 t['Ugrave'] = 0x00D9;
 t['Ugravesmall'] = 0xF7F9;
 t['Uhookabove'] = 0x1EE6;
 t['Uhorn'] = 0x01AF;
 t['Uhornacute'] = 0x1EE8;
 t['Uhorndotbelow'] = 0x1EF0;
 t['Uhorngrave'] = 0x1EEA;
 t['Uhornhookabove'] = 0x1EEC;
 t['Uhorntilde'] = 0x1EEE;
 t['Uhungarumlaut'] = 0x0170;
 t['Uhungarumlautcyrillic'] = 0x04F2;
 t['Uinvertedbreve'] = 0x0216;
 t['Ukcyrillic'] = 0x0478;
 t['Umacron'] = 0x016A;
 t['Umacroncyrillic'] = 0x04EE;
 t['Umacrondieresis'] = 0x1E7A;
 t['Umonospace'] = 0xFF35;
 t['Uogonek'] = 0x0172;
 t['Upsilon'] = 0x03A5;
 t['Upsilon1'] = 0x03D2;
 t['Upsilonacutehooksymbolgreek'] = 0x03D3;
 t['Upsilonafrican'] = 0x01B1;
 t['Upsilondieresis'] = 0x03AB;
 t['Upsilondieresishooksymbolgreek'] = 0x03D4;
 t['Upsilonhooksymbol'] = 0x03D2;
 t['Upsilontonos'] = 0x038E;
 t['Uring'] = 0x016E;
 t['Ushortcyrillic'] = 0x040E;
 t['Usmall'] = 0xF775;
 t['Ustraightcyrillic'] = 0x04AE;
 t['Ustraightstrokecyrillic'] = 0x04B0;
 t['Utilde'] = 0x0168;
 t['Utildeacute'] = 0x1E78;
 t['Utildebelow'] = 0x1E74;
 t['V'] = 0x0056;
 t['Vcircle'] = 0x24CB;
 t['Vdotbelow'] = 0x1E7E;
 t['Vecyrillic'] = 0x0412;
 t['Vewarmenian'] = 0x054E;
 t['Vhook'] = 0x01B2;
 t['Vmonospace'] = 0xFF36;
 t['Voarmenian'] = 0x0548;
 t['Vsmall'] = 0xF776;
 t['Vtilde'] = 0x1E7C;
 t['W'] = 0x0057;
 t['Wacute'] = 0x1E82;
 t['Wcircle'] = 0x24CC;
 t['Wcircumflex'] = 0x0174;
 t['Wdieresis'] = 0x1E84;
 t['Wdotaccent'] = 0x1E86;
 t['Wdotbelow'] = 0x1E88;
 t['Wgrave'] = 0x1E80;
 t['Wmonospace'] = 0xFF37;
 t['Wsmall'] = 0xF777;
 t['X'] = 0x0058;
 t['Xcircle'] = 0x24CD;
 t['Xdieresis'] = 0x1E8C;
 t['Xdotaccent'] = 0x1E8A;
 t['Xeharmenian'] = 0x053D;
 t['Xi'] = 0x039E;
 t['Xmonospace'] = 0xFF38;
 t['Xsmall'] = 0xF778;
 t['Y'] = 0x0059;
 t['Yacute'] = 0x00DD;
 t['Yacutesmall'] = 0xF7FD;
 t['Yatcyrillic'] = 0x0462;
 t['Ycircle'] = 0x24CE;
 t['Ycircumflex'] = 0x0176;
 t['Ydieresis'] = 0x0178;
 t['Ydieresissmall'] = 0xF7FF;
 t['Ydotaccent'] = 0x1E8E;
 t['Ydotbelow'] = 0x1EF4;
 t['Yericyrillic'] = 0x042B;
 t['Yerudieresiscyrillic'] = 0x04F8;
 t['Ygrave'] = 0x1EF2;
 t['Yhook'] = 0x01B3;
 t['Yhookabove'] = 0x1EF6;
 t['Yiarmenian'] = 0x0545;
 t['Yicyrillic'] = 0x0407;
 t['Yiwnarmenian'] = 0x0552;
 t['Ymonospace'] = 0xFF39;
 t['Ysmall'] = 0xF779;
 t['Ytilde'] = 0x1EF8;
 t['Yusbigcyrillic'] = 0x046A;
 t['Yusbigiotifiedcyrillic'] = 0x046C;
 t['Yuslittlecyrillic'] = 0x0466;
 t['Yuslittleiotifiedcyrillic'] = 0x0468;
 t['Z'] = 0x005A;
 t['Zaarmenian'] = 0x0536;
 t['Zacute'] = 0x0179;
 t['Zcaron'] = 0x017D;
 t['Zcaronsmall'] = 0xF6FF;
 t['Zcircle'] = 0x24CF;
 t['Zcircumflex'] = 0x1E90;
 t['Zdot'] = 0x017B;
 t['Zdotaccent'] = 0x017B;
 t['Zdotbelow'] = 0x1E92;
 t['Zecyrillic'] = 0x0417;
 t['Zedescendercyrillic'] = 0x0498;
 t['Zedieresiscyrillic'] = 0x04DE;
 t['Zeta'] = 0x0396;
 t['Zhearmenian'] = 0x053A;
 t['Zhebrevecyrillic'] = 0x04C1;
 t['Zhecyrillic'] = 0x0416;
 t['Zhedescendercyrillic'] = 0x0496;
 t['Zhedieresiscyrillic'] = 0x04DC;
 t['Zlinebelow'] = 0x1E94;
 t['Zmonospace'] = 0xFF3A;
 t['Zsmall'] = 0xF77A;
 t['Zstroke'] = 0x01B5;
 t['a'] = 0x0061;
 t['aabengali'] = 0x0986;
 t['aacute'] = 0x00E1;
 t['aadeva'] = 0x0906;
 t['aagujarati'] = 0x0A86;
 t['aagurmukhi'] = 0x0A06;
 t['aamatragurmukhi'] = 0x0A3E;
 t['aarusquare'] = 0x3303;
 t['aavowelsignbengali'] = 0x09BE;
 t['aavowelsigndeva'] = 0x093E;
 t['aavowelsigngujarati'] = 0x0ABE;
 t['abbreviationmarkarmenian'] = 0x055F;
 t['abbreviationsigndeva'] = 0x0970;
 t['abengali'] = 0x0985;
 t['abopomofo'] = 0x311A;
 t['abreve'] = 0x0103;
 t['abreveacute'] = 0x1EAF;
 t['abrevecyrillic'] = 0x04D1;
 t['abrevedotbelow'] = 0x1EB7;
 t['abrevegrave'] = 0x1EB1;
 t['abrevehookabove'] = 0x1EB3;
 t['abrevetilde'] = 0x1EB5;
 t['acaron'] = 0x01CE;
 t['acircle'] = 0x24D0;
 t['acircumflex'] = 0x00E2;
 t['acircumflexacute'] = 0x1EA5;
 t['acircumflexdotbelow'] = 0x1EAD;
 t['acircumflexgrave'] = 0x1EA7;
 t['acircumflexhookabove'] = 0x1EA9;
 t['acircumflextilde'] = 0x1EAB;
 t['acute'] = 0x00B4;
 t['acutebelowcmb'] = 0x0317;
 t['acutecmb'] = 0x0301;
 t['acutecomb'] = 0x0301;
 t['acutedeva'] = 0x0954;
 t['acutelowmod'] = 0x02CF;
 t['acutetonecmb'] = 0x0341;
 t['acyrillic'] = 0x0430;
 t['adblgrave'] = 0x0201;
 t['addakgurmukhi'] = 0x0A71;
 t['adeva'] = 0x0905;
 t['adieresis'] = 0x00E4;
 t['adieresiscyrillic'] = 0x04D3;
 t['adieresismacron'] = 0x01DF;
 t['adotbelow'] = 0x1EA1;
 t['adotmacron'] = 0x01E1;
 t['ae'] = 0x00E6;
 t['aeacute'] = 0x01FD;
 t['aekorean'] = 0x3150;
 t['aemacron'] = 0x01E3;
 t['afii00208'] = 0x2015;
 t['afii08941'] = 0x20A4;
 t['afii10017'] = 0x0410;
 t['afii10018'] = 0x0411;
 t['afii10019'] = 0x0412;
 t['afii10020'] = 0x0413;
 t['afii10021'] = 0x0414;
 t['afii10022'] = 0x0415;
 t['afii10023'] = 0x0401;
 t['afii10024'] = 0x0416;
 t['afii10025'] = 0x0417;
 t['afii10026'] = 0x0418;
 t['afii10027'] = 0x0419;
 t['afii10028'] = 0x041A;
 t['afii10029'] = 0x041B;
 t['afii10030'] = 0x041C;
 t['afii10031'] = 0x041D;
 t['afii10032'] = 0x041E;
 t['afii10033'] = 0x041F;
 t['afii10034'] = 0x0420;
 t['afii10035'] = 0x0421;
 t['afii10036'] = 0x0422;
 t['afii10037'] = 0x0423;
 t['afii10038'] = 0x0424;
 t['afii10039'] = 0x0425;
 t['afii10040'] = 0x0426;
 t['afii10041'] = 0x0427;
 t['afii10042'] = 0x0428;
 t['afii10043'] = 0x0429;
 t['afii10044'] = 0x042A;
 t['afii10045'] = 0x042B;
 t['afii10046'] = 0x042C;
 t['afii10047'] = 0x042D;
 t['afii10048'] = 0x042E;
 t['afii10049'] = 0x042F;
 t['afii10050'] = 0x0490;
 t['afii10051'] = 0x0402;
 t['afii10052'] = 0x0403;
 t['afii10053'] = 0x0404;
 t['afii10054'] = 0x0405;
 t['afii10055'] = 0x0406;
 t['afii10056'] = 0x0407;
 t['afii10057'] = 0x0408;
 t['afii10058'] = 0x0409;
 t['afii10059'] = 0x040A;
 t['afii10060'] = 0x040B;
 t['afii10061'] = 0x040C;
 t['afii10062'] = 0x040E;
 t['afii10063'] = 0xF6C4;
 t['afii10064'] = 0xF6C5;
 t['afii10065'] = 0x0430;
 t['afii10066'] = 0x0431;
 t['afii10067'] = 0x0432;
 t['afii10068'] = 0x0433;
 t['afii10069'] = 0x0434;
 t['afii10070'] = 0x0435;
 t['afii10071'] = 0x0451;
 t['afii10072'] = 0x0436;
 t['afii10073'] = 0x0437;
 t['afii10074'] = 0x0438;
 t['afii10075'] = 0x0439;
 t['afii10076'] = 0x043A;
 t['afii10077'] = 0x043B;
 t['afii10078'] = 0x043C;
 t['afii10079'] = 0x043D;
 t['afii10080'] = 0x043E;
 t['afii10081'] = 0x043F;
 t['afii10082'] = 0x0440;
 t['afii10083'] = 0x0441;
 t['afii10084'] = 0x0442;
 t['afii10085'] = 0x0443;
 t['afii10086'] = 0x0444;
 t['afii10087'] = 0x0445;
 t['afii10088'] = 0x0446;
 t['afii10089'] = 0x0447;
 t['afii10090'] = 0x0448;
 t['afii10091'] = 0x0449;
 t['afii10092'] = 0x044A;
 t['afii10093'] = 0x044B;
 t['afii10094'] = 0x044C;
 t['afii10095'] = 0x044D;
 t['afii10096'] = 0x044E;
 t['afii10097'] = 0x044F;
 t['afii10098'] = 0x0491;
 t['afii10099'] = 0x0452;
 t['afii10100'] = 0x0453;
 t['afii10101'] = 0x0454;
 t['afii10102'] = 0x0455;
 t['afii10103'] = 0x0456;
 t['afii10104'] = 0x0457;
 t['afii10105'] = 0x0458;
 t['afii10106'] = 0x0459;
 t['afii10107'] = 0x045A;
 t['afii10108'] = 0x045B;
 t['afii10109'] = 0x045C;
 t['afii10110'] = 0x045E;
 t['afii10145'] = 0x040F;
 t['afii10146'] = 0x0462;
 t['afii10147'] = 0x0472;
 t['afii10148'] = 0x0474;
 t['afii10192'] = 0xF6C6;
 t['afii10193'] = 0x045F;
 t['afii10194'] = 0x0463;
 t['afii10195'] = 0x0473;
 t['afii10196'] = 0x0475;
 t['afii10831'] = 0xF6C7;
 t['afii10832'] = 0xF6C8;
 t['afii10846'] = 0x04D9;
 t['afii299'] = 0x200E;
 t['afii300'] = 0x200F;
 t['afii301'] = 0x200D;
 t['afii57381'] = 0x066A;
 t['afii57388'] = 0x060C;
 t['afii57392'] = 0x0660;
 t['afii57393'] = 0x0661;
 t['afii57394'] = 0x0662;
 t['afii57395'] = 0x0663;
 t['afii57396'] = 0x0664;
 t['afii57397'] = 0x0665;
 t['afii57398'] = 0x0666;
 t['afii57399'] = 0x0667;
 t['afii57400'] = 0x0668;
 t['afii57401'] = 0x0669;
 t['afii57403'] = 0x061B;
 t['afii57407'] = 0x061F;
 t['afii57409'] = 0x0621;
 t['afii57410'] = 0x0622;
 t['afii57411'] = 0x0623;
 t['afii57412'] = 0x0624;
 t['afii57413'] = 0x0625;
 t['afii57414'] = 0x0626;
 t['afii57415'] = 0x0627;
 t['afii57416'] = 0x0628;
 t['afii57417'] = 0x0629;
 t['afii57418'] = 0x062A;
 t['afii57419'] = 0x062B;
 t['afii57420'] = 0x062C;
 t['afii57421'] = 0x062D;
 t['afii57422'] = 0x062E;
 t['afii57423'] = 0x062F;
 t['afii57424'] = 0x0630;
 t['afii57425'] = 0x0631;
 t['afii57426'] = 0x0632;
 t['afii57427'] = 0x0633;
 t['afii57428'] = 0x0634;
 t['afii57429'] = 0x0635;
 t['afii57430'] = 0x0636;
 t['afii57431'] = 0x0637;
 t['afii57432'] = 0x0638;
 t['afii57433'] = 0x0639;
 t['afii57434'] = 0x063A;
 t['afii57440'] = 0x0640;
 t['afii57441'] = 0x0641;
 t['afii57442'] = 0x0642;
 t['afii57443'] = 0x0643;
 t['afii57444'] = 0x0644;
 t['afii57445'] = 0x0645;
 t['afii57446'] = 0x0646;
 t['afii57448'] = 0x0648;
 t['afii57449'] = 0x0649;
 t['afii57450'] = 0x064A;
 t['afii57451'] = 0x064B;
 t['afii57452'] = 0x064C;
 t['afii57453'] = 0x064D;
 t['afii57454'] = 0x064E;
 t['afii57455'] = 0x064F;
 t['afii57456'] = 0x0650;
 t['afii57457'] = 0x0651;
 t['afii57458'] = 0x0652;
 t['afii57470'] = 0x0647;
 t['afii57505'] = 0x06A4;
 t['afii57506'] = 0x067E;
 t['afii57507'] = 0x0686;
 t['afii57508'] = 0x0698;
 t['afii57509'] = 0x06AF;
 t['afii57511'] = 0x0679;
 t['afii57512'] = 0x0688;
 t['afii57513'] = 0x0691;
 t['afii57514'] = 0x06BA;
 t['afii57519'] = 0x06D2;
 t['afii57534'] = 0x06D5;
 t['afii57636'] = 0x20AA;
 t['afii57645'] = 0x05BE;
 t['afii57658'] = 0x05C3;
 t['afii57664'] = 0x05D0;
 t['afii57665'] = 0x05D1;
 t['afii57666'] = 0x05D2;
 t['afii57667'] = 0x05D3;
 t['afii57668'] = 0x05D4;
 t['afii57669'] = 0x05D5;
 t['afii57670'] = 0x05D6;
 t['afii57671'] = 0x05D7;
 t['afii57672'] = 0x05D8;
 t['afii57673'] = 0x05D9;
 t['afii57674'] = 0x05DA;
 t['afii57675'] = 0x05DB;
 t['afii57676'] = 0x05DC;
 t['afii57677'] = 0x05DD;
 t['afii57678'] = 0x05DE;
 t['afii57679'] = 0x05DF;
 t['afii57680'] = 0x05E0;
 t['afii57681'] = 0x05E1;
 t['afii57682'] = 0x05E2;
 t['afii57683'] = 0x05E3;
 t['afii57684'] = 0x05E4;
 t['afii57685'] = 0x05E5;
 t['afii57686'] = 0x05E6;
 t['afii57687'] = 0x05E7;
 t['afii57688'] = 0x05E8;
 t['afii57689'] = 0x05E9;
 t['afii57690'] = 0x05EA;
 t['afii57694'] = 0xFB2A;
 t['afii57695'] = 0xFB2B;
 t['afii57700'] = 0xFB4B;
 t['afii57705'] = 0xFB1F;
 t['afii57716'] = 0x05F0;
 t['afii57717'] = 0x05F1;
 t['afii57718'] = 0x05F2;
 t['afii57723'] = 0xFB35;
 t['afii57793'] = 0x05B4;
 t['afii57794'] = 0x05B5;
 t['afii57795'] = 0x05B6;
 t['afii57796'] = 0x05BB;
 t['afii57797'] = 0x05B8;
 t['afii57798'] = 0x05B7;
 t['afii57799'] = 0x05B0;
 t['afii57800'] = 0x05B2;
 t['afii57801'] = 0x05B1;
 t['afii57802'] = 0x05B3;
 t['afii57803'] = 0x05C2;
 t['afii57804'] = 0x05C1;
 t['afii57806'] = 0x05B9;
 t['afii57807'] = 0x05BC;
 t['afii57839'] = 0x05BD;
 t['afii57841'] = 0x05BF;
 t['afii57842'] = 0x05C0;
 t['afii57929'] = 0x02BC;
 t['afii61248'] = 0x2105;
 t['afii61289'] = 0x2113;
 t['afii61352'] = 0x2116;
 t['afii61573'] = 0x202C;
 t['afii61574'] = 0x202D;
 t['afii61575'] = 0x202E;
 t['afii61664'] = 0x200C;
 t['afii63167'] = 0x066D;
 t['afii64937'] = 0x02BD;
 t['agrave'] = 0x00E0;
 t['agujarati'] = 0x0A85;
 t['agurmukhi'] = 0x0A05;
 t['ahiragana'] = 0x3042;
 t['ahookabove'] = 0x1EA3;
 t['aibengali'] = 0x0990;
 t['aibopomofo'] = 0x311E;
 t['aideva'] = 0x0910;
 t['aiecyrillic'] = 0x04D5;
 t['aigujarati'] = 0x0A90;
 t['aigurmukhi'] = 0x0A10;
 t['aimatragurmukhi'] = 0x0A48;
 t['ainarabic'] = 0x0639;
 t['ainfinalarabic'] = 0xFECA;
 t['aininitialarabic'] = 0xFECB;
 t['ainmedialarabic'] = 0xFECC;
 t['ainvertedbreve'] = 0x0203;
 t['aivowelsignbengali'] = 0x09C8;
 t['aivowelsigndeva'] = 0x0948;
 t['aivowelsigngujarati'] = 0x0AC8;
 t['akatakana'] = 0x30A2;
 t['akatakanahalfwidth'] = 0xFF71;
 t['akorean'] = 0x314F;
 t['alef'] = 0x05D0;
 t['alefarabic'] = 0x0627;
 t['alefdageshhebrew'] = 0xFB30;
 t['aleffinalarabic'] = 0xFE8E;
 t['alefhamzaabovearabic'] = 0x0623;
 t['alefhamzaabovefinalarabic'] = 0xFE84;
 t['alefhamzabelowarabic'] = 0x0625;
 t['alefhamzabelowfinalarabic'] = 0xFE88;
 t['alefhebrew'] = 0x05D0;
 t['aleflamedhebrew'] = 0xFB4F;
 t['alefmaddaabovearabic'] = 0x0622;
 t['alefmaddaabovefinalarabic'] = 0xFE82;
 t['alefmaksuraarabic'] = 0x0649;
 t['alefmaksurafinalarabic'] = 0xFEF0;
 t['alefmaksurainitialarabic'] = 0xFEF3;
 t['alefmaksuramedialarabic'] = 0xFEF4;
 t['alefpatahhebrew'] = 0xFB2E;
 t['alefqamatshebrew'] = 0xFB2F;
 t['aleph'] = 0x2135;
 t['allequal'] = 0x224C;
 t['alpha'] = 0x03B1;
 t['alphatonos'] = 0x03AC;
 t['amacron'] = 0x0101;
 t['amonospace'] = 0xFF41;
 t['ampersand'] = 0x0026;
 t['ampersandmonospace'] = 0xFF06;
 t['ampersandsmall'] = 0xF726;
 t['amsquare'] = 0x33C2;
 t['anbopomofo'] = 0x3122;
 t['angbopomofo'] = 0x3124;
 t['angbracketleft'] = 0x3008;
 t['angbracketright'] = 0x3009;
 t['angkhankhuthai'] = 0x0E5A;
 t['angle'] = 0x2220;
 t['anglebracketleft'] = 0x3008;
 t['anglebracketleftvertical'] = 0xFE3F;
 t['anglebracketright'] = 0x3009;
 t['anglebracketrightvertical'] = 0xFE40;
 t['angleleft'] = 0x2329;
 t['angleright'] = 0x232A;
 t['angstrom'] = 0x212B;
 t['anoteleia'] = 0x0387;
 t['anudattadeva'] = 0x0952;
 t['anusvarabengali'] = 0x0982;
 t['anusvaradeva'] = 0x0902;
 t['anusvaragujarati'] = 0x0A82;
 t['aogonek'] = 0x0105;
 t['apaatosquare'] = 0x3300;
 t['aparen'] = 0x249C;
 t['apostrophearmenian'] = 0x055A;
 t['apostrophemod'] = 0x02BC;
 t['apple'] = 0xF8FF;
 t['approaches'] = 0x2250;
 t['approxequal'] = 0x2248;
 t['approxequalorimage'] = 0x2252;
 t['approximatelyequal'] = 0x2245;
 t['araeaekorean'] = 0x318E;
 t['araeakorean'] = 0x318D;
 t['arc'] = 0x2312;
 t['arighthalfring'] = 0x1E9A;
 t['aring'] = 0x00E5;
 t['aringacute'] = 0x01FB;
 t['aringbelow'] = 0x1E01;
 t['arrowboth'] = 0x2194;
 t['arrowdashdown'] = 0x21E3;
 t['arrowdashleft'] = 0x21E0;
 t['arrowdashright'] = 0x21E2;
 t['arrowdashup'] = 0x21E1;
 t['arrowdblboth'] = 0x21D4;
 t['arrowdbldown'] = 0x21D3;
 t['arrowdblleft'] = 0x21D0;
 t['arrowdblright'] = 0x21D2;
 t['arrowdblup'] = 0x21D1;
 t['arrowdown'] = 0x2193;
 t['arrowdownleft'] = 0x2199;
 t['arrowdownright'] = 0x2198;
 t['arrowdownwhite'] = 0x21E9;
 t['arrowheaddownmod'] = 0x02C5;
 t['arrowheadleftmod'] = 0x02C2;
 t['arrowheadrightmod'] = 0x02C3;
 t['arrowheadupmod'] = 0x02C4;
 t['arrowhorizex'] = 0xF8E7;
 t['arrowleft'] = 0x2190;
 t['arrowleftdbl'] = 0x21D0;
 t['arrowleftdblstroke'] = 0x21CD;
 t['arrowleftoverright'] = 0x21C6;
 t['arrowleftwhite'] = 0x21E6;
 t['arrowright'] = 0x2192;
 t['arrowrightdblstroke'] = 0x21CF;
 t['arrowrightheavy'] = 0x279E;
 t['arrowrightoverleft'] = 0x21C4;
 t['arrowrightwhite'] = 0x21E8;
 t['arrowtableft'] = 0x21E4;
 t['arrowtabright'] = 0x21E5;
 t['arrowup'] = 0x2191;
 t['arrowupdn'] = 0x2195;
 t['arrowupdnbse'] = 0x21A8;
 t['arrowupdownbase'] = 0x21A8;
 t['arrowupleft'] = 0x2196;
 t['arrowupleftofdown'] = 0x21C5;
 t['arrowupright'] = 0x2197;
 t['arrowupwhite'] = 0x21E7;
 t['arrowvertex'] = 0xF8E6;
 t['asciicircum'] = 0x005E;
 t['asciicircummonospace'] = 0xFF3E;
 t['asciitilde'] = 0x007E;
 t['asciitildemonospace'] = 0xFF5E;
 t['ascript'] = 0x0251;
 t['ascriptturned'] = 0x0252;
 t['asmallhiragana'] = 0x3041;
 t['asmallkatakana'] = 0x30A1;
 t['asmallkatakanahalfwidth'] = 0xFF67;
 t['asterisk'] = 0x002A;
 t['asteriskaltonearabic'] = 0x066D;
 t['asteriskarabic'] = 0x066D;
 t['asteriskmath'] = 0x2217;
 t['asteriskmonospace'] = 0xFF0A;
 t['asterisksmall'] = 0xFE61;
 t['asterism'] = 0x2042;
 t['asuperior'] = 0xF6E9;
 t['asymptoticallyequal'] = 0x2243;
 t['at'] = 0x0040;
 t['atilde'] = 0x00E3;
 t['atmonospace'] = 0xFF20;
 t['atsmall'] = 0xFE6B;
 t['aturned'] = 0x0250;
 t['aubengali'] = 0x0994;
 t['aubopomofo'] = 0x3120;
 t['audeva'] = 0x0914;
 t['augujarati'] = 0x0A94;
 t['augurmukhi'] = 0x0A14;
 t['aulengthmarkbengali'] = 0x09D7;
 t['aumatragurmukhi'] = 0x0A4C;
 t['auvowelsignbengali'] = 0x09CC;
 t['auvowelsigndeva'] = 0x094C;
 t['auvowelsigngujarati'] = 0x0ACC;
 t['avagrahadeva'] = 0x093D;
 t['aybarmenian'] = 0x0561;
 t['ayin'] = 0x05E2;
 t['ayinaltonehebrew'] = 0xFB20;
 t['ayinhebrew'] = 0x05E2;
 t['b'] = 0x0062;
 t['babengali'] = 0x09AC;
 t['backslash'] = 0x005C;
 t['backslashmonospace'] = 0xFF3C;
 t['badeva'] = 0x092C;
 t['bagujarati'] = 0x0AAC;
 t['bagurmukhi'] = 0x0A2C;
 t['bahiragana'] = 0x3070;
 t['bahtthai'] = 0x0E3F;
 t['bakatakana'] = 0x30D0;
 t['bar'] = 0x007C;
 t['barmonospace'] = 0xFF5C;
 t['bbopomofo'] = 0x3105;
 t['bcircle'] = 0x24D1;
 t['bdotaccent'] = 0x1E03;
 t['bdotbelow'] = 0x1E05;
 t['beamedsixteenthnotes'] = 0x266C;
 t['because'] = 0x2235;
 t['becyrillic'] = 0x0431;
 t['beharabic'] = 0x0628;
 t['behfinalarabic'] = 0xFE90;
 t['behinitialarabic'] = 0xFE91;
 t['behiragana'] = 0x3079;
 t['behmedialarabic'] = 0xFE92;
 t['behmeeminitialarabic'] = 0xFC9F;
 t['behmeemisolatedarabic'] = 0xFC08;
 t['behnoonfinalarabic'] = 0xFC6D;
 t['bekatakana'] = 0x30D9;
 t['benarmenian'] = 0x0562;
 t['bet'] = 0x05D1;
 t['beta'] = 0x03B2;
 t['betasymbolgreek'] = 0x03D0;
 t['betdagesh'] = 0xFB31;
 t['betdageshhebrew'] = 0xFB31;
 t['bethebrew'] = 0x05D1;
 t['betrafehebrew'] = 0xFB4C;
 t['bhabengali'] = 0x09AD;
 t['bhadeva'] = 0x092D;
 t['bhagujarati'] = 0x0AAD;
 t['bhagurmukhi'] = 0x0A2D;
 t['bhook'] = 0x0253;
 t['bihiragana'] = 0x3073;
 t['bikatakana'] = 0x30D3;
 t['bilabialclick'] = 0x0298;
 t['bindigurmukhi'] = 0x0A02;
 t['birusquare'] = 0x3331;
 t['blackcircle'] = 0x25CF;
 t['blackdiamond'] = 0x25C6;
 t['blackdownpointingtriangle'] = 0x25BC;
 t['blackleftpointingpointer'] = 0x25C4;
 t['blackleftpointingtriangle'] = 0x25C0;
 t['blacklenticularbracketleft'] = 0x3010;
 t['blacklenticularbracketleftvertical'] = 0xFE3B;
 t['blacklenticularbracketright'] = 0x3011;
 t['blacklenticularbracketrightvertical'] = 0xFE3C;
 t['blacklowerlefttriangle'] = 0x25E3;
 t['blacklowerrighttriangle'] = 0x25E2;
 t['blackrectangle'] = 0x25AC;
 t['blackrightpointingpointer'] = 0x25BA;
 t['blackrightpointingtriangle'] = 0x25B6;
 t['blacksmallsquare'] = 0x25AA;
 t['blacksmilingface'] = 0x263B;
 t['blacksquare'] = 0x25A0;
 t['blackstar'] = 0x2605;
 t['blackupperlefttriangle'] = 0x25E4;
 t['blackupperrighttriangle'] = 0x25E5;
 t['blackuppointingsmalltriangle'] = 0x25B4;
 t['blackuppointingtriangle'] = 0x25B2;
 t['blank'] = 0x2423;
 t['blinebelow'] = 0x1E07;
 t['block'] = 0x2588;
 t['bmonospace'] = 0xFF42;
 t['bobaimaithai'] = 0x0E1A;
 t['bohiragana'] = 0x307C;
 t['bokatakana'] = 0x30DC;
 t['bparen'] = 0x249D;
 t['bqsquare'] = 0x33C3;
 t['braceex'] = 0xF8F4;
 t['braceleft'] = 0x007B;
 t['braceleftbt'] = 0xF8F3;
 t['braceleftmid'] = 0xF8F2;
 t['braceleftmonospace'] = 0xFF5B;
 t['braceleftsmall'] = 0xFE5B;
 t['bracelefttp'] = 0xF8F1;
 t['braceleftvertical'] = 0xFE37;
 t['braceright'] = 0x007D;
 t['bracerightbt'] = 0xF8FE;
 t['bracerightmid'] = 0xF8FD;
 t['bracerightmonospace'] = 0xFF5D;
 t['bracerightsmall'] = 0xFE5C;
 t['bracerighttp'] = 0xF8FC;
 t['bracerightvertical'] = 0xFE38;
 t['bracketleft'] = 0x005B;
 t['bracketleftbt'] = 0xF8F0;
 t['bracketleftex'] = 0xF8EF;
 t['bracketleftmonospace'] = 0xFF3B;
 t['bracketlefttp'] = 0xF8EE;
 t['bracketright'] = 0x005D;
 t['bracketrightbt'] = 0xF8FB;
 t['bracketrightex'] = 0xF8FA;
 t['bracketrightmonospace'] = 0xFF3D;
 t['bracketrighttp'] = 0xF8F9;
 t['breve'] = 0x02D8;
 t['brevebelowcmb'] = 0x032E;
 t['brevecmb'] = 0x0306;
 t['breveinvertedbelowcmb'] = 0x032F;
 t['breveinvertedcmb'] = 0x0311;
 t['breveinverteddoublecmb'] = 0x0361;
 t['bridgebelowcmb'] = 0x032A;
 t['bridgeinvertedbelowcmb'] = 0x033A;
 t['brokenbar'] = 0x00A6;
 t['bstroke'] = 0x0180;
 t['bsuperior'] = 0xF6EA;
 t['btopbar'] = 0x0183;
 t['buhiragana'] = 0x3076;
 t['bukatakana'] = 0x30D6;
 t['bullet'] = 0x2022;
 t['bulletinverse'] = 0x25D8;
 t['bulletoperator'] = 0x2219;
 t['bullseye'] = 0x25CE;
 t['c'] = 0x0063;
 t['caarmenian'] = 0x056E;
 t['cabengali'] = 0x099A;
 t['cacute'] = 0x0107;
 t['cadeva'] = 0x091A;
 t['cagujarati'] = 0x0A9A;
 t['cagurmukhi'] = 0x0A1A;
 t['calsquare'] = 0x3388;
 t['candrabindubengali'] = 0x0981;
 t['candrabinducmb'] = 0x0310;
 t['candrabindudeva'] = 0x0901;
 t['candrabindugujarati'] = 0x0A81;
 t['capslock'] = 0x21EA;
 t['careof'] = 0x2105;
 t['caron'] = 0x02C7;
 t['caronbelowcmb'] = 0x032C;
 t['caroncmb'] = 0x030C;
 t['carriagereturn'] = 0x21B5;
 t['cbopomofo'] = 0x3118;
 t['ccaron'] = 0x010D;
 t['ccedilla'] = 0x00E7;
 t['ccedillaacute'] = 0x1E09;
 t['ccircle'] = 0x24D2;
 t['ccircumflex'] = 0x0109;
 t['ccurl'] = 0x0255;
 t['cdot'] = 0x010B;
 t['cdotaccent'] = 0x010B;
 t['cdsquare'] = 0x33C5;
 t['cedilla'] = 0x00B8;
 t['cedillacmb'] = 0x0327;
 t['cent'] = 0x00A2;
 t['centigrade'] = 0x2103;
 t['centinferior'] = 0xF6DF;
 t['centmonospace'] = 0xFFE0;
 t['centoldstyle'] = 0xF7A2;
 t['centsuperior'] = 0xF6E0;
 t['chaarmenian'] = 0x0579;
 t['chabengali'] = 0x099B;
 t['chadeva'] = 0x091B;
 t['chagujarati'] = 0x0A9B;
 t['chagurmukhi'] = 0x0A1B;
 t['chbopomofo'] = 0x3114;
 t['cheabkhasiancyrillic'] = 0x04BD;
 t['checkmark'] = 0x2713;
 t['checyrillic'] = 0x0447;
 t['chedescenderabkhasiancyrillic'] = 0x04BF;
 t['chedescendercyrillic'] = 0x04B7;
 t['chedieresiscyrillic'] = 0x04F5;
 t['cheharmenian'] = 0x0573;
 t['chekhakassiancyrillic'] = 0x04CC;
 t['cheverticalstrokecyrillic'] = 0x04B9;
 t['chi'] = 0x03C7;
 t['chieuchacirclekorean'] = 0x3277;
 t['chieuchaparenkorean'] = 0x3217;
 t['chieuchcirclekorean'] = 0x3269;
 t['chieuchkorean'] = 0x314A;
 t['chieuchparenkorean'] = 0x3209;
 t['chochangthai'] = 0x0E0A;
 t['chochanthai'] = 0x0E08;
 t['chochingthai'] = 0x0E09;
 t['chochoethai'] = 0x0E0C;
 t['chook'] = 0x0188;
 t['cieucacirclekorean'] = 0x3276;
 t['cieucaparenkorean'] = 0x3216;
 t['cieuccirclekorean'] = 0x3268;
 t['cieuckorean'] = 0x3148;
 t['cieucparenkorean'] = 0x3208;
 t['cieucuparenkorean'] = 0x321C;
 t['circle'] = 0x25CB;
 t['circlecopyrt'] = 0x00A9;
 t['circlemultiply'] = 0x2297;
 t['circleot'] = 0x2299;
 t['circleplus'] = 0x2295;
 t['circlepostalmark'] = 0x3036;
 t['circlewithlefthalfblack'] = 0x25D0;
 t['circlewithrighthalfblack'] = 0x25D1;
 t['circumflex'] = 0x02C6;
 t['circumflexbelowcmb'] = 0x032D;
 t['circumflexcmb'] = 0x0302;
 t['clear'] = 0x2327;
 t['clickalveolar'] = 0x01C2;
 t['clickdental'] = 0x01C0;
 t['clicklateral'] = 0x01C1;
 t['clickretroflex'] = 0x01C3;
 t['club'] = 0x2663;
 t['clubsuitblack'] = 0x2663;
 t['clubsuitwhite'] = 0x2667;
 t['cmcubedsquare'] = 0x33A4;
 t['cmonospace'] = 0xFF43;
 t['cmsquaredsquare'] = 0x33A0;
 t['coarmenian'] = 0x0581;
 t['colon'] = 0x003A;
 t['colonmonetary'] = 0x20A1;
 t['colonmonospace'] = 0xFF1A;
 t['colonsign'] = 0x20A1;
 t['colonsmall'] = 0xFE55;
 t['colontriangularhalfmod'] = 0x02D1;
 t['colontriangularmod'] = 0x02D0;
 t['comma'] = 0x002C;
 t['commaabovecmb'] = 0x0313;
 t['commaaboverightcmb'] = 0x0315;
 t['commaaccent'] = 0xF6C3;
 t['commaarabic'] = 0x060C;
 t['commaarmenian'] = 0x055D;
 t['commainferior'] = 0xF6E1;
 t['commamonospace'] = 0xFF0C;
 t['commareversedabovecmb'] = 0x0314;
 t['commareversedmod'] = 0x02BD;
 t['commasmall'] = 0xFE50;
 t['commasuperior'] = 0xF6E2;
 t['commaturnedabovecmb'] = 0x0312;
 t['commaturnedmod'] = 0x02BB;
 t['compass'] = 0x263C;
 t['congruent'] = 0x2245;
 t['contourintegral'] = 0x222E;
 t['control'] = 0x2303;
 t['controlACK'] = 0x0006;
 t['controlBEL'] = 0x0007;
 t['controlBS'] = 0x0008;
 t['controlCAN'] = 0x0018;
 t['controlCR'] = 0x000D;
 t['controlDC1'] = 0x0011;
 t['controlDC2'] = 0x0012;
 t['controlDC3'] = 0x0013;
 t['controlDC4'] = 0x0014;
 t['controlDEL'] = 0x007F;
 t['controlDLE'] = 0x0010;
 t['controlEM'] = 0x0019;
 t['controlENQ'] = 0x0005;
 t['controlEOT'] = 0x0004;
 t['controlESC'] = 0x001B;
 t['controlETB'] = 0x0017;
 t['controlETX'] = 0x0003;
 t['controlFF'] = 0x000C;
 t['controlFS'] = 0x001C;
 t['controlGS'] = 0x001D;
 t['controlHT'] = 0x0009;
 t['controlLF'] = 0x000A;
 t['controlNAK'] = 0x0015;
 t['controlNULL'] = 0x0000;
 t['controlRS'] = 0x001E;
 t['controlSI'] = 0x000F;
 t['controlSO'] = 0x000E;
 t['controlSOT'] = 0x0002;
 t['controlSTX'] = 0x0001;
 t['controlSUB'] = 0x001A;
 t['controlSYN'] = 0x0016;
 t['controlUS'] = 0x001F;
 t['controlVT'] = 0x000B;
 t['copyright'] = 0x00A9;
 t['copyrightsans'] = 0xF8E9;
 t['copyrightserif'] = 0xF6D9;
 t['cornerbracketleft'] = 0x300C;
 t['cornerbracketlefthalfwidth'] = 0xFF62;
 t['cornerbracketleftvertical'] = 0xFE41;
 t['cornerbracketright'] = 0x300D;
 t['cornerbracketrighthalfwidth'] = 0xFF63;
 t['cornerbracketrightvertical'] = 0xFE42;
 t['corporationsquare'] = 0x337F;
 t['cosquare'] = 0x33C7;
 t['coverkgsquare'] = 0x33C6;
 t['cparen'] = 0x249E;
 t['cruzeiro'] = 0x20A2;
 t['cstretched'] = 0x0297;
 t['curlyand'] = 0x22CF;
 t['curlyor'] = 0x22CE;
 t['currency'] = 0x00A4;
 t['cyrBreve'] = 0xF6D1;
 t['cyrFlex'] = 0xF6D2;
 t['cyrbreve'] = 0xF6D4;
 t['cyrflex'] = 0xF6D5;
 t['d'] = 0x0064;
 t['daarmenian'] = 0x0564;
 t['dabengali'] = 0x09A6;
 t['dadarabic'] = 0x0636;
 t['dadeva'] = 0x0926;
 t['dadfinalarabic'] = 0xFEBE;
 t['dadinitialarabic'] = 0xFEBF;
 t['dadmedialarabic'] = 0xFEC0;
 t['dagesh'] = 0x05BC;
 t['dageshhebrew'] = 0x05BC;
 t['dagger'] = 0x2020;
 t['daggerdbl'] = 0x2021;
 t['dagujarati'] = 0x0AA6;
 t['dagurmukhi'] = 0x0A26;
 t['dahiragana'] = 0x3060;
 t['dakatakana'] = 0x30C0;
 t['dalarabic'] = 0x062F;
 t['dalet'] = 0x05D3;
 t['daletdagesh'] = 0xFB33;
 t['daletdageshhebrew'] = 0xFB33;
 t['dalethebrew'] = 0x05D3;
 t['dalfinalarabic'] = 0xFEAA;
 t['dammaarabic'] = 0x064F;
 t['dammalowarabic'] = 0x064F;
 t['dammatanaltonearabic'] = 0x064C;
 t['dammatanarabic'] = 0x064C;
 t['danda'] = 0x0964;
 t['dargahebrew'] = 0x05A7;
 t['dargalefthebrew'] = 0x05A7;
 t['dasiapneumatacyrilliccmb'] = 0x0485;
 t['dblGrave'] = 0xF6D3;
 t['dblanglebracketleft'] = 0x300A;
 t['dblanglebracketleftvertical'] = 0xFE3D;
 t['dblanglebracketright'] = 0x300B;
 t['dblanglebracketrightvertical'] = 0xFE3E;
 t['dblarchinvertedbelowcmb'] = 0x032B;
 t['dblarrowleft'] = 0x21D4;
 t['dblarrowright'] = 0x21D2;
 t['dbldanda'] = 0x0965;
 t['dblgrave'] = 0xF6D6;
 t['dblgravecmb'] = 0x030F;
 t['dblintegral'] = 0x222C;
 t['dbllowline'] = 0x2017;
 t['dbllowlinecmb'] = 0x0333;
 t['dbloverlinecmb'] = 0x033F;
 t['dblprimemod'] = 0x02BA;
 t['dblverticalbar'] = 0x2016;
 t['dblverticallineabovecmb'] = 0x030E;
 t['dbopomofo'] = 0x3109;
 t['dbsquare'] = 0x33C8;
 t['dcaron'] = 0x010F;
 t['dcedilla'] = 0x1E11;
 t['dcircle'] = 0x24D3;
 t['dcircumflexbelow'] = 0x1E13;
 t['dcroat'] = 0x0111;
 t['ddabengali'] = 0x09A1;
 t['ddadeva'] = 0x0921;
 t['ddagujarati'] = 0x0AA1;
 t['ddagurmukhi'] = 0x0A21;
 t['ddalarabic'] = 0x0688;
 t['ddalfinalarabic'] = 0xFB89;
 t['dddhadeva'] = 0x095C;
 t['ddhabengali'] = 0x09A2;
 t['ddhadeva'] = 0x0922;
 t['ddhagujarati'] = 0x0AA2;
 t['ddhagurmukhi'] = 0x0A22;
 t['ddotaccent'] = 0x1E0B;
 t['ddotbelow'] = 0x1E0D;
 t['decimalseparatorarabic'] = 0x066B;
 t['decimalseparatorpersian'] = 0x066B;
 t['decyrillic'] = 0x0434;
 t['degree'] = 0x00B0;
 t['dehihebrew'] = 0x05AD;
 t['dehiragana'] = 0x3067;
 t['deicoptic'] = 0x03EF;
 t['dekatakana'] = 0x30C7;
 t['deleteleft'] = 0x232B;
 t['deleteright'] = 0x2326;
 t['delta'] = 0x03B4;
 t['deltaturned'] = 0x018D;
 t['denominatorminusonenumeratorbengali'] = 0x09F8;
 t['dezh'] = 0x02A4;
 t['dhabengali'] = 0x09A7;
 t['dhadeva'] = 0x0927;
 t['dhagujarati'] = 0x0AA7;
 t['dhagurmukhi'] = 0x0A27;
 t['dhook'] = 0x0257;
 t['dialytikatonos'] = 0x0385;
 t['dialytikatonoscmb'] = 0x0344;
 t['diamond'] = 0x2666;
 t['diamondsuitwhite'] = 0x2662;
 t['dieresis'] = 0x00A8;
 t['dieresisacute'] = 0xF6D7;
 t['dieresisbelowcmb'] = 0x0324;
 t['dieresiscmb'] = 0x0308;
 t['dieresisgrave'] = 0xF6D8;
 t['dieresistonos'] = 0x0385;
 t['dihiragana'] = 0x3062;
 t['dikatakana'] = 0x30C2;
 t['dittomark'] = 0x3003;
 t['divide'] = 0x00F7;
 t['divides'] = 0x2223;
 t['divisionslash'] = 0x2215;
 t['djecyrillic'] = 0x0452;
 t['dkshade'] = 0x2593;
 t['dlinebelow'] = 0x1E0F;
 t['dlsquare'] = 0x3397;
 t['dmacron'] = 0x0111;
 t['dmonospace'] = 0xFF44;
 t['dnblock'] = 0x2584;
 t['dochadathai'] = 0x0E0E;
 t['dodekthai'] = 0x0E14;
 t['dohiragana'] = 0x3069;
 t['dokatakana'] = 0x30C9;
 t['dollar'] = 0x0024;
 t['dollarinferior'] = 0xF6E3;
 t['dollarmonospace'] = 0xFF04;
 t['dollaroldstyle'] = 0xF724;
 t['dollarsmall'] = 0xFE69;
 t['dollarsuperior'] = 0xF6E4;
 t['dong'] = 0x20AB;
 t['dorusquare'] = 0x3326;
 t['dotaccent'] = 0x02D9;
 t['dotaccentcmb'] = 0x0307;
 t['dotbelowcmb'] = 0x0323;
 t['dotbelowcomb'] = 0x0323;
 t['dotkatakana'] = 0x30FB;
 t['dotlessi'] = 0x0131;
 t['dotlessj'] = 0xF6BE;
 t['dotlessjstrokehook'] = 0x0284;
 t['dotmath'] = 0x22C5;
 t['dottedcircle'] = 0x25CC;
 t['doubleyodpatah'] = 0xFB1F;
 t['doubleyodpatahhebrew'] = 0xFB1F;
 t['downtackbelowcmb'] = 0x031E;
 t['downtackmod'] = 0x02D5;
 t['dparen'] = 0x249F;
 t['dsuperior'] = 0xF6EB;
 t['dtail'] = 0x0256;
 t['dtopbar'] = 0x018C;
 t['duhiragana'] = 0x3065;
 t['dukatakana'] = 0x30C5;
 t['dz'] = 0x01F3;
 t['dzaltone'] = 0x02A3;
 t['dzcaron'] = 0x01C6;
 t['dzcurl'] = 0x02A5;
 t['dzeabkhasiancyrillic'] = 0x04E1;
 t['dzecyrillic'] = 0x0455;
 t['dzhecyrillic'] = 0x045F;
 t['e'] = 0x0065;
 t['eacute'] = 0x00E9;
 t['earth'] = 0x2641;
 t['ebengali'] = 0x098F;
 t['ebopomofo'] = 0x311C;
 t['ebreve'] = 0x0115;
 t['ecandradeva'] = 0x090D;
 t['ecandragujarati'] = 0x0A8D;
 t['ecandravowelsigndeva'] = 0x0945;
 t['ecandravowelsigngujarati'] = 0x0AC5;
 t['ecaron'] = 0x011B;
 t['ecedillabreve'] = 0x1E1D;
 t['echarmenian'] = 0x0565;
 t['echyiwnarmenian'] = 0x0587;
 t['ecircle'] = 0x24D4;
 t['ecircumflex'] = 0x00EA;
 t['ecircumflexacute'] = 0x1EBF;
 t['ecircumflexbelow'] = 0x1E19;
 t['ecircumflexdotbelow'] = 0x1EC7;
 t['ecircumflexgrave'] = 0x1EC1;
 t['ecircumflexhookabove'] = 0x1EC3;
 t['ecircumflextilde'] = 0x1EC5;
 t['ecyrillic'] = 0x0454;
 t['edblgrave'] = 0x0205;
 t['edeva'] = 0x090F;
 t['edieresis'] = 0x00EB;
 t['edot'] = 0x0117;
 t['edotaccent'] = 0x0117;
 t['edotbelow'] = 0x1EB9;
 t['eegurmukhi'] = 0x0A0F;
 t['eematragurmukhi'] = 0x0A47;
 t['efcyrillic'] = 0x0444;
 t['egrave'] = 0x00E8;
 t['egujarati'] = 0x0A8F;
 t['eharmenian'] = 0x0567;
 t['ehbopomofo'] = 0x311D;
 t['ehiragana'] = 0x3048;
 t['ehookabove'] = 0x1EBB;
 t['eibopomofo'] = 0x311F;
 t['eight'] = 0x0038;
 t['eightarabic'] = 0x0668;
 t['eightbengali'] = 0x09EE;
 t['eightcircle'] = 0x2467;
 t['eightcircleinversesansserif'] = 0x2791;
 t['eightdeva'] = 0x096E;
 t['eighteencircle'] = 0x2471;
 t['eighteenparen'] = 0x2485;
 t['eighteenperiod'] = 0x2499;
 t['eightgujarati'] = 0x0AEE;
 t['eightgurmukhi'] = 0x0A6E;
 t['eighthackarabic'] = 0x0668;
 t['eighthangzhou'] = 0x3028;
 t['eighthnotebeamed'] = 0x266B;
 t['eightideographicparen'] = 0x3227;
 t['eightinferior'] = 0x2088;
 t['eightmonospace'] = 0xFF18;
 t['eightoldstyle'] = 0xF738;
 t['eightparen'] = 0x247B;
 t['eightperiod'] = 0x248F;
 t['eightpersian'] = 0x06F8;
 t['eightroman'] = 0x2177;
 t['eightsuperior'] = 0x2078;
 t['eightthai'] = 0x0E58;
 t['einvertedbreve'] = 0x0207;
 t['eiotifiedcyrillic'] = 0x0465;
 t['ekatakana'] = 0x30A8;
 t['ekatakanahalfwidth'] = 0xFF74;
 t['ekonkargurmukhi'] = 0x0A74;
 t['ekorean'] = 0x3154;
 t['elcyrillic'] = 0x043B;
 t['element'] = 0x2208;
 t['elevencircle'] = 0x246A;
 t['elevenparen'] = 0x247E;
 t['elevenperiod'] = 0x2492;
 t['elevenroman'] = 0x217A;
 t['ellipsis'] = 0x2026;
 t['ellipsisvertical'] = 0x22EE;
 t['emacron'] = 0x0113;
 t['emacronacute'] = 0x1E17;
 t['emacrongrave'] = 0x1E15;
 t['emcyrillic'] = 0x043C;
 t['emdash'] = 0x2014;
 t['emdashvertical'] = 0xFE31;
 t['emonospace'] = 0xFF45;
 t['emphasismarkarmenian'] = 0x055B;
 t['emptyset'] = 0x2205;
 t['enbopomofo'] = 0x3123;
 t['encyrillic'] = 0x043D;
 t['endash'] = 0x2013;
 t['endashvertical'] = 0xFE32;
 t['endescendercyrillic'] = 0x04A3;
 t['eng'] = 0x014B;
 t['engbopomofo'] = 0x3125;
 t['enghecyrillic'] = 0x04A5;
 t['enhookcyrillic'] = 0x04C8;
 t['enspace'] = 0x2002;
 t['eogonek'] = 0x0119;
 t['eokorean'] = 0x3153;
 t['eopen'] = 0x025B;
 t['eopenclosed'] = 0x029A;
 t['eopenreversed'] = 0x025C;
 t['eopenreversedclosed'] = 0x025E;
 t['eopenreversedhook'] = 0x025D;
 t['eparen'] = 0x24A0;
 t['epsilon'] = 0x03B5;
 t['epsilontonos'] = 0x03AD;
 t['equal'] = 0x003D;
 t['equalmonospace'] = 0xFF1D;
 t['equalsmall'] = 0xFE66;
 t['equalsuperior'] = 0x207C;
 t['equivalence'] = 0x2261;
 t['erbopomofo'] = 0x3126;
 t['ercyrillic'] = 0x0440;
 t['ereversed'] = 0x0258;
 t['ereversedcyrillic'] = 0x044D;
 t['escyrillic'] = 0x0441;
 t['esdescendercyrillic'] = 0x04AB;
 t['esh'] = 0x0283;
 t['eshcurl'] = 0x0286;
 t['eshortdeva'] = 0x090E;
 t['eshortvowelsigndeva'] = 0x0946;
 t['eshreversedloop'] = 0x01AA;
 t['eshsquatreversed'] = 0x0285;
 t['esmallhiragana'] = 0x3047;
 t['esmallkatakana'] = 0x30A7;
 t['esmallkatakanahalfwidth'] = 0xFF6A;
 t['estimated'] = 0x212E;
 t['esuperior'] = 0xF6EC;
 t['eta'] = 0x03B7;
 t['etarmenian'] = 0x0568;
 t['etatonos'] = 0x03AE;
 t['eth'] = 0x00F0;
 t['etilde'] = 0x1EBD;
 t['etildebelow'] = 0x1E1B;
 t['etnahtafoukhhebrew'] = 0x0591;
 t['etnahtafoukhlefthebrew'] = 0x0591;
 t['etnahtahebrew'] = 0x0591;
 t['etnahtalefthebrew'] = 0x0591;
 t['eturned'] = 0x01DD;
 t['eukorean'] = 0x3161;
 t['euro'] = 0x20AC;
 t['evowelsignbengali'] = 0x09C7;
 t['evowelsigndeva'] = 0x0947;
 t['evowelsigngujarati'] = 0x0AC7;
 t['exclam'] = 0x0021;
 t['exclamarmenian'] = 0x055C;
 t['exclamdbl'] = 0x203C;
 t['exclamdown'] = 0x00A1;
 t['exclamdownsmall'] = 0xF7A1;
 t['exclammonospace'] = 0xFF01;
 t['exclamsmall'] = 0xF721;
 t['existential'] = 0x2203;
 t['ezh'] = 0x0292;
 t['ezhcaron'] = 0x01EF;
 t['ezhcurl'] = 0x0293;
 t['ezhreversed'] = 0x01B9;
 t['ezhtail'] = 0x01BA;
 t['f'] = 0x0066;
 t['fadeva'] = 0x095E;
 t['fagurmukhi'] = 0x0A5E;
 t['fahrenheit'] = 0x2109;
 t['fathaarabic'] = 0x064E;
 t['fathalowarabic'] = 0x064E;
 t['fathatanarabic'] = 0x064B;
 t['fbopomofo'] = 0x3108;
 t['fcircle'] = 0x24D5;
 t['fdotaccent'] = 0x1E1F;
 t['feharabic'] = 0x0641;
 t['feharmenian'] = 0x0586;
 t['fehfinalarabic'] = 0xFED2;
 t['fehinitialarabic'] = 0xFED3;
 t['fehmedialarabic'] = 0xFED4;
 t['feicoptic'] = 0x03E5;
 t['female'] = 0x2640;
 t['ff'] = 0xFB00;
 t['ffi'] = 0xFB03;
 t['ffl'] = 0xFB04;
 t['fi'] = 0xFB01;
 t['fifteencircle'] = 0x246E;
 t['fifteenparen'] = 0x2482;
 t['fifteenperiod'] = 0x2496;
 t['figuredash'] = 0x2012;
 t['filledbox'] = 0x25A0;
 t['filledrect'] = 0x25AC;
 t['finalkaf'] = 0x05DA;
 t['finalkafdagesh'] = 0xFB3A;
 t['finalkafdageshhebrew'] = 0xFB3A;
 t['finalkafhebrew'] = 0x05DA;
 t['finalmem'] = 0x05DD;
 t['finalmemhebrew'] = 0x05DD;
 t['finalnun'] = 0x05DF;
 t['finalnunhebrew'] = 0x05DF;
 t['finalpe'] = 0x05E3;
 t['finalpehebrew'] = 0x05E3;
 t['finaltsadi'] = 0x05E5;
 t['finaltsadihebrew'] = 0x05E5;
 t['firsttonechinese'] = 0x02C9;
 t['fisheye'] = 0x25C9;
 t['fitacyrillic'] = 0x0473;
 t['five'] = 0x0035;
 t['fivearabic'] = 0x0665;
 t['fivebengali'] = 0x09EB;
 t['fivecircle'] = 0x2464;
 t['fivecircleinversesansserif'] = 0x278E;
 t['fivedeva'] = 0x096B;
 t['fiveeighths'] = 0x215D;
 t['fivegujarati'] = 0x0AEB;
 t['fivegurmukhi'] = 0x0A6B;
 t['fivehackarabic'] = 0x0665;
 t['fivehangzhou'] = 0x3025;
 t['fiveideographicparen'] = 0x3224;
 t['fiveinferior'] = 0x2085;
 t['fivemonospace'] = 0xFF15;
 t['fiveoldstyle'] = 0xF735;
 t['fiveparen'] = 0x2478;
 t['fiveperiod'] = 0x248C;
 t['fivepersian'] = 0x06F5;
 t['fiveroman'] = 0x2174;
 t['fivesuperior'] = 0x2075;
 t['fivethai'] = 0x0E55;
 t['fl'] = 0xFB02;
 t['florin'] = 0x0192;
 t['fmonospace'] = 0xFF46;
 t['fmsquare'] = 0x3399;
 t['fofanthai'] = 0x0E1F;
 t['fofathai'] = 0x0E1D;
 t['fongmanthai'] = 0x0E4F;
 t['forall'] = 0x2200;
 t['four'] = 0x0034;
 t['fourarabic'] = 0x0664;
 t['fourbengali'] = 0x09EA;
 t['fourcircle'] = 0x2463;
 t['fourcircleinversesansserif'] = 0x278D;
 t['fourdeva'] = 0x096A;
 t['fourgujarati'] = 0x0AEA;
 t['fourgurmukhi'] = 0x0A6A;
 t['fourhackarabic'] = 0x0664;
 t['fourhangzhou'] = 0x3024;
 t['fourideographicparen'] = 0x3223;
 t['fourinferior'] = 0x2084;
 t['fourmonospace'] = 0xFF14;
 t['fournumeratorbengali'] = 0x09F7;
 t['fouroldstyle'] = 0xF734;
 t['fourparen'] = 0x2477;
 t['fourperiod'] = 0x248B;
 t['fourpersian'] = 0x06F4;
 t['fourroman'] = 0x2173;
 t['foursuperior'] = 0x2074;
 t['fourteencircle'] = 0x246D;
 t['fourteenparen'] = 0x2481;
 t['fourteenperiod'] = 0x2495;
 t['fourthai'] = 0x0E54;
 t['fourthtonechinese'] = 0x02CB;
 t['fparen'] = 0x24A1;
 t['fraction'] = 0x2044;
 t['franc'] = 0x20A3;
 t['g'] = 0x0067;
 t['gabengali'] = 0x0997;
 t['gacute'] = 0x01F5;
 t['gadeva'] = 0x0917;
 t['gafarabic'] = 0x06AF;
 t['gaffinalarabic'] = 0xFB93;
 t['gafinitialarabic'] = 0xFB94;
 t['gafmedialarabic'] = 0xFB95;
 t['gagujarati'] = 0x0A97;
 t['gagurmukhi'] = 0x0A17;
 t['gahiragana'] = 0x304C;
 t['gakatakana'] = 0x30AC;
 t['gamma'] = 0x03B3;
 t['gammalatinsmall'] = 0x0263;
 t['gammasuperior'] = 0x02E0;
 t['gangiacoptic'] = 0x03EB;
 t['gbopomofo'] = 0x310D;
 t['gbreve'] = 0x011F;
 t['gcaron'] = 0x01E7;
 t['gcedilla'] = 0x0123;
 t['gcircle'] = 0x24D6;
 t['gcircumflex'] = 0x011D;
 t['gcommaaccent'] = 0x0123;
 t['gdot'] = 0x0121;
 t['gdotaccent'] = 0x0121;
 t['gecyrillic'] = 0x0433;
 t['gehiragana'] = 0x3052;
 t['gekatakana'] = 0x30B2;
 t['geometricallyequal'] = 0x2251;
 t['gereshaccenthebrew'] = 0x059C;
 t['gereshhebrew'] = 0x05F3;
 t['gereshmuqdamhebrew'] = 0x059D;
 t['germandbls'] = 0x00DF;
 t['gershayimaccenthebrew'] = 0x059E;
 t['gershayimhebrew'] = 0x05F4;
 t['getamark'] = 0x3013;
 t['ghabengali'] = 0x0998;
 t['ghadarmenian'] = 0x0572;
 t['ghadeva'] = 0x0918;
 t['ghagujarati'] = 0x0A98;
 t['ghagurmukhi'] = 0x0A18;
 t['ghainarabic'] = 0x063A;
 t['ghainfinalarabic'] = 0xFECE;
 t['ghaininitialarabic'] = 0xFECF;
 t['ghainmedialarabic'] = 0xFED0;
 t['ghemiddlehookcyrillic'] = 0x0495;
 t['ghestrokecyrillic'] = 0x0493;
 t['gheupturncyrillic'] = 0x0491;
 t['ghhadeva'] = 0x095A;
 t['ghhagurmukhi'] = 0x0A5A;
 t['ghook'] = 0x0260;
 t['ghzsquare'] = 0x3393;
 t['gihiragana'] = 0x304E;
 t['gikatakana'] = 0x30AE;
 t['gimarmenian'] = 0x0563;
 t['gimel'] = 0x05D2;
 t['gimeldagesh'] = 0xFB32;
 t['gimeldageshhebrew'] = 0xFB32;
 t['gimelhebrew'] = 0x05D2;
 t['gjecyrillic'] = 0x0453;
 t['glottalinvertedstroke'] = 0x01BE;
 t['glottalstop'] = 0x0294;
 t['glottalstopinverted'] = 0x0296;
 t['glottalstopmod'] = 0x02C0;
 t['glottalstopreversed'] = 0x0295;
 t['glottalstopreversedmod'] = 0x02C1;
 t['glottalstopreversedsuperior'] = 0x02E4;
 t['glottalstopstroke'] = 0x02A1;
 t['glottalstopstrokereversed'] = 0x02A2;
 t['gmacron'] = 0x1E21;
 t['gmonospace'] = 0xFF47;
 t['gohiragana'] = 0x3054;
 t['gokatakana'] = 0x30B4;
 t['gparen'] = 0x24A2;
 t['gpasquare'] = 0x33AC;
 t['gradient'] = 0x2207;
 t['grave'] = 0x0060;
 t['gravebelowcmb'] = 0x0316;
 t['gravecmb'] = 0x0300;
 t['gravecomb'] = 0x0300;
 t['gravedeva'] = 0x0953;
 t['gravelowmod'] = 0x02CE;
 t['gravemonospace'] = 0xFF40;
 t['gravetonecmb'] = 0x0340;
 t['greater'] = 0x003E;
 t['greaterequal'] = 0x2265;
 t['greaterequalorless'] = 0x22DB;
 t['greatermonospace'] = 0xFF1E;
 t['greaterorequivalent'] = 0x2273;
 t['greaterorless'] = 0x2277;
 t['greateroverequal'] = 0x2267;
 t['greatersmall'] = 0xFE65;
 t['gscript'] = 0x0261;
 t['gstroke'] = 0x01E5;
 t['guhiragana'] = 0x3050;
 t['guillemotleft'] = 0x00AB;
 t['guillemotright'] = 0x00BB;
 t['guilsinglleft'] = 0x2039;
 t['guilsinglright'] = 0x203A;
 t['gukatakana'] = 0x30B0;
 t['guramusquare'] = 0x3318;
 t['gysquare'] = 0x33C9;
 t['h'] = 0x0068;
 t['haabkhasiancyrillic'] = 0x04A9;
 t['haaltonearabic'] = 0x06C1;
 t['habengali'] = 0x09B9;
 t['hadescendercyrillic'] = 0x04B3;
 t['hadeva'] = 0x0939;
 t['hagujarati'] = 0x0AB9;
 t['hagurmukhi'] = 0x0A39;
 t['haharabic'] = 0x062D;
 t['hahfinalarabic'] = 0xFEA2;
 t['hahinitialarabic'] = 0xFEA3;
 t['hahiragana'] = 0x306F;
 t['hahmedialarabic'] = 0xFEA4;
 t['haitusquare'] = 0x332A;
 t['hakatakana'] = 0x30CF;
 t['hakatakanahalfwidth'] = 0xFF8A;
 t['halantgurmukhi'] = 0x0A4D;
 t['hamzaarabic'] = 0x0621;
 t['hamzalowarabic'] = 0x0621;
 t['hangulfiller'] = 0x3164;
 t['hardsigncyrillic'] = 0x044A;
 t['harpoonleftbarbup'] = 0x21BC;
 t['harpoonrightbarbup'] = 0x21C0;
 t['hasquare'] = 0x33CA;
 t['hatafpatah'] = 0x05B2;
 t['hatafpatah16'] = 0x05B2;
 t['hatafpatah23'] = 0x05B2;
 t['hatafpatah2f'] = 0x05B2;
 t['hatafpatahhebrew'] = 0x05B2;
 t['hatafpatahnarrowhebrew'] = 0x05B2;
 t['hatafpatahquarterhebrew'] = 0x05B2;
 t['hatafpatahwidehebrew'] = 0x05B2;
 t['hatafqamats'] = 0x05B3;
 t['hatafqamats1b'] = 0x05B3;
 t['hatafqamats28'] = 0x05B3;
 t['hatafqamats34'] = 0x05B3;
 t['hatafqamatshebrew'] = 0x05B3;
 t['hatafqamatsnarrowhebrew'] = 0x05B3;
 t['hatafqamatsquarterhebrew'] = 0x05B3;
 t['hatafqamatswidehebrew'] = 0x05B3;
 t['hatafsegol'] = 0x05B1;
 t['hatafsegol17'] = 0x05B1;
 t['hatafsegol24'] = 0x05B1;
 t['hatafsegol30'] = 0x05B1;
 t['hatafsegolhebrew'] = 0x05B1;
 t['hatafsegolnarrowhebrew'] = 0x05B1;
 t['hatafsegolquarterhebrew'] = 0x05B1;
 t['hatafsegolwidehebrew'] = 0x05B1;
 t['hbar'] = 0x0127;
 t['hbopomofo'] = 0x310F;
 t['hbrevebelow'] = 0x1E2B;
 t['hcedilla'] = 0x1E29;
 t['hcircle'] = 0x24D7;
 t['hcircumflex'] = 0x0125;
 t['hdieresis'] = 0x1E27;
 t['hdotaccent'] = 0x1E23;
 t['hdotbelow'] = 0x1E25;
 t['he'] = 0x05D4;
 t['heart'] = 0x2665;
 t['heartsuitblack'] = 0x2665;
 t['heartsuitwhite'] = 0x2661;
 t['hedagesh'] = 0xFB34;
 t['hedageshhebrew'] = 0xFB34;
 t['hehaltonearabic'] = 0x06C1;
 t['heharabic'] = 0x0647;
 t['hehebrew'] = 0x05D4;
 t['hehfinalaltonearabic'] = 0xFBA7;
 t['hehfinalalttwoarabic'] = 0xFEEA;
 t['hehfinalarabic'] = 0xFEEA;
 t['hehhamzaabovefinalarabic'] = 0xFBA5;
 t['hehhamzaaboveisolatedarabic'] = 0xFBA4;
 t['hehinitialaltonearabic'] = 0xFBA8;
 t['hehinitialarabic'] = 0xFEEB;
 t['hehiragana'] = 0x3078;
 t['hehmedialaltonearabic'] = 0xFBA9;
 t['hehmedialarabic'] = 0xFEEC;
 t['heiseierasquare'] = 0x337B;
 t['hekatakana'] = 0x30D8;
 t['hekatakanahalfwidth'] = 0xFF8D;
 t['hekutaarusquare'] = 0x3336;
 t['henghook'] = 0x0267;
 t['herutusquare'] = 0x3339;
 t['het'] = 0x05D7;
 t['hethebrew'] = 0x05D7;
 t['hhook'] = 0x0266;
 t['hhooksuperior'] = 0x02B1;
 t['hieuhacirclekorean'] = 0x327B;
 t['hieuhaparenkorean'] = 0x321B;
 t['hieuhcirclekorean'] = 0x326D;
 t['hieuhkorean'] = 0x314E;
 t['hieuhparenkorean'] = 0x320D;
 t['hihiragana'] = 0x3072;
 t['hikatakana'] = 0x30D2;
 t['hikatakanahalfwidth'] = 0xFF8B;
 t['hiriq'] = 0x05B4;
 t['hiriq14'] = 0x05B4;
 t['hiriq21'] = 0x05B4;
 t['hiriq2d'] = 0x05B4;
 t['hiriqhebrew'] = 0x05B4;
 t['hiriqnarrowhebrew'] = 0x05B4;
 t['hiriqquarterhebrew'] = 0x05B4;
 t['hiriqwidehebrew'] = 0x05B4;
 t['hlinebelow'] = 0x1E96;
 t['hmonospace'] = 0xFF48;
 t['hoarmenian'] = 0x0570;
 t['hohipthai'] = 0x0E2B;
 t['hohiragana'] = 0x307B;
 t['hokatakana'] = 0x30DB;
 t['hokatakanahalfwidth'] = 0xFF8E;
 t['holam'] = 0x05B9;
 t['holam19'] = 0x05B9;
 t['holam26'] = 0x05B9;
 t['holam32'] = 0x05B9;
 t['holamhebrew'] = 0x05B9;
 t['holamnarrowhebrew'] = 0x05B9;
 t['holamquarterhebrew'] = 0x05B9;
 t['holamwidehebrew'] = 0x05B9;
 t['honokhukthai'] = 0x0E2E;
 t['hookabovecomb'] = 0x0309;
 t['hookcmb'] = 0x0309;
 t['hookpalatalizedbelowcmb'] = 0x0321;
 t['hookretroflexbelowcmb'] = 0x0322;
 t['hoonsquare'] = 0x3342;
 t['horicoptic'] = 0x03E9;
 t['horizontalbar'] = 0x2015;
 t['horncmb'] = 0x031B;
 t['hotsprings'] = 0x2668;
 t['house'] = 0x2302;
 t['hparen'] = 0x24A3;
 t['hsuperior'] = 0x02B0;
 t['hturned'] = 0x0265;
 t['huhiragana'] = 0x3075;
 t['huiitosquare'] = 0x3333;
 t['hukatakana'] = 0x30D5;
 t['hukatakanahalfwidth'] = 0xFF8C;
 t['hungarumlaut'] = 0x02DD;
 t['hungarumlautcmb'] = 0x030B;
 t['hv'] = 0x0195;
 t['hyphen'] = 0x002D;
 t['hypheninferior'] = 0xF6E5;
 t['hyphenmonospace'] = 0xFF0D;
 t['hyphensmall'] = 0xFE63;
 t['hyphensuperior'] = 0xF6E6;
 t['hyphentwo'] = 0x2010;
 t['i'] = 0x0069;
 t['iacute'] = 0x00ED;
 t['iacyrillic'] = 0x044F;
 t['ibengali'] = 0x0987;
 t['ibopomofo'] = 0x3127;
 t['ibreve'] = 0x012D;
 t['icaron'] = 0x01D0;
 t['icircle'] = 0x24D8;
 t['icircumflex'] = 0x00EE;
 t['icyrillic'] = 0x0456;
 t['idblgrave'] = 0x0209;
 t['ideographearthcircle'] = 0x328F;
 t['ideographfirecircle'] = 0x328B;
 t['ideographicallianceparen'] = 0x323F;
 t['ideographiccallparen'] = 0x323A;
 t['ideographiccentrecircle'] = 0x32A5;
 t['ideographicclose'] = 0x3006;
 t['ideographiccomma'] = 0x3001;
 t['ideographiccommaleft'] = 0xFF64;
 t['ideographiccongratulationparen'] = 0x3237;
 t['ideographiccorrectcircle'] = 0x32A3;
 t['ideographicearthparen'] = 0x322F;
 t['ideographicenterpriseparen'] = 0x323D;
 t['ideographicexcellentcircle'] = 0x329D;
 t['ideographicfestivalparen'] = 0x3240;
 t['ideographicfinancialcircle'] = 0x3296;
 t['ideographicfinancialparen'] = 0x3236;
 t['ideographicfireparen'] = 0x322B;
 t['ideographichaveparen'] = 0x3232;
 t['ideographichighcircle'] = 0x32A4;
 t['ideographiciterationmark'] = 0x3005;
 t['ideographiclaborcircle'] = 0x3298;
 t['ideographiclaborparen'] = 0x3238;
 t['ideographicleftcircle'] = 0x32A7;
 t['ideographiclowcircle'] = 0x32A6;
 t['ideographicmedicinecircle'] = 0x32A9;
 t['ideographicmetalparen'] = 0x322E;
 t['ideographicmoonparen'] = 0x322A;
 t['ideographicnameparen'] = 0x3234;
 t['ideographicperiod'] = 0x3002;
 t['ideographicprintcircle'] = 0x329E;
 t['ideographicreachparen'] = 0x3243;
 t['ideographicrepresentparen'] = 0x3239;
 t['ideographicresourceparen'] = 0x323E;
 t['ideographicrightcircle'] = 0x32A8;
 t['ideographicsecretcircle'] = 0x3299;
 t['ideographicselfparen'] = 0x3242;
 t['ideographicsocietyparen'] = 0x3233;
 t['ideographicspace'] = 0x3000;
 t['ideographicspecialparen'] = 0x3235;
 t['ideographicstockparen'] = 0x3231;
 t['ideographicstudyparen'] = 0x323B;
 t['ideographicsunparen'] = 0x3230;
 t['ideographicsuperviseparen'] = 0x323C;
 t['ideographicwaterparen'] = 0x322C;
 t['ideographicwoodparen'] = 0x322D;
 t['ideographiczero'] = 0x3007;
 t['ideographmetalcircle'] = 0x328E;
 t['ideographmooncircle'] = 0x328A;
 t['ideographnamecircle'] = 0x3294;
 t['ideographsuncircle'] = 0x3290;
 t['ideographwatercircle'] = 0x328C;
 t['ideographwoodcircle'] = 0x328D;
 t['ideva'] = 0x0907;
 t['idieresis'] = 0x00EF;
 t['idieresisacute'] = 0x1E2F;
 t['idieresiscyrillic'] = 0x04E5;
 t['idotbelow'] = 0x1ECB;
 t['iebrevecyrillic'] = 0x04D7;
 t['iecyrillic'] = 0x0435;
 t['ieungacirclekorean'] = 0x3275;
 t['ieungaparenkorean'] = 0x3215;
 t['ieungcirclekorean'] = 0x3267;
 t['ieungkorean'] = 0x3147;
 t['ieungparenkorean'] = 0x3207;
 t['igrave'] = 0x00EC;
 t['igujarati'] = 0x0A87;
 t['igurmukhi'] = 0x0A07;
 t['ihiragana'] = 0x3044;
 t['ihookabove'] = 0x1EC9;
 t['iibengali'] = 0x0988;
 t['iicyrillic'] = 0x0438;
 t['iideva'] = 0x0908;
 t['iigujarati'] = 0x0A88;
 t['iigurmukhi'] = 0x0A08;
 t['iimatragurmukhi'] = 0x0A40;
 t['iinvertedbreve'] = 0x020B;
 t['iishortcyrillic'] = 0x0439;
 t['iivowelsignbengali'] = 0x09C0;
 t['iivowelsigndeva'] = 0x0940;
 t['iivowelsigngujarati'] = 0x0AC0;
 t['ij'] = 0x0133;
 t['ikatakana'] = 0x30A4;
 t['ikatakanahalfwidth'] = 0xFF72;
 t['ikorean'] = 0x3163;
 t['ilde'] = 0x02DC;
 t['iluyhebrew'] = 0x05AC;
 t['imacron'] = 0x012B;
 t['imacroncyrillic'] = 0x04E3;
 t['imageorapproximatelyequal'] = 0x2253;
 t['imatragurmukhi'] = 0x0A3F;
 t['imonospace'] = 0xFF49;
 t['increment'] = 0x2206;
 t['infinity'] = 0x221E;
 t['iniarmenian'] = 0x056B;
 t['integral'] = 0x222B;
 t['integralbottom'] = 0x2321;
 t['integralbt'] = 0x2321;
 t['integralex'] = 0xF8F5;
 t['integraltop'] = 0x2320;
 t['integraltp'] = 0x2320;
 t['intersection'] = 0x2229;
 t['intisquare'] = 0x3305;
 t['invbullet'] = 0x25D8;
 t['invcircle'] = 0x25D9;
 t['invsmileface'] = 0x263B;
 t['iocyrillic'] = 0x0451;
 t['iogonek'] = 0x012F;
 t['iota'] = 0x03B9;
 t['iotadieresis'] = 0x03CA;
 t['iotadieresistonos'] = 0x0390;
 t['iotalatin'] = 0x0269;
 t['iotatonos'] = 0x03AF;
 t['iparen'] = 0x24A4;
 t['irigurmukhi'] = 0x0A72;
 t['ismallhiragana'] = 0x3043;
 t['ismallkatakana'] = 0x30A3;
 t['ismallkatakanahalfwidth'] = 0xFF68;
 t['issharbengali'] = 0x09FA;
 t['istroke'] = 0x0268;
 t['isuperior'] = 0xF6ED;
 t['iterationhiragana'] = 0x309D;
 t['iterationkatakana'] = 0x30FD;
 t['itilde'] = 0x0129;
 t['itildebelow'] = 0x1E2D;
 t['iubopomofo'] = 0x3129;
 t['iucyrillic'] = 0x044E;
 t['ivowelsignbengali'] = 0x09BF;
 t['ivowelsigndeva'] = 0x093F;
 t['ivowelsigngujarati'] = 0x0ABF;
 t['izhitsacyrillic'] = 0x0475;
 t['izhitsadblgravecyrillic'] = 0x0477;
 t['j'] = 0x006A;
 t['jaarmenian'] = 0x0571;
 t['jabengali'] = 0x099C;
 t['jadeva'] = 0x091C;
 t['jagujarati'] = 0x0A9C;
 t['jagurmukhi'] = 0x0A1C;
 t['jbopomofo'] = 0x3110;
 t['jcaron'] = 0x01F0;
 t['jcircle'] = 0x24D9;
 t['jcircumflex'] = 0x0135;
 t['jcrossedtail'] = 0x029D;
 t['jdotlessstroke'] = 0x025F;
 t['jecyrillic'] = 0x0458;
 t['jeemarabic'] = 0x062C;
 t['jeemfinalarabic'] = 0xFE9E;
 t['jeeminitialarabic'] = 0xFE9F;
 t['jeemmedialarabic'] = 0xFEA0;
 t['jeharabic'] = 0x0698;
 t['jehfinalarabic'] = 0xFB8B;
 t['jhabengali'] = 0x099D;
 t['jhadeva'] = 0x091D;
 t['jhagujarati'] = 0x0A9D;
 t['jhagurmukhi'] = 0x0A1D;
 t['jheharmenian'] = 0x057B;
 t['jis'] = 0x3004;
 t['jmonospace'] = 0xFF4A;
 t['jparen'] = 0x24A5;
 t['jsuperior'] = 0x02B2;
 t['k'] = 0x006B;
 t['kabashkircyrillic'] = 0x04A1;
 t['kabengali'] = 0x0995;
 t['kacute'] = 0x1E31;
 t['kacyrillic'] = 0x043A;
 t['kadescendercyrillic'] = 0x049B;
 t['kadeva'] = 0x0915;
 t['kaf'] = 0x05DB;
 t['kafarabic'] = 0x0643;
 t['kafdagesh'] = 0xFB3B;
 t['kafdageshhebrew'] = 0xFB3B;
 t['kaffinalarabic'] = 0xFEDA;
 t['kafhebrew'] = 0x05DB;
 t['kafinitialarabic'] = 0xFEDB;
 t['kafmedialarabic'] = 0xFEDC;
 t['kafrafehebrew'] = 0xFB4D;
 t['kagujarati'] = 0x0A95;
 t['kagurmukhi'] = 0x0A15;
 t['kahiragana'] = 0x304B;
 t['kahookcyrillic'] = 0x04C4;
 t['kakatakana'] = 0x30AB;
 t['kakatakanahalfwidth'] = 0xFF76;
 t['kappa'] = 0x03BA;
 t['kappasymbolgreek'] = 0x03F0;
 t['kapyeounmieumkorean'] = 0x3171;
 t['kapyeounphieuphkorean'] = 0x3184;
 t['kapyeounpieupkorean'] = 0x3178;
 t['kapyeounssangpieupkorean'] = 0x3179;
 t['karoriisquare'] = 0x330D;
 t['kashidaautoarabic'] = 0x0640;
 t['kashidaautonosidebearingarabic'] = 0x0640;
 t['kasmallkatakana'] = 0x30F5;
 t['kasquare'] = 0x3384;
 t['kasraarabic'] = 0x0650;
 t['kasratanarabic'] = 0x064D;
 t['kastrokecyrillic'] = 0x049F;
 t['katahiraprolongmarkhalfwidth'] = 0xFF70;
 t['kaverticalstrokecyrillic'] = 0x049D;
 t['kbopomofo'] = 0x310E;
 t['kcalsquare'] = 0x3389;
 t['kcaron'] = 0x01E9;
 t['kcedilla'] = 0x0137;
 t['kcircle'] = 0x24DA;
 t['kcommaaccent'] = 0x0137;
 t['kdotbelow'] = 0x1E33;
 t['keharmenian'] = 0x0584;
 t['kehiragana'] = 0x3051;
 t['kekatakana'] = 0x30B1;
 t['kekatakanahalfwidth'] = 0xFF79;
 t['kenarmenian'] = 0x056F;
 t['kesmallkatakana'] = 0x30F6;
 t['kgreenlandic'] = 0x0138;
 t['khabengali'] = 0x0996;
 t['khacyrillic'] = 0x0445;
 t['khadeva'] = 0x0916;
 t['khagujarati'] = 0x0A96;
 t['khagurmukhi'] = 0x0A16;
 t['khaharabic'] = 0x062E;
 t['khahfinalarabic'] = 0xFEA6;
 t['khahinitialarabic'] = 0xFEA7;
 t['khahmedialarabic'] = 0xFEA8;
 t['kheicoptic'] = 0x03E7;
 t['khhadeva'] = 0x0959;
 t['khhagurmukhi'] = 0x0A59;
 t['khieukhacirclekorean'] = 0x3278;
 t['khieukhaparenkorean'] = 0x3218;
 t['khieukhcirclekorean'] = 0x326A;
 t['khieukhkorean'] = 0x314B;
 t['khieukhparenkorean'] = 0x320A;
 t['khokhaithai'] = 0x0E02;
 t['khokhonthai'] = 0x0E05;
 t['khokhuatthai'] = 0x0E03;
 t['khokhwaithai'] = 0x0E04;
 t['khomutthai'] = 0x0E5B;
 t['khook'] = 0x0199;
 t['khorakhangthai'] = 0x0E06;
 t['khzsquare'] = 0x3391;
 t['kihiragana'] = 0x304D;
 t['kikatakana'] = 0x30AD;
 t['kikatakanahalfwidth'] = 0xFF77;
 t['kiroguramusquare'] = 0x3315;
 t['kiromeetorusquare'] = 0x3316;
 t['kirosquare'] = 0x3314;
 t['kiyeokacirclekorean'] = 0x326E;
 t['kiyeokaparenkorean'] = 0x320E;
 t['kiyeokcirclekorean'] = 0x3260;
 t['kiyeokkorean'] = 0x3131;
 t['kiyeokparenkorean'] = 0x3200;
 t['kiyeoksioskorean'] = 0x3133;
 t['kjecyrillic'] = 0x045C;
 t['klinebelow'] = 0x1E35;
 t['klsquare'] = 0x3398;
 t['kmcubedsquare'] = 0x33A6;
 t['kmonospace'] = 0xFF4B;
 t['kmsquaredsquare'] = 0x33A2;
 t['kohiragana'] = 0x3053;
 t['kohmsquare'] = 0x33C0;
 t['kokaithai'] = 0x0E01;
 t['kokatakana'] = 0x30B3;
 t['kokatakanahalfwidth'] = 0xFF7A;
 t['kooposquare'] = 0x331E;
 t['koppacyrillic'] = 0x0481;
 t['koreanstandardsymbol'] = 0x327F;
 t['koroniscmb'] = 0x0343;
 t['kparen'] = 0x24A6;
 t['kpasquare'] = 0x33AA;
 t['ksicyrillic'] = 0x046F;
 t['ktsquare'] = 0x33CF;
 t['kturned'] = 0x029E;
 t['kuhiragana'] = 0x304F;
 t['kukatakana'] = 0x30AF;
 t['kukatakanahalfwidth'] = 0xFF78;
 t['kvsquare'] = 0x33B8;
 t['kwsquare'] = 0x33BE;
 t['l'] = 0x006C;
 t['labengali'] = 0x09B2;
 t['lacute'] = 0x013A;
 t['ladeva'] = 0x0932;
 t['lagujarati'] = 0x0AB2;
 t['lagurmukhi'] = 0x0A32;
 t['lakkhangyaothai'] = 0x0E45;
 t['lamaleffinalarabic'] = 0xFEFC;
 t['lamalefhamzaabovefinalarabic'] = 0xFEF8;
 t['lamalefhamzaaboveisolatedarabic'] = 0xFEF7;
 t['lamalefhamzabelowfinalarabic'] = 0xFEFA;
 t['lamalefhamzabelowisolatedarabic'] = 0xFEF9;
 t['lamalefisolatedarabic'] = 0xFEFB;
 t['lamalefmaddaabovefinalarabic'] = 0xFEF6;
 t['lamalefmaddaaboveisolatedarabic'] = 0xFEF5;
 t['lamarabic'] = 0x0644;
 t['lambda'] = 0x03BB;
 t['lambdastroke'] = 0x019B;
 t['lamed'] = 0x05DC;
 t['lameddagesh'] = 0xFB3C;
 t['lameddageshhebrew'] = 0xFB3C;
 t['lamedhebrew'] = 0x05DC;
 t['lamfinalarabic'] = 0xFEDE;
 t['lamhahinitialarabic'] = 0xFCCA;
 t['laminitialarabic'] = 0xFEDF;
 t['lamjeeminitialarabic'] = 0xFCC9;
 t['lamkhahinitialarabic'] = 0xFCCB;
 t['lamlamhehisolatedarabic'] = 0xFDF2;
 t['lammedialarabic'] = 0xFEE0;
 t['lammeemhahinitialarabic'] = 0xFD88;
 t['lammeeminitialarabic'] = 0xFCCC;
 t['largecircle'] = 0x25EF;
 t['lbar'] = 0x019A;
 t['lbelt'] = 0x026C;
 t['lbopomofo'] = 0x310C;
 t['lcaron'] = 0x013E;
 t['lcedilla'] = 0x013C;
 t['lcircle'] = 0x24DB;
 t['lcircumflexbelow'] = 0x1E3D;
 t['lcommaaccent'] = 0x013C;
 t['ldot'] = 0x0140;
 t['ldotaccent'] = 0x0140;
 t['ldotbelow'] = 0x1E37;
 t['ldotbelowmacron'] = 0x1E39;
 t['leftangleabovecmb'] = 0x031A;
 t['lefttackbelowcmb'] = 0x0318;
 t['less'] = 0x003C;
 t['lessequal'] = 0x2264;
 t['lessequalorgreater'] = 0x22DA;
 t['lessmonospace'] = 0xFF1C;
 t['lessorequivalent'] = 0x2272;
 t['lessorgreater'] = 0x2276;
 t['lessoverequal'] = 0x2266;
 t['lesssmall'] = 0xFE64;
 t['lezh'] = 0x026E;
 t['lfblock'] = 0x258C;
 t['lhookretroflex'] = 0x026D;
 t['lira'] = 0x20A4;
 t['liwnarmenian'] = 0x056C;
 t['lj'] = 0x01C9;
 t['ljecyrillic'] = 0x0459;
 t['ll'] = 0xF6C0;
 t['lladeva'] = 0x0933;
 t['llagujarati'] = 0x0AB3;
 t['llinebelow'] = 0x1E3B;
 t['llladeva'] = 0x0934;
 t['llvocalicbengali'] = 0x09E1;
 t['llvocalicdeva'] = 0x0961;
 t['llvocalicvowelsignbengali'] = 0x09E3;
 t['llvocalicvowelsigndeva'] = 0x0963;
 t['lmiddletilde'] = 0x026B;
 t['lmonospace'] = 0xFF4C;
 t['lmsquare'] = 0x33D0;
 t['lochulathai'] = 0x0E2C;
 t['logicaland'] = 0x2227;
 t['logicalnot'] = 0x00AC;
 t['logicalnotreversed'] = 0x2310;
 t['logicalor'] = 0x2228;
 t['lolingthai'] = 0x0E25;
 t['longs'] = 0x017F;
 t['lowlinecenterline'] = 0xFE4E;
 t['lowlinecmb'] = 0x0332;
 t['lowlinedashed'] = 0xFE4D;
 t['lozenge'] = 0x25CA;
 t['lparen'] = 0x24A7;
 t['lslash'] = 0x0142;
 t['lsquare'] = 0x2113;
 t['lsuperior'] = 0xF6EE;
 t['ltshade'] = 0x2591;
 t['luthai'] = 0x0E26;
 t['lvocalicbengali'] = 0x098C;
 t['lvocalicdeva'] = 0x090C;
 t['lvocalicvowelsignbengali'] = 0x09E2;
 t['lvocalicvowelsigndeva'] = 0x0962;
 t['lxsquare'] = 0x33D3;
 t['m'] = 0x006D;
 t['mabengali'] = 0x09AE;
 t['macron'] = 0x00AF;
 t['macronbelowcmb'] = 0x0331;
 t['macroncmb'] = 0x0304;
 t['macronlowmod'] = 0x02CD;
 t['macronmonospace'] = 0xFFE3;
 t['macute'] = 0x1E3F;
 t['madeva'] = 0x092E;
 t['magujarati'] = 0x0AAE;
 t['magurmukhi'] = 0x0A2E;
 t['mahapakhhebrew'] = 0x05A4;
 t['mahapakhlefthebrew'] = 0x05A4;
 t['mahiragana'] = 0x307E;
 t['maichattawalowleftthai'] = 0xF895;
 t['maichattawalowrightthai'] = 0xF894;
 t['maichattawathai'] = 0x0E4B;
 t['maichattawaupperleftthai'] = 0xF893;
 t['maieklowleftthai'] = 0xF88C;
 t['maieklowrightthai'] = 0xF88B;
 t['maiekthai'] = 0x0E48;
 t['maiekupperleftthai'] = 0xF88A;
 t['maihanakatleftthai'] = 0xF884;
 t['maihanakatthai'] = 0x0E31;
 t['maitaikhuleftthai'] = 0xF889;
 t['maitaikhuthai'] = 0x0E47;
 t['maitholowleftthai'] = 0xF88F;
 t['maitholowrightthai'] = 0xF88E;
 t['maithothai'] = 0x0E49;
 t['maithoupperleftthai'] = 0xF88D;
 t['maitrilowleftthai'] = 0xF892;
 t['maitrilowrightthai'] = 0xF891;
 t['maitrithai'] = 0x0E4A;
 t['maitriupperleftthai'] = 0xF890;
 t['maiyamokthai'] = 0x0E46;
 t['makatakana'] = 0x30DE;
 t['makatakanahalfwidth'] = 0xFF8F;
 t['male'] = 0x2642;
 t['mansyonsquare'] = 0x3347;
 t['maqafhebrew'] = 0x05BE;
 t['mars'] = 0x2642;
 t['masoracirclehebrew'] = 0x05AF;
 t['masquare'] = 0x3383;
 t['mbopomofo'] = 0x3107;
 t['mbsquare'] = 0x33D4;
 t['mcircle'] = 0x24DC;
 t['mcubedsquare'] = 0x33A5;
 t['mdotaccent'] = 0x1E41;
 t['mdotbelow'] = 0x1E43;
 t['meemarabic'] = 0x0645;
 t['meemfinalarabic'] = 0xFEE2;
 t['meeminitialarabic'] = 0xFEE3;
 t['meemmedialarabic'] = 0xFEE4;
 t['meemmeeminitialarabic'] = 0xFCD1;
 t['meemmeemisolatedarabic'] = 0xFC48;
 t['meetorusquare'] = 0x334D;
 t['mehiragana'] = 0x3081;
 t['meizierasquare'] = 0x337E;
 t['mekatakana'] = 0x30E1;
 t['mekatakanahalfwidth'] = 0xFF92;
 t['mem'] = 0x05DE;
 t['memdagesh'] = 0xFB3E;
 t['memdageshhebrew'] = 0xFB3E;
 t['memhebrew'] = 0x05DE;
 t['menarmenian'] = 0x0574;
 t['merkhahebrew'] = 0x05A5;
 t['merkhakefulahebrew'] = 0x05A6;
 t['merkhakefulalefthebrew'] = 0x05A6;
 t['merkhalefthebrew'] = 0x05A5;
 t['mhook'] = 0x0271;
 t['mhzsquare'] = 0x3392;
 t['middledotkatakanahalfwidth'] = 0xFF65;
 t['middot'] = 0x00B7;
 t['mieumacirclekorean'] = 0x3272;
 t['mieumaparenkorean'] = 0x3212;
 t['mieumcirclekorean'] = 0x3264;
 t['mieumkorean'] = 0x3141;
 t['mieumpansioskorean'] = 0x3170;
 t['mieumparenkorean'] = 0x3204;
 t['mieumpieupkorean'] = 0x316E;
 t['mieumsioskorean'] = 0x316F;
 t['mihiragana'] = 0x307F;
 t['mikatakana'] = 0x30DF;
 t['mikatakanahalfwidth'] = 0xFF90;
 t['minus'] = 0x2212;
 t['minusbelowcmb'] = 0x0320;
 t['minuscircle'] = 0x2296;
 t['minusmod'] = 0x02D7;
 t['minusplus'] = 0x2213;
 t['minute'] = 0x2032;
 t['miribaarusquare'] = 0x334A;
 t['mirisquare'] = 0x3349;
 t['mlonglegturned'] = 0x0270;
 t['mlsquare'] = 0x3396;
 t['mmcubedsquare'] = 0x33A3;
 t['mmonospace'] = 0xFF4D;
 t['mmsquaredsquare'] = 0x339F;
 t['mohiragana'] = 0x3082;
 t['mohmsquare'] = 0x33C1;
 t['mokatakana'] = 0x30E2;
 t['mokatakanahalfwidth'] = 0xFF93;
 t['molsquare'] = 0x33D6;
 t['momathai'] = 0x0E21;
 t['moverssquare'] = 0x33A7;
 t['moverssquaredsquare'] = 0x33A8;
 t['mparen'] = 0x24A8;
 t['mpasquare'] = 0x33AB;
 t['mssquare'] = 0x33B3;
 t['msuperior'] = 0xF6EF;
 t['mturned'] = 0x026F;
 t['mu'] = 0x00B5;
 t['mu1'] = 0x00B5;
 t['muasquare'] = 0x3382;
 t['muchgreater'] = 0x226B;
 t['muchless'] = 0x226A;
 t['mufsquare'] = 0x338C;
 t['mugreek'] = 0x03BC;
 t['mugsquare'] = 0x338D;
 t['muhiragana'] = 0x3080;
 t['mukatakana'] = 0x30E0;
 t['mukatakanahalfwidth'] = 0xFF91;
 t['mulsquare'] = 0x3395;
 t['multiply'] = 0x00D7;
 t['mumsquare'] = 0x339B;
 t['munahhebrew'] = 0x05A3;
 t['munahlefthebrew'] = 0x05A3;
 t['musicalnote'] = 0x266A;
 t['musicalnotedbl'] = 0x266B;
 t['musicflatsign'] = 0x266D;
 t['musicsharpsign'] = 0x266F;
 t['mussquare'] = 0x33B2;
 t['muvsquare'] = 0x33B6;
 t['muwsquare'] = 0x33BC;
 t['mvmegasquare'] = 0x33B9;
 t['mvsquare'] = 0x33B7;
 t['mwmegasquare'] = 0x33BF;
 t['mwsquare'] = 0x33BD;
 t['n'] = 0x006E;
 t['nabengali'] = 0x09A8;
 t['nabla'] = 0x2207;
 t['nacute'] = 0x0144;
 t['nadeva'] = 0x0928;
 t['nagujarati'] = 0x0AA8;
 t['nagurmukhi'] = 0x0A28;
 t['nahiragana'] = 0x306A;
 t['nakatakana'] = 0x30CA;
 t['nakatakanahalfwidth'] = 0xFF85;
 t['napostrophe'] = 0x0149;
 t['nasquare'] = 0x3381;
 t['nbopomofo'] = 0x310B;
 t['nbspace'] = 0x00A0;
 t['ncaron'] = 0x0148;
 t['ncedilla'] = 0x0146;
 t['ncircle'] = 0x24DD;
 t['ncircumflexbelow'] = 0x1E4B;
 t['ncommaaccent'] = 0x0146;
 t['ndotaccent'] = 0x1E45;
 t['ndotbelow'] = 0x1E47;
 t['nehiragana'] = 0x306D;
 t['nekatakana'] = 0x30CD;
 t['nekatakanahalfwidth'] = 0xFF88;
 t['newsheqelsign'] = 0x20AA;
 t['nfsquare'] = 0x338B;
 t['ngabengali'] = 0x0999;
 t['ngadeva'] = 0x0919;
 t['ngagujarati'] = 0x0A99;
 t['ngagurmukhi'] = 0x0A19;
 t['ngonguthai'] = 0x0E07;
 t['nhiragana'] = 0x3093;
 t['nhookleft'] = 0x0272;
 t['nhookretroflex'] = 0x0273;
 t['nieunacirclekorean'] = 0x326F;
 t['nieunaparenkorean'] = 0x320F;
 t['nieuncieuckorean'] = 0x3135;
 t['nieuncirclekorean'] = 0x3261;
 t['nieunhieuhkorean'] = 0x3136;
 t['nieunkorean'] = 0x3134;
 t['nieunpansioskorean'] = 0x3168;
 t['nieunparenkorean'] = 0x3201;
 t['nieunsioskorean'] = 0x3167;
 t['nieuntikeutkorean'] = 0x3166;
 t['nihiragana'] = 0x306B;
 t['nikatakana'] = 0x30CB;
 t['nikatakanahalfwidth'] = 0xFF86;
 t['nikhahitleftthai'] = 0xF899;
 t['nikhahitthai'] = 0x0E4D;
 t['nine'] = 0x0039;
 t['ninearabic'] = 0x0669;
 t['ninebengali'] = 0x09EF;
 t['ninecircle'] = 0x2468;
 t['ninecircleinversesansserif'] = 0x2792;
 t['ninedeva'] = 0x096F;
 t['ninegujarati'] = 0x0AEF;
 t['ninegurmukhi'] = 0x0A6F;
 t['ninehackarabic'] = 0x0669;
 t['ninehangzhou'] = 0x3029;
 t['nineideographicparen'] = 0x3228;
 t['nineinferior'] = 0x2089;
 t['ninemonospace'] = 0xFF19;
 t['nineoldstyle'] = 0xF739;
 t['nineparen'] = 0x247C;
 t['nineperiod'] = 0x2490;
 t['ninepersian'] = 0x06F9;
 t['nineroman'] = 0x2178;
 t['ninesuperior'] = 0x2079;
 t['nineteencircle'] = 0x2472;
 t['nineteenparen'] = 0x2486;
 t['nineteenperiod'] = 0x249A;
 t['ninethai'] = 0x0E59;
 t['nj'] = 0x01CC;
 t['njecyrillic'] = 0x045A;
 t['nkatakana'] = 0x30F3;
 t['nkatakanahalfwidth'] = 0xFF9D;
 t['nlegrightlong'] = 0x019E;
 t['nlinebelow'] = 0x1E49;
 t['nmonospace'] = 0xFF4E;
 t['nmsquare'] = 0x339A;
 t['nnabengali'] = 0x09A3;
 t['nnadeva'] = 0x0923;
 t['nnagujarati'] = 0x0AA3;
 t['nnagurmukhi'] = 0x0A23;
 t['nnnadeva'] = 0x0929;
 t['nohiragana'] = 0x306E;
 t['nokatakana'] = 0x30CE;
 t['nokatakanahalfwidth'] = 0xFF89;
 t['nonbreakingspace'] = 0x00A0;
 t['nonenthai'] = 0x0E13;
 t['nonuthai'] = 0x0E19;
 t['noonarabic'] = 0x0646;
 t['noonfinalarabic'] = 0xFEE6;
 t['noonghunnaarabic'] = 0x06BA;
 t['noonghunnafinalarabic'] = 0xFB9F;
 t['nooninitialarabic'] = 0xFEE7;
 t['noonjeeminitialarabic'] = 0xFCD2;
 t['noonjeemisolatedarabic'] = 0xFC4B;
 t['noonmedialarabic'] = 0xFEE8;
 t['noonmeeminitialarabic'] = 0xFCD5;
 t['noonmeemisolatedarabic'] = 0xFC4E;
 t['noonnoonfinalarabic'] = 0xFC8D;
 t['notcontains'] = 0x220C;
 t['notelement'] = 0x2209;
 t['notelementof'] = 0x2209;
 t['notequal'] = 0x2260;
 t['notgreater'] = 0x226F;
 t['notgreaternorequal'] = 0x2271;
 t['notgreaternorless'] = 0x2279;
 t['notidentical'] = 0x2262;
 t['notless'] = 0x226E;
 t['notlessnorequal'] = 0x2270;
 t['notparallel'] = 0x2226;
 t['notprecedes'] = 0x2280;
 t['notsubset'] = 0x2284;
 t['notsucceeds'] = 0x2281;
 t['notsuperset'] = 0x2285;
 t['nowarmenian'] = 0x0576;
 t['nparen'] = 0x24A9;
 t['nssquare'] = 0x33B1;
 t['nsuperior'] = 0x207F;
 t['ntilde'] = 0x00F1;
 t['nu'] = 0x03BD;
 t['nuhiragana'] = 0x306C;
 t['nukatakana'] = 0x30CC;
 t['nukatakanahalfwidth'] = 0xFF87;
 t['nuktabengali'] = 0x09BC;
 t['nuktadeva'] = 0x093C;
 t['nuktagujarati'] = 0x0ABC;
 t['nuktagurmukhi'] = 0x0A3C;
 t['numbersign'] = 0x0023;
 t['numbersignmonospace'] = 0xFF03;
 t['numbersignsmall'] = 0xFE5F;
 t['numeralsigngreek'] = 0x0374;
 t['numeralsignlowergreek'] = 0x0375;
 t['numero'] = 0x2116;
 t['nun'] = 0x05E0;
 t['nundagesh'] = 0xFB40;
 t['nundageshhebrew'] = 0xFB40;
 t['nunhebrew'] = 0x05E0;
 t['nvsquare'] = 0x33B5;
 t['nwsquare'] = 0x33BB;
 t['nyabengali'] = 0x099E;
 t['nyadeva'] = 0x091E;
 t['nyagujarati'] = 0x0A9E;
 t['nyagurmukhi'] = 0x0A1E;
 t['o'] = 0x006F;
 t['oacute'] = 0x00F3;
 t['oangthai'] = 0x0E2D;
 t['obarred'] = 0x0275;
 t['obarredcyrillic'] = 0x04E9;
 t['obarreddieresiscyrillic'] = 0x04EB;
 t['obengali'] = 0x0993;
 t['obopomofo'] = 0x311B;
 t['obreve'] = 0x014F;
 t['ocandradeva'] = 0x0911;
 t['ocandragujarati'] = 0x0A91;
 t['ocandravowelsigndeva'] = 0x0949;
 t['ocandravowelsigngujarati'] = 0x0AC9;
 t['ocaron'] = 0x01D2;
 t['ocircle'] = 0x24DE;
 t['ocircumflex'] = 0x00F4;
 t['ocircumflexacute'] = 0x1ED1;
 t['ocircumflexdotbelow'] = 0x1ED9;
 t['ocircumflexgrave'] = 0x1ED3;
 t['ocircumflexhookabove'] = 0x1ED5;
 t['ocircumflextilde'] = 0x1ED7;
 t['ocyrillic'] = 0x043E;
 t['odblacute'] = 0x0151;
 t['odblgrave'] = 0x020D;
 t['odeva'] = 0x0913;
 t['odieresis'] = 0x00F6;
 t['odieresiscyrillic'] = 0x04E7;
 t['odotbelow'] = 0x1ECD;
 t['oe'] = 0x0153;
 t['oekorean'] = 0x315A;
 t['ogonek'] = 0x02DB;
 t['ogonekcmb'] = 0x0328;
 t['ograve'] = 0x00F2;
 t['ogujarati'] = 0x0A93;
 t['oharmenian'] = 0x0585;
 t['ohiragana'] = 0x304A;
 t['ohookabove'] = 0x1ECF;
 t['ohorn'] = 0x01A1;
 t['ohornacute'] = 0x1EDB;
 t['ohorndotbelow'] = 0x1EE3;
 t['ohorngrave'] = 0x1EDD;
 t['ohornhookabove'] = 0x1EDF;
 t['ohorntilde'] = 0x1EE1;
 t['ohungarumlaut'] = 0x0151;
 t['oi'] = 0x01A3;
 t['oinvertedbreve'] = 0x020F;
 t['okatakana'] = 0x30AA;
 t['okatakanahalfwidth'] = 0xFF75;
 t['okorean'] = 0x3157;
 t['olehebrew'] = 0x05AB;
 t['omacron'] = 0x014D;
 t['omacronacute'] = 0x1E53;
 t['omacrongrave'] = 0x1E51;
 t['omdeva'] = 0x0950;
 t['omega'] = 0x03C9;
 t['omega1'] = 0x03D6;
 t['omegacyrillic'] = 0x0461;
 t['omegalatinclosed'] = 0x0277;
 t['omegaroundcyrillic'] = 0x047B;
 t['omegatitlocyrillic'] = 0x047D;
 t['omegatonos'] = 0x03CE;
 t['omgujarati'] = 0x0AD0;
 t['omicron'] = 0x03BF;
 t['omicrontonos'] = 0x03CC;
 t['omonospace'] = 0xFF4F;
 t['one'] = 0x0031;
 t['onearabic'] = 0x0661;
 t['onebengali'] = 0x09E7;
 t['onecircle'] = 0x2460;
 t['onecircleinversesansserif'] = 0x278A;
 t['onedeva'] = 0x0967;
 t['onedotenleader'] = 0x2024;
 t['oneeighth'] = 0x215B;
 t['onefitted'] = 0xF6DC;
 t['onegujarati'] = 0x0AE7;
 t['onegurmukhi'] = 0x0A67;
 t['onehackarabic'] = 0x0661;
 t['onehalf'] = 0x00BD;
 t['onehangzhou'] = 0x3021;
 t['oneideographicparen'] = 0x3220;
 t['oneinferior'] = 0x2081;
 t['onemonospace'] = 0xFF11;
 t['onenumeratorbengali'] = 0x09F4;
 t['oneoldstyle'] = 0xF731;
 t['oneparen'] = 0x2474;
 t['oneperiod'] = 0x2488;
 t['onepersian'] = 0x06F1;
 t['onequarter'] = 0x00BC;
 t['oneroman'] = 0x2170;
 t['onesuperior'] = 0x00B9;
 t['onethai'] = 0x0E51;
 t['onethird'] = 0x2153;
 t['oogonek'] = 0x01EB;
 t['oogonekmacron'] = 0x01ED;
 t['oogurmukhi'] = 0x0A13;
 t['oomatragurmukhi'] = 0x0A4B;
 t['oopen'] = 0x0254;
 t['oparen'] = 0x24AA;
 t['openbullet'] = 0x25E6;
 t['option'] = 0x2325;
 t['ordfeminine'] = 0x00AA;
 t['ordmasculine'] = 0x00BA;
 t['orthogonal'] = 0x221F;
 t['oshortdeva'] = 0x0912;
 t['oshortvowelsigndeva'] = 0x094A;
 t['oslash'] = 0x00F8;
 t['oslashacute'] = 0x01FF;
 t['osmallhiragana'] = 0x3049;
 t['osmallkatakana'] = 0x30A9;
 t['osmallkatakanahalfwidth'] = 0xFF6B;
 t['ostrokeacute'] = 0x01FF;
 t['osuperior'] = 0xF6F0;
 t['otcyrillic'] = 0x047F;
 t['otilde'] = 0x00F5;
 t['otildeacute'] = 0x1E4D;
 t['otildedieresis'] = 0x1E4F;
 t['oubopomofo'] = 0x3121;
 t['overline'] = 0x203E;
 t['overlinecenterline'] = 0xFE4A;
 t['overlinecmb'] = 0x0305;
 t['overlinedashed'] = 0xFE49;
 t['overlinedblwavy'] = 0xFE4C;
 t['overlinewavy'] = 0xFE4B;
 t['overscore'] = 0x00AF;
 t['ovowelsignbengali'] = 0x09CB;
 t['ovowelsigndeva'] = 0x094B;
 t['ovowelsigngujarati'] = 0x0ACB;
 t['p'] = 0x0070;
 t['paampssquare'] = 0x3380;
 t['paasentosquare'] = 0x332B;
 t['pabengali'] = 0x09AA;
 t['pacute'] = 0x1E55;
 t['padeva'] = 0x092A;
 t['pagedown'] = 0x21DF;
 t['pageup'] = 0x21DE;
 t['pagujarati'] = 0x0AAA;
 t['pagurmukhi'] = 0x0A2A;
 t['pahiragana'] = 0x3071;
 t['paiyannoithai'] = 0x0E2F;
 t['pakatakana'] = 0x30D1;
 t['palatalizationcyrilliccmb'] = 0x0484;
 t['palochkacyrillic'] = 0x04C0;
 t['pansioskorean'] = 0x317F;
 t['paragraph'] = 0x00B6;
 t['parallel'] = 0x2225;
 t['parenleft'] = 0x0028;
 t['parenleftaltonearabic'] = 0xFD3E;
 t['parenleftbt'] = 0xF8ED;
 t['parenleftex'] = 0xF8EC;
 t['parenleftinferior'] = 0x208D;
 t['parenleftmonospace'] = 0xFF08;
 t['parenleftsmall'] = 0xFE59;
 t['parenleftsuperior'] = 0x207D;
 t['parenlefttp'] = 0xF8EB;
 t['parenleftvertical'] = 0xFE35;
 t['parenright'] = 0x0029;
 t['parenrightaltonearabic'] = 0xFD3F;
 t['parenrightbt'] = 0xF8F8;
 t['parenrightex'] = 0xF8F7;
 t['parenrightinferior'] = 0x208E;
 t['parenrightmonospace'] = 0xFF09;
 t['parenrightsmall'] = 0xFE5A;
 t['parenrightsuperior'] = 0x207E;
 t['parenrighttp'] = 0xF8F6;
 t['parenrightvertical'] = 0xFE36;
 t['partialdiff'] = 0x2202;
 t['paseqhebrew'] = 0x05C0;
 t['pashtahebrew'] = 0x0599;
 t['pasquare'] = 0x33A9;
 t['patah'] = 0x05B7;
 t['patah11'] = 0x05B7;
 t['patah1d'] = 0x05B7;
 t['patah2a'] = 0x05B7;
 t['patahhebrew'] = 0x05B7;
 t['patahnarrowhebrew'] = 0x05B7;
 t['patahquarterhebrew'] = 0x05B7;
 t['patahwidehebrew'] = 0x05B7;
 t['pazerhebrew'] = 0x05A1;
 t['pbopomofo'] = 0x3106;
 t['pcircle'] = 0x24DF;
 t['pdotaccent'] = 0x1E57;
 t['pe'] = 0x05E4;
 t['pecyrillic'] = 0x043F;
 t['pedagesh'] = 0xFB44;
 t['pedageshhebrew'] = 0xFB44;
 t['peezisquare'] = 0x333B;
 t['pefinaldageshhebrew'] = 0xFB43;
 t['peharabic'] = 0x067E;
 t['peharmenian'] = 0x057A;
 t['pehebrew'] = 0x05E4;
 t['pehfinalarabic'] = 0xFB57;
 t['pehinitialarabic'] = 0xFB58;
 t['pehiragana'] = 0x307A;
 t['pehmedialarabic'] = 0xFB59;
 t['pekatakana'] = 0x30DA;
 t['pemiddlehookcyrillic'] = 0x04A7;
 t['perafehebrew'] = 0xFB4E;
 t['percent'] = 0x0025;
 t['percentarabic'] = 0x066A;
 t['percentmonospace'] = 0xFF05;
 t['percentsmall'] = 0xFE6A;
 t['period'] = 0x002E;
 t['periodarmenian'] = 0x0589;
 t['periodcentered'] = 0x00B7;
 t['periodhalfwidth'] = 0xFF61;
 t['periodinferior'] = 0xF6E7;
 t['periodmonospace'] = 0xFF0E;
 t['periodsmall'] = 0xFE52;
 t['periodsuperior'] = 0xF6E8;
 t['perispomenigreekcmb'] = 0x0342;
 t['perpendicular'] = 0x22A5;
 t['perthousand'] = 0x2030;
 t['peseta'] = 0x20A7;
 t['pfsquare'] = 0x338A;
 t['phabengali'] = 0x09AB;
 t['phadeva'] = 0x092B;
 t['phagujarati'] = 0x0AAB;
 t['phagurmukhi'] = 0x0A2B;
 t['phi'] = 0x03C6;
 t['phi1'] = 0x03D5;
 t['phieuphacirclekorean'] = 0x327A;
 t['phieuphaparenkorean'] = 0x321A;
 t['phieuphcirclekorean'] = 0x326C;
 t['phieuphkorean'] = 0x314D;
 t['phieuphparenkorean'] = 0x320C;
 t['philatin'] = 0x0278;
 t['phinthuthai'] = 0x0E3A;
 t['phisymbolgreek'] = 0x03D5;
 t['phook'] = 0x01A5;
 t['phophanthai'] = 0x0E1E;
 t['phophungthai'] = 0x0E1C;
 t['phosamphaothai'] = 0x0E20;
 t['pi'] = 0x03C0;
 t['pieupacirclekorean'] = 0x3273;
 t['pieupaparenkorean'] = 0x3213;
 t['pieupcieuckorean'] = 0x3176;
 t['pieupcirclekorean'] = 0x3265;
 t['pieupkiyeokkorean'] = 0x3172;
 t['pieupkorean'] = 0x3142;
 t['pieupparenkorean'] = 0x3205;
 t['pieupsioskiyeokkorean'] = 0x3174;
 t['pieupsioskorean'] = 0x3144;
 t['pieupsiostikeutkorean'] = 0x3175;
 t['pieupthieuthkorean'] = 0x3177;
 t['pieuptikeutkorean'] = 0x3173;
 t['pihiragana'] = 0x3074;
 t['pikatakana'] = 0x30D4;
 t['pisymbolgreek'] = 0x03D6;
 t['piwrarmenian'] = 0x0583;
 t['plus'] = 0x002B;
 t['plusbelowcmb'] = 0x031F;
 t['pluscircle'] = 0x2295;
 t['plusminus'] = 0x00B1;
 t['plusmod'] = 0x02D6;
 t['plusmonospace'] = 0xFF0B;
 t['plussmall'] = 0xFE62;
 t['plussuperior'] = 0x207A;
 t['pmonospace'] = 0xFF50;
 t['pmsquare'] = 0x33D8;
 t['pohiragana'] = 0x307D;
 t['pointingindexdownwhite'] = 0x261F;
 t['pointingindexleftwhite'] = 0x261C;
 t['pointingindexrightwhite'] = 0x261E;
 t['pointingindexupwhite'] = 0x261D;
 t['pokatakana'] = 0x30DD;
 t['poplathai'] = 0x0E1B;
 t['postalmark'] = 0x3012;
 t['postalmarkface'] = 0x3020;
 t['pparen'] = 0x24AB;
 t['precedes'] = 0x227A;
 t['prescription'] = 0x211E;
 t['primemod'] = 0x02B9;
 t['primereversed'] = 0x2035;
 t['product'] = 0x220F;
 t['projective'] = 0x2305;
 t['prolongedkana'] = 0x30FC;
 t['propellor'] = 0x2318;
 t['propersubset'] = 0x2282;
 t['propersuperset'] = 0x2283;
 t['proportion'] = 0x2237;
 t['proportional'] = 0x221D;
 t['psi'] = 0x03C8;
 t['psicyrillic'] = 0x0471;
 t['psilipneumatacyrilliccmb'] = 0x0486;
 t['pssquare'] = 0x33B0;
 t['puhiragana'] = 0x3077;
 t['pukatakana'] = 0x30D7;
 t['pvsquare'] = 0x33B4;
 t['pwsquare'] = 0x33BA;
 t['q'] = 0x0071;
 t['qadeva'] = 0x0958;
 t['qadmahebrew'] = 0x05A8;
 t['qafarabic'] = 0x0642;
 t['qaffinalarabic'] = 0xFED6;
 t['qafinitialarabic'] = 0xFED7;
 t['qafmedialarabic'] = 0xFED8;
 t['qamats'] = 0x05B8;
 t['qamats10'] = 0x05B8;
 t['qamats1a'] = 0x05B8;
 t['qamats1c'] = 0x05B8;
 t['qamats27'] = 0x05B8;
 t['qamats29'] = 0x05B8;
 t['qamats33'] = 0x05B8;
 t['qamatsde'] = 0x05B8;
 t['qamatshebrew'] = 0x05B8;
 t['qamatsnarrowhebrew'] = 0x05B8;
 t['qamatsqatanhebrew'] = 0x05B8;
 t['qamatsqatannarrowhebrew'] = 0x05B8;
 t['qamatsqatanquarterhebrew'] = 0x05B8;
 t['qamatsqatanwidehebrew'] = 0x05B8;
 t['qamatsquarterhebrew'] = 0x05B8;
 t['qamatswidehebrew'] = 0x05B8;
 t['qarneyparahebrew'] = 0x059F;
 t['qbopomofo'] = 0x3111;
 t['qcircle'] = 0x24E0;
 t['qhook'] = 0x02A0;
 t['qmonospace'] = 0xFF51;
 t['qof'] = 0x05E7;
 t['qofdagesh'] = 0xFB47;
 t['qofdageshhebrew'] = 0xFB47;
 t['qofhebrew'] = 0x05E7;
 t['qparen'] = 0x24AC;
 t['quarternote'] = 0x2669;
 t['qubuts'] = 0x05BB;
 t['qubuts18'] = 0x05BB;
 t['qubuts25'] = 0x05BB;
 t['qubuts31'] = 0x05BB;
 t['qubutshebrew'] = 0x05BB;
 t['qubutsnarrowhebrew'] = 0x05BB;
 t['qubutsquarterhebrew'] = 0x05BB;
 t['qubutswidehebrew'] = 0x05BB;
 t['question'] = 0x003F;
 t['questionarabic'] = 0x061F;
 t['questionarmenian'] = 0x055E;
 t['questiondown'] = 0x00BF;
 t['questiondownsmall'] = 0xF7BF;
 t['questiongreek'] = 0x037E;
 t['questionmonospace'] = 0xFF1F;
 t['questionsmall'] = 0xF73F;
 t['quotedbl'] = 0x0022;
 t['quotedblbase'] = 0x201E;
 t['quotedblleft'] = 0x201C;
 t['quotedblmonospace'] = 0xFF02;
 t['quotedblprime'] = 0x301E;
 t['quotedblprimereversed'] = 0x301D;
 t['quotedblright'] = 0x201D;
 t['quoteleft'] = 0x2018;
 t['quoteleftreversed'] = 0x201B;
 t['quotereversed'] = 0x201B;
 t['quoteright'] = 0x2019;
 t['quoterightn'] = 0x0149;
 t['quotesinglbase'] = 0x201A;
 t['quotesingle'] = 0x0027;
 t['quotesinglemonospace'] = 0xFF07;
 t['r'] = 0x0072;
 t['raarmenian'] = 0x057C;
 t['rabengali'] = 0x09B0;
 t['racute'] = 0x0155;
 t['radeva'] = 0x0930;
 t['radical'] = 0x221A;
 t['radicalex'] = 0xF8E5;
 t['radoverssquare'] = 0x33AE;
 t['radoverssquaredsquare'] = 0x33AF;
 t['radsquare'] = 0x33AD;
 t['rafe'] = 0x05BF;
 t['rafehebrew'] = 0x05BF;
 t['ragujarati'] = 0x0AB0;
 t['ragurmukhi'] = 0x0A30;
 t['rahiragana'] = 0x3089;
 t['rakatakana'] = 0x30E9;
 t['rakatakanahalfwidth'] = 0xFF97;
 t['ralowerdiagonalbengali'] = 0x09F1;
 t['ramiddlediagonalbengali'] = 0x09F0;
 t['ramshorn'] = 0x0264;
 t['ratio'] = 0x2236;
 t['rbopomofo'] = 0x3116;
 t['rcaron'] = 0x0159;
 t['rcedilla'] = 0x0157;
 t['rcircle'] = 0x24E1;
 t['rcommaaccent'] = 0x0157;
 t['rdblgrave'] = 0x0211;
 t['rdotaccent'] = 0x1E59;
 t['rdotbelow'] = 0x1E5B;
 t['rdotbelowmacron'] = 0x1E5D;
 t['referencemark'] = 0x203B;
 t['reflexsubset'] = 0x2286;
 t['reflexsuperset'] = 0x2287;
 t['registered'] = 0x00AE;
 t['registersans'] = 0xF8E8;
 t['registerserif'] = 0xF6DA;
 t['reharabic'] = 0x0631;
 t['reharmenian'] = 0x0580;
 t['rehfinalarabic'] = 0xFEAE;
 t['rehiragana'] = 0x308C;
 t['rekatakana'] = 0x30EC;
 t['rekatakanahalfwidth'] = 0xFF9A;
 t['resh'] = 0x05E8;
 t['reshdageshhebrew'] = 0xFB48;
 t['reshhebrew'] = 0x05E8;
 t['reversedtilde'] = 0x223D;
 t['reviahebrew'] = 0x0597;
 t['reviamugrashhebrew'] = 0x0597;
 t['revlogicalnot'] = 0x2310;
 t['rfishhook'] = 0x027E;
 t['rfishhookreversed'] = 0x027F;
 t['rhabengali'] = 0x09DD;
 t['rhadeva'] = 0x095D;
 t['rho'] = 0x03C1;
 t['rhook'] = 0x027D;
 t['rhookturned'] = 0x027B;
 t['rhookturnedsuperior'] = 0x02B5;
 t['rhosymbolgreek'] = 0x03F1;
 t['rhotichookmod'] = 0x02DE;
 t['rieulacirclekorean'] = 0x3271;
 t['rieulaparenkorean'] = 0x3211;
 t['rieulcirclekorean'] = 0x3263;
 t['rieulhieuhkorean'] = 0x3140;
 t['rieulkiyeokkorean'] = 0x313A;
 t['rieulkiyeoksioskorean'] = 0x3169;
 t['rieulkorean'] = 0x3139;
 t['rieulmieumkorean'] = 0x313B;
 t['rieulpansioskorean'] = 0x316C;
 t['rieulparenkorean'] = 0x3203;
 t['rieulphieuphkorean'] = 0x313F;
 t['rieulpieupkorean'] = 0x313C;
 t['rieulpieupsioskorean'] = 0x316B;
 t['rieulsioskorean'] = 0x313D;
 t['rieulthieuthkorean'] = 0x313E;
 t['rieultikeutkorean'] = 0x316A;
 t['rieulyeorinhieuhkorean'] = 0x316D;
 t['rightangle'] = 0x221F;
 t['righttackbelowcmb'] = 0x0319;
 t['righttriangle'] = 0x22BF;
 t['rihiragana'] = 0x308A;
 t['rikatakana'] = 0x30EA;
 t['rikatakanahalfwidth'] = 0xFF98;
 t['ring'] = 0x02DA;
 t['ringbelowcmb'] = 0x0325;
 t['ringcmb'] = 0x030A;
 t['ringhalfleft'] = 0x02BF;
 t['ringhalfleftarmenian'] = 0x0559;
 t['ringhalfleftbelowcmb'] = 0x031C;
 t['ringhalfleftcentered'] = 0x02D3;
 t['ringhalfright'] = 0x02BE;
 t['ringhalfrightbelowcmb'] = 0x0339;
 t['ringhalfrightcentered'] = 0x02D2;
 t['rinvertedbreve'] = 0x0213;
 t['rittorusquare'] = 0x3351;
 t['rlinebelow'] = 0x1E5F;
 t['rlongleg'] = 0x027C;
 t['rlonglegturned'] = 0x027A;
 t['rmonospace'] = 0xFF52;
 t['rohiragana'] = 0x308D;
 t['rokatakana'] = 0x30ED;
 t['rokatakanahalfwidth'] = 0xFF9B;
 t['roruathai'] = 0x0E23;
 t['rparen'] = 0x24AD;
 t['rrabengali'] = 0x09DC;
 t['rradeva'] = 0x0931;
 t['rragurmukhi'] = 0x0A5C;
 t['rreharabic'] = 0x0691;
 t['rrehfinalarabic'] = 0xFB8D;
 t['rrvocalicbengali'] = 0x09E0;
 t['rrvocalicdeva'] = 0x0960;
 t['rrvocalicgujarati'] = 0x0AE0;
 t['rrvocalicvowelsignbengali'] = 0x09C4;
 t['rrvocalicvowelsigndeva'] = 0x0944;
 t['rrvocalicvowelsigngujarati'] = 0x0AC4;
 t['rsuperior'] = 0xF6F1;
 t['rtblock'] = 0x2590;
 t['rturned'] = 0x0279;
 t['rturnedsuperior'] = 0x02B4;
 t['ruhiragana'] = 0x308B;
 t['rukatakana'] = 0x30EB;
 t['rukatakanahalfwidth'] = 0xFF99;
 t['rupeemarkbengali'] = 0x09F2;
 t['rupeesignbengali'] = 0x09F3;
 t['rupiah'] = 0xF6DD;
 t['ruthai'] = 0x0E24;
 t['rvocalicbengali'] = 0x098B;
 t['rvocalicdeva'] = 0x090B;
 t['rvocalicgujarati'] = 0x0A8B;
 t['rvocalicvowelsignbengali'] = 0x09C3;
 t['rvocalicvowelsigndeva'] = 0x0943;
 t['rvocalicvowelsigngujarati'] = 0x0AC3;
 t['s'] = 0x0073;
 t['sabengali'] = 0x09B8;
 t['sacute'] = 0x015B;
 t['sacutedotaccent'] = 0x1E65;
 t['sadarabic'] = 0x0635;
 t['sadeva'] = 0x0938;
 t['sadfinalarabic'] = 0xFEBA;
 t['sadinitialarabic'] = 0xFEBB;
 t['sadmedialarabic'] = 0xFEBC;
 t['sagujarati'] = 0x0AB8;
 t['sagurmukhi'] = 0x0A38;
 t['sahiragana'] = 0x3055;
 t['sakatakana'] = 0x30B5;
 t['sakatakanahalfwidth'] = 0xFF7B;
 t['sallallahoualayhewasallamarabic'] = 0xFDFA;
 t['samekh'] = 0x05E1;
 t['samekhdagesh'] = 0xFB41;
 t['samekhdageshhebrew'] = 0xFB41;
 t['samekhhebrew'] = 0x05E1;
 t['saraaathai'] = 0x0E32;
 t['saraaethai'] = 0x0E41;
 t['saraaimaimalaithai'] = 0x0E44;
 t['saraaimaimuanthai'] = 0x0E43;
 t['saraamthai'] = 0x0E33;
 t['saraathai'] = 0x0E30;
 t['saraethai'] = 0x0E40;
 t['saraiileftthai'] = 0xF886;
 t['saraiithai'] = 0x0E35;
 t['saraileftthai'] = 0xF885;
 t['saraithai'] = 0x0E34;
 t['saraothai'] = 0x0E42;
 t['saraueeleftthai'] = 0xF888;
 t['saraueethai'] = 0x0E37;
 t['saraueleftthai'] = 0xF887;
 t['sarauethai'] = 0x0E36;
 t['sarauthai'] = 0x0E38;
 t['sarauuthai'] = 0x0E39;
 t['sbopomofo'] = 0x3119;
 t['scaron'] = 0x0161;
 t['scarondotaccent'] = 0x1E67;
 t['scedilla'] = 0x015F;
 t['schwa'] = 0x0259;
 t['schwacyrillic'] = 0x04D9;
 t['schwadieresiscyrillic'] = 0x04DB;
 t['schwahook'] = 0x025A;
 t['scircle'] = 0x24E2;
 t['scircumflex'] = 0x015D;
 t['scommaaccent'] = 0x0219;
 t['sdotaccent'] = 0x1E61;
 t['sdotbelow'] = 0x1E63;
 t['sdotbelowdotaccent'] = 0x1E69;
 t['seagullbelowcmb'] = 0x033C;
 t['second'] = 0x2033;
 t['secondtonechinese'] = 0x02CA;
 t['section'] = 0x00A7;
 t['seenarabic'] = 0x0633;
 t['seenfinalarabic'] = 0xFEB2;
 t['seeninitialarabic'] = 0xFEB3;
 t['seenmedialarabic'] = 0xFEB4;
 t['segol'] = 0x05B6;
 t['segol13'] = 0x05B6;
 t['segol1f'] = 0x05B6;
 t['segol2c'] = 0x05B6;
 t['segolhebrew'] = 0x05B6;
 t['segolnarrowhebrew'] = 0x05B6;
 t['segolquarterhebrew'] = 0x05B6;
 t['segoltahebrew'] = 0x0592;
 t['segolwidehebrew'] = 0x05B6;
 t['seharmenian'] = 0x057D;
 t['sehiragana'] = 0x305B;
 t['sekatakana'] = 0x30BB;
 t['sekatakanahalfwidth'] = 0xFF7E;
 t['semicolon'] = 0x003B;
 t['semicolonarabic'] = 0x061B;
 t['semicolonmonospace'] = 0xFF1B;
 t['semicolonsmall'] = 0xFE54;
 t['semivoicedmarkkana'] = 0x309C;
 t['semivoicedmarkkanahalfwidth'] = 0xFF9F;
 t['sentisquare'] = 0x3322;
 t['sentosquare'] = 0x3323;
 t['seven'] = 0x0037;
 t['sevenarabic'] = 0x0667;
 t['sevenbengali'] = 0x09ED;
 t['sevencircle'] = 0x2466;
 t['sevencircleinversesansserif'] = 0x2790;
 t['sevendeva'] = 0x096D;
 t['seveneighths'] = 0x215E;
 t['sevengujarati'] = 0x0AED;
 t['sevengurmukhi'] = 0x0A6D;
 t['sevenhackarabic'] = 0x0667;
 t['sevenhangzhou'] = 0x3027;
 t['sevenideographicparen'] = 0x3226;
 t['seveninferior'] = 0x2087;
 t['sevenmonospace'] = 0xFF17;
 t['sevenoldstyle'] = 0xF737;
 t['sevenparen'] = 0x247A;
 t['sevenperiod'] = 0x248E;
 t['sevenpersian'] = 0x06F7;
 t['sevenroman'] = 0x2176;
 t['sevensuperior'] = 0x2077;
 t['seventeencircle'] = 0x2470;
 t['seventeenparen'] = 0x2484;
 t['seventeenperiod'] = 0x2498;
 t['seventhai'] = 0x0E57;
 t['sfthyphen'] = 0x00AD;
 t['shaarmenian'] = 0x0577;
 t['shabengali'] = 0x09B6;
 t['shacyrillic'] = 0x0448;
 t['shaddaarabic'] = 0x0651;
 t['shaddadammaarabic'] = 0xFC61;
 t['shaddadammatanarabic'] = 0xFC5E;
 t['shaddafathaarabic'] = 0xFC60;
 t['shaddakasraarabic'] = 0xFC62;
 t['shaddakasratanarabic'] = 0xFC5F;
 t['shade'] = 0x2592;
 t['shadedark'] = 0x2593;
 t['shadelight'] = 0x2591;
 t['shademedium'] = 0x2592;
 t['shadeva'] = 0x0936;
 t['shagujarati'] = 0x0AB6;
 t['shagurmukhi'] = 0x0A36;
 t['shalshelethebrew'] = 0x0593;
 t['shbopomofo'] = 0x3115;
 t['shchacyrillic'] = 0x0449;
 t['sheenarabic'] = 0x0634;
 t['sheenfinalarabic'] = 0xFEB6;
 t['sheeninitialarabic'] = 0xFEB7;
 t['sheenmedialarabic'] = 0xFEB8;
 t['sheicoptic'] = 0x03E3;
 t['sheqel'] = 0x20AA;
 t['sheqelhebrew'] = 0x20AA;
 t['sheva'] = 0x05B0;
 t['sheva115'] = 0x05B0;
 t['sheva15'] = 0x05B0;
 t['sheva22'] = 0x05B0;
 t['sheva2e'] = 0x05B0;
 t['shevahebrew'] = 0x05B0;
 t['shevanarrowhebrew'] = 0x05B0;
 t['shevaquarterhebrew'] = 0x05B0;
 t['shevawidehebrew'] = 0x05B0;
 t['shhacyrillic'] = 0x04BB;
 t['shimacoptic'] = 0x03ED;
 t['shin'] = 0x05E9;
 t['shindagesh'] = 0xFB49;
 t['shindageshhebrew'] = 0xFB49;
 t['shindageshshindot'] = 0xFB2C;
 t['shindageshshindothebrew'] = 0xFB2C;
 t['shindageshsindot'] = 0xFB2D;
 t['shindageshsindothebrew'] = 0xFB2D;
 t['shindothebrew'] = 0x05C1;
 t['shinhebrew'] = 0x05E9;
 t['shinshindot'] = 0xFB2A;
 t['shinshindothebrew'] = 0xFB2A;
 t['shinsindot'] = 0xFB2B;
 t['shinsindothebrew'] = 0xFB2B;
 t['shook'] = 0x0282;
 t['sigma'] = 0x03C3;
 t['sigma1'] = 0x03C2;
 t['sigmafinal'] = 0x03C2;
 t['sigmalunatesymbolgreek'] = 0x03F2;
 t['sihiragana'] = 0x3057;
 t['sikatakana'] = 0x30B7;
 t['sikatakanahalfwidth'] = 0xFF7C;
 t['siluqhebrew'] = 0x05BD;
 t['siluqlefthebrew'] = 0x05BD;
 t['similar'] = 0x223C;
 t['sindothebrew'] = 0x05C2;
 t['siosacirclekorean'] = 0x3274;
 t['siosaparenkorean'] = 0x3214;
 t['sioscieuckorean'] = 0x317E;
 t['sioscirclekorean'] = 0x3266;
 t['sioskiyeokkorean'] = 0x317A;
 t['sioskorean'] = 0x3145;
 t['siosnieunkorean'] = 0x317B;
 t['siosparenkorean'] = 0x3206;
 t['siospieupkorean'] = 0x317D;
 t['siostikeutkorean'] = 0x317C;
 t['six'] = 0x0036;
 t['sixarabic'] = 0x0666;
 t['sixbengali'] = 0x09EC;
 t['sixcircle'] = 0x2465;
 t['sixcircleinversesansserif'] = 0x278F;
 t['sixdeva'] = 0x096C;
 t['sixgujarati'] = 0x0AEC;
 t['sixgurmukhi'] = 0x0A6C;
 t['sixhackarabic'] = 0x0666;
 t['sixhangzhou'] = 0x3026;
 t['sixideographicparen'] = 0x3225;
 t['sixinferior'] = 0x2086;
 t['sixmonospace'] = 0xFF16;
 t['sixoldstyle'] = 0xF736;
 t['sixparen'] = 0x2479;
 t['sixperiod'] = 0x248D;
 t['sixpersian'] = 0x06F6;
 t['sixroman'] = 0x2175;
 t['sixsuperior'] = 0x2076;
 t['sixteencircle'] = 0x246F;
 t['sixteencurrencydenominatorbengali'] = 0x09F9;
 t['sixteenparen'] = 0x2483;
 t['sixteenperiod'] = 0x2497;
 t['sixthai'] = 0x0E56;
 t['slash'] = 0x002F;
 t['slashmonospace'] = 0xFF0F;
 t['slong'] = 0x017F;
 t['slongdotaccent'] = 0x1E9B;
 t['smileface'] = 0x263A;
 t['smonospace'] = 0xFF53;
 t['sofpasuqhebrew'] = 0x05C3;
 t['softhyphen'] = 0x00AD;
 t['softsigncyrillic'] = 0x044C;
 t['sohiragana'] = 0x305D;
 t['sokatakana'] = 0x30BD;
 t['sokatakanahalfwidth'] = 0xFF7F;
 t['soliduslongoverlaycmb'] = 0x0338;
 t['solidusshortoverlaycmb'] = 0x0337;
 t['sorusithai'] = 0x0E29;
 t['sosalathai'] = 0x0E28;
 t['sosothai'] = 0x0E0B;
 t['sosuathai'] = 0x0E2A;
 t['space'] = 0x0020;
 t['spacehackarabic'] = 0x0020;
 t['spade'] = 0x2660;
 t['spadesuitblack'] = 0x2660;
 t['spadesuitwhite'] = 0x2664;
 t['sparen'] = 0x24AE;
 t['squarebelowcmb'] = 0x033B;
 t['squarecc'] = 0x33C4;
 t['squarecm'] = 0x339D;
 t['squarediagonalcrosshatchfill'] = 0x25A9;
 t['squarehorizontalfill'] = 0x25A4;
 t['squarekg'] = 0x338F;
 t['squarekm'] = 0x339E;
 t['squarekmcapital'] = 0x33CE;
 t['squareln'] = 0x33D1;
 t['squarelog'] = 0x33D2;
 t['squaremg'] = 0x338E;
 t['squaremil'] = 0x33D5;
 t['squaremm'] = 0x339C;
 t['squaremsquared'] = 0x33A1;
 t['squareorthogonalcrosshatchfill'] = 0x25A6;
 t['squareupperlefttolowerrightfill'] = 0x25A7;
 t['squareupperrighttolowerleftfill'] = 0x25A8;
 t['squareverticalfill'] = 0x25A5;
 t['squarewhitewithsmallblack'] = 0x25A3;
 t['srsquare'] = 0x33DB;
 t['ssabengali'] = 0x09B7;
 t['ssadeva'] = 0x0937;
 t['ssagujarati'] = 0x0AB7;
 t['ssangcieuckorean'] = 0x3149;
 t['ssanghieuhkorean'] = 0x3185;
 t['ssangieungkorean'] = 0x3180;
 t['ssangkiyeokkorean'] = 0x3132;
 t['ssangnieunkorean'] = 0x3165;
 t['ssangpieupkorean'] = 0x3143;
 t['ssangsioskorean'] = 0x3146;
 t['ssangtikeutkorean'] = 0x3138;
 t['ssuperior'] = 0xF6F2;
 t['sterling'] = 0x00A3;
 t['sterlingmonospace'] = 0xFFE1;
 t['strokelongoverlaycmb'] = 0x0336;
 t['strokeshortoverlaycmb'] = 0x0335;
 t['subset'] = 0x2282;
 t['subsetnotequal'] = 0x228A;
 t['subsetorequal'] = 0x2286;
 t['succeeds'] = 0x227B;
 t['suchthat'] = 0x220B;
 t['suhiragana'] = 0x3059;
 t['sukatakana'] = 0x30B9;
 t['sukatakanahalfwidth'] = 0xFF7D;
 t['sukunarabic'] = 0x0652;
 t['summation'] = 0x2211;
 t['sun'] = 0x263C;
 t['superset'] = 0x2283;
 t['supersetnotequal'] = 0x228B;
 t['supersetorequal'] = 0x2287;
 t['svsquare'] = 0x33DC;
 t['syouwaerasquare'] = 0x337C;
 t['t'] = 0x0074;
 t['tabengali'] = 0x09A4;
 t['tackdown'] = 0x22A4;
 t['tackleft'] = 0x22A3;
 t['tadeva'] = 0x0924;
 t['tagujarati'] = 0x0AA4;
 t['tagurmukhi'] = 0x0A24;
 t['taharabic'] = 0x0637;
 t['tahfinalarabic'] = 0xFEC2;
 t['tahinitialarabic'] = 0xFEC3;
 t['tahiragana'] = 0x305F;
 t['tahmedialarabic'] = 0xFEC4;
 t['taisyouerasquare'] = 0x337D;
 t['takatakana'] = 0x30BF;
 t['takatakanahalfwidth'] = 0xFF80;
 t['tatweelarabic'] = 0x0640;
 t['tau'] = 0x03C4;
 t['tav'] = 0x05EA;
 t['tavdages'] = 0xFB4A;
 t['tavdagesh'] = 0xFB4A;
 t['tavdageshhebrew'] = 0xFB4A;
 t['tavhebrew'] = 0x05EA;
 t['tbar'] = 0x0167;
 t['tbopomofo'] = 0x310A;
 t['tcaron'] = 0x0165;
 t['tccurl'] = 0x02A8;
 t['tcedilla'] = 0x0163;
 t['tcheharabic'] = 0x0686;
 t['tchehfinalarabic'] = 0xFB7B;
 t['tchehinitialarabic'] = 0xFB7C;
 t['tchehmedialarabic'] = 0xFB7D;
 t['tcircle'] = 0x24E3;
 t['tcircumflexbelow'] = 0x1E71;
 t['tcommaaccent'] = 0x0163;
 t['tdieresis'] = 0x1E97;
 t['tdotaccent'] = 0x1E6B;
 t['tdotbelow'] = 0x1E6D;
 t['tecyrillic'] = 0x0442;
 t['tedescendercyrillic'] = 0x04AD;
 t['teharabic'] = 0x062A;
 t['tehfinalarabic'] = 0xFE96;
 t['tehhahinitialarabic'] = 0xFCA2;
 t['tehhahisolatedarabic'] = 0xFC0C;
 t['tehinitialarabic'] = 0xFE97;
 t['tehiragana'] = 0x3066;
 t['tehjeeminitialarabic'] = 0xFCA1;
 t['tehjeemisolatedarabic'] = 0xFC0B;
 t['tehmarbutaarabic'] = 0x0629;
 t['tehmarbutafinalarabic'] = 0xFE94;
 t['tehmedialarabic'] = 0xFE98;
 t['tehmeeminitialarabic'] = 0xFCA4;
 t['tehmeemisolatedarabic'] = 0xFC0E;
 t['tehnoonfinalarabic'] = 0xFC73;
 t['tekatakana'] = 0x30C6;
 t['tekatakanahalfwidth'] = 0xFF83;
 t['telephone'] = 0x2121;
 t['telephoneblack'] = 0x260E;
 t['telishagedolahebrew'] = 0x05A0;
 t['telishaqetanahebrew'] = 0x05A9;
 t['tencircle'] = 0x2469;
 t['tenideographicparen'] = 0x3229;
 t['tenparen'] = 0x247D;
 t['tenperiod'] = 0x2491;
 t['tenroman'] = 0x2179;
 t['tesh'] = 0x02A7;
 t['tet'] = 0x05D8;
 t['tetdagesh'] = 0xFB38;
 t['tetdageshhebrew'] = 0xFB38;
 t['tethebrew'] = 0x05D8;
 t['tetsecyrillic'] = 0x04B5;
 t['tevirhebrew'] = 0x059B;
 t['tevirlefthebrew'] = 0x059B;
 t['thabengali'] = 0x09A5;
 t['thadeva'] = 0x0925;
 t['thagujarati'] = 0x0AA5;
 t['thagurmukhi'] = 0x0A25;
 t['thalarabic'] = 0x0630;
 t['thalfinalarabic'] = 0xFEAC;
 t['thanthakhatlowleftthai'] = 0xF898;
 t['thanthakhatlowrightthai'] = 0xF897;
 t['thanthakhatthai'] = 0x0E4C;
 t['thanthakhatupperleftthai'] = 0xF896;
 t['theharabic'] = 0x062B;
 t['thehfinalarabic'] = 0xFE9A;
 t['thehinitialarabic'] = 0xFE9B;
 t['thehmedialarabic'] = 0xFE9C;
 t['thereexists'] = 0x2203;
 t['therefore'] = 0x2234;
 t['theta'] = 0x03B8;
 t['theta1'] = 0x03D1;
 t['thetasymbolgreek'] = 0x03D1;
 t['thieuthacirclekorean'] = 0x3279;
 t['thieuthaparenkorean'] = 0x3219;
 t['thieuthcirclekorean'] = 0x326B;
 t['thieuthkorean'] = 0x314C;
 t['thieuthparenkorean'] = 0x320B;
 t['thirteencircle'] = 0x246C;
 t['thirteenparen'] = 0x2480;
 t['thirteenperiod'] = 0x2494;
 t['thonangmonthothai'] = 0x0E11;
 t['thook'] = 0x01AD;
 t['thophuthaothai'] = 0x0E12;
 t['thorn'] = 0x00FE;
 t['thothahanthai'] = 0x0E17;
 t['thothanthai'] = 0x0E10;
 t['thothongthai'] = 0x0E18;
 t['thothungthai'] = 0x0E16;
 t['thousandcyrillic'] = 0x0482;
 t['thousandsseparatorarabic'] = 0x066C;
 t['thousandsseparatorpersian'] = 0x066C;
 t['three'] = 0x0033;
 t['threearabic'] = 0x0663;
 t['threebengali'] = 0x09E9;
 t['threecircle'] = 0x2462;
 t['threecircleinversesansserif'] = 0x278C;
 t['threedeva'] = 0x0969;
 t['threeeighths'] = 0x215C;
 t['threegujarati'] = 0x0AE9;
 t['threegurmukhi'] = 0x0A69;
 t['threehackarabic'] = 0x0663;
 t['threehangzhou'] = 0x3023;
 t['threeideographicparen'] = 0x3222;
 t['threeinferior'] = 0x2083;
 t['threemonospace'] = 0xFF13;
 t['threenumeratorbengali'] = 0x09F6;
 t['threeoldstyle'] = 0xF733;
 t['threeparen'] = 0x2476;
 t['threeperiod'] = 0x248A;
 t['threepersian'] = 0x06F3;
 t['threequarters'] = 0x00BE;
 t['threequartersemdash'] = 0xF6DE;
 t['threeroman'] = 0x2172;
 t['threesuperior'] = 0x00B3;
 t['threethai'] = 0x0E53;
 t['thzsquare'] = 0x3394;
 t['tihiragana'] = 0x3061;
 t['tikatakana'] = 0x30C1;
 t['tikatakanahalfwidth'] = 0xFF81;
 t['tikeutacirclekorean'] = 0x3270;
 t['tikeutaparenkorean'] = 0x3210;
 t['tikeutcirclekorean'] = 0x3262;
 t['tikeutkorean'] = 0x3137;
 t['tikeutparenkorean'] = 0x3202;
 t['tilde'] = 0x02DC;
 t['tildebelowcmb'] = 0x0330;
 t['tildecmb'] = 0x0303;
 t['tildecomb'] = 0x0303;
 t['tildedoublecmb'] = 0x0360;
 t['tildeoperator'] = 0x223C;
 t['tildeoverlaycmb'] = 0x0334;
 t['tildeverticalcmb'] = 0x033E;
 t['timescircle'] = 0x2297;
 t['tipehahebrew'] = 0x0596;
 t['tipehalefthebrew'] = 0x0596;
 t['tippigurmukhi'] = 0x0A70;
 t['titlocyrilliccmb'] = 0x0483;
 t['tiwnarmenian'] = 0x057F;
 t['tlinebelow'] = 0x1E6F;
 t['tmonospace'] = 0xFF54;
 t['toarmenian'] = 0x0569;
 t['tohiragana'] = 0x3068;
 t['tokatakana'] = 0x30C8;
 t['tokatakanahalfwidth'] = 0xFF84;
 t['tonebarextrahighmod'] = 0x02E5;
 t['tonebarextralowmod'] = 0x02E9;
 t['tonebarhighmod'] = 0x02E6;
 t['tonebarlowmod'] = 0x02E8;
 t['tonebarmidmod'] = 0x02E7;
 t['tonefive'] = 0x01BD;
 t['tonesix'] = 0x0185;
 t['tonetwo'] = 0x01A8;
 t['tonos'] = 0x0384;
 t['tonsquare'] = 0x3327;
 t['topatakthai'] = 0x0E0F;
 t['tortoiseshellbracketleft'] = 0x3014;
 t['tortoiseshellbracketleftsmall'] = 0xFE5D;
 t['tortoiseshellbracketleftvertical'] = 0xFE39;
 t['tortoiseshellbracketright'] = 0x3015;
 t['tortoiseshellbracketrightsmall'] = 0xFE5E;
 t['tortoiseshellbracketrightvertical'] = 0xFE3A;
 t['totaothai'] = 0x0E15;
 t['tpalatalhook'] = 0x01AB;
 t['tparen'] = 0x24AF;
 t['trademark'] = 0x2122;
 t['trademarksans'] = 0xF8EA;
 t['trademarkserif'] = 0xF6DB;
 t['tretroflexhook'] = 0x0288;
 t['triagdn'] = 0x25BC;
 t['triaglf'] = 0x25C4;
 t['triagrt'] = 0x25BA;
 t['triagup'] = 0x25B2;
 t['ts'] = 0x02A6;
 t['tsadi'] = 0x05E6;
 t['tsadidagesh'] = 0xFB46;
 t['tsadidageshhebrew'] = 0xFB46;
 t['tsadihebrew'] = 0x05E6;
 t['tsecyrillic'] = 0x0446;
 t['tsere'] = 0x05B5;
 t['tsere12'] = 0x05B5;
 t['tsere1e'] = 0x05B5;
 t['tsere2b'] = 0x05B5;
 t['tserehebrew'] = 0x05B5;
 t['tserenarrowhebrew'] = 0x05B5;
 t['tserequarterhebrew'] = 0x05B5;
 t['tserewidehebrew'] = 0x05B5;
 t['tshecyrillic'] = 0x045B;
 t['tsuperior'] = 0xF6F3;
 t['ttabengali'] = 0x099F;
 t['ttadeva'] = 0x091F;
 t['ttagujarati'] = 0x0A9F;
 t['ttagurmukhi'] = 0x0A1F;
 t['tteharabic'] = 0x0679;
 t['ttehfinalarabic'] = 0xFB67;
 t['ttehinitialarabic'] = 0xFB68;
 t['ttehmedialarabic'] = 0xFB69;
 t['tthabengali'] = 0x09A0;
 t['tthadeva'] = 0x0920;
 t['tthagujarati'] = 0x0AA0;
 t['tthagurmukhi'] = 0x0A20;
 t['tturned'] = 0x0287;
 t['tuhiragana'] = 0x3064;
 t['tukatakana'] = 0x30C4;
 t['tukatakanahalfwidth'] = 0xFF82;
 t['tusmallhiragana'] = 0x3063;
 t['tusmallkatakana'] = 0x30C3;
 t['tusmallkatakanahalfwidth'] = 0xFF6F;
 t['twelvecircle'] = 0x246B;
 t['twelveparen'] = 0x247F;
 t['twelveperiod'] = 0x2493;
 t['twelveroman'] = 0x217B;
 t['twentycircle'] = 0x2473;
 t['twentyhangzhou'] = 0x5344;
 t['twentyparen'] = 0x2487;
 t['twentyperiod'] = 0x249B;
 t['two'] = 0x0032;
 t['twoarabic'] = 0x0662;
 t['twobengali'] = 0x09E8;
 t['twocircle'] = 0x2461;
 t['twocircleinversesansserif'] = 0x278B;
 t['twodeva'] = 0x0968;
 t['twodotenleader'] = 0x2025;
 t['twodotleader'] = 0x2025;
 t['twodotleadervertical'] = 0xFE30;
 t['twogujarati'] = 0x0AE8;
 t['twogurmukhi'] = 0x0A68;
 t['twohackarabic'] = 0x0662;
 t['twohangzhou'] = 0x3022;
 t['twoideographicparen'] = 0x3221;
 t['twoinferior'] = 0x2082;
 t['twomonospace'] = 0xFF12;
 t['twonumeratorbengali'] = 0x09F5;
 t['twooldstyle'] = 0xF732;
 t['twoparen'] = 0x2475;
 t['twoperiod'] = 0x2489;
 t['twopersian'] = 0x06F2;
 t['tworoman'] = 0x2171;
 t['twostroke'] = 0x01BB;
 t['twosuperior'] = 0x00B2;
 t['twothai'] = 0x0E52;
 t['twothirds'] = 0x2154;
 t['u'] = 0x0075;
 t['uacute'] = 0x00FA;
 t['ubar'] = 0x0289;
 t['ubengali'] = 0x0989;
 t['ubopomofo'] = 0x3128;
 t['ubreve'] = 0x016D;
 t['ucaron'] = 0x01D4;
 t['ucircle'] = 0x24E4;
 t['ucircumflex'] = 0x00FB;
 t['ucircumflexbelow'] = 0x1E77;
 t['ucyrillic'] = 0x0443;
 t['udattadeva'] = 0x0951;
 t['udblacute'] = 0x0171;
 t['udblgrave'] = 0x0215;
 t['udeva'] = 0x0909;
 t['udieresis'] = 0x00FC;
 t['udieresisacute'] = 0x01D8;
 t['udieresisbelow'] = 0x1E73;
 t['udieresiscaron'] = 0x01DA;
 t['udieresiscyrillic'] = 0x04F1;
 t['udieresisgrave'] = 0x01DC;
 t['udieresismacron'] = 0x01D6;
 t['udotbelow'] = 0x1EE5;
 t['ugrave'] = 0x00F9;
 t['ugujarati'] = 0x0A89;
 t['ugurmukhi'] = 0x0A09;
 t['uhiragana'] = 0x3046;
 t['uhookabove'] = 0x1EE7;
 t['uhorn'] = 0x01B0;
 t['uhornacute'] = 0x1EE9;
 t['uhorndotbelow'] = 0x1EF1;
 t['uhorngrave'] = 0x1EEB;
 t['uhornhookabove'] = 0x1EED;
 t['uhorntilde'] = 0x1EEF;
 t['uhungarumlaut'] = 0x0171;
 t['uhungarumlautcyrillic'] = 0x04F3;
 t['uinvertedbreve'] = 0x0217;
 t['ukatakana'] = 0x30A6;
 t['ukatakanahalfwidth'] = 0xFF73;
 t['ukcyrillic'] = 0x0479;
 t['ukorean'] = 0x315C;
 t['umacron'] = 0x016B;
 t['umacroncyrillic'] = 0x04EF;
 t['umacrondieresis'] = 0x1E7B;
 t['umatragurmukhi'] = 0x0A41;
 t['umonospace'] = 0xFF55;
 t['underscore'] = 0x005F;
 t['underscoredbl'] = 0x2017;
 t['underscoremonospace'] = 0xFF3F;
 t['underscorevertical'] = 0xFE33;
 t['underscorewavy'] = 0xFE4F;
 t['union'] = 0x222A;
 t['universal'] = 0x2200;
 t['uogonek'] = 0x0173;
 t['uparen'] = 0x24B0;
 t['upblock'] = 0x2580;
 t['upperdothebrew'] = 0x05C4;
 t['upsilon'] = 0x03C5;
 t['upsilondieresis'] = 0x03CB;
 t['upsilondieresistonos'] = 0x03B0;
 t['upsilonlatin'] = 0x028A;
 t['upsilontonos'] = 0x03CD;
 t['uptackbelowcmb'] = 0x031D;
 t['uptackmod'] = 0x02D4;
 t['uragurmukhi'] = 0x0A73;
 t['uring'] = 0x016F;
 t['ushortcyrillic'] = 0x045E;
 t['usmallhiragana'] = 0x3045;
 t['usmallkatakana'] = 0x30A5;
 t['usmallkatakanahalfwidth'] = 0xFF69;
 t['ustraightcyrillic'] = 0x04AF;
 t['ustraightstrokecyrillic'] = 0x04B1;
 t['utilde'] = 0x0169;
 t['utildeacute'] = 0x1E79;
 t['utildebelow'] = 0x1E75;
 t['uubengali'] = 0x098A;
 t['uudeva'] = 0x090A;
 t['uugujarati'] = 0x0A8A;
 t['uugurmukhi'] = 0x0A0A;
 t['uumatragurmukhi'] = 0x0A42;
 t['uuvowelsignbengali'] = 0x09C2;
 t['uuvowelsigndeva'] = 0x0942;
 t['uuvowelsigngujarati'] = 0x0AC2;
 t['uvowelsignbengali'] = 0x09C1;
 t['uvowelsigndeva'] = 0x0941;
 t['uvowelsigngujarati'] = 0x0AC1;
 t['v'] = 0x0076;
 t['vadeva'] = 0x0935;
 t['vagujarati'] = 0x0AB5;
 t['vagurmukhi'] = 0x0A35;
 t['vakatakana'] = 0x30F7;
 t['vav'] = 0x05D5;
 t['vavdagesh'] = 0xFB35;
 t['vavdagesh65'] = 0xFB35;
 t['vavdageshhebrew'] = 0xFB35;
 t['vavhebrew'] = 0x05D5;
 t['vavholam'] = 0xFB4B;
 t['vavholamhebrew'] = 0xFB4B;
 t['vavvavhebrew'] = 0x05F0;
 t['vavyodhebrew'] = 0x05F1;
 t['vcircle'] = 0x24E5;
 t['vdotbelow'] = 0x1E7F;
 t['vecyrillic'] = 0x0432;
 t['veharabic'] = 0x06A4;
 t['vehfinalarabic'] = 0xFB6B;
 t['vehinitialarabic'] = 0xFB6C;
 t['vehmedialarabic'] = 0xFB6D;
 t['vekatakana'] = 0x30F9;
 t['venus'] = 0x2640;
 t['verticalbar'] = 0x007C;
 t['verticallineabovecmb'] = 0x030D;
 t['verticallinebelowcmb'] = 0x0329;
 t['verticallinelowmod'] = 0x02CC;
 t['verticallinemod'] = 0x02C8;
 t['vewarmenian'] = 0x057E;
 t['vhook'] = 0x028B;
 t['vikatakana'] = 0x30F8;
 t['viramabengali'] = 0x09CD;
 t['viramadeva'] = 0x094D;
 t['viramagujarati'] = 0x0ACD;
 t['visargabengali'] = 0x0983;
 t['visargadeva'] = 0x0903;
 t['visargagujarati'] = 0x0A83;
 t['vmonospace'] = 0xFF56;
 t['voarmenian'] = 0x0578;
 t['voicediterationhiragana'] = 0x309E;
 t['voicediterationkatakana'] = 0x30FE;
 t['voicedmarkkana'] = 0x309B;
 t['voicedmarkkanahalfwidth'] = 0xFF9E;
 t['vokatakana'] = 0x30FA;
 t['vparen'] = 0x24B1;
 t['vtilde'] = 0x1E7D;
 t['vturned'] = 0x028C;
 t['vuhiragana'] = 0x3094;
 t['vukatakana'] = 0x30F4;
 t['w'] = 0x0077;
 t['wacute'] = 0x1E83;
 t['waekorean'] = 0x3159;
 t['wahiragana'] = 0x308F;
 t['wakatakana'] = 0x30EF;
 t['wakatakanahalfwidth'] = 0xFF9C;
 t['wakorean'] = 0x3158;
 t['wasmallhiragana'] = 0x308E;
 t['wasmallkatakana'] = 0x30EE;
 t['wattosquare'] = 0x3357;
 t['wavedash'] = 0x301C;
 t['wavyunderscorevertical'] = 0xFE34;
 t['wawarabic'] = 0x0648;
 t['wawfinalarabic'] = 0xFEEE;
 t['wawhamzaabovearabic'] = 0x0624;
 t['wawhamzaabovefinalarabic'] = 0xFE86;
 t['wbsquare'] = 0x33DD;
 t['wcircle'] = 0x24E6;
 t['wcircumflex'] = 0x0175;
 t['wdieresis'] = 0x1E85;
 t['wdotaccent'] = 0x1E87;
 t['wdotbelow'] = 0x1E89;
 t['wehiragana'] = 0x3091;
 t['weierstrass'] = 0x2118;
 t['wekatakana'] = 0x30F1;
 t['wekorean'] = 0x315E;
 t['weokorean'] = 0x315D;
 t['wgrave'] = 0x1E81;
 t['whitebullet'] = 0x25E6;
 t['whitecircle'] = 0x25CB;
 t['whitecircleinverse'] = 0x25D9;
 t['whitecornerbracketleft'] = 0x300E;
 t['whitecornerbracketleftvertical'] = 0xFE43;
 t['whitecornerbracketright'] = 0x300F;
 t['whitecornerbracketrightvertical'] = 0xFE44;
 t['whitediamond'] = 0x25C7;
 t['whitediamondcontainingblacksmalldiamond'] = 0x25C8;
 t['whitedownpointingsmalltriangle'] = 0x25BF;
 t['whitedownpointingtriangle'] = 0x25BD;
 t['whiteleftpointingsmalltriangle'] = 0x25C3;
 t['whiteleftpointingtriangle'] = 0x25C1;
 t['whitelenticularbracketleft'] = 0x3016;
 t['whitelenticularbracketright'] = 0x3017;
 t['whiterightpointingsmalltriangle'] = 0x25B9;
 t['whiterightpointingtriangle'] = 0x25B7;
 t['whitesmallsquare'] = 0x25AB;
 t['whitesmilingface'] = 0x263A;
 t['whitesquare'] = 0x25A1;
 t['whitestar'] = 0x2606;
 t['whitetelephone'] = 0x260F;
 t['whitetortoiseshellbracketleft'] = 0x3018;
 t['whitetortoiseshellbracketright'] = 0x3019;
 t['whiteuppointingsmalltriangle'] = 0x25B5;
 t['whiteuppointingtriangle'] = 0x25B3;
 t['wihiragana'] = 0x3090;
 t['wikatakana'] = 0x30F0;
 t['wikorean'] = 0x315F;
 t['wmonospace'] = 0xFF57;
 t['wohiragana'] = 0x3092;
 t['wokatakana'] = 0x30F2;
 t['wokatakanahalfwidth'] = 0xFF66;
 t['won'] = 0x20A9;
 t['wonmonospace'] = 0xFFE6;
 t['wowaenthai'] = 0x0E27;
 t['wparen'] = 0x24B2;
 t['wring'] = 0x1E98;
 t['wsuperior'] = 0x02B7;
 t['wturned'] = 0x028D;
 t['wynn'] = 0x01BF;
 t['x'] = 0x0078;
 t['xabovecmb'] = 0x033D;
 t['xbopomofo'] = 0x3112;
 t['xcircle'] = 0x24E7;
 t['xdieresis'] = 0x1E8D;
 t['xdotaccent'] = 0x1E8B;
 t['xeharmenian'] = 0x056D;
 t['xi'] = 0x03BE;
 t['xmonospace'] = 0xFF58;
 t['xparen'] = 0x24B3;
 t['xsuperior'] = 0x02E3;
 t['y'] = 0x0079;
 t['yaadosquare'] = 0x334E;
 t['yabengali'] = 0x09AF;
 t['yacute'] = 0x00FD;
 t['yadeva'] = 0x092F;
 t['yaekorean'] = 0x3152;
 t['yagujarati'] = 0x0AAF;
 t['yagurmukhi'] = 0x0A2F;
 t['yahiragana'] = 0x3084;
 t['yakatakana'] = 0x30E4;
 t['yakatakanahalfwidth'] = 0xFF94;
 t['yakorean'] = 0x3151;
 t['yamakkanthai'] = 0x0E4E;
 t['yasmallhiragana'] = 0x3083;
 t['yasmallkatakana'] = 0x30E3;
 t['yasmallkatakanahalfwidth'] = 0xFF6C;
 t['yatcyrillic'] = 0x0463;
 t['ycircle'] = 0x24E8;
 t['ycircumflex'] = 0x0177;
 t['ydieresis'] = 0x00FF;
 t['ydotaccent'] = 0x1E8F;
 t['ydotbelow'] = 0x1EF5;
 t['yeharabic'] = 0x064A;
 t['yehbarreearabic'] = 0x06D2;
 t['yehbarreefinalarabic'] = 0xFBAF;
 t['yehfinalarabic'] = 0xFEF2;
 t['yehhamzaabovearabic'] = 0x0626;
 t['yehhamzaabovefinalarabic'] = 0xFE8A;
 t['yehhamzaaboveinitialarabic'] = 0xFE8B;
 t['yehhamzaabovemedialarabic'] = 0xFE8C;
 t['yehinitialarabic'] = 0xFEF3;
 t['yehmedialarabic'] = 0xFEF4;
 t['yehmeeminitialarabic'] = 0xFCDD;
 t['yehmeemisolatedarabic'] = 0xFC58;
 t['yehnoonfinalarabic'] = 0xFC94;
 t['yehthreedotsbelowarabic'] = 0x06D1;
 t['yekorean'] = 0x3156;
 t['yen'] = 0x00A5;
 t['yenmonospace'] = 0xFFE5;
 t['yeokorean'] = 0x3155;
 t['yeorinhieuhkorean'] = 0x3186;
 t['yerahbenyomohebrew'] = 0x05AA;
 t['yerahbenyomolefthebrew'] = 0x05AA;
 t['yericyrillic'] = 0x044B;
 t['yerudieresiscyrillic'] = 0x04F9;
 t['yesieungkorean'] = 0x3181;
 t['yesieungpansioskorean'] = 0x3183;
 t['yesieungsioskorean'] = 0x3182;
 t['yetivhebrew'] = 0x059A;
 t['ygrave'] = 0x1EF3;
 t['yhook'] = 0x01B4;
 t['yhookabove'] = 0x1EF7;
 t['yiarmenian'] = 0x0575;
 t['yicyrillic'] = 0x0457;
 t['yikorean'] = 0x3162;
 t['yinyang'] = 0x262F;
 t['yiwnarmenian'] = 0x0582;
 t['ymonospace'] = 0xFF59;
 t['yod'] = 0x05D9;
 t['yoddagesh'] = 0xFB39;
 t['yoddageshhebrew'] = 0xFB39;
 t['yodhebrew'] = 0x05D9;
 t['yodyodhebrew'] = 0x05F2;
 t['yodyodpatahhebrew'] = 0xFB1F;
 t['yohiragana'] = 0x3088;
 t['yoikorean'] = 0x3189;
 t['yokatakana'] = 0x30E8;
 t['yokatakanahalfwidth'] = 0xFF96;
 t['yokorean'] = 0x315B;
 t['yosmallhiragana'] = 0x3087;
 t['yosmallkatakana'] = 0x30E7;
 t['yosmallkatakanahalfwidth'] = 0xFF6E;
 t['yotgreek'] = 0x03F3;
 t['yoyaekorean'] = 0x3188;
 t['yoyakorean'] = 0x3187;
 t['yoyakthai'] = 0x0E22;
 t['yoyingthai'] = 0x0E0D;
 t['yparen'] = 0x24B4;
 t['ypogegrammeni'] = 0x037A;
 t['ypogegrammenigreekcmb'] = 0x0345;
 t['yr'] = 0x01A6;
 t['yring'] = 0x1E99;
 t['ysuperior'] = 0x02B8;
 t['ytilde'] = 0x1EF9;
 t['yturned'] = 0x028E;
 t['yuhiragana'] = 0x3086;
 t['yuikorean'] = 0x318C;
 t['yukatakana'] = 0x30E6;
 t['yukatakanahalfwidth'] = 0xFF95;
 t['yukorean'] = 0x3160;
 t['yusbigcyrillic'] = 0x046B;
 t['yusbigiotifiedcyrillic'] = 0x046D;
 t['yuslittlecyrillic'] = 0x0467;
 t['yuslittleiotifiedcyrillic'] = 0x0469;
 t['yusmallhiragana'] = 0x3085;
 t['yusmallkatakana'] = 0x30E5;
 t['yusmallkatakanahalfwidth'] = 0xFF6D;
 t['yuyekorean'] = 0x318B;
 t['yuyeokorean'] = 0x318A;
 t['yyabengali'] = 0x09DF;
 t['yyadeva'] = 0x095F;
 t['z'] = 0x007A;
 t['zaarmenian'] = 0x0566;
 t['zacute'] = 0x017A;
 t['zadeva'] = 0x095B;
 t['zagurmukhi'] = 0x0A5B;
 t['zaharabic'] = 0x0638;
 t['zahfinalarabic'] = 0xFEC6;
 t['zahinitialarabic'] = 0xFEC7;
 t['zahiragana'] = 0x3056;
 t['zahmedialarabic'] = 0xFEC8;
 t['zainarabic'] = 0x0632;
 t['zainfinalarabic'] = 0xFEB0;
 t['zakatakana'] = 0x30B6;
 t['zaqefgadolhebrew'] = 0x0595;
 t['zaqefqatanhebrew'] = 0x0594;
 t['zarqahebrew'] = 0x0598;
 t['zayin'] = 0x05D6;
 t['zayindagesh'] = 0xFB36;
 t['zayindageshhebrew'] = 0xFB36;
 t['zayinhebrew'] = 0x05D6;
 t['zbopomofo'] = 0x3117;
 t['zcaron'] = 0x017E;
 t['zcircle'] = 0x24E9;
 t['zcircumflex'] = 0x1E91;
 t['zcurl'] = 0x0291;
 t['zdot'] = 0x017C;
 t['zdotaccent'] = 0x017C;
 t['zdotbelow'] = 0x1E93;
 t['zecyrillic'] = 0x0437;
 t['zedescendercyrillic'] = 0x0499;
 t['zedieresiscyrillic'] = 0x04DF;
 t['zehiragana'] = 0x305C;
 t['zekatakana'] = 0x30BC;
 t['zero'] = 0x0030;
 t['zeroarabic'] = 0x0660;
 t['zerobengali'] = 0x09E6;
 t['zerodeva'] = 0x0966;
 t['zerogujarati'] = 0x0AE6;
 t['zerogurmukhi'] = 0x0A66;
 t['zerohackarabic'] = 0x0660;
 t['zeroinferior'] = 0x2080;
 t['zeromonospace'] = 0xFF10;
 t['zerooldstyle'] = 0xF730;
 t['zeropersian'] = 0x06F0;
 t['zerosuperior'] = 0x2070;
 t['zerothai'] = 0x0E50;
 t['zerowidthjoiner'] = 0xFEFF;
 t['zerowidthnonjoiner'] = 0x200C;
 t['zerowidthspace'] = 0x200B;
 t['zeta'] = 0x03B6;
 t['zhbopomofo'] = 0x3113;
 t['zhearmenian'] = 0x056A;
 t['zhebrevecyrillic'] = 0x04C2;
 t['zhecyrillic'] = 0x0436;
 t['zhedescendercyrillic'] = 0x0497;
 t['zhedieresiscyrillic'] = 0x04DD;
 t['zihiragana'] = 0x3058;
 t['zikatakana'] = 0x30B8;
 t['zinorhebrew'] = 0x05AE;
 t['zlinebelow'] = 0x1E95;
 t['zmonospace'] = 0xFF5A;
 t['zohiragana'] = 0x305E;
 t['zokatakana'] = 0x30BE;
 t['zparen'] = 0x24B5;
 t['zretroflexhook'] = 0x0290;
 t['zstroke'] = 0x01B6;
 t['zuhiragana'] = 0x305A;
 t['zukatakana'] = 0x30BA;
 t['.notdef'] = 0x0000;
 t['angbracketleftbig'] = 0x2329;
 t['angbracketleftBig'] = 0x2329;
 t['angbracketleftbigg'] = 0x2329;
 t['angbracketleftBigg'] = 0x2329;
 t['angbracketrightBig'] = 0x232A;
 t['angbracketrightbig'] = 0x232A;
 t['angbracketrightBigg'] = 0x232A;
 t['angbracketrightbigg'] = 0x232A;
 t['arrowhookleft'] = 0x21AA;
 t['arrowhookright'] = 0x21A9;
 t['arrowlefttophalf'] = 0x21BC;
 t['arrowleftbothalf'] = 0x21BD;
 t['arrownortheast'] = 0x2197;
 t['arrownorthwest'] = 0x2196;
 t['arrowrighttophalf'] = 0x21C0;
 t['arrowrightbothalf'] = 0x21C1;
 t['arrowsoutheast'] = 0x2198;
 t['arrowsouthwest'] = 0x2199;
 t['backslashbig'] = 0x2216;
 t['backslashBig'] = 0x2216;
 t['backslashBigg'] = 0x2216;
 t['backslashbigg'] = 0x2216;
 t['bardbl'] = 0x2016;
 t['bracehtipdownleft'] = 0xFE37;
 t['bracehtipdownright'] = 0xFE37;
 t['bracehtipupleft'] = 0xFE38;
 t['bracehtipupright'] = 0xFE38;
 t['braceleftBig'] = 0x007B;
 t['braceleftbig'] = 0x007B;
 t['braceleftbigg'] = 0x007B;
 t['braceleftBigg'] = 0x007B;
 t['bracerightBig'] = 0x007D;
 t['bracerightbig'] = 0x007D;
 t['bracerightbigg'] = 0x007D;
 t['bracerightBigg'] = 0x007D;
 t['bracketleftbig'] = 0x005B;
 t['bracketleftBig'] = 0x005B;
 t['bracketleftbigg'] = 0x005B;
 t['bracketleftBigg'] = 0x005B;
 t['bracketrightBig'] = 0x005D;
 t['bracketrightbig'] = 0x005D;
 t['bracketrightbigg'] = 0x005D;
 t['bracketrightBigg'] = 0x005D;
 t['ceilingleftbig'] = 0x2308;
 t['ceilingleftBig'] = 0x2308;
 t['ceilingleftBigg'] = 0x2308;
 t['ceilingleftbigg'] = 0x2308;
 t['ceilingrightbig'] = 0x2309;
 t['ceilingrightBig'] = 0x2309;
 t['ceilingrightbigg'] = 0x2309;
 t['ceilingrightBigg'] = 0x2309;
 t['circledotdisplay'] = 0x2299;
 t['circledottext'] = 0x2299;
 t['circlemultiplydisplay'] = 0x2297;
 t['circlemultiplytext'] = 0x2297;
 t['circleplusdisplay'] = 0x2295;
 t['circleplustext'] = 0x2295;
 t['contintegraldisplay'] = 0x222E;
 t['contintegraltext'] = 0x222E;
 t['coproductdisplay'] = 0x2210;
 t['coproducttext'] = 0x2210;
 t['floorleftBig'] = 0x230A;
 t['floorleftbig'] = 0x230A;
 t['floorleftbigg'] = 0x230A;
 t['floorleftBigg'] = 0x230A;
 t['floorrightbig'] = 0x230B;
 t['floorrightBig'] = 0x230B;
 t['floorrightBigg'] = 0x230B;
 t['floorrightbigg'] = 0x230B;
 t['hatwide'] = 0x0302;
 t['hatwider'] = 0x0302;
 t['hatwidest'] = 0x0302;
 t['intercal'] = 0x1D40;
 t['integraldisplay'] = 0x222B;
 t['integraltext'] = 0x222B;
 t['intersectiondisplay'] = 0x22C2;
 t['intersectiontext'] = 0x22C2;
 t['logicalanddisplay'] = 0x2227;
 t['logicalandtext'] = 0x2227;
 t['logicalordisplay'] = 0x2228;
 t['logicalortext'] = 0x2228;
 t['parenleftBig'] = 0x0028;
 t['parenleftbig'] = 0x0028;
 t['parenleftBigg'] = 0x0028;
 t['parenleftbigg'] = 0x0028;
 t['parenrightBig'] = 0x0029;
 t['parenrightbig'] = 0x0029;
 t['parenrightBigg'] = 0x0029;
 t['parenrightbigg'] = 0x0029;
 t['prime'] = 0x2032;
 t['productdisplay'] = 0x220F;
 t['producttext'] = 0x220F;
 t['radicalbig'] = 0x221A;
 t['radicalBig'] = 0x221A;
 t['radicalBigg'] = 0x221A;
 t['radicalbigg'] = 0x221A;
 t['radicalbt'] = 0x221A;
 t['radicaltp'] = 0x221A;
 t['radicalvertex'] = 0x221A;
 t['slashbig'] = 0x002F;
 t['slashBig'] = 0x002F;
 t['slashBigg'] = 0x002F;
 t['slashbigg'] = 0x002F;
 t['summationdisplay'] = 0x2211;
 t['summationtext'] = 0x2211;
 t['tildewide'] = 0x02DC;
 t['tildewider'] = 0x02DC;
 t['tildewidest'] = 0x02DC;
 t['uniondisplay'] = 0x22C3;
 t['unionmultidisplay'] = 0x228E;
 t['unionmultitext'] = 0x228E;
 t['unionsqdisplay'] = 0x2294;
 t['unionsqtext'] = 0x2294;
 t['uniontext'] = 0x22C3;
 t['vextenddouble'] = 0x2225;
 t['vextendsingle'] = 0x2223;
});
var getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) {
 t['space'] = 0x0020;
 t['a1'] = 0x2701;
 t['a2'] = 0x2702;
 t['a202'] = 0x2703;
 t['a3'] = 0x2704;
 t['a4'] = 0x260E;
 t['a5'] = 0x2706;
 t['a119'] = 0x2707;
 t['a118'] = 0x2708;
 t['a117'] = 0x2709;
 t['a11'] = 0x261B;
 t['a12'] = 0x261E;
 t['a13'] = 0x270C;
 t['a14'] = 0x270D;
 t['a15'] = 0x270E;
 t['a16'] = 0x270F;
 t['a105'] = 0x2710;
 t['a17'] = 0x2711;
 t['a18'] = 0x2712;
 t['a19'] = 0x2713;
 t['a20'] = 0x2714;
 t['a21'] = 0x2715;
 t['a22'] = 0x2716;
 t['a23'] = 0x2717;
 t['a24'] = 0x2718;
 t['a25'] = 0x2719;
 t['a26'] = 0x271A;
 t['a27'] = 0x271B;
 t['a28'] = 0x271C;
 t['a6'] = 0x271D;
 t['a7'] = 0x271E;
 t['a8'] = 0x271F;
 t['a9'] = 0x2720;
 t['a10'] = 0x2721;
 t['a29'] = 0x2722;
 t['a30'] = 0x2723;
 t['a31'] = 0x2724;
 t['a32'] = 0x2725;
 t['a33'] = 0x2726;
 t['a34'] = 0x2727;
 t['a35'] = 0x2605;
 t['a36'] = 0x2729;
 t['a37'] = 0x272A;
 t['a38'] = 0x272B;
 t['a39'] = 0x272C;
 t['a40'] = 0x272D;
 t['a41'] = 0x272E;
 t['a42'] = 0x272F;
 t['a43'] = 0x2730;
 t['a44'] = 0x2731;
 t['a45'] = 0x2732;
 t['a46'] = 0x2733;
 t['a47'] = 0x2734;
 t['a48'] = 0x2735;
 t['a49'] = 0x2736;
 t['a50'] = 0x2737;
 t['a51'] = 0x2738;
 t['a52'] = 0x2739;
 t['a53'] = 0x273A;
 t['a54'] = 0x273B;
 t['a55'] = 0x273C;
 t['a56'] = 0x273D;
 t['a57'] = 0x273E;
 t['a58'] = 0x273F;
 t['a59'] = 0x2740;
 t['a60'] = 0x2741;
 t['a61'] = 0x2742;
 t['a62'] = 0x2743;
 t['a63'] = 0x2744;
 t['a64'] = 0x2745;
 t['a65'] = 0x2746;
 t['a66'] = 0x2747;
 t['a67'] = 0x2748;
 t['a68'] = 0x2749;
 t['a69'] = 0x274A;
 t['a70'] = 0x274B;
 t['a71'] = 0x25CF;
 t['a72'] = 0x274D;
 t['a73'] = 0x25A0;
 t['a74'] = 0x274F;
 t['a203'] = 0x2750;
 t['a75'] = 0x2751;
 t['a204'] = 0x2752;
 t['a76'] = 0x25B2;
 t['a77'] = 0x25BC;
 t['a78'] = 0x25C6;
 t['a79'] = 0x2756;
 t['a81'] = 0x25D7;
 t['a82'] = 0x2758;
 t['a83'] = 0x2759;
 t['a84'] = 0x275A;
 t['a97'] = 0x275B;
 t['a98'] = 0x275C;
 t['a99'] = 0x275D;
 t['a100'] = 0x275E;
 t['a101'] = 0x2761;
 t['a102'] = 0x2762;
 t['a103'] = 0x2763;
 t['a104'] = 0x2764;
 t['a106'] = 0x2765;
 t['a107'] = 0x2766;
 t['a108'] = 0x2767;
 t['a112'] = 0x2663;
 t['a111'] = 0x2666;
 t['a110'] = 0x2665;
 t['a109'] = 0x2660;
 t['a120'] = 0x2460;
 t['a121'] = 0x2461;
 t['a122'] = 0x2462;
 t['a123'] = 0x2463;
 t['a124'] = 0x2464;
 t['a125'] = 0x2465;
 t['a126'] = 0x2466;
 t['a127'] = 0x2467;
 t['a128'] = 0x2468;
 t['a129'] = 0x2469;
 t['a130'] = 0x2776;
 t['a131'] = 0x2777;
 t['a132'] = 0x2778;
 t['a133'] = 0x2779;
 t['a134'] = 0x277A;
 t['a135'] = 0x277B;
 t['a136'] = 0x277C;
 t['a137'] = 0x277D;
 t['a138'] = 0x277E;
 t['a139'] = 0x277F;
 t['a140'] = 0x2780;
 t['a141'] = 0x2781;
 t['a142'] = 0x2782;
 t['a143'] = 0x2783;
 t['a144'] = 0x2784;
 t['a145'] = 0x2785;
 t['a146'] = 0x2786;
 t['a147'] = 0x2787;
 t['a148'] = 0x2788;
 t['a149'] = 0x2789;
 t['a150'] = 0x278A;
 t['a151'] = 0x278B;
 t['a152'] = 0x278C;
 t['a153'] = 0x278D;
 t['a154'] = 0x278E;
 t['a155'] = 0x278F;
 t['a156'] = 0x2790;
 t['a157'] = 0x2791;
 t['a158'] = 0x2792;
 t['a159'] = 0x2793;
 t['a160'] = 0x2794;
 t['a161'] = 0x2192;
 t['a163'] = 0x2194;
 t['a164'] = 0x2195;
 t['a196'] = 0x2798;
 t['a165'] = 0x2799;
 t['a192'] = 0x279A;
 t['a166'] = 0x279B;
 t['a167'] = 0x279C;
 t['a168'] = 0x279D;
 t['a169'] = 0x279E;
 t['a170'] = 0x279F;
 t['a171'] = 0x27A0;
 t['a172'] = 0x27A1;
 t['a173'] = 0x27A2;
 t['a162'] = 0x27A3;
 t['a174'] = 0x27A4;
 t['a175'] = 0x27A5;
 t['a176'] = 0x27A6;
 t['a177'] = 0x27A7;
 t['a178'] = 0x27A8;
 t['a179'] = 0x27A9;
 t['a193'] = 0x27AA;
 t['a180'] = 0x27AB;
 t['a199'] = 0x27AC;
 t['a181'] = 0x27AD;
 t['a200'] = 0x27AE;
 t['a182'] = 0x27AF;
 t['a201'] = 0x27B1;
 t['a183'] = 0x27B2;
 t['a184'] = 0x27B3;
 t['a197'] = 0x27B4;
 t['a185'] = 0x27B5;
 t['a194'] = 0x27B6;
 t['a198'] = 0x27B7;
 t['a186'] = 0x27B8;
 t['a195'] = 0x27B9;
 t['a187'] = 0x27BA;
 t['a188'] = 0x27BB;
 t['a189'] = 0x27BC;
 t['a190'] = 0x27BD;
 t['a191'] = 0x27BE;
 t['a89'] = 0x2768;
 t['a90'] = 0x2769;
 t['a93'] = 0x276A;
 t['a94'] = 0x276B;
 t['a91'] = 0x276C;
 t['a92'] = 0x276D;
 t['a205'] = 0x276E;
 t['a85'] = 0x276F;
 t['a206'] = 0x2770;
 t['a86'] = 0x2771;
 t['a87'] = 0x2772;
 t['a88'] = 0x2773;
 t['a95'] = 0x2774;
 t['a96'] = 0x2775;
 t['.notdef'] = 0x0000;
});
exports.getGlyphsUnicode = getGlyphsUnicode;
exports.getDingbatsGlyphsUnicode = getDingbatsGlyphsUnicode;

/***/ }),
/* 178 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getSupplementalGlyphMapForCalibri = exports.getSupplementalGlyphMapForArialBlack = exports.getGlyphMapForStandardFonts = exports.getSymbolsFonts = exports.getSerifFonts = exports.getNonStdFontMap = exports.getStdFontMap = void 0;

var _util = __w_pdfjs_require__(6);

var getStdFontMap = (0, _util.getLookupTableFactory)(function (t) {
  t['ArialNarrow'] = 'Helvetica';
  t['ArialNarrow-Bold'] = 'Helvetica-Bold';
  t['ArialNarrow-BoldItalic'] = 'Helvetica-BoldOblique';
  t['ArialNarrow-Italic'] = 'Helvetica-Oblique';
  t['ArialBlack'] = 'Helvetica';
  t['ArialBlack-Bold'] = 'Helvetica-Bold';
  t['ArialBlack-BoldItalic'] = 'Helvetica-BoldOblique';
  t['ArialBlack-Italic'] = 'Helvetica-Oblique';
  t['Arial-Black'] = 'Helvetica';
  t['Arial-Black-Bold'] = 'Helvetica-Bold';
  t['Arial-Black-BoldItalic'] = 'Helvetica-BoldOblique';
  t['Arial-Black-Italic'] = 'Helvetica-Oblique';
  t['Arial'] = 'Helvetica';
  t['Arial-Bold'] = 'Helvetica-Bold';
  t['Arial-BoldItalic'] = 'Helvetica-BoldOblique';
  t['Arial-Italic'] = 'Helvetica-Oblique';
  t['Arial-BoldItalicMT'] = 'Helvetica-BoldOblique';
  t['Arial-BoldMT'] = 'Helvetica-Bold';
  t['Arial-ItalicMT'] = 'Helvetica-Oblique';
  t['ArialMT'] = 'Helvetica';
  t['Courier-Bold'] = 'Courier-Bold';
  t['Courier-BoldItalic'] = 'Courier-BoldOblique';
  t['Courier-Italic'] = 'Courier-Oblique';
  t['CourierNew'] = 'Courier';
  t['CourierNew-Bold'] = 'Courier-Bold';
  t['CourierNew-BoldItalic'] = 'Courier-BoldOblique';
  t['CourierNew-Italic'] = 'Courier-Oblique';
  t['CourierNewPS-BoldItalicMT'] = 'Courier-BoldOblique';
  t['CourierNewPS-BoldMT'] = 'Courier-Bold';
  t['CourierNewPS-ItalicMT'] = 'Courier-Oblique';
  t['CourierNewPSMT'] = 'Courier';
  t['Helvetica'] = 'Helvetica';
  t['Helvetica-Bold'] = 'Helvetica-Bold';
  t['Helvetica-BoldItalic'] = 'Helvetica-BoldOblique';
  t['Helvetica-BoldOblique'] = 'Helvetica-BoldOblique';
  t['Helvetica-Italic'] = 'Helvetica-Oblique';
  t['Helvetica-Oblique'] = 'Helvetica-Oblique';
  t['SegoeUISymbol'] = 'Helvetica';
  t['Symbol-Bold'] = 'Symbol';
  t['Symbol-BoldItalic'] = 'Symbol';
  t['Symbol-Italic'] = 'Symbol';
  t['TimesNewRoman'] = 'Times-Roman';
  t['TimesNewRoman-Bold'] = 'Times-Bold';
  t['TimesNewRoman-BoldItalic'] = 'Times-BoldItalic';
  t['TimesNewRoman-Italic'] = 'Times-Italic';
  t['TimesNewRomanPS'] = 'Times-Roman';
  t['TimesNewRomanPS-Bold'] = 'Times-Bold';
  t['TimesNewRomanPS-BoldItalic'] = 'Times-BoldItalic';
  t['TimesNewRomanPS-BoldItalicMT'] = 'Times-BoldItalic';
  t['TimesNewRomanPS-BoldMT'] = 'Times-Bold';
  t['TimesNewRomanPS-Italic'] = 'Times-Italic';
  t['TimesNewRomanPS-ItalicMT'] = 'Times-Italic';
  t['TimesNewRomanPSMT'] = 'Times-Roman';
  t['TimesNewRomanPSMT-Bold'] = 'Times-Bold';
  t['TimesNewRomanPSMT-BoldItalic'] = 'Times-BoldItalic';
  t['TimesNewRomanPSMT-Italic'] = 'Times-Italic';
});
exports.getStdFontMap = getStdFontMap;
var getNonStdFontMap = (0, _util.getLookupTableFactory)(function (t) {
  t['Calibri'] = 'Helvetica';
  t['Calibri-Bold'] = 'Helvetica-Bold';
  t['Calibri-BoldItalic'] = 'Helvetica-BoldOblique';
  t['Calibri-Italic'] = 'Helvetica-Oblique';
  t['CenturyGothic'] = 'Helvetica';
  t['CenturyGothic-Bold'] = 'Helvetica-Bold';
  t['CenturyGothic-BoldItalic'] = 'Helvetica-BoldOblique';
  t['CenturyGothic-Italic'] = 'Helvetica-Oblique';
  t['ComicSansMS'] = 'Comic Sans MS';
  t['ComicSansMS-Bold'] = 'Comic Sans MS-Bold';
  t['ComicSansMS-BoldItalic'] = 'Comic Sans MS-BoldItalic';
  t['ComicSansMS-Italic'] = 'Comic Sans MS-Italic';
  t['LucidaConsole'] = 'Courier';
  t['LucidaConsole-Bold'] = 'Courier-Bold';
  t['LucidaConsole-BoldItalic'] = 'Courier-BoldOblique';
  t['LucidaConsole-Italic'] = 'Courier-Oblique';
  t['LucidaSans-Demi'] = 'Helvetica-Bold';
  t['MS-Gothic'] = 'MS Gothic';
  t['MS-Gothic-Bold'] = 'MS Gothic-Bold';
  t['MS-Gothic-BoldItalic'] = 'MS Gothic-BoldItalic';
  t['MS-Gothic-Italic'] = 'MS Gothic-Italic';
  t['MS-Mincho'] = 'MS Mincho';
  t['MS-Mincho-Bold'] = 'MS Mincho-Bold';
  t['MS-Mincho-BoldItalic'] = 'MS Mincho-BoldItalic';
  t['MS-Mincho-Italic'] = 'MS Mincho-Italic';
  t['MS-PGothic'] = 'MS PGothic';
  t['MS-PGothic-Bold'] = 'MS PGothic-Bold';
  t['MS-PGothic-BoldItalic'] = 'MS PGothic-BoldItalic';
  t['MS-PGothic-Italic'] = 'MS PGothic-Italic';
  t['MS-PMincho'] = 'MS PMincho';
  t['MS-PMincho-Bold'] = 'MS PMincho-Bold';
  t['MS-PMincho-BoldItalic'] = 'MS PMincho-BoldItalic';
  t['MS-PMincho-Italic'] = 'MS PMincho-Italic';
  t['NuptialScript'] = 'Times-Italic';
  t['Wingdings'] = 'ZapfDingbats';
});
exports.getNonStdFontMap = getNonStdFontMap;
var getSerifFonts = (0, _util.getLookupTableFactory)(function (t) {
  t['Adobe Jenson'] = true;
  t['Adobe Text'] = true;
  t['Albertus'] = true;
  t['Aldus'] = true;
  t['Alexandria'] = true;
  t['Algerian'] = true;
  t['American Typewriter'] = true;
  t['Antiqua'] = true;
  t['Apex'] = true;
  t['Arno'] = true;
  t['Aster'] = true;
  t['Aurora'] = true;
  t['Baskerville'] = true;
  t['Bell'] = true;
  t['Bembo'] = true;
  t['Bembo Schoolbook'] = true;
  t['Benguiat'] = true;
  t['Berkeley Old Style'] = true;
  t['Bernhard Modern'] = true;
  t['Berthold City'] = true;
  t['Bodoni'] = true;
  t['Bauer Bodoni'] = true;
  t['Book Antiqua'] = true;
  t['Bookman'] = true;
  t['Bordeaux Roman'] = true;
  t['Californian FB'] = true;
  t['Calisto'] = true;
  t['Calvert'] = true;
  t['Capitals'] = true;
  t['Cambria'] = true;
  t['Cartier'] = true;
  t['Caslon'] = true;
  t['Catull'] = true;
  t['Centaur'] = true;
  t['Century Old Style'] = true;
  t['Century Schoolbook'] = true;
  t['Chaparral'] = true;
  t['Charis SIL'] = true;
  t['Cheltenham'] = true;
  t['Cholla Slab'] = true;
  t['Clarendon'] = true;
  t['Clearface'] = true;
  t['Cochin'] = true;
  t['Colonna'] = true;
  t['Computer Modern'] = true;
  t['Concrete Roman'] = true;
  t['Constantia'] = true;
  t['Cooper Black'] = true;
  t['Corona'] = true;
  t['Ecotype'] = true;
  t['Egyptienne'] = true;
  t['Elephant'] = true;
  t['Excelsior'] = true;
  t['Fairfield'] = true;
  t['FF Scala'] = true;
  t['Folkard'] = true;
  t['Footlight'] = true;
  t['FreeSerif'] = true;
  t['Friz Quadrata'] = true;
  t['Garamond'] = true;
  t['Gentium'] = true;
  t['Georgia'] = true;
  t['Gloucester'] = true;
  t['Goudy Old Style'] = true;
  t['Goudy Schoolbook'] = true;
  t['Goudy Pro Font'] = true;
  t['Granjon'] = true;
  t['Guardian Egyptian'] = true;
  t['Heather'] = true;
  t['Hercules'] = true;
  t['High Tower Text'] = true;
  t['Hiroshige'] = true;
  t['Hoefler Text'] = true;
  t['Humana Serif'] = true;
  t['Imprint'] = true;
  t['Ionic No. 5'] = true;
  t['Janson'] = true;
  t['Joanna'] = true;
  t['Korinna'] = true;
  t['Lexicon'] = true;
  t['Liberation Serif'] = true;
  t['Linux Libertine'] = true;
  t['Literaturnaya'] = true;
  t['Lucida'] = true;
  t['Lucida Bright'] = true;
  t['Melior'] = true;
  t['Memphis'] = true;
  t['Miller'] = true;
  t['Minion'] = true;
  t['Modern'] = true;
  t['Mona Lisa'] = true;
  t['Mrs Eaves'] = true;
  t['MS Serif'] = true;
  t['Museo Slab'] = true;
  t['New York'] = true;
  t['Nimbus Roman'] = true;
  t['NPS Rawlinson Roadway'] = true;
  t['NuptialScript'] = true;
  t['Palatino'] = true;
  t['Perpetua'] = true;
  t['Plantin'] = true;
  t['Plantin Schoolbook'] = true;
  t['Playbill'] = true;
  t['Poor Richard'] = true;
  t['Rawlinson Roadway'] = true;
  t['Renault'] = true;
  t['Requiem'] = true;
  t['Rockwell'] = true;
  t['Roman'] = true;
  t['Rotis Serif'] = true;
  t['Sabon'] = true;
  t['Scala'] = true;
  t['Seagull'] = true;
  t['Sistina'] = true;
  t['Souvenir'] = true;
  t['STIX'] = true;
  t['Stone Informal'] = true;
  t['Stone Serif'] = true;
  t['Sylfaen'] = true;
  t['Times'] = true;
  t['Trajan'] = true;
  t['TrinitÃ©'] = true;
  t['Trump Mediaeval'] = true;
  t['Utopia'] = true;
  t['Vale Type'] = true;
  t['Bitstream Vera'] = true;
  t['Vera Serif'] = true;
  t['Versailles'] = true;
  t['Wanted'] = true;
  t['Weiss'] = true;
  t['Wide Latin'] = true;
  t['Windsor'] = true;
  t['XITS'] = true;
});
exports.getSerifFonts = getSerifFonts;
var getSymbolsFonts = (0, _util.getLookupTableFactory)(function (t) {
  t['Dingbats'] = true;
  t['Symbol'] = true;
  t['ZapfDingbats'] = true;
});
exports.getSymbolsFonts = getSymbolsFonts;
var getGlyphMapForStandardFonts = (0, _util.getLookupTableFactory)(function (t) {
  t[2] = 10;
  t[3] = 32;
  t[4] = 33;
  t[5] = 34;
  t[6] = 35;
  t[7] = 36;
  t[8] = 37;
  t[9] = 38;
  t[10] = 39;
  t[11] = 40;
  t[12] = 41;
  t[13] = 42;
  t[14] = 43;
  t[15] = 44;
  t[16] = 45;
  t[17] = 46;
  t[18] = 47;
  t[19] = 48;
  t[20] = 49;
  t[21] = 50;
  t[22] = 51;
  t[23] = 52;
  t[24] = 53;
  t[25] = 54;
  t[26] = 55;
  t[27] = 56;
  t[28] = 57;
  t[29] = 58;
  t[30] = 894;
  t[31] = 60;
  t[32] = 61;
  t[33] = 62;
  t[34] = 63;
  t[35] = 64;
  t[36] = 65;
  t[37] = 66;
  t[38] = 67;
  t[39] = 68;
  t[40] = 69;
  t[41] = 70;
  t[42] = 71;
  t[43] = 72;
  t[44] = 73;
  t[45] = 74;
  t[46] = 75;
  t[47] = 76;
  t[48] = 77;
  t[49] = 78;
  t[50] = 79;
  t[51] = 80;
  t[52] = 81;
  t[53] = 82;
  t[54] = 83;
  t[55] = 84;
  t[56] = 85;
  t[57] = 86;
  t[58] = 87;
  t[59] = 88;
  t[60] = 89;
  t[61] = 90;
  t[62] = 91;
  t[63] = 92;
  t[64] = 93;
  t[65] = 94;
  t[66] = 95;
  t[67] = 96;
  t[68] = 97;
  t[69] = 98;
  t[70] = 99;
  t[71] = 100;
  t[72] = 101;
  t[73] = 102;
  t[74] = 103;
  t[75] = 104;
  t[76] = 105;
  t[77] = 106;
  t[78] = 107;
  t[79] = 108;
  t[80] = 109;
  t[81] = 110;
  t[82] = 111;
  t[83] = 112;
  t[84] = 113;
  t[85] = 114;
  t[86] = 115;
  t[87] = 116;
  t[88] = 117;
  t[89] = 118;
  t[90] = 119;
  t[91] = 120;
  t[92] = 121;
  t[93] = 122;
  t[94] = 123;
  t[95] = 124;
  t[96] = 125;
  t[97] = 126;
  t[98] = 196;
  t[99] = 197;
  t[100] = 199;
  t[101] = 201;
  t[102] = 209;
  t[103] = 214;
  t[104] = 220;
  t[105] = 225;
  t[106] = 224;
  t[107] = 226;
  t[108] = 228;
  t[109] = 227;
  t[110] = 229;
  t[111] = 231;
  t[112] = 233;
  t[113] = 232;
  t[114] = 234;
  t[115] = 235;
  t[116] = 237;
  t[117] = 236;
  t[118] = 238;
  t[119] = 239;
  t[120] = 241;
  t[121] = 243;
  t[122] = 242;
  t[123] = 244;
  t[124] = 246;
  t[125] = 245;
  t[126] = 250;
  t[127] = 249;
  t[128] = 251;
  t[129] = 252;
  t[130] = 8224;
  t[131] = 176;
  t[132] = 162;
  t[133] = 163;
  t[134] = 167;
  t[135] = 8226;
  t[136] = 182;
  t[137] = 223;
  t[138] = 174;
  t[139] = 169;
  t[140] = 8482;
  t[141] = 180;
  t[142] = 168;
  t[143] = 8800;
  t[144] = 198;
  t[145] = 216;
  t[146] = 8734;
  t[147] = 177;
  t[148] = 8804;
  t[149] = 8805;
  t[150] = 165;
  t[151] = 181;
  t[152] = 8706;
  t[153] = 8721;
  t[154] = 8719;
  t[156] = 8747;
  t[157] = 170;
  t[158] = 186;
  t[159] = 8486;
  t[160] = 230;
  t[161] = 248;
  t[162] = 191;
  t[163] = 161;
  t[164] = 172;
  t[165] = 8730;
  t[166] = 402;
  t[167] = 8776;
  t[168] = 8710;
  t[169] = 171;
  t[170] = 187;
  t[171] = 8230;
  t[210] = 218;
  t[223] = 711;
  t[224] = 321;
  t[225] = 322;
  t[227] = 353;
  t[229] = 382;
  t[234] = 253;
  t[252] = 263;
  t[253] = 268;
  t[254] = 269;
  t[258] = 258;
  t[260] = 260;
  t[261] = 261;
  t[265] = 280;
  t[266] = 281;
  t[268] = 283;
  t[269] = 313;
  t[275] = 323;
  t[276] = 324;
  t[278] = 328;
  t[284] = 345;
  t[285] = 346;
  t[286] = 347;
  t[292] = 367;
  t[295] = 377;
  t[296] = 378;
  t[298] = 380;
  t[305] = 963;
  t[306] = 964;
  t[307] = 966;
  t[308] = 8215;
  t[309] = 8252;
  t[310] = 8319;
  t[311] = 8359;
  t[312] = 8592;
  t[313] = 8593;
  t[337] = 9552;
  t[493] = 1039;
  t[494] = 1040;
  t[705] = 1524;
  t[706] = 8362;
  t[710] = 64288;
  t[711] = 64298;
  t[759] = 1617;
  t[761] = 1776;
  t[763] = 1778;
  t[775] = 1652;
  t[777] = 1764;
  t[778] = 1780;
  t[779] = 1781;
  t[780] = 1782;
  t[782] = 771;
  t[783] = 64726;
  t[786] = 8363;
  t[788] = 8532;
  t[790] = 768;
  t[791] = 769;
  t[792] = 768;
  t[795] = 803;
  t[797] = 64336;
  t[798] = 64337;
  t[799] = 64342;
  t[800] = 64343;
  t[801] = 64344;
  t[802] = 64345;
  t[803] = 64362;
  t[804] = 64363;
  t[805] = 64364;
  t[2424] = 7821;
  t[2425] = 7822;
  t[2426] = 7823;
  t[2427] = 7824;
  t[2428] = 7825;
  t[2429] = 7826;
  t[2430] = 7827;
  t[2433] = 7682;
  t[2678] = 8045;
  t[2679] = 8046;
  t[2830] = 1552;
  t[2838] = 686;
  t[2840] = 751;
  t[2842] = 753;
  t[2843] = 754;
  t[2844] = 755;
  t[2846] = 757;
  t[2856] = 767;
  t[2857] = 848;
  t[2858] = 849;
  t[2862] = 853;
  t[2863] = 854;
  t[2864] = 855;
  t[2865] = 861;
  t[2866] = 862;
  t[2906] = 7460;
  t[2908] = 7462;
  t[2909] = 7463;
  t[2910] = 7464;
  t[2912] = 7466;
  t[2913] = 7467;
  t[2914] = 7468;
  t[2916] = 7470;
  t[2917] = 7471;
  t[2918] = 7472;
  t[2920] = 7474;
  t[2921] = 7475;
  t[2922] = 7476;
  t[2924] = 7478;
  t[2925] = 7479;
  t[2926] = 7480;
  t[2928] = 7482;
  t[2929] = 7483;
  t[2930] = 7484;
  t[2932] = 7486;
  t[2933] = 7487;
  t[2934] = 7488;
  t[2936] = 7490;
  t[2937] = 7491;
  t[2938] = 7492;
  t[2940] = 7494;
  t[2941] = 7495;
  t[2942] = 7496;
  t[2944] = 7498;
  t[2946] = 7500;
  t[2948] = 7502;
  t[2950] = 7504;
  t[2951] = 7505;
  t[2952] = 7506;
  t[2954] = 7508;
  t[2955] = 7509;
  t[2956] = 7510;
  t[2958] = 7512;
  t[2959] = 7513;
  t[2960] = 7514;
  t[2962] = 7516;
  t[2963] = 7517;
  t[2964] = 7518;
  t[2966] = 7520;
  t[2967] = 7521;
  t[2968] = 7522;
  t[2970] = 7524;
  t[2971] = 7525;
  t[2972] = 7526;
  t[2974] = 7528;
  t[2975] = 7529;
  t[2976] = 7530;
  t[2978] = 1537;
  t[2979] = 1538;
  t[2980] = 1539;
  t[2982] = 1549;
  t[2983] = 1551;
  t[2984] = 1552;
  t[2986] = 1554;
  t[2987] = 1555;
  t[2988] = 1556;
  t[2990] = 1623;
  t[2991] = 1624;
  t[2995] = 1775;
  t[2999] = 1791;
  t[3002] = 64290;
  t[3003] = 64291;
  t[3004] = 64292;
  t[3006] = 64294;
  t[3007] = 64295;
  t[3008] = 64296;
  t[3011] = 1900;
  t[3014] = 8223;
  t[3015] = 8244;
  t[3017] = 7532;
  t[3018] = 7533;
  t[3019] = 7534;
  t[3075] = 7590;
  t[3076] = 7591;
  t[3079] = 7594;
  t[3080] = 7595;
  t[3083] = 7598;
  t[3084] = 7599;
  t[3087] = 7602;
  t[3088] = 7603;
  t[3091] = 7606;
  t[3092] = 7607;
  t[3095] = 7610;
  t[3096] = 7611;
  t[3099] = 7614;
  t[3100] = 7615;
  t[3103] = 7618;
  t[3104] = 7619;
  t[3107] = 8337;
  t[3108] = 8338;
  t[3116] = 1884;
  t[3119] = 1885;
  t[3120] = 1885;
  t[3123] = 1886;
  t[3124] = 1886;
  t[3127] = 1887;
  t[3128] = 1887;
  t[3131] = 1888;
  t[3132] = 1888;
  t[3135] = 1889;
  t[3136] = 1889;
  t[3139] = 1890;
  t[3140] = 1890;
  t[3143] = 1891;
  t[3144] = 1891;
  t[3147] = 1892;
  t[3148] = 1892;
  t[3153] = 580;
  t[3154] = 581;
  t[3157] = 584;
  t[3158] = 585;
  t[3161] = 588;
  t[3162] = 589;
  t[3165] = 891;
  t[3166] = 892;
  t[3169] = 1274;
  t[3170] = 1275;
  t[3173] = 1278;
  t[3174] = 1279;
  t[3181] = 7622;
  t[3182] = 7623;
  t[3282] = 11799;
  t[3316] = 578;
  t[3379] = 42785;
  t[3393] = 1159;
  t[3416] = 8377;
});
exports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts;
var getSupplementalGlyphMapForArialBlack = (0, _util.getLookupTableFactory)(function (t) {
  t[227] = 322;
  t[264] = 261;
  t[291] = 346;
});
exports.getSupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack;
var getSupplementalGlyphMapForCalibri = (0, _util.getLookupTableFactory)(function (t) {
  t[1] = 32;
  t[4] = 65;
  t[17] = 66;
  t[18] = 67;
  t[24] = 68;
  t[28] = 69;
  t[38] = 70;
  t[39] = 71;
  t[44] = 72;
  t[47] = 73;
  t[58] = 74;
  t[60] = 75;
  t[62] = 76;
  t[68] = 77;
  t[69] = 78;
  t[75] = 79;
  t[87] = 80;
  t[89] = 81;
  t[90] = 82;
  t[94] = 83;
  t[100] = 84;
  t[104] = 85;
  t[115] = 86;
  t[116] = 87;
  t[121] = 88;
  t[122] = 89;
  t[127] = 90;
  t[258] = 97;
  t[268] = 261;
  t[271] = 98;
  t[272] = 99;
  t[273] = 263;
  t[282] = 100;
  t[286] = 101;
  t[295] = 281;
  t[296] = 102;
  t[336] = 103;
  t[346] = 104;
  t[349] = 105;
  t[361] = 106;
  t[364] = 107;
  t[367] = 108;
  t[371] = 322;
  t[373] = 109;
  t[374] = 110;
  t[381] = 111;
  t[383] = 243;
  t[393] = 112;
  t[395] = 113;
  t[396] = 114;
  t[400] = 115;
  t[401] = 347;
  t[410] = 116;
  t[437] = 117;
  t[448] = 118;
  t[449] = 119;
  t[454] = 120;
  t[455] = 121;
  t[460] = 122;
  t[463] = 380;
  t[853] = 44;
  t[855] = 58;
  t[856] = 46;
  t[876] = 47;
  t[878] = 45;
  t[882] = 45;
  t[894] = 40;
  t[895] = 41;
  t[896] = 91;
  t[897] = 93;
  t[923] = 64;
  t[1004] = 48;
  t[1005] = 49;
  t[1006] = 50;
  t[1007] = 51;
  t[1008] = 52;
  t[1009] = 53;
  t[1010] = 54;
  t[1011] = 55;
  t[1012] = 56;
  t[1013] = 57;
  t[1081] = 37;
  t[1085] = 43;
  t[1086] = 45;
});
exports.getSupplementalGlyphMapForCalibri = getSupplementalGlyphMapForCalibri;

/***/ }),
/* 179 */
/***/ (function(module, exports, __w_pdfjs_require__) {

var getLookupTableFactory = __w_pdfjs_require__(6).getLookupTableFactory;
var getSpecialPUASymbols = getLookupTableFactory(function (t) {
 t[63721] = 0x00A9;
 t[63193] = 0x00A9;
 t[63720] = 0x00AE;
 t[63194] = 0x00AE;
 t[63722] = 0x2122;
 t[63195] = 0x2122;
 t[63729] = 0x23A7;
 t[63730] = 0x23A8;
 t[63731] = 0x23A9;
 t[63740] = 0x23AB;
 t[63741] = 0x23AC;
 t[63742] = 0x23AD;
 t[63726] = 0x23A1;
 t[63727] = 0x23A2;
 t[63728] = 0x23A3;
 t[63737] = 0x23A4;
 t[63738] = 0x23A5;
 t[63739] = 0x23A6;
 t[63723] = 0x239B;
 t[63724] = 0x239C;
 t[63725] = 0x239D;
 t[63734] = 0x239E;
 t[63735] = 0x239F;
 t[63736] = 0x23A0;
});
function mapSpecialUnicodeValues(code) {
 if (code >= 0xFFF0 && code <= 0xFFFF) {
  return 0;
 } else if (code >= 0xF600 && code <= 0xF8FF) {
  return getSpecialPUASymbols()[code] || code;
 } else if (code === 0x00AD) {
  return 0x002D;
 }
 return code;
}
function getUnicodeForGlyph(name, glyphsUnicodeMap) {
 var unicode = glyphsUnicodeMap[name];
 if (unicode !== undefined) {
  return unicode;
 }
 if (!name) {
  return -1;
 }
 if (name[0] === 'u') {
  var nameLen = name.length, hexStr;
  if (nameLen === 7 && name[1] === 'n' && name[2] === 'i') {
   hexStr = name.substring(3);
  } else if (nameLen >= 5 && nameLen <= 7) {
   hexStr = name.substring(1);
  } else {
   return -1;
  }
  if (hexStr === hexStr.toUpperCase()) {
   unicode = parseInt(hexStr, 16);
   if (unicode >= 0) {
    return unicode;
   }
  }
 }
 return -1;
}
var UnicodeRanges = [
 {
  'begin': 0x0000,
  'end': 0x007F
 },
 {
  'begin': 0x0080,
  'end': 0x00FF
 },
 {
  'begin': 0x0100,
  'end': 0x017F
 },
 {
  'begin': 0x0180,
  'end': 0x024F
 },
 {
  'begin': 0x0250,
  'end': 0x02AF
 },
 {
  'begin': 0x02B0,
  'end': 0x02FF
 },
 {
  'begin': 0x0300,
  'end': 0x036F
 },
 {
  'begin': 0x0370,
  'end': 0x03FF
 },
 {
  'begin': 0x2C80,
  'end': 0x2CFF
 },
 {
  'begin': 0x0400,
  'end': 0x04FF
 },
 {
  'begin': 0x0530,
  'end': 0x058F
 },
 {
  'begin': 0x0590,
  'end': 0x05FF
 },
 {
  'begin': 0xA500,
  'end': 0xA63F
 },
 {
  'begin': 0x0600,
  'end': 0x06FF
 },
 {
  'begin': 0x07C0,
  'end': 0x07FF
 },
 {
  'begin': 0x0900,
  'end': 0x097F
 },
 {
  'begin': 0x0980,
  'end': 0x09FF
 },
 {
  'begin': 0x0A00,
  'end': 0x0A7F
 },
 {
  'begin': 0x0A80,
  'end': 0x0AFF
 },
 {
  'begin': 0x0B00,
  'end': 0x0B7F
 },
 {
  'begin': 0x0B80,
  'end': 0x0BFF
 },
 {
  'begin': 0x0C00,
  'end': 0x0C7F
 },
 {
  'begin': 0x0C80,
  'end': 0x0CFF
 },
 {
  'begin': 0x0D00,
  'end': 0x0D7F
 },
 {
  'begin': 0x0E00,
  'end': 0x0E7F
 },
 {
  'begin': 0x0E80,
  'end': 0x0EFF
 },
 {
  'begin': 0x10A0,
  'end': 0x10FF
 },
 {
  'begin': 0x1B00,
  'end': 0x1B7F
 },
 {
  'begin': 0x1100,
  'end': 0x11FF
 },
 {
  'begin': 0x1E00,
  'end': 0x1EFF
 },
 {
  'begin': 0x1F00,
  'end': 0x1FFF
 },
 {
  'begin': 0x2000,
  'end': 0x206F
 },
 {
  'begin': 0x2070,
  'end': 0x209F
 },
 {
  'begin': 0x20A0,
  'end': 0x20CF
 },
 {
  'begin': 0x20D0,
  'end': 0x20FF
 },
 {
  'begin': 0x2100,
  'end': 0x214F
 },
 {
  'begin': 0x2150,
  'end': 0x218F
 },
 {
  'begin': 0x2190,
  'end': 0x21FF
 },
 {
  'begin': 0x2200,
  'end': 0x22FF
 },
 {
  'begin': 0x2300,
  'end': 0x23FF
 },
 {
  'begin': 0x2400,
  'end': 0x243F
 },
 {
  'begin': 0x2440,
  'end': 0x245F
 },
 {
  'begin': 0x2460,
  'end': 0x24FF
 },
 {
  'begin': 0x2500,
  'end': 0x257F
 },
 {
  'begin': 0x2580,
  'end': 0x259F
 },
 {
  'begin': 0x25A0,
  'end': 0x25FF
 },
 {
  'begin': 0x2600,
  'end': 0x26FF
 },
 {
  'begin': 0x2700,
  'end': 0x27BF
 },
 {
  'begin': 0x3000,
  'end': 0x303F
 },
 {
  'begin': 0x3040,
  'end': 0x309F
 },
 {
  'begin': 0x30A0,
  'end': 0x30FF
 },
 {
  'begin': 0x3100,
  'end': 0x312F
 },
 {
  'begin': 0x3130,
  'end': 0x318F
 },
 {
  'begin': 0xA840,
  'end': 0xA87F
 },
 {
  'begin': 0x3200,
  'end': 0x32FF
 },
 {
  'begin': 0x3300,
  'end': 0x33FF
 },
 {
  'begin': 0xAC00,
  'end': 0xD7AF
 },
 {
  'begin': 0xD800,
  'end': 0xDFFF
 },
 {
  'begin': 0x10900,
  'end': 0x1091F
 },
 {
  'begin': 0x4E00,
  'end': 0x9FFF
 },
 {
  'begin': 0xE000,
  'end': 0xF8FF
 },
 {
  'begin': 0x31C0,
  'end': 0x31EF
 },
 {
  'begin': 0xFB00,
  'end': 0xFB4F
 },
 {
  'begin': 0xFB50,
  'end': 0xFDFF
 },
 {
  'begin': 0xFE20,
  'end': 0xFE2F
 },
 {
  'begin': 0xFE10,
  'end': 0xFE1F
 },
 {
  'begin': 0xFE50,
  'end': 0xFE6F
 },
 {
  'begin': 0xFE70,
  'end': 0xFEFF
 },
 {
  'begin': 0xFF00,
  'end': 0xFFEF
 },
 {
  'begin': 0xFFF0,
  'end': 0xFFFF
 },
 {
  'begin': 0x0F00,
  'end': 0x0FFF
 },
 {
  'begin': 0x0700,
  'end': 0x074F
 },
 {
  'begin': 0x0780,
  'end': 0x07BF
 },
 {
  'begin': 0x0D80,
  'end': 0x0DFF
 },
 {
  'begin': 0x1000,
  'end': 0x109F
 },
 {
  'begin': 0x1200,
  'end': 0x137F
 },
 {
  'begin': 0x13A0,
  'end': 0x13FF
 },
 {
  'begin': 0x1400,
  'end': 0x167F
 },
 {
  'begin': 0x1680,
  'end': 0x169F
 },
 {
  'begin': 0x16A0,
  'end': 0x16FF
 },
 {
  'begin': 0x1780,
  'end': 0x17FF
 },
 {
  'begin': 0x1800,
  'end': 0x18AF
 },
 {
  'begin': 0x2800,
  'end': 0x28FF
 },
 {
  'begin': 0xA000,
  'end': 0xA48F
 },
 {
  'begin': 0x1700,
  'end': 0x171F
 },
 {
  'begin': 0x10300,
  'end': 0x1032F
 },
 {
  'begin': 0x10330,
  'end': 0x1034F
 },
 {
  'begin': 0x10400,
  'end': 0x1044F
 },
 {
  'begin': 0x1D000,
  'end': 0x1D0FF
 },
 {
  'begin': 0x1D400,
  'end': 0x1D7FF
 },
 {
  'begin': 0xFF000,
  'end': 0xFFFFD
 },
 {
  'begin': 0xFE00,
  'end': 0xFE0F
 },
 {
  'begin': 0xE0000,
  'end': 0xE007F
 },
 {
  'begin': 0x1900,
  'end': 0x194F
 },
 {
  'begin': 0x1950,
  'end': 0x197F
 },
 {
  'begin': 0x1980,
  'end': 0x19DF
 },
 {
  'begin': 0x1A00,
  'end': 0x1A1F
 },
 {
  'begin': 0x2C00,
  'end': 0x2C5F
 },
 {
  'begin': 0x2D30,
  'end': 0x2D7F
 },
 {
  'begin': 0x4DC0,
  'end': 0x4DFF
 },
 {
  'begin': 0xA800,
  'end': 0xA82F
 },
 {
  'begin': 0x10000,
  'end': 0x1007F
 },
 {
  'begin': 0x10140,
  'end': 0x1018F
 },
 {
  'begin': 0x10380,
  'end': 0x1039F
 },
 {
  'begin': 0x103A0,
  'end': 0x103DF
 },
 {
  'begin': 0x10450,
  'end': 0x1047F
 },
 {
  'begin': 0x10480,
  'end': 0x104AF
 },
 {
  'begin': 0x10800,
  'end': 0x1083F
 },
 {
  'begin': 0x10A00,
  'end': 0x10A5F
 },
 {
  'begin': 0x1D300,
  'end': 0x1D35F
 },
 {
  'begin': 0x12000,
  'end': 0x123FF
 },
 {
  'begin': 0x1D360,
  'end': 0x1D37F
 },
 {
  'begin': 0x1B80,
  'end': 0x1BBF
 },
 {
  'begin': 0x1C00,
  'end': 0x1C4F
 },
 {
  'begin': 0x1C50,
  'end': 0x1C7F
 },
 {
  'begin': 0xA880,
  'end': 0xA8DF
 },
 {
  'begin': 0xA900,
  'end': 0xA92F
 },
 {
  'begin': 0xA930,
  'end': 0xA95F
 },
 {
  'begin': 0xAA00,
  'end': 0xAA5F
 },
 {
  'begin': 0x10190,
  'end': 0x101CF
 },
 {
  'begin': 0x101D0,
  'end': 0x101FF
 },
 {
  'begin': 0x102A0,
  'end': 0x102DF
 },
 {
  'begin': 0x1F030,
  'end': 0x1F09F
 }
];
function getUnicodeRangeFor(value) {
 for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
  var range = UnicodeRanges[i];
  if (value >= range.begin && value < range.end) {
   return i;
  }
 }
 return -1;
}
function isRTLRangeFor(value) {
 var range = UnicodeRanges[13];
 if (value >= range.begin && value < range.end) {
  return true;
 }
 range = UnicodeRanges[11];
 if (value >= range.begin && value < range.end) {
  return true;
 }
 return false;
}
var getNormalizedUnicodes = getLookupTableFactory(function (t) {
 t['\u00A8'] = '\u0020\u0308';
 t['\u00AF'] = '\u0020\u0304';
 t['\u00B4'] = '\u0020\u0301';
 t['\u00B5'] = '\u03BC';
 t['\u00B8'] = '\u0020\u0327';
 t['\u0132'] = '\u0049\u004A';
 t['\u0133'] = '\u0069\u006A';
 t['\u013F'] = '\u004C\u00B7';
 t['\u0140'] = '\u006C\u00B7';
 t['\u0149'] = '\u02BC\u006E';
 t['\u017F'] = '\u0073';
 t['\u01C4'] = '\u0044\u017D';
 t['\u01C5'] = '\u0044\u017E';
 t['\u01C6'] = '\u0064\u017E';
 t['\u01C7'] = '\u004C\u004A';
 t['\u01C8'] = '\u004C\u006A';
 t['\u01C9'] = '\u006C\u006A';
 t['\u01CA'] = '\u004E\u004A';
 t['\u01CB'] = '\u004E\u006A';
 t['\u01CC'] = '\u006E\u006A';
 t['\u01F1'] = '\u0044\u005A';
 t['\u01F2'] = '\u0044\u007A';
 t['\u01F3'] = '\u0064\u007A';
 t['\u02D8'] = '\u0020\u0306';
 t['\u02D9'] = '\u0020\u0307';
 t['\u02DA'] = '\u0020\u030A';
 t['\u02DB'] = '\u0020\u0328';
 t['\u02DC'] = '\u0020\u0303';
 t['\u02DD'] = '\u0020\u030B';
 t['\u037A'] = '\u0020\u0345';
 t['\u0384'] = '\u0020\u0301';
 t['\u03D0'] = '\u03B2';
 t['\u03D1'] = '\u03B8';
 t['\u03D2'] = '\u03A5';
 t['\u03D5'] = '\u03C6';
 t['\u03D6'] = '\u03C0';
 t['\u03F0'] = '\u03BA';
 t['\u03F1'] = '\u03C1';
 t['\u03F2'] = '\u03C2';
 t['\u03F4'] = '\u0398';
 t['\u03F5'] = '\u03B5';
 t['\u03F9'] = '\u03A3';
 t['\u0587'] = '\u0565\u0582';
 t['\u0675'] = '\u0627\u0674';
 t['\u0676'] = '\u0648\u0674';
 t['\u0677'] = '\u06C7\u0674';
 t['\u0678'] = '\u064A\u0674';
 t['\u0E33'] = '\u0E4D\u0E32';
 t['\u0EB3'] = '\u0ECD\u0EB2';
 t['\u0EDC'] = '\u0EAB\u0E99';
 t['\u0EDD'] = '\u0EAB\u0EA1';
 t['\u0F77'] = '\u0FB2\u0F81';
 t['\u0F79'] = '\u0FB3\u0F81';
 t['\u1E9A'] = '\u0061\u02BE';
 t['\u1FBD'] = '\u0020\u0313';
 t['\u1FBF'] = '\u0020\u0313';
 t['\u1FC0'] = '\u0020\u0342';
 t['\u1FFE'] = '\u0020\u0314';
 t['\u2002'] = '\u0020';
 t['\u2003'] = '\u0020';
 t['\u2004'] = '\u0020';
 t['\u2005'] = '\u0020';
 t['\u2006'] = '\u0020';
 t['\u2008'] = '\u0020';
 t['\u2009'] = '\u0020';
 t['\u200A'] = '\u0020';
 t['\u2017'] = '\u0020\u0333';
 t['\u2024'] = '\u002E';
 t['\u2025'] = '\u002E\u002E';
 t['\u2026'] = '\u002E\u002E\u002E';
 t['\u2033'] = '\u2032\u2032';
 t['\u2034'] = '\u2032\u2032\u2032';
 t['\u2036'] = '\u2035\u2035';
 t['\u2037'] = '\u2035\u2035\u2035';
 t['\u203C'] = '\u0021\u0021';
 t['\u203E'] = '\u0020\u0305';
 t['\u2047'] = '\u003F\u003F';
 t['\u2048'] = '\u003F\u0021';
 t['\u2049'] = '\u0021\u003F';
 t['\u2057'] = '\u2032\u2032\u2032\u2032';
 t['\u205F'] = '\u0020';
 t['\u20A8'] = '\u0052\u0073';
 t['\u2100'] = '\u0061\u002F\u0063';
 t['\u2101'] = '\u0061\u002F\u0073';
 t['\u2103'] = '\u00B0\u0043';
 t['\u2105'] = '\u0063\u002F\u006F';
 t['\u2106'] = '\u0063\u002F\u0075';
 t['\u2107'] = '\u0190';
 t['\u2109'] = '\u00B0\u0046';
 t['\u2116'] = '\u004E\u006F';
 t['\u2121'] = '\u0054\u0045\u004C';
 t['\u2135'] = '\u05D0';
 t['\u2136'] = '\u05D1';
 t['\u2137'] = '\u05D2';
 t['\u2138'] = '\u05D3';
 t['\u213B'] = '\u0046\u0041\u0058';
 t['\u2160'] = '\u0049';
 t['\u2161'] = '\u0049\u0049';
 t['\u2162'] = '\u0049\u0049\u0049';
 t['\u2163'] = '\u0049\u0056';
 t['\u2164'] = '\u0056';
 t['\u2165'] = '\u0056\u0049';
 t['\u2166'] = '\u0056\u0049\u0049';
 t['\u2167'] = '\u0056\u0049\u0049\u0049';
 t['\u2168'] = '\u0049\u0058';
 t['\u2169'] = '\u0058';
 t['\u216A'] = '\u0058\u0049';
 t['\u216B'] = '\u0058\u0049\u0049';
 t['\u216C'] = '\u004C';
 t['\u216D'] = '\u0043';
 t['\u216E'] = '\u0044';
 t['\u216F'] = '\u004D';
 t['\u2170'] = '\u0069';
 t['\u2171'] = '\u0069\u0069';
 t['\u2172'] = '\u0069\u0069\u0069';
 t['\u2173'] = '\u0069\u0076';
 t['\u2174'] = '\u0076';
 t['\u2175'] = '\u0076\u0069';
 t['\u2176'] = '\u0076\u0069\u0069';
 t['\u2177'] = '\u0076\u0069\u0069\u0069';
 t['\u2178'] = '\u0069\u0078';
 t['\u2179'] = '\u0078';
 t['\u217A'] = '\u0078\u0069';
 t['\u217B'] = '\u0078\u0069\u0069';
 t['\u217C'] = '\u006C';
 t['\u217D'] = '\u0063';
 t['\u217E'] = '\u0064';
 t['\u217F'] = '\u006D';
 t['\u222C'] = '\u222B\u222B';
 t['\u222D'] = '\u222B\u222B\u222B';
 t['\u222F'] = '\u222E\u222E';
 t['\u2230'] = '\u222E\u222E\u222E';
 t['\u2474'] = '\u0028\u0031\u0029';
 t['\u2475'] = '\u0028\u0032\u0029';
 t['\u2476'] = '\u0028\u0033\u0029';
 t['\u2477'] = '\u0028\u0034\u0029';
 t['\u2478'] = '\u0028\u0035\u0029';
 t['\u2479'] = '\u0028\u0036\u0029';
 t['\u247A'] = '\u0028\u0037\u0029';
 t['\u247B'] = '\u0028\u0038\u0029';
 t['\u247C'] = '\u0028\u0039\u0029';
 t['\u247D'] = '\u0028\u0031\u0030\u0029';
 t['\u247E'] = '\u0028\u0031\u0031\u0029';
 t['\u247F'] = '\u0028\u0031\u0032\u0029';
 t['\u2480'] = '\u0028\u0031\u0033\u0029';
 t['\u2481'] = '\u0028\u0031\u0034\u0029';
 t['\u2482'] = '\u0028\u0031\u0035\u0029';
 t['\u2483'] = '\u0028\u0031\u0036\u0029';
 t['\u2484'] = '\u0028\u0031\u0037\u0029';
 t['\u2485'] = '\u0028\u0031\u0038\u0029';
 t['\u2486'] = '\u0028\u0031\u0039\u0029';
 t['\u2487'] = '\u0028\u0032\u0030\u0029';
 t['\u2488'] = '\u0031\u002E';
 t['\u2489'] = '\u0032\u002E';
 t['\u248A'] = '\u0033\u002E';
 t['\u248B'] = '\u0034\u002E';
 t['\u248C'] = '\u0035\u002E';
 t['\u248D'] = '\u0036\u002E';
 t['\u248E'] = '\u0037\u002E';
 t['\u248F'] = '\u0038\u002E';
 t['\u2490'] = '\u0039\u002E';
 t['\u2491'] = '\u0031\u0030\u002E';
 t['\u2492'] = '\u0031\u0031\u002E';
 t['\u2493'] = '\u0031\u0032\u002E';
 t['\u2494'] = '\u0031\u0033\u002E';
 t['\u2495'] = '\u0031\u0034\u002E';
 t['\u2496'] = '\u0031\u0035\u002E';
 t['\u2497'] = '\u0031\u0036\u002E';
 t['\u2498'] = '\u0031\u0037\u002E';
 t['\u2499'] = '\u0031\u0038\u002E';
 t['\u249A'] = '\u0031\u0039\u002E';
 t['\u249B'] = '\u0032\u0030\u002E';
 t['\u249C'] = '\u0028\u0061\u0029';
 t['\u249D'] = '\u0028\u0062\u0029';
 t['\u249E'] = '\u0028\u0063\u0029';
 t['\u249F'] = '\u0028\u0064\u0029';
 t['\u24A0'] = '\u0028\u0065\u0029';
 t['\u24A1'] = '\u0028\u0066\u0029';
 t['\u24A2'] = '\u0028\u0067\u0029';
 t['\u24A3'] = '\u0028\u0068\u0029';
 t['\u24A4'] = '\u0028\u0069\u0029';
 t['\u24A5'] = '\u0028\u006A\u0029';
 t['\u24A6'] = '\u0028\u006B\u0029';
 t['\u24A7'] = '\u0028\u006C\u0029';
 t['\u24A8'] = '\u0028\u006D\u0029';
 t['\u24A9'] = '\u0028\u006E\u0029';
 t['\u24AA'] = '\u0028\u006F\u0029';
 t['\u24AB'] = '\u0028\u0070\u0029';
 t['\u24AC'] = '\u0028\u0071\u0029';
 t['\u24AD'] = '\u0028\u0072\u0029';
 t['\u24AE'] = '\u0028\u0073\u0029';
 t['\u24AF'] = '\u0028\u0074\u0029';
 t['\u24B0'] = '\u0028\u0075\u0029';
 t['\u24B1'] = '\u0028\u0076\u0029';
 t['\u24B2'] = '\u0028\u0077\u0029';
 t['\u24B3'] = '\u0028\u0078\u0029';
 t['\u24B4'] = '\u0028\u0079\u0029';
 t['\u24B5'] = '\u0028\u007A\u0029';
 t['\u2A0C'] = '\u222B\u222B\u222B\u222B';
 t['\u2A74'] = '\u003A\u003A\u003D';
 t['\u2A75'] = '\u003D\u003D';
 t['\u2A76'] = '\u003D\u003D\u003D';
 t['\u2E9F'] = '\u6BCD';
 t['\u2EF3'] = '\u9F9F';
 t['\u2F00'] = '\u4E00';
 t['\u2F01'] = '\u4E28';
 t['\u2F02'] = '\u4E36';
 t['\u2F03'] = '\u4E3F';
 t['\u2F04'] = '\u4E59';
 t['\u2F05'] = '\u4E85';
 t['\u2F06'] = '\u4E8C';
 t['\u2F07'] = '\u4EA0';
 t['\u2F08'] = '\u4EBA';
 t['\u2F09'] = '\u513F';
 t['\u2F0A'] = '\u5165';
 t['\u2F0B'] = '\u516B';
 t['\u2F0C'] = '\u5182';
 t['\u2F0D'] = '\u5196';
 t['\u2F0E'] = '\u51AB';
 t['\u2F0F'] = '\u51E0';
 t['\u2F10'] = '\u51F5';
 t['\u2F11'] = '\u5200';
 t['\u2F12'] = '\u529B';
 t['\u2F13'] = '\u52F9';
 t['\u2F14'] = '\u5315';
 t['\u2F15'] = '\u531A';
 t['\u2F16'] = '\u5338';
 t['\u2F17'] = '\u5341';
 t['\u2F18'] = '\u535C';
 t['\u2F19'] = '\u5369';
 t['\u2F1A'] = '\u5382';
 t['\u2F1B'] = '\u53B6';
 t['\u2F1C'] = '\u53C8';
 t['\u2F1D'] = '\u53E3';
 t['\u2F1E'] = '\u56D7';
 t['\u2F1F'] = '\u571F';
 t['\u2F20'] = '\u58EB';
 t['\u2F21'] = '\u5902';
 t['\u2F22'] = '\u590A';
 t['\u2F23'] = '\u5915';
 t['\u2F24'] = '\u5927';
 t['\u2F25'] = '\u5973';
 t['\u2F26'] = '\u5B50';
 t['\u2F27'] = '\u5B80';
 t['\u2F28'] = '\u5BF8';
 t['\u2F29'] = '\u5C0F';
 t['\u2F2A'] = '\u5C22';
 t['\u2F2B'] = '\u5C38';
 t['\u2F2C'] = '\u5C6E';
 t['\u2F2D'] = '\u5C71';
 t['\u2F2E'] = '\u5DDB';
 t['\u2F2F'] = '\u5DE5';
 t['\u2F30'] = '\u5DF1';
 t['\u2F31'] = '\u5DFE';
 t['\u2F32'] = '\u5E72';
 t['\u2F33'] = '\u5E7A';
 t['\u2F34'] = '\u5E7F';
 t['\u2F35'] = '\u5EF4';
 t['\u2F36'] = '\u5EFE';
 t['\u2F37'] = '\u5F0B';
 t['\u2F38'] = '\u5F13';
 t['\u2F39'] = '\u5F50';
 t['\u2F3A'] = '\u5F61';
 t['\u2F3B'] = '\u5F73';
 t['\u2F3C'] = '\u5FC3';
 t['\u2F3D'] = '\u6208';
 t['\u2F3E'] = '\u6236';
 t['\u2F3F'] = '\u624B';
 t['\u2F40'] = '\u652F';
 t['\u2F41'] = '\u6534';
 t['\u2F42'] = '\u6587';
 t['\u2F43'] = '\u6597';
 t['\u2F44'] = '\u65A4';
 t['\u2F45'] = '\u65B9';
 t['\u2F46'] = '\u65E0';
 t['\u2F47'] = '\u65E5';
 t['\u2F48'] = '\u66F0';
 t['\u2F49'] = '\u6708';
 t['\u2F4A'] = '\u6728';
 t['\u2F4B'] = '\u6B20';
 t['\u2F4C'] = '\u6B62';
 t['\u2F4D'] = '\u6B79';
 t['\u2F4E'] = '\u6BB3';
 t['\u2F4F'] = '\u6BCB';
 t['\u2F50'] = '\u6BD4';
 t['\u2F51'] = '\u6BDB';
 t['\u2F52'] = '\u6C0F';
 t['\u2F53'] = '\u6C14';
 t['\u2F54'] = '\u6C34';
 t['\u2F55'] = '\u706B';
 t['\u2F56'] = '\u722A';
 t['\u2F57'] = '\u7236';
 t['\u2F58'] = '\u723B';
 t['\u2F59'] = '\u723F';
 t['\u2F5A'] = '\u7247';
 t['\u2F5B'] = '\u7259';
 t['\u2F5C'] = '\u725B';
 t['\u2F5D'] = '\u72AC';
 t['\u2F5E'] = '\u7384';
 t['\u2F5F'] = '\u7389';
 t['\u2F60'] = '\u74DC';
 t['\u2F61'] = '\u74E6';
 t['\u2F62'] = '\u7518';
 t['\u2F63'] = '\u751F';
 t['\u2F64'] = '\u7528';
 t['\u2F65'] = '\u7530';
 t['\u2F66'] = '\u758B';
 t['\u2F67'] = '\u7592';
 t['\u2F68'] = '\u7676';
 t['\u2F69'] = '\u767D';
 t['\u2F6A'] = '\u76AE';
 t['\u2F6B'] = '\u76BF';
 t['\u2F6C'] = '\u76EE';
 t['\u2F6D'] = '\u77DB';
 t['\u2F6E'] = '\u77E2';
 t['\u2F6F'] = '\u77F3';
 t['\u2F70'] = '\u793A';
 t['\u2F71'] = '\u79B8';
 t['\u2F72'] = '\u79BE';
 t['\u2F73'] = '\u7A74';
 t['\u2F74'] = '\u7ACB';
 t['\u2F75'] = '\u7AF9';
 t['\u2F76'] = '\u7C73';
 t['\u2F77'] = '\u7CF8';
 t['\u2F78'] = '\u7F36';
 t['\u2F79'] = '\u7F51';
 t['\u2F7A'] = '\u7F8A';
 t['\u2F7B'] = '\u7FBD';
 t['\u2F7C'] = '\u8001';
 t['\u2F7D'] = '\u800C';
 t['\u2F7E'] = '\u8012';
 t['\u2F7F'] = '\u8033';
 t['\u2F80'] = '\u807F';
 t['\u2F81'] = '\u8089';
 t['\u2F82'] = '\u81E3';
 t['\u2F83'] = '\u81EA';
 t['\u2F84'] = '\u81F3';
 t['\u2F85'] = '\u81FC';
 t['\u2F86'] = '\u820C';
 t['\u2F87'] = '\u821B';
 t['\u2F88'] = '\u821F';
 t['\u2F89'] = '\u826E';
 t['\u2F8A'] = '\u8272';
 t['\u2F8B'] = '\u8278';
 t['\u2F8C'] = '\u864D';
 t['\u2F8D'] = '\u866B';
 t['\u2F8E'] = '\u8840';
 t['\u2F8F'] = '\u884C';
 t['\u2F90'] = '\u8863';
 t['\u2F91'] = '\u897E';
 t['\u2F92'] = '\u898B';
 t['\u2F93'] = '\u89D2';
 t['\u2F94'] = '\u8A00';
 t['\u2F95'] = '\u8C37';
 t['\u2F96'] = '\u8C46';
 t['\u2F97'] = '\u8C55';
 t['\u2F98'] = '\u8C78';
 t['\u2F99'] = '\u8C9D';
 t['\u2F9A'] = '\u8D64';
 t['\u2F9B'] = '\u8D70';
 t['\u2F9C'] = '\u8DB3';
 t['\u2F9D'] = '\u8EAB';
 t['\u2F9E'] = '\u8ECA';
 t['\u2F9F'] = '\u8F9B';
 t['\u2FA0'] = '\u8FB0';
 t['\u2FA1'] = '\u8FB5';
 t['\u2FA2'] = '\u9091';
 t['\u2FA3'] = '\u9149';
 t['\u2FA4'] = '\u91C6';
 t['\u2FA5'] = '\u91CC';
 t['\u2FA6'] = '\u91D1';
 t['\u2FA7'] = '\u9577';
 t['\u2FA8'] = '\u9580';
 t['\u2FA9'] = '\u961C';
 t['\u2FAA'] = '\u96B6';
 t['\u2FAB'] = '\u96B9';
 t['\u2FAC'] = '\u96E8';
 t['\u2FAD'] = '\u9751';
 t['\u2FAE'] = '\u975E';
 t['\u2FAF'] = '\u9762';
 t['\u2FB0'] = '\u9769';
 t['\u2FB1'] = '\u97CB';
 t['\u2FB2'] = '\u97ED';
 t['\u2FB3'] = '\u97F3';
 t['\u2FB4'] = '\u9801';
 t['\u2FB5'] = '\u98A8';
 t['\u2FB6'] = '\u98DB';
 t['\u2FB7'] = '\u98DF';
 t['\u2FB8'] = '\u9996';
 t['\u2FB9'] = '\u9999';
 t['\u2FBA'] = '\u99AC';
 t['\u2FBB'] = '\u9AA8';
 t['\u2FBC'] = '\u9AD8';
 t['\u2FBD'] = '\u9ADF';
 t['\u2FBE'] = '\u9B25';
 t['\u2FBF'] = '\u9B2F';
 t['\u2FC0'] = '\u9B32';
 t['\u2FC1'] = '\u9B3C';
 t['\u2FC2'] = '\u9B5A';
 t['\u2FC3'] = '\u9CE5';
 t['\u2FC4'] = '\u9E75';
 t['\u2FC5'] = '\u9E7F';
 t['\u2FC6'] = '\u9EA5';
 t['\u2FC7'] = '\u9EBB';
 t['\u2FC8'] = '\u9EC3';
 t['\u2FC9'] = '\u9ECD';
 t['\u2FCA'] = '\u9ED1';
 t['\u2FCB'] = '\u9EF9';
 t['\u2FCC'] = '\u9EFD';
 t['\u2FCD'] = '\u9F0E';
 t['\u2FCE'] = '\u9F13';
 t['\u2FCF'] = '\u9F20';
 t['\u2FD0'] = '\u9F3B';
 t['\u2FD1'] = '\u9F4A';
 t['\u2FD2'] = '\u9F52';
 t['\u2FD3'] = '\u9F8D';
 t['\u2FD4'] = '\u9F9C';
 t['\u2FD5'] = '\u9FA0';
 t['\u3036'] = '\u3012';
 t['\u3038'] = '\u5341';
 t['\u3039'] = '\u5344';
 t['\u303A'] = '\u5345';
 t['\u309B'] = '\u0020\u3099';
 t['\u309C'] = '\u0020\u309A';
 t['\u3131'] = '\u1100';
 t['\u3132'] = '\u1101';
 t['\u3133'] = '\u11AA';
 t['\u3134'] = '\u1102';
 t['\u3135'] = '\u11AC';
 t['\u3136'] = '\u11AD';
 t['\u3137'] = '\u1103';
 t['\u3138'] = '\u1104';
 t['\u3139'] = '\u1105';
 t['\u313A'] = '\u11B0';
 t['\u313B'] = '\u11B1';
 t['\u313C'] = '\u11B2';
 t['\u313D'] = '\u11B3';
 t['\u313E'] = '\u11B4';
 t['\u313F'] = '\u11B5';
 t['\u3140'] = '\u111A';
 t['\u3141'] = '\u1106';
 t['\u3142'] = '\u1107';
 t['\u3143'] = '\u1108';
 t['\u3144'] = '\u1121';
 t['\u3145'] = '\u1109';
 t['\u3146'] = '\u110A';
 t['\u3147'] = '\u110B';
 t['\u3148'] = '\u110C';
 t['\u3149'] = '\u110D';
 t['\u314A'] = '\u110E';
 t['\u314B'] = '\u110F';
 t['\u314C'] = '\u1110';
 t['\u314D'] = '\u1111';
 t['\u314E'] = '\u1112';
 t['\u314F'] = '\u1161';
 t['\u3150'] = '\u1162';
 t['\u3151'] = '\u1163';
 t['\u3152'] = '\u1164';
 t['\u3153'] = '\u1165';
 t['\u3154'] = '\u1166';
 t['\u3155'] = '\u1167';
 t['\u3156'] = '\u1168';
 t['\u3157'] = '\u1169';
 t['\u3158'] = '\u116A';
 t['\u3159'] = '\u116B';
 t['\u315A'] = '\u116C';
 t['\u315B'] = '\u116D';
 t['\u315C'] = '\u116E';
 t['\u315D'] = '\u116F';
 t['\u315E'] = '\u1170';
 t['\u315F'] = '\u1171';
 t['\u3160'] = '\u1172';
 t['\u3161'] = '\u1173';
 t['\u3162'] = '\u1174';
 t['\u3163'] = '\u1175';
 t['\u3164'] = '\u1160';
 t['\u3165'] = '\u1114';
 t['\u3166'] = '\u1115';
 t['\u3167'] = '\u11C7';
 t['\u3168'] = '\u11C8';
 t['\u3169'] = '\u11CC';
 t['\u316A'] = '\u11CE';
 t['\u316B'] = '\u11D3';
 t['\u316C'] = '\u11D7';
 t['\u316D'] = '\u11D9';
 t['\u316E'] = '\u111C';
 t['\u316F'] = '\u11DD';
 t['\u3170'] = '\u11DF';
 t['\u3171'] = '\u111D';
 t['\u3172'] = '\u111E';
 t['\u3173'] = '\u1120';
 t['\u3174'] = '\u1122';
 t['\u3175'] = '\u1123';
 t['\u3176'] = '\u1127';
 t['\u3177'] = '\u1129';
 t['\u3178'] = '\u112B';
 t['\u3179'] = '\u112C';
 t['\u317A'] = '\u112D';
 t['\u317B'] = '\u112E';
 t['\u317C'] = '\u112F';
 t['\u317D'] = '\u1132';
 t['\u317E'] = '\u1136';
 t['\u317F'] = '\u1140';
 t['\u3180'] = '\u1147';
 t['\u3181'] = '\u114C';
 t['\u3182'] = '\u11F1';
 t['\u3183'] = '\u11F2';
 t['\u3184'] = '\u1157';
 t['\u3185'] = '\u1158';
 t['\u3186'] = '\u1159';
 t['\u3187'] = '\u1184';
 t['\u3188'] = '\u1185';
 t['\u3189'] = '\u1188';
 t['\u318A'] = '\u1191';
 t['\u318B'] = '\u1192';
 t['\u318C'] = '\u1194';
 t['\u318D'] = '\u119E';
 t['\u318E'] = '\u11A1';
 t['\u3200'] = '\u0028\u1100\u0029';
 t['\u3201'] = '\u0028\u1102\u0029';
 t['\u3202'] = '\u0028\u1103\u0029';
 t['\u3203'] = '\u0028\u1105\u0029';
 t['\u3204'] = '\u0028\u1106\u0029';
 t['\u3205'] = '\u0028\u1107\u0029';
 t['\u3206'] = '\u0028\u1109\u0029';
 t['\u3207'] = '\u0028\u110B\u0029';
 t['\u3208'] = '\u0028\u110C\u0029';
 t['\u3209'] = '\u0028\u110E\u0029';
 t['\u320A'] = '\u0028\u110F\u0029';
 t['\u320B'] = '\u0028\u1110\u0029';
 t['\u320C'] = '\u0028\u1111\u0029';
 t['\u320D'] = '\u0028\u1112\u0029';
 t['\u320E'] = '\u0028\u1100\u1161\u0029';
 t['\u320F'] = '\u0028\u1102\u1161\u0029';
 t['\u3210'] = '\u0028\u1103\u1161\u0029';
 t['\u3211'] = '\u0028\u1105\u1161\u0029';
 t['\u3212'] = '\u0028\u1106\u1161\u0029';
 t['\u3213'] = '\u0028\u1107\u1161\u0029';
 t['\u3214'] = '\u0028\u1109\u1161\u0029';
 t['\u3215'] = '\u0028\u110B\u1161\u0029';
 t['\u3216'] = '\u0028\u110C\u1161\u0029';
 t['\u3217'] = '\u0028\u110E\u1161\u0029';
 t['\u3218'] = '\u0028\u110F\u1161\u0029';
 t['\u3219'] = '\u0028\u1110\u1161\u0029';
 t['\u321A'] = '\u0028\u1111\u1161\u0029';
 t['\u321B'] = '\u0028\u1112\u1161\u0029';
 t['\u321C'] = '\u0028\u110C\u116E\u0029';
 t['\u321D'] = '\u0028\u110B\u1169\u110C\u1165\u11AB\u0029';
 t['\u321E'] = '\u0028\u110B\u1169\u1112\u116E\u0029';
 t['\u3220'] = '\u0028\u4E00\u0029';
 t['\u3221'] = '\u0028\u4E8C\u0029';
 t['\u3222'] = '\u0028\u4E09\u0029';
 t['\u3223'] = '\u0028\u56DB\u0029';
 t['\u3224'] = '\u0028\u4E94\u0029';
 t['\u3225'] = '\u0028\u516D\u0029';
 t['\u3226'] = '\u0028\u4E03\u0029';
 t['\u3227'] = '\u0028\u516B\u0029';
 t['\u3228'] = '\u0028\u4E5D\u0029';
 t['\u3229'] = '\u0028\u5341\u0029';
 t['\u322A'] = '\u0028\u6708\u0029';
 t['\u322B'] = '\u0028\u706B\u0029';
 t['\u322C'] = '\u0028\u6C34\u0029';
 t['\u322D'] = '\u0028\u6728\u0029';
 t['\u322E'] = '\u0028\u91D1\u0029';
 t['\u322F'] = '\u0028\u571F\u0029';
 t['\u3230'] = '\u0028\u65E5\u0029';
 t['\u3231'] = '\u0028\u682A\u0029';
 t['\u3232'] = '\u0028\u6709\u0029';
 t['\u3233'] = '\u0028\u793E\u0029';
 t['\u3234'] = '\u0028\u540D\u0029';
 t['\u3235'] = '\u0028\u7279\u0029';
 t['\u3236'] = '\u0028\u8CA1\u0029';
 t['\u3237'] = '\u0028\u795D\u0029';
 t['\u3238'] = '\u0028\u52B4\u0029';
 t['\u3239'] = '\u0028\u4EE3\u0029';
 t['\u323A'] = '\u0028\u547C\u0029';
 t['\u323B'] = '\u0028\u5B66\u0029';
 t['\u323C'] = '\u0028\u76E3\u0029';
 t['\u323D'] = '\u0028\u4F01\u0029';
 t['\u323E'] = '\u0028\u8CC7\u0029';
 t['\u323F'] = '\u0028\u5354\u0029';
 t['\u3240'] = '\u0028\u796D\u0029';
 t['\u3241'] = '\u0028\u4F11\u0029';
 t['\u3242'] = '\u0028\u81EA\u0029';
 t['\u3243'] = '\u0028\u81F3\u0029';
 t['\u32C0'] = '\u0031\u6708';
 t['\u32C1'] = '\u0032\u6708';
 t['\u32C2'] = '\u0033\u6708';
 t['\u32C3'] = '\u0034\u6708';
 t['\u32C4'] = '\u0035\u6708';
 t['\u32C5'] = '\u0036\u6708';
 t['\u32C6'] = '\u0037\u6708';
 t['\u32C7'] = '\u0038\u6708';
 t['\u32C8'] = '\u0039\u6708';
 t['\u32C9'] = '\u0031\u0030\u6708';
 t['\u32CA'] = '\u0031\u0031\u6708';
 t['\u32CB'] = '\u0031\u0032\u6708';
 t['\u3358'] = '\u0030\u70B9';
 t['\u3359'] = '\u0031\u70B9';
 t['\u335A'] = '\u0032\u70B9';
 t['\u335B'] = '\u0033\u70B9';
 t['\u335C'] = '\u0034\u70B9';
 t['\u335D'] = '\u0035\u70B9';
 t['\u335E'] = '\u0036\u70B9';
 t['\u335F'] = '\u0037\u70B9';
 t['\u3360'] = '\u0038\u70B9';
 t['\u3361'] = '\u0039\u70B9';
 t['\u3362'] = '\u0031\u0030\u70B9';
 t['\u3363'] = '\u0031\u0031\u70B9';
 t['\u3364'] = '\u0031\u0032\u70B9';
 t['\u3365'] = '\u0031\u0033\u70B9';
 t['\u3366'] = '\u0031\u0034\u70B9';
 t['\u3367'] = '\u0031\u0035\u70B9';
 t['\u3368'] = '\u0031\u0036\u70B9';
 t['\u3369'] = '\u0031\u0037\u70B9';
 t['\u336A'] = '\u0031\u0038\u70B9';
 t['\u336B'] = '\u0031\u0039\u70B9';
 t['\u336C'] = '\u0032\u0030\u70B9';
 t['\u336D'] = '\u0032\u0031\u70B9';
 t['\u336E'] = '\u0032\u0032\u70B9';
 t['\u336F'] = '\u0032\u0033\u70B9';
 t['\u3370'] = '\u0032\u0034\u70B9';
 t['\u33E0'] = '\u0031\u65E5';
 t['\u33E1'] = '\u0032\u65E5';
 t['\u33E2'] = '\u0033\u65E5';
 t['\u33E3'] = '\u0034\u65E5';
 t['\u33E4'] = '\u0035\u65E5';
 t['\u33E5'] = '\u0036\u65E5';
 t['\u33E6'] = '\u0037\u65E5';
 t['\u33E7'] = '\u0038\u65E5';
 t['\u33E8'] = '\u0039\u65E5';
 t['\u33E9'] = '\u0031\u0030\u65E5';
 t['\u33EA'] = '\u0031\u0031\u65E5';
 t['\u33EB'] = '\u0031\u0032\u65E5';
 t['\u33EC'] = '\u0031\u0033\u65E5';
 t['\u33ED'] = '\u0031\u0034\u65E5';
 t['\u33EE'] = '\u0031\u0035\u65E5';
 t['\u33EF'] = '\u0031\u0036\u65E5';
 t['\u33F0'] = '\u0031\u0037\u65E5';
 t['\u33F1'] = '\u0031\u0038\u65E5';
 t['\u33F2'] = '\u0031\u0039\u65E5';
 t['\u33F3'] = '\u0032\u0030\u65E5';
 t['\u33F4'] = '\u0032\u0031\u65E5';
 t['\u33F5'] = '\u0032\u0032\u65E5';
 t['\u33F6'] = '\u0032\u0033\u65E5';
 t['\u33F7'] = '\u0032\u0034\u65E5';
 t['\u33F8'] = '\u0032\u0035\u65E5';
 t['\u33F9'] = '\u0032\u0036\u65E5';
 t['\u33FA'] = '\u0032\u0037\u65E5';
 t['\u33FB'] = '\u0032\u0038\u65E5';
 t['\u33FC'] = '\u0032\u0039\u65E5';
 t['\u33FD'] = '\u0033\u0030\u65E5';
 t['\u33FE'] = '\u0033\u0031\u65E5';
 t['\uFB00'] = '\u0066\u0066';
 t['\uFB01'] = '\u0066\u0069';
 t['\uFB02'] = '\u0066\u006C';
 t['\uFB03'] = '\u0066\u0066\u0069';
 t['\uFB04'] = '\u0066\u0066\u006C';
 t['\uFB05'] = '\u017F\u0074';
 t['\uFB06'] = '\u0073\u0074';
 t['\uFB13'] = '\u0574\u0576';
 t['\uFB14'] = '\u0574\u0565';
 t['\uFB15'] = '\u0574\u056B';
 t['\uFB16'] = '\u057E\u0576';
 t['\uFB17'] = '\u0574\u056D';
 t['\uFB4F'] = '\u05D0\u05DC';
 t['\uFB50'] = '\u0671';
 t['\uFB51'] = '\u0671';
 t['\uFB52'] = '\u067B';
 t['\uFB53'] = '\u067B';
 t['\uFB54'] = '\u067B';
 t['\uFB55'] = '\u067B';
 t['\uFB56'] = '\u067E';
 t['\uFB57'] = '\u067E';
 t['\uFB58'] = '\u067E';
 t['\uFB59'] = '\u067E';
 t['\uFB5A'] = '\u0680';
 t['\uFB5B'] = '\u0680';
 t['\uFB5C'] = '\u0680';
 t['\uFB5D'] = '\u0680';
 t['\uFB5E'] = '\u067A';
 t['\uFB5F'] = '\u067A';
 t['\uFB60'] = '\u067A';
 t['\uFB61'] = '\u067A';
 t['\uFB62'] = '\u067F';
 t['\uFB63'] = '\u067F';
 t['\uFB64'] = '\u067F';
 t['\uFB65'] = '\u067F';
 t['\uFB66'] = '\u0679';
 t['\uFB67'] = '\u0679';
 t['\uFB68'] = '\u0679';
 t['\uFB69'] = '\u0679';
 t['\uFB6A'] = '\u06A4';
 t['\uFB6B'] = '\u06A4';
 t['\uFB6C'] = '\u06A4';
 t['\uFB6D'] = '\u06A4';
 t['\uFB6E'] = '\u06A6';
 t['\uFB6F'] = '\u06A6';
 t['\uFB70'] = '\u06A6';
 t['\uFB71'] = '\u06A6';
 t['\uFB72'] = '\u0684';
 t['\uFB73'] = '\u0684';
 t['\uFB74'] = '\u0684';
 t['\uFB75'] = '\u0684';
 t['\uFB76'] = '\u0683';
 t['\uFB77'] = '\u0683';
 t['\uFB78'] = '\u0683';
 t['\uFB79'] = '\u0683';
 t['\uFB7A'] = '\u0686';
 t['\uFB7B'] = '\u0686';
 t['\uFB7C'] = '\u0686';
 t['\uFB7D'] = '\u0686';
 t['\uFB7E'] = '\u0687';
 t['\uFB7F'] = '\u0687';
 t['\uFB80'] = '\u0687';
 t['\uFB81'] = '\u0687';
 t['\uFB82'] = '\u068D';
 t['\uFB83'] = '\u068D';
 t['\uFB84'] = '\u068C';
 t['\uFB85'] = '\u068C';
 t['\uFB86'] = '\u068E';
 t['\uFB87'] = '\u068E';
 t['\uFB88'] = '\u0688';
 t['\uFB89'] = '\u0688';
 t['\uFB8A'] = '\u0698';
 t['\uFB8B'] = '\u0698';
 t['\uFB8C'] = '\u0691';
 t['\uFB8D'] = '\u0691';
 t['\uFB8E'] = '\u06A9';
 t['\uFB8F'] = '\u06A9';
 t['\uFB90'] = '\u06A9';
 t['\uFB91'] = '\u06A9';
 t['\uFB92'] = '\u06AF';
 t['\uFB93'] = '\u06AF';
 t['\uFB94'] = '\u06AF';
 t['\uFB95'] = '\u06AF';
 t['\uFB96'] = '\u06B3';
 t['\uFB97'] = '\u06B3';
 t['\uFB98'] = '\u06B3';
 t['\uFB99'] = '\u06B3';
 t['\uFB9A'] = '\u06B1';
 t['\uFB9B'] = '\u06B1';
 t['\uFB9C'] = '\u06B1';
 t['\uFB9D'] = '\u06B1';
 t['\uFB9E'] = '\u06BA';
 t['\uFB9F'] = '\u06BA';
 t['\uFBA0'] = '\u06BB';
 t['\uFBA1'] = '\u06BB';
 t['\uFBA2'] = '\u06BB';
 t['\uFBA3'] = '\u06BB';
 t['\uFBA4'] = '\u06C0';
 t['\uFBA5'] = '\u06C0';
 t['\uFBA6'] = '\u06C1';
 t['\uFBA7'] = '\u06C1';
 t['\uFBA8'] = '\u06C1';
 t['\uFBA9'] = '\u06C1';
 t['\uFBAA'] = '\u06BE';
 t['\uFBAB'] = '\u06BE';
 t['\uFBAC'] = '\u06BE';
 t['\uFBAD'] = '\u06BE';
 t['\uFBAE'] = '\u06D2';
 t['\uFBAF'] = '\u06D2';
 t['\uFBB0'] = '\u06D3';
 t['\uFBB1'] = '\u06D3';
 t['\uFBD3'] = '\u06AD';
 t['\uFBD4'] = '\u06AD';
 t['\uFBD5'] = '\u06AD';
 t['\uFBD6'] = '\u06AD';
 t['\uFBD7'] = '\u06C7';
 t['\uFBD8'] = '\u06C7';
 t['\uFBD9'] = '\u06C6';
 t['\uFBDA'] = '\u06C6';
 t['\uFBDB'] = '\u06C8';
 t['\uFBDC'] = '\u06C8';
 t['\uFBDD'] = '\u0677';
 t['\uFBDE'] = '\u06CB';
 t['\uFBDF'] = '\u06CB';
 t['\uFBE0'] = '\u06C5';
 t['\uFBE1'] = '\u06C5';
 t['\uFBE2'] = '\u06C9';
 t['\uFBE3'] = '\u06C9';
 t['\uFBE4'] = '\u06D0';
 t['\uFBE5'] = '\u06D0';
 t['\uFBE6'] = '\u06D0';
 t['\uFBE7'] = '\u06D0';
 t['\uFBE8'] = '\u0649';
 t['\uFBE9'] = '\u0649';
 t['\uFBEA'] = '\u0626\u0627';
 t['\uFBEB'] = '\u0626\u0627';
 t['\uFBEC'] = '\u0626\u06D5';
 t['\uFBED'] = '\u0626\u06D5';
 t['\uFBEE'] = '\u0626\u0648';
 t['\uFBEF'] = '\u0626\u0648';
 t['\uFBF0'] = '\u0626\u06C7';
 t['\uFBF1'] = '\u0626\u06C7';
 t['\uFBF2'] = '\u0626\u06C6';
 t['\uFBF3'] = '\u0626\u06C6';
 t['\uFBF4'] = '\u0626\u06C8';
 t['\uFBF5'] = '\u0626\u06C8';
 t['\uFBF6'] = '\u0626\u06D0';
 t['\uFBF7'] = '\u0626\u06D0';
 t['\uFBF8'] = '\u0626\u06D0';
 t['\uFBF9'] = '\u0626\u0649';
 t['\uFBFA'] = '\u0626\u0649';
 t['\uFBFB'] = '\u0626\u0649';
 t['\uFBFC'] = '\u06CC';
 t['\uFBFD'] = '\u06CC';
 t['\uFBFE'] = '\u06CC';
 t['\uFBFF'] = '\u06CC';
 t['\uFC00'] = '\u0626\u062C';
 t['\uFC01'] = '\u0626\u062D';
 t['\uFC02'] = '\u0626\u0645';
 t['\uFC03'] = '\u0626\u0649';
 t['\uFC04'] = '\u0626\u064A';
 t['\uFC05'] = '\u0628\u062C';
 t['\uFC06'] = '\u0628\u062D';
 t['\uFC07'] = '\u0628\u062E';
 t['\uFC08'] = '\u0628\u0645';
 t['\uFC09'] = '\u0628\u0649';
 t['\uFC0A'] = '\u0628\u064A';
 t['\uFC0B'] = '\u062A\u062C';
 t['\uFC0C'] = '\u062A\u062D';
 t['\uFC0D'] = '\u062A\u062E';
 t['\uFC0E'] = '\u062A\u0645';
 t['\uFC0F'] = '\u062A\u0649';
 t['\uFC10'] = '\u062A\u064A';
 t['\uFC11'] = '\u062B\u062C';
 t['\uFC12'] = '\u062B\u0645';
 t['\uFC13'] = '\u062B\u0649';
 t['\uFC14'] = '\u062B\u064A';
 t['\uFC15'] = '\u062C\u062D';
 t['\uFC16'] = '\u062C\u0645';
 t['\uFC17'] = '\u062D\u062C';
 t['\uFC18'] = '\u062D\u0645';
 t['\uFC19'] = '\u062E\u062C';
 t['\uFC1A'] = '\u062E\u062D';
 t['\uFC1B'] = '\u062E\u0645';
 t['\uFC1C'] = '\u0633\u062C';
 t['\uFC1D'] = '\u0633\u062D';
 t['\uFC1E'] = '\u0633\u062E';
 t['\uFC1F'] = '\u0633\u0645';
 t['\uFC20'] = '\u0635\u062D';
 t['\uFC21'] = '\u0635\u0645';
 t['\uFC22'] = '\u0636\u062C';
 t['\uFC23'] = '\u0636\u062D';
 t['\uFC24'] = '\u0636\u062E';
 t['\uFC25'] = '\u0636\u0645';
 t['\uFC26'] = '\u0637\u062D';
 t['\uFC27'] = '\u0637\u0645';
 t['\uFC28'] = '\u0638\u0645';
 t['\uFC29'] = '\u0639\u062C';
 t['\uFC2A'] = '\u0639\u0645';
 t['\uFC2B'] = '\u063A\u062C';
 t['\uFC2C'] = '\u063A\u0645';
 t['\uFC2D'] = '\u0641\u062C';
 t['\uFC2E'] = '\u0641\u062D';
 t['\uFC2F'] = '\u0641\u062E';
 t['\uFC30'] = '\u0641\u0645';
 t['\uFC31'] = '\u0641\u0649';
 t['\uFC32'] = '\u0641\u064A';
 t['\uFC33'] = '\u0642\u062D';
 t['\uFC34'] = '\u0642\u0645';
 t['\uFC35'] = '\u0642\u0649';
 t['\uFC36'] = '\u0642\u064A';
 t['\uFC37'] = '\u0643\u0627';
 t['\uFC38'] = '\u0643\u062C';
 t['\uFC39'] = '\u0643\u062D';
 t['\uFC3A'] = '\u0643\u062E';
 t['\uFC3B'] = '\u0643\u0644';
 t['\uFC3C'] = '\u0643\u0645';
 t['\uFC3D'] = '\u0643\u0649';
 t['\uFC3E'] = '\u0643\u064A';
 t['\uFC3F'] = '\u0644\u062C';
 t['\uFC40'] = '\u0644\u062D';
 t['\uFC41'] = '\u0644\u062E';
 t['\uFC42'] = '\u0644\u0645';
 t['\uFC43'] = '\u0644\u0649';
 t['\uFC44'] = '\u0644\u064A';
 t['\uFC45'] = '\u0645\u062C';
 t['\uFC46'] = '\u0645\u062D';
 t['\uFC47'] = '\u0645\u062E';
 t['\uFC48'] = '\u0645\u0645';
 t['\uFC49'] = '\u0645\u0649';
 t['\uFC4A'] = '\u0645\u064A';
 t['\uFC4B'] = '\u0646\u062C';
 t['\uFC4C'] = '\u0646\u062D';
 t['\uFC4D'] = '\u0646\u062E';
 t['\uFC4E'] = '\u0646\u0645';
 t['\uFC4F'] = '\u0646\u0649';
 t['\uFC50'] = '\u0646\u064A';
 t['\uFC51'] = '\u0647\u062C';
 t['\uFC52'] = '\u0647\u0645';
 t['\uFC53'] = '\u0647\u0649';
 t['\uFC54'] = '\u0647\u064A';
 t['\uFC55'] = '\u064A\u062C';
 t['\uFC56'] = '\u064A\u062D';
 t['\uFC57'] = '\u064A\u062E';
 t['\uFC58'] = '\u064A\u0645';
 t['\uFC59'] = '\u064A\u0649';
 t['\uFC5A'] = '\u064A\u064A';
 t['\uFC5B'] = '\u0630\u0670';
 t['\uFC5C'] = '\u0631\u0670';
 t['\uFC5D'] = '\u0649\u0670';
 t['\uFC5E'] = '\u0020\u064C\u0651';
 t['\uFC5F'] = '\u0020\u064D\u0651';
 t['\uFC60'] = '\u0020\u064E\u0651';
 t['\uFC61'] = '\u0020\u064F\u0651';
 t['\uFC62'] = '\u0020\u0650\u0651';
 t['\uFC63'] = '\u0020\u0651\u0670';
 t['\uFC64'] = '\u0626\u0631';
 t['\uFC65'] = '\u0626\u0632';
 t['\uFC66'] = '\u0626\u0645';
 t['\uFC67'] = '\u0626\u0646';
 t['\uFC68'] = '\u0626\u0649';
 t['\uFC69'] = '\u0626\u064A';
 t['\uFC6A'] = '\u0628\u0631';
 t['\uFC6B'] = '\u0628\u0632';
 t['\uFC6C'] = '\u0628\u0645';
 t['\uFC6D'] = '\u0628\u0646';
 t['\uFC6E'] = '\u0628\u0649';
 t['\uFC6F'] = '\u0628\u064A';
 t['\uFC70'] = '\u062A\u0631';
 t['\uFC71'] = '\u062A\u0632';
 t['\uFC72'] = '\u062A\u0645';
 t['\uFC73'] = '\u062A\u0646';
 t['\uFC74'] = '\u062A\u0649';
 t['\uFC75'] = '\u062A\u064A';
 t['\uFC76'] = '\u062B\u0631';
 t['\uFC77'] = '\u062B\u0632';
 t['\uFC78'] = '\u062B\u0645';
 t['\uFC79'] = '\u062B\u0646';
 t['\uFC7A'] = '\u062B\u0649';
 t['\uFC7B'] = '\u062B\u064A';
 t['\uFC7C'] = '\u0641\u0649';
 t['\uFC7D'] = '\u0641\u064A';
 t['\uFC7E'] = '\u0642\u0649';
 t['\uFC7F'] = '\u0642\u064A';
 t['\uFC80'] = '\u0643\u0627';
 t['\uFC81'] = '\u0643\u0644';
 t['\uFC82'] = '\u0643\u0645';
 t['\uFC83'] = '\u0643\u0649';
 t['\uFC84'] = '\u0643\u064A';
 t['\uFC85'] = '\u0644\u0645';
 t['\uFC86'] = '\u0644\u0649';
 t['\uFC87'] = '\u0644\u064A';
 t['\uFC88'] = '\u0645\u0627';
 t['\uFC89'] = '\u0645\u0645';
 t['\uFC8A'] = '\u0646\u0631';
 t['\uFC8B'] = '\u0646\u0632';
 t['\uFC8C'] = '\u0646\u0645';
 t['\uFC8D'] = '\u0646\u0646';
 t['\uFC8E'] = '\u0646\u0649';
 t['\uFC8F'] = '\u0646\u064A';
 t['\uFC90'] = '\u0649\u0670';
 t['\uFC91'] = '\u064A\u0631';
 t['\uFC92'] = '\u064A\u0632';
 t['\uFC93'] = '\u064A\u0645';
 t['\uFC94'] = '\u064A\u0646';
 t['\uFC95'] = '\u064A\u0649';
 t['\uFC96'] = '\u064A\u064A';
 t['\uFC97'] = '\u0626\u062C';
 t['\uFC98'] = '\u0626\u062D';
 t['\uFC99'] = '\u0626\u062E';
 t['\uFC9A'] = '\u0626\u0645';
 t['\uFC9B'] = '\u0626\u0647';
 t['\uFC9C'] = '\u0628\u062C';
 t['\uFC9D'] = '\u0628\u062D';
 t['\uFC9E'] = '\u0628\u062E';
 t['\uFC9F'] = '\u0628\u0645';
 t['\uFCA0'] = '\u0628\u0647';
 t['\uFCA1'] = '\u062A\u062C';
 t['\uFCA2'] = '\u062A\u062D';
 t['\uFCA3'] = '\u062A\u062E';
 t['\uFCA4'] = '\u062A\u0645';
 t['\uFCA5'] = '\u062A\u0647';
 t['\uFCA6'] = '\u062B\u0645';
 t['\uFCA7'] = '\u062C\u062D';
 t['\uFCA8'] = '\u062C\u0645';
 t['\uFCA9'] = '\u062D\u062C';
 t['\uFCAA'] = '\u062D\u0645';
 t['\uFCAB'] = '\u062E\u062C';
 t['\uFCAC'] = '\u062E\u0645';
 t['\uFCAD'] = '\u0633\u062C';
 t['\uFCAE'] = '\u0633\u062D';
 t['\uFCAF'] = '\u0633\u062E';
 t['\uFCB0'] = '\u0633\u0645';
 t['\uFCB1'] = '\u0635\u062D';
 t['\uFCB2'] = '\u0635\u062E';
 t['\uFCB3'] = '\u0635\u0645';
 t['\uFCB4'] = '\u0636\u062C';
 t['\uFCB5'] = '\u0636\u062D';
 t['\uFCB6'] = '\u0636\u062E';
 t['\uFCB7'] = '\u0636\u0645';
 t['\uFCB8'] = '\u0637\u062D';
 t['\uFCB9'] = '\u0638\u0645';
 t['\uFCBA'] = '\u0639\u062C';
 t['\uFCBB'] = '\u0639\u0645';
 t['\uFCBC'] = '\u063A\u062C';
 t['\uFCBD'] = '\u063A\u0645';
 t['\uFCBE'] = '\u0641\u062C';
 t['\uFCBF'] = '\u0641\u062D';
 t['\uFCC0'] = '\u0641\u062E';
 t['\uFCC1'] = '\u0641\u0645';
 t['\uFCC2'] = '\u0642\u062D';
 t['\uFCC3'] = '\u0642\u0645';
 t['\uFCC4'] = '\u0643\u062C';
 t['\uFCC5'] = '\u0643\u062D';
 t['\uFCC6'] = '\u0643\u062E';
 t['\uFCC7'] = '\u0643\u0644';
 t['\uFCC8'] = '\u0643\u0645';
 t['\uFCC9'] = '\u0644\u062C';
 t['\uFCCA'] = '\u0644\u062D';
 t['\uFCCB'] = '\u0644\u062E';
 t['\uFCCC'] = '\u0644\u0645';
 t['\uFCCD'] = '\u0644\u0647';
 t['\uFCCE'] = '\u0645\u062C';
 t['\uFCCF'] = '\u0645\u062D';
 t['\uFCD0'] = '\u0645\u062E';
 t['\uFCD1'] = '\u0645\u0645';
 t['\uFCD2'] = '\u0646\u062C';
 t['\uFCD3'] = '\u0646\u062D';
 t['\uFCD4'] = '\u0646\u062E';
 t['\uFCD5'] = '\u0646\u0645';
 t['\uFCD6'] = '\u0646\u0647';
 t['\uFCD7'] = '\u0647\u062C';
 t['\uFCD8'] = '\u0647\u0645';
 t['\uFCD9'] = '\u0647\u0670';
 t['\uFCDA'] = '\u064A\u062C';
 t['\uFCDB'] = '\u064A\u062D';
 t['\uFCDC'] = '\u064A\u062E';
 t['\uFCDD'] = '\u064A\u0645';
 t['\uFCDE'] = '\u064A\u0647';
 t['\uFCDF'] = '\u0626\u0645';
 t['\uFCE0'] = '\u0626\u0647';
 t['\uFCE1'] = '\u0628\u0645';
 t['\uFCE2'] = '\u0628\u0647';
 t['\uFCE3'] = '\u062A\u0645';
 t['\uFCE4'] = '\u062A\u0647';
 t['\uFCE5'] = '\u062B\u0645';
 t['\uFCE6'] = '\u062B\u0647';
 t['\uFCE7'] = '\u0633\u0645';
 t['\uFCE8'] = '\u0633\u0647';
 t['\uFCE9'] = '\u0634\u0645';
 t['\uFCEA'] = '\u0634\u0647';
 t['\uFCEB'] = '\u0643\u0644';
 t['\uFCEC'] = '\u0643\u0645';
 t['\uFCED'] = '\u0644\u0645';
 t['\uFCEE'] = '\u0646\u0645';
 t['\uFCEF'] = '\u0646\u0647';
 t['\uFCF0'] = '\u064A\u0645';
 t['\uFCF1'] = '\u064A\u0647';
 t['\uFCF2'] = '\u0640\u064E\u0651';
 t['\uFCF3'] = '\u0640\u064F\u0651';
 t['\uFCF4'] = '\u0640\u0650\u0651';
 t['\uFCF5'] = '\u0637\u0649';
 t['\uFCF6'] = '\u0637\u064A';
 t['\uFCF7'] = '\u0639\u0649';
 t['\uFCF8'] = '\u0639\u064A';
 t['\uFCF9'] = '\u063A\u0649';
 t['\uFCFA'] = '\u063A\u064A';
 t['\uFCFB'] = '\u0633\u0649';
 t['\uFCFC'] = '\u0633\u064A';
 t['\uFCFD'] = '\u0634\u0649';
 t['\uFCFE'] = '\u0634\u064A';
 t['\uFCFF'] = '\u062D\u0649';
 t['\uFD00'] = '\u062D\u064A';
 t['\uFD01'] = '\u062C\u0649';
 t['\uFD02'] = '\u062C\u064A';
 t['\uFD03'] = '\u062E\u0649';
 t['\uFD04'] = '\u062E\u064A';
 t['\uFD05'] = '\u0635\u0649';
 t['\uFD06'] = '\u0635\u064A';
 t['\uFD07'] = '\u0636\u0649';
 t['\uFD08'] = '\u0636\u064A';
 t['\uFD09'] = '\u0634\u062C';
 t['\uFD0A'] = '\u0634\u062D';
 t['\uFD0B'] = '\u0634\u062E';
 t['\uFD0C'] = '\u0634\u0645';
 t['\uFD0D'] = '\u0634\u0631';
 t['\uFD0E'] = '\u0633\u0631';
 t['\uFD0F'] = '\u0635\u0631';
 t['\uFD10'] = '\u0636\u0631';
 t['\uFD11'] = '\u0637\u0649';
 t['\uFD12'] = '\u0637\u064A';
 t['\uFD13'] = '\u0639\u0649';
 t['\uFD14'] = '\u0639\u064A';
 t['\uFD15'] = '\u063A\u0649';
 t['\uFD16'] = '\u063A\u064A';
 t['\uFD17'] = '\u0633\u0649';
 t['\uFD18'] = '\u0633\u064A';
 t['\uFD19'] = '\u0634\u0649';
 t['\uFD1A'] = '\u0634\u064A';
 t['\uFD1B'] = '\u062D\u0649';
 t['\uFD1C'] = '\u062D\u064A';
 t['\uFD1D'] = '\u062C\u0649';
 t['\uFD1E'] = '\u062C\u064A';
 t['\uFD1F'] = '\u062E\u0649';
 t['\uFD20'] = '\u062E\u064A';
 t['\uFD21'] = '\u0635\u0649';
 t['\uFD22'] = '\u0635\u064A';
 t['\uFD23'] = '\u0636\u0649';
 t['\uFD24'] = '\u0636\u064A';
 t['\uFD25'] = '\u0634\u062C';
 t['\uFD26'] = '\u0634\u062D';
 t['\uFD27'] = '\u0634\u062E';
 t['\uFD28'] = '\u0634\u0645';
 t['\uFD29'] = '\u0634\u0631';
 t['\uFD2A'] = '\u0633\u0631';
 t['\uFD2B'] = '\u0635\u0631';
 t['\uFD2C'] = '\u0636\u0631';
 t['\uFD2D'] = '\u0634\u062C';
 t['\uFD2E'] = '\u0634\u062D';
 t['\uFD2F'] = '\u0634\u062E';
 t['\uFD30'] = '\u0634\u0645';
 t['\uFD31'] = '\u0633\u0647';
 t['\uFD32'] = '\u0634\u0647';
 t['\uFD33'] = '\u0637\u0645';
 t['\uFD34'] = '\u0633\u062C';
 t['\uFD35'] = '\u0633\u062D';
 t['\uFD36'] = '\u0633\u062E';
 t['\uFD37'] = '\u0634\u062C';
 t['\uFD38'] = '\u0634\u062D';
 t['\uFD39'] = '\u0634\u062E';
 t['\uFD3A'] = '\u0637\u0645';
 t['\uFD3B'] = '\u0638\u0645';
 t['\uFD3C'] = '\u0627\u064B';
 t['\uFD3D'] = '\u0627\u064B';
 t['\uFD50'] = '\u062A\u062C\u0645';
 t['\uFD51'] = '\u062A\u062D\u062C';
 t['\uFD52'] = '\u062A\u062D\u062C';
 t['\uFD53'] = '\u062A\u062D\u0645';
 t['\uFD54'] = '\u062A\u062E\u0645';
 t['\uFD55'] = '\u062A\u0645\u062C';
 t['\uFD56'] = '\u062A\u0645\u062D';
 t['\uFD57'] = '\u062A\u0645\u062E';
 t['\uFD58'] = '\u062C\u0645\u062D';
 t['\uFD59'] = '\u062C\u0645\u062D';
 t['\uFD5A'] = '\u062D\u0645\u064A';
 t['\uFD5B'] = '\u062D\u0645\u0649';
 t['\uFD5C'] = '\u0633\u062D\u062C';
 t['\uFD5D'] = '\u0633\u062C\u062D';
 t['\uFD5E'] = '\u0633\u062C\u0649';
 t['\uFD5F'] = '\u0633\u0645\u062D';
 t['\uFD60'] = '\u0633\u0645\u062D';
 t['\uFD61'] = '\u0633\u0645\u062C';
 t['\uFD62'] = '\u0633\u0645\u0645';
 t['\uFD63'] = '\u0633\u0645\u0645';
 t['\uFD64'] = '\u0635\u062D\u062D';
 t['\uFD65'] = '\u0635\u062D\u062D';
 t['\uFD66'] = '\u0635\u0645\u0645';
 t['\uFD67'] = '\u0634\u062D\u0645';
 t['\uFD68'] = '\u0634\u062D\u0645';
 t['\uFD69'] = '\u0634\u062C\u064A';
 t['\uFD6A'] = '\u0634\u0645\u062E';
 t['\uFD6B'] = '\u0634\u0645\u062E';
 t['\uFD6C'] = '\u0634\u0645\u0645';
 t['\uFD6D'] = '\u0634\u0645\u0645';
 t['\uFD6E'] = '\u0636\u062D\u0649';
 t['\uFD6F'] = '\u0636\u062E\u0645';
 t['\uFD70'] = '\u0636\u062E\u0645';
 t['\uFD71'] = '\u0637\u0645\u062D';
 t['\uFD72'] = '\u0637\u0645\u062D';
 t['\uFD73'] = '\u0637\u0645\u0645';
 t['\uFD74'] = '\u0637\u0645\u064A';
 t['\uFD75'] = '\u0639\u062C\u0645';
 t['\uFD76'] = '\u0639\u0645\u0645';
 t['\uFD77'] = '\u0639\u0645\u0645';
 t['\uFD78'] = '\u0639\u0645\u0649';
 t['\uFD79'] = '\u063A\u0645\u0645';
 t['\uFD7A'] = '\u063A\u0645\u064A';
 t['\uFD7B'] = '\u063A\u0645\u0649';
 t['\uFD7C'] = '\u0641\u062E\u0645';
 t['\uFD7D'] = '\u0641\u062E\u0645';
 t['\uFD7E'] = '\u0642\u0645\u062D';
 t['\uFD7F'] = '\u0642\u0645\u0645';
 t['\uFD80'] = '\u0644\u062D\u0645';
 t['\uFD81'] = '\u0644\u062D\u064A';
 t['\uFD82'] = '\u0644\u062D\u0649';
 t['\uFD83'] = '\u0644\u062C\u062C';
 t['\uFD84'] = '\u0644\u062C\u062C';
 t['\uFD85'] = '\u0644\u062E\u0645';
 t['\uFD86'] = '\u0644\u062E\u0645';
 t['\uFD87'] = '\u0644\u0645\u062D';
 t['\uFD88'] = '\u0644\u0645\u062D';
 t['\uFD89'] = '\u0645\u062D\u062C';
 t['\uFD8A'] = '\u0645\u062D\u0645';
 t['\uFD8B'] = '\u0645\u062D\u064A';
 t['\uFD8C'] = '\u0645\u062C\u062D';
 t['\uFD8D'] = '\u0645\u062C\u0645';
 t['\uFD8E'] = '\u0645\u062E\u062C';
 t['\uFD8F'] = '\u0645\u062E\u0645';
 t['\uFD92'] = '\u0645\u062C\u062E';
 t['\uFD93'] = '\u0647\u0645\u062C';
 t['\uFD94'] = '\u0647\u0645\u0645';
 t['\uFD95'] = '\u0646\u062D\u0645';
 t['\uFD96'] = '\u0646\u062D\u0649';
 t['\uFD97'] = '\u0646\u062C\u0645';
 t['\uFD98'] = '\u0646\u062C\u0645';
 t['\uFD99'] = '\u0646\u062C\u0649';
 t['\uFD9A'] = '\u0646\u0645\u064A';
 t['\uFD9B'] = '\u0646\u0645\u0649';
 t['\uFD9C'] = '\u064A\u0645\u0645';
 t['\uFD9D'] = '\u064A\u0645\u0645';
 t['\uFD9E'] = '\u0628\u062E\u064A';
 t['\uFD9F'] = '\u062A\u062C\u064A';
 t['\uFDA0'] = '\u062A\u062C\u0649';
 t['\uFDA1'] = '\u062A\u062E\u064A';
 t['\uFDA2'] = '\u062A\u062E\u0649';
 t['\uFDA3'] = '\u062A\u0645\u064A';
 t['\uFDA4'] = '\u062A\u0645\u0649';
 t['\uFDA5'] = '\u062C\u0645\u064A';
 t['\uFDA6'] = '\u062C\u062D\u0649';
 t['\uFDA7'] = '\u062C\u0645\u0649';
 t['\uFDA8'] = '\u0633\u062E\u0649';
 t['\uFDA9'] = '\u0635\u062D\u064A';
 t['\uFDAA'] = '\u0634\u062D\u064A';
 t['\uFDAB'] = '\u0636\u062D\u064A';
 t['\uFDAC'] = '\u0644\u062C\u064A';
 t['\uFDAD'] = '\u0644\u0645\u064A';
 t['\uFDAE'] = '\u064A\u062D\u064A';
 t['\uFDAF'] = '\u064A\u062C\u064A';
 t['\uFDB0'] = '\u064A\u0645\u064A';
 t['\uFDB1'] = '\u0645\u0645\u064A';
 t['\uFDB2'] = '\u0642\u0645\u064A';
 t['\uFDB3'] = '\u0646\u062D\u064A';
 t['\uFDB4'] = '\u0642\u0645\u062D';
 t['\uFDB5'] = '\u0644\u062D\u0645';
 t['\uFDB6'] = '\u0639\u0645\u064A';
 t['\uFDB7'] = '\u0643\u0645\u064A';
 t['\uFDB8'] = '\u0646\u062C\u062D';
 t['\uFDB9'] = '\u0645\u062E\u064A';
 t['\uFDBA'] = '\u0644\u062C\u0645';
 t['\uFDBB'] = '\u0643\u0645\u0645';
 t['\uFDBC'] = '\u0644\u062C\u0645';
 t['\uFDBD'] = '\u0646\u062C\u062D';
 t['\uFDBE'] = '\u062C\u062D\u064A';
 t['\uFDBF'] = '\u062D\u062C\u064A';
 t['\uFDC0'] = '\u0645\u062C\u064A';
 t['\uFDC1'] = '\u0641\u0645\u064A';
 t['\uFDC2'] = '\u0628\u062D\u064A';
 t['\uFDC3'] = '\u0643\u0645\u0645';
 t['\uFDC4'] = '\u0639\u062C\u0645';
 t['\uFDC5'] = '\u0635\u0645\u0645';
 t['\uFDC6'] = '\u0633\u062E\u064A';
 t['\uFDC7'] = '\u0646\u062C\u064A';
 t['\uFE49'] = '\u203E';
 t['\uFE4A'] = '\u203E';
 t['\uFE4B'] = '\u203E';
 t['\uFE4C'] = '\u203E';
 t['\uFE4D'] = '\u005F';
 t['\uFE4E'] = '\u005F';
 t['\uFE4F'] = '\u005F';
 t['\uFE80'] = '\u0621';
 t['\uFE81'] = '\u0622';
 t['\uFE82'] = '\u0622';
 t['\uFE83'] = '\u0623';
 t['\uFE84'] = '\u0623';
 t['\uFE85'] = '\u0624';
 t['\uFE86'] = '\u0624';
 t['\uFE87'] = '\u0625';
 t['\uFE88'] = '\u0625';
 t['\uFE89'] = '\u0626';
 t['\uFE8A'] = '\u0626';
 t['\uFE8B'] = '\u0626';
 t['\uFE8C'] = '\u0626';
 t['\uFE8D'] = '\u0627';
 t['\uFE8E'] = '\u0627';
 t['\uFE8F'] = '\u0628';
 t['\uFE90'] = '\u0628';
 t['\uFE91'] = '\u0628';
 t['\uFE92'] = '\u0628';
 t['\uFE93'] = '\u0629';
 t['\uFE94'] = '\u0629';
 t['\uFE95'] = '\u062A';
 t['\uFE96'] = '\u062A';
 t['\uFE97'] = '\u062A';
 t['\uFE98'] = '\u062A';
 t['\uFE99'] = '\u062B';
 t['\uFE9A'] = '\u062B';
 t['\uFE9B'] = '\u062B';
 t['\uFE9C'] = '\u062B';
 t['\uFE9D'] = '\u062C';
 t['\uFE9E'] = '\u062C';
 t['\uFE9F'] = '\u062C';
 t['\uFEA0'] = '\u062C';
 t['\uFEA1'] = '\u062D';
 t['\uFEA2'] = '\u062D';
 t['\uFEA3'] = '\u062D';
 t['\uFEA4'] = '\u062D';
 t['\uFEA5'] = '\u062E';
 t['\uFEA6'] = '\u062E';
 t['\uFEA7'] = '\u062E';
 t['\uFEA8'] = '\u062E';
 t['\uFEA9'] = '\u062F';
 t['\uFEAA'] = '\u062F';
 t['\uFEAB'] = '\u0630';
 t['\uFEAC'] = '\u0630';
 t['\uFEAD'] = '\u0631';
 t['\uFEAE'] = '\u0631';
 t['\uFEAF'] = '\u0632';
 t['\uFEB0'] = '\u0632';
 t['\uFEB1'] = '\u0633';
 t['\uFEB2'] = '\u0633';
 t['\uFEB3'] = '\u0633';
 t['\uFEB4'] = '\u0633';
 t['\uFEB5'] = '\u0634';
 t['\uFEB6'] = '\u0634';
 t['\uFEB7'] = '\u0634';
 t['\uFEB8'] = '\u0634';
 t['\uFEB9'] = '\u0635';
 t['\uFEBA'] = '\u0635';
 t['\uFEBB'] = '\u0635';
 t['\uFEBC'] = '\u0635';
 t['\uFEBD'] = '\u0636';
 t['\uFEBE'] = '\u0636';
 t['\uFEBF'] = '\u0636';
 t['\uFEC0'] = '\u0636';
 t['\uFEC1'] = '\u0637';
 t['\uFEC2'] = '\u0637';
 t['\uFEC3'] = '\u0637';
 t['\uFEC4'] = '\u0637';
 t['\uFEC5'] = '\u0638';
 t['\uFEC6'] = '\u0638';
 t['\uFEC7'] = '\u0638';
 t['\uFEC8'] = '\u0638';
 t['\uFEC9'] = '\u0639';
 t['\uFECA'] = '\u0639';
 t['\uFECB'] = '\u0639';
 t['\uFECC'] = '\u0639';
 t['\uFECD'] = '\u063A';
 t['\uFECE'] = '\u063A';
 t['\uFECF'] = '\u063A';
 t['\uFED0'] = '\u063A';
 t['\uFED1'] = '\u0641';
 t['\uFED2'] = '\u0641';
 t['\uFED3'] = '\u0641';
 t['\uFED4'] = '\u0641';
 t['\uFED5'] = '\u0642';
 t['\uFED6'] = '\u0642';
 t['\uFED7'] = '\u0642';
 t['\uFED8'] = '\u0642';
 t['\uFED9'] = '\u0643';
 t['\uFEDA'] = '\u0643';
 t['\uFEDB'] = '\u0643';
 t['\uFEDC'] = '\u0643';
 t['\uFEDD'] = '\u0644';
 t['\uFEDE'] = '\u0644';
 t['\uFEDF'] = '\u0644';
 t['\uFEE0'] = '\u0644';
 t['\uFEE1'] = '\u0645';
 t['\uFEE2'] = '\u0645';
 t['\uFEE3'] = '\u0645';
 t['\uFEE4'] = '\u0645';
 t['\uFEE5'] = '\u0646';
 t['\uFEE6'] = '\u0646';
 t['\uFEE7'] = '\u0646';
 t['\uFEE8'] = '\u0646';
 t['\uFEE9'] = '\u0647';
 t['\uFEEA'] = '\u0647';
 t['\uFEEB'] = '\u0647';
 t['\uFEEC'] = '\u0647';
 t['\uFEED'] = '\u0648';
 t['\uFEEE'] = '\u0648';
 t['\uFEEF'] = '\u0649';
 t['\uFEF0'] = '\u0649';
 t['\uFEF1'] = '\u064A';
 t['\uFEF2'] = '\u064A';
 t['\uFEF3'] = '\u064A';
 t['\uFEF4'] = '\u064A';
 t['\uFEF5'] = '\u0644\u0622';
 t['\uFEF6'] = '\u0644\u0622';
 t['\uFEF7'] = '\u0644\u0623';
 t['\uFEF8'] = '\u0644\u0623';
 t['\uFEF9'] = '\u0644\u0625';
 t['\uFEFA'] = '\u0644\u0625';
 t['\uFEFB'] = '\u0644\u0627';
 t['\uFEFC'] = '\u0644\u0627';
});
function reverseIfRtl(chars) {
 var charsLength = chars.length;
 if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) {
  return chars;
 }
 var s = '';
 for (var ii = charsLength - 1; ii >= 0; ii--) {
  s += chars[ii];
 }
 return s;
}
exports.mapSpecialUnicodeValues = mapSpecialUnicodeValues;
exports.reverseIfRtl = reverseIfRtl;
exports.getUnicodeRangeFor = getUnicodeRangeFor;
exports.getNormalizedUnicodes = getNormalizedUnicodes;
exports.getUnicodeForGlyph = getUnicodeForGlyph;

/***/ }),
/* 180 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.FontRendererFactory = void 0;

var _util = __w_pdfjs_require__(6);

var _cff_parser = __w_pdfjs_require__(174);

var _glyphlist = __w_pdfjs_require__(177);

var _encodings = __w_pdfjs_require__(176);

var _stream = __w_pdfjs_require__(157);

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var FontRendererFactory = function FontRendererFactoryClosure() {
  function getLong(data, offset) {
    return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
  }

  function getUshort(data, offset) {
    return data[offset] << 8 | data[offset + 1];
  }

  function parseCmap(data, start, end) {
    var offset = getUshort(data, start + 2) === 1 ? getLong(data, start + 8) : getLong(data, start + 16);
    var format = getUshort(data, start + offset);
    var ranges, p, i;

    if (format === 4) {
      getUshort(data, start + offset + 2);
      var segCount = getUshort(data, start + offset + 6) >> 1;
      p = start + offset + 14;
      ranges = [];

      for (i = 0; i < segCount; i++, p += 2) {
        ranges[i] = {
          end: getUshort(data, p)
        };
      }

      p += 2;

      for (i = 0; i < segCount; i++, p += 2) {
        ranges[i].start = getUshort(data, p);
      }

      for (i = 0; i < segCount; i++, p += 2) {
        ranges[i].idDelta = getUshort(data, p);
      }

      for (i = 0; i < segCount; i++, p += 2) {
        var idOffset = getUshort(data, p);

        if (idOffset === 0) {
          continue;
        }

        ranges[i].ids = [];

        for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {
          ranges[i].ids[j] = getUshort(data, p + idOffset);
          idOffset += 2;
        }
      }

      return ranges;
    } else if (format === 12) {
      getLong(data, start + offset + 4);
      var groups = getLong(data, start + offset + 12);
      p = start + offset + 16;
      ranges = [];

      for (i = 0; i < groups; i++) {
        ranges.push({
          start: getLong(data, p),
          end: getLong(data, p + 4),
          idDelta: getLong(data, p + 8) - getLong(data, p)
        });
        p += 12;
      }

      return ranges;
    }

    throw new _util.FormatError("unsupported cmap: ".concat(format));
  }

  function parseCff(data, start, end, seacAnalysisEnabled) {
    var properties = {};
    var parser = new _cff_parser.CFFParser(new _stream.Stream(data, start, end - start), properties, seacAnalysisEnabled);
    var cff = parser.parse();
    return {
      glyphs: cff.charStrings.objects,
      subrs: cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && cff.topDict.privateDict.subrsIndex.objects,
      gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects,
      isCFFCIDFont: cff.isCIDFont,
      fdSelect: cff.fdSelect,
      fdArray: cff.fdArray
    };
  }

  function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {
    var itemSize, itemDecode;

    if (isGlyphLocationsLong) {
      itemSize = 4;

      itemDecode = function fontItemDecodeLong(data, offset) {
        return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
      };
    } else {
      itemSize = 2;

      itemDecode = function fontItemDecode(data, offset) {
        return data[offset] << 9 | data[offset + 1] << 1;
      };
    }

    var glyphs = [];
    var startOffset = itemDecode(loca, 0);

    for (var j = itemSize; j < loca.length; j += itemSize) {
      var endOffset = itemDecode(loca, j);
      glyphs.push(glyf.subarray(startOffset, endOffset));
      startOffset = endOffset;
    }

    return glyphs;
  }

  function lookupCmap(ranges, unicode) {
    var code = unicode.codePointAt(0),
        gid = 0;
    var l = 0,
        r = ranges.length - 1;

    while (l < r) {
      var c = l + r + 1 >> 1;

      if (code < ranges[c].start) {
        r = c - 1;
      } else {
        l = c;
      }
    }

    if (ranges[l].start <= code && code <= ranges[l].end) {
      gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xFFFF;
    }

    return {
      charCode: code,
      glyphId: gid
    };
  }

  function compileGlyf(code, cmds, font) {
    function moveTo(x, y) {
      cmds.push({
        cmd: 'moveTo',
        args: [x, y]
      });
    }

    function lineTo(x, y) {
      cmds.push({
        cmd: 'lineTo',
        args: [x, y]
      });
    }

    function quadraticCurveTo(xa, ya, x, y) {
      cmds.push({
        cmd: 'quadraticCurveTo',
        args: [xa, ya, x, y]
      });
    }

    var i = 0;
    var numberOfContours = (code[i] << 24 | code[i + 1] << 16) >> 16;
    var flags;
    var x = 0,
        y = 0;
    i += 10;

    if (numberOfContours < 0) {
      do {
        flags = code[i] << 8 | code[i + 1];
        var glyphIndex = code[i + 2] << 8 | code[i + 3];
        i += 4;
        var arg1, arg2;

        if (flags & 0x01) {
          arg1 = (code[i] << 24 | code[i + 1] << 16) >> 16;
          arg2 = (code[i + 2] << 24 | code[i + 3] << 16) >> 16;
          i += 4;
        } else {
          arg1 = code[i++];
          arg2 = code[i++];
        }

        if (flags & 0x02) {
          x = arg1;
          y = arg2;
        } else {
          x = 0;
          y = 0;
        }

        var scaleX = 1,
            scaleY = 1,
            scale01 = 0,
            scale10 = 0;

        if (flags & 0x08) {
          scaleX = scaleY = (code[i] << 24 | code[i + 1] << 16) / 1073741824;
          i += 2;
        } else if (flags & 0x40) {
          scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;
          scaleY = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;
          i += 4;
        } else if (flags & 0x80) {
          scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;
          scale01 = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;
          scale10 = (code[i + 4] << 24 | code[i + 5] << 16) / 1073741824;
          scaleY = (code[i + 6] << 24 | code[i + 7] << 16) / 1073741824;
          i += 8;
        }

        var subglyph = font.glyphs[glyphIndex];

        if (subglyph) {
          cmds.push({
            cmd: 'save'
          });
          cmds.push({
            cmd: 'transform',
            args: [scaleX, scale01, scale10, scaleY, x, y]
          });
          compileGlyf(subglyph, cmds, font);
          cmds.push({
            cmd: 'restore'
          });
        }
      } while (flags & 0x20);
    } else {
      var endPtsOfContours = [];
      var j, jj;

      for (j = 0; j < numberOfContours; j++) {
        endPtsOfContours.push(code[i] << 8 | code[i + 1]);
        i += 2;
      }

      var instructionLength = code[i] << 8 | code[i + 1];
      i += 2 + instructionLength;
      var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1;
      var points = [];

      while (points.length < numberOfPoints) {
        flags = code[i++];
        var repeat = 1;

        if (flags & 0x08) {
          repeat += code[i++];
        }

        while (repeat-- > 0) {
          points.push({
            flags: flags
          });
        }
      }

      for (j = 0; j < numberOfPoints; j++) {
        switch (points[j].flags & 0x12) {
          case 0x00:
            x += (code[i] << 24 | code[i + 1] << 16) >> 16;
            i += 2;
            break;

          case 0x02:
            x -= code[i++];
            break;

          case 0x12:
            x += code[i++];
            break;
        }

        points[j].x = x;
      }

      for (j = 0; j < numberOfPoints; j++) {
        switch (points[j].flags & 0x24) {
          case 0x00:
            y += (code[i] << 24 | code[i + 1] << 16) >> 16;
            i += 2;
            break;

          case 0x04:
            y -= code[i++];
            break;

          case 0x24:
            y += code[i++];
            break;
        }

        points[j].y = y;
      }

      var startPoint = 0;

      for (i = 0; i < numberOfContours; i++) {
        var endPoint = endPtsOfContours[i];
        var contour = points.slice(startPoint, endPoint + 1);

        if (contour[0].flags & 1) {
          contour.push(contour[0]);
        } else if (contour[contour.length - 1].flags & 1) {
          contour.unshift(contour[contour.length - 1]);
        } else {
          var p = {
            flags: 1,
            x: (contour[0].x + contour[contour.length - 1].x) / 2,
            y: (contour[0].y + contour[contour.length - 1].y) / 2
          };
          contour.unshift(p);
          contour.push(p);
        }

        moveTo(contour[0].x, contour[0].y);

        for (j = 1, jj = contour.length; j < jj; j++) {
          if (contour[j].flags & 1) {
            lineTo(contour[j].x, contour[j].y);
          } else if (contour[j + 1].flags & 1) {
            quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y);
            j++;
          } else {
            quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2);
          }
        }

        startPoint = endPoint + 1;
      }
    }
  }

  function compileCharString(code, cmds, font, glyphId) {
    var stack = [];
    var x = 0,
        y = 0;
    var stems = 0;

    function moveTo(x, y) {
      cmds.push({
        cmd: 'moveTo',
        args: [x, y]
      });
    }

    function lineTo(x, y) {
      cmds.push({
        cmd: 'lineTo',
        args: [x, y]
      });
    }

    function bezierCurveTo(x1, y1, x2, y2, x, y) {
      cmds.push({
        cmd: 'bezierCurveTo',
        args: [x1, y1, x2, y2, x, y]
      });
    }

    function parse(code) {
      var i = 0;

      while (i < code.length) {
        var stackClean = false;
        var v = code[i++];
        var xa, xb, ya, yb, y1, y2, y3, n, subrCode;

        switch (v) {
          case 1:
            stems += stack.length >> 1;
            stackClean = true;
            break;

          case 3:
            stems += stack.length >> 1;
            stackClean = true;
            break;

          case 4:
            y += stack.pop();
            moveTo(x, y);
            stackClean = true;
            break;

          case 5:
            while (stack.length > 0) {
              x += stack.shift();
              y += stack.shift();
              lineTo(x, y);
            }

            break;

          case 6:
            while (stack.length > 0) {
              x += stack.shift();
              lineTo(x, y);

              if (stack.length === 0) {
                break;
              }

              y += stack.shift();
              lineTo(x, y);
            }

            break;

          case 7:
            while (stack.length > 0) {
              y += stack.shift();
              lineTo(x, y);

              if (stack.length === 0) {
                break;
              }

              x += stack.shift();
              lineTo(x, y);
            }

            break;

          case 8:
            while (stack.length > 0) {
              xa = x + stack.shift();
              ya = y + stack.shift();
              xb = xa + stack.shift();
              yb = ya + stack.shift();
              x = xb + stack.shift();
              y = yb + stack.shift();
              bezierCurveTo(xa, ya, xb, yb, x, y);
            }

            break;

          case 10:
            n = stack.pop();
            subrCode = null;

            if (font.isCFFCIDFont) {
              var fdIndex = font.fdSelect.getFDIndex(glyphId);

              if (fdIndex >= 0 && fdIndex < font.fdArray.length) {
                var fontDict = font.fdArray[fdIndex],
                    subrs = void 0;

                if (fontDict.privateDict && fontDict.privateDict.subrsIndex) {
                  subrs = fontDict.privateDict.subrsIndex.objects;
                }

                if (subrs) {
                  var numSubrs = subrs.length;
                  n += numSubrs < 1240 ? 107 : numSubrs < 33900 ? 1131 : 32768;
                  subrCode = subrs[n];
                }
              } else {
                (0, _util.warn)('Invalid fd index for glyph index.');
              }
            } else {
              subrCode = font.subrs[n + font.subrsBias];
            }

            if (subrCode) {
              parse(subrCode);
            }

            break;

          case 11:
            return;

          case 12:
            v = code[i++];

            switch (v) {
              case 34:
                xa = x + stack.shift();
                xb = xa + stack.shift();
                y1 = y + stack.shift();
                x = xb + stack.shift();
                bezierCurveTo(xa, y, xb, y1, x, y1);
                xa = x + stack.shift();
                xb = xa + stack.shift();
                x = xb + stack.shift();
                bezierCurveTo(xa, y1, xb, y, x, y);
                break;

              case 35:
                xa = x + stack.shift();
                ya = y + stack.shift();
                xb = xa + stack.shift();
                yb = ya + stack.shift();
                x = xb + stack.shift();
                y = yb + stack.shift();
                bezierCurveTo(xa, ya, xb, yb, x, y);
                xa = x + stack.shift();
                ya = y + stack.shift();
                xb = xa + stack.shift();
                yb = ya + stack.shift();
                x = xb + stack.shift();
                y = yb + stack.shift();
                bezierCurveTo(xa, ya, xb, yb, x, y);
                stack.pop();
                break;

              case 36:
                xa = x + stack.shift();
                y1 = y + stack.shift();
                xb = xa + stack.shift();
                y2 = y1 + stack.shift();
                x = xb + stack.shift();
                bezierCurveTo(xa, y1, xb, y2, x, y2);
                xa = x + stack.shift();
                xb = xa + stack.shift();
                y3 = y2 + stack.shift();
                x = xb + stack.shift();
                bezierCurveTo(xa, y2, xb, y3, x, y);
                break;

              case 37:
                var x0 = x,
                    y0 = y;
                xa = x + stack.shift();
                ya = y + stack.shift();
                xb = xa + stack.shift();
                yb = ya + stack.shift();
                x = xb + stack.shift();
                y = yb + stack.shift();
                bezierCurveTo(xa, ya, xb, yb, x, y);
                xa = x + stack.shift();
                ya = y + stack.shift();
                xb = xa + stack.shift();
                yb = ya + stack.shift();
                x = xb;
                y = yb;

                if (Math.abs(x - x0) > Math.abs(y - y0)) {
                  x += stack.shift();
                } else {
                  y += stack.shift();
                }

                bezierCurveTo(xa, ya, xb, yb, x, y);
                break;

              default:
                throw new _util.FormatError("unknown operator: 12 ".concat(v));
            }

            break;

          case 14:
            if (stack.length >= 4) {
              var achar = stack.pop();
              var bchar = stack.pop();
              y = stack.pop();
              x = stack.pop();
              cmds.push({
                cmd: 'save'
              });
              cmds.push({
                cmd: 'translate',
                args: [x, y]
              });
              var cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[achar]]));
              compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);
              cmds.push({
                cmd: 'restore'
              });
              cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[bchar]]));
              compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);
            }

            return;

          case 18:
            stems += stack.length >> 1;
            stackClean = true;
            break;

          case 19:
            stems += stack.length >> 1;
            i += stems + 7 >> 3;
            stackClean = true;
            break;

          case 20:
            stems += stack.length >> 1;
            i += stems + 7 >> 3;
            stackClean = true;
            break;

          case 21:
            y += stack.pop();
            x += stack.pop();
            moveTo(x, y);
            stackClean = true;
            break;

          case 22:
            x += stack.pop();
            moveTo(x, y);
            stackClean = true;
            break;

          case 23:
            stems += stack.length >> 1;
            stackClean = true;
            break;

          case 24:
            while (stack.length > 2) {
              xa = x + stack.shift();
              ya = y + stack.shift();
              xb = xa + stack.shift();
              yb = ya + stack.shift();
              x = xb + stack.shift();
              y = yb + stack.shift();
              bezierCurveTo(xa, ya, xb, yb, x, y);
            }

            x += stack.shift();
            y += stack.shift();
            lineTo(x, y);
            break;

          case 25:
            while (stack.length > 6) {
              x += stack.shift();
              y += stack.shift();
              lineTo(x, y);
            }

            xa = x + stack.shift();
            ya = y + stack.shift();
            xb = xa + stack.shift();
            yb = ya + stack.shift();
            x = xb + stack.shift();
            y = yb + stack.shift();
            bezierCurveTo(xa, ya, xb, yb, x, y);
            break;

          case 26:
            if (stack.length % 2) {
              x += stack.shift();
            }

            while (stack.length > 0) {
              xa = x;
              ya = y + stack.shift();
              xb = xa + stack.shift();
              yb = ya + stack.shift();
              x = xb;
              y = yb + stack.shift();
              bezierCurveTo(xa, ya, xb, yb, x, y);
            }

            break;

          case 27:
            if (stack.length % 2) {
              y += stack.shift();
            }

            while (stack.length > 0) {
              xa = x + stack.shift();
              ya = y;
              xb = xa + stack.shift();
              yb = ya + stack.shift();
              x = xb + stack.shift();
              y = yb;
              bezierCurveTo(xa, ya, xb, yb, x, y);
            }

            break;

          case 28:
            stack.push((code[i] << 24 | code[i + 1] << 16) >> 16);
            i += 2;
            break;

          case 29:
            n = stack.pop() + font.gsubrsBias;
            subrCode = font.gsubrs[n];

            if (subrCode) {
              parse(subrCode);
            }

            break;

          case 30:
            while (stack.length > 0) {
              xa = x;
              ya = y + stack.shift();
              xb = xa + stack.shift();
              yb = ya + stack.shift();
              x = xb + stack.shift();
              y = yb + (stack.length === 1 ? stack.shift() : 0);
              bezierCurveTo(xa, ya, xb, yb, x, y);

              if (stack.length === 0) {
                break;
              }

              xa = x + stack.shift();
              ya = y;
              xb = xa + stack.shift();
              yb = ya + stack.shift();
              y = yb + stack.shift();
              x = xb + (stack.length === 1 ? stack.shift() : 0);
              bezierCurveTo(xa, ya, xb, yb, x, y);
            }

            break;

          case 31:
            while (stack.length > 0) {
              xa = x + stack.shift();
              ya = y;
              xb = xa + stack.shift();
              yb = ya + stack.shift();
              y = yb + stack.shift();
              x = xb + (stack.length === 1 ? stack.shift() : 0);
              bezierCurveTo(xa, ya, xb, yb, x, y);

              if (stack.length === 0) {
                break;
              }

              xa = x;
              ya = y + stack.shift();
              xb = xa + stack.shift();
              yb = ya + stack.shift();
              x = xb + stack.shift();
              y = yb + (stack.length === 1 ? stack.shift() : 0);
              bezierCurveTo(xa, ya, xb, yb, x, y);
            }

            break;

          default:
            if (v < 32) {
              throw new _util.FormatError("unknown operator: ".concat(v));
            }

            if (v < 247) {
              stack.push(v - 139);
            } else if (v < 251) {
              stack.push((v - 247) * 256 + code[i++] + 108);
            } else if (v < 255) {
              stack.push(-(v - 251) * 256 - code[i++] - 108);
            } else {
              stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536);
              i += 4;
            }

            break;
        }

        if (stackClean) {
          stack.length = 0;
        }
      }
    }

    parse(code);
  }

  var NOOP = [];

  var CompiledFont =
  /*#__PURE__*/
  function () {
    function CompiledFont(fontMatrix) {
      _classCallCheck(this, CompiledFont);

      if (this.constructor === CompiledFont) {
        (0, _util.unreachable)('Cannot initialize CompiledFont.');
      }

      this.fontMatrix = fontMatrix;
      this.compiledGlyphs = Object.create(null);
      this.compiledCharCodeToGlyphId = Object.create(null);
    }

    _createClass(CompiledFont, [{
      key: "getPathJs",
      value: function getPathJs(unicode) {
        var cmap = lookupCmap(this.cmap, unicode);
        var fn = this.compiledGlyphs[cmap.glyphId];

        if (!fn) {
          fn = this.compileGlyph(this.glyphs[cmap.glyphId], cmap.glyphId);
          this.compiledGlyphs[cmap.glyphId] = fn;
        }

        if (this.compiledCharCodeToGlyphId[cmap.charCode] === undefined) {
          this.compiledCharCodeToGlyphId[cmap.charCode] = cmap.glyphId;
        }

        return fn;
      }
    }, {
      key: "compileGlyph",
      value: function compileGlyph(code, glyphId) {
        if (!code || code.length === 0 || code[0] === 14) {
          return NOOP;
        }

        var fontMatrix = this.fontMatrix;

        if (this.isCFFCIDFont) {
          var fdIndex = this.fdSelect.getFDIndex(glyphId);

          if (fdIndex >= 0 && fdIndex < this.fdArray.length) {
            var fontDict = this.fdArray[fdIndex];
            fontMatrix = fontDict.getByName('FontMatrix') || _util.FONT_IDENTITY_MATRIX;
          } else {
            (0, _util.warn)('Invalid fd index for glyph index.');
          }
        }

        var cmds = [];
        cmds.push({
          cmd: 'save'
        });
        cmds.push({
          cmd: 'transform',
          args: fontMatrix.slice()
        });
        cmds.push({
          cmd: 'scale',
          args: ['size', '-size']
        });
        this.compileGlyphImpl(code, cmds, glyphId);
        cmds.push({
          cmd: 'restore'
        });
        return cmds;
      }
    }, {
      key: "compileGlyphImpl",
      value: function compileGlyphImpl() {
        (0, _util.unreachable)('Children classes should implement this.');
      }
    }, {
      key: "hasBuiltPath",
      value: function hasBuiltPath(unicode) {
        var cmap = lookupCmap(this.cmap, unicode);
        return this.compiledGlyphs[cmap.glyphId] !== undefined && this.compiledCharCodeToGlyphId[cmap.charCode] !== undefined;
      }
    }]);

    return CompiledFont;
  }();

  var TrueTypeCompiled =
  /*#__PURE__*/
  function (_CompiledFont) {
    _inherits(TrueTypeCompiled, _CompiledFont);

    function TrueTypeCompiled(glyphs, cmap, fontMatrix) {
      var _this;

      _classCallCheck(this, TrueTypeCompiled);

      _this = _possibleConstructorReturn(this, _getPrototypeOf(TrueTypeCompiled).call(this, fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]));
      _this.glyphs = glyphs;
      _this.cmap = cmap;
      return _this;
    }

    _createClass(TrueTypeCompiled, [{
      key: "compileGlyphImpl",
      value: function compileGlyphImpl(code, cmds) {
        compileGlyf(code, cmds, this);
      }
    }]);

    return TrueTypeCompiled;
  }(CompiledFont);

  var Type2Compiled =
  /*#__PURE__*/
  function (_CompiledFont2) {
    _inherits(Type2Compiled, _CompiledFont2);

    function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) {
      var _this2;

      _classCallCheck(this, Type2Compiled);

      _this2 = _possibleConstructorReturn(this, _getPrototypeOf(Type2Compiled).call(this, fontMatrix || [0.001, 0, 0, 0.001, 0, 0]));
      _this2.glyphs = cffInfo.glyphs;
      _this2.gsubrs = cffInfo.gsubrs || [];
      _this2.subrs = cffInfo.subrs || [];
      _this2.cmap = cmap;
      _this2.glyphNameMap = glyphNameMap || (0, _glyphlist.getGlyphsUnicode)();
      _this2.gsubrsBias = _this2.gsubrs.length < 1240 ? 107 : _this2.gsubrs.length < 33900 ? 1131 : 32768;
      _this2.subrsBias = _this2.subrs.length < 1240 ? 107 : _this2.subrs.length < 33900 ? 1131 : 32768;
      _this2.isCFFCIDFont = cffInfo.isCFFCIDFont;
      _this2.fdSelect = cffInfo.fdSelect;
      _this2.fdArray = cffInfo.fdArray;
      return _this2;
    }

    _createClass(Type2Compiled, [{
      key: "compileGlyphImpl",
      value: function compileGlyphImpl(code, cmds, glyphId) {
        compileCharString(code, cmds, this, glyphId);
      }
    }]);

    return Type2Compiled;
  }(CompiledFont);

  return {
    create: function FontRendererFactory_create(font, seacAnalysisEnabled) {
      var data = new Uint8Array(font.data);
      var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;
      var numTables = getUshort(data, 4);

      for (var i = 0, p = 12; i < numTables; i++, p += 16) {
        var tag = (0, _util.bytesToString)(data.subarray(p, p + 4));
        var offset = getLong(data, p + 8);
        var length = getLong(data, p + 12);

        switch (tag) {
          case 'cmap':
            cmap = parseCmap(data, offset, offset + length);
            break;

          case 'glyf':
            glyf = data.subarray(offset, offset + length);
            break;

          case 'loca':
            loca = data.subarray(offset, offset + length);
            break;

          case 'head':
            unitsPerEm = getUshort(data, offset + 18);
            indexToLocFormat = getUshort(data, offset + 50);
            break;

          case 'CFF ':
            cff = parseCff(data, offset, offset + length, seacAnalysisEnabled);
            break;
        }
      }

      if (glyf) {
        var fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0];
        return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);
      }

      return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap);
    }
  };
}();

exports.FontRendererFactory = FontRendererFactory;

/***/ }),
/* 181 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Type1Parser = void 0;

var _util = __w_pdfjs_require__(6);

var _encodings = __w_pdfjs_require__(176);

var _stream = __w_pdfjs_require__(157);

var HINTING_ENABLED = false;

var Type1CharString = function Type1CharStringClosure() {
  var COMMAND_MAP = {
    'hstem': [1],
    'vstem': [3],
    'vmoveto': [4],
    'rlineto': [5],
    'hlineto': [6],
    'vlineto': [7],
    'rrcurveto': [8],
    'callsubr': [10],
    'flex': [12, 35],
    'drop': [12, 18],
    'endchar': [14],
    'rmoveto': [21],
    'hmoveto': [22],
    'vhcurveto': [30],
    'hvcurveto': [31]
  };

  function Type1CharString() {
    this.width = 0;
    this.lsb = 0;
    this.flexing = false;
    this.output = [];
    this.stack = [];
  }

  Type1CharString.prototype = {
    convert: function Type1CharString_convert(encoded, subrs, seacAnalysisEnabled) {
      var count = encoded.length;
      var error = false;
      var wx, sbx, subrNumber;

      for (var i = 0; i < count; i++) {
        var value = encoded[i];

        if (value < 32) {
          if (value === 12) {
            value = (value << 8) + encoded[++i];
          }

          switch (value) {
            case 1:
              if (!HINTING_ENABLED) {
                this.stack = [];
                break;
              }

              error = this.executeCommand(2, COMMAND_MAP.hstem);
              break;

            case 3:
              if (!HINTING_ENABLED) {
                this.stack = [];
                break;
              }

              error = this.executeCommand(2, COMMAND_MAP.vstem);
              break;

            case 4:
              if (this.flexing) {
                if (this.stack.length < 1) {
                  error = true;
                  break;
                }

                var dy = this.stack.pop();
                this.stack.push(0, dy);
                break;
              }

              error = this.executeCommand(1, COMMAND_MAP.vmoveto);
              break;

            case 5:
              error = this.executeCommand(2, COMMAND_MAP.rlineto);
              break;

            case 6:
              error = this.executeCommand(1, COMMAND_MAP.hlineto);
              break;

            case 7:
              error = this.executeCommand(1, COMMAND_MAP.vlineto);
              break;

            case 8:
              error = this.executeCommand(6, COMMAND_MAP.rrcurveto);
              break;

            case 9:
              this.stack = [];
              break;

            case 10:
              if (this.stack.length < 1) {
                error = true;
                break;
              }

              subrNumber = this.stack.pop();

              if (!subrs[subrNumber]) {
                error = true;
                break;
              }

              error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled);
              break;

            case 11:
              return error;

            case 13:
              if (this.stack.length < 2) {
                error = true;
                break;
              }

              wx = this.stack.pop();
              sbx = this.stack.pop();
              this.lsb = sbx;
              this.width = wx;
              this.stack.push(wx, sbx);
              error = this.executeCommand(2, COMMAND_MAP.hmoveto);
              break;

            case 14:
              this.output.push(COMMAND_MAP.endchar[0]);
              break;

            case 21:
              if (this.flexing) {
                break;
              }

              error = this.executeCommand(2, COMMAND_MAP.rmoveto);
              break;

            case 22:
              if (this.flexing) {
                this.stack.push(0);
                break;
              }

              error = this.executeCommand(1, COMMAND_MAP.hmoveto);
              break;

            case 30:
              error = this.executeCommand(4, COMMAND_MAP.vhcurveto);
              break;

            case 31:
              error = this.executeCommand(4, COMMAND_MAP.hvcurveto);
              break;

            case (12 << 8) + 0:
              this.stack = [];
              break;

            case (12 << 8) + 1:
              if (!HINTING_ENABLED) {
                this.stack = [];
                break;
              }

              error = this.executeCommand(2, COMMAND_MAP.vstem);
              break;

            case (12 << 8) + 2:
              if (!HINTING_ENABLED) {
                this.stack = [];
                break;
              }

              error = this.executeCommand(2, COMMAND_MAP.hstem);
              break;

            case (12 << 8) + 6:
              if (seacAnalysisEnabled) {
                this.seac = this.stack.splice(-4, 4);
                error = this.executeCommand(0, COMMAND_MAP.endchar);
              } else {
                error = this.executeCommand(4, COMMAND_MAP.endchar);
              }

              break;

            case (12 << 8) + 7:
              if (this.stack.length < 4) {
                error = true;
                break;
              }

              this.stack.pop();
              wx = this.stack.pop();
              var sby = this.stack.pop();
              sbx = this.stack.pop();
              this.lsb = sbx;
              this.width = wx;
              this.stack.push(wx, sbx, sby);
              error = this.executeCommand(3, COMMAND_MAP.rmoveto);
              break;

            case (12 << 8) + 12:
              if (this.stack.length < 2) {
                error = true;
                break;
              }

              var num2 = this.stack.pop();
              var num1 = this.stack.pop();
              this.stack.push(num1 / num2);
              break;

            case (12 << 8) + 16:
              if (this.stack.length < 2) {
                error = true;
                break;
              }

              subrNumber = this.stack.pop();
              var numArgs = this.stack.pop();

              if (subrNumber === 0 && numArgs === 3) {
                var flexArgs = this.stack.splice(this.stack.length - 17, 17);
                this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]);
                error = this.executeCommand(13, COMMAND_MAP.flex, true);
                this.flexing = false;
                this.stack.push(flexArgs[15], flexArgs[16]);
              } else if (subrNumber === 1 && numArgs === 0) {
                this.flexing = true;
              }

              break;

            case (12 << 8) + 17:
              break;

            case (12 << 8) + 33:
              this.stack = [];
              break;

            default:
              (0, _util.warn)('Unknown type 1 charstring command of "' + value + '"');
              break;
          }

          if (error) {
            break;
          }

          continue;
        } else if (value <= 246) {
          value = value - 139;
        } else if (value <= 250) {
          value = (value - 247) * 256 + encoded[++i] + 108;
        } else if (value <= 254) {
          value = -((value - 251) * 256) - encoded[++i] - 108;
        } else {
          value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0;
        }

        this.stack.push(value);
      }

      return error;
    },
    executeCommand: function executeCommand(howManyArgs, command, keepStack) {
      var stackLength = this.stack.length;

      if (howManyArgs > stackLength) {
        return true;
      }

      var start = stackLength - howManyArgs;

      for (var i = start; i < stackLength; i++) {
        var value = this.stack[i];

        if (Number.isInteger(value)) {
          this.output.push(28, value >> 8 & 0xff, value & 0xff);
        } else {
          value = 65536 * value | 0;
          this.output.push(255, value >> 24 & 0xFF, value >> 16 & 0xFF, value >> 8 & 0xFF, value & 0xFF);
        }
      }

      this.output.push.apply(this.output, command);

      if (keepStack) {
        this.stack.splice(start, howManyArgs);
      } else {
        this.stack.length = 0;
      }

      return false;
    }
  };
  return Type1CharString;
}();

var Type1Parser = function Type1ParserClosure() {
  var EEXEC_ENCRYPT_KEY = 55665;
  var CHAR_STRS_ENCRYPT_KEY = 4330;

  function isHexDigit(code) {
    return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102;
  }

  function decrypt(data, key, discardNumber) {
    if (discardNumber >= data.length) {
      return new Uint8Array(0);
    }

    var r = key | 0,
        c1 = 52845,
        c2 = 22719,
        i,
        j;

    for (i = 0; i < discardNumber; i++) {
      r = (data[i] + r) * c1 + c2 & (1 << 16) - 1;
    }

    var count = data.length - discardNumber;
    var decrypted = new Uint8Array(count);

    for (i = discardNumber, j = 0; j < count; i++, j++) {
      var value = data[i];
      decrypted[j] = value ^ r >> 8;
      r = (value + r) * c1 + c2 & (1 << 16) - 1;
    }

    return decrypted;
  }

  function decryptAscii(data, key, discardNumber) {
    var r = key | 0,
        c1 = 52845,
        c2 = 22719;
    var count = data.length,
        maybeLength = count >>> 1;
    var decrypted = new Uint8Array(maybeLength);
    var i, j;

    for (i = 0, j = 0; i < count; i++) {
      var digit1 = data[i];

      if (!isHexDigit(digit1)) {
        continue;
      }

      i++;
      var digit2;

      while (i < count && !isHexDigit(digit2 = data[i])) {
        i++;
      }

      if (i < count) {
        var value = parseInt(String.fromCharCode(digit1, digit2), 16);
        decrypted[j++] = value ^ r >> 8;
        r = (value + r) * c1 + c2 & (1 << 16) - 1;
      }
    }

    return Array.prototype.slice.call(decrypted, discardNumber, j);
  }

  function isSpecial(c) {
    return c === 0x2F || c === 0x5B || c === 0x5D || c === 0x7B || c === 0x7D || c === 0x28 || c === 0x29;
  }

  function Type1Parser(stream, encrypted, seacAnalysisEnabled) {
    if (encrypted) {
      var data = stream.getBytes();
      var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]));
      stream = new _stream.Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4));
    }

    this.seacAnalysisEnabled = !!seacAnalysisEnabled;
    this.stream = stream;
    this.nextChar();
  }

  Type1Parser.prototype = {
    readNumberArray: function Type1Parser_readNumberArray() {
      this.getToken();
      var array = [];

      while (true) {
        var token = this.getToken();

        if (token === null || token === ']' || token === '}') {
          break;
        }

        array.push(parseFloat(token || 0));
      }

      return array;
    },
    readNumber: function Type1Parser_readNumber() {
      var token = this.getToken();
      return parseFloat(token || 0);
    },
    readInt: function Type1Parser_readInt() {
      var token = this.getToken();
      return parseInt(token || 0, 10) | 0;
    },
    readBoolean: function Type1Parser_readBoolean() {
      var token = this.getToken();
      return token === 'true' ? 1 : 0;
    },
    nextChar: function Type1_nextChar() {
      return this.currentChar = this.stream.getByte();
    },
    getToken: function Type1Parser_getToken() {
      var comment = false;
      var ch = this.currentChar;

      while (true) {
        if (ch === -1) {
          return null;
        }

        if (comment) {
          if (ch === 0x0A || ch === 0x0D) {
            comment = false;
          }
        } else if (ch === 0x25) {
          comment = true;
        } else if (!(0, _util.isSpace)(ch)) {
          break;
        }

        ch = this.nextChar();
      }

      if (isSpecial(ch)) {
        this.nextChar();
        return String.fromCharCode(ch);
      }

      var token = '';

      do {
        token += String.fromCharCode(ch);
        ch = this.nextChar();
      } while (ch >= 0 && !(0, _util.isSpace)(ch) && !isSpecial(ch));

      return token;
    },
    readCharStrings: function Type1Parser_readCharStrings(bytes, lenIV) {
      if (lenIV === -1) {
        return bytes;
      }

      return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV);
    },
    extractFontProgram: function Type1Parser_extractFontProgram() {
      var stream = this.stream;
      var subrs = [],
          charstrings = [];
      var privateData = Object.create(null);
      privateData['lenIV'] = 4;
      var program = {
        subrs: [],
        charstrings: [],
        properties: {
          'privateData': privateData
        }
      };
      var token, length, data, lenIV, encoded;

      while ((token = this.getToken()) !== null) {
        if (token !== '/') {
          continue;
        }

        token = this.getToken();

        switch (token) {
          case 'CharStrings':
            this.getToken();
            this.getToken();
            this.getToken();
            this.getToken();

            while (true) {
              token = this.getToken();

              if (token === null || token === 'end') {
                break;
              }

              if (token !== '/') {
                continue;
              }

              var glyph = this.getToken();
              length = this.readInt();
              this.getToken();
              data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);
              lenIV = program.properties.privateData['lenIV'];
              encoded = this.readCharStrings(data, lenIV);
              this.nextChar();
              token = this.getToken();

              if (token === 'noaccess') {
                this.getToken();
              }

              charstrings.push({
                glyph: glyph,
                encoded: encoded
              });
            }

            break;

          case 'Subrs':
            this.readInt();
            this.getToken();

            while (this.getToken() === 'dup') {
              var index = this.readInt();
              length = this.readInt();
              this.getToken();
              data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);
              lenIV = program.properties.privateData['lenIV'];
              encoded = this.readCharStrings(data, lenIV);
              this.nextChar();
              token = this.getToken();

              if (token === 'noaccess') {
                this.getToken();
              }

              subrs[index] = encoded;
            }

            break;

          case 'BlueValues':
          case 'OtherBlues':
          case 'FamilyBlues':
          case 'FamilyOtherBlues':
            var blueArray = this.readNumberArray();

            if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) {
              program.properties.privateData[token] = blueArray;
            }

            break;

          case 'StemSnapH':
          case 'StemSnapV':
            program.properties.privateData[token] = this.readNumberArray();
            break;

          case 'StdHW':
          case 'StdVW':
            program.properties.privateData[token] = this.readNumberArray()[0];
            break;

          case 'BlueShift':
          case 'lenIV':
          case 'BlueFuzz':
          case 'BlueScale':
          case 'LanguageGroup':
          case 'ExpansionFactor':
            program.properties.privateData[token] = this.readNumber();
            break;

          case 'ForceBold':
            program.properties.privateData[token] = this.readBoolean();
            break;
        }
      }

      for (var i = 0; i < charstrings.length; i++) {
        glyph = charstrings[i].glyph;
        encoded = charstrings[i].encoded;
        var charString = new Type1CharString();
        var error = charString.convert(encoded, subrs, this.seacAnalysisEnabled);
        var output = charString.output;

        if (error) {
          output = [14];
        }

        program.charstrings.push({
          glyphName: glyph,
          charstring: output,
          width: charString.width,
          lsb: charString.lsb,
          seac: charString.seac
        });
      }

      return program;
    },
    extractFontHeader: function Type1Parser_extractFontHeader(properties) {
      var token;

      while ((token = this.getToken()) !== null) {
        if (token !== '/') {
          continue;
        }

        token = this.getToken();

        switch (token) {
          case 'FontMatrix':
            var matrix = this.readNumberArray();
            properties.fontMatrix = matrix;
            break;

          case 'Encoding':
            var encodingArg = this.getToken();
            var encoding;

            if (!/^\d+$/.test(encodingArg)) {
              encoding = (0, _encodings.getEncoding)(encodingArg);
            } else {
              encoding = [];
              var size = parseInt(encodingArg, 10) | 0;
              this.getToken();

              for (var j = 0; j < size; j++) {
                token = this.getToken();

                while (token !== 'dup' && token !== 'def') {
                  token = this.getToken();

                  if (token === null) {
                    return;
                  }
                }

                if (token === 'def') {
                  break;
                }

                var index = this.readInt();
                this.getToken();
                var glyph = this.getToken();
                encoding[index] = glyph;
                this.getToken();
              }
            }

            properties.builtInEncoding = encoding;
            break;

          case 'FontBBox':
            var fontBBox = this.readNumberArray();
            properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
            properties.descent = Math.min(fontBBox[1], fontBBox[3]);
            properties.ascentScaled = true;
            break;
        }
      }
    }
  };
  return Type1Parser;
}();

exports.Type1Parser = Type1Parser;

/***/ }),
/* 182 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getTilingPatternIR = getTilingPatternIR;
exports.Pattern = void 0;

var _util = __w_pdfjs_require__(6);

var _colorspace = __w_pdfjs_require__(168);

var _primitives = __w_pdfjs_require__(155);

var ShadingType = {
  FUNCTION_BASED: 1,
  AXIAL: 2,
  RADIAL: 3,
  FREE_FORM_MESH: 4,
  LATTICE_FORM_MESH: 5,
  COONS_PATCH_MESH: 6,
  TENSOR_PATCH_MESH: 7
};

var Pattern = function PatternClosure() {
  function Pattern() {
    (0, _util.unreachable)('should not call Pattern constructor');
  }

  Pattern.prototype = {
    getPattern: function Pattern_getPattern(ctx) {
      (0, _util.unreachable)("Should not call Pattern.getStyle: ".concat(ctx));
    }
  };

  Pattern.parseShading = function (shading, matrix, xref, res, handler, pdfFunctionFactory) {
    var dict = (0, _primitives.isStream)(shading) ? shading.dict : shading;
    var type = dict.get('ShadingType');

    try {
      switch (type) {
        case ShadingType.AXIAL:
        case ShadingType.RADIAL:
          return new Shadings.RadialAxial(dict, matrix, xref, res, pdfFunctionFactory);

        case ShadingType.FREE_FORM_MESH:
        case ShadingType.LATTICE_FORM_MESH:
        case ShadingType.COONS_PATCH_MESH:
        case ShadingType.TENSOR_PATCH_MESH:
          return new Shadings.Mesh(shading, matrix, xref, res, pdfFunctionFactory);

        default:
          throw new _util.FormatError('Unsupported ShadingType: ' + type);
      }
    } catch (ex) {
      if (ex instanceof _util.MissingDataException) {
        throw ex;
      }

      handler.send('UnsupportedFeature', {
        featureId: _util.UNSUPPORTED_FEATURES.shadingPattern
      });
      (0, _util.warn)(ex);
      return new Shadings.Dummy();
    }
  };

  return Pattern;
}();

exports.Pattern = Pattern;
var Shadings = {};
Shadings.SMALL_NUMBER = 1e-6;

Shadings.RadialAxial = function RadialAxialClosure() {
  function RadialAxial(dict, matrix, xref, res, pdfFunctionFactory) {
    this.matrix = matrix;
    this.coordsArr = dict.getArray('Coords');
    this.shadingType = dict.get('ShadingType');
    this.type = 'Pattern';
    var cs = dict.get('ColorSpace', 'CS');
    cs = _colorspace.ColorSpace.parse(cs, xref, res, pdfFunctionFactory);
    this.cs = cs;
    var t0 = 0.0,
        t1 = 1.0;

    if (dict.has('Domain')) {
      var domainArr = dict.getArray('Domain');
      t0 = domainArr[0];
      t1 = domainArr[1];
    }

    var extendStart = false,
        extendEnd = false;

    if (dict.has('Extend')) {
      var extendArr = dict.getArray('Extend');
      extendStart = extendArr[0];
      extendEnd = extendArr[1];
    }

    if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) {
      var x1 = this.coordsArr[0];
      var y1 = this.coordsArr[1];
      var r1 = this.coordsArr[2];
      var x2 = this.coordsArr[3];
      var y2 = this.coordsArr[4];
      var r2 = this.coordsArr[5];
      var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));

      if (r1 <= r2 + distance && r2 <= r1 + distance) {
        (0, _util.warn)('Unsupported radial gradient.');
      }
    }

    this.extendStart = extendStart;
    this.extendEnd = extendEnd;
    var fnObj = dict.get('Function');
    var fn = pdfFunctionFactory.createFromArray(fnObj);
    var diff = t1 - t0;
    var step = diff / 10;
    var colorStops = this.colorStops = [];

    if (t0 >= t1 || step <= 0) {
      (0, _util.info)('Bad shading domain.');
      return;
    }

    var color = new Float32Array(cs.numComps),
        ratio = new Float32Array(1);
    var rgbColor;

    for (var i = t0; i <= t1; i += step) {
      ratio[0] = i;
      fn(ratio, 0, color, 0);
      rgbColor = cs.getRgb(color, 0);

      var cssColor = _util.Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);

      colorStops.push([(i - t0) / diff, cssColor]);
    }

    var background = 'transparent';

    if (dict.has('Background')) {
      rgbColor = cs.getRgb(dict.get('Background'), 0);
      background = _util.Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
    }

    if (!extendStart) {
      colorStops.unshift([0, background]);
      colorStops[1][0] += Shadings.SMALL_NUMBER;
    }

    if (!extendEnd) {
      colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER;
      colorStops.push([1, background]);
    }

    this.colorStops = colorStops;
  }

  RadialAxial.prototype = {
    getIR: function RadialAxial_getIR() {
      var coordsArr = this.coordsArr;
      var shadingType = this.shadingType;
      var type, p0, p1, r0, r1;

      if (shadingType === ShadingType.AXIAL) {
        p0 = [coordsArr[0], coordsArr[1]];
        p1 = [coordsArr[2], coordsArr[3]];
        r0 = null;
        r1 = null;
        type = 'axial';
      } else if (shadingType === ShadingType.RADIAL) {
        p0 = [coordsArr[0], coordsArr[1]];
        p1 = [coordsArr[3], coordsArr[4]];
        r0 = coordsArr[2];
        r1 = coordsArr[5];
        type = 'radial';
      } else {
        (0, _util.unreachable)("getPattern type unknown: ".concat(shadingType));
      }

      var matrix = this.matrix;

      if (matrix) {
        p0 = _util.Util.applyTransform(p0, matrix);
        p1 = _util.Util.applyTransform(p1, matrix);

        if (shadingType === ShadingType.RADIAL) {
          var scale = _util.Util.singularValueDecompose2dScale(matrix);

          r0 *= scale[0];
          r1 *= scale[1];
        }
      }

      return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
    }
  };
  return RadialAxial;
}();

Shadings.Mesh = function MeshClosure() {
  function MeshStreamReader(stream, context) {
    this.stream = stream;
    this.context = context;
    this.buffer = 0;
    this.bufferLength = 0;
    var numComps = context.numComps;
    this.tmpCompsBuf = new Float32Array(numComps);
    var csNumComps = context.colorSpace.numComps;
    this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf;
  }

  MeshStreamReader.prototype = {
    get hasData() {
      if (this.stream.end) {
        return this.stream.pos < this.stream.end;
      }

      if (this.bufferLength > 0) {
        return true;
      }

      var nextByte = this.stream.getByte();

      if (nextByte < 0) {
        return false;
      }

      this.buffer = nextByte;
      this.bufferLength = 8;
      return true;
    },

    readBits: function MeshStreamReader_readBits(n) {
      var buffer = this.buffer;
      var bufferLength = this.bufferLength;

      if (n === 32) {
        if (bufferLength === 0) {
          return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte()) >>> 0;
        }

        buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte();
        var nextByte = this.stream.getByte();
        this.buffer = nextByte & (1 << bufferLength) - 1;
        return (buffer << 8 - bufferLength | (nextByte & 0xFF) >> bufferLength) >>> 0;
      }

      if (n === 8 && bufferLength === 0) {
        return this.stream.getByte();
      }

      while (bufferLength < n) {
        buffer = buffer << 8 | this.stream.getByte();
        bufferLength += 8;
      }

      bufferLength -= n;
      this.bufferLength = bufferLength;
      this.buffer = buffer & (1 << bufferLength) - 1;
      return buffer >> bufferLength;
    },
    align: function MeshStreamReader_align() {
      this.buffer = 0;
      this.bufferLength = 0;
    },
    readFlag: function MeshStreamReader_readFlag() {
      return this.readBits(this.context.bitsPerFlag);
    },
    readCoordinate: function MeshStreamReader_readCoordinate() {
      var bitsPerCoordinate = this.context.bitsPerCoordinate;
      var xi = this.readBits(bitsPerCoordinate);
      var yi = this.readBits(bitsPerCoordinate);
      var decode = this.context.decode;
      var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10;
      return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]];
    },
    readComponents: function MeshStreamReader_readComponents() {
      var numComps = this.context.numComps;
      var bitsPerComponent = this.context.bitsPerComponent;
      var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10;
      var decode = this.context.decode;
      var components = this.tmpCompsBuf;

      for (var i = 0, j = 4; i < numComps; i++, j += 2) {
        var ci = this.readBits(bitsPerComponent);
        components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];
      }

      var color = this.tmpCsCompsBuf;

      if (this.context.colorFn) {
        this.context.colorFn(components, 0, color, 0);
      }

      return this.context.colorSpace.getRgb(color, 0);
    }
  };

  function decodeType4Shading(mesh, reader) {
    var coords = mesh.coords;
    var colors = mesh.colors;
    var operators = [];
    var ps = [];
    var verticesLeft = 0;

    while (reader.hasData) {
      var f = reader.readFlag();
      var coord = reader.readCoordinate();
      var color = reader.readComponents();

      if (verticesLeft === 0) {
        if (!(0 <= f && f <= 2)) {
          throw new _util.FormatError('Unknown type4 flag');
        }

        switch (f) {
          case 0:
            verticesLeft = 3;
            break;

          case 1:
            ps.push(ps[ps.length - 2], ps[ps.length - 1]);
            verticesLeft = 1;
            break;

          case 2:
            ps.push(ps[ps.length - 3], ps[ps.length - 1]);
            verticesLeft = 1;
            break;
        }

        operators.push(f);
      }

      ps.push(coords.length);
      coords.push(coord);
      colors.push(color);
      verticesLeft--;
      reader.align();
    }

    mesh.figures.push({
      type: 'triangles',
      coords: new Int32Array(ps),
      colors: new Int32Array(ps)
    });
  }

  function decodeType5Shading(mesh, reader, verticesPerRow) {
    var coords = mesh.coords;
    var colors = mesh.colors;
    var ps = [];

    while (reader.hasData) {
      var coord = reader.readCoordinate();
      var color = reader.readComponents();
      ps.push(coords.length);
      coords.push(coord);
      colors.push(color);
    }

    mesh.figures.push({
      type: 'lattice',
      coords: new Int32Array(ps),
      colors: new Int32Array(ps),
      verticesPerRow: verticesPerRow
    });
  }

  var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;
  var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;
  var TRIANGLE_DENSITY = 20;

  var getB = function getBClosure() {
    function buildB(count) {
      var lut = [];

      for (var i = 0; i <= count; i++) {
        var t = i / count,
            t_ = 1 - t;
        lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, 3 * t * t * t_, t * t * t]));
      }

      return lut;
    }

    var cache = [];
    return function getB(count) {
      if (!cache[count]) {
        cache[count] = buildB(count);
      }

      return cache[count];
    };
  }();

  function buildFigureFromPatch(mesh, index) {
    var figure = mesh.figures[index];
    (0, _util.assert)(figure.type === 'patch', 'Unexpected patch mesh figure');
    var coords = mesh.coords,
        colors = mesh.colors;
    var pi = figure.coords;
    var ci = figure.colors;
    var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
    var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
    var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
    var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
    var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / (mesh.bounds[2] - mesh.bounds[0]));
    splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));
    var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / (mesh.bounds[3] - mesh.bounds[1]));
    splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));
    var verticesPerRow = splitXBy + 1;
    var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);
    var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);
    var k = 0;
    var cl = new Uint8Array(3),
        cr = new Uint8Array(3);
    var c0 = colors[ci[0]],
        c1 = colors[ci[1]],
        c2 = colors[ci[2]],
        c3 = colors[ci[3]];
    var bRow = getB(splitYBy),
        bCol = getB(splitXBy);

    for (var row = 0; row <= splitYBy; row++) {
      cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0;
      cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0;
      cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0;
      cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0;
      cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0;
      cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0;

      for (var col = 0; col <= splitXBy; col++, k++) {
        if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) {
          continue;
        }

        var x = 0,
            y = 0;
        var q = 0;

        for (var i = 0; i <= 3; i++) {
          for (var j = 0; j <= 3; j++, q++) {
            var m = bRow[row][i] * bCol[col][j];
            x += coords[pi[q]][0] * m;
            y += coords[pi[q]][1] * m;
          }
        }

        figureCoords[k] = coords.length;
        coords.push([x, y]);
        figureColors[k] = colors.length;
        var newColor = new Uint8Array(3);
        newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0;
        newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0;
        newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0;
        colors.push(newColor);
      }
    }

    figureCoords[0] = pi[0];
    figureColors[0] = ci[0];
    figureCoords[splitXBy] = pi[3];
    figureColors[splitXBy] = ci[1];
    figureCoords[verticesPerRow * splitYBy] = pi[12];
    figureColors[verticesPerRow * splitYBy] = ci[2];
    figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];
    figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];
    mesh.figures[index] = {
      type: 'lattice',
      coords: figureCoords,
      colors: figureColors,
      verticesPerRow: verticesPerRow
    };
  }

  function decodeType6Shading(mesh, reader) {
    var coords = mesh.coords;
    var colors = mesh.colors;
    var ps = new Int32Array(16);
    var cs = new Int32Array(4);

    while (reader.hasData) {
      var f = reader.readFlag();

      if (!(0 <= f && f <= 3)) {
        throw new _util.FormatError('Unknown type6 flag');
      }

      var i, ii;
      var pi = coords.length;

      for (i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) {
        coords.push(reader.readCoordinate());
      }

      var ci = colors.length;

      for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
        colors.push(reader.readComponents());
      }

      var tmp1, tmp2, tmp3, tmp4;

      switch (f) {
        case 0:
          ps[12] = pi + 3;
          ps[13] = pi + 4;
          ps[14] = pi + 5;
          ps[15] = pi + 6;
          ps[8] = pi + 2;
          ps[11] = pi + 7;
          ps[4] = pi + 1;
          ps[7] = pi + 8;
          ps[0] = pi;
          ps[1] = pi + 11;
          ps[2] = pi + 10;
          ps[3] = pi + 9;
          cs[2] = ci + 1;
          cs[3] = ci + 2;
          cs[0] = ci;
          cs[1] = ci + 3;
          break;

        case 1:
          tmp1 = ps[12];
          tmp2 = ps[13];
          tmp3 = ps[14];
          tmp4 = ps[15];
          ps[12] = tmp4;
          ps[13] = pi + 0;
          ps[14] = pi + 1;
          ps[15] = pi + 2;
          ps[8] = tmp3;
          ps[11] = pi + 3;
          ps[4] = tmp2;
          ps[7] = pi + 4;
          ps[0] = tmp1;
          ps[1] = pi + 7;
          ps[2] = pi + 6;
          ps[3] = pi + 5;
          tmp1 = cs[2];
          tmp2 = cs[3];
          cs[2] = tmp2;
          cs[3] = ci;
          cs[0] = tmp1;
          cs[1] = ci + 1;
          break;

        case 2:
          tmp1 = ps[15];
          tmp2 = ps[11];
          ps[12] = ps[3];
          ps[13] = pi + 0;
          ps[14] = pi + 1;
          ps[15] = pi + 2;
          ps[8] = ps[7];
          ps[11] = pi + 3;
          ps[4] = tmp2;
          ps[7] = pi + 4;
          ps[0] = tmp1;
          ps[1] = pi + 7;
          ps[2] = pi + 6;
          ps[3] = pi + 5;
          tmp1 = cs[3];
          cs[2] = cs[1];
          cs[3] = ci;
          cs[0] = tmp1;
          cs[1] = ci + 1;
          break;

        case 3:
          ps[12] = ps[0];
          ps[13] = pi + 0;
          ps[14] = pi + 1;
          ps[15] = pi + 2;
          ps[8] = ps[1];
          ps[11] = pi + 3;
          ps[4] = ps[2];
          ps[7] = pi + 4;
          ps[0] = ps[3];
          ps[1] = pi + 7;
          ps[2] = pi + 6;
          ps[3] = pi + 5;
          cs[2] = cs[0];
          cs[3] = ci;
          cs[0] = cs[1];
          cs[1] = ci + 1;
          break;
      }

      ps[5] = coords.length;
      coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]);
      ps[6] = coords.length;
      coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]);
      ps[9] = coords.length;
      coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]);
      ps[10] = coords.length;
      coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]);
      mesh.figures.push({
        type: 'patch',
        coords: new Int32Array(ps),
        colors: new Int32Array(cs)
      });
    }
  }

  function decodeType7Shading(mesh, reader) {
    var coords = mesh.coords;
    var colors = mesh.colors;
    var ps = new Int32Array(16);
    var cs = new Int32Array(4);

    while (reader.hasData) {
      var f = reader.readFlag();

      if (!(0 <= f && f <= 3)) {
        throw new _util.FormatError('Unknown type7 flag');
      }

      var i, ii;
      var pi = coords.length;

      for (i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) {
        coords.push(reader.readCoordinate());
      }

      var ci = colors.length;

      for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
        colors.push(reader.readComponents());
      }

      var tmp1, tmp2, tmp3, tmp4;

      switch (f) {
        case 0:
          ps[12] = pi + 3;
          ps[13] = pi + 4;
          ps[14] = pi + 5;
          ps[15] = pi + 6;
          ps[8] = pi + 2;
          ps[9] = pi + 13;
          ps[10] = pi + 14;
          ps[11] = pi + 7;
          ps[4] = pi + 1;
          ps[5] = pi + 12;
          ps[6] = pi + 15;
          ps[7] = pi + 8;
          ps[0] = pi;
          ps[1] = pi + 11;
          ps[2] = pi + 10;
          ps[3] = pi + 9;
          cs[2] = ci + 1;
          cs[3] = ci + 2;
          cs[0] = ci;
          cs[1] = ci + 3;
          break;

        case 1:
          tmp1 = ps[12];
          tmp2 = ps[13];
          tmp3 = ps[14];
          tmp4 = ps[15];
          ps[12] = tmp4;
          ps[13] = pi + 0;
          ps[14] = pi + 1;
          ps[15] = pi + 2;
          ps[8] = tmp3;
          ps[9] = pi + 9;
          ps[10] = pi + 10;
          ps[11] = pi + 3;
          ps[4] = tmp2;
          ps[5] = pi + 8;
          ps[6] = pi + 11;
          ps[7] = pi + 4;
          ps[0] = tmp1;
          ps[1] = pi + 7;
          ps[2] = pi + 6;
          ps[3] = pi + 5;
          tmp1 = cs[2];
          tmp2 = cs[3];
          cs[2] = tmp2;
          cs[3] = ci;
          cs[0] = tmp1;
          cs[1] = ci + 1;
          break;

        case 2:
          tmp1 = ps[15];
          tmp2 = ps[11];
          ps[12] = ps[3];
          ps[13] = pi + 0;
          ps[14] = pi + 1;
          ps[15] = pi + 2;
          ps[8] = ps[7];
          ps[9] = pi + 9;
          ps[10] = pi + 10;
          ps[11] = pi + 3;
          ps[4] = tmp2;
          ps[5] = pi + 8;
          ps[6] = pi + 11;
          ps[7] = pi + 4;
          ps[0] = tmp1;
          ps[1] = pi + 7;
          ps[2] = pi + 6;
          ps[3] = pi + 5;
          tmp1 = cs[3];
          cs[2] = cs[1];
          cs[3] = ci;
          cs[0] = tmp1;
          cs[1] = ci + 1;
          break;

        case 3:
          ps[12] = ps[0];
          ps[13] = pi + 0;
          ps[14] = pi + 1;
          ps[15] = pi + 2;
          ps[8] = ps[1];
          ps[9] = pi + 9;
          ps[10] = pi + 10;
          ps[11] = pi + 3;
          ps[4] = ps[2];
          ps[5] = pi + 8;
          ps[6] = pi + 11;
          ps[7] = pi + 4;
          ps[0] = ps[3];
          ps[1] = pi + 7;
          ps[2] = pi + 6;
          ps[3] = pi + 5;
          cs[2] = cs[0];
          cs[3] = ci;
          cs[0] = cs[1];
          cs[1] = ci + 1;
          break;
      }

      mesh.figures.push({
        type: 'patch',
        coords: new Int32Array(ps),
        colors: new Int32Array(cs)
      });
    }
  }

  function updateBounds(mesh) {
    var minX = mesh.coords[0][0],
        minY = mesh.coords[0][1],
        maxX = minX,
        maxY = minY;

    for (var i = 1, ii = mesh.coords.length; i < ii; i++) {
      var x = mesh.coords[i][0],
          y = mesh.coords[i][1];
      minX = minX > x ? x : minX;
      minY = minY > y ? y : minY;
      maxX = maxX < x ? x : maxX;
      maxY = maxY < y ? y : maxY;
    }

    mesh.bounds = [minX, minY, maxX, maxY];
  }

  function packData(mesh) {
    var i, ii, j, jj;
    var coords = mesh.coords;
    var coordsPacked = new Float32Array(coords.length * 2);

    for (i = 0, j = 0, ii = coords.length; i < ii; i++) {
      var xy = coords[i];
      coordsPacked[j++] = xy[0];
      coordsPacked[j++] = xy[1];
    }

    mesh.coords = coordsPacked;
    var colors = mesh.colors;
    var colorsPacked = new Uint8Array(colors.length * 3);

    for (i = 0, j = 0, ii = colors.length; i < ii; i++) {
      var c = colors[i];
      colorsPacked[j++] = c[0];
      colorsPacked[j++] = c[1];
      colorsPacked[j++] = c[2];
    }

    mesh.colors = colorsPacked;
    var figures = mesh.figures;

    for (i = 0, ii = figures.length; i < ii; i++) {
      var figure = figures[i],
          ps = figure.coords,
          cs = figure.colors;

      for (j = 0, jj = ps.length; j < jj; j++) {
        ps[j] *= 2;
        cs[j] *= 3;
      }
    }
  }

  function Mesh(stream, matrix, xref, res, pdfFunctionFactory) {
    if (!(0, _primitives.isStream)(stream)) {
      throw new _util.FormatError('Mesh data is not a stream');
    }

    var dict = stream.dict;
    this.matrix = matrix;
    this.shadingType = dict.get('ShadingType');
    this.type = 'Pattern';
    this.bbox = dict.getArray('BBox');
    var cs = dict.get('ColorSpace', 'CS');
    cs = _colorspace.ColorSpace.parse(cs, xref, res, pdfFunctionFactory);
    this.cs = cs;
    this.background = dict.has('Background') ? cs.getRgb(dict.get('Background'), 0) : null;
    var fnObj = dict.get('Function');
    var fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null;
    this.coords = [];
    this.colors = [];
    this.figures = [];
    var decodeContext = {
      bitsPerCoordinate: dict.get('BitsPerCoordinate'),
      bitsPerComponent: dict.get('BitsPerComponent'),
      bitsPerFlag: dict.get('BitsPerFlag'),
      decode: dict.getArray('Decode'),
      colorFn: fn,
      colorSpace: cs,
      numComps: fn ? 1 : cs.numComps
    };
    var reader = new MeshStreamReader(stream, decodeContext);
    var patchMesh = false;

    switch (this.shadingType) {
      case ShadingType.FREE_FORM_MESH:
        decodeType4Shading(this, reader);
        break;

      case ShadingType.LATTICE_FORM_MESH:
        var verticesPerRow = dict.get('VerticesPerRow') | 0;

        if (verticesPerRow < 2) {
          throw new _util.FormatError('Invalid VerticesPerRow');
        }

        decodeType5Shading(this, reader, verticesPerRow);
        break;

      case ShadingType.COONS_PATCH_MESH:
        decodeType6Shading(this, reader);
        patchMesh = true;
        break;

      case ShadingType.TENSOR_PATCH_MESH:
        decodeType7Shading(this, reader);
        patchMesh = true;
        break;

      default:
        (0, _util.unreachable)('Unsupported mesh type.');
        break;
    }

    if (patchMesh) {
      updateBounds(this);

      for (var i = 0, ii = this.figures.length; i < ii; i++) {
        buildFigureFromPatch(this, i);
      }
    }

    updateBounds(this);
    packData(this);
  }

  Mesh.prototype = {
    getIR: function Mesh_getIR() {
      return ['Mesh', this.shadingType, this.coords, this.colors, this.figures, this.bounds, this.matrix, this.bbox, this.background];
    }
  };
  return Mesh;
}();

Shadings.Dummy = function DummyClosure() {
  function Dummy() {
    this.type = 'Pattern';
  }

  Dummy.prototype = {
    getIR: function Dummy_getIR() {
      return ['Dummy'];
    }
  };
  return Dummy;
}();

function getTilingPatternIR(operatorList, dict, args) {
  var matrix = dict.getArray('Matrix');

  var bbox = _util.Util.normalizeRect(dict.getArray('BBox'));

  var xstep = dict.get('XStep');
  var ystep = dict.get('YStep');
  var paintType = dict.get('PaintType');
  var tilingType = dict.get('TilingType');

  if (bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) {
    throw new _util.FormatError("Invalid getTilingPatternIR /BBox array: [".concat(bbox, "]."));
  }

  return ['TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType];
}

/***/ }),
/* 183 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.bidi = bidi;

var _util = __w_pdfjs_require__(6);

var baseTypes = ['BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS', 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'ON', 'ES', 'CS', 'ES', 'CS', 'CS', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'CS', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'BN', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON', 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'];
var arabicTypes = ['AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'ON', 'ON', 'AL', 'ET', 'ET', 'AL', 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', '', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AN', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'NSM', 'NSM', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'];

function isOdd(i) {
  return (i & 1) !== 0;
}

function isEven(i) {
  return (i & 1) === 0;
}

function findUnequal(arr, start, value) {
  for (var j = start, jj = arr.length; j < jj; ++j) {
    if (arr[j] !== value) {
      return j;
    }
  }

  return j;
}

function setValues(arr, start, end, value) {
  for (var j = start; j < end; ++j) {
    arr[j] = value;
  }
}

function reverseValues(arr, start, end) {
  for (var i = start, j = end - 1; i < j; ++i, --j) {
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }
}

function createBidiText(str, isLTR, vertical) {
  return {
    str: str,
    dir: vertical ? 'ttb' : isLTR ? 'ltr' : 'rtl'
  };
}

var chars = [];
var types = [];

function bidi(str, startLevel, vertical) {
  var isLTR = true;
  var strLength = str.length;

  if (strLength === 0 || vertical) {
    return createBidiText(str, isLTR, vertical);
  }

  chars.length = strLength;
  types.length = strLength;
  var numBidi = 0;
  var i, ii;

  for (i = 0; i < strLength; ++i) {
    chars[i] = str.charAt(i);
    var charCode = str.charCodeAt(i);
    var charType = 'L';

    if (charCode <= 0x00ff) {
      charType = baseTypes[charCode];
    } else if (0x0590 <= charCode && charCode <= 0x05f4) {
      charType = 'R';
    } else if (0x0600 <= charCode && charCode <= 0x06ff) {
      charType = arabicTypes[charCode & 0xff];

      if (!charType) {
        (0, _util.warn)('Bidi: invalid Unicode character ' + charCode.toString(16));
      }
    } else if (0x0700 <= charCode && charCode <= 0x08AC) {
      charType = 'AL';
    }

    if (charType === 'R' || charType === 'AL' || charType === 'AN') {
      numBidi++;
    }

    types[i] = charType;
  }

  if (numBidi === 0) {
    isLTR = true;
    return createBidiText(str, isLTR);
  }

  if (startLevel === -1) {
    if (numBidi / strLength < 0.3) {
      isLTR = true;
      startLevel = 0;
    } else {
      isLTR = false;
      startLevel = 1;
    }
  }

  var levels = [];

  for (i = 0; i < strLength; ++i) {
    levels[i] = startLevel;
  }

  var e = isOdd(startLevel) ? 'R' : 'L';
  var sor = e;
  var eor = sor;
  var lastType = sor;

  for (i = 0; i < strLength; ++i) {
    if (types[i] === 'NSM') {
      types[i] = lastType;
    } else {
      lastType = types[i];
    }
  }

  lastType = sor;
  var t;

  for (i = 0; i < strLength; ++i) {
    t = types[i];

    if (t === 'EN') {
      types[i] = lastType === 'AL' ? 'AN' : 'EN';
    } else if (t === 'R' || t === 'L' || t === 'AL') {
      lastType = t;
    }
  }

  for (i = 0; i < strLength; ++i) {
    t = types[i];

    if (t === 'AL') {
      types[i] = 'R';
    }
  }

  for (i = 1; i < strLength - 1; ++i) {
    if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') {
      types[i] = 'EN';
    }

    if (types[i] === 'CS' && (types[i - 1] === 'EN' || types[i - 1] === 'AN') && types[i + 1] === types[i - 1]) {
      types[i] = types[i - 1];
    }
  }

  for (i = 0; i < strLength; ++i) {
    if (types[i] === 'EN') {
      var j;

      for (j = i - 1; j >= 0; --j) {
        if (types[j] !== 'ET') {
          break;
        }

        types[j] = 'EN';
      }

      for (j = i + 1; j < strLength; ++j) {
        if (types[j] !== 'ET') {
          break;
        }

        types[j] = 'EN';
      }
    }
  }

  for (i = 0; i < strLength; ++i) {
    t = types[i];

    if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') {
      types[i] = 'ON';
    }
  }

  lastType = sor;

  for (i = 0; i < strLength; ++i) {
    t = types[i];

    if (t === 'EN') {
      types[i] = lastType === 'L' ? 'L' : 'EN';
    } else if (t === 'R' || t === 'L') {
      lastType = t;
    }
  }

  for (i = 0; i < strLength; ++i) {
    if (types[i] === 'ON') {
      var end = findUnequal(types, i + 1, 'ON');
      var before = sor;

      if (i > 0) {
        before = types[i - 1];
      }

      var after = eor;

      if (end + 1 < strLength) {
        after = types[end + 1];
      }

      if (before !== 'L') {
        before = 'R';
      }

      if (after !== 'L') {
        after = 'R';
      }

      if (before === after) {
        setValues(types, i, end, before);
      }

      i = end - 1;
    }
  }

  for (i = 0; i < strLength; ++i) {
    if (types[i] === 'ON') {
      types[i] = e;
    }
  }

  for (i = 0; i < strLength; ++i) {
    t = types[i];

    if (isEven(levels[i])) {
      if (t === 'R') {
        levels[i] += 1;
      } else if (t === 'AN' || t === 'EN') {
        levels[i] += 2;
      }
    } else {
      if (t === 'L' || t === 'AN' || t === 'EN') {
        levels[i] += 1;
      }
    }
  }

  var highestLevel = -1;
  var lowestOddLevel = 99;
  var level;

  for (i = 0, ii = levels.length; i < ii; ++i) {
    level = levels[i];

    if (highestLevel < level) {
      highestLevel = level;
    }

    if (lowestOddLevel > level && isOdd(level)) {
      lowestOddLevel = level;
    }
  }

  for (level = highestLevel; level >= lowestOddLevel; --level) {
    var start = -1;

    for (i = 0, ii = levels.length; i < ii; ++i) {
      if (levels[i] < level) {
        if (start >= 0) {
          reverseValues(chars, start, i);
          start = -1;
        }
      } else if (start < 0) {
        start = i;
      }
    }

    if (start >= 0) {
      reverseValues(chars, start, levels.length);
    }
  }

  for (i = 0, ii = chars.length; i < ii; ++i) {
    var ch = chars[i];

    if (ch === '<' || ch === '>') {
      chars[i] = '';
    }
  }

  return createBidiText(chars.join(''), isLTR);
}

/***/ }),
/* 184 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getMetrics = void 0;

var _util = __w_pdfjs_require__(6);

var getMetrics = (0, _util.getLookupTableFactory)(function (t) {
  t['Courier'] = 600;
  t['Courier-Bold'] = 600;
  t['Courier-BoldOblique'] = 600;
  t['Courier-Oblique'] = 600;
  t['Helvetica'] = (0, _util.getLookupTableFactory)(function (t) {
    t['space'] = 278;
    t['exclam'] = 278;
    t['quotedbl'] = 355;
    t['numbersign'] = 556;
    t['dollar'] = 556;
    t['percent'] = 889;
    t['ampersand'] = 667;
    t['quoteright'] = 222;
    t['parenleft'] = 333;
    t['parenright'] = 333;
    t['asterisk'] = 389;
    t['plus'] = 584;
    t['comma'] = 278;
    t['hyphen'] = 333;
    t['period'] = 278;
    t['slash'] = 278;
    t['zero'] = 556;
    t['one'] = 556;
    t['two'] = 556;
    t['three'] = 556;
    t['four'] = 556;
    t['five'] = 556;
    t['six'] = 556;
    t['seven'] = 556;
    t['eight'] = 556;
    t['nine'] = 556;
    t['colon'] = 278;
    t['semicolon'] = 278;
    t['less'] = 584;
    t['equal'] = 584;
    t['greater'] = 584;
    t['question'] = 556;
    t['at'] = 1015;
    t['A'] = 667;
    t['B'] = 667;
    t['C'] = 722;
    t['D'] = 722;
    t['E'] = 667;
    t['F'] = 611;
    t['G'] = 778;
    t['H'] = 722;
    t['I'] = 278;
    t['J'] = 500;
    t['K'] = 667;
    t['L'] = 556;
    t['M'] = 833;
    t['N'] = 722;
    t['O'] = 778;
    t['P'] = 667;
    t['Q'] = 778;
    t['R'] = 722;
    t['S'] = 667;
    t['T'] = 611;
    t['U'] = 722;
    t['V'] = 667;
    t['W'] = 944;
    t['X'] = 667;
    t['Y'] = 667;
    t['Z'] = 611;
    t['bracketleft'] = 278;
    t['backslash'] = 278;
    t['bracketright'] = 278;
    t['asciicircum'] = 469;
    t['underscore'] = 556;
    t['quoteleft'] = 222;
    t['a'] = 556;
    t['b'] = 556;
    t['c'] = 500;
    t['d'] = 556;
    t['e'] = 556;
    t['f'] = 278;
    t['g'] = 556;
    t['h'] = 556;
    t['i'] = 222;
    t['j'] = 222;
    t['k'] = 500;
    t['l'] = 222;
    t['m'] = 833;
    t['n'] = 556;
    t['o'] = 556;
    t['p'] = 556;
    t['q'] = 556;
    t['r'] = 333;
    t['s'] = 500;
    t['t'] = 278;
    t['u'] = 556;
    t['v'] = 500;
    t['w'] = 722;
    t['x'] = 500;
    t['y'] = 500;
    t['z'] = 500;
    t['braceleft'] = 334;
    t['bar'] = 260;
    t['braceright'] = 334;
    t['asciitilde'] = 584;
    t['exclamdown'] = 333;
    t['cent'] = 556;
    t['sterling'] = 556;
    t['fraction'] = 167;
    t['yen'] = 556;
    t['florin'] = 556;
    t['section'] = 556;
    t['currency'] = 556;
    t['quotesingle'] = 191;
    t['quotedblleft'] = 333;
    t['guillemotleft'] = 556;
    t['guilsinglleft'] = 333;
    t['guilsinglright'] = 333;
    t['fi'] = 500;
    t['fl'] = 500;
    t['endash'] = 556;
    t['dagger'] = 556;
    t['daggerdbl'] = 556;
    t['periodcentered'] = 278;
    t['paragraph'] = 537;
    t['bullet'] = 350;
    t['quotesinglbase'] = 222;
    t['quotedblbase'] = 333;
    t['quotedblright'] = 333;
    t['guillemotright'] = 556;
    t['ellipsis'] = 1000;
    t['perthousand'] = 1000;
    t['questiondown'] = 611;
    t['grave'] = 333;
    t['acute'] = 333;
    t['circumflex'] = 333;
    t['tilde'] = 333;
    t['macron'] = 333;
    t['breve'] = 333;
    t['dotaccent'] = 333;
    t['dieresis'] = 333;
    t['ring'] = 333;
    t['cedilla'] = 333;
    t['hungarumlaut'] = 333;
    t['ogonek'] = 333;
    t['caron'] = 333;
    t['emdash'] = 1000;
    t['AE'] = 1000;
    t['ordfeminine'] = 370;
    t['Lslash'] = 556;
    t['Oslash'] = 778;
    t['OE'] = 1000;
    t['ordmasculine'] = 365;
    t['ae'] = 889;
    t['dotlessi'] = 278;
    t['lslash'] = 222;
    t['oslash'] = 611;
    t['oe'] = 944;
    t['germandbls'] = 611;
    t['Idieresis'] = 278;
    t['eacute'] = 556;
    t['abreve'] = 556;
    t['uhungarumlaut'] = 556;
    t['ecaron'] = 556;
    t['Ydieresis'] = 667;
    t['divide'] = 584;
    t['Yacute'] = 667;
    t['Acircumflex'] = 667;
    t['aacute'] = 556;
    t['Ucircumflex'] = 722;
    t['yacute'] = 500;
    t['scommaaccent'] = 500;
    t['ecircumflex'] = 556;
    t['Uring'] = 722;
    t['Udieresis'] = 722;
    t['aogonek'] = 556;
    t['Uacute'] = 722;
    t['uogonek'] = 556;
    t['Edieresis'] = 667;
    t['Dcroat'] = 722;
    t['commaaccent'] = 250;
    t['copyright'] = 737;
    t['Emacron'] = 667;
    t['ccaron'] = 500;
    t['aring'] = 556;
    t['Ncommaaccent'] = 722;
    t['lacute'] = 222;
    t['agrave'] = 556;
    t['Tcommaaccent'] = 611;
    t['Cacute'] = 722;
    t['atilde'] = 556;
    t['Edotaccent'] = 667;
    t['scaron'] = 500;
    t['scedilla'] = 500;
    t['iacute'] = 278;
    t['lozenge'] = 471;
    t['Rcaron'] = 722;
    t['Gcommaaccent'] = 778;
    t['ucircumflex'] = 556;
    t['acircumflex'] = 556;
    t['Amacron'] = 667;
    t['rcaron'] = 333;
    t['ccedilla'] = 500;
    t['Zdotaccent'] = 611;
    t['Thorn'] = 667;
    t['Omacron'] = 778;
    t['Racute'] = 722;
    t['Sacute'] = 667;
    t['dcaron'] = 643;
    t['Umacron'] = 722;
    t['uring'] = 556;
    t['threesuperior'] = 333;
    t['Ograve'] = 778;
    t['Agrave'] = 667;
    t['Abreve'] = 667;
    t['multiply'] = 584;
    t['uacute'] = 556;
    t['Tcaron'] = 611;
    t['partialdiff'] = 476;
    t['ydieresis'] = 500;
    t['Nacute'] = 722;
    t['icircumflex'] = 278;
    t['Ecircumflex'] = 667;
    t['adieresis'] = 556;
    t['edieresis'] = 556;
    t['cacute'] = 500;
    t['nacute'] = 556;
    t['umacron'] = 556;
    t['Ncaron'] = 722;
    t['Iacute'] = 278;
    t['plusminus'] = 584;
    t['brokenbar'] = 260;
    t['registered'] = 737;
    t['Gbreve'] = 778;
    t['Idotaccent'] = 278;
    t['summation'] = 600;
    t['Egrave'] = 667;
    t['racute'] = 333;
    t['omacron'] = 556;
    t['Zacute'] = 611;
    t['Zcaron'] = 611;
    t['greaterequal'] = 549;
    t['Eth'] = 722;
    t['Ccedilla'] = 722;
    t['lcommaaccent'] = 222;
    t['tcaron'] = 317;
    t['eogonek'] = 556;
    t['Uogonek'] = 722;
    t['Aacute'] = 667;
    t['Adieresis'] = 667;
    t['egrave'] = 556;
    t['zacute'] = 500;
    t['iogonek'] = 222;
    t['Oacute'] = 778;
    t['oacute'] = 556;
    t['amacron'] = 556;
    t['sacute'] = 500;
    t['idieresis'] = 278;
    t['Ocircumflex'] = 778;
    t['Ugrave'] = 722;
    t['Delta'] = 612;
    t['thorn'] = 556;
    t['twosuperior'] = 333;
    t['Odieresis'] = 778;
    t['mu'] = 556;
    t['igrave'] = 278;
    t['ohungarumlaut'] = 556;
    t['Eogonek'] = 667;
    t['dcroat'] = 556;
    t['threequarters'] = 834;
    t['Scedilla'] = 667;
    t['lcaron'] = 299;
    t['Kcommaaccent'] = 667;
    t['Lacute'] = 556;
    t['trademark'] = 1000;
    t['edotaccent'] = 556;
    t['Igrave'] = 278;
    t['Imacron'] = 278;
    t['Lcaron'] = 556;
    t['onehalf'] = 834;
    t['lessequal'] = 549;
    t['ocircumflex'] = 556;
    t['ntilde'] = 556;
    t['Uhungarumlaut'] = 722;
    t['Eacute'] = 667;
    t['emacron'] = 556;
    t['gbreve'] = 556;
    t['onequarter'] = 834;
    t['Scaron'] = 667;
    t['Scommaaccent'] = 667;
    t['Ohungarumlaut'] = 778;
    t['degree'] = 400;
    t['ograve'] = 556;
    t['Ccaron'] = 722;
    t['ugrave'] = 556;
    t['radical'] = 453;
    t['Dcaron'] = 722;
    t['rcommaaccent'] = 333;
    t['Ntilde'] = 722;
    t['otilde'] = 556;
    t['Rcommaaccent'] = 722;
    t['Lcommaaccent'] = 556;
    t['Atilde'] = 667;
    t['Aogonek'] = 667;
    t['Aring'] = 667;
    t['Otilde'] = 778;
    t['zdotaccent'] = 500;
    t['Ecaron'] = 667;
    t['Iogonek'] = 278;
    t['kcommaaccent'] = 500;
    t['minus'] = 584;
    t['Icircumflex'] = 278;
    t['ncaron'] = 556;
    t['tcommaaccent'] = 278;
    t['logicalnot'] = 584;
    t['odieresis'] = 556;
    t['udieresis'] = 556;
    t['notequal'] = 549;
    t['gcommaaccent'] = 556;
    t['eth'] = 556;
    t['zcaron'] = 500;
    t['ncommaaccent'] = 556;
    t['onesuperior'] = 333;
    t['imacron'] = 278;
    t['Euro'] = 556;
  });
  t['Helvetica-Bold'] = (0, _util.getLookupTableFactory)(function (t) {
    t['space'] = 278;
    t['exclam'] = 333;
    t['quotedbl'] = 474;
    t['numbersign'] = 556;
    t['dollar'] = 556;
    t['percent'] = 889;
    t['ampersand'] = 722;
    t['quoteright'] = 278;
    t['parenleft'] = 333;
    t['parenright'] = 333;
    t['asterisk'] = 389;
    t['plus'] = 584;
    t['comma'] = 278;
    t['hyphen'] = 333;
    t['period'] = 278;
    t['slash'] = 278;
    t['zero'] = 556;
    t['one'] = 556;
    t['two'] = 556;
    t['three'] = 556;
    t['four'] = 556;
    t['five'] = 556;
    t['six'] = 556;
    t['seven'] = 556;
    t['eight'] = 556;
    t['nine'] = 556;
    t['colon'] = 333;
    t['semicolon'] = 333;
    t['less'] = 584;
    t['equal'] = 584;
    t['greater'] = 584;
    t['question'] = 611;
    t['at'] = 975;
    t['A'] = 722;
    t['B'] = 722;
    t['C'] = 722;
    t['D'] = 722;
    t['E'] = 667;
    t['F'] = 611;
    t['G'] = 778;
    t['H'] = 722;
    t['I'] = 278;
    t['J'] = 556;
    t['K'] = 722;
    t['L'] = 611;
    t['M'] = 833;
    t['N'] = 722;
    t['O'] = 778;
    t['P'] = 667;
    t['Q'] = 778;
    t['R'] = 722;
    t['S'] = 667;
    t['T'] = 611;
    t['U'] = 722;
    t['V'] = 667;
    t['W'] = 944;
    t['X'] = 667;
    t['Y'] = 667;
    t['Z'] = 611;
    t['bracketleft'] = 333;
    t['backslash'] = 278;
    t['bracketright'] = 333;
    t['asciicircum'] = 584;
    t['underscore'] = 556;
    t['quoteleft'] = 278;
    t['a'] = 556;
    t['b'] = 611;
    t['c'] = 556;
    t['d'] = 611;
    t['e'] = 556;
    t['f'] = 333;
    t['g'] = 611;
    t['h'] = 611;
    t['i'] = 278;
    t['j'] = 278;
    t['k'] = 556;
    t['l'] = 278;
    t['m'] = 889;
    t['n'] = 611;
    t['o'] = 611;
    t['p'] = 611;
    t['q'] = 611;
    t['r'] = 389;
    t['s'] = 556;
    t['t'] = 333;
    t['u'] = 611;
    t['v'] = 556;
    t['w'] = 778;
    t['x'] = 556;
    t['y'] = 556;
    t['z'] = 500;
    t['braceleft'] = 389;
    t['bar'] = 280;
    t['braceright'] = 389;
    t['asciitilde'] = 584;
    t['exclamdown'] = 333;
    t['cent'] = 556;
    t['sterling'] = 556;
    t['fraction'] = 167;
    t['yen'] = 556;
    t['florin'] = 556;
    t['section'] = 556;
    t['currency'] = 556;
    t['quotesingle'] = 238;
    t['quotedblleft'] = 500;
    t['guillemotleft'] = 556;
    t['guilsinglleft'] = 333;
    t['guilsinglright'] = 333;
    t['fi'] = 611;
    t['fl'] = 611;
    t['endash'] = 556;
    t['dagger'] = 556;
    t['daggerdbl'] = 556;
    t['periodcentered'] = 278;
    t['paragraph'] = 556;
    t['bullet'] = 350;
    t['quotesinglbase'] = 278;
    t['quotedblbase'] = 500;
    t['quotedblright'] = 500;
    t['guillemotright'] = 556;
    t['ellipsis'] = 1000;
    t['perthousand'] = 1000;
    t['questiondown'] = 611;
    t['grave'] = 333;
    t['acute'] = 333;
    t['circumflex'] = 333;
    t['tilde'] = 333;
    t['macron'] = 333;
    t['breve'] = 333;
    t['dotaccent'] = 333;
    t['dieresis'] = 333;
    t['ring'] = 333;
    t['cedilla'] = 333;
    t['hungarumlaut'] = 333;
    t['ogonek'] = 333;
    t['caron'] = 333;
    t['emdash'] = 1000;
    t['AE'] = 1000;
    t['ordfeminine'] = 370;
    t['Lslash'] = 611;
    t['Oslash'] = 778;
    t['OE'] = 1000;
    t['ordmasculine'] = 365;
    t['ae'] = 889;
    t['dotlessi'] = 278;
    t['lslash'] = 278;
    t['oslash'] = 611;
    t['oe'] = 944;
    t['germandbls'] = 611;
    t['Idieresis'] = 278;
    t['eacute'] = 556;
    t['abreve'] = 556;
    t['uhungarumlaut'] = 611;
    t['ecaron'] = 556;
    t['Ydieresis'] = 667;
    t['divide'] = 584;
    t['Yacute'] = 667;
    t['Acircumflex'] = 722;
    t['aacute'] = 556;
    t['Ucircumflex'] = 722;
    t['yacute'] = 556;
    t['scommaaccent'] = 556;
    t['ecircumflex'] = 556;
    t['Uring'] = 722;
    t['Udieresis'] = 722;
    t['aogonek'] = 556;
    t['Uacute'] = 722;
    t['uogonek'] = 611;
    t['Edieresis'] = 667;
    t['Dcroat'] = 722;
    t['commaaccent'] = 250;
    t['copyright'] = 737;
    t['Emacron'] = 667;
    t['ccaron'] = 556;
    t['aring'] = 556;
    t['Ncommaaccent'] = 722;
    t['lacute'] = 278;
    t['agrave'] = 556;
    t['Tcommaaccent'] = 611;
    t['Cacute'] = 722;
    t['atilde'] = 556;
    t['Edotaccent'] = 667;
    t['scaron'] = 556;
    t['scedilla'] = 556;
    t['iacute'] = 278;
    t['lozenge'] = 494;
    t['Rcaron'] = 722;
    t['Gcommaaccent'] = 778;
    t['ucircumflex'] = 611;
    t['acircumflex'] = 556;
    t['Amacron'] = 722;
    t['rcaron'] = 389;
    t['ccedilla'] = 556;
    t['Zdotaccent'] = 611;
    t['Thorn'] = 667;
    t['Omacron'] = 778;
    t['Racute'] = 722;
    t['Sacute'] = 667;
    t['dcaron'] = 743;
    t['Umacron'] = 722;
    t['uring'] = 611;
    t['threesuperior'] = 333;
    t['Ograve'] = 778;
    t['Agrave'] = 722;
    t['Abreve'] = 722;
    t['multiply'] = 584;
    t['uacute'] = 611;
    t['Tcaron'] = 611;
    t['partialdiff'] = 494;
    t['ydieresis'] = 556;
    t['Nacute'] = 722;
    t['icircumflex'] = 278;
    t['Ecircumflex'] = 667;
    t['adieresis'] = 556;
    t['edieresis'] = 556;
    t['cacute'] = 556;
    t['nacute'] = 611;
    t['umacron'] = 611;
    t['Ncaron'] = 722;
    t['Iacute'] = 278;
    t['plusminus'] = 584;
    t['brokenbar'] = 280;
    t['registered'] = 737;
    t['Gbreve'] = 778;
    t['Idotaccent'] = 278;
    t['summation'] = 600;
    t['Egrave'] = 667;
    t['racute'] = 389;
    t['omacron'] = 611;
    t['Zacute'] = 611;
    t['Zcaron'] = 611;
    t['greaterequal'] = 549;
    t['Eth'] = 722;
    t['Ccedilla'] = 722;
    t['lcommaaccent'] = 278;
    t['tcaron'] = 389;
    t['eogonek'] = 556;
    t['Uogonek'] = 722;
    t['Aacute'] = 722;
    t['Adieresis'] = 722;
    t['egrave'] = 556;
    t['zacute'] = 500;
    t['iogonek'] = 278;
    t['Oacute'] = 778;
    t['oacute'] = 611;
    t['amacron'] = 556;
    t['sacute'] = 556;
    t['idieresis'] = 278;
    t['Ocircumflex'] = 778;
    t['Ugrave'] = 722;
    t['Delta'] = 612;
    t['thorn'] = 611;
    t['twosuperior'] = 333;
    t['Odieresis'] = 778;
    t['mu'] = 611;
    t['igrave'] = 278;
    t['ohungarumlaut'] = 611;
    t['Eogonek'] = 667;
    t['dcroat'] = 611;
    t['threequarters'] = 834;
    t['Scedilla'] = 667;
    t['lcaron'] = 400;
    t['Kcommaaccent'] = 722;
    t['Lacute'] = 611;
    t['trademark'] = 1000;
    t['edotaccent'] = 556;
    t['Igrave'] = 278;
    t['Imacron'] = 278;
    t['Lcaron'] = 611;
    t['onehalf'] = 834;
    t['lessequal'] = 549;
    t['ocircumflex'] = 611;
    t['ntilde'] = 611;
    t['Uhungarumlaut'] = 722;
    t['Eacute'] = 667;
    t['emacron'] = 556;
    t['gbreve'] = 611;
    t['onequarter'] = 834;
    t['Scaron'] = 667;
    t['Scommaaccent'] = 667;
    t['Ohungarumlaut'] = 778;
    t['degree'] = 400;
    t['ograve'] = 611;
    t['Ccaron'] = 722;
    t['ugrave'] = 611;
    t['radical'] = 549;
    t['Dcaron'] = 722;
    t['rcommaaccent'] = 389;
    t['Ntilde'] = 722;
    t['otilde'] = 611;
    t['Rcommaaccent'] = 722;
    t['Lcommaaccent'] = 611;
    t['Atilde'] = 722;
    t['Aogonek'] = 722;
    t['Aring'] = 722;
    t['Otilde'] = 778;
    t['zdotaccent'] = 500;
    t['Ecaron'] = 667;
    t['Iogonek'] = 278;
    t['kcommaaccent'] = 556;
    t['minus'] = 584;
    t['Icircumflex'] = 278;
    t['ncaron'] = 611;
    t['tcommaaccent'] = 333;
    t['logicalnot'] = 584;
    t['odieresis'] = 611;
    t['udieresis'] = 611;
    t['notequal'] = 549;
    t['gcommaaccent'] = 611;
    t['eth'] = 611;
    t['zcaron'] = 500;
    t['ncommaaccent'] = 611;
    t['onesuperior'] = 333;
    t['imacron'] = 278;
    t['Euro'] = 556;
  });
  t['Helvetica-BoldOblique'] = (0, _util.getLookupTableFactory)(function (t) {
    t['space'] = 278;
    t['exclam'] = 333;
    t['quotedbl'] = 474;
    t['numbersign'] = 556;
    t['dollar'] = 556;
    t['percent'] = 889;
    t['ampersand'] = 722;
    t['quoteright'] = 278;
    t['parenleft'] = 333;
    t['parenright'] = 333;
    t['asterisk'] = 389;
    t['plus'] = 584;
    t['comma'] = 278;
    t['hyphen'] = 333;
    t['period'] = 278;
    t['slash'] = 278;
    t['zero'] = 556;
    t['one'] = 556;
    t['two'] = 556;
    t['three'] = 556;
    t['four'] = 556;
    t['five'] = 556;
    t['six'] = 556;
    t['seven'] = 556;
    t['eight'] = 556;
    t['nine'] = 556;
    t['colon'] = 333;
    t['semicolon'] = 333;
    t['less'] = 584;
    t['equal'] = 584;
    t['greater'] = 584;
    t['question'] = 611;
    t['at'] = 975;
    t['A'] = 722;
    t['B'] = 722;
    t['C'] = 722;
    t['D'] = 722;
    t['E'] = 667;
    t['F'] = 611;
    t['G'] = 778;
    t['H'] = 722;
    t['I'] = 278;
    t['J'] = 556;
    t['K'] = 722;
    t['L'] = 611;
    t['M'] = 833;
    t['N'] = 722;
    t['O'] = 778;
    t['P'] = 667;
    t['Q'] = 778;
    t['R'] = 722;
    t['S'] = 667;
    t['T'] = 611;
    t['U'] = 722;
    t['V'] = 667;
    t['W'] = 944;
    t['X'] = 667;
    t['Y'] = 667;
    t['Z'] = 611;
    t['bracketleft'] = 333;
    t['backslash'] = 278;
    t['bracketright'] = 333;
    t['asciicircum'] = 584;
    t['underscore'] = 556;
    t['quoteleft'] = 278;
    t['a'] = 556;
    t['b'] = 611;
    t['c'] = 556;
    t['d'] = 611;
    t['e'] = 556;
    t['f'] = 333;
    t['g'] = 611;
    t['h'] = 611;
    t['i'] = 278;
    t['j'] = 278;
    t['k'] = 556;
    t['l'] = 278;
    t['m'] = 889;
    t['n'] = 611;
    t['o'] = 611;
    t['p'] = 611;
    t['q'] = 611;
    t['r'] = 389;
    t['s'] = 556;
    t['t'] = 333;
    t['u'] = 611;
    t['v'] = 556;
    t['w'] = 778;
    t['x'] = 556;
    t['y'] = 556;
    t['z'] = 500;
    t['braceleft'] = 389;
    t['bar'] = 280;
    t['braceright'] = 389;
    t['asciitilde'] = 584;
    t['exclamdown'] = 333;
    t['cent'] = 556;
    t['sterling'] = 556;
    t['fraction'] = 167;
    t['yen'] = 556;
    t['florin'] = 556;
    t['section'] = 556;
    t['currency'] = 556;
    t['quotesingle'] = 238;
    t['quotedblleft'] = 500;
    t['guillemotleft'] = 556;
    t['guilsinglleft'] = 333;
    t['guilsinglright'] = 333;
    t['fi'] = 611;
    t['fl'] = 611;
    t['endash'] = 556;
    t['dagger'] = 556;
    t['daggerdbl'] = 556;
    t['periodcentered'] = 278;
    t['paragraph'] = 556;
    t['bullet'] = 350;
    t['quotesinglbase'] = 278;
    t['quotedblbase'] = 500;
    t['quotedblright'] = 500;
    t['guillemotright'] = 556;
    t['ellipsis'] = 1000;
    t['perthousand'] = 1000;
    t['questiondown'] = 611;
    t['grave'] = 333;
    t['acute'] = 333;
    t['circumflex'] = 333;
    t['tilde'] = 333;
    t['macron'] = 333;
    t['breve'] = 333;
    t['dotaccent'] = 333;
    t['dieresis'] = 333;
    t['ring'] = 333;
    t['cedilla'] = 333;
    t['hungarumlaut'] = 333;
    t['ogonek'] = 333;
    t['caron'] = 333;
    t['emdash'] = 1000;
    t['AE'] = 1000;
    t['ordfeminine'] = 370;
    t['Lslash'] = 611;
    t['Oslash'] = 778;
    t['OE'] = 1000;
    t['ordmasculine'] = 365;
    t['ae'] = 889;
    t['dotlessi'] = 278;
    t['lslash'] = 278;
    t['oslash'] = 611;
    t['oe'] = 944;
    t['germandbls'] = 611;
    t['Idieresis'] = 278;
    t['eacute'] = 556;
    t['abreve'] = 556;
    t['uhungarumlaut'] = 611;
    t['ecaron'] = 556;
    t['Ydieresis'] = 667;
    t['divide'] = 584;
    t['Yacute'] = 667;
    t['Acircumflex'] = 722;
    t['aacute'] = 556;
    t['Ucircumflex'] = 722;
    t['yacute'] = 556;
    t['scommaaccent'] = 556;
    t['ecircumflex'] = 556;
    t['Uring'] = 722;
    t['Udieresis'] = 722;
    t['aogonek'] = 556;
    t['Uacute'] = 722;
    t['uogonek'] = 611;
    t['Edieresis'] = 667;
    t['Dcroat'] = 722;
    t['commaaccent'] = 250;
    t['copyright'] = 737;
    t['Emacron'] = 667;
    t['ccaron'] = 556;
    t['aring'] = 556;
    t['Ncommaaccent'] = 722;
    t['lacute'] = 278;
    t['agrave'] = 556;
    t['Tcommaaccent'] = 611;
    t['Cacute'] = 722;
    t['atilde'] = 556;
    t['Edotaccent'] = 667;
    t['scaron'] = 556;
    t['scedilla'] = 556;
    t['iacute'] = 278;
    t['lozenge'] = 494;
    t['Rcaron'] = 722;
    t['Gcommaaccent'] = 778;
    t['ucircumflex'] = 611;
    t['acircumflex'] = 556;
    t['Amacron'] = 722;
    t['rcaron'] = 389;
    t['ccedilla'] = 556;
    t['Zdotaccent'] = 611;
    t['Thorn'] = 667;
    t['Omacron'] = 778;
    t['Racute'] = 722;
    t['Sacute'] = 667;
    t['dcaron'] = 743;
    t['Umacron'] = 722;
    t['uring'] = 611;
    t['threesuperior'] = 333;
    t['Ograve'] = 778;
    t['Agrave'] = 722;
    t['Abreve'] = 722;
    t['multiply'] = 584;
    t['uacute'] = 611;
    t['Tcaron'] = 611;
    t['partialdiff'] = 494;
    t['ydieresis'] = 556;
    t['Nacute'] = 722;
    t['icircumflex'] = 278;
    t['Ecircumflex'] = 667;
    t['adieresis'] = 556;
    t['edieresis'] = 556;
    t['cacute'] = 556;
    t['nacute'] = 611;
    t['umacron'] = 611;
    t['Ncaron'] = 722;
    t['Iacute'] = 278;
    t['plusminus'] = 584;
    t['brokenbar'] = 280;
    t['registered'] = 737;
    t['Gbreve'] = 778;
    t['Idotaccent'] = 278;
    t['summation'] = 600;
    t['Egrave'] = 667;
    t['racute'] = 389;
    t['omacron'] = 611;
    t['Zacute'] = 611;
    t['Zcaron'] = 611;
    t['greaterequal'] = 549;
    t['Eth'] = 722;
    t['Ccedilla'] = 722;
    t['lcommaaccent'] = 278;
    t['tcaron'] = 389;
    t['eogonek'] = 556;
    t['Uogonek'] = 722;
    t['Aacute'] = 722;
    t['Adieresis'] = 722;
    t['egrave'] = 556;
    t['zacute'] = 500;
    t['iogonek'] = 278;
    t['Oacute'] = 778;
    t['oacute'] = 611;
    t['amacron'] = 556;
    t['sacute'] = 556;
    t['idieresis'] = 278;
    t['Ocircumflex'] = 778;
    t['Ugrave'] = 722;
    t['Delta'] = 612;
    t['thorn'] = 611;
    t['twosuperior'] = 333;
    t['Odieresis'] = 778;
    t['mu'] = 611;
    t['igrave'] = 278;
    t['ohungarumlaut'] = 611;
    t['Eogonek'] = 667;
    t['dcroat'] = 611;
    t['threequarters'] = 834;
    t['Scedilla'] = 667;
    t['lcaron'] = 400;
    t['Kcommaaccent'] = 722;
    t['Lacute'] = 611;
    t['trademark'] = 1000;
    t['edotaccent'] = 556;
    t['Igrave'] = 278;
    t['Imacron'] = 278;
    t['Lcaron'] = 611;
    t['onehalf'] = 834;
    t['lessequal'] = 549;
    t['ocircumflex'] = 611;
    t['ntilde'] = 611;
    t['Uhungarumlaut'] = 722;
    t['Eacute'] = 667;
    t['emacron'] = 556;
    t['gbreve'] = 611;
    t['onequarter'] = 834;
    t['Scaron'] = 667;
    t['Scommaaccent'] = 667;
    t['Ohungarumlaut'] = 778;
    t['degree'] = 400;
    t['ograve'] = 611;
    t['Ccaron'] = 722;
    t['ugrave'] = 611;
    t['radical'] = 549;
    t['Dcaron'] = 722;
    t['rcommaaccent'] = 389;
    t['Ntilde'] = 722;
    t['otilde'] = 611;
    t['Rcommaaccent'] = 722;
    t['Lcommaaccent'] = 611;
    t['Atilde'] = 722;
    t['Aogonek'] = 722;
    t['Aring'] = 722;
    t['Otilde'] = 778;
    t['zdotaccent'] = 500;
    t['Ecaron'] = 667;
    t['Iogonek'] = 278;
    t['kcommaaccent'] = 556;
    t['minus'] = 584;
    t['Icircumflex'] = 278;
    t['ncaron'] = 611;
    t['tcommaaccent'] = 333;
    t['logicalnot'] = 584;
    t['odieresis'] = 611;
    t['udieresis'] = 611;
    t['notequal'] = 549;
    t['gcommaaccent'] = 611;
    t['eth'] = 611;
    t['zcaron'] = 500;
    t['ncommaaccent'] = 611;
    t['onesuperior'] = 333;
    t['imacron'] = 278;
    t['Euro'] = 556;
  });
  t['Helvetica-Oblique'] = (0, _util.getLookupTableFactory)(function (t) {
    t['space'] = 278;
    t['exclam'] = 278;
    t['quotedbl'] = 355;
    t['numbersign'] = 556;
    t['dollar'] = 556;
    t['percent'] = 889;
    t['ampersand'] = 667;
    t['quoteright'] = 222;
    t['parenleft'] = 333;
    t['parenright'] = 333;
    t['asterisk'] = 389;
    t['plus'] = 584;
    t['comma'] = 278;
    t['hyphen'] = 333;
    t['period'] = 278;
    t['slash'] = 278;
    t['zero'] = 556;
    t['one'] = 556;
    t['two'] = 556;
    t['three'] = 556;
    t['four'] = 556;
    t['five'] = 556;
    t['six'] = 556;
    t['seven'] = 556;
    t['eight'] = 556;
    t['nine'] = 556;
    t['colon'] = 278;
    t['semicolon'] = 278;
    t['less'] = 584;
    t['equal'] = 584;
    t['greater'] = 584;
    t['question'] = 556;
    t['at'] = 1015;
    t['A'] = 667;
    t['B'] = 667;
    t['C'] = 722;
    t['D'] = 722;
    t['E'] = 667;
    t['F'] = 611;
    t['G'] = 778;
    t['H'] = 722;
    t['I'] = 278;
    t['J'] = 500;
    t['K'] = 667;
    t['L'] = 556;
    t['M'] = 833;
    t['N'] = 722;
    t['O'] = 778;
    t['P'] = 667;
    t['Q'] = 778;
    t['R'] = 722;
    t['S'] = 667;
    t['T'] = 611;
    t['U'] = 722;
    t['V'] = 667;
    t['W'] = 944;
    t['X'] = 667;
    t['Y'] = 667;
    t['Z'] = 611;
    t['bracketleft'] = 278;
    t['backslash'] = 278;
    t['bracketright'] = 278;
    t['asciicircum'] = 469;
    t['underscore'] = 556;
    t['quoteleft'] = 222;
    t['a'] = 556;
    t['b'] = 556;
    t['c'] = 500;
    t['d'] = 556;
    t['e'] = 556;
    t['f'] = 278;
    t['g'] = 556;
    t['h'] = 556;
    t['i'] = 222;
    t['j'] = 222;
    t['k'] = 500;
    t['l'] = 222;
    t['m'] = 833;
    t['n'] = 556;
    t['o'] = 556;
    t['p'] = 556;
    t['q'] = 556;
    t['r'] = 333;
    t['s'] = 500;
    t['t'] = 278;
    t['u'] = 556;
    t['v'] = 500;
    t['w'] = 722;
    t['x'] = 500;
    t['y'] = 500;
    t['z'] = 500;
    t['braceleft'] = 334;
    t['bar'] = 260;
    t['braceright'] = 334;
    t['asciitilde'] = 584;
    t['exclamdown'] = 333;
    t['cent'] = 556;
    t['sterling'] = 556;
    t['fraction'] = 167;
    t['yen'] = 556;
    t['florin'] = 556;
    t['section'] = 556;
    t['currency'] = 556;
    t['quotesingle'] = 191;
    t['quotedblleft'] = 333;
    t['guillemotleft'] = 556;
    t['guilsinglleft'] = 333;
    t['guilsinglright'] = 333;
    t['fi'] = 500;
    t['fl'] = 500;
    t['endash'] = 556;
    t['dagger'] = 556;
    t['daggerdbl'] = 556;
    t['periodcentered'] = 278;
    t['paragraph'] = 537;
    t['bullet'] = 350;
    t['quotesinglbase'] = 222;
    t['quotedblbase'] = 333;
    t['quotedblright'] = 333;
    t['guillemotright'] = 556;
    t['ellipsis'] = 1000;
    t['perthousand'] = 1000;
    t['questiondown'] = 611;
    t['grave'] = 333;
    t['acute'] = 333;
    t['circumflex'] = 333;
    t['tilde'] = 333;
    t['macron'] = 333;
    t['breve'] = 333;
    t['dotaccent'] = 333;
    t['dieresis'] = 333;
    t['ring'] = 333;
    t['cedilla'] = 333;
    t['hungarumlaut'] = 333;
    t['ogonek'] = 333;
    t['caron'] = 333;
    t['emdash'] = 1000;
    t['AE'] = 1000;
    t['ordfeminine'] = 370;
    t['Lslash'] = 556;
    t['Oslash'] = 778;
    t['OE'] = 1000;
    t['ordmasculine'] = 365;
    t['ae'] = 889;
    t['dotlessi'] = 278;
    t['lslash'] = 222;
    t['oslash'] = 611;
    t['oe'] = 944;
    t['germandbls'] = 611;
    t['Idieresis'] = 278;
    t['eacute'] = 556;
    t['abreve'] = 556;
    t['uhungarumlaut'] = 556;
    t['ecaron'] = 556;
    t['Ydieresis'] = 667;
    t['divide'] = 584;
    t['Yacute'] = 667;
    t['Acircumflex'] = 667;
    t['aacute'] = 556;
    t['Ucircumflex'] = 722;
    t['yacute'] = 500;
    t['scommaaccent'] = 500;
    t['ecircumflex'] = 556;
    t['Uring'] = 722;
    t['Udieresis'] = 722;
    t['aogonek'] = 556;
    t['Uacute'] = 722;
    t['uogonek'] = 556;
    t['Edieresis'] = 667;
    t['Dcroat'] = 722;
    t['commaaccent'] = 250;
    t['copyright'] = 737;
    t['Emacron'] = 667;
    t['ccaron'] = 500;
    t['aring'] = 556;
    t['Ncommaaccent'] = 722;
    t['lacute'] = 222;
    t['agrave'] = 556;
    t['Tcommaaccent'] = 611;
    t['Cacute'] = 722;
    t['atilde'] = 556;
    t['Edotaccent'] = 667;
    t['scaron'] = 500;
    t['scedilla'] = 500;
    t['iacute'] = 278;
    t['lozenge'] = 471;
    t['Rcaron'] = 722;
    t['Gcommaaccent'] = 778;
    t['ucircumflex'] = 556;
    t['acircumflex'] = 556;
    t['Amacron'] = 667;
    t['rcaron'] = 333;
    t['ccedilla'] = 500;
    t['Zdotaccent'] = 611;
    t['Thorn'] = 667;
    t['Omacron'] = 778;
    t['Racute'] = 722;
    t['Sacute'] = 667;
    t['dcaron'] = 643;
    t['Umacron'] = 722;
    t['uring'] = 556;
    t['threesuperior'] = 333;
    t['Ograve'] = 778;
    t['Agrave'] = 667;
    t['Abreve'] = 667;
    t['multiply'] = 584;
    t['uacute'] = 556;
    t['Tcaron'] = 611;
    t['partialdiff'] = 476;
    t['ydieresis'] = 500;
    t['Nacute'] = 722;
    t['icircumflex'] = 278;
    t['Ecircumflex'] = 667;
    t['adieresis'] = 556;
    t['edieresis'] = 556;
    t['cacute'] = 500;
    t['nacute'] = 556;
    t['umacron'] = 556;
    t['Ncaron'] = 722;
    t['Iacute'] = 278;
    t['plusminus'] = 584;
    t['brokenbar'] = 260;
    t['registered'] = 737;
    t['Gbreve'] = 778;
    t['Idotaccent'] = 278;
    t['summation'] = 600;
    t['Egrave'] = 667;
    t['racute'] = 333;
    t['omacron'] = 556;
    t['Zacute'] = 611;
    t['Zcaron'] = 611;
    t['greaterequal'] = 549;
    t['Eth'] = 722;
    t['Ccedilla'] = 722;
    t['lcommaaccent'] = 222;
    t['tcaron'] = 317;
    t['eogonek'] = 556;
    t['Uogonek'] = 722;
    t['Aacute'] = 667;
    t['Adieresis'] = 667;
    t['egrave'] = 556;
    t['zacute'] = 500;
    t['iogonek'] = 222;
    t['Oacute'] = 778;
    t['oacute'] = 556;
    t['amacron'] = 556;
    t['sacute'] = 500;
    t['idieresis'] = 278;
    t['Ocircumflex'] = 778;
    t['Ugrave'] = 722;
    t['Delta'] = 612;
    t['thorn'] = 556;
    t['twosuperior'] = 333;
    t['Odieresis'] = 778;
    t['mu'] = 556;
    t['igrave'] = 278;
    t['ohungarumlaut'] = 556;
    t['Eogonek'] = 667;
    t['dcroat'] = 556;
    t['threequarters'] = 834;
    t['Scedilla'] = 667;
    t['lcaron'] = 299;
    t['Kcommaaccent'] = 667;
    t['Lacute'] = 556;
    t['trademark'] = 1000;
    t['edotaccent'] = 556;
    t['Igrave'] = 278;
    t['Imacron'] = 278;
    t['Lcaron'] = 556;
    t['onehalf'] = 834;
    t['lessequal'] = 549;
    t['ocircumflex'] = 556;
    t['ntilde'] = 556;
    t['Uhungarumlaut'] = 722;
    t['Eacute'] = 667;
    t['emacron'] = 556;
    t['gbreve'] = 556;
    t['onequarter'] = 834;
    t['Scaron'] = 667;
    t['Scommaaccent'] = 667;
    t['Ohungarumlaut'] = 778;
    t['degree'] = 400;
    t['ograve'] = 556;
    t['Ccaron'] = 722;
    t['ugrave'] = 556;
    t['radical'] = 453;
    t['Dcaron'] = 722;
    t['rcommaaccent'] = 333;
    t['Ntilde'] = 722;
    t['otilde'] = 556;
    t['Rcommaaccent'] = 722;
    t['Lcommaaccent'] = 556;
    t['Atilde'] = 667;
    t['Aogonek'] = 667;
    t['Aring'] = 667;
    t['Otilde'] = 778;
    t['zdotaccent'] = 500;
    t['Ecaron'] = 667;
    t['Iogonek'] = 278;
    t['kcommaaccent'] = 500;
    t['minus'] = 584;
    t['Icircumflex'] = 278;
    t['ncaron'] = 556;
    t['tcommaaccent'] = 278;
    t['logicalnot'] = 584;
    t['odieresis'] = 556;
    t['udieresis'] = 556;
    t['notequal'] = 549;
    t['gcommaaccent'] = 556;
    t['eth'] = 556;
    t['zcaron'] = 500;
    t['ncommaaccent'] = 556;
    t['onesuperior'] = 333;
    t['imacron'] = 278;
    t['Euro'] = 556;
  });
  t['Symbol'] = (0, _util.getLookupTableFactory)(function (t) {
    t['space'] = 250;
    t['exclam'] = 333;
    t['universal'] = 713;
    t['numbersign'] = 500;
    t['existential'] = 549;
    t['percent'] = 833;
    t['ampersand'] = 778;
    t['suchthat'] = 439;
    t['parenleft'] = 333;
    t['parenright'] = 333;
    t['asteriskmath'] = 500;
    t['plus'] = 549;
    t['comma'] = 250;
    t['minus'] = 549;
    t['period'] = 250;
    t['slash'] = 278;
    t['zero'] = 500;
    t['one'] = 500;
    t['two'] = 500;
    t['three'] = 500;
    t['four'] = 500;
    t['five'] = 500;
    t['six'] = 500;
    t['seven'] = 500;
    t['eight'] = 500;
    t['nine'] = 500;
    t['colon'] = 278;
    t['semicolon'] = 278;
    t['less'] = 549;
    t['equal'] = 549;
    t['greater'] = 549;
    t['question'] = 444;
    t['congruent'] = 549;
    t['Alpha'] = 722;
    t['Beta'] = 667;
    t['Chi'] = 722;
    t['Delta'] = 612;
    t['Epsilon'] = 611;
    t['Phi'] = 763;
    t['Gamma'] = 603;
    t['Eta'] = 722;
    t['Iota'] = 333;
    t['theta1'] = 631;
    t['Kappa'] = 722;
    t['Lambda'] = 686;
    t['Mu'] = 889;
    t['Nu'] = 722;
    t['Omicron'] = 722;
    t['Pi'] = 768;
    t['Theta'] = 741;
    t['Rho'] = 556;
    t['Sigma'] = 592;
    t['Tau'] = 611;
    t['Upsilon'] = 690;
    t['sigma1'] = 439;
    t['Omega'] = 768;
    t['Xi'] = 645;
    t['Psi'] = 795;
    t['Zeta'] = 611;
    t['bracketleft'] = 333;
    t['therefore'] = 863;
    t['bracketright'] = 333;
    t['perpendicular'] = 658;
    t['underscore'] = 500;
    t['radicalex'] = 500;
    t['alpha'] = 631;
    t['beta'] = 549;
    t['chi'] = 549;
    t['delta'] = 494;
    t['epsilon'] = 439;
    t['phi'] = 521;
    t['gamma'] = 411;
    t['eta'] = 603;
    t['iota'] = 329;
    t['phi1'] = 603;
    t['kappa'] = 549;
    t['lambda'] = 549;
    t['mu'] = 576;
    t['nu'] = 521;
    t['omicron'] = 549;
    t['pi'] = 549;
    t['theta'] = 521;
    t['rho'] = 549;
    t['sigma'] = 603;
    t['tau'] = 439;
    t['upsilon'] = 576;
    t['omega1'] = 713;
    t['omega'] = 686;
    t['xi'] = 493;
    t['psi'] = 686;
    t['zeta'] = 494;
    t['braceleft'] = 480;
    t['bar'] = 200;
    t['braceright'] = 480;
    t['similar'] = 549;
    t['Euro'] = 750;
    t['Upsilon1'] = 620;
    t['minute'] = 247;
    t['lessequal'] = 549;
    t['fraction'] = 167;
    t['infinity'] = 713;
    t['florin'] = 500;
    t['club'] = 753;
    t['diamond'] = 753;
    t['heart'] = 753;
    t['spade'] = 753;
    t['arrowboth'] = 1042;
    t['arrowleft'] = 987;
    t['arrowup'] = 603;
    t['arrowright'] = 987;
    t['arrowdown'] = 603;
    t['degree'] = 400;
    t['plusminus'] = 549;
    t['second'] = 411;
    t['greaterequal'] = 549;
    t['multiply'] = 549;
    t['proportional'] = 713;
    t['partialdiff'] = 494;
    t['bullet'] = 460;
    t['divide'] = 549;
    t['notequal'] = 549;
    t['equivalence'] = 549;
    t['approxequal'] = 549;
    t['ellipsis'] = 1000;
    t['arrowvertex'] = 603;
    t['arrowhorizex'] = 1000;
    t['carriagereturn'] = 658;
    t['aleph'] = 823;
    t['Ifraktur'] = 686;
    t['Rfraktur'] = 795;
    t['weierstrass'] = 987;
    t['circlemultiply'] = 768;
    t['circleplus'] = 768;
    t['emptyset'] = 823;
    t['intersection'] = 768;
    t['union'] = 768;
    t['propersuperset'] = 713;
    t['reflexsuperset'] = 713;
    t['notsubset'] = 713;
    t['propersubset'] = 713;
    t['reflexsubset'] = 713;
    t['element'] = 713;
    t['notelement'] = 713;
    t['angle'] = 768;
    t['gradient'] = 713;
    t['registerserif'] = 790;
    t['copyrightserif'] = 790;
    t['trademarkserif'] = 890;
    t['product'] = 823;
    t['radical'] = 549;
    t['dotmath'] = 250;
    t['logicalnot'] = 713;
    t['logicaland'] = 603;
    t['logicalor'] = 603;
    t['arrowdblboth'] = 1042;
    t['arrowdblleft'] = 987;
    t['arrowdblup'] = 603;
    t['arrowdblright'] = 987;
    t['arrowdbldown'] = 603;
    t['lozenge'] = 494;
    t['angleleft'] = 329;
    t['registersans'] = 790;
    t['copyrightsans'] = 790;
    t['trademarksans'] = 786;
    t['summation'] = 713;
    t['parenlefttp'] = 384;
    t['parenleftex'] = 384;
    t['parenleftbt'] = 384;
    t['bracketlefttp'] = 384;
    t['bracketleftex'] = 384;
    t['bracketleftbt'] = 384;
    t['bracelefttp'] = 494;
    t['braceleftmid'] = 494;
    t['braceleftbt'] = 494;
    t['braceex'] = 494;
    t['angleright'] = 329;
    t['integral'] = 274;
    t['integraltp'] = 686;
    t['integralex'] = 686;
    t['integralbt'] = 686;
    t['parenrighttp'] = 384;
    t['parenrightex'] = 384;
    t['parenrightbt'] = 384;
    t['bracketrighttp'] = 384;
    t['bracketrightex'] = 384;
    t['bracketrightbt'] = 384;
    t['bracerighttp'] = 494;
    t['bracerightmid'] = 494;
    t['bracerightbt'] = 494;
    t['apple'] = 790;
  });
  t['Times-Roman'] = (0, _util.getLookupTableFactory)(function (t) {
    t['space'] = 250;
    t['exclam'] = 333;
    t['quotedbl'] = 408;
    t['numbersign'] = 500;
    t['dollar'] = 500;
    t['percent'] = 833;
    t['ampersand'] = 778;
    t['quoteright'] = 333;
    t['parenleft'] = 333;
    t['parenright'] = 333;
    t['asterisk'] = 500;
    t['plus'] = 564;
    t['comma'] = 250;
    t['hyphen'] = 333;
    t['period'] = 250;
    t['slash'] = 278;
    t['zero'] = 500;
    t['one'] = 500;
    t['two'] = 500;
    t['three'] = 500;
    t['four'] = 500;
    t['five'] = 500;
    t['six'] = 500;
    t['seven'] = 500;
    t['eight'] = 500;
    t['nine'] = 500;
    t['colon'] = 278;
    t['semicolon'] = 278;
    t['less'] = 564;
    t['equal'] = 564;
    t['greater'] = 564;
    t['question'] = 444;
    t['at'] = 921;
    t['A'] = 722;
    t['B'] = 667;
    t['C'] = 667;
    t['D'] = 722;
    t['E'] = 611;
    t['F'] = 556;
    t['G'] = 722;
    t['H'] = 722;
    t['I'] = 333;
    t['J'] = 389;
    t['K'] = 722;
    t['L'] = 611;
    t['M'] = 889;
    t['N'] = 722;
    t['O'] = 722;
    t['P'] = 556;
    t['Q'] = 722;
    t['R'] = 667;
    t['S'] = 556;
    t['T'] = 611;
    t['U'] = 722;
    t['V'] = 722;
    t['W'] = 944;
    t['X'] = 722;
    t['Y'] = 722;
    t['Z'] = 611;
    t['bracketleft'] = 333;
    t['backslash'] = 278;
    t['bracketright'] = 333;
    t['asciicircum'] = 469;
    t['underscore'] = 500;
    t['quoteleft'] = 333;
    t['a'] = 444;
    t['b'] = 500;
    t['c'] = 444;
    t['d'] = 500;
    t['e'] = 444;
    t['f'] = 333;
    t['g'] = 500;
    t['h'] = 500;
    t['i'] = 278;
    t['j'] = 278;
    t['k'] = 500;
    t['l'] = 278;
    t['m'] = 778;
    t['n'] = 500;
    t['o'] = 500;
    t['p'] = 500;
    t['q'] = 500;
    t['r'] = 333;
    t['s'] = 389;
    t['t'] = 278;
    t['u'] = 500;
    t['v'] = 500;
    t['w'] = 722;
    t['x'] = 500;
    t['y'] = 500;
    t['z'] = 444;
    t['braceleft'] = 480;
    t['bar'] = 200;
    t['braceright'] = 480;
    t['asciitilde'] = 541;
    t['exclamdown'] = 333;
    t['cent'] = 500;
    t['sterling'] = 500;
    t['fraction'] = 167;
    t['yen'] = 500;
    t['florin'] = 500;
    t['section'] = 500;
    t['currency'] = 500;
    t['quotesingle'] = 180;
    t['quotedblleft'] = 444;
    t['guillemotleft'] = 500;
    t['guilsinglleft'] = 333;
    t['guilsinglright'] = 333;
    t['fi'] = 556;
    t['fl'] = 556;
    t['endash'] = 500;
    t['dagger'] = 500;
    t['daggerdbl'] = 500;
    t['periodcentered'] = 250;
    t['paragraph'] = 453;
    t['bullet'] = 350;
    t['quotesinglbase'] = 333;
    t['quotedblbase'] = 444;
    t['quotedblright'] = 444;
    t['guillemotright'] = 500;
    t['ellipsis'] = 1000;
    t['perthousand'] = 1000;
    t['questiondown'] = 444;
    t['grave'] = 333;
    t['acute'] = 333;
    t['circumflex'] = 333;
    t['tilde'] = 333;
    t['macron'] = 333;
    t['breve'] = 333;
    t['dotaccent'] = 333;
    t['dieresis'] = 333;
    t['ring'] = 333;
    t['cedilla'] = 333;
    t['hungarumlaut'] = 333;
    t['ogonek'] = 333;
    t['caron'] = 333;
    t['emdash'] = 1000;
    t['AE'] = 889;
    t['ordfeminine'] = 276;
    t['Lslash'] = 611;
    t['Oslash'] = 722;
    t['OE'] = 889;
    t['ordmasculine'] = 310;
    t['ae'] = 667;
    t['dotlessi'] = 278;
    t['lslash'] = 278;
    t['oslash'] = 500;
    t['oe'] = 722;
    t['germandbls'] = 500;
    t['Idieresis'] = 333;
    t['eacute'] = 444;
    t['abreve'] = 444;
    t['uhungarumlaut'] = 500;
    t['ecaron'] = 444;
    t['Ydieresis'] = 722;
    t['divide'] = 564;
    t['Yacute'] = 722;
    t['Acircumflex'] = 722;
    t['aacute'] = 444;
    t['Ucircumflex'] = 722;
    t['yacute'] = 500;
    t['scommaaccent'] = 389;
    t['ecircumflex'] = 444;
    t['Uring'] = 722;
    t['Udieresis'] = 722;
    t['aogonek'] = 444;
    t['Uacute'] = 722;
    t['uogonek'] = 500;
    t['Edieresis'] = 611;
    t['Dcroat'] = 722;
    t['commaaccent'] = 250;
    t['copyright'] = 760;
    t['Emacron'] = 611;
    t['ccaron'] = 444;
    t['aring'] = 444;
    t['Ncommaaccent'] = 722;
    t['lacute'] = 278;
    t['agrave'] = 444;
    t['Tcommaaccent'] = 611;
    t['Cacute'] = 667;
    t['atilde'] = 444;
    t['Edotaccent'] = 611;
    t['scaron'] = 389;
    t['scedilla'] = 389;
    t['iacute'] = 278;
    t['lozenge'] = 471;
    t['Rcaron'] = 667;
    t['Gcommaaccent'] = 722;
    t['ucircumflex'] = 500;
    t['acircumflex'] = 444;
    t['Amacron'] = 722;
    t['rcaron'] = 333;
    t['ccedilla'] = 444;
    t['Zdotaccent'] = 611;
    t['Thorn'] = 556;
    t['Omacron'] = 722;
    t['Racute'] = 667;
    t['Sacute'] = 556;
    t['dcaron'] = 588;
    t['Umacron'] = 722;
    t['uring'] = 500;
    t['threesuperior'] = 300;
    t['Ograve'] = 722;
    t['Agrave'] = 722;
    t['Abreve'] = 722;
    t['multiply'] = 564;
    t['uacute'] = 500;
    t['Tcaron'] = 611;
    t['partialdiff'] = 476;
    t['ydieresis'] = 500;
    t['Nacute'] = 722;
    t['icircumflex'] = 278;
    t['Ecircumflex'] = 611;
    t['adieresis'] = 444;
    t['edieresis'] = 444;
    t['cacute'] = 444;
    t['nacute'] = 500;
    t['umacron'] = 500;
    t['Ncaron'] = 722;
    t['Iacute'] = 333;
    t['plusminus'] = 564;
    t['brokenbar'] = 200;
    t['registered'] = 760;
    t['Gbreve'] = 722;
    t['Idotaccent'] = 333;
    t['summation'] = 600;
    t['Egrave'] = 611;
    t['racute'] = 333;
    t['omacron'] = 500;
    t['Zacute'] = 611;
    t['Zcaron'] = 611;
    t['greaterequal'] = 549;
    t['Eth'] = 722;
    t['Ccedilla'] = 667;
    t['lcommaaccent'] = 278;
    t['tcaron'] = 326;
    t['eogonek'] = 444;
    t['Uogonek'] = 722;
    t['Aacute'] = 722;
    t['Adieresis'] = 722;
    t['egrave'] = 444;
    t['zacute'] = 444;
    t['iogonek'] = 278;
    t['Oacute'] = 722;
    t['oacute'] = 500;
    t['amacron'] = 444;
    t['sacute'] = 389;
    t['idieresis'] = 278;
    t['Ocircumflex'] = 722;
    t['Ugrave'] = 722;
    t['Delta'] = 612;
    t['thorn'] = 500;
    t['twosuperior'] = 300;
    t['Odieresis'] = 722;
    t['mu'] = 500;
    t['igrave'] = 278;
    t['ohungarumlaut'] = 500;
    t['Eogonek'] = 611;
    t['dcroat'] = 500;
    t['threequarters'] = 750;
    t['Scedilla'] = 556;
    t['lcaron'] = 344;
    t['Kcommaaccent'] = 722;
    t['Lacute'] = 611;
    t['trademark'] = 980;
    t['edotaccent'] = 444;
    t['Igrave'] = 333;
    t['Imacron'] = 333;
    t['Lcaron'] = 611;
    t['onehalf'] = 750;
    t['lessequal'] = 549;
    t['ocircumflex'] = 500;
    t['ntilde'] = 500;
    t['Uhungarumlaut'] = 722;
    t['Eacute'] = 611;
    t['emacron'] = 444;
    t['gbreve'] = 500;
    t['onequarter'] = 750;
    t['Scaron'] = 556;
    t['Scommaaccent'] = 556;
    t['Ohungarumlaut'] = 722;
    t['degree'] = 400;
    t['ograve'] = 500;
    t['Ccaron'] = 667;
    t['ugrave'] = 500;
    t['radical'] = 453;
    t['Dcaron'] = 722;
    t['rcommaaccent'] = 333;
    t['Ntilde'] = 722;
    t['otilde'] = 500;
    t['Rcommaaccent'] = 667;
    t['Lcommaaccent'] = 611;
    t['Atilde'] = 722;
    t['Aogonek'] = 722;
    t['Aring'] = 722;
    t['Otilde'] = 722;
    t['zdotaccent'] = 444;
    t['Ecaron'] = 611;
    t['Iogonek'] = 333;
    t['kcommaaccent'] = 500;
    t['minus'] = 564;
    t['Icircumflex'] = 333;
    t['ncaron'] = 500;
    t['tcommaaccent'] = 278;
    t['logicalnot'] = 564;
    t['odieresis'] = 500;
    t['udieresis'] = 500;
    t['notequal'] = 549;
    t['gcommaaccent'] = 500;
    t['eth'] = 500;
    t['zcaron'] = 444;
    t['ncommaaccent'] = 500;
    t['onesuperior'] = 300;
    t['imacron'] = 278;
    t['Euro'] = 500;
  });
  t['Times-Bold'] = (0, _util.getLookupTableFactory)(function (t) {
    t['space'] = 250;
    t['exclam'] = 333;
    t['quotedbl'] = 555;
    t['numbersign'] = 500;
    t['dollar'] = 500;
    t['percent'] = 1000;
    t['ampersand'] = 833;
    t['quoteright'] = 333;
    t['parenleft'] = 333;
    t['parenright'] = 333;
    t['asterisk'] = 500;
    t['plus'] = 570;
    t['comma'] = 250;
    t['hyphen'] = 333;
    t['period'] = 250;
    t['slash'] = 278;
    t['zero'] = 500;
    t['one'] = 500;
    t['two'] = 500;
    t['three'] = 500;
    t['four'] = 500;
    t['five'] = 500;
    t['six'] = 500;
    t['seven'] = 500;
    t['eight'] = 500;
    t['nine'] = 500;
    t['colon'] = 333;
    t['semicolon'] = 333;
    t['less'] = 570;
    t['equal'] = 570;
    t['greater'] = 570;
    t['question'] = 500;
    t['at'] = 930;
    t['A'] = 722;
    t['B'] = 667;
    t['C'] = 722;
    t['D'] = 722;
    t['E'] = 667;
    t['F'] = 611;
    t['G'] = 778;
    t['H'] = 778;
    t['I'] = 389;
    t['J'] = 500;
    t['K'] = 778;
    t['L'] = 667;
    t['M'] = 944;
    t['N'] = 722;
    t['O'] = 778;
    t['P'] = 611;
    t['Q'] = 778;
    t['R'] = 722;
    t['S'] = 556;
    t['T'] = 667;
    t['U'] = 722;
    t['V'] = 722;
    t['W'] = 1000;
    t['X'] = 722;
    t['Y'] = 722;
    t['Z'] = 667;
    t['bracketleft'] = 333;
    t['backslash'] = 278;
    t['bracketright'] = 333;
    t['asciicircum'] = 581;
    t['underscore'] = 500;
    t['quoteleft'] = 333;
    t['a'] = 500;
    t['b'] = 556;
    t['c'] = 444;
    t['d'] = 556;
    t['e'] = 444;
    t['f'] = 333;
    t['g'] = 500;
    t['h'] = 556;
    t['i'] = 278;
    t['j'] = 333;
    t['k'] = 556;
    t['l'] = 278;
    t['m'] = 833;
    t['n'] = 556;
    t['o'] = 500;
    t['p'] = 556;
    t['q'] = 556;
    t['r'] = 444;
    t['s'] = 389;
    t['t'] = 333;
    t['u'] = 556;
    t['v'] = 500;
    t['w'] = 722;
    t['x'] = 500;
    t['y'] = 500;
    t['z'] = 444;
    t['braceleft'] = 394;
    t['bar'] = 220;
    t['braceright'] = 394;
    t['asciitilde'] = 520;
    t['exclamdown'] = 333;
    t['cent'] = 500;
    t['sterling'] = 500;
    t['fraction'] = 167;
    t['yen'] = 500;
    t['florin'] = 500;
    t['section'] = 500;
    t['currency'] = 500;
    t['quotesingle'] = 278;
    t['quotedblleft'] = 500;
    t['guillemotleft'] = 500;
    t['guilsinglleft'] = 333;
    t['guilsinglright'] = 333;
    t['fi'] = 556;
    t['fl'] = 556;
    t['endash'] = 500;
    t['dagger'] = 500;
    t['daggerdbl'] = 500;
    t['periodcentered'] = 250;
    t['paragraph'] = 540;
    t['bullet'] = 350;
    t['quotesinglbase'] = 333;
    t['quotedblbase'] = 500;
    t['quotedblright'] = 500;
    t['guillemotright'] = 500;
    t['ellipsis'] = 1000;
    t['perthousand'] = 1000;
    t['questiondown'] = 500;
    t['grave'] = 333;
    t['acute'] = 333;
    t['circumflex'] = 333;
    t['tilde'] = 333;
    t['macron'] = 333;
    t['breve'] = 333;
    t['dotaccent'] = 333;
    t['dieresis'] = 333;
    t['ring'] = 333;
    t['cedilla'] = 333;
    t['hungarumlaut'] = 333;
    t['ogonek'] = 333;
    t['caron'] = 333;
    t['emdash'] = 1000;
    t['AE'] = 1000;
    t['ordfeminine'] = 300;
    t['Lslash'] = 667;
    t['Oslash'] = 778;
    t['OE'] = 1000;
    t['ordmasculine'] = 330;
    t['ae'] = 722;
    t['dotlessi'] = 278;
    t['lslash'] = 278;
    t['oslash'] = 500;
    t['oe'] = 722;
    t['germandbls'] = 556;
    t['Idieresis'] = 389;
    t['eacute'] = 444;
    t['abreve'] = 500;
    t['uhungarumlaut'] = 556;
    t['ecaron'] = 444;
    t['Ydieresis'] = 722;
    t['divide'] = 570;
    t['Yacute'] = 722;
    t['Acircumflex'] = 722;
    t['aacute'] = 500;
    t['Ucircumflex'] = 722;
    t['yacute'] = 500;
    t['scommaaccent'] = 389;
    t['ecircumflex'] = 444;
    t['Uring'] = 722;
    t['Udieresis'] = 722;
    t['aogonek'] = 500;
    t['Uacute'] = 722;
    t['uogonek'] = 556;
    t['Edieresis'] = 667;
    t['Dcroat'] = 722;
    t['commaaccent'] = 250;
    t['copyright'] = 747;
    t['Emacron'] = 667;
    t['ccaron'] = 444;
    t['aring'] = 500;
    t['Ncommaaccent'] = 722;
    t['lacute'] = 278;
    t['agrave'] = 500;
    t['Tcommaaccent'] = 667;
    t['Cacute'] = 722;
    t['atilde'] = 500;
    t['Edotaccent'] = 667;
    t['scaron'] = 389;
    t['scedilla'] = 389;
    t['iacute'] = 278;
    t['lozenge'] = 494;
    t['Rcaron'] = 722;
    t['Gcommaaccent'] = 778;
    t['ucircumflex'] = 556;
    t['acircumflex'] = 500;
    t['Amacron'] = 722;
    t['rcaron'] = 444;
    t['ccedilla'] = 444;
    t['Zdotaccent'] = 667;
    t['Thorn'] = 611;
    t['Omacron'] = 778;
    t['Racute'] = 722;
    t['Sacute'] = 556;
    t['dcaron'] = 672;
    t['Umacron'] = 722;
    t['uring'] = 556;
    t['threesuperior'] = 300;
    t['Ograve'] = 778;
    t['Agrave'] = 722;
    t['Abreve'] = 722;
    t['multiply'] = 570;
    t['uacute'] = 556;
    t['Tcaron'] = 667;
    t['partialdiff'] = 494;
    t['ydieresis'] = 500;
    t['Nacute'] = 722;
    t['icircumflex'] = 278;
    t['Ecircumflex'] = 667;
    t['adieresis'] = 500;
    t['edieresis'] = 444;
    t['cacute'] = 444;
    t['nacute'] = 556;
    t['umacron'] = 556;
    t['Ncaron'] = 722;
    t['Iacute'] = 389;
    t['plusminus'] = 570;
    t['brokenbar'] = 220;
    t['registered'] = 747;
    t['Gbreve'] = 778;
    t['Idotaccent'] = 389;
    t['summation'] = 600;
    t['Egrave'] = 667;
    t['racute'] = 444;
    t['omacron'] = 500;
    t['Zacute'] = 667;
    t['Zcaron'] = 667;
    t['greaterequal'] = 549;
    t['Eth'] = 722;
    t['Ccedilla'] = 722;
    t['lcommaaccent'] = 278;
    t['tcaron'] = 416;
    t['eogonek'] = 444;
    t['Uogonek'] = 722;
    t['Aacute'] = 722;
    t['Adieresis'] = 722;
    t['egrave'] = 444;
    t['zacute'] = 444;
    t['iogonek'] = 278;
    t['Oacute'] = 778;
    t['oacute'] = 500;
    t['amacron'] = 500;
    t['sacute'] = 389;
    t['idieresis'] = 278;
    t['Ocircumflex'] = 778;
    t['Ugrave'] = 722;
    t['Delta'] = 612;
    t['thorn'] = 556;
    t['twosuperior'] = 300;
    t['Odieresis'] = 778;
    t['mu'] = 556;
    t['igrave'] = 278;
    t['ohungarumlaut'] = 500;
    t['Eogonek'] = 667;
    t['dcroat'] = 556;
    t['threequarters'] = 750;
    t['Scedilla'] = 556;
    t['lcaron'] = 394;
    t['Kcommaaccent'] = 778;
    t['Lacute'] = 667;
    t['trademark'] = 1000;
    t['edotaccent'] = 444;
    t['Igrave'] = 389;
    t['Imacron'] = 389;
    t['Lcaron'] = 667;
    t['onehalf'] = 750;
    t['lessequal'] = 549;
    t['ocircumflex'] = 500;
    t['ntilde'] = 556;
    t['Uhungarumlaut'] = 722;
    t['Eacute'] = 667;
    t['emacron'] = 444;
    t['gbreve'] = 500;
    t['onequarter'] = 750;
    t['Scaron'] = 556;
    t['Scommaaccent'] = 556;
    t['Ohungarumlaut'] = 778;
    t['degree'] = 400;
    t['ograve'] = 500;
    t['Ccaron'] = 722;
    t['ugrave'] = 556;
    t['radical'] = 549;
    t['Dcaron'] = 722;
    t['rcommaaccent'] = 444;
    t['Ntilde'] = 722;
    t['otilde'] = 500;
    t['Rcommaaccent'] = 722;
    t['Lcommaaccent'] = 667;
    t['Atilde'] = 722;
    t['Aogonek'] = 722;
    t['Aring'] = 722;
    t['Otilde'] = 778;
    t['zdotaccent'] = 444;
    t['Ecaron'] = 667;
    t['Iogonek'] = 389;
    t['kcommaaccent'] = 556;
    t['minus'] = 570;
    t['Icircumflex'] = 389;
    t['ncaron'] = 556;
    t['tcommaaccent'] = 333;
    t['logicalnot'] = 570;
    t['odieresis'] = 500;
    t['udieresis'] = 556;
    t['notequal'] = 549;
    t['gcommaaccent'] = 500;
    t['eth'] = 500;
    t['zcaron'] = 444;
    t['ncommaaccent'] = 556;
    t['onesuperior'] = 300;
    t['imacron'] = 278;
    t['Euro'] = 500;
  });
  t['Times-BoldItalic'] = (0, _util.getLookupTableFactory)(function (t) {
    t['space'] = 250;
    t['exclam'] = 389;
    t['quotedbl'] = 555;
    t['numbersign'] = 500;
    t['dollar'] = 500;
    t['percent'] = 833;
    t['ampersand'] = 778;
    t['quoteright'] = 333;
    t['parenleft'] = 333;
    t['parenright'] = 333;
    t['asterisk'] = 500;
    t['plus'] = 570;
    t['comma'] = 250;
    t['hyphen'] = 333;
    t['period'] = 250;
    t['slash'] = 278;
    t['zero'] = 500;
    t['one'] = 500;
    t['two'] = 500;
    t['three'] = 500;
    t['four'] = 500;
    t['five'] = 500;
    t['six'] = 500;
    t['seven'] = 500;
    t['eight'] = 500;
    t['nine'] = 500;
    t['colon'] = 333;
    t['semicolon'] = 333;
    t['less'] = 570;
    t['equal'] = 570;
    t['greater'] = 570;
    t['question'] = 500;
    t['at'] = 832;
    t['A'] = 667;
    t['B'] = 667;
    t['C'] = 667;
    t['D'] = 722;
    t['E'] = 667;
    t['F'] = 667;
    t['G'] = 722;
    t['H'] = 778;
    t['I'] = 389;
    t['J'] = 500;
    t['K'] = 667;
    t['L'] = 611;
    t['M'] = 889;
    t['N'] = 722;
    t['O'] = 722;
    t['P'] = 611;
    t['Q'] = 722;
    t['R'] = 667;
    t['S'] = 556;
    t['T'] = 611;
    t['U'] = 722;
    t['V'] = 667;
    t['W'] = 889;
    t['X'] = 667;
    t['Y'] = 611;
    t['Z'] = 611;
    t['bracketleft'] = 333;
    t['backslash'] = 278;
    t['bracketright'] = 333;
    t['asciicircum'] = 570;
    t['underscore'] = 500;
    t['quoteleft'] = 333;
    t['a'] = 500;
    t['b'] = 500;
    t['c'] = 444;
    t['d'] = 500;
    t['e'] = 444;
    t['f'] = 333;
    t['g'] = 500;
    t['h'] = 556;
    t['i'] = 278;
    t['j'] = 278;
    t['k'] = 500;
    t['l'] = 278;
    t['m'] = 778;
    t['n'] = 556;
    t['o'] = 500;
    t['p'] = 500;
    t['q'] = 500;
    t['r'] = 389;
    t['s'] = 389;
    t['t'] = 278;
    t['u'] = 556;
    t['v'] = 444;
    t['w'] = 667;
    t['x'] = 500;
    t['y'] = 444;
    t['z'] = 389;
    t['braceleft'] = 348;
    t['bar'] = 220;
    t['braceright'] = 348;
    t['asciitilde'] = 570;
    t['exclamdown'] = 389;
    t['cent'] = 500;
    t['sterling'] = 500;
    t['fraction'] = 167;
    t['yen'] = 500;
    t['florin'] = 500;
    t['section'] = 500;
    t['currency'] = 500;
    t['quotesingle'] = 278;
    t['quotedblleft'] = 500;
    t['guillemotleft'] = 500;
    t['guilsinglleft'] = 333;
    t['guilsinglright'] = 333;
    t['fi'] = 556;
    t['fl'] = 556;
    t['endash'] = 500;
    t['dagger'] = 500;
    t['daggerdbl'] = 500;
    t['periodcentered'] = 250;
    t['paragraph'] = 500;
    t['bullet'] = 350;
    t['quotesinglbase'] = 333;
    t['quotedblbase'] = 500;
    t['quotedblright'] = 500;
    t['guillemotright'] = 500;
    t['ellipsis'] = 1000;
    t['perthousand'] = 1000;
    t['questiondown'] = 500;
    t['grave'] = 333;
    t['acute'] = 333;
    t['circumflex'] = 333;
    t['tilde'] = 333;
    t['macron'] = 333;
    t['breve'] = 333;
    t['dotaccent'] = 333;
    t['dieresis'] = 333;
    t['ring'] = 333;
    t['cedilla'] = 333;
    t['hungarumlaut'] = 333;
    t['ogonek'] = 333;
    t['caron'] = 333;
    t['emdash'] = 1000;
    t['AE'] = 944;
    t['ordfeminine'] = 266;
    t['Lslash'] = 611;
    t['Oslash'] = 722;
    t['OE'] = 944;
    t['ordmasculine'] = 300;
    t['ae'] = 722;
    t['dotlessi'] = 278;
    t['lslash'] = 278;
    t['oslash'] = 500;
    t['oe'] = 722;
    t['germandbls'] = 500;
    t['Idieresis'] = 389;
    t['eacute'] = 444;
    t['abreve'] = 500;
    t['uhungarumlaut'] = 556;
    t['ecaron'] = 444;
    t['Ydieresis'] = 611;
    t['divide'] = 570;
    t['Yacute'] = 611;
    t['Acircumflex'] = 667;
    t['aacute'] = 500;
    t['Ucircumflex'] = 722;
    t['yacute'] = 444;
    t['scommaaccent'] = 389;
    t['ecircumflex'] = 444;
    t['Uring'] = 722;
    t['Udieresis'] = 722;
    t['aogonek'] = 500;
    t['Uacute'] = 722;
    t['uogonek'] = 556;
    t['Edieresis'] = 667;
    t['Dcroat'] = 722;
    t['commaaccent'] = 250;
    t['copyright'] = 747;
    t['Emacron'] = 667;
    t['ccaron'] = 444;
    t['aring'] = 500;
    t['Ncommaaccent'] = 722;
    t['lacute'] = 278;
    t['agrave'] = 500;
    t['Tcommaaccent'] = 611;
    t['Cacute'] = 667;
    t['atilde'] = 500;
    t['Edotaccent'] = 667;
    t['scaron'] = 389;
    t['scedilla'] = 389;
    t['iacute'] = 278;
    t['lozenge'] = 494;
    t['Rcaron'] = 667;
    t['Gcommaaccent'] = 722;
    t['ucircumflex'] = 556;
    t['acircumflex'] = 500;
    t['Amacron'] = 667;
    t['rcaron'] = 389;
    t['ccedilla'] = 444;
    t['Zdotaccent'] = 611;
    t['Thorn'] = 611;
    t['Omacron'] = 722;
    t['Racute'] = 667;
    t['Sacute'] = 556;
    t['dcaron'] = 608;
    t['Umacron'] = 722;
    t['uring'] = 556;
    t['threesuperior'] = 300;
    t['Ograve'] = 722;
    t['Agrave'] = 667;
    t['Abreve'] = 667;
    t['multiply'] = 570;
    t['uacute'] = 556;
    t['Tcaron'] = 611;
    t['partialdiff'] = 494;
    t['ydieresis'] = 444;
    t['Nacute'] = 722;
    t['icircumflex'] = 278;
    t['Ecircumflex'] = 667;
    t['adieresis'] = 500;
    t['edieresis'] = 444;
    t['cacute'] = 444;
    t['nacute'] = 556;
    t['umacron'] = 556;
    t['Ncaron'] = 722;
    t['Iacute'] = 389;
    t['plusminus'] = 570;
    t['brokenbar'] = 220;
    t['registered'] = 747;
    t['Gbreve'] = 722;
    t['Idotaccent'] = 389;
    t['summation'] = 600;
    t['Egrave'] = 667;
    t['racute'] = 389;
    t['omacron'] = 500;
    t['Zacute'] = 611;
    t['Zcaron'] = 611;
    t['greaterequal'] = 549;
    t['Eth'] = 722;
    t['Ccedilla'] = 667;
    t['lcommaaccent'] = 278;
    t['tcaron'] = 366;
    t['eogonek'] = 444;
    t['Uogonek'] = 722;
    t['Aacute'] = 667;
    t['Adieresis'] = 667;
    t['egrave'] = 444;
    t['zacute'] = 389;
    t['iogonek'] = 278;
    t['Oacute'] = 722;
    t['oacute'] = 500;
    t['amacron'] = 500;
    t['sacute'] = 389;
    t['idieresis'] = 278;
    t['Ocircumflex'] = 722;
    t['Ugrave'] = 722;
    t['Delta'] = 612;
    t['thorn'] = 500;
    t['twosuperior'] = 300;
    t['Odieresis'] = 722;
    t['mu'] = 576;
    t['igrave'] = 278;
    t['ohungarumlaut'] = 500;
    t['Eogonek'] = 667;
    t['dcroat'] = 500;
    t['threequarters'] = 750;
    t['Scedilla'] = 556;
    t['lcaron'] = 382;
    t['Kcommaaccent'] = 667;
    t['Lacute'] = 611;
    t['trademark'] = 1000;
    t['edotaccent'] = 444;
    t['Igrave'] = 389;
    t['Imacron'] = 389;
    t['Lcaron'] = 611;
    t['onehalf'] = 750;
    t['lessequal'] = 549;
    t['ocircumflex'] = 500;
    t['ntilde'] = 556;
    t['Uhungarumlaut'] = 722;
    t['Eacute'] = 667;
    t['emacron'] = 444;
    t['gbreve'] = 500;
    t['onequarter'] = 750;
    t['Scaron'] = 556;
    t['Scommaaccent'] = 556;
    t['Ohungarumlaut'] = 722;
    t['degree'] = 400;
    t['ograve'] = 500;
    t['Ccaron'] = 667;
    t['ugrave'] = 556;
    t['radical'] = 549;
    t['Dcaron'] = 722;
    t['rcommaaccent'] = 389;
    t['Ntilde'] = 722;
    t['otilde'] = 500;
    t['Rcommaaccent'] = 667;
    t['Lcommaaccent'] = 611;
    t['Atilde'] = 667;
    t['Aogonek'] = 667;
    t['Aring'] = 667;
    t['Otilde'] = 722;
    t['zdotaccent'] = 389;
    t['Ecaron'] = 667;
    t['Iogonek'] = 389;
    t['kcommaaccent'] = 500;
    t['minus'] = 606;
    t['Icircumflex'] = 389;
    t['ncaron'] = 556;
    t['tcommaaccent'] = 278;
    t['logicalnot'] = 606;
    t['odieresis'] = 500;
    t['udieresis'] = 556;
    t['notequal'] = 549;
    t['gcommaaccent'] = 500;
    t['eth'] = 500;
    t['zcaron'] = 389;
    t['ncommaaccent'] = 556;
    t['onesuperior'] = 300;
    t['imacron'] = 278;
    t['Euro'] = 500;
  });
  t['Times-Italic'] = (0, _util.getLookupTableFactory)(function (t) {
    t['space'] = 250;
    t['exclam'] = 333;
    t['quotedbl'] = 420;
    t['numbersign'] = 500;
    t['dollar'] = 500;
    t['percent'] = 833;
    t['ampersand'] = 778;
    t['quoteright'] = 333;
    t['parenleft'] = 333;
    t['parenright'] = 333;
    t['asterisk'] = 500;
    t['plus'] = 675;
    t['comma'] = 250;
    t['hyphen'] = 333;
    t['period'] = 250;
    t['slash'] = 278;
    t['zero'] = 500;
    t['one'] = 500;
    t['two'] = 500;
    t['three'] = 500;
    t['four'] = 500;
    t['five'] = 500;
    t['six'] = 500;
    t['seven'] = 500;
    t['eight'] = 500;
    t['nine'] = 500;
    t['colon'] = 333;
    t['semicolon'] = 333;
    t['less'] = 675;
    t['equal'] = 675;
    t['greater'] = 675;
    t['question'] = 500;
    t['at'] = 920;
    t['A'] = 611;
    t['B'] = 611;
    t['C'] = 667;
    t['D'] = 722;
    t['E'] = 611;
    t['F'] = 611;
    t['G'] = 722;
    t['H'] = 722;
    t['I'] = 333;
    t['J'] = 444;
    t['K'] = 667;
    t['L'] = 556;
    t['M'] = 833;
    t['N'] = 667;
    t['O'] = 722;
    t['P'] = 611;
    t['Q'] = 722;
    t['R'] = 611;
    t['S'] = 500;
    t['T'] = 556;
    t['U'] = 722;
    t['V'] = 611;
    t['W'] = 833;
    t['X'] = 611;
    t['Y'] = 556;
    t['Z'] = 556;
    t['bracketleft'] = 389;
    t['backslash'] = 278;
    t['bracketright'] = 389;
    t['asciicircum'] = 422;
    t['underscore'] = 500;
    t['quoteleft'] = 333;
    t['a'] = 500;
    t['b'] = 500;
    t['c'] = 444;
    t['d'] = 500;
    t['e'] = 444;
    t['f'] = 278;
    t['g'] = 500;
    t['h'] = 500;
    t['i'] = 278;
    t['j'] = 278;
    t['k'] = 444;
    t['l'] = 278;
    t['m'] = 722;
    t['n'] = 500;
    t['o'] = 500;
    t['p'] = 500;
    t['q'] = 500;
    t['r'] = 389;
    t['s'] = 389;
    t['t'] = 278;
    t['u'] = 500;
    t['v'] = 444;
    t['w'] = 667;
    t['x'] = 444;
    t['y'] = 444;
    t['z'] = 389;
    t['braceleft'] = 400;
    t['bar'] = 275;
    t['braceright'] = 400;
    t['asciitilde'] = 541;
    t['exclamdown'] = 389;
    t['cent'] = 500;
    t['sterling'] = 500;
    t['fraction'] = 167;
    t['yen'] = 500;
    t['florin'] = 500;
    t['section'] = 500;
    t['currency'] = 500;
    t['quotesingle'] = 214;
    t['quotedblleft'] = 556;
    t['guillemotleft'] = 500;
    t['guilsinglleft'] = 333;
    t['guilsinglright'] = 333;
    t['fi'] = 500;
    t['fl'] = 500;
    t['endash'] = 500;
    t['dagger'] = 500;
    t['daggerdbl'] = 500;
    t['periodcentered'] = 250;
    t['paragraph'] = 523;
    t['bullet'] = 350;
    t['quotesinglbase'] = 333;
    t['quotedblbase'] = 556;
    t['quotedblright'] = 556;
    t['guillemotright'] = 500;
    t['ellipsis'] = 889;
    t['perthousand'] = 1000;
    t['questiondown'] = 500;
    t['grave'] = 333;
    t['acute'] = 333;
    t['circumflex'] = 333;
    t['tilde'] = 333;
    t['macron'] = 333;
    t['breve'] = 333;
    t['dotaccent'] = 333;
    t['dieresis'] = 333;
    t['ring'] = 333;
    t['cedilla'] = 333;
    t['hungarumlaut'] = 333;
    t['ogonek'] = 333;
    t['caron'] = 333;
    t['emdash'] = 889;
    t['AE'] = 889;
    t['ordfeminine'] = 276;
    t['Lslash'] = 556;
    t['Oslash'] = 722;
    t['OE'] = 944;
    t['ordmasculine'] = 310;
    t['ae'] = 667;
    t['dotlessi'] = 278;
    t['lslash'] = 278;
    t['oslash'] = 500;
    t['oe'] = 667;
    t['germandbls'] = 500;
    t['Idieresis'] = 333;
    t['eacute'] = 444;
    t['abreve'] = 500;
    t['uhungarumlaut'] = 500;
    t['ecaron'] = 444;
    t['Ydieresis'] = 556;
    t['divide'] = 675;
    t['Yacute'] = 556;
    t['Acircumflex'] = 611;
    t['aacute'] = 500;
    t['Ucircumflex'] = 722;
    t['yacute'] = 444;
    t['scommaaccent'] = 389;
    t['ecircumflex'] = 444;
    t['Uring'] = 722;
    t['Udieresis'] = 722;
    t['aogonek'] = 500;
    t['Uacute'] = 722;
    t['uogonek'] = 500;
    t['Edieresis'] = 611;
    t['Dcroat'] = 722;
    t['commaaccent'] = 250;
    t['copyright'] = 760;
    t['Emacron'] = 611;
    t['ccaron'] = 444;
    t['aring'] = 500;
    t['Ncommaaccent'] = 667;
    t['lacute'] = 278;
    t['agrave'] = 500;
    t['Tcommaaccent'] = 556;
    t['Cacute'] = 667;
    t['atilde'] = 500;
    t['Edotaccent'] = 611;
    t['scaron'] = 389;
    t['scedilla'] = 389;
    t['iacute'] = 278;
    t['lozenge'] = 471;
    t['Rcaron'] = 611;
    t['Gcommaaccent'] = 722;
    t['ucircumflex'] = 500;
    t['acircumflex'] = 500;
    t['Amacron'] = 611;
    t['rcaron'] = 389;
    t['ccedilla'] = 444;
    t['Zdotaccent'] = 556;
    t['Thorn'] = 611;
    t['Omacron'] = 722;
    t['Racute'] = 611;
    t['Sacute'] = 500;
    t['dcaron'] = 544;
    t['Umacron'] = 722;
    t['uring'] = 500;
    t['threesuperior'] = 300;
    t['Ograve'] = 722;
    t['Agrave'] = 611;
    t['Abreve'] = 611;
    t['multiply'] = 675;
    t['uacute'] = 500;
    t['Tcaron'] = 556;
    t['partialdiff'] = 476;
    t['ydieresis'] = 444;
    t['Nacute'] = 667;
    t['icircumflex'] = 278;
    t['Ecircumflex'] = 611;
    t['adieresis'] = 500;
    t['edieresis'] = 444;
    t['cacute'] = 444;
    t['nacute'] = 500;
    t['umacron'] = 500;
    t['Ncaron'] = 667;
    t['Iacute'] = 333;
    t['plusminus'] = 675;
    t['brokenbar'] = 275;
    t['registered'] = 760;
    t['Gbreve'] = 722;
    t['Idotaccent'] = 333;
    t['summation'] = 600;
    t['Egrave'] = 611;
    t['racute'] = 389;
    t['omacron'] = 500;
    t['Zacute'] = 556;
    t['Zcaron'] = 556;
    t['greaterequal'] = 549;
    t['Eth'] = 722;
    t['Ccedilla'] = 667;
    t['lcommaaccent'] = 278;
    t['tcaron'] = 300;
    t['eogonek'] = 444;
    t['Uogonek'] = 722;
    t['Aacute'] = 611;
    t['Adieresis'] = 611;
    t['egrave'] = 444;
    t['zacute'] = 389;
    t['iogonek'] = 278;
    t['Oacute'] = 722;
    t['oacute'] = 500;
    t['amacron'] = 500;
    t['sacute'] = 389;
    t['idieresis'] = 278;
    t['Ocircumflex'] = 722;
    t['Ugrave'] = 722;
    t['Delta'] = 612;
    t['thorn'] = 500;
    t['twosuperior'] = 300;
    t['Odieresis'] = 722;
    t['mu'] = 500;
    t['igrave'] = 278;
    t['ohungarumlaut'] = 500;
    t['Eogonek'] = 611;
    t['dcroat'] = 500;
    t['threequarters'] = 750;
    t['Scedilla'] = 500;
    t['lcaron'] = 300;
    t['Kcommaaccent'] = 667;
    t['Lacute'] = 556;
    t['trademark'] = 980;
    t['edotaccent'] = 444;
    t['Igrave'] = 333;
    t['Imacron'] = 333;
    t['Lcaron'] = 611;
    t['onehalf'] = 750;
    t['lessequal'] = 549;
    t['ocircumflex'] = 500;
    t['ntilde'] = 500;
    t['Uhungarumlaut'] = 722;
    t['Eacute'] = 611;
    t['emacron'] = 444;
    t['gbreve'] = 500;
    t['onequarter'] = 750;
    t['Scaron'] = 500;
    t['Scommaaccent'] = 500;
    t['Ohungarumlaut'] = 722;
    t['degree'] = 400;
    t['ograve'] = 500;
    t['Ccaron'] = 667;
    t['ugrave'] = 500;
    t['radical'] = 453;
    t['Dcaron'] = 722;
    t['rcommaaccent'] = 389;
    t['Ntilde'] = 667;
    t['otilde'] = 500;
    t['Rcommaaccent'] = 611;
    t['Lcommaaccent'] = 556;
    t['Atilde'] = 611;
    t['Aogonek'] = 611;
    t['Aring'] = 611;
    t['Otilde'] = 722;
    t['zdotaccent'] = 389;
    t['Ecaron'] = 611;
    t['Iogonek'] = 333;
    t['kcommaaccent'] = 444;
    t['minus'] = 675;
    t['Icircumflex'] = 333;
    t['ncaron'] = 500;
    t['tcommaaccent'] = 278;
    t['logicalnot'] = 675;
    t['odieresis'] = 500;
    t['udieresis'] = 500;
    t['notequal'] = 549;
    t['gcommaaccent'] = 500;
    t['eth'] = 500;
    t['zcaron'] = 389;
    t['ncommaaccent'] = 500;
    t['onesuperior'] = 300;
    t['imacron'] = 278;
    t['Euro'] = 500;
  });
  t['ZapfDingbats'] = (0, _util.getLookupTableFactory)(function (t) {
    t['space'] = 278;
    t['a1'] = 974;
    t['a2'] = 961;
    t['a202'] = 974;
    t['a3'] = 980;
    t['a4'] = 719;
    t['a5'] = 789;
    t['a119'] = 790;
    t['a118'] = 791;
    t['a117'] = 690;
    t['a11'] = 960;
    t['a12'] = 939;
    t['a13'] = 549;
    t['a14'] = 855;
    t['a15'] = 911;
    t['a16'] = 933;
    t['a105'] = 911;
    t['a17'] = 945;
    t['a18'] = 974;
    t['a19'] = 755;
    t['a20'] = 846;
    t['a21'] = 762;
    t['a22'] = 761;
    t['a23'] = 571;
    t['a24'] = 677;
    t['a25'] = 763;
    t['a26'] = 760;
    t['a27'] = 759;
    t['a28'] = 754;
    t['a6'] = 494;
    t['a7'] = 552;
    t['a8'] = 537;
    t['a9'] = 577;
    t['a10'] = 692;
    t['a29'] = 786;
    t['a30'] = 788;
    t['a31'] = 788;
    t['a32'] = 790;
    t['a33'] = 793;
    t['a34'] = 794;
    t['a35'] = 816;
    t['a36'] = 823;
    t['a37'] = 789;
    t['a38'] = 841;
    t['a39'] = 823;
    t['a40'] = 833;
    t['a41'] = 816;
    t['a42'] = 831;
    t['a43'] = 923;
    t['a44'] = 744;
    t['a45'] = 723;
    t['a46'] = 749;
    t['a47'] = 790;
    t['a48'] = 792;
    t['a49'] = 695;
    t['a50'] = 776;
    t['a51'] = 768;
    t['a52'] = 792;
    t['a53'] = 759;
    t['a54'] = 707;
    t['a55'] = 708;
    t['a56'] = 682;
    t['a57'] = 701;
    t['a58'] = 826;
    t['a59'] = 815;
    t['a60'] = 789;
    t['a61'] = 789;
    t['a62'] = 707;
    t['a63'] = 687;
    t['a64'] = 696;
    t['a65'] = 689;
    t['a66'] = 786;
    t['a67'] = 787;
    t['a68'] = 713;
    t['a69'] = 791;
    t['a70'] = 785;
    t['a71'] = 791;
    t['a72'] = 873;
    t['a73'] = 761;
    t['a74'] = 762;
    t['a203'] = 762;
    t['a75'] = 759;
    t['a204'] = 759;
    t['a76'] = 892;
    t['a77'] = 892;
    t['a78'] = 788;
    t['a79'] = 784;
    t['a81'] = 438;
    t['a82'] = 138;
    t['a83'] = 277;
    t['a84'] = 415;
    t['a97'] = 392;
    t['a98'] = 392;
    t['a99'] = 668;
    t['a100'] = 668;
    t['a89'] = 390;
    t['a90'] = 390;
    t['a93'] = 317;
    t['a94'] = 317;
    t['a91'] = 276;
    t['a92'] = 276;
    t['a205'] = 509;
    t['a85'] = 509;
    t['a206'] = 410;
    t['a86'] = 410;
    t['a87'] = 234;
    t['a88'] = 234;
    t['a95'] = 334;
    t['a96'] = 334;
    t['a101'] = 732;
    t['a102'] = 544;
    t['a103'] = 544;
    t['a104'] = 910;
    t['a106'] = 667;
    t['a107'] = 760;
    t['a108'] = 760;
    t['a112'] = 776;
    t['a111'] = 595;
    t['a110'] = 694;
    t['a109'] = 626;
    t['a120'] = 788;
    t['a121'] = 788;
    t['a122'] = 788;
    t['a123'] = 788;
    t['a124'] = 788;
    t['a125'] = 788;
    t['a126'] = 788;
    t['a127'] = 788;
    t['a128'] = 788;
    t['a129'] = 788;
    t['a130'] = 788;
    t['a131'] = 788;
    t['a132'] = 788;
    t['a133'] = 788;
    t['a134'] = 788;
    t['a135'] = 788;
    t['a136'] = 788;
    t['a137'] = 788;
    t['a138'] = 788;
    t['a139'] = 788;
    t['a140'] = 788;
    t['a141'] = 788;
    t['a142'] = 788;
    t['a143'] = 788;
    t['a144'] = 788;
    t['a145'] = 788;
    t['a146'] = 788;
    t['a147'] = 788;
    t['a148'] = 788;
    t['a149'] = 788;
    t['a150'] = 788;
    t['a151'] = 788;
    t['a152'] = 788;
    t['a153'] = 788;
    t['a154'] = 788;
    t['a155'] = 788;
    t['a156'] = 788;
    t['a157'] = 788;
    t['a158'] = 788;
    t['a159'] = 788;
    t['a160'] = 894;
    t['a161'] = 838;
    t['a163'] = 1016;
    t['a164'] = 458;
    t['a196'] = 748;
    t['a165'] = 924;
    t['a192'] = 748;
    t['a166'] = 918;
    t['a167'] = 927;
    t['a168'] = 928;
    t['a169'] = 928;
    t['a170'] = 834;
    t['a171'] = 873;
    t['a172'] = 828;
    t['a173'] = 924;
    t['a162'] = 924;
    t['a174'] = 917;
    t['a175'] = 930;
    t['a176'] = 931;
    t['a177'] = 463;
    t['a178'] = 883;
    t['a179'] = 836;
    t['a193'] = 836;
    t['a180'] = 867;
    t['a199'] = 867;
    t['a181'] = 696;
    t['a200'] = 696;
    t['a182'] = 874;
    t['a201'] = 874;
    t['a183'] = 760;
    t['a184'] = 946;
    t['a197'] = 771;
    t['a185'] = 865;
    t['a194'] = 771;
    t['a198'] = 888;
    t['a186'] = 967;
    t['a195'] = 888;
    t['a187'] = 831;
    t['a188'] = 873;
    t['a189'] = 927;
    t['a190'] = 970;
    t['a191'] = 918;
  });
});
exports.getMetrics = getMetrics;

/***/ }),
/* 185 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isPDFFunction = isPDFFunction;
exports.PostScriptCompiler = exports.PostScriptEvaluator = exports.PDFFunctionFactory = void 0;

var _util = __w_pdfjs_require__(6);

var _primitives = __w_pdfjs_require__(155);

var _ps_parser = __w_pdfjs_require__(186);

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var IsEvalSupportedCached = {
  get value() {
    return (0, _util.shadow)(this, 'value', (0, _util.isEvalSupported)());
  }

};

var PDFFunctionFactory =
/*#__PURE__*/
function () {
  function PDFFunctionFactory(_ref) {
    var xref = _ref.xref,
        _ref$isEvalSupported = _ref.isEvalSupported,
        isEvalSupported = _ref$isEvalSupported === void 0 ? true : _ref$isEvalSupported;

    _classCallCheck(this, PDFFunctionFactory);

    this.xref = xref;
    this.isEvalSupported = isEvalSupported !== false;
  }

  _createClass(PDFFunctionFactory, [{
    key: "create",
    value: function create(fn) {
      return PDFFunction.parse({
        xref: this.xref,
        isEvalSupported: this.isEvalSupported,
        fn: fn
      });
    }
  }, {
    key: "createFromArray",
    value: function createFromArray(fnObj) {
      return PDFFunction.parseArray({
        xref: this.xref,
        isEvalSupported: this.isEvalSupported,
        fnObj: fnObj
      });
    }
  }]);

  return PDFFunctionFactory;
}();

exports.PDFFunctionFactory = PDFFunctionFactory;

function toNumberArray(arr) {
  if (!Array.isArray(arr)) {
    return null;
  }

  var length = arr.length;

  for (var i = 0; i < length; i++) {
    if (typeof arr[i] !== 'number') {
      var result = new Array(length);

      for (var _i = 0; _i < length; _i++) {
        result[_i] = +arr[_i];
      }

      return result;
    }
  }

  return arr;
}

var PDFFunction = function PDFFunctionClosure() {
  var CONSTRUCT_SAMPLED = 0;
  var CONSTRUCT_INTERPOLATED = 2;
  var CONSTRUCT_STICHED = 3;
  var CONSTRUCT_POSTSCRIPT = 4;
  return {
    getSampleArray: function getSampleArray(size, outputSize, bps, stream) {
      var i, ii;
      var length = 1;

      for (i = 0, ii = size.length; i < ii; i++) {
        length *= size[i];
      }

      length *= outputSize;
      var array = new Array(length);
      var codeSize = 0;
      var codeBuf = 0;
      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
      var strBytes = stream.getBytes((length * bps + 7) / 8);
      var strIdx = 0;

      for (i = 0; i < length; i++) {
        while (codeSize < bps) {
          codeBuf <<= 8;
          codeBuf |= strBytes[strIdx++];
          codeSize += 8;
        }

        codeSize -= bps;
        array[i] = (codeBuf >> codeSize) * sampleMul;
        codeBuf &= (1 << codeSize) - 1;
      }

      return array;
    },
    getIR: function getIR(_ref2) {
      var xref = _ref2.xref,
          isEvalSupported = _ref2.isEvalSupported,
          fn = _ref2.fn;
      var dict = fn.dict;

      if (!dict) {
        dict = fn;
      }

      var types = [this.constructSampled, null, this.constructInterpolated, this.constructStiched, this.constructPostScript];
      var typeNum = dict.get('FunctionType');
      var typeFn = types[typeNum];

      if (!typeFn) {
        throw new _util.FormatError('Unknown type of function');
      }

      return typeFn.call(this, {
        xref: xref,
        isEvalSupported: isEvalSupported,
        fn: fn,
        dict: dict
      });
    },
    fromIR: function fromIR(_ref3) {
      var xref = _ref3.xref,
          isEvalSupported = _ref3.isEvalSupported,
          IR = _ref3.IR;
      var type = IR[0];

      switch (type) {
        case CONSTRUCT_SAMPLED:
          return this.constructSampledFromIR({
            xref: xref,
            isEvalSupported: isEvalSupported,
            IR: IR
          });

        case CONSTRUCT_INTERPOLATED:
          return this.constructInterpolatedFromIR({
            xref: xref,
            isEvalSupported: isEvalSupported,
            IR: IR
          });

        case CONSTRUCT_STICHED:
          return this.constructStichedFromIR({
            xref: xref,
            isEvalSupported: isEvalSupported,
            IR: IR
          });

        default:
          return this.constructPostScriptFromIR({
            xref: xref,
            isEvalSupported: isEvalSupported,
            IR: IR
          });
      }
    },
    parse: function parse(_ref4) {
      var xref = _ref4.xref,
          isEvalSupported = _ref4.isEvalSupported,
          fn = _ref4.fn;
      var IR = this.getIR({
        xref: xref,
        isEvalSupported: isEvalSupported,
        fn: fn
      });
      return this.fromIR({
        xref: xref,
        isEvalSupported: isEvalSupported,
        IR: IR
      });
    },
    parseArray: function parseArray(_ref5) {
      var xref = _ref5.xref,
          isEvalSupported = _ref5.isEvalSupported,
          fnObj = _ref5.fnObj;

      if (!Array.isArray(fnObj)) {
        return this.parse({
          xref: xref,
          isEvalSupported: isEvalSupported,
          fn: fnObj
        });
      }

      var fnArray = [];

      for (var j = 0, jj = fnObj.length; j < jj; j++) {
        fnArray.push(this.parse({
          xref: xref,
          isEvalSupported: isEvalSupported,
          fn: xref.fetchIfRef(fnObj[j])
        }));
      }

      return function (src, srcOffset, dest, destOffset) {
        for (var i = 0, ii = fnArray.length; i < ii; i++) {
          fnArray[i](src, srcOffset, dest, destOffset + i);
        }
      };
    },
    constructSampled: function constructSampled(_ref6) {
      var xref = _ref6.xref,
          isEvalSupported = _ref6.isEvalSupported,
          fn = _ref6.fn,
          dict = _ref6.dict;

      function toMultiArray(arr) {
        var inputLength = arr.length;
        var out = [];
        var index = 0;

        for (var i = 0; i < inputLength; i += 2) {
          out[index] = [arr[i], arr[i + 1]];
          ++index;
        }

        return out;
      }

      var domain = toNumberArray(dict.getArray('Domain'));
      var range = toNumberArray(dict.getArray('Range'));

      if (!domain || !range) {
        throw new _util.FormatError('No domain or range');
      }

      var inputSize = domain.length / 2;
      var outputSize = range.length / 2;
      domain = toMultiArray(domain);
      range = toMultiArray(range);
      var size = toNumberArray(dict.getArray('Size'));
      var bps = dict.get('BitsPerSample');
      var order = dict.get('Order') || 1;

      if (order !== 1) {
        (0, _util.info)('No support for cubic spline interpolation: ' + order);
      }

      var encode = toNumberArray(dict.getArray('Encode'));

      if (!encode) {
        encode = [];

        for (var i = 0; i < inputSize; ++i) {
          encode.push([0, size[i] - 1]);
        }
      } else {
        encode = toMultiArray(encode);
      }

      var decode = toNumberArray(dict.getArray('Decode'));

      if (!decode) {
        decode = range;
      } else {
        decode = toMultiArray(decode);
      }

      var samples = this.getSampleArray(size, outputSize, bps, fn);
      return [CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size, outputSize, Math.pow(2, bps) - 1, range];
    },
    constructSampledFromIR: function constructSampledFromIR(_ref7) {
      var xref = _ref7.xref,
          isEvalSupported = _ref7.isEvalSupported,
          IR = _ref7.IR;

      function interpolate(x, xmin, xmax, ymin, ymax) {
        return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));
      }

      return function constructSampledFromIRResult(src, srcOffset, dest, destOffset) {
        var m = IR[1];
        var domain = IR[2];
        var encode = IR[3];
        var decode = IR[4];
        var samples = IR[5];
        var size = IR[6];
        var n = IR[7];
        var range = IR[9];
        var cubeVertices = 1 << m;
        var cubeN = new Float64Array(cubeVertices);
        var cubeVertex = new Uint32Array(cubeVertices);
        var i, j;

        for (j = 0; j < cubeVertices; j++) {
          cubeN[j] = 1;
        }

        var k = n,
            pos = 1;

        for (i = 0; i < m; ++i) {
          var domain_2i = domain[i][0];
          var domain_2i_1 = domain[i][1];
          var xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1);
          var e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]);
          var size_i = size[i];
          e = Math.min(Math.max(e, 0), size_i - 1);
          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1;
          var n0 = e0 + 1 - e;
          var n1 = e - e0;
          var offset0 = e0 * k;
          var offset1 = offset0 + k;

          for (j = 0; j < cubeVertices; j++) {
            if (j & pos) {
              cubeN[j] *= n1;
              cubeVertex[j] += offset1;
            } else {
              cubeN[j] *= n0;
              cubeVertex[j] += offset0;
            }
          }

          k *= size_i;
          pos <<= 1;
        }

        for (j = 0; j < n; ++j) {
          var rj = 0;

          for (i = 0; i < cubeVertices; i++) {
            rj += samples[cubeVertex[i] + j] * cubeN[i];
          }

          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
          dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
        }
      };
    },
    constructInterpolated: function constructInterpolated(_ref8) {
      var xref = _ref8.xref,
          isEvalSupported = _ref8.isEvalSupported,
          fn = _ref8.fn,
          dict = _ref8.dict;
      var c0 = toNumberArray(dict.getArray('C0')) || [0];
      var c1 = toNumberArray(dict.getArray('C1')) || [1];
      var n = dict.get('N');
      var length = c0.length;
      var diff = [];

      for (var i = 0; i < length; ++i) {
        diff.push(c1[i] - c0[i]);
      }

      return [CONSTRUCT_INTERPOLATED, c0, diff, n];
    },
    constructInterpolatedFromIR: function constructInterpolatedFromIR(_ref9) {
      var xref = _ref9.xref,
          isEvalSupported = _ref9.isEvalSupported,
          IR = _ref9.IR;
      var c0 = IR[1];
      var diff = IR[2];
      var n = IR[3];
      var length = diff.length;
      return function constructInterpolatedFromIRResult(src, srcOffset, dest, destOffset) {
        var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n);

        for (var j = 0; j < length; ++j) {
          dest[destOffset + j] = c0[j] + x * diff[j];
        }
      };
    },
    constructStiched: function constructStiched(_ref10) {
      var xref = _ref10.xref,
          isEvalSupported = _ref10.isEvalSupported,
          fn = _ref10.fn,
          dict = _ref10.dict;
      var domain = toNumberArray(dict.getArray('Domain'));

      if (!domain) {
        throw new _util.FormatError('No domain');
      }

      var inputSize = domain.length / 2;

      if (inputSize !== 1) {
        throw new _util.FormatError('Bad domain for stiched function');
      }

      var fnRefs = dict.get('Functions');
      var fns = [];

      for (var i = 0, ii = fnRefs.length; i < ii; ++i) {
        fns.push(this.parse({
          xref: xref,
          isEvalSupported: isEvalSupported,
          fn: xref.fetchIfRef(fnRefs[i])
        }));
      }

      var bounds = toNumberArray(dict.getArray('Bounds'));
      var encode = toNumberArray(dict.getArray('Encode'));
      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
    },
    constructStichedFromIR: function constructStichedFromIR(_ref11) {
      var xref = _ref11.xref,
          isEvalSupported = _ref11.isEvalSupported,
          IR = _ref11.IR;
      var domain = IR[1];
      var bounds = IR[2];
      var encode = IR[3];
      var fns = IR[4];
      var tmpBuf = new Float32Array(1);
      return function constructStichedFromIRResult(src, srcOffset, dest, destOffset) {
        var clip = function constructStichedFromIRClip(v, min, max) {
          if (v > max) {
            v = max;
          } else if (v < min) {
            v = min;
          }

          return v;
        };

        var v = clip(src[srcOffset], domain[0], domain[1]);

        for (var i = 0, ii = bounds.length; i < ii; ++i) {
          if (v < bounds[i]) {
            break;
          }
        }

        var dmin = domain[0];

        if (i > 0) {
          dmin = bounds[i - 1];
        }

        var dmax = domain[1];

        if (i < bounds.length) {
          dmax = bounds[i];
        }

        var rmin = encode[2 * i];
        var rmax = encode[2 * i + 1];
        tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
        fns[i](tmpBuf, 0, dest, destOffset);
      };
    },
    constructPostScript: function constructPostScript(_ref12) {
      var xref = _ref12.xref,
          isEvalSupported = _ref12.isEvalSupported,
          fn = _ref12.fn,
          dict = _ref12.dict;
      var domain = toNumberArray(dict.getArray('Domain'));
      var range = toNumberArray(dict.getArray('Range'));

      if (!domain) {
        throw new _util.FormatError('No domain.');
      }

      if (!range) {
        throw new _util.FormatError('No range.');
      }

      var lexer = new _ps_parser.PostScriptLexer(fn);
      var parser = new _ps_parser.PostScriptParser(lexer);
      var code = parser.parse();
      return [CONSTRUCT_POSTSCRIPT, domain, range, code];
    },
    constructPostScriptFromIR: function constructPostScriptFromIR(_ref13) {
      var xref = _ref13.xref,
          isEvalSupported = _ref13.isEvalSupported,
          IR = _ref13.IR;
      var domain = IR[1];
      var range = IR[2];
      var code = IR[3];

      if (isEvalSupported && IsEvalSupportedCached.value) {
        var compiled = new PostScriptCompiler().compile(code, domain, range);

        if (compiled) {
          return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled);
        }
      }

      (0, _util.info)('Unable to compile PS function');
      var numOutputs = range.length >> 1;
      var numInputs = domain.length >> 1;
      var evaluator = new PostScriptEvaluator(code);
      var cache = Object.create(null);
      var MAX_CACHE_SIZE = 2048 * 4;
      var cache_available = MAX_CACHE_SIZE;
      var tmpBuf = new Float32Array(numInputs);
      return function constructPostScriptFromIRResult(src, srcOffset, dest, destOffset) {
        var i, value;
        var key = '';
        var input = tmpBuf;

        for (i = 0; i < numInputs; i++) {
          value = src[srcOffset + i];
          input[i] = value;
          key += value + '_';
        }

        var cachedValue = cache[key];

        if (cachedValue !== undefined) {
          dest.set(cachedValue, destOffset);
          return;
        }

        var output = new Float32Array(numOutputs);
        var stack = evaluator.execute(input);
        var stackIndex = stack.length - numOutputs;

        for (i = 0; i < numOutputs; i++) {
          value = stack[stackIndex + i];
          var bound = range[i * 2];

          if (value < bound) {
            value = bound;
          } else {
            bound = range[i * 2 + 1];

            if (value > bound) {
              value = bound;
            }
          }

          output[i] = value;
        }

        if (cache_available > 0) {
          cache_available--;
          cache[key] = output;
        }

        dest.set(output, destOffset);
      };
    }
  };
}();

function isPDFFunction(v) {
  var fnDict;

  if (_typeof(v) !== 'object') {
    return false;
  } else if ((0, _primitives.isDict)(v)) {
    fnDict = v;
  } else if ((0, _primitives.isStream)(v)) {
    fnDict = v.dict;
  } else {
    return false;
  }

  return fnDict.has('FunctionType');
}

var PostScriptStack = function PostScriptStackClosure() {
  var MAX_STACK_SIZE = 100;

  function PostScriptStack(initialStack) {
    this.stack = !initialStack ? [] : Array.prototype.slice.call(initialStack, 0);
  }

  PostScriptStack.prototype = {
    push: function PostScriptStack_push(value) {
      if (this.stack.length >= MAX_STACK_SIZE) {
        throw new Error('PostScript function stack overflow.');
      }

      this.stack.push(value);
    },
    pop: function PostScriptStack_pop() {
      if (this.stack.length <= 0) {
        throw new Error('PostScript function stack underflow.');
      }

      return this.stack.pop();
    },
    copy: function PostScriptStack_copy(n) {
      if (this.stack.length + n >= MAX_STACK_SIZE) {
        throw new Error('PostScript function stack overflow.');
      }

      var stack = this.stack;

      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {
        stack.push(stack[i]);
      }
    },
    index: function PostScriptStack_index(n) {
      this.push(this.stack[this.stack.length - n - 1]);
    },
    roll: function PostScriptStack_roll(n, p) {
      var stack = this.stack;
      var l = stack.length - n;
      var r = stack.length - 1,
          c = l + (p - Math.floor(p / n) * n),
          i,
          j,
          t;

      for (i = l, j = r; i < j; i++, j--) {
        t = stack[i];
        stack[i] = stack[j];
        stack[j] = t;
      }

      for (i = l, j = c - 1; i < j; i++, j--) {
        t = stack[i];
        stack[i] = stack[j];
        stack[j] = t;
      }

      for (i = c, j = r; i < j; i++, j--) {
        t = stack[i];
        stack[i] = stack[j];
        stack[j] = t;
      }
    }
  };
  return PostScriptStack;
}();

var PostScriptEvaluator = function PostScriptEvaluatorClosure() {
  function PostScriptEvaluator(operators) {
    this.operators = operators;
  }

  PostScriptEvaluator.prototype = {
    execute: function PostScriptEvaluator_execute(initialStack) {
      var stack = new PostScriptStack(initialStack);
      var counter = 0;
      var operators = this.operators;
      var length = operators.length;
      var operator, a, b;

      while (counter < length) {
        operator = operators[counter++];

        if (typeof operator === 'number') {
          stack.push(operator);
          continue;
        }

        switch (operator) {
          case 'jz':
            b = stack.pop();
            a = stack.pop();

            if (!a) {
              counter = b;
            }

            break;

          case 'j':
            a = stack.pop();
            counter = a;
            break;

          case 'abs':
            a = stack.pop();
            stack.push(Math.abs(a));
            break;

          case 'add':
            b = stack.pop();
            a = stack.pop();
            stack.push(a + b);
            break;

          case 'and':
            b = stack.pop();
            a = stack.pop();

            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
              stack.push(a && b);
            } else {
              stack.push(a & b);
            }

            break;

          case 'atan':
            a = stack.pop();
            stack.push(Math.atan(a));
            break;

          case 'bitshift':
            b = stack.pop();
            a = stack.pop();

            if (a > 0) {
              stack.push(a << b);
            } else {
              stack.push(a >> b);
            }

            break;

          case 'ceiling':
            a = stack.pop();
            stack.push(Math.ceil(a));
            break;

          case 'copy':
            a = stack.pop();
            stack.copy(a);
            break;

          case 'cos':
            a = stack.pop();
            stack.push(Math.cos(a));
            break;

          case 'cvi':
            a = stack.pop() | 0;
            stack.push(a);
            break;

          case 'cvr':
            break;

          case 'div':
            b = stack.pop();
            a = stack.pop();
            stack.push(a / b);
            break;

          case 'dup':
            stack.copy(1);
            break;

          case 'eq':
            b = stack.pop();
            a = stack.pop();
            stack.push(a === b);
            break;

          case 'exch':
            stack.roll(2, 1);
            break;

          case 'exp':
            b = stack.pop();
            a = stack.pop();
            stack.push(Math.pow(a, b));
            break;

          case 'false':
            stack.push(false);
            break;

          case 'floor':
            a = stack.pop();
            stack.push(Math.floor(a));
            break;

          case 'ge':
            b = stack.pop();
            a = stack.pop();
            stack.push(a >= b);
            break;

          case 'gt':
            b = stack.pop();
            a = stack.pop();
            stack.push(a > b);
            break;

          case 'idiv':
            b = stack.pop();
            a = stack.pop();
            stack.push(a / b | 0);
            break;

          case 'index':
            a = stack.pop();
            stack.index(a);
            break;

          case 'le':
            b = stack.pop();
            a = stack.pop();
            stack.push(a <= b);
            break;

          case 'ln':
            a = stack.pop();
            stack.push(Math.log(a));
            break;

          case 'log':
            a = stack.pop();
            stack.push(Math.log(a) / Math.LN10);
            break;

          case 'lt':
            b = stack.pop();
            a = stack.pop();
            stack.push(a < b);
            break;

          case 'mod':
            b = stack.pop();
            a = stack.pop();
            stack.push(a % b);
            break;

          case 'mul':
            b = stack.pop();
            a = stack.pop();
            stack.push(a * b);
            break;

          case 'ne':
            b = stack.pop();
            a = stack.pop();
            stack.push(a !== b);
            break;

          case 'neg':
            a = stack.pop();
            stack.push(-a);
            break;

          case 'not':
            a = stack.pop();

            if ((0, _util.isBool)(a)) {
              stack.push(!a);
            } else {
              stack.push(~a);
            }

            break;

          case 'or':
            b = stack.pop();
            a = stack.pop();

            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
              stack.push(a || b);
            } else {
              stack.push(a | b);
            }

            break;

          case 'pop':
            stack.pop();
            break;

          case 'roll':
            b = stack.pop();
            a = stack.pop();
            stack.roll(a, b);
            break;

          case 'round':
            a = stack.pop();
            stack.push(Math.round(a));
            break;

          case 'sin':
            a = stack.pop();
            stack.push(Math.sin(a));
            break;

          case 'sqrt':
            a = stack.pop();
            stack.push(Math.sqrt(a));
            break;

          case 'sub':
            b = stack.pop();
            a = stack.pop();
            stack.push(a - b);
            break;

          case 'true':
            stack.push(true);
            break;

          case 'truncate':
            a = stack.pop();
            a = a < 0 ? Math.ceil(a) : Math.floor(a);
            stack.push(a);
            break;

          case 'xor':
            b = stack.pop();
            a = stack.pop();

            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
              stack.push(a !== b);
            } else {
              stack.push(a ^ b);
            }

            break;

          default:
            throw new _util.FormatError("Unknown operator ".concat(operator));
        }
      }

      return stack.stack;
    }
  };
  return PostScriptEvaluator;
}();

exports.PostScriptEvaluator = PostScriptEvaluator;

var PostScriptCompiler = function PostScriptCompilerClosure() {
  function AstNode(type) {
    this.type = type;
  }

  AstNode.prototype.visit = function (visitor) {
    (0, _util.unreachable)('abstract method');
  };

  function AstArgument(index, min, max) {
    AstNode.call(this, 'args');
    this.index = index;
    this.min = min;
    this.max = max;
  }

  AstArgument.prototype = Object.create(AstNode.prototype);

  AstArgument.prototype.visit = function (visitor) {
    visitor.visitArgument(this);
  };

  function AstLiteral(number) {
    AstNode.call(this, 'literal');
    this.number = number;
    this.min = number;
    this.max = number;
  }

  AstLiteral.prototype = Object.create(AstNode.prototype);

  AstLiteral.prototype.visit = function (visitor) {
    visitor.visitLiteral(this);
  };

  function AstBinaryOperation(op, arg1, arg2, min, max) {
    AstNode.call(this, 'binary');
    this.op = op;
    this.arg1 = arg1;
    this.arg2 = arg2;
    this.min = min;
    this.max = max;
  }

  AstBinaryOperation.prototype = Object.create(AstNode.prototype);

  AstBinaryOperation.prototype.visit = function (visitor) {
    visitor.visitBinaryOperation(this);
  };

  function AstMin(arg, max) {
    AstNode.call(this, 'max');
    this.arg = arg;
    this.min = arg.min;
    this.max = max;
  }

  AstMin.prototype = Object.create(AstNode.prototype);

  AstMin.prototype.visit = function (visitor) {
    visitor.visitMin(this);
  };

  function AstVariable(index, min, max) {
    AstNode.call(this, 'var');
    this.index = index;
    this.min = min;
    this.max = max;
  }

  AstVariable.prototype = Object.create(AstNode.prototype);

  AstVariable.prototype.visit = function (visitor) {
    visitor.visitVariable(this);
  };

  function AstVariableDefinition(variable, arg) {
    AstNode.call(this, 'definition');
    this.variable = variable;
    this.arg = arg;
  }

  AstVariableDefinition.prototype = Object.create(AstNode.prototype);

  AstVariableDefinition.prototype.visit = function (visitor) {
    visitor.visitVariableDefinition(this);
  };

  function ExpressionBuilderVisitor() {
    this.parts = [];
  }

  ExpressionBuilderVisitor.prototype = {
    visitArgument: function visitArgument(arg) {
      this.parts.push('Math.max(', arg.min, ', Math.min(', arg.max, ', src[srcOffset + ', arg.index, ']))');
    },
    visitVariable: function visitVariable(variable) {
      this.parts.push('v', variable.index);
    },
    visitLiteral: function visitLiteral(literal) {
      this.parts.push(literal.number);
    },
    visitBinaryOperation: function visitBinaryOperation(operation) {
      this.parts.push('(');
      operation.arg1.visit(this);
      this.parts.push(' ', operation.op, ' ');
      operation.arg2.visit(this);
      this.parts.push(')');
    },
    visitVariableDefinition: function visitVariableDefinition(definition) {
      this.parts.push('var ');
      definition.variable.visit(this);
      this.parts.push(' = ');
      definition.arg.visit(this);
      this.parts.push(';');
    },
    visitMin: function visitMin(max) {
      this.parts.push('Math.min(');
      max.arg.visit(this);
      this.parts.push(', ', max.max, ')');
    },
    toString: function toString() {
      return this.parts.join('');
    }
  };

  function buildAddOperation(num1, num2) {
    if (num2.type === 'literal' && num2.number === 0) {
      return num1;
    }

    if (num1.type === 'literal' && num1.number === 0) {
      return num2;
    }

    if (num2.type === 'literal' && num1.type === 'literal') {
      return new AstLiteral(num1.number + num2.number);
    }

    return new AstBinaryOperation('+', num1, num2, num1.min + num2.min, num1.max + num2.max);
  }

  function buildMulOperation(num1, num2) {
    if (num2.type === 'literal') {
      if (num2.number === 0) {
        return new AstLiteral(0);
      } else if (num2.number === 1) {
        return num1;
      } else if (num1.type === 'literal') {
        return new AstLiteral(num1.number * num2.number);
      }
    }

    if (num1.type === 'literal') {
      if (num1.number === 0) {
        return new AstLiteral(0);
      } else if (num1.number === 1) {
        return num2;
      }
    }

    var min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
    var max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
    return new AstBinaryOperation('*', num1, num2, min, max);
  }

  function buildSubOperation(num1, num2) {
    if (num2.type === 'literal') {
      if (num2.number === 0) {
        return num1;
      } else if (num1.type === 'literal') {
        return new AstLiteral(num1.number - num2.number);
      }
    }

    if (num2.type === 'binary' && num2.op === '-' && num1.type === 'literal' && num1.number === 1 && num2.arg1.type === 'literal' && num2.arg1.number === 1) {
      return num2.arg2;
    }

    return new AstBinaryOperation('-', num1, num2, num1.min - num2.max, num1.max - num2.min);
  }

  function buildMinOperation(num1, max) {
    if (num1.min >= max) {
      return new AstLiteral(max);
    } else if (num1.max <= max) {
      return num1;
    }

    return new AstMin(num1, max);
  }

  function PostScriptCompiler() {}

  PostScriptCompiler.prototype = {
    compile: function PostScriptCompiler_compile(code, domain, range) {
      var stack = [];
      var i, ii;
      var instructions = [];
      var inputSize = domain.length >> 1,
          outputSize = range.length >> 1;
      var lastRegister = 0;
      var n, j;
      var num1, num2, ast1, ast2, tmpVar, item;

      for (i = 0; i < inputSize; i++) {
        stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1]));
      }

      for (i = 0, ii = code.length; i < ii; i++) {
        item = code[i];

        if (typeof item === 'number') {
          stack.push(new AstLiteral(item));
          continue;
        }

        switch (item) {
          case 'add':
            if (stack.length < 2) {
              return null;
            }

            num2 = stack.pop();
            num1 = stack.pop();
            stack.push(buildAddOperation(num1, num2));
            break;

          case 'cvr':
            if (stack.length < 1) {
              return null;
            }

            break;

          case 'mul':
            if (stack.length < 2) {
              return null;
            }

            num2 = stack.pop();
            num1 = stack.pop();
            stack.push(buildMulOperation(num1, num2));
            break;

          case 'sub':
            if (stack.length < 2) {
              return null;
            }

            num2 = stack.pop();
            num1 = stack.pop();
            stack.push(buildSubOperation(num1, num2));
            break;

          case 'exch':
            if (stack.length < 2) {
              return null;
            }

            ast1 = stack.pop();
            ast2 = stack.pop();
            stack.push(ast1, ast2);
            break;

          case 'pop':
            if (stack.length < 1) {
              return null;
            }

            stack.pop();
            break;

          case 'index':
            if (stack.length < 1) {
              return null;
            }

            num1 = stack.pop();

            if (num1.type !== 'literal') {
              return null;
            }

            n = num1.number;

            if (n < 0 || !Number.isInteger(n) || stack.length < n) {
              return null;
            }

            ast1 = stack[stack.length - n - 1];

            if (ast1.type === 'literal' || ast1.type === 'var') {
              stack.push(ast1);
              break;
            }

            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
            stack[stack.length - n - 1] = tmpVar;
            stack.push(tmpVar);
            instructions.push(new AstVariableDefinition(tmpVar, ast1));
            break;

          case 'dup':
            if (stack.length < 1) {
              return null;
            }

            if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' && code[i + 3] === i + 7 && code[i + 4] === 'jz' && code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) {
              num1 = stack.pop();
              stack.push(buildMinOperation(num1, code[i + 1]));
              i += 6;
              break;
            }

            ast1 = stack[stack.length - 1];

            if (ast1.type === 'literal' || ast1.type === 'var') {
              stack.push(ast1);
              break;
            }

            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
            stack[stack.length - 1] = tmpVar;
            stack.push(tmpVar);
            instructions.push(new AstVariableDefinition(tmpVar, ast1));
            break;

          case 'roll':
            if (stack.length < 2) {
              return null;
            }

            num2 = stack.pop();
            num1 = stack.pop();

            if (num2.type !== 'literal' || num1.type !== 'literal') {
              return null;
            }

            j = num2.number;
            n = num1.number;

            if (n <= 0 || !Number.isInteger(n) || !Number.isInteger(j) || stack.length < n) {
              return null;
            }

            j = (j % n + n) % n;

            if (j === 0) {
              break;
            }

            Array.prototype.push.apply(stack, stack.splice(stack.length - n, n - j));
            break;

          default:
            return null;
        }
      }

      if (stack.length !== outputSize) {
        return null;
      }

      var result = [];
      instructions.forEach(function (instruction) {
        var statementBuilder = new ExpressionBuilderVisitor();
        instruction.visit(statementBuilder);
        result.push(statementBuilder.toString());
      });
      stack.forEach(function (expr, i) {
        var statementBuilder = new ExpressionBuilderVisitor();
        expr.visit(statementBuilder);
        var min = range[i * 2],
            max = range[i * 2 + 1];
        var out = [statementBuilder.toString()];

        if (min > expr.min) {
          out.unshift('Math.max(', min, ', ');
          out.push(')');
        }

        if (max < expr.max) {
          out.unshift('Math.min(', max, ', ');
          out.push(')');
        }

        out.unshift('dest[destOffset + ', i, '] = ');
        out.push(';');
        result.push(out.join(''));
      });
      return result.join('\n');
    }
  };
  return PostScriptCompiler;
}();

exports.PostScriptCompiler = PostScriptCompiler;

/***/ }),
/* 186 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PostScriptParser = exports.PostScriptLexer = void 0;

var _util = __w_pdfjs_require__(6);

var _primitives = __w_pdfjs_require__(155);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var PostScriptParser =
/*#__PURE__*/
function () {
  function PostScriptParser(lexer) {
    _classCallCheck(this, PostScriptParser);

    this.lexer = lexer;
    this.operators = [];
    this.token = null;
    this.prev = null;
  }

  _createClass(PostScriptParser, [{
    key: "nextToken",
    value: function nextToken() {
      this.prev = this.token;
      this.token = this.lexer.getToken();
    }
  }, {
    key: "accept",
    value: function accept(type) {
      if (this.token.type === type) {
        this.nextToken();
        return true;
      }

      return false;
    }
  }, {
    key: "expect",
    value: function expect(type) {
      if (this.accept(type)) {
        return true;
      }

      throw new _util.FormatError("Unexpected symbol: found ".concat(this.token.type, " expected ").concat(type, "."));
    }
  }, {
    key: "parse",
    value: function parse() {
      this.nextToken();
      this.expect(PostScriptTokenTypes.LBRACE);
      this.parseBlock();
      this.expect(PostScriptTokenTypes.RBRACE);
      return this.operators;
    }
  }, {
    key: "parseBlock",
    value: function parseBlock() {
      while (true) {
        if (this.accept(PostScriptTokenTypes.NUMBER)) {
          this.operators.push(this.prev.value);
        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
          this.operators.push(this.prev.value);
        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
          this.parseCondition();
        } else {
          return;
        }
      }
    }
  }, {
    key: "parseCondition",
    value: function parseCondition() {
      var conditionLocation = this.operators.length;
      this.operators.push(null, null);
      this.parseBlock();
      this.expect(PostScriptTokenTypes.RBRACE);

      if (this.accept(PostScriptTokenTypes.IF)) {
        this.operators[conditionLocation] = this.operators.length;
        this.operators[conditionLocation + 1] = 'jz';
      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
        var jumpLocation = this.operators.length;
        this.operators.push(null, null);
        var endOfTrue = this.operators.length;
        this.parseBlock();
        this.expect(PostScriptTokenTypes.RBRACE);
        this.expect(PostScriptTokenTypes.IFELSE);
        this.operators[jumpLocation] = this.operators.length;
        this.operators[jumpLocation + 1] = 'j';
        this.operators[conditionLocation] = endOfTrue;
        this.operators[conditionLocation + 1] = 'jz';
      } else {
        throw new _util.FormatError('PS Function: error parsing conditional.');
      }
    }
  }]);

  return PostScriptParser;
}();

exports.PostScriptParser = PostScriptParser;
var PostScriptTokenTypes = {
  LBRACE: 0,
  RBRACE: 1,
  NUMBER: 2,
  OPERATOR: 3,
  IF: 4,
  IFELSE: 5
};

var PostScriptToken = function PostScriptTokenClosure() {
  var opCache = Object.create(null);

  var PostScriptToken =
  /*#__PURE__*/
  function () {
    function PostScriptToken(type, value) {
      _classCallCheck(this, PostScriptToken);

      this.type = type;
      this.value = value;
    }

    _createClass(PostScriptToken, null, [{
      key: "getOperator",
      value: function getOperator(op) {
        var opValue = opCache[op];

        if (opValue) {
          return opValue;
        }

        return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
      }
    }, {
      key: "LBRACE",
      get: function get() {
        return (0, _util.shadow)(this, 'LBRACE', new PostScriptToken(PostScriptTokenTypes.LBRACE, '{'));
      }
    }, {
      key: "RBRACE",
      get: function get() {
        return (0, _util.shadow)(this, 'RBRACE', new PostScriptToken(PostScriptTokenTypes.RBRACE, '}'));
      }
    }, {
      key: "IF",
      get: function get() {
        return (0, _util.shadow)(this, 'IF', new PostScriptToken(PostScriptTokenTypes.IF, 'IF'));
      }
    }, {
      key: "IFELSE",
      get: function get() {
        return (0, _util.shadow)(this, 'IFELSE', new PostScriptToken(PostScriptTokenTypes.IFELSE, 'IFELSE'));
      }
    }]);

    return PostScriptToken;
  }();

  return PostScriptToken;
}();

var PostScriptLexer =
/*#__PURE__*/
function () {
  function PostScriptLexer(stream) {
    _classCallCheck(this, PostScriptLexer);

    this.stream = stream;
    this.nextChar();
    this.strBuf = [];
  }

  _createClass(PostScriptLexer, [{
    key: "nextChar",
    value: function nextChar() {
      return this.currentChar = this.stream.getByte();
    }
  }, {
    key: "getToken",
    value: function getToken() {
      var comment = false;
      var ch = this.currentChar;

      while (true) {
        if (ch < 0) {
          return _primitives.EOF;
        }

        if (comment) {
          if (ch === 0x0A || ch === 0x0D) {
            comment = false;
          }
        } else if (ch === 0x25) {
          comment = true;
        } else if (!(0, _util.isSpace)(ch)) {
          break;
        }

        ch = this.nextChar();
      }

      switch (ch | 0) {
        case 0x30:
        case 0x31:
        case 0x32:
        case 0x33:
        case 0x34:
        case 0x35:
        case 0x36:
        case 0x37:
        case 0x38:
        case 0x39:
        case 0x2B:
        case 0x2D:
        case 0x2E:
          return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber());

        case 0x7B:
          this.nextChar();
          return PostScriptToken.LBRACE;

        case 0x7D:
          this.nextChar();
          return PostScriptToken.RBRACE;
      }

      var strBuf = this.strBuf;
      strBuf.length = 0;
      strBuf[0] = String.fromCharCode(ch);

      while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A)) {
        strBuf.push(String.fromCharCode(ch));
      }

      var str = strBuf.join('');

      switch (str.toLowerCase()) {
        case 'if':
          return PostScriptToken.IF;

        case 'ifelse':
          return PostScriptToken.IFELSE;

        default:
          return PostScriptToken.getOperator(str);
      }
    }
  }, {
    key: "getNumber",
    value: function getNumber() {
      var ch = this.currentChar;
      var strBuf = this.strBuf;
      strBuf.length = 0;
      strBuf[0] = String.fromCharCode(ch);

      while ((ch = this.nextChar()) >= 0) {
        if (ch >= 0x30 && ch <= 0x39 || ch === 0x2D || ch === 0x2E) {
          strBuf.push(String.fromCharCode(ch));
        } else {
          break;
        }
      }

      var value = parseFloat(strBuf.join(''));

      if (isNaN(value)) {
        throw new _util.FormatError("Invalid floating point number: ".concat(value));
      }

      return value;
    }
  }]);

  return PostScriptLexer;
}();

exports.PostScriptLexer = PostScriptLexer;

/***/ }),
/* 187 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MurmurHash3_64 = void 0;

var _util = __w_pdfjs_require__(6);

var MurmurHash3_64 = function MurmurHash3_64Closure(seed) {
  var MASK_HIGH = 0xffff0000;
  var MASK_LOW = 0xffff;

  function MurmurHash3_64(seed) {
    var SEED = 0xc3d2e1f0;
    this.h1 = seed ? seed & 0xffffffff : SEED;
    this.h2 = seed ? seed & 0xffffffff : SEED;
  }

  MurmurHash3_64.prototype = {
    update: function MurmurHash3_64_update(input) {
      var data, length;

      if ((0, _util.isString)(input)) {
        data = new Uint8Array(input.length * 2);
        length = 0;

        for (var i = 0, ii = input.length; i < ii; i++) {
          var code = input.charCodeAt(i);

          if (code <= 0xff) {
            data[length++] = code;
          } else {
            data[length++] = code >>> 8;
            data[length++] = code & 0xff;
          }
        }
      } else if ((0, _util.isArrayBuffer)(input)) {
        data = input;
        length = data.byteLength;
      } else {
        throw new Error('Wrong data format in MurmurHash3_64_update. ' + 'Input must be a string or array.');
      }

      var blockCounts = length >> 2;
      var tailLength = length - blockCounts * 4;
      var dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);
      var k1 = 0;
      var k2 = 0;
      var h1 = this.h1;
      var h2 = this.h2;
      var C1 = 0xcc9e2d51;
      var C2 = 0x1b873593;
      var C1_LOW = C1 & MASK_LOW;
      var C2_LOW = C2 & MASK_LOW;

      for (var _i = 0; _i < blockCounts; _i++) {
        if (_i & 1) {
          k1 = dataUint32[_i];
          k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
          k1 = k1 << 15 | k1 >>> 17;
          k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
          h1 ^= k1;
          h1 = h1 << 13 | h1 >>> 19;
          h1 = h1 * 5 + 0xe6546b64;
        } else {
          k2 = dataUint32[_i];
          k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;
          k2 = k2 << 15 | k2 >>> 17;
          k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;
          h2 ^= k2;
          h2 = h2 << 13 | h2 >>> 19;
          h2 = h2 * 5 + 0xe6546b64;
        }
      }

      k1 = 0;

      switch (tailLength) {
        case 3:
          k1 ^= data[blockCounts * 4 + 2] << 16;

        case 2:
          k1 ^= data[blockCounts * 4 + 1] << 8;

        case 1:
          k1 ^= data[blockCounts * 4];
          k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
          k1 = k1 << 15 | k1 >>> 17;
          k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;

          if (blockCounts & 1) {
            h1 ^= k1;
          } else {
            h2 ^= k1;
          }

      }

      this.h1 = h1;
      this.h2 = h2;
      return this;
    },
    hexdigest: function MurmurHash3_64_hexdigest() {
      var h1 = this.h1;
      var h2 = this.h2;
      h1 ^= h2 >>> 1;
      h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW;
      h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16;
      h1 ^= h2 >>> 1;
      h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW;
      h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16;
      h1 ^= h2 >>> 1;

      for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) {
        var hex = (arr[i] >>> 0).toString(16);

        while (hex.length < 8) {
          hex = '0' + hex;
        }

        str += hex;
      }

      return str;
    }
  };
  return MurmurHash3_64;
}();

exports.MurmurHash3_64 = MurmurHash3_64;

/***/ }),
/* 188 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFImage = void 0;

var _util = __w_pdfjs_require__(6);

var _primitives = __w_pdfjs_require__(155);

var _colorspace = __w_pdfjs_require__(168);

var _stream = __w_pdfjs_require__(157);

var _jpeg_stream = __w_pdfjs_require__(163);

var _jpx = __w_pdfjs_require__(166);

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

var PDFImage = function PDFImageClosure() {
  function handleImageData(image, nativeDecoder) {
    if (nativeDecoder && nativeDecoder.canDecode(image)) {
      return nativeDecoder.decode(image).catch(function (reason) {
        (0, _util.warn)('Native image decoding failed -- trying to recover: ' + (reason && reason.message));
        return image;
      });
    }

    return Promise.resolve(image);
  }

  function decodeAndClamp(value, addend, coefficient, max) {
    value = addend + value * coefficient;
    return value < 0 ? 0 : value > max ? max : value;
  }

  function resizeImageMask(src, bpc, w1, h1, w2, h2) {
    var length = w2 * h2;
    var dest = bpc <= 8 ? new Uint8Array(length) : bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
    var xRatio = w1 / w2;
    var yRatio = h1 / h2;
    var i,
        j,
        py,
        newIndex = 0,
        oldIndex;
    var xScaled = new Uint16Array(w2);
    var w1Scanline = w1;

    for (i = 0; i < w2; i++) {
      xScaled[i] = Math.floor(i * xRatio);
    }

    for (i = 0; i < h2; i++) {
      py = Math.floor(i * yRatio) * w1Scanline;

      for (j = 0; j < w2; j++) {
        oldIndex = py + xScaled[j];
        dest[newIndex++] = src[oldIndex];
      }
    }

    return dest;
  }

  function PDFImage(_ref) {
    var xref = _ref.xref,
        res = _ref.res,
        image = _ref.image,
        _ref$isInline = _ref.isInline,
        isInline = _ref$isInline === void 0 ? false : _ref$isInline,
        _ref$smask = _ref.smask,
        smask = _ref$smask === void 0 ? null : _ref$smask,
        _ref$mask = _ref.mask,
        mask = _ref$mask === void 0 ? null : _ref$mask,
        _ref$isMask = _ref.isMask,
        isMask = _ref$isMask === void 0 ? false : _ref$isMask,
        pdfFunctionFactory = _ref.pdfFunctionFactory;
    this.image = image;
    var dict = image.dict;
    var filter = dict.get('Filter');

    if ((0, _primitives.isName)(filter)) {
      switch (filter.name) {
        case 'JPXDecode':
          var jpxImage = new _jpx.JpxImage();
          jpxImage.parseImageProperties(image.stream);
          image.stream.reset();
          image.width = jpxImage.width;
          image.height = jpxImage.height;
          image.bitsPerComponent = jpxImage.bitsPerComponent;
          image.numComps = jpxImage.componentsCount;
          break;

        case 'JBIG2Decode':
          image.bitsPerComponent = 1;
          image.numComps = 1;
          break;
      }
    }

    var width = dict.get('Width', 'W');
    var height = dict.get('Height', 'H');

    if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 0 && (image.width !== width || image.height !== height)) {
      (0, _util.warn)('PDFImage - using the Width/Height of the image data, ' + 'rather than the image dictionary.');
      width = image.width;
      height = image.height;
    }

    if (width < 1 || height < 1) {
      throw new _util.FormatError("Invalid image width: ".concat(width, " or ") + "height: ".concat(height));
    }

    this.width = width;
    this.height = height;
    this.interpolate = dict.get('Interpolate', 'I') || false;
    this.imageMask = dict.get('ImageMask', 'IM') || false;
    this.matte = dict.get('Matte') || false;
    var bitsPerComponent = image.bitsPerComponent;

    if (!bitsPerComponent) {
      bitsPerComponent = dict.get('BitsPerComponent', 'BPC');

      if (!bitsPerComponent) {
        if (this.imageMask) {
          bitsPerComponent = 1;
        } else {
          throw new _util.FormatError("Bits per component missing in image: ".concat(this.imageMask));
        }
      }
    }

    this.bpc = bitsPerComponent;

    if (!this.imageMask) {
      var colorSpace = dict.get('ColorSpace', 'CS');

      if (!colorSpace) {
        (0, _util.info)('JPX images (which do not require color spaces)');

        switch (image.numComps) {
          case 1:
            colorSpace = _primitives.Name.get('DeviceGray');
            break;

          case 3:
            colorSpace = _primitives.Name.get('DeviceRGB');
            break;

          case 4:
            colorSpace = _primitives.Name.get('DeviceCMYK');
            break;

          default:
            throw new Error("JPX images with ".concat(image.numComps, " ") + 'color components not supported.');
        }
      }

      var resources = isInline ? res : null;
      this.colorSpace = _colorspace.ColorSpace.parse(colorSpace, xref, resources, pdfFunctionFactory);
      this.numComps = this.colorSpace.numComps;
    }

    this.decode = dict.getArray('Decode', 'D');
    this.needsDecode = false;

    if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) || isMask && !_colorspace.ColorSpace.isDefaultDecode(this.decode, 1))) {
      this.needsDecode = true;
      var max = (1 << bitsPerComponent) - 1;
      this.decodeCoefficients = [];
      this.decodeAddends = [];
      var isIndexed = this.colorSpace && this.colorSpace.name === 'Indexed';

      for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
        var dmin = this.decode[i];
        var dmax = this.decode[i + 1];
        this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin;
        this.decodeAddends[j] = isIndexed ? dmin : max * dmin;
      }
    }

    if (smask) {
      this.smask = new PDFImage({
        xref: xref,
        res: res,
        image: smask,
        isInline: isInline,
        pdfFunctionFactory: pdfFunctionFactory
      });
    } else if (mask) {
      if ((0, _primitives.isStream)(mask)) {
        var maskDict = mask.dict,
            imageMask = maskDict.get('ImageMask', 'IM');

        if (!imageMask) {
          (0, _util.warn)('Ignoring /Mask in image without /ImageMask.');
        } else {
          this.mask = new PDFImage({
            xref: xref,
            res: res,
            image: mask,
            isInline: isInline,
            isMask: true,
            pdfFunctionFactory: pdfFunctionFactory
          });
        }
      } else {
        this.mask = mask;
      }
    }
  }

  PDFImage.buildImage = function (_ref2) {
    var handler = _ref2.handler,
        xref = _ref2.xref,
        res = _ref2.res,
        image = _ref2.image,
        _ref2$isInline = _ref2.isInline,
        isInline = _ref2$isInline === void 0 ? false : _ref2$isInline,
        _ref2$nativeDecoder = _ref2.nativeDecoder,
        nativeDecoder = _ref2$nativeDecoder === void 0 ? null : _ref2$nativeDecoder,
        pdfFunctionFactory = _ref2.pdfFunctionFactory;
    var imagePromise = handleImageData(image, nativeDecoder);
    var smaskPromise;
    var maskPromise;
    var smask = image.dict.get('SMask');
    var mask = image.dict.get('Mask');

    if (smask) {
      smaskPromise = handleImageData(smask, nativeDecoder);
      maskPromise = Promise.resolve(null);
    } else {
      smaskPromise = Promise.resolve(null);

      if (mask) {
        if ((0, _primitives.isStream)(mask)) {
          maskPromise = handleImageData(mask, nativeDecoder);
        } else if (Array.isArray(mask)) {
          maskPromise = Promise.resolve(mask);
        } else {
          (0, _util.warn)('Unsupported mask format.');
          maskPromise = Promise.resolve(null);
        }
      } else {
        maskPromise = Promise.resolve(null);
      }
    }

    return Promise.all([imagePromise, smaskPromise, maskPromise]).then(function (_ref3) {
      var _ref4 = _slicedToArray(_ref3, 3),
          imageData = _ref4[0],
          smaskData = _ref4[1],
          maskData = _ref4[2];

      return new PDFImage({
        xref: xref,
        res: res,
        image: imageData,
        isInline: isInline,
        smask: smaskData,
        mask: maskData,
        pdfFunctionFactory: pdfFunctionFactory
      });
    });
  };

  PDFImage.createMask = function (_ref5) {
    var imgArray = _ref5.imgArray,
        width = _ref5.width,
        height = _ref5.height,
        imageIsFromDecodeStream = _ref5.imageIsFromDecodeStream,
        inverseDecode = _ref5.inverseDecode;
    var computedLength = (width + 7 >> 3) * height;
    var actualLength = imgArray.byteLength;
    var haveFullData = computedLength === actualLength;
    var data, i;

    if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {
      data = imgArray;
    } else if (!inverseDecode) {
      data = new Uint8ClampedArray(actualLength);
      data.set(imgArray);
    } else {
      data = new Uint8ClampedArray(computedLength);
      data.set(imgArray);

      for (i = actualLength; i < computedLength; i++) {
        data[i] = 0xff;
      }
    }

    if (inverseDecode) {
      for (i = 0; i < actualLength; i++) {
        data[i] ^= 0xFF;
      }
    }

    return {
      data: data,
      width: width,
      height: height
    };
  };

  PDFImage.prototype = {
    get drawWidth() {
      return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0);
    },

    get drawHeight() {
      return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0);
    },

    decodeBuffer: function decodeBuffer(buffer) {
      var bpc = this.bpc;
      var numComps = this.numComps;
      var decodeAddends = this.decodeAddends;
      var decodeCoefficients = this.decodeCoefficients;
      var max = (1 << bpc) - 1;
      var i, ii;

      if (bpc === 1) {
        for (i = 0, ii = buffer.length; i < ii; i++) {
          buffer[i] = +!buffer[i];
        }

        return;
      }

      var index = 0;

      for (i = 0, ii = this.width * this.height; i < ii; i++) {
        for (var j = 0; j < numComps; j++) {
          buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max);
          index++;
        }
      }
    },
    getComponents: function getComponents(buffer) {
      var bpc = this.bpc;

      if (bpc === 8) {
        return buffer;
      }

      var width = this.width;
      var height = this.height;
      var numComps = this.numComps;
      var length = width * height * numComps;
      var bufferPos = 0;
      var output = bpc <= 8 ? new Uint8Array(length) : bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
      var rowComps = width * numComps;
      var max = (1 << bpc) - 1;
      var i = 0,
          ii,
          buf;

      if (bpc === 1) {
        var mask, loop1End, loop2End;

        for (var j = 0; j < height; j++) {
          loop1End = i + (rowComps & ~7);
          loop2End = i + rowComps;

          while (i < loop1End) {
            buf = buffer[bufferPos++];
            output[i] = buf >> 7 & 1;
            output[i + 1] = buf >> 6 & 1;
            output[i + 2] = buf >> 5 & 1;
            output[i + 3] = buf >> 4 & 1;
            output[i + 4] = buf >> 3 & 1;
            output[i + 5] = buf >> 2 & 1;
            output[i + 6] = buf >> 1 & 1;
            output[i + 7] = buf & 1;
            i += 8;
          }

          if (i < loop2End) {
            buf = buffer[bufferPos++];
            mask = 128;

            while (i < loop2End) {
              output[i++] = +!!(buf & mask);
              mask >>= 1;
            }
          }
        }
      } else {
        var bits = 0;
        buf = 0;

        for (i = 0, ii = length; i < ii; ++i) {
          if (i % rowComps === 0) {
            buf = 0;
            bits = 0;
          }

          while (bits < bpc) {
            buf = buf << 8 | buffer[bufferPos++];
            bits += 8;
          }

          var remainingBits = bits - bpc;
          var value = buf >> remainingBits;
          output[i] = value < 0 ? 0 : value > max ? max : value;
          buf = buf & (1 << remainingBits) - 1;
          bits = remainingBits;
        }
      }

      return output;
    },
    fillOpacity: function fillOpacity(rgbaBuf, width, height, actualHeight, image) {
      var smask = this.smask;
      var mask = this.mask;
      var alphaBuf, sw, sh, i, ii, j;

      if (smask) {
        sw = smask.width;
        sh = smask.height;
        alphaBuf = new Uint8ClampedArray(sw * sh);
        smask.fillGrayBuffer(alphaBuf);

        if (sw !== width || sh !== height) {
          alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height);
        }
      } else if (mask) {
        if (mask instanceof PDFImage) {
          sw = mask.width;
          sh = mask.height;
          alphaBuf = new Uint8ClampedArray(sw * sh);
          mask.numComps = 1;
          mask.fillGrayBuffer(alphaBuf);

          for (i = 0, ii = sw * sh; i < ii; ++i) {
            alphaBuf[i] = 255 - alphaBuf[i];
          }

          if (sw !== width || sh !== height) {
            alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height);
          }
        } else if (Array.isArray(mask)) {
          alphaBuf = new Uint8ClampedArray(width * height);
          var numComps = this.numComps;

          for (i = 0, ii = width * height; i < ii; ++i) {
            var opacity = 0;
            var imageOffset = i * numComps;

            for (j = 0; j < numComps; ++j) {
              var color = image[imageOffset + j];
              var maskOffset = j * 2;

              if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
                opacity = 255;
                break;
              }
            }

            alphaBuf[i] = opacity;
          }
        } else {
          throw new _util.FormatError('Unknown mask format.');
        }
      }

      if (alphaBuf) {
        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
          rgbaBuf[j] = alphaBuf[i];
        }
      } else {
        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
          rgbaBuf[j] = 255;
        }
      }
    },
    undoPreblend: function undoPreblend(buffer, width, height) {
      var matte = this.smask && this.smask.matte;

      if (!matte) {
        return;
      }

      var matteRgb = this.colorSpace.getRgb(matte, 0);
      var matteR = matteRgb[0];
      var matteG = matteRgb[1];
      var matteB = matteRgb[2];
      var length = width * height * 4;

      for (var i = 0; i < length; i += 4) {
        var alpha = buffer[i + 3];

        if (alpha === 0) {
          buffer[i] = 255;
          buffer[i + 1] = 255;
          buffer[i + 2] = 255;
          continue;
        }

        var k = 255 / alpha;
        buffer[i] = (buffer[i] - matteR) * k + matteR;
        buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;
        buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;
      }
    },
    createImageData: function createImageData() {
      var forceRGBA = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
      var drawWidth = this.drawWidth;
      var drawHeight = this.drawHeight;
      var imgData = {
        width: drawWidth,
        height: drawHeight,
        kind: 0,
        data: null
      };
      var numComps = this.numComps;
      var originalWidth = this.width;
      var originalHeight = this.height;
      var bpc = this.bpc;
      var rowBytes = originalWidth * numComps * bpc + 7 >> 3;
      var imgArray;

      if (!forceRGBA) {
        var kind;

        if (this.colorSpace.name === 'DeviceGray' && bpc === 1) {
          kind = _util.ImageKind.GRAYSCALE_1BPP;
        } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 && !this.needsDecode) {
          kind = _util.ImageKind.RGB_24BPP;
        }

        if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) {
          imgData.kind = kind;
          imgArray = this.getImageBytes(originalHeight * rowBytes);

          if (this.image instanceof _stream.DecodeStream) {
            imgData.data = imgArray;
          } else {
            var newArray = new Uint8ClampedArray(imgArray.length);
            newArray.set(imgArray);
            imgData.data = newArray;
          }

          if (this.needsDecode) {
            (0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP, 'PDFImage.createImageData: The image must be grayscale.');
            var buffer = imgData.data;

            for (var i = 0, ii = buffer.length; i < ii; i++) {
              buffer[i] ^= 0xff;
            }
          }

          return imgData;
        }

        if (this.image instanceof _jpeg_stream.JpegStream && !this.smask && !this.mask) {
          var imageLength = originalHeight * rowBytes;

          switch (this.colorSpace.name) {
            case 'DeviceGray':
              imageLength *= 3;

            case 'DeviceRGB':
            case 'DeviceCMYK':
              imgData.kind = _util.ImageKind.RGB_24BPP;
              imgData.data = this.getImageBytes(imageLength, drawWidth, drawHeight, true);
              return imgData;
          }
        }
      }

      imgArray = this.getImageBytes(originalHeight * rowBytes);
      var actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight;
      var comps = this.getComponents(imgArray);
      var alpha01, maybeUndoPreblend;

      if (!forceRGBA && !this.smask && !this.mask) {
        imgData.kind = _util.ImageKind.RGB_24BPP;
        imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 3);
        alpha01 = 0;
        maybeUndoPreblend = false;
      } else {
        imgData.kind = _util.ImageKind.RGBA_32BPP;
        imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 4);
        alpha01 = 1;
        maybeUndoPreblend = true;
        this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps);
      }

      if (this.needsDecode) {
        this.decodeBuffer(comps);
      }

      this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01);

      if (maybeUndoPreblend) {
        this.undoPreblend(imgData.data, drawWidth, actualHeight);
      }

      return imgData;
    },
    fillGrayBuffer: function fillGrayBuffer(buffer) {
      var numComps = this.numComps;

      if (numComps !== 1) {
        throw new _util.FormatError("Reading gray scale from a color image: ".concat(numComps));
      }

      var width = this.width;
      var height = this.height;
      var bpc = this.bpc;
      var rowBytes = width * numComps * bpc + 7 >> 3;
      var imgArray = this.getImageBytes(height * rowBytes);
      var comps = this.getComponents(imgArray);
      var i, length;

      if (bpc === 1) {
        length = width * height;

        if (this.needsDecode) {
          for (i = 0; i < length; ++i) {
            buffer[i] = comps[i] - 1 & 255;
          }
        } else {
          for (i = 0; i < length; ++i) {
            buffer[i] = -comps[i] & 255;
          }
        }

        return;
      }

      if (this.needsDecode) {
        this.decodeBuffer(comps);
      }

      length = width * height;
      var scale = 255 / ((1 << bpc) - 1);

      for (i = 0; i < length; ++i) {
        buffer[i] = scale * comps[i];
      }
    },
    getImageBytes: function getImageBytes(length, drawWidth, drawHeight) {
      var forceRGB = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
      this.image.reset();
      this.image.drawWidth = drawWidth || this.width;
      this.image.drawHeight = drawHeight || this.height;
      this.image.forceRGB = !!forceRGB;
      return this.image.getBytes(length, true);
    }
  };
  return PDFImage;
}();

exports.PDFImage = PDFImage;

/***/ }),
/* 189 */
/***/ (function(module, exports, __w_pdfjs_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MessageHandler = MessageHandler;

var _regenerator = _interopRequireDefault(__w_pdfjs_require__(2));

var _util = __w_pdfjs_require__(6);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function resolveCall(_x, _x2) {
  return _resolveCall.apply(this, arguments);
}

function _resolveCall() {
  _resolveCall = _asyncToGenerator(
  /*#__PURE__*/
  _regenerator.default.mark(function _callee(fn, args) {
    var thisArg,
        _args = arguments;
    return _regenerator.default.wrap(function _callee$(_context) {
      while (1) {
        switch (_context.prev = _context.next) {
          case 0:
            thisArg = _args.length > 2 && _args[2] !== undefined ? _args[2] : null;

            if (fn) {
              _context.next = 3;
              break;
            }

            return _context.abrupt("return");

          case 3:
            return _context.abrupt("return", fn.apply(thisArg, args));

          case 4:
          case "end":
            return _context.stop();
        }
      }
    }, _callee, this);
  }));
  return _resolveCall.apply(this, arguments);
}

function wrapReason(reason) {
  if (_typeof(reason) !== 'object') {
    return reason;
  }

  switch (reason.name) {
    case 'AbortException':
      return new _util.AbortException(reason.message);

    case 'MissingPDFException':
      return new _util.MissingPDFException(reason.message);

    case 'UnexpectedResponseException':
      return new _util.UnexpectedResponseException(reason.message, reason.status);

    default:
      return new _util.UnknownErrorException(reason.message, reason.details);
  }
}

function makeReasonSerializable(reason) {
  if (!(reason instanceof Error) || reason instanceof _util.AbortException || reason instanceof _util.MissingPDFException || reason instanceof _util.UnexpectedResponseException || reason instanceof _util.UnknownErrorException) {
    return reason;
  }

  return new _util.UnknownErrorException(reason.message, reason.toString());
}

function resolveOrReject(capability, success, reason) {
  if (success) {
    capability.resolve();
  } else {
    capability.reject(reason);
  }
}

function finalize(promise) {
  return Promise.resolve(promise).catch(function () {});
}

function MessageHandler(sourceName, targetName, comObj) {
  var _this = this;

  this.sourceName = sourceName;
  this.targetName = targetName;
  this.comObj = comObj;
  this.callbackId = 1;
  this.streamId = 1;
  this.postMessageTransfers = true;
  this.streamSinks = Object.create(null);
  this.streamControllers = Object.create(null);
  var callbacksCapabilities = this.callbacksCapabilities = Object.create(null);
  var ah = this.actionHandler = Object.create(null);

  this._onComObjOnMessage = function (event) {
    var data = event.data;

    if (data.targetName !== _this.sourceName) {
      return;
    }

    if (data.stream) {
      _this._processStreamMessage(data);
    } else 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(wrapReason(data.error));
        } else {
          callback.resolve(data.data);
        }
      } else {
        throw new Error("Cannot resolve callback ".concat(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) {
          comObj.postMessage({
            sourceName: _sourceName,
            targetName: _targetName,
            isReply: true,
            callbackId: data.callbackId,
            error: makeReasonSerializable(reason)
          });
        });
      } else if (data.streamId) {
        _this._createStreamSink(data);
      } else {
        action[0].call(action[1], data.data);
      }
    } else {
      throw new Error("Unknown action from worker: ".concat(data.action));
    }
  };

  comObj.addEventListener('message', this._onComObjOnMessage);
}

MessageHandler.prototype = {
  on: function on(actionName, handler, scope) {
    var ah = this.actionHandler;

    if (ah[actionName]) {
      throw new Error("There is already an actionName called \"".concat(actionName, "\""));
    }

    ah[actionName] = [handler, scope];
  },
  send: function send(actionName, data, transfers) {
    var message = {
      sourceName: this.sourceName,
      targetName: this.targetName,
      action: actionName,
      data: data
    };
    this.postMessage(message, transfers);
  },
  sendWithPromise: function sendWithPromise(actionName, data, transfers) {
    var callbackId = this.callbackId++;
    var message = {
      sourceName: this.sourceName,
      targetName: this.targetName,
      action: actionName,
      data: data,
      callbackId: callbackId
    };
    var capability = (0, _util.createPromiseCapability)();
    this.callbacksCapabilities[callbackId] = capability;

    try {
      this.postMessage(message, transfers);
    } catch (e) {
      capability.reject(e);
    }

    return capability.promise;
  },
  sendWithStream: function sendWithStream(actionName, data, queueingStrategy, transfers) {
    var _this2 = this;

    var streamId = this.streamId++;
    var sourceName = this.sourceName;
    var targetName = this.targetName;
    return new _util.ReadableStream({
      start: function start(controller) {
        var startCapability = (0, _util.createPromiseCapability)();
        _this2.streamControllers[streamId] = {
          controller: controller,
          startCall: startCapability,
          isClosed: false
        };

        _this2.postMessage({
          sourceName: sourceName,
          targetName: targetName,
          action: actionName,
          streamId: streamId,
          data: data,
          desiredSize: controller.desiredSize
        });

        return startCapability.promise;
      },
      pull: function pull(controller) {
        var pullCapability = (0, _util.createPromiseCapability)();
        _this2.streamControllers[streamId].pullCall = pullCapability;

        _this2.postMessage({
          sourceName: sourceName,
          targetName: targetName,
          stream: 'pull',
          streamId: streamId,
          desiredSize: controller.desiredSize
        });

        return pullCapability.promise;
      },
      cancel: function cancel(reason) {
        var cancelCapability = (0, _util.createPromiseCapability)();
        _this2.streamControllers[streamId].cancelCall = cancelCapability;
        _this2.streamControllers[streamId].isClosed = true;

        _this2.postMessage({
          sourceName: sourceName,
          targetName: targetName,
          stream: 'cancel',
          reason: reason,
          streamId: streamId
        });

        return cancelCapability.promise;
      }
    }, queueingStrategy);
  },
  _createStreamSink: function _createStreamSink(data) {
    var _this3 = this;

    var self = this;
    var action = this.actionHandler[data.action];
    var streamId = data.streamId;
    var desiredSize = data.desiredSize;
    var sourceName = this.sourceName;
    var targetName = data.sourceName;
    var capability = (0, _util.createPromiseCapability)();

    var sendStreamRequest = function sendStreamRequest(_ref) {
      var stream = _ref.stream,
          chunk = _ref.chunk,
          transfers = _ref.transfers,
          success = _ref.success,
          reason = _ref.reason;

      _this3.postMessage({
        sourceName: sourceName,
        targetName: targetName,
        stream: stream,
        streamId: streamId,
        chunk: chunk,
        success: success,
        reason: reason
      }, transfers);
    };

    var streamSink = {
      enqueue: function enqueue(chunk) {
        var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
        var transfers = arguments.length > 2 ? arguments[2] : undefined;

        if (this.isCancelled) {
          return;
        }

        var lastDesiredSize = this.desiredSize;
        this.desiredSize -= size;

        if (lastDesiredSize > 0 && this.desiredSize <= 0) {
          this.sinkCapability = (0, _util.createPromiseCapability)();
          this.ready = this.sinkCapability.promise;
        }

        sendStreamRequest({
          stream: 'enqueue',
          chunk: chunk,
          transfers: transfers
        });
      },
      close: function close() {
        if (this.isCancelled) {
          return;
        }

        this.isCancelled = true;
        sendStreamRequest({
          stream: 'close'
        });
        delete self.streamSinks[streamId];
      },
      error: function error(reason) {
        if (this.isCancelled) {
          return;
        }

        this.isCancelled = true;
        sendStreamRequest({
          stream: 'error',
          reason: reason
        });
      },
      sinkCapability: capability,
      onPull: null,
      onCancel: null,
      isCancelled: false,
      desiredSize: desiredSize,
      ready: null
    };
    streamSink.sinkCapability.resolve();
    streamSink.ready = streamSink.sinkCapability.promise;
    this.streamSinks[streamId] = streamSink;
    resolveCall(action[0], [data.data, streamSink], action[1]).then(function () {
      sendStreamRequest({
        stream: 'start_complete',
        success: true
      });
    }, function (reason) {
      sendStreamRequest({
        stream: 'start_complete',
        success: false,
        reason: reason
      });
    });
  },
  _processStreamMessage: function _processStreamMessage(data) {
    var _this4 = this;

    var sourceName = this.sourceName;
    var targetName = data.sourceName;
    var streamId = data.streamId;

    var sendStreamResponse = function sendStreamResponse(_ref2) {
      var stream = _ref2.stream,
          success = _ref2.success,
          reason = _ref2.reason;

      _this4.comObj.postMessage({
        sourceName: sourceName,
        targetName: targetName,
        stream: stream,
        success: success,
        streamId: streamId,
        reason: reason
      });
    };

    var deleteStreamController = function deleteStreamController() {
      Promise.all([_this4.streamControllers[data.streamId].startCall, _this4.streamControllers[data.streamId].pullCall, _this4.streamControllers[data.streamId].cancelCall].map(function (capability) {
        return capability && finalize(capability.promise);
      })).then(function () {
        delete _this4.streamControllers[data.streamId];
      });
    };

    switch (data.stream) {
      case 'start_complete':
        resolveOrReject(this.streamControllers[data.streamId].startCall, data.success, wrapReason(data.reason));
        break;

      case 'pull_complete':
        resolveOrReject(this.streamControllers[data.streamId].pullCall, data.success, wrapReason(data.reason));
        break;

      case 'pull':
        if (!this.streamSinks[data.streamId]) {
          sendStreamResponse({
            stream: 'pull_complete',
            success: true
          });
          break;
        }

        if (this.streamSinks[data.streamId].desiredSize <= 0 && data.desiredSize > 0) {
          this.streamSinks[data.streamId].sinkCapability.resolve();
        }

        this.streamSinks[data.streamId].desiredSize = data.desiredSize;
        resolveCall(this.streamSinks[data.streamId].onPull).then(function () {
          sendStreamResponse({
            stream: 'pull_complete',
            success: true
          });
        }, function (reason) {
          sendStreamResponse({
            stream: 'pull_complete',
            success: false,
            reason: reason
          });
        });
        break;

      case 'enqueue':
        (0, _util.assert)(this.streamControllers[data.streamId], 'enqueue should have stream controller');

        if (!this.streamControllers[data.streamId].isClosed) {
          this.streamControllers[data.streamId].controller.enqueue(data.chunk);
        }

        break;

      case 'close':
        (0, _util.assert)(this.streamControllers[data.streamId], 'close should have stream controller');

        if (this.streamControllers[data.streamId].isClosed) {
          break;
        }

        this.streamControllers[data.streamId].isClosed = true;
        this.streamControllers[data.streamId].controller.close();
        deleteStreamController();
        break;

      case 'error':
        (0, _util.assert)(this.streamControllers[data.streamId], 'error should have stream controller');
        this.streamControllers[data.streamId].controller.error(wrapReason(data.reason));
        deleteStreamController();
        break;

      case 'cancel_complete':
        resolveOrReject(this.streamControllers[data.streamId].cancelCall, data.success, wrapReason(data.reason));
        deleteStreamController();
        break;

      case 'cancel':
        if (!this.streamSinks[data.streamId]) {
          break;
        }

        resolveCall(this.streamSinks[data.streamId].onCancel, [wrapReason(data.reason)]).then(function () {
          sendStreamResponse({
            stream: 'cancel_complete',
            success: true
          });
        }, function (reason) {
          sendStreamResponse({
            stream: 'cancel_complete',
            success: false,
            reason: reason
          });
        });
        this.streamSinks[data.streamId].sinkCapability.reject(wrapReason(data.reason));
        this.streamSinks[data.streamId].isCancelled = true;
        delete this.streamSinks[data.streamId];
        break;

      default:
        throw new Error('Unexpected stream case');
    }
  },
  postMessage: function postMessage(message, transfers) {
    if (transfers && this.postMessageTransfers) {
      this.comObj.postMessage(message, transfers);
    } else {
      this.comObj.postMessage(message);
    }
  },
  destroy: function destroy() {
    this.comObj.removeEventListener('message', this._onComObjOnMessage);
  }
};

/***/ })
/******/ ]);
});/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @file Customized file from pdfjs-dist@2.1.266
 * Changes:
 * - CHANGE 1: We have removed the requirements for the Fullscreen API.
 *   Mostly by copying any ":fullscreen" rules without that pseudo-class.
 *   The fullscreen can be invoked only by an user action
 *   and there is no interacting user in a signage application.
 * - CHANGE 2: We have disabled all the GUI controls for the same reason.
 * - CHANGE 3: We have fixed the bug in the portrait presentation mode.
 *   If the displayed page isn't long enough, the next page can be seen.
 *   The fix relies on 16:9 resolution.
 * - CHANGE 4: We have changed the default background
 *   to match the background of the presentation mode
 *   and to avoid the flickering of colors on application load.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

/* Copyright 2014 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.
 */

.textLayer {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  overflow: hidden;
  opacity: 0.2;
  line-height: 1.0;
}

.textLayer > span {
  color: transparent;
  position: absolute;
  white-space: pre;
  cursor: text;
  -webkit-transform-origin: 0% 0%;
          transform-origin: 0% 0%;
}

.textLayer .highlight {
  margin: -1px;
  padding: 1px;

  background-color: rgb(180, 0, 170);
  border-radius: 4px;
}

.textLayer .highlight.begin {
  border-radius: 4px 0px 0px 4px;
}

.textLayer .highlight.end {
  border-radius: 0px 4px 4px 0px;
}

.textLayer .highlight.middle {
  border-radius: 0px;
}

.textLayer .highlight.selected {
  background-color: rgb(0, 100, 0);
}

.textLayer ::-moz-selection { background: rgb(0,0,255); }

.textLayer ::selection { background: rgb(0,0,255); }

.textLayer .endOfContent {
  display: block;
  position: absolute;
  left: 0px;
  top: 100%;
  right: 0px;
  bottom: 0px;
  z-index: -1;
  cursor: default;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
}

.textLayer .endOfContent.active {
  top: 0px;
}


.annotationLayer section {
  position: absolute;
}

.annotationLayer .linkAnnotation > a,
.annotationLayer .buttonWidgetAnnotation.pushButton > a {
  position: absolute;
  font-size: 1em;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

.annotationLayer .linkAnnotation > a:hover,
.annotationLayer .buttonWidgetAnnotation.pushButton > a:hover {
  opacity: 0.2;
  background: #ff0;
  box-shadow: 0px 2px 10px #ff0;
}

.annotationLayer .textAnnotation img {
  position: absolute;
  cursor: pointer;
}

.annotationLayer .textWidgetAnnotation input,
.annotationLayer .textWidgetAnnotation textarea,
.annotationLayer .choiceWidgetAnnotation select,
.annotationLayer .buttonWidgetAnnotation.checkBox input,
.annotationLayer .buttonWidgetAnnotation.radioButton input {
  background-color: rgba(0, 54, 255, 0.13);
  border: 1px solid transparent;
  box-sizing: border-box;
  font-size: 9px;
  height: 100%;
  margin: 0;
  padding: 0 3px;
  vertical-align: top;
  width: 100%;
}

.annotationLayer .choiceWidgetAnnotation select option {
  padding: 0;
}

.annotationLayer .buttonWidgetAnnotation.radioButton input {
  border-radius: 50%;
}

.annotationLayer .textWidgetAnnotation textarea {
  font: message-box;
  font-size: 9px;
  resize: none;
}

.annotationLayer .textWidgetAnnotation input[disabled],
.annotationLayer .textWidgetAnnotation textarea[disabled],
.annotationLayer .choiceWidgetAnnotation select[disabled],
.annotationLayer .buttonWidgetAnnotation.checkBox input[disabled],
.annotationLayer .buttonWidgetAnnotation.radioButton input[disabled] {
  background: none;
  border: 1px solid transparent;
  cursor: not-allowed;
}

.annotationLayer .textWidgetAnnotation input:hover,
.annotationLayer .textWidgetAnnotation textarea:hover,
.annotationLayer .choiceWidgetAnnotation select:hover,
.annotationLayer .buttonWidgetAnnotation.checkBox input:hover,
.annotationLayer .buttonWidgetAnnotation.radioButton input:hover {
  border: 1px solid #000;
}

.annotationLayer .textWidgetAnnotation input:focus,
.annotationLayer .textWidgetAnnotation textarea:focus,
.annotationLayer .choiceWidgetAnnotation select:focus {
  background: none;
  border: 1px solid transparent;
}

.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before,
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after,
.annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before {
  background-color: #000;
  content: '';
  display: block;
  position: absolute;
}

.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before,
.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after {
  height: 80%;
  left: 45%;
  width: 1px;
}

.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before {
  -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
}

.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after {
  -webkit-transform: rotate(-45deg);
          transform: rotate(-45deg);
}

.annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before {
  border-radius: 50%;
  height: 50%;
  left: 30%;
  top: 20%;
  width: 50%;
}

.annotationLayer .textWidgetAnnotation input.comb {
  font-family: monospace;
  padding-left: 2px;
  padding-right: 0;
}

.annotationLayer .textWidgetAnnotation input.comb:focus {
  /*
   * Letter spacing is placed on the right side of each character. Hence, the
   * letter spacing of the last character may be placed outside the visible
   * area, causing horizontal scrolling. We avoid this by extending the width
   * when the element has focus and revert this when it loses focus.
   */
  width: 115%;
}

.annotationLayer .buttonWidgetAnnotation.checkBox input,
.annotationLayer .buttonWidgetAnnotation.radioButton input {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  padding: 0;
}

.annotationLayer .popupWrapper {
  position: absolute;
  width: 20em;
}

.annotationLayer .popup {
  position: absolute;
  z-index: 200;
  max-width: 20em;
  background-color: #FFFF99;
  box-shadow: 0px 2px 5px #333;
  border-radius: 2px;
  padding: 0.6em;
  margin-left: 5px;
  cursor: pointer;
  font: message-box;
  word-wrap: break-word;
}

.annotationLayer .popup h1 {
  font-size: 1em;
  border-bottom: 1px solid #000000;
  margin: 0;
  padding-bottom: 0.2em;
}

.annotationLayer .popup p {
  margin: 0;
  padding-top: 0.2em;
}

.annotationLayer .highlightAnnotation,
.annotationLayer .underlineAnnotation,
.annotationLayer .squigglyAnnotation,
.annotationLayer .strikeoutAnnotation,
.annotationLayer .lineAnnotation svg line,
.annotationLayer .squareAnnotation svg rect,
.annotationLayer .circleAnnotation svg ellipse,
.annotationLayer .polylineAnnotation svg polyline,
.annotationLayer .polygonAnnotation svg polygon,
.annotationLayer .inkAnnotation svg polyline,
.annotationLayer .stampAnnotation,
.annotationLayer .fileAttachmentAnnotation {
  cursor: pointer;
}

.pdfViewer .canvasWrapper {
  overflow: hidden;
}

.pdfViewer .page {
  direction: ltr;
  width: 816px;
  height: 1056px;
  margin: 1px auto -8px auto;
  position: relative;
  overflow: visible;
  border: 9px solid transparent;
  background-clip: content-box;
  -o-border-image: url(images/shadow.png) 9 9 repeat;
     border-image: url(images/shadow.png) 9 9 repeat;
  background-color: white;
}

.pdfViewer.removePageBorders .page {
  margin: 0px auto 10px auto;
  border: none;
}

.pdfViewer.singlePageView {
  display: inline-block;
}

.pdfViewer.singlePageView .page {
  margin: 0;
  border: none;
}

.pdfViewer.scrollHorizontal, .pdfViewer.scrollWrapped, .spread {
  margin-left: 3.5px;
  margin-right: 3.5px;
  text-align: center;
}

.pdfViewer.scrollHorizontal, .spread {
  white-space: nowrap;
}

.pdfViewer.removePageBorders,
.pdfViewer.scrollHorizontal .spread,
.pdfViewer.scrollWrapped .spread {
  margin-left: 0;
  margin-right: 0;
}

.spread .page,
.pdfViewer.scrollHorizontal .page,
.pdfViewer.scrollWrapped .page,
.pdfViewer.scrollHorizontal .spread,
.pdfViewer.scrollWrapped .spread {
  display: inline-block;
  vertical-align: middle;
}

.spread .page,
.pdfViewer.scrollHorizontal .page,
.pdfViewer.scrollWrapped .page {
  margin-left: -3.5px;
  margin-right: -3.5px;
}

.pdfViewer.removePageBorders .spread .page,
.pdfViewer.removePageBorders.scrollHorizontal .page,
.pdfViewer.removePageBorders.scrollWrapped .page {
  margin-left: 5px;
  margin-right: 5px;
}

.pdfViewer .page canvas {
  margin: 0;
  display: block;
}

.pdfViewer .page canvas[hidden] {
  display: none;
}

.pdfViewer .page .loadingIcon {
  position: absolute;
  display: block;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  background: url('images/loading-icon.gif') center no-repeat;
}

.pdfPresentationMode .pdfViewer {
  margin-left: 0;
  margin-right: 0;
}

.pdfPresentationMode .pdfViewer .page,
.pdfPresentationMode .pdfViewer .spread {
  display: block;
}

.pdfPresentationMode .pdfViewer .page,
.pdfPresentationMode .pdfViewer.removePageBorders .page {
  margin-left: auto;
  margin-right: auto;
}

.pdfPresentationMode:-ms-fullscreen .pdfViewer .page {
  margin-bottom: 100% !important;
}

.pdfPresentationMode:-webkit-full-screen .pdfViewer .page {
  margin-bottom: 100%;
  border: 0;
}

.pdfPresentationMode:-moz-full-screen .pdfViewer .page {
  margin-bottom: 100%;
  border: 0;
}

.pdfPresentationMode:fullscreen .pdfViewer .page {
  margin-bottom: 100%;
  border: 0;
}

/* CHANGE 1 */
.pdfPresentationMode .pdfViewer .page {
  /* CHANGE 3 */
  margin-bottom: 178%;
  border: 0;
}

:root {
  --sidebar-width: 200px;
}

* {
  padding: 0;
  margin: 0;
}

html {
  height: 100%;
  width: 100%;
  /* Font size is needed to make the activity bar the correct size. */
  font-size: 10px;
}

body {
  height: 100%;
  width: 100%;
  background-color: #404040;
  background-image: url(images/texture.png);
}

/* CHANGE 4 */
body {
  background-color: #000;
  background-image: none;
}

body,
input,
button,
select {
  font: message-box;
  outline: none;
}

.hidden {
  display: none !important;
}
[hidden] {
  display: none !important;
}

#viewerContainer.pdfPresentationMode:-ms-fullscreen {
  top: 0px !important;
  overflow: hidden !important;
}

#viewerContainer.pdfPresentationMode:-ms-fullscreen::-ms-backdrop {
  background-color: #000;
}

#viewerContainer.pdfPresentationMode:-webkit-full-screen {
  top: 0px;
  border-top: 2px solid transparent;
  background-color: #000;
  width: 100%;
  height: 100%;
  overflow: hidden;
  cursor: none;
  -webkit-user-select: none;
          user-select: none;
}

#viewerContainer.pdfPresentationMode:-moz-full-screen {
  top: 0px;
  border-top: 2px solid transparent;
  background-color: #000;
  width: 100%;
  height: 100%;
  overflow: hidden;
  cursor: none;
  -moz-user-select: none;
       user-select: none;
}

#viewerContainer.pdfPresentationMode:-ms-fullscreen {
  top: 0px;
  border-top: 2px solid transparent;
  background-color: #000;
  width: 100%;
  height: 100%;
  overflow: hidden;
  cursor: none;
  -ms-user-select: none;
      user-select: none;
}

#viewerContainer.pdfPresentationMode:fullscreen {
  top: 0px;
  border-top: 2px solid transparent;
  background-color: #000;
  width: 100%;
  height: 100%;
  overflow: hidden;
  cursor: none;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
}

/* CHANGE 1 */
#viewerContainer.pdfPresentationMode {
  top: 0px;
  border-top: 2px solid transparent;
  background-color: #000;
  width: 100%;
  height: 100%;
  overflow: hidden;
  cursor: none;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
}

.pdfPresentationMode:-webkit-full-screen a:not(.internalLink) {
  display: none;
}

.pdfPresentationMode:-moz-full-screen a:not(.internalLink) {
  display: none;
}

.pdfPresentationMode:-ms-fullscreen a:not(.internalLink) {
  display: none;
}

.pdfPresentationMode:fullscreen a:not(.internalLink) {
  display: none;
}

/* CHANGE 1 */
.pdfPresentationMode a:not(.internalLink) {
  display: none;
}

.pdfPresentationMode:-webkit-full-screen .textLayer > span {
  cursor: none;
}

.pdfPresentationMode:-moz-full-screen .textLayer > span {
  cursor: none;
}

.pdfPresentationMode:-ms-fullscreen .textLayer > span {
  cursor: none;
}

.pdfPresentationMode:fullscreen .textLayer > span {
  cursor: none;
}

/* CHANGE 1 */
.pdfPresentationMode .textLayer > span {
  cursor: none;
}

.pdfPresentationMode.pdfPresentationModeControls > *,
.pdfPresentationMode.pdfPresentationModeControls .textLayer > span {
  cursor: default;
}

#outerContainer {
  width: 100%;
  height: 100%;
  position: relative;
}

#sidebarContainer {
  position: absolute;
  top: 32px;
  bottom: 0;
  width: 200px; /* Here, and elsewhere below, keep the constant value for compatibility
                   with older browsers that lack support for CSS variables. */
  width: var(--sidebar-width);
  visibility: hidden;
  z-index: 100;
  border-top: 1px solid #333;

  transition-duration: 200ms;
  transition-timing-function: ease;
}

/* CHANGE 2 */
#sidebarContainer {
  display: none;
}

html[dir='ltr'] #sidebarContainer {
  transition-property: left;
  left: -200px;
  left: calc(-1 * var(--sidebar-width));
}
html[dir='rtl'] #sidebarContainer {
  transition-property: right;
  right: -200px;
  right: calc(-1 * var(--sidebar-width));
}

.loadingInProgress #sidebarContainer {
  top: 36px;
}

#outerContainer.sidebarResizing #sidebarContainer {
  /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */
  transition-duration: 0s;
  /* Prevent e.g. the thumbnails being selected when the sidebar is resized. */
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
}

#outerContainer.sidebarMoving #sidebarContainer,
#outerContainer.sidebarOpen #sidebarContainer {
  visibility: visible;
}
html[dir='ltr'] #outerContainer.sidebarOpen #sidebarContainer {
  left: 0px;
}
html[dir='rtl'] #outerContainer.sidebarOpen #sidebarContainer {
  right: 0px;
}

#mainContainer {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  min-width: 320px;
}

#sidebarContent {
  top: 32px;
  bottom: 0;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  position: absolute;
  width: 100%;
  background-color: hsla(0,0%,0%,.1);
}
html[dir='ltr'] #sidebarContent {
  left: 0;
  box-shadow: inset -1px 0 0 hsla(0,0%,0%,.25);
}
html[dir='rtl'] #sidebarContent {
  right: 0;
  box-shadow: inset 1px 0 0 hsla(0,0%,0%,.25);
}

#viewerContainer {
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  position: absolute;
  top: 32px;
  right: 0;
  bottom: 0;
  left: 0;
  outline: none;
}
#viewerContainer:not(.pdfPresentationMode) {
  transition-duration: 200ms;
  transition-timing-function: ease;
}
html[dir='ltr'] #viewerContainer {
  box-shadow: inset 1px 0 0 hsla(0,0%,100%,.05);
}
html[dir='rtl'] #viewerContainer {
  box-shadow: inset -1px 0 0 hsla(0,0%,100%,.05);
}

#outerContainer.sidebarResizing #viewerContainer {
  /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */
  transition-duration: 0s;
}

html[dir='ltr'] #outerContainer.sidebarOpen #viewerContainer:not(.pdfPresentationMode) {
  transition-property: left;
  left: 200px;
  left: var(--sidebar-width);
}
html[dir='rtl'] #outerContainer.sidebarOpen #viewerContainer:not(.pdfPresentationMode) {
  transition-property: right;
  right: 200px;
  right: var(--sidebar-width);
}

.toolbar {
  position: relative;
  left: 0;
  right: 0;
  z-index: 9999;
  cursor: default;
}

/* CHANGE 2 */
.toolbar {
  display: none;
}

#toolbarContainer {
  width: 100%;
}

#toolbarSidebar {
  width: 100%;
  height: 32px;
  background-color: #424242; /* fallback */
  background-image: url(images/texture.png),
                    linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95));
}
html[dir='ltr'] #toolbarSidebar {
  box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25),
              inset 0 -1px 0 hsla(0,0%,100%,.05),
              0 1px 0 hsla(0,0%,0%,.15),
              0 0 1px hsla(0,0%,0%,.1);
}
html[dir='rtl'] #toolbarSidebar {
  box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25),
              inset 0 1px 0 hsla(0,0%,100%,.05),
              0 1px 0 hsla(0,0%,0%,.15),
              0 0 1px hsla(0,0%,0%,.1);
}

#sidebarResizer {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 6px;
  z-index: 200;
  cursor: ew-resize;
}
html[dir='ltr'] #sidebarResizer {
  right: -6px;
}
html[dir='rtl'] #sidebarResizer {
  left: -6px;
}

#toolbarContainer, .findbar, .secondaryToolbar {
  position: relative;
  height: 32px;
  background-color: #474747; /* fallback */
  background-image: url(images/texture.png),
                    linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95));
}
html[dir='ltr'] #toolbarContainer, .findbar, .secondaryToolbar {
  box-shadow: inset 0 1px 1px hsla(0,0%,0%,.15),
              inset 0 -1px 0 hsla(0,0%,100%,.05),
              0 1px 0 hsla(0,0%,0%,.15),
              0 1px 1px hsla(0,0%,0%,.1);
}
html[dir='rtl'] #toolbarContainer, .findbar, .secondaryToolbar {
  box-shadow: inset 0 1px 1px hsla(0,0%,0%,.15),
              inset 0 -1px 0 hsla(0,0%,100%,.05),
              0 1px 0 hsla(0,0%,0%,.15),
              0 1px 1px hsla(0,0%,0%,.1);
}

#toolbarViewer {
  height: 32px;
}

#loadingBar {
  position: relative;
  width: 100%;
  height: 4px;
  background-color: #333;
  border-bottom: 1px solid #333;
}

#loadingBar .progress {
  position: absolute;
  top: 0;
  left: 0;
  width: 0%;
  height: 100%;
  background-color: #ddd;
  overflow: hidden;
  transition: width 200ms;
}

@-webkit-keyframes progressIndeterminate {
  0% { left: -142px; }
  100% { left: 0; }
}

@keyframes progressIndeterminate {
  0% { left: -142px; }
  100% { left: 0; }
}

#loadingBar .progress.indeterminate {
  background-color: #999;
  transition: none;
}

#loadingBar .progress.indeterminate .glimmer {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: calc(100% + 150px);

  background: repeating-linear-gradient(135deg,
                                        #bbb 0, #999 5px,
                                        #999 45px, #ddd 55px,
                                        #ddd 95px, #bbb 100px);

  -webkit-animation: progressIndeterminate 950ms linear infinite;

          animation: progressIndeterminate 950ms linear infinite;
}

.findbar, .secondaryToolbar {
  top: 32px;
  position: absolute;
  z-index: 10000;
  height: auto;
  min-width: 16px;
  padding: 0px 6px 0px 6px;
  margin: 4px 2px 4px 2px;
  color: hsl(0,0%,85%);
  font-size: 12px;
  line-height: 14px;
  text-align: left;
  cursor: default;
}

/* CHANGE 2 */
.findbar, .secondaryToolbar {
  display: none;
}

.findbar {
  min-width: 300px;
}
.findbar > div {
  height: 32px;
}
.findbar.wrapContainers > div {
  clear: both;
}
.findbar.wrapContainers > div#findbarMessageContainer {
  height: auto;
}
html[dir='ltr'] .findbar {
  left: 68px;
}
html[dir='rtl'] .findbar {
  right: 68px;
}

.findbar label {
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
}

#findInput {
  width: 200px;
}
#findInput::-webkit-input-placeholder {
  color: hsl(0, 0%, 75%);
}
#findInput:-ms-input-placeholder {
  font-style: italic;
}
#findInput::-ms-input-placeholder {
  font-style: italic;
}
#findInput::placeholder {
  font-style: italic;
}
#findInput[data-status="pending"] {
  background-image: url(images/loading-small.png);
  background-repeat: no-repeat;
  background-position: right;
}
html[dir='rtl'] #findInput[data-status="pending"] {
  background-position: left;
}

.secondaryToolbar {
  padding: 6px;
  height: auto;
  z-index: 30000;
}
html[dir='ltr'] .secondaryToolbar {
  right: 4px;
}
html[dir='rtl'] .secondaryToolbar {
  left: 4px;
}

#secondaryToolbarButtonContainer {
  max-width: 200px;
  max-height: 400px;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  margin-bottom: -4px;
}

#secondaryToolbarButtonContainer.hiddenScrollModeButtons > .scrollModeButtons,
#secondaryToolbarButtonContainer.hiddenSpreadModeButtons > .spreadModeButtons {
  display: none !important;
}

.doorHanger,
.doorHangerRight {
  border: 1px solid hsla(0,0%,0%,.5);
  border-radius: 2px;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
}
.doorHanger:after, .doorHanger:before,
.doorHangerRight:after, .doorHangerRight:before {
  bottom: 100%;
  border: solid transparent;
  content: " ";
  height: 0;
  width: 0;
  position: absolute;
  pointer-events: none;
}
.doorHanger:after,
.doorHangerRight:after {
  border-bottom-color: hsla(0,0%,32%,.99);
  border-width: 8px;
}
.doorHanger:before,
.doorHangerRight:before {
  border-bottom-color: hsla(0,0%,0%,.5);
  border-width: 9px;
}

html[dir='ltr'] .doorHanger:after,
html[dir='rtl'] .doorHangerRight:after {
  left: 13px;
  margin-left: -8px;
}

html[dir='ltr'] .doorHanger:before,
html[dir='rtl'] .doorHangerRight:before {
  left: 13px;
  margin-left: -9px;
}

html[dir='rtl'] .doorHanger:after,
html[dir='ltr'] .doorHangerRight:after {
  right: 13px;
  margin-right: -8px;
}

html[dir='rtl'] .doorHanger:before,
html[dir='ltr'] .doorHangerRight:before {
  right: 13px;
  margin-right: -9px;
}

#findResultsCount {
  background-color: hsl(0, 0%, 85%);
  color: hsl(0, 0%, 32%);
  text-align: center;
  padding: 3px 4px;
}

#findMsg {
  font-style: italic;
  color: #A6B7D0;
}
#findMsg:empty {
  display: none;
}

#findInput.notFound {
  background-color: rgb(255, 102, 102);
}

#toolbarViewerMiddle {
  position: absolute;
  left: 50%;
  -webkit-transform: translateX(-50%);
          transform: translateX(-50%);
}

html[dir='ltr'] #toolbarViewerLeft,
html[dir='rtl'] #toolbarViewerRight {
  float: left;
}
html[dir='ltr'] #toolbarViewerRight,
html[dir='rtl'] #toolbarViewerLeft {
  float: right;
}
html[dir='ltr'] #toolbarViewerLeft > *,
html[dir='ltr'] #toolbarViewerMiddle > *,
html[dir='ltr'] #toolbarViewerRight > *,
html[dir='ltr'] .findbar * {
  position: relative;
  float: left;
}
html[dir='rtl'] #toolbarViewerLeft > *,
html[dir='rtl'] #toolbarViewerMiddle > *,
html[dir='rtl'] #toolbarViewerRight > *,
html[dir='rtl'] .findbar * {
  position: relative;
  float: right;
}

html[dir='ltr'] .splitToolbarButton {
  margin: 3px 2px 4px 0;
  display: inline-block;
}
html[dir='rtl'] .splitToolbarButton {
  margin: 3px 0 4px 2px;
  display: inline-block;
}
html[dir='ltr'] .splitToolbarButton > .toolbarButton {
  border-radius: 0;
  float: left;
}
html[dir='rtl'] .splitToolbarButton > .toolbarButton {
  border-radius: 0;
  float: right;
}

.toolbarButton,
.secondaryToolbarButton,
.overlayButton {
  border: 0 none;
  background: none;
  width: 32px;
  height: 25px;
}

.toolbarButton > span {
  display: inline-block;
  width: 0;
  height: 0;
  overflow: hidden;
}

.toolbarButton[disabled],
.secondaryToolbarButton[disabled],
.overlayButton[disabled] {
  opacity: .5;
}

.splitToolbarButton.toggled .toolbarButton {
  margin: 0;
}

.splitToolbarButton:hover > .toolbarButton,
.splitToolbarButton:focus > .toolbarButton,
.splitToolbarButton.toggled > .toolbarButton,
.toolbarButton.textButton {
  background-color: hsla(0,0%,0%,.12);
  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
  background-clip: padding-box;
  border: 1px solid hsla(0,0%,0%,.35);
  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);
  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
              0 0 1px hsla(0,0%,100%,.15) inset,
              0 1px 0 hsla(0,0%,100%,.05);
  transition-property: background-color, border-color, box-shadow;
  transition-duration: 150ms;
  transition-timing-function: ease;

}
.splitToolbarButton > .toolbarButton:hover,
.splitToolbarButton > .toolbarButton:focus,
.dropdownToolbarButton:hover,
.overlayButton:hover,
.overlayButton:focus,
.toolbarButton.textButton:hover,
.toolbarButton.textButton:focus {
  background-color: hsla(0,0%,0%,.2);
  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
              0 0 1px hsla(0,0%,100%,.15) inset,
              0 0 1px hsla(0,0%,0%,.05);
  z-index: 199;
}
.splitToolbarButton > .toolbarButton {
  position: relative;
}
html[dir='ltr'] .splitToolbarButton > .toolbarButton:first-child,
html[dir='rtl'] .splitToolbarButton > .toolbarButton:last-child {
  position: relative;
  margin: 0;
  margin-right: -1px;
  border-top-left-radius: 2px;
  border-bottom-left-radius: 2px;
  border-right-color: transparent;
}
html[dir='ltr'] .splitToolbarButton > .toolbarButton:last-child,
html[dir='rtl'] .splitToolbarButton > .toolbarButton:first-child {
  position: relative;
  margin: 0;
  margin-left: -1px;
  border-top-right-radius: 2px;
  border-bottom-right-radius: 2px;
  border-left-color: transparent;
}
.splitToolbarButtonSeparator {
  padding: 8px 0;
  width: 1px;
  background-color: hsla(0,0%,0%,.5);
  z-index: 99;
  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
  display: inline-block;
  margin: 5px 0;
}
html[dir='ltr'] .splitToolbarButtonSeparator {
  float: left;
}
html[dir='rtl'] .splitToolbarButtonSeparator {
  float: right;
}
.splitToolbarButton:hover > .splitToolbarButtonSeparator,
.splitToolbarButton.toggled > .splitToolbarButtonSeparator {
  padding: 12px 0;
  margin: 1px 0;
  box-shadow: 0 0 0 1px hsla(0,0%,100%,.03);
  transition-property: padding;
  transition-duration: 10ms;
  transition-timing-function: ease;
}

.toolbarButton,
.dropdownToolbarButton,
.secondaryToolbarButton,
.overlayButton {
  min-width: 16px;
  padding: 2px 6px 0;
  border: 1px solid transparent;
  border-radius: 2px;
  color: hsla(0,0%,100%,.8);
  font-size: 12px;
  line-height: 14px;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
  /* Opera does not support user-select, use <... unselectable="on"> instead */
  cursor: default;
  transition-property: background-color, border-color, box-shadow;
  transition-duration: 150ms;
  transition-timing-function: ease;
}

html[dir='ltr'] .toolbarButton,
html[dir='ltr'] .overlayButton,
html[dir='ltr'] .dropdownToolbarButton {
  margin: 3px 2px 4px 0;
}
html[dir='rtl'] .toolbarButton,
html[dir='rtl'] .overlayButton,
html[dir='rtl'] .dropdownToolbarButton {
  margin: 3px 0 4px 2px;
}

.toolbarButton:hover,
.toolbarButton:focus,
.dropdownToolbarButton,
.overlayButton,
.secondaryToolbarButton:hover,
.secondaryToolbarButton:focus {
  background-color: hsla(0,0%,0%,.12);
  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
  background-clip: padding-box;
  border: 1px solid hsla(0,0%,0%,.35);
  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);
  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
              0 0 1px hsla(0,0%,100%,.15) inset,
              0 1px 0 hsla(0,0%,100%,.05);
}

.toolbarButton:hover:active,
.overlayButton:hover:active,
.dropdownToolbarButton:hover:active,
.secondaryToolbarButton:hover:active {
  background-color: hsla(0,0%,0%,.2);
  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
  border-color: hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45);
  box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset,
              0 0 1px hsla(0,0%,0%,.2) inset,
              0 1px 0 hsla(0,0%,100%,.05);
  transition-property: background-color, border-color, box-shadow;
  transition-duration: 10ms;
  transition-timing-function: linear;
}

.toolbarButton.toggled,
.splitToolbarButton.toggled > .toolbarButton.toggled,
.secondaryToolbarButton.toggled {
  background-color: hsla(0,0%,0%,.3);
  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.45) hsla(0,0%,0%,.5);
  box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset,
              0 0 1px hsla(0,0%,0%,.2) inset,
              0 1px 0 hsla(0,0%,100%,.05);
  transition-property: background-color, border-color, box-shadow;
  transition-duration: 10ms;
  transition-timing-function: linear;
}

.toolbarButton.toggled:hover:active,
.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active,
.secondaryToolbarButton.toggled:hover:active {
  background-color: hsla(0,0%,0%,.4);
  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.5) hsla(0,0%,0%,.55);
  box-shadow: 0 1px 1px hsla(0,0%,0%,.2) inset,
              0 0 1px hsla(0,0%,0%,.3) inset,
              0 1px 0 hsla(0,0%,100%,.05);
}

.dropdownToolbarButton {
  width: 120px;
  max-width: 120px;
  padding: 0;
  overflow: hidden;
  background: url(images/toolbarButton-menuArrows.png) no-repeat;
}
html[dir='ltr'] .dropdownToolbarButton {
  background-position: 95%;
}
html[dir='rtl'] .dropdownToolbarButton {
  background-position: 5%;
}

.dropdownToolbarButton > select {
  min-width: 140px;
  font-size: 12px;
  color: hsl(0,0%,95%);
  margin: 0;
  padding: 3px 2px 2px;
  border: none;
  background: rgba(0,0,0,0); /* Opera does not support 'transparent' <select> background */
}

.dropdownToolbarButton > select > option {
  background: hsl(0,0%,24%);
}

#customScaleOption {
  display: none;
}

#pageWidthOption {
  border-bottom: 1px rgba(255, 255, 255, .5) solid;
}

html[dir='ltr'] .splitToolbarButton:first-child,
html[dir='ltr'] .toolbarButton:first-child,
html[dir='rtl'] .splitToolbarButton:last-child,
html[dir='rtl'] .toolbarButton:last-child {
  margin-left: 4px;
}
html[dir='ltr'] .splitToolbarButton:last-child,
html[dir='ltr'] .toolbarButton:last-child,
html[dir='rtl'] .splitToolbarButton:first-child,
html[dir='rtl'] .toolbarButton:first-child {
  margin-right: 4px;
}

.toolbarButtonSpacer {
  width: 30px;
  display: inline-block;
  height: 1px;
}

html[dir='ltr'] #findPrevious {
  margin-left: 3px;
}
html[dir='ltr'] #findNext {
  margin-right: 3px;
}

html[dir='rtl'] #findPrevious {
  margin-right: 3px;
}
html[dir='rtl'] #findNext {
  margin-left: 3px;
}

.toolbarButton::before,
.secondaryToolbarButton::before {
  /* All matching images have a size of 16x16
   * All relevant containers have a size of 32x25 */
  position: absolute;
  display: inline-block;
  top: 4px;
  left: 7px;
}

html[dir="ltr"] .secondaryToolbarButton::before {
  left: 4px;
}
html[dir="rtl"] .secondaryToolbarButton::before {
  right: 4px;
}

html[dir='ltr'] .toolbarButton#sidebarToggle::before {
  content: url(images/toolbarButton-sidebarToggle.png);
}
html[dir='rtl'] .toolbarButton#sidebarToggle::before {
  content: url(images/toolbarButton-sidebarToggle-rtl.png);
}

html[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {
  content: url(images/toolbarButton-secondaryToolbarToggle.png);
}
html[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {
  content: url(images/toolbarButton-secondaryToolbarToggle-rtl.png);
}

html[dir='ltr'] .toolbarButton.findPrevious::before {
  content: url(images/findbarButton-previous.png);
}
html[dir='rtl'] .toolbarButton.findPrevious::before {
  content: url(images/findbarButton-previous-rtl.png);
}

html[dir='ltr'] .toolbarButton.findNext::before {
  content: url(images/findbarButton-next.png);
}
html[dir='rtl'] .toolbarButton.findNext::before {
  content: url(images/findbarButton-next-rtl.png);
}

html[dir='ltr'] .toolbarButton.pageUp::before {
  content: url(images/toolbarButton-pageUp.png);
}
html[dir='rtl'] .toolbarButton.pageUp::before {
  content: url(images/toolbarButton-pageUp-rtl.png);
}

html[dir='ltr'] .toolbarButton.pageDown::before {
  content: url(images/toolbarButton-pageDown.png);
}
html[dir='rtl'] .toolbarButton.pageDown::before {
  content: url(images/toolbarButton-pageDown-rtl.png);
}

.toolbarButton.zoomOut::before {
  content: url(images/toolbarButton-zoomOut.png);
}

.toolbarButton.zoomIn::before {
  content: url(images/toolbarButton-zoomIn.png);
}

.toolbarButton.presentationMode::before,
.secondaryToolbarButton.presentationMode::before {
  content: url(images/toolbarButton-presentationMode.png);
}

.toolbarButton.print::before,
.secondaryToolbarButton.print::before {
  content: url(images/toolbarButton-print.png);
}

.toolbarButton.openFile::before,
.secondaryToolbarButton.openFile::before {
  content: url(images/toolbarButton-openFile.png);
}

.toolbarButton.download::before,
.secondaryToolbarButton.download::before {
  content: url(images/toolbarButton-download.png);
}

.toolbarButton.bookmark,
.secondaryToolbarButton.bookmark {
  box-sizing: border-box;
  outline: none;
  padding-top: 4px;
  text-decoration: none;
}
.secondaryToolbarButton.bookmark {
  padding-top: 5px;
}

.bookmark[href='#'] {
  opacity: .5;
  pointer-events: none;
}

.toolbarButton.bookmark::before,
.secondaryToolbarButton.bookmark::before {
  content: url(images/toolbarButton-bookmark.png);
}

#viewThumbnail.toolbarButton::before {
  content: url(images/toolbarButton-viewThumbnail.png);
}

html[dir="ltr"] #viewOutline.toolbarButton::before {
  content: url(images/toolbarButton-viewOutline.png);
}
html[dir="rtl"] #viewOutline.toolbarButton::before {
  content: url(images/toolbarButton-viewOutline-rtl.png);
}

#viewAttachments.toolbarButton::before {
  content: url(images/toolbarButton-viewAttachments.png);
}

#viewFind.toolbarButton::before {
  content: url(images/toolbarButton-search.png);
}

.toolbarButton.pdfSidebarNotification::after {
  position: absolute;
  display: inline-block;
  top: 1px;
  /* Create a filled circle, with a diameter of 9 pixels, using only CSS: */
  content: '';
  background-color: #70DB55;
  height: 9px;
  width: 9px;
  border-radius: 50%;
}
html[dir='ltr'] .toolbarButton.pdfSidebarNotification::after {
  left: 17px;
}
html[dir='rtl'] .toolbarButton.pdfSidebarNotification::after {
  right: 17px;
}

.secondaryToolbarButton {
  position: relative;
  margin: 0 0 4px 0;
  padding: 3px 0 1px 0;
  height: auto;
  min-height: 25px;
  width: auto;
  min-width: 100%;
  white-space: normal;
}
html[dir="ltr"] .secondaryToolbarButton {
  padding-left: 24px;
  text-align: left;
}
html[dir="rtl"] .secondaryToolbarButton {
  padding-right: 24px;
  text-align: right;
}
html[dir="ltr"] .secondaryToolbarButton.bookmark {
  padding-left: 27px;
}
html[dir="rtl"] .secondaryToolbarButton.bookmark {
  padding-right: 27px;
}

html[dir="ltr"] .secondaryToolbarButton > span {
  padding-right: 4px;
}
html[dir="rtl"] .secondaryToolbarButton > span {
  padding-left: 4px;
}

.secondaryToolbarButton.firstPage::before {
  content: url(images/secondaryToolbarButton-firstPage.png);
}

.secondaryToolbarButton.lastPage::before {
  content: url(images/secondaryToolbarButton-lastPage.png);
}

.secondaryToolbarButton.rotateCcw::before {
  content: url(images/secondaryToolbarButton-rotateCcw.png);
}

.secondaryToolbarButton.rotateCw::before {
  content: url(images/secondaryToolbarButton-rotateCw.png);
}

.secondaryToolbarButton.selectTool::before {
  content: url(images/secondaryToolbarButton-selectTool.png);
}

.secondaryToolbarButton.handTool::before {
  content: url(images/secondaryToolbarButton-handTool.png);
}

.secondaryToolbarButton.scrollVertical::before {
  content: url(images/secondaryToolbarButton-scrollVertical.png);
}

.secondaryToolbarButton.scrollHorizontal::before {
  content: url(images/secondaryToolbarButton-scrollHorizontal.png);
}

.secondaryToolbarButton.scrollWrapped::before {
  content: url(images/secondaryToolbarButton-scrollWrapped.png);
}

.secondaryToolbarButton.spreadNone::before {
  content: url(images/secondaryToolbarButton-spreadNone.png);
}

.secondaryToolbarButton.spreadOdd::before {
  content: url(images/secondaryToolbarButton-spreadOdd.png);
}

.secondaryToolbarButton.spreadEven::before {
  content: url(images/secondaryToolbarButton-spreadEven.png);
}

.secondaryToolbarButton.documentProperties::before {
  content: url(images/secondaryToolbarButton-documentProperties.png);
}

.verticalToolbarSeparator {
  display: block;
  padding: 8px 0;
  margin: 8px 4px;
  width: 1px;
  background-color: hsla(0,0%,0%,.5);
  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
}
html[dir='ltr'] .verticalToolbarSeparator {
  margin-left: 2px;
}
html[dir='rtl'] .verticalToolbarSeparator {
  margin-right: 2px;
}

.horizontalToolbarSeparator {
  display: block;
  margin: 0 0 4px 0;
  height: 1px;
  width: 100%;
  background-color: hsla(0,0%,0%,.5);
  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
}

.toolbarField {
  padding: 3px 6px;
  margin: 4px 0 4px 0;
  border: 1px solid transparent;
  border-radius: 2px;
  background-color: hsla(0,0%,100%,.09);
  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
  background-clip: padding-box;
  border: 1px solid hsla(0,0%,0%,.35);
  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);
  box-shadow: 0 1px 0 hsla(0,0%,0%,.05) inset,
              0 1px 0 hsla(0,0%,100%,.05);
  color: hsl(0,0%,95%);
  font-size: 12px;
  line-height: 14px;
  outline-style: none;
  transition-property: background-color, border-color, box-shadow;
  transition-duration: 150ms;
  transition-timing-function: ease;
}

.toolbarField[type=checkbox] {
  display: inline-block;
  margin: 8px 0px;
}

.toolbarField.pageNumber {
  -moz-appearance: textfield; /* hides the spinner in moz */
  min-width: 16px;
  text-align: right;
  width: 40px;
}

.toolbarField.pageNumber.visiblePageIsLoading {
  background-image: url(images/loading-small.png);
  background-repeat: no-repeat;
  background-position: 1px;
}

.toolbarField.pageNumber::-webkit-inner-spin-button,
.toolbarField.pageNumber::-webkit-outer-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

.toolbarField:hover {
  background-color: hsla(0,0%,100%,.11);
  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.43) hsla(0,0%,0%,.45);
}

.toolbarField:focus {
  background-color: hsla(0,0%,100%,.15);
  border-color: hsla(204,100%,65%,.8) hsla(204,100%,65%,.85) hsla(204,100%,65%,.9);
}

.toolbarLabel {
  min-width: 16px;
  padding: 3px 6px 3px 2px;
  margin: 4px 2px 4px 0;
  border: 1px solid transparent;
  border-radius: 2px;
  color: hsl(0,0%,85%);
  font-size: 12px;
  line-height: 14px;
  text-align: left;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
  cursor: default;
}

#thumbnailView {
  position: absolute;
  width: calc(100% - 60px);
  top: 0;
  bottom: 0;
  padding: 10px 30px 0;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
}

#thumbnailView > a:active,
#thumbnailView > a:focus {
  outline: 0;
}

.thumbnail {
  margin: 0 10px 5px 10px;
}
html[dir='ltr'] .thumbnail {
  float: left;
}
html[dir='rtl'] .thumbnail {
  float: right;
}

#thumbnailView > a:last-of-type > .thumbnail {
  margin-bottom: 10px;
}

#thumbnailView > a:last-of-type > .thumbnail:not([data-loaded]) {
  margin-bottom: 9px;
}

.thumbnail:not([data-loaded]) {
  border: 1px dashed rgba(255, 255, 255, 0.5);
  margin: -1px 9px 4px 9px;
}

.thumbnailImage {
  border: 1px solid transparent;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);
  opacity: 0.8;
  z-index: 99;
  background-color: white;
  background-clip: content-box;
}

.thumbnailSelectionRing {
  border-radius: 2px;
  padding: 7px;
}

a:focus > .thumbnail > .thumbnailSelectionRing > .thumbnailImage,
.thumbnail:hover > .thumbnailSelectionRing > .thumbnailImage {
  opacity: .9;
}

a:focus > .thumbnail > .thumbnailSelectionRing,
.thumbnail:hover > .thumbnailSelectionRing {
  background-color: hsla(0,0%,100%,.15);
  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
  background-clip: padding-box;
  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
              0 0 1px hsla(0,0%,100%,.2) inset,
              0 0 1px hsla(0,0%,0%,.2);
  color: hsla(0,0%,100%,.9);
}

.thumbnail.selected > .thumbnailSelectionRing > .thumbnailImage {
  box-shadow: 0 0 0 1px hsla(0,0%,0%,.5);
  opacity: 1;
}

.thumbnail.selected > .thumbnailSelectionRing {
  background-color: hsla(0,0%,100%,.3);
  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
  background-clip: padding-box;
  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
              0 0 1px hsla(0,0%,100%,.1) inset,
              0 0 1px hsla(0,0%,0%,.2);
  color: hsla(0,0%,100%,1);
}

#outlineView,
#attachmentsView {
  position: absolute;
  width: calc(100% - 8px);
  top: 0;
  bottom: 0;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
}

#outlineView {
  padding: 4px 4px 0;
}
#attachmentsView {
  padding: 3px 4px 0;
}

html[dir='ltr'] .outlineWithDeepNesting > .outlineItem,
html[dir='ltr'] .outlineItem > .outlineItems {
  margin-left: 20px;
}

html[dir='rtl'] .outlineWithDeepNesting > .outlineItem,
html[dir='rtl'] .outlineItem > .outlineItems {
  margin-right: 20px;
}

.outlineItem > a,
.attachmentsItem > button {
  text-decoration: none;
  display: inline-block;
  min-width: 95%;
  min-width: calc(100% - 4px); /* Subtract the right padding (left, in RTL mode)
                                  of the container. */
  height: auto;
  margin-bottom: 1px;
  border-radius: 2px;
  color: hsla(0,0%,100%,.8);
  font-size: 13px;
  line-height: 15px;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
  white-space: normal;
}

.attachmentsItem > button {
  border: 0 none;
  background: none;
  cursor: pointer;
  width: 100%;
}

html[dir='ltr'] .outlineItem > a {
  padding: 2px 0 5px 4px;
}
html[dir='ltr'] .attachmentsItem > button {
  padding: 2px 0 3px 7px;
  text-align: left;
}

html[dir='rtl'] .outlineItem > a {
  padding: 2px 4px 5px 0;
}
html[dir='rtl'] .attachmentsItem > button {
  padding: 2px 7px 3px 0;
  text-align: right;
}

.outlineItemToggler {
  position: relative;
  height: 0;
  width: 0;
  color: hsla(0,0%,100%,.5);
}
.outlineItemToggler::before {
  content: url(images/treeitem-expanded.png);
  display: inline-block;
  position: absolute;
}
html[dir='ltr'] .outlineItemToggler.outlineItemsHidden::before {
  content: url(images/treeitem-collapsed.png);
}
html[dir='rtl'] .outlineItemToggler.outlineItemsHidden::before {
  content: url(images/treeitem-collapsed-rtl.png);
}
.outlineItemToggler.outlineItemsHidden ~ .outlineItems {
  display: none;
}
html[dir='ltr'] .outlineItemToggler {
  float: left;
}
html[dir='rtl'] .outlineItemToggler {
  float: right;
}
html[dir='ltr'] .outlineItemToggler::before {
  right: 4px;
}
html[dir='rtl'] .outlineItemToggler::before {
  left: 4px;
}

.outlineItemToggler:hover,
.outlineItemToggler:hover + a,
.outlineItemToggler:hover ~ .outlineItems,
.outlineItem > a:hover,
.attachmentsItem > button:hover {
  background-color: hsla(0,0%,100%,.02);
  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
  background-clip: padding-box;
  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
              0 0 1px hsla(0,0%,100%,.2) inset,
              0 0 1px hsla(0,0%,0%,.2);
  border-radius: 2px;
  color: hsla(0,0%,100%,.9);
}

.outlineItem.selected {
  background-color: hsla(0,0%,100%,.08);
  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
  background-clip: padding-box;
  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
              0 0 1px hsla(0,0%,100%,.1) inset,
              0 0 1px hsla(0,0%,0%,.2);
  color: hsla(0,0%,100%,1);
}

.noResults {
  font-size: 12px;
  color: hsla(0,0%,100%,.8);
  font-style: italic;
  cursor: default;
}

/* TODO: file FF bug to support ::-moz-selection:window-inactive
   so we can override the opaque grey background when the window is inactive;
   see https://bugzilla.mozilla.org/show_bug.cgi?id=706209 */
::-moz-selection { background: rgba(0,0,255,0.3); }
::selection { background: rgba(0,0,255,0.3); }

#errorWrapper {
  background: none repeat scroll 0 0 #FF5555;
  color: white;
  left: 0;
  position: absolute;
  right: 0;
  z-index: 1000;
  padding: 3px;
  font-size: 0.8em;
}

/* CHANGE 2 */
#errorWrapper {
  display: none;
}

.loadingInProgress #errorWrapper {
  top: 37px;
}

#errorMessageLeft {
  float: left;
}

#errorMessageRight {
  float: right;
}

#errorMoreInfo {
  background-color: #FFFFFF;
  color: black;
  padding: 3px;
  margin: 3px;
  width: 98%;
}

.overlayButton {
  width: auto;
  margin: 3px 4px 2px 4px !important;
  padding: 2px 6px 3px 6px;
}

#overlayContainer {
  display: table;
  position: absolute;
  width: 100%;
  height: 100%;
  background-color: hsla(0,0%,0%,.2);
  z-index: 40000;
}

/* CHANGE 2 */
#overlayContainer {
  display: none;
}

#overlayContainer > * {
  overflow: auto;
  -webkit-overflow-scrolling: touch;
}

#overlayContainer > .container {
  display: table-cell;
  vertical-align: middle;
  text-align: center;
}

#overlayContainer > .container > .dialog {
  display: inline-block;
  padding: 15px;
  border-spacing: 4px;
  color: hsl(0,0%,85%);
  font-size: 12px;
  line-height: 14px;
  background-color: #474747; /* fallback */
  background-image: url(images/texture.png),
                    linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95));
  box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08),
              inset 0 1px 1px hsla(0,0%,0%,.15),
              inset 0 -1px 0 hsla(0,0%,100%,.05),
              0 1px 0 hsla(0,0%,0%,.15),
              0 1px 1px hsla(0,0%,0%,.1);
  border: 1px solid hsla(0,0%,0%,.5);
  border-radius: 4px;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
}

.dialog > .row {
  display: table-row;
}

.dialog > .row > * {
  display: table-cell;
}

.dialog .toolbarField {
  margin: 5px 0;
}

.dialog .separator {
  display: block;
  margin: 4px 0 4px 0;
  height: 1px;
  width: 100%;
  background-color: hsla(0,0%,0%,.5);
  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
}

.dialog .buttonRow {
  text-align: center;
  vertical-align: middle;
}

.dialog :link {
  color: white;
}

#passwordOverlay > .dialog {
  text-align: center;
}
#passwordOverlay .toolbarField {
  width: 200px;
}

#documentPropertiesOverlay > .dialog {
  text-align: left;
}
#documentPropertiesOverlay .row > * {
  min-width: 100px;
}
html[dir='ltr'] #documentPropertiesOverlay .row > * {
  text-align: left;
}
html[dir='rtl'] #documentPropertiesOverlay .row > * {
  text-align: right;
}
#documentPropertiesOverlay .row > span {
  width: 125px;
  word-wrap: break-word;
}
#documentPropertiesOverlay .row > p {
  max-width: 225px;
  word-wrap: break-word;
}
#documentPropertiesOverlay .buttonRow {
  margin-top: 10px;
}

.clearBoth {
  clear: both;
}

.fileInput {
  background: white;
  color: black;
  margin-top: 5px;
  visibility: hidden;
  position: fixed;
  right: 0;
  top: 0;
}

#PDFBug {
  background: none repeat scroll 0 0 white;
  border: 1px solid #666666;
  position: fixed;
  top: 32px;
  right: 0;
  bottom: 0;
  font-size: 10px;
  padding: 0;
  width: 300px;
}
#PDFBug .controls {
    background:#EEEEEE;
    border-bottom: 1px solid #666666;
    padding: 3px;
}
#PDFBug .panels {
  bottom: 0;
  left: 0;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  position: absolute;
  right: 0;
  top: 27px;
}
#PDFBug button.active {
  font-weight: bold;
}
.debuggerShowText {
  background: none repeat scroll 0 0 yellow;
  color: blue;
}
.debuggerHideText:hover {
  background: none repeat scroll 0 0 yellow;
}
#PDFBug .stats {
  font-family: courier;
  font-size: 10px;
  white-space: pre;
}
#PDFBug .stats .title {
    font-weight: bold;
}
#PDFBug table {
  font-size: 10px;
}

#viewer.textLayer-visible .textLayer {
  opacity: 1.0;
}

#viewer.textLayer-visible .canvasWrapper {
  background-color: rgb(128,255,128);
}

#viewer.textLayer-visible .canvasWrapper canvas {
  mix-blend-mode: screen;
}

#viewer.textLayer-visible .textLayer > span {
  background-color: rgba(255, 255, 0, 0.1);
  color: black;
  border: solid 1px rgba(255, 0, 0, 0.5);
  box-sizing: border-box;
}

#viewer.textLayer-hover .textLayer > span:hover {
  background-color: white;
  color: black;
}

#viewer.textLayer-shadow .textLayer > span {
  background-color: rgba(255,255,255, .6);
  color: black;
}

.grab-to-pan-grab {
  cursor: url("images/grab.cur"), move !important;
  cursor: -webkit-grab !important;
  cursor: grab !important;
}
.grab-to-pan-grab *:not(input):not(textarea):not(button):not(select):not(:link) {
  cursor: inherit !important;
}
.grab-to-pan-grab:active,
.grab-to-pan-grabbing {
  cursor: url("images/grabbing.cur"), move !important;
  cursor: -webkit-grabbing !important;
  cursor: grabbing !important;

  position: fixed;
  background: transparent;
  display: block;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  overflow: hidden;
  z-index: 50000; /* should be higher than anything else in PDF.js! */
}

@page {
  margin: 0;
}

#printContainer {
  display: none;
}

@media screen and (-webkit-min-device-pixel-ratio: 1.1), screen and (min-resolution: 1.1dppx) {
  /* Rules for Retina screens */
  .toolbarButton::before {
    -webkit-transform: scale(0.5);
            transform: scale(0.5);
    top: -5px;
  }

  .secondaryToolbarButton::before {
    -webkit-transform: scale(0.5);
            transform: scale(0.5);
    top: -4px;
  }

  html[dir='ltr'] .toolbarButton::before,
  html[dir='rtl'] .toolbarButton::before {
    left: -1px;
  }

  html[dir='ltr'] .secondaryToolbarButton::before {
    left: -2px;
  }
  html[dir='rtl'] .secondaryToolbarButton::before {
    left: 186px;
  }

  .toolbarField.pageNumber.visiblePageIsLoading,
  #findInput[data-status="pending"] {
    background-image: url(images/loading-small@2x.png);
    background-size: 16px 17px;
  }

  .dropdownToolbarButton {
    background: url(images/toolbarButton-menuArrows@2x.png) no-repeat;
    background-size: 7px 16px;
  }

  html[dir='ltr'] .toolbarButton#sidebarToggle::before {
    content: url(images/toolbarButton-sidebarToggle@2x.png);
  }
  html[dir='rtl'] .toolbarButton#sidebarToggle::before {
    content: url(images/toolbarButton-sidebarToggle-rtl@2x.png);
  }

  html[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {
    content: url(images/toolbarButton-secondaryToolbarToggle@2x.png);
  }
  html[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {
    content: url(images/toolbarButton-secondaryToolbarToggle-rtl@2x.png);
  }

  html[dir='ltr'] .toolbarButton.findPrevious::before {
    content: url(images/findbarButton-previous@2x.png);
  }
  html[dir='rtl'] .toolbarButton.findPrevious::before {
    content: url(images/findbarButton-previous-rtl@2x.png);
  }

  html[dir='ltr'] .toolbarButton.findNext::before {
    content: url(images/findbarButton-next@2x.png);
  }
  html[dir='rtl'] .toolbarButton.findNext::before {
    content: url(images/findbarButton-next-rtl@2x.png);
  }

  html[dir='ltr'] .toolbarButton.pageUp::before {
    content: url(images/toolbarButton-pageUp@2x.png);
  }
  html[dir='rtl'] .toolbarButton.pageUp::before {
    content: url(images/toolbarButton-pageUp-rtl@2x.png);
  }

  html[dir='ltr'] .toolbarButton.pageDown::before {
    content: url(images/toolbarButton-pageDown@2x.png);
  }
  html[dir='rtl'] .toolbarButton.pageDown::before {
    content: url(images/toolbarButton-pageDown-rtl@2x.png);
  }

  .toolbarButton.zoomIn::before {
    content: url(images/toolbarButton-zoomIn@2x.png);
  }

  .toolbarButton.zoomOut::before {
    content: url(images/toolbarButton-zoomOut@2x.png);
  }

  .toolbarButton.presentationMode::before,
  .secondaryToolbarButton.presentationMode::before {
    content: url(images/toolbarButton-presentationMode@2x.png);
  }

  .toolbarButton.print::before,
  .secondaryToolbarButton.print::before {
    content: url(images/toolbarButton-print@2x.png);
  }

  .toolbarButton.openFile::before,
  .secondaryToolbarButton.openFile::before {
    content: url(images/toolbarButton-openFile@2x.png);
  }

  .toolbarButton.download::before,
  .secondaryToolbarButton.download::before {
    content: url(images/toolbarButton-download@2x.png);
  }

  .toolbarButton.bookmark::before,
  .secondaryToolbarButton.bookmark::before {
    content: url(images/toolbarButton-bookmark@2x.png);
  }

  #viewThumbnail.toolbarButton::before {
    content: url(images/toolbarButton-viewThumbnail@2x.png);
  }

  html[dir="ltr"] #viewOutline.toolbarButton::before {
    content: url(images/toolbarButton-viewOutline@2x.png);
  }
  html[dir="rtl"] #viewOutline.toolbarButton::before {
    content: url(images/toolbarButton-viewOutline-rtl@2x.png);
  }

  #viewAttachments.toolbarButton::before {
    content: url(images/toolbarButton-viewAttachments@2x.png);
  }

  #viewFind.toolbarButton::before {
    content: url(images/toolbarButton-search@2x.png);
  }

  .secondaryToolbarButton.firstPage::before {
    content: url(images/secondaryToolbarButton-firstPage@2x.png);
  }

  .secondaryToolbarButton.lastPage::before {
    content: url(images/secondaryToolbarButton-lastPage@2x.png);
  }

  .secondaryToolbarButton.rotateCcw::before {
    content: url(images/secondaryToolbarButton-rotateCcw@2x.png);
  }

  .secondaryToolbarButton.rotateCw::before {
    content: url(images/secondaryToolbarButton-rotateCw@2x.png);
  }

  .secondaryToolbarButton.selectTool::before {
    content: url(images/secondaryToolbarButton-selectTool@2x.png);
  }

  .secondaryToolbarButton.handTool::before {
    content: url(images/secondaryToolbarButton-handTool@2x.png);
  }

  .secondaryToolbarButton.scrollVertical::before {
    content: url(images/secondaryToolbarButton-scrollVertical@2x.png);
  }

  .secondaryToolbarButton.scrollHorizontal::before {
    content: url(images/secondaryToolbarButton-scrollHorizontal@2x.png);
  }

  .secondaryToolbarButton.scrollWrapped::before {
    content: url(images/secondaryToolbarButton-scrollWrapped@2x.png);
  }

  .secondaryToolbarButton.spreadNone::before {
    content: url(images/secondaryToolbarButton-spreadNone@2x.png);
  }

  .secondaryToolbarButton.spreadOdd::before {
    content: url(images/secondaryToolbarButton-spreadOdd@2x.png);
  }

  .secondaryToolbarButton.spreadEven::before {
    content: url(images/secondaryToolbarButton-spreadEven@2x.png);
  }

  .secondaryToolbarButton.documentProperties::before {
    content: url(images/secondaryToolbarButton-documentProperties@2x.png);
  }

  .outlineItemToggler::before {
    -webkit-transform: scale(0.5);
            transform: scale(0.5);
    top: -1px;
    content: url(images/treeitem-expanded@2x.png);
  }
  html[dir='ltr'] .outlineItemToggler.outlineItemsHidden::before {
    content: url(images/treeitem-collapsed@2x.png);
  }
  html[dir='rtl'] .outlineItemToggler.outlineItemsHidden::before {
    content: url(images/treeitem-collapsed-rtl@2x.png);
  }
  html[dir='ltr'] .outlineItemToggler::before {
    right: 0;
  }
  html[dir='rtl'] .outlineItemToggler::before {
    left: 0;
  }
}

@media print {
  /* General rules for printing. */
  body {
    background: transparent none;
  }

  /* Rules for browsers that don't support mozPrintCallback. */
  #sidebarContainer, #secondaryToolbar, .toolbar, #loadingBox, #errorWrapper, .textLayer {
    display: none;
  }
  #viewerContainer {
    overflow: visible;
  }

  #mainContainer, #viewerContainer, .page, .page canvas {
    position: static;
    padding: 0;
    margin: 0;
  }

  .page {
    float: left;
    display: none;
    border: none;
    box-shadow: none;
    background-clip: content-box;
    background-color: white;
  }

  .page[data-loaded] {
    display: block;
  }

  .fileInput {
    display: none;
  }

  /* Rules for browsers that support PDF.js printing */
  body[data-pdfjsprinting] #outerContainer {
    display: none;
  }
  body[data-pdfjsprinting] #printContainer {
    display: block;
  }
  #printContainer {
    height: 100%;
  }
  /* wrapper around (scaled) print canvas elements */
  #printContainer > div {
    position: relative;
    top: 0;
    left: 0;
    width: 1px;
    height: 1px;
    overflow: visible;
    page-break-after: always;
    page-break-inside: avoid;
  }
  #printContainer canvas,
  #printContainer img {
    display: block;
  }
}

.visibleLargeView,
.visibleMediumView,
.visibleSmallView {
  display: none;
}

@media all and (max-width: 900px) {
  #toolbarViewerMiddle {
    display: table;
    margin: auto;
    left: auto;
    position: inherit;
    -webkit-transform: none;
            transform: none;
  }
}

@media all and (max-width: 840px) {
  #sidebarContent {
    background-color: hsla(0,0%,0%,.7);
  }

  html[dir='ltr'] #outerContainer.sidebarOpen #viewerContainer {
    left: 0px !important;
  }
  html[dir='rtl'] #outerContainer.sidebarOpen #viewerContainer {
    right: 0px !important;
  }

  #outerContainer .hiddenLargeView,
  #outerContainer .hiddenMediumView {
    display: inherit;
  }
  #outerContainer .visibleLargeView,
  #outerContainer .visibleMediumView {
    display: none;
  }
}

@media all and (max-width: 770px) {
  #outerContainer .hiddenLargeView {
    display: none;
  }
  #outerContainer .visibleLargeView {
    display: inherit;
  }
}

@media all and (max-width: 700px) {
  #outerContainer .hiddenMediumView {
    display: none;
  }
  #outerContainer .visibleMediumView {
    display: inherit;
  }
}

@media all and (max-width: 640px) {
  .hiddenSmallView, .hiddenSmallView * {
    display: none;
  }
  .visibleSmallView {
    display: inherit;
  }
  .toolbarButtonSpacer {
    width: 0;
  }
  html[dir='ltr'] .findbar {
    left: 38px;
  }
  html[dir='rtl'] .findbar {
    right: 38px;
  }
}

@media all and (max-width: 535px) {
  #scaleSelectContainer {
    display: none;
  }
}
<!DOCTYPE html>
<!--
@author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
@author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>
@copyright Ki-Wi Digital s.r.o.
@file Customized file from pdfjs-dist@2.1.266
Changes:
- CHANGE 1: We have added our scripts to control the viewer.
- CHANGE 2: We have changed the path to `pdf.js`, because we merge
  the build and the web directories into the one output directory.
- CHANGE 3: We have changed the selected div elements into the form elements
  to prevent the Chrome warnings in the console.
  For example "Password field is not contained in a form".
- CHANGE 4: We have added the autocomplete attributes
  to prevent the Chrome warnings in the console.
  For example "Input elements should have autocomplete attributes".
@license
All Rights Reserved.
Unauthorized copying of this file is strictly prohibited.
Proprietary and confidential.
-->
<!--
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.

Adobe CMap resources are covered by their own copyright but the same license:

    Copyright 1990-2015 Adobe Systems Incorporated.

See https://github.com/adobe-type-tools/cmap-resources
-->
<html dir="ltr" mozdisallowselectionprint>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta name="google" content="notranslate">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>PDF.js viewer</title>
    <link rel="stylesheet" href="viewer.css">
    <!-- This snippet is used in production (included from viewer.html) -->
    <link rel="resource" type="application/l10n" href="locale/locale.properties">
    <!-- CHANGE 1 -->
    <script src="pdf-child.js"></script>
    <!-- CHANGE 2 -->
    <script src="pdf.js"></script>
    <script src="viewer.js"></script>
  </head>

  <body tabindex="1" class="loadingInProgress">
    <div id="outerContainer">

      <div id="sidebarContainer">
        <div id="toolbarSidebar">
          <div class="splitToolbarButton toggled">
            <button id="viewThumbnail" class="toolbarButton toggled" title="Show Thumbnails" tabindex="2" data-l10n-id="thumbs">
               <span data-l10n-id="thumbs_label">Thumbnails</span>
            </button>
            <button id="viewOutline" class="toolbarButton" title="Show Document Outline (double-click to expand/collapse all items)" tabindex="3" data-l10n-id="document_outline">
               <span data-l10n-id="document_outline_label">Document Outline</span>
            </button>
            <button id="viewAttachments" class="toolbarButton" title="Show Attachments" tabindex="4" data-l10n-id="attachments">
               <span data-l10n-id="attachments_label">Attachments</span>
            </button>
          </div>
        </div>
        <div id="sidebarContent">
          <div id="thumbnailView">
          </div>
          <div id="outlineView" class="hidden">
          </div>
          <div id="attachmentsView" class="hidden">
          </div>
        </div>
        <div id="sidebarResizer" class="hidden"></div>
      </div>  <!-- sidebarContainer -->

      <div id="mainContainer">
        <!-- CHANGE 3 -->
        <form class="findbar hidden doorHanger" id="findbar">
          <div id="findbarInputContainer">
            <input id="findInput" class="toolbarField" title="Find" placeholder="Find in documentâ€¦" tabindex="91" data-l10n-id="find_input">
            <div class="splitToolbarButton">
              <button id="findPrevious" class="toolbarButton findPrevious" title="Find the previous occurrence of the phrase" tabindex="92" data-l10n-id="find_previous">
                <span data-l10n-id="find_previous_label">Previous</span>
              </button>
              <div class="splitToolbarButtonSeparator"></div>
              <button id="findNext" class="toolbarButton findNext" title="Find the next occurrence of the phrase" tabindex="93" data-l10n-id="find_next">
                <span data-l10n-id="find_next_label">Next</span>
              </button>
            </div>
          </div>

          <div id="findbarOptionsOneContainer">
            <input type="checkbox" id="findHighlightAll" class="toolbarField" tabindex="94">
            <label for="findHighlightAll" class="toolbarLabel" data-l10n-id="find_highlight">Highlight all</label>
            <input type="checkbox" id="findMatchCase" class="toolbarField" tabindex="95">
            <label for="findMatchCase" class="toolbarLabel" data-l10n-id="find_match_case_label">Match case</label>
          </div>
          <div id="findbarOptionsTwoContainer">
            <input type="checkbox" id="findEntireWord" class="toolbarField" tabindex="96">
            <label for="findEntireWord" class="toolbarLabel" data-l10n-id="find_entire_word_label">Whole words</label>
            <span id="findResultsCount" class="toolbarLabel hidden"></span>
          </div>

          <div id="findbarMessageContainer">
            <span id="findMsg" class="toolbarLabel"></span>
          </div>
        </form>  <!-- findbar -->

        <div id="secondaryToolbar" class="secondaryToolbar hidden doorHangerRight">
          <div id="secondaryToolbarButtonContainer">
            <button id="secondaryPresentationMode" class="secondaryToolbarButton presentationMode visibleLargeView" title="Switch to Presentation Mode" tabindex="51" data-l10n-id="presentation_mode">
              <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
            </button>

            <button id="secondaryOpenFile" class="secondaryToolbarButton openFile visibleLargeView" title="Open File" tabindex="52" data-l10n-id="open_file">
              <span data-l10n-id="open_file_label">Open</span>
            </button>

            <button id="secondaryPrint" class="secondaryToolbarButton print visibleMediumView" title="Print" tabindex="53" data-l10n-id="print">
              <span data-l10n-id="print_label">Print</span>
            </button>

            <button id="secondaryDownload" class="secondaryToolbarButton download visibleMediumView" title="Download" tabindex="54" data-l10n-id="download">
              <span data-l10n-id="download_label">Download</span>
            </button>

            <a href="#" id="secondaryViewBookmark" class="secondaryToolbarButton bookmark visibleSmallView" title="Current view (copy or open in new window)" tabindex="55" data-l10n-id="bookmark">
              <span data-l10n-id="bookmark_label">Current View</span>
            </a>

            <div class="horizontalToolbarSeparator visibleLargeView"></div>

            <button id="firstPage" class="secondaryToolbarButton firstPage" title="Go to First Page" tabindex="56" data-l10n-id="first_page">
              <span data-l10n-id="first_page_label">Go to First Page</span>
            </button>
            <button id="lastPage" class="secondaryToolbarButton lastPage" title="Go to Last Page" tabindex="57" data-l10n-id="last_page">
              <span data-l10n-id="last_page_label">Go to Last Page</span>
            </button>

            <div class="horizontalToolbarSeparator"></div>

            <button id="pageRotateCw" class="secondaryToolbarButton rotateCw" title="Rotate Clockwise" tabindex="58" data-l10n-id="page_rotate_cw">
              <span data-l10n-id="page_rotate_cw_label">Rotate Clockwise</span>
            </button>
            <button id="pageRotateCcw" class="secondaryToolbarButton rotateCcw" title="Rotate Counterclockwise" tabindex="59" data-l10n-id="page_rotate_ccw">
              <span data-l10n-id="page_rotate_ccw_label">Rotate Counterclockwise</span>
            </button>

            <div class="horizontalToolbarSeparator"></div>

            <button id="cursorSelectTool" class="secondaryToolbarButton selectTool toggled" title="Enable Text Selection Tool" tabindex="60" data-l10n-id="cursor_text_select_tool">
              <span data-l10n-id="cursor_text_select_tool_label">Text Selection Tool</span>
            </button>
            <button id="cursorHandTool" class="secondaryToolbarButton handTool" title="Enable Hand Tool" tabindex="61" data-l10n-id="cursor_hand_tool">
              <span data-l10n-id="cursor_hand_tool_label">Hand Tool</span>
            </button>

            <div class="horizontalToolbarSeparator"></div>

            <button id="scrollVertical" class="secondaryToolbarButton scrollModeButtons scrollVertical toggled" title="Use Vertical Scrolling" tabindex="62" data-l10n-id="scroll_vertical">
              <span data-l10n-id="scroll_vertical_label">Vertical Scrolling</span>
            </button>
            <button id="scrollHorizontal" class="secondaryToolbarButton scrollModeButtons scrollHorizontal" title="Use Horizontal Scrolling" tabindex="63" data-l10n-id="scroll_horizontal">
              <span data-l10n-id="scroll_horizontal_label">Horizontal Scrolling</span>
            </button>
            <button id="scrollWrapped" class="secondaryToolbarButton scrollModeButtons scrollWrapped" title="Use Wrapped Scrolling" tabindex="64" data-l10n-id="scroll_wrapped">
              <span data-l10n-id="scroll_wrapped_label">Wrapped Scrolling</span>
            </button>

            <div class="horizontalToolbarSeparator scrollModeButtons"></div>

            <button id="spreadNone" class="secondaryToolbarButton spreadModeButtons spreadNone toggled" title="Do not join page spreads" tabindex="65" data-l10n-id="spread_none">
              <span data-l10n-id="spread_none_label">No Spreads</span>
            </button>
            <button id="spreadOdd" class="secondaryToolbarButton spreadModeButtons spreadOdd" title="Join page spreads starting with odd-numbered pages" tabindex="66" data-l10n-id="spread_odd">
              <span data-l10n-id="spread_odd_label">Odd Spreads</span>
            </button>
            <button id="spreadEven" class="secondaryToolbarButton spreadModeButtons spreadEven" title="Join page spreads starting with even-numbered pages" tabindex="67" data-l10n-id="spread_even">
              <span data-l10n-id="spread_even_label">Even Spreads</span>
            </button>

            <div class="horizontalToolbarSeparator spreadModeButtons"></div>

            <button id="documentProperties" class="secondaryToolbarButton documentProperties" title="Document Propertiesâ€¦" tabindex="68" data-l10n-id="document_properties">
              <span data-l10n-id="document_properties_label">Document Propertiesâ€¦</span>
            </button>
          </div>
        </div>  <!-- secondaryToolbar -->

        <!-- CHANGE 3 -->
        <form class="toolbar">
          <div id="toolbarContainer">
            <div id="toolbarViewer">
              <div id="toolbarViewerLeft">
                <button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar" tabindex="11" data-l10n-id="toggle_sidebar">
                  <span data-l10n-id="toggle_sidebar_label">Toggle Sidebar</span>
                </button>
                <div class="toolbarButtonSpacer"></div>
                <button id="viewFind" class="toolbarButton" title="Find in Document" tabindex="12" data-l10n-id="findbar">
                  <span data-l10n-id="findbar_label">Find</span>
                </button>
                <div class="splitToolbarButton hiddenSmallView">
                  <button class="toolbarButton pageUp" title="Previous Page" id="previous" tabindex="13" data-l10n-id="previous">
                    <span data-l10n-id="previous_label">Previous</span>
                  </button>
                  <div class="splitToolbarButtonSeparator"></div>
                  <button class="toolbarButton pageDown" title="Next Page" id="next" tabindex="14" data-l10n-id="next">
                    <span data-l10n-id="next_label">Next</span>
                  </button>
                </div>
                <input type="number" id="pageNumber" class="toolbarField pageNumber" title="Page" value="1" size="4" min="1" tabindex="15" data-l10n-id="page">
                <span id="numPages" class="toolbarLabel"></span>
              </div>
              <div id="toolbarViewerRight">
                <button id="presentationMode" class="toolbarButton presentationMode hiddenLargeView" title="Switch to Presentation Mode" tabindex="31" data-l10n-id="presentation_mode">
                  <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
                </button>

                <button id="openFile" class="toolbarButton openFile hiddenLargeView" title="Open File" tabindex="32" data-l10n-id="open_file">
                  <span data-l10n-id="open_file_label">Open</span>
                </button>

                <button id="print" class="toolbarButton print hiddenMediumView" title="Print" tabindex="33" data-l10n-id="print">
                  <span data-l10n-id="print_label">Print</span>
                </button>

                <button id="download" class="toolbarButton download hiddenMediumView" title="Download" tabindex="34" data-l10n-id="download">
                  <span data-l10n-id="download_label">Download</span>
                </button>
                <a href="#" id="viewBookmark" class="toolbarButton bookmark hiddenSmallView" title="Current view (copy or open in new window)" tabindex="35" data-l10n-id="bookmark">
                  <span data-l10n-id="bookmark_label">Current View</span>
                </a>

                <div class="verticalToolbarSeparator hiddenSmallView"></div>

                <button id="secondaryToolbarToggle" class="toolbarButton" title="Tools" tabindex="36" data-l10n-id="tools">
                  <span data-l10n-id="tools_label">Tools</span>
                </button>
              </div>
              <div id="toolbarViewerMiddle">
                <div class="splitToolbarButton">
                  <button id="zoomOut" class="toolbarButton zoomOut" title="Zoom Out" tabindex="21" data-l10n-id="zoom_out">
                    <span data-l10n-id="zoom_out_label">Zoom Out</span>
                  </button>
                  <div class="splitToolbarButtonSeparator"></div>
                  <button id="zoomIn" class="toolbarButton zoomIn" title="Zoom In" tabindex="22" data-l10n-id="zoom_in">
                    <span data-l10n-id="zoom_in_label">Zoom In</span>
                   </button>
                </div>
                <span id="scaleSelectContainer" class="dropdownToolbarButton">
                  <select id="scaleSelect" title="Zoom" tabindex="23" data-l10n-id="zoom">
                    <option id="pageAutoOption" title="" value="auto" selected="selected" data-l10n-id="page_scale_auto">Automatic Zoom</option>
                    <option id="pageActualOption" title="" value="page-actual" data-l10n-id="page_scale_actual">Actual Size</option>
                    <option id="pageFitOption" title="" value="page-fit" data-l10n-id="page_scale_fit">Page Fit</option>
                    <option id="pageWidthOption" title="" value="page-width" data-l10n-id="page_scale_width">Page Width</option>
                    <option id="customScaleOption" title="" value="custom" disabled="disabled" hidden="true"></option>
                    <option title="" value="0.5" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 50 }'>50%</option>
                    <option title="" value="0.75" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 75 }'>75%</option>
                    <option title="" value="1" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 100 }'>100%</option>
                    <option title="" value="1.25" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 125 }'>125%</option>
                    <option title="" value="1.5" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 150 }'>150%</option>
                    <option title="" value="2" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 200 }'>200%</option>
                    <option title="" value="3" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 300 }'>300%</option>
                    <option title="" value="4" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 400 }'>400%</option>
                  </select>
                </span>
              </div>
            </div>
            <div id="loadingBar">
              <div class="progress">
                <div class="glimmer">
                </div>
              </div>
            </div>
          </div>
        </form>

        <menu type="context" id="viewerContextMenu">
          <menuitem id="contextFirstPage" label="First Page"
                    data-l10n-id="first_page"></menuitem>
          <menuitem id="contextLastPage" label="Last Page"
                    data-l10n-id="last_page"></menuitem>
          <menuitem id="contextPageRotateCw" label="Rotate Clockwise"
                    data-l10n-id="page_rotate_cw"></menuitem>
          <menuitem id="contextPageRotateCcw" label="Rotate Counter-Clockwise"
                    data-l10n-id="page_rotate_ccw"></menuitem>
        </menu>

        <div id="viewerContainer" tabindex="0">
          <div id="viewer" class="pdfViewer"></div>
        </div>

        <div id="errorWrapper" hidden='true'>
          <div id="errorMessageLeft">
            <span id="errorMessage"></span>
            <button id="errorShowMore" data-l10n-id="error_more_info">
              More Information
            </button>
            <button id="errorShowLess" data-l10n-id="error_less_info" hidden='true'>
              Less Information
            </button>
          </div>
          <div id="errorMessageRight">
            <button id="errorClose" data-l10n-id="error_close">
              Close
            </button>
          </div>
          <div class="clearBoth"></div>
          <textarea id="errorMoreInfo" hidden='true' readonly="readonly"></textarea>
        </div>
      </div> <!-- mainContainer -->

      <div id="overlayContainer" class="hidden">
        <!-- CHANGE 3 -->
        <form id="passwordOverlay" class="container hidden">
          <div class="dialog">
            <div class="row">
              <p id="passwordText" data-l10n-id="password_label">Enter the password to open this PDF file:</p>
            </div>
            <div class="row">
              <!-- CHANGE 4 -->
              <input type="password" id="password" class="toolbarField" autocomplete="off">
            </div>
            <div class="buttonRow">
              <button id="passwordCancel" class="overlayButton"><span data-l10n-id="password_cancel">Cancel</span></button>
              <button id="passwordSubmit" class="overlayButton"><span data-l10n-id="password_ok">OK</span></button>
            </div>
          </div>
        </form>
        <div id="documentPropertiesOverlay" class="container hidden">
          <div class="dialog">
            <div class="row">
              <span data-l10n-id="document_properties_file_name">File name:</span> <p id="fileNameField">-</p>
            </div>
            <div class="row">
              <span data-l10n-id="document_properties_file_size">File size:</span> <p id="fileSizeField">-</p>
            </div>
            <div class="separator"></div>
            <div class="row">
              <span data-l10n-id="document_properties_title">Title:</span> <p id="titleField">-</p>
            </div>
            <div class="row">
              <span data-l10n-id="document_properties_author">Author:</span> <p id="authorField">-</p>
            </div>
            <div class="row">
              <span data-l10n-id="document_properties_subject">Subject:</span> <p id="subjectField">-</p>
            </div>
            <div class="row">
              <span data-l10n-id="document_properties_keywords">Keywords:</span> <p id="keywordsField">-</p>
            </div>
            <div class="row">
              <span data-l10n-id="document_properties_creation_date">Creation Date:</span> <p id="creationDateField">-</p>
            </div>
            <div class="row">
              <span data-l10n-id="document_properties_modification_date">Modification Date:</span> <p id="modificationDateField">-</p>
            </div>
            <div class="row">
              <span data-l10n-id="document_properties_creator">Creator:</span> <p id="creatorField">-</p>
            </div>
            <div class="separator"></div>
            <div class="row">
              <span data-l10n-id="document_properties_producer">PDF Producer:</span> <p id="producerField">-</p>
            </div>
            <div class="row">
              <span data-l10n-id="document_properties_version">PDF Version:</span> <p id="versionField">-</p>
            </div>
            <div class="row">
              <span data-l10n-id="document_properties_page_count">Page Count:</span> <p id="pageCountField">-</p>
            </div>
            <div class="row">
              <span data-l10n-id="document_properties_page_size">Page Size:</span> <p id="pageSizeField">-</p>
            </div>
            <div class="separator"></div>
            <div class="row">
              <span data-l10n-id="document_properties_linearized">Fast Web View:</span> <p id="linearizedField">-</p>
            </div>
            <div class="buttonRow">
              <button id="documentPropertiesClose" class="overlayButton"><span data-l10n-id="document_properties_close">Close</span></button>
            </div>
          </div>
        </div>
        <div id="printServiceOverlay" class="container hidden">
          <div class="dialog">
            <div class="row">
              <span data-l10n-id="print_progress_message">Preparing document for printingâ€¦</span>
            </div>
            <div class="row">
              <progress value="0" max="100"></progress>
              <span data-l10n-id="print_progress_percent" data-l10n-args='{ "progress": 0 }' class="relative-progress">0%</span>
            </div>
            <div class="buttonRow">
              <button id="printCancel" class="overlayButton"><span data-l10n-id="print_progress_close">Cancel</span></button>
            </div>
          </div>
        </div>
      </div>  <!-- overlayContainer -->

    </div> <!-- outerContainer -->
    <div id="printContainer"></div>
  </body>
</html>

/**
 * @author Radek LiÅ¡ka <ing.radek.liska@gmail.com>
 * @author Vladislav UrbÃ¡nek <urbanek.vlada@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @file Customized file from pdfjs-dist@2.1.266
 * Changes:
 * - CHANGE 1: We have disabled any access to the localStorage
 *   to prevent the Ki-Wi Player data loss
 *   and also to prevent the restoring of the last page
 *   on the viewer startup.
 * - CHANGE 2: We have deactivated the access to the Fullscreen API.
 *   The viewer is acting like it already has the fullscreen activated.
 *   The fullscreen can be invoked only by an user action
 *   and there is no interacting user in a signage application.
 * - CHANGE 4: We have added the "PDFViewerApplicationError" event.
 *   This event replaces the original error reporting to the GUI
 *   and receives the same data.
 * - CHANGE 5: We have disabled all the non-necessary console logs.
 * - CHANGE 6: We have removed the origin check to support the file protocol.
 *   appearing after the early presentation mode activation.
 * - CHANGE 7: We have added the check for `_currentScaleValue` to allow
 *   the activation of the fullscreen as soon as possible without an error.
 * - CHANGE 8: We have removed references to `.map` files, which won't work after changes.
 * - CHANGE 9: We have removed the password prompt
 *   and replaced it with the "PDFViewerApplicationPassword" event.
 * - CHANGE 10 We have changed the dispatch function to emit all the events in the DOM.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

/**
 * @licstart The following is the entire license notice for the
 * Javascript code in this page
 *
 * Copyright 2018 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.
 *
 * @licend The above is the entire license notice for the
 * Javascript code in this page
 */

// CHANGE 1
(function () {
  var proto = localStorage.__proto__;
  var noop = function () {};
  var notFound = function () {return null;};
  proto.clear = noop;
  proto.getItem = notFound;
  proto.key = notFound;
  proto.removeItem = noop;
  proto.setItem = noop;
})();

/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__webpack_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__webpack_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __webpack_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__webpack_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


;
var pdfjsWebApp, pdfjsWebAppOptions;
{
  pdfjsWebApp = __webpack_require__(1);
  pdfjsWebAppOptions = __webpack_require__(12);
}
;
{
  __webpack_require__(37);
}
;
{
  __webpack_require__(42);
}

function getViewerConfiguration() {
  return {
    appContainer: document.body,
    mainContainer: document.getElementById('viewerContainer'),
    viewerContainer: document.getElementById('viewer'),
    eventBus: null,
    toolbar: {
      container: document.getElementById('toolbarViewer'),
      numPages: document.getElementById('numPages'),
      pageNumber: document.getElementById('pageNumber'),
      scaleSelectContainer: document.getElementById('scaleSelectContainer'),
      scaleSelect: document.getElementById('scaleSelect'),
      customScaleOption: document.getElementById('customScaleOption'),
      previous: document.getElementById('previous'),
      next: document.getElementById('next'),
      zoomIn: document.getElementById('zoomIn'),
      zoomOut: document.getElementById('zoomOut'),
      viewFind: document.getElementById('viewFind'),
      openFile: document.getElementById('openFile'),
      print: document.getElementById('print'),
      presentationModeButton: document.getElementById('presentationMode'),
      download: document.getElementById('download'),
      viewBookmark: document.getElementById('viewBookmark')
    },
    secondaryToolbar: {
      toolbar: document.getElementById('secondaryToolbar'),
      toggleButton: document.getElementById('secondaryToolbarToggle'),
      toolbarButtonContainer: document.getElementById('secondaryToolbarButtonContainer'),
      presentationModeButton: document.getElementById('secondaryPresentationMode'),
      openFileButton: document.getElementById('secondaryOpenFile'),
      printButton: document.getElementById('secondaryPrint'),
      downloadButton: document.getElementById('secondaryDownload'),
      viewBookmarkButton: document.getElementById('secondaryViewBookmark'),
      firstPageButton: document.getElementById('firstPage'),
      lastPageButton: document.getElementById('lastPage'),
      pageRotateCwButton: document.getElementById('pageRotateCw'),
      pageRotateCcwButton: document.getElementById('pageRotateCcw'),
      cursorSelectToolButton: document.getElementById('cursorSelectTool'),
      cursorHandToolButton: document.getElementById('cursorHandTool'),
      scrollVerticalButton: document.getElementById('scrollVertical'),
      scrollHorizontalButton: document.getElementById('scrollHorizontal'),
      scrollWrappedButton: document.getElementById('scrollWrapped'),
      spreadNoneButton: document.getElementById('spreadNone'),
      spreadOddButton: document.getElementById('spreadOdd'),
      spreadEvenButton: document.getElementById('spreadEven'),
      documentPropertiesButton: document.getElementById('documentProperties')
    },
    fullscreen: {
      contextFirstPage: document.getElementById('contextFirstPage'),
      contextLastPage: document.getElementById('contextLastPage'),
      contextPageRotateCw: document.getElementById('contextPageRotateCw'),
      contextPageRotateCcw: document.getElementById('contextPageRotateCcw')
    },
    sidebar: {
      outerContainer: document.getElementById('outerContainer'),
      viewerContainer: document.getElementById('viewerContainer'),
      toggleButton: document.getElementById('sidebarToggle'),
      thumbnailButton: document.getElementById('viewThumbnail'),
      outlineButton: document.getElementById('viewOutline'),
      attachmentsButton: document.getElementById('viewAttachments'),
      thumbnailView: document.getElementById('thumbnailView'),
      outlineView: document.getElementById('outlineView'),
      attachmentsView: document.getElementById('attachmentsView')
    },
    sidebarResizer: {
      outerContainer: document.getElementById('outerContainer'),
      resizer: document.getElementById('sidebarResizer')
    },
    findBar: {
      bar: document.getElementById('findbar'),
      toggleButton: document.getElementById('viewFind'),
      findField: document.getElementById('findInput'),
      highlightAllCheckbox: document.getElementById('findHighlightAll'),
      caseSensitiveCheckbox: document.getElementById('findMatchCase'),
      entireWordCheckbox: document.getElementById('findEntireWord'),
      findMsg: document.getElementById('findMsg'),
      findResultsCount: document.getElementById('findResultsCount'),
      findPreviousButton: document.getElementById('findPrevious'),
      findNextButton: document.getElementById('findNext')
    },
    passwordOverlay: {
      overlayName: 'passwordOverlay',
      container: document.getElementById('passwordOverlay'),
      label: document.getElementById('passwordText'),
      input: document.getElementById('password'),
      submitButton: document.getElementById('passwordSubmit'),
      cancelButton: document.getElementById('passwordCancel')
    },
    documentProperties: {
      overlayName: 'documentPropertiesOverlay',
      container: document.getElementById('documentPropertiesOverlay'),
      closeButton: document.getElementById('documentPropertiesClose'),
      fields: {
        'fileName': document.getElementById('fileNameField'),
        'fileSize': document.getElementById('fileSizeField'),
        'title': document.getElementById('titleField'),
        'author': document.getElementById('authorField'),
        'subject': document.getElementById('subjectField'),
        'keywords': document.getElementById('keywordsField'),
        'creationDate': document.getElementById('creationDateField'),
        'modificationDate': document.getElementById('modificationDateField'),
        'creator': document.getElementById('creatorField'),
        'producer': document.getElementById('producerField'),
        'version': document.getElementById('versionField'),
        'pageCount': document.getElementById('pageCountField'),
        'pageSize': document.getElementById('pageSizeField'),
        'linearized': document.getElementById('linearizedField')
      }
    },
    errorWrapper: {
      container: document.getElementById('errorWrapper'),
      errorMessage: document.getElementById('errorMessage'),
      closeButton: document.getElementById('errorClose'),
      errorMoreInfo: document.getElementById('errorMoreInfo'),
      moreInfoButton: document.getElementById('errorShowMore'),
      lessInfoButton: document.getElementById('errorShowLess')
    },
    printContainer: document.getElementById('printContainer'),
    openFileInputName: 'fileInput',
    debuggerScriptPath: './debugger.js'
  };
}

function webViewerLoad() {
  var config = getViewerConfiguration();
  window.PDFViewerApplication = pdfjsWebApp.PDFViewerApplication;
  window.PDFViewerApplicationOptions = pdfjsWebAppOptions.AppOptions;
  var event = document.createEvent('CustomEvent');
  event.initCustomEvent('webviewerloaded', true, true, {});
  document.dispatchEvent(event);
  pdfjsWebApp.PDFViewerApplication.run(config);
}

if (document.readyState === 'interactive' || document.readyState === 'complete') {
  webViewerLoad();
} else {
  document.addEventListener('DOMContentLoaded', webViewerLoad, true);
}

/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFPrintServiceFactory = exports.DefaultExternalServices = exports.PDFViewerApplication = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(2));

var _ui_utils = __webpack_require__(6);

var _pdfjsLib = __webpack_require__(7);

var _pdf_cursor_tools = __webpack_require__(8);

var _pdf_rendering_queue = __webpack_require__(10);

var _pdf_sidebar = __webpack_require__(11);

var _app_options = __webpack_require__(12);

var _overlay_manager = __webpack_require__(14);

var _password_prompt = __webpack_require__(15);

var _pdf_attachment_viewer = __webpack_require__(16);

var _pdf_document_properties = __webpack_require__(17);

var _pdf_find_bar = __webpack_require__(18);

var _pdf_find_controller = __webpack_require__(19);

var _pdf_history = __webpack_require__(21);

var _pdf_link_service = __webpack_require__(22);

var _pdf_outline_viewer = __webpack_require__(23);

var _pdf_presentation_mode = __webpack_require__(24);

var _pdf_sidebar_resizer = __webpack_require__(25);

var _pdf_thumbnail_viewer = __webpack_require__(26);

var _pdf_viewer = __webpack_require__(28);

var _secondary_toolbar = __webpack_require__(33);

var _toolbar = __webpack_require__(35);

var _view_history = __webpack_require__(36);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var DEFAULT_SCALE_DELTA = 1.1;
var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;
var FORCE_PAGES_LOADED_TIMEOUT = 10000;
var WHEEL_ZOOM_DISABLED_TIMEOUT = 1000;
var ViewOnLoad = {
  UNKNOWN: -1,
  PREVIOUS: 0,
  INITIAL: 1
};
var DefaultExternalServices = {
  updateFindControlState: function updateFindControlState(data) {},
  updateFindMatchesCount: function updateFindMatchesCount(data) {},
  initPassiveLoading: function initPassiveLoading(callbacks) {},
  fallback: function fallback(data, callback) {},
  reportTelemetry: function reportTelemetry(data) {},
  createDownloadManager: function createDownloadManager(options) {
    throw new Error('Not implemented: createDownloadManager');
  },
  createPreferences: function createPreferences() {
    throw new Error('Not implemented: createPreferences');
  },
  createL10n: function createL10n(options) {
    throw new Error('Not implemented: createL10n');
  },
  supportsIntegratedFind: false,
  supportsDocumentFonts: true,
  supportsDocumentColors: true,
  supportedMouseWheelZoomModifierKeys: {
    ctrlKey: true,
    metaKey: true
  }
};
exports.DefaultExternalServices = DefaultExternalServices;
var PDFViewerApplication = {
  initialBookmark: document.location.hash.substring(1),
  initialized: false,
  fellback: false,
  appConfig: null,
  pdfDocument: null,
  pdfLoadingTask: null,
  printService: null,
  pdfViewer: null,
  pdfThumbnailViewer: null,
  pdfRenderingQueue: null,
  pdfPresentationMode: null,
  pdfDocumentProperties: null,
  pdfLinkService: null,
  pdfHistory: null,
  pdfSidebar: null,
  pdfSidebarResizer: null,
  pdfOutlineViewer: null,
  pdfAttachmentViewer: null,
  pdfCursorTools: null,
  store: null,
  downloadManager: null,
  overlayManager: null,
  preferences: null,
  toolbar: null,
  secondaryToolbar: null,
  eventBus: null,
  l10n: null,
  isInitialViewSet: false,
  downloadComplete: false,
  isViewerEmbedded: window.parent !== window,
  url: '',
  baseUrl: '',
  externalServices: DefaultExternalServices,
  _boundEvents: {},
  contentDispositionFilename: null,
  initialize: function () {
    var _initialize = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee(appConfig) {
      var _this = this;

      var appContainer;
      return _regenerator.default.wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              this.preferences = this.externalServices.createPreferences();
              this.appConfig = appConfig;
              _context.next = 4;
              return this._readPreferences();

            case 4:
              _context.next = 6;
              return this._parseHashParameters();

            case 6:
              _context.next = 8;
              return this._initializeL10n();

            case 8:
              if (this.isViewerEmbedded && _app_options.AppOptions.get('externalLinkTarget') === _pdfjsLib.LinkTarget.NONE) {
                _app_options.AppOptions.set('externalLinkTarget', _pdfjsLib.LinkTarget.TOP);
              }

              _context.next = 11;
              return this._initializeViewerComponents();

            case 11:
              this.bindEvents();
              this.bindWindowEvents();
              appContainer = appConfig.appContainer || document.documentElement;
              this.l10n.translate(appContainer).then(function () {
                _this.eventBus.dispatch('localized', {
                  source: _this
                });
              });
              this.initialized = true;

            case 16:
            case "end":
              return _context.stop();
          }
        }
      }, _callee, this);
    }));

    function initialize(_x) {
      return _initialize.apply(this, arguments);
    }

    return initialize;
  }(),
  _readPreferences: function () {
    var _readPreferences2 = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee2() {
      var prefs, name;
      return _regenerator.default.wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              if (!(_app_options.AppOptions.get('disablePreferences') === true)) {
                _context2.next = 2;
                break;
              }

              return _context2.abrupt("return");

            case 2:
              _context2.prev = 2;
              _context2.next = 5;
              return this.preferences.getAll();

            case 5:
              prefs = _context2.sent;

              for (name in prefs) {
                _app_options.AppOptions.set(name, prefs[name]);
              }

              _context2.next = 11;
              break;

            case 9:
              _context2.prev = 9;
              _context2.t0 = _context2["catch"](2);

            case 11:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2, this, [[2, 9]]);
    }));

    function _readPreferences() {
      return _readPreferences2.apply(this, arguments);
    }

    return _readPreferences;
  }(),
  _parseHashParameters: function () {
    var _parseHashParameters2 = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee3() {
      var waitOn, hash, hashParams, viewer, enabled;
      return _regenerator.default.wrap(function _callee3$(_context3) {
        while (1) {
          switch (_context3.prev = _context3.next) {
            case 0:
              if (_app_options.AppOptions.get('pdfBugEnabled')) {
                _context3.next = 2;
                break;
              }

              return _context3.abrupt("return");

            case 2:
              waitOn = [];
              hash = document.location.hash.substring(1);
              hashParams = (0, _ui_utils.parseQueryString)(hash);

              if ('disableworker' in hashParams && hashParams['disableworker'] === 'true') {
                waitOn.push(loadFakeWorker());
              }

              if ('disablerange' in hashParams) {
                _app_options.AppOptions.set('disableRange', hashParams['disablerange'] === 'true');
              }

              if ('disablestream' in hashParams) {
                _app_options.AppOptions.set('disableStream', hashParams['disablestream'] === 'true');
              }

              if ('disableautofetch' in hashParams) {
                _app_options.AppOptions.set('disableAutoFetch', hashParams['disableautofetch'] === 'true');
              }

              if ('disablefontface' in hashParams) {
                _app_options.AppOptions.set('disableFontFace', hashParams['disablefontface'] === 'true');
              }

              if ('disablehistory' in hashParams) {
                _app_options.AppOptions.set('disableHistory', hashParams['disablehistory'] === 'true');
              }

              if ('webgl' in hashParams) {
                _app_options.AppOptions.set('enableWebGL', hashParams['webgl'] === 'true');
              }

              if ('useonlycsszoom' in hashParams) {
                _app_options.AppOptions.set('useOnlyCssZoom', hashParams['useonlycsszoom'] === 'true');
              }

              if ('verbosity' in hashParams) {
                _app_options.AppOptions.set('verbosity', hashParams['verbosity'] | 0);
              }

              if (!('textlayer' in hashParams)) {
                _context3.next = 23;
                break;
              }

              _context3.t0 = hashParams['textlayer'];
              _context3.next = _context3.t0 === 'off' ? 18 : _context3.t0 === 'visible' ? 20 : _context3.t0 === 'shadow' ? 20 : _context3.t0 === 'hover' ? 20 : 23;
              break;

            case 18:
              _app_options.AppOptions.set('textLayerMode', _ui_utils.TextLayerMode.DISABLE);

              return _context3.abrupt("break", 23);

            case 20:
              viewer = this.appConfig.viewerContainer;
              viewer.classList.add('textLayer-' + hashParams['textlayer']);
              return _context3.abrupt("break", 23);

            case 23:
              if ('pdfbug' in hashParams) {
                _app_options.AppOptions.set('pdfBug', true);

                enabled = hashParams['pdfbug'].split(',');
                waitOn.push(loadAndEnablePDFBug(enabled));
              }

              if ('locale' in hashParams) {
                _app_options.AppOptions.set('locale', hashParams['locale']);
              }

              return _context3.abrupt("return", Promise.all(waitOn).catch(function (reason) {
                console.error("_parseHashParameters: \"".concat(reason.message, "\"."));
              }));

            case 26:
            case "end":
              return _context3.stop();
          }
        }
      }, _callee3, this);
    }));

    function _parseHashParameters() {
      return _parseHashParameters2.apply(this, arguments);
    }

    return _parseHashParameters;
  }(),
  _initializeL10n: function () {
    var _initializeL10n2 = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee4() {
      var dir;
      return _regenerator.default.wrap(function _callee4$(_context4) {
        while (1) {
          switch (_context4.prev = _context4.next) {
            case 0:
              this.l10n = this.externalServices.createL10n({
                locale: _app_options.AppOptions.get('locale')
              });
              _context4.next = 3;
              return this.l10n.getDirection();

            case 3:
              dir = _context4.sent;
              document.getElementsByTagName('html')[0].dir = dir;

            case 5:
            case "end":
              return _context4.stop();
          }
        }
      }, _callee4, this);
    }));

    function _initializeL10n() {
      return _initializeL10n2.apply(this, arguments);
    }

    return _initializeL10n;
  }(),
  _initializeViewerComponents: function () {
    var _initializeViewerComponents2 = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee5() {
      var appConfig, dispatchToDOM, eventBus, pdfRenderingQueue, pdfLinkService, downloadManager, findController, container, viewer, thumbnailContainer, sidebarConfig;
      return _regenerator.default.wrap(function _callee5$(_context5) {
        while (1) {
          switch (_context5.prev = _context5.next) {
            case 0:
              appConfig = this.appConfig;
              this.overlayManager = new _overlay_manager.OverlayManager();
              dispatchToDOM = _app_options.AppOptions.get('eventBusDispatchToDOM');
              eventBus = appConfig.eventBus || (0, _ui_utils.getGlobalEventBus)(dispatchToDOM);
              this.eventBus = eventBus;
              pdfRenderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();
              pdfRenderingQueue.onIdle = this.cleanup.bind(this);
              this.pdfRenderingQueue = pdfRenderingQueue;
              pdfLinkService = new _pdf_link_service.PDFLinkService({
                eventBus: eventBus,
                externalLinkTarget: _app_options.AppOptions.get('externalLinkTarget'),
                externalLinkRel: _app_options.AppOptions.get('externalLinkRel')
              });
              this.pdfLinkService = pdfLinkService;
              downloadManager = this.externalServices.createDownloadManager({
                disableCreateObjectURL: _app_options.AppOptions.get('disableCreateObjectURL')
              });
              this.downloadManager = downloadManager;
              findController = new _pdf_find_controller.PDFFindController({
                linkService: pdfLinkService,
                eventBus: eventBus
              });
              this.findController = findController;
              container = appConfig.mainContainer;
              viewer = appConfig.viewerContainer;
              this.pdfViewer = new _pdf_viewer.PDFViewer({
                container: container,
                viewer: viewer,
                eventBus: eventBus,
                renderingQueue: pdfRenderingQueue,
                linkService: pdfLinkService,
                downloadManager: downloadManager,
                findController: findController,
                renderer: _app_options.AppOptions.get('renderer'),
                enableWebGL: _app_options.AppOptions.get('enableWebGL'),
                l10n: this.l10n,
                textLayerMode: _app_options.AppOptions.get('textLayerMode'),
                imageResourcesPath: _app_options.AppOptions.get('imageResourcesPath'),
                renderInteractiveForms: _app_options.AppOptions.get('renderInteractiveForms'),
                enablePrintAutoRotate: _app_options.AppOptions.get('enablePrintAutoRotate'),
                useOnlyCssZoom: _app_options.AppOptions.get('useOnlyCssZoom'),
                maxCanvasPixels: _app_options.AppOptions.get('maxCanvasPixels')
              });
              pdfRenderingQueue.setViewer(this.pdfViewer);
              pdfLinkService.setViewer(this.pdfViewer);
              thumbnailContainer = appConfig.sidebar.thumbnailView;
              this.pdfThumbnailViewer = new _pdf_thumbnail_viewer.PDFThumbnailViewer({
                container: thumbnailContainer,
                renderingQueue: pdfRenderingQueue,
                linkService: pdfLinkService,
                l10n: this.l10n
              });
              pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);
              this.pdfHistory = new _pdf_history.PDFHistory({
                linkService: pdfLinkService,
                eventBus: eventBus
              });
              pdfLinkService.setHistory(this.pdfHistory);
              this.findBar = new _pdf_find_bar.PDFFindBar(appConfig.findBar, eventBus, this.l10n);
              this.pdfDocumentProperties = new _pdf_document_properties.PDFDocumentProperties(appConfig.documentProperties, this.overlayManager, eventBus, this.l10n);
              this.pdfCursorTools = new _pdf_cursor_tools.PDFCursorTools({
                container: container,
                eventBus: eventBus,
                cursorToolOnLoad: _app_options.AppOptions.get('cursorToolOnLoad')
              });
              this.toolbar = new _toolbar.Toolbar(appConfig.toolbar, eventBus, this.l10n);
              this.secondaryToolbar = new _secondary_toolbar.SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus);

              if (this.supportsFullscreen) {
                this.pdfPresentationMode = new _pdf_presentation_mode.PDFPresentationMode({
                  container: container,
                  viewer: viewer,
                  pdfViewer: this.pdfViewer,
                  eventBus: eventBus,
                  contextMenuItems: appConfig.fullscreen
                });
              }

              this.passwordPrompt = new _password_prompt.PasswordPrompt(appConfig.passwordOverlay, this.overlayManager, this.l10n);
              this.pdfOutlineViewer = new _pdf_outline_viewer.PDFOutlineViewer({
                container: appConfig.sidebar.outlineView,
                eventBus: eventBus,
                linkService: pdfLinkService
              });
              this.pdfAttachmentViewer = new _pdf_attachment_viewer.PDFAttachmentViewer({
                container: appConfig.sidebar.attachmentsView,
                eventBus: eventBus,
                downloadManager: downloadManager
              });
              sidebarConfig = Object.create(appConfig.sidebar);
              sidebarConfig.pdfViewer = this.pdfViewer;
              sidebarConfig.pdfThumbnailViewer = this.pdfThumbnailViewer;
              this.pdfSidebar = new _pdf_sidebar.PDFSidebar(sidebarConfig, eventBus, this.l10n);
              this.pdfSidebar.onToggled = this.forceRendering.bind(this);
              this.pdfSidebarResizer = new _pdf_sidebar_resizer.PDFSidebarResizer(appConfig.sidebarResizer, eventBus, this.l10n);

            case 39:
            case "end":
              return _context5.stop();
          }
        }
      }, _callee5, this);
    }));

    function _initializeViewerComponents() {
      return _initializeViewerComponents2.apply(this, arguments);
    }

    return _initializeViewerComponents;
  }(),
  run: function run(config) {
    this.initialize(config).then(webViewerInitialized);
  },
  zoomIn: function zoomIn(ticks) {
    var newScale = this.pdfViewer.currentScale;

    do {
      newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);
      newScale = Math.ceil(newScale * 10) / 10;
      newScale = Math.min(_ui_utils.MAX_SCALE, newScale);
    } while (--ticks > 0 && newScale < _ui_utils.MAX_SCALE);

    this.pdfViewer.currentScaleValue = newScale;
  },
  zoomOut: function zoomOut(ticks) {
    var newScale = this.pdfViewer.currentScale;

    do {
      newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);
      newScale = Math.floor(newScale * 10) / 10;
      newScale = Math.max(_ui_utils.MIN_SCALE, newScale);
    } while (--ticks > 0 && newScale > _ui_utils.MIN_SCALE);

    this.pdfViewer.currentScaleValue = newScale;
  },

  get pagesCount() {
    return this.pdfDocument ? this.pdfDocument.numPages : 0;
  },

  set page(val) {
    this.pdfViewer.currentPageNumber = val;
  },

  get page() {
    return this.pdfViewer.currentPageNumber;
  },

  get printing() {
    return !!this.printService;
  },

  get supportsPrinting() {
    return PDFPrintServiceFactory.instance.supportsPrinting;
  },

  get supportsFullscreen() {
    // CHANGE 2
    // var support;
    // var doc = document.documentElement;
    // support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || doc.webkitRequestFullScreen || doc.msRequestFullscreen);
    // if (document.fullscreenEnabled === false || document.mozFullScreenEnabled === false || document.webkitFullscreenEnabled === false || document.msFullscreenEnabled === false) {
    //   support = false;
    // }
    // return (0, _pdfjsLib.shadow)(this, 'supportsFullscreen', support);
    // CHANGE 2
    return true;
  },

  get supportsIntegratedFind() {
    return this.externalServices.supportsIntegratedFind;
  },

  get supportsDocumentFonts() {
    return this.externalServices.supportsDocumentFonts;
  },

  get supportsDocumentColors() {
    return this.externalServices.supportsDocumentColors;
  },

  get loadingBar() {
    var bar = new _ui_utils.ProgressBar('#loadingBar');
    return (0, _pdfjsLib.shadow)(this, 'loadingBar', bar);
  },

  get supportedMouseWheelZoomModifierKeys() {
    return this.externalServices.supportedMouseWheelZoomModifierKeys;
  },

  initPassiveLoading: function initPassiveLoading() {
    throw new Error('Not implemented: initPassiveLoading');
  },
  setTitleUsingUrl: function setTitleUsingUrl() {
    var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
    this.url = url;
    this.baseUrl = url.split('#')[0];
    var title = (0, _ui_utils.getPDFFileNameFromURL)(url, '');

    if (!title) {
      try {
        title = decodeURIComponent((0, _pdfjsLib.getFilenameFromUrl)(url)) || url;
      } catch (ex) {
        title = url;
      }
    }

    this.setTitle(title);
  },
  setTitle: function setTitle(title) {
    if (this.isViewerEmbedded) {
      return;
    }

    document.title = title;
  },
  close: function () {
    var _close = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee6() {
      var errorWrapper, promise;
      return _regenerator.default.wrap(function _callee6$(_context6) {
        while (1) {
          switch (_context6.prev = _context6.next) {
            case 0:
              errorWrapper = this.appConfig.errorWrapper.container;
              errorWrapper.setAttribute('hidden', 'true');

              if (this.pdfLoadingTask) {
                _context6.next = 4;
                break;
              }

              return _context6.abrupt("return");

            case 4:
              promise = this.pdfLoadingTask.destroy();
              this.pdfLoadingTask = null;

              if (this.pdfDocument) {
                this.pdfDocument = null;
                this.pdfThumbnailViewer.setDocument(null);
                this.pdfViewer.setDocument(null);
                this.pdfLinkService.setDocument(null);
                this.pdfDocumentProperties.setDocument(null);
              }

              this.store = null;
              this.isInitialViewSet = false;
              this.downloadComplete = false;
              this.url = '';
              this.baseUrl = '';
              this.contentDispositionFilename = null;
              this.pdfSidebar.reset();
              this.pdfOutlineViewer.reset();
              this.pdfAttachmentViewer.reset();
              this.findBar.reset();
              this.toolbar.reset();
              this.secondaryToolbar.reset();

              if (typeof PDFBug !== 'undefined') {
                PDFBug.cleanup();
              }

              return _context6.abrupt("return", promise);

            case 21:
            case "end":
              return _context6.stop();
          }
        }
      }, _callee6, this);
    }));

    function close() {
      return _close.apply(this, arguments);
    }

    return close;
  }(),
  open: function () {
    var _open = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee7(file, args) {
      var _this2 = this;

      var workerParameters, key, parameters, apiParameters, _key, prop, loadingTask;

      return _regenerator.default.wrap(function _callee7$(_context7) {
        while (1) {
          switch (_context7.prev = _context7.next) {
            case 0:
              if (!this.pdfLoadingTask) {
                _context7.next = 3;
                break;
              }

              _context7.next = 3;
              return this.close();

            case 3:
              workerParameters = _app_options.AppOptions.getAll('worker');

              for (key in workerParameters) {
                _pdfjsLib.GlobalWorkerOptions[key] = workerParameters[key];
              }

              parameters = Object.create(null);

              if (typeof file === 'string') {
                this.setTitleUsingUrl(file);
                parameters.url = file;
              } else if (file && 'byteLength' in file) {
                parameters.data = file;
              } else if (file.url && file.originalUrl) {
                this.setTitleUsingUrl(file.originalUrl);
                parameters.url = file.url;
              }

              apiParameters = _app_options.AppOptions.getAll('api');

              for (_key in apiParameters) {
                parameters[_key] = apiParameters[_key];
              }

              if (args) {
                for (prop in args) {
                  if (prop === 'length') {
                    this.pdfDocumentProperties.setFileSize(args[prop]);
                  }

                  parameters[prop] = args[prop];
                }
              }

              loadingTask = (0, _pdfjsLib.getDocument)(parameters);
              this.pdfLoadingTask = loadingTask;

              loadingTask.onPassword = function (updateCallback, reason) {
                // CHANGE 9
                // _this2.passwordPrompt.setUpdateCallback(updateCallback, reason);
                // _this2.passwordPrompt.open();
                // CHANGE 9
                var event = new CustomEvent('PDFViewerApplicationPassword');
                document.dispatchEvent(event);
              };

              loadingTask.onProgress = function (_ref) {
                var loaded = _ref.loaded,
                    total = _ref.total;

                _this2.progress(loaded / total);
              };

              loadingTask.onUnsupportedFeature = this.fallback.bind(this);
              return _context7.abrupt("return", loadingTask.promise.then(function (pdfDocument) {
                _this2.load(pdfDocument);
              }, function (exception) {
                if (loadingTask !== _this2.pdfLoadingTask) {
                  return;
                }

                var message = exception && exception.message;
                var loadingErrorMessage;

                if (exception instanceof _pdfjsLib.InvalidPDFException) {
                  loadingErrorMessage = _this2.l10n.get('invalid_file_error', null, 'Invalid or corrupted PDF file.');
                } else if (exception instanceof _pdfjsLib.MissingPDFException) {
                  loadingErrorMessage = _this2.l10n.get('missing_file_error', null, 'Missing PDF file.');
                } else if (exception instanceof _pdfjsLib.UnexpectedResponseException) {
                  loadingErrorMessage = _this2.l10n.get('unexpected_response_error', null, 'Unexpected server response.');
                } else {
                  loadingErrorMessage = _this2.l10n.get('loading_error', null, 'An error occurred while loading the PDF.');
                }

                return loadingErrorMessage.then(function (msg) {
                  _this2.error(msg, {
                    message: message
                  });

                  throw new Error(msg);
                });
              }));

            case 16:
            case "end":
              return _context7.stop();
          }
        }
      }, _callee7, this);
    }));

    function open(_x2, _x3) {
      return _open.apply(this, arguments);
    }

    return open;
  }(),
  download: function download() {
    var _this3 = this;

    function downloadByUrl() {
      downloadManager.downloadUrl(url, filename);
    }

    var url = this.baseUrl;
    var filename = this.contentDispositionFilename || (0, _ui_utils.getPDFFileNameFromURL)(this.url);
    var downloadManager = this.downloadManager;

    downloadManager.onerror = function (err) {
      _this3.error("PDF failed to download: ".concat(err));
    };

    if (!this.pdfDocument || !this.downloadComplete) {
      downloadByUrl();
      return;
    }

    this.pdfDocument.getData().then(function (data) {
      var blob = new Blob([data], {
        type: 'application/pdf'
      });
      downloadManager.download(blob, url, filename);
    }).catch(downloadByUrl);
  },
  fallback: function fallback(featureId) {},
  error: function error(message, moreInfo) {
    // CHANGE 4
    var event = new CustomEvent('PDFViewerApplicationError', {detail: {message: message, moreInfo: moreInfo}});
    document.dispatchEvent(event);
    var moreInfoText = [this.l10n.get('error_version_info', {
      version: _pdfjsLib.version || '?',
      build: _pdfjsLib.build || '?'
    }, 'PDF.js v{{version}} (build: {{build}})')];

    if (moreInfo) {
      moreInfoText.push(this.l10n.get('error_message', {
        message: moreInfo.message
      }, 'Message: {{message}}'));

      if (moreInfo.stack) {
        moreInfoText.push(this.l10n.get('error_stack', {
          stack: moreInfo.stack
        }, 'Stack: {{stack}}'));
      } else {
        if (moreInfo.filename) {
          moreInfoText.push(this.l10n.get('error_file', {
            file: moreInfo.filename
          }, 'File: {{file}}'));
        }

        if (moreInfo.lineNumber) {
          moreInfoText.push(this.l10n.get('error_line', {
            line: moreInfo.lineNumber
          }, 'Line: {{line}}'));
        }
      }
    }

    var errorWrapperConfig = this.appConfig.errorWrapper;
    var errorWrapper = errorWrapperConfig.container;
    errorWrapper.removeAttribute('hidden');
    var errorMessage = errorWrapperConfig.errorMessage;
    errorMessage.textContent = message;
    var closeButton = errorWrapperConfig.closeButton;

    closeButton.onclick = function () {
      errorWrapper.setAttribute('hidden', 'true');
    };

    var errorMoreInfo = errorWrapperConfig.errorMoreInfo;
    var moreInfoButton = errorWrapperConfig.moreInfoButton;
    var lessInfoButton = errorWrapperConfig.lessInfoButton;

    moreInfoButton.onclick = function () {
      errorMoreInfo.removeAttribute('hidden');
      moreInfoButton.setAttribute('hidden', 'true');
      lessInfoButton.removeAttribute('hidden');
      errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';
    };

    lessInfoButton.onclick = function () {
      errorMoreInfo.setAttribute('hidden', 'true');
      moreInfoButton.removeAttribute('hidden');
      lessInfoButton.setAttribute('hidden', 'true');
    };

    moreInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;
    lessInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;
    closeButton.oncontextmenu = _ui_utils.noContextMenuHandler;
    moreInfoButton.removeAttribute('hidden');
    lessInfoButton.setAttribute('hidden', 'true');
    Promise.all(moreInfoText).then(function (parts) {
      errorMoreInfo.value = parts.join('\n');
    });
  },
  progress: function progress(level) {
    var _this4 = this;

    if (this.downloadComplete) {
      return;
    }

    var percent = Math.round(level * 100);

    if (percent > this.loadingBar.percent || isNaN(percent)) {
      this.loadingBar.percent = percent;
      var disableAutoFetch = this.pdfDocument ? this.pdfDocument.loadingParams['disableAutoFetch'] : _app_options.AppOptions.get('disableAutoFetch');

      if (disableAutoFetch && percent) {
        if (this.disableAutoFetchLoadingBarTimeout) {
          clearTimeout(this.disableAutoFetchLoadingBarTimeout);
          this.disableAutoFetchLoadingBarTimeout = null;
        }

        this.loadingBar.show();
        this.disableAutoFetchLoadingBarTimeout = setTimeout(function () {
          _this4.loadingBar.hide();

          _this4.disableAutoFetchLoadingBarTimeout = null;
        }, DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);
      }
    }
  },
  load: function load(pdfDocument) {
    var _this5 = this;

    this.pdfDocument = pdfDocument;
    pdfDocument.getDownloadInfo().then(function () {
      _this5.downloadComplete = true;

      _this5.loadingBar.hide();

      firstPagePromise.then(function () {
        _this5.eventBus.dispatch('documentloaded', {
          source: _this5
        });
      });
    });
    var pageModePromise = pdfDocument.getPageMode().catch(function () {});
    var openActionDestPromise = pdfDocument.getOpenActionDestination().catch(function () {});
    this.toolbar.setPagesCount(pdfDocument.numPages, false);
    this.secondaryToolbar.setPagesCount(pdfDocument.numPages);
    var store = this.store = new _view_history.ViewHistory(pdfDocument.fingerprint);
    var baseDocumentUrl;
    baseDocumentUrl = null;
    this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl);
    this.pdfDocumentProperties.setDocument(pdfDocument, this.url);
    var pdfViewer = this.pdfViewer;
    pdfViewer.setDocument(pdfDocument);
    var firstPagePromise = pdfViewer.firstPagePromise;
    var pagesPromise = pdfViewer.pagesPromise;
    var onePageRendered = pdfViewer.onePageRendered;
    var pdfThumbnailViewer = this.pdfThumbnailViewer;
    pdfThumbnailViewer.setDocument(pdfDocument);
    firstPagePromise.then(function (pdfPage) {
      _this5.loadingBar.setWidth(_this5.appConfig.viewerContainer);

      var storePromise = store.getMultiple({
        page: null,
        zoom: _ui_utils.DEFAULT_SCALE_VALUE,
        scrollLeft: '0',
        scrollTop: '0',
        rotation: null,
        sidebarView: _pdf_sidebar.SidebarView.UNKNOWN,
        scrollMode: _ui_utils.ScrollMode.UNKNOWN,
        spreadMode: _ui_utils.SpreadMode.UNKNOWN
      }).catch(function () {});
      Promise.all([storePromise, pageModePromise, openActionDestPromise]).then(
      /*#__PURE__*/
      function () {
        var _ref3 = _asyncToGenerator(
        /*#__PURE__*/
        _regenerator.default.mark(function _callee8(_ref2) {
          var _ref4, _ref4$, values, pageMode, openActionDest, viewOnLoad, initialBookmark, zoom, hash, rotation, sidebarView, scrollMode, spreadMode;

          return _regenerator.default.wrap(function _callee8$(_context8) {
            while (1) {
              switch (_context8.prev = _context8.next) {
                case 0:
                  _ref4 = _slicedToArray(_ref2, 3), _ref4$ = _ref4[0], values = _ref4$ === void 0 ? {} : _ref4$, pageMode = _ref4[1], openActionDest = _ref4[2];
                  viewOnLoad = _app_options.AppOptions.get('viewOnLoad');

                  _this5._initializePdfHistory({
                    fingerprint: pdfDocument.fingerprint,
                    viewOnLoad: viewOnLoad,
                    initialDest: openActionDest
                  });

                  initialBookmark = _this5.initialBookmark;
                  zoom = _app_options.AppOptions.get('defaultZoomValue');
                  hash = zoom ? "zoom=".concat(zoom) : null;
                  rotation = null;
                  sidebarView = _app_options.AppOptions.get('sidebarViewOnLoad');
                  scrollMode = _app_options.AppOptions.get('scrollModeOnLoad');
                  spreadMode = _app_options.AppOptions.get('spreadModeOnLoad');

                  if (values.page && viewOnLoad !== ViewOnLoad.INITIAL) {
                    hash = "page=".concat(values.page, "&zoom=").concat(zoom || values.zoom, ",") + "".concat(values.scrollLeft, ",").concat(values.scrollTop);
                    rotation = parseInt(values.rotation, 10);

                    if (sidebarView === _pdf_sidebar.SidebarView.UNKNOWN) {
                      sidebarView = values.sidebarView | 0;
                    }

                    if (scrollMode === _ui_utils.ScrollMode.UNKNOWN) {
                      scrollMode = values.scrollMode | 0;
                    }

                    if (spreadMode === _ui_utils.SpreadMode.UNKNOWN) {
                      spreadMode = values.spreadMode | 0;
                    }
                  }

                  if (pageMode && sidebarView === _pdf_sidebar.SidebarView.UNKNOWN) {
                    sidebarView = apiPageModeToSidebarView(pageMode);
                  }

                  _this5.setInitialView(hash, {
                    rotation: rotation,
                    sidebarView: sidebarView,
                    scrollMode: scrollMode,
                    spreadMode: spreadMode
                  });

                  _this5.eventBus.dispatch('documentinit', {
                    source: _this5
                  });

                  if (!_this5.isViewerEmbedded) {
                    pdfViewer.focus();
                  }

                  _context8.next = 17;
                  return Promise.race([pagesPromise, new Promise(function (resolve) {
                    setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT);
                  })]);

                case 17:
                  if (!(!initialBookmark && !hash)) {
                    _context8.next = 19;
                    break;
                  }

                  return _context8.abrupt("return");

                case 19:
                  if (!pdfViewer.hasEqualPageSizes) {
                    _context8.next = 21;
                    break;
                  }

                  return _context8.abrupt("return");

                case 21:
                  _this5.initialBookmark = initialBookmark;
                  pdfViewer.currentScaleValue = pdfViewer.currentScaleValue;

                  _this5.setInitialView(hash);

                case 24:
                case "end":
                  return _context8.stop();
              }
            }
          }, _callee8, this);
        }));

        return function (_x4) {
          return _ref3.apply(this, arguments);
        };
      }()).catch(function () {
        _this5.setInitialView();
      }).then(function () {
        pdfViewer.update();
      });
    });
    pdfDocument.getPageLabels().then(function (labels) {
      if (!labels || _app_options.AppOptions.get('disablePageLabels')) {
        return;
      }

      var i = 0,
          numLabels = labels.length;

      if (numLabels !== _this5.pagesCount) {
        console.error('The number of Page Labels does not match ' + 'the number of pages in the document.');
        return;
      }

      while (i < numLabels && labels[i] === (i + 1).toString()) {
        i++;
      }

      if (i === numLabels) {
        return;
      }

      pdfViewer.setPageLabels(labels);
      pdfThumbnailViewer.setPageLabels(labels);

      _this5.toolbar.setPagesCount(pdfDocument.numPages, true);

      _this5.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);
    });
    pagesPromise.then(function () {
      if (!_this5.supportsPrinting) {
        return;
      }

      pdfDocument.getJavaScript().then(function (javaScript) {
        if (!javaScript) {
          return;
        }

        javaScript.some(function (js) {
          if (!js) {
            return false;
          }

          console.warn('Warning: JavaScript is not supported');

          _this5.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.javaScript);

          return true;
        });
        var regex = /\bprint\s*\(/;

        for (var i = 0, ii = javaScript.length; i < ii; i++) {
          var js = javaScript[i];

          if (js && regex.test(js)) {
            setTimeout(function () {
              window.print();
            });
            return;
          }
        }
      });
    });
    Promise.all([onePageRendered, _ui_utils.animationStarted]).then(function () {
      pdfDocument.getOutline().then(function (outline) {
        _this5.pdfOutlineViewer.render({
          outline: outline
        });
      });
      pdfDocument.getAttachments().then(function (attachments) {
        _this5.pdfAttachmentViewer.render({
          attachments: attachments
        });
      });
    });
    pdfDocument.getMetadata().then(function (_ref5) {
      var info = _ref5.info,
          metadata = _ref5.metadata,
          contentDispositionFilename = _ref5.contentDispositionFilename;
      _this5.documentInfo = info;
      _this5.metadata = metadata;
      _this5.contentDispositionFilename = contentDispositionFilename;
      // CHANGE 5
      // console.log('PDF ' + pdfDocument.fingerprint + ' [' + info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() + ' / ' + (info.Creator || '-').trim() + ']' + ' (PDF.js: ' + (_pdfjsLib.version || '-') + (_app_options.AppOptions.get('enableWebGL') ? ' [WebGL]' : '') + ')');
      var pdfTitle;

      if (metadata && metadata.has('dc:title')) {
        var title = metadata.get('dc:title');

        if (title !== 'Untitled') {
          pdfTitle = title;
        }
      }

      if (!pdfTitle && info && info['Title']) {
        pdfTitle = info['Title'];
      }

      if (pdfTitle) {
        _this5.setTitle("".concat(pdfTitle, " - ").concat(contentDispositionFilename || document.title));
      } else if (contentDispositionFilename) {
        _this5.setTitle(contentDispositionFilename);
      }

      if (info.IsAcroFormPresent) {
        console.warn('Warning: AcroForm/XFA is not supported');

        _this5.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.forms);
      }
    });
  },
  _initializePdfHistory: function _initializePdfHistory(_ref6) {
    var fingerprint = _ref6.fingerprint,
        viewOnLoad = _ref6.viewOnLoad,
        _ref6$initialDest = _ref6.initialDest,
        initialDest = _ref6$initialDest === void 0 ? null : _ref6$initialDest;

    if (_app_options.AppOptions.get('disableHistory') || this.isViewerEmbedded) {
      return;
    }

    this.pdfHistory.initialize({
      fingerprint: fingerprint,
      resetHistory: viewOnLoad === ViewOnLoad.INITIAL,
      updateUrl: _app_options.AppOptions.get('historyUpdateUrl')
    });

    if (this.pdfHistory.initialBookmark) {
      this.initialBookmark = this.pdfHistory.initialBookmark;
      this.initialRotation = this.pdfHistory.initialRotation;
    }

    if (initialDest && !this.initialBookmark && viewOnLoad === ViewOnLoad.UNKNOWN) {
      this.initialBookmark = JSON.stringify(initialDest);
      this.pdfHistory.push({
        explicitDest: initialDest,
        pageNumber: null
      });
    }
  },
  setInitialView: function setInitialView(storedHash) {
    var _this6 = this;

    var _ref7 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
        rotation = _ref7.rotation,
        sidebarView = _ref7.sidebarView,
        scrollMode = _ref7.scrollMode,
        spreadMode = _ref7.spreadMode;

    var setRotation = function setRotation(angle) {
      if ((0, _ui_utils.isValidRotation)(angle)) {
        _this6.pdfViewer.pagesRotation = angle;
      }
    };

    var setViewerModes = function setViewerModes(scroll, spread) {
      if ((0, _ui_utils.isValidScrollMode)(scroll)) {
        _this6.pdfViewer.scrollMode = scroll;
      }

      if ((0, _ui_utils.isValidSpreadMode)(spread)) {
        _this6.pdfViewer.spreadMode = spread;
      }
    };

    this.isInitialViewSet = true;
    this.pdfSidebar.setInitialView(sidebarView);
    setViewerModes(scrollMode, spreadMode);

    if (this.initialBookmark) {
      setRotation(this.initialRotation);
      delete this.initialRotation;
      this.pdfLinkService.setHash(this.initialBookmark);
      this.initialBookmark = null;
    } else if (storedHash) {
      setRotation(rotation);
      this.pdfLinkService.setHash(storedHash);
    }

    this.toolbar.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel);
    this.secondaryToolbar.setPageNumber(this.pdfViewer.currentPageNumber);

    if (!this.pdfViewer.currentScaleValue) {
      this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;
    }
  },
  cleanup: function cleanup() {
    if (!this.pdfDocument) {
      return;
    }

    this.pdfViewer.cleanup();
    this.pdfThumbnailViewer.cleanup();

    if (this.pdfViewer.renderer !== _ui_utils.RendererType.SVG) {
      this.pdfDocument.cleanup();
    }
  },
  forceRendering: function forceRendering() {
    this.pdfRenderingQueue.printing = this.printing;
    this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar.isThumbnailViewVisible;
    this.pdfRenderingQueue.renderHighestPriority();
  },
  beforePrint: function beforePrint() {
    var _this7 = this;

    if (this.printService) {
      return;
    }

    if (!this.supportsPrinting) {
      this.l10n.get('printing_not_supported', null, 'Warning: Printing is not fully supported by ' + 'this browser.').then(function (printMessage) {
        _this7.error(printMessage);
      });
      return;
    }

    if (!this.pdfViewer.pageViewsReady) {
      this.l10n.get('printing_not_ready', null, 'Warning: The PDF is not fully loaded for printing.').then(function (notReadyMessage) {
        window.alert(notReadyMessage);
      });
      return;
    }

    var pagesOverview = this.pdfViewer.getPagesOverview();
    var printContainer = this.appConfig.printContainer;
    var printService = PDFPrintServiceFactory.instance.createPrintService(this.pdfDocument, pagesOverview, printContainer, this.l10n);
    this.printService = printService;
    this.forceRendering();
    printService.layout();
  },
  afterPrint: function pdfViewSetupAfterPrint() {
    if (this.printService) {
      this.printService.destroy();
      this.printService = null;
    }

    this.forceRendering();
  },
  rotatePages: function rotatePages(delta) {
    if (!this.pdfDocument) {
      return;
    }

    var newRotation = (this.pdfViewer.pagesRotation + 360 + delta) % 360;
    this.pdfViewer.pagesRotation = newRotation;
  },
  requestPresentationMode: function requestPresentationMode() {
    if (!this.pdfPresentationMode) {
      return;
    }

    this.pdfPresentationMode.request();
  },
  bindEvents: function bindEvents() {
    var eventBus = this.eventBus,
        _boundEvents = this._boundEvents;
    _boundEvents.beforePrint = this.beforePrint.bind(this);
    _boundEvents.afterPrint = this.afterPrint.bind(this);
    eventBus.on('resize', webViewerResize);
    eventBus.on('hashchange', webViewerHashchange);
    eventBus.on('beforeprint', _boundEvents.beforePrint);
    eventBus.on('afterprint', _boundEvents.afterPrint);
    eventBus.on('pagerendered', webViewerPageRendered);
    eventBus.on('textlayerrendered', webViewerTextLayerRendered);
    eventBus.on('updateviewarea', webViewerUpdateViewarea);
    eventBus.on('pagechanging', webViewerPageChanging);
    eventBus.on('scalechanging', webViewerScaleChanging);
    eventBus.on('rotationchanging', webViewerRotationChanging);
    eventBus.on('sidebarviewchanged', webViewerSidebarViewChanged);
    eventBus.on('pagemode', webViewerPageMode);
    eventBus.on('namedaction', webViewerNamedAction);
    eventBus.on('presentationmodechanged', webViewerPresentationModeChanged);
    eventBus.on('presentationmode', webViewerPresentationMode);
    eventBus.on('openfile', webViewerOpenFile);
    eventBus.on('print', webViewerPrint);
    eventBus.on('download', webViewerDownload);
    eventBus.on('firstpage', webViewerFirstPage);
    eventBus.on('lastpage', webViewerLastPage);
    eventBus.on('nextpage', webViewerNextPage);
    eventBus.on('previouspage', webViewerPreviousPage);
    eventBus.on('zoomin', webViewerZoomIn);
    eventBus.on('zoomout', webViewerZoomOut);
    eventBus.on('pagenumberchanged', webViewerPageNumberChanged);
    eventBus.on('scalechanged', webViewerScaleChanged);
    eventBus.on('rotatecw', webViewerRotateCw);
    eventBus.on('rotateccw', webViewerRotateCcw);
    eventBus.on('switchscrollmode', webViewerSwitchScrollMode);
    eventBus.on('scrollmodechanged', webViewerScrollModeChanged);
    eventBus.on('switchspreadmode', webViewerSwitchSpreadMode);
    eventBus.on('spreadmodechanged', webViewerSpreadModeChanged);
    eventBus.on('documentproperties', webViewerDocumentProperties);
    eventBus.on('find', webViewerFind);
    eventBus.on('findfromurlhash', webViewerFindFromUrlHash);
    eventBus.on('updatefindmatchescount', webViewerUpdateFindMatchesCount);
    eventBus.on('updatefindcontrolstate', webViewerUpdateFindControlState);
    eventBus.on('fileinputchange', webViewerFileInputChange);
  },
  bindWindowEvents: function bindWindowEvents() {
    var eventBus = this.eventBus,
        _boundEvents = this._boundEvents;

    _boundEvents.windowResize = function () {
      eventBus.dispatch('resize', {
        source: window
      });
    };

    _boundEvents.windowHashChange = function () {
      eventBus.dispatch('hashchange', {
        source: window,
        hash: document.location.hash.substring(1)
      });
    };

    _boundEvents.windowBeforePrint = function () {
      eventBus.dispatch('beforeprint', {
        source: window
      });
    };

    _boundEvents.windowAfterPrint = function () {
      eventBus.dispatch('afterprint', {
        source: window
      });
    };

    window.addEventListener('visibilitychange', webViewerVisibilityChange);
    window.addEventListener('wheel', webViewerWheel);
    window.addEventListener('click', webViewerClick);
    window.addEventListener('keydown', webViewerKeyDown);
    window.addEventListener('resize', _boundEvents.windowResize);
    window.addEventListener('hashchange', _boundEvents.windowHashChange);
    window.addEventListener('beforeprint', _boundEvents.windowBeforePrint);
    window.addEventListener('afterprint', _boundEvents.windowAfterPrint);
  },
  unbindEvents: function unbindEvents() {
    var eventBus = this.eventBus,
        _boundEvents = this._boundEvents;
    eventBus.off('resize', webViewerResize);
    eventBus.off('hashchange', webViewerHashchange);
    eventBus.off('beforeprint', _boundEvents.beforePrint);
    eventBus.off('afterprint', _boundEvents.afterPrint);
    eventBus.off('pagerendered', webViewerPageRendered);
    eventBus.off('textlayerrendered', webViewerTextLayerRendered);
    eventBus.off('updateviewarea', webViewerUpdateViewarea);
    eventBus.off('pagechanging', webViewerPageChanging);
    eventBus.off('scalechanging', webViewerScaleChanging);
    eventBus.off('rotationchanging', webViewerRotationChanging);
    eventBus.off('sidebarviewchanged', webViewerSidebarViewChanged);
    eventBus.off('pagemode', webViewerPageMode);
    eventBus.off('namedaction', webViewerNamedAction);
    eventBus.off('presentationmodechanged', webViewerPresentationModeChanged);
    eventBus.off('presentationmode', webViewerPresentationMode);
    eventBus.off('openfile', webViewerOpenFile);
    eventBus.off('print', webViewerPrint);
    eventBus.off('download', webViewerDownload);
    eventBus.off('firstpage', webViewerFirstPage);
    eventBus.off('lastpage', webViewerLastPage);
    eventBus.off('nextpage', webViewerNextPage);
    eventBus.off('previouspage', webViewerPreviousPage);
    eventBus.off('zoomin', webViewerZoomIn);
    eventBus.off('zoomout', webViewerZoomOut);
    eventBus.off('pagenumberchanged', webViewerPageNumberChanged);
    eventBus.off('scalechanged', webViewerScaleChanged);
    eventBus.off('rotatecw', webViewerRotateCw);
    eventBus.off('rotateccw', webViewerRotateCcw);
    eventBus.off('switchscrollmode', webViewerSwitchScrollMode);
    eventBus.off('scrollmodechanged', webViewerScrollModeChanged);
    eventBus.off('switchspreadmode', webViewerSwitchSpreadMode);
    eventBus.off('spreadmodechanged', webViewerSpreadModeChanged);
    eventBus.off('documentproperties', webViewerDocumentProperties);
    eventBus.off('find', webViewerFind);
    eventBus.off('findfromurlhash', webViewerFindFromUrlHash);
    eventBus.off('updatefindmatchescount', webViewerUpdateFindMatchesCount);
    eventBus.off('updatefindcontrolstate', webViewerUpdateFindControlState);
    eventBus.off('fileinputchange', webViewerFileInputChange);
    _boundEvents.beforePrint = null;
    _boundEvents.afterPrint = null;
  },
  unbindWindowEvents: function unbindWindowEvents() {
    var _boundEvents = this._boundEvents;
    window.removeEventListener('visibilitychange', webViewerVisibilityChange);
    window.removeEventListener('wheel', webViewerWheel);
    window.removeEventListener('click', webViewerClick);
    window.removeEventListener('keydown', webViewerKeyDown);
    window.removeEventListener('resize', _boundEvents.windowResize);
    window.removeEventListener('hashchange', _boundEvents.windowHashChange);
    window.removeEventListener('beforeprint', _boundEvents.windowBeforePrint);
    window.removeEventListener('afterprint', _boundEvents.windowAfterPrint);
    _boundEvents.windowResize = null;
    _boundEvents.windowHashChange = null;
    _boundEvents.windowBeforePrint = null;
    _boundEvents.windowAfterPrint = null;
  }
};
exports.PDFViewerApplication = PDFViewerApplication;
var validateFileURL;
{
  var HOSTED_VIEWER_ORIGINS = ['null', 'http://mozilla.github.io', 'https://mozilla.github.io'];

  validateFileURL = function validateFileURL(file) {
    if (file === undefined) {
      return;
    }

    try {
      var viewerOrigin = new _pdfjsLib.URL(window.location.href).origin || 'null';

      if (HOSTED_VIEWER_ORIGINS.includes(viewerOrigin)) {
        return;
      }

      var _ref8 = new _pdfjsLib.URL(file, window.location.href),
          origin = _ref8.origin,
          protocol = _ref8.protocol;

      if (origin !== viewerOrigin && protocol !== 'blob:') {
        // CHANGE 6
        // throw new Error('file origin does not match viewer\'s');
      }
    } catch (ex) {
      var message = ex && ex.message;
      PDFViewerApplication.l10n.get('loading_error', null, 'An error occurred while loading the PDF.').then(function (loadingErrorMessage) {
        PDFViewerApplication.error(loadingErrorMessage, {
          message: message
        });
      });
      throw ex;
    }
  };
}

function loadFakeWorker() {
  if (!_pdfjsLib.GlobalWorkerOptions.workerSrc) {
    _pdfjsLib.GlobalWorkerOptions.workerSrc = _app_options.AppOptions.get('workerSrc');
  }

  return (0, _pdfjsLib.loadScript)(_pdfjsLib.PDFWorker.getWorkerSrc());
}

function loadAndEnablePDFBug(enabledTabs) {
  var appConfig = PDFViewerApplication.appConfig;
  return (0, _pdfjsLib.loadScript)(appConfig.debuggerScriptPath).then(function () {
    PDFBug.enable(enabledTabs);
    PDFBug.init({
      OPS: _pdfjsLib.OPS,
      createObjectURL: _pdfjsLib.createObjectURL
    }, appConfig.mainContainer);
  });
}

function webViewerInitialized() {
  var appConfig = PDFViewerApplication.appConfig;
  var file;
  var queryString = document.location.search.substring(1);
  var params = (0, _ui_utils.parseQueryString)(queryString);
  file = 'file' in params ? params.file : _app_options.AppOptions.get('defaultUrl');
  validateFileURL(file);
  var fileInput = document.createElement('input');
  fileInput.id = appConfig.openFileInputName;
  fileInput.className = 'fileInput';
  fileInput.setAttribute('type', 'file');
  fileInput.oncontextmenu = _ui_utils.noContextMenuHandler;
  document.body.appendChild(fileInput);

  if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
    appConfig.toolbar.openFile.setAttribute('hidden', 'true');
    appConfig.secondaryToolbar.openFileButton.setAttribute('hidden', 'true');
  } else {
    fileInput.value = null;
  }

  fileInput.addEventListener('change', function (evt) {
    var files = evt.target.files;

    if (!files || files.length === 0) {
      return;
    }

    PDFViewerApplication.eventBus.dispatch('fileinputchange', {
      source: this,
      fileInput: evt.target
    });
  });
  appConfig.mainContainer.addEventListener('dragover', function (evt) {
    evt.preventDefault();
    evt.dataTransfer.dropEffect = 'move';
  });
  appConfig.mainContainer.addEventListener('drop', function (evt) {
    evt.preventDefault();
    var files = evt.dataTransfer.files;

    if (!files || files.length === 0) {
      return;
    }

    PDFViewerApplication.eventBus.dispatch('fileinputchange', {
      source: this,
      fileInput: evt.dataTransfer
    });
  });

  if (!PDFViewerApplication.supportsPrinting) {
    appConfig.toolbar.print.classList.add('hidden');
    appConfig.secondaryToolbar.printButton.classList.add('hidden');
  }

  if (!PDFViewerApplication.supportsFullscreen) {
    appConfig.toolbar.presentationModeButton.classList.add('hidden');
    appConfig.secondaryToolbar.presentationModeButton.classList.add('hidden');
  }

  if (PDFViewerApplication.supportsIntegratedFind) {
    appConfig.toolbar.viewFind.classList.add('hidden');
  }

  appConfig.mainContainer.addEventListener('transitionend', function (evt) {
    if (evt.target === this) {
      PDFViewerApplication.eventBus.dispatch('resize', {
        source: this
      });
    }
  }, true);
  appConfig.sidebar.toggleButton.addEventListener('click', function () {
    PDFViewerApplication.pdfSidebar.toggle();
  });

  try {
    webViewerOpenFileViaURL(file);
  } catch (reason) {
    PDFViewerApplication.l10n.get('loading_error', null, 'An error occurred while loading the PDF.').then(function (msg) {
      PDFViewerApplication.error(msg, reason);
    });
  }
}

var webViewerOpenFileViaURL;
{
  webViewerOpenFileViaURL = function webViewerOpenFileViaURL(file) {
    if (file && file.lastIndexOf('file:', 0) === 0) {
      PDFViewerApplication.setTitleUsingUrl(file);
      var xhr = new XMLHttpRequest();

      xhr.onload = function () {
        PDFViewerApplication.open(new Uint8Array(xhr.response));
      };

      xhr.open('GET', file);
      xhr.responseType = 'arraybuffer';
      xhr.send();
      return;
    }

    if (file) {
      PDFViewerApplication.open(file);
    }
  };
}

function webViewerPageRendered(evt) {
  var pageNumber = evt.pageNumber;
  var pageIndex = pageNumber - 1;
  var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);

  if (pageNumber === PDFViewerApplication.page) {
    PDFViewerApplication.toolbar.updateLoadingIndicatorState(false);
  }

  if (!pageView) {
    return;
  }

  if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {
    var thumbnailView = PDFViewerApplication.pdfThumbnailViewer.getThumbnail(pageIndex);
    thumbnailView.setImage(pageView);
  }

  if (typeof Stats !== 'undefined' && Stats.enabled && pageView.stats) {
    Stats.add(pageNumber, pageView.stats);
  }

  if (pageView.error) {
    PDFViewerApplication.l10n.get('rendering_error', null, 'An error occurred while rendering the page.').then(function (msg) {
      PDFViewerApplication.error(msg, pageView.error);
    });
  }
}

function webViewerTextLayerRendered(evt) {}

function webViewerPageMode(evt) {
  var mode = evt.mode,
      view;

  switch (mode) {
    case 'thumbs':
      view = _pdf_sidebar.SidebarView.THUMBS;
      break;

    case 'bookmarks':
    case 'outline':
      view = _pdf_sidebar.SidebarView.OUTLINE;
      break;

    case 'attachments':
      view = _pdf_sidebar.SidebarView.ATTACHMENTS;
      break;

    case 'none':
      view = _pdf_sidebar.SidebarView.NONE;
      break;

    default:
      console.error('Invalid "pagemode" hash parameter: ' + mode);
      return;
  }

  PDFViewerApplication.pdfSidebar.switchView(view, true);
}

function webViewerNamedAction(evt) {
  var action = evt.action;

  switch (action) {
    case 'GoToPage':
      PDFViewerApplication.appConfig.toolbar.pageNumber.select();
      break;

    case 'Find':
      if (!PDFViewerApplication.supportsIntegratedFind) {
        PDFViewerApplication.findBar.toggle();
      }

      break;
  }
}

function webViewerPresentationModeChanged(evt) {
  var active = evt.active,
      switchInProgress = evt.switchInProgress;
  PDFViewerApplication.pdfViewer.presentationModeState = switchInProgress ? _ui_utils.PresentationModeState.CHANGING : active ? _ui_utils.PresentationModeState.FULLSCREEN : _ui_utils.PresentationModeState.NORMAL;
}

function webViewerSidebarViewChanged(evt) {
  PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled = PDFViewerApplication.pdfSidebar.isThumbnailViewVisible;
  var store = PDFViewerApplication.store;

  if (store && PDFViewerApplication.isInitialViewSet) {
    store.set('sidebarView', evt.view).catch(function () {});
  }
}

function webViewerUpdateViewarea(evt) {
  var location = evt.location,
      store = PDFViewerApplication.store;

  if (store && PDFViewerApplication.isInitialViewSet) {
    store.setMultiple({
      'page': location.pageNumber,
      'zoom': location.scale,
      'scrollLeft': location.left,
      'scrollTop': location.top,
      'rotation': location.rotation
    }).catch(function () {});
  }

  var href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams);
  PDFViewerApplication.appConfig.toolbar.viewBookmark.href = href;
  PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href = href;
  var currentPage = PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1);
  var loading = currentPage.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED;
  PDFViewerApplication.toolbar.updateLoadingIndicatorState(loading);
}

function webViewerScrollModeChanged(evt) {
  var store = PDFViewerApplication.store;

  if (store && PDFViewerApplication.isInitialViewSet) {
    store.set('scrollMode', evt.mode).catch(function () {});
  }
}

function webViewerSpreadModeChanged(evt) {
  var store = PDFViewerApplication.store;

  if (store && PDFViewerApplication.isInitialViewSet) {
    store.set('spreadMode', evt.mode).catch(function () {});
  }
}

function webViewerResize() {
  var pdfDocument = PDFViewerApplication.pdfDocument,
      pdfViewer = PDFViewerApplication.pdfViewer;

  if (!pdfDocument) {
    return;
  }

  var currentScaleValue = pdfViewer.currentScaleValue;

  if (currentScaleValue === 'auto' || currentScaleValue === 'page-fit' || currentScaleValue === 'page-width') {
    pdfViewer.currentScaleValue = currentScaleValue;
  }

  pdfViewer.update();
}

function webViewerHashchange(evt) {
  var hash = evt.hash;

  if (!hash) {
    return;
  }

  if (!PDFViewerApplication.isInitialViewSet) {
    PDFViewerApplication.initialBookmark = hash;
  } else if (!PDFViewerApplication.pdfHistory.popStateInProgress) {
    PDFViewerApplication.pdfLinkService.setHash(hash);
  }
}

var webViewerFileInputChange;
{
  webViewerFileInputChange = function webViewerFileInputChange(evt) {
    if (PDFViewerApplication.pdfViewer && PDFViewerApplication.pdfViewer.isInPresentationMode) {
      return;
    }

    var file = evt.fileInput.files[0];

    if (_pdfjsLib.URL.createObjectURL && !_app_options.AppOptions.get('disableCreateObjectURL')) {
      var url = _pdfjsLib.URL.createObjectURL(file);

      if (file.name) {
        url = {
          url: url,
          originalUrl: file.name
        };
      }

      PDFViewerApplication.open(url);
    } else {
      PDFViewerApplication.setTitleUsingUrl(file.name);
      var fileReader = new FileReader();

      fileReader.onload = function webViewerChangeFileReaderOnload(evt) {
        var buffer = evt.target.result;
        PDFViewerApplication.open(new Uint8Array(buffer));
      };

      fileReader.readAsArrayBuffer(file);
    }

    var appConfig = PDFViewerApplication.appConfig;
    appConfig.toolbar.viewBookmark.setAttribute('hidden', 'true');
    appConfig.secondaryToolbar.viewBookmarkButton.setAttribute('hidden', 'true');
    appConfig.toolbar.download.setAttribute('hidden', 'true');
    appConfig.secondaryToolbar.downloadButton.setAttribute('hidden', 'true');
  };
}

function webViewerPresentationMode() {
  PDFViewerApplication.requestPresentationMode();
}

function webViewerOpenFile() {
  var openFileInputName = PDFViewerApplication.appConfig.openFileInputName;
  document.getElementById(openFileInputName).click();
}

function webViewerPrint() {
  window.print();
}

function webViewerDownload() {
  PDFViewerApplication.download();
}

function webViewerFirstPage() {
  if (PDFViewerApplication.pdfDocument) {
    PDFViewerApplication.page = 1;
  }
}

function webViewerLastPage() {
  if (PDFViewerApplication.pdfDocument) {
    PDFViewerApplication.page = PDFViewerApplication.pagesCount;
  }
}

function webViewerNextPage() {
  PDFViewerApplication.page++;
}

function webViewerPreviousPage() {
  PDFViewerApplication.page--;
}

function webViewerZoomIn() {
  PDFViewerApplication.zoomIn();
}

function webViewerZoomOut() {
  PDFViewerApplication.zoomOut();
}

function webViewerPageNumberChanged(evt) {
  var pdfViewer = PDFViewerApplication.pdfViewer;

  if (evt.value !== '') {
    pdfViewer.currentPageLabel = evt.value;
  }

  if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) {
    PDFViewerApplication.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);
  }
}

function webViewerScaleChanged(evt) {
  PDFViewerApplication.pdfViewer.currentScaleValue = evt.value;
}

function webViewerRotateCw() {
  PDFViewerApplication.rotatePages(90);
}

function webViewerRotateCcw() {
  PDFViewerApplication.rotatePages(-90);
}

function webViewerSwitchScrollMode(evt) {
  PDFViewerApplication.pdfViewer.scrollMode = evt.mode;
}

function webViewerSwitchSpreadMode(evt) {
  PDFViewerApplication.pdfViewer.spreadMode = evt.mode;
}

function webViewerDocumentProperties() {
  PDFViewerApplication.pdfDocumentProperties.open();
}

function webViewerFind(evt) {
  PDFViewerApplication.findController.executeCommand('find' + evt.type, {
    query: evt.query,
    phraseSearch: evt.phraseSearch,
    caseSensitive: evt.caseSensitive,
    entireWord: evt.entireWord,
    highlightAll: evt.highlightAll,
    findPrevious: evt.findPrevious
  });
}

function webViewerFindFromUrlHash(evt) {
  PDFViewerApplication.findController.executeCommand('find', {
    query: evt.query,
    phraseSearch: evt.phraseSearch,
    caseSensitive: false,
    entireWord: false,
    highlightAll: true,
    findPrevious: false
  });
}

function webViewerUpdateFindMatchesCount(_ref9) {
  var matchesCount = _ref9.matchesCount;

  if (PDFViewerApplication.supportsIntegratedFind) {
    PDFViewerApplication.externalServices.updateFindMatchesCount(matchesCount);
  } else {
    PDFViewerApplication.findBar.updateResultsCount(matchesCount);
  }
}

function webViewerUpdateFindControlState(_ref10) {
  var state = _ref10.state,
      previous = _ref10.previous,
      matchesCount = _ref10.matchesCount;

  if (PDFViewerApplication.supportsIntegratedFind) {
    PDFViewerApplication.externalServices.updateFindControlState({
      result: state,
      findPrevious: previous,
      matchesCount: matchesCount
    });
  } else {
    PDFViewerApplication.findBar.updateUIState(state, previous, matchesCount);
  }
}

function webViewerScaleChanging(evt) {
  PDFViewerApplication.toolbar.setPageScale(evt.presetValue, evt.scale);
  PDFViewerApplication.pdfViewer.update();
}

function webViewerRotationChanging(evt) {
  PDFViewerApplication.pdfThumbnailViewer.pagesRotation = evt.pagesRotation;
  PDFViewerApplication.forceRendering();
  PDFViewerApplication.pdfViewer.currentPageNumber = evt.pageNumber;
}

function webViewerPageChanging(evt) {
  var page = evt.pageNumber;
  PDFViewerApplication.toolbar.setPageNumber(page, evt.pageLabel || null);
  PDFViewerApplication.secondaryToolbar.setPageNumber(page);

  if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {
    PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page);
  }

  if (typeof Stats !== 'undefined' && Stats.enabled) {
    var pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1);

    if (pageView && pageView.stats) {
      Stats.add(page, pageView.stats);
    }
  }
}

function webViewerVisibilityChange(evt) {
  if (document.visibilityState === 'visible') {
    setZoomDisabledTimeout();
  }
}

var zoomDisabledTimeout = null;

function setZoomDisabledTimeout() {
  if (zoomDisabledTimeout) {
    clearTimeout(zoomDisabledTimeout);
  }

  zoomDisabledTimeout = setTimeout(function () {
    zoomDisabledTimeout = null;
  }, WHEEL_ZOOM_DISABLED_TIMEOUT);
}

function webViewerWheel(evt) {
  var pdfViewer = PDFViewerApplication.pdfViewer;

  if (pdfViewer.isInPresentationMode) {
    return;
  }

  if (evt.ctrlKey || evt.metaKey) {
    var support = PDFViewerApplication.supportedMouseWheelZoomModifierKeys;

    if (evt.ctrlKey && !support.ctrlKey || evt.metaKey && !support.metaKey) {
      return;
    }

    evt.preventDefault();

    if (zoomDisabledTimeout || document.visibilityState === 'hidden') {
      return;
    }

    var previousScale = pdfViewer.currentScale;
    var delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);
    var MOUSE_WHEEL_DELTA_PER_PAGE_SCALE = 3.0;
    var ticks = delta * MOUSE_WHEEL_DELTA_PER_PAGE_SCALE;

    if (ticks < 0) {
      PDFViewerApplication.zoomOut(-ticks);
    } else {
      PDFViewerApplication.zoomIn(ticks);
    }

    var currentScale = pdfViewer.currentScale;

    if (previousScale !== currentScale) {
      var scaleCorrectionFactor = currentScale / previousScale - 1;
      var rect = pdfViewer.container.getBoundingClientRect();
      var dx = evt.clientX - rect.left;
      var dy = evt.clientY - rect.top;
      pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor;
      pdfViewer.container.scrollTop += dy * scaleCorrectionFactor;
    }
  } else {
    setZoomDisabledTimeout();
  }
}

function webViewerClick(evt) {
  if (!PDFViewerApplication.secondaryToolbar.isOpen) {
    return;
  }

  var appConfig = PDFViewerApplication.appConfig;

  if (PDFViewerApplication.pdfViewer.containsElement(evt.target) || appConfig.toolbar.container.contains(evt.target) && evt.target !== appConfig.secondaryToolbar.toggleButton) {
    PDFViewerApplication.secondaryToolbar.close();
  }
}

function webViewerKeyDown(evt) {
  if (PDFViewerApplication.overlayManager.active) {
    return;
  }

  var handled = false,
      ensureViewerFocused = false;
  var cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0);
  var pdfViewer = PDFViewerApplication.pdfViewer;
  var isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode;

  if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {
    switch (evt.keyCode) {
      case 70:
        if (!PDFViewerApplication.supportsIntegratedFind) {
          PDFViewerApplication.findBar.open();
          handled = true;
        }

        break;

      case 71:
        if (!PDFViewerApplication.supportsIntegratedFind) {
          var findState = PDFViewerApplication.findController.state;

          if (findState) {
            PDFViewerApplication.findController.executeCommand('findagain', {
              query: findState.query,
              phraseSearch: findState.phraseSearch,
              caseSensitive: findState.caseSensitive,
              entireWord: findState.entireWord,
              highlightAll: findState.highlightAll,
              findPrevious: cmd === 5 || cmd === 12
            });
          }

          handled = true;
        }

        break;

      case 61:
      case 107:
      case 187:
      case 171:
        if (!isViewerInPresentationMode) {
          PDFViewerApplication.zoomIn();
        }

        handled = true;
        break;

      case 173:
      case 109:
      case 189:
        if (!isViewerInPresentationMode) {
          PDFViewerApplication.zoomOut();
        }

        handled = true;
        break;

      case 48:
      case 96:
        if (!isViewerInPresentationMode) {
          setTimeout(function () {
            pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;
          });
          handled = false;
        }

        break;

      case 38:
        if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {
          PDFViewerApplication.page = 1;
          handled = true;
          ensureViewerFocused = true;
        }

        break;

      case 40:
        if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {
          PDFViewerApplication.page = PDFViewerApplication.pagesCount;
          handled = true;
          ensureViewerFocused = true;
        }

        break;
    }
  }

  if (cmd === 1 || cmd === 8) {
    switch (evt.keyCode) {
      case 83:
        PDFViewerApplication.download();
        handled = true;
        break;
    }
  }

  if (cmd === 3 || cmd === 10) {
    switch (evt.keyCode) {
      case 80:
        PDFViewerApplication.requestPresentationMode();
        handled = true;
        break;

      case 71:
        PDFViewerApplication.appConfig.toolbar.pageNumber.select();
        handled = true;
        break;
    }
  }

  if (handled) {
    if (ensureViewerFocused && !isViewerInPresentationMode) {
      pdfViewer.focus();
    }

    evt.preventDefault();
    return;
  }

  var curElement = document.activeElement || document.querySelector(':focus');
  var curElementTagName = curElement && curElement.tagName.toUpperCase();

  if (curElementTagName === 'INPUT' || curElementTagName === 'TEXTAREA' || curElementTagName === 'SELECT') {
    if (evt.keyCode !== 27) {
      return;
    }
  }

  if (cmd === 0) {
    var turnPage = 0,
        turnOnlyIfPageFit = false;

    switch (evt.keyCode) {
      case 38:
      case 33:
        if (pdfViewer.isVerticalScrollbarEnabled) {
          turnOnlyIfPageFit = true;
        }

        turnPage = -1;
        break;

      case 8:
        if (!isViewerInPresentationMode) {
          turnOnlyIfPageFit = true;
        }

        turnPage = -1;
        break;

      case 37:
        if (pdfViewer.isHorizontalScrollbarEnabled) {
          turnOnlyIfPageFit = true;
        }

      case 75:
      case 80:
        turnPage = -1;
        break;

      case 27:
        if (PDFViewerApplication.secondaryToolbar.isOpen) {
          PDFViewerApplication.secondaryToolbar.close();
          handled = true;
        }

        if (!PDFViewerApplication.supportsIntegratedFind && PDFViewerApplication.findBar.opened) {
          PDFViewerApplication.findBar.close();
          handled = true;
        }

        break;

      case 40:
      case 34:
        if (pdfViewer.isVerticalScrollbarEnabled) {
          turnOnlyIfPageFit = true;
        }

        turnPage = 1;
        break;

      case 13:
      case 32:
        if (!isViewerInPresentationMode) {
          turnOnlyIfPageFit = true;
        }

        turnPage = 1;
        break;

      case 39:
        if (pdfViewer.isHorizontalScrollbarEnabled) {
          turnOnlyIfPageFit = true;
        }

      case 74:
      case 78:
        turnPage = 1;
        break;

      case 36:
        if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {
          PDFViewerApplication.page = 1;
          handled = true;
          ensureViewerFocused = true;
        }

        break;

      case 35:
        if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {
          PDFViewerApplication.page = PDFViewerApplication.pagesCount;
          handled = true;
          ensureViewerFocused = true;
        }

        break;

      case 83:
        PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.SELECT);
        break;

      case 72:
        PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.HAND);
        break;

      case 82:
        PDFViewerApplication.rotatePages(90);
        break;

      case 115:
        PDFViewerApplication.pdfSidebar.toggle();
        break;
    }

    if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === 'page-fit')) {
      if (turnPage > 0) {
        if (PDFViewerApplication.page < PDFViewerApplication.pagesCount) {
          PDFViewerApplication.page++;
        }
      } else {
        if (PDFViewerApplication.page > 1) {
          PDFViewerApplication.page--;
        }
      }

      handled = true;
    }
  }

  if (cmd === 4) {
    switch (evt.keyCode) {
      case 13:
      case 32:
        if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') {
          break;
        }

        if (PDFViewerApplication.page > 1) {
          PDFViewerApplication.page--;
        }

        handled = true;
        break;

      case 82:
        PDFViewerApplication.rotatePages(-90);
        break;
    }
  }

  if (!handled && !isViewerInPresentationMode) {
    if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== 'BUTTON') {
      ensureViewerFocused = true;
    }
  }

  if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) {
    pdfViewer.focus();
  }

  if (handled) {
    evt.preventDefault();
  }
}

function apiPageModeToSidebarView(mode) {
  switch (mode) {
    case 'UseNone':
      return _pdf_sidebar.SidebarView.NONE;

    case 'UseThumbs':
      return _pdf_sidebar.SidebarView.THUMBS;

    case 'UseOutlines':
      return _pdf_sidebar.SidebarView.OUTLINE;

    case 'UseAttachments':
      return _pdf_sidebar.SidebarView.ATTACHMENTS;

    case 'UseOC':
  }

  return _pdf_sidebar.SidebarView.NONE;
}

var PDFPrintServiceFactory = {
  instance: {
    supportsPrinting: false,
    createPrintService: function createPrintService() {
      throw new Error('Not implemented: createPrintService');
    }
  }
};
exports.PDFPrintServiceFactory = PDFPrintServiceFactory;

/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


module.exports = __webpack_require__(3);

/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var g = function () {
  return this || (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self;
}() || Function("return this")();

var hadRuntime = g.regeneratorRuntime && Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
var oldRuntime = hadRuntime && g.regeneratorRuntime;
g.regeneratorRuntime = undefined;
module.exports = __webpack_require__(4);

if (hadRuntime) {
  g.regeneratorRuntime = oldRuntime;
} else {
  try {
    delete g.regeneratorRuntime;
  } catch (e) {
    g.regeneratorRuntime = undefined;
  }
}

/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";
/* WEBPACK VAR INJECTION */(function(module) {

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

!function (global) {
  "use strict";

  var Op = Object.prototype;
  var hasOwn = Op.hasOwnProperty;
  var undefined;
  var $Symbol = typeof Symbol === "function" ? Symbol : {};
  var iteratorSymbol = $Symbol.iterator || "@@iterator";
  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  var inModule = ( false ? undefined : _typeof(module)) === "object";
  var runtime = global.regeneratorRuntime;

  if (runtime) {
    if (inModule) {
      module.exports = runtime;
    }

    return;
  }

  runtime = global.regeneratorRuntime = inModule ? module.exports : {};

  function wrap(innerFn, outerFn, self, tryLocsList) {
    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
    var generator = Object.create(protoGenerator.prototype);
    var context = new Context(tryLocsList || []);
    generator._invoke = makeInvokeMethod(innerFn, self, context);
    return generator;
  }

  runtime.wrap = wrap;

  function tryCatch(fn, obj, arg) {
    try {
      return {
        type: "normal",
        arg: fn.call(obj, arg)
      };
    } catch (err) {
      return {
        type: "throw",
        arg: err
      };
    }
  }

  var GenStateSuspendedStart = "suspendedStart";
  var GenStateSuspendedYield = "suspendedYield";
  var GenStateExecuting = "executing";
  var GenStateCompleted = "completed";
  var ContinueSentinel = {};

  function Generator() {}

  function GeneratorFunction() {}

  function GeneratorFunctionPrototype() {}

  var IteratorPrototype = {};

  IteratorPrototype[iteratorSymbol] = function () {
    return this;
  };

  var getProto = Object.getPrototypeOf;
  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));

  if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
    IteratorPrototype = NativeIteratorPrototype;
  }

  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  GeneratorFunctionPrototype.constructor = GeneratorFunction;
  GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction";

  function defineIteratorMethods(prototype) {
    ["next", "throw", "return"].forEach(function (method) {
      prototype[method] = function (arg) {
        return this._invoke(method, arg);
      };
    });
  }

  runtime.isGeneratorFunction = function (genFun) {
    var ctor = typeof genFun === "function" && genFun.constructor;
    return ctor ? ctor === GeneratorFunction || (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
  };

  runtime.mark = function (genFun) {
    if (Object.setPrototypeOf) {
      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
    } else {
      genFun.__proto__ = GeneratorFunctionPrototype;

      if (!(toStringTagSymbol in genFun)) {
        genFun[toStringTagSymbol] = "GeneratorFunction";
      }
    }

    genFun.prototype = Object.create(Gp);
    return genFun;
  };

  runtime.awrap = function (arg) {
    return {
      __await: arg
    };
  };

  function AsyncIterator(generator) {
    function invoke(method, arg, resolve, reject) {
      var record = tryCatch(generator[method], generator, arg);

      if (record.type === "throw") {
        reject(record.arg);
      } else {
        var result = record.arg;
        var value = result.value;

        if (value && _typeof(value) === "object" && hasOwn.call(value, "__await")) {
          return Promise.resolve(value.__await).then(function (value) {
            invoke("next", value, resolve, reject);
          }, function (err) {
            invoke("throw", err, resolve, reject);
          });
        }

        return Promise.resolve(value).then(function (unwrapped) {
          result.value = unwrapped;
          resolve(result);
        }, function (error) {
          return invoke("throw", error, resolve, reject);
        });
      }
    }

    var previousPromise;

    function enqueue(method, arg) {
      function callInvokeWithMethodAndArg() {
        return new Promise(function (resolve, reject) {
          invoke(method, arg, resolve, reject);
        });
      }

      return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
    }

    this._invoke = enqueue;
  }

  defineIteratorMethods(AsyncIterator.prototype);

  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
    return this;
  };

  runtime.AsyncIterator = AsyncIterator;

  runtime.async = function (innerFn, outerFn, self, tryLocsList) {
    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));
    return runtime.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
      return result.done ? result.value : iter.next();
    });
  };

  function makeInvokeMethod(innerFn, self, context) {
    var state = GenStateSuspendedStart;
    return function invoke(method, arg) {
      if (state === GenStateExecuting) {
        throw new Error("Generator is already running");
      }

      if (state === GenStateCompleted) {
        if (method === "throw") {
          throw arg;
        }

        return doneResult();
      }

      context.method = method;
      context.arg = arg;

      while (true) {
        var delegate = context.delegate;

        if (delegate) {
          var delegateResult = maybeInvokeDelegate(delegate, context);

          if (delegateResult) {
            if (delegateResult === ContinueSentinel) continue;
            return delegateResult;
          }
        }

        if (context.method === "next") {
          context.sent = context._sent = context.arg;
        } else if (context.method === "throw") {
          if (state === GenStateSuspendedStart) {
            state = GenStateCompleted;
            throw context.arg;
          }

          context.dispatchException(context.arg);
        } else if (context.method === "return") {
          context.abrupt("return", context.arg);
        }

        state = GenStateExecuting;
        var record = tryCatch(innerFn, self, context);

        if (record.type === "normal") {
          state = context.done ? GenStateCompleted : GenStateSuspendedYield;

          if (record.arg === ContinueSentinel) {
            continue;
          }

          return {
            value: record.arg,
            done: context.done
          };
        } else if (record.type === "throw") {
          state = GenStateCompleted;
          context.method = "throw";
          context.arg = record.arg;
        }
      }
    };
  }

  function maybeInvokeDelegate(delegate, context) {
    var method = delegate.iterator[context.method];

    if (method === undefined) {
      context.delegate = null;

      if (context.method === "throw") {
        if (delegate.iterator.return) {
          context.method = "return";
          context.arg = undefined;
          maybeInvokeDelegate(delegate, context);

          if (context.method === "throw") {
            return ContinueSentinel;
          }
        }

        context.method = "throw";
        context.arg = new TypeError("The iterator does not provide a 'throw' method");
      }

      return ContinueSentinel;
    }

    var record = tryCatch(method, delegate.iterator, context.arg);

    if (record.type === "throw") {
      context.method = "throw";
      context.arg = record.arg;
      context.delegate = null;
      return ContinueSentinel;
    }

    var info = record.arg;

    if (!info) {
      context.method = "throw";
      context.arg = new TypeError("iterator result is not an object");
      context.delegate = null;
      return ContinueSentinel;
    }

    if (info.done) {
      context[delegate.resultName] = info.value;
      context.next = delegate.nextLoc;

      if (context.method !== "return") {
        context.method = "next";
        context.arg = undefined;
      }
    } else {
      return info;
    }

    context.delegate = null;
    return ContinueSentinel;
  }

  defineIteratorMethods(Gp);
  Gp[toStringTagSymbol] = "Generator";

  Gp[iteratorSymbol] = function () {
    return this;
  };

  Gp.toString = function () {
    return "[object Generator]";
  };

  function pushTryEntry(locs) {
    var entry = {
      tryLoc: locs[0]
    };

    if (1 in locs) {
      entry.catchLoc = locs[1];
    }

    if (2 in locs) {
      entry.finallyLoc = locs[2];
      entry.afterLoc = locs[3];
    }

    this.tryEntries.push(entry);
  }

  function resetTryEntry(entry) {
    var record = entry.completion || {};
    record.type = "normal";
    delete record.arg;
    entry.completion = record;
  }

  function Context(tryLocsList) {
    this.tryEntries = [{
      tryLoc: "root"
    }];
    tryLocsList.forEach(pushTryEntry, this);
    this.reset(true);
  }

  runtime.keys = function (object) {
    var keys = [];

    for (var key in object) {
      keys.push(key);
    }

    keys.reverse();
    return function next() {
      while (keys.length) {
        var key = keys.pop();

        if (key in object) {
          next.value = key;
          next.done = false;
          return next;
        }
      }

      next.done = true;
      return next;
    };
  };

  function values(iterable) {
    if (iterable) {
      var iteratorMethod = iterable[iteratorSymbol];

      if (iteratorMethod) {
        return iteratorMethod.call(iterable);
      }

      if (typeof iterable.next === "function") {
        return iterable;
      }

      if (!isNaN(iterable.length)) {
        var i = -1,
            next = function next() {
          while (++i < iterable.length) {
            if (hasOwn.call(iterable, i)) {
              next.value = iterable[i];
              next.done = false;
              return next;
            }
          }

          next.value = undefined;
          next.done = true;
          return next;
        };

        return next.next = next;
      }
    }

    return {
      next: doneResult
    };
  }

  runtime.values = values;

  function doneResult() {
    return {
      value: undefined,
      done: true
    };
  }

  Context.prototype = {
    constructor: Context,
    reset: function reset(skipTempReset) {
      this.prev = 0;
      this.next = 0;
      this.sent = this._sent = undefined;
      this.done = false;
      this.delegate = null;
      this.method = "next";
      this.arg = undefined;
      this.tryEntries.forEach(resetTryEntry);

      if (!skipTempReset) {
        for (var name in this) {
          if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
            this[name] = undefined;
          }
        }
      }
    },
    stop: function stop() {
      this.done = true;
      var rootEntry = this.tryEntries[0];
      var rootRecord = rootEntry.completion;

      if (rootRecord.type === "throw") {
        throw rootRecord.arg;
      }

      return this.rval;
    },
    dispatchException: function dispatchException(exception) {
      if (this.done) {
        throw exception;
      }

      var context = this;

      function handle(loc, caught) {
        record.type = "throw";
        record.arg = exception;
        context.next = loc;

        if (caught) {
          context.method = "next";
          context.arg = undefined;
        }

        return !!caught;
      }

      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        var record = entry.completion;

        if (entry.tryLoc === "root") {
          return handle("end");
        }

        if (entry.tryLoc <= this.prev) {
          var hasCatch = hasOwn.call(entry, "catchLoc");
          var hasFinally = hasOwn.call(entry, "finallyLoc");

          if (hasCatch && hasFinally) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            } else if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }
          } else if (hasCatch) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            }
          } else if (hasFinally) {
            if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }
          } else {
            throw new Error("try statement without catch or finally");
          }
        }
      }
    },
    abrupt: function abrupt(type, arg) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
          var finallyEntry = entry;
          break;
        }
      }

      if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
        finallyEntry = null;
      }

      var record = finallyEntry ? finallyEntry.completion : {};
      record.type = type;
      record.arg = arg;

      if (finallyEntry) {
        this.method = "next";
        this.next = finallyEntry.finallyLoc;
        return ContinueSentinel;
      }

      return this.complete(record);
    },
    complete: function complete(record, afterLoc) {
      if (record.type === "throw") {
        throw record.arg;
      }

      if (record.type === "break" || record.type === "continue") {
        this.next = record.arg;
      } else if (record.type === "return") {
        this.rval = this.arg = record.arg;
        this.method = "return";
        this.next = "end";
      } else if (record.type === "normal" && afterLoc) {
        this.next = afterLoc;
      }

      return ContinueSentinel;
    },
    finish: function finish(finallyLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.finallyLoc === finallyLoc) {
          this.complete(entry.completion, entry.afterLoc);
          resetTryEntry(entry);
          return ContinueSentinel;
        }
      }
    },
    "catch": function _catch(tryLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.tryLoc === tryLoc) {
          var record = entry.completion;

          if (record.type === "throw") {
            var thrown = record.arg;
            resetTryEntry(entry);
          }

          return thrown;
        }
      }

      throw new Error("illegal catch attempt");
    },
    delegateYield: function delegateYield(iterable, resultName, nextLoc) {
      this.delegate = {
        iterator: values(iterable),
        resultName: resultName,
        nextLoc: nextLoc
      };

      if (this.method === "next") {
        this.arg = undefined;
      }

      return ContinueSentinel;
    }
  };
}(function () {
  return this || (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" && self;
}() || Function("return this")());
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module)))

/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


module.exports = function (module) {
  if (!module.webpackPolyfill) {
    module.deprecate = function () {};

    module.paths = [];
    if (!module.children) module.children = [];
    Object.defineProperty(module, "loaded", {
      enumerable: true,
      get: function get() {
        return module.l;
      }
    });
    Object.defineProperty(module, "id", {
      enumerable: true,
      get: function get() {
        return module.i;
      }
    });
    module.webpackPolyfill = 1;
  }

  return module;
};

/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isValidRotation = isValidRotation;
exports.isValidScrollMode = isValidScrollMode;
exports.isValidSpreadMode = isValidSpreadMode;
exports.isPortraitOrientation = isPortraitOrientation;
exports.getGlobalEventBus = getGlobalEventBus;
exports.getPDFFileNameFromURL = getPDFFileNameFromURL;
exports.noContextMenuHandler = noContextMenuHandler;
exports.parseQueryString = parseQueryString;
exports.backtrackBeforeAllVisibleElements = backtrackBeforeAllVisibleElements;
exports.getVisibleElements = getVisibleElements;
exports.roundToDivide = roundToDivide;
exports.getPageSizeInches = getPageSizeInches;
exports.approximateFraction = approximateFraction;
exports.getOutputScale = getOutputScale;
exports.scrollIntoView = scrollIntoView;
exports.watchScroll = watchScroll;
exports.binarySearchFirstItem = binarySearchFirstItem;
exports.normalizeWheelEventDelta = normalizeWheelEventDelta;
exports.waitOnEventOrTimeout = waitOnEventOrTimeout;
exports.moveToEndOfArray = moveToEndOfArray;
exports.WaitOnType = exports.animationStarted = exports.ProgressBar = exports.EventBus = exports.NullL10n = exports.SpreadMode = exports.ScrollMode = exports.TextLayerMode = exports.RendererType = exports.PresentationModeState = exports.VERTICAL_PADDING = exports.SCROLLBAR_PADDING = exports.MAX_AUTO_SCALE = exports.UNKNOWN_SCALE = exports.MAX_SCALE = exports.MIN_SCALE = exports.DEFAULT_SCALE = exports.DEFAULT_SCALE_VALUE = exports.CSS_UNITS = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(2));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var CSS_UNITS = 96.0 / 72.0;
exports.CSS_UNITS = CSS_UNITS;
var DEFAULT_SCALE_VALUE = 'auto';
exports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE;
var DEFAULT_SCALE = 1.0;
exports.DEFAULT_SCALE = DEFAULT_SCALE;
var MIN_SCALE = 0.10;
exports.MIN_SCALE = MIN_SCALE;
var MAX_SCALE = 10.0;
exports.MAX_SCALE = MAX_SCALE;
var UNKNOWN_SCALE = 0;
exports.UNKNOWN_SCALE = UNKNOWN_SCALE;
var MAX_AUTO_SCALE = 1.25;
exports.MAX_AUTO_SCALE = MAX_AUTO_SCALE;
var SCROLLBAR_PADDING = 40;
exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING;
var VERTICAL_PADDING = 5;
exports.VERTICAL_PADDING = VERTICAL_PADDING;
var PresentationModeState = {
  UNKNOWN: 0,
  NORMAL: 1,
  CHANGING: 2,
  FULLSCREEN: 3
};
exports.PresentationModeState = PresentationModeState;
var RendererType = {
  CANVAS: 'canvas',
  SVG: 'svg'
};
exports.RendererType = RendererType;
var TextLayerMode = {
  DISABLE: 0,
  ENABLE: 1,
  ENABLE_ENHANCE: 2
};
exports.TextLayerMode = TextLayerMode;
var ScrollMode = {
  UNKNOWN: -1,
  VERTICAL: 0,
  HORIZONTAL: 1,
  WRAPPED: 2
};
exports.ScrollMode = ScrollMode;
var SpreadMode = {
  UNKNOWN: -1,
  NONE: 0,
  ODD: 1,
  EVEN: 2
};
exports.SpreadMode = SpreadMode;

function formatL10nValue(text, args) {
  if (!args) {
    return text;
  }

  return text.replace(/\{\{\s*(\w+)\s*\}\}/g, function (all, name) {
    return name in args ? args[name] : '{{' + name + '}}';
  });
}

var NullL10n = {
  getLanguage: function () {
    var _getLanguage = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee() {
      return _regenerator.default.wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              return _context.abrupt("return", 'en-us');

            case 1:
            case "end":
              return _context.stop();
          }
        }
      }, _callee, this);
    }));

    function getLanguage() {
      return _getLanguage.apply(this, arguments);
    }

    return getLanguage;
  }(),
  getDirection: function () {
    var _getDirection = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee2() {
      return _regenerator.default.wrap(function _callee2$(_context2) {
        while (1) {
          switch (_context2.prev = _context2.next) {
            case 0:
              return _context2.abrupt("return", 'ltr');

            case 1:
            case "end":
              return _context2.stop();
          }
        }
      }, _callee2, this);
    }));

    function getDirection() {
      return _getDirection.apply(this, arguments);
    }

    return getDirection;
  }(),
  get: function () {
    var _get = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee3(property, args, fallback) {
      return _regenerator.default.wrap(function _callee3$(_context3) {
        while (1) {
          switch (_context3.prev = _context3.next) {
            case 0:
              return _context3.abrupt("return", formatL10nValue(fallback, args));

            case 1:
            case "end":
              return _context3.stop();
          }
        }
      }, _callee3, this);
    }));

    function get(_x, _x2, _x3) {
      return _get.apply(this, arguments);
    }

    return get;
  }(),
  translate: function () {
    var _translate = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee4(element) {
      return _regenerator.default.wrap(function _callee4$(_context4) {
        while (1) {
          switch (_context4.prev = _context4.next) {
            case 0:
            case "end":
              return _context4.stop();
          }
        }
      }, _callee4, this);
    }));

    function translate(_x4) {
      return _translate.apply(this, arguments);
    }

    return translate;
  }()
};
exports.NullL10n = NullL10n;

function getOutputScale(ctx) {
  var devicePixelRatio = window.devicePixelRatio || 1;
  var backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;
  var pixelRatio = devicePixelRatio / backingStoreRatio;
  return {
    sx: pixelRatio,
    sy: pixelRatio,
    scaled: pixelRatio !== 1
  };
}

function scrollIntoView(element, spot) {
  var skipOverflowHiddenElements = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  var parent = element.offsetParent;

  if (!parent) {
    console.error('offsetParent is not set -- cannot scroll');
    return;
  }

  var offsetY = element.offsetTop + element.clientTop;
  var offsetX = element.offsetLeft + element.clientLeft;

  while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || skipOverflowHiddenElements && getComputedStyle(parent).overflow === 'hidden') {
    if (parent.dataset._scaleY) {
      offsetY /= parent.dataset._scaleY;
      offsetX /= parent.dataset._scaleX;
    }

    offsetY += parent.offsetTop;
    offsetX += parent.offsetLeft;
    parent = parent.offsetParent;

    if (!parent) {
      return;
    }
  }

  if (spot) {
    if (spot.top !== undefined) {
      offsetY += spot.top;
    }

    if (spot.left !== undefined) {
      offsetX += spot.left;
      parent.scrollLeft = offsetX;
    }
  }

  parent.scrollTop = offsetY;
}

function watchScroll(viewAreaElement, callback) {
  var debounceScroll = function debounceScroll(evt) {
    if (rAF) {
      return;
    }

    rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {
      rAF = null;
      var currentX = viewAreaElement.scrollLeft;
      var lastX = state.lastX;

      if (currentX !== lastX) {
        state.right = currentX > lastX;
      }

      state.lastX = currentX;
      var currentY = viewAreaElement.scrollTop;
      var lastY = state.lastY;

      if (currentY !== lastY) {
        state.down = currentY > lastY;
      }

      state.lastY = currentY;
      callback(state);
    });
  };

  var state = {
    right: true,
    down: true,
    lastX: viewAreaElement.scrollLeft,
    lastY: viewAreaElement.scrollTop,
    _eventHandler: debounceScroll
  };
  var rAF = null;
  viewAreaElement.addEventListener('scroll', debounceScroll, true);
  return state;
}

function parseQueryString(query) {
  var parts = query.split('&');
  var params = Object.create(null);

  for (var i = 0, ii = parts.length; i < ii; ++i) {
    var param = parts[i].split('=');
    var key = param[0].toLowerCase();
    var value = param.length > 1 ? param[1] : null;
    params[decodeURIComponent(key)] = decodeURIComponent(value);
  }

  return params;
}

function binarySearchFirstItem(items, condition) {
  var minIndex = 0;
  var maxIndex = items.length - 1;

  if (items.length === 0 || !condition(items[maxIndex])) {
    return items.length;
  }

  if (condition(items[minIndex])) {
    return minIndex;
  }

  while (minIndex < maxIndex) {
    var currentIndex = minIndex + maxIndex >> 1;
    var currentItem = items[currentIndex];

    if (condition(currentItem)) {
      maxIndex = currentIndex;
    } else {
      minIndex = currentIndex + 1;
    }
  }

  return minIndex;
}

function approximateFraction(x) {
  if (Math.floor(x) === x) {
    return [x, 1];
  }

  var xinv = 1 / x;
  var limit = 8;

  if (xinv > limit) {
    return [1, limit];
  } else if (Math.floor(xinv) === xinv) {
    return [1, xinv];
  }

  var x_ = x > 1 ? xinv : x;
  var a = 0,
      b = 1,
      c = 1,
      d = 1;

  while (true) {
    var p = a + c,
        q = b + d;

    if (q > limit) {
      break;
    }

    if (x_ <= p / q) {
      c = p;
      d = q;
    } else {
      a = p;
      b = q;
    }
  }

  var result;

  if (x_ - a / b < c / d - x_) {
    result = x_ === x ? [a, b] : [b, a];
  } else {
    result = x_ === x ? [c, d] : [d, c];
  }

  return result;
}

function roundToDivide(x, div) {
  var r = x % div;
  return r === 0 ? x : Math.round(x - r + div);
}

function getPageSizeInches(_ref) {
  var view = _ref.view,
      userUnit = _ref.userUnit,
      rotate = _ref.rotate;

  var _view = _slicedToArray(view, 4),
      x1 = _view[0],
      y1 = _view[1],
      x2 = _view[2],
      y2 = _view[3];

  var changeOrientation = rotate % 180 !== 0;
  var width = (x2 - x1) / 72 * userUnit;
  var height = (y2 - y1) / 72 * userUnit;
  return {
    width: changeOrientation ? height : width,
    height: changeOrientation ? width : height
  };
}

function backtrackBeforeAllVisibleElements(index, views, top) {
  if (index < 2) {
    return index;
  }

  var elt = views[index].div;
  var pageTop = elt.offsetTop + elt.clientTop;

  if (pageTop >= top) {
    elt = views[index - 1].div;
    pageTop = elt.offsetTop + elt.clientTop;
  }

  for (var i = index - 2; i >= 0; --i) {
    elt = views[i].div;

    if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {
      break;
    }

    index = i;
  }

  return index;
}

function getVisibleElements(scrollEl, views) {
  var sortByVisibility = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  var horizontal = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  var top = scrollEl.scrollTop,
      bottom = top + scrollEl.clientHeight;
  var left = scrollEl.scrollLeft,
      right = left + scrollEl.clientWidth;

  function isElementBottomAfterViewTop(view) {
    var element = view.div;
    var elementBottom = element.offsetTop + element.clientTop + element.clientHeight;
    return elementBottom > top;
  }

  function isElementRightAfterViewLeft(view) {
    var element = view.div;
    var elementRight = element.offsetLeft + element.clientLeft + element.clientWidth;
    return elementRight > left;
  }

  var visible = [],
      numViews = views.length;
  var firstVisibleElementInd = numViews === 0 ? 0 : binarySearchFirstItem(views, horizontal ? isElementRightAfterViewLeft : isElementBottomAfterViewTop);

  if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) {
    firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top);
  }

  var lastEdge = horizontal ? right : -1;

  for (var i = firstVisibleElementInd; i < numViews; i++) {
    var view = views[i],
        element = view.div;
    var currentWidth = element.offsetLeft + element.clientLeft;
    var currentHeight = element.offsetTop + element.clientTop;
    var viewWidth = element.clientWidth,
        viewHeight = element.clientHeight;
    var viewRight = currentWidth + viewWidth;
    var viewBottom = currentHeight + viewHeight;

    if (lastEdge === -1) {
      if (viewBottom >= bottom) {
        lastEdge = viewBottom;
      }
    } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {
      break;
    }

    if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) {
      continue;
    }

    var hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom);
    var hiddenWidth = Math.max(0, left - currentWidth) + Math.max(0, viewRight - right);
    var percent = (viewHeight - hiddenHeight) * (viewWidth - hiddenWidth) * 100 / viewHeight / viewWidth | 0;
    visible.push({
      id: view.id,
      x: currentWidth,
      y: currentHeight,
      view: view,
      percent: percent
    });
  }

  var first = visible[0],
      last = visible[visible.length - 1];

  if (sortByVisibility) {
    visible.sort(function (a, b) {
      var pc = a.percent - b.percent;

      if (Math.abs(pc) > 0.001) {
        return -pc;
      }

      return a.id - b.id;
    });
  }

  return {
    first: first,
    last: last,
    views: visible
  };
}

function noContextMenuHandler(evt) {
  evt.preventDefault();
}

function isDataSchema(url) {
  var i = 0,
      ii = url.length;

  while (i < ii && url[i].trim() === '') {
    i++;
  }

  return url.substring(i, i + 5).toLowerCase() === 'data:';
}

function getPDFFileNameFromURL(url) {
  var defaultFilename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'document.pdf';

  if (typeof url !== 'string') {
    return defaultFilename;
  }

  if (isDataSchema(url)) {
    console.warn('getPDFFileNameFromURL: ' + 'ignoring "data:" URL for performance reasons.');
    return defaultFilename;
  }

  var reURI = /^(?:(?:[^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/;
  var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i;
  var splitURI = reURI.exec(url);
  var suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]);

  if (suggestedFilename) {
    suggestedFilename = suggestedFilename[0];

    if (suggestedFilename.includes('%')) {
      try {
        suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0];
      } catch (ex) {}
    }
  }

  return suggestedFilename || defaultFilename;
}

function normalizeWheelEventDelta(evt) {
  var delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY);
  var angle = Math.atan2(evt.deltaY, evt.deltaX);

  if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {
    delta = -delta;
  }

  var MOUSE_DOM_DELTA_PIXEL_MODE = 0;
  var MOUSE_DOM_DELTA_LINE_MODE = 1;
  var MOUSE_PIXELS_PER_LINE = 30;
  var MOUSE_LINES_PER_PAGE = 30;

  if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) {
    delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;
  } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) {
    delta /= MOUSE_LINES_PER_PAGE;
  }

  return delta;
}

function isValidRotation(angle) {
  return Number.isInteger(angle) && angle % 90 === 0;
}

function isValidScrollMode(mode) {
  return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN;
}

function isValidSpreadMode(mode) {
  return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN;
}

function isPortraitOrientation(size) {
  return size.width <= size.height;
}

var WaitOnType = {
  EVENT: 'event',
  TIMEOUT: 'timeout'
};
exports.WaitOnType = WaitOnType;

function waitOnEventOrTimeout(_ref2) {
  var target = _ref2.target,
      name = _ref2.name,
      _ref2$delay = _ref2.delay,
      delay = _ref2$delay === void 0 ? 0 : _ref2$delay;
  return new Promise(function (resolve, reject) {
    if (_typeof(target) !== 'object' || !(name && typeof name === 'string') || !(Number.isInteger(delay) && delay >= 0)) {
      throw new Error('waitOnEventOrTimeout - invalid parameters.');
    }

    function handler(type) {
      if (target instanceof EventBus) {
        target.off(name, eventHandler);
      } else {
        target.removeEventListener(name, eventHandler);
      }

      if (timeout) {
        clearTimeout(timeout);
      }

      resolve(type);
    }

    var eventHandler = handler.bind(null, WaitOnType.EVENT);

    if (target instanceof EventBus) {
      target.on(name, eventHandler);
    } else {
      target.addEventListener(name, eventHandler);
    }

    var timeoutHandler = handler.bind(null, WaitOnType.TIMEOUT);
    var timeout = setTimeout(timeoutHandler, delay);
  });
}

var animationStarted = new Promise(function (resolve) {
  window.requestAnimationFrame(resolve);
});
exports.animationStarted = animationStarted;

var EventBus =
/*#__PURE__*/
function () {
  function EventBus() {
    var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
        _ref3$dispatchToDOM = _ref3.dispatchToDOM,
        dispatchToDOM = _ref3$dispatchToDOM === void 0 ? false : _ref3$dispatchToDOM;

    _classCallCheck(this, EventBus);

    this._listeners = Object.create(null);
    this._dispatchToDOM = dispatchToDOM === true;
  }

  _createClass(EventBus, [{
    key: "on",
    value: function on(eventName, listener) {
      var eventListeners = this._listeners[eventName];

      if (!eventListeners) {
        eventListeners = [];
        this._listeners[eventName] = eventListeners;
      }

      eventListeners.push(listener);
    }
  }, {
    key: "off",
    value: function off(eventName, listener) {
      var eventListeners = this._listeners[eventName];
      var i;

      if (!eventListeners || (i = eventListeners.indexOf(listener)) < 0) {
        return;
      }

      eventListeners.splice(i, 1);
    }
  }, {
    key: "dispatch",
    value: function dispatch(eventName) {
      // CHANGE 10
      var _args5 = Array.prototype.slice.call(arguments, 1);
      this._dispatchDOMEvent(eventName, _args5);
          
      var eventListeners = this._listeners[eventName];

      if (!eventListeners || eventListeners.length === 0) {
        // CHANGE 10
        // if (this._dispatchToDOM) {
        //   var _args5 = Array.prototype.slice.call(arguments, 1);
        //   this._dispatchDOMEvent(eventName, _args5);
        // }
        return;
      }

      var args = Array.prototype.slice.call(arguments, 1);
      eventListeners.slice(0).forEach(function (listener) {
        listener.apply(null, args);
      });

      if (this._dispatchToDOM) {
        this._dispatchDOMEvent(eventName, args);
      }
    }
  }, {
    key: "_dispatchDOMEvent",
    value: function _dispatchDOMEvent(eventName) {
      var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
      var details = Object.create(null);

      if (args && args.length > 0) {
        var obj = args[0];

        for (var key in obj) {
          var value = obj[key];

          if (key === 'source') {
            if (value === window || value === document) {
              return;
            }

            continue;
          }

          details[key] = value;
        }
      }

      var event = document.createEvent('CustomEvent');
      event.initCustomEvent(eventName, true, true, details);
      document.dispatchEvent(event);
    }
  }]);

  return EventBus;
}();

exports.EventBus = EventBus;
var globalEventBus = null;

function getGlobalEventBus() {
  var dispatchToDOM = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;

  if (!globalEventBus) {
    globalEventBus = new EventBus({
      dispatchToDOM: dispatchToDOM
    });
  }

  return globalEventBus;
}

function clamp(v, min, max) {
  return Math.min(Math.max(v, min), max);
}

var ProgressBar =
/*#__PURE__*/
function () {
  function ProgressBar(id) {
    var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
        height = _ref4.height,
        width = _ref4.width,
        units = _ref4.units;

    _classCallCheck(this, ProgressBar);

    this.visible = true;
    this.div = document.querySelector(id + ' .progress');
    this.bar = this.div.parentNode;
    this.height = height || 100;
    this.width = width || 100;
    this.units = units || '%';
    this.div.style.height = this.height + this.units;
    this.percent = 0;
  }

  _createClass(ProgressBar, [{
    key: "_updateBar",
    value: function _updateBar() {
      if (this._indeterminate) {
        this.div.classList.add('indeterminate');
        this.div.style.width = this.width + this.units;
        return;
      }

      this.div.classList.remove('indeterminate');
      var progressSize = this.width * this._percent / 100;
      this.div.style.width = progressSize + this.units;
    }
  }, {
    key: "setWidth",
    value: function setWidth(viewer) {
      if (!viewer) {
        return;
      }

      var container = viewer.parentNode;
      var scrollbarWidth = container.offsetWidth - viewer.offsetWidth;

      if (scrollbarWidth > 0) {
        this.bar.setAttribute('style', 'width: calc(100% - ' + scrollbarWidth + 'px);');
      }
    }
  }, {
    key: "hide",
    value: function hide() {
      if (!this.visible) {
        return;
      }

      this.visible = false;
      this.bar.classList.add('hidden');
      document.body.classList.remove('loadingInProgress');
    }
  }, {
    key: "show",
    value: function show() {
      if (this.visible) {
        return;
      }

      this.visible = true;
      document.body.classList.add('loadingInProgress');
      this.bar.classList.remove('hidden');
    }
  }, {
    key: "percent",
    get: function get() {
      return this._percent;
    },
    set: function set(val) {
      this._indeterminate = isNaN(val);
      this._percent = clamp(val, 0, 100);

      this._updateBar();
    }
  }]);

  return ProgressBar;
}();

exports.ProgressBar = ProgressBar;

function moveToEndOfArray(arr, condition) {
  var moved = [],
      len = arr.length;
  var write = 0;

  for (var read = 0; read < len; ++read) {
    if (condition(arr[read])) {
      moved.push(arr[read]);
    } else {
      arr[write] = arr[read];
      ++write;
    }
  }

  for (var _read = 0; write < len; ++_read, ++write) {
    arr[write] = moved[_read];
  }
}

/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var pdfjsLib;

if (typeof window !== 'undefined' && window['pdfjs-dist/build/pdf']) {
  pdfjsLib = window['pdfjs-dist/build/pdf'];
} else {
  pdfjsLib = require('../build/pdf.js');
}

module.exports = pdfjsLib;

/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFCursorTools = exports.CursorTool = void 0;

var _grab_to_pan = __webpack_require__(9);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var CursorTool = {
  SELECT: 0,
  HAND: 1,
  ZOOM: 2
};
exports.CursorTool = CursorTool;

var PDFCursorTools =
/*#__PURE__*/
function () {
  function PDFCursorTools(_ref) {
    var _this = this;

    var container = _ref.container,
        eventBus = _ref.eventBus,
        _ref$cursorToolOnLoad = _ref.cursorToolOnLoad,
        cursorToolOnLoad = _ref$cursorToolOnLoad === void 0 ? CursorTool.SELECT : _ref$cursorToolOnLoad;

    _classCallCheck(this, PDFCursorTools);

    this.container = container;
    this.eventBus = eventBus;
    this.active = CursorTool.SELECT;
    this.activeBeforePresentationMode = null;
    this.handTool = new _grab_to_pan.GrabToPan({
      element: this.container
    });

    this._addEventListeners();

    Promise.resolve().then(function () {
      _this.switchTool(cursorToolOnLoad);
    });
  }

  _createClass(PDFCursorTools, [{
    key: "switchTool",
    value: function switchTool(tool) {
      var _this2 = this;

      if (this.activeBeforePresentationMode !== null) {
        return;
      }

      if (tool === this.active) {
        return;
      }

      var disableActiveTool = function disableActiveTool() {
        switch (_this2.active) {
          case CursorTool.SELECT:
            break;

          case CursorTool.HAND:
            _this2.handTool.deactivate();

            break;

          case CursorTool.ZOOM:
        }
      };

      switch (tool) {
        case CursorTool.SELECT:
          disableActiveTool();
          break;

        case CursorTool.HAND:
          disableActiveTool();
          this.handTool.activate();
          break;

        case CursorTool.ZOOM:
        default:
          console.error("switchTool: \"".concat(tool, "\" is an unsupported value."));
          return;
      }

      this.active = tool;

      this._dispatchEvent();
    }
  }, {
    key: "_dispatchEvent",
    value: function _dispatchEvent() {
      this.eventBus.dispatch('cursortoolchanged', {
        source: this,
        tool: this.active
      });
    }
  }, {
    key: "_addEventListeners",
    value: function _addEventListeners() {
      var _this3 = this;

      this.eventBus.on('switchcursortool', function (evt) {
        _this3.switchTool(evt.tool);
      });
      this.eventBus.on('presentationmodechanged', function (evt) {
        if (evt.switchInProgress) {
          return;
        }

        var previouslyActive;

        if (evt.active) {
          previouslyActive = _this3.active;

          _this3.switchTool(CursorTool.SELECT);

          _this3.activeBeforePresentationMode = previouslyActive;
        } else {
          previouslyActive = _this3.activeBeforePresentationMode;
          _this3.activeBeforePresentationMode = null;

          _this3.switchTool(previouslyActive);
        }
      });
    }
  }, {
    key: "activeTool",
    get: function get() {
      return this.active;
    }
  }]);

  return PDFCursorTools;
}();

exports.PDFCursorTools = PDFCursorTools;

/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.GrabToPan = GrabToPan;

function GrabToPan(options) {
  this.element = options.element;
  this.document = options.element.ownerDocument;

  if (typeof options.ignoreTarget === 'function') {
    this.ignoreTarget = options.ignoreTarget;
  }

  this.onActiveChanged = options.onActiveChanged;
  this.activate = this.activate.bind(this);
  this.deactivate = this.deactivate.bind(this);
  this.toggle = this.toggle.bind(this);
  this._onmousedown = this._onmousedown.bind(this);
  this._onmousemove = this._onmousemove.bind(this);
  this._endPan = this._endPan.bind(this);
  var overlay = this.overlay = document.createElement('div');
  overlay.className = 'grab-to-pan-grabbing';
}

GrabToPan.prototype = {
  CSS_CLASS_GRAB: 'grab-to-pan-grab',
  activate: function GrabToPan_activate() {
    if (!this.active) {
      this.active = true;
      this.element.addEventListener('mousedown', this._onmousedown, true);
      this.element.classList.add(this.CSS_CLASS_GRAB);

      if (this.onActiveChanged) {
        this.onActiveChanged(true);
      }
    }
  },
  deactivate: function GrabToPan_deactivate() {
    if (this.active) {
      this.active = false;
      this.element.removeEventListener('mousedown', this._onmousedown, true);

      this._endPan();

      this.element.classList.remove(this.CSS_CLASS_GRAB);

      if (this.onActiveChanged) {
        this.onActiveChanged(false);
      }
    }
  },
  toggle: function GrabToPan_toggle() {
    if (this.active) {
      this.deactivate();
    } else {
      this.activate();
    }
  },
  ignoreTarget: function GrabToPan_ignoreTarget(node) {
    return node[matchesSelector]('a[href], a[href] *, input, textarea, button, button *, select, option');
  },
  _onmousedown: function GrabToPan__onmousedown(event) {
    if (event.button !== 0 || this.ignoreTarget(event.target)) {
      return;
    }

    if (event.originalTarget) {
      try {
        event.originalTarget.tagName;
      } catch (e) {
        return;
      }
    }

    this.scrollLeftStart = this.element.scrollLeft;
    this.scrollTopStart = this.element.scrollTop;
    this.clientXStart = event.clientX;
    this.clientYStart = event.clientY;
    this.document.addEventListener('mousemove', this._onmousemove, true);
    this.document.addEventListener('mouseup', this._endPan, true);
    this.element.addEventListener('scroll', this._endPan, true);
    event.preventDefault();
    event.stopPropagation();
    var focusedElement = document.activeElement;

    if (focusedElement && !focusedElement.contains(event.target)) {
      focusedElement.blur();
    }
  },
  _onmousemove: function GrabToPan__onmousemove(event) {
    this.element.removeEventListener('scroll', this._endPan, true);

    if (isLeftMouseReleased(event)) {
      this._endPan();

      return;
    }

    var xDiff = event.clientX - this.clientXStart;
    var yDiff = event.clientY - this.clientYStart;
    var scrollTop = this.scrollTopStart - yDiff;
    var scrollLeft = this.scrollLeftStart - xDiff;

    if (this.element.scrollTo) {
      this.element.scrollTo({
        top: scrollTop,
        left: scrollLeft,
        behavior: 'instant'
      });
    } else {
      this.element.scrollTop = scrollTop;
      this.element.scrollLeft = scrollLeft;
    }

    if (!this.overlay.parentNode) {
      document.body.appendChild(this.overlay);
    }
  },
  _endPan: function GrabToPan__endPan() {
    this.element.removeEventListener('scroll', this._endPan, true);
    this.document.removeEventListener('mousemove', this._onmousemove, true);
    this.document.removeEventListener('mouseup', this._endPan, true);
    this.overlay.remove();
  }
};
var matchesSelector;
['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function (prefix) {
  var name = prefix + 'atches';

  if (name in document.documentElement) {
    matchesSelector = name;
  }

  name += 'Selector';

  if (name in document.documentElement) {
    matchesSelector = name;
  }

  return matchesSelector;
});
var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9;
var chrome = window.chrome;
var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);
var isSafari6plus = /Apple/.test(navigator.vendor) && /Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent);

function isLeftMouseReleased(event) {
  if ('buttons' in event && isNotIEorIsIE10plus) {
    return !(event.buttons & 1);
  }

  if (isChrome15OrOpera15plus || isSafari6plus) {
    return event.which === 0;
  }
}

/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFRenderingQueue = exports.RenderingStates = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var CLEANUP_TIMEOUT = 30000;
var RenderingStates = {
  INITIAL: 0,
  RUNNING: 1,
  PAUSED: 2,
  FINISHED: 3
};
exports.RenderingStates = RenderingStates;

var PDFRenderingQueue =
/*#__PURE__*/
function () {
  function PDFRenderingQueue() {
    _classCallCheck(this, PDFRenderingQueue);

    this.pdfViewer = null;
    this.pdfThumbnailViewer = null;
    this.onIdle = null;
    this.highestPriorityPage = null;
    this.idleTimeout = null;
    this.printing = false;
    this.isThumbnailViewEnabled = false;
  }

  _createClass(PDFRenderingQueue, [{
    key: "setViewer",
    value: function setViewer(pdfViewer) {
      this.pdfViewer = pdfViewer;
    }
  }, {
    key: "setThumbnailViewer",
    value: function setThumbnailViewer(pdfThumbnailViewer) {
      this.pdfThumbnailViewer = pdfThumbnailViewer;
    }
  }, {
    key: "isHighestPriority",
    value: function isHighestPriority(view) {
      return this.highestPriorityPage === view.renderingId;
    }
  }, {
    key: "renderHighestPriority",
    value: function renderHighestPriority(currentlyVisiblePages) {
      if (this.idleTimeout) {
        clearTimeout(this.idleTimeout);
        this.idleTimeout = null;
      }

      if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {
        return;
      }

      if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {
        if (this.pdfThumbnailViewer.forceRendering()) {
          return;
        }
      }

      if (this.printing) {
        return;
      }

      if (this.onIdle) {
        this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);
      }
    }
  }, {
    key: "getHighestPriority",
    value: function getHighestPriority(visible, views, scrolledDown) {
      var visibleViews = visible.views;
      var numVisible = visibleViews.length;

      if (numVisible === 0) {
        return false;
      }

      for (var i = 0; i < numVisible; ++i) {
        var view = visibleViews[i].view;

        if (!this.isViewFinished(view)) {
          return view;
        }
      }

      if (scrolledDown) {
        var nextPageIndex = visible.last.id;

        if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {
          return views[nextPageIndex];
        }
      } else {
        var previousPageIndex = visible.first.id - 2;

        if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) {
          return views[previousPageIndex];
        }
      }

      return null;
    }
  }, {
    key: "isViewFinished",
    value: function isViewFinished(view) {
      return view.renderingState === RenderingStates.FINISHED;
    }
  }, {
    key: "renderView",
    value: function renderView(view) {
      var _this = this;

      switch (view.renderingState) {
        case RenderingStates.FINISHED:
          return false;

        case RenderingStates.PAUSED:
          this.highestPriorityPage = view.renderingId;
          view.resume();
          break;

        case RenderingStates.RUNNING:
          this.highestPriorityPage = view.renderingId;
          break;

        case RenderingStates.INITIAL:
          this.highestPriorityPage = view.renderingId;

          var continueRendering = function continueRendering() {
            _this.renderHighestPriority();
          };

          view.draw().then(continueRendering, continueRendering);
          break;
      }

      return true;
    }
  }]);

  return PDFRenderingQueue;
}();

exports.PDFRenderingQueue = PDFRenderingQueue;

/***/ }),
/* 11 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFSidebar = exports.SidebarView = void 0;

var _ui_utils = __webpack_require__(6);

var _pdf_rendering_queue = __webpack_require__(10);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var UI_NOTIFICATION_CLASS = 'pdfSidebarNotification';
var SidebarView = {
  UNKNOWN: -1,
  NONE: 0,
  THUMBS: 1,
  OUTLINE: 2,
  ATTACHMENTS: 3,
  LAYERS: 4
};
exports.SidebarView = SidebarView;

var PDFSidebar =
/*#__PURE__*/
function () {
  function PDFSidebar(options, eventBus) {
    var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;

    _classCallCheck(this, PDFSidebar);

    this.isOpen = false;
    this.active = SidebarView.THUMBS;
    this.isInitialViewSet = false;
    this.onToggled = null;
    this.pdfViewer = options.pdfViewer;
    this.pdfThumbnailViewer = options.pdfThumbnailViewer;
    this.outerContainer = options.outerContainer;
    this.viewerContainer = options.viewerContainer;
    this.toggleButton = options.toggleButton;
    this.thumbnailButton = options.thumbnailButton;
    this.outlineButton = options.outlineButton;
    this.attachmentsButton = options.attachmentsButton;
    this.thumbnailView = options.thumbnailView;
    this.outlineView = options.outlineView;
    this.attachmentsView = options.attachmentsView;
    this.disableNotification = options.disableNotification || false;
    this.eventBus = eventBus;
    this.l10n = l10n;

    this._addEventListeners();
  }

  _createClass(PDFSidebar, [{
    key: "reset",
    value: function reset() {
      this.isInitialViewSet = false;

      this._hideUINotification(null);

      this.switchView(SidebarView.THUMBS);
      this.outlineButton.disabled = false;
      this.attachmentsButton.disabled = false;
    }
  }, {
    key: "setInitialView",
    value: function setInitialView() {
      var view = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : SidebarView.NONE;

      if (this.isInitialViewSet) {
        return;
      }

      this.isInitialViewSet = true;

      if (view === SidebarView.NONE || view === SidebarView.UNKNOWN) {
        this._dispatchEvent();

        return;
      }

      if (!this._switchView(view, true)) {
        this._dispatchEvent();
      }
    }
  }, {
    key: "switchView",
    value: function switchView(view) {
      var forceOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;

      this._switchView(view, forceOpen);
    }
  }, {
    key: "_switchView",
    value: function _switchView(view) {
      var forceOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      var isViewChanged = view !== this.active;
      var shouldForceRendering = false;

      switch (view) {
        case SidebarView.NONE:
          if (this.isOpen) {
            this.close();
            return true;
          }

          return false;

        case SidebarView.THUMBS:
          if (this.isOpen && isViewChanged) {
            shouldForceRendering = true;
          }

          break;

        case SidebarView.OUTLINE:
          if (this.outlineButton.disabled) {
            return false;
          }

          break;

        case SidebarView.ATTACHMENTS:
          if (this.attachmentsButton.disabled) {
            return false;
          }

          break;

        default:
          console.error("PDFSidebar._switchView: \"".concat(view, "\" is not a valid view."));
          return false;
      }

      this.active = view;
      this.thumbnailButton.classList.toggle('toggled', view === SidebarView.THUMBS);
      this.outlineButton.classList.toggle('toggled', view === SidebarView.OUTLINE);
      this.attachmentsButton.classList.toggle('toggled', view === SidebarView.ATTACHMENTS);
      this.thumbnailView.classList.toggle('hidden', view !== SidebarView.THUMBS);
      this.outlineView.classList.toggle('hidden', view !== SidebarView.OUTLINE);
      this.attachmentsView.classList.toggle('hidden', view !== SidebarView.ATTACHMENTS);

      if (forceOpen && !this.isOpen) {
        this.open();
        return true;
      }

      if (shouldForceRendering) {
        this._updateThumbnailViewer();

        this._forceRendering();
      }

      if (isViewChanged) {
        this._dispatchEvent();
      }

      this._hideUINotification(this.active);

      return isViewChanged;
    }
  }, {
    key: "open",
    value: function open() {
      if (this.isOpen) {
        return;
      }

      this.isOpen = true;
      this.toggleButton.classList.add('toggled');
      this.outerContainer.classList.add('sidebarMoving', 'sidebarOpen');

      if (this.active === SidebarView.THUMBS) {
        this._updateThumbnailViewer();
      }

      this._forceRendering();

      this._dispatchEvent();

      this._hideUINotification(this.active);
    }
  }, {
    key: "close",
    value: function close() {
      if (!this.isOpen) {
        return;
      }

      this.isOpen = false;
      this.toggleButton.classList.remove('toggled');
      this.outerContainer.classList.add('sidebarMoving');
      this.outerContainer.classList.remove('sidebarOpen');

      this._forceRendering();

      this._dispatchEvent();
    }
  }, {
    key: "toggle",
    value: function toggle() {
      if (this.isOpen) {
        this.close();
      } else {
        this.open();
      }
    }
  }, {
    key: "_dispatchEvent",
    value: function _dispatchEvent() {
      this.eventBus.dispatch('sidebarviewchanged', {
        source: this,
        view: this.visibleView
      });
    }
  }, {
    key: "_forceRendering",
    value: function _forceRendering() {
      if (this.onToggled) {
        this.onToggled();
      } else {
        this.pdfViewer.forceRendering();
        this.pdfThumbnailViewer.forceRendering();
      }
    }
  }, {
    key: "_updateThumbnailViewer",
    value: function _updateThumbnailViewer() {
      var pdfViewer = this.pdfViewer,
          pdfThumbnailViewer = this.pdfThumbnailViewer;
      var pagesCount = pdfViewer.pagesCount;

      for (var pageIndex = 0; pageIndex < pagesCount; pageIndex++) {
        var pageView = pdfViewer.getPageView(pageIndex);

        if (pageView && pageView.renderingState === _pdf_rendering_queue.RenderingStates.FINISHED) {
          var thumbnailView = pdfThumbnailViewer.getThumbnail(pageIndex);
          thumbnailView.setImage(pageView);
        }
      }

      pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber);
    }
  }, {
    key: "_showUINotification",
    value: function _showUINotification(view) {
      var _this = this;

      if (this.disableNotification) {
        return;
      }

      this.l10n.get('toggle_sidebar_notification.title', null, 'Toggle Sidebar (document contains outline/attachments)').then(function (msg) {
        _this.toggleButton.title = msg;
      });

      if (!this.isOpen) {
        this.toggleButton.classList.add(UI_NOTIFICATION_CLASS);
      } else if (view === this.active) {
        return;
      }

      switch (view) {
        case SidebarView.OUTLINE:
          this.outlineButton.classList.add(UI_NOTIFICATION_CLASS);
          break;

        case SidebarView.ATTACHMENTS:
          this.attachmentsButton.classList.add(UI_NOTIFICATION_CLASS);
          break;
      }
    }
  }, {
    key: "_hideUINotification",
    value: function _hideUINotification(view) {
      var _this2 = this;

      if (this.disableNotification) {
        return;
      }

      var removeNotification = function removeNotification(view) {
        switch (view) {
          case SidebarView.OUTLINE:
            _this2.outlineButton.classList.remove(UI_NOTIFICATION_CLASS);

            break;

          case SidebarView.ATTACHMENTS:
            _this2.attachmentsButton.classList.remove(UI_NOTIFICATION_CLASS);

            break;
        }
      };

      if (!this.isOpen && view !== null) {
        return;
      }

      this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);

      if (view !== null) {
        removeNotification(view);
        return;
      }

      for (view in SidebarView) {
        removeNotification(SidebarView[view]);
      }

      this.l10n.get('toggle_sidebar.title', null, 'Toggle Sidebar').then(function (msg) {
        _this2.toggleButton.title = msg;
      });
    }
  }, {
    key: "_addEventListeners",
    value: function _addEventListeners() {
      var _this3 = this;

      this.viewerContainer.addEventListener('transitionend', function (evt) {
        if (evt.target === _this3.viewerContainer) {
          _this3.outerContainer.classList.remove('sidebarMoving');
        }
      });
      this.thumbnailButton.addEventListener('click', function () {
        _this3.switchView(SidebarView.THUMBS);
      });
      this.outlineButton.addEventListener('click', function () {
        _this3.switchView(SidebarView.OUTLINE);
      });
      this.outlineButton.addEventListener('dblclick', function () {
        _this3.eventBus.dispatch('toggleoutlinetree', {
          source: _this3
        });
      });
      this.attachmentsButton.addEventListener('click', function () {
        _this3.switchView(SidebarView.ATTACHMENTS);
      });
      this.eventBus.on('outlineloaded', function (evt) {
        var outlineCount = evt.outlineCount;
        _this3.outlineButton.disabled = !outlineCount;

        if (outlineCount) {
          _this3._showUINotification(SidebarView.OUTLINE);
        } else if (_this3.active === SidebarView.OUTLINE) {
          _this3.switchView(SidebarView.THUMBS);
        }
      });
      this.eventBus.on('attachmentsloaded', function (evt) {
        if (evt.attachmentsCount) {
          _this3.attachmentsButton.disabled = false;

          _this3._showUINotification(SidebarView.ATTACHMENTS);

          return;
        }

        Promise.resolve().then(function () {
          if (_this3.attachmentsView.hasChildNodes()) {
            return;
          }

          _this3.attachmentsButton.disabled = true;

          if (_this3.active === SidebarView.ATTACHMENTS) {
            _this3.switchView(SidebarView.THUMBS);
          }
        });
      });
      this.eventBus.on('presentationmodechanged', function (evt) {
        if (!evt.active && !evt.switchInProgress && _this3.isThumbnailViewVisible) {
          _this3._updateThumbnailViewer();
        }
      });
    }
  }, {
    key: "visibleView",
    get: function get() {
      return this.isOpen ? this.active : SidebarView.NONE;
    }
  }, {
    key: "isThumbnailViewVisible",
    get: function get() {
      return this.isOpen && this.active === SidebarView.THUMBS;
    }
  }, {
    key: "isOutlineViewVisible",
    get: function get() {
      return this.isOpen && this.active === SidebarView.OUTLINE;
    }
  }, {
    key: "isAttachmentsViewVisible",
    get: function get() {
      return this.isOpen && this.active === SidebarView.ATTACHMENTS;
    }
  }]);

  return PDFSidebar;
}();

exports.PDFSidebar = PDFSidebar;

/***/ }),
/* 12 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.OptionKind = exports.AppOptions = void 0;

var _pdfjsLib = __webpack_require__(7);

var _viewer_compatibility = __webpack_require__(13);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var OptionKind = {
  VIEWER: 'viewer',
  API: 'api',
  WORKER: 'worker'
};
exports.OptionKind = OptionKind;
var defaultOptions = {
  cursorToolOnLoad: {
    value: 0,
    kind: OptionKind.VIEWER
  },
  defaultUrl: {
    value: 'compressed.tracemonkey-pldi-09.pdf',
    kind: OptionKind.VIEWER
  },
  defaultZoomValue: {
    value: '',
    kind: OptionKind.VIEWER
  },
  disableHistory: {
    value: false,
    kind: OptionKind.VIEWER
  },
  disablePageLabels: {
    value: false,
    kind: OptionKind.VIEWER
  },
  enablePrintAutoRotate: {
    value: false,
    kind: OptionKind.VIEWER
  },
  enableWebGL: {
    value: false,
    kind: OptionKind.VIEWER
  },
  eventBusDispatchToDOM: {
    value: false,
    kind: OptionKind.VIEWER
  },
  externalLinkRel: {
    value: 'noopener noreferrer nofollow',
    kind: OptionKind.VIEWER
  },
  externalLinkTarget: {
    value: 0,
    kind: OptionKind.VIEWER
  },
  historyUpdateUrl: {
    value: false,
    kind: OptionKind.VIEWER
  },
  imageResourcesPath: {
    value: './images/',
    kind: OptionKind.VIEWER
  },
  maxCanvasPixels: {
    value: 16777216,
    compatibility: _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels,
    kind: OptionKind.VIEWER
  },
  pdfBugEnabled: {
    value: false,
    kind: OptionKind.VIEWER
  },
  renderer: {
    value: 'canvas',
    kind: OptionKind.VIEWER
  },
  renderInteractiveForms: {
    value: false,
    kind: OptionKind.VIEWER
  },
  sidebarViewOnLoad: {
    value: -1,
    kind: OptionKind.VIEWER
  },
  scrollModeOnLoad: {
    value: -1,
    kind: OptionKind.VIEWER
  },
  spreadModeOnLoad: {
    value: -1,
    kind: OptionKind.VIEWER
  },
  textLayerMode: {
    value: 1,
    kind: OptionKind.VIEWER
  },
  useOnlyCssZoom: {
    value: false,
    kind: OptionKind.VIEWER
  },
  viewOnLoad: {
    value: 0,
    kind: OptionKind.VIEWER
  },
  cMapPacked: {
    value: true,
    kind: OptionKind.API
  },
  cMapUrl: {
    value: '../web/cmaps/',
    kind: OptionKind.API
  },
  disableAutoFetch: {
    value: false,
    kind: OptionKind.API
  },
  disableCreateObjectURL: {
    value: false,
    compatibility: _pdfjsLib.apiCompatibilityParams.disableCreateObjectURL,
    kind: OptionKind.API
  },
  disableFontFace: {
    value: false,
    kind: OptionKind.API
  },
  disableRange: {
    value: false,
    kind: OptionKind.API
  },
  disableStream: {
    value: false,
    kind: OptionKind.API
  },
  isEvalSupported: {
    value: true,
    kind: OptionKind.API
  },
  maxImageSize: {
    value: -1,
    kind: OptionKind.API
  },
  pdfBug: {
    value: false,
    kind: OptionKind.API
  },
  postMessageTransfers: {
    value: true,
    kind: OptionKind.API
  },
  verbosity: {
    value: 1,
    kind: OptionKind.API
  },
  workerPort: {
    value: null,
    kind: OptionKind.WORKER
  },
  workerSrc: {
    value: '../build/pdf.worker.js',
    kind: OptionKind.WORKER
  }
};
{
  defaultOptions.disablePreferences = {
    value: false,
    kind: OptionKind.VIEWER
  };
  defaultOptions.locale = {
    value: typeof navigator !== 'undefined' ? navigator.language : 'en-US',
    kind: OptionKind.VIEWER
  };
}
var userOptions = Object.create(null);

var AppOptions =
/*#__PURE__*/
function () {
  function AppOptions() {
    _classCallCheck(this, AppOptions);

    throw new Error('Cannot initialize AppOptions.');
  }

  _createClass(AppOptions, null, [{
    key: "get",
    value: function get(name) {
      var userOption = userOptions[name];

      if (userOption !== undefined) {
        return userOption;
      }

      var defaultOption = defaultOptions[name];

      if (defaultOption !== undefined) {
        return defaultOption.compatibility || defaultOption.value;
      }

      return undefined;
    }
  }, {
    key: "getAll",
    value: function getAll() {
      var kind = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
      var options = Object.create(null);

      for (var name in defaultOptions) {
        var defaultOption = defaultOptions[name];

        if (kind && kind !== defaultOption.kind) {
          continue;
        }

        var userOption = userOptions[name];
        options[name] = userOption !== undefined ? userOption : defaultOption.compatibility || defaultOption.value;
      }

      return options;
    }
  }, {
    key: "set",
    value: function set(name, value) {
      userOptions[name] = value;
    }
  }, {
    key: "remove",
    value: function remove(name) {
      delete userOptions[name];
    }
  }]);

  return AppOptions;
}();

exports.AppOptions = AppOptions;

/***/ }),
/* 13 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var compatibilityParams = Object.create(null);
{
  var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || '';
  var isAndroid = /Android/.test(userAgent);
  var isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent);

  (function checkCanvasSizeLimitation() {
    if (isIOS || isAndroid) {
      compatibilityParams.maxCanvasPixels = 5242880;
    }
  })();
}
exports.viewerCompatibilityParams = Object.freeze(compatibilityParams);

/***/ }),
/* 14 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.OverlayManager = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(2));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var OverlayManager =
/*#__PURE__*/
function () {
  function OverlayManager() {
    _classCallCheck(this, OverlayManager);

    this._overlays = {};
    this._active = null;
    this._keyDownBound = this._keyDown.bind(this);
  }

  _createClass(OverlayManager, [{
    key: "register",
    value: function () {
      var _register = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee(name, element) {
        var callerCloseMethod,
            canForceClose,
            container,
            _args = arguments;
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                callerCloseMethod = _args.length > 2 && _args[2] !== undefined ? _args[2] : null;
                canForceClose = _args.length > 3 && _args[3] !== undefined ? _args[3] : false;

                if (!(!name || !element || !(container = element.parentNode))) {
                  _context.next = 6;
                  break;
                }

                throw new Error('Not enough parameters.');

              case 6:
                if (!this._overlays[name]) {
                  _context.next = 8;
                  break;
                }

                throw new Error('The overlay is already registered.');

              case 8:
                this._overlays[name] = {
                  element: element,
                  container: container,
                  callerCloseMethod: callerCloseMethod,
                  canForceClose: canForceClose
                };

              case 9:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function register(_x, _x2) {
        return _register.apply(this, arguments);
      }

      return register;
    }()
  }, {
    key: "unregister",
    value: function () {
      var _unregister = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee2(name) {
        return _regenerator.default.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                if (this._overlays[name]) {
                  _context2.next = 4;
                  break;
                }

                throw new Error('The overlay does not exist.');

              case 4:
                if (!(this._active === name)) {
                  _context2.next = 6;
                  break;
                }

                throw new Error('The overlay cannot be removed while it is active.');

              case 6:
                delete this._overlays[name];

              case 7:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      function unregister(_x3) {
        return _unregister.apply(this, arguments);
      }

      return unregister;
    }()
  }, {
    key: "open",
    value: function () {
      var _open = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee3(name) {
        return _regenerator.default.wrap(function _callee3$(_context3) {
          while (1) {
            switch (_context3.prev = _context3.next) {
              case 0:
                if (this._overlays[name]) {
                  _context3.next = 4;
                  break;
                }

                throw new Error('The overlay does not exist.');

              case 4:
                if (!this._active) {
                  _context3.next = 14;
                  break;
                }

                if (!this._overlays[name].canForceClose) {
                  _context3.next = 9;
                  break;
                }

                this._closeThroughCaller();

                _context3.next = 14;
                break;

              case 9:
                if (!(this._active === name)) {
                  _context3.next = 13;
                  break;
                }

                throw new Error('The overlay is already active.');

              case 13:
                throw new Error('Another overlay is currently active.');

              case 14:
                this._active = name;

                this._overlays[this._active].element.classList.remove('hidden');

                this._overlays[this._active].container.classList.remove('hidden');

                window.addEventListener('keydown', this._keyDownBound);

              case 18:
              case "end":
                return _context3.stop();
            }
          }
        }, _callee3, this);
      }));

      function open(_x4) {
        return _open.apply(this, arguments);
      }

      return open;
    }()
  }, {
    key: "close",
    value: function () {
      var _close = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee4(name) {
        return _regenerator.default.wrap(function _callee4$(_context4) {
          while (1) {
            switch (_context4.prev = _context4.next) {
              case 0:
                if (this._overlays[name]) {
                  _context4.next = 4;
                  break;
                }

                throw new Error('The overlay does not exist.');

              case 4:
                if (this._active) {
                  _context4.next = 8;
                  break;
                }

                throw new Error('The overlay is currently not active.');

              case 8:
                if (!(this._active !== name)) {
                  _context4.next = 10;
                  break;
                }

                throw new Error('Another overlay is currently active.');

              case 10:
                this._overlays[this._active].container.classList.add('hidden');

                this._overlays[this._active].element.classList.add('hidden');

                this._active = null;
                window.removeEventListener('keydown', this._keyDownBound);

              case 14:
              case "end":
                return _context4.stop();
            }
          }
        }, _callee4, this);
      }));

      function close(_x5) {
        return _close.apply(this, arguments);
      }

      return close;
    }()
  }, {
    key: "_keyDown",
    value: function _keyDown(evt) {
      if (this._active && evt.keyCode === 27) {
        this._closeThroughCaller();

        evt.preventDefault();
      }
    }
  }, {
    key: "_closeThroughCaller",
    value: function _closeThroughCaller() {
      if (this._overlays[this._active].callerCloseMethod) {
        this._overlays[this._active].callerCloseMethod();
      }

      if (this._active) {
        this.close(this._active);
      }
    }
  }, {
    key: "active",
    get: function get() {
      return this._active;
    }
  }]);

  return OverlayManager;
}();

exports.OverlayManager = OverlayManager;

/***/ }),
/* 15 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PasswordPrompt = void 0;

var _ui_utils = __webpack_require__(6);

var _pdfjsLib = __webpack_require__(7);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var PasswordPrompt =
/*#__PURE__*/
function () {
  function PasswordPrompt(options, overlayManager) {
    var _this = this;

    var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;

    _classCallCheck(this, PasswordPrompt);

    this.overlayName = options.overlayName;
    this.container = options.container;
    this.label = options.label;
    this.input = options.input;
    this.submitButton = options.submitButton;
    this.cancelButton = options.cancelButton;
    this.overlayManager = overlayManager;
    this.l10n = l10n;
    this.updateCallback = null;
    this.reason = null;
    this.submitButton.addEventListener('click', this.verify.bind(this));
    this.cancelButton.addEventListener('click', this.close.bind(this));
    this.input.addEventListener('keydown', function (e) {
      if (e.keyCode === 13) {
        _this.verify();
      }
    });
    this.overlayManager.register(this.overlayName, this.container, this.close.bind(this), true);
  }

  _createClass(PasswordPrompt, [{
    key: "open",
    value: function open() {
      var _this2 = this;

      this.overlayManager.open(this.overlayName).then(function () {
        _this2.input.focus();

        var promptString;

        if (_this2.reason === _pdfjsLib.PasswordResponses.INCORRECT_PASSWORD) {
          promptString = _this2.l10n.get('password_invalid', null, 'Invalid password. Please try again.');
        } else {
          promptString = _this2.l10n.get('password_label', null, 'Enter the password to open this PDF file.');
        }

        promptString.then(function (msg) {
          _this2.label.textContent = msg;
        });
      });
    }
  }, {
    key: "close",
    value: function close() {
      var _this3 = this;

      this.overlayManager.close(this.overlayName).then(function () {
        _this3.input.value = '';
      });
    }
  }, {
    key: "verify",
    value: function verify() {
      var password = this.input.value;

      if (password && password.length > 0) {
        this.close();
        return this.updateCallback(password);
      }
    }
  }, {
    key: "setUpdateCallback",
    value: function setUpdateCallback(updateCallback, reason) {
      this.updateCallback = updateCallback;
      this.reason = reason;
    }
  }]);

  return PasswordPrompt;
}();

exports.PasswordPrompt = PasswordPrompt;

/***/ }),
/* 16 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFAttachmentViewer = void 0;

var _pdfjsLib = __webpack_require__(7);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var PDFAttachmentViewer =
/*#__PURE__*/
function () {
  function PDFAttachmentViewer(_ref) {
    var container = _ref.container,
        eventBus = _ref.eventBus,
        downloadManager = _ref.downloadManager;

    _classCallCheck(this, PDFAttachmentViewer);

    this.container = container;
    this.eventBus = eventBus;
    this.downloadManager = downloadManager;
    this.reset();
    this.eventBus.on('fileattachmentannotation', this._appendAttachment.bind(this));
  }

  _createClass(PDFAttachmentViewer, [{
    key: "reset",
    value: function reset() {
      var keepRenderedCapability = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
      this.attachments = null;
      this.container.textContent = '';

      if (!keepRenderedCapability) {
        this._renderedCapability = (0, _pdfjsLib.createPromiseCapability)();
      }
    }
  }, {
    key: "_dispatchEvent",
    value: function _dispatchEvent(attachmentsCount) {
      this._renderedCapability.resolve();

      this.eventBus.dispatch('attachmentsloaded', {
        source: this,
        attachmentsCount: attachmentsCount
      });
    }
  }, {
    key: "_bindPdfLink",
    value: function _bindPdfLink(button, content, filename) {
      if (this.downloadManager.disableCreateObjectURL) {
        throw new Error('bindPdfLink: Unsupported "disableCreateObjectURL" value.');
      }

      var blobUrl;

      button.onclick = function () {
        if (!blobUrl) {
          blobUrl = (0, _pdfjsLib.createObjectURL)(content, 'application/pdf');
        }

        var viewerUrl;
        viewerUrl = '?file=' + encodeURIComponent(blobUrl + '#' + filename);
        window.open(viewerUrl);
        return false;
      };
    }
  }, {
    key: "_bindLink",
    value: function _bindLink(button, content, filename) {
      var _this = this;

      button.onclick = function () {
        _this.downloadManager.downloadData(content, filename, '');

        return false;
      };
    }
  }, {
    key: "render",
    value: function render(_ref2) {
      var attachments = _ref2.attachments,
          _ref2$keepRenderedCap = _ref2.keepRenderedCapability,
          keepRenderedCapability = _ref2$keepRenderedCap === void 0 ? false : _ref2$keepRenderedCap;
      var attachmentsCount = 0;

      if (this.attachments) {
        this.reset(keepRenderedCapability === true);
      }

      this.attachments = attachments || null;

      if (!attachments) {
        this._dispatchEvent(attachmentsCount);

        return;
      }

      var names = Object.keys(attachments).sort(function (a, b) {
        return a.toLowerCase().localeCompare(b.toLowerCase());
      });
      attachmentsCount = names.length;

      for (var i = 0; i < attachmentsCount; i++) {
        var item = attachments[names[i]];
        var filename = (0, _pdfjsLib.removeNullCharacters)((0, _pdfjsLib.getFilenameFromUrl)(item.filename));
        var div = document.createElement('div');
        div.className = 'attachmentsItem';
        var button = document.createElement('button');
        button.textContent = filename;

        if (/\.pdf$/i.test(filename) && !this.downloadManager.disableCreateObjectURL) {
          this._bindPdfLink(button, item.content, filename);
        } else {
          this._bindLink(button, item.content, filename);
        }

        div.appendChild(button);
        this.container.appendChild(div);
      }

      this._dispatchEvent(attachmentsCount);
    }
  }, {
    key: "_appendAttachment",
    value: function _appendAttachment(_ref3) {
      var _this2 = this;

      var id = _ref3.id,
          filename = _ref3.filename,
          content = _ref3.content;

      this._renderedCapability.promise.then(function () {
        var attachments = _this2.attachments;

        if (!attachments) {
          attachments = Object.create(null);
        } else {
          for (var name in attachments) {
            if (id === name) {
              return;
            }
          }
        }

        attachments[id] = {
          filename: filename,
          content: content
        };

        _this2.render({
          attachments: attachments,
          keepRenderedCapability: true
        });
      });
    }
  }]);

  return PDFAttachmentViewer;
}();

exports.PDFAttachmentViewer = PDFAttachmentViewer;

/***/ }),
/* 17 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFDocumentProperties = void 0;

var _ui_utils = __webpack_require__(6);

var _pdfjsLib = __webpack_require__(7);

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var DEFAULT_FIELD_CONTENT = '-';
var NON_METRIC_LOCALES = ['en-us', 'en-lr', 'my'];
var US_PAGE_NAMES = {
  '8.5x11': 'Letter',
  '8.5x14': 'Legal'
};
var METRIC_PAGE_NAMES = {
  '297x420': 'A3',
  '210x297': 'A4'
};

function getPageName(size, isPortrait, pageNames) {
  var width = isPortrait ? size.width : size.height;
  var height = isPortrait ? size.height : size.width;
  return pageNames["".concat(width, "x").concat(height)];
}

var PDFDocumentProperties =
/*#__PURE__*/
function () {
  function PDFDocumentProperties(_ref, overlayManager, eventBus) {
    var _this = this;

    var overlayName = _ref.overlayName,
        fields = _ref.fields,
        container = _ref.container,
        closeButton = _ref.closeButton;
    var l10n = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _ui_utils.NullL10n;

    _classCallCheck(this, PDFDocumentProperties);

    this.overlayName = overlayName;
    this.fields = fields;
    this.container = container;
    this.overlayManager = overlayManager;
    this.l10n = l10n;

    this._reset();

    if (closeButton) {
      closeButton.addEventListener('click', this.close.bind(this));
    }

    this.overlayManager.register(this.overlayName, this.container, this.close.bind(this));

    if (eventBus) {
      eventBus.on('pagechanging', function (evt) {
        _this._currentPageNumber = evt.pageNumber;
      });
      eventBus.on('rotationchanging', function (evt) {
        _this._pagesRotation = evt.pagesRotation;
      });
    }

    this._isNonMetricLocale = true;
    l10n.getLanguage().then(function (locale) {
      _this._isNonMetricLocale = NON_METRIC_LOCALES.includes(locale);
    });
  }

  _createClass(PDFDocumentProperties, [{
    key: "open",
    value: function open() {
      var _this2 = this;

      var freezeFieldData = function freezeFieldData(data) {
        Object.defineProperty(_this2, 'fieldData', {
          value: Object.freeze(data),
          writable: false,
          enumerable: true,
          configurable: true
        });
      };

      Promise.all([this.overlayManager.open(this.overlayName), this._dataAvailableCapability.promise]).then(function () {
        var currentPageNumber = _this2._currentPageNumber;
        var pagesRotation = _this2._pagesRotation;

        if (_this2.fieldData && currentPageNumber === _this2.fieldData['_currentPageNumber'] && pagesRotation === _this2.fieldData['_pagesRotation']) {
          _this2._updateUI();

          return;
        }

        _this2.pdfDocument.getMetadata().then(function (_ref2) {
          var info = _ref2.info,
              metadata = _ref2.metadata,
              contentDispositionFilename = _ref2.contentDispositionFilename;
          return Promise.all([info, metadata, contentDispositionFilename || (0, _ui_utils.getPDFFileNameFromURL)(_this2.url || ''), _this2._parseFileSize(_this2.maybeFileSize), _this2._parseDate(info.CreationDate), _this2._parseDate(info.ModDate), _this2.pdfDocument.getPage(currentPageNumber).then(function (pdfPage) {
            return _this2._parsePageSize((0, _ui_utils.getPageSizeInches)(pdfPage), pagesRotation);
          }), _this2._parseLinearization(info.IsLinearized)]);
        }).then(function (_ref3) {
          var _ref4 = _slicedToArray(_ref3, 8),
              info = _ref4[0],
              metadata = _ref4[1],
              fileName = _ref4[2],
              fileSize = _ref4[3],
              creationDate = _ref4[4],
              modDate = _ref4[5],
              pageSize = _ref4[6],
              isLinearized = _ref4[7];

          freezeFieldData({
            'fileName': fileName,
            'fileSize': fileSize,
            'title': info.Title,
            'author': info.Author,
            'subject': info.Subject,
            'keywords': info.Keywords,
            'creationDate': creationDate,
            'modificationDate': modDate,
            'creator': info.Creator,
            'producer': info.Producer,
            'version': info.PDFFormatVersion,
            'pageCount': _this2.pdfDocument.numPages,
            'pageSize': pageSize,
            'linearized': isLinearized,
            '_currentPageNumber': currentPageNumber,
            '_pagesRotation': pagesRotation
          });

          _this2._updateUI();

          return _this2.pdfDocument.getDownloadInfo();
        }).then(function (_ref5) {
          var length = _ref5.length;
          _this2.maybeFileSize = length;
          return _this2._parseFileSize(length);
        }).then(function (fileSize) {
          if (fileSize === _this2.fieldData['fileSize']) {
            return;
          }

          var data = Object.assign(Object.create(null), _this2.fieldData);
          data['fileSize'] = fileSize;
          freezeFieldData(data);

          _this2._updateUI();
        });
      });
    }
  }, {
    key: "close",
    value: function close() {
      this.overlayManager.close(this.overlayName);
    }
  }, {
    key: "setDocument",
    value: function setDocument(pdfDocument) {
      var url = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;

      if (this.pdfDocument) {
        this._reset();

        this._updateUI(true);
      }

      if (!pdfDocument) {
        return;
      }

      this.pdfDocument = pdfDocument;
      this.url = url;

      this._dataAvailableCapability.resolve();
    }
  }, {
    key: "setFileSize",
    value: function setFileSize(fileSize) {
      if (Number.isInteger(fileSize) && fileSize > 0) {
        this.maybeFileSize = fileSize;
      }
    }
  }, {
    key: "_reset",
    value: function _reset() {
      this.pdfDocument = null;
      this.url = null;
      this.maybeFileSize = 0;
      delete this.fieldData;
      this._dataAvailableCapability = (0, _pdfjsLib.createPromiseCapability)();
      this._currentPageNumber = 1;
      this._pagesRotation = 0;
    }
  }, {
    key: "_updateUI",
    value: function _updateUI() {
      var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;

      if (reset || !this.fieldData) {
        for (var id in this.fields) {
          this.fields[id].textContent = DEFAULT_FIELD_CONTENT;
        }

        return;
      }

      if (this.overlayManager.active !== this.overlayName) {
        return;
      }

      for (var _id in this.fields) {
        var content = this.fieldData[_id];
        this.fields[_id].textContent = content || content === 0 ? content : DEFAULT_FIELD_CONTENT;
      }
    }
  }, {
    key: "_parseFileSize",
    value: function _parseFileSize() {
      var fileSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
      var kb = fileSize / 1024;

      if (!kb) {
        return Promise.resolve(undefined);
      } else if (kb < 1024) {
        return this.l10n.get('document_properties_kb', {
          size_kb: (+kb.toPrecision(3)).toLocaleString(),
          size_b: fileSize.toLocaleString()
        }, '{{size_kb}} KB ({{size_b}} bytes)');
      }

      return this.l10n.get('document_properties_mb', {
        size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(),
        size_b: fileSize.toLocaleString()
      }, '{{size_mb}} MB ({{size_b}} bytes)');
    }
  }, {
    key: "_parsePageSize",
    value: function _parsePageSize(pageSizeInches, pagesRotation) {
      var _this3 = this;

      if (!pageSizeInches) {
        return Promise.resolve(undefined);
      }

      if (pagesRotation % 180 !== 0) {
        pageSizeInches = {
          width: pageSizeInches.height,
          height: pageSizeInches.width
        };
      }

      var isPortrait = (0, _ui_utils.isPortraitOrientation)(pageSizeInches);
      var sizeInches = {
        width: Math.round(pageSizeInches.width * 100) / 100,
        height: Math.round(pageSizeInches.height * 100) / 100
      };
      var sizeMillimeters = {
        width: Math.round(pageSizeInches.width * 25.4 * 10) / 10,
        height: Math.round(pageSizeInches.height * 25.4 * 10) / 10
      };
      var pageName = null;
      var name = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES);

      if (!name && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) {
        var exactMillimeters = {
          width: pageSizeInches.width * 25.4,
          height: pageSizeInches.height * 25.4
        };
        var intMillimeters = {
          width: Math.round(sizeMillimeters.width),
          height: Math.round(sizeMillimeters.height)
        };

        if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) {
          name = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES);

          if (name) {
            sizeInches = {
              width: Math.round(intMillimeters.width / 25.4 * 100) / 100,
              height: Math.round(intMillimeters.height / 25.4 * 100) / 100
            };
            sizeMillimeters = intMillimeters;
          }
        }
      }

      if (name) {
        pageName = this.l10n.get('document_properties_page_size_name_' + name.toLowerCase(), null, name);
      }

      return Promise.all([this._isNonMetricLocale ? sizeInches : sizeMillimeters, this.l10n.get('document_properties_page_size_unit_' + (this._isNonMetricLocale ? 'inches' : 'millimeters'), null, this._isNonMetricLocale ? 'in' : 'mm'), pageName, this.l10n.get('document_properties_page_size_orientation_' + (isPortrait ? 'portrait' : 'landscape'), null, isPortrait ? 'portrait' : 'landscape')]).then(function (_ref6) {
        var _ref7 = _slicedToArray(_ref6, 4),
            _ref7$ = _ref7[0],
            width = _ref7$.width,
            height = _ref7$.height,
            unit = _ref7[1],
            name = _ref7[2],
            orientation = _ref7[3];

        return _this3.l10n.get('document_properties_page_size_dimension_' + (name ? 'name_' : '') + 'string', {
          width: width.toLocaleString(),
          height: height.toLocaleString(),
          unit: unit,
          name: name,
          orientation: orientation
        }, '{{width}} Ã— {{height}} {{unit}} (' + (name ? '{{name}}, ' : '') + '{{orientation}})');
      });
    }
  }, {
    key: "_parseDate",
    value: function _parseDate(inputDate) {
      if (!inputDate) {
        return;
      }

      var dateToParse = inputDate;

      if (dateToParse.substring(0, 2) === 'D:') {
        dateToParse = dateToParse.substring(2);
      }

      var year = parseInt(dateToParse.substring(0, 4), 10);
      var month = parseInt(dateToParse.substring(4, 6), 10) - 1;
      var day = parseInt(dateToParse.substring(6, 8), 10);
      var hours = parseInt(dateToParse.substring(8, 10), 10);
      var minutes = parseInt(dateToParse.substring(10, 12), 10);
      var seconds = parseInt(dateToParse.substring(12, 14), 10);
      var utRel = dateToParse.substring(14, 15);
      var offsetHours = parseInt(dateToParse.substring(15, 17), 10);
      var offsetMinutes = parseInt(dateToParse.substring(18, 20), 10);

      if (utRel === '-') {
        hours += offsetHours;
        minutes += offsetMinutes;
      } else if (utRel === '+') {
        hours -= offsetHours;
        minutes -= offsetMinutes;
      }

      var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds));
      var dateString = date.toLocaleDateString();
      var timeString = date.toLocaleTimeString();
      return this.l10n.get('document_properties_date_string', {
        date: dateString,
        time: timeString
      }, '{{date}}, {{time}}');
    }
  }, {
    key: "_parseLinearization",
    value: function _parseLinearization(isLinearized) {
      return this.l10n.get('document_properties_linearized_' + (isLinearized ? 'yes' : 'no'), null, isLinearized ? 'Yes' : 'No');
    }
  }]);

  return PDFDocumentProperties;
}();

exports.PDFDocumentProperties = PDFDocumentProperties;

/***/ }),
/* 18 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFFindBar = void 0;

var _ui_utils = __webpack_require__(6);

var _pdf_find_controller = __webpack_require__(19);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var MATCHES_COUNT_LIMIT = 1000;

var PDFFindBar =
/*#__PURE__*/
function () {
  function PDFFindBar(options) {
    var _this = this;

    var eventBus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _ui_utils.getGlobalEventBus)();
    var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;

    _classCallCheck(this, PDFFindBar);

    this.opened = false;
    this.bar = options.bar || null;
    this.toggleButton = options.toggleButton || null;
    this.findField = options.findField || null;
    this.highlightAll = options.highlightAllCheckbox || null;
    this.caseSensitive = options.caseSensitiveCheckbox || null;
    this.entireWord = options.entireWordCheckbox || null;
    this.findMsg = options.findMsg || null;
    this.findResultsCount = options.findResultsCount || null;
    this.findPreviousButton = options.findPreviousButton || null;
    this.findNextButton = options.findNextButton || null;
    this.eventBus = eventBus;
    this.l10n = l10n;
    this.toggleButton.addEventListener('click', function () {
      _this.toggle();
    });
    this.findField.addEventListener('input', function () {
      _this.dispatchEvent('');
    });
    this.bar.addEventListener('keydown', function (e) {
      switch (e.keyCode) {
        case 13:
          if (e.target === _this.findField) {
            _this.dispatchEvent('again', e.shiftKey);
          }

          break;

        case 27:
          _this.close();

          break;
      }
    });
    this.findPreviousButton.addEventListener('click', function () {
      _this.dispatchEvent('again', true);
    });
    this.findNextButton.addEventListener('click', function () {
      _this.dispatchEvent('again', false);
    });
    this.highlightAll.addEventListener('click', function () {
      _this.dispatchEvent('highlightallchange');
    });
    this.caseSensitive.addEventListener('click', function () {
      _this.dispatchEvent('casesensitivitychange');
    });
    this.entireWord.addEventListener('click', function () {
      _this.dispatchEvent('entirewordchange');
    });
    this.eventBus.on('resize', this._adjustWidth.bind(this));
  }

  _createClass(PDFFindBar, [{
    key: "reset",
    value: function reset() {
      this.updateUIState();
    }
  }, {
    key: "dispatchEvent",
    value: function dispatchEvent(type, findPrev) {
      this.eventBus.dispatch('find', {
        source: this,
        type: type,
        query: this.findField.value,
        phraseSearch: true,
        caseSensitive: this.caseSensitive.checked,
        entireWord: this.entireWord.checked,
        highlightAll: this.highlightAll.checked,
        findPrevious: findPrev
      });
    }
  }, {
    key: "updateUIState",
    value: function updateUIState(state, previous, matchesCount) {
      var _this2 = this;

      var notFound = false;
      var findMsg = '';
      var status = '';

      switch (state) {
        case _pdf_find_controller.FindState.FOUND:
          break;

        case _pdf_find_controller.FindState.PENDING:
          status = 'pending';
          break;

        case _pdf_find_controller.FindState.NOT_FOUND:
          findMsg = this.l10n.get('find_not_found', null, 'Phrase not found');
          notFound = true;
          break;

        case _pdf_find_controller.FindState.WRAPPED:
          if (previous) {
            findMsg = this.l10n.get('find_reached_top', null, 'Reached top of document, continued from bottom');
          } else {
            findMsg = this.l10n.get('find_reached_bottom', null, 'Reached end of document, continued from top');
          }

          break;
      }

      this.findField.classList.toggle('notFound', notFound);
      this.findField.setAttribute('data-status', status);
      Promise.resolve(findMsg).then(function (msg) {
        _this2.findMsg.textContent = msg;

        _this2._adjustWidth();
      });
      this.updateResultsCount(matchesCount);
    }
  }, {
    key: "updateResultsCount",
    value: function updateResultsCount() {
      var _this3 = this;

      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
          _ref$current = _ref.current,
          current = _ref$current === void 0 ? 0 : _ref$current,
          _ref$total = _ref.total,
          total = _ref$total === void 0 ? 0 : _ref$total;

      if (!this.findResultsCount) {
        return;
      }

      var matchesCountMsg = '',
          limit = MATCHES_COUNT_LIMIT;

      if (total > 0) {
        if (total > limit) {
          matchesCountMsg = this.l10n.get('find_match_count_limit', {
            limit: limit
          }, 'More than {{limit}} match' + (limit !== 1 ? 'es' : ''));
        } else {
          matchesCountMsg = this.l10n.get('find_match_count', {
            current: current,
            total: total
          }, '{{current}} of {{total}} match' + (total !== 1 ? 'es' : ''));
        }
      }

      Promise.resolve(matchesCountMsg).then(function (msg) {
        _this3.findResultsCount.textContent = msg;

        _this3.findResultsCount.classList.toggle('hidden', !total);

        _this3._adjustWidth();
      });
    }
  }, {
    key: "open",
    value: function open() {
      if (!this.opened) {
        this.opened = true;
        this.toggleButton.classList.add('toggled');
        this.bar.classList.remove('hidden');
      }

      this.findField.select();
      this.findField.focus();

      this._adjustWidth();
    }
  }, {
    key: "close",
    value: function close() {
      if (!this.opened) {
        return;
      }

      this.opened = false;
      this.toggleButton.classList.remove('toggled');
      this.bar.classList.add('hidden');
      this.eventBus.dispatch('findbarclose', {
        source: this
      });
    }
  }, {
    key: "toggle",
    value: function toggle() {
      if (this.opened) {
        this.close();
      } else {
        this.open();
      }
    }
  }, {
    key: "_adjustWidth",
    value: function _adjustWidth() {
      if (!this.opened) {
        return;
      }

      this.bar.classList.remove('wrapContainers');
      var findbarHeight = this.bar.clientHeight;
      var inputContainerHeight = this.bar.firstElementChild.clientHeight;

      if (findbarHeight > inputContainerHeight) {
        this.bar.classList.add('wrapContainers');
      }
    }
  }]);

  return PDFFindBar;
}();

exports.PDFFindBar = PDFFindBar;

/***/ }),
/* 19 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFFindController = exports.FindState = void 0;

var _ui_utils = __webpack_require__(6);

var _pdfjsLib = __webpack_require__(7);

var _pdf_find_utils = __webpack_require__(20);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var FindState = {
  FOUND: 0,
  NOT_FOUND: 1,
  WRAPPED: 2,
  PENDING: 3
};
exports.FindState = FindState;
var FIND_TIMEOUT = 250;
var MATCH_SCROLL_OFFSET_TOP = -50;
var MATCH_SCROLL_OFFSET_LEFT = -400;
var CHARACTERS_TO_NORMALIZE = {
  "\u2018": '\'',
  "\u2019": '\'',
  "\u201A": '\'',
  "\u201B": '\'',
  "\u201C": '"',
  "\u201D": '"',
  "\u201E": '"',
  "\u201F": '"',
  "\xBC": '1/4',
  "\xBD": '1/2',
  "\xBE": '3/4'
};
var normalizationRegex = null;

function normalize(text) {
  if (!normalizationRegex) {
    var replace = Object.keys(CHARACTERS_TO_NORMALIZE).join('');
    normalizationRegex = new RegExp("[".concat(replace, "]"), 'g');
  }

  return text.replace(normalizationRegex, function (ch) {
    return CHARACTERS_TO_NORMALIZE[ch];
  });
}

var PDFFindController =
/*#__PURE__*/
function () {
  function PDFFindController(_ref) {
    var linkService = _ref.linkService,
        _ref$eventBus = _ref.eventBus,
        eventBus = _ref$eventBus === void 0 ? (0, _ui_utils.getGlobalEventBus)() : _ref$eventBus;

    _classCallCheck(this, PDFFindController);

    this._linkService = linkService;
    this._eventBus = eventBus;

    this._reset();

    eventBus.on('findbarclose', this._onFindBarClose.bind(this));
  }

  _createClass(PDFFindController, [{
    key: "setDocument",
    value: function setDocument(pdfDocument) {
      if (this._pdfDocument) {
        this._reset();
      }

      if (!pdfDocument) {
        return;
      }

      this._pdfDocument = pdfDocument;

      this._firstPageCapability.resolve();
    }
  }, {
    key: "executeCommand",
    value: function executeCommand(cmd, state) {
      var _this = this;

      if (!state) {
        return;
      }

      var pdfDocument = this._pdfDocument;

      if (this._state === null || this._shouldDirtyMatch(cmd, state)) {
        this._dirtyMatch = true;
      }

      this._state = state;

      if (cmd !== 'findhighlightallchange') {
        this._updateUIState(FindState.PENDING);
      }

      this._firstPageCapability.promise.then(function () {
        if (!_this._pdfDocument || pdfDocument && _this._pdfDocument !== pdfDocument) {
          return;
        }

        _this._extractText();

        var findbarClosed = !_this._highlightMatches;
        var pendingTimeout = !!_this._findTimeout;

        if (_this._findTimeout) {
          clearTimeout(_this._findTimeout);
          _this._findTimeout = null;
        }

        if (cmd === 'find') {
          _this._findTimeout = setTimeout(function () {
            _this._nextMatch();

            _this._findTimeout = null;
          }, FIND_TIMEOUT);
        } else if (_this._dirtyMatch) {
          _this._nextMatch();
        } else if (cmd === 'findagain') {
          _this._nextMatch();

          if (findbarClosed && _this._state.highlightAll) {
            _this._updateAllPages();
          }
        } else if (cmd === 'findhighlightallchange') {
          if (pendingTimeout) {
            _this._nextMatch();
          } else {
            _this._highlightMatches = true;
          }

          _this._updateAllPages();
        } else {
          _this._nextMatch();
        }
      });
    }
  }, {
    key: "scrollMatchIntoView",
    value: function scrollMatchIntoView(_ref2) {
      var _ref2$element = _ref2.element,
          element = _ref2$element === void 0 ? null : _ref2$element,
          _ref2$pageIndex = _ref2.pageIndex,
          pageIndex = _ref2$pageIndex === void 0 ? -1 : _ref2$pageIndex,
          _ref2$matchIndex = _ref2.matchIndex,
          matchIndex = _ref2$matchIndex === void 0 ? -1 : _ref2$matchIndex;

      if (!this._scrollMatches || !element) {
        return;
      } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) {
        return;
      } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) {
        return;
      }

      this._scrollMatches = false;
      var spot = {
        top: MATCH_SCROLL_OFFSET_TOP,
        left: MATCH_SCROLL_OFFSET_LEFT
      };
      (0, _ui_utils.scrollIntoView)(element, spot, true);
    }
  }, {
    key: "_reset",
    value: function _reset() {
      this._highlightMatches = false;
      this._scrollMatches = false;
      this._pdfDocument = null;
      this._pageMatches = [];
      this._pageMatchesLength = [];
      this._state = null;
      this._selected = {
        pageIdx: -1,
        matchIdx: -1
      };
      this._offset = {
        pageIdx: null,
        matchIdx: null,
        wrapped: false
      };
      this._extractTextPromises = [];
      this._pageContents = [];
      this._matchesCountTotal = 0;
      this._pagesToSearch = null;
      this._pendingFindMatches = Object.create(null);
      this._resumePageIdx = null;
      this._dirtyMatch = false;
      clearTimeout(this._findTimeout);
      this._findTimeout = null;
      this._firstPageCapability = (0, _pdfjsLib.createPromiseCapability)();
    }
  }, {
    key: "_shouldDirtyMatch",
    value: function _shouldDirtyMatch(cmd, state) {
      if (state.query !== this._state.query) {
        return true;
      }

      switch (cmd) {
        case 'findagain':
          var pageNumber = this._selected.pageIdx + 1;
          var linkService = this._linkService;

          if (pageNumber >= 1 && pageNumber <= linkService.pagesCount && linkService.page !== pageNumber && linkService.isPageVisible && !linkService.isPageVisible(pageNumber)) {
            break;
          }

          return false;

        case 'findhighlightallchange':
          return false;
      }

      return true;
    }
  }, {
    key: "_prepareMatches",
    value: function _prepareMatches(matchesWithLength, matches, matchesLength) {
      function isSubTerm(matchesWithLength, currentIndex) {
        var currentElem = matchesWithLength[currentIndex];
        var nextElem = matchesWithLength[currentIndex + 1];

        if (currentIndex < matchesWithLength.length - 1 && currentElem.match === nextElem.match) {
          currentElem.skipped = true;
          return true;
        }

        for (var i = currentIndex - 1; i >= 0; i--) {
          var prevElem = matchesWithLength[i];

          if (prevElem.skipped) {
            continue;
          }

          if (prevElem.match + prevElem.matchLength < currentElem.match) {
            break;
          }

          if (prevElem.match + prevElem.matchLength >= currentElem.match + currentElem.matchLength) {
            currentElem.skipped = true;
            return true;
          }
        }

        return false;
      }

      matchesWithLength.sort(function (a, b) {
        return a.match === b.match ? a.matchLength - b.matchLength : a.match - b.match;
      });

      for (var i = 0, len = matchesWithLength.length; i < len; i++) {
        if (isSubTerm(matchesWithLength, i)) {
          continue;
        }

        matches.push(matchesWithLength[i].match);
        matchesLength.push(matchesWithLength[i].matchLength);
      }
    }
  }, {
    key: "_isEntireWord",
    value: function _isEntireWord(content, startIdx, length) {
      if (startIdx > 0) {
        var first = content.charCodeAt(startIdx);
        var limit = content.charCodeAt(startIdx - 1);

        if ((0, _pdf_find_utils.getCharacterType)(first) === (0, _pdf_find_utils.getCharacterType)(limit)) {
          return false;
        }
      }

      var endIdx = startIdx + length - 1;

      if (endIdx < content.length - 1) {
        var last = content.charCodeAt(endIdx);

        var _limit = content.charCodeAt(endIdx + 1);

        if ((0, _pdf_find_utils.getCharacterType)(last) === (0, _pdf_find_utils.getCharacterType)(_limit)) {
          return false;
        }
      }

      return true;
    }
  }, {
    key: "_calculatePhraseMatch",
    value: function _calculatePhraseMatch(query, pageIndex, pageContent, entireWord) {
      var matches = [];
      var queryLen = query.length;
      var matchIdx = -queryLen;

      while (true) {
        matchIdx = pageContent.indexOf(query, matchIdx + queryLen);

        if (matchIdx === -1) {
          break;
        }

        if (entireWord && !this._isEntireWord(pageContent, matchIdx, queryLen)) {
          continue;
        }

        matches.push(matchIdx);
      }

      this._pageMatches[pageIndex] = matches;
    }
  }, {
    key: "_calculateWordMatch",
    value: function _calculateWordMatch(query, pageIndex, pageContent, entireWord) {
      var matchesWithLength = [];
      var queryArray = query.match(/\S+/g);

      for (var i = 0, len = queryArray.length; i < len; i++) {
        var subquery = queryArray[i];
        var subqueryLen = subquery.length;
        var matchIdx = -subqueryLen;

        while (true) {
          matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen);

          if (matchIdx === -1) {
            break;
          }

          if (entireWord && !this._isEntireWord(pageContent, matchIdx, subqueryLen)) {
            continue;
          }

          matchesWithLength.push({
            match: matchIdx,
            matchLength: subqueryLen,
            skipped: false
          });
        }
      }

      this._pageMatchesLength[pageIndex] = [];
      this._pageMatches[pageIndex] = [];

      this._prepareMatches(matchesWithLength, this._pageMatches[pageIndex], this._pageMatchesLength[pageIndex]);
    }
  }, {
    key: "_calculateMatch",
    value: function _calculateMatch(pageIndex) {
      var pageContent = this._pageContents[pageIndex];
      var query = this._query;
      var _this$_state = this._state,
          caseSensitive = _this$_state.caseSensitive,
          entireWord = _this$_state.entireWord,
          phraseSearch = _this$_state.phraseSearch;

      if (query.length === 0) {
        return;
      }

      if (!caseSensitive) {
        pageContent = pageContent.toLowerCase();
        query = query.toLowerCase();
      }

      if (phraseSearch) {
        this._calculatePhraseMatch(query, pageIndex, pageContent, entireWord);
      } else {
        this._calculateWordMatch(query, pageIndex, pageContent, entireWord);
      }

      if (this._state.highlightAll) {
        this._updatePage(pageIndex);
      }

      if (this._resumePageIdx === pageIndex) {
        this._resumePageIdx = null;

        this._nextPageMatch();
      }

      var pageMatchesCount = this._pageMatches[pageIndex].length;

      if (pageMatchesCount > 0) {
        this._matchesCountTotal += pageMatchesCount;

        this._updateUIResultsCount();
      }
    }
  }, {
    key: "_extractText",
    value: function _extractText() {
      var _this2 = this;

      if (this._extractTextPromises.length > 0) {
        return;
      }

      var promise = Promise.resolve();

      var _loop = function _loop(i, ii) {
        var extractTextCapability = (0, _pdfjsLib.createPromiseCapability)();
        _this2._extractTextPromises[i] = extractTextCapability.promise;
        promise = promise.then(function () {
          return _this2._pdfDocument.getPage(i + 1).then(function (pdfPage) {
            return pdfPage.getTextContent({
              normalizeWhitespace: true
            });
          }).then(function (textContent) {
            var textItems = textContent.items;
            var strBuf = [];

            for (var j = 0, jj = textItems.length; j < jj; j++) {
              strBuf.push(textItems[j].str);
            }

            _this2._pageContents[i] = normalize(strBuf.join(''));
            extractTextCapability.resolve(i);
          }, function (reason) {
            console.error("Unable to get text content for page ".concat(i + 1), reason);
            _this2._pageContents[i] = '';
            extractTextCapability.resolve(i);
          });
        });
      };

      for (var i = 0, ii = this._linkService.pagesCount; i < ii; i++) {
        _loop(i, ii);
      }
    }
  }, {
    key: "_updatePage",
    value: function _updatePage(index) {
      if (this._scrollMatches && this._selected.pageIdx === index) {
        this._linkService.page = index + 1;
      }

      this._eventBus.dispatch('updatetextlayermatches', {
        source: this,
        pageIndex: index
      });
    }
  }, {
    key: "_updateAllPages",
    value: function _updateAllPages() {
      this._eventBus.dispatch('updatetextlayermatches', {
        source: this,
        pageIndex: -1
      });
    }
  }, {
    key: "_nextMatch",
    value: function _nextMatch() {
      var _this3 = this;

      var previous = this._state.findPrevious;
      var currentPageIndex = this._linkService.page - 1;
      var numPages = this._linkService.pagesCount;
      this._highlightMatches = true;

      if (this._dirtyMatch) {
        this._dirtyMatch = false;
        this._selected.pageIdx = this._selected.matchIdx = -1;
        this._offset.pageIdx = currentPageIndex;
        this._offset.matchIdx = null;
        this._offset.wrapped = false;
        this._resumePageIdx = null;
        this._pageMatches.length = 0;
        this._pageMatchesLength.length = 0;
        this._matchesCountTotal = 0;

        this._updateAllPages();

        for (var i = 0; i < numPages; i++) {
          if (this._pendingFindMatches[i] === true) {
            continue;
          }

          this._pendingFindMatches[i] = true;

          this._extractTextPromises[i].then(function (pageIdx) {
            delete _this3._pendingFindMatches[pageIdx];

            _this3._calculateMatch(pageIdx);
          });
        }
      }

      if (this._query === '') {
        this._updateUIState(FindState.FOUND);

        return;
      }

      if (this._resumePageIdx) {
        return;
      }

      var offset = this._offset;
      this._pagesToSearch = numPages;

      if (offset.matchIdx !== null) {
        var numPageMatches = this._pageMatches[offset.pageIdx].length;

        if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) {
          offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;

          this._updateMatch(true);

          return;
        }

        this._advanceOffsetPage(previous);
      }

      this._nextPageMatch();
    }
  }, {
    key: "_matchesReady",
    value: function _matchesReady(matches) {
      var offset = this._offset;
      var numMatches = matches.length;
      var previous = this._state.findPrevious;

      if (numMatches) {
        offset.matchIdx = previous ? numMatches - 1 : 0;

        this._updateMatch(true);

        return true;
      }

      this._advanceOffsetPage(previous);

      if (offset.wrapped) {
        offset.matchIdx = null;

        if (this._pagesToSearch < 0) {
          this._updateMatch(false);

          return true;
        }
      }

      return false;
    }
  }, {
    key: "_nextPageMatch",
    value: function _nextPageMatch() {
      if (this._resumePageIdx !== null) {
        console.error('There can only be one pending page.');
      }

      var matches = null;

      do {
        var pageIdx = this._offset.pageIdx;
        matches = this._pageMatches[pageIdx];

        if (!matches) {
          this._resumePageIdx = pageIdx;
          break;
        }
      } while (!this._matchesReady(matches));
    }
  }, {
    key: "_advanceOffsetPage",
    value: function _advanceOffsetPage(previous) {
      var offset = this._offset;
      var numPages = this._linkService.pagesCount;
      offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;
      offset.matchIdx = null;
      this._pagesToSearch--;

      if (offset.pageIdx >= numPages || offset.pageIdx < 0) {
        offset.pageIdx = previous ? numPages - 1 : 0;
        offset.wrapped = true;
      }
    }
  }, {
    key: "_updateMatch",
    value: function _updateMatch() {
      var found = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
      var state = FindState.NOT_FOUND;
      var wrapped = this._offset.wrapped;
      this._offset.wrapped = false;

      if (found) {
        var previousPage = this._selected.pageIdx;
        this._selected.pageIdx = this._offset.pageIdx;
        this._selected.matchIdx = this._offset.matchIdx;
        state = wrapped ? FindState.WRAPPED : FindState.FOUND;

        if (previousPage !== -1 && previousPage !== this._selected.pageIdx) {
          this._updatePage(previousPage);
        }
      }

      this._updateUIState(state, this._state.findPrevious);

      if (this._selected.pageIdx !== -1) {
        this._scrollMatches = true;

        this._updatePage(this._selected.pageIdx);
      }
    }
  }, {
    key: "_onFindBarClose",
    value: function _onFindBarClose(evt) {
      var _this4 = this;

      var pdfDocument = this._pdfDocument;

      this._firstPageCapability.promise.then(function () {
        if (!_this4._pdfDocument || pdfDocument && _this4._pdfDocument !== pdfDocument) {
          return;
        }

        if (_this4._findTimeout) {
          clearTimeout(_this4._findTimeout);
          _this4._findTimeout = null;
        }

        if (_this4._resumePageIdx) {
          _this4._resumePageIdx = null;
          _this4._dirtyMatch = true;
        }

        _this4._updateUIState(FindState.FOUND);

        _this4._highlightMatches = false;

        _this4._updateAllPages();
      });
    }
  }, {
    key: "_requestMatchesCount",
    value: function _requestMatchesCount() {
      var _this$_selected = this._selected,
          pageIdx = _this$_selected.pageIdx,
          matchIdx = _this$_selected.matchIdx;
      var current = 0,
          total = this._matchesCountTotal;

      if (matchIdx !== -1) {
        for (var i = 0; i < pageIdx; i++) {
          current += this._pageMatches[i] && this._pageMatches[i].length || 0;
        }

        current += matchIdx + 1;
      }

      if (current < 1 || current > total) {
        current = total = 0;
      }

      return {
        current: current,
        total: total
      };
    }
  }, {
    key: "_updateUIResultsCount",
    value: function _updateUIResultsCount() {
      this._eventBus.dispatch('updatefindmatchescount', {
        source: this,
        matchesCount: this._requestMatchesCount()
      });
    }
  }, {
    key: "_updateUIState",
    value: function _updateUIState(state, previous) {
      this._eventBus.dispatch('updatefindcontrolstate', {
        source: this,
        state: state,
        previous: previous,
        matchesCount: this._requestMatchesCount()
      });
    }
  }, {
    key: "highlightMatches",
    get: function get() {
      return this._highlightMatches;
    }
  }, {
    key: "pageMatches",
    get: function get() {
      return this._pageMatches;
    }
  }, {
    key: "pageMatchesLength",
    get: function get() {
      return this._pageMatchesLength;
    }
  }, {
    key: "selected",
    get: function get() {
      return this._selected;
    }
  }, {
    key: "state",
    get: function get() {
      return this._state;
    }
  }, {
    key: "_query",
    get: function get() {
      if (this._state.query !== this._rawQuery) {
        this._rawQuery = this._state.query;
        this._normalizedQuery = normalize(this._state.query);
      }

      return this._normalizedQuery;
    }
  }]);

  return PDFFindController;
}();

exports.PDFFindController = PDFFindController;

/***/ }),
/* 20 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getCharacterType = getCharacterType;
exports.CharacterType = void 0;
var CharacterType = {
  SPACE: 0,
  ALPHA_LETTER: 1,
  PUNCT: 2,
  HAN_LETTER: 3,
  KATAKANA_LETTER: 4,
  HIRAGANA_LETTER: 5,
  HALFWIDTH_KATAKANA_LETTER: 6,
  THAI_LETTER: 7
};
exports.CharacterType = CharacterType;

function isAlphabeticalScript(charCode) {
  return charCode < 0x2E80;
}

function isAscii(charCode) {
  return (charCode & 0xFF80) === 0;
}

function isAsciiAlpha(charCode) {
  return charCode >= 0x61 && charCode <= 0x7A || charCode >= 0x41 && charCode <= 0x5A;
}

function isAsciiDigit(charCode) {
  return charCode >= 0x30 && charCode <= 0x39;
}

function isAsciiSpace(charCode) {
  return charCode === 0x20 || charCode === 0x09 || charCode === 0x0D || charCode === 0x0A;
}

function isHan(charCode) {
  return charCode >= 0x3400 && charCode <= 0x9FFF || charCode >= 0xF900 && charCode <= 0xFAFF;
}

function isKatakana(charCode) {
  return charCode >= 0x30A0 && charCode <= 0x30FF;
}

function isHiragana(charCode) {
  return charCode >= 0x3040 && charCode <= 0x309F;
}

function isHalfwidthKatakana(charCode) {
  return charCode >= 0xFF60 && charCode <= 0xFF9F;
}

function isThai(charCode) {
  return (charCode & 0xFF80) === 0x0E00;
}

function getCharacterType(charCode) {
  if (isAlphabeticalScript(charCode)) {
    if (isAscii(charCode)) {
      if (isAsciiSpace(charCode)) {
        return CharacterType.SPACE;
      } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5F) {
        return CharacterType.ALPHA_LETTER;
      }

      return CharacterType.PUNCT;
    } else if (isThai(charCode)) {
      return CharacterType.THAI_LETTER;
    } else if (charCode === 0xA0) {
      return CharacterType.SPACE;
    }

    return CharacterType.ALPHA_LETTER;
  }

  if (isHan(charCode)) {
    return CharacterType.HAN_LETTER;
  } else if (isKatakana(charCode)) {
    return CharacterType.KATAKANA_LETTER;
  } else if (isHiragana(charCode)) {
    return CharacterType.HIRAGANA_LETTER;
  } else if (isHalfwidthKatakana(charCode)) {
    return CharacterType.HALFWIDTH_KATAKANA_LETTER;
  }

  return CharacterType.ALPHA_LETTER;
}

/***/ }),
/* 21 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isDestHashesEqual = isDestHashesEqual;
exports.isDestArraysEqual = isDestArraysEqual;
exports.PDFHistory = void 0;

var _ui_utils = __webpack_require__(6);

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var HASH_CHANGE_TIMEOUT = 1000;
var POSITION_UPDATED_THRESHOLD = 50;
var UPDATE_VIEWAREA_TIMEOUT = 1000;

function getCurrentHash() {
  return document.location.hash;
}

function parseCurrentHash(linkService) {
  var hash = unescape(getCurrentHash()).substring(1);
  var params = (0, _ui_utils.parseQueryString)(hash);
  var page = params.page | 0;

  if (!(Number.isInteger(page) && page > 0 && page <= linkService.pagesCount)) {
    page = null;
  }

  return {
    hash: hash,
    page: page,
    rotation: linkService.rotation
  };
}

var PDFHistory =
/*#__PURE__*/
function () {
  function PDFHistory(_ref) {
    var _this = this;

    var linkService = _ref.linkService,
        eventBus = _ref.eventBus;

    _classCallCheck(this, PDFHistory);

    this.linkService = linkService;
    this.eventBus = eventBus || (0, _ui_utils.getGlobalEventBus)();
    this.initialized = false;
    this.initialBookmark = null;
    this.initialRotation = null;
    this._boundEvents = Object.create(null);
    this._isViewerInPresentationMode = false;
    this._isPagesLoaded = false;
    this.eventBus.on('presentationmodechanged', function (evt) {
      _this._isViewerInPresentationMode = evt.active || evt.switchInProgress;
    });
    this.eventBus.on('pagesloaded', function (evt) {
      _this._isPagesLoaded = !!evt.pagesCount;
    });
  }

  _createClass(PDFHistory, [{
    key: "initialize",
    value: function initialize(_ref2) {
      var fingerprint = _ref2.fingerprint,
          _ref2$resetHistory = _ref2.resetHistory,
          resetHistory = _ref2$resetHistory === void 0 ? false : _ref2$resetHistory,
          _ref2$updateUrl = _ref2.updateUrl,
          updateUrl = _ref2$updateUrl === void 0 ? false : _ref2$updateUrl;

      if (!fingerprint || typeof fingerprint !== 'string') {
        console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.');
        return;
      }

      var reInitialized = this.initialized && this.fingerprint !== fingerprint;
      this.fingerprint = fingerprint;
      this._updateUrl = updateUrl === true;

      if (!this.initialized) {
        this._bindEvents();
      }

      var state = window.history.state;
      this.initialized = true;
      this.initialBookmark = null;
      this.initialRotation = null;
      this._popStateInProgress = false;
      this._blockHashChange = 0;
      this._currentHash = getCurrentHash();
      this._numPositionUpdates = 0;
      this._uid = this._maxUid = 0;
      this._destination = null;
      this._position = null;

      if (!this._isValidState(state, true) || resetHistory) {
        var _parseCurrentHash = parseCurrentHash(this.linkService),
            hash = _parseCurrentHash.hash,
            page = _parseCurrentHash.page,
            rotation = _parseCurrentHash.rotation;

        if (!hash || reInitialized || resetHistory) {
          this._pushOrReplaceState(null, true);

          return;
        }

        this._pushOrReplaceState({
          hash: hash,
          page: page,
          rotation: rotation
        }, true);

        return;
      }

      var destination = state.destination;

      this._updateInternalState(destination, state.uid, true);

      if (this._uid > this._maxUid) {
        this._maxUid = this._uid;
      }

      if (destination.rotation !== undefined) {
        this.initialRotation = destination.rotation;
      }

      if (destination.dest) {
        this.initialBookmark = JSON.stringify(destination.dest);
        this._destination.page = null;
      } else if (destination.hash) {
        this.initialBookmark = destination.hash;
      } else if (destination.page) {
        this.initialBookmark = "page=".concat(destination.page);
      }
    }
  }, {
    key: "push",
    value: function push(_ref3) {
      var _this2 = this;

      var _ref3$namedDest = _ref3.namedDest,
          namedDest = _ref3$namedDest === void 0 ? null : _ref3$namedDest,
          explicitDest = _ref3.explicitDest,
          pageNumber = _ref3.pageNumber;

      if (!this.initialized) {
        return;
      }

      if (namedDest && typeof namedDest !== 'string') {
        console.error('PDFHistory.push: ' + "\"".concat(namedDest, "\" is not a valid namedDest parameter."));
        return;
      } else if (!Array.isArray(explicitDest)) {
        console.error('PDFHistory.push: ' + "\"".concat(explicitDest, "\" is not a valid explicitDest parameter."));
        return;
      } else if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.linkService.pagesCount)) {
        if (pageNumber !== null || this._destination) {
          console.error('PDFHistory.push: ' + "\"".concat(pageNumber, "\" is not a valid pageNumber parameter."));
          return;
        }
      }

      var hash = namedDest || JSON.stringify(explicitDest);

      if (!hash) {
        return;
      }

      var forceReplace = false;

      if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || isDestArraysEqual(this._destination.dest, explicitDest))) {
        if (this._destination.page) {
          return;
        }

        forceReplace = true;
      }

      if (this._popStateInProgress && !forceReplace) {
        return;
      }

      this._pushOrReplaceState({
        dest: explicitDest,
        hash: hash,
        page: pageNumber,
        rotation: this.linkService.rotation
      }, forceReplace);

      if (!this._popStateInProgress) {
        this._popStateInProgress = true;
        Promise.resolve().then(function () {
          _this2._popStateInProgress = false;
        });
      }
    }
  }, {
    key: "pushCurrentPosition",
    value: function pushCurrentPosition() {
      if (!this.initialized || this._popStateInProgress) {
        return;
      }

      this._tryPushCurrentPosition();
    }
  }, {
    key: "back",
    value: function back() {
      if (!this.initialized || this._popStateInProgress) {
        return;
      }

      var state = window.history.state;

      if (this._isValidState(state) && state.uid > 0) {
        window.history.back();
      }
    }
  }, {
    key: "forward",
    value: function forward() {
      if (!this.initialized || this._popStateInProgress) {
        return;
      }

      var state = window.history.state;

      if (this._isValidState(state) && state.uid < this._maxUid) {
        window.history.forward();
      }
    }
  }, {
    key: "_pushOrReplaceState",
    value: function _pushOrReplaceState(destination) {
      var forceReplace = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      var shouldReplace = forceReplace || !this._destination;
      var newState = {
        fingerprint: this.fingerprint,
        uid: shouldReplace ? this._uid : this._uid + 1,
        destination: destination
      };

      this._updateInternalState(destination, newState.uid);

      var newUrl;

      if (this._updateUrl && destination && destination.hash) {
        var baseUrl = document.location.href.split('#')[0];

        if (!baseUrl.startsWith('file://')) {
          newUrl = "".concat(baseUrl, "#").concat(destination.hash);
        }
      }

      if (shouldReplace) {
        if (newUrl) {
          window.history.replaceState(newState, '', newUrl);
        } else {
          window.history.replaceState(newState, '');
        }
      } else {
        this._maxUid = this._uid;

        if (newUrl) {
          window.history.pushState(newState, '', newUrl);
        } else {
          window.history.pushState(newState, '');
        }
      }
    }
  }, {
    key: "_tryPushCurrentPosition",
    value: function _tryPushCurrentPosition() {
      var temporary = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;

      if (!this._position) {
        return;
      }

      var position = this._position;

      if (temporary) {
        position = Object.assign(Object.create(null), this._position);
        position.temporary = true;
      }

      if (!this._destination) {
        this._pushOrReplaceState(position);

        return;
      }

      if (this._destination.temporary) {
        this._pushOrReplaceState(position, true);

        return;
      }

      if (this._destination.hash === position.hash) {
        return;
      }

      if (!this._destination.page && (POSITION_UPDATED_THRESHOLD <= 0 || this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)) {
        return;
      }

      var forceReplace = false;

      if (this._destination.page >= position.first && this._destination.page <= position.page) {
        if (this._destination.dest || !this._destination.first) {
          return;
        }

        forceReplace = true;
      }

      this._pushOrReplaceState(position, forceReplace);
    }
  }, {
    key: "_isValidState",
    value: function _isValidState(state) {
      var checkReload = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;

      if (!state) {
        return false;
      }

      if (state.fingerprint !== this.fingerprint) {
        if (checkReload) {
          if (typeof state.fingerprint !== 'string' || state.fingerprint.length !== this.fingerprint.length) {
            return false;
          }

          var _performance$getEntri = performance.getEntriesByType('navigation'),
              _performance$getEntri2 = _slicedToArray(_performance$getEntri, 1),
              perfEntry = _performance$getEntri2[0];

          if (!perfEntry || perfEntry.type !== 'reload') {
            return false;
          }
        } else {
          return false;
        }
      }

      if (!Number.isInteger(state.uid) || state.uid < 0) {
        return false;
      }

      if (state.destination === null || _typeof(state.destination) !== 'object') {
        return false;
      }

      return true;
    }
  }, {
    key: "_updateInternalState",
    value: function _updateInternalState(destination, uid) {
      var removeTemporary = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;

      if (this._updateViewareaTimeout) {
        clearTimeout(this._updateViewareaTimeout);
        this._updateViewareaTimeout = null;
      }

      if (removeTemporary && destination && destination.temporary) {
        delete destination.temporary;
      }

      this._destination = destination;
      this._uid = uid;
      this._numPositionUpdates = 0;
    }
  }, {
    key: "_updateViewarea",
    value: function _updateViewarea(_ref4) {
      var _this3 = this;

      var location = _ref4.location;

      if (this._updateViewareaTimeout) {
        clearTimeout(this._updateViewareaTimeout);
        this._updateViewareaTimeout = null;
      }

      this._position = {
        hash: this._isViewerInPresentationMode ? "page=".concat(location.pageNumber) : location.pdfOpenParams.substring(1),
        page: this.linkService.page,
        first: location.pageNumber,
        rotation: location.rotation
      };

      if (this._popStateInProgress) {
        return;
      }

      if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded && this._destination && !this._destination.page) {
        this._numPositionUpdates++;
      }

      if (UPDATE_VIEWAREA_TIMEOUT > 0) {
        this._updateViewareaTimeout = setTimeout(function () {
          if (!_this3._popStateInProgress) {
            _this3._tryPushCurrentPosition(true);
          }

          _this3._updateViewareaTimeout = null;
        }, UPDATE_VIEWAREA_TIMEOUT);
      }
    }
  }, {
    key: "_popState",
    value: function _popState(_ref5) {
      var _this4 = this;

      var state = _ref5.state;
      var newHash = getCurrentHash(),
          hashChanged = this._currentHash !== newHash;
      this._currentHash = newHash;

      if (!state || false) {
        this._uid++;

        var _parseCurrentHash2 = parseCurrentHash(this.linkService),
            hash = _parseCurrentHash2.hash,
            page = _parseCurrentHash2.page,
            rotation = _parseCurrentHash2.rotation;

        this._pushOrReplaceState({
          hash: hash,
          page: page,
          rotation: rotation
        }, true);

        return;
      }

      if (!this._isValidState(state)) {
        return;
      }

      this._popStateInProgress = true;

      if (hashChanged) {
        this._blockHashChange++;
        (0, _ui_utils.waitOnEventOrTimeout)({
          target: window,
          name: 'hashchange',
          delay: HASH_CHANGE_TIMEOUT
        }).then(function () {
          _this4._blockHashChange--;
        });
      }

      var destination = state.destination;

      this._updateInternalState(destination, state.uid, true);

      if (this._uid > this._maxUid) {
        this._maxUid = this._uid;
      }

      if ((0, _ui_utils.isValidRotation)(destination.rotation)) {
        this.linkService.rotation = destination.rotation;
      }

      if (destination.dest) {
        this.linkService.navigateTo(destination.dest);
      } else if (destination.hash) {
        this.linkService.setHash(destination.hash);
      } else if (destination.page) {
        this.linkService.page = destination.page;
      }

      Promise.resolve().then(function () {
        _this4._popStateInProgress = false;
      });
    }
  }, {
    key: "_bindEvents",
    value: function _bindEvents() {
      var _this5 = this;

      var _boundEvents = this._boundEvents,
          eventBus = this.eventBus;
      _boundEvents.updateViewarea = this._updateViewarea.bind(this);
      _boundEvents.popState = this._popState.bind(this);

      _boundEvents.pageHide = function (evt) {
        if (!_this5._destination || _this5._destination.temporary) {
          _this5._tryPushCurrentPosition();
        }
      };

      eventBus.on('updateviewarea', _boundEvents.updateViewarea);
      window.addEventListener('popstate', _boundEvents.popState);
      window.addEventListener('pagehide', _boundEvents.pageHide);
    }
  }, {
    key: "popStateInProgress",
    get: function get() {
      return this.initialized && (this._popStateInProgress || this._blockHashChange > 0);
    }
  }]);

  return PDFHistory;
}();

exports.PDFHistory = PDFHistory;

function isDestHashesEqual(destHash, pushHash) {
  if (typeof destHash !== 'string' || typeof pushHash !== 'string') {
    return false;
  }

  if (destHash === pushHash) {
    return true;
  }

  var _parseQueryString = (0, _ui_utils.parseQueryString)(destHash),
      nameddest = _parseQueryString.nameddest;

  if (nameddest === pushHash) {
    return true;
  }

  return false;
}

function isDestArraysEqual(firstDest, secondDest) {
  function isEntryEqual(first, second) {
    if (_typeof(first) !== _typeof(second)) {
      return false;
    }

    if (Array.isArray(first) || Array.isArray(second)) {
      return false;
    }

    if (first !== null && _typeof(first) === 'object' && second !== null) {
      if (Object.keys(first).length !== Object.keys(second).length) {
        return false;
      }

      for (var key in first) {
        if (!isEntryEqual(first[key], second[key])) {
          return false;
        }
      }

      return true;
    }

    return first === second || Number.isNaN(first) && Number.isNaN(second);
  }

  if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) {
    return false;
  }

  if (firstDest.length !== secondDest.length) {
    return false;
  }

  for (var i = 0, ii = firstDest.length; i < ii; i++) {
    if (!isEntryEqual(firstDest[i], secondDest[i])) {
      return false;
    }
  }

  return true;
}

/***/ }),
/* 22 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.SimpleLinkService = exports.PDFLinkService = void 0;

var _ui_utils = __webpack_require__(6);

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var PDFLinkService =
/*#__PURE__*/
function () {
  function PDFLinkService() {
    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
        eventBus = _ref.eventBus,
        _ref$externalLinkTarg = _ref.externalLinkTarget,
        externalLinkTarget = _ref$externalLinkTarg === void 0 ? null : _ref$externalLinkTarg,
        _ref$externalLinkRel = _ref.externalLinkRel,
        externalLinkRel = _ref$externalLinkRel === void 0 ? null : _ref$externalLinkRel;

    _classCallCheck(this, PDFLinkService);

    this.eventBus = eventBus || (0, _ui_utils.getGlobalEventBus)();
    this.externalLinkTarget = externalLinkTarget;
    this.externalLinkRel = externalLinkRel;
    this.baseUrl = null;
    this.pdfDocument = null;
    this.pdfViewer = null;
    this.pdfHistory = null;
    this._pagesRefCache = null;
  }

  _createClass(PDFLinkService, [{
    key: "setDocument",
    value: function setDocument(pdfDocument) {
      var baseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
      this.baseUrl = baseUrl;
      this.pdfDocument = pdfDocument;
      this._pagesRefCache = Object.create(null);
    }
  }, {
    key: "setViewer",
    value: function setViewer(pdfViewer) {
      this.pdfViewer = pdfViewer;
    }
  }, {
    key: "setHistory",
    value: function setHistory(pdfHistory) {
      this.pdfHistory = pdfHistory;
    }
  }, {
    key: "navigateTo",
    value: function navigateTo(dest) {
      var _this = this;

      var goToDestination = function goToDestination(_ref2) {
        var namedDest = _ref2.namedDest,
            explicitDest = _ref2.explicitDest;
        var destRef = explicitDest[0],
            pageNumber;

        if (destRef instanceof Object) {
          pageNumber = _this._cachedPageNumber(destRef);

          if (pageNumber === null) {
            _this.pdfDocument.getPageIndex(destRef).then(function (pageIndex) {
              _this.cachePageRef(pageIndex + 1, destRef);

              goToDestination({
                namedDest: namedDest,
                explicitDest: explicitDest
              });
            }).catch(function () {
              console.error("PDFLinkService.navigateTo: \"".concat(destRef, "\" is not ") + "a valid page reference, for dest=\"".concat(dest, "\"."));
            });

            return;
          }
        } else if (Number.isInteger(destRef)) {
          pageNumber = destRef + 1;
        } else {
          console.error("PDFLinkService.navigateTo: \"".concat(destRef, "\" is not ") + "a valid destination reference, for dest=\"".concat(dest, "\"."));
          return;
        }

        if (!pageNumber || pageNumber < 1 || pageNumber > _this.pagesCount) {
          console.error("PDFLinkService.navigateTo: \"".concat(pageNumber, "\" is not ") + "a valid page number, for dest=\"".concat(dest, "\"."));
          return;
        }

        if (_this.pdfHistory) {
          _this.pdfHistory.pushCurrentPosition();

          _this.pdfHistory.push({
            namedDest: namedDest,
            explicitDest: explicitDest,
            pageNumber: pageNumber
          });
        }

        _this.pdfViewer.scrollPageIntoView({
          pageNumber: pageNumber,
          destArray: explicitDest
        });
      };

      new Promise(function (resolve, reject) {
        if (typeof dest === 'string') {
          _this.pdfDocument.getDestination(dest).then(function (destArray) {
            resolve({
              namedDest: dest,
              explicitDest: destArray
            });
          });

          return;
        }

        resolve({
          namedDest: '',
          explicitDest: dest
        });
      }).then(function (data) {
        if (!Array.isArray(data.explicitDest)) {
          console.error("PDFLinkService.navigateTo: \"".concat(data.explicitDest, "\" is") + " not a valid destination array, for dest=\"".concat(dest, "\"."));
          return;
        }

        goToDestination(data);
      });
    }
  }, {
    key: "getDestinationHash",
    value: function getDestinationHash(dest) {
      if (typeof dest === 'string') {
        return this.getAnchorUrl('#' + escape(dest));
      }

      if (Array.isArray(dest)) {
        var str = JSON.stringify(dest);
        return this.getAnchorUrl('#' + escape(str));
      }

      return this.getAnchorUrl('');
    }
  }, {
    key: "getAnchorUrl",
    value: function getAnchorUrl(anchor) {
      return (this.baseUrl || '') + anchor;
    }
  }, {
    key: "setHash",
    value: function setHash(hash) {
      var pageNumber, dest;

      if (hash.includes('=')) {
        var params = (0, _ui_utils.parseQueryString)(hash);

        if ('search' in params) {
          this.eventBus.dispatch('findfromurlhash', {
            source: this,
            query: params['search'].replace(/"/g, ''),
            phraseSearch: params['phrase'] === 'true'
          });
        }

        if ('nameddest' in params) {
          this.navigateTo(params.nameddest);
          return;
        }

        if ('page' in params) {
          pageNumber = params.page | 0 || 1;
        }

        if ('zoom' in params) {
          var zoomArgs = params.zoom.split(',');
          var zoomArg = zoomArgs[0];
          var zoomArgNumber = parseFloat(zoomArg);

          if (!zoomArg.includes('Fit')) {
            dest = [null, {
              name: 'XYZ'
            }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg];
          } else {
            if (zoomArg === 'Fit' || zoomArg === 'FitB') {
              dest = [null, {
                name: zoomArg
              }];
            } else if (zoomArg === 'FitH' || zoomArg === 'FitBH' || zoomArg === 'FitV' || zoomArg === 'FitBV') {
              dest = [null, {
                name: zoomArg
              }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null];
            } else if (zoomArg === 'FitR') {
              if (zoomArgs.length !== 5) {
                console.error('PDFLinkService.setHash: Not enough parameters for "FitR".');
              } else {
                dest = [null, {
                  name: zoomArg
                }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];
              }
            } else {
              console.error("PDFLinkService.setHash: \"".concat(zoomArg, "\" is not ") + 'a valid zoom value.');
            }
          }
        }

        if (dest) {
          this.pdfViewer.scrollPageIntoView({
            pageNumber: pageNumber || this.page,
            destArray: dest,
            allowNegativeOffset: true
          });
        } else if (pageNumber) {
          this.page = pageNumber;
        }

        if ('pagemode' in params) {
          this.eventBus.dispatch('pagemode', {
            source: this,
            mode: params.pagemode
          });
        }
      } else {
        dest = unescape(hash);

        try {
          dest = JSON.parse(dest);

          if (!Array.isArray(dest)) {
            dest = dest.toString();
          }
        } catch (ex) {}

        if (typeof dest === 'string' || isValidExplicitDestination(dest)) {
          this.navigateTo(dest);
          return;
        }

        console.error("PDFLinkService.setHash: \"".concat(unescape(hash), "\" is not ") + 'a valid destination.');
      }
    }
  }, {
    key: "executeNamedAction",
    value: function executeNamedAction(action) {
      switch (action) {
        case 'GoBack':
          if (this.pdfHistory) {
            this.pdfHistory.back();
          }

          break;

        case 'GoForward':
          if (this.pdfHistory) {
            this.pdfHistory.forward();
          }

          break;

        case 'NextPage':
          if (this.page < this.pagesCount) {
            this.page++;
          }

          break;

        case 'PrevPage':
          if (this.page > 1) {
            this.page--;
          }

          break;

        case 'LastPage':
          this.page = this.pagesCount;
          break;

        case 'FirstPage':
          this.page = 1;
          break;

        default:
          break;
      }

      this.eventBus.dispatch('namedaction', {
        source: this,
        action: action
      });
    }
  }, {
    key: "cachePageRef",
    value: function cachePageRef(pageNum, pageRef) {
      if (!pageRef) {
        return;
      }

      var refStr = pageRef.num + ' ' + pageRef.gen + ' R';
      this._pagesRefCache[refStr] = pageNum;
    }
  }, {
    key: "_cachedPageNumber",
    value: function _cachedPageNumber(pageRef) {
      var refStr = pageRef.num + ' ' + pageRef.gen + ' R';
      return this._pagesRefCache && this._pagesRefCache[refStr] || null;
    }
  }, {
    key: "isPageVisible",
    value: function isPageVisible(pageNumber) {
      return this.pdfViewer.isPageVisible(pageNumber);
    }
  }, {
    key: "pagesCount",
    get: function get() {
      return this.pdfDocument ? this.pdfDocument.numPages : 0;
    }
  }, {
    key: "page",
    get: function get() {
      return this.pdfViewer.currentPageNumber;
    },
    set: function set(value) {
      this.pdfViewer.currentPageNumber = value;
    }
  }, {
    key: "rotation",
    get: function get() {
      return this.pdfViewer.pagesRotation;
    },
    set: function set(value) {
      this.pdfViewer.pagesRotation = value;
    }
  }]);

  return PDFLinkService;
}();

exports.PDFLinkService = PDFLinkService;

function isValidExplicitDestination(dest) {
  if (!Array.isArray(dest)) {
    return false;
  }

  var destLength = dest.length,
      allowNull = true;

  if (destLength < 2) {
    return false;
  }

  var page = dest[0];

  if (!(_typeof(page) === 'object' && Number.isInteger(page.num) && Number.isInteger(page.gen)) && !(Number.isInteger(page) && page >= 0)) {
    return false;
  }

  var zoom = dest[1];

  if (!(_typeof(zoom) === 'object' && typeof zoom.name === 'string')) {
    return false;
  }

  switch (zoom.name) {
    case 'XYZ':
      if (destLength !== 5) {
        return false;
      }

      break;

    case 'Fit':
    case 'FitB':
      return destLength === 2;

    case 'FitH':
    case 'FitBH':
    case 'FitV':
    case 'FitBV':
      if (destLength !== 3) {
        return false;
      }

      break;

    case 'FitR':
      if (destLength !== 6) {
        return false;
      }

      allowNull = false;
      break;

    default:
      return false;
  }

  for (var i = 2; i < destLength; i++) {
    var param = dest[i];

    if (!(typeof param === 'number' || allowNull && param === null)) {
      return false;
    }
  }

  return true;
}

var SimpleLinkService =
/*#__PURE__*/
function () {
  function SimpleLinkService() {
    _classCallCheck(this, SimpleLinkService);

    this.externalLinkTarget = null;
    this.externalLinkRel = null;
  }

  _createClass(SimpleLinkService, [{
    key: "navigateTo",
    value: function navigateTo(dest) {}
  }, {
    key: "getDestinationHash",
    value: function getDestinationHash(dest) {
      return '#';
    }
  }, {
    key: "getAnchorUrl",
    value: function getAnchorUrl(hash) {
      return '#';
    }
  }, {
    key: "setHash",
    value: function setHash(hash) {}
  }, {
    key: "executeNamedAction",
    value: function executeNamedAction(action) {}
  }, {
    key: "cachePageRef",
    value: function cachePageRef(pageNum, pageRef) {}
  }, {
    key: "isPageVisible",
    value: function isPageVisible(pageNumber) {
      return true;
    }
  }, {
    key: "pagesCount",
    get: function get() {
      return 0;
    }
  }, {
    key: "page",
    get: function get() {
      return 0;
    },
    set: function set(value) {}
  }, {
    key: "rotation",
    get: function get() {
      return 0;
    },
    set: function set(value) {}
  }]);

  return SimpleLinkService;
}();

exports.SimpleLinkService = SimpleLinkService;

/***/ }),
/* 23 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFOutlineViewer = void 0;

var _pdfjsLib = __webpack_require__(7);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var DEFAULT_TITLE = "\u2013";

var PDFOutlineViewer =
/*#__PURE__*/
function () {
  function PDFOutlineViewer(_ref) {
    var container = _ref.container,
        linkService = _ref.linkService,
        eventBus = _ref.eventBus;

    _classCallCheck(this, PDFOutlineViewer);

    this.container = container;
    this.linkService = linkService;
    this.eventBus = eventBus;
    this.reset();
    eventBus.on('toggleoutlinetree', this.toggleOutlineTree.bind(this));
  }

  _createClass(PDFOutlineViewer, [{
    key: "reset",
    value: function reset() {
      this.outline = null;
      this.lastToggleIsShow = true;
      this.container.textContent = '';
      this.container.classList.remove('outlineWithDeepNesting');
    }
  }, {
    key: "_dispatchEvent",
    value: function _dispatchEvent(outlineCount) {
      this.eventBus.dispatch('outlineloaded', {
        source: this,
        outlineCount: outlineCount
      });
    }
  }, {
    key: "_bindLink",
    value: function _bindLink(element, _ref2) {
      var url = _ref2.url,
          newWindow = _ref2.newWindow,
          dest = _ref2.dest;
      var linkService = this.linkService;

      if (url) {
        (0, _pdfjsLib.addLinkAttributes)(element, {
          url: url,
          target: newWindow ? _pdfjsLib.LinkTarget.BLANK : linkService.externalLinkTarget,
          rel: linkService.externalLinkRel
        });
        return;
      }

      element.href = linkService.getDestinationHash(dest);

      element.onclick = function () {
        if (dest) {
          linkService.navigateTo(dest);
        }

        return false;
      };
    }
  }, {
    key: "_setStyles",
    value: function _setStyles(element, _ref3) {
      var bold = _ref3.bold,
          italic = _ref3.italic;
      var styleStr = '';

      if (bold) {
        styleStr += 'font-weight: bold;';
      }

      if (italic) {
        styleStr += 'font-style: italic;';
      }

      if (styleStr) {
        element.setAttribute('style', styleStr);
      }
    }
  }, {
    key: "_addToggleButton",
    value: function _addToggleButton(div) {
      var _this = this;

      var toggler = document.createElement('div');
      toggler.className = 'outlineItemToggler';

      toggler.onclick = function (evt) {
        evt.stopPropagation();
        toggler.classList.toggle('outlineItemsHidden');

        if (evt.shiftKey) {
          var shouldShowAll = !toggler.classList.contains('outlineItemsHidden');

          _this._toggleOutlineItem(div, shouldShowAll);
        }
      };

      div.insertBefore(toggler, div.firstChild);
    }
  }, {
    key: "_toggleOutlineItem",
    value: function _toggleOutlineItem(root) {
      var show = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      this.lastToggleIsShow = show;
      var _iteratorNormalCompletion = true;
      var _didIteratorError = false;
      var _iteratorError = undefined;

      try {
        for (var _iterator = root.querySelectorAll('.outlineItemToggler')[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
          var toggler = _step.value;
          toggler.classList.toggle('outlineItemsHidden', !show);
        }
      } catch (err) {
        _didIteratorError = true;
        _iteratorError = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion && _iterator.return != null) {
            _iterator.return();
          }
        } finally {
          if (_didIteratorError) {
            throw _iteratorError;
          }
        }
      }
    }
  }, {
    key: "toggleOutlineTree",
    value: function toggleOutlineTree() {
      if (!this.outline) {
        return;
      }

      this._toggleOutlineItem(this.container, !this.lastToggleIsShow);
    }
  }, {
    key: "render",
    value: function render(_ref4) {
      var outline = _ref4.outline;
      var outlineCount = 0;

      if (this.outline) {
        this.reset();
      }

      this.outline = outline || null;

      if (!outline) {
        this._dispatchEvent(outlineCount);

        return;
      }

      var fragment = document.createDocumentFragment();
      var queue = [{
        parent: fragment,
        items: this.outline
      }];
      var hasAnyNesting = false;

      while (queue.length > 0) {
        var levelData = queue.shift();

        for (var i = 0, len = levelData.items.length; i < len; i++) {
          var item = levelData.items[i];
          var div = document.createElement('div');
          div.className = 'outlineItem';
          var element = document.createElement('a');

          this._bindLink(element, item);

          this._setStyles(element, item);

          element.textContent = (0, _pdfjsLib.removeNullCharacters)(item.title) || DEFAULT_TITLE;
          div.appendChild(element);

          if (item.items.length > 0) {
            hasAnyNesting = true;

            this._addToggleButton(div);

            var itemsDiv = document.createElement('div');
            itemsDiv.className = 'outlineItems';
            div.appendChild(itemsDiv);
            queue.push({
              parent: itemsDiv,
              items: item.items
            });
          }

          levelData.parent.appendChild(div);
          outlineCount++;
        }
      }

      if (hasAnyNesting) {
        this.container.classList.add('outlineWithDeepNesting');
      }

      this.container.appendChild(fragment);

      this._dispatchEvent(outlineCount);
    }
  }]);

  return PDFOutlineViewer;
}();

exports.PDFOutlineViewer = PDFOutlineViewer;

/***/ }),
/* 24 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFPresentationMode = void 0;

var _ui_utils = __webpack_require__(6);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500;
var DELAY_BEFORE_HIDING_CONTROLS = 3000;
var ACTIVE_SELECTOR = 'pdfPresentationMode';
var CONTROLS_SELECTOR = 'pdfPresentationModeControls';
var MOUSE_SCROLL_COOLDOWN_TIME = 50;
var PAGE_SWITCH_THRESHOLD = 0.1;
var SWIPE_MIN_DISTANCE_THRESHOLD = 50;
var SWIPE_ANGLE_THRESHOLD = Math.PI / 6;

var PDFPresentationMode =
/*#__PURE__*/
function () {
  function PDFPresentationMode(_ref) {
    var _this = this;

    var container = _ref.container,
        _ref$viewer = _ref.viewer,
        viewer = _ref$viewer === void 0 ? null : _ref$viewer,
        pdfViewer = _ref.pdfViewer,
        eventBus = _ref.eventBus,
        _ref$contextMenuItems = _ref.contextMenuItems,
        contextMenuItems = _ref$contextMenuItems === void 0 ? null : _ref$contextMenuItems;

    _classCallCheck(this, PDFPresentationMode);

    this.container = container;
    this.viewer = viewer || container.firstElementChild;
    this.pdfViewer = pdfViewer;
    this.eventBus = eventBus;
    this.active = false;
    this.args = null;
    this.contextMenuOpen = false;
    this.mouseScrollTimeStamp = 0;
    this.mouseScrollDelta = 0;
    this.touchSwipeState = null;

    if (contextMenuItems) {
      contextMenuItems.contextFirstPage.addEventListener('click', function () {
        _this.contextMenuOpen = false;

        _this.eventBus.dispatch('firstpage', {
          source: _this
        });
      });
      contextMenuItems.contextLastPage.addEventListener('click', function () {
        _this.contextMenuOpen = false;

        _this.eventBus.dispatch('lastpage', {
          source: _this
        });
      });
      contextMenuItems.contextPageRotateCw.addEventListener('click', function () {
        _this.contextMenuOpen = false;

        _this.eventBus.dispatch('rotatecw', {
          source: _this
        });
      });
      contextMenuItems.contextPageRotateCcw.addEventListener('click', function () {
        _this.contextMenuOpen = false;

        _this.eventBus.dispatch('rotateccw', {
          source: _this
        });
      });
    }
  }

  _createClass(PDFPresentationMode, [{
    key: "request",
    value: function request() {
      if (this.switchInProgress || this.active || !this.viewer.hasChildNodes()) {
        return false;
      }

      this._addFullscreenChangeListeners();

      this._setSwitchInProgress();

      this._notifyStateChange();

      // CHANGE 2
      // if (this.container.requestFullscreen) {
      //   this.container.requestFullscreen();
      // } else if (this.container.mozRequestFullScreen) {
      //   this.container.mozRequestFullScreen();
      // } else if (this.container.webkitRequestFullscreen) {
      //   this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
      // } else if (this.container.msRequestFullscreen) {
      //   this.container.msRequestFullscreen();
      // } else {
      //   return false;
      // }
      // CHANGE 2
      this._fullscreenChange();

      this.args = {
        page: this.pdfViewer.currentPageNumber,
        previousScale: this.pdfViewer.currentScaleValue
      };
      return true;
    }
  }, {
    key: "_mouseWheel",
    value: function _mouseWheel(evt) {
      if (!this.active) {
        return;
      }

      evt.preventDefault();
      var delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);
      var currentTime = new Date().getTime();
      var storedTime = this.mouseScrollTimeStamp;

      if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {
        return;
      }

      if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) {
        this._resetMouseScrollState();
      }

      this.mouseScrollDelta += delta;

      if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {
        var totalDelta = this.mouseScrollDelta;

        this._resetMouseScrollState();

        var success = totalDelta > 0 ? this._goToPreviousPage() : this._goToNextPage();

        if (success) {
          this.mouseScrollTimeStamp = currentTime;
        }
      }
    }
  }, {
    key: "_goToPreviousPage",
    value: function _goToPreviousPage() {
      var page = this.pdfViewer.currentPageNumber;

      if (page <= 1) {
        return false;
      }

      this.pdfViewer.currentPageNumber = page - 1;
      return true;
    }
  }, {
    key: "_goToNextPage",
    value: function _goToNextPage() {
      var page = this.pdfViewer.currentPageNumber;

      if (page >= this.pdfViewer.pagesCount) {
        return false;
      }

      this.pdfViewer.currentPageNumber = page + 1;
      return true;
    }
  }, {
    key: "_notifyStateChange",
    value: function _notifyStateChange() {
      this.eventBus.dispatch('presentationmodechanged', {
        source: this,
        active: this.active,
        switchInProgress: !!this.switchInProgress
      });
    }
  }, {
    key: "_setSwitchInProgress",
    value: function _setSwitchInProgress() {
      var _this2 = this;

      if (this.switchInProgress) {
        clearTimeout(this.switchInProgress);
      }

      this.switchInProgress = setTimeout(function () {
        _this2._removeFullscreenChangeListeners();

        delete _this2.switchInProgress;

        _this2._notifyStateChange();
      }, DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);
    }
  }, {
    key: "_resetSwitchInProgress",
    value: function _resetSwitchInProgress() {
      if (this.switchInProgress) {
        clearTimeout(this.switchInProgress);
        delete this.switchInProgress;
      }
    }
  }, {
    key: "_enter",
    value: function _enter() {
      var _this3 = this;

      this.active = true;

      this._resetSwitchInProgress();

      this._notifyStateChange();

      this.container.classList.add(ACTIVE_SELECTOR);
      setTimeout(function () {
        _this3.pdfViewer.currentPageNumber = _this3.args.page;
        _this3.pdfViewer.currentScaleValue = 'page-fit';
      }, 0);

      this._addWindowListeners();

      this._showControls();

      this.contextMenuOpen = false;
      this.container.setAttribute('contextmenu', 'viewerContextMenu');
      window.getSelection().removeAllRanges();
    }
  }, {
    key: "_exit",
    value: function _exit() {
      var _this4 = this;

      var page = this.pdfViewer.currentPageNumber;
      this.container.classList.remove(ACTIVE_SELECTOR);
      setTimeout(function () {
        _this4.active = false;

        _this4._removeFullscreenChangeListeners();

        _this4._notifyStateChange();

        _this4.pdfViewer.currentScaleValue = _this4.args.previousScale;
        _this4.pdfViewer.currentPageNumber = page;
        _this4.args = null;
      }, 0);

      this._removeWindowListeners();

      this._hideControls();

      this._resetMouseScrollState();

      this.container.removeAttribute('contextmenu');
      this.contextMenuOpen = false;
    }
  }, {
    key: "_mouseDown",
    value: function _mouseDown(evt) {
      if (this.contextMenuOpen) {
        this.contextMenuOpen = false;
        evt.preventDefault();
        return;
      }

      if (evt.button === 0) {
        var isInternalLink = evt.target.href && evt.target.classList.contains('internalLink');

        if (!isInternalLink) {
          evt.preventDefault();

          if (evt.shiftKey) {
            this._goToPreviousPage();
          } else {
            this._goToNextPage();
          }
        }
      }
    }
  }, {
    key: "_contextMenu",
    value: function _contextMenu() {
      this.contextMenuOpen = true;
    }
  }, {
    key: "_showControls",
    value: function _showControls() {
      var _this5 = this;

      if (this.controlsTimeout) {
        clearTimeout(this.controlsTimeout);
      } else {
        this.container.classList.add(CONTROLS_SELECTOR);
      }

      this.controlsTimeout = setTimeout(function () {
        _this5.container.classList.remove(CONTROLS_SELECTOR);

        delete _this5.controlsTimeout;
      }, DELAY_BEFORE_HIDING_CONTROLS);
    }
  }, {
    key: "_hideControls",
    value: function _hideControls() {
      if (!this.controlsTimeout) {
        return;
      }

      clearTimeout(this.controlsTimeout);
      this.container.classList.remove(CONTROLS_SELECTOR);
      delete this.controlsTimeout;
    }
  }, {
    key: "_resetMouseScrollState",
    value: function _resetMouseScrollState() {
      this.mouseScrollTimeStamp = 0;
      this.mouseScrollDelta = 0;
    }
  }, {
    key: "_touchSwipe",
    value: function _touchSwipe(evt) {
      if (!this.active) {
        return;
      }

      if (evt.touches.length > 1) {
        this.touchSwipeState = null;
        return;
      }

      switch (evt.type) {
        case 'touchstart':
          this.touchSwipeState = {
            startX: evt.touches[0].pageX,
            startY: evt.touches[0].pageY,
            endX: evt.touches[0].pageX,
            endY: evt.touches[0].pageY
          };
          break;

        case 'touchmove':
          if (this.touchSwipeState === null) {
            return;
          }

          this.touchSwipeState.endX = evt.touches[0].pageX;
          this.touchSwipeState.endY = evt.touches[0].pageY;
          evt.preventDefault();
          break;

        case 'touchend':
          if (this.touchSwipeState === null) {
            return;
          }

          var delta = 0;
          var dx = this.touchSwipeState.endX - this.touchSwipeState.startX;
          var dy = this.touchSwipeState.endY - this.touchSwipeState.startY;
          var absAngle = Math.abs(Math.atan2(dy, dx));

          if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) {
            delta = dx;
          } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) {
            delta = dy;
          }

          if (delta > 0) {
            this._goToPreviousPage();
          } else if (delta < 0) {
            this._goToNextPage();
          }

          break;
      }
    }
  }, {
    key: "_addWindowListeners",
    value: function _addWindowListeners() {
      this.showControlsBind = this._showControls.bind(this);
      this.mouseDownBind = this._mouseDown.bind(this);
      this.mouseWheelBind = this._mouseWheel.bind(this);
      this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this);
      this.contextMenuBind = this._contextMenu.bind(this);
      this.touchSwipeBind = this._touchSwipe.bind(this);
      window.addEventListener('mousemove', this.showControlsBind);
      window.addEventListener('mousedown', this.mouseDownBind);
      window.addEventListener('wheel', this.mouseWheelBind);
      window.addEventListener('keydown', this.resetMouseScrollStateBind);
      window.addEventListener('contextmenu', this.contextMenuBind);
      window.addEventListener('touchstart', this.touchSwipeBind);
      window.addEventListener('touchmove', this.touchSwipeBind);
      window.addEventListener('touchend', this.touchSwipeBind);
    }
  }, {
    key: "_removeWindowListeners",
    value: function _removeWindowListeners() {
      window.removeEventListener('mousemove', this.showControlsBind);
      window.removeEventListener('mousedown', this.mouseDownBind);
      window.removeEventListener('wheel', this.mouseWheelBind);
      window.removeEventListener('keydown', this.resetMouseScrollStateBind);
      window.removeEventListener('contextmenu', this.contextMenuBind);
      window.removeEventListener('touchstart', this.touchSwipeBind);
      window.removeEventListener('touchmove', this.touchSwipeBind);
      window.removeEventListener('touchend', this.touchSwipeBind);
      delete this.showControlsBind;
      delete this.mouseDownBind;
      delete this.mouseWheelBind;
      delete this.resetMouseScrollStateBind;
      delete this.contextMenuBind;
      delete this.touchSwipeBind;
    }
  }, {
    key: "_fullscreenChange",
    value: function _fullscreenChange() {
      if (this.isFullscreen) {
        this._enter();
      } else {
        this._exit();
      }
    }
  }, {
    key: "_addFullscreenChangeListeners",
    value: function _addFullscreenChangeListeners() {
      // CHANGE 2
      // this.fullscreenChangeBind = this._fullscreenChange.bind(this);
      // window.addEventListener('fullscreenchange', this.fullscreenChangeBind);
      // window.addEventListener('mozfullscreenchange', this.fullscreenChangeBind);
      // window.addEventListener('webkitfullscreenchange', this.fullscreenChangeBind);
      // window.addEventListener('MSFullscreenChange', this.fullscreenChangeBind);
    }
  }, {
    key: "_removeFullscreenChangeListeners",
    value: function _removeFullscreenChangeListeners() {
      // CHANGE 2
      // window.removeEventListener('fullscreenchange', this.fullscreenChangeBind);
      // window.removeEventListener('mozfullscreenchange', this.fullscreenChangeBind);
      // window.removeEventListener('webkitfullscreenchange', this.fullscreenChangeBind);
      // window.removeEventListener('MSFullscreenChange', this.fullscreenChangeBind);
      // delete this.fullscreenChangeBind;
    }
  }, {
    key: "isFullscreen",
    get: function get() {
      // CHANGE 2
      // return !!(document.fullscreenElement || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement);
      // CHANGE 2
      return true;
    }
  }]);

  return PDFPresentationMode;
}();

exports.PDFPresentationMode = PDFPresentationMode;

/***/ }),
/* 25 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFSidebarResizer = void 0;

var _ui_utils = __webpack_require__(6);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var SIDEBAR_WIDTH_VAR = '--sidebar-width';
var SIDEBAR_MIN_WIDTH = 200;
var SIDEBAR_RESIZING_CLASS = 'sidebarResizing';

var PDFSidebarResizer =
/*#__PURE__*/
function () {
  function PDFSidebarResizer(options, eventBus) {
    var _this = this;

    var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;

    _classCallCheck(this, PDFSidebarResizer);

    this.enabled = false;
    this.isRTL = false;
    this.sidebarOpen = false;
    this.doc = document.documentElement;
    this._width = null;
    this._outerContainerWidth = null;
    this._boundEvents = Object.create(null);
    this.outerContainer = options.outerContainer;
    this.resizer = options.resizer;
    this.eventBus = eventBus;
    this.l10n = l10n;

    if (typeof CSS === 'undefined' || typeof CSS.supports !== 'function' || !CSS.supports(SIDEBAR_WIDTH_VAR, "calc(-1 * ".concat(SIDEBAR_MIN_WIDTH, "px)"))) {
      // CHANGE 5
      // console.warn('PDFSidebarResizer: ' + 'The browser does not support resizing of the sidebar.');
      return;
    }

    this.enabled = true;
    this.resizer.classList.remove('hidden');
    this.l10n.getDirection().then(function (dir) {
      _this.isRTL = dir === 'rtl';
    });

    this._addEventListeners();
  }

  _createClass(PDFSidebarResizer, [{
    key: "_updateWidth",
    value: function _updateWidth() {
      var width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;

      if (!this.enabled) {
        return false;
      }

      var maxWidth = Math.floor(this.outerContainerWidth / 2);

      if (width > maxWidth) {
        width = maxWidth;
      }

      if (width < SIDEBAR_MIN_WIDTH) {
        width = SIDEBAR_MIN_WIDTH;
      }

      if (width === this._width) {
        return false;
      }

      this._width = width;
      this.doc.style.setProperty(SIDEBAR_WIDTH_VAR, "".concat(width, "px"));
      return true;
    }
  }, {
    key: "_mouseMove",
    value: function _mouseMove(evt) {
      var width = evt.clientX;

      if (this.isRTL) {
        width = this.outerContainerWidth - width;
      }

      this._updateWidth(width);
    }
  }, {
    key: "_mouseUp",
    value: function _mouseUp(evt) {
      this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);
      this.eventBus.dispatch('resize', {
        source: this
      });
      var _boundEvents = this._boundEvents;
      window.removeEventListener('mousemove', _boundEvents.mouseMove);
      window.removeEventListener('mouseup', _boundEvents.mouseUp);
    }
  }, {
    key: "_addEventListeners",
    value: function _addEventListeners() {
      var _this2 = this;

      if (!this.enabled) {
        return;
      }

      var _boundEvents = this._boundEvents;
      _boundEvents.mouseMove = this._mouseMove.bind(this);
      _boundEvents.mouseUp = this._mouseUp.bind(this);
      this.resizer.addEventListener('mousedown', function (evt) {
        if (evt.button !== 0) {
          return;
        }

        _this2.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);

        window.addEventListener('mousemove', _boundEvents.mouseMove);
        window.addEventListener('mouseup', _boundEvents.mouseUp);
      });
      this.eventBus.on('sidebarviewchanged', function (evt) {
        _this2.sidebarOpen = !!(evt && evt.view);
      });
      this.eventBus.on('resize', function (evt) {
        if (evt && evt.source === window) {
          _this2._outerContainerWidth = null;

          if (_this2._width) {
            if (_this2.sidebarOpen) {
              _this2.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);

              var updated = _this2._updateWidth(_this2._width);

              Promise.resolve().then(function () {
                _this2.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);

                if (updated) {
                  _this2.eventBus.dispatch('resize', {
                    source: _this2
                  });
                }
              });
            } else {
              _this2._updateWidth(_this2._width);
            }
          }
        }
      });
    }
  }, {
    key: "outerContainerWidth",
    get: function get() {
      if (!this._outerContainerWidth) {
        this._outerContainerWidth = this.outerContainer.clientWidth;
      }

      return this._outerContainerWidth;
    }
  }]);

  return PDFSidebarResizer;
}();

exports.PDFSidebarResizer = PDFSidebarResizer;

/***/ }),
/* 26 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFThumbnailViewer = void 0;

var _ui_utils = __webpack_require__(6);

var _pdf_thumbnail_view = __webpack_require__(27);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var THUMBNAIL_SCROLL_MARGIN = -19;
var THUMBNAIL_SELECTED_CLASS = 'selected';

var PDFThumbnailViewer =
/*#__PURE__*/
function () {
  function PDFThumbnailViewer(_ref) {
    var container = _ref.container,
        linkService = _ref.linkService,
        renderingQueue = _ref.renderingQueue,
        _ref$l10n = _ref.l10n,
        l10n = _ref$l10n === void 0 ? _ui_utils.NullL10n : _ref$l10n;

    _classCallCheck(this, PDFThumbnailViewer);

    this.container = container;
    this.linkService = linkService;
    this.renderingQueue = renderingQueue;
    this.l10n = l10n;
    this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdated.bind(this));

    this._resetView();
  }

  _createClass(PDFThumbnailViewer, [{
    key: "_scrollUpdated",
    value: function _scrollUpdated() {
      this.renderingQueue.renderHighestPriority();
    }
  }, {
    key: "getThumbnail",
    value: function getThumbnail(index) {
      return this._thumbnails[index];
    }
  }, {
    key: "_getVisibleThumbs",
    value: function _getVisibleThumbs() {
      return (0, _ui_utils.getVisibleElements)(this.container, this._thumbnails);
    }
  }, {
    key: "scrollThumbnailIntoView",
    value: function scrollThumbnailIntoView(pageNumber) {
      if (!this.pdfDocument) {
        return;
      }

      var thumbnailView = this._thumbnails[pageNumber - 1];

      if (!thumbnailView) {
        console.error('scrollThumbnailIntoView: Invalid "pageNumber" parameter.');
        return;
      }

      if (pageNumber !== this._currentPageNumber) {
        var prevThumbnailView = this._thumbnails[this._currentPageNumber - 1];
        prevThumbnailView.div.classList.remove(THUMBNAIL_SELECTED_CLASS);
        thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS);
      }

      var visibleThumbs = this._getVisibleThumbs();

      var numVisibleThumbs = visibleThumbs.views.length;

      if (numVisibleThumbs > 0) {
        var first = visibleThumbs.first.id;
        var last = numVisibleThumbs > 1 ? visibleThumbs.last.id : first;
        var shouldScroll = false;

        if (pageNumber <= first || pageNumber >= last) {
          shouldScroll = true;
        } else {
          visibleThumbs.views.some(function (view) {
            if (view.id !== pageNumber) {
              return false;
            }

            shouldScroll = view.percent < 100;
            return true;
          });
        }

        if (shouldScroll) {
          (0, _ui_utils.scrollIntoView)(thumbnailView.div, {
            top: THUMBNAIL_SCROLL_MARGIN
          });
        }
      }

      this._currentPageNumber = pageNumber;
    }
  }, {
    key: "cleanup",
    value: function cleanup() {
      _pdf_thumbnail_view.PDFThumbnailView.cleanup();
    }
  }, {
    key: "_resetView",
    value: function _resetView() {
      this._thumbnails = [];
      this._currentPageNumber = 1;
      this._pageLabels = null;
      this._pagesRotation = 0;
      this._pagesRequests = [];
      this.container.textContent = '';
    }
  }, {
    key: "setDocument",
    value: function setDocument(pdfDocument) {
      var _this = this;

      if (this.pdfDocument) {
        this._cancelRendering();

        this._resetView();
      }

      this.pdfDocument = pdfDocument;

      if (!pdfDocument) {
        return;
      }

      pdfDocument.getPage(1).then(function (firstPage) {
        var pagesCount = pdfDocument.numPages;
        var viewport = firstPage.getViewport({
          scale: 1
        });

        for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
          var thumbnail = new _pdf_thumbnail_view.PDFThumbnailView({
            container: _this.container,
            id: pageNum,
            defaultViewport: viewport.clone(),
            linkService: _this.linkService,
            renderingQueue: _this.renderingQueue,
            disableCanvasToImageConversion: false,
            l10n: _this.l10n
          });

          _this._thumbnails.push(thumbnail);
        }

        var thumbnailView = _this._thumbnails[_this._currentPageNumber - 1];
        thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS);
      }).catch(function (reason) {
        console.error('Unable to initialize thumbnail viewer', reason);
      });
    }
  }, {
    key: "_cancelRendering",
    value: function _cancelRendering() {
      for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {
        if (this._thumbnails[i]) {
          this._thumbnails[i].cancelRendering();
        }
      }
    }
  }, {
    key: "setPageLabels",
    value: function setPageLabels(labels) {
      if (!this.pdfDocument) {
        return;
      }

      if (!labels) {
        this._pageLabels = null;
      } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) {
        this._pageLabels = null;
        console.error('PDFThumbnailViewer_setPageLabels: Invalid page labels.');
      } else {
        this._pageLabels = labels;
      }

      for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {
        var label = this._pageLabels && this._pageLabels[i];

        this._thumbnails[i].setPageLabel(label);
      }
    }
  }, {
    key: "_ensurePdfPageLoaded",
    value: function _ensurePdfPageLoaded(thumbView) {
      var _this2 = this;

      if (thumbView.pdfPage) {
        return Promise.resolve(thumbView.pdfPage);
      }

      var pageNumber = thumbView.id;

      if (this._pagesRequests[pageNumber]) {
        return this._pagesRequests[pageNumber];
      }

      var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) {
        thumbView.setPdfPage(pdfPage);
        _this2._pagesRequests[pageNumber] = null;
        return pdfPage;
      }).catch(function (reason) {
        console.error('Unable to get page for thumb view', reason);
        _this2._pagesRequests[pageNumber] = null;
      });
      this._pagesRequests[pageNumber] = promise;
      return promise;
    }
  }, {
    key: "forceRendering",
    value: function forceRendering() {
      var _this3 = this;

      var visibleThumbs = this._getVisibleThumbs();

      var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, this.scroll.down);

      if (thumbView) {
        this._ensurePdfPageLoaded(thumbView).then(function () {
          _this3.renderingQueue.renderView(thumbView);
        });

        return true;
      }

      return false;
    }
  }, {
    key: "pagesRotation",
    get: function get() {
      return this._pagesRotation;
    },
    set: function set(rotation) {
      if (!(0, _ui_utils.isValidRotation)(rotation)) {
        throw new Error('Invalid thumbnails rotation angle.');
      }

      if (!this.pdfDocument) {
        return;
      }

      if (this._pagesRotation === rotation) {
        return;
      }

      this._pagesRotation = rotation;

      for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {
        this._thumbnails[i].update(rotation);
      }
    }
  }]);

  return PDFThumbnailViewer;
}();

exports.PDFThumbnailViewer = PDFThumbnailViewer;

/***/ }),
/* 27 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFThumbnailView = void 0;

var _pdfjsLib = __webpack_require__(7);

var _ui_utils = __webpack_require__(6);

var _pdf_rendering_queue = __webpack_require__(10);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var MAX_NUM_SCALING_STEPS = 3;
var THUMBNAIL_CANVAS_BORDER_WIDTH = 1;
var THUMBNAIL_WIDTH = 98;

var TempImageFactory = function TempImageFactoryClosure() {
  var tempCanvasCache = null;
  return {
    getCanvas: function getCanvas(width, height) {
      var tempCanvas = tempCanvasCache;

      if (!tempCanvas) {
        tempCanvas = document.createElement('canvas');
        tempCanvasCache = tempCanvas;
      }

      tempCanvas.width = width;
      tempCanvas.height = height;
      tempCanvas.mozOpaque = true;
      var ctx = tempCanvas.getContext('2d', {
        alpha: false
      });
      ctx.save();
      ctx.fillStyle = 'rgb(255, 255, 255)';
      ctx.fillRect(0, 0, width, height);
      ctx.restore();
      return tempCanvas;
    },
    destroyCanvas: function destroyCanvas() {
      var tempCanvas = tempCanvasCache;

      if (tempCanvas) {
        tempCanvas.width = 0;
        tempCanvas.height = 0;
      }

      tempCanvasCache = null;
    }
  };
}();

var PDFThumbnailView =
/*#__PURE__*/
function () {
  function PDFThumbnailView(_ref) {
    var container = _ref.container,
        id = _ref.id,
        defaultViewport = _ref.defaultViewport,
        linkService = _ref.linkService,
        renderingQueue = _ref.renderingQueue,
        _ref$disableCanvasToI = _ref.disableCanvasToImageConversion,
        disableCanvasToImageConversion = _ref$disableCanvasToI === void 0 ? false : _ref$disableCanvasToI,
        _ref$l10n = _ref.l10n,
        l10n = _ref$l10n === void 0 ? _ui_utils.NullL10n : _ref$l10n;

    _classCallCheck(this, PDFThumbnailView);

    this.id = id;
    this.renderingId = 'thumbnail' + id;
    this.pageLabel = null;
    this.pdfPage = null;
    this.rotation = 0;
    this.viewport = defaultViewport;
    this.pdfPageRotate = defaultViewport.rotation;
    this.linkService = linkService;
    this.renderingQueue = renderingQueue;
    this.renderTask = null;
    this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
    this.resume = null;
    this.disableCanvasToImageConversion = disableCanvasToImageConversion;
    this.pageWidth = this.viewport.width;
    this.pageHeight = this.viewport.height;
    this.pageRatio = this.pageWidth / this.pageHeight;
    this.canvasWidth = THUMBNAIL_WIDTH;
    this.canvasHeight = this.canvasWidth / this.pageRatio | 0;
    this.scale = this.canvasWidth / this.pageWidth;
    this.l10n = l10n;
    var anchor = document.createElement('a');
    anchor.href = linkService.getAnchorUrl('#page=' + id);
    this.l10n.get('thumb_page_title', {
      page: id
    }, 'Page {{page}}').then(function (msg) {
      anchor.title = msg;
    });

    anchor.onclick = function () {
      linkService.page = id;
      return false;
    };

    this.anchor = anchor;
    var div = document.createElement('div');
    div.className = 'thumbnail';
    div.setAttribute('data-page-number', this.id);
    this.div = div;
    var ring = document.createElement('div');
    ring.className = 'thumbnailSelectionRing';
    var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;
    ring.style.width = this.canvasWidth + borderAdjustment + 'px';
    ring.style.height = this.canvasHeight + borderAdjustment + 'px';
    this.ring = ring;
    div.appendChild(ring);
    anchor.appendChild(div);
    container.appendChild(anchor);
  }

  _createClass(PDFThumbnailView, [{
    key: "setPdfPage",
    value: function setPdfPage(pdfPage) {
      this.pdfPage = pdfPage;
      this.pdfPageRotate = pdfPage.rotate;
      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
      this.viewport = pdfPage.getViewport({
        scale: 1,
        rotation: totalRotation
      });
      this.reset();
    }
  }, {
    key: "reset",
    value: function reset() {
      this.cancelRendering();
      this.pageWidth = this.viewport.width;
      this.pageHeight = this.viewport.height;
      this.pageRatio = this.pageWidth / this.pageHeight;
      this.canvasHeight = this.canvasWidth / this.pageRatio | 0;
      this.scale = this.canvasWidth / this.pageWidth;
      this.div.removeAttribute('data-loaded');
      var ring = this.ring;
      var childNodes = ring.childNodes;

      for (var i = childNodes.length - 1; i >= 0; i--) {
        ring.removeChild(childNodes[i]);
      }

      var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;
      ring.style.width = this.canvasWidth + borderAdjustment + 'px';
      ring.style.height = this.canvasHeight + borderAdjustment + 'px';

      if (this.canvas) {
        this.canvas.width = 0;
        this.canvas.height = 0;
        delete this.canvas;
      }

      if (this.image) {
        this.image.removeAttribute('src');
        delete this.image;
      }
    }
  }, {
    key: "update",
    value: function update(rotation) {
      if (typeof rotation !== 'undefined') {
        this.rotation = rotation;
      }

      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
      this.viewport = this.viewport.clone({
        scale: 1,
        rotation: totalRotation
      });
      this.reset();
    }
  }, {
    key: "cancelRendering",
    value: function cancelRendering() {
      if (this.renderTask) {
        this.renderTask.cancel();
        this.renderTask = null;
      }

      this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
      this.resume = null;
    }
  }, {
    key: "_getPageDrawContext",
    value: function _getPageDrawContext() {
      var noCtxScale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
      var canvas = document.createElement('canvas');
      this.canvas = canvas;
      canvas.mozOpaque = true;
      var ctx = canvas.getContext('2d', {
        alpha: false
      });
      var outputScale = (0, _ui_utils.getOutputScale)(ctx);
      canvas.width = this.canvasWidth * outputScale.sx | 0;
      canvas.height = this.canvasHeight * outputScale.sy | 0;
      canvas.style.width = this.canvasWidth + 'px';
      canvas.style.height = this.canvasHeight + 'px';

      if (!noCtxScale && outputScale.scaled) {
        ctx.scale(outputScale.sx, outputScale.sy);
      }

      return ctx;
    }
  }, {
    key: "_convertCanvasToImage",
    value: function _convertCanvasToImage() {
      var _this = this;

      if (!this.canvas) {
        return;
      }

      if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
        return;
      }

      var id = this.renderingId;
      var className = 'thumbnailImage';

      if (this.disableCanvasToImageConversion) {
        this.canvas.id = id;
        this.canvas.className = className;
        this.l10n.get('thumb_page_canvas', {
          page: this.pageId
        }, 'Thumbnail of Page {{page}}').then(function (msg) {
          _this.canvas.setAttribute('aria-label', msg);
        });
        this.div.setAttribute('data-loaded', true);
        this.ring.appendChild(this.canvas);
        return;
      }

      var image = document.createElement('img');
      image.id = id;
      image.className = className;
      this.l10n.get('thumb_page_canvas', {
        page: this.pageId
      }, 'Thumbnail of Page {{page}}').then(function (msg) {
        image.setAttribute('aria-label', msg);
      });
      image.style.width = this.canvasWidth + 'px';
      image.style.height = this.canvasHeight + 'px';
      image.src = this.canvas.toDataURL();
      this.image = image;
      this.div.setAttribute('data-loaded', true);
      this.ring.appendChild(image);
      this.canvas.width = 0;
      this.canvas.height = 0;
      delete this.canvas;
    }
  }, {
    key: "draw",
    value: function draw() {
      var _this2 = this;

      if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {
        console.error('Must be in new state before drawing');
        return Promise.resolve(undefined);
      }

      this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;
      var renderCapability = (0, _pdfjsLib.createPromiseCapability)();

      var finishRenderTask = function finishRenderTask(error) {
        if (renderTask === _this2.renderTask) {
          _this2.renderTask = null;
        }

        if (error instanceof _pdfjsLib.RenderingCancelledException) {
          renderCapability.resolve(undefined);
          return;
        }

        _this2.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;

        _this2._convertCanvasToImage();

        if (!error) {
          renderCapability.resolve(undefined);
        } else {
          renderCapability.reject(error);
        }
      };

      var ctx = this._getPageDrawContext();

      var drawViewport = this.viewport.clone({
        scale: this.scale
      });

      var renderContinueCallback = function renderContinueCallback(cont) {
        if (!_this2.renderingQueue.isHighestPriority(_this2)) {
          _this2.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;

          _this2.resume = function () {
            _this2.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;
            cont();
          };

          return;
        }

        cont();
      };

      var renderContext = {
        canvasContext: ctx,
        viewport: drawViewport
      };
      var renderTask = this.renderTask = this.pdfPage.render(renderContext);
      renderTask.onContinue = renderContinueCallback;
      renderTask.promise.then(function () {
        finishRenderTask(null);
      }, function (error) {
        finishRenderTask(error);
      });
      return renderCapability.promise;
    }
  }, {
    key: "setImage",
    value: function setImage(pageView) {
      if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {
        return;
      }

      var img = pageView.canvas;

      if (!img) {
        return;
      }

      if (!this.pdfPage) {
        this.setPdfPage(pageView.pdfPage);
      }

      this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;

      var ctx = this._getPageDrawContext(true);

      var canvas = ctx.canvas;

      if (img.width <= 2 * canvas.width) {
        ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);

        this._convertCanvasToImage();

        return;
      }

      var reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS;
      var reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS;
      var reducedImage = TempImageFactory.getCanvas(reducedWidth, reducedHeight);
      var reducedImageCtx = reducedImage.getContext('2d');

      while (reducedWidth > img.width || reducedHeight > img.height) {
        reducedWidth >>= 1;
        reducedHeight >>= 1;
      }

      reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight);

      while (reducedWidth > 2 * canvas.width) {
        reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1);
        reducedWidth >>= 1;
        reducedHeight >>= 1;
      }

      ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height);

      this._convertCanvasToImage();
    }
  }, {
    key: "setPageLabel",
    value: function setPageLabel(label) {
      var _this3 = this;

      this.pageLabel = typeof label === 'string' ? label : null;
      this.l10n.get('thumb_page_title', {
        page: this.pageId
      }, 'Page {{page}}').then(function (msg) {
        _this3.anchor.title = msg;
      });

      if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
        return;
      }

      this.l10n.get('thumb_page_canvas', {
        page: this.pageId
      }, 'Thumbnail of Page {{page}}').then(function (ariaLabel) {
        if (_this3.image) {
          _this3.image.setAttribute('aria-label', ariaLabel);
        } else if (_this3.disableCanvasToImageConversion && _this3.canvas) {
          _this3.canvas.setAttribute('aria-label', ariaLabel);
        }
      });
    }
  }, {
    key: "pageId",
    get: function get() {
      return this.pageLabel !== null ? this.pageLabel : this.id;
    }
  }], [{
    key: "cleanup",
    value: function cleanup() {
      TempImageFactory.destroyCanvas();
    }
  }]);

  return PDFThumbnailView;
}();

exports.PDFThumbnailView = PDFThumbnailView;

/***/ }),
/* 28 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFViewer = void 0;

var _base_viewer = __webpack_require__(29);

var _pdfjsLib = __webpack_require__(7);

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }

function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

var PDFViewer =
/*#__PURE__*/
function (_BaseViewer) {
  _inherits(PDFViewer, _BaseViewer);

  function PDFViewer() {
    _classCallCheck(this, PDFViewer);

    return _possibleConstructorReturn(this, _getPrototypeOf(PDFViewer).apply(this, arguments));
  }

  _createClass(PDFViewer, [{
    key: "_scrollIntoView",
    value: function _scrollIntoView(_ref) {
      var pageDiv = _ref.pageDiv,
          _ref$pageSpot = _ref.pageSpot,
          pageSpot = _ref$pageSpot === void 0 ? null : _ref$pageSpot,
          _ref$pageNumber = _ref.pageNumber,
          pageNumber = _ref$pageNumber === void 0 ? null : _ref$pageNumber;

      if (!pageSpot && !this.isInPresentationMode) {
        var left = pageDiv.offsetLeft + pageDiv.clientLeft;
        var right = left + pageDiv.clientWidth;
        var _this$container = this.container,
            scrollLeft = _this$container.scrollLeft,
            clientWidth = _this$container.clientWidth;

        if (this._isScrollModeHorizontal || left < scrollLeft || right > scrollLeft + clientWidth) {
          pageSpot = {
            left: 0,
            top: 0
          };
        }
      }

      _get(_getPrototypeOf(PDFViewer.prototype), "_scrollIntoView", this).call(this, {
        pageDiv: pageDiv,
        pageSpot: pageSpot,
        pageNumber: pageNumber
      });
    }
  }, {
    key: "_getVisiblePages",
    value: function _getVisiblePages() {
      if (this.isInPresentationMode) {
        return this._getCurrentVisiblePage();
      }

      return _get(_getPrototypeOf(PDFViewer.prototype), "_getVisiblePages", this).call(this);
    }
  }, {
    key: "_updateHelper",
    value: function _updateHelper(visiblePages) {
      if (this.isInPresentationMode) {
        return;
      }

      var currentId = this._currentPageNumber;
      var stillFullyVisible = false;
      var _iteratorNormalCompletion = true;
      var _didIteratorError = false;
      var _iteratorError = undefined;

      try {
        for (var _iterator = visiblePages[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
          var page = _step.value;

          if (page.percent < 100) {
            break;
          }

          if (page.id === currentId) {
            stillFullyVisible = true;
            break;
          }
        }
      } catch (err) {
        _didIteratorError = true;
        _iteratorError = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion && _iterator.return != null) {
            _iterator.return();
          }
        } finally {
          if (_didIteratorError) {
            throw _iteratorError;
          }
        }
      }

      if (!stillFullyVisible) {
        currentId = visiblePages[0].id;
      }

      this._setCurrentPageNumber(currentId);
    }
  }, {
    key: "_setDocumentViewerElement",
    get: function get() {
      return (0, _pdfjsLib.shadow)(this, '_setDocumentViewerElement', this.viewer);
    }
  }]);

  return PDFViewer;
}(_base_viewer.BaseViewer);

exports.PDFViewer = PDFViewer;

/***/ }),
/* 29 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.BaseViewer = void 0;

var _ui_utils = __webpack_require__(6);

var _pdf_rendering_queue = __webpack_require__(10);

var _annotation_layer_builder = __webpack_require__(30);

var _pdfjsLib = __webpack_require__(7);

var _pdf_page_view = __webpack_require__(31);

var _pdf_link_service = __webpack_require__(22);

var _text_layer_builder = __webpack_require__(32);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var DEFAULT_CACHE_SIZE = 10;

function PDFPageViewBuffer(size) {
  var data = [];

  this.push = function (view) {
    var i = data.indexOf(view);

    if (i >= 0) {
      data.splice(i, 1);
    }

    data.push(view);

    if (data.length > size) {
      data.shift().destroy();
    }
  };

  this.resize = function (newSize, pagesToKeep) {
    size = newSize;

    if (pagesToKeep) {
      var pageIdsToKeep = new Set();

      for (var i = 0, iMax = pagesToKeep.length; i < iMax; ++i) {
        pageIdsToKeep.add(pagesToKeep[i].id);
      }

      (0, _ui_utils.moveToEndOfArray)(data, function (page) {
        return pageIdsToKeep.has(page.id);
      });
    }

    while (data.length > size) {
      data.shift().destroy();
    }
  };
}

function isSameScale(oldScale, newScale) {
  if (newScale === oldScale) {
    return true;
  }

  if (Math.abs(newScale - oldScale) < 1e-15) {
    return true;
  }

  return false;
}

var BaseViewer =
/*#__PURE__*/
function () {
  function BaseViewer(options) {
    var _this = this;

    _classCallCheck(this, BaseViewer);

    if (this.constructor === BaseViewer) {
      throw new Error('Cannot initialize BaseViewer.');
    }

    this._name = this.constructor.name;
    this.container = options.container;
    this.viewer = options.viewer || options.container.firstElementChild;
    this.eventBus = options.eventBus || (0, _ui_utils.getGlobalEventBus)();
    this.linkService = options.linkService || new _pdf_link_service.SimpleLinkService();
    this.downloadManager = options.downloadManager || null;
    this.findController = options.findController || null;
    this.removePageBorders = options.removePageBorders || false;
    this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : _ui_utils.TextLayerMode.ENABLE;
    this.imageResourcesPath = options.imageResourcesPath || '';
    this.renderInteractiveForms = options.renderInteractiveForms || false;
    this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;
    this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;
    this.enableWebGL = options.enableWebGL || false;
    this.useOnlyCssZoom = options.useOnlyCssZoom || false;
    this.maxCanvasPixels = options.maxCanvasPixels;
    this.l10n = options.l10n || _ui_utils.NullL10n;
    this.defaultRenderingQueue = !options.renderingQueue;

    if (this.defaultRenderingQueue) {
      this.renderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();
      this.renderingQueue.setViewer(this);
    } else {
      this.renderingQueue = options.renderingQueue;
    }

    this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdate.bind(this));
    this.presentationModeState = _ui_utils.PresentationModeState.UNKNOWN;

    this._resetView();

    if (this.removePageBorders) {
      this.viewer.classList.add('removePageBorders');
    }

    Promise.resolve().then(function () {
      _this.eventBus.dispatch('baseviewerinit', {
        source: _this
      });
    });
  }

  _createClass(BaseViewer, [{
    key: "getPageView",
    value: function getPageView(index) {
      return this._pages[index];
    }
  }, {
    key: "_setCurrentPageNumber",
    value: function _setCurrentPageNumber(val) {
      var resetCurrentPageView = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;

      if (this._currentPageNumber === val) {
        if (resetCurrentPageView) {
          this._resetCurrentPageView();
        }

        return true;
      }

      if (!(0 < val && val <= this.pagesCount)) {
        return false;
      }

      this._currentPageNumber = val;
      this.eventBus.dispatch('pagechanging', {
        source: this,
        pageNumber: val,
        pageLabel: this._pageLabels && this._pageLabels[val - 1]
      });

      if (resetCurrentPageView) {
        this._resetCurrentPageView();
      }

      return true;
    }
  }, {
    key: "setDocument",
    value: function setDocument(pdfDocument) {
      var _this2 = this;

      if (this.pdfDocument) {
        this._cancelRendering();

        this._resetView();

        if (this.findController) {
          this.findController.setDocument(null);
        }
      }

      this.pdfDocument = pdfDocument;

      if (!pdfDocument) {
        return;
      }

      var pagesCount = pdfDocument.numPages;
      var pagesCapability = (0, _pdfjsLib.createPromiseCapability)();
      this.pagesPromise = pagesCapability.promise;
      pagesCapability.promise.then(function () {
        _this2._pageViewsReady = true;

        _this2.eventBus.dispatch('pagesloaded', {
          source: _this2,
          pagesCount: pagesCount
        });
      });
      var onePageRenderedCapability = (0, _pdfjsLib.createPromiseCapability)();
      this.onePageRendered = onePageRenderedCapability.promise;

      var bindOnAfterAndBeforeDraw = function bindOnAfterAndBeforeDraw(pageView) {
        pageView.onBeforeDraw = function () {
          _this2._buffer.push(pageView);
        };

        pageView.onAfterDraw = function () {
          if (!onePageRenderedCapability.settled) {
            onePageRenderedCapability.resolve();
          }
        };
      };

      var firstPagePromise = pdfDocument.getPage(1);
      this.firstPagePromise = firstPagePromise;
      firstPagePromise.then(function (pdfPage) {
        var scale = _this2.currentScale;
        var viewport = pdfPage.getViewport({
          scale: scale * _ui_utils.CSS_UNITS
        });

        for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
          var textLayerFactory = null;

          if (_this2.textLayerMode !== _ui_utils.TextLayerMode.DISABLE) {
            textLayerFactory = _this2;
          }

          var pageView = new _pdf_page_view.PDFPageView({
            container: _this2._setDocumentViewerElement,
            eventBus: _this2.eventBus,
            id: pageNum,
            scale: scale,
            defaultViewport: viewport.clone(),
            renderingQueue: _this2.renderingQueue,
            textLayerFactory: textLayerFactory,
            textLayerMode: _this2.textLayerMode,
            annotationLayerFactory: _this2,
            imageResourcesPath: _this2.imageResourcesPath,
            renderInteractiveForms: _this2.renderInteractiveForms,
            renderer: _this2.renderer,
            enableWebGL: _this2.enableWebGL,
            useOnlyCssZoom: _this2.useOnlyCssZoom,
            maxCanvasPixels: _this2.maxCanvasPixels,
            l10n: _this2.l10n
          });
          bindOnAfterAndBeforeDraw(pageView);

          _this2._pages.push(pageView);
        }

        if (_this2._spreadMode !== _ui_utils.SpreadMode.NONE) {
          _this2._updateSpreadMode();
        }

        onePageRenderedCapability.promise.then(function () {
          if (pdfDocument.loadingParams['disableAutoFetch']) {
            pagesCapability.resolve();
            return;
          }

          var getPagesLeft = pagesCount;

          var _loop = function _loop(_pageNum) {
            pdfDocument.getPage(_pageNum).then(function (pdfPage) {
              var pageView = _this2._pages[_pageNum - 1];

              if (!pageView.pdfPage) {
                pageView.setPdfPage(pdfPage);
              }

              _this2.linkService.cachePageRef(_pageNum, pdfPage.ref);

              if (--getPagesLeft === 0) {
                pagesCapability.resolve();
              }
            }, function (reason) {
              console.error("Unable to get page ".concat(_pageNum, " to initialize viewer"), reason);

              if (--getPagesLeft === 0) {
                pagesCapability.resolve();
              }
            });
          };

          for (var _pageNum = 1; _pageNum <= pagesCount; ++_pageNum) {
            _loop(_pageNum);
          }
        });

        _this2.eventBus.dispatch('pagesinit', {
          source: _this2
        });

        if (_this2.findController) {
          _this2.findController.setDocument(pdfDocument);
        }

        if (_this2.defaultRenderingQueue) {
          _this2.update();
        }
      }).catch(function (reason) {
        console.error('Unable to initialize viewer', reason);
      });
    }
  }, {
    key: "setPageLabels",
    value: function setPageLabels(labels) {
      if (!this.pdfDocument) {
        return;
      }

      if (!labels) {
        this._pageLabels = null;
      } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) {
        this._pageLabels = null;
        console.error("".concat(this._name, ".setPageLabels: Invalid page labels."));
      } else {
        this._pageLabels = labels;
      }

      for (var i = 0, ii = this._pages.length; i < ii; i++) {
        var pageView = this._pages[i];
        var label = this._pageLabels && this._pageLabels[i];
        pageView.setPageLabel(label);
      }
    }
  }, {
    key: "_resetView",
    value: function _resetView() {
      this._pages = [];
      this._currentPageNumber = 1;
      this._currentScale = _ui_utils.UNKNOWN_SCALE;
      this._currentScaleValue = null;
      this._pageLabels = null;
      this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);
      this._location = null;
      this._pagesRotation = 0;
      this._pagesRequests = [];
      this._pageViewsReady = false;
      this._scrollMode = _ui_utils.ScrollMode.VERTICAL;
      this._spreadMode = _ui_utils.SpreadMode.NONE;
      this.viewer.textContent = '';

      this._updateScrollMode();
    }
  }, {
    key: "_scrollUpdate",
    value: function _scrollUpdate() {
      if (this.pagesCount === 0) {
        return;
      }

      this.update();
    }
  }, {
    key: "_scrollIntoView",
    value: function _scrollIntoView(_ref) {
      var pageDiv = _ref.pageDiv,
          _ref$pageSpot = _ref.pageSpot,
          pageSpot = _ref$pageSpot === void 0 ? null : _ref$pageSpot,
          _ref$pageNumber = _ref.pageNumber,
          pageNumber = _ref$pageNumber === void 0 ? null : _ref$pageNumber;
      (0, _ui_utils.scrollIntoView)(pageDiv, pageSpot);
    }
  }, {
    key: "_setScaleUpdatePages",
    value: function _setScaleUpdatePages(newScale, newValue) {
      var noScroll = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
      var preset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
      this._currentScaleValue = newValue.toString();

      if (isSameScale(this._currentScale, newScale)) {
        if (preset) {
          this.eventBus.dispatch('scalechanging', {
            source: this,
            scale: newScale,
            presetValue: newValue
          });
        }

        return;
      }

      for (var i = 0, ii = this._pages.length; i < ii; i++) {
        this._pages[i].update(newScale);
      }

      this._currentScale = newScale;

      if (!noScroll) {
        var page = this._currentPageNumber,
            dest;

        if (this._location && !(this.isInPresentationMode || this.isChangingPresentationMode)) {
          page = this._location.pageNumber;
          dest = [null, {
            name: 'XYZ'
          }, this._location.left, this._location.top, null];
        }

        this.scrollPageIntoView({
          pageNumber: page,
          destArray: dest,
          allowNegativeOffset: true
        });
      }

      this.eventBus.dispatch('scalechanging', {
        source: this,
        scale: newScale,
        presetValue: preset ? newValue : undefined
      });

      if (this.defaultRenderingQueue) {
        this.update();
      }
    }
  }, {
    key: "_setScale",
    value: function _setScale(value) {
      var noScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      var scale = parseFloat(value);

      if (scale > 0) {
        this._setScaleUpdatePages(scale, value, noScroll, false);
      } else {
        var currentPage = this._pages[this._currentPageNumber - 1];

        if (!currentPage) {
          return;
        }

        var noPadding = this.isInPresentationMode || this.removePageBorders;
        var hPadding = noPadding ? 0 : _ui_utils.SCROLLBAR_PADDING;
        var vPadding = noPadding ? 0 : _ui_utils.VERTICAL_PADDING;

        if (!noPadding && this._isScrollModeHorizontal) {
          var _ref2 = [vPadding, hPadding];
          hPadding = _ref2[0];
          vPadding = _ref2[1];
        }

        var pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale;
        var pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale;

        switch (value) {
          case 'page-actual':
            scale = 1;
            break;

          case 'page-width':
            scale = pageWidthScale;
            break;

          case 'page-height':
            scale = pageHeightScale;
            break;

          case 'page-fit':
            scale = Math.min(pageWidthScale, pageHeightScale);
            break;

          case 'auto':
            var horizontalScale = (0, _ui_utils.isPortraitOrientation)(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale);
            scale = Math.min(_ui_utils.MAX_AUTO_SCALE, horizontalScale);
            break;

          default:
            console.error("".concat(this._name, "._setScale: \"").concat(value, "\" is an unknown zoom value."));
            return;
        }

        this._setScaleUpdatePages(scale, value, noScroll, true);
      }
    }
  }, {
    key: "_resetCurrentPageView",
    value: function _resetCurrentPageView() {
      // CHANGE 7
      if (this.isInPresentationMode && this._currentScaleValue) {
        this._setScale(this._currentScaleValue, true);
      }

      var pageView = this._pages[this._currentPageNumber - 1];

      this._scrollIntoView({
        pageDiv: pageView.div
      });
    }
  }, {
    key: "scrollPageIntoView",
    value: function scrollPageIntoView(_ref3) {
      var pageNumber = _ref3.pageNumber,
          _ref3$destArray = _ref3.destArray,
          destArray = _ref3$destArray === void 0 ? null : _ref3$destArray,
          _ref3$allowNegativeOf = _ref3.allowNegativeOffset,
          allowNegativeOffset = _ref3$allowNegativeOf === void 0 ? false : _ref3$allowNegativeOf;

      if (!this.pdfDocument) {
        return;
      }

      var pageView = Number.isInteger(pageNumber) && this._pages[pageNumber - 1];

      if (!pageView) {
        console.error("".concat(this._name, ".scrollPageIntoView: ") + "\"".concat(pageNumber, "\" is not a valid pageNumber parameter."));
        return;
      }

      if (this.isInPresentationMode || !destArray) {
        this._setCurrentPageNumber(pageNumber, true);

        return;
      }

      var x = 0,
          y = 0;
      var width = 0,
          height = 0,
          widthScale,
          heightScale;
      var changeOrientation = pageView.rotation % 180 === 0 ? false : true;
      var pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / _ui_utils.CSS_UNITS;
      var pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / _ui_utils.CSS_UNITS;
      var scale = 0;

      switch (destArray[1].name) {
        case 'XYZ':
          x = destArray[2];
          y = destArray[3];
          scale = destArray[4];
          x = x !== null ? x : 0;
          y = y !== null ? y : pageHeight;
          break;

        case 'Fit':
        case 'FitB':
          scale = 'page-fit';
          break;

        case 'FitH':
        case 'FitBH':
          y = destArray[2];
          scale = 'page-width';

          if (y === null && this._location) {
            x = this._location.left;
            y = this._location.top;
          }

          break;

        case 'FitV':
        case 'FitBV':
          x = destArray[2];
          width = pageWidth;
          height = pageHeight;
          scale = 'page-height';
          break;

        case 'FitR':
          x = destArray[2];
          y = destArray[3];
          width = destArray[4] - x;
          height = destArray[5] - y;
          var hPadding = this.removePageBorders ? 0 : _ui_utils.SCROLLBAR_PADDING;
          var vPadding = this.removePageBorders ? 0 : _ui_utils.VERTICAL_PADDING;
          widthScale = (this.container.clientWidth - hPadding) / width / _ui_utils.CSS_UNITS;
          heightScale = (this.container.clientHeight - vPadding) / height / _ui_utils.CSS_UNITS;
          scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));
          break;

        default:
          console.error("".concat(this._name, ".scrollPageIntoView: ") + "\"".concat(destArray[1].name, "\" is not a valid destination type."));
          return;
      }

      if (scale && scale !== this._currentScale) {
        this.currentScaleValue = scale;
      } else if (this._currentScale === _ui_utils.UNKNOWN_SCALE) {
        this.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;
      }

      if (scale === 'page-fit' && !destArray[4]) {
        this._scrollIntoView({
          pageDiv: pageView.div,
          pageNumber: pageNumber
        });

        return;
      }

      var boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)];
      var left = Math.min(boundingRect[0][0], boundingRect[1][0]);
      var top = Math.min(boundingRect[0][1], boundingRect[1][1]);

      if (!allowNegativeOffset) {
        left = Math.max(left, 0);
        top = Math.max(top, 0);
      }

      this._scrollIntoView({
        pageDiv: pageView.div,
        pageSpot: {
          left: left,
          top: top
        },
        pageNumber: pageNumber
      });
    }
  }, {
    key: "_updateLocation",
    value: function _updateLocation(firstPage) {
      var currentScale = this._currentScale;
      var currentScaleValue = this._currentScaleValue;
      var normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue;
      var pageNumber = firstPage.id;
      var pdfOpenParams = '#page=' + pageNumber;
      pdfOpenParams += '&zoom=' + normalizedScaleValue;
      var currentPageView = this._pages[pageNumber - 1];
      var container = this.container;
      var topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y);
      var intLeft = Math.round(topLeft[0]);
      var intTop = Math.round(topLeft[1]);
      pdfOpenParams += ',' + intLeft + ',' + intTop;
      this._location = {
        pageNumber: pageNumber,
        scale: normalizedScaleValue,
        top: intTop,
        left: intLeft,
        rotation: this._pagesRotation,
        pdfOpenParams: pdfOpenParams
      };
    }
  }, {
    key: "_updateHelper",
    value: function _updateHelper(visiblePages) {
      throw new Error('Not implemented: _updateHelper');
    }
  }, {
    key: "update",
    value: function update() {
      var visible = this._getVisiblePages();

      var visiblePages = visible.views,
          numVisiblePages = visiblePages.length;

      if (numVisiblePages === 0) {
        return;
      }

      var newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1);

      this._buffer.resize(newCacheSize, visiblePages);

      this.renderingQueue.renderHighestPriority(visible);

      this._updateHelper(visiblePages);

      this._updateLocation(visible.first);

      this.eventBus.dispatch('updateviewarea', {
        source: this,
        location: this._location
      });
    }
  }, {
    key: "containsElement",
    value: function containsElement(element) {
      return this.container.contains(element);
    }
  }, {
    key: "focus",
    value: function focus() {
      this.container.focus();
    }
  }, {
    key: "_getCurrentVisiblePage",
    value: function _getCurrentVisiblePage() {
      if (!this.pagesCount) {
        return {
          views: []
        };
      }

      var pageView = this._pages[this._currentPageNumber - 1];
      var element = pageView.div;
      var view = {
        id: pageView.id,
        x: element.offsetLeft + element.clientLeft,
        y: element.offsetTop + element.clientTop,
        view: pageView
      };
      return {
        first: view,
        last: view,
        views: [view]
      };
    }
  }, {
    key: "_getVisiblePages",
    value: function _getVisiblePages() {
      return (0, _ui_utils.getVisibleElements)(this.container, this._pages, true, this._isScrollModeHorizontal);
    }
  }, {
    key: "isPageVisible",
    value: function isPageVisible(pageNumber) {
      if (!this.pdfDocument) {
        return false;
      }

      if (this.pageNumber < 1 || pageNumber > this.pagesCount) {
        console.error("".concat(this._name, ".isPageVisible: \"").concat(pageNumber, "\" is out of bounds."));
        return false;
      }

      return this._getVisiblePages().views.some(function (view) {
        return view.id === pageNumber;
      });
    }
  }, {
    key: "cleanup",
    value: function cleanup() {
      for (var i = 0, ii = this._pages.length; i < ii; i++) {
        if (this._pages[i] && this._pages[i].renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
          this._pages[i].reset();
        }
      }
    }
  }, {
    key: "_cancelRendering",
    value: function _cancelRendering() {
      for (var i = 0, ii = this._pages.length; i < ii; i++) {
        if (this._pages[i]) {
          this._pages[i].cancelRendering();
        }
      }
    }
  }, {
    key: "_ensurePdfPageLoaded",
    value: function _ensurePdfPageLoaded(pageView) {
      var _this3 = this;

      if (pageView.pdfPage) {
        return Promise.resolve(pageView.pdfPage);
      }

      var pageNumber = pageView.id;

      if (this._pagesRequests[pageNumber]) {
        return this._pagesRequests[pageNumber];
      }

      var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) {
        if (!pageView.pdfPage) {
          pageView.setPdfPage(pdfPage);
        }

        _this3._pagesRequests[pageNumber] = null;
        return pdfPage;
      }).catch(function (reason) {
        console.error('Unable to get page for page view', reason);
        _this3._pagesRequests[pageNumber] = null;
      });
      this._pagesRequests[pageNumber] = promise;
      return promise;
    }
  }, {
    key: "forceRendering",
    value: function forceRendering(currentlyVisiblePages) {
      var _this4 = this;

      var visiblePages = currentlyVisiblePages || this._getVisiblePages();

      var scrollAhead = this._isScrollModeHorizontal ? this.scroll.right : this.scroll.down;
      var pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead);

      if (pageView) {
        this._ensurePdfPageLoaded(pageView).then(function () {
          _this4.renderingQueue.renderView(pageView);
        });

        return true;
      }

      return false;
    }
  }, {
    key: "createTextLayerBuilder",
    value: function createTextLayerBuilder(textLayerDiv, pageIndex, viewport) {
      var enhanceTextSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
      return new _text_layer_builder.TextLayerBuilder({
        textLayerDiv: textLayerDiv,
        eventBus: this.eventBus,
        pageIndex: pageIndex,
        viewport: viewport,
        findController: this.isInPresentationMode ? null : this.findController,
        enhanceTextSelection: this.isInPresentationMode ? false : enhanceTextSelection
      });
    }
  }, {
    key: "createAnnotationLayerBuilder",
    value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {
      var imageResourcesPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
      var renderInteractiveForms = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
      var l10n = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _ui_utils.NullL10n;
      return new _annotation_layer_builder.AnnotationLayerBuilder({
        pageDiv: pageDiv,
        pdfPage: pdfPage,
        imageResourcesPath: imageResourcesPath,
        renderInteractiveForms: renderInteractiveForms,
        linkService: this.linkService,
        downloadManager: this.downloadManager,
        l10n: l10n
      });
    }
  }, {
    key: "getPagesOverview",
    value: function getPagesOverview() {
      var pagesOverview = this._pages.map(function (pageView) {
        var viewport = pageView.pdfPage.getViewport({
          scale: 1
        });
        return {
          width: viewport.width,
          height: viewport.height,
          rotation: viewport.rotation
        };
      });

      if (!this.enablePrintAutoRotate) {
        return pagesOverview;
      }

      var isFirstPagePortrait = (0, _ui_utils.isPortraitOrientation)(pagesOverview[0]);
      return pagesOverview.map(function (size) {
        if (isFirstPagePortrait === (0, _ui_utils.isPortraitOrientation)(size)) {
          return size;
        }

        return {
          width: size.height,
          height: size.width,
          rotation: (size.rotation + 90) % 360
        };
      });
    }
  }, {
    key: "_updateScrollMode",
    value: function _updateScrollMode() {
      var pageNumber = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
      var scrollMode = this._scrollMode,
          viewer = this.viewer;
      viewer.classList.toggle('scrollHorizontal', scrollMode === _ui_utils.ScrollMode.HORIZONTAL);
      viewer.classList.toggle('scrollWrapped', scrollMode === _ui_utils.ScrollMode.WRAPPED);

      if (!this.pdfDocument || !pageNumber) {
        return;
      }

      if (this._currentScaleValue && isNaN(this._currentScaleValue)) {
        this._setScale(this._currentScaleValue, true);
      }

      this._setCurrentPageNumber(pageNumber, true);

      this.update();
    }
  }, {
    key: "_updateSpreadMode",
    value: function _updateSpreadMode() {
      var pageNumber = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;

      if (!this.pdfDocument) {
        return;
      }

      var viewer = this.viewer,
          pages = this._pages;
      viewer.textContent = '';

      if (this._spreadMode === _ui_utils.SpreadMode.NONE) {
        for (var i = 0, iMax = pages.length; i < iMax; ++i) {
          viewer.appendChild(pages[i].div);
        }
      } else {
        var parity = this._spreadMode - 1;
        var spread = null;

        for (var _i = 0, _iMax = pages.length; _i < _iMax; ++_i) {
          if (spread === null) {
            spread = document.createElement('div');
            spread.className = 'spread';
            viewer.appendChild(spread);
          } else if (_i % 2 === parity) {
            spread = spread.cloneNode(false);
            viewer.appendChild(spread);
          }

          spread.appendChild(pages[_i].div);
        }
      }

      if (!pageNumber) {
        return;
      }

      this._setCurrentPageNumber(pageNumber, true);

      this.update();
    }
  }, {
    key: "pagesCount",
    get: function get() {
      return this._pages.length;
    }
  }, {
    key: "pageViewsReady",
    get: function get() {
      return this._pageViewsReady;
    }
  }, {
    key: "currentPageNumber",
    get: function get() {
      return this._currentPageNumber;
    },
    set: function set(val) {
      if (!Number.isInteger(val)) {
        throw new Error('Invalid page number.');
      }

      if (!this.pdfDocument) {
        return;
      }

      if (!this._setCurrentPageNumber(val, true)) {
        console.error("".concat(this._name, ".currentPageNumber: \"").concat(val, "\" is not a valid page."));
      }
    }
  }, {
    key: "currentPageLabel",
    get: function get() {
      return this._pageLabels && this._pageLabels[this._currentPageNumber - 1];
    },
    set: function set(val) {
      if (!this.pdfDocument) {
        return;
      }

      var page = val | 0;

      if (this._pageLabels) {
        var i = this._pageLabels.indexOf(val);

        if (i >= 0) {
          page = i + 1;
        }
      }

      if (!this._setCurrentPageNumber(page, true)) {
        console.error("".concat(this._name, ".currentPageLabel: \"").concat(val, "\" is not a valid page."));
      }
    }
  }, {
    key: "currentScale",
    get: function get() {
      return this._currentScale !== _ui_utils.UNKNOWN_SCALE ? this._currentScale : _ui_utils.DEFAULT_SCALE;
    },
    set: function set(val) {
      if (isNaN(val)) {
        throw new Error('Invalid numeric scale.');
      }

      if (!this.pdfDocument) {
        return;
      }

      this._setScale(val, false);
    }
  }, {
    key: "currentScaleValue",
    get: function get() {
      return this._currentScaleValue;
    },
    set: function set(val) {
      if (!this.pdfDocument) {
        return;
      }

      this._setScale(val, false);
    }
  }, {
    key: "pagesRotation",
    get: function get() {
      return this._pagesRotation;
    },
    set: function set(rotation) {
      if (!(0, _ui_utils.isValidRotation)(rotation)) {
        throw new Error('Invalid pages rotation angle.');
      }

      if (!this.pdfDocument) {
        return;
      }

      if (this._pagesRotation === rotation) {
        return;
      }

      this._pagesRotation = rotation;
      var pageNumber = this._currentPageNumber;

      for (var i = 0, ii = this._pages.length; i < ii; i++) {
        var pageView = this._pages[i];
        pageView.update(pageView.scale, rotation);
      }

      if (this._currentScaleValue) {
        this._setScale(this._currentScaleValue, true);
      }

      this.eventBus.dispatch('rotationchanging', {
        source: this,
        pagesRotation: rotation,
        pageNumber: pageNumber
      });

      if (this.defaultRenderingQueue) {
        this.update();
      }
    }
  }, {
    key: "_setDocumentViewerElement",
    get: function get() {
      throw new Error('Not implemented: _setDocumentViewerElement');
    }
  }, {
    key: "_isScrollModeHorizontal",
    get: function get() {
      return this.isInPresentationMode ? false : this._scrollMode === _ui_utils.ScrollMode.HORIZONTAL;
    }
  }, {
    key: "isInPresentationMode",
    get: function get() {
      return this.presentationModeState === _ui_utils.PresentationModeState.FULLSCREEN;
    }
  }, {
    key: "isChangingPresentationMode",
    get: function get() {
      return this.presentationModeState === _ui_utils.PresentationModeState.CHANGING;
    }
  }, {
    key: "isHorizontalScrollbarEnabled",
    get: function get() {
      return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth;
    }
  }, {
    key: "isVerticalScrollbarEnabled",
    get: function get() {
      return this.isInPresentationMode ? false : this.container.scrollHeight > this.container.clientHeight;
    }
  }, {
    key: "hasEqualPageSizes",
    get: function get() {
      var firstPageView = this._pages[0];

      for (var i = 1, ii = this._pages.length; i < ii; ++i) {
        var pageView = this._pages[i];

        if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) {
          return false;
        }
      }

      return true;
    }
  }, {
    key: "scrollMode",
    get: function get() {
      return this._scrollMode;
    },
    set: function set(mode) {
      if (this._scrollMode === mode) {
        return;
      }

      if (!(0, _ui_utils.isValidScrollMode)(mode)) {
        throw new Error("Invalid scroll mode: ".concat(mode));
      }

      this._scrollMode = mode;
      this.eventBus.dispatch('scrollmodechanged', {
        source: this,
        mode: mode
      });

      this._updateScrollMode(this._currentPageNumber);
    }
  }, {
    key: "spreadMode",
    get: function get() {
      return this._spreadMode;
    },
    set: function set(mode) {
      if (this._spreadMode === mode) {
        return;
      }

      if (!(0, _ui_utils.isValidSpreadMode)(mode)) {
        throw new Error("Invalid spread mode: ".concat(mode));
      }

      this._spreadMode = mode;
      this.eventBus.dispatch('spreadmodechanged', {
        source: this,
        mode: mode
      });

      this._updateSpreadMode(this._currentPageNumber);
    }
  }]);

  return BaseViewer;
}();

exports.BaseViewer = BaseViewer;

/***/ }),
/* 30 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.DefaultAnnotationLayerFactory = exports.AnnotationLayerBuilder = void 0;

var _pdfjsLib = __webpack_require__(7);

var _ui_utils = __webpack_require__(6);

var _pdf_link_service = __webpack_require__(22);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var AnnotationLayerBuilder =
/*#__PURE__*/
function () {
  function AnnotationLayerBuilder(_ref) {
    var pageDiv = _ref.pageDiv,
        pdfPage = _ref.pdfPage,
        linkService = _ref.linkService,
        downloadManager = _ref.downloadManager,
        _ref$imageResourcesPa = _ref.imageResourcesPath,
        imageResourcesPath = _ref$imageResourcesPa === void 0 ? '' : _ref$imageResourcesPa,
        _ref$renderInteractiv = _ref.renderInteractiveForms,
        renderInteractiveForms = _ref$renderInteractiv === void 0 ? false : _ref$renderInteractiv,
        _ref$l10n = _ref.l10n,
        l10n = _ref$l10n === void 0 ? _ui_utils.NullL10n : _ref$l10n;

    _classCallCheck(this, AnnotationLayerBuilder);

    this.pageDiv = pageDiv;
    this.pdfPage = pdfPage;
    this.linkService = linkService;
    this.downloadManager = downloadManager;
    this.imageResourcesPath = imageResourcesPath;
    this.renderInteractiveForms = renderInteractiveForms;
    this.l10n = l10n;
    this.div = null;
    this._cancelled = false;
  }

  _createClass(AnnotationLayerBuilder, [{
    key: "render",
    value: function render(viewport) {
      var _this = this;

      var intent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'display';
      this.pdfPage.getAnnotations({
        intent: intent
      }).then(function (annotations) {
        if (_this._cancelled) {
          return;
        }

        var parameters = {
          viewport: viewport.clone({
            dontFlip: true
          }),
          div: _this.div,
          annotations: annotations,
          page: _this.pdfPage,
          imageResourcesPath: _this.imageResourcesPath,
          renderInteractiveForms: _this.renderInteractiveForms,
          linkService: _this.linkService,
          downloadManager: _this.downloadManager
        };

        if (_this.div) {
          _pdfjsLib.AnnotationLayer.update(parameters);
        } else {
          if (annotations.length === 0) {
            return;
          }

          _this.div = document.createElement('div');
          _this.div.className = 'annotationLayer';

          _this.pageDiv.appendChild(_this.div);

          parameters.div = _this.div;

          _pdfjsLib.AnnotationLayer.render(parameters);

          _this.l10n.translate(_this.div);
        }
      });
    }
  }, {
    key: "cancel",
    value: function cancel() {
      this._cancelled = true;
    }
  }, {
    key: "hide",
    value: function hide() {
      if (!this.div) {
        return;
      }

      this.div.setAttribute('hidden', 'true');
    }
  }]);

  return AnnotationLayerBuilder;
}();

exports.AnnotationLayerBuilder = AnnotationLayerBuilder;

var DefaultAnnotationLayerFactory =
/*#__PURE__*/
function () {
  function DefaultAnnotationLayerFactory() {
    _classCallCheck(this, DefaultAnnotationLayerFactory);
  }

  _createClass(DefaultAnnotationLayerFactory, [{
    key: "createAnnotationLayerBuilder",
    value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {
      var imageResourcesPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
      var renderInteractiveForms = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
      var l10n = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _ui_utils.NullL10n;
      return new AnnotationLayerBuilder({
        pageDiv: pageDiv,
        pdfPage: pdfPage,
        imageResourcesPath: imageResourcesPath,
        renderInteractiveForms: renderInteractiveForms,
        linkService: new _pdf_link_service.SimpleLinkService(),
        l10n: l10n
      });
    }
  }]);

  return DefaultAnnotationLayerFactory;
}();

exports.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory;

/***/ }),
/* 31 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFPageView = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(2));

var _ui_utils = __webpack_require__(6);

var _pdfjsLib = __webpack_require__(7);

var _pdf_rendering_queue = __webpack_require__(10);

var _viewer_compatibility = __webpack_require__(13);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var MAX_CANVAS_PIXELS = _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels || 16777216;

var PDFPageView =
/*#__PURE__*/
function () {
  function PDFPageView(options) {
    _classCallCheck(this, PDFPageView);

    var container = options.container;
    var defaultViewport = options.defaultViewport;
    this.id = options.id;
    this.renderingId = 'page' + this.id;
    this.pdfPage = null;
    this.pageLabel = null;
    this.rotation = 0;
    this.scale = options.scale || _ui_utils.DEFAULT_SCALE;
    this.viewport = defaultViewport;
    this.pdfPageRotate = defaultViewport.rotation;
    this.hasRestrictedScaling = false;
    this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : _ui_utils.TextLayerMode.ENABLE;
    this.imageResourcesPath = options.imageResourcesPath || '';
    this.renderInteractiveForms = options.renderInteractiveForms || false;
    this.useOnlyCssZoom = options.useOnlyCssZoom || false;
    this.maxCanvasPixels = options.maxCanvasPixels || MAX_CANVAS_PIXELS;
    this.eventBus = options.eventBus || (0, _ui_utils.getGlobalEventBus)();
    this.renderingQueue = options.renderingQueue;
    this.textLayerFactory = options.textLayerFactory;
    this.annotationLayerFactory = options.annotationLayerFactory;
    this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;
    this.enableWebGL = options.enableWebGL || false;
    this.l10n = options.l10n || _ui_utils.NullL10n;
    this.paintTask = null;
    this.paintedViewportMap = new WeakMap();
    this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
    this.resume = null;
    this.error = null;
    this.onBeforeDraw = null;
    this.onAfterDraw = null;
    this.annotationLayer = null;
    this.textLayer = null;
    this.zoomLayer = null;
    var div = document.createElement('div');
    div.className = 'page';
    div.style.width = Math.floor(this.viewport.width) + 'px';
    div.style.height = Math.floor(this.viewport.height) + 'px';
    div.setAttribute('data-page-number', this.id);
    this.div = div;
    container.appendChild(div);
  }

  _createClass(PDFPageView, [{
    key: "setPdfPage",
    value: function setPdfPage(pdfPage) {
      this.pdfPage = pdfPage;
      this.pdfPageRotate = pdfPage.rotate;
      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
      this.viewport = pdfPage.getViewport({
        scale: this.scale * _ui_utils.CSS_UNITS,
        rotation: totalRotation
      });
      this.stats = pdfPage.stats;
      this.reset();
    }
  }, {
    key: "destroy",
    value: function destroy() {
      this.reset();

      if (this.pdfPage) {
        this.pdfPage.cleanup();
      }
    }
  }, {
    key: "_resetZoomLayer",
    value: function _resetZoomLayer() {
      var removeFromDOM = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;

      if (!this.zoomLayer) {
        return;
      }

      var zoomLayerCanvas = this.zoomLayer.firstChild;
      this.paintedViewportMap.delete(zoomLayerCanvas);
      zoomLayerCanvas.width = 0;
      zoomLayerCanvas.height = 0;

      if (removeFromDOM) {
        this.zoomLayer.remove();
      }

      this.zoomLayer = null;
    }
  }, {
    key: "reset",
    value: function reset() {
      var keepZoomLayer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
      var keepAnnotations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      this.cancelRendering(keepAnnotations);
      var div = this.div;
      div.style.width = Math.floor(this.viewport.width) + 'px';
      div.style.height = Math.floor(this.viewport.height) + 'px';
      var childNodes = div.childNodes;
      var currentZoomLayerNode = keepZoomLayer && this.zoomLayer || null;
      var currentAnnotationNode = keepAnnotations && this.annotationLayer && this.annotationLayer.div || null;

      for (var i = childNodes.length - 1; i >= 0; i--) {
        var node = childNodes[i];

        if (currentZoomLayerNode === node || currentAnnotationNode === node) {
          continue;
        }

        div.removeChild(node);
      }

      div.removeAttribute('data-loaded');

      if (currentAnnotationNode) {
        this.annotationLayer.hide();
      } else if (this.annotationLayer) {
        this.annotationLayer.cancel();
        this.annotationLayer = null;
      }

      if (!currentZoomLayerNode) {
        if (this.canvas) {
          this.paintedViewportMap.delete(this.canvas);
          this.canvas.width = 0;
          this.canvas.height = 0;
          delete this.canvas;
        }

        this._resetZoomLayer();
      }

      if (this.svg) {
        this.paintedViewportMap.delete(this.svg);
        delete this.svg;
      }

      this.loadingIconDiv = document.createElement('div');
      this.loadingIconDiv.className = 'loadingIcon';
      div.appendChild(this.loadingIconDiv);
    }
  }, {
    key: "update",
    value: function update(scale, rotation) {
      this.scale = scale || this.scale;

      if (typeof rotation !== 'undefined') {
        this.rotation = rotation;
      }

      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
      this.viewport = this.viewport.clone({
        scale: this.scale * _ui_utils.CSS_UNITS,
        rotation: totalRotation
      });

      if (this.svg) {
        this.cssTransform(this.svg, true);
        this.eventBus.dispatch('pagerendered', {
          source: this,
          pageNumber: this.id,
          cssTransform: true
        });
        return;
      }

      var isScalingRestricted = false;

      if (this.canvas && this.maxCanvasPixels > 0) {
        var outputScale = this.outputScale;

        if ((Math.floor(this.viewport.width) * outputScale.sx | 0) * (Math.floor(this.viewport.height) * outputScale.sy | 0) > this.maxCanvasPixels) {
          isScalingRestricted = true;
        }
      }

      if (this.canvas) {
        if (this.useOnlyCssZoom || this.hasRestrictedScaling && isScalingRestricted) {
          this.cssTransform(this.canvas, true);
          this.eventBus.dispatch('pagerendered', {
            source: this,
            pageNumber: this.id,
            cssTransform: true
          });
          return;
        }

        if (!this.zoomLayer && !this.canvas.hasAttribute('hidden')) {
          this.zoomLayer = this.canvas.parentNode;
          this.zoomLayer.style.position = 'absolute';
        }
      }

      if (this.zoomLayer) {
        this.cssTransform(this.zoomLayer.firstChild);
      }

      this.reset(true, true);
    }
  }, {
    key: "cancelRendering",
    value: function cancelRendering() {
      var keepAnnotations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
      var renderingState = this.renderingState;

      if (this.paintTask) {
        this.paintTask.cancel();
        this.paintTask = null;
      }

      this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
      this.resume = null;

      if (this.textLayer) {
        this.textLayer.cancel();
        this.textLayer = null;
      }

      if (!keepAnnotations && this.annotationLayer) {
        this.annotationLayer.cancel();
        this.annotationLayer = null;
      }

      if (renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {
        this.eventBus.dispatch('pagecancelled', {
          source: this,
          pageNumber: this.id,
          renderingState: renderingState
        });
      }
    }
  }, {
    key: "cssTransform",
    value: function cssTransform(target) {
      var redrawAnnotations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
      var width = this.viewport.width;
      var height = this.viewport.height;
      var div = this.div;
      target.style.width = target.parentNode.style.width = div.style.width = Math.floor(width) + 'px';
      target.style.height = target.parentNode.style.height = div.style.height = Math.floor(height) + 'px';
      var relativeRotation = this.viewport.rotation - this.paintedViewportMap.get(target).rotation;
      var absRotation = Math.abs(relativeRotation);
      var scaleX = 1,
          scaleY = 1;

      if (absRotation === 90 || absRotation === 270) {
        scaleX = height / width;
        scaleY = width / height;
      }

      var cssTransform = 'rotate(' + relativeRotation + 'deg) ' + 'scale(' + scaleX + ',' + scaleY + ')';
      target.style.transform = cssTransform;

      if (this.textLayer) {
        var textLayerViewport = this.textLayer.viewport;
        var textRelativeRotation = this.viewport.rotation - textLayerViewport.rotation;
        var textAbsRotation = Math.abs(textRelativeRotation);
        var scale = width / textLayerViewport.width;

        if (textAbsRotation === 90 || textAbsRotation === 270) {
          scale = width / textLayerViewport.height;
        }

        var textLayerDiv = this.textLayer.textLayerDiv;
        var transX, transY;

        switch (textAbsRotation) {
          case 0:
            transX = transY = 0;
            break;

          case 90:
            transX = 0;
            transY = '-' + textLayerDiv.style.height;
            break;

          case 180:
            transX = '-' + textLayerDiv.style.width;
            transY = '-' + textLayerDiv.style.height;
            break;

          case 270:
            transX = '-' + textLayerDiv.style.width;
            transY = 0;
            break;

          default:
            console.error('Bad rotation value.');
            break;
        }

        textLayerDiv.style.transform = 'rotate(' + textAbsRotation + 'deg) ' + 'scale(' + scale + ', ' + scale + ') ' + 'translate(' + transX + ', ' + transY + ')';
        textLayerDiv.style.transformOrigin = '0% 0%';
      }

      if (redrawAnnotations && this.annotationLayer) {
        this.annotationLayer.render(this.viewport, 'display');
      }
    }
  }, {
    key: "getPagePoint",
    value: function getPagePoint(x, y) {
      return this.viewport.convertToPdfPoint(x, y);
    }
  }, {
    key: "draw",
    value: function draw() {
      var _this = this;

      if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {
        console.error('Must be in new state before drawing');
        this.reset();
      }

      if (!this.pdfPage) {
        this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
        return Promise.reject(new Error('Page is not loaded'));
      }

      this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;
      var pdfPage = this.pdfPage;
      var div = this.div;
      var canvasWrapper = document.createElement('div');
      canvasWrapper.style.width = div.style.width;
      canvasWrapper.style.height = div.style.height;
      canvasWrapper.classList.add('canvasWrapper');

      if (this.annotationLayer && this.annotationLayer.div) {
        div.insertBefore(canvasWrapper, this.annotationLayer.div);
      } else {
        div.appendChild(canvasWrapper);
      }

      var textLayer = null;

      if (this.textLayerMode !== _ui_utils.TextLayerMode.DISABLE && this.textLayerFactory) {
        var textLayerDiv = document.createElement('div');
        textLayerDiv.className = 'textLayer';
        textLayerDiv.style.width = canvasWrapper.style.width;
        textLayerDiv.style.height = canvasWrapper.style.height;

        if (this.annotationLayer && this.annotationLayer.div) {
          div.insertBefore(textLayerDiv, this.annotationLayer.div);
        } else {
          div.appendChild(textLayerDiv);
        }

        textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport, this.textLayerMode === _ui_utils.TextLayerMode.ENABLE_ENHANCE);
      }

      this.textLayer = textLayer;
      var renderContinueCallback = null;

      if (this.renderingQueue) {
        renderContinueCallback = function renderContinueCallback(cont) {
          if (!_this.renderingQueue.isHighestPriority(_this)) {
            _this.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;

            _this.resume = function () {
              _this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;
              cont();
            };

            return;
          }

          cont();
        };
      }

      var finishPaintTask =
      /*#__PURE__*/
      function () {
        var _ref = _asyncToGenerator(
        /*#__PURE__*/
        _regenerator.default.mark(function _callee(error) {
          return _regenerator.default.wrap(function _callee$(_context) {
            while (1) {
              switch (_context.prev = _context.next) {
                case 0:
                  if (paintTask === _this.paintTask) {
                    _this.paintTask = null;
                  }

                  if (!(error instanceof _pdfjsLib.RenderingCancelledException)) {
                    _context.next = 4;
                    break;
                  }

                  _this.error = null;
                  return _context.abrupt("return");

                case 4:
                  _this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;

                  if (_this.loadingIconDiv) {
                    div.removeChild(_this.loadingIconDiv);
                    delete _this.loadingIconDiv;
                  }

                  _this._resetZoomLayer(true);

                  _this.error = error;
                  _this.stats = pdfPage.stats;

                  if (_this.onAfterDraw) {
                    _this.onAfterDraw();
                  }

                  _this.eventBus.dispatch('pagerendered', {
                    source: _this,
                    pageNumber: _this.id,
                    cssTransform: false
                  });

                  if (!error) {
                    _context.next = 13;
                    break;
                  }

                  throw error;

                case 13:
                case "end":
                  return _context.stop();
              }
            }
          }, _callee, this);
        }));

        return function finishPaintTask(_x) {
          return _ref.apply(this, arguments);
        };
      }();

      var paintTask = this.renderer === _ui_utils.RendererType.SVG ? this.paintOnSvg(canvasWrapper) : this.paintOnCanvas(canvasWrapper);
      paintTask.onRenderContinue = renderContinueCallback;
      this.paintTask = paintTask;
      var resultPromise = paintTask.promise.then(function () {
        return finishPaintTask(null).then(function () {
          if (textLayer) {
            var readableStream = pdfPage.streamTextContent({
              normalizeWhitespace: true
            });
            textLayer.setTextContentStream(readableStream);
            textLayer.render();
          }
        });
      }, function (reason) {
        return finishPaintTask(reason);
      });

      if (this.annotationLayerFactory) {
        if (!this.annotationLayer) {
          this.annotationLayer = this.annotationLayerFactory.createAnnotationLayerBuilder(div, pdfPage, this.imageResourcesPath, this.renderInteractiveForms, this.l10n);
        }

        this.annotationLayer.render(this.viewport, 'display');
      }

      div.setAttribute('data-loaded', true);

      if (this.onBeforeDraw) {
        this.onBeforeDraw();
      }

      return resultPromise;
    }
  }, {
    key: "paintOnCanvas",
    value: function paintOnCanvas(canvasWrapper) {
      var renderCapability = (0, _pdfjsLib.createPromiseCapability)();
      var result = {
        promise: renderCapability.promise,
        onRenderContinue: function onRenderContinue(cont) {
          cont();
        },
        cancel: function cancel() {
          renderTask.cancel();
        }
      };
      var viewport = this.viewport;
      var canvas = document.createElement('canvas');
      canvas.id = this.renderingId;
      canvas.setAttribute('hidden', 'hidden');
      var isCanvasHidden = true;

      var showCanvas = function showCanvas() {
        if (isCanvasHidden) {
          canvas.removeAttribute('hidden');
          isCanvasHidden = false;
        }
      };

      canvasWrapper.appendChild(canvas);
      this.canvas = canvas;
      canvas.mozOpaque = true;
      var ctx = canvas.getContext('2d', {
        alpha: false
      });
      var outputScale = (0, _ui_utils.getOutputScale)(ctx);
      this.outputScale = outputScale;

      if (this.useOnlyCssZoom) {
        var actualSizeViewport = viewport.clone({
          scale: _ui_utils.CSS_UNITS
        });
        outputScale.sx *= actualSizeViewport.width / viewport.width;
        outputScale.sy *= actualSizeViewport.height / viewport.height;
        outputScale.scaled = true;
      }

      if (this.maxCanvasPixels > 0) {
        var pixelsInViewport = viewport.width * viewport.height;
        var maxScale = Math.sqrt(this.maxCanvasPixels / pixelsInViewport);

        if (outputScale.sx > maxScale || outputScale.sy > maxScale) {
          outputScale.sx = maxScale;
          outputScale.sy = maxScale;
          outputScale.scaled = true;
          this.hasRestrictedScaling = true;
        } else {
          this.hasRestrictedScaling = false;
        }
      }

      var sfx = (0, _ui_utils.approximateFraction)(outputScale.sx);
      var sfy = (0, _ui_utils.approximateFraction)(outputScale.sy);
      canvas.width = (0, _ui_utils.roundToDivide)(viewport.width * outputScale.sx, sfx[0]);
      canvas.height = (0, _ui_utils.roundToDivide)(viewport.height * outputScale.sy, sfy[0]);
      canvas.style.width = (0, _ui_utils.roundToDivide)(viewport.width, sfx[1]) + 'px';
      canvas.style.height = (0, _ui_utils.roundToDivide)(viewport.height, sfy[1]) + 'px';
      this.paintedViewportMap.set(canvas, viewport);
      var transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];
      var renderContext = {
        canvasContext: ctx,
        transform: transform,
        viewport: this.viewport,
        enableWebGL: this.enableWebGL,
        renderInteractiveForms: this.renderInteractiveForms
      };
      var renderTask = this.pdfPage.render(renderContext);

      renderTask.onContinue = function (cont) {
        showCanvas();

        if (result.onRenderContinue) {
          result.onRenderContinue(cont);
        } else {
          cont();
        }
      };

      renderTask.promise.then(function () {
        showCanvas();
        renderCapability.resolve(undefined);
      }, function (error) {
        showCanvas();
        renderCapability.reject(error);
      });
      return result;
    }
  }, {
    key: "paintOnSvg",
    value: function paintOnSvg(wrapper) {
      var _this2 = this;

      var cancelled = false;

      var ensureNotCancelled = function ensureNotCancelled() {
        if (cancelled) {
          throw new _pdfjsLib.RenderingCancelledException('Rendering cancelled, page ' + _this2.id, 'svg');
        }
      };

      var pdfPage = this.pdfPage;
      var actualSizeViewport = this.viewport.clone({
        scale: _ui_utils.CSS_UNITS
      });
      var promise = pdfPage.getOperatorList().then(function (opList) {
        ensureNotCancelled();
        var svgGfx = new _pdfjsLib.SVGGraphics(pdfPage.commonObjs, pdfPage.objs);
        return svgGfx.getSVG(opList, actualSizeViewport).then(function (svg) {
          ensureNotCancelled();
          _this2.svg = svg;

          _this2.paintedViewportMap.set(svg, actualSizeViewport);

          svg.style.width = wrapper.style.width;
          svg.style.height = wrapper.style.height;
          _this2.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
          wrapper.appendChild(svg);
        });
      });
      return {
        promise: promise,
        onRenderContinue: function onRenderContinue(cont) {
          cont();
        },
        cancel: function cancel() {
          cancelled = true;
        }
      };
    }
  }, {
    key: "setPageLabel",
    value: function setPageLabel(label) {
      this.pageLabel = typeof label === 'string' ? label : null;

      if (this.pageLabel !== null) {
        this.div.setAttribute('data-page-label', this.pageLabel);
      } else {
        this.div.removeAttribute('data-page-label');
      }
    }
  }, {
    key: "width",
    get: function get() {
      return this.viewport.width;
    }
  }, {
    key: "height",
    get: function get() {
      return this.viewport.height;
    }
  }]);

  return PDFPageView;
}();

exports.PDFPageView = PDFPageView;

/***/ }),
/* 32 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.DefaultTextLayerFactory = exports.TextLayerBuilder = void 0;

var _ui_utils = __webpack_require__(6);

var _pdfjsLib = __webpack_require__(7);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var EXPAND_DIVS_TIMEOUT = 300;

var TextLayerBuilder =
/*#__PURE__*/
function () {
  function TextLayerBuilder(_ref) {
    var textLayerDiv = _ref.textLayerDiv,
        eventBus = _ref.eventBus,
        pageIndex = _ref.pageIndex,
        viewport = _ref.viewport,
        _ref$findController = _ref.findController,
        findController = _ref$findController === void 0 ? null : _ref$findController,
        _ref$enhanceTextSelec = _ref.enhanceTextSelection,
        enhanceTextSelection = _ref$enhanceTextSelec === void 0 ? false : _ref$enhanceTextSelec;

    _classCallCheck(this, TextLayerBuilder);

    this.textLayerDiv = textLayerDiv;
    this.eventBus = eventBus || (0, _ui_utils.getGlobalEventBus)();
    this.textContent = null;
    this.textContentItemsStr = [];
    this.textContentStream = null;
    this.renderingDone = false;
    this.pageIdx = pageIndex;
    this.pageNumber = this.pageIdx + 1;
    this.matches = [];
    this.viewport = viewport;
    this.textDivs = [];
    this.findController = findController;
    this.textLayerRenderTask = null;
    this.enhanceTextSelection = enhanceTextSelection;
    this._boundEvents = Object.create(null);

    this._bindEvents();

    this._bindMouse();
  }

  _createClass(TextLayerBuilder, [{
    key: "_finishRendering",
    value: function _finishRendering() {
      this.renderingDone = true;

      if (!this.enhanceTextSelection) {
        var endOfContent = document.createElement('div');
        endOfContent.className = 'endOfContent';
        this.textLayerDiv.appendChild(endOfContent);
      }

      this.eventBus.dispatch('textlayerrendered', {
        source: this,
        pageNumber: this.pageNumber,
        numTextDivs: this.textDivs.length
      });
    }
  }, {
    key: "render",
    value: function render() {
      var _this = this;

      var timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;

      if (!(this.textContent || this.textContentStream) || this.renderingDone) {
        return;
      }

      this.cancel();
      this.textDivs = [];
      var textLayerFrag = document.createDocumentFragment();
      this.textLayerRenderTask = (0, _pdfjsLib.renderTextLayer)({
        textContent: this.textContent,
        textContentStream: this.textContentStream,
        container: textLayerFrag,
        viewport: this.viewport,
        textDivs: this.textDivs,
        textContentItemsStr: this.textContentItemsStr,
        timeout: timeout,
        enhanceTextSelection: this.enhanceTextSelection
      });
      this.textLayerRenderTask.promise.then(function () {
        _this.textLayerDiv.appendChild(textLayerFrag);

        _this._finishRendering();

        _this._updateMatches();
      }, function (reason) {});
    }
  }, {
    key: "cancel",
    value: function cancel() {
      if (this.textLayerRenderTask) {
        this.textLayerRenderTask.cancel();
        this.textLayerRenderTask = null;
      }
    }
  }, {
    key: "setTextContentStream",
    value: function setTextContentStream(readableStream) {
      this.cancel();
      this.textContentStream = readableStream;
    }
  }, {
    key: "setTextContent",
    value: function setTextContent(textContent) {
      this.cancel();
      this.textContent = textContent;
    }
  }, {
    key: "_convertMatches",
    value: function _convertMatches(matches, matchesLength) {
      if (!matches) {
        return [];
      }

      var findController = this.findController,
          textContentItemsStr = this.textContentItemsStr;
      var i = 0,
          iIndex = 0;
      var end = textContentItemsStr.length - 1;
      var queryLen = findController.state.query.length;
      var result = [];

      for (var m = 0, mm = matches.length; m < mm; m++) {
        var matchIdx = matches[m];

        while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {
          iIndex += textContentItemsStr[i].length;
          i++;
        }

        if (i === textContentItemsStr.length) {
          console.error('Could not find a matching mapping');
        }

        var match = {
          begin: {
            divIdx: i,
            offset: matchIdx - iIndex
          }
        };

        if (matchesLength) {
          matchIdx += matchesLength[m];
        } else {
          matchIdx += queryLen;
        }

        while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {
          iIndex += textContentItemsStr[i].length;
          i++;
        }

        match.end = {
          divIdx: i,
          offset: matchIdx - iIndex
        };
        result.push(match);
      }

      return result;
    }
  }, {
    key: "_renderMatches",
    value: function _renderMatches(matches) {
      if (matches.length === 0) {
        return;
      }

      var findController = this.findController,
          pageIdx = this.pageIdx,
          textContentItemsStr = this.textContentItemsStr,
          textDivs = this.textDivs;
      var isSelectedPage = pageIdx === findController.selected.pageIdx;
      var selectedMatchIdx = findController.selected.matchIdx;
      var highlightAll = findController.state.highlightAll;
      var prevEnd = null;
      var infinity = {
        divIdx: -1,
        offset: undefined
      };

      function beginText(begin, className) {
        var divIdx = begin.divIdx;
        textDivs[divIdx].textContent = '';
        appendTextToDiv(divIdx, 0, begin.offset, className);
      }

      function appendTextToDiv(divIdx, fromOffset, toOffset, className) {
        var div = textDivs[divIdx];
        var content = textContentItemsStr[divIdx].substring(fromOffset, toOffset);
        var node = document.createTextNode(content);

        if (className) {
          var span = document.createElement('span');
          span.className = className;
          span.appendChild(node);
          div.appendChild(span);
          return;
        }

        div.appendChild(node);
      }

      var i0 = selectedMatchIdx,
          i1 = i0 + 1;

      if (highlightAll) {
        i0 = 0;
        i1 = matches.length;
      } else if (!isSelectedPage) {
        return;
      }

      for (var i = i0; i < i1; i++) {
        var match = matches[i];
        var begin = match.begin;
        var end = match.end;
        var isSelected = isSelectedPage && i === selectedMatchIdx;
        var highlightSuffix = isSelected ? ' selected' : '';

        if (isSelected) {
          findController.scrollMatchIntoView({
            element: textDivs[begin.divIdx],
            pageIndex: pageIdx,
            matchIndex: selectedMatchIdx
          });
        }

        if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {
          if (prevEnd !== null) {
            appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
          }

          beginText(begin);
        } else {
          appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);
        }

        if (begin.divIdx === end.divIdx) {
          appendTextToDiv(begin.divIdx, begin.offset, end.offset, 'highlight' + highlightSuffix);
        } else {
          appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, 'highlight begin' + highlightSuffix);

          for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {
            textDivs[n0].className = 'highlight middle' + highlightSuffix;
          }

          beginText(end, 'highlight end' + highlightSuffix);
        }

        prevEnd = end;
      }

      if (prevEnd) {
        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
      }
    }
  }, {
    key: "_updateMatches",
    value: function _updateMatches() {
      if (!this.renderingDone) {
        return;
      }

      var findController = this.findController,
          matches = this.matches,
          pageIdx = this.pageIdx,
          textContentItemsStr = this.textContentItemsStr,
          textDivs = this.textDivs;
      var clearedUntilDivIdx = -1;

      for (var i = 0, ii = matches.length; i < ii; i++) {
        var match = matches[i];
        var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);

        for (var n = begin, end = match.end.divIdx; n <= end; n++) {
          var div = textDivs[n];
          div.textContent = textContentItemsStr[n];
          div.className = '';
        }

        clearedUntilDivIdx = match.end.divIdx + 1;
      }

      if (!findController || !findController.highlightMatches) {
        return;
      }

      var pageMatches = findController.pageMatches[pageIdx] || null;
      var pageMatchesLength = findController.pageMatchesLength[pageIdx] || null;
      this.matches = this._convertMatches(pageMatches, pageMatchesLength);

      this._renderMatches(this.matches);
    }
  }, {
    key: "_bindEvents",
    value: function _bindEvents() {
      var _this2 = this;

      var eventBus = this.eventBus,
          _boundEvents = this._boundEvents;

      _boundEvents.pageCancelled = function (evt) {
        if (evt.pageNumber !== _this2.pageNumber) {
          return;
        }

        if (_this2.textLayerRenderTask) {
          console.error('TextLayerBuilder._bindEvents: `this.cancel()` should ' + 'have been called when the page was reset, or rendering cancelled.');
          return;
        }

        for (var name in _boundEvents) {
          eventBus.off(name.toLowerCase(), _boundEvents[name]);
          delete _boundEvents[name];
        }
      };

      _boundEvents.updateTextLayerMatches = function (evt) {
        if (evt.pageIndex !== _this2.pageIdx && evt.pageIndex !== -1) {
          return;
        }

        _this2._updateMatches();
      };

      eventBus.on('pagecancelled', _boundEvents.pageCancelled);
      eventBus.on('updatetextlayermatches', _boundEvents.updateTextLayerMatches);
    }
  }, {
    key: "_bindMouse",
    value: function _bindMouse() {
      var _this3 = this;

      var div = this.textLayerDiv;
      var expandDivsTimer = null;
      div.addEventListener('mousedown', function (evt) {
        if (_this3.enhanceTextSelection && _this3.textLayerRenderTask) {
          _this3.textLayerRenderTask.expandTextDivs(true);

          if (expandDivsTimer) {
            clearTimeout(expandDivsTimer);
            expandDivsTimer = null;
          }

          return;
        }

        var end = div.querySelector('.endOfContent');

        if (!end) {
          return;
        }

        var adjustTop = evt.target !== div;
        adjustTop = adjustTop && window.getComputedStyle(end).getPropertyValue('-moz-user-select') !== 'none';

        if (adjustTop) {
          var divBounds = div.getBoundingClientRect();
          var r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height);
          end.style.top = (r * 100).toFixed(2) + '%';
        }

        end.classList.add('active');
      });
      div.addEventListener('mouseup', function () {
        if (_this3.enhanceTextSelection && _this3.textLayerRenderTask) {
          expandDivsTimer = setTimeout(function () {
            if (_this3.textLayerRenderTask) {
              _this3.textLayerRenderTask.expandTextDivs(false);
            }

            expandDivsTimer = null;
          }, EXPAND_DIVS_TIMEOUT);
          return;
        }

        var end = div.querySelector('.endOfContent');

        if (!end) {
          return;
        }

        end.style.top = '';
        end.classList.remove('active');
      });
    }
  }]);

  return TextLayerBuilder;
}();

exports.TextLayerBuilder = TextLayerBuilder;

var DefaultTextLayerFactory =
/*#__PURE__*/
function () {
  function DefaultTextLayerFactory() {
    _classCallCheck(this, DefaultTextLayerFactory);
  }

  _createClass(DefaultTextLayerFactory, [{
    key: "createTextLayerBuilder",
    value: function createTextLayerBuilder(textLayerDiv, pageIndex, viewport) {
      var enhanceTextSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
      return new TextLayerBuilder({
        textLayerDiv: textLayerDiv,
        pageIndex: pageIndex,
        viewport: viewport,
        enhanceTextSelection: enhanceTextSelection
      });
    }
  }]);

  return DefaultTextLayerFactory;
}();

exports.DefaultTextLayerFactory = DefaultTextLayerFactory;

/***/ }),
/* 33 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.SecondaryToolbar = void 0;

var _ui_utils = __webpack_require__(6);

var _pdf_cursor_tools = __webpack_require__(8);

var _pdf_single_page_viewer = __webpack_require__(34);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var SecondaryToolbar =
/*#__PURE__*/
function () {
  function SecondaryToolbar(options, mainContainer, eventBus) {
    var _this = this;

    _classCallCheck(this, SecondaryToolbar);

    this.toolbar = options.toolbar;
    this.toggleButton = options.toggleButton;
    this.toolbarButtonContainer = options.toolbarButtonContainer;
    this.buttons = [{
      element: options.presentationModeButton,
      eventName: 'presentationmode',
      close: true
    }, {
      element: options.openFileButton,
      eventName: 'openfile',
      close: true
    }, {
      element: options.printButton,
      eventName: 'print',
      close: true
    }, {
      element: options.downloadButton,
      eventName: 'download',
      close: true
    }, {
      element: options.viewBookmarkButton,
      eventName: null,
      close: true
    }, {
      element: options.firstPageButton,
      eventName: 'firstpage',
      close: true
    }, {
      element: options.lastPageButton,
      eventName: 'lastpage',
      close: true
    }, {
      element: options.pageRotateCwButton,
      eventName: 'rotatecw',
      close: false
    }, {
      element: options.pageRotateCcwButton,
      eventName: 'rotateccw',
      close: false
    }, {
      element: options.cursorSelectToolButton,
      eventName: 'switchcursortool',
      eventDetails: {
        tool: _pdf_cursor_tools.CursorTool.SELECT
      },
      close: true
    }, {
      element: options.cursorHandToolButton,
      eventName: 'switchcursortool',
      eventDetails: {
        tool: _pdf_cursor_tools.CursorTool.HAND
      },
      close: true
    }, {
      element: options.scrollVerticalButton,
      eventName: 'switchscrollmode',
      eventDetails: {
        mode: _ui_utils.ScrollMode.VERTICAL
      },
      close: true
    }, {
      element: options.scrollHorizontalButton,
      eventName: 'switchscrollmode',
      eventDetails: {
        mode: _ui_utils.ScrollMode.HORIZONTAL
      },
      close: true
    }, {
      element: options.scrollWrappedButton,
      eventName: 'switchscrollmode',
      eventDetails: {
        mode: _ui_utils.ScrollMode.WRAPPED
      },
      close: true
    }, {
      element: options.spreadNoneButton,
      eventName: 'switchspreadmode',
      eventDetails: {
        mode: _ui_utils.SpreadMode.NONE
      },
      close: true
    }, {
      element: options.spreadOddButton,
      eventName: 'switchspreadmode',
      eventDetails: {
        mode: _ui_utils.SpreadMode.ODD
      },
      close: true
    }, {
      element: options.spreadEvenButton,
      eventName: 'switchspreadmode',
      eventDetails: {
        mode: _ui_utils.SpreadMode.EVEN
      },
      close: true
    }, {
      element: options.documentPropertiesButton,
      eventName: 'documentproperties',
      close: true
    }];
    this.items = {
      firstPage: options.firstPageButton,
      lastPage: options.lastPageButton,
      pageRotateCw: options.pageRotateCwButton,
      pageRotateCcw: options.pageRotateCcwButton
    };
    this.mainContainer = mainContainer;
    this.eventBus = eventBus;
    this.opened = false;
    this.containerHeight = null;
    this.previousContainerHeight = null;
    this.reset();

    this._bindClickListeners();

    this._bindCursorToolsListener(options);

    this._bindScrollModeListener(options);

    this._bindSpreadModeListener(options);

    this.eventBus.on('resize', this._setMaxHeight.bind(this));
    this.eventBus.on('baseviewerinit', function (evt) {
      if (evt.source instanceof _pdf_single_page_viewer.PDFSinglePageViewer) {
        _this.toolbarButtonContainer.classList.add('hiddenScrollModeButtons', 'hiddenSpreadModeButtons');
      } else {
        _this.toolbarButtonContainer.classList.remove('hiddenScrollModeButtons', 'hiddenSpreadModeButtons');
      }
    });
  }

  _createClass(SecondaryToolbar, [{
    key: "setPageNumber",
    value: function setPageNumber(pageNumber) {
      this.pageNumber = pageNumber;

      this._updateUIState();
    }
  }, {
    key: "setPagesCount",
    value: function setPagesCount(pagesCount) {
      this.pagesCount = pagesCount;

      this._updateUIState();
    }
  }, {
    key: "reset",
    value: function reset() {
      this.pageNumber = 0;
      this.pagesCount = 0;

      this._updateUIState();

      this.eventBus.dispatch('secondarytoolbarreset', {
        source: this
      });
    }
  }, {
    key: "_updateUIState",
    value: function _updateUIState() {
      this.items.firstPage.disabled = this.pageNumber <= 1;
      this.items.lastPage.disabled = this.pageNumber >= this.pagesCount;
      this.items.pageRotateCw.disabled = this.pagesCount === 0;
      this.items.pageRotateCcw.disabled = this.pagesCount === 0;
    }
  }, {
    key: "_bindClickListeners",
    value: function _bindClickListeners() {
      var _this2 = this;

      this.toggleButton.addEventListener('click', this.toggle.bind(this));

      var _loop = function _loop(button) {
        var _this2$buttons$button = _this2.buttons[button],
            element = _this2$buttons$button.element,
            eventName = _this2$buttons$button.eventName,
            close = _this2$buttons$button.close,
            eventDetails = _this2$buttons$button.eventDetails;
        element.addEventListener('click', function (evt) {
          if (eventName !== null) {
            var details = {
              source: _this2
            };

            for (var property in eventDetails) {
              details[property] = eventDetails[property];
            }

            _this2.eventBus.dispatch(eventName, details);
          }

          if (close) {
            _this2.close();
          }
        });
      };

      for (var button in this.buttons) {
        _loop(button);
      }
    }
  }, {
    key: "_bindCursorToolsListener",
    value: function _bindCursorToolsListener(buttons) {
      this.eventBus.on('cursortoolchanged', function (_ref) {
        var tool = _ref.tool;
        buttons.cursorSelectToolButton.classList.toggle('toggled', tool === _pdf_cursor_tools.CursorTool.SELECT);
        buttons.cursorHandToolButton.classList.toggle('toggled', tool === _pdf_cursor_tools.CursorTool.HAND);
      });
    }
  }, {
    key: "_bindScrollModeListener",
    value: function _bindScrollModeListener(buttons) {
      var _this3 = this;

      function scrollModeChanged(_ref2) {
        var mode = _ref2.mode;
        buttons.scrollVerticalButton.classList.toggle('toggled', mode === _ui_utils.ScrollMode.VERTICAL);
        buttons.scrollHorizontalButton.classList.toggle('toggled', mode === _ui_utils.ScrollMode.HORIZONTAL);
        buttons.scrollWrappedButton.classList.toggle('toggled', mode === _ui_utils.ScrollMode.WRAPPED);
        var isScrollModeHorizontal = mode === _ui_utils.ScrollMode.HORIZONTAL;
        buttons.spreadNoneButton.disabled = isScrollModeHorizontal;
        buttons.spreadOddButton.disabled = isScrollModeHorizontal;
        buttons.spreadEvenButton.disabled = isScrollModeHorizontal;
      }

      this.eventBus.on('scrollmodechanged', scrollModeChanged);
      this.eventBus.on('secondarytoolbarreset', function (evt) {
        if (evt.source === _this3) {
          scrollModeChanged({
            mode: _ui_utils.ScrollMode.VERTICAL
          });
        }
      });
    }
  }, {
    key: "_bindSpreadModeListener",
    value: function _bindSpreadModeListener(buttons) {
      var _this4 = this;

      function spreadModeChanged(_ref3) {
        var mode = _ref3.mode;
        buttons.spreadNoneButton.classList.toggle('toggled', mode === _ui_utils.SpreadMode.NONE);
        buttons.spreadOddButton.classList.toggle('toggled', mode === _ui_utils.SpreadMode.ODD);
        buttons.spreadEvenButton.classList.toggle('toggled', mode === _ui_utils.SpreadMode.EVEN);
      }

      this.eventBus.on('spreadmodechanged', spreadModeChanged);
      this.eventBus.on('secondarytoolbarreset', function (evt) {
        if (evt.source === _this4) {
          spreadModeChanged({
            mode: _ui_utils.SpreadMode.NONE
          });
        }
      });
    }
  }, {
    key: "open",
    value: function open() {
      if (this.opened) {
        return;
      }

      this.opened = true;

      this._setMaxHeight();

      this.toggleButton.classList.add('toggled');
      this.toolbar.classList.remove('hidden');
    }
  }, {
    key: "close",
    value: function close() {
      if (!this.opened) {
        return;
      }

      this.opened = false;
      this.toolbar.classList.add('hidden');
      this.toggleButton.classList.remove('toggled');
    }
  }, {
    key: "toggle",
    value: function toggle() {
      if (this.opened) {
        this.close();
      } else {
        this.open();
      }
    }
  }, {
    key: "_setMaxHeight",
    value: function _setMaxHeight() {
      if (!this.opened) {
        return;
      }

      this.containerHeight = this.mainContainer.clientHeight;

      if (this.containerHeight === this.previousContainerHeight) {
        return;
      }

      this.toolbarButtonContainer.setAttribute('style', 'max-height: ' + (this.containerHeight - _ui_utils.SCROLLBAR_PADDING) + 'px;');
      this.previousContainerHeight = this.containerHeight;
    }
  }, {
    key: "isOpen",
    get: function get() {
      return this.opened;
    }
  }]);

  return SecondaryToolbar;
}();

exports.SecondaryToolbar = SecondaryToolbar;

/***/ }),
/* 34 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFSinglePageViewer = void 0;

var _base_viewer = __webpack_require__(29);

var _pdfjsLib = __webpack_require__(7);

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }

function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

var PDFSinglePageViewer =
/*#__PURE__*/
function (_BaseViewer) {
  _inherits(PDFSinglePageViewer, _BaseViewer);

  function PDFSinglePageViewer(options) {
    var _this;

    _classCallCheck(this, PDFSinglePageViewer);

    _this = _possibleConstructorReturn(this, _getPrototypeOf(PDFSinglePageViewer).call(this, options));

    _this.eventBus.on('pagesinit', function (evt) {
      _this._ensurePageViewVisible();
    });

    return _this;
  }

  _createClass(PDFSinglePageViewer, [{
    key: "_resetView",
    value: function _resetView() {
      _get(_getPrototypeOf(PDFSinglePageViewer.prototype), "_resetView", this).call(this);

      this._previousPageNumber = 1;
      this._shadowViewer = document.createDocumentFragment();
      this._updateScrollDown = null;
    }
  }, {
    key: "_ensurePageViewVisible",
    value: function _ensurePageViewVisible() {
      var pageView = this._pages[this._currentPageNumber - 1];
      var previousPageView = this._pages[this._previousPageNumber - 1];
      var viewerNodes = this.viewer.childNodes;

      switch (viewerNodes.length) {
        case 0:
          this.viewer.appendChild(pageView.div);
          break;

        case 1:
          if (viewerNodes[0] !== previousPageView.div) {
            throw new Error('_ensurePageViewVisible: Unexpected previously visible page.');
          }

          if (pageView === previousPageView) {
            break;
          }

          this._shadowViewer.appendChild(previousPageView.div);

          this.viewer.appendChild(pageView.div);
          this.container.scrollTop = 0;
          break;

        default:
          throw new Error('_ensurePageViewVisible: Only one page should be visible at a time.');
      }

      this._previousPageNumber = this._currentPageNumber;
    }
  }, {
    key: "_scrollUpdate",
    value: function _scrollUpdate() {
      if (this._updateScrollDown) {
        this._updateScrollDown();
      }

      _get(_getPrototypeOf(PDFSinglePageViewer.prototype), "_scrollUpdate", this).call(this);
    }
  }, {
    key: "_scrollIntoView",
    value: function _scrollIntoView(_ref) {
      var _this2 = this;

      var pageDiv = _ref.pageDiv,
          _ref$pageSpot = _ref.pageSpot,
          pageSpot = _ref$pageSpot === void 0 ? null : _ref$pageSpot,
          _ref$pageNumber = _ref.pageNumber,
          pageNumber = _ref$pageNumber === void 0 ? null : _ref$pageNumber;

      if (pageNumber) {
        this._setCurrentPageNumber(pageNumber);
      }

      var scrolledDown = this._currentPageNumber >= this._previousPageNumber;

      this._ensurePageViewVisible();

      this.update();

      _get(_getPrototypeOf(PDFSinglePageViewer.prototype), "_scrollIntoView", this).call(this, {
        pageDiv: pageDiv,
        pageSpot: pageSpot,
        pageNumber: pageNumber
      });

      this._updateScrollDown = function () {
        _this2.scroll.down = scrolledDown;
        _this2._updateScrollDown = null;
      };
    }
  }, {
    key: "_getVisiblePages",
    value: function _getVisiblePages() {
      return this._getCurrentVisiblePage();
    }
  }, {
    key: "_updateHelper",
    value: function _updateHelper(visiblePages) {}
  }, {
    key: "_updateScrollMode",
    value: function _updateScrollMode() {}
  }, {
    key: "_updateSpreadMode",
    value: function _updateSpreadMode() {}
  }, {
    key: "_setDocumentViewerElement",
    get: function get() {
      return (0, _pdfjsLib.shadow)(this, '_setDocumentViewerElement', this._shadowViewer);
    }
  }, {
    key: "_isScrollModeHorizontal",
    get: function get() {
      return (0, _pdfjsLib.shadow)(this, '_isScrollModeHorizontal', false);
    }
  }]);

  return PDFSinglePageViewer;
}(_base_viewer.BaseViewer);

exports.PDFSinglePageViewer = PDFSinglePageViewer;

/***/ }),
/* 35 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Toolbar = void 0;

var _ui_utils = __webpack_require__(6);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading';
var SCALE_SELECT_CONTAINER_PADDING = 8;
var SCALE_SELECT_PADDING = 22;

var Toolbar =
/*#__PURE__*/
function () {
  function Toolbar(options, eventBus) {
    var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;

    _classCallCheck(this, Toolbar);

    this.toolbar = options.container;
    this.eventBus = eventBus;
    this.l10n = l10n;
    this.items = options;
    this._wasLocalized = false;
    this.reset();

    this._bindListeners();
  }

  _createClass(Toolbar, [{
    key: "setPageNumber",
    value: function setPageNumber(pageNumber, pageLabel) {
      this.pageNumber = pageNumber;
      this.pageLabel = pageLabel;

      this._updateUIState(false);
    }
  }, {
    key: "setPagesCount",
    value: function setPagesCount(pagesCount, hasPageLabels) {
      this.pagesCount = pagesCount;
      this.hasPageLabels = hasPageLabels;

      this._updateUIState(true);
    }
  }, {
    key: "setPageScale",
    value: function setPageScale(pageScaleValue, pageScale) {
      this.pageScaleValue = (pageScaleValue || pageScale).toString();
      this.pageScale = pageScale;

      this._updateUIState(false);
    }
  }, {
    key: "reset",
    value: function reset() {
      this.pageNumber = 0;
      this.pageLabel = null;
      this.hasPageLabels = false;
      this.pagesCount = 0;
      this.pageScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;
      this.pageScale = _ui_utils.DEFAULT_SCALE;

      this._updateUIState(true);
    }
  }, {
    key: "_bindListeners",
    value: function _bindListeners() {
      var _this = this;

      var eventBus = this.eventBus,
          items = this.items;
      var self = this;
      items.previous.addEventListener('click', function () {
        eventBus.dispatch('previouspage', {
          source: self
        });
      });
      items.next.addEventListener('click', function () {
        eventBus.dispatch('nextpage', {
          source: self
        });
      });
      items.zoomIn.addEventListener('click', function () {
        eventBus.dispatch('zoomin', {
          source: self
        });
      });
      items.zoomOut.addEventListener('click', function () {
        eventBus.dispatch('zoomout', {
          source: self
        });
      });
      items.pageNumber.addEventListener('click', function () {
        this.select();
      });
      items.pageNumber.addEventListener('change', function () {
        eventBus.dispatch('pagenumberchanged', {
          source: self,
          value: this.value
        });
      });
      items.scaleSelect.addEventListener('change', function () {
        if (this.value === 'custom') {
          return;
        }

        eventBus.dispatch('scalechanged', {
          source: self,
          value: this.value
        });
      });
      items.presentationModeButton.addEventListener('click', function () {
        eventBus.dispatch('presentationmode', {
          source: self
        });
      });
      items.openFile.addEventListener('click', function () {
        eventBus.dispatch('openfile', {
          source: self
        });
      });
      items.print.addEventListener('click', function () {
        eventBus.dispatch('print', {
          source: self
        });
      });
      items.download.addEventListener('click', function () {
        eventBus.dispatch('download', {
          source: self
        });
      });
      items.scaleSelect.oncontextmenu = _ui_utils.noContextMenuHandler;
      eventBus.on('localized', function () {
        _this._localized();
      });
    }
  }, {
    key: "_localized",
    value: function _localized() {
      this._wasLocalized = true;

      this._adjustScaleWidth();

      this._updateUIState(true);
    }
  }, {
    key: "_updateUIState",
    value: function _updateUIState() {
      var resetNumPages = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;

      if (!this._wasLocalized) {
        return;
      }

      var pageNumber = this.pageNumber,
          pagesCount = this.pagesCount,
          pageScaleValue = this.pageScaleValue,
          pageScale = this.pageScale,
          items = this.items;

      if (resetNumPages) {
        if (this.hasPageLabels) {
          items.pageNumber.type = 'text';
        } else {
          items.pageNumber.type = 'number';
          this.l10n.get('of_pages', {
            pagesCount: pagesCount
          }, 'of {{pagesCount}}').then(function (msg) {
            items.numPages.textContent = msg;
          });
        }

        items.pageNumber.max = pagesCount;
      }

      if (this.hasPageLabels) {
        items.pageNumber.value = this.pageLabel;
        this.l10n.get('page_of_pages', {
          pageNumber: pageNumber,
          pagesCount: pagesCount
        }, '({{pageNumber}} of {{pagesCount}})').then(function (msg) {
          items.numPages.textContent = msg;
        });
      } else {
        items.pageNumber.value = pageNumber;
      }

      items.previous.disabled = pageNumber <= 1;
      items.next.disabled = pageNumber >= pagesCount;
      items.zoomOut.disabled = pageScale <= _ui_utils.MIN_SCALE;
      items.zoomIn.disabled = pageScale >= _ui_utils.MAX_SCALE;
      var customScale = Math.round(pageScale * 10000) / 100;
      this.l10n.get('page_scale_percent', {
        scale: customScale
      }, '{{scale}}%').then(function (msg) {
        var options = items.scaleSelect.options;
        var predefinedValueFound = false;

        for (var i = 0, ii = options.length; i < ii; i++) {
          var option = options[i];

          if (option.value !== pageScaleValue) {
            option.selected = false;
            continue;
          }

          option.selected = true;
          predefinedValueFound = true;
        }

        if (!predefinedValueFound) {
          items.customScaleOption.textContent = msg;
          items.customScaleOption.selected = true;
        }
      });
    }
  }, {
    key: "updateLoadingIndicatorState",
    value: function updateLoadingIndicatorState() {
      var loading = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
      var pageNumberInput = this.items.pageNumber;
      pageNumberInput.classList.toggle(PAGE_NUMBER_LOADING_INDICATOR, loading);
    }
  }, {
    key: "_adjustScaleWidth",
    value: function _adjustScaleWidth() {
      var container = this.items.scaleSelectContainer;
      var select = this.items.scaleSelect;

      _ui_utils.animationStarted.then(function () {
        if (container.clientWidth === 0) {
          container.setAttribute('style', 'display: inherit;');
        }

        if (container.clientWidth > 0) {
          select.setAttribute('style', 'min-width: inherit;');
          var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;
          select.setAttribute('style', 'min-width: ' + (width + SCALE_SELECT_PADDING) + 'px;');
          container.setAttribute('style', 'min-width: ' + width + 'px; ' + 'max-width: ' + width + 'px;');
        }
      });
    }
  }]);

  return Toolbar;
}();

exports.Toolbar = Toolbar;

/***/ }),
/* 36 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ViewHistory = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(2));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;

var ViewHistory =
/*#__PURE__*/
function () {
  function ViewHistory(fingerprint) {
    var _this = this;

    var cacheSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_VIEW_HISTORY_CACHE_SIZE;

    _classCallCheck(this, ViewHistory);

    this.fingerprint = fingerprint;
    this.cacheSize = cacheSize;
    this._initializedPromise = this._readFromStorage().then(function (databaseStr) {
      var database = JSON.parse(databaseStr || '{}');

      if (!('files' in database)) {
        database.files = [];
      } else {
        while (database.files.length >= _this.cacheSize) {
          database.files.shift();
        }
      }

      var index = -1;

      for (var i = 0, length = database.files.length; i < length; i++) {
        var branch = database.files[i];

        if (branch.fingerprint === _this.fingerprint) {
          index = i;
          break;
        }
      }

      if (index === -1) {
        index = database.files.push({
          fingerprint: _this.fingerprint
        }) - 1;
      }

      _this.file = database.files[index];
      _this.database = database;
    });
  }

  _createClass(ViewHistory, [{
    key: "_writeToStorage",
    value: function () {
      var _writeToStorage2 = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee() {
        var databaseStr;
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                databaseStr = JSON.stringify(this.database);
                localStorage.setItem('pdfjs.history', databaseStr);

              case 2:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function _writeToStorage() {
        return _writeToStorage2.apply(this, arguments);
      }

      return _writeToStorage;
    }()
  }, {
    key: "_readFromStorage",
    value: function () {
      var _readFromStorage2 = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee2() {
        return _regenerator.default.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                return _context2.abrupt("return", localStorage.getItem('pdfjs.history'));

              case 1:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      function _readFromStorage() {
        return _readFromStorage2.apply(this, arguments);
      }

      return _readFromStorage;
    }()
  }, {
    key: "set",
    value: function () {
      var _set = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee3(name, val) {
        return _regenerator.default.wrap(function _callee3$(_context3) {
          while (1) {
            switch (_context3.prev = _context3.next) {
              case 0:
                _context3.next = 2;
                return this._initializedPromise;

              case 2:
                this.file[name] = val;
                return _context3.abrupt("return", this._writeToStorage());

              case 4:
              case "end":
                return _context3.stop();
            }
          }
        }, _callee3, this);
      }));

      function set(_x, _x2) {
        return _set.apply(this, arguments);
      }

      return set;
    }()
  }, {
    key: "setMultiple",
    value: function () {
      var _setMultiple = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee4(properties) {
        var name;
        return _regenerator.default.wrap(function _callee4$(_context4) {
          while (1) {
            switch (_context4.prev = _context4.next) {
              case 0:
                _context4.next = 2;
                return this._initializedPromise;

              case 2:
                for (name in properties) {
                  this.file[name] = properties[name];
                }

                return _context4.abrupt("return", this._writeToStorage());

              case 4:
              case "end":
                return _context4.stop();
            }
          }
        }, _callee4, this);
      }));

      function setMultiple(_x3) {
        return _setMultiple.apply(this, arguments);
      }

      return setMultiple;
    }()
  }, {
    key: "get",
    value: function () {
      var _get = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee5(name, defaultValue) {
        var val;
        return _regenerator.default.wrap(function _callee5$(_context5) {
          while (1) {
            switch (_context5.prev = _context5.next) {
              case 0:
                _context5.next = 2;
                return this._initializedPromise;

              case 2:
                val = this.file[name];
                return _context5.abrupt("return", val !== undefined ? val : defaultValue);

              case 4:
              case "end":
                return _context5.stop();
            }
          }
        }, _callee5, this);
      }));

      function get(_x4, _x5) {
        return _get.apply(this, arguments);
      }

      return get;
    }()
  }, {
    key: "getMultiple",
    value: function () {
      var _getMultiple = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee6(properties) {
        var values, name, val;
        return _regenerator.default.wrap(function _callee6$(_context6) {
          while (1) {
            switch (_context6.prev = _context6.next) {
              case 0:
                _context6.next = 2;
                return this._initializedPromise;

              case 2:
                values = Object.create(null);

                for (name in properties) {
                  val = this.file[name];
                  values[name] = val !== undefined ? val : properties[name];
                }

                return _context6.abrupt("return", values);

              case 5:
              case "end":
                return _context6.stop();
            }
          }
        }, _callee6, this);
      }));

      function getMultiple(_x6) {
        return _getMultiple.apply(this, arguments);
      }

      return getMultiple;
    }()
  }]);

  return ViewHistory;
}();

exports.ViewHistory = ViewHistory;

/***/ }),
/* 37 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.GenericCom = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(2));

var _app = __webpack_require__(1);

var _preferences = __webpack_require__(38);

var _download_manager = __webpack_require__(39);

var _genericl10n = __webpack_require__(40);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

;
var GenericCom = {};
exports.GenericCom = GenericCom;

var GenericPreferences =
/*#__PURE__*/
function (_BasePreferences) {
  _inherits(GenericPreferences, _BasePreferences);

  function GenericPreferences() {
    _classCallCheck(this, GenericPreferences);

    return _possibleConstructorReturn(this, _getPrototypeOf(GenericPreferences).apply(this, arguments));
  }

  _createClass(GenericPreferences, [{
    key: "_writeToStorage",
    value: function () {
      var _writeToStorage2 = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee(prefObj) {
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));

              case 1:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function _writeToStorage(_x) {
        return _writeToStorage2.apply(this, arguments);
      }

      return _writeToStorage;
    }()
  }, {
    key: "_readFromStorage",
    value: function () {
      var _readFromStorage2 = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee2(prefObj) {
        return _regenerator.default.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                return _context2.abrupt("return", JSON.parse(localStorage.getItem('pdfjs.preferences')));

              case 1:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      function _readFromStorage(_x2) {
        return _readFromStorage2.apply(this, arguments);
      }

      return _readFromStorage;
    }()
  }]);

  return GenericPreferences;
}(_preferences.BasePreferences);

var GenericExternalServices = Object.create(_app.DefaultExternalServices);

GenericExternalServices.createDownloadManager = function (options) {
  return new _download_manager.DownloadManager(options);
};

GenericExternalServices.createPreferences = function () {
  return new GenericPreferences();
};

GenericExternalServices.createL10n = function (_ref) {
  var _ref$locale = _ref.locale,
      locale = _ref$locale === void 0 ? 'en-US' : _ref$locale;
  return new _genericl10n.GenericL10n(locale);
};

_app.PDFViewerApplication.externalServices = GenericExternalServices;

/***/ }),
/* 38 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.BasePreferences = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(2));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var defaultPreferences = null;

function getDefaultPreferences() {
  if (!defaultPreferences) {
    defaultPreferences = Promise.resolve({
      "viewOnLoad": 0,
      "defaultZoomValue": "",
      "sidebarViewOnLoad": -1,
      "cursorToolOnLoad": 0,
      "enableWebGL": false,
      "eventBusDispatchToDOM": false,
      "pdfBugEnabled": false,
      "disableRange": false,
      "disableStream": false,
      "disableAutoFetch": false,
      "disableFontFace": false,
      "textLayerMode": 1,
      "useOnlyCssZoom": false,
      "externalLinkTarget": 0,
      "renderer": "canvas",
      "renderInteractiveForms": false,
      "enablePrintAutoRotate": false,
      "disablePageLabels": false,
      "historyUpdateUrl": false,
      "scrollModeOnLoad": -1,
      "spreadModeOnLoad": -1
    });
  }

  return defaultPreferences;
}

var BasePreferences =
/*#__PURE__*/
function () {
  function BasePreferences() {
    var _this = this;

    _classCallCheck(this, BasePreferences);

    if (this.constructor === BasePreferences) {
      throw new Error('Cannot initialize BasePreferences.');
    }

    this.prefs = null;
    this._initializedPromise = getDefaultPreferences().then(function (defaults) {
      Object.defineProperty(_this, 'defaults', {
        value: Object.freeze(defaults),
        writable: false,
        enumerable: true,
        configurable: false
      });
      _this.prefs = Object.assign(Object.create(null), defaults);
      return _this._readFromStorage(defaults);
    }).then(function (prefs) {
      if (!prefs) {
        return;
      }

      for (var name in prefs) {
        var defaultValue = _this.defaults[name],
            prefValue = prefs[name];

        if (defaultValue === undefined || _typeof(prefValue) !== _typeof(defaultValue)) {
          continue;
        }

        _this.prefs[name] = prefValue;
      }
    });
  }

  _createClass(BasePreferences, [{
    key: "_writeToStorage",
    value: function () {
      var _writeToStorage2 = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee(prefObj) {
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                throw new Error('Not implemented: _writeToStorage');

              case 1:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function _writeToStorage(_x) {
        return _writeToStorage2.apply(this, arguments);
      }

      return _writeToStorage;
    }()
  }, {
    key: "_readFromStorage",
    value: function () {
      var _readFromStorage2 = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee2(prefObj) {
        return _regenerator.default.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                throw new Error('Not implemented: _readFromStorage');

              case 1:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      function _readFromStorage(_x2) {
        return _readFromStorage2.apply(this, arguments);
      }

      return _readFromStorage;
    }()
  }, {
    key: "reset",
    value: function () {
      var _reset = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee3() {
        return _regenerator.default.wrap(function _callee3$(_context3) {
          while (1) {
            switch (_context3.prev = _context3.next) {
              case 0:
                _context3.next = 2;
                return this._initializedPromise;

              case 2:
                this.prefs = Object.assign(Object.create(null), this.defaults);
                return _context3.abrupt("return", this._writeToStorage(this.defaults));

              case 4:
              case "end":
                return _context3.stop();
            }
          }
        }, _callee3, this);
      }));

      function reset() {
        return _reset.apply(this, arguments);
      }

      return reset;
    }()
  }, {
    key: "set",
    value: function () {
      var _set = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee4(name, value) {
        var defaultValue, valueType, defaultType;
        return _regenerator.default.wrap(function _callee4$(_context4) {
          while (1) {
            switch (_context4.prev = _context4.next) {
              case 0:
                _context4.next = 2;
                return this._initializedPromise;

              case 2:
                defaultValue = this.defaults[name];

                if (!(defaultValue === undefined)) {
                  _context4.next = 7;
                  break;
                }

                throw new Error("Set preference: \"".concat(name, "\" is undefined."));

              case 7:
                if (!(value === undefined)) {
                  _context4.next = 9;
                  break;
                }

                throw new Error('Set preference: no value is specified.');

              case 9:
                valueType = _typeof(value);
                defaultType = _typeof(defaultValue);

                if (!(valueType !== defaultType)) {
                  _context4.next = 19;
                  break;
                }

                if (!(valueType === 'number' && defaultType === 'string')) {
                  _context4.next = 16;
                  break;
                }

                value = value.toString();
                _context4.next = 17;
                break;

              case 16:
                throw new Error("Set preference: \"".concat(value, "\" is a ").concat(valueType, ", ") + "expected a ".concat(defaultType, "."));

              case 17:
                _context4.next = 21;
                break;

              case 19:
                if (!(valueType === 'number' && !Number.isInteger(value))) {
                  _context4.next = 21;
                  break;
                }

                throw new Error("Set preference: \"".concat(value, "\" must be an integer."));

              case 21:
                this.prefs[name] = value;
                return _context4.abrupt("return", this._writeToStorage(this.prefs));

              case 23:
              case "end":
                return _context4.stop();
            }
          }
        }, _callee4, this);
      }));

      function set(_x3, _x4) {
        return _set.apply(this, arguments);
      }

      return set;
    }()
  }, {
    key: "get",
    value: function () {
      var _get = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee5(name) {
        var defaultValue, prefValue;
        return _regenerator.default.wrap(function _callee5$(_context5) {
          while (1) {
            switch (_context5.prev = _context5.next) {
              case 0:
                _context5.next = 2;
                return this._initializedPromise;

              case 2:
                defaultValue = this.defaults[name];

                if (!(defaultValue === undefined)) {
                  _context5.next = 7;
                  break;
                }

                throw new Error("Get preference: \"".concat(name, "\" is undefined."));

              case 7:
                prefValue = this.prefs[name];

                if (!(prefValue !== undefined)) {
                  _context5.next = 10;
                  break;
                }

                return _context5.abrupt("return", prefValue);

              case 10:
                return _context5.abrupt("return", defaultValue);

              case 11:
              case "end":
                return _context5.stop();
            }
          }
        }, _callee5, this);
      }));

      function get(_x5) {
        return _get.apply(this, arguments);
      }

      return get;
    }()
  }, {
    key: "getAll",
    value: function () {
      var _getAll = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee6() {
        return _regenerator.default.wrap(function _callee6$(_context6) {
          while (1) {
            switch (_context6.prev = _context6.next) {
              case 0:
                _context6.next = 2;
                return this._initializedPromise;

              case 2:
                return _context6.abrupt("return", Object.assign(Object.create(null), this.defaults, this.prefs));

              case 3:
              case "end":
                return _context6.stop();
            }
          }
        }, _callee6, this);
      }));

      function getAll() {
        return _getAll.apply(this, arguments);
      }

      return getAll;
    }()
  }]);

  return BasePreferences;
}();

exports.BasePreferences = BasePreferences;

/***/ }),
/* 39 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.DownloadManager = void 0;

var _pdfjsLib = __webpack_require__(7);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

;
var DISABLE_CREATE_OBJECT_URL = _pdfjsLib.apiCompatibilityParams.disableCreateObjectURL || false;

function _download(blobUrl, filename) {
  var a = document.createElement('a');

  if (!a.click) {
    throw new Error('DownloadManager: "a.click()" is not supported.');
  }

  a.href = blobUrl;
  a.target = '_parent';

  if ('download' in a) {
    a.download = filename;
  }

  (document.body || document.documentElement).appendChild(a);
  a.click();
  a.remove();
}

var DownloadManager =
/*#__PURE__*/
function () {
  function DownloadManager(_ref) {
    var _ref$disableCreateObj = _ref.disableCreateObjectURL,
        disableCreateObjectURL = _ref$disableCreateObj === void 0 ? DISABLE_CREATE_OBJECT_URL : _ref$disableCreateObj;

    _classCallCheck(this, DownloadManager);

    this.disableCreateObjectURL = disableCreateObjectURL;
  }

  _createClass(DownloadManager, [{
    key: "downloadUrl",
    value: function downloadUrl(url, filename) {
      if (!(0, _pdfjsLib.createValidAbsoluteUrl)(url, 'http://example.com')) {
        return;
      }

      _download(url + '#pdfjs.action=download', filename);
    }
  }, {
    key: "downloadData",
    value: function downloadData(data, filename, contentType) {
      if (navigator.msSaveBlob) {
        return navigator.msSaveBlob(new Blob([data], {
          type: contentType
        }), filename);
      }

      var blobUrl = (0, _pdfjsLib.createObjectURL)(data, contentType, this.disableCreateObjectURL);

      _download(blobUrl, filename);
    }
  }, {
    key: "download",
    value: function download(blob, url, filename) {
      if (navigator.msSaveBlob) {
        if (!navigator.msSaveBlob(blob, filename)) {
          this.downloadUrl(url, filename);
        }

        return;
      }

      if (this.disableCreateObjectURL) {
        this.downloadUrl(url, filename);
        return;
      }

      var blobUrl = _pdfjsLib.URL.createObjectURL(blob);

      _download(blobUrl, filename);
    }
  }]);

  return DownloadManager;
}();

exports.DownloadManager = DownloadManager;

/***/ }),
/* 40 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.GenericL10n = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(2));

__webpack_require__(41);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var webL10n = document.webL10n;

var GenericL10n =
/*#__PURE__*/
function () {
  function GenericL10n(lang) {
    _classCallCheck(this, GenericL10n);

    this._lang = lang;
    this._ready = new Promise(function (resolve, reject) {
      webL10n.setLanguage(lang, function () {
        resolve(webL10n);
      });
    });
  }

  _createClass(GenericL10n, [{
    key: "getLanguage",
    value: function () {
      var _getLanguage = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee() {
        var l10n;
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                _context.next = 2;
                return this._ready;

              case 2:
                l10n = _context.sent;
                return _context.abrupt("return", l10n.getLanguage());

              case 4:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function getLanguage() {
        return _getLanguage.apply(this, arguments);
      }

      return getLanguage;
    }()
  }, {
    key: "getDirection",
    value: function () {
      var _getDirection = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee2() {
        var l10n;
        return _regenerator.default.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                _context2.next = 2;
                return this._ready;

              case 2:
                l10n = _context2.sent;
                return _context2.abrupt("return", l10n.getDirection());

              case 4:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      function getDirection() {
        return _getDirection.apply(this, arguments);
      }

      return getDirection;
    }()
  }, {
    key: "get",
    value: function () {
      var _get = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee3(property, args, fallback) {
        var l10n;
        return _regenerator.default.wrap(function _callee3$(_context3) {
          while (1) {
            switch (_context3.prev = _context3.next) {
              case 0:
                _context3.next = 2;
                return this._ready;

              case 2:
                l10n = _context3.sent;
                return _context3.abrupt("return", l10n.get(property, args, fallback));

              case 4:
              case "end":
                return _context3.stop();
            }
          }
        }, _callee3, this);
      }));

      function get(_x, _x2, _x3) {
        return _get.apply(this, arguments);
      }

      return get;
    }()
  }, {
    key: "translate",
    value: function () {
      var _translate = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee4(element) {
        var l10n;
        return _regenerator.default.wrap(function _callee4$(_context4) {
          while (1) {
            switch (_context4.prev = _context4.next) {
              case 0:
                _context4.next = 2;
                return this._ready;

              case 2:
                l10n = _context4.sent;
                return _context4.abrupt("return", l10n.translate(element));

              case 4:
              case "end":
                return _context4.stop();
            }
          }
        }, _callee4, this);
      }));

      function translate(_x4) {
        return _translate.apply(this, arguments);
      }

      return translate;
    }()
  }]);

  return GenericL10n;
}();

exports.GenericL10n = GenericL10n;

/***/ }),
/* 41 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


document.webL10n = function (window, document, undefined) {
  var gL10nData = {};
  var gTextData = '';
  var gTextProp = 'textContent';
  var gLanguage = '';
  var gMacros = {};
  var gReadyState = 'loading';
  var gAsyncResourceLoading = true;

  function getL10nResourceLinks() {
    return document.querySelectorAll('link[type="application/l10n"]');
  }

  function getL10nDictionary() {
    var script = document.querySelector('script[type="application/l10n"]');
    return script ? JSON.parse(script.innerHTML) : null;
  }

  function getTranslatableChildren(element) {
    return element ? element.querySelectorAll('*[data-l10n-id]') : [];
  }

  function getL10nAttributes(element) {
    if (!element) return {};
    var l10nId = element.getAttribute('data-l10n-id');
    var l10nArgs = element.getAttribute('data-l10n-args');
    var args = {};

    if (l10nArgs) {
      try {
        args = JSON.parse(l10nArgs);
      } catch (e) {
        console.warn('could not parse arguments for #' + l10nId);
      }
    }

    return {
      id: l10nId,
      args: args
    };
  }

  function fireL10nReadyEvent(lang) {
    var evtObject = document.createEvent('Event');
    evtObject.initEvent('localized', true, false);
    evtObject.language = lang;
    document.dispatchEvent(evtObject);
  }

  function xhrLoadText(url, onSuccess, onFailure) {
    onSuccess = onSuccess || function _onSuccess(data) {};

    onFailure = onFailure || function _onFailure() {};

    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, gAsyncResourceLoading);

    if (xhr.overrideMimeType) {
      xhr.overrideMimeType('text/plain; charset=utf-8');
    }

    xhr.onreadystatechange = function () {
      if (xhr.readyState == 4) {
        if (xhr.status == 200 || xhr.status === 0) {
          onSuccess(xhr.responseText);
        } else {
          onFailure();
        }
      }
    };

    xhr.onerror = onFailure;
    xhr.ontimeout = onFailure;

    try {
      xhr.send(null);
    } catch (e) {
      onFailure();
    }
  }

  function parseResource(href, lang, successCallback, failureCallback) {
    var baseURL = href.replace(/[^\/]*$/, '') || './';

    function evalString(text) {
      if (text.lastIndexOf('\\') < 0) return text;
      return text.replace(/\\\\/g, '\\').replace(/\\n/g, '\n').replace(/\\r/g, '\r').replace(/\\t/g, '\t').replace(/\\b/g, '\b').replace(/\\f/g, '\f').replace(/\\{/g, '{').replace(/\\}/g, '}').replace(/\\"/g, '"').replace(/\\'/g, "'");
    }

    function parseProperties(text, parsedPropertiesCallback) {
      var dictionary = {};
      var reBlank = /^\s*|\s*$/;
      var reComment = /^\s*#|^\s*$/;
      var reSection = /^\s*\[(.*)\]\s*$/;
      var reImport = /^\s*@import\s+url\((.*)\)\s*$/i;
      var reSplit = /^([^=\s]*)\s*=\s*(.+)$/;

      function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {
        var entries = rawText.replace(reBlank, '').split(/[\r\n]+/);
        var currentLang = '*';
        var genericLang = lang.split('-', 1)[0];
        var skipLang = false;
        var match = '';

        function nextEntry() {
          while (true) {
            if (!entries.length) {
              parsedRawLinesCallback();
              return;
            }

            var line = entries.shift();
            if (reComment.test(line)) continue;

            if (extendedSyntax) {
              match = reSection.exec(line);

              if (match) {
                currentLang = match[1].toLowerCase();
                skipLang = currentLang !== '*' && currentLang !== lang && currentLang !== genericLang;
                continue;
              } else if (skipLang) {
                continue;
              }

              match = reImport.exec(line);

              if (match) {
                loadImport(baseURL + match[1], nextEntry);
                return;
              }
            }

            var tmp = line.match(reSplit);

            if (tmp && tmp.length == 3) {
              dictionary[tmp[1]] = evalString(tmp[2]);
            }
          }
        }

        nextEntry();
      }

      function loadImport(url, callback) {
        xhrLoadText(url, function (content) {
          parseRawLines(content, false, callback);
        }, function () {
          console.warn(url + ' not found.');
          callback();
        });
      }

      parseRawLines(text, true, function () {
        parsedPropertiesCallback(dictionary);
      });
    }

    xhrLoadText(href, function (response) {
      gTextData += response;
      parseProperties(response, function (data) {
        for (var key in data) {
          var id,
              prop,
              index = key.lastIndexOf('.');

          if (index > 0) {
            id = key.substring(0, index);
            prop = key.substring(index + 1);
          } else {
            id = key;
            prop = gTextProp;
          }

          if (!gL10nData[id]) {
            gL10nData[id] = {};
          }

          gL10nData[id][prop] = data[key];
        }

        if (successCallback) {
          successCallback();
        }
      });
    }, failureCallback);
  }

  function loadLocale(lang, callback) {
    if (lang) {
      lang = lang.toLowerCase();
    }

    callback = callback || function _callback() {};

    clear();
    gLanguage = lang;
    var langLinks = getL10nResourceLinks();
    var langCount = langLinks.length;

    if (langCount === 0) {
      var dict = getL10nDictionary();

      if (dict && dict.locales && dict.default_locale) {
        console.log('using the embedded JSON directory, early way out');
        gL10nData = dict.locales[lang];

        if (!gL10nData) {
          var defaultLocale = dict.default_locale.toLowerCase();

          for (var anyCaseLang in dict.locales) {
            anyCaseLang = anyCaseLang.toLowerCase();

            if (anyCaseLang === lang) {
              gL10nData = dict.locales[lang];
              break;
            } else if (anyCaseLang === defaultLocale) {
              gL10nData = dict.locales[defaultLocale];
            }
          }
        }

        callback();
      } else {
        console.log('no resource to load, early way out');
      }

      fireL10nReadyEvent(lang);
      gReadyState = 'complete';
      return;
    }

    var onResourceLoaded = null;
    var gResourceCount = 0;

    onResourceLoaded = function onResourceLoaded() {
      gResourceCount++;

      if (gResourceCount >= langCount) {
        callback();
        fireL10nReadyEvent(lang);
        gReadyState = 'complete';
      }
    };

    function L10nResourceLink(link) {
      var href = link.href;

      this.load = function (lang, callback) {
        parseResource(href, lang, callback, function () {
          console.warn(href + ' not found.');
          console.warn('"' + lang + '" resource not found');
          gLanguage = '';
          callback();
        });
      };
    }

    for (var i = 0; i < langCount; i++) {
      var resource = new L10nResourceLink(langLinks[i]);
      resource.load(lang, onResourceLoaded);
    }
  }

  function clear() {
    gL10nData = {};
    gTextData = '';
    gLanguage = '';
  }

  function getPluralRules(lang) {
    var locales2rules = {
      'af': 3,
      'ak': 4,
      'am': 4,
      'ar': 1,
      'asa': 3,
      'az': 0,
      'be': 11,
      'bem': 3,
      'bez': 3,
      'bg': 3,
      'bh': 4,
      'bm': 0,
      'bn': 3,
      'bo': 0,
      'br': 20,
      'brx': 3,
      'bs': 11,
      'ca': 3,
      'cgg': 3,
      'chr': 3,
      'cs': 12,
      'cy': 17,
      'da': 3,
      'de': 3,
      'dv': 3,
      'dz': 0,
      'ee': 3,
      'el': 3,
      'en': 3,
      'eo': 3,
      'es': 3,
      'et': 3,
      'eu': 3,
      'fa': 0,
      'ff': 5,
      'fi': 3,
      'fil': 4,
      'fo': 3,
      'fr': 5,
      'fur': 3,
      'fy': 3,
      'ga': 8,
      'gd': 24,
      'gl': 3,
      'gsw': 3,
      'gu': 3,
      'guw': 4,
      'gv': 23,
      'ha': 3,
      'haw': 3,
      'he': 2,
      'hi': 4,
      'hr': 11,
      'hu': 0,
      'id': 0,
      'ig': 0,
      'ii': 0,
      'is': 3,
      'it': 3,
      'iu': 7,
      'ja': 0,
      'jmc': 3,
      'jv': 0,
      'ka': 0,
      'kab': 5,
      'kaj': 3,
      'kcg': 3,
      'kde': 0,
      'kea': 0,
      'kk': 3,
      'kl': 3,
      'km': 0,
      'kn': 0,
      'ko': 0,
      'ksb': 3,
      'ksh': 21,
      'ku': 3,
      'kw': 7,
      'lag': 18,
      'lb': 3,
      'lg': 3,
      'ln': 4,
      'lo': 0,
      'lt': 10,
      'lv': 6,
      'mas': 3,
      'mg': 4,
      'mk': 16,
      'ml': 3,
      'mn': 3,
      'mo': 9,
      'mr': 3,
      'ms': 0,
      'mt': 15,
      'my': 0,
      'nah': 3,
      'naq': 7,
      'nb': 3,
      'nd': 3,
      'ne': 3,
      'nl': 3,
      'nn': 3,
      'no': 3,
      'nr': 3,
      'nso': 4,
      'ny': 3,
      'nyn': 3,
      'om': 3,
      'or': 3,
      'pa': 3,
      'pap': 3,
      'pl': 13,
      'ps': 3,
      'pt': 3,
      'rm': 3,
      'ro': 9,
      'rof': 3,
      'ru': 11,
      'rwk': 3,
      'sah': 0,
      'saq': 3,
      'se': 7,
      'seh': 3,
      'ses': 0,
      'sg': 0,
      'sh': 11,
      'shi': 19,
      'sk': 12,
      'sl': 14,
      'sma': 7,
      'smi': 7,
      'smj': 7,
      'smn': 7,
      'sms': 7,
      'sn': 3,
      'so': 3,
      'sq': 3,
      'sr': 11,
      'ss': 3,
      'ssy': 3,
      'st': 3,
      'sv': 3,
      'sw': 3,
      'syr': 3,
      'ta': 3,
      'te': 3,
      'teo': 3,
      'th': 0,
      'ti': 4,
      'tig': 3,
      'tk': 3,
      'tl': 4,
      'tn': 3,
      'to': 0,
      'tr': 0,
      'ts': 3,
      'tzm': 22,
      'uk': 11,
      'ur': 3,
      've': 3,
      'vi': 0,
      'vun': 3,
      'wa': 4,
      'wae': 3,
      'wo': 0,
      'xh': 3,
      'xog': 3,
      'yo': 0,
      'zh': 0,
      'zu': 3
    };

    function isIn(n, list) {
      return list.indexOf(n) !== -1;
    }

    function isBetween(n, start, end) {
      return start <= n && n <= end;
    }

    var pluralRules = {
      '0': function _(n) {
        return 'other';
      },
      '1': function _(n) {
        if (isBetween(n % 100, 3, 10)) return 'few';
        if (n === 0) return 'zero';
        if (isBetween(n % 100, 11, 99)) return 'many';
        if (n == 2) return 'two';
        if (n == 1) return 'one';
        return 'other';
      },
      '2': function _(n) {
        if (n !== 0 && n % 10 === 0) return 'many';
        if (n == 2) return 'two';
        if (n == 1) return 'one';
        return 'other';
      },
      '3': function _(n) {
        if (n == 1) return 'one';
        return 'other';
      },
      '4': function _(n) {
        if (isBetween(n, 0, 1)) return 'one';
        return 'other';
      },
      '5': function _(n) {
        if (isBetween(n, 0, 2) && n != 2) return 'one';
        return 'other';
      },
      '6': function _(n) {
        if (n === 0) return 'zero';
        if (n % 10 == 1 && n % 100 != 11) return 'one';
        return 'other';
      },
      '7': function _(n) {
        if (n == 2) return 'two';
        if (n == 1) return 'one';
        return 'other';
      },
      '8': function _(n) {
        if (isBetween(n, 3, 6)) return 'few';
        if (isBetween(n, 7, 10)) return 'many';
        if (n == 2) return 'two';
        if (n == 1) return 'one';
        return 'other';
      },
      '9': function _(n) {
        if (n === 0 || n != 1 && isBetween(n % 100, 1, 19)) return 'few';
        if (n == 1) return 'one';
        return 'other';
      },
      '10': function _(n) {
        if (isBetween(n % 10, 2, 9) && !isBetween(n % 100, 11, 19)) return 'few';
        if (n % 10 == 1 && !isBetween(n % 100, 11, 19)) return 'one';
        return 'other';
      },
      '11': function _(n) {
        if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';
        if (n % 10 === 0 || isBetween(n % 10, 5, 9) || isBetween(n % 100, 11, 14)) return 'many';
        if (n % 10 == 1 && n % 100 != 11) return 'one';
        return 'other';
      },
      '12': function _(n) {
        if (isBetween(n, 2, 4)) return 'few';
        if (n == 1) return 'one';
        return 'other';
      },
      '13': function _(n) {
        if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';
        if (n != 1 && isBetween(n % 10, 0, 1) || isBetween(n % 10, 5, 9) || isBetween(n % 100, 12, 14)) return 'many';
        if (n == 1) return 'one';
        return 'other';
      },
      '14': function _(n) {
        if (isBetween(n % 100, 3, 4)) return 'few';
        if (n % 100 == 2) return 'two';
        if (n % 100 == 1) return 'one';
        return 'other';
      },
      '15': function _(n) {
        if (n === 0 || isBetween(n % 100, 2, 10)) return 'few';
        if (isBetween(n % 100, 11, 19)) return 'many';
        if (n == 1) return 'one';
        return 'other';
      },
      '16': function _(n) {
        if (n % 10 == 1 && n != 11) return 'one';
        return 'other';
      },
      '17': function _(n) {
        if (n == 3) return 'few';
        if (n === 0) return 'zero';
        if (n == 6) return 'many';
        if (n == 2) return 'two';
        if (n == 1) return 'one';
        return 'other';
      },
      '18': function _(n) {
        if (n === 0) return 'zero';
        if (isBetween(n, 0, 2) && n !== 0 && n != 2) return 'one';
        return 'other';
      },
      '19': function _(n) {
        if (isBetween(n, 2, 10)) return 'few';
        if (isBetween(n, 0, 1)) return 'one';
        return 'other';
      },
      '20': function _(n) {
        if ((isBetween(n % 10, 3, 4) || n % 10 == 9) && !(isBetween(n % 100, 10, 19) || isBetween(n % 100, 70, 79) || isBetween(n % 100, 90, 99))) return 'few';
        if (n % 1000000 === 0 && n !== 0) return 'many';
        if (n % 10 == 2 && !isIn(n % 100, [12, 72, 92])) return 'two';
        if (n % 10 == 1 && !isIn(n % 100, [11, 71, 91])) return 'one';
        return 'other';
      },
      '21': function _(n) {
        if (n === 0) return 'zero';
        if (n == 1) return 'one';
        return 'other';
      },
      '22': function _(n) {
        if (isBetween(n, 0, 1) || isBetween(n, 11, 99)) return 'one';
        return 'other';
      },
      '23': function _(n) {
        if (isBetween(n % 10, 1, 2) || n % 20 === 0) return 'one';
        return 'other';
      },
      '24': function _(n) {
        if (isBetween(n, 3, 10) || isBetween(n, 13, 19)) return 'few';
        if (isIn(n, [2, 12])) return 'two';
        if (isIn(n, [1, 11])) return 'one';
        return 'other';
      }
    };
    var index = locales2rules[lang.replace(/-.*$/, '')];

    if (!(index in pluralRules)) {
      console.warn('plural form unknown for [' + lang + ']');
      return function () {
        return 'other';
      };
    }

    return pluralRules[index];
  }

  gMacros.plural = function (str, param, key, prop) {
    var n = parseFloat(param);
    if (isNaN(n)) return str;
    if (prop != gTextProp) return str;

    if (!gMacros._pluralRules) {
      gMacros._pluralRules = getPluralRules(gLanguage);
    }

    var index = '[' + gMacros._pluralRules(n) + ']';

    if (n === 0 && key + '[zero]' in gL10nData) {
      str = gL10nData[key + '[zero]'][prop];
    } else if (n == 1 && key + '[one]' in gL10nData) {
      str = gL10nData[key + '[one]'][prop];
    } else if (n == 2 && key + '[two]' in gL10nData) {
      str = gL10nData[key + '[two]'][prop];
    } else if (key + index in gL10nData) {
      str = gL10nData[key + index][prop];
    } else if (key + '[other]' in gL10nData) {
      str = gL10nData[key + '[other]'][prop];
    }

    return str;
  };

  function getL10nData(key, args, fallback) {
    var data = gL10nData[key];

    if (!data) {
      console.warn('#' + key + ' is undefined.');

      if (!fallback) {
        return null;
      }

      data = fallback;
    }

    var rv = {};

    for (var prop in data) {
      var str = data[prop];
      str = substIndexes(str, args, key, prop);
      str = substArguments(str, args, key);
      rv[prop] = str;
    }

    return rv;
  }

  function substIndexes(str, args, key, prop) {
    var reIndex = /\{\[\s*([a-zA-Z]+)\(([a-zA-Z]+)\)\s*\]\}/;
    var reMatch = reIndex.exec(str);
    if (!reMatch || !reMatch.length) return str;
    var macroName = reMatch[1];
    var paramName = reMatch[2];
    var param;

    if (args && paramName in args) {
      param = args[paramName];
    } else if (paramName in gL10nData) {
      param = gL10nData[paramName];
    }

    if (macroName in gMacros) {
      var macro = gMacros[macroName];
      str = macro(str, param, key, prop);
    }

    return str;
  }

  function substArguments(str, args, key) {
    var reArgs = /\{\{\s*(.+?)\s*\}\}/g;
    return str.replace(reArgs, function (matched_text, arg) {
      if (args && arg in args) {
        return args[arg];
      }

      if (arg in gL10nData) {
        return gL10nData[arg];
      }

      console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');
      return matched_text;
    });
  }

  function translateElement(element) {
    var l10n = getL10nAttributes(element);
    if (!l10n.id) return;
    var data = getL10nData(l10n.id, l10n.args);

    if (!data) {
      console.warn('#' + l10n.id + ' is undefined.');
      return;
    }

    if (data[gTextProp]) {
      if (getChildElementCount(element) === 0) {
        element[gTextProp] = data[gTextProp];
      } else {
        var children = element.childNodes;
        var found = false;

        for (var i = 0, l = children.length; i < l; i++) {
          if (children[i].nodeType === 3 && /\S/.test(children[i].nodeValue)) {
            if (found) {
              children[i].nodeValue = '';
            } else {
              children[i].nodeValue = data[gTextProp];
              found = true;
            }
          }
        }

        if (!found) {
          var textNode = document.createTextNode(data[gTextProp]);
          element.insertBefore(textNode, element.firstChild);
        }
      }

      delete data[gTextProp];
    }

    for (var k in data) {
      element[k] = data[k];
    }
  }

  function getChildElementCount(element) {
    if (element.children) {
      return element.children.length;
    }

    if (typeof element.childElementCount !== 'undefined') {
      return element.childElementCount;
    }

    var count = 0;

    for (var i = 0; i < element.childNodes.length; i++) {
      count += element.nodeType === 1 ? 1 : 0;
    }

    return count;
  }

  function translateFragment(element) {
    element = element || document.documentElement;
    var children = getTranslatableChildren(element);
    var elementCount = children.length;

    for (var i = 0; i < elementCount; i++) {
      translateElement(children[i]);
    }

    translateElement(element);
  }

  return {
    get: function get(key, args, fallbackString) {
      var index = key.lastIndexOf('.');
      var prop = gTextProp;

      if (index > 0) {
        prop = key.substring(index + 1);
        key = key.substring(0, index);
      }

      var fallback;

      if (fallbackString) {
        fallback = {};
        fallback[prop] = fallbackString;
      }

      var data = getL10nData(key, args, fallback);

      if (data && prop in data) {
        return data[prop];
      }

      return '{{' + key + '}}';
    },
    getData: function getData() {
      return gL10nData;
    },
    getText: function getText() {
      return gTextData;
    },
    getLanguage: function getLanguage() {
      return gLanguage;
    },
    setLanguage: function setLanguage(lang, callback) {
      loadLocale(lang, function () {
        if (callback) callback();
      });
    },
    getDirection: function getDirection() {
      var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];
      var shortCode = gLanguage.split('-', 1)[0];
      return rtlList.indexOf(shortCode) >= 0 ? 'rtl' : 'ltr';
    },
    translate: translateFragment,
    getReadyState: function getReadyState() {
      return gReadyState;
    },
    ready: function ready(callback) {
      if (!callback) {
        return;
      } else if (gReadyState == 'complete' || gReadyState == 'interactive') {
        window.setTimeout(function () {
          callback();
        });
      } else if (document.addEventListener) {
        document.addEventListener('localized', function once() {
          document.removeEventListener('localized', once);
          callback();
        });
      }
    }
  };
}(window, document);

/***/ }),
/* 42 */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.PDFPrintService = PDFPrintService;

var _ui_utils = __webpack_require__(6);

var _app = __webpack_require__(1);

var _pdfjsLib = __webpack_require__(7);

var activeService = null;
var overlayManager = null;

function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size) {
  var scratchCanvas = activeService.scratchCanvas;
  var PRINT_RESOLUTION = 150;
  var PRINT_UNITS = PRINT_RESOLUTION / 72.0;
  scratchCanvas.width = Math.floor(size.width * PRINT_UNITS);
  scratchCanvas.height = Math.floor(size.height * PRINT_UNITS);
  var width = Math.floor(size.width * _ui_utils.CSS_UNITS) + 'px';
  var height = Math.floor(size.height * _ui_utils.CSS_UNITS) + 'px';
  var ctx = scratchCanvas.getContext('2d');
  ctx.save();
  ctx.fillStyle = 'rgb(255, 255, 255)';
  ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height);
  ctx.restore();
  return pdfDocument.getPage(pageNumber).then(function (pdfPage) {
    var renderContext = {
      canvasContext: ctx,
      transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],
      viewport: pdfPage.getViewport({
        scale: 1,
        rotation: size.rotation
      }),
      intent: 'print'
    };
    return pdfPage.render(renderContext).promise;
  }).then(function () {
    return {
      width: width,
      height: height
    };
  });
}

function PDFPrintService(pdfDocument, pagesOverview, printContainer, l10n) {
  this.pdfDocument = pdfDocument;
  this.pagesOverview = pagesOverview;
  this.printContainer = printContainer;
  this.l10n = l10n || _ui_utils.NullL10n;
  this.disableCreateObjectURL = pdfDocument.loadingParams['disableCreateObjectURL'];
  this.currentPage = -1;
  this.scratchCanvas = document.createElement('canvas');
}

PDFPrintService.prototype = {
  layout: function layout() {
    this.throwIfInactive();
    var body = document.querySelector('body');
    body.setAttribute('data-pdfjsprinting', true);
    var hasEqualPageSizes = this.pagesOverview.every(function (size) {
      return size.width === this.pagesOverview[0].width && size.height === this.pagesOverview[0].height;
    }, this);

    if (!hasEqualPageSizes) {
      console.warn('Not all pages have the same size. The printed ' + 'result may be incorrect!');
    }

    this.pageStyleSheet = document.createElement('style');
    var pageSize = this.pagesOverview[0];
    this.pageStyleSheet.textContent = '@supports ((size:A4) and (size:1pt 1pt)) {' + '@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' + '}';
    body.appendChild(this.pageStyleSheet);
  },
  destroy: function destroy() {
    if (activeService !== this) {
      return;
    }

    this.printContainer.textContent = '';

    if (this.pageStyleSheet) {
      this.pageStyleSheet.remove();
      this.pageStyleSheet = null;
    }

    this.scratchCanvas.width = this.scratchCanvas.height = 0;
    this.scratchCanvas = null;
    activeService = null;
    ensureOverlay().then(function () {
      if (overlayManager.active !== 'printServiceOverlay') {
        return;
      }

      overlayManager.close('printServiceOverlay');
    });
  },
  renderPages: function renderPages() {
    var _this = this;

    var pageCount = this.pagesOverview.length;

    var renderNextPage = function renderNextPage(resolve, reject) {
      _this.throwIfInactive();

      if (++_this.currentPage >= pageCount) {
        renderProgress(pageCount, pageCount, _this.l10n);
        resolve();
        return;
      }

      var index = _this.currentPage;
      renderProgress(index, pageCount, _this.l10n);
      renderPage(_this, _this.pdfDocument, index + 1, _this.pagesOverview[index]).then(_this.useRenderedPage.bind(_this)).then(function () {
        renderNextPage(resolve, reject);
      }, reject);
    };

    return new Promise(renderNextPage);
  },
  useRenderedPage: function useRenderedPage(printItem) {
    this.throwIfInactive();
    var img = document.createElement('img');
    img.style.width = printItem.width;
    img.style.height = printItem.height;
    var scratchCanvas = this.scratchCanvas;

    if ('toBlob' in scratchCanvas && !this.disableCreateObjectURL) {
      scratchCanvas.toBlob(function (blob) {
        img.src = _pdfjsLib.URL.createObjectURL(blob);
      });
    } else {
      img.src = scratchCanvas.toDataURL();
    }

    var wrapper = document.createElement('div');
    wrapper.appendChild(img);
    this.printContainer.appendChild(wrapper);
    return new Promise(function (resolve, reject) {
      img.onload = resolve;
      img.onerror = reject;
    });
  },
  performPrint: function performPrint() {
    var _this2 = this;

    this.throwIfInactive();
    return new Promise(function (resolve) {
      setTimeout(function () {
        if (!_this2.active) {
          resolve();
          return;
        }

        print.call(window);
        setTimeout(resolve, 20);
      }, 0);
    });
  },

  get active() {
    return this === activeService;
  },

  throwIfInactive: function throwIfInactive() {
    if (!this.active) {
      throw new Error('This print request was cancelled or completed.');
    }
  }
};
var print = window.print;

window.print = function print() {
  if (activeService) {
    console.warn('Ignored window.print() because of a pending print job.');
    return;
  }

  ensureOverlay().then(function () {
    if (activeService) {
      overlayManager.open('printServiceOverlay');
    }
  });

  try {
    dispatchEvent('beforeprint');
  } finally {
    if (!activeService) {
      console.error('Expected print service to be initialized.');
      ensureOverlay().then(function () {
        if (overlayManager.active === 'printServiceOverlay') {
          overlayManager.close('printServiceOverlay');
        }
      });
      return;
    }

    var activeServiceOnEntry = activeService;
    activeService.renderPages().then(function () {
      return activeServiceOnEntry.performPrint();
    }).catch(function () {}).then(function () {
      if (activeServiceOnEntry.active) {
        abort();
      }
    });
  }
};

function dispatchEvent(eventType) {
  var event = document.createEvent('CustomEvent');
  event.initCustomEvent(eventType, false, false, 'custom');
  window.dispatchEvent(event);
}

function abort() {
  if (activeService) {
    activeService.destroy();
    dispatchEvent('afterprint');
  }
}

function renderProgress(index, total, l10n) {
  var progressContainer = document.getElementById('printServiceOverlay');
  var progress = Math.round(100 * index / total);
  var progressBar = progressContainer.querySelector('progress');
  var progressPerc = progressContainer.querySelector('.relative-progress');
  progressBar.value = progress;
  l10n.get('print_progress_percent', {
    progress: progress
  }, progress + '%').then(function (msg) {
    progressPerc.textContent = msg;
  });
}

var hasAttachEvent = !!document.attachEvent;
window.addEventListener('keydown', function (event) {
  if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {
    window.print();

    if (hasAttachEvent) {
      return;
    }

    event.preventDefault();

    if (event.stopImmediatePropagation) {
      event.stopImmediatePropagation();
    } else {
      event.stopPropagation();
    }

    return;
  }
}, true);

if (hasAttachEvent) {
  document.attachEvent('onkeydown', function (event) {
    event = event || window.event;

    if (event.keyCode === 80 && event.ctrlKey) {
      event.keyCode = 0;
      return false;
    }
  });
}

if ('onbeforeprint' in window) {
  var stopPropagationIfNeeded = function stopPropagationIfNeeded(event) {
    if (event.detail !== 'custom' && event.stopImmediatePropagation) {
      event.stopImmediatePropagation();
    }
  };

  window.addEventListener('beforeprint', stopPropagationIfNeeded);
  window.addEventListener('afterprint', stopPropagationIfNeeded);
}

var overlayPromise;

function ensureOverlay() {
  if (!overlayPromise) {
    overlayManager = _app.PDFViewerApplication.overlayManager;

    if (!overlayManager) {
      throw new Error('The overlay manager has not yet been initialized.');
    }

    overlayPromise = overlayManager.register('printServiceOverlay', document.getElementById('printServiceOverlay'), abort, true);
    document.getElementById('printCancel').onclick = abort;
  }

  return overlayPromise;
}

_app.PDFPrintServiceFactory.instance = {
  supportsPrinting: true,
  createPrintService: function createPrintService(pdfDocument, pagesOverview, printContainer, l10n) {
    if (activeService) {
      throw new Error('The print service is created and active.');
    }

    activeService = new PDFPrintService(pdfDocument, pagesOverview, printContainer, l10n);
    return activeService;
  }
};

/***/ })
/******/ ]);[en-US]
@import url(en-US/viewer.properties)
# 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.

# Main toolbar buttons (tooltips and alt text for images)
previous.title=Previous Page
previous_label=Previous
next.title=Next Page
next_label=Next

# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
page.title=Page
# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
# representing the total number of pages in the document.
of_pages=of {{pagesCount}}
# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
# will be replaced by a number representing the currently visible page,
# respectively a number representing the total number of pages in the document.
page_of_pages=({{pageNumber}} of {{pagesCount}})

zoom_out.title=Zoom Out
zoom_out_label=Zoom Out
zoom_in.title=Zoom In
zoom_in_label=Zoom In
zoom.title=Zoom
presentation_mode.title=Switch to Presentation Mode
presentation_mode_label=Presentation Mode
open_file.title=Open File
open_file_label=Open
print.title=Print
print_label=Print
download.title=Download
download_label=Download
bookmark.title=Current view (copy or open in new window)
bookmark_label=Current View

# Secondary toolbar and context menu
tools.title=Tools
tools_label=Tools
first_page.title=Go to First Page
first_page.label=Go to First Page
first_page_label=Go to First Page
last_page.title=Go to Last Page
last_page.label=Go to Last Page
last_page_label=Go to Last Page
page_rotate_cw.title=Rotate Clockwise
page_rotate_cw.label=Rotate Clockwise
page_rotate_cw_label=Rotate Clockwise
page_rotate_ccw.title=Rotate Counterclockwise
page_rotate_ccw.label=Rotate Counterclockwise
page_rotate_ccw_label=Rotate Counterclockwise

cursor_text_select_tool.title=Enable Text Selection Tool
cursor_text_select_tool_label=Text Selection Tool
cursor_hand_tool.title=Enable Hand Tool
cursor_hand_tool_label=Hand Tool

scroll_vertical.title=Use Vertical Scrolling
scroll_vertical_label=Vertical Scrolling
scroll_horizontal.title=Use Horizontal Scrolling
scroll_horizontal_label=Horizontal Scrolling
scroll_wrapped.title=Use Wrapped Scrolling
scroll_wrapped_label=Wrapped Scrolling

spread_none.title=Do not join page spreads
spread_none_label=No Spreads
spread_odd.title=Join page spreads starting with odd-numbered pages
spread_odd_label=Odd Spreads
spread_even.title=Join page spreads starting with even-numbered pages
spread_even_label=Even Spreads

# Document properties dialog box
document_properties.title=Document Propertiesâ€¦
document_properties_label=Document Propertiesâ€¦
document_properties_file_name=File name:
document_properties_file_size=File size:
# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
# will be replaced by the PDF file size in kilobytes, respectively in bytes.
document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
# will be replaced by the PDF file size in megabytes, respectively in bytes.
document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
document_properties_title=Title:
document_properties_author=Author:
document_properties_subject=Subject:
document_properties_keywords=Keywords:
document_properties_creation_date=Creation Date:
document_properties_modification_date=Modification Date:
# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
# will be replaced by the creation/modification date, and time, of the PDF file.
document_properties_date_string={{date}}, {{time}}
document_properties_creator=Creator:
document_properties_producer=PDF Producer:
document_properties_version=PDF Version:
document_properties_page_count=Page Count:
document_properties_page_size=Page Size:
document_properties_page_size_unit_inches=in
document_properties_page_size_unit_millimeters=mm
document_properties_page_size_orientation_portrait=portrait
document_properties_page_size_orientation_landscape=landscape
document_properties_page_size_name_a3=A3
document_properties_page_size_name_a4=A4
document_properties_page_size_name_letter=Letter
document_properties_page_size_name_legal=Legal
# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
# the size, respectively their unit of measurement and orientation, of the (current) page.
document_properties_page_size_dimension_string={{width}} Ã— {{height}} {{unit}} ({{orientation}})
# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
document_properties_page_size_dimension_name_string={{width}} Ã— {{height}} {{unit}} ({{name}}, {{orientation}})
# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
# the document; usually called "Fast Web View" in English locales of Adobe software.
document_properties_linearized=Fast Web View:
document_properties_linearized_yes=Yes
document_properties_linearized_no=No
document_properties_close=Close

print_progress_message=Preparing document for printingâ€¦
# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
# a numerical per cent value.
print_progress_percent={{progress}}%
print_progress_close=Cancel

# Tooltips and alt text for side panel toolbar buttons
# (the _label strings are alt text for the buttons, the .title strings are
# tooltips)
toggle_sidebar.title=Toggle Sidebar
toggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)
toggle_sidebar_label=Toggle Sidebar
document_outline.title=Show Document Outline (double-click to expand/collapse all items)
document_outline_label=Document Outline
attachments.title=Show Attachments
attachments_label=Attachments
thumbs.title=Show Thumbnails
thumbs_label=Thumbnails
findbar.title=Find in Document
findbar_label=Find

# Thumbnails panel item (tooltip and alt text for images)
# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
# number.
thumb_page_title=Page {{page}}
# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
# number.
thumb_page_canvas=Thumbnail of Page {{page}}

# Find panel button title and messages
find_input.title=Find
find_input.placeholder=Find in documentâ€¦
find_previous.title=Find the previous occurrence of the phrase
find_previous_label=Previous
find_next.title=Find the next occurrence of the phrase
find_next_label=Next
find_highlight=Highlight all
find_match_case_label=Match case
find_entire_word_label=Whole words
find_reached_top=Reached top of document, continued from bottom
find_reached_bottom=Reached end of document, continued from top
# LOCALIZATION NOTE (find_match_count): The supported plural forms are
# [one|two|few|many|other], with [other] as the default value.
# "{{current}}" and "{{total}}" will be replaced by a number representing the
# index of the currently active find result, respectively a number representing
# the total number of matches in the document.
find_match_count={[ plural(total) ]}
find_match_count[one]={{current}} of {{total}} match
find_match_count[two]={{current}} of {{total}} matches
find_match_count[few]={{current}} of {{total}} matches
find_match_count[many]={{current}} of {{total}} matches
find_match_count[other]={{current}} of {{total}} matches
# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
# [zero|one|two|few|many|other], with [other] as the default value.
# "{{limit}}" will be replaced by a numerical value.
find_match_count_limit={[ plural(limit) ]}
find_match_count_limit[zero]=More than {{limit}} matches
find_match_count_limit[one]=More than {{limit}} match
find_match_count_limit[two]=More than {{limit}} matches
find_match_count_limit[few]=More than {{limit}} matches
find_match_count_limit[many]=More than {{limit}} matches
find_match_count_limit[other]=More than {{limit}} matches
find_not_found=Phrase not found

# Error panel labels
error_more_info=More Information
error_less_info=Less Information
error_close=Close
# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
# replaced by the PDF.JS version and build ID.
error_version_info=PDF.js v{{version}} (build: {{build}})
# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
# english string describing the error.
error_message=Message: {{message}}
# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
# trace.
error_stack=Stack: {{stack}}
# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
error_file=File: {{file}}
# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
error_line=Line: {{line}}
rendering_error=An error occurred while rendering the page.

# Predefined zoom values
page_scale_width=Page Width
page_scale_fit=Page Fit
page_scale_auto=Automatic Zoom
page_scale_actual=Actual Size
# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
# numerical scale value.
page_scale_percent={{scale}}%

# Loading indicator messages
loading_error_indicator=Error
loading_error=An error occurred while loading the PDF.
invalid_file_error=Invalid or corrupted PDF file.
missing_file_error=Missing PDF file.
unexpected_response_error=Unexpected server response.

# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
# "{{type}}" will be replaced with an annotation type from a list defined in
# the PDF spec (32000-1:2008 Table 169 â€“ Annotation types).
# Some common types are e.g.: "Check", "Text", "Comment", "Note"
text_annotation_type.alt=[{{type}} Annotation]
password_label=Enter the password to open this PDF file.
password_invalid=Invalid password. Please try again.
password_ok=OK
password_cancel=Cancel

printing_not_supported=Warning: Printing is not fully supported by this browser.
printing_not_ready=Warning: The PDF is not fully loaded for printing.
web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
document_colors_not_allowed=PDF documents are not allowed to use their own colors: â€œAllow pages to choose their own colorsâ€� is deactivated in the browser.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns="http://www.w3.org/2000/svg"
   width="40"
   height="40"
   viewBox="0 0 40 40">
  <path
     d="M 1.5006714,23.536225 6.8925879,18.994244 14.585721,26.037937 34.019683,4.5410479 38.499329,9.2235032 14.585721,35.458952 z"
     id="path4"
     style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1.25402856;stroke-opacity:1" />
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns="http://www.w3.org/2000/svg"
   height="40"
   width="40"
   viewBox="0 0 40 40">
  <rect
     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
     width="33.76017"
     height="33.76017"
     x="3.119915"
     y="3.119915" />
  <path
     d="m 20.677967,8.54499 c -7.342801,0 -13.295293,4.954293 -13.295293,11.065751 0,2.088793 0.3647173,3.484376 1.575539,5.150563 L 6.0267418,31.45501 13.560595,29.011117 c 2.221262,1.387962 4.125932,1.665377 7.117372,1.665377 7.3428,0 13.295291,-4.954295 13.295291,-11.065753 0,-6.111458 -5.952491,-11.065751 -13.295291,-11.065751 z"
     style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.93031836;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns="http://www.w3.org/2000/svg"
   width="40"
   height="40"
   viewBox="0 0 40 40">
  <g
     transform="translate(0,-60)"
     id="layer1">
    <rect
       width="36.460953"
       height="34.805603"
       x="1.7695236"
       y="62.597198"
       style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.30826771;stroke-opacity:1" />
    <g
       transform="matrix(0.88763677,0,0,0.88763677,2.2472646,8.9890584)">
      <path
         d="M 20,64.526342 C 11.454135,64.526342 4.5263421,71.454135 4.5263421,80 4.5263421,88.545865 11.454135,95.473658 20,95.473658 28.545865,95.473658 35.473658,88.545865 35.473658,80 35.473658,71.454135 28.545865,64.526342 20,64.526342 z m -0.408738,9.488564 c 3.527079,0 6.393832,2.84061 6.393832,6.335441 0,3.494831 -2.866753,6.335441 -6.393832,6.335441 -3.527079,0 -6.393832,-2.84061 -6.393832,-6.335441 0,-3.494831 2.866753,-6.335441 6.393832,-6.335441 z"
         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.02768445;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
      <path
         d="m 7.2335209,71.819938 4.9702591,4.161823 c -1.679956,2.581606 -1.443939,6.069592 0.159325,8.677725 l -5.1263071,3.424463 c 0.67516,1.231452 3.0166401,3.547686 4.2331971,4.194757 l 3.907728,-4.567277 c 2.541952,1.45975 5.730694,1.392161 8.438683,-0.12614 l 3.469517,6.108336 c 1.129779,-0.44367 4.742234,-3.449633 5.416358,-5.003859 l -5.46204,-4.415541 c 1.44319,-2.424098 1.651175,-5.267515 0.557303,-7.748623 l 5.903195,-3.833951 C 33.14257,71.704996 30.616217,69.018606 29.02952,67.99296 l -4.118813,4.981678 C 22.411934,71.205099 18.900853,70.937534 16.041319,72.32916 l -3.595408,-5.322091 c -1.345962,0.579488 -4.1293881,2.921233 -5.2123901,4.812869 z m 8.1010311,3.426672 c 2.75284,-2.446266 6.769149,-2.144694 9.048998,0.420874 2.279848,2.56557 2.113919,6.596919 -0.638924,9.043185 -2.752841,2.446267 -6.775754,2.13726 -9.055604,-0.428308 -2.279851,-2.565568 -2.107313,-6.589485 0.64553,-9.035751 z"
         style="fill:#000000;fill-opacity:1;stroke:none" />
    </g>
  </g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns="http://www.w3.org/2000/svg"
   width="64"
   height="64"
   viewBox="0 0 64 64">
  <path
     d="M 32.003143,1.4044602 57.432701,62.632577 6.5672991,62.627924 z"
     style="fill:#ffff00;fill-opacity:0.94117647;fill-rule:nonzero;stroke:#000000;stroke-width:1.00493038;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns="http://www.w3.org/2000/svg"
   width="64"
   height="64"
   viewBox="0 0 64 64">
  <path
     d="M 25.470843,9.4933766 C 25.30219,12.141818 30.139101,14.445969 34.704831,13.529144 40.62635,12.541995 41.398833,7.3856498 35.97505,5.777863 31.400921,4.1549155 25.157674,6.5445892 25.470843,9.4933766 z M 4.5246282,17.652051 C 4.068249,11.832873 9.2742983,5.9270407 18.437379,3.0977088 29.751911,-0.87185184 45.495663,1.4008022 53.603953,7.1104009 c 9.275765,6.1889221 7.158128,16.2079421 -3.171076,21.5939521 -1.784316,1.635815 -6.380222,1.21421 -7.068351,3.186186 -1.04003,0.972427 -1.288046,2.050158 -1.232864,3.168203 1.015111,2.000108 -3.831548,1.633216 -3.270553,3.759574 0.589477,5.264544 -0.179276,10.53738 -0.362842,15.806257 -0.492006,2.184998 1.163456,4.574232 -0.734888,6.610642 -2.482919,2.325184 -7.30604,2.189143 -9.193497,-0.274767 -2.733688,-1.740626 -8.254447,-3.615254 -6.104247,-6.339626 3.468112,-1.708686 -2.116197,-3.449897 0.431242,-5.080274 5.058402,-1.39256 -2.393215,-2.304318 -0.146889,-4.334645 3.069198,-0.977415 2.056986,-2.518352 -0.219121,-3.540397 1.876567,-1.807151 1.484149,-4.868919 -2.565455,-5.942205 0.150866,-1.805474 2.905737,-4.136876 -1.679967,-5.20493 C 10.260902,27.882167 4.6872697,22.95045 4.5245945,17.652051 z"
     id="path604"
     style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1.72665179;stroke-opacity:1" />
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns="http://www.w3.org/2000/svg"
   width="64"
   height="64"
   viewBox="0 0 64 64">
  <path
     d="M 32.003143,10.913072 57.432701,53.086929 6.567299,53.083723 z"
     id="path2985"
     style="fill:#ffff00;fill-opacity:0.94117647;fill-rule:nonzero;stroke:#000000;stroke-width:0.83403099;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns="http://www.w3.org/2000/svg"
   width="40"
   height="40"
   viewBox="0 0 40 40">
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns="http://www.w3.org/2000/svg"
   width="40"
   height="40"
   viewBox="0 0 40 40">
  <rect
     width="36.075428"
     height="31.096582"
     x="1.962286"
     y="4.4517088"
     id="rect4"
     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.23004246;stroke-opacity:1" />
  <rect
     width="27.96859"
     height="1.5012145"
     x="6.0157046"
     y="10.285"
     id="rect6"
     style="fill:#000000;fill-opacity:1;stroke:none" />
  <rect
     width="27.96859"
     height="0.85783684"
     x="6.0157056"
     y="23.21689"
     id="rect8"
     style="fill:#000000;fill-opacity:1;stroke:none" />
  <rect
     width="27.96859"
     height="0.85783684"
     x="5.8130345"
     y="28.964394"
     id="rect10"
     style="fill:#000000;fill-opacity:1;stroke:none" />
  <rect
     width="27.96859"
     height="0.85783684"
     x="6.0157046"
     y="17.426493"
     id="rect12"
     style="fill:#000000;fill-opacity:1;stroke:none" />
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns="http://www.w3.org/2000/svg"
   width="40"
   height="40"
   viewBox="0 0 40 40">
  <rect
     width="33.76017"
     height="33.76017"
     x="3.119915"
     y="3.119915"
     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
  <path
     d="m 17.692678,34.50206 0,-16.182224 c -1.930515,-0.103225 -3.455824,-0.730383 -4.57593,-1.881473 -1.12011,-1.151067 -1.680164,-2.619596 -1.680164,-4.405591 0,-1.992435 0.621995,-3.5796849 1.865988,-4.7617553 1.243989,-1.1820288 3.06352,-1.7730536 5.458598,-1.7730764 l 9.802246,0 0,2.6789711 -2.229895,0 0,26.3251486 -2.632515,0 0,-26.3251486 -3.45324,0 0,26.3251486 z"
     style="font-size:29.42051125px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.07795751;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" />
</svg>
‰PNG

   IHDR         µú7ê   ŽIDATx•ÐA
Â0…áw¦9�—ŠR"ê^‚àB*ŠˆBRðÏIŠ�TGð}›ýWÅŸã’(•ç‚÷_Áœ7^í`¦/ÊÏ<%�Œ{5¿hº`ªÏƒ!OÇ½)�Psg ˜’vÂí'_yÀ'_qa�d“0æZÙR“WvÐ%Ã€Rÿôö™HoÕÒ    IEND®B`‚‰PNG

   IHDR           Ùs²   ÷IDATxÍÔm.Q‡ñ³–Y‚Øm§{ãÝJ|´/cJˆR-}¡Ì&½Éää='‘ø?oîïã‘ÿ>ÚH}B]m>œ€~û�”wFÓœ@Ê„aÈ¤¼1¨r -^yÑÌ@‹ý(#ÐdHo¦ÉÜ¿Mt®÷hðÌ£© AŸc°Ê÷æX¡Ë�=ÆkÜzR@’ó}nì)ˆÎ×Ö¨ˆ]®l) Ä—¦P¢ØæbÑÊƒRJ‘2.[tâdynKòãQDÙï�$g›äšPbƒÓ*# D‘q²JäÇÓ<€ëy%r©ï·çDþzŸ{ì�ä    IEND®B`‚‰PNG

   IHDR         µú7ê   ˆIDATx•ÊÑ
ÁP Æñï•x/+©E3á^+J¹P«‰–¨uáÏ&�Ó±�òý.¿¿þä¡;ëxPqc®oK?Xððœ[2”JÒopêQ0ÿÇ>6³’‡n&ÕPÍê„ý¯ç¬½Û4rØ5êÄÝÁÈÉÍ´÷–ØšIä–Ì8zKáýt§ìð•k     IEND®B`‚‰PNG

   IHDR           Ùs²   ïIDATxÍÌk.aÅñ³;°Ûq{÷ËJ|ë”é!BDHµ´ª«8Ô´N+Ê<ç“ç—¼ï§óÇÿ?®¿ÿ2PÂJx�Þ‡7&~ û©ÏÄtF^™x�ç//\umaO‰é@�ý™ZSº\ù)Ðb³²Ž
<„<qù{à>¨­DùÝ…=ri2pkhrQ�G±^  †¯ãÎ1‡ññ**?€æ /cò}ÍËÀED¾§ùèG<¯*ÛÕ\7�…Y˜OÊv4¯xÌÄ˜LÇÛÆài©±eÍže›æ`�õÔŸ<N7Œ¹ÎœëŒyìÞ$]¡JXE"j    IEND®B`‚‰PNG

   IHDR         µú7ê   ˆIDATx•ÊÑ
ÁP Æñï•x/+©E3á^+J¹P«‰–¨uáÏ&�Ó±�òý.¿¿þä¡;ëxPqc®oK?Xððœ[2”JÒopêQ0ÿÇ>6³’‡n&ÕPÍê„ý¯ç¬½Û4rØ5êÄÝÁÈÉÍ´÷–ØšIä–Ì8zKáýt§ìð•k     IEND®B`‚‰PNG

   IHDR           Ùs²   ïIDATxÍÌk.aÅñ³;°Ûq{÷ËJ|ë”é!BDHµ´ª«8Ô´N+Ê<ç“ç—¼ï§óÇÿ?®¿ÿ2PÂJx�Þ‡7&~ û©ÏÄtF^™x�ç//\umaO‰é@�ý™ZSº\ù)Ðb³²Ž
<„<qù{à>¨­DùÝ…=ri2pkhrQ�G±^  †¯ãÎ1‡ññ**?€æ /cò}ÍËÀED¾§ùèG<¯*ÛÕ\7�…Y˜OÊv4¯xÌÄ˜LÇÛÆài©±eÍže›æ`�õÔŸ<N7Œ¹ÎœëŒyìÞ$]¡JXE"j    IEND®B`‚‰PNG

   IHDR         µú7ê   ŽIDATx•ÐA
Â0…áw¦9�—ŠR"ê^‚àB*ŠˆBRðÏIŠ�TGð}›ýWÅŸã’(•ç‚÷_Áœ7^í`¦/ÊÏ<%�Œ{5¿hº`ªÏƒ!OÇ½)�Psg ˜’vÂí'_yÀ'_qa�d“0æZÙR“WvÐ%Ã€Rÿôö™HoÕÒ    IEND®B`‚‰PNG

   IHDR           Ùs²   ÷IDATxÍÔm.Q‡ñ³–Y‚Øm§{ãÝJ|´/cJˆR-}¡Ì&½Éää='‘ø?oîïã‘ÿ>ÚH}B]m>œ€~û�”wFÓœ@Ê„aÈ¤¼1¨r -^yÑÌ@‹ý(#ÐdHo¦ÉÜ¿Mt®÷hðÌ£© AŸc°Ê÷æX¡Ë�=ÆkÜzR@’ó}nì)ˆÎ×Ö¨ˆ]®l) Ä—¦P¢ØæbÑÊƒRJ‘2.[tâdynKòãQDÙï�$g›äšPbƒÓ*# D‘q²JäÇÓ<€ëy%r©ï·çDþzŸ{ì�ä    IEND®B`‚          0     (       @         €                       ÿÿÿ                                      à  à  à  ð  ?ð  ?ø  ø  ïø  Ïü  ì  l  d  3`  3`                                    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿðÿÿàÿÿÀÿÿ€ÿÿ€ÿÿ ÿþ ÿþ ÿÿ ÿÿÀÿÿÀÿÿ€ÿÿ€ÿÿÈÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ          0     (       @         €                       ÿÿÿ                                      à  à  à  ð  ?ð  ?ø  ø  ø  è  `                                                     ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿðÿÿàÿÿÀÿÿ€ÿÿ€ÿÿÀÿÿàÿÿÀÿÿÀÿÿäŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGIF89a  ô  ÿÿÿ   ÎÎÎúúúààà°°°èèèŽŽŽÈÈÈœœœØØØ¨¨¨ÀÀÀòòòvvv†††¸¸¸hhh                                          !ÿNETSCAPE2.0   !þCreated with ajaxload.info !ù	   ,       ®  Ž$ AeZ
ù<ä ’„ÃŒQ46„<‹A”ÃŸˆáH a ¡¡:’êID0ÄF„Ãa\xGƒ3€×!Ä	ßO:-‡‚Rj�—TJ‚ƒ*		ƒt†ˆŠŒŽ�„—~—"ds]š
š)t–¥-"– i;H>³n§Qg]_*‹ 
®R±3�ÁGI?ÎË´¨v$Ã½›j3! !ù	   ,       °  Ž$À0eZy¤0¨£q £ãŒP¤Ð£W )"; qXˆ^ÏD50�‡†	Õˆ<H3!±ˆk-na€ ‘(Äi†·–d€$P@yw`„J‡ˆ#
?‡y‹��ˆ’o•‰žg†žf�”„'8‡“{ 'C p`j nµ"¯ 
2¸{”`x�jy¼4ÁC,³4£·o#n¡$¼ÇÃŸÀ‡! !ù	   ,       ¸  Ž$€ eZ™$¤2¨£‘ãqŒŒÓÒ¢EÂ Ò‰Žp$H@D/¨ƒ¡G…DÃ„j8v#™ÈP((DÆ¶¶˜ ŽN¤(3Ü´Á#y’(@	gUx*kKŽ)?K‘“•�˜šœ�¥$Š¦"
–*™©ˆK™�µW ²§¾�x�¿?ŒG¾ ©#�WÐº�šnšh×K,�Ù �Í+Ëà—Æ*! !ù	   ,       ¬  Ž$ eZY$1¨£Q(c’ŒÈÑÒ¢×O'"À‘¢ÀÂ ‹‚Ö 1
³ qØ�d"ƒAÕVÄx8pÅñ4988MRCÀ@	e*3@iIŠ)
'
?I��‘@“•—‹ ¡‹,›Œ¥†#¥‹¬‰°5© ,ª¬©µ¯"ˆE›µz­ ?¯‰@¹Eƒ²ƒ@²‰¬¸Á)»À¢½È*! !ù	   ,       µ  Ž$ (eš$Ã�Ä ŽCŒE1
	;‹®†('2$¿�! ¾ �DS%!² ‘Ð)e[�ÀTE50âp¸Å¨ä ÁF”
�{V8,È%`3gI‡w†3ŠŒŽ*�’”ˆžŸh™"Š€)	q4‹¦)#‹gƒ ¤#S»$Š¡"Œ$
º¬>Ì¢%‹`‹£ÔrÏJ{1‡ºÍ$Êˆ…‡! !ù	   ,       ´  Ž$@eš6$‚�Æ Ž�`Œ3*Å=‹�
…ßÈ Pˆ\"FÁ©’í²`PÐ-­ƒÓÐd5VÁ"�2Ÿ|?n"!(¸Š‘€è•)e€„4xyc?		‡‰3‹��…™™”#wyJl%o€^[b_0	VT[0mœ $ƒ4  >„'VZ 
¨cÎ ·3ƒÆ$Xš¼�%! !ù	   ,       ­  Ž$`eš¤¢�¨:D3
ÂH0¶, 'j0¾Qƒs‰‚L(2HM¨Òj#ÐÈ‰…BŒ\Oéi`u§†=YŒù€EVL=I		ƒ…>‡‰‹�••�suIWJm|	\"_…b0B¦ cV"d]*K1"	H|@B?ÀI4…È# S$¿-|¶|! !ù	   ,       ¯  Ž$Ð4eš¤a�¨:DÄh¶Œ³·œI �Á/€K¤$W-á	0(`3œÍ ÑFãÙÀ=�±pf@ïýtéøQ£�ìÉ
{f~*€‚„y��S*mg)	”enu		E^Z^	g@	kw(b&	-w#"º xW "¼t
#Ç#”%U$Ë`¶t±o! !ù	   ,       ´  Ž$Ð4eš¤a�¬:*ÄØ±à1œˆ–ó‰v/€Kd¨ÉzÊâé–<Îp6%tP5Ù¡êS|É îØH(²FÕ ¯›c¸Œ€`05xz*|~€v‰G„0t#
	FhŽ0
#Cd1
 I¢#(i	-�“ 	À	uEL	q³Ì"	h%±$Â$<Š ·q! !ù	   ,       ­  Ž$Ð4eš¤a�¬:*ÄØ±à1œˆ–ó‰v/€Kd¨ÉzÊâé–Îp6%tPÝñt¸ª¯é„5Å©3ÔÈn»�G$ò€´
�@aˆÏëwy{hoFS>k#	FY"Š%E 
CbA�I4$	(z ¤:2� •
mI		L½l#Æ#
¦F­#É#š>²F! !ù	   ,       ²  Ž$Ð4eš¤a�¬:*ÄØ±à1œˆ–ó‰v/€Kd¨©ŠVñtKG‚ˆ22ô ëŽ7‚D"�¯ªé$)‘„±é•Q�ø¼Šqp8yl|~€‚„6z�w2j#F
Œ"	’%
VŸCœ]¥6a$¡ 
Qª:2	\ � EF	I—&Ãx	¯"Í“¬F4$Ð]�#¸x! !ù	   ,       ³  Ž$Ð4eZiä ’J�16„<‹ŽˆB”Š?$r½œTêHzDP'"lä(†1±5–y½Ãá8tg†œ—p,’qÃ›”Múÿ*		q‚„†ˆŠŒ€”"}•#	b?y{		{)Šs	- s­:–9>e ¤ E,C\3
�‡^·3[�¬ž¾¸� °S·Ä|˜»²?! ;         ‰PNG

   IHDR         Ô¯,Ä   acTL       L½-   fcTL                   dè  3¼GÐ  ,IDATxÚ…RMˆaŒ
ºD¡-I±‡:xÐ6èÐbKK°D­ý¸mK´´ŽëA’œ=¨‡°N7÷Ú!‘@0öÞ¥Ñ(Â
‹Å3AÐw@�ùz^šK{àá}Þyÿ†ï}…q0ÆŽ[ôGð³Å·	Ó€„{àwðéß8€þeÆ.26’ag'6(—ËkHøjÆØS°u Okƒ�L§Ósÿš¼Þ€tt:�÷Ð?†Ã¡r¨~Ò4í›®_Qq¡PØ èsà,/>ÆtFEy0•ÍfåúAým*•Z@xžè÷û]ù|~=Ó ejÊüMl™L&2Þ1ƒåúýþK|ó€"ÈAÚS­V—¨XUÕ@4}@µ<Áér¹|»v·B¡Ð¢0^¯÷J2™\s87áž:Ó·Ðõ�®ë;½^ï…9mÄŸ­Ö*ý…É;B³ÙŠA¼&6�¸ðT*•Ç¼Á~e]0jÙétÞÅ>Bàä”;9±½³í³Ûí>ª¡Zð€Ï@¥ÛíÞšÔ +^¤É#6zB‡Å‹�`�Ïa#¥RIN$×¡¯Ñ4ëdú�ÇèþZc$y(Ëò*ôÕv»í§„Z­6G�D¬Õ¤ƒ£I’V�ÀŠu�3æ…�Ç66ÕŽp»Ý¨ˆÁ'�b™|Ê¡\ðŒ0\Ûe¬5¨(Ê}¸Gùk“ŽÅb~4ær¹KÂÌˆ¢x›I±X”J{{üØÌ&O‡Í¢ç‰ã1+~OÕ™©Ò@…P   fcTL                  dè  ¨Ï­  +fdAT   xÚ…RAhA]¢EXPÙ%âA�©VD¬±¥*ÚHl«=XÍêf%xj$¹”PŠ`¼rH®RP�è=ñ�CA6[¨!db 6°nhIvÇ÷qcâ‡Ç¼?ÿýÿgþŒð·1Æ†<üðÞãÀ[ üÇw>ƒ¯»±˜ã8V¹o�òzù&k¶m¯a=Îç N À÷z½ÿWç‹ív{Tj4¯éðÌ_æ»V«õ±ÓéhØ3ööË¢(ƒ€3<ù0³Ù
ÖWŒÙ‹ÙlöÁÖÖ×åt:}áqB.—›Üý¹û¡T*½€nP�à£¾L&=ØÛ[ÂÆËf³ÃÞ( Üˆ�âø7(Ù²,%‘HÌQ.œ
·óùüÓH$rUèc¡PèN6/IÒ-¸'Ý+tçQuƒÓÐý	ïÜÇÄÆÎÎ}:…‹»Â·ZMyN¨�ÿ±jµú�Ø®n/î ¦ý~#plÀ?9ºš]“–r(—Î� Õ4Íëý
 6Eš.ë>¦ž|ˆQ@ÿ¢G“Éä$ø5êæíL{©TjB×õhÏ3Æãñ9Y–gÁ¯`�3$0ã‰`?ˆ«#iE™õ>ã At¯ñÌ2-%ž¥$Ÿ8ýòICZ`¸çŽÅbqÌf¶ªiÚ=¸C|ÚÄqµW…Âya€�à¯ßáŸ¤R©È››QþÙÜ:6Ÿ‡�»è‰qû”%™lÖ>w~   fcTL                  dè  EY~í  ,fdAT   xÚ…SMhQõªÇl‹‚'ë-µ^ÄúS$üi
6m)¨M$FRñ�\r2F‚…BzRôÈAb¼/õ"²‰ÐÃ²!,ØÄ¤�²¬‡„¦»ÏoÂ>Y¬>Þü|3³oæ­çoaŒuèY`Ãa÷Œ¦�pÕ¶? E[_fÌÚÂ¹äZ R©\¡®ƒÁàÎqÓ4ß[( ý”eYŸq~Ueí_�Ï÷ûý)¨b½^û%ì[�Ng£»·÷f¿÷¾-Ã0>
‚0=<àÉG€'@XÍd2óÒéi"‘˜Ax–�Ïçg›;ÍwåryÝ²Ø'ð~ MàÕK¥R+¿t=Çz«Õºß4  \òõz½·àì0‹5$IzE¹œpFÅ›¹ç¹U¿ßÉmFÙlöv­V{B0Oó+, 1ìq»Ý^á�]Dø¹»»L|µÑ¸Çª¢Ü÷üGTUýÃWTðíAÍ{½Þ`¡P"prÄ;ß,l‰K9”ËS´ªªëºß­ b7ˆsÀÖ(Ç¹ÆG�¿Éaldú5êæìL¾t:}]–å0qíœ±áãñøR$¡É^îv»‹DÐ4m††DÐ´é1Š‡¸Ñh4ä\ã$ ‚t–¶aèFÔçó�v‚M:’‡_Iâ‡îX*•.šÌŒ%“IzLÇø´IÇÕQ<V,/ŒÚÒ$ÞúþHªÕjäûöv˜?6ŠñÎ®â¼ÿ\bCùû’š·Ð.ú¢   fcTL                  dè  ¨“—  ;fdAT   xÚ…R_hRa¿ºT¯ºQõ®4[¬‚ÍEÛúÃjy‡Ý²ÙKŠ(A”=$¢Ç¡ô$øà‹ÑK¾Œ+Á�1·áAEaêýüúóÆ%Óü¸¿ï;¿sÎ=ß9ÂßÆ9ßcà2ðØpÇ€eàäï3{þšx«ÕšàŒ­â<Ñ7A4ƒh¹¹»ûÂ}À3J ì×4ößŠ¢\ûWå£ÀPK&³&�{+•Ê¹\.÷äÇööÓz½>…»Õb±øNÅaðI`æOÏÀýn¿Ó½ÞËÉdrq~a�Ú'�3ÙlöU,[bŒ¿‡î3oó4¾{)‡Éï÷ß¨VËnJ’Ïç¯ànÝˆ�Öjµ—Ð|Õ4íK*•zA±ºà°Åb¹‡o9Ž³Bƒ“étú�Íf»Žã!½…@fŒ=(
7õÊ}Ll¶ZÛœ«ˆù|6·¶îPÂæÆÆ]á?Öh4Ð{{ú�f³™º5m6›�‘HÄ	ÇÁ{r`%²â´Ûí·)†buÇ	`�Ëåò¥~	à»H�k÷(¦gŒÊšâÂC] ·Q5ceº…Bv,’‹´ÝSgŒ�g^’¤9ðó¥Ri–ªªŽÑTõ'q™|¤!­Ûíž3Žq°Ð6Ò4ªåªÛjµïTÂ™8‚;©o,0ÜÓc"‘8Í8“}>ÍyHŸq´6‹är<?%°ìú”¾$™LFú¶¾îÒ—­ëCåÁf2ðqB�Ï`¿ ­ð˜ “êE€   fcTL                  dè  Eß~  6fdAT   xÚ…’ß‹QÇcÙPêÕi)ˆv‚´Jv¡2‚
ÚíÇ”ÛÃL7…-…”í¡¤‚^|ñ/(%_±@ÜG#ˆ%LV‘…e@*	D™‡UÇé{Ì	I´æ{î9÷Ü¹÷î_ÓuÝ4¢o÷ˆ€›fH8$°ðÇ×|Ð�‡±EMÓ^àë˜X ‹QÒÃŽªŠHœ…öj( }°Ûí>…ÿ:—Ë]œtòqH>ŸÏ{ Y³Ù´—J%±R©0EQ–°ö\–åg‹…‡>Îý½x Xñnl\N§Óë‚ œDx™�$éÔö—í'‘HÄ­iú&òÞ‚÷`†j˜�€[QZ©ÕjW°ff`i;þêrâ½N'žH$´×H8ÆóüÕp8|×år�å&cÌ•ÙÚÚt87à5®p0z¼z½¾fœ<ÁÌªºÿùŸÀgçv÷öÖ© ±[­Þãþcívûƒ®÷Èÿý‘>ÔŠÕj]�F£«ž2'óårù�Óé\£=´×,€û€µZ­K“
ôz=zùŸý~¿Š¯w¬�…|Á/P�Á!c#iZ…BçUUý
ý|³ƒ6ú|¾;¢(Þ†^j4ÃÐ,Ò²üƒ4£åd2™—ÙlöÕhç OÓHÝPZŠd³Ùæ�Ÿ46þÒ˜XpdìŽ©TÊ¡éóûý·àÎÝ!�«	(Î’ÉäinŠÍ™ÍækÆ�‹E±´³ã1†mÃÉÓÍ4¢—‰±Øˆý|â™§(µ�Ï   fcTL   	               dè  ¨vî"  7fdAT   
xÚ…S_hRQ—õ„zÕ†�¹…Ê"!èm—åZkxÉé„=©„�òÁ×Å|‰¨½ÈDÁÉè¥'‰@d*ø0Cqˆ/¢Ü�ÞÝ{ú}rï�É]ü8¿ïœïÏ9ß÷ÃiaŒ�ð9€:Ó\<À¤ª{	*ŸdìxëÝ ñx|J–e_Oy^"Nˆ‹½í­¦R©i½Ìã æB¡à&§v»í(WÊîr¥â&N{¥Ré-Ù€O ·5çsÀŠšivumíQ&“Yr¹\·p|�@|wgg9<…Ík`�É,‚õ<Å	…B‹‚ÐñP�z½þ{ÀhBÜÑh4æaóAìŠ‘��MºÍIQ¯™Íæ'Ñhô•Óé¼«W#Žãf¾mmù¬Vë3¨í	e¦‚5›Í—j6=1þív?Ê2ûŸ¯@Äppx¸¤µë`ÿ�á?‚‚~fLÞ†ý6qƒZ¨Y“É4‹Åhp®œ1'c¹\î�Íf[ ÕW¶x;�ÎC½ ’$mÂæ·¢(?°.µq¯°ç‡ÃÀï—2ß”™ü=›ÍúAØ…þø\ì·Ñï÷¿àyž"Î´Z-«V«ST`‚(ŠQ¦(ÍcIúI6‰Db=™L¾lã¨:aãÔ¡#xìvûD¿¸Ð‰c¿ýX$[àêÐÓéô\ÕŸC½ u‡x>ŸÿÄÖ¨Õ|guiÔh4žI±Xäé/hÃf±XæÕÌú2ø.í/èœõå‘�™k ï   fcTL                  dè  Eà=Ë  .fdAT   xÚ…SßkÓPSúhk©8,l>´TPP*+ÝÄý²þc“„u™…ú”‚õÑ@ÿ€QX÷4„î½únŸ6¦”@¡È6XÝh±††›.$¹ž#¹,™>ò�{¿sNNÎ	ó¯BÆ|0?rçb(¸H &m_@Ø|’c5®	
…BØ4Í]Óx^GŽ	�kºÎ#G�[åq ÞjµÊ¡°×ë…jõW«×9äx&Ë2‡àw1†_¬Û•fß§R±R©´�ÇïÃõòb±¸š‚;ÔÐÖ0sŒ¥Óé7ý¾šÀÃV«5g!  †<Ôh4b¨ù}~.@ÌÆRÁ¯×;#IÒR4}Ä¸X$y˜Íf—ý~ÿspý´…yÌŠ¬Óé¼¥•]Œý©(k ÿødÂ3Ç''+´§ãÃÃUæ?Ön·EBL	ôrÆþP³�g.—ËáâÜ¼dO<åry-,bŒK—„¼ªª>sK0Eb’/&17A;52F¹*s™Lf
øSÀGå eq¼Ýn7þ.$Ú�çÕ¿cL&“¯yžü±¢(qLÖl6ÃðÜ|ibYßu]ßAÍööÖ‡|>ŸrŽÑgoØ8N£¯öÁ`pü_–e�	‚6“íb¨Üé¶í¼ª ŠâKp¯�¸8E^©T>‹ýXf.1Ë²/è’\\hß4MÛ£ËvËç[ •]ÍÙýFîö
¡—Äiß»à   fcTL                  dè  ¨*O±  "fdAT   xÚ…RAkA^,¥�C¡xÐ.)½ôP(’CB…BÚB²“4…dã‚¶=ëAZTè/ðî¡Òz«XèðÐœDjñ”(VìAÙÅ�éû`‡HeíûÍ¼ï½·3ó¤Á9wÌè-¢2³wˆAâ]ký
„ÆçÓ<¶r¹Üªiš¯'†¡‘ñ4
@“‰�]çÛ$Ýår9 c¿ß÷TkÕ@µV@c¯R©à!½‚‘|…²:m¾‰F7ŠÅâ¾ßï¿GáuºP(D)�å‰;qÄãñ]]h·ÛOhÏC\"
@{šÍæ<º®c±Ør…aÙív?M§Ó{>ŸoM²�×ë}�L&÷à¥å-qUqaÝn÷…èlƒ¥ß½Þ.ü©~v¶/6ê§§ÒÐh4É¡%ë¢6].×V&“Áà\_0'7²Ùì¶,Ë
r¬\1$\Å_ƒÇvF£ÑKòÓqcôõÌ=c¥\	$‰G¤¿ èe"_Æ/Sw¥Õj} �æ&?B.âŽp8¼£iÚ6é‡S6ýÁë†ñžßˆŸéÙ0…yãâ"	O*u¬¥R©ÃÙg”­	Sã˜Éê‘Hd•qþ‹3v¢ªêýñxœ§ø'â¼Ä›sgìt:oÉÐ)•Jiy•ôO*rM“øÎœNó4ÎÏ¤�	ÏÅ�‡ÃïúùùW1lN§S�Á1£×ÁùØ%þÐµ˜ÎpMÁÜ   fcTL                  dè  E¼œX  (fdAT   xÚ…RAˆa^Ìˆ¼¦-EÑe©=$
2B´u%,ó0K.h;¥‡/{J„Ý¹.]Â›,'/^$;†Âd`E<4ØªË¸ì€ûÿþ½·Ì¿H2öàƒïýï{ïÍ¼÷–þ5Æ˜k†‡‘¹˜ƒ¡à 	Xµý7›¯2FR¨q,P*•îQJ·&–µ	ÂKÈ± rk2ÙDŽ§Î7�ú�F…£ÑÈßÒZ‰–¦%�ã[³ÙL øÌáÉ )»“ e2ëårYŒF£k �«ªº‘�jlmŠÏÄ•Ëåb¦y”Ä@¯×{
o~À2€r§ÓYG�išÉl6ûs¹àºÏç{V(â¡Pè�ÓŒ‚Áàý|>G-¸×ø/D°*Ì0ŒW¼³ƒ-ÿî÷c|;g+ÖDþ ·ÛKÿ1]×Ïõmôö ¯×VçÎ‚;ñì){aÔbæòÀ{@ð‡òÙ©ÀñÑñÐH„‘×xX<ù2À`SfX'Ö�z½žÿãìÅ�»þsY–kš†ŸÿŽR¶u¾Æjµº£ªån·;pJÈ·)c¿ÆãñÛ³B”ÉÃáP`”Ê°¾èJ’O§Ó±Ù5®Øöb:e-rJ¾‹¢xü¯P`_„5Ë:‘Á/ n£puî»Ý.^×ÏJ¥²îEà_(cûÈ‹ÅbV½[«Õ-ÚÒ
L8Â�d0|ê*üØ<�À;/2×Ø˜‹qû;v™Ö5}¼   fcTL                  dè  ©½+H  -fdAT   xÚ…SÏ‹q3Š� ðà´lôã²A¤ @‘´Ën]Äm3Ø%‡ÆêàR‰ÒÄî¡ÃRÑ©›µÇL"ü*È$Á`ð`¬Bì€©ãÁutüöyËLÉØƒ|Þ¼Ï{ïûý¾7¶�1f7ñ°<³2Î"° ûw	:_`l'�e�|>QÓ´{ê` @x„8 >PU�8i¬:ŸåËårŒ„�NÇ]­UcÕZ-Fœ¾U*•iÀOQŽ‘|ˆë�‚÷‰Åb±¸‰DÎ#ì%/
ë	ÄH£kãÆ›ØS©Ôª¢tE
4›Í%|s`qw£ÑX$�¢(b2™¼A¹†à$Ïó×³Ùl4\±Y˜Ïç»œÉd¢¤…;¯_aò	U�ÑhôUïfeÜ/Y^5¦s0â¡ª~f¶go8~±ýÇêõúšQ@ªKë6ý¡‚�'*IÒ3š÷Œ=9¶ýb;är¹B”s�kZ˜oÀUU_Yèv»×H;fãÛ�ªÀ÷¾¢¼/•JwÀ3À¼©óq �N§¯Ò.L�3ÞÄ†=v8Þ}uÿõ„±ý~ÿ¦ÆØˆ6dYö1M{Øn·itAVDQ\1�qà1…%$|Ä5Þ†Ãáà/™Æ¶ü~ÿ¹^¯÷~8CZàÄÔñˆQÞí¼ÙÙ€{ü9N±E<—ËÝÂ¿ñ §½4kJsN§sÙX’V«õôçîî¦±lÇõÎ3Ínâ^ÂTÌd ÷š™…f    fcTL                  dè  D+ø¡  1fdAT   xÚ…RMhQ%*.ä(‰Eiñ`‰ˆT’ª`âa›â¡µYØDÁP! M@1'	HK—Š×r
c*Þ«·üK’ž,ä‡„@vIöç9#û tMøà›7ßÌ¼÷f,g�27Á€Çæ˜Ù¨à€,~að%BÔ0j¦Èd2Ëš¦=Ë2ÂÈ± ry<æ�£æ_�yUUŸu‹Å
{½ž«Z«†ªµZ9ž•Ëåj€/àMhòEÀ) øþ<]+
›,ËÞ„ð]ò|>¿…hüÆ­ÂôOæŽ�¼×uý´F£Ñ'8s 5ä®f³¹†ÉƒÁ€�ÅbAÌ¥‚«>Ÿ�­T*R©”ß2Å<Ïíd2ùÄáp<÷
}Â@„ÔEùF;O1æ´ÕÚ Óù;bI’ŽˆNÊà”$iøÅòk4›´@½Qß²åw»ÝÁR©ô‹3öÄvpx°ÛíÌÁ\ò„è_•‘òzZ�~¿;«DÝÆÅ¢Éç�øÜn·?f³YúÆK“�ÞD"±Š»`c:�~)Â«Õº2”‡o5B„N§s(Þ89ù½ŒIÝn—ý
Çqë<Ï¯OŽqÞØ°;D#‡òP~çõzo@¡]ðwœNçuH�Q¸lz#¬ñØÿ=a_Ø÷ˆ_A‘äñxœ…X$—ËÝš5¥y›Íæ§K"ŠbTFè²1óˆvžeô]tÄ sŒÚ¼a›´«f¬    fcTL                  dè  ©áŠÛ  1fdAT   8Ëc`@ÿÿÿgGbû±?Ÿ‰ *ˆâÇ@œå§�0”­þÿÿŸT ­„Ó€{÷î%<ú÷ïß] -þ÷ïßt¨!ìßýJ±/^l„ÍæÐ?þ™_¾|Ùä?j®¿tõRÂ¥«WÞ¿o Ò|þüù� [î�é@|ˆÏ ñê­[·æ½zõríœ9sœ�ÒÖ ¬½~ýúØœœw _¨«RaaÂÔTtÁ ÀÉïß¿OŠ 1’#Alƒû÷ïƒHûôéSJQQQ(H/L�¬™™YÀÁƒ›ËËËÝq…‘­­­YCCC„„„„'�+óB¯â?~ü˜Žf3:àzþêU,vÀQüöýû	ÿÿþ_
ä,ÖàöíÛ10nÞ¾Ë (_UUÕ ]»v�¢MO:á�0y‚Ÿ¸¸¸HT/XÂˆÛþþÿÛŒÆX\|øðÁ	dóŸÿâA	¦™ˆ;@Ü¹s§¬««ÏÈöb>d›A–TVVÚƒÒF4¶´´Ä—••Å²°°X£(˜ˆò>|h
$~ðà™HÓÛ·oƒ�ê­CRRRB�£Q
’Â~¨´àó‡Ïúúúj`›€ÉÄjN…Ú¬ RÄ’~Ü¶m›ÐöœÒÒR�M¬H™‰µ¢¢"(—¶fÍC|±$ÅÅÅåK$.\HåXbƒÊIŠjä<o�*L90  É¦šß�+p   tEXtSoftware Japng r119'è³a    IEND®B`‚‰PNG

   IHDR       "   >²Ûÿ   acTL       L½-   fcTL           "         dè  Û Áf  óIDATxÚµ—mL[UÇk`#ê`„â4�˜(¸„DÅ/FöÁÑ.YÊ
ÈæÚ1(-K ÇDÎMR>8£.1~1cSÌD£MÈÂ'?ß1"fÁMÂ›µ£.0Vz¹çÿO9oÏŠàm<É/çöœó<Ïÿ¼ŸZÌ&Îy-¸~Ïnma>P6Ø�¢|„¹Æ¯#¿–¢~'Ø‘^pUmÒ8ÿŽÆ€79€6§i$@#Q)ø#*W½È[À¾tzÿ¸~"4ÔÍ‚? 	øËP¾4ƒVÆØI�0- Æ!8úü~†Ã÷�f6`Õƒ·n-Ö›
…z1Ôß}~O'	Ðþ€ü>
Nè"ºººŽ˜�™™Y±´´ô)ÖÁw˜ëÄ(€ÕÁ9‰™×¸v]Ó´kB@µQÀøø8Åvçû0> pŠ8{æìI|‰ÅHPû`0ØWÀäððð91e-zÏ)·ÙlµäƒêVWWF™<öÉÁïAFþ9ø’3ö.òÇP]>99yßß€ËáHø=av861eGõÞ�(Ú�ïPm<`‡QÀ½œ³ � †û"†ô3ð÷ÊÊÊKYYYŽÁÁÁö���ŽŒŒ»0+"lâ›’½²²²Ön·A»Ãóó0®‡�\MlÑ�IÓ=44tCøQù	¸(F#„ÞÔz[
6K¥z»¶¶¶§ô FbŠâíéé9F1“€J«Õê¼zõ÷×ÑðcÆ7„ƒ2Ôç	¶Jy„¼#ˆK#—ÜÅÅÅ5K@©Ø�£»»»iaaá-UeŽ��ù³³³÷˜ØD{h(±˜÷Wìš1:v+eº”�ÃÀa Ï„€<Éù|‚bÈ;àQÆùkÈßæŒ½ƒœ¸°zûöùþþþ&1¯fSi]]]íÍ›KÍÒ. êA!	x¼�Êó”äìMä„ß’f¢@ÆÀ²K|-~ƒ£ÜÀZ|íåt¨Šâ–ë(ŠÒ`éëës-//“ˆW�Ÿ3îGcÿâòâ™^_¯3]���UÑhÔ#�D"·Û]-Ÿh2¶4ãoË�ÜÈå:áœššêX[c/BíÁ4æ¿œî‡‰‰‰F±åà²ÁnPºt‚ûMO>ˆX"·‚]›<Nƒ.CàçA;Øû_àÙ+¿(§‰ÇãwÜ†Yœ1˜ñSÈ;`ÔrrrG+±­ž²¡“0õ�.#ú¡(Œ‚‚õ^cÞ<â>wLOOW¬;âä¨üßæ\233c%[òA“¤í§*^ùÅœ‰SïøÊÊr[8níììtêÇ§Çãy’^Ä	ãõž4‹`… ^P˜(“$d«ë§ÚÛ�ÍÍÍµà…åÅÖOyÚ¥UºäÊÏ,8©KqÂÕSÙìììqú­�–ªòòA¾$ßöÍnÃCà€ñ%/"‡ÃQCu¢D9•Q»sÎ¢:á³BÄ(Úæ³œ»Œ½m½±_8„0)qK¢]³	gu³(¦Ä¼%%%ÕúÕ,­úLmb1Å«—«ðaZ€ßï¯�êI«ÏçsŠûÜ¢�€qfe¾^Ÿ“1«]õ’KéPnnnU~~~-ãcâ†á‚YˆDZ¤G��lÈVÌ¹éT*	yá¸\®£ÑèO8ñÐwj;ñüJ3e[Ür¶Míþ·$ÿ/0™þÇ€}_>¢Ö   fcTL          "         dè  @Ó+²  fdAT   xÚ¥—mL[UÇkÀ©d!ˆ„Lû°l�%|b_TöVÍìV@4P
--00EØ5ËÄÌ-:ˆ"Ø,óí“âñe¢ÅDBª? ï-6F$-—{ïñÿ”sÍáÒ	ôžä×súœû¼œçœžçÖkcŒ™ÁMðxzGŽÀ~½\UÕ/ ÿ‘©lTUÙ-ýüÊÊÊƒ˜O4ä\–åÓ0ò!¸žÙ˜úÝf ê(ú_uA×©LýýxÉÈê»�|ÄƒxD˜»E 1 ’‚Y°€LMÅ€$IïÀH?¸>Gß‚6PÇy˜†ãyô~ô¾˜èîî>Ã˜òðò|ŽqGßP tÐ�qY˜Ä¶DV�¹Åááá+1Ÿ»¸¸xUaJSØ5¬æ~—æ666>Çø{ìõ(ÎÊ0àK¾ïsp‡Ã¿��Ýî÷qÐª(ìUô�ƒ{ ~´ººÚŽñ{ A\Wqèù®®ÎzqsC’¾îíí=O2¬ü<7ƒ@ýè;::ÉÍ!˜#�ƒ
pTïü>ð:x\o3E9‡þ0¦³GF~zã÷�wbbâ"W{X9f [}|ï~¿ÿSˆhQ© T)ŠRM=p�{Å îÇäÅH».cßßÂ÷«ËËËqqqÖ††Gcc£cWKåA˜ùØDs��]çzzzÎ'$$äÍÍùs¸Cîœ÷²ìÆxß–ínoo¯X__¿À”H&Þ —´l´µµ=%¬6Ü­ejÏÕÖÖ>¡9	I’»¹¹¹ˆ|n	 œÊÊÊ*ùÙC?7°ˆ¢\3vóÉœ�Z2Ýzç7nØÓÓÓÈ—> j�XKÊÊl“““gqÈ^z111F÷Üòz½/H¡�û·ñq‡Åby–gÇÂ}Em€,pXb	 Y´Ám‹ø‡ñ5 Ý�è‰³ÿÜ¹S_SSSÄ÷5Ö–YRRR¸¼¼ê"§¤™ðQ	<õŒ)õÔC¡Êd°‘#Ñ±>ºï)€ºh„B’Óh ²$ÙEÇ"ð]fr8ùKKK$8ƒ-ˆ€qM pÓœÑ ÊËËó‚Á Kï<¸ìv{¾þFÓc6èWöSõÑOÆçûÝŽ"CÛ“m`ÿ³É†Ïç+'›Qœ§êöƒ¨~”&‘{v®¿ˆ Ûä#ªÂú:;*3¹’+`mmíaÒÕŸ~Ê®ümÕppo+ ·Ý„±«•Ò¡›0ú/@WŒ¨4J„ÂCãcã³Ù\Hû555•»iˆ‘¡ìÿÛsMzzúé’�q\Å¢mI–ÜäsK1jii)Z]]uÏÏÏ;=O‘v}º\®ÇþËÎæJœÜY(å¤EdH¯¸bÒÕ®uO]]Ñììl%ù€¯(Õ�"�ã I{™Ð€‘’(7\)Éfffž§ïZ¶d™�²¥³m¹[5<	rÄ×(ý¹°Z­< È—“Œæ”í{~˜æ¸Í\î¾vÑ°›¸úÁÁÁ2¾“ø†Cp•ì��».h›‘ÿNÍQH
¹322òµÒL2­Ó3¨!nM.KêIkkk‚ •T555óznÒ2 fAPËjz¹©XQ$œvÙM6LÚÉ¤¤¤¼”””<:8âËÄm¡ÀüTê^j,¤CºdÃH Á)Bpl6ÛsÁàm×ÂBÀEãèzüõË`‹'v¨ræ=èoQÿÄØþµD{¥k~   fcTL          "         dè  ­Eø[  ùfdAT   xÚµ—]L›UÇkÀá’�	™A¸Rp	ñb^hRbj²tv�)«Ð²~`è¦KÕ@LQ†³‹Ê…K0êœ¢KÆÅô¢IIuËtcL\W½ñ†�Ñ¾£Yº5am_ÞÿÏ<¯y{lßÆ“ürNÎ9ÏÿyÎGÏóÖd´¨ªúø|š7·0îè°�ï—eù$ú¿Uuí¯óØU€E9ßØØ0CdÏrNË÷PfÐ>Ç�õ(ªrõÏÀ]ÌêßÇÀ,ˆjÝØ—à0¾Óõ×�óØ™Ëªª\—p÷nÆ±÷Àûà„¬Êý:G§
 ?)Šz»³ (Ê�†ïUUyLw‚ÇuLÓ@ý½îb^€ÓË¨¯bìZ(:j8€ÒÒÒ–ÅÅE?Îú]Nà²�@ý�¥Óé“ Îz&›Íža|.‚+`a}}=D[=ï'À«’$yP7�ûÐ]ÛÑÑÑ…öQvÇD€æ���yÄgàôäääõaå?`Î%Ô¿ ŽLLL“i˜€Ã¼óûÉ9¶û‚×A¨Å°9 ý86???ÌÌž6†…:VVV>RZ½rmiiéºša”0ê°Šñ8ÕàA} Û( 0„íöa•Äkàˆ $l%%%6§Óy ¯¯ÏŽ¶•™Õ° ,¬m¢±@ 0Œ9\VVfËd2Ÿ@c—ñv%†¶€zÜ¼£Þ©Ê9îÑÑÑ®Œ˜€ó!L>¶G0öŒnµM PiÒæƒA-Ãþˆ+ªzõîL|nnîcò™ ØÛÐÐÐ‡�l7Y ‡À#¯blVªØ´²­È1HÜNÞc]ä‹€J=°›Õj}ñúõß\ØÂ�³gÎ:˜è*åååÅâqú‰Æ²™ìÂÔÔÔ›¤Í|Ô²Ûvƒ€MÃH dÃi�æ“ÌJîÓÙúõ¤’I—ÝnßÏÎÕhi"�d2å"MÜ¯W4}æ³ÎÄl�Õ@›d*²�†Þ1„)-¦�ZO:-ö€$ŠÞ±†(B¿ï}·	?(¬	n+6 ÒHäÓ�Ãáhã_4K‘þ·¤_ÃO¢Ÿa4ú»yÁ�hÍEœ¿™4¢Ñ¨“4ó8¯áv€Vä}þ>ì4à|gŽ† ]ð3-›UwIªäfE€Tü0Ùò·Ÿvé{í6àå'Ëà«éé—+**ª(bK+d3Ûü¿ ÉK>sÒ±(¢S7)òkä ÅbÙOç…�’–¿„T2ÿÛ™köHÇ­dK‘Hä ^[”D/ùÌIF###�©TÊ»ººêòù|�ÚóéñxžÖv‡=P.î%êîõa{õ+&[íY÷vâ{ÁM>ÈW¾lhåni3¨„P›>zˆØùN{1———hóh·$Im'Òâ´­…²áð¨¥dÃÇø{a³ÙHÔôwP¬ŸúhLþç™?JcL³…ù€¯-¬ [¿úÙÙÙ^¶“>wÌÄL"\ÐÝ&£oµKs„œámlllÓR3ÿSÕR0ÍAñjý4Œú§/ßvA+é÷ûý],Ÿ›´Ðï‚Îl·ÿ-—,‹¸í’—4LE”=•••ûª««))Yõú¶&nî£ÆJ6dËÎÜp©{	þâtww¿”HÜòÄb‚‡Úì¬¬]T)%6Ér–‚vÿ[áÿ,	ð�¡r—¢   fcTL          "         dè  @�Š!  ÿfdAT   xÚµ—mL[UÇk@‰/0‚„`–í“‚Œ	~™a_Æj\îvY“Õ2¨@;”ju$…9Ô¡Ñ�É¾™Å©Á
Lœ	a1!‹:�[FJQcò./#Ò¦psÏ½þwîv{l¥éÕ“ürOÏËóüÏsŸ{Î©-Ó¢ëú£ ¼ßi¼Gwƒœ$íðx—1öf’þûÁ}–œooo—ÃHx<‘è€½ÁØ-à}Áù3àSÐŽZY½¼ü\Ä.Sßë ‡øÀÔ^Î#*!ˆ ¡ŒD£ÑFóqç¯ Ùä¨;… ?øúðüRUÕhoo¯…‘��>ö˜œÕÙx>.€ÏÁ€®i—OYIƒª‰‰‰fFyÀ˜…zêØÜÜ’ Š "õp†V¾Ð5}pmmíãìììªtßwx^Uu'žóæÝv»½¿_€ ÂêGâù©£­­­~ccãÌÆÆúÙÎÎÎ&jCÿG”xš¦]ÔtýëŽŽ/Ù@Û]€ì\ß w²O­œ¼�ª:(¡Ð]ÙÛª§WÁ��—/�¸ø´§�Ì±SÃääd'Ò»ÿ
õ÷Ð´_Q”
üþ‚¾ET®¢þ#øäšÜ¼†s¬¤Õ¨ÏÏÿy ++ëˆ,Kµ²,×b¸Ä§qv^·aœ=ÝÝÝ­999r<§<C.|‡¨�ÓŸÀuÎ.s²ƒÁÓÏnmÅÈé?ðù|O™V[R•rc\__ß18½¢éÚ÷|Õ×À´]¿26ö6ùL —””8FFFDQ]/Fg§R@`Þ>p•V§7ð_Y^¹èr¹É—(€Ê^^Y’¤Úñp¸)W¼¡P¨^pœVÉÍÍ}pjjê<Â-��ž;÷á«<:÷•´Ü*À d"€æ6Èæ“äCüö€bØ7××›®þ^3-åýýýAÆ´0lNãUÌàIÌ‚	PcãÎyæó'¯SßpšF4MŸ‡óÔÍ,‚_lq%î&gÉ@4X é¿ÁÖ2ra™žÕuíï'Dýjs»ÝÕk««ÑùÒÊRõY044tZcÚ°yÓ ¢n"Ò¿£¯KÜÑDìý§e¿HDŸa$òs#ŽRÚž+-¼ÿJ²‰DÜd3‰ó"qÂà Ó™˜Å8/N°Á l“�×/½LÕUã@², ‹=DsÅó…"‚«^�Ùñ0b ;a^^^‰ ÒZ9 9´‹šíÝAõ’Ï„ãXQÐh7Ñ]€Þ×ôôtÕ-Czë¿åõógffÒ\²Æ¶n¶­¨Š—|&F]]]u¸åxšý~�±}z<ž}FtøÕ,ì €_Ó^óŠi®±­û}¾º¹¹¹òA¾’�†’�¥ûA>]«ÍêaÄÅœ`ÂŽ9;;ûý6¢…Û•ƒl�-Á¶”ê4<€ÝÔ°µµõˆ˜¸”8¨ï¶(ÞNmÔÇ„wn¾Þ�*î¾Ò(t?4¯~tt´�¯Æf>;>¥rxx¸Qí´eZpŸk6áÌð–––5ŽfñS5Ž`C÷£]…�Œôôô8 ‚Vr2çç¹Íˆ€9
¦i�`à8c
²]õ’›…r(??¿º°°°šÇ|™0`+KK-Â¥F¢94—lX°&ÄÄq:�ÇVW×<‹‹Kª§˜'ñº¥’MìpÊÙSÎûßŠø¿ Ãò#î|;l�   fcTL          "         dè  ­YÈ  7fdAT   xÚµ—kH\GÇ'd“>PkS‘B¨…>´?¥PZô‹ºå&k$æa}F÷¡Uº¥†¥bÑDÒ´+ÒÐÒÖTÛ¤‚X¡Ûíi¢•~(”úLVÝ��±ìº{ï�þOöŽ¬Ã>È.=ðóŒ÷ÌÌ9sî¹3³,Yáœç€z`å�Àc€%CâNœï{Û�Êë [¸Æ�ÐÀ$î÷ �¸Fp X�<%Ù^
 Q ¯J¶g8×: ß…©p8¬ -ÂÖZ€@¦¦io 3ç {ðÿ¹¤¸µ¹Ym8”4�hœ �šÆ»Àù­­­³€Å‚Å3¶¶¾RNŽ%Lg ™j ´rþ(œž´ê<»Ð××g,,žR<33S¯q­‘k ÀQÀ|>Ÿ�€Íéõz	
 t‚np~yy¹Ód2ÑwZUyô€Aö›ÍæcäX »°ŠŠŠãk7o6z½+ÍV«µ0¬¼}º@xÛf³UÓhïâ<Týø�sÕAÄ§fÝ‘jU-ƒÎÆUâùèèèqÀ Ï‹�0·û'ÒN«Ëív»ð¨0äq®QV>…m¡ý9¸?²÷»p¢‰tƒ¥¥E»wï>¢X”rEQÊ1©H²� ÌF›¡Ÿb·Û«š››kÑ¶Üþç6Íñ²7€¢¼„ö0×ùeh"m; ˆ©­íõ�À¿wœÊ´´´<±Ú|[òE?Ô�‚…|‚ùŒV¬sþ%ôU×¯|52òùŒh‡sssËÆÇ'jä 6Qù°ï3ˆ+¢ÆåƒA�ë_�cÎõ‘¹¹…÷,K%ù’ É
°Pª¯¡úýþ }pp°J8¾IOOhzzº›ëúå[ëëwtt4ÙQ_Qå>pA2Ðišóiò!Ÿj�€j9íëë•••ÇÄ;ORò/^üÀ
©c˜ó;ð=pƒÀ88ÄÈ¹¨ümm´K‘¯u�ÿMü‚ö¯ÐatýæúëÈY4P5€¥œLb®ß ¯’Ö94Ðõ;|ËêêêJ}kk6Ù¹gÕc%`©0<<|&
ÑŠgÃè¤ƒ?µÊ;šŒ™¥,‰çÏ–;Ñg8;ûG­ªª´= –»Àûà/¿ß?ÙßßßÅy¶üE¤�ì^Q�à»äX7À2×ù"ô%ðxÔÉÖ? r¬X8M= øÀÞû
×Ã�€¿ÁË€%<Œ40€�0##cŸDÂ@D?ãñxFŒ ¼`xÂÑ— Œ`O0¨n@Ì\›©§» ½¯¹¹¹âp`¼1AMˆñóóó%4¶··÷nWWE6t‚O‘2ñÀŽÓ°½½ýäÆÆ†·˜§ÓyRlŸ¸T<+²clP r%¨Í8Š62ƒ4Vlë“““ð9þ‰oijjêÝh§¡"Ui!È4®`Áââb%`äX“vÌ………E?Ê–ªò2šJs+±NÃ@Øn3OÊu�ã´0ñ<bÛfdÓ¤Mäõ“ÃWb1î‡ÁÄÄD�±yv0HÁØØX­tEÒ¿‚Á`ƒp„3Ãž——wTÍôL‚‘�úÐ=B<W1`±`ñŒ]]]e‚Vâp¹\§Œóœ‰HY`ä «ÍuJÓ‚Ž ªÚiÀbÁâñ¾233K³²²J©p"/‘ØªÇcŒ0ú(4†ÆÒ,É‡	©pÂ¿Ö|¶ë×=6j&ã¤ëWÒb"œræ˜ãþ7‘$)ÿãÆ«ü¬ò   fcTL   	       "         dè  @jh”  !fdAT   
xµ—kLUÇ¯¡TMxY	1Tñ‹Bá£Ðkb§,…ò)Ë¾Ú‚˜4Á mÅøA1_l‚|‘ð‰	�ÆGUD×6¤‘Ä/bYèºBKVvYfæú¿åŒ¬“}¤»ñ$¿œ;sæžsæÞ;÷Üa±
çüP' 6‹jD$ì×ß—e¹Ú&mÀ‚¡>‰ñ&p˜�ÒÙlŠ¢Ø…&X‡d.[¡OÄ“@cP 3H
N@#’@°ƒ3‰ ÉxÛë­Ó)Žž€x×
?}Öëõš ‹d<wîµŠ�
— ÙÐVî¼=¦¨¥£££°p°HFHÑââ¢I÷æû`ÏºEîv»Í€‘÷vß~iiÉ&|€èB®Q–yôc€A†“Â©– ìfÀjjj*=�Åív™EˆÕo¦Î€–cÇJ*…òŸÎ‚6ð´~&êLÈrtúŽŽŽžÒîONNVy	`ÂFsß<11Ñˆ[G¶¶¶"±Üë€­ú<qopû�ØôŸ—ÓyóhBBB‰d”*$Iª€S	É $Ô"�ÆŠòòò*ô1º\®m‡ŸNøì†¾€ë^Œf/Ú÷ý› d_{{g•ßÿ÷� zš››ŸzÛ\Nrµç:;;ŸCÐ7ÐÿMp^á¼ºo{gû­¡¡!«ˆÉ4¡‹ãÙÙÙeÓÓ3õú¼XÝ° "=çóùEß.¾úÐ~Ûá¸úzAAA¥ˆ¥O@H�€Qõ5¬~Ÿ/`;ENïJ’““œ��}ugg§ÏyÃÙe·Ûëht$ŠRîù 5bI@ôÑù(ORŒ�UÍÌæÆFSmmíIš×X%·»û¢Éï¼ŸaM|-ø¼žbœV>ij“�ÅÉ |Ž@�`CûZãd¾€¯AÖ@=`ñ È2ÞVã
à|LâZhì³†††Òuìhúà.ìpÂX<Ú¶}¾/às\ ªªÐ_â+¹400`Õïhz ^‰ê?Cÿ�ø¯_ÿíÚÛ‹�{@˜¾½q{´§§çtˆàú/"	c±„.ÁwWÕyè+àp¼y"ÚÞæ‡eNÕÄ› 6 ç¡œ«?r•_ßâz¼XÔb¤€Qì„)))(	uØ‹™™™éËËË#h_¿€ŸÀ4"_ƒ”ÿ”ã@@¦ X¼¶hg1_pT´›·GYŸ�U°ìóû>}ûûû[pºú
÷àg0¯rõ;šî½j(ŽN›››ÖÕÕÕ¦ÖÖÖjmû´X,Ïh£CT÷_°†avaî�hÿ1>>^#|ˆÒ<55u!\–Uõû¹¹¹žPÕPÒ­Ò# M;fi¬¬¬Ô&+ºó¾ ý%rz655õáKç[
W_Gµc”ßï\¿.pà({‡RºØððp†×ƒEçÂµü	L€‘Ï"Š‘¢�m333õô6,¸vRxëÖ­™½QPW bþ1Áœ5i�P3¬999'¨Ì†<–›	‚ívMÝ…U$ñ;`á`‘Œ½½½eHB¼¥­­­í%ªçLÝ(0$~~þLÃM•ó‡Ãñ.`á`�˜¯´´´ÒôôôR´¥àÃDps»\fÀôŒ”ŸŸ_�——WEs³d�ãÝÂ¡ÿ‚uËÚšË"Ú€Áý$jÇ%ûˆHUÎ¹ßÿ#úÿ‚˜ä� ¯ÈŒga   fcTL          "         dè  ­ü»}  ñfdAT   xÚµWmL›U®a3Á@†Ä„Ì_hþØ~Le5Y^VÊ‡ÐÊ`¥-]I˜Ö�U„ŒÌ�¿ÄÄè”+R‘ÄdaI3ƒÎ%hBÈæ’ÄJm–B	]û~øœrßíåZìöVOòäÜœÛsÎsÏ=ï½·½¢(ÊA “á`vý‰öOòvQ»`whÌÏ“ùæšÜô N Š›sK’Ô«’àæªDEt1_c.Î¨	X°--4öÀ¡DuºuˆÅã�\¢úG P¯&'Äã±NÝ|¾s­|"àÙ½ÐœÖF|>_«!©[ZZê–ìõÃý¶ÐD$uª‰Ö××{‹– ùRŒÇi¸3¢¨Ø Ÿgær“ÉÔBÁT˜O'³Ùl¯F"çúz¸‡ÆìËèÑ6'ùRšK$‡`³²¾2fúÔÒÎ ŠMÐe˜®§Tûìì,%#y03˜È@sêï&''OÁtŒb 1µ’ûùoÖEüçµºúÇñ¼¼¼“‚Yh�öS`neŒ„‰�I„†††úù�/ÓœÅø,¶ìóû‡Ú‰­ô�yôõõ½¤Ym5°—T«¿óz½/kÒ+!1´7‘LzGGGm”s ¡¢¢¢éêÕ¹.ž@|§óK²I	AóEx$$†î]9ŒFc3åâ	�<ÇÊk¦.¢ƒ··“.¶—úØr`jjª+™HxïÞ¹ãnnnncÕX®Œ’Nf:	”p1(æÊ‘ñVãË¾qïž££££…í«^©öx<í±XüÄ<ø�·Î–œu)ÓlLsÿÁmúº$) /à@†V1¼iØNnÛ)Y& ºr% ¥$ZõE,ê"i4$´”Ö©Tê¼Án·7Fq¢ñÉÃ8áh.WÃÃÃ›››cˆù.ðÃÛ±XlÔï÷¿ÆŸh<L@Ž’=~ÿ#úoÝúé4;Ûkuîý€x?_ÂafÏ�¼Œw* êÑ,ÿ¸‚ux W€��/ðLF‡û÷#žQš)gG€iàà3|]ŸBýš‡d»Œ$ €“°°°0}´¡ì/GËËËà=ðÆ_!Nz’ˆ°Š\žÚu'“¢k×cbq©›ÝçæåååºbJï¿õëðï�ë[[[#ä;00àŒF£Áö%Ud>Ç‰Dþ®Ëhpp°}ccÃµ¶¶æèïïoW�O§ÓI+ri%–¬]‘åŸ¡oM;6ùYV`ÿ¶ÐÄå	ÅÀÕlÆ›Â�Ç¯`¡�ééi_¦ÛPàºôPÌ?³VVV:ÈI~•ùOØV�Eöêùã�›Š¬ÌcµEEEOS,.¶°×mx8®}Fñ}a6›Ùj•¿€0ˆ¬AÿF¶ñññ~Y–Q‰Øn ß¨Õa1ë(Ë•]ØûÐ­bnn®‹VÃ*�& YYf.µx VAþzÆ W’É¤C]9îWee¥E½ša‹¶*�«Õz¤°=ÔhHùšncccM Aåw£›­éûœ	’D€4èß5n‡C¡Ð%$`¿1???dÈAN7–––6²ÆÉ@@’~‘å�
à`Yâ5BMMMÛ¡ªªV¶çº…š¥�À7ÎÌÌÌ*s7•’nƒÁ¡=ü6ÎIö²Ür¦,~ÿƒðÿtÊßôI}U¢/Þõ   fcTL          "         dè  @6É  éfdAT   xÚµ—[L\EÇ×€.‘&ÄÄ´$FHAžàIiLJ·¦XËE(²Ü—S*¦˜J¥K5RLx i·ÄÚ„„”¤A}càÁˆè‹RKw]°²»gÏ9ãÿÛÎÔÃ°¸éÙø%¿ÌðÍ|—ýævpØÆØ~PÇÙßÂ~ ‡Á#²^×õzèOÔ—ÇÉ†lž< ”ÆN†ñªHB;¨3]å¶¹‰$Ð$pg)Ö¬Xô) E$ˆê4ÛNàîÖV�èHÜ0G'¶¶îÖÙN ³óÍJ9xb¯hÌª£:;;+	Hñüü|³Á°Öÿ®÷qðû­"�Ïçó�ŽÆ¬	�-ùx�×¤ë¬íÓ\ý¤Óé¬ g"ŒGƒÕÔÔ¼ì÷û[}¾5õùÉðX7'Ù’…BÙÐ� +ÖQ‹ßG×ËÐfb¸Èëõº…~||œ‚‘.Ž“4&æ�ŒŒ¸¡:D>ÀqéÔ´RLùÌª4(¯••Û‡“’’J—R©(
­§ÂÍ2yNÞ'QJJJ*hÙ�­ì3Úêº*ß-ÉgÏž«
…¶iò.ÚÛÛŸµüÚ|°—ä‹ymmmÏ‰ V‚š¦vuuUSÌ	€’œœœ²‰‰¯êe£­{;?ƒO2ùD7'(Å’ 9ÀËë¢ÎaƒšÊ×NXö‘­ª¿ÀùäÕQx¬˜ò( ¥À%°™@†äƒ|RŒ˜¯š\®Í��–ÚÚÚ
¾®v%Ÿ|lll¶È›ûþ+J�]»ˆIŽ…|XÃ?£¾ ÞÔ‚�bP{ >Ñ4Mk†¯×c›���/p£ÉÁ×pÃÑX¢	¨ªZ¾¾¾ÞŸo€SÜ¢¯y<ž2ùF“q‚%¾ÿLy™……_øÝ^dsí
ÖÿÌâââ©ªªª1‚gÊF)à^¿]O°�ž½ Ç`ì]´ï€r�Ó f¹:Ó-RÂ	ä€�À¨B/x�!´]hiNÜÇÈ ^Üfiiitµ¾^ ÒÆ)û3 /55ußÔÔÔ[8v}ð÷!3ØûÐŸ=àxtÇs¬iººãcbn¾™¿ç®p8|…1ó/ÓdwàìÒ$Ð�;ä*ÚOT²ÅIr///÷ˆj€†é	Iîîî®ÞÜÜTWWW[:::ªÅõ966Ö€É~p‡™ìO´¿ñ`¥`|	ŠïéÌëHðþ¾>éëë;J>ð4»úûû[�Àù`8|a``Àë5T¤]z(==ýq8š>p,ãb™Œ3Íi“™?B‡–Ý Ýööö%ü}\EÉ‡QþòA¾$ßÊ^¯á1pX|FñËÖÀ*¸588xš�ý~@"3h£IõööªHf”Wá
ø<OcÜg1Åà±âJ¾@¥TúeÜh7è×ð
ÌC÷=öÅúSÜ¤hiiéc^…$r{â¢Ã®Àñ-^ú”ûw·ÛÝ(žfè~¢ø‰2p‰½¢ëÆÐ}¼†¡ÙN`vvö"œüa¢ôÓÓÓôK
-;~Î4Íhh¿±˜ŒŽŽ¾Í˜qðb·;�cyyyUt*ëÇ„‰|‹àß¡238¦7¥�%;;»"++«œ¯¹m9 JyãŸ‰D"“¡�öõÐÐÐé=ìÞOH’‰8¯œ3ŽÝÿ òÿ6å€‚ž½ÈD�   fcTL          "         dè  ­ î  ùfdAT   xÚµWmL[UÆ€&&"0(èK¶@b2ý£°¶š,·Ãòé�ñ±AË E0„éD21+#b¢PâÔ…t&™“DˆÁhâC§bÂ	ÒÚni¶À.mï‡ÏKÏÁë�ÂvOòäÞ¾ç¼ïóÜ÷¼ç¾·If‡®ë9@-CÎîæ‰îîíŠ¢ÔÁÞL {qž|È7Qò½@à ösÍªªžà"„¹=Š®8™ïÞDã,XªQ€{*ÐÈ";ÇM¸¹ºZ+¼99auõf­i'+D"àáxhÎh#‰”Á�ùùùãªŽ½þw¿í4Þpp¢@ ÐÄØ�È—bÜMÁS½×'˜ù«ÕZNÁ¸ Ìo�UWWWƒAG ào¢{v2šŒÅI¾ƒæÖ××-°!âÚî¨m8oBQJqÍÄtáðððQn«dnÏ%V2Ð_çõz�ÂTD1 »pjÄ)žY'MŠÇkyÙWœœœ|X*‘*$I¢ý”˜[&ae÷4$›ÍVNëÈ‡|Å˜tÅÃ9ÅwKÊ©S§«Ö××hñ¸ÝîgO[ Ä|�Ëåz–“!G"Î®®®‰ó? [^^^éÄÄ7u¢Ój¬ò3v|�x"_OÔq‰hä²ô–P
EËrÄÉöAïz<H¾YvþŽXlûJGn<§û�}ÀaZÌaR@†ƒb>EÛv51]·B¡Æšššr¶¯fGÅ…n5ŠÅ½ÙEéfK•|QÂÝ1ŒÄ¢ˆ$9"7pƒÔ@]¢”H¤^$æˆD¿¡¡á…x£‰“~¼áh.Q#¸]|¿ßQ__oßh"¬	òßQüLqÑÐÐPW8¾¦išjÏ÷˜ÜÿBêìŠä™¢ƒ¸¤éÚu\ƒ@@Óua5Až�bváÚkf@ì[!5žÃ«À
‘C„Ÿý^ŠF£f<
¼¸�VhNPF�Ý-ÝðÀOÄº¦sâeMÓÿ\ZZº˜��ý~ûwÚšKKKË¥óÿ
Ð†lÄ„è*e„7£MÇt�-ëšæÃý_À’|ûö•þþþ“´_èåïÃöÄý‚§èÝA@Ðt¯¬¬”’/ºcÕââb‹!.:’âsÊÌÌÌ»(º?�îÙÉÉÉ³h§¯Ï‘‘‘#DÌBàOº®}#‹>‡§º ûÀÓdÃïsîÁï3ÀéöööýüµÞÙÙù’Ïçk][[suwwWo×%¡J‹ÒÓÓik.£çp½LË²|‘‘}†:ùñÂþÙ®‡Boàþð6Ð4RŠ%Ä–âuÃC@1ÿŒRt½N�‘ÿÌ ?ôõõµ²t|!$àc²µµµÕFUõ–…·€7�'iŽÅ<@Œk÷�ºøû>‹ ?b{¦‘Âóìi’`¿LTd ">a.…sss¯©,r†ö>Éì éU–ú«H÷÷eee›ß°}	Œ ^€È(**ª
‡£$à,„õªjôuÓ¦¦¦z@<�`WÆÇÇ{X?ç	¹! Oú©Ámßà‡ƒ¨rÕ… ¼Ujh‡,KE~~~%Žñc"Œb¤¨ºêEe
5RNNNiVV–�í¹é‘Øbá¸ÃrøÈ?òx<Íqü$vŸÐH!ìÒå¬qýþ·!þ/09þFú„¼½+ÏŠ   fcTL          "         dè  A¡­þ  fdAT   xÚµ—[LUÆ×€&&H°!…„X			}¨
/í®I3”»¥„;e*[Úº$²"VR7¡Q‹ICŒ$F	Š©å"*hÒô…>˜z¥ài‚´XuÃv�e˜3ã÷ßžÑñ„•²OòË™=gþçûÎ}ÖiÒ4m/¨æìÝ6À„Ðƒà!±\Q””7ô,ÖSÅšÏ�À2„º&ÆX³nB¨ËP4ÅÁc3Í¨×xc1FFå1à¸n£Ó±�•@ Z²Þ‡«.N+Õp¹N—‰Bà±p¨ÎXF\.W™ÅD:455ÕÀ4Ìõ?ó]D^ïv]hyy¹‘(2 Xjc'®^Q´
ä�óâd›ÍVJ�éP«¨¨xÆëõÚ——é™ïŒFãâ¤Xjƒê‚Áà>”#ÒÚj«…‚ÿFQŠ‘'¢:·¿¿¿J/#1JOƒŽ�
¨No`` 
EyÔ(v��4Å=ë Jq{ÝºõÛÁ¨¨¨#R�T&IÍ§ÄÃ¹	¦$åçç—Ò{C±b›”£sñl‰v»_<®†^q:�Oz›Â¥,ý½–––§tQ#ë²ìhoo/'Í ùéééÅŸ×ˆA�{+?�³]J ÄAL|:QK¤% ”$rOCø-Vðúºìàs‰FwœvQ¬¼¾î˜A[|ú
¸FJ¸ ‡A8
t"4� ´Amî'q”ƒ›àOŽ�Pûuddä,Ÿ×HSVeee©Ïç?..ný%¿ ¯ª©¿S�ë¨7-&	…EUÓ~ÖTm	?–T qTBÕ~4k@‘åZQXG–åËððð¨ü	w4U½ƒü6Fã6Êf†††ÜfÔÕÕÒ‰)Š/..Úkkk‹ÄMÄfRÿ¾ÚO_êííu­­­]ÁLÃmx ÂùÏ¥ûazzºŽoCQ<QHoƒÀ÷€|òv,.D,”[AL¸€f.6n¨÷ž¿×777swj`uuu	‹«ŸFdcc#S�SØ7È†þä_ÂÄ³³³o&''ïÂï`ÿvÓ�ú=Dlll�„[ï á2Â�GTU¥Þ’ðW0pÝï÷�tuu� ùº»z÷e”�Ãà(òÖÿ·R=xv~~ÞJ±ôM@&F²";Ä/æè+W¯z0<×‚Á�ÏFGG;q�†ŽÏ¾¾¾bcà2x‡‹å x	dð²3èíMc'ñ|Ân·?¡ë§œÎò………FtÌÑÑÑ±åm(	«4/..îQ4ôøƒüÿ.ö*ÓØÈÏƒç©lii‰zøhÅ¢s"/Aq<ÈÚ–ÂÝ†‡ÁA�ÌE
Á'`Çò‡Èßs»Ýõ¼®ôpç¨çþQ¦im4
(;	ZÀ>ªãm"®µ}B/ÞE�Ë½Ÿ››;Ï{c�°Æ`€±WxHîääd3…SŒa*¥ÊiRUôZý%4ÖoµZ�éW3Ê.‚|t	ÙÙÙ%Á LN£­ŒÉMw)ªr	½ppÐÅïs�‹ d ¹Ç–ãñxjhdÆZ»»»Mý/8œššZ’––VJÇø1±¼ñ×É€Ïç;+|ÔHIIIEñ»wRf¤€|B\8��� Ûç[9×ÖÖV&NâÏ¦R4±Í-g÷¿%ñA„é/‘õƒX¯üV´   fcTL          "         dè  ¬7~  fdAT   xÚµ—[L\EÆi &FnÙ(X|±\"‰¦ò`¤>´¬ÚX  é²Pv·ê .¡4¼UÐT,¦Š†ÂÕx#�¤„�1bB¤©¾	Ô,ìÂ®�……³çâ÷_çÐãØz6NòËfvæûfæ?âŒ&UU� +ãÈþ-Œñå’$Õ¡üAß|=µ¡¶±Šç;p€<®îœ,Ëoh&¸º<I•œ¬m~,4ÖY¢Þ€]y"hÔbvÎ6°Z9¡â(ÖÄ‰`pÃjØ€ÛÝZÅ�Ç¢ :}p»ÝU±„ÁÉùùù³²Šµ¾·ÞåTáó­;4!¯×kgÊõ¨-õqÐõnËŠªÞAîbÅYf³¹’:ÓH’«©©yÕçó9¼Þ;}³�a×'µ¥>¨nggç(ÊN³¸ÊçÅSÀª¢ø�¯�u|ßDnBuÑðððmT$Fé%`a˜©€ê´ß�ŽŽžAÑqê”s»Æë<JÀ
fÀ‹F”uä~qWŽ��/,B• ´žkfb&Ìì›’PRRRI¿£6wïzNèãa/—$'¶$ÌÌÜèUTeˆ¯"÷²ÙðOOOÛu£- ÑR�ö;—Ëõ‚&ª'$ŠÎŽŽŽjÒü‡PRWW×à÷û¯³Ùð(ñ�WPŸÆØ/¥üŽ ¦&§l999¤Å ”`éïïoÛÞÞþIQÔß=Ï—IIIévP:Å�
9oc7°å³0�ìh�Ç@)°èH3` �ë£<Gü(?ƒ;ˆü_‘¿ÉáðÜØØØE¶®FSAmmme °ÙÈßÚ-J~DäÿB¨ ,0n#gâbL$¤æMÄIŠôƒª¨·˜¸…Â9ÄÀw±�DÑÆkˆ¢X744t>�‚›X‚ˆþbXœl�Õ@}}}�˜¼øÊÊŠÃf³•ó'�9FýõoâÔÝÝí
6F°t&\ ‡®Ýõlòâ&¾Áà=,ÁòI0®�gXœ?ˆäH^£5¨ß‚ëª²'üøÁòÌƒØÚÚzœ„ùè§ÙÝÝÍçÅ“HœqMQ”qä_�Ïçææ.eee¥ãûi�í;r�œœœF'áýw wá�G%2Z+_Ó¨×ÖÖ>innn õòÿé§>EGW1‚×þkÍ5‘ÅÅÅbjKoz˜èˆ’èä_Ì	ãããí¨ƒŸ´â:�Ÿ===/“8ø�’+È/1±£à-`…BOFÊ¸‰Ãáx^;Ö[ššª———í›››ÎÎÎÎûÞ†¥ÇSRRè�Ð	>½à²oÝçfšñTkCpµà	Þ@eKKK¯ß[s/b•n¾Tê‹ë[ˆvž'@yô�1ª�¿k·Ûk¨ÂøÛ­ªr‹ö„³X,ò¿×ü)íyN2híŸHätp\Áh/ÏÎÎºÙhP'_€¸[Æ@°‰5)šœœ´q‘Ãu/x?,‡»
«´«eíàm°7T—››[
‰NÍî‚FÃFFF!Ü#ãpêëë³Ó}®3rÄ f¡I×ìXûÅöÓ²,"Ú%gWWâÀx:e2™*233©Aÿ˜ØÎÓÈ0°ººú&÷¨222ÊRSSËØšNÙ „àÇétÖà¬€øšËjµVGi'°ï˜R±Ï-gŽÚîKüÿÓ_]„¥Bo¦   fcTL          !         dè  P€f  fdAT   x¥×{H[×ðSL+Bu¶Ù(Ê�vÌ¿º¶éuWC,ÕŸ�XãmºèÔMVê„=|àª›ì�ì·1Ü(aÝÛD� Lè(Ý£+B…!H}¤fŠØ–F“pï=ûžô\w{H.19ðñïã¼ï9'$Õ@)-€EQyš¤"™‡�C@ªªžCìai ‚°?Ý
tÀàMážG@ŽƒLEFüT:øVá6�ŸL¢ÁÍz‡AúLÊÀø^G¼L© "ý}xI¿Æ*p÷þý ‰³›³³³}Èè–Fé
ëMÓþAüŠI¯wuuUI„˜Ý´X,åÛÛÛWbó@ÓÚƒ^¸dssCÖY__o‚t•ÞrÏÍÍ5BÊ“ý¬šá*Ì@=ìÃå£CCCl".Â²a.�ÚÚÚSr…³4`Èh‹±õV«ÕÉòàù£
­…3Æ‰iœ8Wá7ø-ýñðÞ-]ZYº¤Qíza…~áe°qV SSS§ôðù|õ¸T†ÿó¡Jï•qìëØo¬@üÌ»÷W¸Â�p8üqff¦m||¼kll¬+##C‚�Ï+aåi¤ŠŠ
§$IÕx¦ruuõ¤JUa®€¢œE|`·¿ßÿfú,ï‰kzo Õ7&''ë­-�D¡D®µ£õy±`&
{.\è9ÍÊ$†`�
»Ý^>ÇƒWxE~�ß¡÷sæ�?gü"ôî÷ÏÌ49XYbX(	lƒýƒÞ;wï\V4í§………O²³³� Ù„#l„B!ÏÍ¹›ÍlhxïH¼¬¸!N@%Øtæ-7í	›A%<YâçW
_a‘a³žù&%z“®��kª¡¤®®Î¹µµå‡ €`–~�Ä7˜€ß"Ö}ÇM ISƒ±`#¶•üùÿøbT¨•PÔO�¤#ªD]z�¢èÎN#qïììü¾„	…O`òŒcl’—ËUe\¶uÁÛA¹©©É.®h"+¤’Ê?_|¨½½Ýµ¶¶Ö‹š~5°H
JÙþ0??ïb«cœÂóÅ/"dÁ0|„xá‰½.lÍ*à¬ H^TUzñ0fl¬`•Ò\c=ñ8�½Àz,Î§Jâãb²à"7ø"ú¿7==íe+!Ò…p4©–CNNÎaß%_}¼Ù¯Pa3‚L•
Ðï/..¾åt:kØxƒÁJv(E¥:¿`6æz‹±–³wÙ™€L® }x;F°ŒŽŽ¶D"‘wq²y»·w 	Ûilùììì,c…C´�
Ð’F}Enã˜Ë²ü¬¾¬·µµ�ÆFç¾w/t¶§'þn(	³´¡�:dØ	¯ƒwee¥vW8ŠÖò4Y,ÿÏpö@òÈ…2!o)Ñnø*œÔ�Q‘}™¼íÈ”µþ5‡Ãæ b<ápÄf³9Ø5aòÂó,çe&NTw»Þ‹C‹‹·&î©¡Ô?ão®×¦ü» -ðò®oÅÑì\qqq•¾5»š§	»Çž	…Cÿ­÷Ñ¨H"ÄìæððÕªmEÚÛÝÝ]Ã÷s’¨„ÝçÏ×àOúûû@!¦71^¹¹¹ö¼¼<;Ò’ñ0ÁŽä¬åúÆ„áÏHìö.ó”C!T0âÄ‰ý.ØÜ”×¿8ã{O§,œÙ.g5}Ï$ü»M¬[6¨9ç   tEXtSoftware Japng r119'è³a    IEND®B`‚‰PNG

   IHDR         µú7ê  ZIDATMÁÁJÂ  àv	ôÐ­‹—JvržºöºvèA*pàˆêîeBšE$‚�0˜:¡°AAbnu°‚Öö§6Gß§Fƒ=öhPcÿQ¢êÛì¹7Ýóî¹{ÃžoS¥„?”Xd÷õjcËH �å­õ×+vyD	c^†Ïwz4…¦¢ÑÔ�Îg/€q>9åYFxÊ3Œ	³²Sæ#áfù°·
ý‹þþ{«|p³T¿D0•„‚©ÈÀTáÝ¾"Äcž d—¼[ø–�Gˆm¶z+|×ñ~éV¢E!÷ú½Œö.›T`�u¨°y¿uÅ7†yŠ˜p
N‡yßPW€™æ6MnQÄX
F(r“fs3 brG§É.!À$÷ivô˜Œ	aNidý[¬0Ç+lùµ†6§@@@ÀüZÚÒ>KþõOåãÈÒÖÒX€€‘_ƒÇÃT,v+    IEND®B`‚‰PNG

   IHDR           Ùs²  lIDATx•”_hSgÆ3/0w·mè…¤�Ûº+W/‚^XÄ‡Sq¼“ÞˆÌÄ![iz±‰ôNqkéÜp[KglÓ4G›4-fÆ61™[g(–Œ5Jrž½fz¾¦°÷w8|yþ¼çB°Ù°‰~ör”).)9è:ºäaÿ`žIõOZ,Ë§¼¨Aq·\àä—*,ÑÍ‘¥’p6ZÐl>”À‹µøâíPÏÝî»Ý¡žÅÛkqÑ,–%Õ¼Ù‚6ó7±²éÁ/Nc¼Ø…·„]rÚ×}:=È,•ÿB’möÍf’9EaêâI´¢	¶¥õâÉÂ”•’tsý§ù€YEv¨e?Üh4î–ýÙ!+)çj—EÊ0ó|hç^8°Õ8vî}>¤²ÌÖ.×Pƒ\ô˜¦™.„ZÛ±­>Íƒœ¯Á¶ÖöBHå¥å!@¬÷q‰Kæâ•cö§×â*X‹×PWŽ™‹ª³Xè6S|ÆgK·ôï^~¬œb´ˆ�À½tK9Òt£ò!SŠëþë°óí§%£¹ñÉØùNZŠŠ… ŸòéZMÐçMtà}¹ëÓ´V½B ÿüÂ$“™�þ'ª÷÷*ŸðIâR:fNø‘ÐI\R½uæ¸0n:L*OîÐ™?§<sfŒ	&RgSÐÇ:©³Ê1c¨L©KîB:âX@'wA9•0^ÝaŒ±•þèˆc�•~å¼ú	é g9[ž(CGè”'”“büc>fù®ÝïHCœ±S8á©NÓ QaGtØ)•^�>á¶'ûféÓ‚QM÷ñ±Ò“ýØ ë@5Ì#ÕŸéÜÌ¯ôüyÔC§$U>Üu �Ë5s�ÓB´äÄkÐŽ„÷P7’ècTåg®Ák|ÞÕa†ƒ�o¡ã”„¡²«Ã>¯>)p|t¸4ÊI!Ê;l#Ð&nTåJ£§oüûq}v´t�…0ãü†oÛË¢|Í˜¸’)Ýû¼.ØfÇñ#«ƒQ1Ã9Žñ+ža§pFNc¢ÌXîêàñ#Ø}àÚÝ¹jNð“ŒÐà#Á�Ó¤¥š‘«»;àBƒq ¥Ó¿Ð[½Ï_uª÷z;ýh‘Ô–ãÂï¡�ó‰ž—7Ë#æ¸9^yy3Ñ3pÞ{{ôgÿWS7‰iÆ§    IEND®B`‚‰PNG

   IHDR         µú7ê   zIDATx½Ð1
Â@…áw¥xB ‚�6),l‘@,RX[ëÞàw
…aÙµß7å_�þ2Ž<
NHè9rÏ‹c”ì*ívJÇÁÈÞÀÍ¥ gãj6ú\Ð±²¼­tiÐ2œ™Ö�K"Ð|‚š‰sÆD�Ä·?TúÁ^	Ó}Ø}    IEND®B`‚‰PNG

   IHDR           Ùs²   ÑIDATxíÌQJÃ0€ñÿIvw‚Ý¥Ù²-ÞO_ED\Y)eÅ1ÆQö¼Âg ˆc´iD|è÷{ÿdè¿ÄŸ	®Dp8ò‘àø3xOô=°7¼Å³·V¬ˆuäB&	Æòqéˆ�àcxuLêÀpàÅ9`RKöÔö,cvT'v,bs¶”g¶ÌCšš¢E�h6ä6è¾ÁŒŠg�Š™o0¥ä©GÉ´k (xP ÚŠ5�Ö¨óAFÎ}„œìt�±â.ÒªY4—‘LŒäwúÙé< "|M    IEND®B`‚‰PNG

   IHDR         µú7ê   ôIDATxmÊ¿JA…ñ#"XÚR‹•`a'>€�µ0µ`çkˆo��ÚJ!å¨(bQ\#qcˆÄ XØ7Â&Üãe¢0ëdËÃ=(~<â1á‹>¸ª‚�å¡ö]Azì…wâø4qðªŠ]ä’?HT¡r#/È/>+¿Ó|”'ÐU^¿ÊìæÍàk\!ØV5×7jGu¶óHÙ;rÏy¶TÇuì�­Ac T�ÜòndÙe§€¹«]FúŒB©M�¥…Ï}^OÒ¯÷ý§6×†g¼Å;1+Ìîmóâ¿ok–`œR9©È9†'Iec3À	_#¾L³[    IEND®B`‚‰PNG

   IHDR           Ùs²  IDATx•Ò?haÇñŸ[«Y$
Ö¹‚³K
âà PÐÝºŠˆ ˆPt1£ V¨ƒC%.�Jµ`[Qijkš�¤õOŒ�%RMÁü¹ûùÞÝCËIîíÝûyßåÞÝá3ÊáÔ02Üä¦‘1à†Šà7Ee�ÓÊàî"L+»7„jsÑº‹¹hÂM�›‘²>1Rö~{™]»ß  4­_�šÖ/ø&4­_ðUèú0qŒáî>M·[�éÌtÐ�7®Ð³sv}é~ƒ5¡évÒ*#Ýõ¯Ì¬ ½z?sVµ–[hA�3ôèòI§š‰&šPãÆ´ =ºqª>_G`/óÏq/a[¼·ÝßiŽnÝrª1×@è\ás\çk%”¤XgVÊ-ËœSÕé*ªÀÖC®ØV;/ØK¨r|âŠ^-^CH\ç²HwHûP‰UPŽ‡Å¸$R</åCeÊ^€=#gÛL8Ì%)Ê“e”aÍ¾Ék\®ô¤„`ÿÉŒñCP¥qY`9}ªçû`

(@�=·‡Í¾"Í#äÌÜáÛ â—âˆC�ÀÁpñ)üúõ‡‚šÏü}Éy&F&`Q³½ãW9çGâ>úÑõúå=svv´ïDjþ3ðüfeªýªÛ§í™ßÏÑá8†íó¬¹|îúá    IEND®B`‚‰PNG

   IHDR         µú7ê   vIDATx½Š1!DçJr+Ö$?Ù„+PhcaaGøW‰[ü�…nã¼éÞÃ_F¡.ýN3?G4Ãa_O6¾Gt3ýKšðe41mIâs§%ÓCR#K�¦�I¨Áô4™hz>Ü	zcž£^�þ®NØÁÍ£¦’¹°‘    IEND®B`‚‰PNG

   IHDR           Ùs²   ÛIDATxí”KJÆ0FïZº]�+ëÚÒ–>àcŠƒ¶I"¨ ""
uâ>¥­ÚWDüß�;;‡ŒB»ý—ÁÇ«>DÃñt�g;tM}™§j<™£~èœ¨ðh†ªXŸ&J<l£JÖg²Àý:²`}9‘ãn™³¾žÈp;�Ì6uNˆ7SDj¦s"ÁÕwDb¬s¢‹q9ÒÅv:¿"Â#"k�mÝ†n:'‚6pÖ9ñÎÇ¸vàäó?@ƒsš1pæÈGàå§öôG=õDÃÙ£öi·ßÙþ†_%>§Å    IEND®B`‚‰PNG

   IHDR         µú7ê  /IDAT}Á1K †áÄEhˆ¢%ÚZ‚
Á¡"7[ê4EãùG·]
‚¦‚¢šŒB±ˆ¢ÃH80Då<¢Ú:º74-	ìy$#¦ÿÐÄ‘’$O‹y’õ›-¯F‹&66MZ^�5õQ§N“†s”1¦cÓ±ŒáÑÀaUß¨R¥z•ÖŒFå“O£š¹JSõ*Œ©ƒ
*Ôq8Vß¤}È“›PÇóÖÛ©~ì­cµsêšSTQEÕ¼~lNPþ|ÔpÅÜ[÷¾€ùv¢‚$Hë�öwfJ—ãÞ5&†`pÿ‘ß˜U—× ˆI–DÈbRÜ5äWOh;îžsC‰2eJÜ¸çÛq…4 ´¸RH½xnîe¿�Z\QHø5¥°–µ¤°¦äWÏl¼·Wž O    IEND®B`‚‰PNG

   IHDR           Ùs²  ¢IDATxµÏ_HsuðÇ•Ø„hIvc7¡A‚éEx!%ôOÂ¨]”0/ì.¼” êF1É‹èV"†[IÆ4	§˜‰sÕ¬teåæß\nPÌÁËØ™çy¿?Ïu;Ówð¾ßÏü�ßsÎ3Ä}~ËÿÄ<Q>ãO‚ÿˆaª`?ä,·™ÛÈÓsr[²àÈa£›a&ù/�¥Ôp,OI¹uKjYphzZ~ç;žÈ'‡ÅäöDÒ«‚Ó‰82ÎÖ$�³£¸`¿�‹û§ßè©í|êÅ¾·¦ã~=ffú!;
ö®Ûûê�4¢�À†‡P-§ÆW^‹û/r}‡×â—ôØÒš`GáT¡)8¢Ç»ùyÚ®Ä.-Ã…Rã
›ïíòÍ«_±ÏcÓ7D!¸ö|Æ{¹UV\üei‡(6Ð©ÿn¤Z›Ð·K@1Øw¿0ÒôGi¤�´HøG±Ôl
V‚ïyæë2@F ž…å|ö£Jn=‡dËåy”›Šþ«ÐË6WÅß”³�3œA¶\w\üEÉ®d‘…l¹þ�%ùeIÈ–+ý)V¢ÃQD!k �/ðsÖ·x\ÿ‰?*¾W}ðAVáËr‹‘ÜD·˜`XIÏ98 «üù¶\†D„ây#¤Ì¼7EV©y"éçš¢ßTá‘tMIúkêk Èú»´E®žÛà'tÿïüX’UE[ìïê‡AÖ û¸'¿ÌÎ…á_b=õr“�ÃFš_÷À‹qŽöi\1­KÉ&·Ä¦œÖ/îµ…Ñ>8Qbœîî”—ß—–òº»áÄc¯nñœNs¹Øé´w ºvÜ:u•­ô††“Ù@>˜f‰ÉÐÐû½•­¨Ã=�O¢íx^´£YžÃƒ™»ôùS
Áß;    IEND®B`‚‰PNG

   IHDR         µú7ê  .IDATuÁ1K †áÂEhî Z¢Í%¨\ŒÜlñ4Eãõ
G›tm(šj¤E)‹ :Œ„C4î!¨F!éÞ¸²’Àç‘Æ"MZ0ÈR¥G�*Y	_?Èzx¸¸xô‚»¸¸úFŸ'¿X°âéxº`ùEžðèÒU#hÑ¾ÊkN1MhB1Í]åiÓ¦­Ð`›G÷T3âŸ.-Z´ê—qŽÖôë­„ƒƒƒó|®ÐÇÍ�iýYPJ)¥”Ò¢B6÷õI�÷VÂî'5ž½Ãmÿ@ÿ�gC¡õù÷*wX�…\_NéKäÐ¢ŽÍ	¢DI°‡MýÐRDCæþæ Âš4ip3¨ìoÊÔ3¹ZË½žƒòËq-—\•©"šÕ’V´¬%Í*¢¡OÂC·E7¥ä    IEND®B`‚‰PNG

   IHDR           Ùs²  ‘IDATxÅÓAHÓað×•Ô¤HDÒ/Ö!4CÐ<„A¡$!£vQ˜;;JžT“<„W¡6²‚YN1çªY©¥æþj¦ËƒÙE¶õz_œ†û–-ˆÞ||ß÷ì{Ø£ÿ2xŽïl"¨¤á<Z0€9øÙœ|*ã[Šñc�ùÕ&XàA ß°Žµ˜u>øÖÂ)±¯1Š‚¼À?YUXÃ§e8cÜ$T@ãÞ/ÉqºÁb§½ú*_®Ý§9úš¯ÖåTž®j¼Þ×¬9tVÄ @_ÄòŽåGõuTH9t˜Lt€2xWXsYsH/¾ÀÄ4hºo¤�ŠÈL{ç¹Úu´8q×ø¹OŒ´Q>%›|W|qŒ‚´ð8>‹å‡ªçxŠõ˜þ”Á(—aXÐ?Ú*m”HR£ Ô‚9±ô€Ì¤Î”Œ‚�ñI¸n¸H%èä4Ap HA"YÂ“˜=g{H…Š©BáíŽþÓÂzÔJ©"Y~Náƒ˜=2K©"Y¶ÇðN„N…(U$KÀ¯Ø¼²I©"YfÚðV„îýå7è«Ák¡¿AhÇqU0íž	,33ôîÓ>ºáÅ\¸dˆ'7áZAÉqê…›yæëçIÈÂ²O˜úï*¬œNˆ€#;/›É"šª#Ã˜Â]ä+~ûNÆEd¸©º‰v�±1wY££x%à��¸ˆ<dy¼ëäÇž�4:ÚeUÿé²:#C‹™ä’iÌ°iÞMîÞG†:)‹’L–¥6hÇËä‚vK­<O>æŒ»m«£‰¶úí¶Œ2Ó¾“›^z»ÁÝêïÝvF]Q×¶Óßën½Õ�^J¹ôÇ“I'©˜Êé+§b>£3¿ ÞÜÓïáßàÔ    IEND®B`‚‰PNG

   IHDR         óÿa   ¡IDAT8Ëí�±
B1EOlëè¤_£“ÿù¾à}˜ŠtIã`ªµúg½PB87¹¤ð×Cf&f&ßr1³�DdéÆÐ‹ˆ¬œï�Rç#p�ùœªÁkË¯À¹6PUê	ÒÔOÀ¢7S ëxëŸ\ žlÍP`õ„Ô'¨ê<„P¼� ª)„pÿƒa¶¥”6a=Žã,çüÜøÊ7=ÿuÝ (…Xë&l~`    IEND®B`‚‰PNG

   IHDR           szzô  IDATXÃíSÁm!œ�øù‘6œ¿ûH3.Á¥ƒ+ D:Å)á�ßL>œ´YïV¤|ÂH§±3,3 LLLLüwÉ�:> x‘W]@òÀiP/â¿è=pÿ§:€€£#z¬k=°Á§šÕt{Wž0Œˆ=	‚š}CÍùÑDRÒðÖhÆ?:„ë@Dæ€ýQMi“"Ë@÷­ˆÐh ÔNÆbv6(&K½.Ä‹*XìÝ>à�Ëôèå;b5î £;€ÎÉè<;O±åàÏF :1ð�h¼ƒò©n°‹}:W È9³Ö“kQßWÀgÎÙ>W`Z–å¬Š³#pð¼®+¶mëåý[þÄÄÄÄßãµQ“î¦PÊ    IEND®B`‚‰PNG

   IHDR         óÿa   «IDAT8ËÅ’M
B!FÏÍˆ9hÚC+~WÔ"‚”  «M| rm’ âçÇñþ	Æ*¥<€{½J=½ˆzïÖ¨ª:çö-SU³å5Ë²œbŒ›VóÞ› +|™y“/Æ°FPª¯ˆÈq(àÄ¾ˆÃ5 rýyÝ :Pà½†^Ï<È†ÆÌìzmB¸¤”þ;WÀõ™‰Èy´ˆO ušŸí‚6müi†Úøà•P1(ö�ú    IEND®B`‚‰PNG

   IHDR           szzô  $IDATXÃíWÁmÃ0¼úvßù7Ý¢+d‡¬�QºB·(ºAc÷Ùg ý+æã!¢­(†™ Ï¢�<™&"0ÉuŽß“!¦¨uÈ•ðCi ¡O&‘U'fnÐU®£sîÐƒµžï‡Ë{ÿSüº®Û9çžs|›¦ñxØ­}àÀë=Ç±¾I¾—pˆPOÇ9?É—Kô�T#
5‘÷¯€PsZ1T½¥Ö,ˆõ|YJC+ Iì³æ7K¬´^BÃØè•¹%¹:³õ€÷þ72ÿµ> ¡÷-{mÛîzàîõÀ€·‰8c6|‘Ü–¦áÀ1³ómjÍ‚Å6÷ÇD&ÊÀKÐí¸È	Y ü'Þ®Ú4L‰­ŒM€J‰RQâ4»'k;‚1"¹Í©    IEND®B`‚‰PNG

   IHDR         óÿa   ðIDAT8Ë­’QJ1†¿Ø¢‚vAo ÞÁ÷eNä!v†Lãƒí�-Û„ÍK›~iÒæ� ˜Ù8ðgR×$"ÏŽÏœÛNDž"€ªjáÑASÕÒU-!„[U äœßçy¾ó)¥5AÎùmÈÍL˜™É—ºÙ­‚Õ>˜ˆ¼8•¿Æêœ\“Ö&ºb'`ñÅ�ÝÚ ÔCsÔ](�¿òèœŸöôº–.¸8Ö’ž%(—*¸ýøuî/é¼Å#À4MŸË²çà*¿Õ|¡ÿ£ˆ|lñÖÄïNç~<oJ¥^uðš
-Fÿ+céF]~>I 1éŠoê    IEND®B`‚‰PNG

   IHDR           szzô  ±IDATXÃíWANÃ@ô œË™{ó¿à	ð†òø	_è/€´YŽ«ì�5—´lŒíÝ¤ „TKQ’•íÌ:¶Ç„™ßi‚ ¸ÈßçÚ7¹q?èŠw6|2Í�@>ÆÊ]~  i'73Z?Û?ô}¿@°¸ïŸWŒq#=+ö90ÎýÆ·ß"B¸ïûþ¼&l‹Å"ÊµÂêû“ü™ «ã5]9Ù�gþ+€ÑÖDt)2]+aäö9€­SBÀR Øúj	hµ>`5¢4±y:# Ív¸’^Ò¢;€ÕåØñ„ÖŠ©ÐR§DŠK¿§™¢\â£Èˆ�]`Fxv\Š ŒÝ¡ €•ê�Ç��B«~¹ò@° ¬ÿVÖ&î×<c|Sø_ÎLDiÐIŒ1ˆÂô•Û"ÐuÝÃ1|ÞuÝãiø÷óÀ];zy&?¸tìÙKyp+Ë°%¢]eçk�µ]%€e-LžÐ¶‹ïPQêï¬näh§rA‰ÑJJüàÒñ‡säšË†¬Í“ k(ÑÂgä’ÀS-§ÂGG†Î€3Ê�Oü½V‹Ï    IEND®B`‚‰PNG

   IHDR         óÿa  ”IDATxc@Œ¹¹¹¢@ZˆYÈ ÌµµµŽW¯^Ýoeee	äs�%É ;;;Ë>|¹{÷î“êêêL ˜0HœXÅÄÄtß¿ÿåÍ›7?Þ½{÷uáÂ…3ÙÙÙ€r¬D ÄŠ÷ïß2 jÈ·³gÏž³°°°&è%¨¤Ø±cÇN�4¿~ýú'¿}ûö;ÈÐªªª,b¼Ä¿mÛ¶Í0`êš/«V­šT#�/–x6oÞ¼› —€øÆ�û+**”py‡kùòå³@ŠÑø>}úôUyyyñnnnúøÂƒ­¾¾>xÐ€ü³}	€Âø“˜ˆlAN½yóæ£ööö0Ãž?þ>  À�P”2ÊÉÉim|‘˜˜äkœ;wî2Ìû÷ïß“ÀçF~~~ÁÅ‹‚ˆ9

â�š¿@ùZ^^žgÇë
˜?aic÷îÝ»@. ák×®]Š‰�’OXýüü_¾|ùúáÃ‡ÏfÌ˜QãEWDÈE¼@�áÂÂÂ@67²í çÅäÍÇ1    IEND®B`‚‰PNG

   IHDR           szzô  òIDATx½—�-9†·5¶­gÛ¶mû½±­âÚÞâÚ¶m{lóú.ŠûŸªdÐ5¸˜ÞT}—�äïÿœœ¤¯¡	@nÀ¸ ‘ý®y€¼ž~úé•x�aô�‰þ
z÷Ýw³›››?Y»ví|Ÿ€«Ö"fyxAAÁE‹ÅbÐét=ÙÙÙ¹øm>sÃƒ¹$hé@ø‰'ÎšÐƒÅh4šž|òÉGÜÜÜÖâ¿Xà­UHx†nÚ´é&6Ã�¿RSSS±téÒ#øú��ˆZž5kÖÐßßÿw__ß?ô®×ë­F´äääEQj	zzz®§É¸ .‚Ü aX%�nÀµqø�eMMM�4!MÞÛÛû/ÂCÒÐÐP3þüÃ,$�CB"8+ÀÌÿê«¯>#Û¹ ÎÐ� O�©©©ù,$á�26?:’ µ’×^{íyôYÃBâGEÌÊ¸ÒÒÒ²šîV-€34$YÝ”)S:^Œ":t‘înd#‡ïº²²²rô_ähHøRÛ¸qãq[CW	„?üðÃ70Æjcï^Â„ Ã÷©ØêõÃ^R±fÍš­+¸Ùã‚‚ÂÃÃ·šÐx-°ÕÊêG{‰Ùlnyÿý÷Ob<O{ª¦dY^£Cãµ`¼É;;;uß~ûí�Ø7C^½zõäúõë—‘›ö: _°¤²²ò[àÝ²dÉ’Ðg7˜âAðnŽ$¢˜�sÁ¼¨Q/EXýúl Q¬¿O>G–¢;˜|ÿý÷ßÁk·ïñïúŽëÌyì ã	$g‹QÔÉ“'ÕÛòþýûjmmíã¡á�S2äÎjŠ»³ÕPa+V¬8LÍ—Öm·Ýv?~?xÓM7=Hw¬Þ-IàC=t«†Þ@rê\€Z°KÉH"�¯àîVá÷™`}]]]µ:?È•ööö6”ä]´þ�9GJÀêÔ©«¬V«§¡oq$#k#A ˜rñâÅ4LhÉ…7ß|óE\3ø9zV�Wddäø'>/`“{ W&bñ÷ßÿåH.Ðž°sçÎ3t†ä5ÀÑ<ðÛ°aÜyf³A£qt;ØÓÓ3bBþðÃ_‘H&VvT„ÌîXá[+CbÅjÎë¯¿þ,_ªês¶ô,êL.œÑž!$IÚÐÒÒÒL“ª´µµý†k€»-Ê0íî»ï¾.«ÝÝÝ�?þxåw@³G9°´¢¢â{ší½÷Þ{…œ¡»×êAF]¶£ðwg€/¦OŸ¾‹r„O>¹ÖOÔ¬üF�0àcË™ð?´	ÿiz·Ð    IEND®B`‚‰PNG

   IHDR         óÿa  "IDAT8ËÕ’;JDAEOùb0ÉøY€```&(¸?#3÷à
ŒŒL�S#C?�øGLA˜™cÒOA'+éºušª[tÃÿ5~cýx¤¤Tu  #¢þ'ñá2‰ ì$½ŒeÃ>€'`(€e`4·ÒRGÔ†:§¦©Nç¢:£U¼rð, «ÀyD«ÝÌAO}Jö÷"âTíåÔµ™ô†úø�_©IoæõNÝJùvjv›ñ{õF½VwSí,_¡kê,pëÙ
/ÑP—€×T${šwu˜Lµ —5¨«À80­V  :�ÎeQ�ü“t»Ý²,Ë©~¼h6›óív»È/Ôjµ/ýøßÆ'+hÖ¦2I    IEND®B`‚‰PNG

   IHDR           szzô  }IDATXÃí–=hTA…¿»&h!	¨ QA-! bˆ•((Šˆ?à¤°;Ñ@ŠÔZ*‚ ‘tFD%!b4bTÄ]�$JÞ±ÈÝe2yó6`aá^vgæœáÎ™3s4¢�øßÃª$=vå`c�a3;¼ 4Ïßé¸<Nu-ùaã@‰D«ó˜Ùæ(�±>«õÍl@S ÈrHUb–£HJ©z˜‰4%HÀ`Üû�ÀQ T'�ià6ð˜š�8’s,5	?xëIFÒ9ÇŒ&ø£’:
ø]1¿At;¸]ÒKIƒ’:s˜MH,à0&©YÒeIo%=“´Í1w�¹¢#˜J’V g�VŸÛ¼2³YIÓ/ÜÀVày4¾Ø¼~{ËR	¬žFc¿€'®Ê&`e�qÎ}Ôçcû]õ¬È„
Œ2\2³QI\©ãðpî¾™]õÄWK:\ˆnT®ä¿_�3f6 ©	¸æM/ð•HððøcJ9;�OùÎÛ€[À¡“R º�c’^Kêö™Ùˆ+0U”@|ºÌlJÒwîöhq(�Í€uÀiý~#©27ÜE3+KÚ ô ËýêÍx›KÀCà Ð	ôû£ôx`Zsù’†%]¯W½$õJNðû%­-à¶K
ùñ-˜^B-òÀ*à¦¤;Àà›ßù6à p|QQ
²Ì©„�Ú¼™uD»J�¸<kžn»óP�
§e²·°JÖLX©T¾D.WŽóÈ±"à×m•Jåó"LLLt—ËåÖ¥|Fµ´´Tâ±¿å7¢ÿ,þ ÃX‚baœ˜ã    IEND®B`‚‰PNG

   IHDR         óÿa   zIDAT8ËÝ“1€ ÷<cE,ü‘æk†Æb9
r‘bc¤–a�àËÌddOÁÀT# &"›ÏÎ�Ë. §cëS°% €ìšrD�Ë)õá„Ý¬z'Ž
XÕ·7#àÍžõ	HRUÏº1Æ=¥¤5!äoþ�ÆX1.ÔQ$     IEND®B`‚‰PNG

   IHDR           szzô   ÌIDATXÃíVÛÂ0‹ßa	FèìÅ>¬Áäƒ’b~
ŠPsº¦éIˆXêGªÓÙñ=çþÐ’¼9ç&)¤Èypé-à1“@ ÿäpÖä=®p+WÈœBPþ£µZÀ)[nßê nßìÂÖ°"ÌD {ì�µ=€ÊÜ—¥ØÕ*{–ch¾(Œ"¬Æð›ì}ÎMX«y¶è®(ÏîHk™VpëR:hSJÏB„øÍ±}!\cŒ'M¬÷>�ÇæÀÏàÎÆ^š?©o~    IEND®B`‚‰PNG

   IHDR         óÿa  IDAT8ËÕÑ½jTQàïÌ\a!�ÞÊÆF°ñDHl$yKK+ UÀB™·k{µIÈ2D&¹7+Í™áH¦ÎÏÚkïµ÷áÿG’r·Š/õpŒÑâ)¥Ü»�Wùû]½ÌÑãŽðw›bsãcMð
k­•Ã$�“¬'YKò#É¯†?Iò ÉÓ$Ï“Ü©®–¶.ð»µBpÙ88ÅK|Àf)å¼:^&˜ãaÝa¨«Å~–R¶“¼Ãt×‹êCä—øRJy“dO®;á3¾á/öqÐ$˜Uñ3|Å{üi¤
Ö±�ßM;p–d«‰-fT ïûïãñ¸o†¡ëºîÑ*¾ƒétúb6›�Û€Éd²ü…Uü¿Å}™’yç’    IEND®B`‚‰PNG

   IHDR           szzô  4IDATXÃí–»kQÆ'¬h!«­�FŒX)¢AQ°²¶-´ÐÊFA‰¨•MDÄ¿ÀZ¬¶©‚DÒH
A]M| …;Å†EœÏ"g–;7÷ÎDRX¸.;{ÏwsžcÓ˜þw²êAÒ0�À(ÆKfv¦Z—?ê¸”L¥ËBùÐ�÷@G+>f69ð.ƒïFÿÍl?@' ”	¡J°LD$©6LÍ‘‰ˆY�ßÀSà {z=â+£¼:óÀOé4pxîzËP¾“ðúpÇÌ^G¼2Ê„üœ™ÝŠxËÀ²§y&�Ê³{¾$i_âËJ`Ökâ°¤I‹’N8æ0lKÁÎ Û3!N9PŸ€	I;€ËÀn`'pÒo¬5¥@ÀÝL!©¥¥LzþC}¿€•½îPÙTÊôo™¸OaØ=à¶™½‘dÀý¨£’m;“3�JAhü;pÃ�w€>¨”s@ñvmsà-pÕÌ~HÚ<¥tt2F¬Á€2ü*E+À3ëK:<öb,ƒ¶¶4aS4†ÀM7>	<òNZ0ÛÂîë$Æä5à›ßU¿/�³þ|¸˜‰À¼™}ô–ûœÞFé	pª)ŸÍìkm˜€UWð³a6±�k·ábbÌZ´@F|3;½Ù«ÌÒ‰×³ÖÅíXS²Å6ljå�Š¡(ŠÕhÖ+1ÿÈ±5
ä[OQ+j ×ëÍöûý]›ùŒêv»E|·Uù1�éŸÑÔ¯$·ÈÙ±    IEND®B`‚‰PNG

   IHDR         ØYþG   éIDATx^]�‹jÄ0×§æÕþÿ¯^/ï+#B3,{„¼MzðRÁçã¢”Ð¬Eß3)þkƒf°äüXœ5”VÒb…Ì]›,Z�0¥Z2Š©€]IÙâè[LÅÜç¿oî{gçàh,ÉxMƒ+Ø™ë„¡ƒ‡ÄeÀš"›6ADZRÈ3£Ôn9YrèíEWžf¯W(+r íè–³Fµ–4ÏH¬ù‡=p
 Ýàf°"8©Õ3áöÛv³=¸© £¯øÀoñ�6êô¦{)ïÂªß'k%"‘’¬Y’»î›ƒ—NRßdu†ØÜû¡    IEND®B`‚‰PNG

   IHDR   @   @   �·�ì   ®PLTE   ,,,222...%%%444???'''000!!!)))666###999;;;===AAAFFFJJJHHHLLL			DDDNNNWWWQQQ^^^UUU\\\SSSYYY```bbbiiimmmdddqqqfffooovvvxxxkkk………tttzzz'ëÙ    :tRNS~^   8IDATx…—–ôHƒ#™ÑÌU†¢†–èþÛGÍ'ð³Bú¤¨²{i>¾@®7q~"ÒNk@ÌxKíRO5JÌ16twÇC-úô7Ä”òjÛ+˜x¼u¡Ç­ÔúØ�n—"W¹ŸMC•E•Ñt4Œc6ˆ¸dÅpÀjÕ0!H ylÆæ±Îöó]>«U·JiX@ýæã
Ns7*6r¡JIiç’›<í
Ð¦n®±hdAz{r­xûC½¿Tu-½Doá
bƒò©/¬9+Ýùµ<Áx[žKÉš.¡T'à™OÍˆQ½zFÓ?£®ðÒx¯ÛûÏ|¢ÛÝ!ÀŒ$@ááNÌ ¡ƒcŽŠ'è|8™Y1¤Øs×¸íªÅ=ÕÚæÀXSV�—H§au+Æ’[Pµ‰×y¯lª.q¥f˜ª>µ@‡ûâ&}IÝ”’[¬ Cî$�\ãrKŒP[4UÑ+VÇS¸°>›ÒÈtp“2-ü‰žÎë0_h]°~Uðåñ$êA(ªJÏQã¥t…Ó®éäa¤ ‘”´Çåœ†ÆÂµmü4œ·|žÿ5â \÷¦â�€àê+ü÷½Jm�Õ¬1¸@áù*|ÛaVWçK ½¾	[G:Add•½Ûâ
KYVÂ�ë¹¤Åˆ œrû\ðàß¼¨Oªf¾ä>–7Ö€+*1[á�Ç{öú	~ž—^b''‹Vq�Q<�&+ëx³±Ü‚m Í†¿bt("Mg/…&Û’‹u»N]“
=Gô¤¿*kX[uØ´yŽ3"�)gUkFézŸp¨"eí¸96ŠÒèLbmX(®%©¨ {k.eªo#VÏ˜zž&"²&Õ¾€òN=i¡ãECD¤ÂÏŽô›ÜÂ¬£)ÓvpÚ	gUtwÇ&£¯+’ÍUð¹“é5 úY2ªœ¥‚=¾ò�/ÞžJ€ñ_‰D¬à#Â¡Zrêp¸Ò‰ã¼°¯~ÙŸ+¾Ó§œŒ½´ª¦m°õ«´ùO�Y„‡°YK<.ô¤à©”‹8=÷®ÀOÓ±£%¤²p€n]ß\$L’‚“JÙºn¥%ß@#°~H“ë©_Y=¾˜øùq3†)P]r³ *T½ÔaýGO&ñ«2¿®ÝƒV™ º”%¢ý>©ú	µ`»KÒ�Ä$%›î«Ã}<Î‚ÇMQ–�ŒœqÑØn­þ3ÌÙ9ófJCÃ©>LÌÉeè*q¿ˆ¬ Ý“}iÔà]=y¼Êé$sEuA*±©
Â¢½¨O>œÐÞŒä>ÒÛ‰#Bµ)Oˆâ<.X—ð)çÎ’ˆï5,y)>�AC¼ê��Nj—nÄ©`a×BYÐNå‰M×þÖd„]ë_²·6È�<âÒ»~¯É²F×ª[­1Ì¼c`€_|Å°”ŸžF:–‰Ø­‰0¢N:ÇÆÒ4ˆ+²jh¤ª¹ŽýÆùg-Òuìr6ÍQK|ï½á•N©çZ|4÷ûp&  Ýii�=cñ.ð^õ†)|ùG;âõ–#0x¯ú‡«©Ÿ¸=­è*+\W�üòÑÂ4qéÈ#|t?'Á-yOS*‹�î›øte˜éB¶MÍŠG]ß&�ý(á÷ØRãvŽç÷`ph_·žÒYÈú÷Ø~{øÊ ¿,–0óý¿ôt¢]`•+‡dNñwƒÁß´™W_ZþN"B*¨Âeiÿè -Ø�±™ÁS&�Ç ‰hÈµ¢S(—k)k}Þ¬ÊØ‰1ZÓ•À�iQrPcŸÛTupÎm‚��	KˆÕ‰Ølc ¡á²·î-!à“¾|Ó·Sc`F1ZÌßô-üUal�ðX�¿Vúº>í…Çgð�Ïêê¯uw,=D¢‰¸,)ò­™×¿Ö¼¡‡<Îë¥ùí€án:oèñ	}à1þ¶xMNBCÄ*hÙòëïÚë’l_øÖyY^2ÁOd5/~ÕPû†Ï…$¾ß(öþýFGœ4×æ&´L°+¦™C‡©)c³CRq>_ÑxkZ\öÎžpG!K±7å»t¤ƒTäÞ»›H1|¤|¶‹T‚¸ên"¾¼~¶‹þº« {”æ‹æ5åVÍš­·§YCD»Ô]£ãÍ˜˜öìF}ÜÂ€‡F2`ÈÜGô·H*ë·®üí_6;F7vžš³¬«Šú2MØ«ÄAÅeôñªH¹c¶ä½0òZßî±ÁI¢ßÚTb'1 ±|¶tläùœèÖ1£H…d¥<–à=/ß¯�?FóMû'k6˜ÔÍ¬Âí4Ø*LY›—Î–®Î 1à'Qô±®J�Š”Ž(Àë‰ÑOÄÃçêŠ¨Õçú“c`7™Ò¼Q’I#»n©m¤ê^Õ\w¸ñžKyÆ	!CU@æjl¶‚¹1zhèðt+}]5wô¶¿yN- äß—:aÁø´¡(š¼âÍ¼·6|¿Èãûu�,,ü�îW wâs–6‰×G{Øh1C\°^53Þ�zÂþ ò'ÕüûùIu	~ÀÁã$À°óÙ¶:-½’Ð^ðÅ(°ßJ¿(ªOœq§³{áÒxHskÿñ�y´l´‡}½øÉêf8(œ$Î¯C{;eÈ1ÜT	
 -]ÛF7¢”hHÙ*V�T'”G#ÚºÓ^å˜6î<WM‹Æã·S^#€?Zò«–½<ìNÀ-û&MÌÚLd    IEND®B`‚‰PNG

   IHDR         µú7ê   uIDATxcb  à
þ¿CƒÈc0|C…&0üC…d(ø‹
1üA…t0�\+®½t�Ž›L3›vá8vþ?h1�á&ÃM‹éÇb	¨c­æü¼õ“oYÍ9vð2ÁÖóîÁM»g=ÏšïŠ�yÎÈ�Ê    IEND®B`‚‰PNG

   IHDR           Ùs²   ËIDATxí”ÍÊ‚@†³ñ~Dj¼I¥D„¼˜„Ý4³hÀD[¶ÂM�ÄçPŒ?A|ày6òây8¯,œïÔÕ Az 7Æ
ÊÀ*!¸øýk…ÿøÖ
µ¨Ï*Tbãm½JÌ¬P0×¿°†»~qšqAÎì]ÃŸO·÷9›øGâ™´¢]µÂ	x6AÀS¾Ö{y:R@�´”P qD�#4!‡NvðIbšP‚ô€ÄPÂ§)IL`Ò}]WèÁ™ÅôP¯‚†^    IEND®B`‚‰PNG

   IHDR         µú7ê   ÊIDATx�Ž=ÊÂ@†§úðé´³P°ßÂ^´Ï´¼�ÞÁFü%$E@±,5lã	>vœÉ¸Y,œ’yß}~œã«àA�×ï -+*Ü¸)p¨Â5 †ˆô—€Œþá,t{üeà³
'þ€§æ³
G�÷0K±x³9æãø1“˜;2Ìþ×Ñ&DnÅ�
	‘ºåGiÐqÊ�
»’Ä-°ŽMÜÐ‘4^°S*	ªtµ­$;³`ÊGÌÚ@óhÚ4ÇWf    IEND®B`‚‰PNG

   IHDR           Ùs²  pIDATxÍÍ»J+QÅñov)ÄFDQ|­†à[h‘'ˆb-*‚ž.Î+XŠ¬½'C‚E”¨¹»ÄÆ°Ýd6ó-™D°p~ÍÆõå¯üž3¨à%‚øæ!ZðèTÐ@=‚øž9aŸuÔ"‰¯Æ	û|ŠÜüGêëÀcö¦i:ð-tÓ@ŠÕ†!âÆE¸�ö¶õ‘`öy×C4-Ü~nÂ¶—â	q�xâ`Mï¸GºŸ39¡wTÂÌÏmBï¸RDÑ;ÊŠ(¼«@I…w(*¢ð®EÞU o,ÌŠûI}æ¯‹sÝ;xF{Ä Ž¿z²ŠX¥„áøK1¸£@&p‰N †M±W8³P D¬óùÐNC.°'ôß=uA�Åø‹í8&9¬c#ø‡¯xÝÇÉ¢ŒÎyií¶Ä�î#�lïá°?­�t2-†�!™·OSþõO}ï§áâfÖ«^ê    IEND®B`‚‰PNG

   IHDR         Ú�eð   2IDATxcHðÿÿ~ ^ ¢Ñ%X€x-?ƒÒ,È’KÀ¼„|72–°ƒ0½2€  1Ö[³KŠG‹    IEND®B`‚‰PNG

   IHDR          ˆç�   _IDATxc‰à<2  Çöÿ# ´Å&©üÿúÿg@xÈB“äÿ(†@?²$Ëÿ•@A8òX’íPAl‡Hâ€4’$è Â^Á‚ÁG8à3ÊÐà0• ?g~®;3{     IEND®B`‚‰PNG

   IHDR         µú7ê   îIDATxc üßñÿnýÏùŸ‚ˆgÿŸ@ �5›‚GHðéÿ×HðXAG:.Ø—ÜTph4nx›áõæÿ7aðÛÉŠ„âØo'"Ÿö3ÜŸöÿ~;–èÏÀËÀ“èÿíLìé2†+åÿ/�à·C@iN°¿9�JADït3œŠùk# Ò%u‘ÑsyÝþŸA —nÃüdÝ€ˆfØoòÿÂ DÚ1ìPùa
"›´–‰ü?‡¢`i	„Èt1†U<öþ?�@w_Â‹0þïÝ,Lv8 - ¤×Aˆ^8yl    IEND®B`‚‰PNG

   IHDR           Ùs²  íIDATxÍÎ?ha€ñçbHpZW§`¬…â ÿP—.UÜíäàà÷A:Ô"þ£• EÜ$¤ÖF«‰ô’Ssr�i’Á`À¡bòª�’Ëõ;m‚ƒïÞéù^>þ�‘cbÊ7‡þ®½šo¥"e‡Jë“ìÝâ�_ùªB¹•’í[;PrQn^oògí%_\Uä««¹ÎŠýh˜ð{M^¸:Ñ»È¹�lË5Ž÷N‰W<ÈK©Êj_ÊR•,ßbõoí9ŸïÉ{7Å¹ÐXhìcÌ½¨Æ1®ˆ©fÍÀ‡o`¿5ëÚDY:#ïT¬™Á!4 ´Á!kF]å.?(o6ûpãùÆ	ó®ªK�âäŽ¦.¹næ�®ç š/hÜ”œÓ£aÐÖ’’µ3¦|A4œƒ?`LI¶[x'ajqYé0¦ý?.Æ´½]_ÄoÉëŽèhw7FímíajX“’±1ÅjÃÁj3ímév	J˜—å•Š¦p­ rçeYE“ç!Oæ´¼PÀAÑè:è,Ÿ�”Š&=ž†4ÉYRÀAÑ$' Á“ <Sð6^U3¿oæIî‘E…qÛ	Ï�³ª&¶;1b»ä©BF›ôæ¢µ€€‹þõÇ²Ð»úƒ:u¨ƒÆ!Žôa˜1?\þà:I‹�    IEND®B`‚‰PNG

   IHDR         µú7ê   ¹IDATx•ÍA
‚Pà� ´ëžÀCt
—Ñ}Â…ˆ Âƒ:�-‚ EPDYˆOÚ·¨¿z£LöÚ4¼ÿ_†þ¸˜ ÃÕÈ1BDî#Çgd/§ñ�úÔnü›âXÛÔ±Üw8Ôü�OŒ—�½ðz1^6‚ZdÖ¨ö~Tuy%ª/ÊÈÑ
K›VäP5N™`ÑT&›Jc.Š¸sEG˜1Ù1WB¤Hu(±]	t ñÏÊwü¥®Ó—¾Ö™    IEND®B`‚‰PNG

   IHDR           Ùs²  UIDATxÍÏ;JQÅñ#¨(¤1KHàb§bgìSØæý(´Œ�â&ÒF�ÌD4bQ‘„ˆ …�ŒÇ�uf¾›¹‚ß¯½çÿù8ÎEn±Å{>z<p›s¨2Ã†=½ã-oÜ^Ú«ˆ"Œ1¨�³}ûñµßsseS~œ4ìÇW~ƒîÚ&tïKöã¾ÄZGÁ÷´ÃKÉÛil:7Ä¯ö$íMŒBçØaWRY®À;²r´/”¼�ÅCqx!.à¹#Ð;ž)À”´eú�–LH°çÒ”y^%¾ˆÔK<ù�z	ü¸ˆUä±>«èÌÝ‰�ôXgîOäyÌÊ;s1aæx0œ™SÏ�D––š™æBÂ”	s9QËÐð«eä¹œHsß­–VÏå�¤¸÷ÍLÌ¥„‘â®Ã�ç‰$«¬Iý¹�ÐŸ+¶¿½O�}/Œ°Éà    IEND®B`‚‰PNG

   IHDR         µú7ê   µIDATx�ÊA
‚@ÆñA'¨E«îà	:D‰:P´D¨HÐ"ZE�”…8ÒÞ…}ÅÔó�Ù¢ù-æÁ÷§?º˜ ÅÝH0Ç $DmêOÇ¸ y¹âöHí„¿ÎÁÅ™‹‚XuÌ†ˆYy,‰UÇ¨‡“…˜-ì…ˆ�¨
±±µÄ†29ZaÓ¤9ôyNb]—‡2›$°YÀ³•hË7íÛ³�xˆiOæfâjWæŸÉ÷üÅþ÷ÅA¬    IEND®B`‚‰PNG

   IHDR           Ùs²  SIDATxÍÌ»JAÆñ#¨(¤1��666>€o �Š�•`�Â6÷K!vÚ(¾„mÔÍn$F!Äs	h‘F#Y?…usæ¬c!8?˜âÀ÷§ÿñÄðˆ§=T±�L‚$ê›  …w6_jèŽ¸Çz(cÎ7 ÐÌúÒs�î[ó¾…¦·–ÝÚ·Œ)ß€Bg-­öpuH;,Î¾^áN§Ø'ŽÆk{hêJâ4§£54tÜºKœæ´Æ­€8³À�À,@c¨¤ s-0ÔÆ�ª@DÐô¨š‘Ï …Š9\þN1G!úöBNæœ¬š{œ›q2jÎi”~æ¤Õ\›°S8óg§Ô\N$áÈì$›k¶ž4g‰BWHÈsžˆãÔ«—æBÂŽáä‹“çbÂŠáX±ØÜ4Ey+*ÌÍæs!ñáoß;M¢¾pÿ%[F    IEND®B`‚‰PNG

   IHDR         µú7ê   ¼IDATx•Ï±
‚Pà³´´ù=ƒCcô­Aïâ#¸6´†ÚÐ"AC †HØÔâðw.Ü[G³¡ó]ÐÃÿ/‡þ,I)Ä�…¿
rd,GÐTXptÕ2Þj).B
_<$ˆkx¦0çõÜ æ„TÇ¦�‚ÓïŒ98
W´q¾�.vF¹)Éxÿ<l�bV�¡?b�µ¹#—~°0á8RÊÕ}êŒÉ¢Ê´¨C}}X�ìjü§a~¥„    IEND®B`‚‰PNG

   IHDR           Ùs²  \IDATxÍÒÁ.QÆñCX–ØH�°•ˆh-tãxíÌ´±ð <€µÄØJ72Â´ED#D„´¦�ÚZˆ…ÖÂH?³™öž¹½ç·º'sþ«¡ÿ>ÈH† “Ås@šèwþJ�šð¾5‘‘¸óÜ�FT"ê¼§GÕ€�'ÔDÁÖP	ð`Gð`ôèpñ áB—t8(÷á@�
h¨â^AÐ`ãN‘­7�F·êPA:H¡Œ›_*#õ iJ†áš×ýUp5¸â©ÿÊ—<õ@‰§ÆO1ÐžÄ9O1ð²„3Ž_ðIÄ¬^7pÊií·H$,û´Pä8Û‰„Å‡�"
sÕ$QÏ³�ä9í\b&A¢®¦:°8¾¹¹Lƒ$Äa"�cÑÛÞú
�ÊNG�ÀJ°pÔåð=WÛÙ]_ IgˆÆhŽ’‚EŠÓ<MÐ ýÝ|‰dH²ÅóëÔ    IEND®B`‚‰PNG

   IHDR         µú7ê   ½IDATx•Ï1ÊÂ@Åñi,,sÏ`aé‡à-,-¼Šx[[	‘ÄÂFTP!ù$Ñ$MŠçƒì²K\ó›fØ?„‘?¬Hl[„Eß‚RÊº‚%ŸîJÊ­øÇÍàØ��qM_®W‡˜/"œ¶ô„p1¸_ìgÃ}æÉÒtå-ïäRáhÏ9öZ1)¤ÂÑ¦l°UŽèüB¼ñð5+×ÌˆÉž	TÂÃºêÄ?iICäÄœ!çòçâš    IEND®B`‚‰PNG

   IHDR           Ùs²  ZIDATxÍÒ½JBaÇñ_Q£EKPƒ­AtÚ�K÷Pw�žiè¼€öèšs
Â(ÍŒH¢ˆ(4_ó¥Aâ4Xœ_úð?ÇGhè÷™ÿ_ÿ}Œ÷Áè'Î·>ßÄ¨ó×>)¡°ÙfýG›ö¸›-Ö´¼^çMVMÚº‹VZ:‹u–<Ôi�
˜¬ñÅG�¦_Àd•…ª4½Ë|ÖP¦!–ø¤©DCÄXä#õDYàÃ˜
ŒþDdïeˆ	Âk¼“éÿÊ·2ý@^¦¸ñ0­¸–9‹TpnŽW’ÎF*tÎ1s’n¢º‚ò>³’¯4Zß µÍQ¶gõ0=AxÉI2#q/¹¬ñL&6?SLKÜ¥€³»[ïG<dÜCR@�ÀüÚáNåà#ÉSžI3Ï=†9£˜ÀVÂ:"P­`Sø‹}Éº�Ê9~;š    IEND®B`‚‰PNG

   IHDR         µú7ê  IDAT(Sc` þ¿ƒÂ:¸HLÂ}‚—æ2(Áõ(]œ…(x‚ßŽü†›À÷mDÂ}piÖÇÃÿþ; QòŸïßöÿ�¾œ¼<çÿ°‚Ó“TÜœ>üïG:ˆÿ=éÿýÏÇC<T�2�˜ÕÍiGƒ˜/µ§(Í•�V¨4È‚¥IÿyÿÁÙaÿ…�¥ÒAÒÿÖü¿ú?*}õß�’ÿéÿçþ[õÿÌ§­z ~ŽÆûÿOÿÛü¿àÿEˆ‚£ÿÏý?ùi³¿;Ôi¬öŽï×ý?	=
QpÏ4#¹œõtD¢à žüŸwUòÿSQß
åà&ÈÁÅ ö˜¬z:mI    IEND®B`‚‰PNG

   IHDR           Ùs²  IDATxå’=kQ†OjXH%……ŠµBÑ"þ†TÊÂ¦3V› +Ë|`B¬Œà˜«½šÍîdîì&V0nf7Y;ÿ�çõÎ�ìœùÄÆBð<ÍáÜ÷}ŠaèßüL1J0›‘Ò÷àñ{œÆ2�RrFËÉœ¾Eq–âuQ8Kñ¤¾
kéº(¼WÑ¬zâ(‡K¿:Ñ¬cô0žYC7žÁ�Oo�;Á¦ŸÆ3êý×î�J°‰ ƒŽZ¤s/fxßßM4®cïèÅ{{ŸÎ«E³‡O-˜OWx>Ímx>ÜÅÙ°~J‹=Ã~åûŸS-Àj>üò…—eÞCíÖã¡ãC@ƒÍ9ÿ†/ïîš:Å¼"E¤4aÝ(ž•ùskeàô …è„=Ç{©åLáöu©‹âÎ©ÿiNä_ÿ—Á0(Mö5+x.&S×	þ„«y‚hü¶á •PLè‹ÃnL1)¥~�›P°5.Î„Ñ“Ø17›wqåèV‚+»(™z[°|Öfèõgpõ×Í}ÛFQÒKuÍ°Ëìµ7Ó‰¿®ðt
›¨šx¨ÓzÁ¦ÁA-ØÖËRÅ“)®š÷œ '‚ªÀÕ×‰º(VoòF4+‚¡³’®‹¢ý(šÁÇuA9aE³"øCå(ŠPñ¤Þ'°3EØÉ\( Ë)F(9#©¿1¿¶zX�G¤©Ÿ    IEND®B`‚‰PNG

   IHDR         µú7ê   ÈIDATx�Ê=JÅ@ð9�ï*Ï�lg—àRè=‚x‚T©Ò´ÔÂ�6Eˆ…°ADÙ"…ýVã?Oa—‚ó+†Á?Ãg~/¼3ð—½¹‚ò®/iÃÃ#vsDÃ'0ˆ…�Æ>B~ï9²gDàô°�|€ÔÇÁM`ø[;°e_œÇÒ«@-z¡×�oÛÀ×m˜nY³¶eŸCy}nËyŸî€c¨4a“E›4�Â	æ¸‚5ßš•+àöP+ö�ü ©ƒ3~cYEÖ    IEND®B`‚‰PNG

   IHDR           Ùs²  —IDATxÍÑ?oÓ@ÇñßduîÀÐWÑ© �\u¬:vu_DGD×NÝª"õ-ÁmDC�›ÊÁ¡Aä�=²E‘%.?ÎÜ…Nlc™�ç#ey¾ztrðŸ0à÷�¬`€0DÀ˜Q‰X¹Ç�í]ØËmïÆŽå¾€#ŽölXÈkÏN›å¶xË!‡°P4VÚÈrká€èÈÅ@B‰´ŠÎÂ7à7%2�Y|ÕP"Ó™E_C‰Lg_4”Ètà&¯I¡v�(°ö»‹¤knB´ò³ñã¼àÄšÜªN	Eì2øC˜þM93u¼­¼QžíÃ†ýÔáM5 ¯ø�}øøôˆ~5 §õØ—zôª?Ö¶ë?Ô¾¯lÕƒé6ç�ô÷êörWG¦R&¯ð|úš—Jò’—3÷`ã 96f®ª”Iã…¬â¡º//·xqw‚äÍÊÝ	/Ø:tô›`f’3ºt�wŽQ`'m’³sH4Þg“ï$��Þ¯¦)k( –œòíßKN^€uØ¬ã_ÍOzËÓÀ|ýSÃ    IEND®B`‚‰PNG

   IHDR         µú7ê   üIDAT�Á¿J Çñß4*ä&mNéÐ˜kX´ô¦¸õ m9˜9ÖÚ8¥c
EØ?”ƒ=$Eñ{‚¬óîÛ¢xQõùHC‚”ÙÖw1ÆfÈ›1ÇúŠ-l·WÉoììîUòn›„ü&%úÕœÂZÒ²Â×9ú“²ü\‹N*¢™T„ŽkÉÏ1iwÂš©¯ÐvLù½^Ò|Ëhæ#Ms|%¿ÇCL¯E’ ’^ó"£¢Ó]ºXæ©Bš#ê5¨Oï«ÙQÑ©9µQñü@kšc�gž¦w…´VS\qÅÒ‚wÃƒs{’RP?{9{¯öÔ¯"ÚTPÿó	’¶ŒH‘í7Ú    IEND®B`‚‰PNG

   IHDR           Ùs²  TIDATxåÐOHÓð·¦!éÂS­CàiT?¢@—‡ C»Ù¡ºxŠ„ºYxÍC’ˆý¥«  Hª‘iöokl¹–ý˜ús[y�¹ÖÒ9÷}÷|ø\lßm¦§ çõðý÷æy>cøÓ‹Ûy–·8ÅEæÏ³ŠX,ÅA/ø…1FELžŒ ÏüÞ‚r^“á(çóDù•ÝÜ¶ñ‚NÆù1^ßhÁ	Æ8§‘�««­ÑÑèèj¹ŒˆþÊ(O—ZP‘�àŒ²âëh…µ¨µ°u´®øt’õ²ªè‚µSœa„‘Ü´³¬/‹³%7­2ÎdÎe��´Ù·›üO	ô¢ùUèÕij(…¤Í–Ç8­8`ærètÕ·ŠUH›eýü¤8­N`Õ©,)+òdÞð£¶„Q€E§FÐ€i³ä(§”¥†%Ð ÓôxiH›Íö1¨¤®¦P@§NãƒqÄ!möðŠä>"�Í�Dñ´{à�´Y�5ù˜~em‚¶¼ñ	�üðØëì°CÚlqgò>}TüÆ^a=wˆz^–7¿NÜí(Gá¢…n¾ç;j^æg–'¯þº�ÝÅÇGèãÛRB=5j I¯G‹1"'¼Ö’¾?’û/Ò£ƒ±eEN7†å„I-q¯¹y×±ÁK³ýË£ê}ùÉœËíÜÛXâÇçnË/µÄÝ¦ã¨”“¬8ˆ£°WØåz{P^|ü_¾â¸–¸£Æ±™Êus’/´„Ûnßä8�}Æ1-1²…q`®‡Ï•Äð–Æ�“GæûŒ§±þ-Ž2vMøGî[ýíÐûö4Pca    IEND®B`‚‰PNG

   IHDR         µú7ê   ½IDATxµÊ1+EqÇñïw 6»áv”Á`ò*¼ïÁŽE±Jw¸I)VI‘¢®AÝn9�”Éð¥NO=»ü¾Ë§ž‡ÿ_	X8`è³I¶m“ÛX�OèfÓÎŽg¾;XÊŽó´çŽ|{í³˜çÙïK_|®ée»žûºpè°Ùo²‰`jaíóÔŸÜÎ–6„‰ùÕ��w>º“m<ef¥>òÆ{w³�¡t–«=¯¼u+[�ˆë¿u�ä¿ï±«w¦%…ô    IEND®B`‚‰PNG

   IHDR           Ùs²  �IDATxíÏM¨LqÇñg¼MÓhJÔõR—,&eá–’dÁH)¢²Qbc#²Sê.ÉÊÂ‚•l$+5Eq_˜sïuÜACs›¦1fHI4"£þ_žNÍâéô¬,,æ÷9�Å·ÓSGþ×G†K|8‡ R»fk1WøDÕ)�Ë¨èÒzÚXÆ>ÒQ¡}÷¢¬õ»9nÓ¥­BóÖyñ»îóž–ú½píŒ¬ò»+C™w4U¿vù¤¬ð»kÂMê×ü…ãRð»B…êÇÌéÃ’÷»›BL�·ª7yd¿äünÆXxÉjêëÃ={%ëõ”ÍïèÏò*Ñ+G#‘$Ò»¥OáìÑŸSTQ¯ÃcV#*½[É+âÐ÷G¼@UÃ4ëq»9 $wpß·Ì¡âQô»9 $[*}¾Çjö¯-~7”,ÝºóÃ*¨ˆçl÷»9 dIq[ë&OÏˆÙíweÿhÑº±úu¦ÓÄðºÉ,ß\½Ê„b’˜cøC?Í+ã<I0Ç)¯©d£ì•ÁLÿ7îÑ<ž)8c    IEND®B`‚‰PNG

   IHDR         µú7ê   ºIDATxc ø?éÿ; œñŸñ?
AHýÁšÿOþ?û¿ö?32¢ BhÝYñÿÁÿÇÿ7þgEfC€)ÍÛ‹ÿßùïÿÖÿœÈl�¸’›óÿ_ÿëßŽÿ¼(ìÿpø|ÚÿKÿ/}Ü~Xð0›á0þïùùÿ¹×”­X�Ù0¯öþ?ÿÿä‹fLÈl˜tßÿÓÿ�>YÄeÄÀˆÌ†I7þ?ñÿàÍÉ¬@i$6"(Õ€P…ME  —É¶à$8¾�    IEND®B`‚‰PNG

   IHDR           Ùs²  ‘IDATxíÏOˆŒqÇñïø7M«Iíaý©%‡I9ØRRØö ‰¤p’¸8É^¤¸®›ƒâ&å 'Ù"Ù<»³óìšišÆ˜!%ÑˆŒú½õíÉ¿gæ{SûyÕó|Ÿ÷í‘ÿeKãŸº.�@"ñ=Fï_¢IKñ�)–3¸{~¿Öß>ï4ï¹Æ*»÷ôŽ‘ë“®FCÑâ&)³wýy_9ó³Bõ–»¤í‘¿>Ö\<Ù)QC½qÓÛ]ù”ž<þ£@Us3¬³º<2têð·y*¨ªØ„Ý‰‘Ô‘ýíY^£Ê.d‹Õ…>$91ñù%Ô+÷œ±Á]èkn¤=Í‹H'WØU�H¼kŽa­{ÄKŠê{öìQI‹n`÷ÆF—¥È¢úúðÄ!²»72. dA}¹wpŸ¤ìî�m.GŽyõñÎø¸$íî��.Ï�zwkûnYiwoìu!Ïxªê72;d…ÙýqÀ…<!«ÊW7ŒÉ2³ûãyf™QÅ©Õ[%avœv<Ž—“IØ=¾QÙÓµÙîKûûøƒ�sAÇã4    IEND®B`‚‰PNG

   IHDR         µú7ê   ¨IDATx­Ð±
Â0…á¿y‰ÎŽ‚(¾�›oQ¤8uìì¬ƒ£Ž¾Aq×5ˆÔ¥Ssãi(hqéù p—s †?1à�þÙáä1&TÆ`€Y¯¢YIò$ßj0€ ‹ç@Ò"-FDa ‡ó/O0¬pê3¡Z	W­šZ	W�ýLL¿„Q[®�°QóðQö†Pò}){·KœEËßâ,æÓ:”mÆ{À„    IEND®B`‚‰PNG

   IHDR           Ùs²  IDATxí”±JAEOÆN‹$ˆßáG(ø¢Ÿà6bce!°2�…¤±±‘),,$X˜ÆFÄà˜ÆDRldÑyîøŠ�‡XIî�Û\ÞåÎë˜QS ëÒ—a"ýò
ÁóMjL©ù¦Çã~¬ŠGñ®ê(	–|®øéGåõqc§²m	Ùþ™rz1 Š)Ø=¹¹¦k	ÙÑ“²õp×Ž\ö(°Ò\ÅòçÚ‹-ðŠ‚E4gZ�WÌ"2Yl™Ì+3ü¯'Ì¿Áü	fÁÊ¯Ô£ü¡­0ê_›Ñ?’[å–gKÈh(ì-Ô¢Œx³„¬teDa
>ÆH:ù{NŽv~5§Ÿ·Ú-Z¸`Ygñ¸r�ÆR#ëdd¸`¹§›H�!À7á "_@–OM    IEND®B`‚‰PNG

   IHDR         µú7ê   ¨IDATx­Ð¡
ÂP‡ño÷%Öm"¨dò1V††aZ\7
›FÁGv­—!Ã°´{®ÆNÑaÙÿß�kø3þì_.ãaA3`h‘ã))’‰V½í¡2»eeV"þÚKH€nÚ àÐù7.èN èèþk´ §0æ‰ÉWa‰$X³„»ÚëCÙBM•ªû´KœGéoqó•ƒ”mÁíã	    IEND®B`‚‰PNG

   IHDR           Ùs²  IDATxíÐ=ÊSAàgr/A‹à›ˆ¸—`£¸Û`•Â*�…µ�H‘€ 
–b!i\� ¶BÒ(3c#	dðFáÉÓŸÃy_§.@ºn¬¯�¹‘—Ô	qÜi|ÑNÇ.6è|�´\$$8q˜KÔ óÅã‹pÿ6á–Ì�æÁðÂ¿íÌžÞžÿ	H¤W2¡{çÓôa¡àÚ.®ô•ô=¼ž¦ý‚ìâˆ”*Ä|A.)ËÈEeñ/þ³Ž?ÈO8žpÎòô‹6ƒêÑ¶"•â›{U*T�»:€�x#«•¶B‚™Ã\¥†¯ŸÏô´¶^B½ÆäÉðæÙ^ÛøäÔŒž�Þëjç›wþ…_7�}j¡=    IEND®B`‚‰PNG

   IHDR         µú7ê  GIDAT(Sc` üWü¿åÿ¥ÿûÿ¢Kÿw ’šÿÎlÈb°œ÷ïÜé>´þ×ü{vV*ƒP€ÿÉšïÈÒûoÍœâúçôädA°ãçÝ[MÒ{oMŸàþçä¤$�ÿ†ÿ‹þ3ý¯z²˜�&½ûæÔ>·Ç&'‚¤ÿ_áù¿âÓ}ˆ#ÿþÛy{r·Ë¿#“€ÒŽ6E}¬ù¼^ÍŒ�	¬à÷„GsØÕ~Í[–’þw¨1òSÕ×õ&ÖPéÿÌÏvx20¼š+ê¿åŸŸ*¿®J³@�÷˜óÿÉÓ@»Š]¿-ÿ½ª:üCÅ·M66pi `z»úK)�æb0d0úTöm½½#²4LŽúwòõãÿFÿ»¿­sp``e@‚m‰_Vü?ÿÿÔ“	¶ö˜Ò`%Æâ.šØ¥!€‰�›0 š–¯Ø4a†    IEND®B`‚‰PNG

   IHDR           Ùs²  "IDATxÝÌC€å  ƒá¬mÛ¶mÛ¶mÛ¶mÛ¶ýÆ¶m£Ík;ìHÇýsþ‚ÿ ¦wYšÙˆ˜¥ã'zJ³å>NïA¦�ÿú|íéÊ?,Aiç'é¤Y7-Ð´ß@—çtŸ3sÊÝø„£ù	:þÞù —£N3ÿ_tä¨”zÐžŽ3¢¹cào‰ç@L™?®§]ð“`$ËE;ÚØ?¨S^âÇéøkD/äø€xH›pýp$Çmim¿t£Y…ã´ú1TâŽPm­¾ )Þ�Ö´t¸+s£mÀw™ªe	}BK£ÃFHŠ[ÑÂáN™†?Jë€o±<g±A0“°“Vaš	M& -iæp[áGhð%Ž‹·iã·NæÜA«ƒ‘Pón¢Mìn)ü0->ëÃ…[4÷};º¡Ä·ÓRÐÛ7 ¥â4£‘ÝM™‡ið1¿ISß7Ý;×ÉÎm4ôOÌBA@}ÐU4¥¡ýu™óM>Šã7hâûJá[i&èžš‹Â€ú �©o­LÃ�™¹�Æïâñë4ò}ÙYá45§æ  >(.j¨kwµLCdbg©ø5ø>ïÒ	Ù„U45çç«8&ou‚ß5jŠL¾ðÝNÍ�9±ü*õ}ŸÉœËhÄ¿W£Ô…Ë{Ë¿_6"‹=¤íá_ÝA
Ï&\¡®÷Óhn þ¹¶%�0‚ùù�®u}e£ù'â›°žp�:>�¾”úü}}I°„e9þâ¯»ÕòAYQËÓüC#óŸç}…/¡Þ_‰’HªåXžOüÎuò"zu®/±9gñåºŠ-®ÃW 4’-³ëu~÷™€¸J¢.ê¡2s15üþpe
ü­¼ùüöœ¹	õ$þ�__¯G$_yå}ð»pŽãá¬\Å¿üòzÊ#Õ2-þš?Ä/\ÁîlÆNœ'¾æo~~«ð´”wñÿ‡üÌ_üGj$üE|ÿ`¹ÂÓX¾Jíž­r»&~àG~{itpä ”AºÊŒrh\¢KÏþÍûdm‹šÈ…•9�iN›¨°l0f    IEND®B`‚‰PNG

   IHDR         µú7ê   xIDATx­Ð-Aáºœ€»²áÇ@‚Ç"8ÜÌÜ h³ÉŠ&¬ ¾çgÒLÈ’ =	â+�´s»4ˆ-3æLÊw‚°u'ˆ�Òöíð¯?<Gk{ ÞF�Ú×Meûööô¼'�+A¼&�²,]�òãcùÑME_ i    IEND®B`‚‰PNG

   IHDR           Ùs²  QIDATxíÔÍJQÆñçºÛˆ!^ˆ u9.ÂpcmrUbEXZ¨Ø—fR¤«Jóƒv3ÇÀ™§9œ)cxvEõþàïú¼üŒá._5ìž®A€R‡Ï:„b7ØfÛnØ°>i‚òv#7q%  ™Á!§äPÖV†×V=¹œD�A fñ13˜ÇœÛ_4ÜfGC†ð„yé
�ï Å-Bqªl²éT8€ï5Agr•Ï;ègy7]§euIœXåÄb	@ÿw n²5Ašð„Xq…?Pªób‚:¡ŒJ¬±6*�àžŠÈËMäü ÓMóÔ¯—îA‰Ç¬s?‹ÃO%ð×ÞÝ?\ç­†ÂdÁßA™ÇÊ„âäXdÑÉ�ÿƒ#MP†Y¹™& ó’baºnªÅˆZsËˆ0 ™oýÞô..eàrÙ    IEND®B`‚‰PNG

   IHDR         µú7ê   yIDATx�Ð-®AáÚÒcì•Á0(?<�À‘àºïŠV“7¡óêÛÀÉ¡#Ož¥)	�¸Ä5|'@øcÀ2Ñ•;÷Ò| qˆcøLüwCžGi^3à¤Žu[©xŸ'é–®\KóH€”U
o‰ß?|ÞUÑ�‘î}    IEND®B`‚‰PNG

   IHDR           Ùs²  IDATxíÔÏJQ†ñ÷º›1Ä„¢.G˜EÞCH›˜HCÃÊ´¿CC¶Êl×næ8çíÀ7g¾¥Hïfù,>ƒõëLœ:QúV:EÂER@ðSÉ~ž9çÜ<Î•|àøpù”?t:üPòlaÛîë·«´Ac�÷N�(})ù#Ú	gœÙ‰…à›’˜[¦LÍÈ@0Uò�£}s�_µ÷Ú|Uúá±Ê‘S%JïrÄ¿VCN9]W¼ÌÇ›Ø@p
DÍü<;‹šoBõ»Ø ±ÂžS!J/Jþˆ6æ€[^*ùÀò”}ö³nÁ¾’´y7;i5Zì)­ÅÿàZ¾$ÂB�Ëã    IEND®B`‚‰PNG

   IHDR         µú7ê   €IDATx�Ð1
Q„á¹’žÀ»j¥x¶"‚…°µÅ‚ˆ,Ä€W˜%lŠð¦XóWß”ÁÇÆ_v&Ø9†‰Ÿl¢8†wIÃ«$Ža,‰A|ŸKÞÞl°Ë¶ Ô«Ç#ÇìD°sÙ@q÷’8†[IÃµ$a{^–ì`°Î°•?Ì¥µ9,¼ïK¬    IEND®B`‚‰PNG

   IHDR           szzô   ¢IDATxí–G�AŸpvÒ	œ—pÙJf%ÓF|ÛIr×÷Õ®ëÏa Ü‘šqfi=VŸ)W–æA‚ú4Èöp6°O‚ˆ£Ä£ÿÈÐ8:J<z½Ÿw “É¤i{ùÌl$°'EcÙÒRpÿq("R1¶,­Æê“ YãÂÒHPŸÙÁÎ†õ¼ú%ÔŸ‘®ˆô †Ãaß6�F}� ^×'kú¶·9âôX    IEND®B`‚‰PNG

   IHDR         µú7ê   OIDATxc ;øÿ�!ËTßÐµ° ñÿ�¬€jÅc(ÿó@Ù²È&¼l„Æ<¨/ú€ì"|Þ<	„hÞ¤Ô¨28 !• ¨ô+#ž †    IEND®B`‚‰PNG

   IHDR           Ùs²   gIDATxc`0â“üÿÊÂ­†å?>¾v^Ùÿ”ð�tFxŒ&û‡¸,.>á°æ±.ø‹.MªþQh cZBìƒŠ‘›™NC¦$g¦Ñ¤Œ0` Æz€Q  ÜËÔ÷Ö8    IEND®B`‚‰PNG

   IHDR         µú7ê   IDATxcQàÿ;,��/aBXà0 [3áv�    IEND®B`‚‰PNG

   IHDR           Ùs²   4IDATxcŒ`Œ‚Qðÿ‘��	Þ#â6àq·Ç‰ƒ8`p RŒ‚Q0
 r
ÈeKW�d    IEND®B`‚‰PNG

   IHDR   	   	   à‘   VIDATxcxñâ.¬Ä“@ll’"@\Ä'�øº"v NâCPÉ3ÈŠ˜€Øˆ· $0á�<ƒn�#¯Ç§†Y�8ˆ÷ãV„À@\Žæ;Âá Û…øæOÕ†    IEND®B`‚‰PNG

   IHDR         VÎŽW   nIDATxcxñâ¹Xˆû`|r`â4 >
ÄgÈ5Èˆ7@8C¢Ao 4cD’7È3Ó„"ìÂáôazƒƒì€x#²‚õ:–â~jDÈ»ôO�8½K�A„½Kïb„°wa| KÜ¢¢ß*<    IEND®B`‚‰PNG

   IHDR   	   	   J˜Î›   GIDAT×c``x1é…*xqæÅÉ5/DP…@ðÐ‹¤ì¨B ¸å…ï&T!,BZÿÂYãþ1/X‘m,!€l#š» ?¢GFsçz2    IEND®B`‚‰PNG

   IHDR         üÇFÜ   \IDATxc �}/¤�g^}‘ö‚�€"0ÜðÂ¯"YLPÌb¼ŠðXŒ�Æc1B
�Å	lV´ñ…ÅÖõ¿�As8¦%&ÂL€°„Ò¤¶  hßøõåç…    IEND®B`‚‰PNG

   IHDR   	   	   J˜Î›   DIDATxc ¼è}q¶1¼{qI`÷�º0$!7ˆV¦ó¡}óT_œ 
ì!ŠlI6PÈÕ^¶/!l º‚?ù6ß5    IEND®B`‚‰PNG

   IHDR         üÇFÜ   sIDATxc 3x1áÅpÃ©Çð)ÊJƒÌJÇ«(b!Û‹M¸” eØ`î²Ã©È–°ó' úQÓù@)ô ÈÀædtEìç#œŒ©ÌE‘áÐïÃEr çc:»óSñG7Ç‹Í/6b8Óù˜N ÇùAxÐ    IEND®B`‚<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" width="60" height="120" viewBox="0 0 60 120"><svg viewBox="0 0 60 60" width="60" height="60" id="setup-connectivity-offline" y="0"><defs><clipPath id="setup-connectivity-offline-a"><path d="M0 0h60v60H0z"/></clipPath></defs><g clip-path="url(#setup-connectivity-offline-a)"><path fill="#fff" d="M0 0h60v60H0z"/><g data-name="wifi (1)" transform="translate(5 7.961)"><path data-name="Path 21" d="M50.165 13.345A34.647 34.647 0 0 0 25.375 3 34.313 34.313 0 0 0 .586 13.345a1.887 1.887 0 0 0 0 2.733l2.733 2.733a1.887 1.887 0 0 0 2.733 0 27.332 27.332 0 0 1 38.648 0 1.887 1.887 0 0 0 2.733 0l2.733-2.733a1.772 1.772 0 0 0 .586-1.366 1.52 1.52 0 0 0-.587-1.367z"/><path data-name="Path 22" d="M25.375 18.616a19 19 0 0 0-13.663 5.661 1.887 1.887 0 0 0 0 2.733l2.733 2.733a1.887 1.887 0 0 0 2.733 0 11.506 11.506 0 0 1 8.2-3.318 12.391 12.391 0 0 1 8.2 3.318 1.887 1.887 0 0 0 2.733 0l2.733-2.733a1.887 1.887 0 0 0 0-2.733 19 19 0 0 0-13.669-5.661z"/><circle data-name="Ellipse 1" cx="3.904" cy="3.904" r="3.904" transform="translate(21.471 34.231)"/></g><rect data-name="Rectangle 699" width="53" height="9" rx="4.5" transform="rotate(-45 60.178 9.05)" stroke="#fff" stroke-width="2"/></g></svg><svg viewBox="0 0 60 60" width="60" height="60" id="setup-connectivity-online" y="60"><defs><clipPath id="setup-connectivity-online-a"><path d="M0 0h60v60H0z"/></clipPath></defs><g clip-path="url(#setup-connectivity-online-a)"><path fill="#fff" d="M0 0h60v60H0z"/><g data-name="wifi (1)" transform="translate(5 8.961)"><path data-name="Path 21" d="M50.165 13.345A34.647 34.647 0 0 0 25.375 3 34.313 34.313 0 0 0 .586 13.345a1.887 1.887 0 0 0 0 2.733l2.733 2.733a1.887 1.887 0 0 0 2.733 0 27.332 27.332 0 0 1 38.648 0 1.887 1.887 0 0 0 2.733 0l2.733-2.733a1.772 1.772 0 0 0 .586-1.366 1.52 1.52 0 0 0-.587-1.367z"/><path data-name="Path 22" d="M25.375 18.616a19 19 0 0 0-13.663 5.661 1.887 1.887 0 0 0 0 2.733l2.733 2.733a1.887 1.887 0 0 0 2.733 0 11.506 11.506 0 0 1 8.2-3.318 12.391 12.391 0 0 1 8.2 3.318 1.887 1.887 0 0 0 2.733 0l2.733-2.733a1.887 1.887 0 0 0 0-2.733 19 19 0 0 0-13.669-5.661z"/><circle data-name="Ellipse 1" cx="3.904" cy="3.904" r="3.904" transform="translate(21.471 34.231)"/></g></g></svg></svg>
    ftypisom   isomiso2avc1mp41   free  {mdat  °ÿÿ¬ÜEé½æÙH·–,Ø Ù#îïx264 - core 157 r2935 545de2f - H.264/MPEG-4 AVC codec - Copyleft 2003-2018 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:-3:-3 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=2.00:0.70 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-4 threads=4 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.20 €   1eˆ„ Îþ÷ˆ2Ëoœj×rç­.­PîFx4x«Õu�Þºw•ÕD À‹µÓ-   Aš$lAçþµ*€¸   
AžBx‡g? =a   
žatCsŸ Y@   
žcjCsŸ YA   AšhI¨Ah™L#œÿþµ*€¹   Až†E,;9ÿ =a   
ž¥tCsŸ YA   
ž§jCsŸ Y@   Aš¬I¨Al™L#œÿþµ*€¸   AžÊE,;9ÿ =a   
žétCsŸ Y@   
žëjCsŸ Y@   AšðI¨Al™L!œÿþªU q   AŸE,;9ÿ =a   
Ÿ-tCsŸ YA   
Ÿ/jCsŸ Y@   A›4I¨Al™L~sÿþ©– zÀ   AŸRE,;9ÿ =a   
ŸqtCsŸ Y@   
ŸsjCsŸ Y@   A›xI¨Al™Lnsÿþ§„ ó�   AŸ–E,;9ÿ =`   
ŸµtCsŸ YA   
Ÿ·jCsŸ YA  Omoov   lmvhd              è  è                                            @                                ytrak   \tkhd                    è                                              @        x     $edts   elst         è        ñmdia    mdhd              2   2 UÄ     -hdlr        vide            VideoHandler   œminf   vmhd              $dinf   dref          url      \stbl   ¨stsd          ˜avc1                          x H   H                                        ÿÿ   2avcCd ÿá gd ¬ÙB„~\@   @  ƒÅ
e€ hëãÄÈL   pasp         stts                stss             Øctts                  
                         
                         
                         
                         
                         
                       stsc                   xstsz             é                                                                           stco          0   budta   Zmeta       !hdlr        mdirappl            -ilst   %©too   data       Lavf58.20.100‰PNG

   IHDR         µ   IDATxÚcd`    0�Ð/    IEND®B`‚<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 164.309 35.89">
  <defs>
    <style>
      .cls-1 {
        fill: #39b54a;
      }
    </style>
  </defs>
  <g id="Group_181" data-name="Group 181" transform="translate(0.007 0.043)">
    <path id="Path_1" data-name="Path 1" class="cls-1" d="M180.6,44.337V36.5h10.283l3.168,7.837Z" transform="translate(-80.219 -16.231)"/>
    <path id="Path_2" data-name="Path 2" class="cls-1" d="M55.585,16.211a5.393,5.393,0,0,1,.056.945c.222,7-4.78,13.173-12.228,16.342C30.795,28.051,20.512,17.1,19.4,2.982a29.779,29.779,0,0,1,12.173-3,27.586,27.586,0,0,1,8.115.834c0,.056.278,11.506,15.9,15.4" transform="translate(-8.62 0)"/>
    <path id="Path_3" data-name="Path 3" d="M24.065,40.782C11.058,41.171.33,33.445,0,23.606c-.111-4.78,2.168-9.171,6.059-12.506C8,23.829,16.45,34.167,27.455,40.5a33.468,33.468,0,0,1-3.391.278" transform="translate(0 -4.949)"/>
    <path id="Path_4" data-name="Path 4" d="M107.415,35.84h-5.781a1.353,1.353,0,0,1-1.334-1.334V1.434A1.353,1.353,0,0,1,101.634.1h5.781a1.353,1.353,0,0,1,1.334,1.334V15.663L120.088.711A1.281,1.281,0,0,1,121.2.1h6.726a1.654,1.654,0,0,1,.834.278,1.319,1.319,0,0,1,.222,1.834L117.2,17.053l12.84,16.508a1.262,1.262,0,0,1,.334.889,1.353,1.353,0,0,1-1.334,1.334h-6.948a1.369,1.369,0,0,1-1.056-.5l-12.34-15.953V34.506a1.305,1.305,0,0,1-1.278,1.334" transform="translate(-44.553 -0.063)"/>
    <path id="Path_5" data-name="Path 5" d="M167.637,27.29V45.966A1.353,1.353,0,0,1,166.3,47.3h-5.169a1.353,1.353,0,0,1-1.334-1.334V27.957h0a1.274,1.274,0,0,1,1.167-1.278l5.058-.723c.111,0,.167-.056.278-.056a1.442,1.442,0,0,1,1.334,1.39" transform="translate(-70.98 -11.523)"/>
    <path id="Path_6" data-name="Path 6" d="M206.551,34.951,193.211,1.99a1.644,1.644,0,0,1-.111-.556A1.353,1.353,0,0,1,194.434.1h6.225a1.387,1.387,0,0,1,1.223.834L208.219,16.5,214.5.989A1.322,1.322,0,0,1,215.723.1h.778a1.387,1.387,0,0,1,1.223.834L224,16.386,230.23.989A1.322,1.322,0,0,1,231.453.1h6.225a1.623,1.623,0,0,1,.5.111,1.33,1.33,0,0,1,.723,1.723L225.616,34.9a1.318,1.318,0,0,1-1.278.945h-.778a1.387,1.387,0,0,1-1.223-.834L216,19.443,209.72,34.951a1.322,1.322,0,0,1-1.223.889h-.778a1.443,1.443,0,0,1-1.167-.889" transform="translate(-85.771 -0.063)"/>
    <path id="Path_7" data-name="Path 7" d="M288.937,27.334V46.01a1.353,1.353,0,0,1-1.334,1.334h-5.169A1.353,1.353,0,0,1,281.1,46.01V28h0a1.274,1.274,0,0,1,1.167-1.278l5.058-.667c.111,0,.167-.056.278-.056a1.353,1.353,0,0,1,1.334,1.334" transform="translate(-124.857 -11.567)"/>
    <path id="Path_8" data-name="Path 8" class="cls-1" d="M280.734,7.792a4.061,4.061,0,0,1-.334-1.668,5.164,5.164,0,0,1,.278-1.612,4.491,4.491,0,0,1,2.335-2.335,3.945,3.945,0,0,1,1.612-.278,5.164,5.164,0,0,1,1.612.278,3.866,3.866,0,0,1,1.39.945,4.412,4.412,0,0,1,.945,1.39,3.945,3.945,0,0,1,.278,1.612,4.253,4.253,0,0,1-.333,1.668,4.412,4.412,0,0,1-.945,1.39,3.866,3.866,0,0,1-1.39.945h0a3.987,3.987,0,0,1-1.612.334,4.254,4.254,0,0,1-1.668-.334,4.313,4.313,0,0,1-1.334-.889h0c-.278-.5-.611-.945-.834-1.445" transform="translate(-124.547 -0.863)"/>
    <path id="Path_9" data-name="Path 9" class="cls-1" d="M159.534,7.792a4.061,4.061,0,0,1-.334-1.668,5.163,5.163,0,0,1,.278-1.612,4.49,4.49,0,0,1,2.335-2.335,3.945,3.945,0,0,1,1.612-.278,5.164,5.164,0,0,1,1.612.278,3.38,3.38,0,0,1,1.334.834c.056,0,.056.056.111.056a4.411,4.411,0,0,1,.945,1.39,3.945,3.945,0,0,1,.278,1.612,4.254,4.254,0,0,1-.333,1.668,4.41,4.41,0,0,1-.945,1.39,3.808,3.808,0,0,1-1.278.889.054.054,0,0,0-.056.056,3.987,3.987,0,0,1-1.612.334,4.254,4.254,0,0,1-1.668-.334,4.313,4.313,0,0,1-1.334-.889h0a4.411,4.411,0,0,1-.945-1.39" transform="translate(-70.714 -0.863)"/>
  </g>
</svg>
wOF2    -h    †˜ - Ë                    ?FFTM ` …r
‰™(‡¶X6$•p–  ‰´u[R	rGa÷‘„*º�'í=ë:µ&ÓÍ=r·*
åñö]tÜEªn£²ÿÿÿÿä¤1FÛÜ@àÕôû|­Šf“m’`›$Ø‘¡@d[BQ$([U<+(­¸@PÐ5ä`�°Ú>öP;á(‘Ñ1³ýlÛþhÔ¨¢Â)ŸÜYy”òJiéë­…Î|%Û�·^¬G‚¢3¸nž•èºÚ•Ü
ÄÍ�DŠžp\Yr ”LßPô�ƒt¥)Ë˜ï§6RÂ^"SL~ñYR×CXR	Š4�ŽæFúy\[¿è7n¡â®|sà»Œq£M»Ž%KÉÿ.Ûº,ú„÷øLÐtÿ'ö�ÉM,c÷ˆ+búÄ×‡çOýsù^Ø$…†×z.õmÅ üh&gbÞðáví‡óÉ'Š6£:°»Ãósëm£bŒ1Ø¨m0"Ç‚°¿*VŒ¨�£c£$,0ATPT´1ûô¬<í;íóÒ`æ¶'ñH?ñsÎ©:‘NDŸ¨ü©I¤$ŒT‹[�‚b4ŠÍüêìï,¯Î¼×ï½£bl6‘ºILéi}ÛŒ&à4ã”m,'ËËó#½×¥³Rw¢buÀ¶,K–Æ›âv‹Ûm_-ÀÀæ\H‹�ûŽHHþªó“êÆÂ?˜–Ómó9Pˆ­Ø)9çJ¨†$Æ½ˆœç±ô8øèÇÚÎÎ~¹;Är�n¿=$µ”Nddn!'®¦ðã;³ô¬8™¼'ÙN¦í!-JÊ¶Ó.àØú‘îX¯=,�›"`:¢ÿ		 {�ïžÜà¼ËK!'Ÿ ¡-FH”œ	‰#$~›Z_„¹�µN5VU8FÈ¯¢Ž%PÔûÝ«ÚÛû†Cp$Q¢´»Ú�r¬ì¢Ê½›îºk»kÚ§3Ù·Ñ:R%¶�2{ô‡Þ©õ’h%»)8Éö øñ
ILK�6vô#íû³îþ,;Ð¦6‡ Nš2Îhv·þïÍþëOO‘§t#…âxT‰ïªBf�ž„q^#œ®Ÿ–?{þ5bŠIâà%-WZ�ë¹b¤A£^ä1ÍÙn5ù®éŠ×¦NQ�Y'úæÝÍ–ü‘SÜ¦!t" `b3é÷%“ôï35»Ñfv;«�ÕÎlÎ¬î9œ:jgf?gr›õpÿxŸ €|ü $ e””Z(Å$w(ZrS�èv+›ZÙÏÖqöM¢ì›îÍêÝ™m?&s[öåt™S’SjŽ§9œ¯ã÷?­|ÚêñðÅ>GÌ,bDÕ·^©ôª^©ÇÝ:lŠ3Ž½NAš`«5œ26³LùpSò	Aß§/Uë
ÂÖ˜´¼³´'9\´§Õ†t¸…¯!ßööú·ý�l … PMR´š�9n€
Í`(Ê@Ò Hy)MÒdMÊ�5éÔ¤H'Ò‘šòmS<úèÛq&k¼)\Ï{;î1ÅÃmù›8Û{á‹ÕX„1Ý-3Çš�‘)‚B(„‘,û%õ“°¶¶�ÄÝýÛwŸo~¾˜tíðHW8l�ÔZ	r¤ã¿ÿ=e³ìß1+æ/ÉŽ1W?Ö°rî89PLÆÒ>uo9 Å1 tÃ˜«Ãuc§�‘îÄ@³ù]KRïbNÿ»’vû“´Ôª¨(¸"Šƒyë½»{c®ÿ�æóscz¦&®p5§å¡,j³n ¢kNÄ!ƒ.ƒn^÷øUu @|ü?vµ>÷¹¹Ü‘rUaÜHR �ú¹×øÕ‘ “óID‰ßË‹Q¿½~pé
€Ü�;;¸nùù�L$¡tù	:	hFCY¡íÞTO FNN~}ñ1"`³¨üŸØaÏË(Í?H —–‡Ä\–ÍåuÊ0LÔµõñ'µíº½¾Í”PbnmO¿˜ë¶Ýý�¿Jl‹?žås«çˆ0,8ŒxÉBòúö¾BÇå‘F‰Ÿ_ßRiZøÿ·Ô~e#j°±wýhOc*&F6¬YqÁ’{‰}?Éó>÷uû¶.ó4Îh%g”`§&×ç ¸Ë)©¬R5åHŒ}±§ÿË¤°kÜ©Û�'J™ÞO¿ IˆÛ¶�_ï³‘qOb'ÖHÇŸ BYEM£6Èv„�5ªNJåOˆNFNx(1’:\ºß«CàkŽc b8Qô	dá[L(el+2u-îÐaÖ˜d¢Ž5;¢N$Ôö"¢Hª�«SFºoë2i¨"ŠÙ\³h7IŒö <SCO­¸–È�H âEw!.×éý!BSCªgÄ�‰cã¹äs*Õ§s‰(5m”=qÆÊŠe¢ûñY‘$ë\>fN8€q—Œxê#v
¥6umï	à�°`ÛNM-J \ôF·ÇréD€µZÓ0“#'ê¥ˆnìÒGjL‚Ú†XÊŒ¢Aª�ñgYs™*²YÊÜÇ^Ùµ˜;"Ø$hb=¹Ï›˜0ÞvH<—Vv�c›_ \YŠì£èw;dBƒ‹Nƒ„3!$Îçç´çâÞI|P˜ ~&ädÅ.ÈÔ°é-aóúa	++Â’9º.mRøé4ãcy¯ž¹#‹UÕÂFWîu½Ü	i/ðœ¯”f~€4ÝðlƒëXSô9Ã„÷1E�ð½3@�ýÚkˆÜ@'#£¼¶c¬½Ùnê© ºñïS_;¬%ûîIŠÐÁ+»ø.óLØCx±ëî¾úê†±w	ÚÍVÛ‚€�º¨á¤ÀÃùExf~H`½é0¼!d”è@Q{Oh1‰±HÁ¶FÃ«Õzs�7óÝ‰¶³ÆœtrvÌè©Òk�»†heS3·Û‡v™9„q|«O‚ï—K)•U\ò–AÒ%£¹»Äo{l<†ÛK¸ÿº�ÍŽ¢¤Ži³�ñHëG€I…z�=6šWWo0ëÙ|Þ%A÷jdD)!€©pw®Èî_‚³ë;¸ñ¦Ûc—D#éÿË�M�ÀÞNzœò·p°^�CDxÞÂxj)„5OÈ9û¡`ÑÒEDXîxñ� Ý’GUÈÀíË¯Ä™ª©ïÖÚ‰œ.%·¿¶Îˆ±~ãñú=ÿCo¦)F„7óÊç$Z¤ý(·gÁëoB­§ÛÆœÀ@Þå&òÃÚeî{êâåŽ£ l °fŠ_ÆRx™N[§]®›8`-3™s´¦Á’{PjÞ¸Wuc9ï…¸®©„[>ê-Ÿ.D¢ÜŽYú÷›€d‡ÏÂØ¢²+^{“®¹Cî÷‰±màÄÙð,¦±@N<²�ÚÙÐøò‰¯.�”VñæMðÚSì+Ó\Dž+¢ÚR¢|Ñ6µâ'q\TàÝ¦•ó9‡D„X<$íp‰€Þ"»é…¦’ü$›Ò·Þ,ùp»sù¥TÓÎÝþ¯b»ÿÔNkI‘_æ¡`Õæ
FèˆêW“ŸVÿ”%ÙÑw­~©¤ÄDÔ�ÙÂËÝ*ó³xiò¸y[rZª‡ ™[S%´G›Üs`F<ã…£…³¬ ¢ÁV‹+þó!+­–÷õŠ¸Ø�‹9yŸkÅÁfb‘82ÞsÞ}l;[)e$Äø‰T�†–k­ƒ’à)šv�¶©9¬„ã§{Óuòu�t�ÈÞ³@Eãô>|CöÚ<\4%—Rvá¥¶éåÄèªÚô@×ºCÌ8\‘ø~)#k|¾¹.aëoªºÚº00G”q0%ñüð¡™hp‹©ºLÿœÞ"Œ+>Žìæµ%ª^MËŠ˜NšsÓÈqŽ´=•°¾îåä¦†°K4rç-*ïç%èÚh#×%;pPé¦”hÖC=÷ÎúÚÚ—å&)©ba„ÆKLø@¿ùžätº!¢~2íS]rYlºZ6Ð3ÑžJÞo´˜O£Võ;¹h&gO5’RTˆ/}ùÁÒÆ{®¥òAZÒ&‡SóâÙtØÊùœÏÍ¯é¢PêëC¡¤¢0´¶D,ûpbpÐ·Ôz)§ ]€I÷> Q\BlÁ"º—^3R>rý*û»C>Àƒ§áxPUºz­}Y=õÌ•¼}õÐ¶Çš
ç6-`/"H
o…&’D—I0ÿE2Xa‰•-©{5À�™<,}”Ñ``6úÇí�ji¢éØim<UujY©ZújB\@ŒgË3Ejfp–ø˜Ÿ:ºÚíêWÛÇ®ŸºÙß³Žœ”Îp¥Ä³3ao¯û�1ˆda‹ø œ·Ý«¥ýˆ™J‚×²? jÎq7®¾MÃæÎff™YµfËÔs°$›œ	„•Hý‘æ¬l¥–õ¹¿Àˆ—(%.›rãÒw?ò¾m=~‚y²cY‘bg)<ËW„ /VxÚk©´’$çó�Bðr~ñ†§Óð9Þ6�0Ñ&þ™_vM YÂ%„“Ò�{æE‰6<Ãé•ÇÂíÛ%‹%«4­‹Žß OÞ@ïóNáù¡‚ª"Z·ßOD{u3SŒÇW‹M°•R§í3s<Ãõ§‘Ø³£€¦ñ°\I0�«. Å-2Ý­ìÏã„­;¯	ìƒ0Õ¶}N«/bõöŽN{„I™³|b_rÄeø�_pSiƒãÊ>'Üw¬5üÛúRF,Ñ‡ˆ%SY–„»ÆWh£6L_iìƒ£=š›¾i1ñ3þYI7N¸Cp�IÉðÄ”¾Ã(¨r¯¾½0«Ý{j‰÷º…r‹K¼ž™åÐ¢o)lÙÄô‡3na¿T1\§ÃIE(ém½÷²½ßƒ›“ÂDôlú¬e³³Çæ$Ã…ßwXžˆÌU¬ü(@•„®÷Mõa"n¬,ä*vG³–‰Ì¨x¹Š®>•GÙS‚ƒ€î½gÀÌ‰"”QËv¤b0*zÛÈPEôyÁÉ‰Œ?7¯$ÁŽØð%ž‰G‡ÒÑäpÉdYÈ&fâ!íûÇa6”Ž|¨)¿;u7#Â3É4�mJÄ³Ûø
o÷ö‰Oøp­È�¢v8j ê™üx(KË/ZÜd»Š�xÉÅƒým7VÑ_\§f×Lå7p›Xózì…H7¾-«–µ,(1KHb­e�¨,r-£ p¡LËïÆí 3=æT˜Æ2©t‘2Ù¼X–k:©´µÿZ€5ÀÏs‰pˆÒSsT«¸Õë:.]µ·D"”@°õ-¶E·Ì‘!”A�ð‘2ºÉ¶-ðF}±Ë’€2BÇƒ’�Q™Õà)tÅÃ§|Ú#4„|Ü\÷ã¨€ðÈ`·fc,¶Ÿ#Ôg‰é1:Ù-Ö«¡¹ty Û]û‡˜àä2¯Z~±„ .)ãé®óô³×ÇŒàÖµ¡Ü%R¥K�˜«¿(y�`‘8–¶C×ÇÖ�ú·Ë÷z“ºŠK-NŽ„óõ`^+¦õ‹žn¢¨‹3¹ÛÏ´þåô€�•T�ò3‚tQáØ£©4<>:J0Ãˆ%åÝ‘Zab`è½êvÍ¬ü†aöT/ZúœaÞ�ÇÐ“Ii	›W1�üñýƒ_©�>)Ãú—¾H"”Šùãép’ëƒ|7mFµ^ZÏÍ~f‹0Jñê^ ÉI‘Ü3V¹!é¥Ü{Ó<eÌ/=Îp`Ú×Þq­ž 8^öÔÙÓÁK8ÌëOÍ9öw0ÓêZ�´|ŠÜv?‘nÃ	à3—�f�!ýËß·Ñ~•üTŠ §äûÁÊò JÓ›¥û„ß5×Áp¦�ºV	¼ß3‡Ë«¸Å×ó.=ÆñÌî�-}§Ü[ÎgåRá5«ó�ónì£B8á‘÷ƒ™3.»Ò8	Yg¡#0ß&¸½¯S„/.fg\
Eâfç}�È,k‡¢”é“güû$¹?XY“*�ú”©º¼1¯�p­—E(¿×ëòRS’¤Qº˜tžî6, Qãj\ðã</]N®sûÍ¥;Í'HX]ŽE˜29�‡d¦kYýÙj�ŽÂR6ÑÔí÷Q!˜Ê êî÷ V†»™
%"^Ð`—N3OòŒ¢ú†ƒ¬[ñv:àÊ„:Ùè^Úœr×¿ç@êÒì
�FÅ_®×åNcÌBÒñýÃ8p£\i¯¢µ×7Ïî‹gå­*î�ÑÍý,ƒC«�Âá[‡6´T’?ººµ…%òzûÅ@jApBN5ðž"4Tž¥àô"–}0uJô‡�ž–Èœ~3öÙÑ{}uWöŒàîM“jú9È-‚]õ«�™'lS² /ðR><¥+çOŸ•ÛØeB#•BcÒÙÀèjL\£Ä-¾Zh•[×úI<�ªüñ„q¨vÞ~–k]›GÃÎÕTD¿?S©ËÙÖ/Æ-Ô×%Ý’‰”Ùè7ˆþw¦i|CËI¡Äqñwc¨€W›xš± Ï/7�x¬‚HO/®åµðo]‘ž”G]Šy�ßƒëü‡û#…‡7©�bÍã$“tÇªRÛ$ ¾˜é]ã´a7ÍF£Ñ®¯²�,n!rËßI|2À¼ã¸8ê’xÿ6ç™gS¦h±	²“R^^“D.øxŠMÑMS?æ¼ž'Gú#ü~á+�¬ºÄìv4Šd!FyTÜ9ñ-²fVa7hûB®Ë4þ«Ÿ–è,©2¼Æ‰Äý&vTHMqpð4?R\´½²ª¾Xa<‘Ø4î–@Mi¬HÔD_¾è	›EgªÏR‰y±MšÓÑlTþØ JÝ®«–ycÊÎ"™HJô, 6Šuö/Ú´›â­�À‹”é‰yŽ —VËÙænJnÛŸH\PÅR£Bd|Ó4¹_èŽ$kîœËÆÀÆ.¹šwê–ÊÂ™I pS½ý$äü–|}jÎÖô9ÈÚä¤éÃþ¡m‡|ƒ1Ñß˜ž··ün¾93ƒ9¾ëî¬�Ô5qSú|†›ŸxWí9ÚÜìÍêB²–VZ!º™¸Ëm§K/ûLn;i«îu³í$æ*Ît3ÖÍ¶Œ×@} °¤´B{õYïâ¸äŸÔ‘”z«2Jçu@ßa÷\Mû‰‡R7o³ódzè ¨ ›e³ò7Þ/$4]^•Á¿2kŠh$Œ=% ‰å1îIçBÒØƒ ƒÏH|øN.[ÉM\L—ŒûbÚíÚé1Mgæò:�NV._0± ,ž+á,¸¤hÝt7´l8�s~IV^NåË¼Mò²ÃøØ‘jäÜÙƒ-¢	oÜ®Å¯QäÁo[mˆ jé=rœüm>ñ~z4$Mšá}z Õï›€s ‹h""ž‡ìu7·V{RÃ»Ý¦ ¸O-ž…D9VÖÙ¥g†IÊŽKìLgÛ¶BÿT¨óPµ'‡KÏÊÌ¦ï
qW„Ö’ó3e¶³¥ÿpä†&�–ˆÛ’‰æL‹hp³ª§ÕNƒaS®£wù¡
&˜Ôâ…;e(‡,-7vÊx£-¿Ûw$W©ÏnXóUŸž‡…¸‰ê÷Æt8‰›µ‘™YçŠº?KMŸct»YØƒ¾p*Õ‡Žú‰‹â-í„îËÐ‘fL¬|Â[nLŠçœ}4‰{5Ùé  £3á§ŒˆnŠ°”$$,+£DNÔ„-HíV>˜×H¦Ž˜ÚùOs\·ÿ•-Ñ;ÀW6 Nø•M‰Ý8²�Fi•‘Ô;¾�¥7kó2±6%Ö’Ìa],:!�Ê²Ú½E,ŸÞ{U„þnaw»±ù…Ng¡†.­òI9r:j „ÿ’Œ°<IEµ1ð`$`LbrÇ’„�×�êÎ]åxâ9=Rv&*Q5è€0zóËøy<ˆàêƒ`M|öÔ™šdO†Ù¥iZ®ãÅ$®î»+#KHÈF
�ÃéÄêí¾ƒ §Ž	îÈø‰§�)-	¾:M$Ëyc ®EÀ%Ai•’2]–˜Ìlå¶¨�‰šÍ8†I¼y²ÒZGJ³ƒ¢®\Õ2Ö™Xb¿L¾öðŸIÂA-ýGrR !Í0  ÛL+ÀQhªSóYÔÒ×òS¿5ý_Ø(¥poFš§T‰‡¯#kNÛ¾êl|r‡n³d×H –ÜyÛŠæùîäÈ&Û†xãp°Á÷áå[é8G†þÙdt¬¢¬£±zì°ƒÙ¦	8´´B½®KP"@2eŒeæ”¬yæxç§Új½¸œ•JKÂˆhÁXÅ¬Bì}ê¦6ùÃ¢ÿµ`?µi‘*¼[9e+bÑVLïaLÍ™³¦ŸédBYp.³Ïˆ
Æn\4ìç³…Æ¤ŠÜ�dì<w ßW"ÏÓ? Ÿ'¹O%�a2Nÿ9‹­,¹ßŸ¡¶ê!›Åâ.Óy—Zù¯%ò4öUÄõ^úËu Ï†âg )M%– çCõÎVé©šžÊM!zÔ&��¼íÙ|DÂ,¦iõ~R,%±ú|O"¾ûÙäÏh\3+£òüa«½œâç€ƒžˆÐi8“‚\$!1™LŠåa6s¶z+MÂR­bçÒ_
kàµvËjÄÝé�Uø¯è£’-‚ÃjXúGt•˜¿À¦•b˜~ˆËšÀ“ê–ºwtÑù­ŠÍ�§SkPÖ2ÿŒ (=cvtó¢"ž[3™É&¶­hêDNˆ=·òˆŽ‹PÉ›ôA´G’ùÂ'_èR#¨ÆM:.×ìŸ3€	ÅîÖtJ~œä3zwx À”Ø;˜7ºéO¤8œÉY)
ÉDSEø®„ß/€¤ÔÌ7—ià�!wyÊ6Àê´$ �8E0êTaÞŒû|@Æÿgúê×ñ.;mÉ´ï9à9ÁsÝHrL7&ª¤’‘Ž3BsàŽ|[o&ouÚSg÷Õ­®+{¡AE¿ßåkZâ	¤"NâŠdê5ƒ¢:š˜IVµ¢ÚŠ•>«Fíb¬K…ÇÎ¨f)*c–¦G5<óÌC ˜ Ÿ•.gô]¨ë¯k–’
¶¥� A0ã¾-¾ÓÙ£¦©v†T ¸d4K(¨ÅYq`²ª›(uÝå{,½:0*$|2ìƒš‹/IºË,“`E¼†èØñxP®³#q„°¯ÏÌ` ›à/ë:ê€ÈÒÓÖ';�Ù‰V‡D)Ë´ÎrÉüã�ö89¾w¢}[ú†F¬ˆËë¢ùÞœÎ·œ¾¡+åÒÂšhžKHÞ\àÇšUŠŽ¨ä¬‚JÀV$pUj™|c0ËîÜ{¯ÞÇLóëA«Ú?èVæ=§4�òïSºÅ´t`õÅÆd™ÿ‰oüÙd¥bUP”ÌðJ¥xÑg¤®JRør�O…¹Ïs	óÆÁ‘¡Ú4Mw˜©Üè""ö42÷áèà`MÄñDº/N!‰Õv‚3Õ¹·ò�á.Œf+“@xO—VÈqê›j^×Cßª©Km®÷Ÿ,â±8H9ŒZ¨¬<&¸o¶…(Ñ@ÿ°k©ñßÖM5›ó�¡]±M…¸U2=vpB6DXj`©rªò<õw•Æ1æ™YÐ:Õ ço‘<¿ 9¢;Œ�øŽFÀÕú“$;2Öœ×j´±úÞºìx,ËÊ��CÅRÄ‰t¸°$ƒVJfÁfˆÅ9Ç) ¯a™9P‰«&àøÑÅ6Oo¾Öl©<�Ôóâòïds=#3Ås�µP-ÐbD Ôü"�ì[:°wÉº^jù‰Ó�»ÐQej`Œ‹—Tq’=¢ú±”H&£o�¡kÄ‰LDÞW¡Oû†Âù”ëÊ*J3s[Î6�j1ð@ÙØnr<®Î¾Û‡†#‰ÍÒ@	ˆ0¿›c	¢�™?ïµ�<2ŠDÕÓ¦	¿è}¯°TsÍÙSÎýÐ"âRÍ
®•¤.}ßoZÞÍã‡ùFo*˜•§Ý—‡¶ÿ·–µ:ÝôÖÁ“¼Á7Éí÷HÂòä�š¥x¡´]ÅÛÇa6v5íRý Ì¾e1‡í$XL…›ºÃ
J‰aašÝ†,Æóì„�Ì"3-ÏGä!Ë¥8³·ò8
|àT:SÞP“Œ¸¶õñpMR®YÞbôæ¥{ï+»OýeÛ›2öò×g§©Óu®ç÷V=úU>-Åkb6UŸ’’Ð©pZâM½ÐO¨`ÿ²Ü$WèDÁyŽ¹ñAß»£[À4�üa‘üJ?®fD?=—ï‘‰d°¯(KDä´±:âœD“/[å#¢õ$AÅû#KH.:•žx?%æÛVôr·@[B$Ì}žcñoá“ÛS6`LPfM&É”€›A<:Š®v�žÃš
QÒ~Pßw¡’ï[ëí+÷ž­‘†�û`+j£ VßÇ+�žR*ã¶µu£l!£þê|þ+'¯KYþ6›6¶Í_ë–udÒ}_‡¬Ü[ÿyuÛ˜•jŽ¥ °»o$ÆãY= yjRœi)‹™b�Ô‹LaD(½XýUÊwI«Ú»Z€$ô7Ú»î9¹ú&™Ö4ZÃÝÖ'Œ“DFŸõÝ[N]Å~ædD?VðöQ•W¡ÍÍ²�}vS>ÁNm÷ÉÃ+SÞqð¸H°ÿaÿúÊU!÷Î’¯æ†‰ÚWb_+¥«�™èUôþO]Š^¿ìül59	@Åä1æ'ëàÙAŸ^þƒmìªýÉ²o±:›Á9¸×££s›-Ý N:»˜€tD-ÆzkS·êjµa4íŸrc´zFûÛ» Þ¿á„xÿÚvˆ÷7[ ¼Ã¤C8–#7¶p5ß+³†³ â~*…bJJYÜzÖ³w+üµÍÙï-Èêp™/LÌL[cgØ÷ÑÍnôlc¸“aÿP‰†ÔËH«Fç¿»¾›$}Ò9`£¡ËÖ°‘\
‚ô83æYmð1b>¿~Æ½J®ùØ‚¯Ï�ÉüyBs="’†èÌÃfí(zK‰÷MÅ"�H`åÆwµc½Ed…ê:b8®6(9°‰<ïÉcÿl�Ý˜/…½ük�›gêG¤´½Œ‘°ÉÚà^ESE)5ÖGë_^½�kß‡òv‰¿ÕÌšÓ}T3ÿ;6ñ WvTCP_ öÐkóÂêŒ._e¼àÑ”NJÓL {TÉ!³Š6“j>høœ0Ýº#ç†ÝÙ[¯êã—š©À†ÌKÃ±z“,þ!Ú3ˆ¦Ò2˜ç�¶:6d>¥himEÖ\Ì=ðHºÔZ+{6œ¬@WÊÊ¯&lC'Â,’ÐrX !8Ÿ(\ãÌ­2˜-ÁP8hèï@’C4š�<~³¡ÙîZ7j%)eþ´ÅëeFËüpZê'15±Ó^6BƒÍÈ3¸nc™o#~ºˆÂÂ²q˜¯RÛ@!Õ¡÷Ð zÃ^ÝKs]TÞ@ƒTN³T …,S*@7ÐÙC¾¯‰Ä«ÛÉ…˜ö“’L�¨iQ†N•,„Ä	#:åÎRÑª»ˆ¥jø’9—â1€-‚Y™—PÇNÂ¿ Š\&¹yL8¯Ó¹Í÷‰&0Ëc’ÁvðÆ‰\ŽÀŠ¡òJµAÊÍ;¤òQ;•]…‰ýI´M8	Ùs¯ªØMfô?Ô°¡Iš²r»r!ÒK†9Ñ�8pÙ}Q¿ì½�‹çgû-„*smµ~ÅX×P0døM^µð?DÅdI‚m<†¨p;¡yŽ,"Û¦¦6­ävÊpT\^ÊnôÛ÷¾3m¤>8¤eC®ñÜN}­ÍêícÃ æÙ­$s7Û¼úœ#Õµ<SF-Aº§ ä†ùz¬Òâ‰±Ï
€B�	*{¸6cg‰‡±Tz­GX2+“‚ÍöÙÿa¶œ0›†¤ÿ;æ �EEaG˜dñÎ˜ ×¿À[ïªM ¼«á
®iðžÓgôÒ:Bˆ[Ä	Uú¹­3½J9Ý0ÊšI¾2'	o«ý“Ð\e %4^5}£†¶æ5‚Ôý Ò0=óžÁJÇ}mäy°&©¨©Ï"‘þ.cÖ‚	V»ñ}eçJßÚë:42q`GÌOô¦›-•òœ¯Áã-B”‹î™J—F¸éYÃÛ¾¢3|ÿÅ|)ÉäŠàó¬ºêöIGîÌÁa¾éž¢+ï*½ïttPbïö‚ïAÝDo?CŽ¡g´tó´õÐ;ò¸ÄIË]G…˜2RE<^•mK3”¬÷§+á¬;ßš[‹ªË3ËÚù�[1°¼Á½y„v¸…�
#ªÜpß<jÔiCÓafæ~\çG¤C¥4îÂÞdubt B K—ÂõÐ±Qm½=Îa›¦›Tq<­ö^zçØ¡ñ¯(ËÞ¹–G~QÛ¼ZoOøÖcç†à”r>R¥{bº¹4¦÷ËvM�q„³ƒl)<‹V”{Ä›æ™�±2P™ úT€'DØ
Vt»�¼Îò�‡oP­aU’Éã6`ˆ ÿ"Â��Qeï]ka-ß^<xjŸ<äG.ÛÙÕ~­¥¶×ëÅéô5Û¹½Û¯]ÓVú¾`8Ï¦¾Ž—ø%¹½»r×y£vÑô›ó’œ;ãÛpcÿ÷…êµýè›üÊÓÝ` ›Ù˜½uÒ™Áí9q¹ïq›E©Ä©Ò¹æÍìBÅÒç§Û6ØÇ‘a·eÜÁ¶EõØ«OâY”ú­Ç‘#:yëp€Æé/!/¥¿5s‘§–U'! àë"|‡�¥Bã¡ª¨
ãt\�T#âóÒÒ�MŽ$+2n_ÅäÞ ‘º¾bÓÚâ^§&õ±�’ª™�ÈeÃéi™¦càIê=„úu%E¦£ŒÈ­óÖ“
ÍÊÓfj°aØ¸Ö� “ÎÍEÀÓ�àâ«_Ñeöœà(r}òžmo9ºûUP6zH$g°4ñÙº6©Pó÷@@âX(1ÍÎ˜Í áx_	Jy½{•3Úæ­',¾ƒñãMë1n›Ø…>vðOêô†Õ³†ýøÄjþß˜Ö°rÍ1ãf4csº_%v%l“ãKßZNi’+Vøî3ß'·¤ÄÔà~ç”ëN›MàG@HïäBîb+ÓýÊî§vÝVFq@›Ý±uKZ�hªp@ìíE0÷ø�¿äua�—ÎòSXd„î…U¸“˜K}Ô¯Ò8G�XÇKiI¬‚í£%šÇûƒ uR)±Ežà’I-¨Ú–8œÆ|1ÖËG€Îžàæf6ëÈ€î=!KÀF6’Qf[X±ÒÚ~Àô—_�àj¢\^êÍ‹^k…”š�`“ˆþùDøµsõG]~–ã¤›yoŠ}ŽÑ;+i%‹N}‡Q¼œ0¿åþÔ¥íU¿Éu)M¶Ý[ÆZ`"Ÿ7¹â?/[Cä{Ìlñ‚)ò$Mr‰õÀš|^º‘	a™»â·þ§:ˆ Í"éÖŠ�Ûa	Âlò>Þh Çáy¢€aÑÎ{ž2>¯þCP®‰�°LÅ šj?ÑntgåžØÓ]¦áSˆ¸øø{áµUÓ‡‘('³µbç£'f�æg0ÓƒÝê•ÄLPA¥MtdÌ)ã³2ÃºãY!Öv Ž&`o…¯þ2P[�aÞ”„»5ûÀS‡|#+€²7J¤Š
#È¸Ì_«ÕdU©¤6#VD®†À›B"Kƒ÷Ö|¢¸ÀÁ€)o�ÐªtkýlšæÈ,®ûlè¡ëóUì)Ý¹e˜5�<Aº°\0œëž_ì7ØÙöí^~{Ø$qR‚Î°f“ûëP
a!f—´ùXUƒ²³hXò¢lÛ½^Áñ:(Ÿm ?’Å@=bhg™ÝOÍ–{-“iÐ:’'´A‹8?gÂðzHFz0÷[D#ã�AŒ.öàº%'¶€w­=23¤É¸·�Z'ò¡Hx†“ª»î›&I�’4Ð1Iï�Ji¤­¿›eèz”ÚÌÓÍ�—ýoâÙ´›�{ƒ©�þ°içÃŸ8	0[ËK¸/în*í¨a5óÒíá°‰ê,c�˜¬èû˜±×+šÕA¾·BDrlDo¸Ÿñ"$ThÚTµ™Š¢9æ®$Æå²£éþ'÷òö¼øá0Vˆ'|ã"Ï’˜âë€ô¡
À‘×S–AJ!”Õ�ß‘Ò6ÆF6R\Š6\¿»9´-ø_=¦ÁQ³"9IW.\.zmkzËFÍµUôx<9ßÐÉ‘ª$Æ7iüFSéïÏáþÊ§bß‚@þÛ¨ê”}úÏuåôoö¡þÏ¾¼ÞÑªj½4=¤îþºã¥oeUKæxdéW˜ë»¸1nD¥XÍõ˜åy–"�®é5å€˜ÀÊ‚‚×•ÕK•ìÑû¤¿-¤o7B"´àÄ›)˜¥uWâÑEÁh9¬Àb)Pä%.–$„GœÁ(@(‘ñu£ÖR�ìfLT ÏªJ6éÎê)H*yÓßñèŸ=ÎÒÌQ/«ÝÒØuI.½º<�Ûï�Á,–°r#‚y|¾lÉ<`úÆQùê=ÄûÔùë©F$è«ÒA’té˜�2Úì”d6cÌó‚WÇ¥ä‡£4~ö%ïvbüaÿÐ•_CÕ®ãYÞl‡Ì¨Îvq¤€s$m:°Gßôã\¼W[ö³©³C	ålñô}ÓRÅ^Ÿ2J©I6ÞXül9¡è¯=ñÿûƒŒ`týÓ‘ï/õ”ƒP¬Ùjes"œ©_¬L�Äw§m«Ë~À¦XºâÍNûMï1x¿ÕªÙ›#¸êNmzSï�%b·–,ïòã Å½›~²B�î	`ÿ9ïõVu6Uª}ÖºG¦¬uñn‹wO¾µ¯°çfsC—\�²½ÏþÛÏgý´‡¸þ¹³V—ëÎ¦®�@›¶ýâ¬:ª_`c+}ñýþL•<Ñ[´�#U«Ö*|Ðæ­º[“Û[å§™ëºÔ§o¸ÊÉ¼¹¿\=GRøK,![<‹¾Hã?Ž…;…9áøÆ�:‘ÔIÍ£+¾Ìaþ˜ù!¿·í*�È?#’'GÐã=ŸíÄQ6›,ãgËm&;¶‡ˆÔó×Îë¹ÙXæ•…0òõá
ùÀ€“�ì�;qW©qÍ'«4Œ®IðCµgíÜñÎƒY­`Æ~`6ix0OGºg`ÎîÞ[~“à?NCàQ@êøÈ„6æ�NÎ�„ªžA}jÀŽBaóÁ3íÅ¥)êÃÏË´:qºI« í¯žÁgZ¾2Ïvlf,ßÐ£¢ÎY¿ó‡Ñ®ìÝbÔ©êùžÙXoÃIÄ—ËœÝX¨�¢_'ÄòÃ5õÇ]J„¸ü2PÒ92°¨CÍ‰úÔÿý@ñ™¦C¥ †ù›6EŸeÑ B@‹è¬ßA‘9”ß‡ÃçæÇ´èy] õHñ	‰-à Ûb¶¨9ÑðOõ0uw§¬IâÈñ¦7J¦x•Å«2¯ó\ÊVf=nV‘V€«¤Ð"#9“¬Öv8x
û¶mpAhöÓèyâ‘3‚»pQ	%äÐt^¯‘Ø |ƒÂ‚]�YB8jC×¬nÄ#&ËÉ‡îü½ðÊ´v¬Ë’P¡>–O¡©§““¯‰yµUAt2Ð_·àýîñÑîòn53e*ƒƒ1»““vô°´Þ(K_HµvVËÊ‰3},ÕÆA´CàUÆ�Ø‚”Cu™«Ét¬ùiÎ-]¹`æÎÖéùÌ7„]Ræ!zs²Nû–t£Š‘&¾ÅÌ‰Ì„k)¼ÎSL¥Íô›„Ì¹®y7‚ª$´°Ï¥DJ®NÊdåì"‰Ôù9é
æ31 IÍ—Z(^(lw6/õ@ŽYŠBŽ^ÞØÙ}°OT~9c¾cÂòŽ]ùš•{â)ËÝ}î¹D8í${ûðÞÇyc–,Ê¤€{ötAºW3zHIº«mÃðDÆ4Ü¤UýÚT3d¦IÒ�óD’)ŒàIÛ¬�.dë~é[-ûK–^2€Zc“Ú
Ý8ýƒu¾,Yé´^\Ù_¦¬Ô�Á_ø+ÚcJ¥Ú$£\2:ZWæÕbÔB íw=×Ú[1'NŸYVz4“;³ü(—fzN§ÄàU�óf(pÖ™à!x×#ƒ—à¶ÏL©=#Å‹TåhnÓb‹äaË³"ÖÅ,ÌTâ\oÔ!‚ð@@sN%¦Ö|
•ÇçtèäXj»	j³Ó	¿Qo5ºýŠ�˜¹³ío�eF)oùô�� ë9Ë·Ï:áh*'cJåõå­�˜¼[ÎÙ{È„Nf¥nz™]8F¿/ê§|’º1Êvíÿg@ÔJ:±YÌïÕ¶NuÚ:¢dêæhH¬¢ðöo
¡ø¿»t¼M�Æ`„„RÌ�¿Rô÷iÁ:|NÛ_P" ¢ýˆB@°¹´È m`ažõ‹¢:Mý‹Ð	c2ËÅ¨<È¦ýØ“´–U�O�S’\�� %a\Aºpçôäøê„¯ò±½eÆ\æÈA’¬©©›.Ì°{§Öë¬w†Ç¿~<dXIhÁýRN½gkvàæoÜ{n¦Ôœ¢}�×îH|e¬iV•W©¡ØÇ?¡Ì#Í(K:´¹m`ï&æLþx^F®’+'¥Ý™ëÆØœZæ…‰²”Å�1?^ëE¦( Ý�øDà©Èuä‰ò6¯áTÂ˜ïû�íÁ¡LSŽ»6O±amïÚdëÊ™yÇ2øÐú™|’^ØSÞKð¤½}*Œ2L/Å˜)Ï h~÷›Âò\1íÉ D¹Ì…Œ÷è$¦Õ1“G/Î•o©€0^êÛú‡û_|q,Á­|«ü`þÜ·*zð|”¦Æ'ìusvƒj(qà«R«‰zL>ÑÍ6ÿŽº™¿ˆ	ø;s2ƒÅ‹`ø±…W‹`ýTyP÷g¨ee0‡÷íô00ê}/Ç”¼�;h[tGùD»5Ö^E¿Æ#ãh÷È�:f?	ûu3z0ïÚŽï$êT¨¨ž^TÏAhz—	—x
èI{�Ý5¦èÎÝÀŒ‹ø'ärÂü¥K
€›zŽo lÖ¢<ºžÕNl²Œ�f¨§M*Ì~ÐUÊ�‡WóÚ_Ÿ?–v;(A€…¨ÍºÚRÃ^ÿ 3·=6Ò6=2ænë~}c¯½�O7“X†•àdº¬JÖ|�ÞLPœÞ�~Í…©úñ8š+QDìôà\¯ÔæÒ­Ã­SÃ\§=÷UÙvÌMä…šc"aû«K;ÏA®=Ô¨Äš©”¹Ök�J„N€p›èM%AR`ÑÙˆ;Øù(û½‡5ÃWš½Û=µ‹†Y �g-ä^v4�ÐX®Ù‰ú…JØ@î×=øcÇ3Åêüì}Ê*)u’ÖÊÿb¼T¹Fš'Ó|¹N3—Á¹æEßÞ ²Î9‰»Úª)1�Ð!GÛ½÷k8’­6”Dï
~H¯¸½GpÀ%¨Fz3î2ÁÄMßJ¢aZÞÖ?«c�àn0ž)?‹háN€ÀužÏš²þm3HŽ~²ÁÛÊ1rDü'½¬Ö×1ûžàÇÕ‘Kr�t›sJÔJs¾£Ùö³¦¾Ö¸U×ÌÏÍõž2´õr^ +hNzg–±l0'\/e‘ÛtXÔ�Óv�l Éjçcm}!QÖÏ¼Žãt#Ôæzˆ¶#]ÛÕÚ¡Ï•×ÞOœÑ×‡jEá:“#	÷6�n:<‘NçÍÑuÇi±¦�áÉ{…zÞµ×1Êž¤êþã£ëUVÉòlý+ÑaÂNðÂW«ä�Éh»Ë)O§2ymElÙ¤¯AÖÕ7¤¥«YQpðö±fB¬Š<8ŠŸ…»;Æ�åô–ø'gKR5n™öÌæ½ÁT@	®n¼*¶ƒ!=a5‰ž¬¢¡ƒˆ°Z~CW—ÑP^DX-Xf§jèüN€Å±½q4ÿOÁI@ùèSÒúÀû}òXh/í>Ü,b–ãçó89µÉôî-:G|W‘’)ÝÞbßûAÇêø5G“Þ<*Ù•ÛÚ:ÄŸ£!]gj~«Oß&ÿ‹U‡Në¢¹8×Û ®ø”å‡gñ]-WW(Wì‡NI¼3ºÃNÒÆgrãž3|·’mòm� '=[n”íž¬M,?æŒ$°ÑHD®“D²-®ÛO?5uX­]Ë“ìÓ3ú7ù>«*æ‡w€g?š¨•*!’éøúJyT¢@U³gÎÓzÅÑIñº•Ï_¤…7Ò&ò\tŒðH.YñZæ(4Y'ëdÂ×T‡‘F¸Òs¼-ìqyºa­7Ó[�„67K&ÃJˆ/$à±c/ÃÔxŒ÷½[Ä¡€á¶�;÷Äª¢z1Fvø§]G„'Ú�êQ¯BSOÂû‰•å»íéýÐ†$Ðy™(ÞðTS“ü-;–hÅ±z¾ÌTšÈ%Dá£×ts ˆ"‰‰=êgwU�uD?b¡$Zrü9è÷G¼Îë<™Œ&üÃ‘a<Åv5Ÿ“0Ñ]f%Sò‰žan*ñ×ëØŠ��³oÐ¼bÚÎý‚8pJ9ŸÁ‚Øâ šÂ'˜-sÎ@†rÐðë„…¼©T°º¥AX�¤IÑ\8m]{ƒOf•`#ÊÖX³T^fº5÷Ô''ÙìÄìÐøWÊ2Ï· vÅsEâ\žíˆQsµž(™Ë�@AèjR*Zèü°åa‘ˆÌ³èSlÑ–¢RŒ[ËÜœd¼*)�É©»œÀPäÂ¢Ä½Ht£oý¼5œô8‰É.„Â]ÀhË\sàÐ†Ø‹áÚæ×?õVsñØèh-Uƒ'‰#Eögò‰ºm]ôÄ2NjWlörm©ZÍã—£ÃÃ#2çöBE75^^‡¤a4ÚÅwU©íKË'g?ge“Èß213Îæç¸ÌÇ¸›o`Ô×lKzP6^— ˆ$÷$9NŠ�‹Wvg2ùHÏ�“¯æCRïßœa7F¡/ã¹ñ3ñ\8­û­F„\¹/zPÌï/?ý½ìèî§éõ{xÖãÓ¼÷]¯³¾» ù‰ë/´^9ú@7c£Þ¥G<Ho~—FŠò!Ì6”:†j™*š¯NbÚlNyº‰×ÃCÄcG¡Üd2[d7†W4]Ó
Ñ5À4iÍ2©¦Á*€ÝhÑïûp¹*‚9ÛÎÖùmYmØ·Š·kh"É‹ÅŠ£WÞ!ù¨AðŠanúÙJ®|ëV×N¸c|‡uªÛïj+­'úÓÐ7´ŽÈ¸äÒ('tcnV„ãdªUcžŒê÷)�Iâ•µÀã8()õKßÎ–9ÛU'×´�ÕºÁj„æ?V×¤@B’OÏEàG,àcC¤"Q[b¸$ßõ9tdÒ†‰=”äX¦ àdLƒ�êMÿåéÍ‹²‚hÝé³~ˆÉøÊl£cŽ.æÏÐ¶œtèqÕ?Y'{'ÞˆêAäcSñýV�Mö%©kD˜¬{Æ¦íXä=Þ:ëÆ*|¤Í¼e"îîÑÚæå~ÀäOv	;¯G_RÏžýô\¼ÔÜG‘$4<«‰ieÅf3½ÒÆPh´H¶ûb0Òè6ÄŽUº¾’·sûÁ²´LÓ¨Ÿ—¨Qó|_PæÑÊçÜ3Å0ž™¹ËöD­æâC¾ÓHï¡¡¢éÆ,A1^'ßM4‹’‹èäÛ]%íEJ53Îè•‚+ÍªBPÉ^$RºÆR
DB+ÉM-í²	±sÚàbŒRˆVFePŸ;7‹º‚®Iù«o—ÛmµÂ^¬ÔM¥ŠýŠkßÅ++_›•¢ À[9Kž’ÆØW¤ƒRºvÛ§­?fÈq2Êsªáž}¿X¹@yšf«³ªºÂÉÚÅHÊ/=÷˜›ûÊÖ¯ŒA~ þ¬0ÕÌœõxra¡ GD¿v«l¿ Q¬®éZ\\‘D,h•i¿Jâ]&(A/�"FbÜ€aÑÆš¾ˆém2£l]‚å‰x$ìû’èE5xÍÃ�1xµ“{™�×¹áA…1>^2Ÿàæ_–ÆÂBeš;b–¢~óÖƒ)ÇÎŒ2³j€‹Ð •rñ8]'‡7Úó°õ‹‰É bŒCßhÇúTæÅd—‡î˜µý)¦+’‰ÅmD)²õÕ.5‡1Ñ- ®üÎ|Yyõñ’à*±ºo�Ú¤òL ¤ßò4Aå¥¹=
ÄñöTƒ˜¸@|ÌX$¦in.KÜI|îR„ ÷@ßP‚†þæ@…‘ÜP�ã½*±–Ša²—Ãõ¶k@ÎÛŸŒ•¯£”—í=Iš„	à=›l›Á»Ž[¼©¼×’"ÄhìX0�QÒœf§ûË’ÜâíŽ–÷cÜ<#9`|cO}$o>e©X<Œ`,úo¾�©_±èK‰3çŒ�Žƒp–{Y±‡•áAn[í9«MÛ©T(!"¾¨?Z°]ƒiEÄm²ÄžÂ>Õ'–†™å{GÈt�¯ ª×*~¦üëšy¹•ë`‰'«Aû?Ù˜#üÔ)·oÆ($âõãÈ‰Û•LŸ�ÔüvYO1o¼œó_<ì/Ç�¸MÊ(¹€´Wè¯è—‘Q‘'^ê#0úM|—3}x7t‘É<ˆÎaþÖ@¾Ì» ËH�l�1Ç>�ÀŸ& .Ômóv¢š!*àô)$ózŸÜmrÇØt½…´(ˆ:°·ƒGˆG‡beV¦w¢i$C¾O1ôø �ÐÛcçZÜZì<Gc<z¬þ@±:«J-ÀÕÄß_`è©8€¡™~€Ú†ˆäMŠ	§©è)uE�´³‘sY1ò�ŒBµ£7×4wß0ëG—Ó5‰Áz�ÂA0ï|Ð –Ÿ[§ä@œÄV÷ÏÜŸìýŸQÍq^@Wœr-ŽýÒUŒžOí·ÙþÅ$9'çÈIBjf`5›"Ñ¦YxÈøZïô �UîO/&83ßÜ,È8Îk¬2âú&§¾ '™?šeEv‡$ÎÕL`�B‰%¶=³T‡½ftF5å¯¾8‘.ÅÏ¿<1=>Ž0ËGÆ 7z@Jy–¯~Âåp)gÔ,gíÙYL.$¹,«÷ —Æ-Þ< kÎùÒù{Îyüc*0®2Æ/q1§µÎáò»Á«¢“¿gÂëº�ƒàäK¾•ñM&ÀR<èåÇ7xCæžy[Mô–Ê›#Íºù Ž£çDya¹þ©3\®§wfžwrÈF<GšW>ÙÄ¸¿·M³]\³¨NøØ°s±WÝ�d�<Ó¡ûÒ ƒWå ¼�ª064ßþtÕÈ´ïÐvðÈ»0>Ô¯ÌˆïÐ; ½“)f¯#¯*	¢2<ûhýÍ ÷~'BÂw¬’ºm¢H/âœ½Óì·�¯áwqM°ðÉØöoîgC)Ìµ67Û#åˆBÆS�ø>_-[ÍÄL|R¾RÏñ�ËÑlQƒ}î\T¾H)
Ÿ9Fa±»"^àb¦A:‘Ý³Q4±»' Ê=½sO	¡Ãñ'ƒ@.šèÙY&8z
Š,i7²µ£êý3yØÁ;��ëU}p/ßIŸëÿxVùxÖÞiløF½ZÅêf›ÿËùhXÚc‡˜Ôì.bèêB*¬|&¿â�|g«·e/ÊkÈu»þv\_H‡¶žžb‚ údÙpáG›¾/ëAš}óÀã¬¬'ì÷xÈœ®Õ‹á¹;ÖEðÝØé
Ë!W¸Üßè€jÌÌ{ªíœÙZI$ßz¾{OÞp¯;çx¦°=×º˜qÞ{ýÓõ õÉ5úl2¸3OŽå=ù@íj†j#øGY¿T“n¡>ù&Þ¬¯Í#ƒÏCBÏ©ÿzLuyµùÝlSïa½a—¥î0ÇLTv‚À3–â,Œ2
åsdTrçU}EÝ•œÝl 1à·z¢`Xa*h{šqiuUã\Þª"LþºÐ´@ùT•ÖXÙRU‡¾Fgö]såÄÝEÁÎ³5«V0ßËX¬Ò/ÆïuëµÆkºz…�Bõ¼'ÙƒÀJºx¢Ìçß	æIzóî€Ò7úŠ‘õ�’ÒYþ†Î•í1t´¿¶y¯ˆ·Îš_}�¡|´xmã[ÀxJ}zülóÈþD›×V—û†ró×csdsqºvå[‘ã·&ŽŽ`ŸoU¶¸¾lë?<jÛCô!	OeqB“¶=™JÜ\œ`žÄLr±å­ˆád1Mh÷o«wÑÑ¹KiêÄ£êdŠ•*;^Ò‹Ë¿$µµxH±ïÇU¸³U`]GµkC­ê†‚æì÷³š±ýO˜íQS…C•âw“o�g~áyG8Pï™{{H®¿.$õûß6Å!}d4,q>ä`€llµUMBR“¹Pe†2æA�1R„¹âHüq¼álB�Q¿¦¦$ÒW£%‰Çbâ·hB‰²ùÃšV@(?ü¶F÷žA˜Q}<GDô2Â:¬e@�fÔ$"�8â½÷È�Fú—¦™fóë·5`¼ê{©À‚KôõuvÜ\¦ÏXçµ+˜Ÿòvj…à¶^4=ÞÏ03O“ƒ(àéú¾Ú0-I‡�fKÑõR ÈÇo°›‚O¨¼Íiã2Â)Ø†³GòÇž
X<ÑÇ˜eÇlçêm£ÅSÍ\ çö‡PÌÜ!!úoxî$Ã+‰ƒ>dlíÅà+Œç�bŠ›áNIMÃdT"+‚ÆŒ¹°o0íÅ`Ä89Áþ×Ïü\|5 Þ£ô»Ø¦(Çú“ ‹’Øyñj¥q”m(²ì÷€æÓ<\G‘	Þ2×éñdTžóPœ—0¯ôè$ˆ§¶nÏå@¡
Ä’!×X¿ãº•Ÿ––�ÓNéƒÆkÕ³­xiki�öÞóœÝ�Í¨Ñ›"0?Î^2å¶XFç�,{sÀær_e@V®ú’Áñ’yŸgˆ’þÎNÊ_çiôŽ—ûwq½;XÚÈEDƒ \¡­b1G£’(¶¤�ŠRs×À’ªTÅËÝô<\Ú‰Qþù‘2tT	ƒ;—Ÿ`’ÕÜ[Ù,°êAk¾£K£êbDl#ãb8Í,]™i\¬›±þ|kC‰ÙåÐxLq~rÝ
ÔÎ†>|‹zÌŒ»BŠÜÃÉaŸèbÄ÷?aßð€‡ag3¼0 èÒã(	jêÜ"FµA*í{ß£Ëd´]Å™+XHæ”zÀsÿÙÖ÷åZ©SéâLàu:§™Ë…á)ÒÒ²ÀÝn¸JŽEBnS¾öì´>Ä¦ñ“úÂÍ	mýh,òRÍûçÝÒTŠ~}é9,	�/‚¥§¾âûµ¯.î„áýªH€~…!Åà…Ë`Ò×Eù»¼xûøOùÛ– ÛmwI°lê§´Ñ‘Uz�zök*½*|må™Ê*.?ýõ÷~åü¾Èåcëø¹Àhp×Ó?eÍY—]¹*H|Ì›1Ïô‘ùÈe?©V;	Ø§	2šPQVˆ¼’lW6m5O¤3'Û^ý¢«xà,¨Ò¹³a)Tì™ó¥eUû®s10«ÛÙ„ft9€ü€ÃþüT»®{Ò!°ŠLÀ§Ñ@ïOLŽ—ÕtÇ½!Éú¹^ãL!t­æi ö¤–^¸ù:CøÌRîÖ	‚½™ðKœý?2TÉêYxÿÛ©Fq#0…Š°
<ò½¯hÑ­ÎúšõÃ)™õ®kes¹a½T“lÕñxƒµªÉÿ9´ñ½Òd�É%+þ³b8XýZÊ ëÈ;g�v8n7“Ï»ÔØa“€&½^ŠÁÔoœb{w	OOáû7¿jÏ¯·Ø²ÎžÀÃ,é~¢óWY¾ðØ»qÃŽz�°Ž³VoÎ»égÆ'5Â�÷(«ê"Õ¥Ã
þA–Óƒ[�:”ÓP¿ñ|¹Ó’+>¤ò#Ñ2?$Mnd½uêÀ¨eÑSŸJ%ŸŒ­þeØž~�ýUŸq—Õñš
¼Þ³ÙÒˆzÙRnàÐ¿,7„‹Ë±è÷µ÷ÑÅÅ>`Å
Í/ëuFg‡‡Og)Pç•Jô…\)X¿k VF"ñè\tö×ØÊrÒ#òØwE]³s¬:Y #n‡š8Á€Lm"6D‹Ú
ŽV Ä¡®H`Q à¯¢ªà¨Ò¯î­QkGÓÿ]ò<2’Nˆ?�‘¤àUçÐ&äò|†a•¹½_GÜ�±}›diŸ!�:`È¾å…ÑÁ¡øõ[í\,Y©Ä]J³ºþéÏ¹ß�ˆ¬ÄÃ¬~»¶—O“žÞA%>�¶ñ™]Õä2P™l5p¸àO“ÃÑ�ö�[Ê€4O@ŸÂ¡, Ç Ò¬Š‡ƒ-ƒ,™4½ìX7Ÿ-#?�3’¸{‹ý©MÎ‡ßC¿�1Î8£a½¯Y)³M¿"kê­aæ_=4§JqM…å?¢Ình6ŽkŠÉœ˜�Pÿ 	š2 ;‰3³g‚4Õ�ZÐ¦Ó©§GZìk(m�p¶v«ë¦riZFÍ}Š¸‹i:É/ëûšŒczPŸÅuVÅQ9E�Ò&'Ì/ì‡‘våœò­ù<€2†ßôÛŠÞöŒ…éYQ)‚j.ÍøHN¬û¢Ú11™sÍÕÊ—­é’çØ‹à{æ�¥'|­kƒªlT«%ï1òêª‹C¥ÏÝgöQUJ[î'òÄUúØ”ûÌ�—Ö¶{¿81é Š�r¥nšïâšÒ¹…Í}ºÎ
: ,ÄÐ¹Ü÷6X7¤Ÿ®ï¬f¬Áe›'NM¡2p|‚4Ùôp6�¶Vnë“�p&S=È[- ßžñà¿~�NjÆIž°œYõ/c`YAq6š-ý‹Y®30#V~hs†þEPT;¡u—ðb6Öø†WD#ÅN1o>Áê)Î˜©ÿCx4Œ$µ/jl1÷
y—.Ø/›­ò,—îò�Rr×ùã–Ð÷[YE*GÐ•âKm/ý|7ýÇîüïüßSI¸ê‚SÆ—¸q¦FÕ×ã�¹øŒ¨6ýÌ:cæúVsÂ@Øêwš€+Úkÿ1�ÄcÍÏõaÃ­âéÉþ¤áw0:Y5ÍQ´"
ÀŠêŸ+g"%*£2étËõš`�G¥�Ý´¥Àf:hN3ì3Æ^†~<PMú¿Z Ë*w‚ùÆÏÖÒ�òI0 p!"`�PSæLè6
6¬OÜÔ{&¸¼­`(‰Û…’¿¹Mq´aPÈÌØÙ=P›ëZ_]£ÞpvõW‘{m¯h:õUu,
Aé‡j9ô^÷«*ï¥Õ7#íÀC¯f¥œ]·Œgr‹{NY¼²´ 5¬�Ä$ O€eþGnÅÆs˜á$ŠŒ\ïiû`ãDÖØÙÑí?´ß¾;ò êèwÜÌë5U‚xj~î´Ì¦ÖÜµ†ª§ôÖ�Ÿ>‡yÓ©ßöà)Òo)l*Þî‘Hð-–;ûÈô+Ù|‘Ò+[¥Š-ÙØZG®Xùf~<F‰†Ä_ÎôÌ�á÷ýŽr½f^RÌ¾ß‚‹4/)+ŽØ1La1PEv~’:+L>ŽMÆe•b75¤·Ó[	ÞHo}pi8ñ;`”$�7½˜~ïYw¢4÷åRypJ’sˆ¢ª‚½àÁ‡†}Ø!*Yf×~‘°ñ°ê¦Wù�]´TKVà0FyùÚlƒ‰$"™Ï\ÖùÂA»ƒE?þ¢ÔW,Ý[bò0qùæÓ.û|—ÌxµZ�/ÊË�Á•ÿ]’ðÕP*4”$*(“”Á‰R7Ñ´L &¾¢àå`goTÜ‘.¢$œVÌ‡‰hµUîLðHn¨e¾úi_­"�“Øoß� ý·e*mbî�äD2š£–u{ôôÝ¹Ñˆß¶\Ÿ¨‰ïØ¿è©ì„ÙíZ§DÇÜšÆô
vèzþ1Ul‡àRl-wk2VùxÙÕ‘;�Ø€4ý00…=Ô‘x�~Þ½Ú«Ñ×o2RÛmÔ”¸×=Þô_�Ñr×û–Z&–×Ÿ/ß¸§�¯¡«(çÍ[ÍáC{è%b[f….áÌ<Nc0G2¸Ú¼j«÷~H’åiDPœÂceÞ|:PÜ7iÅ/q—Õ×-Ú�§Íú\ìbÑ7Rô>¯\l$}íVµø‚Ë÷Ú†UöŸÈ*B3ýl”RPfë	Ñd¯'¾úÍ<jÆÁE­ìÂËxü÷³}Ä6f­sÐ(Ä°SÈËîe~4žUØàè)ÓC1åi‹s%Cõ¬r£H"÷3ØæÚØƒ)	”‹L[ØèÓ©)Ìmj¥æUí†ÛÙœ"üþÅÙI‰§Rð·Æ6ÍW3®–nP¥×ÑH�‡µÕß›5Q7s\ê@¿ŽSw•¯®RhÆ„øeqêÜ�G0?Þ½~üØ‘Z>ÕÞÖGLîîåÛÑÅc[ÃdýN
�%C9‹X¥<úQíí^iù»Úï‹p,U È‘TÃ‰ö~‘íU®2('w|Ö/š«B3 Âê±×èçJ,»t
êÜñ¬WgLN$ò [ÈVãü|Þ¾™vÀh0X�XþéìšÏÐ<ÛjŽhçùœ¶‰j0ÐÎ{rLNm³­æ[[Lö3S±$Yƒ÷¥ñÊˆ~ß‡¥’‘Kž°º­ñÝ!ÕQE(Ø‹š“‹ÃÙP:&—ù{¯Æ¼Ó¬4sÅ“‰…WL3AŒ6…Riv-7S:ŸL±3­°ešñî¹=^ª‹‰¯¢Å¦4Ë³¿4ÂOCßéR~Ü�Œ…NK0+c$&3–M±üÖéu<:¥"Z“”è ,�ŠÇn2N–ÆÔÎEG–ëÑ%WÕ©!`Ý4Ù‰Â‡úº_ÚÎ`Õê€}´.ñKqßôÅ~›JÇk¦§t¹ÊkÍöSÃy*Ë³Êû)÷IŒùk$Qî†ŒÞö†rÕq3‰T”µ)A
RsþÈ=[D¸
j9qªïâvÏCÜnoâ�KR2†vß)ÆÍÔ1dœc}D™2k<9?À];Ä8ý¡úºBR)xöË£;HÓi´}{Í74žÍÊ4Ï�[ÄÞ:gšV-}@¸ Ý¡_×€JPz¥³�ú‡�•X;—)aDJÍ?¥�œ\#X’Áìréšçwðm¾ÉÍþAóÐŽ2\©Ý=æ69j‰RðLmŠ¡‹.IÂeGãµü R°'œˆv÷$˜	PÐ>5h_
€ªcÕÒ W®?¼†+úÂà õÿ¼÷ã`ÞƒÏ‡²#C½€—ËÅBê›éW'B«Ã~³«‚Íýcáb ÒþïÚ5~}`ðÕAÖE((r¢{2me5û
t>`v³Ãïd,p*=®Ï•Æ¼'Øá¹ oŽ$Ý¥ª;fò`¢Ì¢Øüt±¹ÉŸJ¯$ßûãªHþåZå K•ÃÔŠƒ±ÏkÀ+Lmí­ÞßïR2¤å®1ô,°qáÇÃõˆ•‡FïÁ£p’Ì¹-—½J%bÇë •Ï=gõVõ£�^‰y��½~ÏÃ×¼õ0~-PÇÏ×ª{üÆ›B¢øÆ2X²ZÚ?ëoG!xÍn.ÊÛ}%®}Oo	_¾?b¸JÜá‰çN¾ùv²$bl;zéÎ`†&K«‡x^]"’åÃd˜+ägeI2€ù¯‹ö ò�B#ð(ijNN>SwFÁW Ó¡|—b¸	þˆÀWùoW^\q�?¿¦1>B LÐ/=ÑiRÿÛ,¾ëøàÈcykW¾Z)ÇBU¼ ŽÖkjyÕ4XþõÇKÃæ,3ñ
îF ûå¼9âpKëuŽ¯°Õ·ƒ—ŒÙq�@÷œ˜OAvþyG4ðú�ËÞÞ.,m¹£#D"^ÌÑ£‡8l¤QZõ¥1õó‚«ÐC”®Ÿè\«4oJÜ¨ŒèížŠ•¦ …“ýdD6çh[¦¼|™×LÑ]ÕVø~�.†×:¶éŒÆÌÔ0z*úšHX×,€Ï¿Ï7Ÿ‘z®öUôQN¼e.7$:º†Å.ÍÊ0Ö£M½åj¹ë9ÿgª{2Ú¬C�þ«O½¢å¢¸Óûÿ�NÙ˜Ã@.‹ÔWÔ1D±z[Á°â[°M%Væ5ìr!4&U™r«sâ 7%y çNÙJ(?¥nYm‰"TúC�Mmrû.î˜Ý´{bSNTŒì]*}è’v`ª¤˜û¢•1ê^H�åî‹Óv“NoîUÛ†AS6W™OÙ‰e[(ÚÎBå¢Í�…to1bÏ«ZH‚ç¼{ÑÀõ¤~ËN€}VË‹Ù¹ o²’<‹>#Çý¢oªðî¾TFD"ï%7ï3®¬×.õ(?¾f·’ƒŠåæ]ßÒõ`!õœÀ±üÀ¿¼1%UïôqL:èœ§¨Ï¸|’û@8'ó+®õV¨¶WuÛ ‚�0‹Ë} +T/‰îQné âlêž~†c»ò{—p«þaí=¦è£V:#vmøé~�âÈ1î�Ïí�öt	0�SPH�]¶/Èjâg/!»’ˆ{/£c åj�Ð÷Éh‘…â[ã=’UÕú@Ê�q‹Ig6ÎM–­ÿú—•mqéû%Y8ì¾dcÕ`"�ÚX‘t®¤å³�¤¯>�"·û{â…Åri¸ÅéP�O?û¬0=†/¿9³ÒFínV}¦OY[Õœ½µ¯"IîÙ
é{GEz	`)Ó‡rÊìÁ¶OoKñÿYêº§þSïéÇ•4; ¥»”¾ë·ÔL'ô±¹¢>á°cèÄá’N@•½àªñ8 áÊ‹Š{ì‚•zbö8_xVâÔðÓÜÚ(X"]Î”¬Ä›M6wþ,¤fègf”Ó+Íœ)TªÕJUt>-è]z}†o£*‘mGÅ¶–1‰SÍŒ<»±º»Ûµå‡ü·&ª…:—™QƒzñHíájº½l¦jþ¹LîØF,ûÿÁðø�aèYª"'LË¬†É´¥²bJp{ö¼—6­Õ«æ¤h“æÑ]¿�mªýEÒ=®Ò~’êf¡»ÚFvŠßê‡E»`EWinuxà8!GVYç??7K^ö+›[2·–Ý%_¬mwäºsÃZµêéMZ?Üvâlž³“9£¹f¤ˆOÊÏ{ù²ª,³'9«/} T}åÌëÊç6ÙÞVëzÃ´ÿvU¹[âÑdT,_uêVÊí£äEÍ+B:�xâáa�Y.L4�rÝPË1ò"­¡n¯ïj[)XsÖ54�õÛ É4såSÊ6ÝÁ«¢ò{™(,‰kWª‡û
«:Dmª3üˆ°Ž/
ðTÅ*Ý×©z'©1¶oñ'3ÿøoŠw|Ð‹¥©=ÊY‡<
ažD¨m‚?F_£Y3çf^·L•fëf'@Ô&M7·F0{‚Œç•G§Š±TÈBÄÑÎÓ/¯f¸Õzqcø].L.I²n^½¤ÙÒW¡k”Ö(íhŠÝc¤!Èœúë®|âŠ%Ø?%ÀÐ\ý„6ÝQÆÀ´n*¹™0Àä³'«'Š�ŽÓW®hÄ©ãŸ=û îÅ�L–ÜCgRñ›™Œ‰¦9Vî”êçŽ«Ø›A¥ÓšT¿Qõ®yÌÄ�&iýÙ£hõœãQJ,#ö|dé©ºzÍÊñ¢|yYH´ÈçîÑ{ªFI%™¬OØè‚RD’&Ökê'Î	õ‘(¨¬ýñkÕÍ·_ÜuáXT�°4ƒJÝo­�ÝtÇ €õ`X³èìóˆlÚ/„Þ-ÝÔ©ª¬®Á
TBIj¢Ô›/�
‚øJÀn0,¦Ä§XBÄ÷ÝUºžHÕh×Fe¨%Ö6Ž%Ô/ÆÁµÆ:&zLl±dKTµô
±^¼GvÍŠ¢ÊSA4Š:äDÁI�ùÞ¯Ê¯‘ðè<¸–!.”1?nTåžàÈzhÔ“å°µŸZˆBäªò©–Îï‡¯CnÒî—µùîI�ž ø�³‰~+Ûïsm¦8¹T°Å=f!c·(šKH÷ŠêƒS­ËèH7!LðS¿.DÄ4ç‹$þÙ~]ËÚÙ´a¼Géšs¯iK7�Àà"dÏ¸}¿¬‰µš|Ÿ{�©ØÜ°Q’7Þr-Êy§ûÇàˆÌ‚z«RaVÎ]v4t¼–ž �‹¿°2úíäúÂ-æÇè®¨YDŽÛŒíSØ@ª%_ÑB(FÖãÝHke%&5ûÕ='¼jF,§÷û˜ºGõôoWø9è;ü(ïÚ¤�Á÷XÐ3z`÷f�MƒÔ<µ~ß1êËùbRô6t¦è0l½uÖFš©¾IjË¯ûãËJo«ˆIÌq¨¹¶Ä´(…®cÇ˜ÇUïÈ@ôº«ÛÑÑ¢#eÍ&›±V•³÷©Ìóy(ú	ò{Ì§Ku¤Ïá˜WKe”�Z
^>(wDI¦’Ûß¹}xÈÞ
þÚÆºâ5¼gY€G2¦2ÈÓû&‹óûžÓsÏƒ!q€Ê\	¡Áž¼¬ŒŽCÝP%U‹fbëõ÷Sµ¯åÚ'µH…LbiÌ,œsµäFÀ¹ô6ä¦®7ß¼Dä
æ¦gÌ£oGa)jèS-&�>7”ÒyÆÏçCCÎ–iâ] MR“ »Añ�0™ðKf“´F=zŒÆggŠ¯tf›7Kx �[Ðå«L^.[³¦Ô­>óZÑcû7ä�…36þcÍ—™×qÌ²w¬¹*CCùV<·ü])E�Ã9šŸ)¨Ï›Ê0l”SMë.$ôbAS˜ê–Hib%zì²qÝ“VÝÏÞ·Ê€7äö+8àú{
\âH¦AáZ #[—8Ä¤0ž*ÆÑr[-œswnÛxP+î”¨HElû‡åY./Ýk6wKb®?û8Ö8GöI.ßu¡–·rÞ¼™l9�EiÞœø¢†™`†"‚Æƒž‘�È‡ŸËºóö&v¡ÌIÌÛÕ¢u*J\[Õ^enôQ%j	?{ënW+›³1‚²Z€ØÜC«ò	Ò$¯×3÷¯!Ûî6ê÷•£þ/¥SGÇ @©4ÎŒE¸!ÃRdž8hg?ƒÓJ~�¢²u?Zi¡¿Dƒ‡4£íK{j%)ˆ'·xšéMaþÿYvkEt‚,lÖÅýc:ÉÃwá…Xk||2óœ…ë$Â.Ey†=x’Ç*-LMš¹_¾¶ïxCƒÓÓ{ÀtÓçˆ4.Ÿ¦< PðrñÍ™™ás¹1¹¼/œÕN8°uu¢½.Ó¿Sª_r„j«]¸\­¥šav^•ä¢©ásöóQˆžZÅœõ-ÅÔDŒ uµSÝ�g‹6ƒ„†²{${ær¦2ÚÏð þ5ó>¶ø…,	“‡hc¦b±JÖŠÏ?${ou•o>Í¨þ¤vCl¡’(¶Â<Ü/0çxû(D'aÔ§ØR™0Üß"ào@š†¨¤>N›9ß–Q¹]¶â¨}¸· 3�(‹ z^)(Ò®e´}E1\ßp�B€(yû•fÌ·ÅHðñÏÈY„Ä/HIþ� ;,ÿ§”qÂ«=•§üdÖÆ<zl°hi f|A—ÑfÀg]y\Åè:eÔäýÎ}�‹ÇÕ¯çF®ÙM±.M¥-LÚC£äEˆféº¬¿¬uíâ\Q(K�Û„ Rj­«¹RûÇ�Ñï/µð[Í·uTOb¤‹D;CØ·c�E»–½EÆTSqÃÝüh3d”Û-{üfXpÄÃð6§­h]¢¹ÛV£Ha3<­ÕÜ v™ÔJ@X¦âé¾çöÍMÄzdRÊLb£3¢‘/˜ô˜‡¸dz¨"—øó?Ô€gÚ:D_¥ÑÂP¨¾7½­Â_Ù ËSc}¾¡–Âÿß¨ôÊ•ü0�$ù�0¥ sû»à›MG%^û–XâÉ5ÓÝþTn;›½À>&T¦<å�™)3SfV1óåÚ“'¬ýÔvh’ÊÊDæô¤üîn†$4n«µ·'Ür}b0ïäDÛxoüVêÁÐüU�JgINþ‰œ§}²Ö4ƒ»/ÁîŠ|ß¥\”ì$M•Œy�»"™j¦}j�¹ è‘ÃibÓù!ÔNÓ½SB¶vóC9®wp�7}êÊ5±ýø¬„q2èÑªàÆÒ´ ÷UÃ�»,ëÕé¼�I�õ}ÿ;íÝYÍœÈ�”DJm[ðöåÐO¬­sÞ¥$FlåXŠŽ~¦=/_»áSéLì±ìJÄÓÝ&¨Ç^(qwv#ëã¿	ïê’Žûÿ.ÑPßÙå:bBø±fVˆ2qËgn‰Ù™¯‹l8VÓ…¸´bÑå´0ƒaG-OTlO=AŒf“±WìO×­OJŸþ{›ÕÌ‘Í²¹gÆð k:‡áùíIþç3äÏ*zæ›A$ÿ‡ó•½ÌŠk¾PÉ`ææ³nõFGx)ëGÿRPE%½5Ä\ý}·®ÚÀ¼©3ÛµRuu›ÞWç-Ìèñ™þ˜ßú2ÔÔæû¹úô¥G‰¢þ«�’‹ô%vÍoMÿÝÍk x†ïBøuFŽéN7×‚kV)12ðdB!4ùà®.
’ŠN‘8O,f½ú§œ2TiVu‹±äÄdÛLò®ízy§ùÊu˜gÑðÂ’Ì;¦Ksß'^¤§ y+ƒ7UUO�¨ûB™øÐ¶ê+­$´%O»9elÕ¥*‘Úc@ª‰F‰õc6ggôMU_Ù~1f„¦v½V»5‰ó-V›Ü0�Á )_Dñ{½óÔ³b1–#Q|æƒkž9=­?‡÷äPo™ÁžcÖs»ƒ$&ñ�}ÓBoWT‡â"MÂ§¼= Dy$,Iœ×N,Ú†±	w™IÍxûE��§6�½xàn¡CÔC-¡ø™,�Ï•ÒÚÌ²Y:Ýy¥~±ÌÊ�ËØŒ¨Ž=Y¢ÃâžcÏ,Txe¡qU¢kçàÝ*OëæTqô\±EØ¬€*„â/ Ø’/‰ªNSäUf:ìõ‰–b�ü?ÕÄ«§HÒt$Ù¶Ufu‡†dH"…¤$¶2kQÌ/‹­ÏWiXûþÍNî¶Îx°r6ýœº_y{?2ÂÚ½ÍóC~{“îÚuÕ8å™|†Ü�¹Sf•é+ã¢ï{–ê3˜0`»wbcCóÕ‘QØô+zÆª\TŸ-é{ø]Þ£Î¾6ÕÑ®Âc‘?Â8–Z~|‚&Äeó®D�–9qW“2R,Y+–½¸y<`OwïAšbz6|¶]Ü:q§äZßO÷VÖgMñÒÌ¥icÌkJË0À=,žú‰òÌÒ4Ú,am"Óˆ¦ôRC#øÛ,cáf¢¬ÊZ6RcG½Å¢:º)eŒ		ýšÂeI½Ýr6.êôZ;—ÍP°+OÓ)ˆÓ$\ÁwI¢VìÂ(hïö`z´{%Ïfpºûxl	}è¥oŸÑnr±•7š%Ó§ÿ¸{ž¯›áxªm¡§½1oÐ’³ôiƒñq°ä JÖÊÜOš¯'V!‰™"·°=‰$
Ñ—4„ÂøKSº+ê‘ÂÊ&ZÚÛ™ƒ‘'¤æ†¥YŽàÐ^Û·e¾Ìæ~ÿÿ÷}â–,…Âx'"s£oß®d±Çý±£ß½}{.çkèÈÈTJY;ffê–ï…Ž×j§KV’¸¼Bï+ÑöjÅÜqM®WL¯"›eõ/�×¶»ß»Yf™ýŒôxw¢Iõò:kë‘Iëèq.†‡Ç²œdLWimîü¸³] É—õÂÇû]fÏâ¸)‚Báê{l²Ö»·Á`îŒ±ÊjÖ~£Þ†Þé¯;Ä�;~­7±Å-zAÁïØ×XÁ'¬ÎtbŸ�ØƒWOÕ.˜Ë$ ôGS0RÉäa¡#åQ¸ÞþýPÊOÉ|ÚP[ª›†ãù%`C)cÿšÅÀ"ÖÍ½dD1Êxp_s*5Åac<›vúÈPÛìc›q`{D8†Shv’ì�i ûúÎWÙ	§ówúpkîàæR|ö½Oš2/nÐ@’6Má² ÍRèÕ«B|©˜\Un¡¤^Ãl¯sÝÂ´=[{¬—¥A®?²ñzJ_R6­þSAƒå¿ã	¿Œú� µüo˜¨ÿwn¶–û~áážGK+÷(uhK¹7Ùúá,¹ÎçH�ÿâº”ÇùÈ‡Q¸Û/°š,¿§¿Z‹ôy’(NZèýŒöy
ˆ‹ûºÉ§µ³æöe+uÎh­C¾<Æ/ï,s	wy¨¿#ñj×ØIçðÀ¦è¯µŸ{ñÒŽþ´úÉ,Ù¿ò%î¥ƒÎ`S"[;´Ýý_~`!>ì]úÜŽ*ÎÚt]8J™u×·ÍuOÁ‰ÕÕ¡H>ˆŠhïLkq7gâ¸R2ö,Êª‘ºZ]Æ| �$¬CZ¥¬äm¶Öîô­Ãòq¢X§�	œLrSù�ßKbŸÌí™žþ—Ó%H¾‰…/ºÎÌw�>G›9Â(|òvívó NnNvXN
Ð€`p»ÒÇÃÑ+É{(¤»u\œ sŒ»QÈú³p‡Ý¨3¹™qÅ\’öÍŸœè$Ñïµ§Š;QØSÅ™zÁ‰[jl	Š6n˜ 8…DTä}µé¹ã”¨öPŠE	%�ºBWðþ¯Ø­ŽY«w…·.ÀíÑâ´å‰!¡œ½§/^²mdSZ~j=¸*Qgdýâ¨ŽÑ0tÃÆ±]†Ÿ¢�ÃqÁ-î.P§JBp–ê1	àØ«àÄatÿl‰/úƒñyòp×ùqÆ{~ÇÑøTOHÓŒ¦6÷×û´	u…N¢ÿ£wY¹|Ãö
A˜VrÏìwDh4Kk–¢ñÁ+á/¾@@ÕÆOœûý”¾JüìZB1[‡?l{ùJÕŠü£­q¤9Pv­o Y6ÇCJ°‚º¸ƒ÷©ýÌÒÉç$µ·”H`7Ei�¯¨)*eKÁ£Ø‚Y8©—{V»¢«)b§ÐpNv/AÙ%å‚;Ýuh‡(wÌƒ¼l}¢*Ñ4Ëy|uV:&à*P;LñQî™óóg*}O¾ÍW;xT¿!¸ºØöF‚[¥ù­oél•ˆ¾*ú°§´ÀK•„K‡âUv¶Ü¼ÆŒÙ«NY4›$Gd+„3•$KÀVZÑ¾¸F&FuRö¥j.GN›¬Û–Ê5Æ´ÊrevvŸv¥üúÈ¬2MúêC[Ì)Ï|ÈßeGyb§{ø)Ú»Ž½�.I{lÚ1§¦ü CÀ—e…sZèt�ÃhÑÆÉ»‘RÃ¦GpÆÃ7?½¸(§d±ÆW„^=·
 ÄÙ&õfðV»ñÍž·iÏŸ\´‡‘GÎõš6$Þ°$’¸uP=oçu87¿Ô½ì�[ž%>`<ž.÷Ë$ÇMtÓ—¶B)GªjS®QãæÆUdü`ŽèS¶"¸§3·™É½…}M×±³Tth?ô7Ÿ±í]›áÐ÷„ò—i¢EHå‰ŸzÅŸýå|§-ŸÁÕtd†§¿Û‘,ý:ËDÏš’©Ðj7lÁÝD 6Ù§-ü†�·ÔÁ+§}ZU4Ÿ^®çxOµÝ¼�ŸfÅüØQHø�ÂêU;"I{÷)‘Ü1…�ZÀ°ø.õØÅá”@óˆ›2ó„–©b+qºzóVð›�s^Æ>Ÿ¯V[Åµ¥ïÅ-5Îv¾€¡´ñ]èš®–—Úc¦û"ü�"fˆùÄ\¥ß¬¯ãœ<ŒÛ‹cy­˜#¶ÅQjŸ6dr#§È‘³‚ÞJíË4lòOîßÆ(y‡ïNõÍ}$mŽ[š-Ë|ó“Ôˆ*ý”SñŠ\÷Ñœ�þè‡‰@ÿË@
Ýà¤¨ie'šm‚Ÿ'q$�´s'Bš�Æà©»A©¹dó)öð.ˆ*	ù_y¶Ž#z_Ð«_îÏñô{½ê_a¬_=+äŠ’ÓŒÏž'PôÜºwGÔJîÖl.‹ºýr¨qûZÈvD(�DCG�&ãCéØ±Ã!¡ò“¯=’Ç£z4…‚Šv(£$;¼{ˆ2 @�iÇ˜üußîpcÒEÃì
	hh 	säÏ>�ÖL¶^ë¢fïÚ»w¾TWÞŸ¶ÿRÙÌ/_¹IªÄ¦ÄM'B.ž´Ø,Pš-èúHÊj)ýþ%Pù½¾ôDp2ÛÈ^í^w�`KÖ«�KèPa>Î¾ï«¥jÏ¨gêø)ýKSüÓÙ¼îdGFYGÌ$“ª•øX`ˆ7%’Ò€c²K‘ÚQO¹Á��"BÕ¡B•'«è¶^.ë`"ð†;ÊG¢Óÿ€ÈleÔ’­O^l‰ƒ:™Q¡>ì45eø=[7$z½§ƒ´ái¿åFð\*Bô'Ç�ÆA–koÞ¸�çMFc¼ÀÝ¾„…§3|€Ó¬%vñ¢>!Ò´¯]ØÂ€¥ŸØö‰'!	ðï}:xi‰/êxcR±^W¥‹I«ö†¶ßáCúï›¦ßzäó_`~cþ¢šV¦ïFvf�]5Onû¬C‚ò?ÅÝÒ·º7¬9¡Ÿ']¦/g}¡ç‚Öƒi�ÞUIÈƒ©®O’tÚð¾­Ì’Â?ÍÕkŒçç:ÒÈÕÐ[ùÜ>TSiÃô¡ ˜›œE<7÷E-ïN	Ø�w;çmD�¯uÖÇä[ÅêÊÅÓzÄ+9ªÉg_PO$ÞËUYN”�[»#j­¢ÜûI&õÃÓ3–\e4n…Ï×…)Rvcxë/ôVÒCÄ?ÝKõ‡�‰›g{G¹úXù’²¶"b¬ã(ã6Î¼Ê›½|º©öò	RðrÑIœÉà&À-NÕ±ÜÏù*§?Ž†2BpEYPÑ[ ¤Ý.ÿ …r?ýgO£h’¿/%lä¯ýRO¸E¼ºf N=d&þu_qbÀ?XÂ°‚Üf:ØÌJ/¬“}?(u‹6¾‹£ÏP˜"ø³L~×iV-ßg1íèYBg‚	˜Üüþì¤}H¤K2 4éµ–r)©Û¡È#|tië@@£†JæR[ÅÄkx¦“ÉØcE^ñàìòI2ß¸°dVo•qPÍ‡¹kZa2Û×H‚/Ž=(¸c[lW%iÖ¸£·cX ‚cˆÁ£hPÆq·Óé6‰cüMò?¾}iSh‡RmÐè]ùÐ6;ô¨Ÿ–�Ú?'¯¬òƒB}gÅÙM«môîÇžëìËCj,v´œÏÔ±¯ >‰ú§—GðÀ’+zYl?GèÜ¦*{‚±.ìm7äAÇTª^1Då"¥;RŽUrð „"bhø¦lqw$’±Ô/gy¾R¿mZp‡%‹0BÎÏ�#4ÿbÁèè\q0ní	îN]M‰<¾qëˆÎN—Ôõ{Ôˆ†ÍhÌ@þü1?»Û~‹tùòÀêÂ6ÍœØÚÁT�¸k§ŽÕÌ†Ò™Ò‡û\M å|Àt Ó5O<4> Jç}¾Þ,ÿQrQ*Í¯ö›A\'õ)yzÔ'†KdØ®D�öWdi¼@gzu'1\}»^qÁçÏI<>e^Öh)ÈQ*¹ôlz­B€l?gÜù²Ô÷Š‹ÊÍGÖîZ›‚¾0`³å~ûÝê“9£<!:•ˆÎ+’©xÛ£""pª[…WÅ}÷�"âY|Ê’‘ª>÷/ie+U¶r¯W—éÑWs6
”gí*�D}ìz�yn+áˆ…wUÓ‹Ö‰ëÍf©G¿%!©»ˆL[#þƒ"Ñh2™fmhÿÒ|Fqb}*•Hˆ©#zœ´±nVË´€™]öxA ˜1�®¢¥m·©k±
	×‚V|=Ä@»=…ÁOB°zÆP¼dóÀÉ5Vrl$ ½¡ÑZÕ„8�»ƒ´8^Ï�˜qp(:A6J5PY2		Ã¨V™µ'G”‰ÎÌpeæá�­\¶ªhj“¢Òp¡1a„ŽÊwÅÊ“S¹A$Ó|½HÁõE#7Ñ‡ÕÒà´Ü|þÐp²Þ*êÊÄ
›`åD]Zó”ŒB-’€\6ËiWxÌˆG�ú�úþïGG’ ×®~�YºJ©¾T7Mq^Âèº#‚0�§äØÃµq‡¾ó×Ëêb‹0šKVotñ[ŠÕ–m^çk k´º-dËpÚÝŸÿ¯^JôÝdö3¢ÇÝ•F�FÏTæÏºÛ—�9o“\Sã8çÑqkê"�ÏƒxL_:¯øPœŠLhÀ¥0!ÜÞiËŒÔ{èè8µ:¹žózE ®Oyú«‹/Ð˜àl,)ó´G¾†òç�ÅqÎòQ¶˜Ró`�°\Jù>[‹ ”¦¡ip&Õ€@¡¬ñ­®±®© $¯‰:ÁQ8²¢ Bt:@`{>¼§…'ûaçÞ�u9çéþ÷9ðž' ©LùcÐ¸ÊÄ‘Hh‘ôdÍžò‡ëáYG�f™©¶«ÁÖß/Ÿ	Næ=ðøSf»0T«;WJ&Ã ÆIœ2¸´òúì31‘ ÛkÃ‰r`ÈÔ}²’AÌ¶®ü™¾«�ƒÔüëd„¼”@\q-ž9(ÖBì¬,vÑ£­ALXÂqªH[©!Éfä…-t|øïŸÙ‰n¹PÎ¤R^°bÂìÕøÃGOŸf… =+¥Œ¤åhþ´°WðD;KfÞx1‚È^U«]’3 @jüK8{VÛ. "k5�°Ñþh¥GÂ¾µpCé¹’³*ù6iªÓS+Ð¿¸u4495êdj�+†�Kk¹ÒNqéB¥”Mðˆ++?{Æ2Mƒ›NJVñuü90Ñ$#dVœ/Õ,)‘ÏAk0”Æ‚^Œ‡�ùF”ß›ÍÀÜÜn±‹÷ûº”<%¢œJ­Àœ÷Œvq $œ›êŸÉè¯d	@äwwõ¸?�åRÀýs�
D1«F- _ñE1}ýzcã‘Æ�ZŒhÐô[Ü”ÆÏ$Ãý�& DWx&feÅ%éí ~)	~ŽƒXL·tË›ÝÒ…–ŽJKÝ//(—F[˜KY=;ÊÊØ•bÿú—ƒ~$Vd¸]š¢8ÚÜ|Ô÷�bJÓ):v ÿú£3R†R—Q´�}ËºäOíÖ	kÅUPÄÁ‹}³ŸSV•¯ýÌxs QÊro¯±Ÿ3£ÿzç�2‰F¤ŒÒú'Ö¯£ØÝnN?ð×{"]õ1B+ÄÕµ¥ã°;*«
ŠíÑeO]ÂÝÖ-ÎÒN~µ¿ø2õÌœò£u%lÅ(Z¾­»£�b¡9M™h]Z3')¢9 #‡>Ì*×<cŒ;ÚÔš}l>â§û%û)·V`leYî.5*ÐÙ¥D~ê-‰öd5JáÆZõ!Qµ¹Ó¦§^fP€£/fj¾�TÊX‘¢X&(f!ˆÃ�^ò˜g/j<	³/ÚÇë¥ƒS'JÖ“5áV^	þ•úßŸ¿ž^Äm¼{ �2¾¬;¢¥0i7$à&â©µþÓµŽ��«�XEOSèÀxÆ5Ç±½ÙŠt"Žhªˆvç¯_CÚƒåS•›½~A$º<†@Ñ¼åfŠ\;SÌaŒ)š¦6CÑÑ_�ÞßÎŠg0(4i-kÂ<
#5t‹\CC£«hõ>;�!`¶�©¨ 3ªó-× 6•ht‰D]éS°eN‡¨êë�}ƒ}��‹¨æ"­ÞÎÏ#Qn“·²º`F:ŸÃ>¡79$lVÚÌe~ÌËÇÌˆJaú%“‰q~ÖÜ£³Ë´¯§^l‡C±ô³f+/®¹þá´eBa»è<íº'´ \* Fó™CÛ;­�|„c·†Ú€˜Nºöf¾!àÿùL2i~�<[ÅØÅípë„&šÑ•A¾knînº�r¾í‹§ýìén&»fvnjn”-Íè2Ü5(!ìÑò¢ôÕÝÄrC~‡äŠD²—Í"`\TŸ'j	¾ÌP`’0iÜOÍšç�FìkrfíuÉ™÷¢Ú©j\'¯3ƒ!BºIElßQ?¦óm12<T¿§óRç¤¥|ÀX}ßõçïv…«fé*·?_ˆK|IYõÞÄû£’…{½%m`*5ÜD»¤Ñ`Œ‡N�Ÿ9$#“c½‡¤Ø záK‹ÊÏ„t±Ø€d‚ºkØ�Ý7óì[ƒ3¨z¢Ü�,ž¦Á½b<÷|S<—~Øº-VE‰lÌ¤ªíiA@O[¶Ø.5>ÄpQõ¥¥âe‹>–áRÇwçØªDç.Û‹ÐÞäXN#±'N¢¤Êjj¢‘Ð¾4Õ!™±tK_½â“Ëf¥R€À!@æ£¼C”J-¨jaÉH*öÍãû���NîËp´@w—V´[;»ÝÝêâž„sìqÂåÑHŠ¤l�¶ÚœA»?Ôþy­	"ºjý!€ä„Ö<ÜU´?Ýh½åÀå¦ká§1±¦oaÞ»øÛÖeéý8S€œ1÷Ð�ä‹„¶Œ!Óóºâ9“h…ØI‡ÖBŽë
9K«o_( [f0·¸ˆo!ü…’ù31žC·¾Á;X–Ih$¥É€ç¦¹@„Å@0WlÝ]†&)s6ðà¨4wñ¤Y�3c.üãMg^¼È1ÒÇé¹O³qs#Msñ‚3ZNLMiö}ððÆ¡9�U‚~‡è³x~{®$6ºœ¨FÕÉ¬Q¯Eiî2Wv†YF¦AÛçžVl¨¸íÖäVDXerâ(´À°Zºež’ëÍ°�3)ÛÊ\t Šù5\^á"ròÐ¨çs³
ÜwîPä5Žªf7¡NßK$f³È^q{°"L��Ü]¯ˆz`@ø•DQh—Ìæ6f²�•~h«G©5ÆuU7Gäðíë¸Ä~÷
Á¸ãõ.ˆ#3ñPŽúTVÊ!¼n¬¯ïÚ˜Pf6 Õ‰>lÛ6	9@ÝÒ–÷¦™�¥à5Ïš62òùt@7
žáLŽÎ2	ö× tüõí'Ô¯ÀbHÊäïÔ¼ˆwËæWfòñ·ÉŠ7=ÌÛü.=bx%d?ºÁî�a³ÊË ’9àeÿp�§‹½H�Ò©KÈå÷\ð�ÅÛ�û�„ž„Œ$ °˜ã›C%–0¨–ÁæÉÆÊæƒ�Ýntv£¼:€µMÈ`á³‘B„�Ûasp“&)"-qcƒ£ª	›“@©IâÇèóbkÜÙ¹�©Ì3ePœF8Ý‰ZmUL(Ù(qP05¿n'¼¥ÁCøÇÂV‰µŠiÀµª›Ú“¡Žj•ÐðÉ¿X?qég^:Ó›À[[P°V8©œ²¡Ÿ6¤ Ú=IÉ‰(µcÍG–šÛ@©½àLb!l·lÜÆ8ß¬MvÚùú�vVbõqß~ÜÒ/¤ÚÍ%ÇIiˆ…À¶Ò‚Ï¡Ö£Tó�=ú!B³ƒPS:¦m�u¬v‹ÐPŸÈsÏÏ¥ï;§¿¦ÏZ|s,G…Ë:àÆpHöŠ¯gÙéVu€£ZR>fæÌ@�â eâ‹®@FÃ<6ãÍ²à.“ºL�Ö/�)“X”3"LN>”^‚mÔ˜w'ÖÁå•©>ÛúÔ\ãC<ëñ…CýKb`ž(.öîuÖÁÖ°š�¥ÖTž'È ‚oïÕóMGô˜{x¸$
v¬ú9ï
«|èžF°�ÉxÊÊ€a@QIÛÖ§ó'í=Ïz|QùoØü^BìfÓÿ¢,³ZfúWú4æ©#�4“Îy�I¬•˜9#Ûô5ZÚ­E§ÙæÀ2â·p“'ÆÛB‡¤~»¥öU¸j}Û£WwEý`î	m÷'?è!¬@  €ƒC 2CÙùÑ pc­ÄlÝ»OÅ¡Ø{(¾C2ÉàkC‰ƒñÑk�ö'ŒU˜"®éC?¿TòQ^�îÚ�¸¤kKñæmÅ3Îémìê$ºÛ�� ŽÍ®°´]à<i( Q&wldmYÝ1Ÿ s»è3ì•hOJ¦¥ÿñ:œN‰I¢•7NÁØ$©zÚ¸ºô##ot4zÏŠ¹pãäé©šœ0�¤kþxåÈ¬Uª·¶ÏÃœF~:(|¶B¹Žü”ËnéémÆ	`N-«•�dÍþl��9£/\TÌ&1‰ÌÂ¾9›V<vn·:};B+×‡dÞSŽ\H ÚÉl5í j‹¨¦fe_ˆŒÖéæNÌ�aÄ8¿‚||gõ€ÀxÌÔWFŒiðÈ%CÏF#íöMk§Œ1—èô±žwJ%"ƒ\Ó¾7ÅÛÃ¤RëÜ6½;”{<±UK‘9`Ü;$êÑ¾µ<á»{bña*MwfÔ±º³¨O_îg¨2ÃùEj‰]Vä×4òX•*�égïS0ŒK÷¼ˆcþëŽA¤�TíPùÝ�¸`~�e?¡Fú[¾ºnºjXÌnØ±ÛU”•5Z ¼" ’pˆss™´Ö41Ø@·„Ï”ÖGiÀ<JÛÄ<{¦ÉzÓåŸÞ¢MÖ} a›Ï!Be:áÜ�o¹`-“C\Ø.yk¬þ$öì‚exÇ³€NðH•Òè�(�ËÈ_Œ£½�!ËKF³«×otvWÕØw-åÄs´L Ò>‰Ì]9bó°	ˆJn™)snœt_òòë_xEK­”D” ¥¼B	™$gY˜A¿V>g$•%LÐ0L#îã{&Î�˜–Ftdë\À¥P”=œÒa4âÊ�8"œ<Ü�Š‹süL^^NßÜòEcœÇv¹¬íH-_>é—ò§ñÖ‹ØÚø;|+‡c©È!‹©¿¶¿Þê8¾O/Ò.è§„Á÷JnÆ8¼&¨,ì�–%ësót�]6(k–H6ñ‰Fq#(Û‰[–y—Œ�¦{ûÁ0(“^àÊÖ¿ÁbÖøë×£¬Å¬ƒ’€ä ÜÚ��ý´‘&f†ÎzCqI‰ÏÝ<Îœ$’«((h\ÒEDéCÑô­ÝÜóéc_èxö/ÁƒE‚.:äýüi^øÆ+ŠÎŸž1×¦ÉóÒ‚Ji4@`l‡xNïL$æ�˜6ÃÒT—ªÅ.�–?Ðê�ä4]�X¤1h|}g8<1È¤<î@K�š/Çõ¢/ã¥Ñ5ípÈ×œÊoëè‘t’®p‡a jé¥tàbE‘œE©yö·&Ð¦4`Ø¯‰½µ$ÒL‡�ù"«…­çƒJvi¾Álî j£Z%=')¾–8–eæˆÈá`8üTÊáÇì*�Mç8õ›».¬€‡»�Öw¸~Éâõ\(H”t¤vr«"jDo½GGæ˜iþ²„lHeŒ†%ia&9³d‰¶Ïd>óü-i·lMî¾Ü°Ù¡TAï”$¶œVHG|ç³ì
ˆ$Çêù:Ç1Rs\ðZ $‘Pj×Û‡½�]Ù‹ÆgØ8`ç°† ûzß’ò¤ËVÔX�£Ý•xºrtX/ AÑp×2´^[1~R{ïëš¬—²¼É‡¢:kCU'5n˜�%¡'×CXP06GƒÛ®‘ûl[é<–NƒscOFeQúÊ-’gi$óRNè²ýo7ÒWzš_tº¹"?êz<QÕël&µ‘B,5ì¥"ú}\ÙÛi^“|}Ãð±¢RŸœ½Øè´l;$‰ŒÑ»ù'dxwáòA*ÆÍº1_wðf$or—w¦V¥$
ÈéTÛHiùóúòÓLÛâüälVc\ §¼¾7OìŠš·ôÅ¹R†D)×]îø¼ŒBîÑÓä¶=3•èéqFÉMMÉèÈ“†BÊüg·ÉØÛ
­OM[úÔ°`ô­W[pBÎ‰t»ßiÊ\öñ`Þ{XêÑñ/)ÓÆ©cD»R§ÿPvzî‹xŸî¦49H†_ŸÁÙ‡…#éº1¢ù&ÓëPÂ/ÖÕÖ¡§Õ&®Uœ¨uŽ¨à)–ïl9öÐ­ö:!å}É‘¼=[ò*²™;§­²„u{°´±ë.¤–p½â"ê!êâ,þ¼|v«nN›Kí63u d>ƒö6Œ—»Ïy/H¢}Ü’ñÑ‘ƒ{qL�œñ$’ò
çœà-ÄÄôa¡�[ŽþùstÝnSŒn2ŽÄŸà@¡’îÑ·Š�¿�ŒxHNpÁ¢‰ÇãµÞÒ2ñÐã&áé3	§ñ„ó‘ÍÀÆfŒ÷xã)çúWP'h‚7fò>‘Ú –s!¨;üp�Õ&Qý±·ÎcN>OgdH÷EÞ1u	{„Ì^ËÚ¯üVä}ñèã2Û@çJÊH•Sáö>!~õ›Lé^d	˜ærÀÒ5/ç�GyNWþ-õ`¤±âäÉšLJž‹=©Ô(R¥V2ÃÈ�ìM;¾:‹-ÏìA0<È¤	LÃ1L<F(ÒJî­ôL†îCl¨Y÷öÃN�ü_7í :*•\8Í�Þw êd5'L²ßÏå¦îõH÷s5M ž2IDŽ%ž¶WP\pyr¢~…ƒÒ�é)qN0ÅE÷|)‰(õ@üÖ(";‘JGZ�!££—U¥Û,WLŠ#E×¬ÒE¶­„‡™O5.KúÁ‘±‘¦ù™SlsoŒÅz‰d’7ãéÓ³;%n<�5ÿ*�÷Ùiu¸Ž¶?oŒ“mI–—"m�÷.çXLóÞ÷ÆF¥‘µµ‘ŽrâÇõsê–½Ÿù´Ž8³!¢ÈË{N“cÆyÙ—£íŠùNf€ç2ãý!ün"5hUÄFø†J'Ðd„B Ä2åòsv5Þ	Ö×å‹ðÊC¡r>~.�¬µÜ¤‰kgÇÏLinNñd›��ó½u'­òÒãf]¡ñµBûsL··AÉ5S‡hÕK£væœvn-Ê_e¼9eõV"m“¯‰B:ïGÎ«¾xÖcõZX
®¾ÉoéÚyþåù òÂHKgTœ~cNÂ¸íâ ‡OZK:ÜbÜA€%9C	]�ÃoòÊ—˜¹ÈÕwÛ1�Ý)(£t¸˜^²?±�u€Æ¦˜-A�ºŠ9¯‹£ §é9NÖÙ„L­öÁ½#ÚA2YuÚéáá½5ÇÆ/_=fqlÊÇjöÆåÞ‡ˆ¿¾Ë¡?uöýAr©Z™šÍÑ]ÓAëX _ÕvïM¼�1V–¿&P\ïêÅ6X£“2ëë�m7ä¥±[lÒ�'»A©ÉQ6R»SíQ}ëë”­S‡ìe•ìïS\D-wLrTC]¹ÓŽorly½Ý‚X¥ÍÛJ^foî£-ŠéðË°‡•(•X3ÓR>\Ö#ê–	9â‰VPé¥˜QÕ�Û‘,aùe¤Ïä¦X›#¿*…ßçgVìTnqù�ÍGL—(˜ÂZ)Óo„MóÁiŽå!#ZÑÊH.ƒÐ$ñ‰É€Wúõ´ ¯\°p©¸Ð*È¶õ�/”•.g¾Òy 9“ïL2—�p§(Ñ#Z-)iŽÁ¸óµÝjë´ÒjÔ­=¼0b“óò`n£0àa]œk2“I)ºXíEÛ8f–nD±Î·»%8’CS.ÞoÚ‹Ä›öNgß'dÝp­-�ÙJ“=aºŠ½Y<lÜìÇ £OYdbÉHl_LC
^]ÇÊÒÑoªñÇà�>«É¹Ø¨¨üNk±Y	¥‘Ôµ=�šÔÃãõf…çN¥¬ìHÎ^•¹ŸÎŸfã¨<–—‰(|âEÓä(SLµ×\ùŸŠ>œuÂ4vdN—é¾õ~´HNò «[±nDÄÌÊeh/Úˆ(2©1¢he_Ê”QnV=‘Cäöð’¨ùHÿE�ïgi~§%ªB¥ã15þÆàczÅ•v�>aëY€ñ%±e¾&c! ‰pIBË8Ð³]~A-l¡64Ã1¥˜’/°[\\ZIõ
T4ÐW¹ùðaa8'lúˆxRY¬ßN’eû Æj3:Üí-:G�Û6åvÓáad$$`ƒM,Ü”Côö¾zð3·!q†1“˜÷�à]Ó‹Ùßn#xŽµB�ÊçÆÀl]¸¾KÃ^·t•ô¹ÖÂ_@YÐüuìœgSúµk®ç]ÐOÆ¤—&v:õ˜NƒÛaúLØewÉ‹žõ-hY}:¨Áxi O¹ •Šx|+^‹Ã±²Cq%„æ¸]{[[Øq"š	Üx@LÖupÕ”ÕÃj»êƒÜÖ-Ýè£[=É‹Àõ“Ø¦²\ñe‰‹jq[þ%ï³^W¥‡”'âHjÓyÂcêô%J8ŠImx•Âå=èC/ú].&Áw4ÍDÞÃ,Æ˜ÎÊ3ù¹ê”"¶z–Ÿƒ`ÅU©�êÁ|M:3Qc!“_Ç£åñW(Wj‡�ÓùqëÖSò#f(G4GÞ—I>´§Ôà…änÕÚ„E’üÙ©ÿ÷�ò^„›’€æ—Ë—‹Ú<D$>nñHG[ÇM‰'ÉCÔ&’Ç¸'oørUm€ŠÆûÍNËÏÝ¾wJ?‰å6—\A<ˆ�NÁ¶÷ZK5¢DÁ)˜ü…ïHi=‚iÙqlSÎÕ:œB2¶&yY‘í^ÙbØ®u}æY+lcü¾ZÛmLÇÕ%9¤ã¦sÁÆÌªYïOò1éßºYD2L¶
¿ý¿Ê¢%ø¢õc+7�V”_.rsIqp×©ð¹åº >ÉbGìNz•Å½2²q–X“ýDùI®ÖaŠö–Ú'HÿVƒT¢­ìœ¼™Ÿ•EÉt�|úÚGµ3–(oOtrJl—s<å;ÕòÜ3)YQùè�`gw‡8"o½&ïß7>îcÑ­‚ˆ^¢õ@&æÑtêT“}g»±$‚}ˆì°0hºh½)ˆGTú¾ Çs”ãy4rìÇ   oêMòH;Î¦wê~|ª !(ëïò÷Ïùö†Ùà¶÷adØ"	¹‘Û-sQg#â,1M°œ|¯­/©uÍhöR”±Ó-Ç.k$GøK,Ý…1a=a«üŒYPÇAÆ,q”%!Öÿ
ONzvN6×^¥Æ>ðîÆ¬AévÜJ‡FðÓ½Í)°É
/�™ŠÞªlÌ’©B3GMœ¯'[�,n\¾çŒ\kÞÑ£m1¥hm´oµ>!Óô»ðÕjM0C <¦éçÿóåŸµ€¹ßŽ\½¼»»‘¾`K|_xNô`Ç€œ¸žpWJèjHLöM©<”ê_”’‰=ùŸª�C¨ŠM@WÞ…Î%ê‰·¸ýÇ†‚ôá“f—£Ž%ä§MnØpæ¡Z Ô3ý@>'öM¼ðdþYº,BT³—u±ÂJõ:ùƒæØo>¯µb^Õ¹áÈ‘’Þ‹GxŽº_Wë`ÏH�’"=´ÏŸ£þz&=Þ@þ%ÓŒHÙóØqi“x°DHºXxÏjê„¯K |@ QT°ÆP¨ä+ã:uî²cÝ}Ðž½T²›Ë¡ð…B5ŒÚ¨Ê81‚ÖhÈ©ªªœ§a·™FuöXLc[¡nN×¨xtNßD›XØÅ*N8ýðÆÜáÃs7‰|øö†Í2�R{>}78øØ.Çá¹GŽ�ÕyÕ‚°ŸOgÁ#øQ–‘šqó' g
Ïf’ª¸ÂKøYˆ´`²9�hó2êÂ„É6Úý$}“® —ƒ(ÃT?»ï²}A­`÷7Ô8”è€LHFR‰GŠ
EýFJXw!SÃKÒr†Ž Þ@EKaúÜ2Ëö'¾é±ÊŒ”%v[ØŸ[7¾‚S®F³j¼èj†‡[5èh¡Mt,¡¹á^ÿ¡Òi#ÚáCo¯´ÎqÂ§ûZ§eèæóš½t¬¿eãWiþ•·‡îp_×t¨ÿ^*>²¸±ùVlhñùZšQ£jX§ÏBßã¨ª‚9©q7Ö@ù±‹‚¯¸'´Ðíãžáú«[=e‰ÄH+^Ñ—ºÅÞêa/õG…6ŒzÕ<ð6)yÐ¶‡åDHäwFËÏóãvåúú2nF½)%Ãdøóï¹î.�)áÆÛ•P6^Ã·r	�ã{ªh÷È<ŠLÊ?³Ih.§·˜Ž´dht[$�åã]	ìâ²fÅ˜°9&4.Ú; æs;�BŒ¯•ýö
šköõÜæõõ•~Ï>¨j)Ï°y"TËã�¼j½MU�édÎ‚M¼Ý±­´[ÿ„Dñg4{+áÝ�©Œ¡:ª<ƒ9q©·þAÏ¡w	L}»ÅA=Â£6¯Û evøÝAu”+Uú_ÿöQÞ3fÞ?Ÿäâ•R·\—0RÆ ¤R^ ó,÷˜ëVÑw…ÜW¢‚²î2â`A	åv©G©<9“Ê4nX;¡?»‰?ò§*uV0û«ä´Óí{[4"®ÃÎ‚,¶Äî‚qÓ¼±ç<ìç’RKš+‚ß†k5ÈWxcFì„ðPOü=*Âð¥;Eûƒ™ÕDƒ~¿Ï:Ô	’m\A¶¾pø²ÚýËë\XX§d·ÿ«õ+¿Hk6ûÿZbÞìßWsXä¬/ÔÍ$_º­Q„ñ„Z_—©½hh�Lõu|×Æ8ù	ÂÖäZ”¦ÂÔ}ñIHÂ:Æ‹oK}»Œ
Ìa/-Õk£óxVq0ÄÂrÊÎLC�_à„D6h&è»“S¥q}pß¨ò=š¸~38¾¡ñ^xŽSß¡c¾¨Õ8Um±÷e~7°¸¶ô™VUZÇ:ôvÆ¯ä[mé>…¿€?ÓÑàp}ô_áùgKBÝô¡úÃ_
%ë_¤g=÷Ih|.Ý¥Ä…òþV^1ä“º0	"{“–7†ƒm†sÐ9Èê›¦³ôÑBàõìNž”IÁp‡Ìi{
]J¬ êö:M¸ª¥Òyä%‰Åu†çÕ ¿úGæÍÿVÖ�¡µæÒkk<o)Î{<OñGJ×¥¡xCNj3-ËªªïñW-739ŠBÆ’(T
`ÚPª¯ˆXé¾iŠ‘wQå:å�×ÁÛð€6ã¸)"S #·-è��,®"v	õ„\îêd~n°‘2rr2Ob»6‚[–T�ÖÒ
R«KcËYóçŠ‹ø¯4c]‘>´¤�Œpyà§æ�jp:G]¯ZÐèØÈ$0
‹ôú_êN+M7úY2l
@x‡ê6q�á	·�4ŸÕß59OÔÐ¢œ}T“�rüf5úŸ2ÿk tªß²º}»pÄU\Òurº›·±sVl¸×ª…a‡õ¼Þ²Ž}VmÚñÇ~3ÿgm†�Í,\7m}•-ŽÁ„*ãš,EH›qç$Yx¸=E˜üþ_V'žöCê²R™i‡NDµú9õ�‘/ Cb²³ÁØøx�¡@8`Á2IÌª,!ñÑÂfÝ„²nEñó8Þbñú+Q�”2ìª˜ë½CZ^?G÷øVfâìöç ±²û(BëàIeóü+‰9­î:AÃõœï
ÿ¼v¨¥ÔÐ4ÔRB·H ×zçÑ³yì|ÿx¾®œÖ£ÛW?€Eût´ÐFOÏÜ”á“cû”=õš1Eå$V(Tó’š×Á}æ«rY£!HhQ!.F/džöôÕ«G´ƒž0ÿïÔÑ;j86tþÀÄêªÅ®ìÐ	8ÜÕyäøßQG´ý/Zµ�a3=
ËÏôO�ª‡Â_ÕØ¤Jš™P×’¢I±Rs£Z=Ž�|Ú¼A#‘Œ¬¬Œð#‘suëîæ›»;.ëéÝ»ú.tŠ×©:êKIT'�6˜•Êm7˜Ò"ò:ïìâ¾sÅbÇq×yLâ@Z,Y¯	bg˜ŽÝÅ,Áþ¿nŸû‰˜{O¸;]“Éª!_ã"=cøÓº†š‚dij›2¤GìB¿Xµ$€ãµà|©«iÛ!±¡‚*nTî%›û;Ï*êÅöä^3Î/cí®¹EÀŸsŸ4öºCwLj})±ùâ<(†žYpHwâÝóW‹^’ýHLŒ-vËÛp„ùÄ‘@wÞÄÐŸpÅÌ¹�UúK¸—À¡>1ë·€ñÄLË¾©fâ0p‰ÐÎŽ—=Ô_ëŒñŸ!	9þqÆ[ººÁÆ­®ùt„-c\Õ	@Õqñ]²’àCAJ´¯pÍPao|y©lNÞê‘{F†ó*3³FÐøËxLTv¢´Ð0Ô›V,‘�»äÞûóÔjHõA(\ÉôÔxâúûŸ¾xtP½õ¯ªR¥^©×åå S¿ïh"‘H°ÆýJn#_p¿.Â$­²�s2ði¨ñûBÌææñ{TÑuZKt\ÔLI‡%¾íñ*šŒ¿Pø={ùbà"U¸Q‡"VÓR}	>Z‚ÖñŠÒ¥�ÅŠN±³VÝ®é-ûJÉìhÏƒáÍÃ^©ÙÕÁŒ;’¦FQÃÔ,*+è­"õ"Õ00)¶:;:V”§P8*e(7ÒJl—½Ž‹›0oHe^ÆŠâåy%�`¼“4§ÇYÒ[eX}²6KüJË©„‘Ì  ^#<É�ÉÏIß_/î®23-@±l³4–Ëû`ÊìPâ=æK&=.)éÍÕœXvLªˆÅf±oÙ�‹BG]Þ®�Ò+ò‹æØ‚Py¸ÐIŽn©V`æk-~SŒÅdÐídýØcU·—.ÚgÆ—'Ý 1NŠýõ­0P!ô ¡Î¯‚‡H•í¨]Hf°ž[´ZÂxËâÅ\.Â ‘à€½+¢\_4b˜¦Ov¯ÿ‚Š’#»®ö±ˆÅv!‚lÌ,Ôx<ìDxIN-F‚ìe,/‰\m‚ÞÓd´Py˜ÄIr†ƒÇ�&$ŠG¼KñK¶„Ö‡1Äq—zGŸ!¯£²µAí»À¹38­Ì�Í97U;È´Veæg °éÝŒ¿L»øÎ�oœtp’R<sšåk0Uà-‚¢À‚°æœ=C˜Ë¾C±žžÑöWjAœ²µÚOiÃíŸŒ¥’il0Gtc=T£	¬u5�<Ù„ñ…ú'MŠ>#Ž«îA§Dˆ¢Ãä¶…¢)èmƒ"Ç›ñX!-ê—Îœa¾R•ª‚¹™_­ô‘});Í;6ÅïÐŸ²(ŽŽo:Ö”üqC^ýùÇ•í©û­Ûµé­A=ŽzùOïbÊ	…d„~øÊÅÛÛû¶�×îhz—n/J~˜ÇªÅ¤zSè,J‚¦J#2Å­ÃóiáÿZ~_¢{c»Œ]o–bR:ôv:ë£âö?e?	tZ]Ö¸ßÕ ßgÕªMkê&ŽzzŸq³å%ÃUCW\YÞÚ»esõ¶†7iv¢ä¹¬Z—dïŸT©Væ¬QÌCŽ$mÄŒkÀiÝw´Æ¿#óæ¯;ÍøÌ‹É	%yËG­8@5:yq)´¨¬|âŒ¬NÝç=ý´ÆìÅÝBÖ�Å^\þ©Sù8]ëõª]š?{¼ rWùµòÒ[-ì¹+W¤qÙ)^2ÕøßýÇ-ÈÌKK 0g4‰LÒ¼î&Où²SP¼díà�Åž-m²€Ç>÷¸Ýó€‡nìxÊQyYå´Ž báâ‰y¦CQš›ÎÇúA Ï“)˜�BËëD`<`’ˆì™Á×³±²ðé¿þ7žÉ‘»%f"¥Y‰“�û>¶’ÙÐ¨G]ÜT}ê_óâú�ÃêÈTÄ,aÒìß^&xÔ «‘ç,v¥4˜EpWðÂ¶ŸòS„AýNïâ…­gjÞ)ÞÉìâ&ªŠd™ º5¸4­äþ(Úçä$ÁýãsDâBÝ¦x�ðOŸhªXQŸÌLâ²w˜Š`íqŽnPîˆsT¡sÛÕ'@ÇTzÀ½,í2ÌèJµ*njÞˆû4_˜}3¹¸�œ»×™ÇjÅÒ«-«%iù¨ò¥½é
€ò·½ÂP’Oó¤F?�­kjSÛ#íGú'ëÊpö1æŽ½JÃmêbÚöÍÕa[ï2ï±å?kKq§²!Œˆ@-^Y97÷*�–o0ð�‘iÅMÒlä=õßºü¶´íª¿¥’ö¾(é7g©¼¿_«ßÇ™ÇWåØ£¤Ó..û�
ŒpÍÛèk¤ŒŸ®î#¬óøøÁc]@àùî—’�q‹ošs]¬vKŽÀi]ÓC+šK6Ö-í/'S¢Ëè{VªáF#pÆ¦uO&áågôz‰©uòàt’ªxeL”.Š¨vÞsÜMfïÑŸ@/ãÎ)öu•°ïÈAã)0!Û½ø )/Y¸¢Æ_$mU?S^Þ	GqÑÚËÈVÄ‹j.vÝÖñUH¡ó0ÁÊmÇ•ÖØ*3¨¼‡Ðbt3€£ÚÉ(áÏ$F#±ÄPƒhzZ˜²²o¶Ú\¢Èdùæ² pmL‘~öLjbËmmKåÐÇ	¨qsNñ¶"Q_Qh9Ñ	-‘Ûã³ŸCUÏÑŸý�Oê=Þ†öyÔ5ñ„ÑYkÈíÔŠÃN.eu›i­#u¹åÚ’à  ¹­’pÕ*“Ø!¡ôC_ß»3ŒÕQÚpƒazm¦gç-–Œ™	¹-å‰óô k
8‰«ZÄÃèŽ§–YP”dÌMªœ±ñ`TG¼µÐhÑ¤]:«døÔÐVNÍvcªW:w™ë�|kÒ�.:Ó«�OÝÚ‘s€w p TÊÒ€¶%zÎ�Ù‡Á*ì0)ØêA&3¯’PPQ_i.Þ-Zé!á�Ñö½%ÑTtö¨øf3ëk×´Þ+´ð´ÿfƒÐÝ6‹�ãµ¥«Õ6mPÐÑ�H4±×‡…Ã2þÕü
±umMCÍ¥ç¡pm*YË­«‹Ò9Â_»�òâJ[Äóóº.9´×&óá,r€H¸ißƒ8É… ïaÂÍÖÈß—[¿N˜n³þ<ŽCrxLµïrùJ2âvcþä>xÍ	üœîÖäJ‚#uã¤·:nY“�˜}lôzÂÓ®´é^Y;ž¶ä±z´ê³Ó‰¬1À`7zƒv/š˜_çœ“°Ê{�Ï='T‡ `JÙ¼]øÈ‡UË)K{vû[¥„°Õ�y¬`×-0-Ó?�šÁ^‚šÿÇ[ÉmSÆ�Â=ùO#_D­­�qÈqŽmR0ÍÂÓ)•
i¢bJ�±}çÎíø<Ýwøoâa�6º[žö�»^D…Þ„Zz`¯«œàÌ¶.DæKÏò§Í=b±	›Æâîbˆ ä�l­Þ²wí—‚MâšÓ7dÖ†¥£…€€í#wQ]!°öØË˜˜óg1}BJÚ9‰†úÄÂÔŽñI®ó=CVR�¹%ÎLÕMU¢]C(õ+#O÷1Q®djÊ2¾¹~&ÇB'Ù©p¾ÙcðQÞ4Ì1#°–šqÊ¸L�ÉÌ®®L›âž’›†GZt*j–I¶`èÛQµ¢�/ÐHJeÖl¹è‡Òè±Ž•›”x[0”D£ÖŒ1ÂÀSTK‰afÔ;¢øÙ3`L˜°}ä�{Ø§J&5³€±ÄÙêJ„^·üõ´G½�†¡†ë&õöžx­î²%n†q##éG³¡7–¤ÿp(/8ù„�×Ê¶JGyÑ¾ö8Ñ?–¤ÿ°È+>I´¥®ø�å…‹Wâ»TÜm
Aj˜÷/bˆ¦ˆ³YFNGÿucþ÷µŽ\®Á‹ˆÏ:ëi%º–áfU,pæ‚Iì�p ÿ–^y¶ë•÷BÀcxÂ2ŠÐì÷ÊVbà§6N¿dÖÙ�Ó™T€äæ�lÆW†{tÄˆT{ð–èS/¥Q•Yþ¥KýŽÕ7·ä#®»pQcGo‘ÞðgûQ €G?e<€ó´èt†ýçJ øé¬8·3×YµµÞ¨üF^:žÌŠã|îŽÊš8`r}àQçÁhFé4Õë¢ºj"³:k¢2;k£Î.,ï&þÖzÛTIF·Tyø=�K™Â;Âpr$ÜÑ²€8f_›“TIV[…Š[²Åº`öÂæ.N0ÎU¸©ã8I Yž—ÇD5•7öo-
!ómv9©�\/µKR™�±â!ýŒÿ6ÿˆ�béÉ\µ+'Içe/±�aöÊFzÍ·ûµ{í‹óðP|óµw�Ã4ej-¥ tÂÛ ^Â\ßSK×+'¼JæûR›‚SôŽ f™ðÈæ‚4¾–Ô–+ÆeùÐÇ"ÓƒÖj\‘óÊŒàEÍ.Å>p¶æí—!Í\ì¾õBõà¸Ã}vÚ†N!"fÅëºãR‹0rÖGÀß»À*¹Ðý ­Æö•�/J•äóâ6˜MšþñnÿëÊ~‹«}}<ñíŽoá°à˜çlÏ¸ûpïü½f%íÞÿn~ÝØWÕXîUá¼lA!¹Ë�!Ó«Âýý8ëiD*¹z3ÉÙ@¸…EYoÊJÒNñC8f¤·’,ãR	œÆ�ƒmÖwð¬EÁñ(ÉiýwLŒßeîã7ëxÐ¬»òÓ2íçLz ¬ B¢Á,ä'\n@OÞ¤lï÷ÿo<i‘½ãYUÈ×Ê£–:‡8–Þpì€u£ˆZå8ó¹&>æs4PcX¡Yû–ÅßÏïå�}tò¬p�-´	‰ŽyC&êƒz¥±Ê
Z`7¡)ª<iŸ©¢6Oggtx¼
hTIºw1aîrÌÌÞ3;e®»™å0tþÐëüýYsmvËYEö�ÞÃ{)®K’’öYhô£&�Û‘Ç¶…÷XžîÖá±>T)«0ÿjJ¢ùØ×¯�$7
 ¿“¢€Û·oÁUck—±wñÔY;8 ¶>Ìë€ñ+gÑ6w&$Ñ>Þ‚uËë¶îú>Â
ÝVZëÁˆJ´£‘´¸g‚Ë¿å=Šþƒ>O‹åié¶]@œÉÿåQYÖ÷†ù§÷ØOÚæÚò¿ÒÆ½AI®N%F(�àšYþ9Ì9£ÞJÕC4ÎQ@Jý¸¶9 áu®3p=‚0A£Š1
¸ä,^õ>„(µÚHR©ÔBx�µLÔ‡ˆj-ðíïaÚp3­ÿû7ubðNV4|u‡ ç ‹ale�šz¢ö¨J@êÕ5ú«ây¸C�Q@RRq‚Où§°</ä&ñIG&-p@_S/»mn¦õ¿ØÂc¦�Z5;õ<y	ãË/éªžP–Èe à�¶ú�­ð¢”Ó–P.WkôY‰D4Î<íAŠú¥Ó¦�NÇ¬•šiÅD•öN$Â7 í÷.† Ò+ËÀgIœg¡Æ:µ#?á¸¤PuG—q+5<(“ÏÚ®-H»JDŸ¯¸àU1&gì»Î¾#Y¹#}Äƒ�‰-”s£<IšÊ¹�`Î{6Â�pØS¤ûšuAëœmm‹Gƒp<í™ÜúsøOic0Ê¶‚u¿ø�”œfÂ5o#¬’œ’ÚÕ.ïo]…l®<(IëÕ–+Ð [D-–±Ód¡ñ¿qê�»á)Ë<UPqyoQ^49K›#	*Á¿ñ%^þæö�"Vv„*-ÂæêsÙy1"N¤!Ã4Æð\U$ÑŸÊ‹[­ÌÀM}�ß‘O¾r=™õK-‘
‰¿82Iå­þÞ+‘Ê(±Ydmh¯¦Å�ˆœLa ¼$U™T—®
ö”C÷(¾ÚåŠŽ' H(xËµ
öÊ=žª<XU—®Q”¤Ê‰ÂL)FM‹‡^«>†Â¼…pÅÞ…ï1ÌB¸�j°*½Oò€í|O±,‚îŠý‘î0Éß°¯Ê¹Ð½óˆ,uî‰€Ãè„üÀÂ
´Hsþ5½ÞÄ²ÙÊR¥Õê(¥‡óõ�+¤ÐF»LÇ?Fh#~Jôò½1õ”––”´¡p)O"Í-JÈýq›Éƒ7Çu6•×(Û„¢¿÷«ìÿî–!P@�ê>Ã�1”
 ¤&'Žs3­Ù‡†X,ë9Yƒ|¿s«ÓAÈCEvpÆ|Ìº%˜³3¸7”_*xCëæ8Ï
<£"Œ'"GÁµñçÒ!ÝÂ£Ä¤çVõë³©àsÀ&<6D-mž�Á›¡‹�t®tžzèq5þ·"m÷Œ¯¼JëÜì}_ü(^½mí'V ³››sÞÛ´F÷>}*sÖVÉÓ‡"°¦ Ì÷mü··­ïüü¨Õô©9oq¨¹§ºÑù{Á”o¬�!<¢]w¿@að#aŒÄé¹Y×Y}iÁ¢”Ä|#ÒrïÒ\öò‰—I”_ß™‰W+ÛË"í‘ŽÿÜNÜž‚0—|—ç§9§8èÖ½
.Åyf�¤¸ïnìþsË¡ èb˜¿Î~p*5E#òs
ËvNÞ9>ÐcÉäè³QGÕ!ë€ÃšÇ�8þüÐŠ‘y³6&ªÊ½-2³~Qû–Ë �[ôaá¹–˜ëÐ¾)5ÕããÙé_[—‘zï_iïtªåób(ß­O¤�=èC/úÉàœí°P4?9æTË,î1 ¢¯Õ¬Ò†9ÑÍ"õf½àÉPî¬¦]S»õÛÔœ(0v4ûsÏJsbµ™nQ·{éìü}Í#Á@¤ýò÷îÉ� ñŸ˜UÙÁû½¦^¾œR+�/6÷'
¤—�‹‹ÈKh§÷-íßFøs�5“Xþ´Þ–XüyXQ÷3ˆÕþÒé€¸�íWKýŠÔb"�¨&ËÃ¢Ñ{Ö[ím–pÛÚZ¢¾âÖ¶/Ê²–ÃZ[ËÛZ-l$ÞNŠe”WHWÏMÈ_Ñ
VÓ§äxæs“ä€±X)äÖ™oÁC&©6Ùl˜ktIp‰¡] .@?wS¹ž†h—s-â†$á9ìèn±P[¶Ÿøõ°ŽpƒY�Ó²Gæõ:õ¥¯õõ™EëtÑ×çîb&¸<˜Eè_ëñÑpÑ0JtzÀX§­B´²õ¬.Röíúõ
.EÂâÄŽ ”u-0OSBÃ¾m	âÛÕÇ¢œ ñâ“ì]v”ßd�`·ËÃ�XÿPÿàœâú›[ŒêVîCÓ4O‘Œ‘µ�¿÷0&zÍÍu À4Æ&ÑÔE¡Ê™'tÙAîöÍBÁµ%Ú+‡DËŽG~AíxÖð¼CPKZª —n¬Ÿç¾Rg¼¼xÂ+Îôi|¸oñÊœâñ’8¬·oœqJ³`œëüGÜá~†‰É•o P
ç8°yuq‚ë¢µÙÂÌúÖð� µú™§��Ÿ™ÕŒ=Æ¶Ÿ›TÜÂ·n2p­¹¿aA/áF[]+p^¶µFµ›Ä(ÊóýÂ?É¬3ggó³õÙìQ)´ÃÄÄŠµDLm4÷˜G;¿?81×[Ñ«ÔTØ> =±Q8ãª)Ê’Þ5Á¨ck+gdR¾ö †ˆÃA|†väìýaê®kBczÿíå[•éÉC8”^'³Õ¤†ÔÏO€S0·ƒ* )›5r�ë|Ÿ€È¤Š“^Ì?øz}·[ð¢À�SWU÷½ö±ìT}��?L×ÀöùUÍ^»ÀŒÍ}L	Ò6h¸8Ûîbâ�ÇŽEÚ°n¼/„MÑÙA…ì6Êâëû¶“6Mk<éÌu9�o5)?q©	#Æ019u£A.ÊmX©iÈªòfgÆQ“·ºWoñþg­@Æëu¬;Ã	Éo#–¥Ìõ&�o4ŽO‘:onÓôM^©�¢;>žçr‚0¶.'š}¼)Xõä"¢9™ºOç°Š‹~©.7@3¼´òñš¿_~I*ú�•`ú…ëÖ£Á±q­ÁÊ^Q(T†•ÏØß 1÷``Âów2�¾ÞÆu­¤à¯Õ“¯×Ø£ËÚÅ0ŒFïµ(zc<¹ÈmL©hcòõ-p†:’|méÞ.Ç¢¹VfhJâêMø~š í[Ðµ´}üôrŠÊ2‹¸~üè wzJ�:Õ�{és	ž3ö÷xÔº×,G· �MKd¼š°v%bí±o¾ƒÖ|àü­Úl6¥z	^aCG;zVl¸ |_õÃ¦ýmà¯·E©ZQlœîZëî>g·ésSo˜¬¿l›‡óP�ä®8ÿCè4>@š�ò€e1bÏ‚Üœà	 þÌzÐ×÷àF]µ5¶QÆƒŒ/YávAfGÛWJ;ÿ¨=Þyw@¼R¿Ûåþqº\kK0{2tví0="w0ÄNÞ”õ¼r¯DînÚƒJ`3Ä7ù%/-Ã*�Ržî€.U+ü[l¯Q�†7HÂÁ×ó0xø/{Ç†q°�Á8>6F²¾'0*G\òQÛa×$;žh‰f EB×ü§™Cº–„·-`0�Ý)ð�ƒy”[hÊ‘‘ö¿ÄVê•
H2žpCŠ´xQµPÂ¥ðè9š>&zgá€­�*•+kÉ¼„'Å¿ÊW_¤~IùµŽÁPg_÷CO{bñâÎÌ–‰£ªaÕ·ó¶NÉÈ ðÐô
§û~A'•/IÙåíŒŸo²™õê"§ÚÜ¬*0w§Á¹ó°�ëŽK£OLx‹û‰i1ÀM*Ë€zÜ—±{™ ›mÍeJº!,O'ö¨Z2NŠmÂâ:¨´ŽÜ¢*GÇ`àôx]sÒ¶#fD\˜ýòº£ÄFI‚�Hwóí]«ª ’Iû¢‘?¸7#È‚U‰.ñ5w5É®ÎR?7ûÖ�®ä0‘:½3©¿np&9&çVup°´¤AFs�›ŒUc;I}»!\�®UvÂ´å}¨„b‚¿™z:ÍÍÎ9yÜ! RÙÔØ×Î¾“î“Þü©Ê
N@)‰0ß—Dd;(A°Xr´[BùNþa+–ã{ÇÍ?X�‡þß/§ªJÚ½ÕœvÖÝ¶Ã6ölÒ¤gŒ´‡O%º¥ÁP
(Å/V«Í êj„þ>MT�òc74bÉ¤^ì~^ì()yÇI½ŠÇØÐ„e7a'xŒU$u8•‘æ/¡œâœôNòÎ¨'nºàÎhè´‘ž51Ûè;¾^n4‹8ë¾ß–SÍqÏF;â Jx‰¤ÜÊð]ð]ææþY îÖMG-WM¨ÆÕ_É	Kã¦ÇéV¤gGgÇäãÓ>„•ÝW&úÂi½&ûÉ™Û£Îº5ËX˜n¼ÖF>glaÑâ§²�0ÃæÂx){“åâ8ÜÜ}>;|ÎÄ9	i¸ 7?ÄÉkNÁ¼ÎÁW¶½¦æÿâ³ü ùÕAòòPùEjö‡på¦YÒrÒŠÒò’Jáp7Ã~V¡»ÚÀ·8à´ËoŸ?—£Úï»Ë×þë ‡«Úç­ü3#JF	;Sl6QA€iÝ«¤ñCßìfT0YòwÂIû÷´+~Ô´[—°kB±â“4Ñ1Lù¨[¡*óÆ;/jÓúLAM0Xå}>ý±¹¤²õ.ätØºuÈÃtj�²ÄiZ�¸ê6Äì¡)ã±¤uìdøšønã®üÀ¹•«¿ž?”´ÙÊÊî
ƒ|n4oZ»ó8HÛ/£ÐhÕ!«Ý}ƒI>©×Þüßdþä	ä_ãYö3£rD�wc6ÓZùµÏKåØ¬ø÷ÆA¿;øŸTÉø� GXKb4îp :I9èëm�Ê{#?{ÿÇX%ö¥C°‡KM;áŒëÂ E�({vT6La›Y}ÆjãO“ŒÑ­TöÐ²¿`u ±¹ „•í»ËJÄÚÛƒõ2f„1ößDšéã®/ŸMüèR�1³Cb‡ @#Ä^$yH"¶cá%ß€äÀ�â.Mt¾ØB›Él7 ê”Õ^„§È]]]½*—¿eÂg^1:Ž³	v"tª¼Å2íå=M@f]çMºÌŸD_œñw`tÑ˜üï†Áÿ¦m�¬ª•ÈuJw¥"Bh›–…´O;“üÖ½.„…w‰3,ÃeJûVKmÄC2LCyÓ�OØLý�U•{Ê/\"ˆæñïK±	h�ž�ª	¿bxZˆ¿ëLR¾šºi½OÇ(=î¶|Òí¤üÇV}ˆº)ðµ×¾�à[[éÚPö[ÏóîñnÌóä2ì6Y�Kª•	¿ULš}’W0$ÚƒR: §¥O ý3Ijº(Î’RÖ…J�€ð‘)§�Ôùí·¦±±ûH›IûƒÙnœS·(Ëg˜Kêp¥¨ï2›\Ÿ�¦oNÝï�yaè»šö¯Áž8”'ä�Úp¶±%×K«EE©gOÅ[:*Ì×¸ Ïpº˜â³‡WÞÞúüÇÈFËätøµ!WåoãöÚ§‚"²Ë²"CÖ€oˆÅo¾åB­Jæd†—;'KÍ’à__öúžh¡vê+Ûó“�dÀ�¶äÈÞ�Š‹ '—¬œ‡’†V”¯á¸m¬³ªI.^ÅË…	Á¼8ßðBŸã¯s­f‰G0Øþ8ãÕ¼²*Ê® ¼™ê©�­TÒ•„£c¾³6ˆs~ø îJim°é±¤xY~­êVÓ)‰Iº·Æ›¯À+Ôáhüó�ÊÎœÅ;]õžEžÄÐBAÐ�Q™‰l"”UÕÚ†ðµ,ÞCì)þä'f›C{ÜKD†]Úp#(^ñÎßºåy÷s=¼™=U¹ÜjonþðlVeöuÉøiJ+$ÏÚdÅUÝ#º;õ¶Oëíœ
	?9¯2œ•<×;²q>o	T¯r¤x&Ö
[µ»'-Òx¦p¨0j§[ð;3œIwéŠ¼µ€6N?;›±<m'*ŒxD×ý?$AàÊ‚ñ8‰f""0Æï»ÊZIù;Œ£ _ß¢UcGk¨"É#˜+QE	ú p›Xd|Ä­Ì§Æ!x3£f2öù[ÐôFƒ‡×ÉKàÁoa �æ­K~¶Û·R©6	ÜYÃcjüÓ<„—L]èƒ%¡ÒÒTSË¶RçO�žWÃ¶bc»Â£ÇeÐP„}ŽS½®¼\õÜ
ÞáûT„ÝöÑuá¤ hÁŒ¹Ð«k¦».xû{ÈèßzZ	JToŒ;Ç8æÍHË¯‰€ËP^EsT
'Kœ@ÁäîÏ÷
„tö�Bó%FjädCÓƒ××ªo±£®†@XV+®ãê°z.“T­ó"!"¦Æ�ÔÃBÃž²àºÌFó‹.~‹_‡™ac¨a;¡Ø ô;%#	O6�L›÷=BdX˜™áoÚÀ
ôß¡¼sêïåLž!.ˆA2�R÷  ›4
£©˜‚:gµ_�*[t—ˆôS*]Ž¿6ì,�O9»3¦¤ã¶ß5þ·Ø–#^¡žlƒé�m¼“[Êe¢…ÐŸ¾¨W¨
=è68uÇP¼Ý¤ä_—çÙÇMîÔp‚"KŽ}q�ÜfnŽV}[à[ !q¨e‹®£*`g ifÍò |TìÛ/\w„G3ë	•¹zCêUlrŽ¹³âºÎÍQHä$qþ}r`–“úogªÕšgÉO3Ë=éªÄúº+å¼ÜùöÆ»�ß{ ßNŸbÜó-p©g[rï:¦ô�ƒ½¯ëì–ð~Df,°!³>¡©Kš£š9YR2ºðvñrùD3ïÄ'ú
Ãø™K¶gÕ‚?h?Ër_úÔøK&`tÍ¡ñŸž‰¨Îíy7…Ô&.Ÿ>ýtõôuç4˜ß›ÍG·
¹îÝ:è^MŠpv„ïwÚ´ÜYz~Ú‡Õ±÷MÙªå!ÁRW›dÅ;³#ôß	^ƒz×Êˆƒ´ðÅQ©Ût\£Wy»\OJ14¾Ç:5Ò\²þð—SXT…·Ý Ý“šùgçv·V9�UkX,m¶iM²\êè¶þÆî(nŽž>E�I¡ a»·ïIçi…_“½,ƒ˜ÚâÇê(÷;.sž)°=5žAžIžé(ÜËwX¡g§}4Y“”±‘DpÄ4—¬{êjq(Q
Ì·ZJ²U�Zf±K±õ*Åx C~p"Ò2¯¬rƒ#ë$!ŒJ†äzZYÑ. ^|hÐý} �ÈzŽÀ²XaãŽI§‹¨EªXgÐt^4«R{þ³fŠLÉyÓpÑáššÉ 1Þ¨|°OÞ2Ûà5Þ"òtÉUã’AéÞ—ò•@öÿuûRä¡ýPN¶XÆ1¢ZN�þÿ/¨Ü¨¿x¦öýª•IQ¯Ã—–Ã_Žy6�EKøª¡¥ /¼º¡µ÷Ç cuD–o¿º€7Õ¤¯	ÐüÖÛ|2üÐVæüCåÎf+HŒ½
µ:`¾wŸùiòÄyÛÿ~wk¸å“Öt@Ë4OE],û<»úÿÉÍ¦?sæ¡b1-«„òJ¿’ßÃAœ´§¨ŒÒñþA2àÒ-=†Étíì¹™CÂÃµÌ�à:ðÀ
é�Ba³;õWé’CE¢Îžrÿå{ç`É&‰Ä,'ôÛtÿÝìŽŠ[8Áqá‰uîø
-(ÇJì]»˜4¨Úó™²ëÊ¹5«çðayü·
hhúY±ý™¸.ïþË4�j&°¶“4ßò‚¶aö¢öƒqË'(š…5à—„ò¸sŠXÃGôjWB™ì†Þ~­’…ÉcmÛ¶Œ/ý™.6Êaÿ_A5¼ýû+=d¼Üã>Ä¹_.îªhÏÏÈè8tBás¸è0ÄHJÆŠlœá¡l[UH4öv.	»Ê>]Æ(
kŒ9.  U”A:,A-¬¿Æwæ…yÊ°�Ò‰ËñVàjVUœ^¾˜�}°|wTHÁÓ˜,AqÈ0;,óZD*®Ü#{Ÿ¼­lÌH7àÕbRXï0C�ÇdÍuBÑ¢õ5Òd¨=ÍV°\T=›Q3 ‹7oíqAÌ�AûŒëOüülîÜ¿¢Ÿç!û­{_uDG_“­Îrkö¯ß˜T”^˜�¢}WÐo).8˜˜¬¥|gWP•CeîJŸ½öœxî6N²Óþÿß(Ã~vü_™;¢ÎžªþàS?‹™‹W#MüË¿ß×^ŠÛSéÈ¡ÏmGÿÎ¸JŸíQ50 å™iº<¥&+®È;…ñV=ôK®rU„¼
œe“¶ƒ æÄ#ö§,Ët¬žF¤jÃ«ªÂÎ“˜U²É|N'uL¤âÃ¡Ñx¥‡&Š)
©6wrroGæ 4±¾ÞLÛR·º	gn”ˆZaŸ£¹À”#t+2ä>if!Ï¥½)Ç¾ù>0$&ÛËq¤À¼ØíqJY\’§ÚIÖS(¥Ë¤7¸^+­'ÕÀÖƒÄw”Ùšêze�!øe•†-ËáÏÝ™{˜…aºŽwÏ„Äü ¤í½K"«JdÁæLy"F‰ÍÕ»ãPŒ nˆ)‡Ð¶óÜõw—-YU¸ÿ6Lú8"¸!Ñ¡ÿÞ|ÎFüj=côèÈ ìÀ€ìà�E�íöÈÎRúÐÃz!ù<«nU<¤QcªæŒçðÚð÷÷o+ñü-`(|É� ‡Èî¡O,ðŠtcRÒ‡ŸÓ†®žŠ/jäní@<—Q gØ›«ù÷4ôü6Ÿ¡ŸW=Z�Ú’’9™®�4cK¨¶Ö&{žÛÞ}î8#ZóXóíWUU+éüQGÎÑùQóÜÆßä3,äë/à%ŠEoœ£ŽßÃÞ‡Õ¼èçô•dÍ7z}#O·t{yD"3á¬»ÂôKžÎd®•ð {Cu7ý�'ÒC)n„0{Ï4¬k¦­�(|	u(5ý•u)"ë|¶V þ”Wržœðe®ñnÝn“ÞëXW„O¤{�„’Bu™WU‡©’,2L!�(‹K}¸¢äŠö=ïó£†	²[ÿMP)âs2ñÛl¢6%àj#\Jg1a^9Qì.™ýØFÎ/
ö
y|x¤äø&Ž>zÔ|%%N©ˆ{�9´µc×‰S'Iæ#æúÀÜ³&‘QF¾åŒn¶à¹•’¡!JÆ„e™e‘o},ÝÐXÖM0cìs9]é˜Ãe08uøx¬äãÁÞ¾ýBä¦‚Àâ@h~T$Å%
?îÏ-&ì¹=¥ÝÄEs›¦nÏ¨Ûìf'$‚öÐ„`9åÏw§£ßåûvÈ’œß–ÓÒâ$sNy±7zÔ¯é3.É‰A»>…òc¾Ÿò±,v™üAèâÅ?p-?Úõ#þGÎvË§¦hm,ÝQv–¦G¢=KÔ¾	†ÿn¼k@p*ƒ;rôÞQûü³wœZº*Ú“øÇ¤Íæô ú3Î½“Õ¥wRò-…`Qz\ïÓ§�vé �cô�<€s ‰¸Ð*)âÆß%mç¿gNÜ¦îº­Iy²~#çå+U`î·¹~‚U�Îíò¯ç�«l'ã-qô'‰„Ö£¢Õ�Ûh&Éš,ØB¿L¤À<¯gäMIM	 Ù§ åûŽáÎÂ@nfà †\ ø}Á´do˜Â‡‰ŒíŒ[6[®B$¬º9-·žR]Õ‚“âTÍ}íuA$›+ÁeÒ¢4Æk ú»Žv'ïêéüŸ–^KÎìÒÊ6a;8d-x+µÕáJ_†u_2Î¢G¯Êre=�?ÀÜûÛ(¶ýý�Šw‡”//”(Ç_`½5úwÎ/ž/+:X}·ZüXÖÂ.ruÈ�Q–€—�W&íÜeUs?�zðNƒÒ|jj_ÈMw31‡äÇ#qJ[uÿWFðxùÔŽ°}Úy}M…r½.)rè¾1+‰µ)	ó¥Qnµ"|DÂU)^8s6Üþíýc«Ä#û’¨Aì;}—/ß
£Â	Ï¹Ò?ïÖKäð€Î¸Ä»ìGŸŸúMgÝi½ 9^#0óÏ;ØŽ—Jb‹�ê˜™ØÚö#²<ŸèëMëz}tumþ¸kûŽp‡–aS¬˜®žÓ 2óp.A^S1ž_.wGao%7®,SUW©”Õ•
7çmd´%Eö=,ÛP…Þê©[Ò°ÓåŠšªõílŠíçñK�=3º>h:pZ7×Ÿ»g~ÿÞ#ïŠÔ;xD¯tÛßO»¦þ|ÙÞtÒº}ÔÕ&Y9ýççºÆ®pbuU[]�‰ñ˜Tº¢ØÎ¹#ÂáªUÖFo~ùyÎÕ¥ª¥jØÌ`aî²êå…Ë~ª.;&\UBÁD®È½“<á¢ðjÀšÁ5y¤Ñƒoå)]º�ï±,½„¶+è]Ç*ÑDŒ¬89»Å¼âšö¦ mSŠÝT¥IÌö9âº¹ãìÛ"ªþ­Ä_KKghÅð&Ã\^a=¤X†§Æý(‰u`î³¥mgO,‹Ó‰†h}�û’Þy¨$™Û’¤$ßEÆû[Óéb’Çæ³\ÚŠÈxl~[Åð¾ ÑÓl:²éˆ¼ö,µ³ÝÍgŸ\j�­gYê	Žˆ'´å&f)á‹GL|ŸÆ­*á‡QÛÜpr¥£ƒ~î;ÎZñ´’ÃI]¬Ý!<ùaPB·Iîób¸CUxÐ�öýEgÿÆCÿ(¦<g·dïÛ×Ð rM{LWÒ®Gh7ü9³W÷FÉœ,sR…Ëß•zH7ÒzÏ™ÌFrcHKüÿøßoS®áãFa0Ã­z²�•hÇCªÎ×:+/¡�¯ÕÒ­ý[-W˜À p”ÀÐ3vèí\uqÇGG+Ô›DX)Ýàž'Öã·&MëuÆ—ÓÃ›~E­¼ÞˆŒWp§öÛ5JÙpGÕ ÓÒô´0ÌêŒ_ÕÔ�ªŽ ßqWÿÄ˜”˜
]5˜x’ Éö žàù1ËyuÒ&æ§¯8HÈ�'Ÿþ;¤Ò@»<Qîvõ8¹„Œ­¾uV¬<æ·É¦EY)+™ïtn¹±|Îß²ÕKµô•ÔÝéµÕ3*‰Ë¨ê"Ûü¶öÞ«##úð¸Û’ÐŽNÙi"MC£F˜ZÁuT
ÝÁƒ¦7ôíêy\=÷Ñ†¾Ñ‘c•XY$*æ^ÚINëhîqÁ‡hÉ<‡°ì‡¢Òê[· ç­†‘µ%Á‰ÅUYöÎAîGô8œm^ŽÐs­²uÖÂ¶““$6	yÀ7YVP³ß¾ÔÀÐötFó(j‘:¨¯ÁÚ¸ç$jÁÂï …–Ñ{w%phìB¶L‘Ýñ\=@’"0¸‹á4)Uªwñ' ªOªw4ÊÊõ#â™ðN>q¢¦Ù˜ìî¯>Äê0S|Û_Ae‘g®<2Ì8ý@­+é±5”	3ûgKp:Öéð¬EêLÞÿBvÿK¯®‹‰jû:â½î*&z…”Ýà©ú0âV >¡ÍG´XþCJ£êIòO²÷Er²²ðãWßíÆíb•$ŸW+Â^j’É’¬ûûöõÏ–öžˆ…6àHÓX#18�ËŒ5˜‘Ö—Ô‹¢ô–Ù`¢Ö©ŽwG®UÊ,ð·Ÿþ03	� «ì«ôÚçÌµ1ÁÐQ™&È¢œg;!�Ð]všXæë~0œaö¹¹›ÁÕ	�ø\½M�¸ü¡†F4C&hâ™ �VÔÓ¾Ó—|Ž¬®æ€™w9ê£}Áœ9�/µíH†Y¼´¥š1êæ•ËšµW…(Ôu2igoÔ}9¨~!V7Ö;�:H©	óxÇ—×~ã²¿§ŠvWÜØ²ûj¡Ëûw�$âÄkÊªeš¾ˆ1Z^�W$S×+Ä¼Ñš,©-«3­Ö!ìcmî™hüº9•Ž›¡% Q*;%�_–î ¨8ˆFV(³Õø†›søß·fÌ8dõ›�ŸœØ´gm5@@7VÖ‰µÉ!)‘ÞÂ^`¬Ö#mŒÜŠ¥»¾‡G±k‚!½ãyÃuè¨¦³äÔ(+ËqþÑ:ÞÂ­ÑDÝ‰5/€Ëb�³wížëðò‰ùÔÈb+íbŸøáŽ�ší»×6Î}ëH¯Ð›‡m$œšteÖ1-Ä›
îüµ¼»G]i¹Ü˜ð¨™à¹$»ºQ:npyëþs†Ç©‰éBÙàq8ù¦H¯r-;¡-cÿN¿*ïš�¥r³J]cÄòóèýGÖYùÎíucyUkÛuÔÊ¿DQ )�Ÿ:4^œž­K<|çXE•Þš.Hx£räºž©jÉøÎšÆ¡ñ†ûã-›]ýÉeU6¥ÿ£x¬bk®ä _loŸÓâ°¯uv¦¸oL”zA+Ô$^Ò•\wê%>ê[¡P �G<ªš™©2•Óâö�<½UÇäåŽîw°•œ˜®+=Ü§Tó2bwÝ wx¶½Ÿò
Èay™#GååÁ¨çtÆs+ÇsªäŠÊÊñ–[ò«UÑY1‹Ín,¦,(§4œ÷c$¡UÌS™ë9“‘�BçŒ%ÅZýH«\Rè·×®õÂmèYZ„,]áKH’[ÚE·Ã¿Çä/l;ßf½ë
èŸ$€6¨Â![aB…rïëÖd·ZõŒÌVÏzoÙ’ˆ�nÐHï¥ö¥K°VU…%¶ÎÒÃ)G’ŽB™$¾E7\füYÖµTä®í¸Ç
õKgÞßÉ·;¢7ï w¯©Bhþ)ùk…ÍÍ4²�—ÿé\ó³r<ÂzuÁ«t«Såo×ù?(#­"¤*G„™¶º<K?¾'<iëóøœT?ú™šïZmlË”×±þk¦Æ°CÒëdµ	@ÒP¶Jê‹úõ”¬uU¹ 7"C*‰ ¨¦ÉlÎe¼Õ€ñAµIæ�àÈåÌ®BZ|GÕ~Û™çÙàQ¶¾¬ïec)XH¨ß#»À•ú•k†ºžéæ3¤“KVÃ =[ÝôòãXÀ_ÆÇß�æýïéWÖCo§˜ÿØF«x¶#)È�t8æ­6ë]›åH¯Îw3,ky«”Ñ¡x­¼Â�Ê,A†×·	eâ©Ë#†…/ÔèýtÛsu¬�#úœÂ8‰³çæËáù;gÌ—�Ú]Çþ[‡d`Æo³®A�lˆûg#· oý@Þ^óÑvI£Cµ¹†áÏàkÏãrˆükˆMpÕÔ€áóK��ÎmnJø6¤ÑÍ!Ä	{…zQIVNžr�rEÎZ–ºpäµÒW¥w([yùù«²*
NùCùSÅƒ!!ÃØ£cÔî�„£þÂÂ-q­½ÐUwJû=j,Âð�ÐØë½Ðl í±[^sMîäuç‹;×›Î§¿:}á½Òœõ	ñ	qgûá¹¶ûÎâcNh›û”ýTÂv×)W›ãdÂÉí]Ç]Ç*IÙÇÆœn¾¤ÁåMó:Å2±Ò±�uxäv‡>ë§ª‹F¡¬nãD!ê$S«x8� ;­ŠÄÏ;Å(º“ ¥~ªWouº\ËHtÚ*GÄžvÊ:ªÓ[ã¾L×r˜Þ- «©yüGÐm
kƒ-6K¿=‚9ØD>¹Gkö¾â›aDîl9à<jÝU˜r¯� 7Œ¬àôj´¹*íNl¥»À�“)8Áj�2”ÐbâéSËÀ-aŠ›sóïè4d ,¦`‚8j0_FC*¸6¥§‰*¿[$_\ q';C2lDÖIÒù=#âñ:ÞVp-(_›éHaÌ¹$¤$=w¿#mC*Aá1J‹ÕP¹%šsàd*§:Ôá%	}èºëÑ4ªAR8î¼Ä…™“øzÃ¸§ÁÇÀ=�?Eu,q-®µØ£�‚ÃÌÃ·¥®õ,!–p�âNÐþ™:¾ÚÅ�5Ùì¹V€I4ª”¢†?>«*K2ƒÍ‹íJ8OsüÓ¿�²õP"å�™óbNÛ%®¾pîxcÈÌN’&ay�{M‹lÆª3#L�mNÌ•&Õ>ìô³4wÍØÕ™Þ¨Ã†–|3‘àä–Ú}+­eÕÿ}‡èþ¦á�øú_ƒÈ×,¾,AËLèãu´[™šœùÏ²QJ5Ú'z™•š@NÔ�ÏZÌ‰§EDÎ@£(PVdl“¬\8Né&,œ°)I]¶d«æ¤NóþÏÞY8+»Êžê_»w Îûìÿuâ¥Šì8×#ûä+ó1dí8s6�’õžÇ¬}å£¯ŸâÑôUy‹òfc�Á™¸+ÊÔû!)�È¦³Þ1›·¾[ç²Në°ôê×}3Ç®IG¬Ûu]ŽÛx~Þ^…Ê”˜4
�™›qdéæ˜¸[>”,{ì®1#ñ^3ªïIDï›ë=ëq$±%ò É¥Âó:A*�ÞCg
RÉÁÄ@•B”†HýŽ˜@ä!Tný›Úw¶lâÍË­ðØa±]îÍóÉ¬²Ãôz5›µÒñ{zßÅñ1ÒR&€�lž\WÑŸ”ûg‚ð˜ ’EIÙ‘t)‡¢„8�R¨Tp*YM›Ú‹›FfR¾8V—YÂbJir5FÄ�	N4e¬gH%§<�Ù¼¥„¼nŠjÌc*v„�<á§¼ /ï«ãâUöÛjao.lG‹å’vA³vPÀ²òØ „Z«jª‰ûê9·IdAàçvêÆ‰<Ÿ�jOïë3µ¯j‰5ÏKhôiMt|²¨enß*=-A BŠó˜Qõø•ð×�.|§"?©ãÃ�s¹î�Ø\ZÞåû%Òþg’ót2^L�#;Kž0>;²ÃÎ!�“ùSSIÕÇü!!¯ÕH‡> SÕÎ|¼B¾ÏµÅµQN¯,$«,JïË,­ŸyóaŽ>A¢ð÷"TàSèƒM�ÏÖK–¾þÑí"ÃIì«ˆœ+©;;¥Ó¼è¥[ïéá5�­*^åž1!‰Ý; mÉ--?wb^e™¢CièO{å*‚�ÙNøC/ú�ï.Mãs'øÎµ¶ôÐf+všSø'ëÌ˜ˆ�
TëkOôHŒL–ÄTÚpR¤�s‡#2”YßÖ@°2¼æ�N÷6^Tš¿)u[Ì>4(n#ã*wŸÂ²JbžÒÝÿ®$È¤•ÖFúTxM3,"&ôÜ´y¶ÏWmÂÇÀ�Îçªþk!o¿ ª„	åú,Ë’Òe¾ª�¬6™GŒG\r]U2%¶è8ÌWHï…å°
CýÙ¢ÄQoå¨£–)³ŸÀ*é[zbÃ2ån£®üµÍ´¨.CL?›ÜgúŸlÓ2Û\õ”#§.W˜ªòY`éWG�Á>r8ôŽ¦îe1ŠºÏúîj®ÉBóÍãýóÿÕU•˜¿q8¥`{l_d<CÉhj¬h°»|ÑvûoãÐL9¦¡ÀßûgŠ­ñä‡„¨bÈ%¼&·²hÈ ÞxÀÖL ­){(foö›ìP›H–ëžÇ~l–“ñØ8¢ -sê´3»(!ÍßÝCkb«…Ãer‘
AÇEÒHÕóÐŠmÇqµØ Ì®�x‚¶À+9&VžËHLaÄÊ²õçàjK##0c•e£Å[abhÍ@ö/9ÚóäñÜJy1žMKü»:ä5bœoN¾KÂT’¿hwÚçØQ—Æ	º°)å��Ý(
½i˜Ç¶&p9‘œ�˜œÝF£d÷I€ÀöSðŸz±ÕÔ¢¥çÖuq›gÞÝ´éVDÑZô&`ÿWž::í*Âþ^ë!ÝVÆ ÿp}�…™Ÿùa�ç•ë,?·ðç8�Ðæ™›üK†ž_•¯µ7Ìgâ?Ðr›W.Uå[ÖäÅcê>˜ç9)\¾<­ºþ±rÁ.-•^ˆ BtR@ä»Í“Æf�8ñwñÑ<_IÈî‚À­aÎÀ·ÂÆŸÌ¢ø³(Á�C›U‚Ü/)«\RÖ~ûÞ‚?~Û¨
Ã¿·dZëí«ZÛ•GÆ�ƒÞ‘€ûrgÂÙñ·Jp_ý"}ûIeÏõg¦¬º®½Ì’6-Gî;›ÑËâKÆ>©$nßÞÖíøÊ+ÿ²LÁ[€‘oÝ" NŸ>ô‰�ñ¶¯eëÐY‘f‚›C-›½\Qz„ô%�ìseìg´§ƒ¬@Ÿ¹%í©ðóù IóÅþ¶^Ø„­¼Ïü‹Øó¹*ÍÓ¬ˆ•åìDç€˜<’­ÃõŠå!ªØ0éO!ôw!õ•†©Þž{ûÁÀ¼DëSšãìÓr. ú~§ÿþB¶zãæ+…BêmAê*ö+y½¯ûÙ(k ÃÈøõwë_í3dÜÞâV®»yþÔù4/ÜºÂßY­€™hs’v„zJÞ0ïaáp67ŸšX½Þ6¤ž¯Å	žéyÅnÎo£ÿ›}l§†kòƒŽnžr7
yyhÝD¥bK¥ôSëOR5p¥8ì§.T¬a[«‘Y»hKHCJ]c@¹/å‰s-`Ï¼¸¢‹E¶Ža¤Gk¦YršÊ‡…K<óEÃÁeŽ›WðV�RP­…üt¬G+$ï�Ð´÷ ´ŠñåR°“b ÍÍ‡PàÇTE[jÒ…�Þôè½*±…µNU¶¦Zšò{¦V<ÊÕ÷Žô¶­QñæÊþà­Øwü*“?›Óƒ7Nê•sûO£‚	j“$€0`Û±ûÁ—/‘NœKŸ]Ï«’]iZ?;:wˆ�Ùþ<‚Æô‡§õÓú7Ò†ÃÒ‡•¼ß¦´Ù¨nVîwlç}DÅÉA„%üyv�˜ˆ+„w$,ÆÈXl>Ý/jý1Ã'$Y§F�—õ\üƒ(ýøÈAÐƒê]xïÁiñZk�°ã$5 ìUÜˆˆ?ZªµNþ:5ÜZ¿¿Cæ'ZêÜ¤Ê}w¡§Ú~HEãÞ­VN'óO:©RÅý¨|J%¬Ø¡ÌÔC.^à¹ÇÚŽå`ËÚgÍ�(3!¶�aŒ[0É˜Â» # ¨c]j¡Û)˜�`ïÒrsJ!¥*j¶cõf`”½oË+æ®ïí;mx¨¼¸xÿ� µ2<sÆ5ÕúŽ@ƒHTÂ}‰¯^�àP�È:u{ý¬P'µ×íÙø/µº­>=}JKo«›•a
å©êXNæº-á¾Kº;xL@@Á¶‰”a‹ð,â‰È¨ªÌu]Ïº©�U,Yö;IíaØË¯¬%yËÂ\	ˆÀ#¹2" d¹Á‰aEÞµ>P•~¯?nÅ v]wZÄïÌY×¬ÎïŽ±°ð€·a)ˆæÞ3�3t2Ðñãï÷­TþýÛ·MNïø6=íœ?CÝ¹ÓÞ��dÿ}1ðy"9õgVàÊËš!Z1±qz&ßWº±w•�-f£Rœ„C|KÂ>Áþ¨'ßcw A?`6$,Ø|CÃkÙ�íä0é->\÷#¨Ë½È÷ÂÕïŸô5Kï°LiÒTomñÌ\[Ú©NJXuŽ}ê•µÛ¡’xýÆÃ[@4«u«	«g†÷÷òû¡ â@À‹ü+ú"€“R.AS�T›+®8S€™±3r
P,qÝ•V^„fº ÝÓb™öÚ�]d|k°
xtQÜÃ¤=¢:âqC/Ñ¾ßKú6ä9@ÎÌ¦´ÿ8Ûƒ�)¯ã6mÕk�Ï‹…z{‰výµµÅCëíG­úÖvÛÌ dø¼…lCˆÈ‡ç`—h–•r€±¤®ü .ºS§FÛmîØ¥>2í‘ˆº•nü™\�y
–¼Ù3ÃkØ�43b‘?ï‚ìsÍNj—†äé‡úT…ˆ™æ%Òa¿)´ùö2Ÿ²}7
ýºê I”�ì
}A6m…"o'‚iLIŒžI5ù¼yà—ã? �„‡�|¯ÖUe-‡Ò¢Ìhbëç=ÏªÛ±_Ò*'€{�ˆh�3r¼êÐ³y":–U@>çqÂÛ|JÙÿ!ìùµ€•ö×Žºï˜í§´72ZÎ�¼Í	]‚p%}Ž€,r	äTƒ–åÄ�e³uÚ1't„Ì–XûmäÙ©X$:Dl>€OÅòêêóþí…KX[’;¶ôá„4EËh!ÈBA­Ëßj¯ZÉ<|:f±¡¢¬^‹O›ïh5­€a• õðü€„¯ùK²“©½å„u�…�¤/bz¬tš€w~›8i$ù¨oo£ït²^3Q?rÕíLËŠËf¬÷oËÍInÏõHØ™ÍiÙqUggê�å)Ó‡¦iõ-a«ýuiÌË4,a{ž n¾Y$°¸›ùHíkJcÔÎJ8@‰t1A’y�êû¥8£RQÎ)(çÁqrþ<µÂé«'TÄÿ”2QUE¾óTˆ¨‡¿¢Ô«
žéÒ*D<!”â¥˜`ò”«¹]’0^ß¢+=Ç«õªI|	^¾Oýax£»'—ã‰DÐTSR<=žO+_.ÅËã¨Š±£¸»dõ—'òå	tlü9‰º§e5¦ä,Æ™Ov'zz¸{ÄSÂ]òª¦xã½ªÛj
D]�Ã¢Kqo"
©�§M~«Šþ7÷ð»* 5×¯åüíS…p¹E�ËñB>WV-J(òô¸YWZ~]Ï^ÕÌoPå6{
ž[¥Äé=<ozQ%¯Ág„fx÷�>’ò ßÊ¤ÃÆ”Ú—‹ò‰>ú¢ù‚á!ÁþˆC°/á9 ™†kyîy™r­L+>;£šÊ’±˜¯µ[ã/ð±ø	Ïf÷në�Ú>ÑO<ƒ1è#rÉÊyêw… 70"¢�ØaÁYM€¸0Ib¾8H^-räi­a›Þ´BŒâ� 7‘N9³!µøgI 2ëƒiOB¹¬º*{Èª!½&ºFÜs¨ÁS¡ŸïáèmtÓ*VÆê‘ch|µ’Ê¢Œ&E=£­E–+‚ÓBJ &Q"/qÂd‘å"‹8YnÙý£¶„€$ž:ïï¤ŠW»|¦8�‹šaÁ%	ãFŽ‚å¨ëÖî~½\×ÚØê\ã Ê°�=öé¡wÀŽå¸™ä"ªäiª4àÈ}B•©W3™ß¬îãî[o4Yf¹Ì"‹þÒÒ31DoÚ”½ÀrÁ]Cƒª„pÏ¼Ayl°¢kÉ7S L®ÍjÁªõ@Ù>ýùsú%ÿñê0Û)uµAº Ý9ýˆ-^{#xø/¡Þ¦L[`â0/­–(‰Ü?Â¨YÍ)†Ø›a
ŒwI{â­dÍdC1¯•¶ÙÝøíÚ�ÚGðŒd…j‰¼<–ã€ñò¤R¯ë0ð*eYC±NsI(~.ä¸D<�ŸouwÏª/ÛŸEP›qÜ÷{‚ÛcÛ‰X$6ãâëÐiÝà‹E óì÷˜‚<¨-¶�€µoåmpïVótX×ûbÑK½Í»ù‘¥/Õmjhõè¨o©ç2,;WžÌ�Ìx¿I–gÆ­ØŒ90sÙôQð¦NOò÷ ¡HP²1è˜þ'¼gK¤,-ÈÞÌ"øz2ñó×˜Úm¥´„q
Z‰(Ez’QNe–sD¤«£=Õ†;ì,c«P˜_"bpy±Ik<Æ‰t’,_‚ðB¥¦Žê-÷q’˜—  ìÜ�.˜_¶ÓÖÿ¯h‹"{ØùgòGÛj®ÝçáyáÂ­‡;!XŒ;ŠÆƒüC
H¨’*gör-�þ;2I;²�ðdãúT’×XêÄ%\ÝfT¬÷•›ÇšRs ßmùÇ-î/,ŽËÂ;U°½U²Ûßù±Äv-{…§“=•nO	9‚ �òk€U®ë•��ªîâ“î‹áÿ(úndz¶IiþþÃP_í­¦k­�aŠ·6d>*;Ÿï	Ú»ë{•VÚàÕþqÐÍS‚ýê‡[˜BîOïl]yWžéMRZÁ$.©Ý%˜’›ø¯§qj"¶Ì™±Ý.ïÝ9*í·«§«�H*î:œH¨Éfc¡EpßæRµ–o¥¾¹Q#"hÕâtLÂÉ\—V—	°¨ÁOfõÚâÚÏÀ”}=Q]¯šL½¥ñ¾H¯—|›<lç˜%ŠËCÓ6hÿ%`t4¨5{Û)ÏD¼$ïC�‚½W2M…²ê F—˜ËD…«—pŽ—˜þVI4e@” ´‰¬G"ùÁ�ÆÂS³]}³§Û…ó�‚ø–MÈbäFÜ)½KtÝ¸Ï•š²™Mq9%qc+��¢9º±ºÀsfø
Ñ¶²œù¦b’!ótŠOe­É^7u|ÏP­Üã�ú�^g-jÑŠ(B”	q7ÿ~ÆÔÆ?V\x]¢oF†og&žw5O§Öoë,3•ÛªlLTýŸÖÃµÜ†NnùU`z§\TäìÃäd‘­Sôéé\ú¯kÆÞû+](PXœÑñ˜ôx%2Šº_Êåž˜ç2g@þEÀŸ—Ég†¤Hj»ËtéMíû‰Mê6öFN¾Ûc^ºÊðÙ²¼í­òc‘Õë¬-JàDÔ_Ç.+ñ¡LQl�O‘Âdå `u“»§¼;©áÖ¦Uýbíh˜+è}O�]ææ³ñîÁðÚ‰Ãµ!Ìbh˜	ÅüâÓŽÇy2/ö$}-4¾­�-�÷¨¢Û}–à|�~\ÇÏ/méÚˆÏ±À ^„$2žÍ”â5#Üç¾À\�P\‚kX³´Œ¿txM¬)Æ•OlÀ)^øV9f+ûts�j¼ÚÈË—##óó®Â�xõêÕ?gáBåÿ˜P|ÁCvÞ¶±qÓ?/¹&íµÕûÊè’ìyt»g"¹g']«OIiðWévdì�/¿šöÍnß°òñ)Ðù0¤ûëP#X2?ùBÇ†³©)‹5ã“sbòb{tªc†zcÎ7ûUëAýÔ’1)!¢Ø(½�“‘SùÎñ,„4�òäHøCŽ$np?$Á=‚Çi[žî~Å×‰«�µ£ÁYX–…ÄA#“_0‚’¨Š–j…%#JÉó8_¥¼™f.çïÄÈá-ÎŠ^Æ.àÖ'
ŒduÁþìâƒÐx,=rÿîœ²#‘e±“¶¥�ò*AZÍÊÝ…Å[S*k¡õµÄì´€ôèHN½T²²%ùE�„•ùvŒA‚æÈcŠRßY”6€â dëÌ»«YÜ²¥ ‡üôÊï�Š�G&ÿcˆ<ãôož—�&âlówuŒ½?LHZ”³”nœ�«M)D/óUœqÖ²;¿ö¼;ê�ì�Œî¼Æög�·³›¸Ý)ÊÑÝ¢ªŸ¥Œÿ¹·yw|^~dßl¯&É¾@ããÁS
ýlÖ‡ÆÎ�r¸SïZ¶.b~ˆë
Å~Ž”eyùye½â¿Åfúiý¶‰SßÕÀÔ‘DTº•ž••MâÉ �O%å,%d,îLô=ÎBý©-ƒ‚1ê;,‚�{ê}„,ÒœÜ=­¿s�ÞnŒ‰=ÇºOI;ö$ªîÒpòíÂ'i&kŒÜ7®Ùú½G.îö±æý�ºÝöÍtô 0êrµè'­üb\9ƒªr‘ÛîlgjOÜÚ-rÜþ’lñcÅì‹Ã7icm+Ó!«D—]Õô‰Îa1=Ñ¤5q�‹lŽ­lïÛÕ££%•‘´Ò‘ýjÄ	G÷dT
Âv/£ôù	õˆ#öì�©½NÞ¾Õ^Áx“œìB®:ÆÁÜW©Ú¼É�˜¤EÑvR4qÏU=zjUdARKÖ]ä•ÐÔï¹hl!ÕW™ŸØuBèë¢m(cÚç'
HeŽ¨tíÜo{R–}$oEbû±?™ÃÙ�Ë¬î£A¡y³fÛþš±C/ÎŸœ{ÝÖ³u7zä’��“ÐXG¶v¡²ÕþÚÛ-W>¿¹­_~™kÏ£”Èñ�ˆ””î¿ªvîrÈ›i‚&!¯*)�³rIõìÒb@åìª–%M5Ð�s“!N›½ë=Õ3hÄ%`�U3²Ž�õyV|Ž�äpˆÓk,6®ÖÕ­Š]+{öôÆEÎ—\ÀÔ^ÙÓÊÖynÛ”.*Qz•MO³óÕ¿ÿéDïîÝ'ìT•ÿS\¢0˜WU'5û”¾:™#áhÎ…A%ÊEZ·Êœ5bµÒœ«6M.û^qçÕíÓ¶ÚX×Û(’¦1…§Ø]l‡îÔ(4¢§AÔæ˜â�Ò¢íÛ‹ÀÂ­VXkv)^ÛšÜn6ã«e¥Q¢~î€q`ëa4E¤›•­ÔÛlÙZ{!ž³ÎÞe§Ù¹ÂR»–fm¥„wÅ¡|µøÚNöw da{%Qô	cŸyØÑg‘ýR³ž œÅA9zï XµBNž|5ùÙ‘³‡Oœû49_wìœÎ9¥µ� ¯».™èå¢ÿfíoú±(ûDßæ™\EPl�œ~‹P¼„Ë¢A«'¥÷Ç�m�²¤Ã |ÅÖ)Ì]Ë�ƒÚ1�ß<|`){Ùíøy?ËJ;|Æ“å=íØÈJ7¶±MååýMA¾½ï~weû‚¤�Hø­b^Í¾+æÎ4Ø÷–õT³â‰1çº²Ñ³ê'ZNWR¨fÃZ¦x©’R·Í¯}“Ì÷ÔÍ«E×Ú¢u^À÷­}Û™¬°ÿ=Ö¼3ä±CAìlC\ã£'EÎ©)×.‹b.-úÇ÷GBü´îœØ„òîHA|ZE‡yŒË­ÓyñHçÜ:ÿû$�†'ŠX…övÉ3&»yóVQJ/¹¹ÿšI^éÓÅÛ	ê'4ZïÿY[}>üÄ“nŸœØëÄÑ­æÅ£vè«þToäw(òkxÇ‚Õ ÏòÔ¿­^gWzÛ¼¸rÆ1k}Pcð.fúÅ�éöûL@ä·^ƒ-ÝÐ7ðpj„o©±»œrÍ¤ðúDâ¶´ppKtò�Ârú�U}Ê$gmJt�APƒ´Ãv­ÝËh*Ù²åÍ›-÷µýZÐv&ÅdH«j|4·PÆ9 óû±Þ?]]zwÛî  €wøÿ£L›á˜ÀÚzÍ zÀ…é¸ Ð©!Õø.+',zœb8ûîƒ§*ß®$‹Þê†ÎjÎ†,‚µ7êbCæ…ãë’ož/Ú÷]ÁE¬h+º·#PNªÈ:ÒÇ<ŸDâS_S4;ÎÖLG¬®™Ýï³ìV_ý!G³©8—ˆÊœ%°÷­gq]°wX¹ÜÂ\z]ˆB—W°û‡Î»×zýìTSùv ôlÓÊððÊ…†V¸+#úŠá¡œªµ§¥·æúòL ô”¾¾Wÿ§þºÏ›=Ýu5Òf†]êY:Ý5tgq8hÄ¢)£ª¡¨+©Û<5d¬´P¯:9Û?tun$á®{`çûY¬«´?!Å&]Ü³’ßp£a�†»R²<ÔÒ±¥nk}ËDpzawY�Ö$Özú:¡ß“‰HzìæÕƒï¯dYœGj±aïrÍ>ñï÷qÍ¸E@ÊØGã¬4�Þ›¿Ú+î€üÔÛí“·ó5|¨Ù"ÃE@ŸŸâàÏâ8ýx�y>×ÁXqI§¦3%å4&�•ÅUeÑ£xŒÞœ+ÖV[
W¸?Ò$þUŒ¤‹™7©ŠìH�•ì�2±Ü˜îm
‡&ç®{}´3ñ}�½÷Œ×õ¢–`RUÎÕ=}ii*ö£"Q:³ë, !8©ó 6‹Ü¤P¥'àT”s¤ëÖrvw¦¬ƒM DKOxïÛÉinM‚'\W§­	mF“ˆÙfŠP‚ªOÄV¦	»æ\„³ÓÊ`¾•ã‘%~òJÂùJvCm¢8�kv9½EŠ·gÝfvžGÙ¡Îw2ï±0ñ$Û-§\æ´ÆI˜MD7œOÛºÒã­rUúÊ:QÚƒ›1<;Ò	-«˜ë:ázë¯ú^%ñq�¼B¾ZKŠQDëèÆ{Ò—–xÇoe%´*p×7|µ-t<^ÝxØ£ÐbTþí*n•å}ÎÛ™oÐÊËž×(óÝï´²ƒ§×Ú\¶Ÿ§^(ïZnÄÑ3 f‚ñ±Z¤,2Ëí‡:ƒ§¯ª"ºÐn»@{ó¶Õ8,¦-¢^¸�wQ³·ƒRë“àíÐE~§êëÀ'>Ñ@^U¶>ÿ’ÝW5€À%3#X‰5ô"ß¶ç¸µèmw®·è#,è,±Cõ8é–…�WŽÏO=Ä»â†ÜH÷7ëã=Î¶ÅÌ:+Ñá“ž(Nå¬<ÍÂn"];Ù¬áD


+‡M}µY`Öç*L—çvl  ‹qÁª‡žZf£ü¶u&­Ê-˜£A8³M²ûÔî€À·æêÖÊ6u
t2i{æ5ð•âþÆk¾÷ù	Áv@¾¾åÙJgv;1ph·PuÚ2[ëpŒ¿C‘•Um£—
©^H…¿nª|:Ì}åêôJt 8Ýá2Ež¤°žl=ëU-»Ó­}èÕÛ“0äÄs©	.>Qý ¦Ïx§ T®æa7$îmú}‰;aÃ¿ÿmk.Ä4ÓÜç7ªñ¶¸KtÝ‹”Bû{üÞÏóž¹Z=£‘û+øI¡ú¦áä—÷wôýé“oN©.¯�Rñ"k®O5h²¼a¹½C•K�0O¯ŠýP«$„/»{qËu[ÁÖÀ_fë_".�wäy$ì8)"oXˆ;3À4Z'äò“¢G&ž¬ôoÙì5 ògÈ¬	[äí‘‚p®x£$~VlYyÒ?A:§O0O.?IvÂ{±×~l–z]%ò¾àx�ùÕ¤®1ŸG2õ²Í¯÷4`1wù¡³¹^ø±"Bö~ÙÎ<×ŽkÕhú:¥û¿&õ9DƒÉ—üÙ@	ñº�I¸Èâ4<ìlœC"í`¿È6çü¥ÁÞ7Ð‹•ì½€{ï•…í§=VŸ+¯•`—áTøU0ë”Ž ±s*OÊ�í¼°tj�áÔyè2–Ï ŠÂ|*(TwØl©d¶ÅbânQ/ÈË7Z[›i}šhÃ­m^‰›W£L¶m§?ä,/okkXÅFt»‡¶»±+�-Ïä{VšªºX7ŒNFd÷ýÎ39ÄÈ‘…V½Ñ{\�¨oÌ¬oýÊý—7*:Ä^Ë.f�â=gö£­
;:uP[°u�+ÏZêåPÉîÏ¸åu~({œ¹´·ËÍÊýžR¤üîÊ‘Ð³%¤?ÎLØá'm£O#�È 8´x
€ô$N>À|’ß–^¹ªy~rÛ‰�×®Û™|Ö,y-®nû¿Qé ß–BÓNÏ"n÷ü�%;TsÓ•BÖ­fì =3èEXX™7¤WùÆs	ì”ÿ˜i*(*+"AC.ÂÕÚ¥í¸+�:�‚ŸÓWR^m‘SQMÃÀŸz+ƒ.¥ îsSÚæ!ÚF]þûbZxL·}NÈâN�
�$ëÐpgv�‡EžémA~D¯Œ‚Ph#ã¢.ä0k³ÃÈã²§Äoâ·n�ó?ïÍÖ­lÿ�‰/Ox¿ù$]“×L¢`.\(¦P ‚+:rj{Ôx}cOúîëý#V ¢ûÌ¥)�:Ïîf ž¨(Ã½òQêð ôÇ€Þ*©Ê[ÃÕµŸ’¬á~Ä-`høÀ1):¿ˆÃ†Ò™œ·Ân@-ÈÎÝ�Ú'>c(²ŸñïÏ>,¦©±‘U0Ž.QŸî¯îÛ/Œ¤sU*¶k¢Þ‘R1&&;{œ=<¤	Q¥µ�dÃ…R%¤•¥±R¯	À¤½Åâ§F@"‰Îøz††EG1ãMë}<*:Qß5	ƒÕzWšÁ£ÕŸ¨�øD‹×Kj~Ü_¾ðÿóÏÿ�Â[#©×ÇÌá¼Z·îÚ/À„9XMF�¨Û‡{àÁÜ7òþÈ™�±œÚ©äôÏâ·+Šh†³ÃÃÿsDf!!/×ÅÚyÆÙ{Ü¸ôÐ=õîg0<‰Ìï)å8 4°TìMÊ¦zj·^K"Ãâ$LŸ+ÊÜ�¿!^¥†\*’üd%\Áÿ% ŠN¹Ìs»äÆ$„ÍËøZ–”:Ë¼�†&…,Àt'UÜ}”~´#ÎÎâ
½\è²é€ôÉ�¸Œ/!-ìmYÂVóB-Ei8É·9¬ÐÉ2<ÇÈS~N	KÛ©ÄpÓ'‡Ã‚ ‡€*‘ÖœÖwcWFßöc§¨žK?ÂZAJÙÆº¥p7Ô·¼ób Ñi‡øöËKLÒ`]ÇëgÉŽp$l)‡qü¹¢Á±Ò�V±B¦C�*cï€üK¯irz!‘3èÚ‡¶¶³|0ãßF³Š`ôZ›B™Q^žöz}"!Õ©M�®ør"¿[ÞR²Œï‘ÀM?íÇð†¸ ½7–ìá	‡dLdH+XÓé÷Tp�»¶õ—;�Œß»WµÏÏÛ3�†k>jú§W] [÷úÑ‚—QT~ø79µE�<›r•££jO>Â3¯SÑ§ŠB0�n+ù\qÄ\XhÀ;ed‘‡àIæxöå6å>ñ§ ¡¡XC§ý Vr“pN¦F¯•Kï|99QPç˜öba-ý~
$‘GnX�€?:a.pf.!Â®Cáfˆ „ß„Z$ùÜï€ú¾
êáÖÝž\Ø‰j¶´«�rvÒb›1úäÀF4
%B ¹Bk"½r²,$§ô$ìÉý\‰7K•­5Þs÷ón_Ä¾Ñ+õõ±£vµ½§ ŠòP$’Ï©3Ì/¡¥x¾>J‚†aw/ËòTÎi»Xê†F‘N­‡)@×ÌÔ…Aü¡õ¤K$r>úG×nc	QîR]¡¿]e\C w^êÊºÍ ð‘ž¯W6Þª}LB|ùèÒ±™¨³61ó�R´Ñpn=’‡b”>@k³þD¶R××ÆŒBÀ<dëDÌOK�çÞgzJë2…mo¿ÝzMnEç}EKGÀW”ä·”H¡Cƒ	i§¢ó3³µ<I>íMQû�›‚n…hàî©5ë0­qb9jC_À~PêoÖõða­™Ê€À1ð”>b×©Š‘ÓÜiÖv†ÿ›63u_œÉ;fj¸/1'y°9·D8›aÑ ­ºn+.ZÀòfqÿ¹>ÁZÌÃóT�šÎŸÎ¬õs6§êéË×îí w£V¬@)øÁê�öàw1¨þ»³`Òhï	¦|Zw²�‹ª†÷U³ÿió·a®{ø]ç²þ"ª—5ˆX÷ ¯M÷¡DXfl|6Ïb¦É3ÏÒZ=c¡døÇ†/ÀâbWOüÐÅâÚgÄL ØÃ�^°~Ð‡o”;LxŸÔ0e·_ÊZš’,™�»CÃµÝ·%÷"˜Ä‡¹({ÁšÌ>Ôí9‚6?ÂÁƒ¥˜¼üûï…éC‡Ž`/‡ Æ}½G×(?¤ ”šZi´	¹6ýmýò¹	v{L¯Ç3ìZ«[a£�x·ÊÙú'°96!§´1¶2±'ép½ÀÈÍ¥æ[¤Ë”Æ)Í)±L@Æ™V~+r˜ž®2ŸÕÊ‘kkƒµ9òZíæ	0NG»…†Ë2ƒ5rÙaQJÃ#Îý+ŽZÁ,ªO¨éÏhíOè:úÖX=`§O¿æ0ˆÁŽß‹Œ¼W<òNÌ;ÀÊ{[³¾œüÓe0Å^·GçÈÎÝ¬À-{:¾&Ü–õV¡O=t]†ó¼µÇÑö4Æ�KF}1Q¬WPÊyâ@O¥~k÷ñ¦[ï+�¹cŸÀD™ÆÊ÷·Þ@ù�k,¿UBÔ#Å±&ÖrCŒ¸eÖ,ä/at[XOdëÔš{-þ@òa¤i` Qî¼/°¢©B‚XîIõHUˆ,}£È¤]´Oyª,®ªÞíô¹tGd·ŠŸ.@ç‡ë¾„Œ¬ ö}ïÛ€ùîÇ9S­U¯W �!OÊ¢Ò•¤é`hÀº?›/˜=Ÿ¤ó
 ðoÇù"÷™�:8‚øA6VKÆ#¦‘X®¶ˆ ‰Iqôq�K…ŽíÜy,Ñ¸ƒ:^PAu~ßÝò[°¹5 €ß<‹`d‘™l2uØÚÿv6�5bÒý™Ç­­°�KÓ÷vëüíÑ�oˆ€Š®Ë�o£™
IÑ�¥8Šè0ŠèÈMŒüùí	SÉØNöü–Ô&Qý%ÂÂÙø¶¶x["º¥:†vËEbJÚ“õ0�”K"�`äG^º¤à!ñÜ¾õ3#G²ÌÇý‹WT bøAÃ½'šòøï4IÎÃIo¾¡5õK@³d)Æ»¢H9eW™`œ£p’[Ëñ':íñqÎ\}ÞŽÇ4=î°@D7àZÀó™w¶Y5åæžÞé06“ÿ¾Ó˜ÍêÐ’� ´*)³èì€óz·GêS<.F9"çàCaÎ!z„®£Š[¾~ÅP>š’Ý´c‘ØZBÿ�bÌ4lÂ’ÙŸãÝsŸ�ë›Ô³Ü»Y‰§�j(J•´Õœ²:ˆqZo%9" ŒŸÉâ…]c,:·Zrô PA<Ó@pÄ/Ž"ûœÆÔŸ�gË]¿[u³oÅWœ(¾AÇ¸3aIƒL/±�)^jÁ‹_Ùîs“Ç;‘_"þ€­ÕK•Yµ		mÄ„š"¸ojéÍ=1HöžfÆÎ¤;F ÏÙU\V>³ð{ÀÅ9Yc6Jœ?xÞÌ€Wó0M-«¥7ÒØ™ž¢îHrV¨2
·‘Iê´î<ûàëâæ(·Üæ¹íœ5uywjBt…ËÿåŠA‘°¯Ö�o†õ\e3YáŽúµL\îÊºkl#sÿsÐË”Ë¯ÌGèbÿ/kæÐÄBZ0–òrÎD¹h…DØq9áþWëóŸÒz³CŒ8 @¬É ÓCê4‘„¶âœñŠ.7£ÂU›{_§\Ñ€�_}#!|z”(12¸O‡��¯º±dÙ@úC?ùx7îN.?y“jvGCôýåÒŒŠ¹"ûÊšY¼lCª`½†È2ë'%Æ÷ì€b[iÜ«6‡‰éhLF’
­HO]½þ„†Þç£�M�áî"ÛÜUíÒ1ŸPàÕ
[ò¹�9¯²¤Èûý–ÒÂX¬�¹|Uî¯µêÃBØñ¹‰é S~z|.Â4üÓïTP¾ƒ{.õ¥b9ŽpÞyÌ-¾~ ^z¬³
ú\úÖ@J¨ÊX`nîbDWpk9_c,:±2ãYaˆÊFÎ¼Ò¦×­bÔ1ºúöDLcöaõu"Ò�TéT“7+ovýz Ó€Æ£<ŽnËsiDwÙ¡/³Å£Ãú›±ðÕ3mW.É{2+Ø§¬îËt’bð€•ÅJ�‚–c×"ê½Ë9ÅÎÃäÊ“›¢ó¹Ó8ãlÉ­@µœÑ¤Ì¤%®>iðëúŽ§OàôÇÀ�ÞÙßö~—Ù}$¹èúf}e¦óç]¦Ô·»ï9“¤9y2©6WLâºÿø·uåSMvú‰ÆÚq¡Ò9tÙ)iG×‰ãè0¦Îï‡6øò¥§G	-0Iå #ÈuàÉ1—�}Å­[c´Á“z©”¡6WÅ�!-pi?K¡¤¤œ8þ'`¸PCrr»ñìÓÇÏp\ü�›B;ùkÉiþ…~8Ôß¯Iˆ‡{'ÑD‰ñƒÑòÊªñœJà"am@!¯B•¶SÒ‚±±ü �?{¾ãæÅ‚k}î¤MqºW…ÅÎWÞ,/¿õ R+OØìCý[Æü‘Yw3|cøÍÂüäk=}Q¾ÿ¶Ûc;Y©4ÀåâûöÎÌ‡ûed6nª‘í“ûÚ¯lc`ã×,½É©ß¤@7iM�‘=™ËâGsž­4gêç…%ÖrGŽ¦ÝpôHêªC5p¾#³‚S/Ú�*‘¦ä	Ï“]6òƒ}üNàxþœ¼í»¡Ë÷½¼�‹ËEr®P?SrÊîb·ý�OÖ{Q€­p‰ÉØh*LµþÔbÎýïŽÌüYSënË/ûBZü;}Öm~9a¹4²™¬¢-Âh¬[‡²×ôéÍŽÏ­–J$Å1³˜ NÇ&Í|'»cÇä¬¥/Êºéçü&á§¥³,§¹/ž94ì�
â³g‡‘)^D‚Ç/­P"¸ÜˆEdÓ½&S#–ÕpK Èï€D˜ÛDü¤
ûÈšüðêMˆ9BÖÅ4Gáóe@ñfŽ~Þ»;a~·WOk
×CLèñŽ T†ç•| ;–Ývè)â�³aH’·–À¹ðz®=lyNú¢S^úëßxG‡é¯0ªfßÆx!e¸Æ¸.š9•¦Àâ\(
ÿ(noAiOù@ut:)“SØPÖU6¿&*½ßöBòvõÝípF~³[ÅÃÁº£@‹‡á]ÜÏíJ�˜a0ÈÈdT¥xÍŠZ­Ð¡�˜äq0.ŽW2váÍ÷Â1hd�-CZñ¤¿VÕA@µG„Ã±|g;îå=EÖ4Ê'K<ü@­º|‹˜4^€q	|å\åû†VâíŸ1p %[Æ#SÔïà#ìFé‹úâ÷ÏØ#²¨-¦C¤IñÚÌíÌ¥¾+\),íWyyò:#ìßsí÷Q¥¼¨˜åP^<ñòßEþ/ëP˜ž¬”Ny‡„ºóˆÿßž’?)�èeÀýSý’b:	jw¥na¦�Òî\¸TÇ÷]n>,²æJz£»�F "ç©¼¢Æ¹0-¼Éáh‹ ‡–úËqó´³(B?ÖéæZ{)²±Ë6{³o«�›Ý”î˜Ú2WCÁÝtË‹‚Ýg‚5óT8¾ÃöŽ°¾,+OÍe0HUàÜº·vRrAÖD�™§6‘†ÛÅ™©ÿ!è†D)n:©Ÿnc	¥a‹êµ=2¶Ý«ïêws9ôOÝYØV@^�ãXIû{+‹êûÕ#–çbŸ®ž‰í·ªWõ y+@%±ª0.¹{º'~{d„zÒríÓ/ÝÛŽlóž¿å�L�þ*bÛÙdÒ_½¿ œEc½fÿ×îáa“"ÃsØµâ-	û�vç$•95†]Ü&,§Ì‹ßP¬ËL®Yáß$8ðÀ >öÒÑ=øÂ[ÇÖwÜ<*	C~Î$\˜¥žYÉY7ÿ›W$Yá“±¬^�œqâF%E…ÖÙ×AÓW²Q©7Ê{Õðè­ÑEH2‡Cæ)CÚŽuÍ”¼çú.w9AÅYÈ“’Kš±Öÿ�œ¸cêë™ëÉçåd
ÑIÌ£—<åñŽ×ãw‚”TPNå�ýwb²�»Ô¡¼¢²"~H§Ð6È6Ê_Þ0wnDKAANŽ‘Þe9¸¾ÎÒ©ÓiFVg´?üø¬Â#ÀÑÞ|ŸÏçÚàÖ¼^2¥|ˆÅš{è„A&ðX„|´ã¬[QhYˆ^¡�ËoG|¾�á#W*ƒŠfe`-ÆÞ£¬\ …6Æiõ…Ëº¯.tu/^í²ÑyüùàµkA¨”õíÉŸ¯/áË™‚Ô5™ìnÑn×žz×]1çÚÚZ[Ï�omV95Ë…_á6ãœ	e^å^ÁÏ!MåêÍM±ýéH¡Ñ‡Vx]m$ïÚÕ�‘KJMÏ4F-«—oQëC�ª¶Ú2ÑÇí³º3q/ƒTŸ]½)ñ<6.jxo¿/|CA^¦[cBê2©ã|A	¹{oÐ1­•K{ñ2A`O­ñF8»Â;§Õ' ¾‹9Æ€@bRÃ]î”£Ê·Ñq,VÚoŸ<*ð’úøl½^”Ü«µQcT¤Š_‘5?$³UØ0_9×Š fÉÑ)ü†CÂÅ×¥•´)§Œó×™è„P¦["q,6™Æ
º¨Ý<sZ�mNv.ƒ²�.' ëºÔœ–¹ßÕü}9‰µPÌ‚¼$ü¹Èh?ú÷êËƒ2=÷ó‚+.Å#G=wO“™G>„#ÌaÈ æê› cd$ \ÇÙ€‡î�øµïÝ»úŠágãµy´Zºg‹ëvŒbŸ¼÷Ô·az8©{È›}BhÒA·{mDþ†®…….ƒô'*K¸ÛOik;¢�D –#™�€�®/ h�†�º;“@ÿàÂ±!ôÛ+ÿÚ«Ì-²cœkn.úËïv–$?:‹ï‰¦�ïÜ—ßÅÀþbÇ{ßÍazÀKÀÃêÞ£d™GkyVÖ¶¼Á…§Zù¯Í¥:·Ì'ZŽsg›.»O\/+ßiû.„¥5jÊ>(¡Ž=‚ÿ>òËv
Ûôw=7\ƒ4¾Ùàßˆyñú~)ØÉqNKs©s~ò9<¢Økœà·{d†¦ßÖoùÃž;ŸµÇZè�„°æAÄR‰4§vrÃ­MÍ�–Ñ²ùÊ€ž—‹&ò_>µp<a\&ÝRó_qŸ¿Ío@X"P]TUÞ0y¿è¾vàv´wÖêý¥tÊ]åUÕ—íiß‡<CÓâñi®x=c1v79Š(fù
ìMêkóÚ„:“'Úª
»IêŠ•÷`|yÎ9Dí¼¦ñ5’nŽðU:ºC+/>9UÇF(#eI”|•K!ºÚáÐ’“l0¨¤36±ÙnÇLG—e*6Ne/ËŒíÔŽ×ÅªjjÕšãwú´­óeõÅ7r|Ñ‚�à„”äÖ””Öää™¨è®žìÝƒAêšZÍSªCr
Ö”BãI›²nt‡ÚÖ~µ-Í#ZãV»»ÚÈvúÖL²¬Brù§"9Å—5žØÃ9à€8V¾ê¸x¬hê_d^Ë:“|xmW(Ÿ·~«ßúMêy�+¥)#%Ê‚µ™uýª…�‚~Þ¯¾û‡Ñ‰‹*·ô¤·ÅK£”XŽƒ¯ï<øÏÑg«û7 |`€ÍÚÖz°ÆH0•´ÏikY˜=2Çäáïûån_û×uÿX¿þGWVÒ¹ŽŽ³�Y]/K<JîTdn�¸¸Y³íæõJM6@àçrÝ�œóNûbj¾ïÓD8µ| ÍÂ'ä+^·j�‹t}ŒóûÎ�´bFAGÄŠ�¤½Ìƒùé¢/¯�c–D§;'f´{sˆ)y±À'ú	ùK17´ú“EåÓmúè˜·Ò”Óká<#úëý¯áê¨�SÔøI¸ÀV�:à	Çeðø8Z™(t i»÷@>ö8[„æÀë4XLïýðû‡{¢ÀJ.þÊ.
5|E¼Ï^]sÒ�c�C~éáØL@þ!=áI¥uzêmšÊ�^½ÛIU:”€é˜dÿ�ÃÝŒa?a2h/�°ÄiîyÅ;Ø×nQº‰øço Øï�“(‹þ�ùÑ&Ÿ=X;-Ù?�vkCÊ)üŸ�fm9ÙÜÒŸEó•ìf^¢ð…-M×–JËç=î4o,q—Ë’¡i^�X\lXÞ³ÜÛ“†‘——{-:®�²åÃûíýçV{âÚ??õ&Üó*_iøð¯’]¢Å¢@·�ÁãT~Ü9{ÌìU´p­üMýÙX×�¡júÄÉSé›©W::ïÑ@V“VÙ¾¯ª=-½½}_eû›ãy{ŠÄŽ�^¿gÔifçhèj¢r–Ô®�ò×0(‰Çw90³Ž¤{æTÖ,OTá<~ŠŠÈŽ>Ï·XVXÐ�°8¼³^tÎª¬ñ¼™Ä/­˜¤§†y
·F&À‘$ZLÄí¤äÈ�!DâæÆÊHnËƒ8ám±É·ÖèLº�ù·:�díJ'ª!c\?Ó<Æ¶}Ä¿Ž@}áßÎ ÞÉÚÎæÑÝ�
"'á||Ë2ù_}°øW	3:˜äë© }6)X´.¸é‚ˆ—I“Ÿ«eŒmÅ›Í [Ð:Þ�·ærˆm¬ŒL#hd ˜–c^o¥€¦  ;Ñ6áÀáŠaÔø!m¬÷µÓLÚS‰…ã
>–nÄÊN-ºæð j'Ü9BPùBßß"7Õ%"¦ÌÏJŸ<ô‹“áZ§¯ß)Œ
}§B	â[Sý„ŠùôgÔ“d%�‘£7ÙO²M mfñ›Z�dQ?Áò§8k”žÐç°³8Vâ€ÐjW»»{zÚ 
“5¹zÕ„‘”ñÿff2!ƒ]óJÅ7ºü—íå3ÆßCÆ…2P·ïôÖ,¨Mwˆ�Ç¹Ÿ×Ö*)©©5HØéùó À% s‚9Ò�tîIñTHæÉ'‰~£ic‡ÝKÛ"º~X°ë=~KH ^é!Oü q&þ
ä"Š^®øòS9c*l`tÉê�12º2ÊQ…dù@À¿ÙZ1ÐN–ÿ£[
:þ¨�¬H\ÁÌtÜ†ÐãèƒCe—S¬SðR|DËâ�XECydéƒhpá9@ <(ù+ùóßøÝÈ$Ì™4¦ÀÅ;.9ëŒ‹)5™÷d§e¥s×·z$¿²ßþU›×fêÝÐÒ{þå<&ÝvÒ$”¢ébò)K¿�Wó‰äTÿ±ÌòßRº8YÁj“¥ù'©¼?K^GW�Ø{˜o%8îóŒùÕdwµ£²ÃµÍJëgÜMüz	3.œŠ7SÍ[ý^¨n‡?ÁÔ£ÐŠl¾ÞÍC9 Xd¿ÒC?’Ë5{/öÂí•Ìì{/îÛÕ{Â Ã2D{DuçwoŒé¯ÅêÿÌ§à‚�ô�üCj›c†ë”ùØTÜ#ÈšÛ½®ëy+L‘ó@w1ÈðýéÑõ�cÀ@Ï]Ýé?ì¥|þ�ÃKö‹9¯ƒdÌX±ƒ‰ÛÛe,rŒ÷º755…çÏë¼¼ÐÙ�˜Ñ×\\5A³Ôë	Þ7Š	�[óÍBþ~¸µÁÑbé�sÏ^wùE)`sOrÑ�)eÞ¦lCZÜ@Kgþ±žß��¿zŽæ/mi±M)º|DßR�Ñ¿“¯=¥¨Ê/ìü|ºÇpzW¤PC<ÁüxÙu=(9–m8mØŠ·-LW®°.n:±Z}wæ� 6º
wà‚$"�ÙO5¦ðtˆ5ÿ¾éŒÀåNÖ�ô;&Ì¢í¥ '|^0ßüêÕõR«.òT(|$p‚ùÈ²›§Ë!¾…M:ÀtoTÄ¦Kþ™”MH'‚Ò“º•éOŠ‹|2µ6N¯5ï‰k 1J-Ù1êYYsõºViUÛ8oùÂfYpÉs°*•l	É/ÖEvs2Jªâ/€?|°·Å¸ƒF¤b-ÑVAcFïë:¢ÔÁÌlêlÍï{ç±»û.Kôù¾M(6MYW¿Õ,3º«w———EcÂ©Q�áÁ‹ì<
‘©ØCT?ßlü7UZ¶ß÷­Š*ÑÌ{E�òipCT´4¾c)fÙ(1/öZ,ñO ¢,¼ÈTšeEÖûÆC•úÐkØ–÷ÍKü,ñKH:§&Èð#H÷± éD5mrH¯ñÁã?3±QßF"­¿¼DÓÐ‰�¤Â6ØñŠÅ·PÏ>¸ßâ	!¼Uq†uò.ïÝfÜcç^ä´tÝïÀ€X¬\ZZãJ³°9 V]­Ð±Ùˆ+|ófïäq�,ÄçÒ�ñåA®_/å„˜å(#ë :”Î“‰•k€QÜnÏË~C¡
™››š<¯Ï³M÷f��É¥¦$<;…åë”e�¢äÎÚ¤1%‰‰iËóÑEUgñq*;ó�Rææ1=XŽÃhW`‡VUØr7·ïÎ.Y"Îq÷¦yÍW³(ŸM¬î&Ÿþq´þÏˆ÷—bò¾þ)ÿc€¶òÖÕAnjÞIÛW4y¥™tÒ�×1¨ÚìQÊÜƒŠìjö	6ËŒ÷W!hîd77ò‹"N¸¼¯Ë´øôŽ:îCñM\ t„»i1r±¨[?ÐƒoÌ{ã�TEz½r²	ã6«ãk?Zºü¬Q[»ëß7Ï/ŒˆÀŠÈVÿ{.×=Õ®Ü"²+›ªöÓ9=ë KÓLe,`Sé²wÍ9oWÍ¡É“ülÆÚ
¸_ÔÒG—×†aR’0º˜eÃâÉÒ_Ç�uö‰¶5“ËX2…ìkž>¦™Ó[·:‚þkáÑ—/7:óYÃ’”ôô+W.1AdÖe;Áfíó�4ö¸‰­�Y.”ÊÛæH:¦è^žÃÊÊÎ¸`"<�Hä§üWŸÝöG!—u¸MÇ,ê¦Z@LT7ÝcCƒÂÝ¯ÞŽ†À’
¹Þ>Ñ7%1µ°$E5”š:D–kP©¼à�…Œ2r¢@ˆ¦ƒØû5…¶ýª’Ý•+ŠZ…ú˜«f}¤ÊGÆ7›šâŒR=¹4GObúçTË·²
¹ãÏŽ“#_ûw«TaÒ³¦jú¦£t½Ã[šÌýŒÉúH¿	�-ys‰îâG°dÈh™Au.Z‘54N^¾²úëë³RáÓ²GÛ2QÑ‘õú\I‡˜½Þ>óŽ]zPÏÅà×=è>';´½r›Ëê˜?¾8DÅx[k5j“4IºT§U	³Wë0°*«£§ªhÚ¬ØFg¥ýLRgúX,ÍÇÜcAŒ!Šïìæ*üì}%“äs÷Y|ú{ÈF»Ýëç+‘üÎu]ø$Ø_oI¬r+sÅºýv8½˜î¹¨s»ç�–R‚¨Ü?,%_Š¹'N,ƒ8+ ËÙ±kÄ§ñFßgd/$[†5—'œ®ZÎÇ¡)•›´Aâ{P“ è{­2dþÖfÜ¥é·C(¨ƒ¿QU™g1Îrù\;âHù‹b¾Íb×Ï„ô…ÿ®à”£e+lI�"Ü"÷Óœ¤•¬.¼?“©>ikíçÑåV2YÖr.�Â6éÑ‹Ï<ÜOF}KßålcÆ+$§#Ë§{É˜
6S°9Ò�u´Óæád„éÑ`ûîé*´Ù•XÏì¹Õ5Ü=úüeçèô¿ou7~ÿ4Ô-ÒxýÈf¹Ë&Ÿ|Û¼cå­ÿ£·;Â¼¥,»Zíœ_Ý¥Ã&kã¯©Âýéí\&õ¯cwFð‘cë ®7ê‡Ø”þüÎWKÅ÷‹]Ú}Q�Y§:ÒÜHA=r/KuWTÒ7ý²ÌVoi¥°žùà­Ìí;äÕ�Œ½+¬Ý–O?e“¾�¿êÊm‹+×9W–§ÿ*†3­‹ÕMª“u=›»-øZR)ÂÇçÀ†ˆQ‰v!E Qa¸(9—P+BvÇ{@ÔE5–*q­]?¬ÓÿÉÏvS’Ø‰!Wã�¸Ä7g!ÚNŒ‚çÂ£Ir¸†WO°æ¼ÇÔ‡dmbƒ®’WÐB»”¾MÄ!ã¸ýõ*I˜°>tÓ3<Z«ñoÆÙ30Xà¹þŸ†ƒ½˜Ü§ þ?‹yœ¥I=¸5`Õ¼¥4ÜjýM,Š�Cyª=ðoÝ‰¯TpGXÊÎFoü´Í~UþoŒ´š+ZmGÑìþz-õV-’–Š;zíi�¦›Ê�@¥5~c8{î·™öòînÖPLãTž{�þ +Ó<ùT4êŽìBãæ-Ü¾[¥@A¦Òd/y@e¶óA÷*mÅhÉ›–ˆ03èN>ç9¡ ó3÷èD ÖË“µ˜†Ê¬ïßê£ƒÑàyì*{+îIôfD$5w¿” ¢[E‹G¦e“†Lße¾ur€HòàºÉç1Œ�´•¼Tÿ~Î§tWyw³$vsj¬f2(ýdèÛïF×g]kSz!~ ']:4`‰lyi1ŸYÊ¸€À7yó­Tá£Ä)IJÑò›u‹Í –²¥¾^ÄÂÕ³ƒÄ·˜'^D¡çvÒÔÐÑ÷ƒÓIwN{+$>Ç|òÔØ¿ózìFdùÞœÞaíº‘Ìæ¢O¼ßbDLÑ{Ì¬÷µoÀ¾�<5|ÿÊ�–€-DIŸ ßškù­×yëµBoWÅ+÷o•ËÉ^èÄ'^N?ñÁè =8\|7rp0â~IqÀ‡X¼öŠšìªú³£Ê3­
X”žÚdyzÀ¬l™ÉÉ0­E˜p)õÛKŒd­ÊBÄ”,‹DåK„¡Îžkƒ¹ýmÿñî?^$‡fRd9M"Q¨È%øë§Æ¨Ñ£fôHªÇÃ§‡]é9_RÜùU›°Aqó}<ÜØù„Ö=€^ñÆF-Ú‹ÔVš»ò¼ìš½Vq¾*Ä�ª/sÜ r”šçüÝ¤°ëÍu!`DëÜÞò[Iëwø=)	EkŠvÞ«ÖkÈ¿gouýS”,`ùçëÑ*ç³£:ˆg<„N·£‰‘Ï¾${Ö©Ú—m˜¾ß•�Ë»:7mÊLÌ�VP¨	‰ù„Zo�xã†ô\Ùb'CøÚL}zq!=Ew¢
h8ª˜“tŠ’[ÁF3Xc„ÕáXruð.½$K|Ø3Šb“Ó8¥õ™r¥Ò‹«ýÛ?MzbÞ¨ªAãÔ§?Êk+Q³ê=ŠJZ;Tøgrù¿]M{CÔ}BKÄÔ&0ŸŒF~~¢Yëã:�P]š\Èä
B¶Œ’T¤*&±ý,FŸuôU·y—¦ã`H�ýn³n±šFþãÀ|ÊK�ln†ÑxÀŠ\.å�ð˜ÞH|®ÃÒImŽ,Åi]³&§+CŠ¹9óø§DZ‰†è�7ƒ+æûgý��ÇDsÁî>œ©…ðž†Šä³Ömb˜|{ì†{q€Ouyeâ‡Ú¬(+7ßäoÊˆz0'ð#2±VQ²žØÇ—M†E³¯}ž
«‡LKï4ÔÖ~öI‰:�Ö²ÇŒ5'JÐe9wse>{hP™Šg�‹”,«ˆf!¦kåËØåœŸ^ØÂÆ†Œèl|Àwüu|Ã‘ß¬º<eÔòÍ›ÔøÔ�|wZ@OâiPÉò®	€lônsÑžS�Ö”¹¡¤LÎÉ|’ûÆBrÊà%I”Ð £uÖ¡;EÛÌR,ŽûÅMj7«›—l}¾-[ÁÎ€`äpöáúÁüÉ®¼0Ù�.uŸÃI"uCC6§L ™™¹Nåæ-’J¥bÌ;B„!Á šé~)‹˜Šæ4dn’dNj7sš'¶E	oŽ9Jã�	n0ˆ’�pÜ3ž;“¾µëÌ�Ñ07*]øRÝ‡µÆ‰èC×û Ü™<?ÜÁ�4ú¤¡?¶{tšq«ž²ª³¢ÀøžÆb×Xá°ÐÝ°¼óñ�eáÂmõ7·–	—	wä¿v¹C¨²läüõW†jÜm'æ|[d¶ö>É¦¦D‘Q“x3Ckßp)»œóe¯ž�C>¨åÔž$Ú2f=áäüæñ:HÊúh5Ú¢¡úhFìüœáL¶,@˜¾:œ�Ÿ£²E˜²~7�æBV?Q#‘˜¼3QAæ.Ñ˜Ú¬�îxWíujÍT‚a7`Nº"£*ŒkKbYÀËJDµ:
ž‰,Tú³¿Î3sqÈ%Íƒ!LŽooPŒM¼Z~8_BUëžh½2|¥õH@•‡„ó½òmâ­Ej]<¯ÖmÈî»	wFÉ‡»|ê![£Ê$¬æQ‹¥#Ïzõ–˜ë TÞÖžNèÊ6„		ïè®Ž¡HNb!b'rÈVáÊÅ!R•n¯&>w¾‰Ýwþ¬»Ú˜¸ª)¤rR`ò><\ºç|ñ¦a ‘ 	Á�+�ŽQÛ¹o£îð¾=b$Jh“™Ü’"Aä¸„£uu?ù\ïžÄhG!î7ÊË½&K>ª®p50«E™«*åÔÚ~#>Ä¤R”>p8%ßqü›{ÿÍ}Ë#»òp‡‰ÓÄq“Í¿ÆfOG[pVa ærNàvÈÿ
@`H”rêr·�UHkšÎ­|z¬˜g,tÿðQ²ðàìÍ­èNbü´)åíYÄ0Gß}ws=—?1ý]øÎŸ.:çÓæÑX‰ïÓ»$£ÌV·Þ�Ú�sw×/Œâ@­@êîÞ{W,}vâœ¥"Ô¸zÐôÔÖEIIK�Uí �Å�Ie›P ‘`‰›fq˜4ê’€<Et´\|4:C(zm¨;n	”ih07˜¹1(‹XXÿb>Ùy]%]ðº š-"Õ“9ás‡æzRi• ÙªÓ�ëŸ¤1Œ!¤Sjñ3÷Ç^¬§-S`Y9 „œ±€%Ì¥Ê’�>¢2—.¾-}·pÑ·éó7÷¹^æ-R¸Õ2éUï³[âò÷KV�^µ¶�»jñÐ]îNç‰…�aŽÆ"}ú¶º-éì|ö²ú²º kÝ2aú^¦ ž”!b)-D´Ò*5Ï7hoÙÑ ûè‚JþòÒ?\Î¶n<ôoÿñQ›þ´0^¦06ž%gò>)ÀfÞÇUÌ*7ÝÂÇUèýœÿ'¹ˆM$+ëÏýÆ6_7	Ô¤ úYÕ|jõôóŒÁipúÿUzÇµA�ÛªÈûÏÖò�´[Ò“’.`ô{f»"[ê¨ƒ£öœßH17Ö0ƒ®u eeÉ²H¹k.’¾Âa0<ÑbGQÐJi™%¹‘_Ê+!×Óè}W÷jÛ‘u(GkfâÜEsF˜/£rÙyyÅ#ŠX5ÚF™ÏHâÆ®5ûŸYËe™ê8<ò1gíœ¨˜}fP«}Õ,-¦^_ŠJÚÆÏ·&}$ñÛ6ÇvÆ¸Ûî¤±ÿe×þÖÄo‘0¯‹?ë
{ÔdÂ–á" âö+•=™ø’¾*§ÚcŒyªâxyËZ%­=vS#CÆé9
p"8*ì^ZxÄÝ7SÖÍŠ;ÏÙÅús¼¹¸_"•Ì¯i¿×#'É+*Çq2IÒ”yl%—ŠEŽ¸¤£^[Æ‰ø…7°8A¬-Ó4óã‹²ü.«øAÓuFê�EOZšaÞ;R3GÕFçäÆé~#‘Âžè‰Tº]\{jg¡WôŒX³~ö<›pDm±EÊÝ­âôíQ†ŽG½Còðˆøç=p‰$sC«T"»‘ŒY´uG?ÜÖ1zË x«üiµv‘5:èh¬`Ò‡äºŸ#Ÿ*��‘šŒ,÷º£ë’fø#>3e³Tuí“Ôu+(ï�l…:ÓË*oØwÆäÐþúQ“ûåÊ‘�ÓGwE¿­8ø…ñ°w®›¯¿U•²Õ›ünë§KŒ-· ÛÍŽK¡Mí²ãr†9¿]­ayú¶+ôÐ2¶¶Þp+Ò¹î¬º¨x¤—?ä_Q{øŒ(Ç¶;
Ý-!˜ä1FR9nÿf‹÷!­ÐšÚÇšªë‘?nëøæŒ
  cD$=KŽ¶n,P‰YgþËxqÏÍ©Ñ'CñÐ 
Þ}ÖGá%3Cg­QùÓœc$Ön÷%lcfè¬UËŒ Nê·^öÞ¤º£M†-î'KV¼ÏšÍ9¸y‘óeòz±bQ¦¾Èµ¡³Æ�xTãRÐQ¦—¦5~^��u9gæð3ÿf Ì{‰®&#TŠˆuÓH�8%ø¦Ý2tò):õN#ã‡sš??%’ë¨?05¥§¶ÒÑ™´T*­R»¬gÓ)S×�y"Ò‡SAÜ»ÊéŒª¯)qþ÷¥RÓK=W—HÄ��=°¼.(<¿ÔË>L}ÿ,Î7ðæ±«ÍÆŽ—¸P§žŸ sí+æfI½ÐX\h–�ž;sÆb)ô½.V á¯ÓÄ¦,ìÕ|pU÷ü™éYYµµ®}Ò0Ó�T¤zû­qÚMžeRpüÀÏ-NS\ àÀ.ã]ð“íùH‡d�vÇißdK9}ïdqz�ââKÊ5ónX e‡çü5bF¿ Á6©Ê�m‡CÊÔ@;å?·{ïˆ®R,l°=Þúš†pÄýe™ðˆ(ï¯FM-ß×cÄ<»:GÈÐ�nÈÑå–ŠÞæÛÜ&RÆaRVÎÕz*/ƒÒ´T™#óœH6¬€ñ¡ìvÙô­´Û#ÊIÝ(×áÛéV!QÒ „ÍGçðéß„�+xÄm2k3¨¦»ázUæ35Õ°§…÷²2o™~Gqˆër”v Á³¾‚ó*ã¥µ[Õ’áCê¬[~:ëm&•Ý$Þ4ij¥ïB8¯4|—ºúØ�pHÜærŸ×Õ+ÆºQ)©ÚûØ‚™IÞ
ò<DmhÝÎ	l³¹Hã7IyªCŽåj³ùÏü½üAG¡@°ÄÊ^ärUe5�öÃ´cúG#[!CÉ"JéTÜ»r7+LUÊ»ú�|%ï#N€M·6Õt?&²ƒøBýð­D½oú…;å<>ÉÐg²H¥SËê®ba-ui-�Ælÿ¡Ûôø/Ð¾Ð0¦\MË}Kø?äFdD“–{=È{<Ô�åïŠ^Ñ ’ïŒ;ðŠ÷|x»Ý‹	—òù]94jûÌÜFaú¡fß|Æl\¼Q³!Žr5¹ô3LÝc6š?aãaö¹Ã5ßc�ÍG|¯-øÇÀ‡Ùls^×ó«Ä8š%Ë6uà›O†ç9ãQ¸¾ÇŸ—ŽnXIx¯ý�ò4paÜ½f½Î¶ÝöK~Ê?+2yIb)¢±;æ(ùåJü‘ŽÎ•ÐFHºê‘øñÎØ+à„*1&"É°ááÉ�¬°ÝPÆaÎ%'o‘f?½•„cOÊOÁKäìßÂ8œVzêìM•ŒÃ©‘cgˆÎÖ§õ6Y_}÷	Ûoü”m¼óÿ+zgT|î…VQ?'©õŽé™"‘x¦äR�;gO^ÔLÛÄ8;ÔÞqÆÜÞa°‡ß˜l­LbŒL\úWwÈ>k°ù†~[gwkãñ:ÛÑ>2}Z‹BŸ{�£W
,ò‘w½&ÚS® k×Ëa@–Ô¸ó?¹6>3£¡¶‘n=)?{À2øÜ¥„Êîðô†šÆH2,)q“ÂH`ú¾Þ•º3jkTÄžBú˜È?’ÞQm$%Ü)ú�”ôá}bUÚq_å±c¾qY	-„×ÔË_Ì1Ó�¾)jÖ?¨§‡E=7>§ã-9ä6ålŸ�“.ª› sñ–‚x"áhà–‚�c¾·¸[ÀÏyž»7‡?¬N-þ±€Õ´¢ TäñKÍøÒÅ‚ô÷7÷9å|±Ñ°xz”jÒgmhäI÷n·Hßo’g)ëˆv‡ªÙ~Úõï³ëCÿ;LšJqí�uó›Òp¯ýmWç<÷¶³Ë—=l+(„lCPüñžm-—[I³H÷HK(…“|LQkàg�Âª?CøEBx¸¿}QNà"Íñ;¶°FNU±ŠcEì©\k5EáG
Ð½È^JvØ<„+—§Dk½…Ïr®KìC­N½wÂ¹*®{ŒñÁÂö¸«Ïšñ©>è�j¡ãhøÿÃ‰½W~{¯|ôk›Ã¿«Ï$aÿ=¹±þÈãgõ1ÙizçÝÀƒfÒ†M¬‹m³¥ ëðÑz`Òû¬0Xÿ*´Ë+Gã¨nÑÑ ?Jë>È [St�d°>)�`zdM‘¸´+È9‚Á®,Z', Ä¯>cu}nÀªmÄ�ØNé�=™z8$RÕ£Ì3òc±¨1ME¬ÄK¤Y½$·¶�‹£Óð†Ø¡Ô5ê
ä]Y<zˆ(°�³»©:ÏObêN¨½A›EŒ5Ø¥,»Ž/žÐ -¤±ÞDÙÊ°æ²­sU„2
bÌC=‡‡•(°FÉsU×;Ë�(.óä&‰ï@Ã·?K–*Ø•Ê1¤ü¸E<‡
‰|g×<´%u"
“°škCðD%Ê«‘Íp€zE©]ïh?¤*d³PgÈ\ûR
DÛÄ‡ êUº$FÀ£&Ñi¨æ©‡ñ¯Z>^=xÜ æˆKHUNy�œªˆxU´ÁöqšæYÉÈød*ÕggëmnL¸%®ƒrä°¼!Ú@”ÔZ"Æòœ["(òÍ˜pfêÏk®–"v‡‚à$¾Ï�9&L›I´Q¡‘ïàVü:¾½²WIZÔkŠ7æãTT¾!ÌX›52Q©¨ÜIÁéÁe(‹Z„¦†P›ø
b§Å}LLÝÏ°ß:Ö.'¯Ï�T/‰kˆS-‹>ªÁœl¬‘TÑÇ5Ñ}T×rŠê#Äeä(§üSœG�œ:®'WmšP  8ùáŸoV•VÇõ¿ÐîŽ7S*ªŠ6â‹«ƒ’-‚ÿ¨7kÃIà5P|-çwÑ˜…àSœXªÑÉí½è-g¤Õò`(ÚT¬�zI(jÛaZ’c^”w.™–8¯šg-ÉfV™Âö¬]hlö3.yO…uâ2&öÚÛ÷®º¥8EAD|L|ZÚ3¸É¡¥ÐÑ2Ö]éÛ‘õ5ìKqOŸ[¡Ø´Üµ,Õ„>Ýk*™ÕÄjÖ´sÎ­š	*�ÞÑ®|\íA[
–ÇTï®Ë‰©OÌÝ=5®@'ýáÒÖzœæ=]Z(CGEéßfM¶í8”GòƒW‡ÉP+q±NE€·mïF06ã8Z:b7¹ÏÅ-ŒÐ¬›´%Æ{˜ÍChÇ°£ï„1�÷^tÅÞm,R¬©\�èHâT£Z#x°ã®½‰—È`ßìY³'îÜ÷²}?±¼öž}£ìiou8ÌKØÖP1ëÂò»½ã¥™å¤†C²¹Ê š¿íâÛë°À’Z‘"³8�³¬§ÖØ@x×
Âµ-Ï``œPjŒ}6Ll—RšùûôU\îûƒ6[ÍÑCZ­·Ÿ»ˆNÜ"ôÈ*Y³Ñõ=3C“È¾3Åóô–Ú£�Ýx~¯Ðû,ce½GŠž;—,5ÎR>U³wæˆ6Ô¼´SAR7|aq÷éu‡ð^ØÚ�;V²`Û¼<®®V‘ö½ñ’ï VÓHÉªE-ê3â�t9É…h–†Gë;Æáš~Vèn<r-Ë¥ÖæÈîˆ†VÄÖ?À%ŠasRý1·”>:—˜„™{Ø~Û”xý9:Ö7NÛû+m1ÝÞÖãf75dGrÏÇzÙï—ZFÝ¬(:Ûß%·PŸ
9ò»¨G¬†aœxLIàrl2}‰ÑÚ>M¬n?ÖÏKûwE/Ù’:Tã@×¿Y_·Çï“aîîï^O úME^3 	¿ˆ�˜O§�\¸Ð�“œÀ�—s
_æ^œÉ9$-ð‘‘Qæ­É5Œ¥y¹'­Ëm°ÓséÉçºÑ�ÃcÜváV åI¨‰´Âß‡œ!?æI„æÙ$7ÊÜ¡ê\Ã³d[®#…®ËmH áÜ�Îô³ÿîFÆÞ&8ï$*µ¤° öpÊÖw,æ„�ìhihÌ§tß-,6Ã i0²ªIé^¯,`�Åš7¤ð{~ª5QüR<?OÈŠc%S‡�Š(š D<ÓCÉ“Î¬âÇî×*™¢rœ÷üW/¾<5ó™IT˜‡®,ýy‹Pèÿ	ùòõ4�M^¿VË¿·×�¯«e?1äM÷üBOÃPº­<qBT}«×6Z	|.<£›3pÈGË2q¯ZoÝ¹˜p|UNbUqkèÄw~m¬¹9`ÆL–EÕE@Ka}–Ê!,´Œ/Š�p· ™7Š•õb‹­ ]ÞáGµ{àÈí±�³°O1¾R1ÜÙ;Ä�ŒäAÑÜö&š½¤uÂ³Fªœ ?‡m	ÂþÆÂ�]€ë1›ë÷ÒÏ›¾GgýÚÃÙë�¾üÿIY¤•å¸Æƒû#J²¢jºaZ¶ãz "L(ãBz~Fq¢´±i–eU7m×ã4/ë¶çu?ïç @…ÁHƒÅá	D™B¥ÑL›ÃåñÂ0}*¾X"•ÉJ•Z£ÕéF“ÙbµÙN—ÛÇãë@FP'HŠfXŽDIVTM7LËv\ÏÂ(NÒ,/ÊªnÚ®Æi^Öm?Îë~ÞßßÂ(NÒ,/ÊªnÚ®aBRicÝ0Nó²nûq^÷ó~?±¨ydõì=#?¤¢jºÊß´lÇõ| „`Åp‚äñB‘XBÑ+•ÉJ•Z£ÕéF“ÙbµÙN—Ûãõq  �Âà$
�Áâð")  Pit“Åæpy|�P$–Her…R¥ÖhuzƒÑd¶Xmv‡Óåöñøz@…ÁHƒÅá	D™B¥YžÎ`²Ø.�/ŠÄ©L®PªÔ­No0šÌ«ÍîpºÜ¯Ÿ?_ ‰%R™\¡T©5Z� !A1œ )ša9ƒÑd¶Xmv‡Óåöx}~„	e\H¥�u›Ó²]nÇãõ)¿ &”q!=?£8QÚØ4Ë‹²ª›¶ë‡qš—uÛ�óºŸ÷s ÁŠáIÑËñ‚(ÉŠªé†iÙŽëùAÅIšåEYÕMÛõÃ8ÍËºíÇyÝŸçû #(†$E3,Ç¢$+ª¦¦e;®ça'i–eU7m×Î/!˜Õm)hrYzbšþ3í3ÞSŽH`]AÂMx1A²®€>]�ˆú5�j��^FåiµT\?8E|Ó•‰±_“eÕïoH{UŽ�Ä ý§Té&L¡-3àQWÍn½’Ô¤uþëµ«ŽMµþ‘ˆ¿ú*
Û¥·£ªî¢¶«DÜÖ+ˆ%»j;èbàÍ® ' Y²>(ØŸ–4Žîwó]|ôø¬/™Âû†JW#È¤ ÆõZca7ÄÁžˆ’»B'8:{Þ} ‘ÚNìõ$‚8¥o’˜Q|W�¿žü ÐmOnL·)øŒQ^!Wœ°CM8‡}:N�hÛ‘c&4Ù�q¶o�¿¦_îÖ@–xÞ‰ûÉ�»Å5²ï†ÈÚQ·+–tï*\ÚÁ]‹w	ÔúC!ÃWÑÃ^"€ywÆÞnþÐò…Âæ—eì«/ëøÜRª=˜`¿¶î*¥â†5býJ®Ñ÷’�z¯MwZª�øN	hÝÁþPQ™7Þ´Öá„-½â�œ¡EÒßgö¼�œÙC¥29Êò*XßÝÆ÷îYK¸UkÄ&Dò�í\Ì4žª€ü]Íaw�-ž5Ä&_kDð‰@Æ;ƒ�¯I1fµÍ«³{ÎCŠ[Å�Y}E©�xdõSÏ9É‡ˆÜý@ô~²º$ï—`ƒKüÜP¸£ó˜K}Èô’Ê=’wv�ÕþZR
?Pº©h{§%°ž¿ZdÏ™æ'¶bi¦ƒys-KhO”Ã¼žö Õ.üæ [4/%0y•]Ô|á(…”ç�«D�÷ÎBË€(žD�Óëº¹ò"ñcÅåŸfw†ˆ8±µNg¢P”mû‘‡zdîo*Ä¢j6hé‰nÎi[Ð}×iY
LèÙ±ñEŽfü9ÝóeFº8ã£dýÇ£“×Oó¢kŸ@—p”Âíë#B\û©ä'Moþ=´)§uÄ�E½B>:êÍú6Qlo…›ªÌ”6µô�]§Z* ¤)äË¸kÉÖ¿ø�õÁé Ý/†d?6îQ×ÒÈ7D�Öxªöãã'ey:óÊKýïºCaM�Û½ÕT&ýufÏëT�ÉãÌx_�¯¾šºWþDÅ){5êPJ7›A¶†Ìï·ƒ2ƒºwW–q”ûo-C´ïg*“ÒßÔÙteÿô—Š×Äj^"Ý~ï4è{;fo-½Wò?ƒ“*w£Wä1¸{ÅËó|ÕÄöñk©.Q¸Z"Æü
Xò-ô’èJÈþ’/~­æÏ˜ýÜÛµ�dp¸‘;ñ <W®±Åñ4ÕMÔS¼õ/Üò+©En“ëµÖØ´æ0í;˜Ž=·ëNªõÑ{˜3�ý«¤!¿Q)9]=$}“šèÞµÉÕÌ2ã—Å›K½¢Pg(Û«PY‘)kçæ�š f“,®}úeKüÔfhÔÀ#éµ*ƒ3Wà‹ª­A+ü¸„êÛxvü fe·˜+û+Ü,˜±fTrî~jë¸ñ)	ò‡º[Tn’Íáè*ãí�4pÈï…]§÷ºW1Ç³Ÿ%¶f´§5*yþðÆçï÷W	ãŠô	@YØ9~™üéªêÃ‹÷áØÉ„˜T5ØXÏÙ³i_Žq# þ;�üÝë…ÊK(­56­9LûFQÌ /üRÆòïL°¡EE&Rz§ÄOüEK¾Ð-�Q}Y—kvÝàå…í¤›°Îñ¦áqsOLc÷G¤2Éî£¿hÒÉÜ»nâª»§ :` Ö¥£á$‹šò‘ØÇ˜7UÑ¬r”°Ë_JÿQ!wJ…—¢©‡ª:6õÕÎmÐçº�hõ%°ëbŸ¶4´°Ïß	’T‡MÔþ®_£3\jÂz™êFs1gö.ücŽb�ŒG›d?2RY`oíÒ;ÄÔö·†«2u£˜%¹{™¸^r¹)`+ðvçµÛ³�‹àùÑÝ7÷Fs=‰ ÙCuCð½{ÞC.Õ=Z8kVÀYe†’Ø`öÔ®_Y‰ê“£Uu@ÐiÀ„R|:‘€^Ðy¯Ô%«˜‹õ‚}.Ó€T4O‡½Â.]qq¥Z-v.wé®eˆõi½ÚÃ‘¿´ÀæoûŽ¹:Âúæf/1I|FÝbâ¶ãÙDÒXÿ�âåCE¬Í?{žÿ‹Uû-Nxþäó¹0‹wŠ–�6Û~U½~}.xø¨�žïùcÙÓfìž!±6÷x½>â}ž   WAD<iÛë3üò¶×´)�>ô|QÄ·�æ~ÚúŠ”†…ŠX›±»CÞíüøÞÎï}Âóß<A�> ¢å×ïÏ…6c TÄÚÌ;k­Ýö›#7.{7c®ê¢8œTÄÚüÝÓý_›ãüÌ4€ŠX›±;B*bmÆîŒé#"""*¥”RJ)EDDDDÄÌÌÌÌ›?9ª§7ÍÖÇt3Zk­g�Ñ�¨hzöŠ¿ý·Œþt&Þ¯w.ŽÃáY›NùË‹Õ¾»gH@E¬ÍØ!±6��öõ~b•rÝ´ÁŸÈzÛÉ]DDDDDDDfffffffVUUUUUUU³iºº{zû¦“œ„6½Nd­ wOFF    ~è    †¬                      FFTM  0      k¾G¹GDEF  L       ð OS/2  l   >   `ˆ2z@cmap  ¬  i  ò
¿:gasp        ÿÿ glyf    _y L¼�÷®Mhead bœ   3   6‰å-hhea bÐ      $
µhmtx bð  ô  
ðEy…loca eä    õ¢\maxp lü       ,name m  D  †ã—‹¬post o`  …  u¯�›¡       Ì=¢Ï    ËO<0    Ô1h¹xœc`d``àb	`b`d`d:$YÀ< ¸ ÷ xœc`fËdœÀÀÊÀÀÒÃbÌÀÀÐ¡™Š»ð€‚Ê¢b…¯lÿ�|6F�0#’F ÐËn  xœÍ’ßJâqÅçgjeæù>À"êD½€È>€{ÓEˆO >�øâˆ—,"ÑuÈ^ì¥[[[ùÃÝjûos¦õÖ_¿Mè¢ë%:0g80Ì†‘™×ñBï.LÞsŽzÃ°×¤ 1Y—ŒlKWvå›es¹t®¢)Mk^‹ZÖªÖµ©míêŽÔ×‰Î˜bškÌ³È2«¬³É6»Üã€>'œYÊÒ–·¢•­jukZÛº¶góm2• ÉùüŠ(ê4«-iEkÚÐ–v´§}êX•BÇ×Y`‰ÖØ`‹öØç�cª‰9ËZÁJV±š5¬eëYß†6þGÎ‚­`3ø|6ü«Ñýè‹[uI—pËnÉ-º¸‹¹¨[pLñ�0ŠLp�;Üâ×¸Â%þàç8ÃoüÂ>F8Å	ŽñG8Ä`ßW¿Î¯ý¶òâò‚õ"¡E^Ì_á=(K,F“KË+ÿyïbùÃó      ÿÿ xœ¼½	€TÕ•0üî½o©}{µuuuwUWÕ«ênènjmz-š�nvÄE‘EAAJ!*ˆ(âÞhDÉ2có%FœÊ¦“Ebb6¿ùÚ$&™¸Œ“ä7ºß¹÷UUW7èÌüt½w÷õÜ{Ï9÷œó8Ìmæ8báÁI—	ÚƒÄ´¡¼šÝŒ7�S›EîGÿ!î’3œøŒ�ãjÀã”�=w;ÅP°^I¦A;RRÉn”Æk‘øLSá.”õ)Šo8GŸ([¸«)ó9O,,ÌAt�S’
üïh
yªuºjZupPGxìN®oÆÉnœˆ{ìÂho2�AéDÜ-rÓÖ]µâªuÓà5ñêe…Ñ^¥–dM¶X›8=Ÿ×är5Í»^Q\õ~¡£2€¼V—0 Žoã0kCÚ qAè·�Ð‚®ÖG<Â
¶9Òá ïv¸`Ü|NýX½WýIè:"õ'ÓaõØWÞºO=}üÚk�#Õ"áøµ7£e	�¤%VsÉ~-½y$ÅµÇÕÓ÷½õõX„Îw&'qÇù¸.n.ÇEì¢ÄKÜ#€¢JD‰Ú�në´½7˜Ñåô¸=µ|Žw“L:Ó�2vmrRv:=0P¹@DýÛ“‰ì¦V„Z7eOª‹d³�7ËHMºSY³|ð[oˆíõ™f'BÎæL}»øÆ·Ò—äV÷žÊö®^Ý+ä{W®=±§©uÒ¤Ö¦='jÃÎ,Ë|;ôv�A�ÍÏo=ü¬0Éq8"¾IÂ³‡›8�§¹yZ†6Ç´o9ÎÏq<i3Ÿ‚Æk±§›À„Ò1%�&…û¡þÎu¨û¶k„Ã®½­{H}§ð@Î�WèÂ—^qïÔ·þÑ4;gg7ýã­ÿýNáy­ì/ÂÜqõŒÊP�·ˆ O ÐŒLÁ4‘Óq�,À˜øÔ‡–"—Sv©=jL¨/U¬jC½-wÊo£�ÚÈ�nŸú¤j’Ì®Ó{ï™j\¢ý­©vEô³ÑkêäÙzº>p¹n=…^=ŠajID(µãÜÍà· ¸ºâøquŠÏF;Ñ�è5Ö®†s7;QC7ºU½½[ý…ºòµ×ˆ¡ÔÌøyZIÛ˜èØ»è*Ž!$	ïdâµ„³‰Å–Ü-Ë‡?·ü{óÌmý»ÑÆÝýÛf6ÛÏpo«ß~ûmÔ½wÓã�oºèáG6MÏå¦ozäaò--üm#]?]?V®Žkáz¸ùÜ¥ÜµÜ.î>î)îŸ9NH%•&T/Ö §»_À�ìI…AxäÑØøO™þBõ�]8(§øØ.vŽÏ)¾G=žÃÜHŒP‘SÍU¦ºP™°ä>f‹F„E“-G¡GÇs|˜¬Ò'?~zÄI*“¨ã–Rá|é«[`–§À-VÎ'Ý™G�P3bˆ'\Rå’ýýIÌž#n’;Wæè–ÙŸDô‰TáþÑ¹b8¶0Ù^s6,rÈ¥µªi­²�ñ��ÿŸö�­sm15kk‹¡,}Ž¸q®ÒWÈ�;î“§¬t£ sÒúeÙYq’qC/˜ ¢0 ¡qçâ|>ù¨
3ÌÂ„�æÎWéþ/ŽÕ¨¡€sêFÎ"ÞÉ™sƒÎI¬oAHIö 8ôð¨Câ�þÂ„»üüw©‡ü~ê@
¾ŸúÉ_°(ÿ]h=õûýê¯ðà…r¯9ó�ààp!Ž;­H¬�ê-[Ifô£Ëw;%=¬dõ×ê¯µ’�®bmH)–þk=o¬¿\Š†»hûEÎÁiÚ7i:-!mn:`[†GÜ]ƒàìGE,‹;–Ås²yH6Š2èÆˆsîÕ—:î…‡ÎÊI�¨@È^\ßw„¬²OVÎÃµžµŸ¬ý…<­g?]«Y{?qK‹g¼H—[—¢Xù ´&•tdÒn�[”,ÐúZÀ!H‰6#À=nÝ³µšâÔ;O¨¿WÿUýý‰�G4]]°6®Ù°pßñ7Žï[¸aM£5P·¾ñÀ‘B®]?üáÜã4åÎÈÿø×Pï¦€¥©ñêÀœ7o\É!×ºßœ¸º±ÉØ¤¾‚çØ�Ùÿ„2>8²/p‘2¸h@±k~Ú¾ñüèB~ÎaÉ[ì�rŸÎ=Pr8®S™eáù—scêF×Ó—…Ð ô—SÌ#PÏÈ|0zâð'•zÑéŽS‚õ)ÁŒ8aFB°FE	þÓVÃr�J�”(E—‡ fDp¦š€Uœ\Ÿõ´'h4P…¶ 	‚jî�<tè$>d3}Cv†fôÕ÷»M–}Zlf©æß,.äŸÔp�Áj1Þ•tÖYŽjËÿ2ÛlÆ—,U±©½ï·Ù<:ñ½z«Ùt[˜%öY!1vÓ¡Mÿfrc:_nò"÷ê7z¬wÅývó×m®zãuiƒÙdt­¬ŠOªÆ.3KÛÜ<y¡Éd0‡ï3l¨LlØžÐY´Ä­~ìbgà­#8H7•»JÃC*gY¸€_ÚÖYKiÔn„‚0ºAQ¤•–PiMg-cÈÎ‡…Í)<Ð9Ü¹áœÅJH–X-…”o•êw¹ÖaXÝ;øÔ �Ôë<zÂÌ³Î@)‹ƒ*ÀÈrw¡–|u¸`ÞáçlÓc¬‚‡ûß¸m1ù:«ý¹H2yÎ¡­Ø•ád¶þY× ãEü+¥Gî Zˆ�Q
k”’P*îÇ.»6ÀOÕÜÀ¹ WÅ=¸ýŸn�™˜u…þB¿ÉdÖuë°ÿ8°<ð7¶4~cÀ8 (bK]4„x„~­*xÊ=–ð”Â¿èÖÏ1Tëð2ŸïGß¡}S×}�ÒüÚÞJ§X†–Ã¹Pëƒ@z${P‰Â™£õ"h^öÇÚb§Ø™Jr±ÿ´Ã`R_3¡ËÕ@|8~� v:GãE8»cþiê]5&4ÙtÊÁÃÙŽSƒ”×¦öî	#˜­¶ïÁ†³5£€ÙjQ ÍÙ0ì¦°µÃÎN`“Ðv„!œRyêÀ�S(v
]wB}J]­>uâº=�.#Cjn(,THu ˜_Z™ôÄ	6�qÀ—æÁöhhçPŠ4#J¦HÄ%jtŽ3ÔM‚)µ#¨�zØ…Üzº¹°dtçÑ1Dn~™9Í/™�È‹¦¿™ø£æBÖì@NV?„p'r˜Ùf:¢;Ñb±BÈQHb…$h±3¬CG|ØÏ#v2©yÞd³m)›e˜ÏÀsvº›wÊ~Ù¬í›fpž~¯»DGˆ	´r®0”â^XzË£¦ÝãŽ÷ÐÕ‡ÜÅc�’¡l& \ö`\Ð8HHa¯£ IC?¹³ýñö»Ð±6õ›ö:5ëH;Ôl�ÝÞˆ€4C”øâ�&µ\ôFð¾»ÚàÛjÔ¬,£|MCåÝ”­€/f8€³Ü®2¨¸ì	Ø.ŠÀÒ�l
_/ü€Aý–ÑkTóV�Î�gþ~T†™Î‚<`2©ßÒëQÖ&;ÜXÔAŽW@Úñ³@gœ¶j{œ¶j,Š	¢s·uuE¨š�²ÖŸž·©:ÕA¶É8,&êÑëÕ¼}|ž¦b0³•lFQ$px=ÁÈ4ddm7öÈnru"‚N:OÂu^Š²x@ñ�‚�ªêCÊG²¾”áƒ*œ%FŒ>TmðÊ?­Ö2.äo»»p¬ª¾¾ªðË®Š1²rÕ\TÃÃÙ¡K+LÃØœcÙóƒ�Â�Õn³Á:8ï¢ÇÏÎq¨y½NŽà\DvÈjþ‡ç[õ¨Ü¦Dy/Š*=H	Õ[0àl‰8=ïãô`—D¾Œd&â<œý€ÚqRíöº}~¿„|m?9[²Y{õH·IýÁFPµƒHÞp;@¸À©YŸ‹ÖîÛ[DñÖ]jÀú}º*ÃžhJÔ†ü'v^»ö6XD•øL˜›ÉVæ‚õa@XFök <à˜�—‘“ÒÂN²®”ñœ.äà‚¬ípVÿeÕuêÔÿØp›œ¤Ó+OÞ;ó«—Ýñ§ÆF G³\Eû¡Ð½bàkfy
zÉ�sÃí�	Xý›ú•k®¼MÖŠP’òÞÞY·_g¿Â#™f‡�}{µ ³„Lh.tMV((êÎÉ/àÐŒ4uÿXº4u¿<†k%ŸÅ…Ò�s=xˆfÂÈŒñÝ�èóP®ï(¾.(÷×q\…ñ+¢„¹‡i}üÜJ†/[ã¼ÆO¯£k<Ew{W%�ˆÒ‚pþRJÐË™¢¬$["ºH‡6#] ÖF¸üúC‡Ö«C¶_cˆÎéÔ|=ßFá2[¤#ì\†ÁeyÃƒí.­aƒ«nÆ¡z�K×9Å™eNÄéµÔžeÊö­ïòUÕ¿x´ë–UwÏÎ«Úm>¥ÎÕþÞ76¼t«Oïºd±Ù§Ü,å´…vœÿ‹2+Õ×·­ TU[¶NHN8 W|ø�¥fG{‡Ü˜lTÝ_â¥õÑZ1 þ®Ñ8jü`A¤’¶ìrÖÑã¼Œš•`h½*˜b®Óù÷Þå#ØèÌê§Õ¼ þBý²ú‹j¦Õß0s$nù^÷7œ�w¡$êGÉ¡;ð¾£N
.ÞA>3;M—®y‰�?®žzpÍ¥¦Î™�¤4°aqpÒƒGFÞ×wî|]ý“Ö¯ áø!ÀáØ¾Çbvá q8«eõ+ê)¶‹h.,U~ð4]áh.„P4s®¶)¼ø+kâø¥qÚD2Æu²™°ëÏ¸u ÜE3VŸâ­¯÷ÒŸâ³fŒS±ê8¼Û/Dª]5®ª–Þ–*xWG„jº°ß}æl&kÏlnÃ§i©ÅPv'ô6#ÞÆÆ…€è°á(%ÈË)>q�ÐEŸÛo6U+Ñ6çœÅ‹ç8Û¢ŠÏlÞ�>§þÌ`•ê¤æðMûöÝn'‹üÙ'…ŒzB-tŠ/ê¬±¦Ÿùú3ik�3
Ðßñ55©îZ	1aoæ«|+‘Å‘m¥¯
¼ž0$YÉ™‘OažÞ1ag•9œ¸upâ·À9G×ª+”’á„b´Š=Hß€îÛQ1h·TÈ²]‰Ò’ØQþ‘�^”ì ?ÂÑç®�ãs9­æØ» ÿøÑ ÂÑlÃíBÅ|4çTNùÌˆYBL»,�g÷#Ê5ûÒAùã‰�=!ÿ7~=ð/X]W÷üuwßZW×Ãþžèé�¿[Ùßêžžã«WÓd==BîÔmÂ®ÿÒ�Î‹v¦?$¼Ëöèš
E#
¢L‰!7ÊÃæØ·ž¿!¢º¢ÉT¤�RRýI4˜Ê)ø‡ÞH#ûÔl*¢:#ü£H.…“ý)¥�Ž–pÓ‡¤ÅºRªMÐB�úƒ=‘Æ…Ÿ (Ç‚ÃÍµèÍ�Ë¥†>Aû’,Ð_™ 2ü%¥5›pÀyn„6/á®à¶ÄMb¡t,çLÖ®’éÆl+ô9ÖQ¢Gb]*æ“D;æ�º‘¹{PZ!å*üâU1·ú¾|ý”áµsïó{Ý"‚3›\¢g‚Ž˜ø‰«‘GÏ‡y¹…G:Œ-nQg7ËÎ`Ô�3þxÎ·úAxæ%Ã�U�ïòXMZ‡&HX9ý>o²àsïGaëÎ
áë'Ï¾!»lÃ¼©�|³EW-�ÕeƒbˆéŒõbxs½¾Y0‡ß6EÒëœ>�)ŒV¹‘Hô›çß°}ºÕV=£ÎG~ãYkËh‹š/;µ»Û‡…â½0Š{4. cƒé\h`ç5¿ßã
F£A¹ª5¤ÎTg†[4¿Ë#äôæ¶úS¯o3ëèyuy�ú=øõ¥½<'j{‘	hþNŽkÐ6Æ÷	–@1c/²¬5-T:ž‹`YÇX]€Ýg~ƒô®…Ïi„¨lÒp—!³¼e>à1x06à?ì�eçoAÝsÚbƒ�öÌªfy�b3ƒ@BÎß‚”YqØ?;Ãm)Êh4s�k€P‘À£‹ÈÀUfWùÐ62ûƒcÇ>8F†(Êt*GŸC	ym
s©µr¢pÕ?™£IñìCë‡Y:Ï»&Íœ9é®Ó9T–Yá-k¸Ü˜%Ä)£@í|FFˆh˜9*Š€(RtÕÂÏK€øÇ»…T·ˆXM-IP.%�C"þùç‚?ž,+Ë†€=½­	Åô>òö¥täõà�ëÒ§UÞgQ�šíWÿåw#�Î¥7Ý‹�Úí[ëïPú	ÂíÿÞ®‹�ä'j7�Ã7Ì—Œ9Z‡×á“IÌS¹´þ·O4YkDEì¼Í‚šB~Î`ƒIg;òm‚ÛÕ÷«Üu Ö¢z‡Sg)ÒÑììrÁÇEÜ‰€=mÚK‚Î9ÅZDî]Ã4ŒõÙÉ~7ß‰R6HÛ‚(‰Éj‰Ëi! ¼BldpÓœ^´£¡zzï¥³ÛgûF:±qê¢�kíWlí�/Ð¡Âï±uX2ŠróáTsBà× ßïö¬ðÌøÌÍ«Ú‚—t§}}Æ¶§ž_5á…	ëÕk¬4ÿºÞ	�A;oH�Lê¶Ï¹¿)ùz¶.™qu‡ßÿA¢z½¯yxójÞk5ÕFü-®¸@ÞlÒ™õ�cùÚ—ÜÒ—\6¹=à½úÐO]9Ý/º5Ú”§ë³�ã\tOƒµèCÑT3Žf(i
]¦wôPÄð¤iQª§›wˆÎ³Ý=JµßŒv®GÞ®y²ü§[Ú[×Þã,µ÷Et&Q�«o´c·Ã‚�ýyb66k¶ú÷MK|ýÖ‹$Y¶„z%œÄÆP•Ù(�«°^ô87D¬rK°Ýü`áí%ú5‹.²:øê	âÄŽx=m®æn�Ù‹»­Úm]ËÐ®í&Œ2G¥(-@—Q7xu3%@Ép´™Ð~Ð½ØãtÀ— ÊS†]‚Žˆ=‰)AGáœºÙíâA‡óVg;üÁ*=ÿ$mzæ-|_EÄZ£Ë¢kä�<¢5U5ÄfF¢I–j°ýòø¼€ñ‚`ˆ=H}¿úû)0“Ä~ñF¯,"ÌãÃÁN¹6èk´ä"¾§}ðá¹’k˜ãÏTÃü"$˜�mZPcá',ÑÏ›Žtz‚âù…™Õ…¯±];+èj²Å+ÂNGé«>K#ºh-zpí6\íñ;y“×bÞ~ö9Ð.mŒ	ã\Æ=ÄqrqÃ¼Ç=fS
6ˆu(å¤ËàãØ�“€3�²Ñ#‰¨˜½0�åÓ�
:ÝNz{S¤ Mè]"¬À`R�¼µ±��.CÜö §r`-»ÐU{ë‚��z‹nÜq•ô	tÄxãÃ³ic+Ôš:3YÞçã³™N“Ù*�aŽVóØPž†
»`Ì1âQ bÈçÎ@fc^X˜9œÌ¼úô¬ñ‡Ü¶õŸïü‘jtÒœYÓ‚©ÚhÚ¾Ž�ù©3Ñ	iâjs‘ô„¨+\Â8Tv�Èi|×Q<v»öß¹c—8Å÷1“‹’-§™t‰À˜«Šïó‰\1Ž¥äá™6¹òÎÿGíÖÄI®ØnæJÒ:Ì‡ÿh÷X…ùG·»r´+Çú¿<ÒÿOÚ|a÷§lóyxuco�íð�7ç‹¿Pß'›j{Ž‡ñ§˜G ä÷w®˜s¹‡Ê¥¡ëÇsÿµìäÇ?»‹?kL5>4½çHj·Ÿv4Î�œl¶èÕ!½ô³,€ÿcÖC‘5å4{òÙ±î‘4dˆŠRÐì~ú¸pÏ*;9n‹¼�ŸC%dþ»} dœA4Q8öi»ˆOøi	š¸¸Tý§è¢ÆgdòÃulþUêS‰¸®Aˆq™$.j6U;ÔMÇ¶²Û�ÛŽóÛ�¡ƒŽj“9J™D�vAF�–bŽm ºLOI=`áj¹f:’”>IÇ�¬J!È
–6T¬xÆ°µqnóàæÍƒüæS9”Ä€M|Ìú!Ò‘8X)ÉÛhÂÍ…¼šÍ³¤( ƒÇŒ‡,�ÓŒ•Íç‹2‹€·¿+làD òª¸Ç3QÉ•p¡$`éPt [€ô†öÙ ˆ²�DV¾»2‡op¤Âo%xâZ)�‡óê€ðnä¨:p4œN)ïF Õ†tÓT7Mõu`8�ñP*r>«(ŽñO^“ýðŒætXåi(ŒñM4!t(¨>hë™ÕcUÑô<š@Š²Ü¦Ã§‚Š$âŒM'Ñõä(¹™Jˆ×³»ªQÔÜƒô®‰<8æVj€Ïj7Pø?Ï¾;Ôøõœ�š‡ò_�Ú!Q¥ž¡õ.h|:BïÊ)Ó’ •ŽxÜ˜s¢·_â�Öód9ûÖ÷aN=©.WO.·\|�_O&tþk.Þ".D¹p53›Í“	6¡`8Õ×÷âIúuò�ÛõÏÜý«Kjëëk/ùÕÝÏèwiëUüôS›Ìus³ UÚlr
Ì¥;ƒäÑ Me`¬T¸¡òB–& ûnÂ¦\‚	g2pdÇÖÃ[0°«OÛv´zá±íÃÊI¶'m%Ä4Éâð¸‡ 1}Ö@�Â€:Ä¯Z¥­ò/ r@1m8_.§ðãW´R¶«’lv(F5A�Õ½·š¡~]*@QØ¿
Vù¡”åñg÷äMÜŠ±²¶“â:M�§ÊžQZÌã–µûË.
H¢ìf«žJ×wKô†…IA—…\©‹Ü³ì›Ûf7—zçðûl²ë}5ÇVÿ züúí‰GÇÛ÷äÆ�ä
uÌ»vß‹ëaËðÉ°“ã�Z(õS6W¾z¾ÔË7eƒÙkÓéÑ[jö‹Æüî½ê#6[ê¯ØÓ6iÉÀ‚ÅSÚ£n¶Á@’d©ï»`®[˜ä }¼i¥]<{béN&k÷ñ£¥Gº[žQƒ™ˆ£çÔ`Eç‡êíõª‹¼Þkà�$|'¼®ñâÕê·GO¥—§R…©4:	y½èŸX¯ú1d¥…hz3TžÊ·L-ž3ŒÕDÙG%ÆZ
ºœbé”¥›3ãI•®é™ŒR�^cy,÷3œœP!æ¤@Œ ieNqì¢€FS'}@4¢ÑˆÃ�~ºôòèÚ*ø T(ÍøPÐìèY+—=�!?“}>¹Ð®ç+¤åõÂõ²Éw*ë3ÉøU½¡°¢„sÆ½Â ¯Ði[þ9ªa‰Ò±\ÛÙuâWeßY5·Ÿ£	�Øä+´³¶ì,ò»ªÆiK²\óâÊšeù<µÁèŽÏúz³°KØCµ&ôHdÝbktÝ©7<Á GhõàË
µf§OÈûœfp…+d<‹8ÌYòøÂXÕ®(ùÏ´ †s•>!;BõTR@J	vKõœU‹8ŠbUÎH^Q;O¹kžb%Ö[QšH‡ˆ§O™9è°‰Ž©¿Ê0rð0ùð«}¹üœœU¾Ç>úÊ”V5^�£ÁäÜµƒãèÈ á£}ecF­‰ÑmÛˆrí•õŽ®qLEl¾¡	"ÀI5ÇÉÚ¦ÀfUÌ­Ç2cö„W+¦O,±¯ðMJñ��§6ž�žy”?*ü0&N�Ýšôxq?¢)°ð>–eù(�	@ùÀqTæVx¿ð>sjAð i´2W@™WË<K�ºŠÒòÊP
+
ÀiÌÿµ4á(Ø§÷‡Õî	íš
�ËÔôxA»¦Ì“²Ã	1Jz'O»ÌÆýë?Ò<L0,;V|'[Œ9;j:[–©Bž¨Ø®RkÎnC….Ð¸µiÞ±µTö¿‰Ý�&[h¡’5VÆ,³Rü¶IìéNÄ{oF|Tn‘_|Q–WÈÕ>êðUƒóì´{LÛÐ“çK^A'Î96&çE[h8 •¬­ÚJ*·XÑ>�w¬„yW×ýž+´žV�ëÃcå*ëý¨Y½ú·PµÃ„Ì!™¦›3¦•ò^íÜÀ˜Çê�%›"³¢`œÉ’•RÀù›éæÃcD@Ë2ãÜµG—ý5gõì‘L6}*XŸlí‹µö\Í"›‚�úöº*”ÓúÁ²p9þ§å‡ýÜë¸B4Móz“A¥Ùíß65L£å.ÙášÔ2§k,0Œô‰Ò^í¥>ÙG@�ñ¹Ë@HÆty”Äç°”Z4iepWtŸÕøAäh,8Ô<{9È½ƒÅÇ·Æ¶wZ˜îOY¤EË<’¢þZä)«‰t#�/ñå´�¯\F7Ê”ÓB>(ƒÿâ&º�6ŽldËiã‘ÀØ t½â»/òîæ=ònä>?& sçÊ]@Î�½0Z.3Ä¤Ø9MñGÒ6ÆXIíJ¢H�Xaå:Óç’Cœ}Àà3ìÝ�ú6Œñ¿~>ÉDôýñ3•ýUçO>[vZ_�}×¡â¡qN!Êƒê
º¼-ËWÂû ¢›ü•òÎó
SþòÈHa)Yš÷Ô'lçg8=ç`zÁÉ(bwv“« ‚†i:2E�!°¬`Ù;xí÷,®Â½óY £…ÀÎ×Õß©ÿªþŽ
=Á–Ð†j^Ç»�ÜQ°^¼ìÀ_ÆYy`øÁ§Q�úªú[&aY‹ÚQuÑs0{&mèƒ‘*ê±ÙÕøj)�±ÆT²C¬¦$YQ”>*†PØ‰à»é}HŸ¢¨¿ÁùäœË¥úÔ_‡7†û!n?VØ§(s”õ� OÃGRB¾XŸÆÛbG/*ó¨´‰b¡��¶E“‰(”�"…lrÊ”$Î«¿�ú•dJÁwGp6¡Íèƒ
P¤/µ#j‡…mtCçR0Æ}B–jÌ£RÇÊX�vð»I—>(‰j=ýšÅ:Eá»C™t„V—:O[h[5Ü"uæE¨3WÒõ.f±[eÜ«8¶P)íe
ž0RÔ�”þd.Ù�:~}œ‡¸­t<)�§/QcÝßOçB�¾GGpÎ<…÷"-Gå©-bÎ¢®y3Žbè«#˜°—è5•RPCk{dËšî� Ø­6“d²’]©§ñ÷‡€ÊÂªL¥dâLué‹¶®ÍLCz«Ó®÷ÁIYsôµ;ÐAŠ‰@*nÔyÚ¢µÄãÁÎKË�É©µ ÞE·�éöWƒúÕûeM˜ª¿õÃ¢¿Žx¨[ý*u¨ÿþ¢-zßÇÒ—…rizH>›ÉâÒ�ÞÇ2$•¢ŸùÌ=Â_…ëµö�«çj7“{§!çh7ÎŽÛ|pÜfs%9LAÓQ,®Ç2°–WH€(EEug˜þ&Õ/¡
$Ìƒcm$0^(K_¬C]D£¡Æð‰i¹§™˜+Ÿ/–TRÕhOJ?¥˜NŒ¾èˆÞ› jª;áì�³Ï#”ÛISm0Q„4Wû²¾«šÕ�¤«5_þêfd §…Ú"0£Ô�Ð øˆ~D}�©R'�ðk þÑGK1(Á´³_/ÇTž”F™È¤8¥¬>‘“Q 8ª¬…àmË.mùøËsÞìtÂÃ�ƒå-‹Á`wZ¾a‘…±xÈéÿxÅ";Í¯˜�2ºo2‰:�h*4X­¥»-hW–3sn –çP,Éž
ºì®"Þ—`7ÌNw8É�çD\Ó«Ô	Ó(,fé„�Î	ÍôIÜMÕ|ØŸ÷‡Õ¶ïÜêk‚™Ã¿l‹5ùnùv½ xL/L§†M}ý’Ý»/ÙÐ•Ëum .ôu‹ã«mèd>¯Nh«ª®&k�Ôµ-hƒ¿º#ƒ+Á”¦q¸û¥ÝsŸ}v.¼ŸLÒì8Ìc|åP=/2þ, ®Tè,œ \f‘Óx€ˆêP!:*˜ªé}ÒËuLåvºyj{C çê[¿Û	«Ëëª^íÜ‹¤¯ù°âlVßýÍ›Cî³ðØZšºkšª°Ž�î9Ý~¬_öð+›2_ýÊ—Š¢Îú¨7Ú°%©\~ìN—Vœwµ|ó:$^ºfHýö¦�-Âœl6ÔÈ[D³š›n—ùi†DêúŸ>µ=ì°}4bˆÚ=úU{¶–xÐC‘ƒu“€Õ:ö†ÅÉ6Ý¨‡18ØÁ=ÑZžÞ%�Ü“�á&Í˜?i*�Vìß»"£ùz‰æ,K¯óò¼=—,ž5keb ‡PÃ’­·}aM)dõíÅ�".AÇ�§2æAn¬K%
»¾Æ%7 ;›�QÎ¤x9:ŽJ'¤áís‡ßéÒ¯ºÞ9üô :‰(¼èwÞòÌ¿s©“ltîW£…¿¨ÑýNç~ô+lA¿Ú�³ïm[wã7¨Êð7n\·í½×ÿúW<9æÿÊ-N¿ß¹t§úÓi¡?¨ï"÷;¡i¡w�[ýó;L¯vP¢2Ùz®Šëâ¦rägškªcl;#´�Eî*¤ b´ÅÁ8Ó*¥<~h!äæû™‡“:œQ¢@´qÓ¼ek /Ïá½#½@w¢õêª«'¦�¶	÷ýçr§óô*2_¼2mp¾pm�Ø"OÞŽ¼:”wFgR·ýÛœ“èê¯®çÒžüý{zòh?U_3ÒÍÿ�ðñ‚éå‹m3 Ø¾)¿Ü[×_÷.²Ù/³™d‡ŒjëÝïÄÑG÷Ì¨Ï.üÂ+{¼ü•ë7g¿|©6w6ØŸ>dð¤5–þ;{O"È-•¥<½ìà+îjaW2ß2š‹»’™p¡ˆ½£þWßa�„gïœÑy6&ÙBhú¡I2%‹š1˜Íä…S¹žžšúú*¾[Ï¤�ÂFª÷Û·É%nwT�ç»	Q±ªÄ¶!=ÒÜ–¼00!ÛdP°ç$O¬¢úïj!%˜ôlÕ6bd ·ˆ¿�ˆÊ[6æ,6üÈ`^Hæû�fÉ–3Vß¶[ôØ8|\²™M—éQ
äÑÙlÆœYxj°?KO²3ÚÅÙ²Ð%)èùÜõç)JrGÆ¼Q¥¿Ì¼)îÇé2câ"£„Ëä^°Â–€;‡ê@Y5¯Žuã!æÎÑ'áhˆæVGTi M9±Ò#‘(×Ÿ<Å4Øs«{³½«‘ö‚­Þ@–eËfQ`ÊGyí¡8€Lê•þ"KB3ä+‚çžfOxÐë…íÙ_¤c`=C@Åd¸-T§Ojæ+ÄJwØ]ˆšf1šÎÔò‰ ¦J€åÈ °„-•L˜¯[,§Æ�vÎu×&}†˜zë)AÔ«yzŸXß¶"ÙïM¶Ww“P-è’ºMr†k�×Ùè4×4LíZvÉŽiZcK¹øºU/NÌÌj¨a,†a‹Ÿ–ë!"Y<õÍ]ÑK¾Êâ©¢ú-²½” ¶³§¹{SïŠ–&‚,ó¨-ùÈýl‡5„V”(À¦DSJZ¡‡ �¡æºU¤“¸Õ+þ6£ïUõÔ¤)öjžÈ€MXju5xk�O¼xï‡¨ÿkC�“fõ³ê¯>¯ûç©v;oã­Ä‚u)O[ó¬ØÅH<tûû_XûùÑ4‚iòºœ+*�d°ÿÔ’x7)ŸläæO=¢ÎR�|OÓÜhé\ÔÜØ¼¨³EóRD*c R?Ê‡ó¹ï«¯¼ø"êý¾ÆbLö+nžwSBˆò‡¯IZ™­È^Á¹Ä£|€òr#R¥e‘ÒÕAÆ>‹üú³%îî³rJÆïÈr¡ZN•øÃCâQòn‰?|Öí�x�ñ‡Ïâã_B´¬*kŒégY¡n”ƒ3:Bµ¬4WÍ¤u¡Qš¯šÞ�Ýú—.âRÚMœF­2ÃÄ¤>½«8ªG§3J<ZÂŠ²r§Œ²VÅ—ÇY›~PÂ9«šw¶;Õ<+äiÕ¹+å€5ÎD»èDƒhp,;Ê¹ÝjÎî¥ÂfÆ¼=äµ«9�± ”3åõÆ‘,ê@ÿ('h:ÔíÔÆ‹&mÁßTkPèqÙ8Ãó¨´±Ö!ÞÃ¤.˜åò#öúQÐ{ú=³—¦ó=4¦ÍV�¿ô#�Ñm«²˜x	ñ_ò)IfíCû#y•óFÈÎNƒ­•Š²ûŒu“’·ÙQçR¤ÒPQßÍyöýQãuäö¬:�]µgÏ*O<¸j,0?ÉÓg`OùN\ZåÈ\£FíkçrIÝ�J%QM	$%G—/-«S_hz¬÷t¾>U‡€‹ÏÖ§ÔcÃùÕ'ºÔP±â üfÕ…Ô­‰™¾ÚºÚoÔ>xé,u«ÈÛùŠÆP^‡ó"“­á�½Ê¹¸ÅyXdc®i+®Yù_'éz­¸…å¹ò¥«6~(+q$¯ÕUº;{S<ú^xÜGn}ÇÜòou‹vXt%ý&3`¸.:gA»¦…´'ì%ÎÁÀOàþÁ0jª@Eåw†�â:�ƒïÐ¼Žjd�¦«q„gÑÊeÙé•<TCB=€nÒ—„ÔCqÀ+é‹òé€d‰¦ÏÚ¹¶)Óª¦LïZµì&á¶ßÎ¯YÙ’ºbv�Ûìsm˜¶õŸ÷ÁÚüÝýk'mÜxlû0“k"ùíÇÈ“UúØ\ÅÜ{Ó²YÚzY¼íº.T…û¶Yt|Ï"´‚¬ž¹ý±cKú‰�ä:6ê.4LõSŠ—zöD&D·ŠLJa|ö�+Q²´‘à‡hþ—_«}§eÚÎžëïzæ_ÿµðb"	P8^ü§ÛÚÐ�õƒ>ÿ§Âµº4cÄ&Å«¨†Y3×]¤ô*°ötIÚ*˜
r6% ÚÜê&A ©R…^3¼´$òp´Å,a2GÃ‡¨}O>W4ì7ü6Õˆƒn7[¸YÌõ¥Nq©¾¾”Oüe¿cu/=Ëcm:&–4üíªCÝoÓÌ<Ìþ†}¹Üi–A O6ç³ÄƒŒN�Y”¢ÓÌÈmÚ:ÁÌ²f3ŽJž"M“ÄK:ÂEk�™’:e-O²›7Ë�6ßä;kìúh}xË?¯1æ/\öÂñg^ÅŸy}7º|€4×ÖØÍqÁ’‹'“7o^ÐØ o.¾UÎ¾& ‡dŽ5Îóã§v¿þÌ Š¿òú3Ç_PŸ MpÈÙ×Ä¹‹VôjlîŒUÊ	ÂÙa^vqÇ¹ÓÜˆ\—Ö?è™½ìª°óã:�¡ŸOoæ§ÂÈb2AL2ˆù°9ÐzXv…ŠQñ VUqöÀ^åk%@«ìÿ�Ì$Ç ˆ‚#¡o}ŸöTsýcFW}›$y¶ËFÃõ‘˜Ñ$y^2:�§¾áÉl4Ü/ºmÓaƒ¥œÔ½ƒ&­oªLª3Ñ¤¦N«ÇIqî!“#ÁïÄº~‹Óé´ôëðN>á0=ô�Ùžàùî¶bD¢Aäwð	»ù¡O›¾hÊèCÂ€ùTÑ¡ÞÿƒŒ¼¡†Ö©F½IªÝ.­�M[¼VÃ#×Å’î3Õzƒež{‚âEvceR]íÒ
‡ecsER�ÑÖïn­÷`{ah¿ÍZ]µ¥Š'3W»0v­žIxðV[mQã¡8¸¢f6à4ÎSc%þWr•åF.aR¯6‘aÃÌLv0ánž±è=,L	ð…Z‘BU\ŽŠ¡ ]±a€JX»ÔLÐËê7ÿeéŠ›Ç‰QÆ€´c�ˆHÛj\†›ï}MG·¢é¸óÞ›®[X@"ÕW„dNS<üèÍ+–ªÿùýöÚ#(¶õ–;<·"w«~o¯myL”'‘D‘—ÛpEbÞY?Ý~÷{{÷öîøÉ,o,âRD‘¼(JÄbC’>¶Ü¶‡_±dÕ‡wÌí›ùfïfºs�Ü¦k3ˆÞŽ&Óô~¾L	Á=¥$&ô«Á�Cyd°"�le°ŸØ„é �ì§tQRÊ‰êœ@*­™¤á�Î‹«ƒÙŸ7ÒàÎðJÕ„pCÔ˜#5-žVág»oÌµ!GÊi4å&éÀN¿pOø’�oÞ´Õ­Ñý9ÂkÛ'y=JS4±äŽ­/¬;¬Ù¬Á¹ÄÜöv¬Yí»á3MžiB<�
……œ(Yuv<û9_­möœ@|zU—­
_<'ž;Õå^;÷î#›b})œKõyw÷¥ªnÜÓ™²oÛ%—æÊ6˜˜,i7¥-+v´(›k6i�c"YmÄªç‡=t#WRT™•žˆ¥mŽ‰�R[åã †na’«<¤åñj
X�)G¨VX³,·ûgB«§¥&blÑ†ð„*…Ï¸"^(ˆÏË^÷Bk(tÇ’D´>fôÊ­kÃêlÐî­¹W®Þ¼ÿ‹¨“(úI¼¦d©r¡UÈÞU5=^§DfÛj}-š�í:«$rŽp(ˆÓ<MŸ¹Á·zMÇÛçÆ¯:|ù%7L›>%\³x©+>w·W·Ø„	Oîæ®u»¦Îgq‚/’,£ÉW:Ëº/ÉŽµÞ+�úÞÙæy+×&Õ�Lo)›	£Ôé@Ö[›@eŠxæ›Éb®iêÀªu;ÖÎò:ºÞYkw¬[50µé›x:žörî�ÂŽsØS&_Xxóìf[bîT¿ÛíŸ:7akž}óÂç¿Yx·¼ü<5ªìÏÜr'°—Ä(>qº-¸×pŠrší¸–”oÌÊÉ´2œÃH°šU&¥I-K½”÷�¨åm»hàÉ \¢‚ˆYF˜äéµY`€¸|fM0]63ÏêÞB¶w5æ%#Ž'iH(Ú8 ²[*ék¸.µEtc&aÁÎÇNmíV€JQÔK‰TÈMÀÍb×X4ôý?þñ#4cëì™“QÇ,<û�vÜ5ÿ‘�?JÖÎ	[ÑÉJÔs'þÚ›ÉiÓ’‰éÓ‡ŸC÷>úä¶µ½…ýh�âMz__‰m2Þ7³™b¤2õHC'ìŸ  j
,J”NØ‹Ä¥øì°†èLuqÛM¨ZèW7ú”'./›^L^þDL´ƒÙ%Sÿ	Ñ“½½£ønúæ4:Oå¾W¦¿è^Ïþo�fß·RÐ¿l…q¼{¿‘\ÌPÈ–å�™y4*xúBa«vý‡÷¿ k¢Šx@Í—qYÂ’.3ÈHQ¡F–�ÝÒ|ô:rÄÆ”‡Âé9`P_îSRL§¨­
6bŠ|jAn~<D×ÛNÙÌ"Öu¨³Å0ÀôQ¢�­€\œ× W§�u™Þ§²ïfn6½oHõçŽ¤‚N	N'—S;Á»ø)ÍƒvGÂvejO¤ÈXJUPÅèsÎpÇùïœáæÜs<·øž×·4¦”š®©}Û–a˜’m}S»j”Tã–×ïYÜCheubmøž§20ïù�~òtÍó'r3ïß:_H7ÔÏM¤ç¬œ®Y˜™¾rN:1·¾!-ÌßzÿÌ\¬MãaÒËP}…Î¥lê ž&pqî6î*_U¨Yí™IG‹~OºÁÞÌ_KU8œ’FT{Âåt€Î(¦·Ðav"CBf€ŠÎ_FÉÐ;Q˜çnìqÓ³ÇB$MU*rŒ…g,ñ’^€ŸG DÄ,IˆH:7FDÔ	âJlÔóðk6º°c'¾]Óuøî£;åä„&�§Fb´ˆŽF“­iBÀ"ù&Í™Mykä™U¾öýíÆP¿\ãMù›²]JÙ�~q•ûZ JP·$5K„×é?‰ç1/,#	K:Iœ)ñD‚o³Y¡Å:Mgª!'ŸSÿ¿$±™’Mˆ }�¯ÃŠ£Nâ«Ý~¿$¶¸ÅªÔå3æ·wÏ«m6»]r×ŠsºÛçO^–
Ûøºll6ÙHñ�•{RÉvBžÍÛÎo¿�ÚLg(¸i÷ëZµhVdÁ�Ë‚ßç]—w!®ërú<3â×H…/©äåŽ7CyÌY¾N9‡¿¶Y³ÚÚð@¬´Lc€©æeYÍÖ–ÏYáÀà$îrzÎ2ÕdŠ²k`¦–„Õ8v1‘gI1œ"0ŽŒk†~´´,£ÆcÓ$µ´´àty—Åh2è^/Ïsvþ©£éª©m{§ìšTåöº½—UM~{ò‹WÝöóí¹ýÃ�ÝüƒÉ¿mƒ°ÙkÝUáÙ¹¥óýöÎÎ?¶ËýÎ…sà4a›¿:áîêZÿDŸg¥;â@úV�×�ž4ûßÿã¶Ø`ƒgÙ„w]xâ/�óîgÕožÎL¨©¹v¶w¹'v¤áÚŸŸøÚ”Ž®y­†µK<+<f¯>ÀÇž¨”… º~NF›=Î�7Ž.'¾h¼ˆÙ–¥}ÂtÛ)vÏSK4ÓYÔ‰©††�s]kW¯ªNöÔ-Ð¯™»Ký`~kˆÔR¢-^µ¬Ú"9BF%`%5–ÉS'$êÿî^\o©Ö;Úâ�NKM#_5y†<C$(V½¬*Þ–�ÆZj��»æ®Ñ/¨ëIV¯Z½ÖetÒM®âk,ÎÎx›C_m©Ç{¿Û�\’Ê¶Ôk@1†Ré+Û�å.¤˜ÆŒè‡¬þ·’íÇ®tîÐ¸Á‘íÜÖl˜ˆš=C;Êx�|^c&¹a=wñÅè9Ó9­šp§tè¢‹ÔõÂŠóÛ7á±Íä–1’�R»ôòŸ1@e ê ½a¶ �òá<µ3Øw6£�Ljž(
~·ÁÚn0K²ÉM.¿·›E©aRƒÁIˆ×Wí1[SÍÓÁ,9p'šüY±ÕÑP¶M>èr�ÙÖ–žjŸ—§òK¢gî»œ¸M²dn7Yn¿ NlžàÝ®ƒ“máªG«øYõµNì�Ì‚0­9E&WîKˆÊb‰Kà|ŸÄ¸Š°ö°ñ¥Jï±µWr{ØÝ·›÷íkQþcZ\2õRÔÿØ›êO¿ þçÛ¡¦·_¸úh]ÐßÔ¸ùà´y½ó&ÜˆV¾ª;~Çþ�M‘«/á×­™nñß®>ø_›à÷á[.Œž/mã2áÞÅËûúŠA	ßqüJ×äë{Œ>¸ôLŽüàMŒÿÍ8„A¢öfìÚ]ù—'–v¢HTUOœáÎ¼ñÅƒÂßÔÌšu\ýeA�ÿŽb¿~éuŽé:ŸyŽÍënw·�»žÛÉÝÎÝ¥IÙ¸œœ$j[Q´›§Ô˜V*bÝè�‡nEÄCÑ*‚Z É­E”o?ÒƒØ&k=•tÈå#·ò=ÊK�æ¤TïrfâWÜQó§jJN^yÙ”†ù‘‰þõQå’W/±¥®óOŒÌoÈ^¶rrÔàjí�â‘;œN—M4I’»É`0wÏšêö _õŸÔßœ¸ˆ„ô!IoáÖëuz½#®3™tz³i
±�k�j·ÙmíØfãLè'§Õkç
^9ØuÙDÑ›ž¿û¢íËVnÑÇ¼^ŸÏ˜¨ß²rÙö‹n_�öŠá©CSC Æ½Å"†6�Gi1#žWÖò¯0=pú'è²á]’@8z}‚Q/
Fƒ"™Ì’àëŒ&=ülF�wó¢dÆF3v1ñêFÝuDFY¦Vè¤'FÛë¡Ø`.bNñÁuèä¡�‘� VÎlî�|I×€ÚäÉ·Å*¬~ƒšä)ñì‹ßZ©*Ú!+ñ¦Ëu¹ÔQv‡�éCÐM/“¢vÔ‚.qˆîcš’­Ys²Ù,ÏÄå”»ºwD­‚‡†ÌòiN6ã�Â Y¦æÒršLŒ é ©Uß²°[crÒc„q5)VŸÛ!”c0‰31;ôšB0ÞŒeGÍ�UaìV¿ùNUÐe÷	ƒ(¼åº;±;þû|dú²ú;õ–_T…œA"ú?/}óM¤i	«ßó;]ÁªwÐt7WÝYã°›ï¼n‹úÖÓÕNg¨êh7ªù²EªîBÉüæ7_RƒE=S®x·VÇ5P‡s¿æûm™`ÉürÅ¾Ya­–·µô¶´ô¢özªRaùtœü	Þkþ‹ÅËó_ÒFÚö=ûª±dVÙ¿gC—õjÙèß‡%ƒËTÕû}ô[³Ýn.ÜZ$‘³Uq¼:ÕÛ›*<ggÀnÆGhæ’(U?.b�=Ð‚à˜¶ z®§3ekç
4ÄÎ	v^ÌQVJR½TÝÖÞË+NÑ1©E©yöÍÒD¹šì;Y�Cè+èõdN½AÝ‡n$9Æ÷Mö£•Ayõ†hpJ¢£¡¶=^Ýè¹­ó†%[Ò«{©�Ñ\r8L^RÚ þ¥‘ñ�²g8‘Þ¥~§ ažd8U=¥gP�³'›1À.#lØ
èÓ=Î‘Ñ¬zR6’ƒnpä~[ÇE�«fnœêG­+yé‘­|:’…¦f“ýñEË»¢~E×¶ M÷ÊŸ£]Ë½¸¨Ãf›}jE°3±qMOÏš�‰Â{êÉd?]uýÉÆU?÷—»#Á/;éòsÊ~õôá»ÿò¹ƒ«ØšÇ€KªÂ-Œ6ÊB´²'é—˜ÌµÄL¬Ógc¡Òg&­=ë˜ÕGúô¸µ'Íù…�}µSìå”©®¦á¥VCƒIªsÞy§¿±ÁÐúRCM�)õrÌd¨Ý7&UCÍ�wÖ4ŒNƒsc²a7ÍflÉÖè]tƒÁTw÷ÝµFÃ¨4åo’ÑužâÖ�å§2©Bª>#o7(ƒö½J~j‰E(ªEMÞ®Ñ-P<“×n}‚enªpt^¼�¯×^<ÓÛë5ÇfÍ¬�>3˜õÊ÷/rQQ@âÃWãƒŒ“ú™ãŸí(²Q�×Umñâ)!s¬¾¥G¹å7º¡’™êœœZÜ4µëî	®ìÂ…U“¹l¶’‰ÚŸºúp÷d�ƒ:½Ccêe»ßê's2®EÝÙÐ;§uæ*Æ'»àŽ‹$ìš]"öŸšc4�‹}¬vŠzyDzßÉ¨÷n4†ŒbTFÒ.b4R#ÔP*Žç©~6„¦tÆjtü¬˜Å‹d‡Û¥›y1W!Ÿ×ŸD}g•¿lÙ’W_Aë4R«/¥u|ö•]÷¾€P	òÇ®~øð:tƒû™[”ž–ú˜94{-Õ.¯Ç€©¾Îyã�A½°0ëÂ ¨xº¦6-NMvÎM$ûc50g¶Í¸hQ6«¶ ãÔ1ý±ýBÿ•n×äîÃW_u¸sÚÎ;BÙîE®Ìãg—õ}\¥ýÿ"\ñ¥a ¦šQ=»#–ìÚÍ§�™ïÕ¾vÇþ³£�1êÅŠS¯Y(R.ií[�Œ9øÅúJdçÑQÓœ<0@BŽNyaü)¿j0VhŸ2ì¬„ÇsíÒO �eP5>I®“~¯‘ê©1! Æû¡ÿ-¼A8agÄjÊNq^7¬6êÃe«°/‰ì¾‡Ý³RuÔ¢ÁZ&ýU¡EJ©¸l¶pžYož<2é¹"_œìô:Ùé97Þ9f²ÙÚé˜Ž³ ˆ³.µ!hIÚÂ4Rk¥óCj®GÓBu+bú˜™tQõP�uÑ/Ð�1ú™TZ5—å•ôÛ‡V:+Ñzp‚ã8úˆj„Ž§±y\ST¤é!©zr�ãøùu8YÛ¸$ýøÕ…„F•uFYÝñÊTj
+[kŒj`âGÅ¦¢õ+‘ylÓÖ¦Yë‹�ñ�4R«çÔÓ,¶+ªéh"­)=¨¬UË>Î­¯yVÏË•!ËØV]ÉZë8G_
jW®²p¨¦Hêô Ö¬Q6P¨é8=w°Q9»]WŒÌò80À�9Ÿœý{¹Ñz$Å5ëÎp¾+”�ÒƒD%ê”’Š-‘äõR`5CbJi¥•h‚EI@§¹Üôx Q@‡¹-ØJ³Ã‰þhên”¢×�!7“û‡#×�ŽºY
Ñ£X­¡ž™¦2ìÏM�é‰n‰ÒÆ”¤ÒÍi&‚#i…x2n�B…€~ŒÒ#�ò}2n)Í°Ú.w¶Éo±ÈBà¡Æ(“ÖYÇk¡"Š»5n³÷GPTF‹£„¸;“N‰Q@÷(ãšå¥£$ºêé%l7Q?ŽÊlR¾±PäfB!wšÒ¤JÆ�a•Ã®GÛÙ� ñJ¦ ƒvK�gêWOÓ¬”»L_é$›�tˆ±›aŒè[!i&þMí>Jâ¡LBfÝR�žº %µÛ£6!áo¬™†­"$Ú,J½{ñl2"QoÁƒˆ°#BQ'!"#±Ú¢žH²:‰.	o	™ý<ñ9*a$
<1Ê”/-
áª (J&‚‰™$²
f^o�Ñ›ô<o²êÈnÓ!½ Ó¿A®–ªEfl±Ù 5
‚ŽHïµ<�o!Í­¢(Øp½N°ˆtHÂ¼Õ¢³‰.–a.¢&3²!"IÐ:LìfsZî0A•:ìAˆ REæEì³b"`¬ƒ\Ä`qbÑ¦Ó»EAÄØlr¡Zg0Ù«_
ËX0JXð	�Ð©³Ô9‚1¯Ç"BN,¸b†qÂH/b£I–½ò¯—Ì2&0ñ˜6†IM¢U°à%U�ž	lÔI:DÿY%ƒYì¼K”xÃ­—AÐ›t’PG$Lx7¶â0lÄ¤'vluÛ�Ÿx€ÈÄ!"Io#ØÀE‰NF.«`ÒEÃbˆUoáÍæË˜'’\�y›�¥ ¤~Ù‘Á„$�(êdìF nd3Haz½—ÐIŒŒ+F‚È#Þ&òzô¼¨—‰h$»Ygãu.‘ÝÀØX«�ÞlÖÈb%¢‡N¬ÕÄ[/Œ¥�*W8  ä¸«BV�™¬0f’^‚@�`^y'/Tñz‚ :h·ÕMÐ#‹$Øô<E“H,0’î•²AŒÈoçaÎ,0�(å‘i"!1Â”_E¿63š;«xÁÅ¨MrÙÜX¬véuaQ2‹ƒÎC_ëyY‡Ì#"/è¼˜ÔXƒHp#9x�—è1@1@ à
6³	Z «ŽÌëm† Ý†­Qû¥ �D/ÍÈ.T;O |‰`1ÄÀe7J:½^G²	:^¶é¡&#±a“A§“$Ã¨
:dä±z +aƒ(ß~êdÁD[«ƒi¦�F XVX Š«DX¹F¬'¼:Cqs�½Êêæ¥jÓŽp�q‰·2šÉE5!K(¾¾¨‘KåWkÌ™ÄgãØ·(œ’àòhŸ£ÐP+ü¹ÂRª£º^Qð±èÃø-OË»÷hÊ@í»&Ølêo¾%<x“Þj/Þ…ü’G6R-V|lÍÃhtêÏiL¥`­±ÞxlhY9ÓÉU~“SÓã¨†Óµ(—`*ˆJ¿|Ëu¬Ÿç(î¯æxn\Tš"K�ÌL?ügKl/jþâçòPÚ[ Úû&�crªn©læŽ*³oEÅ…›ìuªÌ¬Û�ádU¦�¸FþW5ª\ð1ÃvœìC@ï×4P¥b¾|ÏM˜Üeû^IÅ]%›S!W�}‡`ìÕ*¦_àøâ·Uè<ýúÀ(ûcnu/ÐXxh wµÀå
œÐØ)ƒ´kƒ0Tñ$×»Z3
^ú^v‘§Ïé1e¸F¾¤g'P‰ñ”¦JARé#FšÍ,+Eµñ Y¬@Ô'Ðå÷C§Kº_}B}â~:@Å�Ý�.‡ Ùg2ÅèKƒ.‡LìKZyŸÂ,€‘ß�Ÿ¯6:&5 FsÑ¬n–‚Ö-Èš\%ÇìœÛ¹IÜdn
·˜[É¸ù”@±iœ„5¬]–i¨ô‹vó$”¸t¥¯W3ÓL\‰	C^\L�>}Õ‹6ß,öíè˜Ú+ð¹7ºñ€ä
¤g¬í2ô.¸ã®;ôºÖÎH\Ò°f—�,-JÇ’àæEw\õôB¡wjÇŽ>ñfMø.œ‡.klòDjî.XvÜ}÷ŽÔÚmW\:5Ö”j‚¿ØÔK¯Ø¶Vˆ3ÙBµ®ø©ìÂSóÞ$l»»&âijDëYdIOí~q³ð!ä¦rW­¥ )\Ë3²H±Ã.iT2üR
Ë”Dƒˆ'ÍišøÚ>-Ú (*�Q‹‡¹„üoøc�µ$`”¥¶˜µÊgª#Aÿ‰ê†˜ÿ ¿0ÅÂ‹Öôûß¨n›Šìºèàâ7.>±xùò¥;w,ycÉ?ÊÆ ô ©3ùª¬±6I6‚»1æÿqµï€ÿ	þêþ($ª®�¨ðö‡‹,¾èÇ‹wÜ´tùr(y´·hã2Çl{s\pÔ@5©H?ˆ¥]ÃJµHÊ½ýÔé<l—÷nÅhÂÉ'ê˜1°þPÃmÏ£ÜSoÃºç7i¿õ$šðÂ½Ý‡Ö÷õÔþè�ëaÍ™™~}�Z}gP—Ñ$û‹’6Mô¢hÊ²»„¿·M_:·~zú{¶dZKñeÕ÷Ôñ¿ª:sË/ÞµëbR…î+Ê¤m™¦.F_¬‹ ûÔ-mÛAEÙL‰›Ç­âÖs;¸;¸ý\Ùæ¿€‘íq9·—:ÃÙL0—ÉhÖ³oÈ°ëh†mS!áâ¤Sæbš™áfäD"Nº™É (‹ú¨µ(„YqGäŠ"—ÄŒùƒ;Ck%ãmD§ýD¨Í™mvKaÞ5:pâ5‹÷<p×ÒFiÍ¢=OÓ›wî4ë§->°gÑIhhºhï{¯‘ ¥îüe‹ÝfÎÕ
ÄzUs|áª+æDµWóÂxstÎ«´²-ó}Ä" žô‹<;æ p>ï#¹Â?¾„�X;$}êuÎpÈ–”ow/�&µÎ½'µdÞ’›úïM-©3ëgÏÖ›ë–¤îíïØ�¿$yïÜÖIˆïE»uRÖ
;÷5îIt„é£Ð‘ØÓf<Øn;u->b´ý{ g³êÂ-:Ìó6Þ§æ³èð>Âk÷0Ú¹QÇÕs.A¿,1ê¦xB–´U\ötBBA=
Êô)~¢3™.{ÄÁÒ�Paˆ~ÑOBP»Ó:sêÏQS�=¿‹:Uf™ s1òKÍÉ—M
 @ñÛ�ÊP¿û¹úsüyõçêgQ'Õ)¢_­@\l`ø|Nó1ž6f�p³p3³í,YÕÐ,wô‹Zˆ1›’~×˜ôÂÍOn»óŠá¿oyë©'¯Ç—ºlfCáéùW®?ÐOt=‹²Kz
ßôÕ×(UèQC·ÍdP¯ì¹nÑò.<ýŠ‡·=yÑ]ÿøSÿ¶¥ð´Ádë2àKçZuÿðß{–dõàé^¥&P­^	qÝôh×òE×AakFÉöQíéÚ7>˜<û~Ìˆ^¿=Qby�ÕA«sç¡Xý Gr9§Aý£¡ÕªÝÈå`¸	·š«ÐÎ•¿MÊ†ßë�±�å,“¨Êà,)öŸæ4K˜«¸Ý‘‡Y¬À¾ZªþÉ?0J÷d\;|•×ëüÀhµí~ŽÝkiöŽ?µeïÑvþÎå®°Þý‡ñœìŒÏKÔƒv¿å2£)i°9J·†cjçÎ~¶Uivo¨ý	VÞ´�Ê�Xé~ƒeC÷k†Ë†”ÉïÆ† KÓÚ°Z™néß¹ZXñý°koän†í€­‚Œ¶:¤h7Î¤êÅû�œG²+È˜®Ú}I´›]Sfn"u¶!ò`*‘¤Ø¦(E3	ûá–M×÷Nž4¹¦éjŸnRX¶M±­Gs/Mtbõ�ØÒÛÛRSÕºÈ{iûì+¦-šŽv	ÖÆÁaÑJýÒ„u�3ïZ/¼WS9ZK¬ê]>±ÆŸÕµ¦68N^~½iÎ>v$–$›&xªªÛ;“ÏŒ/nÎTuªßÒÆÌâ�É—_Þp¤Ád�ôïR7ª·”#ÆŒëÈ]Š•KqkÙ^:J¸1¢)Ç¤5£°Ú$¨2;ØÊ—$X´–[º�ÓZ(ÞœÊhÒJž¢­7*ý%2Eå�™#úŽßÓzÇgßÖ{­ÁhLK,ñÔò�×M›ÚÛûóéëÚ#ï¡Ç¤OkdÖ‚ÙnºnáþÉV¥¯´ÖZ…ÐÄ¦îŽÙÙ¾¹[ÖãÜÈ·÷²¡‰kV¼˜Û%›ÂÊ‚›:Õ@S>Ô¶²£}ùì©S»�Í~ï.šºvm[k¨¹ÕáòÄl&�Å¼±µV‰LÀõsÝäHØå®öuvM[2»¦‚/z9Õ¶—•Í.ëS<#y\¢6 n—G®è­ÖãfmÈ¬@ËãÎxÊƒEÓ»e÷ÈÈiwX°áD•±v[#:b®îLî©_ºhkm[-Â�ÙNÙŒ�EœêZ~ñºemM­ö°Ý%Y�æ–ë›®°à%¯÷ï Zbt¶h%:‹è²ú”9}6xnÛöÎ.·Í^%,uXF>£.1^Žx‰ �oÉêõU–ÌQñõO7Ïë¶øÁ°¿­}öãó×\Ú1ÕB˜,53VÌ’×„Œ¢Õ'ÅŒ²zçw6õ7OiŸ6·ôõo_ðšûrUøÔí¥¹qpœ¡,Ã1ö›÷qOi#*ûnã;6ÿÓþ±õ�ýF(ýNyÅ'ê+Ü£cTîÜqŸ<e¥›’»LA "qe›†èÞ²SqËx¡LPQšWù…QºWŸy¬h�Bfú’MÔÂ¾(Ìä½[ÊvL#žÿËÛ› ¶Qœ}ã;³—Î•´«Ë’-ë°$ÇglY’o+±s8qçNÈer:�›@B‚¡�p… á&æ*Ð�B¹y	­Ú¥Üá…RZhMKy-GÛ—±µùÏÌ®!¼ïÿû>ˆµ³»³»3³³3Ï3Ïóü~x¤hà4[æ‡ ¸Aþ=,Ožcâ‹¢Èrx{ò••+=ô.zþùæfôGÿA=’¾SMÐÏ’kß‰ákÑ¥1|­øâuä¤g¥<D®k~>½\==j‚¬=$²ò¿™rR3ò,ì«xÙ°‹U`BÅ!‚ü"LQü� ÓJc@(�É{Ë¯‚ä�Fí/µ¬âÚº4’à3„i¬”bM6A‡>AÒ Å0ZÉø¢Ôæî¹¤É(± 	‹èzcúÇd—IQ&‡ ¥À¾ø Z+8LÓT³W»ýè&®” �“a¦Q<aÕ‡�"Çÿ*F•S)1‡^T�}uÐœã5`ë‡-q'6nh’´•Ö¾–Ú»ãO×¬òâ%åÝ3<h€œ%râÁ›Ü¿¡eš 	:bµ­
VY˜×åzèl²Në]6Åÿ“pÃþ/oyiOcÏî´÷Þé5xùñœÃÚrÖMïÝ{é�>_ØØ¾¸¸vâ–ù�5òòÉ–€‹>9¡X�ruëÊ“û3µr0µrdðýÎÊeð¦”øátù|‡¶Â¶¾ù‰¿LÞõd_ï»Ï*Ÿ5Ãhct,g©}ãþï¿¼¯WÎ­i™ï\é´<•c¼s‘ÿáp=ÿiÞv6ôìºlâÚÛ½¬N¨°8¤ÖE‡ß¹û’þ¾°Ù¿}aqÍ„Ís§ÖÈ+WßšDÎÙ¶ÜD^ÃØ‰>[DPájq\j3t‚‘h Šd[Ä)¡Ò7ròá÷h÷øù±UW]µjiKï97öôß÷
X|î¹ç¡ÿ€˜/ÃÂ®Ð>g],pÍK×4­Y�W_ÞÚ�³�/&Ýâùï-Å.S±€­0�Ûëà‰+·•ô0:î‹úìAÃÑH4bcïø±üÓ7o”¿|~Û¶ç�ùFàyíWÛÞubçÎ»æ^yV{1‡ôªÇôªo�8ñÜø¦üìS8#(æç·¥~¶ù¢w†Þ¹¨jÒ¢™�¡¶6œçÄ‰ì"Æh0P…TÑ	u)ïˆá £$êù«`]+¬E:…Eù‚qØŽÍW7jDÇÑóÉ-7Ì(3âuÅ²{ï™Q¦l`YßáÁ$þî˜äáOC®oÉŠ�…“= µ¿;h•>¾êàE3g^tPÙÈe�ÂÈä—Näø‚B*Ö ƒôÊ˜‰’!x¨%É	ŒÖ™�Y}IK %Õep�ÚHÑ	åZR�Ì�ÆHâ+!)ùÊµ	*	1B€1Ë¬«B`Í>÷ &‘)Ã§œ„	&¯Ì
� À)³ò,~“)|H}îðØš"ŠŠøˆodóAŽž[ûaO:)±ç¦“°G¡ÎÎÎwLr°ß(y™žÁ¤Ä¼–ÏC‚ûgŠQ°çÜ#[UÑNÃÛ84¢Ù~—×c´!yzÜßÝ°©×Ò”ZÆ3¼;zässñÄ.ŒF’ûîíÆá�M�Ø¾ƒ1FñSI`A	±âª4QÊByEè»¼aÊù "çOiø˜ÚP¾²S¾b©nByKÌ�¦çXKùÝùGþÖóæÎ`SVÐ�C/|WMèß«ÊªkjªËvý!Ì:‘|uQ‰(–Uó‰Ïœe×·Íì]NÞù#h<;‡Äý•«øvÅU{’}…¢Þfñ‰æjà³Hˆ%X&?	V€uóàœÕë~¸š¹V~jö‚¶ù6½üûA'´–MY×vôMúÚ!ýGPÛ¹reç´³Ïú ý×ï˜ñDÒï‚kÁ—ãÇôŽ¯/þsæ½)ãk™q8vI8„Ãÿ#xÕûô�¹ƒãG,óc€?©æ;_—?ºý!ùåsy Ù¯3™ùÎ·wô>w`öìÏõ®||òþ¼•ù½€týí ðuºP~Iþèõ�×íÓhh¡nE/Êþ&ºjÊÄy+÷—¬Ù¸óuTÆÒS6îoìo±O›oh-Nõp8Þ—U�µ2$šu¨]¨ŠÃÈ¬ºv$0$´„cìÛìß‚ïî�¡òSÔ¡T€6ÆÌhèBÚ­w‰.ci¡Ü[¨ÕÚõÚÒ™-:g…‚ –Ž•Ü<FÖ=€*Ç«T‚Ñà9Á À–±r€ž%@+‡2™u!t�Þ®Õ’•2#º•Þ�nªA7·Aôô¬ÑYQ©ÆÈºçUŽêÎax(þÄ˜½[6¦çb«³Âœ«8Š�ø{`.á’92qÀÌ+vK†ù$	2Ð+›¯×pîÚ*~Mór³µûÖVs\IÎ¤_!¨æ»òj)pòéjŒfÎ]_^È™éP¥G>ö¸*·KÞËÎhžq ´{FóAÉñ
ÙlWò¥äÁ?} ¸'ñM®ùR~<3.(˜[v<ÿQHPC²†¤çc
}IÌbr`\~`8‰î’{å;N\»w¡ÛYuó®ò†I-¯‚U'N€Ùy]¬É9
¤ëKp;ø+¸�I^ù÷ý›^™VÛ³dvÛ9!Nsåß�ø÷_å€»l–1p»~ÂG�æÖ pìF#µ:¿Ù:Ô…ð[øðÝø	Hü£Ë¯Ëÿ¾£¯çì€¿°":sú-@wÇé;1nÂñ3 +°�ßUá&ÙûèÚ97××Ï³JÅ:¡÷ÑWýëþ¿Ÿjað›3£,ìºàÀ)Š¾�a>Å« â«'Tgx4JÐAð²]Ô§?21:‹…yAîc4¢QdÍ8Í`ªäb�‚«4ŒD¿luî*€l¡™.]ô&'Ý ˆ�N®Y	ó¹?æ_EJ’OG’#�yŒn¹	^Áó±ùTAžª/UB
{dŠ¬ÈŽ¹×U•}xXÚ1r_i}~8b*•É=Æ^]W*s->šêªKÕçd“ÒfgQ‹U¹(ãðŽ‘s,±Ze•«M\Æ„½ÉÀˆ]2™)¸1
ÏØ$l!?OnG'o~óæP]hæê™¾VÚ'õ†šE�”ó6FoõŒ�/ßqÅ²+ZÈî�‹jz£*©S`þO¯Æ�û| M•U”aßßçÓÇ{o¾¹‹0µ3gÖÂ}È(éªª¦5ëJ8‹…+Ñ5OËOWUé$#Ÿ–+º¯ÿóßZ	áJ,”2Y»ŠiÄn¬�°>Å–âµXâËÆp·'E!«÷4’lñº»œÄìŒi²š	S¨(—ß�TÎØR_Ê ”Í„ç‚$^ÊýÀ›ÅŠMŸ‹òÏO“wÞ¯,ÓcÓŠÑ„æƒž¬\I¸`ÌT)µ”Ø&IX¹ª3¡æW£¬
Sv$FôÝ¸{¸e¡1°fH¶È›Ëüawò(Q �\Ò9u¸\µ«¦÷OÚxù�Ë7NêÐ�Ó%�“hÛ‘\WÙÔÌTTÛª¬ÝË»­UmÆÊ‚‚j¦¹©rÝâëžúéS×-¦ÉÊkU-º›·«nêE³*+g]4uÍ,}…þ–ë®»mf­¹msM×ÖÚÂXÐíÖ9œUµuuµUNGQ>+¬ÝÚU³ù¶UG7O˜°ù(ÿìY‰A!ËÔ9Û�Â#IÜ%Ìy¸”¡\ ºgf<Ù/ùçZ-HªÈL†HP&Oö”ßEô Z :”3.&0B¤}°H²´œ…„Ì`n¢(‰.ÏY€2¶,LÈ~‡]™¥Da€Üx “Qö`2Ê:˜±6_u>¶6ßè¦)+ú�Û{?ìDÐCì<ý„³Uk…ámbƒÞû~Üc|Tüø`ëá¾®Öâ£Ë&ŽË
>EÖ7¢"Bœ¶Œø1¨îÒåö;ÊØ/àš üƒ Ê¤�A�$všBfú»ÿµˆêÉYtØ¬¯G_))P@	p¦7Ž: þz3hfa2Û…ë°¦‡É:v(¦^&¤¸mèƒ�½öÆÉ›ú7Mi(Ø&ï+è;ì­ï®÷võv‘í¤& �¦£·1¨—SªÇïˆ	{÷…\Ø±çðÖ%¦ºŽW¬«[º7mênYm}¥µ¸··¸5q¸oqQþ¸ËŠc¼ŒÜ^Ç¿nBq]™dZ²õðú·ªCG6¶\i‹9I/ŽÔ‹•ñ–`Â•b”˜}È�Þ¥7¦øâ“5!åíápa›r†HµÙ°…)
|ô½ï‡\œÎÒÀnï¾âã@s¼Ø‡Ó�f‹Žs…Þ¿j˜‚Z‡Vœ­+mòö#~xdŸõ·	¤†§Iq¢|Y½;$¢�Äü`kÝG^i[ÙŠšFåúTìªX›*¾QléN‘¬+”Š¡ÉxDÉýÕ‘é¢’Š¤ö-M ƒLƒÆí[J£ô ’·Ï§�¡ÔÒ},µµi.F,2"BìûG…Ñ‰ïö½¿Ù0¡Êö~ò¦Ie�Oéô¨Ã–�à[å’›º‰îo¿ä©Ã}ƒTßa>ñá‘Ä¾¥í/Â¡Ç÷o’“éz>£E}Ê‹Û`v®z%5Q‘øl„©Ò¥H—±+Ø+ÃÓl6gž´“SðÃ”|ÅB‘ãh˜8¾»Ú±©t}C_á�€Ö£*ð°=Ä¯dú[Â™ÑèM{÷Wì¾JüŠ„fw.a4°�4²óæDêoÉä*ùØVÀ‘VAö8ösP-ïÉÒžÂ}à�Aþ•¬"îÎ@Î"È¤ò�Š³¯°§t0‰ïÂ+|‡|E‘4NŠ…Å�“Ý“1	ý9ëÞ)*—ÆßYüúÑ¶¤‡©ŸQoP¤¾@”	ƒJÐ2š·::bŸ±?2ÿHÞê‘çÏ´ÿÿúú3åY_ŒnÉx[ŽÂbÂ¼ÒY1-‡×MåÒ§òÒôiŽŸ.ý#?<ÍñáeÆø©¸n‹ÊgÈÖô_£+žw,ý¯1Ž•ú?•Që`îçäõtt@àòÜ�ñ
äw|3OQ¿§¾úÿ•üoziÖ/#¯¿€ß@ :ÜÛ¨Dl£ñí#¾¬ó¥wßÞw
kÂhÄi¥’SyåIª÷ËôM�@£$æÁIüë£gèQC×3I/°½ƒIÒ¯è”RÐžž¬c•’®Ì}>€\!„�Ð‘Èò˜cÛk3FÊ·¾×Œ8'‘×—e�d($lÙ·YS  †hCÄ:Sl³Ùi˜,»É¯€ä�‚æ—<d)rà$­S·‚�ŸIb®ÊTÆ^K¾—ô¢”põ+Vu	i¸�ÿ¥A—>Föiï¨ûà$¬ÂæŸŒåûtö»ènÄ_=”Á–PpëÃTú;•(Ê3Vý{I…D{£ŠiEZLé‡I¦úsÒ¢ýc×æóï"3ø[*8#àŠ^NG#– c«`4�cCf4q £Ñ&¨øú‚ˆƒEÚ:Ÿò‡rÿ@Bþý$Üü=ý‰DªÇëM¦RI¯·'…÷‰04	 'yP^ô?RÃ­ôxS^�3éÔ í è÷j±"˜ðŽ×ý!¡úŸp¨ësm¾hœ´g8î‹û�˜„ñ¶§G41$“G>LxÁ€—Ny8Þâ�.'R©Ô‡G@"‘L¦¼CÃ8S1óIŽ.u„ß£BðGá ?>™ÊñÖÂsj¾í6¥Ø®0FÆ†…{Ðÿ1Â7qD¹¾—ëXå’SJÙRÊ³”R%F–L!sM(¥~l^0ˆäìô¿˜’âÆa�v$.¯ÌXáV]­Î¥“«t:ðJÔêtò°óð1’"GÐ�’e‡¼C7öaR.#*×fÊEå|[rœºÌXá\üpå¾ûÑÈMÁ[¨\c†3”²’½ý`¿Zâ*ÝØ‡q¹fPW3fî°öÎ!Žu�‰œ©ÖÃ6ª¨øùàü1SJ¹Ž¡rmÍo¯âXQ¹N[Ý1Ãc£_.Ê�6Æa<¡þ·’÷ˆK¥#é–QGRsë7ôgc7ßPß€s³÷üÞ�àto›Üs02z®rÏÿÁçžî�à{V¢{nÍ•ó{6>]yšæTíÐŠÜX­à¥æ£ô(¶|«'«‘×µ‚hÞ‚—¿%"— ¶ýô€×«�¤{½i‘Äá`./MdŠ!œ•ž�]Ð‚³[Œxš»C9w´<‰XÇcÛpKC äaÏá²bP•#lm­ÐŸur›8Ø/òøÁ^íW`›úéMfs¿Ù(=TA¿¥{rÜÒÐ\²XÝƒf©¬?8£È:4³gåœà˜­–¿d à<üPm#­4Vo-Y@PV”‡p	è×†9ê1JÈº‰CñF?ÝÓ!i‚&0’Â ¼I ‘¨SHª£HÑo
7A?ßU'SÊêC]×
7‰4�²ÞOÏðz½C$ƒóç=*E©Lµ­@1NfYžoÈ’Ò:4Š––éÏ#­}n,¬uN÷öŸ\}ZaÈgiÈòé~ÆÎ@S›ºåd÷&lâ'³Y¢ïp}é@÷&:yš0�oê†)ì@¦¾Ã}HøU²�qœ³ÜÌSs�¬Gæé|š¢ïÎ@S£
¶©$q¹Os‚I¥#KH‰OsYƒdùY/ÔR‚Š†¿¿&5Ö@ÁÑ©ÍFf¢¬Êòk.Þ`ìŠ×¦Gëº¦÷ÁÅ¸~%Ù0iBÐ7}¨yù¾åË÷1_ª¦wÐlï¾¥˜õqé¾_öMÇåÿR¤uÅ�ž¾ßpútúøÒåé{”“JH‚¼E¹2#Çfû,•�tÁ�D%Q}ó:ã0þZ`¥1¤‚
bŠýÁÙòáþW6KÄ+¡ÑñbÚdàf“…e­+7ßrÛJLZ+SÖ!Ñ}wôÿPþ3ïwi-V“6ÀuÄ×ôoŸ+6à˜]’ÿ`WùÜd±d)òÝÕP‹ðL  ¨#,{yi‡‚*å+þ‘Ó•Ñ’•˜€¿Š	g,cÊº9^V'‹¿0YÐ2¯¥ ÿÀ[²Égœ?îÖ)M¹¹üü‰•‡~0ç�9?8´21ÐºüúŸ^:3yÿ�+ú|­W¸#çÜ»áú»oØ·þÞ÷ ·{^GÇ¼á?]ð€M¯·=pÁ¢K§W
BåôK�æ�‹fljh9i\ëê	»ÞüìÈœEÛÖÎšðÎ™¹vÛÂÙýÃ¿+~ê¸‡¿šï}¶$¤Š§9ó3&�E 4 É¹DRþu$£’Âc¹�Å<–a!ê;ÔÂ´Ä‚¾èÈ‚!Å•Í1/å—‹XÌvî«è`ªt‰Kþ�e¥K@H¼’¦2Ø…¸Ð€ª8È6TÉï•jLeË�4»Tì,»	.”Ë7:Í�Šb°Áþx®*GAStÒ=­�ò�ÑI¹Ê,í¯©"ó›ÇG^H•Pu„eˆ˜PCn„àA·	êG™« W€fD#¿˜OR~^ðeùå Æé*¨Ö\þÀåšñµNY§øÒLW|i¦¯=ú™<ôÙÑµh˜ÏŽ~<’hýµo¸áBtt›îU«º]Ns5x£O¹š|ú2¾lmî6h¸ñÝŽ]7;�ñSìýØã.ÿƒºiœµãÕZU¸œ\W9þ?«[¤ Úœ©–ÝUjÿ·uÓßýrlåÏø!â.öý«”¹ÒDß„I—úŸÕD1
‚'þG…Wå<´Qf™öï·BÂŒðï*1S8À)¾Z:!
)QH
¢ñ�IÂ„Zu#¿ývêÐû‡RoËoƒŠ·éäÛ 5êœ\Gª£zxœòdT€ f17e×EðXŒý¨ñ\9—ZAm vP—’•×{¨ÇˆÕ	¨ñ¼t8/�ò ÷†Ò¨ÁÓç9ãñÓ¥Ùü´%›Žâ}‰°“�´	˜{Ìè_Ò<`FÿÔ=†2!�‘î1§³çÉŒ½›ÙÊ”ºŸÛ¢ÛnÂ|‹¦ÕéÑo	v&FÐ›HŽ/ó~Ó_Ž:$�±£n€²QÿÉý$ŸÇŸ%ñ~�‘:¡®ÕÙ©2j–Ö2¾A¼…ð„l 0Âl¨Z3ÑqØÑ”É¢GÄ‰Ûk&bîÉ÷Ïi[ýÀòcu<~öªx¼°¢á‚ÁsEÄÞU@}‹MtüïnZ4¹01ySãZù«&Ñlö^}oç¦_l
Ev·k‹‹‹Áß`ïoMüâôƒ›MÁ·`§7-ƒ±¿ýÓÒˆ�ÚÛÓlXd™mÁç)\Ô¨ÕHAøqÀj+o	µÆ¥MÖ,ZqìO¦î,êÁeT-5™Ú‚¿CŽ·Å$ò‹Òá(*µ¨9l¤Rª:‰êj³ÿÿj:ñÄ+¯=öÐÛïÒŸüíF«ÄÖk¥*WE ÂîpIkŸØ YËj.8öàþJßƒý¯Ú
:Sæ5Ïô€G^ÐœÿÜF¹þém•œ–.äœ¼Äé†þCcTË·@þ¹%šçËÀçÿ»†ÄkKH.!ë%
çˆõ»udü)ìkAAÇTŠÂ1„ÒxÔ7ö*Š\™y‡ûpå©ëù¹Ìgäù*Çèðå5»U‹ftL’†é1„õ˜Å„ëÇZmÓÁIò•ŒÃÐj42`»’€W�Y�ýc¯D1¾“_¡‹-ŒÃÈê•DºwìÊå|ãŸ¥lSØ2ð4¸B·’ Öa"
ÅORÄîz#2ÙÐ�(Klq»h\XÞ*IœÑ_-ä4VŽ.€å7&Þ¹kxpÛñÁ‹“1ºŠ*{cGðIò	0£ñ¦Ý»ë q�ƒ÷M™e‘O>YøócŠ¬
Oãö°”Ž*Eu¨DmO[,Ö‰à·	çf<ŠaÂ#$�K¬0w ß>Ñs¤	´6ÀWò�X»Ãâ�Ûä6´±³ä¼b%ø÷‡Ö¢BÛ‡àß•"l?Y§k‡ZŠ «&‚¨|§lðÿ»!èÃ\IÞ8�©’ÆÉ�|œÊ`ï&‰�1•Õ÷ù1àP°/ØÓIK)«³»Ó){@'ZYÊhv‹&ž¹g�
@6`‡	wE©&yI—ÁÚÄ²9D£I=Að×ŸbÌšù|ª/…¢èæH¨ã¨÷áu<âôR	ç¦“èï“Ì˜*†ú‡Y.è¹ÿFýE«ýšvPÖß¡¿ž<ëÝ“gáøZ«E¹ÿ=tL¤Tþ"&Ç£2=·Ž"ŽðÇ¾G
GL `DÝ‹gÆ9û�XÌFÕ ûMeþÁ§Éææº
8Ð~ErnEÒFë*ÔMlu|BWYØBv�äæi²™J~{êÈ^*/m�ä*X\‡wtˆ®Ë¥e“«ØR,kž¥T°î“$–Óˆ´÷ ’t—R½Ô6j¯Ê¬®<Ú­Å'–ø¸„òäE6£ÆàZhPÀÎÿq; ŸËq >DœÛÔ@&ï ïÖì°‡‚§NQz§^«~yý
ÓÒ@^,,ùQ›í`qÏq__X(.l {^ú¦/ä/T8 ¢cò#*b˜iƒ×äÝ&ýOåÖà¦aÚSé	€l"yá¸$ÿ&Ì²Dùs7PÀu€ô…=j\.QÜ‘?ÿÒ†Š´à|r�üÛz…4ŠÊ»å}Ã†Çƒô‘‘uÍfÅ¯s˜å�fBþQâè®ÂB“¹ÄEv^M9‘4ã$? ¹8<¥"<.ŽöL¶½3›j—µL(L5Šã½FVÓÆwß½wpf.pÂ©±åMÍn»c^�¥8(UÎ½>àn¬.KœeÖìÖyŒ@×Ú{SF×†ø{ö`­|ä…¦73‘Ùð7K�œÝ’ÊpÈ•Hd¨°Q"©pÑ(@dYØ�TcéTˆYKKJà+¤V¢O–wdÄC$ZÑ§ÃtH�áÎ¿½§„ñn‚ ¶Ì�w ŸÄ?—&iˆ†G,Š•Ùè›™†ëÀÑý„âÐ|ÑˆD¢>y‰µAŸ-@KÀæ#îÄLæ…©‰Ò—|sÄ©¡i@3@gºM–“/<³X¯„6t�Ö\Àî§_…Ÿ¦eš©›yÖÌº¦q‘*Á¾Þœ»þ¼+j¦/êŠÓ½ÿþ¡2­�æµÐê<y? ó1!­Ak(ûèù+ù·ðþ×Ý…b¢¯½­ªÕª	ëÝKƒEv¬ª_ÞÔXÞìëVæ!û�Ñ{QÝ:¿_ÝØÓ×�þþuû{Zfèáuë>ç¼+&­Z=�9sÕÞ{Ý]	F×lâúöÆŽp7©@º×Å¬‚7G±»/Ã�"ó^9M‚î4%?Â}eÒ%C�i*ÔfFi¥i”&8{LÔ?½pˆªçG[m•õ¾÷ÉXÚ«`dôlŒ'kóó˜&­ËÅcb5n øÃþ¨cd`A0g–	-¦Š±áæÇX
RÏ×YÙ<ÏìzÿÅ½U-óãçÌžw¾'è©
v¯8¬j� BX¤¯èV¡ãçÏï>åš×’øk5`YàTTÚjºËç,OÎÆ§.
ßf‘Ø¡‹6;*;ÇÍZ¼dNywMƒ½²"à„„ 0ÔˆKÕ’4D=#ž¦ÊeL’pÙEÈ÷Hñ6_†-�8 ‡(üu’•wÊ«¦ñ”à%S‚×Î$å÷Þ#0„êz Þ“ßÃËd%NQÇåoŽcÿ[:‘ü@~Æ¹Oq®ÜçS>P†¿‘ ä¬•©}Ç�ïƒø{×"¹f+ñwmÇ3;ºa¶8Z xÑó¨Ñó
9ªa>óÀn˜Öàf½|Óñ}ñXÏÙç<CÊ;ª>»Ï“Ñ¸?G§cÞ"[ygúúãûÖÞg­Y·Q©@zä›’ûŽK=µ"®aU5vÈ:t¥ßoÑpÏÏúI+<I~ÅÏ}�’Å*°„ð2‹EÎ$äÄŽåKµ¯Ú¿mOÔl(4˜£{¶í_Õ®8¼ÀL^Û6íiú‘4µàÁK/šÓéÂŒm®Î9]úàe`Tå%*‹À¶ ‡ÏâŽð~½?"bHô²)Ô¢hr9‰>¿œã'�çŠ	/N¶Åäò‰˜AOÙ #HzK/Ñ ò]^zæ 1Q±8’ˆ0ç)¿]¤Ýh"ó ¹¯+ç_TaƒU8Ôi¸cm<Š‘ÔÏÇ¥e¤}èd�ÀÅ@Å³œþ¡Ac`h9¡NQ¯S&¿Ý«¼M›¦´XK©Ùè°X©~Âúú‚åû– JÐƒÍ «Xå�÷È)³–=PÔ¯u<²uˆLU´·ïAÏÆê¦i>M€7Ô:uÞé&‰e¸V¾b½{ ¯Åu+9åå»de®nÀŠ¥W³ð¤jdS¸üñX	6>õA8oztö+ä$¯5èFv¾ü_òßiNÐ&,†�ìêé>æV°2ŠÄ
’ßÊ7>ÖÝ#_fÖ0ZüÒ¬ `>Ð&$+H
Ðºeö³×Hÿ!î„¢o Ú‡¹’ÊñÖ‡þhÁ·æNÜ+?ú¨±Ð]ÿà«ò£¯ÊÂ¿·0Ck~ÒÔ\Ó,�¨÷ú†¦ÐÏà?0evgçÏ†ûÁà‡
ÆcuHÃÊ`Õs$%ßÔC_½V’ä×@D’Öb�®Q’À‹RüÁˆUÍ«ñYAùê$|E£’¾{Z|uåùèÑa�Þ¡UÁßóŸ_C�Sn‡n"òk¤ ôä‘ÏÇ¥ÂESŠùÊ‡¯8ÓóA<–‰vQ ðµ#žÏ\�W)WI0²€Ò#F`Œw�i~m¦!F¾ƒÊQõR^ÂÈ¥åÏH#Œ|apÇm� ±#ÒÃâ¨gaHš€ÄF¢AÉ>š2}æ¡«ªájûÏ¶ƒ>¬«M_d’ëÙd2ýÓô/è£§?ý(½Jþt5X½O€wN®¼ûnÒ§Ü«r>-”|<‹î+ùâ> ±Êÿz?=y
W~>îœÚÈ<œŠ†·Wä¯€¬¾þ®»À\0îgj[™y…³c~Þ·ªŒCÕ€C­…CëŽ<µ9OµE2VnK+ˆgÀjé”2*­µjƒ~Ùy³\'oÞ±L+0+1{ì�iuûW7*ÂvãäÃožÜ¨ìÜøUûj“Fc=‚È|LÆ¦¡~¹ß®�Úe×ÞÿµË´P9i•Ì«—ì¶ÂË‰ô~�ûdì9y»ÿr }¡u÷’ÕfÉ**ß?‘£8¶°?'a"U‘[/ãÍ‘zyUÉ@¥ûÊ™Äp‚ðy=ƒKŽŸ.§†Û³ŸH+9¤Û�—3Û½”™RÿNgQ l�]�}g+D¥dùÿ¡3Eà§
díÙ õC|=œ—½´"½çŒ–²ž‚D÷$�ÁÓ¥1Žô�åK�¬/%í”Â c§io&5æOÖçäp½F•Ãr†ýürŒõre ¿+™Ï9ÍSn*Š­®YßL´IìD„#Ù#«@	fq ÇíŒ¨œÍÐ—að#£üÌ'‚Õb¼õ}=�I£\Ì®ýÉ'ò‡·
Z�h|,=Á“:=(Î÷ŒT"úýŸ€)F`EçE ÿV£Åj¼ò“µ,ÐéÈQþ„|ï«FQ§¥_é/™³áaœ“|2”r¢KŒbIx»Xû¼^³Ùb…œŸ¾Iœ&‚„$JÁt2(i´è]ÆNE¹WØ—‰,‡Þ¥–ÍÍx�V–„c¨mùpF&+a»)
ÍéçåçÁzØ‡dÌ=’>ŒÆí>1F_9´=¸!¸§~Sýî`�¾íìÆ;{‚L³ü|c­â«êpn|U¾^;´-ˆ.êß„òmÒ‚è"´³;¸aX»(ºÿÈ�å1|Y‡Yz”_-ñ^U–†{«æø÷òúö°†3øuáÊ!²æC+Hn9‡®d>ï)È®×Ëµ„UÉIïÍ§@Eã$*}’½˜*Ä~Öå VŽ½Á9ú_ú¤XšÂAW6�ÆÐ¯5ƒDªT´¸@BlE¯ÜMßÄ+¦¢Õ”ÒÃd0X’v»œô’¹ÉÁèîmRfýFu%ÄT‚‘c^ìþ•*-qË)tS9å² GÊ)AßoÔjYJ†îšæ•Ñ}A²8„I}J°JÃe�’<Y „s²À¨Ïð\«Îî•ÿ©ŠX&Z›ÿ?ƒkUY åQ2ß*Ñ?ÈŸ¹qŸC#»M}§;¥xÒ~ZÚT2#Óh¹n®«ïo	ù‹Q°€€E„^y =@'—Þ\Ø]¸öce}èæºžzðF|‰`Ä—¤ÐÐ·)Àž¥èŠ›—öœî»/Àþµªß%Ïgƒâ@Y@ÓkÛKàáÓŸ*íE·ÁÑí{ R"ÂãŠp>Òr(ŸÄZ`Y~IråâXimfÐ)~�U–(â±0Ä$ÆÊÞ(„²Ï@z)ýžpéŽ_\zv½Ow¿^à9;]ÑWõÀU¥ƒ††5×c(?	z°¹¤?Ü¶¢gçšæ'þh µN°rG]u™……©a�•ÿ!z³"å!ö`4yÕópäÀA72E{ó\G9 ‚T2	f¥ÿtŠBùÄIQÉWŒ˜’sxnñªRÅëP>Ô#GŠ‘­Ä\(:ä”4Q’SÑR
“¥7«~žFìó9üÍÑËÅrÂí©â@ íæ:büQ&e¸P‰3—ÉRšN–ZDš%&J áØ~ú2�{�@1H¹Ýr¢XþÝ÷/ñSVì¿18c™øþåY¿Ï·…ŽèÜwå5¥·múï4‰ÉôëÃyŽ± ó/T¦4"9ìœ	|ÀO…³"u(žMÆ(ÂÖ�„nb.e1ˆ"„£‚r%‰ž	ÆÓ†��ô›Ú g£ät£ }*ßÝ¶7ÐDH·ãB­lg¬]ª×rt9m72ŒÉZà.ö¼TÞ6ku´“uËNš¯˜�„à„¢^Þ=þ•‹Å’âB›™a�FÃ_Žl˜¦…cY–�€ý@2n6JãEa‹ ¾(z¾ñ6Ïš¡i˜Üd0[\ÁƒÁ´IoÚ¾ŸfÐ… ²<¯êãôj�¶œWíð•}åqøG¨°9ÕaM�\WWrè!Ôä‚(Ï^�kºâëŸ=s©ë´F£Ž-ë©œßjH ÙàNQ¸½ÈkåëpÎÃ¨‹],/Ä?ýÃnM�îb=€Z¶°dy×»¢p©Q’/{B5TÝ)Š~é+žõ¬ˆ‰½Û0ð“c¼Ñ‹×[ép•ê²kM˜¥[­†J%‰¡…è·~uD.7Jwuw°Ó:ÞlÒÂÍ{ƒÁÙ»<ÁîºX¸rfõÄqU–çï�Œ—bÃ†öf‘³fkL‚‘vÄ[–­¸ÀRœ^U­ï‰O
ºÀŠ[>p=Œ[ãamEeÄ‰žu¹B=\åÒ,˜UXëç°™Å€»b\CÓ´qÞô<Ža¢áü¾23'Z™ ­£Å@‘cA‡«"ìH¢ÕQj�°H}g{Ñ;kÍÈààí*Sp˜
g�‡ãY&”‘Ã3¡àåÀîÀÖš½¢ð€ãíÝJ�ÆöK³V~c}lÚw—]žOÖÔîhøÏëpÑhòý}Rm9Š´Á²µ‚xðqë£ò­fQ4€�¯j�¥sD�Ø,/ÃyQ²e®H@‘¨�Ê‹¤u_@òWaJ²ÝM9j1Â2R_%’Fãj$ÓÍl¹gåà’‡P§ 1ŠÀ«l#ÿL£Ñ‰¿�tïJAÝ8þgÛÏ,:­FþÕ»¤Ïýø•-ª
˜&
ëŒÒ|Qè5Jp¢Ùlå…¡…ÎEp¯d,éç$c¯ Î—ŒëQ~Ò(©¼÷ŠÞQOtuÜñ1WJ~É²�1÷édSÊ¨ÆH{ûpTWØ˜~I~|K,yÉxÆD�±[C÷Kôº—.’à.yÏŸ?Ò‘¸•}» æñi(’v
Ðh{êR@²[u1)îsø"á >€” å€¢#Ò¤ÇÐZa’¦³¥Í�‡tæ½ø¤a[;Ogxl«‡³�L lÈï{Á]W&ƒ#3ïž�ŽlôÉïüîwîå�GœüOÜ�¶zì×çaß5xsîbV§3ïw±g�ugóÎ=N~%8wëÚoÖéØ%q–ëü�¡1c>(Gê3ƒ¾J&“i¤JËï tèX2éE½4}³Ó	{Ñ¯ ƒ½DÖVV–Á"“Ñà”o½Nå×`4É¨°~[ŠbþŠÚ1BM%˜CvL|"0¼-õ‡m‹}Fq$Y"¡€;(:jãÑˆ-†�P=4]WÅø	im+‡wÐÔ€vZ9æZñÆíÛŒ|dæ¶‹çÜÚ]v«8Uz©xc­ÆÌéŒ]ßNøn�Szë¬�½-'<SšÕÎÒhC5ªj<Ò”‚’æÚÎò	<ÛäŸXÑ*éä“]…‡¯œrÎäj;sjQ§ÀSp€âŽ{ú~5Ä7��¾£¤¾¤ÀÀAùÇ€ff—¿
|ã‹ø: ù54=hGq•‚‹A°%ÔxIläw°JÌ`Þ”ÌPvÜ,éêK¡7áEêàoAîìÞÒúÁ�âƒÂç‘½o)ún¦â6uø,T~xŒ¶Õ.�¦{ä>{=³Ô.tä¥þ¥± (F¦™ÁŽ‹œ~>WZŒY•öfu3 Œ•Äò§Õi7‡QÎK¨‰ÔT£¦
ðh2
SF}R&¢U±˜è*Ö0…ö‚Á, 	6œ1*a†‚p€�à­‘˜û2Õ€©ð˜ô—:ùç:£A/§ðJ\Šø²`·—ŽôÓ`³A‹IÓâ_/€qùZÎ¤´¶oÞ’¦Wÿ«zºüáä�ïþ˜éý]µ™±¿aÐ“�2KV–@oœì/ûä,hµZÐ[ÿ²8ý¹FÔCwÐ—ôõ<Ø×§ûÛO~½ëp½ƒ¹z³§­7Q3ú;Ûá{ÔûŽaµ“NÛ
Ùjÿi¬ZËC¹ê1�j’¿v þëWqÓ°^Ö@ub¹àw¼âá+#!Î´Æ®2ãÍ_YÀª~’tä$Ù‘Iç)²sŠ";è·g¬ZçA¿ÿóIeºËÔß”«ÿÈZž¾=F­ œaŸVÙ;vkÀþuÖ¹vòf«²e¬¦ [ÎÜ ¤Ï³¯«}¾{‰‘ŸXîOßçƒVí…ãŠ`^B5ê	 À ÉØíó‘°5ÕµvvÔNNßyšJîªïÞ>©µÊ)†Mæ`hÞ3´Í®èûÁÁswÝë‘Ëï�×ˆ­sR»þØÖ7mKWlÁXuŽ·î8wN�YÃoæãö…ŽÂk×¬?ô¬Þ²<Â;Y³Á(6.x&½…U÷8ñ†ÎÕý»Ç¹Õ“¾«9¾GÝßÌ¯ß/¿£!µòƒ?«öC#«ÉFÆl�ndB]‡]šyëŠÃÆÈu?£Úy;áãxŒÍm/1HBÇ
D_›“‚A//Q!—;t»Bý!—Ll¼Àë
1ýq]e±˜ÂÚÆÄe%]–‰·/œ±+à
•8{k:|¢K«åõ…VÉUÕYí3i�$‰´ a€mæbµA÷„îl ú]ÐVáíj©oinšÔ‹Ý®r ‚.xIAÂ-‰…>±9X®h¶J¶âÚÒf�3ÔUáçœVa‹ºæ�Æý‰1s«8ŒÙ—7RƒÚmD†ìCàŒ1ù/ThŒÕ&ÁíÑDc5òÇ[O×ëã`óLùoŒF EÑ
´&_ug•K²êy­Ö%ú:jz�%!W`×Œ…·O´t•\–hÔ†MKMgZ"ý¥H{<Ü²hæÁêä‚¥3BNOsim±M²6W„Ë‚Í¢oab„Áx‰+@¹Ë]»&m
6 †ëòbúÌZ†–Ø‘Ê©Ô«©‹©«¨;©G©_^ì�WÉ"Z-ˆFô”Eª/¢.ß[XÕGeÁâ#^e°Y3,1h@$N°E `³¢Üu±:Ìi„ƒ4jA¡¥óy	:©
~é%ý‰÷|8@À0mLtJ<¶�¸¤,Üa ‹ZŽ€ZŽQx7YÌfKÑÓ'¦_èž6ü¤=ôi¹‰ V;hãã¾övoÉ8?iƒ;ZWd³­uÛ.ó;9 _’H@›¤›X~…üwù³+*&è¬VÝ„òý0´¿¥ÓÆ³¦G¢3y¯& Ÿ|¶¢šˆÛfsGjŠlO´·8ëvN�î¾Î_àùäŽZó€ù¨?ùëdy1¸òùºÒÊBKøå:¡©87ª³•�+ŸÝUZf{R[$ØÅÒ�»é’&w(TÔÐ5!â›ž®¿=¹½.MÿdnEk2±M�=2¯¼§›ËçÑM ô—¿t,u¬‹ÿú‚½�EèÚF²q7ƒ-ò_ŠÍÐ	Ìòïƒ¢»h†¯á¢¯�—!ñ²™þ±„ZEí¦öS·Q=£¢wÍ"¡§®6Áxº–ˆoŒ×’yyQÔ;¢äå£ÒaZ@dÔ‹�c†?Ú­%¸<ç%]C†£^á%=Dhtwž‘2}Oég¸ïÇè¡ô+a‡Ýîƒ9g�5Ô¸A~iýjà]¼Øãi°Xc¨Ç´–XmùâÅ•ãc-˜³kU�¹ÃíáÂ¢ð¤©HQ�éþà.aQãÓi×Ó�‹�.”nz
~LÒC®µ®ªƒ…}SÀ“…¡ŽöPaa¨½#Tf-‰ÖV5K -º= ä?Ûí ÒÞQUÕqxùòô¯ÀçòÊl´œ#_Xã¶,¡ÓU{/½~|<îžkŒèJ&-\7+‰gC›¨Û­¥ñÖ¤IoMN/üt[S7g³qÝM›>ÇiÞjåQšäÍò?€iÚ�uóäo'?<]ê~¸ßdŽlŒ·�p@¾Îíå`·âK‰ysÿMI8úpŠ—jÃ…¯
Û2‹2 ðA8_÷µ;ô…ÍªKp—A¯u|Qê¢_ÖëÓ_‚n½Ngÿ¢Ì)!(ÿÃN¯åiU~Ì[€^¡ÉT	V›mCg�ô-V‹©žç¥¯©ÌŒÑÊØ$eùEðz¶ ØhÎ�½°â€v@öba€ÄpÇ(ãË[ñÓ¢†×ì~^«Õ˜Ÿ)–è8oyÖ#Ék�ºmõ>-ò­<nÑü~Ø"5>ðë–ßù‡‚`,¡gé0”}¤`ƒ÷üOó£1k(O1ÿF©N²†/Õ2Å ƒÞ+löE Ssš€€ô_¨¤*3	êÙ- Døæ[¹Hþ
|$>ó hèì^ÁçôzN
£R ñ%‚ x¼N!å+Þ�ß_SRœà�Cð‚ApóÉ4X§ešætf‡‰+XO\7®ôŠë®‹/F²Ã¤ãhZÂ,Õ«óŒ:oÆçEJÁÁâRìb[ÅÈÅhX`lÀæ£ ê@ÿâ6­)ìŸË?’íl…lGú¸ãz°  °0=,�EùÇl˜#;äÁBð‰ücY¤[ä7ä?ƒ6ù£säß>öà9= ³¥É1¿•ÿ,¿	ùŸò?äŸƒ"z�üsùŸ`<Þõh\úŠø˜èÑÈ¤”ã?,è/gyLIŠÿhÀk±ç«¼»Ÿ½³hŽ�6ùÒ‹Úá;íéÿ^×®}|�”éGioH'a²âŽûn‡®Cò±ëà“»Ò§vÑ»Ò÷ÀKNÞuäÈ¾³¨u9/—mç¶ÄBr–Žh»•Sú€‡ŽÕÚ±ôâ­tˆ Øb9‚¦Ìyãœ97ÌeÜ4¼ËOü1˜
æÄºb±.yŠpåÔçÕvYõ&·kÒ[»j‹æ_8õÊÓŸ‚ç±º�Þ\$Ç½ù‘Ž%ið2NC;qè ÷*Où˜<$–üž·~J>oôýIzØwm"8#ýe"ÙÈ×L´
¡:R¾4pëE�\tÑ#ð²Éð)_àÐø˜ú/ÿ9Í^˜\ò±-ˆÄ}Ã\µ¨_ËçÁØr9*G—÷B‰”pH~} >–žÑjÆŠOîf/aïAúŽ®lÇ}Ø¹0Ž3Š¡wW…ÉrÑKDoSBï¹„E½;N#iQ"ñH†¤ÑüÕ�¸ãœÄÜ… :Ìà3˜3#^ÂbßºZ³=.*•tÆ7
/®l›N3×/]²ó#ëÔŠùù³òª„èYoþèý¶èÒ“±¢dÁ/¬«š2'a-ðrâa|ÀÆ™ŸpÍg+Ê}Cò­ß2ÙŒ,µ›KKùëK<»�ƒ]`ÜmÍf ïkëòZæÌ±ˆ†&Ë†-…NZ’Ôhn†;Ý­¦º†×ù]…-_T¨Ñ†D×šöNëøjÚ¢±ú£�žçÍÚnàüõôÓ÷ËNO]¡eOÈ½ÉP4Î]§­}i×CS]•�I_%VuY[	¬ò®4d´oD:9a·*âXœ„³“P}	·3±ò�FU©.
£�Æ‡!nØæS`9^ik�Ž3XWG	†ÝsJÊAyxÞ4Í¢}}4ŒWN¾öIk{¸â¶+Bí6c•ßóâ[¾’Úz=kºKî½ÛÀºLÕw|û˜ßcº\k)ßô[ùû–‡Ê#ŒÆ^Â'×?è'œÅÅÌxP:Ìšwky•Ýº^tÄZ&žgXÚ^³ÈZ<4Ú\kµr|�UròH±`ù‚4Í‡˜¾>ÎpkýlwÕ*iBüUÔ÷µ¹~“u¼§ãª—KØ:«_ßm-\b´†l@jGÌC€êÀ1`¨YýØˆ‡•*IbQÔŸÂ Ïæ³X=¨éGº�,î=¶i¦ï�©[:Æ[YÀ3ÿfÈ�½íãg¾ñY Àú¥\Ð½ïº.Û¸°’ååECé“žº¨À|;¿Â FS[ŒZ|QìÐ�>	„øY­`”-tSkESI]�€SÔq`¢k:ö–/¼mÕ¤ËÁÝùí7ý);p”Žs€k~&ë*ô.(¸O^Þ°­oã™êá¶PúT¦QÝ1j�}l•~e6ÊwëŒ‚N¾Ã¨ÑZU¼@¤´™å¤N’fIbˆÍb0ãSBÁ4›Â÷TýV²°Éq5H¦³÷±™�`9¾;Xed$i�8p3!3@7—“få% ÍStšÜ3ƒ‚ŸÁÀw(à<…K0¢Pp`ø3V
¤Š2 ¹”zOÅ.==³ê¤pF”
^ŠšâNA“_Ô@YüÍ¨=C$êQUç°°ðÓ0ªJÛXf'ŸÂ
2Üª
Ñ�Ãjg7‡ç]’¬Y²`BËìÙ‘›o¼~óæ£S×÷ú+W®�²cy]Ý¬À„ò‡Ež¶X,ØNOŸö Ñ3a÷îç½^Ÿí°ÿüèÐA�ÇïŸP’h�,ß|Ñ‹ÌÎ–éÓÛb¢ž»ñœãh3Í²þü‹\‘(`	Z›“º…?J/À\rh;ví‚bzûrX	ÿ+}.Œ¦w}¾ÞHŸ7ô1¼»u+¸³ì2ß"ItÒ�(ª6Fæ'FÝ²Ê,¦tnÊ’T¶`u—,.„‰�ZbïzìÉZŒÝp 8O¾õÃ¨µƒ¼‡×Ž{ív¯ch°¬¹iAs33+Q9½yAó�æò²f0­*¼!9´*yÎÞ`ä§®x{ÅTÞhàÁa|¾¹¬¼™)ràû(ÿÞh.“ç”77—ƒ—5KéµU‰?ã½?+¿‰*x+¸1þÂöí/Ä/5òœa_YÙ>ÇÓ7f®*ojBó(–»¾%œ&Ê4H‚èÿ x*LéTëàB<ªáq‡çðøÝJ7ƒà±À£È;x™�Ä’™éB1u9òhÔ�Çê¢è0ç°ªP7ÆÄôæ@Âš!O µvŽ¯’)–Æc?�§ pœ Y"¤ÌhúÄÁ#^±ÁÞ†V’!ÑŽ³à÷@JI¼+ÉÕh‹¡XèjÈ�3nÏA‘V¤pàÙìŽZžCº/®£LUá:4çûqÒaE×aa. `±Mûøµ1à�¸8€@³Ð¼“a¥)ðp#`éDIqáhÞŠ’”¯»‘Õ¸>IÖáP½ãÊü!`6¼š×N$Or[ÔF¸YÕ«-íaáMz-ÃJìRÆ¤sjhù6¤Ð4¯Ó2@ =?Îð4y ºi§o¡O.6½Ö&�@ðØÆª›š8g/êô"’*,vóhÇÐÀ_è.‚@káu£ç- X�+ v­&Œ¬N°ëÜöê8,s{Y­ž¥µk§¶ÂUCÓ‚¹ ÌòûÜv#„§ç�tá¬˜ÝVf§�§È(:fi à46/9†…°¤Š-e¬hÍt±GS&T…#h«®ê‚Ë*zDÏäl´B´›J@ûÌô]´žÓBZGÓzÜµŽÕ²¤…2Q«\g 9†¡Fc¬‘6iµ,�2ŒFÐ ³ ãV;ä�Ž +¤	­(´¬‰�ßS±@ê²VL)‰Ý›�%åNVç á:a�Åã´E½¿Ö(BË ?Mû­—œ«'8ÊËiÑª»p|G¥žAƒŸèá5A{Èzž```]wxB´¯¤a‹ä„UñÅ&$nèunwÌ/ºE­ í!Ñl•tõg•6µtFÇëÃ^Ÿ�€`r™ÝÌ Î€vM´ÞÈÉs€ÆÂ²=j_­Á/Ê·ŠNS�Û\¤óóåìøó¬Ö¶»·•B¦rgU¸¹X4€Ö9ž»m‚_C{ ¨­ôÄÉÄ3	ÖSjÓÒš=&¤@òh(6UCZ¯E’ÝÊJ“`p ÁÅj&=€`ÐZ´‡JBsÅŒÄ 	”aL fÉ¤e´�eŽæ�Ðì2è[‹µ4_Ð6¾£ˆ{ A\«qÚŠÛ
% ˜	k^Æq¹ÖTUJ›šjªœ³²Z¾ÎlšÒpUíHÝ–¶ymë»Ä WO—Y\jY`²þBÃÓ­ãx Íqˆz‹0`Ü4?…œš€ÑÈ1F–£Q»æäK†‡Ýn±EFšæ6ó¢¶ÈŽz2zK…Þ š�¨g,zÇB½y|°Dk`t¢ßßé³²´ÑTÆ9v½©C°h¹çh®¢nBØòÓºi~­Ól/ÂtÞkcÖkë6½xÖ®r(r—éX±cóú¦7ÖL)…ÐD­®‘ElP˜Ÿ¼{ÂÖW(@Õ*Ðë§M1G<n½I��Ç²˜@y‘]EÕR­ÔìUÑlôÇct(Ìøð,íPè€ÑX‚
/âñ ü|ŒÅó;Úa¤P_EF“VPëa±ae+!4ÇnØsEÀôô§ûZl^ù×òa°¨»öú»BAF\wÁER^PE¿ÿÖ¯ŽÛxÃÐ?Ð¤g=óM×¬K·NÚ9¥Ùô}h­íÓwO*À«%3&w4GË=º�#ô°|%g›±ðšúÃðúšÖe¼pÑ‡‹ß¶¼C0ö7ïÜ7áŸ7}Ñ\üÅÇÓÿBŸÀu÷J?zÛ5)Öl“ý}
�…Ñ2Ö‰º�´¾4£Ú~­Ôr¬TÑÕ s'Gj=´â{…™ˆ!Ž‡-„[ÇÍÒ;J+Tˆ·8Â4« Ïa©(†	EŒ=ÇÜn\4£¦×SX&š–w”–T¸ª6=ÔÓ‘ÜØš¶ ùÐYvo÷„Èìš²Ú¢ÚÈ?Øùƒ�Á†�ìí�Ñy­<øÜFs·ºX¼Þ«�«pê�<o6»,3œ>¿3Q_\UÜ¶±³eIsP(±ÖÒpÄ[Yém®\zipòöƒG>ì6o|°×vÎèÝ«ìÈƒx‡èçHwx…Ä²´Q$â*c‰|òZBSÊ³rÆâœ»”_€	í²ð©tÌè¿ÙB[ºÞQÌ�€ÃãûÂî¡�F¦Ø&ÿ¯Fƒ³DÿÇ¦­ÇÙÝµ>ùF­F^nï4Ä»æÐ¬HØïdZg03áðû­ƒ�¡ô¸LE¦½-6tmYQÐýy§¼[þ•Ån«°[uZÙ]Àkí]ìÞøŠ¾¾¡O- \J�XwP4•QžšgÀ8Åvi"3ƒÕb›Ýë¹N“‹~S±÷Q„˜K.±çÒB.S(W†ý¯ÿ£b…
Ó›d'~LÃÈYêâR4@«lm$öÉò™˜–ª/�ý¹òkmÈ•šXÕ_51å
i¿®üsQ¤´Þ¨Îu ¹®Pf¹çÒÿ¸ôÒÿ ¥õå`þ>y�It…ä/«&N¬æ�K4�ÛöÉGËëK‹œ ¹aƒœtÒ=ø‚K•²2¸¬Aâ‰«
»�Ól•6Ëâ³QõÝõ‰‰K'’?”ÞÔ“Ý›äR:!+<y=C›HIÞ”Çã-}P& ¿{Ó&ðZ®Ê{´aVÁ ê’¡p(Ãj‡ÛìŽ’ü,7[ŠªK´8Kš›Jœ-ÆUYÌÌ¢Ì§à=û´žb’WJKýÀUÜ3Í~ÍcDÒ/ÞfO¡~Ô‰Wþaj[A+8Î-$1Ö,q†°'–3ãAâ#ÌÆ	Ù<Áða‰#®ÃÎ¦–ÜöÎ§ïÜ¶DÙ€�ŒY~ßhä÷×yu�Ëï&£ü¾™aµ�?®e3(A'AÉãZ¿öqP‚N‚õ$Ôçnƒ6QÛ#¿nÖé¸åß�ß,çt:3¨íaMÃ7ßÍè,¨UÎÊYùutÖlüæƒªûý”½˜Q¥‚x\ÃÃGFÀHmI�cÔ¡NŒ•IC|`Ça"‰3ŸÇêŸ”_~¼÷×§ÖýlïA4_†–Ë—ÜŽ)f·¾ Ä[*,¢oÁ’C'o8ÿ¼qÅÿ	ªMìÉÔ}Íò�ßÝûÙÑµ»~ùÊ¿v¾
o¿8^ÝÍÁqãŠg¾±õ†“‡"b±Pª`›q)Õ¦]®z0s¾o”ÿ¨Ø–Dš\›ÿ£3'Éó`ýP�ÿ£†Ò±Â‚æp8Ž‡÷T?×Ã¦¨‰ØŒ"ü¼Ãn%Ý �‹è³ðWÁêõbPIš€%Œ¿�b‚¤àzB®�ö7%IŒ‰/²ÖÄÄ•ã“‘5�M‚é)k¡S’hËË�
ÜÇ1)T'£»ŽIu!éØ€KžœN>tÏÂ³êBGwœ�ê$Iz�5�óº08œ;6
oØÌbÔúç-ý¸b!åBå6òï uÙ³Ï¢üÔ)
ð»™)ÔeÄg¯§á¥K¬Y@¤ê±\Í�4õVB��—}ð¤fà$²à9ÿzèÚx+C°#ˆÂ…{
Òi¬†¬ŠãÕ<ÅþA¤Ãð»ÇœãJ=Å¼TågÀÕµ4ÏkÊB§(gÂjõt7LpÒ:§d<Ãˆ�­So^æ,ÐÎé½º™£Sv–5k¬u&sQ¬¼´Ð9Q«c¡ÀsÍFÑl�þÇœ¨Õ-ð	ôœEÐˆþ²Ö`s5ƒDrÈYuÀ®åèo{£‘²wiá¥g±¦�§€a­ƒmÁ¤j`��Iå¦Ž•hfÜ„v§SWzM?à®6ÛYNB²&Cëmµ
‹šÕ²@SÒØÛY:Ñhðk¡]Ò» 0°–b_cÝâ�¾Õ_]¬…Œ«|Ikï…:¡dMZÂü#îkv:¥##^55ŸZO]Œ¾Æ¬NŒgc’Dú§#ƒ÷‰5XJxŽÁb<VDz/ql­ˆv±:èÁNkØ(�>[¢ZBPCcH»TTÊ 9F¡XeÇ*:¼›~gÚìbÇìm­Q(â-ÁóDåŸ6n˜]]}¢oã
¤#öË§ýQþ½ íàÐA„¦ü¹œ–?–ÿû�½W&‹§M¨d8ÁÄqWþ¦ª²²‚ÎÐ°´cÛ¼ISî@³.js–1¬ËÙæ/Œ„µµ1—¦°¤µõ¡……ãÅ…»þ9äŸl\>ÿ$¯û6£›eõÆb�Õ/_ÛSâfÅ²¥î¢'š{n˜,8>;¤l®é¸öÒÞÖöO�³0É0-q�`@½ 6µ´m5
zÔ¡×ÃËwÕ£§£2´õÑÓ�ãXã¬žôV·K¬uÏy¼cRTäŠë«9×ô|Ùb¥¥$ÌOøm‘¦íÁkž�Ç¤Ì%ÀÌ£�ÒbgDæÜ£/<ôÀ/ý�_Ê·¥_}â~PÂDŸx5ý(¹ß¿|ùÂoü†m‘ÝCòÙ«ÞÎgÁ¤ß¤Ëä¿¾»
ñüF~VYëC²ÃN$§mÀk/4U9Š'(h, 6 ôqÅpšÅi¶Ä¢U,Òûi8hxÂk#þ�9œdwz-ï]µ|V³Ù²Y>ò¦ärIÇ@ùÚ’©Ë­\0×·å¥Ë·´D]¼}JÇŠ9•Üä‹W.h‰øì,cÐ¸§Ô×	¡Hç¹Í%,g5<R�„êØ¢—tÀpËÌùóºš,G-çœÞ½cÛ5à'ÝÛZ¼´à)Ðé>’¿®Pxç¸ jŒÓöÌ­¶fvU\ÚhH[Šê§m�\h‘Æ5µµÕ˜Ì;;9ë¤i›6_ÝQÐÙ}Ö¢¹“c&³ÔÅ;Ú¢�ÅÐ1óâ9-}>ôõWðŽ¦ª¬Ab‹É.c)âIn%ñUDÂŠÏ>°ù,ø/hË021Û:»AJ1{+ó›Á²ÌßÖÙôÌÙ[�{âüò¿€qÇü‰`ò)ê˜Š~®joŸ·cGžœ‰ÊjÔø 1iLí§	îb’*‘i†dS!2}ð»½à5cð™ý®€¯a2±ZÖál¬ùd¬âiËŠ9KqsT¬˜É´ÿ;; ´afT…‘U>õ�¥%¿+k¦¹bŽ”ßGY¨�ËjQÂÎ,VCûj)ì[ePÃÆ¡¡¿G<�¾ýâ\¾xÆ Õž[ö]¼jt=ð~'}€êã¾Éä6*†#A‰8†¥±¸Ï­T¥2Ñ
�Xœ�‹bKƒä³ùp´—DŸZÛ(¿ùìíò×·�ø‘eç!À?³ç�íÐÝxŠ2šK-_È¥Î Ý5Â‚ØÄå½Ap¿¼Þ~Ujù,{õ±?Ü´·?ÊZ/�ýñ²gäo÷~àÚ’äàŸ“Ö[
"mË'N:›—ÿ˜Lä†a:¶Âë‡hôúxì>©,jâ¥Q‡›…í
’8Ê;Ñ ;ú_³+BóõÌU�ò°ÑëÙÛ´Þ}Ž»®KßPkj6uôÜñ§÷O{Ÿ{ËiäI=ï?ûõs~™³ÇÙ^÷Xü÷ñÇ@¸ÁÅÃ,h*ž*#Ö­�QÔ°¬ƒQˆæ§3aXHp)BrkË$,1J=É$Ÿ“�ÿ¬_ß¥9�Öèø$³tì0¹òus0ä(LýL>þœ(ÀU§3'š)Ë²©“X«|bkÅ{.Ë$ä#°þ{úæb¿*ú´M3R*“Œ²V±ï.+¬–r?Q~{””ž3F‡�ÊOîô]Ñâj\¬ãx†	ã_·b}‹*JpPh�±�=ê->"ÁWTÀÇÑäæÀ‘¾>Ž÷#ñ Ð‘Z: aˆ^àa"¬/Ï9ïÎ$ú¤ùÆ3yÉ˜HÞy³¸ìóâ�••;›/)ã¢ÑÙƒóé¯ßû¢a“»Pp-®ìYVtÇEËzª¹€—ªk;KÀKCÚm ?‘¨ö9 Åi�N_u"ÁÛiS¤¢¤"b¢íüPÉ¦ÏøÆË¿	•�w:±W(x€7±‡(côØºê÷�±Dæÿdü±bQ±"!¥2—Ì4´:—«n¬HÃÌ%Ux;ÔR<‚4Ë~Ñ:wÙCõü¼¦ê¦¸ür\3¯¹ºË¿¥ÈÖ2;^qûúÛ]öæ9ñŠ;¢Ê‰ˆÅ4óqæèÝ6{óüæŠ;Ößë±õòËð›Ù-gûšî·¹šÄ*ïë»×éÀ‰{¢ÚîtíÿGÛwÀGUeÿ¿{ß{ó¦·7½fú¤'3™™ôN€�„zh¡w	 ahb¥¨(Qv,(ºYûZP·àÏ‚»¸»¶µ sùßûÞLÈþt?ÿÿ?0ïÝúÊ}·œsÏ9ßeqér•Ø>‹¹rt<¿gn)’È»=!^‘?TG/–JÑé¹ bþ…{5Ù‚&Õ:"@—vd_Ò®ìCé›éÀi¼I¤šMªÁ@%ú„Ûã})6­¾~Zás…Êyi˜®—&²ûzÃ¥U�ÂÇC´Cíà-FƒÑÂã¾šóuMÎœ ‡|Ó:ÿ AY«²¤A)j!Îff——†Ã­YKl�—édDéŸxø y8•‘%
¶,îÍƒ©ÔTj1EñxB!“D?A�¸§Ax'¾?ÉôÅýÄ…·hâ‰©}–7™…5[ÈññX	•Åà¥�� ^nâT–?ŽãAâÇMëÀ¢ÿÍJY�ÔÎ´ Ï
rx5Ï¿9l½R'¡5Êö•÷ ¥Ó¸,ù\0òå€b®<ÑÌ0J‰÷æ$ù0ë6tÏ¥×Lyû¡Ï+úî @Ë×Û·�¡Ñ!£A'¨úäŠ+>A/ è‚É;wõñSÀ¥@Ê‡*�ª³]N³Ðãr J=¯Rô’Òµ™Ôžgæu�H(-¼]ãRúÙùÇR«$l^Óñàï }³à�{ççÀ’ónÜ"<Ì©'¯øT]ð™µGh=Ñ:6è'cÄŸ0J£�1ë HC1ÆÌT£¯O¢kþü0éøqô)ˆ}F?H}wÃŠÛ�ñâ¢4iØŸÚqÍOûmƒ'®ÝóÛŽjÐê%#›œ=k3:æ‚ß)%¤Šò€Ñ—îÂ¾ðè¢º¿sØql&¥{éÞd¶ã´Ü‘�xMJfþW8²OáŒ
	üŒ
%E�³T
ßøÜO„'%í’_ÑI™h»NèÞ$t”Ïš"‰´¿­ ±º58>­ã‰sÉdO2~½$ÿÖ3ÑŸÑ~ôçƒŒV›JLL»éL£dR—æ–JjÊË¡\¦éÕÈä°¼¼N1=f21]8›é‚GÐ‹ƒ–ÂÿAåãµR„yÃ£Þ[fú‡
¢ájþSƒG‚ƒ†ßZ3GZ ]  üþÏ&ÙD�À¤ ‘g`6Ko®¦$XL íè	ªêÜìZU�}xRy$¯¡fÛïs×w®,ŒÇJËµ¾6ùØ�ªR(àƒÀK |µF³èKüdUŸÞðæXµ:4½ürÝÏiŸ8ìÇÂJeâ~Yþh–™ÃO!y˜Î¢š‚R>�zïVtòèªUG�ãV�÷—wÖ<¹á’ÉÿÙ0vÇä&�µÀ7TG÷÷’ 8Ž®úÃVlüýüÑÆ¢!;¢^™8O»W/Õ&H#LD90((Ñ“ýµˆ?ØaÓ§)A€m‚!ÞL<|Ø¦˜ž¢%\ÚÐÃŒL4â�•`nÐ?`–À³ƒ‰¬ÕV£Wkµ½¤hÕÊb‰+iŽÅšÁïbÍ%8t¦i†ãã5¯’Ä@Üö/thƒ¯$ÒpK€å¥—�…sùÁ¬‹ŒG°X«©®Öh%’âbÉ»øb¸/uÈ5K:Š›ü�`Ï”Äšc‘bÖˆ^å:MÅ¾r�Ý¹ýµ×¶gY5eÏ\pA:K#xs"ó©ÐNÞt;‘f
dšÉÄö‡BãC	3ùvÿ¡©DkûÐ/õ–èûUªØ1•ŠÕ²9GsX-BÕùµù C<ÿ¥27Ç½øæøý ßMä.EÆguLåÍ‹\y¹•Y6öë{ïûZbuƒèyø»ñEñ5%’œÉ.wA�P3}œSénc¾eåá«çæ°zô½¤5«2ÇQYÍ«x`µÕ¢*'/Î—¸ðìC™ið±~µáE•'`ciE•*À…Œ¤�§&9­óÒžKAûî¥#–Ú¼\¹‹œ:+/½c)q!ÿrØ^=¼{Ñpô‰Án7¬\Ý±dq;À‹©ƒ�´z�Áîà×ØkÚ—,\ÈÕ�9êN.ÉNž[ÀEZ4±ïw^/<4Çz29æ„˜Å+GUö=òè0R=Ü÷¸9óè#}›^À)tér¢“ÚûÐÏgrt:·¢".¸ÿÛï^Q~;úñÑ3§ÊªrômNEEÎ@~…à}Pâf\t�zú˜íMÕ¢¬I›`/81iSíÀïÛNÀÞM“PVªvã<_aOŠ6)Åü÷h¾�N°v¸9dyðX�OðJA£1ž`SàNòFê0d¸éÍ7ßì€ÆÔç`zŠ$Ü8g0:¯aþÑ—ã¼ÅèZ\f0<\o¼�þÖ×qgÇ~1±?8`|ÉlÔ"â[ˆØnbó1 ¤Mysº±í€BÜ'F~Áˆ›Zb¹vGNý�Àu_fàÍ‰±k�Eë/»û‘Ëšž>–¨ºŒ6Ÿ§DÙ˜ìÔ £ŒHN çT1P>G·•O‘¤6gåá\õ÷=…ƒàçóÛWNeŸ•qoâùt#u„z�:J½Oý�ú'õ)õ%õáA]4QÐWC®€õMRç&Š$%‰jˆ§Â¢
š7ŒHl“%ÏûGmÎPØP’Fé ‚’™@9sBM›\¨ æ×+˜,uÁ`4câNZ#ê,…UÌ¥Ñä‚ø‰Ê.aæ€Lª†Q<4I&Å©1£Ô@æåaWNŸ]—ë™P9¨hÕ^^¥=T0}¨\ÂÈ$yœ›ÕÓ  'ÕÑ¾ÍY!¤aE�Dÿî*ëÌn‡Äˆ\n­E§ÿ�*Œ¼�eÌ��»S¦³ê4O p—©ðºÂD¡¼1—í¨ÎKäŒr‹2B‡ó} ŠÕqj‰œ“1œÆ¦/T¯› 7Ö8K•YY&¥é§µŽ¼l«WíSäJ9˜=¼ï�º4OGçþ:—Ù�f+\µ¦ª�*Z8ÜNûÊ¢¥g^ç@ƒº$ò|%Ì-Ï¦WHþM¡›VLR:/QåJÔh{8²s*dXàœJ—5`òØj²[pŸ�kÝÍ&UY•Úb“ÖÝd`lÝ&­ÆLÏS›Tr†…@•¥˜tÖÚžì)ö{iƒE«çó†Ú²´´Zåw×:¬á0ThþÌ¥	&à!Í€\—ÇV`)“å; ^�¦L1úCæ|]ß¢‘ÅÆÜõr.-“Ëø8§èeËuÇJÙ|íW>R„ÞÖ N£�r ª8x©A”©µ#•’b „+‹<®�±SfL“M¢6áe-˜Þ!ú³d#_°¶ÔšÅQ&¨Ôq¸“ºåqPBÐkˆú‘Ç A™�(#Zq‚Æ—!½ÖÇJp¿ºl"Í1×²¼kIó†ZVªÐp@ê�?-’=6—Sæñs¬Ðâ,¶©e:3­‘¨eZ5¯°ûR9+7ƒN¹9ßåInôÛ‡×�XºÂgCSÙ®å«³lmuƒ¾Â,‡3¶ömô9zýãOÉPEÇ°ŽB^Ýì«rùó¤Êòæý£F&B^mòcÃ ÏrÐ4ã±sÊÍ…j�\™g1H9T1rFBC�Z£“0JPhÊÏwŒÂååa n™Ù]bÐÕµÖP5´ÐÞ‚ì•G÷£þnÁÒW€£güÝk«uÊ¥CØâ?â– ³Í®²²|ÝýÔ@ì-^%;©•x>Ð@5eìyAÌU›9‰“54mÆ„‚WbpÓ\!, ‰G�“hD"Ûé	3!À
é„›HT\€6H8“`9L´E5t¨V…\‘)èÙíª{`´¶{èè•ã™
ê”»�@`NÀµûöç”{”�9ÍçžžÝ·ïv5æÙ›:WŽnYªu?={åèæ%ê1Ï4*ve\{zð?gm¡±e&œÕb+hPâŒæ9BÆí{œO�Q,m½¼Õ³ÇU[`lê\5zH·vÌƒuÊ=ŠÀœ`€„zrÇæ¹äŽøŸ«áðX~°UÓš…gvŽ^5y°#¯Q(2'}CWí£Ksë¥ŠÑO6¤Ÿ7�Õ�o6k•è·CÄÌD�£&PS¨ÙÔ<êJêN²Ÿ,\Õ…DeÎPZC1$Ó¡Ä *râ‚Ñ1Ñ½Äc�È…OQe“4}¤TB�†%"¬9:˜éžvÍ€ÕáOHn! Âˆû"B]bº�Ð	¢ìPIH'h·$tl$gup;0y¹\#ÓÐ0ÂÂ¸iI‹qƒZ×¥³¤!„€µ™-z9$Eyá(¯WÈ¬i«ƒ¶–Ô*/cÕ[4§º\6³š´ÇPäçuð¹š«ÏüŸH53Çg=>ã¯³ò�¡X…NßoÜQî5ü›©\Ê8<ÌÐO¹n´Æ�ƒ�}§Õ©NÅ…hf ft+x�æ¤2ƒ“�ÁÙmS4��Ì8Ëv×•2à…
)Ñ»“³Çè$:(¡µZô1´ ¥FÊØÈ‡¤‚bpB£2k”´YcÃÃ�Q+áŽ¿ç¤nú#ý4wÃëÝ©¹/©£+žkOëT=õ#­Ê¶N†§=;ýœ3ÒÉ3øQò�
@&.Ö¯É—/™oD“{ãö±éL�Å=aµ•ÚMÝM=Iõöïôô;‡eÏ‡,'ôñíd<çFOÄc×ýJüÿwy^óè@ÙÏL’{¢¼i×¼¾žúÉ¥aØîrìq„SYÐÑ< êÿ.¿«'\šJ2ÉÉõç¼+ßé]>(EÍÛ5¹^B…KÃø1ºÂg’ýÕ€úbAtÑÔÿ¦ Ø¨Òp¢ˆ7o¢C/¡Ò²›j8žQë‚Q¿£Þ¢>Â”ØY nPj.²ã×ï$QlwÝ§ÿËïù[úÇ…@>ÿ·×ûù|¬ ¬rFÔRé=çvà?$kÁsHðLô›kê¿¿“„
ÚN	û\|D g¿ýµà£ýÁ‹C ]<xFÀLð¿¨Ö÷_”=†	óšµgµL/Û…GIˆì^ TGd�e!³É�±2eö£÷Óºuè}‡Ã9ÜqtŸt´;¨GT°{½ß÷ª Z—DIAµ®øIÇÉ“¤Â'¢n›ö½LöSœ‚Ôh‘‰|¦	_D_1 ½„²FO,*ðìçóââ4&0 4Á	¾aDr
ÓgÊà¸ª–µ•øØº¦Ý7ªµeS“p W-ú§¼5õ¹�_ÕÔ§šŸì¾ûm0¤j\°rM+9®3ZG5mj!&\9¿méÞ¡äxKêXûòE{›ÛW,ºµðôéÒ‚*§¢süŽ1Ç\~¬m~eó-KñqèÞ¥sV´7ï]´¼½ùÖEÄþê,‰/p£ˆ¹È›ÒÆîâÃãg‡½K¦äC¿­×æ‡ùS–ŒÞuß®Ñô××¿è{]Ð‹^º>ùÝ­·~wS$cwäÆT<Ð±¡| "QDRMc…›¨˜jIÂd*YŸN5¥šØÓ~wªÖQïHÕºýAØkÊ3ÁÞ`Á$0	®ýt1B¦(_¥%µZ�ÔUúh*\¯”Tz–R×‹PyøþRÑ�É9«hœÅ„ç`AúÊÄÉs±dÇÓ¬b ý€á€ŸRX|ñ
N„jÁ�hZÀ¾; ’'†£Áh0{*èAµÖZ+ªehÈ¦ƒž`®<Š½æ¸ôúrÁ£þœ®^P¾¿û�HmË„VÞäû»Ÿ}öÙTêòWkO¨Õ' þ#gmµôkµOƒëð±W.ïÕÖQ÷ÓÚZQ¦‚¤ñ{Ëp»©ªŽìÖ=4A6Ò˜Â‹B�3?”Ø#9�ÁðDb%>OÌCxuŸ'@<�á¡ÃÒ>WŠ 8Û×Ù-{ôj–ë>˜�ÿ9Ø£W½9¦.Yz&Âo¾‚þ¬mžC}èsØ1öŠe5—\Z<rI²)u+óÀZôÇ¹�/¤ž¬M 7�ô/oþŠ¯Ô¹­ŠÜ}è¹¡­×ýÅÑ°nÂãYV[3ªÜ–þ†™ýL òð›üü\°òÂîÙ[ ´/†)UCúÄâ2žxìº�&¢#fz¸QJÂŽ¡m`Ý²žkç‡šGµ>|çŠ©‡Ÿ]å�CÀ-`ç†äþÛ.³ú*ÅÐâÅ
Ä4Í5è÷çKÁÐõ}_.]|[NIwÙðzþ©ÎÉè‘ã‹çdµ’6?rpãÖý¿ó†Á%«Kë�¼5ÃkqœûAgí÷Z ìÁš3úg!B™ƒE	åÂRˆÇ• >C€l)IÁµ¯]{ík©m;æØísZëÜî=-ÆCÖòÁsè·[·þ±ÇÖ¯{lúá¦|~óª§­ÿ [†OV™Æ€â™#@Á¸IýkÏ<÷öIŽ{wKk­[ê‘V¥?Z÷®ÿè£ëŸE?¢ßoxtÏ¥Á·A°û E?PçñŽRü>Tk	€lŸR"7(˜/ÇñCÇÏm„Ue�@$ý�8š¼} ³¿,¶	aß[Ò³xqÒ^ÚQ:ÙZRP¹Òj‰Vu˜tŸø%n˜2çf9¿ëØ±]7þ~,ã‡U£¿ˆè§í¯nÛ6cæ6:»gñ’áí‹Ñ«––ø•+-.?æMƒ&®¼fvß±�»Ž½s#zV€wq:ê™±mÛ«Û·´ñ³c$_±g)î—ù˜O& &Ñ\@¾bÊdÇ3­4Ñn�'B€XÌ¡Ñ<i ¡!žh%²DêÄ©Y.ˆSt A×Ø8¦êMt£¢‰xì+8�ÌÛòÝP3µÈM3Ïé 'õ¿F’<¢,æõƒo”þãwßßÊR¡Â÷ÐüÇ†ö°¥ØWd)‚»ßÕ+Lª°¿ÊÓ¤ðþ”­Ýþ>š´ÛÛ1¨R§;Ýq¥"¡ëLNº,`/möOä”°m™8äú¹£ŒF0ÓV©Ó×\6&õºÉé£ŽÝ�yhM&úÑtÍ3J0Ãí` Á”g�£—ÐÎ@›Ïà5™äzzXðÂ—#ÑÕ†1ãožÔ RÚ®ÑT‰}¤V*öy²¯Ûp-‚÷àÖ"D$×Ÿ2ÐpÔ“1 Í8ÁíGº‡™¨0€“7Ož¼y#ýóxh‘¥(™²´�„ôê®îžî>
ºÔúM“sÍwL£©iw˜ç:&mëH¡Éà˜)åyiÊ*F)„Iö$q½™�˜žKâÒwN^¿~2š´I´«•’é6JU`>¾u ¯ö¿<°ˆ³ìI{Ä2ó»YpîÝÓ)\Ö¤M}ô¤ˆŠ—$/pê´ø¸3¼7ãÒ`rÓ$òµäñkÅã¹—8AÈ¬äUP–ÐL`£Ø }ÏQLdaå„ð~”ŸTWë�l÷i	òfýGÑŸ0Q"�ì‰ E€ÜoE½V¿ ˆ-ÈƒŸÇ—È1I`á“|ÐöØ��Ÿ€�%AÝ¶ Õç³·é‚8÷†þC’ç®D…Ã€¹ÆHåR�‚.L4IœåÓfØñNõHÍRyœêöûK3‚{>0P5m¶ë÷hËÍ9v›µyÑßîçÕ¼£Ë÷%úÃM»Š|VÎµz0¿cQ[}ÂëÐ£¿Ñcvg»Î-îù³�¼3÷Íáç›²ø¥^Y®Á)µÏVØ¿·å¨¢VŸÔ³VåºBóÐa…\ÀåÎ‘«”Ù.Ñ—-þ&<¡†‰_6Žæ0�Â¡Ÿð0zÇÌˆÍÛîBÇ@¡}
Îà0ÈgÞI=íFS]è+(„ƒ]`Ÿè\xìéðïÅ\J©ñ
K<ÚWRC¨QÔ4j:µs¤Û¨ë¨Û¨ƒT/õ.ñ¶Ez©—�’Gq3’¶åhƒ9ã< Fv½…Ä¶7a&Š8±P¢Ïö´™3ø„ô(¦ÙÏe¸ÓŠ;8‚sd€ç‚g$â"Ù”¸0&FD»ð2@“l²òDŒiî�azÕÄsÅBò±xÚ_Ào¨:’@	B
Z‹IH•\¦V«�Jf9
¥Jª•ª€\!‘©2Ù™/¨†:T�³Ù Tf6Ë¤ÀvÄjUÈ¡ÑåŠÉf3TªŒF•²ÇÕ™Á “¨Áô‘Ñ(ç´óKZN>™çRÂq©bN3ð8¢’Ê”àÊ—5f	Ôj�A3]­Öš´@©Z“æOj½M$%”ËRN™Y–õý[¥wŒîz¸t±²eörµZžúá¹ªälÖJYVª•¤žŸ9§�q*° ¹N&[—”5½õºLþÚ[2<2?ÿáK…âË”lß÷*Õ÷}*÷g?jeÜ�ŸIdÈ¢Í?r
ý�`­^1å}/UðßƒwyE’|k4~NËTª”~†àWr�Zñ@
µÚ…_(´ZÅà¥V‹¤ÿTéõª%ËàZZ#ãX©>uã²» ^Eo2Ë½èT¯é •Á' Æv�”¢²ü	<Õ�ú*`úßcŒ N-FKâ�ï�½+Ž¢ÛPºíè
°÷Wâ‡A˜v4?JScFÝ'êcÜ7ªï¾�3 ÂäàSRŒáÓ€ý\ž²Q>j2;—â±³ÏI¿Ü¯3s:ñ§,([.¤edWÂÅ=s
~ûˆ=; Ö!F²Kl*`D°¿Ç¯�˜²P 1ãIŽ˜¼Çð¿��£IÑ¹Š„úÈ˜,a�8Âý ÊÉp—c3X)W¢W”`:±5KQy¢å7¸´j$uE—×|pÿMã5*`åŒlòhµ–$ý•Já6³R/#ÆðÊ²—ŒŽ4*ü8B…¬ÝºšØ–¨½ÔWX.m)R3Ìfa‹-Ãv4¢+œJP¦<­g(bÐvš‚#l.®Ø„™+ ‚a�¥�æ”€‘ÛÂ³óeGw_±®ã–HXc,”@šu­´Ù-—‡ÇÑ«s:¹ f€ëšp{¤æÆí˜(nX8fQ©Ââ €:¯Ÿ‰ßhÔoû6¼‘ ãÖ�EÉæ:�~´D|%Ä5V'´�·8�ýjKÏmÚ¿/ÉÑ�¡K'÷íoBïvNg!dðÓKàuK®ƒ,`Ùé�¿¡ÙèäüÔ|ð‰Á¦•Zh¯ÙáÎùóQ³Áf$ÎvÙ,ô¤>’¹%F£Í ž˜ÿËvùÛÚ�˜ø¨'‘C7ð‘8-6† áFÄ…@ˆóô¯6ÈÖa³Y9‹_š�,GÏo¾ÆÞÐ§Í³%�{#QÌkA6>ûüoh†ÏæÍ»�ã¥Œ„ádÌíóæ°ÍŸ¿�ã_G¹·É×è“ŒŽÌÀ÷/t�k`ŽRôÓ�)‚ì|:2r	Øâ¯¿s<éÊ–œ†áÍ5Eèº‰€]±²Ä]Zíþm/x·Æœì±ÒÎÏOý	X€RïéïÖ\ì�r¨ÈoœytžXÂQ]Êð«¯À$û¨^²ùÑÞÓ�iÒßðÜ õö’*ÉnR… gfž5³/Cž7A5(ë1Ÿ‘�ùœé³ñ×ßÁGÀÅu@°´ ã|,Jœ$Â4“DI�üèÊÿõí’IDÁmó¥×x½Ô8=9Üä="øzc’þÀ¯½q2‰§²wÐ�vëÈ…GZí5 5™´!›àŸ±_çuÀ·*£Zm¶ß´N3^#û7$âèQ‘ÕLZu%!^A I1)¿Þ91‘C|GØDƒM´à�›ß°A7YÝŒ:Ö¨Ön;VB¾¤„‡¼á·ÌNRSêq%y·°o|·&5Ø²ìÙg”èt1ãôücL«¹Ñ0©oý1CÙ�e†˜^w‘>ý­ãôÂ½!6Ójf4òëK¡à…	Gziµýd²ß´ŽÑÉL]€�¿/y ïrÙE¾‚Fð“~Ó›UÛQ@´ß‰…©`¾â1q´à·Uwb¾ˆ©\L(ðbY’úõ�ß%µ)¢
ZúÄRlÒ¿©ñËªÕ»0-WiàUÐ¤ªIŸS‹à+ñ•¾û_!ˆ¯òyü‡Ž]˜ž’à+ÒäÒrèû=`ž'tv7{·ÑÐÅä‘ŠŽ}ä˜ë1Ùí”ö{\Çƒ€¨$Üîc�ÏœZ÷‡;
Û;usg,íkvÛ¸U«‡ß»|ûozô¹rÎÚPQ§w—Gbµ¼£¾ô²ù
ôíí¶ü"]lÉµ\òÖ{h7úêå®{¿Â‡{8Ö»o=`”¡¬Ù#ÆvNŸðô_Ò2}Nœ×$”sSzÌ™Z	6 t6’�@fÃón:6€i�!íTŒ°$"ýW8=Šÿýïé(}‡mZ¼x}}5hKÝÅ¼ù{ô8P¥î¢£Þ¾7�yÆ¾7½^:Š8,B—€Ùù7lè{ì8ôÑåO<ñÄ¤�Àlt	új€þC`º)7õa¶9õ¡J½ælèÍ6C/¦ä?4gðZñ‹°+q¿+öIa×ÎçÉ…‚„£ÀƒèÝëq&˜g¢­�Áw±Ñô.—ÑóyE¯ZÒEW~q7£¡Ï�½ï‹K&*÷/›Ò:„; ,w‚ÓoÜ³öÊÙÚeCk¢µ5–7¢®nèˆÅu«î¾gÍµÓ&Õ·”´7—å¯«Ú±¨fõ}°¯à•Õû?òÞuÉÓñPîÒ;Êo>r;úâN‰}½zûtÃPu]C<Ö˜ÓØÑÑ˜síŠUÛ§.¨­�–¶�o bo«šá?Î7ðgáW‰˜ ,I„$Z*½!NŸ|Ë²f<s&|í—ªÿ°m¾ÿùŽû:ž?óÍóÇó�°¬^K»Š¥g<ßÙù¼CB]DSXÝI*áª¤Âýhsê9!?+KŸ¿_¼œ°_“%9Áþ… @€s
Nz¢ÌO|‚¬j²åŠ™½äÄ•ÿD½¨õþóÊçAûÑÐi¿¶³ÐíÏÃäÃ$óÊ‚Ú‡ÿ–~í>™�zþ±Qtc»ñ +ÿ¤ûk´�è„óx>û7nÃé¸§Çõ‰H1…Œ L"°bæN65Ä|#.h‚‘d
µ`/»0˜ë‰šŠ]R³>­[ÎKÿú¤áÚR;tHdNkµVrhì*µ<;?G­šj3ð d4ÜÞã	ÑŒi¸Ã1;¯ƒçÝ^C¡güˆÁ&cåP“•Sœ­V©9y8xqcn‘ƒô‡è’³‡Ñ¡Ï·À]ÇÁj<B¤ÑY+öì<08ÒºuÚè¦%3\Nk±Ç&‘,Õ5ÙìE‹²ÜO>^°Øë	Öé–ª‡8�¥·®Íw<:mlíŠµÝ³GVét*Úé­�´7Ïš³q0J¡ÿ¸ñgÐ!Ò=B_Sb>7LµS“¨Ô*êJê&âo#è'žðÌÔqøÔ&ÌŽ¨]+F.O„â	sœæˆ!—„¨î˜qLCDk›tK’‹�||<Q¦‹…â~J‹�¢î%®� U„Z¤+PŒaÑ8æ<5xzÞÛè¶yåÎ¼ºß×Õ¥þ6Òd/›6­ÌÅwøXiù<tÛÛ¥uº÷o¬Ë[ý©Zý/wÃá²Î¢’‰%E�e‡ÜÿR«?õÔ®W”· ¯h\Åáz”SWJŠ}eó@£�Vf7�ôû:xW™©Ì$7)­{tÕÖ“èEt ½xrëÖ“ t‚Ê“�]d€Ìª—¼uÐ[)»'oŒê•%žCàæCžÒRÇŒî…è_ÞƒoIê�rLÞ=e8¡=gLNûÄÖ;ôßÈåßèîh�($Mj¹£Qÿµ\þµ¾ñŽ¬‡Š19÷–æ”z¾•ºÍ:ä)©tÌ^Ø=ÃQZê	zpÆ½9cß¯�äÉ¶|Z¸ïbÚùçdY¥ÅTß j.µ”h7DJ�Ðé³)“ø2j÷F‚þO^„°d8�Pœ�
«†�Ð7lLÄ��˜¢1I#nÈô5úpeZ‰‚˜ø….PaÓ¤ùÓfù›[[ýÁme‘Ê1Ë+ò‚Ù‹Ã�-¹'ºÚìÅÅ­�òÀà+!¼’§]xš—ùdsék˜J? µ˜{Ó»KƒµèÕ¢!Å‘¦b8c Hìd}M-Ø9zTg4p™Ó¹dLdŽ†Ö5Æ,t`V~ƒO{¤¡VÍº-yRÍ%Ã-šjO€MfsZ‘­2v|—u,îÂe4€ÇñŠ ¾çOÄþX|ä¯ªÏCGl­°‡¹€ZA¼zø¼Ä¿MV$ #Cð¤. ³°F­Ç+¨&ÇóKËñÍà#Zõ¡(QµT«˜.ó
ˆýžçD�ÄU˜Î�Öü×?8ò®Ûî®¨¬X»vPùsµ;Ö†CùƒÇŒœ�vZ}IÝ5C¦<wMWÇ4ðÄ‡ó!'ž]ÝqJ!g‘ƒ]’¿Kî×”©G�­J}ÝVVÞ>¼¢Ü4cÎLzbUÇõ[Á›¯)å¹Ùë3Kƒ!w¶ÙèÊY†Þ¶–Ío¾«’É½ÐÁXîqõáÂ¾çòÇÃ©“½ž	©[Æ?òb(\Ù5®La ä¹–¸/{ísºa£¾tìØòŠqÔ/üRË€�Æ“íºè/ì=²�¼ûV‹!ç–•€›	ÿržRº|‡»BÞDPŠxt„¾ê|ß³eg)æü�œV�ÆA"#Û^A¹‘˜¤qF€�$Ú»"°ÙdÀ�‰b&Bèæ%Ã+£Õ±Ÿò�ÝÈâa¢6›ÃUƒµ‹{À¿÷¢ïn«m0šYÖoŒ–M}4ÙÒ’|ôy|*‘«‚ÙòÚI{ÿºü6 b=‹}ÃÑ6d1y Ý°î»ß=¾±²s˜/§}qØßïU³|gF•®ŽOS—Ì1„j~ÍöÝ;q/^õéu� 5§eZ„XnKÜDk�Œc`LSU…ÒÇxM³ˆÖ”v)#(ÚâÞ&:–!ûéPUˆ�ÓµÔ¤:õáË®>¼eKqGeÄë6(ABO3­cC~™QgTh&²*†F&¤�akÿ[:¢V#U×J³èð5.Ugp+*ŒÂ¢•*–‘ê‡f†¡Íð=Þc(×šª•WƒÜÊú„1^ÞÖ4½½œÙ .Q–Kþ° w‰Æ�etCÀÜ<È(Èa,’©zÏB€ü0­±Åá�š „�V<[M²ˆ >CwUc:óy'Üƒiä¡†ì9¢} ¨^<à Cúƒ08C\ÂOPE²Ñ^1‹ sZ�R5ÁÆHvn}}n6m�†íùùöpô‹b1,	‘”P	úÑº�¼ÓìóØŠªí²Ôôá õ¥‡AÙ1¸èÊe‰Wv5’wÇ½·ÇýŒ¼#‡¢hŠ#/ßîÈÏ_]˜ps3:µ·­™¦åŒ®ïuà¾8îÜüiªfÙŸÆ>¾0°í[àúvÛ¶ïDüÉYÜ4®´¯a�gÐ"DRó9KÀv�œôHÎR¬]­S¨PÅ·z·JÆ›é®3ÇÐ² ½’¤¯?XÂ§)§VÊFÇÍç1€IŒ¯oúêì0O÷ÊÎá%œeÂœhÖyw™»¦ï	xÀÊÀÀû¦¾AÖ;Õ2Þ„ÂšöI’>ôú§g�vz
òž»û_Ða£p÷¯Îè^ãi5›Û÷Ò•p}ßßÏ›wJ„9�ÐøË‰¼lÔ”VÝ4úñW5q™™H€>.{¾C[Ñ|_B­>ŠNî=ˆ^[Èé•r�–úîŠ9Ï^5bÄUÏÎ™v¨éJâŽÕÚ‚á�kã|Àß°8Ž¦Ng”÷NJh´½J°¹®ß,·J¯’Aù”9¸úÛø*ƒë¯r…ÂD—�xæÞ0sÑê£{P¿6_WFíœþŠ�ðj¨èpm8Ïšl#ê)k�Ÿu?¸þÁ!KáÌ�…Ð“¿�Vã{=�ïµÓ“ií3a–Ä3Ó	`„FÚ`vÑi®n`‰n7‚<2nŸð¸7¢unä‰hÏCæ"¾$T /^B¸®dGÞ#ùyçYlÞ¼r­ U 5)¨  ­�„­–ÂÃ¹÷å˜­îì¸ÆC°/Y©Z¦©,ð[,‡rîÍ±Z½¹¥®hƒÏXqEŸ~DÔjÅ—Ì=˜kµúòËq¦W[Yè·$9.Ûêv1r¹qØj”3ŒÜˆ¶m7É%Àé¶åq\ŽÅåbåróÊ2:Ÿ.°G¼!‹DÎ8„¼<›Ë%rãÕ¨×¨ i…Ô^�æ`:ÓX¹ùª¾+Œr:]¶<cÈr6É ÜÆyiüÁüäœ‚¶¯?D”ïE;áx6Á»@K„±Ih¿u�Õ­Ï¶Àæ»aÚºúÚqãV-ð‘ÕÏ6uÖ‰U;“´úýVæù3Õä¾V–¯Z¶ýÀÊåÙ¿ÀG�>Eð;B4ˆ¨Á˜Ú1zb�_h
{b¼Ñ#gúÂ¼÷Êp9â¦t¡(¸×Jãºõôõœ8!¡RY'Î%ÒÉsaX{âD_Ù! "8©d²ÿ˜ór50–.&Ê·Ó¾é‰6ñ‚Û�àìá™¯£Ò9³p:ž�XÌ	±q¦wË3Ï Ÿ�hÏÄu8¸eÝD0¸7D{ s&BŠyf‹ÒthÉsÈ¤«á�'ž7VTŒ¢ü¢l³L¦¨¸•Œ—.ã/!ÄþÂ”�¥.7ªê¿©5î²Ë^¿©‰ãFV×=.H*¥^W¾R«Ö®,_÷0.ÂiW–]öðee+µÜ¸Ëèé&®ŸwÔáo]MµPã¨˜{ (aÛWØá‰80œ=�€€pŽ‘‹\õˆðÂæqZkÖ„—Î�±¸Øw…ù3”V]¤ê"¶K‰�f€ƒEÖòä«J‘£÷ne¥Ÿ*ø¾‘çkÇÜTô7Ë*À©>q{-ãÏÈ•*ù™Ln“wÊßWX�r¹Ì.› ËÒ«à“.õƒz‡ÿß=�•ãb6¹Œ¾9b�çX`-’³áQ¼
ð@Áw�ø‚µ·?qmæÀEp_Ç×ò|#ÈKWÄW¶%eBÊ3Âµ{Ò·Òëeî�Ÿ(�K@Ú–¡äËƒ K{à[@ NÌ€ys0df		—à‰Q°9Áòœ)’ñ8¸�{!º•ýå³pç¬¯k.ßõU}Œ>Ž}µkkõ×³vº@ÓÕ—.ûqÙ¥Wƒ&øöÛo£‡™äEÜ3C^?C�?”G[ÖîÛ·¶å¨={b<}æõÍaôçA¡Ð �¦ßuiÿÐ›‚¡‚×²Ãpõ(u„ÌÏÕiWîÄÁ¯ä2JM¾_+ùëùžX	ËÀÕ^]Œî‚"º~Ç¡@ô)ºŠ<„µMN=ïB´Ã³ÿM-�L!´mL!]´}Ûc@ª�òÐ¶ö¨î\™ %íÁý:ð¼‹¢%KÝ´oØ`¦þ‹*à*•|3å*]IË°Öò@ ¼uXK	{®Ä(|I|á~¹_Á hï”¥qÀúç%ž A_&A%DÌ Ú�íÁÞ -hCxB>ÅYà¿¼­Å3ù=®ï8�:Yì7bzS8?%,�¢çšSµ°·/‰Ò‹^$(3H¤Ý�“£Hç
Ïì$§�#ÚBLà*¨¯f@‘œp–üO €íê¹UF»óÖÞÙ³\œ×@ÝŸ�ëƒó˜ŠàÜ êÆe
×
Eƒ—H™ëÍóqÝÏÀuAöo=«”üSðÛg¤Ê¯DQ.âëÒÅbê&.À{ÆÍ¬fñ¨×‹Öw	Zû§ý%ð‚ó0§× £.7Ñs×?ºÿ?®ë¿~ýøÎu×?sÏÈŠÜ	ƒ'DÇ;FÃF»„±ù¸El�¹188:´ªùåUgFÍ¯_6§m¤0c‡ÏYV7wä™UÖœ£¡'70Ÿ6L6†rhÇÈ+FŽZ¾|TúŒ~†·ŒÚ815Åì5ipMà�ÐVÛ‚šOKZ³Û²s6úû¡Å¾¬ÂèbÐ  —D
³üKûì��;”Óð‰!³fI5kì%¤ÍfàõpoZNKð$pÏÜ‰éø±Á7&€x8"~åéäõÐ}ýõ©3c@ÓqL4·¡§�GK2m¨<J~))¢ígþyü8s_ŸµáóåÀ#öáñg{›Âœ`.žµÚ¨™d¦‚¤©"Jä‚ Ï�DÁ®1ˆãx1"".@ÀP�À9Ó~æ…àäÆO¾ žÅQOÚmUP©ÁÅh°ÊPü¬OÅ –©Ü*4ÅV‹}]¼}©óñJVªÏñ©žœ7Êl¥Ë¸{£›ú¾B5«ó�å¯·I©N¶¢¼].µgƒÖò°ŒÂ[h§½Ü`æµËš/‹È�¢]’ãëÑûª,©lrŽÆ¨TË›kâ2yðdB½ÖHËã�°Õ©÷ÊrÑ‘øŸj£[�c®„êíœ	Ž˜eÐ�ƒc|öÜI¹OŸúý«!ƒ¼E#…˜ )ƒ™÷×Kx�ùƒ2Á¾_”ã$Ï³}°S>L·Ÿ5øë	TžN€yŒ�÷#4¬°IèÑ¸ó <1†BD’Ÿ,5X
a¢éÜyÁ’ $yšR°¯cš®»ýT²½P¤ÒYLÝÑ”P�ê—Ç¿¾ZºWfjÏôzÜAæ½3‚®*S›ÄUs(÷goÁ�ç¶˜.K�Z£!áÅÌJÚŠ&Aôý 0ÿÊç%Îˆò¯-B:�)Nã‚�Kgá—u\6¶¬ß¸~­ß-oûâ_´ÉwSgÊ+þµgôýëg”CÝ.ùf°$ÁÊÍò]H¡x­G¥hýc
…n·üÈ@dž‘ïVÝ`ÈÊËË2¬�à¿]z•¼uÜ¸V¹J¿h¥s§çUWçíÒ+å›wìØ,WâD�ìÖ}ûn•‘‚O¿ñÆÓ¤ Ñ‚ìf„}Ì�R©j5’šNÍ§ÖàÁy�O8ê¿<lHÕ.˜6ëN;@{ �’Ãˆ^x]8!ñD»h"=¬eNþ�2õ3æx,>
I¯·”œ$ç,>Ææ‰µÉðºpB¯Œ]41•ç¤÷ð¬˜Õ+ÀR‹üºKH£©Ó)'!Gâï,Å~%!¸zƒ„}èñ˜< A‘�É
 ¸¿&¢d!ºt2øB˜	¤…&Jd4Ò1Qú•Þ4yó¬A–I@6d=c´Ð2ŸÞ/cƒ›¶Ì~¨{VÌ¢ 4Ã¿© ýÃÅWwvÎÐÃ‘@�Ž›œô¿Ø|'ã]_41½zÔJÔè±ñè€ÆæqKOtT€æÐÜ)»›j$4 +›¿áÓŽ0 KšúQî1±¿sm|ö~2‡‡Òk­œÒã<L¸*3Å{ ÄÌŸ„ƒt<¡çõ$E´4ñouôà°‡ò.T¿þk¥Þ@ï/nþH˜9öñç ×‡ª²ÅÌ™Ù€Þ·Ž`x-˜mô±Ké.¦]g�Ã DëC·¼ò<ˆÇ'ÑAp-:’âÑbxJõ¢qh-,‚
�ìZ«Í€f‹²™h7¢¡,”ó8‚zà‹	bÂÌÒ¸orL@pÄGå}¬`)BÀŒ¢Š0gŠšˆº·¸‰wƒ fáèh"j2G/ìÅÜ“W©KhFI+Oo,WÔ¢ï!H Í:Ûò![làÀœpÏ ö5{ØQ¬�i2™›m¼^SœW\Ð×€Þd�éÇ}ï²š›“-%?ÝIŠ�ÐØ.“gÉ+A(®>5�oZáDnH­ƒµöå“g1û�®,�â:/X9c^£Õk4y€UzK<u¨ËÔL?F¸+ôMKÛk‰\*JÕbNž	fS‹©ÕÔ^ê)êêêP +nÓJÐÆ�5àj²�qÎ�™Ã Ô'$PoŽëaÈ¤‡œ°§öÕ@4æ3F�0F|K£1s4AsA¬£¡H4/)Þ\‰Eý%ýB}ÄìcÄ¹Çâé�×ìyƒ‚4O³Å‘˜ ÚZl6šŒœƒø‹÷IQ"Éòr¢÷c|Õ’hÄ	„“Ñ%PL6»à;I†9!îü
ûè˜%Ï6y‰·d¾yâH;cåEòBäNÑswÁW1¥3C¢I‘pÝoz^…tf&�óúÈ–Ù0›“	Â'ˆp5"íü¾Ï”äM³Ÿ½bÄˆ+ŽÌ¹)¹iò”;×Mœ°~ý„‰“6N™¼)yÓœ#$ïÙÙ7Á™œŽ£�+‘°´„a¥�¦	(ŠðìgL&^o2éypW%Û¶š0}ÃëO›ýf³+Ñ™$åÈž;` P	‚ÓG\Nk–Fí¶h\.�Ëéqp:u6âhÄ¡y´Pm¶šJ“Çæ*TYÜVƒÊêqz6JU*¾¨Èåpg:ƒ!—Ç¤Ö½ÜLÿ&³ÒårÊ¥2™>äqòj½No6ëy­Úàðu¹4vg(ät¨·˜•N')&]ïtjJC!‡SÝF4†!¡H!C3�Ä„'$O={à bî�›j6i–ÑóA¨9CïNŸò@þšùèôÂ<RbÎl\¢ï8Më*•A£R¡2HËY@ZAÅæ-V=o›åV¿•œœ€žŠíC”nÉ3à‡�ó,ƒvë0¿ù56háê°Áâ•@F®QXÔƒ‡uj³Î¢¶r¦*{v¶½*²=ìÎ
ñ&�G™Âõ[|ŒƒÁµ°-J‹öêÌ¥Vg²¯n\=Ø�]™m É#-…§ ä›CA—0Ÿœ
DÿôÂ\ Ç³Ùù«§ÆRÓ¨yx&¸ŒºŠºYðrHa‡ß!ÀCx]Æ9<›–!ÇÏ)ÁQ¨ˆq-Œ*A–œVô‰eÐ©�²žsôB@ðDÏ'ÈèKÿ@TÐ¼"·‹ýBjÊüÎJ�®Êá—|]ËjN�œ1|Ê”æüJW]¨ÍN8�v£ÓâÍ.Ë«ô¤¼ÃTdÎÉ­¦@vqMMAn0nž=«9‡ù©nzÝ‹I<¶`ßóvÍ›·ÀëwŽ¼ýí§V,]ºâ)°µ}nKuéÔ:ð´&~–&Z[ÜÏ‰VøSÔc{ßîV•Ì\Ò<	=ŒŽ­ÿ
çäzµÖhÏ$Â¾l­J¢4ìyáÚªìÖ@]¤¨!Øj˜¹cfêI¨	�Û±áš¢ |‘ÜtžŒ9qÝ'+í,m.C�]£m+,A�m�þ3ÊÒ¶¶Ræ{|$ä¸¾ÿÛAL‘«1êÀôxs£Ã©	ÔQêoxg�øA˜FQ|4d2ÆóZÀ3—�é7O@<±ÑqêÎùBF_ÈÇùx¼ÊEÍ	`P3Þ žC&ôÍ	\ÍèÓE�âÅú�¸txa4s=&û²ã‚ñL¢Îg‘ÿÂTHÖ^!Æõó¸BþyŒøs“'Ø áº¸§‘…BÄIO�‡6H8pbŸtò(AD'¤•Äh!ÑLv…<&Ap;0A¼+Q¥�D†oŠ»@Â(ÉäIyD:Ïh]¦9¼±œêªû"!´NlÅø|X×Ütçöí jú³áQ#³�'§cD.úŒÁëãóúLõ“Ë&o¶nµ6]ÚuÉ¼Ñ­p�Bç°„,Ù²uí#ÏR€iïxk!úàøñ=7ÞÈ¾+ö­EÖ„õ=~±:år`6×f�–YK­÷>qÈzØ|jPø ¥8uMnîË¦{ÛÄn¸2êz$aF/ºKß17~� ;ÁØDÉ1c…ûA©”�º2÷=•©|‹Éª¯³xÕÝ\TŽ>·mº:€™V³¾©ö¦bÌ—üõ¯»o¼}Yšµn�×[ñ–„7®ðûŠ‹}_Yj/»Ìcä¬±ð†åþòá7N\½Ùv¹uØ†-5\ŽÆ­ÔIì~çÄ©§/¡Ç,H]>|xq"ÞvÉñJÏ °³
|ë¬.(Dß¼‹ÿ*+��à©§Rï\Á„ÎN ?¾¯hÊp½Ô;Ÿ$†OÀUU……Ó�zŒY©°ªª¼¬ÎÃ&ü7uj^Þc`+)™ê4¥ÿÊËÑåãU³¦3Ò±ËsX&ó:ãùãt q�{,8îqÅd>�IÎMàL]ŠïZŠï
ïEß MêÒ1åV­œúC9eV­Hê™¾r«J	XEÀEŒÖ£o_½²rËUxv•ëœ|0ü'ü5©#GÈøTô�Oæº|x\Ž¤.¡¶Pû¨©ÃÔÒÞ¨ÒûD¸Kû8ÂÄ‡�éèGKæÑg¤d,’Xoã3.A	Å5 $@•�Þk3à7_É Öàc%ByN€;IÓpñMÎÃðÓhÀé‹Z‡™UTèM6˜õ;ý$õô=­Õ=<¬RI‹ê�R¯5Ñc¦�X6IQÓöÆ!3•;*õŒjž—²­
n^«ÆJCù C…£ÔY°®µzŸA¸H‡’ùåElƒÈEðz@.ò�ªY!­çá©¡lžI ‚û¹%çÑÕËÅYŽ@Ô³2Çæ+ã½þˆß^ãÑ‰œ¿D*§áÔ¿V"÷„­h²”2-0Êeò½»´2.ÙÌtKUrÐ]š®¢ºô—U€–Ñ‚ƒ@­@]�•ñ€÷™ðíÌà£ó–b²ÇÒ¿k¨5¯Ä¨Ô¥ÔÕÔ-â:ŒTBý²¾¸°
ënzÙåÒˆÜ„–
Ën"¾˜†Ž¦Í(E….VX€ñä«‹\I^XÁ+×PM2qŽ�2$éúùE�É)©2ò³Þé(O\"‰DO}QßèÏ
–×ë:ZŠêBî"g‡[?¤kDQ3[]ôºê¼àÐ¬Â,e¸R£Ê*”Ë7í²•jwí‚—ä‡×Æ¤›wù³FF«P^A}AA=ýpQdr×¢šÄ¼™Ú²Á¹3û3<ŸKZ5(à“�p�™öiE�UeRÛ<ÝYÁPSy�EmÖº­úÅÙ�là[´Õ¸D:ûFù]Šå\ä%ëÕt–«eƒˆ=þòáê²’ÒÂÔënEix‘Ü¹}¾¸¦vó’de"<ÛÍó…jøÈyŽ¦Ô˜'þVB	ãœ +éÍ¤�È~pˆ�”c™¬2ÀD`J[œø§ªfˆ‰Ìæ^¼ÌDÕ^bªú²¥Õîzw' ”V[1:k6•ùÏËíÒQ8ð4éWúì9ii{©tís1pÎ�ÑÞWKZæíÚ9ï¡¬ÑZíÐÙ’Z¹]vê>)”wá·gys&Þpß·Wï¬ƒ7ýz¯ß0	ÌÇD{¶sïaÂtDÙêø¨¤]3jAÿÛ%<A:¡'Ö¿úbŒø*CS?Ñsß2é¦Î"¦7ó¢;áªU�†Q¿ú¢§_|·¬fÚ‚(J¢ZñÅ7<´SÑ^æž®ßúâýÇl²_Î• šCÄw¡0…êD´§_‹	Çfü
ŠÄ—ñ‘÷qÜÄÓ¤.Ó40œ:z‹89zAÎÑ‹ôê.Ñ�ƒ p±&M[Ô†Û4M ¦Ö÷@A”“ªþ‡0ýïe2e;q¸¯eäªe#é§„ÛÜ()	Ü­€eœ'h:]9D‰�.´“PNÞª�ÚR±üO:(Ìº¡KW•½‰¾Ú×½#gw”j—k7¹æ‘'·7^#“¬�Èû~MG]iËÅãæ­×�VfÏ’¿P«mÊ-~rÇî—Šrš8™ŒÎý5-–�rx5ñÓ*¼ÙÄlóY¢lâg¶ôÖ¯^@›¬=qšMxÅ$eq§ÖR¯ð®dŽ$pžâ ¸rŠ~cþäšÕÓªæOíêKš×\3LÂsS
lÉ¾É·?²ùo[Æ^„
 c—³R®d­YŽòqõEh?z?£	ò…Mš-P>ëÌÁ�ŸàŸŒ÷ÀSVW-80µ{õ–Wt‹N‹BóDêÇýîÁ[�ü–Áµ|©D©`©›-–�ÈBUËÛ0õ?1ÓD×É ¢X©TÉFv’K‚Rà8º�ë×Ûöõ|dO�2i‰M�Aˆ<ŸxaC<ñŠ™Ú2FIã‘ÉÏ‘Ëÿ(·Éç¦î
Ä^?KÕ&pÂ\1mÎG“ú^‚µ½©^	uý4é£98ñ�r¡l²P¯Ç„²BÚœ�'Ÿ®Êö¦õÈ� ‡ÌNûèà¨Ì^;ˆŽL”�hÚ]äD5#Þ47Ú2uÕºÇ'Âu}O‡¶Žúá/kž[ZÎ5–Vk²ÕÖºæYs$Ô¤¦šq©«×L8¼>9
6ÄÏüØ²À4øOèûIw¼±œ�„¼�úI~ÍyòÐü~4=¡:"`hŠ—0*Ä é6‚—Ê4`±òF¢ƒ)bÇr„×Å#„“!šfžþ"G#jS1±s2Å_F8ê•ßt¸r}–°Éäô·ä·û]FsÈâËu9‚í�b¦Wˆä§Ëä´û�&S˜”ùe!×én¯%~ÄµíÝg¨!¥±a¼Ãëàƒ�ð?F’D¨ã°[ì&µ–·ÚN«•×ªM8Á!¤
!PÛ+æ:lbîmV»©·½ô¢ÚÌ¯›Ö¶ŽsæY²ÜåÁ[þcDó‚¼Š%t¸ÇH¼@`¶ÿ¤ÔÏž u*	za-žN2T_â¾—êí÷�Ò+¬ƒZ¼R˜ü¼>áY-Ê{ˆüý=MAï<ôÉ­ïˆóÍ;ÏÐìÊûSÔ;xÞ�—§>\°23¥¨[Ñ'óà4…'¸óžÍ�y6²d�‘F†[HaÄøŽ,ÂórTH»*µ”OQW/JàíUZ�<¦Ö‹ïpµuB©L!±LHŸö·ÄQÌXª‹P’·˜u†%!â]¹´D´ÁkÕ¡‰m["€º)§ÏÍ\0$’¬R.w•ø`Ð±�sÛZ"e®bEVÅ¸•]ÎúÓ­�Œ(µ�Ò8Á&tö†®{ý+sÇ^7{lyEN¹­ëÊKƒ5cÇ5—*è‡µ�.J“‹Ù`s˜›‹›èZ‰Ï™mWÉ'|³ã÷�ø”öõÃ/wŒ˜;.¼èÑ®ž¯¦ÔÄöxý`Ïm ì˜ûÚî‰Áêi3._º#þêÔöœÊ,·9¿bn“VwÉ~†6ç(ìùìôb#0ÖŸ·ŒdöD÷0T’Ù¾ò™0)ñHò-^øL‚â*KÚÈlçþD?t±0Ì¹èEpê÷|æó‡e,öÇuÀÀO
É=ƒ¢ík¡vêg8b#+¦6™ËBƒ†'GÎ|bÍLzpáÓ“ŠÊœ%ã—îÙ?§ûÒ©Ï”íO”¶äÌß3ç<?'¨—«¨R@¡Fã—;KÛ9m×8§TãÈ¶±åM×îœµbHq÷S3À‚'_b·,lòà²¹÷Ì_aœR>¡¬1d¿~r¾Á�–ñŠ¢Qê|Ï»~²±ï!*LœGõZ<ƒC-î%<2É´«x¢­X´nÅÕW¯ ç<{Õ;dmKQ™UŽ&!h9W!sêDß£7Ð÷�#®w_@°'¤´|ÊÄ»ÃôÓ ¦_­³¾ý÷™ÕoæÑóîPúÒâúóF˜ÿ‰Š>ëK¦Ž*þÎ5D"Ñ’±Šb2x8“™@ù‰í�àŽÐYx
É">Ê!²Œ’~ƒSÏ&¸§�âÑJ‡àZ4O£—Ã>Ë‘º!›�Ù¼ôá;ŸÖ—�Å eMŸkdÙ#›+«ÔÈM£Oÿà¤#@
*Ñ)´�ÞT‡öé=/™ûî9ŒNîð’™W
ª• 	ý¡¨é1 Å„™‡A²)ëŒûúùÈõ_�®¹$7ÏÞù"�± >s‰ZáÌ”�›� áºøJS¨™†rmûßX¸Ä“Á’`’ˆæ¨;o ]5'ôœ\‚§G] Oæ3`T´D�Ãóüû.Ä·Ò•É'13óù0#Ên�CXŸ¹ožÙÇaƒ.&è
þÓaH%‡&à )œ¢ð!i�-{ØÁ`D6×ä¿P	’f§ÓŒ’®‚xIØá;RRw%cÃ†Å’âNè^^n[^Y¹¼•ÏÖ…+pßû¯[€‡¼ðí0-âXE=J0#ðˆ‚,�‰!’1@Q‰÷��8T �àôè <—°OFü©z$â‡Ïù�ÔÜ—CÂô5ãÐ{<‚Ž=d¦ÿLú.BlþöÁ9`iÄ¿I·é}ôÖÝ?¢ùÓŸ%¹›qßóØ9ýˆ?ÿÞ�6EÇŒñù#×Þóz÷‘LxöCß€Í¾ÈèÑw£·>ØäÇ#~!Š?Ø„~<!vŠ³óCúÛÚqÿ_&`ŠÓf}ó†‚­t~5‚¥d&{ZpNM„Wd]‘Ði‘V\WB¬QüâF…‹IDø$’�#N†$¾´ë5Lä™Ò�°]qÎPXTçMæjVÒDIŠhþ�>¼dÙ]Á2t�‹x•9>ôæ>]–¦rÕ°"Þ0|öf¯Úœ¥
–Õ;ÑÛ¬§nýû-{ðw*EXP*sÇŽëpj9‹VÃ8«²jÇhæJ™ÔGÄ;îõ”H[K•Î‡œ¹ñ%£';VW9³ïìhÛô¼J
²ª‡wì«TO¾¯oÏ¢î�ï1—£§Œà…†Ò¾îviŽr½e/gÁ”÷}}?ø\cS[Ú²Ú§ÕÆÑ­Ù5×ï¿ï^ s‹ZôÅ1ëò–8x†�<ïwØL–‚+¹—º”J(?
9ulèÞ^O­rŽNéýp|bæZ[³«zµ�Û>3õŒN¢]Éõ3‡Lº 5iª'OªÝ…úž»$§¨Îùû#ëŸ�Š8ñˆ\Ì|éÕ�,t�ÿ˜�Í'
z²ˆ¼ð‰ãÉ"`ïÕ€Ç4,­{K}ïÆ;?}Í�÷¨^g«¢e5r[<4þù¨úžLúLu„¤ÇBÅ	°Ð�/Ñ8à˜Ô­©kG³V�$ßåÊ—èÍ’<°ðpÚXÖ¢c\½?SP{ÛãÿzõùÏì©mZµ¬hHƒÿêZžxëÕ*©Rkj�JZùÊ;o¿R%U«YOV£VË*_¦_?M¦­ÌºÂvávqR¢Æc =8À££0Ò�Ãj�Yì3žã™}Bð-ÙÓ�¾˜a{ëÉ- ¹åäVTDâ8h»{„ }Ò
e¾îî9“$!³å[Nþæ¾;°‰#ûg‹V½[–eÉ²$W¹È’lƒeÙ˜blÀ˜fºé¦›N€€è$@BO€@¸R)ä›Þ0¹KB
ÉA’8¹4î’\¾¹KliøÍÌJ¶l¸Ü}ïûýãÖîììììÌìÌ›7oÞû<PÙ�žÒ*aOiaZ6Á$H4x¨žÚ±œ€UÍÇ«Q\üÖ­®œ¾NEr/†·Þƒ£IKIz'ÉbA‡h¬ôm¬¶Xª×ù*ÄºOH²üFKÒ$ÄÝô *¼æ«BÁ´ŠS¾ªÕ[š:Î7mÙÒÄ4m¡Ÿ[ˆsÁØî«,.®ôµ�_ã¸¯;ÏKø*+}pºÁðLv%}¨ëé-‰¾i45c-B{
°ãÿ’›ì
wÃ�v_ø
 _°†žu|i$´ôøñ¥LëÒãàuÚ¹qÿ(£êŠ?Ž»ƒ©�q5‚šD5Ss©…Ôr´
Ü@ÝAí¤öQ÷QG¨©‡©ãÔ“ÔÔËÔkÔiê]ë˜!¡LlÔ.Â?�®1Äà–ÐtÅ8J£mv?þ	°:‚£‹Ž¨b€î k
hÜ"ØMN”'†å˜@@g~Î‹V8&#c ðúx£F�2iÈ¼&à9œÉ ¡�nÇ{�I—O£^Ã¸ÜÚÇè:ÀW âŽNL~1eÖŸe’õ§{R²¶hŠ5p�ÆlJgOë“™súäý[ ý}6ÝdÖ‚mj¿Ü¥Åwo²ñ/ë’#n°¿ÍÚìÈX@ŸW½ò²BM?W½FgÃoÕ¹ô“€i¬Æ¼T–©+á0HiáÀH¸•E£dW¾{èôÑGX ~Ìºd}ö{ö”ˆY¦Žî¾ÿˆ¾gftåðuöàüaŒâKœÖ¤õ(úÇ–¬Ëü=Í<¶vG¯5¤±ð>‰D�NOŠÅ¦t­^¯·'‰å`›¦—HÀT.M�Ò€FÀ‚˜-'ÙèŸ=I$‡€Ý¨PÂWØ´ÈY0V3V"åà½¢·ÀØ×Å4h=sFÝ1\ÄU™	¤ðlî° ?|”U¡Ô'EX^*úäÕ“bÆh Vœ
|û(ûîS1¼6ðmZÞöy|ž^Õvøå'¹`K�Â€Ú,,,„/‚_>ƒ_Gî€_�”?ý©˜)eÑgÎŒÞ×Àò‚ÿ�1ï(Òý;úÖ	ŠxÏ¯§¿MÏ¯�ü}ýóìù§Bhñ„*ó˜Æõ§Àôöª¯½¶!ãð(Æ0‡zO�Þ¬GãívJJ<{cyK1˜qA|‡Ø^t�™@K9…#Åù©€ˆ72ÁßÂôeú³ é|˜:¾?\}cþø`í‡GÑ0%S	¯ÀÐ²ÌïO?±ùà\0ð=C}%7ë6˜
O�uL:{gå˜ÑÓpå€1`]ÖÑL¥õKÇÍXƒðc¥¾¨r¸é,¨�wï†'c´AL±ÿ º¿˜’ë/?d‡$èüˆÍö{mX¹“‰Ç3x¡‹Á9O¼C™ü&~ÚÁõ«ÏœþbÏž/NŸ	¯â¶úê�Wÿ{í¹C«{£mß¾¶7[5ó¶§Æ¼sâÄO�?ì¹÷Ó§Ž,\õþ’÷��x‡]Þ!.»gÏØRöÚšY³:*­d¢ƒ·oarrsæ¤3[Ù{VE†y‹¦Ïæ>úš›ÇvÚ[ŒûŸË¡oºîXM@Z!´Å
¸+Výx½•à—Vý4FxåÖanËwud<ôÝê™Òß,˜>8d¿º7²[¹ùÄ1úƒÕjˆ:pBZ‡�Ñïñ<Ž�p	Ï"á}èøÐCß}÷Ðâ7ŠÒÝ~Óçù?ïŽì­*±LamIêFP$ØÎ~ÚÄS›�øjË£
)UJ•S•T_ªÑå¡ˆ2�¦Æ#ê<ƒšMÍ§QË¨•ˆBoDz;¢Ñ{©ýÔ1ê"Xôã$GŸÝ€­×L=ŸøÃ.‰ ã‚ýÊß÷ÿä®	ë³ø[üœq‹€ßXi¿ ŽæèÔ§"—€õo4y^‹¨Èµ¨˜»¯ý½—>Ú~f¨3þ¯B5S•†~VrnV™©š¹ýn‹�#•�~0,ú…ä/îxÁ¹è�žñ?^Ô™±3ºeí/¬]÷üóð²»wuowË$3“Ögbj Ä¨ÈÊ4¤×¨7ž!±*ÍFyjÀgQí;à ¡’9™?â2ß~~¸hÑž„¿»ÓóíÊtO:þ)ìžôt�=‚'ÝƒãóÓ=ìû=þÁCu�Y4$£[žèÏñü:¡´àöŒ,	t†BoE¶Ô˜›æÉç�LoHMe@ÅÈ-5åÅý,Bão;Á{Èî±†½•q^Ì�,f4&Þßvøp·Ýh«È»v)¯¢"<™¢
å‚'ó*À|ï0NØ²à0[ÒþJnEE.W��¿ù:ÆøÐLD¿.£óD½¸8Üßµ?OÍ�¼DP‰I1ÍŸ°ÉWeðsû »çƒ��8°baóŒ…Ëïvà·çïŸzig³ˆ•†ÞÓàÏk6~¾¤œ[~ñðÎ�›Ž�™¾qíDë�>MóÇûËf—‰U†ä^OM8ÙRæÅ÷ÞØuèýÀ¸å6.x~ÿ¡—jËÙT�A™äkœ³øÃMg�zÔÖ‡Ù:jå´‰a§U¯¬¿ÿ¼3×iPéRúÔt¼æLUÅxYìÛä`Œ(¢Â@|R¦¢*Ö�ŒEÇ²gcgñ°@ü
 �'uA`â2+‹—á,vÐ‹¥Ä‡/	D¿tÈUòwmÉßžKbîÅI"”ÙetÒ'ßÄ&êd•Œå{Òìbºç‚ÑDÅr¦RINfŸš$U`Œ>³Ò[Í2ThÓŒNÞÕ…k�ë-èãz›*®FO< ™€±( þÓ:s”«X·½v7b2u€ÂÐØTt÷\kÝ.àÄ7àÇ»t(ç”ç—þ?¯»àGCàß±7N9±5C·tÆîÖÙ%´ÝigCï¶Ì‰gŒS`/º@Ï‡ÀU0>ÚïŽ÷`;lc¢(æÕÈëôñ÷àô|0¶Áv0„•´:Ò–i#!5­a­�Û*:ƒÞ‰0,ñ·ù†ÞO <RÚ|M„ÒëYJ“¯¥)lÇ‰*É�æ¢êÄéSËónEýë‡€`ûOÎÄDo›k¼ØÍ¨C€bŒ¦+õ¿z%089žfxúÈá1Ã†iýÚaÃPøŸp¢_»?¬=/!Uè�Þz2,l…OZõšt‰9ýêë@`ˆú‹�¡îŸý~åîmønCƒN×NPf.—–�l/–IËÍðMø±ÝløÕLX³ ¹\Ü—Kj)EÙu¨%u* bN Óc¾ 7Žì€kg1( £;Çp{1¡ˆ-Æg1�@€\�¼—·2t¨©	7D¸	P4-Ùooá'õ)%zº2ôÇÈ9…L£5)2<:©B&—)¤:O†Â¤ÕÈœœ‘‘Tà�]·EöÝ¶K’êêó¡‘~ýMß[®uNï9Ö\[F_Í¯ó)6TŒÎVƒÖp›H…ÂtK‹u4­Ó¬VÂð<k›Åz^Î²ÉŽôäätG2ËÊy=Š´³<ÏH"Go»óÎÛÊÞ1o’ùJ($×g–”fwd;ƒAgöŽ`viIæÐ!ŸÛ×¹;¶oE´¬q¬-ØÚEIc«
Ù(!"PG‚àÛÕin¥Mv/–„È^;îî1¡bÕMx¯	q°»à"�ˆÛ3�ÿ&»8*¯^÷òŒß|¯–Ò¿iž3åÕ·S^W—´òYb¼iJn*M-ñ©ÕÅ±®¤¨]ßo¡.e¾ù_‹Öï¸û�k=e‚o:ôZÍîüÜ¯¼Â…�ø•î2wð÷§¶Ôñ²/�Ì«ÿìú/×¥¸ã’ñ”¼yˆÔ¥¥ÃyV“Õ2s¡½Öì:Q‘b¾íØ9?Í–†VtXðþJOq{Ì¿æÚ�;Ï„v½’¶yhOÃˆ•l”,oe±'t¬ALAV•¨qÒ©—›1¸ðÊ³?ÃöŸÏ®¬Z¼¼¿9—åÒÌeM¥™*ÀL^wêÂ©u“ Ê,m*3§ql®¹ÿòÅU0ì2‡'Ôzµ>öÕ6_WÓÊÓÒÊ§Uñ;ä(+”¡4%É¤fei«^oÍH“³Ê$SŠå„ò“;üC˜!;ûøç«­�>±èNŸ5)D{ÊŽ!üK·}ÿ ørÑ™Œ Íy˜VÄËÐŒ€wì1ŒHÚd° �…œ”e¢;µÅÚèN\¿×DéFCºhW‰–vÏ€wÏ;ty²µ¿9rÓ¹ÅpôØ\;¿>#£~þÚ`¤)‘„a£�hµôZ›b ÉÑiz³Y¾jq€;~¢ÑÓ\l ŸÐ›S°ààÎ+×rjB¡šœk˜‡£oPl˜‹Û
è)^ã�÷êNA]'Þ®Æhâ}–Õfà½"ôcÃðòå¶.Ð!¸ïokå²­Ÿo<²ŸˆPB�Ã{?Lë'ðEÔ—’
êD¬ú	 =¸éë]*Ý.øg­°›ƒŸJÜÅ¶€Ý}BoÈtº‡&À&Âñ
e£Ô\«ÙE^ ×­{ðâŸ/‹NKÞ½¬†DX9#^4x�C_
jK"¸ö¾w—©ñC«Áj’M{¸«.�º(,¦Íå‚íœÖ€šÐð+MèsQDãQ¬²cÅTƒP^/4Üy5ª€Ø@^+/ÃË'w«é4}âÜÖïZsÅ©å�¨"ú`W%Øß€y·ò†„GIpCèÿÉÃÀ0 é¤:E?kÝºYúõÉŽ+	U"ý�Ì5UÔ@¼çSx�WƒÇý‹úá.â§0pâñ¯Ka›ùø×X}«úíýÛ:¹ØÞ]z¥‘º±I©�nNø6¨³ ¯CºÌ¦‡ß¾uQ'Ò|ä˜”Uý VÙÑ”øµèNÛÒÙ=ä?©þv7ß	9lè&m�O�N¤b¿­{#pÿºÐG^]<Mb–H�dæ|r!¾¹qÖÈØ�1¥‡Á®Ãÿa+ánðöaß|)çŠS¤‹Z6‘>/×ì	±SJV¯¾©±ì‡ÆúN\”*¡‚T-Õ@vfŒ´èV¤ÃþOˆî!hÖ4Rh’t‹ÔLaH\dâ,“Ó€"Fó'aKDP¾öoû(¤z�pŸ=÷ØcçÎwd7b]ZÍ8p`Æ"2³Ò×ïX¶ì:ô"®Å‹äó×ƒð‡'ÔÝHÑÍéÈÓ-2èà¢ï¬sÖ¯‡{à/¥Ç¾h{¸ThrÄ�³ª!CT0b´¡ôá¶/Ž•b¾Üñ¸¿õ£ê©	Ôœ[õ9Ä>‹(^”áö0aêtvêavïœ¦Ø€Å„Q1�So4¡V£x·ÑE
’Nl¢n=­®Â˜zþx´Ï’ó»ëÅ’;¿Ø¼ôãÑ¤ÿ$¦ë•þÜ.	)ö��Ð_$üé1(ßõ}²5$ÓŠEÀŸPÛ”Ø×&þ~FÌ©�Í8úé²ÍÞ«Æ`(1ÕÀ‰’E(Ñ»’Û&‡G"¦Të Â¹|¼á„b,iÀÓ(µ¡(¶¯1µá8ªùWÚõ™‹0w#BS’¾GX½€K�{_gŸS£.îÑ„6ø�g?{iÉÖ›ÆìÁë·›’�â¥¶—v=ñvlTRa€ª³dÚ�Ó–¼È”
��\v§¨íž�‘”ôUƒU7VÍ‹ ý�—�*5}Õ$2¿‰uC0w¿Ò‡AëÃ¥‘Î®C—vÓêE�ãçL¾SY’ï>{º4&ÿé<zq›DâADhÛàîóéàBü‰‹¿>¯~¸MjF	%Û‡tŸ_ŸâO\ü'ó,}ƒ%ól)ñçh¤zš%ÛºZÀ×õ‘yÔI¨F¼ž]Ý‚ŽÕ‡_î'à‡Ç7~¾U†)Ùü<2N(Ä;h-øŽPŸqÂ�ë]µaV%Á?yþy—NµëëM�ö	µðÙŽ�žy[§{[ÈhÜ1r£#Ü}B+:>Ì®Ž×…  ¥N —"
ëñ	Ü–ÑäõÅ7Aíq0ªø·áçêtð#IŠ$O*}~£ñÿ¤ŒÀõ¢Tš‡w„ºªDÏE†	7^¨ š‡ž Ù�í#D¾(¼%òýMó*ù6X>$ð��@p^ –·“Àì")	zAìãGù„Ö%bô>¢>ÏT±^}·Ç;�³Oƒ·Ç˜Qª³;c-/
^ïä#7wõVt	s&íëŠG'*‡-#Á×¦ÆÀŠ¯Þ Q%Ä Ã^M'pÜcŽ¢"¼í-ëWùÕ+*m9zæLÔŽã¸p‘£ý¸£ˆöíž’ð{É‘]�}}Ýé(¢bïâ0}«Ã;ax]À‰ÓÑt—[)ÂÆQè¥Ú@—Ø]Ðg‰Ð” ›»¶¦vÃ‰7gêã®†¥'fToJ•fÈ¬Æì"§R¢ÊÃÛšëË«Ç„*
S?uþ=95Ùj¤UÞ!9Fæ±9§îj.Þ�4½p|í P‰{wÎ”œ†š"Nz(mÜW`Œµ²yØ®¡Áªö`Å°¢‘ÍKfæ?~FßÊm(È‘XÆ0ª†Ùsãré¨í6¡õD#–P2	Ñ='ëì€àŽÌH´©ÁBL"Î-0jã0dïNG”�˜÷Ì�r´F=/¿tãäu Ó?É"Jâu*±¸¨/—^]2Q.Uµ¬¹úÈÔ©�\…è´|ÈO‡Y¦w–/^ÝÿÛãpâ–9Ëß¡‹%œÔžãöóvµÌ%ÛÇÈ(ú-¼¡FÊ‹kB¾‰e‚NkÞ=vuP37gÏÁ«ï,Ÿ°	ì}úûQÎÄ¯KLÀÒ±µZ±ì>»ý:M•ÂÚNœâ�†ü°Š/…"[I}II}{RÂ…ðwïu
ëRã_˜€ÒÜKn°¶xˆRFmX`HS]ÇÎ}G‚Å�ƒ-g(›K�qAŒ…MÐ"‰Ïö¸öqpnˆ“8o|ƒ5R±g¼‰ðõÏ1:?M
�N�è­
<‚/@¹ˆÚêŠU=‹†xƒÍßoZ¹N?äž§ï¢×mñYqŽüÃûo~ZÈ7ÚZ\÷CÑ�·ù¦-™:±O¦¦ýÓ4ÕÇu¢ù�úy©‘	õÃ=Q´ÐW\A†F[%2|Äý•ã	ÜBbE�6RMÂ|uÕóÙëÉ‰B)¹~]¢T  ôˆ‰žu:‡LÝ*| < ×YR-fgg}£ŸýóLºbžuú}ÎaLWåW¬ÐˆR<v¿3A/VK™	ý"¬’ §û„ñ®gïÔ¤”Íï7¨vDÈ‰ˆí»°oßnäç÷GCè#¡… &óëñÝ}¡û?Gáp–.¦cF¢åÂxvÞn°Kp_wÛ}^†¨¼èÐ¬ÖÚ
€8Dÿ§�š ü¡µP Xú@jÎ%C­áÖH+ƒO 5Šª…¦«8}Þƒç¦Ï,¦Ïˆ§!ŸªBp«�áÕÆ=‹¢z³˜ïïxæ¢Zmìh3ªÕŸé@|Ù�Ä‰ÊÑú—7FÂë^àÞQefªÞá^XÇ„7¾ÜÞJ|6�óÞ©o.áÝ9‚4âÖï§ÞOýË²|!ø,EÛ(¸4a+”[Kpõ
^ÇÅŠ&^Ä÷jîDth)ñ¿b!˜72AÄÜyc!‰Ñ$¡±y·ÏÕ DÒ#’“4j˜oHÕë”Vpƒ	ÑÆèŸÙÙ–ìO'GoäÂ ZãPÊéT–Û1;Ù!¾*Í7±‹õÕŠ™9¤t¿Ž/’ÓW˜¯˜È©þô
ZeÁŸènøêªžøêvMOLõvª’:{\Ð~K¢†ß‰änÄì”ó©jj" )À‰è|oÐÀ°üx\W¤èóa¤4ÁI3rXÚ�=1»]¢ 	§f"!V@ð�7���ë¸cÛ™Å.´Ôâƒ´ #â��BŽ¬“8©ÆØíxq;ë[“/6íá½PÄÆá©.°øÇ]ðÄžC«>½•1a€%O0–<¬;Ã,¼A[w™‘*àX•'ò�•Ü!(¨=ïÞiÀ¨}¨€&?Ðã#®^$	^Ñ2)Ým4¡ÚsDÑÂE|g™PÃb»2üD q>‘‰´“Ën.*æ?ÁWÌ¸xŸÈ(Ä»8ôsûDÁ�‰SD<\£ô"€5ù3PsA90�7Ì@·Rì¹•FÃq1xÁodüYÐ¥&áó…]übŒnÊ�Êdb‰‹zyÆa(râjñ~Ÿ —‡}@¢¬8¿€«Š	>»´É>4¤ Jó.]²ÐÃRŒÆRÅ¨ô¼�›2óÛ*F
Aý6Èr¤¤û]Å®eH}KKÛ”¿­J™ûÒ¡ôObÆ†ý�ÆèÐèïL£
G¾hN'%+Sx‰Ì’jU˜,³V/ã}�2‰D5˜NwY8…GÉÐÒ,©JeªÁ›A¬h*cšå¹”Â‚¢ÌùåÓwÞ¡Ï.¶åô0à›Ü{Dàx–¦SfªÑ¢‰Ã2¿wÿ$¥F–-¬:WÁY\éô¥D,oôIy ×š“ÒnN‘IÅ…	þ,i°²)½m°#YÑÇªà˜¯j U™-3ÕÖë¯Y$v�%%3µZ‘ìpª¼Vò’²—.#ÏcNf.‹5£Ðdæ‚$ØöíC}û�æ,ÀKS×¦IXþ$fXúÍŠD²ôMð^uV©JË0R®ïëŒs0=tÚ@kªTæoÇòRZ$áåbµXÇÎ*eåVµEÄüWíÏÏ•‹5’²T0”ÑT»³nkäëüÞ‘
ûÛ7&›$2Ñiy®ThF7‚ÖÓÓàuõbqeèüy Ø#l’R•*[)I£Õò÷þëMº‰k\žíê«a¤#½þu[ÕN^’¬3Vq¬×�nL©”(vÏ\Ž‘žf«Tâ¼GQŽI7pæÌ=3?š›×§w�(snûYšIS² Mçg''gÐÌÁaFmšL*1¦¦J¤J½2U,· O¦ª¡¥}}®œ ]ã”&k9-ÃÈD™Œˆ¥íi-%«}jS*0«“”Œ’öXX­§ÌW£«b%³þcø�R£LR)•–$MñêÒ‡ÍNKé,NŽòá”c’Ø¥±UdfùúIèÂ$êD¹Ä¢Ö*$R‹Õ fžLM¶Mu®LÕ±K³7–)lJehšZ%‹V1Õ›
§Ú’Sµ¬.uåÖ4eÙÆl‘J=µRS¹j>‹ÚrôlÆíÚ®ÓòbýúÞ4½þØâ%ÇŽ-Y]¨#¦,EƒJÆèóÛØˆš]?¼�SÑgz-K‹´ê=©ô:“bû›�Â×÷+4ƒA|hŒÉFCR¬(äÄ"»¶½F'ch )­�ˆ=
Ejj–è¥ºÿR™Ü7Ûï«§éÞW*J”o™ÄJ€ˆÖêL2…lXŸô³ÃîB‡‘a–Þa�ï¯rÙÁ :Ô’ôZ–cÅ¯MèµÍ?Û'—-ë§V¢â×<C	à^%œy/âÏ»›–°¢võYYL’ø çA§Ïý½iË¤I[¢‹&mijÚS:{ó¿=Ü ôÒÖ?Ü3)�Éî?gÕ §¥NßÔÏ%r ž|^¹òêºEÕÕöüüÐ$òè$®°÷èZo¦IÉIM¶ü’C§Í©<4Æ»xâô¡õ½½ij†V[‹½{�ëÄür¥TÐZjöæBu÷T„»Á4ëŠ+‚øv4Ï{Y²Xä;Å	Xù†¶±Ú¸Í³Î èÜ	 ×ˆë�_¹l¢žXˆl|¾÷Ù†Ÿ�bÐ Šq(:÷f¤ç…jµM­+gÕ:RÉ?Õ1T°lŽ›J@¢×¿´žœÏÁ+ç˜&—9Žªs­>ƒïõxÛïn�¬†ø]mêP­ÏQ¦Yˆå5eSÛÃ0þ ˆÓÆ¯_?^í:w.rMP	ToÜžL"àÊ›_‡×b^�£GSø7eè©ZUdäÃ×Ã<Z‹i•×ˆ<Oläk}ª®µVM˜PÅ‡ª&øjY
ó²ÑVúÁöýûj�àdI|¤–êQ¦”Î2Åä=Š`H7±õEû ÄRô("*E·Öúz!ÚÔ½ŒÀöQ-mÿ*�8Òÿ³òÐ�å1¡QKýOJ"þõR0ÿÖû±,‰cW"ºa!(žèµº¸«LâÑÄóünbç÷ëÞ–ê“N&ÈNÁ3:³\ž™)—§hÁ÷Vw&Ì@Ñµè6øºÇi²¹¶l§ð«,ëÃ>
lŒX¥ÑÛÑÑæÙ>¯Í§AGM1	›üè‚­á0…BðÇ–øc(Bá0lEguKP‡¸pl
GÛÚÂ»v…Ûh[!A¡9ãvqo9õ¢‘œb\¢ˆ¤Á#�}vÎ@œ0û4>‡Á‰
B4ZQ)‰?Ý˜Á:>ûuƒ�Xî  vnæ(€±z±HE„~Â¢ØJÅ„±sÔ(êÁ7PzìXxŠ¥@Ü?n;ú£ÁçE)ÒƒÂ4îEøJÀÎACuJë”yc>,Fu¯U÷ºiñ‚ÄZ:^§½«ªØ{°ýP?óÙcY¡Õ¸OBêŠk‚þ„¢3Xt„5žP­£T¸Erè×�n *~)pDü†ÀÏâMÎ0æ˜;bMA“í�¨pµ[ì�¸ºÖ‚Œï	4‰£]ˆLvÜky–Š4a .”YB\ƒÛUE/5 lbK2#M%P¤ŠJ´µ¿ÊvWüÎ¸ôÓnìp±›¥Ðòk©òåð'`ë@»œÉ´¼`iÊŒPñWêš¥8Ä l™%Ìt¯	%ÊŒ÷SQ~Vú¦•Ôpj*±ºì$ôw†�^#Gœ¥ 1iÀà6§ã}“õ"vwå"–Ìbºæ<nc?¤ûÍ¦Nüýi&±tÿ~©Ø¤°šùÖ­Œ˜:f~Y×gÎm¾-YÙ` ýÎ”isV¬˜3mJA³Å²æùÉ¹¹“Ÿ_3�©YUj¨Bì$,8±;DQq±“£·ÑÜ“Eé,XØ6Pß+«éÕ¢R`_PÌ‹'¿4YÌ{[ä*šeÖ7-nªÏ±wùûrŒ¸�'PÅ uwãï†?Äu¶Æ:0S*ˆ{€ñ¨’?E<ŸyˆëNˆ!7±PÕ²¨¶Aú&«©1³6l 'o˜5Œ=ºÙåCã¡oJÚ2ÿ…¿­‡x
^~ò	�ýÈ[ûóóAcb-�›~6ëÕ?¿Šþ²¢³ÀûðuøÊáò²û�òÐ!X·õç‡š€¾ôüøø´G¿cDÝq°˜n¼â-¹´ý&ühƒ£Ë€ÍHpûº°©Â:EG+–n²!….<¡ªƒ�zMhìÄï9�lÂÉbÑì ®Ä@ðÈ‘ø�p,.æïUŒi7ÖeõQåÔj.–Å`)Æ‘×tÊ;¥¾hùÝyAPÆãIØ¸LKØq!Š…þ"“•åzFˆZí¤®c
J�g•™4áÂÚÉìF7eV(¡�Ì`1L^5Ù þB¶+ªòó«òÙãïÚ½a÷]ãû-œÚÌjë´lóÔ…ý:¨[Å²!ì}!bÂ(ËöŸ»à‰8z)	•öï_Jê|œ}dRÍâ*»½jq�lÛûÏ½ÄÛíüKÏ½¿MvËØDg5õZ5Íµq•‡.\jmÀEk6ñÉmd|v4¦MVlq§dvÔµÝ”„_<rä¢Ð&¤ÈM�×œ`Oyç ‹úE¨~‹vÒ™L:|ÅÆ¯¸0ì€ógÍ‚óaG:v¢±p	(M½S×<ýÓ†?=½&•·gÚùî—‰²Õ<2ýÏj˜ìz“›NÓnªß¿¬V[„’0?Hªl«ûºnÛ‚ê¿&UÁòö>ëþzrMZÚš“]×].ŒËÞë?+;ƒz»�ƒ§è#˜‘#JýÏÏøzÆóþ¿äçž~:¢ÜþvvöÛÛ»÷§þÿ»þ$âí®ÿ¬3Ý1›~eöÿ»ŽäÝ¹Ó+t¡„ï ¢J±G;®I	Å�ØmWŠy«Ø¤ëq—kë*ùdÆœ^VX_<:7''wtq}aYº™a#·Š�ÜõTH«ã3:„Í#Cµy•V‹ÅZ™WjÙ¸UÖ•‰?” ;A¡Y|ú.d·7æR]ã¨Ô&¼ODh<*z@ç�Ž	iÝ‰AwñNèAÒ%L
@¨v‘I0ãcÐâÈ*ðT‘ƒøÝ.3�–ÅÒ9R[äVJÐ©²ˆ¯,­êÕœžb›ºM1WÔRŸß«Û>EÆ‰¶N,ö`Ãµ¾ðø‚>U8ÌzŸÛòð’»/{“³2À3Y¿àhÛí™•bºÊ^áÄ�pQº¿�¿{ê/ÞRX—”_ß²d8È¬™Þ6e;˜¸ÎÐ·k¯§	}ãB
ráfq¶ É ÂHË fñÅ¬D	çÎ¶ðã%Ï,™Ä¬þ„m
?sx\•­j\ÕWÈW‹UqCôSé~¾Ž«âmÏlY”¦3MÙ>óq�òö¡ÑúÞs3`Ø»oÖà¢íSLº4.\å‰¶ÐjlýñuÖ[ëËI‡”77ìµ¥€ŸˆÝè�ñôÏëýËÙíS4¢m3¡23ÎÒÈ§©ê‘³ö¥ƒ§§lgËãû@‚°Í¢©ÉØ�1‡×W‚˜%`TÆ;‘¦¹˜ºÏ‰Ì
ðExC†tž#½8*g–š3Ä0Gx{’!w>æ»¢x‰i$ôpláÉ£¦`;fíÛ7kAîÀ±ûfyòèÅh ï›3>>îîƒG­U³4V€ÁO-Úµº¢H¯MÖŒo£K“Œ¾Ú<'­Œ’)mºê™?§¡Ëñ£%è{[2p»—÷õ¸à;áí…>Îº¤¯KºïÂ>�e}ý¬}š¿î›�Ú¸Õ0ÂD¿Õ 2`÷TIHë‹nP(°A!6œÆ¢�äˆ2Àh®‰k}™UÊ3¡ÚYµ³Þ¬È™¡t#d}séû|µ«í…ð’'ØÏsþ|¿\ñP_ö ÍöÎ¾GÖƒõ$ÐéÄ¯8;™üÜBhŠQ×",Æ˜Åà†{5Ék'Z±UÖ¸ßš8ŒÎ~­)Ÿ—A÷^ÚRÃõ-ð‹è§õ-�.fG¦îW¶Ô‹ZÇGëE*Í.F­‘zÓ˜P¤…ÅòèðØÌ.$-Jƒ}«& ±\¨V€ò¤T¬Tnv‰¨’ÂÈßî?a�/'ïn©·-{4¼yÊ�¶ú–ë­`Ê¡5Œ¢Øe¶9<ú4—ÍeÎUæ–•dªT­©Î	U6³‹?¬ð¤¼AX&æíŠ¨Å˜f¡5?Mäà�A¼¥€Ô6¨eb�$ØdÉÁ`ít“Ò%Qƒép3€`¨Çs¾b3ÄÁN‡Á»ƒnÓMSp‹ùUã5ëG[§6C¿nØè�ÊqËù•Ò€± ½0yæ¾Ò"ÈU�(t•K\³SRî*1ÌS$AW~³˜gÅSÅÅvú¹ìtÐQR[Œ†êÙÐ †å»Ë%‹Íû˜ŠÔÄZ°³Ô›gŸ¤XÇo‘Ž˜3c(|œ:cÑ(é�ã“�âsÔV™lÏÌ`‹nðŠÂ®èHzŒ« *_¥ˆ~îuz«<J9L·,¶Âù¶,3X™Ó§¸ÆüõŸX ™
­,¿ºÀ­t‹RYPÛóÅíê%$S×­)]¹àdÜáK˜„ µnBî¼d&èšn&|º˜—)üÃ²»{²ªŠ
ÄïœÑÁ�K*©/¦ˆ�~4YôÏÞk”N˜_¼ Jê„u–qêæªh‘@÷ÎìßkßŸmÀ†ÿ84@
†ßñ×"˜b -M“/gõ.É,Çó@hL`H­¯‰.	œ}…îkÅožpyñ\¸#4T ƒ3ïqÐŽYûÚcvhÂ/a_ÜI¼ØN¢ÖO+‰Uôi˜˜
S°V1 ¯‘O©!éD¦t%C°¦Ô¯P4`ýø@|úº&ˆµ8CP_ÜÂºÚOV*€—^œ¸wþvÓÃÖÆèÔYûþªÙ7«~½EƒUŠ¡ï’—ìåÀþ�¢zD›ªž4:f±bƒ´Êƒ¢�HB•âkÓs*ÞDT©6tFY•é«e-¹}e#tÛ5²}CÅ¹ýÎŸ÷ôzà¥BûêZs›©âèÉ	ãàã#çìC¼½8Ï3kßØ�¹0!†\M Ãzô`E!hÐ›=U›Õê­~ŠÃVÐ¤ÕU€Æ¤èÒ¾ó=Wi¦»Ñ0­tæÕ¶ÿÅŸ†Õ4Œ…ï¸<}‹Kñ¬—±¾ç«íÄ�áŸa)*™ð�†[kî9�‘'±nÆõJG'âØÇíòéàPÙ”Ö	˜0£u
ø¡V±Y¡ƒTè´J&Y¡c•ƒ€DªØ$×Ï«bÃr½ä•< •oVH%ƒÑù.½äŠTÊ(ØO$úí
-Ó¶D¡�\ çjK”Z�4R¡�I5rºŽÒéÀcÑ§å©TÉœ–ktÑkI)¼CB‹uš¸ƒ°¦–PÙT™`‡àÜ8øM±º¸™.o³ ™0é›$TÂ	Þ0aµ½íÃW>P5 ø¬X"ÖÝ«¿~P«ô ]áàˆÉ#jDyðüñ�%KÞ j�Ô$ôÑ-v!˜ÊF»~3ð2ÜªQª5`.| çƒap’Òî›>nw†”ñ/yþØ#?XÛ##J¬w¢5ÄÓ(
øó±‘š ¸Nx£4ìŠ©q‡Vàìÿ^²›š¦Çþ=~³R–'Òªe,«Ò§X�ººÉM�}Õj™J-ö)TŒ:××�·çw¯3r”Tš'Öü‹¤»ßxÝ}scF¼yóä7kµ
–V0¬\¥”óSÕM±(•2@Ëëu¬:-YzÇ®S8•’ùW©ØÂ[4;0ÜââqºÑÆ·r6¢SBIXï–€€„qLÀ£ÿt&tÑ&úÈ#M ´�†ŸÑGè#Ñ&tÚ í4°7Á0Ý†…œøI†£Óp¢X2üØçM Lu“áwºéDo2ñ`
¸%\À� 7ß³ëÒg�
^mlm‚W�)sÔXÆä‚7aüo`B±À¯fŽbênQÉç°1Jã)”?F�T�7Ñ£ÿ�²;…²C6‚ë·è”XV}EBq¨œ:Êó²Ù—†zh¸»W€ø®*S/ó'ÂÄW
I…©~F,äÔì•€ °ÍUd¥ÅA:®É«³+‰z:–b�´4'ðÅ´�¨ÍØ‰ószkÀåÜ® ».08q/8² ý±kÔY¸àH¤ïÑE‹�>øõQvÝÑÅ‹Ž¢‹Ègð¿OÝ~aÕª·Ÿbƒðx.¹°ì¨½çè¡ð'¸»T «Y°&7(™w ^;¸ñÛúüÙ[ýÕ�áµó$Á\0w/¸ï‹6p'�"¼>@ã·û'àw.X HZÉ‹�ôûú(Ì«�jÕÅö‹«XÙüyc\X²èý{'Dy�>z-Ëz×xïyé>xmË”’•ÆÛœSìâû^ºÅO]Ð‚úÌô{€ÐEÖ&`�è`Ðw)ç +ÀÉySLù­>cÊå¬uäa=$+‹h)V,²¦7ÜR°Há¾Ö¯a=ÈU°ŠÌ<÷¢35@fµÊÓF¦õ9N‰‚i@6àÝ…î¼L”DšQ²súª-¥crºì¡‚z	�¾ü
Êé—W^×�·~ý¸ñÑ‡Sò2²ìÉ5†$…ÕZ}þÝŠ#q~†šd{VF^ŠÞªÔšY¥Ãlô&'›µJk~Où© ÑV�ïÚ{€ˆWÒé®|ÂšG&¬$„�d¡]¢£¿8ŸÆü/­vÙDj£í&ññýã7Œ¿x¥½Ò¤®Uë–¦¤¤õÊ�3û»Û{W¡Ñ(1–O-„Ž£ñTñöá}2û¿ÿþÚk@N¯H„:e Îi|ô}—,NÊÌÐj“¹$}^¯\Ÿ²ø®‚X‹ê„,_+Vúr{-�¿†sßvÇ7d/ zk¿ux‘C4¡9ˆ9/ïäÈ% “¥VŽÙò<ýäSðô×[Æ…èÓù°ÇÙ·­ý_…¯:<…}3À^;[½þlýzóæ¯Aè)š�ë¸dÇ ‹…}íðà·÷-ô¦ÃUö˜Žú½ˆÌÀ}ŽØÔÆåsQºØå³”´ÉH™°’:�z›�3
\D½Î_ì+B«Å3F­	xh” &Šç>„—“áÏ•À× ��4Œ]œèþî¡Åj3¸=/í#£îÃT×Qôîc°Ï±Í«HªžBwë‚í_ñàEeÿ^fð [ƒÑŸì3èç£76 N3úwŠ�ä\â"ÚRæèÙ1µÌvƒ/}}é"�O{<ýþZýáÞ@!Ígˆ (¤ƒE°Ÿ=
5ÌuW¡ ª’ËnïÕ&àiK©$j!âjw%P<¼òT²<²N=�±±Qû£Z’UAÙnÅ€82Ñ+²^Ra>?€1	ÑE>ñì‡9Ý|².÷mVìå
40�Ä»ÛlÀ<kO6»Ò‹P¶$K6m�ÈÀ£üòÛ&Ðw63–dVÑkà'ëÕˆ!õ€�o=’t
4Hè‡ÓúJe\µr.mOaÉzý ¶*Z�Ò©úW¼÷¤[.sÎßŸV"•±¥Êk>„—àKðÒ‡kÖ|2A?�ùág·˜`èõf.Ž}ÝW<wÕº±¢è+ü¼•ëÇö~û8­U)¤é-‡l}P–Õª™´ÓÊ*R3™ÚÏ7¨9~í€>çFµ\¤“Ë[XQ:®J1·D¢Õ~ºNNã*(|C^¾&±@ôÚÆG�ØÜj¤Ò1:À;kNú\þ	0²Æ…fµÓ¨¥Åp?íÎÀø$ˆ°0·ÿø‡o—GÍGàß½ð»0˜‡�C ã�¯/À‡Þý®Œ™zîî¯áßÁÞFÙ4XÒ~òdûIE¯Øôƒ[òð.ðÈý�Ã9Ñ™wïI…åöë`Í ìƒ§à'Ña•ôüõ b©è$~�+÷/îm²›`£Ü.-¬™ QðbˆÎ'Í›Ü"+6ÂXJÍƒn+ÀfA0¡²³”ÎH+Ël†_Á¾sÊ´ýî�!“-Td¿Ø¿žO®õŽ«dÉœiL‰j«Öà­ÏòN¨q–—JÐòÉ˜eîýèíOÙ;;%GÜ'oÔÔÕÎ; "),=â�Kðê
ä][†ƒ¾ g<üFÉh†.¤ó~ß[Œ?Àuð¦é«}r•¤ð¯›fË2h^«3‡ÊÊsÒj¦ûÆ¾û„Ë5¬ÿq0fþ 8¾±æuåÄ”¸,'†ãü5²DÅk¢ù)@?\˜àaØÙ^è»=M üZ_1í&¾µÜÅc¯„ßM¯Í²£k§ýÁ×�ÝÏ>šª|þîËM¸o<Ç<
Áƒ¶4/½cé�·Þ<°ló²Ù›ïá,óv­ß¾={{ûø5»æÍYÄ{~ Õ'ŸÃ=	,‹\k…�­®^&ù'0¹tXåíðDl}¢FßíG*‡òQT?âïÆ.¬ZÛ‚K�
‰u-Z§ˆÑRhu‚�Ì0Ž‘!$7@d~XÁØÉ¢ÅŽµï™òxx¸ä+xî‘—ýò¡ïó4ãÞúþV^ÉVuãéPóˆ‚ÚiýfŸ³ë¶wûz¯¿9iä¢{V<ï™®Ñ—¸Kwïø#=ª¤`×ã‡ßÿ÷�Ã~Ñ‘Þ�‚æ_†ÀïÑ„3,1&W->þxjØä~ù�ÎßÜ±jäøa>Ýt–x×k¯Ååla^ð3‚qn¹«i¸i¿Ð—¸1Mé×ÉŽ¥HØÍŒÚ Ùˆˆ��ÐµáKQ¨j°1$aïg2g#‚þK|¿!ÓyÊeDóâŸQ¹LxçXçÅ{i‚4ú{{V§¹£Ÿá°NŸ›lµ	®¯Ñ¨rºî|£_I†GÉ$iu,íµ–N„?TW³ß‚bt*xú‚æÐúìA�•u¶ìòt‡AªÕ�è�7¨ÔëÐ€Õ\84¢déÆÙ‡&ŽÖI~ûXsu—„lÿ¶ ú0eZÞÀ~…rsUJõkG�žìÊ
)ä2S~¡mê“ÂúVyƒân#ò’~ÔcÔhVåˆA+�c%î˜YYÄá Z!ù›­W1Ó“‘Óˆât’‰ÏAò1y51‹+A•E¦�8ì±à‹ICo.Ñ·Vì3ê±å['—�1ê;‹ŠSÍv2Q�ì:pôØ½{æ/fËÙb/´–¢é“ÃvÜ½1<I$UÉÐPUa°hTRI°Š“ªÔ´V\U¥¶j"¾²RkMoyò†ÖøÓ‡õ9* ).’:{fÊÌ=»Ï¿¿«ÌoQ©ÑjÏ%kÞ1 óìþ¡yšžÞT³}Û[g¶ù’h±Ôn4¤4Ì\«5rd®òÌ]qÛ‡õCó<i™Ì¬�ð³¦…÷l\›¢E¤O±îÑï½C&Z…*ZZvÍi‹-€ÓwÕôÉþ’’ *1Ëèœt)±´¼ŠSÓ*%/­¬R§j¹ªJ�5eàÒy3‡Ö�WßÐlçS4jË”j0ŒÞÒ4ãÜ®ÝçÕ²"¯˜aDwÏ˜Ö¯ý€F8¥OÍ¦§&¾¹}Û6_:-“HÅœIE?¢2Íƒ©ÙÃužqõCg¶€ób½ZaæÇf—Jó“j¶4T†ûLêJô¹c�©ÅXÂæôõh:p¤{°[`â”ÙÄ:ýNŒ6ƒ84ÔÙ·¯¤J&› nüFŒÙ—†,-P2d›ž_'1@´2 'Æþr dD*•Q¥®ÝÿÙÒe?<sljº˜I\ë°xÜ+ÓèÓ½­Ä�¯ávs®.ˆ”b	'Âú¿¢YEžUpCŠÓ¥Tü)s°N'Sº–mÙ±¾9XÒxûòmSŠé£D†ÞÅ½µð£Ü1«ONŸúÀ¤ÊähS¿ªšáVe¯æ¹•½E¢T�:0´Oapì’ñY•„ì’Â§Ff~ ž]8,K)Õåí7òìBTpKÓê/�¦UeËdmÎAz½ÌØkT¦¨`ØÝc‡o_“e‘Ðk*m>Úèl¤ô^:§¡°¨fü�ôèá‘ù¹ÆäÉy%Ðúü‰�6?a2Gy‰†Öì›Ð8ªr—mngÈÃ´ôÅ0.¹×‚~é¯X«ÇŒµˆ‹î˜cpD1±N70%„Ùp{˜¡�‚UWÜ¥¿Ò„ÉoSì(Ø¢…	áv-6=¤C=s"Ání£"^¼DƒÍ�8'±¾Ý¿ÆýŠÚŠE“BTPAEˆ U!–DwU�IôO¾e«¡p$žFý€¥Zoª³|ë†ªëÞ'Üˆs!}ÂÙqæ"T¹Ó÷PÌÝdÔÿŸµÃ(leþÊ+‚�ù«¯
VçñëW^‘DlÿYÓÜsëì:¯aÛÿ®½ôh•I•`¬X‰ šk¥˜µþÿUq&HIÍRØ&ý
êÒÑôŸ5ÝR	°	‚r#ÙFËþƒÆ �<ojŒŽ 25ÇO	Ò	ÐjvÑISüè2_'zò"ÊeŽl�+]f(œ:„xtäŠ¬°ö!^G¨¢@§œ<~à$;%�"#?xmC�˜}�€\x6Â4…+³ëœÖ¢}´ª¢ð+è»ÙBá6È�Ô¡{çvádËdšNô�?&s”“èàT—¸¥ëca¤¦x±º¨i¸³‘ÑûRévKf;±7¥C‚U*•i‰¼U†à¤µ·fZ¶“”4j[ö�è«o·`@H‚æ2‡,WˆŽ¿™i ÂPrœ¦µU�·‹)®ƒèã±L	{É<¹�\\cÚ@ÜçôsNãDÿ:ó_ZŒÚh8))zoô^©R§A—4º¤›éf[Gêh¢ml[´�ûYooëmüJ&ûåN¦·sø�KÅ�é×ì/Šéeö—ö(ûËåi¢lXƒJå‹Ï7x£–´$*�ý1ñ�p<¬p±iJ¡Ó@/F'ÐÆ³ßv»ìxD,¢)­N!At!f½=¤£Î£Cs»^p gsƒ’êÚ“Î àÏß¯±ñx˜cû…b{xT‰ŸíN·ˆSÌ@�`%	¬êIŽSÀ»ÝO?Â©Ÿ7íqØ^œ.×3lçTÚUf¥ŠÛõð�à>ð-¸�®M€õþ€>/?¦}¼DÊ ¥LeäìJ§¹  �{Lôî'€û±Ç:íyÊí!ˆ®=lƒâg¼w‚ÆKÆsCü8æË3üjÐwVË©}.¿»”àÄ'v
c·¬ÙUØ½÷ºQ)Iž{Wæ”ö-Lyÿ}0W¸_í›°½°’S%±¤´œæYIVÙ¡g»Dô³7×;¼õ»;ZÞXÔ4vhÅ—H¼õ; ýn}5†øÉ>J1¢3¬šU!¶Pì3•xdŽ¢}ë¾?1mÚ‰ïÉw”°÷ÔE””R`*­A �36ã…è?M~hÀ�îèIx‰Y=	2ÙÃ8L�—q,‘6Üh=Î…ˆºPŽtÆÅÐØ{k0fõªÖ7?ŠÔrFÑãRøü¯¯îšœÛ8`„vî ¤G<÷�˜¸Ø”kTzgL+V”†–ƒaLûwp
ø# 
ˆê&îÉ¼S,Y»~>òúo~3b«Ü!w®cE.ƒ” kÛ£³£,¢Ú)¶ü“O¢›>ù”£‰�Çèe þ1z<ï×ñgµT%5"ö<O0·î€;ÚæÐJ7€Õ”c  Ø­¡vZub�oÀ‘Ž9éâ |DIÏ§±£•\,.³M^›–<{vrZ­|¢ÏæƒûlÉà	GÕ€Â�šêôREhÝ+âh N¹¾±,#O¡—úyŽ†ß›†™äÊ~¸øl«}ØÂäÒÒä…ÃìMMGmù†@­S¹èöa1\§”¾q¤ –•r`}X$bêSRRe‘ßŽDK!F.¢ÅÓŒ¼Þ¥”Ð’‘BÝ§„÷{†b/£XÏ�lÈØb›01ˆv§.LQ-ÁcÅçdX¢à ðìBæàGŒôØÂ­õ‚çAWZÏS½ŠäáXw^”yƒ‹‡�èýÈZÌ$)Áí€œ`cãªQðéf�ûqÙˆa‹Ûµª±1XÞÈ ö^j•e9r$Kf•Êd9÷Lhœp�qÕ¨Æò`#ýtÙÄdOÑAxmÿ~ >˜ŸŸ<©¬aIÅ½RZ¢P3C�y(—QÁ�0SrOùøyI#l’YeRivff¶T*M“åI$E×ðËF­"}ºïZô2j—,}2x
k:Ø­êÔ‘±~”( ¼ÝïaóÑ
ª/P�Øù {¾óæ7w3ùÃß®¿‡lõgšùò½ÕôJ±-8¤¡ÚhÜ|ýÍôW«¿ywïÈ?¼ùò�Wæm°™ûxáæÀ@Ú_š~÷>¹÷ú	ƒV*1« à†¬»'Þ_‰n½€FŸBQ¨§ÅX
Ü!±I'³ä•Pª®!q`3âQþ�âltS«˜ƒtbÂ‚¸ ¶¶ª	�º�/»•<¿;É–î‚?É ñ&%¬yD,eOp8jbØ>¥È
”@TðÑÀŸ·ï¾¶cÄÎ·æ­¿Z÷Çyðþw~?º°zõàúÍE° †ègÃZøÃsq	ïs€Çn¿ßÝ´Å–'—æý2ù�;®íš÷ÖÎ·Í¹ýÑÖÕàGˆz ,>¤ûÁ#QøQ­„?_…‹� bN‚ÚÉ†êÑÃÓ�áìÀ­iˆÎÑvÀíŽÇŒjöö~ýîèw`”GS™^`Ý=‘O3c¢ÉM#�!ôšÈ§t¯xÛ„¹É~îí¨£�ä�.k:Ã¶D!š,èŒ®¿?û:ÏAÚèÕtú$6p9è˜*ì> bi(ò[énÏ ³A#œé°ºI�þh*~Ž†[Ž´Dqtç�“ój`³çÚmy.Ã µ¦7¯î—¢­Ñe5/çÓÒê6u×_TBXa¶Ò?ªÕ-t:�ŸˆÇ¿›U“Ífr¨4R•Jý�J¡’o€áE-±„Ñ-jÁÇ#é«³,�Ý*v£ÉÊ¾>ò&¬$Q?ã°—.;Qø¼<a©U (êbÄÏÀŽt%‹Õ¡±ûG1*l‹%¼:ò�Ó£Ö¤™Òlš&Ä©ž¢¥d“­,×cqku&Kn^¼×xg#VÚi¼ÓØœ”—k1é´n‹'·Ì6Û09ˆ+œl˜­±¡|4j�“cSÓ‹]âVŽ•jÃe³�A[†º)ž¹VÙ¤Oñ»êÜY¾Òšôásö]Ø7gxzM©/Ë]çò§èKû£¯Ò¿T�af8g—…µzYwÝ �b;áIˆò¥Æ6@^ê¡Ô²zHI4Zèç×Ã!ÏD×Ñ›o¥­lð€}!
0ó›'˜†\FßÅ�¸á2j5‰ø v‹âøMxK�UM˜Ü»…-~¢×å½Cðg&Á<~LívU†º3
‹� š[íãÕ|V’\žf‘šV|°rÓþ9õÆÜ�©v&þ¬qÈüýoßÕñçG<³7‚¿ýkZ¼¿}’)+Ig–kû÷×Ê‹+´“ µÉ”eÒ™Ú9s´
³9¨ÏõšhÈËO²0ÒRkÿ+ß_±ë6Ë`S(×X»÷ÂÞùƒï:ó×G÷i|áKøÛo’_¾íÉv…¦ÂÜèfs0Ca¾«&½•®ÐÍ¾þÛÌ­<ñ7(î
Ù‡Ÿ‡ØH2ëá±*à2b6Á‚4¬ž›ˆORÖ�·ß}qÁørdK,¾ˆWS+c²Š¹+«ŸY³æ™ÕW´ïº:÷…•“ý¹Ä’7lVCnŠØd™ãÎ\´O›çŸ0¾Æ¢Z|×Œ¬¬±›ÞZ±üÌÚ1.kŽ?WC‹tæâ�E¯jt:«§dK]Õ«GÕÝ>¾¦ ]'¥£×¬=fÍšSª'—Îî3rxƒW©Ë¯ôf8ò{¹•éù)VLo0çåºŠòÒ|`ÌÂ;&Þ±~RiqÃ¬™^OMNªTªuùGùÕ: ‚ƒ�I.A¯ÔäR(ÐÏ_ãM´Ãì×oÚ=pö¸NtÄM·j•7ÈÚ #è~îés»‰&#¹K(ƒ=<kwñr‚¾M€XÓwZÃS¶ P{Ð¨�ÎD_i‰²†Ø5�ßÝ¦™í»vµÃKè~Àehí*9p=ÞñÄ®öÎ§w+zB¸ÿŠ=ÞÔ’Ý\˜‡s ­¿ÖV7µÓ£}þiëm5ÿUkÌëªÏÿ 	zêG9©rÄkèˆA3�Wˆ�'ZÜ‚|ç¹Èˆ…C‚'<ÒFBØo3Š>q0:]êõpªNÇ8DãG^>’ÉHY4á•œ×»Š]ˆF£#†ã
Ã·,FƒÁh¥LÿÈu†O²'zÜ´ÿæ%øžÀ*¾ÿóÏcvvød E½¨lgð•â:¿1hîr3Ä5kg¼äFa”t†u~¬ãÂˆð¤çŒƒèmÆ>ÑŸÅz±9q”LŸI)U‹Ä<”g€x‘
_ƒifm£³ŠñÑ™Ž`ÇÅ.Ž�›l´£8Ýs˜¹dgÇêñ¦é¶�yXÐWxÌ6Ý´ãe}óÆ°_("¯/ƒ[0:ËÓ»·‡Þ‡‚‘6:ËŽ˜l–6%§‡PÃ,4‘æé
P8‹uà‹,:�ýN/6ÎÇ·ç7Âþà¾Ü.AýßŽúågd6{Èr0xóËÎØ‹LF"\bˆ6(êŽÎî%DŽ”"`ÛFžñv†pÌg!b`	Ÿ_�€J*eK83|q(ŸÔ¦–J˜Á…>W‘ÐÛø„R‚þ!&)Aÿ¡|r›*–2ÂùH°8ê®µ%Ý äJe[|MojP?£C[î�8ž‰Ÿåraý9Í3{cöšbqoâ5&ž‘0ë
4þ‰µ%¤e“©Ù³wïžõà<<Š`Á�ñ [ÇS7èß‡æ?ýËéãóCñ øÓž½Ì¶½{"“ÀyP„þŸ�¢nŒ‡§à)ô hAcõ­·W®z”¢ñZ*„…±™yƒb.u–‹rÜš€[‡%Xq�èá�£605úüã°n›²è”'N€y'NDÿÞý’~^š–€%sà%ú­è—‚]ML×Ëc²¨BŠê”uJ�DÍO‡¥_D~ˆ¥_˜8³±;U×\W×­#'¶îs©o­¢£MgC=PÁÚÈ9Ú»óNWÇ�äu0-ì×ª×¶£NnÖk9tz9MäFÌ�þ¢(÷"‘’¨QIS±?ìöE—@!&Oþ"€Ý>H@!›š™¤È}Z%?œ£÷Àç¢?¾	‹ÞqÓx¥6r“D.ÅL0"¡—*r 8"��ÞGO5E7Â÷9Šè�Ì?Ð•)AÞÖ†¾Þu)Ä~Q}@lÈÝðŠ Lrz¼\Ô'ÓåIÁíž,Ð\zäÓ·yëæëM ñÚžµ0“`„§Œ†ÑVœ+ÓÕéÊÎ­xFGOù_ƒC?Ò­mÑã2h0±¶©~ ··µ¾|lúšCŸÎl qæ§‡ÖL?öòûÂdÇnˆËO„u–ŽÊDü€`ómpøtÄ™½ëGDýÀÍã“Ø‡Vfúë¡·G3‘H„ù	>F`µÜhã–‹mpÓÀM6±\.f/‰Ñ’íE8‹Þú	:|12Ø‘92È^
Ž¤„ÃÔ�5k F? „päAüÄê±ÇÐ˜wd¢<Ø	ûöíÓw=6²›ÎJž•@lÃ^”°¶ŽÉÊâ}SCG»mr�ÁÙÀ”´‡fÂÍ%[Ï§gŒ–ºÝÁi�¾\	›[¿xÑîÚý ù,ƒÞƒu†õ*óÔºÑ0:|Wïl°rJ…ôi†ß·6ŸØû}þwï,Öi2ÕÖ´œi&×ˆ‡ßy|Ý[•ˆIÏ0”¡‘¿º÷ºC÷^ymÐrò‘¯ŽÿiÙðá&ø"H¥“”´m$• Û–Ov°ˆ‡yÊxÖæt)É^²’Fô•(  
ðburoQ ˆ¡ïi7æñc#’í±é‰RÔs­ÂM•ç™aüv˜óä)æ×çÒ)f‹DjL–(sÕb¿&[ã«s•’d£Tb1§Ðs_7Ãç‰€“Þ:ÿUôä°ãÕùó_°îUXÏÀ/Ï­XqX@	°�Ð™[­F§ˆ‚AQJqžÈ#?üéèþ†ä)›¥ßº|ùV}+-H6ôýéa¹Gt”ˆSôxÍYq~Ùã…°àVjh¨×W#úýr¬� #1‡!«�µwÇ48Q{¢n/ò ¢“‹Ñäæ¤¥i=(
�U¶-Äz‚FnU5—Ë–g‰˜ÜRÆqw`ÏcÏîÜ4ýŽåñÞgí�eœí¯æj+ø6C®É9eíinÞ33òÑ¬1[w½º§c×â­½ÏÒ¿ôË�^Î.LŸ\ð¸xÁšK÷Ý1mÓÎsãî\˜rGýÆÊU5¦^4ñZø•!¿OÑ·zðh3Î¦ýµò­‹wµïyeÏÖÆ¹;ÏR=}ü&¾àzøøÅ(¼’6»It�ùÕ}	|ÅÙ÷Îì¥ûZieÝ²NË‡dK²äÛŠí8‰'ŽsÇ‰ãÜ÷	9Iˆ!äà†R äj€p¶%Ðp %”H¹ZšÞ¶”(”¶�hóÍÌÊŽí„Ò¾ï÷þ~ß—X;;³³³³³ÏÌ<ÏÌó<ÿ4ñkA`‹ˆ6KTV2�^4¸¡·"–³?K/ÏAïÇnyÜµE!¯ËJbGÂã*/ž˜¬»JƒZ±XÅðë?¼êý3Ò¹Oš;÷¡OCBpë`¦¸½·D8o¯r[Lf§žìã5ù«~ƒÖðV;Ìõ®ƒ·«Ž>Qqý‹•žÄJ£öŸ§ÙÉD>¬C\K7¶‘í]ÍA-Âa¨oy€@]";°vésHH¤Ù'§ðØ£&�°ûò!€zX¥ˆX5¨ü gêÔžNpCM£Nº•×14¯^4ÚôÚx¹ËFÃÙñ~Fe2ó¼à1ª™è›Ö)­^p?Ï#fJZRÔ™—àÔ1]öµ¶�Þé¡•j3·Rú%­ i5ó‹Î!™ÎÎÌ�¬?î­àˆ†‡´B{½´WJ-´sv›¶Æa„“Áþ{>ÈZ i�9O?ºÑW�ý«¡�ö¾'+ÒÓ¼ÍQãJ0]z¤LÁBVQ=>„Jñ}FS*)Æ‰FZ5âžË¨Vjµ	Ïp4›ÌÙ ¡]‚È!ns ýæDs4ïÇî3“Q:œpÓž#Å
þù 'ÍéN%;g_ ‚î=� ý.­2I_Y-,VšÀH�™®>{LúBg6ë€æepÐ;k‹¡J»  ³W„Š"u.#|
¥×]H·õ¦Éå¯˜ (ï›¸PÚ°¼’ÕàÒëÆèFø•Îü’tåoQú›Î,ÍVÍXST²fA§Ã¡puNÝ\[;o²Ýþ¦ËûŸlûÕBMEÊÕhZÀÀ÷Ø©>g£6	%ÓØ‘Y�$hé0gÝÎgyX$´^ÐT«³ä¥DïVªèÃ…à ’bàå$R†rIh–àá;â,J¥>`íÊói9« Á P°*NëËë²ôJ¥À€}¢×ŒäŠÊÑõ.G—…BeŽúËi:ã³™½÷ÙCB0ˆ1ÿZ[-O¦L‚°|9ŽíÚuG¦Ì˜1G—\~ù’;Õ]k•L‰C¡S«Y‹àbz¤	ÉªÕ:…£„Q®íR‹µ…ÉŸnÔð‹NH_œX´>Ü À¤ÐÔÒ‡BåB½)†,l}«Uø1Æ™[	jVâ„]Ò¤]/ã„Î?êÏ�8i	šò~%ý‰øI7ãƒ¢§�×õl£4U�æbŒ§5ÍÇË¨5ˆò·Q7Sß£ö;{²£È…0NÿÖ|ƒv4¿-þ]á·Ý ì¹øû$�ÿà÷û§e¿qŽ¯½ÄË2\Niù%b¬dÄ.™3Ý]ž å@êº8m@äœn¿|7þ·\9+ô€Ø¥2Ê9ßeÜ9Žêó?’G- ® n@¬@®ÕR½H™€½TòlI[úŒ¥RVw=bíCÖ‰¼×ÛöA9MVê�—#½bPÆ�ÃªŒ¿&²b¯îf.A–ûÿ@Žc5I¬��üØšø=®�þÔ>,‰/ÜeM|á€Œ™€òôb7dI~ÐŒ‚ÍÓ¦^ƒ‚×@à5páç„|¾én‹Â`LZž A¥Å¦Ö¦¾*òCÒòÉ}dÑá.yé¡ä<5PÛäU=kR,âÕ5Dö�Â«2+gŒ/G“3Ò2Š
®Sâ}rÑöÀ.q¸ãµ×nÆ¬�(^…„*píÂê�Ù�¢èé9=\ú<¥Èæô,æQ?"ü|Îò�p»)ì�+F¬kràŠxöÑÓo>.«Äâ�Í|4ß…ÂAê£d
)S:åÆ¦I|*‡‰‡ÎˆÇü qÌGs²6;^O÷~+r.óˆuDÍ íë»�È%WCÑÊâA™QTÛŒuÁòÖ€ÊW¬3Úàe½gÕ¹+ÒãHÝðD)­¥§î)0:&‹ÅpöLåNéƒÏtúã~µNüõmÆÛ×yFÇyOsìŠ[
ê¶´`\k´ü²y;ýh_»¿Äe“ó0Š@º.Ó¿xÐ9�?f`¹/ÜZ^‘¯ð„}åWçBHR�Éo7zŒ`öØ@«Q©4¶ÆÎ†Ð±–÷ƒŒµL»¨wãl_7Ê^=tœ=ÕSU¢Š›Z7HGqé«ÝÒg³E¿GÎJ}9ßRö ›c�jB<ìT¼ßM´£BÞ>=)Äœl
#=‰v¹~Êõ¹ŸÒx�qñ½vwo‡…±ªãÅDúík(¸æÉkæã.„	ž@›Â¾@Âºk!¦á}§ô!—ÇHZ;wg_8�}VãÓÜ¯ÑptøØ>¬áªÎ×µ>x4Gî;rä>Äp<8"÷“ôŒd4\:~FåB²¬¹/ÒPòGb“fU£Þ“½‹Jõi8µÛ†Ý¹ óuMÿ5|35‰ .aÙÏxn�oñçX�0få1K ‰í¾¬…î÷á½4?â•szRG|‰çÆ{G£gjCˆ¸B³º*ÙÜä´:�à£´mç6H—}‘WÜu{Ë��6ÀˆºÖ’B‹Ë-òyC=þJÛ¼‰;&[8�¥Õ«—”Ž4«|r€q^ÖÑ9®¦œ•™ôpH—/Uê®`mP<=äcÎxëO¦ïØËAßØäÌX^ÌkC�“]M¾I‹îh'‹®Æ”P?ÐLq©AÄC�`ÏS6Ä§RÄ_’h fA„­tL2újX¾BZ‘öûú`ÒÍ˜€pÓÐiDl…²JAÑLx�fÈË®�Ü þ‰Ñº¬áð‚ÅÆÀÐãÔ˜UÐ�1ð½‚Û3žCOê9•KaíÚ|¸{Û¾ðÄTè��zó½%íåE"Ë«T*ðá7C¯xvi2V�dé9'ˆa=ózžË£·VIÿ¸¶xì¨ ¬FÕÊÛ:³‡x- Êi
!p½§óÑ;ºm/ïYÐèÖp|x(¿ ~ÚêîB%¤ÁW§Ÿ~áFA)Ý1Sú~€®¬Óò?E4Ðü·‰=KÕRˆ�¡0j*^FÀR0*9GHØgöPRä±°Ar‚çXã²��xkÒ½Šìì¯Ž�€�õ [¿“qš§å-E%�C!PâL©4"²z¯ãƒÚ²êá\Ì›ý«´_®L… #e"•Ö„ÁÓÙDâWT�SÒ�P)Ç¥üœý`€Uo~Ú¯³9,OŸ`g òÔ^O‹ã&È¯‰¾WÏèK5é…0²£<ó�¯0üÄ¦óå·å•ô�Åô·šÿº]oñGŸŸ£pç¬ˆ„+èé¦Û
*ŒÖH³¼EL…·¢ ˜b½5‘pdØLÄ_RÓ¥ªJ`wDµ­còC¯lÂà <£lVµs'`aÉbpHúûˆ–÷«�©ºØƒµ…·Yƒ "âº½Ò~pÌß.˜ò|ÒT0Æ?Ê(ØCÒŒŸéY³ád¤TÊc ›§Ø™èkMCò ba‚2x¢GM…x­•Øš¤°6‡HF"‹"ñ—ÿv GÃhÖÃ]~l�KÀÁ´$n(Lñbn$EŸ-¶‚Ñ�™po¥…aT¼Ž3Á'�f©ñr�Iµaêl ¯ï4›;Ï%©Õ†ŒÔÄWEèžQj«+i©"\”6¨u×2Oû —ÿ�,ÆG—>nÞ%-uš'¬w8_iJþqXù£©î°Òl0kD…•>»ò%­ ÊþK�>ý“g¤ç¦ßg^Òš•(a�äó¬¬”’†ÓHæåéÎ‚¢l#£*æ~ö”—ÓÅé)ÕÜÎeÀ,Ë3L]ø,¬.p®Ÿ`v:ÍW62|¯Ù÷‰]€¸üÁËÅ£©¬^J+ÇçÔq½XrJ¥Å°ê�/ŒažÂbØ
»‘`…Ý°Z‘<üâ�TVbì;oûÃŸvìÜþÅÎî	^¾¡íÐ‡§@ÇIoCeäWûöé\ùc7/ÑÓéôˆ-“–dÇ¶�.ÀÂù}öè²ê.GKžwøÁ»ûØ÷îÎìðÔeœ¿ÿÁO?}pr›60³õ¨ôÚlÀzo¼ÿ�võíÿ>|çtõyé©Öµ›‚B×­¶Tupœ½Øm_µà¶%µm‹zýc‘¹ÃNE¨(šOÇD}ŒË¹À8%Ù›¢	à/Vƒ”Ïa‘M�rˆß8ÇŠš,»3R,Þõ§Ýw_V^ÂXk†Üõúë ùúa¨òÄ'VZ,ª÷CL{ÕTpU"2vh{^ËscS²*1Êb#úOà³QCmÊxfÕÁƒ«.{@(*¶üFzå­·A6/V¿öÖËfˆôõÀpù’ö'ÂwGæŸ`†)gI®	%[Ê?¿hNè}ÿÑDo.ÙÛ‡ Ì¡cûÅÜ´ˆm}­²J'cyáõ ì™
…Ý*2uÜî=/6ÎuñáX8hÖ¨kll¤‘eTš•Å�®ð™­âµP¡7h:¦xX¤hxQÆ¯Kh:¼€Á«a×ˆ¬~RFàô¢Æ%
6œ.Œö�šx¯´0êóÌ—FÔsÂu.VŒŠl¡ tûÝèOa.`Epvð: ô¨V vÀ­�’qÀdE&‚;HpYsð`PÖkÊÙ3ÉÍ$7›LêXƒÊŽ&ñx9Ý¾õíJ‡R§35˜\©úÖzMpóhgÒù>¯0[ÍãÄ Í[—ª›’JN®MÕyìÁ¼±F›YÁ¿�²ŒÚÐÔ�¬Oºôf“NéÈ¼Çö€ë¯¨Z»…wœÞb!ìÔ;;¶çkÔœ«9_]Ô²¬?RàpDü,«V©ó›]œZã½nÊ6yA;Séúªk×¢�éÿWi`°–’é Šè@] !t°eÂKm&N…×Ìˆñ tpTèÚ„Ö?D¦ƒ!~mR«×+Àu€Ðè&ÁZÓ9"¨OŽ
 "µ…FBƒM&µA�J&¥PD‹´zP_ ²N"â«ñ¨§ceö½`€åø:PðâKä'š`.
c YžDŸÙD¡×g­é:1ÕJjèò†rQ¤U	«¾yH»"6_zHúýÔ7c£úaOŽÝ2òiÄs+Õ÷‚ÞÛsz‡DmïØÚ^¨ÜuK~Á
•åÍIÝ\J›‘lØ°¦�£¢S›GÆ8Ó§QW}¨˜ó¼¬{¸üJƒ›ç­Þ Ö¢9Q-rñy“!pF}F  —KAPê}%#¢�2mÝWÜ2¤cMK~??XÍˆgî¢fÝ63Fã{¿Ÿ/œæCýxU�íý~hxäÓâ€_üDøÀä0	D/Û(«g“[Èþå¤~çÑâú=ójG�Ö…F†t£Zæí©.;üNX8ù)Ëž9…3Dk÷Îk�÷pHÎ±·6úèÛAÊáÞ#}¹wÍ{{¦NÝóÞš½@»gDvYv¼þ,[“­a–%ø°§Ä£5¢	Ý;ünPüèsŽ;sZ(x÷pÑ�½ó‡­+ôùu£G4Îß‡s ‡ÿ…ã>=%¼s8V»o~ÝèQ:Ot?Ðï™¶çÄÚ5'°Çf=tg¡tØ%°éë_‚»é4Ø-Í9÷ºó\�”Gép´OÏ’ØE¨Æ7ãsú0H èu¦L Çc³WÔÇ@B ÆüTë]†Ón ÆÂÇìÙyK÷¬›fm-¹áØ1ú÷ÿ�ÜVº|äØÅu+ÍféÃ�ž¡'œû¯ Þ7«Ý6g#¾wé¹ìôÛvøË7Ðô/Ÿøæ‹ÚñËFŽ)Ë‡/ÚïN–§’ðwÙ'ÀgH›Ýø\�¾Ç¨^_ï9]>3•O•P•h4\J­¥n¡þxÁÚ ‰I¡œ÷A4Ó]:2ðp97Ùi4T˜z½ÊYS½®FMa,�qXKËÕÐÐAJÈÝ9%¾Þ+dDFý‘ÅöõŒ¾õŠØ±‡‰DBF¬t(LF_2’ÑdÇ”¹u"Ôá��¸¤äE9�ç«ðù*®ŽÔD\îÈÃ5‘ˆÛùA…5½ÐŒ“ÞûáoßÒa™õZwm…Û›F¿¥^w…³L»üê›†ÝÓS§ÝcïX6K+5gffêg×ÃU­ß›ÙvKº´snùä€1QÎ´ŽÖÆš*éL'S]”+ �~±Š)‹WOK%Wõ†'·-Í3•YÜP-
Vh¦Uö<ÃÄ¯·ûÕÇV²-"—�aO�Í_’žÂü©*«Š}3n¥»¨È½Ò]\ìþ—gð•ýÇæ=trí¤	?|÷ûÒ[s*ãäŸÇÖ„ÇZ9áË	«7Ý¶ëwÍ¥ðp|ôèxbôhéd÷}‹›«÷-™¿Pà*’vsÓ‹+—IŸ4döØÁÊ¢Œ|ciS;<Ý|ôèÊŠù•×Þ}å¸¤ËF›9}4d^v“©dyÖ¨ —§Aóóçî²öþ2¼�
-�d8ß’èS µæ80DeÁD¹¿Üoñ[–Ä€=·Û9i×o4ÛgÝpÃ¬i5óß¾ÿäÉý÷þL^²d)úLƒX¸&ßsÍÈÉ7¿tsõœÙX¿â�5KIÆÕƒ¹<7sãe˜ ÔajEƒoô£9'�ÁF^1#›ˆL9ªì÷Œ�>ÏkûëGöéYÿÜ�³fé^L¶MR_g¶‡êÜS¥ºdu©ôv’mySgOOgÓr[S±FLûÊÄãô‚ÓÁ¢Þ8�šJÝFQ¦x
u6Ê†e�¸z…¨>zà7Æ±Ï ²ù�1É°]5™ŠCÖ„Ñ�ÝÒ¡LØ¤Mf)7£&\CÊ“'kyáD‡=X!. ôMÞXuutpsØ±úí^o»—Sª*íqTÜ8öl{%¨zT¬
ŽTOmØ»›õj:‹D.[>*V¹ÌØRnöBU~Q“‡¿¦{Úž†y‡&WþÚé(ÚZü¼É®†v³k‘:	(R,P„ìÒ(ÇÒæüééÂ�5×\±¬T:%ÝE³îÕ5¸ªk2�U³::fògÊRþ„±Þ³ì!Ð“Éd8m‹/S˜´ÞÐÅt=ÜôšZ`ÃÞìI€¤;µBúí²˜¹¢’‹›ÒVUaft¤Ùøeþ¸üŒŸ°Ò	�0)/p½¾¡…µÑí¡!cU¥�šòJÆ§7Å€=d‡ûí!]“3iuª+*4Æ€½Ü3Ä s$\Ä(�ÄR¬g­¨E�µ°‰–Žöám¬pˆ“•X7¯£yª«á›LC—ZQgin^ïRvzi{U{|*·ôÞõÍÍ–:…:û+Àw¨iEHaWÿq9ÛU†®—u±OïQÛQ­î ¼ª=>ª­¥mLi½ò\”@²¼¡WòicUù´uíÌðü`Ð×Ì¶¯›V^eLóÊìý?­UØÔITèch|58½õrTVRmSÔþTQã+Å˜·~ ÞcÕŽ%p�ó££‹°¢—ìÉ"‡è¦«!V�¤S¢`D/Œâ\d«µÁÅþ¼ß„[¢Vy!¬ UE‡®dÂ…£[‚ [F‡Øµ‡Â¨²A…CÝõÛV<4€¼¡Åm,€iµý¥)C;¥wèöÂfœÜ\ØN¿û‹ªr��‰›ÜÀ‘+ÀK\ ÚÖŠËlm‹ŠNŸž�Ëè�}WÍ ½Þ¸ÕÏ÷0Ó®r“¶a”#2uŸÏSÇ¼T¬ ³!zÿØŠ–?À·ßïn€÷í+‹køsú•~ä±¦¥÷W„V‚¬Û_–—Wæw>Ò�É…RS–óûI?û;å¦|TÉ¢qj5"#kU+Ì+A…14§rØF°t¤y+IN‡y¢‡‘ÖÃ0�MYcX£�åü¡òpˆÕìdW>¦ƒq++Zbèm±bilËŠ]m`AÝZ^ñ½LÀ¤–Þ’Î|Xúb"kuÒ~pãt8BfÔx>[¨&écf®þ0{
¬¤Éô]æÓðò º3ÃÌŸy~&ÏHï3Pñ“†|m][`7T‚GYÔrfnõ•,»ŽåÆÑìkûõfæ§xç/oK‰_½¶¾†ý*{úÐô²t°ý³Ñ@¯¤“ÍÜû2øõ#gûó=ŸÃ/€§ž{æã›LgØ5S?èù(¿lK?Ã²c°ôŸ!_0ÀÈ3Á	˜Î³%³à½ÜÉ°RO×Ž‡Ü-S±”£¯¤ém·rÍÂ;Ùþ<œ�üãÉª)í×1XðóÉ«¡ˆléÌŠ%ç"a æÖç	Î˜GÕžÒö—v'bÑXÂ�æí¥õ¸Z˜©÷È�ïÜ‰þà“®»«ál† fmè"&Ý}GPX9{Î°&ß�§Råò™’asfWŽ˜1î^|Ç‹Ýq‡4ú¨ÎtßÎØ�“DÓ»'wÌí'�wTREÔdj±ŸËi� ‹é}ÄGU7¯c.ñ.}Î!.zsËEmŒüj¥Ñ1¯�Ý�=Ú0Zé,SÎòqK‰+Š¸J,qø˜ í& Ê¹ã€VÐ
ç)A{– Š0¨7ÓÐ«.B¯,=é«1yd¤qÞ¼ÆÒÎ…mIÆ£¶*Ñ?«ÚÔí	2³|ìß*¸0–¸öÁVÃB'G!ó$ùhŒB�¡Va{á(ì£ HÞö‚eçàRzýq¿#.Oå²Ó bêÖ{Öoåˆ2EÚ+¹RGqaaa±£”«l�˜ZR�J�Ýò“-[~Âøú«Ò[ôÙ—õ‹Vè-TìÑl"íïï€C"Ð,zw0¾gÑ¬JÆ©7+•f½“©œµ¨g<¬Ç…o‘þÐç€˜*pÉø ÔRGáoÒŸ&åïÓ%c^Ü~[ˆ$�‰[â‘©.wØ»Ÿ<ÈGùwÄ…´u	—Àµa¨–”D¥Z.nØëÿƒ&EôuFÆúîïŸC~£™åëL_ó¾Ý3þ¢Ï�æÍv÷5ä™¾Öýª/í\œ!‰©¼Ì«zB×À¹kh yƒ8!õÉ ¹„G–�JR†^ÏŒ½*Ž_Š›×4>õÚS�k6‹A¸´\›Ó6†§núLzü‰#¾ûUCËØ±-†WwïúááaüHI·I?þë ÅÂõ2Pª˜Øjˆ&‹ù‚š%v™sh1[M	Ñ›Ž‡r•…¯È%Ýˆ$wH�†Êd–Ü~A­ñö†Ï7ƒÅ›? WaŽÂº”G~Œ*|óM­äö³Ã^ýænY×Rúèîo^Ãzzäj=�Å#[Û€C^ºW�Áb¦H­RoÀ0çsd‘y46~ZCñË7ž{ðÆ—‹¦���sÝ³ÇŸ½n’8d]ì¢I÷ì¼UºúÖ�{6N‚ŸëJgnysó]ï¿×æ7·Ì,ÕmÜ9åF7Íß	…ÜË|sêæ¹Ÿ3¿i/ýå³¹7÷ù›fe6Ê�õzûõ&1> +aƒÚK ;õ¡iè
c*Úßk¯Ù¾í¹mÛžÎ¡Ñ•–¹¤s„Ö0™Åô�HzBÏ„	=‹gW¶¶VÎOR>»Ÿíþ#9±¯~“éVs#†yï°nIUMµR�Ô<ž’}H$¾ËÛÕ¸ºß6œŽûÆKù�.^ûPãóïÝöè}M±Ì“™X“O__,®ï!ª0ÌrÔÅIÿƒè]¥ž^ãH@œ®äL¤d“©¾\LÓ¤ûÅù�¿)5mb<“‰Oœ–J·µ�ƒD×F:yaììóçÒïÐ/,%í×¿«ÿ«vì#Ù!ÀoSƒƒâì Ø‹ÇØKnÇúbiBq}¿Öüï·cÏ×ˆä¸£ƒ‡Ï&Ôvé¾–ï�VÌ^pŒôÅ%ñBÚ¹ÃL÷YL–‡LH|”�FýÈNÐÐïƒFƒ	;9dˆ’3Y™	o€#A†“½ÙbçŽ²I$^9J ^æ�oœúàøñZ*E_ª|D$š_¶à¡k56‚­«�¸2âÆ©ÃÖLmÈŸ±x—ôáï¶mû ¸n_÷É±;'¸.6­ª¶~ŠÄ£Jé%éEégÒ/ŒE5ÍE.ÃŒÎÅsn—¶8Ú—v	µt¤—ÿDx½rùðžýúÚç¤Ÿ/jÑÚ;ÌQRìnÊ‹$†;©ŸO¢6…^G Ë¹EzÑùöY¾’ïg¾ &ÑëUuB²¤†²ôWˆ°�ÍY{o–Ä¢3A–ØðÂc5»Y¢Y"qÀ.è¤SF‚/„íMeg˜H‚ù¹×4õ³N½^¼õ3ËÖ\Ÿ m:³’­÷»Î³‡ü.¦Òz·Ñ69lPó†P¥i}‘µ�Vi«D–¡½¡Ty¨Ð7 `âkî(Ö\fs9„H¼&Rv­PiŒ*«³@åh^ß¼N¨5ÎkpW�V>IV-€¢ZP+¼Bó•3»5pŽ%ŸÖoN°ŒÆÄ‡à¨ŸÛqìé�oŒŸDÛ6qƒ+²£±uVhŒY¥á”…ññÑ‘©BVÓŠö‘ú*½Íb«KÝÁºh´.8³®ÈÌ²�6¨‹ž_Ÿ^·dñšdy¤Ô Ô˜]B"Ñ’)Åþ¤,¢Úiµ�37�Ü¿M:ó_Þöiµƒ~ØXõ@Éæã‹Ö,¡-«Ñ¬òØ,}ôpaÿõ†<2ë©�„8»©²Š<¨|{€¹ÈûÞ�Ê°÷Ü~—Å�÷;,j^-Í@²ød.¾„=ÂÁ‡4Òcj§�
u
V%]û‘8ÿÞ Ü})ƒ®Ï·“–ì$'*•ÓýK¥�	£X1Š¢l8HHÌ›J›‰Ÿð41„´E!gyƒ�,ÍU=UÍ=M5è´¦é z¦GVòë!ç=GÉ?lü^3ÛB_n•evMÛÖšÂIYªdkÛ–gžÙò”ô5àŸ:²Ã±låfp�l\ClþŸ¨;¼>ûÿmÝÁõÒÿJÝË–ÿõº_ý§æýë®$ó²\û¾º£¹ä?¯7úûwj=zÅŠÑÿq�}Lx¥	{«o¦FQ¨.j.µ”ZM]Im¥n¢vQ{e� ×W`¤el¹|cÎ‘JJ´bìL˜sIÍäì€R½ñÞ0)§§Îÿ-÷÷ÞÇ
Ù;UªìM*»ªC¥*.T´Ì]¸ë<…é…Ïëz­£]Ê—u§�@VäÍÞ—SÞ•5‚©‰ý3J'úGrdä)ýŽ,�žƒê�ªaWwþiÖ°]Ï"Fsõ-a×�b•J:Dî›rÑ1IŠèù–«'.J	]”‚-[û|õ©‚˜:”j£6"yûFêvju/õõcêYìÁïxõ±|ÄP½/†þ¨AÚÞ¡\(Š‡.Á]VƒžH–ÑÄ!ºéO6q‘ú–r¾­üÁé½q®GvŽX?$K©´Øq3Ì˜œ&“³ƒ£ä¸£ß¹|d:dnI&».�ÕêBµZz‰b@é&Ê[1¾ã¹ž‹î~ã_¦ÈOG�>°êü„Õ¢¸ÔhµŸ^õÀQð|Ííw4]”’í`ÏÂ]£�w`å¢—ÇýsÉŽ^toÇ¿L‘ÿÏˆu)VBãl†N­�u¼x$ÎVÎÌ6«¾âÿØ}y ñq„cÃ<$^æGÜVMÒ)$Ï÷™U˜e_yØ[ÀŠÅ„»$ö`xK)Jö_Sn@Ÿ6zòDéœ˜ç1‚£Ð-ýí=F]` Pì{þˆôò�7œ>0€Ÿíã!MzÅm§×)øÕ?ôÍ÷€Øû›³§7?½yóÓàà¢i
ÄÛXyUUÃª—Vl9ªU5Qñy,4(¦/‚ô5\}Ë?o“&,{wæ”)3ß]:ñ~@}.m˜@k”¥&¯^I�ñ'%÷«øÅ�üqã“Òë£i¥%OÓ(5LÕïAÙ¡›ûüz¥jÅqéý ~ææóÔú·‡q
U²@¥JíèXöô�þg[¦Þ_£RE’J×rbãæÓ×rüÖ¿æ|“ËvÅššû ”e4LœEßCÞ��åf?ÜÝ_^r9 Û-Rƒå7~À½'Érfnaˆîóï@S4ÖS`Œ@4zËë²9®Õé«Me¡`(x$ïÓèÙý½°[vrQ¦óè
¤pº¼žˆÓñ
AWŸ_vüîØ×.L§’1@!Ÿ„Cd/;)Ì¡ X‘Ä?x¥î{;Tª�?V©v a…vÕ 8¼¬ÿ«¿ûmÙrqFèß¦t¿úÉë>ÿ¶_ÜAµü?ç�äç P5(~N{ñ'\:o_\z•¡ºÊ¬½c<¡%„}[ñìJé5¶û<<˜“Ù_�ã—â×yR6$ºØk”j¤~F½…­Ltèµë ËÉ¦qØNÎÚ×DrÃ„{¯‰æ éæµõx!E¶ ù:à©0ÞðÄr ÞéDÑ8‚õÌÒ¡°�hWaY[Ÿpè¾Žq.ÑpƒQrðFv:
ù:&!=Q¾ÎŠÖPXÇ &e":¦Ø¢}0ö«ÖhÔº¤Aš¢°ò
oUð{ý¿6¤ÑÈÁ:œÄ+D¸Þ·3Š2-m™y�ÓÑ,Í¿H[½>®`ÒP¡P£�ÐtQ§Z8®f±ÓÍž’	:g�AQ­V«*)ÓBÈƒ Û&úçøò§1 •^o)*Œ Òk´Väy,Z�‚/XÈ§VË¸E� ‡J?m…‚N+”¼ô„gÂjGlÑüúðßÑ‡|}±ÇÈkC_¬ís&`4˜Œlà-…B!âW;üZmHëÓú5š°Æ¿§+qJ¦(äl›9Áì@gQYô¢9O2™]:³jXÚ UPRbŽ¨Tyñq[T|¢,1»%¥g2‹WZÔBž€¸ÝäbhçôëËu¢aI,ê{b˜A­1ÙªD£Pë†œ°z–|$X>·tÞå®BŽãã‘úêÆwÊžçN…Š½jÛa ìNnª˜6~,ÁºKÚ ƒ¾uXŒh‰}y=HÐ‚Ÿh$æ¡ê”ÆAŒTãÏgËñwLaì—ªœÍ�§1aàüxÝró›JŒùótü<—¾&5QúÇÄ)`Ž¿¬6/4M›Ì%ØŸ”go�¶oj,
ZcM›ÀZøÜõŸp†�æõLhÎþÖ©gGdW –¦aÉð›¤ç¤ç75Å�"ûÖ¨VFm×¾”:jYhæÚ´¥i¸ìø²6ªÍ›«q4e§MÝ°n•1·Bt\ŒT1UŠxî±¹•;$è¿1î¦�€ÅH®khÌb“Ä„ÑÐ�…ýH„‹ºëóûŠ€1žSá[.Ûs”£éKÚ«Ü d:¥IïÔ À¨J–¡Žå,Î~°~=8¼pŸÓ¬Ù»¨ddx€¥&¯%b´(˜Nsà�
€ZFïsE=«–òîXÜûxÿ-9øáFTxÊ¡‚6°â¬uÀªÐsJÕn¨âÕàÔ¬îxO* ïýî¶(¨�^õºF«ÁfÐ°4JHì®Û·Ååõë}wIî@-m´×ÁR¥ç¡¢•ý'šÑ,”µâÍ(1&^ËD
+1¬Ó/àÑàÍ¢ªÉ×ÑØóÂJ_�i°^F"àÑû‡±�5<ÐMØÒ�çÂœßKÑ¾�ŸÃ0¢5JÇ@åƒÖc„‡² ƒ¸"fÇj£W.Zå1îm Ò´ûm^šd×ùŠÝìþoJìÛ)ým¡[_sß÷¶E
ò”}å/®ofô¾+¾~üÖ`PôÛ]ùq)»íHäºíÃá›×¾x¦Egoþýë¥¾á�� FËiˆ¤�þ <¢ÃÅ]4d+Ê>…P0Õc#ÛœåzŸw/ðƒÊ]¿=ýs@+Ü³—<4‘ö½-½«�#ŸH•wÜ4–fÆEEiïxkã‚îª¹‰!Ž¡�+T©-m5�_Vq‘†&[žA)ØfäÍš™îÓ†¨5ÖÐ,°(·µ—>¹,_mWÑ`
Ð‚øÆ�v»¦9tíÍ›¡EoÏs84*O�Â{û�¯¼l–Ó§o©	�ºLjFß/x^Ã½Çþ�²¢^�¡&�S©P8�†>øÐA&€¹Ì::ÍÙ� V“7C3ñ!D6d Åè­!XÇ|y:E…±_%7££Ñgk]Ã&Tm›cÒèýVO•#P_Ì3kÕ*°"ùü_¤/¤o>|ôª“˜ÿºÁ”ËÍðË1Ûrü'ÛÇÈX>ä�Ò§Ò/¥÷%éH»»ŒyÓ³§>ûûé×Zó«j4Ò»ÿT@hßøÆön‹uö­§¶/~æÀLøyñC•a—ÙaU±4£WiƒÁ‚@~žd¹ééy‰ÍG�õžÈÄÈZíqi«$Ý¥9p�CË@Ïñçð&ÐsrÀí<>K1æÑ¿K÷; JþöÆ÷æD¬ãï¹,~“tÕßÀ¤&•<õ¶gýúOvL†îÙ;^—õIÈCöñJ=Ñé^FmB}dõCŠ,~öP‰xGì¹2ñ?�æ…ÐXVD~åØh"^þ?Œ]n(5 ¿åß2?ª(8wûL¥3ˆ1úî[H¨ƒÁàE¿÷lÿ7ü?ì¬§ +ŸG(ëÆÐü6}›[0¯)ÛáÆ°4
ÓA£kß„b€Ø�ÔâkÄÅŠ‘¥uX„îUõ#ø)V¶°Äê 7Åƒ�ÍD«Àe€•t±[§¹±Ù™û>õ@¶îÕò84Íµ ˆ-9÷¡§­Z­.n}:­�ÓÎ•þzÜ óò#†å¡dh¹!’ŸÇ¥¿ÎÕ‹kÓO[ã:­Öúô!—]Yè)ù
£tø»dOŠ¹r€þå ý rvÆçP2Ò+Ó2å*TÚÁÁüEÚ„UjáþPBÅwKÇÎ˜
=‚ÂÔóÖ|§Ç¤<…¦3 òné­ *Ú¿•fMhåsÑX>W·gO²¸¤¨N'$½u7¨¼tAÒ±»AñÀ‚ØÂâ Àqù±h¯ÍŒÌ‡›°D0“‹'Ï*“ˆ&4‡0<BXFFãV€}žoßq|Õåïß»€Gg¿^µ˜Ã¤ƒk×©ÔG¤·Žœ³�NrJŽ‚wÁé«s`Ï�ºùõUäL¹�:ÏÔJ÷¬’^¹ï	éåc¶k@çå }ß“ â˜Mœ$¯?æðÿt¨^"ªYŠø S¿N[yÄ¼” +¢ó]p}�Lüð¡²ÇFY>·HCAéÕÒqpâóyŸ�M?íxÖâ	MzAúàÍÞ>Dm¾7ÿr)yãœôè’¾Vç—Í�Ã¨”«×Ìûlî”1Ï�é"wmè_\s	®É¬ç?…=OM¢fR‹©5ÔUÔCÔÔÔ«Ô{ÔGÔôŽØ§„eHa[â y‹´ìï
›=sD„ R‚U”W%Rd1Â'ó=žuRŒ(/_Ô ê 9©ÜºÖ·I—Ä
Œ"º%Œ³äÖ;¢0•ÆÝŽà•¦“�Øb�+M¾�”G`�p²\è{žØ?sXÎ�RÙK–ÐìÈV7¯ÄM3�§y–Ç>ÐÕ
µšsÀ ´hÔ)wd¡Õ‰cšÝËytÎ\¢ÙÌŒmçÌ7ñšx™±©5~ngÐël4mpÂ‰ÞÑ¨Ñ!k	Ô£IÜdBG–4CB‡sÈ5CËOYb¾jo­ÌûÛ°8=vMa¨.À”/lònÝ÷è°áÛ×MŠqÉf‹÷ìJ�Ò,”iÉñaÆäs2´`0:™{‹Yð),fs~v±AïtÔúTü†1èõ¸¨2?Ñ+E1åV—ƒhžäÙcO=ž�B@š¡¡–U±Xƒèy$c9´¦h¡óÆ·€¡³hÏ×‚U
µŽ×‡L_ªCAkHqÿ>¥„Ò×ÎòÙyJ-í¹ß-?ÌÎI'Œ‘<…èTJ#˜2v‡Æ$d�³1¤©h0˜Y!}=²žnïbÓJ0¬dþˆNÝŠ›TÕl_9V9þÊJkÚÂ™¾m„¡£{\n.Ó¡·&GTA—B0¢×f„sÕfÃX
|,c¥:êÑk;œu>CvœÞÆÐF�ÞŽêsZLôªâ”Wõ Tá¶   xœc`d```a<=á|Ed<¿ÍWnv¸b|ÖFÿÿÿŸ�“‘Äå``b ê  d#× xœc`d``cøÏÀÀÀÉð8€"È€i+ {
Î xœ�VKkA®yô<Œ›,†5VIL”,Š¨èEæ°½ˆˆ"âE"‚'sjüþÁ£¿J¼­U3U=ß´“¬K>ª»ººÞÕ“ÌÓgâ_ú’(ùETÒáuÁ´ð=OÖ'{?<c|už>™Law®ã]+tÏwï™Ìä^ÞénD.Ó}kÛ÷zÕ‡Îü™ì¯�U}É©§o9ä�:ôÎ‹”öå;ãø¬ØFÐ¨ž‚²çOœ¹;ÅÜXSÕBåŽ[xˆ£Ëe#2U”oËØ§ÌCúš„¸‘š¯®??âœ¼	9²Xz{wŠ>Ÿ	O3�ÛEµŸ*ýÂüDeò¸—[¿=í”–wE­:s­eê©I5oÆÃžRÝ‡ØGœ¯Äò…=SBüP»sÎ|W�+øÈºŒ	×à™€}[0ÂÞlä]�1VËõ°§£~�Ù´³FçoÂû…ÞMÙÇÔr¢ô­ä‰ñŽï;Ë'…úÂò›O^gL÷Æê­y¹h³o¼ÄòýÐøl7¬›/¨ÝýìÓŒr§q3}=vCÀü…ÁC¯íHF=¼Ç¡v—íñŸ@óiólrá.ûr¤4¼C¥ò´óÒ¯Vø¦²ìldVÂ¬ŠLþ[½eöëNþßé0WÔ¿åoºÏ“úiosW�wz:­zþÜêQ¯©Y„óYýŸ3¶ÁÆRýyÌëK ‡>?áó+#ïBŒ«Œ÷|þJý¾­zj¦µúƒå6ø]@½UD-¿P‡vÍ>nà»ŒuÀ;ƒµÖW÷ÛèÔO­¯à½MeFY¾Ð³”×í\Øl@�ƒ®*ò!î‰ê½¨u?–'ëmŒ»€ó’ÎïÌ'æ²ü18ýÈö>´wöúCüÃš\f¹M¦»c}¡ïø~5Îù÷lÍÍˆmo,.Õ}�÷Yï¡ò³r¨[ÖK�éÇÌf\õy·¢ýB¿GíyÚÂ±o•žï×C[³¨¿þéàïÚÝ|ð¿EÏE@
½îé®ä\}¼d<ÝzÞï/õ
|ñxœ¥–{TÏgÇßÏãN.¹†iÍB‘dŠb!ã‹¹3³i›M†‰eŒ$×¹4—­MÈ=ä'4r¹‡�i®!ìeÿøëœ÷ùþ¾Ïó¹¼ßïÏó}NÒ¿ÿ1’©H6dH…‚AžT8T*ê
®HÅGJ%ÆöK²^Êœ’¢¤Ò¥2	RYÞËñîHYÇÅRyr*Ð£B¦Tq"(�*Ñ¯²—T¥œäDžSºTu´T-ÄIÕéçÌzòjpªE/— Nµã¥:žR]É•W¸Õ”êgKnôl 7wòÜS�G�GÒ{ôoèx¾ØóD³çJ©=Ã©	=½àåÅ»7µ½áë�,5åwÓ0@N386C§� ŽÏ&©9^5çé;äJ-öH~èi	>ððjÅ^+zû“ïO� øP»u/�/µ¡w¸R+�ø¶ìµã½=qí³¤ êv@G©S¢LLgrº ¿<»àû‡IRœBà×]ñ©<»1ƒîÄug¾¡ì÷ fO|ìEÝÞøÔ_úP;®apéK\?üîG��©ŽŽäÀÇ�…\… ÎÁàTi5‡ÐsÜ‡¡}8³Aßp	·O©?ŠüÏØÍÙøÏ¿ ÷ÎRó‰ ÷KrÆQ'’s‰?ãYOÜwÑÒæ1‘µIN ž“ñ0ŠÙEQ
¹Sà9�?Ð'îÓà0�üiÒOÄÏdo91Ì1†½Ùœ�XøÅ²ŸXÖb9—sè?‡œ84ÆQ+�æÂçq>ó_À¬:K‹àºˆùüL¯Åø³„zKÙ[ŠwË˜Y<û¿àÏr4/GÃ
f¶ž+™×*ê$pÖVã{"µñrïkr¤µôZ‡ÆuÌ1	nIœëõx´žïcÜ7ðl€ßFzmd›˜ËfüÚLÝ-ÔÚ‚[9‡[á�LÞ6â·Ái{ú[ì€G
šw¢o:wSo3Ü‡ûðj?üRé•Šßðð :âg&>‡èuˆ:‡©s¾GXK‡ËŸÄ¥çQtƒµŽ£ÿ8ó;�Ö<OÒã$ë'Ñ|
ON³¿ÎàûòÎ2§Ltg¢ákçàuoÏÃá¾\ G¼³à|‘Ø‹è¼„–Ëì]æ›¸ç«¬_Ã—ëh¸Î¹È†ãâo2ã[ÄÝ¢wë·ùï€» ßîq–ÿâLÞgï¾<DÓ#ró=Á‡'ð|J~>ÞçSëgâ9½^Ð³€o¥ Ž/Ñ÷Þ/áÿ
Í¯X{]\FeŠl’)úH¦X¾Lñ™eJ–dJ9É8+eJ{È”á*.-ãÈoÇx™òé2|@6×tŒL%7@lå^ @¦Ê§(™ªceªEÊT•q>%SÃð¬IN-ê×bÏ…¼ÚÄ×!¶.ÜêŽ”qeÏ•õ‡Ê¸åÈ¸ËxP£!ÏF Þ�¯È4ñI2^	2Þ¬7%¦™«w¡i$ã‹ß<™ôóƒ�_¦L+8ú;ËÐ³ušL¸X¦-ñí@ûÑ2A<;À§£@c'8£»3¾tACà.3ÝàÐ=P&”¸pû(Û“½¼ 1½ÑÒïúàoâÃÐÜýØ�“éO¯þ)2àù	ye¡e0Ú‡dÉeNÃÂd†ÃgFÓ{u¾BÛ×p‹¶o¨ÿí™qäDò�>î*3�¼	Ìs3žˆ¯“¨û=ñ“á6™ý(ò§àßT~G³7�Ü™ëô7€ßL4ÍÄÛYøC¿Ùœ›9äÇñœ‹®¹Ìzµç»]‹¨·˜¸%Ìq	—²¶Ï–1ÃøT™åÌe½W¢e}�(ó=àËdrßâw¼øƒsµoWsñe\Öò¾½ëè¿Ž÷$üHâ}nEc2ÞpÏ˜íìoÇßœ‡èK�S
}wÒo×°¶›Z{ð/÷Âo?9û™w*z ù ýÂ%Þ‡Àaúa/ÍGá|Œúô<ÎlO0«“!€½ÓÌé½Îr–ÎâQ&çõ<ü/P3\¤w…¹D½Ëp¹Š×ÈË†ÇönúÉÜ‚×-ôåÀ?‡3u›>wèy‡ßwá˜‹�¹É€Ú÷¨u}÷Ñ”‡†<üúmàó�¼‡øÿ˜ºOø~ŸpîŸÂí)>åÃïkÏy�gÄ …{Ã¼ä,¼¢Ç›ûâu†¬ñ’µÎ²…<d•-rJ¶Xˆl	ÖKòÛáŠlé<Ù²N²åXsÌ–­à'[‘øJ€ÿ¯lOY'Ùª®²Õ¢e«ó»Æ&Ùš¡ ]Ö%R¶6µë$ÊºË¾C|½ ÙúÄº=’m0CÖ�5÷,Ùwãd=x6¤VÃ\YOÐ(J¶±?(�m’,ë!ëÍ~Sr›»Èú’ï×€š~n S¶%ÜZï¿@6 mâe©ÑŽ÷ p@~ø§üüe½Ÿt  xœc`d``:Ì$É Î L@Ì„`> (M xœ•“ßjAÆ¿Ý¤Mk¤`ÑR¼�ADÁ‹Ý´”‚7Û?éMhb¥Wê6;I–&»av’�k_@ðÄ+@¼¼ôUÁo'c±BMHæ7gæüùÎÙ°í<…ƒùÇÇËÊødÙE	ß,p?-QvZ^Á¦S·¼JûÔr	/Ýg–×p×}oywÜ/–Ëxàþ°¼�G…€Yœâ:w¯LÆœlá�e—·>[.à1¾[.bËq-¯à	uÍy•ö×–Køè¼µ¼†mwfy÷Ý–Ëxî~µ¼�…Ž�b„bôÐ‡†À1BL I§¤ÏvQÁöá‘øK^™ÙI®’kîñ&ŽÒÑLÅ½¾ÇáDŠÓ0‰fb·²³ï‰`0æ(JfRMdD‡ëI/ÀÔDK1äŠZšè`*³tÈM‹–Æ¬ d.´do<UîÛÀÚ¨ÓûUîÚ´�àMr‹;ÔgízpXm´k'ÍF«}»ŒçFUFµù]�=j;à¯²ÔœK•Åi"ö¼¯bDÞ.x“B$¥d¦åy»&� _jþûæä¦Qå>ÒïÂº\Õ’O×æÏ-Š9"Z‡¦mW´…´jï’í\DI¸æ»Ž©™Sid˜IÎ©+•Ð©Ð})£ÍdGçÂ»©2']ªZ…‘†êJ„Z«ørl®$©Ž;2³ƒV¦²¿z£´¸nÎMÏ"ÏL4ûRå+î_ëÿˆéeèk=ªú~^^8�ïÅéÿDð9©yWÓyÿ1ýE&™ôñÏ‹Øxœ}WtãÈ²uU™b'X¦·Ì”Ø–œ,O`™™½²Ý¶5–-� 0ËÌÌÌÌ�™ö1¿}ÌÌ°�™ª¤öLæüs~NÒ$Ý¾Ý}oW))Lý¿?ø�Â¥nJ]Ÿº.ucê–Ô­©R·¥n‚4d 9ÈÃ Ã0£°–Ã
X	ÁÆ°	l
›Áæ°l	[ÁÖ°¼	¶…í`{Øv„�`gØv…Ý`wØö„½`oØö…1‡”¡˜P…	˜„ý`8 „ƒà`8VÁLÃÌÂ¡pGÀ‘pÇÀ±p'À‰pœ§À©pœgÀ™pœçÀ¹PƒóÀ‚zj4õFjÐ-hClX]p }pÁƒ5àC !D0ó° ‹°Î‡àB¸.†KàR¸.‡+àJ¸
®†kàZ¸®‡àF¸	n†[àV¸n‡;àN¸î†{à^¸î‡àAx†GàQx‡'àIx
ž†gàYxž‡àEx	^†WàUx3¼Þ
oƒ·Ã;à�ð.x7¼Þïƒ÷Ãàƒð!ø0¼��ÂÇàãð	ø$|
>Ÿ�ÏÂçàóðø"¼_‚/ÃWà«ð5ø:|¾	ß‚oÃwà»ð=ø>ü ~?‚ÃOà§ð3ø9ü~	¿‚_Ãoà·ðü~€?ÂŸàÏðø+üþÿ€Â¿àßðø/¦‘0�Ìbó©pXÄaÁQ\†Ëq®Ä�pcÜ7ÅÍpsÜ·Ä­pkÜß„Ûâv¸=î€;âN¸3î‚»ân¸;î�{â^¸7îƒûâŽc	ËXAM¬âNâ~¸?€âAx0‚«p
§qgñP<Ç#ðH<
�ÆcðX<�ÇðD<)õ:žŒ§à©xžŽgà™xž�çà¹XÃóÐÂ:6°‰
[ØÆÚ¸»è`ûè¢‡kÐÇ CŒpçqq-ž�à…x^Œ—à¥x^ŽWà•x^�×àµx^�7à�xÞŒ·à­xÞŽwà�xÞ�÷à½xÞ�àƒø>Œ�à£ø>ŽOà“ø>�Ïà³ø>�/à‹ø¾Œ¯à«øf|¾ß†oÇwà;ñ]øn|¾ß‡ïÇàñCøa|?‚Å�áÇñøIü~?ƒŸÅÏáçñøE|¿„_Æ¯àWñkøuü~¿…ßÆïàwñ{ø}üþ„?ÆŸàOñgøsüþ…¿Æßàoñüþÿ€Ä?áŸñ/øWüþÿ�ÿÄá¿ñ?ø_JQš2”¥åiˆ
T¤a¡QZFËi­¤�hcÚ„6¥ÍhsÚ‚¶¤­hkÚ†ÞDÛÒv´=í@;ÒN´3íB»Òn´;íA{Ò^´7íCûÒ�S‰ÊT!ƒLªÒMÒ~´?@ÒAt0B«hŠ¦i†féP:Œ§#èH:ŠŽ¦cèX:ŽŽ§èD:‰N¦SèT:�N§3èL:‹Î¦sè\ªÑydQ�Ô$E-jS‡lZM]r¨G}rÉ£5äS@!E4Gó´@‹´–Î§èBºˆ.¦KèRºŒ.§+èJºŠ®¦kèZºŽ®§èFº‰n¦[èVº�n§;èNº‹î¦{è^º�î§èAzˆ¦GèQzŒ§'èIzŠž¦gèYzŽž§èEz‰^¦WèÕÔ™¶cA¦v#(Ëotòª?§×S™÷ÃtZ~AŠšêyáb:
”ŸnÙN/vjŽå·†�œ´í D·›õUÏ�S¹µ®Û«Ùý|\»QHn«•ìvßr¨á¶3¡o�tÇí©<Ï¦j–¦C»§Ò¾k5‡›î|ßá†ç�läI•±ûuw¡è9Öb­aûG1§§¬0ç«–¯‚N^–Oè¸�nºåXío¦éuÜ¾

s®õT�×SÔM!ÒíÈË®ñnSåêV\ShµÓü¤ë®ÛÍKÑ³ünÆóí~˜mX=å[é–Ûù¹ÓÌÚ¡åØ�b¨ÂZGÙíNXˆÛóv3ìøY»_sT+NšÕ•_L:¾¼>’´WGAh·Ó²—¢Ýoò{	N·ãwG[VCÉ©Õæì¦rsžÝ#_e=ÕoØN¡gy5Y«ò³VS&äæuª¦f‚Žå«L££ø„D°‘ T^­n5ºó–ßiY|„ƒ^~ÐHË¡g<‹MÀÆp½\Ëõe|8~}Ð‰gÒ�ŒZ­á0óÌùn²ó‘A'ÞÂ�çDAMŒQèÙ}Ý,&&ŠÛ9·×#k"ÅGÂ8éÙý–›À‚†¯T?è¸áˆ†%®b`Ò*Ô­þ iù¾;¯£˜4ãUä“väéç±#â#ñr{­ªµ"ÇÖí g9ÎrµÐp¬žµnYé¶ÝbÛ)«ÅwÄWyµÈFc5†¤ÑpÜ@ó©ôí~;~=ÃçÙWù†å¨~Óò³¾Õoº½\ÃíõXãlÏj÷UXœWä­;GYÛ=œW*á­{žLÙà;Üb*?!+êŽ,a™^øœòC›Wè~Çõíµl_ËbÇ×™$œ·Cöerðb2±}ÜN_crß¥®ZLómòzÉÁHØ‰zõ€×*·L÷d¹ÒŠIÇrZÅ8º$1%'órˆqì~—Í™eÎ‹‚ok„o�ò9lÔäqBì~–É½Îb±m3C=ñA„&ã°øpå¾c‹'D£ƒË›tñ	™Þp~°×l2s6êK)²ÅøÒÈ7Éê4ùR°øðúéºrœbCŽµÅªB‡eÔîŽ›â¶\ÜŠ¼dDdEâÈÚzG®Ü`$ž`ÙC‘·!H¦áîÖUvÞç;ßÉ„VÐ²Qy3CußV­†¨‚87¹'™¶ïF^ZÎ2Ã‰šÙº²8BP#
YJ�OÅòbÿØ^:°æTAÎ§Vg£vÙq®Ï~ÂÈA×áˆáÛ]vxÂvg(â¸äó´Š×PwT†Ík78ÌG�îËÈëáë;º®ûò¶ë¶y7ëb@qÉ@†5T‹>sÆ;Í'M¾¤I#¾ÄI3>+¾7ÂûA:p}¶É=‰[|y™-N*¯¥yÝ.¦ÍþorJª»¬qQÛYÞX;Î(ãCök¨8¶æÙÛ>koqDä˜Wpd5¶E=Ïq�un«Ñøˆkƒ6œt§æ$•ÖzÍ"cÃŽðá«|Ù¡(–S	c¶Á‰J)Î0.GeÉ”q:‘-Ô#Ûá´óö$ïY=f·ú•í©f×‹-Y³¬V¼tÅy “„©ÖXK­hºQ]¬Ô—�ý·ÁHâ¿†Øôe_…õøâ`~€(¬5×TA—ÓFÖ±<©b£„Ã=·.ûŠoã°öwì·ÂšÈõÔI3Ñ™wÛïóf’w3œý�Å‚|0Ë—†À8-	ƒÒ/¨Ona¢.è%ïe‚/$Óâ«Õ§žêäÚë<«™ç0û"/ßòæhÜˆC»¹™ç3æìe9iùbŠÄ¯9ËÖÅ;€8˜$É"¾¿éG±!�HºìJ°aW¦k¥êdqIf)ßH¾¾¶Ç¶ŽêI‹_›({ÑÚµrv¶j(N 2¡ãèúf-þðêØÊiŽM²š’¢jì&öPd>QŸƒ�’Ä³Ðhr€ÒÙ&|´¬Ü`D¨¥C –öã Õ	{Ž‘nA9ËÞä�YH¢ª61G&ÎŽ±ßm/°ƒ%	iÅº±AÒJ×Êcå¡øÓOæÏò ¯wtý—Cœ®“�æÅ—^l˜4bÇ&ÏãÏˆ8¬ÇW¢V/’”g¾ö|­%³%Yï¶®¼]%ùÔ®{M²û>­öÉ�êÔõç©6ä3Y­»³Ëã8Tcx«Î7²V.M®\7r8­G¡
6ý¿C²­‘ÁpƒWlÐ‹cS­\®Ha/r6�êz#º“^`™‡ŸëÞ‘ÃÌ5Ù,üQÍ!�¿ôÁ‹¿±¸ßö­^¶Åß´]Ÿ¬&‡ŽñêøhÝë‘½–�#¡ã“*Zæ¸L´>K�,éGÞÒ§â«åKúÉŸçÏ\w>Èñ5õ]»™á‹-ð2íºä– »èqRs#?X±bü9ÀVq³-ËŽJK!	<´=
"‘Ö4sòÏ�=§¨µq®›™WvÝåúüË/TK£ñÞkƒÍËXe“dIƒœë$9G™£M7\ò@Æ&†çøSœ¿Jã5ñÈÄØH’Ùâ�š+C%)ÊRˆV†¦U)&¤˜ÌE}ûÐñUc|ÖÖ8�L
h²,]M
hR@“šÐädºV‹ui•¤(KQIf›—Ž)EUŠ	)4>&…<Ð¸€Æ+RRb\ã‚×k›ÓµàJ‚+	®$¸’àJ‚+	®$¸’0•…©,ˆ² Ê‚(ëåÍè	gÆu¿!Ð²¦œ1tmêZ&¯Èa­kEX+ñ�V4tVˆ!6dZC@†€2dÈ�¥š‚0a
Â„©—zhüL@f•Ï»?PUTTPUT…¦*4US^nHKhª‚˜Ä„ ÄñEE|Q_TÄñEE|Q™Ä¤ &!¦¨L
b²’n•bÙÜŠBLa°)¸—¢$EYŠŠ†¦U)&¤˜ÌÌ)›ÜK2—!–0Ä†XÂKb	C,aŒIIHJ‚3bCÌ`ˆ1ƒ!f0Ä†˜Á3bCÌ`ˆ	_FYeA”!0Ê‚¨¢"ˆŠ DzC¤7DzC¤7DzC¤7*‚0!º¢»!º¢»!º¢»!º¢»!º¢»!º¢»!º¦ LAˆè†)S,z«Ä.Á¢sK"º!¢UAT!¢"º!¢"º!¢"º!¢"º!¢"º!¢"º!¢"º!¢"º1)‰†DC"�Á¢·JUÛ´41¦kÆ™"½)Ò›:”&]›2X•bB
æ3ÅK¦èoŠþ¦èoŠþ¦èoŠþ¦èoŠþ¦èoŠþ¦èoŠþ¦èoŠþ¦èoŠþ¦èoŠþf)¹–¥Uz…«Æu]ÒuY×z©«ôRW™º®êzB×ƒùVézJ×ÓºžÑõlROiÞ)Í;¥y§4ï”æ�Ò¼SšwJóNiÞ)Í;¥y§4ï”æ�Ò¼SšWÍÒ´æ�Ö¼ÓšwZóNkÞiÍ;­y§5ï´æ�Ö¼ÓšwZóNkÞiÍ«ckIÇÖÒŒæ�Ñ¼3šWGØ’Ž°¥Í;£yg4ïŒæ�Ñ¼3šwFóÎhÞYÍ;«yg5ï¬æ�Õ¼³šwVóÎŠS&5é¬&�Õ¤³štV“ÎjÒÙÙÿº	Œ   /*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
* {
    -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */
}

body {
    -webkit-touch-callout: none;                /* prevent callout to copy image, etc when tap to hold */
    -webkit-text-size-adjust: none;             /* prevent webkit from resizing text to fit */
    -webkit-user-select: none;                  /* prevent copy paste, to allow, change 'none' to 'text' */
    background-color:#E4E4E4;
    background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
    font-family: system-ui, -apple-system, -apple-system-font, 'Segoe UI', 'Roboto', sans-serif;
    font-size:12px;
    height:100vh;
    margin:0px;
    padding:0px;
    /* Padding to avoid the "unsafe" areas behind notches in the screen */
    padding: env(safe-area-inset-top, 0px) env(safe-area-inset-right, 0px) env(safe-area-inset-bottom, 0px) env(safe-area-inset-right, 0px);
    text-transform:uppercase;
    width:100%;
}

/* Portrait layout (default) */
.app {
    background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */
    position:absolute;             /* position in the center of the screen */
    left:50%;
    top:50%;
    height:50px;                   /* text area height */
    width:225px;                   /* text area width */
    text-align:center;
    padding:180px 0px 0px 0px;     /* image height is 200px (bottom 20px are overlapped with text) */
    margin:-115px 0px 0px -112px;  /* offset vertical: half of image height and text area height */
                                   /* offset horizontal: half of text area width */
}

/* Landscape layout (with min-width) */
@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) {
    .app {
        background-position:left center;
        padding:75px 0px 75px 170px;  /* padding-top + padding-bottom + text area = image height */
        margin:-90px 0px 0px -198px;  /* offset vertical: half of image height */
                                      /* offset horizontal: half of image width and text area width */
    }
}

h1 {
    font-size:24px;
    font-weight:normal;
    margin:0px;
    overflow:visible;
    padding:0px;
    text-align:center;
}

.event {
    border-radius:4px;
    -webkit-border-radius:4px;
    color:#FFFFFF;
    font-size:12px;
    margin:0px 30px;
    padding:2px 0px;
}

.event.listening {
    background-color:#333333;
    display:block;
}

.event.received {
    background-color:#4B946A;
    display:none;
}

@keyframes fade {
    from { opacity: 1.0; }
    50% { opacity: 0.4; }
    to { opacity: 1.0; }
}
 
@-webkit-keyframes fade {
    from { opacity: 1.0; }
    50% { opacity: 0.4; }
    to { opacity: 1.0; }
}
 
.blink {
    animation:fade 3000ms infinite;
    -webkit-animation:fade 3000ms infinite;
}
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

let config;

function Config (xhr) {
    function loadPreferences (xhr) {
        let parser = new DOMParser();
        let doc = parser.parseFromString(xhr.responseText, 'application/xml');
        let preferences = doc.getElementsByTagName('preference');

        return Array.prototype.slice.call(preferences);
    }

    this.xhr = xhr;
    this.preferences = loadPreferences(this.xhr);
}

function readConfig (success, error) {
    var xhr;

    if (typeof config != 'undefined') {
        success(config);
    }

    function fail (msg) {
        console.error(msg);

        if (error) {
            error(msg);
        }
    }

    var xhrStatusChangeHandler = function () {
        if (xhr.readyState === 4) {
            if (xhr.status === 200 || xhr.status === 304 || xhr.status === 0 /* file:// */) {
                config = new Config(xhr);
                success(config);
            } else {
                fail('[Electron][cordova.js][xhrStatusChangeHandler] Could not XHR config.xml: ' + xhr.statusText);
            }
        }
    };

    xhr = new XMLHttpRequest();
    xhr.addEventListener('load', xhrStatusChangeHandler);

    try {
        xhr.open('get', 'config.xml', true);
        xhr.send();
    } catch (e) {
        fail('[Electron][cordova.js][readConfig] Could not XHR config.xml: ' + JSON.stringify(e));
    }
}

/**
 * Reads a preference value from config.xml.
 * Returns preference value or undefined if it does not exist.
 * @param {String} preferenceName Preference name to read */
Config.prototype.getPreferenceValue = function getPreferenceValue (preferenceName) {
    var preferenceItem = this.preferences && this.preferences.filter(function (item) {
        return item.attributes.name && item.attributes.name.value === preferenceName;
    });

    if (preferenceItem && preferenceItem[0] && preferenceItem[0].attributes && preferenceItem[0].attributes.value) {
        return preferenceItem[0].attributes.value.value;
    }
};

exports.readConfig = readConfig;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/* global require, module, console */

const cordova = require('cordova');
const execProxy = require('cordova/exec/proxy');

/**
 * Execute a cordova command.  It is up to the native side whether this action
 * is synchronous or asynchronous.  The native side can return:
 *      Synchronous: PluginResult object as a JSON string
 *      Asynchronous: Empty string ""
 * If async, the native side will cordova.callbackSuccess or cordova.callbackError,
 * depending upon the result of the action.
 *
 * @param {Function} success    The success callback
 * @param {Function} fail       The fail callback
 * @param {String} service      The name of the service to use
 * @param {String} action       Action to be run in cordova
 * @param {String[]} [args]     Zero or more arguments to pass to the method
 */
module.exports = function (success, fail, service, action, args) {

    var proxy = execProxy.get(service, action);

    args = args || [];

    if (proxy) {

        var callbackId = service + cordova.callbackId++;

        if (typeof success === 'function' || typeof fail === 'function') {
            cordova.callbacks[callbackId] = { success: success, fail: fail };
        }
        try {
            // callbackOptions param represents additional optional parameters command could pass back, like keepCallback or
            // custom callbackId, for example {callbackId: id, keepCallback: true, status: cordova.callbackStatus.JSON_EXCEPTION }
            var onSuccess = function (result, callbackOptions) {
                callbackOptions = callbackOptions || {};
                var callbackStatus;
                // covering both undefined and null.
                // strict null comparison was causing callbackStatus to be undefined
                // and then no callback was called because of the check in cordova.callbackFromNative
                // see CB-8996 Mobilespec app hang on windows
                if (callbackOptions.status !== undefined && callbackOptions.status !== null) {
                    callbackStatus = callbackOptions.status;
                } else {
                    callbackStatus = cordova.callbackStatus.OK;
                }
                cordova.callbackSuccess(callbackOptions.callbackId || callbackId,
                    {
                        status: callbackStatus,
                        message: result,
                        keepCallback: callbackOptions.keepCallback || false
                    });
            };
            var onError = function (err, callbackOptions) {
                callbackOptions = callbackOptions || {};
                var callbackStatus;
                // covering both undefined and null.
                // strict null comparison was causing callbackStatus to be undefined
                // and then no callback was called because of the check in cordova.callbackFromNative
                // note: status can be 0
                if (callbackOptions.status !== undefined && callbackOptions.status !== null) {
                    callbackStatus = callbackOptions.status;
                } else {
                    callbackStatus = cordova.callbackStatus.OK;
                }
                cordova.callbackError(callbackOptions.callbackId || callbackId, {
                    status: callbackStatus,
                    message: err,
                    keepCallback: callbackOptions.keepCallback || false
                });
            };
            proxy(onSuccess, onError, args);

        } catch (e) {
            console.log('Exception calling native with command :: ' + service + ' :: ' + action + ' ::exception=' + e);
        }
    } else {

        console.log('Error: exec proxy not found for :: ' + service + ' :: ' + action);

        if (typeof fail === 'function') {
            fail('Missing Command Error');
        }
    }
};
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

module.exports = {
    id: 'electron',
    cordovaVersion: '4.2.0', // cordova-js

    bootstrap: function () {

        var modulemapper = require('cordova/modulemapper');
        var channel = require('cordova/channel');

        modulemapper.clobbers('cordova/exec/proxy', 'cordova.commandProxy');

        channel.onNativeReady.fire();

        document.addEventListener('visibilitychange', function () {
            if (document.hidden) {
                channel.onPause.fire();
            } else {
                channel.onResume.fire();
            }
        });

    // End of bootstrap
    }
};
    MIT License

    Copyright (c) Microsoft Corporation. All rights reserved.

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE
{
  "dependencies": {},
  "deprecated": false,
  "description": "TypeScript definitions for debug",
  "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped#readme",
  "license": "MIT",
  "main": "",
  "name": "@types/debug",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/DefinitelyTyped/DefinitelyTyped.git",
    "directory": "types/debug"
  },
  "typeScriptVersion": "2.0",
  "types": "index",
  "typesPublisherContentHash": "c45deaee8b444b3ae0df891511582b5067c8c689a7d9b4cabe984bacad67e4ab",
  "version": "4.1.5"
}This software is dual-licensed under the ISC and MIT licenses.
You may use this software under EITHER of the following licenses.

----------

The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

----------

Copyright Isaac Z. Schlueter and Contributors
All rights reserved.

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
module.exports = exports = abbrev.abbrev = abbrev

abbrev.monkeyPatch = monkeyPatch

function monkeyPatch () {
  Object.defineProperty(Array.prototype, 'abbrev', {
    value: function () { return abbrev(this) },
    enumerable: false, configurable: true, writable: true
  })

  Object.defineProperty(Object.prototype, 'abbrev', {
    value: function () { return abbrev(Object.keys(this)) },
    enumerable: false, configurable: true, writable: true
  })
}

function abbrev (list) {
  if (arguments.length !== 1 || !Array.isArray(list)) {
    list = Array.prototype.slice.call(arguments, 0)
  }
  for (var i = 0, l = list.length, args = [] ; i < l ; i ++) {
    args[i] = typeof list[i] === "string" ? list[i] : String(list[i])
  }

  // sort them lexicographically, so that they're next to their nearest kin
  args = args.sort(lexSort)

  // walk through each, seeing how much it has in common with the next and previous
  var abbrevs = {}
    , prev = ""
  for (var i = 0, l = args.length ; i < l ; i ++) {
    var current = args[i]
      , next = args[i + 1] || ""
      , nextMatches = true
      , prevMatches = true
    if (current === next) continue
    for (var j = 0, cl = current.length ; j < cl ; j ++) {
      var curChar = current.charAt(j)
      nextMatches = nextMatches && curChar === next.charAt(j)
      prevMatches = prevMatches && curChar === prev.charAt(j)
      if (!nextMatches && !prevMatches) {
        j ++
        break
      }
    }
    prev = current
    if (j === cl) {
      abbrevs[current] = current
      continue
    }
    for (var a = current.substr(0, j) ; j <= cl ; j ++) {
      abbrevs[a] = current
      a += current.charAt(j)
    }
  }
  return abbrevs
}

function lexSort (a, b) {
  return a === b ? 0 : a > b ? 1 : -1
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me"
  },
  "deprecated": false,
  "description": "Like ruby's abbrev module, but in js",
  "devDependencies": {
    "tap": "^10.1"
  },
  "files": [
    "abbrev.js"
  ],
  "homepage": "https://github.com/isaacs/abbrev-js#readme",
  "license": "ISC",
  "main": "abbrev.js",
  "name": "abbrev",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/isaacs/abbrev-js.git"
  },
  "version": "1.1.1"
}var Ajv = require('ajv');
var ajv = new Ajv({allErrors: true});

var schema = {
  "properties": {
    "foo": { "type": "string" },
    "bar": { "type": "number", "maximum": 3 }
  }
};

var validate = ajv.compile(schema);

test({"foo": "abc", "bar": 2});
test({"foo": 2, "bar": 4});

function test(data) {
  var valid = validate(data);
  if (valid) console.log('Valid!');
  else console.log('Invalid: ' + ajv.errorsText(validate.errors));
}The MIT License (MIT)

Copyright (c) 2015-2017 Evgeny Poberezkin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

{
  "author": {
    "name": "Evgeny Poberezkin"
  },
  "collective": {
    "type": "opencollective",
    "url": "https://opencollective.com/ajv"
  },
  "dependencies": {
    "fast-deep-equal": "^3.1.1",
    "fast-json-stable-stringify": "^2.0.0",
    "json-schema-traverse": "^0.4.1",
    "uri-js": "^4.2.2"
  },
  "deprecated": false,
  "description": "Another JSON Schema Validator",
  "devDependencies": {
    "ajv-async": "^1.0.0",
    "bluebird": "^3.5.3",
    "brfs": "^2.0.0",
    "browserify": "^16.2.0",
    "chai": "^4.0.1",
    "coveralls": "^3.0.1",
    "del-cli": "^3.0.0",
    "dot": "^1.0.3",
    "eslint": "^7.3.1",
    "gh-pages-generator": "^0.2.3",
    "glob": "^7.0.0",
    "if-node-version": "^1.0.0",
    "js-beautify": "^1.7.3",
    "jshint": "^2.10.2",
    "json-schema-test": "^2.0.0",
    "karma": "^5.0.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-mocha": "^2.0.0",
    "karma-sauce-launcher": "^4.1.3",
    "mocha": "^8.0.1",
    "nyc": "^15.0.0",
    "pre-commit": "^1.1.1",
    "require-globify": "^1.3.0",
    "typescript": "^3.9.5",
    "uglify-js": "^3.6.9",
    "watch": "^1.0.0"
  },
  "files": [
    "lib/",
    "dist/",
    "scripts/",
    "LICENSE",
    ".tonic_example.js"
  ],
  "funding": {
    "type": "github",
    "url": "https://github.com/sponsors/epoberezkin"
  },
  "homepage": "https://github.com/ajv-validator/ajv",
  "license": "MIT",
  "main": "lib/ajv.js",
  "name": "ajv",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ajv-validator/ajv.git"
  },
  "tonicExampleFilename": ".tonic_example.js",
  "typings": "lib/ajv.d.ts",
  "version": "6.12.5"
}rules:
  no-console: 0
  no-empty: [2, allowEmptyCatch: true]
'use strict';

var fs = require('fs')
  , path = require('path')
  , browserify = require('browserify')
  , uglify = require('uglify-js');

var pkg = process.argv[2]
  , standalone = process.argv[3]
  , compress = process.argv[4];

var packageDir = path.join(__dirname, '..');
if (pkg != '.') packageDir = path.join(packageDir, 'node_modules', pkg);

var json = require(path.join(packageDir, 'package.json'));

var distDir = path.join(__dirname, '..', 'dist');
if (!fs.existsSync(distDir)) fs.mkdirSync(distDir);

var bOpts = {};
if (standalone) bOpts.standalone = standalone;

browserify(bOpts)
.require(path.join(packageDir, json.main), {expose: json.name})
.bundle(function (err, buf) {
  if (err) {
    console.error('browserify error:', err);
    process.exit(1);
  }

  var outputFile = path.join(distDir, json.name);
  var uglifyOpts = {
    warnings: true,
    compress: {},
    output: {
      preamble: '/* ' + json.name + ' ' + json.version + ': ' + json.description + ' */'
    }
  };
  if (compress) {
    var compressOpts = compress.split(',');
    for (var i=0, il = compressOpts.length; i<il; ++i) {
      var pair = compressOpts[i].split('=');
      uglifyOpts.compress[pair[0]] = pair.length < 1 || pair[1] != 'false';
    }
  }
  if (standalone) {
    uglifyOpts.sourceMap = {
      filename: json.name + '.min.js',
      url: json.name + '.min.js.map'
    };
  }

  var result = uglify.minify(buf.toString(), uglifyOpts);
  fs.writeFileSync(outputFile + '.min.js', result.code);
  if (result.map) fs.writeFileSync(outputFile + '.min.js.map', result.map);
  if (standalone) fs.writeFileSync(outputFile + '.bundle.js', buf);
  if (result.warnings) {
    for (var j=0, jl = result.warnings.length; j<jl; ++j)
      console.warn('UglifyJS warning:', result.warnings[j]);
  }
});
//compile doT templates to js functions
'use strict';

var glob = require('glob')
  , fs = require('fs')
  , path = require('path')
  , doT = require('dot')
  , beautify = require('js-beautify').js_beautify;

var defsRootPath = process.argv[2] || path.join(__dirname, '../lib');

var defs = {};
var defFiles = glob.sync('./dot/**/*.def', { cwd: defsRootPath });
defFiles.forEach(function (f) {
  var name = path.basename(f, '.def');
  defs[name] = fs.readFileSync(path.join(defsRootPath, f));
});

var filesRootPath = process.argv[3] || path.join(__dirname, '../lib');
var files = glob.sync('./dot/**/*.jst', { cwd: filesRootPath });

var dotjsPath = path.join(filesRootPath, './dotjs');
try { fs.mkdirSync(dotjsPath); } catch(e) {}

console.log('\n\nCompiling:');

var FUNCTION_NAME = /function\s+anonymous\s*\(it[^)]*\)\s*{/;
var OUT_EMPTY_STRING = /out\s*\+=\s*'\s*';/g;
var ISTANBUL = /'(istanbul[^']+)';/g;
var ERROR_KEYWORD = /\$errorKeyword/g;
var ERROR_KEYWORD_OR = /\$errorKeyword\s+\|\|/g;
var VARS = [
  '$errs', '$valid', '$lvl', '$data', '$dataLvl',
  '$errorKeyword', '$closingBraces', '$schemaPath',
  '$validate'
];

files.forEach(function (f) {
  var keyword = path.basename(f, '.jst');
  var targetPath = path.join(dotjsPath, keyword + '.js');
  var template = fs.readFileSync(path.join(filesRootPath, f));
  var code = doT.compile(template, defs);
  code = code.toString()
             .replace(OUT_EMPTY_STRING, '')
             .replace(FUNCTION_NAME, 'function generate_' + keyword + '(it, $keyword, $ruleType) {')
             .replace(ISTANBUL, '/* $1 */');
  removeAlwaysFalsyInOr();
  VARS.forEach(removeUnusedVar);
  code = "'use strict';\nmodule.exports = " + code;
  code = beautify(code, { indent_size: 2 }) + '\n';
  fs.writeFileSync(targetPath, code);
  console.log('compiled', keyword);

  function removeUnusedVar(v) {
    v = v.replace(/\$/g, '\\$$');
    var regexp = new RegExp(v + '[^A-Za-z0-9_$]', 'g');
    var count = occurrences(regexp);
    if (count == 1) {
      regexp = new RegExp('var\\s+' + v + '\\s*=[^;]+;|var\\s+' + v + ';');
      code = code.replace(regexp, '');
    }
  }

  function removeAlwaysFalsyInOr() {
    var countUsed = occurrences(ERROR_KEYWORD);
    var countOr = occurrences(ERROR_KEYWORD_OR);
    if (countUsed == countOr + 1) code = code.replace(ERROR_KEYWORD_OR, '');
  }

  function occurrences(regexp) {
    return (code.match(regexp) || []).length;
  }
});
#!/usr/bin/env node

'use strict';

var fs = require('fs');
var name = process.argv[2] || '.';
var property = process.argv[3] || 'version';
if (name != '.') name = 'node_modules/' + name;
var json = JSON.parse(fs.readFileSync(name + '/package.json', 'utf8'));
console.log(json[property]);
#!/usr/bin/env sh

set -e

mkdir -p .browser

echo
echo Preparing browser tests:

find spec -type f -name '*.spec.js' | \
xargs -I {} sh -c \
'export f="{}"; echo $f; browserify $f -t require-globify -t brfs -x ajv -u buffer -o $(echo $f | sed -e "s/spec/.browser/");'
#!/usr/bin/env bash

set -e

if [[ -n $TRAVIS_TAG && $TRAVIS_JOB_NUMBER =~ ".3" ]]; then
  echo "About to publish $TRAVIS_TAG to ajv-dist..."

  git config user.email "$GIT_USER_EMAIL"
  git config user.name "$GIT_USER_NAME"

  git clone https://${GITHUB_TOKEN}@github.com/ajv-validator/ajv-dist.git ../ajv-dist

  rm -rf ../ajv-dist/dist
  mkdir ../ajv-dist/dist
  cp ./dist/ajv.* ../ajv-dist/dist
  cat bower.json | sed 's/"name": "ajv"/"name": "ajv-dist"/' > ../ajv-dist/bower.json
  cd ../ajv-dist

  if [[ `git status --porcelain` ]]; then
    echo "Changes detected. Updating master branch..."
    git add -A
    git commit -m "updated by travis build #$TRAVIS_BUILD_NUMBER"
    git push --quiet origin master > /dev/null 2>&1
  fi

  echo "Publishing tag..."

  git tag $TRAVIS_TAG
  git push --tags > /dev/null 2>&1

  echo "Done"
fi
#!/usr/bin/env bash

set -e

if [[ "$TRAVIS_BRANCH" == "master" && "$TRAVIS_PULL_REQUEST" == "false" && $TRAVIS_JOB_NUMBER =~ ".3" ]]; then
  git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qE '\.md$|^LICENSE$|travis-gh-pages$' && {
    rm -rf ../gh-pages
    git clone -b gh-pages --single-branch https://${GITHUB_TOKEN}@github.com/ajv-validator/ajv.git ../gh-pages
    mkdir -p ../gh-pages/_source
    cp *.md ../gh-pages/_source
    cp LICENSE ../gh-pages/_source
    currentDir=$(pwd)
    cd ../gh-pages
    $currentDir/node_modules/.bin/gh-pages-generator
    # remove logo from README
    sed -i -E "s/<img[^>]+ajv_logo[^>]+>//" index.md
    git config user.email "$GIT_USER_EMAIL"
    git config user.name "$GIT_USER_NAME"
    git add .
    git commit -am "updated by travis build #$TRAVIS_BUILD_NUMBER"
    git push --quiet origin gh-pages > /dev/null 2>&1
  }
fi
'use strict';

var compileSchema = require('./compile')
  , resolve = require('./compile/resolve')
  , Cache = require('./cache')
  , SchemaObject = require('./compile/schema_obj')
  , stableStringify = require('fast-json-stable-stringify')
  , formats = require('./compile/formats')
  , rules = require('./compile/rules')
  , $dataMetaSchema = require('./data')
  , util = require('./compile/util');

module.exports = Ajv;

Ajv.prototype.validate = validate;
Ajv.prototype.compile = compile;
Ajv.prototype.addSchema = addSchema;
Ajv.prototype.addMetaSchema = addMetaSchema;
Ajv.prototype.validateSchema = validateSchema;
Ajv.prototype.getSchema = getSchema;
Ajv.prototype.removeSchema = removeSchema;
Ajv.prototype.addFormat = addFormat;
Ajv.prototype.errorsText = errorsText;

Ajv.prototype._addSchema = _addSchema;
Ajv.prototype._compile = _compile;

Ajv.prototype.compileAsync = require('./compile/async');
var customKeyword = require('./keyword');
Ajv.prototype.addKeyword = customKeyword.add;
Ajv.prototype.getKeyword = customKeyword.get;
Ajv.prototype.removeKeyword = customKeyword.remove;
Ajv.prototype.validateKeyword = customKeyword.validate;

var errorClasses = require('./compile/error_classes');
Ajv.ValidationError = errorClasses.Validation;
Ajv.MissingRefError = errorClasses.MissingRef;
Ajv.$dataMetaSchema = $dataMetaSchema;

var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema';

var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ];
var META_SUPPORT_DATA = ['/properties'];

/**
 * Creates validator instance.
 * Usage: `Ajv(opts)`
 * @param {Object} opts optional options
 * @return {Object} ajv instance
 */
function Ajv(opts) {
  if (!(this instanceof Ajv)) return new Ajv(opts);
  opts = this._opts = util.copy(opts) || {};
  setLogger(this);
  this._schemas = {};
  this._refs = {};
  this._fragments = {};
  this._formats = formats(opts.format);

  this._cache = opts.cache || new Cache;
  this._loadingSchemas = {};
  this._compilations = [];
  this.RULES = rules();
  this._getId = chooseGetId(opts);

  opts.loopRequired = opts.loopRequired || Infinity;
  if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true;
  if (opts.serialize === undefined) opts.serialize = stableStringify;
  this._metaOpts = getMetaSchemaOptions(this);

  if (opts.formats) addInitialFormats(this);
  if (opts.keywords) addInitialKeywords(this);
  addDefaultMetaSchema(this);
  if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta);
  if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}});
  addInitialSchemas(this);
}



/**
 * Validate data using schema
 * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize.
 * @this   Ajv
 * @param  {String|Object} schemaKeyRef key, ref or schema object
 * @param  {Any} data to be validated
 * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`).
 */
function validate(schemaKeyRef, data) {
  var v;
  if (typeof schemaKeyRef == 'string') {
    v = this.getSchema(schemaKeyRef);
    if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"');
  } else {
    var schemaObj = this._addSchema(schemaKeyRef);
    v = schemaObj.validate || this._compile(schemaObj);
  }

  var valid = v(data);
  if (v.$async !== true) this.errors = v.errors;
  return valid;
}


/**
 * Create validating function for passed schema.
 * @this   Ajv
 * @param  {Object} schema schema object
 * @param  {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords.
 * @return {Function} validating function
 */
function compile(schema, _meta) {
  var schemaObj = this._addSchema(schema, undefined, _meta);
  return schemaObj.validate || this._compile(schemaObj);
}


/**
 * Adds schema to the instance.
 * @this   Ajv
 * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored.
 * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`.
 * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead.
 * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead.
 * @return {Ajv} this for method chaining
 */
function addSchema(schema, key, _skipValidation, _meta) {
  if (Array.isArray(schema)){
    for (var i=0; i<schema.length; i++) this.addSchema(schema[i], undefined, _skipValidation, _meta);
    return this;
  }
  var id = this._getId(schema);
  if (id !== undefined && typeof id != 'string')
    throw new Error('schema id must be string');
  key = resolve.normalizeId(key || id);
  checkUnique(this, key);
  this._schemas[key] = this._addSchema(schema, _skipValidation, _meta, true);
  return this;
}


/**
 * Add schema that will be used to validate other schemas
 * options in META_IGNORE_OPTIONS are alway set to false
 * @this   Ajv
 * @param {Object} schema schema object
 * @param {String} key optional schema key
 * @param {Boolean} skipValidation true to skip schema validation, can be used to override validateSchema option for meta-schema
 * @return {Ajv} this for method chaining
 */
function addMetaSchema(schema, key, skipValidation) {
  this.addSchema(schema, key, skipValidation, true);
  return this;
}


/**
 * Validate schema
 * @this   Ajv
 * @param {Object} schema schema to validate
 * @param {Boolean} throwOrLogError pass true to throw (or log) an error if invalid
 * @return {Boolean} true if schema is valid
 */
function validateSchema(schema, throwOrLogError) {
  var $schema = schema.$schema;
  if ($schema !== undefined && typeof $schema != 'string')
    throw new Error('$schema must be a string');
  $schema = $schema || this._opts.defaultMeta || defaultMeta(this);
  if (!$schema) {
    this.logger.warn('meta-schema not available');
    this.errors = null;
    return true;
  }
  var valid = this.validate($schema, schema);
  if (!valid && throwOrLogError) {
    var message = 'schema is invalid: ' + this.errorsText();
    if (this._opts.validateSchema == 'log') this.logger.error(message);
    else throw new Error(message);
  }
  return valid;
}


function defaultMeta(self) {
  var meta = self._opts.meta;
  self._opts.defaultMeta = typeof meta == 'object'
                            ? self._getId(meta) || meta
                            : self.getSchema(META_SCHEMA_ID)
                              ? META_SCHEMA_ID
                              : undefined;
  return self._opts.defaultMeta;
}


/**
 * Get compiled schema from the instance by `key` or `ref`.
 * @this   Ajv
 * @param  {String} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id).
 * @return {Function} schema validating function (with property `schema`).
 */
function getSchema(keyRef) {
  var schemaObj = _getSchemaObj(this, keyRef);
  switch (typeof schemaObj) {
    case 'object': return schemaObj.validate || this._compile(schemaObj);
    case 'string': return this.getSchema(schemaObj);
    case 'undefined': return _getSchemaFragment(this, keyRef);
  }
}


function _getSchemaFragment(self, ref) {
  var res = resolve.schema.call(self, { schema: {} }, ref);
  if (res) {
    var schema = res.schema
      , root = res.root
      , baseId = res.baseId;
    var v = compileSchema.call(self, schema, root, undefined, baseId);
    self._fragments[ref] = new SchemaObject({
      ref: ref,
      fragment: true,
      schema: schema,
      root: root,
      baseId: baseId,
      validate: v
    });
    return v;
  }
}


function _getSchemaObj(self, keyRef) {
  keyRef = resolve.normalizeId(keyRef);
  return self._schemas[keyRef] || self._refs[keyRef] || self._fragments[keyRef];
}


/**
 * Remove cached schema(s).
 * If no parameter is passed all schemas but meta-schemas are removed.
 * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed.
 * Even if schema is referenced by other schemas it still can be removed as other schemas have local references.
 * @this   Ajv
 * @param  {String|Object|RegExp} schemaKeyRef key, ref, pattern to match key/ref or schema object
 * @return {Ajv} this for method chaining
 */
function removeSchema(schemaKeyRef) {
  if (schemaKeyRef instanceof RegExp) {
    _removeAllSchemas(this, this._schemas, schemaKeyRef);
    _removeAllSchemas(this, this._refs, schemaKeyRef);
    return this;
  }
  switch (typeof schemaKeyRef) {
    case 'undefined':
      _removeAllSchemas(this, this._schemas);
      _removeAllSchemas(this, this._refs);
      this._cache.clear();
      return this;
    case 'string':
      var schemaObj = _getSchemaObj(this, schemaKeyRef);
      if (schemaObj) this._cache.del(schemaObj.cacheKey);
      delete this._schemas[schemaKeyRef];
      delete this._refs[schemaKeyRef];
      return this;
    case 'object':
      var serialize = this._opts.serialize;
      var cacheKey = serialize ? serialize(schemaKeyRef) : schemaKeyRef;
      this._cache.del(cacheKey);
      var id = this._getId(schemaKeyRef);
      if (id) {
        id = resolve.normalizeId(id);
        delete this._schemas[id];
        delete this._refs[id];
      }
  }
  return this;
}


function _removeAllSchemas(self, schemas, regex) {
  for (var keyRef in schemas) {
    var schemaObj = schemas[keyRef];
    if (!schemaObj.meta && (!regex || regex.test(keyRef))) {
      self._cache.del(schemaObj.cacheKey);
      delete schemas[keyRef];
    }
  }
}


/* @this   Ajv */
function _addSchema(schema, skipValidation, meta, shouldAddSchema) {
  if (typeof schema != 'object' && typeof schema != 'boolean')
    throw new Error('schema should be object or boolean');
  var serialize = this._opts.serialize;
  var cacheKey = serialize ? serialize(schema) : schema;
  var cached = this._cache.get(cacheKey);
  if (cached) return cached;

  shouldAddSchema = shouldAddSchema || this._opts.addUsedSchema !== false;

  var id = resolve.normalizeId(this._getId(schema));
  if (id && shouldAddSchema) checkUnique(this, id);

  var willValidate = this._opts.validateSchema !== false && !skipValidation;
  var recursiveMeta;
  if (willValidate && !(recursiveMeta = id && id == resolve.normalizeId(schema.$schema)))
    this.validateSchema(schema, true);

  var localRefs = resolve.ids.call(this, schema);

  var schemaObj = new SchemaObject({
    id: id,
    schema: schema,
    localRefs: localRefs,
    cacheKey: cacheKey,
    meta: meta
  });

  if (id[0] != '#' && shouldAddSchema) this._refs[id] = schemaObj;
  this._cache.put(cacheKey, schemaObj);

  if (willValidate && recursiveMeta) this.validateSchema(schema, true);

  return schemaObj;
}


/* @this   Ajv */
function _compile(schemaObj, root) {
  if (schemaObj.compiling) {
    schemaObj.validate = callValidate;
    callValidate.schema = schemaObj.schema;
    callValidate.errors = null;
    callValidate.root = root ? root : callValidate;
    if (schemaObj.schema.$async === true)
      callValidate.$async = true;
    return callValidate;
  }
  schemaObj.compiling = true;

  var currentOpts;
  if (schemaObj.meta) {
    currentOpts = this._opts;
    this._opts = this._metaOpts;
  }

  var v;
  try { v = compileSchema.call(this, schemaObj.schema, root, schemaObj.localRefs); }
  catch(e) {
    delete schemaObj.validate;
    throw e;
  }
  finally {
    schemaObj.compiling = false;
    if (schemaObj.meta) this._opts = currentOpts;
  }

  schemaObj.validate = v;
  schemaObj.refs = v.refs;
  schemaObj.refVal = v.refVal;
  schemaObj.root = v.root;
  return v;


  /* @this   {*} - custom context, see passContext option */
  function callValidate() {
    /* jshint validthis: true */
    var _validate = schemaObj.validate;
    var result = _validate.apply(this, arguments);
    callValidate.errors = _validate.errors;
    return result;
  }
}


function chooseGetId(opts) {
  switch (opts.schemaId) {
    case 'auto': return _get$IdOrId;
    case 'id': return _getId;
    default: return _get$Id;
  }
}

/* @this   Ajv */
function _getId(schema) {
  if (schema.$id) this.logger.warn('schema $id ignored', schema.$id);
  return schema.id;
}

/* @this   Ajv */
function _get$Id(schema) {
  if (schema.id) this.logger.warn('schema id ignored', schema.id);
  return schema.$id;
}


function _get$IdOrId(schema) {
  if (schema.$id && schema.id && schema.$id != schema.id)
    throw new Error('schema $id is different from id');
  return schema.$id || schema.id;
}


/**
 * Convert array of error message objects to string
 * @this   Ajv
 * @param  {Array<Object>} errors optional array of validation errors, if not passed errors from the instance are used.
 * @param  {Object} options optional options with properties `separator` and `dataVar`.
 * @return {String} human readable string with all errors descriptions
 */
function errorsText(errors, options) {
  errors = errors || this.errors;
  if (!errors) return 'No errors';
  options = options || {};
  var separator = options.separator === undefined ? ', ' : options.separator;
  var dataVar = options.dataVar === undefined ? 'data' : options.dataVar;

  var text = '';
  for (var i=0; i<errors.length; i++) {
    var e = errors[i];
    if (e) text += dataVar + e.dataPath + ' ' + e.message + separator;
  }
  return text.slice(0, -separator.length);
}


/**
 * Add custom format
 * @this   Ajv
 * @param {String} name format name
 * @param {String|RegExp|Function} format string is converted to RegExp; function should return boolean (true when valid)
 * @return {Ajv} this for method chaining
 */
function addFormat(name, format) {
  if (typeof format == 'string') format = new RegExp(format);
  this._formats[name] = format;
  return this;
}


function addDefaultMetaSchema(self) {
  var $dataSchema;
  if (self._opts.$data) {
    $dataSchema = require('./refs/data.json');
    self.addMetaSchema($dataSchema, $dataSchema.$id, true);
  }
  if (self._opts.meta === false) return;
  var metaSchema = require('./refs/json-schema-draft-07.json');
  if (self._opts.$data) metaSchema = $dataMetaSchema(metaSchema, META_SUPPORT_DATA);
  self.addMetaSchema(metaSchema, META_SCHEMA_ID, true);
  self._refs['http://json-schema.org/schema'] = META_SCHEMA_ID;
}


function addInitialSchemas(self) {
  var optsSchemas = self._opts.schemas;
  if (!optsSchemas) return;
  if (Array.isArray(optsSchemas)) self.addSchema(optsSchemas);
  else for (var key in optsSchemas) self.addSchema(optsSchemas[key], key);
}


function addInitialFormats(self) {
  for (var name in self._opts.formats) {
    var format = self._opts.formats[name];
    self.addFormat(name, format);
  }
}


function addInitialKeywords(self) {
  for (var name in self._opts.keywords) {
    var keyword = self._opts.keywords[name];
    self.addKeyword(name, keyword);
  }
}


function checkUnique(self, id) {
  if (self._schemas[id] || self._refs[id])
    throw new Error('schema with key or id "' + id + '" already exists');
}


function getMetaSchemaOptions(self) {
  var metaOpts = util.copy(self._opts);
  for (var i=0; i<META_IGNORE_OPTIONS.length; i++)
    delete metaOpts[META_IGNORE_OPTIONS[i]];
  return metaOpts;
}


function setLogger(self) {
  var logger = self._opts.logger;
  if (logger === false) {
    self.logger = {log: noop, warn: noop, error: noop};
  } else {
    if (logger === undefined) logger = console;
    if (!(typeof logger == 'object' && logger.log && logger.warn && logger.error))
      throw new Error('logger must implement log, warn and error methods');
    self.logger = logger;
  }
}


function noop() {}
'use strict';


var Cache = module.exports = function Cache() {
  this._cache = {};
};


Cache.prototype.put = function Cache_put(key, value) {
  this._cache[key] = value;
};


Cache.prototype.get = function Cache_get(key) {
  return this._cache[key];
};


Cache.prototype.del = function Cache_del(key) {
  delete this._cache[key];
};


Cache.prototype.clear = function Cache_clear() {
  this._cache = {};
};
'use strict';

var KEYWORDS = [
  'multipleOf',
  'maximum',
  'exclusiveMaximum',
  'minimum',
  'exclusiveMinimum',
  'maxLength',
  'minLength',
  'pattern',
  'additionalItems',
  'maxItems',
  'minItems',
  'uniqueItems',
  'maxProperties',
  'minProperties',
  'required',
  'additionalProperties',
  'enum',
  'format',
  'const'
];

module.exports = function (metaSchema, keywordsJsonPointers) {
  for (var i=0; i<keywordsJsonPointers.length; i++) {
    metaSchema = JSON.parse(JSON.stringify(metaSchema));
    var segments = keywordsJsonPointers[i].split('/');
    var keywords = metaSchema;
    var j;
    for (j=1; j<segments.length; j++)
      keywords = keywords[segments[j]];

    for (j=0; j<KEYWORDS.length; j++) {
      var key = KEYWORDS[j];
      var schema = keywords[key];
      if (schema) {
        keywords[key] = {
          anyOf: [
            schema,
            { $ref: 'https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#' }
          ]
        };
      }
    }
  }

  return metaSchema;
};
'use strict';

var metaSchema = require('./refs/json-schema-draft-07.json');

module.exports = {
  $id: 'https://github.com/ajv-validator/ajv/blob/master/lib/definition_schema.js',
  definitions: {
    simpleTypes: metaSchema.definitions.simpleTypes
  },
  type: 'object',
  dependencies: {
    schema: ['validate'],
    $data: ['validate'],
    statements: ['inline'],
    valid: {not: {required: ['macro']}}
  },
  properties: {
    type: metaSchema.properties.type,
    schema: {type: 'boolean'},
    statements: {type: 'boolean'},
    dependencies: {
      type: 'array',
      items: {type: 'string'}
    },
    metaSchema: {type: 'object'},
    modifying: {type: 'boolean'},
    valid: {type: 'boolean'},
    $data: {type: 'boolean'},
    async: {type: 'boolean'},
    errors: {
      anyOf: [
        {type: 'boolean'},
        {const: 'full'}
      ]
    }
  }
};
'use strict';

var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i;
var customRuleCode = require('./dotjs/custom');
var definitionSchema = require('./definition_schema');

module.exports = {
  add: addKeyword,
  get: getKeyword,
  remove: removeKeyword,
  validate: validateKeyword
};


/**
 * Define custom keyword
 * @this  Ajv
 * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords).
 * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`.
 * @return {Ajv} this for method chaining
 */
function addKeyword(keyword, definition) {
  /* jshint validthis: true */
  /* eslint no-shadow: 0 */
  var RULES = this.RULES;
  if (RULES.keywords[keyword])
    throw new Error('Keyword ' + keyword + ' is already defined');

  if (!IDENTIFIER.test(keyword))
    throw new Error('Keyword ' + keyword + ' is not a valid identifier');

  if (definition) {
    this.validateKeyword(definition, true);

    var dataType = definition.type;
    if (Array.isArray(dataType)) {
      for (var i=0; i<dataType.length; i++)
        _addRule(keyword, dataType[i], definition);
    } else {
      _addRule(keyword, dataType, definition);
    }

    var metaSchema = definition.metaSchema;
    if (metaSchema) {
      if (definition.$data && this._opts.$data) {
        metaSchema = {
          anyOf: [
            metaSchema,
            { '$ref': 'https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#' }
          ]
        };
      }
      definition.validateSchema = this.compile(metaSchema, true);
    }
  }

  RULES.keywords[keyword] = RULES.all[keyword] = true;


  function _addRule(keyword, dataType, definition) {
    var ruleGroup;
    for (var i=0; i<RULES.length; i++) {
      var rg = RULES[i];
      if (rg.type == dataType) {
        ruleGroup = rg;
        break;
      }
    }

    if (!ruleGroup) {
      ruleGroup = { type: dataType, rules: [] };
      RULES.push(ruleGroup);
    }

    var rule = {
      keyword: keyword,
      definition: definition,
      custom: true,
      code: customRuleCode,
      implements: definition.implements
    };
    ruleGroup.rules.push(rule);
    RULES.custom[keyword] = rule;
  }

  return this;
}


/**
 * Get keyword
 * @this  Ajv
 * @param {String} keyword pre-defined or custom keyword.
 * @return {Object|Boolean} custom keyword definition, `true` if it is a predefined keyword, `false` otherwise.
 */
function getKeyword(keyword) {
  /* jshint validthis: true */
  var rule = this.RULES.custom[keyword];
  return rule ? rule.definition : this.RULES.keywords[keyword] || false;
}


/**
 * Remove keyword
 * @this  Ajv
 * @param {String} keyword pre-defined or custom keyword.
 * @return {Ajv} this for method chaining
 */
function removeKeyword(keyword) {
  /* jshint validthis: true */
  var RULES = this.RULES;
  delete RULES.keywords[keyword];
  delete RULES.all[keyword];
  delete RULES.custom[keyword];
  for (var i=0; i<RULES.length; i++) {
    var rules = RULES[i].rules;
    for (var j=0; j<rules.length; j++) {
      if (rules[j].keyword == keyword) {
        rules.splice(j, 1);
        break;
      }
    }
  }
  return this;
}


/**
 * Validate keyword definition
 * @this  Ajv
 * @param {Object} definition keyword definition object.
 * @param {Boolean} throwError true to throw exception if definition is invalid
 * @return {boolean} validation result
 */
function validateKeyword(definition, throwError) {
  validateKeyword.errors = null;
  var v = this._validateKeyword = this._validateKeyword
                                  || this.compile(definitionSchema, true);

  if (v(definition)) return true;
  validateKeyword.errors = v.errors;
  if (throwError)
    throw new Error('custom keyword definition is invalid: '  + this.errorsText(v.errors));
  else
    return false;
}
{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",
    "description": "Meta-schema for $data reference (JSON Schema extension proposal)",
    "type": "object",
    "required": [ "$data" ],
    "properties": {
        "$data": {
            "type": "string",
            "anyOf": [
                { "format": "relative-json-pointer" }, 
                { "format": "json-pointer" }
            ]
        }
    },
    "additionalProperties": false
}
{
    "id": "http://json-schema.org/draft-04/schema#",
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Core schema meta-schema",
    "definitions": {
        "schemaArray": {
            "type": "array",
            "minItems": 1,
            "items": { "$ref": "#" }
        },
        "positiveInteger": {
            "type": "integer",
            "minimum": 0
        },
        "positiveIntegerDefault0": {
            "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ]
        },
        "simpleTypes": {
            "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ]
        },
        "stringArray": {
            "type": "array",
            "items": { "type": "string" },
            "minItems": 1,
            "uniqueItems": true
        }
    },
    "type": "object",
    "properties": {
        "id": {
            "type": "string"
        },
        "$schema": {
            "type": "string"
        },
        "title": {
            "type": "string"
        },
        "description": {
            "type": "string"
        },
        "default": {},
        "multipleOf": {
            "type": "number",
            "minimum": 0,
            "exclusiveMinimum": true
        },
        "maximum": {
            "type": "number"
        },
        "exclusiveMaximum": {
            "type": "boolean",
            "default": false
        },
        "minimum": {
            "type": "number"
        },
        "exclusiveMinimum": {
            "type": "boolean",
            "default": false
        },
        "maxLength": { "$ref": "#/definitions/positiveInteger" },
        "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" },
        "pattern": {
            "type": "string",
            "format": "regex"
        },
        "additionalItems": {
            "anyOf": [
                { "type": "boolean" },
                { "$ref": "#" }
            ],
            "default": {}
        },
        "items": {
            "anyOf": [
                { "$ref": "#" },
                { "$ref": "#/definitions/schemaArray" }
            ],
            "default": {}
        },
        "maxItems": { "$ref": "#/definitions/positiveInteger" },
        "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" },
        "uniqueItems": {
            "type": "boolean",
            "default": false
        },
        "maxProperties": { "$ref": "#/definitions/positiveInteger" },
        "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" },
        "required": { "$ref": "#/definitions/stringArray" },
        "additionalProperties": {
            "anyOf": [
                { "type": "boolean" },
                { "$ref": "#" }
            ],
            "default": {}
        },
        "definitions": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "properties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "patternProperties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "dependencies": {
            "type": "object",
            "additionalProperties": {
                "anyOf": [
                    { "$ref": "#" },
                    { "$ref": "#/definitions/stringArray" }
                ]
            }
        },
        "enum": {
            "type": "array",
            "minItems": 1,
            "uniqueItems": true
        },
        "type": {
            "anyOf": [
                { "$ref": "#/definitions/simpleTypes" },
                {
                    "type": "array",
                    "items": { "$ref": "#/definitions/simpleTypes" },
                    "minItems": 1,
                    "uniqueItems": true
                }
            ]
        },
        "format": { "type": "string" },
        "allOf": { "$ref": "#/definitions/schemaArray" },
        "anyOf": { "$ref": "#/definitions/schemaArray" },
        "oneOf": { "$ref": "#/definitions/schemaArray" },
        "not": { "$ref": "#" }
    },
    "dependencies": {
        "exclusiveMaximum": [ "maximum" ],
        "exclusiveMinimum": [ "minimum" ]
    },
    "default": {}
}
{
    "$schema": "http://json-schema.org/draft-06/schema#",
    "$id": "http://json-schema.org/draft-06/schema#",
    "title": "Core schema meta-schema",
    "definitions": {
        "schemaArray": {
            "type": "array",
            "minItems": 1,
            "items": { "$ref": "#" }
        },
        "nonNegativeInteger": {
            "type": "integer",
            "minimum": 0
        },
        "nonNegativeIntegerDefault0": {
            "allOf": [
                { "$ref": "#/definitions/nonNegativeInteger" },
                { "default": 0 }
            ]
        },
        "simpleTypes": {
            "enum": [
                "array",
                "boolean",
                "integer",
                "null",
                "number",
                "object",
                "string"
            ]
        },
        "stringArray": {
            "type": "array",
            "items": { "type": "string" },
            "uniqueItems": true,
            "default": []
        }
    },
    "type": ["object", "boolean"],
    "properties": {
        "$id": {
            "type": "string",
            "format": "uri-reference"
        },
        "$schema": {
            "type": "string",
            "format": "uri"
        },
        "$ref": {
            "type": "string",
            "format": "uri-reference"
        },
        "title": {
            "type": "string"
        },
        "description": {
            "type": "string"
        },
        "default": {},
        "examples": {
            "type": "array",
            "items": {}
        },
        "multipleOf": {
            "type": "number",
            "exclusiveMinimum": 0
        },
        "maximum": {
            "type": "number"
        },
        "exclusiveMaximum": {
            "type": "number"
        },
        "minimum": {
            "type": "number"
        },
        "exclusiveMinimum": {
            "type": "number"
        },
        "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
        "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "pattern": {
            "type": "string",
            "format": "regex"
        },
        "additionalItems": { "$ref": "#" },
        "items": {
            "anyOf": [
                { "$ref": "#" },
                { "$ref": "#/definitions/schemaArray" }
            ],
            "default": {}
        },
        "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
        "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "uniqueItems": {
            "type": "boolean",
            "default": false
        },
        "contains": { "$ref": "#" },
        "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
        "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "required": { "$ref": "#/definitions/stringArray" },
        "additionalProperties": { "$ref": "#" },
        "definitions": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "properties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "patternProperties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "dependencies": {
            "type": "object",
            "additionalProperties": {
                "anyOf": [
                    { "$ref": "#" },
                    { "$ref": "#/definitions/stringArray" }
                ]
            }
        },
        "propertyNames": { "$ref": "#" },
        "const": {},
        "enum": {
            "type": "array",
            "minItems": 1,
            "uniqueItems": true
        },
        "type": {
            "anyOf": [
                { "$ref": "#/definitions/simpleTypes" },
                {
                    "type": "array",
                    "items": { "$ref": "#/definitions/simpleTypes" },
                    "minItems": 1,
                    "uniqueItems": true
                }
            ]
        },
        "format": { "type": "string" },
        "allOf": { "$ref": "#/definitions/schemaArray" },
        "anyOf": { "$ref": "#/definitions/schemaArray" },
        "oneOf": { "$ref": "#/definitions/schemaArray" },
        "not": { "$ref": "#" }
    },
    "default": {}
}
{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "http://json-schema.org/draft-07/schema#",
    "title": "Core schema meta-schema",
    "definitions": {
        "schemaArray": {
            "type": "array",
            "minItems": 1,
            "items": { "$ref": "#" }
        },
        "nonNegativeInteger": {
            "type": "integer",
            "minimum": 0
        },
        "nonNegativeIntegerDefault0": {
            "allOf": [
                { "$ref": "#/definitions/nonNegativeInteger" },
                { "default": 0 }
            ]
        },
        "simpleTypes": {
            "enum": [
                "array",
                "boolean",
                "integer",
                "null",
                "number",
                "object",
                "string"
            ]
        },
        "stringArray": {
            "type": "array",
            "items": { "type": "string" },
            "uniqueItems": true,
            "default": []
        }
    },
    "type": ["object", "boolean"],
    "properties": {
        "$id": {
            "type": "string",
            "format": "uri-reference"
        },
        "$schema": {
            "type": "string",
            "format": "uri"
        },
        "$ref": {
            "type": "string",
            "format": "uri-reference"
        },
        "$comment": {
            "type": "string"
        },
        "title": {
            "type": "string"
        },
        "description": {
            "type": "string"
        },
        "default": true,
        "readOnly": {
            "type": "boolean",
            "default": false
        },
        "examples": {
            "type": "array",
            "items": true
        },
        "multipleOf": {
            "type": "number",
            "exclusiveMinimum": 0
        },
        "maximum": {
            "type": "number"
        },
        "exclusiveMaximum": {
            "type": "number"
        },
        "minimum": {
            "type": "number"
        },
        "exclusiveMinimum": {
            "type": "number"
        },
        "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
        "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "pattern": {
            "type": "string",
            "format": "regex"
        },
        "additionalItems": { "$ref": "#" },
        "items": {
            "anyOf": [
                { "$ref": "#" },
                { "$ref": "#/definitions/schemaArray" }
            ],
            "default": true
        },
        "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
        "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "uniqueItems": {
            "type": "boolean",
            "default": false
        },
        "contains": { "$ref": "#" },
        "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
        "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "required": { "$ref": "#/definitions/stringArray" },
        "additionalProperties": { "$ref": "#" },
        "definitions": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "properties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "patternProperties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "propertyNames": { "format": "regex" },
            "default": {}
        },
        "dependencies": {
            "type": "object",
            "additionalProperties": {
                "anyOf": [
                    { "$ref": "#" },
                    { "$ref": "#/definitions/stringArray" }
                ]
            }
        },
        "propertyNames": { "$ref": "#" },
        "const": true,
        "enum": {
            "type": "array",
            "items": true,
            "minItems": 1,
            "uniqueItems": true
        },
        "type": {
            "anyOf": [
                { "$ref": "#/definitions/simpleTypes" },
                {
                    "type": "array",
                    "items": { "$ref": "#/definitions/simpleTypes" },
                    "minItems": 1,
                    "uniqueItems": true
                }
            ]
        },
        "format": { "type": "string" },
        "contentMediaType": { "type": "string" },
        "contentEncoding": { "type": "string" },
        "if": {"$ref": "#"},
        "then": {"$ref": "#"},
        "else": {"$ref": "#"},
        "allOf": { "$ref": "#/definitions/schemaArray" },
        "anyOf": { "$ref": "#/definitions/schemaArray" },
        "oneOf": { "$ref": "#/definitions/schemaArray" },
        "not": { "$ref": "#" }
    },
    "default": true
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/json-schema-secure.json#",
  "title": "Meta-schema for the security assessment of JSON Schemas",
  "description": "If a JSON Schema fails validation against this meta-schema, it may be unsafe to validate untrusted data",
  "definitions": {
    "schemaArray": {
      "type": "array",
      "minItems": 1,
      "items": {"$ref": "#"}
    }
  },
  "dependencies": {
    "patternProperties": {
      "description": "prevent slow validation of large property names",
      "required": ["propertyNames"],
      "properties": {
        "propertyNames": {
          "required": ["maxLength"]
        }
      }
    },
    "uniqueItems": {
      "description": "prevent slow validation of large non-scalar arrays",
      "if": {
        "properties": {
          "uniqueItems": {"const": true},
          "items": {
            "properties": {
              "type": {
                "anyOf": [
                  {
                    "enum": ["object", "array"]
                  },
                  {
                    "type": "array",
                    "contains": {"enum": ["object", "array"]}
                  }
                ]
              }
            }
          }
        }
      },
      "then": {
        "required": ["maxItems"]
      }
    },
    "pattern": {
      "description": "prevent slow pattern matching of large strings",
      "required": ["maxLength"]
    },
    "format": {
      "description": "prevent slow format validation of large strings",
      "required": ["maxLength"]
    }
  },
  "properties": {
    "additionalItems": {"$ref": "#"},
    "additionalProperties": {"$ref": "#"},
    "dependencies": {
      "additionalProperties": {
        "anyOf": [
          {"type": "array"},
          {"$ref": "#"}
        ]
      }
    },
    "items": {
      "anyOf": [
        {"$ref": "#"},
        {"$ref": "#/definitions/schemaArray"}
      ]
    },
    "definitions": {
      "additionalProperties": {"$ref": "#"}
    },
    "patternProperties": {
      "additionalProperties": {"$ref": "#"}
    },
    "properties": {
      "additionalProperties": {"$ref": "#"}
    },
    "if": {"$ref": "#"},
    "then": {"$ref": "#"},
    "else": {"$ref": "#"},
    "allOf": {"$ref": "#/definitions/schemaArray"},
    "anyOf": {"$ref": "#/definitions/schemaArray"},
    "oneOf": {"$ref": "#/definitions/schemaArray"},
    "not": {"$ref": "#"},
    "contains": {"$ref": "#"},
    "propertyNames": {"$ref": "#"}
  }
}
These files are compiled dot templates from dot folder.

Do NOT edit them directly, edit the templates and run `npm run build` from main ajv folder.
'use strict';
module.exports = function generate__limit(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $isMax = $keyword == 'maximum',
    $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum',
    $schemaExcl = it.schema[$exclusiveKeyword],
    $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data,
    $op = $isMax ? '<' : '>',
    $notOp = $isMax ? '>' : '<',
    $errorKeyword = undefined;
  if (!($isData || typeof $schema == 'number' || $schema === undefined)) {
    throw new Error($keyword + ' must be number');
  }
  if (!($isDataExcl || $schemaExcl === undefined || typeof $schemaExcl == 'number' || typeof $schemaExcl == 'boolean')) {
    throw new Error($exclusiveKeyword + ' must be number or boolean');
  }
  if ($isDataExcl) {
    var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),
      $exclusive = 'exclusive' + $lvl,
      $exclType = 'exclType' + $lvl,
      $exclIsNumber = 'exclIsNumber' + $lvl,
      $opExpr = 'op' + $lvl,
      $opStr = '\' + ' + $opExpr + ' + \'';
    out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';
    $schemaValueExcl = 'schemaExcl' + $lvl;
    out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { ';
    var $errorKeyword = $exclusiveKeyword;
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' } else if ( ';
    if ($isData) {
      out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
    }
    out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; ';
    if ($schema === undefined) {
      $errorKeyword = $exclusiveKeyword;
      $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
      $schemaValue = $schemaValueExcl;
      $isData = $isDataExcl;
    }
  } else {
    var $exclIsNumber = typeof $schemaExcl == 'number',
      $opStr = $op;
    if ($exclIsNumber && $isData) {
      var $opExpr = '\'' + $opStr + '\'';
      out += ' if ( ';
      if ($isData) {
        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
      }
      out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { ';
    } else {
      if ($exclIsNumber && $schema === undefined) {
        $exclusive = true;
        $errorKeyword = $exclusiveKeyword;
        $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
        $schemaValue = $schemaExcl;
        $notOp += '=';
      } else {
        if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema);
        if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {
          $exclusive = true;
          $errorKeyword = $exclusiveKeyword;
          $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
          $notOp += '=';
        } else {
          $exclusive = false;
          $opStr += '=';
        }
      }
      var $opExpr = '\'' + $opStr + '\'';
      out += ' if ( ';
      if ($isData) {
        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
      }
      out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { ';
    }
  }
  $errorKeyword = $errorKeyword || $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be ' + ($opStr) + ' ';
      if ($isData) {
        out += '\' + ' + ($schemaValue);
      } else {
        out += '' + ($schemaValue) + '\'';
      }
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' } ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate__limitItems(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  var $op = $keyword == 'maxItems' ? '>' : '<';
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
  }
  out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should NOT have ';
      if ($keyword == 'maxItems') {
        out += 'more';
      } else {
        out += 'fewer';
      }
      out += ' than ';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + ($schema);
      }
      out += ' items\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate__limitLength(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  var $op = $keyword == 'maxLength' ? '>' : '<';
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
  }
  if (it.opts.unicode === false) {
    out += ' ' + ($data) + '.length ';
  } else {
    out += ' ucs2length(' + ($data) + ') ';
  }
  out += ' ' + ($op) + ' ' + ($schemaValue) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should NOT be ';
      if ($keyword == 'maxLength') {
        out += 'longer';
      } else {
        out += 'shorter';
      }
      out += ' than ';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + ($schema);
      }
      out += ' characters\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate__limitProperties(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  var $op = $keyword == 'maxProperties' ? '>' : '<';
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
  }
  out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should NOT have ';
      if ($keyword == 'maxProperties') {
        out += 'more';
      } else {
        out += 'fewer';
      }
      out += ' than ';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + ($schema);
      }
      out += ' properties\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate_allOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $currentBaseId = $it.baseId,
    $allSchemasEmpty = true;
  var arr1 = $schema;
  if (arr1) {
    var $sch, $i = -1,
      l1 = arr1.length - 1;
    while ($i < l1) {
      $sch = arr1[$i += 1];
      if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
        $allSchemasEmpty = false;
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + '[' + $i + ']';
        $it.errSchemaPath = $errSchemaPath + '/' + $i;
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
        if ($breakOnError) {
          out += ' if (' + ($nextValid) + ') { ';
          $closingBraces += '}';
        }
      }
    }
  }
  if ($breakOnError) {
    if ($allSchemasEmpty) {
      out += ' if (true) { ';
    } else {
      out += ' ' + ($closingBraces.slice(0, -1)) + ' ';
    }
  }
  return out;
}
'use strict';
module.exports = function generate_anyOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $noEmptySchema = $schema.every(function($sch) {
    return (it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all));
  });
  if ($noEmptySchema) {
    var $currentBaseId = $it.baseId;
    out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false;  ';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    var arr1 = $schema;
    if (arr1) {
      var $sch, $i = -1,
        l1 = arr1.length - 1;
      while ($i < l1) {
        $sch = arr1[$i += 1];
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + '[' + $i + ']';
        $it.errSchemaPath = $errSchemaPath + '/' + $i;
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
        out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { ';
        $closingBraces += '}';
      }
    }
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should match some schema in anyOf\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError(vErrors); ';
      } else {
        out += ' validate.errors = vErrors; return false; ';
      }
    }
    out += ' } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
    if (it.opts.allErrors) {
      out += ' } ';
    }
  } else {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  }
  return out;
}
'use strict';
module.exports = function generate_comment(it, $keyword, $ruleType) {
  var out = ' ';
  var $schema = it.schema[$keyword];
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $comment = it.util.toQuotedString($schema);
  if (it.opts.$comment === true) {
    out += ' console.log(' + ($comment) + ');';
  } else if (typeof it.opts.$comment == 'function') {
    out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);';
  }
  return out;
}
'use strict';
module.exports = function generate_const(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!$isData) {
    out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';';
  }
  out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be equal to constant\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' }';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate_contains(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $idx = 'i' + $lvl,
    $dataNxt = $it.dataLevel = it.dataLevel + 1,
    $nextData = 'data' + $dataNxt,
    $currentBaseId = it.baseId,
    $nonEmptySchema = (it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all));
  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
  if ($nonEmptySchema) {
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';
    $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
    var $passData = $data + '[' + $idx + ']';
    $it.dataPathArr[$dataNxt] = $idx;
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
    if (it.util.varOccurences($code, $nextData) < 2) {
      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
    } else {
      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
    }
    out += ' if (' + ($nextValid) + ') break; }  ';
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {';
  } else {
    out += ' if (' + ($data) + '.length == 0) {';
  }
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should contain a valid item\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' } else { ';
  if ($nonEmptySchema) {
    out += '  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
  }
  if (it.opts.allErrors) {
    out += ' } ';
  }
  return out;
}
'use strict';
module.exports = function generate_custom(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $rule = this,
    $definition = 'definition' + $lvl,
    $rDef = $rule.definition,
    $closingBraces = '';
  var $compile, $inline, $macro, $ruleValidate, $validateCode;
  if ($isData && $rDef.$data) {
    $validateCode = 'keywordValidate' + $lvl;
    var $validateSchema = $rDef.validateSchema;
    out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;';
  } else {
    $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it);
    if (!$ruleValidate) return;
    $schemaValue = 'validate.schema' + $schemaPath;
    $validateCode = $ruleValidate.code;
    $compile = $rDef.compile;
    $inline = $rDef.inline;
    $macro = $rDef.macro;
  }
  var $ruleErrs = $validateCode + '.errors',
    $i = 'i' + $lvl,
    $ruleErr = 'ruleErr' + $lvl,
    $asyncKeyword = $rDef.async;
  if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema');
  if (!($inline || $macro)) {
    out += '' + ($ruleErrs) + ' = null;';
  }
  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
  if ($isData && $rDef.$data) {
    $closingBraces += '}';
    out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { ';
    if ($validateSchema) {
      $closingBraces += '}';
      out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { ';
    }
  }
  if ($inline) {
    if ($rDef.statements) {
      out += ' ' + ($ruleValidate.validate) + ' ';
    } else {
      out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; ';
    }
  } else if ($macro) {
    var $it = it.util.copy(it);
    var $closingBraces = '';
    $it.level++;
    var $nextValid = 'valid' + $it.level;
    $it.schema = $ruleValidate.validate;
    $it.schemaPath = '';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    var $code = it.validate($it).replace(/validate\.schema/g, $validateCode);
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' ' + ($code);
  } else {
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
    out += '  ' + ($validateCode) + '.call( ';
    if (it.opts.passContext) {
      out += 'this';
    } else {
      out += 'self';
    }
    if ($compile || $rDef.schema === false) {
      out += ' , ' + ($data) + ' ';
    } else {
      out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' ';
    }
    out += ' , (dataPath || \'\')';
    if (it.errorPath != '""') {
      out += ' + ' + (it.errorPath);
    }
    var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',
      $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
    out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData )  ';
    var def_callRuleValidate = out;
    out = $$outStack.pop();
    if ($rDef.errors === false) {
      out += ' ' + ($valid) + ' = ';
      if ($asyncKeyword) {
        out += 'await ';
      }
      out += '' + (def_callRuleValidate) + '; ';
    } else {
      if ($asyncKeyword) {
        $ruleErrs = 'customErrors' + $lvl;
        out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } ';
      } else {
        out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; ';
      }
    }
  }
  if ($rDef.modifying) {
    out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];';
  }
  out += '' + ($closingBraces);
  if ($rDef.valid) {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  } else {
    out += ' if ( ';
    if ($rDef.valid === undefined) {
      out += ' !';
      if ($macro) {
        out += '' + ($nextValid);
      } else {
        out += '' + ($valid);
      }
    } else {
      out += ' ' + (!$rDef.valid) + ' ';
    }
    out += ') { ';
    $errorKeyword = $rule.keyword;
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    var def_customError = out;
    out = $$outStack.pop();
    if ($inline) {
      if ($rDef.errors) {
        if ($rDef.errors != 'full') {
          out += '  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + '; if (' + ($ruleErr) + '.schemaPath === undefined) { ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '"; } ';
          if (it.opts.verbose) {
            out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
          }
          out += ' } ';
        }
      } else {
        if ($rDef.errors === false) {
          out += ' ' + (def_customError) + ' ';
        } else {
          out += ' if (' + ($errs) + ' == errors) { ' + (def_customError) + ' } else {  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + '; if (' + ($ruleErr) + '.schemaPath === undefined) { ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '"; } ';
          if (it.opts.verbose) {
            out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
          }
          out += ' } } ';
        }
      }
    } else if ($macro) {
      out += '   var err =   '; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } ';
        if (it.opts.messages !== false) {
          out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
      if (!it.compositeRule && $breakOnError) {
        /* istanbul ignore if */
        if (it.async) {
          out += ' throw new ValidationError(vErrors); ';
        } else {
          out += ' validate.errors = vErrors; return false; ';
        }
      }
    } else {
      if ($rDef.errors === false) {
        out += ' ' + (def_customError) + ' ';
      } else {
        out += ' if (Array.isArray(' + ($ruleErrs) + ')) { if (vErrors === null) vErrors = ' + ($ruleErrs) + '; else vErrors = vErrors.concat(' + ($ruleErrs) + '); errors = vErrors.length;  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + ';  ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '";  ';
        if (it.opts.verbose) {
          out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
        }
        out += ' } } else { ' + (def_customError) + ' } ';
      }
    }
    out += ' } ';
    if ($breakOnError) {
      out += ' else { ';
    }
  }
  return out;
}
'use strict';
module.exports = function generate_dependencies(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $schemaDeps = {},
    $propertyDeps = {},
    $ownProperties = it.opts.ownProperties;
  for ($property in $schema) {
    if ($property == '__proto__') continue;
    var $sch = $schema[$property];
    var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;
    $deps[$property] = $sch;
  }
  out += 'var ' + ($errs) + ' = errors;';
  var $currentErrorPath = it.errorPath;
  out += 'var missing' + ($lvl) + ';';
  for (var $property in $propertyDeps) {
    $deps = $propertyDeps[$property];
    if ($deps.length) {
      out += ' if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';
      if ($ownProperties) {
        out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') ';
      }
      if ($breakOnError) {
        out += ' && ( ';
        var arr1 = $deps;
        if (arr1) {
          var $propertyKey, $i = -1,
            l1 = arr1.length - 1;
          while ($i < l1) {
            $propertyKey = arr1[$i += 1];
            if ($i) {
              out += ' || ';
            }
            var $prop = it.util.getProperty($propertyKey),
              $useData = $data + $prop;
            out += ' ( ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';
          }
        }
        out += ')) {  ';
        var $propertyPath = 'missing' + $lvl,
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;
        }
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'should have ';
            if ($deps.length == 1) {
              out += 'property ' + (it.util.escapeQuotes($deps[0]));
            } else {
              out += 'properties ' + (it.util.escapeQuotes($deps.join(", ")));
            }
            out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
      } else {
        out += ' ) { ';
        var arr2 = $deps;
        if (arr2) {
          var $propertyKey, i2 = -1,
            l2 = arr2.length - 1;
          while (i2 < l2) {
            $propertyKey = arr2[i2 += 1];
            var $prop = it.util.getProperty($propertyKey),
              $missingProperty = it.util.escapeQuotes($propertyKey),
              $useData = $data + $prop;
            if (it.opts._errorDataPathProperty) {
              it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
            }
            out += ' if ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') {  var err =   '; /* istanbul ignore else */
            if (it.createErrors !== false) {
              out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } ';
              if (it.opts.messages !== false) {
                out += ' , message: \'should have ';
                if ($deps.length == 1) {
                  out += 'property ' + (it.util.escapeQuotes($deps[0]));
                } else {
                  out += 'properties ' + (it.util.escapeQuotes($deps.join(", ")));
                }
                out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' ';
              }
              if (it.opts.verbose) {
                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
              }
              out += ' } ';
            } else {
              out += ' {} ';
            }
            out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';
          }
        }
      }
      out += ' }   ';
      if ($breakOnError) {
        $closingBraces += '}';
        out += ' else { ';
      }
    }
  }
  it.errorPath = $currentErrorPath;
  var $currentBaseId = $it.baseId;
  for (var $property in $schemaDeps) {
    var $sch = $schemaDeps[$property];
    if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
      out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';
      if ($ownProperties) {
        out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') ';
      }
      out += ') { ';
      $it.schema = $sch;
      $it.schemaPath = $schemaPath + it.util.getProperty($property);
      $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);
      out += '  ' + (it.validate($it)) + ' ';
      $it.baseId = $currentBaseId;
      out += ' }  ';
      if ($breakOnError) {
        out += ' if (' + ($nextValid) + ') { ';
        $closingBraces += '}';
      }
    }
  }
  if ($breakOnError) {
    out += '   ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}
'use strict';
module.exports = function generate_enum(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $i = 'i' + $lvl,
    $vSchema = 'schema' + $lvl;
  if (!$isData) {
    out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';';
  }
  out += 'var ' + ($valid) + ';';
  if ($isData) {
    out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';
  }
  out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }';
  if ($isData) {
    out += '  }  ';
  }
  out += ' if (!' + ($valid) + ') {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('enum') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be equal to one of the allowed values\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' }';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate_format(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  if (it.opts.format === false) {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
    return out;
  }
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $unknownFormats = it.opts.unknownFormats,
    $allowUnknown = Array.isArray($unknownFormats);
  if ($isData) {
    var $format = 'format' + $lvl,
      $isObject = 'isObject' + $lvl,
      $formatType = 'formatType' + $lvl;
    out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \'string\'; if (' + ($isObject) + ') { ';
    if (it.async) {
      out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; ';
    }
    out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if (  ';
    if ($isData) {
      out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || ';
    }
    out += ' (';
    if ($unknownFormats != 'ignore') {
      out += ' (' + ($schemaValue) + ' && !' + ($format) + ' ';
      if ($allowUnknown) {
        out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 ';
      }
      out += ') || ';
    }
    out += ' (' + ($format) + ' && ' + ($formatType) + ' == \'' + ($ruleType) + '\' && !(typeof ' + ($format) + ' == \'function\' ? ';
    if (it.async) {
      out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) ';
    } else {
      out += ' ' + ($format) + '(' + ($data) + ') ';
    }
    out += ' : ' + ($format) + '.test(' + ($data) + '))))) {';
  } else {
    var $format = it.formats[$schema];
    if (!$format) {
      if ($unknownFormats == 'ignore') {
        it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"');
        if ($breakOnError) {
          out += ' if (true) { ';
        }
        return out;
      } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) {
        if ($breakOnError) {
          out += ' if (true) { ';
        }
        return out;
      } else {
        throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"');
      }
    }
    var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate;
    var $formatType = $isObject && $format.type || 'string';
    if ($isObject) {
      var $async = $format.async === true;
      $format = $format.validate;
    }
    if ($formatType != $ruleType) {
      if ($breakOnError) {
        out += ' if (true) { ';
      }
      return out;
    }
    if ($async) {
      if (!it.async) throw new Error('async format in sync schema');
      var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate';
      out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { ';
    } else {
      out += ' if (! ';
      var $formatRef = 'formats' + it.util.getProperty($schema);
      if ($isObject) $formatRef += '.validate';
      if (typeof $format == 'function') {
        out += ' ' + ($formatRef) + '(' + ($data) + ') ';
      } else {
        out += ' ' + ($formatRef) + '.test(' + ($data) + ') ';
      }
      out += ') { ';
    }
  }
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format:  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += '  } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should match format "';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + (it.util.escapeQuotes($schema));
      }
      out += '"\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + (it.util.toQuotedString($schema));
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' } ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate_if(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $thenSch = it.schema['then'],
    $elseSch = it.schema['else'],
    $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? (typeof $thenSch == 'object' && Object.keys($thenSch).length > 0) || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)),
    $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? (typeof $elseSch == 'object' && Object.keys($elseSch).length > 0) || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)),
    $currentBaseId = $it.baseId;
  if ($thenPresent || $elsePresent) {
    var $ifClause;
    $it.createErrors = false;
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true;  ';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    out += '  ' + (it.validate($it)) + ' ';
    $it.baseId = $currentBaseId;
    $it.createErrors = true;
    out += '  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }  ';
    it.compositeRule = $it.compositeRule = $wasComposite;
    if ($thenPresent) {
      out += ' if (' + ($nextValid) + ') {  ';
      $it.schema = it.schema['then'];
      $it.schemaPath = it.schemaPath + '.then';
      $it.errSchemaPath = it.errSchemaPath + '/then';
      out += '  ' + (it.validate($it)) + ' ';
      $it.baseId = $currentBaseId;
      out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';
      if ($thenPresent && $elsePresent) {
        $ifClause = 'ifClause' + $lvl;
        out += ' var ' + ($ifClause) + ' = \'then\'; ';
      } else {
        $ifClause = '\'then\'';
      }
      out += ' } ';
      if ($elsePresent) {
        out += ' else { ';
      }
    } else {
      out += ' if (!' + ($nextValid) + ') { ';
    }
    if ($elsePresent) {
      $it.schema = it.schema['else'];
      $it.schemaPath = it.schemaPath + '.else';
      $it.errSchemaPath = it.errSchemaPath + '/else';
      out += '  ' + (it.validate($it)) + ' ';
      $it.baseId = $currentBaseId;
      out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';
      if ($thenPresent && $elsePresent) {
        $ifClause = 'ifClause' + $lvl;
        out += ' var ' + ($ifClause) + ' = \'else\'; ';
      } else {
        $ifClause = '\'else\'';
      }
      out += ' } ';
    }
    out += ' if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('if') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should match "\' + ' + ($ifClause) + ' + \'" schema\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError(vErrors); ';
      } else {
        out += ' validate.errors = vErrors; return false; ';
      }
    }
    out += ' }   ';
    if ($breakOnError) {
      out += ' else { ';
    }
  } else {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  }
  return out;
}
'use strict';

//all requires must be explicit because browserify won't work with dynamic requires
module.exports = {
  '$ref': require('./ref'),
  allOf: require('./allOf'),
  anyOf: require('./anyOf'),
  '$comment': require('./comment'),
  const: require('./const'),
  contains: require('./contains'),
  dependencies: require('./dependencies'),
  'enum': require('./enum'),
  format: require('./format'),
  'if': require('./if'),
  items: require('./items'),
  maximum: require('./_limit'),
  minimum: require('./_limit'),
  maxItems: require('./_limitItems'),
  minItems: require('./_limitItems'),
  maxLength: require('./_limitLength'),
  minLength: require('./_limitLength'),
  maxProperties: require('./_limitProperties'),
  minProperties: require('./_limitProperties'),
  multipleOf: require('./multipleOf'),
  not: require('./not'),
  oneOf: require('./oneOf'),
  pattern: require('./pattern'),
  properties: require('./properties'),
  propertyNames: require('./propertyNames'),
  required: require('./required'),
  uniqueItems: require('./uniqueItems'),
  validate: require('./validate')
};
'use strict';
module.exports = function generate_items(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $idx = 'i' + $lvl,
    $dataNxt = $it.dataLevel = it.dataLevel + 1,
    $nextData = 'data' + $dataNxt,
    $currentBaseId = it.baseId;
  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
  if (Array.isArray($schema)) {
    var $additionalItems = it.schema.additionalItems;
    if ($additionalItems === false) {
      out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; ';
      var $currErrSchemaPath = $errSchemaPath;
      $errSchemaPath = it.errSchemaPath + '/additionalItems';
      out += '  if (!' + ($valid) + ') {   ';
      var $$outStack = $$outStack || [];
      $$outStack.push(out);
      out = ''; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } ';
        if (it.opts.messages !== false) {
          out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      var __err = out;
      out = $$outStack.pop();
      if (!it.compositeRule && $breakOnError) {
        /* istanbul ignore if */
        if (it.async) {
          out += ' throw new ValidationError([' + (__err) + ']); ';
        } else {
          out += ' validate.errors = [' + (__err) + ']; return false; ';
        }
      } else {
        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
      }
      out += ' } ';
      $errSchemaPath = $currErrSchemaPath;
      if ($breakOnError) {
        $closingBraces += '}';
        out += ' else { ';
      }
    }
    var arr1 = $schema;
    if (arr1) {
      var $sch, $i = -1,
        l1 = arr1.length - 1;
      while ($i < l1) {
        $sch = arr1[$i += 1];
        if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
          out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { ';
          var $passData = $data + '[' + $i + ']';
          $it.schema = $sch;
          $it.schemaPath = $schemaPath + '[' + $i + ']';
          $it.errSchemaPath = $errSchemaPath + '/' + $i;
          $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true);
          $it.dataPathArr[$dataNxt] = $i;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          out += ' }  ';
          if ($breakOnError) {
            out += ' if (' + ($nextValid) + ') { ';
            $closingBraces += '}';
          }
        }
      }
    }
    if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? (typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0) || $additionalItems === false : it.util.schemaHasRules($additionalItems, it.RULES.all))) {
      $it.schema = $additionalItems;
      $it.schemaPath = it.schemaPath + '.additionalItems';
      $it.errSchemaPath = it.errSchemaPath + '/additionalItems';
      out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') {  for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';
      $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
      var $passData = $data + '[' + $idx + ']';
      $it.dataPathArr[$dataNxt] = $idx;
      var $code = it.validate($it);
      $it.baseId = $currentBaseId;
      if (it.util.varOccurences($code, $nextData) < 2) {
        out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
      } else {
        out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
      }
      if ($breakOnError) {
        out += ' if (!' + ($nextValid) + ') break; ';
      }
      out += ' } }  ';
      if ($breakOnError) {
        out += ' if (' + ($nextValid) + ') { ';
        $closingBraces += '}';
      }
    }
  } else if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += '  for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';
    $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
    var $passData = $data + '[' + $idx + ']';
    $it.dataPathArr[$dataNxt] = $idx;
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
    if (it.util.varOccurences($code, $nextData) < 2) {
      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
    } else {
      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
    }
    if ($breakOnError) {
      out += ' if (!' + ($nextValid) + ') break; ';
    }
    out += ' }';
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}
'use strict';
module.exports = function generate_multipleOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  out += 'var division' + ($lvl) + ';if (';
  if ($isData) {
    out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || ';
  }
  out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', ';
  if (it.opts.multipleOfPrecision) {
    out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' ';
  } else {
    out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') ';
  }
  out += ' ) ';
  if ($isData) {
    out += '  )  ';
  }
  out += ' ) {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be multiple of ';
      if ($isData) {
        out += '\' + ' + ($schemaValue);
      } else {
        out += '' + ($schemaValue) + '\'';
      }
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate_not(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += ' var ' + ($errs) + ' = errors;  ';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    $it.createErrors = false;
    var $allErrorsOption;
    if ($it.opts.allErrors) {
      $allErrorsOption = $it.opts.allErrors;
      $it.opts.allErrors = false;
    }
    out += ' ' + (it.validate($it)) + ' ';
    $it.createErrors = true;
    if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption;
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' if (' + ($nextValid) + ') {   ';
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should NOT be valid\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
    if (it.opts.allErrors) {
      out += ' } ';
    }
  } else {
    out += '  var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should NOT be valid\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if ($breakOnError) {
      out += ' if (false) { ';
    }
  }
  return out;
}
'use strict';
module.exports = function generate_oneOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $currentBaseId = $it.baseId,
    $prevValid = 'prevValid' + $lvl,
    $passingSchemas = 'passingSchemas' + $lvl;
  out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; ';
  var $wasComposite = it.compositeRule;
  it.compositeRule = $it.compositeRule = true;
  var arr1 = $schema;
  if (arr1) {
    var $sch, $i = -1,
      l1 = arr1.length - 1;
    while ($i < l1) {
      $sch = arr1[$i += 1];
      if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + '[' + $i + ']';
        $it.errSchemaPath = $errSchemaPath + '/' + $i;
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
      } else {
        out += ' var ' + ($nextValid) + ' = true; ';
      }
      if ($i) {
        out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { ';
        $closingBraces += '}';
      }
      out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }';
    }
  }
  it.compositeRule = $it.compositeRule = $wasComposite;
  out += '' + ($closingBraces) + 'if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should match exactly one schema in oneOf\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError(vErrors); ';
    } else {
      out += ' validate.errors = vErrors; return false; ';
    }
  }
  out += '} else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }';
  if (it.opts.allErrors) {
    out += ' } ';
  }
  return out;
}
'use strict';
module.exports = function generate_pattern(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema);
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || ';
  }
  out += ' !' + ($regexp) + '.test(' + ($data) + ') ) {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern:  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += '  } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should match pattern "';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + (it.util.escapeQuotes($schema));
      }
      out += '"\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + (it.util.toQuotedString($schema));
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate_properties(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $key = 'key' + $lvl,
    $idx = 'idx' + $lvl,
    $dataNxt = $it.dataLevel = it.dataLevel + 1,
    $nextData = 'data' + $dataNxt,
    $dataProperties = 'dataProperties' + $lvl;
  var $schemaKeys = Object.keys($schema || {}).filter(notProto),
    $pProperties = it.schema.patternProperties || {},
    $pPropertyKeys = Object.keys($pProperties).filter(notProto),
    $aProperties = it.schema.additionalProperties,
    $someProperties = $schemaKeys.length || $pPropertyKeys.length,
    $noAdditional = $aProperties === false,
    $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length,
    $removeAdditional = it.opts.removeAdditional,
    $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional,
    $ownProperties = it.opts.ownProperties,
    $currentBaseId = it.baseId;
  var $required = it.schema.required;
  if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) {
    var $requiredHash = it.util.toHash($required);
  }

  function notProto(p) {
    return p !== '__proto__';
  }
  out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;';
  if ($ownProperties) {
    out += ' var ' + ($dataProperties) + ' = undefined;';
  }
  if ($checkAdditional) {
    if ($ownProperties) {
      out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
    } else {
      out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
    }
    if ($someProperties) {
      out += ' var isAdditional' + ($lvl) + ' = !(false ';
      if ($schemaKeys.length) {
        if ($schemaKeys.length > 8) {
          out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') ';
        } else {
          var arr1 = $schemaKeys;
          if (arr1) {
            var $propertyKey, i1 = -1,
              l1 = arr1.length - 1;
            while (i1 < l1) {
              $propertyKey = arr1[i1 += 1];
              out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' ';
            }
          }
        }
      }
      if ($pPropertyKeys.length) {
        var arr2 = $pPropertyKeys;
        if (arr2) {
          var $pProperty, $i = -1,
            l2 = arr2.length - 1;
          while ($i < l2) {
            $pProperty = arr2[$i += 1];
            out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') ';
          }
        }
      }
      out += ' ); if (isAdditional' + ($lvl) + ') { ';
    }
    if ($removeAdditional == 'all') {
      out += ' delete ' + ($data) + '[' + ($key) + ']; ';
    } else {
      var $currentErrorPath = it.errorPath;
      var $additionalProperty = '\' + ' + $key + ' + \'';
      if (it.opts._errorDataPathProperty) {
        it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
      }
      if ($noAdditional) {
        if ($removeAdditional) {
          out += ' delete ' + ($data) + '[' + ($key) + ']; ';
        } else {
          out += ' ' + ($nextValid) + ' = false; ';
          var $currErrSchemaPath = $errSchemaPath;
          $errSchemaPath = it.errSchemaPath + '/additionalProperties';
          var $$outStack = $$outStack || [];
          $$outStack.push(out);
          out = ''; /* istanbul ignore else */
          if (it.createErrors !== false) {
            out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } ';
            if (it.opts.messages !== false) {
              out += ' , message: \'';
              if (it.opts._errorDataPathProperty) {
                out += 'is an invalid additional property';
              } else {
                out += 'should NOT have additional properties';
              }
              out += '\' ';
            }
            if (it.opts.verbose) {
              out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
            }
            out += ' } ';
          } else {
            out += ' {} ';
          }
          var __err = out;
          out = $$outStack.pop();
          if (!it.compositeRule && $breakOnError) {
            /* istanbul ignore if */
            if (it.async) {
              out += ' throw new ValidationError([' + (__err) + ']); ';
            } else {
              out += ' validate.errors = [' + (__err) + ']; return false; ';
            }
          } else {
            out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
          }
          $errSchemaPath = $currErrSchemaPath;
          if ($breakOnError) {
            out += ' break; ';
          }
        }
      } else if ($additionalIsSchema) {
        if ($removeAdditional == 'failing') {
          out += ' var ' + ($errs) + ' = errors;  ';
          var $wasComposite = it.compositeRule;
          it.compositeRule = $it.compositeRule = true;
          $it.schema = $aProperties;
          $it.schemaPath = it.schemaPath + '.additionalProperties';
          $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';
          $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
          var $passData = $data + '[' + $key + ']';
          $it.dataPathArr[$dataNxt] = $key;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; }  ';
          it.compositeRule = $it.compositeRule = $wasComposite;
        } else {
          $it.schema = $aProperties;
          $it.schemaPath = it.schemaPath + '.additionalProperties';
          $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';
          $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
          var $passData = $data + '[' + $key + ']';
          $it.dataPathArr[$dataNxt] = $key;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          if ($breakOnError) {
            out += ' if (!' + ($nextValid) + ') break; ';
          }
        }
      }
      it.errorPath = $currentErrorPath;
    }
    if ($someProperties) {
      out += ' } ';
    }
    out += ' }  ';
    if ($breakOnError) {
      out += ' if (' + ($nextValid) + ') { ';
      $closingBraces += '}';
    }
  }
  var $useDefaults = it.opts.useDefaults && !it.compositeRule;
  if ($schemaKeys.length) {
    var arr3 = $schemaKeys;
    if (arr3) {
      var $propertyKey, i3 = -1,
        l3 = arr3.length - 1;
      while (i3 < l3) {
        $propertyKey = arr3[i3 += 1];
        var $sch = $schema[$propertyKey];
        if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
          var $prop = it.util.getProperty($propertyKey),
            $passData = $data + $prop,
            $hasDefault = $useDefaults && $sch.default !== undefined;
          $it.schema = $sch;
          $it.schemaPath = $schemaPath + $prop;
          $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey);
          $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);
          $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            $code = it.util.varReplace($code, $nextData, $passData);
            var $useData = $passData;
          } else {
            var $useData = $nextData;
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ';
          }
          if ($hasDefault) {
            out += ' ' + ($code) + ' ';
          } else {
            if ($requiredHash && $requiredHash[$propertyKey]) {
              out += ' if ( ' + ($useData) + ' === undefined ';
              if ($ownProperties) {
                out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
              }
              out += ') { ' + ($nextValid) + ' = false; ';
              var $currentErrorPath = it.errorPath,
                $currErrSchemaPath = $errSchemaPath,
                $missingProperty = it.util.escapeQuotes($propertyKey);
              if (it.opts._errorDataPathProperty) {
                it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
              }
              $errSchemaPath = it.errSchemaPath + '/required';
              var $$outStack = $$outStack || [];
              $$outStack.push(out);
              out = ''; /* istanbul ignore else */
              if (it.createErrors !== false) {
                out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
                if (it.opts.messages !== false) {
                  out += ' , message: \'';
                  if (it.opts._errorDataPathProperty) {
                    out += 'is a required property';
                  } else {
                    out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
                  }
                  out += '\' ';
                }
                if (it.opts.verbose) {
                  out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
                }
                out += ' } ';
              } else {
                out += ' {} ';
              }
              var __err = out;
              out = $$outStack.pop();
              if (!it.compositeRule && $breakOnError) {
                /* istanbul ignore if */
                if (it.async) {
                  out += ' throw new ValidationError([' + (__err) + ']); ';
                } else {
                  out += ' validate.errors = [' + (__err) + ']; return false; ';
                }
              } else {
                out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
              }
              $errSchemaPath = $currErrSchemaPath;
              it.errorPath = $currentErrorPath;
              out += ' } else { ';
            } else {
              if ($breakOnError) {
                out += ' if ( ' + ($useData) + ' === undefined ';
                if ($ownProperties) {
                  out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
                }
                out += ') { ' + ($nextValid) + ' = true; } else { ';
              } else {
                out += ' if (' + ($useData) + ' !== undefined ';
                if ($ownProperties) {
                  out += ' &&   Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
                }
                out += ' ) { ';
              }
            }
            out += ' ' + ($code) + ' } ';
          }
        }
        if ($breakOnError) {
          out += ' if (' + ($nextValid) + ') { ';
          $closingBraces += '}';
        }
      }
    }
  }
  if ($pPropertyKeys.length) {
    var arr4 = $pPropertyKeys;
    if (arr4) {
      var $pProperty, i4 = -1,
        l4 = arr4.length - 1;
      while (i4 < l4) {
        $pProperty = arr4[i4 += 1];
        var $sch = $pProperties[$pProperty];
        if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
          $it.schema = $sch;
          $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty);
          $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty);
          if ($ownProperties) {
            out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
          } else {
            out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
          }
          out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { ';
          $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
          var $passData = $data + '[' + $key + ']';
          $it.dataPathArr[$dataNxt] = $key;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          if ($breakOnError) {
            out += ' if (!' + ($nextValid) + ') break; ';
          }
          out += ' } ';
          if ($breakOnError) {
            out += ' else ' + ($nextValid) + ' = true; ';
          }
          out += ' }  ';
          if ($breakOnError) {
            out += ' if (' + ($nextValid) + ') { ';
            $closingBraces += '}';
          }
        }
      }
    }
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}
'use strict';
module.exports = function generate_propertyNames(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  out += 'var ' + ($errs) + ' = errors;';
  if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    var $key = 'key' + $lvl,
      $idx = 'idx' + $lvl,
      $i = 'i' + $lvl,
      $invalidName = '\' + ' + $key + ' + \'',
      $dataNxt = $it.dataLevel = it.dataLevel + 1,
      $nextData = 'data' + $dataNxt,
      $dataProperties = 'dataProperties' + $lvl,
      $ownProperties = it.opts.ownProperties,
      $currentBaseId = it.baseId;
    if ($ownProperties) {
      out += ' var ' + ($dataProperties) + ' = undefined; ';
    }
    if ($ownProperties) {
      out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
    } else {
      out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
    }
    out += ' var startErrs' + ($lvl) + ' = errors; ';
    var $passData = $key;
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
    if (it.util.varOccurences($code, $nextData) < 2) {
      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
    } else {
      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
    }
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + '<errors; ' + ($i) + '++) { vErrors[' + ($i) + '].propertyName = ' + ($key) + '; }   var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('propertyNames') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { propertyName: \'' + ($invalidName) + '\' } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'property name \\\'' + ($invalidName) + '\\\' is invalid\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError(vErrors); ';
      } else {
        out += ' validate.errors = vErrors; return false; ';
      }
    }
    if ($breakOnError) {
      out += ' break; ';
    }
    out += ' } }';
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}
'use strict';
module.exports = function generate_ref(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $async, $refCode;
  if ($schema == '#' || $schema == '#/') {
    if (it.isRoot) {
      $async = it.async;
      $refCode = 'validate';
    } else {
      $async = it.root.schema.$async === true;
      $refCode = 'root.refVal[0]';
    }
  } else {
    var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot);
    if ($refVal === undefined) {
      var $message = it.MissingRefError.message(it.baseId, $schema);
      if (it.opts.missingRefs == 'fail') {
        it.logger.error($message);
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('$ref') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { ref: \'' + (it.util.escapeQuotes($schema)) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'can\\\'t resolve reference ' + (it.util.escapeQuotes($schema)) + '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: ' + (it.util.toQuotedString($schema)) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        if ($breakOnError) {
          out += ' if (false) { ';
        }
      } else if (it.opts.missingRefs == 'ignore') {
        it.logger.warn($message);
        if ($breakOnError) {
          out += ' if (true) { ';
        }
      } else {
        throw new it.MissingRefError(it.baseId, $schema, $message);
      }
    } else if ($refVal.inline) {
      var $it = it.util.copy(it);
      $it.level++;
      var $nextValid = 'valid' + $it.level;
      $it.schema = $refVal.schema;
      $it.schemaPath = '';
      $it.errSchemaPath = $schema;
      var $code = it.validate($it).replace(/validate\.schema/g, $refVal.code);
      out += ' ' + ($code) + ' ';
      if ($breakOnError) {
        out += ' if (' + ($nextValid) + ') { ';
      }
    } else {
      $async = $refVal.$async === true || (it.async && $refVal.$async !== false);
      $refCode = $refVal.code;
    }
  }
  if ($refCode) {
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
    if (it.opts.passContext) {
      out += ' ' + ($refCode) + '.call(this, ';
    } else {
      out += ' ' + ($refCode) + '( ';
    }
    out += ' ' + ($data) + ', (dataPath || \'\')';
    if (it.errorPath != '""') {
      out += ' + ' + (it.errorPath);
    }
    var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',
      $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
    out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ', rootData)  ';
    var __callValidate = out;
    out = $$outStack.pop();
    if ($async) {
      if (!it.async) throw new Error('async schema referenced by sync schema');
      if ($breakOnError) {
        out += ' var ' + ($valid) + '; ';
      }
      out += ' try { await ' + (__callValidate) + '; ';
      if ($breakOnError) {
        out += ' ' + ($valid) + ' = true; ';
      }
      out += ' } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ';
      if ($breakOnError) {
        out += ' ' + ($valid) + ' = false; ';
      }
      out += ' } ';
      if ($breakOnError) {
        out += ' if (' + ($valid) + ') { ';
      }
    } else {
      out += ' if (!' + (__callValidate) + ') { if (vErrors === null) vErrors = ' + ($refCode) + '.errors; else vErrors = vErrors.concat(' + ($refCode) + '.errors); errors = vErrors.length; } ';
      if ($breakOnError) {
        out += ' else { ';
      }
    }
  }
  return out;
}
'use strict';
module.exports = function generate_required(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $vSchema = 'schema' + $lvl;
  if (!$isData) {
    if ($schema.length < it.opts.loopRequired && it.schema.properties && Object.keys(it.schema.properties).length) {
      var $required = [];
      var arr1 = $schema;
      if (arr1) {
        var $property, i1 = -1,
          l1 = arr1.length - 1;
        while (i1 < l1) {
          $property = arr1[i1 += 1];
          var $propertySch = it.schema.properties[$property];
          if (!($propertySch && (it.opts.strictKeywords ? (typeof $propertySch == 'object' && Object.keys($propertySch).length > 0) || $propertySch === false : it.util.schemaHasRules($propertySch, it.RULES.all)))) {
            $required[$required.length] = $property;
          }
        }
      }
    } else {
      var $required = $schema;
    }
  }
  if ($isData || $required.length) {
    var $currentErrorPath = it.errorPath,
      $loopRequired = $isData || $required.length >= it.opts.loopRequired,
      $ownProperties = it.opts.ownProperties;
    if ($breakOnError) {
      out += ' var missing' + ($lvl) + '; ';
      if ($loopRequired) {
        if (!$isData) {
          out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';
        }
        var $i = 'i' + $lvl,
          $propertyPath = 'schema' + $lvl + '[' + $i + ']',
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);
        }
        out += ' var ' + ($valid) + ' = true; ';
        if ($isData) {
          out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';
        }
        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined ';
        if ($ownProperties) {
          out += ' &&   Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';
        }
        out += '; if (!' + ($valid) + ') break; } ';
        if ($isData) {
          out += '  }  ';
        }
        out += '  if (!' + ($valid) + ') {   ';
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'';
            if (it.opts._errorDataPathProperty) {
              out += 'is a required property';
            } else {
              out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        out += ' } else { ';
      } else {
        out += ' if ( ';
        var arr2 = $required;
        if (arr2) {
          var $propertyKey, $i = -1,
            l2 = arr2.length - 1;
          while ($i < l2) {
            $propertyKey = arr2[$i += 1];
            if ($i) {
              out += ' || ';
            }
            var $prop = it.util.getProperty($propertyKey),
              $useData = $data + $prop;
            out += ' ( ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';
          }
        }
        out += ') {  ';
        var $propertyPath = 'missing' + $lvl,
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;
        }
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'';
            if (it.opts._errorDataPathProperty) {
              out += 'is a required property';
            } else {
              out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        out += ' } else { ';
      }
    } else {
      if ($loopRequired) {
        if (!$isData) {
          out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';
        }
        var $i = 'i' + $lvl,
          $propertyPath = 'schema' + $lvl + '[' + $i + ']',
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);
        }
        if ($isData) {
          out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) {  var err =   '; /* istanbul ignore else */
          if (it.createErrors !== false) {
            out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
            if (it.opts.messages !== false) {
              out += ' , message: \'';
              if (it.opts._errorDataPathProperty) {
                out += 'is a required property';
              } else {
                out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
              }
              out += '\' ';
            }
            if (it.opts.verbose) {
              out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
            }
            out += ' } ';
          } else {
            out += ' {} ';
          }
          out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { ';
        }
        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined ';
        if ($ownProperties) {
          out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';
        }
        out += ') {  var err =   '; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'';
            if (it.opts._errorDataPathProperty) {
              out += 'is a required property';
            } else {
              out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ';
        if ($isData) {
          out += '  }  ';
        }
      } else {
        var arr3 = $required;
        if (arr3) {
          var $propertyKey, i3 = -1,
            l3 = arr3.length - 1;
          while (i3 < l3) {
            $propertyKey = arr3[i3 += 1];
            var $prop = it.util.getProperty($propertyKey),
              $missingProperty = it.util.escapeQuotes($propertyKey),
              $useData = $data + $prop;
            if (it.opts._errorDataPathProperty) {
              it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
            }
            out += ' if ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') {  var err =   '; /* istanbul ignore else */
            if (it.createErrors !== false) {
              out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
              if (it.opts.messages !== false) {
                out += ' , message: \'';
                if (it.opts._errorDataPathProperty) {
                  out += 'is a required property';
                } else {
                  out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
                }
                out += '\' ';
              }
              if (it.opts.verbose) {
                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
              }
              out += ' } ';
            } else {
              out += ' {} ';
            }
            out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';
          }
        }
      }
    }
    it.errorPath = $currentErrorPath;
  } else if ($breakOnError) {
    out += ' if (true) {';
  }
  return out;
}
'use strict';
module.exports = function generate_uniqueItems(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (($schema || $isData) && it.opts.uniqueItems !== false) {
    if ($isData) {
      out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { ';
    }
    out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { ';
    var $itemType = it.schema.items && it.schema.items.type,
      $typeIsArray = Array.isArray($itemType);
    if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) {
      out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } ';
    } else {
      out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; ';
      var $method = 'checkDataType' + ($typeIsArray ? 's' : '');
      out += ' if (' + (it.util[$method]($itemType, 'item', it.opts.strictNumbers, true)) + ') continue; ';
      if ($typeIsArray) {
        out += ' if (typeof item == \'string\') item = \'"\' + item; ';
      }
      out += ' if (typeof itemIndices[item] == \'number\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } ';
    }
    out += ' } ';
    if ($isData) {
      out += '  }  ';
    }
    out += ' if (!' + ($valid) + ') {   ';
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema:  ';
        if ($isData) {
          out += 'validate.schema' + ($schemaPath);
        } else {
          out += '' + ($schema);
        }
        out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' } ';
    if ($breakOnError) {
      out += ' else { ';
    }
  } else {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  }
  return out;
}
'use strict';
module.exports = function generate_validate(it, $keyword, $ruleType) {
  var out = '';
  var $async = it.schema.$async === true,
    $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'),
    $id = it.self._getId(it.schema);
  if (it.opts.strictKeywords) {
    var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords);
    if ($unknownKwd) {
      var $keywordsMsg = 'unknown keyword: ' + $unknownKwd;
      if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg);
      else throw new Error($keywordsMsg);
    }
  }
  if (it.isTop) {
    out += ' var validate = ';
    if ($async) {
      it.async = true;
      out += 'async ';
    }
    out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; ';
    if ($id && (it.opts.sourceCode || it.opts.processCode)) {
      out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' ';
    }
  }
  if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) {
    var $keyword = 'false schema';
    var $lvl = it.level;
    var $dataLvl = it.dataLevel;
    var $schema = it.schema[$keyword];
    var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
    var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
    var $breakOnError = !it.opts.allErrors;
    var $errorKeyword;
    var $data = 'data' + ($dataLvl || '');
    var $valid = 'valid' + $lvl;
    if (it.schema === false) {
      if (it.isTop) {
        $breakOnError = true;
      } else {
        out += ' var ' + ($valid) + ' = false; ';
      }
      var $$outStack = $$outStack || [];
      $$outStack.push(out);
      out = ''; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
        if (it.opts.messages !== false) {
          out += ' , message: \'boolean schema is false\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      var __err = out;
      out = $$outStack.pop();
      if (!it.compositeRule && $breakOnError) {
        /* istanbul ignore if */
        if (it.async) {
          out += ' throw new ValidationError([' + (__err) + ']); ';
        } else {
          out += ' validate.errors = [' + (__err) + ']; return false; ';
        }
      } else {
        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
      }
    } else {
      if (it.isTop) {
        if ($async) {
          out += ' return data; ';
        } else {
          out += ' validate.errors = null; return true; ';
        }
      } else {
        out += ' var ' + ($valid) + ' = true; ';
      }
    }
    if (it.isTop) {
      out += ' }; return validate; ';
    }
    return out;
  }
  if (it.isTop) {
    var $top = it.isTop,
      $lvl = it.level = 0,
      $dataLvl = it.dataLevel = 0,
      $data = 'data';
    it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));
    it.baseId = it.baseId || it.rootId;
    delete it.isTop;
    it.dataPathArr = [""];
    if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) {
      var $defaultMsg = 'default is ignored in the schema root';
      if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
      else throw new Error($defaultMsg);
    }
    out += ' var vErrors = null; ';
    out += ' var errors = 0;     ';
    out += ' if (rootData === undefined) rootData = data; ';
  } else {
    var $lvl = it.level,
      $dataLvl = it.dataLevel,
      $data = 'data' + ($dataLvl || '');
    if ($id) it.baseId = it.resolve.url(it.baseId, $id);
    if ($async && !it.async) throw new Error('async schema in sync schema');
    out += ' var errs_' + ($lvl) + ' = errors;';
  }
  var $valid = 'valid' + $lvl,
    $breakOnError = !it.opts.allErrors,
    $closingBraces1 = '',
    $closingBraces2 = '';
  var $errorKeyword;
  var $typeSchema = it.schema.type,
    $typeIsArray = Array.isArray($typeSchema);
  if ($typeSchema && it.opts.nullable && it.schema.nullable === true) {
    if ($typeIsArray) {
      if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null');
    } else if ($typeSchema != 'null') {
      $typeSchema = [$typeSchema, 'null'];
      $typeIsArray = true;
    }
  }
  if ($typeIsArray && $typeSchema.length == 1) {
    $typeSchema = $typeSchema[0];
    $typeIsArray = false;
  }
  if (it.schema.$ref && $refKeywords) {
    if (it.opts.extendRefs == 'fail') {
      throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)');
    } else if (it.opts.extendRefs !== true) {
      $refKeywords = false;
      it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"');
    }
  }
  if (it.schema.$comment && it.opts.$comment) {
    out += ' ' + (it.RULES.all.$comment.code(it, '$comment'));
  }
  if ($typeSchema) {
    if (it.opts.coerceTypes) {
      var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema);
    }
    var $rulesGroup = it.RULES.types[$typeSchema];
    if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) {
      var $schemaPath = it.schemaPath + '.type',
        $errSchemaPath = it.errSchemaPath + '/type';
      var $schemaPath = it.schemaPath + '.type',
        $errSchemaPath = it.errSchemaPath + '/type',
        $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType';
      out += ' if (' + (it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true)) + ') { ';
      if ($coerceToTypes) {
        var $dataType = 'dataType' + $lvl,
          $coerced = 'coerced' + $lvl;
        out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; var ' + ($coerced) + ' = undefined; ';
        if (it.opts.coerceTypes == 'array') {
          out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ') && ' + ($data) + '.length == 1) { ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; if (' + (it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)) + ') ' + ($coerced) + ' = ' + ($data) + '; } ';
        }
        out += ' if (' + ($coerced) + ' !== undefined) ; ';
        var arr1 = $coerceToTypes;
        if (arr1) {
          var $type, $i = -1,
            l1 = arr1.length - 1;
          while ($i < l1) {
            $type = arr1[$i += 1];
            if ($type == 'string') {
              out += ' else if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; ';
            } else if ($type == 'number' || $type == 'integer') {
              out += ' else if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' ';
              if ($type == 'integer') {
                out += ' && !(' + ($data) + ' % 1)';
              }
              out += ')) ' + ($coerced) + ' = +' + ($data) + '; ';
            } else if ($type == 'boolean') {
              out += ' else if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; ';
            } else if ($type == 'null') {
              out += ' else if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; ';
            } else if (it.opts.coerceTypes == 'array' && $type == 'array') {
              out += ' else if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; ';
            }
          }
        }
        out += ' else {   ';
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';
          if ($typeIsArray) {
            out += '' + ($typeSchema.join(","));
          } else {
            out += '' + ($typeSchema);
          }
          out += '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'should be ';
            if ($typeIsArray) {
              out += '' + ($typeSchema.join(","));
            } else {
              out += '' + ($typeSchema);
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        out += ' } if (' + ($coerced) + ' !== undefined) {  ';
        var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',
          $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
        out += ' ' + ($data) + ' = ' + ($coerced) + '; ';
        if (!$dataLvl) {
          out += 'if (' + ($parentData) + ' !== undefined)';
        }
        out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } ';
      } else {
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';
          if ($typeIsArray) {
            out += '' + ($typeSchema.join(","));
          } else {
            out += '' + ($typeSchema);
          }
          out += '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'should be ';
            if ($typeIsArray) {
              out += '' + ($typeSchema.join(","));
            } else {
              out += '' + ($typeSchema);
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
      }
      out += ' } ';
    }
  }
  if (it.schema.$ref && !$refKeywords) {
    out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' ';
    if ($breakOnError) {
      out += ' } if (errors === ';
      if ($top) {
        out += '0';
      } else {
        out += 'errs_' + ($lvl);
      }
      out += ') { ';
      $closingBraces2 += '}';
    }
  } else {
    var arr2 = it.RULES;
    if (arr2) {
      var $rulesGroup, i2 = -1,
        l2 = arr2.length - 1;
      while (i2 < l2) {
        $rulesGroup = arr2[i2 += 1];
        if ($shouldUseGroup($rulesGroup)) {
          if ($rulesGroup.type) {
            out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers)) + ') { ';
          }
          if (it.opts.useDefaults) {
            if ($rulesGroup.type == 'object' && it.schema.properties) {
              var $schema = it.schema.properties,
                $schemaKeys = Object.keys($schema);
              var arr3 = $schemaKeys;
              if (arr3) {
                var $propertyKey, i3 = -1,
                  l3 = arr3.length - 1;
                while (i3 < l3) {
                  $propertyKey = arr3[i3 += 1];
                  var $sch = $schema[$propertyKey];
                  if ($sch.default !== undefined) {
                    var $passData = $data + it.util.getProperty($propertyKey);
                    if (it.compositeRule) {
                      if (it.opts.strictDefaults) {
                        var $defaultMsg = 'default is ignored for: ' + $passData;
                        if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
                        else throw new Error($defaultMsg);
                      }
                    } else {
                      out += ' if (' + ($passData) + ' === undefined ';
                      if (it.opts.useDefaults == 'empty') {
                        out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' ';
                      }
                      out += ' ) ' + ($passData) + ' = ';
                      if (it.opts.useDefaults == 'shared') {
                        out += ' ' + (it.useDefault($sch.default)) + ' ';
                      } else {
                        out += ' ' + (JSON.stringify($sch.default)) + ' ';
                      }
                      out += '; ';
                    }
                  }
                }
              }
            } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) {
              var arr4 = it.schema.items;
              if (arr4) {
                var $sch, $i = -1,
                  l4 = arr4.length - 1;
                while ($i < l4) {
                  $sch = arr4[$i += 1];
                  if ($sch.default !== undefined) {
                    var $passData = $data + '[' + $i + ']';
                    if (it.compositeRule) {
                      if (it.opts.strictDefaults) {
                        var $defaultMsg = 'default is ignored for: ' + $passData;
                        if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
                        else throw new Error($defaultMsg);
                      }
                    } else {
                      out += ' if (' + ($passData) + ' === undefined ';
                      if (it.opts.useDefaults == 'empty') {
                        out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' ';
                      }
                      out += ' ) ' + ($passData) + ' = ';
                      if (it.opts.useDefaults == 'shared') {
                        out += ' ' + (it.useDefault($sch.default)) + ' ';
                      } else {
                        out += ' ' + (JSON.stringify($sch.default)) + ' ';
                      }
                      out += '; ';
                    }
                  }
                }
              }
            }
          }
          var arr5 = $rulesGroup.rules;
          if (arr5) {
            var $rule, i5 = -1,
              l5 = arr5.length - 1;
            while (i5 < l5) {
              $rule = arr5[i5 += 1];
              if ($shouldUseRule($rule)) {
                var $code = $rule.code(it, $rule.keyword, $rulesGroup.type);
                if ($code) {
                  out += ' ' + ($code) + ' ';
                  if ($breakOnError) {
                    $closingBraces1 += '}';
                  }
                }
              }
            }
          }
          if ($breakOnError) {
            out += ' ' + ($closingBraces1) + ' ';
            $closingBraces1 = '';
          }
          if ($rulesGroup.type) {
            out += ' } ';
            if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) {
              out += ' else { ';
              var $schemaPath = it.schemaPath + '.type',
                $errSchemaPath = it.errSchemaPath + '/type';
              var $$outStack = $$outStack || [];
              $$outStack.push(out);
              out = ''; /* istanbul ignore else */
              if (it.createErrors !== false) {
                out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';
                if ($typeIsArray) {
                  out += '' + ($typeSchema.join(","));
                } else {
                  out += '' + ($typeSchema);
                }
                out += '\' } ';
                if (it.opts.messages !== false) {
                  out += ' , message: \'should be ';
                  if ($typeIsArray) {
                    out += '' + ($typeSchema.join(","));
                  } else {
                    out += '' + ($typeSchema);
                  }
                  out += '\' ';
                }
                if (it.opts.verbose) {
                  out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
                }
                out += ' } ';
              } else {
                out += ' {} ';
              }
              var __err = out;
              out = $$outStack.pop();
              if (!it.compositeRule && $breakOnError) {
                /* istanbul ignore if */
                if (it.async) {
                  out += ' throw new ValidationError([' + (__err) + ']); ';
                } else {
                  out += ' validate.errors = [' + (__err) + ']; return false; ';
                }
              } else {
                out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
              }
              out += ' } ';
            }
          }
          if ($breakOnError) {
            out += ' if (errors === ';
            if ($top) {
              out += '0';
            } else {
              out += 'errs_' + ($lvl);
            }
            out += ') { ';
            $closingBraces2 += '}';
          }
        }
      }
    }
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces2) + ' ';
  }
  if ($top) {
    if ($async) {
      out += ' if (errors === 0) return data;           ';
      out += ' else throw new ValidationError(vErrors); ';
    } else {
      out += ' validate.errors = vErrors; ';
      out += ' return errors === 0;       ';
    }
    out += ' }; return validate;';
  } else {
    out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';';
  }

  function $shouldUseGroup($rulesGroup) {
    var rules = $rulesGroup.rules;
    for (var i = 0; i < rules.length; i++)
      if ($shouldUseRule(rules[i])) return true;
  }

  function $shouldUseRule($rule) {
    return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule));
  }

  function $ruleImplementsSomeKeyword($rule) {
    var impl = $rule.implements;
    for (var i = 0; i < impl.length; i++)
      if (it.schema[impl[i]] !== undefined) return true;
  }
  return out;
}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{## def.setExclusiveLimit:
  $exclusive = true;
  $errorKeyword = $exclusiveKeyword;
  $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
#}}

{{
  var $isMax = $keyword == 'maximum'
    , $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum'
    , $schemaExcl = it.schema[$exclusiveKeyword]
    , $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data
    , $op = $isMax ? '<' : '>'
    , $notOp = $isMax ? '>' : '<'
    , $errorKeyword = undefined;

  if (!($isData || typeof $schema == 'number' || $schema === undefined)) {
    throw new Error($keyword + ' must be number');
  }
  if (!($isDataExcl || $schemaExcl === undefined
                    || typeof $schemaExcl == 'number'
                    || typeof $schemaExcl == 'boolean')) {
    throw new Error($exclusiveKeyword + ' must be number or boolean');
  }
}}

{{? $isDataExcl }}
  {{
    var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr)
      , $exclusive = 'exclusive' + $lvl
      , $exclType = 'exclType' + $lvl
      , $exclIsNumber = 'exclIsNumber' + $lvl
      , $opExpr = 'op' + $lvl
      , $opStr = '\' + ' + $opExpr + ' + \'';
  }}
  var schemaExcl{{=$lvl}} = {{=$schemaValueExcl}};
  {{ $schemaValueExcl = 'schemaExcl' + $lvl; }}

  var {{=$exclusive}};
  var {{=$exclType}} = typeof {{=$schemaValueExcl}};
  if ({{=$exclType}} != 'boolean' && {{=$exclType}} != 'undefined' && {{=$exclType}} != 'number') {
    {{ var $errorKeyword = $exclusiveKeyword; }}
    {{# def.error:'_exclusiveLimit' }}
  } else if ({{# def.$dataNotType:'number' }}
            {{=$exclType}} == 'number'
              ? (
                  ({{=$exclusive}} = {{=$schemaValue}} === undefined || {{=$schemaValueExcl}} {{=$op}}= {{=$schemaValue}})
                    ? {{=$data}} {{=$notOp}}= {{=$schemaValueExcl}}
                    : {{=$data}} {{=$notOp}} {{=$schemaValue}}
                )
              : (
                  ({{=$exclusive}} = {{=$schemaValueExcl}} === true)
                    ? {{=$data}} {{=$notOp}}= {{=$schemaValue}}
                    : {{=$data}} {{=$notOp}} {{=$schemaValue}}
                )
            || {{=$data}} !== {{=$data}}) {
    var op{{=$lvl}} = {{=$exclusive}} ? '{{=$op}}' : '{{=$op}}=';
    {{
      if ($schema === undefined) {
        $errorKeyword = $exclusiveKeyword;
        $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
        $schemaValue = $schemaValueExcl;
        $isData = $isDataExcl;
      }
    }}
{{??}}
  {{
    var $exclIsNumber = typeof $schemaExcl == 'number'
      , $opStr = $op;  /*used in error*/
  }}

  {{? $exclIsNumber && $isData }}
    {{ var $opExpr = '\'' + $opStr + '\''; /*used in error*/ }}
    if ({{# def.$dataNotType:'number' }}
        ( {{=$schemaValue}} === undefined
          || {{=$schemaExcl}} {{=$op}}= {{=$schemaValue}}
            ? {{=$data}} {{=$notOp}}= {{=$schemaExcl}}
            : {{=$data}} {{=$notOp}} {{=$schemaValue}} )
        || {{=$data}} !== {{=$data}}) {
  {{??}}
    {{
      if ($exclIsNumber && $schema === undefined) {
          {{# def.setExclusiveLimit }}
          $schemaValue = $schemaExcl;
          $notOp += '=';
      } else {
        if ($exclIsNumber)
          $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema);

        if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {
          {{# def.setExclusiveLimit }}
          $notOp += '=';
        } else {
          $exclusive = false;
          $opStr += '=';
        }
      }

      var $opExpr = '\'' + $opStr + '\''; /*used in error*/
    }}

    if ({{# def.$dataNotType:'number' }}
        {{=$data}} {{=$notOp}} {{=$schemaValue}}
        || {{=$data}} !== {{=$data}}) {
  {{?}}
{{?}}
    {{ $errorKeyword = $errorKeyword || $keyword; }}
    {{# def.error:'_limit' }}
  } {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{# def.numberKeyword }}

{{ var $op = $keyword == 'maxItems' ? '>' : '<'; }}
if ({{# def.$dataNotType:'number' }} {{=$data}}.length {{=$op}} {{=$schemaValue}}) {
  {{ var $errorKeyword = $keyword; }}
  {{# def.error:'_limitItems' }}
} {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{# def.numberKeyword }}

{{ var $op = $keyword == 'maxLength' ? '>' : '<'; }}
if ({{# def.$dataNotType:'number' }} {{# def.strLength }} {{=$op}} {{=$schemaValue}}) {
  {{ var $errorKeyword = $keyword; }}
  {{# def.error:'_limitLength' }}
} {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{# def.numberKeyword }}

{{ var $op = $keyword == 'maxProperties' ? '>' : '<'; }}
if ({{# def.$dataNotType:'number' }} Object.keys({{=$data}}).length {{=$op}} {{=$schemaValue}}) {
  {{ var $errorKeyword = $keyword; }}
  {{# def.error:'_limitProperties' }}
} {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}

{{
  var $currentBaseId = $it.baseId
    , $allSchemasEmpty = true;
}}

{{~ $schema:$sch:$i }}
  {{? {{# def.nonEmptySchema:$sch }} }}
    {{
      $allSchemasEmpty = false;
      $it.schema = $sch;
      $it.schemaPath = $schemaPath + '[' + $i + ']';
      $it.errSchemaPath = $errSchemaPath + '/' + $i;
    }}

    {{# def.insertSubschemaCode }}

    {{# def.ifResultValid }}
  {{?}}
{{~}}

{{? $breakOnError }}
  {{? $allSchemasEmpty }}
    if (true) {
  {{??}}
    {{= $closingBraces.slice(0,-1) }}
  {{?}}
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}

{{
  var $noEmptySchema = $schema.every(function($sch) {
    return {{# def.nonEmptySchema:$sch }};
  });
}}
{{? $noEmptySchema }}
  {{ var $currentBaseId = $it.baseId; }}
  var {{=$errs}} = errors;
  var {{=$valid}} = false;

  {{# def.setCompositeRule }}

  {{~ $schema:$sch:$i }}
    {{
      $it.schema = $sch;
      $it.schemaPath = $schemaPath + '[' + $i + ']';
      $it.errSchemaPath = $errSchemaPath + '/' + $i;
    }}

    {{# def.insertSubschemaCode }}

    {{=$valid}} = {{=$valid}} || {{=$nextValid}};

    if (!{{=$valid}}) {
    {{ $closingBraces += '}'; }}
  {{~}}

  {{# def.resetCompositeRule }}

  {{= $closingBraces }}

  if (!{{=$valid}}) {
    {{# def.extraError:'anyOf' }}
  } else {
    {{# def.resetErrors }}
  {{? it.opts.allErrors }} } {{?}}
{{??}}
  {{? $breakOnError }}
    if (true) {
  {{?}}
{{?}}
{{## def.coerceType:
  {{
    var $dataType = 'dataType' + $lvl
      , $coerced = 'coerced' + $lvl;
  }}
  var {{=$dataType}} = typeof {{=$data}};
  var {{=$coerced}} = undefined;

  {{? it.opts.coerceTypes == 'array' }}
    if ({{=$dataType}} == 'object' && Array.isArray({{=$data}}) && {{=$data}}.length == 1) {
      {{=$data}} = {{=$data}}[0];
      {{=$dataType}} = typeof {{=$data}};
      if ({{=it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)}}) {{=$coerced}} = {{=$data}};
    }
  {{?}}

  if ({{=$coerced}} !== undefined) ;
  {{~ $coerceToTypes:$type:$i }}
    {{? $type == 'string' }}
      else if ({{=$dataType}} == 'number' || {{=$dataType}} == 'boolean')
        {{=$coerced}} = '' + {{=$data}};
      else if ({{=$data}} === null) {{=$coerced}} = '';
    {{?? $type == 'number' || $type == 'integer' }}
      else if ({{=$dataType}} == 'boolean' || {{=$data}} === null
          || ({{=$dataType}} == 'string' && {{=$data}} && {{=$data}} == +{{=$data}}
          {{? $type == 'integer' }} && !({{=$data}} % 1){{?}}))
        {{=$coerced}} = +{{=$data}};
    {{?? $type == 'boolean' }}
      else if ({{=$data}} === 'false' || {{=$data}} === 0 || {{=$data}} === null)
        {{=$coerced}} = false;
      else if ({{=$data}} === 'true' || {{=$data}} === 1)
        {{=$coerced}} = true;
    {{?? $type == 'null' }}
      else if ({{=$data}} === '' || {{=$data}} === 0 || {{=$data}} === false)
        {{=$coerced}} = null;
    {{?? it.opts.coerceTypes == 'array' && $type == 'array' }}
      else if ({{=$dataType}} == 'string' || {{=$dataType}} == 'number' || {{=$dataType}} == 'boolean' || {{=$data}} == null)
        {{=$coerced}} = [{{=$data}}];
    {{?}}
  {{~}}
  else {
    {{# def.error:'type' }}
  }

  if ({{=$coerced}} !== undefined) {
    {{# def.setParentData }}
    {{=$data}} = {{=$coerced}};
    {{? !$dataLvl }}if ({{=$parentData}} !== undefined){{?}}
      {{=$parentData}}[{{=$parentDataProperty}}] = {{=$coerced}};
  }
#}}
{{# def.definitions }}
{{# def.setupKeyword }}

{{ var $comment = it.util.toQuotedString($schema); }}
{{? it.opts.$comment === true }}
  console.log({{=$comment}});
{{?? typeof it.opts.$comment == 'function' }}
  self._opts.$comment({{=$comment}}, {{=it.util.toQuotedString($errSchemaPath)}}, validate.root.schema);
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{? !$isData }}
  var schema{{=$lvl}} = validate.schema{{=$schemaPath}};
{{?}}
var {{=$valid}} = equal({{=$data}}, schema{{=$lvl}});
{{# def.checkError:'const' }}
{{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}


{{
  var $idx = 'i' + $lvl
    , $dataNxt = $it.dataLevel = it.dataLevel + 1
    , $nextData = 'data' + $dataNxt
    , $currentBaseId = it.baseId
    , $nonEmptySchema = {{# def.nonEmptySchema:$schema }};
}}

var {{=$errs}} = errors;
var {{=$valid}};

{{? $nonEmptySchema }}
  {{# def.setCompositeRule }}

  {{
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
  }}

  var {{=$nextValid}} = false;

  for (var {{=$idx}} = 0; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) {
    {{
      $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
      var $passData = $data + '[' + $idx + ']';
      $it.dataPathArr[$dataNxt] = $idx;
    }}

    {{# def.generateSubschemaCode }}
    {{# def.optimizeValidate }}

    if ({{=$nextValid}}) break;
  }

  {{# def.resetCompositeRule }}
  {{= $closingBraces }}

  if (!{{=$nextValid}}) {
{{??}}
  if ({{=$data}}.length == 0) {
{{?}}

    {{# def.error:'contains' }}
  } else {
    {{? $nonEmptySchema }}
      {{# def.resetErrors }}
    {{?}}
  {{? it.opts.allErrors }} } {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{
  var $rule = this
    , $definition = 'definition' + $lvl
    , $rDef = $rule.definition
    , $closingBraces = '';
  var $validate = $rDef.validate;
  var $compile, $inline, $macro, $ruleValidate, $validateCode;
}}

{{? $isData && $rDef.$data }}
  {{
    $validateCode = 'keywordValidate' + $lvl;
    var $validateSchema = $rDef.validateSchema;
  }}
  var {{=$definition}} = RULES.custom['{{=$keyword}}'].definition;
  var {{=$validateCode}} = {{=$definition}}.validate;
{{??}}
  {{
    $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it);
    if (!$ruleValidate) return;
    $schemaValue = 'validate.schema' + $schemaPath;
    $validateCode = $ruleValidate.code;
    $compile = $rDef.compile;
    $inline = $rDef.inline;
    $macro = $rDef.macro;
  }}
{{?}}

{{
  var $ruleErrs = $validateCode + '.errors'
    , $i = 'i' + $lvl
    , $ruleErr = 'ruleErr' + $lvl
    , $asyncKeyword = $rDef.async;

  if ($asyncKeyword && !it.async)
    throw new Error('async keyword in sync schema');
}}


{{? !($inline || $macro) }}{{=$ruleErrs}} = null;{{?}}
var {{=$errs}} = errors;
var {{=$valid}};

{{## def.callRuleValidate:
  {{=$validateCode}}.call(
    {{? it.opts.passContext }}this{{??}}self{{?}}
    {{? $compile || $rDef.schema === false }}
      , {{=$data}}
    {{??}}
      , {{=$schemaValue}}
      , {{=$data}}
      , validate.schema{{=it.schemaPath}}
    {{?}}
    , {{# def.dataPath }}
    {{# def.passParentData }}
    , rootData
  )
#}}

{{## def.extendErrors:_inline:
  for (var {{=$i}}={{=$errs}}; {{=$i}}<errors; {{=$i}}++) {
    var {{=$ruleErr}} = vErrors[{{=$i}}];
    if ({{=$ruleErr}}.dataPath === undefined)
      {{=$ruleErr}}.dataPath = (dataPath || '') + {{= it.errorPath }};
    {{# _inline ? 'if (\{\{=$ruleErr\}\}.schemaPath === undefined) {' : '' }}
      {{=$ruleErr}}.schemaPath = "{{=$errSchemaPath}}";
    {{# _inline ? '}' : '' }}
    {{? it.opts.verbose }}
      {{=$ruleErr}}.schema = {{=$schemaValue}};
      {{=$ruleErr}}.data = {{=$data}};
    {{?}}
  }
#}}


{{? $isData && $rDef.$data }}
  {{ $closingBraces += '}'; }}
  if ({{=$schemaValue}} === undefined) {
    {{=$valid}} = true;
  } else {
  {{? $validateSchema }}
    {{ $closingBraces += '}'; }}
    {{=$valid}} = {{=$definition}}.validateSchema({{=$schemaValue}});
    if ({{=$valid}}) {
  {{?}}
{{?}}

{{? $inline }}
  {{? $rDef.statements }}
    {{= $ruleValidate.validate }}
  {{??}}
    {{=$valid}} = {{= $ruleValidate.validate }};
  {{?}}
{{?? $macro }}
  {{# def.setupNextLevel }}
  {{
    $it.schema = $ruleValidate.validate;
    $it.schemaPath = '';
  }}
  {{# def.setCompositeRule }}
  {{ var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); }}
  {{# def.resetCompositeRule }}
  {{= $code }}
{{??}}
  {{# def.beginDefOut}}
    {{# def.callRuleValidate }}
  {{# def.storeDefOut:def_callRuleValidate }}

  {{? $rDef.errors === false }}
    {{=$valid}} = {{? $asyncKeyword }}await {{?}}{{= def_callRuleValidate }};
  {{??}}
    {{? $asyncKeyword }}
      {{ $ruleErrs = 'customErrors' + $lvl; }}
      var {{=$ruleErrs}} = null;
      try {
        {{=$valid}} = await {{= def_callRuleValidate }};
      } catch (e) {
        {{=$valid}} = false;
        if (e instanceof ValidationError) {{=$ruleErrs}} = e.errors;
        else throw e;
      }
    {{??}}
      {{=$ruleErrs}} = null;
      {{=$valid}} = {{= def_callRuleValidate }};
    {{?}}
  {{?}}
{{?}}

{{? $rDef.modifying }}
  if ({{=$parentData}}) {{=$data}} = {{=$parentData}}[{{=$parentDataProperty}}];
{{?}}

{{= $closingBraces }}

{{## def.notValidationResult:
  {{? $rDef.valid === undefined }}
    !{{? $macro }}{{=$nextValid}}{{??}}{{=$valid}}{{?}}
  {{??}}
    {{= !$rDef.valid }}
  {{?}}
#}}

{{? $rDef.valid }}
  {{? $breakOnError }} if (true) { {{?}}
{{??}}
  if ({{# def.notValidationResult }}) {
    {{ $errorKeyword = $rule.keyword; }}
    {{# def.beginDefOut}}
      {{# def.error:'custom' }}
    {{# def.storeDefOut:def_customError }}

    {{? $inline }}
      {{? $rDef.errors }}
        {{? $rDef.errors != 'full' }}
          {{# def.extendErrors:true }}
        {{?}}
      {{??}}
        {{? $rDef.errors === false}}
          {{= def_customError }}
        {{??}}
          if ({{=$errs}} == errors) {
            {{= def_customError }}
          } else {
            {{# def.extendErrors:true }}
          }
        {{?}}
      {{?}}
    {{?? $macro }}
      {{# def.extraError:'custom' }}
    {{??}}
      {{? $rDef.errors === false}}
        {{= def_customError }}
      {{??}}
        if (Array.isArray({{=$ruleErrs}})) {
          if (vErrors === null) vErrors = {{=$ruleErrs}};
          else vErrors = vErrors.concat({{=$ruleErrs}});
          errors = vErrors.length;
          {{# def.extendErrors:false }}
        } else {
          {{= def_customError }}
        }
      {{?}}
    {{?}}

  } {{? $breakOnError }} else { {{?}}
{{?}}
{{## def.assignDefault:
  {{? it.compositeRule }}
    {{
      if (it.opts.strictDefaults) {
        var $defaultMsg = 'default is ignored for: ' + $passData;
        if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
        else throw new Error($defaultMsg);
      }
    }}
  {{??}}
    if ({{=$passData}} === undefined
      {{? it.opts.useDefaults == 'empty' }}
        || {{=$passData}} === null
        || {{=$passData}} === ''
      {{?}}
    )
      {{=$passData}} = {{? it.opts.useDefaults == 'shared' }}
                         {{= it.useDefault($sch.default) }}
                       {{??}}
                         {{= JSON.stringify($sch.default) }}
                       {{?}};
  {{?}}
#}}


{{## def.defaultProperties:
  {{
    var $schema = it.schema.properties
      , $schemaKeys = Object.keys($schema); }}
  {{~ $schemaKeys:$propertyKey }}
    {{ var $sch = $schema[$propertyKey]; }}
    {{? $sch.default !== undefined }}
      {{ var $passData = $data + it.util.getProperty($propertyKey); }}
      {{# def.assignDefault }}
    {{?}}
  {{~}}
#}}


{{## def.defaultItems:
  {{~ it.schema.items:$sch:$i }}
    {{? $sch.default !== undefined }}
      {{ var $passData = $data + '[' + $i + ']'; }}
      {{# def.assignDefault }}
    {{?}}
  {{~}}
#}}
{{## def.setupKeyword:
  {{
    var $lvl = it.level;
    var $dataLvl = it.dataLevel;
    var $schema = it.schema[$keyword];
    var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
    var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
    var $breakOnError = !it.opts.allErrors;
    var $errorKeyword;

    var $data = 'data' + ($dataLvl || '');
    var $valid = 'valid' + $lvl;
    var $errs = 'errs__' + $lvl;
  }}
#}}


{{## def.setCompositeRule:
  {{
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
  }}
#}}


{{## def.resetCompositeRule:
  {{ it.compositeRule = $it.compositeRule = $wasComposite; }}
#}}


{{## def.setupNextLevel:
  {{
    var $it = it.util.copy(it);
    var $closingBraces = '';
    $it.level++;
    var $nextValid = 'valid' + $it.level;
  }}
#}}


{{## def.ifValid:
  {{? $breakOnError }}
    if ({{=$valid}}) {
    {{ $closingBraces += '}'; }}
  {{?}}
#}}


{{## def.ifResultValid:
  {{? $breakOnError }}
    if ({{=$nextValid}}) {
    {{ $closingBraces += '}'; }}
  {{?}}
#}}


{{## def.elseIfValid:
  {{? $breakOnError }}
    {{ $closingBraces += '}'; }}
    else {
  {{?}}
#}}


{{## def.nonEmptySchema:_schema:
  (it.opts.strictKeywords
    ? (typeof _schema == 'object' && Object.keys(_schema).length > 0)
      || _schema === false
    : it.util.schemaHasRules(_schema, it.RULES.all))
#}}


{{## def.strLength:
  {{? it.opts.unicode === false }}
    {{=$data}}.length
  {{??}}
    ucs2length({{=$data}})
  {{?}}
#}}


{{## def.willOptimize:
  it.util.varOccurences($code, $nextData) < 2
#}}


{{## def.generateSubschemaCode:
  {{
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
  }}
#}}


{{## def.insertSubschemaCode:
  {{= it.validate($it) }}
  {{ $it.baseId = $currentBaseId; }}
#}}


{{## def._optimizeValidate:
  it.util.varReplace($code, $nextData, $passData)
#}}


{{## def.optimizeValidate:
  {{? {{# def.willOptimize}} }}
    {{= {{# def._optimizeValidate }} }}
  {{??}}
    var {{=$nextData}} = {{=$passData}};
    {{= $code }}
  {{?}}
#}}


{{## def.$data:
  {{
    var $isData = it.opts.$data && $schema && $schema.$data
      , $schemaValue;
  }}
  {{? $isData }}
    var schema{{=$lvl}} = {{= it.util.getData($schema.$data, $dataLvl, it.dataPathArr) }};
    {{ $schemaValue = 'schema' + $lvl; }}
  {{??}}
    {{ $schemaValue = $schema; }}
  {{?}}
#}}


{{## def.$dataNotType:_type:
  {{?$isData}} ({{=$schemaValue}} !== undefined && typeof {{=$schemaValue}} != _type) || {{?}}
#}}


{{## def.check$dataIsArray:
  if (schema{{=$lvl}} === undefined) {{=$valid}} = true;
  else if (!Array.isArray(schema{{=$lvl}})) {{=$valid}} = false;
  else {
#}}


{{## def.numberKeyword:
  {{? !($isData || typeof $schema == 'number') }}
    {{ throw new Error($keyword + ' must be number'); }}
  {{?}}
#}}


{{## def.beginDefOut:
  {{
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
  }}
#}}


{{## def.storeDefOut:_variable:
  {{
    var _variable = out;
    out = $$outStack.pop();
  }}
#}}


{{## def.dataPath:(dataPath || ''){{? it.errorPath != '""'}} + {{= it.errorPath }}{{?}}#}}

{{## def.setParentData:
  {{
    var $parentData = $dataLvl ? 'data' + (($dataLvl-1)||'') : 'parentData'
      , $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
  }}
#}}

{{## def.passParentData:
  {{# def.setParentData }}
  , {{= $parentData }}
  , {{= $parentDataProperty }}
#}}


{{## def.iterateProperties:
  {{? $ownProperties }}
    {{=$dataProperties}} = {{=$dataProperties}} || Object.keys({{=$data}});
    for (var {{=$idx}}=0; {{=$idx}}<{{=$dataProperties}}.length; {{=$idx}}++) {
      var {{=$key}} = {{=$dataProperties}}[{{=$idx}}];
  {{??}}
    for (var {{=$key}} in {{=$data}}) {
  {{?}}
#}}


{{## def.noPropertyInData:
  {{=$useData}} === undefined
  {{? $ownProperties }}
    || !{{# def.isOwnProperty }}
  {{?}}
#}}


{{## def.isOwnProperty:
  Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($propertyKey)}}')
#}}
{{# def.definitions }}
{{# def.errors }}
{{# def.missing }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}


{{## def.propertyInData:
  {{=$data}}{{= it.util.getProperty($property) }} !== undefined
  {{? $ownProperties }}
    && Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($property)}}')
  {{?}}
#}}


{{
  var $schemaDeps = {}
    , $propertyDeps = {}
    , $ownProperties = it.opts.ownProperties;

  for ($property in $schema) {
    if ($property == '__proto__') continue;
    var $sch = $schema[$property];
    var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;
    $deps[$property] = $sch;
  }
}}

var {{=$errs}} = errors;

{{ var $currentErrorPath = it.errorPath; }}

var missing{{=$lvl}};
{{ for (var $property in $propertyDeps) { }}
  {{ $deps = $propertyDeps[$property]; }}
  {{? $deps.length }}
    if ({{# def.propertyInData }}
      {{? $breakOnError }}
          && ({{# def.checkMissingProperty:$deps }})) {
          {{# def.errorMissingProperty:'dependencies' }}
      {{??}}
        ) {
          {{~ $deps:$propertyKey }}
            {{# def.allErrorsMissingProperty:'dependencies' }}
          {{~}}
      {{?}}
    } {{# def.elseIfValid }}
  {{?}}
{{ } }}

{{
  it.errorPath = $currentErrorPath;
  var $currentBaseId = $it.baseId;
}}


{{ for (var $property in $schemaDeps) { }}
  {{ var $sch = $schemaDeps[$property]; }}
  {{? {{# def.nonEmptySchema:$sch }} }}
    {{=$nextValid}} = true;

    if ({{# def.propertyInData }}) {
      {{ 
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + it.util.getProperty($property);
        $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);
      }}

      {{# def.insertSubschemaCode }}
    }

    {{# def.ifResultValid }}
  {{?}}
{{ } }}

{{? $breakOnError }} 
  {{= $closingBraces }}
  if ({{=$errs}} == errors) {
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{
  var $i = 'i' + $lvl
    , $vSchema = 'schema' + $lvl;
}}

{{? !$isData }}
  var {{=$vSchema}} = validate.schema{{=$schemaPath}};
{{?}}
var {{=$valid}};

{{?$isData}}{{# def.check$dataIsArray }}{{?}}

{{=$valid}} = false;

for (var {{=$i}}=0; {{=$i}}<{{=$vSchema}}.length; {{=$i}}++)
  if (equal({{=$data}}, {{=$vSchema}}[{{=$i}}])) {
    {{=$valid}} = true;
    break;
  }

{{? $isData }}  }  {{?}}

{{# def.checkError:'enum' }}

{{? $breakOnError }} else { {{?}}
{{# def.definitions }}

{{## def._error:_rule:
  {{ 'istanbul ignore else'; }}
  {{? it.createErrors !== false }}
    {
      keyword: '{{= $errorKeyword || _rule }}'
      , dataPath: (dataPath || '') + {{= it.errorPath }}
      , schemaPath: {{=it.util.toQuotedString($errSchemaPath)}}
      , params: {{# def._errorParams[_rule] }}
      {{? it.opts.messages !== false }}
        , message: {{# def._errorMessages[_rule] }}
      {{?}}
      {{? it.opts.verbose }}
        , schema: {{# def._errorSchemas[_rule] }}
        , parentSchema: validate.schema{{=it.schemaPath}}
        , data: {{=$data}}
      {{?}}
    }
  {{??}}
    {}
  {{?}}
#}}


{{## def._addError:_rule:
  if (vErrors === null) vErrors = [err];
  else vErrors.push(err);
  errors++;
#}}


{{## def.addError:_rule:
  var err = {{# def._error:_rule }};
  {{# def._addError:_rule }}
#}}


{{## def.error:_rule:
  {{# def.beginDefOut}}
    {{# def._error:_rule }}
  {{# def.storeDefOut:__err }}

  {{? !it.compositeRule && $breakOnError }}
    {{ 'istanbul ignore if'; }}
    {{? it.async }}
      throw new ValidationError([{{=__err}}]);
    {{??}}
      validate.errors = [{{=__err}}];
      return false;
    {{?}}
  {{??}}
    var err = {{=__err}};
    {{# def._addError:_rule }}
  {{?}}
#}}


{{## def.extraError:_rule:
  {{# def.addError:_rule}}
  {{? !it.compositeRule && $breakOnError }}
    {{ 'istanbul ignore if'; }}
    {{? it.async }}
      throw new ValidationError(vErrors);
    {{??}}
      validate.errors = vErrors;
      return false;
    {{?}}
  {{?}}
#}}


{{## def.checkError:_rule:
  if (!{{=$valid}}) {
    {{# def.error:_rule }}
  }
#}}


{{## def.resetErrors:
  errors = {{=$errs}};
  if (vErrors !== null) {
    if ({{=$errs}}) vErrors.length = {{=$errs}};
    else vErrors = null;
  }
#}}


{{## def.concatSchema:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=$schema}}{{?}}#}}
{{## def.appendSchema:{{?$isData}}' + {{=$schemaValue}}{{??}}{{=$schemaValue}}'{{?}}#}}
{{## def.concatSchemaEQ:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=it.util.escapeQuotes($schema)}}{{?}}#}}

{{## def._errorMessages = {
  'false schema':  "'boolean schema is false'",
  $ref:            "'can\\\'t resolve reference {{=it.util.escapeQuotes($schema)}}'",
  additionalItems: "'should NOT have more than {{=$schema.length}} items'",
  additionalProperties: "'{{? it.opts._errorDataPathProperty }}is an invalid additional property{{??}}should NOT have additional properties{{?}}'",
  anyOf:           "'should match some schema in anyOf'",
  const:           "'should be equal to constant'",
  contains:        "'should contain a valid item'",
  dependencies:    "'should have {{? $deps.length == 1 }}property {{= it.util.escapeQuotes($deps[0]) }}{{??}}properties {{= it.util.escapeQuotes($deps.join(\", \")) }}{{?}} when property {{= it.util.escapeQuotes($property) }} is present'",
  'enum':          "'should be equal to one of the allowed values'",
  format:          "'should match format \"{{#def.concatSchemaEQ}}\"'",
  'if':            "'should match \"' + {{=$ifClause}} + '\" schema'",
  _limit:          "'should be {{=$opStr}} {{#def.appendSchema}}",
  _exclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'",
  _limitItems:     "'should NOT have {{?$keyword=='maxItems'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} items'",
  _limitLength:    "'should NOT be {{?$keyword=='maxLength'}}longer{{??}}shorter{{?}} than {{#def.concatSchema}} characters'",
  _limitProperties:"'should NOT have {{?$keyword=='maxProperties'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} properties'",
  multipleOf:      "'should be multiple of {{#def.appendSchema}}",
  not:             "'should NOT be valid'",
  oneOf:           "'should match exactly one schema in oneOf'",
  pattern:         "'should match pattern \"{{#def.concatSchemaEQ}}\"'",
  propertyNames:   "'property name \\'{{=$invalidName}}\\' is invalid'",
  required:        "'{{? it.opts._errorDataPathProperty }}is a required property{{??}}should have required property \\'{{=$missingProperty}}\\'{{?}}'",
  type:            "'should be {{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}'",
  uniqueItems:     "'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)'",
  custom:          "'should pass \"{{=$rule.keyword}}\" keyword validation'",
  patternRequired: "'should have property matching pattern \\'{{=$missingPattern}}\\''",
  switch:          "'should pass \"switch\" keyword validation'",
  _formatLimit:    "'should be {{=$opStr}} \"{{#def.concatSchemaEQ}}\"'",
  _formatExclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'"
} #}}


{{## def.schemaRefOrVal: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=$schema}}{{?}} #}}
{{## def.schemaRefOrQS: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}}

{{## def._errorSchemas = {
  'false schema':  "false",
  $ref:            "{{=it.util.toQuotedString($schema)}}",
  additionalItems: "false",
  additionalProperties: "false",
  anyOf:           "validate.schema{{=$schemaPath}}",
  const:           "validate.schema{{=$schemaPath}}",
  contains:        "validate.schema{{=$schemaPath}}",
  dependencies:    "validate.schema{{=$schemaPath}}",
  'enum':          "validate.schema{{=$schemaPath}}",
  format:          "{{#def.schemaRefOrQS}}",
  'if':            "validate.schema{{=$schemaPath}}",
  _limit:          "{{#def.schemaRefOrVal}}",
  _exclusiveLimit: "validate.schema{{=$schemaPath}}",
  _limitItems:     "{{#def.schemaRefOrVal}}",
  _limitLength:    "{{#def.schemaRefOrVal}}",
  _limitProperties:"{{#def.schemaRefOrVal}}",
  multipleOf:      "{{#def.schemaRefOrVal}}",
  not:             "validate.schema{{=$schemaPath}}",
  oneOf:           "validate.schema{{=$schemaPath}}",
  pattern:         "{{#def.schemaRefOrQS}}",
  propertyNames:   "validate.schema{{=$schemaPath}}",
  required:        "validate.schema{{=$schemaPath}}",
  type:            "validate.schema{{=$schemaPath}}",
  uniqueItems:     "{{#def.schemaRefOrVal}}",
  custom:          "validate.schema{{=$schemaPath}}",
  patternRequired: "validate.schema{{=$schemaPath}}",
  switch:          "validate.schema{{=$schemaPath}}",
  _formatLimit:    "{{#def.schemaRefOrQS}}",
  _formatExclusiveLimit: "validate.schema{{=$schemaPath}}"
} #}}


{{## def.schemaValueQS: {{?$isData}}{{=$schemaValue}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}}

{{## def._errorParams = {
  'false schema':  "{}",
  $ref:            "{ ref: '{{=it.util.escapeQuotes($schema)}}' }",
  additionalItems: "{ limit: {{=$schema.length}} }",
  additionalProperties: "{ additionalProperty: '{{=$additionalProperty}}' }",
  anyOf:           "{}",
  const:           "{ allowedValue: schema{{=$lvl}} }",
  contains:        "{}",
  dependencies:    "{ property: '{{= it.util.escapeQuotes($property) }}', missingProperty: '{{=$missingProperty}}', depsCount: {{=$deps.length}}, deps: '{{= it.util.escapeQuotes($deps.length==1 ? $deps[0] : $deps.join(\", \")) }}' }",
  'enum':          "{ allowedValues: schema{{=$lvl}} }",
  format:          "{ format: {{#def.schemaValueQS}} }",
  'if':            "{ failingKeyword: {{=$ifClause}} }",
  _limit:          "{ comparison: {{=$opExpr}}, limit: {{=$schemaValue}}, exclusive: {{=$exclusive}} }",
  _exclusiveLimit: "{}",
  _limitItems:     "{ limit: {{=$schemaValue}} }",
  _limitLength:    "{ limit: {{=$schemaValue}} }",
  _limitProperties:"{ limit: {{=$schemaValue}} }",
  multipleOf:      "{ multipleOf: {{=$schemaValue}} }",
  not:             "{}",
  oneOf:           "{ passingSchemas: {{=$passingSchemas}} }",
  pattern:         "{ pattern: {{#def.schemaValueQS}} }",
  propertyNames:   "{ propertyName: '{{=$invalidName}}' }",
  required:        "{ missingProperty: '{{=$missingProperty}}' }",
  type:            "{ type: '{{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}' }",
  uniqueItems:     "{ i: i, j: j }",
  custom:          "{ keyword: '{{=$rule.keyword}}' }",
  patternRequired: "{ missingPattern: '{{=$missingPattern}}' }",
  switch:          "{ caseIndex: {{=$caseIndex}} }",
  _formatLimit:    "{ comparison: {{=$opExpr}}, limit: {{#def.schemaValueQS}}, exclusive: {{=$exclusive}} }",
  _formatExclusiveLimit: "{}"
} #}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}

{{## def.skipFormat:
  {{? $breakOnError }} if (true) { {{?}}
  {{ return out; }}
#}}

{{? it.opts.format === false }}{{# def.skipFormat }}{{?}}


{{# def.$data }}


{{## def.$dataCheckFormat:
  {{# def.$dataNotType:'string' }}
  ({{? $unknownFormats != 'ignore' }}
     ({{=$schemaValue}} && !{{=$format}}
      {{? $allowUnknown }}
        && self._opts.unknownFormats.indexOf({{=$schemaValue}}) == -1
      {{?}}) ||
   {{?}}
   ({{=$format}} && {{=$formatType}} == '{{=$ruleType}}'
                 && !(typeof {{=$format}} == 'function'
                     ? {{? it.async}}
                        (async{{=$lvl}} ? await {{=$format}}({{=$data}}) : {{=$format}}({{=$data}}))
                       {{??}}
                        {{=$format}}({{=$data}})
                       {{?}}
                     : {{=$format}}.test({{=$data}}))))
#}}

{{## def.checkFormat:
  {{
    var $formatRef = 'formats' + it.util.getProperty($schema);
    if ($isObject) $formatRef += '.validate';
  }}
  {{? typeof $format == 'function' }}
    {{=$formatRef}}({{=$data}})
  {{??}}
    {{=$formatRef}}.test({{=$data}})
  {{?}}
#}}


{{
  var $unknownFormats = it.opts.unknownFormats
    , $allowUnknown = Array.isArray($unknownFormats);
}}

{{? $isData }}
  {{
    var $format = 'format' + $lvl
      , $isObject = 'isObject' + $lvl
      , $formatType = 'formatType' + $lvl;
  }}
  var {{=$format}} = formats[{{=$schemaValue}}];
  var {{=$isObject}} = typeof {{=$format}} == 'object'
                        && !({{=$format}} instanceof RegExp)
                        && {{=$format}}.validate;
  var {{=$formatType}} = {{=$isObject}} && {{=$format}}.type || 'string';
  if ({{=$isObject}}) {
    {{? it.async}}
      var async{{=$lvl}} = {{=$format}}.async;
    {{?}}
    {{=$format}} = {{=$format}}.validate;
  }
  if ({{# def.$dataCheckFormat }}) {
{{??}}
  {{ var $format = it.formats[$schema]; }}
  {{? !$format }}
    {{? $unknownFormats == 'ignore' }}
      {{ it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); }}
      {{# def.skipFormat }}
    {{?? $allowUnknown && $unknownFormats.indexOf($schema) >= 0 }}
      {{# def.skipFormat }}
    {{??}}
      {{ throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); }}
    {{?}}
  {{?}}
  {{
    var $isObject = typeof $format == 'object'
                    && !($format instanceof RegExp)
                    && $format.validate;
    var $formatType = $isObject && $format.type || 'string';
    if ($isObject) {
      var $async = $format.async === true;
      $format = $format.validate;
    }
  }}
  {{? $formatType != $ruleType }}
    {{# def.skipFormat }}
  {{?}}
  {{? $async }}
    {{
      if (!it.async) throw new Error('async format in sync schema');
      var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate';
    }}
    if (!(await {{=$formatRef}}({{=$data}}))) {
  {{??}}
    if (!{{# def.checkFormat }}) {
  {{?}}
{{?}}
    {{# def.error:'format' }}
  } {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}


{{## def.validateIfClause:_clause:
  {{
    $it.schema = it.schema['_clause'];
    $it.schemaPath = it.schemaPath + '._clause';
    $it.errSchemaPath = it.errSchemaPath + '/_clause';
  }}
  {{# def.insertSubschemaCode }}
  {{=$valid}} = {{=$nextValid}};
  {{? $thenPresent && $elsePresent }}
    {{ $ifClause = 'ifClause' + $lvl; }}
    var {{=$ifClause}} = '_clause';
  {{??}}
    {{ $ifClause = '\'_clause\''; }}
  {{?}}
#}}

{{
  var $thenSch = it.schema['then']
    , $elseSch = it.schema['else']
    , $thenPresent = $thenSch !== undefined && {{# def.nonEmptySchema:$thenSch }}
    , $elsePresent = $elseSch !== undefined && {{# def.nonEmptySchema:$elseSch }}
    , $currentBaseId = $it.baseId;
}}

{{? $thenPresent || $elsePresent }}
  {{
    var $ifClause;
    $it.createErrors = false;
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
  }}
  var {{=$errs}} = errors;
  var {{=$valid}} = true;

  {{# def.setCompositeRule }}
  {{# def.insertSubschemaCode }}
  {{ $it.createErrors = true; }}
  {{# def.resetErrors }}
  {{# def.resetCompositeRule }}

  {{? $thenPresent }}
    if ({{=$nextValid}}) {
      {{# def.validateIfClause:then }}
    }
    {{? $elsePresent }}
      else {
    {{?}}
  {{??}}
    if (!{{=$nextValid}}) {
  {{?}}

  {{? $elsePresent }}
      {{# def.validateIfClause:else }}
    }
  {{?}}

  if (!{{=$valid}}) {
    {{# def.extraError:'if' }}
  } 
  {{? $breakOnError }} else { {{?}}
{{??}}
  {{? $breakOnError }}
    if (true) {
  {{?}}
{{?}}

{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}


{{## def.validateItems:startFrom:
  for (var {{=$idx}} = {{=startFrom}}; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) {
    {{
      $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
      var $passData = $data + '[' + $idx + ']';
      $it.dataPathArr[$dataNxt] = $idx;
    }}

    {{# def.generateSubschemaCode }}
    {{# def.optimizeValidate }}

    {{? $breakOnError }}
      if (!{{=$nextValid}}) break;
    {{?}}
  }
#}}

{{
  var $idx = 'i' + $lvl
    , $dataNxt = $it.dataLevel = it.dataLevel + 1
    , $nextData = 'data' + $dataNxt
    , $currentBaseId = it.baseId;
}}

var {{=$errs}} = errors;
var {{=$valid}};

{{? Array.isArray($schema) }}
  {{ /* 'items' is an array of schemas */}}
  {{ var $additionalItems = it.schema.additionalItems; }}
  {{? $additionalItems === false }}
    {{=$valid}} = {{=$data}}.length <= {{= $schema.length }};
    {{
      var $currErrSchemaPath = $errSchemaPath;
      $errSchemaPath = it.errSchemaPath + '/additionalItems';      
    }}
    {{# def.checkError:'additionalItems' }}
    {{ $errSchemaPath = $currErrSchemaPath; }}
    {{# def.elseIfValid}}
  {{?}}

  {{~ $schema:$sch:$i }}
    {{? {{# def.nonEmptySchema:$sch }} }}
      {{=$nextValid}} = true;

      if ({{=$data}}.length > {{=$i}}) {
        {{
          var $passData = $data + '[' + $i + ']';
          $it.schema = $sch;
          $it.schemaPath = $schemaPath + '[' + $i + ']';
          $it.errSchemaPath = $errSchemaPath + '/' + $i;
          $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true);
          $it.dataPathArr[$dataNxt] = $i;
        }}

        {{# def.generateSubschemaCode }}
        {{# def.optimizeValidate }}
      }

      {{# def.ifResultValid }}
    {{?}}
  {{~}}

  {{? typeof $additionalItems == 'object' && {{# def.nonEmptySchema:$additionalItems }} }}
    {{
      $it.schema = $additionalItems;
      $it.schemaPath = it.schemaPath + '.additionalItems';
      $it.errSchemaPath = it.errSchemaPath + '/additionalItems';
    }}
    {{=$nextValid}} = true;

    if ({{=$data}}.length > {{= $schema.length }}) {
      {{# def.validateItems: $schema.length }}
    }

    {{# def.ifResultValid }}
  {{?}}

{{?? {{# def.nonEmptySchema:$schema }} }}
  {{ /* 'items' is a single schema */}}
  {{
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
  }}
  {{# def.validateItems: 0 }}
{{?}}

{{? $breakOnError }}
  {{= $closingBraces }}
  if ({{=$errs}} == errors) {
{{?}}
{{## def.checkMissingProperty:_properties:
  {{~ _properties:$propertyKey:$i }}
    {{?$i}} || {{?}}
    {{
      var $prop = it.util.getProperty($propertyKey)
        , $useData = $data + $prop;
    }}
    ( ({{# def.noPropertyInData }}) && (missing{{=$lvl}} = {{= it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop) }}) )
  {{~}}
#}}


{{## def.errorMissingProperty:_error:
  {{
    var $propertyPath = 'missing' + $lvl
      , $missingProperty = '\' + ' + $propertyPath + ' + \'';
    if (it.opts._errorDataPathProperty) {
      it.errorPath = it.opts.jsonPointers
                      ? it.util.getPathExpr($currentErrorPath,  $propertyPath, true)
                      : $currentErrorPath + ' + ' + $propertyPath;
    }
  }}
  {{# def.error:_error }}
#}}


{{## def.allErrorsMissingProperty:_error:
  {{
    var $prop = it.util.getProperty($propertyKey)
      , $missingProperty = it.util.escapeQuotes($propertyKey)
      , $useData = $data + $prop;
    if (it.opts._errorDataPathProperty) {
      it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
    }
  }}
  if ({{# def.noPropertyInData }}) {
    {{# def.addError:_error }}
  }
#}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{# def.numberKeyword }}

var division{{=$lvl}};
if ({{?$isData}}
      {{=$schemaValue}} !== undefined && (
      typeof {{=$schemaValue}} != 'number' ||
    {{?}}
      (division{{=$lvl}} = {{=$data}} / {{=$schemaValue}},
      {{? it.opts.multipleOfPrecision }}
        Math.abs(Math.round(division{{=$lvl}}) - division{{=$lvl}}) > 1e-{{=it.opts.multipleOfPrecision}}
      {{??}}
        division{{=$lvl}} !== parseInt(division{{=$lvl}})
      {{?}}
      )
    {{?$isData}}  )  {{?}} ) {
  {{# def.error:'multipleOf' }}
} {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}

{{? {{# def.nonEmptySchema:$schema }} }}
  {{
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
  }}

  var {{=$errs}} = errors;

  {{# def.setCompositeRule }}

  {{
    $it.createErrors = false;
    var $allErrorsOption;
    if ($it.opts.allErrors) {
      $allErrorsOption = $it.opts.allErrors;
      $it.opts.allErrors = false;
    }
  }}
  {{= it.validate($it) }}
  {{
    $it.createErrors = true;
    if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption;
  }}

  {{# def.resetCompositeRule }}

  if ({{=$nextValid}}) {
    {{# def.error:'not' }}
  } else {
    {{# def.resetErrors }}
  {{? it.opts.allErrors }} } {{?}}
{{??}}
  {{# def.addError:'not' }}
  {{? $breakOnError}}
    if (false) {
  {{?}}
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}

{{
  var $currentBaseId = $it.baseId
    , $prevValid = 'prevValid' + $lvl
    , $passingSchemas = 'passingSchemas' + $lvl;
}}

var {{=$errs}} = errors
  , {{=$prevValid}} = false
  , {{=$valid}} = false
  , {{=$passingSchemas}} = null;

{{# def.setCompositeRule }}

{{~ $schema:$sch:$i }}
  {{? {{# def.nonEmptySchema:$sch }} }}
    {{
      $it.schema = $sch;
      $it.schemaPath = $schemaPath + '[' + $i + ']';
      $it.errSchemaPath = $errSchemaPath + '/' + $i;
    }}

    {{# def.insertSubschemaCode }}
  {{??}}
    var {{=$nextValid}} = true;
  {{?}}

  {{? $i }}
    if ({{=$nextValid}} && {{=$prevValid}}) {
      {{=$valid}} = false;
      {{=$passingSchemas}} = [{{=$passingSchemas}}, {{=$i}}];
    } else {
    {{ $closingBraces += '}'; }}
  {{?}}

    if ({{=$nextValid}}) {
      {{=$valid}} = {{=$prevValid}} = true;
      {{=$passingSchemas}} = {{=$i}};
    }
{{~}}

{{# def.resetCompositeRule }}

{{= $closingBraces }}

if (!{{=$valid}}) {
  {{# def.extraError:'oneOf' }}
} else {
  {{# def.resetErrors }}
{{? it.opts.allErrors }} } {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{
  var $regexp = $isData
                ? '(new RegExp(' + $schemaValue + '))'
                : it.usePattern($schema);
}}

if ({{# def.$dataNotType:'string' }} !{{=$regexp}}.test({{=$data}}) ) {
  {{# def.error:'pattern' }}
} {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}


{{## def.validateAdditional:
  {{ /* additionalProperties is schema */
    $it.schema = $aProperties;
    $it.schemaPath = it.schemaPath + '.additionalProperties';
    $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';
    $it.errorPath = it.opts._errorDataPathProperty
                    ? it.errorPath
                    : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
    var $passData = $data + '[' + $key + ']';
    $it.dataPathArr[$dataNxt] = $key;
  }}

  {{# def.generateSubschemaCode }}
  {{# def.optimizeValidate }}
#}}


{{
  var $key = 'key' + $lvl
    , $idx = 'idx' + $lvl
    , $dataNxt = $it.dataLevel = it.dataLevel + 1
    , $nextData = 'data' + $dataNxt
    , $dataProperties = 'dataProperties' + $lvl;

  var $schemaKeys = Object.keys($schema || {}).filter(notProto)
    , $pProperties = it.schema.patternProperties || {}
    , $pPropertyKeys = Object.keys($pProperties).filter(notProto)
    , $aProperties = it.schema.additionalProperties
    , $someProperties = $schemaKeys.length || $pPropertyKeys.length
    , $noAdditional = $aProperties === false
    , $additionalIsSchema = typeof $aProperties == 'object'
                              && Object.keys($aProperties).length
    , $removeAdditional = it.opts.removeAdditional
    , $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional
    , $ownProperties = it.opts.ownProperties
    , $currentBaseId = it.baseId;

  var $required = it.schema.required;
  if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) {
    var $requiredHash = it.util.toHash($required);
  }

  function notProto(p) { return p !== '__proto__'; }
}}


var {{=$errs}} = errors;
var {{=$nextValid}} = true;
{{? $ownProperties }}
  var {{=$dataProperties}} = undefined;
{{?}}

{{? $checkAdditional }}
  {{# def.iterateProperties }}
    {{? $someProperties }}
      var isAdditional{{=$lvl}} = !(false
        {{? $schemaKeys.length }}
          {{? $schemaKeys.length > 8 }}
            || validate.schema{{=$schemaPath}}.hasOwnProperty({{=$key}})
          {{??}}
            {{~ $schemaKeys:$propertyKey }}
              || {{=$key}} == {{= it.util.toQuotedString($propertyKey) }}
            {{~}}
          {{?}}
        {{?}}
        {{? $pPropertyKeys.length }}
          {{~ $pPropertyKeys:$pProperty:$i }}
            || {{= it.usePattern($pProperty) }}.test({{=$key}})
          {{~}}
        {{?}}
      );

      if (isAdditional{{=$lvl}}) {
    {{?}}
    {{? $removeAdditional == 'all' }}
      delete {{=$data}}[{{=$key}}];
    {{??}}
      {{
        var $currentErrorPath = it.errorPath;
        var $additionalProperty = '\' + ' + $key + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
        }
      }}
      {{? $noAdditional }}
        {{? $removeAdditional }}
          delete {{=$data}}[{{=$key}}];
        {{??}}
          {{=$nextValid}} = false;
          {{
            var $currErrSchemaPath = $errSchemaPath;
            $errSchemaPath = it.errSchemaPath + '/additionalProperties';
          }}
          {{# def.error:'additionalProperties' }}
          {{ $errSchemaPath = $currErrSchemaPath; }}
          {{? $breakOnError }} break; {{?}}
        {{?}}
      {{?? $additionalIsSchema }}
        {{? $removeAdditional == 'failing' }}
          var {{=$errs}} = errors;
          {{# def.setCompositeRule }}

          {{# def.validateAdditional }}

          if (!{{=$nextValid}}) {
            errors = {{=$errs}};
            if (validate.errors !== null) {
              if (errors) validate.errors.length = errors;
              else validate.errors = null;
            }
            delete {{=$data}}[{{=$key}}];
          }

          {{# def.resetCompositeRule }}
        {{??}}
          {{# def.validateAdditional }}
          {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}}
        {{?}}
      {{?}}
      {{ it.errorPath = $currentErrorPath; }}
    {{?}}
    {{? $someProperties }}
      }
    {{?}}
  }

  {{# def.ifResultValid }}
{{?}}

{{ var $useDefaults = it.opts.useDefaults && !it.compositeRule; }}

{{? $schemaKeys.length }}
  {{~ $schemaKeys:$propertyKey }}
    {{ var $sch = $schema[$propertyKey]; }}

    {{? {{# def.nonEmptySchema:$sch}} }}
      {{
        var $prop = it.util.getProperty($propertyKey)
          , $passData = $data + $prop
          , $hasDefault = $useDefaults && $sch.default !== undefined;
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + $prop;
        $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey);
        $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);
        $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);
      }}

      {{# def.generateSubschemaCode }}

      {{? {{# def.willOptimize }} }}
        {{
          $code = {{# def._optimizeValidate }};
          var $useData = $passData;
        }}
      {{??}}
        {{ var $useData = $nextData; }}
        var {{=$nextData}} = {{=$passData}};
      {{?}}

      {{? $hasDefault }}
        {{= $code }}
      {{??}}
        {{? $requiredHash && $requiredHash[$propertyKey] }}
          if ({{# def.noPropertyInData }}) {
            {{=$nextValid}} = false;
            {{
              var $currentErrorPath = it.errorPath
                , $currErrSchemaPath = $errSchemaPath
                , $missingProperty = it.util.escapeQuotes($propertyKey);
              if (it.opts._errorDataPathProperty) {
                it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
              }
              $errSchemaPath = it.errSchemaPath + '/required';
            }}
            {{# def.error:'required' }}
            {{ $errSchemaPath = $currErrSchemaPath; }}
            {{ it.errorPath = $currentErrorPath; }}
          } else {
        {{??}}
          {{? $breakOnError }}
            if ({{# def.noPropertyInData }}) {
              {{=$nextValid}} = true;
            } else {
          {{??}}
            if ({{=$useData}} !== undefined
              {{? $ownProperties }}
                && {{# def.isOwnProperty }}
              {{?}}
            ) {
          {{?}}
        {{?}}

          {{= $code }}
        }
      {{?}}  {{ /* $hasDefault */ }}
    {{?}} {{ /* def.nonEmptySchema */ }}

    {{# def.ifResultValid }}
  {{~}}
{{?}}

{{? $pPropertyKeys.length }}
  {{~ $pPropertyKeys:$pProperty }}
    {{ var $sch = $pProperties[$pProperty]; }}

    {{? {{# def.nonEmptySchema:$sch}} }}
      {{
        $it.schema = $sch;
        $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty);
        $it.errSchemaPath = it.errSchemaPath + '/patternProperties/'
                                             + it.util.escapeFragment($pProperty);
      }}

      {{# def.iterateProperties }}
        if ({{= it.usePattern($pProperty) }}.test({{=$key}})) {
          {{
            $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
            var $passData = $data + '[' + $key + ']';
            $it.dataPathArr[$dataNxt] = $key;
          }}

          {{# def.generateSubschemaCode }}
          {{# def.optimizeValidate }}

          {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}}
        }
        {{? $breakOnError }} else {{=$nextValid}} = true; {{?}}
      }

      {{# def.ifResultValid }}
    {{?}} {{ /* def.nonEmptySchema */ }}
  {{~}}
{{?}}


{{? $breakOnError }}
  {{= $closingBraces }}
  if ({{=$errs}} == errors) {
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}

var {{=$errs}} = errors;

{{? {{# def.nonEmptySchema:$schema }} }}
  {{
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
  }}

  {{
    var $key = 'key' + $lvl
      , $idx = 'idx' + $lvl
      , $i = 'i' + $lvl
      , $invalidName = '\' + ' + $key + ' + \''
      , $dataNxt = $it.dataLevel = it.dataLevel + 1
      , $nextData = 'data' + $dataNxt
      , $dataProperties = 'dataProperties' + $lvl
      , $ownProperties = it.opts.ownProperties
      , $currentBaseId = it.baseId;
  }}

  {{? $ownProperties }}
    var {{=$dataProperties}} = undefined;
  {{?}}
  {{# def.iterateProperties }}
    var startErrs{{=$lvl}} = errors;

    {{ var $passData = $key; }}
    {{# def.setCompositeRule }}
    {{# def.generateSubschemaCode }}
    {{# def.optimizeValidate }}
    {{# def.resetCompositeRule }}

    if (!{{=$nextValid}}) {
      for (var {{=$i}}=startErrs{{=$lvl}}; {{=$i}}<errors; {{=$i}}++) {
        vErrors[{{=$i}}].propertyName = {{=$key}};
      }
      {{# def.extraError:'propertyNames' }}
      {{? $breakOnError }} break; {{?}}
    }
  }
{{?}}

{{? $breakOnError }}
  {{= $closingBraces }}
  if ({{=$errs}} == errors) {
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}

{{## def._validateRef:_v:
  {{? it.opts.passContext }}
    {{=_v}}.call(this,
  {{??}}
    {{=_v}}(
  {{?}}
    {{=$data}}, {{# def.dataPath }}{{# def.passParentData }}, rootData)
#}}

{{ var $async, $refCode; }}
{{? $schema == '#' || $schema == '#/' }}
  {{
    if (it.isRoot) {
      $async = it.async;
      $refCode = 'validate';
    } else {
      $async = it.root.schema.$async === true;
      $refCode = 'root.refVal[0]';
    }
  }}
{{??}}
  {{ var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot); }}
  {{? $refVal === undefined }}
    {{ var $message = it.MissingRefError.message(it.baseId, $schema); }}
    {{? it.opts.missingRefs == 'fail' }}
      {{ it.logger.error($message); }}
      {{# def.error:'$ref' }}
      {{? $breakOnError }} if (false) { {{?}}
    {{?? it.opts.missingRefs == 'ignore' }}
      {{ it.logger.warn($message); }}
      {{? $breakOnError }} if (true) { {{?}}
    {{??}}
      {{ throw new it.MissingRefError(it.baseId, $schema, $message); }}
    {{?}}
  {{?? $refVal.inline }}
    {{# def.setupNextLevel }}
    {{
      $it.schema = $refVal.schema;
      $it.schemaPath = '';
      $it.errSchemaPath = $schema;
    }}
    {{ var $code = it.validate($it).replace(/validate\.schema/g, $refVal.code); }}
    {{= $code }}
    {{? $breakOnError}}
      if ({{=$nextValid}}) {
    {{?}}
  {{??}}
    {{
      $async = $refVal.$async === true || (it.async && $refVal.$async !== false);
      $refCode = $refVal.code;
    }}
  {{?}}
{{?}}

{{? $refCode }}
  {{# def.beginDefOut}}
    {{# def._validateRef:$refCode }}
  {{# def.storeDefOut:__callValidate }}

  {{? $async }}
    {{ if (!it.async) throw new Error('async schema referenced by sync schema'); }}
    {{? $breakOnError }} var {{=$valid}}; {{?}}
    try {
      await {{=__callValidate}};
      {{? $breakOnError }} {{=$valid}} = true; {{?}}
    } catch (e) {
      if (!(e instanceof ValidationError)) throw e;
      if (vErrors === null) vErrors = e.errors;
      else vErrors = vErrors.concat(e.errors);
      errors = vErrors.length;
      {{? $breakOnError }} {{=$valid}} = false; {{?}}
    }
    {{? $breakOnError }} if ({{=$valid}}) { {{?}}
  {{??}}
    if (!{{=__callValidate}}) {
      if (vErrors === null) vErrors = {{=$refCode}}.errors;
      else vErrors = vErrors.concat({{=$refCode}}.errors);
      errors = vErrors.length;
    } {{? $breakOnError }} else { {{?}}
  {{?}}
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.missing }}
{{# def.setupKeyword }}
{{# def.$data }}

{{ var $vSchema = 'schema' + $lvl; }}

{{## def.setupLoop:
  {{? !$isData }}
    var {{=$vSchema}} = validate.schema{{=$schemaPath}};
  {{?}}

  {{
    var $i = 'i' + $lvl
      , $propertyPath = 'schema' + $lvl + '[' + $i + ']'
      , $missingProperty = '\' + ' + $propertyPath + ' + \'';
    if (it.opts._errorDataPathProperty) {
      it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);
    }
  }}
#}}


{{## def.isRequiredOwnProperty:
  Object.prototype.hasOwnProperty.call({{=$data}}, {{=$vSchema}}[{{=$i}}])
#}}


{{? !$isData }}
  {{? $schema.length < it.opts.loopRequired &&
      it.schema.properties && Object.keys(it.schema.properties).length }}
    {{ var $required = []; }}
    {{~ $schema:$property }}
      {{ var $propertySch = it.schema.properties[$property]; }}
      {{? !($propertySch && {{# def.nonEmptySchema:$propertySch}}) }}
        {{ $required[$required.length] = $property; }}
      {{?}}
    {{~}}
  {{??}}
    {{ var $required = $schema; }}
  {{?}}
{{?}}


{{? $isData || $required.length }}
  {{
    var $currentErrorPath = it.errorPath
      , $loopRequired = $isData || $required.length >= it.opts.loopRequired
      , $ownProperties = it.opts.ownProperties;
  }}

  {{? $breakOnError }}
    var missing{{=$lvl}};
    {{? $loopRequired }}
      {{# def.setupLoop }}
      var {{=$valid}} = true;

      {{?$isData}}{{# def.check$dataIsArray }}{{?}}

      for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) {
        {{=$valid}} = {{=$data}}[{{=$vSchema}}[{{=$i}}]] !== undefined
                      {{? $ownProperties }}
                        && {{# def.isRequiredOwnProperty }}
                      {{?}};
        if (!{{=$valid}}) break;
      }

      {{? $isData }}  }  {{?}}

      {{# def.checkError:'required' }}
      else {
    {{??}}
      if ({{# def.checkMissingProperty:$required }}) {
        {{# def.errorMissingProperty:'required' }}
      } else {
    {{?}}
  {{??}}
    {{? $loopRequired }}
      {{# def.setupLoop }}
      {{? $isData }}
        if ({{=$vSchema}} && !Array.isArray({{=$vSchema}})) {
          {{# def.addError:'required' }}
        } else if ({{=$vSchema}} !== undefined) {
      {{?}}

      for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) {
        if ({{=$data}}[{{=$vSchema}}[{{=$i}}]] === undefined
            {{? $ownProperties }}
              || !{{# def.isRequiredOwnProperty }}
            {{?}}) {
          {{# def.addError:'required' }}
        }
      }

      {{? $isData }}  }  {{?}}
    {{??}}
      {{~ $required:$propertyKey }}
        {{# def.allErrorsMissingProperty:'required' }}
      {{~}}
    {{?}}
  {{?}}

  {{ it.errorPath = $currentErrorPath; }}

{{?? $breakOnError }}
  if (true) {
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}


{{? ($schema || $isData) && it.opts.uniqueItems !== false }}
  {{? $isData }}
    var {{=$valid}};
    if ({{=$schemaValue}} === false || {{=$schemaValue}} === undefined)
      {{=$valid}} = true;
    else if (typeof {{=$schemaValue}} != 'boolean')
      {{=$valid}} = false;
    else {
  {{?}}

  var i = {{=$data}}.length
    , {{=$valid}} = true
    , j;
  if (i > 1) {
    {{
      var $itemType = it.schema.items && it.schema.items.type
        , $typeIsArray = Array.isArray($itemType);
    }}
    {{? !$itemType || $itemType == 'object' || $itemType == 'array' ||
        ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0)) }}
      outer:
      for (;i--;) {
        for (j = i; j--;) {
          if (equal({{=$data}}[i], {{=$data}}[j])) {
            {{=$valid}} = false;
            break outer;
          }
        }
      }
    {{??}}
      var itemIndices = {}, item;
      for (;i--;) {
        var item = {{=$data}}[i];
        {{ var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); }}
        if ({{= it.util[$method]($itemType, 'item', it.opts.strictNumbers, true) }}) continue;
        {{? $typeIsArray}}
          if (typeof item == 'string') item = '"' + item;
        {{?}}
        if (typeof itemIndices[item] == 'number') {
          {{=$valid}} = false;
          j = itemIndices[item];
          break;
        }
        itemIndices[item] = i;
      }
    {{?}}
  }

  {{? $isData }}  }  {{?}}

  if (!{{=$valid}}) {
    {{# def.error:'uniqueItems' }}
  } {{? $breakOnError }} else { {{?}}
{{??}}
  {{? $breakOnError }} if (true) { {{?}}
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.defaults }}
{{# def.coerce }}

{{ /**
    * schema compilation (render) time:
    * it = { schema, RULES, _validate, opts }
    * it.validate - this template function,
    *   it is used recursively to generate code for subschemas
    *
    * runtime:
    * "validate" is a variable name to which this function will be assigned
    * validateRef etc. are defined in the parent scope in index.js
    */ }}

{{
  var $async = it.schema.$async === true
    , $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref')
    , $id = it.self._getId(it.schema);
}}

{{
  if (it.opts.strictKeywords) {
    var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords);
    if ($unknownKwd) {
      var $keywordsMsg = 'unknown keyword: ' + $unknownKwd;
      if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg);
      else throw new Error($keywordsMsg);
    }
  }
}}

{{? it.isTop }}
  var validate = {{?$async}}{{it.async = true;}}async {{?}}function(data, dataPath, parentData, parentDataProperty, rootData) {
    'use strict';
    {{? $id && (it.opts.sourceCode || it.opts.processCode) }}
      {{= '/\*# sourceURL=' + $id + ' */' }}
    {{?}}
{{?}}

{{? typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref) }}
  {{ var $keyword = 'false schema'; }}
  {{# def.setupKeyword }}
  {{? it.schema === false}}
    {{? it.isTop}}
      {{ $breakOnError = true; }}
    {{??}}
      var {{=$valid}} = false;
    {{?}}
    {{# def.error:'false schema' }}
  {{??}}
    {{? it.isTop}}
      {{? $async }}
        return data;
      {{??}}
        validate.errors = null;
        return true;
      {{?}}
    {{??}}
      var {{=$valid}} = true;
    {{?}}
  {{?}}

  {{? it.isTop}}
    };
    return validate;
  {{?}}

  {{ return out; }}
{{?}}


{{? it.isTop }}
  {{
    var $top = it.isTop
      , $lvl = it.level = 0
      , $dataLvl = it.dataLevel = 0
      , $data = 'data';
    it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));
    it.baseId = it.baseId || it.rootId;
    delete it.isTop;

    it.dataPathArr = [""];

    if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) {
      var $defaultMsg = 'default is ignored in the schema root';
      if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
      else throw new Error($defaultMsg);
    }
  }}

  var vErrors = null; {{ /* don't edit, used in replace */ }}
  var errors = 0;     {{ /* don't edit, used in replace */ }}
  if (rootData === undefined) rootData = data; {{ /* don't edit, used in replace */ }}
{{??}}
  {{
    var $lvl = it.level
      , $dataLvl = it.dataLevel
      , $data = 'data' + ($dataLvl || '');

    if ($id) it.baseId = it.resolve.url(it.baseId, $id);

    if ($async && !it.async) throw new Error('async schema in sync schema');
  }}

  var errs_{{=$lvl}} = errors;
{{?}}

{{
  var $valid = 'valid' + $lvl
    , $breakOnError = !it.opts.allErrors
    , $closingBraces1 = ''
    , $closingBraces2 = '';

  var $errorKeyword;
  var $typeSchema = it.schema.type
    , $typeIsArray = Array.isArray($typeSchema);

  if ($typeSchema && it.opts.nullable && it.schema.nullable === true) {
    if ($typeIsArray) {
      if ($typeSchema.indexOf('null') == -1)
        $typeSchema = $typeSchema.concat('null');
    } else if ($typeSchema != 'null') {
      $typeSchema = [$typeSchema, 'null'];
      $typeIsArray = true;
    }
  }

  if ($typeIsArray && $typeSchema.length == 1) {
    $typeSchema = $typeSchema[0];
    $typeIsArray = false;
  }
}}

{{## def.checkType:
  {{
    var $schemaPath = it.schemaPath + '.type'
      , $errSchemaPath = it.errSchemaPath + '/type'
      , $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType';
  }}

  if ({{= it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true) }}) {
#}}

{{? it.schema.$ref && $refKeywords }}
  {{? it.opts.extendRefs == 'fail' }}
    {{ throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); }}
  {{?? it.opts.extendRefs !== true }}
    {{
      $refKeywords = false;
      it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"');
    }}
  {{?}}
{{?}}

{{? it.schema.$comment && it.opts.$comment }}
  {{= it.RULES.all.$comment.code(it, '$comment') }}
{{?}}

{{? $typeSchema }}
  {{? it.opts.coerceTypes }}
    {{ var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); }}
  {{?}}

  {{ var $rulesGroup = it.RULES.types[$typeSchema]; }}
  {{? $coerceToTypes || $typeIsArray || $rulesGroup === true ||
    ($rulesGroup && !$shouldUseGroup($rulesGroup)) }}
    {{
      var $schemaPath = it.schemaPath + '.type'
        , $errSchemaPath = it.errSchemaPath + '/type';
    }}
    {{# def.checkType }}
      {{? $coerceToTypes }}
        {{# def.coerceType }}
      {{??}}
        {{# def.error:'type' }}
      {{?}}
    }
  {{?}}
{{?}}


{{? it.schema.$ref && !$refKeywords }}
  {{= it.RULES.all.$ref.code(it, '$ref') }}
  {{? $breakOnError }}
    }
    if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) {
    {{ $closingBraces2 += '}'; }}
  {{?}}
{{??}}
  {{~ it.RULES:$rulesGroup }}
    {{? $shouldUseGroup($rulesGroup) }}
      {{? $rulesGroup.type }}
        if ({{= it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers) }}) {
      {{?}}
        {{? it.opts.useDefaults }}
          {{? $rulesGroup.type == 'object' && it.schema.properties }}
            {{# def.defaultProperties }}
          {{?? $rulesGroup.type == 'array' && Array.isArray(it.schema.items) }}
            {{# def.defaultItems }}
          {{?}}
        {{?}}
        {{~ $rulesGroup.rules:$rule }}
          {{? $shouldUseRule($rule) }}
            {{ var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); }}
            {{? $code }}
              {{= $code }}
              {{? $breakOnError }}
                {{ $closingBraces1 += '}'; }}
              {{?}}
            {{?}}
          {{?}}
        {{~}}
        {{? $breakOnError }}
          {{= $closingBraces1 }}
          {{ $closingBraces1 = ''; }}
        {{?}}
      {{? $rulesGroup.type }}
        }
        {{? $typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes }}
          else {
            {{
              var $schemaPath = it.schemaPath + '.type'
                , $errSchemaPath = it.errSchemaPath + '/type';
            }}
            {{# def.error:'type' }}
          }
        {{?}}
      {{?}}

      {{? $breakOnError }}
        if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) {
        {{ $closingBraces2 += '}'; }}
      {{?}}
    {{?}}
  {{~}}
{{?}}

{{? $breakOnError }} {{= $closingBraces2 }} {{?}}

{{? $top }}
    {{? $async }}
      if (errors === 0) return data;           {{ /* don't edit, used in replace */ }}
      else throw new ValidationError(vErrors); {{ /* don't edit, used in replace */ }}
    {{??}}
      validate.errors = vErrors; {{ /* don't edit, used in replace */ }}
      return errors === 0;       {{ /* don't edit, used in replace */ }}
    {{?}}
  };

  return validate;
{{??}}
  var {{=$valid}} = errors === errs_{{=$lvl}};
{{?}}

{{
  function $shouldUseGroup($rulesGroup) {
    var rules = $rulesGroup.rules;
    for (var i=0; i < rules.length; i++)
      if ($shouldUseRule(rules[i]))
        return true;
  }

  function $shouldUseRule($rule) {
    return it.schema[$rule.keyword] !== undefined ||
           ($rule.implements && $ruleImplementsSomeKeyword($rule));
  }

  function $ruleImplementsSomeKeyword($rule) {
    var impl = $rule.implements;
    for (var i=0; i < impl.length; i++)
      if (it.schema[impl[i]] !== undefined)
        return true;
  }
}}
'use strict';

var MissingRefError = require('./error_classes').MissingRef;

module.exports = compileAsync;


/**
 * Creates validating function for passed schema with asynchronous loading of missing schemas.
 * `loadSchema` option should be a function that accepts schema uri and returns promise that resolves with the schema.
 * @this  Ajv
 * @param {Object}   schema schema object
 * @param {Boolean}  meta optional true to compile meta-schema; this parameter can be skipped
 * @param {Function} callback an optional node-style callback, it is called with 2 parameters: error (or null) and validating function.
 * @return {Promise} promise that resolves with a validating function.
 */
function compileAsync(schema, meta, callback) {
  /* eslint no-shadow: 0 */
  /* global Promise */
  /* jshint validthis: true */
  var self = this;
  if (typeof this._opts.loadSchema != 'function')
    throw new Error('options.loadSchema should be a function');

  if (typeof meta == 'function') {
    callback = meta;
    meta = undefined;
  }

  var p = loadMetaSchemaOf(schema).then(function () {
    var schemaObj = self._addSchema(schema, undefined, meta);
    return schemaObj.validate || _compileAsync(schemaObj);
  });

  if (callback) {
    p.then(
      function(v) { callback(null, v); },
      callback
    );
  }

  return p;


  function loadMetaSchemaOf(sch) {
    var $schema = sch.$schema;
    return $schema && !self.getSchema($schema)
            ? compileAsync.call(self, { $ref: $schema }, true)
            : Promise.resolve();
  }


  function _compileAsync(schemaObj) {
    try { return self._compile(schemaObj); }
    catch(e) {
      if (e instanceof MissingRefError) return loadMissingSchema(e);
      throw e;
    }


    function loadMissingSchema(e) {
      var ref = e.missingSchema;
      if (added(ref)) throw new Error('Schema ' + ref + ' is loaded but ' + e.missingRef + ' cannot be resolved');

      var schemaPromise = self._loadingSchemas[ref];
      if (!schemaPromise) {
        schemaPromise = self._loadingSchemas[ref] = self._opts.loadSchema(ref);
        schemaPromise.then(removePromise, removePromise);
      }

      return schemaPromise.then(function (sch) {
        if (!added(ref)) {
          return loadMetaSchemaOf(sch).then(function () {
            if (!added(ref)) self.addSchema(sch, ref, undefined, meta);
          });
        }
      }).then(function() {
        return _compileAsync(schemaObj);
      });

      function removePromise() {
        delete self._loadingSchemas[ref];
      }

      function added(ref) {
        return self._refs[ref] || self._schemas[ref];
      }
    }
  }
}
'use strict';

// do NOT remove this file - it would break pre-compiled schemas
// https://github.com/ajv-validator/ajv/issues/889
module.exports = require('fast-deep-equal');
'use strict';

var resolve = require('./resolve');

module.exports = {
  Validation: errorSubclass(ValidationError),
  MissingRef: errorSubclass(MissingRefError)
};


function ValidationError(errors) {
  this.message = 'validation failed';
  this.errors = errors;
  this.ajv = this.validation = true;
}


MissingRefError.message = function (baseId, ref) {
  return 'can\'t resolve reference ' + ref + ' from id ' + baseId;
};


function MissingRefError(baseId, ref, message) {
  this.message = message || MissingRefError.message(baseId, ref);
  this.missingRef = resolve.url(baseId, ref);
  this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef));
}


function errorSubclass(Subclass) {
  Subclass.prototype = Object.create(Error.prototype);
  Subclass.prototype.constructor = Subclass;
  return Subclass;
}
'use strict';

var util = require('./util');

var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/;
var DAYS = [0,31,28,31,30,31,30,31,31,30,31,30,31];
var TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i;
var HOSTNAME = /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i;
var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
var URIREF = /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
// uri-template: https://tools.ietf.org/html/rfc6570
var URITEMPLATE = /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i;
// For the source: https://gist.github.com/dperini/729294
// For test cases: https://mathiasbynens.be/demo/url-regex
// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983.
// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu;
var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i;
var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i;
var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/;
var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i;
var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;


module.exports = formats;

function formats(mode) {
  mode = mode == 'full' ? 'full' : 'fast';
  return util.copy(formats[mode]);
}


formats.fast = {
  // date: http://tools.ietf.org/html/rfc3339#section-5.6
  date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/,
  // date-time: http://tools.ietf.org/html/rfc3339#section-5.6
  time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,
  'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,
  // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js
  uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,
  'uri-reference': /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,
  'uri-template': URITEMPLATE,
  url: URL,
  // email (sources from jsen validator):
  // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363
  // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation')
  email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,
  hostname: HOSTNAME,
  // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html
  ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
  // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses
  ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,
  regex: regex,
  // uuid: http://tools.ietf.org/html/rfc4122
  uuid: UUID,
  // JSON-pointer: https://tools.ietf.org/html/rfc6901
  // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A
  'json-pointer': JSON_POINTER,
  'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,
  // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00
  'relative-json-pointer': RELATIVE_JSON_POINTER
};


formats.full = {
  date: date,
  time: time,
  'date-time': date_time,
  uri: uri,
  'uri-reference': URIREF,
  'uri-template': URITEMPLATE,
  url: URL,
  email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,
  hostname: HOSTNAME,
  ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
  ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,
  regex: regex,
  uuid: UUID,
  'json-pointer': JSON_POINTER,
  'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,
  'relative-json-pointer': RELATIVE_JSON_POINTER
};


function isLeapYear(year) {
  // https://tools.ietf.org/html/rfc3339#appendix-C
  return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
}


function date(str) {
  // full-date from http://tools.ietf.org/html/rfc3339#section-5.6
  var matches = str.match(DATE);
  if (!matches) return false;

  var year = +matches[1];
  var month = +matches[2];
  var day = +matches[3];

  return month >= 1 && month <= 12 && day >= 1 &&
          day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]);
}


function time(str, full) {
  var matches = str.match(TIME);
  if (!matches) return false;

  var hour = matches[1];
  var minute = matches[2];
  var second = matches[3];
  var timeZone = matches[5];
  return ((hour <= 23 && minute <= 59 && second <= 59) ||
          (hour == 23 && minute == 59 && second == 60)) &&
         (!full || timeZone);
}


var DATE_TIME_SEPARATOR = /t|\s/i;
function date_time(str) {
  // http://tools.ietf.org/html/rfc3339#section-5.6
  var dateTime = str.split(DATE_TIME_SEPARATOR);
  return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true);
}


var NOT_URI_FRAGMENT = /\/|:/;
function uri(str) {
  // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "."
  return NOT_URI_FRAGMENT.test(str) && URI.test(str);
}


var Z_ANCHOR = /[^\\]\\Z/;
function regex(str) {
  if (Z_ANCHOR.test(str)) return false;
  try {
    new RegExp(str);
    return true;
  } catch(e) {
    return false;
  }
}
'use strict';

var resolve = require('./resolve')
  , util = require('./util')
  , errorClasses = require('./error_classes')
  , stableStringify = require('fast-json-stable-stringify');

var validateGenerator = require('../dotjs/validate');

/**
 * Functions below are used inside compiled validations function
 */

var ucs2length = util.ucs2length;
var equal = require('fast-deep-equal');

// this error is thrown by async schemas to return validation errors via exception
var ValidationError = errorClasses.Validation;

module.exports = compile;


/**
 * Compiles schema to validation function
 * @this   Ajv
 * @param  {Object} schema schema object
 * @param  {Object} root object with information about the root schema for this schema
 * @param  {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution
 * @param  {String} baseId base ID for IDs in the schema
 * @return {Function} validation function
 */
function compile(schema, root, localRefs, baseId) {
  /* jshint validthis: true, evil: true */
  /* eslint no-shadow: 0 */
  var self = this
    , opts = this._opts
    , refVal = [ undefined ]
    , refs = {}
    , patterns = []
    , patternsHash = {}
    , defaults = []
    , defaultsHash = {}
    , customRules = [];

  root = root || { schema: schema, refVal: refVal, refs: refs };

  var c = checkCompiling.call(this, schema, root, baseId);
  var compilation = this._compilations[c.index];
  if (c.compiling) return (compilation.callValidate = callValidate);

  var formats = this._formats;
  var RULES = this.RULES;

  try {
    var v = localCompile(schema, root, localRefs, baseId);
    compilation.validate = v;
    var cv = compilation.callValidate;
    if (cv) {
      cv.schema = v.schema;
      cv.errors = null;
      cv.refs = v.refs;
      cv.refVal = v.refVal;
      cv.root = v.root;
      cv.$async = v.$async;
      if (opts.sourceCode) cv.source = v.source;
    }
    return v;
  } finally {
    endCompiling.call(this, schema, root, baseId);
  }

  /* @this   {*} - custom context, see passContext option */
  function callValidate() {
    /* jshint validthis: true */
    var validate = compilation.validate;
    var result = validate.apply(this, arguments);
    callValidate.errors = validate.errors;
    return result;
  }

  function localCompile(_schema, _root, localRefs, baseId) {
    var isRoot = !_root || (_root && _root.schema == _schema);
    if (_root.schema != root.schema)
      return compile.call(self, _schema, _root, localRefs, baseId);

    var $async = _schema.$async === true;

    var sourceCode = validateGenerator({
      isTop: true,
      schema: _schema,
      isRoot: isRoot,
      baseId: baseId,
      root: _root,
      schemaPath: '',
      errSchemaPath: '#',
      errorPath: '""',
      MissingRefError: errorClasses.MissingRef,
      RULES: RULES,
      validate: validateGenerator,
      util: util,
      resolve: resolve,
      resolveRef: resolveRef,
      usePattern: usePattern,
      useDefault: useDefault,
      useCustomRule: useCustomRule,
      opts: opts,
      formats: formats,
      logger: self.logger,
      self: self
    });

    sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode)
                   + vars(defaults, defaultCode) + vars(customRules, customRuleCode)
                   + sourceCode;

    if (opts.processCode) sourceCode = opts.processCode(sourceCode, _schema);
    // console.log('\n\n\n *** \n', JSON.stringify(sourceCode));
    var validate;
    try {
      var makeValidate = new Function(
        'self',
        'RULES',
        'formats',
        'root',
        'refVal',
        'defaults',
        'customRules',
        'equal',
        'ucs2length',
        'ValidationError',
        sourceCode
      );

      validate = makeValidate(
        self,
        RULES,
        formats,
        root,
        refVal,
        defaults,
        customRules,
        equal,
        ucs2length,
        ValidationError
      );

      refVal[0] = validate;
    } catch(e) {
      self.logger.error('Error compiling schema, function code:', sourceCode);
      throw e;
    }

    validate.schema = _schema;
    validate.errors = null;
    validate.refs = refs;
    validate.refVal = refVal;
    validate.root = isRoot ? validate : _root;
    if ($async) validate.$async = true;
    if (opts.sourceCode === true) {
      validate.source = {
        code: sourceCode,
        patterns: patterns,
        defaults: defaults
      };
    }

    return validate;
  }

  function resolveRef(baseId, ref, isRoot) {
    ref = resolve.url(baseId, ref);
    var refIndex = refs[ref];
    var _refVal, refCode;
    if (refIndex !== undefined) {
      _refVal = refVal[refIndex];
      refCode = 'refVal[' + refIndex + ']';
      return resolvedRef(_refVal, refCode);
    }
    if (!isRoot && root.refs) {
      var rootRefId = root.refs[ref];
      if (rootRefId !== undefined) {
        _refVal = root.refVal[rootRefId];
        refCode = addLocalRef(ref, _refVal);
        return resolvedRef(_refVal, refCode);
      }
    }

    refCode = addLocalRef(ref);
    var v = resolve.call(self, localCompile, root, ref);
    if (v === undefined) {
      var localSchema = localRefs && localRefs[ref];
      if (localSchema) {
        v = resolve.inlineRef(localSchema, opts.inlineRefs)
            ? localSchema
            : compile.call(self, localSchema, root, localRefs, baseId);
      }
    }

    if (v === undefined) {
      removeLocalRef(ref);
    } else {
      replaceLocalRef(ref, v);
      return resolvedRef(v, refCode);
    }
  }

  function addLocalRef(ref, v) {
    var refId = refVal.length;
    refVal[refId] = v;
    refs[ref] = refId;
    return 'refVal' + refId;
  }

  function removeLocalRef(ref) {
    delete refs[ref];
  }

  function replaceLocalRef(ref, v) {
    var refId = refs[ref];
    refVal[refId] = v;
  }

  function resolvedRef(refVal, code) {
    return typeof refVal == 'object' || typeof refVal == 'boolean'
            ? { code: code, schema: refVal, inline: true }
            : { code: code, $async: refVal && !!refVal.$async };
  }

  function usePattern(regexStr) {
    var index = patternsHash[regexStr];
    if (index === undefined) {
      index = patternsHash[regexStr] = patterns.length;
      patterns[index] = regexStr;
    }
    return 'pattern' + index;
  }

  function useDefault(value) {
    switch (typeof value) {
      case 'boolean':
      case 'number':
        return '' + value;
      case 'string':
        return util.toQuotedString(value);
      case 'object':
        if (value === null) return 'null';
        var valueStr = stableStringify(value);
        var index = defaultsHash[valueStr];
        if (index === undefined) {
          index = defaultsHash[valueStr] = defaults.length;
          defaults[index] = value;
        }
        return 'default' + index;
    }
  }

  function useCustomRule(rule, schema, parentSchema, it) {
    if (self._opts.validateSchema !== false) {
      var deps = rule.definition.dependencies;
      if (deps && !deps.every(function(keyword) {
        return Object.prototype.hasOwnProperty.call(parentSchema, keyword);
      }))
        throw new Error('parent schema must have all required keywords: ' + deps.join(','));

      var validateSchema = rule.definition.validateSchema;
      if (validateSchema) {
        var valid = validateSchema(schema);
        if (!valid) {
          var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors);
          if (self._opts.validateSchema == 'log') self.logger.error(message);
          else throw new Error(message);
        }
      }
    }

    var compile = rule.definition.compile
      , inline = rule.definition.inline
      , macro = rule.definition.macro;

    var validate;
    if (compile) {
      validate = compile.call(self, schema, parentSchema, it);
    } else if (macro) {
      validate = macro.call(self, schema, parentSchema, it);
      if (opts.validateSchema !== false) self.validateSchema(validate, true);
    } else if (inline) {
      validate = inline.call(self, it, rule.keyword, schema, parentSchema);
    } else {
      validate = rule.definition.validate;
      if (!validate) return;
    }

    if (validate === undefined)
      throw new Error('custom keyword "' + rule.keyword + '"failed to compile');

    var index = customRules.length;
    customRules[index] = validate;

    return {
      code: 'customRule' + index,
      validate: validate
    };
  }
}


/**
 * Checks if the schema is currently compiled
 * @this   Ajv
 * @param  {Object} schema schema to compile
 * @param  {Object} root root object
 * @param  {String} baseId base schema ID
 * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean)
 */
function checkCompiling(schema, root, baseId) {
  /* jshint validthis: true */
  var index = compIndex.call(this, schema, root, baseId);
  if (index >= 0) return { index: index, compiling: true };
  index = this._compilations.length;
  this._compilations[index] = {
    schema: schema,
    root: root,
    baseId: baseId
  };
  return { index: index, compiling: false };
}


/**
 * Removes the schema from the currently compiled list
 * @this   Ajv
 * @param  {Object} schema schema to compile
 * @param  {Object} root root object
 * @param  {String} baseId base schema ID
 */
function endCompiling(schema, root, baseId) {
  /* jshint validthis: true */
  var i = compIndex.call(this, schema, root, baseId);
  if (i >= 0) this._compilations.splice(i, 1);
}


/**
 * Index of schema compilation in the currently compiled list
 * @this   Ajv
 * @param  {Object} schema schema to compile
 * @param  {Object} root root object
 * @param  {String} baseId base schema ID
 * @return {Integer} compilation index
 */
function compIndex(schema, root, baseId) {
  /* jshint validthis: true */
  for (var i=0; i<this._compilations.length; i++) {
    var c = this._compilations[i];
    if (c.schema == schema && c.root == root && c.baseId == baseId) return i;
  }
  return -1;
}


function patternCode(i, patterns) {
  return 'var pattern' + i + ' = new RegExp(' + util.toQuotedString(patterns[i]) + ');';
}


function defaultCode(i) {
  return 'var default' + i + ' = defaults[' + i + '];';
}


function refValCode(i, refVal) {
  return refVal[i] === undefined ? '' : 'var refVal' + i + ' = refVal[' + i + '];';
}


function customRuleCode(i) {
  return 'var customRule' + i + ' = customRules[' + i + '];';
}


function vars(arr, statement) {
  if (!arr.length) return '';
  var code = '';
  for (var i=0; i<arr.length; i++)
    code += statement(i, arr);
  return code;
}
'use strict';

var URI = require('uri-js')
  , equal = require('fast-deep-equal')
  , util = require('./util')
  , SchemaObject = require('./schema_obj')
  , traverse = require('json-schema-traverse');

module.exports = resolve;

resolve.normalizeId = normalizeId;
resolve.fullPath = getFullPath;
resolve.url = resolveUrl;
resolve.ids = resolveIds;
resolve.inlineRef = inlineRef;
resolve.schema = resolveSchema;

/**
 * [resolve and compile the references ($ref)]
 * @this   Ajv
 * @param  {Function} compile reference to schema compilation funciton (localCompile)
 * @param  {Object} root object with information about the root schema for the current schema
 * @param  {String} ref reference to resolve
 * @return {Object|Function} schema object (if the schema can be inlined) or validation function
 */
function resolve(compile, root, ref) {
  /* jshint validthis: true */
  var refVal = this._refs[ref];
  if (typeof refVal == 'string') {
    if (this._refs[refVal]) refVal = this._refs[refVal];
    else return resolve.call(this, compile, root, refVal);
  }

  refVal = refVal || this._schemas[ref];
  if (refVal instanceof SchemaObject) {
    return inlineRef(refVal.schema, this._opts.inlineRefs)
            ? refVal.schema
            : refVal.validate || this._compile(refVal);
  }

  var res = resolveSchema.call(this, root, ref);
  var schema, v, baseId;
  if (res) {
    schema = res.schema;
    root = res.root;
    baseId = res.baseId;
  }

  if (schema instanceof SchemaObject) {
    v = schema.validate || compile.call(this, schema.schema, root, undefined, baseId);
  } else if (schema !== undefined) {
    v = inlineRef(schema, this._opts.inlineRefs)
        ? schema
        : compile.call(this, schema, root, undefined, baseId);
  }

  return v;
}


/**
 * Resolve schema, its root and baseId
 * @this Ajv
 * @param  {Object} root root object with properties schema, refVal, refs
 * @param  {String} ref  reference to resolve
 * @return {Object} object with properties schema, root, baseId
 */
function resolveSchema(root, ref) {
  /* jshint validthis: true */
  var p = URI.parse(ref)
    , refPath = _getFullPath(p)
    , baseId = getFullPath(this._getId(root.schema));
  if (Object.keys(root.schema).length === 0 || refPath !== baseId) {
    var id = normalizeId(refPath);
    var refVal = this._refs[id];
    if (typeof refVal == 'string') {
      return resolveRecursive.call(this, root, refVal, p);
    } else if (refVal instanceof SchemaObject) {
      if (!refVal.validate) this._compile(refVal);
      root = refVal;
    } else {
      refVal = this._schemas[id];
      if (refVal instanceof SchemaObject) {
        if (!refVal.validate) this._compile(refVal);
        if (id == normalizeId(ref))
          return { schema: refVal, root: root, baseId: baseId };
        root = refVal;
      } else {
        return;
      }
    }
    if (!root.schema) return;
    baseId = getFullPath(this._getId(root.schema));
  }
  return getJsonPointer.call(this, p, baseId, root.schema, root);
}


/* @this Ajv */
function resolveRecursive(root, ref, parsedRef) {
  /* jshint validthis: true */
  var res = resolveSchema.call(this, root, ref);
  if (res) {
    var schema = res.schema;
    var baseId = res.baseId;
    root = res.root;
    var id = this._getId(schema);
    if (id) baseId = resolveUrl(baseId, id);
    return getJsonPointer.call(this, parsedRef, baseId, schema, root);
  }
}


var PREVENT_SCOPE_CHANGE = util.toHash(['properties', 'patternProperties', 'enum', 'dependencies', 'definitions']);
/* @this Ajv */
function getJsonPointer(parsedRef, baseId, schema, root) {
  /* jshint validthis: true */
  parsedRef.fragment = parsedRef.fragment || '';
  if (parsedRef.fragment.slice(0,1) != '/') return;
  var parts = parsedRef.fragment.split('/');

  for (var i = 1; i < parts.length; i++) {
    var part = parts[i];
    if (part) {
      part = util.unescapeFragment(part);
      schema = schema[part];
      if (schema === undefined) break;
      var id;
      if (!PREVENT_SCOPE_CHANGE[part]) {
        id = this._getId(schema);
        if (id) baseId = resolveUrl(baseId, id);
        if (schema.$ref) {
          var $ref = resolveUrl(baseId, schema.$ref);
          var res = resolveSchema.call(this, root, $ref);
          if (res) {
            schema = res.schema;
            root = res.root;
            baseId = res.baseId;
          }
        }
      }
    }
  }
  if (schema !== undefined && schema !== root.schema)
    return { schema: schema, root: root, baseId: baseId };
}


var SIMPLE_INLINED = util.toHash([
  'type', 'format', 'pattern',
  'maxLength', 'minLength',
  'maxProperties', 'minProperties',
  'maxItems', 'minItems',
  'maximum', 'minimum',
  'uniqueItems', 'multipleOf',
  'required', 'enum'
]);
function inlineRef(schema, limit) {
  if (limit === false) return false;
  if (limit === undefined || limit === true) return checkNoRef(schema);
  else if (limit) return countKeys(schema) <= limit;
}


function checkNoRef(schema) {
  var item;
  if (Array.isArray(schema)) {
    for (var i=0; i<schema.length; i++) {
      item = schema[i];
      if (typeof item == 'object' && !checkNoRef(item)) return false;
    }
  } else {
    for (var key in schema) {
      if (key == '$ref') return false;
      item = schema[key];
      if (typeof item == 'object' && !checkNoRef(item)) return false;
    }
  }
  return true;
}


function countKeys(schema) {
  var count = 0, item;
  if (Array.isArray(schema)) {
    for (var i=0; i<schema.length; i++) {
      item = schema[i];
      if (typeof item == 'object') count += countKeys(item);
      if (count == Infinity) return Infinity;
    }
  } else {
    for (var key in schema) {
      if (key == '$ref') return Infinity;
      if (SIMPLE_INLINED[key]) {
        count++;
      } else {
        item = schema[key];
        if (typeof item == 'object') count += countKeys(item) + 1;
        if (count == Infinity) return Infinity;
      }
    }
  }
  return count;
}


function getFullPath(id, normalize) {
  if (normalize !== false) id = normalizeId(id);
  var p = URI.parse(id);
  return _getFullPath(p);
}


function _getFullPath(p) {
  return URI.serialize(p).split('#')[0] + '#';
}


var TRAILING_SLASH_HASH = /#\/?$/;
function normalizeId(id) {
  return id ? id.replace(TRAILING_SLASH_HASH, '') : '';
}


function resolveUrl(baseId, id) {
  id = normalizeId(id);
  return URI.resolve(baseId, id);
}


/* @this Ajv */
function resolveIds(schema) {
  var schemaId = normalizeId(this._getId(schema));
  var baseIds = {'': schemaId};
  var fullPaths = {'': getFullPath(schemaId, false)};
  var localRefs = {};
  var self = this;

  traverse(schema, {allKeys: true}, function(sch, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {
    if (jsonPtr === '') return;
    var id = self._getId(sch);
    var baseId = baseIds[parentJsonPtr];
    var fullPath = fullPaths[parentJsonPtr] + '/' + parentKeyword;
    if (keyIndex !== undefined)
      fullPath += '/' + (typeof keyIndex == 'number' ? keyIndex : util.escapeFragment(keyIndex));

    if (typeof id == 'string') {
      id = baseId = normalizeId(baseId ? URI.resolve(baseId, id) : id);

      var refVal = self._refs[id];
      if (typeof refVal == 'string') refVal = self._refs[refVal];
      if (refVal && refVal.schema) {
        if (!equal(sch, refVal.schema))
          throw new Error('id "' + id + '" resolves to more than one schema');
      } else if (id != normalizeId(fullPath)) {
        if (id[0] == '#') {
          if (localRefs[id] && !equal(sch, localRefs[id]))
            throw new Error('id "' + id + '" resolves to more than one schema');
          localRefs[id] = sch;
        } else {
          self._refs[id] = fullPath;
        }
      }
    }
    baseIds[jsonPtr] = baseId;
    fullPaths[jsonPtr] = fullPath;
  });

  return localRefs;
}
'use strict';

var ruleModules = require('../dotjs')
  , toHash = require('./util').toHash;

module.exports = function rules() {
  var RULES = [
    { type: 'number',
      rules: [ { 'maximum': ['exclusiveMaximum'] },
               { 'minimum': ['exclusiveMinimum'] }, 'multipleOf', 'format'] },
    { type: 'string',
      rules: [ 'maxLength', 'minLength', 'pattern', 'format' ] },
    { type: 'array',
      rules: [ 'maxItems', 'minItems', 'items', 'contains', 'uniqueItems' ] },
    { type: 'object',
      rules: [ 'maxProperties', 'minProperties', 'required', 'dependencies', 'propertyNames',
               { 'properties': ['additionalProperties', 'patternProperties'] } ] },
    { rules: [ '$ref', 'const', 'enum', 'not', 'anyOf', 'oneOf', 'allOf', 'if' ] }
  ];

  var ALL = [ 'type', '$comment' ];
  var KEYWORDS = [
    '$schema', '$id', 'id', '$data', '$async', 'title',
    'description', 'default', 'definitions',
    'examples', 'readOnly', 'writeOnly',
    'contentMediaType', 'contentEncoding',
    'additionalItems', 'then', 'else'
  ];
  var TYPES = [ 'number', 'integer', 'string', 'array', 'object', 'boolean', 'null' ];
  RULES.all = toHash(ALL);
  RULES.types = toHash(TYPES);

  RULES.forEach(function (group) {
    group.rules = group.rules.map(function (keyword) {
      var implKeywords;
      if (typeof keyword == 'object') {
        var key = Object.keys(keyword)[0];
        implKeywords = keyword[key];
        keyword = key;
        implKeywords.forEach(function (k) {
          ALL.push(k);
          RULES.all[k] = true;
        });
      }
      ALL.push(keyword);
      var rule = RULES.all[keyword] = {
        keyword: keyword,
        code: ruleModules[keyword],
        implements: implKeywords
      };
      return rule;
    });

    RULES.all.$comment = {
      keyword: '$comment',
      code: ruleModules.$comment
    };

    if (group.type) RULES.types[group.type] = group;
  });

  RULES.keywords = toHash(ALL.concat(KEYWORDS));
  RULES.custom = {};

  return RULES;
};
'use strict';

var util = require('./util');

module.exports = SchemaObject;

function SchemaObject(obj) {
  util.copy(obj, this);
}
'use strict';

// https://mathiasbynens.be/notes/javascript-encoding
// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode
module.exports = function ucs2length(str) {
  var length = 0
    , len = str.length
    , pos = 0
    , value;
  while (pos < len) {
    length++;
    value = str.charCodeAt(pos++);
    if (value >= 0xD800 && value <= 0xDBFF && pos < len) {
      // high surrogate, and there is a next character
      value = str.charCodeAt(pos);
      if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate
    }
  }
  return length;
};
'use strict';


module.exports = {
  copy: copy,
  checkDataType: checkDataType,
  checkDataTypes: checkDataTypes,
  coerceToTypes: coerceToTypes,
  toHash: toHash,
  getProperty: getProperty,
  escapeQuotes: escapeQuotes,
  equal: require('fast-deep-equal'),
  ucs2length: require('./ucs2length'),
  varOccurences: varOccurences,
  varReplace: varReplace,
  schemaHasRules: schemaHasRules,
  schemaHasRulesExcept: schemaHasRulesExcept,
  schemaUnknownRules: schemaUnknownRules,
  toQuotedString: toQuotedString,
  getPathExpr: getPathExpr,
  getPath: getPath,
  getData: getData,
  unescapeFragment: unescapeFragment,
  unescapeJsonPointer: unescapeJsonPointer,
  escapeFragment: escapeFragment,
  escapeJsonPointer: escapeJsonPointer
};


function copy(o, to) {
  to = to || {};
  for (var key in o) to[key] = o[key];
  return to;
}


function checkDataType(dataType, data, strictNumbers, negate) {
  var EQUAL = negate ? ' !== ' : ' === '
    , AND = negate ? ' || ' : ' && '
    , OK = negate ? '!' : ''
    , NOT = negate ? '' : '!';
  switch (dataType) {
    case 'null': return data + EQUAL + 'null';
    case 'array': return OK + 'Array.isArray(' + data + ')';
    case 'object': return '(' + OK + data + AND +
                          'typeof ' + data + EQUAL + '"object"' + AND +
                          NOT + 'Array.isArray(' + data + '))';
    case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND +
                           NOT + '(' + data + ' % 1)' +
                           AND + data + EQUAL + data +
                           (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';
    case 'number': return '(typeof ' + data + EQUAL + '"' + dataType + '"' +
                          (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';
    default: return 'typeof ' + data + EQUAL + '"' + dataType + '"';
  }
}


function checkDataTypes(dataTypes, data, strictNumbers) {
  switch (dataTypes.length) {
    case 1: return checkDataType(dataTypes[0], data, strictNumbers, true);
    default:
      var code = '';
      var types = toHash(dataTypes);
      if (types.array && types.object) {
        code = types.null ? '(': '(!' + data + ' || ';
        code += 'typeof ' + data + ' !== "object")';
        delete types.null;
        delete types.array;
        delete types.object;
      }
      if (types.number) delete types.integer;
      for (var t in types)
        code += (code ? ' && ' : '' ) + checkDataType(t, data, strictNumbers, true);

      return code;
  }
}


var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]);
function coerceToTypes(optionCoerceTypes, dataTypes) {
  if (Array.isArray(dataTypes)) {
    var types = [];
    for (var i=0; i<dataTypes.length; i++) {
      var t = dataTypes[i];
      if (COERCE_TO_TYPES[t]) types[types.length] = t;
      else if (optionCoerceTypes === 'array' && t === 'array') types[types.length] = t;
    }
    if (types.length) return types;
  } else if (COERCE_TO_TYPES[dataTypes]) {
    return [dataTypes];
  } else if (optionCoerceTypes === 'array' && dataTypes === 'array') {
    return ['array'];
  }
}


function toHash(arr) {
  var hash = {};
  for (var i=0; i<arr.length; i++) hash[arr[i]] = true;
  return hash;
}


var IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i;
var SINGLE_QUOTE = /'|\\/g;
function getProperty(key) {
  return typeof key == 'number'
          ? '[' + key + ']'
          : IDENTIFIER.test(key)
            ? '.' + key
            : "['" + escapeQuotes(key) + "']";
}


function escapeQuotes(str) {
  return str.replace(SINGLE_QUOTE, '\\$&')
            .replace(/\n/g, '\\n')
            .replace(/\r/g, '\\r')
            .replace(/\f/g, '\\f')
            .replace(/\t/g, '\\t');
}


function varOccurences(str, dataVar) {
  dataVar += '[^0-9]';
  var matches = str.match(new RegExp(dataVar, 'g'));
  return matches ? matches.length : 0;
}


function varReplace(str, dataVar, expr) {
  dataVar += '([^0-9])';
  expr = expr.replace(/\$/g, '$$$$');
  return str.replace(new RegExp(dataVar, 'g'), expr + '$1');
}


function schemaHasRules(schema, rules) {
  if (typeof schema == 'boolean') return !schema;
  for (var key in schema) if (rules[key]) return true;
}


function schemaHasRulesExcept(schema, rules, exceptKeyword) {
  if (typeof schema == 'boolean') return !schema && exceptKeyword != 'not';
  for (var key in schema) if (key != exceptKeyword && rules[key]) return true;
}


function schemaUnknownRules(schema, rules) {
  if (typeof schema == 'boolean') return;
  for (var key in schema) if (!rules[key]) return key;
}


function toQuotedString(str) {
  return '\'' + escapeQuotes(str) + '\'';
}


function getPathExpr(currentPath, expr, jsonPointers, isNumber) {
  var path = jsonPointers // false by default
              ? '\'/\' + ' + expr + (isNumber ? '' : '.replace(/~/g, \'~0\').replace(/\\//g, \'~1\')')
              : (isNumber ? '\'[\' + ' + expr + ' + \']\'' : '\'[\\\'\' + ' + expr + ' + \'\\\']\'');
  return joinPaths(currentPath, path);
}


function getPath(currentPath, prop, jsonPointers) {
  var path = jsonPointers // false by default
              ? toQuotedString('/' + escapeJsonPointer(prop))
              : toQuotedString(getProperty(prop));
  return joinPaths(currentPath, path);
}


var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/;
var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;
function getData($data, lvl, paths) {
  var up, jsonPointer, data, matches;
  if ($data === '') return 'rootData';
  if ($data[0] == '/') {
    if (!JSON_POINTER.test($data)) throw new Error('Invalid JSON-pointer: ' + $data);
    jsonPointer = $data;
    data = 'rootData';
  } else {
    matches = $data.match(RELATIVE_JSON_POINTER);
    if (!matches) throw new Error('Invalid JSON-pointer: ' + $data);
    up = +matches[1];
    jsonPointer = matches[2];
    if (jsonPointer == '#') {
      if (up >= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);
      return paths[lvl - up];
    }

    if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);
    data = 'data' + ((lvl - up) || '');
    if (!jsonPointer) return data;
  }

  var expr = data;
  var segments = jsonPointer.split('/');
  for (var i=0; i<segments.length; i++) {
    var segment = segments[i];
    if (segment) {
      data += getProperty(unescapeJsonPointer(segment));
      expr += ' && ' + data;
    }
  }
  return expr;
}


function joinPaths (a, b) {
  if (a == '""') return b;
  return (a + ' + ' + b).replace(/([^\\])' \+ '/g, '$1');
}


function unescapeFragment(str) {
  return unescapeJsonPointer(decodeURIComponent(str));
}


function escapeFragment(str) {
  return encodeURIComponent(escapeJsonPointer(str));
}


function escapeJsonPointer(str) {
  return str.replace(/~/g, '~0').replace(/\//g, '~1');
}


function unescapeJsonPointer(str) {
  return str.replace(/~1/g, '/').replace(/~0/g, '~');
}
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Ajv = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
'use strict';


var Cache = module.exports = function Cache() {
  this._cache = {};
};


Cache.prototype.put = function Cache_put(key, value) {
  this._cache[key] = value;
};


Cache.prototype.get = function Cache_get(key) {
  return this._cache[key];
};


Cache.prototype.del = function Cache_del(key) {
  delete this._cache[key];
};


Cache.prototype.clear = function Cache_clear() {
  this._cache = {};
};

},{}],2:[function(require,module,exports){
'use strict';

var MissingRefError = require('./error_classes').MissingRef;

module.exports = compileAsync;


/**
 * Creates validating function for passed schema with asynchronous loading of missing schemas.
 * `loadSchema` option should be a function that accepts schema uri and returns promise that resolves with the schema.
 * @this  Ajv
 * @param {Object}   schema schema object
 * @param {Boolean}  meta optional true to compile meta-schema; this parameter can be skipped
 * @param {Function} callback an optional node-style callback, it is called with 2 parameters: error (or null) and validating function.
 * @return {Promise} promise that resolves with a validating function.
 */
function compileAsync(schema, meta, callback) {
  /* eslint no-shadow: 0 */
  /* global Promise */
  /* jshint validthis: true */
  var self = this;
  if (typeof this._opts.loadSchema != 'function')
    throw new Error('options.loadSchema should be a function');

  if (typeof meta == 'function') {
    callback = meta;
    meta = undefined;
  }

  var p = loadMetaSchemaOf(schema).then(function () {
    var schemaObj = self._addSchema(schema, undefined, meta);
    return schemaObj.validate || _compileAsync(schemaObj);
  });

  if (callback) {
    p.then(
      function(v) { callback(null, v); },
      callback
    );
  }

  return p;


  function loadMetaSchemaOf(sch) {
    var $schema = sch.$schema;
    return $schema && !self.getSchema($schema)
            ? compileAsync.call(self, { $ref: $schema }, true)
            : Promise.resolve();
  }


  function _compileAsync(schemaObj) {
    try { return self._compile(schemaObj); }
    catch(e) {
      if (e instanceof MissingRefError) return loadMissingSchema(e);
      throw e;
    }


    function loadMissingSchema(e) {
      var ref = e.missingSchema;
      if (added(ref)) throw new Error('Schema ' + ref + ' is loaded but ' + e.missingRef + ' cannot be resolved');

      var schemaPromise = self._loadingSchemas[ref];
      if (!schemaPromise) {
        schemaPromise = self._loadingSchemas[ref] = self._opts.loadSchema(ref);
        schemaPromise.then(removePromise, removePromise);
      }

      return schemaPromise.then(function (sch) {
        if (!added(ref)) {
          return loadMetaSchemaOf(sch).then(function () {
            if (!added(ref)) self.addSchema(sch, ref, undefined, meta);
          });
        }
      }).then(function() {
        return _compileAsync(schemaObj);
      });

      function removePromise() {
        delete self._loadingSchemas[ref];
      }

      function added(ref) {
        return self._refs[ref] || self._schemas[ref];
      }
    }
  }
}

},{"./error_classes":3}],3:[function(require,module,exports){
'use strict';

var resolve = require('./resolve');

module.exports = {
  Validation: errorSubclass(ValidationError),
  MissingRef: errorSubclass(MissingRefError)
};


function ValidationError(errors) {
  this.message = 'validation failed';
  this.errors = errors;
  this.ajv = this.validation = true;
}


MissingRefError.message = function (baseId, ref) {
  return 'can\'t resolve reference ' + ref + ' from id ' + baseId;
};


function MissingRefError(baseId, ref, message) {
  this.message = message || MissingRefError.message(baseId, ref);
  this.missingRef = resolve.url(baseId, ref);
  this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef));
}


function errorSubclass(Subclass) {
  Subclass.prototype = Object.create(Error.prototype);
  Subclass.prototype.constructor = Subclass;
  return Subclass;
}

},{"./resolve":6}],4:[function(require,module,exports){
'use strict';

var util = require('./util');

var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/;
var DAYS = [0,31,28,31,30,31,30,31,31,30,31,30,31];
var TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i;
var HOSTNAME = /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i;
var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
var URIREF = /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
// uri-template: https://tools.ietf.org/html/rfc6570
var URITEMPLATE = /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i;
// For the source: https://gist.github.com/dperini/729294
// For test cases: https://mathiasbynens.be/demo/url-regex
// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983.
// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu;
var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i;
var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i;
var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/;
var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i;
var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;


module.exports = formats;

function formats(mode) {
  mode = mode == 'full' ? 'full' : 'fast';
  return util.copy(formats[mode]);
}


formats.fast = {
  // date: http://tools.ietf.org/html/rfc3339#section-5.6
  date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/,
  // date-time: http://tools.ietf.org/html/rfc3339#section-5.6
  time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,
  'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,
  // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js
  uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,
  'uri-reference': /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,
  'uri-template': URITEMPLATE,
  url: URL,
  // email (sources from jsen validator):
  // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363
  // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation')
  email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,
  hostname: HOSTNAME,
  // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html
  ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
  // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses
  ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,
  regex: regex,
  // uuid: http://tools.ietf.org/html/rfc4122
  uuid: UUID,
  // JSON-pointer: https://tools.ietf.org/html/rfc6901
  // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A
  'json-pointer': JSON_POINTER,
  'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,
  // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00
  'relative-json-pointer': RELATIVE_JSON_POINTER
};


formats.full = {
  date: date,
  time: time,
  'date-time': date_time,
  uri: uri,
  'uri-reference': URIREF,
  'uri-template': URITEMPLATE,
  url: URL,
  email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,
  hostname: HOSTNAME,
  ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
  ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,
  regex: regex,
  uuid: UUID,
  'json-pointer': JSON_POINTER,
  'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,
  'relative-json-pointer': RELATIVE_JSON_POINTER
};


function isLeapYear(year) {
  // https://tools.ietf.org/html/rfc3339#appendix-C
  return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
}


function date(str) {
  // full-date from http://tools.ietf.org/html/rfc3339#section-5.6
  var matches = str.match(DATE);
  if (!matches) return false;

  var year = +matches[1];
  var month = +matches[2];
  var day = +matches[3];

  return month >= 1 && month <= 12 && day >= 1 &&
          day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]);
}


function time(str, full) {
  var matches = str.match(TIME);
  if (!matches) return false;

  var hour = matches[1];
  var minute = matches[2];
  var second = matches[3];
  var timeZone = matches[5];
  return ((hour <= 23 && minute <= 59 && second <= 59) ||
          (hour == 23 && minute == 59 && second == 60)) &&
         (!full || timeZone);
}


var DATE_TIME_SEPARATOR = /t|\s/i;
function date_time(str) {
  // http://tools.ietf.org/html/rfc3339#section-5.6
  var dateTime = str.split(DATE_TIME_SEPARATOR);
  return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true);
}


var NOT_URI_FRAGMENT = /\/|:/;
function uri(str) {
  // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "."
  return NOT_URI_FRAGMENT.test(str) && URI.test(str);
}


var Z_ANCHOR = /[^\\]\\Z/;
function regex(str) {
  if (Z_ANCHOR.test(str)) return false;
  try {
    new RegExp(str);
    return true;
  } catch(e) {
    return false;
  }
}

},{"./util":10}],5:[function(require,module,exports){
'use strict';

var resolve = require('./resolve')
  , util = require('./util')
  , errorClasses = require('./error_classes')
  , stableStringify = require('fast-json-stable-stringify');

var validateGenerator = require('../dotjs/validate');

/**
 * Functions below are used inside compiled validations function
 */

var ucs2length = util.ucs2length;
var equal = require('fast-deep-equal');

// this error is thrown by async schemas to return validation errors via exception
var ValidationError = errorClasses.Validation;

module.exports = compile;


/**
 * Compiles schema to validation function
 * @this   Ajv
 * @param  {Object} schema schema object
 * @param  {Object} root object with information about the root schema for this schema
 * @param  {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution
 * @param  {String} baseId base ID for IDs in the schema
 * @return {Function} validation function
 */
function compile(schema, root, localRefs, baseId) {
  /* jshint validthis: true, evil: true */
  /* eslint no-shadow: 0 */
  var self = this
    , opts = this._opts
    , refVal = [ undefined ]
    , refs = {}
    , patterns = []
    , patternsHash = {}
    , defaults = []
    , defaultsHash = {}
    , customRules = [];

  root = root || { schema: schema, refVal: refVal, refs: refs };

  var c = checkCompiling.call(this, schema, root, baseId);
  var compilation = this._compilations[c.index];
  if (c.compiling) return (compilation.callValidate = callValidate);

  var formats = this._formats;
  var RULES = this.RULES;

  try {
    var v = localCompile(schema, root, localRefs, baseId);
    compilation.validate = v;
    var cv = compilation.callValidate;
    if (cv) {
      cv.schema = v.schema;
      cv.errors = null;
      cv.refs = v.refs;
      cv.refVal = v.refVal;
      cv.root = v.root;
      cv.$async = v.$async;
      if (opts.sourceCode) cv.source = v.source;
    }
    return v;
  } finally {
    endCompiling.call(this, schema, root, baseId);
  }

  /* @this   {*} - custom context, see passContext option */
  function callValidate() {
    /* jshint validthis: true */
    var validate = compilation.validate;
    var result = validate.apply(this, arguments);
    callValidate.errors = validate.errors;
    return result;
  }

  function localCompile(_schema, _root, localRefs, baseId) {
    var isRoot = !_root || (_root && _root.schema == _schema);
    if (_root.schema != root.schema)
      return compile.call(self, _schema, _root, localRefs, baseId);

    var $async = _schema.$async === true;

    var sourceCode = validateGenerator({
      isTop: true,
      schema: _schema,
      isRoot: isRoot,
      baseId: baseId,
      root: _root,
      schemaPath: '',
      errSchemaPath: '#',
      errorPath: '""',
      MissingRefError: errorClasses.MissingRef,
      RULES: RULES,
      validate: validateGenerator,
      util: util,
      resolve: resolve,
      resolveRef: resolveRef,
      usePattern: usePattern,
      useDefault: useDefault,
      useCustomRule: useCustomRule,
      opts: opts,
      formats: formats,
      logger: self.logger,
      self: self
    });

    sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode)
                   + vars(defaults, defaultCode) + vars(customRules, customRuleCode)
                   + sourceCode;

    if (opts.processCode) sourceCode = opts.processCode(sourceCode, _schema);
    // console.log('\n\n\n *** \n', JSON.stringify(sourceCode));
    var validate;
    try {
      var makeValidate = new Function(
        'self',
        'RULES',
        'formats',
        'root',
        'refVal',
        'defaults',
        'customRules',
        'equal',
        'ucs2length',
        'ValidationError',
        sourceCode
      );

      validate = makeValidate(
        self,
        RULES,
        formats,
        root,
        refVal,
        defaults,
        customRules,
        equal,
        ucs2length,
        ValidationError
      );

      refVal[0] = validate;
    } catch(e) {
      self.logger.error('Error compiling schema, function code:', sourceCode);
      throw e;
    }

    validate.schema = _schema;
    validate.errors = null;
    validate.refs = refs;
    validate.refVal = refVal;
    validate.root = isRoot ? validate : _root;
    if ($async) validate.$async = true;
    if (opts.sourceCode === true) {
      validate.source = {
        code: sourceCode,
        patterns: patterns,
        defaults: defaults
      };
    }

    return validate;
  }

  function resolveRef(baseId, ref, isRoot) {
    ref = resolve.url(baseId, ref);
    var refIndex = refs[ref];
    var _refVal, refCode;
    if (refIndex !== undefined) {
      _refVal = refVal[refIndex];
      refCode = 'refVal[' + refIndex + ']';
      return resolvedRef(_refVal, refCode);
    }
    if (!isRoot && root.refs) {
      var rootRefId = root.refs[ref];
      if (rootRefId !== undefined) {
        _refVal = root.refVal[rootRefId];
        refCode = addLocalRef(ref, _refVal);
        return resolvedRef(_refVal, refCode);
      }
    }

    refCode = addLocalRef(ref);
    var v = resolve.call(self, localCompile, root, ref);
    if (v === undefined) {
      var localSchema = localRefs && localRefs[ref];
      if (localSchema) {
        v = resolve.inlineRef(localSchema, opts.inlineRefs)
            ? localSchema
            : compile.call(self, localSchema, root, localRefs, baseId);
      }
    }

    if (v === undefined) {
      removeLocalRef(ref);
    } else {
      replaceLocalRef(ref, v);
      return resolvedRef(v, refCode);
    }
  }

  function addLocalRef(ref, v) {
    var refId = refVal.length;
    refVal[refId] = v;
    refs[ref] = refId;
    return 'refVal' + refId;
  }

  function removeLocalRef(ref) {
    delete refs[ref];
  }

  function replaceLocalRef(ref, v) {
    var refId = refs[ref];
    refVal[refId] = v;
  }

  function resolvedRef(refVal, code) {
    return typeof refVal == 'object' || typeof refVal == 'boolean'
            ? { code: code, schema: refVal, inline: true }
            : { code: code, $async: refVal && !!refVal.$async };
  }

  function usePattern(regexStr) {
    var index = patternsHash[regexStr];
    if (index === undefined) {
      index = patternsHash[regexStr] = patterns.length;
      patterns[index] = regexStr;
    }
    return 'pattern' + index;
  }

  function useDefault(value) {
    switch (typeof value) {
      case 'boolean':
      case 'number':
        return '' + value;
      case 'string':
        return util.toQuotedString(value);
      case 'object':
        if (value === null) return 'null';
        var valueStr = stableStringify(value);
        var index = defaultsHash[valueStr];
        if (index === undefined) {
          index = defaultsHash[valueStr] = defaults.length;
          defaults[index] = value;
        }
        return 'default' + index;
    }
  }

  function useCustomRule(rule, schema, parentSchema, it) {
    if (self._opts.validateSchema !== false) {
      var deps = rule.definition.dependencies;
      if (deps && !deps.every(function(keyword) {
        return Object.prototype.hasOwnProperty.call(parentSchema, keyword);
      }))
        throw new Error('parent schema must have all required keywords: ' + deps.join(','));

      var validateSchema = rule.definition.validateSchema;
      if (validateSchema) {
        var valid = validateSchema(schema);
        if (!valid) {
          var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors);
          if (self._opts.validateSchema == 'log') self.logger.error(message);
          else throw new Error(message);
        }
      }
    }

    var compile = rule.definition.compile
      , inline = rule.definition.inline
      , macro = rule.definition.macro;

    var validate;
    if (compile) {
      validate = compile.call(self, schema, parentSchema, it);
    } else if (macro) {
      validate = macro.call(self, schema, parentSchema, it);
      if (opts.validateSchema !== false) self.validateSchema(validate, true);
    } else if (inline) {
      validate = inline.call(self, it, rule.keyword, schema, parentSchema);
    } else {
      validate = rule.definition.validate;
      if (!validate) return;
    }

    if (validate === undefined)
      throw new Error('custom keyword "' + rule.keyword + '"failed to compile');

    var index = customRules.length;
    customRules[index] = validate;

    return {
      code: 'customRule' + index,
      validate: validate
    };
  }
}


/**
 * Checks if the schema is currently compiled
 * @this   Ajv
 * @param  {Object} schema schema to compile
 * @param  {Object} root root object
 * @param  {String} baseId base schema ID
 * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean)
 */
function checkCompiling(schema, root, baseId) {
  /* jshint validthis: true */
  var index = compIndex.call(this, schema, root, baseId);
  if (index >= 0) return { index: index, compiling: true };
  index = this._compilations.length;
  this._compilations[index] = {
    schema: schema,
    root: root,
    baseId: baseId
  };
  return { index: index, compiling: false };
}


/**
 * Removes the schema from the currently compiled list
 * @this   Ajv
 * @param  {Object} schema schema to compile
 * @param  {Object} root root object
 * @param  {String} baseId base schema ID
 */
function endCompiling(schema, root, baseId) {
  /* jshint validthis: true */
  var i = compIndex.call(this, schema, root, baseId);
  if (i >= 0) this._compilations.splice(i, 1);
}


/**
 * Index of schema compilation in the currently compiled list
 * @this   Ajv
 * @param  {Object} schema schema to compile
 * @param  {Object} root root object
 * @param  {String} baseId base schema ID
 * @return {Integer} compilation index
 */
function compIndex(schema, root, baseId) {
  /* jshint validthis: true */
  for (var i=0; i<this._compilations.length; i++) {
    var c = this._compilations[i];
    if (c.schema == schema && c.root == root && c.baseId == baseId) return i;
  }
  return -1;
}


function patternCode(i, patterns) {
  return 'var pattern' + i + ' = new RegExp(' + util.toQuotedString(patterns[i]) + ');';
}


function defaultCode(i) {
  return 'var default' + i + ' = defaults[' + i + '];';
}


function refValCode(i, refVal) {
  return refVal[i] === undefined ? '' : 'var refVal' + i + ' = refVal[' + i + '];';
}


function customRuleCode(i) {
  return 'var customRule' + i + ' = customRules[' + i + '];';
}


function vars(arr, statement) {
  if (!arr.length) return '';
  var code = '';
  for (var i=0; i<arr.length; i++)
    code += statement(i, arr);
  return code;
}

},{"../dotjs/validate":38,"./error_classes":3,"./resolve":6,"./util":10,"fast-deep-equal":42,"fast-json-stable-stringify":43}],6:[function(require,module,exports){
'use strict';

var URI = require('uri-js')
  , equal = require('fast-deep-equal')
  , util = require('./util')
  , SchemaObject = require('./schema_obj')
  , traverse = require('json-schema-traverse');

module.exports = resolve;

resolve.normalizeId = normalizeId;
resolve.fullPath = getFullPath;
resolve.url = resolveUrl;
resolve.ids = resolveIds;
resolve.inlineRef = inlineRef;
resolve.schema = resolveSchema;

/**
 * [resolve and compile the references ($ref)]
 * @this   Ajv
 * @param  {Function} compile reference to schema compilation funciton (localCompile)
 * @param  {Object} root object with information about the root schema for the current schema
 * @param  {String} ref reference to resolve
 * @return {Object|Function} schema object (if the schema can be inlined) or validation function
 */
function resolve(compile, root, ref) {
  /* jshint validthis: true */
  var refVal = this._refs[ref];
  if (typeof refVal == 'string') {
    if (this._refs[refVal]) refVal = this._refs[refVal];
    else return resolve.call(this, compile, root, refVal);
  }

  refVal = refVal || this._schemas[ref];
  if (refVal instanceof SchemaObject) {
    return inlineRef(refVal.schema, this._opts.inlineRefs)
            ? refVal.schema
            : refVal.validate || this._compile(refVal);
  }

  var res = resolveSchema.call(this, root, ref);
  var schema, v, baseId;
  if (res) {
    schema = res.schema;
    root = res.root;
    baseId = res.baseId;
  }

  if (schema instanceof SchemaObject) {
    v = schema.validate || compile.call(this, schema.schema, root, undefined, baseId);
  } else if (schema !== undefined) {
    v = inlineRef(schema, this._opts.inlineRefs)
        ? schema
        : compile.call(this, schema, root, undefined, baseId);
  }

  return v;
}


/**
 * Resolve schema, its root and baseId
 * @this Ajv
 * @param  {Object} root root object with properties schema, refVal, refs
 * @param  {String} ref  reference to resolve
 * @return {Object} object with properties schema, root, baseId
 */
function resolveSchema(root, ref) {
  /* jshint validthis: true */
  var p = URI.parse(ref)
    , refPath = _getFullPath(p)
    , baseId = getFullPath(this._getId(root.schema));
  if (Object.keys(root.schema).length === 0 || refPath !== baseId) {
    var id = normalizeId(refPath);
    var refVal = this._refs[id];
    if (typeof refVal == 'string') {
      return resolveRecursive.call(this, root, refVal, p);
    } else if (refVal instanceof SchemaObject) {
      if (!refVal.validate) this._compile(refVal);
      root = refVal;
    } else {
      refVal = this._schemas[id];
      if (refVal instanceof SchemaObject) {
        if (!refVal.validate) this._compile(refVal);
        if (id == normalizeId(ref))
          return { schema: refVal, root: root, baseId: baseId };
        root = refVal;
      } else {
        return;
      }
    }
    if (!root.schema) return;
    baseId = getFullPath(this._getId(root.schema));
  }
  return getJsonPointer.call(this, p, baseId, root.schema, root);
}


/* @this Ajv */
function resolveRecursive(root, ref, parsedRef) {
  /* jshint validthis: true */
  var res = resolveSchema.call(this, root, ref);
  if (res) {
    var schema = res.schema;
    var baseId = res.baseId;
    root = res.root;
    var id = this._getId(schema);
    if (id) baseId = resolveUrl(baseId, id);
    return getJsonPointer.call(this, parsedRef, baseId, schema, root);
  }
}


var PREVENT_SCOPE_CHANGE = util.toHash(['properties', 'patternProperties', 'enum', 'dependencies', 'definitions']);
/* @this Ajv */
function getJsonPointer(parsedRef, baseId, schema, root) {
  /* jshint validthis: true */
  parsedRef.fragment = parsedRef.fragment || '';
  if (parsedRef.fragment.slice(0,1) != '/') return;
  var parts = parsedRef.fragment.split('/');

  for (var i = 1; i < parts.length; i++) {
    var part = parts[i];
    if (part) {
      part = util.unescapeFragment(part);
      schema = schema[part];
      if (schema === undefined) break;
      var id;
      if (!PREVENT_SCOPE_CHANGE[part]) {
        id = this._getId(schema);
        if (id) baseId = resolveUrl(baseId, id);
        if (schema.$ref) {
          var $ref = resolveUrl(baseId, schema.$ref);
          var res = resolveSchema.call(this, root, $ref);
          if (res) {
            schema = res.schema;
            root = res.root;
            baseId = res.baseId;
          }
        }
      }
    }
  }
  if (schema !== undefined && schema !== root.schema)
    return { schema: schema, root: root, baseId: baseId };
}


var SIMPLE_INLINED = util.toHash([
  'type', 'format', 'pattern',
  'maxLength', 'minLength',
  'maxProperties', 'minProperties',
  'maxItems', 'minItems',
  'maximum', 'minimum',
  'uniqueItems', 'multipleOf',
  'required', 'enum'
]);
function inlineRef(schema, limit) {
  if (limit === false) return false;
  if (limit === undefined || limit === true) return checkNoRef(schema);
  else if (limit) return countKeys(schema) <= limit;
}


function checkNoRef(schema) {
  var item;
  if (Array.isArray(schema)) {
    for (var i=0; i<schema.length; i++) {
      item = schema[i];
      if (typeof item == 'object' && !checkNoRef(item)) return false;
    }
  } else {
    for (var key in schema) {
      if (key == '$ref') return false;
      item = schema[key];
      if (typeof item == 'object' && !checkNoRef(item)) return false;
    }
  }
  return true;
}


function countKeys(schema) {
  var count = 0, item;
  if (Array.isArray(schema)) {
    for (var i=0; i<schema.length; i++) {
      item = schema[i];
      if (typeof item == 'object') count += countKeys(item);
      if (count == Infinity) return Infinity;
    }
  } else {
    for (var key in schema) {
      if (key == '$ref') return Infinity;
      if (SIMPLE_INLINED[key]) {
        count++;
      } else {
        item = schema[key];
        if (typeof item == 'object') count += countKeys(item) + 1;
        if (count == Infinity) return Infinity;
      }
    }
  }
  return count;
}


function getFullPath(id, normalize) {
  if (normalize !== false) id = normalizeId(id);
  var p = URI.parse(id);
  return _getFullPath(p);
}


function _getFullPath(p) {
  return URI.serialize(p).split('#')[0] + '#';
}


var TRAILING_SLASH_HASH = /#\/?$/;
function normalizeId(id) {
  return id ? id.replace(TRAILING_SLASH_HASH, '') : '';
}


function resolveUrl(baseId, id) {
  id = normalizeId(id);
  return URI.resolve(baseId, id);
}


/* @this Ajv */
function resolveIds(schema) {
  var schemaId = normalizeId(this._getId(schema));
  var baseIds = {'': schemaId};
  var fullPaths = {'': getFullPath(schemaId, false)};
  var localRefs = {};
  var self = this;

  traverse(schema, {allKeys: true}, function(sch, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {
    if (jsonPtr === '') return;
    var id = self._getId(sch);
    var baseId = baseIds[parentJsonPtr];
    var fullPath = fullPaths[parentJsonPtr] + '/' + parentKeyword;
    if (keyIndex !== undefined)
      fullPath += '/' + (typeof keyIndex == 'number' ? keyIndex : util.escapeFragment(keyIndex));

    if (typeof id == 'string') {
      id = baseId = normalizeId(baseId ? URI.resolve(baseId, id) : id);

      var refVal = self._refs[id];
      if (typeof refVal == 'string') refVal = self._refs[refVal];
      if (refVal && refVal.schema) {
        if (!equal(sch, refVal.schema))
          throw new Error('id "' + id + '" resolves to more than one schema');
      } else if (id != normalizeId(fullPath)) {
        if (id[0] == '#') {
          if (localRefs[id] && !equal(sch, localRefs[id]))
            throw new Error('id "' + id + '" resolves to more than one schema');
          localRefs[id] = sch;
        } else {
          self._refs[id] = fullPath;
        }
      }
    }
    baseIds[jsonPtr] = baseId;
    fullPaths[jsonPtr] = fullPath;
  });

  return localRefs;
}

},{"./schema_obj":8,"./util":10,"fast-deep-equal":42,"json-schema-traverse":44,"uri-js":45}],7:[function(require,module,exports){
'use strict';

var ruleModules = require('../dotjs')
  , toHash = require('./util').toHash;

module.exports = function rules() {
  var RULES = [
    { type: 'number',
      rules: [ { 'maximum': ['exclusiveMaximum'] },
               { 'minimum': ['exclusiveMinimum'] }, 'multipleOf', 'format'] },
    { type: 'string',
      rules: [ 'maxLength', 'minLength', 'pattern', 'format' ] },
    { type: 'array',
      rules: [ 'maxItems', 'minItems', 'items', 'contains', 'uniqueItems' ] },
    { type: 'object',
      rules: [ 'maxProperties', 'minProperties', 'required', 'dependencies', 'propertyNames',
               { 'properties': ['additionalProperties', 'patternProperties'] } ] },
    { rules: [ '$ref', 'const', 'enum', 'not', 'anyOf', 'oneOf', 'allOf', 'if' ] }
  ];

  var ALL = [ 'type', '$comment' ];
  var KEYWORDS = [
    '$schema', '$id', 'id', '$data', '$async', 'title',
    'description', 'default', 'definitions',
    'examples', 'readOnly', 'writeOnly',
    'contentMediaType', 'contentEncoding',
    'additionalItems', 'then', 'else'
  ];
  var TYPES = [ 'number', 'integer', 'string', 'array', 'object', 'boolean', 'null' ];
  RULES.all = toHash(ALL);
  RULES.types = toHash(TYPES);

  RULES.forEach(function (group) {
    group.rules = group.rules.map(function (keyword) {
      var implKeywords;
      if (typeof keyword == 'object') {
        var key = Object.keys(keyword)[0];
        implKeywords = keyword[key];
        keyword = key;
        implKeywords.forEach(function (k) {
          ALL.push(k);
          RULES.all[k] = true;
        });
      }
      ALL.push(keyword);
      var rule = RULES.all[keyword] = {
        keyword: keyword,
        code: ruleModules[keyword],
        implements: implKeywords
      };
      return rule;
    });

    RULES.all.$comment = {
      keyword: '$comment',
      code: ruleModules.$comment
    };

    if (group.type) RULES.types[group.type] = group;
  });

  RULES.keywords = toHash(ALL.concat(KEYWORDS));
  RULES.custom = {};

  return RULES;
};

},{"../dotjs":27,"./util":10}],8:[function(require,module,exports){
'use strict';

var util = require('./util');

module.exports = SchemaObject;

function SchemaObject(obj) {
  util.copy(obj, this);
}

},{"./util":10}],9:[function(require,module,exports){
'use strict';

// https://mathiasbynens.be/notes/javascript-encoding
// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode
module.exports = function ucs2length(str) {
  var length = 0
    , len = str.length
    , pos = 0
    , value;
  while (pos < len) {
    length++;
    value = str.charCodeAt(pos++);
    if (value >= 0xD800 && value <= 0xDBFF && pos < len) {
      // high surrogate, and there is a next character
      value = str.charCodeAt(pos);
      if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate
    }
  }
  return length;
};

},{}],10:[function(require,module,exports){
'use strict';


module.exports = {
  copy: copy,
  checkDataType: checkDataType,
  checkDataTypes: checkDataTypes,
  coerceToTypes: coerceToTypes,
  toHash: toHash,
  getProperty: getProperty,
  escapeQuotes: escapeQuotes,
  equal: require('fast-deep-equal'),
  ucs2length: require('./ucs2length'),
  varOccurences: varOccurences,
  varReplace: varReplace,
  schemaHasRules: schemaHasRules,
  schemaHasRulesExcept: schemaHasRulesExcept,
  schemaUnknownRules: schemaUnknownRules,
  toQuotedString: toQuotedString,
  getPathExpr: getPathExpr,
  getPath: getPath,
  getData: getData,
  unescapeFragment: unescapeFragment,
  unescapeJsonPointer: unescapeJsonPointer,
  escapeFragment: escapeFragment,
  escapeJsonPointer: escapeJsonPointer
};


function copy(o, to) {
  to = to || {};
  for (var key in o) to[key] = o[key];
  return to;
}


function checkDataType(dataType, data, strictNumbers, negate) {
  var EQUAL = negate ? ' !== ' : ' === '
    , AND = negate ? ' || ' : ' && '
    , OK = negate ? '!' : ''
    , NOT = negate ? '' : '!';
  switch (dataType) {
    case 'null': return data + EQUAL + 'null';
    case 'array': return OK + 'Array.isArray(' + data + ')';
    case 'object': return '(' + OK + data + AND +
                          'typeof ' + data + EQUAL + '"object"' + AND +
                          NOT + 'Array.isArray(' + data + '))';
    case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND +
                           NOT + '(' + data + ' % 1)' +
                           AND + data + EQUAL + data +
                           (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';
    case 'number': return '(typeof ' + data + EQUAL + '"' + dataType + '"' +
                          (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';
    default: return 'typeof ' + data + EQUAL + '"' + dataType + '"';
  }
}


function checkDataTypes(dataTypes, data, strictNumbers) {
  switch (dataTypes.length) {
    case 1: return checkDataType(dataTypes[0], data, strictNumbers, true);
    default:
      var code = '';
      var types = toHash(dataTypes);
      if (types.array && types.object) {
        code = types.null ? '(': '(!' + data + ' || ';
        code += 'typeof ' + data + ' !== "object")';
        delete types.null;
        delete types.array;
        delete types.object;
      }
      if (types.number) delete types.integer;
      for (var t in types)
        code += (code ? ' && ' : '' ) + checkDataType(t, data, strictNumbers, true);

      return code;
  }
}


var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]);
function coerceToTypes(optionCoerceTypes, dataTypes) {
  if (Array.isArray(dataTypes)) {
    var types = [];
    for (var i=0; i<dataTypes.length; i++) {
      var t = dataTypes[i];
      if (COERCE_TO_TYPES[t]) types[types.length] = t;
      else if (optionCoerceTypes === 'array' && t === 'array') types[types.length] = t;
    }
    if (types.length) return types;
  } else if (COERCE_TO_TYPES[dataTypes]) {
    return [dataTypes];
  } else if (optionCoerceTypes === 'array' && dataTypes === 'array') {
    return ['array'];
  }
}


function toHash(arr) {
  var hash = {};
  for (var i=0; i<arr.length; i++) hash[arr[i]] = true;
  return hash;
}


var IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i;
var SINGLE_QUOTE = /'|\\/g;
function getProperty(key) {
  return typeof key == 'number'
          ? '[' + key + ']'
          : IDENTIFIER.test(key)
            ? '.' + key
            : "['" + escapeQuotes(key) + "']";
}


function escapeQuotes(str) {
  return str.replace(SINGLE_QUOTE, '\\$&')
            .replace(/\n/g, '\\n')
            .replace(/\r/g, '\\r')
            .replace(/\f/g, '\\f')
            .replace(/\t/g, '\\t');
}


function varOccurences(str, dataVar) {
  dataVar += '[^0-9]';
  var matches = str.match(new RegExp(dataVar, 'g'));
  return matches ? matches.length : 0;
}


function varReplace(str, dataVar, expr) {
  dataVar += '([^0-9])';
  expr = expr.replace(/\$/g, '$$$$');
  return str.replace(new RegExp(dataVar, 'g'), expr + '$1');
}


function schemaHasRules(schema, rules) {
  if (typeof schema == 'boolean') return !schema;
  for (var key in schema) if (rules[key]) return true;
}


function schemaHasRulesExcept(schema, rules, exceptKeyword) {
  if (typeof schema == 'boolean') return !schema && exceptKeyword != 'not';
  for (var key in schema) if (key != exceptKeyword && rules[key]) return true;
}


function schemaUnknownRules(schema, rules) {
  if (typeof schema == 'boolean') return;
  for (var key in schema) if (!rules[key]) return key;
}


function toQuotedString(str) {
  return '\'' + escapeQuotes(str) + '\'';
}


function getPathExpr(currentPath, expr, jsonPointers, isNumber) {
  var path = jsonPointers // false by default
              ? '\'/\' + ' + expr + (isNumber ? '' : '.replace(/~/g, \'~0\').replace(/\\//g, \'~1\')')
              : (isNumber ? '\'[\' + ' + expr + ' + \']\'' : '\'[\\\'\' + ' + expr + ' + \'\\\']\'');
  return joinPaths(currentPath, path);
}


function getPath(currentPath, prop, jsonPointers) {
  var path = jsonPointers // false by default
              ? toQuotedString('/' + escapeJsonPointer(prop))
              : toQuotedString(getProperty(prop));
  return joinPaths(currentPath, path);
}


var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/;
var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;
function getData($data, lvl, paths) {
  var up, jsonPointer, data, matches;
  if ($data === '') return 'rootData';
  if ($data[0] == '/') {
    if (!JSON_POINTER.test($data)) throw new Error('Invalid JSON-pointer: ' + $data);
    jsonPointer = $data;
    data = 'rootData';
  } else {
    matches = $data.match(RELATIVE_JSON_POINTER);
    if (!matches) throw new Error('Invalid JSON-pointer: ' + $data);
    up = +matches[1];
    jsonPointer = matches[2];
    if (jsonPointer == '#') {
      if (up >= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);
      return paths[lvl - up];
    }

    if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);
    data = 'data' + ((lvl - up) || '');
    if (!jsonPointer) return data;
  }

  var expr = data;
  var segments = jsonPointer.split('/');
  for (var i=0; i<segments.length; i++) {
    var segment = segments[i];
    if (segment) {
      data += getProperty(unescapeJsonPointer(segment));
      expr += ' && ' + data;
    }
  }
  return expr;
}


function joinPaths (a, b) {
  if (a == '""') return b;
  return (a + ' + ' + b).replace(/([^\\])' \+ '/g, '$1');
}


function unescapeFragment(str) {
  return unescapeJsonPointer(decodeURIComponent(str));
}


function escapeFragment(str) {
  return encodeURIComponent(escapeJsonPointer(str));
}


function escapeJsonPointer(str) {
  return str.replace(/~/g, '~0').replace(/\//g, '~1');
}


function unescapeJsonPointer(str) {
  return str.replace(/~1/g, '/').replace(/~0/g, '~');
}

},{"./ucs2length":9,"fast-deep-equal":42}],11:[function(require,module,exports){
'use strict';

var KEYWORDS = [
  'multipleOf',
  'maximum',
  'exclusiveMaximum',
  'minimum',
  'exclusiveMinimum',
  'maxLength',
  'minLength',
  'pattern',
  'additionalItems',
  'maxItems',
  'minItems',
  'uniqueItems',
  'maxProperties',
  'minProperties',
  'required',
  'additionalProperties',
  'enum',
  'format',
  'const'
];

module.exports = function (metaSchema, keywordsJsonPointers) {
  for (var i=0; i<keywordsJsonPointers.length; i++) {
    metaSchema = JSON.parse(JSON.stringify(metaSchema));
    var segments = keywordsJsonPointers[i].split('/');
    var keywords = metaSchema;
    var j;
    for (j=1; j<segments.length; j++)
      keywords = keywords[segments[j]];

    for (j=0; j<KEYWORDS.length; j++) {
      var key = KEYWORDS[j];
      var schema = keywords[key];
      if (schema) {
        keywords[key] = {
          anyOf: [
            schema,
            { $ref: 'https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#' }
          ]
        };
      }
    }
  }

  return metaSchema;
};

},{}],12:[function(require,module,exports){
'use strict';

var metaSchema = require('./refs/json-schema-draft-07.json');

module.exports = {
  $id: 'https://github.com/ajv-validator/ajv/blob/master/lib/definition_schema.js',
  definitions: {
    simpleTypes: metaSchema.definitions.simpleTypes
  },
  type: 'object',
  dependencies: {
    schema: ['validate'],
    $data: ['validate'],
    statements: ['inline'],
    valid: {not: {required: ['macro']}}
  },
  properties: {
    type: metaSchema.properties.type,
    schema: {type: 'boolean'},
    statements: {type: 'boolean'},
    dependencies: {
      type: 'array',
      items: {type: 'string'}
    },
    metaSchema: {type: 'object'},
    modifying: {type: 'boolean'},
    valid: {type: 'boolean'},
    $data: {type: 'boolean'},
    async: {type: 'boolean'},
    errors: {
      anyOf: [
        {type: 'boolean'},
        {const: 'full'}
      ]
    }
  }
};

},{"./refs/json-schema-draft-07.json":41}],13:[function(require,module,exports){
'use strict';
module.exports = function generate__limit(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $isMax = $keyword == 'maximum',
    $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum',
    $schemaExcl = it.schema[$exclusiveKeyword],
    $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data,
    $op = $isMax ? '<' : '>',
    $notOp = $isMax ? '>' : '<',
    $errorKeyword = undefined;
  if (!($isData || typeof $schema == 'number' || $schema === undefined)) {
    throw new Error($keyword + ' must be number');
  }
  if (!($isDataExcl || $schemaExcl === undefined || typeof $schemaExcl == 'number' || typeof $schemaExcl == 'boolean')) {
    throw new Error($exclusiveKeyword + ' must be number or boolean');
  }
  if ($isDataExcl) {
    var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),
      $exclusive = 'exclusive' + $lvl,
      $exclType = 'exclType' + $lvl,
      $exclIsNumber = 'exclIsNumber' + $lvl,
      $opExpr = 'op' + $lvl,
      $opStr = '\' + ' + $opExpr + ' + \'';
    out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';
    $schemaValueExcl = 'schemaExcl' + $lvl;
    out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { ';
    var $errorKeyword = $exclusiveKeyword;
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' } else if ( ';
    if ($isData) {
      out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
    }
    out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; ';
    if ($schema === undefined) {
      $errorKeyword = $exclusiveKeyword;
      $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
      $schemaValue = $schemaValueExcl;
      $isData = $isDataExcl;
    }
  } else {
    var $exclIsNumber = typeof $schemaExcl == 'number',
      $opStr = $op;
    if ($exclIsNumber && $isData) {
      var $opExpr = '\'' + $opStr + '\'';
      out += ' if ( ';
      if ($isData) {
        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
      }
      out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { ';
    } else {
      if ($exclIsNumber && $schema === undefined) {
        $exclusive = true;
        $errorKeyword = $exclusiveKeyword;
        $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
        $schemaValue = $schemaExcl;
        $notOp += '=';
      } else {
        if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema);
        if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {
          $exclusive = true;
          $errorKeyword = $exclusiveKeyword;
          $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
          $notOp += '=';
        } else {
          $exclusive = false;
          $opStr += '=';
        }
      }
      var $opExpr = '\'' + $opStr + '\'';
      out += ' if ( ';
      if ($isData) {
        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
      }
      out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { ';
    }
  }
  $errorKeyword = $errorKeyword || $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be ' + ($opStr) + ' ';
      if ($isData) {
        out += '\' + ' + ($schemaValue);
      } else {
        out += '' + ($schemaValue) + '\'';
      }
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' } ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],14:[function(require,module,exports){
'use strict';
module.exports = function generate__limitItems(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  var $op = $keyword == 'maxItems' ? '>' : '<';
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
  }
  out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should NOT have ';
      if ($keyword == 'maxItems') {
        out += 'more';
      } else {
        out += 'fewer';
      }
      out += ' than ';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + ($schema);
      }
      out += ' items\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],15:[function(require,module,exports){
'use strict';
module.exports = function generate__limitLength(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  var $op = $keyword == 'maxLength' ? '>' : '<';
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
  }
  if (it.opts.unicode === false) {
    out += ' ' + ($data) + '.length ';
  } else {
    out += ' ucs2length(' + ($data) + ') ';
  }
  out += ' ' + ($op) + ' ' + ($schemaValue) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should NOT be ';
      if ($keyword == 'maxLength') {
        out += 'longer';
      } else {
        out += 'shorter';
      }
      out += ' than ';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + ($schema);
      }
      out += ' characters\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],16:[function(require,module,exports){
'use strict';
module.exports = function generate__limitProperties(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  var $op = $keyword == 'maxProperties' ? '>' : '<';
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
  }
  out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should NOT have ';
      if ($keyword == 'maxProperties') {
        out += 'more';
      } else {
        out += 'fewer';
      }
      out += ' than ';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + ($schema);
      }
      out += ' properties\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],17:[function(require,module,exports){
'use strict';
module.exports = function generate_allOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $currentBaseId = $it.baseId,
    $allSchemasEmpty = true;
  var arr1 = $schema;
  if (arr1) {
    var $sch, $i = -1,
      l1 = arr1.length - 1;
    while ($i < l1) {
      $sch = arr1[$i += 1];
      if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
        $allSchemasEmpty = false;
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + '[' + $i + ']';
        $it.errSchemaPath = $errSchemaPath + '/' + $i;
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
        if ($breakOnError) {
          out += ' if (' + ($nextValid) + ') { ';
          $closingBraces += '}';
        }
      }
    }
  }
  if ($breakOnError) {
    if ($allSchemasEmpty) {
      out += ' if (true) { ';
    } else {
      out += ' ' + ($closingBraces.slice(0, -1)) + ' ';
    }
  }
  return out;
}

},{}],18:[function(require,module,exports){
'use strict';
module.exports = function generate_anyOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $noEmptySchema = $schema.every(function($sch) {
    return (it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all));
  });
  if ($noEmptySchema) {
    var $currentBaseId = $it.baseId;
    out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false;  ';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    var arr1 = $schema;
    if (arr1) {
      var $sch, $i = -1,
        l1 = arr1.length - 1;
      while ($i < l1) {
        $sch = arr1[$i += 1];
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + '[' + $i + ']';
        $it.errSchemaPath = $errSchemaPath + '/' + $i;
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
        out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { ';
        $closingBraces += '}';
      }
    }
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should match some schema in anyOf\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError(vErrors); ';
      } else {
        out += ' validate.errors = vErrors; return false; ';
      }
    }
    out += ' } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
    if (it.opts.allErrors) {
      out += ' } ';
    }
  } else {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  }
  return out;
}

},{}],19:[function(require,module,exports){
'use strict';
module.exports = function generate_comment(it, $keyword, $ruleType) {
  var out = ' ';
  var $schema = it.schema[$keyword];
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $comment = it.util.toQuotedString($schema);
  if (it.opts.$comment === true) {
    out += ' console.log(' + ($comment) + ');';
  } else if (typeof it.opts.$comment == 'function') {
    out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);';
  }
  return out;
}

},{}],20:[function(require,module,exports){
'use strict';
module.exports = function generate_const(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!$isData) {
    out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';';
  }
  out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be equal to constant\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' }';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],21:[function(require,module,exports){
'use strict';
module.exports = function generate_contains(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $idx = 'i' + $lvl,
    $dataNxt = $it.dataLevel = it.dataLevel + 1,
    $nextData = 'data' + $dataNxt,
    $currentBaseId = it.baseId,
    $nonEmptySchema = (it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all));
  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
  if ($nonEmptySchema) {
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';
    $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
    var $passData = $data + '[' + $idx + ']';
    $it.dataPathArr[$dataNxt] = $idx;
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
    if (it.util.varOccurences($code, $nextData) < 2) {
      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
    } else {
      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
    }
    out += ' if (' + ($nextValid) + ') break; }  ';
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {';
  } else {
    out += ' if (' + ($data) + '.length == 0) {';
  }
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should contain a valid item\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' } else { ';
  if ($nonEmptySchema) {
    out += '  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
  }
  if (it.opts.allErrors) {
    out += ' } ';
  }
  return out;
}

},{}],22:[function(require,module,exports){
'use strict';
module.exports = function generate_custom(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $rule = this,
    $definition = 'definition' + $lvl,
    $rDef = $rule.definition,
    $closingBraces = '';
  var $compile, $inline, $macro, $ruleValidate, $validateCode;
  if ($isData && $rDef.$data) {
    $validateCode = 'keywordValidate' + $lvl;
    var $validateSchema = $rDef.validateSchema;
    out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;';
  } else {
    $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it);
    if (!$ruleValidate) return;
    $schemaValue = 'validate.schema' + $schemaPath;
    $validateCode = $ruleValidate.code;
    $compile = $rDef.compile;
    $inline = $rDef.inline;
    $macro = $rDef.macro;
  }
  var $ruleErrs = $validateCode + '.errors',
    $i = 'i' + $lvl,
    $ruleErr = 'ruleErr' + $lvl,
    $asyncKeyword = $rDef.async;
  if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema');
  if (!($inline || $macro)) {
    out += '' + ($ruleErrs) + ' = null;';
  }
  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
  if ($isData && $rDef.$data) {
    $closingBraces += '}';
    out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { ';
    if ($validateSchema) {
      $closingBraces += '}';
      out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { ';
    }
  }
  if ($inline) {
    if ($rDef.statements) {
      out += ' ' + ($ruleValidate.validate) + ' ';
    } else {
      out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; ';
    }
  } else if ($macro) {
    var $it = it.util.copy(it);
    var $closingBraces = '';
    $it.level++;
    var $nextValid = 'valid' + $it.level;
    $it.schema = $ruleValidate.validate;
    $it.schemaPath = '';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    var $code = it.validate($it).replace(/validate\.schema/g, $validateCode);
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' ' + ($code);
  } else {
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
    out += '  ' + ($validateCode) + '.call( ';
    if (it.opts.passContext) {
      out += 'this';
    } else {
      out += 'self';
    }
    if ($compile || $rDef.schema === false) {
      out += ' , ' + ($data) + ' ';
    } else {
      out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' ';
    }
    out += ' , (dataPath || \'\')';
    if (it.errorPath != '""') {
      out += ' + ' + (it.errorPath);
    }
    var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',
      $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
    out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData )  ';
    var def_callRuleValidate = out;
    out = $$outStack.pop();
    if ($rDef.errors === false) {
      out += ' ' + ($valid) + ' = ';
      if ($asyncKeyword) {
        out += 'await ';
      }
      out += '' + (def_callRuleValidate) + '; ';
    } else {
      if ($asyncKeyword) {
        $ruleErrs = 'customErrors' + $lvl;
        out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } ';
      } else {
        out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; ';
      }
    }
  }
  if ($rDef.modifying) {
    out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];';
  }
  out += '' + ($closingBraces);
  if ($rDef.valid) {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  } else {
    out += ' if ( ';
    if ($rDef.valid === undefined) {
      out += ' !';
      if ($macro) {
        out += '' + ($nextValid);
      } else {
        out += '' + ($valid);
      }
    } else {
      out += ' ' + (!$rDef.valid) + ' ';
    }
    out += ') { ';
    $errorKeyword = $rule.keyword;
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    var def_customError = out;
    out = $$outStack.pop();
    if ($inline) {
      if ($rDef.errors) {
        if ($rDef.errors != 'full') {
          out += '  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + '; if (' + ($ruleErr) + '.schemaPath === undefined) { ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '"; } ';
          if (it.opts.verbose) {
            out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
          }
          out += ' } ';
        }
      } else {
        if ($rDef.errors === false) {
          out += ' ' + (def_customError) + ' ';
        } else {
          out += ' if (' + ($errs) + ' == errors) { ' + (def_customError) + ' } else {  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + '; if (' + ($ruleErr) + '.schemaPath === undefined) { ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '"; } ';
          if (it.opts.verbose) {
            out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
          }
          out += ' } } ';
        }
      }
    } else if ($macro) {
      out += '   var err =   '; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } ';
        if (it.opts.messages !== false) {
          out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
      if (!it.compositeRule && $breakOnError) {
        /* istanbul ignore if */
        if (it.async) {
          out += ' throw new ValidationError(vErrors); ';
        } else {
          out += ' validate.errors = vErrors; return false; ';
        }
      }
    } else {
      if ($rDef.errors === false) {
        out += ' ' + (def_customError) + ' ';
      } else {
        out += ' if (Array.isArray(' + ($ruleErrs) + ')) { if (vErrors === null) vErrors = ' + ($ruleErrs) + '; else vErrors = vErrors.concat(' + ($ruleErrs) + '); errors = vErrors.length;  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + ';  ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '";  ';
        if (it.opts.verbose) {
          out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
        }
        out += ' } } else { ' + (def_customError) + ' } ';
      }
    }
    out += ' } ';
    if ($breakOnError) {
      out += ' else { ';
    }
  }
  return out;
}

},{}],23:[function(require,module,exports){
'use strict';
module.exports = function generate_dependencies(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $schemaDeps = {},
    $propertyDeps = {},
    $ownProperties = it.opts.ownProperties;
  for ($property in $schema) {
    if ($property == '__proto__') continue;
    var $sch = $schema[$property];
    var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;
    $deps[$property] = $sch;
  }
  out += 'var ' + ($errs) + ' = errors;';
  var $currentErrorPath = it.errorPath;
  out += 'var missing' + ($lvl) + ';';
  for (var $property in $propertyDeps) {
    $deps = $propertyDeps[$property];
    if ($deps.length) {
      out += ' if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';
      if ($ownProperties) {
        out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') ';
      }
      if ($breakOnError) {
        out += ' && ( ';
        var arr1 = $deps;
        if (arr1) {
          var $propertyKey, $i = -1,
            l1 = arr1.length - 1;
          while ($i < l1) {
            $propertyKey = arr1[$i += 1];
            if ($i) {
              out += ' || ';
            }
            var $prop = it.util.getProperty($propertyKey),
              $useData = $data + $prop;
            out += ' ( ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';
          }
        }
        out += ')) {  ';
        var $propertyPath = 'missing' + $lvl,
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;
        }
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'should have ';
            if ($deps.length == 1) {
              out += 'property ' + (it.util.escapeQuotes($deps[0]));
            } else {
              out += 'properties ' + (it.util.escapeQuotes($deps.join(", ")));
            }
            out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
      } else {
        out += ' ) { ';
        var arr2 = $deps;
        if (arr2) {
          var $propertyKey, i2 = -1,
            l2 = arr2.length - 1;
          while (i2 < l2) {
            $propertyKey = arr2[i2 += 1];
            var $prop = it.util.getProperty($propertyKey),
              $missingProperty = it.util.escapeQuotes($propertyKey),
              $useData = $data + $prop;
            if (it.opts._errorDataPathProperty) {
              it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
            }
            out += ' if ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') {  var err =   '; /* istanbul ignore else */
            if (it.createErrors !== false) {
              out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } ';
              if (it.opts.messages !== false) {
                out += ' , message: \'should have ';
                if ($deps.length == 1) {
                  out += 'property ' + (it.util.escapeQuotes($deps[0]));
                } else {
                  out += 'properties ' + (it.util.escapeQuotes($deps.join(", ")));
                }
                out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' ';
              }
              if (it.opts.verbose) {
                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
              }
              out += ' } ';
            } else {
              out += ' {} ';
            }
            out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';
          }
        }
      }
      out += ' }   ';
      if ($breakOnError) {
        $closingBraces += '}';
        out += ' else { ';
      }
    }
  }
  it.errorPath = $currentErrorPath;
  var $currentBaseId = $it.baseId;
  for (var $property in $schemaDeps) {
    var $sch = $schemaDeps[$property];
    if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
      out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';
      if ($ownProperties) {
        out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') ';
      }
      out += ') { ';
      $it.schema = $sch;
      $it.schemaPath = $schemaPath + it.util.getProperty($property);
      $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);
      out += '  ' + (it.validate($it)) + ' ';
      $it.baseId = $currentBaseId;
      out += ' }  ';
      if ($breakOnError) {
        out += ' if (' + ($nextValid) + ') { ';
        $closingBraces += '}';
      }
    }
  }
  if ($breakOnError) {
    out += '   ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}

},{}],24:[function(require,module,exports){
'use strict';
module.exports = function generate_enum(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $i = 'i' + $lvl,
    $vSchema = 'schema' + $lvl;
  if (!$isData) {
    out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';';
  }
  out += 'var ' + ($valid) + ';';
  if ($isData) {
    out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';
  }
  out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }';
  if ($isData) {
    out += '  }  ';
  }
  out += ' if (!' + ($valid) + ') {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('enum') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be equal to one of the allowed values\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' }';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],25:[function(require,module,exports){
'use strict';
module.exports = function generate_format(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  if (it.opts.format === false) {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
    return out;
  }
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $unknownFormats = it.opts.unknownFormats,
    $allowUnknown = Array.isArray($unknownFormats);
  if ($isData) {
    var $format = 'format' + $lvl,
      $isObject = 'isObject' + $lvl,
      $formatType = 'formatType' + $lvl;
    out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \'string\'; if (' + ($isObject) + ') { ';
    if (it.async) {
      out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; ';
    }
    out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if (  ';
    if ($isData) {
      out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || ';
    }
    out += ' (';
    if ($unknownFormats != 'ignore') {
      out += ' (' + ($schemaValue) + ' && !' + ($format) + ' ';
      if ($allowUnknown) {
        out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 ';
      }
      out += ') || ';
    }
    out += ' (' + ($format) + ' && ' + ($formatType) + ' == \'' + ($ruleType) + '\' && !(typeof ' + ($format) + ' == \'function\' ? ';
    if (it.async) {
      out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) ';
    } else {
      out += ' ' + ($format) + '(' + ($data) + ') ';
    }
    out += ' : ' + ($format) + '.test(' + ($data) + '))))) {';
  } else {
    var $format = it.formats[$schema];
    if (!$format) {
      if ($unknownFormats == 'ignore') {
        it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"');
        if ($breakOnError) {
          out += ' if (true) { ';
        }
        return out;
      } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) {
        if ($breakOnError) {
          out += ' if (true) { ';
        }
        return out;
      } else {
        throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"');
      }
    }
    var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate;
    var $formatType = $isObject && $format.type || 'string';
    if ($isObject) {
      var $async = $format.async === true;
      $format = $format.validate;
    }
    if ($formatType != $ruleType) {
      if ($breakOnError) {
        out += ' if (true) { ';
      }
      return out;
    }
    if ($async) {
      if (!it.async) throw new Error('async format in sync schema');
      var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate';
      out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { ';
    } else {
      out += ' if (! ';
      var $formatRef = 'formats' + it.util.getProperty($schema);
      if ($isObject) $formatRef += '.validate';
      if (typeof $format == 'function') {
        out += ' ' + ($formatRef) + '(' + ($data) + ') ';
      } else {
        out += ' ' + ($formatRef) + '.test(' + ($data) + ') ';
      }
      out += ') { ';
    }
  }
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format:  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += '  } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should match format "';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + (it.util.escapeQuotes($schema));
      }
      out += '"\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + (it.util.toQuotedString($schema));
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' } ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],26:[function(require,module,exports){
'use strict';
module.exports = function generate_if(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $thenSch = it.schema['then'],
    $elseSch = it.schema['else'],
    $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? (typeof $thenSch == 'object' && Object.keys($thenSch).length > 0) || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)),
    $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? (typeof $elseSch == 'object' && Object.keys($elseSch).length > 0) || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)),
    $currentBaseId = $it.baseId;
  if ($thenPresent || $elsePresent) {
    var $ifClause;
    $it.createErrors = false;
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true;  ';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    out += '  ' + (it.validate($it)) + ' ';
    $it.baseId = $currentBaseId;
    $it.createErrors = true;
    out += '  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }  ';
    it.compositeRule = $it.compositeRule = $wasComposite;
    if ($thenPresent) {
      out += ' if (' + ($nextValid) + ') {  ';
      $it.schema = it.schema['then'];
      $it.schemaPath = it.schemaPath + '.then';
      $it.errSchemaPath = it.errSchemaPath + '/then';
      out += '  ' + (it.validate($it)) + ' ';
      $it.baseId = $currentBaseId;
      out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';
      if ($thenPresent && $elsePresent) {
        $ifClause = 'ifClause' + $lvl;
        out += ' var ' + ($ifClause) + ' = \'then\'; ';
      } else {
        $ifClause = '\'then\'';
      }
      out += ' } ';
      if ($elsePresent) {
        out += ' else { ';
      }
    } else {
      out += ' if (!' + ($nextValid) + ') { ';
    }
    if ($elsePresent) {
      $it.schema = it.schema['else'];
      $it.schemaPath = it.schemaPath + '.else';
      $it.errSchemaPath = it.errSchemaPath + '/else';
      out += '  ' + (it.validate($it)) + ' ';
      $it.baseId = $currentBaseId;
      out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';
      if ($thenPresent && $elsePresent) {
        $ifClause = 'ifClause' + $lvl;
        out += ' var ' + ($ifClause) + ' = \'else\'; ';
      } else {
        $ifClause = '\'else\'';
      }
      out += ' } ';
    }
    out += ' if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('if') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should match "\' + ' + ($ifClause) + ' + \'" schema\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError(vErrors); ';
      } else {
        out += ' validate.errors = vErrors; return false; ';
      }
    }
    out += ' }   ';
    if ($breakOnError) {
      out += ' else { ';
    }
  } else {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  }
  return out;
}

},{}],27:[function(require,module,exports){
'use strict';

//all requires must be explicit because browserify won't work with dynamic requires
module.exports = {
  '$ref': require('./ref'),
  allOf: require('./allOf'),
  anyOf: require('./anyOf'),
  '$comment': require('./comment'),
  const: require('./const'),
  contains: require('./contains'),
  dependencies: require('./dependencies'),
  'enum': require('./enum'),
  format: require('./format'),
  'if': require('./if'),
  items: require('./items'),
  maximum: require('./_limit'),
  minimum: require('./_limit'),
  maxItems: require('./_limitItems'),
  minItems: require('./_limitItems'),
  maxLength: require('./_limitLength'),
  minLength: require('./_limitLength'),
  maxProperties: require('./_limitProperties'),
  minProperties: require('./_limitProperties'),
  multipleOf: require('./multipleOf'),
  not: require('./not'),
  oneOf: require('./oneOf'),
  pattern: require('./pattern'),
  properties: require('./properties'),
  propertyNames: require('./propertyNames'),
  required: require('./required'),
  uniqueItems: require('./uniqueItems'),
  validate: require('./validate')
};

},{"./_limit":13,"./_limitItems":14,"./_limitLength":15,"./_limitProperties":16,"./allOf":17,"./anyOf":18,"./comment":19,"./const":20,"./contains":21,"./dependencies":23,"./enum":24,"./format":25,"./if":26,"./items":28,"./multipleOf":29,"./not":30,"./oneOf":31,"./pattern":32,"./properties":33,"./propertyNames":34,"./ref":35,"./required":36,"./uniqueItems":37,"./validate":38}],28:[function(require,module,exports){
'use strict';
module.exports = function generate_items(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $idx = 'i' + $lvl,
    $dataNxt = $it.dataLevel = it.dataLevel + 1,
    $nextData = 'data' + $dataNxt,
    $currentBaseId = it.baseId;
  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
  if (Array.isArray($schema)) {
    var $additionalItems = it.schema.additionalItems;
    if ($additionalItems === false) {
      out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; ';
      var $currErrSchemaPath = $errSchemaPath;
      $errSchemaPath = it.errSchemaPath + '/additionalItems';
      out += '  if (!' + ($valid) + ') {   ';
      var $$outStack = $$outStack || [];
      $$outStack.push(out);
      out = ''; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } ';
        if (it.opts.messages !== false) {
          out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      var __err = out;
      out = $$outStack.pop();
      if (!it.compositeRule && $breakOnError) {
        /* istanbul ignore if */
        if (it.async) {
          out += ' throw new ValidationError([' + (__err) + ']); ';
        } else {
          out += ' validate.errors = [' + (__err) + ']; return false; ';
        }
      } else {
        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
      }
      out += ' } ';
      $errSchemaPath = $currErrSchemaPath;
      if ($breakOnError) {
        $closingBraces += '}';
        out += ' else { ';
      }
    }
    var arr1 = $schema;
    if (arr1) {
      var $sch, $i = -1,
        l1 = arr1.length - 1;
      while ($i < l1) {
        $sch = arr1[$i += 1];
        if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
          out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { ';
          var $passData = $data + '[' + $i + ']';
          $it.schema = $sch;
          $it.schemaPath = $schemaPath + '[' + $i + ']';
          $it.errSchemaPath = $errSchemaPath + '/' + $i;
          $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true);
          $it.dataPathArr[$dataNxt] = $i;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          out += ' }  ';
          if ($breakOnError) {
            out += ' if (' + ($nextValid) + ') { ';
            $closingBraces += '}';
          }
        }
      }
    }
    if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? (typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0) || $additionalItems === false : it.util.schemaHasRules($additionalItems, it.RULES.all))) {
      $it.schema = $additionalItems;
      $it.schemaPath = it.schemaPath + '.additionalItems';
      $it.errSchemaPath = it.errSchemaPath + '/additionalItems';
      out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') {  for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';
      $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
      var $passData = $data + '[' + $idx + ']';
      $it.dataPathArr[$dataNxt] = $idx;
      var $code = it.validate($it);
      $it.baseId = $currentBaseId;
      if (it.util.varOccurences($code, $nextData) < 2) {
        out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
      } else {
        out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
      }
      if ($breakOnError) {
        out += ' if (!' + ($nextValid) + ') break; ';
      }
      out += ' } }  ';
      if ($breakOnError) {
        out += ' if (' + ($nextValid) + ') { ';
        $closingBraces += '}';
      }
    }
  } else if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += '  for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';
    $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
    var $passData = $data + '[' + $idx + ']';
    $it.dataPathArr[$dataNxt] = $idx;
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
    if (it.util.varOccurences($code, $nextData) < 2) {
      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
    } else {
      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
    }
    if ($breakOnError) {
      out += ' if (!' + ($nextValid) + ') break; ';
    }
    out += ' }';
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}

},{}],29:[function(require,module,exports){
'use strict';
module.exports = function generate_multipleOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  out += 'var division' + ($lvl) + ';if (';
  if ($isData) {
    out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || ';
  }
  out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', ';
  if (it.opts.multipleOfPrecision) {
    out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' ';
  } else {
    out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') ';
  }
  out += ' ) ';
  if ($isData) {
    out += '  )  ';
  }
  out += ' ) {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be multiple of ';
      if ($isData) {
        out += '\' + ' + ($schemaValue);
      } else {
        out += '' + ($schemaValue) + '\'';
      }
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],30:[function(require,module,exports){
'use strict';
module.exports = function generate_not(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += ' var ' + ($errs) + ' = errors;  ';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    $it.createErrors = false;
    var $allErrorsOption;
    if ($it.opts.allErrors) {
      $allErrorsOption = $it.opts.allErrors;
      $it.opts.allErrors = false;
    }
    out += ' ' + (it.validate($it)) + ' ';
    $it.createErrors = true;
    if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption;
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' if (' + ($nextValid) + ') {   ';
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should NOT be valid\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
    if (it.opts.allErrors) {
      out += ' } ';
    }
  } else {
    out += '  var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should NOT be valid\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if ($breakOnError) {
      out += ' if (false) { ';
    }
  }
  return out;
}

},{}],31:[function(require,module,exports){
'use strict';
module.exports = function generate_oneOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $currentBaseId = $it.baseId,
    $prevValid = 'prevValid' + $lvl,
    $passingSchemas = 'passingSchemas' + $lvl;
  out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; ';
  var $wasComposite = it.compositeRule;
  it.compositeRule = $it.compositeRule = true;
  var arr1 = $schema;
  if (arr1) {
    var $sch, $i = -1,
      l1 = arr1.length - 1;
    while ($i < l1) {
      $sch = arr1[$i += 1];
      if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + '[' + $i + ']';
        $it.errSchemaPath = $errSchemaPath + '/' + $i;
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
      } else {
        out += ' var ' + ($nextValid) + ' = true; ';
      }
      if ($i) {
        out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { ';
        $closingBraces += '}';
      }
      out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }';
    }
  }
  it.compositeRule = $it.compositeRule = $wasComposite;
  out += '' + ($closingBraces) + 'if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should match exactly one schema in oneOf\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError(vErrors); ';
    } else {
      out += ' validate.errors = vErrors; return false; ';
    }
  }
  out += '} else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }';
  if (it.opts.allErrors) {
    out += ' } ';
  }
  return out;
}

},{}],32:[function(require,module,exports){
'use strict';
module.exports = function generate_pattern(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema);
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || ';
  }
  out += ' !' + ($regexp) + '.test(' + ($data) + ') ) {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern:  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += '  } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should match pattern "';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + (it.util.escapeQuotes($schema));
      }
      out += '"\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + (it.util.toQuotedString($schema));
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],33:[function(require,module,exports){
'use strict';
module.exports = function generate_properties(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $key = 'key' + $lvl,
    $idx = 'idx' + $lvl,
    $dataNxt = $it.dataLevel = it.dataLevel + 1,
    $nextData = 'data' + $dataNxt,
    $dataProperties = 'dataProperties' + $lvl;
  var $schemaKeys = Object.keys($schema || {}).filter(notProto),
    $pProperties = it.schema.patternProperties || {},
    $pPropertyKeys = Object.keys($pProperties).filter(notProto),
    $aProperties = it.schema.additionalProperties,
    $someProperties = $schemaKeys.length || $pPropertyKeys.length,
    $noAdditional = $aProperties === false,
    $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length,
    $removeAdditional = it.opts.removeAdditional,
    $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional,
    $ownProperties = it.opts.ownProperties,
    $currentBaseId = it.baseId;
  var $required = it.schema.required;
  if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) {
    var $requiredHash = it.util.toHash($required);
  }

  function notProto(p) {
    return p !== '__proto__';
  }
  out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;';
  if ($ownProperties) {
    out += ' var ' + ($dataProperties) + ' = undefined;';
  }
  if ($checkAdditional) {
    if ($ownProperties) {
      out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
    } else {
      out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
    }
    if ($someProperties) {
      out += ' var isAdditional' + ($lvl) + ' = !(false ';
      if ($schemaKeys.length) {
        if ($schemaKeys.length > 8) {
          out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') ';
        } else {
          var arr1 = $schemaKeys;
          if (arr1) {
            var $propertyKey, i1 = -1,
              l1 = arr1.length - 1;
            while (i1 < l1) {
              $propertyKey = arr1[i1 += 1];
              out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' ';
            }
          }
        }
      }
      if ($pPropertyKeys.length) {
        var arr2 = $pPropertyKeys;
        if (arr2) {
          var $pProperty, $i = -1,
            l2 = arr2.length - 1;
          while ($i < l2) {
            $pProperty = arr2[$i += 1];
            out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') ';
          }
        }
      }
      out += ' ); if (isAdditional' + ($lvl) + ') { ';
    }
    if ($removeAdditional == 'all') {
      out += ' delete ' + ($data) + '[' + ($key) + ']; ';
    } else {
      var $currentErrorPath = it.errorPath;
      var $additionalProperty = '\' + ' + $key + ' + \'';
      if (it.opts._errorDataPathProperty) {
        it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
      }
      if ($noAdditional) {
        if ($removeAdditional) {
          out += ' delete ' + ($data) + '[' + ($key) + ']; ';
        } else {
          out += ' ' + ($nextValid) + ' = false; ';
          var $currErrSchemaPath = $errSchemaPath;
          $errSchemaPath = it.errSchemaPath + '/additionalProperties';
          var $$outStack = $$outStack || [];
          $$outStack.push(out);
          out = ''; /* istanbul ignore else */
          if (it.createErrors !== false) {
            out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } ';
            if (it.opts.messages !== false) {
              out += ' , message: \'';
              if (it.opts._errorDataPathProperty) {
                out += 'is an invalid additional property';
              } else {
                out += 'should NOT have additional properties';
              }
              out += '\' ';
            }
            if (it.opts.verbose) {
              out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
            }
            out += ' } ';
          } else {
            out += ' {} ';
          }
          var __err = out;
          out = $$outStack.pop();
          if (!it.compositeRule && $breakOnError) {
            /* istanbul ignore if */
            if (it.async) {
              out += ' throw new ValidationError([' + (__err) + ']); ';
            } else {
              out += ' validate.errors = [' + (__err) + ']; return false; ';
            }
          } else {
            out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
          }
          $errSchemaPath = $currErrSchemaPath;
          if ($breakOnError) {
            out += ' break; ';
          }
        }
      } else if ($additionalIsSchema) {
        if ($removeAdditional == 'failing') {
          out += ' var ' + ($errs) + ' = errors;  ';
          var $wasComposite = it.compositeRule;
          it.compositeRule = $it.compositeRule = true;
          $it.schema = $aProperties;
          $it.schemaPath = it.schemaPath + '.additionalProperties';
          $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';
          $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
          var $passData = $data + '[' + $key + ']';
          $it.dataPathArr[$dataNxt] = $key;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; }  ';
          it.compositeRule = $it.compositeRule = $wasComposite;
        } else {
          $it.schema = $aProperties;
          $it.schemaPath = it.schemaPath + '.additionalProperties';
          $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';
          $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
          var $passData = $data + '[' + $key + ']';
          $it.dataPathArr[$dataNxt] = $key;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          if ($breakOnError) {
            out += ' if (!' + ($nextValid) + ') break; ';
          }
        }
      }
      it.errorPath = $currentErrorPath;
    }
    if ($someProperties) {
      out += ' } ';
    }
    out += ' }  ';
    if ($breakOnError) {
      out += ' if (' + ($nextValid) + ') { ';
      $closingBraces += '}';
    }
  }
  var $useDefaults = it.opts.useDefaults && !it.compositeRule;
  if ($schemaKeys.length) {
    var arr3 = $schemaKeys;
    if (arr3) {
      var $propertyKey, i3 = -1,
        l3 = arr3.length - 1;
      while (i3 < l3) {
        $propertyKey = arr3[i3 += 1];
        var $sch = $schema[$propertyKey];
        if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
          var $prop = it.util.getProperty($propertyKey),
            $passData = $data + $prop,
            $hasDefault = $useDefaults && $sch.default !== undefined;
          $it.schema = $sch;
          $it.schemaPath = $schemaPath + $prop;
          $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey);
          $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);
          $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            $code = it.util.varReplace($code, $nextData, $passData);
            var $useData = $passData;
          } else {
            var $useData = $nextData;
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ';
          }
          if ($hasDefault) {
            out += ' ' + ($code) + ' ';
          } else {
            if ($requiredHash && $requiredHash[$propertyKey]) {
              out += ' if ( ' + ($useData) + ' === undefined ';
              if ($ownProperties) {
                out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
              }
              out += ') { ' + ($nextValid) + ' = false; ';
              var $currentErrorPath = it.errorPath,
                $currErrSchemaPath = $errSchemaPath,
                $missingProperty = it.util.escapeQuotes($propertyKey);
              if (it.opts._errorDataPathProperty) {
                it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
              }
              $errSchemaPath = it.errSchemaPath + '/required';
              var $$outStack = $$outStack || [];
              $$outStack.push(out);
              out = ''; /* istanbul ignore else */
              if (it.createErrors !== false) {
                out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
                if (it.opts.messages !== false) {
                  out += ' , message: \'';
                  if (it.opts._errorDataPathProperty) {
                    out += 'is a required property';
                  } else {
                    out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
                  }
                  out += '\' ';
                }
                if (it.opts.verbose) {
                  out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
                }
                out += ' } ';
              } else {
                out += ' {} ';
              }
              var __err = out;
              out = $$outStack.pop();
              if (!it.compositeRule && $breakOnError) {
                /* istanbul ignore if */
                if (it.async) {
                  out += ' throw new ValidationError([' + (__err) + ']); ';
                } else {
                  out += ' validate.errors = [' + (__err) + ']; return false; ';
                }
              } else {
                out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
              }
              $errSchemaPath = $currErrSchemaPath;
              it.errorPath = $currentErrorPath;
              out += ' } else { ';
            } else {
              if ($breakOnError) {
                out += ' if ( ' + ($useData) + ' === undefined ';
                if ($ownProperties) {
                  out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
                }
                out += ') { ' + ($nextValid) + ' = true; } else { ';
              } else {
                out += ' if (' + ($useData) + ' !== undefined ';
                if ($ownProperties) {
                  out += ' &&   Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
                }
                out += ' ) { ';
              }
            }
            out += ' ' + ($code) + ' } ';
          }
        }
        if ($breakOnError) {
          out += ' if (' + ($nextValid) + ') { ';
          $closingBraces += '}';
        }
      }
    }
  }
  if ($pPropertyKeys.length) {
    var arr4 = $pPropertyKeys;
    if (arr4) {
      var $pProperty, i4 = -1,
        l4 = arr4.length - 1;
      while (i4 < l4) {
        $pProperty = arr4[i4 += 1];
        var $sch = $pProperties[$pProperty];
        if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
          $it.schema = $sch;
          $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty);
          $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty);
          if ($ownProperties) {
            out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
          } else {
            out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
          }
          out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { ';
          $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
          var $passData = $data + '[' + $key + ']';
          $it.dataPathArr[$dataNxt] = $key;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          if ($breakOnError) {
            out += ' if (!' + ($nextValid) + ') break; ';
          }
          out += ' } ';
          if ($breakOnError) {
            out += ' else ' + ($nextValid) + ' = true; ';
          }
          out += ' }  ';
          if ($breakOnError) {
            out += ' if (' + ($nextValid) + ') { ';
            $closingBraces += '}';
          }
        }
      }
    }
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}

},{}],34:[function(require,module,exports){
'use strict';
module.exports = function generate_propertyNames(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  out += 'var ' + ($errs) + ' = errors;';
  if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    var $key = 'key' + $lvl,
      $idx = 'idx' + $lvl,
      $i = 'i' + $lvl,
      $invalidName = '\' + ' + $key + ' + \'',
      $dataNxt = $it.dataLevel = it.dataLevel + 1,
      $nextData = 'data' + $dataNxt,
      $dataProperties = 'dataProperties' + $lvl,
      $ownProperties = it.opts.ownProperties,
      $currentBaseId = it.baseId;
    if ($ownProperties) {
      out += ' var ' + ($dataProperties) + ' = undefined; ';
    }
    if ($ownProperties) {
      out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
    } else {
      out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
    }
    out += ' var startErrs' + ($lvl) + ' = errors; ';
    var $passData = $key;
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
    if (it.util.varOccurences($code, $nextData) < 2) {
      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
    } else {
      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
    }
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + '<errors; ' + ($i) + '++) { vErrors[' + ($i) + '].propertyName = ' + ($key) + '; }   var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('propertyNames') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { propertyName: \'' + ($invalidName) + '\' } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'property name \\\'' + ($invalidName) + '\\\' is invalid\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError(vErrors); ';
      } else {
        out += ' validate.errors = vErrors; return false; ';
      }
    }
    if ($breakOnError) {
      out += ' break; ';
    }
    out += ' } }';
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}

},{}],35:[function(require,module,exports){
'use strict';
module.exports = function generate_ref(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $async, $refCode;
  if ($schema == '#' || $schema == '#/') {
    if (it.isRoot) {
      $async = it.async;
      $refCode = 'validate';
    } else {
      $async = it.root.schema.$async === true;
      $refCode = 'root.refVal[0]';
    }
  } else {
    var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot);
    if ($refVal === undefined) {
      var $message = it.MissingRefError.message(it.baseId, $schema);
      if (it.opts.missingRefs == 'fail') {
        it.logger.error($message);
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('$ref') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { ref: \'' + (it.util.escapeQuotes($schema)) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'can\\\'t resolve reference ' + (it.util.escapeQuotes($schema)) + '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: ' + (it.util.toQuotedString($schema)) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        if ($breakOnError) {
          out += ' if (false) { ';
        }
      } else if (it.opts.missingRefs == 'ignore') {
        it.logger.warn($message);
        if ($breakOnError) {
          out += ' if (true) { ';
        }
      } else {
        throw new it.MissingRefError(it.baseId, $schema, $message);
      }
    } else if ($refVal.inline) {
      var $it = it.util.copy(it);
      $it.level++;
      var $nextValid = 'valid' + $it.level;
      $it.schema = $refVal.schema;
      $it.schemaPath = '';
      $it.errSchemaPath = $schema;
      var $code = it.validate($it).replace(/validate\.schema/g, $refVal.code);
      out += ' ' + ($code) + ' ';
      if ($breakOnError) {
        out += ' if (' + ($nextValid) + ') { ';
      }
    } else {
      $async = $refVal.$async === true || (it.async && $refVal.$async !== false);
      $refCode = $refVal.code;
    }
  }
  if ($refCode) {
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
    if (it.opts.passContext) {
      out += ' ' + ($refCode) + '.call(this, ';
    } else {
      out += ' ' + ($refCode) + '( ';
    }
    out += ' ' + ($data) + ', (dataPath || \'\')';
    if (it.errorPath != '""') {
      out += ' + ' + (it.errorPath);
    }
    var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',
      $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
    out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ', rootData)  ';
    var __callValidate = out;
    out = $$outStack.pop();
    if ($async) {
      if (!it.async) throw new Error('async schema referenced by sync schema');
      if ($breakOnError) {
        out += ' var ' + ($valid) + '; ';
      }
      out += ' try { await ' + (__callValidate) + '; ';
      if ($breakOnError) {
        out += ' ' + ($valid) + ' = true; ';
      }
      out += ' } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ';
      if ($breakOnError) {
        out += ' ' + ($valid) + ' = false; ';
      }
      out += ' } ';
      if ($breakOnError) {
        out += ' if (' + ($valid) + ') { ';
      }
    } else {
      out += ' if (!' + (__callValidate) + ') { if (vErrors === null) vErrors = ' + ($refCode) + '.errors; else vErrors = vErrors.concat(' + ($refCode) + '.errors); errors = vErrors.length; } ';
      if ($breakOnError) {
        out += ' else { ';
      }
    }
  }
  return out;
}

},{}],36:[function(require,module,exports){
'use strict';
module.exports = function generate_required(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $vSchema = 'schema' + $lvl;
  if (!$isData) {
    if ($schema.length < it.opts.loopRequired && it.schema.properties && Object.keys(it.schema.properties).length) {
      var $required = [];
      var arr1 = $schema;
      if (arr1) {
        var $property, i1 = -1,
          l1 = arr1.length - 1;
        while (i1 < l1) {
          $property = arr1[i1 += 1];
          var $propertySch = it.schema.properties[$property];
          if (!($propertySch && (it.opts.strictKeywords ? (typeof $propertySch == 'object' && Object.keys($propertySch).length > 0) || $propertySch === false : it.util.schemaHasRules($propertySch, it.RULES.all)))) {
            $required[$required.length] = $property;
          }
        }
      }
    } else {
      var $required = $schema;
    }
  }
  if ($isData || $required.length) {
    var $currentErrorPath = it.errorPath,
      $loopRequired = $isData || $required.length >= it.opts.loopRequired,
      $ownProperties = it.opts.ownProperties;
    if ($breakOnError) {
      out += ' var missing' + ($lvl) + '; ';
      if ($loopRequired) {
        if (!$isData) {
          out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';
        }
        var $i = 'i' + $lvl,
          $propertyPath = 'schema' + $lvl + '[' + $i + ']',
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);
        }
        out += ' var ' + ($valid) + ' = true; ';
        if ($isData) {
          out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';
        }
        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined ';
        if ($ownProperties) {
          out += ' &&   Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';
        }
        out += '; if (!' + ($valid) + ') break; } ';
        if ($isData) {
          out += '  }  ';
        }
        out += '  if (!' + ($valid) + ') {   ';
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'';
            if (it.opts._errorDataPathProperty) {
              out += 'is a required property';
            } else {
              out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        out += ' } else { ';
      } else {
        out += ' if ( ';
        var arr2 = $required;
        if (arr2) {
          var $propertyKey, $i = -1,
            l2 = arr2.length - 1;
          while ($i < l2) {
            $propertyKey = arr2[$i += 1];
            if ($i) {
              out += ' || ';
            }
            var $prop = it.util.getProperty($propertyKey),
              $useData = $data + $prop;
            out += ' ( ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';
          }
        }
        out += ') {  ';
        var $propertyPath = 'missing' + $lvl,
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;
        }
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'';
            if (it.opts._errorDataPathProperty) {
              out += 'is a required property';
            } else {
              out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        out += ' } else { ';
      }
    } else {
      if ($loopRequired) {
        if (!$isData) {
          out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';
        }
        var $i = 'i' + $lvl,
          $propertyPath = 'schema' + $lvl + '[' + $i + ']',
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);
        }
        if ($isData) {
          out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) {  var err =   '; /* istanbul ignore else */
          if (it.createErrors !== false) {
            out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
            if (it.opts.messages !== false) {
              out += ' , message: \'';
              if (it.opts._errorDataPathProperty) {
                out += 'is a required property';
              } else {
                out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
              }
              out += '\' ';
            }
            if (it.opts.verbose) {
              out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
            }
            out += ' } ';
          } else {
            out += ' {} ';
          }
          out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { ';
        }
        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined ';
        if ($ownProperties) {
          out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';
        }
        out += ') {  var err =   '; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'';
            if (it.opts._errorDataPathProperty) {
              out += 'is a required property';
            } else {
              out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ';
        if ($isData) {
          out += '  }  ';
        }
      } else {
        var arr3 = $required;
        if (arr3) {
          var $propertyKey, i3 = -1,
            l3 = arr3.length - 1;
          while (i3 < l3) {
            $propertyKey = arr3[i3 += 1];
            var $prop = it.util.getProperty($propertyKey),
              $missingProperty = it.util.escapeQuotes($propertyKey),
              $useData = $data + $prop;
            if (it.opts._errorDataPathProperty) {
              it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
            }
            out += ' if ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') {  var err =   '; /* istanbul ignore else */
            if (it.createErrors !== false) {
              out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
              if (it.opts.messages !== false) {
                out += ' , message: \'';
                if (it.opts._errorDataPathProperty) {
                  out += 'is a required property';
                } else {
                  out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
                }
                out += '\' ';
              }
              if (it.opts.verbose) {
                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
              }
              out += ' } ';
            } else {
              out += ' {} ';
            }
            out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';
          }
        }
      }
    }
    it.errorPath = $currentErrorPath;
  } else if ($breakOnError) {
    out += ' if (true) {';
  }
  return out;
}

},{}],37:[function(require,module,exports){
'use strict';
module.exports = function generate_uniqueItems(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (($schema || $isData) && it.opts.uniqueItems !== false) {
    if ($isData) {
      out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { ';
    }
    out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { ';
    var $itemType = it.schema.items && it.schema.items.type,
      $typeIsArray = Array.isArray($itemType);
    if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) {
      out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } ';
    } else {
      out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; ';
      var $method = 'checkDataType' + ($typeIsArray ? 's' : '');
      out += ' if (' + (it.util[$method]($itemType, 'item', it.opts.strictNumbers, true)) + ') continue; ';
      if ($typeIsArray) {
        out += ' if (typeof item == \'string\') item = \'"\' + item; ';
      }
      out += ' if (typeof itemIndices[item] == \'number\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } ';
    }
    out += ' } ';
    if ($isData) {
      out += '  }  ';
    }
    out += ' if (!' + ($valid) + ') {   ';
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema:  ';
        if ($isData) {
          out += 'validate.schema' + ($schemaPath);
        } else {
          out += '' + ($schema);
        }
        out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' } ';
    if ($breakOnError) {
      out += ' else { ';
    }
  } else {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  }
  return out;
}

},{}],38:[function(require,module,exports){
'use strict';
module.exports = function generate_validate(it, $keyword, $ruleType) {
  var out = '';
  var $async = it.schema.$async === true,
    $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'),
    $id = it.self._getId(it.schema);
  if (it.opts.strictKeywords) {
    var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords);
    if ($unknownKwd) {
      var $keywordsMsg = 'unknown keyword: ' + $unknownKwd;
      if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg);
      else throw new Error($keywordsMsg);
    }
  }
  if (it.isTop) {
    out += ' var validate = ';
    if ($async) {
      it.async = true;
      out += 'async ';
    }
    out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; ';
    if ($id && (it.opts.sourceCode || it.opts.processCode)) {
      out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' ';
    }
  }
  if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) {
    var $keyword = 'false schema';
    var $lvl = it.level;
    var $dataLvl = it.dataLevel;
    var $schema = it.schema[$keyword];
    var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
    var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
    var $breakOnError = !it.opts.allErrors;
    var $errorKeyword;
    var $data = 'data' + ($dataLvl || '');
    var $valid = 'valid' + $lvl;
    if (it.schema === false) {
      if (it.isTop) {
        $breakOnError = true;
      } else {
        out += ' var ' + ($valid) + ' = false; ';
      }
      var $$outStack = $$outStack || [];
      $$outStack.push(out);
      out = ''; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
        if (it.opts.messages !== false) {
          out += ' , message: \'boolean schema is false\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      var __err = out;
      out = $$outStack.pop();
      if (!it.compositeRule && $breakOnError) {
        /* istanbul ignore if */
        if (it.async) {
          out += ' throw new ValidationError([' + (__err) + ']); ';
        } else {
          out += ' validate.errors = [' + (__err) + ']; return false; ';
        }
      } else {
        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
      }
    } else {
      if (it.isTop) {
        if ($async) {
          out += ' return data; ';
        } else {
          out += ' validate.errors = null; return true; ';
        }
      } else {
        out += ' var ' + ($valid) + ' = true; ';
      }
    }
    if (it.isTop) {
      out += ' }; return validate; ';
    }
    return out;
  }
  if (it.isTop) {
    var $top = it.isTop,
      $lvl = it.level = 0,
      $dataLvl = it.dataLevel = 0,
      $data = 'data';
    it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));
    it.baseId = it.baseId || it.rootId;
    delete it.isTop;
    it.dataPathArr = [""];
    if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) {
      var $defaultMsg = 'default is ignored in the schema root';
      if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
      else throw new Error($defaultMsg);
    }
    out += ' var vErrors = null; ';
    out += ' var errors = 0;     ';
    out += ' if (rootData === undefined) rootData = data; ';
  } else {
    var $lvl = it.level,
      $dataLvl = it.dataLevel,
      $data = 'data' + ($dataLvl || '');
    if ($id) it.baseId = it.resolve.url(it.baseId, $id);
    if ($async && !it.async) throw new Error('async schema in sync schema');
    out += ' var errs_' + ($lvl) + ' = errors;';
  }
  var $valid = 'valid' + $lvl,
    $breakOnError = !it.opts.allErrors,
    $closingBraces1 = '',
    $closingBraces2 = '';
  var $errorKeyword;
  var $typeSchema = it.schema.type,
    $typeIsArray = Array.isArray($typeSchema);
  if ($typeSchema && it.opts.nullable && it.schema.nullable === true) {
    if ($typeIsArray) {
      if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null');
    } else if ($typeSchema != 'null') {
      $typeSchema = [$typeSchema, 'null'];
      $typeIsArray = true;
    }
  }
  if ($typeIsArray && $typeSchema.length == 1) {
    $typeSchema = $typeSchema[0];
    $typeIsArray = false;
  }
  if (it.schema.$ref && $refKeywords) {
    if (it.opts.extendRefs == 'fail') {
      throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)');
    } else if (it.opts.extendRefs !== true) {
      $refKeywords = false;
      it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"');
    }
  }
  if (it.schema.$comment && it.opts.$comment) {
    out += ' ' + (it.RULES.all.$comment.code(it, '$comment'));
  }
  if ($typeSchema) {
    if (it.opts.coerceTypes) {
      var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema);
    }
    var $rulesGroup = it.RULES.types[$typeSchema];
    if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) {
      var $schemaPath = it.schemaPath + '.type',
        $errSchemaPath = it.errSchemaPath + '/type';
      var $schemaPath = it.schemaPath + '.type',
        $errSchemaPath = it.errSchemaPath + '/type',
        $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType';
      out += ' if (' + (it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true)) + ') { ';
      if ($coerceToTypes) {
        var $dataType = 'dataType' + $lvl,
          $coerced = 'coerced' + $lvl;
        out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; var ' + ($coerced) + ' = undefined; ';
        if (it.opts.coerceTypes == 'array') {
          out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ') && ' + ($data) + '.length == 1) { ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; if (' + (it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)) + ') ' + ($coerced) + ' = ' + ($data) + '; } ';
        }
        out += ' if (' + ($coerced) + ' !== undefined) ; ';
        var arr1 = $coerceToTypes;
        if (arr1) {
          var $type, $i = -1,
            l1 = arr1.length - 1;
          while ($i < l1) {
            $type = arr1[$i += 1];
            if ($type == 'string') {
              out += ' else if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; ';
            } else if ($type == 'number' || $type == 'integer') {
              out += ' else if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' ';
              if ($type == 'integer') {
                out += ' && !(' + ($data) + ' % 1)';
              }
              out += ')) ' + ($coerced) + ' = +' + ($data) + '; ';
            } else if ($type == 'boolean') {
              out += ' else if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; ';
            } else if ($type == 'null') {
              out += ' else if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; ';
            } else if (it.opts.coerceTypes == 'array' && $type == 'array') {
              out += ' else if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; ';
            }
          }
        }
        out += ' else {   ';
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';
          if ($typeIsArray) {
            out += '' + ($typeSchema.join(","));
          } else {
            out += '' + ($typeSchema);
          }
          out += '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'should be ';
            if ($typeIsArray) {
              out += '' + ($typeSchema.join(","));
            } else {
              out += '' + ($typeSchema);
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        out += ' } if (' + ($coerced) + ' !== undefined) {  ';
        var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',
          $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
        out += ' ' + ($data) + ' = ' + ($coerced) + '; ';
        if (!$dataLvl) {
          out += 'if (' + ($parentData) + ' !== undefined)';
        }
        out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } ';
      } else {
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';
          if ($typeIsArray) {
            out += '' + ($typeSchema.join(","));
          } else {
            out += '' + ($typeSchema);
          }
          out += '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'should be ';
            if ($typeIsArray) {
              out += '' + ($typeSchema.join(","));
            } else {
              out += '' + ($typeSchema);
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
      }
      out += ' } ';
    }
  }
  if (it.schema.$ref && !$refKeywords) {
    out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' ';
    if ($breakOnError) {
      out += ' } if (errors === ';
      if ($top) {
        out += '0';
      } else {
        out += 'errs_' + ($lvl);
      }
      out += ') { ';
      $closingBraces2 += '}';
    }
  } else {
    var arr2 = it.RULES;
    if (arr2) {
      var $rulesGroup, i2 = -1,
        l2 = arr2.length - 1;
      while (i2 < l2) {
        $rulesGroup = arr2[i2 += 1];
        if ($shouldUseGroup($rulesGroup)) {
          if ($rulesGroup.type) {
            out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers)) + ') { ';
          }
          if (it.opts.useDefaults) {
            if ($rulesGroup.type == 'object' && it.schema.properties) {
              var $schema = it.schema.properties,
                $schemaKeys = Object.keys($schema);
              var arr3 = $schemaKeys;
              if (arr3) {
                var $propertyKey, i3 = -1,
                  l3 = arr3.length - 1;
                while (i3 < l3) {
                  $propertyKey = arr3[i3 += 1];
                  var $sch = $schema[$propertyKey];
                  if ($sch.default !== undefined) {
                    var $passData = $data + it.util.getProperty($propertyKey);
                    if (it.compositeRule) {
                      if (it.opts.strictDefaults) {
                        var $defaultMsg = 'default is ignored for: ' + $passData;
                        if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
                        else throw new Error($defaultMsg);
                      }
                    } else {
                      out += ' if (' + ($passData) + ' === undefined ';
                      if (it.opts.useDefaults == 'empty') {
                        out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' ';
                      }
                      out += ' ) ' + ($passData) + ' = ';
                      if (it.opts.useDefaults == 'shared') {
                        out += ' ' + (it.useDefault($sch.default)) + ' ';
                      } else {
                        out += ' ' + (JSON.stringify($sch.default)) + ' ';
                      }
                      out += '; ';
                    }
                  }
                }
              }
            } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) {
              var arr4 = it.schema.items;
              if (arr4) {
                var $sch, $i = -1,
                  l4 = arr4.length - 1;
                while ($i < l4) {
                  $sch = arr4[$i += 1];
                  if ($sch.default !== undefined) {
                    var $passData = $data + '[' + $i + ']';
                    if (it.compositeRule) {
                      if (it.opts.strictDefaults) {
                        var $defaultMsg = 'default is ignored for: ' + $passData;
                        if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
                        else throw new Error($defaultMsg);
                      }
                    } else {
                      out += ' if (' + ($passData) + ' === undefined ';
                      if (it.opts.useDefaults == 'empty') {
                        out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' ';
                      }
                      out += ' ) ' + ($passData) + ' = ';
                      if (it.opts.useDefaults == 'shared') {
                        out += ' ' + (it.useDefault($sch.default)) + ' ';
                      } else {
                        out += ' ' + (JSON.stringify($sch.default)) + ' ';
                      }
                      out += '; ';
                    }
                  }
                }
              }
            }
          }
          var arr5 = $rulesGroup.rules;
          if (arr5) {
            var $rule, i5 = -1,
              l5 = arr5.length - 1;
            while (i5 < l5) {
              $rule = arr5[i5 += 1];
              if ($shouldUseRule($rule)) {
                var $code = $rule.code(it, $rule.keyword, $rulesGroup.type);
                if ($code) {
                  out += ' ' + ($code) + ' ';
                  if ($breakOnError) {
                    $closingBraces1 += '}';
                  }
                }
              }
            }
          }
          if ($breakOnError) {
            out += ' ' + ($closingBraces1) + ' ';
            $closingBraces1 = '';
          }
          if ($rulesGroup.type) {
            out += ' } ';
            if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) {
              out += ' else { ';
              var $schemaPath = it.schemaPath + '.type',
                $errSchemaPath = it.errSchemaPath + '/type';
              var $$outStack = $$outStack || [];
              $$outStack.push(out);
              out = ''; /* istanbul ignore else */
              if (it.createErrors !== false) {
                out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';
                if ($typeIsArray) {
                  out += '' + ($typeSchema.join(","));
                } else {
                  out += '' + ($typeSchema);
                }
                out += '\' } ';
                if (it.opts.messages !== false) {
                  out += ' , message: \'should be ';
                  if ($typeIsArray) {
                    out += '' + ($typeSchema.join(","));
                  } else {
                    out += '' + ($typeSchema);
                  }
                  out += '\' ';
                }
                if (it.opts.verbose) {
                  out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
                }
                out += ' } ';
              } else {
                out += ' {} ';
              }
              var __err = out;
              out = $$outStack.pop();
              if (!it.compositeRule && $breakOnError) {
                /* istanbul ignore if */
                if (it.async) {
                  out += ' throw new ValidationError([' + (__err) + ']); ';
                } else {
                  out += ' validate.errors = [' + (__err) + ']; return false; ';
                }
              } else {
                out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
              }
              out += ' } ';
            }
          }
          if ($breakOnError) {
            out += ' if (errors === ';
            if ($top) {
              out += '0';
            } else {
              out += 'errs_' + ($lvl);
            }
            out += ') { ';
            $closingBraces2 += '}';
          }
        }
      }
    }
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces2) + ' ';
  }
  if ($top) {
    if ($async) {
      out += ' if (errors === 0) return data;           ';
      out += ' else throw new ValidationError(vErrors); ';
    } else {
      out += ' validate.errors = vErrors; ';
      out += ' return errors === 0;       ';
    }
    out += ' }; return validate;';
  } else {
    out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';';
  }

  function $shouldUseGroup($rulesGroup) {
    var rules = $rulesGroup.rules;
    for (var i = 0; i < rules.length; i++)
      if ($shouldUseRule(rules[i])) return true;
  }

  function $shouldUseRule($rule) {
    return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule));
  }

  function $ruleImplementsSomeKeyword($rule) {
    var impl = $rule.implements;
    for (var i = 0; i < impl.length; i++)
      if (it.schema[impl[i]] !== undefined) return true;
  }
  return out;
}

},{}],39:[function(require,module,exports){
'use strict';

var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i;
var customRuleCode = require('./dotjs/custom');
var definitionSchema = require('./definition_schema');

module.exports = {
  add: addKeyword,
  get: getKeyword,
  remove: removeKeyword,
  validate: validateKeyword
};


/**
 * Define custom keyword
 * @this  Ajv
 * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords).
 * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`.
 * @return {Ajv} this for method chaining
 */
function addKeyword(keyword, definition) {
  /* jshint validthis: true */
  /* eslint no-shadow: 0 */
  var RULES = this.RULES;
  if (RULES.keywords[keyword])
    throw new Error('Keyword ' + keyword + ' is already defined');

  if (!IDENTIFIER.test(keyword))
    throw new Error('Keyword ' + keyword + ' is not a valid identifier');

  if (definition) {
    this.validateKeyword(definition, true);

    var dataType = definition.type;
    if (Array.isArray(dataType)) {
      for (var i=0; i<dataType.length; i++)
        _addRule(keyword, dataType[i], definition);
    } else {
      _addRule(keyword, dataType, definition);
    }

    var metaSchema = definition.metaSchema;
    if (metaSchema) {
      if (definition.$data && this._opts.$data) {
        metaSchema = {
          anyOf: [
            metaSchema,
            { '$ref': 'https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#' }
          ]
        };
      }
      definition.validateSchema = this.compile(metaSchema, true);
    }
  }

  RULES.keywords[keyword] = RULES.all[keyword] = true;


  function _addRule(keyword, dataType, definition) {
    var ruleGroup;
    for (var i=0; i<RULES.length; i++) {
      var rg = RULES[i];
      if (rg.type == dataType) {
        ruleGroup = rg;
        break;
      }
    }

    if (!ruleGroup) {
      ruleGroup = { type: dataType, rules: [] };
      RULES.push(ruleGroup);
    }

    var rule = {
      keyword: keyword,
      definition: definition,
      custom: true,
      code: customRuleCode,
      implements: definition.implements
    };
    ruleGroup.rules.push(rule);
    RULES.custom[keyword] = rule;
  }

  return this;
}


/**
 * Get keyword
 * @this  Ajv
 * @param {String} keyword pre-defined or custom keyword.
 * @return {Object|Boolean} custom keyword definition, `true` if it is a predefined keyword, `false` otherwise.
 */
function getKeyword(keyword) {
  /* jshint validthis: true */
  var rule = this.RULES.custom[keyword];
  return rule ? rule.definition : this.RULES.keywords[keyword] || false;
}


/**
 * Remove keyword
 * @this  Ajv
 * @param {String} keyword pre-defined or custom keyword.
 * @return {Ajv} this for method chaining
 */
function removeKeyword(keyword) {
  /* jshint validthis: true */
  var RULES = this.RULES;
  delete RULES.keywords[keyword];
  delete RULES.all[keyword];
  delete RULES.custom[keyword];
  for (var i=0; i<RULES.length; i++) {
    var rules = RULES[i].rules;
    for (var j=0; j<rules.length; j++) {
      if (rules[j].keyword == keyword) {
        rules.splice(j, 1);
        break;
      }
    }
  }
  return this;
}


/**
 * Validate keyword definition
 * @this  Ajv
 * @param {Object} definition keyword definition object.
 * @param {Boolean} throwError true to throw exception if definition is invalid
 * @return {boolean} validation result
 */
function validateKeyword(definition, throwError) {
  validateKeyword.errors = null;
  var v = this._validateKeyword = this._validateKeyword
                                  || this.compile(definitionSchema, true);

  if (v(definition)) return true;
  validateKeyword.errors = v.errors;
  if (throwError)
    throw new Error('custom keyword definition is invalid: '  + this.errorsText(v.errors));
  else
    return false;
}

},{"./definition_schema":12,"./dotjs/custom":22}],40:[function(require,module,exports){
module.exports={
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",
    "description": "Meta-schema for $data reference (JSON Schema extension proposal)",
    "type": "object",
    "required": [ "$data" ],
    "properties": {
        "$data": {
            "type": "string",
            "anyOf": [
                { "format": "relative-json-pointer" }, 
                { "format": "json-pointer" }
            ]
        }
    },
    "additionalProperties": false
}

},{}],41:[function(require,module,exports){
module.exports={
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "http://json-schema.org/draft-07/schema#",
    "title": "Core schema meta-schema",
    "definitions": {
        "schemaArray": {
            "type": "array",
            "minItems": 1,
            "items": { "$ref": "#" }
        },
        "nonNegativeInteger": {
            "type": "integer",
            "minimum": 0
        },
        "nonNegativeIntegerDefault0": {
            "allOf": [
                { "$ref": "#/definitions/nonNegativeInteger" },
                { "default": 0 }
            ]
        },
        "simpleTypes": {
            "enum": [
                "array",
                "boolean",
                "integer",
                "null",
                "number",
                "object",
                "string"
            ]
        },
        "stringArray": {
            "type": "array",
            "items": { "type": "string" },
            "uniqueItems": true,
            "default": []
        }
    },
    "type": ["object", "boolean"],
    "properties": {
        "$id": {
            "type": "string",
            "format": "uri-reference"
        },
        "$schema": {
            "type": "string",
            "format": "uri"
        },
        "$ref": {
            "type": "string",
            "format": "uri-reference"
        },
        "$comment": {
            "type": "string"
        },
        "title": {
            "type": "string"
        },
        "description": {
            "type": "string"
        },
        "default": true,
        "readOnly": {
            "type": "boolean",
            "default": false
        },
        "examples": {
            "type": "array",
            "items": true
        },
        "multipleOf": {
            "type": "number",
            "exclusiveMinimum": 0
        },
        "maximum": {
            "type": "number"
        },
        "exclusiveMaximum": {
            "type": "number"
        },
        "minimum": {
            "type": "number"
        },
        "exclusiveMinimum": {
            "type": "number"
        },
        "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
        "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "pattern": {
            "type": "string",
            "format": "regex"
        },
        "additionalItems": { "$ref": "#" },
        "items": {
            "anyOf": [
                { "$ref": "#" },
                { "$ref": "#/definitions/schemaArray" }
            ],
            "default": true
        },
        "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
        "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "uniqueItems": {
            "type": "boolean",
            "default": false
        },
        "contains": { "$ref": "#" },
        "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
        "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "required": { "$ref": "#/definitions/stringArray" },
        "additionalProperties": { "$ref": "#" },
        "definitions": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "properties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "patternProperties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "propertyNames": { "format": "regex" },
            "default": {}
        },
        "dependencies": {
            "type": "object",
            "additionalProperties": {
                "anyOf": [
                    { "$ref": "#" },
                    { "$ref": "#/definitions/stringArray" }
                ]
            }
        },
        "propertyNames": { "$ref": "#" },
        "const": true,
        "enum": {
            "type": "array",
            "items": true,
            "minItems": 1,
            "uniqueItems": true
        },
        "type": {
            "anyOf": [
                { "$ref": "#/definitions/simpleTypes" },
                {
                    "type": "array",
                    "items": { "$ref": "#/definitions/simpleTypes" },
                    "minItems": 1,
                    "uniqueItems": true
                }
            ]
        },
        "format": { "type": "string" },
        "contentMediaType": { "type": "string" },
        "contentEncoding": { "type": "string" },
        "if": {"$ref": "#"},
        "then": {"$ref": "#"},
        "else": {"$ref": "#"},
        "allOf": { "$ref": "#/definitions/schemaArray" },
        "anyOf": { "$ref": "#/definitions/schemaArray" },
        "oneOf": { "$ref": "#/definitions/schemaArray" },
        "not": { "$ref": "#" }
    },
    "default": true
}

},{}],42:[function(require,module,exports){
'use strict';

// do not edit .js files directly - edit src/index.jst



module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }



    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};

},{}],43:[function(require,module,exports){
'use strict';

module.exports = function (data, opts) {
    if (!opts) opts = {};
    if (typeof opts === 'function') opts = { cmp: opts };
    var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;

    var cmp = opts.cmp && (function (f) {
        return function (node) {
            return function (a, b) {
                var aobj = { key: a, value: node[a] };
                var bobj = { key: b, value: node[b] };
                return f(aobj, bobj);
            };
        };
    })(opts.cmp);

    var seen = [];
    return (function stringify (node) {
        if (node && node.toJSON && typeof node.toJSON === 'function') {
            node = node.toJSON();
        }

        if (node === undefined) return;
        if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
        if (typeof node !== 'object') return JSON.stringify(node);

        var i, out;
        if (Array.isArray(node)) {
            out = '[';
            for (i = 0; i < node.length; i++) {
                if (i) out += ',';
                out += stringify(node[i]) || 'null';
            }
            return out + ']';
        }

        if (node === null) return 'null';

        if (seen.indexOf(node) !== -1) {
            if (cycles) return JSON.stringify('__cycle__');
            throw new TypeError('Converting circular structure to JSON');
        }

        var seenIndex = seen.push(node) - 1;
        var keys = Object.keys(node).sort(cmp && cmp(node));
        out = '';
        for (i = 0; i < keys.length; i++) {
            var key = keys[i];
            var value = stringify(node[key]);

            if (!value) continue;
            if (out) out += ',';
            out += JSON.stringify(key) + ':' + value;
        }
        seen.splice(seenIndex, 1);
        return '{' + out + '}';
    })(data);
};

},{}],44:[function(require,module,exports){
'use strict';

var traverse = module.exports = function (schema, opts, cb) {
  // Legacy support for v0.3.1 and earlier.
  if (typeof opts == 'function') {
    cb = opts;
    opts = {};
  }

  cb = opts.cb || cb;
  var pre = (typeof cb == 'function') ? cb : cb.pre || function() {};
  var post = cb.post || function() {};

  _traverse(opts, pre, post, schema, '', schema);
};


traverse.keywords = {
  additionalItems: true,
  items: true,
  contains: true,
  additionalProperties: true,
  propertyNames: true,
  not: true
};

traverse.arrayKeywords = {
  items: true,
  allOf: true,
  anyOf: true,
  oneOf: true
};

traverse.propsKeywords = {
  definitions: true,
  properties: true,
  patternProperties: true,
  dependencies: true
};

traverse.skipKeywords = {
  default: true,
  enum: true,
  const: true,
  required: true,
  maximum: true,
  minimum: true,
  exclusiveMaximum: true,
  exclusiveMinimum: true,
  multipleOf: true,
  maxLength: true,
  minLength: true,
  pattern: true,
  format: true,
  maxItems: true,
  minItems: true,
  uniqueItems: true,
  maxProperties: true,
  minProperties: true
};


function _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {
  if (schema && typeof schema == 'object' && !Array.isArray(schema)) {
    pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
    for (var key in schema) {
      var sch = schema[key];
      if (Array.isArray(sch)) {
        if (key in traverse.arrayKeywords) {
          for (var i=0; i<sch.length; i++)
            _traverse(opts, pre, post, sch[i], jsonPtr + '/' + key + '/' + i, rootSchema, jsonPtr, key, schema, i);
        }
      } else if (key in traverse.propsKeywords) {
        if (sch && typeof sch == 'object') {
          for (var prop in sch)
            _traverse(opts, pre, post, sch[prop], jsonPtr + '/' + key + '/' + escapeJsonPtr(prop), rootSchema, jsonPtr, key, schema, prop);
        }
      } else if (key in traverse.keywords || (opts.allKeys && !(key in traverse.skipKeywords))) {
        _traverse(opts, pre, post, sch, jsonPtr + '/' + key, rootSchema, jsonPtr, key, schema);
      }
    }
    post(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
  }
}


function escapeJsonPtr(str) {
  return str.replace(/~/g, '~0').replace(/\//g, '~1');
}

},{}],45:[function(require,module,exports){
/** @license URI.js v4.4.0 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */
(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
	typeof define === 'function' && define.amd ? define(['exports'], factory) :
	(factory((global.URI = global.URI || {})));
}(this, (function (exports) { 'use strict';

function merge() {
    for (var _len = arguments.length, sets = Array(_len), _key = 0; _key < _len; _key++) {
        sets[_key] = arguments[_key];
    }

    if (sets.length > 1) {
        sets[0] = sets[0].slice(0, -1);
        var xl = sets.length - 1;
        for (var x = 1; x < xl; ++x) {
            sets[x] = sets[x].slice(1, -1);
        }
        sets[xl] = sets[xl].slice(1);
        return sets.join('');
    } else {
        return sets[0];
    }
}
function subexp(str) {
    return "(?:" + str + ")";
}
function typeOf(o) {
    return o === undefined ? "undefined" : o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase();
}
function toUpperCase(str) {
    return str.toUpperCase();
}
function toArray(obj) {
    return obj !== undefined && obj !== null ? obj instanceof Array ? obj : typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj) : [];
}
function assign(target, source) {
    var obj = target;
    if (source) {
        for (var key in source) {
            obj[key] = source[key];
        }
    }
    return obj;
}

function buildExps(isIRI) {
    var ALPHA$$ = "[A-Za-z]",
        CR$ = "[\\x0D]",
        DIGIT$$ = "[0-9]",
        DQUOTE$$ = "[\\x22]",
        HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"),
        //case-insensitive
    LF$$ = "[\\x0A]",
        SP$$ = "[\\x20]",
        PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)),
        //expanded
    GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]",
        SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]",
        RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),
        UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]",
        //subset, excludes bidi control characters
    IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]",
        //subset
    UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$),
        SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"),
        USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"),
        DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$),
        DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$),
        //relaxed parsing rules
    IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$),
        H16$ = subexp(HEXDIG$$ + "{1,4}"),
        LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$),
        IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$),
        //                           6( h16 ":" ) ls32
    IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$),
        //                      "::" 5( h16 ":" ) ls32
    IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$),
        //[               h16 ] "::" 4( h16 ":" ) ls32
    IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$),
        //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
    IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$),
        //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
    IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$),
        //[ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
    IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$),
        //[ *4( h16 ":" ) h16 ] "::"              ls32
    IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$),
        //[ *5( h16 ":" ) h16 ] "::"              h16
    IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"),
        //[ *6( h16 ":" ) h16 ] "::"
    IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")),
        ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"),
        //RFC 6874
    IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$),
        //RFC 6874
    IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$),
        //RFC 6874, with relaxed parsing rules
    IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"),
        IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"),
        //RFC 6874
    REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"),
        HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$),
        PORT$ = subexp(DIGIT$$ + "*"),
        AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"),
        PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")),
        SEGMENT$ = subexp(PCHAR$ + "*"),
        SEGMENT_NZ$ = subexp(PCHAR$ + "+"),
        SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"),
        PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"),
        PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"),
        //simplified
    PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$),
        //simplified
    PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$),
        //simplified
    PATH_EMPTY$ = "(?!" + PCHAR$ + ")",
        PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$),
        QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"),
        FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"),
        HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$),
        URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"),
        RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$),
        RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"),
        URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$),
        ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"),
        GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$",
        RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$",
        ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$",
        SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$",
        AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$";
    return {
        NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"),
        NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"),
        NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"),
        ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        UNRESERVED: new RegExp(UNRESERVED$$, "g"),
        OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"),
        PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"),
        IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"),
        IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules
    };
}
var URI_PROTOCOL = buildExps(false);

var IRI_PROTOCOL = buildExps(true);

var slicedToArray = function () {
  function sliceIterator(arr, i) {
    var _arr = [];
    var _n = true;
    var _d = false;
    var _e = undefined;

    try {
      for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
        _arr.push(_s.value);

        if (i && _arr.length === i) break;
      }
    } catch (err) {
      _d = true;
      _e = err;
    } finally {
      try {
        if (!_n && _i["return"]) _i["return"]();
      } finally {
        if (_d) throw _e;
      }
    }

    return _arr;
  }

  return function (arr, i) {
    if (Array.isArray(arr)) {
      return arr;
    } else if (Symbol.iterator in Object(arr)) {
      return sliceIterator(arr, i);
    } else {
      throw new TypeError("Invalid attempt to destructure non-iterable instance");
    }
  };
}();













var toConsumableArray = function (arr) {
  if (Array.isArray(arr)) {
    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];

    return arr2;
  } else {
    return Array.from(arr);
  }
};

/** Highest positive signed 32-bit float value */

var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1

/** Bootstring parameters */
var base = 36;
var tMin = 1;
var tMax = 26;
var skew = 38;
var damp = 700;
var initialBias = 72;
var initialN = 128; // 0x80
var delimiter = '-'; // '\x2D'

/** Regular expressions */
var regexPunycode = /^xn--/;
var regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars
var regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators

/** Error messages */
var errors = {
	'overflow': 'Overflow: input needs wider integers to process',
	'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
	'invalid-input': 'Invalid input'
};

/** Convenience shortcuts */
var baseMinusTMin = base - tMin;
var floor = Math.floor;
var stringFromCharCode = String.fromCharCode;

/*--------------------------------------------------------------------------*/

/**
 * A generic error utility function.
 * @private
 * @param {String} type The error type.
 * @returns {Error} Throws a `RangeError` with the applicable error message.
 */
function error$1(type) {
	throw new RangeError(errors[type]);
}

/**
 * A generic `Array#map` utility function.
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} callback The function that gets called for every array
 * item.
 * @returns {Array} A new array of values returned by the callback function.
 */
function map(array, fn) {
	var result = [];
	var length = array.length;
	while (length--) {
		result[length] = fn(array[length]);
	}
	return result;
}

/**
 * A simple `Array#map`-like wrapper to work with domain name strings or email
 * addresses.
 * @private
 * @param {String} domain The domain name or email address.
 * @param {Function} callback The function that gets called for every
 * character.
 * @returns {Array} A new string of characters returned by the callback
 * function.
 */
function mapDomain(string, fn) {
	var parts = string.split('@');
	var result = '';
	if (parts.length > 1) {
		// In email addresses, only the domain name should be punycoded. Leave
		// the local part (i.e. everything up to `@`) intact.
		result = parts[0] + '@';
		string = parts[1];
	}
	// Avoid `split(regex)` for IE8 compatibility. See #17.
	string = string.replace(regexSeparators, '\x2E');
	var labels = string.split('.');
	var encoded = map(labels, fn).join('.');
	return result + encoded;
}

/**
 * Creates an array containing the numeric code points of each Unicode
 * character in the string. While JavaScript uses UCS-2 internally,
 * this function will convert a pair of surrogate halves (each of which
 * UCS-2 exposes as separate characters) into a single code point,
 * matching UTF-16.
 * @see `punycode.ucs2.encode`
 * @see <https://mathiasbynens.be/notes/javascript-encoding>
 * @memberOf punycode.ucs2
 * @name decode
 * @param {String} string The Unicode input string (UCS-2).
 * @returns {Array} The new array of code points.
 */
function ucs2decode(string) {
	var output = [];
	var counter = 0;
	var length = string.length;
	while (counter < length) {
		var value = string.charCodeAt(counter++);
		if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
			// It's a high surrogate, and there is a next character.
			var extra = string.charCodeAt(counter++);
			if ((extra & 0xFC00) == 0xDC00) {
				// Low surrogate.
				output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
			} else {
				// It's an unmatched surrogate; only append this code unit, in case the
				// next code unit is the high surrogate of a surrogate pair.
				output.push(value);
				counter--;
			}
		} else {
			output.push(value);
		}
	}
	return output;
}

/**
 * Creates a string based on an array of numeric code points.
 * @see `punycode.ucs2.decode`
 * @memberOf punycode.ucs2
 * @name encode
 * @param {Array} codePoints The array of numeric code points.
 * @returns {String} The new Unicode string (UCS-2).
 */
var ucs2encode = function ucs2encode(array) {
	return String.fromCodePoint.apply(String, toConsumableArray(array));
};

/**
 * Converts a basic code point into a digit/integer.
 * @see `digitToBasic()`
 * @private
 * @param {Number} codePoint The basic numeric code point value.
 * @returns {Number} The numeric value of a basic code point (for use in
 * representing integers) in the range `0` to `base - 1`, or `base` if
 * the code point does not represent a value.
 */
var basicToDigit = function basicToDigit(codePoint) {
	if (codePoint - 0x30 < 0x0A) {
		return codePoint - 0x16;
	}
	if (codePoint - 0x41 < 0x1A) {
		return codePoint - 0x41;
	}
	if (codePoint - 0x61 < 0x1A) {
		return codePoint - 0x61;
	}
	return base;
};

/**
 * Converts a digit/integer into a basic code point.
 * @see `basicToDigit()`
 * @private
 * @param {Number} digit The numeric value of a basic code point.
 * @returns {Number} The basic code point whose value (when used for
 * representing integers) is `digit`, which needs to be in the range
 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
 * used; else, the lowercase form is used. The behavior is undefined
 * if `flag` is non-zero and `digit` has no uppercase form.
 */
var digitToBasic = function digitToBasic(digit, flag) {
	//  0..25 map to ASCII a..z or A..Z
	// 26..35 map to ASCII 0..9
	return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
};

/**
 * Bias adaptation function as per section 3.4 of RFC 3492.
 * https://tools.ietf.org/html/rfc3492#section-3.4
 * @private
 */
var adapt = function adapt(delta, numPoints, firstTime) {
	var k = 0;
	delta = firstTime ? floor(delta / damp) : delta >> 1;
	delta += floor(delta / numPoints);
	for (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) {
		delta = floor(delta / baseMinusTMin);
	}
	return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
};

/**
 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
 * symbols.
 * @memberOf punycode
 * @param {String} input The Punycode string of ASCII-only symbols.
 * @returns {String} The resulting string of Unicode symbols.
 */
var decode = function decode(input) {
	// Don't use UCS-2.
	var output = [];
	var inputLength = input.length;
	var i = 0;
	var n = initialN;
	var bias = initialBias;

	// Handle the basic code points: let `basic` be the number of input code
	// points before the last delimiter, or `0` if there is none, then copy
	// the first basic code points to the output.

	var basic = input.lastIndexOf(delimiter);
	if (basic < 0) {
		basic = 0;
	}

	for (var j = 0; j < basic; ++j) {
		// if it's not a basic code point
		if (input.charCodeAt(j) >= 0x80) {
			error$1('not-basic');
		}
		output.push(input.charCodeAt(j));
	}

	// Main decoding loop: start just after the last delimiter if any basic code
	// points were copied; start at the beginning otherwise.

	for (var index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{

		// `index` is the index of the next character to be consumed.
		// Decode a generalized variable-length integer into `delta`,
		// which gets added to `i`. The overflow checking is easier
		// if we increase `i` as we go, then subtract off its starting
		// value at the end to obtain `delta`.
		var oldi = i;
		for (var w = 1, k = base;; /* no condition */k += base) {

			if (index >= inputLength) {
				error$1('invalid-input');
			}

			var digit = basicToDigit(input.charCodeAt(index++));

			if (digit >= base || digit > floor((maxInt - i) / w)) {
				error$1('overflow');
			}

			i += digit * w;
			var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;

			if (digit < t) {
				break;
			}

			var baseMinusT = base - t;
			if (w > floor(maxInt / baseMinusT)) {
				error$1('overflow');
			}

			w *= baseMinusT;
		}

		var out = output.length + 1;
		bias = adapt(i - oldi, out, oldi == 0);

		// `i` was supposed to wrap around from `out` to `0`,
		// incrementing `n` each time, so we'll fix that now:
		if (floor(i / out) > maxInt - n) {
			error$1('overflow');
		}

		n += floor(i / out);
		i %= out;

		// Insert `n` at position `i` of the output.
		output.splice(i++, 0, n);
	}

	return String.fromCodePoint.apply(String, output);
};

/**
 * Converts a string of Unicode symbols (e.g. a domain name label) to a
 * Punycode string of ASCII-only symbols.
 * @memberOf punycode
 * @param {String} input The string of Unicode symbols.
 * @returns {String} The resulting Punycode string of ASCII-only symbols.
 */
var encode = function encode(input) {
	var output = [];

	// Convert the input in UCS-2 to an array of Unicode code points.
	input = ucs2decode(input);

	// Cache the length.
	var inputLength = input.length;

	// Initialize the state.
	var n = initialN;
	var delta = 0;
	var bias = initialBias;

	// Handle the basic code points.
	var _iteratorNormalCompletion = true;
	var _didIteratorError = false;
	var _iteratorError = undefined;

	try {
		for (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
			var _currentValue2 = _step.value;

			if (_currentValue2 < 0x80) {
				output.push(stringFromCharCode(_currentValue2));
			}
		}
	} catch (err) {
		_didIteratorError = true;
		_iteratorError = err;
	} finally {
		try {
			if (!_iteratorNormalCompletion && _iterator.return) {
				_iterator.return();
			}
		} finally {
			if (_didIteratorError) {
				throw _iteratorError;
			}
		}
	}

	var basicLength = output.length;
	var handledCPCount = basicLength;

	// `handledCPCount` is the number of code points that have been handled;
	// `basicLength` is the number of basic code points.

	// Finish the basic string with a delimiter unless it's empty.
	if (basicLength) {
		output.push(delimiter);
	}

	// Main encoding loop:
	while (handledCPCount < inputLength) {

		// All non-basic code points < n have been handled already. Find the next
		// larger one:
		var m = maxInt;
		var _iteratorNormalCompletion2 = true;
		var _didIteratorError2 = false;
		var _iteratorError2 = undefined;

		try {
			for (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
				var currentValue = _step2.value;

				if (currentValue >= n && currentValue < m) {
					m = currentValue;
				}
			}

			// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
			// but guard against overflow.
		} catch (err) {
			_didIteratorError2 = true;
			_iteratorError2 = err;
		} finally {
			try {
				if (!_iteratorNormalCompletion2 && _iterator2.return) {
					_iterator2.return();
				}
			} finally {
				if (_didIteratorError2) {
					throw _iteratorError2;
				}
			}
		}

		var handledCPCountPlusOne = handledCPCount + 1;
		if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
			error$1('overflow');
		}

		delta += (m - n) * handledCPCountPlusOne;
		n = m;

		var _iteratorNormalCompletion3 = true;
		var _didIteratorError3 = false;
		var _iteratorError3 = undefined;

		try {
			for (var _iterator3 = input[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
				var _currentValue = _step3.value;

				if (_currentValue < n && ++delta > maxInt) {
					error$1('overflow');
				}
				if (_currentValue == n) {
					// Represent delta as a generalized variable-length integer.
					var q = delta;
					for (var k = base;; /* no condition */k += base) {
						var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
						if (q < t) {
							break;
						}
						var qMinusT = q - t;
						var baseMinusT = base - t;
						output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));
						q = floor(qMinusT / baseMinusT);
					}

					output.push(stringFromCharCode(digitToBasic(q, 0)));
					bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
					delta = 0;
					++handledCPCount;
				}
			}
		} catch (err) {
			_didIteratorError3 = true;
			_iteratorError3 = err;
		} finally {
			try {
				if (!_iteratorNormalCompletion3 && _iterator3.return) {
					_iterator3.return();
				}
			} finally {
				if (_didIteratorError3) {
					throw _iteratorError3;
				}
			}
		}

		++delta;
		++n;
	}
	return output.join('');
};

/**
 * Converts a Punycode string representing a domain name or an email address
 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
 * it doesn't matter if you call it on a string that has already been
 * converted to Unicode.
 * @memberOf punycode
 * @param {String} input The Punycoded domain name or email address to
 * convert to Unicode.
 * @returns {String} The Unicode representation of the given Punycode
 * string.
 */
var toUnicode = function toUnicode(input) {
	return mapDomain(input, function (string) {
		return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;
	});
};

/**
 * Converts a Unicode string representing a domain name or an email address to
 * Punycode. Only the non-ASCII parts of the domain name will be converted,
 * i.e. it doesn't matter if you call it with a domain that's already in
 * ASCII.
 * @memberOf punycode
 * @param {String} input The domain name or email address to convert, as a
 * Unicode string.
 * @returns {String} The Punycode representation of the given domain name or
 * email address.
 */
var toASCII = function toASCII(input) {
	return mapDomain(input, function (string) {
		return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;
	});
};

/*--------------------------------------------------------------------------*/

/** Define the public API */
var punycode = {
	/**
  * A string representing the current Punycode.js version number.
  * @memberOf punycode
  * @type String
  */
	'version': '2.1.0',
	/**
  * An object of methods to convert from JavaScript's internal character
  * representation (UCS-2) to Unicode code points, and back.
  * @see <https://mathiasbynens.be/notes/javascript-encoding>
  * @memberOf punycode
  * @type Object
  */
	'ucs2': {
		'decode': ucs2decode,
		'encode': ucs2encode
	},
	'decode': decode,
	'encode': encode,
	'toASCII': toASCII,
	'toUnicode': toUnicode
};

/**
 * URI.js
 *
 * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.
 * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
 * @see http://github.com/garycourt/uri-js
 */
/**
 * Copyright 2011 Gary Court. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 *    1. Redistributions of source code must retain the above copyright notice, this list of
 *       conditions and the following disclaimer.
 *
 *    2. Redistributions in binary form must reproduce the above copyright notice, this list
 *       of conditions and the following disclaimer in the documentation and/or other materials
 *       provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation are those of the
 * authors and should not be interpreted as representing official policies, either expressed
 * or implied, of Gary Court.
 */
var SCHEMES = {};
function pctEncChar(chr) {
    var c = chr.charCodeAt(0);
    var e = void 0;
    if (c < 16) e = "%0" + c.toString(16).toUpperCase();else if (c < 128) e = "%" + c.toString(16).toUpperCase();else if (c < 2048) e = "%" + (c >> 6 | 192).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();else e = "%" + (c >> 12 | 224).toString(16).toUpperCase() + "%" + (c >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();
    return e;
}
function pctDecChars(str) {
    var newStr = "";
    var i = 0;
    var il = str.length;
    while (i < il) {
        var c = parseInt(str.substr(i + 1, 2), 16);
        if (c < 128) {
            newStr += String.fromCharCode(c);
            i += 3;
        } else if (c >= 194 && c < 224) {
            if (il - i >= 6) {
                var c2 = parseInt(str.substr(i + 4, 2), 16);
                newStr += String.fromCharCode((c & 31) << 6 | c2 & 63);
            } else {
                newStr += str.substr(i, 6);
            }
            i += 6;
        } else if (c >= 224) {
            if (il - i >= 9) {
                var _c = parseInt(str.substr(i + 4, 2), 16);
                var c3 = parseInt(str.substr(i + 7, 2), 16);
                newStr += String.fromCharCode((c & 15) << 12 | (_c & 63) << 6 | c3 & 63);
            } else {
                newStr += str.substr(i, 9);
            }
            i += 9;
        } else {
            newStr += str.substr(i, 3);
            i += 3;
        }
    }
    return newStr;
}
function _normalizeComponentEncoding(components, protocol) {
    function decodeUnreserved(str) {
        var decStr = pctDecChars(str);
        return !decStr.match(protocol.UNRESERVED) ? str : decStr;
    }
    if (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, "");
    if (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    return components;
}

function _stripLeadingZeros(str) {
    return str.replace(/^0*(.*)/, "$1") || "0";
}
function _normalizeIPv4(host, protocol) {
    var matches = host.match(protocol.IPV4ADDRESS) || [];

    var _matches = slicedToArray(matches, 2),
        address = _matches[1];

    if (address) {
        return address.split(".").map(_stripLeadingZeros).join(".");
    } else {
        return host;
    }
}
function _normalizeIPv6(host, protocol) {
    var matches = host.match(protocol.IPV6ADDRESS) || [];

    var _matches2 = slicedToArray(matches, 3),
        address = _matches2[1],
        zone = _matches2[2];

    if (address) {
        var _address$toLowerCase$ = address.toLowerCase().split('::').reverse(),
            _address$toLowerCase$2 = slicedToArray(_address$toLowerCase$, 2),
            last = _address$toLowerCase$2[0],
            first = _address$toLowerCase$2[1];

        var firstFields = first ? first.split(":").map(_stripLeadingZeros) : [];
        var lastFields = last.split(":").map(_stripLeadingZeros);
        var isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);
        var fieldCount = isLastFieldIPv4Address ? 7 : 8;
        var lastFieldsStart = lastFields.length - fieldCount;
        var fields = Array(fieldCount);
        for (var x = 0; x < fieldCount; ++x) {
            fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';
        }
        if (isLastFieldIPv4Address) {
            fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);
        }
        var allZeroFields = fields.reduce(function (acc, field, index) {
            if (!field || field === "0") {
                var lastLongest = acc[acc.length - 1];
                if (lastLongest && lastLongest.index + lastLongest.length === index) {
                    lastLongest.length++;
                } else {
                    acc.push({ index: index, length: 1 });
                }
            }
            return acc;
        }, []);
        var longestZeroFields = allZeroFields.sort(function (a, b) {
            return b.length - a.length;
        })[0];
        var newHost = void 0;
        if (longestZeroFields && longestZeroFields.length > 1) {
            var newFirst = fields.slice(0, longestZeroFields.index);
            var newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);
            newHost = newFirst.join(":") + "::" + newLast.join(":");
        } else {
            newHost = fields.join(":");
        }
        if (zone) {
            newHost += "%" + zone;
        }
        return newHost;
    } else {
        return host;
    }
}
var URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i;
var NO_MATCH_IS_UNDEFINED = "".match(/(){0}/)[1] === undefined;
function parse(uriString) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    var components = {};
    var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;
    if (options.reference === "suffix") uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString;
    var matches = uriString.match(URI_PARSE);
    if (matches) {
        if (NO_MATCH_IS_UNDEFINED) {
            //store each component
            components.scheme = matches[1];
            components.userinfo = matches[3];
            components.host = matches[4];
            components.port = parseInt(matches[5], 10);
            components.path = matches[6] || "";
            components.query = matches[7];
            components.fragment = matches[8];
            //fix port number
            if (isNaN(components.port)) {
                components.port = matches[5];
            }
        } else {
            //IE FIX for improper RegExp matching
            //store each component
            components.scheme = matches[1] || undefined;
            components.userinfo = uriString.indexOf("@") !== -1 ? matches[3] : undefined;
            components.host = uriString.indexOf("//") !== -1 ? matches[4] : undefined;
            components.port = parseInt(matches[5], 10);
            components.path = matches[6] || "";
            components.query = uriString.indexOf("?") !== -1 ? matches[7] : undefined;
            components.fragment = uriString.indexOf("#") !== -1 ? matches[8] : undefined;
            //fix port number
            if (isNaN(components.port)) {
                components.port = uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined;
            }
        }
        if (components.host) {
            //normalize IP hosts
            components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);
        }
        //determine reference type
        if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {
            components.reference = "same-document";
        } else if (components.scheme === undefined) {
            components.reference = "relative";
        } else if (components.fragment === undefined) {
            components.reference = "absolute";
        } else {
            components.reference = "uri";
        }
        //check for reference errors
        if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) {
            components.error = components.error || "URI is not a " + options.reference + " reference.";
        }
        //find scheme handler
        var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
        //check if scheme can't handle IRIs
        if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
            //if host component is a domain name
            if (components.host && (options.domainHost || schemeHandler && schemeHandler.domainHost)) {
                //convert Unicode IDN -> ASCII IDN
                try {
                    components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());
                } catch (e) {
                    components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e;
                }
            }
            //convert IRI -> URI
            _normalizeComponentEncoding(components, URI_PROTOCOL);
        } else {
            //normalize encodings
            _normalizeComponentEncoding(components, protocol);
        }
        //perform scheme specific parsing
        if (schemeHandler && schemeHandler.parse) {
            schemeHandler.parse(components, options);
        }
    } else {
        components.error = components.error || "URI can not be parsed.";
    }
    return components;
}

function _recomposeAuthority(components, options) {
    var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;
    var uriTokens = [];
    if (components.userinfo !== undefined) {
        uriTokens.push(components.userinfo);
        uriTokens.push("@");
    }
    if (components.host !== undefined) {
        //normalize IP hosts, add brackets and escape zone separator for IPv6
        uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, function (_, $1, $2) {
            return "[" + $1 + ($2 ? "%25" + $2 : "") + "]";
        }));
    }
    if (typeof components.port === "number" || typeof components.port === "string") {
        uriTokens.push(":");
        uriTokens.push(String(components.port));
    }
    return uriTokens.length ? uriTokens.join("") : undefined;
}

var RDS1 = /^\.\.?\//;
var RDS2 = /^\/\.(\/|$)/;
var RDS3 = /^\/\.\.(\/|$)/;
var RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/;
function removeDotSegments(input) {
    var output = [];
    while (input.length) {
        if (input.match(RDS1)) {
            input = input.replace(RDS1, "");
        } else if (input.match(RDS2)) {
            input = input.replace(RDS2, "/");
        } else if (input.match(RDS3)) {
            input = input.replace(RDS3, "/");
            output.pop();
        } else if (input === "." || input === "..") {
            input = "";
        } else {
            var im = input.match(RDS5);
            if (im) {
                var s = im[0];
                input = input.slice(s.length);
                output.push(s);
            } else {
                throw new Error("Unexpected dot segment condition");
            }
        }
    }
    return output.join("");
}

function serialize(components) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    var protocol = options.iri ? IRI_PROTOCOL : URI_PROTOCOL;
    var uriTokens = [];
    //find scheme handler
    var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
    //perform scheme specific serialization
    if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);
    if (components.host) {
        //if host component is an IPv6 address
        if (protocol.IPV6ADDRESS.test(components.host)) {}
        //TODO: normalize IPv6 address as per RFC 5952

        //if host component is a domain name
        else if (options.domainHost || schemeHandler && schemeHandler.domainHost) {
                //convert IDN via punycode
                try {
                    components.host = !options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host);
                } catch (e) {
                    components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
                }
            }
    }
    //normalize encoding
    _normalizeComponentEncoding(components, protocol);
    if (options.reference !== "suffix" && components.scheme) {
        uriTokens.push(components.scheme);
        uriTokens.push(":");
    }
    var authority = _recomposeAuthority(components, options);
    if (authority !== undefined) {
        if (options.reference !== "suffix") {
            uriTokens.push("//");
        }
        uriTokens.push(authority);
        if (components.path && components.path.charAt(0) !== "/") {
            uriTokens.push("/");
        }
    }
    if (components.path !== undefined) {
        var s = components.path;
        if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
            s = removeDotSegments(s);
        }
        if (authority === undefined) {
            s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//"
        }
        uriTokens.push(s);
    }
    if (components.query !== undefined) {
        uriTokens.push("?");
        uriTokens.push(components.query);
    }
    if (components.fragment !== undefined) {
        uriTokens.push("#");
        uriTokens.push(components.fragment);
    }
    return uriTokens.join(""); //merge tokens into a string
}

function resolveComponents(base, relative) {
    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
    var skipNormalization = arguments[3];

    var target = {};
    if (!skipNormalization) {
        base = parse(serialize(base, options), options); //normalize base components
        relative = parse(serialize(relative, options), options); //normalize relative components
    }
    options = options || {};
    if (!options.tolerant && relative.scheme) {
        target.scheme = relative.scheme;
        //target.authority = relative.authority;
        target.userinfo = relative.userinfo;
        target.host = relative.host;
        target.port = relative.port;
        target.path = removeDotSegments(relative.path || "");
        target.query = relative.query;
    } else {
        if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {
            //target.authority = relative.authority;
            target.userinfo = relative.userinfo;
            target.host = relative.host;
            target.port = relative.port;
            target.path = removeDotSegments(relative.path || "");
            target.query = relative.query;
        } else {
            if (!relative.path) {
                target.path = base.path;
                if (relative.query !== undefined) {
                    target.query = relative.query;
                } else {
                    target.query = base.query;
                }
            } else {
                if (relative.path.charAt(0) === "/") {
                    target.path = removeDotSegments(relative.path);
                } else {
                    if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {
                        target.path = "/" + relative.path;
                    } else if (!base.path) {
                        target.path = relative.path;
                    } else {
                        target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path;
                    }
                    target.path = removeDotSegments(target.path);
                }
                target.query = relative.query;
            }
            //target.authority = base.authority;
            target.userinfo = base.userinfo;
            target.host = base.host;
            target.port = base.port;
        }
        target.scheme = base.scheme;
    }
    target.fragment = relative.fragment;
    return target;
}

function resolve(baseURI, relativeURI, options) {
    var schemelessOptions = assign({ scheme: 'null' }, options);
    return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);
}

function normalize(uri, options) {
    if (typeof uri === "string") {
        uri = serialize(parse(uri, options), options);
    } else if (typeOf(uri) === "object") {
        uri = parse(serialize(uri, options), options);
    }
    return uri;
}

function equal(uriA, uriB, options) {
    if (typeof uriA === "string") {
        uriA = serialize(parse(uriA, options), options);
    } else if (typeOf(uriA) === "object") {
        uriA = serialize(uriA, options);
    }
    if (typeof uriB === "string") {
        uriB = serialize(parse(uriB, options), options);
    } else if (typeOf(uriB) === "object") {
        uriB = serialize(uriB, options);
    }
    return uriA === uriB;
}

function escapeComponent(str, options) {
    return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE, pctEncChar);
}

function unescapeComponent(str, options) {
    return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED, pctDecChars);
}

var handler = {
    scheme: "http",
    domainHost: true,
    parse: function parse(components, options) {
        //report missing host
        if (!components.host) {
            components.error = components.error || "HTTP URIs must have a host.";
        }
        return components;
    },
    serialize: function serialize(components, options) {
        var secure = String(components.scheme).toLowerCase() === "https";
        //normalize the default port
        if (components.port === (secure ? 443 : 80) || components.port === "") {
            components.port = undefined;
        }
        //normalize the empty path
        if (!components.path) {
            components.path = "/";
        }
        //NOTE: We do not parse query strings for HTTP URIs
        //as WWW Form Url Encoded query strings are part of the HTML4+ spec,
        //and not the HTTP spec.
        return components;
    }
};

var handler$1 = {
    scheme: "https",
    domainHost: handler.domainHost,
    parse: handler.parse,
    serialize: handler.serialize
};

function isSecure(wsComponents) {
    return typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === "wss";
}
//RFC 6455
var handler$2 = {
    scheme: "ws",
    domainHost: true,
    parse: function parse(components, options) {
        var wsComponents = components;
        //indicate if the secure flag is set
        wsComponents.secure = isSecure(wsComponents);
        //construct resouce name
        wsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');
        wsComponents.path = undefined;
        wsComponents.query = undefined;
        return wsComponents;
    },
    serialize: function serialize(wsComponents, options) {
        //normalize the default port
        if (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === "") {
            wsComponents.port = undefined;
        }
        //ensure scheme matches secure flag
        if (typeof wsComponents.secure === 'boolean') {
            wsComponents.scheme = wsComponents.secure ? 'wss' : 'ws';
            wsComponents.secure = undefined;
        }
        //reconstruct path from resource name
        if (wsComponents.resourceName) {
            var _wsComponents$resourc = wsComponents.resourceName.split('?'),
                _wsComponents$resourc2 = slicedToArray(_wsComponents$resourc, 2),
                path = _wsComponents$resourc2[0],
                query = _wsComponents$resourc2[1];

            wsComponents.path = path && path !== '/' ? path : undefined;
            wsComponents.query = query;
            wsComponents.resourceName = undefined;
        }
        //forbid fragment component
        wsComponents.fragment = undefined;
        return wsComponents;
    }
};

var handler$3 = {
    scheme: "wss",
    domainHost: handler$2.domainHost,
    parse: handler$2.parse,
    serialize: handler$2.serialize
};

var O = {};
var isIRI = true;
//RFC 3986
var UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]";
var HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive
var PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded
//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =
//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]";  //(%d1-8 / %d11-12 / %d14-31 / %d127)
//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$);  //%d33 / %d35-91 / %d93-126 / obs-qtext
//const VCHAR$$ = "[\\x21-\\x7E]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$));  //%d0 / CR / LF / obs-qtext
//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+");
//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$);
//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"');
var ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]";
var QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]";
var VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]");
var SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]";
var UNRESERVED = new RegExp(UNRESERVED$$, "g");
var PCT_ENCODED = new RegExp(PCT_ENCODED$, "g");
var NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g");
var NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g");
var NOT_HFVALUE = NOT_HFNAME;
function decodeUnreserved(str) {
    var decStr = pctDecChars(str);
    return !decStr.match(UNRESERVED) ? str : decStr;
}
var handler$4 = {
    scheme: "mailto",
    parse: function parse$$1(components, options) {
        var mailtoComponents = components;
        var to = mailtoComponents.to = mailtoComponents.path ? mailtoComponents.path.split(",") : [];
        mailtoComponents.path = undefined;
        if (mailtoComponents.query) {
            var unknownHeaders = false;
            var headers = {};
            var hfields = mailtoComponents.query.split("&");
            for (var x = 0, xl = hfields.length; x < xl; ++x) {
                var hfield = hfields[x].split("=");
                switch (hfield[0]) {
                    case "to":
                        var toAddrs = hfield[1].split(",");
                        for (var _x = 0, _xl = toAddrs.length; _x < _xl; ++_x) {
                            to.push(toAddrs[_x]);
                        }
                        break;
                    case "subject":
                        mailtoComponents.subject = unescapeComponent(hfield[1], options);
                        break;
                    case "body":
                        mailtoComponents.body = unescapeComponent(hfield[1], options);
                        break;
                    default:
                        unknownHeaders = true;
                        headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);
                        break;
                }
            }
            if (unknownHeaders) mailtoComponents.headers = headers;
        }
        mailtoComponents.query = undefined;
        for (var _x2 = 0, _xl2 = to.length; _x2 < _xl2; ++_x2) {
            var addr = to[_x2].split("@");
            addr[0] = unescapeComponent(addr[0]);
            if (!options.unicodeSupport) {
                //convert Unicode IDN -> ASCII IDN
                try {
                    addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());
                } catch (e) {
                    mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e;
                }
            } else {
                addr[1] = unescapeComponent(addr[1], options).toLowerCase();
            }
            to[_x2] = addr.join("@");
        }
        return mailtoComponents;
    },
    serialize: function serialize$$1(mailtoComponents, options) {
        var components = mailtoComponents;
        var to = toArray(mailtoComponents.to);
        if (to) {
            for (var x = 0, xl = to.length; x < xl; ++x) {
                var toAddr = String(to[x]);
                var atIdx = toAddr.lastIndexOf("@");
                var localPart = toAddr.slice(0, atIdx).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);
                var domain = toAddr.slice(atIdx + 1);
                //convert IDN via punycode
                try {
                    domain = !options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain);
                } catch (e) {
                    components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
                }
                to[x] = localPart + "@" + domain;
            }
            components.path = to.join(",");
        }
        var headers = mailtoComponents.headers = mailtoComponents.headers || {};
        if (mailtoComponents.subject) headers["subject"] = mailtoComponents.subject;
        if (mailtoComponents.body) headers["body"] = mailtoComponents.body;
        var fields = [];
        for (var name in headers) {
            if (headers[name] !== O[name]) {
                fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + "=" + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar));
            }
        }
        if (fields.length) {
            components.query = fields.join("&");
        }
        return components;
    }
};

var URN_PARSE = /^([^\:]+)\:(.*)/;
//RFC 2141
var handler$5 = {
    scheme: "urn",
    parse: function parse$$1(components, options) {
        var matches = components.path && components.path.match(URN_PARSE);
        var urnComponents = components;
        if (matches) {
            var scheme = options.scheme || urnComponents.scheme || "urn";
            var nid = matches[1].toLowerCase();
            var nss = matches[2];
            var urnScheme = scheme + ":" + (options.nid || nid);
            var schemeHandler = SCHEMES[urnScheme];
            urnComponents.nid = nid;
            urnComponents.nss = nss;
            urnComponents.path = undefined;
            if (schemeHandler) {
                urnComponents = schemeHandler.parse(urnComponents, options);
            }
        } else {
            urnComponents.error = urnComponents.error || "URN can not be parsed.";
        }
        return urnComponents;
    },
    serialize: function serialize$$1(urnComponents, options) {
        var scheme = options.scheme || urnComponents.scheme || "urn";
        var nid = urnComponents.nid;
        var urnScheme = scheme + ":" + (options.nid || nid);
        var schemeHandler = SCHEMES[urnScheme];
        if (schemeHandler) {
            urnComponents = schemeHandler.serialize(urnComponents, options);
        }
        var uriComponents = urnComponents;
        var nss = urnComponents.nss;
        uriComponents.path = (nid || options.nid) + ":" + nss;
        return uriComponents;
    }
};

var UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/;
//RFC 4122
var handler$6 = {
    scheme: "urn:uuid",
    parse: function parse(urnComponents, options) {
        var uuidComponents = urnComponents;
        uuidComponents.uuid = uuidComponents.nss;
        uuidComponents.nss = undefined;
        if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {
            uuidComponents.error = uuidComponents.error || "UUID is not valid.";
        }
        return uuidComponents;
    },
    serialize: function serialize(uuidComponents, options) {
        var urnComponents = uuidComponents;
        //normalize UUID
        urnComponents.nss = (uuidComponents.uuid || "").toLowerCase();
        return urnComponents;
    }
};

SCHEMES[handler.scheme] = handler;
SCHEMES[handler$1.scheme] = handler$1;
SCHEMES[handler$2.scheme] = handler$2;
SCHEMES[handler$3.scheme] = handler$3;
SCHEMES[handler$4.scheme] = handler$4;
SCHEMES[handler$5.scheme] = handler$5;
SCHEMES[handler$6.scheme] = handler$6;

exports.SCHEMES = SCHEMES;
exports.pctEncChar = pctEncChar;
exports.pctDecChars = pctDecChars;
exports.parse = parse;
exports.removeDotSegments = removeDotSegments;
exports.serialize = serialize;
exports.resolveComponents = resolveComponents;
exports.resolve = resolve;
exports.normalize = normalize;
exports.equal = equal;
exports.escapeComponent = escapeComponent;
exports.unescapeComponent = unescapeComponent;

Object.defineProperty(exports, '__esModule', { value: true });

})));


},{}],"ajv":[function(require,module,exports){
'use strict';

var compileSchema = require('./compile')
  , resolve = require('./compile/resolve')
  , Cache = require('./cache')
  , SchemaObject = require('./compile/schema_obj')
  , stableStringify = require('fast-json-stable-stringify')
  , formats = require('./compile/formats')
  , rules = require('./compile/rules')
  , $dataMetaSchema = require('./data')
  , util = require('./compile/util');

module.exports = Ajv;

Ajv.prototype.validate = validate;
Ajv.prototype.compile = compile;
Ajv.prototype.addSchema = addSchema;
Ajv.prototype.addMetaSchema = addMetaSchema;
Ajv.prototype.validateSchema = validateSchema;
Ajv.prototype.getSchema = getSchema;
Ajv.prototype.removeSchema = removeSchema;
Ajv.prototype.addFormat = addFormat;
Ajv.prototype.errorsText = errorsText;

Ajv.prototype._addSchema = _addSchema;
Ajv.prototype._compile = _compile;

Ajv.prototype.compileAsync = require('./compile/async');
var customKeyword = require('./keyword');
Ajv.prototype.addKeyword = customKeyword.add;
Ajv.prototype.getKeyword = customKeyword.get;
Ajv.prototype.removeKeyword = customKeyword.remove;
Ajv.prototype.validateKeyword = customKeyword.validate;

var errorClasses = require('./compile/error_classes');
Ajv.ValidationError = errorClasses.Validation;
Ajv.MissingRefError = errorClasses.MissingRef;
Ajv.$dataMetaSchema = $dataMetaSchema;

var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema';

var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ];
var META_SUPPORT_DATA = ['/properties'];

/**
 * Creates validator instance.
 * Usage: `Ajv(opts)`
 * @param {Object} opts optional options
 * @return {Object} ajv instance
 */
function Ajv(opts) {
  if (!(this instanceof Ajv)) return new Ajv(opts);
  opts = this._opts = util.copy(opts) || {};
  setLogger(this);
  this._schemas = {};
  this._refs = {};
  this._fragments = {};
  this._formats = formats(opts.format);

  this._cache = opts.cache || new Cache;
  this._loadingSchemas = {};
  this._compilations = [];
  this.RULES = rules();
  this._getId = chooseGetId(opts);

  opts.loopRequired = opts.loopRequired || Infinity;
  if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true;
  if (opts.serialize === undefined) opts.serialize = stableStringify;
  this._metaOpts = getMetaSchemaOptions(this);

  if (opts.formats) addInitialFormats(this);
  if (opts.keywords) addInitialKeywords(this);
  addDefaultMetaSchema(this);
  if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta);
  if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}});
  addInitialSchemas(this);
}



/**
 * Validate data using schema
 * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize.
 * @this   Ajv
 * @param  {String|Object} schemaKeyRef key, ref or schema object
 * @param  {Any} data to be validated
 * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`).
 */
function validate(schemaKeyRef, data) {
  var v;
  if (typeof schemaKeyRef == 'string') {
    v = this.getSchema(schemaKeyRef);
    if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"');
  } else {
    var schemaObj = this._addSchema(schemaKeyRef);
    v = schemaObj.validate || this._compile(schemaObj);
  }

  var valid = v(data);
  if (v.$async !== true) this.errors = v.errors;
  return valid;
}


/**
 * Create validating function for passed schema.
 * @this   Ajv
 * @param  {Object} schema schema object
 * @param  {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords.
 * @return {Function} validating function
 */
function compile(schema, _meta) {
  var schemaObj = this._addSchema(schema, undefined, _meta);
  return schemaObj.validate || this._compile(schemaObj);
}


/**
 * Adds schema to the instance.
 * @this   Ajv
 * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored.
 * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`.
 * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead.
 * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead.
 * @return {Ajv} this for method chaining
 */
function addSchema(schema, key, _skipValidation, _meta) {
  if (Array.isArray(schema)){
    for (var i=0; i<schema.length; i++) this.addSchema(schema[i], undefined, _skipValidation, _meta);
    return this;
  }
  var id = this._getId(schema);
  if (id !== undefined && typeof id != 'string')
    throw new Error('schema id must be string');
  key = resolve.normalizeId(key || id);
  checkUnique(this, key);
  this._schemas[key] = this._addSchema(schema, _skipValidation, _meta, true);
  return this;
}


/**
 * Add schema that will be used to validate other schemas
 * options in META_IGNORE_OPTIONS are alway set to false
 * @this   Ajv
 * @param {Object} schema schema object
 * @param {String} key optional schema key
 * @param {Boolean} skipValidation true to skip schema validation, can be used to override validateSchema option for meta-schema
 * @return {Ajv} this for method chaining
 */
function addMetaSchema(schema, key, skipValidation) {
  this.addSchema(schema, key, skipValidation, true);
  return this;
}


/**
 * Validate schema
 * @this   Ajv
 * @param {Object} schema schema to validate
 * @param {Boolean} throwOrLogError pass true to throw (or log) an error if invalid
 * @return {Boolean} true if schema is valid
 */
function validateSchema(schema, throwOrLogError) {
  var $schema = schema.$schema;
  if ($schema !== undefined && typeof $schema != 'string')
    throw new Error('$schema must be a string');
  $schema = $schema || this._opts.defaultMeta || defaultMeta(this);
  if (!$schema) {
    this.logger.warn('meta-schema not available');
    this.errors = null;
    return true;
  }
  var valid = this.validate($schema, schema);
  if (!valid && throwOrLogError) {
    var message = 'schema is invalid: ' + this.errorsText();
    if (this._opts.validateSchema == 'log') this.logger.error(message);
    else throw new Error(message);
  }
  return valid;
}


function defaultMeta(self) {
  var meta = self._opts.meta;
  self._opts.defaultMeta = typeof meta == 'object'
                            ? self._getId(meta) || meta
                            : self.getSchema(META_SCHEMA_ID)
                              ? META_SCHEMA_ID
                              : undefined;
  return self._opts.defaultMeta;
}


/**
 * Get compiled schema from the instance by `key` or `ref`.
 * @this   Ajv
 * @param  {String} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id).
 * @return {Function} schema validating function (with property `schema`).
 */
function getSchema(keyRef) {
  var schemaObj = _getSchemaObj(this, keyRef);
  switch (typeof schemaObj) {
    case 'object': return schemaObj.validate || this._compile(schemaObj);
    case 'string': return this.getSchema(schemaObj);
    case 'undefined': return _getSchemaFragment(this, keyRef);
  }
}


function _getSchemaFragment(self, ref) {
  var res = resolve.schema.call(self, { schema: {} }, ref);
  if (res) {
    var schema = res.schema
      , root = res.root
      , baseId = res.baseId;
    var v = compileSchema.call(self, schema, root, undefined, baseId);
    self._fragments[ref] = new SchemaObject({
      ref: ref,
      fragment: true,
      schema: schema,
      root: root,
      baseId: baseId,
      validate: v
    });
    return v;
  }
}


function _getSchemaObj(self, keyRef) {
  keyRef = resolve.normalizeId(keyRef);
  return self._schemas[keyRef] || self._refs[keyRef] || self._fragments[keyRef];
}


/**
 * Remove cached schema(s).
 * If no parameter is passed all schemas but meta-schemas are removed.
 * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed.
 * Even if schema is referenced by other schemas it still can be removed as other schemas have local references.
 * @this   Ajv
 * @param  {String|Object|RegExp} schemaKeyRef key, ref, pattern to match key/ref or schema object
 * @return {Ajv} this for method chaining
 */
function removeSchema(schemaKeyRef) {
  if (schemaKeyRef instanceof RegExp) {
    _removeAllSchemas(this, this._schemas, schemaKeyRef);
    _removeAllSchemas(this, this._refs, schemaKeyRef);
    return this;
  }
  switch (typeof schemaKeyRef) {
    case 'undefined':
      _removeAllSchemas(this, this._schemas);
      _removeAllSchemas(this, this._refs);
      this._cache.clear();
      return this;
    case 'string':
      var schemaObj = _getSchemaObj(this, schemaKeyRef);
      if (schemaObj) this._cache.del(schemaObj.cacheKey);
      delete this._schemas[schemaKeyRef];
      delete this._refs[schemaKeyRef];
      return this;
    case 'object':
      var serialize = this._opts.serialize;
      var cacheKey = serialize ? serialize(schemaKeyRef) : schemaKeyRef;
      this._cache.del(cacheKey);
      var id = this._getId(schemaKeyRef);
      if (id) {
        id = resolve.normalizeId(id);
        delete this._schemas[id];
        delete this._refs[id];
      }
  }
  return this;
}


function _removeAllSchemas(self, schemas, regex) {
  for (var keyRef in schemas) {
    var schemaObj = schemas[keyRef];
    if (!schemaObj.meta && (!regex || regex.test(keyRef))) {
      self._cache.del(schemaObj.cacheKey);
      delete schemas[keyRef];
    }
  }
}


/* @this   Ajv */
function _addSchema(schema, skipValidation, meta, shouldAddSchema) {
  if (typeof schema != 'object' && typeof schema != 'boolean')
    throw new Error('schema should be object or boolean');
  var serialize = this._opts.serialize;
  var cacheKey = serialize ? serialize(schema) : schema;
  var cached = this._cache.get(cacheKey);
  if (cached) return cached;

  shouldAddSchema = shouldAddSchema || this._opts.addUsedSchema !== false;

  var id = resolve.normalizeId(this._getId(schema));
  if (id && shouldAddSchema) checkUnique(this, id);

  var willValidate = this._opts.validateSchema !== false && !skipValidation;
  var recursiveMeta;
  if (willValidate && !(recursiveMeta = id && id == resolve.normalizeId(schema.$schema)))
    this.validateSchema(schema, true);

  var localRefs = resolve.ids.call(this, schema);

  var schemaObj = new SchemaObject({
    id: id,
    schema: schema,
    localRefs: localRefs,
    cacheKey: cacheKey,
    meta: meta
  });

  if (id[0] != '#' && shouldAddSchema) this._refs[id] = schemaObj;
  this._cache.put(cacheKey, schemaObj);

  if (willValidate && recursiveMeta) this.validateSchema(schema, true);

  return schemaObj;
}


/* @this   Ajv */
function _compile(schemaObj, root) {
  if (schemaObj.compiling) {
    schemaObj.validate = callValidate;
    callValidate.schema = schemaObj.schema;
    callValidate.errors = null;
    callValidate.root = root ? root : callValidate;
    if (schemaObj.schema.$async === true)
      callValidate.$async = true;
    return callValidate;
  }
  schemaObj.compiling = true;

  var currentOpts;
  if (schemaObj.meta) {
    currentOpts = this._opts;
    this._opts = this._metaOpts;
  }

  var v;
  try { v = compileSchema.call(this, schemaObj.schema, root, schemaObj.localRefs); }
  catch(e) {
    delete schemaObj.validate;
    throw e;
  }
  finally {
    schemaObj.compiling = false;
    if (schemaObj.meta) this._opts = currentOpts;
  }

  schemaObj.validate = v;
  schemaObj.refs = v.refs;
  schemaObj.refVal = v.refVal;
  schemaObj.root = v.root;
  return v;


  /* @this   {*} - custom context, see passContext option */
  function callValidate() {
    /* jshint validthis: true */
    var _validate = schemaObj.validate;
    var result = _validate.apply(this, arguments);
    callValidate.errors = _validate.errors;
    return result;
  }
}


function chooseGetId(opts) {
  switch (opts.schemaId) {
    case 'auto': return _get$IdOrId;
    case 'id': return _getId;
    default: return _get$Id;
  }
}

/* @this   Ajv */
function _getId(schema) {
  if (schema.$id) this.logger.warn('schema $id ignored', schema.$id);
  return schema.id;
}

/* @this   Ajv */
function _get$Id(schema) {
  if (schema.id) this.logger.warn('schema id ignored', schema.id);
  return schema.$id;
}


function _get$IdOrId(schema) {
  if (schema.$id && schema.id && schema.$id != schema.id)
    throw new Error('schema $id is different from id');
  return schema.$id || schema.id;
}


/**
 * Convert array of error message objects to string
 * @this   Ajv
 * @param  {Array<Object>} errors optional array of validation errors, if not passed errors from the instance are used.
 * @param  {Object} options optional options with properties `separator` and `dataVar`.
 * @return {String} human readable string with all errors descriptions
 */
function errorsText(errors, options) {
  errors = errors || this.errors;
  if (!errors) return 'No errors';
  options = options || {};
  var separator = options.separator === undefined ? ', ' : options.separator;
  var dataVar = options.dataVar === undefined ? 'data' : options.dataVar;

  var text = '';
  for (var i=0; i<errors.length; i++) {
    var e = errors[i];
    if (e) text += dataVar + e.dataPath + ' ' + e.message + separator;
  }
  return text.slice(0, -separator.length);
}


/**
 * Add custom format
 * @this   Ajv
 * @param {String} name format name
 * @param {String|RegExp|Function} format string is converted to RegExp; function should return boolean (true when valid)
 * @return {Ajv} this for method chaining
 */
function addFormat(name, format) {
  if (typeof format == 'string') format = new RegExp(format);
  this._formats[name] = format;
  return this;
}


function addDefaultMetaSchema(self) {
  var $dataSchema;
  if (self._opts.$data) {
    $dataSchema = require('./refs/data.json');
    self.addMetaSchema($dataSchema, $dataSchema.$id, true);
  }
  if (self._opts.meta === false) return;
  var metaSchema = require('./refs/json-schema-draft-07.json');
  if (self._opts.$data) metaSchema = $dataMetaSchema(metaSchema, META_SUPPORT_DATA);
  self.addMetaSchema(metaSchema, META_SCHEMA_ID, true);
  self._refs['http://json-schema.org/schema'] = META_SCHEMA_ID;
}


function addInitialSchemas(self) {
  var optsSchemas = self._opts.schemas;
  if (!optsSchemas) return;
  if (Array.isArray(optsSchemas)) self.addSchema(optsSchemas);
  else for (var key in optsSchemas) self.addSchema(optsSchemas[key], key);
}


function addInitialFormats(self) {
  for (var name in self._opts.formats) {
    var format = self._opts.formats[name];
    self.addFormat(name, format);
  }
}


function addInitialKeywords(self) {
  for (var name in self._opts.keywords) {
    var keyword = self._opts.keywords[name];
    self.addKeyword(name, keyword);
  }
}


function checkUnique(self, id) {
  if (self._schemas[id] || self._refs[id])
    throw new Error('schema with key or id "' + id + '" already exists');
}


function getMetaSchemaOptions(self) {
  var metaOpts = util.copy(self._opts);
  for (var i=0; i<META_IGNORE_OPTIONS.length; i++)
    delete metaOpts[META_IGNORE_OPTIONS[i]];
  return metaOpts;
}


function setLogger(self) {
  var logger = self._opts.logger;
  if (logger === false) {
    self.logger = {log: noop, warn: noop, error: noop};
  } else {
    if (logger === undefined) logger = console;
    if (!(typeof logger == 'object' && logger.log && logger.warn && logger.error))
      throw new Error('logger must implement log, warn and error methods');
    self.logger = logger;
  }
}


function noop() {}

},{"./cache":1,"./compile":5,"./compile/async":2,"./compile/error_classes":3,"./compile/formats":4,"./compile/resolve":6,"./compile/rules":7,"./compile/schema_obj":8,"./compile/util":10,"./data":11,"./keyword":39,"./refs/data.json":40,"./refs/json-schema-draft-07.json":41,"fast-json-stable-stringify":43}]},{},[])("ajv")
});
/* ajv 6.12.5: Another JSON Schema Validator */
!function(e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Ajv=e()}(function(){return function o(i,n,l){function c(r,e){if(!n[r]){if(!i[r]){var t="function"==typeof require&&require;if(!e&&t)return t(r,!0);if(u)return u(r,!0);var a=new Error("Cannot find module '"+r+"'");throw a.code="MODULE_NOT_FOUND",a}var s=n[r]={exports:{}};i[r][0].call(s.exports,function(e){return c(i[r][1][e]||e)},s,s.exports,o,i,n,l)}return n[r].exports}for(var u="function"==typeof require&&require,e=0;e<l.length;e++)c(l[e]);return c}({1:[function(e,r,t){"use strict";var a=r.exports=function(){this._cache={}};a.prototype.put=function(e,r){this._cache[e]=r},a.prototype.get=function(e){return this._cache[e]},a.prototype.del=function(e){delete this._cache[e]},a.prototype.clear=function(){this._cache={}}},{}],2:[function(e,r,t){"use strict";var a=e("./error_classes").MissingRef;function s(r,n,t){var l=this;if("function"!=typeof this._opts.loadSchema)throw new Error("options.loadSchema should be a function");"function"==typeof n&&(t=n,n=void 0);var e=c(r).then(function(){var e=l._addSchema(r,void 0,n);return e.validate||function o(i){try{return l._compile(i)}catch(e){if(e instanceof a)return r(e);throw e}function r(e){var r=e.missingSchema;if(s(r))throw new Error("Schema "+r+" is loaded but "+e.missingRef+" cannot be resolved");var t=l._loadingSchemas[r];return t||(t=l._loadingSchemas[r]=l._opts.loadSchema(r)).then(a,a),t.then(function(e){if(!s(r))return c(e).then(function(){s(r)||l.addSchema(e,r,void 0,n)})}).then(function(){return o(i)});function a(){delete l._loadingSchemas[r]}function s(e){return l._refs[e]||l._schemas[e]}}}(e)});return t&&e.then(function(e){t(null,e)},t),e;function c(e){var r=e.$schema;return r&&!l.getSchema(r)?s.call(l,{$ref:r},!0):Promise.resolve()}}r.exports=s},{"./error_classes":3}],3:[function(e,r,t){"use strict";var a=e("./resolve");function s(e,r,t){this.message=t||s.message(e,r),this.missingRef=a.url(e,r),this.missingSchema=a.normalizeId(a.fullPath(this.missingRef))}function o(e){return e.prototype=Object.create(Error.prototype),e.prototype.constructor=e}r.exports={Validation:o(function(e){this.message="validation failed",this.errors=e,this.ajv=this.validation=!0}),MissingRef:o(s)},s.message=function(e,r){return"can't resolve reference "+r+" from id "+e}},{"./resolve":6}],4:[function(e,r,t){"use strict";var a=e("./util"),o=/^(\d\d\d\d)-(\d\d)-(\d\d)$/,i=[0,31,28,31,30,31,30,31,31,30,31,30,31],n=/^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i,s=/^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i,l=/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,c=/^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,u=/^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i,h=/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,d=/^(?:\/(?:[^~/]|~0|~1)*)*$/,p=/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,f=/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;function m(e){return a.copy(m[e="full"==e?"full":"fast"])}function v(e){var r=e.match(o);if(!r)return!1;var t,a=+r[2],s=+r[3];return 1<=a&&a<=12&&1<=s&&s<=(2!=a||((t=+r[1])%4!=0||t%100==0&&t%400!=0)?i[a]:29)}function y(e,r){var t=e.match(n);if(!t)return!1;var a=t[1],s=t[2],o=t[3];return(a<=23&&s<=59&&o<=59||23==a&&59==s&&60==o)&&(!r||t[5])}(r.exports=m).fast={date:/^\d\d\d\d-[0-1]\d-[0-3]\d$/,time:/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,"date-time":/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,uri:/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":f},m.full={date:v,time:y,"date-time":function(e){var r=e.split(g);return 2==r.length&&v(r[0])&&y(r[1],!0)},uri:function(e){return P.test(e)&&l.test(e)},"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":f};var g=/t|\s/i;var P=/\/|:/;var E=/[^\\]\\Z/;function w(e){if(E.test(e))return!1;try{return new RegExp(e),!0}catch(e){return!1}}},{"./util":10}],5:[function(e,r,t){"use strict";var R=e("./resolve"),$=e("./util"),j=e("./error_classes"),D=e("fast-json-stable-stringify"),O=e("../dotjs/validate"),I=$.ucs2length,A=e("fast-deep-equal"),k=j.Validation;function C(e,c,u,r){var d=this,p=this._opts,h=[void 0],f={},l=[],t={},m=[],a={},v=[],s=function(e,r,t){var a=L.call(this,e,r,t);return 0<=a?{index:a,compiling:!0}:{index:a=this._compilations.length,compiling:!(this._compilations[a]={schema:e,root:r,baseId:t})}}.call(this,e,c=c||{schema:e,refVal:h,refs:f},r),o=this._compilations[s.index];if(s.compiling)return o.callValidate=P;var y=this._formats,g=this.RULES;try{var i=E(e,c,u,r);o.validate=i;var n=o.callValidate;return n&&(n.schema=i.schema,n.errors=null,n.refs=i.refs,n.refVal=i.refVal,n.root=i.root,n.$async=i.$async,p.sourceCode&&(n.source=i.source)),i}finally{(function(e,r,t){var a=L.call(this,e,r,t);0<=a&&this._compilations.splice(a,1)}).call(this,e,c,r)}function P(){var e=o.validate,r=e.apply(this,arguments);return P.errors=e.errors,r}function E(e,r,t,a){var s=!r||r&&r.schema==e;if(r.schema!=c.schema)return C.call(d,e,r,t,a);var o=!0===e.$async,i=O({isTop:!0,schema:e,isRoot:s,baseId:a,root:r,schemaPath:"",errSchemaPath:"#",errorPath:'""',MissingRefError:j.MissingRef,RULES:g,validate:O,util:$,resolve:R,resolveRef:w,usePattern:_,useDefault:F,useCustomRule:x,opts:p,formats:y,logger:d.logger,self:d}),i=Q(h,z)+Q(l,N)+Q(m,q)+Q(v,T)+i;p.processCode&&(i=p.processCode(i,e));try{var n=new Function("self","RULES","formats","root","refVal","defaults","customRules","equal","ucs2length","ValidationError",i)(d,g,y,c,h,m,v,A,I,k);h[0]=n}catch(e){throw d.logger.error("Error compiling schema, function code:",i),e}return n.schema=e,n.errors=null,n.refs=f,n.refVal=h,n.root=s?n:r,o&&(n.$async=!0),!0===p.sourceCode&&(n.source={code:i,patterns:l,defaults:m}),n}function w(e,r,t){r=R.url(e,r);var a,s,o=f[r];if(void 0!==o)return S(a=h[o],s="refVal["+o+"]");if(!t&&c.refs){var i=c.refs[r];if(void 0!==i)return S(a=c.refVal[i],s=b(r,a))}s=b(r);var n,l=R.call(d,E,c,r);if(void 0!==l||(n=u&&u[r])&&(l=R.inlineRef(n,p.inlineRefs)?n:C.call(d,n,c,u,e)),void 0!==l)return S(h[f[r]]=l,s);delete f[r]}function b(e,r){var t=h.length;return h[t]=r,"refVal"+(f[e]=t)}function S(e,r){return"object"==typeof e||"boolean"==typeof e?{code:r,schema:e,inline:!0}:{code:r,$async:e&&!!e.$async}}function _(e){var r=t[e];return void 0===r&&(r=t[e]=l.length,l[r]=e),"pattern"+r}function F(e){switch(typeof e){case"boolean":case"number":return""+e;case"string":return $.toQuotedString(e);case"object":if(null===e)return"null";var r=D(e),t=a[r];return void 0===t&&(t=a[r]=m.length,m[t]=e),"default"+t}}function x(e,r,t,a){if(!1!==d._opts.validateSchema){var s=e.definition.dependencies;if(s&&!s.every(function(e){return Object.prototype.hasOwnProperty.call(t,e)}))throw new Error("parent schema must have all required keywords: "+s.join(","));var o=e.definition.validateSchema;if(o)if(!o(r)){var i="keyword schema is invalid: "+d.errorsText(o.errors);if("log"!=d._opts.validateSchema)throw new Error(i);d.logger.error(i)}}var n,l=e.definition.compile,c=e.definition.inline,u=e.definition.macro;if(l)n=l.call(d,r,t,a);else if(u)n=u.call(d,r,t,a),!1!==p.validateSchema&&d.validateSchema(n,!0);else if(c)n=c.call(d,a,e.keyword,r,t);else if(!(n=e.definition.validate))return;if(void 0===n)throw new Error('custom keyword "'+e.keyword+'"failed to compile');var h=v.length;return{code:"customRule"+h,validate:v[h]=n}}}function L(e,r,t){for(var a=0;a<this._compilations.length;a++){var s=this._compilations[a];if(s.schema==e&&s.root==r&&s.baseId==t)return a}return-1}function N(e,r){return"var pattern"+e+" = new RegExp("+$.toQuotedString(r[e])+");"}function q(e){return"var default"+e+" = defaults["+e+"];"}function z(e,r){return void 0===r[e]?"":"var refVal"+e+" = refVal["+e+"];"}function T(e){return"var customRule"+e+" = customRules["+e+"];"}function Q(e,r){if(!e.length)return"";for(var t="",a=0;a<e.length;a++)t+=r(a,e);return t}r.exports=C},{"../dotjs/validate":38,"./error_classes":3,"./resolve":6,"./util":10,"fast-deep-equal":42,"fast-json-stable-stringify":43}],6:[function(e,r,t){"use strict";var m=e("uri-js"),v=e("fast-deep-equal"),y=e("./util"),l=e("./schema_obj"),a=e("json-schema-traverse");function c(e,r,t){var a=this._refs[t];if("string"==typeof a){if(!this._refs[a])return c.call(this,e,r,a);a=this._refs[a]}if((a=a||this._schemas[t])instanceof l)return d(a.schema,this._opts.inlineRefs)?a.schema:a.validate||this._compile(a);var s,o,i,n=u.call(this,r,t);return n&&(s=n.schema,r=n.root,i=n.baseId),s instanceof l?o=s.validate||e.call(this,s.schema,r,void 0,i):void 0!==s&&(o=d(s,this._opts.inlineRefs)?s:e.call(this,s,r,void 0,i)),o}function u(e,r){var t=m.parse(r),a=p(t),s=g(this._getId(e.schema));if(0===Object.keys(e.schema).length||a!==s){var o=P(a),i=this._refs[o];if("string"==typeof i)return function(e,r,t){var a=u.call(this,e,r);if(a){var s=a.schema,o=a.baseId;e=a.root;var i=this._getId(s);return i&&(o=f(o,i)),n.call(this,t,o,s,e)}}.call(this,e,i,t);if(i instanceof l)i.validate||this._compile(i),e=i;else{if(!((i=this._schemas[o])instanceof l))return;if(i.validate||this._compile(i),o==P(r))return{schema:i,root:e,baseId:s};e=i}if(!e.schema)return;s=g(this._getId(e.schema))}return n.call(this,t,s,e.schema,e)}(r.exports=c).normalizeId=P,c.fullPath=g,c.url=f,c.ids=function(e){var r=P(this._getId(e)),h={"":r},d={"":g(r,!1)},p={},f=this;return a(e,{allKeys:!0},function(e,r,t,a,s,o,i){if(""!==r){var n=f._getId(e),l=h[a],c=d[a]+"/"+s;if(void 0!==i&&(c+="/"+("number"==typeof i?i:y.escapeFragment(i))),"string"==typeof n){n=l=P(l?m.resolve(l,n):n);var u=f._refs[n];if("string"==typeof u&&(u=f._refs[u]),u&&u.schema){if(!v(e,u.schema))throw new Error('id "'+n+'" resolves to more than one schema')}else if(n!=P(c))if("#"==n[0]){if(p[n]&&!v(e,p[n]))throw new Error('id "'+n+'" resolves to more than one schema');p[n]=e}else f._refs[n]=c}h[r]=l,d[r]=c}}),p},c.inlineRef=d,c.schema=u;var h=y.toHash(["properties","patternProperties","enum","dependencies","definitions"]);function n(e,r,t,a){if(e.fragment=e.fragment||"","/"==e.fragment.slice(0,1)){for(var s=e.fragment.split("/"),o=1;o<s.length;o++){var i,n,l,c=s[o];if(c){if(void 0===(t=t[c=y.unescapeFragment(c)]))break;h[c]||((l=this._getId(t))&&(r=f(r,l)),t.$ref&&(i=f(r,t.$ref),(n=u.call(this,a,i))&&(t=n.schema,a=n.root,r=n.baseId)))}}return void 0!==t&&t!==a.schema?{schema:t,root:a,baseId:r}:void 0}}var i=y.toHash(["type","format","pattern","maxLength","minLength","maxProperties","minProperties","maxItems","minItems","maximum","minimum","uniqueItems","multipleOf","required","enum"]);function d(e,r){return!1!==r&&(void 0===r||!0===r?function e(r){var t;if(Array.isArray(r)){for(var a=0;a<r.length;a++)if("object"==typeof(t=r[a])&&!e(t))return!1}else for(var s in r){if("$ref"==s)return!1;if("object"==typeof(t=r[s])&&!e(t))return!1}return!0}(e):r?function e(r){var t,a=0;if(Array.isArray(r)){for(var s=0;s<r.length;s++)if("object"==typeof(t=r[s])&&(a+=e(t)),a==1/0)return 1/0}else for(var o in r){if("$ref"==o)return 1/0;if(i[o])a++;else if("object"==typeof(t=r[o])&&(a+=e(t)+1),a==1/0)return 1/0}return a}(e)<=r:void 0)}function g(e,r){return!1!==r&&(e=P(e)),p(m.parse(e))}function p(e){return m.serialize(e).split("#")[0]+"#"}var s=/#\/?$/;function P(e){return e?e.replace(s,""):""}function f(e,r){return r=P(r),m.resolve(e,r)}},{"./schema_obj":8,"./util":10,"fast-deep-equal":42,"json-schema-traverse":44,"uri-js":45}],7:[function(e,r,t){"use strict";var o=e("../dotjs"),i=e("./util").toHash;r.exports=function(){var a=[{type:"number",rules:[{maximum:["exclusiveMaximum"]},{minimum:["exclusiveMinimum"]},"multipleOf","format"]},{type:"string",rules:["maxLength","minLength","pattern","format"]},{type:"array",rules:["maxItems","minItems","items","contains","uniqueItems"]},{type:"object",rules:["maxProperties","minProperties","required","dependencies","propertyNames",{properties:["additionalProperties","patternProperties"]}]},{rules:["$ref","const","enum","not","anyOf","oneOf","allOf","if"]}],s=["type","$comment"];return a.all=i(s),a.types=i(["number","integer","string","array","object","boolean","null"]),a.forEach(function(e){e.rules=e.rules.map(function(e){var r,t;return"object"==typeof e&&(t=e[r=Object.keys(e)[0]],e=r,t.forEach(function(e){s.push(e),a.all[e]=!0})),s.push(e),a.all[e]={keyword:e,code:o[e],implements:t}}),a.all.$comment={keyword:"$comment",code:o.$comment},e.type&&(a.types[e.type]=e)}),a.keywords=i(s.concat(["$schema","$id","id","$data","$async","title","description","default","definitions","examples","readOnly","writeOnly","contentMediaType","contentEncoding","additionalItems","then","else"])),a.custom={},a}},{"../dotjs":27,"./util":10}],8:[function(e,r,t){"use strict";var a=e("./util");r.exports=function(e){a.copy(e,this)}},{"./util":10}],9:[function(e,r,t){"use strict";r.exports=function(e){for(var r,t=0,a=e.length,s=0;s<a;)t++,55296<=(r=e.charCodeAt(s++))&&r<=56319&&s<a&&56320==(64512&(r=e.charCodeAt(s)))&&s++;return t}},{}],10:[function(e,r,t){"use strict";function i(e,r,t,a){var s=a?" !== ":" === ",o=a?" || ":" && ",i=a?"!":"",n=a?"":"!";switch(e){case"null":return r+s+"null";case"array":return i+"Array.isArray("+r+")";case"object":return"("+i+r+o+"typeof "+r+s+'"object"'+o+n+"Array.isArray("+r+"))";case"integer":return"(typeof "+r+s+'"number"'+o+n+"("+r+" % 1)"+o+r+s+r+(t?o+i+"isFinite("+r+")":"")+")";case"number":return"(typeof "+r+s+'"'+e+'"'+(t?o+i+"isFinite("+r+")":"")+")";default:return"typeof "+r+s+'"'+e+'"'}}r.exports={copy:function(e,r){for(var t in r=r||{},e)r[t]=e[t];return r},checkDataType:i,checkDataTypes:function(e,r,t){{if(1===e.length)return i(e[0],r,t,!0);var a,s="",o=n(e);for(a in o.array&&o.object&&(s=o.null?"(":"(!"+r+" || ",s+="typeof "+r+' !== "object")',delete o.null,delete o.array,delete o.object),o.number&&delete o.integer,o)s+=(s?" && ":"")+i(a,r,t,!0);return s}},coerceToTypes:function(e,r){if(Array.isArray(r)){for(var t=[],a=0;a<r.length;a++){var s=r[a];(o[s]||"array"===e&&"array"===s)&&(t[t.length]=s)}if(t.length)return t}else{if(o[r])return[r];if("array"===e&&"array"===r)return["array"]}},toHash:n,getProperty:h,escapeQuotes:l,equal:e("fast-deep-equal"),ucs2length:e("./ucs2length"),varOccurences:function(e,r){r+="[^0-9]";var t=e.match(new RegExp(r,"g"));return t?t.length:0},varReplace:function(e,r,t){return r+="([^0-9])",t=t.replace(/\$/g,"$$$$"),e.replace(new RegExp(r,"g"),t+"$1")},schemaHasRules:function(e,r){if("boolean"==typeof e)return!e;for(var t in e)if(r[t])return!0},schemaHasRulesExcept:function(e,r,t){if("boolean"==typeof e)return!e&&"not"!=t;for(var a in e)if(a!=t&&r[a])return!0},schemaUnknownRules:function(e,r){if("boolean"==typeof e)return;for(var t in e)if(!r[t])return t},toQuotedString:c,getPathExpr:function(e,r,t,a){return u(e,t?"'/' + "+r+(a?"":".replace(/~/g, '~0').replace(/\\//g, '~1')"):a?"'[' + "+r+" + ']'":"'[\\'' + "+r+" + '\\']'")},getPath:function(e,r,t){var a=c(t?"/"+f(r):h(r));return u(e,a)},getData:function(e,r,t){var a,s,o,i;if(""===e)return"rootData";if("/"==e[0]){if(!d.test(e))throw new Error("Invalid JSON-pointer: "+e);s=e,o="rootData"}else{if(!(i=e.match(p)))throw new Error("Invalid JSON-pointer: "+e);if(a=+i[1],"#"==(s=i[2])){if(r<=a)throw new Error("Cannot access property/index "+a+" levels up, current level is "+r);return t[r-a]}if(r<a)throw new Error("Cannot access data "+a+" levels up, current level is "+r);if(o="data"+(r-a||""),!s)return o}for(var n=o,l=s.split("/"),c=0;c<l.length;c++){var u=l[c];u&&(o+=h(m(u)),n+=" && "+o)}return n},unescapeFragment:function(e){return m(decodeURIComponent(e))},unescapeJsonPointer:m,escapeFragment:function(e){return encodeURIComponent(f(e))},escapeJsonPointer:f};var o=n(["string","number","integer","boolean","null"]);function n(e){for(var r={},t=0;t<e.length;t++)r[e[t]]=!0;return r}var a=/^[a-z$_][a-z$_0-9]*$/i,s=/'|\\/g;function h(e){return"number"==typeof e?"["+e+"]":a.test(e)?"."+e:"['"+l(e)+"']"}function l(e){return e.replace(s,"\\$&").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\f/g,"\\f").replace(/\t/g,"\\t")}function c(e){return"'"+l(e)+"'"}var d=/^\/(?:[^~]|~0|~1)*$/,p=/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;function u(e,r){return'""'==e?r:(e+" + "+r).replace(/([^\\])' \+ '/g,"$1")}function f(e){return e.replace(/~/g,"~0").replace(/\//g,"~1")}function m(e){return e.replace(/~1/g,"/").replace(/~0/g,"~")}},{"./ucs2length":9,"fast-deep-equal":42}],11:[function(e,r,t){"use strict";var l=["multipleOf","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","additionalItems","maxItems","minItems","uniqueItems","maxProperties","minProperties","required","additionalProperties","enum","format","const"];r.exports=function(e,r){for(var t=0;t<r.length;t++){e=JSON.parse(JSON.stringify(e));for(var a=r[t].split("/"),s=e,o=1;o<a.length;o++)s=s[a[o]];for(o=0;o<l.length;o++){var i=l[o],n=s[i];n&&(s[i]={anyOf:[n,{$ref:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"}]})}}return e}},{}],12:[function(e,r,t){"use strict";var a=e("./refs/json-schema-draft-07.json");r.exports={$id:"https://github.com/ajv-validator/ajv/blob/master/lib/definition_schema.js",definitions:{simpleTypes:a.definitions.simpleTypes},type:"object",dependencies:{schema:["validate"],$data:["validate"],statements:["inline"],valid:{not:{required:["macro"]}}},properties:{type:a.properties.type,schema:{type:"boolean"},statements:{type:"boolean"},dependencies:{type:"array",items:{type:"string"}},metaSchema:{type:"object"},modifying:{type:"boolean"},valid:{type:"boolean"},$data:{type:"boolean"},async:{type:"boolean"},errors:{anyOf:[{type:"boolean"},{const:"full"}]}}}},{"./refs/json-schema-draft-07.json":41}],13:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a,s,o,i,n,l,c=" ",u=e.level,h=e.dataLevel,d=e.schema[r],p=e.schemaPath+e.util.getProperty(r),f=e.errSchemaPath+"/"+r,m=!e.opts.allErrors,v="data"+(h||""),y=e.opts.$data&&d&&d.$data,g=y?(c+=" var schema"+u+" = "+e.util.getData(d.$data,h,e.dataPathArr)+"; ","schema"+u):d,P="maximum"==r,E=P?"exclusiveMaximum":"exclusiveMinimum",w=e.schema[E],b=e.opts.$data&&w&&w.$data,S=P?"<":">",_=P?">":"<",F=void 0;if(!y&&"number"!=typeof d&&void 0!==d)throw new Error(r+" must be number");if(!b&&void 0!==w&&"number"!=typeof w&&"boolean"!=typeof w)throw new Error(E+" must be number or boolean");b?(o="exclIsNumber"+u,i="' + "+(n="op"+u)+" + '",c+=" var schemaExcl"+u+" = "+(t=e.util.getData(w.$data,h,e.dataPathArr))+"; ",F=E,(l=l||[]).push(c+=" var "+(a="exclusive"+u)+"; var "+(s="exclType"+u)+" = typeof "+(t="schemaExcl"+u)+"; if ("+s+" != 'boolean' && "+s+" != 'undefined' && "+s+" != 'number') { "),c="",!1!==e.createErrors?(c+=" { keyword: '"+(F||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(f)+" , params: {} ",!1!==e.opts.messages&&(c+=" , message: '"+E+" should be boolean' "),e.opts.verbose&&(c+=" , schema: validate.schema"+p+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+v+" "),c+=" } "):c+=" {} ",x=c,c=l.pop(),c+=!e.compositeRule&&m?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c+=" } else if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" "+s+" == 'number' ? ( ("+a+" = "+g+" === undefined || "+t+" "+S+"= "+g+") ? "+v+" "+_+"= "+t+" : "+v+" "+_+" "+g+" ) : ( ("+a+" = "+t+" === true) ? "+v+" "+_+"= "+g+" : "+v+" "+_+" "+g+" ) || "+v+" !== "+v+") { var op"+u+" = "+a+" ? '"+S+"' : '"+S+"='; ",void 0===d&&(f=e.errSchemaPath+"/"+(F=E),g=t,y=b)):(i=S,(o="number"==typeof w)&&y?(n="'"+i+"'",c+=" if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" ( "+g+" === undefined || "+w+" "+S+"= "+g+" ? "+v+" "+_+"= "+w+" : "+v+" "+_+" "+g+" ) || "+v+" !== "+v+") { "):(o&&void 0===d?(a=!0,f=e.errSchemaPath+"/"+(F=E),g=w,_+="="):(o&&(g=Math[P?"min":"max"](w,d)),w===(!o||g)?(a=!0,f=e.errSchemaPath+"/"+(F=E),_+="="):(a=!1,i+="=")),n="'"+i+"'",c+=" if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" "+v+" "+_+" "+g+" || "+v+" !== "+v+") { ")),F=F||r,(l=l||[]).push(c),c="",!1!==e.createErrors?(c+=" { keyword: '"+(F||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(f)+" , params: { comparison: "+n+", limit: "+g+", exclusive: "+a+" } ",!1!==e.opts.messages&&(c+=" , message: 'should be "+i+" ",c+=y?"' + "+g:g+"'"),e.opts.verbose&&(c+=" , schema:  ",c+=y?"validate.schema"+p:""+d,c+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+v+" "),c+=" } "):c+=" {} ";var x=c;return c=l.pop(),c+=!e.compositeRule&&m?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c+=" } ",m&&(c+=" else { "),c}},{}],14:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || ");var d=r,p=p||[];p.push(t+=" "+c+".length "+("maxItems"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have ",t+="maxItems"==r?"more":"fewer",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" items' "),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+o,t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],15:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || "),t+=!1===e.opts.unicode?" "+c+".length ":" ucs2length("+c+") ";var d=r,p=p||[];p.push(t+=" "+("maxLength"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT be ",t+="maxLength"==r?"longer":"shorter",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" characters' "),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+o,t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],16:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || ");var d=r,p=p||[];p.push(t+=" Object.keys("+c+").length "+("maxProperties"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have ",t+="maxProperties"==r?"more":"fewer",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" properties' "),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+o,t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],17:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.schema[r],s=e.schemaPath+e.util.getProperty(r),o=e.errSchemaPath+"/"+r,i=!e.opts.allErrors,n=e.util.copy(e),l="";n.level++;var c="valid"+n.level,u=n.baseId,h=!0,d=a;if(d)for(var p,f=-1,m=d.length-1;f<m;)p=d[f+=1],(e.opts.strictKeywords?"object"==typeof p&&0<Object.keys(p).length||!1===p:e.util.schemaHasRules(p,e.RULES.all))&&(h=!1,n.schema=p,n.schemaPath=s+"["+f+"]",n.errSchemaPath=o+"/"+f,t+="  "+e.validate(n)+" ",n.baseId=u,i&&(t+=" if ("+c+") { ",l+="}"));return i&&(t+=h?" if (true) { ":" "+l.slice(0,-1)+" "),t}},{}],18:[function(e,r,t){"use strict";r.exports=function(r,e){var t=" ",a=r.level,s=r.dataLevel,o=r.schema[e],i=r.schemaPath+r.util.getProperty(e),n=r.errSchemaPath+"/"+e,l=!r.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=r.util.copy(r),p="";d.level++;var f="valid"+d.level;if(o.every(function(e){return r.opts.strictKeywords?"object"==typeof e&&0<Object.keys(e).length||!1===e:r.util.schemaHasRules(e,r.RULES.all)})){var m=d.baseId;t+=" var "+h+" = errors; var "+u+" = false;  ";var v=r.compositeRule;r.compositeRule=d.compositeRule=!0;var y=o;if(y)for(var g,P=-1,E=y.length-1;P<E;)g=y[P+=1],d.schema=g,d.schemaPath=i+"["+P+"]",d.errSchemaPath=n+"/"+P,t+="  "+r.validate(d)+" ",d.baseId=m,t+=" "+u+" = "+u+" || "+f+"; if (!"+u+") { ",p+="}";r.compositeRule=d.compositeRule=v,t+=" "+p+" if (!"+u+") {   var err =   ",!1!==r.createErrors?(t+=" { keyword: 'anyOf' , dataPath: (dataPath || '') + "+r.errorPath+" , schemaPath: "+r.util.toQuotedString(n)+" , params: {} ",!1!==r.opts.messages&&(t+=" , message: 'should match some schema in anyOf' "),r.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+r.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!r.compositeRule&&l&&(t+=r.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; "),t+=" } else {  errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; } ",r.opts.allErrors&&(t+=" } ")}else l&&(t+=" if (true) { ");return t}},{}],19:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.errSchemaPath+"/"+r,s=e.util.toQuotedString(e.schema[r]);return!0===e.opts.$comment?t+=" console.log("+s+");":"function"==typeof e.opts.$comment&&(t+=" self._opts.$comment("+s+", "+e.util.toQuotedString(a)+", validate.root.schema);"),t}},{}],20:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h=e.opts.$data&&o&&o.$data;h&&(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ");h||(t+=" var schema"+a+" = validate.schema"+i+";");var d=d||[];d.push(t+="var "+u+" = equal("+c+", schema"+a+"); if (!"+u+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'const' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { allowedValue: schema"+a+" } ",!1!==e.opts.messages&&(t+=" , message: 'should be equal to constant' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var p=t,t=d.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+p+"]); ":" validate.errors = ["+p+"]; return false; ":" var err = "+p+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" }",l&&(t+=" else { "),t}},{}],21:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=e.util.copy(e);d.level++;var p,f,m,v="valid"+d.level,y="i"+a,g=d.dataLevel=e.dataLevel+1,P="data"+g,E=e.baseId,w=e.opts.strictKeywords?"object"==typeof o&&0<Object.keys(o).length||!1===o:e.util.schemaHasRules(o,e.RULES.all);t+="var "+h+" = errors;var "+u+";",w?(p=e.compositeRule,e.compositeRule=d.compositeRule=!0,d.schema=o,d.schemaPath=i,d.errSchemaPath=n,t+=" var "+v+" = false; for (var "+y+" = 0; "+y+" < "+c+".length; "+y+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers,!0),f=c+"["+y+"]",d.dataPathArr[g]=y,m=e.validate(d),d.baseId=E,e.util.varOccurences(m,P)<2?t+=" "+e.util.varReplace(m,P,f)+" ":t+=" var "+P+" = "+f+"; "+m+" ",t+=" if ("+v+") break; }  ",e.compositeRule=d.compositeRule=p,t+="  if (!"+v+") {"):t+=" if ("+c+".length == 0) {";var b=b||[];b.push(t),t="",!1!==e.createErrors?(t+=" { keyword: 'contains' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: {} ",!1!==e.opts.messages&&(t+=" , message: 'should contain a valid item' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var S=t,t=b.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+S+"]); ":" validate.errors = ["+S+"]; return false; ":" var err = "+S+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } else { ",w&&(t+="  errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; } "),e.opts.allErrors&&(t+=" } "),t}},{}],22:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a,s,o,i,n,l=" ",c=e.level,u=e.dataLevel,h=e.schema[r],d=e.schemaPath+e.util.getProperty(r),p=e.errSchemaPath+"/"+r,f=!e.opts.allErrors,m="data"+(u||""),v="valid"+c,y="errs__"+c,g=e.opts.$data&&h&&h.$data,P=g?(l+=" var schema"+c+" = "+e.util.getData(h.$data,u,e.dataPathArr)+"; ","schema"+c):h,E=this,w="definition"+c,b=E.definition,S="";if(g&&b.$data){var _=b.validateSchema;l+=" var "+w+" = RULES.custom['"+r+"'].definition; var "+(n="keywordValidate"+c)+" = "+w+".validate;"}else{if(!(i=e.useCustomRule(E,h,e.schema,e)))return;P="validate.schema"+d,n=i.code,a=b.compile,s=b.inline,o=b.macro}var F,x,R,$,j,D,O,I,A,k,C=n+".errors",L="i"+c,N="ruleErr"+c,q=b.async;if(q&&!e.async)throw new Error("async keyword in sync schema");return s||o||(l+=C+" = null;"),l+="var "+y+" = errors;var "+v+";",g&&b.$data&&(S+="}",l+=" if ("+P+" === undefined) { "+v+" = true; } else { ",_&&(S+="}",l+=" "+v+" = "+w+".validateSchema("+P+"); if ("+v+") { ")),s?l+=b.statements?" "+i.validate+" ":" "+v+" = "+i.validate+"; ":o?(S="",(F=e.util.copy(e)).level++,x="valid"+F.level,F.schema=i.validate,F.schemaPath="",R=e.compositeRule,e.compositeRule=F.compositeRule=!0,$=e.validate(F).replace(/validate\.schema/g,n),e.compositeRule=F.compositeRule=R,l+=" "+$):((I=I||[]).push(l),l="",l+="  "+n+".call( ",l+=e.opts.passContext?"this":"self",l+=a||!1===b.schema?" , "+m+" ":" , "+P+" , "+m+" , validate.schema"+e.schemaPath+" ",l+=" , (dataPath || '')",'""'!=e.errorPath&&(l+=" + "+e.errorPath),O=l+=" , "+(j=u?"data"+(u-1||""):"parentData")+" , "+(D=u?e.dataPathArr[u]:"parentDataProperty")+" , rootData )  ",l=I.pop(),!1===b.errors?(l+=" "+v+" = ",q&&(l+="await "),l+=O+"; "):l+=q?" var "+(C="customErrors"+c)+" = null; try { "+v+" = await "+O+"; } catch (e) { "+v+" = false; if (e instanceof ValidationError) "+C+" = e.errors; else throw e; } ":" "+C+" = null; "+v+" = "+O+"; "),b.modifying&&(l+=" if ("+j+") "+m+" = "+j+"["+D+"];"),l+=""+S,b.valid?f&&(l+=" if (true) { "):(l+=" if ( ",void 0===b.valid?(l+=" !",l+=o?""+x:v):l+=" "+!b.valid+" ",t=E.keyword,(I=I||[]).push(l+=") { "),(I=I||[]).push(l=""),l="",!1!==e.createErrors?(l+=" { keyword: '"+(t||"custom")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(p)+" , params: { keyword: '"+E.keyword+"' } ",!1!==e.opts.messages&&(l+=" , message: 'should pass \""+E.keyword+"\" keyword validation' "),e.opts.verbose&&(l+=" , schema: validate.schema"+d+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+m+" "),l+=" } "):l+=" {} ",A=l,l=I.pop(),k=l+=!e.compositeRule&&f?e.async?" throw new ValidationError(["+A+"]); ":" validate.errors = ["+A+"]; return false; ":" var err = "+A+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l=I.pop(),s?b.errors?"full"!=b.errors&&(l+="  for (var "+L+"="+y+"; "+L+"<errors; "+L+"++) { var "+N+" = vErrors["+L+"]; if ("+N+".dataPath === undefined) "+N+".dataPath = (dataPath || '') + "+e.errorPath+"; if ("+N+".schemaPath === undefined) { "+N+'.schemaPath = "'+p+'"; } ',e.opts.verbose&&(l+=" "+N+".schema = "+P+"; "+N+".data = "+m+"; "),l+=" } "):!1===b.errors?l+=" "+k+" ":(l+=" if ("+y+" == errors) { "+k+" } else {  for (var "+L+"="+y+"; "+L+"<errors; "+L+"++) { var "+N+" = vErrors["+L+"]; if ("+N+".dataPath === undefined) "+N+".dataPath = (dataPath || '') + "+e.errorPath+"; if ("+N+".schemaPath === undefined) { "+N+'.schemaPath = "'+p+'"; } ',e.opts.verbose&&(l+=" "+N+".schema = "+P+"; "+N+".data = "+m+"; "),l+=" } } "):o?(l+="   var err =   ",!1!==e.createErrors?(l+=" { keyword: '"+(t||"custom")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(p)+" , params: { keyword: '"+E.keyword+"' } ",!1!==e.opts.messages&&(l+=" , message: 'should pass \""+E.keyword+"\" keyword validation' "),e.opts.verbose&&(l+=" , schema: validate.schema"+d+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+m+" "),l+=" } "):l+=" {} ",l+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&f&&(l+=e.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; ")):!1===b.errors?l+=" "+k+" ":(l+=" if (Array.isArray("+C+")) { if (vErrors === null) vErrors = "+C+"; else vErrors = vErrors.concat("+C+"); errors = vErrors.length;  for (var "+L+"="+y+"; "+L+"<errors; "+L+"++) { var "+N+" = vErrors["+L+"]; if ("+N+".dataPath === undefined) "+N+".dataPath = (dataPath || '') + "+e.errorPath+";  "+N+'.schemaPath = "'+p+'";  ',e.opts.verbose&&(l+=" "+N+".schema = "+P+"; "+N+".data = "+m+"; "),l+=" } } else { "+k+" } "),l+=" } ",f&&(l+=" else { ")),l}},{}],23:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e),d="";h.level++;var p,f="valid"+h.level,m={},v={},y=e.opts.ownProperties;for(I in o){"__proto__"!=I&&(k=o[I],(p=Array.isArray(k)?v:m)[I]=k)}t+="var "+u+" = errors;";var g=e.errorPath;for(I in t+="var missing"+a+";",v)if((p=v[I]).length){if(t+=" if ( "+c+e.util.getProperty(I)+" !== undefined ",y&&(t+=" && Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(I)+"') "),l){t+=" && ( ";var P=p;if(P)for(var E=-1,w=P.length-1;E<w;){R=P[E+=1],E&&(t+=" || "),t+=" ( ( "+(O=c+(D=e.util.getProperty(R)))+" === undefined ",y&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(R)+"') "),t+=") && (missing"+a+" = "+e.util.toQuotedString(e.opts.jsonPointers?R:D)+") ) "}t+=")) {  ";var b="missing"+a,S="' + "+b+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.opts.jsonPointers?e.util.getPathExpr(g,b,!0):g+" + "+b);var _=_||[];_.push(t),t="",!1!==e.createErrors?(t+=" { keyword: 'dependencies' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { property: '"+e.util.escapeQuotes(I)+"', missingProperty: '"+S+"', depsCount: "+p.length+", deps: '"+e.util.escapeQuotes(1==p.length?p[0]:p.join(", "))+"' } ",!1!==e.opts.messages&&(t+=" , message: 'should have ",t+=1==p.length?"property "+e.util.escapeQuotes(p[0]):"properties "+e.util.escapeQuotes(p.join(", ")),t+=" when property "+e.util.escapeQuotes(I)+" is present' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var F=t,t=_.pop();t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+F+"]); ":" validate.errors = ["+F+"]; return false; ":" var err = "+F+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "}else{t+=" ) { ";var x=p;if(x)for(var R,$=-1,j=x.length-1;$<j;){R=x[$+=1];var D=e.util.getProperty(R),S=e.util.escapeQuotes(R),O=c+D;e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(g,R,e.opts.jsonPointers)),t+=" if ( "+O+" === undefined ",y&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(R)+"') "),t+=") {  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'dependencies' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { property: '"+e.util.escapeQuotes(I)+"', missingProperty: '"+S+"', depsCount: "+p.length+", deps: '"+e.util.escapeQuotes(1==p.length?p[0]:p.join(", "))+"' } ",!1!==e.opts.messages&&(t+=" , message: 'should have ",t+=1==p.length?"property "+e.util.escapeQuotes(p[0]):"properties "+e.util.escapeQuotes(p.join(", ")),t+=" when property "+e.util.escapeQuotes(I)+" is present' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } "}}t+=" }   ",l&&(d+="}",t+=" else { ")}e.errorPath=g;var I,A=h.baseId;for(I in m){var k=m[I];(e.opts.strictKeywords?"object"==typeof k&&0<Object.keys(k).length||!1===k:e.util.schemaHasRules(k,e.RULES.all))&&(t+=" "+f+" = true; if ( "+c+e.util.getProperty(I)+" !== undefined ",y&&(t+=" && Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(I)+"') "),t+=") { ",h.schema=k,h.schemaPath=i+e.util.getProperty(I),h.errSchemaPath=n+"/"+e.util.escapeFragment(I),t+="  "+e.validate(h)+" ",h.baseId=A,t+=" }  ",l&&(t+=" if ("+f+") { ",d+="}"))}return l&&(t+="   "+d+" if ("+u+" == errors) {"),t}},{}],24:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h=e.opts.$data&&o&&o.$data,d=(h&&(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; "),"i"+a),p="schema"+a;h||(t+=" var "+p+" = validate.schema"+i+";"),t+="var "+u+";",h&&(t+=" if (schema"+a+" === undefined) "+u+" = true; else if (!Array.isArray(schema"+a+")) "+u+" = false; else {"),t+=u+" = false;for (var "+d+"=0; "+d+"<"+p+".length; "+d+"++) if (equal("+c+", "+p+"["+d+"])) { "+u+" = true; break; }",h&&(t+="  }  ");var f=f||[];f.push(t+=" if (!"+u+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'enum' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { allowedValues: schema"+a+" } ",!1!==e.opts.messages&&(t+=" , message: 'should be equal to one of the allowed values' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var m=t,t=f.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+m+"]); ":" validate.errors = ["+m+"]; return false; ":" var err = "+m+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" }",l&&(t+=" else { "),t}},{}],25:[function(e,r,t){"use strict";r.exports=function(e,r,t){var a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+e.util.getProperty(r),l=e.errSchemaPath+"/"+r,c=!e.opts.allErrors,u="data"+(o||"");if(!1===e.opts.format)return c&&(a+=" if (true) { "),a;var h,d=e.opts.$data&&i&&i.$data,p=d?(a+=" var schema"+s+" = "+e.util.getData(i.$data,o,e.dataPathArr)+"; ","schema"+s):i,f=e.opts.unknownFormats,m=Array.isArray(f);if(d){a+=" var "+(h="format"+s)+" = formats["+p+"]; var "+(v="isObject"+s)+" = typeof "+h+" == 'object' && !("+h+" instanceof RegExp) && "+h+".validate; var "+(g="formatType"+s)+" = "+v+" && "+h+".type || 'string'; if ("+v+") { ",e.async&&(a+=" var async"+s+" = "+h+".async; "),a+=" "+h+" = "+h+".validate; } if (  ",d&&(a+=" ("+p+" !== undefined && typeof "+p+" != 'string') || "),a+=" (","ignore"!=f&&(a+=" ("+p+" && !"+h+" ",m&&(a+=" && self._opts.unknownFormats.indexOf("+p+") == -1 "),a+=") || "),a+=" ("+h+" && "+g+" == '"+t+"' && !(typeof "+h+" == 'function' ? ",a+=e.async?" (async"+s+" ? await "+h+"("+u+") : "+h+"("+u+")) ":" "+h+"("+u+") ",a+=" : "+h+".test("+u+"))))) {"}else{if(!(h=e.formats[i])){if("ignore"==f)return e.logger.warn('unknown format "'+i+'" ignored in schema at path "'+e.errSchemaPath+'"'),c&&(a+=" if (true) { "),a;if(m&&0<=f.indexOf(i))return c&&(a+=" if (true) { "),a;throw new Error('unknown format "'+i+'" is used in schema at path "'+e.errSchemaPath+'"')}var v,y,g=(v="object"==typeof h&&!(h instanceof RegExp)&&h.validate)&&h.type||"string";if(v&&(y=!0===h.async,h=h.validate),g!=t)return c&&(a+=" if (true) { "),a;if(y){if(!e.async)throw new Error("async format in sync schema");a+=" if (!(await "+(P="formats"+e.util.getProperty(i)+".validate")+"("+u+"))) { "}else{a+=" if (! ";var P="formats"+e.util.getProperty(i);v&&(P+=".validate"),a+="function"==typeof h?" "+P+"("+u+") ":" "+P+".test("+u+") ",a+=") { "}}var E=E||[];E.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'format' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { format:  ",a+=d?""+p:""+e.util.toQuotedString(i),a+="  } ",!1!==e.opts.messages&&(a+=" , message: 'should match format \"",a+=d?"' + "+p+" + '":""+e.util.escapeQuotes(i),a+="\"' "),e.opts.verbose&&(a+=" , schema:  ",a+=d?"validate.schema"+n:""+e.util.toQuotedString(i),a+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var w=a,a=E.pop();return a+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+w+"]); ":" validate.errors = ["+w+"]; return false; ":" var err = "+w+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",c&&(a+=" else { "),a}},{}],26:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=e.util.copy(e);d.level++;var p,f,m="valid"+d.level,v=e.schema.then,y=e.schema.else,g=void 0!==v&&(e.opts.strictKeywords?"object"==typeof v&&0<Object.keys(v).length||!1===v:e.util.schemaHasRules(v,e.RULES.all)),P=void 0!==y&&(e.opts.strictKeywords?"object"==typeof y&&0<Object.keys(y).length||!1===y:e.util.schemaHasRules(y,e.RULES.all)),E=d.baseId;return g||P?(d.createErrors=!1,d.schema=o,d.schemaPath=i,d.errSchemaPath=n,t+=" var "+h+" = errors; var "+u+" = true;  ",f=e.compositeRule,e.compositeRule=d.compositeRule=!0,t+="  "+e.validate(d)+" ",d.baseId=E,d.createErrors=!0,t+="  errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; }  ",e.compositeRule=d.compositeRule=f,g?(t+=" if ("+m+") {  ",d.schema=e.schema.then,d.schemaPath=e.schemaPath+".then",d.errSchemaPath=e.errSchemaPath+"/then",t+="  "+e.validate(d)+" ",d.baseId=E,t+=" "+u+" = "+m+"; ",g&&P?t+=" var "+(p="ifClause"+a)+" = 'then'; ":p="'then'",t+=" } ",P&&(t+=" else { ")):t+=" if (!"+m+") { ",P&&(d.schema=e.schema.else,d.schemaPath=e.schemaPath+".else",d.errSchemaPath=e.errSchemaPath+"/else",t+="  "+e.validate(d)+" ",d.baseId=E,t+=" "+u+" = "+m+"; ",g&&P?t+=" var "+(p="ifClause"+a)+" = 'else'; ":p="'else'",t+=" } "),t+=" if (!"+u+") {   var err =   ",!1!==e.createErrors?(t+=" { keyword: 'if' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { failingKeyword: "+p+" } ",!1!==e.opts.messages&&(t+=" , message: 'should match \"' + "+p+" + '\" schema' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&l&&(t+=e.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; "),t+=" }   ",l&&(t+=" else { ")):l&&(t+=" if (true) { "),t}},{}],27:[function(e,r,t){"use strict";r.exports={$ref:e("./ref"),allOf:e("./allOf"),anyOf:e("./anyOf"),$comment:e("./comment"),const:e("./const"),contains:e("./contains"),dependencies:e("./dependencies"),enum:e("./enum"),format:e("./format"),if:e("./if"),items:e("./items"),maximum:e("./_limit"),minimum:e("./_limit"),maxItems:e("./_limitItems"),minItems:e("./_limitItems"),maxLength:e("./_limitLength"),minLength:e("./_limitLength"),maxProperties:e("./_limitProperties"),minProperties:e("./_limitProperties"),multipleOf:e("./multipleOf"),not:e("./not"),oneOf:e("./oneOf"),pattern:e("./pattern"),properties:e("./properties"),propertyNames:e("./propertyNames"),required:e("./required"),uniqueItems:e("./uniqueItems"),validate:e("./validate")}},{"./_limit":13,"./_limitItems":14,"./_limitLength":15,"./_limitProperties":16,"./allOf":17,"./anyOf":18,"./comment":19,"./const":20,"./contains":21,"./dependencies":23,"./enum":24,"./format":25,"./if":26,"./items":28,"./multipleOf":29,"./not":30,"./oneOf":31,"./pattern":32,"./properties":33,"./propertyNames":34,"./ref":35,"./required":36,"./uniqueItems":37,"./validate":38}],28:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=e.util.copy(e),p="";d.level++;var f="valid"+d.level,m="i"+a,v=d.dataLevel=e.dataLevel+1,y="data"+v,g=e.baseId;if(t+="var "+h+" = errors;var "+u+";",Array.isArray(o)){var P,E,w,b=e.schema.additionalItems;!1===b&&(t+=" "+u+" = "+c+".length <= "+o.length+"; ",P=n,n=e.errSchemaPath+"/additionalItems",(E=E||[]).push(t+="  if (!"+u+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'additionalItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+o.length+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have more than "+o.length+" items' "),e.opts.verbose&&(t+=" , schema: false , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",w=t,t=E.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+w+"]); ":" validate.errors = ["+w+"]; return false; ":" var err = "+w+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } ",n=P,l&&(p+="}",t+=" else { "));var S=o;if(S)for(var _=-1,F=S.length-1;_<F;){var x,R,$=S[_+=1];(e.opts.strictKeywords?"object"==typeof $&&0<Object.keys($).length||!1===$:e.util.schemaHasRules($,e.RULES.all))&&(t+=" "+f+" = true; if ("+c+".length > "+_+") { ",x=c+"["+_+"]",d.schema=$,d.schemaPath=i+"["+_+"]",d.errSchemaPath=n+"/"+_,d.errorPath=e.util.getPathExpr(e.errorPath,_,e.opts.jsonPointers,!0),d.dataPathArr[v]=_,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",t+=" }  ",l&&(t+=" if ("+f+") { ",p+="}"))}"object"==typeof b&&(e.opts.strictKeywords?"object"==typeof b&&0<Object.keys(b).length||!1===b:e.util.schemaHasRules(b,e.RULES.all))&&(d.schema=b,d.schemaPath=e.schemaPath+".additionalItems",d.errSchemaPath=e.errSchemaPath+"/additionalItems",t+=" "+f+" = true; if ("+c+".length > "+o.length+") {  for (var "+m+" = "+o.length+"; "+m+" < "+c+".length; "+m+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers,!0),x=c+"["+m+"]",d.dataPathArr[v]=m,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",l&&(t+=" if (!"+f+") break; "),t+=" } }  ",l&&(t+=" if ("+f+") { ",p+="}"))}else{(e.opts.strictKeywords?"object"==typeof o&&0<Object.keys(o).length||!1===o:e.util.schemaHasRules(o,e.RULES.all))&&(d.schema=o,d.schemaPath=i,d.errSchemaPath=n,t+="  for (var "+m+" = 0; "+m+" < "+c+".length; "+m+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers,!0),x=c+"["+m+"]",d.dataPathArr[v]=m,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",l&&(t+=" if (!"+f+") break; "),t+=" }")}return l&&(t+=" "+p+" if ("+h+" == errors) {"),t}},{}],29:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="var division"+a+";if (",u&&(t+=" "+h+" !== undefined && ( typeof "+h+" != 'number' || "),t+=" (division"+a+" = "+c+" / "+h+", ",t+=e.opts.multipleOfPrecision?" Math.abs(Math.round(division"+a+") - division"+a+") > 1e-"+e.opts.multipleOfPrecision+" ":" division"+a+" !== parseInt(division"+a+") ",t+=" ) ",u&&(t+="  )  ");var d=d||[];d.push(t+=" ) {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'multipleOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { multipleOf: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should be multiple of ",t+=u?"' + "+h:h+"'"),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+o,t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var p=t,t=d.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+p+"]); ":" validate.errors = ["+p+"]; return false; ":" var err = "+p+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],30:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e);h.level++;var d,p,f,m,v="valid"+h.level;return(e.opts.strictKeywords?"object"==typeof o&&0<Object.keys(o).length||!1===o:e.util.schemaHasRules(o,e.RULES.all))?(h.schema=o,h.schemaPath=i,h.errSchemaPath=n,t+=" var "+u+" = errors;  ",d=e.compositeRule,e.compositeRule=h.compositeRule=!0,h.createErrors=!1,h.opts.allErrors&&(p=h.opts.allErrors,h.opts.allErrors=!1),t+=" "+e.validate(h)+" ",h.createErrors=!0,p&&(h.opts.allErrors=p),e.compositeRule=h.compositeRule=d,(f=f||[]).push(t+=" if ("+v+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: {} ",!1!==e.opts.messages&&(t+=" , message: 'should NOT be valid' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",m=t,t=f.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+m+"]); ":" validate.errors = ["+m+"]; return false; ":" var err = "+m+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } else {  errors = "+u+"; if (vErrors !== null) { if ("+u+") vErrors.length = "+u+"; else vErrors = null; } ",e.opts.allErrors&&(t+=" } ")):(t+="  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: {} ",!1!==e.opts.messages&&(t+=" , message: 'should NOT be valid' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l&&(t+=" if (false) { ")),t}},{}],31:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=e.util.copy(e),p="";d.level++;var f="valid"+d.level,m=d.baseId,v="prevValid"+a,y="passingSchemas"+a;t+="var "+h+" = errors , "+v+" = false , "+u+" = false , "+y+" = null; ";var g=e.compositeRule;e.compositeRule=d.compositeRule=!0;var P=o;if(P)for(var E,w=-1,b=P.length-1;w<b;)E=P[w+=1],(e.opts.strictKeywords?"object"==typeof E&&0<Object.keys(E).length||!1===E:e.util.schemaHasRules(E,e.RULES.all))?(d.schema=E,d.schemaPath=i+"["+w+"]",d.errSchemaPath=n+"/"+w,t+="  "+e.validate(d)+" ",d.baseId=m):t+=" var "+f+" = true; ",w&&(t+=" if ("+f+" && "+v+") { "+u+" = false; "+y+" = ["+y+", "+w+"]; } else { ",p+="}"),t+=" if ("+f+") { "+u+" = "+v+" = true; "+y+" = "+w+"; }";return e.compositeRule=d.compositeRule=g,t+=p+"if (!"+u+") {   var err =   ",!1!==e.createErrors?(t+=" { keyword: 'oneOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { passingSchemas: "+y+" } ",!1!==e.opts.messages&&(t+=" , message: 'should match exactly one schema in oneOf' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&l&&(t+=e.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; "),t+="} else {  errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; }",e.opts.allErrors&&(t+=" } "),t}},{}],32:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o,d=u?"(new RegExp("+h+"))":e.usePattern(o);t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'string') || ");var p=p||[];p.push(t+=" !"+d+".test("+c+") ) {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'pattern' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { pattern:  ",t+=u?""+h:""+e.util.toQuotedString(o),t+="  } ",!1!==e.opts.messages&&(t+=" , message: 'should match pattern \"",t+=u?"' + "+h+" + '":""+e.util.escapeQuotes(o),t+="\"' "),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+e.util.toQuotedString(o),t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],33:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e),d="";h.level++;var p,f,m,v="valid"+h.level,y="key"+a,g="idx"+a,P=h.dataLevel=e.dataLevel+1,E="data"+P,w="dataProperties"+a,b=Object.keys(o||{}).filter(k),S=e.schema.patternProperties||{},_=Object.keys(S).filter(k),F=e.schema.additionalProperties,x=b.length||_.length,R=!1===F,$="object"==typeof F&&Object.keys(F).length,j=e.opts.removeAdditional,D=R||$||j,O=e.opts.ownProperties,I=e.baseId,A=e.schema.required;function k(e){return"__proto__"!==e}if(A&&(!e.opts.$data||!A.$data)&&A.length<e.opts.loopRequired&&(p=e.util.toHash(A)),t+="var "+u+" = errors;var "+v+" = true;",O&&(t+=" var "+w+" = undefined;"),D){if(t+=O?" "+w+" = "+w+" || Object.keys("+c+"); for (var "+g+"=0; "+g+"<"+w+".length; "+g+"++) { var "+y+" = "+w+"["+g+"]; ":" for (var "+y+" in "+c+") { ",x){if(t+=" var isAdditional"+a+" = !(false ",b.length)if(8<b.length)t+=" || validate.schema"+i+".hasOwnProperty("+y+") ";else{var C=b;if(C)for(var L=-1,N=C.length-1;L<N;)U=C[L+=1],t+=" || "+y+" == "+e.util.toQuotedString(U)+" "}if(_.length){var q=_;if(q)for(var z=-1,T=q.length-1;z<T;)te=q[z+=1],t+=" || "+e.usePattern(te)+".test("+y+") "}t+=" ); if (isAdditional"+a+") { "}"all"==j?t+=" delete "+c+"["+y+"]; ":(Z=e.errorPath,f="' + "+y+" + '",e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers)),R?j?t+=" delete "+c+"["+y+"]; ":(G=n,n=e.errSchemaPath+"/additionalProperties",(W=W||[]).push(t+=" "+v+" = false; "),t="",!1!==e.createErrors?(t+=" { keyword: 'additionalProperties' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { additionalProperty: '"+f+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is an invalid additional property":"should NOT have additional properties",t+="' "),e.opts.verbose&&(t+=" , schema: false , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",X=t,t=W.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+X+"]); ":" validate.errors = ["+X+"]; return false; ":" var err = "+X+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n=G,l&&(t+=" break; ")):$&&("failing"==j?(t+=" var "+u+" = errors;  ",m=e.compositeRule,e.compositeRule=h.compositeRule=!0,h.schema=F,h.schemaPath=e.schemaPath+".additionalProperties",h.errSchemaPath=e.errSchemaPath+"/additionalProperties",h.errorPath=e.opts._errorDataPathProperty?e.errorPath:e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers),oe=c+"["+y+"]",h.dataPathArr[P]=y,ie=e.validate(h),h.baseId=I,e.util.varOccurences(ie,E)<2?t+=" "+e.util.varReplace(ie,E,oe)+" ":t+=" var "+E+" = "+oe+"; "+ie+" ",t+=" if (!"+v+") { errors = "+u+"; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete "+c+"["+y+"]; }  ",e.compositeRule=h.compositeRule=m):(h.schema=F,h.schemaPath=e.schemaPath+".additionalProperties",h.errSchemaPath=e.errSchemaPath+"/additionalProperties",h.errorPath=e.opts._errorDataPathProperty?e.errorPath:e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers),oe=c+"["+y+"]",h.dataPathArr[P]=y,ie=e.validate(h),h.baseId=I,e.util.varOccurences(ie,E)<2?t+=" "+e.util.varReplace(ie,E,oe)+" ":t+=" var "+E+" = "+oe+"; "+ie+" ",l&&(t+=" if (!"+v+") break; "))),e.errorPath=Z),x&&(t+=" } "),t+=" }  ",l&&(t+=" if ("+v+") { ",d+="}")}var Q=e.opts.useDefaults&&!e.compositeRule;if(b.length){var V=b;if(V)for(var U,H=-1,K=V.length-1;H<K;){var M,B,J,Z,G,Y,W,X,ee=o[U=V[H+=1]];(e.opts.strictKeywords?"object"==typeof ee&&0<Object.keys(ee).length||!1===ee:e.util.schemaHasRules(ee,e.RULES.all))&&(oe=c+(M=e.util.getProperty(U)),B=Q&&void 0!==ee.default,h.schema=ee,h.schemaPath=i+M,h.errSchemaPath=n+"/"+e.util.escapeFragment(U),h.errorPath=e.util.getPath(e.errorPath,U,e.opts.jsonPointers),h.dataPathArr[P]=e.util.toQuotedString(U),ie=e.validate(h),h.baseId=I,e.util.varOccurences(ie,E)<2?(ie=e.util.varReplace(ie,E,oe),J=oe):t+=" var "+(J=E)+" = "+oe+"; ",B?t+=" "+ie+" ":(p&&p[U]?(t+=" if ( "+J+" === undefined ",O&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(U)+"') "),t+=") { "+v+" = false; ",Z=e.errorPath,G=n,Y=e.util.escapeQuotes(U),e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(Z,U,e.opts.jsonPointers)),n=e.errSchemaPath+"/required",(W=W||[]).push(t),t="",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+Y+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+Y+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",X=t,t=W.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+X+"]); ":" validate.errors = ["+X+"]; return false; ":" var err = "+X+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n=G,e.errorPath=Z,t+=" } else { "):l?(t+=" if ( "+J+" === undefined ",O&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(U)+"') "),t+=") { "+v+" = true; } else { "):(t+=" if ("+J+" !== undefined ",O&&(t+=" &&   Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(U)+"') "),t+=" ) { "),t+=" "+ie+" } ")),l&&(t+=" if ("+v+") { ",d+="}")}}if(_.length){var re=_;if(re)for(var te,ae=-1,se=re.length-1;ae<se;){var oe,ie,ee=S[te=re[ae+=1]];(e.opts.strictKeywords?"object"==typeof ee&&0<Object.keys(ee).length||!1===ee:e.util.schemaHasRules(ee,e.RULES.all))&&(h.schema=ee,h.schemaPath=e.schemaPath+".patternProperties"+e.util.getProperty(te),h.errSchemaPath=e.errSchemaPath+"/patternProperties/"+e.util.escapeFragment(te),t+=O?" "+w+" = "+w+" || Object.keys("+c+"); for (var "+g+"=0; "+g+"<"+w+".length; "+g+"++) { var "+y+" = "+w+"["+g+"]; ":" for (var "+y+" in "+c+") { ",t+=" if ("+e.usePattern(te)+".test("+y+")) { ",h.errorPath=e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers),oe=c+"["+y+"]",h.dataPathArr[P]=y,ie=e.validate(h),h.baseId=I,e.util.varOccurences(ie,E)<2?t+=" "+e.util.varReplace(ie,E,oe)+" ":t+=" var "+E+" = "+oe+"; "+ie+" ",l&&(t+=" if (!"+v+") break; "),t+=" } ",l&&(t+=" else "+v+" = true; "),t+=" }  ",l&&(t+=" if ("+v+") { ",d+="}"))}}return l&&(t+=" "+d+" if ("+u+" == errors) {"),t}},{}],34:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e);h.level++;var d,p,f,m,v,y,g,P,E,w,b,S="valid"+h.level;return t+="var "+u+" = errors;",(e.opts.strictKeywords?"object"==typeof o&&0<Object.keys(o).length||!1===o:e.util.schemaHasRules(o,e.RULES.all))&&(h.schema=o,h.schemaPath=i,h.errSchemaPath=n,p="idx"+a,f="i"+a,m="' + "+(d="key"+a)+" + '",v="data"+(h.dataLevel=e.dataLevel+1),y="dataProperties"+a,P=e.baseId,(g=e.opts.ownProperties)&&(t+=" var "+y+" = undefined; "),t+=g?" "+y+" = "+y+" || Object.keys("+c+"); for (var "+p+"=0; "+p+"<"+y+".length; "+p+"++) { var "+d+" = "+y+"["+p+"]; ":" for (var "+d+" in "+c+") { ",t+=" var startErrs"+a+" = errors; ",E=d,w=e.compositeRule,e.compositeRule=h.compositeRule=!0,b=e.validate(h),h.baseId=P,e.util.varOccurences(b,v)<2?t+=" "+e.util.varReplace(b,v,E)+" ":t+=" var "+v+" = "+E+"; "+b+" ",e.compositeRule=h.compositeRule=w,t+=" if (!"+S+") { for (var "+f+"=startErrs"+a+"; "+f+"<errors; "+f+"++) { vErrors["+f+"].propertyName = "+d+"; }   var err =   ",!1!==e.createErrors?(t+=" { keyword: 'propertyNames' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { propertyName: '"+m+"' } ",!1!==e.opts.messages&&(t+=" , message: 'property name \\'"+m+"\\' is invalid' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&l&&(t+=e.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; "),l&&(t+=" break; "),t+=" } }"),l&&(t+="  if ("+u+" == errors) {"),t}},{}],35:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a,s=" ",o=e.dataLevel,i=e.schema[r],n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(o||""),u="valid"+e.level;if("#"==i||"#/"==i)a=e.isRoot?(t=e.async,"validate"):(t=!0===e.root.schema.$async,"root.refVal[0]");else{var h,d,p=e.resolveRef(e.baseId,i,e.isRoot);if(void 0===p){var f,m=e.MissingRefError.message(e.baseId,i);if("fail"==e.opts.missingRefs){e.logger.error(m),(f=f||[]).push(s),s="",!1!==e.createErrors?(s+=" { keyword: '$ref' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { ref: '"+e.util.escapeQuotes(i)+"' } ",!1!==e.opts.messages&&(s+=" , message: 'can\\'t resolve reference "+e.util.escapeQuotes(i)+"' "),e.opts.verbose&&(s+=" , schema: "+e.util.toQuotedString(i)+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),s+=" } "):s+=" {} ";var v=s,s=f.pop();s+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+v+"]); ":" validate.errors = ["+v+"]; return false; ":" var err = "+v+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l&&(s+=" if (false) { ")}else{if("ignore"!=e.opts.missingRefs)throw new e.MissingRefError(e.baseId,i,m);e.logger.warn(m),l&&(s+=" if (true) { ")}}else{p.inline?((h=e.util.copy(e)).level++,d="valid"+h.level,h.schema=p.schema,h.schemaPath="",h.errSchemaPath=i,s+=" "+e.validate(h).replace(/validate\.schema/g,p.code)+" ",l&&(s+=" if ("+d+") { ")):(t=!0===p.$async||e.async&&!1!==p.$async,a=p.code)}}if(a){(f=f||[]).push(s),s="",s+=e.opts.passContext?" "+a+".call(this, ":" "+a+"( ",s+=" "+c+", (dataPath || '')",'""'!=e.errorPath&&(s+=" + "+e.errorPath);var y=s+=" , "+(o?"data"+(o-1||""):"parentData")+" , "+(o?e.dataPathArr[o]:"parentDataProperty")+", rootData)  ";if(s=f.pop(),t){if(!e.async)throw new Error("async schema referenced by sync schema");l&&(s+=" var "+u+"; "),s+=" try { await "+y+"; ",l&&(s+=" "+u+" = true; "),s+=" } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ",l&&(s+=" "+u+" = false; "),s+=" } ",l&&(s+=" if ("+u+") { ")}else s+=" if (!"+y+") { if (vErrors === null) vErrors = "+a+".errors; else vErrors = vErrors.concat("+a+".errors); errors = vErrors.length; } ",l&&(s+=" else { ")}return s}},{}],36:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h=e.opts.$data&&o&&o.$data,d=(h&&(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; "),"schema"+a);if(!h)if(o.length<e.opts.loopRequired&&e.schema.properties&&Object.keys(e.schema.properties).length){var p=[],f=o;if(f)for(var m,v=-1,y=f.length-1;v<y;){m=f[v+=1];var g=e.schema.properties[m];g&&(e.opts.strictKeywords?"object"==typeof g&&0<Object.keys(g).length||!1===g:e.util.schemaHasRules(g,e.RULES.all))||(p[p.length]=m)}}else p=o;if(h||p.length){var P=e.errorPath,E=h||e.opts.loopRequired<=p.length,w=e.opts.ownProperties;if(l)if(t+=" var missing"+a+"; ",E){h||(t+=" var "+d+" = validate.schema"+i+"; ");var b="' + "+($="schema"+a+"["+(F="i"+a)+"]")+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(P,$,e.opts.jsonPointers)),t+=" var "+u+" = true; ",h&&(t+=" if (schema"+a+" === undefined) "+u+" = true; else if (!Array.isArray(schema"+a+")) "+u+" = false; else {"),t+=" for (var "+F+" = 0; "+F+" < "+d+".length; "+F+"++) { "+u+" = "+c+"["+d+"["+F+"]] !== undefined ",w&&(t+=" &&   Object.prototype.hasOwnProperty.call("+c+", "+d+"["+F+"]) "),t+="; if (!"+u+") break; } ",h&&(t+="  }  "),(R=R||[]).push(t+="  if (!"+u+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var S=t,t=R.pop();t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+S+"]); ":" validate.errors = ["+S+"]; return false; ":" var err = "+S+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } else { "}else{t+=" if ( ";var _=p;if(_)for(var F=-1,x=_.length-1;F<x;){D=_[F+=1],F&&(t+=" || "),t+=" ( ( "+(k=c+(A=e.util.getProperty(D)))+" === undefined ",w&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(D)+"') "),t+=") && (missing"+a+" = "+e.util.toQuotedString(e.opts.jsonPointers?D:A)+") ) "}t+=") {  ";var R,b="' + "+($="missing"+a)+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.opts.jsonPointers?e.util.getPathExpr(P,$,!0):P+" + "+$),(R=R||[]).push(t),t="",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";S=t;t=R.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+S+"]); ":" validate.errors = ["+S+"]; return false; ":" var err = "+S+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } else { "}else if(E){h||(t+=" var "+d+" = validate.schema"+i+"; ");var $,b="' + "+($="schema"+a+"["+(F="i"+a)+"]")+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(P,$,e.opts.jsonPointers)),h&&(t+=" if ("+d+" && !Array.isArray("+d+")) {  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if ("+d+" !== undefined) { "),t+=" for (var "+F+" = 0; "+F+" < "+d+".length; "+F+"++) { if ("+c+"["+d+"["+F+"]] === undefined ",w&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", "+d+"["+F+"]) "),t+=") {  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ",h&&(t+="  }  ")}else{var j=p;if(j)for(var D,O=-1,I=j.length-1;O<I;){D=j[O+=1];var A=e.util.getProperty(D),b=e.util.escapeQuotes(D),k=c+A;e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(P,D,e.opts.jsonPointers)),t+=" if ( "+k+" === undefined ",w&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(D)+"') "),t+=") {  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } "}}e.errorPath=P}else l&&(t+=" if (true) {");return t}},{}],37:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a,s,o,i=" ",n=e.level,l=e.dataLevel,c=e.schema[r],u=e.schemaPath+e.util.getProperty(r),h=e.errSchemaPath+"/"+r,d=!e.opts.allErrors,p="data"+(l||""),f="valid"+n,m=e.opts.$data&&c&&c.$data,v=m?(i+=" var schema"+n+" = "+e.util.getData(c.$data,l,e.dataPathArr)+"; ","schema"+n):c;return(c||m)&&!1!==e.opts.uniqueItems?(m&&(i+=" var "+f+"; if ("+v+" === false || "+v+" === undefined) "+f+" = true; else if (typeof "+v+" != 'boolean') "+f+" = false; else { "),i+=" var i = "+p+".length , "+f+" = true , j; if (i > 1) { ",t=e.schema.items&&e.schema.items.type,a=Array.isArray(t),!t||"object"==t||"array"==t||a&&(0<=t.indexOf("object")||0<=t.indexOf("array"))?i+=" outer: for (;i--;) { for (j = i; j--;) { if (equal("+p+"[i], "+p+"[j])) { "+f+" = false; break outer; } } } ":(i+=" var itemIndices = {}, item; for (;i--;) { var item = "+p+"[i]; ",i+=" if ("+e.util["checkDataType"+(a?"s":"")](t,"item",e.opts.strictNumbers,!0)+") continue; ",a&&(i+=" if (typeof item == 'string') item = '\"' + item; "),i+=" if (typeof itemIndices[item] == 'number') { "+f+" = false; j = itemIndices[item]; break; } itemIndices[item] = i; } "),i+=" } ",m&&(i+="  }  "),(s=s||[]).push(i+=" if (!"+f+") {   "),i="",!1!==e.createErrors?(i+=" { keyword: 'uniqueItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(h)+" , params: { i: i, j: j } ",!1!==e.opts.messages&&(i+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(i+=" , schema:  ",i+=m?"validate.schema"+u:""+c,i+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),i+=" } "):i+=" {} ",o=i,i=s.pop(),i+=!e.compositeRule&&d?e.async?" throw new ValidationError(["+o+"]); ":" validate.errors = ["+o+"]; return false; ":" var err = "+o+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",i+=" } ",d&&(i+=" else { ")):d&&(i+=" if (true) { "),i}},{}],38:[function(e,r,t){"use strict";r.exports=function(a,e){var r="",t=!0===a.schema.$async,s=a.util.schemaHasRulesExcept(a.schema,a.RULES.all,"$ref"),o=a.self._getId(a.schema);if(a.opts.strictKeywords){var i=a.util.schemaUnknownRules(a.schema,a.RULES.keywords);if(i){var n="unknown keyword: "+i;if("log"!==a.opts.strictKeywords)throw new Error(n);a.logger.warn(n)}}if(a.isTop&&(r+=" var validate = ",t&&(a.async=!0,r+="async "),r+="function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict'; ",o&&(a.opts.sourceCode||a.opts.processCode)&&(r+=" /*# sourceURL="+o+" */ ")),"boolean"==typeof a.schema||!s&&!a.schema.$ref){var l=a.level,c=a.dataLevel,u=a.schema[e="false schema"],h=a.schemaPath+a.util.getProperty(e),d=a.errSchemaPath+"/"+e,p=!a.opts.allErrors,f="data"+(c||""),m="valid"+l;return!1===a.schema?(a.isTop?p=!0:r+=" var "+m+" = false; ",(U=U||[]).push(r),r="",!1!==a.createErrors?(r+=" { keyword: 'false schema' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: {} ",!1!==a.opts.messages&&(r+=" , message: 'boolean schema is false' "),a.opts.verbose&&(r+=" , schema: false , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ",D=r,r=U.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+D+"]); ":" validate.errors = ["+D+"]; return false; ":" var err = "+D+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "):r+=a.isTop?t?" return data; ":" validate.errors = null; return true; ":" var "+m+" = true; ",a.isTop&&(r+=" }; return validate; "),r}if(a.isTop){var v=a.isTop,l=a.level=0,c=a.dataLevel=0,f="data";if(a.rootId=a.resolve.fullPath(a.self._getId(a.root.schema)),a.baseId=a.baseId||a.rootId,delete a.isTop,a.dataPathArr=[""],void 0!==a.schema.default&&a.opts.useDefaults&&a.opts.strictDefaults){var y="default is ignored in the schema root";if("log"!==a.opts.strictDefaults)throw new Error(y);a.logger.warn(y)}r+=" var vErrors = null; ",r+=" var errors = 0;     ",r+=" if (rootData === undefined) rootData = data; "}else{l=a.level,f="data"+((c=a.dataLevel)||"");if(o&&(a.baseId=a.resolve.url(a.baseId,o)),t&&!a.async)throw new Error("async schema in sync schema");r+=" var errs_"+l+" = errors;"}var g,m="valid"+l,p=!a.opts.allErrors,P="",E="",w=a.schema.type,b=Array.isArray(w);if(w&&a.opts.nullable&&!0===a.schema.nullable&&(b?-1==w.indexOf("null")&&(w=w.concat("null")):"null"!=w&&(w=[w,"null"],b=!0)),b&&1==w.length&&(w=w[0],b=!1),a.schema.$ref&&s){if("fail"==a.opts.extendRefs)throw new Error('$ref: validation keywords used in schema at path "'+a.errSchemaPath+'" (see option extendRefs)');!0!==a.opts.extendRefs&&(s=!1,a.logger.warn('$ref: keywords ignored in schema at path "'+a.errSchemaPath+'"'))}if(a.schema.$comment&&a.opts.$comment&&(r+=" "+a.RULES.all.$comment.code(a,"$comment")),w){a.opts.coerceTypes&&(g=a.util.coerceToTypes(a.opts.coerceTypes,w));var S=a.RULES.types[w];if(g||b||!0===S||S&&!Z(S)){h=a.schemaPath+".type",d=a.errSchemaPath+"/type",h=a.schemaPath+".type",d=a.errSchemaPath+"/type";if(r+=" if ("+a.util[b?"checkDataTypes":"checkDataType"](w,f,a.opts.strictNumbers,!0)+") { ",g){var _="dataType"+l,F="coerced"+l;r+=" var "+_+" = typeof "+f+"; var "+F+" = undefined; ","array"==a.opts.coerceTypes&&(r+=" if ("+_+" == 'object' && Array.isArray("+f+") && "+f+".length == 1) { "+f+" = "+f+"[0]; "+_+" = typeof "+f+"; if ("+a.util.checkDataType(a.schema.type,f,a.opts.strictNumbers)+") "+F+" = "+f+"; } "),r+=" if ("+F+" !== undefined) ; ";var x=g;if(x)for(var R,$=-1,j=x.length-1;$<j;)"string"==(R=x[$+=1])?r+=" else if ("+_+" == 'number' || "+_+" == 'boolean') "+F+" = '' + "+f+"; else if ("+f+" === null) "+F+" = ''; ":"number"==R||"integer"==R?(r+=" else if ("+_+" == 'boolean' || "+f+" === null || ("+_+" == 'string' && "+f+" && "+f+" == +"+f+" ","integer"==R&&(r+=" && !("+f+" % 1)"),r+=")) "+F+" = +"+f+"; "):"boolean"==R?r+=" else if ("+f+" === 'false' || "+f+" === 0 || "+f+" === null) "+F+" = false; else if ("+f+" === 'true' || "+f+" === 1) "+F+" = true; ":"null"==R?r+=" else if ("+f+" === '' || "+f+" === 0 || "+f+" === false) "+F+" = null; ":"array"==a.opts.coerceTypes&&"array"==R&&(r+=" else if ("+_+" == 'string' || "+_+" == 'number' || "+_+" == 'boolean' || "+f+" == null) "+F+" = ["+f+"]; ");(U=U||[]).push(r+=" else {   "),r="",!1!==a.createErrors?(r+=" { keyword: 'type' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: { type: '",r+=b?""+w.join(","):""+w,r+="' } ",!1!==a.opts.messages&&(r+=" , message: 'should be ",r+=b?""+w.join(","):""+w,r+="' "),a.opts.verbose&&(r+=" , schema: validate.schema"+h+" , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ";var D=r;r=U.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+D+"]); ":" validate.errors = ["+D+"]; return false; ":" var err = "+D+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",r+=" } if ("+F+" !== undefined) {  ";var O=c?"data"+(c-1||""):"parentData";r+=" "+f+" = "+F+"; ",c||(r+="if ("+O+" !== undefined)"),r+=" "+O+"["+(c?a.dataPathArr[c]:"parentDataProperty")+"] = "+F+"; } "}else{(U=U||[]).push(r),r="",!1!==a.createErrors?(r+=" { keyword: 'type' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: { type: '",r+=b?""+w.join(","):""+w,r+="' } ",!1!==a.opts.messages&&(r+=" , message: 'should be ",r+=b?""+w.join(","):""+w,r+="' "),a.opts.verbose&&(r+=" , schema: validate.schema"+h+" , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ";D=r;r=U.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+D+"]); ":" validate.errors = ["+D+"]; return false; ":" var err = "+D+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "}r+=" } "}}if(a.schema.$ref&&!s)r+=" "+a.RULES.all.$ref.code(a,"$ref")+" ",p&&(r+=" } if (errors === ",r+=v?"0":"errs_"+l,r+=") { ",E+="}");else{var I=a.RULES;if(I)for(var A=-1,k=I.length-1;A<k;)if(Z(S=I[A+=1])){if(S.type&&(r+=" if ("+a.util.checkDataType(S.type,f,a.opts.strictNumbers)+") { "),a.opts.useDefaults)if("object"==S.type&&a.schema.properties){var u=a.schema.properties,C=Object.keys(u);if(C)for(var L,N=-1,q=C.length-1;N<q;){if(void 0!==(Q=u[L=C[N+=1]]).default){var z=f+a.util.getProperty(L);if(a.compositeRule){if(a.opts.strictDefaults){y="default is ignored for: "+z;if("log"!==a.opts.strictDefaults)throw new Error(y);a.logger.warn(y)}}else r+=" if ("+z+" === undefined ","empty"==a.opts.useDefaults&&(r+=" || "+z+" === null || "+z+" === '' "),r+=" ) "+z+" = ",r+="shared"==a.opts.useDefaults?" "+a.useDefault(Q.default)+" ":" "+JSON.stringify(Q.default)+" ",r+="; "}}}else if("array"==S.type&&Array.isArray(a.schema.items)){var T=a.schema.items;if(T)for(var Q,$=-1,V=T.length-1;$<V;)if(void 0!==(Q=T[$+=1]).default){z=f+"["+$+"]";if(a.compositeRule){if(a.opts.strictDefaults){y="default is ignored for: "+z;if("log"!==a.opts.strictDefaults)throw new Error(y);a.logger.warn(y)}}else r+=" if ("+z+" === undefined ","empty"==a.opts.useDefaults&&(r+=" || "+z+" === null || "+z+" === '' "),r+=" ) "+z+" = ",r+="shared"==a.opts.useDefaults?" "+a.useDefault(Q.default)+" ":" "+JSON.stringify(Q.default)+" ",r+="; "}}var U,H=S.rules;if(H)for(var K,M,B=-1,J=H.length-1;B<J;){!G(M=H[B+=1])||(K=M.code(a,M.keyword,S.type))&&(r+=" "+K+" ",p&&(P+="}"))}p&&(r+=" "+P+" ",P=""),S.type&&(r+=" } ",w&&w===S.type&&!g&&(h=a.schemaPath+".type",d=a.errSchemaPath+"/type",(U=U||[]).push(r+=" else { "),r="",!1!==a.createErrors?(r+=" { keyword: 'type' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: { type: '",r+=b?""+w.join(","):""+w,r+="' } ",!1!==a.opts.messages&&(r+=" , message: 'should be ",r+=b?""+w.join(","):""+w,r+="' "),a.opts.verbose&&(r+=" , schema: validate.schema"+h+" , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ",D=r,r=U.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+D+"]); ":" validate.errors = ["+D+"]; return false; ":" var err = "+D+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",r+=" } ")),p&&(r+=" if (errors === ",r+=v?"0":"errs_"+l,r+=") { ",E+="}")}}function Z(e){for(var r=e.rules,t=0;t<r.length;t++)if(G(r[t]))return 1}function G(e){return void 0!==a.schema[e.keyword]||e.implements&&function(e){for(var r=e.implements,t=0;t<r.length;t++)if(void 0!==a.schema[r[t]])return 1}(e)}return p&&(r+=" "+E+" "),v?(t?(r+=" if (errors === 0) return data;           ",r+=" else throw new ValidationError(vErrors); "):(r+=" validate.errors = vErrors; ",r+=" return errors === 0;       "),r+=" }; return validate;"):r+=" var "+m+" = errors === errs_"+l+";",r}},{}],39:[function(e,r,t){"use strict";var i=/^[a-z_$][a-z0-9_$-]*$/i,l=e("./dotjs/custom"),a=e("./definition_schema");function s(e,r){s.errors=null;var t=this._validateKeyword=this._validateKeyword||this.compile(a,!0);if(t(e))return!0;if(s.errors=t.errors,r)throw new Error("custom keyword definition is invalid: "+this.errorsText(t.errors));return!1}r.exports={add:function(e,r){var n=this.RULES;if(n.keywords[e])throw new Error("Keyword "+e+" is already defined");if(!i.test(e))throw new Error("Keyword "+e+" is not a valid identifier");if(r){this.validateKeyword(r,!0);var t=r.type;if(Array.isArray(t))for(var a=0;a<t.length;a++)o(e,t[a],r);else o(e,t,r);var s=r.metaSchema;s&&(r.$data&&this._opts.$data&&(s={anyOf:[s,{$ref:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"}]}),r.validateSchema=this.compile(s,!0))}function o(e,r,t){for(var a,s=0;s<n.length;s++){var o=n[s];if(o.type==r){a=o;break}}a||n.push(a={type:r,rules:[]});var i={keyword:e,definition:t,custom:!0,code:l,implements:t.implements};a.rules.push(i),n.custom[e]=i}return n.keywords[e]=n.all[e]=!0,this},get:function(e){var r=this.RULES.custom[e];return r?r.definition:this.RULES.keywords[e]||!1},remove:function(e){var r=this.RULES;delete r.keywords[e],delete r.all[e],delete r.custom[e];for(var t=0;t<r.length;t++)for(var a=r[t].rules,s=0;s<a.length;s++)if(a[s].keyword==e){a.splice(s,1);break}return this},validate:s}},{"./definition_schema":12,"./dotjs/custom":22}],40:[function(e,r,t){r.exports={$schema:"http://json-schema.org/draft-07/schema#",$id:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",description:"Meta-schema for $data reference (JSON Schema extension proposal)",type:"object",required:["$data"],properties:{$data:{type:"string",anyOf:[{format:"relative-json-pointer"},{format:"json-pointer"}]}},additionalProperties:!1}},{}],41:[function(e,r,t){r.exports={$schema:"http://json-schema.org/draft-07/schema#",$id:"http://json-schema.org/draft-07/schema#",title:"Core schema meta-schema",definitions:{schemaArray:{type:"array",minItems:1,items:{$ref:"#"}},nonNegativeInteger:{type:"integer",minimum:0},nonNegativeIntegerDefault0:{allOf:[{$ref:"#/definitions/nonNegativeInteger"},{default:0}]},simpleTypes:{enum:["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},uniqueItems:!0,default:[]}},type:["object","boolean"],properties:{$id:{type:"string",format:"uri-reference"},$schema:{type:"string",format:"uri"},$ref:{type:"string",format:"uri-reference"},$comment:{type:"string"},title:{type:"string"},description:{type:"string"},default:!0,readOnly:{type:"boolean",default:!1},examples:{type:"array",items:!0},multipleOf:{type:"number",exclusiveMinimum:0},maximum:{type:"number"},exclusiveMaximum:{type:"number"},minimum:{type:"number"},exclusiveMinimum:{type:"number"},maxLength:{$ref:"#/definitions/nonNegativeInteger"},minLength:{$ref:"#/definitions/nonNegativeIntegerDefault0"},pattern:{type:"string",format:"regex"},additionalItems:{$ref:"#"},items:{anyOf:[{$ref:"#"},{$ref:"#/definitions/schemaArray"}],default:!0},maxItems:{$ref:"#/definitions/nonNegativeInteger"},minItems:{$ref:"#/definitions/nonNegativeIntegerDefault0"},uniqueItems:{type:"boolean",default:!1},contains:{$ref:"#"},maxProperties:{$ref:"#/definitions/nonNegativeInteger"},minProperties:{$ref:"#/definitions/nonNegativeIntegerDefault0"},required:{$ref:"#/definitions/stringArray"},additionalProperties:{$ref:"#"},definitions:{type:"object",additionalProperties:{$ref:"#"},default:{}},properties:{type:"object",additionalProperties:{$ref:"#"},default:{}},patternProperties:{type:"object",additionalProperties:{$ref:"#"},propertyNames:{format:"regex"},default:{}},dependencies:{type:"object",additionalProperties:{anyOf:[{$ref:"#"},{$ref:"#/definitions/stringArray"}]}},propertyNames:{$ref:"#"},const:!0,enum:{type:"array",items:!0,minItems:1,uniqueItems:!0},type:{anyOf:[{$ref:"#/definitions/simpleTypes"},{type:"array",items:{$ref:"#/definitions/simpleTypes"},minItems:1,uniqueItems:!0}]},format:{type:"string"},contentMediaType:{type:"string"},contentEncoding:{type:"string"},if:{$ref:"#"},then:{$ref:"#"},else:{$ref:"#"},allOf:{$ref:"#/definitions/schemaArray"},anyOf:{$ref:"#/definitions/schemaArray"},oneOf:{$ref:"#/definitions/schemaArray"},not:{$ref:"#"}},default:!0}},{}],42:[function(e,r,t){"use strict";r.exports=function e(r,t){if(r===t)return!0;if(r&&t&&"object"==typeof r&&"object"==typeof t){if(r.constructor!==t.constructor)return!1;var a,s,o;if(Array.isArray(r)){if((a=r.length)!=t.length)return!1;for(s=a;0!=s--;)if(!e(r[s],t[s]))return!1;return!0}if(r.constructor===RegExp)return r.source===t.source&&r.flags===t.flags;if(r.valueOf!==Object.prototype.valueOf)return r.valueOf()===t.valueOf();if(r.toString!==Object.prototype.toString)return r.toString()===t.toString();if((a=(o=Object.keys(r)).length)!==Object.keys(t).length)return!1;for(s=a;0!=s--;)if(!Object.prototype.hasOwnProperty.call(t,o[s]))return!1;for(s=a;0!=s--;){var i=o[s];if(!e(r[i],t[i]))return!1}return!0}return r!=r&&t!=t}},{}],43:[function(e,r,t){"use strict";r.exports=function(e,r){"function"==typeof(r=r||{})&&(r={cmp:r});var a,l="boolean"==typeof r.cycles&&r.cycles,c=r.cmp&&(a=r.cmp,function(t){return function(e,r){return a({key:e,value:t[e]},{key:r,value:t[r]})}}),u=[];return function e(r){if(r&&r.toJSON&&"function"==typeof r.toJSON&&(r=r.toJSON()),void 0!==r){if("number"==typeof r)return isFinite(r)?""+r:"null";if("object"!=typeof r)return JSON.stringify(r);if(Array.isArray(r)){for(s="[",o=0;o<r.length;o++)o&&(s+=","),s+=e(r[o])||"null";return s+"]"}if(null===r)return"null";if(-1!==u.indexOf(r)){if(l)return JSON.stringify("__cycle__");throw new TypeError("Converting circular structure to JSON")}for(var t=u.push(r)-1,a=Object.keys(r).sort(c&&c(r)),s="",o=0;o<a.length;o++){var i=a[o],n=e(r[i]);n&&(s&&(s+=","),s+=JSON.stringify(i)+":"+n)}return u.splice(t,1),"{"+s+"}"}}(e)}},{}],44:[function(e,r,t){"use strict";var m=r.exports=function(e,r,t){"function"==typeof r&&(t=r,r={}),function e(r,t,a,s,o,i,n,l,c,u){if(s&&"object"==typeof s&&!Array.isArray(s)){for(var h in t(s,o,i,n,l,c,u),s){var d=s[h];if(Array.isArray(d)){if(h in m.arrayKeywords)for(var p=0;p<d.length;p++)e(r,t,a,d[p],o+"/"+h+"/"+p,i,o,h,s,p)}else if(h in m.propsKeywords){if(d&&"object"==typeof d)for(var f in d)e(r,t,a,d[f],o+"/"+h+"/"+f.replace(/~/g,"~0").replace(/\//g,"~1"),i,o,h,s,f)}else(h in m.keywords||r.allKeys&&!(h in m.skipKeywords))&&e(r,t,a,d,o+"/"+h,i,o,h,s)}a(s,o,i,n,l,c,u)}}(r,"function"==typeof(t=r.cb||t)?t:t.pre||function(){},t.post||function(){},e,"",e)};m.keywords={additionalItems:!0,items:!0,contains:!0,additionalProperties:!0,propertyNames:!0,not:!0},m.arrayKeywords={items:!0,allOf:!0,anyOf:!0,oneOf:!0},m.propsKeywords={definitions:!0,properties:!0,patternProperties:!0,dependencies:!0},m.skipKeywords={default:!0,enum:!0,const:!0,required:!0,maximum:!0,minimum:!0,exclusiveMaximum:!0,exclusiveMinimum:!0,multipleOf:!0,maxLength:!0,minLength:!0,pattern:!0,format:!0,maxItems:!0,minItems:!0,uniqueItems:!0,maxProperties:!0,minProperties:!0}},{}],45:[function(e,r,t){var a;a=this,function(e){"use strict";function J(){for(var e=arguments.length,r=Array(e),t=0;t<e;t++)r[t]=arguments[t];if(1<r.length){r[0]=r[0].slice(0,-1);for(var a=r.length-1,s=1;s<a;++s)r[s]=r[s].slice(1,-1);return r[a]=r[a].slice(1),r.join("")}return r[0]}function Z(e){return"(?:"+e+")"}function a(e){return void 0===e?"undefined":null===e?"null":Object.prototype.toString.call(e).split(" ").pop().split("]").shift().toLowerCase()}function f(e){return e.toUpperCase()}function r(e){var r="[A-Za-z]",t="[0-9]",a=J(t,"[A-Fa-f]"),s=Z(Z("%[EFef]"+a+"%"+a+a+"%"+a+a)+"|"+Z("%[89A-Fa-f]"+a+"%"+a+a)+"|"+Z("%"+a+a)),o="[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]",i=J("[\\:\\/\\?\\#\\[\\]\\@]",o),n=e?"[\\uE000-\\uF8FF]":"[]",l=J(r,t,"[\\-\\.\\_\\~]",e?"[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]":"[]"),c=Z(r+J(r,t,"[\\+\\-\\.]")+"*"),u=Z(Z(s+"|"+J(l,o,"[\\:]"))+"*"),h=(Z("(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9][0-9])|(?:[1-9][0-9])|"+t),Z("(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9][0-9])|(?:0?[1-9][0-9])|0?0?"+t)),d=Z(h+"\\."+h+"\\."+h+"\\."+h),p=Z(a+"{1,4}"),f=Z(Z(p+"\\:"+p)+"|"+d),m=Z(Z(p+"\\:")+"{6}"+f),v=Z("\\:\\:"+Z(p+"\\:")+"{5}"+f),y=Z(Z(p)+"?\\:\\:"+Z(p+"\\:")+"{4}"+f),g=Z(Z(Z(p+"\\:")+"{0,1}"+p)+"?\\:\\:"+Z(p+"\\:")+"{3}"+f),P=Z(Z(Z(p+"\\:")+"{0,2}"+p)+"?\\:\\:"+Z(p+"\\:")+"{2}"+f),E=Z(Z(Z(p+"\\:")+"{0,3}"+p)+"?\\:\\:"+p+"\\:"+f),w=Z(Z(Z(p+"\\:")+"{0,4}"+p)+"?\\:\\:"+f),b=Z(Z(Z(p+"\\:")+"{0,5}"+p)+"?\\:\\:"+p),S=Z(Z(Z(p+"\\:")+"{0,6}"+p)+"?\\:\\:"),_=Z([m,v,y,g,P,E,w,b,S].join("|")),F=Z(Z(l+"|"+s)+"+"),x=(Z(_+"\\%25"+F),Z(_+Z("\\%25|\\%(?!"+a+"{2})")+F)),R=Z("[vV]"+a+"+\\."+J(l,o,"[\\:]")+"+"),$=Z("\\["+Z(x+"|"+_+"|"+R)+"\\]"),j=Z(Z(s+"|"+J(l,o))+"*"),D=Z($+"|"+d+"(?!"+j+")|"+j),O=Z(t+"*"),I=Z(Z(u+"@")+"?"+D+Z("\\:"+O)+"?"),A=Z(s+"|"+J(l,o,"[\\:\\@]")),k=Z(A+"*"),C=Z(A+"+"),L=Z(Z(s+"|"+J(l,o,"[\\@]"))+"+"),N=Z(Z("\\/"+k)+"*"),q=Z("\\/"+Z(C+N)+"?"),z=Z(L+N),T=Z(C+N),Q="(?!"+A+")",V=(Z(N+"|"+q+"|"+z+"|"+T+"|"+Q),Z(Z(A+"|"+J("[\\/\\?]",n))+"*")),U=Z(Z(A+"|[\\/\\?]")+"*"),H=Z(Z("\\/\\/"+I+N)+"|"+q+"|"+T+"|"+Q),K=Z(c+"\\:"+H+Z("\\?"+V)+"?"+Z("\\#"+U)+"?"),M=Z(Z("\\/\\/"+I+N)+"|"+q+"|"+z+"|"+Q),B=Z(M+Z("\\?"+V)+"?"+Z("\\#"+U)+"?");Z(K+"|"+B),Z(c+"\\:"+H+Z("\\?"+V)+"?"),Z(Z("\\/\\/("+Z("("+u+")@")+"?("+D+")"+Z("\\:("+O+")")+"?)")+"?("+N+"|"+q+"|"+T+"|"+Q+")"),Z("\\?("+V+")"),Z("\\#("+U+")"),Z(Z("\\/\\/("+Z("("+u+")@")+"?("+D+")"+Z("\\:("+O+")")+"?)")+"?("+N+"|"+q+"|"+z+"|"+Q+")"),Z("\\?("+V+")"),Z("\\#("+U+")"),Z(Z("\\/\\/("+Z("("+u+")@")+"?("+D+")"+Z("\\:("+O+")")+"?)")+"?("+N+"|"+q+"|"+T+"|"+Q+")"),Z("\\?("+V+")"),Z("\\#("+U+")"),Z("("+u+")@"),Z("\\:("+O+")");return{NOT_SCHEME:new RegExp(J("[^]",r,t,"[\\+\\-\\.]"),"g"),NOT_USERINFO:new RegExp(J("[^\\%\\:]",l,o),"g"),NOT_HOST:new RegExp(J("[^\\%\\[\\]\\:]",l,o),"g"),NOT_PATH:new RegExp(J("[^\\%\\/\\:\\@]",l,o),"g"),NOT_PATH_NOSCHEME:new RegExp(J("[^\\%\\/\\@]",l,o),"g"),NOT_QUERY:new RegExp(J("[^\\%]",l,o,"[\\:\\@\\/\\?]",n),"g"),NOT_FRAGMENT:new RegExp(J("[^\\%]",l,o,"[\\:\\@\\/\\?]"),"g"),ESCAPE:new RegExp(J("[^]",l,o),"g"),UNRESERVED:new RegExp(l,"g"),OTHER_CHARS:new RegExp(J("[^\\%]",l,i),"g"),PCT_ENCODED:new RegExp(s,"g"),IPV4ADDRESS:new RegExp("^("+d+")$"),IPV6ADDRESS:new RegExp("^\\[?("+_+")"+Z(Z("\\%25|\\%(?!"+a+"{2})")+"("+F+")")+"?\\]?$")}}var u=r(!1),h=r(!0),w=function(e,r){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,r){var t=[],a=!0,s=!1,o=void 0;try{for(var i,n=e[Symbol.iterator]();!(a=(i=n.next()).done)&&(t.push(i.value),!r||t.length!==r);a=!0);}catch(e){s=!0,o=e}finally{try{!a&&n.return&&n.return()}finally{if(s)throw o}}return t}(e,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")},A=2147483647,t=/^xn--/,s=/[^\0-\x7E]/,o=/[\x2E\u3002\uFF0E\uFF61]/g,i={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},k=Math.floor,C=String.fromCharCode;function L(e){throw new RangeError(i[e])}function n(e,r){var t=e.split("@"),a="";return 1<t.length&&(a=t[0]+"@",e=t[1]),a+function(e,r){for(var t=[],a=e.length;a--;)t[a]=r(e[a]);return t}((e=e.replace(o,".")).split("."),r).join(".")}function N(e){for(var r=[],t=0,a=e.length;t<a;){var s,o=e.charCodeAt(t++);55296<=o&&o<=56319&&t<a?56320==(64512&(s=e.charCodeAt(t++)))?r.push(((1023&o)<<10)+(1023&s)+65536):(r.push(o),t--):r.push(o)}return r}function q(e,r){return e+22+75*(e<26)-((0!=r)<<5)}function z(e,r,t){var a=0;for(e=t?k(e/700):e>>1,e+=k(e/r);455<e;a+=36)e=k(e/35);return k(a+36*e/(e+38))}function l(e){var r=[],t=e.length,a=0,s=128,o=72,i=e.lastIndexOf("-");i<0&&(i=0);for(var n=0;n<i;++n)128<=e.charCodeAt(n)&&L("not-basic"),r.push(e.charCodeAt(n));for(var l,c=0<i?i+1:0;c<t;){for(var u=a,h=1,d=36;;d+=36){t<=c&&L("invalid-input");var p=(l=e.charCodeAt(c++))-48<10?l-22:l-65<26?l-65:l-97<26?l-97:36;(36<=p||p>k((A-a)/h))&&L("overflow"),a+=p*h;var f=d<=o?1:o+26<=d?26:d-o;if(p<f)break;var m=36-f;h>k(A/m)&&L("overflow"),h*=m}var v=r.length+1,o=z(a-u,v,0==u);k(a/v)>A-s&&L("overflow"),s+=k(a/v),a%=v,r.splice(a++,0,s)}return String.fromCodePoint.apply(String,r)}function c(e){var r=[],t=(e=N(e)).length,a=128,s=0,o=72,i=!0,n=!1,l=void 0;try{for(var c,u=e[Symbol.iterator]();!(i=(c=u.next()).done);i=!0){var h=c.value;h<128&&r.push(C(h))}}catch(e){n=!0,l=e}finally{try{!i&&u.return&&u.return()}finally{if(n)throw l}}var d=r.length,p=d;for(d&&r.push("-");p<t;){var f=A,m=!0,v=!1,y=void 0;try{for(var g,P=e[Symbol.iterator]();!(m=(g=P.next()).done);m=!0){var E=g.value;a<=E&&E<f&&(f=E)}}catch(e){v=!0,y=e}finally{try{!m&&P.return&&P.return()}finally{if(v)throw y}}var w=p+1;f-a>k((A-s)/w)&&L("overflow"),s+=(f-a)*w,a=f;var b=!0,S=!1,_=void 0;try{for(var F,x=e[Symbol.iterator]();!(b=(F=x.next()).done);b=!0){var R=F.value;if(R<a&&++s>A&&L("overflow"),R==a){for(var $=s,j=36;;j+=36){var D=j<=o?1:o+26<=j?26:j-o;if($<D)break;var O=$-D,I=36-D;r.push(C(q(D+O%I,0))),$=k(O/I)}r.push(C(q($,0))),o=z(s,w,p==d),s=0,++p}}}catch(e){S=!0,_=e}finally{try{!b&&x.return&&x.return()}finally{if(S)throw _}}++s,++a}return r.join("")}var v={version:"2.1.0",ucs2:{decode:N,encode:function(e){return String.fromCodePoint.apply(String,function(e){if(Array.isArray(e)){for(var r=0,t=Array(e.length);r<e.length;r++)t[r]=e[r];return t}return Array.from(e)}(e))}},decode:l,encode:c,toASCII:function(e){return n(e,function(e){return s.test(e)?"xn--"+c(e):e})},toUnicode:function(e){return n(e,function(e){return t.test(e)?l(e.slice(4).toLowerCase()):e})}},d={};function m(e){var r=e.charCodeAt(0);return r<16?"%0"+r.toString(16).toUpperCase():r<128?"%"+r.toString(16).toUpperCase():r<2048?"%"+(r>>6|192).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase():"%"+(r>>12|224).toString(16).toUpperCase()+"%"+(r>>6&63|128).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase()}function p(e){for(var r="",t=0,a=e.length;t<a;){var s,o,i,n=parseInt(e.substr(t+1,2),16);n<128?(r+=String.fromCharCode(n),t+=3):194<=n&&n<224?(6<=a-t?(s=parseInt(e.substr(t+4,2),16),r+=String.fromCharCode((31&n)<<6|63&s)):r+=e.substr(t,6),t+=6):224<=n?(9<=a-t?(o=parseInt(e.substr(t+4,2),16),i=parseInt(e.substr(t+7,2),16),r+=String.fromCharCode((15&n)<<12|(63&o)<<6|63&i)):r+=e.substr(t,9),t+=9):(r+=e.substr(t,3),t+=3)}return r}function y(e,t){function r(e){var r=p(e);return r.match(t.UNRESERVED)?r:e}return e.scheme&&(e.scheme=String(e.scheme).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_SCHEME,"")),void 0!==e.userinfo&&(e.userinfo=String(e.userinfo).replace(t.PCT_ENCODED,r).replace(t.NOT_USERINFO,m).replace(t.PCT_ENCODED,f)),void 0!==e.host&&(e.host=String(e.host).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_HOST,m).replace(t.PCT_ENCODED,f)),void 0!==e.path&&(e.path=String(e.path).replace(t.PCT_ENCODED,r).replace(e.scheme?t.NOT_PATH:t.NOT_PATH_NOSCHEME,m).replace(t.PCT_ENCODED,f)),void 0!==e.query&&(e.query=String(e.query).replace(t.PCT_ENCODED,r).replace(t.NOT_QUERY,m).replace(t.PCT_ENCODED,f)),void 0!==e.fragment&&(e.fragment=String(e.fragment).replace(t.PCT_ENCODED,r).replace(t.NOT_FRAGMENT,m).replace(t.PCT_ENCODED,f)),e}function b(e){return e.replace(/^0*(.*)/,"$1")||"0"}function S(e,r){var t=e.match(r.IPV4ADDRESS)||[],a=w(t,2)[1];return a?a.split(".").map(b).join("."):e}function g(e,r){var t=e.match(r.IPV6ADDRESS)||[],a=w(t,3),s=a[1],o=a[2];if(s){for(var i=s.toLowerCase().split("::").reverse(),n=w(i,2),l=n[0],c=n[1],u=c?c.split(":").map(b):[],h=l.split(":").map(b),d=r.IPV4ADDRESS.test(h[h.length-1]),p=d?7:8,f=h.length-p,m=Array(p),v=0;v<p;++v)m[v]=u[v]||h[f+v]||"";d&&(m[p-1]=S(m[p-1],r));var y,g,P=m.reduce(function(e,r,t){var a;return r&&"0"!==r||((a=e[e.length-1])&&a.index+a.length===t?a.length++:e.push({index:t,length:1})),e},[]).sort(function(e,r){return r.length-e.length})[0],E=void 0;return E=P&&1<P.length?(y=m.slice(0,P.index),g=m.slice(P.index+P.length),y.join(":")+"::"+g.join(":")):m.join(":"),o&&(E+="%"+o),E}return e}var P=/^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i,E=void 0==="".match(/(){0}/)[1];function _(e){var r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},t={},a=!1!==r.iri?h:u;"suffix"===r.reference&&(e=(r.scheme?r.scheme+":":"")+"//"+e);var s=e.match(P);if(s){E?(t.scheme=s[1],t.userinfo=s[3],t.host=s[4],t.port=parseInt(s[5],10),t.path=s[6]||"",t.query=s[7],t.fragment=s[8],isNaN(t.port)&&(t.port=s[5])):(t.scheme=s[1]||void 0,t.userinfo=-1!==e.indexOf("@")?s[3]:void 0,t.host=-1!==e.indexOf("//")?s[4]:void 0,t.port=parseInt(s[5],10),t.path=s[6]||"",t.query=-1!==e.indexOf("?")?s[7]:void 0,t.fragment=-1!==e.indexOf("#")?s[8]:void 0,isNaN(t.port)&&(t.port=e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?s[4]:void 0)),t.host&&(t.host=g(S(t.host,a),a)),t.reference=void 0!==t.scheme||void 0!==t.userinfo||void 0!==t.host||void 0!==t.port||t.path||void 0!==t.query?void 0===t.scheme?"relative":void 0===t.fragment?"absolute":"uri":"same-document",r.reference&&"suffix"!==r.reference&&r.reference!==t.reference&&(t.error=t.error||"URI is not a "+r.reference+" reference.");var o=d[(r.scheme||t.scheme||"").toLowerCase()];if(r.unicodeSupport||o&&o.unicodeSupport)y(t,a);else{if(t.host&&(r.domainHost||o&&o.domainHost))try{t.host=v.toASCII(t.host.replace(a.PCT_ENCODED,p).toLowerCase())}catch(e){t.error=t.error||"Host's domain name can not be converted to ASCII via punycode: "+e}y(t,u)}o&&o.parse&&o.parse(t,r)}else t.error=t.error||"URI can not be parsed.";return t}var F=/^\.\.?\//,x=/^\/\.(\/|$)/,R=/^\/\.\.(\/|$)/,$=/^\/?(?:.|\n)*?(?=\/|$)/;function j(e){for(var r=[];e.length;)if(e.match(F))e=e.replace(F,"");else if(e.match(x))e=e.replace(x,"/");else if(e.match(R))e=e.replace(R,"/"),r.pop();else if("."===e||".."===e)e="";else{var t=e.match($);if(!t)throw new Error("Unexpected dot segment condition");var a=t[0];e=e.slice(a.length),r.push(a)}return r.join("")}function D(r){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},e=t.iri?h:u,a=[],s=d[(t.scheme||r.scheme||"").toLowerCase()];if(s&&s.serialize&&s.serialize(r,t),r.host&&!e.IPV6ADDRESS.test(r.host)&&(t.domainHost||s&&s.domainHost))try{r.host=t.iri?v.toUnicode(r.host):v.toASCII(r.host.replace(e.PCT_ENCODED,p).toLowerCase())}catch(e){r.error=r.error||"Host's domain name can not be converted to "+(t.iri?"Unicode":"ASCII")+" via punycode: "+e}y(r,e),"suffix"!==t.reference&&r.scheme&&(a.push(r.scheme),a.push(":"));var o,i,n,l,c=(i=!1!==t.iri?h:u,n=[],void 0!==(o=r).userinfo&&(n.push(o.userinfo),n.push("@")),void 0!==o.host&&n.push(g(S(String(o.host),i),i).replace(i.IPV6ADDRESS,function(e,r,t){return"["+r+(t?"%25"+t:"")+"]"})),"number"!=typeof o.port&&"string"!=typeof o.port||(n.push(":"),n.push(String(o.port))),n.length?n.join(""):void 0);return void 0!==c&&("suffix"!==t.reference&&a.push("//"),a.push(c),r.path&&"/"!==r.path.charAt(0)&&a.push("/")),void 0!==r.path&&(l=r.path,t.absolutePath||s&&s.absolutePath||(l=j(l)),void 0===c&&(l=l.replace(/^\/\//,"/%2F")),a.push(l)),void 0!==r.query&&(a.push("?"),a.push(r.query)),void 0!==r.fragment&&(a.push("#"),a.push(r.fragment)),a.join("")}function O(e,r){var t=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},a={};return arguments[3]||(e=_(D(e,t),t),r=_(D(r,t),t)),!(t=t||{}).tolerant&&r.scheme?(a.scheme=r.scheme,a.userinfo=r.userinfo,a.host=r.host,a.port=r.port,a.path=j(r.path||""),a.query=r.query):(void 0!==r.userinfo||void 0!==r.host||void 0!==r.port?(a.userinfo=r.userinfo,a.host=r.host,a.port=r.port,a.path=j(r.path||""),a.query=r.query):(r.path?("/"===r.path.charAt(0)?a.path=j(r.path):(a.path=void 0===e.userinfo&&void 0===e.host&&void 0===e.port||e.path?e.path?e.path.slice(0,e.path.lastIndexOf("/")+1)+r.path:r.path:"/"+r.path,a.path=j(a.path)),a.query=r.query):(a.path=e.path,a.query=void 0!==r.query?r.query:e.query),a.userinfo=e.userinfo,a.host=e.host,a.port=e.port),a.scheme=e.scheme),a.fragment=r.fragment,a}function I(e,r){return e&&e.toString().replace(r&&r.iri?h.PCT_ENCODED:u.PCT_ENCODED,p)}var T={scheme:"http",domainHost:!0,parse:function(e){return e.host||(e.error=e.error||"HTTP URIs must have a host."),e},serialize:function(e){var r="https"===String(e.scheme).toLowerCase();return e.port!==(r?443:80)&&""!==e.port||(e.port=void 0),e.path||(e.path="/"),e}},Q={scheme:"https",domainHost:T.domainHost,parse:T.parse,serialize:T.serialize};function V(e){return"boolean"==typeof e.secure?e.secure:"wss"===String(e.scheme).toLowerCase()}var U={scheme:"ws",domainHost:!0,parse:function(e){var r=e;return r.secure=V(r),r.resourceName=(r.path||"/")+(r.query?"?"+r.query:""),r.path=void 0,r.query=void 0,r},serialize:function(e){var r,t,a,s;return e.port!==(V(e)?443:80)&&""!==e.port||(e.port=void 0),"boolean"==typeof e.secure&&(e.scheme=e.secure?"wss":"ws",e.secure=void 0),e.resourceName&&(r=e.resourceName.split("?"),s=(t=w(r,2))[1],e.path=(a=t[0])&&"/"!==a?a:void 0,e.query=s,e.resourceName=void 0),e.fragment=void 0,e}},H={scheme:"wss",domainHost:U.domainHost,parse:U.parse,serialize:U.serialize},K={},M="[A-Za-z0-9\\-\\.\\_\\~\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]",B="[0-9A-Fa-f]",G=(Z(Z("%[EFef]"+B+"%"+B+B+"%"+B+B)+"|"+Z("%[89A-Fa-f]"+B+"%"+B+B)+"|"+Z("%"+B+B)),J("[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]",'[\\"\\\\]')),Y=new RegExp(M,"g"),W=new RegExp("(?:(?:%[EFef][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[89A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[0-9A-Fa-f][0-9A-Fa-f]))","g"),X=new RegExp(J("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',G),"g"),ee=new RegExp(J("[^]",M,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),re=ee;function te(e){var r=p(e);return r.match(Y)?r:e}var ae={scheme:"mailto",parse:function(e,r){var t=e,a=t.to=t.path?t.path.split(","):[];if(t.path=void 0,t.query){for(var s=!1,o={},i=t.query.split("&"),n=0,l=i.length;n<l;++n){var c=i[n].split("=");switch(c[0]){case"to":for(var u=c[1].split(","),h=0,d=u.length;h<d;++h)a.push(u[h]);break;case"subject":t.subject=I(c[1],r);break;case"body":t.body=I(c[1],r);break;default:s=!0,o[I(c[0],r)]=I(c[1],r)}}s&&(t.headers=o)}t.query=void 0;for(var p=0,f=a.length;p<f;++p){var m=a[p].split("@");if(m[0]=I(m[0]),r.unicodeSupport)m[1]=I(m[1],r).toLowerCase();else try{m[1]=v.toASCII(I(m[1],r).toLowerCase())}catch(e){t.error=t.error||"Email address's domain name can not be converted to ASCII via punycode: "+e}a[p]=m.join("@")}return t},serialize:function(e,r){var t,a=e,s=null!=(t=e.to)?t instanceof Array?t:"number"!=typeof t.length||t.split||t.setInterval||t.call?[t]:Array.prototype.slice.call(t):[];if(s){for(var o=0,i=s.length;o<i;++o){var n=String(s[o]),l=n.lastIndexOf("@"),c=n.slice(0,l).replace(W,te).replace(W,f).replace(X,m),u=n.slice(l+1);try{u=r.iri?v.toUnicode(u):v.toASCII(I(u,r).toLowerCase())}catch(e){a.error=a.error||"Email address's domain name can not be converted to "+(r.iri?"Unicode":"ASCII")+" via punycode: "+e}s[o]=c+"@"+u}a.path=s.join(",")}var h=e.headers=e.headers||{};e.subject&&(h.subject=e.subject),e.body&&(h.body=e.body);var d,p=[];for(d in h)h[d]!==K[d]&&p.push(d.replace(W,te).replace(W,f).replace(ee,m)+"="+h[d].replace(W,te).replace(W,f).replace(re,m));return p.length&&(a.query=p.join("&")),a}},se=/^([^\:]+)\:(.*)/,oe={scheme:"urn",parse:function(e,r){var t,a,s,o,i=e.path&&e.path.match(se),n=e;return i?(t=r.scheme||n.scheme||"urn",a=i[1].toLowerCase(),s=i[2],o=d[t+":"+(r.nid||a)],n.nid=a,n.nss=s,n.path=void 0,o&&(n=o.parse(n,r))):n.error=n.error||"URN can not be parsed.",n},serialize:function(e,r){var t=e.nid,a=d[(r.scheme||e.scheme||"urn")+":"+(r.nid||t)];a&&(e=a.serialize(e,r));var s=e;return s.path=(t||r.nid)+":"+e.nss,s}},ie=/^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/,ne={scheme:"urn:uuid",parse:function(e,r){var t=e;return t.uuid=t.nss,t.nss=void 0,r.tolerant||t.uuid&&t.uuid.match(ie)||(t.error=t.error||"UUID is not valid."),t},serialize:function(e){var r=e;return r.nss=(e.uuid||"").toLowerCase(),r}};d[T.scheme]=T,d[Q.scheme]=Q,d[U.scheme]=U,d[H.scheme]=H,d[ae.scheme]=ae,d[oe.scheme]=oe,d[ne.scheme]=ne,e.SCHEMES=d,e.pctEncChar=m,e.pctDecChars=p,e.parse=_,e.removeDotSegments=j,e.serialize=D,e.resolveComponents=O,e.resolve=function(e,r,t){var a=function(e,r){var t=e;if(r)for(var a in r)t[a]=r[a];return t}({scheme:"null"},t);return D(O(_(e,a),_(r,a),a,!0),a)},e.normalize=function(e,r){return"string"==typeof e?e=D(_(e,r),r):"object"===a(e)&&(e=_(D(e,r),r)),e},e.equal=function(e,r,t){return"string"==typeof e?e=D(_(e,t),t):"object"===a(e)&&(e=D(e,t)),"string"==typeof r?r=D(_(r,t),t):"object"===a(r)&&(r=D(r,t)),e===r},e.escapeComponent=function(e,r){return e&&e.toString().replace(r&&r.iri?h.ESCAPE:u.ESCAPE,m)},e.unescapeComponent=I,Object.defineProperty(e,"__esModule",{value:!0})}("object"==typeof t&&void 0!==r?t:a.URI=a.URI||{})},{}],ajv:[function(a,e,r){"use strict";var n=a("./compile"),d=a("./compile/resolve"),t=a("./cache"),p=a("./compile/schema_obj"),s=a("fast-json-stable-stringify"),o=a("./compile/formats"),i=a("./compile/rules"),l=a("./data"),c=a("./compile/util");(e.exports=y).prototype.validate=function(e,r){var t;if("string"==typeof e){if(!(t=this.getSchema(e)))throw new Error('no schema with key or ref "'+e+'"')}else{var a=this._addSchema(e);t=a.validate||this._compile(a)}var s=t(r);!0!==t.$async&&(this.errors=t.errors);return s},y.prototype.compile=function(e,r){var t=this._addSchema(e,void 0,r);return t.validate||this._compile(t)},y.prototype.addSchema=function(e,r,t,a){if(Array.isArray(e)){for(var s=0;s<e.length;s++)this.addSchema(e[s],void 0,t,a);return this}var o=this._getId(e);if(void 0!==o&&"string"!=typeof o)throw new Error("schema id must be string");return S(this,r=d.normalizeId(r||o)),this._schemas[r]=this._addSchema(e,t,a,!0),this},y.prototype.addMetaSchema=function(e,r,t){return this.addSchema(e,r,t,!0),this},y.prototype.validateSchema=function(e,r){var t=e.$schema;if(void 0!==t&&"string"!=typeof t)throw new Error("$schema must be a string");if(!(t=t||this._opts.defaultMeta||function(e){var r=e._opts.meta;return e._opts.defaultMeta="object"==typeof r?e._getId(r)||r:e.getSchema(f)?f:void 0,e._opts.defaultMeta}(this)))return this.logger.warn("meta-schema not available"),!(this.errors=null);var a=this.validate(t,e);if(!a&&r){var s="schema is invalid: "+this.errorsText();if("log"!=this._opts.validateSchema)throw new Error(s);this.logger.error(s)}return a},y.prototype.getSchema=function(e){var r=g(this,e);switch(typeof r){case"object":return r.validate||this._compile(r);case"string":return this.getSchema(r);case"undefined":return function(e,r){var t=d.schema.call(e,{schema:{}},r);if(t){var a=t.schema,s=t.root,o=t.baseId,i=n.call(e,a,s,void 0,o);return e._fragments[r]=new p({ref:r,fragment:!0,schema:a,root:s,baseId:o,validate:i}),i}}(this,e)}},y.prototype.removeSchema=function(e){if(e instanceof RegExp)return P(this,this._schemas,e),P(this,this._refs,e),this;switch(typeof e){case"undefined":return P(this,this._schemas),P(this,this._refs),this._cache.clear(),this;case"string":var r=g(this,e);return r&&this._cache.del(r.cacheKey),delete this._schemas[e],delete this._refs[e],this;case"object":var t=this._opts.serialize,a=t?t(e):e;this._cache.del(a);var s=this._getId(e);s&&(s=d.normalizeId(s),delete this._schemas[s],delete this._refs[s])}return this},y.prototype.addFormat=function(e,r){"string"==typeof r&&(r=new RegExp(r));return this._formats[e]=r,this},y.prototype.errorsText=function(e,r){if(!(e=e||this.errors))return"No errors";for(var t=void 0===(r=r||{}).separator?", ":r.separator,a=void 0===r.dataVar?"data":r.dataVar,s="",o=0;o<e.length;o++){var i=e[o];i&&(s+=a+i.dataPath+" "+i.message+t)}return s.slice(0,-t.length)},y.prototype._addSchema=function(e,r,t,a){if("object"!=typeof e&&"boolean"!=typeof e)throw new Error("schema should be object or boolean");var s=this._opts.serialize,o=s?s(e):e,i=this._cache.get(o);if(i)return i;a=a||!1!==this._opts.addUsedSchema;var n=d.normalizeId(this._getId(e));n&&a&&S(this,n);var l,c=!1!==this._opts.validateSchema&&!r;c&&!(l=n&&n==d.normalizeId(e.$schema))&&this.validateSchema(e,!0);var u=d.ids.call(this,e),h=new p({id:n,schema:e,localRefs:u,cacheKey:o,meta:t});"#"!=n[0]&&a&&(this._refs[n]=h);this._cache.put(o,h),c&&l&&this.validateSchema(e,!0);return h},y.prototype._compile=function(t,e){if(t.compiling)return(t.validate=s).schema=t.schema,s.errors=null,s.root=e||s,!0===t.schema.$async&&(s.$async=!0),s;var r,a;t.compiling=!0,t.meta&&(r=this._opts,this._opts=this._metaOpts);try{a=n.call(this,t.schema,e,t.localRefs)}catch(e){throw delete t.validate,e}finally{t.compiling=!1,t.meta&&(this._opts=r)}return t.validate=a,t.refs=a.refs,t.refVal=a.refVal,t.root=a.root,a;function s(){var e=t.validate,r=e.apply(this,arguments);return s.errors=e.errors,r}},y.prototype.compileAsync=a("./compile/async");var u=a("./keyword");y.prototype.addKeyword=u.add,y.prototype.getKeyword=u.get,y.prototype.removeKeyword=u.remove,y.prototype.validateKeyword=u.validate;var h=a("./compile/error_classes");y.ValidationError=h.Validation,y.MissingRefError=h.MissingRef,y.$dataMetaSchema=l;var f="http://json-schema.org/draft-07/schema",m=["removeAdditional","useDefaults","coerceTypes","strictDefaults"],v=["/properties"];function y(e){if(!(this instanceof y))return new y(e);e=this._opts=c.copy(e)||{},function(e){var r=e._opts.logger;if(!1===r)e.logger={log:_,warn:_,error:_};else{if(void 0===r&&(r=console),!("object"==typeof r&&r.log&&r.warn&&r.error))throw new Error("logger must implement log, warn and error methods");e.logger=r}}(this),this._schemas={},this._refs={},this._fragments={},this._formats=o(e.format),this._cache=e.cache||new t,this._loadingSchemas={},this._compilations=[],this.RULES=i(),this._getId=function(e){switch(e.schemaId){case"auto":return b;case"id":return E;default:return w}}(e),e.loopRequired=e.loopRequired||1/0,"property"==e.errorDataPath&&(e._errorDataPathProperty=!0),void 0===e.serialize&&(e.serialize=s),this._metaOpts=function(e){for(var r=c.copy(e._opts),t=0;t<m.length;t++)delete r[m[t]];return r}(this),e.formats&&function(e){for(var r in e._opts.formats){e.addFormat(r,e._opts.formats[r])}}(this),e.keywords&&function(e){for(var r in e._opts.keywords){e.addKeyword(r,e._opts.keywords[r])}}(this),function(e){var r;e._opts.$data&&(r=a("./refs/data.json"),e.addMetaSchema(r,r.$id,!0));if(!1===e._opts.meta)return;var t=a("./refs/json-schema-draft-07.json");e._opts.$data&&(t=l(t,v));e.addMetaSchema(t,f,!0),e._refs["http://json-schema.org/schema"]=f}(this),"object"==typeof e.meta&&this.addMetaSchema(e.meta),e.nullable&&this.addKeyword("nullable",{metaSchema:{type:"boolean"}}),function(e){var r=e._opts.schemas;if(!r)return;if(Array.isArray(r))e.addSchema(r);else for(var t in r)e.addSchema(r[t],t)}(this)}function g(e,r){return r=d.normalizeId(r),e._schemas[r]||e._refs[r]||e._fragments[r]}function P(e,r,t){for(var a in r){var s=r[a];s.meta||t&&!t.test(a)||(e._cache.del(s.cacheKey),delete r[a])}}function E(e){return e.$id&&this.logger.warn("schema $id ignored",e.$id),e.id}function w(e){return e.id&&this.logger.warn("schema id ignored",e.id),e.$id}function b(e){if(e.$id&&e.id&&e.$id!=e.id)throw new Error("schema $id is different from id");return e.$id||e.id}function S(e,r){if(e._schemas[r]||e._refs[r])throw new Error('schema with key or id "'+r+'" already exists')}function _(){}},{"./cache":1,"./compile":5,"./compile/async":2,"./compile/error_classes":3,"./compile/formats":4,"./compile/resolve":6,"./compile/rules":7,"./compile/schema_obj":8,"./compile/util":10,"./data":11,"./keyword":39,"./refs/data.json":40,"./refs/json-schema-draft-07.json":41,"fast-json-stable-stringify":43}]},{},[])("ajv")});
//# sourceMappingURL=ajv.min.js.map{"version":3,"file":"ajv.min.js","sources":["0"],"names":["f","exports","module","define","amd","window","global","self","this","Ajv","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","Cache","_cache","prototype","put","key","value","get","del","clear","2","MissingRefError","MissingRef","compileAsync","schema","meta","callback","_opts","loadSchema","undefined","loadMetaSchemaOf","then","schemaObj","_addSchema","validate","_compileAsync","_compile","loadMissingSchema","ref","missingSchema","added","missingRef","schemaPromise","_loadingSchemas","removePromise","sch","addSchema","_refs","_schemas","v","$schema","getSchema","$ref","Promise","resolve","./error_classes","3","baseId","message","url","normalizeId","fullPath","errorSubclass","Subclass","Object","create","constructor","Validation","errors","ajv","validation","./resolve","4","util","DATE","DAYS","TIME","HOSTNAME","URI","URITEMPLATE","URL","UUID","JSON_POINTER","JSON_POINTER_URI_FRAGMENT","RELATIVE_JSON_POINTER","formats","mode","copy","date","str","matches","match","year","month","day","time","full","hour","minute","second","fast","date-time","uri","uri-reference","uri-template","email","hostname","ipv4","ipv6","regex","uuid","json-pointer","json-pointer-uri-fragment","relative-json-pointer","dateTime","split","DATE_TIME_SEPARATOR","NOT_URI_FRAGMENT","test","Z_ANCHOR","RegExp","./util","5","errorClasses","stableStringify","validateGenerator","ucs2length","equal","ValidationError","compile","root","localRefs","opts","refVal","refs","patterns","patternsHash","defaults","defaultsHash","customRules","index","compIndex","compiling","_compilations","compilation","callValidate","_formats","RULES","localCompile","cv","$async","sourceCode","source","splice","result","apply","arguments","_schema","_root","isRoot","isTop","schemaPath","errSchemaPath","errorPath","resolveRef","usePattern","useDefault","useCustomRule","logger","vars","refValCode","patternCode","defaultCode","customRuleCode","processCode","Function","makeValidate","error","_refVal","refCode","refIndex","resolvedRef","rootRefId","addLocalRef","localSchema","inlineRef","inlineRefs","refId","inline","regexStr","toQuotedString","valueStr","rule","parentSchema","it","validateSchema","deps","definition","dependencies","every","keyword","hasOwnProperty","join","errorsText","macro","arr","statement","../dotjs/validate","fast-deep-equal","fast-json-stable-stringify","6","SchemaObject","traverse","res","resolveSchema","parse","refPath","_getFullPath","getFullPath","_getId","keys","id","parsedRef","resolveUrl","getJsonPointer","ids","schemaId","baseIds","","fullPaths","allKeys","jsonPtr","rootSchema","parentJsonPtr","parentKeyword","keyIndex","escapeFragment","PREVENT_SCOPE_CHANGE","toHash","fragment","slice","parts","part","unescapeFragment","SIMPLE_INLINED","limit","checkNoRef","item","Array","isArray","countKeys","count","Infinity","normalize","serialize","TRAILING_SLASH_HASH","replace","./schema_obj","json-schema-traverse","uri-js","7","ruleModules","type","rules","maximum","minimum","properties","ALL","all","types","forEach","group","map","implKeywords","k","push","implements","$comment","keywords","concat","custom","../dotjs","8","obj","9","len","pos","charCodeAt","10","checkDataType","dataType","data","strictNumbers","negate","EQUAL","AND","OK","NOT","to","checkDataTypes","dataTypes","array","object","null","number","integer","coerceToTypes","optionCoerceTypes","COERCE_TO_TYPES","getProperty","escapeQuotes","varOccurences","dataVar","varReplace","expr","schemaHasRules","schemaHasRulesExcept","exceptKeyword","schemaUnknownRules","getPathExpr","currentPath","jsonPointers","isNumber","joinPaths","getPath","prop","path","escapeJsonPointer","getData","$data","lvl","paths","up","jsonPointer","segments","segment","unescapeJsonPointer","decodeURIComponent","encodeURIComponent","hash","IDENTIFIER","SINGLE_QUOTE","b","./ucs2length","11","KEYWORDS","metaSchema","keywordsJsonPointers","JSON","stringify","j","anyOf","12","$id","definitions","simpleTypes","statements","valid","not","required","items","modifying","async","const","./refs/json-schema-draft-07.json","13","$keyword","$schemaValueExcl","$exclusive","$exclType","$exclIsNumber","$opStr","$opExpr","$$outStack","out","$lvl","level","$dataLvl","dataLevel","$schemaPath","$errSchemaPath","$breakOnError","allErrors","$isData","$schemaValue","dataPathArr","$isMax","$exclusiveKeyword","$schemaExcl","$isDataExcl","$op","$notOp","$errorKeyword","createErrors","messages","verbose","__err","pop","compositeRule","Math","14","15","unicode","16","17","$it","$closingBraces","$nextValid","$currentBaseId","$allSchemasEmpty","arr1","$sch","$i","l1","strictKeywords","18","$valid","$errs","$wasComposite","19","20","21","$passData","$code","$idx","$dataNxt","$nextData","$nonEmptySchema","22","$compile","$inline","$macro","$ruleValidate","$validateCode","$rule","$definition","$rDef","$validateSchema","$parentData","$parentDataProperty","def_callRuleValidate","def_customError","$ruleErrs","$ruleErr","$asyncKeyword","passContext","23","$deps","$schemaDeps","$propertyDeps","$ownProperties","ownProperties","$property","$currentErrorPath","$propertyKey","$useData","$prop","$propertyPath","$missingProperty","_errorDataPathProperty","arr2","i2","l2","24","$vSchema","25","$ruleType","format","$format","$unknownFormats","unknownFormats","$allowUnknown","$isObject","$formatType","warn","indexOf","$formatRef","26","$ifClause","$thenSch","$elseSch","$thenPresent","$elsePresent","27","allOf","contains","enum","if","maxItems","minItems","maxLength","minLength","maxProperties","minProperties","multipleOf","oneOf","pattern","propertyNames","uniqueItems","./_limit","./_limitItems","./_limitLength","./_limitProperties","./allOf","./anyOf","./comment","./const","./contains","./dependencies","./enum","./format","./if","./items","./multipleOf","./not","./oneOf","./pattern","./properties","./propertyNames","./ref","./required","./uniqueItems","./validate","28","$currErrSchemaPath","$additionalItems","additionalItems","29","multipleOfPrecision","30","$allErrorsOption","31","$prevValid","$passingSchemas","32","$regexp","33","$requiredHash","$additionalProperty","$key","$dataProperties","$schemaKeys","filter","notProto","$pProperties","patternProperties","$pPropertyKeys","$aProperties","additionalProperties","$someProperties","$noAdditional","$additionalIsSchema","$removeAdditional","removeAdditional","$checkAdditional","$required","loopRequired","i1","$pProperty","$useDefaults","useDefaults","arr3","i3","l3","$hasDefault","default","arr4","i4","l4","34","$invalidName","35","$refCode","$refVal","$message","missingRefs","__callValidate","36","$propertySch","$loopRequired","37","$itemType","$typeIsArray","38","$refKeywords","$unknownKwd","$keywordsMsg","$top","rootId","strictDefaults","$defaultMsg","$coerceToTypes","$closingBraces1","$closingBraces2","$typeSchema","nullable","extendRefs","coerceTypes","$rulesGroup","$shouldUseGroup","$dataType","$coerced","$type","arr5","i5","l5","$shouldUseRule","impl","$ruleImplementsSomeKeyword","39","definitionSchema","validateKeyword","throwError","_validateKeyword","add","_addRule","ruleGroup","rg","remove","./definition_schema","./dotjs/custom","40","description","41","title","schemaArray","nonNegativeInteger","nonNegativeIntegerDefault0","stringArray","readOnly","examples","exclusiveMinimum","exclusiveMaximum","contentMediaType","contentEncoding","else","42","flags","valueOf","toString","43","cmp","cycles","node","seen","toJSON","isFinite","TypeError","seenIndex","sort","44","cb","_traverse","pre","post","arrayKeywords","propsKeywords","skipKeywords","45","merge","_len","sets","_key","xl","x","subexp","typeOf","shift","toLowerCase","toUpperCase","buildExps","isIRI","ALPHA$$","DIGIT$$","HEXDIG$$","PCT_ENCODED$","SUB_DELIMS$$","RESERVED$$","IPRIVATE$$","UNRESERVED$$","SCHEME$","USERINFO$","DEC_OCTET_RELAXED$","IPV4ADDRESS$","H16$","LS32$","IPV6ADDRESS1$","IPV6ADDRESS2$","IPV6ADDRESS3$","IPV6ADDRESS4$","IPV6ADDRESS5$","IPV6ADDRESS6$","IPV6ADDRESS7$","IPV6ADDRESS8$","IPV6ADDRESS9$","IPV6ADDRESS$","ZONEID$","IPV6ADDRZ_RELAXED$","IPVFUTURE$","IP_LITERAL$","REG_NAME$","HOST$","PORT$","AUTHORITY$","PCHAR$","SEGMENT$","SEGMENT_NZ$","SEGMENT_NZ_NC$","PATH_ABEMPTY$","PATH_ABSOLUTE$","PATH_NOSCHEME$","PATH_ROOTLESS$","PATH_EMPTY$","QUERY$","FRAGMENT$","HIER_PART$","URI$","RELATIVE_PART$","RELATIVE$","NOT_SCHEME","NOT_USERINFO","NOT_HOST","NOT_PATH","NOT_PATH_NOSCHEME","NOT_QUERY","NOT_FRAGMENT","ESCAPE","UNRESERVED","OTHER_CHARS","PCT_ENCODED","IPV4ADDRESS","IPV6ADDRESS","URI_PROTOCOL","IRI_PROTOCOL","slicedToArray","Symbol","iterator","_arr","_n","_d","_e","_s","_i","next","done","err","sliceIterator","maxInt","regexPunycode","regexNonASCII","regexSeparators","overflow","not-basic","invalid-input","floor","stringFromCharCode","String","fromCharCode","error$1","RangeError","mapDomain","string","fn","ucs2decode","output","counter","extra","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","baseMinusTMin","base","decode","input","inputLength","bias","basic","lastIndexOf","codePoint","oldi","w","baseMinusT","fromCodePoint","encode","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","_currentValue2","return","basicLength","handledCPCount","m","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","currentValue","handledCPCountPlusOne","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","_currentValue","q","qMinusT","punycode","version","ucs2","from","toConsumableArray","toASCII","toUnicode","SCHEMES","pctEncChar","chr","pctDecChars","newStr","il","c2","_c","c3","parseInt","substr","_normalizeComponentEncoding","components","protocol","decodeUnreserved","decStr","scheme","userinfo","host","query","_stripLeadingZeros","_normalizeIPv4","address","_normalizeIPv6","_matches2","zone","_address$toLowerCase$","reverse","_address$toLowerCase$2","last","first","firstFields","lastFields","isLastFieldIPv4Address","fieldCount","lastFieldsStart","fields","newFirst","newLast","longestZeroFields","reduce","acc","field","lastLongest","newHost","URI_PARSE","NO_MATCH_IS_UNDEFINED","uriString","options","iri","reference","port","isNaN","schemeHandler","unicodeSupport","domainHost","RDS1","RDS2","RDS3","RDS5","removeDotSegments","im","s","uriTokens","authority","_","$1","$2","charAt","absolutePath","resolveComponents","relative","target","tolerant","unescapeComponent","handler","secure","handler$1","isSecure","wsComponents","handler$2","resourceName","_wsComponents$resourc","_wsComponents$resourc2","handler$3","O","VCHAR$$","NOT_LOCAL_PART","NOT_HFNAME","NOT_HFVALUE","handler$4","mailtoComponents","unknownHeaders","headers","hfields","hfield","toAddrs","_x","_xl","subject","body","_x2","_xl2","addr","setInterval","toAddr","atIdx","localPart","domain","name","URN_PARSE","handler$5","nid","nss","urnComponents","uriComponents","handler$6","uuidComponents","baseURI","relativeURI","schemelessOptions","assign","uriA","uriB","escapeComponent","defineProperty","factory","compileSchema","$dataMetaSchema","schemaKeyRef","_meta","_skipValidation","checkUnique","addMetaSchema","skipValidation","throwOrLogError","defaultMeta","META_SCHEMA_ID","keyRef","_getSchemaObj","_fragments","_getSchemaFragment","removeSchema","_removeAllSchemas","cacheKey","addFormat","separator","text","dataPath","shouldAddSchema","cached","addUsedSchema","recursiveMeta","willValidate","currentOpts","_metaOpts","_validate","customKeyword","addKeyword","getKeyword","removeKeyword","META_IGNORE_OPTIONS","META_SUPPORT_DATA","log","noop","console","setLogger","cache","_get$IdOrId","_get$Id","chooseGetId","errorDataPath","metaOpts","getMetaSchemaOptions","addInitialFormats","addInitialKeywords","$dataSchema","addDefaultMetaSchema","optsSchemas","schemas","addInitialSchemas","./cache","./compile","./compile/async","./compile/error_classes","./compile/formats","./compile/resolve","./compile/rules","./compile/schema_obj","./compile/util","./data","./keyword","./refs/data.json"],"mappings":"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"}The MIT License (MIT)

Copyright (c) 2016 Evgeny Poberezkin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';

var KEYWORDS = require('./keywords');

module.exports = defineKeywords;


/**
 * Defines one or several keywords in ajv instance
 * @param  {Ajv} ajv validator instance
 * @param  {String|Array<String>|undefined} keyword keyword(s) to define
 * @return {Ajv} ajv instance (for chaining)
 */
function defineKeywords(ajv, keyword) {
  if (Array.isArray(keyword)) {
    for (var i=0; i<keyword.length; i++)
      get(keyword[i])(ajv);
    return ajv;
  }
  if (keyword) {
    get(keyword)(ajv);
    return ajv;
  }
  for (keyword in KEYWORDS) get(keyword)(ajv);
  return ajv;
}


defineKeywords.get = get;

function get(keyword) {
  var defFunc = KEYWORDS[keyword];
  if (!defFunc) throw new Error('Unknown keyword ' + keyword);
  return defFunc;
}
{
  "author": {
    "name": "Evgeny Poberezkin"
  },
  "deprecated": false,
  "description": "Custom JSON-Schema keywords for Ajv validator",
  "devDependencies": {
    "ajv": "^6.9.1",
    "ajv-pack": "^0.3.0",
    "chai": "^4.2.0",
    "coveralls": "^3.0.2",
    "dot": "^1.1.1",
    "eslint": "^7.2.0",
    "glob": "^7.1.3",
    "istanbul": "^0.4.3",
    "js-beautify": "^1.8.9",
    "json-schema-test": "^2.0.0",
    "mocha": "^8.0.1",
    "pre-commit": "^1.1.3",
    "uuid": "^8.1.0"
  },
  "files": [
    "index.js",
    "ajv-keywords.d.ts",
    "keywords"
  ],
  "homepage": "https://github.com/epoberezkin/ajv-keywords#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "ajv-keywords",
  "peerDependencies": {
    "ajv": "^6.9.1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/epoberezkin/ajv-keywords.git"
  },
  "typings": "ajv-keywords.d.ts",
  "version": "3.5.2"
}'use strict';

var TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d:\d\d)?$/i;
var DATE_TIME_SEPARATOR = /t|\s/i;

var COMPARE_FORMATS = {
  date: compareDate,
  time: compareTime,
  'date-time': compareDateTime
};

var $dataMetaSchema = {
  type: 'object',
  required: [ '$data' ],
  properties: {
    $data: {
      type: 'string',
      anyOf: [
        { format: 'relative-json-pointer' },
        { format: 'json-pointer' }
      ]
    }
  },
  additionalProperties: false
};

module.exports = function (minMax) {
  var keyword = 'format' + minMax;
  return function defFunc(ajv) {
    defFunc.definition = {
      type: 'string',
      inline: require('./dotjs/_formatLimit'),
      statements: true,
      errors: 'full',
      dependencies: ['format'],
      metaSchema: {
        anyOf: [
          {type: 'string'},
          $dataMetaSchema
        ]
      }
    };

    ajv.addKeyword(keyword, defFunc.definition);
    ajv.addKeyword('formatExclusive' + minMax, {
      dependencies: ['format' + minMax],
      metaSchema: {
        anyOf: [
          {type: 'boolean'},
          $dataMetaSchema
        ]
      }
    });
    extendFormats(ajv);
    return ajv;
  };
};


function extendFormats(ajv) {
  var formats = ajv._formats;
  for (var name in COMPARE_FORMATS) {
    var format = formats[name];
    // the last condition is needed if it's RegExp from another window
    if (typeof format != 'object' || format instanceof RegExp || !format.validate)
      format = formats[name] = { validate: format };
    if (!format.compare)
      format.compare = COMPARE_FORMATS[name];
  }
}


function compareDate(d1, d2) {
  if (!(d1 && d2)) return;
  if (d1 > d2) return 1;
  if (d1 < d2) return -1;
  if (d1 === d2) return 0;
}


function compareTime(t1, t2) {
  if (!(t1 && t2)) return;
  t1 = t1.match(TIME);
  t2 = t2.match(TIME);
  if (!(t1 && t2)) return;
  t1 = t1[1] + t1[2] + t1[3] + (t1[4]||'');
  t2 = t2[1] + t2[2] + t2[3] + (t2[4]||'');
  if (t1 > t2) return 1;
  if (t1 < t2) return -1;
  if (t1 === t2) return 0;
}


function compareDateTime(dt1, dt2) {
  if (!(dt1 && dt2)) return;
  dt1 = dt1.split(DATE_TIME_SEPARATOR);
  dt2 = dt2.split(DATE_TIME_SEPARATOR);
  var res = compareDate(dt1[0], dt2[0]);
  if (res === undefined) return;
  return res || compareTime(dt1[1], dt2[1]);
}
'use strict';

module.exports = {
  metaSchemaRef: metaSchemaRef
};

var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema';

function metaSchemaRef(ajv) {
  var defaultMeta = ajv._opts.defaultMeta;
  if (typeof defaultMeta == 'string') return { $ref: defaultMeta };
  if (ajv.getSchema(META_SCHEMA_ID)) return { $ref: META_SCHEMA_ID };
  console.warn('meta schema not defined');
  return {};
}
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    macro: function (schema, parentSchema) {
      if (!schema) return true;
      var properties = Object.keys(parentSchema.properties);
      if (properties.length == 0) return true;
      return {required: properties};
    },
    metaSchema: {type: 'boolean'},
    dependencies: ['properties']
  };

  ajv.addKeyword('allRequired', defFunc.definition);
  return ajv;
};
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    macro: function (schema) {
      if (schema.length == 0) return true;
      if (schema.length == 1) return {required: schema};
      var schemas = schema.map(function (prop) {
        return {required: [prop]};
      });
      return {anyOf: schemas};
    },
    metaSchema: {
      type: 'array',
      items: {
        type: 'string'
      }
    }
  };

  ajv.addKeyword('anyRequired', defFunc.definition);
  return ajv;
};
'use strict';

var util = require('./_util');

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    macro: function (schema) {
      var schemas = [];
      for (var pointer in schema)
        schemas.push(getSchema(pointer, schema[pointer]));
      return {'allOf': schemas};
    },
    metaSchema: {
      type: 'object',
      propertyNames: {
        type: 'string',
        format: 'json-pointer'
      },
      additionalProperties: util.metaSchemaRef(ajv)
    }
  };

  ajv.addKeyword('deepProperties', defFunc.definition);
  return ajv;
};


function getSchema(jsonPointer, schema) {
  var segments = jsonPointer.split('/');
  var rootSchema = {};
  var pointerSchema = rootSchema;
  for (var i=1; i<segments.length; i++) {
    var segment = segments[i];
    var isLast = i == segments.length - 1;
    segment = unescapeJsonPointer(segment);
    var properties = pointerSchema.properties = {};
    var items = undefined;
    if (/[0-9]+/.test(segment)) {
      var count = +segment;
      items = pointerSchema.items = [];
      while (count--) items.push({});
    }
    pointerSchema = isLast ? schema : {};
    properties[segment] = pointerSchema;
    if (items) items.push(pointerSchema);
  }
  return rootSchema;
}


function unescapeJsonPointer(str) {
  return str.replace(/~1/g, '/').replace(/~0/g, '~');
}
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    inline: function (it, keyword, schema) {
      var expr = '';
      for (var i=0; i<schema.length; i++) {
        if (i) expr += ' && ';
        expr += '(' + getData(schema[i], it.dataLevel) + ' !== undefined)';
      }
      return expr;
    },
    metaSchema: {
      type: 'array',
      items: {
        type: 'string',
        format: 'json-pointer'
      }
    }
  };

  ajv.addKeyword('deepRequired', defFunc.definition);
  return ajv;
};


function getData(jsonPointer, lvl) {
  var data = 'data' + (lvl || '');
  if (!jsonPointer) return data;

  var expr = data;
  var segments = jsonPointer.split('/');
  for (var i=1; i<segments.length; i++) {
    var segment = segments[i];
    data += getProperty(unescapeJsonPointer(segment));
    expr += ' && ' + data;
  }
  return expr;
}


var IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i;
var INTEGER = /^[0-9]+$/;
var SINGLE_QUOTE = /'|\\/g;
function getProperty(key) {
  return INTEGER.test(key)
          ? '[' + key + ']'
          : IDENTIFIER.test(key)
            ? '.' + key
            : "['" + key.replace(SINGLE_QUOTE, '\\$&') + "']";
}


function unescapeJsonPointer(str) {
  return str.replace(/~1/g, '/').replace(/~0/g, '~');
}
'use strict';

var sequences = {};

var DEFAULTS = {
  timestamp: function() { return Date.now(); },
  datetime: function() { return (new Date).toISOString(); },
  date: function() { return (new Date).toISOString().slice(0, 10); },
  time: function() { return (new Date).toISOString().slice(11); },
  random: function() { return Math.random(); },
  randomint: function (args) {
    var limit = args && args.max || 2;
    return function() { return Math.floor(Math.random() * limit); };
  },
  seq: function (args) {
    var name = args && args.name || '';
    sequences[name] = sequences[name] || 0;
    return function() { return sequences[name]++; };
  }
};

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    compile: function (schema, parentSchema, it) {
      var funcs = {};

      for (var key in schema) {
        var d = schema[key];
        var func = getDefault(typeof d == 'string' ? d : d.func);
        funcs[key] = func.length ? func(d.args) : func;
      }

      return it.opts.useDefaults && !it.compositeRule
              ? assignDefaults
              : noop;

      function assignDefaults(data) {
        for (var prop in schema){
          if (data[prop] === undefined
            || (it.opts.useDefaults == 'empty'
            && (data[prop] === null || data[prop] === '')))
            data[prop] = funcs[prop]();
        }
        return true;
      }

      function noop() { return true; }
    },
    DEFAULTS: DEFAULTS,
    metaSchema: {
      type: 'object',
      additionalProperties: {
        type: ['string', 'object'],
        additionalProperties: false,
        required: ['func', 'args'],
        properties: {
          func: { type: 'string' },
          args: { type: 'object' }
        }
      }
    }
  };

  ajv.addKeyword('dynamicDefaults', defFunc.definition);
  return ajv;

  function getDefault(d) {
    var def = DEFAULTS[d];
    if (def) return def;
    throw new Error('invalid "dynamicDefaults" keyword property value: ' + d);
  }
};
'use strict';

module.exports = require('./_formatLimit')('Maximum');
'use strict';

module.exports = require('./_formatLimit')('Minimum');
'use strict';

module.exports = {
  'instanceof': require('./instanceof'),
  range: require('./range'),
  regexp: require('./regexp'),
  'typeof': require('./typeof'),
  dynamicDefaults: require('./dynamicDefaults'),
  allRequired: require('./allRequired'),
  anyRequired: require('./anyRequired'),
  oneRequired: require('./oneRequired'),
  prohibited: require('./prohibited'),
  uniqueItemProperties: require('./uniqueItemProperties'),
  deepProperties: require('./deepProperties'),
  deepRequired: require('./deepRequired'),
  formatMinimum: require('./formatMinimum'),
  formatMaximum: require('./formatMaximum'),
  patternRequired: require('./patternRequired'),
  'switch': require('./switch'),
  select: require('./select'),
  transform: require('./transform')
};
'use strict';

var CONSTRUCTORS = {
  Object: Object,
  Array: Array,
  Function: Function,
  Number: Number,
  String: String,
  Date: Date,
  RegExp: RegExp
};

module.exports = function defFunc(ajv) {
  /* istanbul ignore else */
  if (typeof Buffer != 'undefined')
    CONSTRUCTORS.Buffer = Buffer;

  /* istanbul ignore else */
  if (typeof Promise != 'undefined')
    CONSTRUCTORS.Promise = Promise;

  defFunc.definition = {
    compile: function (schema) {
      if (typeof schema == 'string') {
        var Constructor = getConstructor(schema);
        return function (data) {
          return data instanceof Constructor;
        };
      }

      var constructors = schema.map(getConstructor);
      return function (data) {
        for (var i=0; i<constructors.length; i++)
          if (data instanceof constructors[i]) return true;
        return false;
      };
    },
    CONSTRUCTORS: CONSTRUCTORS,
    metaSchema: {
      anyOf: [
        { type: 'string' },
        {
          type: 'array',
          items: { type: 'string' }
        }
      ]
    }
  };

  ajv.addKeyword('instanceof', defFunc.definition);
  return ajv;

  function getConstructor(c) {
    var Constructor = CONSTRUCTORS[c];
    if (Constructor) return Constructor;
    throw new Error('invalid "instanceof" keyword value ' + c);
  }
};
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    macro: function (schema) {
      if (schema.length == 0) return true;
      if (schema.length == 1) return {required: schema};
      var schemas = schema.map(function (prop) {
        return {required: [prop]};
      });
      return {oneOf: schemas};
    },
    metaSchema: {
      type: 'array',
      items: {
        type: 'string'
      }
    }
  };

  ajv.addKeyword('oneRequired', defFunc.definition);
  return ajv;
};
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    inline: require('./dotjs/patternRequired'),
    statements: true,
    errors: 'full',
    metaSchema: {
      type: 'array',
      items: {
        type: 'string',
        format: 'regex'
      },
      uniqueItems: true
    }
  };

  ajv.addKeyword('patternRequired', defFunc.definition);
  return ajv;
};
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    macro: function (schema) {
      if (schema.length == 0) return true;
      if (schema.length == 1) return {not: {required: schema}};
      var schemas = schema.map(function (prop) {
        return {required: [prop]};
      });
      return {not: {anyOf: schemas}};
    },
    metaSchema: {
      type: 'array',
      items: {
        type: 'string'
      }
    }
  };

  ajv.addKeyword('prohibited', defFunc.definition);
  return ajv;
};
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'number',
    macro: function (schema, parentSchema) {
      var min = schema[0]
        , max = schema[1]
        , exclusive = parentSchema.exclusiveRange;

      validateRangeSchema(min, max, exclusive);

      return exclusive === true
              ? {exclusiveMinimum: min, exclusiveMaximum: max}
              : {minimum: min, maximum: max};
    },
    metaSchema: {
      type: 'array',
      minItems: 2,
      maxItems: 2,
      items: { type: 'number' }
    }
  };

  ajv.addKeyword('range', defFunc.definition);
  ajv.addKeyword('exclusiveRange');
  return ajv;

  function validateRangeSchema(min, max, exclusive) {
    if (exclusive !== undefined && typeof exclusive != 'boolean')
      throw new Error('Invalid schema for exclusiveRange keyword, should be boolean');

    if (min > max || (exclusive && min == max))
      throw new Error('There are no numbers in range');
  }
};
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'string',
    inline: function (it, keyword, schema) {
      return getRegExp() + '.test(data' + (it.dataLevel || '') + ')';

      function getRegExp() {
        try {
          if (typeof schema == 'object')
            return new RegExp(schema.pattern, schema.flags);

          var rx = schema.match(/^\/(.*)\/([gimuy]*)$/);
          if (rx) return new RegExp(rx[1], rx[2]);
          throw new Error('cannot parse string into RegExp');
        } catch(e) {
          console.error('regular expression', schema, 'is invalid');
          throw e;
        }
      }
    },
    metaSchema: {
      type: ['string', 'object'],
      properties: {
        pattern: { type: 'string' },
        flags: { type: 'string' }
      },
      required: ['pattern'],
      additionalProperties: false
    }
  };

  ajv.addKeyword('regexp', defFunc.definition);
  return ajv;
};
'use strict';

var util = require('./_util');

module.exports = function defFunc(ajv) {
  if (!ajv._opts.$data) {
    console.warn('keyword select requires $data option');
    return ajv;
  }
  var metaSchemaRef = util.metaSchemaRef(ajv);
  var compiledCaseSchemas = [];

  defFunc.definition = {
    validate: function v(schema, data, parentSchema) {
      if (parentSchema.selectCases === undefined)
        throw new Error('keyword "selectCases" is absent');
      var compiled = getCompiledSchemas(parentSchema, false);
      var validate = compiled.cases[schema];
      if (validate === undefined) validate = compiled.default;
      if (typeof validate == 'boolean') return validate;
      var valid = validate(data);
      if (!valid) v.errors = validate.errors;
      return valid;
    },
    $data: true,
    metaSchema: { type: ['string', 'number', 'boolean', 'null'] }
  };

  ajv.addKeyword('select', defFunc.definition);
  ajv.addKeyword('selectCases', {
    compile: function (schemas, parentSchema) {
      var compiled = getCompiledSchemas(parentSchema);
      for (var value in schemas)
        compiled.cases[value] = compileOrBoolean(schemas[value]);
      return function() { return true; };
    },
    valid: true,
    metaSchema: {
      type: 'object',
      additionalProperties: metaSchemaRef
    }
  });
  ajv.addKeyword('selectDefault', {
    compile: function (schema, parentSchema) {
      var compiled = getCompiledSchemas(parentSchema);
      compiled.default = compileOrBoolean(schema);
      return function() { return true; };
    },
    valid: true,
    metaSchema: metaSchemaRef
  });
  return ajv;


  function getCompiledSchemas(parentSchema, create) {
    var compiled;
    compiledCaseSchemas.some(function (c) {
      if (c.parentSchema === parentSchema) {
        compiled = c;
        return true;
      }
    });
    if (!compiled && create !== false) {
      compiled = {
        parentSchema: parentSchema,
        cases: {},
        default: true
      };
      compiledCaseSchemas.push(compiled);
    }
    return compiled;
  }

  function compileOrBoolean(schema) {
    return typeof schema == 'boolean'
            ? schema
            : ajv.compile(schema);
  }
};
'use strict';

var util = require('./_util');

module.exports = function defFunc(ajv) {
  if (ajv.RULES.keywords.switch && ajv.RULES.keywords.if) return;

  var metaSchemaRef = util.metaSchemaRef(ajv);

  defFunc.definition = {
    inline: require('./dotjs/switch'),
    statements: true,
    errors: 'full',
    metaSchema: {
      type: 'array',
      items: {
        required: [ 'then' ],
        properties: {
          'if': metaSchemaRef,
          'then': {
            anyOf: [
              { type: 'boolean' },
              metaSchemaRef
            ]
          },
          'continue': { type: 'boolean' }
        },
        additionalProperties: false,
        dependencies: {
          'continue': [ 'if' ]
        }
      }
    }
  };

  ajv.addKeyword('switch', defFunc.definition);
  return ajv;
};
'use strict';

module.exports = function defFunc (ajv) {
  var transform = {
    trimLeft: function (value) {
      return value.replace(/^[\s]+/, '');
    },
    trimRight: function (value) {
      return value.replace(/[\s]+$/, '');
    },
    trim: function (value) {
      return value.trim();
    },
    toLowerCase: function (value) {
      return value.toLowerCase();
    },
    toUpperCase: function (value) {
      return value.toUpperCase();
    },
    toEnumCase: function (value, cfg) {
      return cfg.hash[makeHashTableKey(value)] || value;
    }
  };

  defFunc.definition = {
    type: 'string',
    errors: false,
    modifying: true,
    valid: true,
    compile: function (schema, parentSchema) {
      var cfg;

      if (schema.indexOf('toEnumCase') !== -1) {
        // build hash table to enum values
        cfg = {hash: {}};

        // requires `enum` in schema
        if (!parentSchema.enum)
          throw new Error('Missing enum. To use `transform:["toEnumCase"]`, `enum:[...]` is required.');
        for (var i = parentSchema.enum.length; i--; i) {
          var v = parentSchema.enum[i];
          if (typeof v !== 'string') continue;
          var k = makeHashTableKey(v);
          // requires all `enum` values have unique keys
          if (cfg.hash[k])
            throw new Error('Invalid enum uniqueness. To use `transform:["toEnumCase"]`, all values must be unique when case insensitive.');
          cfg.hash[k] = v;
        }
      }

      return function (data, dataPath, object, key) {
        // skip if value only
        if (!object) return;

        // apply transform in order provided
        for (var j = 0, l = schema.length; j < l; j++)
          data = transform[schema[j]](data, cfg);

        object[key] = data;
      };
    },
    metaSchema: {
      type: 'array',
      items: {
        type: 'string',
        enum: [
          'trimLeft', 'trimRight', 'trim',
          'toLowerCase', 'toUpperCase', 'toEnumCase'
        ]
      }
    }
  };

  ajv.addKeyword('transform', defFunc.definition);
  return ajv;

  function makeHashTableKey (value) {
    return value.toLowerCase();
  }
};
'use strict';

var KNOWN_TYPES = ['undefined', 'string', 'number', 'object', 'function', 'boolean', 'symbol'];

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    inline: function (it, keyword, schema) {
      var data = 'data' + (it.dataLevel || '');
      if (typeof schema == 'string') return 'typeof ' + data + ' == "' + schema + '"';
      schema = 'validate.schema' + it.schemaPath + '.' + keyword;
      return schema + '.indexOf(typeof ' + data + ') >= 0';
    },
    metaSchema: {
      anyOf: [
        {
          type: 'string',
          enum: KNOWN_TYPES
        },
        {
          type: 'array',
          items: {
            type: 'string',
            enum: KNOWN_TYPES
          }
        }
      ]
    }
  };

  ajv.addKeyword('typeof', defFunc.definition);
  return ajv;
};
'use strict';

var SCALAR_TYPES = ['number', 'integer', 'string', 'boolean', 'null'];

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'array',
    compile: function(keys, parentSchema, it) {
      var equal = it.util.equal;
      var scalar = getScalarKeys(keys, parentSchema);

      return function(data) {
        if (data.length > 1) {
          for (var k=0; k < keys.length; k++) {
            var i, key = keys[k];
            if (scalar[k]) {
              var hash = {};
              for (i = data.length; i--;) {
                if (!data[i] || typeof data[i] != 'object') continue;
                var prop = data[i][key];
                if (prop && typeof prop == 'object') continue;
                if (typeof prop == 'string') prop = '"' + prop;
                if (hash[prop]) return false;
                hash[prop] = true;
              }
            } else {
              for (i = data.length; i--;) {
                if (!data[i] || typeof data[i] != 'object') continue;
                for (var j = i; j--;) {
                  if (data[j] && typeof data[j] == 'object' && equal(data[i][key], data[j][key]))
                    return false;
                }
              }
            }
          }
        }
        return true;
      };
    },
    metaSchema: {
      type: 'array',
      items: {type: 'string'}
    }
  };

  ajv.addKeyword('uniqueItemProperties', defFunc.definition);
  return ajv;
};


function getScalarKeys(keys, schema) {
  return keys.map(function(key) {
    var properties = schema.items && schema.items.properties;
    var propType = properties && properties[key] && properties[key].type;
    return Array.isArray(propType)
            ? propType.indexOf('object') < 0 && propType.indexOf('array') < 0
            : SCALAR_TYPES.indexOf(propType) >= 0;
  });
}
These files are compiled dot templates from dot folder.

Do NOT edit them directly, edit the templates and run `npm run build` from main ajv-keywords folder.
'use strict';
module.exports = function generate__formatLimit(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  out += 'var ' + ($valid) + ' = undefined;';
  if (it.opts.format === false) {
    out += ' ' + ($valid) + ' = true; ';
    return out;
  }
  var $schemaFormat = it.schema.format,
    $isDataFormat = it.opts.$data && $schemaFormat.$data,
    $closingBraces = '';
  if ($isDataFormat) {
    var $schemaValueFormat = it.util.getData($schemaFormat.$data, $dataLvl, it.dataPathArr),
      $format = 'format' + $lvl,
      $compare = 'compare' + $lvl;
    out += ' var ' + ($format) + ' = formats[' + ($schemaValueFormat) + '] , ' + ($compare) + ' = ' + ($format) + ' && ' + ($format) + '.compare;';
  } else {
    var $format = it.formats[$schemaFormat];
    if (!($format && $format.compare)) {
      out += '  ' + ($valid) + ' = true; ';
      return out;
    }
    var $compare = 'formats' + it.util.getProperty($schemaFormat) + '.compare';
  }
  var $isMax = $keyword == 'formatMaximum',
    $exclusiveKeyword = 'formatExclusive' + ($isMax ? 'Maximum' : 'Minimum'),
    $schemaExcl = it.schema[$exclusiveKeyword],
    $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data,
    $op = $isMax ? '<' : '>',
    $result = 'result' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if ($isDataExcl) {
    var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),
      $exclusive = 'exclusive' + $lvl,
      $opExpr = 'op' + $lvl,
      $opStr = '\' + ' + $opExpr + ' + \'';
    out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';
    $schemaValueExcl = 'schemaExcl' + $lvl;
    out += ' if (typeof ' + ($schemaValueExcl) + ' != \'boolean\' && ' + ($schemaValueExcl) + ' !== undefined) { ' + ($valid) + ' = false; ';
    var $errorKeyword = $exclusiveKeyword;
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ($errorKeyword || '_formatExclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' }  ';
    if ($breakOnError) {
      $closingBraces += '}';
      out += ' else { ';
    }
    if ($isData) {
      out += ' if (' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'string\') ' + ($valid) + ' = false; else { ';
      $closingBraces += '}';
    }
    if ($isDataFormat) {
      out += ' if (!' + ($compare) + ') ' + ($valid) + ' = true; else { ';
      $closingBraces += '}';
    }
    out += ' var ' + ($result) + ' = ' + ($compare) + '(' + ($data) + ',  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += ' ); if (' + ($result) + ' === undefined) ' + ($valid) + ' = false; var ' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true; if (' + ($valid) + ' === undefined) { ' + ($valid) + ' = ' + ($exclusive) + ' ? ' + ($result) + ' ' + ($op) + ' 0 : ' + ($result) + ' ' + ($op) + '= 0; } if (!' + ($valid) + ') var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\';';
  } else {
    var $exclusive = $schemaExcl === true,
      $opStr = $op;
    if (!$exclusive) $opStr += '=';
    var $opExpr = '\'' + $opStr + '\'';
    if ($isData) {
      out += ' if (' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'string\') ' + ($valid) + ' = false; else { ';
      $closingBraces += '}';
    }
    if ($isDataFormat) {
      out += ' if (!' + ($compare) + ') ' + ($valid) + ' = true; else { ';
      $closingBraces += '}';
    }
    out += ' var ' + ($result) + ' = ' + ($compare) + '(' + ($data) + ',  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += ' ); if (' + ($result) + ' === undefined) ' + ($valid) + ' = false; if (' + ($valid) + ' === undefined) ' + ($valid) + ' = ' + ($result) + ' ' + ($op);
    if (!$exclusive) {
      out += '=';
    }
    out += ' 0;';
  }
  out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_formatLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit:  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += ' , exclusive: ' + ($exclusive) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be ' + ($opStr) + ' "';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + (it.util.escapeQuotes($schema));
      }
      out += '"\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + (it.util.toQuotedString($schema));
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '}';
  return out;
}
'use strict';
module.exports = function generate_patternRequired(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $key = 'key' + $lvl,
    $idx = 'idx' + $lvl,
    $matched = 'patternMatched' + $lvl,
    $dataProperties = 'dataProperties' + $lvl,
    $closingBraces = '',
    $ownProperties = it.opts.ownProperties;
  out += 'var ' + ($valid) + ' = true;';
  if ($ownProperties) {
    out += ' var ' + ($dataProperties) + ' = undefined;';
  }
  var arr1 = $schema;
  if (arr1) {
    var $pProperty, i1 = -1,
      l1 = arr1.length - 1;
    while (i1 < l1) {
      $pProperty = arr1[i1 += 1];
      out += ' var ' + ($matched) + ' = false;  ';
      if ($ownProperties) {
        out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
      } else {
        out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
      }
      out += ' ' + ($matched) + ' = ' + (it.usePattern($pProperty)) + '.test(' + ($key) + '); if (' + ($matched) + ') break; } ';
      var $missingPattern = it.util.escapeQuotes($pProperty);
      out += ' if (!' + ($matched) + ') { ' + ($valid) + ' = false;  var err =   '; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ('patternRequired') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingPattern: \'' + ($missingPattern) + '\' } ';
        if (it.opts.messages !== false) {
          out += ' , message: \'should have property matching pattern \\\'' + ($missingPattern) + '\\\'\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; }   ';
      if ($breakOnError) {
        $closingBraces += '}';
        out += ' else { ';
      }
    }
  }
  out += '' + ($closingBraces);
  return out;
}
'use strict';
module.exports = function generate_switch(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $ifPassed = 'ifPassed' + it.level,
    $currentBaseId = $it.baseId,
    $shouldContinue;
  out += 'var ' + ($ifPassed) + ';';
  var arr1 = $schema;
  if (arr1) {
    var $sch, $caseIndex = -1,
      l1 = arr1.length - 1;
    while ($caseIndex < l1) {
      $sch = arr1[$caseIndex += 1];
      if ($caseIndex && !$shouldContinue) {
        out += ' if (!' + ($ifPassed) + ') { ';
        $closingBraces += '}';
      }
      if ($sch.if && (it.opts.strictKeywords ? typeof $sch.if == 'object' && Object.keys($sch.if).length > 0 : it.util.schemaHasRules($sch.if, it.RULES.all))) {
        out += ' var ' + ($errs) + ' = errors;   ';
        var $wasComposite = it.compositeRule;
        it.compositeRule = $it.compositeRule = true;
        $it.createErrors = false;
        $it.schema = $sch.if;
        $it.schemaPath = $schemaPath + '[' + $caseIndex + '].if';
        $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/if';
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
        $it.createErrors = true;
        it.compositeRule = $it.compositeRule = $wasComposite;
        out += ' ' + ($ifPassed) + ' = ' + ($nextValid) + '; if (' + ($ifPassed) + ') {  ';
        if (typeof $sch.then == 'boolean') {
          if ($sch.then === false) {
            var $$outStack = $$outStack || [];
            $$outStack.push(out);
            out = ''; /* istanbul ignore else */
            if (it.createErrors !== false) {
              out += ' { keyword: \'' + ('switch') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { caseIndex: ' + ($caseIndex) + ' } ';
              if (it.opts.messages !== false) {
                out += ' , message: \'should pass "switch" keyword validation\' ';
              }
              if (it.opts.verbose) {
                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
              }
              out += ' } ';
            } else {
              out += ' {} ';
            }
            var __err = out;
            out = $$outStack.pop();
            if (!it.compositeRule && $breakOnError) {
              /* istanbul ignore if */
              if (it.async) {
                out += ' throw new ValidationError([' + (__err) + ']); ';
              } else {
                out += ' validate.errors = [' + (__err) + ']; return false; ';
              }
            } else {
              out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
            }
          }
          out += ' var ' + ($nextValid) + ' = ' + ($sch.then) + '; ';
        } else {
          $it.schema = $sch.then;
          $it.schemaPath = $schemaPath + '[' + $caseIndex + '].then';
          $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/then';
          out += '  ' + (it.validate($it)) + ' ';
          $it.baseId = $currentBaseId;
        }
        out += '  } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } } ';
      } else {
        out += ' ' + ($ifPassed) + ' = true;  ';
        if (typeof $sch.then == 'boolean') {
          if ($sch.then === false) {
            var $$outStack = $$outStack || [];
            $$outStack.push(out);
            out = ''; /* istanbul ignore else */
            if (it.createErrors !== false) {
              out += ' { keyword: \'' + ('switch') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { caseIndex: ' + ($caseIndex) + ' } ';
              if (it.opts.messages !== false) {
                out += ' , message: \'should pass "switch" keyword validation\' ';
              }
              if (it.opts.verbose) {
                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
              }
              out += ' } ';
            } else {
              out += ' {} ';
            }
            var __err = out;
            out = $$outStack.pop();
            if (!it.compositeRule && $breakOnError) {
              /* istanbul ignore if */
              if (it.async) {
                out += ' throw new ValidationError([' + (__err) + ']); ';
              } else {
                out += ' validate.errors = [' + (__err) + ']; return false; ';
              }
            } else {
              out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
            }
          }
          out += ' var ' + ($nextValid) + ' = ' + ($sch.then) + '; ';
        } else {
          $it.schema = $sch.then;
          $it.schemaPath = $schemaPath + '[' + $caseIndex + '].then';
          $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/then';
          out += '  ' + (it.validate($it)) + ' ';
          $it.baseId = $currentBaseId;
        }
      }
      $shouldContinue = $sch.continue
    }
  }
  out += '' + ($closingBraces) + 'var ' + ($valid) + ' = ' + ($nextValid) + ';';
  return out;
}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}

var {{=$valid}} = undefined;

{{## def.skipFormatLimit:
  {{=$valid}} = true;
  {{ return out; }}
#}}

{{## def.compareFormat:
  {{? $isData }}
    if ({{=$schemaValue}} === undefined) {{=$valid}} = true;
    else if (typeof {{=$schemaValue}} != 'string') {{=$valid}} = false;
    else {
    {{ $closingBraces += '}'; }}
  {{?}}

  {{? $isDataFormat }}
    if (!{{=$compare}}) {{=$valid}} = true;
    else {
    {{ $closingBraces += '}'; }}
  {{?}}

  var {{=$result}} = {{=$compare}}({{=$data}}, {{# def.schemaValueQS }});

  if ({{=$result}} === undefined) {{=$valid}} = false;
#}}


{{? it.opts.format === false }}{{# def.skipFormatLimit }}{{?}}

{{
  var $schemaFormat = it.schema.format
    , $isDataFormat = it.opts.$data && $schemaFormat.$data
    , $closingBraces = '';
}}

{{? $isDataFormat }}
  {{
    var $schemaValueFormat = it.util.getData($schemaFormat.$data, $dataLvl, it.dataPathArr)
      , $format = 'format' + $lvl
      , $compare = 'compare' + $lvl;
  }}

  var {{=$format}} = formats[{{=$schemaValueFormat}}]
    , {{=$compare}} = {{=$format}} && {{=$format}}.compare;
{{??}}
  {{ var $format = it.formats[$schemaFormat]; }}
  {{? !($format && $format.compare) }}
    {{# def.skipFormatLimit }}
  {{?}}
  {{ var $compare = 'formats' + it.util.getProperty($schemaFormat) + '.compare'; }}
{{?}}

{{
  var $isMax = $keyword == 'formatMaximum'
    , $exclusiveKeyword = 'formatExclusive' + ($isMax ? 'Maximum' : 'Minimum')
    , $schemaExcl = it.schema[$exclusiveKeyword]
    , $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data
    , $op = $isMax ? '<' : '>'
    , $result = 'result' + $lvl;
}}

{{# def.$data }}


{{? $isDataExcl }}
  {{
    var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr)
      , $exclusive = 'exclusive' + $lvl
      , $opExpr = 'op' + $lvl
      , $opStr = '\' + ' + $opExpr + ' + \'';
  }}
  var schemaExcl{{=$lvl}} = {{=$schemaValueExcl}};
  {{ $schemaValueExcl = 'schemaExcl' + $lvl; }}

  if (typeof {{=$schemaValueExcl}} != 'boolean' && {{=$schemaValueExcl}} !== undefined) {
    {{=$valid}} = false;
    {{ var $errorKeyword = $exclusiveKeyword; }}
    {{# def.error:'_formatExclusiveLimit' }}
  }

  {{# def.elseIfValid }}

  {{# def.compareFormat }}
  var {{=$exclusive}} = {{=$schemaValueExcl}} === true;

  if ({{=$valid}} === undefined) {
    {{=$valid}} = {{=$exclusive}}
                  ? {{=$result}} {{=$op}} 0
                  : {{=$result}} {{=$op}}= 0;
  }

  if (!{{=$valid}}) var op{{=$lvl}} = {{=$exclusive}} ? '{{=$op}}' : '{{=$op}}=';
{{??}}
  {{
    var $exclusive = $schemaExcl === true
      , $opStr = $op;  /*used in error*/
    if (!$exclusive) $opStr += '=';
    var $opExpr = '\'' + $opStr + '\''; /*used in error*/
  }}

  {{# def.compareFormat }}

  if ({{=$valid}} === undefined)
    {{=$valid}} = {{=$result}} {{=$op}}{{?!$exclusive}}={{?}} 0;
{{?}}

{{= $closingBraces }}

if (!{{=$valid}}) {
  {{ var $errorKeyword = $keyword; }}
  {{# def.error:'_formatLimit' }}
}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}

{{
  var $key = 'key' + $lvl
    , $idx = 'idx' + $lvl
    , $matched = 'patternMatched' + $lvl
    , $dataProperties = 'dataProperties' + $lvl
    , $closingBraces = ''
    , $ownProperties = it.opts.ownProperties;
}}

var {{=$valid}} = true;
{{? $ownProperties }}
  var {{=$dataProperties}} = undefined;
{{?}}

{{~ $schema:$pProperty }}
  var {{=$matched}} = false;
  {{# def.iterateProperties }}
    {{=$matched}} = {{= it.usePattern($pProperty) }}.test({{=$key}});
    if ({{=$matched}}) break;
  }

  {{ var $missingPattern = it.util.escapeQuotes($pProperty); }}
  if (!{{=$matched}}) {
    {{=$valid}} = false;
    {{# def.addError:'patternRequired' }}
  } {{# def.elseIfValid }}
{{~}}

{{= $closingBraces }}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}


{{## def.validateIf:
  {{# def.setCompositeRule }}
  {{ $it.createErrors = false; }}
  {{# def._validateSwitchRule:if }}
  {{ $it.createErrors = true; }}
  {{# def.resetCompositeRule }}
  {{=$ifPassed}} = {{=$nextValid}};
#}}

{{## def.validateThen:
  {{? typeof $sch.then == 'boolean' }}
    {{? $sch.then === false }}
      {{# def.error:'switch' }}
    {{?}}
    var {{=$nextValid}} = {{= $sch.then }};
  {{??}}
    {{# def._validateSwitchRule:then }}
  {{?}}
#}}

{{## def._validateSwitchRule:_clause:
  {{
    $it.schema = $sch._clause;
    $it.schemaPath = $schemaPath + '[' + $caseIndex + ']._clause';
    $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/_clause';
  }}
  {{# def.insertSubschemaCode }}
#}}

{{## def.switchCase:
  {{? $sch.if && {{# def.nonEmptySchema:$sch.if }} }}
    var {{=$errs}} = errors;
    {{# def.validateIf }}
    if ({{=$ifPassed}}) {
      {{# def.validateThen }}  
    } else {
      {{# def.resetErrors }}
    }
  {{??}}
    {{=$ifPassed}} = true;
    {{# def.validateThen }}
  {{?}}
#}}


{{
  var $ifPassed = 'ifPassed' + it.level
    , $currentBaseId = $it.baseId
    , $shouldContinue;
}}
var {{=$ifPassed}};

{{~ $schema:$sch:$caseIndex }}
  {{? $caseIndex && !$shouldContinue }}
    if (!{{=$ifPassed}}) {
    {{ $closingBraces+= '}'; }}
  {{?}}

  {{# def.switchCase }}
  {{ $shouldContinue = $sch.continue }}
{{~}}

{{= $closingBraces }}

var {{=$valid}} = {{=$nextValid}};

0.3.1 / 2016-01-14
==================

  * add MIT LICENSE file (#23, @kasicka)
  * preserve chaining after redundant style-method calls (#19, @drewblaisdell)
  * package: add "license" field (#16, @BenjaminTsai)

0.3.0 / 2014-05-09
==================

  * package: remove "test" script and "devDependencies"
  * package: remove "engines" section
  * pacakge: remove "bin" section
  * package: beautify
  * examples: remove `starwars` example (#15)
  * Documented goto, horizontalAbsolute, and eraseLine methods in README.md (#12, @Jammerwoch)
  * add `.jshintrc` file

< 0.3.0
=======

  * Prehistoric
(The MIT License)

Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Nathan Rajlich",
    "email": "nathan@tootallnate.net",
    "url": "http://tootallnate.net"
  },
  "deprecated": false,
  "description": "Advanced ANSI formatting tool for Node.js",
  "homepage": "https://github.com/TooTallNate/ansi.js#readme",
  "license": "MIT",
  "main": "./lib/ansi.js",
  "name": "ansi",
  "repository": {
    "type": "git",
    "url": "git://github.com/TooTallNate/ansi.js.git"
  },
  "version": "0.3.1"
}
/**
 * References:
 *
 *   - http://en.wikipedia.org/wiki/ANSI_escape_code
 *   - http://www.termsys.demon.co.uk/vtansi.htm
 *
 */

/**
 * Module dependencies.
 */

var emitNewlineEvents = require('./newlines')
  , prefix = '\x1b[' // For all escape codes
  , suffix = 'm'     // Only for color codes

/**
 * The ANSI escape sequences.
 */

var codes = {
    up: 'A'
  , down: 'B'
  , forward: 'C'
  , back: 'D'
  , nextLine: 'E'
  , previousLine: 'F'
  , horizontalAbsolute: 'G'
  , eraseData: 'J'
  , eraseLine: 'K'
  , scrollUp: 'S'
  , scrollDown: 'T'
  , savePosition: 's'
  , restorePosition: 'u'
  , queryPosition: '6n'
  , hide: '?25l'
  , show: '?25h'
}

/**
 * Rendering ANSI codes.
 */

var styles = {
    bold: 1
  , italic: 3
  , underline: 4
  , inverse: 7
}

/**
 * The negating ANSI code for the rendering modes.
 */

var reset = {
    bold: 22
  , italic: 23
  , underline: 24
  , inverse: 27
}

/**
 * The standard, styleable ANSI colors.
 */

var colors = {
    white: 37
  , black: 30
  , blue: 34
  , cyan: 36
  , green: 32
  , magenta: 35
  , red: 31
  , yellow: 33
  , grey: 90
  , brightBlack: 90
  , brightRed: 91
  , brightGreen: 92
  , brightYellow: 93
  , brightBlue: 94
  , brightMagenta: 95
  , brightCyan: 96
  , brightWhite: 97
}


/**
 * Creates a Cursor instance based off the given `writable stream` instance.
 */

function ansi (stream, options) {
  if (stream._ansicursor) {
    return stream._ansicursor
  } else {
    return stream._ansicursor = new Cursor(stream, options)
  }
}
module.exports = exports = ansi

/**
 * The `Cursor` class.
 */

function Cursor (stream, options) {
  if (!(this instanceof Cursor)) {
    return new Cursor(stream, options)
  }
  if (typeof stream != 'object' || typeof stream.write != 'function') {
    throw new Error('a valid Stream instance must be passed in')
  }

  // the stream to use
  this.stream = stream

  // when 'enabled' is false then all the functions are no-ops except for write()
  this.enabled = options && options.enabled
  if (typeof this.enabled === 'undefined') {
    this.enabled = stream.isTTY
  }
  this.enabled = !!this.enabled

  // then `buffering` is true, then `write()` calls are buffered in
  // memory until `flush()` is invoked
  this.buffering = !!(options && options.buffering)
  this._buffer = []

  // controls the foreground and background colors
  this.fg = this.foreground = new Colorer(this, 0)
  this.bg = this.background = new Colorer(this, 10)

  // defaults
  this.Bold = false
  this.Italic = false
  this.Underline = false
  this.Inverse = false

  // keep track of the number of "newlines" that get encountered
  this.newlines = 0
  emitNewlineEvents(stream)
  stream.on('newline', function () {
    this.newlines++
  }.bind(this))
}
exports.Cursor = Cursor

/**
 * Helper function that calls `write()` on the underlying Stream.
 * Returns `this` instead of the write() return value to keep
 * the chaining going.
 */

Cursor.prototype.write = function (data) {
  if (this.buffering) {
    this._buffer.push(arguments)
  } else {
    this.stream.write.apply(this.stream, arguments)
  }
  return this
}

/**
 * Buffer `write()` calls into memory.
 *
 * @api public
 */

Cursor.prototype.buffer = function () {
  this.buffering = true
  return this
}

/**
 * Write out the in-memory buffer.
 *
 * @api public
 */

Cursor.prototype.flush = function () {
  this.buffering = false
  var str = this._buffer.map(function (args) {
    if (args.length != 1) throw new Error('unexpected args length! ' + args.length);
    return args[0];
  }).join('');
  this._buffer.splice(0); // empty
  this.write(str);
  return this
}


/**
 * The `Colorer` class manages both the background and foreground colors.
 */

function Colorer (cursor, base) {
  this.current = null
  this.cursor = cursor
  this.base = base
}
exports.Colorer = Colorer

/**
 * Write an ANSI color code, ensuring that the same code doesn't get rewritten.
 */

Colorer.prototype._setColorCode = function setColorCode (code) {
  var c = String(code)
  if (this.current === c) return
  this.cursor.enabled && this.cursor.write(prefix + c + suffix)
  this.current = c
  return this
}


/**
 * Set up the positional ANSI codes.
 */

Object.keys(codes).forEach(function (name) {
  var code = String(codes[name])
  Cursor.prototype[name] = function () {
    var c = code
    if (arguments.length > 0) {
      c = toArray(arguments).map(Math.round).join(';') + code
    }
    this.enabled && this.write(prefix + c)
    return this
  }
})

/**
 * Set up the functions for the rendering ANSI codes.
 */

Object.keys(styles).forEach(function (style) {
  var name = style[0].toUpperCase() + style.substring(1)
    , c = styles[style]
    , r = reset[style]

  Cursor.prototype[style] = function () {
    if (this[name]) return this
    this.enabled && this.write(prefix + c + suffix)
    this[name] = true
    return this
  }

  Cursor.prototype['reset' + name] = function () {
    if (!this[name]) return this
    this.enabled && this.write(prefix + r + suffix)
    this[name] = false
    return this
  }
})

/**
 * Setup the functions for the standard colors.
 */

Object.keys(colors).forEach(function (color) {
  var code = colors[color]

  Colorer.prototype[color] = function () {
    this._setColorCode(this.base + code)
    return this.cursor
  }

  Cursor.prototype[color] = function () {
    return this.foreground[color]()
  }
})

/**
 * Makes a beep sound!
 */

Cursor.prototype.beep = function () {
  this.enabled && this.write('\x07')
  return this
}

/**
 * Moves cursor to specific position
 */

Cursor.prototype.goto = function (x, y) {
  x = x | 0
  y = y | 0
  this.enabled && this.write(prefix + y + ';' + x + 'H')
  return this
}

/**
 * Resets the color.
 */

Colorer.prototype.reset = function () {
  this._setColorCode(this.base + 39)
  return this.cursor
}

/**
 * Resets all ANSI formatting on the stream.
 */

Cursor.prototype.reset = function () {
  this.enabled && this.write(prefix + '0' + suffix)
  this.Bold = false
  this.Italic = false
  this.Underline = false
  this.Inverse = false
  this.foreground.current = null
  this.background.current = null
  return this
}

/**
 * Sets the foreground color with the given RGB values.
 * The closest match out of the 216 colors is picked.
 */

Colorer.prototype.rgb = function (r, g, b) {
  var base = this.base + 38
    , code = rgb(r, g, b)
  this._setColorCode(base + ';5;' + code)
  return this.cursor
}

/**
 * Same as `cursor.fg.rgb(r, g, b)`.
 */

Cursor.prototype.rgb = function (r, g, b) {
  return this.foreground.rgb(r, g, b)
}

/**
 * Accepts CSS color codes for use with ANSI escape codes.
 * For example: `#FF000` would be bright red.
 */

Colorer.prototype.hex = function (color) {
  return this.rgb.apply(this, hex(color))
}

/**
 * Same as `cursor.fg.hex(color)`.
 */

Cursor.prototype.hex = function (color) {
  return this.foreground.hex(color)
}


// UTIL FUNCTIONS //

/**
 * Translates a 255 RGB value to a 0-5 ANSI RGV value,
 * then returns the single ANSI color code to use.
 */

function rgb (r, g, b) {
  var red = r / 255 * 5
    , green = g / 255 * 5
    , blue = b / 255 * 5
  return rgb5(red, green, blue)
}

/**
 * Turns rgb 0-5 values into a single ANSI color code to use.
 */

function rgb5 (r, g, b) {
  var red = Math.round(r)
    , green = Math.round(g)
    , blue = Math.round(b)
  return 16 + (red*36) + (green*6) + blue
}

/**
 * Accepts a hex CSS color code string (# is optional) and
 * translates it into an Array of 3 RGB 0-255 values, which
 * can then be used with rgb().
 */

function hex (color) {
  var c = color[0] === '#' ? color.substring(1) : color
    , r = c.substring(0, 2)
    , g = c.substring(2, 4)
    , b = c.substring(4, 6)
  return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16)]
}

/**
 * Turns an array-like object into a real array.
 */

function toArray (a) {
  var i = 0
    , l = a.length
    , rtn = []
  for (; i<l; i++) {
    rtn.push(a[i])
  }
  return rtn
}

/**
 * Accepts any node Stream instance and hijacks its "write()" function,
 * so that it can count any newlines that get written to the output.
 *
 * When a '\n' byte is encountered, then a "newline" event will be emitted
 * on the stream, with no arguments. It is up to the listeners to determine
 * any necessary deltas required for their use-case.
 *
 * Ex:
 *
 *   var cursor = ansi(process.stdout)
 *     , ln = 0
 *   process.stdout.on('newline', function () {
 *    ln++
 *   })
 */

/**
 * Module dependencies.
 */

var assert = require('assert')
var NEWLINE = '\n'.charCodeAt(0)

function emitNewlineEvents (stream) {
  if (stream._emittingNewlines) {
    // already emitting newline events
    return
  }

  var write = stream.write

  stream.write = function (data) {
    // first write the data
    var rtn = write.apply(stream, arguments)

    if (stream.listeners('newline').length > 0) {
      var len = data.length
        , i = 0
      // now try to calculate any deltas
      if (typeof data == 'string') {
        for (; i<len; i++) {
          processByte(stream, data.charCodeAt(i))
        }
      } else {
        // buffer
        for (; i<len; i++) {
          processByte(stream, data[i])
        }
      }
    }

    return rtn
  }

  stream._emittingNewlines = true
}
module.exports = emitNewlineEvents


/**
 * Processes an individual byte being written to a stream
 */

function processByte (stream, b) {
  assert.equal(typeof b, 'number')
  if (b === NEWLINE) {
    stream.emit('newline')
  }
}
'use strict';
module.exports = function () {
	return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Regular expression for matching ANSI escape codes",
  "devDependencies": {
    "ava": "0.17.0",
    "xo": "0.16.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/ansi-regex#readme",
  "license": "MIT",
  "maintainers": [
    {
      "name": "Sindre Sorhus",
      "email": "sindresorhus@gmail.com",
      "url": "sindresorhus.com"
    },
    {
      "name": "Joshua Appelman",
      "email": "jappelman@xebia.com",
      "url": "jbnicolai.com"
    },
    {
      "name": "JD Ballard",
      "email": "i.am.qix@gmail.com",
      "url": "github.com/qix-"
    }
  ],
  "name": "ansi-regex",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/ansi-regex.git"
  },
  "version": "2.1.1"
}'use strict';
const colorConvert = require('color-convert');

const wrapAnsi16 = (fn, offset) => function () {
	const code = fn.apply(colorConvert, arguments);
	return `\u001B[${code + offset}m`;
};

const wrapAnsi256 = (fn, offset) => function () {
	const code = fn.apply(colorConvert, arguments);
	return `\u001B[${38 + offset};5;${code}m`;
};

const wrapAnsi16m = (fn, offset) => function () {
	const rgb = fn.apply(colorConvert, arguments);
	return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
};

function assembleStyles() {
	const codes = new Map();
	const styles = {
		modifier: {
			reset: [0, 0],
			// 21 isn't widely supported and 22 does the same thing
			bold: [1, 22],
			dim: [2, 22],
			italic: [3, 23],
			underline: [4, 24],
			inverse: [7, 27],
			hidden: [8, 28],
			strikethrough: [9, 29]
		},
		color: {
			black: [30, 39],
			red: [31, 39],
			green: [32, 39],
			yellow: [33, 39],
			blue: [34, 39],
			magenta: [35, 39],
			cyan: [36, 39],
			white: [37, 39],
			gray: [90, 39],

			// Bright color
			redBright: [91, 39],
			greenBright: [92, 39],
			yellowBright: [93, 39],
			blueBright: [94, 39],
			magentaBright: [95, 39],
			cyanBright: [96, 39],
			whiteBright: [97, 39]
		},
		bgColor: {
			bgBlack: [40, 49],
			bgRed: [41, 49],
			bgGreen: [42, 49],
			bgYellow: [43, 49],
			bgBlue: [44, 49],
			bgMagenta: [45, 49],
			bgCyan: [46, 49],
			bgWhite: [47, 49],

			// Bright color
			bgBlackBright: [100, 49],
			bgRedBright: [101, 49],
			bgGreenBright: [102, 49],
			bgYellowBright: [103, 49],
			bgBlueBright: [104, 49],
			bgMagentaBright: [105, 49],
			bgCyanBright: [106, 49],
			bgWhiteBright: [107, 49]
		}
	};

	// Fix humans
	styles.color.grey = styles.color.gray;

	for (const groupName of Object.keys(styles)) {
		const group = styles[groupName];

		for (const styleName of Object.keys(group)) {
			const style = group[styleName];

			styles[styleName] = {
				open: `\u001B[${style[0]}m`,
				close: `\u001B[${style[1]}m`
			};

			group[styleName] = styles[styleName];

			codes.set(style[0], style[1]);
		}

		Object.defineProperty(styles, groupName, {
			value: group,
			enumerable: false
		});

		Object.defineProperty(styles, 'codes', {
			value: codes,
			enumerable: false
		});
	}

	const ansi2ansi = n => n;
	const rgb2rgb = (r, g, b) => [r, g, b];

	styles.color.close = '\u001B[39m';
	styles.bgColor.close = '\u001B[49m';

	styles.color.ansi = {
		ansi: wrapAnsi16(ansi2ansi, 0)
	};
	styles.color.ansi256 = {
		ansi256: wrapAnsi256(ansi2ansi, 0)
	};
	styles.color.ansi16m = {
		rgb: wrapAnsi16m(rgb2rgb, 0)
	};

	styles.bgColor.ansi = {
		ansi: wrapAnsi16(ansi2ansi, 10)
	};
	styles.bgColor.ansi256 = {
		ansi256: wrapAnsi256(ansi2ansi, 10)
	};
	styles.bgColor.ansi16m = {
		rgb: wrapAnsi16m(rgb2rgb, 10)
	};

	for (let key of Object.keys(colorConvert)) {
		if (typeof colorConvert[key] !== 'object') {
			continue;
		}

		const suite = colorConvert[key];

		if (key === 'ansi16') {
			key = 'ansi';
		}

		if ('ansi16' in suite) {
			styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0);
			styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10);
		}

		if ('ansi256' in suite) {
			styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0);
			styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10);
		}

		if ('rgb' in suite) {
			styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0);
			styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10);
		}
	}

	return styles;
}

// Make the export immutable
Object.defineProperty(module, 'exports', {
	enumerable: true,
	get: assembleStyles
});
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "color-convert": "^1.9.0"
  },
  "deprecated": false,
  "description": "ANSI escape codes for styling strings in the terminal",
  "devDependencies": {
    "ava": "*",
    "babel-polyfill": "^6.23.0",
    "svg-term-cli": "^2.1.1",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/ansi-styles#readme",
  "license": "MIT",
  "name": "ansi-styles",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/ansi-styles.git"
  },
  "version": "3.2.1"
}{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "7zip-bin": "~4.1.0",
    "app-builder-bin": "2.7.1",
    "async-exit-hook": "^2.0.1",
    "bluebird-lst": "^1.0.9",
    "builder-util": "10.1.2",
    "builder-util-runtime": "8.2.5",
    "chromium-pickle-js": "^0.2.0",
    "debug": "^4.1.1",
    "ejs": "^2.6.2",
    "electron-osx-sign": "0.4.11",
    "electron-publish": "20.44.4",
    "fs-extra-p": "^8.0.2",
    "hosted-git-info": "^2.7.1",
    "is-ci": "^2.0.0",
    "isbinaryfile": "^4.0.1",
    "js-yaml": "^3.13.1",
    "lazy-val": "^1.0.4",
    "minimatch": "^3.0.4",
    "normalize-package-data": "^2.5.0",
    "plist": "^3.0.1",
    "read-config-file": "3.2.2",
    "sanitize-filename": "^1.6.1",
    "semver": "^6.1.1",
    "temp-file": "^3.3.3"
  },
  "deprecated": false,
  "description": "electron-builder lib",
  "engines": {
    "node": ">=6.11.4"
  },
  "files": [
    "out",
    "templates",
    "scheme.json",
    "certs/root_certs.keychain"
  ],
  "homepage": "https://github.com/electron-userland/electron-builder",
  "license": "MIT",
  "main": "out/index.js",
  "name": "app-builder-lib",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-builder.git"
  },
  "typings": "./out/index.d.ts",
  "version": "20.44.4"
}{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "additionalProperties": false,
    "definitions": {
        "AppImageOptions": {
            "additionalProperties": false,
            "properties": {
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "category": {
                    "description": "The [application category](https://specifications.freedesktop.org/menu-spec/latest/apa.html#main-category-registry).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "description": {
                    "description": "As [description](/configuration/configuration#Metadata-description) from application package.json, but allows you to specify different for Linux.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "desktop": {
                    "description": "The [Desktop file](https://developer.gnome.org/integration-guide/stable/desktop-files.html.en) entries (name to value)."
                },
                "license": {
                    "description": "The path to EULA license file. Defaults to `license.txt` or `eula.txt` (or uppercase variants). Only plain text is supported.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "mimeTypes": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The mime types in addition to specified in the file associations. Use it if you don't want to register a new mime type, but reuse existing."
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "synopsis": {
                    "description": "The [short description](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "systemIntegration": {
                    "default": "ask",
                    "description": "The system integration installation.",
                    "enum": [
                        "ask",
                        "doNotAsk"
                    ],
                    "type": "string"
                }
            },
            "title": "AppImageOptions",
            "type": "object"
        },
        "AppXOptions": {
            "additionalProperties": false,
            "properties": {
                "addAutoLaunchExtension": {
                    "description": "Whether to add auto launch extension. Defaults to `true` if [electron-winstore-auto-launch](https://github.com/felixrieseberg/electron-winstore-auto-launch) in the dependencies.",
                    "type": "boolean"
                },
                "applicationId": {
                    "description": "The application id. Defaults to `identityName`. Canâ€™t start with numbers.",
                    "type": "string"
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "backgroundColor": {
                    "default": "#464646",
                    "description": "The background color of the app tile. See [Visual Elements](https://msdn.microsoft.com/en-us/library/windows/apps/br211471.aspx).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "displayName": {
                    "description": "A friendly name that can be displayed to users. Corresponds to [Properties.DisplayName](https://msdn.microsoft.com/en-us/library/windows/apps/br211432.aspx).\nDefaults to the application product name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "electronUpdaterAware": {
                    "default": false,
                    "type": "boolean"
                },
                "identityName": {
                    "description": "The name. Corresponds to [Identity.Name](https://msdn.microsoft.com/en-us/library/windows/apps/br211441.aspx). Defaults to the [application name](/configuration/configuration#Metadata-name).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "languages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "The list of [supported languages](https://docs.microsoft.com/en-us/windows/uwp/globalizing/manage-language-and-region#specify-the-supported-languages-in-the-apps-manifest) that will be listed in the Windows Store.\nThe first entry (index 0) will be the default language.\nDefaults to en-US if omitted."
                },
                "makeappxArgs": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "publisher": {
                    "description": "The Windows Store publisher. Not used if AppX is build for testing. See [AppX Package Code Signing](#appx-package-code-signing) below.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "publisherDisplayName": {
                    "description": "A friendly name for the publisher that can be displayed to users. Corresponds to [Properties.PublisherDisplayName](https://msdn.microsoft.com/en-us/library/windows/apps/br211460.aspx).\nDefaults to company name from the application metadata.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "showNameOnTiles": {
                    "description": "Whether to overlay the app's name on top of tile images on the Start screen. Defaults to `false`. (https://docs.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-uap-shownameontiles) in the dependencies.",
                    "type": "boolean"
                },
                "setBuildNumber": {
                    "description": "Whether to set build number. See https://github.com/electron-userland/electron-builder/issues/3875",
                    "type": "boolean"
                }
            },
            "title": "AppXOptions",
            "type": "object"
        },
        "AsarOptions": {
            "additionalProperties": false,
            "properties": {
                "externalAllowed": {
                    "default": false,
                    "description": "Allows external asar files.",
                    "type": "boolean"
                },
                "ordering": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "smartUnpack": {
                    "default": true,
                    "description": "Whether to automatically unpack executables files.",
                    "type": "boolean"
                }
            },
            "title": "AsarOptions",
            "type": "object"
        },
        "BintrayOptions": {
            "additionalProperties": false,
            "description": "[Bintray](https://bintray.com/) options. Requires an API key. An API key can be obtained from the user [profile](https://bintray.com/profile/edit) page (\"Edit Your Profile\" -> API Key).\nDefine `BT_TOKEN` environment variable.",
            "properties": {
                "component": {
                    "description": "The Bintray component (Debian only).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "distribution": {
                    "default": "stable",
                    "description": "The Bintray distribution (Debian only).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "owner": {
                    "description": "The owner.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "package": {
                    "description": "The Bintray package name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "provider": {
                    "description": "The provider. Must be `bintray`.",
                    "enum": [
                        "bintray"
                    ],
                    "type": "string"
                },
                "publishAutoUpdate": {
                    "default": true,
                    "description": "Whether to publish auto update info files.\n\nAuto update relies only on the first provider in the list (you can specify several publishers).\nThus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.",
                    "type": "boolean"
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "repo": {
                    "default": "generic",
                    "description": "The Bintray repository name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "token": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "updaterCacheDirName": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "user": {
                    "description": "The Bintray user account. Used in cases where the owner is an organization.",
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "required": [
                "provider"
            ],
            "title": "BintrayOptions",
            "type": "object"
        },
        "CustomPublishOptions": {
            "additionalProperties": {
            },
            "properties": {
                "provider": {
                    "$ref": "#/definitions/PublishProvider",
                    "description": "The provider."
                },
                "publishAutoUpdate": {
                    "default": true,
                    "description": "Whether to publish auto update info files.\n\nAuto update relies only on the first provider in the list (you can specify several publishers).\nThus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.",
                    "type": "boolean"
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "updaterCacheDirName": {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "required": [
                "provider"
            ],
            "title": "CustomPublishOptions",
            "type": "object"
        },
        "DebOptions": {
            "additionalProperties": false,
            "properties": {
                "afterInstall": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "afterRemove": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "category": {
                    "description": "The [application category](https://specifications.freedesktop.org/menu-spec/latest/apa.html#main-category-registry).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "compression": {
                    "anyOf": [
                        {
                            "enum": [
                                "bzip2",
                                "gz",
                                "xz"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "xz",
                    "description": "The compression type."
                },
                "depends": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Package dependencies. Defaults to `[\"gconf2\", \"gconf-service\", \"libnotify4\", \"libappindicator1\", \"libxtst6\", \"libnss3\"]`."
                },
                "description": {
                    "description": "As [description](/configuration/configuration#Metadata-description) from application package.json, but allows you to specify different for Linux.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "desktop": {
                    "description": "The [Desktop file](https://developer.gnome.org/integration-guide/stable/desktop-files.html.en) entries (name to value)."
                },
                "fpm": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "*Advanced only* The [fpm](https://github.com/jordansissel/fpm/wiki#usage) options.\n\nExample: `[\"--before-install=build/deb-preinstall.sh\", \"--after-upgrade=build/deb-postinstall.sh\"]`"
                },
                "icon": {
                    "type": "string"
                },
                "maintainer": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "mimeTypes": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The mime types in addition to specified in the file associations. Use it if you don't want to register a new mime type, but reuse existing."
                },
                "packageCategory": {
                    "description": "The [package category](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Section).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "priority": {
                    "description": "The [Priority](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Priority) attribute.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "synopsis": {
                    "description": "The [short description](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "vendor": {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "title": "DebOptions",
            "type": "object"
        },
        "DmgContent": {
            "additionalProperties": false,
            "properties": {
                "name": {
                    "description": "The name of the file within the DMG. Defaults to basename of `path`.",
                    "type": "string"
                },
                "path": {
                    "description": "The path of the file within the DMG.",
                    "type": "string"
                },
                "type": {
                    "enum": [
                        "dir",
                        "file",
                        "link"
                    ],
                    "type": "string"
                },
                "x": {
                    "type": "number"
                },
                "y": {
                    "type": "number"
                }
            },
            "required": [
                "x",
                "y"
            ],
            "title": "DmgContent",
            "type": "object"
        },
        "DmgOptions": {
            "additionalProperties": false,
            "properties": {
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "background": {
                    "description": "The path to background image (default: `build/background.tiff` or `build/background.png` if exists). The resolution of this file determines the resolution of the installer window.\nIf background is not specified, use `window.size`. Default locations expected background size to be 540x380.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "backgroundColor": {
                    "description": "The background color (accepts css colors). Defaults to `#ffffff` (white) if no background image.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "contents": {
                    "description": "The content â€” to customize icon locations.",
                    "items": {
                        "$ref": "#/definitions/DmgContent"
                    },
                    "type": "array"
                },
                "format": {
                    "default": "UDZO",
                    "description": "The disk image format. `ULFO` (lzfse-compressed image (OS X 10.11+ only)).",
                    "enum": [
                        "UDBZ",
                        "UDCO",
                        "UDRO",
                        "UDRW",
                        "UDZO",
                        "ULFO"
                    ],
                    "type": "string"
                },
                "icon": {
                    "description": "The path to DMG icon (volume icon), which will be shown when mounted, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to the application icon (`build/icon.icns`).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "iconSize": {
                    "default": 80,
                    "description": "The size of all the icons inside the DMG.",
                    "type": [
                        "null",
                        "number"
                    ]
                },
                "iconTextSize": {
                    "default": 12,
                    "description": "The size of all the icon texts inside the DMG.",
                    "type": [
                        "null",
                        "number"
                    ]
                },
                "internetEnabled": {
                    "default": false,
                    "description": "Whether to create internet-enabled disk image (when it is downloaded using a browser it will automatically decompress the image, put the application on the desktop, unmount and remove the disk image file).",
                    "type": "boolean"
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "title": {
                    "default": "${productName} ${version}",
                    "description": "The title of the produced DMG, which will be shown when mounted (volume name).\n\nMacro `${productName}`, `${version}` and `${name}` are supported.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "window": {
                    "$ref": "#/definitions/DmgWindow",
                    "description": "The DMG windows position and size."
                },
                "sign": {
                    "default": false,
                    "description": "Disable signing of the DMG when building. This can help solve issues with Gatekeeper disabling installation of your app.",
                    "type": "boolean"
                }
            },
            "title": "DmgOptions",
            "type": "object"
        },
        "DmgWindow": {
            "additionalProperties": false,
            "properties": {
                "height": {
                    "description": "The height. Defaults to background image height or 380.",
                    "type": "number"
                },
                "width": {
                    "description": "The width. Defaults to background image width or 540.",
                    "type": "number"
                },
                "x": {
                    "default": 400,
                    "description": "The X position relative to left of the screen.",
                    "type": "number"
                },
                "y": {
                    "default": 100,
                    "description": "The Y position relative to top of the screen.",
                    "type": "number"
                }
            },
            "title": "DmgWindow",
            "type": "object"
        },
        "ElectronDownloadOptions": {
            "additionalProperties": false,
            "properties": {
                "arch": {
                    "type": "string"
                },
                "cache": {
                    "description": "The [cache location](https://github.com/electron-userland/electron-download#cache-location).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "customDir": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "customFilename": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "isVerifyChecksum": {
                    "type": "boolean"
                },
                "mirror": {
                    "description": "The mirror.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "platform": {
                    "enum": [
                        "darwin",
                        "linux",
                        "mas",
                        "win32"
                    ],
                    "type": "string"
                },
                "strictSSL": {
                    "type": "boolean"
                },
                "version": {
                    "type": "string"
                }
            },
            "title": "ElectronDownloadOptions",
            "type": "object"
        },
        "FileAssociation": {
            "additionalProperties": false,
            "description": "File associations.\n\nmacOS (corresponds to [CFBundleDocumentTypes](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-101685)) and NSIS only.\n\nOn Windows works only if [nsis.perMachine](https://electron.build/configuration/configuration#NsisOptions-perMachine) is set to `true`.",
            "properties": {
                "description": {
                    "description": "*windows-only.* The description.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "ext": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "string"
                        }
                    ],
                    "description": "The extension (minus the leading period). e.g. `png`."
                },
                "icon": {
                    "description": "The path to icon (`.icns` for MacOS and `.ico` for Windows), relative to `build` (build resources directory). Defaults to `${firstExt}.icns`/`${firstExt}.ico` (if several extensions specified, first is used) or to application icon.\n\nNot supported on Linux, file issue if need (default icon will be `x-office-document`).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "isPackage": {
                    "description": "*macOS-only* Whether the document is distributed as a bundle. If set to true, the bundle directory is treated as a file. Corresponds to `LSTypeIsPackage`.",
                    "type": "boolean"
                },
                "mimeType": {
                    "description": "*linux-only.* The mime-type.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "name": {
                    "description": "The name. e.g. `PNG`. Defaults to `ext`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "role": {
                    "default": "Editor",
                    "description": "*macOS-only* The appâ€™s role with respect to the type. The value can be `Editor`, `Viewer`, `Shell`, or `None`. Corresponds to `CFBundleTypeRole`.",
                    "type": "string"
                }
            },
            "required": [
                "ext"
            ],
            "title": "FileAssociation",
            "type": "object"
        },
        "FileSet": {
            "additionalProperties": false,
            "properties": {
                "filter": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "string"
                        }
                    ],
                    "description": "The [glob patterns](/file-patterns)."
                },
                "from": {
                    "description": "The source path relative to the project directory.",
                    "type": "string"
                },
                "to": {
                    "description": "The destination path relative to the app's content directory for `extraFiles` and the app's resource directory for `extraResources`.",
                    "type": "string"
                }
            },
            "title": "FileSet",
            "type": "object"
        },
        "GenericServerOptions": {
            "additionalProperties": false,
            "description": "Generic (any HTTP(S) server) options.\nIn all publish options [File Macros](/file-patterns#file-macros) are supported.",
            "properties": {
                "channel": {
                    "default": "latest",
                    "description": "The channel.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "provider": {
                    "description": "The provider. Must be `generic`.",
                    "enum": [
                        "generic"
                    ],
                    "type": "string"
                },
                "publishAutoUpdate": {
                    "default": true,
                    "description": "Whether to publish auto update info files.\n\nAuto update relies only on the first provider in the list (you can specify several publishers).\nThus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.",
                    "type": "boolean"
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "updaterCacheDirName": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "url": {
                    "description": "The base url. e.g. `https://bucket_name.s3.amazonaws.com`.",
                    "type": "string"
                },
                "useMultipleRangeRequest": {
                    "description": "Whether to use multiple range requests for differential update. Defaults to `true` if `url` doesn't contain `s3.amazonaws.com`.",
                    "type": "boolean"
                }
            },
            "required": [
                "provider",
                "url"
            ],
            "title": "GenericServerOptions",
            "type": "object"
        },
        "GithubOptions": {
            "additionalProperties": false,
            "description": "[GitHub](https://help.github.com/articles/about-releases/) options.\n\nGitHub [personal access token](https://help.github.com/articles/creating-an-access-token-for-command-line-use/) is required. You can generate by going to [https://github.com/settings/tokens/new](https://github.com/settings/tokens/new). The access token should have the repo scope/permission.\nDefine `GH_TOKEN` environment variable.",
            "properties": {
                "host": {
                    "default": "github.com",
                    "description": "The host (including the port if need).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "owner": {
                    "description": "The owner.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "private": {
                    "description": "Whether to use private github auto-update provider if `GH_TOKEN` environment variable is defined. See [Private GitHub Update Repo](/auto-update#private-github-update-repo).",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "protocol": {
                    "anyOf": [
                        {
                            "enum": [
                                "http",
                                "https"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "https",
                    "description": "The protocol. GitHub Publisher supports only `https`."
                },
                "provider": {
                    "description": "The provider. Must be `github`.",
                    "enum": [
                        "github"
                    ],
                    "type": "string"
                },
                "publishAutoUpdate": {
                    "default": true,
                    "description": "Whether to publish auto update info files.\n\nAuto update relies only on the first provider in the list (you can specify several publishers).\nThus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.",
                    "type": "boolean"
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "releaseType": {
                    "anyOf": [
                        {
                            "enum": [
                                "draft",
                                "prerelease",
                                "release"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "draft",
                    "description": "The type of release. By default `draft` release will be created.\n\nAlso you can set release type using environment variable. If `EP_DRAFT`is set to `true` â€” `draft`, if `EP_PRE_RELEASE`is set to `true` â€” `prerelease`."
                },
                "repo": {
                    "description": "The repository name. [Detected automatically](#github-repository-and-bintray-package).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "token": {
                    "description": "The access token to support auto-update from private github repositories. Never specify it in the configuration files. Only for [setFeedURL](/auto-update#appupdatersetfeedurloptions).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "updaterCacheDirName": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "vPrefixedTagName": {
                    "default": true,
                    "description": "Whether to use `v`-prefixed tag name.",
                    "type": "boolean"
                }
            },
            "required": [
                "provider"
            ],
            "title": "GithubOptions",
            "type": "object"
        },
        "LinuxConfiguration": {
            "additionalProperties": false,
            "properties": {
                "appId": {
                    "default": "com.electron.${name}",
                    "description": "The application id. Used as [CFBundleIdentifier](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070) for MacOS and as\n[Application User Model ID](https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx) for Windows (NSIS target only, Squirrel.Windows not supported). It is strongly recommended that an explicit ID is set.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName}-${version}.${ext}` (some target can have other defaults, see corresponding options).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "asar": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/AsarOptions"
                        },
                        {
                            "type": [
                                "null",
                                "boolean"
                            ]
                        }
                    ],
                    "default": true,
                    "description": "Whether to package the application's source code into an archive, using [Electron's archive format](http://electron.atom.io/docs/tutorial/application-packaging/).\n\nNode modules, that must be unpacked, will be detected automatically, you don't need to explicitly set [asarUnpack](#configuration-asarUnpack) - please file an issue if this doesn't work."
                },
                "asarUnpack": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "A [glob patterns](/file-patterns) relative to the [app directory](#MetadataDirectories-app), which specifies which files to unpack when creating the [asar](http://electron.atom.io/docs/tutorial/application-packaging/) archive."
                },
                "category": {
                    "description": "The [application category](https://specifications.freedesktop.org/menu-spec/latest/apa.html#main-category-registry).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "compression": {
                    "anyOf": [
                        {
                            "enum": [
                                "maximum",
                                "normal",
                                "store"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "normal",
                    "description": "The compression level. If you want to rapidly test build, `store` can reduce build time significantly. `maximum` doesn't lead to noticeable size difference, but increase build time."
                },
                "cscKeyPassword": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscLink": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "depends": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "description": {
                    "description": "As [description](/configuration/configuration#Metadata-description) from application package.json, but allows you to specify different for Linux.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "desktop": {
                    "description": "The [Desktop file](https://developer.gnome.org/integration-guide/stable/desktop-files.html.en) entries (name to value)."
                },
                "detectUpdateChannel": {
                    "default": true,
                    "description": "Whether to infer update channel from application version pre-release components. e.g. if version `0.12.1-alpha.1`, channel will be set to `alpha`. Otherwise to `latest`.",
                    "type": "boolean"
                },
                "electronUpdaterCompatibility": {
                    "description": "The [electron-updater compatibility](/auto-update#compatibility) semver range.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "executableName": {
                    "description": "The executable name. Defaults to `productName`.\nCannot be specified per target, allowed only in the `linux`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "extraFiles": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "extraResources": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "fileAssociations": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileAssociation"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/FileAssociation"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The file associations."
                },
                "files": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "forceCodeSigning": {
                    "description": "Whether to fail if app will be not code signed.",
                    "type": "boolean"
                },
                "generateUpdatesFilesForAllChannels": {
                    "default": false,
                    "description": "Please see [Building and Releasing using Channels](https://github.com/electron-userland/electron-builder/issues/1182#issuecomment-324947139).",
                    "type": "boolean"
                },
                "icon": {
                    "description": "The path to icon set directory or one png file, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory. The icon filename must contain the size (e.g. 32x32.png) of the icon.\nBy default will be generated automatically based on the macOS icns file.",
                    "type": "string"
                },
                "maintainer": {
                    "description": "The maintainer. Defaults to [author](/configuration/configuration#Metadata-author).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "mimeTypes": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The mime types in addition to specified in the file associations. Use it if you don't want to register a new mime type, but reuse existing."
                },
                "packageCategory": {
                    "description": "backward compatibility + to allow specify fpm-only category for all possible fpm targets in one place",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "protocols": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/Protocol"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/Protocol"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The URL protocol schemes."
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "releaseInfo": {
                    "$ref": "#/definitions/ReleaseInfo",
                    "description": "The release info. Intended for command line usage:\n\n```\n-c.releaseInfo.releaseNotes=\"new features\"\n```"
                },
                "synopsis": {
                    "description": "The [short description](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "target": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/TargetConfiguration"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/TargetConfiguration"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "default": "AppImage",
                    "description": "Target package type: list of `AppImage`, `snap`, `deb`, `rpm`, `freebsd`, `pacman`, `p5p`, `apk`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`.\n\nelectron-builder [docker image](/multi-platform-build#docker) can be used to build Linux targets on any platform.\n\nPlease [do not put an AppImage into another archive](https://github.com/probonopd/AppImageKit/wiki/Creating-AppImages#common-mistake) like a .zip or .tar.gz."
                },
                "vendor": {
                    "description": "The vendor. Defaults to [author](/configuration/configuration#Metadata-author).",
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "title": "LinuxConfiguration",
            "type": "object"
        },
        "LinuxTargetSpecificOptions": {
            "additionalProperties": false,
            "properties": {
                "afterInstall": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "afterRemove": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "category": {
                    "description": "The [application category](https://specifications.freedesktop.org/menu-spec/latest/apa.html#main-category-registry).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "compression": {
                    "anyOf": [
                        {
                            "enum": [
                                "bzip2",
                                "gz",
                                "xz"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "xz",
                    "description": "The compression type."
                },
                "depends": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Package dependencies."
                },
                "description": {
                    "description": "As [description](/configuration/configuration#Metadata-description) from application package.json, but allows you to specify different for Linux.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "desktop": {
                    "description": "The [Desktop file](https://developer.gnome.org/integration-guide/stable/desktop-files.html.en) entries (name to value)."
                },
                "fpm": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "*Advanced only* The [fpm](https://github.com/jordansissel/fpm/wiki#usage) options.\n\nExample: `[\"--before-install=build/deb-preinstall.sh\", \"--after-upgrade=build/deb-postinstall.sh\"]`"
                },
                "icon": {
                    "type": "string"
                },
                "maintainer": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "mimeTypes": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The mime types in addition to specified in the file associations. Use it if you don't want to register a new mime type, but reuse existing."
                },
                "packageCategory": {
                    "description": "The package category.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "synopsis": {
                    "description": "The [short description](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "vendor": {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "title": "LinuxTargetSpecificOptions",
            "type": "object"
        },
        "MacConfiguration": {
            "additionalProperties": false,
            "properties": {
                "appId": {
                    "default": "com.electron.${name}",
                    "description": "The application id. Used as [CFBundleIdentifier](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070) for MacOS and as\n[Application User Model ID](https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx) for Windows (NSIS target only, Squirrel.Windows not supported). It is strongly recommended that an explicit ID is set.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName}-${version}.${ext}` (some target can have other defaults, see corresponding options).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "asar": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/AsarOptions"
                        },
                        {
                            "type": [
                                "null",
                                "boolean"
                            ]
                        }
                    ],
                    "default": true,
                    "description": "Whether to package the application's source code into an archive, using [Electron's archive format](http://electron.atom.io/docs/tutorial/application-packaging/).\n\nNode modules, that must be unpacked, will be detected automatically, you don't need to explicitly set [asarUnpack](#configuration-asarUnpack) - please file an issue if this doesn't work."
                },
                "asarUnpack": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "A [glob patterns](/file-patterns) relative to the [app directory](#MetadataDirectories-app), which specifies which files to unpack when creating the [asar](http://electron.atom.io/docs/tutorial/application-packaging/) archive."
                },
                "binaries": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Paths of any extra binaries that need to be signed."
                },
                "bundleShortVersion": {
                    "description": "The `CFBundleShortVersionString`. Do not use it unless you need to.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "bundleVersion": {
                    "description": "The `CFBundleVersion`. Do not use it unless [you need to](https://github.com/electron-userland/electron-builder/issues/565#issuecomment-230678643).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "category": {
                    "description": "The application category type, as shown in the Finder via *View -> Arrange by Application Category* when viewing the Applications directory.\n\nFor example, `\"category\": \"public.app-category.developer-tools\"` will set the application category to *Developer Tools*.\n\nValid values are listed in [Apple's documentation](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW8).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "compression": {
                    "anyOf": [
                        {
                            "enum": [
                                "maximum",
                                "normal",
                                "store"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "normal",
                    "description": "The compression level. If you want to rapidly test build, `store` can reduce build time significantly. `maximum` doesn't lead to noticeable size difference, but increase build time."
                },
                "cscInstallerKeyPassword": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscInstallerLink": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscKeyPassword": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscLink": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "darkModeSupport": {
                    "default": false,
                    "description": "Whether a dark mode is supported. If your app does have a dark mode, you can make your app follow the system-wide dark mode setting.",
                    "type": "boolean"
                },
                "hardenedRuntime": {
                    "default": false,
                    "description": "Whether your app has to be signed with hardened runtime.",
                    "type": "boolean"
                },
                "gatekeeperAssess": {
                    "default": false,
                    "description": "Whether to let electron-osx-sign validate the signing or not.",
                    "type": "boolean"
                },
                "detectUpdateChannel": {
                    "default": true,
                    "description": "Whether to infer update channel from application version pre-release components. e.g. if version `0.12.1-alpha.1`, channel will be set to `alpha`. Otherwise to `latest`.",
                    "type": "boolean"
                },
                "electronLanguages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "string"
                        }
                    ],
                    "description": "The electron locales. By default Electron locales used as is."
                },
                "electronUpdaterCompatibility": {
                    "description": "The [electron-updater compatibility](/auto-update#compatibility) semver range.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "entitlements": {
                    "description": "The path to entitlements file for signing the app. `build/entitlements.mac.plist` will be used if exists (it is a recommended way to set).\nMAS entitlements is specified in the [mas](/configuration/mas).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "entitlementsInherit": {
                    "description": "The path to child entitlements which inherit the security settings for signing frameworks and bundles of a distribution. `build/entitlements.mac.inherit.plist` will be used if exists (it is a recommended way to set).\nOtherwise [default](https://github.com/electron-userland/electron-osx-sign/blob/master/default.entitlements.darwin.inherit.plist).\n\nThis option only applies when signing with `entitlements` provided.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "extendInfo": {
                    "description": "The extra entries for `Info.plist`."
                },
                "extraDistFiles": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "Extra files to put in archive. Not applicable for `tar.*`."
                },
                "extraFiles": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "extraResources": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "fileAssociations": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileAssociation"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/FileAssociation"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The file associations."
                },
                "files": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "forceCodeSigning": {
                    "description": "Whether to fail if app will be not code signed.",
                    "type": "boolean"
                },
                "generateUpdatesFilesForAllChannels": {
                    "default": false,
                    "description": "Please see [Building and Releasing using Channels](https://github.com/electron-userland/electron-builder/issues/1182#issuecomment-324947139).",
                    "type": "boolean"
                },
                "helperBundleId": {
                    "default": "${appBundleIdentifier}.helper",
                    "description": "The bundle identifier to use in the application helper's plist.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "icon": {
                    "default": "build/icon.icns",
                    "description": "The path to application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "identity": {
                    "description": "The name of certificate to use when signing. Consider using environment variables [CSC_LINK or CSC_NAME](/code-signing) instead of specifying this option.\nMAS installer identity is specified in the [mas](/configuration/mas).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "minimumSystemVersion": {
                    "description": "The minimum version of macOS required for the app to run. Corresponds to `LSMinimumSystemVersion`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "protocols": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/Protocol"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/Protocol"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The URL protocol schemes."
                },
                "provisioningProfile": {
                    "description": "The path to the provisioning profile to use when signing, absolute or relative to the app root.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "releaseInfo": {
                    "$ref": "#/definitions/ReleaseInfo",
                    "description": "The release info. Intended for command line usage:\n\n```\n-c.releaseInfo.releaseNotes=\"new features\"\n```"
                },
                "requirements": {
                    "description": "Path of [requirements file](https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/RequirementLang/RequirementLang.html) used in signing. Not applicable for MAS.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "target": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/TargetConfiguration"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/TargetConfiguration"
                                    },
                                    {
                                        "enum": [
                                            "7z",
                                            "default",
                                            "dir",
                                            "dmg",
                                            "mas",
                                            "mas-dev",
                                            "pkg",
                                            "tar.bz2",
                                            "tar.gz",
                                            "tar.lz",
                                            "tar.xz",
                                            "zip"
                                        ],
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "enum": [
                                "7z",
                                "default",
                                "dir",
                                "dmg",
                                "mas",
                                "mas-dev",
                                "pkg",
                                "tar.bz2",
                                "tar.gz",
                                "tar.lz",
                                "tar.xz",
                                "zip"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The target package type: list of `default`, `dmg`, `mas`, `mas-dev`, `pkg`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`. Defaults to `default` (dmg and zip for Squirrel.Mac)."
                },
                "type": {
                    "anyOf": [
                        {
                            "enum": [
                                "development",
                                "distribution"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "distribution",
                    "description": "Whether to sign app for development or for distribution."
                }
            },
            "title": "MacConfiguration",
            "type": "object"
        },
        "MasConfiguration": {
            "additionalProperties": false,
            "properties": {
                "appId": {
                    "default": "com.electron.${name}",
                    "description": "The application id. Used as [CFBundleIdentifier](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070) for MacOS and as\n[Application User Model ID](https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx) for Windows (NSIS target only, Squirrel.Windows not supported). It is strongly recommended that an explicit ID is set.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName}-${version}.${ext}` (some target can have other defaults, see corresponding options).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "asar": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/AsarOptions"
                        },
                        {
                            "type": [
                                "null",
                                "boolean"
                            ]
                        }
                    ],
                    "default": true,
                    "description": "Whether to package the application's source code into an archive, using [Electron's archive format](http://electron.atom.io/docs/tutorial/application-packaging/).\n\nNode modules, that must be unpacked, will be detected automatically, you don't need to explicitly set [asarUnpack](#configuration-asarUnpack) - please file an issue if this doesn't work."
                },
                "asarUnpack": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "A [glob patterns](/file-patterns) relative to the [app directory](#MetadataDirectories-app), which specifies which files to unpack when creating the [asar](http://electron.atom.io/docs/tutorial/application-packaging/) archive."
                },
                "binaries": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Paths of any extra binaries that need to be signed."
                },
                "bundleShortVersion": {
                    "description": "The `CFBundleShortVersionString`. Do not use it unless you need to.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "bundleVersion": {
                    "description": "The `CFBundleVersion`. Do not use it unless [you need to](https://github.com/electron-userland/electron-builder/issues/565#issuecomment-230678643).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "category": {
                    "description": "The application category type, as shown in the Finder via *View -> Arrange by Application Category* when viewing the Applications directory.\n\nFor example, `\"category\": \"public.app-category.developer-tools\"` will set the application category to *Developer Tools*.\n\nValid values are listed in [Apple's documentation](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW8).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "compression": {
                    "anyOf": [
                        {
                            "enum": [
                                "maximum",
                                "normal",
                                "store"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "normal",
                    "description": "The compression level. If you want to rapidly test build, `store` can reduce build time significantly. `maximum` doesn't lead to noticeable size difference, but increase build time."
                },
                "cscInstallerKeyPassword": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscInstallerLink": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscKeyPassword": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscLink": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "darkModeSupport": {
                    "default": false,
                    "description": "Whether a dark mode is supported. If your app does have a dark mode, you can make your app follow the system-wide dark mode setting.",
                    "type": "boolean"
                },
                "hardenedRuntime": {
                    "default": false,
                    "description": "Whether your app has to be signed with hardened runtime.",
                    "type": "boolean"
                },
                "detectUpdateChannel": {
                    "default": true,
                    "description": "Whether to infer update channel from application version pre-release components. e.g. if version `0.12.1-alpha.1`, channel will be set to `alpha`. Otherwise to `latest`.",
                    "type": "boolean"
                },
                "electronLanguages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "string"
                        }
                    ],
                    "description": "The electron locales. By default Electron locales used as is."
                },
                "electronUpdaterCompatibility": {
                    "description": "The [electron-updater compatibility](/auto-update#compatibility) semver range.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "entitlements": {
                    "description": "The path to entitlements file for signing the app. `build/entitlements.mas.plist` will be used if exists (it is a recommended way to set).\nOtherwise [default](https://github.com/electron-userland/electron-osx-sign/blob/master/default.entitlements.mas.plist).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "entitlementsInherit": {
                    "description": "The path to child entitlements which inherit the security settings for signing frameworks and bundles of a distribution. `build/entitlements.mas.inherit.plist` will be used if exists (it is a recommended way to set).\nOtherwise [default](https://github.com/electron-userland/electron-osx-sign/blob/master/default.entitlements.mas.inherit.plist).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "extendInfo": {
                    "description": "The extra entries for `Info.plist`."
                },
                "extraDistFiles": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "Extra files to put in archive. Not applicable for `tar.*`."
                },
                "extraFiles": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "extraResources": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "fileAssociations": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileAssociation"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/FileAssociation"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The file associations."
                },
                "files": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "forceCodeSigning": {
                    "description": "Whether to fail if app will be not code signed.",
                    "type": "boolean"
                },
                "generateUpdatesFilesForAllChannels": {
                    "default": false,
                    "description": "Please see [Building and Releasing using Channels](https://github.com/electron-userland/electron-builder/issues/1182#issuecomment-324947139).",
                    "type": "boolean"
                },
                "helperBundleId": {
                    "default": "${appBundleIdentifier}.helper",
                    "description": "The bundle identifier to use in the application helper's plist.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "icon": {
                    "default": "build/icon.icns",
                    "description": "The path to application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "identity": {
                    "description": "The name of certificate to use when signing. Consider using environment variables [CSC_LINK or CSC_NAME](/code-signing) instead of specifying this option.\nMAS installer identity is specified in the [mas](/configuration/mas).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "minimumSystemVersion": {
                    "description": "The minimum version of macOS required for the app to run. Corresponds to `LSMinimumSystemVersion`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "protocols": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/Protocol"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/Protocol"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The URL protocol schemes."
                },
                "provisioningProfile": {
                    "description": "The path to the provisioning profile to use when signing, absolute or relative to the app root.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "releaseInfo": {
                    "$ref": "#/definitions/ReleaseInfo",
                    "description": "The release info. Intended for command line usage:\n\n```\n-c.releaseInfo.releaseNotes=\"new features\"\n```"
                },
                "requirements": {
                    "description": "Path of [requirements file](https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/RequirementLang/RequirementLang.html) used in signing. Not applicable for MAS.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "target": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/TargetConfiguration"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/TargetConfiguration"
                                    },
                                    {
                                        "enum": [
                                            "7z",
                                            "default",
                                            "dir",
                                            "dmg",
                                            "mas",
                                            "mas-dev",
                                            "pkg",
                                            "tar.bz2",
                                            "tar.gz",
                                            "tar.lz",
                                            "tar.xz",
                                            "zip"
                                        ],
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "enum": [
                                "7z",
                                "default",
                                "dir",
                                "dmg",
                                "mas",
                                "mas-dev",
                                "pkg",
                                "tar.bz2",
                                "tar.gz",
                                "tar.lz",
                                "tar.xz",
                                "zip"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The target package type: list of `default`, `dmg`, `mas`, `mas-dev`, `pkg`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`. Defaults to `default` (dmg and zip for Squirrel.Mac)."
                },
                "type": {
                    "anyOf": [
                        {
                            "enum": [
                                "development",
                                "distribution"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "distribution",
                    "description": "Whether to sign app for development or for distribution."
                }
            },
            "title": "MasConfiguration",
            "type": "object"
        },
        "MetadataDirectories": {
            "additionalProperties": false,
            "properties": {
                "app": {
                    "description": "The application directory (containing the application package.json), defaults to `app`, `www` or working directory.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "buildResources": {
                    "default": "build",
                    "description": "The path to build resources.\n\nPlease note â€” build resources is not packed into the app. If you need to use some files, e.g. as tray icon, please include required files explicitly: `\"files\": [\"**\\/*\", \"build/icon.*\"]`",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "output": {
                    "default": "dist",
                    "description": "The output directory. [File macros](/file-patterns#file-macros) are supported.",
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "title": "MetadataDirectories",
            "type": "object"
        },
        "MsiOptions": {
            "additionalProperties": false,
            "properties": {
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "createDesktopShortcut": {
                    "default": true,
                    "description": "Whether to create desktop shortcut. Set to `always` if to recreate also on reinstall (even if removed by user).",
                    "enum": [
                        "always",
                        false,
                        true
                    ]
                },
                "createStartMenuShortcut": {
                    "default": true,
                    "description": "Whether to create start menu shortcut.",
                    "type": "boolean"
                },
                "menuCategory": {
                    "default": false,
                    "description": "Whether to create submenu for start menu shortcut and program files directory. If `true`, company name will be used. Or string value.",
                    "type": [
                        "string",
                        "boolean"
                    ]
                },
                "oneClick": {
                    "default": true,
                    "description": "One-click installation.",
                    "type": "boolean"
                },
                "perMachine": {
                    "default": false,
                    "description": "Whether to install per all users (per-machine).",
                    "type": "boolean"
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "runAfterFinish": {
                    "default": true,
                    "description": "Whether to run the installed application after finish. For assisted installer corresponding checkbox will be removed.",
                    "type": "boolean"
                },
                "shortcutName": {
                    "description": "The name that will be used for all shortcuts. Defaults to the application name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "upgradeCode": {
                    "description": "The [upgrade code](https://msdn.microsoft.com/en-us/library/windows/desktop/aa372375(v=vs.85).aspx). Optional, by default generated using app id.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "warningsAsErrors": {
                    "default": true,
                    "description": "If `warningsAsErrors` is `true` (default): treat warnings as errors. If `warningsAsErrors` is `false`: allow warnings.",
                    "type": "boolean"
                }
            },
            "title": "MsiOptions",
            "type": "object"
        },
        "NsisOptions": {
            "additionalProperties": false,
            "properties": {
                "allowElevation": {
                    "default": true,
                    "description": "*assisted installer only.* Allow requesting for elevation. If false, user will have to restart installer with elevated permissions.",
                    "type": "boolean"
                },
                "allowToChangeInstallationDirectory": {
                    "default": false,
                    "description": "*assisted installer only.* Whether to allow user to change installation directory.",
                    "type": "boolean"
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName} Setup ${version}.${ext}`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "createDesktopShortcut": {
                    "default": true,
                    "description": "Whether to create desktop shortcut. Set to `always` if to recreate also on reinstall (even if removed by user).",
                    "enum": [
                        "always",
                        false,
                        true
                    ]
                },
                "createStartMenuShortcut": {
                    "default": true,
                    "description": "Whether to create start menu shortcut.",
                    "type": "boolean"
                },
                "deleteAppDataOnUninstall": {
                    "default": false,
                    "description": "*one-click installer only.* Whether to delete app data on uninstall.",
                    "type": "boolean"
                },
                "differentialPackage": {
                    "description": "Defaults to `true` for web installer (`nsis-web`)",
                    "type": "boolean"
                },
                "displayLanguageSelector": {
                    "default": false,
                    "description": "Whether to display a language selection dialog. Not recommended (by default will be detected using OS language).",
                    "type": "boolean"
                },
                "guid": {
                    "description": "See [GUID vs Application Name](../configuration/nsis#guid-vs-application-name).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "include": {
                    "description": "The path to NSIS include script to customize installer. Defaults to `build/installer.nsh`. See [Custom NSIS script](#custom-nsis-script).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerHeader": {
                    "default": "build/installerHeader.bmp",
                    "description": "*assisted installer only.* `MUI_HEADERIMAGE`, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerHeaderIcon": {
                    "description": "*one-click installer only.* The path to header icon (above the progress bar), relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/installerHeaderIcon.ico` or application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerIcon": {
                    "description": "The path to installer icon, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/installerIcon.ico` or application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerLanguages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "The installer languages (e.g. `en_US`, `de_DE`). Change only if you understand what do you do and for what."
                },
                "installerSidebar": {
                    "description": "*assisted installer only.* `MUI_WELCOMEFINISHPAGE_BITMAP`, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/installerSidebar.bmp` or `${NSISDIR}\\\\Contrib\\\\Graphics\\\\Wizard\\\\nsis3-metro.bmp`. Image size 164 Ã— 314 pixels.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "language": {
                    "description": "[LCID Dec](https://msdn.microsoft.com/en-au/goglobal/bb964664.aspx), defaults to `1033`(`English - United States`).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "license": {
                    "description": "The path to EULA license file. Defaults to `license.txt` or `eula.txt` (or uppercase variants). In addition to `txt, `rtf` and `html` supported (don't forget to use `target=\"_blank\"` for links).\n\nMultiple license files in different languages are supported â€” use lang postfix (e.g. `_de`, `_ru`)). For example, create files `license_de.txt` and `license_en.txt` in the build resources.\nIf OS language is german, `license_de.txt` will be displayed. See map of [language code to name](https://github.com/meikidd/iso-639-1/blob/master/src/data.js).\n\nAppropriate license file will be selected by user OS language.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "menuCategory": {
                    "default": false,
                    "description": "Whether to create submenu for start menu shortcut and program files directory. If `true`, company name will be used. Or string value.",
                    "type": [
                        "string",
                        "boolean"
                    ]
                },
                "multiLanguageInstaller": {
                    "description": "Whether to create multi-language installer. Defaults to `unicode` option value.",
                    "type": "boolean"
                },
                "oneClick": {
                    "default": true,
                    "description": "Whether to create one-click installer or assisted.",
                    "type": "boolean"
                },
                "packElevateHelper": {
                    "default": true,
                    "description": "Whether to pack the elevate executable (required for electron-updater if per-machine installer used or can be used in the future). Ignored if `perMachine` is set to `true`.",
                    "type": "boolean"
                },
                "perMachine": {
                    "default": false,
                    "description": "Whether to show install mode installer page (choice per-machine or per-user) for assisted installer. Or whether installation always per all users (per-machine).\n\nIf `oneClick` is `true` (default): Whether to install per all users (per-machine).\n\nIf `oneClick` is `false` and `perMachine` is `true`: no install mode installer page, always install per-machine.\n\nIf `oneClick` is `false` and `perMachine` is `false` (default): install mode installer page.",
                    "type": "boolean"
                },
                "preCompressedFileExtensions": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "default": [
                        ".avi",
                        ".mov",
                        ".m4v",
                        ".mp4",
                        ".m4p",
                        ".qt",
                        ".mkv",
                        ".webm",
                        ".vmdk"
                    ],
                    "description": "The file extension of files that will be not compressed. Applicable only for `extraResources` and `extraFiles` files."
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "runAfterFinish": {
                    "default": true,
                    "description": "Whether to run the installed application after finish. For assisted installer corresponding checkbox will be removed.",
                    "type": "boolean"
                },
                "script": {
                    "description": "The path to NSIS script to customize installer. Defaults to `build/installer.nsi`. See [Custom NSIS script](#custom-nsis-script).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "shortcutName": {
                    "description": "The name that will be used for all shortcuts. Defaults to the application name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "unicode": {
                    "default": true,
                    "description": "Whether to create [Unicode installer](http://nsis.sourceforge.net/Docs/Chapter1.html#intro-unicode).",
                    "type": "boolean"
                },
                "uninstallDisplayName": {
                    "default": "${productName} ${version}",
                    "description": "The uninstaller display name in the control panel.",
                    "type": "string"
                },
                "uninstallerIcon": {
                    "description": "The path to uninstaller icon, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/uninstallerIcon.ico` or application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "uninstallerSidebar": {
                    "description": "*assisted installer only.* `MUI_UNWELCOMEFINISHPAGE_BITMAP`, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `installerSidebar` option or `build/uninstallerSidebar.bmp` or `build/installerSidebar.bmp` or `${NSISDIR}\\\\Contrib\\\\Graphics\\\\Wizard\\\\nsis3-metro.bmp`",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "useZip": {
                    "default": false,
                    "type": "boolean"
                },
                "warningsAsErrors": {
                    "default": true,
                    "description": "If `warningsAsErrors` is `true` (default): NSIS will treat warnings as errors. If `warningsAsErrors` is `false`: NSIS will allow warnings.",
                    "type": "boolean"
                }
            },
            "title": "NsisOptions",
            "type": "object"
        },
        "NsisWebOptions": {
            "additionalProperties": false,
            "description": "Web Installer options.",
            "properties": {
                "allowElevation": {
                    "default": true,
                    "description": "*assisted installer only.* Allow requesting for elevation. If false, user will have to restart installer with elevated permissions.",
                    "type": "boolean"
                },
                "allowToChangeInstallationDirectory": {
                    "default": false,
                    "description": "*assisted installer only.* Whether to allow user to change installation directory.",
                    "type": "boolean"
                },
                "appPackageUrl": {
                    "description": "The application package download URL. Optional â€” by default computed using publish configuration.\n\nURL like `https://example.com/download/latest` allows web installer to be version independent (installer will download latest application package).\nPlease note â€” it is [full URL](https://github.com/electron-userland/electron-builder/issues/1810#issuecomment-317650878).\n\nCustom `X-Arch` http header is set to `32` or `64`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName} Web Setup ${version}.${ext}`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "createDesktopShortcut": {
                    "default": true,
                    "description": "Whether to create desktop shortcut. Set to `always` if to recreate also on reinstall (even if removed by user).",
                    "enum": [
                        "always",
                        false,
                        true
                    ]
                },
                "createStartMenuShortcut": {
                    "default": true,
                    "description": "Whether to create start menu shortcut.",
                    "type": "boolean"
                },
                "deleteAppDataOnUninstall": {
                    "default": false,
                    "description": "*one-click installer only.* Whether to delete app data on uninstall.",
                    "type": "boolean"
                },
                "differentialPackage": {
                    "description": "Defaults to `true` for web installer (`nsis-web`)",
                    "type": "boolean"
                },
                "displayLanguageSelector": {
                    "default": false,
                    "description": "Whether to display a language selection dialog. Not recommended (by default will be detected using OS language).",
                    "type": "boolean"
                },
                "guid": {
                    "description": "See [GUID vs Application Name](../configuration/nsis#guid-vs-application-name).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "include": {
                    "description": "The path to NSIS include script to customize installer. Defaults to `build/installer.nsh`. See [Custom NSIS script](#custom-nsis-script).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerHeader": {
                    "default": "build/installerHeader.bmp",
                    "description": "*assisted installer only.* `MUI_HEADERIMAGE`, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerHeaderIcon": {
                    "description": "*one-click installer only.* The path to header icon (above the progress bar), relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/installerHeaderIcon.ico` or application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerIcon": {
                    "description": "The path to installer icon, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/installerIcon.ico` or application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerLanguages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "The installer languages (e.g. `en_US`, `de_DE`). Change only if you understand what do you do and for what."
                },
                "installerSidebar": {
                    "description": "*assisted installer only.* `MUI_WELCOMEFINISHPAGE_BITMAP`, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/installerSidebar.bmp` or `${NSISDIR}\\\\Contrib\\\\Graphics\\\\Wizard\\\\nsis3-metro.bmp`. Image size 164 Ã— 314 pixels.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "language": {
                    "description": "[LCID Dec](https://msdn.microsoft.com/en-au/goglobal/bb964664.aspx), defaults to `1033`(`English - United States`).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "license": {
                    "description": "The path to EULA license file. Defaults to `license.txt` or `eula.txt` (or uppercase variants). In addition to `txt, `rtf` and `html` supported (don't forget to use `target=\"_blank\"` for links).\n\nMultiple license files in different languages are supported â€” use lang postfix (e.g. `_de`, `_ru`)). For example, create files `license_de.txt` and `license_en.txt` in the build resources.\nIf OS language is german, `license_de.txt` will be displayed. See map of [language code to name](https://github.com/meikidd/iso-639-1/blob/master/src/data.js).\n\nAppropriate license file will be selected by user OS language.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "menuCategory": {
                    "default": false,
                    "description": "Whether to create submenu for start menu shortcut and program files directory. If `true`, company name will be used. Or string value.",
                    "type": [
                        "string",
                        "boolean"
                    ]
                },
                "multiLanguageInstaller": {
                    "description": "Whether to create multi-language installer. Defaults to `unicode` option value.",
                    "type": "boolean"
                },
                "oneClick": {
                    "default": true,
                    "description": "Whether to create one-click installer or assisted.",
                    "type": "boolean"
                },
                "packElevateHelper": {
                    "default": true,
                    "description": "Whether to pack the elevate executable (required for electron-updater if per-machine installer used or can be used in the future). Ignored if `perMachine` is set to `true`.",
                    "type": "boolean"
                },
                "perMachine": {
                    "default": false,
                    "description": "Whether to show install mode installer page (choice per-machine or per-user) for assisted installer. Or whether installation always per all users (per-machine).\n\nIf `oneClick` is `true` (default): Whether to install per all users (per-machine).\n\nIf `oneClick` is `false` and `perMachine` is `true`: no install mode installer page, always install per-machine.\n\nIf `oneClick` is `false` and `perMachine` is `false` (default): install mode installer page.",
                    "type": "boolean"
                },
                "preCompressedFileExtensions": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "default": [
                        ".avi",
                        ".mov",
                        ".m4v",
                        ".mp4",
                        ".m4p",
                        ".qt",
                        ".mkv",
                        ".webm",
                        ".vmdk"
                    ],
                    "description": "The file extension of files that will be not compressed. Applicable only for `extraResources` and `extraFiles` files."
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "runAfterFinish": {
                    "default": true,
                    "description": "Whether to run the installed application after finish. For assisted installer corresponding checkbox will be removed.",
                    "type": "boolean"
                },
                "script": {
                    "description": "The path to NSIS script to customize installer. Defaults to `build/installer.nsi`. See [Custom NSIS script](#custom-nsis-script).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "shortcutName": {
                    "description": "The name that will be used for all shortcuts. Defaults to the application name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "unicode": {
                    "default": true,
                    "description": "Whether to create [Unicode installer](http://nsis.sourceforge.net/Docs/Chapter1.html#intro-unicode).",
                    "type": "boolean"
                },
                "uninstallDisplayName": {
                    "default": "${productName} ${version}",
                    "description": "The uninstaller display name in the control panel.",
                    "type": "string"
                },
                "uninstallerIcon": {
                    "description": "The path to uninstaller icon, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/uninstallerIcon.ico` or application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "uninstallerSidebar": {
                    "description": "*assisted installer only.* `MUI_UNWELCOMEFINISHPAGE_BITMAP`, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `installerSidebar` option or `build/uninstallerSidebar.bmp` or `build/installerSidebar.bmp` or `${NSISDIR}\\\\Contrib\\\\Graphics\\\\Wizard\\\\nsis3-metro.bmp`",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "useZip": {
                    "default": false,
                    "type": "boolean"
                },
                "warningsAsErrors": {
                    "default": true,
                    "description": "If `warningsAsErrors` is `true` (default): NSIS will treat warnings as errors. If `warningsAsErrors` is `false`: NSIS will allow warnings.",
                    "type": "boolean"
                }
            },
            "title": "NsisWebOptions",
            "type": "object"
        },
        "PkgBackgroundOptions": {
            "additionalProperties": false,
            "description": "Options for the background image in a PKG installer",
            "properties": {
                "alignment": {
                    "anyOf": [
                        {
                            "enum": [
                                "bottom",
                                "bottomleft",
                                "bottomright",
                                "center",
                                "left",
                                "right",
                                "top",
                                "topleft",
                                "topright"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "center",
                    "description": "Alignment of the background image.\nOptions are: center, left, right, top, bottom, topleft, topright, bottomleft, bottomright"
                },
                "file": {
                    "description": "Path to the image to use as an installer background.",
                    "type": "string"
                },
                "scaling": {
                    "anyOf": [
                        {
                            "enum": [
                                "none",
                                "proportional",
                                "tofit"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "tofit",
                    "description": "Scaling of the background image.\nOptions are: tofit, none, proportional"
                }
            },
            "title": "PkgBackgroundOptions",
            "type": "object"
        },
        "PkgOptions": {
            "additionalProperties": false,
            "description": "macOS product archive options.",
            "properties": {
                "allowAnywhere": {
                    "default": true,
                    "description": "Whether can be installed at the root of any volume, including non-system volumes. Otherwise, it cannot be installed at the root of a volume.\n\nCorresponds to [enable_anywhere](https://developer.apple.com/library/content/documentation/DeveloperTools/Reference/DistributionDefinitionRef/Chapters/Distribution_XML_Ref.html#//apple_ref/doc/uid/TP40005370-CH100-SW70).",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "allowCurrentUserHome": {
                    "default": true,
                    "description": "Whether can be installed into the current userâ€™s home directory.\nA home directory installation is done as the current user (not as root), and it cannot write outside of the home directory.\nIf the product cannot be installed in the userâ€™s home directory and be not completely functional from userâ€™s home directory.\n\nCorresponds to [enable_currentUserHome](https://developer.apple.com/library/content/documentation/DeveloperTools/Reference/DistributionDefinitionRef/Chapters/Distribution_XML_Ref.html#//apple_ref/doc/uid/TP40005370-CH100-SW70).",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "allowRootDirectory": {
                    "default": true,
                    "description": "Whether can be installed into the root directory. Should usually be `true` unless the product can be installed only to the userâ€™s home directory.\n\nCorresponds to [enable_localSystem](https://developer.apple.com/library/content/documentation/DeveloperTools/Reference/DistributionDefinitionRef/Chapters/Distribution_XML_Ref.html#//apple_ref/doc/uid/TP40005370-CH100-SW70).",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "background": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/PkgBackgroundOptions"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Options for the background image for the installer."
                },
                "conclusion": {
                    "description": "The path to the conclusion file. This may be used to customize the text on the final \"Summary\" page of the installer.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "hasStrictIdentifier": {
                    "default": true,
                    "description": "Require identical bundle identifiers at install path?",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "identity": {
                    "description": "The name of certificate to use when signing. Consider using environment variables [CSC_LINK or CSC_NAME](/code-signing) instead of specifying this option.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installLocation": {
                    "default": "/Applications",
                    "description": "The install location. [Do not use it](https://stackoverflow.com/questions/12863944/how-do-you-specify-a-default-install-location-to-home-with-pkgbuild) to create per-user package.\nMostly never you will need to change this option. `/Applications` would install it as expected into `/Applications` if the local system domain is chosen, or into `$HOME/Applications` if the home installation is chosen.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "isRelocatable": {
                    "default": true,
                    "description": "Install bundle over previous version if moved by user?",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "isVersionChecked": {
                    "default": true,
                    "description": "Don't install bundle if newer version on disk?",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "license": {
                    "description": "The path to EULA license file. Defaults to `license.txt` or `eula.txt` (or uppercase variants). In addition to `txt, `rtf` and `html` supported (don't forget to use `target=\"_blank\"` for links).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "overwriteAction": {
                    "anyOf": [
                        {
                            "enum": [
                                "update",
                                "upgrade"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "upgrade",
                    "description": "Specifies how an existing version of the bundle on disk should be handled when the version in\nthe package is installed.\n\nIf you specify upgrade, the bundle in the package atomi-cally replaces any version on disk;\nthis has the effect of deleting old paths that no longer exist in the new version of\nthe bundle.\n\nIf you specify update, the bundle in the package overwrites the version on disk, and any files\nnot contained in the package will be left intact; this is appropriate when you are delivering\nan update-only package.\n\nAnother effect of update is that the package bundle will not be installed at all if there is\nnot already a version on disk; this allows a package to deliver an update for an app that\nthe user might have deleted."
                },
                "productbuild": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "should be not documented, only to experiment"
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "scripts": {
                    "default": "build/pkg-scripts",
                    "description": "The scripts directory, relative to `build` (build resources directory).\nThe scripts can be in any language so long as the files are marked executable and have the appropriate shebang indicating the path to the interpreter.\nScripts are required to be executable (`chmod +x file`).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "welcome": {
                    "description": "The path to the welcome file. This may be used to customize the text on the Introduction page of the installer.",
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "title": "PkgOptions",
            "type": "object"
        },
        "PlugDescriptor": {
            "additionalProperties": {
                "anyOf": [
                    {
                        "additionalProperties": {
                        },
                        "type": "object"
                    },
                    {
                        "type": "null"
                    }
                ]
            },
            "title": "PlugDescriptor",
            "type": "object"
        },
        "PortableOptions": {
            "additionalProperties": false,
            "description": "Portable options.",
            "properties": {
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "guid": {
                    "description": "See [GUID vs Application Name](../configuration/nsis#guid-vs-application-name).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "requestExecutionLevel": {
                    "default": "user",
                    "description": "The [requested execution level](http://nsis.sourceforge.net/Reference/RequestExecutionLevel) for Windows.",
                    "enum": [
                        "admin",
                        "highest",
                        "user"
                    ],
                    "type": "string"
                },
                "unicode": {
                    "default": true,
                    "description": "Whether to create [Unicode installer](http://nsis.sourceforge.net/Docs/Chapter1.html#intro-unicode).",
                    "type": "boolean"
                },
                "useZip": {
                    "default": false,
                    "type": "boolean"
                },
                "warningsAsErrors": {
                    "default": true,
                    "description": "If `warningsAsErrors` is `true` (default): NSIS will treat warnings as errors. If `warningsAsErrors` is `false`: NSIS will allow warnings.",
                    "type": "boolean"
                },
                "unpackDirName": {
                    "description": "The unpack directory name in [TEMP](https://www.askvg.com/where-does-windows-store-temporary-files-and-how-to-change-temp-folder-location/) directory.\n\nDefaults to [uuid](https://github.com/segmentio/ksuid) of build (changed on each build of portable executable).",
                    "type": "string"
                }
            },
            "title": "PortableOptions",
            "type": "object"
        },
        "Protocol": {
            "additionalProperties": false,
            "description": "URL Protocol Schemes. Protocols to associate the app with. macOS only.\n\nPlease note â€” on macOS [you need to register an `open-url` event handler](http://electron.atom.io/docs/api/app/#event-open-url-macos).",
            "properties": {
                "name": {
                    "description": "The name. e.g. `IRC server URL`.",
                    "type": "string"
                },
                "role": {
                    "default": "Editor",
                    "description": "*macOS-only* The appâ€™s role with respect to the type.",
                    "enum": [
                        "Editor",
                        "None",
                        "Shell",
                        "Viewer"
                    ],
                    "type": "string"
                },
                "schemes": {
                    "description": "The schemes. e.g. `[\"irc\", \"ircs\"]`.",
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                }
            },
            "required": [
                "name",
                "schemes"
            ],
            "title": "Protocol",
            "type": "object"
        },
        "PublishProvider": {
            "enum": [
                "bintray",
                "custom",
                "generic",
                "github",
                "s3",
                "spaces"
            ],
            "title": "PublishProvider",
            "type": "string"
        },
        "ReleaseInfo": {
            "additionalProperties": false,
            "properties": {
                "releaseDate": {
                    "description": "The release date.",
                    "type": "string"
                },
                "releaseName": {
                    "description": "The release name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "releaseNotes": {
                    "description": "The release notes.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "releaseNotesFile": {
                    "description": "The path to release notes file. Defaults to `release-notes-${platform}.md` (where `platform` it is current platform â€” `mac`, `linux` or `windows`) or `release-notes.md` in the [build resources](#MetadataDirectories-buildResources).",
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "title": "ReleaseInfo",
            "type": "object"
        },
        "S3Options": {
            "additionalProperties": false,
            "properties": {
                "acl": {
                    "anyOf": [
                        {
                            "enum": [
                                "private",
                                "public-read"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "public-read",
                    "description": "The ACL. Set to `null` to not [add](https://github.com/electron-userland/electron-builder/issues/1822).\n\nPlease see [required permissions for the S3 provider](https://github.com/electron-userland/electron-builder/issues/1618#issuecomment-314679128)."
                },
                "bucket": {
                    "description": "The bucket name.",
                    "type": "string"
                },
                "channel": {
                    "default": "latest",
                    "description": "The update channel.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "encryption": {
                    "anyOf": [
                        {
                            "enum": [
                                "AES256",
                                "aws:kms"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Server-side encryption algorithm to use for the object."
                },
                "endpoint": {
                    "description": "The endpoint URI to send requests to. The default endpoint is built from the configured region.\nThe endpoint should be a string like `https://{service}.{region}.amazonaws.com`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "path": {
                    "default": "/",
                    "description": "The directory path.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "provider": {
                    "description": "The provider. Must be `s3`.",
                    "enum": [
                        "s3"
                    ],
                    "type": "string"
                },
                "publishAutoUpdate": {
                    "default": true,
                    "description": "Whether to publish auto update info files.\n\nAuto update relies only on the first provider in the list (you can specify several publishers).\nThus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.",
                    "type": "boolean"
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "region": {
                    "description": "The region. Is determined and set automatically when publishing.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "storageClass": {
                    "anyOf": [
                        {
                            "enum": [
                                "REDUCED_REDUNDANCY",
                                "STANDARD",
                                "STANDARD_IA"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "STANDARD",
                    "description": "The type of storage to use for the object."
                },
                "updaterCacheDirName": {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "required": [
                "bucket",
                "provider"
            ],
            "title": "S3Options",
            "type": "object"
        },
        "SnapOptions": {
            "additionalProperties": false,
            "properties": {
                "after": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Specifies any [parts](https://snapcraft.io/docs/reference/parts) that should be built before this part.\nDefaults to `[\"desktop-gtk2\"\"]`.\n\nIf list contains `default`, it will be replaced to default list, so, `[\"default\", \"foo\"]` can be used to add custom parts `foo` in addition to defaults."
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "assumes": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "The list of features that must be supported by the core in order for this snap to install."
                },
                "buildPackages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The list of debian packages needs to be installed for building this snap."
                },
                "category": {
                    "description": "The [application category](https://specifications.freedesktop.org/menu-spec/latest/apa.html#main-category-registry).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "confinement": {
                    "anyOf": [
                        {
                            "enum": [
                                "classic",
                                "devmode",
                                "strict"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "strict",
                    "description": "The type of [confinement](https://snapcraft.io/docs/reference/confinement) supported by the snap."
                },
                "description": {
                    "description": "As [description](/configuration/configuration#Metadata-description) from application package.json, but allows you to specify different for Linux.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "desktop": {
                    "description": "The [Desktop file](https://developer.gnome.org/integration-guide/stable/desktop-files.html.en) entries (name to value)."
                },
                "environment": {
                    "anyOf": [
                        {
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The custom environment. Defaults to `{\"TMPDIR: \"$XDG_RUNTIME_DIR\"}`. If you set custom, it will be merged with default."
                },
                "grade": {
                    "anyOf": [
                        {
                            "enum": [
                                "devel",
                                "stable"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "stable",
                    "description": "The quality grade of the snap. It can be either `devel` (i.e. a development version of the snap, so not to be published to the â€œstableâ€� or â€œcandidateâ€� channels) or â€œstableâ€� (i.e. a stable release or release candidate, which can be released to all channels)."
                },
                "hooks": {
                    "default": "build/snap-hooks",
                    "description": "The [hooks](https://docs.snapcraft.io/build-snaps/hooks) directory, relative to `build` (build resources directory).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "mimeTypes": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The mime types in addition to specified in the file associations. Use it if you don't want to register a new mime type, but reuse existing."
                },
                "plugs": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/PlugDescriptor"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/PlugDescriptor"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The list of [plugs](https://snapcraft.io/docs/reference/interfaces).\nDefaults to `[\"desktop\", \"desktop-legacy\", \"home\", \"x11\", \"unity7\", \"browser-support\", \"network\", \"gsettings\", \"pulseaudio\", \"opengl\"]`.\n\nIf list contains `default`, it will be replaced to default list, so, `[\"default\", \"foo\"]` can be used to add custom plug `foo` in addition to defaults.\n\nAdditional attributes can be specified using object instead of just name of plug:\n```\n[\n  {\n    \"browser-sandbox\": {\n      \"interface\": \"browser-support\",\n      \"allow-sandbox\": true\n    },\n  },\n  \"another-simple-plug-name\"\n]\n```"
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "stagePackages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The list of Ubuntu packages to use that are needed to support the `app` part creation. Like `depends` for `deb`.\nDefaults to `[\"libasound2\", \"libgconf2-4\", \"libnotify4\", \"libnspr4\", \"libnss3\", \"libpcre3\", \"libpulse0\", \"libxss1\", \"libxtst6\"]`.\n\nIf list contains `default`, it will be replaced to default list, so, `[\"default\", \"foo\"]` can be used to add custom package `foo` in addition to defaults."
                },
                "summary": {
                    "description": "The 78 character long summary. Defaults to [productName](/configuration/configuration#Configuration-productName).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "synopsis": {
                    "description": "The [short description](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "useTemplateApp": {
                    "description": "Whether to use template snap. Defaults to `true` if `stagePackages` not specified.",
                    "type": "boolean"
                }
            },
            "title": "SnapOptions",
            "type": "object"
        },
        "SpacesOptions": {
            "additionalProperties": false,
            "description": "[DigitalOcean Spaces](https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-spaces) options.\nAccess key is required, define `DO_KEY_ID` and `DO_SECRET_KEY` environment variables.",
            "properties": {
                "acl": {
                    "anyOf": [
                        {
                            "enum": [
                                "private",
                                "public-read"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "public-read",
                    "description": "The ACL. Set to `null` to not [add](https://github.com/electron-userland/electron-builder/issues/1822)."
                },
                "channel": {
                    "default": "latest",
                    "description": "The update channel.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "name": {
                    "description": "The space name.",
                    "type": "string"
                },
                "path": {
                    "default": "/",
                    "description": "The directory path.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "provider": {
                    "description": "The provider. Must be `spaces`.",
                    "enum": [
                        "spaces"
                    ],
                    "type": "string"
                },
                "publishAutoUpdate": {
                    "default": true,
                    "description": "Whether to publish auto update info files.\n\nAuto update relies only on the first provider in the list (you can specify several publishers).\nThus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.",
                    "type": "boolean"
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "region": {
                    "description": "The region (e.g. `nyc3`).",
                    "type": "string"
                },
                "updaterCacheDirName": {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "required": [
                "name",
                "provider",
                "region"
            ],
            "title": "SpacesOptions",
            "type": "object"
        },
        "SquirrelWindowsOptions": {
            "additionalProperties": false,
            "properties": {
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "iconUrl": {
                    "description": "A URL to an ICO file to use as the application icon (displayed in Control Panel > Programs and Features). Defaults to the Electron icon.\n\nPlease note â€” [local icon file url is not accepted](https://github.com/atom/grunt-electron-installer/issues/73), must be https/http.\n\nIf you don't plan to build windows installer, you can omit it.\nIf your project repository is public on GitHub, it will be `https://github.com/${u}/${p}/blob/master/build/icon.ico?raw=true` by default.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "loadingGif": {
                    "description": "The path to a .gif file to display during install. `build/install-spinner.gif` will be used if exists (it is a recommended way to set)\n(otherwise [default](https://github.com/electron/windows-installer/blob/master/resources/install-spinner.gif)).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "msi": {
                    "description": "Whether to create an MSI installer. Defaults to `false` (MSI is not created).",
                    "type": "boolean"
                },
                "name": {
                    "description": "https://github.com/electron-userland/electron-builder/issues/1743",
                    "type": "string"
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "remoteReleases": {
                    "description": "A URL to your existing updates. Or `true` to automatically set to your GitHub repository. If given, these will be downloaded to create delta updates.",
                    "type": [
                        "null",
                        "string",
                        "boolean"
                    ]
                },
                "remoteToken": {
                    "description": "Authentication token for remote updates",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "useAppIdAsId": {
                    "description": "Use `appId` to identify package instead of `name`.",
                    "type": "boolean"
                }
            },
            "title": "SquirrelWindowsOptions",
            "type": "object"
        },
        "TargetConfiguration": {
            "additionalProperties": false,
            "properties": {
                "arch": {
                    "anyOf": [
                        {
                            "items": {
                                "enum": [
                                    "arm64",
                                    "armv7l",
                                    "ia32",
                                    "x64"
                                ],
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "enum": [
                                "arm64",
                                "armv7l",
                                "ia32",
                                "x64"
                            ],
                            "type": "string"
                        }
                    ],
                    "description": "The arch or list of archs."
                },
                "target": {
                    "description": "The target name. e.g. `snap`.",
                    "type": "string"
                }
            },
            "required": [
                "target"
            ],
            "title": "TargetConfiguration",
            "type": "object"
        },
        "WindowsConfiguration": {
            "additionalProperties": false,
            "properties": {
                "additionalCertificateFile": {
                    "description": "The path to an additional certificate file you want to add to the signature block.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "appId": {
                    "default": "com.electron.${name}",
                    "description": "The application id. Used as [CFBundleIdentifier](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070) for MacOS and as\n[Application User Model ID](https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx) for Windows (NSIS target only, Squirrel.Windows not supported). It is strongly recommended that an explicit ID is set.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName}-${version}.${ext}` (some target can have other defaults, see corresponding options).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "asar": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/AsarOptions"
                        },
                        {
                            "type": [
                                "null",
                                "boolean"
                            ]
                        }
                    ],
                    "default": true,
                    "description": "Whether to package the application's source code into an archive, using [Electron's archive format](http://electron.atom.io/docs/tutorial/application-packaging/).\n\nNode modules, that must be unpacked, will be detected automatically, you don't need to explicitly set [asarUnpack](#configuration-asarUnpack) - please file an issue if this doesn't work."
                },
                "asarUnpack": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "A [glob patterns](/file-patterns) relative to the [app directory](#MetadataDirectories-app), which specifies which files to unpack when creating the [asar](http://electron.atom.io/docs/tutorial/application-packaging/) archive."
                },
                "certificateFile": {
                    "description": "The path to the *.pfx certificate you want to sign with. Please use it only if you cannot use env variable `CSC_LINK` (`WIN_CSC_LINK`) for some reason.\nPlease see [Code Signing](/code-signing).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "certificatePassword": {
                    "description": "The password to the certificate provided in `certificateFile`. Please use it only if you cannot use env variable `CSC_KEY_PASSWORD` (`WIN_CSC_KEY_PASSWORD`) for some reason.\nPlease see [Code Signing](/code-signing).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "certificateSha1": {
                    "description": "The SHA1 hash of the signing certificate. The SHA1 hash is commonly specified when multiple certificates satisfy the criteria specified by the remaining switches. Works only on Windows (or on macOS if [Parallels Desktop](https://www.parallels.com/products/desktop/) Windows 10 virtual machines exits).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "certificateSubjectName": {
                    "description": "The name of the subject of the signing certificate. Required only for EV Code Signing and works only on Windows (or on macOS if [Parallels Desktop](https://www.parallels.com/products/desktop/) Windows 10 virtual machines exits).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "compression": {
                    "anyOf": [
                        {
                            "enum": [
                                "maximum",
                                "normal",
                                "store"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "normal",
                    "description": "The compression level. If you want to rapidly test build, `store` can reduce build time significantly. `maximum` doesn't lead to noticeable size difference, but increase build time."
                },
                "cscKeyPassword": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscLink": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "detectUpdateChannel": {
                    "default": true,
                    "description": "Whether to infer update channel from application version pre-release components. e.g. if version `0.12.1-alpha.1`, channel will be set to `alpha`. Otherwise to `latest`.",
                    "type": "boolean"
                },
                "electronUpdaterCompatibility": {
                    "description": "The [electron-updater compatibility](/auto-update#compatibility) semver range.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "extraFiles": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "extraResources": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "fileAssociations": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileAssociation"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/FileAssociation"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The file associations."
                },
                "files": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "forceCodeSigning": {
                    "description": "Whether to fail if app will be not code signed.",
                    "type": "boolean"
                },
                "generateUpdatesFilesForAllChannels": {
                    "default": false,
                    "description": "Please see [Building and Releasing using Channels](https://github.com/electron-userland/electron-builder/issues/1182#issuecomment-324947139).",
                    "type": "boolean"
                },
                "icon": {
                    "default": "build/icon.ico",
                    "description": "The path to application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "legalTrademarks": {
                    "description": "The trademarks and registered trademarks.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "protocols": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/Protocol"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/Protocol"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The URL protocol schemes."
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "[The publisher name](https://github.com/electron-userland/electron-builder/issues/1187#issuecomment-278972073), exactly as in your code signed certificate. Several names can be provided.\nDefaults to common name from your code signing certificate."
                },
                "releaseInfo": {
                    "$ref": "#/definitions/ReleaseInfo",
                    "description": "The release info. Intended for command line usage:\n\n```\n-c.releaseInfo.releaseNotes=\"new features\"\n```"
                },
                "requestedExecutionLevel": {
                    "anyOf": [
                        {
                            "enum": [
                                "asInvoker",
                                "highestAvailable",
                                "requireAdministrator"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "asInvoker",
                    "description": "The [security level](https://msdn.microsoft.com/en-us/library/6ad1fshk.aspx#Anchor_9) at which the application requests to be executed.\nCannot be specified per target, allowed only in the `win`."
                },
                "rfc3161TimeStampServer": {
                    "default": "http://timestamp.comodoca.com/rfc3161",
                    "description": "The URL of the RFC 3161 time stamp server.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "sign": {
                    "anyOf": [
                        {
                            "typeof": "function"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "The custom function (or path to file or module id) to sign Windows executable."
                },
                "signAndEditExecutable": {
                    "default": true,
                    "description": "Whether to sign and add metadata to executable. Advanced option.",
                    "type": "boolean"
                },
                "signDlls": {
                    "default": false,
                    "description": "Whether to sign DLL files. Advanced option.",
                    "type": "boolean"
                },
                "signingHashAlgorithms": {
                    "anyOf": [
                        {
                            "items": {
                                "enum": [
                                    "sha1",
                                    "sha256"
                                ],
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "['sha1', 'sha256']",
                    "description": "Array of signing algorithms used. For AppX `sha256` is always used."
                },
                "target": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/TargetConfiguration"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/TargetConfiguration"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "default": "nsis",
                    "description": "The target package type: list of `nsis`, `nsis-web` (Web installer), `portable` ([portable](/configuration/nsis#portable) app without installation), `appx`, `msi`, `squirrel`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`.\nAppX package can be built only on Windows 10.\n\nTo use Squirrel.Windows please install `electron-builder-squirrel-windows` dependency."
                },
                "timeStampServer": {
                    "default": "http://timestamp.digicert.com",
                    "description": "The URL of the time stamp server.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "verifyUpdateCodeSignature": {
                    "default": true,
                    "description": "Whether to verify the signature of an available update before installation.\nThe [publisher name](#publisherName) will be used for the signature verification.",
                    "type": "boolean"
                }
            },
            "title": "WindowsConfiguration",
            "type": "object"
        }
    },
    "description": "Configuration Options",
    "properties": {
        "$schema": {
            "description": "JSON Schema for this document.",
            "type": [
                "null",
                "string"
            ]
        },
        "afterAllArtifactBuild": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be [run after all artifacts are build](#afterAllArtifactBuild)."
        },
        "afterPack": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be [run after pack](#afterpack) (but before pack into distributable format and sign)."
        },
        "afterSign": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be [run after pack and sign](#aftersign) (but before pack into distributable format)."
        },
        "apk": {
            "anyOf": [
                {
                    "$ref": "#/definitions/LinuxTargetSpecificOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "appId": {
            "default": "com.electron.${name}",
            "description": "The application id. Used as [CFBundleIdentifier](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070) for MacOS and as\n[Application User Model ID](https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx) for Windows (NSIS target only, Squirrel.Windows not supported). It is strongly recommended that an explicit ID is set.",
            "type": [
                "null",
                "string"
            ]
        },
        "appImage": {
            "anyOf": [
                {
                    "$ref": "#/definitions/AppImageOptions"
                },
                {
                    "type": "null"
                }
            ],
            "description": "AppImage options."
        },
        "appx": {
            "anyOf": [
                {
                    "$ref": "#/definitions/AppXOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "artifactBuildCompleted": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be run on artifact build completed."
        },
        "artifactBuildStarted": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be run on artifact build start."
        },
        "artifactName": {
            "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName}-${version}.${ext}` (some target can have other defaults, see corresponding options).",
            "type": [
                "null",
                "string"
            ]
        },
        "asar": {
            "anyOf": [
                {
                    "$ref": "#/definitions/AsarOptions"
                },
                {
                    "type": [
                        "null",
                        "boolean"
                    ]
                }
            ],
            "default": true,
            "description": "Whether to package the application's source code into an archive, using [Electron's archive format](http://electron.atom.io/docs/tutorial/application-packaging/).\n\nNode modules, that must be unpacked, will be detected automatically, you don't need to explicitly set [asarUnpack](#configuration-asarUnpack) - please file an issue if this doesn't work."
        },
        "asarUnpack": {
            "anyOf": [
                {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "A [glob patterns](/file-patterns) relative to the [app directory](#MetadataDirectories-app), which specifies which files to unpack when creating the [asar](http://electron.atom.io/docs/tutorial/application-packaging/) archive."
        },
        "beforeBuild": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be run before dependencies are installed or rebuilt. Works when `npmRebuild` is set to `true`. Resolving to `false` will skip dependencies install or rebuild.\n\nIf provided and `node_modules` are missing, it will not invoke production dependencies check."
        },
        "buildDependenciesFromSource": {
            "default": false,
            "description": "Whether to build the application native dependencies from source.",
            "type": "boolean"
        },
        "buildVersion": {
            "description": "The build version. Maps to the `CFBundleVersion` on macOS, and `FileVersion` metadata property on Windows. Defaults to the `version`.\nIf `TRAVIS_BUILD_NUMBER` or `APPVEYOR_BUILD_NUMBER` or `CIRCLE_BUILD_NUM` or `BUILD_NUMBER` or `bamboo.buildNumber` env defined, it will be used as a build version (`version.build_number`).",
            "type": [
                "null",
                "string"
            ]
        },
        "compression": {
            "anyOf": [
                {
                    "enum": [
                        "maximum",
                        "normal",
                        "store"
                    ],
                    "type": "string"
                },
                {
                    "type": "null"
                }
            ],
            "default": "normal",
            "description": "The compression level. If you want to rapidly test build, `store` can reduce build time significantly. `maximum` doesn't lead to noticeable size difference, but increase build time."
        },
        "copyright": {
            "default": "Copyright Â© year ${author}",
            "description": "The human-readable copyright line for the app.",
            "type": [
                "null",
                "string"
            ]
        },
        "cscKeyPassword": {
            "type": [
                "null",
                "string"
            ]
        },
        "cscLink": {
            "type": [
                "null",
                "string"
            ]
        },
        "deb": {
            "anyOf": [
                {
                    "$ref": "#/definitions/DebOptions"
                },
                {
                    "type": "null"
                }
            ],
            "description": "Debian package options."
        },
        "detectUpdateChannel": {
            "default": true,
            "description": "Whether to infer update channel from application version pre-release components. e.g. if version `0.12.1-alpha.1`, channel will be set to `alpha`. Otherwise to `latest`.",
            "type": "boolean"
        },
        "directories": {
            "anyOf": [
                {
                    "$ref": "#/definitions/MetadataDirectories"
                },
                {
                    "type": "null"
                }
            ]
        },
        "dmg": {
            "anyOf": [
                {
                    "$ref": "#/definitions/DmgOptions"
                },
                {
                    "type": "null"
                }
            ],
            "description": "macOS DMG options."
        },
        "electronCompile": {
            "description": "Whether to use [electron-compile](http://github.com/electron/electron-compile) to compile app. Defaults to `true` if `electron-compile` in the dependencies. And `false` if in the `devDependencies` or doesn't specified.",
            "type": "boolean"
        },
        "electronDist": {
            "description": "The path to custom Electron build (e.g. `~/electron/out/R`).",
            "type": "string"
        },
        "electronDownload": {
            "$ref": "#/definitions/ElectronDownloadOptions",
            "description": "The [electron-download](https://github.com/electron-userland/electron-download#usage) options."
        },
        "electronUpdaterCompatibility": {
            "description": "The [electron-updater compatibility](/auto-update#compatibility) semver range.",
            "type": [
                "null",
                "string"
            ]
        },
        "electronVersion": {
            "description": "The version of electron you are packaging for. Defaults to version of `electron`, `electron-prebuilt` or `electron-prebuilt-compile` dependency.",
            "type": [
                "null",
                "string"
            ]
        },
        "extends": {
            "description": "The name of a built-in configuration preset or path to config file (relative to project dir). Currently, only `react-cra` is supported.\n\nIf `react-scripts` in the app dependencies, `react-cra` will be set automatically. Set to `null` to disable automatic detection.",
            "type": [
                "null",
                "string"
            ]
        },
        "extraFiles": {
            "anyOf": [
                {
                    "$ref": "#/definitions/FileSet"
                },
                {
                    "items": {
                        "anyOf": [
                            {
                                "$ref": "#/definitions/FileSet"
                            },
                            {
                                "type": "string"
                            }
                        ]
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ]
        },
        "extraMetadata": {
            "description": "Inject properties to `package.json`."
        },
        "extraResources": {
            "anyOf": [
                {
                    "$ref": "#/definitions/FileSet"
                },
                {
                    "items": {
                        "anyOf": [
                            {
                                "$ref": "#/definitions/FileSet"
                            },
                            {
                                "type": "string"
                            }
                        ]
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ]
        },
        "fileAssociations": {
            "anyOf": [
                {
                    "$ref": "#/definitions/FileAssociation"
                },
                {
                    "items": {
                        "$ref": "#/definitions/FileAssociation"
                    },
                    "type": "array"
                }
            ],
            "description": "The file associations."
        },
        "files": {
            "anyOf": [
                {
                    "$ref": "#/definitions/FileSet"
                },
                {
                    "items": {
                        "anyOf": [
                            {
                                "$ref": "#/definitions/FileSet"
                            },
                            {
                                "type": "string"
                            }
                        ]
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ]
        },
        "forceCodeSigning": {
            "description": "Whether to fail if app will be not code signed.",
            "type": "boolean"
        },
        "framework": {
            "description": "The framework name. One of `electron`, `proton-native`, `libui`. Defaults to `electron`.",
            "type": [
                "null",
                "string"
            ]
        },
        "freebsd": {
            "anyOf": [
                {
                    "$ref": "#/definitions/LinuxTargetSpecificOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "generateUpdatesFilesForAllChannels": {
            "default": false,
            "description": "Please see [Building and Releasing using Channels](https://github.com/electron-userland/electron-builder/issues/1182#issuecomment-324947139).",
            "type": "boolean"
        },
        "icon": {
            "type": [
                "null",
                "string"
            ]
        },
        "includePdb": {
            "default": false,
            "description": "Whether to include PDB files.",
            "type": "boolean"
        },
        "launchUiVersion": {
            "description": "*libui-based frameworks only* The version of LaunchUI you are packaging for. Applicable for Windows only. Defaults to version suitable for used framework version.",
            "type": [
                "null",
                "string",
                "boolean"
            ]
        },
        "linux": {
            "anyOf": [
                {
                    "$ref": "#/definitions/LinuxConfiguration"
                },
                {
                    "type": "null"
                }
            ],
            "description": "Options related to how build Linux targets."
        },
        "mac": {
            "anyOf": [
                {
                    "$ref": "#/definitions/MacConfiguration"
                },
                {
                    "type": "null"
                }
            ],
            "description": "Options related to how build macOS targets."
        },
        "mas": {
            "anyOf": [
                {
                    "$ref": "#/definitions/MasConfiguration"
                },
                {
                    "type": "null"
                }
            ],
            "description": "MAS (Mac Application Store) options."
        },
        "msi": {
            "anyOf": [
                {
                    "$ref": "#/definitions/MsiOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "muonVersion": {
            "description": "The version of muon you are packaging for.",
            "type": [
                "null",
                "string"
            ]
        },
        "nodeGypRebuild": {
            "default": false,
            "description": "Whether to execute `node-gyp rebuild` before starting to package the app.\n\nDon't [use](https://github.com/electron-userland/electron-builder/issues/683#issuecomment-241214075) [npm](http://electron.atom.io/docs/tutorial/using-native-node-modules/#using-npm) (neither `.npmrc`) for configuring electron headers. Use `electron-builder node-gyp-rebuild` instead.",
            "type": "boolean"
        },
        "nodeVersion": {
            "description": "*libui-based frameworks only* The version of NodeJS you are packaging for.\nYou can set it to `current` to set the Node.js version that you use to run.",
            "type": [
                "null",
                "string"
            ]
        },
        "npmArgs": {
            "anyOf": [
                {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "Additional command line arguments to use when installing app native deps."
        },
        "npmRebuild": {
            "default": true,
            "description": "Whether to [rebuild](https://docs.npmjs.com/cli/rebuild) native dependencies before starting to package the app.",
            "type": "boolean"
        },
        "npmSkipBuildFromSource": {
            "type": "boolean"
        },
        "nsis": {
            "anyOf": [
                {
                    "$ref": "#/definitions/NsisOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "nsisWeb": {
            "anyOf": [
                {
                    "$ref": "#/definitions/NsisWebOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "onNodeModuleFile": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be [run on each node module](#onnodemodulefile) file."
        },
        "p5p": {
            "anyOf": [
                {
                    "$ref": "#/definitions/LinuxTargetSpecificOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "pacman": {
            "anyOf": [
                {
                    "$ref": "#/definitions/LinuxTargetSpecificOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "pkg": {
            "anyOf": [
                {
                    "$ref": "#/definitions/PkgOptions"
                },
                {
                    "type": "null"
                }
            ],
            "description": "macOS PKG options."
        },
        "portable": {
            "anyOf": [
                {
                    "$ref": "#/definitions/PortableOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "productName": {
            "description": "As [name](#Metadata-name), but allows you to specify a product name for your executable which contains spaces and other special characters not allowed in the [name property](https://docs.npmjs.com/files/package.json#name).",
            "type": [
                "null",
                "string"
            ]
        },
        "protocols": {
            "anyOf": [
                {
                    "$ref": "#/definitions/Protocol"
                },
                {
                    "items": {
                        "$ref": "#/definitions/Protocol"
                    },
                    "type": "array"
                }
            ],
            "description": "The URL protocol schemes."
        },
        "protonNodeVersion": {
            "type": [
                "null",
                "string"
            ]
        },
        "publish": {
            "anyOf": [
                {
                    "$ref": "#/definitions/GithubOptions"
                },
                {
                    "$ref": "#/definitions/S3Options"
                },
                {
                    "$ref": "#/definitions/SpacesOptions"
                },
                {
                    "$ref": "#/definitions/GenericServerOptions"
                },
                {
                    "$ref": "#/definitions/BintrayOptions"
                },
                {
                    "$ref": "#/definitions/CustomPublishOptions"
                },
                {
                    "items": {
                        "anyOf": [
                            {
                                "$ref": "#/definitions/GithubOptions"
                            },
                            {
                                "$ref": "#/definitions/S3Options"
                            },
                            {
                                "$ref": "#/definitions/SpacesOptions"
                            },
                            {
                                "$ref": "#/definitions/GenericServerOptions"
                            },
                            {
                                "$ref": "#/definitions/BintrayOptions"
                            },
                            {
                                "$ref": "#/definitions/CustomPublishOptions"
                            },
                            {
                                "type": "string"
                            }
                        ]
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ]
        },
        "readonly": {
            "default": false,
            "description": "Whether to fail if the application is not signed (to prevent unsigned app if code signing configuration is not correct).",
            "type": "boolean"
        },
        "releaseInfo": {
            "$ref": "#/definitions/ReleaseInfo",
            "description": "The release info. Intended for command line usage:\n\n```\n-c.releaseInfo.releaseNotes=\"new features\"\n```"
        },
        "remoteBuild": {
            "default": true,
            "description": "Whether to build using Electron Build Service if target not supported on current OS.",
            "type": "boolean"
        },
        "removePackageScripts": {
            "default": true,
            "description": "Whether to remove `scripts` field from `package.json` files.",
            "type": "boolean"
        },
        "rpm": {
            "anyOf": [
                {
                    "$ref": "#/definitions/LinuxTargetSpecificOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "snap": {
            "anyOf": [
                {
                    "$ref": "#/definitions/SnapOptions"
                },
                {
                    "type": "null"
                }
            ],
            "description": "Snap options."
        },
        "squirrelWindows": {
            "anyOf": [
                {
                    "$ref": "#/definitions/SquirrelWindowsOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "target": {
            "anyOf": [
                {
                    "$ref": "#/definitions/TargetConfiguration"
                },
                {
                    "items": {
                        "anyOf": [
                            {
                                "$ref": "#/definitions/TargetConfiguration"
                            },
                            {
                                "type": "string"
                            }
                        ]
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ]
        },
        "win": {
            "anyOf": [
                {
                    "$ref": "#/definitions/WindowsConfiguration"
                },
                {
                    "type": "null"
                }
            ],
            "description": "Options related to how build Windows targets."
        }
    },
    "type": "object"
}
base: core18
grade: stable
confinement: strict
parts:
  launch-scripts:
    plugin: dump
    source: scripts
  gnome-platform-empty-dirs:
    plugin: nil
    override-build: >
      mkdir -p "$SNAPCRAFT_PART_INSTALL/data-dir/themes"
      mkdir -p "$SNAPCRAFT_PART_INSTALL/data-dir/icons"
      mkdir -p "$SNAPCRAFT_PART_INSTALL/data-dir/sounds"
      mkdir $SNAPCRAFT_PART_INSTALL/gnome-platform

  app-files:
    plugin: dump
    source: app
    organize:
      '*': app/
    stage:
      - -app/chrome-sandbox
      - -LICENSES.chromium.html
  app:
    plugin: "nil"
      # cd ~ && rm -rf ~/squashfs-root && unsquashfs /media/psf/ramdisk/electron-builder-test/dist/__snap-x64/se-wo-template_1.1.0_amd64.snap
      # comm -12 <(ls ~/squashfs-root/usr/lib/x86_64-linux-gnu/) <(ls /snap/gnome-3-28-1804/current/usr/lib/x86_64-linux-gnu/) > /media/psf/Home/f.txt
      # run snap-exclude-list.js
    stage:
      - '-usr/lib/python*'
      - '-usr/bin/python*'
      - '-var/lib/ucf'
      - '-usr/include'
      - '-usr/lib/X11'
      - '-usr/share'
      - '-usr/sbin'
      - '-usr/bin'
      - "-usr/lib/*/libicudata.*"
      - "-usr/lib/*/libicui18n.*"
      - "-usr/lib/*/libgtk-*"
      - "-usr/lib/*/libgdk-*"
      - "-usr/lib/*/glib-*"
      - "-usr/lib/*/gtk-*"
      - "-usr/lib/*/gdk-*"
      - "-usr/lib/*/krb5"
      - "-usr/lib/systemd"
      - "-usr/lib/glib-networking"
      - "-usr/lib/dconf"
      - "-usr/lib/*/avahi"
      - "-usr/lib/*/gio"
      - "-usr/lib/*/libatk*"
      - "-usr/lib/*/libatspi*"
      - "-usr/lib/*/libavahi*"
      - "-usr/lib/*/libcairo*"
      - "-usr/lib/*/libcolordprivate*"
      - "-usr/lib/*/libcolord*"
      - "-usr/lib/*/libcroco*"
      - "-usr/lib/*/libcups*"
      - "-usr/lib/*/libdatrie*"
      - "-usr/lib/*/libdconf*"
      - "-usr/lib/*/libepoxy*"
      - "-usr/lib/*/libexpatw*"
      - "-usr/lib/*/libffi*"
      - "-usr/lib/*/libfontconfig*"
      - "-usr/lib/*/libfreetype*"
      - "-usr/lib/*/libgdk_pixbuf*"
      - "-usr/lib/*/libgdk_pixbuf_xlib*"
      - "-usr/lib/*/libgio*"
      - "-usr/lib/*/libglib*"
      - "-usr/lib/*/libgmodule*"
      - "-usr/lib/*/libgmp*"
      - "-usr/lib/*/libgnutls*"
      - "-usr/lib/*/libgobject*"
      - "-usr/lib/*/libgraphite2*"
      - "-usr/lib/*/libgssapi_krb5*"
      - "-usr/lib/*/libgthread*"
      - "-usr/lib/*/libharfbuzz*"
      - "-usr/lib/*/libhogweed*"
      - "-usr/lib/*/libicuio*"
      - "-usr/lib/*/libicutest*"
      - "-usr/lib/*/libicutu*"
      - "-usr/lib/*/libicuuc*"
      - "-usr/lib/*/libidn2*"
      - "-usr/lib/*/libjbig*"
      - "-usr/lib/*/libjpeg*"
      - "-usr/lib/*/libjson*"
      - "-usr/lib/*/libk5crypto*"
      - "-usr/lib/*/libkrb5*"
      - "-usr/lib/*/libkrb5support*"
      - "-usr/lib/*/liblcms2*"
      - "-usr/lib/*/libnettle*"
      - "-usr/lib/*/libp11*"
      - "-usr/lib/*/libpango*"
      - "-usr/lib/*/libpangocairo*"
      - "-usr/lib/*/libpangoft2*"
      - "-usr/lib/*/libpixman*"
      - "-usr/lib/*/libpng16*"
      - "-usr/lib/*/libproxy*"
      - "-usr/lib/*/librest*"
      - "-usr/lib/*/librsvg*"
      - "-usr/lib/*/libsecret*"
      - "-usr/lib/*/libsoup*"
      - "-usr/lib/*/libsqlite3*"
      - "-usr/lib/*/libtasn1*"
      - "-usr/lib/*/libthai*"
      - "-usr/lib/*/libtiff*"
      - "-usr/lib/*/libunistring*"
      - "-usr/lib/*/libwayland*"
      - "-usr/lib/*/libX11*"
      - "-usr/lib/*/libXau*"
      - "-usr/lib/*/libxcb*"
      - "-usr/lib/*/libXcomposite*"
      - "-usr/lib/*/libXcursor*"
      - "-usr/lib/*/libXdamage*"
      - "-usr/lib/*/libXdmcp*"
      - "-usr/lib/*/libXext*"
      - "-usr/lib/*/libXfixes*"
      - "-usr/lib/*/libXinerama*"
      - "-usr/lib/*/libXi*"
      - "-usr/lib/*/libxkbcommon*"
      - "-usr/lib/*/libxml2*"
      - "-usr/lib/*/libXrandr*"
      - "-usr/lib/*/libXrender*"
plugs:
  gnome-3-28-1804:
    interface: content
    target: $SNAP/gnome-platform
    default-provider: gnome-3-28-1804
  gtk-3-themes:
    interface: content
    target: $SNAP/data-dir/themes
    default-provider: gtk-common-themes
  icon-themes:
    interface: content
    target: $SNAP/data-dir/icons
    default-provider: gtk-common-themes
  sound-themes:
    interface: content
    target: $SNAP/data-dir/sounds
    default-provider: gtk-common-themes
!include UAC.nsh

!ifndef INSTALL_MODE_PER_ALL_USERS
  !include multiUserUi.nsh
!endif

!ifndef BUILD_UNINSTALLER
  !ifndef HIDE_RUN_AFTER_FINISH
    Function StartApp
      ${if} ${isUpdated}
        StrCpy $1 "--updated"
      ${else}
        StrCpy $1 ""
      ${endif}
      ${StdUtils.ExecShellAsUser} $0 "$launchLink" "open" "$1"
    FunctionEnd

    !define MUI_FINISHPAGE_RUN
    !define MUI_FINISHPAGE_RUN_FUNCTION "StartApp"
  !endif

  !ifmacrodef customWelcomePage
    !insertmacro customWelcomePage
  !endif

  !ifmacrodef licensePage
    !insertmacro skipPageIfUpdated
    !insertmacro licensePage
  !endif

  !ifndef INSTALL_MODE_PER_ALL_USERS
    !insertmacro PAGE_INSTALL_MODE
  !endif

  !ifdef allowToChangeInstallationDirectory
    !include StrContains.nsh

    !insertmacro skipPageIfUpdated
    !insertmacro MUI_PAGE_DIRECTORY

    # pageDirectory leave doesn't work (it seems because $INSTDIR is set after custom leave function)
    # so, we use instfiles pre
    !define MUI_PAGE_CUSTOMFUNCTION_PRE instFilesPre

    # sanitize the MUI_PAGE_DIRECTORY result to make sure it has a application name sub-folder
    Function instFilesPre
      ${If} ${FileExists} "$INSTDIR\*"
        ${StrContains} $0 "${APP_FILENAME}" $INSTDIR
        ${If} $0 == ""
          StrCpy $INSTDIR "$INSTDIR\${APP_FILENAME}"
        ${endIf}
      ${endIf}
    FunctionEnd
  !endif
  !insertmacro MUI_PAGE_INSTFILES
  !insertmacro MUI_PAGE_FINISH
!else
  !insertmacro MUI_UNPAGE_WELCOME
  !ifndef INSTALL_MODE_PER_ALL_USERS
    !insertmacro PAGE_INSTALL_MODE
  !endif
  !insertmacro MUI_UNPAGE_INSTFILES
  !insertmacro MUI_UNPAGE_FINISH
!endif

!macro initMultiUser
  !ifdef INSTALL_MODE_PER_ALL_USERS
    !insertmacro setInstallModePerAllUsers
  !else
    ${If} ${UAC_IsInnerInstance}
    ${AndIfNot} ${UAC_IsAdmin}
      # special return value for outer instance so it knows we did not have admin rights
      SetErrorLevel 0x666666
      Quit
    ${endIf}

    !ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED
      !define MULTIUSER_INIT_TEXT_ADMINREQUIRED "$(^Caption) requires administrator privileges."
    !endif

    !ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED
      !define MULTIUSER_INIT_TEXT_POWERREQUIRED "$(^Caption) requires at least Power User privileges."
    !endif

    !ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE
      !define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this computer."
    !endif

    # checks registry for previous installation path (both for upgrading, reinstall, or uninstall)
    StrCpy $hasPerMachineInstallation "0"
    StrCpy $hasPerUserInstallation "0"

    # set installation mode to setting from a previous installation
    ReadRegStr $perMachineInstallationFolder HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation
    ${if} $perMachineInstallationFolder != ""
      StrCpy $hasPerMachineInstallation "1"
    ${endif}

    ReadRegStr $perUserInstallationFolder HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation
    ${if} $perUserInstallationFolder != ""
      StrCpy $hasPerUserInstallation "1"
    ${endif}

    ${GetParameters} $R0
    ${GetOptions} $R0 "/allusers" $R1
    ${IfNot} ${Errors}
      StrCpy $hasPerMachineInstallation "1"
      StrCpy $hasPerUserInstallation "0"
    ${EndIf}

    ${GetOptions} $R0 "/currentuser" $R1
    ${IfNot} ${Errors}
      StrCpy $hasPerMachineInstallation "0"
      StrCpy $hasPerUserInstallation "1"
    ${EndIf}

    ${if} $hasPerUserInstallation == "1"
    ${andif} $hasPerMachineInstallation == "0"
      !insertmacro setInstallModePerUser
    ${elseif} $hasPerUserInstallation == "0"
      ${andif} $hasPerMachineInstallation == "1"
      !insertmacro setInstallModePerAllUsers
    ${else}
      # if there is no installation, or there is both per-user and per-machine
      !ifdef INSTALL_MODE_PER_ALL_USERS
        !insertmacro setInstallModePerAllUsers
      !else
        !insertmacro setInstallModePerUser
      !endif
    ${endif}
  !endif
!macroend
# assisted installer messages, see messages.yml for one-click installer messages
chooseInstallationOptions:
  en: Choose Installation Options
  de: Installationsoption wÃ¤hlen
  ru: Ð’Ñ‹Ð±ÐµÑ€Ð¸Ñ‚Ðµ Ð¾Ð¿Ñ†Ð¸Ð¸ ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²ÐºÐ¸
  sk: Vyberte moÅ¾nosti inÅ¡talÃ¡cie
  fr: Choisis les options d'installation
  hu_HU: TelepÃ­tÃ©si opciÃ³k kivÃ¡lasztÃ¡sa
  pt_BR: Escolha uma opÃ§Ã£o de instalaÃ§Ã£o
  zh_CN: å®‰è£…é€‰é¡¹
  tr_TR: YÃ¼kleme AyarlarÄ±nÄ± SeÃ§in
  sv_SE: VÃ¤lj alternativ fÃ¶r installation
  pl_PL: Wybierz opcje instalacji
  no: Velg alternativer for installering
  nl_NL: Kies installatie-opties
  it_IT: Scegli opzioni di installazione
  fi: Valitse asennusvaihtoehdot
  es: Elegir opciones de instalaciÃ³n
  da: VÃ¦lg Installeringsmuligheder
  ja: ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã�®é�¸æŠž
chooseUninstallationOptions:
  en: Choose Uninstallation Options
  de: Deinstallationsoption wÃ¤hlen
  ru: Ð’Ñ‹Ð±ÐµÑ€Ð¸Ñ‚Ðµ Ð¾Ð¿Ñ†Ð¸Ð¸ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ�
  sk: Vyberte moÅ¾nosti odinÅ¡talovania
  fr: Choisis les options de dÃ©sinstallation
  hu_HU: EltÃ¡volÃ­tÃ¡si opciÃ³k kivÃ¡lasztÃ¡sa
  pt_BR: Escolha uma opÃ§Ã£o de desinstalaÃ§Ã£o
  zh_CN: å�¸è½½é€‰é¡¹
  tr_TR: KaldÄ±rma AyarlarÄ±nÄ± SeÃ§in
  sv_SE: VÃ¤lj alternativ fÃ¶r avinstallation
  pl_PL: Wybierz opcje dezinstalacji
  no: Velg alternativer for avinstallering
  nl_NL: Kies verwijderings-opties
  it_IT: Scegli opzioni di disinstallazione
  fi: Valitse asennuksen poistovaihtoehdot
  es: Elegir opciones de desinstalaciÃ³n
  da: VÃ¦lg Afinstalleringsmuligheder
  ja: ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã�®é�¸æŠž
whichInstallationShouldBeRemoved:
  en: Which installation should be removed?
  de: Welche Installation soll entfernt werden?
  ru: ÐšÐ°ÐºÑƒÑŽ Ð¸Ð· ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ‹Ñ… Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼ Ñ�Ð»ÐµÐ´ÑƒÐµÑ‚ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ?
  sk: KtorÃ¡ inÅ¡talÃ¡cia by mala byt odstrÃ¡nenÃ¡?
  fr: Quelle installation doit Ãªtre supprimÃ©eÂ ?
  hu_HU: Melyik telepÃ­tÃ©st tÃ¡volÃ­tsuk el?
  pt_BR: Qual instalaÃ§Ã£o deve ser removida?
  zh_CN: éœ€è¦�ç§»é™¤å“ªä¸ªå®‰è£…ï¼Ÿ
  tr_TR: Hangi YÃ¼kleme KaldÄ±rÄ±lsÄ±n?
  sv_SE: Vilken installation ska tas bort?
  pl_PL: KtÃ³rÄ… instalacjÄ™ chcesz usunÄ…Ä‡?
  no: Hvilken installasjon skal fjernes?
  nl_NL: Welke installatie moet worden verwijderd?
  it_IT: Quale installazione intendi rimuovere?
  fi: MikÃ¤ asennus pitÃ¤isi poistaa?
  es: Â¿QuÃ© tipo de instalaciÃ³n debe eliminarse?
  da: Hvilken installering skal fjernes?
  ja: ã�©ã‚Œã‚’ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�—ã�¾ã�™ã�‹ï¼Ÿ
whoShouldThisApplicationBeInstalledFor:
  en: Who should this application be installed for?
  de: FÃ¼r wen soll diese Anwendung installiert werden?
  ru: Ð”Ð»Ñ� ÐºÐ¾Ð³Ð¾ Ñ�Ð»ÐµÐ´ÑƒÐµÑ‚ ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ Ñ�Ñ‚Ð¾ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ?
  sk: Pre koho sa ma tÃ¡to aplikacia inÅ¡talovaÅ¥?
  fr: Pour qui cette application doit-elle Ãªtre installÃ©eÂ ?
  hu_HU: Kinek legyen ez az alkalmazÃ¡s telepÃ­tve?
  pt_BR: Para quem esta aplicaÃ§Ã£o deve ser instalada?
  zh_CN: ä¸ºå“ªä½�ç”¨æˆ·å®‰è£…è¯¥åº”ç”¨ï¼Ÿ
  tr_TR: Bu Uygulama Kimler iÃ§in Kurulsun?
  sv_SE: Vem ska den hÃ¤r applikationen installeras fÃ¶r?
  pl_PL: Dla kogo zainstalowaÄ‡ tÄ™ aplikacjÄ™?
  no: Hvem skal dette programmet installeres for?
  nl_NL: Voor wie moet deze applicatie worden geÃ¯nstalleerd?
  it_IT: Per chi dovrebbe essere installata questa applicazione?
  fi: Kenen kÃ¤yttÃ¶Ã¶n tÃ¤mÃ¤ sovellus pitÃ¤isi asentaa?
  es: Â¿Para quiÃ©n se instalarÃ¡ esta aplicaciÃ³n?
  da: Hvem skal denne applikation installeres til?
  ja: ã�©ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�—ã�¾ã�™ã�‹ï¼Ÿ
selectUserMode:
  en: Please select whether you wish to make this software available to all users or just yourself
  de: Bitte wÃ¤hlen Sie, ob Sie die Anwendung nur fÃ¼r sich oder fÃ¼r alle Benutzer installieren mÃ¶chten.
  ru: Ð’Ñ‹Ð±ÐµÑ€Ð¸, Ñ…Ð¾Ñ‡ÐµÑˆÑŒ Ð»Ð¸ Ñ‚Ñ‹ Ñ�Ð´ÐµÐ»Ð°Ñ‚ÑŒ Ñ�Ñ‚Ñƒ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñƒ Ð´Ð¾Ñ�Ñ‚ÑƒÐ¿Ð½Ð¾Ð¹ Ð´Ð»Ñ� Ð²Ñ�ÐµÑ… Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ Ð¸Ð»Ð¸ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ� Ñ�ÐµÐ±Ñ�
  sk: ProsÃ­m vyberte Ä�i sa ma tento softvÃ©r inÅ¡talovaÅ¥ len pre VÃ¡s alebo pre vÅ¡etkÃ½ch uÅ¾ivateÄ¾ov
  fr: "Choisis pour qui ce logiciel doit Ãªtre accessibleÂ : pour tous les utilisateurs ou juste pour toiÂ ?"
  hu_HU: VÃ¡laszd ki, hogy a szoftver elÃ©rhetÅ‘ legyen-e minden felhasznÃ¡lÃ³ szÃ¡mÃ¡ra, vagy csak neked
  pt_BR: Por favor, selecione se este software deve estar disponÃ­vel apenas para vocÃª ou para todos usuÃ¡rios
  zh_CN: è¯·é€‰æ‹©ä¸ºå½“å‰�ç”¨æˆ·è¿˜æ˜¯æ‰€æœ‰ç”¨æˆ·å®‰è£…è¯¥è½¯ä»¶
  tr_TR: LÃ¼tfen bu yazÄ±lÄ±mÄ± tÃ¼m kullanÄ±cÄ±lar iÃ§in mi yoksa sadece kendiniz mi kullanmak istediÄŸinizi seÃ§in
  sv_SE: VÃ¤lj om du vill gÃ¶ra den hÃ¤r mjukvaran tillgÃ¤nglig fÃ¶r alla anvÃ¤ndare eller bara fÃ¶r dig
  pl_PL: Wybierz, czy to oprogramowanie ma byÄ‡ dostÄ™pne dla wszystkich uÅ¼ytkownikÃ³w, czy tylko dla Ciebie
  no: Velg om du vil gjÃ¸re denne programvaren tilgjengelig for alle brukerne eller bare deg selv
  nl_NL: Selecteer of je deze software beschikbaar wilt maken voor alle gebruikers of alleen voor jezelf.
  it_IT: Seleziona se desideri rendere questo software accessibile a tutti gli utenti o solo a te
  fi: Valitse, haluatko tÃ¤mÃ¤n ohjelmiston kaikkien kÃ¤yttÃ¤jien vai pelkÃ¤stÃ¤Ã¤n itsesi kÃ¤yttÃ¶Ã¶n
  es: Elige si deseas que este software estÃ© disponible para todos los usuarios o solo para ti.
  da: VÃ¦lg, om du vil gÃ¸re denne software tilgÃ¦ngelig for andre brugere, eller kun for dig selv
  ja: ã�“ã�®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’ã�™ã�¹ã�¦ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�Œä½¿ç”¨ã�§ã��ã‚‹ã‚ˆã�†ã�«ã�™ã‚‹ã�‹ã€�ç�¾åœ¨ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�®ã�¿ä½¿ç”¨ã�™ã‚‹ã�‹ã‚’é�¸æŠžã�—ã�¦ã��ã� ã�•ã�„
whichInstallationRemove:
  en: This software is installed both per-machine (all users) and per-user.\nWhich installation you wish to remove?
  de: Die Anwendung wurde fÃ¼r alle Benutzer und pro Benutzer installiert.\nWelche Installation mÃ¶chten Sie entfernen?
  ru: Ð­Ñ‚Ð° Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð° Ð´Ð»Ñ� Ð²Ñ�ÐµÐ³Ð¾ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° (Ð´Ð»Ñ� Ð²Ñ�ÐµÑ… Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹) Ð¸ Ð´Ð»Ñ� Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ�.\nÐšÐ°ÐºÑƒÑŽ Ð¸Ð· ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ‹Ñ… Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼ Ñ‚Ñ‹ Ñ…Ð¾Ñ‡ÐµÑˆÑŒ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ?
  sk: Tento softvÃ©r je nainÅ¡talovanÃ½ pre VÃ¡s a sÃºÄ�asne pre vÅ¡etkÃ½ch uÅ¾ivateÄ¾ov.\nKtorÃº inÅ¡talÃ¡ciu si Å¾elÃ¡te odstraniÅ¥?
  fr: Ce logiciel est installÃ© Ã  la fois par machine (tous les utilisateurs) et par utilisateur.\nQuelle installation veux-tu supprimerÂ ?
  hu_HU: Ez a szoftver szÃ¡mÃ­tÃ³gÃ©penkÃ©nt (minden felhasznÃ¡lÃ³) Ã©s felhasznÃ¡lÃ³nkÃ©nt is telepÃ­tve van.\nMelyik telepÃ­tÃ©st szeretnÃ©d eltÃ¡volÃ­tani?
  pt_BR: Este software Ã© instalado por mÃ¡quina (todos os usuÃ¡rios) e por usuÃ¡rio. Qual instalaÃ§Ã£o vocÃª deseja remover?
  zh_CN: è¯¥è½¯ä»¶å·²ä¸ºæ‰€æœ‰ç”¨æˆ·å’Œå½“å‰�ç”¨æˆ·å®‰è£….\næ‚¨å¸Œæœ›ç§»é™¤å“ªä¸ªå®‰è£…?
  tr_TR: Bu yazÄ±lÄ±m hem makine baÅŸÄ±na (tÃ¼m kullanÄ±cÄ±lar) hem de kullanÄ±cÄ± baÅŸÄ±na yÃ¼klenir.\nKaldÄ±rmak istediÄŸiniz kurulum?
  sv_SE: Den hÃ¤r mjukvaran Ã¤r installerad bÃ¥de â€�per datorâ€� (alla anvÃ¤ndare) och â€�per anvÃ¤ndareâ€�.\nVilken installation vill du ta bort?
  pl_PL: To oprogramowanie zostaÅ‚o zainstalowane zarÃ³wno dla urzÄ…dzenia (wszyscy uÅ¼ytkownicy), jak i dla uÅ¼ytkownika.\nKtÃ³rÄ… instalacjÄ™ chcesz usunÄ…Ä‡?
  no: Denne programvaren er installert bÃ¥de per-maskin (alle brukere) og per-bruker. Hvilken installasjon vil du fjerne?
  nl_NL: Deze software is zowel per apparaat (alle gebruikers) als per gebruiker geÃ¯nstalleerd. Welke installatie wil je verwijderen?
  it_IT: Questo software Ã¨ stato installato sia per computer (tutti gli utenti) sia per utente.\nQuale installazione desideri rimuovere?
  fi: TÃ¤mÃ¤ ohjelmisto on asennettu sekÃ¤ konekohtaisesti (kaikki kÃ¤yttÃ¤jÃ¤t) ettÃ¤ kÃ¤yttÃ¤jÃ¤kohtaisesti.\nMinkÃ¤ asennuksen haluat poistaa?
  es: Este software se ha instalado para la mÃ¡quina (todos los usuarios) y para el usuario.\nÂ¿QuÃ© instalaciÃ³n quieres eliminar?
  da: Denne software er installeret bÃ¥de pr. maskine (alle brugere) og pr. bruger./nHvilken installering Ã¸nsker du at fjerne?
  ja: ã�“ã�®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã�¯ã€�ãƒžã‚·ãƒ³ã�”ã�¨ï¼ˆã�™ã�¹ã�¦ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼‰ã�¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�”ã�¨ã�«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�•ã‚Œã�¦ã�„ã�¾ã�™ã€‚\ nã�©ã�¡ã‚‰ã‚’å‰Šé™¤ã�—ã�¾ã�™ã�‹ï¼Ÿ
freshInstallForAll:
  en: Fresh install for all users. (will prompt for admin credentials)
  de: Neuinstallation fÃ¼r alle Benutzer durchfÃ¼hren. (Administratorrechte benÃ¶tigt)
  ru: Ð�Ð¾Ð²Ð°Ñ� ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²ÐºÐ° Ð´Ð»Ñ� Ð²Ñ�ÐµÑ… Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹. (Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑŽÑ‚Ñ�Ñ� Ð¿Ñ€Ð°Ð²Ð° Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ�Ñ‚Ñ€Ð°Ñ‚Ð¾Ñ€Ð°)
  sk: NovÃ¡ inÅ¡talÃ¡cia pre vÅ¡etkÃ½ch uÅ¾ivateÄ¾ov. (will prompt for admin credentials)
  fr: Nouvelle installation pour tous les utilisateurs. (demandera les identifiants administrateur)
  hu_HU: Ãšj telepÃ­tÃ©s minden felhasznÃ¡lÃ³ szÃ¡mÃ¡ra. (Az adminisztrÃ¡tor hitelesÃ­tÅ‘ adataira lesz szÃ¼ksÃ©g.)
  pt_BR: InstalaÃ§Ã£o limpa para todos os usuÃ¡rios. (irÃ¡ solicitar credenciais de administrador)
  zh_CN: ä¸ºæ‰€æœ‰ç”¨æˆ·è¿›è¡Œå…¨æ–°å®‰è£…. (éœ€è¦�ç®¡ç�†å‘˜èµ„æ ¼)
  tr_TR: TÃ¼m kullanÄ±cÄ±lar iÃ§in yeni yÃ¼kleme. (yÃ¶netici kimlik bilgilerini soracaktÄ±r)
  sv_SE: Ny installation fÃ¶r alla anvÃ¤ndare. (kommer att begÃ¤ra adminbehÃ¶righet)
  pl_PL: Nowa instalacja dla wszystkich uÅ¼ytkownikÃ³w (potrzebne bÄ™dÄ… dane administratora).
  no: Ny installasjon for alle brukere. (vil be om administratorlegitimasjon)
  nl_NL: Nieuwe installatie voor alle gebruikers. (zal om beheerder-gegevens vragen)
  it_IT: Re-installa per tutti gli utenti. (Richiede le credenziali di amministratore)
  fi: Uusi asennus kaikille kÃ¤yttÃ¤jille (pyytÃ¤Ã¤ yllÃ¤pitÃ¤jÃ¤n kÃ¤yttÃ¤jÃ¤tunnuksia)
  es: InstalaciÃ³n nueva para todos los usuarios (se pedirÃ¡n los credenciales del administrador)
  da: Ny installering til alle brugere. (Vil medfÃ¸re administrations-legitimationsoplysninger)
  ja: ã�™ã�¹ã�¦ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�«æ–°è¦�ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ï¼ˆç®¡ç�†è€…æ¨©é™�ã�Œå¿…è¦�ï¼‰
freshInstallForCurrent:
  en: Fresh install for current user only.
  de: Neuinstallation nur fÃ¼r den aktuellen Benutzer durchfÃ¼hren.
  ru: Ð�Ð¾Ð²Ð°Ñ� ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²ÐºÐ° Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ� Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ�.
  fr: Nouvelle installation uniquement pour l'utilisateur actuel.
  hu_HU: Ãšj telepÃ­tÃ©s csak a jelenlegi felhasznÃ¡lÃ³ szÃ¡mÃ¡ra.
  pt_BR: InstalaÃ§Ã£o limpa somente para o usuÃ¡rio atual.
  zh_CN: ä»…ä¸ºå½“å‰�ç”¨æˆ·è¿›è¡Œå…¨æ–°å®‰è£….
  tr_TR: Sadece mevcut kullanÄ±cÄ± iÃ§in yeni yÃ¼kleme.
  sv_SE: Ny installation endast fÃ¶r den aktuella anvÃ¤ndaren.
  pl_PL: Nowa instalacja wyÅ‚Ä…cznie dla obecnego uÅ¼ytkownika.
  no: Ny installasjon kun for nÃ¥vÃ¦rende bruker.
  nl_NL: Nieuwe installatie alleen voor huidige gebruiker.
  it_IT: Re-installa solo per l'utente attuale.
  fi: Uusi asennus vain nykyiselle kÃ¤yttÃ¤jÃ¤lle.
  es: InstalaciÃ³n nueva solo para el usuario actual.
  da: Ny installering kun til nuvÃ¦rende bruger.
  ja: ç�¾åœ¨ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�®ã�¿æ–°è¦�ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«
onlyForMe:
  en: Only for &me
  de: Nur fÃ¼r &mich
  ru: Ð¢Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ� &Ð¼ÐµÐ½Ñ�
  sk: Iba pre mÅˆa
  fr: Juste pour moi
  hu_HU: Csak az Ã©n szÃ¡momra
  pt_BR: Apenas para &mim
  zh_CN: ä»…ä¸ºæˆ‘å®‰è£…
  tr_TR: Sadece benim iÃ§in
  sv_SE: Endast fÃ¶r &mig
  pl_PL: Tylko dla &mnie
  no: Kun for &meg
  nl_NL: Alleen voor &mij
  it_IT: Solo per &me
  fi: Vain minulle
  es: Solo para mÃ­.
  da: Kun til mig
  ja: ç�¾åœ¨ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�®ã�¿ã�«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�™ã‚‹
forAll:
  en: Anyone who uses this computer (&all users)
  de: FÃ¼r alle Benutzer dieses Computers (&alle Benutzer)
  ru: Ð”Ð»Ñ� &Ð²Ñ�ÐµÑ… Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð°
  sk: Pre kaÅ¾dÃ©ho kto pouÅ¾iva tento poÄ�itaÄ� (vÅ¡etci uÅ¾ivatelia)
  fr: Pour tous ceux qui utilisent cet ordinateur (tous les utilisateurs)
  hu_HU: BÃ¡rki szÃ¡mÃ¡ra, aki ezt a szÃ¡mÃ­tÃ³gÃ©pet hasznÃ¡lja (minden felhasznÃ¡lÃ³)
  pt_BR: Para todos que usam esta mÃ¡quina (&todos os usuÃ¡rios)
  zh_CN: ä¸ºä½¿ç”¨è¿™å�°ç”µè„‘çš„ä»»ä½•äººå®‰è£… (æ‰€æœ‰ç”¨æˆ·)
  tr_TR: Bu bilgisayarÄ± kullanan herkes (ve tÃ¼m kullanÄ±cÄ±lar)
  sv_SE: Alla som anvÃ¤nder den hÃ¤r datorn (alla anvÃ¤ndare)
  pl_PL: KaÅ¼dy korzystajÄ…cy z tego komputera (wszyscy uÅ¼ytkownicy)
  no: Alle som bruker denne datamaskinen (alle brukere)
  nl_NL: Iedereen die deze computer gebruikt (alle gebruikers)
  it_IT: Per chiunque usi questo computer (tutti gli utenti)
  fi: Kaikille, jotka kÃ¤yttÃ¤vÃ¤t tÃ¤tÃ¤ tietokonetta (kaikki kÃ¤yttÃ¤jÃ¤t)
  es: Cualquiera que utilice este ordenador (todos los usuarios)
  da: Enhver, der bruger denne computer (alle brugere)
  ja: ã�“ã�®ã‚³ãƒ³ãƒ”ãƒ¥ãƒ¼ã‚¿ãƒ¼ã‚’ä½¿ç”¨ã�—ã�¦ã�„ã‚‹ã�™ã�¹ã�¦ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ç”¨ã�«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�™ã‚‹
loginWithAdminAccount:
  en: You need to login with an account that is a member of the admin group to continue...
  de: Um die Installation fortzusetzen mÃ¼ssen Sie sich mit einem Administrator-Account anmelden...
  ru: Ð§Ñ‚Ð¾Ð±Ñ‹ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÑŒ, Ñ‚ÐµÐ±Ðµ Ð½ÑƒÐ¶Ð½Ð¾ Ð²Ð¾Ð¹Ñ‚Ð¸ Ð² ÑƒÑ‡ÐµÑ‚Ð½ÑƒÑŽ Ð·Ð°Ð¿Ð¸Ñ�ÑŒ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ� Ð²Ñ…Ð¾Ð´Ð¸Ñ‚ Ð² Ð³Ñ€ÑƒÐ¿Ð¿Ñƒ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ�Ñ‚Ñ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð²...
  sk: Pre pokraÄ�ovanie sa musÃ­te zalogovaÅ¥ s ÃºÄ�tom ktorÃ½ patrÃ­ do skupiny adminstrÃ¡torov...
  fr: Tu dois te connecter avec un compte ayant des droits d'administrateur pour continuer...
  hu_HU: A folytatÃ¡shoz adminisztrÃ¡tori jogokkal rendelkezÅ‘ fiÃ³kkal kell bejelentkezned...
  pt_BR: VocÃª precisa realizar o login com uma conta que Ã© membro do grupo de administraÃ§Ã£o para continuar...
  zh_CN: æ‚¨éœ€è¦�ç”¨å±žäºŽç®¡ç�†å‘˜ç¾¤ç»„çš„ç”¨æˆ·è´¦æˆ·ç™»å½•æ�¥ç»§ç»­...
  tr_TR: Devam etmek iÃ§in yÃ¶netici grubunun Ã¼yesi olan bir hesapla giriÅŸ yapmanÄ±z gerekiyor..
  sv_SE: Du mÃ¥ste logga in med ett konto som Ã¤r medlem i admingruppen fÃ¶r att fortsÃ¤tta...
  pl_PL: Musisz siÄ™ zalogowaÄ‡ za pomocÄ… konta bÄ™dÄ…cego czÅ‚onkiem grupy administratora, by kontynuowaÄ‡...
  no: Du mÃ¥ logge inn med en konto som er medlem av administrasjonsgruppen for Ã¥ fortsette...
  nl_NL: Je dient in te loggen met een account dat lid is van de beheerdersgroep om verder te gaan...
  it_IT: Devi accedere con un account incluso nel gruppo amministratore per continuare...
  fi: Jatkaaksesi sinun on kirjauduttava kÃ¤yttÃ¤jÃ¤tilillÃ¤, joka on yllÃ¤pitÃ¤jÃ¤ryhmÃ¤n jÃ¤sen...
  es: Para continuar, tienes que iniciar sesiÃ³n con una cuenta que pertenezca al grupo de administradores...
  da: Du skal logge ind med en konto, der er medlem af administrationsgruppen for at kunne fortsÃ¦tte...
  ja: ç¶šè¡Œã�™ã‚‹ã�«ã�¯ã€�ç®¡ç�†è€…æ¨©é™�ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã�§ãƒ­ã‚°ã‚¤ãƒ³ã�™ã‚‹å¿…è¦�ã�Œã�‚ã‚Šã�¾ã�™...
perUserInstallExists:
  en: There is already a per-user installation.
  de: Es existiert bereits eine Installtion fÃ¼r den ausgewÃ¤hlten Benutzer.
  ru: Ð£Ð¶Ðµ ÐµÑ�Ñ‚ÑŒ ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ� Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° Ð´Ð»Ñ� Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ�.
  fr: Il y a dÃ©jÃ  une installation par utilisateur.
  hu_HU: MÃ¡r van egy felhasznÃ¡lÃ³nkÃ©nti telepÃ­tÃ©s.
  pt_BR: JÃ¡ existe uma instalaÃ§Ã£o por usuÃ¡rio.
  zh_CN: å·²ç»�å­˜åœ¨ä¸€ä¸ªå®‰è£…åˆ°å½“å‰�ç”¨æˆ·çš„å®‰è£….
  tr_TR: Her kullanÄ±cÄ± iÃ§in zaten bir kurulum var.
  sv_SE: Det finns redan en â€�per anvÃ¤ndareâ€�-installation.
  pl_PL: Instalacja dla uÅ¼ytkownika juÅ¼ istnieje.
  no: Det er allerede en per-bruker-installasjon.
  nl_NL: Er is al een installatie 'per gebruiker'.
  it_IT: Ãˆ giÃ  presente un'installazione per utente.
  fi: TÃ¤mÃ¤ on jo kÃ¤yttÃ¤jÃ¤kohtainen asennus.
  es: Ya hay una instalaciÃ³n por usuario.
  da: Der er allerede en pr. bruger installation.
  ja: ã�™ã�§ã�«ç�¾åœ¨ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�•ã‚Œã�¦ã�„ã�¾ã�™ã€‚
perUserInstall:
  en: There is a per-user installation.
  de: Benutzerinstallation bereits vorhanden.
  ru: Ð•Ñ�Ñ‚ÑŒ ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ� Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° Ð´Ð»Ñ� Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ�.
  fr: Il y a une installation par utilisateur.
  hu_HU: Van felhasznÃ¡lÃ³nkÃ©nti telepÃ­tÃ©s.
  pt_BR: Existe uma instalaÃ§Ã£o por usuÃ¡rio.
  zh_CN: å­˜åœ¨ä¸€ä¸ªå®‰è£…åˆ°å½“å‰�ç”¨æˆ·çš„å®‰è£….
  tr_TR: KullanÄ±cÄ± baÅŸÄ±na bir kurulum var.
  sv_SE: Det finns en â€�per anvÃ¤ndareâ€�-installation.
  pl_PL: Instalacja dla uÅ¼ytkownika istnieje.
  no: Det er en per-bruker-installasjon.
  nl_NL: Er is een installatie 'per gebruiker'.
  it_IT: Ãˆ presente un'installazione per utente.
  fi: KÃ¤yttÃ¤jÃ¤kohtainen asennus on olemassa.
  es: Hay una instalaciÃ³n por usuario.
  da: Der er en pr. bruger installation.
  ja: ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�”ã�¨ã�®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�Œã�‚ã‚Šã�¾ã�™ã€‚
perMachineInstallExists:
  en: There is already a per-machine installation.
  de: Es existiert bereits eine Installation fÃ¼r diesen Computer.
  ru: Ð£Ð¶Ðµ ÐµÑ�Ñ‚ÑŒ ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ� Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° Ð´Ð»Ñ� Ð²Ñ�ÐµÐ³Ð¾ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð°.
  fr: Il y a dÃ©jÃ  une installation par machine.
  hu_HU: MÃ¡r van egy szÃ¡mÃ­tÃ³gÃ©penkÃ©nti telepÃ­tÃ©s.
  pt_BR: JÃ¡ existe uma instalaÃ§Ã£o por mÃ¡quina.
  zh_CN: å·²ç»�å­˜åœ¨ä¸€ä¸ªå®‰è£…åˆ°æ‰€æœ‰ç”¨æˆ·çš„å®‰è£….
  tr_TR: Zaten makine baÅŸÄ±na bir kurulum var.
  sv_SE: Det finns redan en â€�per datorâ€�-installation.
  pl_PL: Instalacja dla urzÄ…dzenia juÅ¼ istnieje.
  no: Det er allerede en per-maskin-installasjon.
  nl_NL: Er is al een installatie 'per apparaat'.
  it_IT: Ãˆ giÃ  presente un'installazione per computer.
  fi: TÃ¤mÃ¤ on jo tietokonekohtainen asennus.
  es: Ya hay una instalaciÃ³n por mÃ¡quina.
  da: Der er allerede en pr. maskine installation.
  ja: æ—¢ã�«ã�™ã�¹ã�¦ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ç”¨ã�«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�•ã‚Œã�¦ã�„ã�¾ã�™ã€‚
perMachineInstall:
  en: There is a per-machine installation.
  de: Es existiert eine Installation fÃ¼r diesen Computer.
  ru: Ð•Ñ�Ñ‚ÑŒ ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ� Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° Ð´Ð»Ñ� Ð²Ñ�ÐµÐ³Ð¾ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð°.
  fr: Il y a une installation par machine.
  hu_HU: Van szÃ¡mÃ­tÃ³gÃ©penkÃ©nti telepÃ­tÃ©s.
  pt_BR: Existe uma instalaÃ§Ã£o por mÃ¡quina.
  zh_CN: å­˜åœ¨ä¸€ä¸ªå®‰è£…åˆ°æ‰€æœ‰ç”¨æˆ·çš„å®‰è£….
  tr_TR: Makine baÅŸÄ±na bir yÃ¼kleme var.
  sv_SE: Det finns en â€�per datorâ€�-installation.
  pl_PL: Instalacja dla urzÄ…dzenia istnieje.
  no: Det er en per-maskin-installasjon.
  nl_NL: Er is een installatie 'per apparaat'.
  it_IT: Ãˆ presente un'installazione per computer.
  fi: Tietokonekohtainen asennus on olemassa.
  es: Hay una instalaciÃ³n por mÃ¡quina.
  da: Der er en pr. maskine installation.
  ja: ã�™ã�¹ã�¦ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ç”¨ã�®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�Œã�‚ã‚Šã�¾ã�™ã€‚
reinstallUpgrade:
  en: Will reinstall/upgrade.
  de: Die Anwendung wird aktualisiert.
  ru: Ð˜Ð³Ñ€Ð° Ð±ÑƒÐ´ÐµÑ‚ Ð¿ÐµÑ€ÐµÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð°/Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð°.
  fr: Va rÃ©installer/mettre Ã  jour.
  hu_HU: ÃšjratelepÃ­t/frissÃ­t.
  pt_BR: IrÃ¡ reinstalar/atualizar.
  zh_CN: å�³å°†é‡�æ–°å®‰è£…/å�‡çº§.
  tr_TR: Yeniden yÃ¼kleme/yÃ¼kseltme
  sv_SE: Kommer att ominstallera/uppgradera.
  pl_PL: NastÄ…pi ponowna instalacja/aktualizacja.
  no: Vil installere pÃ¥ nytt / oppgradere.
  nl_NL: Zal opnieuw installeren/upgraden.
  it_IT: Re-installa/aggiorna il programma.
  fi: Asennetaan uudelleen/pÃ¤ivitetÃ¤Ã¤n.
  es: Se reinstalarÃ¡/actualizarÃ¡.
  da: Reinstallerer/opgraderer.
  ja: å†�ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«/ã‚¢ãƒƒãƒ—ã‚°ãƒ¬ãƒ¼ãƒ‰ã�—ã�¾ã�™ã€‚
uninstall:
  en: Will uninstall.
  de: Die Anwendung wird deinstalliert.
  ru: Ð˜Ð³Ñ€Ð° Ð±ÑƒÐ´ÐµÑ‚ ÑƒÐ´Ð°Ð»ÐµÐ½Ð°.
  fr: Va dÃ©sinstaller.
  hu_HU: EltÃ¡volÃ­t.
  pt_BR: IrÃ¡ desinstalar.
  zh_CN: å�³å°†å�¸è½½.
  tr_TR: KaldÄ±ralacak.
  sv_SE: Kommer att avinstallera.
  pl_PL: NastÄ…pi dezinstalacja.
  no: Vil avinstallere.
  nl_NL: Zal installatie verwijderen.
  it_IT: Disinstalla il programma.
  fi: Poistetaan asennus.
  es: Se desinstalarÃ¡.
  da: Afinstallerer.
  ja: ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�—ã�¾ã�™ã€‚
!include x64.nsh
!include WinVer.nsh

BrandingText "${PRODUCT_NAME} ${VERSION}"
ShowInstDetails nevershow
SpaceTexts none
!ifdef BUILD_UNINSTALLER
  ShowUninstDetails nevershow
!endif
FileBufSize 64
Name "${PRODUCT_NAME}"

!define APP_EXECUTABLE_FILENAME "${PRODUCT_FILENAME}.exe"
!define UNINSTALL_FILENAME "Uninstall ${PRODUCT_FILENAME}.exe"

!macro check64BitAndSetRegView
  ${IfNot} ${AtLeastWin7}
    MessageBox MB_OK "$(win7Required)"
    Quit
  ${EndIf}

  !ifdef APP_64
    ${If} ${RunningX64}
      SetRegView 64
    ${Else}
      !ifndef APP_32
        MessageBox MB_OK|MB_ICONEXCLAMATION "$(x64WinRequired)"
        Quit
      !endif
    ${EndIf}
  !endif
!macroend

# avoid exit code 2
!macro quitSuccess
  SetErrorLevel 0
  Quit
!macroend

!macro setLinkVars
  # old desktop shortcut (could exist or not since the user might has selected to delete it)
  ReadRegStr $oldShortcutName SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" ShortcutName
  ${if} $oldShortcutName == ""
    StrCpy $oldShortcutName "${PRODUCT_FILENAME}"
  ${endIf}
  StrCpy $oldDesktopLink "$DESKTOP\$oldShortcutName.lnk"

  # new desktop shortcut (will be created/renamed in case of a fresh installation or if the user haven't deleted the initial one)
  StrCpy $newDesktopLink "$DESKTOP\${SHORTCUT_NAME}.lnk"

  ReadRegStr $oldMenuDirectory SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" MenuDirectory
  ${if} $oldMenuDirectory == ""
    StrCpy $oldStartMenuLink "$SMPROGRAMS\$oldShortcutName.lnk"
  ${else}
    StrCpy $oldStartMenuLink "$SMPROGRAMS\$oldMenuDirectory\$oldShortcutName.lnk"
  ${endIf}

  # new menu shortcut (will be created/renamed in case of a fresh installation or if the user haven't deleted the initial one)
  !ifdef MENU_FILENAME
    StrCpy $newStartMenuLink "$SMPROGRAMS\${MENU_FILENAME}\${SHORTCUT_NAME}.lnk"
  !else
    StrCpy $newStartMenuLink "$SMPROGRAMS\${SHORTCUT_NAME}.lnk"
  !endif
!macroend

!macro skipPageIfUpdated
  !define UniqueID ${__LINE__}

  Function skipPageIfUpdated_${UniqueID}
    ${if} ${isUpdated}
      Abort
    ${endif}
  FunctionEnd

  !define MUI_PAGE_CUSTOMFUNCTION_PRE skipPageIfUpdated_${UniqueID}
  !undef UniqueID
!macroend

!macro StartApp
  Var /GLOBAL startAppArgs
  ${if} ${isUpdated}
    StrCpy $startAppArgs "--updated"
  ${else}
    StrCpy $startAppArgs ""
  ${endif}

  ${StdUtils.ExecShellAsUser} $0 "$launchLink" "open" "$startAppArgs"
!macroendLoading...!include installer.nsh

InitPluginsDir

${IfNot} ${Silent}
  SetDetailsPrint none
${endif}

StrCpy $appExe "$INSTDIR\${APP_EXECUTABLE_FILENAME}"

# must be called before uninstallOldVersion
!insertmacro setLinkVars

!ifdef ONE_CLICK
  !ifdef HEADER_ICO
    File /oname=$PLUGINSDIR\installerHeaderico.ico "${HEADER_ICO}"
  !endif
  ${IfNot} ${Silent}
    !ifdef HEADER_ICO
      SpiderBanner::Show /MODERN /ICON "$PLUGINSDIR\installerHeaderico.ico"
    !else
      SpiderBanner::Show /MODERN
    !endif

    FindWindow $0 "#32770" "" $hwndparent
    FindWindow $0 "#32770" "" $hwndparent $0
    GetDlgItem $0 $0 1000
    SendMessage $0 ${WM_SETTEXT} 0 "STR:$(installing)"
  ${endif}
  !insertmacro CHECK_APP_RUNNING
!else
  ${ifNot} ${UAC_IsInnerInstance}
    !insertmacro CHECK_APP_RUNNING
  ${endif}
!endif

Var /GLOBAL keepShortcuts
StrCpy $keepShortcuts "false"
!insertMacro setIsTryToKeepShortcuts
${if} $isTryToKeepShortcuts == "true"
  ReadRegStr $R1 SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" KeepShortcuts

  ${if} $R1 == "true"
  ${andIf} ${FileExists} "$appExe"
    StrCpy $keepShortcuts "true"
  ${endIf}
${endif}

!insertmacro uninstallOldVersion SHELL_CONTEXT
${if} $installMode == "all"
  !insertmacro uninstallOldVersion HKEY_CURRENT_USER
${endIf}

SetOutPath $INSTDIR

!ifdef UNINSTALLER_ICON
  File /oname=uninstallerIcon.ico "${UNINSTALLER_ICON}"
!endif

!insertmacro installApplicationFiles
!insertmacro registryAddInstallInfo
!insertmacro addStartMenuLink $keepShortcuts
!insertmacro addDesktopLink $keepShortcuts

${if} ${FileExists} "$newStartMenuLink"
  StrCpy $launchLink "$newStartMenuLink"
${else}
  StrCpy $launchLink "$INSTDIR\${APP_EXECUTABLE_FILENAME}"
${endIf}

!ifmacrodef registerFileAssociations
  !insertmacro registerFileAssociations
!endif

!ifmacrodef customInstall
  !insertmacro customInstall
!endif

!macro doStartApp
  # otherwise app window will be in background
  HideWindow
  !insertmacro StartApp
!macroend

!ifdef ONE_CLICK
  # https://github.com/electron-userland/electron-builder/pull/3093#issuecomment-403734568
  !ifdef RUN_AFTER_FINISH
    ${ifNot} ${Silent}
    ${orIf} ${isForceRun}
      !insertmacro doStartApp
    ${endIf}
  !else
    ${if} ${isForceRun}
      !insertmacro doStartApp
    ${endIf}
  !endif
  !insertmacro quitSuccess
!else
  # for assisted installer run only if silent, because assisted installer has run after finish option
  ${if} ${isForceRun}
  ${andIf} ${Silent}
    !insertmacro doStartApp
  ${endIf}
!endifVar newStartMenuLink
Var oldStartMenuLink
Var newDesktopLink
Var oldDesktopLink
Var oldShortcutName
Var oldMenuDirectory

!include "common.nsh"
!include "MUI2.nsh"
!include "multiUser.nsh"
!include "allowOnlyOneInstallerInstance.nsh"

!ifdef INSTALL_MODE_PER_ALL_USERS
  !ifdef BUILD_UNINSTALLER
    RequestExecutionLevel user
  !else
    RequestExecutionLevel admin
  !endif
!else
  RequestExecutionLevel user
!endif

!ifdef BUILD_UNINSTALLER
  SilentInstall silent
!else
  Var appExe
  Var launchLink
!endif

!ifdef ONE_CLICK
  !include "oneClick.nsh"
!else
  !include "assistedInstaller.nsh"
!endif

!insertmacro addLangs

!ifmacrodef customHeader
  !insertmacro customHeader
!endif

Function .onInit
  !ifmacrodef preInit
    !insertmacro preInit
  !endif

  !ifdef DISPLAY_LANG_SELECTOR
    !insertmacro MUI_LANGDLL_DISPLAY
  !endif

  !ifdef BUILD_UNINSTALLER
    WriteUninstaller "${UNINSTALLER_OUT_FILE}"
    !insertmacro quitSuccess
  !else
    !insertmacro check64BitAndSetRegView

    !ifdef ONE_CLICK
      !insertmacro ALLOW_ONLY_ONE_INSTALLER_INSTANCE
    !else
      ${IfNot} ${UAC_IsInnerInstance}
        !insertmacro ALLOW_ONLY_ONE_INSTALLER_INSTANCE
      ${EndIf}
    !endif

    !insertmacro initMultiUser

    !ifmacrodef customInit
      !insertmacro customInit
    !endif

    !ifmacrodef addLicenseFiles
      InitPluginsDir
      !insertmacro addLicenseFiles
    !endif
  !endif
FunctionEnd

!ifndef BUILD_UNINSTALLER
  !include "installUtil.nsh"
!endif

Section "install"
  !ifndef BUILD_UNINSTALLER
    !include "installSection.nsh"
  !endif
SectionEnd

!ifdef BUILD_UNINSTALLER
  !include "uninstaller.nsh"
!endif# one-click installer messages, see assistedMessages.yml for assisted installer messages
# en must be first (https://github.com/electron-userland/electron-builder/issues/2517)
win7Required:
  en: Windows 7 and above is required
  de: Windows 7 oder hÃ¶her wird vorausgesetzt
  it: Ãˆ necessario disporre del sistema operativo Windows 7 e successivi
  fr: Windows 7 (ou une version ultÃ©rieure) est requis
  ja: Windows 7 ä»¥é™�ã�Œå¿…è¦�ã�§ã�™
  ko: Windows 7 ì�´ìƒ�ì�´ í•„ìš”í•©ë‹ˆë‹¤
  ru: Ð¢Ñ€ÐµÐ±ÑƒÐµÑ‚Ñ�Ñ� Windows 7 Ð¸ Ð²Ñ‹ÑˆÐµ
  sk: Iba Windows 7 a vyÅ¡Å¡ie je podporovanÃ½
  hu: Windows 7 vagy Ãºjabb szÃ¼ksÃ©ges
  pl: Windows 7 lub nowszy jest wymagany
  pt_BR: Requer Windows 7 ou superior
  zh_CN: éœ€è¦� Windows 7 æˆ–ä»¥ä¸Šç³»ç»Ÿ
  tr_TR: Windows 7 ve Ã¼stÃ¼ gereklidir
  sv_SE: Windows 7 eller hÃ¶gre krÃ¤vs
  no: Windows 7 og over er nÃ¸dvendig
  nl_NL: Windows 7 en hoger is vereist
  fi: Windows 7 tai uudempi vaaditaan
  es: Se necesita Windows 7 o una versiÃ³n superior.
  da: Windows 7 og hÃ¸jere er nÃ¸dvendig
x64WinRequired:
  en: 64-bit Windows is required
  de: 64-Bit-Windows wird vorausgesetzt
  it: Ãˆ necessario disporre di un sistema operativo Windows a 64 bit
  fr: Windows 64 bits est requis
  ja: 64 ãƒ“ãƒƒãƒˆ ãƒ�ãƒ¼ã‚¸ãƒ§ãƒ³ã�® Windows ã�Œå¿…è¦�ã�§ã�™
  ko: 64 ë¹„íŠ¸ ë²„ì „ì�˜ Windowsê°€ í•„ìš”í•©ë‹ˆë‹¤
  ru: Ð¢Ñ€ÐµÐ±ÑƒÐµÑ‚Ñ�Ñ� Windows 64-bit
  sk: Potrebujete 64-bit Windows
  hu: 64-bit Windows szÃ¼ksÃ©ges
  pl: Windows 64-bitowy jest wymagany
  pt_BR: Requer Windows 64 bits
  zh_CN: éœ€è¦� 64 ä½� Windows ç³»ç»Ÿ
  tr_TR: 64 bit Windows gerekli
  sv_SE: 64-bitars Windows krÃ¤vs
  no: 64-biters Windows er nÃ¸dvendig
  nl_NL: 64-bit Windows is vereist
  fi: 64-bittinen Windows on pakollinen
  es: Windows de 64 bits es requerido
  da: 64-bit Windows er pÃ¥krÃ¦vet
appRunning:
  en: "${PRODUCT_NAME} is running.\nClick OK to close it."
  de: "${PRODUCT_NAME} ist geÃ¶ffnet. \nKlicken Sie zum Schliessen auf Â«OKÂ»."
  it: "${PRODUCT_NAME} Ã¨ in esecuzione. \nPremi OK per chiudere."
  fr: "${PRODUCT_NAME} est en cours dâ€™utilisation. \nCliquez sur Â«OKÂ» pour fermer ce programme."
  ja: "${PRODUCT_NAME} ã�Œå®Ÿè¡Œä¸­ã�§ã�™ã€‚\nOK ã‚’ã‚¯ãƒªãƒƒã‚¯ã�™ã‚‹ã�¨çµ‚äº†ã�—ã�¾ã�™ã€‚"
  ko: "${PRODUCT_NAME}ì�´(ê°€) ì‹¤í–‰ ì¤‘ìž…ë‹ˆë‹¤. \nOKì�„ í�´ë¦­í•˜ë©´ ì¢…ë£Œë�©ë‹ˆë‹¤."
  ru: "ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ ${PRODUCT_NAME} ÑƒÐ¶Ðµ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð¾.\nÐ�Ð°Ð¶Ð¼Ð¸Ñ‚Ðµ OK Ð´Ð»Ñ� Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ�."
  sk: "${PRODUCT_NAME} prÃ¡ve beÅ¾Ã­.\nUkonÄ�ite ho kliknutÃ­m na OK."
  hu: "${PRODUCT_NAME} Ã©ppen fut. \nKattiontson az Â«OKÂ»-ra a bezÃ¡rÃ¡sÃ¡hoz."
  pl: "${PRODUCT_NAME} jest otwarty. Aby zamknÄ…Ä‡ kliknij na OK."
  pt_BR: "${PRODUCT_NAME} estÃ¡ em execuÃ§Ã£o.\nClique em OK para fechar."
  zh_CN: "${PRODUCT_NAME} æ­£åœ¨è¿�è¡Œ.\nç‚¹å‡» OK å…³é—­."
  tr_TR: "${PRODUCT_NAME} Ã§alÄ±ÅŸÄ±yor.\nKapatmak iÃ§in Tamam'Ä± tÄ±klayÄ±n."
  sv_SE: "${PRODUCT_NAME} kÃ¶rs. \nKlicka pÃ¥ OK fÃ¶r att stÃ¤nga det."
  no: "${PRODUCT_NAME} kjÃ¸rer. \nKlikk OK for Ã¥ lukke det."
  nl_NL: "${PRODUCT_NAME} draait. \nKlik op 'OK' om het te sluiten."
  fi: "${PRODUCT_NAME} on kÃ¤ynnissÃ¤. Napsauta OK sulkeaksesi sen."
  es: "${PRODUCT_NAME} se estÃ¡ ejecutando. Haz clic en Aceptar para cerrarlo."
  da: "${PRODUCT_NAME} er i gang. Klik OK for at lukke."
installing:
  en: Installing, please wait...
  de: Installation lÃ¤uft, bitte warten...
  it: Attendere prego. Installazione in corso...
  fr: En cours dâ€™installation... Veuillez patienter s'il vous plaÃ®t.
  ja: ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�—ã�¦ã�„ã�¾ã�™ã€‚ã�—ã�°ã‚‰ã��ã�Šå¾…ã�¡ã��ã� ã�•ã�„...
  ko: ì„¤ì¹˜í•˜ê³  ìžˆìŠµë‹ˆë‹¤. ìž ì‹œ ê¸°ë‹¤ë ¤ì£¼ì‹­ì‹œì˜¤...
  ru: Ð£Ñ�Ñ‚Ð°Ð½Ð¾Ð²ÐºÐ°, Ð¿Ð¾Ð¶Ð°Ð»ÑƒÐ¹Ñ�Ñ‚Ð°, Ð¿Ð¾Ð´Ð¾Ð¶Ð´Ð¸Ñ‚Ðµ...
  sk: InÅ¡talujem, prosÃ­m poÄ�kajte...
  hu: TelepÃ­tÃ©s, kÃ©rem vÃ¡rjon...
  pl: Zaczekaj na ukoÅ„czenie instalacji...
  pt_BR: Instalando, por favor aguarde...
  zh_CN: æ­£åœ¨å®‰è£…, è¯·ç¨�å€™...
  tr_TR: YÃ¼kleniyor, lÃ¼tfen bekleyin...
  sv_SE: Installerar, vÃ¤nligen vÃ¤nta...
  no: Installerer, vennligst vent...
  nl_NL: Installeren, even geduld...
  fi: Asennetaan, odota...
  es: Instalando, espera un momento...
  da: Installerer, vent venligst...
areYouSureToUninstall:
  en: Are you sure you want to uninstall ${PRODUCT_NAME}?
  de: Sind Sie sicher, dass Sie ${PRODUCT_NAME} deinstallieren mÃ¶chten?
  it: Sicuro di voler procedere alla disinstallazione di ${PRODUCT_NAME}?
  fr: Etes-vous sÃ»r(e) de vouloir dÃ©sinstaller ${PRODUCT_NAME}?
  ja: ${PRODUCT_NAME} ã‚’ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�—ã�¦ã‚‚ã‚ˆã‚�ã�—ã�„ã�§ã�™ã�‹ï¼Ÿ
  ko: ${PRODUCT_NAME}ì�„(ë¥¼) ì œê±° í•˜ì‹œê² ìŠµë‹ˆê¹Œ?
  ru: Ð’Ñ‹ ÑƒÐ²ÐµÑ€ÐµÐ½Ñ‹, Ñ‡Ñ‚Ð¾ Ñ…Ð¾Ñ‚Ð¸Ñ‚Ðµ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ ${PRODUCT_NAME}?
  sk: Ste si istÃ½ Å¾e chcete odinÅ¡talovaÅ¥ ${PRODUCT_NAME}?
  hu: Biztos benne, hogy szeretnÃ© eltÃ¡volÃ­tani a ${PRODUCT_NAME} alkalmazÃ¡st?
  pl: Czy na pewno chcesz odinstalowaÄ‡ ${PRODUCT_NAME}?
  pt_BR: Tem certeza que deseja desinstalar ${PRODUCT_NAME}?
  zh_CN: ç¡®å®šå�¸è½½ ${PRODUCT_NAME} å�—ï¼Ÿ
  tr_TR: ${PRODUCT_NAME} kaldÄ±rmak istediÄŸinize Eminmisiniz?
  sv_SE: Ã„r du sÃ¤ker pÃ¥ att du vill avinstallera ${PRODUCT_NAME}?
  no: Er du sikker pÃ¥ at du vil avinstallere ${PRODUCT_NAME}?
  nl_NL: Weet je zeker dat je ${PRODUCT_NAME} wilt verwijderen?
  fi: Oletko varma, ettÃ¤ haluat poistaa ${PRODUCT_NAME} asennuksen?
  es: Â¿Seguro que quieres desinstalar ${PRODUCT_NAME}?
  da: Er du sikker pÃ¥, at du vil afinstallere ${PRODUCT_NAME}?
!include FileFunc.nsh
!include UAC.nsh

!define FOLDERID_UserProgramFiles {5CD7AEE2-2219-4A67-B85D-6C9CE15660CB}
!define KF_FLAG_CREATE 0x00008000

# allow user to define own custom
!define /ifndef INSTALL_REGISTRY_KEY "Software\${APP_GUID}"
!define /ifndef UNINSTALL_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_APP_KEY}"

# current Install Mode ("all" or "CurrentUser")
Var installMode

!ifndef INSTALL_MODE_PER_ALL_USERS
  !ifndef ONE_CLICK
    Var hasPerUserInstallation
    Var hasPerMachineInstallation
  !endif
  Var PerUserInstallationFolder

  !macro setInstallModePerUser
    StrCpy $installMode CurrentUser
    SetShellVarContext current

    # Ñ�hecks registry for previous installation path
    ReadRegStr $perUserInstallationFolder HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation
    ${if} $perUserInstallationFolder != ""
      StrCpy $INSTDIR $perUserInstallationFolder
    ${else}
      StrCpy $0 "$LocalAppData\Programs"
      System::Store S
      # Win7 has a per-user programfiles known folder and this can be a non-default location
      System::Call 'SHELL32::SHGetKnownFolderPath(g "${FOLDERID_UserProgramFiles}", i ${KF_FLAG_CREATE}, p 0, *p .r2)i.r1'
      ${If} $1 == 0
        System::Call '*$2(&w${NSIS_MAX_STRLEN} .s)'
        StrCpy $0 $1
        System::Call 'OLE32::CoTaskMemFree(p r2)'
      ${endif}
      System::Store L
      StrCpy $INSTDIR "$0\${APP_FILENAME}"
    ${endif}

    # allow /D switch to override installation path https://github.com/electron-userland/electron-builder/issues/1551
    ${StdUtils.GetParameter} $R0 "D" ""
    ${If} $R0 != ""
      StrCpy $INSTDIR $R0
    ${endif}

  !macroend
!endif

!ifdef INSTALL_MODE_PER_ALL_USERS_REQUIRED
  Var perMachineInstallationFolder

  !macro setInstallModePerAllUsers
    StrCpy $installMode all
    SetShellVarContext all

    !ifdef BUILD_UNINSTALLER
      ${IfNot} ${UAC_IsAdmin}
        ShowWindow $HWNDPARENT ${SW_HIDE}
        !insertmacro UAC_RunElevated
        Quit
      ${endif}
    !endif

    # Ñ�heck registry for previous installation path
    ReadRegStr $perMachineInstallationFolder HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation
    ${if} $perMachineInstallationFolder != ""
      StrCpy $INSTDIR $perMachineInstallationFolder
    ${else}
      StrCpy $0 "$PROGRAMFILES"
      !ifdef APP_64
        ${if} ${RunningX64}
          StrCpy $0 "$PROGRAMFILES64"
        ${endif}
      !endif

      !ifdef MENU_FILENAME
        StrCpy $0 "$0\${MENU_FILENAME}"
      !endif

      StrCpy $INSTDIR "$0\${APP_FILENAME}"
    ${endif}

    # allow /D switch to override installation path https://github.com/electron-userland/electron-builder/issues/1551
    ${StdUtils.GetParameter} $R0 "D" ""
    ${If} $R0 != ""
      StrCpy $INSTDIR $R0
    ${endif}

  !macroend
!endif
!include nsDialogs.nsh

Var HasTwoAvailableOptions
Var RadioButtonLabel1
Var isForceMachineInstall
Var isForceCurrentInstall

!macro PAGE_INSTALL_MODE
  !insertmacro MUI_PAGE_INIT

  !insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE ""
  Var MultiUser.InstallModePage
  Var MultiUser.InstallModePage.Text
  Var MultiUser.InstallModePage.AllUsers
  Var MultiUser.InstallModePage.CurrentUser
  Var MultiUser.InstallModePage.ReturnValue

  !ifndef BUILD_UNINSTALLER
    !insertmacro FUNCTION_INSTALL_MODE_PAGE_FUNCTION MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID} ""
    PageEx custom
      PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
      Caption " "
    PageExEnd
  !else
    !insertmacro FUNCTION_INSTALL_MODE_PAGE_FUNCTION MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID} un.
    UninstPage custom un.multiUser.InstallModePre_${MUI_UNIQUEID} un.MultiUser.InstallModeLeave_${MUI_UNIQUEID}
  !endif
!macroend

!macro FUNCTION_INSTALL_MODE_PAGE_FUNCTION PRE LEAVE UNINSTALLER_FUNCPREFIX
	Function "${UNINSTALLER_FUNCPREFIX}${PRE}"
		${if} ${UAC_IsInnerInstance}
		${andIf} ${UAC_IsAdmin}
		  # inner Process (and Admin) - skip selection, inner process is always used for elevation (machine-wide)
			!insertmacro setInstallModePerAllUsers
			Abort
		${endIf}

		StrCpy $isForceMachineInstall "0"
		StrCpy $isForceCurrentInstall "0"
		!ifmacrodef customInstallmode
		  !insertmacro customInstallMode
		!endif

    ${if} $isForceMachineInstall == "1"
    ${OrIf} ${isForAllUsers}
      StrCpy $hasPerMachineInstallation "1"
      StrCpy $hasPerUserInstallation "0"
      ${ifNot} ${UAC_IsAdmin}
        ShowWindow $HWNDPARENT ${SW_HIDE}
        !insertmacro UAC_RunElevated
        Quit
      ${endIf}

      !insertmacro setInstallModePerAllUsers
      Abort
    ${endIf}

    ${if} $isForceCurrentInstall == "1"
    ${OrIf} ${isForCurrentUser}
      StrCpy $hasPerMachineInstallation "0"
      StrCpy $hasPerUserInstallation "1"
      !insertmacro setInstallModePerUser
      Abort
    ${endIf}

		# If uninstalling, will check if there is both a per-user and per-machine installation. If there is only one, will skip the form.
	  # If uninstallation was invoked from the "add/remove programs" Windows will automatically requests elevation (depending if uninstall keys are in HKLM or HKCU)
		# so (for uninstallation) just checking UAC_IsAdmin would probably be enought to determine if it's a per-user or per-machine. However, user can run the uninstall.exe from the folder itself
		!ifdef BUILD_UNINSTALLER
			${if} $hasPerUserInstallation == "1"
      ${andif} $hasPerMachineInstallation == "0"
				!insertmacro setInstallModePerUser
				Abort
			${elseIf} $hasPerUserInstallation == "0"
      ${andIf} $hasPerMachineInstallation == "1"
				${IfNot} ${UAC_IsAdmin}
          ShowWindow $HWNDPARENT ${SW_HIDE}
          !insertmacro UAC_RunElevated
          Quit
        ${endIf}

				!insertmacro setInstallModePerAllUsers
				Abort
			${endIf}

      !insertmacro MUI_HEADER_TEXT "$(chooseUninstallationOptions)" "$(whichInstallationShouldBeRemoved)"
		!else
      !insertmacro MUI_HEADER_TEXT "$(chooseInstallationOptions)" "$(whoShouldThisApplicationBeInstalledFor)"
		!endif

    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
		nsDialogs::Create 1018
		Pop $MultiUser.InstallModePage

		!ifndef BUILD_UNINSTALLER
			${NSD_CreateLabel} 0u 0u 300u 20u "$(selectUserMode)"
			StrCpy $8 "$(forAll)"
			StrCpy $9 "$(onlyForMe)"
		!else
			${NSD_CreateLabel} 0u 0u 300u 20u "$(whichInstallationRemove)"
			StrCpy $8 "$(forAll)"
			StrCpy $9 "$(onlyForMe)"
		!endif
		Pop $MultiUser.InstallModePage.Text

		${NSD_CreateRadioButton} 10u 30u 280u 20u "$8"
		Pop $MultiUser.InstallModePage.AllUsers
		${IfNot} ${UAC_IsAdmin}
			!ifdef MULTIUSER_INSTALLMODE_ALLOW_ELEVATION
				StrCpy $HasTwoAvailableOptions 1
			!else
			  # since radio button is disabled, we add that comment to the disabled control itself
				SendMessage $MultiUser.InstallModePage.AllUsers ${WM_SETTEXT} 0 "STR:$8 (must run as admin)"
				EnableWindow $MultiUser.InstallModePage.AllUsers 0 # start out disabled
				StrCpy $HasTwoAvailableOptions 0
			!endif
		${else}
			StrCpy $HasTwoAvailableOptions 1
		${endif}

		System::Call "advapi32::GetUserName(t.r0,*i${NSIS_MAX_STRLEN})i"
		${NSD_CreateRadioButton} 10u 50u 280u 20u "$9 ($0)"
		Pop $MultiUser.InstallModePage.CurrentUser

		nsDialogs::SetUserData $MultiUser.InstallModePage.AllUsers 1 ; Install for All Users (1, pra exibir o icone SHIELD de elevation)
		nsDialogs::SetUserData $MultiUser.InstallModePage.CurrentUser 0	; Install for Single User (0 pra nÃ£o exibir)

		${if} $HasTwoAvailableOptions == "1" ; if there are 2 available options, bind to radiobutton change
			${NSD_OnClick} $MultiUser.InstallModePage.CurrentUser ${UNINSTALLER_FUNCPREFIX}InstModeChange
			${NSD_OnClick} $MultiUser.InstallModePage.AllUsers ${UNINSTALLER_FUNCPREFIX}InstModeChange
		${endif}

		${NSD_CreateLabel} 0u 110u 280u 50u ""
		Pop $RadioButtonLabel1

		${if} $installMode == "all"
			SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0 ; set as default
			SendMessage $MultiUser.InstallModePage.AllUsers ${BM_CLICK} 0 0 ; trigger click event
		${else}
			SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0 ; set as default
			SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_CLICK} 0 0 ; trigger click event
		${endif}

		!insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
		nsDialogs::Show
	FunctionEnd

	Function "${UNINSTALLER_FUNCPREFIX}${LEAVE}"
		SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue

		${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED}
			${IfNot} ${UAC_IsAdmin}
        ShowWindow $HWNDPARENT ${SW_HIDE}
        !insertmacro UAC_RunElevated
        ${Switch} $0
          ${Case} 0
            ${If} $1 = 1
              Quit ;we are the outer process, the inner process has done its work (ExitCode is $2), we are done
            ${EndIf}
            ${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user
            ${OrIf} $2 = 0x666666 ;our special return, the new process was not admin after all
              MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "$(loginWithAdminAccount)"
            ${EndIf}
            ${Break}
          ${Case} 1223 ;user aborted
            ;MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "This option requires admin privileges, aborting!"
            ;Quit ; instead of quit just abort going to the next page, and stay in the radiobuttons
            ${Break}
          ${Case} 1062
            MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Logon service not running, aborting!" ; "Unable to elevate, Secondary Logon service not running!"
            ;Quit ; instead of quit just abort going to the next page, and stay in the radiobuttons
            ${Break}
          ${Default}
            MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Unable to elevate, error $0"
            ;Quit ; instead of quit just abort going to the next page, and stay in the radiobuttons
            ${Break}
        ${EndSwitch}

        ShowWindow $HWNDPARENT ${SW_SHOW}
        BringToFront
        Abort
      ${else}
        !insertmacro setInstallModePerAllUsers
			${endif}
		${else}
			!insertmacro setInstallModePerUser
		${endif}

		!insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
	FunctionEnd

	Function "${UNINSTALLER_FUNCPREFIX}InstModeChange"
		pop $1
		nsDialogs::GetUserData $1
		pop $1
		GetDlgItem $0 $hwndParent 1 ; get item 1 (next button) at parent window, store in $0 - (0 is back, 1 is next .. what about CANCEL? http://nsis.sourceforge.net/Buttons_Header )

		StrCpy $7 ""
		${if} "$1" == "0" ; current user
			${if} $hasPerUserInstallation == "1"
				!ifndef BUILD_UNINSTALLER
					StrCpy $7 "$(perUserInstallExists)($perUserInstallationFolder)$\r$\n$(reinstallUpgrade)"
				!else
					StrCpy $7 "$(perUserInstall)($perUserInstallationFolder)$\r$\n$(uninstall)"
				!endif
			${else}
				StrCpy $7 "$(freshInstallForCurrent)"
			${endif}
			SendMessage $0 ${BCM_SETSHIELD} 0 0 ; hide SHIELD
		${else} ; all users
			${if} $hasPerMachineInstallation == "1"
				!ifndef BUILD_UNINSTALLER
					StrCpy $7 "$(perMachineInstallExists)($perMachineInstallationFolder)$\r$\n$(reinstallUpgrade)"
				!else
					StrCpy $7 "$(perMachineInstall)($perMachineInstallationFolder)$\r$\n$(uninstall)"
				!endif
			${else}
				StrCpy $7 "$(freshInstallForAll)"
			${endif}
			${ifNot} ${UAC_IsAdmin}
				StrCpy $7 "$7"
				SendMessage $0 ${BCM_SETSHIELD} 0 1 ; display SHIELD
			${else}
				SendMessage $0 ${BCM_SETSHIELD} 0 0 ; hide SHIELD
			${endif}
		${endif}
		SendMessage $RadioButtonLabel1 ${WM_SETTEXT} 0 "STR:$7"
	FunctionEnd
!macroend
!ifndef BUILD_UNINSTALLER
  !ifmacrodef licensePage
    !insertmacro skipPageIfUpdated
    !insertmacro licensePage
  !endif
!endif

!insertmacro MUI_PAGE_INSTFILES
!ifdef BUILD_UNINSTALLER
  !insertmacro MUI_UNPAGE_INSTFILES
!endif

!macro initMultiUser
  !ifdef INSTALL_MODE_PER_ALL_USERS
    !insertmacro setInstallModePerAllUsers
  !else
    !insertmacro setInstallModePerUser
  !endif
!macroend!include "common.nsh"
!include "extractAppPackage.nsh"

WindowIcon Off
AutoCloseWindow True
RequestExecutionLevel ${REQUEST_EXECUTION_LEVEL}

SilentInstall silent

Function .onInit
  !insertmacro check64BitAndSetRegView
FunctionEnd

Section
  StrCpy $INSTDIR "$TEMP\${UNPACK_DIR_NAME}"
  RMDir /r $INSTDIR
	SetOutPath $INSTDIR

	!ifdef APP_DIR_64
    !ifdef APP_DIR_32
      ${if} ${RunningX64}
        File /r "${APP_DIR_64}\*.*"
      ${else}
        File /r "${APP_DIR_32}\*.*"
      ${endIf}
    !else
      File /r "${APP_DIR_64}\*.*"
    !endif
  !else
    !ifdef APP_DIR_32
      File /r "${APP_DIR_32}\*.*"
    !else
      !insertmacro extractEmbeddedAppPackage
    !endif
  !endif

  System::Call 'Kernel32::SetEnvironmentVariable(t, t)i ("PORTABLE_EXECUTABLE_DIR", "$EXEDIR").r0'
  System::Call 'Kernel32::SetEnvironmentVariable(t, t)i ("PORTABLE_EXECUTABLE_FILE", "$EXEPATH").r0'
  System::Call 'Kernel32::SetEnvironmentVariable(t, t)i ("PORTABLE_EXECUTABLE_APP_FILENAME", "${APP_FILENAME}").r0'
  ${StdUtils.GetAllParameters} $R0 0
	ExecWait "$INSTDIR\${APP_EXECUTABLE_FILENAME} $R0" $0
  SetErrorLevel $0

  SetOutPath $PLUGINSDIR
	RMDir /r $INSTDIR
SectionEnd
It is developer documentation. See [user documentation](https://electron.build/configuration/nsis).

http://www.mathiaswestin.net/2012/09/how-to-make-per-user-installation-with.html

https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx#FOLDERID_UserProgramFiles

https://github.com/Drizin/NsisMultiUser

NSIS vs Inno Setup â€” it is not easy to choose because both are far from ideal, e.g. inno also doesn't have built-in per-user installation implementation â€” http://stackoverflow.com/questions/34330668/inno-setup-custom-dialog-with-per-user-or-per-machine-installation.

http://stackoverflow.com/questions/2565215/checking-if-the-application-is-running-in-nsis-before-uninstalling

One-click installer: http://forums.winamp.com/showthread.php?t=300479

# GUID
See [docs](https://electron.build/configuration/nsis).

We use UUID v5 to generate sha-1 name-based UUID.

http://stackoverflow.com/questions/3029994/convert-uri-to-guid
https://alexandrebrisebois.wordpress.com/2013/11/14/create-predictable-guids-for-your-windows-azure-table-storage-entities/
https://github.com/Squirrel/Squirrel.Windows/pull/658

# Compression

NSIS LZMA compression is slower and worse compared to external `7za` compression. Slower because `7za` is multi-threaded, worse because LZMA codec implementation is outdated and BCJ2 filter is not enabled.
Difference for test app â€” 4 MB (before: 36.3 after: 32.8).

And compression time is also greatly reduced.

Since NSIS is awesome, no disadvantages in our approach â€” [compression is disabled](http://nsis.sourceforge.net/Reference/SetCompress) before `File /oname=app.7z "${APP_ARCHIVE}"` and enabled after (it is the reasons why `SOLID` compression is not used).
So, opposite to Squirrel.Windows, archive is not twice compressed.

So, in your custom NSIS scripts you should not use any compression instructions. Only `SetCompress` if you need to disable compression for already archived file.


Function un.onInit
  !insertmacro check64BitAndSetRegView

  ${IfNot} ${Silent}
    !ifdef ONE_CLICK
      MessageBox MB_OKCANCEL "$(areYouSureToUninstall)" IDOK +2
      Quit

      # one-click installer executes uninstall section in the silent mode, but we must show message dialog if silent mode was not explicitly set by user (using /S flag)
      !insertmacro CHECK_APP_RUNNING
      SetSilent silent
    !endif
  ${endIf}

  !insertmacro initMultiUser

  !ifmacrodef customUnInit
    !insertmacro customUnInit
  !endif
FunctionEnd

Section "un.install"
  !ifndef ONE_CLICK
    # for assisted installer we check it here to show progress
    !insertmacro CHECK_APP_RUNNING
  !endif

  !insertmacro setLinkVars

  ${ifNot} ${isKeepShortcuts}
    WinShell::UninstAppUserModelId "${APP_ID}"

    !ifndef DO_NOT_CREATE_DESKTOP_SHORTCUT
      WinShell::UninstShortcut "$oldDesktopLink"
      Delete "$oldDesktopLink"
    !endif

    !ifndef DO_NOT_CREATE_START_MENU_SHORTCUT
      WinShell::UninstShortcut "$oldStartMenuLink"

      Delete "$oldStartMenuLink"
      ReadRegStr $R1 SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" MenuDirectory
      ${ifNot} $R1 == ""
        RMDir "$SMPROGRAMS\$R1"
      ${endIf}
    !endif
  ${endIf}

  # refresh the desktop
  System::Call 'shell32::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'

  !ifmacrodef unregisterFileAssociations
    !insertmacro unregisterFileAssociations
  !endif

  # delete the installed files
  !ifmacrodef customRemoveFiles
    !insertmacro customRemoveFiles
  !else
    RMDir /r $INSTDIR
  !endif

  Var /GLOBAL isDeleteAppData
  StrCpy $isDeleteAppData "0"

  ClearErrors
  ${GetParameters} $R0
  ${GetOptions} $R0 "--delete-app-data" $R1
  ${if} ${Errors}
    !ifdef DELETE_APP_DATA_ON_UNINSTALL
      ${ifNot} ${isUpdated}
        StrCpy $isDeleteAppData "1"
      ${endif}
    !endif
  ${else}
    StrCpy $isDeleteAppData "1"
  ${endIf}

  ${if} $isDeleteAppData == "1"
    # electron always uses per user app data
    ${if} $installMode == "all"
      SetShellVarContext current
    ${endif}
    RMDir /r "$APPDATA\${APP_FILENAME}"
    !ifdef APP_PRODUCT_FILENAME
      RMDir /r "$APPDATA\${APP_PRODUCT_FILENAME}"
    !endif
    # electron use package.json name for cache,indexdb etc.
    !ifdef APP_PACKAGE_NAME
      RMDir /r "$APPDATA\${APP_PACKAGE_NAME}"
    !endif
    ${if} $installMode == "all"
      SetShellVarContext all
    ${endif}
  ${endif}

  DeleteRegKey SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}"
  !ifdef UNINSTALL_REGISTRY_KEY_2
    DeleteRegKey SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY_2}"
  !endif
  DeleteRegKey SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}"

  !ifmacrodef customUnInstall
    !insertmacro customUnInstall
  !endif

  !ifdef ONE_CLICK
    !insertmacro quitSuccess
  !endif
SectionEnd
; fileassoc.nsh
; File association helper macros
; Written by Saivert
;
; Features automatic backup system and UPDATEFILEASSOC macro for
; shell change notification.
;
; |> How to use <|
; To associate a file with an application so you can double-click it in explorer, use
; the APP_ASSOCIATE macro like this:
;
;   Example:
;   !insertmacro APP_ASSOCIATE "txt" "myapp.textfile" "Description of txt files" \
;     "$INSTDIR\myapp.exe,0" "Open with myapp" "$INSTDIR\myapp.exe $\"%1$\""
;
; Never insert the APP_ASSOCIATE macro multiple times, it is only ment
; to associate an application with a single file and using the
; the "open" verb as default. To add more verbs (actions) to a file
; use the APP_ASSOCIATE_ADDVERB macro.
;
;   Example:
;   !insertmacro APP_ASSOCIATE_ADDVERB "myapp.textfile" "edit" "Edit with myapp" \
;     "$INSTDIR\myapp.exe /edit $\"%1$\""
;
; To have access to more options when registering the file association use the
; APP_ASSOCIATE_EX macro. Here you can specify the verb and what verb is to be the
; standard action (default verb).
;
; Note, that this script takes into account user versus global installs.
; To properly work you must initialize the SHELL_CONTEXT variable via SetShellVarContext.
;
; And finally: To remove the association from the registry use the APP_UNASSOCIATE
; macro. Here is another example just to wrap it up:
;   !insertmacro APP_UNASSOCIATE "txt" "myapp.textfile"
;
; |> Note <|
; When defining your file class string always use the short form of your application title
; then a period (dot) and the type of file. This keeps the file class sort of unique.
;   Examples:
;   Winamp.Playlist
;   NSIS.Script
;   Photoshop.JPEGFile
;
; |> Tech info <|
; The registry key layout for a global file association is:
;
; HKEY_LOCAL_MACHINE\Software\Classes
;     <".ext"> = <applicationID>
;     <applicationID> = <"description">
;         shell
;             <verb> = <"menu-item text">
;                 command = <"command string">
;
;
; The registry key layout for a per-user file association is:
;
; HKEY_CURRENT_USER\Software\Classes
;     <".ext"> = <applicationID>
;     <applicationID> = <"description">
;         shell
;             <verb> = <"menu-item text">
;                 command = <"command string">
;

!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
  ; Backup the previously associated file class
  ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" ""
  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"

  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}"

  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" "open"
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}`
!macroend

!macro APP_ASSOCIATE_EX EXT FILECLASS DESCRIPTION ICON VERB DEFAULTVERB SHELLNEW COMMANDTEXT COMMAND
  ; Backup the previously associated file class
  ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" ""
  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"

  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}"
  StrCmp "${SHELLNEW}" "0" +2
  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}\ShellNew" "NullFile" ""

  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" `${DEFAULTVERB}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}`
!macroend

!macro APP_ASSOCIATE_ADDVERB FILECLASS VERB COMMANDTEXT COMMAND
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}`
!macroend

!macro APP_ASSOCIATE_REMOVEVERB FILECLASS VERB
  DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}\shell\${VERB}`
!macroend


!macro APP_UNASSOCIATE EXT FILECLASS
  ; Backup the previously associated file class
  ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" `${FILECLASS}_backup`
  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "$R0"

  DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}`
!macroend

!macro APP_ASSOCIATE_GETFILECLASS OUTPUT EXT
  ReadRegStr ${OUTPUT} SHELL_CONTEXT "Software\Classes\.${EXT}" ""
!macroend


; !defines for use with SHChangeNotify
!ifdef SHCNE_ASSOCCHANGED
!undef SHCNE_ASSOCCHANGED
!endif
!define SHCNE_ASSOCCHANGED 0x08000000
!ifdef SHCNF_FLUSH
!undef SHCNF_FLUSH
!endif
!define SHCNF_FLUSH        0x1000

!macro UPDATEFILEASSOC
; Using the system.dll plugin to call the SHChangeNotify Win32 API function so we
; can update the shell.
  System::Call "shell32::SHChangeNotify(i,i,i,i) (${SHCNE_ASSOCCHANGED}, ${SHCNF_FLUSH}, 0, 0)"
!macroend#################################################################################
# StdUtils plug-in for NSIS
# Copyright (C) 2004-2018 LoRd_MuldeR <MuldeR2@GMX.de>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
#
# http://www.gnu.org/licenses/lgpl-2.1.txt
#################################################################################

# DEVELOPER NOTES:
# - Please see "https://github.com/lordmulder/stdutils/" for news and updates!
# - Please see "Docs\StdUtils\StdUtils.html" for detailed function descriptions!
# - Please see "Examples\StdUtils\StdUtilsTest.nsi" for usage examples!

#################################################################################
# FUNCTION DECLARTIONS
#################################################################################

!ifndef ___STDUTILS__NSH___
!define ___STDUTILS__NSH___

!define StdUtils.Time             '!insertmacro _StdU_Time'          #time(), as in C standard library
!define StdUtils.GetMinutes       '!insertmacro _StdU_GetMinutes'    #GetSystemTimeAsFileTime(), returns the number of minutes
!define StdUtils.GetHours         '!insertmacro _StdU_GetHours'      #GetSystemTimeAsFileTime(), returns the number of hours
!define StdUtils.GetDays          '!insertmacro _StdU_GetDays'       #GetSystemTimeAsFileTime(), returns the number of days
!define StdUtils.Rand             '!insertmacro _StdU_Rand'          #rand(), as in C standard library
!define StdUtils.RandMax          '!insertmacro _StdU_RandMax'       #rand(), as in C standard library, with maximum value
!define StdUtils.RandMinMax       '!insertmacro _StdU_RandMinMax'    #rand(), as in C standard library, with minimum/maximum value
!define StdUtils.RandList         '!insertmacro _StdU_RandList'      #rand(), as in C standard library, with list support
!define StdUtils.RandBytes        '!insertmacro _StdU_RandBytes'     #Generates random bytes, returned as Base64-encoded string
!define StdUtils.FormatStr        '!insertmacro _StdU_FormatStr'     #sprintf(), as in C standard library, one '%d' placeholder
!define StdUtils.FormatStr2       '!insertmacro _StdU_FormatStr2'    #sprintf(), as in C standard library, two '%d' placeholders
!define StdUtils.FormatStr3       '!insertmacro _StdU_FormatStr3'    #sprintf(), as in C standard library, three '%d' placeholders
!define StdUtils.ScanStr          '!insertmacro _StdU_ScanStr'       #sscanf(), as in C standard library, one '%d' placeholder
!define StdUtils.ScanStr2         '!insertmacro _StdU_ScanStr2'      #sscanf(), as in C standard library, two '%d' placeholders
!define StdUtils.ScanStr3         '!insertmacro _StdU_ScanStr3'      #sscanf(), as in C standard library, three '%d' placeholders
!define StdUtils.TrimStr          '!insertmacro _StdU_TrimStr'       #Remove whitspaces from string, left and right
!define StdUtils.TrimStrLeft      '!insertmacro _StdU_TrimStrLeft'   #Remove whitspaces from string, left side only
!define StdUtils.TrimStrRight     '!insertmacro _StdU_TrimStrRight'  #Remove whitspaces from string, right side only
!define StdUtils.RevStr           '!insertmacro _StdU_RevStr'        #Reverse a string, e.g. "reverse me" <-> "em esrever"
!define StdUtils.ValidFileName    '!insertmacro _StdU_ValidFileName' #Test whether string is a valid file name - no paths allowed
!define StdUtils.ValidPathSpec    '!insertmacro _StdU_ValidPathSpec' #Test whether string is a valid full(!) path specification
!define StdUtils.ValidDomainName  '!insertmacro _StdU_ValidDomain'   #Test whether string is a valid host name or domain name
!define StdUtils.StrToUtf8        '!insertmacro _StdU_StrToUtf8'     #Convert string from Unicode (UTF-16) or ANSI to UTF-8 bytes
!define StdUtils.StrFromUtf8      '!insertmacro _StdU_StrFromUtf8'   #Convert string from UTF-8 bytes to Unicode (UTF-16) or ANSI
!define StdUtils.SHFileMove       '!insertmacro _StdU_SHFileMove'    #SHFileOperation(), using the FO_MOVE operation
!define StdUtils.SHFileCopy       '!insertmacro _StdU_SHFileCopy'    #SHFileOperation(), using the FO_COPY operation
!define StdUtils.AppendToFile     '!insertmacro _StdU_AppendToFile'  #Append contents of an existing file to another file
!define StdUtils.ExecShellAsUser  '!insertmacro _StdU_ExecShlUser'   #ShellExecute() as NON-elevated user from elevated installer
!define StdUtils.InvokeShellVerb  '!insertmacro _StdU_InvkeShlVrb'   #Invokes a "shell verb", e.g. for pinning items to the taskbar
!define StdUtils.ExecShellWaitEx  '!insertmacro _StdU_ExecShlWaitEx' #ShellExecuteEx(), returns the handle of the new process
!define StdUtils.WaitForProcEx    '!insertmacro _StdU_WaitForProcEx' #WaitForSingleObject(), e.g. to wait for a running process
!define StdUtils.GetParameter     '!insertmacro _StdU_GetParameter'  #Get the value of a specific command-line option
!define StdUtils.TestParameter    '!insertmacro _StdU_TestParameter' #Test whether a specific command-line option has been set
!define StdUtils.ParameterCnt     '!insertmacro _StdU_ParameterCnt'  #Get number of command-line tokens, similar to argc in main()
!define StdUtils.ParameterStr     '!insertmacro _StdU_ParameterStr'  #Get the n-th command-line token, similar to argv[i] in main()
!define StdUtils.GetAllParameters '!insertmacro _StdU_GetAllParams'  #Get complete command-line, but without executable name
!define StdUtils.GetRealOSVersion '!insertmacro _StdU_GetRealOSVer'  #Get the *real* Windows version number, even on Windows 8.1+
!define StdUtils.GetRealOSBuildNo '!insertmacro _StdU_GetRealOSBld'  #Get the *real* Windows build number, even on Windows 8.1+
!define StdUtils.GetRealOSName    '!insertmacro _StdU_GetRealOSStr'  #Get the *real* Windows version, as a "friendly" name
!define StdUtils.GetOSEdition     '!insertmacro _StdU_GetOSEdition'  #Get the Windows edition, i.e. "workstation" or "server"
!define StdUtils.GetOSReleaseId   '!insertmacro _StdU_GetOSRelIdNo'  #Get the Windows release identifier (on Windows 10)
!define StdUtils.VerifyOSVersion  '!insertmacro _StdU_VrfyRealOSVer' #Compare *real* operating system to an expected version number
!define StdUtils.VerifyOSBuildNo  '!insertmacro _StdU_VrfyRealOSBld' #Compare *real* operating system to an expected build number
!define StdUtils.HashText         '!insertmacro _StdU_HashText'      #Compute hash from text string (CRC32, MD5, SHA1/2/3, BLAKE2)
!define StdUtils.HashFile         '!insertmacro _StdU_HashFile'      #Compute hash from file (CRC32, MD5, SHA1/2/3, BLAKE2)
!define StdUtils.NormalizePath    '!insertmacro _StdU_NormalizePath' #Simplifies the path to produce a direct, well-formed path
!define StdUtils.GetParentPath    '!insertmacro _StdU_GetParentPath' #Get parent path by removing the last component from the path
!define StdUtils.SplitPath        '!insertmacro _StdU_SplitPath'     #Split the components of the given path
!define StdUtils.GetDrivePart     '!insertmacro _StdU_GetDrivePart'  #Get drive component of path
!define StdUtils.GetDirectoryPart '!insertmacro _StdU_GetDirPart'    #Get directory component of path
!define StdUtils.GetFileNamePart  '!insertmacro _StdU_GetFNamePart'  #Get file name component of path
!define StdUtils.GetExtensionPart '!insertmacro _StdU_GetExtnPart'   #Get file extension component of path
!define StdUtils.TimerCreate      '!insertmacro _StdU_TimerCreate'   #Create a new event-timer that will be triggered periodically
!define StdUtils.TimerDestroy     '!insertmacro _StdU_TimerDestroy'  #Destroy a running timer created with TimerCreate()
!define StdUtils.ProtectStr       '!insertmacro _StdU_PrtctStr'      #Protect a given String using Windows' DPAPI
!define StdUtils.UnprotectStr     '!insertmacro _StdU_UnprtctStr'    #Unprotect a string that was protected via ProtectStr()
!define StdUtils.GetLibVersion    '!insertmacro _StdU_GetLibVersion' #Get the current StdUtils library version (for debugging)
!define StdUtils.SetVerbose       '!insertmacro _StdU_SetVerbose'    #Enable or disable "verbose" mode (for debugging)


#################################################################################
# MACRO DEFINITIONS
#################################################################################

!macro _StdU_Time out
	StdUtils::Time /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetMinutes out
	StdUtils::GetMinutes /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetHours out
	StdUtils::GetHours /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetDays out
	StdUtils::GetDays /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_Rand out
	StdUtils::Rand /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_RandMax out max
	push ${max}
	StdUtils::RandMax /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_RandMinMax out min max
	push ${min}
	push ${max}
	StdUtils::RandMinMax /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_RandList count max
	push ${max}
	push ${count}
	StdUtils::RandList /NOUNLOAD
!macroend

!macro _StdU_RandBytes out count
	push ${count}
	StdUtils::RandBytes /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_FormatStr out format val
	push `${format}`
	push ${val}
	StdUtils::FormatStr /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_FormatStr2 out format val1 val2
	push `${format}`
	push ${val1}
	push ${val2}
	StdUtils::FormatStr2 /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_FormatStr3 out format val1 val2 val3
	push `${format}`
	push ${val1}
	push ${val2}
	push ${val3}
	StdUtils::FormatStr3 /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ScanStr out format input default
	push `${format}`
	push `${input}`
	push ${default}
	StdUtils::ScanStr /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ScanStr2 out1 out2 format input default1 default2
	push `${format}`
	push `${input}`
	push ${default1}
	push ${default2}
	StdUtils::ScanStr2 /NOUNLOAD
	pop ${out1}
	pop ${out2}
!macroend

!macro _StdU_ScanStr3 out1 out2 out3 format input default1 default2 default3
	push `${format}`
	push `${input}`
	push ${default1}
	push ${default2}
	push ${default3}
	StdUtils::ScanStr3 /NOUNLOAD
	pop ${out1}
	pop ${out2}
	pop ${out3}
!macroend

!macro _StdU_TrimStr var
	push ${var}
	StdUtils::TrimStr /NOUNLOAD
	pop ${var}
!macroend

!macro _StdU_TrimStrLeft var
	push ${var}
	StdUtils::TrimStrLeft /NOUNLOAD
	pop ${var}
!macroend

!macro _StdU_TrimStrRight var
	push ${var}
	StdUtils::TrimStrRight /NOUNLOAD
	pop ${var}
!macroend

!macro _StdU_RevStr var
	push ${var}
	StdUtils::RevStr /NOUNLOAD
	pop ${var}
!macroend

!macro _StdU_ValidFileName out test
	push `${test}`
	StdUtils::ValidFileName /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ValidPathSpec out test
	push `${test}`
	StdUtils::ValidPathSpec /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ValidDomain out test
	push `${test}`
	StdUtils::ValidDomainName /NOUNLOAD
	pop ${out}
!macroend


!macro _StdU_StrToUtf8 out str
	push `${str}`
	StdUtils::StrToUtf8 /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_StrFromUtf8 out trnc str
	push ${trnc}
	push `${str}`
	StdUtils::StrFromUtf8 /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_SHFileMove out from to hwnd
	push `${from}`
	push `${to}`
	push ${hwnd}
	StdUtils::SHFileMove /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_SHFileCopy out from to hwnd
	push `${from}`
	push `${to}`
	push ${hwnd}
	StdUtils::SHFileCopy /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_AppendToFile out from dest offset maxlen
	push `${from}`
	push `${dest}`
	push ${offset}
	push ${maxlen}
	StdUtils::AppendToFile /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ExecShlUser out file verb args
	push `${file}`
	push `${verb}`
	push `${args}`
	StdUtils::ExecShellAsUser /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_InvkeShlVrb out path file verb_id
	push "${path}"
	push "${file}"
	push ${verb_id}
	StdUtils::InvokeShellVerb /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ExecShlWaitEx out_res out_val file verb args
	push `${file}`
	push `${verb}`
	push `${args}`
	StdUtils::ExecShellWaitEx /NOUNLOAD
	pop ${out_res}
	pop ${out_val}
!macroend

!macro _StdU_WaitForProcEx out handle
	push `${handle}`
	StdUtils::WaitForProcEx /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetParameter out name default
	push `${name}`
	push `${default}`
	StdUtils::GetParameter /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_TestParameter out name
	push `${name}`
	StdUtils::TestParameter /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ParameterCnt out
	StdUtils::ParameterCnt /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ParameterStr out index
	push ${index}
	StdUtils::ParameterStr /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetAllParams out truncate
	push `${truncate}`
	StdUtils::GetAllParameters /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetRealOSVer out_major out_minor out_spack
	StdUtils::GetRealOsVersion /NOUNLOAD
	pop ${out_major}
	pop ${out_minor}
	pop ${out_spack}
!macroend

!macro _StdU_GetRealOSBld out
	StdUtils::GetRealOsBuildNo /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetRealOSStr out
	StdUtils::GetRealOsName /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_VrfyRealOSVer out major minor spack
	push `${major}`
	push `${minor}`
	push `${spack}`
	StdUtils::VerifyRealOsVersion /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_VrfyRealOSBld out build
	push `${build}`
	StdUtils::VerifyRealOsBuildNo /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetOSEdition out
	StdUtils::GetOsEdition /NOUNLOAD
	pop ${out}
!macroend


!macro _StdU_GetOSRelIdNo out
	StdUtils::GetOsReleaseId /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_HashText out type text
	push `${type}`
	push `${text}`
	StdUtils::HashText /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_HashFile out type file
	push `${type}`
	push `${file}`
	StdUtils::HashFile /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_NormalizePath out path
	push `${path}`
	StdUtils::NormalizePath /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetParentPath out path
	push `${path}`
	StdUtils::GetParentPath /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_SplitPath out_drive out_dir out_fname out_ext path
	push `${path}`
	StdUtils::SplitPath /NOUNLOAD
	pop ${out_drive}
	pop ${out_dir}
	pop ${out_fname}
	pop ${out_ext}
!macroend

!macro _StdU_GetDrivePart out path
	push `${path}`
	StdUtils::GetDrivePart /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetDirPart out path
	push `${path}`
	StdUtils::GetDirectoryPart /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetFNamePart out path
	push `${path}`
	StdUtils::GetFileNamePart /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetExtnPart out path
	push `${path}`
	StdUtils::GetExtensionPart /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_TimerCreate out callback interval
	GetFunctionAddress ${out} ${callback}
	push ${out}
	push ${interval}
	StdUtils::TimerCreate /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_TimerDestroy out timer_id
	push ${timer_id}
	StdUtils::TimerDestroy /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_PrtctStr out dpsc salt text
	push `${dpsc}`
	push `${salt}`
	push `${text}`
	StdUtils::ProtectStr /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_UnprtctStr out trnc salt data
	push `${trnc}`
	push `${salt}`
	push `${data}`
	StdUtils::UnprotectStr /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetLibVersion out_ver out_tst
	StdUtils::GetLibVersion /NOUNLOAD
	pop ${out_ver}
	pop ${out_tst}
!macroend

!macro _StdU_SetVerbose enable
	Push ${enable}
	StdUtils::SetVerboseMode /NOUNLOAD
!macroend


#################################################################################
# MAGIC NUMBERS
#################################################################################

!define StdUtils.Const.ShellVerb.PinToTaskbar     0
!define StdUtils.Const.ShellVerb.UnpinFromTaskbar 1
!define StdUtils.Const.ShellVerb.PinToStart       2
!define StdUtils.Const.ShellVerb.UnpinFromStart   3

!endif # !___STDUTILS__NSH___
; StrContains
; This function does a case sensitive searches for an occurrence of a substring in a string. 
; It returns the substring if it is found. 
; Otherwise it returns null(""). 
; Written by kenglish_hi
; Adapted from StrReplace written by dandaman32
 
 
Var STR_HAYSTACK
Var STR_NEEDLE
Var STR_CONTAINS_VAR_1
Var STR_CONTAINS_VAR_2
Var STR_CONTAINS_VAR_3
Var STR_CONTAINS_VAR_4
Var STR_RETURN_VAR
 
Function StrContains
  Exch $STR_NEEDLE
  Exch 1
  Exch $STR_HAYSTACK
  ; Uncomment to debug
  ;MessageBox MB_OK 'STR_NEEDLE = $STR_NEEDLE STR_HAYSTACK = $STR_HAYSTACK '
    StrCpy $STR_RETURN_VAR ""
    StrCpy $STR_CONTAINS_VAR_1 -1
    StrLen $STR_CONTAINS_VAR_2 $STR_NEEDLE
    StrLen $STR_CONTAINS_VAR_4 $STR_HAYSTACK
    loop:
      IntOp $STR_CONTAINS_VAR_1 $STR_CONTAINS_VAR_1 + 1
      StrCpy $STR_CONTAINS_VAR_3 $STR_HAYSTACK $STR_CONTAINS_VAR_2 $STR_CONTAINS_VAR_1
      StrCmp $STR_CONTAINS_VAR_3 $STR_NEEDLE found
      StrCmp $STR_CONTAINS_VAR_1 $STR_CONTAINS_VAR_4 done
      Goto loop
    found:
      StrCpy $STR_RETURN_VAR $STR_NEEDLE
      Goto done
    done:
   Pop $STR_NEEDLE ;Prevent "invalid opcode" errors and keep the
   Exch $STR_RETURN_VAR  
FunctionEnd
 
!macro _StrContainsConstructor OUT NEEDLE HAYSTACK
  Push `${HAYSTACK}`
  Push `${NEEDLE}`
  Call StrContains
  Pop `${OUT}`
!macroend
 
!define StrContains '!insertmacro "_StrContainsConstructor"'/*** UAC Plug-in ***

Interactive User (MediumIL)        Admin user (HighIL)
***[Setup.exe]*************      ***[Setup.exe]**************
*                         *      *                          *
* +++[.OnInit]+++++++++++ *      * +++[.OnInit]++++++++++++ *
* + UAC_RunElevated >---+-+----> * +                      + *
* + NSIS.Quit           + *      * +                      + *
* +++++++++++++++++++++++ *      * ++++++++++++++++++++++++ *
*                         *      *                          *
*                         *      *                          *
* +++[Section]+++++++++++ *      * +++[Section]++++++++++++ *
* +                     + *   /--+-+-<UAC_AsUser_ExecShell+ *
* +++++++++++++++++++++++ *   |  * ++++++++++++++++++++++++ *
*                         *   |  *                          *
*  Win32.ShellExecute <---+--/   *                          *
*                         *      *                          *
***************************      ****************************

*/

!ifndef UAC_HDR__INC
!verbose push
!verbose 3
!ifndef UAC_VERBOSE  
	!define UAC_VERBOSE 3
!endif
!verbose ${UAC_VERBOSE}

!define UAC_HDR__INC 0x00020400 ;MMmmbbrr

!include LogicLib.nsh



/* UAC_RunElevated
**
** Starts the elevation operation.
**
** Return values:
**
** $0: Win32 error code (0 on success, 1223 if user aborted elevation dialog, anything else should be treated as a fatal error)
** $1: If $0==0:
**     0 UAC is not supported by the OS
**     1 Started a elevated child process, the current process should act like a wrapper (Call Quit without any further processing)
**     2 The process is already running @ HighIL (Member of admin group)
**     3 You should call RunElevated again (This can happen if a user without admin priv. is used in the runas dialog)
** $2: If $0==0 && $1==1: ExitCode of the elevated fork process (The NSIS errlvl is also set)
** $3: If $0==0: 1 if the user is a member of the admin group or 0 otherwise
**/
!macro UAC_RunElevated
UAC::_ 0
!macroend
!macro UAC_PageElevation_RunElevated
UAC::_ 0
!macroend
/*!macro UAC_OnInitElevation_RunElevated
UAC::_ 0
!macroend
!macro UAC_OnInitElevation_OnGuiInit
!macroend*/



/* UAC_GetIntegrityLevel <NSISVar:Output | "s">
**
** Get integrity level of current process
**
**/
!macro UAC_GetIntegrityLevel outvar
UAC::_ 6
!if "${outvar}" != "s"
	Pop ${outvar}
!endif
!macroend



/* UAC_IsAdmin
**
** Is the current process running with administrator privileges? Result in $0
**
** ${If} ${UAC_IsAdmin} ...
**
**/
!macro UAC_IsAdmin
UAC::_ 2
!macroend
!define UAC_IsAdmin `"" UAC_IsAdmin ""`
!macro _UAC_IsAdmin _a _b _t _f
!insertmacro _UAC_MakeLL_Cmp _!= 0 2s
!macroend



/* UAC_IsInnerInstance
**
** Does the current process have a NSIS/UAC parent process that is part of the elevation operation?
**
** ${If} ${UAC_IsInnerInstance} ...
**
**/
!macro UAC_IsInnerInstance
UAC::_ 3
!macroend
!define UAC_IsInnerInstance `"" UAC_IsInnerInstance ""`
!macro _UAC_IsInnerInstance _a _b _t _f
!insertmacro _UAC_MakeLL_Cmp _!= 0 3s
!macroend



/* UAC_PageElevation_OnInit, UAC_PageElevation_OnGuiInit,
**
** Helper macros for elevation on a custom elevation page, see the DualMode example for more information.
**
**/
!macro UAC_Notify_OnGuiInit
UAC::_ 4
!macroend
!macro UAC_PageElevation_OnGuiInit
!insertmacro UAC_Notify_OnGuiInit
!macroend
!macro UAC_PageElevation_OnInit
UAC::_ 5
${IfThen} ${Errors} ${|} Quit ${|}
!macroend



/* UAC_AsUser_Call <Function|Label> <NSISAddressName> <UAC_* flags>
**
** Calls a function or label in the user process instance.
** All the UAC_AsUser_* macros use this helper macro.
**
**/
!define UAC_SYNCREGISTERS 0x1
;define UAC_SYNCSTACK     0x2
!define UAC_SYNCOUTDIR    0x4
!define UAC_SYNCINSTDIR   0x8
;define UAC_CLEARERRFLAG  0x10
!macro UAC_AsUser_Call type name flags
push $0
Get${type}Address $0 ${name}
!verbose push
!verbose ${UAC_VERBOSE}
!insertmacro _UAC_ParseDefineFlagsToInt _UAC_AsUser_Call__flags ${flags}
!verbose pop
StrCpy $0 "1$0:${_UAC_AsUser_Call__flags}"
!undef _UAC_AsUser_Call__flags
Exch $0
UAC::_
!macroend



/*
** UAC_AsUser_GetSection <Flags|InstTypes|Size|Text> <SectionIndex> <NSISVar:Output>
*/
!macro UAC_AsUser_GetSection secprop secidx outvar
!insertmacro _UAC_AsUser_GenOp ${outvar} SectionGet${secprop} ${secidx} ""
!macroend



/*
** UAC_AsUser_GetGlobalVar <NSISVar:SourceAndOutput>
** UAC_AsUser_GetGlobal <NSISVar:Output> <NSISVar:Source>
*/
!macro UAC_AsUser_GetGlobalVar var
!insertmacro _UAC_AsUser_GenOp ${var} StrCpy "" ${var}
!macroend
!macro UAC_AsUser_GetGlobal outvar srcvar
!insertmacro _UAC_AsUser_GenOp ${outvar} StrCpy "" ${srcvar}
!macroend



/*
** UAC_AsUser_ExecShell <Verb> <ApplicationOrFile> <Parameters> <Working Directory> <SW_*>
**
** Call ExecShell in the user process instance.
**
*/
!macro UAC_AsUser_ExecShell verb command params workdir show
!insertmacro _UAC_IncL
goto _UAC_L_E_${__UAC_L}
_UAC_L_F_${__UAC_L}:
ExecShell "${verb}" "${command}" '${params}' ${show}
return
_UAC_L_E_${__UAC_L}:
!if "${workdir}" != ""
	push $outdir
	SetOutPath "${workdir}"
!endif
!insertmacro UAC_AsUser_Call Label _UAC_L_F_${__UAC_L} ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} #|${UAC_CLEARERRFLAG}
!if "${workdir}" != ""
	pop $outdir 
	SetOutPath $outdir
!endif
!macroend



!macro _UAC_MakeLL_Cmp cmpop cmp pluginparams
!insertmacro _LOGICLIB_TEMP
UAC::_ ${pluginparams}
pop $_LOGICLIB_TEMP
!insertmacro ${cmpop} $_LOGICLIB_TEMP ${cmp} `${_t}` `${_f}`
!macroend
!macro _UAC_definemath def val1 op val2
!define /math _UAC_definemath "${val1}" ${op} ${val2}
!ifdef ${def}
	!undef ${def}
!endif
!define ${def} "${_UAC_definemath}"
!undef _UAC_definemath
!macroend
!macro _UAC_ParseDefineFlags_orin parse outflags
!searchparse /noerrors ${${parse}} "" _UAC_ParseDefineFlags_orin_f1 "|" _UAC_ParseDefineFlags_orin_f2
!define _UAC_ParseDefineFlags_orin_this ${_UAC_ParseDefineFlags_orin_f1}
!undef ${parse}
!define ${parse} ${_UAC_ParseDefineFlags_orin_f2}
!define _UAC_ParseDefineFlags_orin_saveout ${${outflags}}
!undef ${outflags}
!define /math ${outflags} "${_UAC_ParseDefineFlags_orin_saveout}" | "${_UAC_ParseDefineFlags_orin_this}"
!undef _UAC_ParseDefineFlags_orin_saveout
!undef _UAC_ParseDefineFlags_orin_this
!ifdef _UAC_ParseDefineFlags_orin_f1
	!undef _UAC_ParseDefineFlags_orin_f1
!endif
!ifdef _UAC_ParseDefineFlags_orin_f2
	!undef _UAC_ParseDefineFlags_orin_f2
!endif
!macroend
!macro _UAC_ParseDefineFlags_Begin _outdef _in
!define _UAC_PDF${_outdef}_parse "${_in}"
!define _UAC_PDF${_outdef}_flags ""
!define _UAC_PDF${_outdef}_r 0
!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags	;0x1
!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags	;0x2
!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags	;0x4
!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags	;0x8
!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags	;0x10
!macroend
!macro _UAC_ParseDefineFlags_End _outdef
!define ${_outdef} ${_UAC_PDF${_outdef}_r}
!undef _UAC_PDF${_outdef}_r
!undef _UAC_PDF${_outdef}_flags
!undef _UAC_PDF${_outdef}_parse
!macroend
!macro _UAC_ParseDefineFlags_IncludeFlag _outdef flag
!if ${_UAC_PDF${_outdef}_flags} & ${flag}
	!insertmacro _UAC_definemath _UAC_PDF${_outdef}_r ${_UAC_PDF${_outdef}_r} | ${flag}
!endif
!macroend
!macro _UAC_ParseDefineFlagsToInt _outdef _in
!insertmacro _UAC_ParseDefineFlags_Begin _UAC_ParseDefineFlagsToInt_tmp "${_in}"
!define ${_outdef} ${_UAC_PDF_UAC_ParseDefineFlagsToInt_tmp_flags}
!insertmacro _UAC_ParseDefineFlags_End _UAC_ParseDefineFlagsToInt_tmp
!undef _UAC_ParseDefineFlagsToInt_tmp
!macroend
!macro _UAC_IncL
!insertmacro _UAC_definemath __UAC_L "${__UAC_L}" + 1
!macroend
!macro _UAC_AsUser_GenOp outvar op opparam1 opparam2
!define _UAC_AUGOGR_ID _UAC_AUGOGR_OP${outvar}${op}${opparam1}${opparam2}
!ifndef ${_UAC_AUGOGR_ID} ;Has this exact action been done before? 
	!if ${outvar} == $0
		!define ${_UAC_AUGOGR_ID} $1
	!else
		!define ${_UAC_AUGOGR_ID} $0
	!endif
	!if "${opparam1}" == ""
		!define _UAC_AUGOGR_OPP1 ${${_UAC_AUGOGR_ID}}
		!define _UAC_AUGOGR_OPP2 ${opparam2}
	!else
		!define _UAC_AUGOGR_OPP1 ${opparam1}
		!define _UAC_AUGOGR_OPP2 ${${_UAC_AUGOGR_ID}}
	!endif	
	goto ${_UAC_AUGOGR_ID}_C
	${_UAC_AUGOGR_ID}_F:
		${op} ${_UAC_AUGOGR_OPP1} ${_UAC_AUGOGR_OPP2}
		return
	${_UAC_AUGOGR_ID}_C:
	!undef _UAC_AUGOGR_OPP1
	!undef _UAC_AUGOGR_OPP2
!endif
push ${${_UAC_AUGOGR_ID}}
!insertmacro UAC_AsUser_Call Label ${_UAC_AUGOGR_ID}_F ${UAC_SYNCREGISTERS}
StrCpy ${outvar} ${${_UAC_AUGOGR_ID}}
pop ${${_UAC_AUGOGR_ID}}
!undef _UAC_AUGOGR_ID
!macroend



!verbose pop
!endif /* UAC_HDR__INC */!include "nsProcess.nsh"

!ifmacrondef customCheckAppRunning
  !include "getProcessInfo.nsh"
  Var pid
!endif

# http://nsis.sourceforge.net/Allow_only_one_installer_instance
!macro ALLOW_ONLY_ONE_INSTALLER_INSTANCE
  BringToFront
  !define /ifndef SYSTYPE_PTR p ; NSIS v3.0+
  System::Call 'kernel32::CreateMutex(${SYSTYPE_PTR}0, i1, t"${APP_GUID}")?e'
  Pop $0
  IntCmpU $0 183 0 launch launch ; ERROR_ALREADY_EXISTS
    StrLen $0 "$(^SetupCaption)"
    IntOp $0 $0 + 1 ; GetWindowText count includes \0
    StrCpy $1 "" ; Start FindWindow with NULL
    loop:
      FindWindow $1 "#32770" "" "" $1
      StrCmp 0 $1 notfound
      System::Call 'user32::GetWindowText(${SYSTYPE_PTR}r1, t.r2, ir0)'
      StrCmp $2 "$(^SetupCaption)" 0 loop
      SendMessage $1 0x112 0xF120 0 /TIMEOUT=2000 ; WM_SYSCOMMAND:SC_RESTORE to restore the window if it is minimized
      System::Call "user32::SetForegroundWindow(${SYSTYPE_PTR}r1)"
    notfound:
      Abort
  launch:
!macroend

!macro CHECK_APP_RUNNING
    !ifmacrodef customCheckAppRunning
      !insertmacro customCheckAppRunning
    !else
      !insertmacro _CHECK_APP_RUNNING
    !endif
!macroend

!macro _CHECK_APP_RUNNING
  ${GetProcessInfo} 0 $pid $1 $2 $3 $4
  ${if} $3 != "${APP_EXECUTABLE_FILENAME}"
    ${if} ${isUpdated}
      # allow app to exit without explicit kill
      Sleep 100
    ${endIf}

    ${nsProcess::FindProcess} "${APP_EXECUTABLE_FILENAME}" $R0
    ${if} $R0 == 0
      ${if} ${isUpdated}
        # allow app to exit without explicit kill
        Sleep 1000
        Goto doStopProcess
      ${endIf}
      MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(appRunning)" /SD IDOK IDOK doStopProcess
      Quit

      doStopProcess:

      DetailPrint `Closing running "${PRODUCT_NAME}"...`

      # https://github.com/electron-userland/electron-builder/issues/2516#issuecomment-372009092
      nsExec::Exec `taskkill /im "${APP_EXECUTABLE_FILENAME}" /fi "PID ne $pid"` $R0
      # to ensure that files are not "in-use"
      Sleep 100

      ${nsProcess::FindProcess} "${APP_EXECUTABLE_FILENAME}" $R0
      ${if} $R0 == 0
        # wait to give a chance to exit gracefully
        Sleep 1000
        # do not use /t tree kill - app was killed softly already
        nsExec::Exec `taskkill /f /im "${APP_EXECUTABLE_FILENAME}" /fi "PID ne $pid"` $R0
        ${If} $R0 != 0
          DetailPrint `Waiting for "${PRODUCT_NAME}" to close (taskkill exit code $R0).`
          Sleep 2000
        ${endIf}
      ${endIf}
    ${endIf}
  ${endIf}

  ${nsProcess::Unload}
!macroend!macro extractEmbeddedAppPackage
  !ifdef COMPRESS
    SetCompress off
  !endif

  Var /GLOBAL packageArch

  !ifdef APP_64
    StrCpy $packageArch "64"

    !ifdef APP_32
      ${if} ${RunningX64}
        !insertmacro x64_app_files
      ${else}
        !insertmacro ia32_app_files
      ${endIf}
    !else
      !insertmacro x64_app_files
    !endif
  !else
    !insertmacro ia32_app_files
  !endif

  !ifdef COMPRESS
    SetCompress "${COMPRESS}"
  !endif

  !ifdef ZIP_COMPRESSION
    nsisunz::Unzip "$PLUGINSDIR\app-$packageArch.zip" "$INSTDIR"
  !else
    !insertmacro extractUsing7za "$PLUGINSDIR\app-$packageArch.7z"
  !endif

  # after decompression
  ${if} $packageArch == "64"
    !ifmacrodef customFiles_x64
      !insertmacro customFiles_x64
    !endif
  ${else}
    !ifmacrodef customFiles_ia32
      !insertmacro customFiles_ia32
    !endif
  ${endIf}
!macroend

!macro x64_app_files
  File /oname=$PLUGINSDIR\app-64.${COMPRESSION_METHOD} "${APP_64}"
!macroend

!macro ia32_app_files
  StrCpy $packageArch "32"
  File /oname=$PLUGINSDIR\app-32.${COMPRESSION_METHOD} "${APP_32}"
!macroend

!macro extractUsing7za FILE
  Nsis7z::Extract "${FILE}"
!macroend; NSIS PROCESS INFO LIBRARY - GetProcessInfo.nsh
; Version 1.1 - Mar 28th, 2011
;
; Description:
;   Gets process information.
;
; Usage example:
;   ${GetProcessInfo} 0 $0 $1 $2 $3 $4
;   DetailPrint "pid=$0 parent_pid=$1 priority=$2 process_name=$3 exe=$4"
;
; History:
;   1.1 - 28/03/2011 - Added uninstall function, include guards, file header. Fixed getting full exe path on pre vista systems. (Sergius)
;

!ifndef GETPROCESSINFO_INCLUDED
!define GETPROCESSINFO_INCLUDED

!define PROCESSINFO.TH32CS_SNAPPROCESS      2
!define PROCESSINFO.INVALID_HANDLE_VALUE    -1

!define GetProcessInfo '!insertmacro GetProcessInfo'

;@in pid_in - if 0 - get current process info
;@out pid_out - real process id (may be useful, if pid_in=0)
;@out ppid - parent process id
;@out priority
;@out name - name of process
;@out fullname - fully-qualified path of process
!macro GetProcessInfo pid_in pid_out ppid priority name fullname
    Push ${pid_in}
    !ifdef BUILD_UNINSTALLER
        Call un._GetProcessInfo
    !else
        Call _GetProcessInfo
    !endif
    ;name;pri;ppid;fname;pid;
    Pop ${name}
    Pop ${priority}
    Pop ${ppid}
    Pop ${fullname}
    Pop ${pid_out}
!macroend

!macro FUNC_GETPROCESSINFO
    Exch $R3 ;pid
    Push $0
    Push $1
    Push $2
    Push $3
    Push $4
    Push $5
    Push $R0 ;hSnapshot
    Push $R1 ;result
    Push $R9 ;PROCESSENTRY32;MODULEENTRY32 and so on
    Push $R8

    ;zero registers to waste trash, if error occurred
    StrCpy $0 ""
    StrCpy $1 ""
    StrCpy $2 ""
    StrCpy $3 ""
    StrCpy $4 ""
    StrCpy $5 ""

    IntCmp $R3 0 0 skip_pid_detection skip_pid_detection
    System::Call 'kernel32::GetCurrentProcess() i.R0'
    System::Call "Kernel32::GetProcessId(i R0) i.R3"

skip_pid_detection:
    System::Call 'Kernel32::CreateToolhelp32Snapshot(i ${PROCESSINFO.TH32CS_SNAPPROCESS},i R3) i.R0'

    IntCmp $R0 ${PROCESSINFO.INVALID_HANDLE_VALUE} end ;someting wrong

    ;$R9=PROCESSENTRY32
    ;typedef struct tagPROCESSENTRY32 {
    ;  DWORD     dwSize;
    ;  DWORD     cntUsage;
    ;  DWORD     th32ProcessID;
    ;  ULONG_PTR th32DefaultHeapID;
    ;  DWORD     th32ModuleID;
    ;  DWORD     cntThreads;
    ;  DWORD     th32ParentProcessID;
    ;  LONG      pcPriClassBase;
    ;  DWORD     dwFlags;
    ;  TCHAR     szExeFile[MAX_PATH];
    ;}PROCESSENTRY32, *PPROCESSENTRY32;
    ;dwSize=4*9+2*260

    System::Alloc 1024
    pop $R9
    System::Call "*$R9(i 556)"

    System::Call 'Kernel32::Process32FirstW(i R0, i $R9) i.R1'
    StrCmp $R1 0 end

nnext_iteration:
    System::Call "*$R9(i,i,i.R1)" ;get PID
    IntCmp $R1 $R3 exitloop

    System::Call 'Kernel32::Process32NextW(i R0, i $R9) i.R1'
    IntCmp $R1 0 0 nnext_iteration nnext_iteration

exitloop:
    ;$0 - pid
    ;$1 - threads
    ;$2 - ppid
    ;$3 - priority
    ;$4 - process name
    System::Call "*$R9(i,i,i.r0,i,i,i.r1,i.r2,i.r3,i,&w256.r4)" ; Get next module

    ;free:
    System::Free $R9
    System::Call "Kernel32::CloseToolhelp32Snapshot(i R0)"

    ;===============
    ;now get full path and commandline

    System::Call "Kernel32::OpenProcess(i 1040, i 0, i r0)i .R0"

    StrCmp $R0 0 end

    IntOp $R8 0 + 256
    System::Call "psapi::GetModuleFileNameExW(i R0,i 0,t .r5, *i $R8)i .R1"

end:
    Pop $R8
    Pop $R9
    Pop $R1
    Pop $R0
    Exch $5
    Exch 1
    Exch $4
    Exch 2
    Exch $3
    Exch 3
    Exch $2
    Exch 4
    Pop $1
    Exch 4
    Exch $0
    Exch 5
    Pop $R3
!macroend ;FUNC_GETPROCESSINFO

!ifndef BUILD_UNINSTALLER
Function _GetProcessInfo
    !insertmacro FUNC_GETPROCESSINFO
FunctionEnd
!endif

!ifdef BUILD_UNINSTALLER
Function un._GetProcessInfo
    !insertmacro FUNC_GETPROCESSINFO
FunctionEnd
!endif

!endif ;GETPROCESSINFO_INCLUDED!macro moveFile FROM TO
  ClearErrors
  Rename `${FROM}` `${TO}`
  ${if} ${errors}
    # not clear - can NSIS rename on another drive or not, so, in case of error, just copy
    ClearErrors
    !insertmacro copyFile `${FROM}` `${TO}`
    Delete `${FROM}`
  ${endif}
!macroend

!macro copyFile FROM TO
  ${StdUtils.GetParentPath} $R5 `${TO}`
  CreateDirectory `$R5`
  ClearErrors
  CopyFiles /SILENT `${FROM}` `${TO}`
!macroend

Function GetInQuotes
  Exch $R0
  Push $R1
  Push $R2
  Push $R3

   StrCpy $R2 -1
   IntOp $R2 $R2 + 1
    StrCpy $R3 $R0 1 $R2
    StrCmp $R3 "" 0 +3
     StrCpy $R0 ""
     Goto Done
    StrCmp $R3 '"' 0 -5

   IntOp $R2 $R2 + 1
   StrCpy $R0 $R0 "" $R2

   StrCpy $R2 0
   IntOp $R2 $R2 + 1
    StrCpy $R3 $R0 1 $R2
    StrCmp $R3 "" 0 +3
     StrCpy $R0 ""
     Goto Done
    StrCmp $R3 '"' 0 -5

   StrCpy $R0 $R0 $R2
   Done:

  Pop $R3
  Pop $R2
  Pop $R1
  Exch $R0
FunctionEnd

!macro GetInQuotes Var Str
  Push "${Str}"
  Call GetInQuotes
  Pop "${Var}"
!macroend

Function GetFileParent
  Exch $R0
  Push $R1
  Push $R2
  Push $R3

  StrCpy $R1 0
  StrLen $R2 $R0

  loop:
    IntOp $R1 $R1 + 1
    IntCmp $R1 $R2 get 0 get
    StrCpy $R3 $R0 1 -$R1
    StrCmp $R3 "\" get
  Goto loop

  get:
    StrCpy $R0 $R0 -$R1

    Pop $R3
    Pop $R2
    Pop $R1
    Exch $R0
FunctionEnd

Var /GLOBAL isTryToKeepShortcuts

!macro setIsTryToKeepShortcuts
  StrCpy $isTryToKeepShortcuts "true"
  !ifdef allowToChangeInstallationDirectory
    ${ifNot} ${isUpdated}
      StrCpy $isTryToKeepShortcuts "false"
    ${endIf}
  !endif
!macroend

# https://nsis-dev.github.io/NSIS-Forums/html/t-172971.html
!macro readReg VAR ROOT_KEY SUB_KEY NAME
  ${if} "${ROOT_KEY}" == "SHELL_CONTEXT"
    ReadRegStr "${VAR}" SHELL_CONTEXT "${SUB_KEY}" "${NAME}"
  ${elseif} "${ROOT_KEY}" == "HKEY_CURRENT_USER"
    ReadRegStr "${VAR}" HKEY_CURRENT_USER "${SUB_KEY}" "${NAME}"
  ${elseif} "${ROOT_KEY}" == "HKEY_LOCAL_MACHINE"
    ReadRegStr "${VAR}" HKEY_LOCAL_MACHINE "${SUB_KEY}" "${NAME}"
  ${else}
    MessageBox MB_OK "Unsupported ${ROOT_KEY}"
  ${endif}
!macroend

# http://stackoverflow.com/questions/24595887/waiting-for-nsis-uninstaller-to-finish-in-nsis-installer-either-fails-or-the-uni
Function uninstallOldVersion
  Var /GLOBAL uninstallerFileName
  Var /GLOBAL installationDir
  Var /GLOBAL uninstallString
  Var /GLOBAL rootKey

  ClearErrors
  Exch $rootKey

  !insertmacro readReg $uninstallString "$rootKey" "${UNINSTALL_REGISTRY_KEY}" UninstallString
  ${if} $uninstallString == ""
    !ifdef UNINSTALL_REGISTRY_KEY_2
      !insertmacro readReg $uninstallString "$rootKey" "${UNINSTALL_REGISTRY_KEY_2}" UninstallString
    !endif
    ${if} $uninstallString == ""
      Goto Done
    ${endif}
  ${endif}

  # uninstaller should be copied out of app installation dir (because this dir will be deleted), so, extract uninstaller file name
  !insertmacro GetInQuotes $uninstallerFileName "$uninstallString"

  !insertmacro readReg $installationDir "$rootKey" "${INSTALL_REGISTRY_KEY}" InstallLocation
  ${if} $installationDir == ""
  ${andIf} $uninstallerFileName != ""
    # https://github.com/electron-userland/electron-builder/issues/735#issuecomment-246918567
    Push $uninstallerFileName
    Call GetFileParent
    Pop $installationDir
  ${endif}

  ${if} $installationDir == ""
  ${andIf} $uninstallerFileName == ""
    Goto Done
  ${endif}

  !insertmacro copyFile "$uninstallerFileName" "$PLUGINSDIR\old-uninstaller.exe"
  StrCpy $uninstallerFileName "$PLUGINSDIR\old-uninstaller.exe"

  ${if} $installMode == "CurrentUser"
  ${orIf} $rootKey == "HKEY_CURRENT_USER"
    StrCpy $0 "/currentuser"
  ${else}
    StrCpy $0 "/allusers"
  ${endif}

  !insertMacro setIsTryToKeepShortcuts

  ${if} $isTryToKeepShortcuts == "true"
    !insertmacro readReg $R5 "$rootKey" "${INSTALL_REGISTRY_KEY}" KeepShortcuts
    # if true, it means that old uninstaller supports --keep-shortcuts flag
    ${if} $R5 == "true"
    ${andIf} ${FileExists} "$appExe"
      StrCpy $0 "$0 --keep-shortcuts"
    ${endIf}
  ${endIf}

  ${if} ${isDeleteAppData}
    StrCpy $0 "$0 --delete-app-data"
  ${else}
    # always pass --updated flag - to ensure that if DELETE_APP_DATA_ON_UNINSTALL is defined, user data will be not removed
    StrCpy $0 "$0 --updated"
  ${endif}

  ExecWait '"$uninstallerFileName" /S /KEEP_APP_DATA $0 _?=$installationDir' $R0
  ${if} $R0 != 0
    DetailPrint `Aborting, uninstall was not successful. Uninstaller error code: $R0.`
    SetErrorLevel 5
    Abort "Cannot uninstall"
  ${endif}
  Done:
FunctionEnd

!macro uninstallOldVersion ROOT_KEY
  Push "${ROOT_KEY}"
  Call uninstallOldVersion
!macroend# functions (nsis macro) for installer

!include "extractAppPackage.nsh"

!ifdef APP_PACKAGE_URL
  !include webPackage.nsh
!endif

!macro installApplicationFiles
  !ifdef APP_BUILD_DIR
    File /r "${APP_BUILD_DIR}\*.*"
  !else
    !ifdef APP_PACKAGE_URL
      Var /GLOBAL packageFile
      Var /GLOBAL isPackageFileExplicitlySpecified

      ${StdUtils.GetParameter} $packageFile "package-file" ""
      ${if} $packageFile == ""
        !ifdef APP_64_NAME
          !ifdef APP_32_NAME
            ${if} ${RunningX64}
              StrCpy $packageFile "${APP_64_NAME}"
              StrCpy $1 "${APP_64_HASH}"
            ${else}
              StrCpy $packageFile "${APP_32_NAME}"
              StrCpy $1 "${APP_32_HASH}"
            ${endif}
          !else
            StrCpy $packageFile "${APP_64_NAME}"
            StrCpy $1 "${APP_64_HASH}"
          !endif
        !else
          StrCpy $packageFile "${APP_32_NAME}"
          StrCpy $1 "${APP_32_HASH}"
        !endif
        StrCpy $4 "$packageFile"
        StrCpy $packageFile "$EXEDIR/$packageFile"
        StrCpy $isPackageFileExplicitlySpecified "false"
      ${else}
        StrCpy $isPackageFileExplicitlySpecified "true"
      ${endIf}

      # we do not check file hash is specifed explicitly using --package-file because it is clear that user definitly want to use this file and it is user responsibility to check
      # 1. auto-updater uses --package-file and validates checksum
      # 2. user can user another package file (use case - one installer suitable for any app version (use latest version))
      ${if} ${FileExists} "$packageFile"
        ${if} $isPackageFileExplicitlySpecified == "true"
          Goto fun_extract
        ${else}
          ${StdUtils.HashFile} $3 "SHA2-512" "$packageFile"
          ${if} $3 == $1
            Goto fun_extract
          ${else}
            MessageBox MB_OK "Package file $4 found locally, but checksum doesn't match â€” expected $1, actual $3.$\r$\nLocal file is ignored and package will be downloaded from Internet."
          ${endIf}
        ${endIf}
      ${endIf}

      !insertmacro downloadApplicationFiles

      fun_extract:
        !insertmacro extractUsing7za "$packageFile"

        # electron always uses per user app data
        ${if} $installMode == "all"
          SetShellVarContext current
        ${endif}

        !insertmacro moveFile "$packageFile" "$LOCALAPPDATA\${APP_PACKAGE_STORE_FILE}"

        ${if} $installMode == "all"
          SetShellVarContext all
        ${endif}
    !else
      !insertmacro extractEmbeddedAppPackage
      # electron always uses per user app data
      ${if} $installMode == "all"
        SetShellVarContext current
      ${endif}
      !insertmacro copyFile "$EXEPATH" "$LOCALAPPDATA\${APP_INSTALLER_STORE_FILE}"
      ${if} $installMode == "all"
        SetShellVarContext all
      ${endif}
    !endif
  !endif

  File "/oname=${UNINSTALL_FILENAME}" "${UNINSTALLER_OUT_FILE}"
!macroend

!macro registryAddInstallInfo
	WriteRegStr SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" InstallLocation "$INSTDIR"
	WriteRegStr SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" KeepShortcuts "true"
  WriteRegStr SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" ShortcutName "${SHORTCUT_NAME}"
  !ifdef MENU_FILENAME
    WriteRegStr SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" MenuDirectory "${MENU_FILENAME}"
  !endif

	${if} $installMode == "all"
		StrCpy $0 "/allusers"
		StrCpy $1 ""
	${else}
		StrCpy $0 "/currentuser"
		StrCpy $1 ""
	${endIf}

  WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" DisplayName "${UNINSTALL_DISPLAY_NAME}$1"
  # https://github.com/electron-userland/electron-builder/issues/750
  StrCpy $2 "$INSTDIR\${UNINSTALL_FILENAME}"
  WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" UninstallString '"$2" $0'
  WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" QuietUninstallString '"$2" $0 /S'

	WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" "DisplayVersion" "${VERSION}"
	!ifdef UNINSTALLER_ICON
	  WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" "DisplayIcon" "$INSTDIR\uninstallerIcon.ico"
	!else
	  WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" "DisplayIcon" "$appExe,0"
	!endif

  !ifdef COMPANY_NAME
	  WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" "Publisher" "${COMPANY_NAME}"
	!endif
	WriteRegDWORD SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" NoModify 1
	WriteRegDWORD SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" NoRepair 1

  # allow user to define ESTIMATED_SIZE to avoid GetSize call
  !ifdef ESTIMATED_SIZE
    IntFmt $0 "0x%08X" ${ESTIMATED_SIZE}
  !else
    ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
    IntFmt $0 "0x%08X" $0
  !endif
	WriteRegDWORD SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" "EstimatedSize" "$0"
!macroend

!macro cleanupOldMenuDirectory
  ${if} $oldMenuDirectory != ""
    !ifdef MENU_FILENAME
      ${if} $oldMenuDirectory != "${MENU_FILENAME}"
        RMDir "$SMPROGRAMS\$oldMenuDirectory"
      ${endIf}
    !else
      RMDir "$SMPROGRAMS\$oldMenuDirectory"
    !endif
  ${endIf}
!macroend

!macro createMenuDirectory
  !ifdef MENU_FILENAME
    CreateDirectory "$SMPROGRAMS\${MENU_FILENAME}"
    ClearErrors
  !endif
!macroend

!macro addStartMenuLink keepShortcuts
  !ifndef DO_NOT_CREATE_START_MENU_SHORTCUT
    # The keepShortcuts mechanism is NOT enabled.
    # Menu shortcut will be recreated.
    ${if} $keepShortcuts  == "false"
      !insertmacro cleanupOldMenuDirectory
      !insertmacro createMenuDirectory

      CreateShortCut "$newStartMenuLink" "$appExe" "" "$appExe" 0 "" "" "${APP_DESCRIPTION}"
      # clear error (if shortcut already exists)
      ClearErrors
      WinShell::SetLnkAUMI "$newStartMenuLink" "${APP_ID}"
    # The keepShortcuts mechanism IS enabled.
    # The menu shortcut could either not exist (it shouldn't be recreated) or exist in an obsolete location.
    ${elseif} $oldStartMenuLink != $newStartMenuLink
    ${andIf} ${FileExists} "$oldStartMenuLink"
      !insertmacro createMenuDirectory

      Rename $oldStartMenuLink $newStartMenuLink
      WinShell::UninstShortcut "$oldStartMenuLink"
      WinShell::SetLnkAUMI "$newStartMenuLink" "${APP_ID}"

      !insertmacro cleanupOldMenuDirectory
    ${endIf}
  !endif
!macroend

!macro addDesktopLink keepShortcuts
  !ifndef DO_NOT_CREATE_DESKTOP_SHORTCUT
    # https://github.com/electron-userland/electron-builder/pull/1432
    ${ifNot} ${isNoDesktopShortcut}
      # The keepShortcuts mechanism is NOT enabled.
      # Shortcuts will be recreated.
      ${if} $keepShortcuts == "false"
        CreateShortCut "$newDesktopLink" "$appExe" "" "$appExe" 0 "" "" "${APP_DESCRIPTION}"
        ClearErrors
        WinShell::SetLnkAUMI "$newDesktopLink" "${APP_ID}"
      # The keepShortcuts mechanism IS enabled.
      # The desktop shortcut could exist in an obsolete location (due to name change).
      ${elseif} $oldDesktopLink != $newDesktopLink
      ${orIf} ${FileExists} "$oldDesktopLink"
        Rename $oldDesktopLink $newDesktopLink
        WinShell::UninstShortcut "$oldDesktopLink"
        WinShell::SetLnkAUMI "$newDesktopLink" "${APP_ID}"

      !ifdef RECREATE_DESKTOP_SHORTCUT
      ${elseif} $oldDesktopLink != $newDesktopLink
      ${orIfNot} ${FileExists} "$oldDesktopLink"
        ${ifNot} ${isUpdated}
          CreateShortCut "$newDesktopLink" "$appExe" "" "$appExe" 0 "" "" "${APP_DESCRIPTION}"
          ClearErrors
          WinShell::SetLnkAUMI "$newDesktopLink" "${APP_ID}"
        ${endIf}
      !endif
      ${endIf}
      System::Call 'Shell32::SHChangeNotify(i 0x8000000, i 0, i 0, i 0)'
    ${endIf}
  !endif
!macroend!define nsProcess::FindProcess `!insertmacro nsProcess::FindProcess`

!macro nsProcess::FindProcess _FILE _ERR
	nsProcess::_FindProcess /NOUNLOAD `${_FILE}`
	Pop ${_ERR}
!macroend


!define nsProcess::KillProcess `!insertmacro nsProcess::KillProcess`

!macro nsProcess::KillProcess _FILE _ERR
	nsProcess::_KillProcess /NOUNLOAD `${_FILE}`
	Pop ${_ERR}
!macroend

!define nsProcess::CloseProcess `!insertmacro nsProcess::CloseProcess`

!macro nsProcess::CloseProcess _FILE _ERR
	nsProcess::_CloseProcess /NOUNLOAD `${_FILE}`
	Pop ${_ERR}
!macroend


!define nsProcess::Unload `!insertmacro nsProcess::Unload`

!macro nsProcess::Unload
	nsProcess::_Unload
!macroend
!macro downloadApplicationFiles
  Var /GLOBAL packageUrl
  Var /GLOBAL packageArch

  StrCpy $packageUrl "${APP_PACKAGE_URL}"
  StrCpy $packageArch "${APP_PACKAGE_URL}"

  !ifdef APP_PACKAGE_URL_IS_INCOMLETE
    !ifdef APP_64_NAME
      !ifdef APP_32_NAME
        ${if} ${RunningX64}
          StrCpy $packageUrl "$packageUrl/${APP_64_NAME}"
        ${else}
          StrCpy $packageUrl "$packageUrl/${APP_32_NAME}"
        ${endif}
      !else
        StrCpy $packageUrl "$packageUrl/${APP_64_NAME}"
      !endif
    !else
      StrCpy $packageUrl "$packageUrl/${APP_32_NAME}"
    !endif
  !endif

  ${if} ${RunningX64}
    StrCpy $packageArch "64"
  ${else}
    StrCpy $packageArch "32"
  ${endif}

  download:
  inetc::get /USERAGENT "electron-builder (Mozilla)" /header "X-Arch: $packageArch" /RESUME "" "$packageUrl" "$PLUGINSDIR\package.7z" /END
  Pop $0
  ${if} $0 == "Cancelled"
    quit
  ${elseif} $0 != "OK"
    Messagebox MB_RETRYCANCEL|MB_ICONEXCLAMATION "Unable to download application package from $packageUrl (status: $0).$\r$\n$\r$\nPlease check you Internet connection and retry." IDRETRY download
    Quit
  ${endif}

  StrCpy $packageFile "$PLUGINSDIR\package.7z"
!macroend<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
  <Fragment>
    <WixVariable Id="WixUISupportPerUser" Value="1" Overridable="yes"/>
    <WixVariable Id="WixUISupportPerMachine" Value="1" Overridable="yes"/>

    <PropertyRef Id="ApplicationFolderName"/>

    <UI Id="WixUI_Assisted">
      <Dialog Id="InstallScopeDialog" Width="370" Height="270" Title="!(loc.InstallScopeDlg_Title)" KeepModeless="yes">
        <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.InstallScopeDlgBannerBitmap)"/>
        <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0"/>
        <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0"/>
        <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Transparent="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgDescription)"/>
        <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgTitle)"/>

        <Control Id="BothScopes" Type="RadioButtonGroup" X="20" Y="55" Width="330" Height="120" Property="WixAppFolder" Hidden="yes">
          <RadioButtonGroup Property="WixAppFolder">
            <RadioButton Value="WixPerUserFolder" X="0" Y="0" Width="295" Height="16" Text="!(loc.InstallScopeDlgPerUser)"/>
            <RadioButton Value="WixPerMachineFolder" X="0" Y="60" Width="295" Height="16" Text="!(loc.InstallScopeDlgPerMachine)"/>
          </RadioButtonGroup>
          <Condition Action="show">Privileged AND (!(wix.WixUISupportPerUser) AND !(wix.WixUISupportPerMachine))</Condition>
        </Control>
        <Control Id="PerUserDescription" Type="Text" X="33" Y="70" Width="300" Height="36" Hidden="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgPerUserDescription)">
          <Condition Action="show">!(wix.WixUISupportPerUser)</Condition>
        </Control>
        <Control Id="NoPerUserDescription" Type="Text" X="33" Y="70" Width="300" Height="36" Hidden="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgNoPerUserDescription)">
          <Condition Action="show">NOT !(wix.WixUISupportPerUser)</Condition>
        </Control>
        <Control Id="PerMachineDescription" Type="Text" X="33" Y="131" Width="300" Height="36" Hidden="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgPerMachineDescription)">
          <Condition Action="show">Privileged</Condition>
        </Control>

        <Control Id="Install" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Default="yes" Text="!(loc.AdvancedWelcomeEulaDlgInstall)" Hidden="yes">
          <Condition Action="show">WixAppFolder = "WixPerMachineFolder"</Condition>
          <Condition Action="hide">WixAppFolder = "WixPerUserFolder"</Condition>

          <!-- F*** WiX - it doesn't work. Installed per-user in any case. -->
          <Publish Property="MSIINSTALLPERUSER">1</Publish>

          <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1</Publish>
          <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
          <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
          <Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
          <Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
          <Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
        </Control>
        <Control Id="InstallNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Default="yes" Text="!(loc.AdvancedWelcomeEulaDlgInstall)" Hidden="yes">
          <Condition Action="show">WixAppFolder = "WixPerUserFolder"</Condition>
          <Condition Action="hide">WixAppFolder = "WixPerMachineFolder"</Condition>

          <!--<Publish Property="MSIINSTALLPERUSER" Value="1" Order="0">WixAppFolder = "WixPerUserFolder"</Publish>-->

          <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1</Publish>
          <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
          <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
          <Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
          <Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
          <Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
        </Control>

        <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
          <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
        </Control>
      </Dialog>

      <!--<Publish Dialog="InstallScopeDialog" Control="InstallNoShield" Property="MSIINSTALLPERUSER" Value="1" Order="3">WixAppFolder = "WixPerUserFolder"</Publish>-->
      <!--<Publish Dialog="InstallScopeDialog" Control="Install" Property="MSIINSTALLPERUSER" Value="{}" Order="4">WixAppFolder = "WixPerMachineFolder"</Publish>-->

      <TextStyle Id="WixUI_Font_Normal" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Normal_Size)"/>
      <TextStyle Id="WixUI_Font_Bigger" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Bigger_Size)"/>
      <TextStyle Id="WixUI_Font_Title" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Title_Size)" Bold="yes"/>
      <TextStyle Id="WixUI_Font_Emphasized" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Emphasized_Size)" Bold="yes"/>

      <Property Id="DefaultUIFont" Value="WixUI_Font_Normal"/>

      <DialogRef Id="BrowseDlg"/>
      <DialogRef Id="DiskCostDlg"/>
      <DialogRef Id="ErrorDlg"/>
      <DialogRef Id="FatalError"/>
      <DialogRef Id="FilesInUse"/>
      <DialogRef Id="MsiRMFilesInUse"/>
      <DialogRef Id="PrepareDlg"/>
      <DialogRef Id="ProgressDlg"/>
      <DialogRef Id="ResumeDlg"/>
      <DialogRef Id="UserExit"/>

      <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
      <Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="runAfterFinish">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>

      <!--<Publish Dialog="BrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="1">1</Publish>-->
      <!--<Publish Dialog="BrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="2"><![CDATA[WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>-->

      <!--<Publish Dialog="InstallScopeDialog" Control="Next" Property="WixAppFolder" Value="WixPerUserFolder" Order="1">!(wix.WixUISupportPerUser) AND NOT Privileged</Publish>-->
      <!--<Publish Dialog="InstallScopeDialog" Control="Next" Property="MSIINSTALLPERUSER" Value="1" Order="2">!(wix.WixUISupportPerUser) AND NOT Privileged</Publish>-->

      <!--<Publish Dialog="InstallScopeDialog" Control="Next" Property="MSIINSTALLPERUSER" Value="1" Order="3">WixAppFolder = "WixPerUserFolder"</Publish>-->
      <!--<Publish Dialog="InstallScopeDialog" Control="Next" Property="MSIINSTALLPERUSER" Value="{}" Order="4">WixAppFolder = "WixPerMachineFolder"</Publish>-->

      <!-- do not allow choosing installation dir if per-user -->
      <!--<Publish Dialog="InstallScopeDialog" Control="Next" Event="NewDialog" Value="FeaturesDlg" Order="6">WixAppFolder = "WixPerUserFolder"</Publish>-->
      <!--<Publish Dialog="InstallScopeDialog" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="7">WixAppFolder = "WixPerMachineFolder"</Publish>-->

      <!--<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="InstallScopeDialog">!(wix.WixUISupportPerUser)</Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="AdvancedWelcomeEulaDlg">NOT !(wix.WixUISupportPerUser)</Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="ExitDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish>-->

      <!--<Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>-->

      <!--<Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="FeaturesDlg">1</Publish>-->
      <!--<Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>-->
      <!--<Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>-->
      <!--<Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>-->

      <!--<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish>-->
      <!--<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="3">Installed AND PATCH</Publish>-->

      <!--<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>-->

      <InstallUISequence>
        <Show Dialog="InstallScopeDialog" Sequence="1">NOT Installed</Show>
      </InstallUISequence>
    </UI>

    <Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONFOLDER"/>
    <UIRef Id="WixUI_Common"/>
  </Fragment>
</Wix><?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
  <!-- https://blogs.msdn.microsoft.com/gremlininthemachine/2006/12/05/msi-wix-and-unicode/ -->
  <Product Id="*" Name="${productName}" UpgradeCode="${upgradeCode}" Version="${version}" Language="1033" Codepage="65001" Manufacturer="${manufacturer}">
    <Package Compressed="yes" InstallerVersion="500"/>

    <Condition Message="Windows 7 and above is required"><![CDATA[Installed OR VersionNT >= 601]]></Condition>

    <!--
    AllowSameVersionUpgrades:
      When set to no (the default), installing a product with the same version and upgrade code (but different product code) is allowed and treated by MSI as two products.
      When set to yes, WiX sets the msidbUpgradeAttributesVersionMaxInclusive attribute, which tells MSI to treat a product with the same version as a major upgrade.

      So, AllowSameVersionUpgrades="yes" allows to build and test MSI with the same version, and previously installed app will be removed.
    -->
    <MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage='A newer version of "[ProductName]" is already installed.'/>
    <MediaTemplate CompressionLevel="${compressionLevel}" EmbedCab="yes"/>

    <Property Id="ApplicationFolderName" Value="${installationDirectoryWixName}"/>
    <Property Id="WixAppFolder" Value="WixPerUserFolder"/>

    {{ if (iconPath) { }}
    <Icon Id="icon.ico" SourceFile="${iconPath}"/>
    <Property Id="ARPPRODUCTICON" Value="icon.ico"/>
    {{ } -}}

    {{ if (isAssisted || isRunAfterFinish) { }}
    <CustomAction Id="runAfterFinish" FileKey="mainExecutable" ExeCommand="" Execute="immediate" Impersonate="yes" Return="asyncNoWait"/>
    {{ } -}}

    <Property Id="ALLUSERS" Secure="yes" Value="2"/>
    {{ if (isPerMachine) { }}
    <Property Id="MSIINSTALLPERUSER" Secure="yes"/>
    {{ } else { }}
    <Property Id="MSIINSTALLPERUSER" Secure="yes" Value="1"/>
    {{ } -}}

    {{ if (isAssisted) { }}
    <!-- Check "Run after finish" checkbox by default -->
    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1"/>
    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Run ${productName}"/>

    <UIRef Id="WixUI_Assisted"/>
    {{ } else if (isRunAfterFinish) { }}
    <!-- https://stackoverflow.com/questions/1871531/launch-after-install-with-no-ui -->
    <InstallExecuteSequence>
      <Custom Action="runAfterFinish" After="InstallFinalize"/>
    </InstallExecuteSequence>
    {{ } -}}

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="${programFilesId}">
        {{ if (menuCategory) { }}
          <Directory Id="COMPANYDIR" Name="${menuCategory}">
        {{ } -}}
              <Directory Id="APPLICATIONFOLDER" Name="${installationDirectoryWixName}"/>
        {{ if (menuCategory) { }}
          </Directory>
        {{ } -}}
      </Directory>

      <!-- Desktop link -->
      {{ if (isCreateDesktopShortcut) { }}
      <Directory Id="DesktopFolder" Name="Desktop"/>
      {{ } -}}

      <!-- Start menu link -->
      {{ if (isCreateStartMenuShortcut) { }}
      <Directory Id="ProgramMenuFolder"/>
      {{ } }}
    </Directory>

    <!-- Files -->
    <Feature Id="ProductFeature" Absent="disallow">
      <ComponentGroupRef Id="ProductComponents"/>
    </Feature>

    {{-dirs}}

    <ComponentGroup Id="ProductComponents" Directory="APPLICATIONFOLDER">
      {{-files}}
    </ComponentGroup>
  </Product>
</Wix>
#!/bin/bash

# Link to the binary
ln -sf '/opt/${productFilename}/${executable}' '/usr/local/bin/${executable}'
#!/bin/bash

# Delete the link to the binary
rm -f '/usr/local/bin/${executable}'
[Desktop Entry]
Name=<%= title %>
Comment=<%= comment %>
Exec=<%= executable %>
Terminal=false
Type=Application
icns ‡wic12  g‰PNG

   IHDR   @   @   ªiqÞ  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  	pIDATxí[ilNY>T)ŠÚªÅ ¤Á¤abé ñ£ÔE©%Á‰Â©d$$„?"Œu2–Š%Z©ˆ]1k˜X¦–6¨­-ªµÕ™ç¹¾ïËíwÎw¿{Û{Û&ú&o¾{Ïò¾ÏóöÞsÏ{Î©õR�úüÈhPCä#á'ú3´´´5´)”R-†>…>„þ-€~�z*^ Èƒ&C‡¶k×®g\\\t÷îÝE—.]DÛ¶mEÓ¦ßù———‹7oÞˆ§OŸŠG�‰'Ož”¾~ý:ý.Bs ç %P×Å‹ $ åœL8p`÷ääd1räH‘�� :uê$6lhIâÛ·o¢°°PÜ¾}[œ9sFäääˆ7n<’RDÇÐÛ–j±²|okÝºué¼yóäùóçåçÏŸ�»zB´E›´MPúª3$¿7oÞ¼xáÂ…òþýûÕclÑ›¶éƒ¾èJßµ*ƒàýòèÑ£å•+W, »[E_ôIßPb¨™�A¬xõêÕ®<êNCÄWƒ¾‰ìg×t2:wîü”SÜ®·'bA 2j*«z÷î-oÞ¼é:™ª$bB Vy„e½zõ’÷îÝ«*VÏú±! ËœÁÉ<`:¾ã»ñÈE0@ñq÷î]qéÒ%ñâÅÑ¦M1xð`�y€ÒÎi"&0è‰«W¯ŠwïÞ‰®]»ŠaÃ†	N¨‚O‚À¼£óˆtÔí	®¯Î}ÿ¨¨¨¢ììlå/ˆ›œ?>?MŒ~@7n,§L™"?~¬ô±[€É�!°K111rÉ’%²´´T1EŒÄŠvý«CØÜ—óÕÜ+V(ÎŠŠŠäðáÃ+�CÛJ÷ýúõ“˜Ú*}ÃÜºuKâ¯]ÉV°í””YVV¦˜"Vb†ús\V]–:Tb¾®8Z´h‘%@¸4ê'Ož,+**”þ¡
>~ü(ñ˜Û²½fÍÅ±3ü/­:íï=ãñ8½ÎÍÍUœ�¢Ÿ¤Õo£F�äõë×¡
øi³²g®‹��—oß¾UL3±£m<4¤Xg&B,ž:uj[DS1píÚ5QRb/Aûúõ«¸x‘‰�=9wŽÉŸ=Áë%8 1;Ê×™ï­‡�-ƒ�¹}àïàÚÎÓ]»â¤-þô¢¸˜“AUˆ�P§Ö~/±
À¬1cÆÄ0�ÕI‡tÅ!Ë:vì².¸ÂI[¦×Xk6aÜ;9àf–¶�Eaòù;ÇŽSÞ-¾µ²}ûö¶ÞÕ&MšÈ;wîø»†ýÅ:€òéV­¯>}úh?‡~'ä@.èeÁW©JêÑ£G…î;ë7ÌßåË—kAƒ�3gŽ¹›­kß(ÖþÆ�-í‘¹ S’ÂÒ¢`å‚,³’ÆÇ�g	rÈ�!òåË—am™ìß¿Ÿ‹–vä¹sçÊ/_¾˜»j¯ÉíWZð­TÅéñ™½{÷j�~øðAfddH¼·• “ /8St"�Íš53laJm¸E‹•lwëÖM®]»Öyú&r‚Úšú·CŽýŸ'¸å³gÏ$§¡Û¶m“‡®ÒøàÁƒ�)uË–-¥âJ³}ûvyüøqÇA%rB ô£%*Ì’Èw†Ùš”#GŽÈèèhã/Í¿xVV–kîÉÅ7$š‰†ºž4bÄ×œÛ1tôèQéÌÃm!'žLZ7ø	ÜÎ³{<æbÆŒâýû÷œ´ˆÝ»w‹ñãÇ»îÏÇI!¦ Æ/nÚx/˜ó‹´´4#ÏÇÀ'vîÜ)&L˜à‰c'…˜. Q0<a6zâÄ	1}út�DÆØ!Ú±c‡@Öhnâêµ�“2Ò€¯Ÿ«Îƒ��<y’‰Š‘L!cÝO‚›¹zïã¤Ó £¦«ÎÍÆNŸ>-RSS�†äñÙ4‚anãÅµ�SY°m] �ŒÙÏÜ‚ZÝŸ={Ö ÏLù�Ø²e‹ñXõq«ÎÇÉ±±œ¾b“ÒÕ/rü@òÄõBx®Ú·2F.ä„`ŽµÐ„ØØØÏXì°²é¨îÂ…é3ÈÈÈHc¶èÈ@5“9Á¿’Û7ÒD$©n!VscuËßšöFÑóçÏ–½Ëâ\Çy qùòectGB$@^lÚ´I ‰	eF[þàÁ�ERc®€] ‘˜˜hœ/Ð6Ö‚·ÜQ•¯©Öeãý´wN3C%Cééé�•]®nÞ¼Ù–M£üü|IþY"�O‘Ódˆ\Ð7[Ë4Dá|¦ü8BþÚI‡	šÙþò!íè*òòòdß¾}Â´¡S»é0¹ ¿~m:é�] O¯^½Òa”Ù]áV¶aŽÏ «áDÈ�\`ËÑFI:äb^7^©À¨(w�œ.‰…³é¯·$Fä%'Etó 6âÒ®­[·
žÙÑ	÷ê]]•RÆI¾Jy¨‚S§N…ªRÊ9@ê–ÅÙ�ØÉ²JNŠ„
 ft'/:á¨îD¸ijWœ´%I¬:iM;9 2SÛ …V(ÂvÖ8…¡}
¸ìDx,Î®8i‹_¡Ë^b'øu¶‰aöíÛ§Œu}kŒ˜‰\¸/P-IÅr’Äc©¡®nŽ+1ƒujµ˜û:s%õï™3g*ùA]ÜÇ£/‰•˜¡¶V�}<-¸¯uoýúõÊSP×H#°r·ÔÖ^œ“ýŠ6gÏž=1'NT¢ÅOQm‘9tèÓë’OŸ>%à?
H
&b½¾Ü¿^¯<µX@LÄŽê_Çâfi­Zµ*ËÌÌ¬Eº•]1dš¨—×°¨ñfÝºuÊÀXš·wðˆ�X@Ö›åd‹(FÝ­iÓ¦I¦­5-ôIßÄ %–Z‘öðú'>ŒU7ŽÇ‡$}pÿ‘>éJµ.)@p#))ÉØÅ(Ž‡ãzÚä¦+}Ð”>ë”DÍBè¿ƒ’6l�>tL4¸mÐmÒ¶Ï}¹"Næv¶@Ã±Ð™8Ñ9Gf[Ž5Ê8:‹³¼Çj÷t‚ó�FŠÍ—Çc¹‡€ßwXÔd.ý4ú^×·ªe^ÀŒ¥'nFøô$)bxÀŠœ?$Î“^L±1�ß¦°×¡g}š‡_OÄë ˜AGâ¦´³ï—•þMHN`xÖ�+·Ï|¿žÿËüÔK}ê#ðƒGà¸"‘ W°:    IEND®B`‚ic07  !‰PNG

   IHDR   €   €   Ã>aË  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  IDATxí�	¬E—ÇYÜPWWDq�Û'Œ»îk4j”¨‘qˆ8š`0L&ãþÉ¨ãàþ©è(nŸã®DE\À7DPTDAE”šÿ¯¦ûÙïÞË½]}»ß»}é“œ×¯»««ÎùŸê¾ÝUçœ2¦ ��������������Õ�M¬èZÒmSqqOñÁþ†Ú®'æ|'1ô»øWñÏâÅ?ˆg‹g‰çûœo:j¦€‘÷÷ï%ÞQŒÑ»‰ë¡Åº˜Î0Mü�x¢x²˜Î‘{ÊsX[èï->\<PÜWÜ]ÜB�:u2m´‘Ùd“MÌf›mf6ÝtSÓ½{wÓµkW³öÚk›.]º¸²¿ýö›ùå—_Ì’%KÌÂ…Í?ü`æÎ�kæÍ›g,X`~ÿ�D+Z¨½OÄãÄ/‰ßÿ"Îå­ o?ñÉâAâ]ÄN‡:˜­¶ÚÊôíÛ×ôë×Ïì¶ÛnfÇw4[n¹¥éÖ­›éÜ¹³ŠÆ§+V˜Å‹›ï¾ûÎL›6Í|üñÇfÒ¤Iæ“O>13gÎ4ÖÚ°2þùLüŒx¬x’¸å¤þohÊKàwû$ñ9âýÅÎšë­·žéß¿¿9üðÃÍ!‡búôéc6Ø`�ÎŽ-Zd¦L™b^{í5óÒK/™‰'šŸæÕÁÑ
ý}K|¿øq1ïÕ�À–ºv„xº˜»Ê®¹æšvÀ€öÖ[oµº3u#¶/!² ²…r2#;:ä‰ oï#Å¼|9P·Øb;lØ0ûþûï·¯Å«´ŽlÈˆ¬¡Ü�#µE§‚j À§Ù?‹gˆˆ½{÷¶7Ýt“�3gNèë²"3²‡z:¡:T�:6Aì@ÛvÛmí¨Q£ì�?þØXÖõ�ÙÑ]B½h[P€ /x7‹—‹­ÞØíUW]eõæucEtB7ttý›¶è¾ZÓÁÒžÁÌ±Çk'OžÜØÖ¬C:tCÇPß@w0XíˆÏÏ/[ÒØ;ï¼Ó®\¹²xóq):¢+:£{€Xäå“\¢ÖG<öþ.v qÄVßÕù°^ŠR¢3º‡8˜4ýOÂöRôM”îØ±£½òÊ+í¯¿þš"¬ùª
ÝÁ ,‚Ž 6`Ô”Äî4±ÝpÃí˜1còe­¥0› #°j*ú‹´aZÕ}M˜0!C8óY5˜D>Á
Ìš‚þIZÌÛ=öØÃN�:5Ÿj©ÁŒÀ*ÀìrMIzgü}÷Ý×~ûí·m c¾› #°na' Ã\Ò’Ú�åkÆÎÎž=;ß–iCéÁ
Ì„†`™+ÚZÒN[ÍÏÛo¾ù¦ákŽ¦ÀìÀ0ÀLS§,ºJJœ#ÁAãÅ_4;ï¼³·àóçÏwÎ8eàì¡·dÓ³gÏÌçû½-¹ O"ÝÁæ§Ÿ~2ú¼sI8¥¬¿þú%%kï~þùçFcÎE¥_/©}eû–øo5oå¬aå4áu;2y2zôh{ÔQGÙ=zX¹t…w€•û–U‡²'žx¢û„\¶l™WÝYf¬Ÿ€C=ÔÊí,ú]ï|zõêeO?ýtûä“OZ¹Ÿy‰†`	¦b°mhºPÒYÝ±öž{îñRô¾ûî³;í´S¨hÍíÞ{ïmŸ~úi¯6Ò.,_A{Ûm·Ù­·Þº¦¼àxà�öÕW_õ,Á4¨Œ’xQY$¶C‡�­ 1íàÁƒCå¼¶k¬±†>|¸ÅmMrµ'Ÿ|²—¼`ã9tÝu×y‰¦Áõ`Üp/…ëH¨	¸ÿþû[Œ‡–.]jO8á„P±ÄÛ‹/¾¸M;�<‡�X`�Är�1"L®˜‚mÐ&XƒyÃÐ¿I«ûÁÄVê’K.	ª{{íµ×Æn·ž‚<mÎ8ãŒºå/øî»ïŽ-Ø‚qp-˜7í.)p‹µ7ÞxcležyæË#œëÒàuÖY§MüyWICÞ°Å-ØéÓ§ÇÆŒƒkÁìÛ•:ªõgÅîå&îÌÞòåËí~ûí*’Ú–/„,}
ôIjwØa‡Ôä7ø¢‹.ŠÝÀ˜ÉàZ°ÇíF§¨e÷R3~üøØJÈŸ>úV*S÷–—+nÄ–Ã·àC=T·ŒàUÊŠV²³fÍŠ-XG\Ð±A»/!“Åö‚.ˆ-<‡Rõ¤Á7Üpƒ—,>…O;í´Td¬¤'?->æA=Ø ]^Ý7?óØ_}õUlÙÿøã�èdG¨DjÛ“N:)¶,>ùbÉâñv†/¼ÐG‡yÄ‡ ñØÀ 	1Ü{Jp£yìØu0DÊPiV¤1t£÷€Ô«ghš Ñ¬hÆŒ^Uƒ9Ø„-°‰7%í '«¥Þo¼±Ñ§œW£z‰q‘¸^y&Â—hß´‰èá,êåŒÄ†‡jnÁˆz‹±‰7%é f¡¥³Ï>ÛMÐø´Ê	aÛYQÀ´‘6!³>[Ó®¶¥>ßèe.dr„M\Ðlx Î6‰F‡¨âþúî6z‰ÓF«2ÌŠ1³—‘ 	˜µä!ê8ÉŒ^­zÃó›o¾yø¯×`‰1°�%é ç©…š±sáØ^­©°>_Œbæ|/‹]ž¼ Y�V/�YTíêÜsÏ=ÕMH<¶1µ�m¼È·êìZ;ÿüó½Š>òÈ#£»©þO®€,ˆÇÿa‡–EÕî'KSÉ‰ëŽØÛdŽî>ýøŠ;áSéÛFY7¬^^Rûô“Ò®.¦“õ2U©ÉTŽ}úé§V©eR—›Ie$I,#¶ˆ|¢zý.û>N¤›*¾Í¬»îºü›ˆ?Ÿèý¡Vc—]v™ËÿS«\Òó»ì²‹9÷Üs“^¾Êë.¿üòº^Œ±6	ˆL*™>i‹˜À7n\âÞ^È|º Mín8p`›Dá„’æ$Ö©§žšÊT66	äÂ_ [¥NgªF»ýöÛ×õø; ÛwÞyÇ2N½õ°E¼fÔ¢2øüÿî»ïZ}zÕ%kTÏÝwßÝ~ÿý÷>"¬²,?Ø&¨[¥Nw©F{Þyç­Rˆ$'^~ùe«O Ppï­2�Ù?ü0IÓ^×(”•s§·|`V‰qió™Ž#,¶	ÚÂV©ÒšªíS±½ÿþûãÈâUæ£�>JäaÃ¸[¸œ¿÷Þ{Î!ýKY¿¿eÇJËD÷ñí;çœs¬†•½0ŠSÛma+l–á×ýËZk­•Y(7>÷Þ{¯›(ŠDË†
µl™å÷þñÇÏtî?/¼‘¥kÌÁ%´¸ýöÛ]HWÄq³¬,+G}´}þùçÃªSßrŽ�°•›Õ$âÐi*ôþýÄ¨‘8×$*CVNÚÐû�ËÇÇ$Œ€u™>wÝuW£O&—’cY“žLæ¸ãŽ3L0•	)õBØ2Æ‡²„9¹ãç2Ž2$-÷v—´¹“ÄG”¶[mP¢}Ñéâÿ©VÞçÜ¨°Íjª5õ[!…
•4­ÛêŽæë%íßïDvU`#l%Æf5)î8@_jRäjÍ
›¡ÀgŸ}fä­l*MÑr?õÔSFoÜ©jÄFÎfµ„ŒÓ˜aÚ–Š²~„Õ¶-ÎŽ…ñ¿üòË²æ˜ÃÀøYÎ	”5êy b#l†íªRœÐ]5lÆXx¯^½ªV–÷“üvüñ.9t©.$žVh—Ñpsé©†ÚÇFØJ´™ÛU¥8 �ƒn¤XO:eYU‚9IFpîü/¾ø¢L"÷?rw••i”Ø[‰º‰�·H5Ùâv€.Ì‡g�‰»š Yžãq�ñyü—ÒvÛmçŒÏ<@(b§.’7•°Š“s?p<È±e”C«{ìóâWJ<N¹óùäËa#l�³]¸Siç	°’›?KW®JÂe}ìë¯¿vw¾¦yËšRÄ¯yâ‰'Ü7|ÙÉ>€�°U@ÎváN¥mœà~P‚ß•Juäòƒ;¼ð±H)‘Øã'õÒ)­¯­÷#¶r¶«Ö~œà†ýXc§YH‰˜Ü�ÏH_)‘Íãk²¦ôTnö#¶ª9d§8Û,<mÛQ…`ÅÍ –5�£
ÆßgŸ}ÊÎåé@ÄV5Ý£ãt †£‹$å	‹V²² ”†JÝ˜}«ÚaÌ^Ln¢ÒsyÛ×˜p(rË?á�Òmœ°‚‹XE+Ï¤U<Œ2z¸EžJõàÛyìØ±FË¥§r¹±UM£Åé L-ÅÆå„–×�3>3Œ¥DÁc�=æfKÏåu?b+g»jzÄé ‹©€�«È£¥Z�uŽx¾SN9Å¼õÖ[er± $ÆW¼}Ù¹¼ÀFØ* g»p§Ò6NXÈ…äë“ÓF¥:ö+bü7ß|³LFV}ôÑGÍÁ\v.Ï°¶
ÈÙ.Ü©´�ÓèBK¥‘žU©®†:†#‰<nÍo¼Q&ËÇb|›l6ÂFAàÛU¥8`¾jXF¥¬£›BN%sp«{–ÊKˆ×#�<bäVVzª)öÑ=è Ë¤¶«Jq;ÀÜ�ø†ntR¶Q£¬œF~òe¢2QòðÃgâUÖ`;ÀFØJÄÝšJøY}G�rƒbÓ°Äº¾ÿ•W^)“‘	­Ìárï–�l¢a3lW•â<ø-™F-•&MªÖÞ†'yì)Ÿ[Ð¹´YÂº•à)Œ¢-=ÝTûa3lW•ât *pã¦nì¼f•UÛËä$igÎ<óLóÂ/”ÕÏÌØƒ>hŽ9æ˜²sMw@¶‰Ìo”�uWP8nªŽÉ\‹ËÔ‚…\
ô
u¥rÈ×-œÔ*g�u–yöYRæµ&fÅxà3hÐ Ö'2Øk·pl¸„£¡³YZªâ_6�À‡×_Ý¹§ýÇ70„ÔëúÎ·šÒå™TÆb<’5‘=ŒŒá¬õÓÞ�!Ø&�až0Áf©QÕ4Nl¯¹æšÔ1Õc+Qh˜<vÊ�Œ_#|©ËYZ!+}EÖ÷©(òDe†m‚¶Æi‹ÍR¥«U›UŽRêÚ¯78™¢L}ç×%Sœ‹5y]º•QyVõÁ¡Ø&h[¥NQ�+Y;­Õ¿Ò
—\NqŒßR>÷Üsî)¶›t›fx86Á6ØHŒ­R§®ª‘� Ë
õRÚ	"äg}Ó­&ÑaæÌ™«_N+A6	ÚÆFØ*Åý¤2¦˜ÜwŽõ’Òž›Jž¸Ië%;¨ÒÐ&½<öu#GŽqŠ}Mµ‚ÌImT/El‚�Z¦ë­·ôú�:°’E|ò—ÞiE’¨ÖOŠz“Dal‚mÄØ(6ù<¨”IõÏxÁƒ&)Ñã™­K›ˆêÑ*[iWÛRw+)cÓ&¥ž1JB‘¸Zl�MD7”;>T©Ù·0Ë0†úô{›ŒJ#vUdô:¥µ¼ÊÇ-ÌOŒ¾Xâ÷*ÇOW¥ù‹8•Ð!±E@ØÆÍ…jm}; õ=$^¬…*½Öj‡…ÈhU­âÞç+ùù{WRáf#-JÔw¨’—rœ¹™°…/lãEI:ÀµàÞµX¢wjvU€™áqŠL­fƒÇljuF+ÂoÑ—x*aƒ€°	¶ñ¢$€þKü¿·ZÑ«AwŒ÷gE?‹¯dÎb‚‡$�ìƒwòãcoJÚxcù@køÑpòE"W¼®u@Zf¶V1ïóÈœE½¡ ‘x¾ðPÕm	öÿPáDo‘I; Â]+^Žç�–€c?17ONV´Í6Û„	Rm‚…p!ÏŠ”ìÒ«j0¼žðÔÅ‰¨ž0I-ŽÑ7¾ap$â‹^U²Wôë×¯j™zN’�+"ì:ËxA×t°s°ñæ�-Ú…vP«¸{­…[,×z ÈwÙ8Öó {lÐ®t¥Zw9õyW:èWqŸ¹ÿbáÈ?;�ÏÂ‘`É¯öíNä�çÄÊí*vÞûbéØÿï >KÇêKÁaÖæÉsö«‚4‰éGF ì¨Q£*Þõ•‹Gû-¶``�É”¯êNLÿ®+Ý¤óüqw*%g
•J¼]–�Ó`ÂœÀºáˆ"ÄaYåôuþzq:�B™ìàÁƒŸ†žÊ‚qd�–ÁŸAáæ‰ä&á5/rq	ßG0Û ã†M×Ò[ÎAPÀÑB‹qutÎ¬ù(Ys‹K«w´'itÐ9„*¡TMyC½Xù[#x±ÅÃHG[0nh:^Ò14i¯¸âŠØŠRPsvôèÑVË Yeì°xùP¬Q8ç‰Ãñ¸}-[¶Ì«î,Ï�;×jLÞjå/«Á"MwÏÝŽóª"–,žÌ>72ƒa€˜‚mªÔ!ÕÚþ¬ìrý{»7ß|³¹ôÒKÿ<ó?üHéBÄ�<iÝb“¬”ÙèÉ*ÕÜÚÈL‘«‡HdäfÔ—ôÒg†^v…þ¹1ÜÉÃ–i*wßu×]YÞ€MY7˜Ež€-S~y0|(#™ª ðøf5�‚â! V`v†`™KbQÛ±b§¿ïUG Œ"Æ;0Ì51Zõ˜Ø½]ýõÕX�Ï‚MäÌf¤¯ÞÈw+Žkî±6tèÐ6Yä1/}I�¥LB|¬ö[_ò%¢Nºê&±ST»VÙ,òb£Ìä°q	0«¦¥‘føV[~ä›¸�^1ºG¿ÀlV:JZÎ»Õ¸¯¾új+÷æF·Wjò¡+:Ë`²Z>Pÿ+v (_Ÿ}ûí·S¹Q+BGtõ0ðóÓEÍB|ß2Â…O»‹¸eè“¡Õf#tB7r k 3ºçö_²§F$ç'ìÆ�Ã*ØwÜq‡eº8ï„èYÙÑ5¿Hø,ˆ7ßÄ_‹]GÐŠn1�™ÑC‡PŸ@7tlê·|éWm®«¯Ï;ðH¤pË-·ØÙ³g7ü‘™Cù]Ð	Ý
Š‰À*÷Ÿâ–ŽÀñ�!C¬òÿZK…�™�%sÈÈŽèRPBxC)ž.vÀ’hi¯½ö²#FŒ°ãÇ�·xµ5Ñ&m#²Ù¹BÃ#+27üÛ}	™Ú@‚Ÿ%&Ç»'ÇW€e]8à sÐA¹à{Œ¬�§¢õ~	¬1Èñ2¼Q†0·Ä¬:^XùRýƒKÜƒbB¥‰žòÔ¢`âõ×€	3jñ¶`Ý<BÏXà¹OŸ>n­_Ö dYÖ �øDÊkìº O‚?IöHâI2n­Ëêb$�˜2eŠ×ï{i`+Y&‰Ï€§ŠsEyí Q�yÌ ÆMº¿x{qK‡Ðÿ-DxAžpçÎ�[u ¢sI¶ ËÝ¬åš’0ø—â‰â×ÅÄ3Ä¹¥fè Qð;i§§xg1‹ýÂt�âîâ®âµÄÅ•ˆ,SÄ7,ò6GŒ�I½.ž%þ]ÜÔl`UFYS'x*ÀtÞ8F‡�0èr1¿ãŸ;æXAM�ÀÿÌq¾ý†EçÜ    IEND®B`‚ic13  ?ô‰PNG

   IHDR         \r¨f  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  4ýIDATxí}¸ÕÕö¶Ñ¤
(R¤((A)êg	Æ J"1¢þØ5±ƒ»Æ[ÔÄ(*’cƒÔˆ4A)”‚R¤Ptï;9g¾™¹sî=sÎì)ç®õ<ëÞ™93{¯ýîµöìÙe-¥„A@A@A@A@A@A@A@A@A@A@A@A@A@A@A ¡ì•P¹D,ó°î÷ÎdóþkóYJIC@€¤ÕHaòÔÀcµÁÁ:þ7Àq�×Âÿêàjà*`¿³`#ð-xø?àmà-Þ€ÿëÀëÿ·âx'X(ÅH�®Ê«q›‚[‚ÛƒÛ€›ƒƒiì4r¸IbÁÆ��Âð
ðàOÁKÁ«Á›ÀB)@@€äVRMˆFãîî>
Ü
Ì7¼i#Gö–€?ÏÏ³‘ØJÒ $§BØ=o>ÜÜÜÌëi&~N¬Ï¿ž	^æu¡˜� Þ
h‚ì{€O ÷³K_\0í·ß~ªN�:ªvíÚªV­Zª^½zÖÿš5kªªU«ªêÕ««5j¨}öÙGí»ï¾V>{öìQßÿ½Ú¹s§úÏþ£vïÞ­¶oß®¶mÛ¦6mÚdýßºu«Ú²e‹úî»ï
–-óànüç'Ã{à·À3À_‚…b@@€èA?Yž>Lãg—>U«VM5lØPµlÙRzè¡ªU«Vê�CQMš4±®×¯_ß2z:„bˆÏ†��ÁÆ�ÕúõëÕ—_~©V­Z¥–,Y¢–-[¦–.]j]ßµ‹_ �‰ŸlÞ O/E„€4 Ñ ÝÙ÷ Î‹øÆnÞ¼¹êØ±£êÔ©“õ¿uëÖêàƒ¶Þî{íoj­­^ÂÚµkÕâÅ‹Õ‚Ôüùó­ÿ+V¬°zyô¿7}ƒÓÀ/�ß2ˆ@¼Úc°`	Hš]yvë‡�ƒ9R_!±«Þ¶m[uôÑG«^½z©#�<Òj x=MÄO6 óæÍSÓ¦MS3gÎT‹-²>-ò,g&‚_ ós�ŸB!# @È€"9ÜñM6¸¸BŒùF§±÷ë×OõèÑÃêÚg¿Ïñ|IÇø©0cÆ5eÊ«Q`�!â¥¹àçÀìp@Q($*TÎ�ò©ÉÐØÏŸ>\.qÄjàÀ�jðàÁª[·nÖ ]¹”Ø�Tœ={¶š8q¢zóÍ7ÕÂ…ó)á×¸i<øi0!A vúB‚Á;À|[ådtíõe—]¦ñÔ;vìÀç³ Ä„Ø£ò0ÌüF¬‰y_°� 9{#Ç“ÀüFÝÎ©´‘×gŸ}¶~å•W4¦ÑÄâ+@€+bFìÊÃ6ƒ=ë€uÁ:Œ#À9û� çTPŒØë{î¹Gcš¬•—Ÿs!@ìˆ!±,ëL]°NX7B‚€º#UBå|ãcÎ]ã»^¿ôÒKÒÅÏeÕ\ç'1%¶Äu�‹Y7¬#Ö•� 
­‘Ê#àœßøXq§Ï9çýÞ{ï ÞòHˆ1±&æ¨“\Ìºb�±î„�‚¨…§®säÙWÑ¨„çŸ¾þè£�‚è°ÜÄœØWÐ°îX‡¬K!A o¸j�;Ù|kêõ¹çž+†‚!›Öë$W}eê’u*$”‹@Süúø[p…Ú{ï½õé§Ÿ®ßÿýbõVžÖ	ë†uäWw™:eÝ²Ž…�2Ç•¥`_êÙ³§~ã�7BV[I.lXG¬«\õ˜©cÖµ� `!ÐŸû*vØéûï¿_cG\Øº*éB€uÅ:cÝåª×L�³î…*1ÿƒ²/—Qì—·¾-±åÕ�šJ²¦`Ýq|€uéWÇ™º§U2¸µî.°ï·>¶ÞêW_}Õ´~Jú!Àºd�¢¾ý˜:@]H×vK,TðØ;à2ÊÀE&—_~¹Þ°aCDª)ÙD… ë”u[ÎB"êuC¨„8e[.cümÚ´Ñ¯½öZTú(ùÄ„ ë˜uí§Ý Ž•û¢<£Á¾]þŸýìgn®bRIÉ6jX×¬sèƒSG¨+Ô¡@ >Ê@¯2e*û€Ð�?þxÔú'ù%Ö=uÀO72:CÝJ1\þ¸L%ÃÕ–ž>}zBTQÄˆê uÁOG2ºCJ!½ óbp™Ê6l˜þúë¯ãÒ9É7aP¨~º’Ñ!ê’PŠ8²n »*•#À·Ür‹†«ë„© ˆ7Ô	êFŽYêuJ(ü2–ÙºËo½çŸ>n=“üŽ u$Ç¸ uŠº%”`.‚leFú<C¿ûî»	W=/)PW¨3Ð%/S·¨cB	Dà*Èô=ØUi]»vÕŸ~úiRtKäH	ÔêŽWŸ2:F]J×B–2>úú÷ï¯×¬Y“•1“† u‡:Ýò2u�:'” èñÅ[AúÔSOÕß|óMÒtJäIÔ!ê’ŸŽáuO(F®@ÞeÞüg�u–F0Ë”©šˆ›T¨KÔ)èš—©{ÔA¡¸ yÒ¬«Rè0R‚n$Õ”Ò+uŠºåÕ·ŒR…"D`(òÚvUÈðáÃ5âÛ§WËDòD#@Ý¢Žyõ.£‹ÔI¡8yl»*bÈ�!i­@"\ú ŽQ×¼ú—ÑIê¦�A:#íµ`W4HÂn¥ß¶RS†/£Îyõ0£›ÔÑÔPš¢ÓÛ›àÃ�èöîÝ[½üòËªAƒÎËr,E FÔgœ¡¨Ä›ÏÇ¸0ü¥÷‡$ž§¥ »¦—Àœ vèÐÁ
/Ý¬Y3çe9"A`åÊ•Vx÷O>ùÄ›ß¿pax»÷‡¤�§¡ Œót¡¼Æ�«	&(låt^6z¼iÓ&µhÑ"µ`Áµxñbµzõj…)"õí·ß*8žT5jÔPx jÙ²¥jß¾½:âˆ#”4N…W	FÞÕçŸnã½bÅ
…î·Úµk—Úk¯½,¼AXµhÑBµk×NÁïŸÂ^µï¾ûžiÀ'çÍ›§N:é$…ECÞ'Ã…_�ù© T¿Æ³®ï­ý÷ß_Oœ81’oF½7nœµ]ŠVž‡Y—Œ”™›Júöí«o¿ývýÙgŸE"oÚ3áH;v=jÔ(�FTW©R¥®^}Èž3LX·nÝô5×\£?øàƒÈ  .R'³r8þSw…Š@€û°·�mpÑòëÇ{Ìxå®]»ÖÚZŽÿ8[&§|¹ŽëÔ©cM!‰ÿªãÀ=ôäXkÖAµjÕ¬�º×_]ÿý÷þ™†x•:IÝôÔ?uW|	 „B¨1úìõÒK/±ÚÊ&Å <ð€nÞ¼¹+_¯…žS1GŒ¡ñ)Q6óJzå…^(ÏmwQõ@£<xp$ÞŸ¨›>zA¦.@€qôs:`À £zæÌ™£ûôéãÊÓ+CXçt�õÆûá‡*©Ùk½lÙ2=tèÐHðfýúë¯7ºJ”/ê¨�ŽP—£˜@fi§KQ �LÓ&£ôŒ;Vc@É•§Wç#GŽÔ›7o®t�À”)St«V­"Ç›º|ùrcxSG©«>ºB�Ê�®¸g3Ø‘Ýf“�9o»í6�‘c;?gÞQW¶mËTå˜HØúåqøá‡íN]¥Îzò¦NS·…ÊA€óý\YáoÌ˜1ÆZìÑ£G»òòæÕ9#ÚVßÏ<óŒ®^½zì˜sŒçÃ?4¦WÔYÝ¡nSÇ…r ð;\wwÂ	'hÌû©(F�õæçùñÇ_ÒŸŒÑ—ãÏÖ1gx–.]jD·¨³ÔÝl^ŽÿÔq!zâ/Ú q}áÂ…F*ˆs·IRÆl¹Ï;ï¼H¦­Œ€ZN¢X-§5jd×m¶¼qÿï×¯Ÿ1ßÔ]£Ôqêº��8žv)È£�>ZŽJþV”i.êñæ—”ó§žzªðÂ%ðIŽŽG5»RH^uÕUÆP£ûÈD]§Îeøþ»€:ýôÓõž={B¯N»åpìàÊß+O”ç|SrŠ¬Tˆ+!£Ä/h^\m8yòd#pS‡©Ë>2Qç…€Àaà`¤†j¬7R!“&MŠuÄßYÎòŽù)P
ÄzôéÛu]QþÖ«W/ccMÄ€:í)užº_©‰}Æƒ]àp%ž	bô~óyóKâ9Ç'fÍše†HÓäšþ$âë'“ÉÀ1ÔiŸ<©ûiØ�1ÍÃ-¹üú{ì±ÆÜz½õÖ[�6ó@6¿J‹ì—§™øæ‹s¾?hýõèÑCïÞ½ÛäÜäDÝöÈDÝ¯´!ÇöGáç:©Zµª~ç�wŒT ÍáÙÕ[)‰9¯[·®±i*c ;¾é¦›ƒ¥SÏrcK·~ûí·%÷�ºM÷äO -T:úJìã‚.qGj«V­ÒðäÊÏ›Ï|ðAG)ÒsÈ7^çÎ�S‡÷…^hdê¸�žÑ*ˆÒ.Û`ÀÁ‡†‡cà?ýôÓv^Î|“~Ì�liÜ0Äñ‹‘v]\d2¦uœºîÑ»å8§MDN{Gžã3¤õæÎ¼/»ì2uÈ!‡8/…z<uêÔPÓ‹*1ìPTˆ_Uv¡å3mÚ4…A×ÐÒ‹*!L¿ZˆLåG§®{ˆ¶@›ˆœâh håÿßYRºs:ÿüó�—B=¦"ÎŸ??Ô4£Jlýúõ
Þ„¢Ê.´|fÌàZ—ôæí¼	œºN�÷mÂÜÐ“Yö4Žà×Èü ¬ üå•W*Œ;/…z¼nÝ:Ë_¨‰F”¾‰,?„eJ6ô‘Hß‰i¥�?¦c_sD]§Î{ˆ6AÛˆ”¢n ØÕù…³„]ºtQÃ†s^
ýø«¯¾Rtè™VÂ†•T‰ÿ
.ÕR%³SX:{5MÔyê¾‡h®OcÏï¡ŸFÝ ð;ÇåÀŸ-!½éš$DxUìÚ¥•ØƒIÑS2Öÿ§Id—¬üìÂÀ«ëZØ'ÔyŸ^ m#Ò±€( vqF8�„W…uÒÎKFŽÎÉHºQ%ºuëÖ¨²
%L¦ºÁ¥¾D1€IÝ§xˆ6âúDöüêi” ÖÔ)ý%—\¢°äÕyÉÈ1¼ÂI7ªDÓÖ{áÛ“ci%Ê…üÔ}Ú€‡h#®¥ç÷PO£j jBê‘NÉ4#Š·?ó„{&gÖ©;6ý‰6 ˜ÿW{ï•j…-½R”?ªà"´Ú‚‡h+´ãU-�‚’tp–æ—¿ü¥‚§Vç%cÇue$™´vÓ¥Jôš5k*l±M•ÌNa‰wT m€¶à!Ú
mÆ8EÑ ì‹R¸&ù›4ib|äß‰ÃuEñ©áÌ3Ìcâ•&bƒË�]i%¸l�TtÎøÔ1m†¶c”¢h ~„ë,ÅOúS+†žóšÉc8ØPQWj˜å9ì°tmGˆ.£«:ÃÄÖ/­Ö­[û]6v�/(Ú„‡h3´£EpJ°_¶üž=÷Üs³§‘ü¯]»¶ŠºRÃ*Ç/|V�…•¼‘tø¹…�@FÒŽ"Ñ£Ž:*Šl\yÐ&<c=´ÚŽQ2Ý p^Óµß>ðý=Œ’
yôÑGÍÃTâž¡Èi#xØI›È–¼Ø‚­~ô#ã/Þ2Øp �¶á!ÚmÈ™n Br×Ôß/~ñ‹XäÙÀN˜µ…èÂ©¿€s7XaBIZì¹ÄÒ�/)Ú†‡h;´!cdºê”œo2ø¾w^Šì˜­z‡®‰ˆÈò.4#*Å©§žZèã±>ÇA-6^i£ÿøÇ±MaÒ6|z{.
O“@KÛÛ)ðgœatÓ�3/ï1¿¥Mï9ðæYìyÇŽUïÞ.‹M2ÒçÓ†7{,Q­Mñ«ÎžÐF<D -!“ _]u³Rs^•­kœ{©šà¶QÏÀPœðÎ{Ð A©„Ë8Õ´){ÝñmÄ³�6”ºn WÝLs=¨Å]»v5ævË6ó¦ë®»Î–)+[ÿcä¿$Â„1`ñõÊDÿ‹ð»�·™º‘!Åh+ùhKFV²™êp"Õ5”zòÉ'+8DÄåxé¢‹.R-Z´ˆWˆ<r¿á†bû\ÊC¼¼oáüv\ã>y‰áPµmÛ6È#Fî¥�ÐV<D[Švq‚G€ §¿Æv+FßpÓ§O7ÕhNwìØ±¶lN9“r|Úi§‰Š¨� 7\tk‹9¦àô†B*mñÉÐV|ü)Ò¦RC¯BR»Âáø ÝÿlÕ`w fä§ŒI9†Ï¸T»Ïbœý¿eË=dÈ��Dâ�µøF]ÑgqòŸŸ´�NÒ¦RACJz±´`2øb`�÷ÂIˆîÙ³§-£SÞ¸Žèõ×_wŠ™êcz×Å¨v¢0öÖmRÝ®Óf<²Ò¦h[‰'ŽXÚÂc[¨f<¾$Ò_|¡ÛµmgËê”;êcv‘ü�I„© ™àTCÿä'?I¶¹ê’F–T—ë´ÚŽGöTÌüÞ)4Ü=šÍîíÛ·÷é9£Ó>üðÃZâ›?éÆùå—'zœ~ýBØÓ¶MÜÀ0l!é´dÉ�7¶ÌNùMcñ‡~öÙg“QÞòíØ±Ccä?,ó©+ö´n½õÖ¼Ëç�>�(mËÞX‡ãÄw­lÛ
�–7Ç°ðÆ–ÛYSÇØu¦ÿýïÇ©c¡æÍp`gŸ}v¤©,òÑãÇ�µÌ&£íxÊGÛJôÎ°3�³k;wî\“…žö¸qã4æƒ½À‡zŽÕ}š]Ð$M=$¼ kF3vÖ>Çœî2ý	Æ ŸX–¬/^\l1#}ž¶CòàHK,ÝÉl�±ßhœ5Sµ·Ðúæ›oÖ|c8ËSì1#Ãžyæ™šqóJ‰øæ?çœscÅA®ûï¿_sªðÑG5ÒwÜqzâÄ‰©„›c)´!�ÞÑÆI\Uøo°-0•=Í„ úî»ïÖÝ»w÷[˜a—ÓYf¿cl/µ>/’´*¬zÙ½{·†3‹¼±ÈâCã¿çž{\bpàëÉ'ŸÔýúõÓì%eïú›zôÐ¡Cõ„	4Ü{»òHÛ	mÈS~Ú˜©¼Hºpj„G]óÿwÞygÚðö•¡®4bÝi–‡óÚì²Ö«WÏwubj.æá›‡Ýüüã�=|ÓMûE?Zz´Âs?ÖòhÁ‚ÖÌÈðáÃõ‘Gi…vg
:æb6pù¦�9æÍÐÞÏ=÷œÑ(ÓåÉlâ7êœ§Ì´1ÚZ(æº€ylµNÜËŽ¹L?/'¡g"éVø~·ÝW+ˆ¾3­�{t†Ém¥ióäOÆ*øÕ¯~¥žxâ‰ �ªÛo¿]]}õÕy?‡†ÆÂš{vŒçhD,G)hˆ-¼‰;ë ÔhòäÉêÄOtÆ)`È¢>àiI+ë(d·V|C®X±ÂD£(iÆŒ »Õ|Û:ë;ßã´LÁÅ±�=mˆ¶äÁ—¶
…ù-áòyè¡‡*zã*-e‰ñí{ì±ÀûÝï~§®½öÚÀÏUæhC´%¹lÍó[ Ó° ¦ãò·uøá‡§:8D +ÉÍYãÿÃþ¸Ä7Ýt“‚/†ÀÏUö`…¶ä!ÚZ(¶J"¦¸™SH”9Oå8å0Þ£Ù>ôÐC�Krýõ×«o¼1ðsòÀð±%Úm®h
«`_ßå6mÁ,ŠF²„À©úÍo~£0g¸”4þ[n¹%ðsòÀÿ!àcK´µP¾¯Ãj èHÍôGŸfiðºóËQ.øæçˆý½÷Þ›ë–œ×ù½/ÆŸž¼ -Ñ¦D[ÅyaX@K‡pŠS3œŠ­ËN±åØƒ ßüün¿ë®»<¿T|Êý„ŠG€¶D›ò�Ëæ<¿å}VÐÂ™#çÁ}vÞ"Ç)@€Ý÷;î¸#°¤W\q…õ×‚� m‰6å¡žó‚NÃj \ÝFVIs4Þ‚�,±‡F�­n»í¶À¥ÂêG«Ç ÆºœÐ–|¢¹l.çÃüVÐØ™�tÿ�h¤ïxÌ˜1
›¡~É%—XÆÏUzBá"àcS.›+4·0jª
2wƒÇZøBå‘çbF€ƒvœ³Jt·ŽÍ=%¹7(&î÷±)Úm¯(
£¨	ì@”¦AƒE	%Çƒ »ü…Ì×sOÀïÿ{ïHu<…(Ñ\}lŠ6GÛ+ŠÂh jB‚ÚN)|„uþ,Ç	D€t8è”Pã�ã
\Àû}lŠ6GÛ+ŠÂh (ˆ«%âÎ,¡ô Ài>N÷qÚ/a+°‚[m1þ  x¯�MÑæ\/ÞB’£`+d‹pô·V­PV)Ry& ünçBŸ ÆÏXöðY§àÒ+`Žr{!Ð¦<3+´¹Dô („­\±„h+…”Qž‰�ûî»Oýö·¿lüð ¤yäÙìa}Ñ¦<«is‰h j8q¨V­ZªCZ;ËRÊÇ\×�ÀŠK}ƒ|ÿY[�“è5ˆÜi¿—aâi[rÙžç·¼NÃø¨îÌ‰Š!ÊáD$yÇünçÎ>nïBpùmy ’ú‚Z8÷æ°+—í’Sè ¿	¹‡Y(™ð»�«õ‚?|óYÆïóJfAKL*Ú”ÏxK" ûûŸ˜ó;¥}³•‚>Ñ‹Ï¥—^ØøéGÁ[¯,ïŽQ	hSž1 Jã²½BÄ£àJƒ#•žÑÊBä’gBFà�ü£ºøâ‹�y!„§ã˜¡{sØ•Ëö
Éºè�©Ë+•µà…T…¹gžzê)Å¥ºpæ(ø¤WúÓŸ\�zNnÚ”Ï‹Õe{…äFàIâ|rÐ9åB—gòCàé§Ÿ¶Üw#¶A~dîBüõç?ÿYŒ?jænÎaW.Û+$÷0 ×<:µTˆàòLÅ<óÌ3ŠKuƒÿ©§žªØpÈ›¿bŒ£ºƒ6åóbuÙ^!²„Ñ ¸ú•]:Â\ˆàòLùŒ;Ö2~ÑB§œrŠB¸rU»vÑ«Lƒd+÷V€@»rÙ^IøþF°Ë™2ß6A¿5�ÏËqñ¼ðÂjÔ¨Q
A;%vòÉ'+6bü�`‹äfÚ”OOÎe{…FàÒ2
ô­SˆàòŒ?/¾ø¢â&� Æ?hÐ ËøëÔ©ãŸ°\�Ú”Oà²½B£ØéÌ˜ŠTùœÏËqáüíoSç�wžÚ¹ÓU%&ÈØsª©êÖu¹u¨ð9¹!:rØU°Šö7Œ`Òµ'—9Ï¼}ûvŸ¬ä’Iþþ÷¿«‘#G*.B'œp‚â'C©3‚Iï¥MyÖpÐæ‚U¶OÁÂh híöHG*¥ðAÚà%„ WÜ¡÷~ýúYÆï³×Ü ´’t!°n=³ ´¹¢ß´a4 [ ˆÝ °pß|óÿ	E€Àk¯½¦~þóŸ«mÛ¶Êí¸ãŽ³ŒßÇÓL täæhð±)Úm¯(
£`7Ä¥}Œã.d�7ÞxC�1BmÝº5PfÇ{¬7nœ:ðÀ='7Ç‡€�MÑæñ	À‘ÈÍNh6lØà<•cLœ8Qqoþ–-Á^½zõRãÇ�—ÐíêÄd’>6E›KÄ, »"�…_½zµóTŽCFàÍ7ßTÜ›¿y³«Ý­0—=zˆñWˆR2oð±)ÚœëÓ»ÉÃø`¾k�™¯]ë:uþ$ÇE"0iÒ$Å½ù›6m
”R·nÝ§	7%žD ¼åæâð±©PŒ,¬àKgW­Z%‹�œ€„t<yòd5lØ°Àƒ¬4þ—^zI5iÒ$$I$™(à" Ú”‡\6çù-ïÓ°€åÎ¿þúëÀo(çór\�©S§ª¡C‡ª�]_[eoô\éÒ¥‹õæ÷‰,ã¹SN“Š {{´)-÷œtV°Ä™{��·Èq ÞyçE¯<>Aå¦Ò¹sgëÍïX²ÜçäÇd!�ã…ê²¹B%«`wÄ‘äšå+V*“<ç@àÝwßµŒßgÈqWÙÃ£Ž:Êzó·hÑ¢ì�r%UÐ–<û hk‰úX�\s‹-JÈIvÚ´i–ñûtÿÊ·S§NŠKƒ[¶lYî}òc:ð±%Úm®h
«ÀÉh×ÜßgŸ}V´p•9�÷ß_�uÖYê«¯¾
ÃGa½ù=ôÐ@ÏÉÍÉEÀÇ–hkÁ€ä(^X =“¸,þã�?ön^È!‚\ö"0sæLEgœkÖkä;tè`}ó·iÓÆ›¤œ§n ¢-yˆ¶V´7 ¦VÀ´æòO––,Y¢Ö­[—=•ÿy"0{ölEgœ…ÿË/¿¬;ì°<s’ÛÒ€ mˆ¶ä!—­y~tf°9Ûáe¹yañâÅ�„©ì7Ï™3Ç2~ŸU_åBC£ç"1þraJå�´!ÏF Úm-Ú7”Tþ›­�Û ­Øàtbøá‡ª>}ú„˜E2’¢ÃŽÊsZŽkñé®‰�¿�[k6lxýÜ¹sÕ�!CÔÊ•+²uëÖÖ€_ûöí=—¦›¹†Xs.æ9ÝdW¯^]Õ«WÏÂ›¸—b@Ú�ÇÉ.m,´7k˜ G«ØW± *»³¥@4pVÄÛo¿­fÌ˜¡8(ÃÁ9nÁõ8i°<éR)9ßµkWÅm·ÇsŒ¥¤¹°˜7ožõæ:uÊo}Žö~øá¹’Níõ…*N�r&„ßÀ_~ù¥…7�ßIltéÃ�ƒžGy¤âNGr©,|ò±!ÚX°‘a'`†�Aúì¢XŒ·’ÆÛ~ÒIèŠë»ï¾[wïÞ]#.›]®lùòý�…8úüóÏ×Ó§O/Äüùóu«V­§�FóÙR"¼Ý5B�i8*Ñ0ìÀ˜dë=0�U“zÂ„	�wj!¢íÐ†²åÊü§�%–Î†d¶Àè¢i´Þ©« t5õÍ7ß¬›6mj—ÅY®B�áUc€OÏš5ËÂ„Øà-8�æÍ›k|2¤×\Ã�™~ôÑGý”=06ÞºéÛ·¯ÆÖé\Y'ú:õƒ6ä)m,±ÄQ:)°…Fh©DƒìŽ2tÛ¶mmù�e	ë˜o·.¸  …ÇÊ>ýÁxÅNí9–9ëž={Åc;(5ÔR…mÇ£s´­DöT…€9…†ÓŠT€Ž‘V«›î”=iÇü”ÀLA*ð¬HH|Ëë1cÆø½á¼JÚ9{tp†R‘h‰ù�¶ãÑAÚm,Ñô0¤³ÇÔ”†CÃÄ€ê'æYuïÞ½m™�ò'å[y5ù‰ŸºkØ,¦±Ê1¼b[ßzë­‰ÇŒ6CÛñèm+ñôSHhNÀß{ï½ÄŽÑæ‚ºâÎ2š>†�¥Á‰Å0ˆ`_0`€­¦±Ë•þå—_®1ƒDôHï¥ÍÐv<òÓ¶OÍ !ç*máo¼ñÆHÁË7³/¾øB·kÛÎ–Ó)sRŽKÉøù™…8‰Áûª«®Ò˜cÏW]"½�6ãÑAÚm+ñ´$|l ¾è4¶3F
`E™QM>91(äø ƒJtï©"Œ�¿s:ŽSs…à`ò™|Ð)f"Ži+´O¹iS´­TÐo ¥] Na!M"À¥ˆ´ªBË–Ï)kRŽá²[O™2%1˜+×S$[§ûï¿¿æLD’ˆ¶B›qÊ‰cÚTj¨#$Ý	¶qç�w&cDÀµårÊ˜”c*%üÿ%¯bÁj6]«V­ÄbŽ-ÔK�‹-fhÏÓV<ºH[¢M¥†ö�¤ÓÀvAà�>«²°„Ws.Ý)[ÒŽ¹ê0MÓUåi>§ûŽ;î¸DãÍú¿úê«Ë+Fd¿ñS‰¶âÑIÚm*Ut¤µ’”Ï€ë®»Î–É)_ÒŽÛµk§¹46íôÌ3Ï¤oDFÖØã;Ü9ºÿ´%#æv`¯€ÿÀ®\²ˆ›8^yå•ìi,ÿ¹¡kÍcÉ;h¦Üpôì³Ï},Q÷3¤õ}÷Ý—(™r	Ã]†=ôP®Ÿ#»Nñlx¢Ñ–RGl\ÞÛo ìZ‹uQÐí·ßnËâ”+©Çðí§¹N>­„�Š©Â�R5üïÇ7ÿÐF<úH2ö¢6–0„¦Ë¢ñ`›>ùäk{§}!Âƒ]»vYÑp#Ì²è¬,X ° ¤ètâJà…^ˆ+ë‚ò¥Ï†Z�‹¸õ™6â!ÚmÉ™l (ð`Û[0šVõ—¿üÅHA*JhüÀ­è±X'^¯¾új¬2š9?·è?!mDÿ
‘�¶Á:wm‡6dŒL7 ô]î* CZÇá*Œ5½Î;Œ¡bÂ4"~K§�è8…|ÒFtüÔ+Se¤MÐ6<Ä´!cdº à|åÛ]ºÐŠzp‹­*=í¦‘èÒÇ)dâ‹Âîl‰ƒ�ì-FM´	O¨wÚŒñîrÀû(ˆÑçž{Î[X£xoÝº5–^G…âØ…�_ø0’6–\¾IÓJ}Ä]·ÑŸ6á!ÚmÇ(EÑ Ð‰ÛSÎRð�FÖQý÷�®•lùäóùçŸçs[bî¡¯DŸh¶‰‘¯"A¢þD¥-øôòh3nˆ	^ÀïQ4 ë¯à¥NùàÊ;ßéü9ÔcúVOãwt¨¥‰øFÅ8Iå‹òeÁ9Ú‚‡h+´ãU°	%ë,½�r`.
¢BzFW£È6´<ÒfL˜Ïö³‹(¢~z‚Ž‚h>ži+´ãUÀ‚üÌi‹h�<ð@$#óüŽN3¥­÷Bã‰k*-Œz¦üØ1FRå¦ÁY)Ú€çå´ÑV"¡(€å(Ñ8g©8ÅõÏþÓyÉÈqÚFÀ3Œ\L%Ê {í•š­ëe` ìQÈOÝ§xˆ«§–{®;�²`!oÍ–†o‰»îºËxw±fÍšÙ,SùŸ�/ÒDŒØ“¶FË‰/õ;2�—B?†ÓK÷==%Úm$2Šºø%sõ¸Ôõõ×_7Zà8 Õ
	ç Fñ	;qìý·Â¤…�nTé1´{1&‰:ï³Ì›¶A‰ŒÌ–Ò¿¿Çe;¶9¿î¸ã££ô�5²bÈù‹“ü«3–&ÂÖZuðÁ§Id—¬pî:û„c:Ø˜æýö§MÐ6"¥8€E(¡kO.GAá¥ÇXÁù5]©¦„ç·(•˜JÞHºUªTI�ÌN LÇZ¤®û¬6¤MÐ6"¥8 �¯]Å9`jº‹ßsØZ)°aeÆî(œƒ„•\déÀ©edy…™Ç.ºuëf’®´¨ãÔuÑbqFW°~Ð	W_Ý{ï½ÎK¡üñ¡¦UbŒ0ïÀQeZ>pke| -4a	1Ê0|:®„{H÷YiH[ MT*: ¥e—Çv€@Ç‘¦‚^ÒÑ>8óKÃqÝVcÜ¦BÂw®îÜ¹sêð¾ðÂ+,[¡7P·}œ£Òh•’~ŽR»”ä”SN1±%®pTÞ2æ{N?uK—.-Tßbî¦›nrÕm¾åŽë>5å"œQˆ¨Û>e£TZâdë$°½4¶FQÞ·ÞzK³’�ù%ùxÄˆFpˆ*QlbÒuêÔIÞÆA/Æ&ˆ:MÝöèußì‚d�túÜ¶Á¡Ûnl€	½èr¹_¿~v>Î<“vÌ¸ð³fÍ
ƒ¨5jT*ðfý?ÿüóFà¡.S§=:F�§î�ÛÁ.€FŽi¤2&MšätÑ•·W–8Î¹¨ˆ½ ,ÄJ¾Þ:¥/~ì19uÙ›Î©óB8ÂP6Pìªÿõ¯½B°ôRûÄ]·óuÊ×1.éeË–…^ö¸Lº7f¬[0‰‰:ìóÙI]¯´(»/�Œ«Üƒic³fÍôŠ+B×[¦éÓ%³óuÊÇñSO=z™ãLpçÎ�ºOŸ>‰Á×[§Œl‚¨gÔaO~Ôqêº�ÜáìÌ3Ï42+0qâDÍïlo~qŸ³ëÏà¥¥Fpw­Ù³‰_oþ‚£Ðáæ¨?u×›Î#ÝìƒüRE íB°¸‡~8ô
b‚÷ß¿+o¾QŸc±RI„ËUYpqž¨F·M›6Æ¦Y©³>úCÝ¦Ž•ƒ@üF6€œ‡›é\zUÔõÑ£GÛù8óŒú¸gÏžzÍš5E•%3V`z^Í›77²žºJ�õèušº-”·à€;vÔŒìk‚n»í¶Xgú÷ï_)Œ?[wãÆ�‹u} ÃoÁóoVœPÿSG©«^ýÅ9uZ(Ojà¾©`�C‡52@À-]¿~}W~ÞüMœsŠ¨¢ µ¢)S¦èV­ZEŽ÷€ôòåËƒŠ›×ýüî§ŽúèÉT\£N@€[àè×(§”LÑœ9s"­Æýøã�kNKVVâTgƒqÕ¹W
9ßÿýõõ×_o4ØjŽéNêpú¶sBè$Ð©b7ØVÎÙ2ê¬)â”5j~#:óë¸ZµjšK|-Zdª©KADsu›‹®.¿<x°ž>}ºQ\¨“ÔM�žPw©ÃBE 0Ïº€å®>Sƒ‚Y-Y»v­¾å–[4GŠ½ùrÎ5ñÃ‡7®ˆYùÓö®Ûõc�=¦±ý9¼ÙÐ4HÃõ–ñiUêbŽ�¦Ô]¡"¨‚ç_»N2Œ,òÎ¦M›4­†f-òYÕå’Ë)'—ÀöíÛW³kˆð^Þ¤åÜn#ž0a‚æ‚öíÛû½UsâÍ­¶pæ¡¯¹æ�;>©‡‰‹}¨‹ÎzÏSg©»‰¦´øn¦WÌ	à®N4{÷î­^yåE§ŸQ…®»Z°`�åÔaõêÕŠa°èáƒå“îÇèÃÊk9–ÀJ°(D+É<vìØ¡-‹7ŒM1x'£éÐUZ�5¬º§zMÂè»âqT‰@ä´ÓNósî9rx]IVLL…â@
½¦¸Z[T€Ñ��ðß’b) €ÆIS÷¼ú˜ÑÑÔúí�ÓBŒ*´ |¸jVh¾‘ù&†³ë-œ½.ÿS0rÐ\ Æ�ïÍ‚[|‡ƒg{Hêyš b¸¼
ü?`[öyóæ)vÏhÜŸ;òªÄ0dØe—]¦žxâ	/
Üä3
üŠ÷‡$ŸÛF”d!=²ÍÇùVð °=†çjëÖ­
="	ëä‘IN+Œâså•W*øiô–ö\¸\¦UðÞ˜´ó46 Äp&˜ß_Çó$K˜Ž±åN8áé	dA‘ÿ¡ À7?¶+l óKo4.Þå÷CÒ¯¥µ ®ÿ×Ã“,±`8ðO<Q�,(ò¿(hüW\qE.ãg4Ÿë‹Ê Æ‡ÓÜ ¶Éàºà£y’¥™3gªuëÖY�@TSBÙ¼åi!À)Ç‹/¾Xa{¯_Áø-À®??„bB€�ûee¦d¸xã¥0ë$eˆêuÈO·2:—ö(ŠQÄG÷�ËTfŒm#ŽA'%Ëˆà¶^êŽŸNet-®¨ZÈ^ÈVÈà2•Ö½{wýé§ŸF¤:’MÚ ®Pgüt)£cbü "©ô[¶ìª@îîc`!A <¨#9v‚R§¨[B)@€2þv5µk×ÖO>ùdyõ/¿Ub¨Ô¯Þdt‰:%”"†@V.vU(÷‡Ó4÷ý	D€º@�ð	ÝEÝ¡Q—„Rˆ ƒÔ
v5<§k(F­ªÜP¨~:’Ñê�PŠhÙ§€ËT2¿õ°�¸r[@%.=ë>Ç÷>u…:Ó,TÔF¸N»L#°ß~ûék¯½Voß¾½›Bå*:ëšuÎº÷Ó‰Œ®Pg„Jnú5˜‰ÊT<œ‹èÙ³gW.K¨„¥e³®ýt £Ô{“Ž…J�Þ(ÏÇà2J@¿}wß}·¦[*¡ÒB€uÊºeûÕ}F'¨B• �Æ(ãó`_e`¼¸¨|Ê•–™%³4¬KÖi®úÎèuB¨!ÀnÞÿ¯—QÎßxã�šNA…Ò‰ ëŽu˜cnŸuÎº§H— TVê„‚ÿ\¦àµN�:é_|±RðH›ù3Ø
ëŒu—«^3uÎº,ƒW‡M`_¥9ãŒ3ôÜ¹sÓf•N^Öë*W=fê˜[xm¿’8,:ãï?Á¾
D¿ó]t‘±�Ò•ÎZC,ðÒ¥K­ºaåª¿LÝ²Ž…�œì‹_~^
öU&øþ×7Üpƒ^µjUˆ*,I‚ ë€uÁ:ÉU_™ºd�²n…�¼à¨0=¾ìû*WãÆ�õ˜1c4Ü’¢»òLsbÏ:ÈU?™ºcÊ?@*�^xì5pNEkÚ´©yö‹/¾(B¥åÑ| ÆŒòKÌË«“L�±î„�¢à4’LçT¼úõë[1íL.ÍÇPJíbÊx�Ä¸¼:ÈÔëJ¦ö ‚P¸TCrç€?çTD†‰æ³±cÇÊ:‚"Z"ÎãCbézÛ‹?ë„uÃ:Œ"P©Ÿžö*¢ëü°Ã³¢ÕÎ™3GÖäÑpŸX1Â/±«ßL°.X'B‚@¤PéF€§�ËUVÆ«g¨pD•‘Pá>Ã§bD¬*Â3ƒ9±Ã…’|'Šœû¹*8=<<\œ“°4UõèÑC�tÒIêøã�W:tˆ,¤uN¡"þaÏž=ê“O>QS§NU&LPèÂÐngd&‚ÿžþ,TÒ ^ŽG»àúÙà3ÁÍrÜc_®^½º:ê¨£TÿþýÞ~ªsçÎVÌ{û†:øæ›oÔ‡~¨Þ~ûm5yòdõÑG)ìÒË§„+qÓßÀÏ�çæó€Ü“Ò ä‡S!w„‡ØætT¹½ün<Ô¨.]º¨ž={Z½„¶mÛª†fNÕÿõë×+†oçÛýý÷ßWX¦«V¬X‘oø¶ç§wmò­ÿ5X(d¤ÐÉuÄu†4?Ì¥¨y­Hƒ“JÕ¨Q#…Á0«gÀžBûöíU³fÍ¦Ã<Ú ©øé»ï¾S7nT+W®Tð©o½Ùù¦‡¿=… 
Ÿüù
¹7r4ÿ`®½X 2ˆ€4 ÁõIšÛ|x ˜»ÑM[í³Ï>–ñ·hÑBµnÝZµiÓF±×@ÆrXë7¬‡Wü´à½aƒc²«¾mÛ6ËÐw‘or2æ¨Å‹«åË—[¿ñÞ€´÷Ï¿	ž žþ,Ò D rŽ,ØîîæØ?
¦ªU«*x¼Ql Ø4hÐÀ:®W¯žª[·®ªQ£†Â»Âœº99Û@Ðh1ý¦¾ýö[µk×.7ÙjóæÍ
óð–ÑoØ°Á
¶Ê€‘—0³HbwžßòîJç›Ábô !j’ jÄsçÇõêl8^@WÔl€K�6 4ò`~×Óø×€…bF@€˜+ œì›â·v`~2tÏóZmp’i+„[þ<Ì.=�yM(aH�°
)Gœêø�½„VàÃÀ2ÿ›à?§	j�«€£ Î¿oÓ¥Ö—àÏÁŸdþ/Á¾ÝóšßÃ}B1" @Œà‡”5§ë�Ùf/¡Qæ¼>þ×³qà}ô‚CæøÃÞàì(!Gî~ ó;œøä�`ùfðF0�ý+0ßäë2çô Äû„RŠ€4 )­¸Ä¦±sú‘Lã'gëŸótl ÈœŠ#ÎÇ3B‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  E"ð¿¶[#R¤aÂ    IEND®B`‚ic08  ?ô‰PNG

   IHDR         \r¨f  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  4ýIDATxí}¸ÕÕö¶Ñ¤
(R¤((A)êg	Æ J"1¢þØ5±ƒ»Æ[ÔÄ(*’cƒÔˆ4A)”‚R¤Ptï;9g¾™¹sî=sÎì)ç®õ<ëÞ™93{¯ýîµöìÙe-¥„A@A@A@A@A@A@A@A@A@A@A@A@A@A@A ¡ì•P¹D,ó°î÷ÎdóþkóYJIC@€¤ÕHaòÔÀcµÁÁ:þ7Àq�×Âÿêàjà*`¿³`#ð-xø?àmà-Þ€ÿëÀëÿ·âx'X(ÅH�®Ê«q›‚[‚ÛƒÛ€›ƒƒiì4r¸IbÁÆ��Âð
ðàOÁKÁ«Á›ÀB)@@€äVRMˆFãîî>
Ü
Ì7¼i#Gö–€?ÏÏ³‘ØJÒ $§BØ=o>ÜÜÜÌëi&~N¬Ï¿ž	^æu¡˜� Þ
h‚ì{€O ÷³K_\0í·ß~ªN�:ªvíÚªV­Zª^½zÖÿš5kªªU«ªêÕ««5j¨}öÙGí»ï¾V>{öìQßÿ½Ú¹s§úÏþ£vïÞ­¶oß®¶mÛ¦6mÚdýßºu«Ú²e‹úî»ï
–-óànüç'Ã{à·À3À_‚…b@@€èA?Yž>Lãg—>U«VM5lØPµlÙRzè¡ªU«Vê�CQMš4±®×¯_ß2z:„bˆÏ†��ÁÆ�ÕúõëÕ—_~©V­Z¥–,Y¢–-[¦–.]j]ßµ‹_ �‰ŸlÞ O/E„€4 Ñ ÝÙ÷ Î‹øÆnÞ¼¹êØ±£êÔ©“õ¿uëÖêàƒ¶Þî{íoj­­^ÂÚµkÕâÅ‹Õ‚Ôüùó­ÿ+V¬°zyô¿7}ƒÓÀ/�ß2ˆ@¼Úc°`	Hš]yvë‡�ƒ9R_!±«Þ¶m[uôÑG«^½z©#�<Òj x=MÄO6 óæÍSÓ¦MS3gÎT‹-²>-ò,g&‚_ ós�ŸB!# @È€"9ÜñM6¸¸BŒùF§±÷ë×OõèÑÃêÚg¿Ïñ|IÇø©0cÆ5eÊ«Q`�!â¥¹àçÀìp@Q($*TÎ�ò©ÉÐØÏŸ>\.qÄjàÀ�jðàÁª[·nÖ ]¹”Ø�Tœ={¶š8q¢zóÍ7ÕÂ…ó)á×¸i<øi0!A vúB‚Á;À|[ådtíõe—]¦ñÔ;vìÀç³ Ä„Ø£ò0ÌüF¬‰y_°� 9{#Ç“ÀüFÝÎ©´‘×gŸ}¶~å•W4¦ÑÄâ+@€+bFìÊÃ6ƒ=ë€uÁ:Œ#À9û� çTPŒØë{î¹Gcš¬•—Ÿs!@ìˆ!±,ëL]°NX7B‚€º#UBå|ãcÎ]ã»^¿ôÒKÒÅÏeÕ\ç'1%¶Äu�‹Y7¬#Ö•� 
­‘Ê#àœßøXq§Ï9çýÞ{ï ÞòHˆ1±&æ¨“\Ìºb�±î„�‚¨…§®säÙWÑ¨„çŸ¾þè£�‚è°ÜÄœØWÐ°îX‡¬K!A o¸j�;Ù|kêõ¹çž+†‚!›Öë$W}eê’u*$”‹@Süúø[p…Ú{ï½õé§Ÿ®ßÿýbõVžÖ	ë†uäWw™:eÝ²Ž…�2Ç•¥`_êÙ³§~ã�7BV[I.lXG¬«\õ˜©cÖµ� `!ÐŸû*vØéûï¿_cG\Øº*éB€uÅ:cÝåª×L�³î…*1ÿƒ²/—Qì—·¾-±åÕ�šJ²¦`Ýq|€uéWÇ™º§U2¸µî.°ï·>¶ÞêW_}Õ´~Jú!Àºd�¢¾ý˜:@]H×vK,TðØ;à2ÊÀE&—_~¹Þ°aCDª)ÙD… ë”u[ÎB"êuC¨„8e[.cümÚ´Ñ¯½öZTú(ùÄ„ ë˜uí§Ý Ž•û¢<£Á¾]þŸýìgn®bRIÉ6jX×¬sèƒSG¨+Ô¡@ >Ê@¯2e*û€Ð�?þxÔú'ù%Ö=uÀO72:CÝJ1\þ¸L%ÃÕ–ž>}zBTQÄˆê uÁOG2ºCJ!½ óbp™Ê6l˜þúë¯ãÒ9É7aP¨~º’Ñ!ê’PŠ8²n »*•#À·Ür‹†«ë„© ˆ7Ô	êFŽYêuJ(ü2–ÙºËo½çŸ>n=“üŽ u$Ç¸ uŠº%”`.‚leFú<C¿ûî»	W=/)PW¨3Ð%/S·¨cB	Dà*Èô=ØUi]»vÕŸ~úiRtKäH	ÔêŽWŸ2:F]J×B–2>úú÷ï¯×¬Y“•1“† u‡:Ýò2u�:'” èñÅ[AúÔSOÕß|óMÒtJäIÔ!ê’ŸŽáuO(F®@ÞeÞüg�u–F0Ë”©šˆ›T¨KÔ)èš—©{ÔA¡¸ yÒ¬«Rè0R‚n$Õ”Ò+uŠºåÕ·ŒR…"D`(òÚvUÈðáÃ5âÛ§WËDòD#@Ý¢Žyõ.£‹ÔI¡8yl»*bÈ�!i­@"\ú ŽQ×¼ú—ÑIê¦�A:#íµ`W4HÂn¥ß¶RS†/£Îyõ0£›ÔÑÔPš¢ÓÛ›àÃ�èöîÝ[½üòËªAƒÎËr,E FÔgœ¡¨Ä›ÏÇ¸0ü¥÷‡$ž§¥ »¦—Àœ vèÐÁ
/Ý¬Y3çe9"A`åÊ•Vx÷O>ùÄ›ß¿pax»÷‡¤�§¡ Œót¡¼Æ�«	&(låt^6z¼iÓ&µhÑ"µ`Áµxñbµzõj…)"õí·ß*8žT5jÔPx jÙ²¥jß¾½:âˆ#”4N…W	FÞÕçŸnã½bÅ
…î·Úµk—Úk¯½,¼AXµhÑBµk×NÁïŸÂ^µï¾ûžiÀ'çÍ›§N:é$…ECÞ'Ã…_�ù© T¿Æ³®ï­ý÷ß_Oœ81’oF½7nœµ]ŠVž‡Y—Œ”™›Júöí«o¿ývýÙgŸE"oÚ3áH;v=jÔ(�FTW©R¥®^}Èž3LX·nÝô5×\£?øàƒÈ  .R'³r8þSw…Š@€û°·�mpÑòëÇ{Ìxå®]»ÖÚZŽÿ8[&§|¹ŽëÔ©cM!‰ÿªãÀ=ôäXkÖAµjÕ¬�º×_]ÿý÷þ™†x•:IÝôÔ?uW|	 „B¨1úìõÒK/±ÚÊ&Å <ð€nÞ¼¹+_¯…žS1GŒ¡ñ)Q6óJzå…^(ÏmwQõ@£<xp$ÞŸ¨›>zA¦.@€qôs:`À £zæÌ™£ûôéãÊÓ+CXçt�õÆûá‡*©Ùk½lÙ2=tèÐHðfýúë¯7ºJ”/ê¨�ŽP—£˜@fi§KQ �LÓ&£ôŒ;Vc@É•§Wç#GŽÔ›7o®t�À”)St«V­"Ç›º|ùrcxSG©«>ºB�Ê�®¸g3Ø‘Ýf“�9o»í6�‘c;?gÞQW¶mËTå˜HØúåqøá‡íN]¥Îzò¦NS·…ÊA€óý\YáoÌ˜1ÆZìÑ£G»òòæÕ9#ÚVßÏ<óŒ®^½zì˜sŒçÃ?4¦WÔYÝ¡nSÇ…r ð;\wwÂ	'hÌû©(F�õæçùñÇ_ÒŸŒÑ—ãÏÖ1gx–.]jD·¨³ÔÝl^ŽÿÔq!zâ/Ú q}áÂ…F*ˆs·IRÆl¹Ï;ï¼H¦­Œ€ZN¢X-§5jd×m¶¼qÿï×¯Ÿ1ßÔ]£Ôqêº��8žv)È£�>ZŽJþV”i.êñæ—”ó§žzªðÂ%ðIŽŽG5»RH^uÕUÆP£ûÈD]§Îeøþ»€:ýôÓõž={B¯N»åpìàÊß+O”ç|SrŠ¬Tˆ+!£Ä/h^\m8yòd#pS‡©Ë>2Qç…€Àaà`¤†j¬7R!“&MŠuÄßYÎòŽù)P
ÄzôéÛu]QþÖ«W/ccMÄ€:í)užº_©‰}Æƒ]àp%ž	bô~óyóKâ9Ç'fÍše†HÓäšþ$âë'“ÉÀ1ÔiŸ<©ûiØ�1ÍÃ-¹üú{ì±ÆÜz½õÖ[�6ó@6¿J‹ì—§™øæ‹s¾?hýõèÑCïÞ½ÛäÜäDÝöÈDÝ¯´!ÇöGáç:©Zµª~ç�wŒT ÍáÙÕ[)‰9¯[·®±i*c ;¾é¦›ƒ¥SÏrcK·~ûí·%÷�ºM÷äO -T:úJìã‚.qGj«V­ÒðäÊÏ›Ï|ðAG)ÒsÈ7^çÎ�S‡÷…^hdê¸�žÑ*ˆÒ.Û`ÀÁ‡†‡cà?ýôÓv^Î|“~Ì�liÜ0Äñ‹‘v]\d2¦uœºîÑ»å8§MDN{Gžã3¤õæÎ¼/»ì2uÈ!‡8/…z<uêÔPÓ‹*1ìPTˆ_Uv¡å3mÚ4…A×ÐÒ‹*!L¿ZˆLåG§®{ˆ¶@›ˆœâh håÿßYRºs:ÿüó�—B=¦"ÎŸ??Ô4£Jlýúõ
Þ„¢Ê.´|fÌàZ—ôæí¼	œºN�÷mÂÜÐ“Yö4Žà×Èü ¬ üå•W*Œ;/…z¼nÝ:Ë_¨‰F”¾‰,?„eJ6ô‘Hß‰i¥�?¦c_sD]§Î{ˆ6AÛˆ”¢n ØÕù…³„]ºtQÃ†s^
ýø«¯¾Rtè™VÂ†•T‰ÿ
.ÕR%³SX:{5MÔyê¾‡h®OcÏï¡ŸFÝ ð;ÇåÀŸ-!½éš$DxUìÚ¥•ØƒIÑS2Öÿ§Id—¬üìÂÀ«ëZØ'ÔyŸ^ m#Ò±€( vqF8�„W…uÒÎKFŽÎÉHºQ%ºuëÖ¨²
%L¦ºÁ¥¾D1€IÝ§xˆ6âúDöüêi” ÖÔ)ý%—\¢°äÕyÉÈ1¼ÂI7ªDÓÖ{áÛ“ci%Ê…üÔ}Ú€‡h#®¥ç÷PO£j jBê‘NÉ4#Š·?ó„{&gÖ©;6ý‰6 ˜ÿW{ï•j…-½R”?ªà"´Ú‚‡h+´ãU-�‚’tp–æ—¿ü¥‚§Vç%cÇue$™´vÓ¥Jôš5k*l±M•ÌNa‰wT m€¶à!Ú
mÆ8EÑ ì‹R¸&ù›4ib|äß‰ÃuEñ©áÌ3Ìcâ•&bƒË�]i%¸l�TtÎøÔ1m†¶c”¢h ~„ë,ÅOúS+†žóšÉc8ØPQWj˜å9ì°tmGˆ.£«:ÃÄÖ/­Ö­[û]6v�/(Ú„‡h3´£EpJ°_¶üž=÷Üs³§‘ü¯]»¶ŠºRÃ*Ç/|V�…•¼‘tø¹…�@FÒŽ"Ñ£Ž:*Šl\yÐ&<c=´ÚŽQ2Ý p^Óµß>ðý=Œ’
yôÑGÍÃTâž¡Èi#xØI›È–¼Ø‚­~ô#ã/Þ2Øp �¶á!ÚmÈ™n Br×Ôß/~ñ‹XäÙÀN˜µ…èÂ©¿€s7XaBIZì¹ÄÒ�/)Ú†‡h;´!cdºê”œo2ø¾w^Šì˜­z‡®‰ˆÈò.4#*Å©§žZèã±>ÇA-6^i£ÿøÇ±MaÒ6|z{.
O“@KÛÛ)ðgœatÓ�3/ï1¿¥Mï9ðæYìyÇŽUïÞ.‹M2ÒçÓ†7{,Q­Mñ«ÎžÐF<D -!“ _]u³Rs^•­kœ{©šà¶QÏÀPœðÎ{Ð A©„Ë8Õ´){ÝñmÄ³�6”ºn WÝLs=¨Å]»v5ævË6ó¦ë®»Î–)+[ÿcä¿$Â„1`ñõÊDÿ‹ð»�·™º‘!Åh+ùhKFV²™êp"Õ5”zòÉ'+8DÄåxé¢‹.R-Z´ˆWˆ<r¿á†bû\ÊC¼¼oáüv\ã>y‰áPµmÛ6È#Fî¥�ÐV<D[Švq‚G€ §¿Æv+FßpÓ§O7ÕhNwìØ±¶lN9“r|Úi§‰Š¨� 7\tk‹9¦àô†B*mñÉÐV|ü)Ò¦RC¯BR»Âáø ÝÿlÕ`w fä§ŒI9†Ï¸T»Ïbœý¿eË=dÈ��Dâ�µøF]ÑgqòŸŸ´�NÒ¦RACJz±´`2øb`�÷ÂIˆîÙ³§-£SÞ¸Žèõ×_wŠ™êcz×Å¨v¢0öÖmRÝ®Óf<²Ò¦h[‰'ŽXÚÂc[¨f<¾$Ò_|¡ÛµmgËê”;êcv‘ü�I„© ™àTCÿä'?I¶¹ê’F–T—ë´ÚŽGöTÌüÞ)4Ü=šÍîíÛ·÷é9£Ó>üðÃZâ›?éÆùå—'zœ~ýBØÓ¶MÜÀ0l!é´dÉ�7¶ÌNùMcñ‡~öÙg“QÞòíØ±Ccä?,ó©+ö´n½õÖ¼Ëç�>�(mËÞX‡ãÄw­lÛ
�–7Ç°ðÆ–ÛYSÇØu¦ÿýïÇ©c¡æÍp`gŸ}v¤©,òÑãÇ�µÌ&£íxÊGÛJôÎ°3�³k;wî\“…žö¸qã4æƒ½À‡zŽÕ}š]Ð$M=$¼ kF3vÖ>Çœî2ý	Æ ŸX–¬/^\l1#}ž¶CòàHK,ÝÉl�±ßhœ5Sµ·Ðúæ›oÖ|c8ËSì1#Ãžyæ™šqóJ‰øæ?çœscÅA®ûï¿_sªðÑG5ÒwÜqzâÄ‰©„›c)´!�ÞÑÆI\Uøo°-0•=Í„ úî»ïÖÝ»w÷[˜a—ÓYf¿cl/µ>/’´*¬zÙ½{·†3‹¼±ÈâCã¿çž{\bpàëÉ'ŸÔýúõÓì%eïú›zôÐ¡Cõ„	4Ü{»òHÛ	mÈS~Ú˜©¼Hºpj„G]óÿwÞygÚðö•¡®4bÝi–‡óÚì²Ö«WÏwubj.æá›‡Ýüüã�=|ÓMûE?Zz´Âs?ÖòhÁ‚ÖÌÈðáÃõ‘Gi…vg
:æb6pù¦�9æÍÐÞÏ=÷œÑ(ÓåÉlâ7êœ§Ì´1ÚZ(æº€ylµNÜËŽ¹L?/'¡g"éVø~·ÝW+ˆ¾3­�{t†Ém¥ióäOÆ*øÕ¯~¥žxâ‰ �ªÛo¿]]}õÕy?‡†ÆÂš{vŒçhD,G)hˆ-¼‰;ë ÔhòäÉêÄOtÆ)`È¢>àiI+ë(d·V|C®X±ÂD£(iÆŒ »Õ|Û:ë;ßã´LÁÅ±�=mˆ¶äÁ—¶
…ù-áòyè¡‡*zã*-e‰ñí{ì±ÀûÝï~§®½öÚÀÏUæhC´%¹lÍó[ Ó° ¦ãò·uøá‡§:8D +ÉÍYãÿÃþ¸Ä7Ýt“‚/†ÀÏUö`…¶ä!ÚZ(¶J"¦¸™SH”9Oå8å0Þ£Ù>ôÐC�Krýõ×«o¼1ðsòÀð±%Úm®h
«`_ßå6mÁ,ŠF²„À©úÍo~£0g¸”4þ[n¹%ðsòÀÿ!àcK´µP¾¯Ãj èHÍôGŸfiðºóËQ.øæçˆý½÷Þ›ë–œ×ù½/ÆŸž¼ -Ñ¦D[ÅyaX@K‡pŠS3œŠ­ËN±åØƒ ßüün¿ë®»<¿T|Êý„ŠG€¶D›ò�Ëæ<¿å}VÐÂ™#çÁ}vÞ"Ç)@€Ý÷;î¸#°¤W\q…õ×‚� m‰6å¡žó‚NÃj \ÝFVIs4Þ‚�,±‡F�­n»í¶À¥ÂêG«Ç ÆºœÐ–|¢¹l.çÃüVÐØ™�tÿ�h¤ïxÌ˜1
›¡~É%—XÆÏUzBá"àcS.›+4·0jª
2wƒÇZøBå‘çbF€ƒvœ³Jt·ŽÍ=%¹7(&î÷±)Úm¯(
£¨	ì@”¦AƒE	%Çƒ »ü…Ì×sOÀïÿ{ïHu<…(Ñ\}lŠ6GÛ+ŠÂh jB‚ÚN)|„uþ,Ç	D€t8è”Pã�ã
\Àû}lŠ6GÛ+ŠÂh (ˆ«%âÎ,¡ô Ài>N÷qÚ/a+°‚[m1þ  x¯�MÑæ\/ÞB’£`+d‹pô·V­PV)Ry& ünçBŸ ÆÏXöðY§àÒ+`Žr{!Ð¦<3+´¹Dô („­\±„h+…”Qž‰�ûî»Oýö·¿lüð ¤yäÙìa}Ñ¦<«is‰h j8q¨V­ZªCZ;ËRÊÇ\×�ÀŠK}ƒ|ÿY[�“è5ˆÜi¿—aâi[rÙžç·¼NÃø¨îÌ‰Š!ÊáD$yÇünçÎ>nïBpùmy ’ú‚Z8÷æ°+—í’Sè ¿	¹‡Y(™ð»�«õ‚?|óYÆïóJfAKL*Ú”ÏxK" ûûŸ˜ó;¥}³•‚>Ñ‹Ï¥—^ØøéGÁ[¯,ïŽQ	hSž1 Jã²½BÄ£àJƒ#•žÑÊBä’gBFà�ü£ºøâ‹�y!„§ã˜¡{sØ•Ëö
Éºè�©Ë+•µà…T…¹gžzê)Å¥ºpæ(ø¤WúÓŸ\�zNnÚ”Ï‹Õe{…äFàIâ|rÐ9åB—gòCàé§Ÿ¶Üw#¶A~dîBüõç?ÿYŒ?jænÎaW.Û+$÷0 ×<:µTˆàòLÅ<óÌ3ŠKuƒÿ©§žªØpÈ›¿bŒ£ºƒ6åóbuÙ^!²„Ñ ¸ú•]:Â\ˆàòLùŒ;Ö2~ÑB§œrŠB¸rU»vÑ«Lƒd+÷V€@»rÙ^IøþF°Ë™2ß6A¿5�ÏËqñ¼ðÂjÔ¨Q
A;%vòÉ'+6bü�`‹äfÚ”OOÎe{…FàÒ2
ô­SˆàòŒ?/¾ø¢â&� Æ?hÐ ËøëÔ©ãŸ°\�Ú”Oà²½B£ØéÌ˜ŠTùœÏËqáüíoSç�wžÚ¹ÓU%&ÈØsª©êÖu¹u¨ð9¹!:rØU°Šö7Œ`Òµ'—9Ï¼}ûvŸ¬ä’Iþþ÷¿«‘#G*.B'œp‚â'C©3‚Iï¥MyÖpÐæ‚U¶OÁÂh híöHG*¥ðAÚà%„ WÜ¡÷~ýúYÆï³×Ü ´’t!°n=³ ´¹¢ß´a4 [ ˆÝ °pß|óÿ	E€Àk¯½¦~þóŸ«mÛ¶Êí¸ãŽ³ŒßÇÓL täæhð±)Úm¯(
£`7Ä¥}Œã.d�7ÞxC�1BmÝº5PfÇ{¬7nœ:ðÀ='7Ç‡€�MÑæñ	À‘ÈÍNh6lØà<•cLœ8Qqoþ–-Á^½zõRãÇ�—ÐíêÄd’>6E›KÄ, »"�…_½zµóTŽCFàÍ7ßTÜ›¿y³«Ý­0—=zˆñWˆR2oð±)ÚœëÓ»ÉÃø`¾k�™¯]ë:uþ$ÇE"0iÒ$Å½ù›6m
”R·nÝ§	7%žD ¼åæâð±©PŒ,¬àKgW­Z%‹�œ€„t<yòd5lØ°Àƒ¬4þ—^zI5iÒ$$I$™(à" Ú”‡\6çù-ïÓ°€åÎ¿þúëÀo(çór\�©S§ª¡C‡ª�]_[eoô\éÒ¥‹õæ÷‰,ã¹SN“Š {{´)-÷œtV°Ä™{��·Èq ÞyçE¯<>Aå¦Ò¹sgëÍïX²ÜçäÇd!�ã…ê²¹B%«`wÄ‘äšå+V*“<ç@àÝwßµŒßgÈqWÙÃ£Ž:Êzó·hÑ¢ì�r%UÐ–<û hk‰úX�\s‹-JÈIvÚ´i–ñûtÿÊ·S§NŠKƒ[¶lYî}òc:ð±%Úm®h
«ÀÉh×ÜßgŸ}V´p•9�÷ß_�uÖYê«¯¾
ÃGa½ù=ôÐ@ÏÉÍÉEÀÇ–hkÁ€ä(^X =“¸,þã�?ön^È!‚\ö"0sæLEgœkÖkä;tè`}ó·iÓÆ›¤œ§n ¢-yˆ¶V´7 ¦VÀ´æòO––,Y¢Ö­[—=•ÿy"0{ölEgœ…ÿË/¿¬;ì°<s’ÛÒ€ mˆ¶ä!—­y~tf°9Ûáe¹yañâÅ�„©ì7Ï™3Ç2~ŸU_åBC£ç"1þraJå�´!ÏF Úm-Ú7”Tþ›­�Û ­Øàtbøá‡ª>}ú„˜E2’¢ÃŽÊsZŽkñé®‰�¿�[k6lxýÜ¹sÕ�!CÔÊ•+²uëÖÖ€_ûöí=—¦›¹†Xs.æ9ÝdW¯^]Õ«WÏÂ›¸—b@Ú�ÇÉ.m,´7k˜ G«ØW± *»³¥@4pVÄÛo¿­fÌ˜¡8(ÃÁ9nÁõ8i°<éR)9ßµkWÅm·ÇsŒ¥¤¹°˜7ožõæ:uÊo}Žö~øá¹’Níõ…*N�r&„ßÀ_~ù¥…7�ßIltéÃ�ƒžGy¤âNGr©,|ò±!ÚX°‘a'`†�Aúì¢XŒ·’ÆÛ~ÒIèŠë»ï¾[wïÞ]#.›]®lùòý�…8úüóÏ×Ó§O/Äüùóu«V­§�FóÙR"¼Ý5B�i8*Ñ0ìÀ˜dë=0�U“zÂ„	�wj!¢íÐ†²åÊü§�%–Î†d¶Àè¢i´Þ©« t5õÍ7ß¬›6mj—ÅY®B�áUc€OÏš5ËÂ„Øà-8�æÍ›k|2¤×\Ã�™~ôÑGý”=06ÞºéÛ·¯ÆÖé\Y'ú:õƒ6ä)m,±ÄQ:)°…Fh©DƒìŽ2tÛ¶mmù�e	ë˜o·.¸  …ÇÊ>ýÁxÅNí9–9ëž={Åc;(5ÔR…mÇ£s´­DöT…€9…†ÓŠT€Ž‘V«›î”=iÇü”ÀLA*ð¬HH|Ëë1cÆø½á¼JÚ9{tp†R‘h‰ù�¶ãÑAÚm,Ñô0¤³ÇÔ”†CÃÄ€ê'æYuïÞ½m™�ò'å[y5ù‰ŸºkØ,¦±Ê1¼b[ßzë­‰ÇŒ6CÛñèm+ñôSHhNÀß{ï½ÄŽÑæ‚ºâÎ2š>†�¥Á‰Å0ˆ`_0`€­¦±Ë•þå—_®1ƒDôHï¥ÍÐv<òÓ¶OÍ !ç*máo¼ñÆHÁË7³/¾øB·kÛÎ–Ó)sRŽKÉøù™…8‰Áûª«®Ò˜cÏW]"½�6ãÑAÚm+ñ´$|l ¾è4¶3F
`E™QM>91(äø ƒJtï©"Œ�¿s:ŽSs…à`ò™|Ð)f"Ži+´O¹iS´­TÐo ¥] Na!M"À¥ˆ´ªBË–Ï)kRŽá²[O™2%1˜+×S$[§ûï¿¿æLD’ˆ¶B›qÊ‰cÚTj¨#$Ý	¶qç�w&cDÀµårÊ˜”c*%üÿ%¯bÁj6]«V­ÄbŽ-ÔK�‹-fhÏÓV<ºH[¢M¥†ö�¤ÓÀvAà�>«²°„Ws.Ý)[ÒŽ¹ê0MÓUåi>§ûŽ;î¸DãÍú¿úê«Ë+Fd¿ñS‰¶âÑIÚm*Ut¤µ’”Ï€ë®»Î–É)_ÒŽÛµk§¹46íôÌ3Ï¤oDFÖØã;Ü9ºÿ´%#æv`¯€ÿÀ®\²ˆ›8^yå•ìi,ÿ¹¡kÍcÉ;h¦Üpôì³Ï},Q÷3¤õ}÷Ý—(™r	Ã]†=ôP®Ÿ#»Nñlx¢Ñ–RGl\ÞÛo ìZ‹uQÐí·ßnËâ”+©Çðí§¹N>­„�Š©Â�R5üïÇ7ÿÐF<úH2ö¢6–0„¦Ë¢ñ`›>ùäk{§}!Âƒ]»vYÑp#Ì²è¬,X ° ¤ètâJà…^ˆ+ë‚ò¥Ï†Z�‹¸õ™6â!ÚmÉ™l (ð`Û[0šVõ—¿üÅHA*JhüÀ­è±X'^¯¾új¬2š9?·è?!mDÿ
‘�¶Á:wm‡6dŒL7 ô]î* CZÇá*Œ5½Î;Œ¡bÂ4"~K§�è8…|ÒFtüÔ+Se¤MÐ6<Ä´!cdº à|åÛ]ºÐŠzp‹­*=í¦‘èÒÇ)dâ‹Âîl‰ƒ�ì-FM´	O¨wÚŒñîrÀû(ˆÑçž{Î[X£xoÝº5–^G…âØ…�_ø0’6–\¾IÓJ}Ä]·ÑŸ6á!ÚmÇ(EÑ Ð‰ÛSÎRð�FÖQý÷�®•lùäóùçŸçs[bî¡¯DŸh¶‰‘¯"A¢þD¥-øôòh3nˆ	^ÀïQ4 ë¯à¥NùàÊ;ßéü9ÔcúVOãwt¨¥‰øFÅ8Iå‹òeÁ9Ú‚‡h+´ãU°	%ë,½�r`.
¢BzFW£È6´<ÒfL˜Ïö³‹(¢~z‚Ž‚h>ži+´ãUÀ‚üÌi‹h�<ð@$#óüŽN3¥­÷Bã‰k*-Œz¦üØ1FRå¦ÁY)Ú€çå´ÑV"¡(€å(Ñ8g©8ÅõÏþÓyÉÈqÚFÀ3Œ\L%Ê {í•š­ëe` ìQÈOÝ§xˆ«§–{®;�²`!oÍ–†o‰»îºËxw±fÍšÙ,SùŸ�/ÒDŒØ“¶FË‰/õ;2�—B?†ÓK÷==%Úm$2Šºø%sõ¸Ôõõ×_7Zà8 Õ
	ç Fñ	;qìý·Â¤…�nTé1´{1&‰:ï³Ì›¶A‰ŒÌ–Ò¿¿Çe;¶9¿î¸ã££ô�5²bÈù‹“ü«3–&ÂÖZuðÁ§Id—¬pî:û„c:Ø˜æýö§MÐ6"¥8€E(¡kO.GAá¥ÇXÁù5]©¦„ç·(•˜JÞHºUªTI�ÌN LÇZ¤®û¬6¤MÐ6"¥8 �¯]Å9`jº‹ßsØZ)°aeÆî(œƒ„•\déÀ©edy…™Ç.ºuëf’®´¨ãÔuÑbqFW°~Ð	W_Ý{ï½ÎK¡üñ¡¦UbŒ0ïÀQeZ>pke| -4a	1Ê0|:®„{H÷YiH[ MT*: ¥e—Çv€@Ç‘¦‚^ÒÑ>8óKÃqÝVcÜ¦BÂw®îÜ¹sêð¾ðÂ+,[¡7P·}œ£Òh•’~ŽR»”ä”SN1±%®pTÞ2æ{N?uK—.-Tßbî¦›nrÕm¾åŽë>5å"œQˆ¨Û>e£TZâdë$°½4¶FQÞ·ÞzK³’�ù%ùxÄˆFpˆ*QlbÒuêÔIÞÆA/Æ&ˆ:MÝöèußì‚d�túÜ¶Á¡Ûnl€	½èr¹_¿~v>Î<“vÌ¸ð³fÍ
ƒ¨5jT*ðfý?ÿüóFà¡.S§=:F�§î�ÛÁ.€FŽi¤2&MšätÑ•·W–8Î¹¨ˆ½ ,ÄJ¾Þ:¥/~ì19uÙ›Î©óB8ÂP6Pìªÿõ¯½B°ôRûÄ]·óuÊ×1.éeË–…^ö¸Lº7f¬[0‰‰:ìóÙI]¯´(»/�Œ«Üƒic³fÍôŠ+B×[¦éÓ%³óuÊÇñSO=z™ãLpçÎ�ºOŸ>‰Á×[§Œl‚¨gÔaO~Ôqêº�ÜáìÌ3Ï42+0qâDÍïlo~qŸ³ëÏà¥¥Fpw­Ù³‰_oþ‚£Ðáæ¨?u×›Î#ÝìƒüRE íB°¸‡~8ô
b‚÷ß¿+o¾QŸc±RI„ËUYpqž¨F·M›6Æ¦Y©³>úCÝ¦Ž•ƒ@üF6€œ‡›é\zUÔõÑ£GÛù8óŒú¸gÏžzÍš5E•%3V`z^Í›77²žºJ�õèušº-”·à€;vÔŒìk‚n»í¶Xgú÷ï_)Œ?[wãÆ�‹u} ÃoÁóoVœPÿSG©«^ýÅ9uZ(Ojà¾©`�C‡52@À-]¿~}W~ÞüMœsŠ¨¢ µ¢)S¦èV­ZEŽ÷€ôòåËƒŠ›×ýüî§ŽúèÉT\£N@€[àè×(§”LÑœ9s"­Æýøã�kNKVVâTgƒqÕ¹W
9ßÿýõõ×_o4ØjŽéNêpú¶sBè$Ð©b7ØVÎÙ2ê¬)â”5j~#:óë¸ZµjšK|-Zdª©KADsu›‹®.¿<x°ž>}ºQ\¨“ÔM�žPw©ÃBE 0Ïº€å®>Sƒ‚Y-Y»v­¾å–[4GŠ½ùrÎ5ñÃ‡7®ˆYùÓö®Ûõc�=¦±ý9¼ÙÐ4HÃõ–ñiUêbŽ�¦Ô]¡"¨‚ç_»N2Œ,òÎ¦M›4­†f-òYÕå’Ë)'—ÀöíÛW³kˆð^Þ¤åÜn#ž0a‚æ‚öíÛû½UsâÍ­¶pæ¡¯¹æ�;>©‡‰‹}¨‹ÎzÏSg©»‰¦´øn¦WÌ	à®N4{÷î­^yåE§ŸQ…®»Z°`�åÔaõêÕŠa°èáƒå“îÇèÃÊk9–ÀJ°(D+É<vìØ¡-‹7ŒM1x'£éÐUZ�5¬º§zMÂè»âqT‰@ä´ÓNósî9rx]IVLL…â@
½¦¸Z[T€Ñ��ðß’b) €ÆIS÷¼ú˜ÑÑÔúí�ÓBŒ*´ |¸jVh¾‘ù&†³ë-œ½.ÿS0rÐ\ Æ�ïÍ‚[|‡ƒg{Hêyš b¸¼
ü?`[öyóæ)vÏhÜŸ;òªÄ0dØe—]¦žxâ	/
Üä3
üŠ÷‡$ŸÛF”d!=²ÍÇùVð °=†çjëÖ­
="	ëä‘IN+Œâså•W*øiô–ö\¸\¦UðÞ˜´ó46 Äp&˜ß_Çó$K˜Ž±åN8áé	dA‘ÿ¡ À7?¶+l óKo4.Þå÷CÒ¯¥µ ®ÿ×Ã“,±`8ðO<Q�,(ò¿(hüW\qE.ãg4Ÿë‹Ê Æ‡ÓÜ ¶Éàºà£y’¥™3gªuëÖY�@TSBÙ¼åi!À)Ç‹/¾Xa{¯_Áø-À®??„bB€�ûee¦d¸xã¥0ë$eˆêuÈO·2:—ö(ŠQÄG÷�ËTfŒm#ŽA'%Ëˆà¶^êŽŸNet-®¨ZÈ^ÈVÈà2•Ö½{wýé§ŸF¤:’MÚ ®Pgüt)£cbü "©ô[¶ìª@îîc`!A <¨#9v‚R§¨[B)@€2þv5µk×ÖO>ùdyõ/¿Ub¨Ô¯Þdt‰:%”"†@V.vU(÷‡Ó4÷ý	D€º@�ð	ÝEÝ¡Q—„Rˆ ƒÔ
v5<§k(F­ªÜP¨~:’Ñê�PŠhÙ§€ËT2¿õ°�¸r[@%.=ë>Ç÷>u…:Ó,TÔF¸N»L#°ß~ûék¯½Voß¾½›Bå*:ëšuÎº÷Ó‰Œ®Pg„Jnú5˜‰ÊT<œ‹èÙ³gW.K¨„¥e³®ýt £Ô{“Ž…J�Þ(ÏÇà2J@¿}wß}·¦[*¡ÒB€uÊºeûÕ}F'¨B• �Æ(ãó`_e`¼¸¨|Ê•–™%³4¬KÖi®úÎèuB¨!ÀnÞÿ¯—QÎßxã�šNA…Ò‰ ëŽu˜cnŸuÎº§H— TVê„‚ÿ\¦àµN�:é_|±RðH›ù3Ø
ëŒu—«^3uÎº,ƒW‡M`_¥9ãŒ3ôÜ¹sÓf•N^Öë*W=fê˜[xm¿’8,:ãï?Á¾
D¿ó]t‘±�Ò•ÎZC,ðÒ¥K­ºaåª¿LÝ²Ž…�œì‹_~^
öU&øþ×7Üpƒ^µjUˆ*,I‚ ë€uÁ:ÉU_™ºd�²n…�¼à¨0=¾ìû*WãÆ�õ˜1c4Ü’¢»òLsbÏ:ÈU?™ºcÊ?@*�^xì5pNEkÚ´©yö‹/¾(B¥åÑ| ÆŒòKÌË«“L�±î„�¢à4’LçT¼úõë[1íL.ÍÇPJíbÊx�Ä¸¼:ÈÔëJ¦ö ‚P¸TCrç€?çTD†‰æ³±cÇÊ:‚"Z"ÎãCbézÛ‹?ë„uÃ:Œ"P©Ÿžö*¢ëü°Ã³¢ÕÎ™3GÖäÑpŸX1Â/±«ßL°.X'B‚@¤PéF€§�ËUVÆ«g¨pD•‘Pá>Ã§bD¬*Â3ƒ9±Ã…’|'Šœû¹*8=<<\œ“°4UõèÑC�tÒIêøã�W:tˆ,¤uN¡"þaÏž=ê“O>QS§NU&LPèÂÐngd&‚ÿžþ,TÒ ^ŽG»àúÙà3ÁÍrÜc_®^½º:ê¨£TÿþýÞ~ªsçÎVÌ{û†:øæ›oÔ‡~¨Þ~ûm5yòdõÑG)ìÒË§„+qÓßÀÏ�çæó€Ü“Ò ä‡S!w„‡ØætT¹½ün<Ô¨.]º¨ž={Z½„¶mÛª†fNÕÿõë×+†oçÛýý÷ßWX¦«V¬X‘oø¶ç§wmò­ÿ5X(d¤ÐÉuÄu†4?Ì¥¨y­Hƒ“JÕ¨Q#…Á0«gÀžBûöíU³fÍ¦Ã<Ú ©øé»ï¾S7nT+W®Tð©o½Ùù¦‡¿=… 
Ÿüù
¹7r4ÿ`®½X 2ˆ€4 ÁõIšÛ|x ˜»ÑM[í³Ï>–ñ·hÑBµnÝZµiÓF±×@ÆrXë7¬‡Wü´à½aƒc²«¾mÛ6ËÐw‘or2æ¨Å‹«åË—[¿ñÞ€´÷Ï¿	ž žþ,Ò D rŽ,ØîîæØ?
¦ªU«*x¼Ql Ø4hÐÀ:®W¯žª[·®ªQ£†Â»Âœº99Û@Ðh1ý¦¾ýö[µk×.7ÙjóæÍ
óð–ÑoØ°Á
¶Ê€‘—0³HbwžßòîJç›Ábô !j’ jÄsçÇõêl8^@WÔl€K�6 4ò`~×Óø×€…bF@€˜+ œì›â·v`~2tÏóZmp’i+„[þ<Ì.=�yM(aH�°
)Gœêø�½„VàÃÀ2ÿ›à?§	j�«€£ Î¿oÓ¥Ö—àÏÁŸdþ/Á¾ÝóšßÃ}B1" @Œà‡”5§ë�Ùf/¡Qæ¼>þ×³qà}ô‚CæøÃÞàì(!Gî~ ó;œøä�`ùfðF0�ý+0ßäë2çô Äû„RŠ€4 )­¸Ä¦±sú‘Lã'gëŸótl ÈœŠ#ÎÇ3B‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  E"ð¿¶[#R¤aÂ    IEND®B`‚ic04  ¶ARGB’ %g‹‹g%… ‹î�ÿî‹‚ ³…ÿ³�  ‰‡ÿ ‰€ "ï‡ÿï"  d‰ÿd  ‡‰ÿ‡  †‰ÿ†  a‰ÿa  í‡ÿí€  �‡ÿ �� 
ª…ÿª
‚ 	€è�ÿè€	… [€€[’ ’ r‘‘r† ŠÒøÿÿøÒŠ„  éÜ�ÿÜë ‚ „î;
“ÿÿŽ
?ñ‚€  &Ðã ^ÿÿW 	çÏ&  i÷ýœg×ÿÚ`e þ÷i  Ž‚ÿÛeÚ�ÿŽ  ��ÿÝeØ‚ÿ �  göýœfa×ÿÕf þög  !Îã \ÿÿW 	çË!€ ë;
“ÿÿ�
@î‚ ™æÝ�ÿÝç™„ €ËòÿÿòË€‡ e……e“ ’ r‘‘r† ŠÒøÿÿøÒŠ„  éÜ�ÿÜë ‚ „î;
“ÿÿŽ
?ñ‚€  &Ðã ^ÿÿW 	çÏ&  i÷ýœg×ÿÚ`e þ÷i  Ž‚ÿÛeÚ�ÿŽ  ��ÿÝeØ‚ÿ �  göýœfa×ÿÕf þög  !Îã \ÿÿW 	çË!€ ë;
“ÿÿ�
@î‚ ™æÝ�ÿÝç™„ €ËòÿÿòË€‡ e……e“ ’ r‘‘r† ŠÒøÿÿøÒŠ„  éÜ�ÿÜë ‚ „î;
“ÿÿŽ
?ñ‚€  &Ðã ^ÿÿW 	çÏ&  i÷ýœg×ÿÚ`e þ÷i  Ž‚ÿÛeÚ�ÿŽ  ��ÿÝeØ‚ÿ �  göýœfa×ÿÕf þög  !Îã \ÿÿW 	çË!€ ë;
“ÿÿ�
@î‚ ™æÝ�ÿÝç™„ €ËòÿÿòË€‡ e……e“ ic14  ”m‰PNG

   IHDR         ôxÔú  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  @ IDATxì]Ø5ÖJï½÷"H”¢((MuEÅEQ»Øq­ë®.kÇ
è*‚€í·+ØP@”Þ{¯2ÿyG>Eýî$·ÌÜÉÌ{žç|÷~7™”7™œ“ääD) D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€�¤È“ô|€�0"€w9¯ðáù0ùÌaü^à�ß¿!t@x¿ð/¿ãsÏÁß–ÃøŒ¸Ž0‰‹ `qã±è‘F ïfþƒ\X>Kä2‡|/!ß‹ÂÅå{Qá‚b¤¡Ÿó¾ã3‡å«+Ì!Ðs„:>!è÷
ïþo—ÿ·
o;„·È÷MyÃ!ßwÊw¤ÎI[¾’ˆ 9BÊÂ2�¸!�O*Œ™9„zåƒ\A>+ò%ùŽpur|â™0V 0ä(PV	¯<È«åsÍÁßVÈ'ÂñÌ>a #@ `À™],€ /)\K¸¦píƒß«Ë'³û"Â˜½ç,ËË×H¶°Š°C«Kò"ùüYx±0¾o¦b  �ˆ€_PðY¦G ¼!È«	CÈ×n(|„0fø¥…¡D]ÈKS"(ü…±j0_x®ða(Ë„¡8 ‰�4 �&€|<Ö`f_]¸®pSác„	—Æ²=íHé# £Cl¬þ^xºð,á…ÂXAàJ�€@"É"@ YÄ?Î`�Ù<fõGCèCÀìÊ )8 ô±J  ÊÀa¬`Õ +$"@4PÐ ÄàX#€åz,å7>Iø(ášÂÅ…IáC`«i±ðwÂŸ	ÏÆÖ¶HD€ü	* „ÿÆXØ×Æì¾íÁOìãSàØ`u`ÒÁÏŸä'HD öPˆ}ˆ= 8f‡%ýöÂÇ	7./z:üðÃUáÂ…UÁ‚U�~ã¼yó*0Â*¤Š-êÆË—/Ÿ:ì°ÃÜßsÂQÉ_~ùEíß¿ßý<pà€Ú·oŸÚ¹s§Ú¾}»Úµk×oáˆ³gÏžßx÷îÝn<<o	­•rÎž,<A[8¦H"±D€
@,›=Ö•>Lj_KøxáÎÂ-„aÄƒ=êâÅ‹»B¾L™2ªzõêªB…
ª\¹rîÿ¥J•RàbÅŠ©"EŠ¸‚ÂñóçÏ¯�„<~ž<©½æŽã((üP
öîÝë
|(à;v¨mÛ¶©M›6¹¼aÃµnÝ:µfÍµtéR…ÿ¡H€·nÝê¦!8‡…`X#ÂiÂ)Œã‡<a  �â�@j#C<°a-£ƒ@©
„üIÂ�„[cæŸ5‚ÐÎàUªTQuêÔQÕªUS•+WV•*URåË—wÃq!ÌSäAWŠ”(9ÊÁÚµkÕªU«ÔÊ•+Õ²eËÔO?ý¤V¬Xñ›�¸Y&¬LþDø3a(pRD"‘E€
@d›6öÃŒûù˜åCè·Æñ¼@	³ñ%J¨Ò¥K«¸‚¾fÍšêˆ#ŽPø¬X±¢»D�åú8¶°Å°zõjµxñbõã�?ª%K–¸ŠÁ?ü 6nÜ¨¶lÙâ®:d7üJÊ V`7°_˜D"… €H5gì+ƒþ\K¸ƒðiÂú�íçc	¾dÉ’ªV­ZªqãÆªnÝºêÈ#�t?1«Ï™ÉK™H	ÈY9ÀjÁÂ…Õ¼yóÜÏ9sæ¨E‹©Í›7»Û	÷ãgØ@'ü©0¶	a°* Ö7!+ Àé„ýÂ]„q6ßwÂþ;–ï›6mêÎî�9æWðcV�½xRæ€V LŸ>]a•`Ö¬Y¿m#d.'Ï”–Jè‡Âï
C)€s"°* Ö6]ìŽ%þæÂ;ÈGÊg>aßÖô6TGu”jÑ¢…‚ÀÇ2>öéalG
'Â¾ ÛP¦M›¦¾ûî;5wî\wkÁç’ì“ôç	¿s�¿•On$» `W{±´JUN>Gøxa8ëñ…°d�}û£�>ZµiÓÆý„5>–ùIáC Û8}0cÆõÕW_¹ŸX)ðÙÀN†p‚àuá�„W“ˆ€P°¢™b_HÌöq\ïìƒã¾Œñ à1»‡ÀoÛ¶­»#>’}Àˆv“&MR“¿š¬¾™ö�« øè· Æ‚od/äª€}Ý&V%¦«æ¶®²˜jÃ˜ï|á¶Â÷ÈÃ=ìáCàwèÐA5oÞÜÝ×—¼HC Ç¿ýö[õé§Ÿº+°!€?áyð%ab•€DB‡ €Ð5	$Ôî*|¡0fþXÈÁx¯Y³fª}ûöªS§N®¥~Ù²e3–>
?ë×¯wO|òÉ'jÂ„	jæÌ™®O‚—+ X	#üž0N�ˆ@h š¦`A�†Â	÷®)œ1‚U~“&MÔi§�¦ºvíê
}Zêg^«Â	¾ÿþûjÜ¸qjöìÙ®÷ÂWj±¤÷Šð(a¸ &�¬#@ ëMûÀNKáÞÂÝ„+
g„ à±¼ß¥Kw¦�å}ö‘ˆ@"`0ˆm¬|øá‡îQC(¤Õ’Ö[ÂÏ#lÍE
RVRÄ ±µ¨:ù¥¬'÷>Uûý!8ßÁLƒ>ß#�d€§B/Äª N‰2H°x_øYá/„÷
“ˆ@ Pnf&àÊ]8ë�àï(\H8m‚Cž“N:IuëÖÍµÞÇÅ9$"�)pÁN¼õÖ[ê³Ï>se(í]’Îxa(p2Ä«ŠR0Pgæò«àÇùýK„¡ ¤í´×àâŒþ¹çžë.ócæO"~#€• l¼úê«®¯\‹œ‚s!( ÏÃŸ@F•tHD !T BÃ€!€=þÎÂ×
cÆŸ¶àÇ•¸0ä»à‚Üã{Ü×TI�# {8zá…Ô{ï½ç^…œ�B@ÀŠÀcÂÓF@@ ùƒ  peªJAðc�ÿráÓ…ÓÚˆ‡«]XñwïÞ]�qÆîwºßTIYG n‰qràÝwßU¯½öšû¿¥IÛåù±ÂO	ÃF€Š€€@Ê,T 2‹'Sû�¦òqµpá´œ÷à:ÝÖ­[«^½z¹ûû˜ý“ˆ@XX·n�k'0zôh5uêÔL\g§B8>ø¤ð¬°Ö›å²* v¶[XK]K
v…0Îò§e…÷»Xæ¿ðÂÕ‰'žÈã{amq–+W°=ðùçŸ«1cÆ¸ÛpKœ&­‘çáC`˜0
¥	&ÿ* ì	™@ ×ñöÆ¬ÿˆt,_¾¼:ë¬³ÔE]äÎüáŸŸDlE ÷`%`Ô¨QêÍ7ßTk×®M·*ó%¬¼(ÌëˆÓE3æÏSˆyH³úäyÜÊwƒð1é¤U£Fw™¿gÏž®—¾tÒâ³D ŒàôÀ‹/¾¨°=°dÉ’t‹8],Œ[÷¤›Ÿ�'T âÙî™¨õq’ÈÍÂ¸¬'eËþÚµk+ýÞ½{»7ïe¢`Lƒ„ÜPøüóÏ»ÊÀÏ?ÿœNQqb —= <9�„øl< ÏvO§ÖUäa,õÃº?eï}˜ñc¿_¿~ªV­Zé”‡Ï+X´h‘>|¸k'�æŠ ¼
â´ ¶VX	�¨ dv+3Å,ÿ\á[„›¤ZƒÊ•+«¾}ûrÆŸ*€|.r,X°Àµxî¹çÔÊ•+Ó©ßlyø>áW…±:@"žPð„‡�h,Ÿ…q¬ûþISéÒ¥]�}—_~¹{oÒ	ð"qp%ñSO=åzÜ¸qcªµ…= Ž>(<'ÕDø\< �vNµ–Xâ¿LøáÊ©$‚ùà¼çª«®R­ZµJ%	>Cb…À×_­†â:Jã&B,%<.ü´0¶HD€cÚIL¸$uRá¼yó:§œrŠóÁ8û÷ïwHD€˜#€wïÞ!¼K©¼ƒŸÁ;Œw™Dþ‚ W þIìÀ¬ÿFaúá{Ò„+xèºì-T¨PÒÏó"@~E`×®]®‹á|Ð½š8E\° Á‡…¹�"ˆQ|Œ
@[5õ:�"�Þ)Ü&•$ªU«¦ úôé£è²7ùÈ¸9r¤zâ‰'Ô²eËr�¤ÿõK‰òáôQ#ÐÍZZY_GÌôoÆyâzúèŒ�Yþyç�§†êzñãí|Ä‡ÿ�tÀ;uüñÇ«N�:©mÛ¶)œ�m‚d“­.œ.\Dø[áÝÂ$"@bŒ ,ó>NiŸñØc�uÆ�Ç}~óí]Æ$i! û ¼sx÷R}o¾ó´Ê âL\ˆoëcsÎ|`)|T²0T¨PAÝzë­
{“Íš5S¼š7YŸ¤† Þµzõê©¿ýíoªdÉ’êûï¿W¸|(Iª%ñ»
ï†ÿ€¤—ä’åP°¼S,~y‚gû“º®ƒO·nÝÔÓO?­zôèÁ[úRl >FÒE ÛíÚµS:tP°˜?¾’¥…d’Å»% ®0¶6	“b„ €5¶TFŸç?+|’pRtÄG¸3þ»îºKÁà�Dˆ@ö¨T©’:óÌ3U�:u.Ú°aC²…‚£¯“…Wÿ�ìÃŒo/T ìm»dK^Z¸Gø^áJÉ<\ @÷z^x)ÃlCÎ%'ó8ã"à3x'±wê©§ªíÛ·»Š ®"N‚ÊJÜ3„K	OÞ%LŠ8T "ÞÀ«×\>‡÷†OcjÚ´©züñÇÕÍ7ß¬Ê–ÅA"D ¬Àåöé§Ÿ®5j¤~øáµfÍšdŠŠ±G€a8K+¤#@ Â�{°jXò‡;Ðc’©jþüùU¯^½Ô°aÃT›6mhä—xŒK²ˆ ìt6l¨Ä‹ Ú²e‹š;w®Jr5 ‚…áNx^«Â¬}F€
€Ï g1ùÂ’7Œü®�L9ªV­ªzè!uç�wª2eÊ$ó(ã"J•*å®À^gÆŒjëÖ­É”[†Ø€UátaÞ.( D�¨ D­E­4ø¡ÂW	çÿõ'ýß<yò¸ÆDÏ<óŒ»—È£}zÌƒ„¼ÃÍ›7W;vT«V­rO
$Q^l	´n » º¢DT ¢Ôš¿Öå$ù!ÜAVÿF„™þ¿ÿýouß}÷ÑÂß1F"ö P±bÅßü`5 wÆ�†Â'
ÿ(¼X˜¨ D¤!¥‡	÷&\GØ˜àbôÙgŸuÝùæË—”� qŒHˆ@vÀ»{0|$y§@E)=|``¦pR$>)„Pa£¤P¤bòÌ]Â÷—0}Çû.½ôR÷îq‘ˆ ˆ>Õ«WW]»vU;wîT³gÏNÆ@wt†Ñ¯…áE�d1T ,n¼ƒE//ŸO	Ã­¯ñýòåË«Ç{Ìuç[¬ô qA hÑ¢®�'OžœŒ+aŒ1m…±Ê8Q8iÄò)$PIC¤XŒ¦òÜ3Â¸áË˜ä×•/\úÂð�Dˆ@üÀ»çA­Zµr},_¾<Id-Æv@RÎ’É„qýE€
€¿øú™z;IÆ~Æ7zÁ"øüóÏW°òoÒ¤‰ŸecÚD€X‚@Íš5ÝÕ€Õ«W»%qŸ@-©"Œç/±¤º,æ!P8‹¾^$eÅÌ¿¦i™qkØ½÷Þ«î¾ûnoa$"@ˆ@Å‹W§�všëísÊ”)j÷îÝ9AºÏrá4áµÂßé"3<\PW{èJKÿ„†Ïn#Â%!ðãß»woúñ7BŒ‘ˆ@üÀ}Ø„Að7ß|£6m2¾Æ��…a8U˜'ˆ
€­ôkay{�ð?…þú“þ/€Œ9Rµm» DÀ�úõë»—~á¨à¢E‹¼#ÿ
‡cð=RXøKáýÂ¤�#@ ät°x˜í?"<@« Z‚�O¿~ýÔÐ¡CU­ZØª#"@ÌÀ)!Ü%€U€™3açgD›N†Ï€IÂÆû—”¨ dô$³Ä1?¸õíeú\Á‚ÕwÜáîù—(aìÀ4yÆ#D )RDuéÒÅÝ6„]ÀþýÆ“ú£Ì:&
ó˜`ˆû
€7Ž­†ð³ÂÝL‹Y¡B÷|ÿ5×\Ãý~SÐ��\€]À‰'žèºOÒ_ Ž	6þBxK®‰óÇ¬#@ ëM�° õ$d„p§„1þP»vm÷ˆ_÷îÝy¾ÿOØð_"@RC Ç_@ãÆ�]§AIbÃj l6¦–;Ÿò* ~¢›zÚGÉ£c„�5M¢E‹jôèÑ4ö3Œñˆ H
�ºuëªvíÚ©éÓ§«•+Wš>‹ULØL¦Ã SÔŠG   “È¦¹Ä}^¸™é30Ö>|¸jÔ«n$"@ˆ€?TªTÉ=!°`ÁµpáBÓL*IÄ6Â8"¸Úô!Æó* þcœLp­ù‚°±$ÏñìWµjÕdòa\"@ˆ@JÀ‘&p<gœ Q‰u¢0VV=ÁH¾#@Àwˆ�38NbŽ>Òä	ìËÝxã�ê¡‡R¥Jû2Išqˆ  ž.\X�|òÉjïÞ½
'©¬ÄƒC’ÂI]<`˜>£%‰ €$ó)zKIw´p}“ôq¯÷?þñõïÿ[á¨‰"4¸N6p• |\ãhÆ†é2J
PH´?’#ü�0IÂÿž{îqÏùã;‰"�-pL°}ûö
ÊÀçŸî*e)#q À&€J€`~E¡à²féÂÐM¢c¶ÿÀ¨ë®»Náf? D Û`;²M›6îVäÄ‰Õ¾}ûLŠ„í l{N¦a 	b>Ä¡à¨†Iâ>Þ…á,CKE‹UƒVW^y%ÏøkÑb"@‚D J@ëÖ­ÝÛ?ûì3×6À x9…MÀ$aÜ&H
* ~0»ò9Jçýµw¾�?þ¸ëÛ_™ˆ  YBà˜cŽQ•+WVPöìÙcR
(­„á6x½ÉŒ“9¨ dKÓ”ªIÄÑÂ­M(S¦Œ+ü/ºè"“èŒCˆ È*Íš5S8–Œí€]»v™”¥²D‚ÇÀ�…·š<À8™A€
@fp4M1àÛ¿½ÉþÃ†S8ëO"D€Ø‚@Ó¦MÝ[H?ýôSS% #�þTx»-õ´½œT ‚kÁÒ’Õ0á¿™d	gC†Q=zô0‰Î8D€�P! Ï¤Õ«WW&L0UêJj
"l´t ñHi @ ð’x´°Ä}XøB“gŠ+¦}ôQuá…FÑM’d"@ˆ@àà!ÜPŠ• 82 œˆÂ1ÁñÂFÇ	Òd”PH LÎ+iÝ#|µp]º°öä‘GTß¾}uQNˆ =°	(W®œ»`¨à>”üÂ„„¾‚�
€ÿ�w“dq»°k8ÓÀ9ÿË/¿ÜÿR1"@ˆ@@}ôÑªxñâîJÀ/¿ü¢Ë¥ÖÂØÀUÂ$ŸÐ
%Ÿò�K²}¤¢
ÐUŽ}î¾ûnuÃ7ðœ¿,†"`-[¶Tðˆ#‚ŽãèÊOg'¯ž©‹ÌðÔ �n&O�"‘†	—ÐE>üðÃÕm·Ý¦n½õV…ï$"@ˆ@Ô€³ c�=Öuüå—_š(ðu%`¶ðÂ¨á†úPÚøÓ
8Î2Z¸ª.y¼×\s�4h�¢oZ'DÀf0ÁiÛ¶­Ú²e‹úúë¯Mªêc…?¦£ Ä’ˆC 	°£â<ësÂ0dÑRÿþýÕý÷ß¯
,¨�ËD€Û€pÂ	'¨µk×ª3p3°–p„®Óq2€Ž‚´p™G `Ž•ILÜÍû¸ðé&‘O9å÷¬É’%M¢3 D äÏŸß½@höìÙjáB£ÕýRñŠÂóx`†z€)É Ëÿ
_j’$.Î5j”ªT	ÎãK°Þ¿¿{ƒnÃ�â0¢-D|ûDÔj~hÿFÏéãq¿Ñ³páÂª]»vjòäÉjÅ
Øúi	« X*ÅJ€ÖŠP›#èÏ¥#c øŸ†áŠ'qÄêå—_VÍ›íx¦eCàŽ;Ô¦M›Ô²eË\^²d‰Z¹r¥Ú¶m›Ú¾}»{iHŽð‡ƒ"•-[VÕ¨QÃõ(V­Z5÷<1VLâ>xÚÐîq*ãæÍ›ÕúõëÕÒ¥K]a¶xñbw‰}ýçßÑÇaóƒþ�0ú7ü~` �yèß`¸ GX\èÛo¿Uç�wžš?¾I•1û‡O•ÿ™Dfo´Ži¼gèA:Ëç‹Â¸ãÚ“àÂ¿C‡žñlÜ¹s§úùçŸÕ´iÓÜ=¾ï¿ÿ^Í›7Oa�Äa˜%Kð‘ ;‰š5k*xkÒ¤‰kQw£PHD H`Ä†>=uêT5sæL5gÎw)—ß@ØsûCq¡ �Cð×¯_ßíã˜ ´jÕJÕ©S'ò
<B	X·nÝpIðŒ{
œ œ?"@À(�hGHØ[Â°ü÷$hûO<ñ„êÓ§�g<1ÓÁ@øá‡ªI“&)ìíaÖï'a• 3§ã�?ÞU¨`]Œ‰ø�ÀªU«ÜåêñãÇ«¯¾úÊøXÁò“p8,•wîÜYá,}©R¥üÌ2ki�9R0À]4(Ä<‰ÓMØhÙÀ =F!I#P\žxWûQZôŸA21ˆÉLß‘K‹œO<Ñ�¬ÅÀ§TâÈÊeÀ¹îºë¹†Ô‘•†hÍÚdÙ³wd%Ë?ŽbGlS²ÖÇe…ÀÀyðÁ�¹sçf¿3Å™Äû�±c0‰d�A’«Q‡½ôÒK�Ý»wûýþ–>Å+¯¼Ò‘{¿�êoŠS&âÉJ‹sê©§:²ÕâÈþk`˜0£è  rÜ¸qN÷îÝ™q‡®�Ë;ŽÜâˆW½è€.5Á‰±2‰q c0‰ŽÀY’#Î¤j;ëÉ'ŸìÈÞV$^Ôï¾ûÎ‘e:§|ùòÚz›`ãg1¶r€ý«¯¾êÈRm$ðg%üE@öï�±cÇ:gžy¦S¨P¡Ð÷q1ˆuz÷îíÈ–„¿À˜:ÆJ¼·†cÆ`ŒÅ$"0ß_*¬í¤X6ŒÂr�X5;·Ür‹#FŒÚ:›àdñ?îÈþ©óÑG8Œ1+Û�ãhÎ9çœãˆ…¾u}\lœË.»ÌùñÇmƒ=×òbÌÄØi8N`,Æ˜L"¾#P^rÈ9‡êÙAå8�õBG¬š�áÃ‡;6ô¬«`úpl\qÅÎ¢E‹rtøc<X½zµsûí·;rš$ô}X÷žÉ)gðàÁÎÖ­[­oL(ìCuu>Ž1c3‰ø† œý<!¬í”0zì±Ç¬~	å˜“Ó£GGÎÜkëk‚IXâ@™yå•W9Žhuû°ðé# §VœãŽ;.RýïV¼äˆbú e9Œ¡I^bl¦s;�äJ²{„µfšØO´‘ ÇŒãÔ®][[O,Âû»0bÄì�?äˆªsÇw8rî>²}¼bÅŠî$ÄÖq½eÇXj8†`lÆM"G ‘¤¸HXÛÅy‡#g†­Ua5×]wYa eÒº8â�É™>}º•mÅB§†€øžw�üt}#
á˜=_}õÕV!c,Å˜jØ£1V“ˆ@ÆÀ•”ïk;a•*UÙHxÑÄ—¶Ž&8Øû¦ï½÷ž�MÆ2'‰À”)Sœ¦M›Æ®�wêÔÉ�Ï[	c*ÆVÃqc5ÆlÈ%•ýÂžÖÃ#FŒ°òÃ~ÇŽ=ë§«¿Íá0 ³µí¬ìpY(ôØwÇFz[K÷þµhÑÂj» ¼Ÿ†'40VcÌ&�´h#)À÷´V8^{íµŽÜü•…¡-½,q¶?Ž³¢?·i‘"Eœ'Ÿ|2=0ùt(€/ˆ$,ÊµïúŸûŽ-ÿ×«WÏ™0aB(ÛHW(Œ­c±Æ˜�±›DRF ”<9AXÛéà
wÃ†º>ºp¹‰Ë‘‹u´õ3Á 
q`(÷5„®�X Ô=z´Sºtiöñƒã¼w~òÉ'©šÅ'1Æb¬5k&H<Œá$"�4¸(éamg“ë<­ôÄgÍš5ÓÖÏƒ(Å�¿€¡C‡fq˜cÖ™BàµW_¥+ßl¿/rÃ óÅ_d
æ@Ó�×CŒ¹†bç¥w)9ºJôÂžV¶ÿûßÿ}2‘Ù²eËœÖ­[{ÖMW÷(‡ãb#…$Ù‹Àûï¿	ç>~½gð´'×[ÙÀsý`ÇXN"ÆT‘˜_k$åÀ[žM$W÷ÆÒÚß¤=�ƒWl]*µ©?úQÖY³f94Ð¾¿‡¶w¿ËÚÎÊ•+ýh_ÓÄ˜‹±×°Í0–cL'#–XÚÎG9óçÏ÷µ£g:q\oŠ«MMêÇ8Ê9ê¨£è:8Ó�Ðçô’Ü'Žý»pÉ%—Xé´coÎÊ0¦“ˆ€�“%ÆaÏ�ÇQ`\d½ðÂî×Õ�á¿··nÝx› %}ß¾}Î5×\Ãþ­¿}¿qkæC=dIÿ±˜ƒ�bLÇØN"	(+!FKÿ_|±ƒÁÆ&‚Å­Zµ88&18Jpñ²u€´©f¢¬TpW^sú¯î×
Oœ81Mhƒûöík:¦alÇO"¹"p—üªíLX¶mß.~O=õTmÝLêÇ88Cn«Õt #r3[°`A2KÂ|þ4ÖáR$]˜¯X±ÂÝª3—0Æ“ˆÀ_h-¿¬öpDì�7ÞÈâ0—ZÖppch5ëY>Q‡;Õ-[¶¤Ö |ÊWvïÞíôéÓ‡}W3~éÞÏ�ZyK&ÆdŒÍºúI8ÆxŒõ$"ðåÛ»ÂÚ„ýEÒÙD?üðƒ÷&õcï>0dÈ›š>6e}é¥—L÷‚ùxŒs%J”°Ò§	Æä$l?0ÖcÌ'�>òw¯°çàÐ¸qcççm"¼¸öVW7†{·}>p¥Š¥fRxX»v­Ó²eKöqÍø•Ó‡uŸg�u–uG›Ñ16cŒÖÕOÂ1Ö÷&UC0˜-ìÙq
,è¼øâ‹áõK‚[´J•*åY7]ÝþÇ¾qã�7¢ÏhA ðàƒ²kÆ¯dÞaQÚ¸Í‰¾†1cµA}1æ×&Å¸ˆ|\XÛazõêe�Õ?,d{öì©­›Iýç÷>A¸@‰”}/^Ì“-ãW²ïo‡¬<úŠ1cµa}1öÓM°€Wj+ß,ìÙapy†�.3aµ^¬X1ÏºéêÎðÜûÆå—_n¥±TöEvfK0hÐ öoÍø•Ê;Œ³õ¯¼òJf+ Ô0VcÌ6¨7Æ~È€ØÒa±­¹RE¥îw
—ðÂ Ož<ê¦›nR�5òŠÊ0ñe¯Äío(Ëf{¡d‰TÍ›7ÏöjX]þÕ«W+qleuÂZø½{÷ªáÃ‡«={ö„µˆ	Ë…±c6Ænaì‡€,ˆ%ÅY¸@Z¼ƒ®ÕÛ·o¯ÄÑ„.ZèÂe‰Z½ýöÛ¡+WT
$†gJfHQ©Ž•õ æo³Mš4I}ùå—þfâSê³1vd dA,)®
@eiíÂ‡{µºÜ§n¾ùf%Ëè^ÑBöúë¯+qêÊ²E¥Po¾ù¦Z¿~}TªcU=03E—Ue«ÊmSaåÂ…>n#aÌÆØ�1\C���	±£¸* —IKk×ô{÷î­:vìh]§Ø¼y³z÷]u%ù‰ÀÜ¹sÕøñãýÌ‚i'@`úôéêë¯áÙ•ä'r¥²Zºt©ŸYø–6ÆnŒáY ™;Š£P_Z¹¯®¥kÔ¨¡®¿þz•7o^]ÔÐ…óÍ7Jœÿ„®\Q+�øXPcÇŽ�Zµ¬¨ÏG}¤¶oßnEYm.ä¢E‹ÔÇle0vcÇXn@�	�±¢¸) ¨ïUÂU½ZY\æªk¯½V‰Ó¯h¡Ã’è‡~¨Ä5j(ËµBa�tùòåQ«V¨ëÃÖqãÆ…ºŒQ)Ü�Vði#aÇXŽ1]C�	�±’‰±ª¬4ná^ÂžÔ®];Õ¯_?Ï8a”»ÐÕ{ï½ÖâE®\K–,áRtÀ­
W®pú”)S¬Vr1–cL7 ÈÈˆØPœ ¬å_-\Ò«uÅ–»lT¼xq¯h¡›={¶Â²)03ÁdÆ\\¦N�Êåÿ ûN¼L›6-À3›Ærl`l×dd„}û¾šŠ%
Ž“p¢€pF" r~ïÖ­›:å”SrþµîKÒ\þ¶Ùäu
¤€ ‡Â…ãi¤àïzîq@›O\`LÇØn@��± ¸( 8ÍÎóLˆøÌW7ÜpƒÊ—/Ÿ•�£´ï¿ÿÞÊ²Û\hØ ˆKZ›«`MÙ×­[Ç>ž…ÖÂ‰›�.1¦clÇ¯!#Y¡IÃšà¸( ˜ÒŸ®k•óÎ;OµjÕJ-´á[·nUØ%‹ …RpxÃû"–¤IÁ"€#¯¶ûÁØŽ1Þ€ +ì]6¨`N”8( E¤²W
{îëT¬XQ‰÷\¬ü\¹r¥õ/©�ÀcYzáÂ…6Ýº2CAÑ%‹ fÿ?ÿüs°™ú�ÆxŒõ‚¬€Ì€ìˆ4ÅAÀžŽÖô¢‹.RM›6µº±ñ‚îÜ¹Óê:ØZøùóçÛZt«ÊME+;Í…»¢pòc<Æz‚ÌÐÚŒ¤ê(QW `Ê?@ØsSŽ".»ì²P7”Iá,X ð¢’‚G ƒ#±÷wØ¸àØ%);DÅÎc½�s ÈÈ;�ƒv‘¨+ ]‡Ö:,à.²víÚºh¡§Cšì5ÑÆ�\0“üC §[xÄÕ?|u)ÃöÂV‡@‡Öc½¡‹`ÈÈ�ÈR” hnW{º€jØ°¡êß¿¿õŒÆh¤ì €­âï/öØ‡&Æþbì•úš5k¬¼8·:aÌÇØ¯!ÈÈ�È®DY8UNëÕ	×FV«VMÓÂŒ³º[¶l	A#ZBÌN‰¿¿�Àèç¤ì €U®¨lsaÌ7¼æ2²$’U ¿´VaOËÿºuëª=zD¢a© d·© ø�?V ¨ ø�s¢àf<*
 êˆ±2@C�!}„!S"GQU N�–Òzsºä’KTÕªž÷YÓàû÷ïç	€,¶ÓŽ;²X‚èg%ýœ”€”0Œý�Y™9Š¢ �­ZÈ«µ°ÿÓ«—ö^ ¯$B€(iç¡× 0°P'þ@¥Â'
Fhi@�õG£¦€AØ@–@¦x®(g½qR(@€–‚ƒÖrgA+Uª”dá|~º!„HÙA ‚‰øû‹=0¶Ù½¿èøŸzÇÈ C¿ �)�-‘¢¨) y¤uàåÁÓj³V­Z‘ÙûÏé�‡v˜µwäÔÁæOÜ7në¶àž7o^…~NÊyòäQhƒ¨l 4™ÙŠÚÛT[ZFë½©gÏžªfÍš‘iDT£Áu—‘ªs˜*€øûÛ"P°¨ ø‹±WêP ¢¨äB@&ddLd(j
 Lú«xµNùòåÕ\àÅÊ0¼˜E‹µ²ìQ(4„±bÅ¢P•ÐÖ¡páÂ‘œ�†ð?ãK T2²AC�-Ñ86v°¢QR *H�.Ô4 úÛßþ¦ê×¯¯‹f]8^Ì%JXWî¨¸`Á‚ÄßçÆŒ² òºŒ$_¶lY•?$OÃ¹2²Á€ c k"AQR à¬ÁS²c†�Q\F„`p×u$:m+€øûÛ2Å‹WÀ™”Ê”)Ùm.ÈÈƒU<È˜È8ŠŠPXš™g}:vì¨p'tTÉ`	+ªUÏz½Š)¢0C"ù‡ ¶ ¢àµÓ?„üM×èFu ÈA6@Fh2²2Çzò˜ÕŽŽó*/¬W±Ïåcê�‚G J•*&³‡à¡agap‹[„j®ªT¨™•ï\�…l€Œ08é Y£u4—k&!û1

 $ÞyÂžY³fÍTçÎ�Cf‹S¯^=U¨�§ÿ£ÌfÈÔ~CàÈ#�T8	@ò(·Çµü+@ŒSöGqDä€Œ€¬ÐddŽõ³­(( u¤!<%;:/ÎzFÝH®¦¬ `™”<uê ’üF ¾Û©hù�ò_ÓÇÄÂÀoþ_´ìÈÈ
ÈAæXÿÒGAÀÙLO—~X6<÷Üs5íi0l °
@
,M7hÐ ØLcš[“&MŒÑHÁ" ×¸¬¾@Vl5Aæh}ÎÛJÉçf»€ƒ××Uû´ÓN3iP]2¡‡!HR°`o”
@0˜cZ¹rå`2c.¿!Ð¢EU®\¹ßþ�òÈ‚ì�²–lW Žä›{¡¡‡ÙÍ›77Y¾Ê‰ÎÏ €½Q’üG Ç´Z¶ŒœKvÿ�K3‡Ö­[Gö`nÐ@f@vh²2ÈZ²]8S�/à…~Û¶m:o\è¸ãŽ£5zÀ�Ý©S§ÈzHJ£ìÚ´iC%×©ÌD‚]ÑñÇŸ™Ä,I2²CC�=�AÖ’Í
 ÖOñBÆB^xa¬œ‡`‰ôè£�ö‚…aD ƒ#”.Rpà¼6}^‡7–Äã¶µ‡S�§�AÖîIÙ¬  øZ^¯AíÚµM;x%a]–­N?ýtëÊmk�qüÛ.¤àÀ–K”z‡¤YNpŽG/—¨7dˆ† ƒ<'¢šç³l«�OPƒãfÏòãL'¼WÅ�ÐqK–,·jg¥¾ÀÚÀ}hVÊÕLá¨ÅÐH+ªV/ÿëÒ¥K`ù…)#Èß1�A�E�IÖ‘§ qmpþÒsS
÷Ì3­ÞžIþ†ÆÊî!e Ò|‚Ÿ‚(MS|ŠW¥Jž§SL™�Š –þÛµkwèO±úbà\²ÈJŸ ¶* �pÏÃÀX–…±P	.-Ï9ç“ý«8Â“±:ÃPˆKÑƒ3©„àx	J É_0Žà¦¸dˆÁdd’ud£ WwpÀàéª	š®�+ájK¬�üA žÂzöì+S�L-Uàþùç›ÌÎRË€O¹Û§†WäF-Èƒ•dÈ"È$ëÜ°Ú¨ %@{Nía°b°wÙN‹ŠÁ9¬XIþ Ð¨Q#[ú­qª:tˆõò´1P)FìÖ­\	v�%F��I�MV‘�
 îböœÚÃkè¸Óßÿþ÷Ø¸ï²­1ûì×¯_l<£‰m2yá¨Vß¾}MnoK&YÆànùâ‹/&‚ d	dŠ† “ ›¬"Û €¬ÝøƒæåkM{XÍš5UŸ>}L£3ž!¸-¬W¯^†±ÍO`„yÂ	'ø™E,ÓÆÞ?=.þÚô�%�)Ùä995H#Ð(¶) Og÷°nß¾}  †93( õë×s­*Ûa‡¦.»ì2^H’Vƒß‹n¸�·`f°=°}ˆ>np#^swR�)§N › £¬!Û hXÅ¼ÐÅRMî­öÂàÐ°êÕ««+¯¼òÐŸø=°ï|Þy¸
œN9åÚcd°1°ôOo¢2Å` ²	2Ê²IÀÒ
î`ö¤SO=•Çßþ„ÐE]¤ ¸Hé!€sÿ·Ýv›Â�á¤ð �/_>uóÀ›Mfhá)tHKÏ–W]uUHK—½bÁ%0d‹AFY³`“p¤ ÛÊ«Ê–-ËýÀ\ ‚WÀ;ï¼“‚+l’ù	3£“N:)™G7 ŽiqŒ«œøn¨DöeS @uë­·ªªU«ÚWø J[ÈAFAVYA6) '	¢žËÿ0Îâ~wîý‚‹[¹ccòë1Ç£n¹åî‹š€•¥8GumÒÀ¾wïÞÜÞòÀ²2FC�Q'iâ„&Ø ~–µw3Âa­ÿ÷­›nºÉt+q"1Á
Ê}÷ÝÇ%æ·ýÔ©SÕÕW_­¶mÛâR†·hØóÿç?ÿÉk­=š²ÅÀ)R€¬²ân [ ¬IdÎ­rŸ;:¿þ^ºtiõÀ¨jÕªyGdèoÀŠS§NVzúü­Qþ2cÆ÷Ìú¬Y³¢\Mßê†eíÁƒ«*Uªø–GT†Œ�¬Ñd•û(¶( ­PÏ›?pi…ÁÕ�šv‹~pãÆ�Õc�=kÿÞÉ´2ÜÍâ˜)œ@øÃ'Ã¼yóÂYÀ�—
”÷Üs�:ñÄC^Òp2²FC�U�Y¡'[ XVÂßrB‚�<ƒ‘ôœuÖYêŽ;î 5TèS÷Þ{/ýÍkpÊVðìÙ³Õ%—\¢æÎ�›­"XŸïW\ázS´¾"U 2ÆÀñdd)`½k{N"–½çÓO?uHæìÝ»×¹îºëbšë¸ü.)92«4”1E@„¾#Yì¿ã¢î]íÑ£‡³}ûö@Û-
™AÖ@æhð…ÌÒîH’�ã$|—pBÀÅe¥³nÝº(ô­@ë€—ÿ’þ—$ÄÕó(‡AøóÍ7�¶33G`Îœ9Ž8ea¿õuï§¬rÌ4ïrˆ	Y™£Á2²+ÔdÃÀ±‚ çÚþ±Çkr>3Ô‘�ÂÁ�êÃƒæ¥‡€_¯^=5bÄ¯_‡<Å¯A!ðý÷ß»ýuÚ´iAe¹|ºvíª†Æ13Å–…Ñ$dŽ† ³´‘4iøv åó¼é¾ÙiÀ’z?�w»ÇÜõþw'*Í›7W/¿ü²jÕÊÓßTê`óÉ´�™¿êÙ³§’Õ™´Ò‰óÃ\p�zþùçÝëÂãŒCºuo×®�‚ìÑd—6’&�Xã¼Ú|á„Ë-åÊ•sæÏŸÿ‡%þ“<»wïvÄ[ #ÞÀbíÕ¶‡‰a�#³Ëä�ã�  {ŒÖ­[Ç²ofâÝaåˆÁŸ³iÓ¦@Ú+ê™@æ@öhÚ²‹g®„TédypŸpB ;vìèìÚµ+êý-�ú8pÀyöÙgñ�o¯¶°5¬{÷îÎŠ+Á˜™$�À‚¸çï1êÞ»Â…;ƒr`øKÊ�9�=ì!» ÃBKa_žÀZl^/ôà¢•Çÿ¼2ƒÓ›~ýú©_|Q5mÚÔüAKc-ZÔ½#A”U¹reKkíb/\¸�{þi4qÍš5ÕðáÃ]ÿ8óOÊ�9�=‚ìâ~¢¤DÁPNÞN¨eI‡vÞÿýÌ¨tLå,Z´È'8ŽØ$Äß«mÂ&‘œwÞyçuæ?áB`ñâÅNÛ¶m#Ùÿ‚x?äö:G¼#†«Q#TÈÈ M[B†…}¢-EÁ/¥çþ¿¸´u–/_¡.®ªìÙ³ÇÝ¨[·®®“[ŽåPì…B¸�Â‹ÀÏ?ÿLáï1ù‘±1á;'.}�‡~ØÙºukx8%ƒì�òj‹ƒ2Œ>–ˆd©�<°G8!À§�v÷µx‘`ðré¥—:%J”HØ^í–09ºã¼ñÆÎ/¿ü jÌ"U~úé'Gn¯¬¯ÉV�#×à:r<Î‘m°ÀòÍô{Q¨P!G¬ü�éÓ§§
=ŸKØT@iÚ2²Œ”$7K|Opo»í¶$š‹QÓA ‚“&MrÎ>ûl/Xží¦k×L‡Ã±�u¤t:  g±õtÜqÇÖ 4Ÿ~úi·v;vìpF�åÈÍx�åŸ©¾.—U9cÇŽuöïßPK1  dÐ†�e¤$€/å7„‚‹½é·Þz‹½0`vîÜé¼öÚkN—.]ž^m”í°#�<Òµ~ærÀ�$Åì°ìo`Y�±>'Ž°œ'Ÿ|Ò�r{(­ZµÊyôÑG]E Ì+yóæuÚ´iãˆã*góæÍ‡V�ßB 2ÈÀNêu=ï²‘pÒ!”•ïs„¾ìr%£ƒãA¤ì €c0ï½÷žsî¹ç:h¯¶
2ƒ¢Xç:rã!íC²Ó5RÊuåÊ•NûöíëGP^ÑG¼hýúõŽXÐ;ð!Vß�•M÷¾”,YÒÝ®€"¾eË¯*0Ìg ƒÆ?È2È4’!8:±Y8áK'Þÿx‘…Ï�Û$yì§Ïœ9Ó¹ï¾ûÜ�R<&l3¯öL7¬~ýúNÿþý�wß}—Ký&¢8ðÁÐ¹sçÀú„9fþ¦¶ Ø?~¼sÍ5×88=b0ãËx] °Àÿü?ÿùOgêÔ©´}
IÿÅ}*�Ešñ²,”ÇÃº,q¡ 6Z8!áË¡C‡&g@ðÈª€‚�ö/¾øBM˜0A‰v¬ÄRVÉ¾dÆÜÕ«WW²ªÄ`L‰—8UµjÕŒçÃýE`õêÕJ75nÜ83:˜:ÎoãŠçk¯½VÁïE²´víZ5eÊõå—_ª‰'*Ù^R¨C¦	nfá›¢N�:
ngÁ¢ (1ÄÍtVL/M®¼òJ÷nM2½$|Œ&NàÁÉ¿Áq°ds}¢¬ðâ>õÔSJ,ÓEáïYF@fW®ðÿñÇ.p�wÜß¾qãFµmÛ6%š³{ÏRÂq	œõà¾‚âÅ‹»ƒa“&M”ìí«F�¹ÿ#œd'kÖ¬q�üÈyê@* n®•¬T)¹;#ù‰ûl%F‹J®&vû7ú9ú»¿sû8ú¹XŠ{æ…ýý¸T©RJV•¬2¸Ü AWÉ¥O³ø¿ÿýO]~ùåJ%¼ÊòˆÞà!aaT à4á#áŽ‰ Á-v²$çÎúÅáïáC +P doÕeñK®dS‰¿µoß>÷Â`Fc@”ý5%>·ÝO”p„¯â,Ñ_�ewÐËõ¿„ùñ„ÿÿû_WøûÕ‡   ØnØ°AÉ•±î'ú8~ƒ"�³†þ-÷É»J-ú8V³Àèëâ§Â�ê3M�-%Æ«J¶Š¼r/�p|À+RÐažnvƒ.ÌÁüÊË§çZn…
T­Zµ²T<f›*²�©ÄI‰Ë©¦ÁçìG òª«®RA	1U·ß~»ºþúëSZö7E+“PRÁ5kÖ4}Œñ,G ²2IN±xÕ2²-óûE^¹jÂÂè¢°¦”¹¢W¹±LÍ™Dˆ€]¬^µÚ½oâí·ß¤à˜mÿç?ÿq}á§²çH!™‰ÕälÝh*™VS'ðà0* ˜Ú{ZºÔ®]Û]&-fHˆ@Ê`ûG,éUPÂËìwÜq‡ºé¦›VHDÀ dB&i2-tËÖaT <¯¡ÃþÀHD€Øƒ öÂa´ûêk¯Rhüýë_îÒ¿Û$Of_ “lK<e[6Ð›€7µ™Ø_ƒ•,‰;ÀÌÿê«¯V¯¿‡hþfdr^^Ý|óÍŠÂß¼™ƒred“† ÛB¥�†M(. y®¥”.]Ú=þ¥šÁD€„ œò0`€zñÅ)fþr±gþ� ÍLr€¿È&A¶AÆ…†Â¦ ÀRÒÓºO<¾Ñ 04Ý‡!‰À²?ÎG%ü1Û‡ðÇ¾¿Árlâ‚3„$‰ !›4ÙæyÂMó|ÆƒÃ¨ ”ôª%4-÷�ˆ /p†sã�7ª—_~9�BBøÃÀÇý°@"A" ™Ù¤!È6*  Õ�0Ï··FD!"V üqÎ_n©¤ˆ˜íc¿.~áð‡D²�€�l‚l• Û
@]¯†Ãþž�–å•Ãˆ ð¸¿8p 3fŒ�¹üž4fþpð£?
ÿßqá·à€l28nê)ã‚.u˜ ”ÅsV–ô ta~DÀ¸zÆ²?|£ApìƒK}àâ>õID ›@6œ€Œ�ÜMAlìW÷j@\˜�²HD€„ø»‡ðæ™g)„ÿ7Ü D› @g&: ›.'ƒŒ�[˜€rL/�áG·Â‘ˆ ¸å–[n1¹5#…Æž?ü
ÀÅ/gþ�”‰d È&È(AÆAÖ…‚Â¤ À:ÒSºÃÝ"÷ùBÑoX"à"�³ì?tèÐÀ¹âŠ+Ôý÷ßOáâÌÈÈ&—À�q¡9	�×¤bÅ�êäéJ©jÕª<ßPc0" C Âgî±ç¯¹]—”Q8–ý!ü±ç�›%ID L`e
2JC�qÚeM›àYîÿg¬Ý™H�={ö¸Gïž|òÉ´ÒIæáþýû«‡zˆÂ?Ð7Pdd\h€0mTòj),¯ÔäÛ^1Œ‚ÀîÝ»Ý™�Ëþ¸HèÁ¤ð¤…™Iª@FlS{ÊºTóNå¹°( y¤ðž X¤‚Ÿ!DÀ�½{÷º·ì=üðÃêÀ�†O¥íâ‹/VÈ¯D	Ï[ÂÓË„O� `h¨Y™—u
‹€eÏó}EŠQåÊ…Æx2ëÇ� €ðÇž?fâAìù£~ýúõS�=ö˜Éñª á`~Dà/@FAVi²Îs»[ó|Æ‚CQ©ÎEVôª@5¸mÉ+	†"�"XöÇ±» gþ]t‘›Ÿ�s•kÅÇˆ@f€Œ2P  ë óöe6÷äSË
 ŽFx^T¡BU¸páäkÈ'ˆ H�ýû÷«»ï¾ÛõµÔ²ÿyç�§žxâ	.û§Õr|8h £ «4Yçyä]ó|Æ‚Ã¢ ”•yžë©^½º‚ßo Á! kÌü±ì”ðïÕ«—2d�~×ÌÌ)C@FAVi²2/ë–- Ü“ìy�—�V•u0Y "% ðqÃ€_~5­õZ  @ IDATù%�ª�}öÙêñÇW%Kz.RfBRAÀ@VAÖAæe�Â²€·Ýó6�R¥B�WÖŒ A  �?ûP ‚þXöúé§)üƒh`æá²
².n˜V <Ëb ªoÊ„‰@œ€À‡Ãìûcÿ?ÂÌN…Ê”ñ¼$ˆ¢0"�²
².3Ú°¬ x‚ <�VŸäÃDÀïƒŸý;ï¼3Pá�[)ü�šˆ‘BŽ dd–†<ežæÙŒ‡Eð4ˆÀ�_T 2ÖæLˆäŠ fû<ð€;óß·/˜JÝºusoäû�k“ðG@_6¸¥ÒSæUí°( žû!¸øƒ^À‚êÌ'Ž`æÿè£�º3XþA]ºtQO=õ”*_¾|Ù1"�U—UyÊ¼@
*™„A@<}|Â·rÑ¢EƒÂ„ù�X! kÿÁƒ»Â?¨™ÿgœ¡FŽirf:VmÁÊÚ� d•Á} �yY—¿Y/€€ ƒÏk€óçÏo¢QÙßsX"�`|wûí·+xû‚:vìè.ûW¬èéü3ˆ¢0"�q0û‡ÌÒdž§á»æùŒ‡A€wÏ * ik&Bþ‚ üìßrË-*ÈeÿÑ£G+\šB"QDÀP€ÌËºg»0( Ð‚<Ý"æË—�+ Q|SX§¬"0lØ0uë­·ª]»vRŽN�:)XûWªäyñg ea&DÀ/  @fi2/ë+ Y/€€ -ÈS  {*¼Lˆ@0¾»á†[ö?é¤“Ü=ÎüsZ€ŸQE ²
2KC�y\ *yºÆ±ŠÃÃb…¦IL,@`èÐ¡ê¦›n
Lø·oß^=ÿüó\ö· o°ˆé# Yep¬2O»L�~i¼SÃ
 €ðÔ„`UiàXÁ»¦%D@>\8PíÜ¹34N8áwÙßà‚”@ÊÃLˆ€ß@VœZƒÌóœøú]N¤†i5ü"{* ¸b‘+ AtæeàgÿÚk¯Lø·k×N�3FÕ©S'Ê°²nDà@V\]™çyÿÍõéŸ0( Ú ƒýŸàa²D àÌý�7Þ¨vìØH…Ú´iãÎükÔ¨H~Ì„„	™Š€0l­ „©qY"`Ø0`@`Âÿ¸ãŽsgþµjÕ²	&–•d® ˜C	�	ž+~•ÍscL"#pæþšk®QÛ·o¤ÖÇ¼kðGáÜÌ$¤È,È<­· ¿«ç)xýÎü`úX
ñ,‡Á™Ê€ŠÊlˆ€=¼ôÒKêê«¯V[·n¤Ð-[¶T#FŒPõêÕ$?fBÂŠ€�Ì‚ÌƒìË*y
Þ€J<ïN¤`@-Ál"ƒÀ/¼ ®¼òÊÀ„‹-V(ü#Ó…X‘40�Y�yT ­røáYÇ)�®ÀG‰@°¼öÚkî²ÿæÍ›É3/¬_¿~ ù1"ve–Vöù]Ï0Bº{a¦ßX1}"z^yåwæ¿qãÆ@ÊÚ¬Y35jÔ(Õ Aƒ@òc&DÀdd^Ög¶ž‚7  Qn6³‰.o¾ù¦»ç”ð?úè£Ý=
ÿèö)Ö,5· ².Ã°à)ü?½ ¦Ö	ùT|xç�wÔ¥—^ªÖ¯_H¥�:ê(×Ú¿qãÆ�äÇLˆ€MÊ,­ìó»ÎY×@¤‚¿;^ýåD!"�o¿ý¶ºä’KþððGáŸ[kð7" BM/³ ó².ØÂ   ¨ ð­!) 0nÜ8uùå—«µk×¦ðtò�4iÒÄ]ö§ðO;> È¾¬R í
À�YÇ)«�ÄÌ‰@n@øcæ¿zõêÜ‚3þ¬üáU°yóæO›	�(!` ³¸p°Á¹¥žÏº‚À| .»ì2µjÕª@òÃŒŸÂ?¨™I°e F€Ú 0#ÐeX"`†ÀG}äÎüW¬Xaö@š±p›Îù·jÕ*Í”ø8ˆ2‹+ »Â>ùô\ãß½{w<zkI4|üñÇ®ð_¾|¹&ff‚qÄçü)ü3ƒ'S‰22²/«† H÷ý^(ìÜ¹Ó+˜aD |öÙgªÿþjéÒ¥�Ôn}Ÿ{î9…ÛýHD€˜#` ³ ó²>³ƒ @ð<±k×.sä“Dÿ>}ú&ü±ì�=
ÿv&VÉwdd a�°§ mÊÀªÒ÷FeD Lœ8QõíÛW-Y²$�ìëÖ­ëõ£ðnf1 «V  ó û²JaX ž6 ;vìPŽãé* « 2s"à_~ù¥+ü-ZäWH·ZµjêÿûŸjÛ¶í~ç?D€˜! Y™¥!È<* ÂÞƒœ¯M›6q !:ˆ*þXöÿé§Ÿ©bíÚµÕÈ‘#UûöíÉ�™�("€ È,iåžæùŒ‡a ÆÛ½j³}ûvµo_Ö&½ŠÈ0"�Q¦L™âÎü.\˜Ñt%V¥J5tèPÕ¡C‡DQø; @VAfi<�ß5Ïg$8
 öB¶zÕ€«ðJ‚aDÀ ü{÷î­æÏŸH™±ì?bÄÕ¥K—@òc&D Ê@VLX!ó û²JaQ ¶x¡°wï^£
¯$F¬@`Ú´iîÌ?(á_µjUwÏ¿sçÎVàÃB�°# @È,Aæe]ƒ ,ƒhW ŽUhðf073fÌpgþóæÍ¤ +VTÏ>û,gþ� ÍLâ‚ d•á
 · ¤S@ò\Ø³g�‰Ue\úëA¦OŸî
ÿ¹sçR»J•*¹î}¹ìÜÌ$Fà d–†B±†- àä© @£ÚºÕs‘@ƒ5ƒ‰@xøî»ïÜeÿ9sæRÈråÊ©'Ÿ|RuíÚ5�ü˜	ˆ�U+Öž2/(¼Â°€º®÷ª0ÀÜ¸q£W†+€ð‡Áß¬Y³)?„?.ö9ãŒ3É�™�¸! Ye  xÊ¼ 0Ë
€ç¡Iœ«¤T—`>A!€ÿÅ_¬ AeÊ”QO<ñ…`3�Ø" Yeà¹ÖSæ^XV 6K…á)¡B²y3¢�ˆ@4À^?œü|ûí·�T¨téÒê©§žRÝ»w$?fBâŠ€�¬‚¬…@K(pn<hCž#p àav¾! +ÿ‹.ºHÁð/ÂÌŸÂ?¤™P&«Õ�u¡X“ài6¹nÝ:ö-"`=?üðƒ;óJø—,YR2D�{î¹ÖcÇ
0�U�uT iÌòÝóÎßåË—›ì«’$¿�p! á�=ÿ¯¿þ:�‚/^ÜuïÛ£G�@òc&D î`ï²JC�u�yY§0­ lóBcÅŠ&g+½’`È,p…?ÜüA%J”P�>ú¨:ÿüóƒÈŽy" àü?d•† ë¸pHXY}ÈÿùŠËhðXøƒàBŸ¾}ûª „‘"EÜsþXm "�QAÖynyUâ°¬ À%¢§ ïJë×‡âèdPmÃ|"€ÀÏ?ÿìÎü¿øâ‹@jS´hQ5xð`uá…’3!Dàw £ «4Y—u7À(cX ‹X…%¢mÛ¶©Õ«=u„D�òw"�/^¨ðÇÌËþ—^ziVêËL‰@Ü€Œ‚¬Òdd^Ö),
 €Xé…´*¨$"`K–,q=üMœ81�âæÿ~ýú’3!Dà¯@F¬ xÊº¿¦êß/aR `9á©XWú‡S&†,]ºÔ=ê¤ðøá‡UÿþýKÈhD€ø�€�Œ‚ŒÓZ	úQ¶ÜÒ›°=·BæüëJÇqrþå'Ë–-S˜…öÙg�”­@�êþûïW—]vY ù1"@rG ²Éà d€\ ÄáIÏ+ÿ-Z¤öîÝ›Ë£ü‰d¼ü°¼ÿä“O)–ý!ü¯¼òÊ@òc&D€$F ²	2JC�qZGš42¦ XøyúGÆ¾ªÁþJÆÀaBDÀ�•+WºKðãÇ�7}$­xùóçWƒR×^{­Ê“'OZiña"@ÒG ²	2JC�q¡±f“ ÿÈžK#<	 éZÎ
«V­rgþ|ðA ù,XÐþ$?fBˆ€Ã �qž÷ÞèsÊ\Œ0) ¿Hµ~òª X‘ˆ@XÀK'?}ôQ E‚ðÿïÿ«n¼ñFuØaaz}©>3!¡E ²Éà dd]((l#È/Tàf.UID ¬Y³Æ]öjæ�eÿ{ï½W]wÝu\öC`ˆÀ!@6AFi(T,l
ÀbÏS;¢/ M÷bp ¬]»ÖþãÆ�$?Xûÿç?ÿáž h3"�<²	²mqò)û÷DØ £“ û÷‡Â‹¢­Â”C� ®û¼âŠ+ÔØ±c)gÞ¼yÕ�wÞ©n¸áÎüAœ™�ä€L²í j6`™”Éó–¤yóæ©­[=O&×rŒM’@ ËþpµûÆo$ñTêQ±ìÿïÿ[ýãÿP‡~xê	ñI"@|C 2	²IC�m�q¡¡°) Ï“ ˜}Ñ04ý'VÙ°aƒ;óë­·©7þm·Ý¦n¾ùf…U  áD 2	²IC�m�q¡¡°) XÛŸå…4­¹sçzEaÈ8›6mRW]u•zóÍ73žvn	Bàß~ûí®@áŸBü�„È$ƒ•iÈ¶Pí_‡M€Ÿßo½šuß¾}jÖ,OÁëq†�¤Ø¼y³;óå•W’~6•òåËçîùcßßID€„È$È&A¶…Ê—}Ø à·Px'¾$"Ü±þË/ž‡=Êß‰@R@øÃáNPÂ?gÙKÿœù'ÕTŒL²‚ dd’† Ó ÛBEaT Bk¼P2\nñJ‚aD@‹ –ô®¹æ5fÌmÜLD€ð¿å–[Ü¥
ÿL Ê4ˆ€ÿnKC¦-ö¿4ÉåF`•Tœ�pãÚòe¡¹O!a9`/x©ápgôèÑ�Tþü¯¿þzõÏþ“Ëþ� ÎLˆ@f€,‚LÒ�V®iž÷%8Œ
 ®û›ãU[\º0{Îl¯(#)#€e\²3bÄˆ”ÓHæA¸ô…¥?ýàØ‰{€,2¸¤2-tWÙ†õlÑL¯æÇžËÌ™3UÏž=½¢1,dìÚµKmÜ¸Q­_¿ÞeZ0ÜgÂ‘îÓÆÒ7ßpÕm©R¥T™2eT¹råÜÏbÅŠùîÿ~ûöí®Ÿý‘#G‚fþ°1ø×¿þ¥àí�d/è¿è?8.Š#aøÄéü†«bs˜¡CÑ+^¼¸ÛÇË–-«Àèë…¶€˜–²ÈÀ&ÍS¦eº°* 8ç·K¸P"`` ÁÁA3BÙý/ÄòåËÕ�?þ¨¾ÿþ{—gÏžíŠ¸0ƒâÎ�ž¶ž®"P´hQÁ�Á²N�:ªI“&êÈ#�T�5rÿGx¦ZüÀ�ÕsÏ=—©$=Ó�ðÇJ.÷Á%?$»Ø½{·ëýcÑœ9sÜ>ŽþŽí#ôq0¿¡ÝÑ¿Ñ�¡ð6lØP5nÜØå¨êÕ«sKÈÀ,‡A¡ý5Y¦�¤IÃ—à°^$^Uj;A¸n¢ZW«VM}õÕWªjUD%…Ìð§M›¦¾øâ5aÂ÷â&(93ŸL–3¦5j¨6mÚ¨O<Q{ì±ªJ•*)g�²cþé§ŸN9�dÄ²?l ü©Ä&ƒ\vãâˆ)S¦¨/¿üRMš4ÉU p#d¦	ý£råÊ®’Û®];nÙ²¥*Q¢D¦³bzi €ñc�Æ Öÿí…—§‘U¬…ÏS\®Ž3“¹²,£9Ÿ|ò‰¬º‘²‰€ÌôYsî»ï>ç„Npd6“k{%jÇLü.3i§~ýúNÿþý�wß}×‘e×¤ ‘™¿sõÕWVn”WN8¢t$UNFÎèãÇ�wÛLfçŽœÖ¬¯ä¼…
rDpÄHÔ™:uª#+Ùƒ¹þÈ È¢œvJð	Y™FJ�{$®'°2{úCcðŸà€ðzï½÷œsÏ=×‘½KÏvÒµc&ÃÅ†À9æ˜cœÇ{Ìí\ê!3ñ@Ë/	9²ý¡-#d±Uq†î*¶²Thñz'J–,étíÚÕyíµ×œ-[¶d¤˜çäÕVÃ ËHI"ÐUâÃÛOB€ÿþ÷¿;²¼ó.lõ!¸^ýu§K—.f%^í“í0±päÈ5�¹‚${¸ŽìÁ:£Ã*…ìçZþV­Zå<úè£ÎÑGí`µ&Ûý8QþPveùÙ‘Ó*ŽÓ†¼•²2(Qûü2²Œ”$Øÿ_&œ`ðbm£.—½ª8pÀ‘=Oçì³ÏvÄ‚9a›xµW¶ÂÄ°ÊyüñÇÿ°5€™¿½sd¯5°ºôéÓ‡uöº°6g1LuF�å
þlõÕTóíÔ©“#×SsB¤måÌE€ì�Ò´dXB[6	#%@ ¢?N0f bŒ“¹eJ¹"0þ|G®Àu°ôèÕaCAGnòs…ðM7ÝèìÂŸËµ¹v¯Püøé§Ÿ:'Ÿ|r }"ÓïÆÃ.¸À™>}z(0�z! {VA!ÃèÜC@H…’‡
,ÏÝÿýQïgY«Ÿqqž}öY§nÝº	ÛÀ«}Â#E+îd¬Î}ûöýÃêCÖ”ÿÌâäÞGŽàe¬½³Ýïå4ŒóðÃ;rñ/õå™C ²Ç`‹2Œ”"gËs„¾œgžy¦#·0e®U™’‹À¢E‹œóÏ??Ðýq¯v¶5ÂŸq8_ªÏ>ûÌÁª�­}KWîSO=Õ‘[êÂ	¾å¥‚Ì�ìÑ´dd)EêÉsžv rÜYºt©åÝ)\Åÿàƒœ¦M›ê:7Ã=Sé·NïÞ½¹ì®®í–ÆŸ=ô�#¾$"ß‡kÖ¬é¼ôÒKlxH™C 2²ï¹CvA†‘RD {'ï'grßÿýÌµlŒSÂ �%ÿÒ¥K'ÄÛ«-ö{?=ï¼óq{ãÞÎª£M.¿ür“¥ÛÈ¼â^Ø=Cß™ë“�9þ  »B½ÿÆË€³ß~4¿þí¿\¾Àå,<Ï‘ÒC .-ïºë.uÕUW¹þúÓK-ÞOŸsÎ9jÈ�!®k×x#®ÚÃk›lÉ¨§žzÊ½w"\¥ó¯4p¹}ç�wºn§q÷)} süÿCvyû‚N¿(‘Oád©á~á„yÇŽá!¥† Î¥‹à7Ñh¶�WûÄ)Ç$Å5ljÁ§|CàçŸvpT.N}1·ºâ” �N§×Í k srÃ÷�ß ³ »Hi" gÿ?	'\üc;ß|óMz­Ó§a vñÅ'ÄÖw†ý±OvëÖ�ƒkß£~øÁ=ùÁþúk…A*©©wTÈÈM‚Ì‚ì
5…} à­ö¼JQÎWs …n†Ûïn¼áÆÀî½O¡ˆÖ<Ò½{w÷"!\RD
.Tâƒ�ãÃ!M".¼•¸£v¯ä>äg~5D Ëÿ�9‚Ì‚ì
5Ù  à(Å':Å‘‡ÉžŒ.™Ø„Ë1uÇw¨gž}&6uö«¢²ì¯†¦Ê—/ïWL7pC[¿~ýÜÛûRx<Ò�¼ùæ›J.ÀR˜�ÌÀ¾?d�AfAv‘2€@CIcƒpÂe¹ØÁ>É�xÀ�/q/L–¸¿å`ƒ³ÀrE¬èŒ¸Òàœvìû?n¥„Ã/’�1�59ï‚OÈ*È¬Ð“+  q±ð,|ID°ð�<yr¢`þ~ÐþÿóŸÿ(¹Ìâ�_ù5YN9åwæ_®\¹de|@¿¾ûî»ÕÛo¿íc.ÑH+WÏ=÷\4*@- c k4YµX'Á¶( ;-­t‡`=.À†µsæÌq�‰ñ_X‹hE¹Ú·o¯äªXU©R%+Ê§B¾üòËî1Ì8Õ9Õºb+G?ÿüóT“ˆÍs�-�1Y™EÊ �%-œ©L¸üR½zug‘¸°%åŽÀ†¸õÂ�a‰ûW68N¶dÉ’ÜAæ¯YE`ÆŒÆ�œ¶â§¾?#\},3Û¬¶]Ø3‡l1è[�Q�UV�-+  ó[áÙ^¨Š{Füx $îO•x°òˆÁ Xö—û×•º¨9Ÿ­n¿ýv…q€”¢8¹Û&X åŽÀ”)SLúdd•d“°^ýX‡ªø±×E‰e¸\|ÂeÑ4[¾AƒîQ?1J3%>îâÆZñýOÙçŸ^aû„”;†}2
²Ê
²I  	ïñBg4qü‡ô;pÿyÏ=÷(îûÿŽI*ßÄƒš’eÀTå3>#0}Út%'[h”Îp~ï½÷š¹¥‘‹��B¦¸œ‡l‚Œ²†lS °´ò£ºrLCMœ8Ñ+JìÂF�ezv5vØ$Sa±¡pOO8I&YÆM,[?ðàjÕªUi¦ÄÇçÍ›Ç•Â\ºd
d‹† ›¬YþG]lS 6I™=¥»’¨wÞyGÉÍv¨_ì	û¡C‡�=™ N@¸Lš)43“–fÇŽ›™Ä˜Škã› Ò¯@–@¦@¶h²	2Ê²M °Øä÷´TùòË/ÕâÅ‹7ö4räHõã�ž‹&±Ç( 0<ýôÓ
«¤ì# OvƒV¸ñŽ”Ö¬Yãöq�—™Cž
d	dŠ† “¬3@³Q˜"@{:Z¹r¥‚Ñ[Ü	
 )³Ìœ9S�=:³‰2µ”7nœÉÞlJiÇù¡×_]É¥7q†à·ºC–@¦h2	²É*²QÀÔkœÊÐ\á,îžîþïÿþ�Fk^%Å0ô/8‚Q ){ìÞ½Ûõb÷÷Ü�À
Ž»Æ} }²Ä È$ë–mT ÐßßÞŽ/‰hÒ¤IêÛo­²ÇHT•”~Ç2Þ˜1cRz–éøþûï¹ï¬‡É×°Ç Á¯¿õÖ[±ß>„�,Ñdd’ud« gÓ½Ð–Ë@b=@ÃheîÜ¹^1,0#xñÅf¡¤à þ/½ô’ÚµkWð™Ç$ÇÕ«W»Æo1©n®Õ„q)d‰† ‹<�ÔižÏZ°­
 ,~ÞÕ¡öî»ïÆòìûÞ½{öðpu%É?¦N�ª¾þúkÿ2`Ê	øé§ŸÔøñã†3 3`‰«ÿÔ2Ä€	2É:²U ÐØsYã…8fÀ_}õ•W”H†¡ÞN$Ø¶m›‚)x üyîßÜgÏžÛmÈƒUTÈ k›€ùüD¯W ž­`7Ÿ áý�ä?ÀŠ )8`˜EÅ+¼±Åòá‡“Yˆr�Ì€ì€Ñdd‘•d³ O?o
{®sc	[q!œ‹¦S”àZžÓâllÒ¿ç4þ|n½ü‡ïß äìƒû^Ž 3€Ì0Xþ‡ì�²ÖëœÍ
 úÃaOÿŒë×¯w�q rháÂ…Š^¼‚ki8 ™<yrp2'Wø¯]»–H„€\}­°'ÂÑ?ÈAö@YK¶+ «ù×tè¿öÚkjãÆ�ºh‘‡0â’t°MùÉ'Ÿ(^£æØ›58—\�"ž”\Ox‘A²2Ã€	2ÈZ²] ð¯{nx.çXÛˆ‡ËÑEÄÿïX’^±b…ÿ1W¹¥‡ºà;ŒŠöÃƒ/˜9nCæ@öXMQP ¾“ðtÔ£!œŽzÆþÜ–êÂðöÁéÒ?ü†¢D¾Øâ2pËy‚®à´iÓbáù2²ÂÀ»$dd�Õ`¿´À+ÂøLHðæ4eŠu®šÖ'· ì‹.X° · þæ#4¨ øð!ICÁåEL‡ ÐW.Z´( Ü²—d„�ç?#™“½Z˜ç µÅ9OSìcá×(/�ãòÞŠfÞù3ŽiHþ#€ :¸òç?ç€ã€À>ÊÙ a0†BÖDâldT ˜cÀ“¢îÛ³ºFõì¾â8 “oðº	c€ŽÃ,Ô_SKØÃÖ%Ê„kÓ!#²&ÇP¢¢  Í`�±
_|[c'ª„€(¯p„¹Ý`ÈÓþ¶¶ZÐÇIÙA ¶.Q&ÈÈAÆXoü—SÇ() POµƒFŽªÏFçtëà?a€ipn8ø‚E(G,Í._¾<B5²«*Ž¸g$Š™`89„Œ‰ÌRH” ôËÂžW7a™\D�p=nÞºÂÔ†¸�øûÛ"¸œ…·/ú‹±Wê0¾ŒêI*ÈjÈÈ˜ÈPÔ€YÒ2ZÏL£F�Šœ%1€-[¶D¦cÚV&âïo«mß¾�—ü…Ø3u¬pEq Šd‚A¶@ÆD†¢¦ àxÆóÂžG§OŸ¹ËD  `€$eÌŒhà/öØ08Ÿío!bœ:Æ—(* ¸X
2ACF²E“Fè‚£¦  `hižŽ�`(÷ÜsÏEJ`âöª¨.Ï…î­É¥@8@üs&ƒ?AÉ�ÛÍž„/í¤0nFMƒRY``<™¢]]Nä€ˆ¢€»YŸö¼¡	¾­n{
¸9RÏ#HRv€@üýÅÂ‡
€¿{¥E 2ÀàžÈÈ”ÈÝûE }xœð|IDLžxâ‰ÈìÛæÉ“G~øá‰ªËß}F€øû°$Øa‡)àLÊQëã°Ù�0XÕ€,y/;¨û›kT \Ô0ZÜ>Ž;VÍŠpŽùóç·¢¬Q,dÞ¼yU�¢XµÐÔ)_¾|®šÅ° èçQ!Œý†îá!K<O—ÙŠIT ´Çÿ	Ïñj,i6,Ç·ðb.\Ø«ºó'âï#À’tÁ‚U”�¿he>uà�~Â‘]Œý{ÿ�!�%‘¤(+ péôœ®Õ&Ož¬^}õU]´Ð‡ãÅ,Q¢DèËÕbp$þþ¶nÑ¢E##€üEÊŸÔË”)™UFŒùû2DëÐ �PF‰² À¡¹yÞ`£¢§Ÿ~ÚúU * Ù}¿¨ ø�±bÅ¨ øsÂJ—.	 ³Œù¥�‘�ý£¡£® ¬�:>+ì ²‰èÛo¿5u™(‰¬ÿ€råÊe½q- –ÿ‰¿¿­� bì/Æ^©W¨P!v.pù‹1_C���!‘¥¨+ h88šëÕ‚Øzê©§ÔªU¸çÁ^ªZµª½…·¼ä˜•,YÒòZ„»øXe©U«V¸áÒ•/_Þz#LŒñëöþ!3 ;"MqP °ó”®gÏž­FŒ¡‹êðzõêEb‰.Ô '(\ƒˆ}l2õ3Ž¹Ö¨Q#SÉ1�$¨Y³f’O„/:ÆxŒõ™Ù½ÿœúÇA@]_žšSéDŸÏ<óŒúé§Ÿ‡þ÷ÚµkÓ=K­tÄGd)çxe[·nÝxU8$µÅc(¹6ÆvŒñY™yŠ‹°^Zòqá_¼Zw�2Ä+J¨Ã*W®¬*Uªê2F±p°¿ `
¦e6l¨Š/LfÌå7`�	†Í„±c¼† # + 3"OqQ Ð�ï
ÃŸ³'=ÿüóê›o¾ñŒÖ@ŒGuTX‹ÙrÁ0­Q£F‘­_˜*vä‘G*ìE“‚E Š—Í“ŒéÛ2²"' ~œ‡	{:Ìß¸q£»
 ßî¶öH)ˆ‚o5_Fa4xä’Ï‘ÊVò˜eâ‰Ö­[+¬ØHË1ûÇØ®!ÈÈÈŠXPœ 4èÛÂïëZN"Þyç]´P†üñ®Ç´P.¢…j×®�µƒ£mM‚í–¶mÛÚVl«Ë#mÚ´±öŒå†ÎÞ  #bCqS vIËöÔðpïø}÷Ýg¢1†®£4iÒ„G¥l¤N8!À™•Í³Q[[.-Z´°±èîŽ±cº†   #bCqS Ð°“„µ¾¿þúkS‹ÑPu¸ëìÚµk¨ÊåÂàXZ«V­¢\ÅÐÕv.¶[¤‡T�{ì±ÊV#°úÇXn@�	�±¢8* ¸Ûùá•º–~ôÑGM<Fé’	4WvvéÒ…Û ¡Ž-[Ç€ Êx6p	|Úi§e<]&øW°Âuê©§Zé Þþ0†dddC¬(Ž
 7<i/
Z½zµzä‘GLî‹U§iÙ²%gH´Œ.O?ýô rbF J®­Fi®K˜ÿ‡çÅÎ�;‡¹ˆ¹–mÿþýîØ�1Ü€ <oŽ5HÃÊ(qU ÐXðôô½®Õ`<‚{£m"¸¤=ãŒ3l*²•eÅÑ¨Ž;ZYvÛ}ôÑGsë%€FÄvbõêÕÈ)³Y`Ì64üƒÐzŠÍléÂ“Zœ \òp¿ð^¯æØ½{·4h�Z³f�W´Ð…�sÎ9VŸÛ ¹è¬³ÎReË–Í%„?ù�@�T÷îÝ­µL÷ŸL¤_¨P!Õ­[·L$h«1fcìÖÆ~È È‚XRœ 48®zü@×òÓ¦MSC‡ÕEU8¥Î<óÌP•)J…�et�=¢T%ëêŽ�Hþ €ã–°q±�0VcÌ6 Œý‘¾îW‡AÜ€=Ð½Âku@¡SM�:U-Tá½zõ¢ÛTŸZäì³Ï¦ðñ	[Ód+V¬¨.¸àÓèŒ—ðýß¯_?ë®ÿÅm8YÃ˜�±2€sþ)õÇýÏž|òÉ';Û¶m“›$í }ûö9={öô¬“®ÎÿkŸ�{Ñ�ï¾ûÎŽNñRŠowGÕØÇ5cW²ïq‡œíÛ·[Õ{06cŒ6¬+ÆüØSÜW r: Ö÷¿Éù'ÑçÇl•o€¼yóª¨R¥J%ªO�/¼P5mÚ4…'ùH¦€†+¯¼2ÓÉÆ:=ØW\}õÕªH‘"Vá€3ÿ£c½]{º•b”ô8Gß)ì©AÊ�{Ž8–°F3?ØŽ�žuÒÕ™á¿÷‰zõê9,°¦ýãPÐµk×:rô•}\3v™¾Çb[áìÚµËª®ƒ1c³A1Æc¬'�? �Wþ)¬íDr4Æ×’Ö¼ ?üðƒ#—ÕhëeR÷¸Ç‘KE¬i÷8ô¥—^rdßš}Ü`üòz‡K”(á|õÕWVuŒÅ“½êuHØHùŽ±žDþ‚@Cùe‰°gg0Îƒ>hÕKòä“O:(·®nOÜö�:ur¶lÙbU»Ç¥°räËéÓ§û·fìÒ½ßt8`U·ÁXl8¶-•úcŒ'�„\&!û…=ÙWw¾øâk^”;v8âÒÓ³Nº:Ç9\îX°ª½­é˜,(¶fj×®Í>®»½ÇÇwœ³jÕª¶ˆÿIaÆXœ¨N‡üŽ1c;‰x"PPBßÖvªO<ÑY¿~½ÿ½<C9ˆolZL´knmÿÐCe¨˜ŒŸŒ=Ú#6í»›[Çù7ñêLœ8ÑÏ¦ÉxÚ{1¶ÆtŒí$" E ™ÄÐnHçÖ[oµjÉì…^à ™¤ ÞÐ¬;•ñÑÖ’qôõšk®1
Œ'ïB¾|ùÛ\lS`ìÅlÀË1¦“ˆ€1—JÌ_„=;˜\Hâ¼÷Þ{–�ŽƒS·Ýv›g�tuŽS¸xTt-ZdMû² Ž³aÃ†df†±.¹ägïÞ½VuŒ¹{Æ"ŒáËID )
Kì×„µ�¬yóæ’ØBp˜qÞyçiëeR÷(Ç�ÃŸO>ùÄ–fe9A`Ö¬YNƒØÇ5ã—¸ûuV®\yráÿŠ±c®áØƒ1c9‰$�@}yb�°¶³ÁË�¶Ð²eËœÖ­[këeR÷(Æ)\¸°3fÌ[š“åÌ�÷ßß‘ËšØÇŒ_õë×wæÌ™“ráý	cl§=0vc'�”è)OÂ_´ç@‚}´aÃ†…÷ÍÉ¥dsçÎuš5kæY/]½£Ž¥Eñ'žbüÉ6^{õ5S+ñX½uêÔ±òTÆXŒµãÆlŒÝ$"�ùäég„µ�³Û,iq2 I“&Úº™Ô?
qä
Tç‰'ž°MÎ±¼àd@éÒ¥ÙÇŽaU«Vµrkck+:³1v“ˆ@ÚT‘f
k‘V­Z9K—.õŽÂ„‹mÄ·½¶n&õ·9Žø>wà0‰=^}õU¾lîŸ™(;\YO˜0ÁºÆ˜Š±ÕŒÕ³ID ct‘”6k;á¹çžëÀñŽM4oÞ<§cÇŽÚº™ÔßÆ8˜YŒ1Â¦&cY“D`ì»ccí(¨E‹Ž\—›$jÙ�Ž±cªá¸‚1c5‰d�;$E£Žh›«`¼æðÇÓ¸'Á¦£œÙ’í-Á”)Sb¹Ú7Ö?ÿü³•‡±ÔtÜ•x£IDÀŠIªã„µ{ŽãÆ�³î…ƒ¶}×]w9Ø7©§íqpïùôéÓ­k'8u.\èœyæ™±èßð‘/Wû:ëÖ­K°,>‰14	ûŒÍ£IDÀ7Ž’”
kœC¶ñêXxÙÂ¸(ûU‡‚ƒk’W¯^�Åá�Yg�M›69wÜq‡S¬X1í{lò®‡1NÅŠ�Ç{Ì:'?9}cg¾0&cl&ßè&9lÖ¸€Ç¦ûr^>|Â. G�Îa‡¦­§	a‰Ó°aCç•W^±Ê…ó¡íÂï™CàÃ?tp	NXúf¦ÊÑ¹sg+÷ûsZcf——a,Æ˜L"� �Gr¹]Xë*Xâ8W]u•UN‚r^B|îÚµË>|¸¡‰ºØÌ8ßÅWÐµï¡Ìïî*Ðí·ßžÌ³Ð¾°gyøá‡�­[·ZÛ²pöƒ1Óp¬ÁŒ±c2‰†@!ÉéamGÍ›7¯3xð`k_Hî7o¹å§\¹rÚúš`dà�ÑG}du°ðþ"0yòdçœsÎqòçÏo]/Q¢„sÙe—9?þø£¿ �:ÆJ¼³†cÆ`ŒÅ$"85%Ço…µ�{�Xv¶�fÎœé0À)_¾¼¶Î&¸øÃN>ùdgÀ·oßn;ô, àRœ±cÇºF‚6ÂâßÞ½{;_}õU èøŸÆÈ$ì20öÖ&�¬!Ð^r^'¬ˆUªTq>ÿüsÿß¢ r˜6mškD¯b&u2–ú±øòË/[ç�!€¦cìÙ³ÇUºwïJWÂ¸¨ªoß¾ÎgŸ}fP;¢`lÄi8V`ÌÅØK"YGà
)Á>amçmÔ¨‘ƒcHQ!œ-2dˆÓ®];è˜`àGœ<yò8Õ«Ww®»î:×3pH\ŸeWhãò«ó£ÿš¤Y @§eË–ÎÅã�(ÆDŒ�&8HŒµsIi"@Ã‰4<ø8|N?(|­Ir§Ÿ~ºzî¹ç”ì§›D·"Ž\1¬d{@‰Uµš4i’š={¶’£V¾–]%B_üñJÎó+¹ÚTU«VÍ×<™x|GYJìÔøñã•,¹+ZJ¶–|Döö•(Jl%v,J UªT)_ó:qñQ .¾øb%gþM³~L"†"@J* i€÷§GKÊÿ/wýÓï¹þÛ«W/õôÓO+ÙgÌ5ÜæwîÜ©de@ÉÌIÍ˜1C}ÿý÷JŽªÍ›7+™™+ñ3�tõÄ0ËÅJ¬œUãÆ�]–ã[JfJÜø&� é °eË·O‹k]Wñ•ku]…@NÍ(±#P2;O*yYÁR2ÃW²ÿí
|ôq¹ó^‰ÿ{%7÷¹¿'• %‘�—/*¹°É´ÄïIÄ„áò—”&T ÒðO�×”ÿ_nñ§ßsý÷úë¯W÷ß¿cµ\Ã£ò£xtW–-[¦Àr¢@a6…UÌ vïÞ­öïßï*býëâ!ó¸ƒ„{�5Ü™=fûX5Ã'%¾	¢ë ÜÊÙu%—Ö¨åË—»}3Ûœ>.GÛ‚ï;Z{±WQâ°ç·>Ž,¹´(²ÿÐ¦ÿøÇ?Ô#�<rèÏ^ß§Ià¹Â‹½"1Ì* æX™Æl-_®¥{ Bì¾ûîSb5+ž${¬
ŒUÌš€	8êJQ<[;žµ†r›ÓÇ¡ äôq(»q&±ePr´ØtEp‘`ÕSxJœ1ËtÝÏt‚LO­~>MØs}ï‹/¾pg´Xê‹#a0Ã*•3óÇ'þ'�¨ €>þçþ�ßâLb8¬Ä°Ò]1ÀÆDn—Q’@€#m`%õ'‰»C¸£°§š�ÙŠjÖüuo;‰<•"`r<WÝxã�¦”{¤‚·	¿h]E-(0 ÿiº$]Dø]ØŸ0a‚:òÈ#] ]|†"@lDà�wÞQ—^zi2'„þÿöÎØª*;Ã[dVQÑ€Ò€ÒdP@E1qL«UQ£&%1ˆ"-ŽÄ�”eÊ"•²«Új‡jœ'ÊÐ¶ÝˆC%  63Ê 2=D@P&A”Iòÿ§yÖxïžs‡÷îð­ª¿î}çî½ï9ßá²×Ù{íµu�¿‘’EU#œZ8g€üA÷?Øé’×¥uO÷5Ž†�6mZùëÑ €@)PÒ¢pã�7†õë×Ç½¬Q*8Lò( –8 y€šÒ¤×©~ u‘:¤?ä[mà­¡w< ëÙ‰ˆƒ€@pþ„ë®».¬Zµ*îÙ{¹ßikÜ
”KN  9³¤5v¨Â4ÉQ~i³Ô8yŽRb†3Ï<3(ÍnÒï¢<  �‚"à\	Î{²|¹C£bÙ‡*u½´.Vi
eL  ct‰*Ú‹µàx€ãÓÕÜ´iS4àD7­ZµJWœÏ! $�Ù³gG�ÿÒ¥Kãžß<¼VŠí-Äm˜rÀ8˜I¾ŽlTÃ^ÃúéØt_²qãÆ(0' )>‡ 
‘€3�^sÍ5á³Ï>‹{z‹TÐ�ÿÂ¸(—€ìø%­íè{¸çIN\­y$ÀyzõêÅt@µ¤ø($ö÷œÿ’%KâžV…
^'9ÛVCp jtÊ×¬ÖûeÒù’—	VkN/ê%‚½{÷Ú*³Ú²|@ ¶	Ì˜1#ôïß?É“ÿ�ó¯¤Iµ}îåöý8 µsÇ=!V!](5”ª5z	�GXP-*>„ j‘€“š%øó¦>7I®ÅÓ.Û¯Æ¨½[ïù.�œ+5Jwž°àÂ¼9@ �¼ÿþûaÀ€I¢ý�â÷VéO…tåt.8 µ{·?Ñ×{©ËßK±F¼¹÷ïÐ!mZ�Ú½2¾(ãÆ�×_}’uþ~ò*ý¾l à…â ÔþM™¯SøBòH@Z'ÀÉ‚ì8 k×®µöœ PÖ^~ùåpóÍ7‡µk×ÆåàÎßOþtþq‰å©@žÀ&lÖ#þõô“ÒN|ûí·aÂ„	¡eË–¡G�ª‚A ¨yÏ?ÿ|¸õÖ[ƒ§(cš‡ýï�èücËg1€|ÒMÖöÇ*^!�'¥uvíÚÞ}÷Ýà-…Ï>ûìh�qÕÃ  ä�€w1ýõ¯î»ï¾à’˜æÎˆô‡˜å)–g8 yœ°y'Àðt@?)­°{÷îàÀï&è„Aõë×W5€@þ¸Ã>|xä øA$¦yˆàvéå˜å)Vp j rÂ¯ðt@…k$À# ÞEpÝºu¡oß¾¡aÃ´a	O‡â€ þJ`Ë–-aèÐ¡á±Ç‹Fcrqçï'ÿ?Æ,O±"€PC ~�G¼LÐiƒ›Ä©;oÞ¼°páÂ(aPÓ¦MãT¡  �ØV¬XF�»Ž
zDs�ôz’J”­8 5Ã9“oqíyRo©EœœsÛÛnvëÖ�ÔÁq€QˆEÀ©}o¸á†(I¬
-ä<Àîü'$¨CÑ$€Pƒ°3øª
ÕùPê%µ’Òš—âxM®“uîÜ9my
@ ¨ŽÀ˜1cÂÀ�“äõws³¥ë¤éV p 
ôÆ¤œÖ:½Ÿ"�&µI9^åÛmÛ¶…‰'Fñ ={ö‡Îm®@ ‡$à ã#F„»îº+|õÕW‡,SÅAo}>@ZPÅç.ôr#Òœ†·ö0ZGéçiÊF{e€—	z[á>}úe  �ˆÀÖ­[Ã°aÃ¢Hÿï¾û.	•±*|�´2I%ÊÖ€ÚážÉ·~£JïJž
è§¯˜9sfX¼xq”0¨yóæqªQ(cŽ%ºå–[Â¨Q£’Dú›ØKÒÍ’G-±" €P7)å�qÃ#ÞFøé0)­yOîÉ“'‡.]º°‘PZZ€@ù¨ÜÐçƒ>Háþ�t§äd?X‘À(’•rš»ôþ=Éù´½B ÖÂÿ6DÁ�ND\€¨a€À�<ßïµý·ß~{X¹2ÑèýV5rŸô€ôý�ò¦(à Åm:è$íq$-“<pŒ”ÖœÁËÁ�_|ñEèÕ«WhÒ$VŠ�´íR (^kÖ¬‰ý|ðÁ°}ûö$R¡Â·I/Hþ?	+28 EvÃ8]'òX]ìe‚Ž˜;wnð_§N�B›6mh’?! �r!0uêÔhß±cÇ&�ï÷2¿k%�FbEJ  Ho\Êi;àf²ÔNŠµB@å¢­;ß~ûíhÀ±uëÖõa(;wî#GŽŒ‚ý#”ÐÞRù_I,óK®ÐŠã ÚÉì|¼Lpœä1ýR)­y¸oüøñ‘3Ð»wïpÄŽ-Ä  �R&àx »ï¾;<ðÀá›o¼¸(¶íUÉ§¤[¤µ±kQ°`	à ì­I|b;Uc¢äàÀ3¥´»	ªLøá‡Âœ9s‚‡Û¶mÚ·oïÃ P‚œÄùüß|óÍè·ŸàÝï`¿ÿ–v$¨GÑ&€PÀ7'ƒS«ôŽ‚=¥qÛp` ç÷îÝí%À®‚qÉQ…OÀ‰}~øápç�w†¥K—&=áOUá&i”D°_Rz\ €oN§æ_ø;Rk)ö† Îø5iÒ¤0{öì(@°U+çÂ  �b&0kÖ¬pÓM7…gŸ}6$ÌêçË~UºAú‹ÿÀJ‹ @iÝÏÔ«Ù¤?ÆK{$�Ô—b™·ý|ë­·‚stíÚ5Ô«W/V=
A …C`ÇŽá©§žŠýæÏŸŸôÄ¶«Âo¤aÒ—I+S¾8à Ç}Êô,�4èÿ¤Ï¤3¤XùT.Zì Á…FN@Ë–-}ƒ Š€€·Nçûè£�&]Ûï««�œÒ÷	Éÿ‡`%J  Doì—µXO–¼Tðd)¶y‰�G¼LÐË=*€A …IÀÉ¾ž~úé¨óŸ1cF&'é©ÃA’°'€Pâ78åòÖëý8iŸä¥‚±Çõ@äœ‹-ŠbŽ?þxUÇ  �B"àa~§òõS¿³	m‡Ê?$Ý%UHXÀ(ƒ›œr‰Þ×Ó™»¼J »t¬Û>ýôÓhù�ó†;6€•±ÑQy#àÎÞ�þwÜíþ™Á-RGù{ÈßÿG`eB  Lnô—é˜€	RS©‹+q�Ê…mÛ¶…÷Þ{/|øá‡á„NˆòvX¬M	]ƒ rDÀi½½®È�!á…^ˆ~›	›vboá;DòÞ"X™À(³žr¹^%ð¿ÒÉ£GK±mÕªUáµ×^ëÖ­;vÍš5‹]—‚€@v–/_î¿ÿþpï½÷†eË¼'Xbû\5þCú/éëÄµ©Pp Jâ6f|Nê1Gš$µ’~.Å~œ÷TÀÌ™3£B»víŠ�Æ�«	È��7†'žx":4¼óÎ;Á¿Á„æßü›Ò`i¼DbAÀ Pî
À�ÒZÉ�‚‰uÎ9çì›0aÂ>¥Öè$äŠ€Sþmù7–Éosÿ¶ý÷oƒ@ü§=X•�Su¥Ã¥ÌäŠ½¡ÐUW]í/îeƒ ��„‡z(¼òÊ+ÁËü2´?«Þpi^†õ©V‚˜(Á›šå%}©úc%Ïv•Ž’b›‡$çÍ›Mx§±“O>9Úr8v„ "ÞŸã‘G	÷ÜsO˜2eJ&ÃýnÇOýÃ¥ÿ”<ï�AàG8 ?¢àM
gÿš.yÉàqRG)vl€ÊFë�'OžÆ�êÔ©9�5òG P�Í›7‡‘#GFÉ|^}õÕLÖô»uÏí¿!Þÿêß4�ŸHôŸúOjòG¹ð|áUÒ0)ã1ýÓO?=úíòË/gD \þåp�‰xÄìõ×_�?þx¦ëù+¿o�Þ<(½"}_y�WH à@"ü]�õÁíÒ�R¢%ƒ•:_@¿~ýÂm·Ý.ºè¢ÀŠ�J2¼–3oÚãˆþ#F�š)p0SNÿ÷¬ô;iu¦�P¯|à ”Ï½ÎÕ•þ�º[ºTŠ�@(õË½¯€�Aƒ…K/½48pƒ@¹p@Ÿ÷Ùxî¹ç¢ŽÏoÜ™‘y¸ÿ-é·Òµ@¥²$€P–·=ë‹v�ý¯Ò¿KŽÈÈìœþùaðàÁŒdD�JÅH ò‰ÿ™gž‰2ùeÑñûò—H�H¿—2^" ºXÀ(Ã›žÃKþ™Úò´ÀRFÓ>;çž{n”ÒôÂ/djÀP°’#àŽ_kùÃ“O>&Mš²ìø=Üÿ¼äáþU%‹ª8 5‚¹ä¿äl]á-ÒåRÆ¡þÞj¸OŸ>aÀ€á’K.	-Z´(yp\`éøúë¯£e±/¾øb˜6mZpÖÌ,Ì›õ¼.=.}˜E;T…@²¥]ð‚@5¼¤ô—’·í+eå\öèÑ#80\vÙeÑ¦Cjƒ@Qð:þ7Þx#ZÒ7gŽ3ngeŽœ"yË^§ðÝ+aÈŠ@VÿIgõÍT.UGêÂþIòÔ@�l/ò¤“NŠœ€þýû‡îÝ»G9²m“úÈ¥ìóçÏ/½ôRÔù{Óž˜½õ¿*mÏA{4�ˆ  ÿòE ¥þgÉ‰H2ÎPyržðÒA;ž&hÒ¤IåG¼B Ö	x¿‡÷Ýñ{IŸ‡ýs`ÔÆ3ÒŸ¤9h�& ð8 ?ÁÁy àL‚×HC¤Ù¶ï8�SO=5\qÅáê«¯íÚµË¶IêC c+W®£G�Ž¶Æv
ì,ç÷+Ïc©Þ<)ýAZ_y�Wäš @®‰Ò^UÜSÿ›äåƒ'WU(Éqwþ_|q¸òÊ+ƒ3’O 	=Ê"Õí'  	^IDATfJÀë÷½ö˜1c¢T×vrdËÔŽ—óý�”³Fstn4S‚p Jð¦ø%Ù$yT ­”µ¹ã·`GÀÓÞ€ƒ@®	,[¶,ÞwÇo ‹�ù<µ
ðÓþs¿ `5C  f8ó-h¯CŽðˆ@çƒ?ÎìHëÖ­Cß¾}£)í�Ž;Î32#°~ýú0uêÔhˆß;ò­Y³&³†]k‘û‰ßsü+]„£È€ü±¥åxZ«˜Wxz g¼*éKyÂÎ�;‡.¸ ðA³fÍÒW¤DÙØ´iSô„ï`¾‰'†E‹G÷çÐf«-ó;ª?§EÏ‘¦Ê€ @Üä"¹Ä¦:ÏK¥�ÒÙR)'V¯^½Ð±cÇÈp¦Á^½záä„lé4âNÖ¬YQ¦>wüK–,	»wïÎåîTcNÜ3RrÞþÍ�Z%€P«øùòCh¬cÞpè_¤_J9Ã÷*‚N�:E›y‚ÓN;-xÚ +?ÎŸ;wn”�òäÉañâÅ¹ŠâO…é(þñÒ%oÔ³CÂ Pp 
â6pUplÀµ’cÚUQ&ãÃÞž¸C‡ÁY½+aïÞ½CÛ¶mÃá‡;©!VjöîÝ***ÂG}íÂçì|K—.ÍfûÝê9˜Ïsû£$Ïõc(88 wK8¡Ch£cÿ ]%yzÀ£97�8Û ·*¶3àiƒ–-�Ï+V6lˆ†óÝéû)ßYúrÈ—ŠÆO÷æEz[ú\Â P°p 
öÖpb‡ ÐHÇ~!])]$�(åÅ4hºví�x5AÏž=£=	È@˜Ü9kÔùœƒöìÙQô¾Ÿò?ùä“°s§§àóf«Õò;Òé}é;	ƒ@ÁÀ(ø[Ä	VA �Ž_(Ù8K:BÊ›sÌ1Ñª‚.]º„³Î:+rÚ´iŽ>:ã]�óv®åÔðÖ­[ÃçŸuøÓ§O,ˆ¢ö·lÙ’oßê¦Kîô'H¬ß¬¸à ×ýâl&ÐP‡zIïWG½úXÞÌ±GuT4Eà€B�8˜ÐyÊ qã¼ÌPäízŠ¥á;vé{ƒïùÉÞ�{ŽØß¶m[¾æòSñ|¯?–Hãök–^}ƒ@QÀ(ÊÛÆIWAÀ�ã}$;ž"ð(A�DôyuAÓ¦MC·nÝ¢ÀB;§œrJhß¾}ðFF¤)Ö�H`Î²çuV¬X.\uôØûøã�ÃæÍ›ó­_ÕÙíÕ~º÷¿;þiÒV	ƒ@ÑÀ(ú[ÈTAàx?GºDê'9�°ŽTcÖ¨Q£h¤À+<:à)úo¿÷´BÃ†ƒGÊÑöíÛ¾ÿþûàázã»ƒ÷Ó¼ßû)ßûÉþ»ïj|JÝYÀ7Y+M•¾”0”�òüŸ§¤n!“†€;}zdà‚ý¯¨+Õ¸Õ­[7r
LèÍŒÚ¶må!ð
;~õˆ�cˆè$FÅê ¸ƒw2ày®ÞOôŽÀwïWËËò¼™Žƒ÷ÜÙïÙ³§ÆïÉþ/ôûIßOø÷¿:¸ÏÎ �’$€P’·•‹ª†€GÎ”Î“<BpŠT_ªuó4Â‘G�
ØA8ñÄC«V­¢ýš7oe/ôÞNiìé;	žZðHƒ§?Î·³àNÝiqÝQûÉÜCõîÜ=,ïlzÎ�ï×�7Fï×®]V¯^uð~Úß¾}{Mß§»§»T`¡ä'ü÷¤¿H<éVp Êã>s•‡&àEþ�¥¾’GºK>V°æ)ºÓ÷{�x¤À�ƒJ§ÀŸùxå«ß;Á‘�„TùBÝ¡§Ê	süÔn¹Ó®|­ììÝÁ»Ã÷q?á»Œ�éù}�Û�ß|ÉOúS¤E’�a(;8 ewË¹à*4ÐñŸI^Qp®tšäy]^¨ö±üðr=GîÏ•&IŽÜ_%í”0”5€²¾ý\|5¼9ÑI’w(ô”AÉA	+\ßèÔÜá/�<¤ï�÷–K›%H!€�ƒ·¨†€÷n'�*õ–<uÐVú‰ß‘ Ô‚íÓw®“*$å$Í“Ì·IÂ  �jðW5pøÕpZb¯.°SpÆ~µ×«�`¹'à§xwø+¤ûåÎÞÑú5¾VPß‰A ¨	à õíãäˆ€KÇJŽ#h#y„ «äio!ÙiÀÒpgþµô•äáûO$?á{mþ*ÉÇýô�A YÀÈU!ƒ€ƒ[K­$;+Ù9ðhÁ1’c
Ê5®Àóõ–÷û©Þ�ü§’;ùµÒÉA| �8 y€J“HCàp}îÑ€–’óxÚÀ‚Güjù³£$;V©˜l§NÖ�·µMÚ ¹S·ü$ïWç{Ý½?óSÿ^	ƒ jˆ @�æk “€“vJž:8Nòô�ƒ[Ð|¿|ìh©r¡±Þ×—êIÎrè6”Û®”ÞdV¯”;ãåly»¥]Ò©ò	~«Þ{È~ã~y®ÞAx>¶^ò�½¸=†îƒ@!À(„»À9@ 9�:ª’ÚÁ»ã?Ròh���Ø!H}ï:•õ*ßëP”îö½ºƒö«åNÞOñî¸Sßû‰~»dG ÕAp€   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ Ø	ü?Ë‘Ûù&p    IEND®B`‚ic09  ”m‰PNG

   IHDR         ôxÔú  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  @ IDATxì]Ø5ÖJï½÷"H”¢((MuEÅEQ»Øq­ë®.kÇ
è*‚€í·+ØP@”Þ{¯2ÿyG>Eýî$·ÌÜÉÌ{žç|÷~7™”7™œ“ääD) D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€�¤È“ô|€�0"€w9¯ðáù0ùÌaü^à�ß¿!t@x¿ð/¿ãsÏÁß–ÃøŒ¸Ž0‰‹ `qã±è‘F ïfþƒ\X>Kä2‡|/!ß‹ÂÅå{Qá‚b¤¡Ÿó¾ã3‡å«+Ì!Ðs„:>!è÷
ïþo—ÿ·
o;„·È÷MyÃ!ßwÊw¤ÎI[¾’ˆ 9BÊÂ2�¸!�O*Œ™9„zåƒ\A>+ò%ùŽpur|â™0V 0ä(PV	¯<È«åsÍÁßVÈ'ÂñÌ>a #@ `À™],€ /)\K¸¦píƒß«Ë'³û"Â˜½ç,ËË×H¶°Š°C«Kò"ùüYx±0¾o¦b  �ˆ€_PðY¦G ¼!È«	CÈ×n(|„0fø¥…¡D]ÈKS"(ü…±j0_x®ða(Ë„¡8 ‰�4 �&€|<Ö`f_]¸®pSác„	—Æ²=íHé# £Cl¬þ^xºð,á…ÂXAàJ�€@"É"@ YÄ?Î`�Ù<fõGCèCÀìÊ )8 ô±J  ÊÀa¬`Õ +$"@4PÐ ÄàX#€åz,å7>Iø(ášÂÅ…IáC`«i±ðwÂŸ	ÏÆÖ¶HD€ü	* „ÿÆXØ×Æì¾íÁOìãSàØ`u`ÒÁÏŸä'HD öPˆ}ˆ= 8f‡%ýöÂÇ	7./z:üðÃUáÂ…UÁ‚U�~ã¼yó*0Â*¤Š-êÆË—/Ÿ:ì°ÃÜßsÂQÉ_~ùEíß¿ßý<pà€Ú·oŸÚ¹s§Ú¾}»Úµk×oáˆ³gÏžßx÷îÝn<<o	­•rÎž,<A[8¦H"±D€
@,›=Ö•>Lj_KøxáÎÂ-„aÄƒ=êâÅ‹»B¾L™2ªzõêªB…
ª\¹rîÿ¥J•RàbÅŠ©"EŠ¸‚ÂñóçÏ¯�„<~ž<©½æŽã((üP
öîÝë
|(à;v¨mÛ¶©M›6¹¼aÃµnÝ:µfÍµtéR…ÿ¡H€·nÝê¦!8‡…`X#ÂiÂ)Œã‡<a  �â�@j#C<°a-£ƒ@©
„üIÂ�„[cæŸ5‚ÐÎàUªTQuêÔQÕªUS•+WV•*URåË—wÃq!ÌSäAWŠ”(9ÊÁÚµkÕªU«ÔÊ•+Õ²eËÔO?ý¤V¬Xñ›�¸Y&¬LþDø3a(pRD"‘E€
@d›6öÃŒûù˜åCè·Æñ¼@	³ñ%J¨Ò¥K«¸‚¾fÍšêˆ#ŽPø¬X±¢»D�åú8¶°Å°zõjµxñbõã�?ª%K–¸ŠÁ?ü 6nÜ¨¶lÙâ®:d7üJÊ V`7°_˜D"… €H5gì+ƒþ\K¸ƒðiÂú�íçc	¾dÉ’ªV­ZªqãÆªnÝºêÈ#�t?1«Ï™ÉK™H	ÈY9ÀjÁÂ…Õ¼yóÜÏ9sæ¨E‹©Í›7»Û	÷ãgØ@'ü©0¶	a°* Ö7!+ Àé„ýÂ]„q6ßwÂþ;–ï›6mêÎî�9æWðcV�½xRæ€V LŸ>]a•`Ö¬Y¿m#d.'Ï”–Jè‡Âï
C)€s"°* Ö6]ìŽ%þæÂ;ÈGÊg>aßÖô6TGu”jÑ¢…‚ÀÇ2>öéalG
'Â¾ ÛP¦M›¦¾ûî;5wî\wkÁç’ì“ôç	¿s�¿•On$» `W{±´JUN>Gøxa8ëñ…°d�}û£�>ZµiÓÆý„5>–ùIáC Û8}0cÆõÕW_¹ŸX)ðÙÀN†p‚àuá�„W“ˆ€P°¢™b_HÌöq\ïìƒã¾Œñ à1»‡ÀoÛ¶­»#>’}Àˆv“&MR“¿š¬¾™ö�« øè· Æ‚od/äª€}Ý&V%¦«æ¶®²˜jÃ˜ï|á¶Â÷ÈÃ=ìáCàwèÐA5oÞÜÝ×—¼HC Ç¿ýö[õé§Ÿº+°!€?áyð%ab•€DB‡ €Ð5	$Ôî*|¡0fþXÈÁx¯Y³fª}ûöªS§N®¥~Ù²e3–>
?ë×¯wO|òÉ'jÂ„	jæÌ™®O‚—+ X	#üž0N�ˆ@h š¦`A�†Â	÷®)œ1‚U~“&MÔi§�¦ºvíê
}Zêg^«Â	¾ÿþûjÜ¸qjöìÙ®÷ÂWj±¤÷Šð(a¸ &�¬#@ ëMûÀNKáÞÂÝ„+
g„ à±¼ß¥Kw¦�å}ö‘ˆ@"`0ˆm¬|øá‡îQC(¤Õ’Ö[ÂÏ#lÍE
RVRÄ ±µ¨:ù¥¬'÷>Uûý!8ßÁLƒ>ß#�d€§B/Äª N‰2H°x_øYá/„÷
“ˆ@ Pnf&àÊ]8ë�àï(\H8m‚Cž“N:IuëÖÍµÞÇÅ9$"�)pÁN¼õÖ[ê³Ï>se(í]’Îxa(p2Ä«ŠR0Pgæò«àÇùýK„¡ ¤í´×àâŒþ¹çžë.ócæO"~#€• l¼úê«®¯\‹œ‚s!( ÏÃŸ@F•tHD !T BÃ€!€=þÎÂ×
cÆŸ¶àÇ•¸0ä»à‚Üã{Ü×TI�# {8zá…Ô{ï½ç^…œ�B@ÀŠÀcÂÓF@@ ùƒ  peªJAðc�ÿráÓ…ÓÚˆ‡«]XñwïÞ]�qÆîwºßTIYG n‰qràÝwßU¯½öšû¿¥IÛåù±ÂO	ÃF€Š€€@Ê,T 2‹'Sû�¦òqµpá´œ÷à:ÝÖ­[«^½z¹ûû˜ý“ˆ@XX·n�k'0zôh5uêÔL\g§B8>ø¤ð¬°Ö›å²* v¶[XK]K
v…0Îò§e…÷»Xæ¿ðÂÕ‰'žÈã{amq–+W°=ðùçŸ«1cÆ¸ÛpKœ&­‘çáC`˜0
¥	&ÿ* ì	™@ ×ñöÆ¬ÿˆt,_¾¼:ë¬³ÔE]äÎüáŸŸDlE ÷`%`Ô¨QêÍ7ßTk×®M·*ó%¬¼(ÌëˆÓE3æÏSˆyH³úäyÜÊwƒð1é¤U£Fw™¿gÏž®—¾tÒâ³D ŒàôÀ‹/¾¨°=°dÉ’t‹8],Œ[÷¤›Ÿ�'T âÙî™¨õq’ÈÍÂ¸¬'eËþÚµk+ýÞ½{»7ïe¢`Lƒ„ÜPøüóÏ»ÊÀÏ?ÿœNQqb —= <9�„øl< ÏvO§ÖUäa,õÃº?eï}˜ñc¿_¿~ªV­Zé”‡Ï+X´h‘>|¸k'�æŠ ¼
â´ ¶VX	�¨ dv+3Å,ÿ\á[„›¤ZƒÊ•+«¾}ûrÆŸ*€|.r,X°Àµxî¹çÔÊ•+Ó©ßlyø>áW…±:@"žPð„‡�h,Ÿ…q¬ûþISéÒ¥]�}—_~¹{oÒ	ð"qp%ñSO=åzÜ¸qcªµ…= Ž>(<'ÕDø\< �vNµ–Xâ¿LøáÊ©$‚ùà¼çª«®R­ZµJ%	>Cb…À×_­†â:Jã&B,%<.ü´0¶HD€cÚIL¸$uRá¼yó:§œrŠóÁ8û÷ïwHD€˜#€wïÞ!¼K©¼ƒŸÁ;Œw™Dþ‚ W þIìÀ¬ÿFaúá{Ò„+xèºì-T¨PÒÏó"@~E`×®]®‹á|Ð½š8E\° Á‡…¹�"ˆQ|Œ
@[5õ:�"�Þ)Ü&•$ªU«¦ úôé£è²7ùÈ¸9r¤zâ‰'Ô²eËr�¤ÿõK‰òáôQ#ÐÍZZY_GÌôoÆyâzúèŒ�Yþyç�§†êzñãí|Ä‡ÿ�tÀ;uüñÇ«N�:©mÛ¶)œ�m‚d“­.œ.\Dø[áÝÂ$"@bŒ ,ó>NiŸñØc�uÆ�Ç}~óí]Æ$i! û ¼sx÷R}o¾ó´Ê âL\ˆoëcsÎ|`)|T²0T¨PAÝzë­
{“Íš5S¼š7YŸ¤† Þµzõê©¿ýíoªdÉ’êûï¿W¸|(Iª%ñ»
ï†ÿ€¤—ä’åP°¼S,~y‚gû“º®ƒO·nÝÔÓO?­zôèÁ[úRl >FÒE ÛíÚµS:tP°˜?¾’¥…d’Å»% ®0¶6	“b„ €5¶TFŸç?+|’pRtÄG¸3þ»îºKÁà�Dˆ@ö¨T©’:óÌ3U�:u.Ú°aC²…‚£¯“…Wÿ�ìÃŒo/T ìm»dK^Z¸Gø^áJÉ<\ @÷z^x)ÃlCÎ%'ó8ã"à3x'±wê©§ªíÛ·»Š ®"N‚ÊJÜ3„K	OÞ%LŠ8T "ÞÀ«×\>‡÷†OcjÚ´©züñÇÕÍ7ß¬Ê–ÅA"D ¬Àåöé§Ÿ®5j¤~øáµfÍšdŠŠ±G€a8K+¤#@ Â�{°jXò‡;Ðc’©jþüùU¯^½Ô°aÃT›6mhä—xŒK²ˆ ìt6l¨Ä‹ Ú²e‹š;w®Jr5 ‚…áNx^«Â¬}F€
€Ï g1ùÂ’7Œü®�L9ªV­ªzè!uç�wª2eÊ$ó(ã"J•*å®À^gÆŒjëÖ­É”[†Ø€UátaÞ.( D�¨ D­E­4ø¡ÂW	çÿõ'ýß<yò¸ÆDÏ<óŒ»—È£}zÌƒ„¼ÃÍ›7W;vT«V­rO
$Q^l	´n » º¢DT ¢Ôš¿Öå$ù!ÜAVÿF„™þ¿ÿýouß}÷ÑÂß1F"ö P±bÅßü`5 wÆ�†Â'
ÿ(¼X˜¨ D¤!¥‡	÷&\GØ˜àbôÙgŸuÝùæË—”� qŒHˆ@vÀ»{0|$y§@E)=|``¦pR$>)„Pa£¤P¤bòÌ]Â÷—0}Çû.½ôR÷îq‘ˆ ˆ>Õ«WW]»vU;wîT³gÏNÆ@wt†Ñ¯…áE�d1T ,n¼ƒE//ŸO	Ã­¯ñýòåË«Ç{Ìuç[¬ô qA hÑ¢®�'OžœŒ+aŒ1m…±Ê8Q8iÄò)$PIC¤XŒ¦òÜ3Â¸áË˜ä×•/\úÂð�Dˆ@üÀ»çA­Zµr},_¾<Id-Æv@RÎ’É„qýE€
€¿øú™z;IÆ~Æ7zÁ"øüóÏW°òoÒ¤‰ŸecÚD€X‚@Íš5ÝÕ€Õ«W»%qŸ@-©"Œç/±¤º,æ!P8‹¾^$eÅÌ¿¦i™qkØ½÷Þ«î¾ûnoa$"@ˆ@Å‹W§�všëísÊ”)j÷îÝ9AºÏrá4áµÂßé"3<\PW{èJKÿ„†Ïn#Â%!ðãß»woúñ7BŒ‘ˆ@üÀ}Ø„Að7ß|£6m2¾Æ��…a8U˜'ˆ
€­ôkay{�ð?…þú“þ/€Œ9Rµm» DÀ�úõë»—~á¨à¢E‹¼#ÿ
‡cð=RXøKáýÂ¤�#@ ät°x˜í?"<@« Z‚�O¿~ýÔÐ¡CU­ZØª#"@ÌÀ)!Ü%€U€™3açgD›N†Ï€IÂÆû—”¨ dô$³Ä1?¸õíeú\Á‚ÕwÜáîù—(aìÀ4yÆ#D )RDuéÒÅÝ6„]ÀþýÆ“ú£Ì:&
ó˜`ˆû
€7Ž­†ð³ÂÝL‹Y¡B÷|ÿ5×\Ãý~SÐ��\€]À‰'žèºOÒ_ Ž	6þBxK®‰óÇ¬#@ ëM�° õ$d„p§„1þP»vm÷ˆ_÷îÝy¾ÿOØð_"@RC Ç_@ãÆ�]§AIbÃj l6¦–;Ÿò* ~¢›zÚGÉ£c„�5M¢E‹jôèÑ4ö3Œñˆ H
�ºuëªvíÚ©éÓ§«•+Wš>‹ULØL¦Ã SÔŠG   “È¦¹Ä}^¸™é30Ö>|¸jÔ«n$"@ˆ€?TªTÉ=!°`ÁµpáBÓL*IÄ6Â8"¸Úô!Æó* þcœLp­ù‚°±$ÏñìWµjÕdòa\"@ˆ@JÀ‘&p<gœ Q‰u¢0VV=ÁH¾#@Àwˆ�38NbŽ>Òä	ìËÝxã�ê¡‡R¥Jû2Išqˆ  ž.\X�|òÉjïÞ½
'©¬ÄƒC’ÂI]<`˜>£%‰ €$ó)zKIw´p}“ôq¯÷?þñõïÿ[á¨‰"4¸N6p• |\ãhÆ†é2J
PH´?’#ü�0IÂÿž{îqÏùã;‰"�-pL°}ûö
ÊÀçŸî*e)#q À&€J€`~E¡à²féÂÐM¢c¶ÿÀ¨ë®»Náf? D Û`;²M›6îVäÄ‰Õ¾}ûLŠ„í l{N¦a 	b>Ä¡à¨†Iâ>Þ…á,CKE‹UƒVW^y%ÏøkÑb"@‚D J@ëÖ­ÝÛ?ûì3×6À x9…MÀ$aÜ&H
* ~0»ò9Jçýµw¾�?þ¸ëÛ_™ˆ  YBà˜cŽQ•+WVPöìÙcR
(­„á6x½ÉŒ“9¨ dKÓ”ªIÄÑÂ­M(S¦Œ+ü/ºè"“èŒCˆ È*Íš5S8–Œí€]»v™”¥²D‚ÇÀ�…·š<À8™A€
@fp4M1àÛ¿½ÉþÃ†S8ëO"D€Ø‚@Ó¦MÝ[H?ýôSS% #�þTx»-õ´½œT ‚kÁÒ’Õ0á¿™d	gC†Q=zô0‰Î8D€�P! Ï¤Õ«WW&L0UêJj
"l´t ñHi @ ð’x´°Ä}XøB“gŠ+¦}ôQuá…FÑM’d"@ˆ@àà!ÜPŠ• 82 œˆÂ1ÁñÂFÇ	Òd”PH LÎ+iÝ#|µp]º°öä‘GTß¾}uQNˆ =°	(W®œ»`¨à>”üÂ„„¾‚�
€ÿ�w“dq»°k8ÓÀ9ÿË/¿ÜÿR1"@ˆ@@}ôÑªxñâîJÀ/¿ü¢Ë¥ÖÂØÀUÂ$ŸÐ
%Ÿò�K²}¤¢
ÐUŽ}î¾ûnuÃ7ðœ¿,†"`-[¶Tðˆ#‚ŽãèÊOg'¯ž©‹ÌðÔ �n&O�"‘†	—ÐE>üðÃÕm·Ý¦n½õV…ï$"@ˆ@Ô€³ c�=Öuüå—_š(ðu%`¶ðÂ¨á†úPÚøÓ
8Î2Z¸ª.y¼×\s�4h�¢oZ'DÀf0ÁiÛ¶­Ú²e‹úúë¯Mªêc…?¦£ Ä’ˆC 	°£â<ësÂ0dÑRÿþýÕý÷ß¯
,¨�ËD€Û€pÂ	'¨µk×ª3p3°–p„®Óq2€Ž‚´p™G `Ž•ILÜÍû¸ðé&‘O9å÷¬É’%M¢3 D äÏŸß½@höìÙjáB£ÕýRñŠÂóx`†z€)É Ëÿ
_j’$.Î5j”ªT	ÎãK°Þ¿¿{ƒnÃ�â0¢-D|ûDÔj~hÿFÏéãq¿Ñ³páÂª]»vjòäÉjÅ
Øúi	« X*ÅJ€ÖŠP›#èÏ¥#c øŸ†áŠ'qÄêå—_VÍ›íx¦eCàŽ;Ô¦M›Ô²eË\^²d‰Z¹r¥Ú¶m›Ú¾}»{iHŽð‡ƒ"•-[VÕ¨QÃõ(V­Z5÷<1VLâ>xÚÐîq*ãæÍ›ÕúõëÕÒ¥K]a¶xñbw‰}ýçßÑÇaóƒþ�0ú7ü~` �yèß`¸ GX\èÛo¿Uç�wžš?¾I•1û‡O•ÿ™Dfo´Ži¼gèA:Ëç‹Â¸ãÚ“àÂ¿C‡žñlÜ¹s§úùçŸÕ´iÓÜ=¾ï¿ÿ^Í›7Oa�Äa˜%Kð‘ ;‰š5k*xkÒ¤‰kQw£PHD H`Ä†>=uêT5sæL5gÎw)—ß@ØsûCq¡ �Cð×¯_ßíã˜ ´jÕJÕ©S'ò
<B	X·nÝpIðŒ{
œ œ?"@À(�hGHØ[Â°ü÷$hûO<ñ„êÓ§�g<1ÓÁ@øá‡ªI“&)ìíaÖï'a• 3§ã�?ÞU¨`]Œ‰ø�ÀªU«ÜåêñãÇ«¯¾úÊøXÁò“p8,•wîÜYá,}©R¥üÌ2ki�9R0À]4(Ä<‰ÓMØhÙÀ =F!I#P\žxWûQZôŸA21ˆÉLß‘K‹œO<Ñ�¬ÅÀ§TâÈÊeÀ¹îºë¹†Ô‘•†hÍÚdÙ³wd%Ë?ŽbGlS²ÖÇe…ÀÀyðÁ�¹sçf¿3Å™Äû�±c0‰d�A’«Q‡½ôÒK�Ý»wûýþ–>Å+¯¼Ò‘{¿�êoŠS&âÉJ‹sê©§:²ÕâÈþk`˜0£è  rÜ¸qN÷îÝ™q‡®�Ë;ŽÜâˆW½è€.5Á‰±2‰q c0‰ŽÀY’#Î¤j;ëÉ'ŸìÈÞV$^Ôï¾ûÎ‘e:§|ùòÚz›`ãg1¶r€ý«¯¾êÈRm$ðg%üE@öï�±cÇ:gžy¦S¨P¡Ð÷q1ˆuz÷îíÈ–„¿À˜:ÆJ¼·†cÆ`ŒÅ$"0ß_*¬í¤X6ŒÂr�X5;·Ür‹#FŒÚ:›àdñ?îÈþ©óÑG8Œ1+Û�ãhÎ9çœãˆ…¾u}\lœË.»ÌùñÇmƒ=×òbÌÄØi8N`,Æ˜L"¾#P^rÈ9‡êÙAå8�õBG¬š�áÃ‡;6ô¬«`úpl\qÅÎ¢E‹rtøc<X½zµsûí·;rš$ô}X÷žÉ)gðàÁÎÖ­[­oL(ìCuu>Ž1c3‰ø† œý<!¬í”0zì±Ç¬~	å˜“Ó£GGÎÜkëk‚IXâ@™yå•W9Žhuû°ðé# §VœãŽ;.RýïV¼äˆbú e9Œ¡I^bl¦s;�äJ²{„µfšØO´‘ ÇŒãÔ®][[O,Âû»0bÄì�?äˆªsÇw8rî>²}¼bÅŠî$ÄÖq½eÇXj8†`lÆM"G ‘¤¸HXÛÅy‡#g†­Ua5×]wYa eÒº8â�É™>}º•mÅB§†€øžw�üt}#
á˜=_}õÕV!c,Å˜jØ£1V“ˆ@ÆÀ•”ïk;a•*UÙHxÑÄ—¶Ž&8Øû¦ï½÷ž�MÆ2'‰À”)Sœ¦M›Æ®�wêÔÉ�Ï[	c*ÆVÃqc5ÆlÈ%•ýÂžÖÃ#FŒ°òÃ~ÇŽ=ë§«¿Íá0 ³µí¬ìpY(ôØwÇFz[K÷þµhÑÂj» ¼Ÿ†'40VcÌ&�´h#)À÷´V8^{íµŽÜü•…¡-½,q¶?Ž³¢?·i‘"Eœ'Ÿ|2=0ùt(€/ˆ$,ÊµïúŸûŽ-ÿ×«WÏ™0aB(ÛHW(Œ­c±Æ˜�±›DRF ”<9AXÛéà
wÃ†º>ºp¹‰Ë‘‹u´õ3Á 
q`(÷5„®�X Ô=z´Sºtiöñƒã¼w~òÉ'©šÅ'1Æb¬5k&H<Œá$"�4¸(éamg“ë<­ôÄgÍš5ÓÖÏƒ(Å�¿€¡C‡fq˜cÖ™BàµW_¥+ßl¿/rÃ óÅ_d
æ@Ó�×CŒ¹†bç¥w)9ºJôÂžV¶ÿûßÿ}2‘Ù²eËœÖ­[{ÖMW÷(‡ãb#…$Ù‹Àûï¿	ç>~½gð´'×[ÙÀsý`ÇXN"ÆT‘˜_k$åÀ[žM$W÷ÆÒÚß¤=�ƒWl]*µ©?úQÖY³f94Ð¾¿‡¶w¿ËÚÎÊ•+ýh_ÓÄ˜‹±×°Í0–cL'#–XÚÎG9óçÏ÷µ£g:q\oŠ«MMêÇ8Ê9ê¨£è:8Ó�Ðçô’Ü'Žý»pÉ%—Xé´coÎÊ0¦“ˆ€�“%ÆaÏ�ÇQ`\d½ðÂî×Õ�á¿··nÝx› %}ß¾}Î5×\Ãþ­¿}¿qkæC=dIÿ±˜ƒ�bLÇØN"	(+!FKÿ_|±ƒÁÆ&‚Å­Zµ88&18Jpñ²u€´©f¢¬TpW^sú¯î×
Oœ81Mhƒûöík:¦alÇO"¹"p—üªíLX¶mß.~O=õTmÝLêÇ88Cn«Õt #r3[°`A2KÂ|þ4ÖáR$]˜¯X±ÂÝª3—0Æ“ˆÀ_h-¿¬öpDì�7ÞÈâ0—ZÖppch5ëY>Q‡;Õ-[¶¤Ö |ÊWvïÞíôéÓ‡}W3~éÞÏ�ZyK&ÆdŒÍºúI8ÆxŒõ$"ðåÛ»ÂÚ„ýEÒÙD?üðƒ÷&õcï>0dÈ›š>6e}é¥—L÷‚ùxŒs%J”°Ò§	Æä$l?0ÖcÌ'�>òw¯°çàÐ¸qcççm"¼¸öVW7†{·}>p¥Š¥fRxX»v­Ó²eKöqÍø•Ó‡uŸg�u–uG›Ñ16cŒÖÕOÂ1Ö÷&UC0˜-ìÙq
,è¼øâ‹áõK‚[´J•*åY7]ÝþÇ¾qã�7¢ÏhA ðàƒ²kÆ¯dÞaQÚ¸Í‰¾†1cµA}1æ×&Å¸ˆ|\XÛazõêe�Õ?,d{öì©­›Iýç÷>A¸@‰”}/^Ì“-ãW²ïo‡¬<úŠ1cµa}1öÓM°€Wj+ß,ìÙapy†�.3aµ^¬X1ÏºéêÎðÜûÆå—_n¥±TöEvfK0hÐ öoÍø•Ê;Œ³õ¯¼òJf+ Ô0VcÌ6¨7Æ~È€ØÒa±­¹RE¥îw
—ðÂ Ož<ê¦›nR�5òŠÊ0ñe¯Äío(Ëf{¡d‰TÍ›7ÏöjX]þÕ«W+qleuÂZø½{÷ªáÃ‡«={ö„µˆ	Ë…±c6Ænaì‡€,ˆ%ÅY¸@Z¼ƒ®ÕÛ·o¯ÄÑ„.ZèÂe‰Z½ýöÛ¡+WT
$†gJfHQ©Ž•õ æo³Mš4I}ùå—þfâSê³1vd dA,)®
@eiíÂ‡{µºÜ§n¾ùf%Ëè^ÑBöúë¯+qêÊ²E¥Po¾ù¦Z¿~}TªcU=03E—Ue«ÊmSaåÂ…>n#aÌÆØ�1\C���	±£¸* —IKk×ô{÷î­:vìh]§Ø¼y³z÷]u%ù‰ÀÜ¹sÕøñãýÌ‚i'@`úôéêë¯áÙ•ä'r¥²Zºt©ŸYø–6ÆnŒáY ™;Š£P_Z¹¯®¥kÔ¨¡®¿þz•7o^]ÔÐ…óÍ7Jœÿ„®\Q+�øXPcÇŽ�Zµ¬¨ÏG}¤¶oßnEYm.ä¢E‹ÔÇle0vcÇXn@�	�±¢¸) ¨ïUÂU½ZY\æªk¯½V‰Ó¯h¡Ã’è‡~¨Ä5j(ËµBa�tùòåQ«V¨ëÃÖqãÆ…ºŒQ)Ü�Vði#aÇXŽ1]C�	�±’‰±ª¬4ná^ÂžÔ®];Õ¯_?Ï8a”»ÐÕ{ï½ÖâE®\K–,áRtÀ­
W®pú”)S¬Vr1–cL7 ÈÈˆØPœ ¬å_-\Ò«uÅ–»lT¼xq¯h¡›={¶Â²)03ÁdÆ\\¦N�Êåÿ ûN¼L›6-À3›Ærl`l×dd„}û¾šŠ%
Ž“p¢€pF" r~ïÖ­›:å”SrþµîKÒ\þ¶Ùäu
¤€ ‡Â…ãi¤àïzîq@›O\`LÇØn@��± ¸( 8ÍÎóLˆøÌW7ÜpƒÊ—/Ÿ•�£´ï¿ÿÞÊ²Û\hØ ˆKZ›«`MÙ×­[Ç>ž…ÖÂ‰›�.1¦clÇ¯!#Y¡IÃšà¸( ˜ÒŸ®k•óÎ;OµjÕJ-´á[·nUØ%‹ …RpxÃû"–¤IÁ"€#¯¶ûÁØŽ1Þ€ +ì]6¨`N”8( E¤²W
{îëT¬XQ‰÷\¬ü\¹r¥õ/©�ÀcYzáÂ…6Ýº2CAÑ%‹ fÿ?ÿüs°™ú�ÆxŒõ‚¬€Ì€ìˆ4ÅAÀžŽÖô¢‹.RM›6µº±ñ‚îÜ¹Óê:ØZøùóçÛZt«ÊME+;Í…»¢pòc<Æz‚ÌÐÚŒ¤ê(QW `Ê?@ØsSŽ".»ì²P7”Iá,X ð¢’‚G ƒ#±÷wØ¸àØ%);DÅÎc½�s ÈÈ;�ƒv‘¨+ ]‡Ö:,à.²víÚºh¡§Cšì5ÑÆ�\0“üC §[xÄÕ?|u)ÃöÂV‡@‡Öc½¡‹`ÈÈ�ÈR” hnW{º€jØ°¡êß¿¿õŒÆh¤ì €­âï/öØ‡&Æþbì•úš5k¬¼8·:aÌÇØ¯!ÈÈ�È®DY8UNëÕ	×FV«VMÓÂŒ³º[¶l	A#ZBÌN‰¿¿�Àèç¤ì €U®¨lsaÌ7¼æ2²$’U ¿´VaOËÿºuëª=zD¢a© d·© ø�?V ¨ ø�s¢àf<*
 êˆ±2@C�!}„!S"GQU N�–Òzsºä’KTÕªž÷YÓàû÷ïç	€,¶ÓŽ;²X‚èg%ýœ”€”0Œý�Y™9Š¢ �­ZÈ«µ°ÿÓ«—ö^ ¯$B€(iç¡× 0°P'þ@¥Â'
Fhi@�õG£¦€AØ@–@¦x®(g½qR(@€–‚ƒÖrgA+Uª”dá|~º!„HÙA ‚‰øû‹=0¶Ù½¿èøŸzÇÈ C¿ �)�-‘¢¨) y¤uàåÁÓj³V­Z‘ÙûÏé�‡v˜µwäÔÁæOÜ7në¶àž7o^…~NÊyòäQhƒ¨l 4™ÙŠÚÛT[ZFë½©gÏžªfÍš‘iDT£Áu—‘ªs˜*€øûÛ"P°¨ ø‹±WêP ¢¨äB@&ddLd(j
 Lú«xµNùòåÕ\àÅÊ0¼˜E‹µ²ìQ(4„±bÅ¢P•ÐÖ¡páÂ‘œ�†ð?ãK T2²AC�-Ñ86v°¢QR *H�.Ô4 úÛßþ¦ê×¯¯‹f]8^Ì%JXWî¨¸`Á‚ÄßçÆŒ² òºŒ$_¶lY•?$OÃ¹2²Á€ c k"AQR à¬ÁS²c†�Q\F„`p×u$:m+€øûÛ2Å‹WÀ™”Ê”)Ùm.ÈÈƒU<È˜È8ŠŠPXš™g}:vì¨p'tTÉ`	+ªUÏz½Š)¢0C"ù‡ ¶ ¢àµÓ?„üM×èFu ÈA6@Fh2²2Çzò˜ÕŽŽó*/¬W±Ïåcê�‚G J•*&³‡à¡agap‹[„j®ªT¨™•ï\�…l€Œ08é Y£u4—k&!û1

 $ÞyÂžY³fÍTçÎ�Cf‹S¯^=U¨�§ÿ£ÌfÈÔ~CàÈ#�T8	@ò(·Çµü+@ŒSöGqDä€Œ€¬ÐddŽõ³­(( u¤!<%;:/ÎzFÝH®¦¬ `™”<uê ’üF ¾Û©hù�ò_ÓÇÄÂÀoþ_´ìÈÈ
ÈAæXÿÒGAÀÙLO—~X6<÷Üs5íi0l °
@
,M7hÐ ØLcš[“&MŒÑHÁ" ×¸¬¾@Vl5Aæh}ÎÛJÉçf»€ƒ××Uû´ÓN3iP]2¡‡!HR°`o”
@0˜cZ¹rå`2c.¿!Ð¢EU®\¹ßþ�òÈ‚ì�²–lW Žä›{¡¡‡ÙÍ›77Y¾Ê‰ÎÏ €½Q’üG Ç´Z¶ŒœKvÿ�K3‡Ö­[Gö`nÐ@f@vh²2ÈZ²]8S�/à…~Û¶m:o\è¸ãŽ£5zÀ�Ý©S§ÈzHJ£ìÚ´iC%×©ÌD‚]ÑñÇŸ™Ä,I2²CC�=�AÖ’Í
 ÖOñBÆB^xa¬œ‡`‰ôè£�ö‚…aD ƒ#”.Rpà¼6}^‡7–Äã¶µ‡S�§�AÖîIÙ¬  øZ^¯AíÚµM;x%a]–­N?ýtëÊmk�qüÛ.¤àÀ–K”z‡¤YNpŽG/—¨7dˆ† ƒ<'¢šç³l«�OPƒãfÏòãL'¼WÅ�ÐqK–,·jg¥¾ÀÚÀ}hVÊÕLá¨ÅÐH+ªV/ÿëÒ¥K`ù…)#Èß1�A�E�IÖ‘§ qmpþÒsS
÷Ì3­ÞžIþ†ÆÊî!e Ò|‚Ÿ‚(MS|ŠW¥Jž§SL™�Š –þÛµkwèO±úbà\²ÈJŸ ¶* �pÏÃÀX–…±P	.-Ï9ç“ý«8Â“±:ÃPˆKÑƒ3©„àx	J É_0Žà¦¸dˆÁdd’ud£ WwpÀàéª	š®�+ájK¬�üA žÂzöì+S�L-Uàþùç›ÌÎRË€O¹Û§†WäF-Èƒ•dÈ"È$ëÜ°Ú¨ %@{Nía°b°wÙN‹ŠÁ9¬XIþ Ð¨Q#[ú­qª:tˆõò´1P)FìÖ­\	v�%F��I�MV‘�
 îböœÚÃkè¸Óßÿþ÷Ø¸ï²­1ûì×¯_l<£‰m2yá¨Vß¾}MnoK&YÆànùâ‹/&‚ d	dŠ† “ ›¬"Û €¬ÝøƒæåkM{XÍš5UŸ>}L£3ž!¸-¬W¯^†±ÍO`„yÂ	'ø™E,ÓÆÞ?=.þÚô�%�)Ùä995H#Ð(¶) Og÷°nß¾}  †93( õë×s­*Ûa‡¦.»ì2^H’Vƒß‹n¸�·`f°=°}ˆ>np#^swR�)§N › £¬!Û hXÅ¼ÐÅRMî­öÂàÐ°êÕ««+¯¼òÐŸø=°ï|Þy¸
œN9åÚcd°1°ôOo¢2Å` ²	2Ê²IÀÒ
î`ö¤SO=•Çßþ„ÐE]¤ ¸Hé!€sÿ·Ýv›Â�á¤ð �/_>uóÀ›Mfhá)tHKÏ–W]uUHK—½bÁ%0d‹AFY³`“p¤ ÛÊ«Ê–-ËýÀ\ ‚WÀ;ï¼“‚+l’ù	3£“N:)™G7 ŽiqŒ«œøn¨DöeS @uë­·ªªU«ÚWø J[ÈAFAVYA6) '	¢žËÿ0Îâ~wîý‚‹[¹ccòë1Ç£n¹åî‹š€•¥8GumÒÀ¾wïÞÜÞòÀ²2FC�Q'iâ„&Ø ~–µw3Âa­ÿ÷­›nºÉt+q"1Á
Ê}÷ÝÇ%æ·ýÔ©SÕÕW_­¶mÛâR†·hØóÿç?ÿÉk­=š²ÅÀ)R€¬²ân [ ¬IdÎ­rŸ;:¿þ^ºtiõÀ¨jÕªyGdèoÀŠS§NVzúü­Qþ2cÆ÷Ìú¬Y³¢\Mßê†eíÁƒ«*Uªø–GT†Œ�¬Ñd•û(¶( ­PÏ›?pi…ÁÕ�šv‹~pãÆ�Õc�=kÿÞÉ´2ÜÍâ˜)œ@øÃ'Ã¼yóÂYÀ�—
”÷Üs�:ñÄC^Òp2²FC�U�Y¡'[ XVÂßrB‚�<ƒ‘ôœuÖYêŽ;î 5TèS÷Þ{/ýÍkpÊVðìÙ³Õ%—\¢æÎ�›­"XŸïW\ázS´¾"U 2ÆÀñdd)`½k{N"–½çÓO?uHæìÝ»×¹îºëbšë¸ü.)92«4”1E@„¾#Yì¿ã¢î]íÑ£‡³}ûö@Û-
™AÖ@æhð…ÌÒîH’�ã$|—pBÀÅe¥³nÝº(ô­@ë€—ÿ’þ—$ÄÕó(‡AøóÍ7�¶33G`Îœ9Ž8ea¿õuï§¬rÌ4ïrˆ	Y™£Á2²+ÔdÃÀ±‚ çÚþ±Çkr>3Ô‘�ÂÁ�êÃƒæ¥‡€_¯^=5bÄ¯_‡<Å¯A!ðý÷ß»ýuÚ´iAe¹|ºvíª†Æ13Å–…Ñ$dŽ† ³´‘4iøv åó¼é¾ÙiÀ’z?�w»ÇÜõþw'*Í›7W/¿ü²jÕÊÓßTê`óÉ´�™¿êÙ³§’Õ™´Ò‰óÃ\p�zþùçÝëÂãŒCºuo×®�‚ìÑd—6’&�Xã¼Ú|á„Ë-åÊ•sæÏŸÿ‡%þ“<»wïvÄ[ #ÞÀbíÕ¶‡‰a�#³Ëä�ã�  {ŒÖ­[Ç²ofâÝaåˆÁŸ³iÓ¦@Ú+ê™@æ@öhÚ²‹g®„TédypŸpB ;vìèìÚµ+êý-�ú8pÀyöÙgñ�o¯¶°5¬{÷îÎŠ+Á˜™$�À‚¸çï1êÞ»Â…;ƒr`øKÊ�9�=ì!» ÃBKa_žÀZl^/ôà¢•Çÿ¼2ƒÓ›~ýú©_|Q5mÚÔüAKc-ZÔ½#A”U¹reKkíb/\¸�{þi4qÍš5ÕðáÃ]ÿ8óOÊ�9�=‚ìâ~¢¤DÁPNÞN¨eI‡vÞÿýÌ¨tLå,Z´È'8ŽØ$Äß«mÂ&‘œwÞyçuæ?áB`ñâÅNÛ¶m#Ùÿ‚x?äö:G¼#†«Q#TÈÈ M[B†…}¢-EÁ/¥çþ¿¸´u–/_¡.®ªìÙ³ÇÝ¨[·®®“[ŽåPì…B¸�Â‹ÀÏ?ÿLáï1ù‘±1á;'.}�‡~ØÙºukx8%ƒì�òj‹ƒ2Œ>–ˆd©�<°G8!À§�v÷µx‘`ðré¥—:%J”HØ^í–09ºã¼ñÆÎ/¿ü jÌ"U~úé'Gn¯¬¯ÉV�#×à:r<Î‘m°ÀòÍô{Q¨P!G¬ü�éÓ§§
=ŸKØT@iÚ2²Œ”$7K|Opo»í¶$š‹QÓA ‚“&MrÎ>ûl/Xží¦k×L‡Ã±�u¤t:  g±õtÜqÇÖ 4Ÿ~úi·v;vìpF�åÈÍx�åŸ©¾.—U9cÇŽuöïßPK1  dÐ†�e¤$€/å7„‚‹½é·Þz‹½0`vîÜé¼öÚkN—.]ž^m”í°#�<Òµ~ærÀ�$Åì°ìo`Y�±>'Ž°œ'Ÿ|Ò�r{(­ZµÊyôÑG]E Ì+yóæuÚ´iãˆã*góæÍ‡V�ßB 2ÈÀNêu=ï²‘pÒ!”•ïs„¾ìr%£ƒãA¤ì €c0ï½÷žsî¹ç:h¯¶
2ƒ¢Xç:rã!íC²Ó5RÊuåÊ•NûöíëGP^ÑG¼hýúõŽXÐ;ð!Vß�•M÷¾”,YÒÝ®€"¾eË¯*0Ìg ƒÆ?È2È4’!8:±Y8áK'Þÿx‘…Ï�Û$yì§Ïœ9Ó¹ï¾ûÜ�R<&l3¯öL7¬~ýúNÿþý�wß}—Ký&¢8ðÁÐ¹sçÀú„9fþ¦¶ Ø?~¼sÍ5×88=b0ãËx] °Àÿü?ÿùOgêÔ©´}
IÿÅ}*�Ešñ²,”ÇÃº,q¡ 6Z8!áË¡C‡&g@ðÈª€‚�ö/¾øBM˜0A‰v¬ÄRVÉ¾dÆÜÕ«WW²ªÄ`L‰—8UµjÕŒçÃýE`õêÕJ75nÜ83:˜:ÎoãŠçk¯½VÁïE²´víZ5eÊõå—_ª‰'*Ù^R¨C¦	nfá›¢N�:
ngÁ¢ (1ÄÍtVL/M®¼òJ÷nM2½$|Œ&NàÁÉ¿Áq°ds}¢¬ðâ>õÔSJ,ÓEáïYF@fW®ðÿñÇ.p�wÜß¾qãFµmÛ6%š³{ÏRÂq	œõà¾‚âÅ‹»ƒa“&M”ìí«F�¹ÿ#œd'kÖ¬q�üÈyê@* n®•¬T)¹;#ù‰ûl%F‹J®&vû7ú9ú»¿sû8ú¹XŠ{æ…ýý¸T©RJV•¬2¸Ü AWÉ¥O³ø¿ÿýO]~ùåJ%¼ÊòˆÞà!aaT à4á#áŽ‰ Á-v²$çÎúÅáïáC +P doÕeñK®dS‰¿µoß>÷Â`Fc@”ý5%>·ÝO”p„¯â,Ñ_�ewÐËõ¿„ùñ„ÿÿû_WøûÕ‡   ØnØ°AÉ•±î'ú8~ƒ"�³†þ-÷É»J-ú8V³Àèëâ§Â�ê3M�-%Æ«J¶Š¼r/�p|À+RÐažnvƒ.ÌÁüÊË§çZn…
T­Zµ²T<f›*²�©ÄI‰Ë©¦ÁçìG òª«®RA	1U·ß~»ºþúëSZö7E+“PRÁ5kÖ4}Œñ,G ²2IN±xÕ2²-óûE^¹jÂÂè¢°¦”¹¢W¹±LÍ™Dˆ€]¬^µÚ½oâí·ß¤à˜mÿç?ÿq}á§²çH!™‰ÕälÝh*™VS'ðà0* ˜Ú{ZºÔ®]Û]&-fHˆ@Ê`ûG,éUPÂËìwÜq‡ºé¦›VHDÀ dB&i2-tËÖaT <¯¡ÃþÀHD€Øƒ öÂa´ûêk¯Rhüýë_îÒ¿Û$Of_ “lK<e[6Ð›€7µ™Ø_ƒ•,‰;ÀÌÿê«¯V¯¿‡hþfdr^^Ý|óÍŠÂß¼™ƒred“† ÛB¥�†M(. y®¥”.]Ú=þ¥šÁD€„ œò0`€zñÅ)fþr±gþ� ÍLr€¿È&A¶AÆ…†Â¦ ÀRÒÓºO<¾Ñ 04Ý‡!‰À²?ÎG%ü1Û‡ðÇ¾¿Árlâ‚3„$‰ !›4ÙæyÂMó|ÆƒÃ¨ ”ôª%4-÷�ˆ /p†sã�7ª—_~9�BBøÃÀÇý°@"A" ™Ù¤!È6*  Õ�0Ï··FD!"V üqÎ_n©¤ˆ˜íc¿.~áð‡D²�€�l‚l• Û
@]¯†Ãþž�–å•Ãˆ ð¸¿8p 3fŒ�¹üž4fþpð£?
ÿßqá·à€l28nê)ã‚.u˜ ”ÅsV–ô ta~DÀ¸zÆ²?|£ApìƒK}àâ>õID ›@6œ€Œ�ÜMAlìW÷j@\˜�²HD€„ø»‡ðæ™g)„ÿ7Ü D› @g&: ›.'ƒŒ�[˜€rL/�áG·Â‘ˆ ¸å–[n1¹5#…Æž?ü
ÀÅ/gþ�”‰d È&È(AÆAÖ…‚Â¤ À:ÒSºÃÝ"÷ùBÑoX"à"�³ì?tèÐÀ¹âŠ+Ôý÷ßOáâÌÈÈ&—À�q¡9	�×¤bÅ�êäéJ©jÕª<ßPc0" C Âgî±ç¯¹]—”Q8–ý!ü±ç�›%ID L`e
2JC�qÚeM›àYîÿg¬Ý™H�={ö¸Gïž|òÉ´ÒIæáþýû«‡zˆÂ?Ð7Pdd\h€0mTòj),¯ÔäÛ^1Œ‚ÀîÝ»Ý™�Ëþ¸HèÁ¤ð¤…™Iª@FlS{ÊºTóNå¹°( y¤ðž X¤‚Ÿ!DÀ�½{÷º·ì=üðÃêÀ�†O¥íâ‹/VÈ¯D	Ï[ÂÓË„O� `h¨Y™—u
‹€eÏó}EŠQåÊ…Æx2ëÇ� €ðÇž?fâAìù£~ýúõS�=ö˜Éñª á`~Dà/@FAVi²Îs»[ó|Æ‚CQ©ÎEVôª@5¸mÉ+	†"�"XöÇ±» gþ]t‘›Ÿ�s•kÅÇˆ@f€Œ2P  ë óöe6÷äSË
 ŽFx^T¡BU¸páäkÈ'ˆ H�ýû÷«»ï¾ÛõµÔ²ÿyç�§žxâ	.û§Õr|8h £ «4Yçyä]ó|Æ‚Ã¢ ”•yžë©^½º‚ßo Á! kÌü±ì”ðïÕ«—2d�~×ÌÌ)C@FAVi²2/ë–- Ü“ìy�—�V•u0Y "% ðqÃ€_~5­õZ  @ IDATù%�ª�}öÙêñÇW%Kz.RfBRAÀ@VAÖAæe�Â²€·Ýó6�R¥B�WÖŒ A  �?ûP ‚þXöúé§)üƒh`æá²
².n˜V <Ëb ªoÊ„‰@œ€À‡Ãìûcÿ?ÂÌN…Ê”ñ¼$ˆ¢0"�²
².3Ú°¬ x‚ <�VŸäÃDÀïƒŸý;ï¼3Pá�[)ü�šˆ‘BŽ dd–†<ežæÙŒ‡Eð4ˆÀ�_T 2ÖæLˆäŠ fû<ð€;óß·/˜JÝºusoäû�k“ðG@_6¸¥ÒSæUí°( žû!¸øƒ^À‚êÌ'Ž`æÿè£�º3XþA]ºtQO=õ”*_¾|Ù1"�U—UyÊ¼@
*™„A@<}|Â·rÑ¢EƒÂ„ù�X! kÿÁƒ»Â?¨™ÿgœ¡FŽirf:VmÁÊÚ� d•Á} �yY—¿Y/€€ ƒÏk€óçÏo¢QÙßsX"�`|wûí·+xû‚:vìè.ûW¬èéü3ˆ¢0"�q0û‡ÌÒdž§á»æùŒ‡A€wÏ * ik&Bþ‚ üìßrË-*ÈeÿÑ£G+\šB"QDÀP€ÌËºg»0( Ð‚<Ý"æË—�+ Q|SX§¬"0lØ0uë­·ª]»vRŽN�:)XûWªäyñg ea&DÀ/  @fi2/ë+ Y/€€ -ÈS  {*¼Lˆ@0¾»á†[ö?é¤“Ü=ÎüsZ€ŸQE ²
2KC�y\ *yºÆ±ŠÃÃb…¦IL,@`èÐ¡ê¦›n
Lø·oß^=ÿüó\ö· o°ˆé# Yep¬2O»L�~i¼SÃ
 €ðÔ„`UiàXÁ»¦%D@>\8PíÜ¹34N8áwÙßà‚”@ÊÃLˆ€ß@VœZƒÌóœøú]N¤†i5ü"{* ¸b‘+ AtæeàgÿÚk¯Lø·k×N�3FÕ©S'Ê°²nDà@V\]™çyÿÍõéŸ0( Ú ƒýŸàa²D àÌý�7Þ¨vìØH…Ú´iãÎükÔ¨H~Ì„„	™Š€0l­ „©qY"`Ø0`@`Âÿ¸ãŽsgþµjÕ²	&–•d® ˜C	�	ž+~•ÍscL"#pæþšk®QÛ·o¤ÖÇ¼kðGáÜÌ$¤È,È<­· ¿«ç)xýÎü`úX
ñ,‡Á™Ê€ŠÊlˆ€=¼ôÒKêê«¯V[·n¤Ð-[¶T#FŒPõêÕ$?fBÂŠ€�Ì‚ÌƒìË*y
Þ€J<ïN¤`@-Ál"ƒÀ/¼ ®¼òÊÀ„‹-V(ü#Ó…X‘40�Y�yT ­røáYÇ)�®ÀG‰@°¼öÚkî²ÿæÍ›É3/¬_¿~ ù1"ve–Vöù]Ï0Bº{a¦ßX1}"z^yåwæ¿qãÆ@ÊÚ¬Y35jÔ(Õ Aƒ@òc&DÀdd^Ög¶ž‚7  Qn6³‰.o¾ù¦»ç”ð?úè£Ý=
ÿèö)Ö,5· ².Ã°à)ü?½ ¦Ö	ùT|xç�wÔ¥—^ªÖ¯_H¥�:ê(×Ú¿qãÆ�äÇLˆ€MÊ,­ìó»ÎY×@¤‚¿;^ýåD!"�o¿ý¶ºä’KþððGáŸ[kð7" BM/³ ó².ØÂ   ¨ ð­!) 0nÜ8uùå—«µk×¦ðtò�4iÒÄ]ö§ðO;> È¾¬R í
À�YÇ)«�ÄÌ‰@n@øcæ¿zõêÜ‚3þ¬üáU°yóæO›	�(!` ³¸p°Á¹¥žÏº‚À| .»ì2µjÕª@òÃŒŸÂ?¨™I°e F€Ú 0#ÐeX"`†ÀG}äÎüW¬Xaö@š±p›Îù·jÕ*Í”ø8ˆ2‹+ »Â>ùô\ãß½{w<zkI4|üñÇ®ð_¾|¹&ff‚qÄçü)ü3ƒ'S‰22²/«† H÷ý^(ìÜ¹Ó+˜aD |öÙgªÿþjéÒ¥�Ôn}Ÿ{î9…ÛýHD€˜#` ³ ó²>³ƒ @ð<±k×.sä“Dÿ>}ú&ü±ì�=
ÿv&VÉwdd a�°§ mÊÀªÒ÷FeD Lœ8QõíÛW-Y²$�ìëÖ­ëõ£ðnf1 «V  ó û²JaX ž6 ;vìPŽãé* « 2s"à_~ù¥+ü-ZäWH·ZµjêÿûŸjÛ¶í~ç?D€˜! Y™¥!È<* ÂÞƒœ¯M›6q !:ˆ*þXöÿé§Ÿ©bíÚµÕÈ‘#UûöíÉ�™�("€ È,iåžæùŒ‡a ÆÛ½j³}ûvµo_Ö&½ŠÈ0"�Q¦L™âÎü.\˜Ñt%V¥J5tèPÕ¡C‡DQø; @VAfi<�ß5Ïg$8
 öB¶zÕ€«ðJ‚aDÀ ü{÷î­æÏŸH™±ì?bÄÕ¥K—@òc&D Ê@VLX!ó û²JaQ ¶x¡°wï^£
¯$F¬@`Ú´iîÌ?(á_µjUwÏ¿sçÎVàÃB�°# @È,Aæe]ƒ ,ƒhW ŽUhðf073fÌpgþóæÍ¤ +VTÏ>û,gþ� ÍLâ‚ d•á
 · ¤S@ò\Ø³g�‰Ue\úëA¦OŸî
ÿ¹sçR»J•*¹î}¹ìÜÌ$Fà d–†B±†- àä© @£ÚºÕs‘@ƒ5ƒ‰@xøî»ïÜeÿ9sæRÈråÊ©'Ÿ|RuíÚ5�ü˜	ˆ�U+Öž2/(¼Â°€º®÷ª0ÀÜ¸q£W†+€ð‡Áß¬Y³)?„?.ö9ãŒ3É�™�¸! Ye  xÊ¼ 0Ë
€ç¡Iœ«¤T—`>A!€ÿÅ_¬ AeÊ”QO<ñ…`3�Ø" Yeà¹ÖSæ^XV 6K…á)¡B²y3¢�ˆ@4À^?œü|ûí·�T¨téÒê©§žRÝ»w$?fBâŠ€�¬‚¬…@K(pn<hCž#p àav¾! +ÿ‹.ºHÁð/ÂÌŸÂ?¤™P&«Õ�u¡X“ài6¹nÝ:ö-"`=?üðƒ;óJø—,YR2D�{î¹ÖcÇ
0�U�uT iÌòÝóÎßåË—›ì«’$¿�p! á�=ÿ¯¿þ:�‚/^ÜuïÛ£G�@òc&D î`ï²JC�u�yY§0­ lóBcÅŠ&g+½’`È,p…?ÜüA%J”P�>ú¨:ÿüóƒÈŽy" àü?d•† ë¸pHXY}ÈÿùŠËhðXøƒàBŸ¾}ûª „‘"EÜsþXm "�QAÖynyUâ°¬ À%¢§ ïJë×‡âèdPmÃ|"€ÀÏ?ÿìÎü¿øâ‹@jS´hQ5xð`uá…’3!Dàw £ «4Y—u7À(cX ‹X…%¢mÛ¶©Õ«=u„D�òw"�/^¨ðÇÌËþ—^ziVêËL‰@Ü€Œ‚¬Òdd^Ö),
 €Xé…´*¨$"`K–,q=üMœ81�âæÿ~ýú’3!Dà¯@F¬ xÊº¿¦êß/aR `9á©XWú‡S&†,]ºÔ=ê¤ðøá‡UÿþýKÈhD€ø�€�Œ‚ŒÓZ	úQ¶ÜÒ›°=·BæüëJÇqrþå'Ë–-S˜…öÙg�”­@�êþûïW—]vY ù1"@rG ²Éà d€\ ÄáIÏ+ÿ-Z¤öîÝ›Ë£ü‰d¼ü°¼ÿä“O)–ý!ü¯¼òÊ@òc&D€$F ²	2JC�qZGš42¦ XøyúGÆ¾ªÁþJÆÀaBDÀ�•+WºKðãÇ�7}$­xùóçWƒR×^{­Ê“'OZiña"@ÒG ²	2JC�q¡±f“ ÿÈžK#<	 éZÎ
«V­rgþ|ðA ù,XÐþ$?fBˆ€Ã �qž÷ÞèsÊ\Œ0) ¿Hµ~òª X‘ˆ@XÀK'?}ôQ E‚ðÿïÿ«n¼ñFuØaaz}©>3!¡E ²Éà dd]((l#È/Tàf.UID ¬Y³Æ]öjæ�eÿ{ï½W]wÝu\öC`ˆÀ!@6AFi(T,l
ÀbÏS;¢/ M÷bp ¬]»ÖþãÆ�$?Xûÿç?ÿáž h3"�<²	²mqò)û÷DØ £“ û÷‡Â‹¢­Â”C� ®û¼âŠ+ÔØ±c)gÞ¼yÕ�wÞ©n¸áÎüAœ™�ä€L²í j6`™”Éó–¤yóæ©­[=O&×rŒM’@ ËþpµûÆo$ñTêQ±ìÿïÿ[ýãÿP‡~xê	ñI"@|C 2	²IC�m�q¡¡°) Ï“ ˜}Ñ04ý'VÙ°aƒ;óë­·©7þm·Ý¦n¾ùf…U  áD 2	²IC�m�q¡¡°) XÛŸå…4­¹sçzEaÈ8›6mRW]u•zóÍ73žvn	Bàß~ûí®@áŸBü�„È$ƒ•iÈ¶Pí_‡M€Ÿßo½šuß¾}jÖ,OÁëq†�¤Ø¼y³;óå•W’~6•òåËçîùcßßID€„È$È&A¶…Ê—}Ø à·Px'¾$"Ü±þË/ž‡=Êß‰@R@øÃáNPÂ?gÙKÿœù'ÕTŒL²‚ dd’† Ó ÛBEaT Bk¼P2\nñJ‚aD@‹ –ô®¹æ5fÌmÜLD€ð¿å–[Ü¥
ÿL Ê4ˆ€ÿnKC¦-ö¿4ÉåF`•Tœ�pãÚòe¡¹O!a9`/x©ápgôèÑ�Tþü¯¿þzõÏþ“Ëþ� ÎLˆ@f€,‚LÒ�V®iž÷%8Œ
 ®û›ãU[\º0{Îl¯(#)#€e\²3bÄˆ”ÓHæA¸ô…¥?ýàØ‰{€,2¸¤2-tWÙ†õlÑL¯æÇžËÌ™3UÏž=½¢1,dìÚµKmÜ¸Q­_¿ÞeZ0ÜgÂ‘îÓÆÒ7ßpÕm©R¥T™2eT¹råÜÏbÅŠùîÿ~ûöí®Ÿý‘#G‚fþ°1ø×¿þ¥àí�d/è¿è?8.Š#aøÄéü†«bs˜¡CÑ+^¼¸ÛÇË–-«Àèë…¶€˜–²ÈÀ&ÍS¦eº°* 8ç·K¸P"`` ÁÁA3BÙý/ÄòåËÕ�?þ¨¾ÿþ{—gÏžíŠ¸0ƒâÎ�ž¶ž®"P´hQÁ�Á²N�:ªI“&êÈ#�T�5rÿGx¦ZüÀ�ÕsÏ=—©$=Ó�ðÇJ.÷Á%?$»Ø½{·ëýcÑœ9sÜ>ŽþŽí#ôq0¿¡ÝÑ¿Ñ�¡ð6lØP5nÜØå¨êÕ«sKÈÀ,‡A¡ý5Y¦�¤IÃ—à°^$^Uj;A¸n¢ZW«VM}õÕWªjUD%…Ìð§M›¦¾øâ5aÂ÷â&(93ŸL–3¦5j¨6mÚ¨O<Q{ì±ªJ•*)g�²cþé§ŸN9�dÄ²?l ü©Ä&ƒ\vãâˆ)S¦¨/¿üRMš4ÉU p#d¦	ý£råÊ®’Û®];nÙ²¥*Q¢D¦³bzi €ñc�Æ Öÿí…—§‘U¬…ÏS\®Ž3“¹²,£9Ÿ|ò‰¬º‘²‰€ÌôYsî»ï>ç„Npd6“k{%jÇLü.3i§~ýúNÿþý�wß}×‘e×¤ ‘™¿sõÕWVn”WN8¢t$UNFÎèãÇ�wÛLfçŽœÖ¬¯ä¼…
rDpÄHÔ™:uª#+Ùƒ¹þÈ È¢œvJð	Y™FJ�{$®'°2{úCcðŸà€ðzï½÷œsÏ=×‘½KÏvÒµc&ÃÅ†À9æ˜cœÇ{Ìí\ê!3ñ@Ë/	9²ý¡-#d±Uq†î*¶²Thñz'J–,étíÚÕyíµ×œ-[¶d¤˜çäÕVÃ ËHI"ÐUâÃÛOB€ÿþ÷¿;²¼ó.lõ!¸^ýu§K—.f%^í“í0±päÈ5�¹‚${¸ŽìÁ:£Ã*…ìçZþV­Zå<úè£ÎÑGí`µ&Ûý8QþPveùÙ‘Ó*ŽÓ†¼•²2(Qûü2²Œ”$Øÿ_&œ`ðbm£.—½ª8pÀ‘=Oçì³ÏvÄ‚9a›xµW¶ÂÄ°ÊyüñÇÿ°5€™¿½sd¯5°ºôéÓ‡uöº°6g1LuF�å
þlõÕTóíÔ©“#×SsB¤måÌE€ì�Ò´dXB[6	#%@ ¢?N0f bŒ“¹eJ¹"0þ|G®Àu°ôèÕaCAGnòs…ðM7ÝèìÂŸËµ¹v¯Püøé§Ÿ:'Ÿ|r }"ÓïÆÃ.¸À™>}z(0�z! {VA!ÃèÜC@H…’‡
,ÏÝÿýQïgY«Ÿqqž}öY§nÝº	ÛÀ«}Â#E+îd¬Î}ûöýÃêCÖ”ÿÌâäÞGŽàe¬½³Ýïå4ŒóðÃ;rñ/õå™C ²Ç`‹2Œ”"gËs„¾œgžy¦#·0e®U™’‹À¢E‹œóÏ??Ðýq¯v¶5ÂŸq8_ªÏ>ûÌÁª�­}KWîSO=Õ‘[êÂ	¾å¥‚Ì�ìÑ´dd)EêÉsžv rÜYºt©åÝ)\Åÿàƒœ¦M›ê:7Ã=Sé·NïÞ½¹ì®®í–ÆŸ=ô�#¾$"ß‡kÖ¬é¼ôÒKlxH™C 2²ï¹CvA†‘RD {'ï'grßÿýÌµlŒSÂ �%ÿÒ¥K'ÄÛ«-ö{?=ï¼óq{ãÞÎª£M.¿ür“¥ÛÈ¼â^Ø=Cß™ë“�9þ  »B½ÿÆË€³ß~4¿þí¿\¾Àå,<Ï‘ÒC .-ïºë.uÕUW¹þúÓK-ÞOŸsÎ9jÈ�!®k×x#®ÚÃk›lÉ¨§žzÊ½w"\¥ó¯4p¹}ç�wºn§q÷)} süÿCvyû‚N¿(‘Oád©á~á„yÇŽá!¥† Î¥‹à7Ñh¶�WûÄ)Ç$Å5ljÁ§|CàçŸvpT.N}1·ºâ” �N§×Í k srÃ÷�ß ³ »Hi" gÿ?	'\üc;ß|óMz­Ó§a vñÅ'ÄÖw†ý±OvëÖ�ƒkß£~øÁ=ùÁþúk…A*©©wTÈÈM‚Ì‚ì
5…} à­ö¼JQÎWs …n†Ûïn¼áÆÀî½O¡ˆÖ<Ò½{w÷"!\RD
.Tâƒ�ãÃ!M".¼•¸£v¯ä>äg~5D Ëÿ�9‚Ì‚ì
5Ù  à(Å':Å‘‡ÉžŒ.™Ø„Ë1uÇw¨gž}&6uö«¢²ì¯†¦Ê—/ïWL7pC[¿~ýÜÛûRx<Ò�¼ùæ›J.ÀR˜�ÌÀ¾?d�AfAv‘2€@CIcƒpÂe¹ØÁ>É�xÀ�/q/L–¸¿å`ƒ³ÀrE¬èŒ¸Òàœvìû?n¥„Ã/’�1�59ï‚OÈ*È¬Ð“+  q±ð,|ID°ð�<yr¢`þ~ÐþÿóŸÿ(¹Ìâ�_ù5YN9åwæ_®\¹de|@¿¾ûî»ÕÛo¿íc.ÑH+WÏ=÷\4*@- c k4YµX'Á¶( ;-­t‡`=.À†µsæÌq�‰ñ_X‹hE¹Ú·o¯äªXU©R%+Ê§B¾üòËî1Ì8Õ9Õºb+G?ÿüóT“ˆÍs�-�1Y™EÊ �%-œ©L¸üR½zug‘¸°%åŽÀ†¸õÂ�a‰ûW68N¶dÉ’ÜAæ¯YE`ÆŒÆ�œ¶â§¾?#\},3Û¬¶]Ø3‡l1è[�Q�UV�-+  ó[áÙ^¨Š{Füx $îO•x°òˆÁ Xö—û×•º¨9Ÿ­n¿ýv…q€”¢8¹Û&X åŽÀ”)SLúdd•d“°^ýX‡ªø±×E‰e¸\|ÂeÑ4[¾AƒîQ?1J3%>îâÆZñýOÙçŸ^aû„”;†}2
²Ê
²I  	ïñBg4qü‡ô;pÿyÏ=÷(îûÿŽI*ßÄƒš’eÀTå3>#0}Út%'[h”Îp~ï½÷š¹¥‘‹��B¦¸œ‡l‚Œ²†lS °´ò£ºrLCMœ8Ñ+JìÂF�ezv5vØ$Sa±¡pOO8I&YÆM,[?ðàjÕªUi¦ÄÇçÍ›Ç•Â\ºd
d‹† ›¬YþG]lS 6I™=¥»’¨wÞyGÉÍv¨_ì	û¡C‡�=™ N@¸Lš)43“–fÇŽ›™Ä˜Škã› Ò¯@–@¦@¶h²	2Ê²M °Øä÷´TùòË/ÕâÅ‹7ö4räHõã�ž‹&±Ç( 0<ýôÓ
«¤ì# OvƒV¸ñŽ”Ö¬Yãöq�—™Cž
d	dŠ† “¬3@³Q˜"@{:Z¹r¥‚Ñ[Ü	
 )³Ìœ9S�=:³‰2µ”7nœÉÞlJiÇù¡×_]É¥7q†à·ºC–@¦h2	²É*²QÀÔkœÊÐ\á,îžîþïÿþ�Fk^%Å0ô/8‚Q ){ìÞ½Ûõb÷÷Ü�À
Ž»Æ} }²Ä È$ë–mT ÐßßÞŽ/‰hÒ¤IêÛo­²ÇHT•”~Ç2Þ˜1cRz–éøþûï¹ï¬‡É×°Ç Á¯¿õÖ[±ß>„�,Ñdd’ud« gÓ½Ð–Ë@b=@ÃheîÜ¹^1,0#xñÅf¡¤à þ/½ô’ÚµkWð™Ç$ÇÕ«W»Æo1©n®Õ„q)d‰† ‹<�ÔižÏZ°­
 ,~ÞÕ¡öî»ïÆòìûÞ½{öðpu%É?¦N�ª¾þúkÿ2`Ê	øé§ŸÔøñã†3 3`‰«ÿÔ2Ä€	2É:²U ÐØsYã…8fÀ_}õ•W”H†¡ÞN$Ø¶m›‚)x üyîßÜgÏžÛmÈƒUTÈ k›€ùüD¯W ž­`7Ÿ áý�ä?ÀŠ )8`˜EÅ+¼±Åòá‡“Yˆr�Ì€ì€Ñdd‘•d³ O?o
{®sc	[q!œ‹¦S”àZžÓâllÒ¿ç4þ|n½ü‡ïß äìƒû^Ž 3€Ì0Xþ‡ì�²ÖëœÍ
 úÃaOÿŒë×¯w�q rháÂ…Š^¼‚ki8 ™<yrp2'Wø¯]»–H„€\}­°'ÂÑ?ÈAö@YK¶+ «ù×tè¿öÚkjãÆ�ºh‘‡0â’t°MùÉ'Ÿ(^£æØ›58—\�"ž”\Ox‘A²2Ã€	2ÈZ²] ð¯{nx.çXÛˆ‡ËÑEÄÿïX’^±b…ÿ1W¹¥‡ºà;ŒŠöÃƒ/˜9nCæ@öXMQP ¾“ðtÔ£!œŽzÆþÜ–êÂðöÁéÒ?ü†¢D¾Øâ2pËy‚®à´iÓbáù2²ÂÀ»$dd�Õ`¿´À+ÂøLHðæ4eŠu®šÖ'· ì‹.X° · þæ#4¨ øð!ICÁåEL‡ ÐW.Z´( Ü²—d„�ç?#™“½Z˜ç µÅ9OSìcá×(/�ãòÞŠfÞù3ŽiHþ#€ :¸òç?ç€ã€À>ÊÙ a0†BÖDâldT ˜cÀ“¢îÛ³ºFõì¾â8 “oðº	c€ŽÃ,Ô_SKØÃÖ%Ê„kÓ!#²&ÇP¢¢  Í`�±
_|[c'ª„€(¯p„¹Ý`ÈÓþ¶¶ZÐÇIÙA ¶.Q&ÈÈAÆXoü—SÇ() POµƒFŽªÏFçtëà?a€ipn8ø‚E(G,Í._¾<B5²«*Ž¸g$Š™`89„Œ‰ÌRH” ôËÂžW7a™\D�p=nÞºÂÔ†¸�øûÛ"¸œ…·/ú‹±Wê0¾ŒêI*ÈjÈÈ˜ÈPÔ€YÒ2ZÏL£F�Šœ%1€-[¶D¦cÚV&âïo«mß¾�—ü…Ø3u¬pEq Šd‚A¶@ÆD†¢¦ àxÆóÂžG§OŸ¹ËD  `€$eÌŒhà/öØ08Ÿío!bœ:Æ—(* ¸X
2ACF²E“Fè‚£¦  `hižŽ�`(÷ÜsÏEJ`âöª¨.Ï…î­É¥@8@üs&ƒ?AÉ�ÛÍž„/í¤0nFMƒRY``<™¢]]Nä€ˆ¢€»YŸö¼¡	¾­n{
¸9RÏ#HRv€@üýÅÂ‡
€¿{¥E 2ÀàžÈÈ”ÈÝûE }xœð|IDLžxâ‰ÈìÛæÉ“G~øá‰ªËß}F€øû°$Øa‡)àLÊQëã°Ù�0XÕ€,y/;¨û›kT \Ô0ZÜ>Ž;VÍŠpŽùóç·¢¬Q,dÞ¼yU�¢XµÐÔ)_¾|®šÅ° èçQ!Œý†îá!K<O—ÙŠIT ´Çÿ	Ïñj,i6,Ç·ðb.\Ø«ºó'âï#À’tÁ‚U”�¿he>uà�~Â‘]Œý{ÿ�!�%‘¤(+ péôœ®Õ&Ož¬^}õU]´Ð‡ãÅ,Q¢DèËÕbp$þþ¶nÑ¢E##€üEÊŸÔË”)™UFŒùû2DëÐ �PF‰² À¡¹yÞ`£¢§Ÿ~ÚúU * Ù}¿¨ ø�±bÅ¨ øsÂJ—.	 ³Œù¥�‘�ý£¡£® ¬�:>+ì ²‰èÛo¿5u™(‰¬ÿ€råÊe½q- –ÿ‰¿¿­� bì/Æ^©W¨P!v.pù‹1_C���!‘¥¨+ h88šëÕ‚Øzê©§ÔªU¸çÁ^ªZµª½…·¼ä˜•,YÒòZ„»øXe©U«V¸áÒ•/_Þz#LŒñëöþ!3 ;"MqP °ó”®gÏž­FŒ¡‹êðzõêEb‰.Ô '(\ƒˆ}l2õ3Ž¹Ö¨Q#SÉ1�$¨Y³f’O„/:ÆxŒõ™Ù½ÿœúÇA@]_žšSéDŸÏ<óŒúé§Ÿ‡þ÷ÚµkÓ=K­tÄGd)çxe[·nÝxU8$µÅc(¹6ÆvŒñY™yŠ‹°^Zòqá_¼Zw�2Ä+J¨Ã*W®¬*Uªê2F±p°¿ `
¦e6l¨Š/LfÌå7`�	†Í„±c¼† # + 3"OqQ Ð�ï
ÃŸ³'=ÿüóê›o¾ñŒÖ@ŒGuTX‹ÙrÁ0­Q£F‘­_˜*vä‘G*ìE“‚E Š—Í“ŒéÛ2²"' ~œ‡	{:Ìß¸q£»
 ßî¶öH)ˆ‚o5_Fa4xä’Ï‘ÊVò˜eâ‰Ö­[+¬ØHË1ûÇØ®!ÈÈÈŠXPœ 4èÛÂïëZN"Þyç]´P†üñ®Ç´P.¢…j×®�µƒ£mM‚í–¶mÛÚVl«Ë#mÚ´±öŒå†ÎÞ  #bCqS vIËöÔðpïø}÷Ýg¢1†®£4iÒ„G¥l¤N8!À™•Í³Q[[.-Z´°±èîŽ±cº†   #bCqS Ð°“„µ¾¿þúkS‹ÑPu¸ëìÚµk¨ÊåÂàXZ«V­¢\ÅÐÕv.¶[¤‡T�{ì±ÊV#°úÇXn@�	�±¢8* ¸Ûùá•º–~ôÑGM<Fé’	4WvvéÒ…Û ¡Ž-[Ç€ Êx6p	|Úi§e<]&øW°Âuê©§Zé Þþ0†dddC¬(Ž
 7<i/
Z½zµzä‘GLî‹U§iÙ²%gH´Œ.O?ýô rbF J®­Fi®K˜ÿ‡çÅÎ�;‡¹ˆ¹–mÿþýîØ�1Ü€ <oŽ5HÃÊ(qU ÐXðôô½®Õ`<‚{£m"¸¤=ãŒ3l*²•eÅÑ¨Ž;ZYvÛ}ôÑGsë%€FÄvbõêÕÈ)³Y`Ì64üƒÐzŠÍléÂ“Zœ \òp¿ð^¯æØ½{·4h�Z³f�W´Ð…�sÎ9VŸÛ ¹è¬³ÎReË–Í%„?ù�@�T÷îÝ­µL÷ŸL¤_¨P!Õ­[·L$h«1fcìÖÆ~È È‚XRœ 48®zü@×òÓ¦MSC‡ÕEU8¥Î<óÌP•)J…�et�=¢T%ëêŽ�Hþ €ã–°q±�0VcÌ6 Œý‘¾îW‡AÜ€=Ð½Âku@¡SM�:U-Tá½zõ¢ÛTŸZäì³Ï¦ðñ	[Ód+V¬¨.¸àÓèŒ—ðýß¯_?ë®ÿÅm8YÃ˜�±2€sþ)õÇýÏž|òÉ';Û¶m“›$í }ûö9={öô¬“®ÎÿkŸ�{Ñ�ï¾ûÎŽNñRŠowGÕØÇ5cW²ïq‡œíÛ·[Õ{06cŒ6¬+ÆüØSÜW r: Ö÷¿Éù'ÑçÇl•o€¼yóª¨R¥J%ªO�/¼P5mÚ4…'ùH¦€†+¯¼2ÓÉÆ:=ØW\}õÕªH‘"Vá€3ÿ£c½]{º•b”ô8Gß)ì©AÊ�{Ž8–°F3?ØŽ�žuÒÕ™á¿÷‰zõê9,°¦ýãPÐµk×:rô•}\3v™¾Çb[áìÚµËª®ƒ1c³A1Æc¬'�? �Wþ)¬íDr4Æ×’Ö¼ ?üðƒ#—ÕhëeR÷¸Ç‘KE¬i÷8ô¥—^rdßš}Ü`üòz‡K”(á|õÕWVuŒÅ“½êuHØHùŽ±žDþ‚@Cùe‰°gg0Îƒ>hÕKòä“O:(·®nOÜö�:ur¶lÙbU»Ç¥°räËéÓ§û·fìÒ½ßt8`U·ÁXl8¶-•úcŒ'�„\&!û…=ÙWw¾øâk^”;v8âÒÓ³Nº:Ç9\îX°ª½­é˜,(¶fj×®Í>®»½ÇÇwœ³jÕª¶ˆÿIaÆXœ¨N‡üŽ1c;‰x"PPBßÖvªO<ÑY¿~½ÿ½<C9ˆolZL´knmÿÐCe¨˜ŒŸŒ=Ú#6í»›[Çù7ñêLœ8ÑÏ¦ÉxÚ{1¶ÆtŒí$" E ™ÄÐnHçÖ[oµjÉì…^à ™¤ ÞÐ¬;•ñÑÖ’qôõšk®1
Œ'ïB¾|ùÛ\lS`ìÅlÀË1¦“ˆ€1—JÌ_„=;˜\Hâ¼÷Þ{–�ŽƒS·Ýv›g�tuŽS¸xTt-ZdMû² Ž³aÃ†df†±.¹ägïÞ½VuŒ¹{Æ"ŒáËID )
Kì×„µ�¬yóæ’ØBp˜qÞyçiëeR÷(Ç�ÃŸO>ùÄ–fe9A`Ö¬YNƒØÇ5ã—¸ûuV®\yráÿŠ±c®áØƒ1c9‰$�@}yb�°¶³ÁË�¶Ð²eËœÖ­[këeR÷(Æ)\¸°3fÌ[š“åÌ�÷ßß‘ËšØÇŒ_õë×wæÌ™“ráý	cl§=0vc'�”è)OÂ_´ç@‚}´aÃ†…÷ÍÉ¥dsçÎuš5kæY/]½£Ž¥Eñ'žbüÉ6^{õ5S+ñX½uêÔ±òTÆXŒµãÆlŒÝ$"�ùäég„µ�³Û,iq2 I“&Úº™Ô?
qä
Tç‰'ž°MÎ±¼àd@éÒ¥ÙÇŽaU«Vµrkck+:³1v“ˆ@ÚT‘f
k‘V­Z9K—.õŽÂ„‹mÄ·½¶n&õ·9Žø>wà0‰=^}õU¾lîŸ™(;\YO˜0ÁºÆ˜Š±ÕŒÕ³ID ct‘”6k;á¹çžëÀñŽM4oÞ<§cÇŽÚº™ÔßÆ8˜YŒ1Â¦&cY“D`ì»ccí(¨E‹Ž\—›$jÙ�Ž±cªá¸‚1c5‰d�;$E£Žh›«`¼æðÇÓ¸'Á¦£œÙ’í-Á”)Sb¹Ú7Ö?ÿü³•‡±ÔtÜ•x£IDÀŠIªã„µ{ŽãÆ�³î…ƒ¶}×]w9Ø7©§íqpïùôéÓ­k'8u.\èœyæ™±èßð‘/Wû:ëÖ­K°,>‰14	ûŒÍ£IDÀ7Ž’”
kœC¶ñêXxÙÂ¸(ûU‡‚ƒk’W¯^�Åá�Yg�M›69wÜq‡S¬X1í{lò®‡1NÅŠ�Ç{Ì:'?9}cg¾0&cl&ßè&9lÖ¸€Ç¦ûr^>|Â. G�Îa‡¦­§	a‰Ó°aCç•W^±Ê…ó¡íÂï™CàÃ?tp	NXúf¦ÊÑ¹sg+÷ûsZcf——a,Æ˜L"� �Gr¹]Xë*Xâ8W]u•UN‚r^B|îÚµË>|¸¡‰ºØÌ8ßÅWÐµï¡Ìïî*Ðí·ßžÌ³Ð¾°gyøá‡�­[·ZÛ²pöƒ1Óp¬ÁŒ±c2‰†@!ÉéamGÍ›7¯3xð`k_Hî7o¹å§\¹rÚúš`dà�ÑG}du°ðþ"0yòdçœsÎqòçÏo]/Q¢„sÙe—9?þø£¿ �:ÆJ¼³†cÆ`ŒÅ$"85%Ço…µ�{�Xv¶�fÎœé0À)_¾¼¶Î&¸øÃN>ùdgÀ·oßn;ô, àRœ±cÇºF‚6ÂâßÞ½{;_}õU èøŸÆÈ$ì20öÖ&�¬!Ð^r^'¬ˆUªTq>ÿüsÿß¢ r˜6mškD¯b&u2–ú±øòË/[ç�!€¦cìÙ³ÇUºwïJWÂ¸¨ªoß¾ÎgŸ}fP;¢`lÄi8V`ÌÅØK"YGà
)Á>amçmÔ¨‘ƒcHQ!œ-2dˆÓ®];è˜`àGœ<yò8Õ«Ww®»î:×3pH\ŸeWhãò«ó£ÿš¤Y @§eË–ÎÅã�(ÆDŒ�&8HŒµsIi"@Ã‰4<ø8|N?(|­Ir§Ÿ~ºzî¹ç”ì§›D·"Ž\1¬d{@‰Uµš4i’š={¶’£V¾–]%B_üñJÎó+¹ÚTU«VÍ×<™x|GYJìÔøñã•,¹+ZJ¶–|Döö•(Jl%v,J UªT)_ó:qñQ .¾øb%gþM³~L"†"@J* i€÷§GKÊÿ/wýÓï¹þÛ«W/õôÓO+ÙgÌ5ÜæwîÜ©de@ÉÌIÍ˜1C}ÿý÷JŽªÍ›7+™™+ñ3�tõÄ0ËÅJ¬œUãÆ�]–ã[JfJÜø&� é °eË·O‹k]Wñ•ku]…@NÍ(±#P2;O*yYÁR2ÃW²ÿí
|ôq¹ó^‰ÿ{%7÷¹¿'• %‘�—/*¹°É´ÄïIÄ„áò—”&T ÒðO�×”ÿ_nñ§ßsý÷úë¯W÷ß¿cµ\Ã£ò£xtW–-[¦Àr¢@a6…UÌ vïÞ­öïßï*býëâ!ó¸ƒ„{�5Ü™=fûX5Ã'%¾	¢ë ÜÊÙu%—Ö¨åË—»}3Ûœ>.GÛ‚ï;Z{±WQâ°ç·>Ž,¹´(²ÿÐ¦ÿøÇ?Ô#�<rèÏ^ß§Ià¹Â‹½"1Ì* æX™Æl-_®¥{ Bì¾ûîSb5+ž${¬
ŒUÌš€	8êJQ<[;žµ†r›ÓÇ¡ äôq(»q&±ePr´ØtEp‘`ÕSxJœ1ËtÝÏt‚LO­~>MØs}ï‹/¾pg´Xê‹#a0Ã*•3óÇ'þ'�¨ €>þçþ�ßâLb8¬Ä°Ò]1ÀÆDn—Q’@€#m`%õ'‰»C¸£°§š�ÙŠjÖüuo;‰<•"`r<WÝxã�¦”{¤‚·	¿h]E-(0 ÿiº$]Dø]ØŸ0a‚:òÈ#] ]|†"@lDà�wÞQ—^zi2'„þÿöÎØª*;Ã[dVQÑ€Ò€ÒdP@E1qL«UQ£&%1ˆ"-ŽÄ�”eÊ"•²«Új‡jœ'ÊÐ¶ÝˆC%  63Ê 2=D@P&A”Iòÿ§yÖxïžs‡÷îð­ª¿î}çî½ï9ßá²×Ù{íµu�¿‘’EU#œZ8g€üA÷?Øé’×¥uO÷5Ž†�6mZùëÑ €@)PÒ¢pã�7†õë×Ç½¬Q*8Lò( –8 y€šÒ¤×©~ u‘:¤?ä[mà­¡w< ëÙ‰ˆƒ€@pþ„ë®».¬Zµ*îÙ{¹ßikÜ
”KN  9³¤5v¨Â4ÉQ~i³Ô8yŽRb†3Ï<3(ÍnÒï¢<  �‚"à\	Î{²|¹C£bÙ‡*u½´.Vi
eL  ct‰*Ú‹µàx€ãÓÕÜ´iS4àD7­ZµJWœÏ! $�Ù³gG�ÿÒ¥Kãžß<¼VŠí-Äm˜rÀ8˜I¾ŽlTÃ^ÃúéØt_²qãÆ(0' )>‡ 
‘€3�^sÍ5á³Ï>‹{z‹TÐ�ÿÂ¸(—€ìø%­íè{¸çIN\­y$ÀyzõêÅt@µ¤ø($ö÷œÿ’%KâžV…
^'9ÛVCp jtÊ×¬ÖûeÒù’—	VkN/ê%‚½{÷Ú*³Ú²|@ ¶	Ì˜1#ôïß?É“ÿ�ó¯¤Iµ}îåöý8 µsÇ=!V!](5”ª5z	�GXP-*>„ j‘€“š%øó¦>7I®ÅÓ.Û¯Æ¨½[ïù.�œ+5Jwž°àÂ¼9@ �¼ÿþûaÀ€I¢ý�â÷VéO…tåt.8 µ{·?Ñ×{©ËßK±F¼¹÷ïÐ!mZ�Ú½2¾(ãÆ�×_}’uþ~ò*ý¾l à…â ÔþM™¯SøBòH@Z'ÀÉ‚ì8 k×®µöœ PÖ^~ùåpóÍ7‡µk×ÆåàÎßOþtþq‰å©@žÀ&lÖ#þõô“ÒN|ûí·aÂ„	¡eË–¡G�ª‚A ¨yÏ?ÿ|¸õÖ[ƒ§(cš‡ýï�èücËg1€|ÒMÖöÇ*^!�'¥uvíÚÞ}÷Ýà-…Ï>ûìh�qÕÃ  ä�€w1ýõ¯î»ï¾à’˜æÎˆô‡˜å)–g8 yœ°y'Àðt@?)­°{÷îàÀï&è„Aõë×W5€@þ¸Ã>|xä øA$¦yˆàvéå˜å)Vp j rÂ¯ðt@…k$À# ÞEpÝºu¡oß¾¡aÃ´a	O‡â€ þJ`Ë–-aèÐ¡á±Ç‹Fcrqçï'ÿ?Æ,O±"€PC ~�G¼LÐiƒ›Ä©;oÞ¼°páÂ(aPÓ¦MãT¡  �ØV¬XF�»Ž
zDs�ôz’J”­8 5Ã9“oqíyRo©EœœsÛÛnvëÖ�ÔÁq€QˆEÀ©}o¸á†(I¬
-ä<Àîü'$¨CÑ$€Pƒ°3øª
ÕùPê%µ’Òš—âxM®“uîÜ9my
@ ¨ŽÀ˜1cÂÀ�“äõws³¥ë¤éV p 
ôÆ¤œÖ:½Ÿ"�&µI9^åÛmÛ¶…‰'Fñ ={ö‡Îm®@ ‡$à ã#F„»îº+|õÕW‡,SÅAo}>@ZPÅç.ôr#Òœ†·ö0ZGéçiÊF{e€—	z[á>}úe  �ˆÀÖ­[Ã°aÃ¢Hÿï¾û.	•±*|�´2I%ÊÖ€ÚážÉ·~£JïJž
è§¯˜9sfX¼xq”0¨yóæqªQ(cŽ%ºå–[Â¨Q£’Dú›ØKÒÍ’G-±" €P7)å�qÃ#ÞFøé0)­yOîÉ“'‡.]º°‘PZZ€@ù¨ÜÐçƒ>Háþ�t§äd?X‘À(’•rš»ôþ=Éù´½B ÖÂÿ6DÁ�ND\€¨a€À�<ßïµý·ß~{X¹2ÑèýV5rŸô€ôý�ò¦(à Åm:è$íq$-“<pŒ”ÖœÁËÁ�_|ñEèÕ«WhÒ$VŠ�´íR (^kÖ¬‰ý|ðÁ°}ûö$R¡Â·I/Hþ?	+28 EvÃ8]'òX]ìe‚Ž˜;wnð_§N�B›6mh’?! �r!0uêÔhß±cÇ&�ï÷2¿k%�FbEJ  Ho\Êi;àf²ÔNŠµB@å¢­;ß~ûíhÀ±uëÖõa(;wî#GŽŒ‚ý#”ÐÞRù_I,óK®ÐŠã ÚÉì|¼Lpœä1ýR)­y¸oüøñ‘3Ð»wïpÄŽ-Ä  �R&àx »ï¾;<ðÀá›o¼¸(¶íUÉ§¤[¤µ±kQ°`	à ì­I|b;Uc¢äàÀ3¥´»	ªLøá‡Âœ9s‚‡Û¶mÚ·oïÃ P‚œÄùüß|óÍè·ŸàÝï`¿ÿ–v$¨GÑ&€PÀ7'ƒS«ôŽ‚=¥qÛp` ç÷îÝí%À®‚qÉQ…OÀ‰}~øápç�w†¥K—&=áOUá&i”D°_Rz\ €oN§æ_ø;Rk)ö† Îø5iÒ¤0{öì(@°U+çÂ  �b&0kÖ¬pÓM7…gŸ}6$ÌêçË~UºAú‹ÿÀJ‹ @iÝÏÔ«Ù¤?ÆK{$�Ô—b™·ý|ë­·‚stíÚ5Ô«W/V=
A …C`ÇŽá©§žŠýæÏŸŸôÄ¶«Âo¤aÒ—I+S¾8à Ç}Êô,�4èÿ¤Ï¤3¤XùT.Zì Á…FN@Ë–-}ƒ Š€€·Nçûè£�&]Ûï««�œÒ÷	Éÿ‡`%J  Doì—µXO–¼Tðd)¶y‰�G¼LÐË=*€A …IÀÉ¾ž~úé¨óŸ1cF&'é©ÃA’°'€Pâ78åòÖëý8iŸä¥‚±Çõ@äœ‹-ŠbŽ?þxUÇ  �B"àa~§òõS¿³	m‡Ê?$Ý%UHXÀ(ƒ›œr‰Þ×Ó™»¼J »t¬Û>ýôÓhù�ó†;6€•±ÑQy#àÎÞ�þwÜíþ™Á-RGù{ÈßÿG`eB  Lnô—é˜€	RS©‹+q�Ê…mÛ¶…÷Þ{/|øá‡á„NˆòvX¬M	]ƒ rDÀi½½®È�!á…^ˆ~›	›vboá;DòÞ"X™À(³žr¹^%ð¿ÒÉ£GK±mÕªUáµ×^ëÖ­;vÍš5‹]—‚€@v–/_î¿ÿþpï½÷†eË¼'Xbû\5þCú/éëÄµ©Pp Jâ6f|Nê1Gš$µ’~.Å~œ÷TÀÌ™3£B»víŠ�Æ�«	È��7†'žx":4¼óÎ;Á¿Á„æßü›Ò`i¼DbAÀ Pî
À�ÒZÉ�‚‰uÎ9çì›0aÂ>¥Öè$äŠ€Sþmù7–Éosÿ¶ý÷oƒ@ü§=X•�Su¥Ã¥ÌäŠ½¡ÐUW]í/îeƒ ��„‡z(¼òÊ+ÁËü2´?«Þpi^†õ©V‚˜(Á›šå%}©úc%Ïv•Ž’b›‡$çÍ›Mx§±“O>9Úr8v„ "ÞŸã‘G	÷ÜsO˜2eJ&ÃýnÇOýÃ¥ÿ”<ï�AàG8 ?¢àM
gÿš.yÉàqRG)vl€ÊFë�'OžÆ�êÔ©9�5òG P�Í›7‡‘#GFÉ|^}õÕLÖô»uÏí¿!Þÿêß4�ŸHôŸúOjòG¹ð|áUÒ0)ã1ýÓO?=úíòË/gD \þåp�‰xÄìõ×_�?þx¦ëù+¿o�Þ<(½"}_y�WH à@"ü]�õÁíÒ�R¢%ƒ•:_@¿~ýÂm·Ý.ºè¢ÀŠ�J2¼–3oÚãˆþ#F�š)p0SNÿ÷¬ô;iu¦�P¯|à ”Ï½ÎÕ•þ�º[ºTŠ�@(õË½¯€�Aƒ…K/½48pƒ@¹p@Ÿ÷Ùxî¹ç¢ŽÏoÜ™‘y¸ÿ-é·Òµ@¥²$€P–·=ë‹v�ý¯Ò¿KŽÈÈìœþùaðàÁŒdD�JÅH ò‰ÿ™gž‰2ùeÑñûò—H�H¿—2^" ºXÀ(Ã›žÃKþ™Úò´ÀRFÓ>;çž{n”ÒôÂ/djÀP°’#àŽ_kùÃ“O>&Mš²ìø=Üÿ¼äáþU%‹ª8 5‚¹ä¿äl]á-ÒåRÆ¡þÞj¸OŸ>aÀ€á’K.	-Z´(yp\`éøúë¯£e±/¾øb˜6mZpÖÌ,Ì›õ¼.=.}˜E;T…@²¥]ð‚@5¼¤ô—’·í+eå\öèÑ#80\vÙeÑ¦Cjƒ@Qð:þ7Þx#ZÒ7gŽ3ngeŽœ"yË^§ðÝ+aÈŠ@VÿIgõÍT.UGêÂþIòÔ@�l/ò¤“NŠœ€þýû‡îÝ»G9²m“úÈ¥ìóçÏ/½ôRÔù{Óž˜½õ¿*mÏA{4�ˆ  ÿòE ¥þgÉ‰H2ÎPyržðÒA;ž&hÒ¤IåG¼B Ö	x¿‡÷Ýñ{IŸ‡ýs`ÔÆ3ÒŸ¤9h�& ð8 ?ÁÁy àL‚×HC¤Ù¶ï8�SO=5\qÅáê«¯íÚµË¶IêC c+W®£G�Ž¶Æv
ì,ç÷+Ïc©Þ<)ýAZ_y�Wäš @®‰Ò^UÜSÿ›äåƒ'WU(Éqwþ_|q¸òÊ+ƒ3’O 	=Ê"Õí'  	^IDATfJÀë÷½ö˜1c¢T×vrdËÔŽ—óý�”³Fstn4S‚p Jð¦ø%Ù$yT ­”µ¹ã·`GÀÓÞ€ƒ@®	,[¶,ÞwÇo ‹�ù<µ
ðÓþs¿ `5C  f8ó-h¯CŽðˆ@çƒ?ÎìHëÖ­Cß¾}£)í�Ž;Î32#°~ýú0uêÔhˆß;ò­Y³&³†]k‘û‰ßsü+]„£È€ü±¥åxZ«˜Wxz g¼*éKyÂÎ�;‡.¸ ðA³fÍÒW¤DÙØ´iSô„ï`¾‰'†E‹G÷çÐf«-ó;ª?§EÏ‘¦Ê€ @Üä"¹Ä¦:ÏK¥�ÒÙR)'V¯^½Ð±cÇÈp¦Á^½záä„lé4âNÖ¬YQ¦>wüK–,	»wïÎåîTcNÜ3RrÞþÍ�Z%€P«øùòCh¬cÞpè_¤_J9Ã÷*‚N�:E›y‚ÓN;-xÚ +?ÎŸ;wn”�òäÉañâÅ¹ŠâO…é(þñÒ%oÔ³CÂ Pp 
â6pUplÀµ’cÚUQ&ãÃÞž¸C‡ÁY½+aïÞ½CÛ¶mÃá‡;©!VjöîÝ***ÂG}íÂçì|K—.ÍfûÝê9˜Ïsû£$Ïõc(88 wK8¡Ch£cÿ ]%yzÀ£97�8Û ·*¶3àiƒ–-�Ï+V6lˆ†óÝéû)ßYúrÈ—ŠÆO÷æEz[ú\Â P°p 
öÖpb‡ ÐHÇ~!])]$�(åÅ4hºví�x5AÏž=£=	È@˜Ü9kÔùœƒöìÙQô¾Ÿò?ùä“°s§§àóf«Õò;Òé}é;	ƒ@ÁÀ(ø[Ä	VA �Ž_(Ù8K:BÊ›sÌ1Ñª‚.]º„³Î:+rÚ´iŽ>:ã]�óv®åÔðÖ­[ÃçŸuøÓ§O,ˆ¢ö·lÙ’oßê¦Kîô'H¬ß¬¸à ×ýâl&ÐP‡zIïWG½úXÞÌ±GuT4Eà€B�8˜ÐyÊ qã¼ÌPäízŠ¥á;vé{ƒïùÉÞ�{ŽØß¶m[¾æòSñ|¯?–Hãök–^}ƒ@QÀ(ÊÛÆIWAÀ�ã}$;ž"ð(A�DôyuAÓ¦MC·nÝ¢ÀB;§œrJhß¾}ðFF¤)Ö�H`Î²çuV¬X.\uôØûøã�ÃæÍ›ó­_ÕÙíÕ~º÷¿;þiÒV	ƒ@ÑÀ(ú[ÈTAàx?GºDê'9�°ŽTcÖ¨Q£h¤À+<:à)úo¿÷´BÃ†ƒGÊÑöíÛ¾ÿþûàázã»ƒ÷Ó¼ßû)ßûÉþ»ïj|JÝYÀ7Y+M•¾”0”�òüŸ§¤n!“†€;}zdà‚ý¯¨+Õ¸Õ­[7r
LèÍŒÚ¶må!ð
;~õˆ�cˆè$FÅê ¸ƒw2ày®ÞOôŽÀwïWËËò¼™Žƒ÷ÜÙïÙ³§ÆïÉþ/ôûIßOø÷¿:¸ÏÎ �’$€P’·•‹ª†€GÎ”Î“<BpŠT_ªuó4Â‘G�
ØA8ñÄC«V­¢ýš7oe/ôÞNiìé;	žZðHƒ§?Î·³àNÝiqÝQûÉÜCõîÜ=,ïlzÎ�ï×�7Fï×®]V¯^uð~Úß¾}{Mß§»§»T`¡ä'ü÷¤¿H<éVp Êã>s•‡&àEþ�¥¾’GºK>V°æ)ºÓ÷{�x¤À�ƒJ§ÀŸùxå«ß;Á‘�„TùBÝ¡§Ê	süÔn¹Ó®|­ììÝÁ»Ã÷q?á»Œ�éù}�Û�ß|ÉOúS¤E’�a(;8 ewË¹à*4ÐñŸI^Qp®tšäy]^¨ö±üðr=GîÏ•&IŽÜ_%í”0”5€²¾ý\|5¼9ÑI’w(ô”AÉA	+\ßèÔÜá/�<¤ï�÷–K›%H!€�ƒ·¨†€÷n'�*õ–<uÐVú‰ß‘ Ô‚íÓw®“*$å$Í“Ì·IÂ  �jðW5pøÕpZb¯.°SpÆ~µ×«�`¹'à§xwø+¤ûåÎÞÑú5¾VPß‰A ¨	à õíãäˆ€KÇJŽ#h#y„ «äio!ÙiÀÒpgþµô•äáûO$?á{mþ*ÉÇýô�A YÀÈU!ƒ€ƒ[K­$;+Ù9ðhÁ1’c
Ê5®Àóõ–÷û©Þ�ü§’;ùµÒÉA| �8 y€J“HCàp}îÑ€–’óxÚÀ‚Güjù³£$;V©˜l§NÖ�·µMÚ ¹S·ü$ïWç{Ý½?óSÿ^	ƒ jˆ @�æk “€“vJž:8Nòô�ƒ[Ð|¿|ìh©r¡±Þ×—êIÎrè6”Û®”ÞdV¯”;ãåly»¥]Ò©ò	~«Þ{È~ã~y®ÞAx>¶^ò�½¸=†îƒ@!À(„»À9@ 9�:ª’ÚÁ»ã?Ròh���Ø!H}ï:•õ*ßëP”îö½ºƒö«åNÞOñî¸Sßû‰~»dG ÕAp€   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ Ø	ü?Ë‘Ûù&p    IEND®B`‚ic05  ,ARGBÈ 	-^�““�^-‘ nÉøƒÿøÉnŽ YÙ‰ÿÙY‹ ’�ÿ’ˆ ¦�ÿ¦‡  �‘ÿ �† Sþ‘ÿþS„ Ø“ÿØƒ  g•ÿ g‚ Ä•ÿÄ� %ö•ÿö%�  T—ÿ T�  w—ÿ w�  ‡—ÿ ‡�  †—ÿ †�  t—ÿ t�  P—ÿ P�  ò•ÿò � ¼•ÿ¼‚  [•ÿ [ƒ 
Í“ÿÍ
„ Dú‘ÿúD†  }‘ÿ }‡ ‘�ÿ‘ˆ |ù‹ÿù|‹ CÆ‰ÿÆCŽ V²ìƒÿì²V’ EhzzhEÉ Ê $22$” Z—ÉæññæÉ—Z� eË‡ÿËe� %§‹ÿ§%Š 3Ì�ÿÌ3ˆ #ÌÿëŒm£úƒÿ÷žl�îÿÌ#† ¦ÿë6€ gü�ÿú\€ ?ðÿ¦… `þÿ“� Î�ÿ Ã‚  ÿþ`„ Èÿÿv‚  µ�ÿ ©‚ ‚ÿÿÈƒ Rýÿÿ³� ã�ÿß€ ¿ÿÿýRƒ  �€ÿü{ «‚ÿ— …þ€ÿ �ƒ  Â‚ÿÚÃè‚ÿ˜œäÃÝ‚ÿ Â‚ ß‰ÿ›™†ÿß� *êˆÿ�–‡ÿê*� *ê‡ÿ ”ˆÿê*� Ý†ÿ¢‘‰ÿÝ‚  ½‚ÿÚÃè¦Ž‚ÿåÃÝ‚ÿ ½ƒ  Š€ÿü{ Ž‚ÿ¡ …þ€ÿ Šƒ Lûÿÿ³� æ�ÿÛ€ ¿ÿÿûLƒ ¾ÿÿv‚  ¶�ÿ ©‚ ‚ÿÿ¾„ Uûÿ“� Î�ÿ Ã‚  ÿûU† —ÿë6€ gü�ÿú\€ ?ðÿ—‡ ¼ÿëŒm£úƒÿ÷žl�ïÿ¼ˆ %º�ÿº%Š ’ú‰ÿú’� T¶ù…ÿù¶T‘ 	H„²ÓááÓ²„H– Ë Ê $22$” Z—ÉæññæÉ—Z� eË‡ÿËe� %§‹ÿ§%Š 3Ì�ÿÌ3ˆ #ÌÿëŒm£úƒÿ÷žl�îÿÌ#† ¦ÿë6€ gü�ÿú\€ ?ðÿ¦… `þÿ“� Î�ÿ Ã‚  ÿþ`„ Èÿÿv‚  µ�ÿ ©‚ ‚ÿÿÈƒ Rýÿÿ³� ã�ÿß€ ¿ÿÿýRƒ  �€ÿü{ «‚ÿ— …þ€ÿ �ƒ  Â‚ÿÚÃè‚ÿ˜œäÃÝ‚ÿ Â‚ ß‰ÿ›™†ÿß� *êˆÿ�–‡ÿê*� *ê‡ÿ ”ˆÿê*� Ý†ÿ¢‘‰ÿÝ‚  ½‚ÿÚÃè¦Ž‚ÿåÃÝ‚ÿ ½ƒ  Š€ÿü{ Ž‚ÿ¡ …þ€ÿ Šƒ Lûÿÿ³� æ�ÿÛ€ ¿ÿÿûLƒ ¾ÿÿv‚  ¶�ÿ ©‚ ‚ÿÿ¾„ Uûÿ“� Î�ÿ Ã‚  ÿûU† —ÿë6€ gü�ÿú\€ ?ðÿ—‡ ¼ÿëŒm£úƒÿ÷žl�ïÿ¼ˆ %º�ÿº%Š ’ú‰ÿú’� T¶ù…ÿù¶T‘ 	H„²ÓááÓ²„H– Ë Ê $22$” Z—ÉæññæÉ—Z� eË‡ÿËe� %§‹ÿ§%Š 3Ì�ÿÌ3ˆ #ÌÿëŒm£úƒÿ÷žl�îÿÌ#† ¦ÿë6€ gü�ÿú\€ ?ðÿ¦… `þÿ“� Î�ÿ Ã‚  ÿþ`„ Èÿÿv‚  µ�ÿ ©‚ ‚ÿÿÈƒ Rýÿÿ³� ã�ÿß€ ¿ÿÿýRƒ  �€ÿü{ «‚ÿ— …þ€ÿ �ƒ  Â‚ÿÚÃè‚ÿ˜œäÃÝ‚ÿ Â‚ ß‰ÿ›™†ÿß� *êˆÿ�–‡ÿê*� *ê‡ÿ ”ˆÿê*� Ý†ÿ¢‘‰ÿÝ‚  ½‚ÿÚÃè¦Ž‚ÿåÃÝ‚ÿ ½ƒ  Š€ÿü{ Ž‚ÿ¡ …þ€ÿ Šƒ Lûÿÿ³� æ�ÿÛ€ ¿ÿÿûLƒ ¾ÿÿv‚  ¶�ÿ ©‚ ‚ÿÿ¾„ Uûÿ“� Î�ÿ Ã‚  ÿûU† —ÿë6€ gü�ÿú\€ ?ðÿ—‡ ¼ÿëŒm£úƒÿ÷žl�ïÿ¼ˆ %º�ÿº%Š ’ú‰ÿú’� T¶ù…ÿù¶T‘ 	H„²ÓááÓ²„H– Ë ic10 �)‰PNG

   IHDR         +ƒ  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  @ IDATxì�œUå™ÿzï0Cï0ô^‚`�€ˆ4b‰Æž ÆÞÄh6š²›ì&ûIÜ$›ìúw?1–àjìÆ^Á(Ò‡^‡2ôþ~/÷š‰Kæœ[¿ÏçóãÜ¹sï{ÎùžáÞó>ïSÌ0@ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €  �I*eÒÁp,€   3�ÊþÎ*.m%}ÇKÉŸ¿úœÿÊö¹ö'¤ÇI}õ¹½‰ßùƒ   @ [	à ÈÖ+ÇqC €@6Ð÷oõ„j”Ù&'§mU—&öÕÊ<ÖsIéù¤Ê: ’þ²€²�ým_Nø“ÿäV€äcmå Ø]F{üqRú�ë÷ÉÇ»üqYíôŸ%=—Üê±öƒA €  �"8 RšÝ@ €@NÐÄº¶«Ö!¤ßÕLüNÛäkµMJï­›xMò9½V“{9äH>.ë ð§Sne'÷z¬Érb¯Ç;\ÛÚîÛ-.m“Ïi›üY¯Õãä{ôø`Ò{äŒÀ  @ 8F8 Žoƒ   �¼! ‰·&äu\š KÉŸË>×ÀŸ—ê¹ºê—‘~Öó’Vî±¿PôÀæ„6ú¶´Œô³~·)!9¤­	É)Pö9ý,G@ €ÀAà 8ž‚   �¼" 	yÙ‰½kb¯I¾7q5-³ÕãÆ‰çšùV“zE `ñP€k]ë\ë[=.I<ÖVN9ä(H>ÖV’Ãƒ   ä% yyÙ9i@ yG@«øš¨KeWíõs�«¹«E™ÇúYýžïJ‡�E¦ºr”¸V%$‡ÁÊ„ÖøV¿O:ä$ÐÏÑƒ   �Ü%ÀMMî^[Î€@>ÐŠ}2_“w©‰KúV®–‰Ç…‰ÇZÉgõÞ!ä‘)Š@‘+\«]rèñòÄc9’m•~ g@ Èz8 ²þr€ ò’€
æir¯Õü¤4Ñoëêàjçj“x¬~UÇÇ p$êb �E®¥®Å‰ÇK|+Ç@²ö@2j@Å
1@ €@ÖÀ�5—Š…  �—4qW.¾&ûIi¢ßÑÕÉ¥‰~{—&û*º§|~}·iU_[¾çVnJ#�- ­ê¨8¡œÅ®Å®®….9ÊF¨ö€	  @ ãpc”q—„‚  �·ÔÚNáû
ã×ª¾+l_“|Mö»¸:¸¾¯vxšä''úþƒ@J$r¨å¡Ò¹æ¹ä�s@éJH!ÔcµKÄ  @ i%€ ­øÙ9  �¼% ï…ñku_Òd_ýÞ®®	iÂ¯ç““üäÖŸÂ �Q’N�äV~9æ&4Ó·rèyEHJÐë1@ €@Êà Hjv@ ¯	hu¿fBšø·vi¢ßÓÕË¥þF.­ì'¥p~ÙJ@iŠHjƒ?V„À,×g.9–¹äØ‘Qƒ   �øà ˆ�-#C ÈWúnÑd_}IEøº'T”Ø*Œ_­ù4Ù—s Šƒ@®Pm MòåPËÁÕ®Ù®9‰­«¡œ’D	8€ ¢!€ ŽŒ@ Ÿ	h¥>9áW8+W×€ÄV«ýÊëO®ìk‹A $#´U»AEÌp}”Ø.÷m2e@E`€   �c"€à˜°ñ&@ yM@ßšô''þýq?× Ä¶¥o5áO†ü+wƒ ŽŽ€Š&SäXáúÄ5=±Uç�¤#@Î "@ GG ÀÑqâU€ ò�€Ví¦¯~åë'WøU´O!þjÑ§I¿Ä„ß!`ˆˆ€rHj7¨LF¨®€"”^ (€  pH8 ‰†_@ È[únÐd_+üÊÓoëÒê~_—&þm\šèkÒ¯v} �Zj/(g€œK]JøÔ¥(�%.ÕPt€œD8€ ÀÀ_  $	$'þ…þDWrÒ¯Uè¯ïÒ¤Ÿï‡�MV©ÒÑ]²ýû™+fÓuM«.šœ¥®d§�¤3àcN…q8€ ¸‰ão €@>Ð¬PRX7××\*Ü§JýÍ\�]\ŠÀb Pvb^ö±võÕŸË>§ßU¯^ÝjÕªeuêÔ±Úµk‡ŸkÔ¨aU«VµÊ•+©*Uª„Ç_Ýj¼}ûöÙÞ½{ºÕï¤={öØÎ�;m×®]¶mÛ6Ûºu«mß¾=üœt$·3i_}®ìÏe'_Ï62ZùßäZïZëR‡¥¼çúÂ¥t9ðö8€@¾8º%�|£ÂùB ÈMÉ	¿¶ªÔ?Ð5ÄÕËÕÞÕÔ¥I¿Úòaå$PvÂ~¨Çšœ7jÔÈš6mjõêÕ³ºuë~¹ÕD^?k2/•�Øk²Ÿ”Æ¨V­šiB¯ÇIiÒ¯ç´ïäþõœ,¹Mþ.ù{MÄ“Òë4á/»Mþ.é$�3 )=·{÷îð³œe•th+mÙ²%8´Ý¼ysøYÛuëÖÙ†ÂaÇþOYçÀ¡'_Ëö¨¨í œë\Å®Y®\ºÔa éÀ!à00@ ¹N @®_aÎ€ÀªÈßÓ5Ì5ÔÕÑÕÜ¥I¿Bû±c$ U÷‚‚kÕª•5nÜØ6l&ùÚ6hÐÀê×¯”œðkÕ^ïÑ$^JNè“ymËNîË®æã!¦ämÉˆ�dÔ€r$Ú&ÚJŠ,H:ä(--Ú´i“mÜ¸18´]¿~½-_¾ÜÖ¬YÞ“’ÊÝ�(U@Î€U.uxßõ®ë3—º`€  �Ãp äðÅåÔ  �¼' |}åò+´¿�«ƒK-úZ¸TÜ;­º7oÞÜZ´hVí›4i&ùšØk%_JNìµ­Y³f�&øz¬­ÆHNø�°»¼þuÒ! H9vìØñåV�ËF(j@’£@Î�’’’M°råJ[µjUˆFÈk˜Gò*¸Ò¥Vƒ‹\3\JPí ÕÀ  @ Çà È±Êé@ yO ‰Pñ>…ö÷uiÒ¯ªýÊéÇ¾B@¡ðšÄ·mÛ6¬à7kÖ,¬æk«É¾~§|Mî“¡ùÚjBŸ\ÉÿÊ�ü˜r¨A2‚ ™j�Œ"�s@N�µk×†¨mA°dÉ’à8(›Z�‚ÃÍ¦]¨f€º
È B‚JPg�@ 9@ @\DNÈkúoíRXÿ WoW;—žkäÂœ€&ñ;v´öíÛ‡ÕüÂÂBÓ$_üdÈ¾&ù_ÍÃ^öH:’õä�c ™Z §ÀêÕ«MQÅÅÅ¶páÂ�~�½gù‘oð—¹»fºTHPézŽzƒ  ��p dãUã˜! ãW?åõKE.åõ+§?oM¡ùmÚ´ù2d_¹ùZÉ×d_aüúYyúz�¤U|,ÿ(z@éÉÕ�#@NEèg(ÔsK—.¯Ë?JÿpÆª zê( Z’Š*} ƒ   �,"€ ‹.‡
ä=�' °þ~	õò­&ýu]ye*”§Õ|ÞkÙ²eÈÓ×j¾&ùú9¹º¯É¾žOV½Ï+Hœl¹	(5@Qª+ ­+V¬Ž ý¬úúYéŠPaÃ<´-~ÎrÌr}’�ÒÖ¸0@ Èp8 2üqx€@ÞPN¿&úZí×Ä¿‡K«ýy3é×J}»ví¬uëÖa¢¯U|Mô•·¯Pþd8¿Bø1ÄE@)É´¥¨ž€"- ÇÀ²eËlñâÅù- g€¢>wÉ ¨ 9J\  d  xQ8$@ ï	(w¿›«¿+9é— �+§­nÝºÖ¡C‡Æ_vu_“ýdÓ¦MC¾œÁÉe!Tª@2…@N�²QJX´h‘©AØ&?GMþ“Î€�ýñ.ÕÀ  @ Cà È�Áa@ yO ºhëR>¿Zöiò¯Jþ­\9iêo¯I½¤I½¤•þ.]º'€+œ¿Zµj9yþœTnP;C¥	(@“ÿyóæ…Çr$ë
(r`ß¾}¹	àÀY-÷�:È	 Ö‚ª°ÄµË…A €@	à H#|v@À	¨E_w—&ýªâ¼KüsÎT‰_údŽ¾¶EEEaÂ¯Â}ZñW‹=¹F@	T7@rÌ™3'8	’5ä0(--ÍµÓNž�º¼éR9f»Ôjƒ   �4À�èìÈ{
ñïêR.ÿ0—&ýrTvåŒ%sõµ²¯<ý®]»†	·nÝB?µßÃ �¯ÔŽP…¿øâ‹à˜;wnhK˜ŒPZAŽ™B4ù—3à]—jÌu‘"à0@ ©"€ U¤Ù �ïÇ®ÿ®Á®Q®A.9rÂTy¿lÛ½¾}ûZ¯^½¬cÇŽAéË‰ËÌIÄD@E.\4kÖ,ûôÓOÿ¡-¡¢rÈ4éŸîzÕ5ÍµÈ¥�Ý.€ b$€ F¸@À	4u©UŸŠù�àáRˆÖþj?™¿ß¼ys4h�õéÓÇ:wîŠøÕ¨QÃOƒ Ž…€
*e`þüù6cÆ›>}z(0˜ŒPAØ~?¥¼åzÍõ‰k¡k�ƒ   �dýhL€@E	¨ _—Zöu�r©¨_VW³S…þd%~­ôk²?`À ëÞ½{(ÞW½ºNƒ â °k×®PLpöìÙöÑG§€Ò’r Ó€VÿU4PQï»ÔM@‘t  �¨à ˆŠ$ã@ 0kìÚ»”ÏškŒK YiUªT1…õ7iÒÄ´Â¯‚}C‡µþýû‡�þ:uêdåyqÐÈ[·néü±½ÿþû¡Ž€Z–””„Ô�½{÷fói*àe×3.Õ(v­wa€  PA8 *�·C yO@qî-\�]'¸Nviå_Ëá•]YešÔ«`_ãÆ�­S§N6lØ0<xp(à§�µî«T©RPV��$°ÿ~“ÔRP)*$8mÚ4{÷ÝwmÁ‚¶~ýúPXPÎ‚,4Ôê¿"žs½æšïZéÚéÂ  @àà 8h¼€€hàRQ¿�.Mú•Û_èªâÊSØ~£F�¾\åïÝ»·><¬ò«-Ÿ~¯H ÈZùWº€Ú*:àí·ß¶™3g†úŠØ°aCø}vœÍ—G©p†Õ.Õ
�3àC××&@ å € °x) �÷ô™™œø«}ßy®!®Z®¬ù<Uq¾úõë©5ß�!ClÄˆ¦É¿Âý5á×*?d7EÈ! ‰¿œ o½õVHP¤€º”––šŠf‘©hàv×®?¹Þu%ú@ G ÀÞ ñk@ N@ÅûÔ´¾½kœëWWmWVöÓ¤_mø4hV÷�;î8“Ú·oo
û×ï«UËŠSqä P^»wï“}¥,Z´(¤	¼óÎ;!J`Ó¦MÁ!�EÎ Üæšçú_×ó®b—Z#ÐJÐ!`€ E À¡Èð< �ïôù¨*wšøv�åúš«¥++Vü5±Wå~åî«xßÈ‘#Ãj¿BûkÕª&ý¬ôûÕÄ �g ÉþöíÛCªÀ|`¯¿þº½÷Þ{&g€:
dIÝ€dDÀ
¿„ï¹žtMsÉ ÂD8€@Y8 ÊÒà1  �TÀ¯À¥Õþ3]r È�ñKäU«Vyû
ñ=z´�;6LþUØ¯víÚáw~  �/	¨fÀ¶mÛBÁ@uxñÅí•W^	)úÝž={¾|m?ÐÊ¿&þr üÅ¥¨€5.Ú:€@’ €$	¶€@¾Ðç¡*úk…ÿT—Vü»ºÔÚ¯¦+c-9éWxÿ¨Q£‚úôéc-[¶«ÿŠÀ  ­þ«£ÀŠ+lÆŒöê«¯)2 Kœ;ü<Õ2p®Ku)B@Åˆp �ßp ä÷õçì! �­ú4Á×d_«ýc]jé×Ä•±Ÿ‘ÉI¿*øýë_·o|ã¡ˆ_›6mBU…øc€ *B@)ê°téÒPDðoû›½ñÆ_vÈðÈ MöK\jø¢KQr
ÈA ƒ  �¼$�±7·yy58i@ •ªúÎ”ãßÇ¥‰ÿ‰®6.UùÏHÓ¤_…úT©_UûÇŒcZéoÝºuXégÒŸ‘—�ƒ‚@N�3@‘Ë–-‘/¿ürè* *0˜áÎ µ\êzÉ%GÀ—jdEnƒ'@ 28 "CÉ@€@–Ðçž–ÇÕÆï\×pWkW}WFZåÊ•Cõ~òÓ¤àÀ�Ö±cÇàP¡?€@*	¨@ &þ.´?üÐäPí ¥	ìÛ—Ñ‹ë¥Îi™ëm×£.µT[ARä ùq�9K@à@8¿V÷â?ÁÕ×ÕÎ•‘3hMú«T©b½zõ²O<1¬ø™Šù)×ƒ  �	4é_½zµÍ™3'D¼ôÒK6kÖ,Û»wo&;´ú¿Øõ©kªK)ŠÀà0@ ·	à ÈíëËÙA rüÄ	®oººZ¹2®¢¿&ý’V÷‡ªø÷îÝ;óSØ?-ûüªa€@FPkAE¨xàÌ™3C�·ß~;D	(* C#Ô9`¹ëC×®×\«]ÆàÇ‡A 8f8 Žo„ ²€@S?Æ3\g»zºZº”ûŸq¦	¾&ýãÆ�³„¼þ‚‚‚�óŸqËA 8ÕX³fM¨ðÑGÙóÏ?orÈA�¡¦Z +\Ÿ¹wý¯k�ƒ  �sp äÜ%å„  'ÐÜ¥Pÿq®Á®ö®Œ›økµÐ Aa¥È�!Ö©S'kß¾½Õ«WÏƒ  �ý6oÞlÅÅÅ¶`ÁûàƒBdÀôéÓ35"@Ž€b×4×ó.¥¬ra€ r† €œ¹”œ àZ¸Nq�êêïjëªìÊ(SÿèÑ£C^¿Vû5ñoÚTÁ
  �Ü%°nÝºàPTÀ[o½œª��¦€%®�]u=ëZéÂ  d= Y	9@À	hÅÿt×É®A.µóË(«^½ºõïßßF�Bý{ôèÂüõ<@ ŸìÚµ+¤|þùç!5àÕW_µ�?þØô|šÚNw=çzÚED€CÀ  �ì%€ {¯G˜5rC]§¹F¹Š\U\c
ç?î¸ãìk_ûš)Ì_UýÛ¶U`@ K–,	]”ðÞ{ïÙ;ï¼cJÈ0ÛëÇ3Çõªë×û®.€@ÖÀ�u—Œ† œ€’ä�w)Üÿ8WoWFåø«eßÈ‘#màÀ�AZñ¯U«–&@ _%°}ûvSDÀ‡~ôúë¯‡Ö‚_}]šV�€™®w\JxÓ•qÞ
?&€À!	à 8$~d �ú~LšøÃ5ÆÕË•19þuêÔ±aÃ†ÙàÁƒÃª¿&ÿ-Z¨,@ GK`åÊ•Á	 h€iÓ¦Ù»ï¾k[·n=Ú·§âuª0Ëõ²ëo.9J]  �Œ'€ ã/8%Êk•´K¹þ]³œÞ°aCëÓ§O˜øŸtÒI¡²£FÊNÀ  @àX	lØ°ÁÔ1à…^Ž€3fØÆ��u¸8Þ·ÝýÐõ´ë—¢2²��@ ÀÀ �É´º¯‰¿VýÇ»F¸jº2ÂÚµk
û)·ÿÄON ŠúeÄ¥á   �" â€šü¿ôÒK¡• 
.^¼8“Îp‡Ì[®§\Š�#@Q  �Œ#€ ã.	$tòí	®	®‘®z®´[�5¬{÷îaâ¯Uõ§¨_Ú/ ä	T× Õ�#`öìÙ¶sçÎL9ûÍ~ ¯»¦º^s-pa€ 2Š €Œº àZ¹TÙ_¡þRWÚ­~ýúÖµk×PÍÜ¸q!×¿qãÆi?. €@>X¿~}¨ðüóÏ‡îsçÎµÒÒŒIÃ/ñkòtBê°<¯çd& ™y]8*ä#­ð÷siÒ¶«½+íŸQÊïWEÿ#FØèÑ£Cq¿ø¡a€  �n›6m
­_yå{ë­·Bç€©°ßÙ»wÉð‰K  �´HûÍuZÏž�C ™@ ¶D×	.Müû¸Ò^Ù¿U«V_NüÇ�o½zõ2òûýÊ`€ 2�€êÌš5Ëžzê©/Ë—gÄÂ»jÌpÉðšëc×6@ -p ¤;;… œ€Šùuu}Ãõ-× WÚ?“Ú·oo={ö´SN9%¨M›6V¥J?4€ 2�ÀÞ½{méÒ¥öì³Ï}öÙgV\\œ	‡­ˆ€é®ÿq©cÀ\WÆ/ðcÁ  �<!�ö›í<áÌiB ÿH ¥ÿøu×9®q®´·ôkÝºu(î7aÂÓŠ¿" 0@ È^Š PDÀÔ©SC±ÀeË–eÂÉ¨uàs®Ç\o¸V¸0@ )#€ e¨Ù à”<¯pÿs]g¹š¹Òö9T©R%Ó
¿ªúŸ}öÙaÅ¿°°�¿(  �\  ˆ€Õ«W‡h€Ç<8!°¿äÓfJXçzÒõ¨Ki›\  �Ø	¤íÆ;ö3c€@&Pž—VûÏsuw¥-Ï_!ýíÚµ³Þ½{Û7¿ùM3fŒiâ_¹rÚÉq`€  �}ûöGÀË/¿lO<ñ„Íœ9Ó/^lr¤Ñä˜íú“ëy×ç.ê8ˆ� €øØ22 `¦äùB××•®ã]U]i1Mü›7on]ºt±/¼ÐN?ýtkÖ¬™) ƒ   �Ü' •ÿµk×Ú3Ï<c?ü°Í›7ÏV­Z•nGÀ'ÿ¦ë7®·\«]iõLøþ1@ G	p×›£–Ó‚@H¶õû¶ËÉ.9ª¥ã¸4ñoÜ¸qXñ¿è¢‹lÔ¨QVPP`5kÖLÇá°O@ H3�;vØš5kìÕW_µÿú¯ÿ
Ö¯_ŸNGÀnG¢‰ÿs®‡]´t = Ñ3eDä;�Z@ô¾éºØÕÉUÝ•rÓÄ¿I“&6`À ;÷Üs¿õ¯V--~ˆ”Ÿ?;„   �ÃØ½{wˆ xå•WìÑGµ�>úÈJJJÒéØåG¼Àõ_®'\êe¸Ý…A ˆ„ €H02 àôy¢ÉÿX×¥®Ñ®:®”›BúkÔ¨aÝºu³I“&Ùi§�Vü«WO‹"åçÏ! @ |víÚ"”ðÐCÙ_|a;wîLg±À­~¯¸þàzÑ%'@Z+úþ1@ à È�‹È)@ hf­•þK\\m]i‰¯WXQQ‘Mœ8ÑN>ùdëÜ¹³Õ¯_ßƒ   ž@ii©ÍŸ?ßž{î9{ì±ÇlÎœ9¦t�4™v¼Ä5ÕõG—"!€A 8f8 Žo„ œ@W�ël—BþºêºRnZñïÐ¡Cõ?ãŒ3˜ø§ü
°C@ ¹C éøßÿýß�°hÑ¢�¦3ÜâûýÐ¥”€Ç]k\{]  �rÀPnd¼púìP¸ÿñ®I.UùoâJi=…ú+Ÿ¿cÇŽ¡�ŸBý»wïn4ðCÁ  @ #°iÓ&›={vè ö�.4ÕP7�›Z–¸Ô%à!×›.Ò”�€Vï0@ å! I~;×U®\Ã\Š±O©CQ“ÿÂÂBÓjÿ�wÞigžyfhïGe¿  DB@ß)­Zµ²~ýúYÿþýCqÀÕ«WÛÖ­JÑO©é;Vuu:¹¸º»J])÷Fø>1@ K	¤ô†=KqØ€Àß	(¯œë»®!.­ú§Ô*W®luêÔ	ùý\pA¸)ÓÍ™*þc€   �¸ìÝ»×–/_nŸ|ò‰=òÈ#¡N€ûöiq>å¦h€\ÿázÞ•¶B¾oÈ"8 ²èbq¨H#Í®‹\—¹Nwuv¥<Ü_+1cÇŽµ	&ØÈ‘#­mÛ¶LüýB`€  �:r,Y²Ä^ýu›:uª½øâ‹¡P`šÒæû™?íúO×µš €C³á7€ÀÊõ?Ë¥Uÿ~®”—ÔW¸ÿðáÃí¢‹.²Q£FY›6mB›??€  �j¸téR{õÕWí¿ÿû¿íí·ßNGm �»Ò >q)àI—j`€ J€˜ÙƒbáI@À	Tuuq)Ïÿ
—rSÚÚOÿnÝºÙw¾óûÞ÷¾g£G�¶-ZXÕª:4€  �>ú.jÜ¸±uíÚÕúôéc¶nÝ:+)Qt~J­†ï­�«»«¹k™k“+-¹	¾_È`D dðÅáÐ �F�|ß]ç¹4ñOyYýF�Ù9çœcgŸ}vÈóoÚ´©@ ÈLšü«>Àã�?nþóŸmÃ†é8PMü?rýÉõ˜+-áûÅ  �%€ C/‡�4¨îûíåºÒu’«­+¥¦<ÿ“N:)Lü•ç¯p€  �-” ú r¼ðÂ¡>@Ž}‰ïó×o\³\»\  #€?@ I@¹ýÊõ¿Úuª«Ð•RS¸ÿe—]f—^zi÷oÒ$åMRz¾ì€ r�@ƒBZ@ÇŽMÑkk×®©)>SEîuvµwiÁ¯ØµÓ…A yN @žÿpúHP…ÿï¹´ò?Ü•Ò\µñ;ï¼óìª«®2µöëÒ¥yþ~0@ ÈNª ¶�ZçÎ�­~ýú¶zõjÛ¼ys*OHßåú~ïéjìZîJy�ß'd t18¤�@=ßçi®›]Ê÷oéJ™)ÜÿôÓO·k®¹Æ.¹ä2dˆé9€  �ô�¦è¶þýû[§N�Â)Ûž={Ryz*¢£.>:€Ý.	$%À!`ÈG8 òñªsÎ8@@“ýs]“\'ºj¸Rb•+W¶=zØ7¿ùM›4i’�zê©¦�I€  �‹ NmÛ¶µêÕ«ÛÖ­[C·€ýû÷§êtõßÍ¥Â:J	P4@JÃ| �p dÀEà �bZbæº*!µJ™©eÒøñãíºë®³+®¸"„FªÝ@ Èeú®SZÀñÇoª [±b…mß¾=•§-À`—ŠìÈ°Æ•Òpß¤‘ €4Âg×H�¾O­ú+äÿL—R Rbµk×¶¡C‡†"šüík_³5Rt�’sd'€   �#ÐwŸÒT@-owìØŠîÞ­èü”XßË —"ä�_áÚâÂ  �< € .2§' ÿë*t¥ëšÄã”-»wèÐ!ù»á†lâÄ‰¦( €  �Ï6lãÝ»wiê°qãÆT!Ñ=€¢ú»êºVºT 0e9	¾/H i€Î.!�bJ®WŽ¿ªü_àRØ_JLyý#GŽ¡þW^yeXñPþ?@ €€™¾U`Ð AÁ9®(€uëÖÙÎ�)ëØ§À*ØÜ¥�®Jl}ƒA ¹H @.^UÎ	'ÐÞ^äºÃ5ÒUÝ»U©RÅŠŠŠìâ‹/¶Ûn»ÍN>ùd«SG‡  @ _% ïH9$uP4À†,EEuoÐË5Ð•L	HY(ÂWYð3 / ñòet¤‹€fÛ#\×¹&¹Z¹Rb-Z´°Ñ£GÛ-·Üb—^z©ég€   �#hÖ¬™wÜq¦Ô9ÕØ´i“mÙ’²ô|Eq¸J]k])+LàûÂ  �À�Èì)&ÐÌ÷wškŠk¬«¶+v«V­šuíÚÕ.¿üòPáøðá¦ç0@ € Žž€¾;U$°_¿~!znåÊ•Á°oß¾£äØ_©NA½]}\›\ª°Í…A 9B @Ž\HNN@Éõ]]ßuÝê*r¥$á¾eË–vâ‰'Ú]wÝeçŸ¾5o®TB€   �c%Ð´iS<x°©Hà¶mÛB�ÀÍ›7ëpåyŸîZº¾æªáZîÚà¢@ CÀ �íp dûäø!p€€*øžàR®Ê
ýÕ­[×úöík×\sMXõWK#Výý
`€   �è;µsçÎ¡unAAA(XZZj»víŠ`ô#¡VÁªÐÑ%ÀjWJvìûÁ  �˜à ˆ	,ÃB …ÔSoœë®ã]òÖÇnZ™8é¤“lòäÉ6~üxZûÅNœ@ €@¾PW�þýû[ïÞ½CqÀÕ«W‡¨€ðP�À.®¾.9 ”°Ý…A YJ @–^8N@•zÛºTåÿ6—Âÿcÿ?­ÕˆŽ;šÚúÝtÓMÖ£GVý<@ ˆ“€:ì(ånÈ�!¡6À’%KL))¨ ” ÕR4€Ò –ºT$ƒ ²�@ì“…,dÂ!C h•_}{ïq]êR®ž¾ cµ&Mš„
ÿ?üáí¬³Î²ÂÂÂÐÃ8Ö�28  @ �@åÊ•­aÃ†!`À€¶~ýú�°}{ì‹òºÇPÄá W;×bW‰k¯ƒ ²ˆ €,ºX*T¡÷8×ƒ®±.åÿÇjºáÐd_þUèO•‰Õ§ƒ   @ õjÔ¨aíÚµ³¡C‡†�ÏŸ??¤ìß{�¾Z¾Ã"W/××*×d	 Yr¡8L$úö×]®.åæÅjšèk•áûßÿ¾�wÞyÖºukVýc%Îà€   �#¨T©RˆèÕ«—ÙÒ¥K­¤¤Äöì‰}>®ùC—"w»Ô%`«ƒ ²€ €,¸H"œ€Bï”ã¯*ÿW¹T�'Öÿ¿ZõWÈÿ\
ý�92Ühè†ƒ   @ ýô�¬Ž<]»vµP\\l;vì°˜£’N€ÁNA½ç»h˜þ?	Ž G$ëâˆ{ç€ÀÑ¨ã/R/Þû]g¸”ƒ«iÕ_½‡Uáÿ’K.	7U«V�uŸ@ €À±Ðwt‹-BÄž¢V®\ik×®ME4€Ò»»º¹–ºÖ¹€A J @†^	õ}{¶k²k˜K¹w±ZýúõC�?MþO8ákÔ¨Q¬ûcp@ € ¢!P¯^=ëÒ¥K¨Õ³uëÖ°sçÎh?ô(JGTaÀþ.¥,tÅ¾Sß Ç �·@ E”_7Éu“«‡+Öÿ¯
#ìÞ½»Ýxã�vÕUW™r
Õòƒ   @ {è»»U«VÁ	 ¾ÉÚ 1Ÿ�îQÔ‘Hu2¨”€-.È0±N(2ì\9dåû÷vÝæºÜ¥/ÔX­N�:vÒI'Ù½÷Þkgœq†5oÞÜÈõ�9ƒC € b# ïpEðÉ™ß§OÛ°aƒ-_¾ÜvïŽ=:¿¡Ÿ”œ *Z¼ÄµÖ{kß% G	Š—A EôrŒë^×).}‘ÆjÊ¼âŠ+ìöÛo·AƒÑÞ/VÚ@ Hµlß¾½80Dõ-\¸Ð¶l‰}a¾¶Ÿ¡Z*zQm‹]8�L € ®Ç �êùf‚ëN—ŠþÅžïß¿»õÖ[C¥ÿŽ;²êïÐ1@ €@.P4@Ó¦MCšŸZù.[¶ÌV­Ò¼<VS]€6.ÜìZìÚåÂ  �4À�æÀî!� ÐÊ·ßuÝèêãŠõÿfÃ†müøñvÏ=÷Ø¸qãB»?ß'@ €@ŽP‘_ÕúéÝ»·mß¾=¤¨]`Œ¦{™Ö®¾®.”3 ƒ ÒH ÖIFÏ‹]C ›töƒ½Åu…KÞòXM¡€×\s�]wÝu¡]…þbÅÍà€   �Œ! ï|Ýôë×Ï4h`J	Ø¸qcÜÇ×Äw ÅµšçZïÂ  �4À�&ðì	
�»ÖuŽ« ñ\l›ž={Úµ×^kç�w^¸ˆmG@ €@ÆhÜ¸±)õO…—,Ybk×ªV_¬VÇGoïRºc±k�ƒ Ò@ @ ³K8ýß;É¥�ÿ‰.yÅc³ÚµkÛ¨Q£ìŽ;î°³Ï>›�ÿØH30  @ ;(%@é ŠX¿~½­\¹2î.r¨0 ÒU‰p‘‹â€ƒ@*	à H%mö�TW“~ûû†«¦+6kÓ¦M¨ò¯�ÿN8ÁªWW]€   �|' ”€¢¢"ëÑ£‡Õ­[7D”––Æ‰E7!E.E@nu-pÅÞ›Ð÷�A 	8 øS€@j	4öÝ�êÒÊÿ`WeWlÖ¹sg»ì²Ëì;ßùN(ü£JÀ  @ HÐ½AË–-­k×®V¥J[ºtiˆHþ>†­î}ÐÖµÁµÂµÝ…A ) € �ÙÚûör×u.Ã‰ÍÔ÷W«ýÊ÷¿ä’K¬  öò±�C €  ?T{`Ý3lÞ¼ÙV¬Xa{÷î�sÇ-}ð^.uXâŠ½¡ïƒ@ÞÀ�÷ H�ž¾Ÿë]WºäõŽÍôÅ}Î9çØÝwßmcÆŒ±ZµjÅ¶/†   @ wh¡W¯^Ö·o_Ûµk—-[¶Ì¶nU¤~lÖÔGèªëZìZëÂ  �	à ˆ.CCÀ	(æ~˜ë×·\ª~›©¢ï¥—^j7ÝtSÈé«\9ÖƒØÎƒ�! @ HÝ;´hÑ"Dè±R6lP¤~l¦ZHŠPšä*×rÄD @L`N@³ïã]w¸”÷¯â±™zú~÷»ßùþúâÆ  @ €À±PJ€º¨“ÐêÕ«mÕ*ÍÍc³j>rWk×2×R�¨	à ˆš(ãAà U¹ëú¾k”Kùm±X2ß_!ÿ'N4}ac€   @ ¢4ùW:€"åˆ¹.€œ �\]]ò6(% Ö">>�¼#€ ï.9'œš�OpMqqÅ‡_XXhãÇ�·)S¦ØñÇojçƒA €   �¨èÞB]…úôéc[¶l	‘ 1ÖÐ=“º(%@yK\;]  �d$4òíD×Ý®‰çbÙ´k×Î.¼ðB»í¶Û¬[·nF‹¿X03(  @ ï	èCé…°={ö„â€›6mŠ“Ks\“´“E®.ˆ€ € 2ôeu±ëvW‡Äs±lT¡÷ºë®³«®ºÊš7×n1@ €  /�†ÚÀ�­^½z¡8àš5kâÜa¼¿K rlqa€@	à ¨ @Þ' Jÿšð×u“+¶yÍš5mØ°av×]wÙyç�guëªk@ € RC@í…U uëÖ¡&€œ Š
ˆÉêû¸j(+vÅv �`Èu8 rý
s~© ÐÉwò×U.y«c1MþGŽi÷ß¿�5ÊªWW�A€   ¤–@ÕªUC]€=zØâÅ‹mùòåq:ÔE©wâ	kOÂÔ’doH= ©gÎs‡€VþU©öf×å®†®XL!wgœqF˜ü«ÝŸ¾x1@ €  �.UªT±–-[†º %%%!%`ÇŽØRõkùyöuÕsÍs­wa€À1ÀpÐxœ€–ßUäï×ù®Xbñ+W®l�:u².¸ „ý«
¯žÃ  @ €@º	èž¤Y³f6xð`Û»w¯)`ãÆ�¶ÿþ8M-•uïÕÔ5ßµÑE›@‡€A <p ”‡¯…ÀZùW>š*ý«ÝŸBÓ"7UÜUßÝë¯¿>ü+(( Òä”€   �ŠÐýJƒlèÐ¡¦tÅ9sæ'@EÆ<Ì{ÕïXÑ—­\\+\ P8 Ê‹—BÀ	hù}¨k²ëDW,“yÔUéÿöÛoÅþôÅŠA €   �L%P£F�Ð–X,°uëÖÅ	 '@{W;×B—œ ±„ø¸rŽ €œ»¤œPŒô…s¼ë^×(WMWä¦üþãŽ;Î¦L™b§Ÿ~:•þ#'Ì€€   ÄA@ EEE!‚qéÒ¥¡KÀ¾}ûâØUÒ	ÐÙ_ìZîŠeGq<cB �p ¤“>ûÎ&Ê;;Íõ}××\ª¹É{®Iÿ}÷Ýg#FŒ0ýŒA €   �l!P­Z5ëÐ¡ƒõéÓ'D,\¸0Ôˆáø5�iãêéZçR4À^† €ÃÀáWHÐÿ““\S\\±”à¯S§Ž�?Þ&OžlTúwÊ  @ YI@Z´ha={öN€E‹ÙîÝ»ã8Ý£µp©.À×é ƒÀ¡à 8ž‡ÀZé?Ù¥•ÿþ®XþÏ4mÚÔ.¹ä»õÖ[M=uUPƒ   @ ÙJ@÷2………Ö»woS€êlÛ¶-ŽÓQ}¦BW‘Kõ Š]D8#Ëdæ`;â9d!åøŸåºË¥•ÿXúïµnÝÚ®¾úêPé¿}ûö¾€   ä-rôíÛ×”0oÞ<+--�ãÄ´r¢H€n.µT›À=.ø
 _Â�HPq™s\÷¸z»bY’W›¿o¼Ñ®¸â
SÕ\€   ä�zõê…H€ºuëÚÜ¹smÃ†qœ¢îÕš»T Ä5ÛEa@‡€A , eið(ì_+ÿ·»ô%ËäðàÁö½ï}ÏÎ?ÿ|kÒ¤‰ïƒ   @ ¹I V­ZÖ¥KSkã5kÖ„1œ©îÙšº:¹ä˜ç"À!`HÀ�$ÁÔñ�&ÿw»ú¸b™ü�5Êîºë®Pñ¿aÃ†¾€   ä6�Úµk[·nÝB›À•+WZqqq'œŒP:Àz—ºÄR�0ŽƒgLÄM @Ü„?›Ôöƒ½Âu“K+ÿ±Ø˜1cìž{î19äÇ  @ €@¾P‹cÕ<R«ÀåË—›ÚÆdÊ­ìáRÀLN ‡€A  8@ †o&ºnpéË";õÔSCØÿÈ‘#M_€  @ È7É6�Íš5EU0&kæã¶s)`Ž‹t ‡€å7 ù}ý9ûTíÿl×®XVþ+W®l'N´»ï¾ÛFŒÁäÿ wþ…   @ O	T­Z5¤tïÞÝ6mÚd³gÏ¶ýû÷ÇACN€®.9äi ;€CÀò— €ü½öœùŠÁ¿Ôu½KÕþ#7µ½ùÖ·¾ewÜq‡õë×ÏäõÆ  @ €@¾HFÙ–-[‚`ß¾X
÷+ ³K Ÿ¹p8,?	0ÉÏëÎY  V§»nqiòyÁ?»9óÌ3í†n°þýû[¥J‘ïÂƒ   @ ÙI@÷Fj…Ü¦M›	 š »wÇ’®/'€ÒVº	‹§ÁÇÅ �Ñp dôåáàb$�œüßãûèëŠ|f®ž·ZùWÁ¿^½z1ù�ñb24  @ ÙK@N€–-[Zß¾}móæÍ¦š »víŠú„t¯WèR:À*×|N ‡€å ùu½9ÛT}ïL×í®þ®È'ÿjíwñÅÛm·Ýf�:ubòï�1@ €  p(r4iÒÄz÷îmÛ·o·¹sçÚŽ;õòŠ</'@'×—œ tXþÀ�?×š3=@ ªoÆ»&»ú¹"Ÿü«¢íE]d7ß|³µk§H3€   @àhh¥gÏžaò¿`ÁÛ¶mÛÑ¼­<¯Ñ½_W7—"æºˆpX~À�×™³<@ ²oNtÝíÒä_?Gjò\ûÛß9ÿLþ#EË`€   ä	�˜º(@é ÚFlr¨;@××BW,-|\E @F]&FZùåº×5Äùä_+ÿ—]v™ÝrË-Öºukß@ €  p,	 š ;wîé 1F¨;@±KŽ "–Ûp äöõåì�—wŒKaÿC]‘þÝ+g­E‹aòÓM7Ya¡RË0@ €   �Š¨[·np¨  Ò¶nÝZ‘áö^Ý#* “k©K‘ rš@¤¡œ&ÅÉe3�A~ðšü�p©ú¤Ö¶mÛ�óíµ×ZóæÍ#›Á  @ €@>¨S§ŽõèÑ#tX¼xqh1E…¶Lh¶oWD<>ÃA £à È¨ËÁÁÄ@ ·�©É¿rÿ«G=¾&ÿW^y¥]ýõ¦ €   @ Zj­<`À€0¨jlÚ´)ÚˆUþ¦Â8åXõ™B @¦\	Ž#júÛîáºÝ¥ªÿ5]‘YåÊ•C…ÿ«¯¾Ú$å©a€   @ ñ¨U«VHÐ=Øüùó­´´Ôöï�´nŸêE©(`#—:¬wEºƒ@Ú	à Hû%à b"ÐÉÇ½Ñu¶«NÔûÐÊÿ…^h
ûW¥Z€   @ ^5jÔ-·lÙb1¥È	ÐÞUÛ¥H 90ä 9u99™�6¾½Þu‰«ž+RkÕª•}÷»ßµë®»Î5’“ƒ   @ H�š5kZ¿~ýlïÞ½¡;ÀæÍ›£Þm°›KÎ€Ï]¥.9C @Î\JNÄ	¨’«Š¸\åºÒéä_Õþ™ü;U€   ¤‘@2`Ïž=Á	 ˆ€ˆMu£”Jº×õ…+òø˜ÒB @Z°³Ó˜ø¸ç¸nvE¾4_PPÂþÕê�•ÿ˜® ÃB €   �£  H€^½z…‚€ª	C‹@Eôt­u-rEÞƒÐÇÄ �r8 RŽœÆD@«ýçºTô/ò^|�7¶‹/¾Øn¼ñF+,,Œé€   @àh	Ô®];ÔØ¶m›Í™3Ç¶oß~´o=Ú×©@/×:××.�¬&€ «/Ÿ  
ÿªô?ÅÕ.ñ\d­ökòë­·ZË–Ê0À  @ € 2�@ýúõ­wïÞ¦4 9vìØõa©Ú³"–¹æ»ö¸0d- Y{é8ð…g�uÝáîNœ  @ IDATë*rEjZùWµÿÛn»�É¤d€   DC ^½zÁ	 ‚€Jˆ!@©¥ºÏ,v-v©6 �¬$€ +/�  ¢#]“]ý]ú92«S§Ž�þùvóÍ7[»v‘Dvœ@ € ò�€"ŠŠŠlãÆ�öÅ_ØîÝ»£FÒÔlïZà*vaÈJ8 ²ò²qÐ	C|«°ÿ®Hÿ–«W¯nçž{®Ý~ûíÖ¹sçÄîØ@ €   d*¥mÊ	PRRb³gÏ­#<V-4µpµr©Àr�¬#é¤)ëÎžÎf*Èr§kœ«Z”'R¥J›0a‚Mž<9|‰D96cA €   ÄG I“&áþmÅŠ¡&Àþýû£ÜYe¬­«±k¶k�ƒ@VÀ�U—‹ƒMèêÛk]jùW#ñ\d›qãÆÙ½÷ÞrÉ"”�  @ € RB Y³fÖ¥K[¼xq¨	ñN5êèÒÔ<W‰ƒ@ÖÀ�5—ŠMP‹¿+\—¸ê»"µñãÇ‡VC‡µÊ•åäÅ  @ € ²�@AA�µjÕÊ6mÚ"">~MþåP[@ElqaÈ
8 ²â2q�	šð_äºÎÕ,ñ\d›SN9Åî¾ûn6l˜U­Z5²q€   @ µ´�Ó¦MëÐ¡ƒ)@Ý"¶Ú>ž:lr}îÚéÂ �ñp dü%â ô·z¦ëW›Äs‘mFŽÉä?2š@ € ÒO@N€–-[G@qqqH	ˆø¨êúx]\Ë\Šˆ´à€�‡A r8 "GÊ€18ÎÇ½Ù5 êñîÕUWÙ˜1c¬F�ÈK
D}¸Œ@ €  p”äP:@íÚµmùòåAGùÖ£}Y#¡¤z K�öM¼é"€ ]äÙoy¨Íß�®“\‘&æ÷éÓÇî¼óN;õÔS­n]9q1@ €   �\"P­Zµ�
PXXê¬^½:êÓStªœ +\K¢œñ % QÒd¬8¨Ýßí®S]‘.ÏwìØÑn»í¶Ðò�É—Ž1! @ €@fP”g»ví¬^½z6sæLÛ°aC”¦ª.ÚFI•±b!€ ¬úûŽk¢+ÒŠÿê{é¥—ÚE]d6Œèp€   @ S	T¯^ÝZ·nm[·nµÏ?ÿÜ¶oßå¡ª3€ºU©àL×6�Œ#€ ã.	” ÐÀ·º®v&ž‹dS¿~}»âŠ+ìê«¯…a"”A  @ € 2ž@�:u¬sçÎ¶k×.›5k–íÜiñþZ@‘ ¥®/\‘îãa¨0 FÈ 1¨écªÝŸ&ÿ�¢_á_ßþö·í–[n±¶mÛF94cA €   d�X·nÝlãÆ�Á	°wïÞ(�ZQ«í\
/˜åÚãÂ �1hvž1—‚)C@Åþ¾çêQæ¹
?¬T©’�vÚivÃ70ù¯0Íì`Ïž=Áë/�ÿŽ;Âc}ñïÛ·Ï´•öïßoUªT	Rõ`=®Zµª)t°fÍšAzŒA €@ê	ès\Ÿßú—´’›üüN~–ë¨¾ú9®Ïm-ès\[}®cùK@Aº'\·n�=ùä“á»?Bº‡Õ½¬Š>á¸�
à“¯Â bý|<­üw‹r\Mþ�?þx»ñÆ­k×®QÍXH`Ó¦MVZZj›7oÒÏI)ïO7ŽÚ&ëfR7�»wïþ€n““Ý,ÖªU+´Rø «��jHh%A�•^’‚üÃà�  �¬  Ïc}†ës[ŸÓz¬•Úägû¶mÛ¬¬ô™®÷è³<)�¨>¿Uý=ù9®‰¿ZÁ••>»5j>»UX?ë3]Ÿír c¹M@÷„º7\»v­½ùæ›Q;t/«{ÚÅ®Or›$g—M*eÓÁr¬9O@9SS\ç¸jGu¶šü6Ìî»ï>9r$ÿ¨ÀfÀ8ºÑÓM¡¾¸×¬Y¼ø«V­2I-~’Ïëgý~Ë–-‘µnÕR¨E‹Ö¬Y³ æÍ›‡~Ãê9¬Ç*8Ù´iÓ ºMDŠŸÁ  �  ÉûúõëÃçµ>³õÙ­Ù•+W†ÏrUj×sú×sZí�Òä hÙ²eø¼nÜ¸qøüN~®ës\�õù®ÏrmqîFI?3ÆÒ½Äë¯¿nS¦L±wß}7j'€
þÙuŸkQfœ1G‘ïp äû_@æœ?”[]—¹Tý?2SŽ×ý÷ßo§Ÿ~zù‹l`J9­ÐëQ7‡+V¬°¥K—Í�;×æÏŸo.Œº­Ï1Ÿ£Vœ:tè`j7)uêÔ)¤ž´jÕ*8tc‰Cà˜ñòF@ K	(d_Y}–/_¾Ü/^l‹-²Ø¼yó‚ôYŸ	¦H/}ŽwéÒ%|Ž«pœÂÆ“^mU€e?ý]>ýôÓ6yòdûâÕî‹ÔÖúhÿéú©«$Ò‘Ç@ À1@ã-‘¨á#ªèß÷]­¢]+³·Þzk¨ú¯°>,û(ä3y£¨›CµíÑ„ÿã�?+BÊ×—%·™x†ŠB‘)� gÏžÖ·o_ëÕ«Wp
¨'q2j ùºL<Ž	€À±())ù‡ÏqU^×g¹¶ú�>¿3ù3\ç�ü|Ö¤_aã½{÷ŸçrÈ) HE{aÙK@iƒ¿ûÝïì§?ýiˆ6‰øL–ûx?pý·‹Î Ãe¸òÀP>^¼:zú<Ù%¯h�(‡WþÞ¤I“BÅ¾”£$ÿX
ëW¨§&ü3fÌ°™3gÚ|`Ë–-ù�ñAü{ÐÍ¤" `ƒ
7“Z]jß¾}p(‚ ƒ  ��TˆOŽ[Ej):ëÓO?Ÿã}ôQXõÏôÉþÑ2×ç¸î5>ÇûôéÚËµiÓ&¤$�G;¯K?Eþìg?³‡z(¤F|DŸûxŠv}Îu`õ"â0Ž† €£¡Äkâ" ê:]šüïÒÏ‘˜
úœ{î¹vÇw˜VX±Ì' Ï»&ø
½ÓªÐûï¿oo½õV(ú”ùG_ñ#T=¥«|ýë_·�†&¥hU‰JÕçË€@ü4yZ²dIøŸ6mšIŸ|òI(äÿÞÓ¿”`ÄˆÁ¹«Ït9X„Hÿµ)Ï(-åÁ´G}4ê´Â}~oºäøÐ¥Ÿ1¤œ €”#g‡e´öÇ÷»"-ú§•ÓSO=Õþå_þÅ:vèh•*óg^†yF=Ô*�Vû•ª�þ_|Ñžyæ™8¼îuÞG:­)Uà¬³Î²Ñ£G‡ÜSÝ@’kz$rüH5åëës¼¸¸ØÞ~ûíðþÞ{ïåÍ¤ÿP¼Õ-føðávòÉ'ÇnëÖ­C·Ä2›Àþ}ûmá¢…vÓM7Ù_ÿú×Ða"Â#Nœìc.‹p\†‚ÀQ`ftÔ¨xaÄêûx×»®qD5¶&NC†±_üâaKŸ¨ÈF;ŽŠí¨¢³Büÿö·¿Ù³Ï>ÂDUÝ9SŠ?E{ÆåM»ª6­ÊÓú›VKmµš¤Vƒ  �tØ¾}{HÕRxÿË/¿¸Ë—-·]»wE=aJçiVhßŠÞÒç¸ê�;ÖF�"ô³¢°Ì% 4¥ÞpÃaqÚÊ?ó_¹þÕUš¹8²\%€ W¯lfŸ—ŠþMpýØY|¾¾h»wïn?úÑ�lÜ¸q„Mgàß€Úð)·__ª�?þ¸½öÚk¡—sÔm�2ðÔ+tHŠjÑMd�=BT€n"U/@©.¤T-o† ÊA µ¥Ïq­öÿùÏ¶?ü0´XÅy{x�ZùW!ØãŽ;Î&L˜`C‡)Šúg±âðìÒõ[µ|þùçí®»î²Ù³gG]ƒh±Ÿ×í®©.Š¦ë"çé~©2•§>Í§ÝÝ÷ÿO®ž®ÈœPjÓsýõ×‡/V}Éb™C@7†
ó×éO~òû÷ÿ÷PZ+H{÷îÍœÍÐ#ÑM·nD5¡ºŠšØºukÈ+UwÝXRl*C/‡�!°cÇŽÐ®OÎ[9ÚÿøÇ?†È-}Žkµ;<1’³[-_yå•ðY®ŸUçEé8sÏ/¿•cFQwº§œ3gNèXáq4ð±”
ûŽKRF @ÊP³#' É~¡ë.×‰®ê®H¬Y³fvé¥—Úå—_n´û‹i$ƒèæFU 5ñWA�?üááKT7Œ‡ÓEr¼Ù0ˆ&6l…µä_U¡VZ Ž€l¸‚#²‹À¶mÛláÂ…öÄOØ½÷ÞkS§N“X}¾ó9^þk™tèª`âôéÓƒ#@Ep	 ûågç;ô½ªˆ;E0ªu¥þ?Ddº'nâªãúÀÙÀ>�ÃÀpX<ü2bšü_íºÀÕ0ª±kÕªegŸ}¶Ýzë­¡íNTã2Î±ÐjµBDU<G+E¿ÿýïí³Ï>_ ¬ø;×²ïT1V…íW_}5¬Lèæ±Aƒ!] ìky@ ¼ô£Õê‡~Ø&Ož&þ,0VüËKòà¯—#@QŠŽS×¥T(²Ku_pœYºžUÞ¢¢¢àpW§"ÝãDdª©( 9>wmuaˆ� €Ø³ƒy8¿éRë9"1yÊO8á„°*Ñ±cÇHÆd�c' ÉýúõëíÍ7ß´ú§
}t•7'Ï9!¢ÇÎõpïÔ*œúm«‹‚ÂJKKK­yóæV·n]V’ŽßA % ”-9µâÿƒüÀž|òIS[4MV±xÈÙ¢h.9T#Gß—úW¡@êÄÃ¼¼£Ê)£Ö¼r èÿC„÷4º?.r-wÍqívaˆ• €Xñ2x‚@eßvÝçê”x.’�ª¢ßsÏ=6xð`¾$#!zìƒè¦ñ£�>
9þ¿þõ¯Ch£Â#ü’<öƒËƒwÊPRRb3gÎ7‘
[lÙ²¥)B†ú yðÀ)B 
o~ã�7‚W+ÿšìhÅK9’sçÎu^”â¨"°|Ž§æn/ŠÎÐ÷ªê,[i¿º¾ßö®]rìwaˆ� €ØÐ2pòl~ß5Â%g@$ÖµkW»å–[ì”SN	¹Ï‘Ê å& Uÿ¥K—†‚P?þñ�C�ºÕ«WSÜ¯Ü$£yƒnÖu=¦M›Ò.´ŠTPPÀÿ‘hð2
r’€¸šì«@ëÏ~ö³ðù±qãFrüÓpµ• T ¥[¨Î‹¶mÛ¶©D¤á‚”Ù¥ø·nÝ:mTZ£œîZS«™ëc×ºÇe(ü8 þžˆ˜@{ïZ×Y®š®HLUs'Mšd—\rIXáŒdP)7…ö+Ï_ù¡�=öX¸QÑ�$–~Š¾˜7o^¸�ÔªR«V­B¡@n Óm8dUeÿ)S¦ØsÏ=BÑ©Õ’þ+¤<sM0UxNÑuŠ Ðä“¨®ô^µåU*€Rbä�³&"ÓY+WU×®�.±ÀVMPH“òþå h”x®ÂåÄ�?Þn¸á†Wá ÜÖ¯¸_þò—ö›ßü&ô�ŽðK°ÜÇÃN@7ñª4­:³fÍ
ÿ_ä ÊôÁyñ,ò‰€&˜
eþùÏn¿ýíoÃgyþ™÷ §ºê|úé§á³¼E‹!gnú®•R2Ú·o¢íäh�páC=¬;º”_ 'À.�È	à ˆ)&¨¢éñ®É®‰ç"ÙŒ;Öî¸ãëÖ­[$ã1Hùh5ù…^°x ¬ú/Y²„<ÿò!Lù«0þüà¨‘ó¦C‡!„‘œÒ”_
v�Œ °iÓ&{ôÑGC®¿VýUôË\JPJ†6Š�iZÕé±ôPÇ¥f‡h»�BEÛ¹f¹Š]"'€ r¤˜  ÙùÝ.9äˆÄ†&ÿÇwq"!zôƒhâ¸jÕ*S�¿û·¡åöÃ=úá•ÇD@×oÍš5¡H œºyQ8©Â1@ ?(*H¹þúW¾ÿŒ3LN],;$kîèº©X >Ã›6mJä4]>¥£ªH£¢ t="4ÕP»ìO\Ôˆ,C À�	qhéƒ^îú–«zT;P¸Õõ×_ÂÿUáK­>¨ÍœZB=òÈ#¡7´žÃ²�€¢T]ZE•NÓ¹sg«QCQ‡ �ËòÿÔSO™Šµj+‡ –�Á¡üódj—>Ç‰èJýµLÖe�#]x¥‘iá¬�k›K© ›]"#€ 2””  	ÿ)®ë\…‰ç*¼©S§ŽMœ8Ñ.¿ürkÔ(²r>®|@7�¯½öšýó?ÿ³=ûì³Q~Áå¾Œ<G]SÝü/Z´(tkPN)ÿ¯2òRqPˆ„@ii©ýùÏ¶ý×µwß}7ÊÂe‘ƒ”Ÿ€òÎÕñEíè4Õ"	)åçXÑw¨¦Ž¾C!©ôŒëè~ºµk‘kŽk¯ƒ@$p D‚‘AÊì�ïqõ)ó\…Ž3&„þËË�¥Ž€V‹ÿô§?…ÉÿK/½å[êN‚=’@2%@¦ÔÛX1@ ·¨�Üï~÷»ö¯UJ*üçÎõMäU4€VŸ»téÒ»rç³ãLêÕ«gmÚ´	© J±‹Ð´âÕÂ5Ó¥Â€"!€ Œ’  ¢%7¹Nu©�I$vÂ	'Ø�7Þh#FŒˆd<9:*î÷«_ýÊzè!ûä¥¡a¹H@­UXJÑ Ö®];òIsñBsNyI@íã½õðÃG�£œ—<3õ¤×¯_BÐUÌ±k×®!/=S�5W�Kõ I'‡º
FhJ«Õ|íS×¦Çe¨<&€ �/~Ä§®–ã]“\õ£[V¯½öZ;í´ÓLmW°ÔP‹?µ÷ûÃþÚý¥f¯ì%]” k®Æ††PRZ¦ëj°_DC@Ž[9qŸ|òIÛ°aC4ƒ2JÆPGÕwÑVÅUœŽV�©½\Š¤sýßS�†ˆLjŠXìšëÚåÂ P!8 *„�7'¨XÉ(×Í®Èzó©Jù¤I“ìâ‹/“’Ä¾ØÄH@¡¡ÊaÓŠÑïÿ{Óª–JªPáÙ³g[ýúõ­cÇŽÌ�KÏYæå «nËÏ~ö3›:uª)ÊËræ*ÍCé“Î\:½¤îÚk¡JWê¬ñé§ŸFÙaC‹lª«µÀµ0ugÄžr• €\½²©=/MúúRT»•uÂ„	¡ê¿òª°ø	è¦ñÍ7ß´Ÿüä'!ï_«XþX½zu¸�TáM9Ô) ƒ ²ƒÀ®]»ì™gž±|À^yåÓÏX~�#?™ÖÕ¤IëÔ©“Ñ•º¿}gªžŽŠ3jA%ÂŽI*¨PXÕ 5`ê.iNî	@N^Ö”ž”ú”^êºØY/±‘#GÚu×]gC†IéÉäëÎ4ùýõ×í�•þµŒå/…«W¸V3ä¨[W‹ �É´êøôÓOÛ�~ô#ûàý¢œxdòisl‡  	èÂ…C$€RèpP1<-Ç‹¢XUK)âz mýpÕkp†‹Uš®]¾‰ _®t<ç©¼¤1.µü‹l™^­lî¼óN=z4yÿñ\·U“ÿ·ß~;¬ü«Ò?�@«HºiTeiE`€@fPÄÖóÏ?&ÿ*ü‡A@TP©]Z•Öçx�‘­Ó øš7oœ Ó§O�²}².`3—ZHû]ÊM @¹‘ñ†2’¡ÿ#Ë<W¡‡Ê=VÑ¿óÎ;/ä!Wh0Þ|DZ1R®¨Vþ™üWÞ½@EŒfÍšeÕªU³îÝ»“�wœp6Øºu«=úè£Á‰ûñÇgÃ!sŒ)$ â®ŠèR«:uÀ	�øŠ SQ@¥dÈ	 û­ˆ¬ÀÇ‘#@Q ¤D5ß†Á�oW<ºóÕÐE.…þGVž_Õþú¯
¶X¼ô¥¤œÿÿøÇ!W4Þ½1z¶P1U––sN+HµjÕÊÖSá¸!�s4©P¡¿ûî»/äçÜ	rB‘PA_¥¨Õ«jÐU)¬GDß—ŠP€
ìFhJPk�/\[#—¡ò„ €<¹ÐŸf5ï|×®VQ�Ý»wo»ýöÛmðàÁV©’`qÐäÿƒ>“ÿ^x!®Ý0nŽ(--a¤Š(**Â	�#×•ÓÈn;wì´^|Áî¿ÿþ¨'Ù†£?(�uëÖÙÒ¥K­iÓ¦Ö¡Cœ ¥ý“�5
© 3fÌ°5kÖDµ-¼©+€z*€ÂM;z8 Žž¯ü;�aþð×À¿?U±Gª˜:eÊ;v,…j*†òˆïV�?MþUí_£0�’’ÓŒ
õìÙ“›Ç£�Æk ­ü«Ú¿
þ©ç8�£!°bÅŠ	PXXh�;w¦;ÀÑ@«àk´ %Þ*¨{¯Í›7WpÄ/ß®Z �]
-Xúå³<€ÀQÀp�xÉ?há?Ýä:Õ¥"€6›4i’]tÑE¡Zm…d€ÃÐÍâƒ>hùË_û:~	�¯P:ÀgŸ}ÂH•@éW	ñ3â' ^ï/¿ü²}ÿûß·™3f][âgžK{Pa@uPÁeõ¬¯R…©@Ü×Wu”Úº}ûvS‘N_ŽÈZú8
™�æÚÑ˜“ø_Ÿ9ÂSTÈÑD×%.y#±aÃ†Ùm·Ý¾Œ"�AI@_ü¿úÕ¯ì‘Gá¦ñ�”øÅá¨0à¢E‹B1©víÚqóx8Xü1P.±Âþßÿ}Û³wO{`È\' €:G¨(`‹-H»LÁW'Õ`Ð"ÌâÅ‹£Ú£âš¸V¹f¹öº0‘ €#"âe÷ÇWº¸"IÒ×Ï½÷ÞkÃ‡g"Qt5qûíoaZ‡Ê˜N@¥Ô"°W¯^aUƒš~Á8¼œ °ÿþÐW\\Ï=÷\”UÅs‚'Q>*îªi¥t)<‹Ÿ€ê4lØÐÞzë-SD]DÖÀÇ©éZäŠÌ³Ñ±1L†À�¡&«¹Ó]®“\*XakÜ¸±]sÍ5vÎ9ç„ö4�I@_4�=ö˜ýüç?7å b¨…«˜ÑòåËmÀ€¡¨N€Šå½82Epýâ¿°ÿùŸÿ‰2�øÈ;æ9I@ŸãŠ&Ñgw¿~ý¬nÝº9yž™tRJ·P= 9óTSG˜LrJ¨ãzÇ™gÁÇÂr” €½°Ÿ–þN¾íºÐ‰›¸råÊ6jÔ(»é¦›¬M›6.Ã•% /ùgŸ}Ö~ó›ß„/œ²¿ã1Ž•€þ®Ô_Zÿ—Õ¹ƒö€ÇJ’÷AàÈ4QxòÉ'CñÖ�7ù¼GA@�Ô¢N­êúöíK$æQ0«èK”
 ÞŸþyè®#g@¦…¹F®×G®Hõq°%€ G/lÄ§ÕÇÇ»ÙÕËIè¿ªþ«€Ñ AƒøÂ‰øb}u8å›ýô§?µ7Þxƒ¼ÿ¯Âáç
Øµk×—m¥ÔP…Ž0@ Zš¤)døž{î	ÅÛ¢�Ñò�ÀÖ­[Mi]*
(É©‹ÅK ~ýú!@÷ej³‘)„C’`uDc2LŽÀ�£6ÂÓRnÑ­®Ó]*XaÓß�7ÞhgŸ}¶© …û?ðÀöÔSOEYu6¾fä¬# ›—Y³fY·nÝ¬cÇŽ8ô²î
rÀ™L@«ƒ_|ñE˜üOŸ>=„gòñrlÙI@÷
r("S"¥+Þë¨T EÈ¦M›U=-ÐºäÁyÛµÓ…Aà p O&hÂQBQP©V­š�rÊ)Á €X|¶mÛf=ô�ýñ�Œ²ØL|ÌÈYK@&UUzèÐ¡¡Ê17�Y{)9ð#°téRûå/œ¸Š¸Á 9šæÏŸoºo2dˆ5h µ,N5kÖ4EÃ.\¸0°WZ]¦T ¥ênvÍpÑÀ!`ÿ— €ÿË„gþN §?Tá¿Þ®
‡þkR Ïò”)SBá0ÂÌþ:êG
�:uªýçþgøb‰z|ÆƒÀW	¬[·ÎªV­Òz”ãˆA # Y}Ž«uë†*6ï†À$ëºhò/'€V©±x	("V�”
 GzDÖÐÇ‘à}© AÍµaøß�kW4ºóQlþ®“]‘„þkÅÿŽ;î L¢»PiæÌ™¡Oô|@ÞÿÁ ñ\ävïÞzwèÐ!¤T¯ÉÇFäÇÉ€ÈZ‘}ï½÷‚Ã|Ñ"u÷Â ?E $ëtéÒ%þæù´Ö´iÓÐ	ëã�?Ž*ZSvr hŽ÷ºk·ƒÀ?Àð8ø!A@ã]Wº"	ýW®¿Úý]{íµ¦öX|´RôÃþ0Tþ×¤ƒ@ªlÞ¼9„3ª¥TÛ¶mÉ#Mxö“s/^l>ø ½ùæ›8qsîêfö	©ÅëÎ�;­gÏž´xMÁ¥R*€êç¨Í§Ú2Ftß¦T€¦®Å®9.º8ìïp ü���çPýDïtrERVÂ&Ožlò(“ìTc2­ýå/	¡ÿ
ÉÆ �jr@iUC>êÕ«—êÝ³?d=…þ«pëüÇ„ÂlYBœ@VÐ}ÄÚµkƒãiøðáF4Wü—Omt	 nrÀDdú®åzÃ¥š ¾$€àK<HPòî$×D—Ú‰TØTéTUÿUüOE ±xèK{Îœ9¡ê¿Zÿég©& ú*\Ö©S'ëÚµ+ÿçS}Ø_VÐÿ}~«M.¡ÿY})³úà•
PRRbJéÒ7ñ^Nñ•@ÛS´€§T€í®]„„:ì  ü%”%PÕéºÑÕ¡ì/ŽõqÃ†mÂ„	ö½ï}/:9Öqxß‘	(üú¿øEX9Ú±cÇ‘ßÀ+ ­`*œQ]èöd†ÍIsçÎµ_ÿú×öâ‹/úŸ“W8{NjãÆ�¡Gý°aÃ¸KÁeS]Ê^¾|yH¥‹è>N‹zÍ\JP:@$­|,Ë	à ÈòñáËS8Å5ÜÉßÆÀ�ÃJFçÎ�ñ G|±Ê§ê½Ï=÷\hû§/é& 9 û÷ïo
oÄ  �ÃÐªëO<ªþë1�tH¦Ô­[×FŒR»Òy<ù°o±–`úôé!’.¢snäã(¢÷,AÍöa"ÉïÎv  Õÿq®a®HÊwkåïÜsÏ…dŒcûG“­Gy„�ÑØ3py	¨ˆ”êQÌš5+ª¢Få=^�¬" .ýŸÑÊ+�L  Öt/½ô’}öÙg¤¦à‚è^YÅuïaôœîéuo¯{|Ýëcˆf•Ž9A «Ÿ…Vÿ{¸*ìÒŠßøñãíúë¯7õ”Åâ# œÑÇ<þ‹°�l|ÌÈyC@í¤ÔKº{÷î!¿1oNœ…@9	¨xæŸþô'ûÿïÿÙž={Êùn^�ø$?ÇU°F�ñíˆ‘}g¶oßÞŠ‹‹C]§ˆ>ÔÚ[]ÞqQ!:�Îï*<ÑËo|9sö5ýL.r©ê$¡ÿ*þuùå—[aaaÎ@ÊÄQè¿¾$~øáP°'�‘cÊ_
!ÕŠæ«¯¾jÛ·«ŒÀ´iÓBWDy¿ÛÏAà˜lÙ²Å^xá{ã�7¨KqLËÿ&Ý;ëZ÷Ò™îíu�¯{}ÝócyN @žÿøé+4hˆë—<„¶‚‚;ãŒ3LùÿX¼víÚeýë_mÆŒ¦H ™D@ U’~úé§CQ£L:6Ž™B`Ù²eÁI¦à2‘À’%KìÑG5¢Swut­{iÝSGdºÇ×½¾îùuï�å1 y|ñ§ÞÒ·×ººD�BmþF�mW\q…¿¢ z˜14¹š?~øR&gô0 øUÚ	¼þúëaõˆ(€´_
 	üíoÅÿÑ…A 	(
@‘\êS¯{,~J¥Õ½´î©#l¡­{}ÝóëÞËc8 òøâû©«4·¼�c]µ]¶.]ºØ…^hmÛ¶­ðXpxšL©b´Šó°úxVü6½ÔðÉ'Ÿ´Ï?ÿ<½ÂÞ!�a´²ª"kóæÍË°#ãp ð�Ö®]jT(ªKÝKëžZ÷Ö™îõuÏ¯{ÚóD5‡Á��W-šc®äÃ¹.qÕsUØê×¯o§Ÿ~º�5ªÂc1Àá	$Wÿ§N�úôþÕüé'ðÎ;ï„( ¢UÒ-8‚Ì  Ïñ×^{-(3Žˆ£€À¡	¨³‹>Ç°{÷îC¿�ßDJ@÷Ôº·Ö=vD¦{þK\šh.€å! yxÑ§¬Òügºz»*ü Ö%ÊW:ï¼óýO Žs£/âd^5áxq’fì¨¨¯¹êU|ôÑGQÉ8Èj+W®“Õ À �ÔrXµ ´ÅRC@© º·Ö=öÿgï<à¥*Îÿ=€R¤÷^.¥)M”&MÄöB¬(h4±—Xb7š¨‰‰&Q£1–cŒñ÷O4±boQAP¤X@i*þç{î½Þ\¸»;³»çÌyæó9w÷îî™3óÌìÙù¾óÎ;ž¶ÔÖ˜_ci ¶é*L3Æî* b×$)P{í	:Ý^¢�vîÜÙxà�fàÀ�©@š/"Á/·QÍþ¯\¹2Í(¨{ÂhæH3žÄHXÃQÜ¼xòÉ'�âc� �Ú¥B»<ûì³lWYÀFÓØZcl�µ=%�ý¥¤¤	H)#€ e^VÝûx„=¼,Ô¯[·®™4i’Ùo¿ýÒI³Àµ–ë�‚ñÌ�;—`<fÏåÜÈsåé§Ÿ&€FÎ€€fPe›7o^ µ¡
i"°|ùò(þ;¶Õ5ÆÖX[cnOI@Z@š€”2 RÖà¶º
ú±›= ¤¶=œS¹e²M›6Îy‘ÁÖ	hö_Ç‡zˆÙÿ­£âÝ˜xá…¢u¤_ýuLKH± �ÿùÏ¢ïAþ¯Ä à—€<¸äð¿ÿýÏ°s…_¶[ËMclÏž¶Ò ÒÒÜü ßÃ `£n¥J5ì{Z÷s¸=Ä95kÖÌì»ï¾fäÈ‘Îy‘Aõ´ŽZ³FsæÌÁý®z\|"†P®ÏóçÏ�aé(òO@»b<þøãæ•W^ÉÿÅ¸ò@@;hg�IH…# ±¶ÆÜ{{JÒÒÒÒ¤”À �’†.«¦î
ú1ÄGµ·Ùf3aÂsÐA='åŸÀÇl~ÿûß\ïòÏš+ä�€–h)	i$ @˜2â²}k[?Œ:Ëˆõ·¿ý-ŠGD âÂµ©ÆÚskìíqÜ-M màÍªP8"\)W r%—¼óÔÖ;ØC_òZ>Šß®]»h=RII‰�ìÈ£rµ{ÿý÷£ Q
ÄC‚@R	(ê¹DÐŠ+’ZÊ�œH,=ÿüóæí·ßÎé|N‚@\,]º4êËl	XØÑ˜[± 4÷”¤	¤¤Ð…ž Æ=:î-ä¯|ímVú‚wó‘¥‚�Œ;Öì±Ç>²#�(â?Ô3 ÅGA@ Å A M$šÔïH��$Ð˜D^ ìFTøVÔØ[cp�¥¤¤H) € �l«¸­=FØcš=¼øê�1ÂL›6Í´nÝÚfI*��>ú(ú±]¿~}!.Ç5 �WAŠ@0À¼b&ó˜ÐÒ—W_}5f¥¢8Èž€Æ"ZÎ%o¼ ²ççr†ÆÞƒk,î)IH#(CiRà0 ÞÀeÕÓV{ÛÃ‹Z—ÅQÖÇÑ£G§ƒ^j)‘ôÖ[oE?´¬·‹AƒPg«V­2¯½öšY´h‘s^d �$Ð2®gžy&º—'¡¼”ÕÐ2®þóŸÄ%ªTÞ×\cq�^ ÒÒ
Ò¤À	` ¼�mõ´¶gg{LòUUÝpvß}wS§N_Y’O5ôï¿ÿý¯Ñ>ê$„BàÝwß�Œ ¡Ô‡z@`kÃE}ž­Ó¶F‰÷’D@Á }ôQ£]H…% 1¸Æâ“{LÒ
ÒÒ¤€	` ¸qËªÖÇ>l�¦>ªÚ¡C3uêTÓ§�²%Š€¢ÿkÛ(Üì
Eœë‚€¼Z4#Š *m®QlZöBð¿b·×÷I@c’7Þx#ê×,çòI6³¼4×˜\csOIZAš�A¾' qÍ@\[ÆO¹êÙl´žgœ�ìjÖ¬iöÞ{ï(ðˆž“
C`Íš5‘Ë¨f�H‰€�ÿûßÿXR£R—*	hË?­—~ç�wª|Ÿ!�T£È�Ë®.…oA�ÅPcs�ãriiiR Pq�6lYµv²�ØÃË—xøðáÑM¦mÛ¶aS‹Yí5ú©§ž2ÿ‹YÃP/Þ{ï=óúë¯{É‹L WóæÍ3êëxqÅµ…(W®4óÿÄO˜eË–åšç9Ð˜\ �Ñ=%iiiR 0 Ú°¶ZÍì¡µ<²â9'™>}ºÙu×]M�5œó#ƒÌ	(ú¿‚ì0pÌœŸL¹DkK@B& Èÿ,¹ŠÔ-¥˜Xž-sçÎe9Wú€Æä›kŒî1  ´ƒ4„´)@ lÔ²*³�ß³GmUÜsÏ=Í¸qãL£F�|dG�Û¨~T%’X'�!4>–(rÕà‘ R‰j6
›%­ÿ— 	!Ð}ü•W^1

H*<�Í5F×XÝS’v�†�– H @€�j«ÔÒcíÑÃGõ7nlöÝw_SRRâ#;òÈ‚ÀçŸ­‘Æý?h|4q.\¹G'®àX¾|ydÈ]½zuŸæ#H-˜3gq ŠØt£k¬®1»§$!-!MA
Œ €À´¬:Cìã>öØÆGõ´¶hÄˆ¦vm/Î>Š”š<´þÿ¥—^JM}©h:	hfT.Ò$„H@�.eä"A TåA.µc©84F×X]cvOIBZBš‚ �5¨­Ž"ôía�î>ªÖ¹sg³ÿþû›.]ºøÈŽ<²$ AãsÏ=—åY|É"ðá‡Fî£Ä¹HV»QÚÌ(È¥b¹� 2-ã’±‹e Åke�Õ5f×ØÝS’–�¦ ú·' qÉ@\ZÂ_9d©ÛËÎm«-E¦M›f†ês{5<'¹Ô}ðÁDÖ¼�©ž1êë2vÉã…�Ð¼öÚk BkTê³Å)zóÍ7�–¼�ŠC@ãv�Ù5v÷´- ´„4^ ÅiÒ¼]ÕY$æ­ddœ�.ö¤1öèdçÔ»wï( H«V­œó"ƒì	hO] a—�Ð	hÐˆ›tè­œ¾ú)ŽË¢E‹Œ\¤I™€¹2 ¨Ï“ŠG@cvÔÞS’¦c�.ö B @ YVmÙ±Ÿ=œÛµV­Z‘qÀ€FÏI…' =uåNG‚@H$ÑßÓÐÒé©£Œ·ï¾û®ùôÓOÓSijšZåq –,Y’Zq¨¸Æì»ËÀÓø]šBÚBƒg¡‡ª¡h�»ÛÃK¨þ!C†˜É“'³í_{Æ'Ÿ|bä:J‚@hö_k¥I…€ o½õ–Ñ½œ�Ð	¨¿/^¼Ø(¦/Åmmm¨1¼Æòž’´…4†—ÝÅ<•‰l` p€³SÇØòõQ&Yµ•H÷î^âú(R*óÐ¬‘– � �k×®�ÖI¯[·.Õ¥Ž)  A4wî\£àh$¤�@¹€@€Åom�á5–÷ä 
IcŒÑRò	` H~ªÝì!Ë\;ýã’t£�ÅpÒ¤I¦aÃ†.Yq®�õë×G–t~D rjâ( î£‰k6
¼ZýöÛoc Ø^“€< ÃˆT\Ãk,¯1½'#€4†´†4)á0 $¼mñÕ†Ú¢c„�ªÔ¯_ßyä‘¦G¼||ðÌ5ýxjÛ¨5jäšçA q¾øâ‹Èð•¸‚S`TA@ÁÐäÍö–UÀá¥`	ÌŸ?ßè^N*>�å5¦×ØÞS’Ö�æ@?zZ¬lhÀb‘÷wÝ^6«Qöhíš¥¶4h�9r¤Ï›…k±Ry~¹@ît$¤…@yÄô´Ô—z†M@�-W¯^v%©6!0oÞ< ›0)Ö¿þÓklïi[@iiiR‚	` HpãÙ¢«ý¦Úc¸�j(hˆ,…%%^âú(Rjó�Z°`AjëOÅÓI@k¥‰{‘Î¶­Ö2ÞÊše\¡µ,õ©Ž€Æ.ì|Q¥Â½¯1½Æöã{JÒÒhHO@‹‘�Wêþ®)ÜD{tpÍRëƒvÝuW3zôhS¯^=×ì8ß‘€Üç0 8BäôÄP ú}âš�WA@ -ãÂ P^
š€biçvˆG3kL¯±½ÆøžbHsH{à�&Î© rÂ‹“´8|{lï£4Mš41‡z¨iÛ¶­�ìÈÃ‘€ Cs„Èé‰# µÒ×lx–.]Ê€-°áå°	È˜«�]Hñ  ±½Æøë{JÒÒ ªò´ÐÙ` (4q×“Ÿþ8{´pÍRë‚†µk×vÍŽó	lØ°Áh	ÀªU«sât$�€ÖLkðH‚@’	È`áÂ…x $¹){NÔ÷µ`Íš59�ÏIþ	hl_>Î÷@ÚCDZ„”@ Øh¶È²¸íg�þ®ÅW”ù-Z˜#Ž8‚ÙW˜žÎ×�&ûF{‚I6‰# €¼ 4ˆ$A ©´  Ì‚&µ)·ÝÃYþâBÐÿ¹òÐX_c~O;LIƒH‹àà¿¹òž#€¼#ÎË´Gß${8Gþ×Ú í*Ë ³ÿyi«¬3e4kdœ	 Pƒ¦´*êÇl…–ÒÆ§Ú‘€xu„r/ �ù=Åú’‘aßðx5uF¥Á �¦X}¨–-ÍÞöèã£TmÚ´1‡rHdô‘y¸X·n�Y¹r¥{Fä �(ïÿx $°ñ(òwV­\eä@‚@	h+cÝËIñ" Ù�ù5ö÷”¤E¤I¤MH	"€ A�UVÔööq/{èÑ)É8bÄ3tèPS§N§¼8Ùýhâ:ç�'9%‹€ú¿�$$™Àª/1 $¹ý(» nüòu¶ÆúókìïÉë×›&ÉW�É·j ªæ×WÕ^ŠºÙÛÎknÚ·oY6l×ú¦²\Ì€¦²Ù©t�r  t‰$PWíjA‚@	,[¶Œø1mx�ùå à!I‹H“H› )= -T4V¡Hû¹N#›�—µÿ²üí´ÓNfÈ�!¾öõSCr‰~4Ù€Ž�V
š†@Z[?ŒzËx¥{8K ÂhOj‘=¶ÌžY¡Î¨U«V4ö—ðäP@…” ÒPeÅkµÞÆyö¿]»væ ƒ2ÌþÇ¯¬_¿ž% ñkJT êÿOx 8—Ésýæ›oò’7™B î´ŒQ÷rR<	hì/ -à!I“H›H£�B @BÊ³¾=¾g�Ž®E®_¿~õôèÑf›m¶qÍŽó=Ð¬‘Ü IH#¹MK<‘ �dº‡c HrRv6lÀ à0Ïçjì/ À¤	<$ii/™y(YTC @5€bò¶Tú.öØÉÛº–©K—.fúôé¦iÓ¦®Yq~hÐˆå<`É24pÄu:ME!·B@}/–­ â­à	` ‹wKHHxHÒ&Ò(Ò*Ì,z šï,0 ä›°ŸüëÙlö·‡óì¿"€jÝÿÈ‘#Í¶Û:ÛüÔŽ\6" M‚Gm„„RD€þŸ¢Æ¸ªº‡Ë˜E‚@Z	` ˆwËKHHxÚ	LEZEš…s bÞ@¶xj£AöØÕÎ®5²ôpÀ¦qãÆ6;R	hÐˆ Ž-C™
A€%0… Ì5òI@3ÿ òI˜¼“@ /˜ø·’´€4�'/ iiiôeÌ›ŸŠyÙâ•Ïþwv-ª¬}ƒŠöÿtÍ‹óóG@ fŽòÇ—œãM@â‰™£x·¥«ž€îá,¨žŸ— ß�d´íˆ#"màÉ+XZ/€4=€ø7R[ÄQöhàZTíù¹×^{ùßdžÏ¯Y³&[3æ™1ÙÇ—@�5èÿñmJ–!mµ¥¾L‚@Z	h,Ãw þ­¯¤¤<$iiiRŒ	` ˆqãØ¢Õ±Ç¾öèäZLÝˆwØa3vìXnÈ®0ó|¾Žž,±y.)ÙCÀ?E'ö´7±ÿÂ‘#2  Ñ£{¸~wIH+ÝË1 Ä¿õÕFÒÒžîYÒ,Ò.Ò0¤˜à×)¦SV,mÐ¹‡=¹³k×®fêÔ©¦eË–®Yq~ž	èŒ Ï�É>¶d Ã Ûæ¡`@üdŠ�K@÷rR2HH#H+xHÒ,Ò.Ò0¤˜À Ó†±ÅRˆþñö(±‡³aïÞ½ÍäÉ“}Y÷l‘Hù" MIH# ilõðê¬{¸§Ù´ðàP£T`“œfÖ½JAZÁC’f‘v‘†a»1@ó‘€|Põ“§¢iîn�¦®ÙµiÓÆì¶Ûn¦U«V®Yq~èGÓÓ–,(-—€€_ô¿<É­8äÅ‚ 8ì¹jñ	È­@ñÛ!›H#H+H3xHÒ.Ò0Î»—y(YTA @PbðR][†]ì±£=œ­g²èí³Ï>¬ÅŠAÃfR4pŽù˜É¥øbG@Æ/%bíhìš†eA ~ýú ,xñÑ°èÎDF²ÚT¿¹Ò
ž¼ ¤]¤a¤e¤iH1#€ fRVœÆöñ0{8›áš5k÷ð´®'ž´+UÝºuÙ©!°6¥:™Pÿ×ÞÄ$$•€Ò@ÄrIjRnW{Ö«§]¬II" ­ €€j?IFZ†t0}g�À7Q÷üÔ&=ì±³=œïž%%%fÂ„	¸"º·KÁr�Õ\³GÌ€9ŠyÀà£¡(9À 'lœqñ H^cjÙ’4ƒ´ƒ‡$#-#MƒÞô Ôg4ˆOš~ò’ï÷^ö�åÌ)øŸÜÈ‡nè§däRå¨ ã"ˆ5rÞø$fµ¢8i# ß_Ö@§­Õ©o9 å$’÷(Í íàa)ª4Œ´Œ4ëZcÖ0 Ä«AôeÑþ™{ÚÃyÿÌòÈÿr©%%‡€Üæ@Éi/Jê—@ù <`ür%·ÂÐ=œ% …eÎÕâC iÓ¦†±g|Ú#›’¨Ý<î -#M#mã4©™Mølõ0 TÏ¨�ŸØÎ^L3JìáôEÑÀcÀ€fÈ�!…,?×ò@`»í¶3Mš4ñ�Y@ yÔÿ›7ož¼‚SbT" ~,# †¬JPxšº‡ ¹Í-í áÁˆ)-#M#m#�CŠ	 1iˆ²b´¶�ß³‡óÚÿ.]ºD�<HÇ«�3)�¬¯´[&¤øLˆ$œZ¶l‰p
±qST§Zµj™Ž;²:EmNU+hK9ÝËIÉ$ 1¨‚JKxHÒ4Ò6Ò8¤˜À “†°ÅÐd§²£–k±vÚi'3fÌ×l8¿„E Ö_¡ô\nÔïÙÀ�!gÇƒ€ ÜÇãÑ”¢°ð (,ï|\MBZÂC’¦)×7ÎœÊC– €øtÊØÇÎ�24{¶óÎ;›víÚÅ§v”$+@íÛ·Ïê>�¤PÐ4Ý¿ž–ô–¤ürýoÝº5nÐt…T`Àä7»4„´„~“=$i›½í!­CŠ 1h[µCw{ìfçàýû÷7ãÇ�·Y‘’J@€:$µø”9Ð¬‘fMIH: Ú¶m‹tÒ’ògM@kÿu/—7#)Ù¤%¤)<$i›±ö�Ö¡cx êš�àJÐÏùŠø6ÆmíQÃ9'í=<tèP£ HÉ% % žÖ^%%O;wîœºzSáðÈ Ð©S'– „×´Ô¨º‡·hÑ¢šOñvHKHSH[8&iiœ1ö Êµ…Pì„ Ø-Pzý.öa’=œ×þï°ÃfÒ¤I¸Ð–rMì_y 0šØæ£à9ÐÖQx¾ä�ÓbG }»ö b×*(ßºwïnt/'%Ÿ€–ãISH[xHÒ8Ò:]<äEŽ0 8ôpú¶6M×oïš—¶ëèÛ·o´u‡k^œ_\
Õ¦M"¡·¸z�	4lØ0Z7]àËr9ä…@ã&�£™Pí@‚@ZÈˆ«{9)ÚPÚÂÃ–€"­#Í#íC*" E„_viÄ�E¬¶kQzõêeF�EmW�18¿víÚ‘@[’ �š5òp(-È¨gŒ	Ô¬UÓl¿ýöôé·EóO €¦ÅÌQ©ÒÒ’´Ž4Á =ÀtÉ€=÷sÅ¿‡=ÆÚÃ¹-FŒ}IÝ‹Eq  Ò={öŒCQ(òN@kKJJˆšžwÒ\ PjÖ(5 hOtÒ@@³ÄŠ€@X­-€4†‡$­#Í#íã¬{<”'µY ¿¸MßÌ^~{´v-†n¶;î¸#�ã\AÆè|D#˜cŒ„¢ä•€¶ò4Ã�×r’92% @€=zôˆ"¢gzŸƒ@’	hé¢îåì �äVÜ¼ì
J-�áÉ°#Í#í#D* E_vÙ®öqw{8/Ô^�ƒbÍxqÛÓëÕå­`:$¤�€fI»uë–†ªRÇ”�@^-2æ’ :Œ<x°Áã%¼–Ö½LCZÃC’æ‘ö‘"‰ €"�·—Õ ¯=†ØÃië?Ò—RkIáÐV€D�
§M©É–	hÉ‹Ä	!�!WýºNmƒM‚@¸d Ð,q³fLì†ØÊÒÒÆ¤Ò<Ò>Ò@Î !².D�0 ‚rÕ×ho_Ö‚çQ�ÜfµOg½zõª¾¯&’€n²ÚGš h‰l>
�Í.´mÛ6
|™Åi|±' ¾­�³Ü¢I™€Æ,Z¶¨ÉRx¤1¤5<-Õ“ö‘’"� €"@/»¤¦ºFú¸¼,rÚ¦ƒ‰¢�vÚ)¼ŠQ#T" RÍ±n´žC@ ÝËI™@‹-¢˜LF…ÛÊÒž–’4nEê. Š¾¾½ì`{tu½¼ÖZ6Ì¸åÅ%  @ IDAThÛRxP@xíJ�6&ÐµkWÓ¿ÿ�_ä?B@»¹àHcR�*	hö_ÂPcRy½�Â$ ­!Íá)Îƒ4�´�4©À0 xÙå:ÙÇÑöpæ?~üx3dÈn¸ÅiÇ¼_UëGûôéc´µ	¡Ð¶QžÜ
CED½L@.Ñ;ì°ƒÑ~Ú$„H@c 5jbõ¨Sw¤9¤=<$i i!i"R�	8Ð—7”Ë)Ôµs(MY\wÝuWöŠ¥WTQÝl%Žúöí‹{t|x)ù4h¹�2pL~[Rƒ-�‡‹bº� " däÚn»íB¬uªD@MÒÒ ’´�4©À0 ¸½œö¿f�–®—ÖZ­›­_ïW–q>_.WcÇŽÅ Î�DÙr& ÁÄÀ�s>Ÿ!�ýûˆŒ¹I(+e„@64QÑ¯_¿h·â¸dC.™Ÿ•æ�öð{LZHšHÚˆT@ 
»ìR=íãX—Ým·ÝØ7ÛÈ˜ç¡íÑFŒaj×®ó’R<dO@ ÖÿgÏ�3’E sçNÌ�&«É(m†4û¯I
$¥ƒ€¶¨–ñ”¤‰¤�H$€ €°í¥ä/£}/wt½¬,pZ‡Ãq®$ã~Ýºu£8 Š@p�ø·%Ìœ€ÜEå6ª`—$„L@"I[hõèÑ#äjR·Pß>|8ëÿSÔöÒÒ ž<�¥‰¤�¼¬)HQ38U€¾¬OV¨~íéV/ë379aÐ AÑ@A¸	˜@ÿmÞ¼yô»Í6ÛZCª•FŠþ/7BîcilýôÕYž.êó$„B@â÷ÿPZ3ózè7[ÆLiIšHÚˆíÌ<ÀÌ4 ™’òó¹Þ6í{éœän%R:(ŠôèÑ£Y�ŽæNM-åÕÂ6—©iîÔW´K—.Q@Wyu‘ qÝk¯½|m’ÔÔADZÄS’6’F"ˆ €�¶—Ñ>nÛÛÃÙü¯ p²º±¥Pá¯ØWÒÌÿöÛoYÚ	²SìÖàú>4kÖ,
$Ô¶m[Ù‘bO@÷qm•Æ–—±o*
˜!íÞ¢-á�f, �©Í¥E¤I<$i#i$ö¼ö 3“,0 dBÉÏgÚÛlúÛÃ©sKüi­³ÿ~%I¹´jÕ*²¶² I­FY·D@kÿµ†ƒÖ–ñzˆ´ã€[6}u’û¿<¸4e\’¾öW�ÕöÒ$~Ç¥�¤‘¤•H €  �Ë.ÑË>w½œ¾d'Nd?aW�	<_–v¹[5mÚ4�¥§ÈØ˜€Ä¿§õƒgÌˆ1�víÚEÁ ¹�Ç¸‘(ZF4&™2e
Áÿ2¢æ‡:uêi ’F’V"€ €@¶—ØÎŠpé¼h¿wïÞ‘Û¬§È›…©=WñB V­ZF[¦iëEO'A ©´zØ°a³’Ú€”Û‰À¨Q£ØúÒ‰ '›€‚Àé>®Ù_¶(.vkïúÒ";î¸£‘6ñ�¤‘¤•àz€Y] ª#äçý6msáÂ]6Í wìØÑO©È%q´Àþûïox‡�¤�ø<xpR‹O¹!àD@Á/µ N�:Nùp2ŠE@“�Ê£…”nÒ$ê¼ ¤‘ÚCš‰”g ò¸,{mo±³ë¥deÝu×]�‚g‘ÒI@?º²¸ËâÊš»tö�¤×Z®Ï#FŒˆf�’^Ê�\È€«sß¾šì"A yÚ´icöÛo?ÃŽÉk;ß%–&‘6ñä	"­$ÍDÊ3 yl³ohY´J\/¥ Yš9@ø¹’Löù-Z´0Ó¦McÝ]²›1µ¥Wt¹@{˜-H-C*ž|0�3Æhi	I" ‰ÝÃ5&å>ž¤–ËOY¥I¤MÔ<¤®6i&i'R	` È#Ü²¬µ­E?{8±Öz«qãÆ¶ÌÊƒÅý
²²Ž9ÒôèÑƒß¸7åÛˆ€ÖÊƒ…(èaáŸÐr.}JJœçRH�*“€&!XŠXÌˆßµ¥M¤Q¤U“´’4“´)�œDiËRÖZûïÜ‘5p:t(A³BêuÑº»©S§‚A:@äÔ‚Ð¬§ŒW¬}.8z.Cò†=ztKF‘ P5M@h,ªíÿð^©šQ_ÕÒ>õOcRi&i'R	` È#\›µ"µi_ËÖ.—ÑMvÀ€Q”Mn¸.$Ã9WëîöÞ{oúD8M|M7nlöÙg¶þ¾¥©`¦Ú·oÍšu±ÑÔIH�:˜£�>ÚÈƒ…�rÒ&Ú	@ZÅƒN‘f’v"Úu9à<<b ÈÔJY*Â�óìÿ¶Ûnk&Mš„û%°<µA%¬ëèÁl$¬Hˆ;m_©5Ï²´/îmEù
G@ß‰ÝwßÝÇ ¹p…æJ©$ Ï-yqí²Ë.FãR*Ð2 iO}CÚ‰(©•{~ŽÀ3ÐM²ëcÿï¾ÉkYÿ«ˆÁƒBèeM.ìä �c·nÝˆvS'¾v
5qâÄ¨¯&¾2T 	hÐ,QÕ¹sg�¹’üPäÿ8 #®´Aä¨É(iOÛTK;IC‘òD @žÀÚlkÛC!1�6I•+�¶|ëÞ½;3ùk«Äæ,×ÑéÓ§³5db[0×:gmýÇ–Qéhoj™ETWP5O3gÙ]œOC ºw+f…îãDþÏ X
?"½"­"Íâa€´“4”´)0 äjY–½í£\XœBbj@ ™³V­Zå¯¤äœXšYÕÀqàÀ�l™ØV·àŠ¬ˆÑš5Òú@ °9ÍþOž<98oþ.¯@ ¸t×oßÿþ÷ñD-nSÄþêÒ*Ò,Œ™ÒNÒPòÔê ò¶¬ãöpÍ^O.5�5rÍŠó$ f¹årÈ!‰lß¤WIûk·
ÖŒ&½%)¾	ôïßßì·ß~FQÖIˆ¹tË‹kØ°aÌþÇ©abXiiiIJF R` ÈT›¥¢£hË.öÈ9ÉÍJ3»]¬›·‡½5s.'Æ›€DÖ{ìa†Âà1ÞM•ºÒuìØÑL›6�µÿ©ky*œ-�&Mš˜‰&Fñ ²=—ÏC _Êgÿ5ÉàIÔå«¨äê/Ò,Ò.–Št±U’–"âdÚ@ Ú,e±Ò±�Köš	PäìfÍš¹dÃ¹) Ð²eKsÜqÇ™>}ˆ™’‚æNDµ°¶‹Ò¶@2R‘  �­èÛ¯¯9è ƒŒŒ$Ä�@ëÖ­£>Ù¯_?&¢âÐ 	(ƒ4‹´‹o&ÊõTjž¬"b ÈO{µÙötÍZ[®hV—m³\I†¾,­rÑÛwß}1…ßÜ±¯¡ftïš2eŠiÚ´iìËK!úÍ?n¼9òÈ#�ž“ PLWÈ�[1\<¬é.fU¸v	H³è÷ßÓ=LZJšŠä™  Ï@mvb:È]]²Ö ZA³ºvíêÃ�Æ¥(œ›rÏ;ì°Ã¢×„™bJ@ÛsÌ1QDà@«Hµ �]JJwv‘çŒÆ$‹@Ïž=ÍŒ3Œ¶ª$A S2I»HÃx¸‡IKIS¡W3m€?ÐAeñ1í]©¨•u³8g³�ÊufÌ˜1¦yóæ›½ÇØ�’’sÂ	' ¼¶ˆ×óN ^½z‘!jÜ¸q>\ ó^^. �8ÐöYr·VÄuÖ\Ç©eÒU‰~ypM˜0�I¨t5½—ÚJ»HÃxX -%M%mEòH €G˜eYídÛ»f+×™áÃ‡ýßdÊÎ×àQ÷ÙgúNÊÚ>Õ•åðàÁ‘@»S�  �ì	hÏuy t! pöð8Ã™€îãcÇŽ�fÿ1B9ãLeÚ@ÆÓ2 i*i+’G <Â,Ëj€}tù*`V·nÝL�=žå¿}‚ÏQ[öh©§(¬Áó¢‚þ´hÑÂœxâ‰ÑžÑ\ÿüŒœ � K–,1÷ÝwŸùðÃÍ·ß~› ’SÔì´ÓNæˆ#ŽˆP!Ô‡:ž€tŒ4Œ´Œ‡ ÀÒTÒV$�0 x„i³R¸~E¬là’­ÜÄ‰�"»“ �í0{öl3t(±SráÇ9ÙPÔÿc�=6ºw1k”=?Î€€¼ûî»æúë¯7·Ýv›Y±bP PP:t0‡~¸5j”�õÛ-;‹iiiÇ¤¤­¤±Hž` ð²,›þö±“k–ú²hý¬\hHÈ…€,®“&MŠ\±;urî’¹�sRD@ýMÛþÈó„mKSÔðTÕ+�¹sçFâÿ—¿ü¥ùøã�½æMf¨Ž€Œ¸{î¹g´íŸ'×íê.Éû�†‘–ñ` %d¥±Hž` ð²,EªlçšeÇŽMß¾}}­�q-ç'”€Ö‘jOé½÷ÞÛ(0	ù Pñ÷”SN‰"ÿæãä	�Ð	,X°ÀÜxã�æÎ;ï4Ë—/½ºÔ/†4VÐ®V­ZÅ°t)idD’–‘¦ñ�¤­¤±Hž` ðÒf³�=œ]Tä:« ZÌþûk˜4ç¤H¬rç6lXš1P÷<ÐŒÿÉ'Ÿ-7QJ ��÷Þ{ÏüêW¿2÷ÜsnÿÙ¡ãÓžhßv�¶ß^ÃXü�–‘¦ñ°,°|‰µ´É  –eÑË>v³‡Sç”«Ìˆ#|l�á¯fä”hºùÎš5+ZÓ—èŠPøØÐýJëþ§M›f7n»òQ Ä�À¼yóÌ7Ü`äö¿xñâ¸—òH@{¶wÜqÑ¶mÛn»m€5¤JÅ" m ¥i<,�¶’Æ’Ö"y à$V=\?”,dHÑ«óöú’ôïßßp¥k¿rÑV –5kÖDëJß~ûíâŠ$ž€îQZ/zÌ1ÇEÿ'A ÙP”ÿ›o¾ÙÜu×]fÙ²eÙ�Ì§!à�@“&M"î¾ûîËRA<Ébc'HÓHÛxˆk"�%­õ–=6l|%þË–  ÙÛòçw²oµÞòÛÕ¿£/Š¢·³þªzV|";Š0~üx3}útv—ÈŸ®‚€¬úò,™1c†)))©â¼l�ÀG}­÷ÿãÿˆøß(ÞË­ÑÞc�=ÌÁŒ7o”ÉXšFÚÆÃÄ¦4–´É  Ú,´___{4tÉN–XEÒö°VÆ¥œ(ÍÒuÔQ‘€�6rª%�’Aƒ™3Ï<3reÝ s‰ ,Z´ÈÜrË-æç?ÿ¹‘ 	Å  .-T 6òE@šFÚFÇ1Ic©³²Gº#H�ŽÀD›Å {´uÍJ[°(‹f×HÈíñ{üñÇ›)S¦àî—À)È³gÏžföìÙfòäÉFÛÿ‘  �Ì	,Y²$ÿZó// ŠA`ôèÑæ´ÓN‹ÆœÅ¸>×LiiiIZKš‹äH €#@{ºª36uÉJim•¡`,ša#A _z÷î&í>	—/È�æÛ¾}û(X”¶‹òàÎ(%ª�ª	|òÉ'‘Ûÿí·ßîc=lÕáUTC`àÀ�fæÌ™Ñî@5jÔ¨æÓ¼7å[Kãx˜4�Ö’æB(¹5‹aÏ&G€öt…L=ÁÚŸ2ç©íÚ4+;aÂ< ,HR~	È K—.fáÂ…fî¼¹æÛo¿ÍïÉ=ñºwïm÷§¨ÿž,ù‰gB �)ÍüßvÛmæ¦›nÂí?Sh|Î;-ß:çœs¢ ®Š@‚@!ÈðÁ˜7ß|Ó¬^½Úå’ê´Š˜ú�=¾qÉ(íçb pïmÇÙC�9§Î�;G3kd³¦6gŒœ˜:uêm=õþûïcÈ‚]Ú>ªûÓgœmù×°¡S¨“´¡£¾0K—.5·Þzk$þet%A ‰-ßR``
I@MO>ù¤ùôÓO].«‰ÖµöxÔŸ»d”össž±N;¸JõïoŸ7«ôNO[¶liúõë‡[mNô8)W»îºkÌMZXz’+Å°Ïk×®�9ñÄÍ¡‡ÊÌØMMíò@@[_Ýyç�æ¿ø…Qð?ŠA@KÿN?ýô(êÝºu‹Q®™bZ2(�#­ã!IsI{‘` p€gO?mIád ÐÍX7gm•Áz,·áììHô�92š;v,Þ'ÙáþÓòÑZQ¹ý3ó|sSAÏ4Û_>óOÀ?ÏpÉ.cšùÿÁ~`öÛo?v™Ê˜ôI@ÚFGZÇƒJšKÚëÐH„pv€gOÕZ£hì’�¶gÛyç�™�u�È¹9Ð’“Q£FE±'­õñÇ7ë×¯Ï9?Nƒ@¯^½¢5ÿ‡~¸aÛÈ0Ú”ZŽ€ÜþµÞ_ G—×Âš+G`øðá‘�Ì˜1xp×ºÉª�&œ†fyä‘(þ”Cé¥¹¤½¤ÁÖ8ä“êS‰�{óËòÔÃGÛ£]îÙ˜(ÛqÇgäjK‚@1È:«­=zôˆ´hæjÍî«Åh‹b_S?Òýû÷�–†Èí¿AƒÅ.×‡@¢HüËåÿæ›oFü'ªåÂ)¬îãÚêï‚.0ãÇ�÷1ëjRgnØ°Á<öØcQ\‡Bhë
PÿÏŸÙƒ(ÖB¶	÷‰l‰U|^ÆY šT¼”Û3y t±ÙI(6íÕªÁÚæ­Iç®]ìêpý,	h‹žvØÁœrÊ)æ ƒ"PT–üø8–-[fî»ï¾È ÀÌ?ý¡àoÄˆæì³Ï6cìÌ¿‡­×ŠQ® �’’#Íã!i€*ÆDvŽ0—#8{Zm{f�]í‘sDm§µÇ{D‚K[ŠI@ZmI¹ÓN;™uëÖEÛ¶¬\¹²˜EâÚ" uyŠ¡µ¢x Û‘ˆ;—	‡À'Ÿ|b~ó›ß˜ë¯¿ž­þÂiÖDÕ¤qãÆfß}÷5—]v™<x0�¥ÕzáVÁ _yåóúë¯›¯¾úÊ¥ÂLKí!/€¯]2Jë¹ royYŸN¶GŸÜ³°k¬Û¿ÖØÊåVâ‹�bP?ÔìÿŽ;îh4˜Pð*ÍdiR˜ÔÎÚJ3FreÆ(Ìv¦Vù# ñûí·›+®¸"ÚZ5W"gTM }ûöfÚ´iæ¼óÎ3={ö$¨oÕ˜xµˆ4¾\¾|¹yúé§Í_|áRM¼®¶ÇCe�.y¥ò\‚ æÞì�í©­s?½ôL¼ûôéƒøwÉùÞ	(bë1ÇmÛ¢Ù„·ß~Û|óÍ7Þ¯C†Å% {Ð>ûìm…!²¸mÁÕ“I@^R>ø ¹á†ÌgŸiI*	…%Ð¹sgsØa‡™N8�xR…EÏÕ²  €4�Æ’4˜´Ø§òJ] rkrqëg§¬/‚DV×®]s+gA Ï nÊ”)¦mÛ¶æòË/�¬¶«V­ÊóUÉ¾´ûƒ¶ù;þøãÍþûïoºØ8$º'‘  �Ì	|þùçæOúSärÍV™sã“~”Çm9ãŒ3¢å¤Íš9íJí§Pä�­�æ)ßöÜÑ³TLZì{°`+Ì«z‹% UQ©þ5­ÿ?Ä;Û#çõÿ
„¡}Y'L˜À€Õ3çE" 5[ŠC‡�< -ZdˆP¤ÆðtYvÔžçŸ¾9øàƒMëÖ­ÿžØ’MzHüÿá0^x¡ë¶Vé�FM½�±Vb·Ýv‹ŒóZºÕ°aC/y“	òI@F«¹sçš7ß|3ÚuÊñZ‹íùÄÈ" 9@³§È Ð×�r;½ô,ºµÎšà.9·4[,·-tûõëg®ºê*3oÞ<óõ×]Áßç5š6mj9äsä‘Gš°Þß'\òJ�/¿ü2rû¿ä’KÌ’%KRSo*Z|ÿÚ¶Wñ£Ž:ê(ÓÅzo1Ž,~»P‚Ì¨¯JûH9î”"&-&M¶6³«ó©r ÊId÷ØÞ~\‡“¿¬< úöíËÌ[vìùt	H<jÆ¸[·næ¦›n2ÿüç?£€.E,—Î�€<9zõêmñ·×^{E.x2ì�  �ì(xÕ_ÿúWsñÅyD‘ P(µk×Ž‚FŸ~úéf÷Ýw7úM&A IdÀ’öñ° 4X¹[‘$q(+€ì[A#f­9qšý×eµF–[ÖÝŠ))ä>>jÔ¨ÈpÏ=÷˜[o½o€7ž¬íåQþ�;î83hÐ £}¢I€@öV¬XatßS`ÔùóçgŸg@ å1[&MšdŽ=öX³Ã;˜:uêä�§@ ¸¤y¤}¤�<$i1i²wìA”ê,€2ý“¬²�ÊÕä {Œ°GÎëÿµvKÁÕ´~‹�¤(•Š¯½†W¯^¹réÑ1¨KÒPÄº¼uëÖ5ŒÖúÏ˜1Ãl¿ýöF3H$@ {Š}rï½÷š‹.ºÈ|ðÁÙgó340×ýaÃ†1/izŠ§6‘ÁvôèÑÑ¼#Ž8Â”””°t+=] ÈšÊ õÎ;ï˜—_~Ù¬Y³Æ¥ŽÚŸZ7ã'í� ’x d«ì£ÛÚÇìÑ ûS+ÎhÙ²e4¯x…gHyì²Ë.Q�@-¸ùæ›Í«¯¾ÄP¼ö”�¦Q£FæÀŒÖú+nƒÚŠäF@{W?úè£æ'?ùI°ÿ´•œ„æ“O>i>üðCóÕW_å‹³¼�HêÝ»w,Z÷òž={uI�€&$¤…–-[æRl¤É¤ÍÖ¹d”¶s1 d×â5íÇµïd‰=œ¼'´öE7v’N@kË5#1}úôh¶ùÏþ³yøá‡£¯ß|ƒA¶�í«Ù"	}E„V ¿aÃ†™öíÛ³Ì¨��Àµ‚# 5ÿŠöíµ×FÑ«ƒ« ­�âƒ\pÁfÄˆQï¾ûîh©ƒ–<p/l‹Ë€« iûî»oô»*w¶÷+lpµü�’úßÿþçr1i1i2i³ÕöÀ}ÉBÈ$a È„RÅg´àj€=šT¼”Û3uú.v	¡Øn»í¢å ÚãuòäÉÑàñþûï�‚d1€Ìo+—Z mÝ¨ívH€@î$þïºë®hÍÿG}”{F1>S3ËÚáE‚Sîæ:t0=zô0Zo.C€<V­Z…! Ïm¨pÇŽEøßyç�Ù¢5ÏÌÉ¾x¤�<T¤É¤Í‘Õi=�=?5Éi;5”**ªMV§Úc{lWñrvÏäš«(ÜŠàJ‚@h4€ÔE
6§­^”)Ûq�Wh˜¼ÕGƒFmç÷ƒü Šð/^×Ñ,	È�€¶úÓšEûUüËP¨˜ûí·Ÿ‘WIE�Sºwïn†m+Úî�e¹÷§­�©û¸„ÿ9çœcŽ9æ˜È˜®à­jB$ ïÑ×^{Í¼òÊ+fÝ:'ï}íG½ÐÏÛƒí 3ì,Leªìcò èc�œÅ¿òiÞ¼yôƒªç$„H@ƒ‰PÍDw±VÞqãÆ™xÀüë_ÿ2šQ#¹Ðì¾‚0î¹çžfÌ˜1‘À“5Ý½pä �„�ëû#�<b®¿þú`Å¿\pO>ùd³Ç{|'þ+7›î1ºk«¹>}ú˜§Ÿ~ÚÈ«ë™gžq°W¾LªŸËP»ë®»š½÷ÞÛŒ92Šîß°¡æšHŸ€î+ÒDºß:$i2­©f[Œ, b È–ý¨îÊêdNQX$Œü‚�Ð	h›"¹¥k}©Ö£?ÿüóFÁu°vn­¯Y:yVh™…¶cÔ ^? $@ÀEû¿óÎ;Í�7ÞhÞ~ûm?™Æ,Ý“Ï:ë¬h7¢ê§f¢å	 ½»%RÿûßÿšÿûßÑ}Ü1€WÌ¨®8õë×�„¿–Y(î‚~'Ë=0
W
®�â�@� ßÿ}—‚H“irVm‰KFi:@æ­-ÚÎöhf'Ÿ,YÓµNš�´ÐL’Œ^tj°£%0O<ñDäê ÛwÛÊ%W3ýò¦2dHÄSs à�ÀÚµk#·ÿ�þi}¿–M�:5«ÝA$PwÚi§èÞ#ï.ÝÇeÌýûßÿn–.]ê¯ÎIÁý&L˜m­¥[@ÿ€œªm•@·nÝ"£­~¨ú7¥É¤Í¤ÑæÚƒ@€Bu	@u„*Þ—kIO{8¹˜hFT[íh0O‚@Úh�£nør+ÕàGëÕŸ}öYóÂ/˜—^zÉ¬^­ ®¤Êd,<xp$úµå¢fá¸T&Äsø! ñ/·ÿ›nº)Øhÿòš1cF´æ?×­Aµ�òÑ½IÞHº/½øâ‹æ¹çž3o¼ñq6éŽúÝ§�F”áÃ‡G3þZM‚@š	h,#M$mä \£ýÇò$`�
@�Ê>RÏ>öµ‡“ M›6Ñ ž ]™ƒç“áÐ€HÞ :´†ýÕW_��
3gÎóúë¯›ÒkÄÕ,Q¿~ý¢Á¢fû5xÔV‹Ü7Âû.P£x�øÿÓŸþmõ'cdˆIÑþ5óÿ½ï}Ï4iâ¼™‘©]»vtŸÒ½êã�?6/¿ürdÐ£îãóçÏcÆu’±[¢_ÆnEô'�I€@)�iÊ¿,pÁ"m&�&­† ’ 2€Töu®ìá´þ_{¹ß‘  �Rrc×ºRŠ´-#€�ÚVÏeøöÛoƒÇÕ¾}ûÈµV?†
î§%:´V”ä�ÀúõëÍŸÿügsùå—›7ß|3*bÎŠèúé§›<ÐT·æ?—b*¶ÑÄ‰#×v­ç•E÷ïwÞy'z|ï½÷rÉ6qçHôËKK‡·zÔklÉš¸¦¤À" M$mäh �6“Fsš¤-P•cq ™7ƒÌåZ_â´ub³fÍ¢™¼Ì/Ë'!�Á:•zÞ¼yÑ RKôÃ Ù¤wß}×|þùçA ‘û§–BÈ�¶|ID¹øÇÅ?ˆ&¦	 ðõ×_GkØ¯»îº`Å¿î1'œp‚9à€ò"þ+7³îkò4Ð¡sçÎ�¼»ä°páÂè>®×h1„¤õûòÎÒ=¼|IDùÚ~m‰K‚ ¶N@ßi#Ç$m&�&­¶Ø1¯TœŽ ³fVÇêfç…û²’wèÐ!³«ò)¤”€¶Ô¬‰ªÒŽò�7€/^yÈ0ðé§Ÿ&‚’ÖÍjÏívíÚEFÕM‘Ÿ5Ë¯çÑŒ2 šùøá‡Í•W^Å!	¨jßUE÷¹ýtÐA>‚m}—o&Oä½$o&Ó§O�îÙ
úª½¿u×}]^_~øab»2ÎJ°hÆR÷r:Êwº‘@k™I€@æ¤‰¤�<$i4iµwìñ�‡ü‚Î@fÍ[¾þ¿vf¯úSúáÐ�1_«æÃ«¨Š€ÖˆéB‡"à+P �ó­G€‘2h ùÉ'Ÿ˜Ï>ûÌ,Y²$ŠHýÍ7Å»ÿkYƒÖzêGM–mms£Á¡\ÝÊg‹ô	(‰ÿ|0rûuÍ¿f¤åö/ñ]l¯"ÅÐ½O‡<¼äðÁDÛi™€¼t×!£®b
è(fÒöªmÛ¶5-Z´ˆîåzÔNõ{¤àeìÄRÌâÚ!�&Ò÷J÷¨+V¸TIMq þŸ=VÙƒ´ ¶§Ò[å{L:…l•µXAÏH€@îôc!!­CÛ))>€¶ Ò,’<dÐò¿üòËh ©ÁæªU«¢ÿõ¸fÍšèÈ¥
`¨èÙš±×—~´ôù!Á¯ïºº;vŒ�ú?ëns)?ç@ í¾úê+óØc�™+®¸"Zf"O:é$3mÚ´¢‹ÿªøê~¨™sJjvµL@]ÝÏu_¶lÙw÷mÝÇ+ßËe–!'—$ƒ„îßú=Ñ¡û¸Ê¤×ô¨íš%ðÅQb¿ü^Näþ\hs¶N@ÚHã$G€4Z{H³a Ø:rƒ @eoË§«·=œ š”( A þh¹€fÛ+GW–Q@ÅåË—GHÍ(i )Åøâ‹/¢CÆ <µã@åC¥S¾ûå�z®A£f|48Ô€Q�šÉ×L‘ž—?ðÉ_û’|ÐVSÚêïšk®‰"ÕûÌ;.yiœ1sæLsè¡‡z‰ö_ˆz•ÇD‘à.Oº�ë~­C÷nÝÇõ¨ûº^Ó£îå2è*–Cå{xù.2ò «|èÞ¬åXº_k'„ªîã2âê}ÝûI€@þ	è{¯±”–9$i4i5Öád @�ìGšÚC÷�~ä>VùÇ-³Kó)@ [¸i`§C³8[J`Jh¹€�å�z]‚_‡ŒzÔÚN=’  �dÐVrû¿ôÒK£­F“Y‹­—ZcŒÙ³g›C9ÄG`­­_,Ïïê>.!®ck“'û›ÞÇu/×}¼üþ]þ(#.÷ñ<7ÙC KºoyX)�&­&ÍöQ–EHÝÇ1 Tßä²(IA8…sÕ™< d A ñ  ï¥fƒH€@Ødàû÷¿ÿüSº“ÆÇ{läöï!ªvbi†Ÿ ª‰i.

�ÍHüëþ¥1™wIZMšíöøÊ!ŸàO­|Ý+(uÐÝNÆY°äB?T$@ € 
C@Ë|žzê)sÑE™—_~¹0-ðU•~ÆŒæ¨£Žb¢¡Àì¹ àF@ÚHIZÉ1I«i' fvªé$j«É;”·eMRä>§õÿŠ$Û½»ì$@ € 
A@®á�?þ¸ùÉO~bžyæ™h�x!®[Èk(xÖ¬Y³¢hÿzN‚  �4ÒHÒJŠ×ä�Êã H»­tÈ'øS1 TßÄ²"õ´‡Ó€rýWY  @ ù' ñ¯hÿçž{®yóÍ7ƒÿíÛ·�ÄÿÑG�ø5ÿùï\ˆ+i$Ë¤¥Õ¤Ùð ¨¦¡1 TÈ¾]ß�ìáä»¯h³rÑ#A €  �_
÷Âó/˜Ë.»Ì¼ñÆQ€Ïü^±ð¹k°,—EûOÓšÿÂ“æŠ€@¾	H#I+9&i5i6i7ÒV` Ø
û–ø(¢¤s�Ô�3€­Ãæ]@ €€+­ùöÙg£™ÿ9sæ)þå*{ÒI'™Ã?|£-P]Ùq>  �b�FòdÈ”f“v{×_£.I¸¦Ó¬v*èXÆö|­ÿwrÿ—EK[‘iŸ[  @ ù! ñÿä“Oš3Î8Ã<ýôÓFÿ‡–´Îÿ”SN1Ç<KCk\ê�”�F’Vòà Í&í&GÚ [ Sö²:O{8yJh]ËÖö°Ýzx€   �êÈí_3þç�wžyþùçÍúõë«;%qï7oÞÜÌœ93Šø¯ç$@ ¡�Vò/MšMÚÀV:€­À)ë<
&á4u/k½‡½õ’ò.  @ ¥4Óÿâ‹/Fnÿÿ2„–´Oö‰'ž¹ý#þCk]êH+yØÉDšMÚÀVº”ÓÌöVòå-/ mÚ´1:h9
	€   Ÿ¾þúëh‹¿/¼0rÿÑí¿eË–ÑšÿN8Áè9	€@h¤•¤™  Ä °uHMíÛmíáä)¡ÎìÁ¢µõ’ò.  @ e4ÓÿÌ3Ï˜sÎ9'zQü+Ú¿„¿fÿ=l“•²Bu! �¤�Vò` �f“v“†#m�€“°ÝBž¡¼¬ ê@Nîÿµk×Ž¢ÿ×¯ÏŽ¡tê@ Å' ™ÿ—^z)Úêï¹çž2àŸfû�8âˆhÍ?â¿ø}Ž@ ù# ­¤Ý ¤�“´›4œsFŽåˆíé ¶Ü4Rì]ìQcË©þ­gÁý¿zN|€  �)‰ÿÿ÷ÿþ_´æÿ‰'ž0ëÖ­ËôÔÄ|NkþgÌ˜afÍšÅ8"1­FA! ÒLâ¦I»u±³¯[h [ c_ÞÎ�íád ðäÎ²åRò  @ E6lØ`žzê)sñÅ›ÿû¿ÿRü+ÈßQGEüg!E�›ªB å<-›–¾•†“–#UA @PÊ^R§ig'FrÙ#Zï–!ó  @ rûÿéOìV64S¦L‰ ÖÃfƒ–ÏB (*i&Ë�4y+‡`­IÀ-€±/{Y õ{ ¶™w  @ ™ÐÌ¿¶ú»üòËÍßþö· gþ5f�ø?í´ÓL¯^½2ÁÂg  C@šÉÃN',¨¦G` Ø2 Æö-Y�œ’¬XÍš5sÊƒ“! @ i' µþ7Þx£yì±Ç‚ÿ/Èíÿ¸ãŽ3]»vM{sS@ …¤™<x ˆœ4œ´©
 ª€b_ªemDY¯ê·3{µV­Z‘kÛm�6Èìb|
€  (­ù¿æšk‚]óß´iS3}úôh«¿Î�µt•@ }¤™ä ¥m^’4œ´œ4�SFeˆí©NëÛc[+÷‚©Ót°‡S @u`Eñ%A €  ��—_~ÙÜtÓMæßÿþw°3ÿrû?öØcâ?·>ÂY€@8¤�<-�–sšÌ‡êÆ5Á`cåÿ5°Oœw Ð6ð)GÊ#  @ ;Ï<óŒ¹á†Ì<`Ö¬Y“ÝÉ	ø´Ü]?üðh»¿Þ½{' Ä€@~	H;IC-Y²ÄåBšÄ•–“¦[å’Qˆçb ¨ºU5²£=œ< Z·níÃ‚Uu	y€  0�çŸÞ\qÅæïÿ{�â¿I“&æÐC5'Ÿ|²)))	¸%©  �Ì	hö_Ê1IÃIË±@ YPûRùº'€‚Xh]	€   �Ì	¼þúëßüqæ_âêÔ©æøã�GügÞ-ø$ �ÒNJÃ9Çs7 U·¬ ííál `€ªó*  @ *¯¼òŠ¹îºëÌ}÷ÝgV¯^]ÕGýZãÆ�Í!‡üëÓ§O¢ëBá! ø&ài' i8i9b TÑ@ ª€b_Ò¶Î{÷©o·ž'U#æU@ €ÀÆæÌ™Eûè¡‡‚ÿšùW´ÿÙ³g›nÝºm\yþƒ   �H;yš@•–c+À*úK 6‡RÛ¾¤ÐýzÌ9Õ¯_ß‡ûJÎ×çD@ €@’Èíÿúë¯7ÿ_~ùe’ŠžQY6l¹ýÏœ9ñŸ1>¤•€– HK9&/šÎ±±<ÀæÍ¢Þ¦m#œR»ví èD�“! @ -äö/ñÿàƒ)þ5jdößsê©§¢ý§¥WSO@ W
(-å!IÓ9[<”#VY` Ø¼9Ú—œ×ÿ+z¥‡ ›—ŽW  @ P´ÿK/½ÔÜ{ï½fåÊ•Õ¬´*ZóðÁ›3Î8Ãôïß?¸úQ!@ ¾	HCyÚ	@šNÚŽT‰ 1 *Á({ªEûmíá PkWô£O‚   @ jï¾ûníÿ‘G	ræ_q€&NœhN:é$CÀ¿ªû ¯B Ø”€4”‡8 ÒrÒtdÛ0€M€Øå&‚`s.¼@ ðFàý÷ß7W_}u°nÿ40{ï½·™5k–é×¯Ÿ7nd@ tž ,Ø¤Ã` Øˆý·�=´^ÄÉ yóæFÑ~I€   TøöÛoÍ[o½en¸ás÷Ýw›+VT¼È3¯š:uªùáh¶ß~û@jE5  †€4”´”c’–“¦“¶#U"€ Œ²§�ì£³€:®¬ÿ$@ € J	Hü+Úÿe—]f}ôÑ Å¿~û÷Ûo?söÙg›^½zÑô€  �%ÝG=L¤–/�¶#U"@ÀJ0ìSuMÛ×Ýøåìþ«]»v´þ¿fMðfGŽOC €@È>üðÃhÍÿ_ÿúWóùçŸWÕzõê™Ñ£G›Ù³g#þƒk]*Š€4”–HS9&i:i;'ÏnÇ2ÄîtêÆM¢NÒbã—²ÿ¯S§N¦U«VÙŸÈ€   �@	,X°À\uÕUÁFû—Ûÿž{îiÎ;ï<3pàÀ@[‘jA (i)i*IÚÎir×Cb•€�›CQ"� :tð±neã’ñ  @ �äöÿÞ{ïE[ýÝu×]AÎü+Úÿ^{íe~üã›!C†< ØQ)2 +Š Må!IÛ±@%�Ä ¨Ã>­gg€,Vl¸1Xþƒ   �tøè£�Ìµ×^ü[¹repêÔ©cÆ�Íü÷îÝÛÔ¨�§ip�L…  �‚�–òäQ-m'�G*#€`ã® ë�sÈÉ¦M› pc®ü@ )$°hÑ¢ Å¿fþÇŽk.¸àÓ§OÄ
û8U† òC@� ¥©<$i;< *�Ä P	FYçh¹ñKÙÿ'—•†f"g@ € !0oÞ<óÓŸþÔÜqÇfùòå�Ôª¢uëÖ5»ï¾»¹øâ‹£­þpû¯`Ã3@ ®¤¥<l¨bHÛa ¨Ô  *Á°O½,À`c¨ü@ é"0þ|sÍ5×˜;ï¼3È­þ$þ'L˜‰ÿvØ�™ÿtuoj€€G – lÒ^Üˆ ÎK ´fEÑ€I€   �´�ÛÿÍ7ßlþøÇ?+þGŒaÎ9çÜþÓÖ¹©/ P0ÒRžbªIÛ RËáP	†}*Õî´ØDÁÔY·ÝvÛ�sæ?@ €@àÞyçó«_ýÊÜ~ûíæ³Ï>®¶å3ÿgŸ}¶<x°©U«Vpu¤B€ â@@ZJšJÚJ»É8$i;ff+Ä PCa{ÕAjW¼”ý3­Uñd­Êþâœ@ (­ù¿þúë£hÿ!®ù¯]»¶Ùm·ÝÌE]dÀVEêg\Hi*i«O?ýÔ¥ÒÒvÒxÒzN–—BÄé\– T´FûÔiö_YµlÙ÷ÿ
¦<ƒ   �X¼x±¹í¶ÛÌ}÷ÝdÀ?mõ7dÈ3{ölÓ·o_Ä
ú4U„ ŠO@Ë ¤­<$i<i=’%€ ¢(:¤‚D8¥Ö­[³ AN†   �$Ðšÿ[n¹ÅÜzë­æã�?NRÑ3*«fþÇ�ÍüË€%~aãC€ œ	( ´•‡$�ÇN e YPÑ£êÚ§Î -Z´0Ú˜@ �€Öüÿîw¿3¿þõ¯ƒÿûŠöî¹çš¡C‡2óz‡¦~€@¬HSI[yHÒxÒz$K @E7�[HãŠs{¦- ëÕ#Ðdnô8€ ’B`Á‚ÑÌÿ]wÝ¤øW€¿Q£F™ýèGfØ°alõ—”ŽI9! �`HSI[yHÒx,(‰ ¢Gy1 4jÔÈh­ 	€  *�¥K—š;î¸ÃÜsÏ=AŠÿm¶Ù&šñŸ9s¦Ùyç�ÿ¡vdêÄš€4•´•‡„ D 00 T°à  @ J.4¿ýío£Ùÿ�>ú¨ÊÏ$ùEÍüËíÿä“O6'N42�  @ ð0 ä‡9¿j\µ.Äy	@Ã†ñ ¨`Ê3@ ˆ@yÀ¿Ûo¿ÝèyhIûM�;6rû9r$3ÿ¡50õ� E@ i+I� e Ù ¢Gyñ P´JE&A € B" }˜ðï7¿ùM°âøðáfÖ¬YfÄˆˆÿ�:/u� I@šJÚÊCb	@%ˆx TÀ� IÅ¿¹=S'­Y»Jnô8€ âH`É’%‘øÿùÏnBtû×Ì¿¶ø;í´ÓÌî»ïÎïx;!e‚ RG@šÊ“@� me=@ÅWI¡û�|LêÖ­kê×¯_‘#Ï  @ 	'°xñbó‹_üÂÜvÛmFëÿCKåâ_[ý�=ñZS@ Ñ¤­¤±Ö®]ëRi<¶i+#ÈTu)ˆöAþ%µÊ¸äôÐ¼ys£ý*I€   �Èí_ÿn½õVóá‡†P¥Íê ·ÿ3Î8ñ¿^€  P|ÒVÒXŽIOZOš/õ	@iðâþß¬Y3 ©ÿJ €@>ùäsç�wFÑþCø§V’ø?óÌ3Í¸qã˜ù£ÛR@ 02 HcyH,(ƒÈ€Rr	q^ÿ¯ÎY¯Þ%¾ d@ E$ Ù~EúWÀ¿±$ù¹´ÜþåÿG?ú‘?~¼ÙvÛmós!r…   'ÒV jNk	œ*““1 ”6„< œCL6jÔˆ- cÒ±)  äF`ùòåæ®»îŠfþµþ?ÄÔ¯_?3{ölÄˆ�K�  � h+@i,IZ�@€€ÒÞ¤}ûœ£÷©s²`)PþB €@ò¬X±Âüá07ß|³	Uü0Àüð‡?4“&Mbæ?y]”C )# måÉ  ­Ç^í€Ò/‘¬AÎ ­QÁ P
”¿€  �,Ÿ}ö™ùãÿh®¸â
óÁ$«ð–vðàÁæÂ/4cÇŽ�¢Jgxƒ   �"�¶òd]Z @igöâ€ Hw.@ N–.]­÷×Ìˆâ_kþwÜqGóãÿ8
øÇš§îÂÉ€ 
FÀ³  Ûr J»¯¢ÿ8ïß§ *
v?àB€  à�ÀÊ•+Í<`n¸áj´ÿ’’’ÈíÌ˜1üN{è3d@ P¤­<Y—Ö#â«…€ ´÷ÊÄÙ  €m¶i)RþB €@Ü	HüßsÏ=æòË/Rükæ¿wïÞæì³Ï6“'OÆí?î’òA Ø„€´•§% Òz,°P«¥�L�Áy€ºuë2³PÊ“¿€  sË–-3÷Þ{¯ùÉO~ìV}ûö�Œšù¯_ß9ÔOÌ[”âA �€< ¤±<$v(ƒˆ „ÜAœG²N±ÀÃ×“,  @ ¯¾üòËÈíÿ¢‹.
6Ú×®]£5ÿãÇ�g‹Þ¼ö&2‡  �?ÒVž< ¤õX`!ÔÌ_s%*g/K d�b	@¢Ú�ÂB H‰ÿûï¿?Ç¡nõ'ñÉ%—˜	& þS×Ã©0 i+O ,(ëx ”‚PDHç% 
P¡õ†$@ €@	|ñÅæÁ4šùŸ?~‹è\&­ù¿ì²ËÌÄ‰}Í9—‰  @ 7ÒVž‚ Jë±€…€ ´/:o¨ÎY§q%rûjs  ä›@¹Ûÿ¹çžk.\˜ïË%Eû—øßc�=|Í¥\€ *HcIk}ûí·/fÿLK 0 X,(í<ZR¯ôin6lÈ`#7tœ@ y&°zõjó—¿üÅ\zé¥ÁŠÿÎ�;Gžrû÷ä.šçV!{@ È„€îéÒZŽIZ� €Òž$kP­Ò§¹ýmÒ¤	 ¹¡ã,@ È#�åË—›‡zÈ\pÁæÝwßÍã•Š—u¯^½¢˜S¦L18¯è+^E¸2  lF@ ÒZŽIZ€…À€Òžäì¢µ) tüZr:  x%°jÕ*sß}÷E[áÍ›7ÏkÞqÉ¬[·nÑÌÿäÉ“ÿqiÊ@À#i,Oq X¯mÛ€RÎÖ v ðø-'+@ p&°víZóè£�šë®»Î„*þÛµkgfÏžücæß¹Ë�  �Xð¸€4_êõ/ ¥^NÖ òè”x ÄòžA¡  ¤Ž€Äÿ#�<ÍŒ¿ùæ›AÖ¿OŸ>æä“O6Ó§O÷á$#*@ å JóIÿ®�K®uÀ PÚ	œ— hmJ­ZNarmCÎƒ   |G`ÅŠæoû›¹ä’KÌë¯¿þÝë!=ÑVgŸ}¶ÙgŸ}L£F�Bªu�   �MHcyÚmMšÀ&|Óø¯:�³€ iì:Ô€@¼hæÿþûï7W]u•yã�7âU8O¥éÚµ«9óÌ3�þÕ¯¯]�H€  2�r u,7 xÈ*¹Y¤~„m:/ < ’û% ä€ B °~ýúhÍÿ�7Þ¬øïØ±£9þøãÍ¾ûî‹ø¡ÓR@ Èƒ@W÷#,(ÝþÏÙ@ b „ûE¡f€ âL`Ýºu‘ø¿ôÒKÍœ9sâ\ÔœË¦5ÿßÿþ÷Ía‡fš5k–s>œ@ É" �åq	@ê×lc ðà €x $ëFBi! „B@3ÿ<ð€¹úê«Í/¼Jµ6ªG�=Ì~ð3uêTþmD†  „O ÜÀC@– ØîÂ  }í0 „ó¡†€ âFàë¯¿6ÿøÇ?Ìµ×^¬øïÔ©“9ñÄÿqë|”€@�” <\€…ˆ€G K <|-É€ 2"ðÕW_Eâÿíÿ¹çžËèœ¤}¨{÷î‘ø?âˆ#˜ùOZãQ^@ žx^�zý›z ¶_ÊÂy-È¶Ûnkä–B‚   ä›€Üþ~øáÈíÿ™gžÉ÷åŠ’·nÝÌgœa<ð@ÄQZ€‹B ˆi,i-Iš/õð©`;�T»3¹¦Ô¬éœ�‡~M€  2�o¾ùÆ<ñÄ‘øúé§ƒ¬jûöíÍ	'œ€ø²u©  �ìHcIkyHk©Ÿ±ÅÀ“€:& _K²€   �-Ðš‰EûUükÍÿI'�dŽ<òHfþ·Øx€@zxÔYx ØnƒÀ£@z¾†Ô€ 
M`íÚµæ‘G1?ýéOÍSO=UèËäz]»v53gÎ4‡rˆiÞ¼yA®ÉE  @ þð ð×F J Î® Z›B “œ  @ ‚€fþÿõ¯™«®ºÊ<ûì³oô¬uëÖæØc�5Ó§O7-[¶¨fT€ \xÔYÒ|ÎºÏ¥.q8@é çÅû²Ja ˆC—¦€ Â" 5ÿšñW´‰ÿo¿ý6¬
ÚÚ´mÛÖÌ˜1#rûoÕªUpõ£B€  �;i,� Îº/÷šÄãL ž– hm
€xtjJ@ Úêï¿ÿý¯9ÿüóÍþóŸ Å‡"MÉ|  @ IDATÌ©§žj¦M›Bi;ê@ ~HcyŠµF@Û$ < Ô11 øù’“  £5ÿÿüç?#·ÿPÅ¿¢ýŸ~úéæðÃ7Íš5£Ù! @ ›ð¨³0 Xº < ð Øì»Ê€  �#­ùþùç£hÿsæÌ16lÈ1§øžÖ¤IsôÑGG3ÿˆÿø¶%ƒ  Plx øm ¥ ç�%‰à·c’  �´Ðšÿçž{Îœ{î¹‘@Æ€Ð’ÖùsÌ1æ¸ãŽ3
þG‚   l‰€ žb HópK Sôº³+ˆG·”a§ª€  °)�õë×›gŸyÖœÁùÑÚÿÅ»víÌ)§œmõ§% $@ €@u<é-‰‚ V;%ï;[‚<uÊ”à¦š€  °)¹ùËÝÿGgýÈ¼ðÂ&Dñß¼yssüñÇG³ÿ-Z´ØÿC € 6#àQg9k¾Í
—ÀX`ŒöSr^\©�[ˆ[3%°OSd@ ‰#P.þËÝþý?´¤uþ3gÎ4ßÿþ÷â?´Ö¥>€ òG@ËS,i¾ðöÒÍ=  uÊò#Kþ|€ RN@nÿ/½ô’9ë¬³Ì“O>äÌ›6mÌ‰'žhfÌ˜Ášÿ”÷wª@ [å:K�Ž	€ˆÀƒ@QA›<tJÇ>Íé€  �$å3ÿ?úÑ�ÌÓO?¤ø×Ì¿‚ýÉ  % $@ €@6¤±¤µ<$ bêƒ Xê:œK œðq2  �ÔÐïÆ‹/¾h.¸àóì³ÏšÝþ›6mÍúËíñŸº.N…! x! €Ç% ÎºÏK¥Š˜	 ž< 0 ±si@ 	# ±ÿÊ+¯˜sÎ9Çüë_ÿ2ZZ’ÛÿQGeN>ùd£Èÿ$@ €@.< œ×äR‡8�ƒ @œú#e�  <Œåîé¥—+þäïØc��ÄëÖ­ƒoS*@ ù#€À/[– °Ào�"7@ Ø*ü»òÊ+ÍSO=eÖ­[·ÕÏ&ñÍ†šƒ:È}ôÑüKbRf@ 1#àÙ À€˜µo1Š#7gWOëRŠQ®	@ " ñá…šüãAºýk¶ÿý÷7§�vš))))U.@ ¡ð¤µ¼è¾¤³f	@©øw+I€¤(?  �üPôb‰ÿK.¹Ä<öØcAŠÿV­ZEnÿrýïÒ¥Kþ`’3  ¤Š€G i>ç‰ß¤ÃÇ à) Û &ý«@ù! ä�€Öü_}õÕæïÿ{�â_Ñþ?üpsÂ	'˜öíÛç$9C €@êÈ À6€þš� žb ¨SzrMñ×ºä@ E' ™ÿn¸Á<þøãfíÚµE/�ï4nÜ8rû×Ì?âß7]òƒ   i,� b Ð¥Œ\A¾rå -œ<uL×¢p>  Ä„Àœ9sÌUW]eþò—¿)þµæêÔ©æÔSO5½zõŠ	uŠ@ !�Æò´]®4ŸóÒï¤³e	€1_ÛFtÞ€Y‘œ1 $ýë@ù! ø#ðì³ÏFnÿ?üp�â_[ýyä‘fÆŒ¦[·nþÀ‘  @ i,O»æHóIû¥:±Àƒ@ëRÔ)¿þ:õý)Õ_&*@ œÀ«¯¾¹ý?òÈ#AŠÿ&MšD[ý!þË[œG@ Èi,i-i.Ç„ÀÄ Ô à¼³Öuâàø•ät@ xíµ×Ì•W^iî¿ÿ~³fÍš j´qš7o‰¹ý3ó¿1þƒ   ÿ¤±<ÅÐ‘æKýŒ-  êæ üÙÉ€@Ò¼ðÂÑÌ¨â¿Y³fæˆ#Žˆ¢ýwïÞ=iÍCy! @ �< ð °íÏ O ¦`	@ï(€€'¯¿þz$þxà³zõjO¹Æ'›F�™8ÀwÜqñŸv¡$€ B' �å)  ÛYð (�©Îà”äæ‰À	!'C H,�7ß|Ó\sÍ5‘ÛÿªU«[�-\kþ÷ß3kÖ,Ó³gÏ-}Œ×! @ Þ	HcyZR'ÍÇ. Þ[(yj;g€– ` H^ãSb@ ®žþysË-·˜ûî»Ï„(þåöè¡‡šã�?ÞôîÝÛçC € ²" �å)€4ŸóöïY>†ÆÀƒ@ù. Œa§H€ òH@3ÿ7ß|³yðÁÍÊ•+óx¥âd]¿~}3yòäÈí¿OŸ>Å)W…   �T�Æò¸  ©îM•wö ÐzO< *€ò€@èÞyçsíµ×š?ÿùÏæ‹/¾®º40{î¹§9í´ÓÌöÛo\ý¨  $ƒ€4–§Ø:Îš/Ä¶^J< JùÈDKÖØ:®-¿+·OOÁ)¶|Þ�   �Xx÷ÝwÍÕW_mî½÷^³bÅŠX”Ég!ðoÊ”)fæÌ™fàÀ�>³&/@ €@V¤±<,±“ÖK½û¿Àc (í~²i_Èº¥ÿfÿ÷óÏ?÷µ6%û‹s  „€–|½öÚkæ¦›n2÷ÜsO°âÿÀ4§Ÿ~:kþÒ«¸  l�€ÖÿKk9&i=< ,¶,íI²­)}šÛ_Y¦¾ú
£Rnô8€@2ÌŸ?ßüìg?‹¢ý‡èö_§N3vìXsòÉ'#þ“Ñ%)%  �à	Hcyð´–ÖC¬Yx ”~edÒ¾MMKÿÍí¯§í)r»8gA €@^	¼ÿþûæÊ+¯ŒÜþ=ÌDäµ¬¹d¾ÝvÛ™ñãÇ›sÎ9Çôïß?—,8€  à�€'�%­‡€…€ ´‹ª3|Yú4÷¿êœŠRY«V­Ü3áL@ ˆ¹ý¿÷Þ{æºë®3wß}·7ÄXÕO…iØ°¡Ùk¯½ÌìÙ³Í AƒL�9‡Ä‰]Ý(  $—€´•'€´ž–¤>a (íêÎ ­O‘‹
€Ô¯  D`áÂ…Q´­ùqæ¿nÝºÑÌÿ¹çž¹ý#þê¼T€@Â	H[IcyHÒzx XÄ (íMÞ< ˆàáëI€ bB@âÿª«®Šfþ—-[“Rù+†ÖüO˜0Áœþù‘ø¯Y“a�?ºä@ ®¤­<z ` °‚@i¯ôb øòË/�ö©$A €@ò	Hük«¿;î¸#È™ÿúõë'þµæñŸü>K  „F@ÚJËCÂ "€RZ°ÚµcÉ:…€+EÎ‡  P|¡‹Íü�7Î\rÉ%¦OŸ>ˆÿâw9J @ Uðè ­G _¿ÒŽ¦-!œMK Jaò€@’	,Z´È\ýõæÎ;ï4!ºý×®]ÛŒ3·ÿ$wRÊ@ %< ¤õØÐBÀ ôË#k�¶†pJ«W¯ÆÀ‰ 'C (Eû_¼xq$þo¿ýö Å¿¶ú5j”¹øâ‹ÍŽ;îÈÌñºW†   �È  �å!Iëá`!` (íMŠàÜ³V­ZeÖ¯'¶D)RþB H�÷ßßÜrË-&Tñ/·ÍüËíŸ5ÿÉê›”€@Z	H[IcyHÒz5�% ¥½ÉKÀ+V˜uë0,yø‚’  �‚ÐÌÿ­·Þjîºë.óé§ŸôÚ…¸Ø6Ûlc†jÎ<óLÓ¯_?¶«-t®@ Î¤­¤±<$‚ –AÄ „6—üÂµcihOÛT¸…ó! @ CK–,1?ûÙÏÌ¯~õ« Å¿fþ‡¹ý�1ñŸa¿àc€  P|ÒVÒX’´ž4_ê€Ò.°Æ>8÷¬Ï>û@ê¿R € ’Dà£�>ŠÜþùË_)þðOÑþ5ó�øORÏ¤¬€   2 HcyHÒzÒ|©O J»À×öÁÙ·Dn£žö©L}Ç   �|X°`�ùõ¯ìÌ­ZµÌÈ‘#Íyç�y è  @ I¤­<-Í“Ö“æK}"@E�EÈÉ*¤ ,¨ Ê3@ q%°téRó›ßüÆüö·¿5ZZªY³f´æÿ?ø�<x0nÿ¡50õ�  �ÒV‚ :ë¼�pãPÑšåq êU¼”Ý³o¾ùÆGÍî¢|€ ²"°hÑ¢hÖ_ÿCÿrû6l˜9ë¬³ÌÄ‰Ùê/«ÞÁ‡! @ N$þ¥±ëÿ+Ä F¹ â•ž©“j¿J  Ä�€Äÿm·ÝEüQükæÔ¨Qæì³Ï6&L@üÇ¯R"@ È�€4•‡Ù]@%æ *`h+@ç� V®\ÉV€Ly@ 6>þøãÈí_Ûý-\¸06åòU�5j˜]wÝÕÈí_â_[ÿ‘  @ I% - ¥­<$i<i=’%€ ¢ÈÀy'  @y@ .>ùä“(àßM7Ýd>øàƒ¸Ë[94ó¿Ë.»|7óOÀ?ohÉ€ ŠDÀ£@�- ËÚ‘é�ŠíÅ °bÅ
< *˜ò€@Ñ	,^¼Øüîw¿3?ÿùÏ�¶ý-iæ·Ýv‹fþYóZëR@ é% €´•‡„ D< *`¬³O�{ØçŸnÖ®ÅÀT�•g€ ŠG@[ÝqÇÑšÿÅ¿Èî¼óÎæ´ÓNcÍñºW†   �<�¦’¶ò�¤ñ¤õH–  ÝÀ‹ÀgŸ}fV¯^]‘+Ï  @ ($þo¿ýöhæ?D·Íü:4Šö¿ûî»³Õ_Qz…   �|�¦’¶ò�ð ¨@ œ{˜œ_~ùeE®<ƒ   �‚�Ûÿïÿ{ó³Ÿý,Ø5ÿŠö¯™ÿ=÷Üñ_ðÆ! @ ß¤©¤­<$i<\´Ë@² ¢G­±O—Uü›Û3E™Æ �;Î‚  àƒ€þÝ}÷ÝQÐ¿gþÅ¨ÿþfæÌ™†™=†<  @ Ž¤©¤­<$i<i=’%€@E7øÚ>UçØ`�œ#K—.õµ]EEÉx@ X¾|y´æÿÆo4óçÏÏèœ¤}¨oß¾æÌ3Ï4“'O6µk×NZñ)/  @ #Ú]MÚÊ1IÛIãIë‘, wm4¹Ê�6~9óÿ¬BÑ*¿ýö[£õ™$@ (
ºóÎ;Í7Ü`,XP˜‹ð*úM4h�™={¶™:uª©S§N¯Î¥  @ …# -%Må!¸º´�4©Œ €�»‚¢÷}b�œ ÊN3PrYiÐ �þ%A €@ž	h†àÞ{ï5×^{m�â¿fÍšfØ°aæœsÎ1cÇŽEüç¹?‘=  —€´”4•‡$mG„öJ svu¯”GHOÂ¹§}ñÅìR¯ .€@¬	èž{ÿý÷››nº)X·ÿîÝ»›Y³fEâ¿^½z±n
@ p%  ôûî!IÛ °H •`Ø§²9‡š”µjÕ*y›�  @ Ÿä¨€—_~¹yë­·òy©¢åÝ­[7sÞyç™½öÚË þ‹Ö\€ 
H@ZÊ“€´ •ÚŽ% •`”ug€ö«TÐ
  ä�€úÓŸ"ñb´¹ýo¿ýöQÀ?­ùßn»íò“œ! @ 1" -%Må!a Ø"€��h{çž¶lÙ2 så?@ ^	h` ·ÿ«®º*È5ÿ‚¥™ÿ.¸ÀL˜0ñïµ÷�  Ä�€~ç¥©<$i;¶ ¬@%ö©—% K–,ñå²²qéø€ ¢%Všù¿è¢‹Ì‡~$‰ÿK/½4Úê·ÿ ›˜JA €ÀVÈËOšÊCÂ`ˆÄ Øˆ¬CŠé”äŠêÉeÅ©œ@ 4Zxß}÷Eâ_÷ZmRÒV=zô@ü‡Ô¨Ô€ ²& -åiyŸ´ •Z €J0ìÓ¯ì!+‘F”5ì‘Súä“OŒ  ø# wÀ‡z(ÿ,ð—qŒr*))1W\q…™8q"nÿ1jŠ@ …%àIOIÓIÛIã‘Êà°yWXa_RGÉ9iFJÛV¬]ËŽ9CäD@ •h?àx Z?þüJï„ó´K—.æÇ?þq$þë×¯NÅ¨	  @ ÒPÒR¼ü¤é¤íH•` ¨£ì©öïûÈN~¥
ZáiïÊÍKÈ+€ RD \ü_xá…fîÜ¹>±£×¹sçÈí¿ýö3ˆÿØ5‚   ��†ò PZNšŽ½Ù7i; › ±ÿ~i�EöÀ °9^�  PP<üðÃÑÌÿ¼yó
zíB]Lÿäö¿Ï>ûàö_(è\€ bKÀ£@šNÚŽT‰ 1 *Á({ª� rÒÙ °b'›ãå@ ™X³f�ùë_ÿ‰ãPÅ»víÌøC3iÒ$Ó AƒÌÀð)@ €@À¤¡<y HÓIÛ‘*À P	FÙS¹‰,´‡“@�+<tÜÍKÇ+€ R@@â¿<àß;ï¼d�Û¶mkÎ;ï<sÐA™F�YG*@ È–€4”‡€êÒrÒt,Ø¤0 lÄþ»ÒÎ í[é¡ãn^:^�  8�Õ«WGnÿçŸ¾	Uü÷êÕËœ~úéæÀDüÞŸ©  dG@JZÊ1• ¤íH•` ¨£ì©ÜDÛÃÙàã�?Þ<w^�   �-Xµj•yôÑG£hø¡ŠEû?ë¬³Ì”)Sÿ[ì	¼@ i% åa"UZNšŽ% ›t$‚ nÄþ«Î²ÜN#¾ùæóùçŸ=’  @ zëÖ­‹Öü_yå•æõ×_¯þ„~BkþgÍšüÃí?�H‘! @ ¯<j(i9i:§IÝ¼V¶H™c ¨¼:Œ,FNé³Ï>c+@'‚œ¤…€öüÕšÿK.¹Ä<ÿüóAV»cÇŽæŒ3Î0Gq„iÚ´i�u¤R€   Ú@ÊC’–sšÐõP†Xf� êfYc_v^ðé§Ÿ°j¾¼
@à;ÿÚêïòË/væ¿{÷îæ´ÓN3‡~¸iÒ¤Éwuç	  @  PÊ1•»ÿKÓ‘6!€` eÿª³hßH'—­_ñdÁªº”¼
@ á¾úê«Hü_qÅæ¥—^Jxmª.~§N�Ì©§ž‰ÿfÍšUý!^…   @ ÒNâ¨IÃIËa ¨¢O°
(ö%¹‹,°Ç{äl$Y¼x±� ¶$@ á(ÿ—^z©yùå—Ã« ­QIII´æÿ°Ã3�7²ŽT
€  à‹€‚ÿIC9&i8i9– T@PìKÚ/r¾=œ< >øà³h‘ŒO$@ ¨L`ýúõæ‘G‰Öü‡*þ{öìÍüOŸ>ñ_¹ñy@ Øi'i(Ç$7ßÒt¤Mä<»½I>¡ý»ÞVHÊýk—Ši/k¹°lØ #	€ D@3ÿÚêïšk®1/¾øb�Pðï„N0|ðÿgï<À¬,®ÿ?6Š¢¨H¯‚4E{7Öh41ÿ“kLb7{ïIŒÆh4ö†RÄ("Uz•*H]`dé½ã>óÛ«‹,[î;ï½oùžç™çîÞ½ï¼3Ÿywîœ3gÎÑ™ÿDŽ°:%" "à› :º:T@A‡C—C§“|‡€ ßRò+V#ÂO.+ûÏ•— «W¯®üú¤ˆ€$˜ ÊÿÇìvþ‡’Èž6iÒDgþ9²ê”ˆ€ˆ@˜Ð™<ÅOC‡C—äÍf_óY· ;§�ËH`ÿÎ±ÍR"" i'°qãF·óÿÀ&6Õ_«V­œòÿ›ßüÆ(à_ÚŸxõ_D@D *Ð™Ð�<:œÜÿwR€�€±oã{RhK ÿ}ÒXx²dí¼¥ú‹ˆ€Dœ ;ÿ0O?ý´5jdÄ[›]ó4h`~ûÛßš_üâRþ³C¨«D@D@RL �ÉC
@t7t¸Àç’:
¸ó‘å¡ÁzÄC”µ¡dÑ¢E¾,Y;o©þ"" &€òß¯_?çö?bÄˆ·4û¦Õ¯_ß\yå•Î €!@"" " "P5ìþ£;t7t8 vR€�€±oã6Búˆ@2þ|STT¨]," q%�Ùù¿çž{LR•Îüãò�@Ê\ŸTµ[D@D ßÐ™Ð�<:œŽ ì¤ ;cß^oÖ£­¶dÍ	WdR^U«VÍV%�t ŠoŸ>}\´ÿ¤*ÿÍ›77×]w�‹öß°aÃt¬z)" " ž	 +¡3y8:�î†‡.')ƒ@Ö®íeÔ•´·ˆ¹Ä–ÀÖ#dLÚã¡þˆ€”G`Ë–-nÇÿ¡‡2#G&óÌ?Aþ.»ì2sÉ%—˜Æ�—‡C(‡ º’åŸ; »¡Ã) 4Ê Ê€Rê-ò÷Í¶…\’YgYt k|ºPD fPþIñwÇw˜±cÇŽ$MPþ¯¾újóûßÿÞhç?i£«þˆ€ˆ€äš º’‡óÿèlènÊÁ^Î Ê Pû',HÓm	d X°`�),,,ÿNú«ˆ€$€ .|Ã†sÊ?;ÿ[·â‰—,ÉüÃ  �ÿd�­z#" "�èJèL�Ý-°wÀvDúò¬Ï¶GºWþ·ÖV5Ó¶¯jd[-óÜ¹�ã	f{{]'" 9!€²ÏŽÿý÷ßïÜþ“¨ü³óÕUW™K/½TÊNž*ÝDD@D Ð•< ÐÙÐÝÐá$;! ÀNÀ”¼�ûÈ4[y Ì›7ÏÌš5Ë|ýõ×f—]v)ÿŽú«ˆ€Ä� Ê>;þ·Ýv›{M¢Û�:uÌµ×^ë\ÿëÕ«ÃQR“E@D@D zÐ‘Ð•Ð™
:º›Ž ”RG Ê�cÿDôH¬H�¢HnÛ¶Í�iY¹reùwÓ_E@D †PþG�eþò—¿˜áÃ‡»¬'1ìF¹MÆíŸhÿ¸ýó³Œ¹åâÒE@D@D ÒÐ‘8ÿ�ÎPÐÙfØ².`=‰¾\€ò‡—è‘Ëm)²%P$ÉåË—›¯¾úªü»é¯" "3ü?~¼ùë_ÿê”~OšàöÍ5×˜+®¸Â4hÐ iÝSD@D@D ¯Ð‘Ð•
º:ÛŠ€õ$þr *b,I³l	´ª%µ…‡s-·VŸ�ÀRÏ™ÜþÙùO¢Ûÿ~ûíg®¼òJsùå—KùÏÑs¥Ûˆ€ˆ€¤‹ :’‡”éèjèl�<·Ó@^1 *åö#D“$¨Ä¼ìO›‚‚‚²ÿ¨wE@D fpû7nœÛù4hPb•výÿð‡?˜F�Ål„Ô\ˆt$t¥€‚®†Î†î&)‡€ åÀ)ùSæ,	UÖ²páB3}:Ï¤DD@âM 7ÿÉ“'›;ï¼Ó|öÙg‰Tþ	øÇ®?çþ¥üÇûyUëE@D@¢M 	])  «Í°E €Ô€
 Ù?cEšmK  ®±¸·¬]«¬#×'D@¢LàóÏ?7<ð€2dH"þí½÷Þæç?ÿ¹ùýï/å?Ê¢Ú&" "{èFèHŽ¢«¡³É ‚§B€
 Ù?P‚è}Ë*þhùŸX\¼ØÎ/,ÿCú«ˆ€D˜ gþï¹çóá‡š5kÖD¸¥Ù5åÿÒK/5×_½iÕª•¢ýg‡QW‰€ˆ€ˆ@¥ ¡#yt5t¶@�Û=´#òUÈ P¹!bÛÿý@� /2³ç`˜’ˆ€ˆ@¼pæåÿ®»î2Ÿ~ú©Ù°!yözõê™_ýêWæÆo4-[¶Œ× ©µ" " "CèFèH]M®Ö• )@% Ù�l´eš-�Ž�ßröl *‡\Ÿˆ�aÃ†¹�ÿ~ýú%Òíß}÷ýfç_Ê”ž<µED@D ÉÐ�Ð‘
:º:›¤
X ’?³Õõ¥-<\5KÞ«òËâÅ‹] @Rgíº«l/U¨DÀ3�¯¿þÚlÜ¸Ñ°»M`;^)ü�î¾ûîîÿ”×ÝvÛÍT¯^Ý½znB,ª#ÚÿSO=eúöí›È�Üþüã»3ÿ¸ýKD@âC€ù:3�—žË™ß3ówæµZµj©�Çã3¢jišðÿK @t¤€‚Ž†®–<÷Ä€`Êº\€²¨ìøÖ¤)¶²*Ü¢°°Ð,Y²Äàj*‡ ¿Õ«W›åË—»¼²üÏ‘_véÒ¥fåÊ•fÕªUîoœaçÿ’/ Ò…Ví²Ë.n¡˜yÅÀâ±víÚ†Üðûì³�ÙÿýÍ`ˆÏ{™W›I”þ}ôÑGn‘�”~eúÁ8þä'?17ß|³iÓ¦Mæm½Š€ä™ óøŠ+\aîfç•y�÷ye>_¿~½3à–žÃùa³¥tan®Q£†›¯ñúáÿŸ¹»nÝºßÌßÌë¼ÇÜ/— ÿ×èF zÑÕÂímtjOÎ*5\¦“ 7	*°%ëo”r]Ê `)JDÀ‰¸ŽÍŸ?ß¥�™;w®™3gŽ{�È²(ù2¯¼ÇùõuëÖeuwµjÕ25kÖt¯ìó{¦°x$mÜ�hš6mj6lè~çsq¢ý?öØc‰Uþ«þð‡.àŸ”ÿ¸=�jo’°ø/**rŠ ÑÀ™ÏqfÍTzÏÌå¼Ç¾iÓ¦¬0`ÌÝk¯½Ìž{îé
† æhÞã@óæÍM‹-L“&M¾™Ë÷Øc�¬î§‹D@Ê&€NÄÿy@AOCGCWS ÀJÀ” �J>‚¶€kIk[ª•¼Wå,]|©}ôÑU¾Vˆ€·èc�ˆ’�Û_üŽû»C(¸ô‡!¸˜²ëDÙ™à%Ð AgèCÉdw‰…$J&†~Æs Ê2~üxóä“OºhÿIøÇ‚ÿ§?ý©¹æškÌÁå¡PÛD qPäçÍ›÷Í<>kÖ,7‡3�³N*..v%¬Žc8 àE°3Á£.s5›6¼rD¨]»vÎ(€�€¹^""�=t"þçJÆý?»��€7�ãå2 T~ÔÖÛ�N¶å{¶dm @Qùâ‹/*W}RRN WNþoPö'L˜`¾üòK·ÓÏn»ý¾8¼ÎhkFp;mÖ¬™iÜ¸±+š;ä�CœòÉ¢�‚¨œyäÓ³gOç^•vùj‹öŸýìgnç¿uklº�0	 lãæË<>iÒ$3mÚ47¯3�³Û�KÔƒ2¥´`8Äˆ[¿~}çÙ…Q—y£ bÅHD@*O �ˆ5^@áÜ?:ºš¤d ¨¤’�d®@q °6óÅÇŽ
�DD`G¸õcÆ}äÈ‘NÑg§ÆŒ‘\(îØƒßážÅ/Á•O ¼vìØÑzè¡æ°ÃsçRw¬!7ï°8ôÑG«üã‘�òÿÇ?þÑHùÏÍ3¥»¤“ núììG„¢ 0ÚòqXâ(´iF8BÀŽòÏk§N�Ìá‡îQ2êfÚ«WˆÖEèDåyâT²½èf  °’Àd ¨$(û1ü‰gÚB~Éº¶d%™óÊ.tVä¬*ÑE"�Pì±¸ÂýœÝs~ž8q¢áÿ&iÂ™W„s¦¸¢wèÐÁø™Â™Ô\	Êÿ?ÿùOóÁ$rçŸ³½_|±¹úê«MÛ¶ms…U÷�Ô`^ãxÆ[æïŒçÖÌ™,Ÿ’'Ä!˜<y²+ôo.¹x``>ç½$†MÞ(ªGù"€.Ä‘Mk<t3&t5I%È P	H%A!GÅ<[šØ’5;\ÊPnp#“ˆ@Ú	à.�’Ï.FvŠXPe¢8§…»c”>}ú8÷R‘Gq„éÜ¹³[H2_„™>åŸ€¸ý01iB�Æÿ÷ÿþŸsûoß¾}Òº§þˆ@^	pfÃí¨Q£Ü+ó8^[i¼(=zôpŠ?Þ xw{ì±Î0@l‰ˆÀÿ@úî1›,Ø ô£›¡£%o·( •¹$k%¶2•'ð3¸–L´¥£-YG~ÁÚ…ÂsÎ9ç$‘º$ �;B(ý¸ø�3Æíe™¿â;Æë™@†}ûöun¥Gu”3üñnG‰s¨>ƒËã�?nºuëæ"nû¬;
uÑû¢‹.27Üpƒ‘ò…Q’@€sý,à‡æær”ÿ)S¦øHç•<Î�1dŽ`Ô=î¸ãœ‡€2
$b˜Õ‰ Ð…XïvÿÑÍäþ_�2 T–ý(gL¦ØB”É¬ œuáK%ˆ”bHžyv…Øêß¿¿4h�;ÿ•–þgÓOb!Pz÷îmN=õTsÆg8c Ç|D f.zñÅÝÎ?gv“&¡8÷ÜsÍUW]åÝIëŸú#¹&À¹]æqþ~ýú™O>ùÄÇ">×ÝÈÙýøÞÃÈM!xà™gžiN;í4ç€A’8Hþ/Xx8ÿ�N†n(F[Úøï’¶ì/“#myÍ–@¡£¿÷½ï™×^{Í¥
Ø&].‘'@J>ÎºgŒ,=D}�|¿Ãh ‹Ev“¾ÿýï›“O>ÙíhØ.™:uªyê©§œ»*é·’&áºà‚Ì-·ÜbŽ<’©[""�-<´ØÅŽÿgŸ}æ”ù»³mN¬¯Ã0yÂ	'8OÐO<Ñ'eˆõ�ªñU$ðÕW_™K/½ÔàéP¤t©-cmQ€JÂ”@%A•|Œk¦-ø«2 �ºË—Îƒ•�ÕK"	lÜ¸Ñ¹ú�=Ú)™4œù—dO€EøÐ¡CÝÑ	2`8å”SÜnyª++,ä9óÿþûïÇ6"wy}å˜ÄYg�%å¿<Hú›T‚ s6ë•áÃ‡»yœWævIöð¶"ÞÊ€óÏ?ßœtÒIÎ@°R‰$� sŠ§4ÎèdèfRþ«ðÐÈÿ¼
°J}ôû3Q¤²6 T«VÍ�åå<˜D’F€ˆ®ì(2Äüë_ÿ2Ï>û¬;ã¯E£¿‘&H"t1pŽŽó¤ì ì®¢³¥óæÍscòÖ[o%Ò CŠU¼¬®»î:CÜ‰ˆ@Õ	à¹Å\�‹ÿ?þñóòË/;O.\w%~ð]IjDŽÄq¬"3‡3�ëˆ¨Æª%š0~1·ÜâÜÿ@[zÚ"€…PY‘ ²¤¾ýÜ®öÇæ¶`È:?Ásš6mjÎ>ûl³Ë.:‰ñ-^ýw¸„’
Åÿ‰'žp»FI<[•qbI�Áƒ›#F¸E#AïØE*+k A©~øaÓµkWÑw£‚á›v ü`õ¶ÛnsÊY¾ù°~Ø� s
G´ðØúÛßþæRƒ²['î¨¼½‘1|úé§ÎÈ‚!`ß}÷ui`µFô†YE„ Ï;Ç Y·`h ËíµïÛ2ÊY&« R€*À*ù()&ªÛr®-û•¼WåxÎížwÞy†sªˆ;\ÓIã÷ÒK/™'Ÿ|Ò|ôÑGfÅŠ>ò»ÆMNÚ�Q±¨¨È-ÚQòñ2"H †€Ì’`‚�<òˆyç�wLÏî¢üãöß¥KsôÑG—i ÉÉ`è&"SÌÙÄjyæ™gÌƒ>èŒ¹ë×¯×<žƒñD)ÂÈ2}út —3Ò™9\ëÄ€n‘3þ{á…qˆJ±½þß¶Ì±E) « S€*À*ù(.'ÙÒ¨ä½¬^Ø¥#½W“&M¾Y gU‘.�<Ø¼y³síÕ«—¹ûî»]*9v¤qQ—äž † �¸Ö‘_—¸ ,"]ª?”ÿU«Vå¾a!ß‘ ZdH@ùïÜ¹³æÔ�y«úd@ñd—ŸcAwÞy§3$bÔE)•ä– Ì×¬YãŒ/¤ÉEYÊÌã»ïžõÉÓÜvBw��àù?~¼[+z=ËÞæi[Vïävz{'d Ø	˜
ÞæñD[˜õl\½zusÐA¹èÔ™º
î«?‹@¤°Ha·ˆ]evþÙyÖùÐü_°¤ê"'7Ç1pƒïÑ£‡yï½÷|¤ÜÉ¿ÓvþI­uã�7ºÛrûÿ ý*å`×Ÿ¨þÌã¯¿þºaçYÜr€åèOÌãI#ˆ.A[ëÖ­ëÌwZ3æhtïx®ñå¸sO !é0[Þ³es€zRyiÖÊk*i}Ûi´‰¶œaKÝoß®ÚO|ÉbÝýÍo~c0HD .Pòq7÷Ýw�®åÏqÅ¥ë±j'F rOc`|’x†—¹“3ÿwÝu—¬*å?V�¨›GxØÀs(ýÿùÏ\àVÍãy�2n�²Ä‚Îœ9ÓÍu—_~¹Ë ucÀôVä	à5ŠîƒPpeD“òŸH ²€f/!bÅç¶�Ï,k “:V]Ü¥›5kf«’ˆ@ô	°ëÏŽ‘ýûõë—Èåè�Bå[ÈN^Rƒ0âöO´”ÿŽ;jW¬ò�…>™r¸•“†î¿ÿý¯ËÖ’Ô9")ÃŒÑ}Îœ9æÅ_tß¿x;Dš£¤ˆttt €‚†.(Š`À6Äör ²:7aÑ'	_Âü#�@.]�Pêâày%o<ùãµëŸàºÅN	°ûÅ™ÿ;î¸CÊÿN)é"°=�Œ÷Ö«¯¾êŒ¸ÅÅÅ:¶µ=¢Hÿ†×ÆØ±cÍ­·Þê<»ð mÑ¢…žFzÔÔ¸<ZÐyXKz*ASÀ©,`*@ÐJ.!ÝÄq¶´µ%kC
îª­ZµrçVe (!«—È`ÑH€¨ÇÜüûßÿvn£:#¹aJMƒ2Êÿ=÷Üã”åËNÍÐ«£ <4ÈÍã 8_Î‚\?r�<y²3` ¨_¿¾Q€Àø�cÚZÌ|Ó½{wç=J�Ñ ÂùÿÁ¶tµeS€zR{iÖŠkj‰}ÛqÎœŒµåt[~ûvÕ~"J7¹»ùb&°‹D¢F 7-žÑ‡zÈ>ÜE'ŽZÕžô@ù?ýôÓÍ½÷Þk?üpí|¥gèÕÓ,	°èFaìÖ­›ùç?ÿé”Æ$ÆÉO,/cLIåÚ»wo—áå¦›n2çž{®K/Ë©Ñ© €®ÃzÝ' ,³×£ƒéü– å�%¸’Ëàw†-õ²­†Iœs¬D°®S§N¶Õè:… çý{öìin¿ývwîP‹ÆP0«ÒJÀHzòÉ'›ûî»ÏqÄRþ+ÉMK7¶â¹…)Bè/9ÏžxSãX ;ªíÚµ3{ï½wr:¨ž$Š q,ÈÅœPæÙë_°e®-rcÊ¦< ²€Vr	G ¦ÚØŒµråJ÷¥LJ@È~@t¥_œ%'4A‡¦N�ª´P~ñª¶*À½õØc�uÆ(þ)Úêã©$@jÖ§žzÊÅn!ø›’ä˜;w®èˆ§X:yc÷1÷`€Dçñ è^è`èb’,È h¥.áJg[±e�RïWùG&ë“N:I‹Ú*“Ó¾	0IÏ›7Ï<ñÄæùçŸ7, µhôMYõU… ÊÿñÇïÜþO<ñD³Ç�¦ÛªÜZŸ�X`gøóÏ?wG·Þyçç.ËŽ¨Ñ•&°zõj`mþüù¦uëÖî8€â£TŸ>2æ$æ¢Í @ú€¾¶t³EÍ,ÇM€,Á•º¬‘ýù[²ö¹Â­šc ]t‘©V­Z©ªõ£ä–@ÆB‹‹õÛo¿íòBç¶º›lO e¿sçÎæþûï7(ÿZÐnÏG¿‰@YÈÿÈ#�˜ÿýïÎ5¼¬Ïè½ä`=9sæL3aÂçÐ¼ysm,%o˜cÙ#âIýãÿ0“&M
º©´ØxÛ–±±‘Fï‘vÄµXž&Ù(ŸV±¸¯ü,�|=z´yà�L¯^½ÌŠ+òÕÝW”ýcŽ9ÆÜ|óÍÎý_Ê¿¨˜À'Ÿ|âÜþûõët§­â›é‘#€¢5dÈóàƒº¬Šù¹!J]ƒÐm8ÿ�®ãAÏAçB÷Òî€'I à•\ºÆ¾žkKË UÙšt€|°Ü[ƒ€ÔµY`çŸÿìü£üüO"ù$€²ÜqÇ™;ï¼Óœ}öÙòŽÊç`èÞ± À<þÑG¹�ÿ�m�Å°…ÒHž…‚‚çÐ¨Q#Ó¸qcÍ¡¡�V¥•!°aÃ—±ã¤‡Í¥‰öžÏÚ²¡2÷ÖgÊ& @Ù\ªò.ù'�°åP[²ößß¼y³ÁpÖYg™š5kVåþú¬"°uëV3xð`w¾ºoß¾Šˆ¦.öA ³ó�òÆg(¿µ¨ª#ÑØåýàƒœò�1W»¾‰îJwŽx S¦LqÇL‰À:S"¹&À¦Ò3Ï<cÆ�gÐwÈZ{í'¶|`‹< €Ô€ ðJ.åüÜrRf-k×®uçb.\˜uºPªJ W,”ÎWsfc€DòI€€œùÿË_þâ”¹ýçs4tï8@Ù'ciþÈ±­y<£–»6€g£G�Š‘;ìºS)è6œýG×	(èZè\Rþ‚”  À’‡pœ}€f,[¶ÌLž<9¨uŒª$"P)C‡5�>ú¨‹Êêá\V¥î©‰ÀÎ�Ú�@(ÿxCIùß)½/ÿG€y»{÷îæoû›5j”�óµB›@Ó¦Ms™}>þøcƒ;¶DrE€tt‚®…Î%@@˜2 XrùlûJ	ä×BþÖaÃ†™M›8U �p	Œ1Ò<üÐÃ†3YÚ1
—µj¯˜@Fù¿ýöÛÍùçŸ¯óª#Ó'RN€�b¶<öØcfüøñrûOùóPQ÷ñxè¡‡\fJD ÐiÐmÐq
:VFß
X•.—ÀÏ3ÀL:Ú–%AªÃ5†’åË;i†®MÜDIÕçÓ>Ú1JÁxG½‹(ÿ'Ÿ|²éÒ¥‹sûçw‰ˆÀÎ	°«†K7®Ýœ«•×ÎYé/ß;v¬;òG°È€g±¿­T?‰@9ÐiÐm<¸ÿ£c¡kÉzUïÊþI«¬Ê’*ÿs¸¢Œ²%Ð~¾ÀÍ¬Y³ôe^>oý5 \Ÿ{î9Óû“ÞÚ1
ÀQ—ú!°Ë.»˜ã�?ÞÜpÃæôÓOWÎj?XUK‚	á�õÓO?íÜþåÁ•àÁ¡kx‹ðìŒ92h>öZ§*“D ½�ÝÆƒ‘]Kîÿ <@,y	J1/hu¸e‘‹]é{‚’Ôõe`FùçÌ¨\ Ë"¤÷rM€Tœù?ï¼óí?×ðu¿X˜8q¢;Ï�@Gc9„yoô AƒÌ“O>éÖ›yoŒ�Xè2è4žÖ›èXèZ2 xxbd ð ±¤Š¥öuŠ-«ƒTIªŒ(Rkˆº¶LK–,1ÿýïÍ›o¾éã,V™÷Ð›"PY¸ù³óÏ™ÿ³Ï>[ÿ*NŸK-vÐfÎœé”b·(Õ_j/ç Á#	Ð&�0¬[·Îé4è6Ý
]Kâ�€  –ªb’ýù«R¿WùG¾Ð§N�jŠŠŠ|¸ËTùþº ™°¾öíÛ×)ÿ‹/Nf'Õ«XèÔ©“¹æškí?V£¦Ææ“ÀÒ¥KÍ+¯¼âÎþkç?Ÿ#‘Œ{³;KV€·ß~Û°A Ÿ0X¢Ë Óx0V¢[¡cI<�ÀÈ’jpMY´J,eÃ‡7,fA›¢ë@€I¸OŸ>æ_ÿú—áü¿DòM cÇŽæ–[n1_|±Ùc�=òÝÝ_"O #.Aÿ8Âµzu GÃÈ÷UÌ�+V˜·ÞzËôìÙÓ—›vî¯;Eš€g]Ý
Kâ‰€ ž@–TCzŠ™¶l	R-_îXe=åÌÒ]› cÆŒqn~Ÿ}öYz£.Ä™ ÿPþqû¿è¢‹L�5âÜµ]rB€Ý³�š¿ÿýï/ ‰ø$0{ölóïÿÛ=cÊà“lºëB‡A—ñ`°D§B·BÇ’x" €'�%Õð�~aË² ÕnØ°Áy |õU ÓAš kB€Åâ«¯¾ê¢ý&¤KêFŒ	´nÝÚ\uÕUæÂ/4ÕªU‹qOÔtÈ"þÏ�;×üç?ÿ1_~ù¥¢¶ç{êîB 6Ö
_|ÁV"Á	 ÃàÍŒNPÐ©x0m®lCâ.—Àÿ�ŽµUz90aÂ¹dùŸÔÔÈ¤ûÎ;ï˜^½zé9JÍ¨G·£íÛ·7wÜq‡ùùÏnªW¯Ý†ªe"!‹-rÁ[9Æåám„z¦¦D� k…gŸ}ÖG­ijOÌpd	ÆÓQft*t+‰G2 x„YRÕDû:×–@i*ðCš–åË—ûo¡jL<Š½{÷6¯½öš™7o^âû«F›@»víœòÏ™ÿÚµkG»±j�D„ F\"µãžíi!‘ž©Q$°víZ÷¼±q TÔQ¡ø´	Ý…cK‚•¢K¡S¡[I<�À#Ì’ªÐØÇÛ²(HÕ(pC†1v&Ò]SD]}ê©§Ì¨Q£bÚ5;	Hõwè¡‡š.]º¸3ÿ5kÖLB·Ô� Á[qËfGVñ€BÇ­”(,,tGˆÄñ‰dC ÝeèÐ¡>¼–Ð¥Ð©´šÍ@”s� åÀ	ð§ÑöZV¾ô9�%Kl Œ©»˜�¢—_~ÙŒ?^©$S7úÑêpÛ¶mÍ=÷Üc~ðƒ)ÿÑµ&Ú.\hÞxã3iÒ$ÍãÑªÄµnÜ¸q.ÝdAAAâú¦…O �ÝÅ“á]
�Jâ™€ ž�–T7Æ¾~´j\gðX¹reÐªt}JlÝºÕ¹ð}ðÁfÕªU)éµº5DûoÓ¦�¹ï¾ûÌ¹çžköÙgŸ¨5Qí�ÈÀõÿ“O>qùÙ=¸ÐF¶ŸjX4	à}Ò¿óÂ/˜uëÖE³‘jUd	 ³ »xš»Ð¥Ð©$ž	È àhIu¸¬L²%P6 Ò±p†FÙ Â¤$Ö:gÎ—'zæÌÀ(IÄ£>åˆÀî»ïn~ò“Ÿ˜SO=U©þrÄ\·IŒ¸ìúsî_FÜdŒi{�J÷îÝÍ§Ÿ~*”8`ÛŒÎ‚îâ!¥$:ºT #ÕyDé[Ë ÞððÐÎZ=“ðäÉ“}¤ÑÚ]qXê	úGäU‰ä“ 1Llˆ`.¨<�‚9æÍ7ßtó¸Î`Wž›>éŸÀôéÓ� ëP‰T† ÞKè,žžt(t)Id jI•<´Ó‚VÏYÒžÎÒmŽ®�(\öÈÑ³gO=+£45ÅeÌ˜1nI™LÒ4òêk|ß÷í××ÅpQìŸ $u­¬+ÆŽkºvíêc7×G“TGÄ	 « ³xš¿Ð¡d iÌe 	¬­v±-“mYä¸Ð�ÿW©Ü‚PLþµ‹/v.£Dÿ—ˆ@�Rê¥—^r;™Ê_…Q¢N`ò¤É†l+V¬ˆzSÕ¾”À‹‹g’c)òHIÉ è&º
:‹÷t't(t)Id j©*yx`Æ­›µD¾K åêã�?v)£<]ùî-ô»dE`þüùæ­·Þ2³fÍÊêz]$i!€ÒßçÓ>.uVZú¬~FŸ Jÿ”)S\F
Œþxå³…è(è*žŽþ¡;¡CIB" @H`Kªe;6p46,iÃ‡7K—.·µª=vør&à
é¢Š‹‹c×~58Ù0NuëÖÍ6ÌÇŽ@²a©w©&0qâDÓ£G_‘³SÍR�÷K€ÔÂ19r¤úE›¨ÚÐQÐU<ìþÃÝI.­!>!2 „×V]h¬�AnÃ?)�”“5Åd^‹Eþ½÷Þ3ãÇ�7r³NæÇ¹W¨–,YâÎ�~ùeàÌ¨qF¡¶‹ÀN	ðÝþá‡šÏ?ÿ|§ŸÑD _2^ Ï?ÿ¼ÒRçkbp_æ1t t&t't(IHd 	lIµ[í+!Ù`òåŒ·Ž„;Xq¬�	—ˆÑ
ÇÑKO›Ù="0‚%" Ûàãý÷ß÷±pÞ¾bý&ž0w�1Âåw'8 DJÈ¸ÿ£« ³t&t't(IHd 	l©j‰`Ø�…	—ÉWÇ J‘Mù�|!cmå|µ¾�Sþ0D¼ûxªdžÕˆ7UÍ�œ ]ÖÐ¡CÍÜ¹ssz_ÝLªJ€ã†dX½zuU/ÕçN ÝÅÓZ�IÑÿC~fd °­~ž-X²V¹µ�v|%" �9sæ˜·ß~[.yzbA`À€nÓâ1Ã¥Fæˆ ßëÇ¶nÕfWŽ�ë6Y µÆ*ÅtÉ`‚/C7a.ó°û�®„Î„î$	‘€ !Â-©z‹}gËø ·Âú:nÜ8e
2×¯_¿Þ|ðÁfÚ´iZ8&`<ÓÐ…U«V¹g–¼ÒcŠŠŠL¿~ýdØ×Ã……….½«¼Qc3d¡7÷tt‚®„Î„î$	‘€ !Â-U5Ö¬Ñ¥~ÏêG,kì¢yJ±‘UtQ4à6Ú½{wƒ¢1jE%	°{Äygv’$"�v¸ÌC"q!@ªáQ£F9…O^+qµpÛ‰N‚nâa÷Ÿ†¢+¡3IB& @È€KªÇ,6Ñ–•AnÇ?†™3gj×7È˜_Ë0JÔŒ3|�·Š95?.Ø) M�2ÄeÄÔÎ°dRfq”K"q"@f²é8WœF-œ¶bB'A7ñ` @GBWòâJN�“S« ¹KB¦~an-�„›C†q©µU¤‹cK€/ß·ÞzËàR-�¸Èìzz
·î«½"ààÃ™Yí¢ê�ˆ‚ºâ¹òÅ_h"nƒç¹½¬GÑIÐM<:º’ÒLx€YQ2 TDÈßß§ÛªFø¨®W¯^n÷×G]ª#^øâe•|Ñ[¶èˆT¼FO­…ÀòåËÝ‚A;ŸzÒJ`Íš5¦ÿþfòdR]KD ~8ïÝ£Gm@ÆM  @ IDATC<"Iz	à‰ŠNâIÐ‘Ð•$9  @ —Ü‚íZ¾í—¹%.6S¦Lq–W\Á%é"€Û(®w, %"Wœ!3fL\›¯v‹@ S§NuF\ÅÂ„Qç‘ Š?F,âIÒI /tîÿèFèHrmÍÑã$@Ž@—Üfš}póæÍ.Ë‚rÛzÝ-¯p�>}º¶‚'€DâJ€”Að�ˆ@Ú|öÙgfÒ$¥¹NÛ¸'©¿(|Ìã¤ÔfT’F¶ò}Aá(:‰A7BG’äˆ€ 9]r›öu¨-�þrvP�´r;xù¾gþ±¸KiÊ÷Hèþ>Œ=Ú(% ’ª#NX4Ëø§S[wF€5	Ùˆ�hg„’ý>:ºˆA'B7BG’äˆ€ 9]r›Õö³aÐÛÎ›7Ï�Ôù« $ãs}qq±3 èì|ÆL-Ý9Ü1(àÎé/É#0~üxï“7¬©ì;¿<Ï³fÍRL¢”=èÄ0Añ èDèFèH’� G KÝ/‰IçéŸ¯Tóôc	 ôsÖ
·Q)LQ!µ©ª–-[æÎAëiUÉéóq%À<NyïÅuÕîïX¹r¥éÛ·¯áU’èè ž�Hîÿž`V¶ *KÊßç
lUŸÙ²!h•œ½!˜�v„ƒ’Œþõ+V¬piwtÖ.úc¥Vž ó×¸q�³£Vþ†ú¤ä‘ g¦Ù5Û°!ð×{¡[‹À·Hüá‡<%é €ÎÁw7:ˆa2D'*ðP—ª¨ ª ËÓG7Úz¦Ú2;h}äßdñ¬‰7(Éè_OôÒÿÉØý±R+O`öìÙfÂ„	>"Wþ¦ú¤ä‰ÀÄ‰Ï¼D’B€c x&’ÖUÞ‰IÕòû�Î�î�âA˜Ñ‰Ð�$9$ @a—ºU�ýy@©ß³þ×+Ð’ä`·hÚ´iÎâê!ÕJrA©g±#@6b�SZ"I&€¢Dð?òfKD Ix¶Ù P0À$�êÎû‚Î�îáIÐ…
<Õ¥jª@@€*ÀòøÑ…¶.ÏNæÎ‚‚3…r)ô8:«jÑ¢E†´QÊ±�Qs¼ µ%;£H2�¹sç9c—R¸&y”ÓÙ7 d(ò´#œNˆ1é5º:º‡ABB'’ä˜€ 9^r»¯íë—¶�÷2��žFvÑ$É$PXXh ÷ÿdoê{…€HÒH2�‰'˜¹sç&¹‹ê[J	à™¨c é|ttt‚„.„N$É1 r¼ÔíX	)õ{Ö?’J‹ó8rÏad/dLY48Jçë";LjX ‘Â-Zî£ êÒÈÀËEY{"?Lj`–ð@9”‡K– cpëQttO‚$«¨'˜U­F€ªó÷ùå¶ª¶>üº|ùr3räH³`Á­SM‘ @ª4¢­òå*�¤ÀÈ¥ÔhI]õ‹,.(GJ•¦g!©X£°3,CnRGØ8]�Ãƒ û y©ÌC{RW… ùr¢}bË¶ Í  ‹ÜhƒRŒÞõœÿ;vlô¦‰€GDFW �@UU¤pÌEúH‰ã™@æ8*âå�ênDªCÇ@×ð è<è>Šˆêf¶UÈ �-9?×áúÂ?Aà¤Àìc™[»v­Ÿ–©–HX¸p¡ùüóÏ#Ñ5BÂ"@
)žss	‹°êÍ'�/¾øÂ0—KD ÉÈq®õë×'¹›©ìº:º†AçA÷‘û¿˜ÙV!@¶äü\·ÉV3Ù–qA«ÃâÊ¹�gs‚6I×$€E�3£‹/X“.�h`þBAR:Àh�“ZWu<Û äPuvº"^X³�²˜#/’dÈèž¼;ÐyÐ}Ð�$y" @žÀ—ºí<ûso[òÆ5çÓO?U´øRpãü#_¢³fÍòm5Î(Ôöà¸ž HÎËò\+�k’FU})‹À–-[œ'±‹$É!À¸¢[xrÿG×AçA÷‘ä‘€ y„_rë•ö•H˜�·y	0„íÌ™3óß+µ 0ŽËÀUALpvƒ—D’B€Ý2â[(?zRFTý(� Š";ÅÌå’ä`Šná)ˆ)º:º�$�d È#üR·æÌ`[çÂ$ëÐ¡CKU­ãJ`éÒ¥Î�.®íW»E *p‘V&€ªÓg£N  g¢™Ë%"�ãb.W<—äŒ6:º…AÇA×ÑÙ0ƒV!@P‚~®/²Õ|dKà`€L¼Ð¹q?ã’×Zp‰&z´DÒ@€ C¸J+€TF;}Üöõ64Kq\Ò1Þê¥qGPIëºzõjáH æ.t
O1LÐqÐuÐy$y& @ž äöœ‰™háÞ·”¼—ÕVWRu­S_›6mrÑ6llŠ/µ<u8ö"e)uÃžØoÛºÍ Ô3�Ø!VÇÊ PXX(@\âøº:…�ttt�À1ÏâÈ2jm– :#²À6…À�5>Î~öÙg%ROkÖ¬q OWã	A­Nv�ð|‘ˆ@¬\±Ò�ÿ':ºDÒB@€dŒ4:º:…A·AÇA×‘D€€ „’&pH°�-�ÿ9p¡5j”™8C›$Ž¶2þü86]m�¬	àÀâQ"I P´ È`Ì•ˆ@š4Ž¹\oèèžŽå¡Û ã( JD "2¶l`fëkËF[É„	ÌÇ¬r�(æïbR ä¯º³ä� ÁÒ8?*�¸À{kÞ¼y2 Ä} Õþ*`Wæ‹*c‹Ôx-¡CàþïAÐiÐmÐqäå¨�*d ðAÑ_˜L{Ú8=
$gw”FÎßàä²&< ´šKâºW` �çKFBmJ ÀÂ…Íºuë‚V¥ëE VØ1f.÷pn<VýNRcÑÐ!<¥þC§A·‘[H„ "4¶)É˜bËh[[É&Ožl>ýôS[•$n˜t‹Š(5nã¦ö#@i¦ñ*�8À @<Oî³qF¡¶§�À²eËôìÇxÜÑÐ!<º:º�¾Ø= õU… ¾Hú«g‰­ª«-�·ØAî×¯ŸÛ…ð×<Õ6¬æxpèìhØ¤U	ðÜ{Úuˆb÷Ô¦À›EóxŠ\]ý†  2~}ƒ#V?à¹„îàÉ]�ÝF!2 Dh0JšÂY™a¶N•ÁÎïôíËÑI\�ú�/O‰¤‘ .Óx(FG?9}æûÀÆ��Cú$Šz’ÅÅÅ:þÓÑFg@wð�½$“â�FaÄž "6 %Í!V[Vm<þ™µ£”dî®GÂ@"i$Àó/XG>Y}æ9æ{W†¬d�«zS9ò ¨§¨}Š9�ÁÓî?Ytåö�Ú@ÛöÈ ÁA±M"oÐ¶Ì²åk[²ÎÒŽ=Ú2$ë:tan	à6·jÕªÜÞTw�ˆÀFŠSDCÍÈš s¸bYd�OÆœ i ™Ë%ñ"€®€ÎàaîBwA‡A—Q.Ô>2 DpPl“¶ÙR`¾û«m	$sæÌ1~ø¡Y»vm ztqnlÚ´É¬^xØsÓXÝE<ÀeZ0ÏPU]Î	pößÃ":çíÖEÀŒ¸:þâƒdîê@G@W@gð ,bÑa
lA§‘DŒ€ �RÍ!Zæ'¶v�Á
;vìX3aÂ„RÕëÇ¨àK“‰X®£Q!µ+L˜žÿ0)«î°	0‡Ë 6eÕU2 DudvÞ.ttOžè.è0è2’� ‚ƒRÒ$,fhìcmÙTò^Ö/äôìÚµ«¢²fM0w2ùÊ w¼u§hàùgñ(�¸ÀxÅ¾y31°$"�>J¯1çè):º‚AgAwA‡Ñî¿ aT!@TýÕ¹ÞVõ®-�½ 8�Õ¿_y=ýõP5í@€P¥ŽÚ‹ÞH	�Ì y ¤dÀÚMy $t`Õ­JÀ ¦# •B‰Mž<Ùéè
�ÝFQ2 Dt`Jš…ëé3¦Û²µä½¬_ŠŠŠLŸ>}ä–˜5ÁÜ\ˆÛ¨¾8sÃZw‰=ÿÑµ¨ê0änÛ¦Í¯ª“ÓI €WG`â1’Œº:‚AWAgAw‘û¿ aU!@XdýÕ‹9®»-‹ƒVIZ–�?þØÌ�;7hUº>Dä^Õgˆ€Uu¤	ðüËu:ÒC¤ÆU‚ s¸ • ¥�$–€Ö1ñZttOéwÑUÐY¼¸Äƒ`<[)@ôÇ�³4ÿ³eª-�·fÌ˜azôè!3ÂãÎ¢Q
P„HM•  vO%"g(?:ÆçTÛƒ`.—D› ó:º�AGAWAgÑ—¸ aV!@˜týÕ½ÐVÕÓ–â U›ž={º4Zœ¥ÎõÚ‡«j�$2 Äc¬ÔÊ²	ðÝŠW eóÑ»é  #X´Ç™yŠ”èè„JÐUÐY$' @Ä¨¤yXÒ>²e¶-_—¼—õËìÙ³Ý?üºuë²®C†G€E£,çáñUÍÑ&Àó¯…c´ÇH­«˜ s¸ŒìsÒ'’K€¹\ÿÑ_t ”t‚nBEè*Úý÷ 4ì*d ›°ŸúùÇšc95W­rÁ‚æÍ7ßt–¿ uézÿvÝuWC‘ˆ@	ðìï¾ûîf—]vIc÷Õç„à9Ö3œ�ÁT7²" ÿ�¬°åì"vÿÑÐ	<º	:
º
:‹$â¤eD|€J5�hšÖ˜Uê½¬~Ä"KÐ�nÝºyd…0Ô‹øÒÜc�=B½‡*�¨@ù¯^½zT›§v‰@…Pü™Ã™Ë%"�V2äFwäYû£ xòÒ@7éa‹"ÿGwØ·k™¾�¶Ãù_¦Ù±emÐ–.[¶ÌtíÚÕ­J×{&°Ûn»É à™©ª‹=ÿñ+µtçd Ø9ý%˜Ë%Ñ$ÀÚ ]Àƒ “ › P2 Äd Jš¹Ù¾baó’Ç�œŸ½zõ26lˆ…„·–/ÍjÕª%¼—êž”M@€²¹èÝxÐîg¼ÆK­õO@ ÿL}ÔÈšŸµ?:€'A'A7AG‘Ä„€ 1¨RÍeÆÒ¶ºÔ{Yý¸bÅ
óÆo˜‚‚E+ÎŠ`8É:®ª5xþkÖ¬�Æª•"°c‘´8z;ñ8þ¢�Œè3�Yó³öGð è"è$è&’� FƒUÒT¶ë»Ú8i'ç~æÍ›ç,�+W®Œ‰„¶˜/Í½öÚ+¡½S·D |<ÿµjÕR µò1é¯'°çž{Ê ñ1RóÂ#ÀF€ðøf[3k}vÿYû{:û�.‚N"Wâl%O×É �'ðnKtÍá¶`mÛ w)ÀW^yÅÌš8¶`Ð¦èú5jÔp
�€ˆ@	ðüï³Ï>iìºúœÄˆ…7‹DÒH`¿ýö3Ìå’h`­ÏšßÓî?:º:‰"ÿGk¨+l� "Šä¸ÑÍ–éA[G®â™3gº\ Ë—/Z�®÷@ ×Ñ½÷Þ[; XªŠøàùÇ  jñ;µø[ ”Íå[ú)]öß "6ä¬ñ{öìéÖü¬ý=:ºHàÀäÚ¢*ªH@€*‹ÐÇ9s3Ò–ÀA76mÚär�NŸØž!<ñm

�Ž ÄwüÔò`2€`µèjÈ/y ä—¿îž_q™Ë%Ñ!ÀÿÍ7ß4¬ù=º:ºˆ$†d ˆá •4y½}ýÄ–‚’ß³~áÑ@ûôécV­Z•u=ºÐ¾4ñ �ˆ@	džy ¤qô“Óg ’3–êIÕ	Ô®][€ªcí
Öö¬ñYë{:û_`‹‚."‰! b8h¥šÜ×þŒ.p, ,‚D�:uª2”œ�	…ûœDÒH ï—8 �]WŸD€ç%H"i$À®l.Ñy"ÿ³¶g�ïi÷�ÝDS2 ÄtàJšM�ž¶LÚ,‚³gÏ6Ýºu3K—.Z�®@€/M  Ô¥±&€¬nÝºŠëQTã	 Ø¤I�ƒÖ£�JÌá:Ê�¡gMÏÚž5¾§Ýtt/y£A)}­� þcÞÏva°-�clÙ²ÅtïÞÝLž<Y^ y|.ÈŸ»ï¾û*@Ç@·Î D�–ˆ@œ	p„€” 8�¢Úžž}y dCÎÿ5ìþ³¦gmÏßƒ k s {HbL@€^IÓ	Ý�Î” ]Á28wî\g)\¼xqÐêt} ¸Ž6hÐ @ºTâG€¨éìí¶Ûnñk¼Z,ß!P¿~}ƒAK"i# 4€ÑqÖòìþ³¶÷´û�®�Î¡´aÑâ¬[!@Öè"u!Q8ù‡`óæÍÎR8zôhã)MH¤@Å¥1 š7o—æª�"à… ‹F=÷^Pª’<`´qãÆò Èó8èö¹'P­Z5rs�}‡;²ãÏZžÝÖö]C‘ÿ=ÀÌw2 ä{üÜµ­æ¶x‰@”PR…,\¸ÐOëTK•	p@ŠP•±é‚˜¨S§Žžû˜�¡šÿ0 4mÚT =©#ÀÚE�\ó?ì¬áYË{Œü�Ž�®�Î!‰9 b>€¥š?Æþ<Ð–5¥ÞËúÇ~ýú™‘#GúŠšu;Òz!9tÙ=b)�´ÀðÕ°aÃ´tWýL8�F�é@ÂÇXÝÛ‘@Ë–-•cG,9}‡hÿ£F�2¬å=	ºÅ@[Ð5$	  @±¤üs~hÁ9Kqq±yõÕWÍüùó×¥
ªN c ðtf«êÐ"�}‘ àuËPdZÄ¶�ˆ@Z´hÑB€<6kwÖð¬å=	º:º†$d HÀ –êÂ(ûó¶,+õ^Ö?0ÀYW¯–·OÖ³¼�3t(BŠ �%@]KÄ PðËX�]R¶k×Îp´E"i!ÀÑ61$ù!Àš��Öðž�ÝC’2 $d Kº±Á¾·ÅË?éš5kL×®]ÍôéÓ“E)&½á]³fÍbÒZ5S‚¨Q£†;öR½zõ`éjˆŽpµjÕJ€ˆŒ‡š>žym^„Ï¹¼;°fgíÎÞ“ S [ cHB@€„d©n|aîeËÊRïeõ#îçX{÷îmä�Â@‘íÐCT‡.�¸ gz‡âÒ\µS*$€2Ô¾}{½Âë"så ¥rÍÏ`²VgÍÎÚÝÓRt	t
tI‚È � Á,é
¹>ÚâÅ÷‡	Kâ¸qãJª×K®ì¿ÿþ¦mÛ¶¹º�î#y%@À4=ïyÝÜ3¢Ö­[+"ºg®ª.šPú�;î8ãÊãð°VgÍîIù§'èmñ’GÐÖ#‰ "2ž›�Ï>¹:½øÿL˜0Áôïßß¬X±Âs3U]y8CÇ ‘H:Îÿã �$  Æ-âHD ÉxÆ>ø`Ã3/É=Öè¬ÕY³{tt	�ö4JÕÈ ¥Ñð×–-¶*"vzËÿÑ­[7óùçŸ›mÛ¶ùk¥j*— _¦ ð�ˆ@’	ð¬£ü×¯_?ÉÝTßRJà°ÃsF€”v_ÝN	�]wÝÕ 0æJrK€µ9ktÖê]�B’02 $l@Kug²ý™™`A©÷²þqÊ”)æý÷ß73fÌÈº]Xu(EG}tÕ/Ô"#œ=üðÃ�Ò¥ÅhÐÔÔJ8ä�C\€ËJ_ Š@	�í‚c\Ê^”ûÁcmÎ�µº'Aw@‡@—�$�€ 	Ô’.±Uÿ™-üÞ¶ç<Ñ{ï½ç‚‹lÜ¸±äz	› ;¢�:u
û6ª_òJ eË–
x™×ÐÍÃ$€R¤ã-aVÝù&�9ÿ_¯^½|7%u÷gMNà?ÖèžÎþ£3 ; CÖR7 1é° 1¨,›Y`¯ûŸ-ó²¼~»ËŠ‹‹Íÿþ÷?Ÿç‹¶«_¿ìH€³t,«U«¶ãõŽ$„ ÊÑA”�Þ¨"°=\¢I¸çž{nÿý&	!À1®#�<Ò»H’[œùgmÎÝ“ 3 ;xªOÕD�€ ÏMkë{Ç–­AëÅ²H€‘ž={*-`P˜•¼«:ÇvíÚÎ×ID ijÖ¬iÚ´i£\éIXõg;Gu”ÁÓE"I$À<Þ±cG¹ÿçxpIûÇšœµ¹§ÝtttI‚	H£Hðà–tm±}%‡ç$]Ýºu«éÕ«—ùì³ÏÐÐJÔÑ¸qcsÆgè|t%Xé#ñ#€qëˆ#Žˆ_ÃÕb¨6oÞ¼
Wè£"d*ÂˆËf…6*r7fþc-Îšœµ¹'AW@g@w�$˜€ 	ÜR]ãú][¼äñœ4i’ùàƒÌìÙ³KÝB?†E€8 'žx¢Ž„Xõæ• ®ÿ:tÈkts› »ÿ<ë
t6iÕŸk¸ÿŸ~úéÊX”cð¬ÁY‹³&÷$èè
Þ*ôÔ.U B€Á*WÙ6õ·eˆ¯¶qÞˆt#[¶(;ˆ/¦;«×ºöíÛ›<pgÑû"K(CÄ¸ OºD’L€ã\Ç¼{Þ“ÜOõ-}X£{ì±:ÿŸÃ¡gíÍœµ¸GAG@W@g�$œ€ 	àRÝ›`þ¯-ËK½—õ�EEEÎíhÄˆY×¡+O€ÈºßûÞ÷´{Tydúd`Øbá(·Ñ–š˜ q 0xID )0â’æ’£\xHrC€µ7®ÿ¬Å=	ºÁË¶LôTŸª‰8 ">@›·ÁÖ5Ü¬{_û¨wäÈ‘.íÈúõë}T§:Ê!P»vm·{T½zõr>¥?‰@¼´nÝZéÿâ5djm -Z´0<ó2x€¨K#E`¯½ö2çœsŽ‚¸æpTXs“ò�5¸'A'@7f‹ôž F½ ¢>B~Û7×VÇùž%>ªÝ¼y³4h�0`€�êTG9°¬³[Š•�€;ˆ;�Zµj9å_îÿqIµ¿²Püñxa.—ˆ@�ö� ÅlRHrC€57koÖàž� Ý A’2 ¤d KºÉlÁŸ÷mñ2tÊ”)æ­·Þ2óæÍ+¹…^Â"@6€sÏ=WÁ Ã¬zsJ wè“N:In£9¥®›å›À1ÇãÒ¥å»º¿%P­Z5ç™ÈÆ„‚[¥Y¹ëYk³æfííIÐÐ	Ð¼Y<µMÕ„H@€áF´ê¯l»°ôM·e[Ð6b�üôÓO]0R’HÂ#°÷Þ{›SO=ÕpG"q'@ê?Œ H²ºyä‘f¿ýöKS·Õ×`M‚û?¯’ð	°Æ&ðknO»ÿ,ÚÑÐ	Ð$)" @Š»¤«üÃO¶åu[Ö•¼èeñâÅæ“O>1£G�T�..Ÿ î£d8å”SL�5Êÿ°þ*&Ð¤Iƒ ÷Q‰¤‰ G¸:wîìŽs¥©ßêkò`ÌâYÖînÆ–56kmÖÜž ] �@;xž Æ¥ â2R~ÛÉyŸî¶¶%ðQ ¬’C†1¯¼òŠYµJÙCüÕöµ‘à’K.Ñy»í±è·˜8î¸ã®ÐH#Œ_x�P"q$@ð?Ž$6kÖLq‰r0€¬­Yc³ÖöämËÚ ]ÀK\°`Ð-<�À#ÌUEÄÏY¶üÇ/ÿøkÖ¬1½{÷viIbÄ!vMÝsÏ=Í‰'žè�J¹»áSƒ-�}÷Ý×�ý'"ºDÒH å‰´®;vLc÷Õç¨S§ŽùÑ�~dX“HÂ'@Ê?ÖØ¬µ=	kt t/™Á<µKÕäˆ€ 9ÁÛl²mjËÿlñøƒà$]»v5³gÏŽ`w“Ñ$ÜG8à óƒü@çî’1¤©ëçþ�?þxÿKÝÈ«Ã¥	œpÂ	îÿ ô{úYâ@€8D'Ÿ|²iÛ¶­RZæ`ÀXS³¶öl›5?kt tI
	È �ÂA/Õe,€œÿ™cKàó?[·n5ƒvJ·lÙRê6úÑ'ÎÛ�vÚiæ ƒ’ë�O°ª+tÕ«W7¸ÿ|ðÁ¡ßK7�(À�‹7WË–-£ÜLµMv @ Ë‹/¾XGw ãÿÖÒDýgmÍÛƒ°ÖgÍÏÚß‹°‡6©Š<� Ð#tKf“q¶à´ÌG»–-[fºwïnúõëç£:ÕQ¼ 8wwÑEÉ >z+ºPx”É"ºã£–å– i0	ê*�¸  1»ÿÄpÑ1ÄðG�µ4kjÖÖž„ŠXó³ö÷bQðÔ.U“c2 äxoGÔ¾®¶·ÅËQ€©S§º`%EEEìn2šÄNêùçŸïv�0HD ê8+úýïßEÿ�z[Õ>È�†:ƒY1$"x®üô§?uGãÐÞ8·‘54�ÿXS{Öø¬õYó+b·'¨q­F€¸Žœ¿vüc¾-/ÚâEc_·n�éÛ·¯yç�w|å*õ×Û„Ô„ÒÏ ¼ ”J-!ƒšðnpîŸ�#‚ JD@Œ;Â…GE"Q'ÀÆó8ž\JýîhmÞ¼Ù­¡YK³¦ö$¬ñYë³ægí/I1 R<ø¥ºŽP[Hâe¦!Oé›o¾i†ÇØ(	ƒ �x8‡wÈ!‡(�T€U§7D='b´Îþ{CªŠB€ã\gžy¦iÝºuBz¤n$•@ÝºuÍ/ùKC I¸X;³†f-íIXÛ³Æg­/×OPã\�’ÐÆyôü¶× …¶eK#[‡–/_î< Ž>úhS«V-¬³P}
^ ìþoÜ¸ÑŒ9Ò¬_¿ÞgõªK¼@Á¹üòËM£FL-�ÒP¨Hï5lØ0óõ×Ú˜+ÍF?Gƒ k¸sÏ=×\yå•†ÍI8øÿ_¸p¡yüñÇÍ€Œ§€Ú(ücmyÀ–ÂpZ®ZãF °’·«½;%ÀªƒƒFX½DÙ°aƒ8p ùàƒ?Kü¨V­š;W}Øa‡ÉÀ?^Õ� F*”›.¸@ÑÎ²ÔåÉ%@ 2»´oß>¹�TÏbM OÎþ×®];ÖýˆzãY+³ffíìqÝÌšžµ=k|Y£þä¨}ò Èè˜Ü†ô ólikK+[v·%�¬^½Ú,X°À  ò¢€u�pîp1<3_Èì­]»v‡ÏèÈ�]wÝÕ\rÉ%æ¿ø…iÐ A¾š¡ûŠ@ä	ì¿ÿþfÓ¦MfèÐ¡¾vý"ßg50ØýÿÉO~b.»ì2C I8Øý1b„yðÁÍôéÓ}y±ûÖÇ–'lYNËUk	È ÇQ·Íh�Km9Ò–À+v&´•+W:÷Æc�=VëB;”¬Æ�›É“'›‚‚-C`¬*³#Ð®];Ó¥Kg Üm7}ÝdGQW¥� nÕ(ZDüž3gNº¬>Æ€ ›¤ü»ýöÛMÓ¦Mµ‰â˜±YöÐC™!C†8c §[M±õ<hËd[´ûï	jªÑ€$Œ¢ß>pVh°-}mñ²�LÓO?ýÔ�Ï”È¦ÿHÍÃ.ë�è¿rÕ(Y bôøCÓ¡CEŒÎ‚Ÿ.I�¶mÛºÿeÊHßØGµÇxÃ…`Ãòào”X³Ff­ì1ê?kxÖò¬éø/¼á‹eÍÚ’‰å°…Þh&
Ò…°©-�Ís–iÑ¢EæÈ#�4õêÕ3ìZKüà‹/ ‚ÇLš4É§õØ_#USªuÔQææ›oÖÙÿT�º:„ ©ÕìÊÑ¹‰'šmÛ8•'�üÀk‹Ø·Þz«"ÿ‡8[·nuÿï÷ÝwŸ™1c†/×vûGÙr¿-_…Ø|US2 ÄtàrÐl‚†0�aKà¨/ +ÀŠ+LÇŽç%~	�8 æÎ�ëëKÄo#U[*`äÃõÿ”SNÑî*F\�ôE`¿ýö3õë×7£F�2_}¥u»/®ª§êHM‰÷¸ãŽÓîÕñUúŠÙ³g›‡~Ø4Èeuªô…å�hÿ³¥Ÿ-rý/ŸU*ÿ*@*‡½R�fÂ˜e>åml©nK !ÀÑ¬Y³œ%™ €
&çã@ÄõÝwßÝŒ7Î\vø�Þ��	àúÿ³ŸýÌüîw¿3(3�ÊÀ;Žÿ¾	ìªô®•g§Oú#P·n]ø�yœ9]bd½òÊ+æùçŸ÷Äyµmm[0 (W8CûZe ˆý†Ú�M¶v¶ :ØÒÜ–ÀG8çÄît§N�L‹-dU¶P}
F RJáFöÅ_\Ë$"�K‡z¨¹å–[tf4—Ðu¯DÀ›c.Á §M›¦£ ‰Ýèw×ÿsÏ=×\ýõ¦Q£FZ§…4dñ!ëÇý÷ßïŽÈzº›wÃmyÄ–[$"P& ÊÄ¢7KÀ @:ÀŽ¶ì[êý¬\µj•¡tîÜYG²¦¸ó‰&Ý¼ys— ¨¨H‹Ç�£Ò_<`±x×]w¹s£Ú5òWÕ¥Š Á×8J3räH³xñâTõ]�Í/�#Ž8ÂÜpÃæøã�—òâPàúOÊ?ŽûxŒ÷A*ïglùÈ¹þ‡8~q¯Z€¸�`øíÏheo…' Æ€@ÂDWXXhˆtLdÙ=÷Ü3P}ºxG¸ïíµ×^n‰Ô2› ÿÇ—]v™ùÍo~ãþ·Ã¾Ÿê�$À›‹ì.Ìã£G�v©t“Ü_õ-X;\qÅæ’K.1JÝÞ˜,]ºÔ¼üòËæÕW_5Éö$m=Ýl‘ë¿' I®F€$�®¿¾1©,·/€F¶>
@< Ü1 ´lÙR_4ªOá)\9_6~üx�#õ	Wuí@ eåØc�u�ÿð>áw‰ˆ@0@!ÃcŽà®J£Œ§®.Ÿ Y(.¸àóç?ÿYñ[ÊGè¯ü÷ïßß<ôÐC¦¸¸8P]¥.f³nœ-�Ù2£ÔûúQÊ$ @™XôfØFÞË–ƒlñÂÍš5nòÃÝWG)ePð_æ­Zµ2˜2eŠO³ ­Ò¥I$ÐÂÆó …Ñ¢µk”ÄVŸòE€´€ÕˆéRPP ì.ùˆ„ß—yûÂ/4üã¿%Ä±&#ë1¾/=§ú$h÷mÁ@ùCCÃ¤T-@RF2ü~0¡0Á`K'[ö°%�p å”³ÂdØ{ï½Õ§‹w$ SR²p$ø¢Çsf;ÞLï¤’ A'o¿ývóƒüÀB""à� †qÒæ6mÚÔÅX²d‰¿ÊU“X®›nºÉœtÒIBI8HíùÜsÏ™÷Þ{Ï§GÏzÛÚ×mù—-kÂi¹jM ’6¢áög�­ž£ mmiéãVD©'Êq‡L›6m´{èêwê §4çH‰»0oña$"à‡@­ZµÌ¯~õ+sÕUWéÜ¿¤ªEv €BÖ AÃÿÛàÁƒ}žÞá^z#}x¶ØùÿÑ�~äÒ§�@nzÌÑ×Þ½{»¨ÿxÀz”Ïl]·E®ÿ¡&½* ’>Âþû·ÔVIÔ>âìã£z pŠ£ |é(€ªßÖOv�vß}wçr¶bÅŠoÿ¨ŸD K19í´ÓÌm·Ýæž/ýßf	R—‰@%ðÿÆ÷#ß—S§N• Ìô‘Š	g‚À­—_~¹!ó„$¸þãò�ëÿ—_~éó&E¶²lùØå}öI6áuÉ �ð¡{L0slihY°u¸¨XGÛ·oïòóžÄ¾ä‰À ¾„Ö­Ã™C"Ù@éÔ©“ÛÉàU.£ÙqÔU"Px ´k×ÎÌ§OŸîÓ…¸*ÍÐgB€M¢ý“ò�8’ðÌœ9Óüýï7ü±ÁóÕ“àúÿ¶-ÿ´eµ§:UMJÈ �’�öÜM´G×³å`u3!Î˜1Ãà®Îq€5jø¨Vu”" Óƒ:Èe7nœâ”b£«F€ÿQv28/Ê"R"">¼lHŸË<ÎÑ9Åu	Ÿy’ï€Ëÿ�7ÞèÖ\òà
o¤ÉÆôÆo˜gŸ}Ö÷æKOÛêgl™^ëUsR	È �Ô‘¿_ 0 Gêø¸ œS'5 »ÕúBòAuû:
ˆé¢E‹œéöÕo"P1‚JâöÞyç)è_Å¸ô	ðN€ €p€K¸tÉR³íkýö9á’±…�ÿcŽ9FFÜÇ×ÿ�šGyÄ½öx+Îû£ü²Å›K�Çö©ªˆ� âáæ1áÚBjÀ£mñr€Ç«W¯6;vtù�m½Ïð²ÀÝoéÒ¥nÉsõª.Á6lhn½õVó‹_üÂ$KpWÕ5ˆ,ŽÜ`ˆkØ ¡™9k¦Y¸padÛª†E� ñ–n¾ùfsöÙg»,LÑkarZD¼Ž‡~Ø:Ôg§ðÂ}Î"ÿ¯õY±êJ Ò3Öaôt£­ô+[šØrˆ¯àÀ™õ–-[ºôG¾êU=ÿG ÏŠF�™6w;GŽ^HD "déøÓŸþd.½ôR‹ª–þ.!àèM«–­Lã&�]^q¼º$"P�£Ž:Ê)ÿßÿþ÷åÁU¬€Ÿ5k–yé¥—Ì;ï¼ã;^GÛ´§m!  D²" @VØtQ)¤Üd‰	X6oÞl˜R§Nsøá‡ŽIü`	# eÁ‚föìÙ~o ÚE€,×_½Sþq?–ˆ€äŸ F ¹|WN˜0Á,[¶,ÿ�R"K€ Ëìü_xá….5pdš€†hùõ×_wçþ—/g™ìM&ÛšþaËp[¾öV«*J R7äÞ;Ì„@M[Ž´ÅKô¾µk×ºóRx°ó¨x –¬gÉ7nì<æÌ!¹ƒD¶'€Ûÿµ×^k~ýë_+CÇöhô›ä� F€Œ·A¿úŠ¯c‰lO€À‘qüãbIÂ#À¹ÿO>ùÄ<þøãÆóºŠÎÿ¶¥«-d �ˆ@Öd È�.,E`ƒýy�-ûÙ‚À‹,^¼Ø`9ÅjÍNµÄ?�œ%e‰…#.kÈ Vnÿ¿ýío“#E¯"1™ã{²I“&Î{N1"6@yl›'xR2�ÿüç?7ûì³O[“Ž[“e‰ Ã‡³IïU^³µa PÐ¯XÓY™ é÷0z�er•-¤lìë¸§s uëÖŠàêwêÙm·ÝÜÂO x{¶Xçnú5.ØU¼îºëÌ/ùKS¯ž—Ó=qéºÚ)±#€1÷Àtÿ«reˆÝ†Ò`ÎüßtÓMæ¢‹.Rì–Po_)ÿ{ÿùÏL·nÝ|Ÿûeïô¤-ã·¿£~�ìÈ �7]U6�Åöí-¶t¶¥VÙ©Ú»ÄÀ­%+vÍšœ4�ø& _Îyã	@nÛ¦ÔR¾9Ç¥>Òp’šhÿuëÖ�K³ÕNH5Œ ¸z“êµhA‘YP´ÀàŽ,I'RýÝrË-îÌ­Z^–déYÉ^ã±úÜsÏ™×^{Íy¯Vò²Ê|Œs=OØÒÛ–Í•¹@Ÿ�ŠÈ P!ý½*˜˜ˆJÊ3ŽìnK`Y³f�)((py�IÈÙu‰8Ð¡Cg¹þòË/Í¦MÄw”¤‰ ÿc·Ýv›ùéOjöÝwß4u]}�Ø`ÇÐòÀ–fÕªUÎ€¾evyIZp$äüóÏwgþÏ;ï<—U)-}ÏW?ù{óÍ7ÍÓO?íâWylÙ¶^´å¿¶ài+/d ð‚Q•”"@NRÎ'5°Å[jÀ•+Wº3êìLâš,	‡ ÆÜ½;ì0ghÁ�Œ$ù8jsæ™g~³c´çž{&¿Óê¡$� F ¾'Û¶mkˆFN–—�Ñ#$I'€—äe—]æÜþ�?þxƒWˆ$|ýû÷7�=ö˜™:uªï›u·õ_©š|“My}2 ¤ü©ûX)Ññ8À×=–.]ê²p@;“¾¨–]|É¾€ö’ä`ÑxÚi§™n¸ÁœuÖYÚ1JîP«g)"ÀQ Žvq¬«°°ÐRÔýÔu•ïí‹/¾ØÍã‡z¨¼%sôpLõ™gž1}ûö5[·nõy×/me�ÙÂù¯ûl¤êŠ' â9nQo5Õ¢’Fm_½¤db-**rÊ	_nŠîcP»vmC !ò¾“‘aþüùáÞPµç… iþÅYÑ“O>Y‹Æ¼Œ‚n*áàÿ›c]xôÌ›7Ï÷Ùäp­Z«L€@Éìüß|óÍîH•+ÐYX¶l™yá…Ìo¼áŽÜdUIÙ±‘ö7[zØ²®ì�è]Èž€ Ù³Ó•åÀß°Ð–ú¶j‹—ƒûk×®uŠ(mpS—{›%¢T¯^Ý`lÁ�”]$Œ f”$ƒ c{õÕW›«®ºÊrˆ·;É€£^ˆ@B`ÄíÔ©“;ÞEv€%K–øÞ©L©øuƒ5ÐI'�äÒüýîw¿3õë³ä’ä‚À†Ì«¯¾jþýï;�÷$hÇÛ¶<cK±ÇzU•|C@€oPè‡�p¥-‡ÛBL€]l	,DZ-..v»ä)—„K€¸ ¤—b‡ö	à\©$¾jÔ¨áò†ÿùÏ6¿úÕ¯´hŒïPªå"P)sñ¨S§ŽY±b…óêR\€J¡‹ì‡öÚk/sÂ	'¸Œ-¸þË+2·C5lØ0óè£�š)S¦ø¼1i;&Øò¨-}V¬ºD 4 JÓÐÏaXf+]bË¶ìçë‹-2¸^±«qÀÞÂøj^âêÙe—]\j),28@\ ¥
ŒßP7jÔÈEˆ¾õÖ[Í\à\ƒã×µXD ª0æðÈ#�tG}ˆ@€]Iü°ùA¦–Ûo¿Ýì�À�’Ü KÒý÷ßoä;ÕæÛ‹ûmd‹Ò0ånHSw'Í©òœw˜	ŒÔ€ìþc¨iK`!·1ñ HSGPÀ½÷&ó $Là|ôÑG›-Z¸ì xbà'‰>\E>ø`síµ×º#vu„&úã¦Š€OêÖ­kŽ9æçùƒ7 EÞ >)‡W)þ»?ýéOæºë®3SIî,X°À<ùä“¦{÷î¾×?l˜ýÃ–wl‘e.wCšÊ;É �ÊaÏy§ÑgÙÒÄ–ö¶xÉKƒòÏ‚ ·fIøPÉ3}ÜqÇ9OŠ¼ÂgŸí7nì¢üÿõ¯uQ¢‰�AG""�N|_„yƒ:^]$Ñ$À?Êþ9çœcºtéâ¼¸äòŸû±â„ˆÿýóœ‰¸YïÛò¤-‹sß3Ý1md HÛˆç¯¿¤D[?Ì–F¶x1Y˜O ÜšÛ·o/786‚òH– ¼H3ÅâqÕªUfýúõ¹¸½îQIì»áŠ+®p»þÊxO"" o€Î�;;o â»ð�*o€h=(úŒ»þüã]Š^¹üç~Œ€Ì®ÿÓO?mHýçQúGª¿{m™î±^U%;% ÀNÑè!À½i¶-mñ�Ýg&ãvíÚ9¹v6C¹2ª„3Ê$gJÉ!O,Æ¹2”,‡o16ìúŸ}öÙæ¾ûî3?úÑ�œÛ¯\Es8º•Ä„ 
&Y@ˆñ‚g 1vÈ¸ã9§yLhD§™Œx˜¿ïºë.sæ™gºcxZãä~Œðp<x°¹÷Þ{ÃúG°¿.¶Œ±…4Ú�€ ¡#ÖJ`b[`yäˆ°�-^„»Ð¤ä|£¾ ½`­T%(•¸”uÔQæˆ#ŽpÊ?Þ Z@V
Ÿ÷‘ò‹±¸ñÆÝn†1íú{Ç¬
E QØQ®W¯ž9öØcÝÑ <0æ’ñ…#’Ü`,XÇ`À½óÎ;Íe—]æ<í´ëŸ»1(}'”"ýcL2dˆïÿ<c·åC[8 �œ� '˜u“R0à;… ñ ªÛXX �# Jè~ûyK8¸mi©€ÅIƒÜ.RÇŽ¿	ˆ7€â„ÿÔªUË¥k$ô_þòsâ‰'ºc2†…Ï^w�¤ÀXØ¬Y3—[¾I“&îœ3Æ {„™«9Z‡wÿ?üá.u#šÇÃç¿³;8å¿oß¾¾ÿVÛ{ðï9[øY"9# @ÎPëF¥pP|†-ÛÒÂ/Ï!ççÍ›ç2�æˆ¹’ÜÀ`Ï=÷tŠèÉ'ŸìŽeà	ÀNAeð?<çœóg—è¶Ûn3^x¡‹‰¡ÿþY«FHŒ¹ûì³�S>3Ç»ð²Ã˜+C€ÿ' £øc8¿úê«ÍM7ÝdN=õTƒ7—Žmùç]•ÙTzüñÇÍ»ï¾ë;e&ž°l¹Û2eID §¼(^9m±n–„žoK[
è%$9F€9sæ¸\õœiTf K6Â¢…$îç§Ÿ~ºK?‡+)† Î•êli°AaÁ_Òú]rÉ%.ôE]dZ´haªW÷âT¬�ºZD ö0"Ö©SÇtêÔÉ¹£3¿,Y²Ä{•gWðáÅÐÂñ9‚³^yå•ææ›o6g�u–ó¤“78ß 5°^yñÅÍ/¼à;âÿ6Û¶±¶ÜmË[tÆÆB�ä–€ ¹å­»}K€	¯Ø–µ¶t²Å›Ï>;Î³gÏ6¸/@GçŸ-Ý<	\1œrÊ).`àš5kÌÂ…�7€Î–Vm`PüQðYˆg\ýøÃºà—¼/7ÑªñÔ§E@*&°Ç{¸ ¯ÄØ9ãŒ3œ‡Qéô¯šÇ+fXúÈÙœ sŠ?G¶ð×°aC—Z·ôgõs~°NéÕ«—ÛýÏ¤›öØ’[×£¶ôµO ‰äœ€ 9G®–"@ê“y¶ð[jÚâEB7uêTç}à�*= ªÙW’1´jÕÊ�-%N^ ¤�âX€<Êg?Œ,À¯ºê*sÃ7˜sÏ=×)þ¼/Å¿|~ú«ˆ@pìJ_'ãÙÕ¡C$pùòån×¯òcHáˆÆpÎø_{íµÎCŽŒ-üMx·ôë×Ïe^˜5k–ï dÃzÙ–ÿÚBzl‰ä…€·ë¼´\7M�Æ¶3Ûr±-ÞŒ  :æ˜cÌSO=å^u–"ÑŽj üÏ˜1Ãôïßß|ôÑGfæÌ™.N _¾ãÎ~â½Â9Ð£�>Ú\pÁî9nÚ´©sÿ#È'�õë×;o®	&¤õéÓÇ™M›7É¨[20oñÎbw÷~b*` çwŒ’hÀˆ5räHsýõ×»WÏ­#þÕû¶Üf‹Îý{†«êªF@€ªñÒ§Ã#p˜­úŸ¶œ`Ë®¾nÃŽ;¥O>ù¤9è ƒ|U«z<Àu”sv¸Ø�?Þ- ?üðC÷ž§[Ä²vô‰aAþgb(à9qÀ(¦E,GS��dÀhË<^`£¥:Ô0‡�1Â¥‚MvÏËï
þ	'œ`Î;ï<CP\Ž%âA¡Ýþò¹åó¯lDàa÷ñÇ›-[pRõ&œûjËl™è­VU$Y� KpºÌ;üß~`Ë�¶`ð&Ù¹âŠ+œE—4u’h Õ†€iÓ¦™É“';ë;9wW®\Í{n*¸Ö²P$‹E›6mœâ_¿~}�õÌZÕ‰€„C€ �dãa=z´+w‰Í“Aéç¨iXÙéoÛ¶­K«ˆWmx%²YôüóÏ‡±î@é¿×–l‘›c´…T´N€Tsl:YÃ¶ôW¶t±¥™ÏVãnGz�k®¹ÆE5öY·êòO€Ý$rD`âÄ‰fÒ¤IfÔ¨QÎ@àÙ*ï¿ñ•¬‘]þZµj¹E"yŸ=ôPç¥B€?U¸ŽJD@D Žp¥&…Ú‚Üñ.Ž	0��7Îù>W�7DÌãl2tîÜÙ0�£üãmÈQ­ºuë*>KÞF¦j7^ºt©yöÙg]ÁàYˆuõ€-¯Ú²ÁsÝªN²" @VØtQˆÈp£-WÛ²¿Ïû4jÔÈÜzë­æ×¿þµ‹Lï³nÕ< XH²hÄ ðÅ_˜éÓ§›Ï?ÿÜÅÈD Î¼†×’ìkÎéã,(©ûHûD -\û›7oîþzõêi±˜=b])"a(X¥çq¼¼˜ËyåoÌßQžÃA›™Ç™«ñÐÂhËQ-7kÖÌà­¥�þ?„;ikŒW^yÅ<òÈ#Î`µ“�eûöR{ás¶<aËòl+Ñu"à›€ ¾‰ª>ZÚJî·å[jù¨0SGëÖ­Í½÷ÞkH�†2&‰Îš²ˆÄÍ”�%\M96€A€³{¤$"u„|†¤¢¤ ì³H$â3),"ñ �ˆ€ˆ@š¶¸¸øƒÀÜ¹sÍœ9s×1òR¢¶fÍšngíÀ<Îî>ó8ó7žZ¼’‰EO<‹Ý»w7wÞy§{î<÷‚(ÿ½lÁ«uŽçºU�" @ |º8D�mÝ·Úr‘-^}¡qÓ»ÿþûÍ©§ž*#@ˆ˜‹ª9ÀqŒ,(1à¾Çñ�Ì“×Ìï¾Ï¡rnŸ]zÜ=)üÎ¢�WˆuêÔq»BìIáÏÅS¡{ˆ€Ä‰À†Ì²eËÜ<Î\¾hÑ"7—3o3Ÿó7æñÌÜ¾iÓ&¯Ý#X0‚™ù:3gµÌåÌíÌå¼’�E(ÿ4ýë_Í˜1c|wh«­°‡-�Ø2ÚwåªO‚� (A]&�ãmåœ›:Õ÷MŽ;î8s÷Ýw›3Î8Cg­}Ã�@}¸ô­ZµÊX�Âï™‚€ôUëÖ­s�©X|bH(]pEeQHa'ŸÂ.»AyÚk¯½ÜÏ{ï½·;ÿY»vmÃÏûì³Ï7E‹Ä<j‚ˆ@,	lÝºÕÍáÌÛkÖ¬qó8ÆÞÌÜÎü�)ÌéÌã\“™Çùaî&ê>¯ÌçÌãÌá¥†YÒ­2ó3s9s:gû•>8–�O…�æùè×¯Ÿ¹Û®‡^áç³øÀ@{;ÿÃ²¸V—ˆ@èd ±n€ÀîöZ< î±åà õ”yé9çœcxà„­ÌèÍD`�ÈÖ�üÌb€ U™$gáÇ‚‘sŸ™E$J=HŠüD>ê”ˆ@0�3gæqŽ0g
ó9ÂÜMa>ç•y›ãæqæxIúŒ²K—.¦wïÞatþ[é]¶àà5—`�U�é$ ™/�ã—^3q2;7´å[ÚÙâMúöíë\³ï‹m�  @ IDAT¸ãÐÇ[Åª(ÒXðQØ’ˆ€ˆ€Ä� s8»õ:V¿±Ëw‹‰ôÔSOÖ€!È4['AÿX»Jù°ªôCÀëÙj?MR-"°ûÍ²eƒ-‡Ú²�-^„‚á>H$vÎùID@D@D@D@’G€T”ÿøÇ?Ì»ï¾ë¼G<÷°ÐÖ÷7[Þ´e¥çºU�x% €Wœª,$ëm½DP%lÿa¶x¹‹Û ‡9/Nz6‚üHD@D@D@D@’C€µÞã�?î”âJx–¶¾çmyÑ–%žëVu"à�€ Þ‘ªÂ�¬³õ.²¥©-mlñöìr†pþüùî< F ¼ID@D@D@D@âO€,/½ô’yýõ×ÃHŒ«ÿÿlù§-sãOK=HoJT`©�y'°Ø¶ È–mii‹· –D&�<‚ÈÝN4`‰ˆ€ˆ€ˆ€ˆ@|	™W_}Õ<÷Üs.Å¤çž|më`ËÃ¶Œó\·ª�ÐÈ ZU�¶^<ZØÒÜoBº8\Äˆ.Ü®];—
È[åªHD@D@D@D g.\èÿ_|Ñyz†pã!¶ÎGlùÌŒˆ b1Ljd)L°8p„-ûÚâMÈ1Ìq€ºuëšöíÛ+Õ›7²ªHD@D@D@rC€ Ï]»v5ÿú×¿LAAA7¥ÒÇl!âÿf[$"2 Äf¨ÔÐR8o5Ï‚v²¥–-ÞdÅŠfÎœ9ÎÐºuk³Ç{x«[‰€ˆ€ˆ€ˆ€„G`ýúõ¦{÷îæ‰'ž0¤ýA¾²u¢üwµÅ{DÁÚ«*E`;2 l‡C¿ÄˆÀFÛÖÙ%íí`_÷òÙöÅ‹›Ù³g›zõê¹˜ 2ø¤«ºD@D@D@DÀ?b:}øá‡æÑG5¤ýAÛ:Ÿµå¿¶,¡~U)¡� tÄºAˆ8€'@M[0�&Ð›|õÕW†à1Mš4qF€ÝvÓ¿‹7¸ªHD@D@D@< µsß¾}Íc�=fÆŒã±æoªb·ÿe[^°… Ôˆ%i4±65ºr¯Î²¥Ž-ímÙÝo‚`Ö¬Y¦E‹®ìºë®ÞêVE" " " " Á	À¹ÿþæÞ{ï5#GŽ^áŽ5l°o½kË¶d<Pwü”Þ�� ƒ¤&VH ,Œ Ílii‹×ç:c =`Ó¦M�<,a‰ˆ€ˆ€ˆ€D€ ;ÿƒ2wß}·1bD-Úd+ýØ–lù2Œ¨NÈ%¯ŠR.®{‰ÀwÛß9@j@^ŸíÂÂB°yóæ¦Y³f2XÀÈ'”ÿ�º�ÿaÃ†…Ñ”ÿ¶<hË¸0n :E ×¼*I¹n¼î'ß!€`†-ÛÒÄ–]lñ&x�Ì xè8€7´ªHD@D@D@ªD`ëÖ­fèÐ¡æ®»î2Ã‡7_M¦h¯²ÍÖ†KÁ¶Œµe«-ˆ= b?„ê@)LÌm™cË¡¶4´Å›€/<ˆ	Ð¦MÓ¸qc,`‰ˆ€ˆ€ˆ€ä’ Ê?JÿwÜáŒ Û¶¡«{¬	ŸÛÒÅ\6Û"�D� Ã¨N”"À7 ‘Y9pˆ-Øâ-rF€ùóç;O Ž4jÔÈì¾»×¸ƒ¶¹�²lØ°Á<ØÜsÏ=î5å‹½/9ï´e -Rþ-IrÈ �œ±TO¾%€' F€Ù¶aK=[¼IÆ0eÊÓ±cG—&p—]¼9xk§*�$@Ù5j”¹é¦›\´ÿ”pMµå/¶´…èÿH 5œêL)Xk9°Ä–ÃmÙÏo‚`ñâÅî8@»víLÃ†uÀ]U$" " " ÛÀíôèÑæ¯ý«{%õ_ÂæÑý¶|bËÚêW•"�w2 ä}Ô€	¹•‰|¥-ö±ÅÛV=VgŽ|ùå—¦eË–¦Aƒ:`KD@D@D@DÀ'Üþ‰òß¥K3dÈ‚òÏ™ÿB[ˆöÿž-kl‘ˆ@"	È �ÈaU§JÈxídË^¥þøÇL`ÀñãÇ›V­Z™-ZÈ 0UU " " " ÿG e¿ÿþæ–[n1cÆŒ1x„ ‹m�OÚòº-«B¨_UŠ@dÈ ™¡PCB$Àù-b��{ÚâM0›¹sç:#@“&MdðFW‰€ˆ€ˆ€¤• Ê?;þ÷Þ{¯sûéÌÿRË÷[^µeQZY«ßé! @zÆ:í=åÀ—¶Ô°# ¯Þ$púôéæÀt�wÛMÿ^Þ «"�TØ´i“4h�Kõ‡û?k­d…­ó%[ž¶…# H<i(‰bu°�ÕögŒ µl!E`5[¼
1fÌ˜aš6mêŽÈà¯*H�Í›7›¾}ûš»ï¾Û><¬sÎŸ]ÿ§l‘òeÕ92 DnHÔ �	à	@`À}mii‹WO [Ÿ)**2sæÌq^ Ä� *¨˜@Fùà�Ìˆ#*¾ »O°$Øßßl™•]ºJâI@€xŽ›ZŒ g½ÈñŠ'@;[ªÛâUðà8 ™È #€W¼ªLD@D@D �pûÿè£�Ì}÷ÝgFŽVñ}Ã–Çm™ÖMT¯D•€ Qµ+lËì¦ÙRÛ–6¶x7,X°À¥¬]»¶;P½º÷[ØfKD@D@D@D þV­Zeºuëfzè!3nÜ¸°:„òÿ–-(ÿ3Ãº‰ê�(� Ê££¶…M`¹½A�-ØÒÌïÇ¾úê+3{ölS³fMÓ¦M##€¥,�RV¯^mÞ~ûmó÷¿ÿÝL˜0¡Ô_¼þHÀ¿^¶�î�˜PH% R9ìêt)Åög,À5m	Å`Ñ¢E.0 Ê?F€5¼ÛJuG?Š€ˆ€ˆ€ˆ@|¬X±Â¼öÚkNùŸòÿÛ»'»Ê;Íã?I(ÇF­œ%„DÎØŒí5Ïx–Û5Å¸vwj÷?Øª©ÙòÃ`Ö24Ø`ì †„A$%”QÎRw+KÝÊê Ä>Ï¹‘º¡{nêï[õøÞ¾-Ýsîç`u¿ïyßß»|yV'¾_oì;ÿ^ó¿,«ƒð¾”‚  ¥p•8Ç¬<à5`^0NÉùî uuuÉr oaãúôqB €  Ðvª««ã©§žŠ‡~8Ö­ËlF¾«ý?«üJq(mZ€€6}ùùðÍ\Àƒ ½”J7%§mÏž=±bÅŠØ·o_Œ7.***rúþ¼ €  P*^"ùÀÄ“O>.žœQságWûwçŸ‚!ó¶¥%À @i]/Î6[ÿ�Øªx9ÀX%çsõ<UUUzk`ìØp�@ €  Ð–jjjâ±ÇK¦þ{©dFÍ[ý=¯<¦,Íè¼-%'À @É]2N8c�mzïÐ]9Oñ`@NÛ¡C‡’™ 0`@4(§ïÏ›!€  € Å*à
ÿ�<òHrç¿¶¶6«Ót¡çS\ð/³ÂY�<ï‹@– d©Ë{—ª€—xÀ�ä|9@CCC,[¶,¼ömÈ�!I]€öíÛëP4@ @ üŽ;Ó§O�ŸÿüçÉvÞö/£æ�PPÖgtÞ�’`  d/'ž±€GŽ«o8ZÉùr€#GŽ$o<ú=zôèd& ƒ ’¦!€  €@Y	=z4æÍ›'NŒ7ß|3>œÕçó´ÿ—•UÖfuÞ�R`  ”¯çžµ€ç¥yŸXwþ½E`Î¼+Àš5kbãÆ�1xðà$;vÔ¡h €  €@éÔ××Ç|wß}w¼ýöÛáß}2j{õ¾T|çß39i Ð‚  - ðÍ<°Bñr ä¼&€Þ3 XµjURpÄˆÑ¥KÎÇ| €  �7ï|ôÊ+¯Ä½÷Þ3gÎÌò¸^¾ù´â5ÿ™í'˜åà½È—  ù’æ8¥,àeoÓ[Édw ãlÝº5)XYY™,	èÜ¹³_¦!€  € %'à5þ/½ôR²æéÒL‹ðû÷´gßùßXrPœ0y`  Ïà®d\ÀÓÉ<omœâ]rÞêêêbùòåÑ®]»d G�9?oˆ  € d)°}ûö¤Êÿ<k×fº—>ÇãÊCÊ†,?ï�@¹0 P.W’Ï‘,Q\¹æB¥§’ó¶{÷îX²dIxÚÜyç�É€@ÎÄ"€  € 9ðúþõë×‡;þ�=öXlÚ´)‡ï~Ú[yëfû{XÙ|ÚwyZ`  E^D U�CúŽk4*ž	ÐGÉy;tèP2À#ècÇŽ/`‡€œ3ó† €  �#oóçYŒÞæoòäÉá6ïÔ4IñÝ×k¢!€À—` àKBñÇh&Ð ç.0ã‘ç”¾JÎ›·Èñ´9�ž{‡€;äœ™7D @ �³hhhˆÙ³g'Åþ^{íµð�Œ›ë2ý\™¢ÐùÏš·.O Êóºò©²ðO6ÿ òÜ6/è§´SrÚ¼oîºuëbÎœ9Ñ¯_¿ðÌ)1o†  € g!àb¯¾újüÃ?üC2à5×aò,Ìÿ£¼¬¸øÎP€€3ã�#ÐLàˆž»àŒ3F©TÎQrÚŽ?»víŠ$�ÿ‘#GF÷îÝ©�SeÞ@ ÎDÀëýwìØÏ<óLÜsÏ=É¬EÿÎ’QóÒË…ÊÏ”©ŠgcÒ@à+0 ðÐø+48ªç5Š÷·ñr€!J{%çÍE]ðÀ�1~üøèÓ'“ò9?oÞ@ ÊO ºº:|ðÁxôÑGcóæLkðùw­9ÊÿRf* !€ÀW` à+Âñ×h&àL;”UÊHÅƒ 9Ÿ	 ÷LÖÔ­Y³&¶nÝz²8 ·¤!€  € ùð]þ+V$ëý§L™;wîÌò°Mzó�ßùŸ§økœ…  g�Ç_E ™À1=ß¢x›À�Ê0¥³’óV__p¥ÝáÃ‡ÇÀ�)˜seÞ@ Np±¿™3gÆ?þã?ÆÔ©S“-‹Oý39üú€Þë-Å�ÿŠo¸Ð@à, 8K@þ:Í\œÆ3+½•±J&ƒ GŽ	O½[¸paTTTÄ˜1c¢S§N:@ È½€+û¿øâ‹ñ³Ÿý,æÎ�ûóÉ»óÿœò/Êr%³âzomJ€€6u¹ù°yðÆ·Þ!À=òqJ%çÍÅw<ínÕ*¯<ÐhÃØ±Ñ­[·œ‡7D @ �¶-PWWO>ùdLš4)™�˜a±?CïSžV&)þ}Ê7Xh �# rÉÛ pŠ€÷¥õV5ÞÇÛvW2iÞ!ÀËüÃÙK*++Ù! iÞ@ �¶%à›¾Ñàb�?þx¬_¿>k€]:ÀCÊÃJæËúÃðþ£  ÅxU8§rðöJÅ3< BÉ¤y^ÿ€vm :”A€L¤yS@ Ú†€ïòÏš5+îºë®xå•W².ögÔÊ/•§×U¢!€@ d€Ê["ÐLà�ž¯S<¢íA€J%“ÖØØUUUÉ @ß¾}cÔ¨QqÎ9™lF�Éùó¦ €  PMMMñæ›oÆ=÷Ü~øa²QÆg¶ZïÿeŠâß™h �‘  Áò¶4hÐsÿ`«QF(”Lþ¿wìØ±¤8 —=z4}úôÑáh €  €À¸ÈðÓO?÷ßÌ›7/ü»E†íˆÞ{¾r·ò’²_¡!€@†™tB2<_Þ�Rð8ÏpÅ¾ÎÊ%³²ý.¸téÒ¨©©I<Ð®];’†  € œ.àõþîðÿò—¿Œ?üáùXïïY’/(¾ó?MiRh �±  óö4ð6ÕŠ¼3Ày'õ�ûvàÀ�X·n]lØ°!™àA ¶
Ì½3ïˆ  €@©<x0Þyç�˜8qbL�:5vïvù¢LÛ^½ûdåAežÂ6B !� ò¡Ì1ø¬ÀN}éâ€ž0X9WÉ¤9r$p�@ïß;räÈèÕ«W&ÇâM@ @ ô6oÞœTøè¡‡bÆŒáß2n¾ò¤âJÿÿ±—qÆäí@àÏ üÙ‚gäS`�¶LÙªS<�YÛ¾}{,Y²$jkkcÐ AÉ²€ÌÆ#€  €@I,X° &MšO<ñD>¦üÛÄëý©üQÙ¬Ð@ Ï äœÃ!ÐLÀkß\ÐË\p”ÒNÉ¤Õ××ÇŠ+’]»v�#F°$ iÞ@ �âð¬À×^{-YïïÇ}û¼sq¦íS½»×ùß«¼®d~@ƒ† -0 Ð
/!�G�£:V•âeý•¡Jf{÷yZßÆ�“â€Þ"pØ°aÑ½{w’†  € mAÀ…‚_xá…xä‘Gâ£�>ŠÃ‡gý±]Üï}ÅëýßQ2? ŽAC �V h†—È£€ßx=œgtT¼U`7%“æ*¿^ïçiÑ¯_¿0` »d¢Í›"€  Pþù¿xñâd½¿§ý¯\¹2üZÆ­Nïÿ¼âiÿ*™î)¨÷§!€À0 ð@|�<
lÑ±>Q<+À5ú*™5ï°hÑ¢d— ïàÙ �;{‡B € ”“Àþýû“)ÿ÷ß<ÿüóù¨òo¾µÊŠïü¯Ph P ÁEàh&à5qþ!éA€áJ¥’Yó’€µk×ÆêÕ«£¢¢")È’€Ì¸yc@ ò.à)ÿ^çÿ‹_ü"_Uþý]ÝÿñqÁc‰  Er!8š	¸8àÅÅ½CÀ@%Óÿ¯îØ±#æÌ™MMMqî¹çFeeetè�é!õ‘h €  �•€ù½Ð“O>÷Ýw_¾ªü{Á9Ê¿(Ï)Þõˆ† E$ÀoøEt18š	¸@ÎÅ³¼Àƒ ]•ÌÚÁƒcáÂ…±lÙ²èÑ£G²] w !€  €@i	ìÞ½;Þ|óÍ¸çž{âÅ_Ì×”wößVîR\ñßÅÿh Pd Ùáth&àÊ<›”åŠçUz*™5ß-¨ªªŠ¹sç&ƒ Œ^½zQ 03qÞ@ �Ü	?~<ÙégÊ”)q×]w%Eÿü³=ÍÓüÓbõ<óê‚yøL�²`  ,/+ªÌvéóx:ÝAe”âí”Ìš÷ö’€6DïÞ½“](˜7oŒ  €ÀY¸¸ï‡~'NŒ'žx"¼¼/Í}ÏXœt"5y8&‡@ �³` à,ðø«äQ AÇr]€õJÅÅ3-ÙßØØ«V­ŠY³fEÇŽÃ³<Ð®]¦cúX4@ ø²ÞÊ¯ºº:&OžÿôOÿ³gÏŽúúú/û×ÏæÏí×_ž¡x½ÿå€BC �"`  È/§‡@3ï°A™©ôP2_à_*öìÙ3gÎŒÚÚÚ¤8`ß¾}ÃÛÒ@ @ °‡J–í=øàƒñÐC%wýý³;m›ŽáNÿÿVæ+®]DC �`  .§ˆ@3�ãzî";þaëE}#•>J¦·å>kÖ¬‰ùóç‡·	4hPR#@Ç¥!€  €@¶oß¯¼òJüó?ÿs2õßƒyhþ=Ä7#~£<¨lVüJD€€¹Pœ&§ø§ü'Š{‡€JG%³æ"Bþecúôéáž	àœsÎ9™“7F @ �Ï
x‰žwíyøá‡ãW¿úUlÜ¸1òTèÏËg)÷(“¶ø�R`  Ô®ç‹ÀŸ<ÝÎ5æ*Þ`ˆÒMÉt6@CCC²¯°ùpaÀþýûGÏž=© x € Y	xjÿÖ­[ãå—_Ž»ï¾;Þzë­pá¿<4¯)pAâ—”Ÿ)³Ð@  (Á‹Æ)#ÐLà˜žû‡òÇŠoÅ�Tz)™=z4¶mÛvrÊáèÑ£“�:ðOŠìi € äTÀwø×­[“&MJªüçñ®¿;ÿ›”'•Ÿ+UŠ÷ !€@‰
ðÛz‰^8N�S¼$`™âíw†+Þ) ½’Yó�OC\½zu,X° 9Î°aÃ¢k×®ÌÈL�7F hKþY[WWS¦L‰{ï½7¦N�{÷î�<úsñáEÊ½Ê¿);”¸  %~9}š	xÀ{ñ.Tz+Þ%Àåú3�àA€M›6%ÛnÙ²%†ÉÖ�:6@ ¾‚@ºänâÄ‰ÉzoÍë×òÐ\ÔoŸòšâ)ÿï�øZ4(u Jý
rþ|VÀ£õÛ¸FÀ0¥BÉ´ùN„«{§€O>ù$¼kÀ˜1c¢[7—$ !€  €À™ø®ÿÓO?�ù{÷Ýw“-yót×ß§¹Qù�r¿²\ñ®C4( ÊäBò1h&àõz®Ì»JY¯x— ÌtI€Þ?éø»@ÑÒ¥KcóæÍ1pàÀ0`@´oŸù¡}x € %-pìØ±X´hQÒñê©§båÊ•Ér»<}(¯íw•ÿÿ«¼ xY¡§ !€@	0 PF“�‚À)õµ—,Q\ p�ÒCÉ´?~<Ù&Ð¿´,^¼8™0xðàèÕ«µ2•çÍ@ JUÀw÷=pî»þ÷ß¼ýöÛQ[[þ™š§¶]Çq§ß…þÞW¼€† e(À @^T>Í<š¿Eñ’€ÍÊpÅ32o®X\SS“ÜÉðºÅÞ½{ÇðáÃƒ�2§ç  € %$àesÓ¦MKŠüýñ�LîúûghÛbk¢ò[e¥âßh P¦ ”é…åc!pŠÀ~}½Vñº>Ï©xV@æÍµÖ¯_Ë–-‹íÛ·Ç Aƒ¢²²2óãr @ Š]Àä�<òHüæ7¿‰3f$3èòxÎM:Ö[Ê}ÊëJ­BC �2`  Ì/0�f.
¸Nñ’ Oíó’€¾JæÍk·mÛ–ô/;žÒ8bÄˆèÒ¥KæÇæ  € ›À¾}ûâ…^H¦û{‹¿�7†Væ±ù¦ÀcÊ¿*^÷ïÁ ´ ÚÀEæ#"ÐLÀÅ|¼�¯§ûù‡: /ÿ455ÅÚµk“�€ªªªèÞ½{²m Ët%h € e/àéþ}ôQLš4)üñ˜;wnøgc›oLU<åÿY¥Z¡ÐŸh´�¼üÒßV0ùœ”�€7öl 	¬W†*½•¼´½{÷ÆŠ+’m½ÕÑ�!C¢¢¢"/Çæ  € BÀwù÷»ßÅoûÛxë­·b×®]ù>�M:àSÊ#Ê‡Ê!…† mL€€6vÁù¸4piaô’ ?ºî"�í”Ì›UWW';ø—¢úúúdÛÀ=<)�†  €@yìØ±#^|ñÅxôÑG£@Eþ|‡º2Iù½²ZÉÛö:ŠH /¿èÑçåT@ e�Žzy‚r§ò—J^v
ÐqN¶Q£FÅM7Ý?ùÉOâæ›o¦>ÀIž € ”¢@ccc|ðÁ1yòä˜>}z²Î¿ ŸÃÛû½¢<£ÌUŽ(4hÃ ´á‹ÏGG �azí6åo•o*yÿ7âÊ+¯Œ[n¹%î¸ãŽ˜0aB´k—÷SÐÇ¦!€  ðÕ>ýôÓdm¿‹ü½÷Þ{±p¡wâÍ{ó]ÿ÷•?*ï(žþOC ‚% üG€ Í¼]àre‡â< ›’·æÝ–.];wîLvèß¿R,0o'À�@ øŠþÙõúë¯'kýŸ{î¹d©ÛW|«³ùkÞÎï5å7ÊËÊ…† $ ðœ*à}ˆ¼CÀÅ¿Dx¯>	l¯ä¥¹J²‹.X° ¶oßíÛ·�DçÎ�ór|‚  €À™8p Þÿý¤²ÿ¯ýë˜5kVøgYžÛQoºò[åaež’×½u<¹ sk‹üqzXÀÿFÜ ü­r»â%yoW\qEÜ~ûíñ½ï}/¼D€�€¼_ˆ  Ð‚€·ðóÿ7ß|3Þxã�X´hQ*//mÒQÞP<å¦ÂÖ~B !€ÀéÌ 8Ý„W@à³5úÒ;ø—‰žJ?%¯ÿvxÀÇ®¤ìÙ  èÓ§Oò\çBC @ ¯ÇŽ‹uëÖÅ´iÓâ±Ç‹ßÿþ÷±eË–¼žÃ‰ƒÑ£GžUþŸ²L¡!€ ­
0 U¾� §tÒ×7*ÿM¹UÉûN:fÒñÿÖ·¾?úÑ�âúë¯�Aƒ1` €@æÇ�×ª™={vx�ÿ»ï¾{÷îÍü¸­Àþ§)O(3”¼¯9Ð1i Pb ”Øãt(�þ:/	ø+å*¥»’÷æŽÿ~ðƒøîw¿×^{m2�÷“à€ € mFÀÿ9sæÄÔ©SãÕW_M
ôáé¸®Óãžò¿S¡!€ _J ¯Óx¿Ôñ‡@ Øü‹‡÷^¥x‡€J¥—’×vðàÁ¤H «¯¯�ž={F�=¢K×,¤!€  ��}ûöÅ’%Kâé§ŸŽûî»/™öïŸAj›u\¯õÿ…òïJÁNDÇ¦!€@	
0 /§Œ@‘øß�>Ê_+w*—(ç*yo:tˆ‹/¾8î¸ãŽøÎw¾ãÇ�Oò~"@ l\ÙÕªUñöÛoÇ/¼Ë–-¯ý/PÛ­ã.UžQ^T¼î€BB !€À™	0 pf^üi8]À3‰Æ(ÿåDÆë± ûõ¥wÞygÜrË-1fÌ˜èÕ+ï“ôñi € ¥*°ÿþX¿~}¼÷Þ{ñÌ3Ïºãß$GÏ¸›r"ëõX°Q›† %.À @‰_@N�"8Gçr“ò?¤´WòÞ:uê—\rIüÝßý]|ûÛßŽ#FD×®]ó~@ t¢ºº:þô§?%Óý—.]‡¬®ÞqÉmS\ÜïQeºrT¡!€ g%À ÀYññ—@à¸Hàw•ÿª\®ôPòÞ¼] kL˜0!~úÓŸÆ7Ü�
¤F@Þ/D ŠZ ±±1)è7sæÌd;¿¹sç†×ø»â�š×õ¢<©LU\ä�Î¿h pö œ½!ï€ §tÔKã”Ÿ*©S
R�Ï'gÜ|óÍ1pà@fè‚Ð@ �¶,à;þÛ·o�>øàäÿ={ö²ãß¨ë±IyEù½²Z9¢Ð@ �œ	0 �3JÞNð¿/Þ"ðZåNåÛJ?Å³òÞ<àz W_}uR,ð¦›nŠaÃ†Q,0ïW‚"€ …pq¿M›6ÅôéÓ“â~óçÏ¯û/àßÝß¥üIyF™£xÇŠü	�† ¹`  ·ž¼œ.à: }•(ÿC¹T)Èl 7<Ð½{÷¸ôÒKãïÿþï“]úöí®@C (_¯ç¯««Kªú?þøãÉÖ~‡*dÇßØ¾ë¿DyLyU©S
¶ö@Ç¦!€@™0 Pæ˜�‡@	¸ÀùŠwø±2DñR�‚4wø+++ã¢‹.ŠýèGI±À0P�«ÁA@ �ìÜñß±cGRÜï¹çž‹åË—Gmmm!üùÃzjÿåYÅþ×(^ûOC 2`  S^ÞZè£×®Vþ»ò-Å_dY€Ž›Ìð ïð“Ÿü$n½õVj†† ”°À§Ÿ~.îç5þÓ¦M‹É“'‡«ú{@§ú[ÔÓý÷*ï*¿SæŸøZ4@ { ²7æ pº@½4\ùšâm¯W
6 cG‡Â3 .¸à‚ø›¿ù›ø‹¿ø‹äk/ !€ ”Ž€;øîø¿þúëñüóÏÇÊ•+“ ÇŽ+ô‡pç¶âmýf)5JÁOJç@C �6$À @ºØ|TŠPÀE/T¾¯xiÀyJÁ–èØÑ±cÇ2dH\xá…qûí·'3F��¼îïÓ@ ŠSàÈ‘#±aÃ†äŽÿo¼+V¬ˆ-[¶„_/pó	¬S<Õÿue…â"4@ ï ä�œ"€@çêµñŠ\À³<K  mðàÁ1|øð¤>ÀøÃ;vltëÖ-ÚµãŸÎ‚^Ž œðTÿúúúX»vm¼ôÒKÉ:ÿšššØºuk1ùî¾ïò{�¿;þ«”Ý
(˜ ¿ÅŒž#€@•zí
åå‡J?¥à­¢¢"FŒ×]w]üøÇ?Ž	&D×®]~^œ  Ð–bîÜ¹ñì³ÏÆÇÕÕÕ±gÏžb!ñ¶~/)/(‹”Z…† \€€‚_N Nð¿K£•kÏp¡À¢èm÷ìÙ3Î?ÿü¸þúë“Y7Þxcxp€†  �?wògÌ˜‘ÜíŸ={v¬Y³&8�¿øü#5èÛ.ðç»þs”Ê§
(
 Šâ2p Ð‚€— ŒS¾©üµrƒÒY)xëÒ¥KŒ5*.½ôÒ¸í¶Û’:#GŽ,øyq €@9TUU%ëûßyç�X²dIlÜ¸1©ô_$Ÿ¹Iç1SyQy_Y­PàO4(. Šëzp6 pº@½äú ·*.x¥RÐB�:þÉæãÇ�O–|ÿûßO:w.ŠqŠ“çÈ@ Tššš’Î¾+ú{šÿªU«Âkü‹¨¹ÀßBåyå=Åëü P” åeá¤@ �ÞzÍ�|Gq­€‚
Ô9$­oß¾Içßõ¾ùÍo&uX�êðˆ œ™€§ù{}ÿûï¿Ÿ<úŽ]]Ý™½I¶Úw÷½¶ÿmešâA€}
(j Šúòpr Ð‚@_½v©òmå/•ó•¢ð.žpùå—'®àmÙ9@W‰† |Ž€+ú{?¯ëwÇÿ“O>Iîø»Ê5wü×(¯(R–(E52¡ó¡!€ ­
0 Ð*ß@ �"8Wçw�r£òÅƒEÕÆŒ^xa\vÙeI�€«®º*\H�†  ðgð[°`A²¾ñâÅ±bÅŠX¿~ýŸÿ@ñ<sgÿUe†2OÙ­Ð@ �’`  ¤.'‹ -ôÑkðŒ€ÿ¤\¤Uó¬€‹.º(¸é¦›âë_ÿzŒ;¶¨Î‘“A ò-°víÚøè£�búôéI§ùòåQdwûS’åzò–â;þîøïUh €@I
0 P’—�“F �†éµ›Ü¤ŒPŠ®yF€—\wÝuqÅW$ÞU€† ´�ÆÆÆpGÑ¢EIQ?O÷÷ÿ"mÕ:¯éŠ;þ(› PÒ ”ôåãä@ �Ází[Ê-Ê×”¢¼Õî�W_}u\{íµÉ`À%—\C‡�öíÛë”i €@ù?~<6oÞK—.M:ýsæÌ‰ùóç‡ýi[«óš¥¸ªÿ»ÊV…† ”…  eqù Ð‚À ½æA€Û×	(Ê� �W2À¸òÊ+ã‚.ˆ~ýúù[4@ dvíÚ+W®Œ…&�wü}÷¿ˆ›;þ^ßÿŽâÎÿ…† ”•  eu9ù0 Ð‚€—ü•r«r™2R)ÊÖ«W¯d6À7¾ñ�d0ÀÃ†‹Î�;åùrR €À©MMM±iÓ¦¤ãï;þ~øar×ÿþý§þÑbúºJ'³X™¦¼¬0Õ_4(O Êóºò©@àt�J½t»â.QF*•¢lLŠºhàÅ_œ4hKŠòjqR´mOñß¶m[¸¨ß²eË’¢~.î·}ûöb†9¢“«R–*®ìÿ†R«Ð@ �²`  ¬//ZðÜú›•ï*W+ç)Ý”¢líÚµo'xÛm·%³Æ�Ã‡�þýû3P”WŒ“B m¸Ó¿sçÎ¨©©‰U«V%wùßyç�dû¾O?ý´˜êurë”ùÊTåe—BC Ú„  mâ2ó!@ wú],ð¯•«”QJw¥h›·¼ì²ËNœwÞyI­€>}¼"È^`ïÞ½áµýëÖ­;Ùé_¼xq±nß×ä�¾Ø¨,P^T\ÜÏƒ4@ M	0 Ð¦.7Nð¿�^`?AùÏŠ·©T(EÙ<#À;¸^À„	â†nHv;vlTVVƒEyÙ8)JZÀ�þÚÚÚdŠ¿«÷Ïœ93æÎ�^×ï™ E~Çß[T)ÞÎïß•¹J“RÔÓt~4@  2aåM@ Äüo¡ë\¬|_ñÎç+ý•¢mpzöì_ûÚ×’\uÕU‘ÎèÝ»wòý¢ý œ¥€;ôûöí;y§Á‚1kÖ¬$H:üEÞé·ëNe�âŠþ¯+Ë¯û§ã/´] Úîµç“#€@Ëôò(å‡Š‹ŽV¼¥`'¥h[:3 {÷îqã�7†‹zKÁÑ£G'3<cÀ3h €@K¾“ï;ú¾Ó¿aÃ†dë¾éÓ§ÇŒ3âÐ¡C¥p§ßë°â­û6(.ê÷’âiÿÇ €€ à?@àtÿÛè¥îø{Y€ë\¡x'�JQ·sÎ9':vì]»v�k¯½6¼­`:Ð·oßdù ƒE}	99ò"�vúëêêNvú½mßœ9s¢¡¡!Ž9G�ÍË¹œåAêï×*‹¯ï÷t0Õ_4@ ¹  Í5xŽ œ.à¥îô_­xç€›•Šëý-õ:$ƒ]ºtI
z0ÀµF�•ì$àå�;{¬ƒ† mA ©©)<�ßü7nÜ˜¬åw§ß…ü“Nÿ±c%qÃü¸®—×÷W+ï+o+óxª?@  Z@á%@ wö½`”ò=åÛÊ…Š·,‰´ïú{f€ã­¿þõ¯Ç5×\çŸ~<8\3À;xÊCÀwðëëë“5ý[·n�5kÖÄ¼yóâ£�>J¶ìó]~Ç³J¤ù®¾·í[¡üIySñ4Oÿ/™¡s¥!€ `   ìJ\À}•[”;•ko!X:Ï¤uêÔ)¨¨¨ˆë®».n½õÖpA×ð@€¿ï4(-ßÁ?|øpÒñ÷z~ñ›6mZ²mßž={’¿¿_bÍoå7OyFyO©SJîƒèœi €@Á (=F �2p§ßu.QnW< 0Dé¢”TÏÙ~ô£gÜrË-É`À¸qãÂ^&à™.6HC �âpE~ßÅ÷ô~wðW¯^�túß{ï½äŽ¿g ¸�ŸK¬y-B£²Eq‡ß…ý–*^ïïÁ  €À
ð›Ü‚ñÇ@ �<g¾·2L¹Uñ6‚.ØKñ¬€’ú·ÖK¼k€�Ìp1Á.¸ †=zô8¹”€b‚ºº4ò,àéúéÔýƒFMMM¬\¹2)Þ÷ñÇÇŽ;’Î¾«ú—ÐÔþTñS=ñÝþýŠ‹úy¿iÊ&eŸRU	už4@ (Jê—Ò¢ä¤@ �Ï
¸ÓïåžàÝ< àÝ\L°$›;ü.è�¡C‡&»
\~ùåqé¥—Æ°aÃ’šžÀì€’¼¼œt‰ø.¿ã5ý›6mŠ%K–Ä'Ÿ|.à·yóæ¤Ãïâ~(áæâ}®Þï¿«ùûn¿§ù{0€†  � r€È[ € -øÎÿ`Å;Ü ¸p gøõ¢ß=@çØbóÿ~ýú%Ï=÷Ü¤˜ ë\vÙeÉo3è"‚´ÈÇ‹|i�æ~oÓç;ü®Ôïõüë×¯�Ý»w'…ývíÚUŠwù›;¸pŸïøûn¿úÍTª•­Š_§!€ äP€€bòV €@+}ôº—\ |Sñ¬€áŠg”ì`€Î=éì»Óï:pÍ Ï¸è¢‹’ç^B�°\Àb4ZðTýô¿§ð{ÿòåË“;ý~î¿×÷{0À³ J¼¹Óï»ý5Šïö{¿•Š§ùïUh € 	0 �,o‹ ´ ÐA¯õW<0AqÑÀ›•
¥,š‹öéÓçdF�_|q\qÅÉ�AƒE—.®‘HC 466Æ¶mÛ’;ü‹-ŠeË–ÅÆ�cïÞ½'ãâ~eÔöè³| ¸¨ß\Å�þ�Ê1…†  �±  óö €@+®à�€qÊ×Ï¯tSÊ¦yç€ÊÊÊèß¿2CÀ3< à1bD2XP6˜‚À¸c_]]�tò}‡ß~ßñ÷þ�;wFmmmRàïÞ¦Ô¾ííV)¾Ó?KY­¸ãÏÚ~!Ð@ �|
0 �OmŽ… ´,àY#Ü¤|C©tRÊ®y©€<SÀK<à�±cÇÆèÑ£cÈ�!IÁÁ²ûà| 6'àm÷¶lÙ6lˆµk×&SúÝù÷T~¸ÃïŽ™¶Ãú\UÊ‡ÊtÅ�þ*Åwûi € `  @ðhAÀõ †(#•óô€À(ÅËÊ²¹F@:C ­%0räÈd¦€< à¥Ý»w/ËÏÏ‡*�C‡%SùÝáwgßwö«ªªN®ÝOïð—ÁúýÏ»`žÆ¿Qq‡ßÅüÖ(UÊÅëþi € `  À€Ã#€ ­øîÿHe¬ââ�×+×* (ûæ-ü™™Ã‡OvðŒo?èA�^½¼’‚†@~öïßŸtö½Ÿïè»*MMÍgîìoÝº5Ùš/¿gV°£¹ƒ?G™­¸˜ßZ¥Jñ,  €@	0 PDƒSA ZpÕ¼1Ê8åbååje ÒfZ×®]Ã5¼aºó€gŒ3&©'àï804p1Bg+àâ{ž¦¿}ûöd�¾‹ó¹³ï×ÒŠüÞ†ÏkøÎöp¥ö÷·ë„ç+ó”eŠ§ø¯W €@‘
0 P¤†ÓB Zp‘@¸`àeÊ%ÊåŠ·ls­]»vI‡ß�ÿÞ½{'uüè¯½tÀ³<SÀ3ÚÜ"_êûŽ¾;õŽ+òûn¾§ò»c¿oß¾d½¾ýµÿŒ·ëk£ÍÛö}¢,U+.ìçN¿‹üÑ@ J@€€¸Hœ" ÐŠ@_½îå)—*ç�øz˜ÛtëÔ©S2�.#ðŒÇƒ é,#t!Âtà€YåýŸŒïæ»ð^Ú¡O×äûî¾;õuuuIüÜÓ÷ÝÙ?|˜ìú¯b“âiýë”%Êò_×é‘†  Pb ”Øãt@ �VzêuôŒ x†€—ŒRø·^níÛ·OÒ¥.:˜ÆNºÄÀƒž1à¸ ¡‹ÒŠWÀÅõ\ˆÏwówöÝ©÷}wöOÛO“NÝwGÿøqêÓ5»²žÞàB~žÒï;üîôûŽ¿úPh € %,À/…%|ñ8u@ L< p¡âb‚£× µ"àÎ~:CÀ3Ò~½G�É �	zöì™Ìðë~î¢…þ¾gÐr/à;ñLŠê8p éàûN¾Ÿ§�{ßÿô¿;ÿ¾›ï;ü~�ö¹^·¿Aqñ¾Š;üi§ŸiÂ !€ å"À @¹\I> Ð²€·tçßƒ . èY®!0R¨ÐÎ@À�}Ïð²�tæ€ŸûuÇ3<à�Ç_§qCÇßïÜ¹‹Ò)0pƒ¶Ô¼~Þú¦&§1éÔ»€žã;øiÒ;ùõõõÉkîì;îà§wñýÜwòý:íŒ\Ä¯Jñ~ßíw!?wþ=À”!Ð@ �rh[¿u”ãä3!€ _^Àÿæ�T\40]*àâ�”AJG…v–;vLê¤;¤³<@�tëÖ]ƒ]¢K—.É €ëø¹ãYÍã¥:tH– x	ƒŸ·ßÍƒ
Ís&ÉôæñßõùcÇŽµßSðýgüè~ó466†ãuøîèûyCƒ;ÿž²Ÿvî=u?­°ï»øGŽ9“ÓçÏ¶.`ÈmÊÅÅüÒ©ý.êW¥´ÙÊ†úì4@ Í0 Ðf.58MÀu\DÐ5®R<SÀN…BË“€;ùð`�—¤ñì8é €N}î×¿� |Þs4wÜÝÙ÷ãç=w§ÞqÇûôñÔçîà;¾‹ï)ùiÜ©÷}¿-¯{t4wúßÙ_ ¸ãï¢~L›hk ´µ+ÎçE Zð­ã¡Š®P¼dÀ_{v€—
x°€† Å-àN½§öû.ÿfÅSú)îôûk¦ö�† ´e ÚòÕç³#€ ­tÓ·<#àJåÅ•J_å\…jwB !P`èÛ­Ô)µŠ;üó”…Šïø×+4@ N
0 p’‚' € -xf€VxI€wð€€sžâ¿îtVh �­@“ÞÞÓúwø×)îì;Þ¦Ï¯{-?wú…@C 8]€€ÓMx@ uÿÜ8Gé­\¤¸  = ÐOñ`€¿×C¡!€ÀÙ	Ô_ß§¸c¿Kq‡¹âÂ}~ô÷Ž*ð@à‹ øb#þ €@ëþ9âY½”ñÊŠ¼dÀõÒÁ ×àgŽh´"àN¼×ð§�~¯ã÷”~wô)«”ýŠïîÓá@àÌøeìÌÍø € -tÐËžàÇîŠk\ªx§
xwÏð÷üÈ²!ÐÚ¬€§ó»³èÄ£+õ»³ï
ýK¯á÷÷Ž)¾ËïG € g%À ÀYññ—@ >GÀ?c< àtT¼›€—
¤3ÆèyÅŽ2( ZÙ	¸³ï‚|îÐ;;•õJz‡ßSû]½ÿˆâÎ>Óú…@C È½  ¹7å@ Zðì€t¦€;ûÃ•Ë
\¬xÖ€—ø{ÞiÀ�@ !P*î¼»Ãï
ý~ô´~ßÍ_¦øÿb¥Fñ÷üg}gŸ»ûB !€ d/À @öÆ@ utUÜÑwú(ðL�qŠw¡œ«x@À3	Òè)�‚
øŽ}štK¾j½æŠü«•uŠ;û{wø�…¿h € ù`  ÿæ@àó<(�øÑ^>àÙŽ<00Xñ÷=C �häZ ùÔüôÿVÄ}wò}‡ßñ4~wðÓÎ¾éì�†  P Çuà,@ ¾X ù @ýñ
Å³F+ž%0ôÄóAzô÷ÓA�ôÑ4ZpGÝ�ûæiÔ×Û”ÊfÅw÷ýÜwõ½5Ÿ¿ß¼³¯/i € ¯  Å{m83@ �/ðwö›xëAxp`Œâ‚‘Ê0Å»øgŸÓ^qKÿã+þ·ÜŽŸø€~ôvzŽ«ñoRªwð×+îä»Ó¿OiÞÉw§ß3h € ”œ  %wÉ8a@ �/!àï*à¤;¸óïZž!àQ¼´ ýÚ3
<KÀé Aú¨—h%"�vêÓGwô}wßwì}7ßñTý-Í¾Þ­çH+õûÑqÇŸ†  €@Ù0 P6—’‚  ð%<c ðóôkÏè¯¤•zÞïDüº<°�þìLÒG}ëä÷üœ–;wæÝÒN}ú˜¾æŽº;øÞ^o×‰Ôê1íðûußÉw§Þwð?O¿ÖS € å/�þSþŸ”Oˆ  €À¸^€‹¦;¤îøûy_Åƒ x`À¯ypÀñƒ^
Å…�ƒæ©öûß¡wß©SÜ¡ß¡¸“ï¿_s§ÞißÏ]�Ïñº~ € m^€€6ÿŸ   € g àåð AóY H	ü}/7ð–†žUà¤Ï{ê¹ãïû=ü˜.Qð×åÜÜ÷÷CŠ§Ûûk?8ß¡÷vy~LŸûûÍ;ôi?½{ï÷ð÷ÓuýzJC @ �Ö hM†×@ 8;�NúëÍÒ¯ýèx–@óøÏzPÁi<(�þy,¤Ïýg›?O¿Nkx âÔœú=ý‘¤ãìÎsºN>}~ê£×Ð{Ÿ{wÀ?O¿NŸ»#ž>wÇÜý4î°ûïùŽ~ó¤>}O¿GócèK € äJ€€\Iò> € äFÀËÒ�?wÇÝiþ<}íÔÇæõWZ,hèŸýéÏÿt-ý©� pK_O<ÐZ<Í>ýžŸ§}¦ßƒ†  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  € ›ËŒ  êIDAT €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €@q
ü‹°’è“ò    IEND®B`‚ic11  (‰PNG

   IHDR           szzô  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  1IDATX	íWIH\I.»G[m�
îŽ„6Œƒ‚â!9x& ‡„ôÁ“è-�ƒ™£ÌA�à‚K\fôàaQ•\5f&J#î¢Øn8Ú.]ù¿
ïåõ«×ÝÏ$·¤ »ªþúêû¾Zß{Œ}ï)äŽðá	ÍIOO¿}ý���Ýëëë®ëëëEªþK¿ÄÍ$³îÅÆÆ:‹ŠŠ^<ÌÉÉ±¥¦¦²ˆˆ¡q~~Î677Ùââ¢gffæýØØØŸ‡‡‡P£ÛŒ‰`˜çåååæææ¸Ù,úñó`ä�ÚÃ333ß™Õ•pè	$dÔž››;8??/‘Þ5 pÝÉ„ÃáhRÄxCC¯©©áüêêÊ¯‡‹‹ÞÓÓÃ«««ySSw»Ý.p�TŠ………•zÑâyyyœ@ê¯¢¢‚ßÜÜH&`Ìétª8ô),,ätBœà–u{YYÙ^¯Ðç--->„ µX,|aaA2@»_ÂßÛÛ+°à7ÅìZM‹¶b·ÛŸUVV>	ùt:q´ô‰ˆØîî®>Ìvvv¤"NpCÃHAkIIÉìíí­:º‘‘iTqqqœŒ©¥°¶¶Æ###}ð$Ê§¦¦74 edÂAçM¬umm­Jœ’’Â‡‡‡µµÜÖÖ&pñññÂÝ’¼®®Ž+Ë© ¡AâÉ€Õj-�žžVp>ùÊÊ
ÇïííùÄ•J{{;§Æ»ººøÖÖ–Àº\.¥Ù'‡´$III¯0�wM���B¼££ÃTWh@K2�••õûþþ¾)ÔÝÝ-Ä[[[•PÐÐRhOÖÎtêëëcUUU¬±±Qä¦;~ÊZ			/ý­›~XýýýÜf³ñææf}SÐ:4 %¦�ñtrrÒ�@»	éFâ4rCìöövÀMhI(ðs}}ý©–U9]$ÜŸ8-FðBZF,ÅÅÅôV£z0ºˆbbb8Ýz*F)¬®®ª÷‘ú‹ÜÐ vuï©
z'&&ÞÒyWÍiËJðèèˆ---)U5§ç;;;Së(�9¦å@ÔäU€Zìòòò/ºÑhêE;^»ô‰FŒ¦Yft¶¥iii"NpCÃ¨	>! xèËÇ18Iã‰FÇ199ù7š*±¼_óBBË%8ÀNÿŠr‹•Þ`šÇÇÇ•=öÅ98ÀE†O@YúsÄBÇî5½”x½†ùs†>è¢ôÙkŸ%Ì•—––¾å�ÇŸžXô!úÇÁ$Ì~˜ØˆèWú0qæçç?ÊÎÎŽÍÈÈ`QQQ‚ÿôô”ÑSŽ-//ÎÎÎ¾£|”üM?� ø3k@K‘L•,º}>ÍNNN\ÿ‡~ÛZð�r°ønHRÑL    IEND®B`‚info  bplist00ÔX$versionX$objectsY$archiverT$top † ¥U$nullÓ	
WNS.keysZNS.objectsV$class¡€¡€€TnameTiconÒZ$classnameX$classes\NSDictionary¢XNSObject_NSKeyedArchiverÑTroot€#-27=CJR]dfhjlnsx}ˆ‘ž¡ª¼¿Ä                            Æ           (  f   €€     ( Ž  @@     (B  ¶( 00     ¨%  Þj        ¨  †�      h  .¡ (                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
      0   F   b   z   �   ¢   ²   ¿   É   Ð   ×   Ü   Þ   á   á   Þ   Ü   ×   Ð   É   ¿   ²   ¢   �   z   b   F   0      
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           	   #   F   l   –   ¼   ×   ì   ù   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ù   ì   ×   ¼   –   l   F   #   	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      D   w   ­   Õ   ñ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ñ   Õ   ­   w   D                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         L   ‡   ¿   ë   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ë   ¿   ‡   L                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         1   s   ¶   è   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ###ÿ999ÿMMMÿZZZÿkkkÿ{{{ÿ………ÿ���ÿ“““ÿ•••ÿ˜˜˜ÿ˜˜˜ÿ•••ÿ“““ÿ���ÿ………ÿ{{{ÿkkkÿZZZÿMMMÿ999ÿ###ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   è   ¶   s   1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             8   ‚   É   ÷   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ666ÿZZZÿÿžžžÿ½½½ÿÓÓÓÿæææÿóóóÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿóóóÿæææÿÓÓÓÿ½½½ÿžžžÿÿZZZÿ666ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÷   É   ‚   8                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      -   z   Ê   û   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ???ÿpppÿ   ÿÉÉÉÿçççÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿçççÿÉÉÉÿ   ÿpppÿ???ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   û   Ê   z   -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  `   º   õ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿQQQÿ‹‹‹ÿÃÃÃÿêêêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿÃÃÃÿ‹‹‹ÿQQQÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   õ   º   `                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              2   �   á   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ			ÿ999ÿ|||ÿ¼¼¼ÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíííÿ¼¼¼ÿ|||ÿ999ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   á   �   2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          K   ¬   õ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿFFFÿ���ÿÑÑÑÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÑÑÑÿ���ÿFFFÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   õ   ¬   K                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ]   Å   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ@@@ÿ’’’ÿØØØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØØØÿ’’’ÿ@@@ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Å   ]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         e   Ñ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ&&&ÿyyyÿÍÍÍÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÍÍÍÿyyyÿ&&&ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ñ   e                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         \   Ï   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿFFFÿ¤¤¤ÿïïïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïÿ¤¤¤ÿFFFÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ï   \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Q   Ç   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿfffÿÈÈÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÈÈÿfffÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ç   Q                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          ;   ³   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ|||ÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿ|||ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ³   ;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              ’   ö   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ€€€ÿäääÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿ€€€ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ö   ’                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 b   Þ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ}}}ÿãããÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãããÿ}}}ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Þ   b                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  1   ¸   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿmmmÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞÞÞÿmmmÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ¸   1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      u   ï   ÿ   ÿ   ÿ   ÿ   ÿ   ÿQQQÿÎÎÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÎÎÿQQQÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ï   t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          .   º   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿ©©©ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ©©©ÿ...ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   º   .                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              i   ë   ÿ   ÿ   ÿ   ÿ   ÿÿ~~~ÿïïïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïÿ~~~ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ë   i                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     ¦   ÿ   ÿ   ÿ   ÿ   ÿ   ÿBBBÿÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÿBBBÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ¦                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          <   Õ   ÿ   ÿ   ÿ   ÿ   ÿÿ‹‹‹ÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ‹‹‹ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Õ   <                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              l   ò   ÿ   ÿ   ÿ   ÿ   ÿ<<<ÿËËËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËËËÿ<<<ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ò   l                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     ›   ÿ   ÿ   ÿ   ÿ   ÿÿzzzÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿzzzÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ›                                                                                                                                                                                                                                                                                                                                                                                                                                                                              ¾   ÿ   ÿ   ÿ   ÿ   ÿÿ±±±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±±±ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ¾                                                                                                                                                                                                                                                                                                                                                                                                                                                                   8   ×   ÿ   ÿ   ÿ   ÿ   ÿFFFÿÚÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿFFFÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ×   8                                                                                                                                                                                                                                                                                                                                                                                                                                                       S   ì   ÿ   ÿ   ÿ   ÿÿuuuÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿuuuÿÿ   ÿ   ÿ   ÿ   ÿ   ì   S                                                                                                                                                                                                                                                                                                                                                                                                                                               f   ÷   ÿ   ÿ   ÿ   ÿÿœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÿÿ   ÿ   ÿ   ÿ   ÿ   ÷   f                                                                                                                                                                                                                                                                                                                                                                                                                                       w   ü   ÿ   ÿ   ÿ   ÿÿ¼¼¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼ÿÿ   ÿ   ÿ   ÿ   ÿ   ü   w                                                                                                                                                                                                                                                                                                                                                                                                                              ˆ   ÿ   ÿ   ÿ   ÿ   ÿ666ÿ×××ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×××ÿ666ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ˆ                                                                                                                                                                                                                                                                                                                                                                                                                     �   ÿ   ÿ   ÿ   ÿ   ÿGGGÿèèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿGGGÿ   ÿ   ÿ   ÿ   ÿ   ÿ   �                                                                                                                                                                                                                                                                                                                                                                                                             �   ÿ   ÿ   ÿ   ÿ   ÿYYYÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿYYYÿ   ÿ   ÿ   ÿ   ÿ   ÿ   �                                                                                                                                                                                                                                                                                                                                                                                                     ‘   ÿ   ÿ   ÿ   ÿ   ÿhhhÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿhhhÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ‘                                                                                                                                                                                                                                                                                                                                                                                             �   ÿ   ÿ   ÿ   ÿ   ÿoooÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿoooÿ   ÿ   ÿ   ÿ   ÿ   ÿ   �                                                                                                                                                                                                                                                                                                                                                                                      }   ÿ   ÿ   ÿ   ÿ   ÿqqqÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿqqqÿ   ÿ   ÿ   ÿ   ÿ   ÿ   }                                                                                                                                                                                                                                                                                                                                                                               o   ý   ÿ   ÿ   ÿ   ÿpppÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿpppÿ   ÿ   ÿ   ÿ   ÿ   ý   o                                                                                                                                                                                                                                                                                                                                                                       \   ú   ÿ   ÿ   ÿ   ÿlllÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿlllÿ   ÿ   ÿ   ÿ   ÿ   ú   \                                                                                                                                                                                                                                                                                                                                                               C   ò   ÿ   ÿ   ÿ   ÿ^^^ÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿ^^^ÿ   ÿ   ÿ   ÿ   ÿ   ò   C                                                                                                                                                                                                                                                                                                                                                       (   á   ÿ   ÿ   ÿ   ÿOOOÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿOOOÿ   ÿ   ÿ   ÿ   ÿ   á   (                                                                                                                                                                                                                                                                                                                                                  Ì   ÿ   ÿ   ÿ   ÿ<<<ÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿÇÇÇÿšššÿvvvÿZZZÿMMMÿGGGÿJJJÿTTTÿjjjÿŒŒŒÿµµµÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿÎÎÎÿ¡¡¡ÿ}}}ÿ^^^ÿNNNÿGGGÿHHHÿRRRÿdddÿ………ÿ­­­ÿÚÚÚÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíííÿ<<<ÿ   ÿ   ÿ   ÿ   ÿ   Ì                                                                                                                                                                                                                                                                                                                                             ­   ÿ   ÿ   ÿ   ÿ(((ÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïÿ¨¨¨ÿYYYÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ@@@ÿ‡‡‡ÿØØØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ¶¶¶ÿfffÿ)))ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ555ÿyyyÿÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáááÿ(((ÿ   ÿ   ÿ   ÿ   ÿ   ­                                                                                                                                                                                                                                                                                                                                      €   ÿ   ÿ   ÿ   ÿÿÈÈÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçççÿƒƒƒÿ%%%ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿZZZÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿ˜˜˜ÿ333ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿHHHÿ´´´ÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÈÈÿÿ   ÿ   ÿ   ÿ   ÿ   €                                                                                                                                                                                                                                                                                                                               N   ù   ÿ   ÿ   ÿÿ®®®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ‘‘‘ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ]]]ÿÙÙÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§§ÿ---ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿIIIÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®ÿÿ   ÿ   ÿ   ÿ   ù   N                                                                                                                                                                                                                                                                                                                       (   å   ÿ   ÿ   ÿ   ÿ‡‡‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍÍÍÿ>>>ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ™™™ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßßßÿXXXÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ|||ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡‡‡ÿ   ÿ   ÿ   ÿ   ÿ   å   (                                                                                                                                                                                                                                                                                                               
   ¿   ÿ   ÿ   ÿ   ÿXXXÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿaaaÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾¾¾ÿ###ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿFFFÿàààÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿXXXÿ   ÿ   ÿ   ÿ   ÿ   ¿   
                                                                                                                                                                                                                                                                                                           ƒ   ÿ   ÿ   ÿ   ÿ---ÿèèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†††ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿCCCÿæææÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ+++ÿÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿ---ÿ   ÿ   ÿ   ÿ   ÿ   ƒ                                                                                                                                                                                                                                                                                                       C   ø   ÿ   ÿ   ÿÿÈÈÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ:::ÿæææÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢¢¢ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÏÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÈÈÿÿ   ÿ   ÿ   ÿ   ø   C                                                                                                                                                                                                                                                                                                  Ô   ÿ   ÿ   ÿ   ÿ•••ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿAAAÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²²²ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ%%%ÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•••ÿ   ÿ   ÿ   ÿ   ÿ   Ô                                                                                                                                                                                                                                                                                              –   ÿ   ÿ   ÿ   ÿTTTÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ···ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿcccÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÖÖÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿBBBÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿTTTÿ   ÿ   ÿ   ÿ   ÿ   –                                                                                                                                                                                                                                                                                       K   û   ÿ   ÿ   ÿÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáááÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ���ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ>>>ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿuuuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáááÿÿ   ÿ   ÿ   ÿ   û   K                                                                                                                                                                                                                                                                                  ×   ÿ   ÿ   ÿÿ«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ\\\ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿßßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡‡‡ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ½½½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«««ÿÿ   ÿ   ÿ   ÿ   ×                                                                                                                                                                                                                                                                              ‡   ÿ   ÿ   ÿ   ÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»»»ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿcccÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ;;;ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿ   ÿ   ÿ   ÿ   ÿ   ‡                                                                                                                                                                                                                                                                       4   ó   ÿ   ÿ   ÿ   ÿåååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿBBBÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ			ÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿ   ÿ   ÿ   ÿ   ÿ   ó   4                                                                                                                                                                                                                                                                  »   ÿ   ÿ   ÿÿ£££ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ]]]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ888ÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£££ÿÿ   ÿ   ÿ   ÿ   »                                                                                                                                                                                                                                                              _   ÿ   ÿ   ÿ   ÿLLLÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿVVVÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÁÁÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿLLLÿ   ÿ   ÿ   ÿ   ÿ   _                                                                                                                                                                                                                                                          Ù   ÿ   ÿ   ÿÿÎÎÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãããÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ111ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿhhhÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÎÎÿÿ   ÿ   ÿ   ÿ   Ù                                                                                                                                                                                                                                                      |   ÿ   ÿ   ÿ   ÿyyyÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿIIIÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ%%%ÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyyyÿ   ÿ   ÿ   ÿ   ÿ   |                                                                                                                                                                                                                                                  ê   ÿ   ÿ   ÿ$$$ÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ___ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿçççÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìììÿ$$$ÿ   ÿ   ÿ   ÿ   ê                                                                                                                                                                                                                                              Œ   ÿ   ÿ   ÿ   ÿšššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿ111ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWWWÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšššÿ   ÿ   ÿ   ÿ   ÿ   Œ                                                                                                                                                                                                                                       '   ð   ÿ   ÿ   ÿ555ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ˜˜˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ000ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿgggÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ444ÿ   ÿ   ÿ   ÿ   ð   '                                                                                                                                                                                                                                   ™   ÿ   ÿ   ÿÿ­­­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿvvvÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿKKKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­­­ÿÿ   ÿ   ÿ   ÿ   ™                                                                                                                                                                                                                               )   ñ   ÿ   ÿ   ÿ===ÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºººÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ```ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÜÜÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ666ÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ===ÿ   ÿ   ÿ   ÿ   ñ   )                                                                                                                                                                                                                           “   ÿ   ÿ   ÿÿ³³³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿRRRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ***ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³³³ÿÿ   ÿ   ÿ   ÿ   “                                                                                                                                                                                                                           ë   ÿ   ÿ   ÿBBBÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«««ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿNNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑÑÑÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ)))ÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿBBBÿ   ÿ   ÿ   ÿ   ì                                                                                                                                                                                                                       �   ÿ   ÿ   ÿÿ±±±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³³³ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿWWWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÖÖÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±±±ÿÿ   ÿ   ÿ   ÿ   �                                                                                                                                                                                                                  Ý   ÿ   ÿ   ÿ666ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂÂÂÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿjjjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâââÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿ666ÿ   ÿ   ÿ   ÿ   Ý                                                                                                                                                                                                              f   ÿ   ÿ   ÿ   ÿŸŸŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØØØÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ………ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿ###ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿWWWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸŸŸÿ   ÿ   ÿ   ÿ   ÿ   f                                                                                                                                                                                                          É   ÿ   ÿ   ÿ###ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿ!!!ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ@@@ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ{{{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿ###ÿ   ÿ   ÿ   ÿ   É                                                                                                                                                                                                      A   ý   ÿ   ÿ   ÿ~~~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿEEEÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÓÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqqqÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~~~ÿ   ÿ   ÿ   ÿ   ý   A                                                                                                                                                                                                       ÿ   ÿ   ÿÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|||ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ+++ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬¬¬ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿßßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿÿ   ÿ   ÿ   ÿ                                                                                                                                                                                                      ë   ÿ   ÿ   ÿZZZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÃÃÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿkkkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿAAAÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZZZÿ   ÿ   ÿ   ÿ   ë                                                                                                                                                                                              f   ÿ   ÿ   ÿÿ¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ...ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUUUÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ“““ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹¹¹ÿÿ   ÿ   ÿ   ÿ   f                                                                                                                                                                                          ¼   ÿ   ÿ   ÿ+++ÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡‡‡ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿãããÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿ+++ÿ   ÿ   ÿ   ÿ   ¼                                                                                                                                                                                      +   ô   ÿ   ÿ   ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ“““ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ111ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿkkkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ   ÿ   ÿ   ÿ   ô   +                                                                                                                                                                                   {   ÿ   ÿ   ÿÿÏÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{{{ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ(((ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢¢¢ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿØØØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÏÏÿÿ   ÿ   ÿ   ÿ   {                                                                                                                                                                                  Å   ÿ   ÿ   ÿ;;;ÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿªªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ???ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿ;;;ÿ   ÿ   ÿ   ÿ   Å                                                                                                                                                                              -   ö   ÿ   ÿ   ÿ‰‰‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ½½½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËËËÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ,,,ÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰‰‰ÿ   ÿ   ÿ   ÿ   ö   -                                                                                                                                                                           v   ÿ   ÿ   ÿÿÏÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿcccÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ¾¾¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÁÁÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÏÏÿÿ   ÿ   ÿ   ÿ   v                                                                                                                                                                          ¹   ÿ   ÿ   ÿ888ÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿ:::ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÄÄÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿXXXÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿ888ÿ   ÿ   ÿ   ÿ   ¹                                                                                                                                                                         î   ÿ   ÿ   ÿ~~~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿ('(ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÆÆÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿDDDÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿuuuÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~~~ÿ   ÿ   ÿ   ÿ   î                                                                                                                                                                      W   ÿ   ÿ   ÿÿÄÄÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔÔÔÿ)))ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÆÆÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿFFFÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿrrrÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÄÄÿÿ   ÿ   ÿ   ÿ   W                                                                                                                                                                   •   ÿ   ÿ   ÿ&&&ÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÿ<<<ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÉÉÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïÿVVVÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ………ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿ&&&ÿ   ÿ   ÿ   ÿ   •                                                                                                                                                                  Ð   ÿ   ÿ   ÿ\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿeeeÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÍÍÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ€€€ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿªªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\ÿ   ÿ   ÿ   ÿ   Ð                                                                                                                                                              )   õ   ÿ   ÿ   ÿžžžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨ÿ'''ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ


ÿgggÿ)))ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÿ:::ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿZZZÿÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžžžÿ   ÿ   ÿ   ÿ   õ   )                                                                                                                                                           [   ÿ   ÿ   ÿ			ÿÕÕÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿ‚‚‚ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿTTTÿÊÊÊÿÿÿÿÿÕÕÕÿ%%%ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÎÎÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿ———ÿ)))ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ@@@ÿ···ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÕÕÿ			ÿ   ÿ   ÿ   ÿ   [                                                                                                                                                           –   ÿ   ÿ   ÿ)))ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿ‹‹‹ÿ666ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿeeeÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÒÒÿ###ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ"""ÿÒÒÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿœœœÿBBBÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿXXXÿ¶¶¶ÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ)))ÿ   ÿ   ÿ   ÿ   –                                                                                                                                                          É   ÿ   ÿ   ÿ[[[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÉÉÉÿ‰‰‰ÿQQQÿ)))ÿÿÿ   ÿ   ÿ   ÿ   ÿÿÿ???ÿrrrÿ±±±ÿêêêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÐÐÿ!!!ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ%%%ÿÓÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓÿ•••ÿZZZÿ///ÿÿÿ   ÿ   ÿ   ÿ   ÿ


ÿÿ999ÿhhhÿ¥¥¥ÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[[[ÿ   ÿ   ÿ   ÿ   É                                                                                                                                                         ì   ÿ   ÿ   ÿ���ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿàààÿÌÌÌÿ½½½ÿ¸¸¸ÿ»»»ÿÅÅÅÿØØØÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍÍÍÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ$$$ÿÔÔÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿäääÿÏÏÏÿ¿¿¿ÿ¸¸¸ÿºººÿÃÃÃÿÔÔÔÿéééÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ì                                                                                                                                                      @   þ   ÿ   ÿÿÁÁÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ&&&ÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÿÿ   ÿ   ÿ   þ   @                                                                                                                                                   l   ÿ   ÿ   ÿÿåååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ***ÿÙÙÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿÿ   ÿ   ÿ   ÿ   l                                                                                                                                                   ž   ÿ   ÿ   ÿ777ÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÈÈÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ***ÿÙÙÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿ777ÿ   ÿ   ÿ   ÿ   ž                                                                                                                                                  Æ   ÿ   ÿ   ÿbbbÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅÅÅÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ,,,ÿÚÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿbbbÿ   ÿ   ÿ   ÿ   Æ                                                                                                                                                 â   ÿ   ÿ   ÿŠŠŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÄÄÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠŠŠÿ   ÿ   ÿ   ÿ   â                                                                                                                                              +   ö   ÿ   ÿ   ÿ±±±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ000ÿÝÝÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±±±ÿ   ÿ   ÿ   ÿ   ö   +                                                                                                                                           F   ÿ   ÿ   ÿÿÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ111ÿßßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÐÐÿÿ   ÿ   ÿ   ÿ   F                                                                                                                                           i   ÿ   ÿ   ÿÿçççÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾¾¾ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ222ÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçççÿÿ   ÿ   ÿ   ÿ   i                                                                                                                                           ‰   ÿ   ÿ   ÿ...ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ555ÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿ...ÿ   ÿ   ÿ   ÿ   ‰                                                                                                                                           ¤   ÿ   ÿ   ÿKKKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºººÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ555ÿäääÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿKKKÿ   ÿ   ÿ   ÿ   ¤                                                                                                                                           ½   ÿ   ÿ   ÿdddÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸¸¸ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ888ÿåååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿdddÿ   ÿ   ÿ   ÿ   ½                                                                                                                                          Ð   ÿ   ÿ   ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶¶¶ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ;;;ÿçççÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ   ÿ   ÿ   ÿ   Ð                                                                                                                                         à   ÿ   ÿ   ÿ”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´´´ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ===ÿçççÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””ÿ   ÿ   ÿ   ÿ   à                                                                                                                                         í   ÿ   ÿ   ÿ©©©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²²²ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ???ÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©©©ÿ   ÿ   ÿ   ÿ   í                                                                                                                                      *   ô   ÿ   ÿ   ÿ»»»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯¯¯ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿBBBÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»»»ÿ   ÿ   ÿ   ÿ   ô   *                                                                                                                                   6   û   ÿ   ÿÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­­­ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿDDDÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇÿÿ   ÿ   ÿ   û   6                                                                                                                                   A   ÿ   ÿ   ÿÿÓÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«««ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿEEEÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓÿÿ   ÿ   ÿ   ÿ   A                                                                                                                                   K   ÿ   ÿ   ÿÿÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨ÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿHHHÿïïïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÜÜÿÿ   ÿ   ÿ   ÿ   K                                                                                                                                   T   ÿ   ÿ   ÿÿãããÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿKKKÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãããÿÿ   ÿ   ÿ   ÿ   T                                                                                                                                   \   ÿ   ÿ   ÿÿèèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£££ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿLLLÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿÿ   ÿ   ÿ   ÿ   \                                                                                                                                   a   ÿ   ÿ   ÿÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿNNNÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿÿ   ÿ   ÿ   ÿ   a                                                                                                                                   c   ÿ   ÿ   ÿÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸŸŸÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿQQQÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíííÿÿ   ÿ   ÿ   ÿ   c                                                                                                                                   f   ÿ   ÿ   ÿÿîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿTTTÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿÿ   ÿ   ÿ   ÿ   f                                                                                                                                   c   ÿ   ÿ   ÿÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™™™ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿUUUÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìììÿÿ   ÿ   ÿ   ÿ   c                                                                                                                                   a   ÿ   ÿ   ÿÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ———ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿWWWÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿÿ   ÿ   ÿ   ÿ   a                                                                                                                                   \   ÿ   ÿ   ÿÿèèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿZZZÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿÿ   ÿ   ÿ   ÿ   \                                                                                                                                   S   ÿ   ÿ   ÿÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘‘‘ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ[[[ÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâââÿÿ   ÿ   ÿ   ÿ   S                                                                                                                                   J   ÿ   ÿ   ÿÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ\\\ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿÿ   ÿ   ÿ   ÿ   J                                                                                                                                   @   ÿ   ÿ   ÿÿÑÑÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽŽŽÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ```ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑÑÑÿÿ   ÿ   ÿ   ÿ   @                                                                                                                                   4   ú   ÿ   ÿÿÆÆÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿbbbÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÆÆÿÿ   ÿ   ÿ   ú   4                                                                                                                                   (   ô   ÿ   ÿ   ÿ¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰‰‰ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿdddÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹¹¹ÿ   ÿ   ÿ   ÿ   ô   (                                                                                                                                      ì   ÿ   ÿ   ÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†††ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿhhhÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿ   ÿ   ÿ   ÿ   ì                                                                                                                                         Þ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ………ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿjjjÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’’’ÿ   ÿ   ÿ   ÿ   Þ                                                                                                                                         Î   ÿ   ÿ   ÿ~~~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚‚‚ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿmmmÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~~~ÿ   ÿ   ÿ   ÿ   Î                                                                                                                                          »   ÿ   ÿ   ÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿoooÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿ   ÿ   ÿ   ÿ   »                                                                                                                                           ¡   ÿ   ÿ   ÿHHHÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~~~ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿrrrÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿHHHÿ   ÿ   ÿ   ÿ   ¡                                                                                                                                           …   ÿ   ÿ   ÿ***ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿzzzÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿsssÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ***ÿ   ÿ   ÿ   ÿ   …                                                                                                                                           e   ÿ   ÿ   ÿÿåååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿxxxÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿvvvÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿÿ   ÿ   ÿ   ÿ   e                                                                                                                                           C   ÿ   ÿ   ÿÿÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿvvvÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿzzzÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÿÿ   ÿ   ÿ   ÿ   C                                                                                                                                           '   ô   ÿ   ÿ   ÿ¬¬¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿsssÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ|||ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬¬¬ÿ   ÿ   ÿ   ÿ   ô   '                                                                                                                                              ß   ÿ   ÿ   ÿ†††ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿpppÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ|||ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†††ÿ   ÿ   ÿ   ÿ   ß                                                                                                                                                 Á   ÿ   ÿ   ÿ]]]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿmmmÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ���ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]]]ÿ   ÿ   ÿ   ÿ   Á                                                                                                                                                  —   ÿ   ÿ   ÿ222ÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿlllÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ„„„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ222ÿ   ÿ   ÿ   ÿ   —                                                                                                                                                   f   ÿ   ÿ   ÿÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿhhhÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ………ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáááÿÿ   ÿ   ÿ   ÿ   f                                                                                                                                                   ;   ý   ÿ   ÿÿ¼¼¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿàààÿÌÌÌÿ½½½ÿ¸¸¸ÿ»»»ÿÅÅÅÿØØØÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿeeeÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ‡‡‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿäääÿÏÏÏÿ¿¿¿ÿ¸¸¸ÿºººÿÃÃÃÿÔÔÔÿéééÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼ÿÿ   ÿ   ÿ   ý   ;                                                                                                                                                      é   ÿ   ÿ   ÿ‰‰‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÈÈÈÿ‰‰‰ÿQQQÿ)))ÿÿÿ   ÿ   ÿ   ÿ   ÿÿÿ???ÿrrrÿ°°°ÿêêêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿdddÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓÿ•••ÿZZZÿ///ÿÿÿ   ÿ   ÿ   ÿ   ÿ


ÿÿ999ÿhhhÿ¥¥¥ÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰‰‰ÿ   ÿ   ÿ   ÿ   é                                                                                                                                                         Ã   ÿ   ÿ   ÿTTTÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿ‹‹‹ÿ666ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿeeeÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ```ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿŒŒŒÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿœœœÿBBBÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿXXXÿ¶¶¶ÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTTTÿ   ÿ   ÿ   ÿ   Ã                                                                                                                                                          �   ÿ   ÿ   ÿ$$$ÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿ‚‚‚ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿTTTÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ\\\ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ���ÿñññÿ———ÿ)))ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ???ÿ···ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿ$$$ÿ   ÿ   ÿ   ÿ   �                                                                                                                                                           T   ÿ   ÿ   ÿÿÎÎÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨ÿ'''ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ


ÿrrrÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ]]]ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ)))ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿYYYÿÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÎÎÿÿ   ÿ   ÿ   ÿ   T                                                                                                                                                           #   ò   ÿ   ÿ   ÿ•••ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿeeeÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ000ÿÃÃÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ[[[ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿªªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•••ÿ   ÿ   ÿ   ÿ   ò   #                                                                                                                                                              Ê   ÿ   ÿ   ÿUUUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÿ<<<ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ£££ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿWWWÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ………ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUUUÿ   ÿ   ÿ   ÿ   Ê                                                                                                                                                                  Ž   ÿ   ÿ   ÿ   ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔÔÔÿ)))ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ•••ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿUUUÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿrrrÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿ   ÿ   ÿ   ÿ   ÿ   Ž                                                                                                                                                                   N   ÿ   ÿ   ÿÿ»»»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿ('(ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿš™™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿUUUÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿuuuÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»»»ÿÿ   ÿ   ÿ   ÿ   N                                                                                                                                                                      é   ÿ   ÿ   ÿuuuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿ:::ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ			ÿ´´´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿQQQÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿuuuÿ   ÿ   ÿ   ÿ   é                                                                                                                                                                          ²   ÿ   ÿ   ÿ222ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿcccÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿSSSÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÁÁÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿ222ÿ   ÿ   ÿ   ÿ   ²                                                                                                                                                                           l   ÿ   ÿ   ÿÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿOOOÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ,,,ÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇÿÿ   ÿ   ÿ   ÿ   l                                                                                                                                                                           %   ñ   ÿ   ÿ   ÿ~~~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ¥¥¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿAAAÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~~~ÿ   ÿ   ÿ   ÿ   ñ   %                                                                                                                                                                              ½   ÿ   ÿ   ÿ333ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{{{ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ(((ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢¢¢ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿØØØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿ333ÿ   ÿ   ÿ   ÿ   ½                                                                                                                                                                                  p   ÿ   ÿ   ÿÿÆÆÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ“““ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ111ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿkkkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÆÆÿÿ   ÿ   ÿ   ÿ   p                                                                                                                                                                                   "   ï   ÿ   ÿ   ÿtttÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡‡‡ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿãããÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtttÿ   ÿ   ÿ   ÿ   ï   "                                                                                                                                                                                       ³   ÿ   ÿ   ÿ###ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ...ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUUUÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ“““ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿ###ÿ   ÿ   ÿ   ÿ   ³                                                                                                                                                                                           [   ÿ   ÿ   ÿ   ÿ¯¯¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÃÃÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿkkkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿAAAÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯¯¯ÿ   ÿ   ÿ   ÿ   ÿ   [                                                                                                                                                                                              ã   ÿ   ÿ   ÿMMMÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|||ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ+++ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬¬¬ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿßßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿMMMÿ   ÿ   ÿ   ÿ   ã                                                                                                                                                                                                  ”   ÿ   ÿ   ÿ


ÿÒÒÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿEEEÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÓÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqqqÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÒÒÿ


ÿ   ÿ   ÿ   ÿ   ”                                                                                                                                                                                                   8   ú   ÿ   ÿ   ÿrrrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿ!!!ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ@@@ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ{{{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrrrÿ   ÿ   ÿ   ÿ   ú   8                                                                                                                                                                                                      ½   ÿ   ÿ   ÿÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØØØÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ………ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿ###ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿWWWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿÿ   ÿ   ÿ   ÿ   ½                                                                                                                                                                                                          X   ÿ   ÿ   ÿ   ÿ���ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂÂÂÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿjjjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâââÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   X                                                                                                                                                                                                              Õ   ÿ   ÿ   ÿ,,,ÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³³³ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿXXXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÖÖÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿ,,,ÿ   ÿ   ÿ   ÿ   Õ                                                                                                                                                                                                                  t   ÿ   ÿ   ÿ   ÿ¤¤¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«««ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿNNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑÑÑÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ)))ÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤ÿ   ÿ   ÿ   ÿ   ÿ   t                                                                                                                                                                                                                      ã   ÿ   ÿ   ÿ555ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿRRRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ***ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ555ÿ   ÿ   ÿ   ÿ   ã                                                                                                                                                                                                                          †   ÿ   ÿ   ÿ   ÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºººÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ```ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÜÜÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ666ÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿ   ÿ   ÿ   ÿ   ÿ   †                                                                                                                                                                                                                              ë   ÿ   ÿ   ÿ222ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿvvvÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿKKKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿ222ÿ   ÿ   ÿ   ÿ   ë                                                                                                                                                                                                                                  ‰   ÿ   ÿ   ÿ   ÿœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ˜˜˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ000ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿgggÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÿ   ÿ   ÿ   ÿ   ÿ   ‰                                                                                                                                                                                                                                      è   ÿ   ÿ   ÿ(((ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿ111ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWWWÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿ(((ÿ   ÿ   ÿ   ÿ   è                                                                                                                                                                                                                                          }   ÿ   ÿ   ÿ   ÿ‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ___ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿçççÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÆÆÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹ÿ   ÿ   ÿ   ÿ   ÿ   }                                                                                                                                                                                                                                              à   ÿ   ÿ   ÿÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿIIIÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ%%%ÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâââÿÿ   ÿ   ÿ   ÿ   à                                                                                                                                                                                                                                                  j   ÿ   ÿ   ÿ   ÿgggÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãããÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ111ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿhhhÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgggÿ   ÿ   ÿ   ÿ   ÿ   j                                                                                                                                                                                                                                                      Î   ÿ   ÿ   ÿÿÁÁÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿVVVÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÿÿ   ÿ   ÿ   ÿ   Î                                                                                                                                                                                                                                                          O   ü   ÿ   ÿ   ÿ===ÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ]]]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ888ÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ===ÿ   ÿ   ÿ   ÿ   ü   O                                                                                                                                                                                                                                                              ª   ÿ   ÿ   ÿ   ÿ‘‘‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿBBBÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ			ÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘‘‘ÿ   ÿ   ÿ   ÿ   ÿ   ª                                                                                                                                                                                                                                                                  &   ì   ÿ   ÿ   ÿÿÚÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»»»ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿcccÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ;;;ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿÿ   ÿ   ÿ   ÿ   ì   &                                                                                                                                                                                                                                                                       v   ÿ   ÿ   ÿ   ÿPPPÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ\\\ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿßßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡‡‡ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ½½½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿPPPÿ   ÿ   ÿ   ÿ   ÿ   v                                                                                                                                                                                                                                                                           
   È   ÿ   ÿ   ÿ   ÿ———ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáááÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ���ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ>>>ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿuuuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ———ÿ   ÿ   ÿ   ÿ   ÿ   È   
                                                                                                                                                                                                                                                                               :   õ   ÿ   ÿ   ÿÿÔÔÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ···ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿcccÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÖÖÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿBBBÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔÔÔÿÿ   ÿ   ÿ   ÿ   õ   :                                                                                                                                                                                                                                                                                       „   ÿ   ÿ   ÿ   ÿDDDÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿAAAÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²²²ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ%%%ÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿDDDÿ   ÿ   ÿ   ÿ   ÿ   „                                                                                                                                                                                                                                                                                              Ä   ÿ   ÿ   ÿ   ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ:::ÿæææÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢¢¢ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÏÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ   ÿ   ÿ   ÿ   ÿ   Ä                                                                                                                                                                                                                                                                                                  3   ð   ÿ   ÿ   ÿÿµµµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†††ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿCCCÿæææÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ+++ÿÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿÿ   ÿ   ÿ   ÿ   ð   3                                                                                                                                                                                                                                                                                                       p   ÿ   ÿ   ÿ   ÿÿÝÝÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿaaaÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾¾¾ÿ###ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿFFFÿàààÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÿÿ   ÿ   ÿ   ÿ   ÿ   p                                                                                                                                                                                                                                                                                                              ­   ÿ   ÿ   ÿ   ÿFFFÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍÍÍÿ>>>ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ™™™ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßßßÿXXXÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ|||ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿFFFÿ   ÿ   ÿ   ÿ   ÿ   ­                                                                                                                                                                                                                                                                                                                     ×   ÿ   ÿ   ÿ   ÿpppÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ‘‘‘ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ]]]ÿÙÙÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§§ÿ---ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿIIIÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpppÿ   ÿ   ÿ   ÿ   ÿ   ×                                                                                                                                                                                                                                                                                                                          ;   ó   ÿ   ÿ   ÿÿ˜˜˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçççÿƒƒƒÿ%%%ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿZZZÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿ™™™ÿ333ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿHHHÿ´´´ÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜˜˜ÿÿ   ÿ   ÿ   ÿ   ó   ;                                                                                                                                                                                                                                                                                                                               l   ÿ   ÿ   ÿ   ÿÿ···ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïÿ¨¨¨ÿYYYÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ@@@ÿ‡‡‡ÿØØØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ¶¶¶ÿfffÿ)))ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ555ÿyyyÿÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ···ÿÿ   ÿ   ÿ   ÿ   ÿ   l                                                                                                                                                                                                                                                                                                                                      —   ÿ   ÿ   ÿ   ÿÿÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿÇÇÇÿšššÿvvvÿZZZÿMMMÿGGGÿJJJÿTTTÿjjjÿŒŒŒÿµµµÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿÎÎÎÿ¡¡¡ÿ}}}ÿ^^^ÿOOOÿGGGÿHHHÿRRRÿeeeÿ………ÿ­­­ÿÚÚÚÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÐÐÿÿ   ÿ   ÿ   ÿ   ÿ   —                                                                                                                                                                                                                                                                                                                                             ¹   ÿ   ÿ   ÿ   ÿ***ÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáááÿ***ÿ   ÿ   ÿ   ÿ   ÿ   ¹                                                                                                                                                                                                                                                                                                                                                     Ô   ÿ   ÿ   ÿ   ÿ<<<ÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿ<<<ÿ   ÿ   ÿ   ÿ   ÿ   Ô                                                                                                                                                                                                                                                                                                                                                          1   ç   ÿ   ÿ   ÿ   ÿHHHÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿHHHÿ   ÿ   ÿ   ÿ   ÿ   ç   1                                                                                                                                                                                                                                                                                                                                                               E   ñ   ÿ   ÿ   ÿ   ÿSSSÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿSSSÿ   ÿ   ÿ   ÿ   ÿ   ñ   E                                                                                                                                                                                                                                                                                                                                                                       X   ø   ÿ   ÿ   ÿ   ÿZZZÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿZZZÿ   ÿ   ÿ   ÿ   ÿ   ø   X                                                                                                                                                                                                                                                                                                                                                                               g   ü   ÿ   ÿ   ÿ   ÿ\\\ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿ\\\ÿ   ÿ   ÿ   ÿ   ÿ   ü   g                                                                                                                                                                                                                                                                                                                                                                                       s   þ   ÿ   ÿ   ÿ   ÿVVVÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿVVVÿ   ÿ   ÿ   ÿ   ÿ   þ   s                                                                                                                                                                                                                                                                                                                                                                                               x   ÿ   ÿ   ÿ   ÿ   ÿNNNÿîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿNNNÿ   ÿ   ÿ   ÿ   ÿ   ÿ   x                                                                                                                                                                                                                                                                                                                                                                                                       z   þ   ÿ   ÿ   ÿ   ÿCCCÿæææÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæææÿCCCÿ   ÿ   ÿ   ÿ   ÿ   þ   z                                                                                                                                                                                                                                                                                                                                                                                                               u   ý   ÿ   ÿ   ÿ   ÿ333ÿ×××ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×××ÿ333ÿ   ÿ   ÿ   ÿ   ÿ   ý   u                                                                                                                                                                                                                                                                                                                                                                                                                       m   ú   ÿ   ÿ   ÿ   ÿ!!!ÿÂÂÂÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂÂÂÿ!!!ÿ   ÿ   ÿ   ÿ   ÿ   ú   m                                                                                                                                                                                                                                                                                                                                                                                                                               _   õ   ÿ   ÿ   ÿ   ÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿ   ÿ   ÿ   ÿ   ÿ   õ   _                                                                                                                                                                                                                                                                                                                                                                                                                                       O   ì   ÿ   ÿ   ÿ   ÿÿƒƒƒÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿƒƒƒÿÿ   ÿ   ÿ   ÿ   ÿ   ì   O                                                                                                                                                                                                                                                                                                                                                                                                                                               ;   Ü   ÿ   ÿ   ÿ   ÿ   ÿYYYÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿYYYÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ü   ;                                                                                                                                                                                                                                                                                                                                                                                                                                                       $   Ä   ÿ   ÿ   ÿ   ÿ   ÿ///ÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇÿ///ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ä   $                                                                                                                                                                                                                                                                                                                                                                                                                                                                  §   ÿ   ÿ   ÿ   ÿ   ÿÿ™™™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™™™ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   §                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ú   ÿ   ÿ   ÿ   ÿ   ÿ^^^ÿåååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿ^^^ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ú                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         P   ä   ÿ   ÿ   ÿ   ÿ   ÿ%%%ÿ³³³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³³³ÿ%%%ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ä   P                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               *   Á   ÿ   ÿ   ÿ   ÿ   ÿÿrrrÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìììÿrrrÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Á   *                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          Š   ú   ÿ   ÿ   ÿ   ÿ   ÿ---ÿ²²²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²²²ÿ---ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ú   Š                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      M   Ù   ÿ   ÿ   ÿ   ÿ   ÿÿ```ÿÝÝÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÿ```ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ù   M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  £   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ���ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ���ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   £                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              Z   Þ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ:::ÿµµµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿ:::ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Þ   Z                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          ›   ú   ÿ   ÿ   ÿ   ÿ   ÿÿPPPÿÆÆÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÆÆÿPPPÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ú   ›                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      G   Ë   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ```ÿÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÐÐÿ```ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ë   G                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  x   é   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿeeeÿÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÐÐÿeeeÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   é   x                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              $   –   õ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ\\\ÿÄÄÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÄÄÿ\\\ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   õ   –   $                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           6   ­   ü   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿGGGÿ­­­ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿ­­­ÿGGGÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ü   ­   6                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           D   º   þ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿŒŒŒÿßßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßßßÿŒŒŒÿ...ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   þ   º   D                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          J   ·   ü   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ[[[ÿ±±±ÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿ±±±ÿ[[[ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ü   ·   J                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          @   ©   õ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ'''ÿqqqÿ¾¾¾ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿ¾¾¾ÿqqqÿ'''ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   õ   ©   @                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           2   ’   è   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ,,,ÿsssÿ¼¼¼ÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿ¼¼¼ÿsssÿ,,,ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   è   ’   2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              q   Ì   þ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ$$$ÿ___ÿ¡¡¡ÿÙÙÙÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÙÙÙÿ¡¡¡ÿ___ÿ$$$ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   þ   Ì   q                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 C   œ   å   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ333ÿjjjÿ¥¥¥ÿÔÔÔÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿÔÔÔÿ¥¥¥ÿjjjÿ333ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   å   œ   C                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     _   ²   í   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ			ÿ(((ÿUUUÿƒƒƒÿ°°°ÿÔÔÔÿíííÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿíííÿÔÔÔÿ°°°ÿƒƒƒÿUUUÿ(((ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   í   ²   _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          !   f   ±   é   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ???ÿ```ÿƒƒƒÿ   ÿ»»»ÿÐÐÐÿãããÿðððÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿðððÿãããÿÐÐÐÿ»»»ÿ   ÿƒƒƒÿ```ÿ???ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   é   ±   f   !                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  S   —   Ó   ø   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ"""ÿ///ÿ@@@ÿMMMÿYYYÿ```ÿiiiÿsssÿvvvÿzzzÿzzzÿvvvÿsssÿiiiÿ```ÿYYYÿMMMÿ@@@ÿ///ÿ"""ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ø   Ó   —   S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          	   0   g   ¥   Ø   ö   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ö   Ø   ¥   g   0   	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      +   Y   Ž   ¾   á   ÷   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÷   á   ¾   Ž   Y   +                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             -   O   x   �   ¼   Ö   ê   ÷   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÷   ê   Ö   ¼   �   x   O   -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
      -   C   X   n   ‚   ‘       ­   ¶   ¾   Ä   Æ   È   È   Æ   Ä   ¾   ¶   ­       ‘   ‚   n   X   C   -      
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü  ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü    ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø        ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà        ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü              ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü                ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿø                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿð                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                  ÿÿÿÿÿÿÿÿÿÿÿÿÿþ                  ÿÿÿÿÿÿÿÿÿÿÿÿü                  ?ÿÿÿÿÿÿÿÿÿÿÿÿø                  ÿÿÿÿÿÿÿÿÿÿÿÿà                  ÿÿÿÿÿÿÿÿÿÿÿÿÀ                  ÿÿÿÿÿÿÿÿÿÿÿÿ€                  ÿÿÿÿÿÿÿÿÿÿÿÿ                    ÿÿÿÿÿÿÿÿÿÿÿþ                    ÿÿÿÿÿÿÿÿÿÿþ                    ÿÿÿÿÿÿÿÿÿÿü                    ?ÿÿÿÿÿÿÿÿÿÿø                    ÿÿÿÿÿÿÿÿÿÿð                    ÿÿÿÿÿÿÿÿÿÿà                    ÿÿÿÿÿÿÿÿÿÿÀ                    ÿÿÿÿÿÿÿÿÿÿ€                    ÿÿÿÿÿÿÿÿÿÿ                      ÿÿÿÿÿÿÿÿÿÿ                      ÿÿÿÿÿÿÿÿÿþ                      ÿÿÿÿÿÿÿÿü                      ?ÿÿÿÿÿÿÿÿø                      ÿÿÿÿÿÿÿÿø                      ÿÿÿÿÿÿÿÿð                      ÿÿÿÿÿÿÿÿà                      ÿÿÿÿÿÿÿÿà                      ÿÿÿÿÿÿÿÿÀ                      ÿÿÿÿÿÿÿÿ€                      ÿÿÿÿÿÿÿÿ€                      ÿÿÿÿÿÿÿÿ                        ÿÿÿÿÿÿÿÿ                        ÿÿÿÿÿÿÿþ                        ÿÿÿÿÿÿþ                        ÿÿÿÿÿÿü                        ?ÿÿÿÿÿÿø                        ÿÿÿÿÿÿø                        ÿÿÿÿÿÿð                        ÿÿÿÿÿÿð                        ÿÿÿÿÿÿà                        ÿÿÿÿÿÿà                        ÿÿÿÿÿÿÀ                        ÿÿÿÿÿÿÀ                        ÿÿÿÿÿÿÀ                        ÿÿÿÿÿÿ€                        ÿÿÿÿÿÿ€                        ÿÿÿÿÿÿ                          ÿÿÿÿÿÿ                          ÿÿÿÿÿÿ                          ÿÿÿÿÿþ                          ÿÿÿÿþ                          ÿÿÿÿþ                          ÿÿÿÿü                          ?ÿÿÿÿü                          ?ÿÿÿÿü                          ?ÿÿÿÿø                          ÿÿÿÿø                          ÿÿÿÿø                          ÿÿÿÿð                          ÿÿÿÿð                          ÿÿÿÿð                          ÿÿÿÿð                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿð                          ÿÿÿÿð                          ÿÿÿÿð                          ÿÿÿÿð                          ÿÿÿÿø                          ÿÿÿÿø                          ÿÿÿÿø                          ÿÿÿÿü                          ?ÿÿÿÿü                          ?ÿÿÿÿü                          ?ÿÿÿÿþ                          ÿÿÿÿþ                          ÿÿÿÿþ                          ÿÿÿÿÿ                          ÿÿÿÿÿÿ                          ÿÿÿÿÿÿ                          ÿÿÿÿÿÿ€                        ÿÿÿÿÿÿ€                        ÿÿÿÿÿÿÀ                        ÿÿÿÿÿÿÀ                        ÿÿÿÿÿÿà                        ÿÿÿÿÿÿà                        ÿÿÿÿÿÿà                        ÿÿÿÿÿÿð                        ÿÿÿÿÿÿð                        ÿÿÿÿÿÿø                        ÿÿÿÿÿÿü                        ?ÿÿÿÿÿÿü                        ?ÿÿÿÿÿÿþ                        ÿÿÿÿÿÿþ                        ÿÿÿÿÿÿÿ                        ÿÿÿÿÿÿÿÿ                        ÿÿÿÿÿÿÿÿ€                      ÿÿÿÿÿÿÿÿÀ                      ÿÿÿÿÿÿÿÿÀ                      ÿÿÿÿÿÿÿÿà                      ÿÿÿÿÿÿÿÿà                      ÿÿÿÿÿÿÿÿð                      ÿÿÿÿÿÿÿÿø                      ÿÿÿÿÿÿÿÿü                      ?ÿÿÿÿÿÿÿÿü                      ?ÿÿÿÿÿÿÿÿþ                      ÿÿÿÿÿÿÿÿÿ                      ÿÿÿÿÿÿÿÿÿÿ€                    ÿÿÿÿÿÿÿÿÿÿ€                    ÿÿÿÿÿÿÿÿÿÿÀ                    ÿÿÿÿÿÿÿÿÿÿà                    ÿÿÿÿÿÿÿÿÿÿð                    ÿÿÿÿÿÿÿÿÿÿø                    ÿÿÿÿÿÿÿÿÿÿü                    ?ÿÿÿÿÿÿÿÿÿÿþ                    ÿÿÿÿÿÿÿÿÿÿÿ                    ÿÿÿÿÿÿÿÿÿÿÿÿ€                  ÿÿÿÿÿÿÿÿÿÿÿÿÀ                  ÿÿÿÿÿÿÿÿÿÿÿÿà                  ÿÿÿÿÿÿÿÿÿÿÿÿð                  ÿÿÿÿÿÿÿÿÿÿÿÿø                  ÿÿÿÿÿÿÿÿÿÿÿÿü                  ?ÿÿÿÿÿÿÿÿÿÿÿÿþ                  ÿÿÿÿÿÿÿÿÿÿÿÿÿ                  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿà                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿð                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿø                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿü                ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü              ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü          ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà        ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü        ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(   €                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 '>R`ktxxtk`R>'                                                                                                                                                                                                                                                                                                                                                                                                                               N}§Ê   ç   ø   þ   þ   þ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   þ   þ   þ   ø   çÊ§}N                                                                                                                                                                                                                                                                                                                                                                                                O‘É   ô   ÿ   þ   þ   ÿ   þÿþ+++ý:::üGGGüOOOûRRRûRRRûOOOûGGGü:::ü+++ýþÿ   þ   ÿ   þ   þ   ÿ   ôÉ‘O                                                                                                                                                                                                                                                                                                                                                                        W¨è   ÿ   þ   þÿýKKKûuuuû   üÀÀÀýÚÚÚþíííþúúúþþþþþÿÿÿþþþþþÿÿÿþÿÿÿþþþþþÿÿÿþþþþþúúúþíííþÚÚÚþÀÀÀý   üuuuûKKKûýÿ   þ   þ   ÿè¨W                                                                                                                                                                                                                                                                                                                                                    4”ä   ÿ   þ   ÿýTTTû•••üËËËþóóóþÿÿÿþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿýýýÿýýýÿýýýÿýýýÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿþóóóþËËËþ•••üTTTûý   ÿ   þ   ÿä”4                                                                                                                                                                                                                                                                                                                                   M¹   ú   ÿ   þýcccû°°°ýìììþÿÿÿþþþþÿþþþþÿÿÿÿþþþÿûûûÿûûûÿüüüÿýýýÿýýýÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿýýýÿýýýÿüüüÿûûûÿûûûÿþþþÿÿÿÿÿþþþþþþþÿÿÿÿþìììþ°°°ýcccûý   þ   ÿ   ú¹M                                                                                                                                                                                                                                                                                                                  PÈ   ÿ   þþ@@@û¡¡¡ýìììþÿÿÿþþþþþÿÿÿÿýýýÿûûûÿüüüÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿüüüÿûûûÿýýýÿÿÿÿÿþþþþÿÿÿþìììþ¡¡¡ý@@@ûþ   þ   ÿÈP                                                                                                                                                                                                                                                                                                    ?Áÿ   þ			ý]]]ûÆÆÆþþþþþþþþÿþþþþüüüÿûûûÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýýýÿûûûÿüüüÿþþþþþþþÿþþþþÆÆÆþ]]]û			ý   þÿÁ?                                                                                                                                                                                                                                                                                        ¡ü   ÿü```üÔÔÔþÿÿÿÿþþþþýýýÿûûûÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýýýÿûûûÿýýýÿþþþþÿÿÿÿÔÔÔþ```üü   ÿü¡                                                                                                                                                                                                                                                                            eë   ÿ   üMMMüÎÎÎþÿÿÿÿþþþþüüüÿüüüÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿüüüÿþþþþÿÿÿÿÎÎÎþMMMü   ü   ÿëe                                                                                                                                                                                                                                                                 ²ÿ   ý'''ü¯¯¯þÿÿÿÿþþþþüüüÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿüüüÿþþþþÿÿÿÿ¯¯¯þ'''ü   ýÿ²                                                                                                                                                                                                                                                    Mç   ÿûqqqýñññÿÿÿÿþüüüþüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿüüüþÿÿÿþñññÿqqqýû   ÿç   M                                                                                                                                                                                                                                  �þ   þ"""ü»»»þÿÿÿÿýýýþüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿýýýþÿÿÿÿ»»»þ"""ü   þþ�                                                                                                                                                                                                                             ©ÿ   üSSSýéééÿÿÿÿþûûûþýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýÿûûûþÿÿÿþéééÿSSSý   üÿ©                                                                                                                                                                                                                        Èÿ   û„„„þÿÿÿÿþþþþüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿþþþþÿÿÿÿ„„„þ   ûÿÈ                                                                                                                                                                                                                $Ù   ÿû¨¨¨þÿÿÿÿüüüþýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýÿüüüþÿÿÿÿ¨¨¨þû   ÿÙ   $                                                                                                                                                                                                     (ß   ÿûÃÃÃÿÿÿÿþûûûþþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûþÿÿÿþÃÃÃÿû   ÿß   (                                                                                                                                                                                             'à   ÿûÒÒÒÿÿÿÿþûûûþþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûþÿÿÿþÒÒÒÿû   ÿà   '                                                                                                                                                                                     Ù   ÿû×××ÿÿÿÿþûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿûûûÿûûûÿûûûÿüüüÿýýýÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿýýýÿûûûÿûûûÿûûûÿûûûÿýýýÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿþ×××ÿû   ÿÙ                                                                                                                                                                                Í   ÿûÔÔÔÿÿÿÿþûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿýýýÿüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿþÔÔÔÿû   ÿÍ                                                                                                                                                                         ¯   ÿûÇÇÇÿÿÿÿþûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿöööÿÎÎÎÿ­­­ÿŸŸŸÿ¢¢¢ÿµµµÿÜÜÜÿýýýÿÿÿÿÿþþþÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿøøøÿÒÒÒÿ¯¯¯ÿ   ÿ¡¡¡ÿ²²²ÿØØØÿûûûÿÿÿÿÿþþþÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿþÇÇÇÿû   ÿ¯                                                                                                                                                                  Š   ÿû®®®þÿÿÿþûûûþÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿýýýÿÿÿÿÿÔÔÔÿoooÿ%%%ÿÿ   ÿ   ÿ   ÿ   ÿ			ÿ888ÿŽŽŽÿíííÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿÜÜÜÿxxxÿ***ÿÿ   ÿ   ÿ   ÿ   ÿÿ222ÿ………ÿæææÿÿÿÿÿüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûþÿÿÿþ®®®þû   ÿŠ                                                                                                                                                             [ÿ   üŒŒŒþÿÿÿÿûûûþþþþÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿðððÿrrrÿÿ   ÿ   ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿÿ¡¡¡ÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿöööÿ€€€ÿÿ   ÿ   ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿÿ“““ÿýýýÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿþþþÿûûûþÿÿÿÿŒŒŒþ   üÿ   [                                                                                                                                                     *ë   ÿ___ýÿÿÿÿüüüþþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÞÞÞÿ222ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿÿ   ÿgggÿúúúÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿçççÿ@@@ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿÿ   ÿXXXÿóóóÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüþÿÿÿÿ___ý   ÿë   *                                                                                                                                              ¾   ÿ000ûîîîÿÿÿÿþýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿßßßÿ$$$ÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿ]]]ÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿéééÿ222ÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿKKKÿ÷÷÷ÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿþîîîÿ000û   ÿ¾                                                                                                                                          w   ÿüÅÅÅþÿÿÿþûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿùùùÿ===ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿÿÿÿÿüüüÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿPPPÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿmmmÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿþÅÅÅþü   ÿw                                                                                                                                     .ò   ÿƒƒƒþÿÿÿþûûûþþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüÿÿÿÿÿ†††ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÇÇÇÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ›››ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¶¶¶ÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿûûûþÿÿÿþƒƒƒþ   ÿò   .                                                                                                                              ´   ÿ999ûùùùÿÿÿÿþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿæææÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿOOOÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿòòòÿ&&&ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ???ÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿþùùùÿ999û   ÿ´                                                                                                                          T   ÿ   ý¾¾¾þÿÿÿþüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ‘‘‘ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÒÒÒÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ¦¦¦ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÂÂÂÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿþ¾¾¾þ   ý   ÿT                                                                                                                      Ï   ÿcccüÿÿÿþüüüþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿGGGÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ���ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿ[[[ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿxxxÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüþÿÿÿþcccü   ÿÏ                                                                                                                  i   ÿüÚÚÚþÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿîîîÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿZZZÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿøøøÿ***ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿEEEÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþÚÚÚþü   ÿi                                                                                                           Ø   ÿyyyýÿÿÿþûûûÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÖÖÖÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ===ÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿæææÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ)))ÿùùùÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿûûûÿÿÿÿþyyyý   ÿØ                                                                                                       h   ÿüãããþÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿËËËÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ000ÿûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÝÝÝÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿóóóÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþãããþü   ÿh                                                                                                   Í   ÿyyyüÿÿÿþûûûÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÒÒÒÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ888ÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿãããÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ%%%ÿ÷÷÷ÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿûûûÿÿÿÿþyyyü   ÿÍ                                                                                               Q   ÿýÚÚÚþÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿèèèÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿQQQÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿôôôÿ!!!ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ;;;ÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþÚÚÚþý   ÿQ                                                                                              ±   ÿ]]]üÿÿÿþüüüÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿ888ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ~~~ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿMMMÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿhhhÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüÿÿÿÿþ]]]ü   ÿ±                                                                                          )   ö   ÿ¼¼¼þÿÿÿþüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿzzzÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÁÁÁÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ���ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ®®®ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿþ¼¼¼þ   ÿ   ö)                                                                                      x   ÿ333ûüüüþÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÑÑÑÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ888ÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿàààÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ)))ÿôôôÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüþ333û   ÿx                                                                                   Ç   ÿ„„„üÿÿÿþûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýýýÿÿÿÿÿbbbÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ´´´ÿÿÿÿÿûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüÿÿÿÿÿxxxÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ———ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿþ„„„ü   ÿÇ                                                                               0   ûÿÍÍÍþÿÿÿþüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿáááÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ¢¢¢ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿïïïÿ---ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿCCCÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿþÍÍÍþÿ   û0                                                                              s   ÿ555ûýýýþÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿ¼¼¼ÿ			ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ   ÿ   ÿÿ£££ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÌÌÌÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ"""ÿÞÞÞÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýþ555û   ÿs                                                                               ³   ÿzzzüÿÿÿþûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿ²²²ÿÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿÿ   ÿÿ   ÿÿ¥¥¥ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÄÄÄÿÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿ%%%ÿØØØÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿþzzzü   ÿ³                                                                              è   ÿ¸¸¸ýÿÿÿþüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿÐÐÐÿ777ÿ   ÿ   ÿ   ÿÿÿÿÿÿÿ   ÿ   ÿÿ'''ÿ   ÿÿ   ÿÿ   ÿÿ©©©ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÛÛÛÿCCCÿ   ÿ   ÿ   ÿÿÿÿÿÿÿ   ÿ   ÿ   ÿWWWÿçççÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿþ¸¸¸ý   ÿ   è                                                                      C   ÿþêêêþÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿÿÿÿÿøøøÿžžžÿ555ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿOOOÿÄÄÄÿ÷÷÷ÿJJJÿ   ÿÿ   ÿÿ   ÿÿ«««ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿþþþÿûûûÿ©©©ÿ<<<ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿGGGÿ¸¸¸ÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿêêêþþ   ÿC                                                                      v   ÿBBBûÿÿÿþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿýýýÿÿÿÿÿûûûÿÌÌÌÿ———ÿqqqÿ```ÿbbbÿ{{{ÿ¦¦¦ÿÞÞÞÿÿÿÿÿýýýÿÿÿÿÿòòòÿHHHÿ   ÿÿ   ÿÿ   ÿÿ­­­ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýÿýýýÿÿÿÿÿýýýÿÒÒÒÿ›››ÿtttÿ```ÿbbbÿxxxÿ¡¡¡ÿÙÙÙÿÿÿÿÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿþBBBû   ÿv                                                                      ¥   ÿrrrûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿüüüÿÿÿÿÿñññÿEEEÿ   ÿÿ   ÿÿ   ÿÿ°°°ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿrrrû   ÿ¥                                                                   Ï   ÿ¢¢¢üÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿûûûÿûûûÿüüüÿüüüÿûûûÿûûûÿýýýÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿðððÿCCCÿ   ÿÿ   ÿÿ   ÿ


ÿ²²²ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿûûûÿûûûÿüüüÿüüüÿûûûÿûûûÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ¢¢¢ü   ÿÏ                                                                  í   ÿÇÇÇýÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿïïïÿ@@@ÿ   ÿÿ   ÿÿ   ÿÿµµµÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÇÇÇý   ÿ   í                                                              4   ýÿäääþÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿîîîÿ>>>ÿ   ÿÿ   ÿÿ   ÿÿ···ÿÿÿÿÿûûûÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿäääþÿ   ý4                                                              Q   ÿ(((ýøøøþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿìììÿ<<<ÿ   ÿÿ   ÿÿ   ÿÿ¹¹¹ÿÿÿÿÿûûûÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿøøøþ(((ý   ÿQ                                                              g   ÿAAAüÿÿÿþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿëëëÿ:::ÿ   ÿÿ   ÿÿ   ÿÿ¼¼¼ÿÿÿÿÿûûûÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿþAAAü   ÿg                                                              ~   ÿVVVûÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿêêêÿ888ÿ   ÿÿ   ÿÿ   ÿÿ¾¾¾ÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþVVVû   ÿ~                                                              ‘   ÿeeeûÿÿÿþüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿèèèÿ555ÿ   ÿÿ   ÿÿ   ÿÿÁÁÁÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿþeeeû   ÿ‘                                                              ž   ÿsssûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿçççÿ333ÿ   ÿÿ   ÿÿ   ÿÿÄÄÄÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿsssû   ÿž                                                              ¦   ÿ€€€ûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿæææÿ111ÿ   ÿÿ   ÿÿ   ÿÿÆÆÆÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ€€€û   ÿ¦                                                              «   ÿ†††ûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿäääÿ...ÿ   ÿÿ   ÿÿ   ÿÿÈÈÈÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ†††û   ÿ«                                                              ¬   ÿ†††ûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿãããÿ,,,ÿ   ÿÿ   ÿÿ   ÿÿÊÊÊÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ†††û   ÿ¬                                                              ©   ÿƒƒƒûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿâââÿ)))ÿ   ÿÿ   ÿÿ   ÿÿÍÍÍÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿƒƒƒû   ÿ©                                                              ¢   ÿzzzûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿàààÿ(((ÿ   ÿÿ   ÿÿ   ÿÿÎÎÎÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿzzzû   ÿ¢                                                              ˜   ÿkkkûÿÿÿþûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿßßßÿ'''ÿ   ÿÿ   ÿÿ   ÿÿÐÐÐÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿþkkkû   ÿ˜                                                              ‡   ÿ]]]ûÿÿÿþüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿÝÝÝÿ%%%ÿ   ÿÿ   ÿÿ   ÿÿÓÓÓÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿþ]]]û   ÿ‡                                                              q   ÿKKKûÿÿÿþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿÜÜÜÿ$$$ÿ   ÿÿ   ÿÿ   ÿÿÕÕÕÿÿÿÿÿûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿþKKKû   ÿq                                                              [   ÿ333üýýýþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿÛÛÛÿ###ÿ   ÿÿ   ÿÿ   ÿÿ×××ÿÿÿÿÿûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýþ333ü   ÿ[                                                              A   ÿþîîîþÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿÙÙÙÿ!!!ÿ   ÿÿ   ÿÿ   ÿ   ÿØØØÿÿÿÿÿûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿîîîþþ   ÿA                                                              $   öÿÔÔÔþÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿØØØÿ   ÿ   ÿÿ   ÿÿ   ÿ"""ÿÚÚÚÿÿÿÿÿûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÔÔÔþÿ   ö$                                                               			
Þ   ÿ³³³ýÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿûûûÿûûûÿüüüÿüüüÿûûûÿûûûÿýýýÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿÖÖÖÿÿ   ÿÿ   ÿÿ   ÿ"""ÿÛÛÛÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿüüüÿûûûÿûûûÿüüüÿüüüÿûûûÿûûûÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿ³³³ý   ÿÞ			
                                                                    ¸   ÿˆˆˆüÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿÿÕÕÕÿÿ   ÿÿ   ÿÿ   ÿ$$$ÿÜÜÜÿÿÿÿÿûûûÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿˆˆˆü   ÿ¸                                                                       Œ   ÿXXXûÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿýýýÿÿÿÿÿûûûÿÌÌÌÿ———ÿqqqÿ```ÿbbbÿ{{{ÿ¦¦¦ÿÞÞÞÿÿÿÿÿþþþÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿÿÒÒÒÿÿ   ÿÿ   ÿÿ   ÿ&&&ÿÞÞÞÿÿÿÿÿýýýÿýýýÿÒÒÒÿ›››ÿtttÿ```ÿbbbÿxxxÿ¡¡¡ÿÙÙÙÿÿÿÿÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþXXXû   ÿŒ                                                                      Y   ÿ'''ý÷÷÷þÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿÿÿÿÿøøøÿžžžÿ555ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿPPPÿÂÂÂÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿÿÐÐÐÿÿ   ÿÿ   ÿÿ   ÿ(((ÿÚÚÚÿ®®®ÿ:::ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿGGGÿ¸¸¸ÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿ÷÷÷þ'''ý   ÿY                                                                      &   ÷ÿÐÐÐþÿÿÿþüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿÐÐÐÿ777ÿ   ÿ   ÿ   ÿÿÿÿÿÿÿ   ÿ   ÿÿeeeÿîîîÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿÿÎÎÎÿÿ   ÿÿ   ÿÿ   ÿÿÿ   ÿ   ÿÿÿÿÿÿÿ   ÿ   ÿ   ÿVVVÿçççÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿþÐÐÐþÿ   ÷&                                                                       Í   ÿ———üÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿ²²²ÿÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿ222ÿáááÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿÿËËËÿÿ   ÿÿ   ÿÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿ%%%ÿØØØÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ———ü   ÿÍ                                                                           ‘   ÿSSSûÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿ¼¼¼ÿ			ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ...ÿéééÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿÿÊÊÊÿÿ   ÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ"""ÿÞÞÞÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþSSSû   ÿ‘                                                                              M   ÿýèèèþÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿáááÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿWWWÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿºººÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿCCCÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿèèèþý   ÿM                                                                              ã   ÿ¦¦¦ýÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýýýÿÿÿÿÿbbbÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¬¬¬ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüÿÿÿÿÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ———ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ¦¦¦ý   ÿã                                                                                  �   ÿUUUûÿÿÿþýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÑÑÑÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ999ÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿàààÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ)))ÿôôôÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýýýÿÿÿÿþUUUû   ÿ�                                                                                      J   ÿþÞÞÞþÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿzzzÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÁÁÁÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ���ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ®®®ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþÞÞÞþþ   ÿJ                                                                                       Ô   ÿŠŠŠýÿÿÿþûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿ888ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ~~~ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿMMMÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿhhhÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿþŠŠŠý   ÿÔ                                                                                           |   ÿ,,,û÷÷÷þÿÿÿþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿèèèÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿQQQÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿôôôÿ!!!ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ;;;ÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿþ÷÷÷þ,,,û   ÿ|                                                                                              !ï   ÿªªªþÿÿÿþûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÒÒÒÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ888ÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿãããÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ%%%ÿ÷÷÷ÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿþªªªþ   ÿï!                                                                                                  š   ÿ???ûÿÿÿþþþþþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿËËËÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ000ÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÝÝÝÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿóóóÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþþÿÿÿþ???û   ÿš                                                                                                      2ù   ÿ°°°þÿÿÿþûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÖÖÖÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ===ÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿæææÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ)))ÿùùùÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿþ°°°þ   ÿù2                                                                                                          ¡   ÿ:::ûýýýÿþþþþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿîîîÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿZZZÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿøøøÿ***ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿDDDÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþþýýýÿ:::û   ÿ¡                                                                                                              .õ   ÿ   þÿÿÿþûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿGGGÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ���ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿ[[[ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿwwwÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿþ   þ   ÿõ.                                                                                                                  �   ÿ$$$ûêêêÿÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ‘‘‘ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÒÒÒÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ¦¦¦ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÂÂÂÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþêêêÿ$$$û   ÿ�                                                                                                                         á   ÿrrrýÿÿÿþüüüþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿæææÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿOOOÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿòòòÿ&&&ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ???ÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüþÿÿÿþrrrý   ÿá                                                                                                                             c   ÿüÂÂÂþÿÿÿþûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüÿÿÿÿÿ†††ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÇÇÇÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ›››ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¶¶¶ÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿþÂÂÂþü   ÿc                                                                                                                               ¸   ÿ222ûòòòÿÿÿÿþýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿùùùÿ===ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿÿÿÿÿüüüÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿPPPÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿmmmÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿþòòòÿ222û   ÿ¸                                                                                                                                      +ì   ÿpppýÿÿÿÿûûûþþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿßßßÿ$$$ÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿ]]]ÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿéééÿ222ÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿKKKÿ÷÷÷ÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿûûûþÿÿÿÿpppý   ÿì   +                                                                                                                                             fÿ   ü§§§þÿÿÿþûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÞÞÞÿ222ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿÿ   ÿgggÿúúúÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿçççÿ@@@ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿÿ   ÿXXXÿóóóÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿþ§§§þ   üÿ   f                                                                                                                                                  ¢   ÿûÒÒÒÿÿÿÿþüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿðððÿrrrÿÿ   ÿ   ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿÿ¡¡¡ÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿöööÿ€€€ÿÿ   ÿ   ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿÿ“““ÿýýýÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿþÒÒÒÿû   ÿ¢                                                                                                                                                         Ð   ÿ...üêêêÿÿÿÿþüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿýýýÿÿÿÿÿÔÔÔÿoooÿ%%%ÿÿ   ÿ   ÿ   ÿ   ÿ			ÿ888ÿŽŽŽÿíííÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿÜÜÜÿxxxÿ***ÿÿ   ÿ   ÿ   ÿ   ÿÿ222ÿ………ÿæææÿÿÿÿÿüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿþêêêÿ...ü   ÿÐ                                                                                                                                                                .ê   ÿJJJýøøøÿþþþþýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿöööÿÎÎÎÿ­­­ÿŸŸŸÿ¢¢¢ÿµµµÿÜÜÜÿýýýÿÿÿÿÿþþþÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿøøøÿÒÒÒÿ¯¯¯ÿ   ÿ¡¡¡ÿ²²²ÿØØØÿûûûÿÿÿÿÿþþþÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿþþþþøøøÿJJJý   ÿê   .                                                                                                                                                                     Lû   þ```ýÿÿÿÿýýýþýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿýýýÿüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿýýýþÿÿÿÿ```ý   þû   L                                                                                                                                                                             gÿ   ükkkýÿÿÿÿüüüþýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿûûûÿûûûÿûûûÿüüüÿýýýÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿýýýÿûûûÿûûûÿûûûÿûûûÿýýýÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüþÿÿÿÿkkký   üÿ   g                                                                                                                                                                                     vÿ   ülllýÿÿÿÿýýýþýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿýýýþÿÿÿÿlllý   üÿ   v                                                                                                                                                                                          |ÿ   ücccýúúúÿþþþþüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿþþþþúúúÿcccý   üÿ   |                                                                                                                                                                                            xÿ   üOOOýîîîÿÿÿÿþûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿÿÿÿþîîîÿOOOý   üÿx                                                                                                                                                                                                       kü   þ333üÜÜÜÿÿÿÿþûûûþýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿûûûþÿÿÿþÜÜÜÿ333ü   þü   k                                                                                                                                                                                                                  Rï   ÿû´´´þÿÿÿÿüüüþüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüÿüüüþÿÿÿÿ´´´þû   ÿï   R                                                                                                                                                                                                                             2Ú   ÿû}}}ýùùùÿÿÿÿþûûûÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýÿûûûÿÿÿÿþùùùÿ}}}ýû   ÿÚ   2                                                                                                                                                                                                                                     °ÿ   ü;;;üÓÓÓþÿÿÿÿýýýþüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿýýýþÿÿÿÿÓÓÓþ;;;ü   üÿ°                                                                                                                                                                                                                                                tõ   ÿû………ýõõõÿÿÿÿþüüüþüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿüüüþÿÿÿþõõõÿ………ýû   ÿõt                                                                                                                                                                                                                                                           3Éÿ   ý///ü¶¶¶þÿÿÿÿþþþþýýýÿüüüÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿüüüÿýýýÿþþþþÿÿÿÿ¶¶¶þ///ü   ýÿÉ   3                                                                                                                                                                                                                                                                    vð   ÿ   üJJJüÇÇÇþÿÿÿÿþþþþýýýÿûûûÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿûûûÿýýýÿþþþþÿÿÿÿÇÇÇþJJJü   ü   ÿðv                                                                                                                                                                                                                                                                                %¦û   ÿýSSSûÃÃÃþþþþþþþþþþþþþüüüÿüüüÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿüüüÿþþþþþþþþþþþþÃÃÃþSSSûý   ÿû¦   %                                                                                                                                                                                                                                                                                          <ºÿ   þþBBBû©©©ýóóóþÿÿÿÿþþþþþþþÿûûûÿûûûÿýýýÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿýýýÿûûûÿûûûÿþþþÿþþþþÿÿÿÿóóóþ©©©ýBBBûþ   þÿº<                                                                                                                                                                                                                                                                                                            Dµú   ÿ   þ!!!üuuuüÅÅÅþùùùþÿÿÿÿþþþþÿÿÿÿþþþÿûûûÿûûûÿýýýÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿýýýÿûûûÿûûûÿþþþÿÿÿÿÿþþþþÿÿÿÿùùùþÅÅÅþuuuü!!!ü   þ   ÿúµD                                                                                                                                                                                                                                                                                                                           6›ì   ÿ   þÿ...üwwwûºººýíííþÿÿÿþþþþÿþþþþþþþÿÿÿÿÿþþþÿýýýÿûûûÿûûûÿûûûÿûûûÿûûûÿüüüÿüüüÿûûûÿûûûÿûûûÿûûûÿûûûÿýýýÿþþþÿÿÿÿÿþþþÿþþþþþþþÿÿÿÿþíííþºººýwwwû...üÿ   þ   ÿì›6                                                                                                                                                                                                                                                                                                                                            h½   ÷   ÿ   þ   ÿþKKKû€€€û±±±ý×××þôôôþÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþÿÿÿþôôôþ×××þ±±±ý€€€ûKKKûþ   ÿ   þ   ÿ   ÷½h                                                                                                                                                                                                                                                                                                                                                                (o´   ë   ÿ   þ   þ   þÿ   þAAAü\\\ûvvvû���ü   üªªªü±±±ý¶¶¶ý¶¶¶ý±±±ýªªªü   ü���üvvvû\\\ûAAAü   þÿ   þ   þ   þ   ÿ   ë´o(                                                                                                                                                                                                                                                                                                                                                                                        I�³Ý   ø   ÿ   þ   þ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   þ   þ   ÿ   øÝ³�I                                                                                                                                                                                                                                                                                                                                                                                                                   			
(Kiˆ¢´ÃÎÕ   Ø   ØÕÎÃ´¢ˆiK(			
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü  ?ÿÿÿÿÿÿÿÿÿÿÿÿ€  ÿÿÿÿÿÿÿÿÿÿÿü    ?ÿÿÿÿÿÿÿÿÿÿà    ÿÿÿÿÿÿÿÿÿÿ€    ÿÿÿÿÿÿÿÿÿþ      ÿÿÿÿÿÿÿÿø      ÿÿÿÿÿÿÿÿà      ÿÿÿÿÿÿÿÿÀ      ÿÿÿÿÿÿÿÿ        ÿÿÿÿÿÿÿþ        ÿÿÿÿÿÿø        ÿÿÿÿÿÿð        ÿÿÿÿÿÿà        ÿÿÿÿÿÿÀ        ÿÿÿÿÿÿ€        ÿÿÿÿÿÿ          ÿÿÿÿÿþ          ÿÿÿÿü          ?ÿÿÿÿø          ÿÿÿÿð          ÿÿÿÿð          ÿÿÿÿà          ÿÿÿÿÀ          ÿÿÿÿÀ          ÿÿÿÿ€          ÿÿÿÿ            ÿÿÿÿ            ÿÿÿþ            ÿÿþ            ÿÿü            ?ÿÿü            ?ÿÿø            ÿÿø            ÿÿð            ÿÿð            ÿÿð            ÿÿà            ÿÿà            ÿÿà            ÿÿÀ            ÿÿÀ            ÿÿÀ            ÿÿÀ            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ              ÿÿ              ÿÿ              ÿÿ              ÿÿ              ÿÿ              ÿÿ              ÿÿ              ÿÿ              ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿÀ            ÿÿÀ            ÿÿÀ            ÿÿÀ            ÿÿà            ÿÿà            ÿÿà            ÿÿð            ÿÿð            ÿÿø            ÿÿø            ÿÿø            ÿÿü            ?ÿÿü            ?ÿÿþ            ÿÿþ            ÿÿÿ            ÿÿÿÿ€          ÿÿÿÿ€          ÿÿÿÿÀ          ÿÿÿÿà          ÿÿÿÿà          ÿÿÿÿð          ÿÿÿÿø          ÿÿÿÿü          ?ÿÿÿÿþ          ÿÿÿÿÿ          ÿÿÿÿÿÿ€        ÿÿÿÿÿÿÀ        ÿÿÿÿÿÿà        ÿÿÿÿÿÿð        ÿÿÿÿÿÿø        ÿÿÿÿÿÿü        ?ÿÿÿÿÿÿÿ        ÿÿÿÿÿÿÿÿ€      ÿÿÿÿÿÿÿÿà      ÿÿÿÿÿÿÿÿð      ÿÿÿÿÿÿÿÿü      ?ÿÿÿÿÿÿÿÿÿ      ÿÿÿÿÿÿÿÿÿÿÀ    ÿÿÿÿÿÿÿÿÿÿø    ÿÿÿÿÿÿÿÿÿÿÿ    ÿÿÿÿÿÿÿÿÿÿÿÿà  ÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(   @   €           @                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           7   `   …   Ÿ   ¯   ¸   ¸   ¯   Ÿ   …   `   7                                                                                                                                                                                        k   ´éÿDDDþdddþ€€€ÿ“““ÿ›››ÿ›››ÿ“““ÿ€€€ÿdddþDDDþÿé   ´   k                                                                                                                                                          YYYC   ¯			õBBBÿŒŒŒþÎÎÎÿøøøþÿÿÿûþþþúÿÿÿûÿÿÿûÿÿÿûÿÿÿûÿÿÿûÿÿÿûþþþúÿÿÿûøøøþÎÎÎÿŒŒŒþBBBÿ			õ   ¯CYYY                                                                                                                                          A   Äÿ{{{þÝÝÝþÿÿÿûþþþûþþþýÿÿÿþüüüþûûûþúúúÿûûûÿûûûÿûûûÿûûûÿúúúÿûûûþüüüþÿÿÿþþþþýþþþûÿÿÿûÝÝÝþ{{{þÿ   ÄA                                                                                                                                     ©ÿˆˆˆþóóóüÿÿÿûþþþþüüüÿúúúþüüüþþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿüüüþúúúþüüüÿþþþþÿÿÿûóóóüˆˆˆþÿ   ©                                                                                                                      T   ì\\\ÿêêêûÿÿÿüýýýþûûûÿýýýþþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿýýýþûûûÿýýýþÿÿÿüêêêû\\\ÿ   ìT                                                                                                             ‹ÿ®®®ýÿÿÿûýýýþûûûÿýýýþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýþûûûÿýýýþÿÿÿû®®®ýÿ   ‹                                                                                               ���   ¬---ÿàààúÿÿÿýúúúÿýýýþÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýþúúúÿÿÿÿýàààú---ÿ   ¬���                                                                                    ………   ¶AAAÿõõõúÿÿÿþûûûÿýýýþûûûÿûûûÿüüüÿûûûÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿûûûÿüüüÿûûûÿûûûÿþþþþûûûÿÿÿÿþõõõúAAAÿ   ¶………                                                                                      ­CCCÿûûûúþþþþüüüÿüüüþýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüþüüüÿþþþþûûûúCCCÿ   ­                                                                                     �333ÿöööúÿÿÿþüüüþüüüþÿÿÿÿòòòÿ   ÿaaaÿRRRÿgggÿ®®®ÿùùùÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿôôôÿ¤¤¤ÿcccÿRRRÿeeeÿªªªÿ÷÷÷ÿÿÿÿÿýýýþüüüþÿÿÿþöööú333ÿ   �                                                                             ^ÿáááûÿÿÿþüüüþüüüþÿÿÿÿ¾¾¾ÿÿ   ÿÿ   ÿÿ   ÿ111ÿÕÕÕÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÅÅÅÿ$$$ÿ   ÿÿ   ÿÿ   ÿ+++ÿÏÏÏÿÿÿÿÿýýýþüüüþÿÿÿþáááûÿ   ^                                                               			$   î±±±ÿÿÿÿýûûûÿüüüþÿÿÿÿÀÀÀÿÿ   ÿÿÿÿÿÿ   ÿÿÚÚÚÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÉÉÉÿ


ÿ   ÿÿÿÿÿÿ   ÿÿÔÔÔÿÿÿÿÿýýýþûûûÿÿÿÿý±±±ÿ   î			$                                                              ¯gggÿÿÿÿûûûûÿþþþþÿÿÿÿùùùÿ...ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿMMMÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿ666ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿCCCÿÿÿÿÿþþþÿþþþþûûûÿÿÿÿûgggÿ   ¯                                                          Pÿïïïüÿÿÿþýýýþûûûÿÿÿÿÿ±±±ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÓÓÓÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿ¼¼¼ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÊÊÊÿÿÿÿÿüüüÿýýýþÿÿÿþïïïüÿ   P                                                ÿÿÿ   Ê’’’ÿÿÿÿüûûûþÿÿÿÿûûûÿÿÿÿÿyyyÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¡¡¡ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿ………ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ–––ÿÿÿÿÿûûûÿÿÿÿÿûûûþÿÿÿü’’’ÿ   Êÿÿÿ                                               R(((ÿùùùüÿÿÿþþþþþþþþÿûûûÿÿÿÿÿmmmÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ“““ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿvvvÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿˆˆˆÿÿÿÿÿúúúÿþþþÿþþþþÿÿÿþùùùü(((ÿ   R                                           »‰‰‰ÿÿÿÿüûûûþþþþÿþþþÿûûûÿÿÿÿÿ‹‹‹ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¯¯¯ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿ–––ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¤¤¤ÿÿÿÿÿûûûÿÿÿÿÿþþþÿûûûþÿÿÿü‰‰‰ÿ   »                                          -üåååÿÿÿÿþýýýþþþþÿÿÿÿÿüüüÿÿÿÿÿÎÎÎÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿèèèÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿ×××ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿâââÿÿÿÿÿýýýÿÿÿÿÿþþþÿýýýþÿÿÿþåååÿü   -                                         }SSSÿÿÿÿûüüüþþþþÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿ\\\ÿ   ÿÿÿ   ÿ   ÿ   ÿÿÿ   ÿTTTÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿfffÿ   ÿÿÿ   ÿ   ÿ   ÿÿÿ   ÿuuuÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿþþþÿüüüþÿÿÿûSSSÿ   }                                          Åžžžÿÿÿÿüûûûþþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿïïïÿ888ÿ   ÿÿÿÿÿ   ÿ   ÿÿ   ÿ’’’ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿôôôÿAAAÿ   ÿÿÿÿÿÿ   ÿLLLÿùùùÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿûûûþÿÿÿüžžžÿ   Å                                      			ôÝÝÝÿÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿóóóÿuuuÿÿ   ÿÿ   ÿÿxxxÿÿ   ÿ   ÿ–––ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿöööÿ{{{ÿÿ   ÿÿ   ÿÿ………ÿúúúÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþÝÝÝÿ			ô                                    J...ÿÿÿÿüÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿìììÿ½½½ÿ«««ÿÃÃÃÿðððÿÿÿÿÿÅÅÅÿÿ   ÿ   ÿ˜˜˜ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿîîîÿ¾¾¾ÿ«««ÿÁÁÁÿðððÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþÿÿÿü...ÿ   J                                 wWWWÿÿÿÿûûûûþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿùùùÿÿÿÿÿÃÃÃÿÿ   ÿ   ÿ›››ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûþÿÿÿûWWWÿ   w                              œ|||ÿÿÿÿûúúúþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýýýÿüüüÿûûûÿüüüÿþþþÿÿÿÿÿúúúÿÿÿÿÿÁÁÁÿÿ   ÿ   ÿ���ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýÿüüüÿûûûÿüüüÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúþÿÿÿû|||ÿ   œ                           ¶˜˜˜ÿÿÿÿûûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ¿¿¿ÿÿ   ÿ   ÿ   ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿû˜˜˜ÿ   ¶                               Èªªªÿÿÿÿüûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ½½½ÿÿ   ÿÿ£££ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿüªªªÿ   È                                   Ï¶¶¶ÿÿÿÿüüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿºººÿ			ÿ   ÿÿ¦¦¦ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿü¶¶¶ÿ   Ï                                   Ð···ÿÿÿÿüüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ¸¸¸ÿÿ   ÿÿ¨¨¨ÿÿÿÿÿúúúÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿü···ÿ   Ð                                   Ê­­­ÿÿÿÿüûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ¶¶¶ÿÿ   ÿÿ«««ÿÿÿÿÿúúúÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿü­­­ÿ   Ê                        			       »���ÿÿÿÿûûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ´´´ÿÿ   ÿÿ­­­ÿÿÿÿÿúúúÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿû���ÿ   »    			                       ¢ƒƒƒÿÿÿÿûûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýýýÿüüüÿûûûÿüüüÿþþþÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ²²²ÿÿ   ÿÿ°°°ÿÿÿÿÿúúúÿÿÿÿÿýýýÿüüüÿûûûÿüüüÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿûƒƒƒÿ   ¢                              �___ÿÿÿÿúûûûþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ¯¯¯ÿÿ   ÿÿ²²²ÿÿÿÿÿùùùÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûþÿÿÿú___ÿ   �                                 U777ÿÿÿÿüþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿìììÿ½½½ÿ«««ÿÃÃÃÿòòòÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ­­­ÿÿ   ÿÿ³³³ÿÿÿÿÿìììÿ¾¾¾ÿ«««ÿÁÁÁÿðððÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþÿÿÿü777ÿ   U                                 &úçççÿÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿóóóÿuuuÿÿ   ÿÿ   ÿÿŒŒŒÿüüüÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿªªªÿÿ   ÿÿeeeÿÿ   ÿÿ   ÿÿ………ÿúúúÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþçççÿú   &                               ÿÿÿ   Ò®®®ÿÿÿÿüûûûþþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿïïïÿ888ÿ   ÿÿÿÿÿÿ   ÿTTTÿüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿúúúÿÿÿÿÿ¨¨¨ÿÿ   ÿ   ÿ   ÿÿÿÿÿ   ÿLLLÿùùùÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿûûûþÿÿÿü®®®ÿ   Òÿÿÿ                                   �cccÿÿÿÿûûûûþþþþÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿ\\\ÿ   ÿÿÿ   ÿ   ÿ   ÿÿÿ   ÿ���ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿúúúÿÿÿÿÿLLLÿ   ÿÿÿ   ÿ   ÿ   ÿÿÿ   ÿuuuÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿþþþÿûûûþÿÿÿûcccÿ   �                                      >ÿóóóýÿÿÿþþþþþþþþÿÿÿÿÿüüüÿÿÿÿÿÎÎÎÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿéééÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÖÖÖÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿâââÿÿÿÿÿýýýÿÿÿÿÿþþþÿþþþþÿÿÿþóóóýÿ   >                                              Í¡¡¡ÿÿÿÿüûûûþþþþÿþþþÿûûûÿÿÿÿÿ‹‹‹ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¯¯¯ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿ–––ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¤¤¤ÿÿÿÿÿûûûÿÿÿÿÿþþþÿûûûþÿÿÿü¡¡¡ÿ   Í                                               k<<<ÿÿÿÿûýýýþþþþþþþþÿûûûÿÿÿÿÿmmmÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ“““ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿvvvÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿˆˆˆÿÿÿÿÿúúúÿþþþÿþþþþýýýþÿÿÿû<<<ÿ   k                                           ß¯¯¯ÿÿÿÿýûûûþÿÿÿÿûûûÿÿÿÿÿyyyÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¡¡¡ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿ………ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ–––ÿÿÿÿÿûûûÿÿÿÿÿûûûþÿÿÿý¯¯¯ÿ   ß                                               l333ÿþþþûþþþÿþþþþûûûÿÿÿÿÿ±±±ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÓÓÓÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿ¼¼¼ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÊÊÊÿÿÿÿÿüüüÿþþþþþþþÿþþþû333ÿ   l                                                    ���   ËŠŠŠÿÿÿÿüúúúÿþþþþÿÿÿÿùùùÿ...ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿMMMÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿ666ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿCCCÿÿÿÿÿþþþÿþþþþúúúÿÿÿÿüŠŠŠÿ   Ë���                                                           >ýÓÓÓýÿÿÿþüüüþüüüÿÿÿÿÿÀÀÀÿÿ   ÿÿÿÿÿÿ   ÿÿÚÚÚÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÉÉÉÿ


ÿ   ÿÿÿÿÿÿ   ÿÿÔÔÔÿÿÿÿÿýýýÿüüüþÿÿÿþÓÓÓýý   >                                                                  ‚111ÿùùùúþþþÿýýýþüüüÿÿÿÿÿ¾¾¾ÿÿ   ÿÿ   ÿÿ   ÿ111ÿÕÕÕÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÅÅÅÿ$$$ÿ   ÿÿ   ÿÿ   ÿ+++ÿÏÏÏÿÿÿÿÿüüüÿýýýþþþþÿùùùú111ÿ   ‚                                                                      ÿÿÿ   µVVVÿÿÿÿúûûûÿþþþþüüüÿÿÿÿÿòòòÿ   ÿaaaÿRRRÿgggÿ®®®ÿùùùÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿôôôÿ¤¤¤ÿcccÿRRRÿeeeÿªªªÿ÷÷÷ÿÿÿÿÿýýýÿþþþþûûûÿÿÿÿúVVVÿ   µÿÿÿ                                                                       ///   Òmmmÿÿÿÿûûûûÿýýýþüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿýýýþûûûÿÿÿÿûmmmÿ   Ò///                                                                               Ûnnnÿÿÿÿúüüüÿüüüþþþþþûûûÿûûûÿüüüÿûûûÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿûûûÿüüüÿûûûÿûûûÿþþþþüüüþüüüÿÿÿÿúnnnÿ   Û                                                                                          ÕXXXÿûûûúÿÿÿþûûûÿþþþþÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþþûûûÿÿÿÿþûûûúXXXÿ   Õ                                                                                               ###   »222ÿÜÜÜûÿÿÿüûûûÿüüüþþþþþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþþüüüþûûûÿÿÿÿüÜÜÜû222ÿ   »###                                                                                                    ¶¶¶   ‰ÿ•••þÿÿÿûÿÿÿýüüüÿûûûþþþþþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþþûûûþüüüÿÿÿÿýÿÿÿû•••þÿ   ‰¶¶¶                                                                                                               B   Ø555ÿÀÀÀýÿÿÿûþþþüþþþþûûûÿüüüþþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿüüüþûûûÿþþþþþþþüÿÿÿûÀÀÀý555ÿ   ØB                                                                                                                           	   wëAAAÿ´´´þûûûüÿÿÿûþþþýÿÿÿþüüüþúúúþûûûÿüüüÿüüüÿüüüÿüüüÿüüüÿüüüÿûûûÿúúúþüüüþÿÿÿþþþþýÿÿÿûûûûü´´´þAAAÿë   w	                                                                                                                                          			   y   Þ&&&ÿuuuþÃÃÃÿöööþÿÿÿûþþþûÿÿÿûÿÿÿüÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿüÿÿÿûþþþûÿÿÿûöööþÃÃÃÿuuuþ&&&ÿ   Þ   y			                                                                                                                                                                L   ¡   âþJJJþuuuþšššÿ¶¶¶ÿÇÇÇÿÎÎÎÿÎÎÎÿÇÇÇÿ¶¶¶ÿšššÿuuuþJJJþþ   â   ¡   L                                                                                                                                                                                 				   6   j   —   ¹   Ð   Ýãã   Ý   Ð   ¹   —   j   6				                                                                                                                                                                                                                    
   
                                                                                                                                                                                                                                			                        			                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿ  ÿÿÿÿÿø  ÿÿÿÿà  ÿÿÿÿ€  ÿÿÿÿ    ÿÿÿü    ?ÿÿø    ÿÿð    ÿÿà    ÿÿÀ    ÿÿÀ    ÿÿ€    ÿÿ      ÿÿ      ÿþ      þ      ü      ?ü      ?ü      ?ø      ø      ø      ø      ð      ð      ð      ð      ð      ð      ð      ð      ð      ø      ø      ø      ø      ü      ?ü      ?þ      þ      ÿ      ÿÿ      ÿÿ€    ÿÿ€    ÿÿÀ    ÿÿà    ÿÿð    ÿÿø    ÿÿü    ?ÿÿþ    ÿÿÿ€  ÿÿÿÿà  ÿÿÿÿø  ÿÿÿÿþ  ÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(   0   `           $                                                                                                                                                                                                                                                                                                kkkççççççkkk                                                                                                                                             111                                                111                                                                                                                      			                  R   ‚   §¼ÆÆ¼   §   ‚   R               			                                                                                                              j			Â>>>ötttÿ¡¡¡þÂÂÂÿÖÖÖÿßßßÿßßßÿÖÖÖÿÂÂÂÿ¡¡¡þtttÿ>>>ö			Â   j                                                                                                      „&&&í€€€ÿÕÕÕþþþþþþþþüþþþúÿÿÿûÿÿÿüÿÿÿüÿÿÿüÿÿÿüÿÿÿûþþþúþþþüþþþþÕÕÕþ€€€ÿ&&&í   „                                                                                             Zç���ÿôôôýÿÿÿûþþþûýýýþúúúþûûûþüüüþýýýÿýýýÿýýýÿýýýÿüüüþûûûþúúúþýýýþþþþûÿÿÿûôôôý���ÿç   Z                                                                                  	   ¢UUUÿéééýÿÿÿûýýýýûûûÿýýýþþþþþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþþýýýþûûûÿýýýýÿÿÿûéééýUUUÿ   ¢	                                                                             Ê���ÿÿÿÿúüüüýøøøÿûûûþýýýþþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿýýýþûûûþøøøÿýýýýÿÿÿú���ÿÊ                                                                        


Õ®®®ÿÿÿÿú÷÷÷þüüüÿÿÿÿþþþþÿÿÿÿÿüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿþþþÿÿÿÿþüüüÿ÷÷÷þÿÿÿú®®®ÿ


Õ                                                             Ë®®®ÿÿÿÿú÷÷÷ÿÿÿÿþ÷÷÷þÊÊÊÿ¹¹¹ÿÛÛÛÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿþþþÿþþþÿ×××ÿ¸¸¸ÿÍÍÍÿúúúþÿÿÿþøøøÿÿÿÿú®®®ÿË                                                      ¥’’’ÿÿÿÿú÷÷÷ÿÿÿÿþ···ÿ%%%ÿ   ÿ   ÿÿQQQÿçççÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÞÞÞÿEEEÿÿ   ÿ   ÿ---ÿÄÄÄÿÿÿÿþ÷÷÷ÿÿÿÿú’’’ÿ   ¥                                                  c___ÿÿÿÿûøøøþÿÿÿþ¹¹¹ÿÿ   ÿÿÿÿ   ÿ111ÿóóóÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿêêêÿ###ÿ   ÿÿÿÿ   ÿÿÈÈÈÿÿÿÿþøøøþÿÿÿû___ÿ   c                                          ###çéééÿÿÿÿýýýýþÿÿÿþ444ÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿ‰‰‰ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿuuuÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿFFFÿÿÿÿþüüüþÿÿÿýéééÿ###ç                               			       �–––ÿÿÿÿûùùùÿÿÿÿþ×××ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿBBBÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿ111ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿæææÿÿÿÿþùùùÿÿÿÿû–––ÿ   �    			                           111î÷÷÷ÿÿÿÿþüüüþÿÿÿÿÍÍÍÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ666ÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿ%%%ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÝÝÝÿÿÿÿÿüüüþÿÿÿþ÷÷÷ÿ111î                              w‹‹‹ÿÿÿÿûûûûþýýýÿÿÿÿÿíííÿÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿ```ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿMMMÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿ"""ÿøøøÿÿÿÿÿþþþÿûûûþÿÿÿû‹‹‹ÿ   w                            ËÛÛÛÿÿÿÿüýýýþþþþÿûûûÿÿÿÿÿrrrÿ   ÿÿÿÿÿÿ   ÿ¯¯¯ÿÿÿÿÿúúúÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿ´´´ÿ   ÿÿÿÿÿÿ   ÿ………ÿÿÿÿÿûûûÿþþþÿýýýþÿÿÿüÛÛÛÿË                              )KKKüÿÿÿÿýýýþþþþþþþþÿþþþÿÿÿÿÿ÷÷÷ÿMMMÿ   ÿÿ   ÿ   ÿÿ   ÿ111ÿçççÿÿÿÿÿüüüÿÿÿÿÿþþþÿþþþÿþþþÿýýýÿÿÿÿÿ†††ÿ   ÿ   ÿ   ÿÿ   ÿ]]]ÿýýýÿþþþÿþþþÿþþþÿþþþþýýýþÿÿÿÿKKKü   )                      `‚‚‚ÿÿÿÿûûûûþþþþÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿ§§§ÿUUUÿDDDÿkkkÿÍÍÍÿWWWÿ   ÿ222ÿéééÿÿÿÿÿüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿÆÆÆÿeeeÿDDDÿYYYÿ°°°ÿþþþÿýýýÿþþþÿÿÿÿÿþþþÿþþþÿûûûþÿÿÿû‚‚‚ÿ   `                   ’°°°ÿÿÿÿûüüüþþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿúúúÿQQQÿ   ÿ444ÿêêêÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüþÿÿÿû°°°ÿ   ’            KKK    ¶ÑÑÑÿÿÿÿûýýýþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿûûûÿüüüÿûûûÿûûûÿþþþÿùùùÿNNNÿ   ÿ666ÿìììÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüÿûûûÿüüüÿûûûÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþÿÿÿûÑÑÑÿ¶    KKK                ÍãããÿÿÿÿüýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿýýýÿþþþÿøøøÿLLLÿ   ÿ999ÿíííÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿüãããÿÍ                       !!!×íííÿÿÿÿüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿþþþÿ÷÷÷ÿIIIÿ   ÿ;;;ÿïïïÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿüíííÿ!!!×                      """ØîîîÿÿÿÿüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿöööÿGGGÿ   ÿ===ÿðððÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿüîîîÿ"""Ø                       ÏæææÿÿÿÿüýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿõõõÿEEEÿ   ÿ???ÿòòòÿÿÿÿÿüüüÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿüæææÿÏ                aaa    


ºÕÕÕÿÿÿÿûýýýÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿûûûÿüüüÿûûûÿüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿóóóÿCCCÿ   ÿAAAÿòòòÿÿÿÿÿúúúÿûûûÿüüüÿûûûÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿûÕÕÕÿ


º    aaa               ™¶¶¶ÿÿÿÿûüüüþþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿòòòÿAAAÿ   ÿCCCÿóóóÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüþÿÿÿû¶¶¶ÿ   ™                   iŠŠŠÿÿÿÿûûûûþþþþÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿ§§§ÿUUUÿEEEÿjjjÿÎÎÎÿÿÿÿÿüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿòòòÿ>>>ÿ   ÿIIIÿÁÁÁÿfffÿCCCÿYYYÿ°°°ÿþþþÿýýýÿþþþÿÿÿÿÿþþþÿþþþÿûûûþÿÿÿûŠŠŠÿ   i                      2TTTÿÿÿÿþüüüþþþþÿþþþÿþþþÿÿÿÿÿ÷÷÷ÿMMMÿ   ÿÿ   ÿ   ÿ   ÿ–––ÿÿÿÿÿüüüÿþþþÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿïïïÿ@@@ÿ   ÿÿ   ÿ   ÿÿ   ÿ]]]ÿýýýÿþþþÿþþþÿþþþÿþþþÿüüüþÿÿÿþTTTÿ   2                          Õäääÿÿÿÿýýýýþþþþÿûûûÿÿÿÿÿrrrÿ   ÿÿÿÿÿ   ÿ   ÿÅÅÅÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿúúúÿÿÿÿÿ§§§ÿ   ÿÿÿÿÿÿ   ÿ………ÿÿÿÿÿûûûÿþþþÿýýýþÿÿÿýäääÿÕ                       			       …šššÿÿÿÿûûûûþýýýÿÿÿÿÿíííÿÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿ```ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿLLLÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿ"""ÿøøøÿÿÿÿÿþþþÿûûûþÿÿÿûšššÿ   …    			                       (@@@øÿÿÿÿþþþþüüüþÿÿÿÿÍÍÍÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ777ÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿ$$$ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÝÝÝÿÿÿÿÿüüüþþþþþÿÿÿÿ@@@ø   (                               ¢©©©ÿÿÿÿûùùùÿÿÿÿþ×××ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿBBBÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿ111ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿæææÿÿÿÿþúúúÿÿÿÿû©©©ÿ   ¢                                   (333õøøøÿþþþþþþþþÿÿÿÿ444ÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿ‰‰‰ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿuuuÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿFFFÿÿÿÿÿüüüþÿÿÿþøøøÿ333õ   (                                       |xxxÿÿÿÿú÷÷÷ÿÿÿÿþ¹¹¹ÿÿ   ÿÿÿÿ   ÿ111ÿóóóÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿêêêÿ###ÿ   ÿÿÿÿ   ÿÿÈÈÈÿÿÿÿþøøøÿÿÿÿúxxxÿ   |                                            ,,,   ¿¯¯¯ÿÿÿÿûøøøÿÿÿÿþ···ÿ%%%ÿ   ÿ   ÿÿQQQÿçççÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÞÞÞÿEEEÿÿ   ÿ   ÿ---ÿÄÄÄÿÿÿÿþøøøÿÿÿÿû¯¯¯ÿ   ¿,,,                                                   âÌÌÌÿÿÿÿûøøøÿÿÿÿþ÷÷÷ÿÊÊÊÿ¹¹¹ÿÛÛÛÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿþþþÿþþþÿ×××ÿ¸¸¸ÿÍÍÍÿúúúÿÿÿÿþøøøÿÿÿÿûÌÌÌÿâ                                                             1ìÎÎÎÿÿÿÿû÷÷÷ÿýýýþÿÿÿþþþþÿÿÿÿÿüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿþþþÿÿÿÿþüüüþ÷÷÷ÿÿÿÿûÎÎÎÿì   1                                                                     1åµµµÿÿÿÿúûûûþùùùÿûûûþýýýÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿûûûþùùùÿûûûþÿÿÿúµµµÿå   1                                                                             Æ{{{ÿüüüüÿÿÿûüüüþûûûÿþþþþÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþþûûûÿüüüþÿÿÿûüüüü{{{ÿÆ                                                                                     ;;;   ƒ222ù¶¶¶ÿÿÿÿýþþþûþþþýûûûþûûûþüüüþýýýÿþþþÿþþþÿþþþÿþþþÿýýýÿüüüþûûûþûûûþþþþýþþþûÿÿÿý¶¶¶ÿ222ù   ƒ;;;                                                                                             *®CCCü§§§ÿðððþÿÿÿýþþþúþþþûÿÿÿüÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿüþþþûþþþúÿÿÿýðððþ§§§ÿCCCü®   *                                                                                                       .   ”!!!ã```ÿ™™™þÅÅÅþâââÿóóóÿùùùÿùùùÿóóóÿâââÿÅÅÅþ™™™þ```ÿ!!!ã   ”.                                                                                                                          
   >   {«Ë(((Þ111å111å(((ÞË«   {   >   
                                                                                                                                                                                                                                                                                                                            ---                        ---                                                                                                                                                                                                                                                                         ÿÿÿÿÿÿ  ÿÿÿÿÿÿ  ÿÿÿÿÿÿ  ÿÿðÿÿ  ÿÿ€ÿÿ  ÿü  ?ÿ  ÿø  ÿ  ÿà  ÿ  ÿÀ  ÿ  ÿ€  ÿ  ÿ    ÿ  þ      þ      ü    ?  ø      ø      ø      ð      ð      ð      à      à      à      à      à      à      à      à      ð      ð      ð      ð      ø      ø      ü    ?  þ      þ      ÿ    ÿ  ÿ€  ÿ  ÿÀ  ÿ  ÿà  ÿ  ÿð  ÿ  ÿü  ?ÿ  ÿÿ  ÿÿ  ÿÿðÿÿ  ÿÿÿÿÿÿ  ÿÿÿÿÿÿ  ÿÿÿÿÿÿ  (       @                                                                            ŠŠŠÿÿÿ        ÿÿÿŠŠŠ                                                                                   ppp                                        ppp                                                                999           &m222¥SSSÆbbbÕbbbÕSSSÆ222¥m   &        999                                                    000       B:::»ŒŒŒûÇÇÇÿëëëþüüüÿÿÿÿÿÿÿÿÿüüüÿëëëþÇÇÇÿŒŒŒû:::»   B    000                                                   (((ª™™™ÿóóóþÿÿÿþþþþûÿÿÿûþþþüþþþüþþþüþþþüÿÿÿûþþþûÿÿÿþóóóþ™™™ÿ(((ª                                                  0QQQáÜÜÜÿÿÿÿûýýýûøøøþûûûÿþþþþþþþÿþþþÿþþþÿþþþÿþþþþûûûÿøøøþýýýûÿÿÿûÝÝÝÿQQQá   0                                       2cccî÷÷÷ÿÿÿÿúþþþþþþþÿÿÿÿþýýýÿþþþÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿýýýÿÿÿÿþþþþÿþþþþÿÿÿú÷÷÷ÿcccî   2                               UUUàõõõÿÿÿÿû±±±ÿ>>>þ...ÿwwwÿôôôÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿïïïÿpppÿ---ÿBBBþ¹¹¹ÿÿÿÿûõõõÿUUUà                       ×××    +++«ØØØÿÿÿÿú³³³ÿ   þ   ÿÿ   ÿUUUÿÿÿÿÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿIIIÿ   ÿÿ   ÿþ¿¿¿ÿÿÿÿúÙÙÙÿ+++«    ×××                   MœœœÿÿÿÿûÿÿÿþMMMþ   ÿÿÿÿÿÕÕÕÿÿÿÿÿüüüÿüüüÿÿÿÿÿÊÊÊÿ   ÿÿÿÿ   ÿZZZþÿÿÿþÿÿÿû���ÿ   M            ÿÿÿ    BBB¾ñññÿÿÿÿüÿÿÿþ???ÿ   ÿÿ   ÿÿ   ÿÈÈÈÿÿÿÿÿüüüÿüüüÿÿÿÿÿ¾¾¾ÿ   ÿÿ   ÿÿ   ÿLLLÿÿÿÿþþþþüñññÿBBB¾    ÿÿÿ           0‘‘‘þÿÿÿþøøøþÿÿÿþŒŒŒÿ   ÿÿÿ   ÿ!!!ÿõõõÿÿÿÿÿýýýÿþþþÿÿÿÿÿôôôÿ"""ÿ   ÿÿÿ   ÿ™™™ÿÿÿÿþøøøþÿÿÿþ‘‘‘þ   0    ,,,    


vËËËÿÿÿÿûüüüþÿÿÿÿüüüÿkkkÿÿ   ÿ+++ÿÿˆˆˆÿÿÿÿÿúúúÿþþþÿýýýÿÿÿÿÿÇÇÇÿ%%%ÿ   ÿÿtttÿÿÿÿÿþþþÿüüüþÿÿÿûËËËÿ


v    ,,,´´´    ===­ïïïÿÿÿÿûþþþþþþþÿýýýÿÿÿÿÿâââÿÑÑÑÿÿÿÿÿ¤¤¤ÿ   ÿ���ÿÿÿÿÿúúúÿþþþÿýýýÿÿÿÿÿ÷÷÷ÿÒÒÒÿäääÿÿÿÿÿýýýÿÿÿÿÿþþþþÿÿÿûïïïÿ===­    ´´´        \\\Ïÿÿÿÿþþþüþþþÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿ£££ÿ   ÿ���ÿÿÿÿÿúúúÿÿÿÿÿüüüÿýýýÿÿÿÿÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿþþþüÿÿÿÿ\\\Ï               lllßÿÿÿÿýýýýþþþÿþþþÿÿÿÿÿþþþÿýýýÿüüüÿþþþÿúúúÿÿÿÿÿ   ÿ   ÿ“““ÿÿÿÿÿúúúÿþþþÿþþþÿüüüÿýýýÿþþþÿÿÿÿÿþþþÿþþþÿýýýýÿÿÿÿlllß              mmmßÿÿÿÿýýýýþþþÿþþþÿÿÿÿÿþþþÿýýýÿüüüÿþþþÿþþþÿúúúÿÿÿÿÿžžžÿ   ÿ–––ÿÿÿÿÿúúúÿþþþÿüüüÿýýýÿþþþÿÿÿÿÿþþþÿþþþÿýýýýÿÿÿÿmmmß               ^^^Ñÿÿÿÿþþþüþþþÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿýýýÿüüüÿÿÿÿÿúúúÿÿÿÿÿ›››ÿ   ÿ™™™ÿÿÿÿÿüüüÿþþþÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿþþþüÿÿÿÿ^^^Ñ        ÕÕÕ    AAA²ñññÿÿÿÿûþþþþþþþÿýýýÿÿÿÿÿâââÿÓÓÓÿøøøÿÿÿÿÿþþþÿþþþÿúúúÿÿÿÿÿ™™™ÿ   ÿšššÿÿÿÿÿÐÐÐÿäääÿÿÿÿÿýýýÿÿÿÿÿþþþþÿÿÿûñññÿAAA²    ÕÕÕ444    }ÐÐÐÿÿÿÿûüüüþÿÿÿÿüüüÿkkkÿÿ   ÿ+++ÿÏÏÏÿÿÿÿÿýýýÿþþþÿúúúÿÿÿÿÿ•••ÿÿ$$$ÿ   ÿÿtttÿÿÿÿÿþþþÿýýýþÿÿÿûÐÐÐÿ}    444       8™™™ÿÿÿÿþøøøþÿÿÿþŒŒŒÿ   ÿÿÿ   ÿ,,,ÿúúúÿÿÿÿÿþþþÿýýýÿÿÿÿÿñññÿÿ   ÿÿÿ   ÿ™™™ÿÿÿÿþøøøþÿÿÿþ™™™ÿ   8                MMMÈ÷÷÷ÿþþþüÿÿÿþ???ÿ   ÿÿ   ÿÿ   ÿÊÊÊÿÿÿÿÿüüüÿüüüÿÿÿÿÿ¼¼¼ÿ   ÿÿ   ÿÿ   ÿLLLÿÿÿÿþýýýü÷÷÷ÿMMMÈ                       Y¨¨¨ÿÿÿÿûÿÿÿÿMMMþ   ÿÿÿÿÿÖÖÖÿÿÿÿÿüüüÿüüüÿÿÿÿÿÊÊÊÿ   ÿÿÿÿ   ÿZZZþÿÿÿÿÿÿÿû¨¨¨ÿ   Y                        888»ãããÿÿÿÿû³³³ÿ   þ   ÿÿ   ÿUUUÿÿÿÿÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿIIIÿ   ÿÿ   ÿþ¿¿¿ÿÿÿÿûãããÿ888»                               %eeeìýýýÿÿÿÿü²²²ÿ>>>þ...ÿwwwÿôôôÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿïïïÿpppÿ---ÿBBBþºººÿÿÿÿüýýýÿeeeì   %                               Euuuùÿÿÿþÿÿÿûþþþÿþþþþÿÿÿþýýýÿþþþÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿýýýÿÿÿÿþþþþþþþþÿÿÿÿûÿÿÿþuuuù   E                                       Edddðìììÿÿÿÿûüüüü÷÷÷þüüüÿþþþþþþþÿþþþÿþþþÿþþþÿþþþþüüüÿ÷÷÷þüüüüÿÿÿûìììÿdddð   E                                        


       $999Ä¯¯¯ÿüüüýÿÿÿýþþþúÿÿÿüýýýýüüüýüüüýýýýýÿÿÿüþþþúÿÿÿýüüüý¯¯¯ÿ999Ä   $    


                                                   \OOOÔ¡¡¡ÿÙÙÙþøøøþÿÿÿÿþþþÿþþþÿÿÿÿÿøøøþÙÙÙþ¡¡¡ÿOOOÔ   \                                                        ===       =‰JJJ¿hhhÜwwwèwwwèhhhÜJJJ¿‰   =    ===                                                                ###•••                                    •••###                                                                                FFFÝÝÝ                ÝÝÝFFF                                            ÿÿÿÿÿÿÿÿÿøÿÿÀÿÿ  ÿþ  ü  ?ø  ð  ð  à  à  à  À  À  À  À  À  À  à  à  à  ð  ð  ø  ü  ?þ  ÿ  ÿÿÀÿÿðÿÿÿÿÿÿÿÿÿ(                                                qqq                              qqq                    FFF       ```u¤¤¤¿»»»Û»»»Û¤¤¤¿___u       FFF            rrr    ;;;KÂÂÂëÿÿÿÿÿÿÿýþþþÿþþþÿÿÿÿýÿÿÿÿÂÂÂë;;;K    qqq    vvv    ;;;NÒÒÒþÇÇÇþ¥¥¥úúúúüýýýýýýýýøøøü£££úÊÊÊþÒÒÒþ;;;N    vvv       ÃÃÃçÄÄÄÿ   û   ÿ‹‹‹þÿÿÿþÿÿÿþ‚‚‚þ   ÿ   ûÉÉÉÿÂÂÂç           eeexýýýÿ®®®ú   ÿ   þrrrÿÿÿÿÿÿÿÿÿrrrÿ   þ   ÿµµµúüüüÿeeex        £££¿ÿÿÿÿþþþü”””þyyyÿZZZÿÐÐÐÿÿÿÿÿíííÿyyyÿ–––þÿÿÿüÿÿÿÿ£££¿       	¼¼¼ÞÿÿÿÿüüüýýýýÿÿÿÿÿÚÚÚÿJJJÿÕÕÕÿÿÿÿÿýýýÿþþþÿüüüýÿÿÿÿ¼¼¼Þ   	   	½½½ßÿÿÿÿüüüýþþþÿýýýÿÿÿÿÿÙÙÙÿJJJÿÖÖÖÿÿÿÿÿýýýÿüüüýÿÿÿÿ½½½ß   	    ¥¥¥Âÿÿÿÿþþþü“““þ{{{ÿïïïÿÿÿÿÿÔÔÔÿZZZÿvvvÿ˜˜˜þÿÿÿüÿÿÿÿ¥¥¥Â        jjj}ÿÿÿÿ®®®ú   ÿ   þyyyÿÿÿÿÿÿÿÿÿnnnÿ   þ   ÿ´´´úþþþÿjjj}           ÇÇÇìÄÄÄÿ   ü   ÿ‰‰‰þÿÿÿÿÿÿÿÿ„„„þ   ÿ   üÉÉÉÿÆÆÆì       ƒƒƒ    EEEX×××ÿÇÇÇý¤¤¤úúúúüýýýýýýýýøøøü¢¢¢úÊÊÊý×××ÿEEEX    ƒƒƒ    ………    GGGWÉÉÉòÿÿÿÿþþþþþþþÿþþþÿþþþþÿÿÿÿÉÉÉòFFFW    ………            JJJ       kkkƒ­­­ËÂÂÂäÂÂÂä¬¬¬Ëkkkƒ       JJJ                    vvv                              vvv            ÿÿ  ü?  ð  à  À  À  €  €  €  €  À  À  à  ð  ø  ÿÿ  <svg xmlns="http://www.w3.org/2000/svg" viewBox="-13 -13 58.2 58.4">
	<style>
		.st0{
			fill: #000;
		}
		.circ{
			stroke: #000;
			fill: white;
			stroke-wdith: 1;
		}
	</style>
	<circle class="circ" cx="16.1" cy="16.1" r="25"/>
	<g> <!-- viewBox="0 0 32.2 32.4" -->
		<circle class="st0" cx="5.5" cy="5.5" r="5.5"/>
		<circle class="st0" cx="26.6" cy="5.5" r="5.5"/>
		<circle class="st0" cx="5.5" cy="26.9" r="5.5"/>
		<circle class="st0" cx="26.6" cy="26.9" r="5.5"/>
		<path transform="rotate(-45.361 16.087 16.23)" class="st0" d="M1.1 15.1h30v2.3h-30z"/>
	</g>
</svg>‰PNG

   IHDR         +ƒ ôIDATxÚìÁ   €�þ¯î                                                          €Ùƒ     ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUØƒ     ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUØƒ     ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUØ»ƒÐ6Ë8 ãé¦©Í´]ÚC[:r±9DÙFD]qH)GJ;…™Âæ,Ì‰Œb­CKçaÙUë©èe²‚§d —Ñ9ØÅ2v
¶Ã”Î‰A´I:ŸÃÿª(NKÛç�ß¥mÒ÷{ßÿåk?Z3333333333333333333³‡Þ6<Š$RhÃcHãqt ;ÑvÆÇ:âkÒñš6¤�ïÉ{›™™™™™™Ù?®I¤‘A²Èái°/bE”ð2FðãŽb'ñNaïc“8��0…i|¦1Ÿ;�ILÄkÇq*Þó$Æp4¾çáXÃH¬©„"†cÍûPˆkÉ!‹d�F-	333333³Ö6´£ýÀn<�!”0Š×qïbÓ(ãSÌb—ñ®ãÜBwð#îã7¬àÁ:Y‰5Ü�5ÝA·bÍ×ã.c³q�eLc"öàXìÉ(JŠ=Û�ô£í>…`ffffffÿuIt 9°/aoà>Äy|†‹˜ÇU,â6~A„zìÍm,â*æq1öò|ìí‰ØëÑØûý( ‡>t ™0333333û“ÁèÃ“Ø‹PÄÞÂ$.àÌã{Tð+š	oâÿ/ÍØóJœÁ|œÉLÆY� g¸7Î´œ1gmffffff›º$2È"�ç0ŒWpc_ã–PÅZÂ›î�fU,áZœéç˜Âñ8óá˜�<²Èøô€™™™™™ÙÆª½Èáá ÞÁY|‰+XÄ={¿%5q‹¸3q6fä †bvrèE{ÂÌÌÌÌÌÌÖ­º‘EÏâ ÞÆ9|…ÜE#áM¯þžîb!fè\ÌÔ�˜±<²èF*affffff­íH£( ˆ1”1‡ø	5¬¢Ž¦�ïë_XCu¬¢3vs(cE0€¤±=affffffY+º�Eƒxã˜Á·XÂïXEÃ›|­ƒ54°³¸³9ƒñ˜ÙAä‘EZffffff[´´!ƒ~<…>À,°ŒÔ½Ù×ù¡@+XÆfc¦K1ãýÈ -	33333³MX+v »0ˆ7QÆ7¨àgTQóÿåk¨£†jÌv%f½³?ˆ]èÆŸ03333³�XRèD/öàÎànbUÔü#}ÚB¨¡ŠeÜÄ%œÁ!ìA/:‘ò)3³?Ø;³�*ó0»–‘“d54„zÓM�Ø¦„!E-tSÑBÐ"´€D$]Õ�Ab•u‘�ÔE��dZ4-ZdšIešæÉô�‡÷"šf¦)2ÓÎï�Äå|ÿÿûþ<ðžï;ßB!Ä`#£q&`
nÂ|¬ÀlûøÞ}�R~j7v`6`æã&LÁ‡Ñþ¿&„B!„H(Fâ�I¸ó°Ÿavèsö¥üf{±[ð–cnÀ$�#0RW!„B!~‘…±87`.–b5¾Ä€~)ûÝ^àK¬ÆRÌÅ8c1ÊÿG…B!„â	ÅŒÂLÄu˜ƒ%X‹�ø>DÃ™”?Ã÷ØˆµX‚9¸1£0BW!„B!þoðŸ€‹1‹°_`@Å74ýƒ¾NCÔ>à¬Ä"ÌÆÅ8A/!„B!À‡‚0ŒÆé˜�X†5øFÇ7pƒyXXØßÿ‡ndd¤�9ÒÆŽk			6iÒ$›:uªÍœ9ÓRRRlÎœ9–ššjsçÎµyóæYzzº-X°À.\hK–,±¥K—º|íßãgþ;ü®ÿë�ÁcùcòØ~ŽåÇäØ¾ÖâþËZ?ß�^h8{ðÖ``NÇhÓB!„BÏÀŽñ¸b1Va#v…h€ê·aþóA~øðá6~üx›<y²%''ûÐ½bÅ
[³f�mÞ¼Ù233mß¾}vèÐ!;vì˜Xaa¡�;wÎ.^¼h—/_¶+W®Øµk×¬´´ÔnÜ¸a·nÝ²;wîØ½{÷¬ªªÊ<x`>t=zä>~üØ­©©±ÚÚZ{òä‰Ë×þ=~æò».ëòXþ˜<¶ƒcù19¶¯�µøšX›¯‘µúšY»ï�½øžØ›ï‘½úžÙ»×€ZxM>©‘^4è»°«°ârŒÇp½  „B!Ä¯G&ažÆ2¬Ã@ˆ¤ïÑØ¸¸8›={¶ŸM_½zµmÝºÕöìÙc‡¶ãÇ�ÛÙ³g­¸¸Ø‡æŠŠ
»{÷®1\ûÐ]WWgÏŸ?·W¯^YSS“µ¶¶Z °ŽŽëêê²žžëííµÁkôµ²f_;{ð½°'ß{ô½²gß;5ðZ”””µñQ+¯µóRK¯)µõSë Ï[?À:,ÃÓ˜�Iþ!„B!„²ü†©˜……X†õØ¢!è«6l˜ÅÇÇÛ¬Y³lÑ¢E~{ûöí~f;''ÇNž<i.\ð3áåååÆPëgÐŸ>}êCoKK‹µ··[ww·‰/C�¼VÔÌkG½–ÔÔkK�½ÖÔÜkO¼ôÄ{C�¼Wô,èsûvb=–a!faª?w!„B!=cp>îÅóø'6…hÐùÏËöcccmÚ´i>D®]»Ö²²²ìÈ‘#~){QQ‘]½zÕ/}ç¬µ¥¯_¿¶·oßZgg§‰Ÿµ÷Ðï	½ñÑ+ï½óÒKï)½õÓk½�àË6áŸx÷â|NB!„B
B1Wâ,ÆJlÑ0óÑQ£Fù ¸lÙ2?zvv¶åææ—�û{Ø9ÃìCd}}½577û%ìbhC½—ôÔ{K�½×ôÜ{O<dÂ³AF‚þÿä3[±‹ñ ®Ä8Ý/@!„Bˆ�ç\Œ»ðÞÄf´`6&&Æ¸¹œßhnÕªU¶mÛ6Û¿¿ååå7ªóØUWW[cc£}øðÁDPâ½'ž2áÙ #ž2ãÙ!Cž%2ì/6ãM<…»p±?	!„B!~¿c:fâ¼�íhA¦ôÜÄ‰---Í‡µ;vøðvâÄ	»té’_Îîýýä}}}&Ä×@V<3dÇ3D–<SdË3FÖ<sdÏ3HƒÑv¼�g0Óý¹I!„BñÝŒÁ4Ü‰§ð6¶ÛYý)S¦øÝà×¯_o»wï¶£G�ú{½9{ëw–÷î�	ñ#!cž52çÙ#ƒžE2éÙ$£Áxµ@;ÞÆS¸ÓtÏ !„B!¾�Ñ˜Œ[0¯cÚ¯ntt´%&&ú@µqãFãNï~i6gbýsètó=1h ‹žI²é%«žY²ë&Ëži²¶áuÌÇ-˜ìÏeBñ{wóåÆqü¤¦¡Áñ„¯è�Ðò•^«…Ø¢$tƒŠ¤"-¢@ˆ6mZ¸ZäFÜ%ˆ J.ÔB\ˆI„¢-Ä6’HhŽ:×ùrm�àéÔóøûÀ÷?x®�yæ¾EDDä_ÒéÝ¢n§/da-%%ÅŠŠŠ¬¦¦Æ¬££Ãï²©©)[YYÑõy8<³þìòû³Ì3íÏ6Ï¸?ë<óþì3aî�S7Ý¢3¾ãDDDDDŽ¸¿é&=¢ZóIüvýúukmmõßT÷÷÷ûÕmËËË:y_B}#Ï¸?ë<óþì3>ÌDØo X¥zD7}ç‰ˆˆˆˆ!ÑUê¤çô‘öÉÂT^^ž]¸pÁnÜ¸ammm~íÚèè¨ÍÍÍùî"G3à³ÀLøl0#>+ÌŒÏ3¶öé#=§NºªŸˆˆˆˆHX§Rª§Çô&lwõçææZuuµ]»vÍšššüäôññq›ŸŸ×!}"8d�Yñ™av|†˜%Ÿ)f+l¬ÓzLõTê;RDDDD$àrè
Ý£úLI² —��m•••VWWg---ÖÓÓc¯_¿6®PÓA}"‡Äù,1S>[Ì˜Ï3ç³Ç†¡$}¦ºGW|gŠˆˆˆˆH:•S„žÑ,%ÂpBÿÙ³g­¶¶Ö"‘ˆŸv>11á¿mÞÙÙ1ùy˜1Ÿ5fÎg�ôYd&ÃrÓ@‚féE¨\ŠˆˆˆÈïì]¢v¥YPKMMµ‚‚ãdÿmrWW—ÛÂÂ‚mmm™ˆü:Ì Ï"3é³ÉŒú¬2³>»Ìp�‹Ñ(µÓ%ß­"""""¿�:Mõô”>P<¨‡úeeeYII‰q]™ŸRÞ××gÓÓÓ‹Ålww×ö÷÷-™Lšˆür>‹Ì¤Ï&3ê³ÊÌúì2Ã>ËÌt�ŒÓzJõtÚw®ˆˆˆˆÈÿìO:Gwè%Ei�,H¥§§[~~¾UUUù•d>´±±1ÿíñöö¶ííí™ˆ3ë³Ëû,3Ó>ÛÌ¸Ï:3Äö(J/é�ó,""""ò£l:O÷i’¾íP¿ŒŒ?U¼´´Ôý÷Äoß¾µµµ5ã›D}Ã/>ËÌ´Ï63î³ÞÐÐào°|ðÐÀï4I÷é<eûnù�§\ºLÝôž¾Q"Hÿôçääø?ýÍÍÍÖÛÛkïÞ½ó677-‘H˜ˆ„–Ï8³î3?33ã;€]à;�Ý´ô�ÞS7]¦\]%(""""‡ù¶ÿ$S„^Ð§ }ãÏoý•ßòòrëìì´ÁÁA[\\´õõu‹Çãú¦_äˆbö}°|'°|G”••ùÎ`wí�€Oô‚"TL'õV€ˆˆˆˆT:Ó]zE_ƒòmZZšeffúIàííí~BøÒÒ’mllèª>ùáƒìßìßìß%ì” ½ð•^Ñ]*Ö5‚""""ò#Çè•Ðš¤(ÅƒòOaa¡µµµÙÀÀ€ÍÎÎÚêêª¿ò+"r@¾3Ø¾CØ%¾SØ-Aú0 NQš¤TB'ôF€ˆˆˆˆü�Ê¤‹ô„f(FÉ üÓ_TTd·oß6þP÷ßôG£Q?\Dä�|—°S|·°c|×°s‚òa@’b4COè"eúÎ‘Ø»—¨ã8Žãt¤¢¢)&	Ž)‰N¹("aKpIN·	‡NnNÖ$‚!ä N¡àiƒm*Á7Hˆ\È-¦\ÇqáY¼{ñ&š‚è‡úñz>àù/¼>ÜÇ¯ß/  ÿ�ËêŠº­ž©w*ú�þÊÊJknn¶ÁÁA›��µ��Ëd2üèpÚ—¾5Úßm�o‘6é"\dÕ;õLÝVWü   @É»¤ªT�z®Rê“²P‹D"V__ïŸïšœœ´õõuK§Ó–Ïç Îš¶Ç7H[ä›¤mò�ÒV…~ðI¥ÔsÕ£ªø×   €Òþ†ÿµ R*ò�þ²²2koo·x<nËËË¶³³cÙlÖ  ¾IÚ&ß(m•o–¶+ôË€¼J©õ@Õq   P"ªI=T/Õž*†ú£_�Òú§¸¢Ñ¨ÍÏÏ[2™´ƒƒ>Ù hÚ(ß*m–o—6Ì·L›òe@Qí©—ê¡jâ   ×UõX½Riu¢,Ä¬¿¿ß¦§§ý…[ûûûV, .m—o˜¶Ì7MÛæ§­µ•V¯Ôc?;   pa\S�Ô‚z¯NBý‹gg§���ÙÒÒ’moo[.—3 (Ú4ß6mœo�6/ä'NÔ{µ ùY  €`5©!µ¨öÔWe¡ÕØØèßÖþþ×~l J�¶îÇSÚ@ßÂ@/¾ª=µ¨†ül  @0®©'jQ}PZåååÖÕÕe£££–H$lww×Ž�� þ3¾}Ú@ßBm¢o£62ÔË€jQ=á‰   €óU¯î¨)•R_”…TMM�õõõÙøø¸­®®ú§³  Î7QÛè©­ôÍðà‹J©)uÇÏ   œ™uWM©·!þ�kk«ÛÌÌŒmmmY¡P0 ÀÏi#}+µ™¾�ÚÐPßðVM©»~  àÔÔª{ê©J†ö?þÕÕÕÖÛÛkzÑ•?ÚšÉd ð{´�¾¡ÚRßTmkˆïHª§êžŸM   øgÊÕ-WoTAY(ÕÕÕYww·�ŒŒØÚÚš àïhK}Sµ­¾±ÚÚÐ.
ê�Š«[~V  à�EÔMS¯Õge¡ÔÒÒb611a›››¼Ô N�¶Õ7V[ë›«íí"à³z­bê¦Ÿ]   ø-7Ô�J¨œ²ª¨¨°¶¶6‹F£677ÇKý àis}{µÁ¾ÅÚä�.r*¡†ü  À/]W÷ÕõQYÕÖÖZGG‡Åb1[YY±ÃÃC œm°o±6Ù·YÒEÀGõBÝ÷3øÆÞÝ³´†Q¯4¤“bU$H;´:¸•B$‚ƒNÁÅ�PèÖÁ¢‹K»‹àŠ{…,.Bq
¡ "¸(¾BJ†HÁ4ÉÕÃÅ³•ÒE½Ÿèÿç+œ“<Ésß  à/íÊ[å³r¬Ôãò~¿î¨öwP···­T*  ¼“ÕÍÞÑêê8�PWŽ£M{Ë�   "mÊeVù—“ý{zzlttÔæææ,ŸÏó~? Ä˜:Ú»Z�íÝ­�Ó�ß£�{ã›  ð%•×Ê{å[\~ñO¥R611a‹‹‹vrrbÕjÕ  �A�íÝ­÷.W§Çéß¢Í{¥´>  x$º•ie+.WúõööÚØØ˜h¼¸¸0 @Có.W§{·«ããtuàeÚ·  à{¦¤•%¥úWÿ¦¦&ëëë³L&c+++vyyÉ/þ ðpx§«Û½ãÕõÞùêþ8¼Pˆ¶0íÛ  ð€´)ÃÊGå ô{þ‰DÂúûûmrrÒ677íêêÊjµš $ïxu½w¾ºß7@[‡Ñ6s>   ht	¥[É*_•ß�¿øûÁPétÚVWW­P(X½^7 Àã Î÷î_[[ó-Ð&ÄáAÀïh#³J·o'  @ƒ^ë·¬œ+•�_ü;::üdè��;==µr¹l €GÉ7@[à›022âøA@%ÚÊe®  �ä©òBù *7!¿øwvvÚøø¸­¯¯Ûùù¹U* @|ÎÎÎ|#´¾�Ü(‡Ñ†¾ðM  ˆ¡&¥M™RrÊ¯�‡û%“I²¥¥%Óîñ ü“6Â·B›áÛ¡	}Xà/%mj›o,  @L´(/•OÊ‘RV,@üCÛàà -,,X>Ÿ·ëëk @þK›áÛ¡ñ-Ñ¦„|PVŽ¢m}é[  PBy®¼Sv•ŸŠ…Hkk«Øüü<_ü ·ñ À7EÛâjß¢mÝ�¶ö9‡ €P÷Ï([Ê¥â¯þ---þálvvÖööö¬T*  ·A›âÛ¢�ñ­Ñæ„z5 mí–’áµ   p_š•”2§ì+7¡Þóïêê²™™ÛÙÙ±b±È•~ €[§mñ�ÑÖøæh{Bžp£ìGœòM  ¸#IeJÙVŠŠÝwš››­½½Ý²Ù¬år9¿Æ©Z­  wÈ·F›ãÛ£ò-Ò&…zPŒ¶xÊ·Ø»c–¶¢0Œã`JI,mˆ[êR'A�œãàâ¨è&ºj@ttÐ]Z¥cAÈÐA—nÑ/P(˜�`h”‡Vc¾}x¹th¡•"ç˜äÿƒç3üOÈ¹÷ €G”Ò†´÷Z-ÖuÿL&cSSSþ¹¦ããc~ø ‚S{¼Aj‘7ImŠùX@-ióï   �!£Íi_´«X×ý…‚•J%;::²V«e  Dä-R“¼MjTÌÇ®’FÏy³  þÃ3mP{§Fú×ß_º´¶¶f•JÅšÍ¦ ð„x›Ô(o•šó6À¡öVô†  <PN[Ô>kÍB/—ËY±Xô—.]\\  O˜·JÍòv©a±n4’v/zË  þâ¹6ª•´oš…^:�ög*wwwíôôÔ  h'j—7L-ó¦ÅhiÒð’6êm  øÍ+m^Û�ô¯¿_�\__÷«”··· @ò†©eÞ4µ-æm€}mÞ  �Ô6´¯š…^¿-,,X¹\¶ËËK  ¨iÞ65Î[£±IÛ7¼õ   «½Ôf´²ÖŒqÝzzÚvvv¬^¯  �H�óÖ©y±h&­Ÿñö €®óZ[Ò*š…\OO�Ûòò²_‘¼¿¿7  :˜·NÍóö©�ÞÂÐýMš¿äg   ÐÒÚ˜öAû®YÈõõõÙìì¬íííñY? @×Qû¼�j¡7Qm½É`ÌÏ   cåµ¢V	ý]ÿÞÞ^+
¶¹¹i''' @7S½‰j£72d““3@E+úÙ   t””6¢migš…ÜÀÀ€­¬¬ØÁÁ�ÝÝÝ  0o¢Úè�T+cÜ8Ó¶´?+  €¶—Õ&µOÚµf¡–ÍfmbbÂ¶··íüüÜ  ÀŸÔHo¥šéíTCCî:9#Lú™  ´­7ÚªVÓ,ÔR©Ô¯oúW«U  ÿ¦fz;ÕPo©šr5mÕÏ   ­¼ÐÆµ�ZC³PËçó¦ÏùŽnnn  <œÚéUK½©jkÈ5’³Ã¸Ÿ%~²w÷,mP†1EHš¡ZjœqEp\ê$.B:(¸8ø‚¸šÑÍAêl]�
Rq©K†:fP‚ˆfÁÄïÓ‡C¶BiÅœÄr_ðü†ûøÆä  -ïƒ6£•´{Í"ÖÞÞîŸX,//[¥R1  ðlÞR5ÕÛªÆF>¸×JÚŒß   %%´>­ kµîîn›žž¶íím>õ à…¨©ÞV5Ö[«æFîX+h}~c  €–‘Ö&´­ÈúK§Ó6<<l«««vxxh  àÅycÕZo®Úý�[Ú„ß   éÞk9í§ö YÄ:;;-—ËÙÞÞžÝÝÝ  ho­^èíUƒ#<ÔoŒœß   )Ú´-¯íkQßõïííµB¡`Õj•÷ú DÍõöªÁÞb59ò!À¾–×zü  aÞjCÚWíL³ˆuttØÔÔ”íîîÚÅÅ… €xj°·XMö6«ÑQ;«ßC~‹  €†KjãÚí6"ø‰DÂºººlqqÑìññÑ  @ó¨ÅÞdµÙ­VG=¸­ß ã~“  €†ù¨Íkå¨?þ“É¤�ŒŒØææ¦Õj5{zz2  Ð|j²·Y�öV«Ù‘ÊÚ¼ß&   !¯ø[ÓjAŸúû�-,,X¹\¶››  -Ç­V{³ÕîÈÿ¨ik¼* €—“ÒÆ´oÚUÔ§þ£££¶±±a'''  ZŸšííVÃ#ÿàª~£ŒùÍ  ž-£Íi¥¨ùÏd26;;kÅbÑ®¯¯  ¼Þn5Ü[®¦G~% ¤Íùí  þYV[Òªñnkk³þþ~[YY1ý¨ßõ à•RÃ½åjº·]��zPÕ–ü†  %¡h_´Óˆ`§R)›œœ´��;??7  ðêyÓÕvo¼Zõà´~Ãð»   üÙí“ö]»Œu6›µ|>o•J…×û ðñ¶«ñÞz5?ê!Àeý–ùä·  øÍ;í³VŒú¾ÿàà ­¯¯ÛÑÑ‘ €_ìÝ±J›a†áÚB•,µ´PBRÉRâ £ƒ.‚ˆ'�ªà�ÀAÍÜãH7Ô]p)­„ŽEµSk	uˆÞ>¼|kiiû}˜ä¾à9†÷NHþ¿séÖûÍ×íOù\€÷Ú[o   "¯´í,ÅQîïï·R©dÇÇÇÖl6  t>Ý|¿ýj o�ÍÚfÅ[  <*h5í[ŠCœÏçm}}ÝÎÏÏ  to µ€7AŠö�Sóæ  ‹½	ñkŠ\,mkk‹Ÿü `ü%@Màm�¢ABëÔ¼}  è2O´im7ÅÃþ2™ŒMMMÙþþ>?ù  NMàm FðVHôpÀ]mš‡ ºEF›×>h­ØÇ6›ÍÚòò²�žžòn  ào5‚·‚š!Å— ­Ð@óÞD  t°Ú¬öQ³Ø+
V­VíòòÒ   ~Á[AÍàí�¢QBÍz Ð�òÚªö9öQíííµÉÉIÛÙÙ±››  ø5ƒ·ƒÂ["v¯„&ZõF  ƒµmíGìc:00`årÙêõºµZ-  øSjoµ„7Eìn	m´í­ @›ëÑÆ´wZ3ö²µµ5»ºº2  €¿ä-Q©T¼-|	Ð­4æí @z¬Mh)>ü�ŒŒØÆÆ†]__  À?ò¦ØÜÜ´ÑÑÑT_hÞP  ´‘§ÚŒv¢Ý§ø¿ÿáá¡ÝÞÞ  Àâmqtt”ê¹ ÷¡�f¼¥  hÏ´9í“f1788hV¯×yÅ  ˆB�á­¡æðöˆÝ7¡¡æ¼©  xÀžk‹ÚYìã˜Ëåü�½  ™7‡ÚÃ$vç„–Zô¶ àz©-i_bÅááa«ÕjÖh4   o5ˆ·HìÞ	Mµä� ÀÑ£½ÖªÚ÷˜‡°¯¯ÏÆÇÇmooÏîîî  üdïþYÚ
 0Œ“TMiG—qËqTÔ%‹1Ø¯ “_ ‹«8ØQºwÒº7¡R
bhpuqJ 	4bH<}9Ü±Ðžãóƒ÷;<÷ïÅ€yƒ¨E¼IÔ&ÑG€zÒXoùB  `ä´=­ýð¿²²bçççÖív  à©¨E¼IÔ&ƒ84´=o.  žHJ›ÓÞkmÍ¢699iårÙªÕªõz=  xbÞ$joµJô �4×¿  Ú„–×>D~ã?�NÛìì¬íîîÚÍÍoú  CEmâ�¢VñfQ»D~$í•ç3� €AIióÚG­£YÄR©”år9;88°V«e   CÊ[EÍâí¢†‰<t’›ç—  €himAûý—ÿ|>oGGGÖl6  `Èy³¨]¼aâ	à-¶àm @€qmQû¬Ýk±±±1«îÉÉ‰u:  x&¼]Ô0Þ2jšÈ#À}Òd‹Þh  <¢ŒVÔ¾h]Í"–Éd¬X,ÚÅÅoú  Ï‘7ŒZÆ›Fmyè&mVôV à¼ÒÖ´oZO³ˆe³Y+•Jvuueý~ß   ž)o5�·�'òÐKmÍ› €ÿ0¡­k_µ¾f›šš²��»¾¾6  €Q¡¶ñÆQëDúI«­óu  À¿z­m&WåÍ"6==m•JÅnoo  `Ô¨q¼uÔ<‘G€‡¤Ù6½á  øãÚ–V‹|øŸ™™±ýý}k4  0ªÔ:Þ<jŸè#@MÛâÅ€ €?5¡mh—‘ÿ…BÁ­^¯  À¨Sóxû¨�¢� —Úÿ  ø�¬VÖªšEmiiÉNOO­Ýn  Àáí£òŠl­¤åÊÞv  üÂm[«iµååe;;;ã3  àERy©‰¢� 5mÛ  —ÑÞiß5‹ÚêêªÛÝÝ� €ŸìÝ=K[q†qrjh+É`¥êÐMºõ#ˆ8‹¨ 38É"H&I	8¹ºwö8v(Ô±KÍbpÐ$8(•äéÍCÆBßòH“\?¸?Ã¹Î?'ç`\©…¼‰ÔFÑ‡ ß´œ·  òJÛÒ.4‹X’$¶¾¾nÕj•_þ  DMäm¤FòV
<¸Ð¶ø:  àµ¶­Õ4‹X:�¶\.gµZÍz½ž  Ày©‘¼•ÔL‘‡ 5mÛÛ 0–ÒÚšvõ¶ÿÉÉIÛÜÜ´ÓÓSnþ  ~~à­¤fòv
ü:À¹¶Æ'`ü¤µUíL³ˆe2ËçóV¯×¹ù  øÅ!€šÉÛIù$À™¶Ê!  Œ�—Ú†V�úåjjÊvvvìòòÒ   ð{ÔNÞPj©È'ªÚ/€Ñ7ýØ6›µB¡`�FÃ   ðgÔPÞRjªð¿x FR¢­h_µnÄezzÚŠÅ¢]]]   þŽZÊ›JmuÐí7áŠ7" `¤LhKÚ­õËÿîî®5›M  À?ñ¦R[E>	Ðí·áO ÀèHiËÚgíI³A.•JÙÌÌŒíííÙÍÍ�  ` ¼­ÔXÞZj®ˆC€§~#.{3 †ÞíDûqz<77ç¦ëëk  À@yc©µ¼¹"Z®ßˆ'ÞŒ €¡ö^;Ö£nþ+•ŠÝÝÝ   Bxk©¹"µcoG ÀÐy¡-jŸ´Í¹$IlaaÁ¬Óé   Bys©½¼ÁÔb‡ ýv\ô– �wÚ‘Ö‰8%žŸŸ·R©d­VË   ð<Ô^Þ`j±¨':Ú‘·$ `(¼ÕµûˆÃìì¬•Ëe»½½5   </5˜·˜š,êà^;ô¦ ü·RÚí£Ö	xÛ¿_hö÷÷­Ýn  øÁÞ«´†a§lAZ0¡¡dÌÐIëÐ‚ƒ“‚dÉ’)c\E7Gé-8fÊd¼!85Ù²�8H	q¨hyûð’+hÏkNÂÿÏ-œüùÎ!0j1o²B¡u;ÀïiS¸  Ò)¯ík#Í’^>Ÿ·ããc�F  €ÙR“y›©Ñ¢¾iûÞ˜ €Tù¨íjw? ÙlÖŽŽŽl0   ÒAmæ�¦V‹:¸Óv½5 ©ðA«h·þ••;88àž  €R£y«©Ù¢nµŠ7' `¦Þk;ÚuÔ›ÿ½½=Þü  ¤—·šš-òK€kmÇÛ 0ï´Mí—öªY’[^^¶Z­fý~ß   �nj6o75\ÄÀë´97ùS@ ˜�oÚ¥6Ö,É---YµZµ^¯g   ˜j7o8µ\Ä!ÀX»ô ¼©Uí\{Ñ,Ée2+—Ëvssc   ˜/j8o95]Ä!À‹vî-
 x_µ3í�fIokkËºÝ®  `>©å¼é"ZqÚ gÞ¤ €P_´Ó¨»þK¥’µZ-›L&  €ù¤–ó¦SÛEŒ´SoS @ˆOÚ¡vñ ßÞÞ¶N§cãñØ   0×¼éÚívä— ÷Ú¡7*  Q­¢õ#àvuuÅ›  €¢¶óÆSëEôµŠ·*  1ßµVÄƒ{}}Ý�†=??   ‹Ï[OÍuÐòV $â‡vqÝßÚÚš5›M{||4   ,&µž7ŸÚ/êzÀoV ÀYÕšÿø_,­^¯ÛÓÓ“  `±©ù¼ýÔ€Q74¹ þÝgí§ö Y’ËårvrrbÃáÐ  À_öÎ=4ç=Žã¹nsÙph¹'Š49Mä¹–‘²r�F¹çÖF‡dY.eÆ¬�åš
‹?FŒFö°Íml–Íu¦³½Ï§÷_GéÇùýŽçy~ïW½ÿÑöXÏóëû¼¿Ÿ«ž€ÞÏ< ½ óA zÖô°B!þ¦¦RœTxx8–-[†'Ož@!„Bx
z@ó‚ô„.JMèe…B|¡¦“Ï'‚9sæèò/„Báí  =¡yC7‚ >S=­Bˆ$ÆT`‚“ªW¯&L˜€{÷îAÀË;�9øõë×(//GII	>|ˆû÷ï£°°>Ÿ|NŠ‹‹ñàÁ<~ü¥¥¥¨¨¨@UUjjj „âç�ãïß¿ÇË—/ñìÙ3ØÍ³º¨¨ˆg·�áß<Çígù;ÖÎ×ÂžzCóˆn
èi…Bü-¿™²L8}ù4h.]º„ÚÚZˆàæíÛ·xúô)/óW¯^EVVŽ=ŠŒŒlÛ¶ÉÉÉHJJÂ’%K0oÞ<Ìž=qqq˜6m&OžŒI“&aêÔ©˜1cfÍš…¹sçbáÂ…X¹r%Ö­[‡Í›7#--™™™8uê.^¼ˆüü|^¼x¡ �Bü·½íÒÚ¥�ùœœœ>}‡Bzz:¶nÝŠ6°�{ñâÅHHHà9>sæLžãv†›xŽóßâããa?ÃŸµßáïÚkðµ<ˆ3gÎàòåË¸}û6=z„W¯^É+x~Îæé�ÐËfÑÛ
!„ø&¿šöšª�¾ü÷ïßçÏŸWÄ?ø²@¼pß½{ÙÙÙ8vìRSS‘˜˜HÃ7nÜ8ØgÏi¿Íš5s<º_¿~}´mÛÑÑÑ1b¦L™ÂžÂM›6aß¾}8{ö,òòò`&–Ù*!„_óéÓ'fæoÝº…sçÎÁvµ3P»bÅ
LŸ>cÇŽåîöŽ;¢qãÆŽŸã�5‚½6ÿ�Q£Fñÿ\¾|9€yÊÊÊÜ^/ÁÏÙü‚A€jÓ^z\!„_ñ‹)ÙTi‚“êÖ­÷¾~þü"°ùòå�¢™1flvïÞÍL~ll,zõê…–-[ò3÷5hÐ ]ºtÁðáÃYA�’’‚#GŽ0Ó`•
!<‰}³BëÆ�8yò$¶oßÎj¬˜˜tïÞ�r9ÇÃÂÂø7ÙßÆê�;v°ê+77Ö?Îà…šç’^Ñ<£ÏR¥)™^W!	1Å›ÊLpPÌÎnÙ²ïÞ½ƒÜr~ëÏg†ßJøiÂÆŒƒvíÚ1oÑzÇ#ö.ÌŸ BCC¨°’T>—'Nœ`Öëùóç¨««ƒB!ì»·^kfYwîÜ‰ùóçcÈ�!hÓ¦ÏqçÎp÷ÏñÈÈH8�íc`k‚µ)°M4ôŠöÝLïèÂ3TfŠ§çB�SÏ4Ú�‰ÿ-Z´€•êK9 yóæ¬¬Ÿäõë×câÄ‰èÔ©6lèFÐ93Ù¼ys<K—.…µ°:ÀÊLÙÿ*„ÜWÍÀæÍ›79ÅúîYÊß¡Cž}ÁtŽ[å+½V¯^�Ã‡ãúõë°�±
ê&ôŒæé!]Ú0šÞW!<J}SoS¶©Ö‡Ä/d+»æ„w0‘w^ú�?´Ç,DD?O/È²`,5µç–•.\€4·BP—'+ígïü¢E‹0`À 4mÚÔ3çx“&MÐ·o_Ø,´ ˆ’�½£}»ÑVXkÊ6õ¦BÒÁ…¡ì½¶L×þÔÕ*ïÏX†„“žïÜ¹ƒýû÷sˆžQ÷ È*EEEaÍš5Ø
Bõš
!üv6Kee%®]»ÆÁyC‡…]ú=ŽÛ{ÀÊ {O±ª ¾WÂï¡w4I/ižÒ•¡€ôÀBá1ÂMI¦
‡/Nœä{åÊ­ðñóa;açÄçU«V¡gÏž4K6üÉó¦ñ/œÐ¾}{Œ?{öìaŸiUU„âgóñãGØ@SVmY?<‡ž†…†Á.Lž?¿M”µ­±* sçÎ\Chí¼XVWWCø}½¤yJ7ÚV*LIôÂBá¡¡±¦§¿h{ôè›Ð«²iÿ„“ï‹‹‹¹æÉVô1Ûok�<o¿§ªÅ¦Qs€ í¯æNlË¸é9Bü”ª-ŸÏÇ-,Ã†ƒ•I+xû�ëm-«ÒÒÒX`Ã•¬ðïõ€ô”æ-Ý˜ATbŠÕP@!„Wˆ2å˜êLpJ]»vEzz:³ÂÿJDmeËüGŽ	Ëö+Kôƒ.!!!Ì´%&&"??>|Ð°)!Äÿ²¯¿¨¨ˆ%íÖçÎ ¤U*yþ\þ‘ê.{ïXù¶qãFØ{ª/?¯tÙµk=¦ÃÏB�)‡žX!‚|â¤)Ãá¾®Z»v-§Çÿ¡¦¦¶ï™Ã�l¨?'»ÀzÞ :Gtt4[(òòò`Õ
!œ†åê………HMMEŸ>}ÐªU+X6Ôóç°•]¬žè×¯RRR`CpðßÍDô˜æaÜ˜�aŠÔf !D°iúÝá¾FÒãââP^^á7esœ`Ÿ™™ÉŒëÖ­eÝKJm{ ×låææ2 „²w6¯´®a/å”(_1ØDdàcbppDÖ #,…H¢m™()ƒ£�¤µ{`ä{¸‹Úe‘�R'‘$I9>Ú«Í€ÕIû>W÷àÎätNÏZï»ÞçúÕõxô¬ë}î�ËÀ®Ùš››“ŠŠ
ÁÇªõ÷m¬t‘x£³æÁ`PðØ¢{â.à1ÕkÂsÆbÀïê‘	!Äc¤Bè›é¹ÌÓér4â<È¯×È£��ñûý’‘‘Áÿ8> EQ«WWW¬$Bþ÷È’GtÆ1~Lf‰óC@]]�¶œã¸çÅeÀkªç4ïkÔÔ+Bˆ‡òþk¡sHJç±I^?<‰ã¦Q+Ð�@@0£ÎV‡„ö\5�+++‚Ø).˜"„ü§vÿÝÝ]éèè�ÜÜ\Îø;4���-���²¿¿/Ñh”ã]î)r¨ç„÷ŒÅÙŸCµê™	!Ä”B_¡wHL©¤¤DÐb®sæÄÑD�ô…BRUU%ˆ<²ÞÀ¹ ’¤ñ�]]]rxxÈÅ˜„�}ÀEuSwŠó×yi,|ŽÆžŸŸ³À=»�Ô{âlLŸù;ôU=3!„$8Ðg(
‰)åääâÐt:q6Öo}}]|>Ÿ ÝßzÃæ2iÄbii©ÌÎÎÊíí-;e!ÿDcýVWWµª‰tëïM·	�ê:Š±¸¸È®.— ï©^ÔôyG¡Ïê�	!$AIƒ>BßMÿö÷÷ëvyâj@îîî4Š®¬¬Œsþî–v´µµI8æn Bˆ‚Š²nž“¢¢"Aç�õw¥›Ç


¤··WŽŽŽø˜ë<êAáEcÑõøú¨šB0òÏ]@bP'wzz*Ä¹ÍÐ[[[‚Jn…Né#k4Ã;‰p¦”‹yyy‘ååe©¯¯gÕ?±ºº´`aaAÏ�8ŠzQxÒXœõäc4 !$QçþBbH“ƒEl�s¦ê¯18333	…Š„õf,•——'}}}‚åRÜŸAˆ…;[.//e||\>|ø`ý}˜¨ÊÏÏ—ÑÑQÁn v8ë‹Ô“Â›š>ãŸÜ@I4ò OÐHIÛßKÄ|Üø£Õâ““ééé‘¬¬,ëÍ—–K•——ËÒÒ’n˜&„XÑò¯;[ZZZXõ÷€RSS¥±±QÐ‘Ç¢ˆ³]‘êMáQMŸñè“zjBq9¿@=ÐŸ¦èFFFäññQHÜM£V‹ÛÛÛç`½éò�ô ê‚@Bˆwy}}ÕE¨TrÃ¿·F»tŒcmm�#oªÕ¼GR/Ý£ÞšB\Ì¯Ð$&…Š…¶º‘ø‚ê°Î‰ÖÔÔXo´<*Íú�ããc!„x�››™žž,ú³þ¾ó¨4ºqrrR„8‚zTxÕXœï‘zkBq)ùÐ’é¼ÿ††ÙÞÞWÔHLMM	²n­7W^WJJŠ477f™5Mˆ·–”é_ff¦õ÷œ×•žž.ØJ¯;ˆ#¨W…g5}¶ïÐ’zlBqaä_ ú‰!é’"dß2ï?ÎÜßßËÄÄ„ :l½©²EÉÉÉÒÔÔ$›››Ü³Aˆ8;;“ÁÁAÎû[ö˜;<<,8{.t xUõ¬ælª·0�â¶È¿&èHL	¦E+ÐOOOBâ·!úââB†††$--Íz3e£*++ó¤\HH‚òööö÷Þ|Z§ÙØÚÚ*¨Fëÿ‰/ð¬ê]Í?¼©Çnb4 !ÄM‘_ 1¥¤¤$éîî–ëëk!ñ3�â÷û‹…¬7QKg…çççåùùY!	ƒF{nllHíoµŒjµ\ÕÕÕ‚Ôvt9 ¼«zXxYÓçú…Ñ€„7�MAQÓsÿápXHü>þ÷ööÄçóYoš(•J(’H$"„�¿Ø;ŸWÊ¿0ŽççÝ¯È7ãçFbáG~-|Ã†šR×Ê†4MÓ,$Ke¡dAYèÖõk…ÑÅeáÞQ·»pÇJ’qËb&”â*\]Ï÷éÙ}ë›Ìu>‡é¼_õúç¾ÏçœçyþŒqd‹‹‹TVVfüþEª¨¨ ¹¹9
ƒ´"V}? ÉÚ}’½ à…ˆfß²ßUÏûŸŸŸGÝ¿ÆÃ¿Ïç#®ÿ6>,Áÿš››KÃÃÃtvvF €×Ëíí--//Syy¹ñûÅ¨¨(*--¥ññq	´ö�,Ë™Võº~gßJ € �ýÂ’*m6ÐÅÅ=7FÜù7ÿðÑ1�ƒƒƒèÅÀë=hÈ¸V>è¿_Áÿ7//�œN'>h†³¬dZÎ¶ª×ô‹dp  ÐÌßl{Í’*ív;êþ56üóz½T__o|8‚�›��M£££t~~N €WõWžxóÏø}
>naa!ÍÌÌàu¥þ~ ’m¯ç5Û'Y  4Ç¾g,©²¨¨ˆÜn7…ÃaÖþ766¨©©ÉøPŸf~~>�ŒŒà#  ¯„_·¿dlgqq±ñû|zO —Ë…� áL+Ù–3®êõ°ï%“ €þaý,©233“¦§§1zLÏ�‘þ[ZZŒCð·Ëä%ÀÕÕ ^öæÿóâg9Ðq�·ñ{|²Ò$raaÓ4ÂÙV2.g]Õëé—L  ó†�bïYRabb"õööbä˜&¶¶¶ˆGý‚`dæää×ã#  /Äýý½Ìx/))¡ØŒl…‘�ôx<26è�3®d]Î¼*×òž�’l  Ï¾cXRemm-íìì°ž““êêê¢¸¸8ãŒXyr¼ººŠðÀ°»»+S[bcqø‡‘ÛÚÚJ›››ôðð@@’u9óª^Ëö�dt  °€Zö+û òI1Ï-ÆAB———ÒÍ=--ÍøàŸ¥|@ªªª¢õõuôì @rP;88 ÎÎNâ[Dã÷!ø,åR{{;/k„³®d^Î¾*×ò�ý*  “Î~bC,©0%%…úûûñôßzä¹öÔÔñ<ZãCT÷ ±±‘� n� ÐÀññ1õôôPrr²ñûTc||<uwwÓéé)m¥ ’}9«\ËûI²:  ("†ýÈþdI…ÑÑÑÔÜÜL{{{¬oú·´´D555Æ‡¨Ö¤¤$â	& `1¡Pˆ&''qø‡ÊMOO'§ÓIwwwôÀÙW20ga•kù“ý(™  PÂúØ0K*ÌÊÊ¢••<ý×Ôô�ojQ÷­Pþ—ÇÆÆ0Á Ç¶z½^*((0~¿�Ê•)ÕÕÕ´¶¶&k@K)€d`þýT¹–aÖ'™  žÉ_¬CåÓ›ÍF\‹.5éÀú'£8üC+•ÒžGŽ$ Ô×ýK™MCCñm¡ñ{´Æ˜˜²Ûíä÷ûQÒ¥¹/gbÕ¥ Éî  !ñìö‡Âºaù‘Ùßß'`-777òã’ššj|¸�–ß I‰	w8Fx@!‡‡‡2¹%!!Áø}Zß×¥­­�ŽŽŽhA²0gbÕ—4?Ø˜
  ˆ”böVtH�›B·Û�gfžŒº\.ª¬¬4>Ô@-Ê…û ©' Š¸¾¾¦‰‰	âmã÷¨E™444„×\³šÇã‘lÌYe)À7Éð  ð›$²öFåÈ?‡ÃAÁ`�€µlooS]]æDC­fddÐìì¬L� à_öÎî•ò5ŠãgœÓñþVç¸Ð¾Ð.:HvQŠLyijÜÓV‘¶¹E»”‘\*œp¥\(%t„r¡F.hò2¢Ð˜$c£¢Ñn·Ç¬³ZÍÍ™Ç9óìgÿvÏ÷SŸ¿à·{ö÷÷[ëYüXëÿòò2egg®@½æååÑÂÂ-H&æl¬z5àû§dy  x$?³Uì;–(;‹].y½^ÁåêêŠ(22Òø õëp8ˆ_\p €àèèˆœN'>âÂ�Ì¨¬¬ÄŠW}H6nnn–¬¬ðY¾c+±  ðž°6v–°¤ÂœœZ]]ÅŸ‰†ªÑøø8ÙívãC‰òá©©©‰< þwë?æ·À�^hmmE7—¾ì&™³²Êç`ÿbm’í àbX7ëU¹cvpp�|>�àþ�ìííÉ´hþ‚o|€�¡3%%…ÆÆÆdw9 à¿Ý	^[[#î¤1þ�¡5##ƒ¦¦¦P¸ÑƒddÎÊªg~xY·d{  ø¿°ÏØm–T˜””D���¨jàææ†ÚÚÚ(>>ÞøàCoAAmll àÑÈG\î ÁêVh‰« ØÚ¤ÎÊ’™9;«|–Ûì3Éø  ð~g'Y?K*,**¢ÍÍM|A2÷÷÷4==MYYYÆ‡h�« n·›.//	 ð¨Õ­Räðoüù-¡ü»»»±¹I_'§dfÎÎ*Ÿ£Ÿ�dû	  ¾Qý¯eß«œú?00@~¿Ÿ@p¹¸¸�]²ÑÑÑÆh333‰b¥ ÿŽÿÒÒRãÏhe5]qq1moo£�£ÉÌœ�UoxÏÖ   ð%°¯Ø�
y­««£óósÁ¿3:::J|ïÚø°­eDD„´3îïï àáí-½½½eü¹­e\\µ´´Ðíí--Hvæ­²¨ó‘}%Y  >Åö²XRann.­¬¬~ëÿáá!•””`ð´bõH&™c   °¸¸ˆ�ÿÐªÊõÂ¹¹9É@’¡9K«|ŽØ^Éü  ãù•}Ê¾Q9¼³³�_ÓÔØþþ~¬‹‚VVIíîî àkNNN¨££ƒ¸cÆø³Z· ¶¶V:U€$Cs–VÝÝù†}*Ù `4iì${§à`‘ÉÅÕÕÕt||L øÃbvvv¨°°ÕhicccihhøY™™žžnü9­­Íf£ÙÙYÌÐ‡diÎÔ*·‚Ü±“’ý ÆÍ¾`oT¶‰ÍÏÏÐ31º««‹�&Ðú–——Óúú: þðkjjŒ?`xlv©ªª"¯×K@œ©Uoxºa_È;  À8ž°ö5ûIÅ¡’��@ííí¨òé©þËT^‡ÃA|ÏÚø`­oLLõõõÑõõ5 ä—ê?WV�?`øtÌÌÌ`³‹Þ« ’­9c«zŽŸØ×¬CÞ  F‘Ä¾d}Š†}É º­­-zîþ÷ôôÿ!H`øXVVFKKK  :==¥úúzãÏ6Ê–
§ÓI�‡€6$[sÆVYðñ±/å]  `‘ìsö-K*LKK“Iß@OÕèàà€òóóQý‡áÖBŠ¡ |fbb‚ìv»ñç/SSS¥ Ð†dlÎÚ*Ÿå[ö¹¼  ŒÙù?ÁúU}v¹\tvvF øøý~¡äädãƒÄ, ð7{góJk†ñòUä+z3z•Î�‘:)#¯�Ð&ÅðìRÂD2 “¤“N)D'ŠRG>Ç@tü¶ö±}$”ò•l]ïÝý7¬ÖîYëúÕïØ«çéZû¹×µH ÑsÔ]]]Þ¿hð”»éµ·âúúÄ’±5kKæ6µ–qqA÷„/ŠÿÂâƒVVVbkkÄÎ×ÕkÕRRR¼"4xæææbbb‚_�ˆ×¬¬¬ ¼¼Üû÷¦………ØÝÝÅÇÇˆ54kKæ6¹–b˜…€„¸_üW!þaÂ¼¼<ŒŽŽ2Ì[âéé	‹‹‹(((ð>€Ðà
…‹Å@ˆ¯ïqùúÏë[i ¯víëëÃãã#ˆ=$kkæ–ìmr=ÿˆ,$Ä]òÅQñÝÀC¿@·¶¶âääÄ
ú[744@FÀ¼ 4ØMÒóóó ÄG¶··QUUåý{€Z½š.‰èd"±›%{›œ}Gu�@qŽ$ñ³596==bµÓu¡ö>xÐàÛÛÛ‹ûû{âÛ1®ññqv¸ÐÀ›ŸŸ�™™í%"VÑì-ÜäzFÅÏºW „8Å¿âñÍTñ_gg'®®®@ìpww§êÒ¤î}ð Á·¦¦†W/‹¼ÚÚÚ¼þiðMKKƒ|‰f }4{K79ú&þÐ½!ÄRÅ6ñÊd“÷ææ&ˆ=dÔŽWÿQgÌÌÌÄÐÐûCˆwåÅÅÅÞ?ÿÔ�2À��¼¾¾‚XE3¸dq“ëy%¶éž�âŸÄŸ"}ý×Æ——{Å/KKK�M“÷�ƒºcss3ÎÎÎ@ˆ/Ç¸úûû‘””äý³OÝ¹ÕexxX¯µ$VÑ.YÜt'ÔOÝ3BO²øE¼aÂÆÆFìïïƒØCFìôÌtjjª÷�ƒºcii)VWWAˆAþôòþ¹§î(™D-£Ñ(ˆu4‹K&7¹¦·âÝ;BM‰øËd{÷ÜÜï~µÌÁÁd³ä}Ø î…ÇÁÁA¾Oˆ,,,püŸ:gvv6äh�s%fªH3¹ds“kúK÷„�À’.~Ÿ¼tl1ãòòÄÏÏÏX^^FVV–÷Aƒºg(Âùù9q™÷÷wtwwsŠ‹ºøG®m¹¹¹±ŽfrÉæ&�=‹_uA	$Õâo&¬®®ÆÚÚï|µÌéé)zzzØþO�´¬¬ëëë ÄeQ__ïýóN�S‹‰+**‹Å@ì#™\³¹dt“ëú[÷„�À‘'~ã¦Šÿ&''yo·}´aWÆÿYE�4==### Äa´Äµ¤¤Äûç�º[¸±±Áã\‰A³¹dt“…€qñ›î%!�¢N<aÂ¦¦&–¼$hltvvrß®÷ƒºkGGï’&.£#ÒÞ?ëÔIuBqll 	A3ºdu“ëz {	BH`øGü.¾™x	äääè&4�ƒØoÿð>\P·­­­ÅÞÞq‘ÛÛ[H×…÷Ï9u×ääd´´´àââ$1HF×¬.™ÝÔº¾‰ßuOA	ÿ‰E˜°½½ÇÇÇ ö‰D"¨««ó>\P·-**ÂÔÔÈÿì�Í+åaÇ›‰ˆHÝ’Q—i¹,mlˆR�ÄFÊ‚¦I“º‹’±P"Âî–—nìPŠB),¼Ô,¼ÔÝÜ…�$5�9�¿áé>�ç|?õù~Îõ}ÞÎ>r||L<*M}�C¿ƒtvvFÀ’Õ9³›ü®¿eM pž/ìûÏDñ�wÁ».KlooS P, ß¦¤¤Poo/½¿¿ ¾±°°@êëz­<q‰F£ôòòBÀÚX@ÉìœÝM}×ìŒ¬-  Nóƒ½34öOÞ->>>H><SW‚#wØU, ÿ677c ð’þþ~â+Òêkz­4 Âï¸]$³sv7Ù8úNÖ  gùÊN™:ý/++£ƒƒiD’ŽÌÔå¦êCÔauuµ\•À'žŸŸ©­­M}}C7¹Z[[éââ‚€ÕæÑ’Ý9Ã›¼0%k €“ô°·¦ºŒŽŽbìŸ=d¦.7ÕQ* ‹ŠŠhee… ði>÷ÉÉ	ÕÔÔ¨¯oè½r[1??Ÿvww	ØÈÞäÍ£[Yc  œ£˜�±dÂÊÊJ4s±ÌÑÑ…B!õ¡ê¹>:88H xôWºr———«¯o¨g`ii	7Gí#ž³¼Éï“µ À)~²M�þ���cž«e¶¶¶(33S} €zloo§··7À—«¸ÃÃÃ”——§¾¶¡ÇÆÆp{Ô>’á9Ë›¼ðWÖ  gøÎ®ZüËŽáùù9»ó\çççÕ	¨Ë††º¿¿' |€7³äWjjªúÚ†zìééA#@7�,Ï™Þä&Àº¬9  ÖùÌö±qÅ���Msssãb™D"A|r„	 P•<+� �7ÄãqªªªR_×PßFîåå%ûp–—LÏÙÞÔ÷�³}²ö  X%Ä®šûW[[KWWWìrssCÝÝÝêƒT¥ô¼ØØØ  |yƒ[QQ¡¾®¡.KJJèðð�€H¦çlor,àª¬=  VOÿ#ìE�““#‹^__	Øåôô”êêêÔ	¨ËÜÜ\šžž& |˜ °¹¹I¥¥¥êëê2--Mþö�p¦—lÏßÔ7þÃFp  {„Ø}SoÿñþÖööö¨¸¸X}�€ª”·Ò€ fgg)ª¯k¨oÀââ"&¸ƒd{Îø&{ìã  vøÄ†Ù„‰b�F¥ù°O,£¬¬,õAê³££Áx±022Bü¿U}MC} è%åXciÎø&�lXÖ" €¤ò�Ý1õö¿©©	§ÿÇååe4 „*mii‘&˜ |ð€ÒÇ%==]}MC}†ÃaüŽ;x€³¾É^ ;² $õôÿ7°S+ïn×ÖÖpúïP×ÖÉÉIl @•Ö××Óõõµ¼¡à#� ä¿eõõuÚÕÕ…C%÷nHÖçÌo*_ÆÙ_¸ @ò(1uúŸ‘‘A���ôðð@Àžžž(‰` ªô?{çÎÒh„aˆ«‚aUDAQŒñ‚¼b#jcã¥YAÐJ„TA±ôØÙ¼ º"m\¯)¢… "¤QØÅbM¡Fv«Îóv¿8‡yx~ÁçÄyç;ßœžžº¸¸À  8Íóó3ñýÛêëêtdd„’É$»à^_z~îý���L È:9ìWS›ÿkkkéððPÞV ;x||¤™™  J»ººèàà@>…ÀU~þøI���êëê´¯¯�nnnXw2Iz~îýMÞðU²	  «T³§ì‡×ÂÍËË“Iàëë+{¸¿¿'þv ¨ÒP(D¼¬ àüÝÛ­­­êëê´­­�®®®Ø÷üÒûs0ñ¬?ØSÉ& €¬ác#ì/–¼‰'�Ø¸maã866¦¾�€:mhh h4Šß%à2~š››Õ×3Ôi  óósV.(•ÞŸ3€©çý‹�HF d…bö»©·ÿ£££ôòòBÀ.®¯¯ippP}õ6Ž|… ÀUdÅññ1ñ0K}=C�JÈV"½?g “§ ¾KF d…/ìK^­©©¡��z'`‰D‚øû9õÔiEEñýéømN ö÷÷©®®N}=C�æääH ;áÿ¯’8˜zæ’Q  Æñ³ßØŒ×Bõûý4>>N©TŠ€}Äãql�†j---¥¹¹9 €Ó€X,F|ÄV}=C•Ê£ÝÝ]öÂ@² gÏ<Ã~“¬ 0Æ'v€M²äUþ.Q&³™L†€}œ��Q{{»úê´¤¤„fgg1  N ¶··‰ß®©¯g¨v  o˜�µHà,`rWI’�Ì 0Âg6ÊþñZ ùùù499Iétš€•È·£---ê¨Ó¢¢"ŠD"  § T]]­¾ž¡Ú€Üæì†³€dÎ&žû6*™ àÛÏÞÚ°-wl{9::¢ÆÆFõT©G‡Ã  W‘+,WWW©ªªJ}=C½ ‚É0Øg“KïØ~Ü €wüìûÛkaæææÒÄÄ½½½°Ùœ[__¯¾�€:-(( ©©) €Ó€ååeª¬¬T_ÏPï `}}]jØgÉœL<ûßìv à�VöÖÔæÿ­­-Ld8ÐÔÔ¤¾�€8 €«€µµ5œ €8€~Ó‰O–8˜ÜYr+Ù ðßä³lÚkAú|>¢§§'vsrrB¡PH}õî ˜žžÆ  8ÝPonnb Ä àœ$#pV0ñüÓì‚d Àd/Ù�Å(÷¯¬¬à8–#· ttt¨o  n Àå[ �€úz†¸ 8qjI2gÏÿƒ½” øgrÙ0›bÉ«ÃÃÃxûïñxœº»»Õ7P§eee4??� pz ‹Å(ª¯g¨w °··GÀ­S œLý¤Ø°d À?QÌÆØŒ×B,//§ÅÅE|‹å‰D‚z{{Õ7ð/{ç÷J÷ÇñÍ�"ìb.\lé-”L4�\�•¬Ü åB)w.Ž"«å2¥Ý,¡¤]HDqê É�bg.¶CÔ';g{íÕëbµ¾û~¿«ó¾y^ÏG=þï×éý|ù¼_/�fffRoo/ ÀêÀÜÜegg«¯g¨Qyv*5 ¬úÝ’¬À™ÁÄøÆ¾•, økX7û�¥h­¬¬¤ÃÃCvàóùÈív«¿@@•Ê ¢ÁÁAŠD"€­éÅÅEâÕZêëª�å"�€UHVàÌ`ê|`Ý’i  E:û†šxOÛßß�·ÿ±»»KMMMê/P§yyy466† °¯×K.—K}=C•Êó—••ÖÍ�ÌÀÙÁÄ9²o$Ó  þ—ö1ûÑÄð?&'Ÿ”{8::’=èü†Ný%ªS6`ðôh4-�õ�ÜÂÂBõõU*gccƒ€•ÏPM¢þÁ~dK¶ ü'÷ØWl(ÚâKNN¦ÎÎN
…Bìáôô”ºººÐ €*-..¦ùùy4 €ÕœœœPQQ‘úz†:­¨¨ íímöÁ™A²gg!Ä¾’l øWî².ö½�ÿþËåcaa�€]òx<h @•–——Óêê*†–«¹¼¼¤ÒÒRõõuZ__Oì„³ƒ©æö=ë’Œ ø#Iìök´EOmmmt~~NÀ.‚Á ñ$V4  Jkjjh `5···Äg¿ãP¥|ÿ”¯`€�pv�¿!g	çá+ûB2 à�<dß±‘h.''‡¦¦¦Ø9„ebbG¨Ò††4.�íÈËöövJHHP_ÓPŸ===ò5#°Éœ%Lœ‡ûN2 à$²ÏØ€�b“)ògggìdff†RRRÔ_" >[ZZ( ¶7 úúú(55U}MC}Ñõõ5{áar#U€}&Y ðØIÃÿÒÒÒhxx˜€½,--¯CS‰€ºŒ‹‹£îînÀ	_r�ŒŒPVV–úº†úÇ Wû‘,Á™ÂÔ0À×’u  ¿ˆaŸ²~Ãÿªªªhgg‡€½lnnRuuµúKÔezz:š—À	È‹ÙÙYÊÍÍU_×P—‰‰‰rö�õH–àLaj Ÿ}Š•€ Â}ö¥‰·ÿIIIÄo¯ð	­å¿U‘€ºÌÏÏ§ééiÀ	lmmïÓV_×P•òõâÚÚûá,!™‚³…©Y /%ó  „G¬�¥h-))¡ååevsqqAü~TýEê²¬¬Œ¼^/à¾|þB¼]}]C]ÖÕÕÑÞÞG ™‚³…©óá“Ì ¸Ï>gC&Vÿµ¶¶ÒÕÕûWH�ŽŽb Temm-VGGýŽ766Rll¬úÚ†zìèè ¿ßOÀH¦àlaj%`ˆ}.Ù åd±“ì÷hËårÉú8àä¿¥S™€zlnn¦››À	„#aòx<”‘‘¡¾¶¡ð�(g!Ù‚3†‰óñ��”ì€bbØ'ì'C]Wy;œÁúú:¨¿Lüdï|^yO£8^Æ £D“Ùh¾CYLùI�ÉDS²ùŠ’åµºYè&)?"$;+«+’D
å›’X]WÈ�©ï,$”K!\7Ô{Nç_ø>«sÞ¯zýžóñ¼ŸïóœC]¨o»»»Aˆ¥I sss(..v_ßÔ…ú+ñÌÌ' ìK%#Ô:¹ÿa3@â™_Å^ñMDêÌx¹2®�‡‰âñ8d«ûõaAA¦§§Aˆ¥I ûûû¨®®v_ßÔ…:örssÄÜ·L3†d�ëäMìÕDˆSÊÅ/!FÿÕÖÖêFƒØáöö===î7ÔOÀ­­-b­¡kcc£ûú¦öMNNF4åj›hÆ�¬j$àÍ@„8ä'ñƒøCDjƒ!ygÈ·³ÆxÇää$HQ644àòò„Xûå¬³³©©©îkœÚ6--ƒƒƒüŽÛD3†d�P{ÒâÍB„8ãwq2ÔììX,b���6�¢ÖÕimmm|7JL255…¼¼<÷uNí÷qYXXÀóó3ˆI4kHæµf&5âŒ¿Åx€Òñççç ö8>>F]]�û�µm~~>&&&@ˆEvwwQYYé¾Î©m#‘ŽŽŽØ‹Ê.š5$s„Z3qÍB„8â±#Äè¿œœ6ÿ3þ~´··×ýÆ‚Ú¶¦¦{{{ Ä"wwwì@-«×Â¥i1¯ÿ;i(Ù#ÔHÀÍD„8áOqED¢¶´´àððÄîÇvvv2ZÇýƒÚµµµ Ä*ýýýÈÌÌt_ëÔîûÿ±±1<>>‚˜F3‡d�PkgE3!N¨¿…8qÇÓÓˆY´3zii)’’’Üo2¨=3220::
B,³¸¸ˆ¢¢"÷õNMªãáÖ××ÙÇÅ>š9${„jøM3!øM‘¨eeeØÞÞ±ÍÙÙ:::ØEšZT¿ckkk Ä2ñø¨¯¯w_ïÔdWíq�ÇA\ ÙCþw‡ZCCš�1Î_â× £¡ðúúÄ6///X^^†œ°»ßhP{677ãêê
„Xæõõ]]]HOOw_óÔ–)))�^EÚë‚¸@³‡d�Pkè«f#BŒÏþÿ(~1ne~~žÍÿœpzzŠòòrÈI»ûÍ5£†¡¡¡!~Çˆ›g %%%îëžÚÿ·ººÊëÿ¾úSi‘¿}ˆ5ô]ü¨‰£DÄÏ"µªª
 >¸¹¹A{{;›RSbee„8@¯HG£Q÷uOÍ¨{’ŠŠ
œœœ€¸B3ˆd‘Pké³f$BŒò¯x¢Xpâƒ··7,--AN[Ýo8¨›ššpqqB¼|Çûúú ÓÝ×>µaVV†‡‡q{{â
Í ’EB­¥SÍH„ägñ“ø*"sss‹Å@ü=�“vN &ÌÎÎÆÈÈ¯�WÈUi> fŒD"ØÙÙÑÃ-âÍ"’IB¬¥Wñ“f%BŒñ‡8%"5üÉ¯f¼nå�ÿÙ;›WêÓ0Ž/£&² Êa=ÏB^JyÉŠ…œÙXH1+‹sbaI�Ò��Bg&¥ÔÄÂÆÛcacX�…ÇËÆQ^òr<çû\]+óÌa¦Îoñ»ÝßO}þƒs®îïï¾îë
‡Ãèéé�Ü±þÐAÍ·¼¼‹‹‹ Ä&ÎÎÎÐÜÜlýÿŸ~ŒöyÒ¢O‰•h‘LâÔÅÔ¤f%BØþÿo=ÆÇÇ¹ûßB^^^°´´„ÌÌLëÔ|}>Ÿ~Ô"Ä6††† ­ÓÖ× j¶iiiƒxzz±É"šI$›ð !1øYô‹'†fmnn‚ØÉÉÉ	dmWIQ£ÍÍÍÅÌÌ±‘��TTTX_¨Ù»ÿ¹ûŸh&‘lâÄï*"ú53òAø$þáDûgg'wÿ[Ìýý=fgg‘‘‘aý„š«×ëÅáá!±‘ÛÛ[Ýê’””d}- æ®þëêêÒ3	±Í$’Mœzð»f&B>­âß"âP'Ë­‡­(v¿!­««ƒ´\Y¡fN�åð?b5sss�Tëë5Óüü|¬¯¯³ŽÍ$’MœÚnr ™‰�@ŠøEü&"õ°°³³b5úÞnjj
2EÝúC5Ïúúzlooƒ‹Ñµi~¿			Ö×j”ú±µµ•«¨‰ h6qèƒæ7ñ‹f'B§D\qâ½Uww7§­Ú>]RRÂ•€Ô¸¶ÑÞÞ^<>>‚Û‘ç\(((°¾.P³ÌÎÎ†¬³ÔÁÄ„šM$£hVqà7¶¢Ù‰ÃùM¼�ÉÉÉ�Ã.Q000€””ë#Ôkkk±ºº
B
…ÐÖÖf}] Æ¨kˆ›ššpqqB^m©ÒŒ"YÅ‰ßÙ¥f'B&YˆˆCm,++Ãîî.y½µ¨¨ˆ-¤ÔSSS166†››B LOOC¶bX_¨æååaaaÏÏÏ äšQ$«8u&h†"ÄPJÅ¯NÿëëëÃÕÕyÝ0<<ÌY Ôù“�8??GGG?äR·«[+ZZZøöŸÄB3Šd§†~ÕEˆ¡´Š!ñ˜žžùâÊöó‹«tp uýÐ¨@  ­!ÿ$BnV­¯ÔÝæää`~~ž“ÿÉ[Ï 4«Hfqâ÷â6 b*?‰Cb4Þöÿššìïïƒ�¹»»ÃÈÈ¤àZ8¡®žüÏ&„¼Áññ±ÐJLL´¾VPWª·º^¯áp„¼�fÉ,Nt4EÅ!ÍR„Æ/â‚Ewpp�-W$&Ñh§§§¨®®†Çã±þ�BÝ¤n/Ñ�S|3JÈ;¬­­¡¸¸ØúšA]YÇuÅÛòò2oÿÉ{hV‘ÌâÔ3€ÍR„Æ¯â�ˆ8Ô÷Ý+++ô‰E$Áää$²²²¬?¨PW©7šíííØÛÛ!äm®¯¯Ñßß™²n}Ý ®R·ù|>í8$ä¿.¥$³85›ê@³!‘(~#qüðõ]wUUŽŽŽ@È{\^^¢¡¡�‡Gêº‰Ñ²öO?RBÞgó¯MTVVZ_7¨»nÿKKK±µµÅ‹(òÐÌ"ÙÅ‰ÙTñ³f*Bá“ø§CÓÿÙþÿ�½swil‹â0£âQQ¯â‘€…ŠXD­nQ,„�±PDázñm!âm¬d„Ne!¦ÑiD´‰X©ÅˆdHÑhˆ�‰ï×,Ö?p=Ù;ž3ìßßpXgÿöc-ð¿ðµ<i¾R]]mü‚:ÃôôtšžžÆ›Q ÞÈÓÓy½^ÊÊÊ2¾~@gXPP@ÜgO¸€•g :§¬H¦àá3Ð17{}}o®À›¸¿¿§ÉÉIŒ„Ž85jnn¦@ @ €·
†h``€xäšñuÚªœàz<
‡Ã€…)É.œat|‡ÉT ü|`½ì£êº¾¾Ýÿ�%‚Á ®�B»•ÌÅÅEz~~& €µQZ»»»Ò�×Æ×hŸ.—‹VWWqâšÀFG{d½’­ p8•¬Ÿ%e÷hhˆnnn +‹GŸÏGÆ/^ =¦¦¦R__]\\ À:���´°°@üŒÆøzí±°°�FFFäf! ‘ìÂF×M&¿d+ LèþŸ™™I¼óŠæYÀ2±XL:öò7dü"¾ÿ•Q·ÛM|‚‰†Q (°··GUUU¸ m©ã���h@T¦SI†áu(¦ cø��)|è2Ï½¦¦ïgAÜPcc#ñ�ÜøÅ|?óóóiii	§F (‰Dhxx›¸Ðkkkicc›¸@	Î0’e8Ó¨~“1ÉV 8˜ö›†÷³ruæòò’ ˆw÷uee…x|�ñ‹ø~]ÿGGGñl	 µ·³òÿçÍ4ãk
|‹‹‹innN&R  €d®eº¦š|“Œ€Cif¿ë(À¼ûŠ”ß‘ÎÏÏSii©ñ‹˜Pe‡¿¥¥MKP 
QOOegg_S =›¸ÝÝÝ�F	 cM%Ëp¦Ññ}~—Œ€Cù‡�²¤bCCh-\__Soo/qc6ã70qïE+++‰ôÒ„ `�““êïïÇµh›ííí´¿¿O hB²gßgT2 ä#û•ý¥ò‘§¥¥Ií»»;@;;;Ä3Ù�_ÜÀÄ˜››+WFooo	 ßøÖññqâÎëÆ×h�uuu´¶¶F///€.8ËH¦ál£ú�þb¿JÖÀaT±~M´–——Q„�6x†¯tcå¦€Æ/r ^322¤YÙÕÕ ¬s||L¼@Æ›h›ååå2vòáá� ÐˆdÎ4ºê›_² âû‰ê(ÄGGG€NøÇ.ÝÙ].—ñ‹¨Ç¤¤$jkk“ÓK €uNOOipp�rrrŒ¯'Ð¥AÛØØ6qA¢�LÃÙF×8ÀO’¹ pÐÀö§ê‚Úãñ ‹6HòƒŸšš¢¼¼<ã=PÍäädy×·¹¹‰wÿ ÄA8¦™™*))1¾ž@{LII¡ŽŽ:<<$ gÉ6œqT¿ÙŸìl  'ñ—†ëÿÌfgg¥{; ‰àìì�¦ jÓ?	ÿ<fRÆM ¬q~~.oþ‹ŠŠŒ¯'Ð>[[[¥G ‰žHÅÙF×á“_2 áoöK*–••ÑÖÖ–¼Ù ‘×±ººº0 Æ£<#ñù|èS@D"š˜˜À›h«MMM´½½M¯¯¯@‚ûPI¶áŒ£ãÛý!™ ‡\ÿÿ—½T�£ív»å„ö7{çòWÅáGiQÆçBÛ¢Ÿ [Q|,ld˜€AÄ¬\‰â"ÅEAD‚‚Ø_¨hÜ(Ù¸;(ˆ�´�B4Qmk#(19s800‹fì{çÖíÔïƒï?¨®®ß­Sç ð³»»KÏ{N¼î´?Áÿ¬ÜX£J	€¸ºº¢¡¡!â¹ØÚï%P�¥¥¥´´´„�¸ÀÒêSÎ8fœ9¯ØWx ì@4û–ýj´ü¿§§‡‚Á `v?�«ÞE\Ò­ý�þ»999^nnn ðä›yóït:µßK :ËÊÊˆÃ?:þ+‘lÃÇŒg _Ù·’½ PL&û‘%#æççÓêê*=<< V±¹¹Iõõõ©ýÁþ³äv»e¦/ ài\\\HÖ´´4í÷¨Î’’âð�
.`9œm$ãpÖ1c-”ì€b~e?³d@™ÑÎ��ðXþ6kccƒjkkQ	 ÿN	-ƒƒƒt{{K €§qyyIÜ ÿ òÞ-ssstwwG XgÉ8œuÌXÏŸ%{ øýÿkÖod1;jkkCGm ãöçG TÀ¿*åÊM
@ˆï^ûûû‰g`k¿—@µ7ÿ“““øˆ”ÂG²g£kÚÏ¾F  ’öûÍÀB–†@ÓÓÓèþ”Vloo“Ëå"žñ®ý�	þDyyy4::Š7ÿ „XößÝÝM)))Úï%P™2²ueeÏ·€-Î™SSSf4AýÆ¾“€¢Ûÿg¬—%#Óþþ> ™	ÜÒÒBIIIÚœ4žó/7F³³³h@ˆá¿¯¯á*ÝÇ«ªªÈãñ ºØ†½½=É<&¬q/ûU @Qìöw–ŒX]]�[`›wZGGGÔÚÚJ			Ú¢4SFôÉWúûû{ <	ù/CÃ?¨Ì˜˜yk½¶¶†ðì¶?Jæ1¾Î%{½�,€Å8Ø7lÀÈ"Ž��¥ÎÎNlÒÀVNOO©««‡X}”wy555˜€Á9ÿ™™™Úï'P�ñññÔÜÜL‡‡‡ØÇ�û Hæáìct­Ø7’Å °˜ö½ãµÐýØ²{õÈÈñ�0&hphljj¢��ô" ´ð/Ó2’““µßO eÒDGG��� 6½`’ÌÃÙÇŒ5ÿ^² SÆ~2ãý¿×ë% ìH0”Íº   ~Üð/}ð!€§#ÝÕ'&&0êªRUoo¯ŒZÀÎpæ1«À'Éb XÈÏìKö‹‘Å!£×� `S¤Üúú:ÕÕÕQ\\œö­Dù “••%·–'''¸ù ®¯¯%üóoIû=*éÛ"M[çççÑK
„œy$ûp2ºþ¿°/%“`vØàûéÌ_lñþØžÇÇGòù|R^˜žžN¼qkð
cåCNEE-//K•  ´ðïv»)55Uû=Z©\ É´ž††ÚÚÚBÓVV} 8û˜1%%À£ °’_XûÝÀÂ•²j>€ãæ„~¿_n»rss‰o´?„…£‰‰‰ÔÞÞN<Ž™«>33ƒF©PIøw:�Ä!
Õ[ ìàõ*Ù‡3�ÑßÂwÖ#™ ‹Èg},±²²’Ž��ñî„[_ yÐØØH&µ?Œ…‹QQQTXXHãããt~~.U €�JX¥7Jvv¶öû
´Öèèh*//§ÅÅEù @6”ìÃÈŒß„O2 °wö¡9îq¯ã�f;gÂPÔ¶8Þß†’òÇB‘×Œl^“—EJ’Y)¶)D„¡†¤„=^fh“ò²$oéá‘—„c‹°3)Ž¦'ßsu•?N‡ãl÷}ïÙîûúÔõ·{·ûþ=¿ëþ}¿×·	heA5�9ÑôéÓ­¾¾Þ„h�-LÆÈ+U4sa‚?ÔäääXUU3„�ãÃ‡†�hõ'Å$³eéÒ¥vçÎ•ü‹–½<�ïF”Eo&„ÇÄAEûÿÙ»UXXhB´ôj€Ë—/ÛÌ™3}°ØgûgddØ¡C‡¬ººZ¥¢B8Lû/))±nÝºù¶´'ÌÊxifÿ'ñññá-//7ý©jTøz x!7r ŠèÍ„ð˜vÐi(êä¡íÙ³§�<yÒ„hé|ùòÅž={Æl€Áƒª´�l§þIII¶hÑ"Ãlý	áBþÉ‘#G,--Í¯ë«æÎ�ËÖ´~m§þì“ÎÏÏ·p8lŸ?6!|=¼�Ó÷$
�¦7ÂC~�R¡0dN4räH¦ªá>}úd·nÝ²¼¼<ë×¯Ÿaóø\,N‹lÊ”)
…§þ:-Â…žÿÝ»w[jjªo×lÄù�ãåË—véÒ%[¼x±¡uHëxŒ>à¦¤¤Ø’%KìêÕ«ï'ü=¼�ïLJ¥GÂ#â¡©Ð�9Ñ¤I“Ô‹+ü7+Kômd 6�MhüGŒaûöí3$C+á_Í×®]ýº~0Ç¡rÜ“|éª©©±S§NÙŒ3,11QëxÓœøó^ã.ïýë×¯õWø¬7ôBÎßz²©ôhBxÄ¯PTëäamß¾½­]»Ö„ðsÊë›7oììÙ³–��mÉÉÉ�ßÜy¹i4h�íÜ¹Óîß¿ÏJ!„;£þöïßïgóÏqr‡æºñ½yÝÏŸ?ç¸Ã1cÆXÛ¶m¿Þz¹Ž£ÏŸÓ%ÐRÇÖ:!|½<‘Ó÷§* GÂ#:C!è/'+’\ùƒ+„ÏaRq$±ØÄ‰§�ßè¹$f- s�³ /^¼hïÞ½3!„kiÿ<G;“o×�^½zÙ®]»¬¶¶ö§U7nÜ°íÛ·stW\\\à×_7ËýG�e›7o¶ë×¯3hRˆ€@/Oäð=¢'+¥GÂ#Ò¡ôÕÉÃ:|øpŽq" ð$éÁƒ<Iš={¶uéÒ%ð¿ÆªM›6ì›Û¸q£¡Õ‚›w!„«iÿ,û‡AösÏ?§ƒàomHÎ÷.¨6â/$x~=n¬PMÁªŠmÛ¶ÙÍ›7U¹%ÉíÛ·mØ°aNß§¯P„M� 3¡W�9Ñ¸qãìýû÷&DÐˆF£öôéS;vìC¦°ÁüF°­C¬¢Ø±c‡!ÙŸ§rBWaÒ:Êþ}ø—žžÎ©-˜Òè{ôðáC~@˜3gŽuêÔ)ðëóÿïUNNŸ1˜dè…ÆŽëÆ»õ
ÊT ð* 0úÓÁÊÒ9Íã�ÿðèÑ#¦N¯X±‚'Ú8Ùüæð;âH®¬¬,Û²e‹]»v�¥ÉBoÌÿ‰'lÈ�!¾.ûßºu«+-CõõõvïÞ=Û»w/GŽ8PãÐß?tèP[¸p¡ÛÝ»wÕã/€âÚá¼­ˆÞ,WA€Â~ƒŠ¡�NÒîÝ»³|NAx’�QGì/�?¾õïßßÐøS¢ÌÌL[½zµ•––ª&ôÑPoÍ?ûQ¨éë´ÿ’’/*úZYYi6mÚ4ëÑ£Gà�?ªHx/6lØ`.\`ª¿âÐÁ9}ß>BÅôjB¸L
tŠ:x@ÙëRQQaBˆÁÑSçÎ�³¢¢"––0€#î‚°YDÒ8S W®\É¬ô…2…\á%<ÉfúzïÞ½}»¾¤¥¥qD¨Ç!s<Ù~üø±=zÔòòòh€ñoÉôs´Y~~¾…B!C¥›F²
ñcè‰\ÈˆBWèÕ„p™ß¡.ôÿóÇQñßcqêÍÓïU«V1p*##Ã’’’ü²Qd©,zqÙÿ†¶ –†VUU©Ä_ˆ&(=sæK´}ÜFÄ²ÿººº&£‡íàÁƒ¶lÙ2›<y2Û|ÊÚ§O?~¼-_¾œo”ÈçBˆŸBOoäÆûø‚^MiM€ê s"œj*ôEˆöˆUWWsÔ“i–†Ç>Ý:´˜�bëÖ­Y‚;zôhËÎÎ¶uëÖ1³ûµY"6'ÿìùÇd_ŸHïÙ³‡æ?Æ÷šóíÏŸ?o›6m²pÓ�1‹ü°Û’ÂXQ™ÆÿyóæqKYY™á¤Ÿco…‚žÞÈ�÷³š@Ï&„K´ƒÖ@�þp¬_¿Þ„Î~,ž<yÂžJôŽ±B`Ö¬Y,ŸÇ\|ŽDèRL7‰‰‰‰†1[œïŒrP†??Kûß¾}kBˆØÒãÇ�³çßÏ'ÿ¨,jŽUElEˆD"V^^Îê„ÜÜ\C¥?�öíÛ×:vìóû—œœl¸^‚Xy�¸V¶©¡²A“X„pz#x$7r ÖÐ³‰¿Ù»›WÜÓ8Žã%nYLÍ¤ìFMV³�<„$�ldÁæH6ÔÉ(�+BŠrödMIÙ”QópÊsÉCMÃi:ÃÌw¾}j–³¹¯›Ü¿ó~Õ·Ä}nåü\~Ÿßu]ß	’ã5çõ5°û®öÅHèv5Wò`­™˜™™ëéé1( ð]SS£íÅÅÅVXX¨³«322B::+àçççkvÍ„‚~CCƒn`}…‚þ˜ÍÏÏÛÆÆ†ùÌ�nv¼Ú§®àánÿjÂçaUÿ’åÿäääÄ|””NNN*p·´´Xcc£UWW›oÓÐƒUï—¢U±X,ÞŸ�þmVV–ù{i+–_
ú¾”_ß³««ËÆÆÆtÏ¶µµegggtî^†~ÏÂ�…VF›Sfä¯]¯B.ÎÊÊJÛÝÝ5 /þP@³^§§§vxxh¾Z@`fggÕ`Ð»ë+¨ûR|Íì477[SS“ö¨úö•?<Ðç¼‰•^ÓÚÚjmmmÖÝÝmCCCº¹öýž
~.¿ÎÅö™}>o—–i/..êèÑ¨†ÿ¢¢"m—òñ(éÇqßº ­ûûû¶ººjZùå§¨ajGG‡öþß8îësþ5½Æ_«í½½½z�ééi=¬õ÷ÖCäããc»¿¿×÷ð:vvv4‘6ö)£í*³	ò³×•—…”ÿÒQ9 ÞÌ¦ŽÿòfUZÎé7~ú½¾¾6?'[7Ÿ>{¯mÏÏÏ ©�úÓƒ@ßw®ÓE":ó¯UP>–}K}bÔGåááA+îîîþÇõ±N_ó×0Žo�~W=#%b¼Rf Íë]`@Ýltvvr–7  ¯ßí_çÔ{Ÿ�¨Îükß¼÷ÑÃK H¢‡xÊHáf•ÕÞ)»�¾óúÕë�€RûŽ'&&  ¼êþrõã(++³”””H†ÿ¼¼<�=uue �d”‘<+Ž…ÊjÝÊn@ ï½>zýpAêœØ¥¥%  ¯·çeeÅÊËË£þuòÉøø¸]^^ $!e$ÏJ�ã¡²ÚGe7 P¡×'¯¿C.Êªª*;880  ð:áyyÙJJJ,555Šá_]ì}æL{þ I)#yV
•Õ>)»�Š½Ž/Hu¿¸¸0  ð¢Ôìmë·-+--ÕÑ�Qÿ999Ößß¯cP ‰)#yVJÄØx¤ìHõªóº	½ ÛÛÛ9C €WØóïçÉk6)---’á¿  @ÿÎÏÏ "0n++…��ÊluÊp@œ2½>xýr1fffÚðð° €—½‰\[[ÓÌ,‹ìžÿÑÑQq ¡¬ä™)pŒTfû ÄéG¯i¯Ç€QgÏÍÍ  x¹eÿÛÛÛêöÕeÿÙÙÙ„ Q¤¬ä™)pœTf›V†âô“×ª××�‹±¾¾ÞÖ××  ¼ÌÌÿÞÞžÕÖÖjÙTÏùà¨? Q¤¬ä™)p¬Tf[U†âô‹×çÐ ÚÚÚìèèÈ  @b===Ùææ¦ÕÔÔD6üçææÚÈÈˆÝÜÜ D�²’g¦DœðYˆS�×/©¾¾>{||4  �ÐeÿjøWQQ¡ðÕnÿƒƒƒv{{k QÊJž™1n~Q†âózïõWÀ¨&DSSS  ;ó¿¿¿o–žžÙ™ÿÞÞ^Žð-Pf
oàªìö^Yî_öîÝ%Ž(Ãx!/Yu­)"ViRÄNH‘ÆBD‘Å+S(Xx+,,m–BJ›--D,,dÁº*¢…¶‚VÆ|ùxë ³{¦š}~ðýÃÑgçœ9@…²>+>/!a{{»mmm  H.þwvvt^TñŸÒ3ÿËËËÄ?€Z¡fòv
\?Õn+j9 BŸ|~ûü	y}[¢Î& €p¯¯¯¶··§¿¯zS”Î¯ýk+ìýý½@�P3ùÚžÄw ~«å€
uølûüyûûûíììÌ  @¸R©d}}}V__ŸÊøÏd2655e 5DÍäí¸ŽªÝ¶Õr@…¾ù”},d¢(²‡‡  Aoþuæ`` Õgþ£("þÔ"5“¯�I¬§eµP¡>�¡ ŸßÓýÄ   j:óßÛÛ«7ÿiýÚÿÒÒ’]]] Ô 5“·Skê£Z¨@�ÏPè uuu¶¶¶f   jºê¯»»;µoþ³Ù¬ÍÎÎÚÍÍ�@S;yC%qÀ�šˆé£Ï|è ¹\Î677  TçððÐòù¼566¦öÍÿÄÄ„�œœ Ô:o'5T7Ì«é€˜r>ë¡7 tvvÚîî® €Ê‹EÅCCC*ã¿­­Íæææ¬\. ÀÔNÞP�ë«n]MÄôÅ§àóòðõôôð‹>  U888Ð×þÓÿ­­­Úö}}m  Q;yC%q`AMÄôÕ§zàØØ˜ÝÝÝ  ˆïôôÔFFF´í?¥ñ¯mÿççç ñvRC%p`QMÄôÝçÖÇBfaaÁžŸŸ  Ästtd£££©�ÿ––›™™Ñ}×  '¢vò†Jb½½UÓ1ýôy
}ðVWW  ÄS*•tæ¿©©)µoþ§§§íòòÒ  ÿ¥†J`Í}RÓ1|ðÉ^¨^666  ÄÛö?<<œÚøÏd2æÛþùà ¼Mþ·@-—WÛïÈú,†þ ÐÑÑa…BÁ  ÀûÛþ'''ÉiŒÿææf·ããc ¼Iå-•Ä ‹j;àŸ}~ù¼„<t]]]¶¿¿o  àí¯ý*’Ózæ?Š">ø ÿØ»w–F£ Œã¤‰	ØHÄjKYÖNØj±XYlD#ˆ 6¦QÄ%ˆZŠ•Íb§ŸÀ€@´Ò*¨�
^ð†(vb%J’ÙaŠ…½¼F÷›óþ0ß`òäœ÷ÌëX†Ò,å8-Ëý°lTñI« Uriº®®.V  ð‚““{í?Ðkÿö�¡þ¹ÁÉ? ¼q f)×\Ò*X¶ªø¬µ¡Uv]xuu%  à/¶ÿ^OÆƒ=ù¯­­µ···¥R© àu4CùXXÖÚ°lTñUë\«âÒtãããòðð   ÀÃ¶ohh(Ôðo7r¹«þ àí,Ci–r�Å­sËv@Y­G-q©™™)—Ë  ~…»ÚÙßßo+ñ=ù·mGGG x3ËPš¥|ÌäGËvÀZ®Í–L&e~~^  Àï×:ƒ}í?�NKGG‡ìîî
 à¿Y–ÒLåc6XÆ"¤µò®�ÖØØ(KKK  Ä\^^Êèè¨�ü‡zí¿§§G¶¶¶¸ n,Ki¦ò1Ÿó–ñ€­Y×Fkmm•µµ5  îôÚ¿œžžÚÉ]]]°¯ý÷õõ‰®ú#ü€;ËRš©|ÌèYËx@„Z®�ÖÛÛk{� ˆ»ëëköÚMM�d³Y988àµ ðÃ²”f*szÁ2á£Ö²k£éËÆv
  @œÝÜÜH>Ÿúä¿³³Svvv8ù ,Ki¦ò1«—-ãšµÖ]mjjÊN<  ˆ«³³36ü§R)éîî–ýý}Â? ø¿=f™ÊÃ¼^·ŒDø¢uèÚhsssr/  ÄÑÅÅ…ŒŒŒØžÿ@Ã¿]û×ðÏµ ðÏ²”f*3ûÐ2á›Ö�k£-..Êóó³  Çkÿ“““’Éd‚ÿmmmöÚ©T €w–¥4Sù˜Ûw–ñ€Y­'—&K$R( €¸9>>–‰‰	©¯¯úäss“ð ïË2•f+×Ùýdø‡„VÎ±ÁìGÏÊÊŠ  ·oþõµÿ`¿ùO&“ÒÞÞ.{{{|ó ïÏ2•§?”s–õ€?¤´¾»6XSS“‹E  .nooezzZ‚]õ×ÒÒ"«««|â ?Ù»w—Æ‚( ã,*¤Ý­bÔHŠ…m4�°hEI%ne¥u›Eì,‰(6Š �l·`ë…"¤°U+5‚o|4
8{8¤Xn;s3~?8ÿÁ0ácfr?†5•¶Uûøok= à›NÞu�uuuÉáá¡  ðYÞü���YüûzòßÛÛ+»»»òþþ. €aM¥mÆ^ž·Ö:®¬¿¿ßÞ@ ð	ÞüÛÉ<÷2þëêê,þõÍ?×þ ¿1ÚVaìçÖz@@Jç¯ëËårR,  Ÿ���Éðð°·'ÿ555ÒÓÓ#z•Oý@hSY[…°§ÿµÖ~è¬».°‘‘¹¹¹  |u}}-ù|^¼ŒÿÚÚZéèè�ÕÕU®ý@eXSi[…±¯¯[ëi�‚ë›˜˜�§§' ÀG299iñïéÉ¿ýÛÿææ&ñ •cM¥mÆÞ^°Ö~ê¹.°ÙÙYy}}  <üÃ?{óŸH$|ŒûÞt6›•B¡Àµ ¨,k*m«0ö÷#k=  £sêºÀ–––ø£  €wîîîdzzÚNþ=�»ö¯'ÿüŽ@åÙ^¬mÆj­du]Øòò²  à“««+™™™‘ÆÆFoã¿»»[666¤T*	  ´­ÂØç­õ€€_:%—Å‹ÅdmmM  ðÅåå¥Œ��KSS“×ñ¿··ÇÉ? D‹µ•6–ë^_²ÖþóEgÀqaÙµÈ�� À£kÿž¾ù·±kÿÛÛÛÄ? D�¶UXOÏ¬ù€²˜Î�ëÂjii‘ýý}  ÚÝÞÞÊÜÜœ477{ÿíííö©¿··7 DŽµ•6V{þ�5PöUgÔuauvvÊÁÁ�  PÍŠÅ¢}z)•Jy{í?“ÉÈÖÖñ Ñem¥�ÆÞ?jÍ”Åu¦\V__Ÿ  ÕêááÁ®ý×××{{òßÚÚ*+++Ä? D›µ•6V{ÿ”5P–Ô™w]Xƒƒƒrrr"  T£ççgY\\”d2émü§ÓiÑ•¶ïK "ÍÚJ+ŒýÞš(û®óÇuaår99??  ªÍýý½÷ñßÖÖfŸú{yy À?öî�¥Í(àxéÐ¡C>€ˆ$/¹@ŠK�êÐE:uréÒN]—82‰sÁ(j�(Ñçg?@oI„’§ï78|ßãÿçŽÿ¼ç{ÖVÚX>Ö€š5)èh¸N¬µµ5{+ €$éõz²¹¹iþ…zæaaAô¶¶ý@rX[icùXÖ|@ä‹Ž×‰U.—í
  IÑï÷egg'è§þ²Ù¬œžž²í ¸;MËÇZpaÍD¾êè¸N¬J¥"OOO @Râ¿V«ýå?—ËI½^—áp( €D±¶ÒÆò±&t¬ù€È7]×‰µµµ%/// @ÜÝßßÛ—ÿt:jüÛÛÑzæŸø€d²¶ÒÆò±.t­ù€Èw·®«Z­r¶ wÄ{{{A?õ7==-ív[F£‘  ÉÚJËÇºpkÍD~è¸sœT¶�r<  1ŽÛ¯_þƒ>óßh4Ø• Éfm¥�åcm¸³æ"?uô\'Öññ±  ç³”‡‡‡È¡Æÿüü¼´Z-¶ý@ ´±|¬=k> ²¢càzÖðììL  ˆë—ÿƒƒ™œœ6þ3™ŒhüsÛ? „ÃK[Ëu�Xó‘_:^]&U*•²‹†  ˆá%J¶%~ff&Ôø·—ŽŽŽd0  ÖXÚZ®ëÄ«5ùã8¡djjJ:�Ž  'ÿ³³³ÁÆÿÜÜñ a²ÆÒÖò±^üþ DþúøçãòòR  ˆ	âÝÝ];óòmÿ'''Ä? „ÉK[Ëy½°æÔG«®ªT*ÉÕÕ•  v¾ÙlJ>Ÿ6þ'&&¤Z­Ú. @�¬±´µ|¬«Ö~x÷>éXw½ pqqQºÝ®  ‡ø???—b±lüçr9ÙÞÞ–ÇÇG ËK[ËÇE€ëÖ~x÷>ëØpý`iiI®¯¯ €·ôüül[â5þƒ~ê¯^¯Ûß
 š5–¶–� 6¬ýðî¥tüsý`yyYnnn €7üòoOý
…Pãßî3Øßßç� øÏÞÝ´Â†/ÉZ§MŒ:fœs:oRÊËG°³³³³QR&…bDV²˜’IL�V¤| ¥,HÞ3k¯u�«+«“Îæ¾gN=÷ÿW×7P�ÿõÌ}?a°ÆÒÖò± HYû!xtÆ\ ííírxx(  üOOO²±±!õõõ‘�ÿx<.“““’Ïç k,m-€1k?ï£NÚuÐÑÑ!GGG @±=>>J6›•†††HŸùŸ™™‘ûû{ ÃK[ËÇ mí‡àÅtf]þ˜JJJ¤³³SŽ�� €b¿ù×3ÿ‘Žÿºº:Éd2\ø ÒÆ²ÖÒær}žÌZû!xq�9×@WW—œœœ  Åòòò"¹\N#ÿ555¢oþ‰ “5–¶–�Àœµ‚÷I'ãº èîî–ÓÓS  žŸŸessÓ>�ÕøO&“2==Íwþ \ÖXÚZ> k?/¡³àº èéé‘³³3  ?û·ïü755E6þ‰„ÌÏÏóæ Âf�¥­åc°`í‡à%u] ½½½r~~.  Òëë«lmmE:þ«ªªdjjŠø XcikùX ,Zû!xŸu–\ }}}rqq!  òÌÿÎÎŽ477GúÌÿÄÄ·ý Œ6–µ–‡À’µ‚÷EgÙuÐßßÏ  P0ö³ÿÖÖÖÈÆmm­]øwww'  (k,m-€ek?ï«ÎŠë```@.// €B¼ùßÞÞ¶ÿÞ¾ƒ¹©¬¬”ññq¹½½  ÞXcikùX ¬Xû!xßtV] ƒƒƒruu%  ø>ó¿»»k?û�jüÇb1æ9
 ø›=´µ|, V­ý¼ï:kŽ ûÇåúúZ  ðù©¿½½=iii‰lüWWWK:�æ à=ÖXÚZ> kÖ~Þ�u×@*•’›› À×™ÿ\.'mmmöœ‰èmÿvæ?ŸÏ  ï°ÆÒÖòñ,\·öCð~êd] ###œ[ x;ó¿¿¿oŸú+++‹dü———ËÐÐËs À¿XcikùX d­ý¼_:¿] £££ÜZ ðræÿààÀnû/--�düWTTˆ^èÄÏþà{wÓJyÆq|!éä!Äbjš‡f¦f¬­Å†²!kEJ)9B)/`V6’"I^À¡tBÖ’§lxD×\çZž)Ìÿ¾gsÿ¿ŸºÞÁ©ÿùýî'¼Å2–f-À–e?Ä^ƒÎ¶Ë�©  @fgg)   Ne7½+MMMÁ†ÿºº:™››“l6+  ¼£ °¬¥™Ëõ´mÙ±× ³ãX ØÓE÷÷÷ @///²¿¿/���Ánû¯¬¬”ééi¾— €÷²o†f-À r~él9   8…ÿƒƒinn–ÂÂÂ ÃEE…LMMqæ å€�`Ë²bï§Î¦ë 333\ ˆ´í?“ÉH2™vÛmmmnåŸçr ‘.Ô¬åã€Mî €²› 7 V5  ‘·ýë…!¯üÛóM @”g 5kù( 6x 9?tÖ]€ÉÉIV6  ÿþ¥¥¥EŠŠŠ‚ÿååå’J¥äööV  ˆÀ2–f-Àºe?ÄÞw�5×`bbBîîî €·<==YøommµÿBÝö¯Oýþ .,ciÖòQ ¬YöCì}ÓYu- ÆÆÆø“ x×Ê:�¶ðêÊUUUîÏGã  ®,ciÖòQ ¬ZöCì}ÕYq- FGGåææF  xÍÑÑ‘´µµIIII�á¿¬¬LäââB  pdK³–�`Å²bï‹Î²k022B  xÕññ±´··»í¿¦¦ÆÂÿùù¹  à« Ð¬å£ X¶ì‡Øû¬³äZ K6›  ò=??Û™ÿŽŽŽ`ÃuuµŒ��Ëåå¥  à‰e,ÍZ>
€%Ë~ˆ½O:‹®ÀÐÐ�\__  ùööö,ü{Û¿þ9c' À7ËXšµ| ‹–ý{u\€ÁÁA¹ºº  ò·ýwuuIiii�á?‘HHoo¯œœœ  žYÆÒ¬å£ X°ì‡Øû 3ïZ ôõõqæ ð×…ÝÝÝ¶òê™ÿþþ~Â? à±Œ¥YËG0oÙ±W¯óÛµ èéé‘ÓÓS  '“ÉHgg§…ÿPŸúK¥Rrvv& €?ìÝ¿K›AÀñJA£Q#ÒÝÙÍ­.¤!â�ªXÅ4‚‚““S6qèàêêâèäÈ¤‚FÑ B†¸;¸dÑ<}Þgìz¯I¸û~àþ€ÀÁñ½Ë{‡Ob�¥­ÇÀ_k?ï›ŽC—ÉÔÕÕ%‹‹‹òøø(  T*[|}êohh(ºíŸø |:m,[Sµ¹\×¯Ck?/­£èº0;;+÷÷÷ ÛÝÝ�,--Ioo¯—ñŸN§ekk‹½ ZÁK[+Ž€¢µ‚—Òqàº099)··· –=õ·¼¼ìíÉÿðð°ìîîÊóó³  ÐÖXÚZql Xû!xIû® vÙ  Ø
‹ÿ��/ãppP666äééI  hk,m­86 ö­ý¼„Ž=×€ññq»ð	 ž‡‡Y]]•þþ~o¿ù___—jµ*  ´�5–¶V {Ö~ÞW;® cccR.— –ËËKY[[³“_ÿö¯ï/sÑ-  ¬±´µâØ Ø±öTÁq2Éèè¨”J% uòoOi${ÿÉd2ú¬Á~'  m`�¥­å¼¦Yó*’s�P###rqq! € Ø·ð¹\NR©”�ñoŸ3ÌÏÏËÍÍ�  Ð&ÖXÚZÎëš5 "t4]&T&“‘óós xÏžÀËçóv1ž¯þ­¬¬p¹-  Ý¬±´µ\×¶¦5 "¿u4\&Uww·œ��	 À_ÍfS*•ŠÝ†¯'ÿ¾Æ?þ :…5–¶–ëúÖ°æTdNÇ«ã¤’ÓÓS ø«V«ÙÉÿ'ÞŒžž™žž¶7— èÚXq¬q¯Ö|€ŠduÔ]'ÖÉÉ‰  ü�ÿÍÍM{ÏÇøïëë“©©)¹ºº²:  Ð	´±âXçêÖ|€ŠüÒQu�XÇÇÇòþþ.  hÛ7ÿ…BÁ×ø·'¢'‰ @ÇÐ¶²Ær_ë¬õ~~Tä‡Žk×‰utt$�FC  þ¨×ëvòïëS‰DBfffì©¿��  CX[icÅ±Þ][ó*ò]GÉub‹Ey{{ €^^^d{{ÛNþ}ýæ?›ÍFOýÿ ð�½ûwi38ŽšMŠƒÄˆPÒ¡C»‰`Õ¥ŠJÖúè*‚ˆ"
ñ¸ê®c!«Q'íâ :ˆšÁA‡§ÏûL%ëÝðÞñýÀýO¾Üå^¤�µ•6–�™÷×šP‰^]%×�µ¼¼,/// ˆ#þggg£�ÿÖÖV{ðïüüœø ¤‘µ•6–�¹W²æTâ‡®¢ëÆšŸŸ—z½. €8â_¯ýÇzòoþ]^^ÿ €´²¶ÒÆò1ûŠÖ|€J|Óµïº±¦§§åþþ^  ázxx°ííí1Æ¿}KyllLÎÎÎx¸ �fÖVÚX>æß¾5 _tíºn¬ÉÉI¹½½ @�¯ý[ü/,,ØÉ¬ŸúO^ûçä �vÖVÚX>fà®5 Y]Û®kbbB®¯¯ ž››‹ÿŽŽŽh¯ýçóùä?ÿœü B`m¥�åcn[ó*ñYWÁuc�ŽŽÊÅÅ…  ÂR­VeqqQººº¢ŒÿL&#CCCrzz* @ ¬­´±|ÌÂ‚5 ŸtÍ¹n¬¾¾>©T* G­V“¥¥¥¨Oþåää„“ @H¬­´±|ÌÃ9k>@%2º¦\7V.—³Ó @0�Ùç…4þc}ðÏ®ýël"þ ¡±ù¥�åc&NYóÿùíº±ÚÚÚäàà@  éwww'+++ÒÙÙeü·´´Èðð°”Ëeâ "k+m,ç™h­4Èëzsý±U, �n���R(¤§§'Êøonn–þþ~9<<ä?ÿ €PY[ic¹ÎÅ7k= Á/]5×]{{{ H÷wþWWWíä?Òkÿöà_©TâS € i[ù˜�5k= ÁO]W®lggGÞßß �Îø_[[“îîîhOþGFF8ù „ÎšJÛÊÇ|¼²Öôêª¸n°ÍÍMy}} @ºÔëuY__�öÚSS“�üñŸ @è¬©´­|ÌÈŠµÐà»®cÇÍeŸ’z~~ @z<==ÉÆÆ†d³ÙhOþ’“®ý b`M¥måcN[ë¾êúãºÁfffìŠ)  ªÕªlmmYüÇzò¯¯ýÿ ð�½{w‰+ˆ0Þ$`“t›à®¢ ±°p±
Ø„ Ø%¥Xjm'heçúÀG¡(>p]ÙUY++ÁF°Õ^#¨ëÛÂ=9œrá&ÅÌº0÷ûÁù„�ñcgæ"¸k{ÚV>öÊ¼µPæ«Î¢ëëéé‘óós TßÕÕ•ŒŽŽ–}C8¨±×þõ3Iû „ÄšJÛÊÇ^¹h­”ù¢3æºÀºººäôôT  Õ�ÿt:ô�ÿŽŽ)
Ä?  4ÖTÚV>öÌ1k= Ì'�A×–J¥äèèH  Õ=ö?>>ôwþ;;;‰ @¨¬©´­|ì›ƒÖz@™:}®¬¾¾^ P½ÿ&''¥¥¥%Øcÿmmm²½½-¯¯¯ @€¬©´­|ì›}Öz€*÷[çÍe�ÕÔÔÈîî®  ÞßõõµLLLH"‘6þ[[[eccC^^^ €@YSi[¹î›oÖx@„Ÿ:Eq™µµ5)•J x?777233c¿„zç¿½½]²Ù,ñ ™µ”6•�ý³h�Dø®sæºÐ¦§§åþþ^  ïãââBfggí—ÿ@ïüÛkÿ{{{òôô$  ÌZJ›ÊÇzf�DHé».´‘‘¹¼¼ @åÝÞÞÊÜÜ\Ðwþ›››%ŸÏÿ €8°–Ò¦ò±‡[ã¾éì».´��ûn%  ²ŠÅ¢ÌÏÏ‡úÚ¿Mcc£d2y||  bÀZJ›ÊÇ>ºo�DHêd\Zoo¯œœœ  ²þ-,,Ø�ÿ@�ýÛƒz’ø Ä‰µ”6•�ý4c�D¨Ó™r]hÝÝÝrxx( €Ê¸»»“¥¥%ijj
õ—ûÛ¶¶¶ìŠ  1b-¥Måc?�²Æ"|Öv\döJs¡P @eZ^^¶cÿú2~°Çþ777¹ó ˆ#k)m*{ê°5á£N¿ëB«­­••• ø�ÿÕÕÕ�?õg¿üçr9Žý âÊZJ›ÊÇÞÚo�üÃ/�’ë?pétZ  ~�ý¯¯¯K2™öØCCƒìììÈÃÃƒ  WÚR>Nù•¬í€ÿø¡óGG\fhhHžŸŸ àNƒØÃÓ£ñÁûO$’Íf‰ øËÞý³´…G
éØ%ŠÄ`¤Hˆ¢–RÁÝÁQÄÅO HFÅ?ˆˆ‚ n*(*‚³œ$�ÉA
F\ŠIsûöåÝiï�çN'ÏÞ8pxrî½­ÌJ[*Ž½õ§µâ»Î½ëS óóóòüü,  çø·“=÷õäß^iÐøç± @ËÓ†²–ŠáôÿÞÚ‘Õ¹Ò	\Ýôô´<>>
 àãôøö>¼žü{}Ï¿þFû¾  ­NÊZÊqt®¬í€i�}�šË¢›˜˜�B¡  €�Ñ/àÛ©x6›õö±ÿÎÎNÙÛÛãª?  ÄXCiK¹î±5�}k; DRgYç·Ë¢Ëårr}}- €Å¿�Š÷õõy{òßÑÑ!;;;òöö&  ÀXCiK9î³ÖrËÖv@ˆÏ:s:U—E—L&í�U @Sì=ø££#¯ã?“Épò @ÚPÖRŽ{mUgÎÚÑ¦3¥SqYtííí²¶¶& €æîù?99‘��_ãß¾öppÀÉ?  hCYK9î·�)k; ‚:eq™¥¥%©Õj ÷þþn�ý�ŒŒøÿöÎÿÆÆ†”Ëe  u¬�´¡âØsËÖt@D9�×…·°° /// ¿ó÷øøØë“ÿîînY__—××W  ªžµ“6Tûîƒ5QFçFç�ëU€ÅbQ  ÿ�{ìppÐÛøO§Ó¢ñÏŸÂ  ü›µ“û€Öp7Öt@D)�C�Àeñ���ËÝÝ�  «V«ÿÃÃÃÞÆ*•’­­-â €ÚNÖPŽ{o shMDôE'ïz`¿\^^
  qüŸžžÖ]õãÛôôôÈææ&_û  œµ“6TW æ­é€ˆ>éÌº^˜H$dwwW  õ*•Šœ��ÉÐÐ�¯ño×nooóÎ?  ÑX;iCÅqà¬5Q›Î¤Î/q™|>/A ÀØÉÿùù¹Œ��ùüÁ?Þù  	ÚLÖNîû°5Ü$W ¢Y£:O®pqq‘G? >þ½¾ê¯««KVWW‰  ¢³fÒvŠc/~²–šôUçÖuÎÌÌH©T huzÏ¿\\\Èèè7oã¿··WVVVˆ øËÞÝ³´E¯¯�¢ƒqÐÐî]Dtß6—€ú	|YEDM7gq''ÅAÄÁ Qptq4*Tj)†–ª9=œo�œÇ¡7ÿœoðà}þ>7÷Õ±fÒvŠb=.XËUJêìyo“‹‹€zÿòxx(###ÁÆWW—¬¯¯ËÝÝ�  €ªX3i;EqÀžµP¥O:Î› ìtëƒƒ€z�ÿL&#MMMAÆ"‘�µµ5¹¿¿  P5k&ÿÍ@ÖnÖr@•>êÌ{ÿÐÙÙ)[[[ õÿGGGÒßßôoþWVVøò €ƒ6“µSÿ ˜·–ªÔ 3¡óÇûr¸ººjW^@=)—ËvÕ_È§ý÷ööÚ�···  j£­dÍä_›­Ý&¸ µÊè<zÄÙÙY¶…¨+///r||,}}}ÒÒÒdüÇãqÑmÿ|ù ÀÇZI›)ŠõùÑ¨ÑW�¢÷g ÙlV.// ê%þONN$�NÛoþC�ÿååe¾ü àg­¤ÍÅöÿ¢5P£Ï:;:¿¢½ïïï ÔÃ¾ÓÓSÛöò�KKKÄ?  Ñ°VÒfr®ÑÖl;Öp@�:9�_ž‡1™LÊææ¦ @È^__¥P(ØU¡oû¿¹¹  	k%m&ç:mÍ–³†7Léüð<Œ���²°° •JE  Ôø?;;“��imm0þíV; èáá�¿ç  DD×Tk%m&çZmÍ6Å ðhÐIé”¼/Ž“““òôô$ ê—ÿÁÁAinnvÛ.—ã@W  "¦�d­ä_¯­Ù¾} œ¾èu*žrttT®¯¯ ;ðÏî
zÛ>Ÿç´  ¢g�¤­ä]¯+:Ek7À©[gWç¯ç¡L¥Rv% „âííMÎÏÏexxXb±X�ñßÑÑaþ•J%¶ý =k$m%çšm­¶kí8Åuò:eÏCÙÓÓ#ÛÛÛ ¡lû/‹ÿúå?Øø_\\´ø  ïÂI[É»n—uòÖn€SLgZç§ç¡Ôd{‘€¶ý_]]ÉøøxÐþéßl®ú à}Ùzëÿ˜`­6mí85è¤u¾{_(gffäùùY à?f_þ³Ù¬´µµÿííí277'zÕÛþà{g¢ã†ñ0§Æ®AMöì3¶ÙF²Ù×±ïK"¡±…Aø�¬ÉîMˆÈ>%F–aÙ¢cƒ!{�ëÜ]åÔé8§Ãó~³¼ïõ«»4ó™ù|Þç}Ÿë^®Gˆ0bÚˆÉýùM­öµ›PÕ"ÓõÂŒï�Û·!„þuéÒE‹õ­ø?~<îÝ»!„B„j#ÓH^<Ã3©Ù„ðˆ
)_].ÌØØX9rBQ gþ¿‰ß¶ý—/_&L�øB!rj#ÓHŽÏpj´j6!<"Ê"ÙâƒËÅ�õë×C!
gÏžE×®]}[ù�ŠŠÂŒ3Øö/„Bˆ\�ÚÈ4’ãsœ-™šM�(j‘h‘ãj8yòd�%„Ès8ßýñãGÎŸ½yóÙÙÙxñâž={†—/_âÕ«Wxûö-Þ¿Ï
xPIKKCÏž=yÔŸ_Ûþqû¶F´„(ˆÇ‘~øðïÞ½ƒÝÇyï~þüù_÷ñ×¯_ó{öÞÇ…ùjýR¹ R£%R³	á¡`‹®Í^½zñÁ$„¯°ÏÉÉÁÃ‡qåÊ?~{öìÁ†°téRÌž=cÆŒÁÀ�Ñ·o_˜¡×f�=Ð­[7F÷îÝùµÞ½{ó5ýû÷ÇÐ¡Cù Z°`V­Z…­[·"%%©©©ÈÈÈ`òÀòý&þù9DFFúRü—(Q‚â?33Bˆ|ugöþýû¸téŽ=Š�;w"
aÑ¢E˜>}:FŽ‰üÛ}œ¶¯ñ{ö¾vÄˆ°nþŒµk×bÇŽ°ŸMsÓ»wïÂÁ2ÿ"—0MÄ5êþ<§Fk!@á51é¸\ mÚ´ÁÅ‹!„ðn“øôéSnÞ:„uëÖaÚ´i°�E|»víÐ¬Y3Ô©SUªTAéÒ¥Q¬X±Ÿ^ÃEŠAÉ’%Q±bET¯^�sk­ZµBçÎ�‘��ÀÄBRR7•§N�‚U•ÙEP aò¤_¿~¾mû·k�âæÍ›Bä_¾|ÁƒpîÜ9ìÝ»+W®¤§Ý8zÔ¶m[4iÒµjÕB¥J•8²ãàEÂ¿[ªT)þ¬5j qãÆÜŸ™Ç	ç¸qã°lÙ2&ŽÏŸ?�G�ñ=
!<…šÈÖžãóœÚ,�ZM�)oqÐâ³ËEZ¯^=ìÞ½BˆŸÃÚñY¥±ª>çÆfÎœI±ß¡CÄÅÅqC‘—Â’	Û¨21`IV˜/^Œ}ûö±’•••…|Ïù4h�úóiåŸ›ü7n@‘«0)šžžÎ*ë¦¢Ø·*…€í“hÈ™×÷ˆ2eÊð½Ø{b÷€½G¾×Ã‡ãÚµk7B8AMdëÌq½R›¤VÂc~µH²Èq­8Í›7Bˆÿ?öøñcœ<y«W¯f…ÝZ;Y±)[¶lAœ¬¢×¬YVÉ¢°ž?>+]&@9›šŸ¸zõ*«`þœùg‚†×Ñ�;w „?Ÿ?†�®ÁVû+V°?>>õë×g5¿ %6lˆŽ;bØ°a)³Î3Ž}úô	Bˆ‚šÈ´‘óÿIÔjBxÌ/	®> …
‚e¹i<&„ø×¶~º±ïß¿VáçšiÚ´i¾Û(:š‚²õ´S§N£7n„µ¿Ò» /¹~ý:;*|*þ¹Ñ°Jžÿ„/4WµJ9½R&NœÈy|™¢ˆöÉý„ãdV½äèÀ¤I“°eËØè“ºBˆÿ„ZÈöwÔFÌÿ'P«	#ÀX‹®ŒÖ­[ÓÔFñwž<yÂöÊ%K–`È�!¬´|{0ø=*W®«*ÑØjÛ¶mô4°t®‹ÿÑ£G³íß¯nÿ£F�RÛ¿aœå·j8gççÌ™CUóJáúBT«V�‰Ž¹sçâÀ�°D#�a…ÿÄ´5‘ûÚ£6‹• •-ÎX|u¹PëÖ­Ë68!`s”<c~Íš5>|84h€Â…s­5*T¨€öíÛcÖ¬Yì‚°nŽB„[ü<ø[uÎwaI¶ßºuBï�¼�;sÖ§è�‰‰qX¯¾Ið³X¸p!Ì³†fµBBLQ¹­5j²3ÔhB„‰²!‹7*ç–—/_!‚Š�ÅÌÊÈ®]»0eÊ´lÙÖJøã÷¢jÕª4 JNNÆ…Â2"`qv\/^Ü�Ÿ!Ý¾-¹DÓ1!„gsýLnÚ´‰�C�5‚�6þžý�“cx‚�™ÁrÔËVu¢€ µ�»—5YˆMˆ0ŽµøÝõa`•(Š !&üYÍ6ó;Î½×®];ð›Ã1Ÿ2óCž[�ššê•51S§N¥1ž?7&5ÌÓ@Ç¯
ááÜnFF¶oßÎÄ¡u,þþüÝ]4�Ý¼y3._¾ÌSm„è~�ZÈ4‘ãº¢&+@N",š[Üq}X{¯ÚÁD`°H¶^Ûl;ÛÌ£££¿t0�bÇ„¹Oó|êììlü,öÂ™øråÊùñ³¢‘¡uOp£-„p?‚5--¡PˆÆ]f¨øû±KbÒ<_x²�ù½( ‡i j!÷õDMÖœMˆ0RÆâœãÅÊV¹Ó§OC?cÇ"±íÚ\ y¾U™¿ñó*"""Ç#tNœ8�¬¬,ü ¬àY[¼_gþùïêÓ§�Ä¿î>-ì 1Ÿž‰øûïŸì�Ï+îyÇ›™c”b”ß²ÀJÉ¯(W6rýxlÈ“XÝHéZ^l¸±±‘Äµ"V,P~Eš®…0	Ã ™2„Ü¡tæôÞÍbš‡ïãùþz¿êü×óùžûyÎ9ïã§€ß�š a5âÚÚšÜÞÞ
!. Hµ�?¾£_¡Íyc~Òø¢ñÍÈ�MLL”¡¡!!Ä¡kü`
533#^¯W"##]Ñ{ÃùR¬ÖÒªfù}©$���aÛ€�µŠ–Ž��<8-//!äõ�['''¢�[¨VkÕÚõùö-óxqq±Œ��‰:£Ó#€8h ÕB¿h±/Ðf„¼1Á5þ2ÚšªægJ„8´¤kk:v"'$$ˆ^l\¹{ëÐU‰Xq———'ƒƒƒr||ü_«§àÁ †]˜Eu¨øÇ.­¦Ñg…�×=àb%ëÔÔ”TWW‹vn1�æ ëÊÊJüíµEšwDâÔ¤ZÈûÿ?B›òÆ|¯Q¤ñ‡Ñd_ZZ
±DˆSæC777¥­­MÒÓÓya4ñ! ªª
;¨õÿ¯¤>`æmÿÎÿ0JÔ™Z^œ	y×××¢­¹0iÕíÌã&�ÄÄÄHcc£èŠ\Þ‰EÐ@Æ¿h±"h3B@´Æ¦Ñƒ›““#ºÖ‹Ubk´U-‹ÃÃÃ’••…Ùt¢®¿Ä™\IB{¿^â±1@W¢ò¯JG»ýWTTÈúú:s*!¯ôkéîîÆêQÍã®Ï£ÈãØ‘ÞÞÞ.ÛÛÛØ¾@ˆªÿÐ>ª�üñ�lB“ ~Ö×øÛÈÁMNN–��y~~BìÈÝÝªE555-Z¹pý¥ÍjñÜÜ\éïï‡øÇ¾]Wþõ,2ŸòŠªÿìì¬x<Ñî ×çM«uui›4ü¦§§E+§|à$vÿG«ö�2ö}@ƒ�C“@€OþðhhhÀË;!6Ûß
#¹ÞÞ^IMMeµÈÚí¤¨Ž;Õ¹[ÿ]˜ùßÚÚ‚ï!Ä7åàà ›D´åœyÜÚÝ LMMM¢«yo$vî6‚öñÓüÿ'Îÿ“@û ¼×øÝhRWÓ.)BìTõWwu¬XÓQ×_Ì¦¶ýÃí_Å?«b„¼€««+™˜˜�’’ºûÛ(‚ƒƒ%;;[ÆÇÇñb7Tó@ûÿ ÁÞsþŸšD�¯FpZZšÌÏÏóòJlsiÔÕ-¬ú3¬PùGÛ¿îùgþ$ä…Ý[Ÿ?­úÓäÏžcXŸÖÑÑ!jìÊ±'b§ùhÕ>þø¾B‹`Â4F�ú DEEIOO8±ü¥qooOZZZDWûÑä�aºø/++m…eÛ?!/hù_\\”ÚÚZQ“P×ç»?DDDÀøT×îr$€ØeþšGµ�?æÿG¡Å	0?j´jüit>WWvÑÝ•X–‡‡Ñ–˜………¹þâÅ0]üc}�VþùpJˆ�U·››‘ÌÌLÑoÈõyÄ!�N¼ŒŒåº@byTë@ó7Œ†öj…#$Àü ñNã7ƒ‡ó\‡‡‡BˆçýÇÆÆDW±U”a·<DéžŠB|äüü\ººº$>>žÝ[�¤¤$Œ\\\!VEµ4�ñ3íõZŒøEcÕèANII‘™™Î±Kqyy)}}}’žžÎõ~KTºŠŠŠdee­Ì„�ÿçèèHš››E×´Rü;<âââDÇôh,M¬Ú‰­£šÇç}Œ» 4bÌquvvbÎš+$éÓÓSimm•ØØX×_ªÖÿ………²ººÊ<Iˆo³¶ðÈðz½ÝrQ„‡‡ã7ßÙÙ‘§§'!ÄB^RÐ:ªyžsh®Vÿ‰™|§ñAãÂ  Œ\îïï…³Åÿþþ¾Ô××Ó$Ša‰

’üü|ÑÊ?Å?!>²´´$�Gt×¶ësˆÛBs<˜.,,Ð$•XÕ8Ð:Æ;J¡¹>@ƒb"ù~ð€1Ïîî.çZ‰©lllH]]�è­ë/QÓ¾299I£TB|dnnNÊËË%44Ôõ9äöÎç•ö<Œãcš¸9È4(a!ÒDIÉÆÆÆ-6ÃBwgc¡fyYiv6w#Ò±AäG?¢t7"¹Ó%I]J�ŒüHh”fjžyzÊbjº}ù|Ï9Ÿú¾^õþžó9ß÷çó<ï'ªR“e#SzÄ% øÐ‘dG½N(óÿæ½ ÒL¾ê£kA—––J<·Äu€t¼üoooÛjµÌÌÌÈ<!oÌ?¯X /œ±mjjíœ‰ü‚¾‘ÆÆFÑš ÃÒ½MÊ<Žz�0êú£y/€4ó­êƒêO—‚ŽÅb¶›÷ööV R=—µ±±!ÍÍÍ$ý#_Ì¿}¸®¯¯Óö ½$³NýÝpŽ£ÿ¨¦¦ÆÌ×ÃÃƒ ¤õ6æqÔë8Ö³y­æ½ <Èx§úÝ±¨-mýððP RØ–e³ÕjþIúGÞþ544ÈÊÊ
æ  ùŸ˜˜5ÿœãèUYYi5òøø( ©F½�y÷Z6¯õŽùð…Uûa¬p™��%¹RÆææ¦´´´ðb„¼š[]ZZbÕ@ÀKÜ¹¹9›­ÕË³ÈŸ!èë� ä©@JQOcÞF=Nu¼ožÀbª„ê/—ÂÎÍÍ•¾¾>fµ %|Úù$o[Þòb„|1ÿÏÉÕ„¡|ù_\\”úúzÎqHuuu¢— äMA*ÓÿÍÛ¨Çq¬_óX	ó\ å ¼Wýáøläggg�Lvvv¤ý§v^Œ�W/ÿ:ó�ùøª6??/”Iz‘jkkE/è6…” ž&¤KJóXï™ÿßr šU¿¹ÌÅÅÅ¢�l|CÒ8::ÝóÏ~hä…222ÌÄ,//“ö,íß¾´c†­-è5²M[[[VK ÉQÒ³Ê¼�{ÝšÇjfþ|ãUÂµÀóóóehhˆö,HÖM¬µbåååEþù³¦juu•À?€€ìííIkk+\ÈIííí²»»+ I\ÿgžF½M5›0¯à!¿ª°mûÍÍ� „ÉõõµJaaaä?|�mÿÏ;ª1ÿ _ÓŽ��¥»»›—ä¬¬¬,éêê’ƒƒHæeÔÓ„qYù`ÀS~V}q=”ËÊÊdŸ1 õvffFtPä?z�?aTSSSÌ¡äêêJDÃ´"~ Pd/³ýýýö@ ò…¥yõ4aÔêóX žR¡Úp,r{¡•ûû{á¶¤h��üÇòg•®bÀ.qÇÆÆ¤   òç
Wååå�Ç=…01£^&¬®ÓóX žò�*®úÛ¥Ðß¼y#mmmrzz* ŽØŒŸ&¬Gþ#yø÷lþÙóð‚ukkkR]]-úŠü9‚B—¥´k�Ñ‘¡¡Æ¼ŒzÇú4O7�à1¿¨.]ã¢¢"[Õà:ÕÛÛKâ?òB222"OOO ÁÿONN¤££ƒÐ?”TuvvZÀ$@Xë¦ÕË„Q›—æ­ <§IõÙµà³³³E[ghÉ‚×bíÕÃÃÃRRRù”~UUUÉää¤ÜÝÝ	 ãââÂf´srr"† ä*‹IOO�\^^
€ãÈ’yõ2aÔægóV žó½jQõ�ã6 Kg=??€×´Œ&	ihhˆüGJ»,|rzzšM€^âŽ��3÷ÿ/{çóJiÆñ"å�¼½ˆHÇR~-åM)6J‘,Ä±éµÐHo’,^©“¬&†b¡“da¡$fabLù™2HNØÆ¯$õ�«kñ6ãõãœyžæ<Ï<ßO}þƒ§û¹¿÷}Ý×E™)))ðz½¬Ò"†�ì¢%Æ«–4KMj¶"Äü#‹0bjj*–——AH°¬­­iÓ?µæøí¨¿¬¬,ÈÍ?Ã?!A6o]XX€LËà:N©¹¹¹˜™™Ñç'„üš]$Ã˜ñ=k¦"Ä&”‰ïÍ(ÇæI,	ŠËËK´´´Àår9~#CC_ö?11Á‰&„‰ßï‡Çãá¼’ƒÛššìíí��`‘Ì¢ÙE2Œßã{ÍT„Ø„?Å·"Œ�††¾Ç"s¯ÖÝn·ã714¤ÝþµáŸÏçã¨?B~²ô?66Öñk	�IIIhkkÃõõ5	É,š]$Ã˜ñ-¾ÕLEˆ�x-~aÄÌÌL¬®®‚�@ØÙÙAQQ‘ã7/4¤ê�¿½½]§PB‚;Ä]ZZB~~>GþÑ�÷n™œœÔç(„ˆfÉ.f|ƒ_4Kb3þ?ˆ0 vþå-y	=©ïèè@||¼ã7.4ô ………ØÜÜ!$p>ï|Fss3"##¿ŽÐÐ?(++Óç(„Z½$™Å¬©%4Kb3þß™q“ÖÔÔÄi äÅ†QÓÓÓÈÎÎvü¦…Zg¤TWWNOOA	èí¬ŽÎŠ‹‹süúA­abb"úúúpwwBéþ/™Å¬òÿwš¥±!‹—"Œ˜‘‘�ÅÅEò'''¨¨¨`Ã(j%uíš››Ó±”„�çù¸ü‘O¸¨Õª¹tœðÊÊ
§�—Ð¬"ÿ}3¾½KÍP„Ø”Wâ'nÒôVàêê
„<6óhhÉÉÉŽß¬PëõhllÄöö6!Osvv†îînâRË™,Ä=(yý>$«˜Õýÿ“f(BlJš8.Â€º!¨««ÃÁÁù=‘?<<Dqq1ÂÃÃ¿Q¡Ö»=JHHÀàà KH	y†ùùyHã?Ç¯ÔšëxNNfggÙ�<…fÉ*fbŽk†"Ä¦„‰â­ÑÅWÞaé��'®ú>OB–ã7)Ôº–––b}}„�ÿ³¿¿�ÖÖVHÅŒã×
jM£¢¢PUUÅž.äÙCLÉ*fL/¹;4Cbc*ÄuFƒ×ëe	ù���äååAºõ:~ƒB­ktt48Í„�G�¼›uü:A­mZZ¦¦¦X@»ŒÒŒ"YÅŒom]³!6'C7£«ººšÏ ÈãVz{{9ö�ÚBiR©V„E9::‚Çã�lœ¿FPK«£)kkkq~~B”ÿkF1~û¯Žkv"Äæ„‹oÄ¯"Œ(MÞø€üÇÖÖäöŸGj].úûûqqqB”±±1¤§§;~} ö™ì"#‡ÙÓ…<,ÿ7«õWñ�f'B~JÅyÔ2oyïÍg 777èéé�tçuü†„ÚÇ’’Hü~?êëë¿.PÛ¨Þ*++q||B¾ëEeÖSÔyÍL„ü&$‹ÿšñ ¼¼»»» ŽF¿�‚‚¾ý§vRÇuvvâöö„8ŸÏ·Ûíøuá{gÓJëÆñÎ‘ŽG"jLÏ„¼tŠ‘¨“BaëVÉP$¥…Ú$e²'Œ¬�2ñZlo™ ´21ØR	GYY[+ÉKþçêú
ë™<×õÿÕï¬û~Öýžûº..‹‹‹±¾¾Ž��"çQÍ&]ÿŸÒÌDˆ~#â/éXXXˆ­­->xóúúŠ¹¹9ÖþÓÐN899!žI$èïïg	eS×îîn$“IßHÑL"Ù$ˆµõKŒhf"Ä‹{AÜÆýý=ˆOnooÑÔÔÄ¹ÿ4”æååAº³“4qÍêê*d¶ºûço/€ÃÃC>Ç}£YD2IP_ÿ÷4+bŒ?Å‰ ^ ”——cÄÏÏÏzmTÞ¶º?€ÐðÚÙÙ‰‹‹â‘T*…ÞÞ^HWu÷ÏÞ[ ìIåÍ"’I‚z0¡Y‰ƒü+&D¤cff&fffô*8ñÅõõ5ººº ¾î 4´j×ó……â‘x<Žúúz÷Ï^%ðé–óós·å¨šE$“±¦š‘1J¥øCDºF"\^^‚øªµÚÝÝEQQ‘ûÃ¿}}}x||!Þ˜šš‚”Â¸Ðp›ŸŸ�X,Æ�Q>Ñ"Y$¨õôC3!FÉ£âG]X777AÜ aihh2†ÇýÁƒ†ßºº:ììì€o=\¤Æýþ§¡W¿ü¶¶¶âááÄšA$‹±–>Ä¨f$BÓ"^‰HWùŠ óà‰ÎÎÎP]]ÍÑÔ‚:Åbbb‚M¤ˆ't|ZYY™ûýOí”sáýýÄš=$ƒµŽ®4bœ¿Ä˜ˆtmiiÑPHÌ£®KKK�9êîÔŽ¸¹¹!NžãÚ1;++ËýÞ§v¦ºŒ��ëXKâëƒ”d� ÖQL³!ÆùCì_D¤cAA–——ùæÕrÅN»FË•;÷jÇ’’¬­­�hÃ´¶¶6÷ûžš*Ð›‰§§§ n^djö�Äz{4â€Zñ§ˆt•¯	ZSHì¿m­ªª‚tÞuà ¶FI���áóó„Xgqq‘×ÿ©5õf¢”¶°œËQÉA­ŸŸš‰qÂñ»ˆt­©©ÁÆÆˆ]^^^°²²‚œœ÷jNkywwB,óöö†ÁÁAŽp¥ÖÔÆÄÑhÉdÄ<š9${µ~¾k&"Ä	¿‰_Å”ˆtÌÈÈÀÈÈˆ†Db“««+ÈÈ4vÿ§&­¬¬äDâàúÿš››ÝïwjN½™X[[«%.Äü)Í’=‚X;)ñ«f"BQ.î‰H×ÆÆFƒØäàà ìþOMš���ÉÉIbýúii©ûýNMª7···Y`Í’9‚Z7{š…qFžø-¨.¬³³³¬£µ‡þ¦óóólþGMÛÓÓƒ§§'b•ÑÑQäææºßëÔ¤:Ùbzz©T
ÄìyT³†dŽ ÖÍ7ÍB„8äñ¿€Ð§e­#µuîÔ¶ˆÇã Ä ZÝÞÞî~ŸÿÏÞ¹»Ô•Ea|pœQgFñ¢\X¤°ÐB¢¢…W1i,;ÁB%…b©XH@A|‚Q´Tn‘|€·½¦Dâà$ñJôÞä›Å*Â¼Šsš³×÷ƒß°÷a}ûì½uV½ÞÖÖÆ¦Ôî¢C²†_kæÍ@„¥Dœ¿ˆðb(ÂÆÆˆ[¡¡¡Á|qAÝ¶¸¸ÓÓÓ ÄEvww!o¤Íïsê¶ˆF£¼�ê&š1$kø±V¾ˆsš�1Ê�b»÷¡	‹Žå¸¿¿q‡ÍÍMäææš/,¨ûM¤zzzø~”8Éìì,ŠŠŠÌïsêþ8ÀååeÄãq§Ðl!Ã¯QÔq±]3!†ùM|'Â«õõõˆD" n�L&133¹Zg¾° îÛÒÒÂë£ÄÉw³}}}HKK3¿Ç©û} †‡‡ùwÍ’1üZ+ï4ûbœŸÄAñI„µÁÐÀÀ ‰ˆïÿÍÔ†UUU:ñ‚—¸½½åûjÂÔÔT„Ãa‚8ƒf
É~51}5ûB¾«?ˆð¨¾�Åb �GgêJSóEµaII	æççAˆKÿ÷÷÷QSSc~SæååakkÄ$SøÙ‹êƒfBˆR(¾¿úðñe3-GØÙÙAEE…ù‚‚šy?ªqíi±´´ÄùÿÔÔ-€ÅÅEösqÍ’-üX_Å·šy!ÊâKñA„SRRÐÑÑ�««+�`³¶¶†ŒŒóµc{{;@ˆ$’	Hã,6r¥¦ÁÝÝHð‘,¡™B²…kãA|©™‡òÏÄm1!Â‹åååX__	.���˜šš‚t\5_LP3j“¡³³3âÊw¼µµ•�\©)»»»q~~x4KH¦ðc]$ÄmÍ:„�oøE|-~áAýk,]‡µø Ám544d¾� öîíí�¸º¼Buuµù}MmÙÔÔ„ããc�à`J–ðë&ê'ñµfBÈ7|/>ß‹ðªÚ|ˆ“ÓÓStuu™/$¨-C¡VVV@ˆD£QTVVšß×Ô–eeeØÞÞ	6’!ü<À|/>×¬Cù?‹oÄÏ"¼˜••™Çª³äIð888@mm­ùB‚Ú2''ããã Ä�	 ÚÇ¥´´Ôü¾¦–Ô[¨ºöI`Ñì Â¯ÑŸÅ7šq!ÿHªøB¼áÕÆÆFœœœ€�H$9E7_HP{¤{{{Aˆ &''‘ŸŸo~_S{ÎÌÌp@pÑì Â¯õp)¾ÐŒCùW~7Ä¤/`bb$x¬®®"33Ó|AíÙÙÙ‰D"BþMû¸dgg›ßÓÔž£££¸¿¿	$š$Cø±’â†fBÈ’&¾?Šð vnnnÆÅÅH°þÍÍÍq 5i8ÆÍÍ	ø€öqIOO7¿§©=ûûûq}}843HvðkzÉGñ•fBÈÿR"þ.>‰ðbaa!@‚C<ÇØØ ¨Iëêê‹Åô5!Aî -kùOöÎ¦%®,Ã3’™AdFZiQü@Ò"´â'6˜vöî²r'¨‚B+„Þ�¸SÈ^DEÄ…èBŒ"¶ÒhqaãÊM ‹h *ÑÄš—úÆ>Â=ÔûÀóÎ=·ë­{ºßãÔ¤½½½¼ÒÕO43 ;¸xîàžfBÈ£ø¾�Ÿ]ü§¶««K®®®„x�vÍGFFX8R“ÆãqÙÛÛc€xÍåå¥Äb1óû™Ú_�9ƒÊC�43 ;¸x>Ã7ši!�"F`>@ÉÆššY[[â’H$Ø  &mii‘õõu�">£_?›››ÍïgjR½>îøøXˆWhV@fpñ<À4Œh¦!„<š?á;øJêûûû9�ÅÎÏÏ¥§§‡ jÒºº:YXX`€xÍéé©Ô××›ßÏÔ¤úìñÍÈ
®æ–|…ï4ËB~‰ø
f\}UÛßßâGáØÙÙi¾€ &Õë/'''uˆ!¾rxx(ÑhÔü~¦6­¬¬”ÝÝ]!Þ YÁÕ3��¯øõŸ�§ñ7\€ß¡dc(’¡¡!¹¹¹lŽŽŽ¤££Ã|AMªÃ‡ÆÇÇÙ  ¾¢ó+¶¶¶¤ººÚü~¦6ÍÏÏ—��!~€l YÁÅú‡ša!Oâ|/­Õ¯$Ø¤Óiioo7_@P›ëÌûû{!Ä×ÀêêªTUU™ßÏÔ¦999ºˆ?'–�\­ÿ|­†òdþ…à(ÙXXX(ccc,¬N*•’ÖÖVóµi8–d2É÷ñº°¼¼,8m~?S“ê£••!Á¿µš�\¬ýøA³!$ëa€ð”lmkkÓ!s$¸ìììHSS“ù‚Ú´  @†‡‡Ù  ^7 ¥¼¼Üü~¦v KKKBü<�làjí?Áÿ#Äpþ„’�EEE211Áâ:ÀlooŽb™/ ¨ÝÿŽðE¼n ÌÏÏKYY™ùýLÍ6 ô6ø¯ÿš	�\¬ûO¸­™…â„¿`ÂÕ)€x<.™LF‹<677÷°š/ ¨Móòò¤¯¯� â+z…åÌÌŒ”––šßÏÔn`nnŽuf°•š�	\~ýOhf!„8áwøîÃ(ÙXRR"˜²­w~’À¡“s#‘ˆù‚Ú477Wº»»åîîNñµ055%ø­5¿Ÿ©ÝÀìì¬îÜ{ÿ‘\½§à>|©™…âŒð-üââÅÜÐÐ '''B‚y w¡›/ (O âk`zzš' (O ð@`AÐ,€µr±æ_à[Nþ'äy¨…]Ú•ëëk!�Bï�®­­5_@P»3 Ù  ^­Eøá Ê $� ö×€,àjÍ?Âºß!ÏÂð=ü%[£Ñ¨œ��		Þ- ���æÊ[ ñù€ŠŠ
óû™ò 8´öGpµÞßà{Í(„�gã?x
%[C¡�Nÿ¼½½R©”Äb1óµi8–d2É ùŸ½sii3
Â0E¼«´‚ˆˆâAu!hí"EëBJ@ÜéÆ…ˆ;Š—)Á�%TpÑmT4Ø¥  ñB¬/P"xÙˆ¢`ê"Va:ôxÌ9_æ}àù'çË;ó�oŽ§ ‘H„***Ôïg¨·°°°@À=8óKöçÀÔzJm xQ^³a6ijÀññ1µ8D,£ÎÎNõê´¤¤„�  ÀÓ€h4JUUUê÷3ÔiVV–ìàÞ|Îü&¿ýO²a©M  /Ê+ÖÇÆYz®EEEéöö–€ÄãqêééQ  NËËËe2ñÓÓàÑ€Ìr©­­U¿Ÿ¡NåF#àœõ%ósö7µÖqÖ‡Éÿ ¤‡|ö+›2Ñ¥mhh ÝÝ]npxxH~¿_}€€*•¢)£ <Íöö6ñ«úýõ6r×××	¸g}y.qö7±Î)ö«Ô$ €´ñ‘ýÅÒsÍÍÍ¥ÉÉIœp„D"ACCCÄÇ³Ô‡¨ÏÆÆFâéÑø,	x¾‘ÛÔÔ¤~?C�òsi‚§ÞþKÖçÌoj�I- Hû,€oì_³ *++ikk‹€}...htt ¨ÒÖÖVZ]]E xš³³3jiiQ¿Ÿ¡JeŽÑþþ>g�ŒÏYßT¶üË~Ã·ÿ Øá3ûÛÔ)€ééiº»»#`—««+š˜˜@ ª´½½�666ä;j ¼ÊÍÍns�jííí•asÀ	$ÛsÆ7ùöÿ·Ô   +¼e¿³)§ äÛ[îâÍ›eîïï)
¡ UÚÕÕEGGGh  O“J¥ˆËê÷3Ôéàà �žžpbò¿d{Îø¦reŠý.5 Àê)€–žkvv6ñýÛòØ}XÏÏÏ£ UÚ××G×××€—á!–2Ë%//Oýž†úÇsÜ�S¥’í9ã›Zß¼ýÀ>ïØ�©Y ÕÕÕ´¶¶†S –YZZ¢‚‚õ!ês`` 7 €Œhäâë¶Ôïi¨JÉ’|•«œfÖŸC’é9Û›üö?$µ À:ŸØŸ,=×œœ¡ËËKÖøÿÀV$ *åÅØØ�	Á{vv–ÊÊÊÔïk¨¯077‡F®}$Ës¦—loh}JÍ p‚ö‹©Y ¥¥¥�Fñð¶H<'ŸÏ§>H@]ÓÌÌàqd†Åòò2ÕÕÕ©ß×P“2TZ~ûÀ.���’å9Ó›üöÿ‹Ô  gø`h€Øßß/×Ñ;œœœ?ª>H@]Ö××Óââ"�	ìííQss³ú}uYSSC›››ìr~~.YÞàÚîH­ pŠ7l�ýcêM\$¡‡‡iG†çLMMa Te[[Åb1 SŽßvtt¨ß×P—ÝÝÝtpp@ÀœÝ%Ãs–7µ®Ø Ô  çxÏþ0y�k"‘ `çá‡Õ	¨.8âê(�QWúý~âÙê÷6Ôãðð0N�ÚE²;gx“ëúCj €“ä±Ãì�‰ÏSè¥M&“ÒÏÊÊ
åçç«P�|\QŠ&ð�½ó{¥5ãøäçRšˆh”«ñ»dÒHJjäÂÅfî†;MG¹pDQvwê\’¸’¢ã‚�Ú)’s¡-Ùi§œ›as4r¡sÎwžž¿aYÛ^ëû©Ï?°×^oßç}×³âÈ(@=ÉUPPàýÞ¦þñøø4³Kv79I*&þ£5!äÍR-nºÉU/¢;99±ÏÁÁ¤'Úû0A½Pç¥ƒ—&,..¢¼¼ÜûýMý™ 0??ÏK¤ã‡fvÉî&[H7µ¶ „¼iRÅwâWSó©©)žˆ‘Hr|Ôû@Aý°¬¬ Ä¥I ÇÇÇhnnö~S?ŠÿÂÂBììì€Äïë¿dv“ÅÿWñ�Ö„�7Ïoâ'&¬®®Æîî.ˆ]b±ÆÇÇ½Ô›ššx qŽ‡‡tvvz¿¿©û¦¤¤ àìì$.hV—Ìnr]?iMAIRÄ>CTécÔ CìÎp���å$ ê…¼8Š8I?¤8ò~�S÷Û¸ä£Ÿãq|Ù(YÝäšþ'öiMAIªÄ5&¬¨¨@(ÒžFb�íímäååy,¨û_ŽúúúðòòB\cnn%%%Þïsê¶™™™XZZÂÓÓˆõûF4£KV7¹¦kZKBŠ$±[üb¨·KúÅÅˆ=Âá0ÚÚÚ¼ÔmKKKõ´!¢­-Þïsê¶ÅÅÅ8==±ŽfsÉè&OŒ~»µ– „$¿ŠÅï&ùùù˜™™á˜.‹ÜÝÝattÔû`AÝ¶¥¥‡‡‡ ÄEîïïÑÕÕåý>§îšœœ¬—ßÜÜ€ØE2¹fsÉè¦Öó»øQkBHÂò§5u
 µµGGG ÖæHë©´´4ïu×žž}ÙEˆ«ŒŒŒ@ŽH{¿×©›¦§§czzš£ì£™\²¹É¯ÿQ­!	Í/âñ›©·¼òEšy‹ìïï£ªª
IIIÞ‡êžƒ ÄeVVV ý¹Þïwê¦¹¹¹ØÚÚâ=QöÇþi&—lnj-¿‰´v „$<ˆŸE˜°²²ëëë|Ð["�bppò†Ýû�AÝ³¶¶››› Äe.//ÑÞÞîý~§nÎÿ¯¯¯G$±zñŸfqÉä&×ó³Ö„'Èß‹/"LØÛÛË‡½%žŸŸ±ººŠììlïƒuOé�æØ(âE;×ÀÀ RSS½ßóÔ-å?­-.±XÄšÁ%‹›\Ëñ½Ö„gø]‰0aQQ¤ßKgÕ“×çüüÒà}Ð îÇ±±1ž&"^°¼¼Ì6 êœ999X[[c´ˆüÖšÁ%‹›\Ë�Ö
„§øYü[¼aÂÆÆFìíí�Ø™044Ä¯GÔ)å¥–a$Ä®®®¼ß÷Ô­—¸2â’#¢í¢Ù[2¸Éµ¼»ÅŒŸ!ÎQ&®ˆ?L=øåH£Q'¯þ¶W/‘ÊÊÊò>pPgÔbèúú„øÒ³+G¥y¡+uêò¿ÉÉIÜÞÞ‚Xk5ÝNôC\Ñ�â$©â_â¿"LXSSƒ���×'£®®ráŽ÷¡ƒ&¼ú2kbb‚ÇFÿgï|^)ßÃ8~/®ºÄ	%1”…sjÒ‘�•Ù¨QâDR6ÊFfJSÊ;Ä›e¡Ù(ibaá”²°¸¢‰’I~S~KNg<óîYÝîÜi6Ÿïé|}Þ¯zý¾�çûþú<Ÿç!6¡­Ò~¿ßúß?}è¦¢H$"$&hæFö6ù/`£~#B^,ypFMu´´´ð/\__K__·ÐaUU•¬®®
!6qvv&¡PÈúß?u¿ÉÉÉÒÔÔ¤WILÐ¬�Ìmòô?
'õÛ€ò¢I€Aø~7Q@rssett”ƒ¼œoÕ&´ÜY<¨ëÕ™777BˆM<??Ëðð°dffZ_¨»õz½233#OOOBb’5k#s›z†ßágÔoBÈ‹'¾‡w
ˆÞg¬­­•��!Îrpp õõõ’’’b}ø î5??_æææ„	‡Ã‚ÁiÖ×ên}>Ÿàj¢þS‹8Žfldm“3Dîà{ý& „XÁŸ°~‚QS÷y;;;y¢ç0÷÷÷ºJ
ÿ¶>|PWïþ×Æ„ØZÇ»ºº$11ÑúZ@ÝiZZšôôôÈÝÝ�ÇÑl�Œmrt~‚¥úM@±†dø~…bÂ¢¢"žêÅ }ôääDêêê$))ÉúBÝ95z||œÃÿˆbó0À@ `}= îþ·¾¾Î«Ÿ±A³52¶Égø¾ÑoBˆuäÂ0b ˜èiÚÓu×1q½o755Å;¤Ô•ÖÔÔÈææ¦b1º6] Ö×ê>=�`‡ÿÅÍÔÈÖ&;†"ðƒ~B¬$áž©�€YYY200ÀÓ=‡» ööö¤¢¢‚+©›ÔØd¡{Œ	±�ùùy)..¶¾.Pw™——'Ìy1 cÍÔÈÖ&ÿíÁ ~B¬%¾ƒß ˜°¼¼\–——…8Çãã£Jzzºõa„ºÇêêj®þ#D½ÎÕÞÞn}] îˆuõßéé©ÇÑ,�Lmò~ƒï4ûBþ°} à+¸hê*@jjª477Ëññ±çº ¶¶¶¤¬¬Œ] Ôj]‘««+!„ˆÖñÙÙYÁVëëuÍ=ý�D"BœZ³4Þ�&[ÿá+þ#„ mª‡_ ˜0;;[°ë˜/	yxx�þþ~ÉÈÈ°>”PÞý'Ä�
îS[_¨;®p566êü
â,ÈÎš¡‘¥M>Ã/°ž­ÿ„�ó7�&¯¬­­	qîôh{{[*++¹NŠÆýÊ¨‰‰	Þý'äg´ ¤¤Äú:Aãÿôqq‘{ÿc ²³éÖÿ8¢YŸBþsà5\‡QSwÅÚÚÚ÷ùÂppÀØØ˜x½^ëÃ	�[umåÎÎŽB~æèèHz{{%!!ÁúZAãRÝ?ßÚÚ*———B_õ¬ÙÚäÎÿuøš­ÿ„�ÿã/ø^@1aaa¡LNNòäÏtïþþ¾ƒAvÐxSçSx½^Ö B~ÃÊÊŠøý~ëk�O}>Ÿ,--qï¿Ãà=©ïKdg“Ïï¾ÕŒO!¿ ~„�ŠŽžh	‡Ãìpˆh4*ÓÓÓ’““c}H¡q¥þþ;::dwwW!¿DOV‡††§~Ö×§ÿÝÝÝr{{+ÄÑÓÍÊÈÌ&»�áGÍö„ò›�€Õð“Ó¿C¡·8Èùù¹444ˆÇã±>¬Ðø±´´Tp—‘Ã@°w>¯°ïaïÞpš{GÝ[’„$RR6WÊ%YúÕµ“1Ùœ’ƒ•¥¬d§wÈŠ¨“)Gg1N™	‘˜dLScLÓ±ñÜ§ç/˜3óyfÔçýª×_ð�ù|ßßï÷ù@
ƒAjkk³þÜ€ï«Š«¥¥…xë>âèOý—¬lnê¿xÂþƒÁ €T(`çØ„É­ <èŠ­ >Ÿ�¸LÏúÀßÏÄè©©)ŠF£ Hm³Ëüü<9�NëÏø.”ßâôô´TÝ©ÿœ‘MOýO°s’é  EêX?ûf¨X¦ÕÜH”x~~¦ÉÉIr8Ö‡˜{›››åÿ H�ËËK¡üü|ëÏ˜[y®�p½¹¹! ÚÆ)÷JÎÈ&KÿßX¿dy  øÉV 71ØG&ûŽC¡•þ1	�s©Ì£à¯ü@GGGÔÐÐ`ý9skuu5mnn¢ô_ÎÄ’�9#›¼~Ö�Ò @:üÎþÇÆî—AG±XŒ€ÎK€µµ5ª¬¬´>¼Àœ•þËÌ‡‡ ü<‰D‚¼^/Ö»Â\)¥èôòòB@ÎÂ’‰9›¼~qÖ+  ÒàÖÅ~5Ô
 VUUÑþþ>ÖÉ(N“&~³>ÄÀ¬+_.yð¾�···400@yyyÖŸ)0û¥ÿýýýtqq�s\wv“daÎÄ&¯ßû•uaç?  ~e=l˜%J éîî–ýõ@‡““jmmEx„Yµ¤¤„VWWñÕ€Ì«¹äEZ]]�õç
Ì®���´³³C@ÉÀœ…Mç´0ë‘ì  òëe˜œ033COOOtúH766ÈårYf`V”ÕEãããøO`¸ ¸¸Øúóf¯ôvv›t‘û$g`Ó}ÿ?X¯dv  0Äßì7“­ ´µµ…�âJ)î-C)ÌÚ®è³³3”Œ`�»»;%~Áfý9uåÍ²‡>‰P]ù'Ù—3°éÒÿo’Õ À yìG6d² ½½�NOOñÐ Äýý=a¥Tµ¼¼/ó Pjà^lÙîÂ+Â¬?k ^ßoo/"�éþŸ%órö5]úb?JV  ÃüÅÎ±I“ÃyÒ,&†+©««/ Š¥¥¥´¸¸Hñxœ  :-]TSScýyU*¸dýÞÞžüÖ€’u9óšÒœdç$£ €.öK¦,**¢õõuz}}% 3iÖçó—h[t Y¹Qúþ£Ñ( ôH&“´´´DN§ÓúsUfL,,, ‚KÎ¸’u9óš¾†_$› €"¿±Øï,RN� JÏt�©ìËËËÄ¥ÚÖ‡h®_”+K°*
€,¶tñ7¼€Æ,(( ±±1z||$ [úÏWãCÌwöƒds  PæOö“éV �ÇC×××tˆÅb2�§üZz`æÿMMMä÷û¥Â ��‡ˆp8Ln·›
­?‡`æs˜éêêŠ€*’m9ãj”þ’L  YÂÅ~fÉ”‡ƒxýŒ<¨½þ3ž(�y 0#ëëëi{{m; ä€óósêìì$~€³þ,‚éÛ××GÇÇÇ¨àÒÿø"Ù–3®ékø¥ÿ €\´üË^³dÊÚÚZÚÝÝÅIy(`OO�õá¦gYY­¬¬H[	øŸ½si‰+‹¢0Ý¶_¨ ‘Dˆ�øÄ(’¤AH¨SŽš'„ˆˆ !œX:�8P‚H©ˆAQNDDiŒ˜A’"ÚÑˆb¡èêÍý0pïµn�õÁ÷Nqj�}ÏÙ›ç9==Õ\~~>~	c€þ¸wîÜÁìì,‹¸ößÚÑL+ÙÖê5üCü�Wÿ	!WA¼øB<a•UUUú®˜Ø×ðÝ»wðx<Æ‡ úcÞ¸q½½½<ürÅŒ��£¨¨ÒÅÝø½‰^ÞÂÂBø|>ý[Ñ,+™Öê5<_h'„�+âWÑ'Â"õmcKK677Al+¥E€ÊÊJãÃ½œYYYèééaÇB‚„Àq SSS�'9ÆïOôRjÁhtt‡‡‡ ¶¢V²¬ý:|š½	!ä
ùYôˆk"¬2%%^¯GGG öÎ–.++3>Ñÿ655òåŸ‡B‚ð&ÀÈÈ222Œß§èÿ?±æáß$»j†•,kõ:®‰ÍÞ„rÅ$ˆmâž«ÌÎÎÆôô4ûØçææðàÁãÃý×kÿ:=bgg„�àCtÚ—£  ÀøýŠþ³R ÒYÿß¿±ýÝ¿fWÉ°V¯ãžØ¦™›B‚„tq@„•–——k—Zb'''xûö-¤«´ñ!‰þÝ´´4tuuáë×¯ „/ÇÇÇ˜œœÄíÛ·�ß·¨ªJ-õ÷÷óðïšY%»Ú±žšµ	!$ˆøI,ß‹°Êèèh455±€E€ùùyÞ ÞºuÝÝÝðûý „¸ãF×ØØ¤É›ñû½xó¯ODööö@y÷¯™U²«Õkù^,Õ¬M!AF´øTübõäööv|ûöÄþ› 2"�ó¥7==}}}ØÝÝ!Ä5èX·‰‰	ÜûíÂÂÂŒßËLõ7>>Înÿ!U³ªdV«×ò‹øT36!„))¢WX={|``@ç{®­­áÙ³gˆ��5>@¨Îýú5@qg1waaÕÕÕˆŠŠ2~O3Íˆˆ<zô333ú[ ö#ÙT3ªdU«×3 z5[BH�“kñh@µ¸¸X¯©ûÙÞÞFkk+¤’m|˜2Åððpí!cÅøÅˆ�`eeõõõˆ��7~3D-ø444@Ö^úÄ4›JFµcM}š©	!ÄDˆÅV		3z8%öóñãG½Î&óß�U„FmZ$!xË†�byyuuuHJJ2~ŸuðäÉ¬¯¯ƒ8úÁD³©dT«×tC|¨™šB\B¼øÜêÑ€×¯_ÇË—/9�Ü!ä¸Ž—º{÷®ñá*„Çüéaii	„�ÐlLÖÑÑéíaü~ªfff¢­­M÷Ä9$‹j&•ljÇÈ¿çš¥	!Äe¤Šƒâ©ÕÊ^½z¥c�ˆ#oÛ.Þ“ÆÄÄ´BÉÜÜ\x½^lmm�²è¸¡¡!”””@¾T¿÷…ˆÚ°·´´Tû¶ìïïƒ8;zS²¨…µSqP34!„¸”RqY<·z´Íââ"ˆ3œŸŸëlÛšš$''ºÜîµk×ôð?88Èf„˜SÌÕ®ðìà~µ ÿþ}¼yóggg Ž¢T²¨Õëz..kv&„'>?ˆ°Hoäñx°±±â0>þŒÎÎNäååqT K½yó&jkk!·:td!Ä¨I/úF¼¹¹Ò±ÜøýÐ­¦¥¥¡±±«««löç<š=%ƒÚ1jóƒøX³3!„¸œD±UüS„UÆÅÅéà§OŸ@C;ÄË3”˜˜h|sÓUÑœœôôôÀï÷ë­ò{çúbãGñ(„—ãÅ4Æ%qd¦iŽ´‘ˆ¦f^à�æÈå�Éå¸+L’[r742î/”dä’—Ž»‘LnGã’Û¸L§‰ÖY­¤”œsôìÙÏžg}jýÏÞûÙë÷û~¿ëkL4a»¸ò]Ø>în€äZñ§Lžââb·ü'zNyOzÐ ?ß—ÔïòÌÆSOH¡J¨¿ƒ®f.X° ¯_¿†©Ûn€û÷ïcîÜ¹à¡ÒÝ !WjjªªG�uv†1æËHÀÍ›7QXX¨9æDþ]R©Òœ––†Ñ£GãìÙ³®ú'zMyNzÏxìû/‘W6Æ˜zFu:èPÀŒŒ”––¢¶¶¦nsÞ½{§™ÒX,†Ö­[GÞ¤…±ZÔ­[7,Y²ú³i4Æ|3É¼¤¤ÙÙÙîéšÖþýûcË–-xöì™çý=¦¼&=g<BÿNË#cL=ä'*F]	:033'NœðcbfJµwÅŠ
ÄiÚ´iä[¢ÅJžªþùùù(//GMMŒ1æ{‡›7n`Ö¬YàJ9o
IXk—.]0qâDpÖ_&q]�ô˜òšÁ‡þÉÇä‘�1¦_üF=¤”6lˆáÃ‡ãúõë¾H �<þ<


ÀrÈ©U«VÈÉÉ+z®cþïß¿Ç‘#G�››‹””ð¿5òïÔ´ûk¯|^^žÂZ¹©Å™-‰=üË[ÒcÆã÷ð€*ðáßZSk¨¿($µ.r>Î;ÍÜðâÅ”••aÔ¨QàX€óêHÍš5C×®]5ŸXYYéYcÌ_æ>|ø›7oVëyË–-#ÿ~­«Î-ú]ànÜ¸ü\õô”ò–Á�ÇÈ¯‘'6Æ˜ˆ�A¢jƒ¾˜2e
ž?“Øp©G�i^nèÐ¡hÓ¦�/â¸º{÷î˜3gØ�¡\cŒ	bãËíÛ·±téRôìÙÓ[_â|ðïÛ·/–/_®˜Ó³7	G^’ž2‡ÿZê�¼°1ÆDˆ†Ô¯ÔÔ'
A©]»v añf€Ä£=ó<ÀÎ�;1lØ0´mÛÖ£Æ-Z wïÞ˜9s&.^¼üÝ&jŒ	œ>èPºvíZôéÓ3ò…n0­þºTé×¯–-[ndpçV¸ÿå%é)ƒþì?ÉûÒËcLÄhB�¥þ¤¤ÒÓÓ±cÇWCCÔRZUU…íÛ·ƒªZÓüDÞ þÀÁ_(ÌXÐ
Æ«W¯‚3»>øcâ�§·nÝÂªU«T­f:½3~,³HÏ®W¯^ÚÐÂgêƒ¸�w¤‡”—þ; Ï;VØc"JKªˆzðÍºÚ¢<èõ€!ûSeK©þX¹—^³¥\UyCø¾Ï2ŒYYY(**Â¹sçÀÖDÏ‡cê<íÕ«WàÆ e4HUìF�Eþ=ýoâ3RVË�!C°~ýz\¾|ÕÕÕjaÁ‚ÞQ2øB…¼n‘¼¯1ÆDœTª”ª¡ T¥àaÉ°á›-ÕêÀcÇŽ�k§T	aW€Mä×U"­�êÐ¡ƒ.K¶nÝ*Óýöí[cL‚ÑzÑ{÷îaÿþý˜4i’:“š4nâî®¯/oµ·S§NZç·oß>Ü½{Wc&”\òŒôŽñø>ÔP¥ò¼ÆcÄ/TyÀy šS1bîÜ¹>Øº®jWìh<`Ì˜1NœþÜêß£GÌŸ?'OžÓ Ý"jŒ	kÅTI.\Ðx@,/t#ÿçÁƒŸ‰ªý\ËêŽÄ�C¯(Ï|Æ…¼m¹¼®1Æ˜/4¢r©

JÊ3fàÉ“'0¡E»Ž‚¤jÒÂ…µs—É»Qªø«åpÂ„	(..Æ©S§ÀM
nó7Æ$ZËÃ®‚_™ž®5‚¼ˆÔ¡?;;Ó¦MÃ®]»Àg¡gbB�<âôéÓãå;*¨\y]cŒ1_Ñ˜OUQR)))à¡Róv&)ÒwupàÀ,Z´yyyHKKÓ­|}ªò7oÞÀÔ©S±mÛ6œ9sF‡þ�?Âc’¹•úéÓ§¸rå
Øö®5¥#GŽDÇŽõî«Oïqf h®öìÙØ³g.]ºVûÎšDÐÊ#¶oß>ß“*j¼<®1Æ˜oò3µ8ØP@I³Ô«W¯Æ›7o`’~^jËc+¼*ã………êàç©ª9˜v“Hi¦?33ãÆ�ÃÊ•+uÁqíÚ5Ð(Û,cêõ«²²Ç�Ç†0yòd8P«a?¿Ç“â°Oi-\NNŽrÖ­[‡²²20ŸÅ•þäõò†ôñøÞTS‹åm�1Æ|—tjõŽB�êÜ¹3vïÞ­:“œ³¦�?FEE>ŒM›6aÞ¼yÈÏÏWB>+1¡
b(–*Clë×žç½{÷ªÊÏà,¯¨ü‡½»w©óŒÃ8K—B±CÍ$(‡vª¬rüÔÉ%‹Á—É.:Å!ˆ:œšA)X„‚.Ç:Aq‰:¨X0�B£µô×‹kíÒ¤ÏõøýÀ=*äðxÝÏs¿ x°›ÀžœœxzüââbLMMÅÀÀ@477{Ô]ÚV§¯øwÒïæ›Ïð{‡ø���ÐÑ¶ìÍRïEuBwÃïŸ÷ÊOJî à?ùAYPþR"ËÔÔÔD¡Pà&@Ðúx?uÑrÏXXXˆééiO7íîîöîùõõõ‘Ëå¼5Åº}-/ñSý†††Ð&†žÎ?>>šÒï÷Ùææf1à€ó Z7v=J'Ãø˜ØÉÉÉŒŽŽŽÐ¦lÞ•½²²2Å±±^ZVQQµµµÑÔÔäŸ©}ƒ¼yŸö2ð¬Ýtöò¬«««@Ñþý7Z�0ÁàßÝuÁ] ðAê•×Jd�|>ËËË¬µ.Þ)}~Â´»»ëëë¡ÿk¯CÕËÑÑQÏÐS'Oãìééñ´üöööhmm�–––hkk‹ÎÎÎèêêŠÞÞÞèïï�¡¡!¯œ˜˜ð9Î³³³~´ºº[[[~²¯”D øxþÛ¬b|ótggÇG³iª½ŸÖjæ—ç###¾Ù«Í=ËJ7}}ÍÖµÛ×qÅëÚîÏé>?Å×küZ}/ò=£lmmÍýÃÃÃ8;;ãøàâ~¹¨¦š=òÚ ðÁ>Wž(»Jd�ÆÆFOAÄÃ›5 3˜].OOOãøø84p÷>{{{^Ë©xVÁÁÁAèß]uŸ7vÒ9üðàv¯ãžU¥½üd^7
|¾þþþ¾¯Ýº†;ÚwÀ×q}Î_£™~�^Ë	+—»Ÿ:`ªÁÿ®òÄ ðQ¾Tú”7)¦ýiÊ¶   Šš;Ÿº_ªS…Þ(}î® €ÿåk¥OùM‰,£uážÞ½½½   (Jîzê|)öRÜQûÜY ™x¬¼P~W"Ë”––†Özš    Š‹:ž»ž:_‚Á¿»éwU @¦¾Sæ•k%²LYYY{�7   Šƒº�;žº^ŠÁÿ�ò³;*  ‰¼ò«ò·Y¦¼¼<ÆÆÆ¼¡   î7u:w;u¼ƒwÑvü€´>S”U%2ŽÏÖñpÞ   ÷“ºœ;�º]ªÿW•wS @R_(O•#%²N.—‹™™™8??   Ü/êpîrêt©ÿGÊSwR À'ñ•òLy«DÖ©ªªŠ¹¹¹¸¼¼   Üênîpêr©ÿo•gî¢ €Oê±ò\y§DÖ©®®Žùùù¸¸¸   Ümêlînêp©ÿï”çìø ·'§¼TþP"ëäóùXZZŠëëë   ÀÝ¤®æÎ¦î–jðÿ^yéî	 ¸Uß*?**‘eJJJ¢®®.
…BÜÜÜ   îw4u5w6u·ƒwÌWÊ7�  wÂ÷Ê/ÊUª™ +++Ì þaçŽUÚ
Ã0Ž7Ú8‡î—RÚ¡ ‚�4h0Žz®^�×àäÖ‚�Á)�I#QPH ‹àâêâ&1qILÞ>¼s‡ZÎ[O’ÿþ×�çûÎ9  eOþµÑ"Ÿü÷UÕ·&  U~¨³¨K€õõu«×ë\   ¤ãðïÛL-òðæ �:ª j¤,ÉæççýæêêÊ^^^   oÂ·˜6™o3m´ˆÃÿH5TÁ7&  •Þ«-u­ÆÊ’lnnÎŠÅ¢5.   Þèð¯-æ›LÛ,âð?V×jË·%  ÕÔŽºQÃˆK€ÍÍM»¸¸°^¯g   ø?´½|ƒi‹Eþ‡êFíðä &Çµ­n•E|°¶¶fÍfÓF£‘   –6—o/m° ×þ½[µí[ 0QÕ®ºS–tÙlÖJ¥’µZ->   ~í_›Ë·—6XÔáÿNíú† L¤Eµ§îÕ8àM ÿþìòò’Ï   hcùÖÒæŠzò?V÷j�Ã? L¾�j_=D}°ººjµZÍ†Ã¡   ÚV¾±´µ"_ûPû¾ SaI¨Ge¸±±aº�æ    ™Ã¿o+m¬ ?üóÕ�oE ÀTù¤U[YÒe2+
v~~ný~ß   ðO|KiSù¶ÒÆŠ:ü·Õ¡oD ÀTZR?Õ³²ˆòù¼�œœØ`00   ¼Šo(m)ßTÚVQ=«_<ù€é÷U«§È7NOO¹   xåá_*úÉÿ“:VßÞ fÂu¤ºÊ"ÊårV­Vù   à/h3ùvÒ†Š|òßUG¾ 3å³*G^¬¬¬X¥R±N§c   ø3m%ßLÚNÑ‡ÿ²o@ ÀLú®*ª­,¢ååe+—ËÖívøÍÞÝ«´€aqÑâb!âVÒ”¯E:Õ#pVpéæä.dpÑPpQüEA‡à98:¹¹H!.
¢&tQòôáÝZJé�¯¨¹/xÎá~“|ù  À�ÜHÑJn¦Ìã¿áÕ¢ý  í³·îµ<e¬(
-//«Ñh   !ÚÈ�­”xü·¼õh>  ìƒ·™ùv€r¹¬¹¹9Õëu  t:7Q´‘)ûßþ7yæ ð³ÂÛò®<elppPSSS:==  @§rE¹�2�ÿ+o+ €_øâmxMO+•Jš™™ÑÙÙ™   :�(ZÈM”yü7½�h;  ~£â­z7ž2ÖßßŸz
   S¸}¢�ÜB™Çÿ�·M À({K™�ôööjttTûûûzxx  À+­ãæ‰öqeÿì)Z €¿ðÉÛÎ| ««Kccc:88Ðýý½   ^™h·N4�Û'ûgÿÛÑp  üƒ�ÞŠ×ð”µ‘‘íííéööV   ¯D´�'ZÇÍ“¹†·í Àxç-z×ž²6<<¬Z­¦f³)  €—ÎMmãÆÉ>þ¯½Åh6  AÙ[Ëþ%@QÚÙÙQ«Õ  ÀKå–‰¦qÛ<Å7ÿk<ó xlï½yïÒSÖ*•Štqq!  €—Æ-ã¦É>þ/½ùh4  ”¼YïÜSÖT­Vurr¢v»-  €g.šÅíã–É>þÏ½Ùh3  ½õ¦½º§¬õõõibbBGGG¼&  <gÑ*n–h7Löñ_÷¦£É  x%oÒ;ö”µžž���Ç{sïîî  ðÌD£¸U¢YÜ.ÙÇÿ±7É7ÿ €§öÆûê}óÚž2ÖÝÝ­¡¡!íîîòç€ßÙ»c–6À(
Ãi�¸Õƒ�¡ƒ"DÈ\Éä ¥NÒU'AüÁM¡cVÁQp¨‹RG‘B)ÜŠPÑ@CEogìPZêÕ¨ïç?¼7‰Ÿ   “¸MÔ(n5Kæá£iïÜ`  Üƒní­¶¯ýÐ"k•J%ÖÖÖBëð.   ¸On5‰ÛD�’ü­¿k_{ëö àuk¯µ�Ú•Yˆ¥¥¥h6›  p_NNNÜ$år9ûø¿rc©µ8þ �¢¨�i;Z[‹Œ
…èëë‹ÙÙÙ8::Šëëë   ¸+j7ˆZÄM¢6É<þÛÚŽ6æÖ  ƒti5mS»Ð"k¥R)ÆÇÇcww—Ç À]ps¨=Ü j‘ìoþ/´M­æÆ  ´!íCö‡ ]]]1::�F#Z­V   dQk¸9Ôn�üãß-5ä¶  ƒ´am];×"óOFFFü ÏÙÙY   Ü65†[CÍ‘ü“ï\[×†9þ IE{¯}Ó"sƒƒƒ±¸¸ÇÇÇü‡   p+Ôn5†[#»gÜLj'7  ÐKmAûªEæz{{crr2öööx  üµ„›BmáÆÈ?þÝJn'  °çÚœöY‹Ì‹Å¨×ë±µµív;   þ•Â-¡¦p[äÿn¤97  �@I›ÒöµŸZd®Z­Æêêj4›Í   øKn5„["ÿðwíkSn%  ‘gZ]kh--2W.—cff&x   ü‘ZÁÍ vpCäÿn¡†Vw# ðHUµí»™ëéé‰‰‰‰ØÞÞŽËËË   ø�Á­ fp;äÿn 7  OÀ+mYû¢EöjµZ¬¬¬Äééi   ˆ©Üj7CþÜ>Ën!  ž�Ú´öI‹ìõ÷÷Çüü|  €šÀm F¸£ãßÍ3í à	êÖÞh;Ú�™ûÅÞ½«4@Q&ÉÌà„šFlÒh7baÐÊNˆØLaïHµìEÑ`«h/ZXˆ…�ÚDPÁ"A%÷,ö2£ÛÛÿÁÿk1ç¤Óiëïï·ÕÕU«Õj  ¾¿tøM Û âÁÿImª‚ß>  |aßUAm¨Ge¯Y2™´žž›ŸŸ·J¥b  àËðí×à·€n‚ˆ‡ÿGµ¡
¼ì  ‘„Ê«u­,â+cccvppÀW  øÜ|ë÷÷÷}ûcÞòï]«•÷[  ˆs95©Ž”E|%```ÀVVV¬Z­  ø|´ñ¾õ…B!è-ÿÞ‘šôÛ  üõå€£êPYD]]]¶´´ÄO  ø\|Ûµñ¾õÚü¨Õ(/û ày2ê·ÚQõˆ±nkk³‰‰	ÛÛÛ³z½n  àÃò-×¦û¶kã£üëjGýö[  <[Jõª5uõ“€¾¾>[^^¶››  �6Ü·\›ù/ÿ·jMõú  þÉ/5«.”E”ËålffÆNOO­Ñh  xÿ´Ù¾ÝÚpßrmzTjÖo  ðß²ª¨Êê)bÌ[ZZlhhÈÖ××íîîÎ  À»å[­ÍöíÖ†G=ø?©²*ú­  ^ÌO5¨6U5bØS©”µ··Ûôô´�œœð¹@  Þm³o´¶Ú7[Ûõð_U›jÐo  ðâ¾©5§.•E”ÉdlxxØ¶··­V«  x{Údßfm´oµ6;ªK5§:ü6  ¯&¡ZÕ¸:V�ˆ±O§ÓÖÝÝm¥RÉ®®®  ¼ßbm²o³6:êÁ¿¡ŽÕ¸jõ›  „~*pKÝG"‘°l6k###¶»»k  âh{}ƒµÅ¾ÉÚæ¨‡ÿ{µÅ'þ  x;?T§*©JÔ›šš,ŸÏÛââ¢�ŸŸón   ~ë¯ÍõíÕû¾è¯¢JªÓo  ðæ?	˜RgQH&“ÖÜÜlÅbÑÊå²Õëu  /Oë[«ÍõíÕG>üŸ©)þå €?ìÝ¿KœYGqn\ÔìŠ’6•‚)"‚m$EÀbšX
	XÛØØ¤›4)ÄbR‡€6‘„4B,Ò	�XL£¢±ÐN|öðôa°Ü8ÎùÀù¾wxßyïõÒOOè#]R("“““ùDâøøØ·$IúŸú³­¹±lmn.Û[ªKúHOòŒ!I’®�_é>½¢¯ô½Ôu�ýýýQ­Vcww7ÎÏÏC’$ýg¹¥ljn+[òz¿ïô•^Ñý<[H’¤këÝ¥eúBQòºÀñññX[[‹“““�$Iÿš[Ê¦¾Þ/ûBËt7Ï’$©%Ü¡
} &E‰:::bpp0æççóÉE³ÙI’ô÷ØÌÜN64·”M-ùÃ¿I¨’gI’ÔrnÓ½¤ŠRuwwç“‹ÕÕÕ¨×ë~@’¤`#s+ÙÌÜN6´ôSÿzIc~å_’¤Ö÷UéEÉbzz:¶¶¶¢Ñh„$IJ‰mÌ�d+s3ÙÎÒ}¢jž$IÒ�ÑC�è5}£(UgggŒŽŽÆÒÒRìíí…$IŠÜD¶17’­,ýÃÿ½¦GyF�$I7Î-ºGËô™¢d½½½155qzz’$µ#60·�MÌmd#K÷™–éžú“$éæû�ÓjP”lxx8æææb{{Û¿H’Ú›—ÛÇæ²‰¥kÐzœgI’Ô6:hŒžS�¢d]]]111+++±¿¿’$Ýdl]nÛ—È–®NÏi,Ï ’$©-ýN³ôž®(JÖ××•J%Ö××ãðð0$IºIØ¶Ü8¶.7�í+Ý½§ÙÜ|I’Ôö~¡ô‚(~Æßfffbss3...B’¤VÆ–å¦±m?éuÿì€^ÐƒÜzI’$ ýI³ô–®(J722‹‹‹±³³“÷"K’ÔJØ®Ü0¶,7-÷­|Wô–fsÛ%I’~à6=¤S”®§§'ïC®Õjqtt’$µ6+·‹Ë-Ë]+ß1Õèanº$IÒ?0DÏè]R”nhh(òÊ³³³�$é:b£r«Ø¬Ü®Ü±ò]Ò;zš.I’þbïþYªnã8Ž“v;©â
-M�˜SØ`þ™} m987JÒâÐ�‹S…b‚IACO¡? h -"6˜ÚAQxÔãñ{¿ù÷xC”]zî÷ÞOáúx�ãùýô“ÎÑuz@[%êéé‰‰‰‰XZZŠýýý�$	Å±I¹MlTn›Uª-z@×s»%I’~ÁEºKoé�âO×ÔÔ###±¸¸qtt’$•Àå±I¹MlT©‹ÿ!½¥»þÖ_’$ýNM4@OèE‰ÚÚÚò·•ÏŸ?�ííí¨Õj!IÒŸÀæäö°A¹ElRÉoý?Ñð·þ’$é¤üM·éý (QgggŒ��Å‹/bww7$I:A¹5lNnTòâÿƒ^ÑíÜdI’¤Ö@×hž>Rd…8>>ËËËñõë×�$éwb[rcØš’ø£ì#ÍÓµÜbI’¤?ä] QzI_(JÔØØÝÝÝ199+++¾1@’ôËØ’Ü¶%7†­)yñÿB/i”.ø ?I’TJ#]¦;ôŽöK055«««ñíÛ·�$ég°¹!lÉi¸øïÓ;ºC—ss%I’PÚyºAÏh›j¥ÞÐÛÛÓÓÓ±¾¾{{{!IÒÈ­`3r;Ø�‚OöÏj´MÏèFn¬$IÒ)sžºè½¡ï%jhhˆÖÖÖŠ………ØÜÜŒJ¥’$)·��È­`3r;Ø�’—ÿïô†nQ——I’tÚýEWè>½§JÉÚÛÛ£¿¿?æææ‚?òü� IRn›�ÛÀFäV¾øWè=Ý§+¹¥’$IgÄ9j¦Aš§]ª–ü €÷5ç·;>Œµµ5(IÿCœý¹lAnÛPúâ_¥]š§Ajö!’$é¬j ¥eªP”ü  ¥¥%úúúâñãÇù^çƒƒƒ�$Õ7Îú<ó9ûsØ‚Âÿ¬BË4J¾ÚO’$Õ‹fºJ÷èR”|P`WWWÇììllmmùA€$ÕçÅ?ÏxÎú<ó9û?à/;¤t�®æFJ’$Õ¡6¢§ô™ª¥ÿ# ££#bffÆgHR8>>þ÷7þœíyÆsÖŸ†oü«ô™žÒPn¢$IR�k¤Kt“^S•¢d¼ç9¿ŒG�å¿‰Öjµ�$�)yvïììäYÎ™žg{áwùSV¥×t“.ùNI’þaïþ]¢Žã8Ž!ˆ�u$A"Üä¹Ê�´Ýp‚«RPºÙRƒ‹QÖÐà "Dps‡ƒK¨[˜ Aˆ|•.Áé‘<¾(ï^¼ç è—oóù€ç¿ðúðÑï}¿8o.©‚z¢6Uªì4kjj²ÎÎN°¹¹9ÛÚÚ²4M šoµ6Û·[î[®M�pñOÕ¦z¢
~ö  œcWÕ-õ\}VÇÊN9ÿ¯Q__ŸMMMÙÆÆ†úc¥ €´É¾ÍÚhßjm¶o·6<BÇê³z®nùY   ¹¦Jj^Õ•E(“ÉX>Ÿ·±±1[YYá €¶Ø7YÛì­­öÍR]Í«’Ÿm   ø®*«îªªúª,@þÉ¨ÞÞ^·jµjûûû ø·´½¾ÁÚbßdms¤‹ÿWUUwU–ïù  üœ‹*§¨wª¡,BÍÍÍÖÕÕeÃÃÃþY©Z­f €¿K[ë›«íõÖGºø7Ô;õ@åxÁ  À¯iVyõX½W©²(uttX¿ÿötmmÍ�† þßTm«o¬¶Ö7WÛ©T½W�TÞÏ,   ü¶Ëª¨ž©êXY”ÚÚÚ¬X,ÚÄÄ„---ñó  øÚPßRmªo«66ÚÅÿX}PÏTÑÏ(   üqmª¨^¨Íhhii±žž±J¥b;;;|9  ~Ì·R›éÛ©õ-Õ¦F¼øoªªèg   þº«ê¶zª>*‹V6›µÁÁA›œœ´ååe;880 €8çÛ¨�ô­ÔfúvjC#öQ=U·ù¤  Àé¸¢Jê¥ú¤ÌöT@¡P°r¹ì/°J’Ä à¼Óú&j}#µ•Q/þŸÔKUò3   §î¦º§*ê‹²ˆår9µ……[__·££#€sÂ7OÛç¨-ôMÔ6Fí‹ª¨{~Æ    œê¾z­eËd2V*•ü‘×ÅÅEÛÝÝµ““€ÿŒo›6Î·N›çÛ§Œ|ñOÔkußÏ   „w]ÝQ¯T¢,jÝÝÝþÂ«™™[]]µz½n pÆù–iÓ|Û´q¾uÚ¼È%ê•ºãg   Îœ›ê¡z«jÊ¢ÖÚÚêß¹žžž¶jµjÛÛÛþl 8#|³´]¾aÚ2ß4m[ô‹M½UyÔ  àÿpM•Õ•¨TYÔÚÛÛmhhÈfggýíØ{{{üD @D¾MÚ(ß*m–o—6,ú¥?U‰z£Ê~F  €oì�½K]w‡ñ¥zS¥ƒÈá"JL‡�Ú¡Q‡ÚEÄPœL	ØÅQh¦Ð©à Z¥“SÁø8E‰‚P(Z(%CK°¨ H¬µ¾4ê·>pÉ’¾`rÏõyàù>�ž{Îù€¼£ZÞ–ßÈŸä2rÕ‚‚‚hllŒþþþxðàA,..ÆÆÆ? À¿èW‹Ü$µÉ�R«Ü¬\nª›ïöûoÀmÿM    €¼çmÙ-'äÏr_FëOdµ¶¶ÆÀÀ@ÌÌÌøZ;;; ðºPsÜ5È-R“Ü¦\ï§ïÖ»ùÝþ     Š™’Ê¯å�r;×Ÿ(**ò	Ú���188èÄõÎ-? Ày]ô»1j�›£ö¸AjQîøo»ín¼[Ÿrû   àÂR Käûr@~'7eäú�………QQQ]]]144ôÂ“ggg ðoQ;^¸Ó¯¶¸1j�›“ûývÓ-wÓÝö.ü   àeŠd£ü\~+Wå±Œ<àÓ¶oÝºÃÃÃ1;;›}2€3 àUïôgïô»jˆ[¢¦$äN¿=v³Ýn7¼ÑM    ø¯dä§rJþ&÷däºÅÅÅqéÒ¥¨ªªò]»‘‘‘˜››‹'Ožðc  ¼|Ñï6¨n…šáv¨!n‰š’÷Üh·ÚÍÎð¨?    üÞ’—e‡üJþ ·ä©Œ×wîR©TTVVF{{»ízøða<~ü8ž>}êovÀ…Á›×öÝ µÀMPÜµÂÍHBÛÜ`·ØMþRvÈËn6    Àÿ¤P¦ä»òžœ•kòHFô»»¥¥¥Q^^7nÜˆ»wïÆääd,,,Äêêj<{ö,ž? �?hÓÞ¶6î­kóÞ¾à¨	nƒ‘�äšì»É)7    à(‘iÙ+Éßå‘Œ$YRReeeQWW===1>>KKK±µµqrr �8¼]mØ[Ö¦½mmÜ[×æ½}5 i¹µn®Û›v‹    ^e2#?–ãò¹/Od$HÇ»ºº:2™Lttt„ ó;Á+++±»»ÇÇÇ|U  GÑ6½QmÕ›Õv½amÙ›Ö¶³ßêOš'rßmucÝÚŒÛ    ð†(–Wä{òž|$7å¡<“a“óª€ß®­­�æææèïï�‰‰‰X\\Œ���ØÛÛ½GÌa‚ ooOôµIoSõVµYoWÎ>ÚŸ4Ïä¡ÜtKÝT·õŠ[    �C¼#ëe·œ�kòO	Õï	§Óéhhhøû Á©©©ÐÉá¾ë¨‹ž 8g´1oM›óö´Áì~Þ¦6ê­&¹5n¥›évvËz7     Ç)•õò#ù…ü^ÈS	ÕwkjjâêÕ«ÑÒÒ½½½1::óóó±¾¾Î çpÁ¯mycÚš7§íyƒÚbö.’=•n¤[éfÖ»¡     	¤R^—ŸÈqù«<Jø�Vß	÷EÈµk×¢­­-úúúbll,{~€SÖ�d¼. ð
´oE›É¾Çï-iSÞ–6æ­e¿ÍŸpOå‘[è&º�×ÝJ    €<¡H¦åò39%·eä‹ú¤˜/RšššâæÍ›qçÎ�¸ÿ~LOOÇòòr £MxÚˆ·¢Íx;Ú�·¤My[yä¶Ûçº…i·   þbïìBº<Ã8l.e	vàÆèÄÑ"Ü�®£†ÕŒp±HhäZ¡Ð¨ ²>��
'Y‘´'ÂJ$³X‹³TeÂ?‚Ö§m.óÞÅï ƒA�¶Úÿý]pA”¾ïóÜ÷ï}áéý2Æ¤1ã±?Äü	‡0ÒÉ¬¬¬àÙd}s|æÌ™OþC ¥¥%ÎŸ?·oßc’™Wö9ž,ø96tŒp¬è˜áØI7‡ð'¬Á±ÐÏöcŒ1Æ˜¤òÎÀ�±{q#ÍËËngÖsÌóæÍ‹ªªªØ³gO;v,úúúbhh(ŒI”e2­l“qe�Ì+û:8&ÒÕaìÅzügè\gŒ1ÆcŒ™˜�%ø)6`?Ž`¤«<Ó¬Ï–EIII,\¸0Ö¬Yûöí‹ŽŽŽèïï�„1/3dTY%³Ê.V–É´²MÆ•u2ŸÎŽ`?6à§X‚ù:·cŒ1ÆcžJ6àø96ã FÌÉÉ‰É“'ëågóçÏ×›Ï7nÜû÷ï�ãÇ�ÇåË—ãîÝ»aÌ‹€ì)ƒdQ™$›Ê(YUfÉ®2L–“â 6ãçøèfŒ1ÆcŒyf^E½/ ·`¦0’ä¸qãbâÄ‰1}úô˜;wn”——ë*ëîÝ»£­­-ºººb``@oQ7æ9 ,‘)e‹Œ)kdNÙ#ƒÊ"™T6ÉhÒLanA=×¯s•1ÆcŒ1æ¹‘ƒïàGX�­x#‰Ž3FoJŸ2eŠnµ^°`A,]º4Ö­[§o¦755Å©S§‚[³}Ç€y*dC!+ÊÙQ†È’2E¶”1²¦Ì‘½¤z[±?ÂwtN2ÆcŒ1Æüë¼†ÅX‰µØŽI7;;;òóóƒÏ©iWQQ¡ÝŽ;âàÁƒqôèÑ8sæLôööÆ�7|×@ Çê5=WïÉ€²@&”2¢¬�e‡%þ8ÂÀlÇZ¬Äb�{Œ1ÆcŒ1/Œ\|+ðKüÆÑ/`ž˜™™©O­M�:5fÏž‹/ŽÊÊÊØ°aCìÜ¹SÏs·¶¶ÆÉ“'£»»[·ß¹s'=zæå†©WôL½£‡ê%=Uoé±zMÏÕ{2 ,�‰ÄrÆïðK¬À÷tŽ1ÆcŒ1Æ¼tdc–ãø-^Ä_3¼¸ùKÇ�Q\\¬7¸/[¶,V¯^›6mŠíÛ·G}}½nooo�Ó§OGOOO\¿~=nÝºÃÃÃaþT[j¬ZSsÕž¨ôD½¡Gê=Sïè¡zIOŸë¿Wç†‹ø-~�åXäùcŒ1Æóÿ"ßÆ2ÜŒ�ø#¦2¼èyfssscÒ¤I1mÚ´˜5kV,Z´(–/_¼NÐmÛ¶Å®]»âÀ�ÑÜÜ¬ï¿wvvÆ¹sçâÒ¥KqõêÕ¸yó&ÏœßÓ-é£££‘4˜³æNTj¢ÚP#ÕŠš©vÔPµ¤¦ª-5V­©¹jOÔz’ø\þCSø#6âf,Ã·ýÉ>cŒ1ÆcÒƒ1ø–álÂ.¼†¿gxAô\ÌÊÊŠ	&Daa¡®B—––êqUUU±~ýú¨®®æ%s_E]]�¹GŽ‰––=“~âÄ	½ˆîìÙ³qáÂ…`a¬—Ó]¹rE·¶F*•ÒÂ™+âºåýþýûñðáC]%ç6x922�?ÖbûŸ,Ðù]mƒmI¶­}°/í“}kŒEcbl#cÕ˜»æÀ\4'æ¦92WÍ™¹«ÔB5¡6ªµRÍ¨�jH-Ÿ§çèïx»°	·`¾¥sƒ1ÆcŒ1&­ÉÅ¸ëð{¼ˆ¿dx±ôŸ:vìØÈËËÓmÞ6¯oÉÏ™3'ÊÊÊbÉ’%º­}åÊ•±jÕªX»vm°hÖUñ­[·ê
yMM�®–×ÖÖjq½wïÞàÖx=ÿÞÐÐ,ºõÂ»C‡Eccc>|8PæïôoüŒ~–ßÑï²m‹mjÛìCûbŸÚ7cÐX“ÆÆ5VÆ¬±3Í…9inÌ1ñ}~þ‚ñ{¬Ã8ÃÏócŒ1ÆãGÞÄRÜŒß`'öá½/¤¬ý?xû°¿ÁÍXŠoúÖ~cŒ1ÆcÌÓÈÁwñü;°S8œá…–µ/ƒÃ˜ÂnìÀ¯ñ|×ßç7ÆcŒ1Æ<+™ø
¾ŽïãgØ€?`¦ð·/Ä¬ý/üSØƒ?`~†ïãëøŠ¯ôcŒ1°s¡YÕqÇŸZn9Úàq[ŒÜˆF›i¶5°•s¶.J²¼Õ`WŠ¥R]ÝQàŸˆ(” ?D7…¤1Eè"¶b¤“1�:ñ4Ö\ÃmºzÑMÔEPh¹ùyÃÎ¹ù]}çOJ)¥+Õ,¡–nžå]z9Åy.2¨E\	8Ï)zy—gé¦–%ù�_J)¥”RJé¿êÊ(²–�¼ÅqÎ0ÊÏÌ2ÌEü�y~f”3ç-v²–"eøSJ)¥”RJ×BeTPI�<Å|Å #”òÙ@Dá"%Fä+Þà):©£’
Ê
)¥”RJ)¥´ >XJ5-läs’!Î1žM�XÄ.2Î9†8Éa^`#-T³4¯õ§”RJ)¥”Ke”SI‘6zx�ÏfŒq¦˜+dxŒ…eŽ)Æc˜Ïy�Ú(RIyžî§”RJ)¥”®—Ê¸…nc�°›7ù’!~d‚_˜-dÈŒkÃ,¿0Á�ñ%o²›GXÅmÔpKþ”RJ)¥”Rú£2*)RÏ¬¥‡—ùˆocœI¦³1WÑ,ÓL2Îßò/ÓÃZî ž"•öSJ)¥”RJéßUA5u4ÒÊc<Ã^>¦�ó”˜`Š‹\*dˆ�¿w‰‹L1A‰óôñ1{y†Çh¥‘:ª©(¤”RJ)¥”Rºª-¡ŠZ–ÓD;›ØÅ>>e€Ÿ˜a–9.ÿ.ƒïuÆšÃ³Ìð|Ê>v±‰všXN-U,)¤”RJ)¥”Rºfª ÈrZ¸—.g/q�#ô3Ê43Ìq‰ËÌ20/4ó\æsÌ0Í(ýá /±ƒÇéâ^ZXN1OõSJ)¥”RJiáw3ËhàNVÓÁžäyöòGéc„If˜…?od³àªšç/ƒ½5€&¡�£¼Ç^žçI6ÐÁjî¤�eÜ\H)¥”RJ)¥t]vUÜJ#ÍÜÃºx‚mìa?ðß0L)?#¼¢f)1Ì7|ÁìgÛx‚.ÖpÍ4r+ÖÒš¦”RJ)¥”RJÿ°©¤†FVÐFëÙÀ&¶ð4{x•·ù�#œ ŸAF(1Í¯‹Ü4%F¤ŸáCÞæUöð4[ØÄÖÓA+h¤kaMRJ)¥”RJ)¥ÿ±rª¨¥�&VÒÆ}tÒÍÃ<Êf¶²�çx‘Wx�¼Ã!Þç>ã½|Mß1À÷œæCs–á8vŽ³3ÄNó=|G_ÓË1>ãÞçïp€×y…yŽíle3�ò0Ýtrm¬¤‰j©¢¼�RJ)¥”RJ)-ònb)Õ,£Žz¸�&š¹‹»i¥�5tp? “ut±žéæ!pìëéb�¸÷¢ƒ5´ÓÊÝÜE3MÜNõÔ±Œj–æõû”RJ)ýÆ     ù¿6‚ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÂ     ù¿6‚ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÂ     ù¿6‚ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÂ     ù¿6‚ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÒ    úÿÚ                        ¸âq“pq>_É    IEND®B`‚‰PNG

   IHDR   €   €   Ã>aË  ®IDATxÚì�	°^CÇß‚XC$±†X‚Ø‚`ì;Å0b¡()ó¢P±%b7EŒR•Q¦F�H”A� –Qˆ!ö%±oEH"–ˆÈÝæü^õyÕuïý¾ï½÷õ}ß’ÛU]÷[îí>çÿ?½ŸîÛ�‡<ä!yÈCò�‡<ä!u%6[±©ÝOr¯ý,iå¡VÈNtPÃ)§œÒ0dÈ�†M6Ù¤¹gÏž+¯³Î:Ýˆ|æ7þãî-r£¨2Ò•ˆ•VZ©AÃj«­¶º|ï¿òÊ+µÊ*«œ-ñù<A~›ÖÜÜ<£©©é�ÆÆÆ÷åÖ¹D>óÿq÷òÏ’i‘&iÇòjÌ�¡2¤kPBzKü³ö!lªú©ü¼Lb$141ê`´Ÿ[Fš¤MäEžq9rcÈ.4Ùmø;ìÐ ¥µ¿�0\H™&?-PÒ4
QÑf›mJuîŸzê©ÞÈ‘#½[n¹Å¿ûî»ýxÀôÑGƒ'žx¢5ò™ßø�{¸—gx–4HËN›¼È“¼‘Y�)!oœß¨U®TÓÈçaÿ'_·H�Ö_ýð¨£Žò®¹æB?üðÃpÉ’%aE¡	Q{÷šZÓ -Ò$mò /;odA&dCF«™hÌ¡â×Xc%þOè�R/Tàås4`À ÿ’K.ñž~úé`Ñ¢EJvdÎ5‚Èó¼Dô}Ÿ˜úÏh±4Cò"OòFdQc@FdEfdrCè(ñÚÞˆ‡
˜�¨Ë•øÍ7ßÜ1b„?sæÌð�?þAz�˜ˆ%Büþ„ñÝÎ�™�Í2„åÈŽF§ÜJ‘/miQÀÛW®OkÉÃƒ>Ø›4iRðë¯¿¶‘^ˆp%ÒQÐ´
„²!#²"³ÖTè‚Nª_n1âd+h¢|÷(ER‚‚ãŽ;Î›1cFh­ºîÄ Úä±2#;: :¡:JÄÈóŽ¢5¤ë&%f¤ÄŸLUïyä‘þ+¯¼ÒVÚµÔ¹%Ý½1hm¤µ: :¡:¢+:[¬pÁnw•’ñª©îƒ�vÚÉ—¡™M¼–®¶X­Á–™mC@'tCGtEgtOö}ê?4É¬×F	¿Q2Ö\sMoôèÑÁo¿ý^TóD¥½²µ: _ÑÑ�ÑÀÂ`Ò´¢Tù½¥|D"¥ÞßgŸ}üwß}�(5¥ˆ¯YC@7¾£+:£;€˜(FõNþ@Qø#ÓzW^ye C©Vœ´ý´«ÓZ¶Ú�ágtFw0 0›z5‚f©ê¸+ÕÞbÞ`ƒ¼iÓ¦µ"£Õ½Z�['»YˆÀ ,ÀlÀ¬êÆîHàã9¢ Õ^¸ë®»úŸ|ò‰–úÐ.õuâµ_B° °#°3°«ò¹ŽÅZÛû£�>:øñÇ•|m}m÷´I °#°35‚Z/ùW(ùC‡–/_édŽƒ¶¾.ú:‰6`¤F vjµÚæ�TòÏ=÷Ü@{ùv•¿¢»IÐQXYF0²Öú*h‹’Î9çÆÒmòKM¯ÆWîÏ÷g¿NPz�"iÚ93ËZÛZ!ÿ/"¸G§æŒ3ÎH+ùÅ&Mô{Áûªa¸_n¶F1��;½& ;0K0­v#Ðvj€üÃ™–-[†rEÉW õûÒ¥K£7Þx#zè¡‡¢qãÆE&LˆüñˆÞ²�N&ŒŠÊ�®ï¼óN4eÊ”H¼‹¢ñãÇG�=öX4wî\È/)·�.˜‘‚%˜‚­b]�sû„"è[Œ£Ä?ü ÓºE•URß{ï½høðáÑV[mÅÄHÂOO¦K£=÷Ü33fL$N<³ËÉ'`˜£F�Š¶Ûn;V0rwëÖ-8p ÓÀÑ·ß~Û&w‘B¡i‡`–¤¶`¬˜WÝZ¾�6A{õêåQJ‘¯ÿýôÓOÑ…^­ºêª6p…0„TcèÓ§%¬K�À&_k*q‹Äë§Ýr÷îÝ;;v¬~»Œ ,Á”çÁX}
ª­Ýÿ»YÑóï»ï¾PÇù¥Èÿì³Ï(
VÎ•ï©Q�Õ{ZZZ"3´´� sò¿ûî»èÀ´åF®¢rÛº�|òÉ8��TQ#Ðy0[žkÅ¾ZÚýíE¹…(vþùçFð°XG‡ðùçŸGýúõ‹ŒóGñ%åói§�f·�ÄLÉÿþûï1ÚNÉÍ½ÚLˆƒiôûï¿ìÌêo`Éw°å9°óŠ÷%ˆk4nNÓå+ x¿üò²ìôéwCöÛo?‘k§¢>{õÕWÛÍ1“u~Â1ÇãLîóÎ;/i¼é†‚-ó˜ƒ=T²êG€¡F ÿÅ_,Zõµê¿þúë@KqÙQÀÀûF�À¹¨NwÞy§+¹µÉÀY$.wÁ¦ ŒÁšçÀ^¹¨T¯#æK¹Ò‰Ô‘£P	ÔZ�žð†n¨Ub¹@*Ì¥gÒh:”À­·ÞZåvf p€æS´)PÇ°æ9°‡å¤ËÛ~Qà¹ÐŽ{:äSð‹•¢Ûn»Íeé·kÆájÎKÿÄ‰mâœF)ÙZ”C›°sžƒƒ®î4šª€dŽ;“…ªþÔöÿðÃw¤ÓÍ7ß¬U¦“Àn¶d÷°æå\nÙd—»hS æ<p¡ÜtYéÁÇ#ÀÞ{ïíéÌ•ErÁêŸeÏ�6ÚH«Qç@ÊönÍÏ•è,=ÎåÖBpè¡‡–œÚÖÿtfìy.”›.!_ (ñ2ä‘GìÒ_Ò >øàƒÈl¶$º’‘…SÏ"»ßÒ£Gç im»í¶ŒŒl¹KÖ`Ï³p']aMfããLçÅC�R¥ßnÛ^{í5ÈÊÌ vÞygòrn Ÿ~ú©=ãçÜ 6ÝtS&†l¹KÖ|…ž‡“¬ Ñtü6¡“©l©ÖÒß^ é¤!lVÀZà87€¯¿þ:êÞ½{fÀú‡=)T*h- <'p“e_ Ù´ýW�¡ì‡÷D`{Gn»€œ?~´îºëfÖ<xp&} Ù&ÉæÏÌú â&Þî¦ËÂ;„¸ ¸Ér^€ª¿›dò™Ýxã��å××‘õsJif£€«®ºÊù(@Ó4hPf£€aÃ†uhËö'„Ò€8Ê²ç¤\¨
CYÄ	uÜßA�£Ë.»Ì9�_xáÒù<À­·Þªr;o~øa»j·CÉy¸€Ò�#åÌ¹ÈDËÉä„Nðlò‰¥‚MÊÛo¿Í¹ójt¯½öÊÄSHÓüâ‹/ì‘€Ë ML‡äæÛà„´àÈµè)\ëÐ_ËGfÄ‚ŽV³¶À„3Ï<SEœÀƒ>è®úO_Ã`ÑIótVýßqÇ¶Ü��¥HŽàJ¹sÙùdéÈ…�éhÙðå—_F}ûö-L5 “N:Éù:€�>9ÆÎ¿l¹9ä{h×i<ánH®\v›Mõ‰sèAÚ~BAg�gŸ}7/-�—)ÖèãÎÎÈ×R6{öl
€Vßzí´Ü[l±1eÉm7pCºpåt4 í._sLuåÇª«²Œ §Éµ×^[� Tm¿�õqjM3+ò™Àâ$²4ò¹¶Wn¢Žûq-[n»€Ò†+8sÙþoÍQhÿÖ[o…êëW&¸ª8iF{ì±GªÇ�pý¬³Îbm!sòñPfùZå²É_k­µ(Ñí–›xâ‰'âRæLnõ„òƒ+8S]TÿCðm¶Ù&`âAvµo^[îºë®h÷Ýw/Ö0‹GË§ZufYícœ	òU¾þýûG}ôC8fŠvhqxetúôéir;ÁnàˆüàL9,Û dñæ&ãÈ¨í¿S°ÕEZ�ýõ×©Î¢.¸€Í­#†Ë/¿œž.m¦>Ÿ9ùL[o¼ñÆ©äãb·ßDîÇcèâ‹/n“wq¼—çÍ›Ç­Ž�6Ù€#äƒ3åÐÅàt½á†ìö?‹�²ö÷ölÈÈŒü÷ß?’ÄSÉÇ‘Õlo×mkäv3YGÈh8+?pJ¶´aŸ‘èÔ©SuüŸõ±k…NóÄL T½tÉšÕ9%]¯Úsÿøã�õþË­ÑuPYà9áîÊí Òþ÷“ËR¹²s'TKÎ8´ï”O÷äÓ3ç�éBäÓæÇÉ/)71ë œÀ\ÁÜ)—åLÿòö:Bb`@�‡$ù´Ó¬ø¥‘�Q`	ò«%('pWÈwÊe9À!$Æ&’‰Ž êŽ|ªõ-·Ü2•|š91¼jÉ·å�#¸Bn¸S.Ë1€Ì.ÏZû¯'òéÐÑ±SÒíŽA:„UL~ÒG ®�î\À?Íö+´×3üê…|\½˜•K#Ÿ! gúÅÉ¯ZÐ	!¸B~¸+Ç šŒü[.œXáY õ@>{™ÜJ#Ïe&�j€ü¤ƒ\¡Ü)—åtÙò�Gkê5i É5Öö™ÉK#Ÿ/Ó¿µA~ºÃ�.
MP.ËN"±k¯½Ö6€š&ÿ«¯¾Â	#�|°ŒæÌ™SCä' ®Ðî”ËràA¹°™Ó6€Z%ï^ZÓÈgµ�%ß#?i p…>pçÂ &×¦$Éÿæ›oðH%ŸuþY³f¹%¿ò0Ù…L”G¡ØPsä³³g—]vI#ŸãW¢—_~¹FÉO \¡Ü)—åŒî"±‹.ºÈ6€Z"Ÿµw&²RÉg�ÂK/½TÃä' ®Ðî\Ìâ^„ó…=P+äã+‡�AùxøâF^ãä'çà
ýàÎÅDÐUÆ‹Åö¨	òÙGÏ&”4òå¥ÑÑsÏ=Wä'}à
áÎ…´�¯Q%qÍ¬ÚÉ_°`^:©ä³Ç‡T«I«iòcœ„p…žpW®Ð	lÜŸ8õS ªÉ_¸pa´ï¾û¦’�ßSO=UWäÛÀ\¡+Ü)—ålßM.�”†Qº\µäã$ºÿþû§‘Ï‹©¢'Ÿ|²îÈ·9�#¸‚3¸+w&�&`}¹,’È)\�‚]y‡�$ù‹/æðF%_½wÛœI9o˜àþE•wQà}áîÊö–	’f)AoÊGm¶}+é–vÜ,»lRÉ_}õÕÙà€|'r3Â:ÃÜÁ¡·°{ÍQp^59…*ù?ÿüstØa‡¥‘�;6ÇØdI>éV�S(¡7œ¹Ü0’Dy)²:…TÚ-œûõì¾#Ž8¢ù9ï’|•;îÞ]q·p"áÝáL9tq&Ð!f¾œ3êì�¡•ØÂ��ÌÞ±‚óôSÉç ªÉ“'gF>rkÉ“7†3ê¨ÈÆ{ƒ(ÜÀùÁ™rè¢	è%—ùQ °f+µ5CÀ™CI�“)YUûÈ­~„ô;:"·îdv¶5Ìž„Ò‡+8s¹E#˜jC|2«ðæP5q¥Þ{ï½Y“OÄò±ÊS›CC¸!mÃ•³ ý€‹äBíYÞÁÄJm‡ôÀ÷ÜsOÖäÓGaIó¬Øöp8�Ò…+åÎåù@;ËÅ“+3ºC¸ÒDØ‘!�cò“@3×°ãŽ;*ù? B«81òxpåüœ õÖ[¯Q„~¡¯»î:ŸL«äˆ�¼‡WÀ5ù
4½z%¿šŽˆ	á„´à®29#Pe6‰xæèòj:$Š•¿¬‰¢ê¯ªC¢p'¤GÊY§„nËž3‰´ßÚäÇÄUè˜8­þá‚4àŽâ½×§…=j6Šø–óƒ"³>(2½Y
á‚4à&ó£b…´Áfe-��²zXd~Tl«Îp &­Øòo6ÇÅæ�á¥—^jw‰ùaÑÍvçxN Ææ*Ë£‡?z_€ÑZ ZŽ‹œº>.^K?ØÃÏÃ‰rÔ¯‹ë.Î5µ€}htþÂˆ,_‘,ýÏÂ…¤³V¶¬'ûg·jßêä¯Œéœá²œm“Ü®¶_ÒçY¸¨ÄëãVÐßD€¡C‡úÖ+ãò—Fu\n&˜âr}u˜óÀE¥^y¼Q$ë0ö²èüµqN^—|™4Xƒ9ÏÁAÅ^)@Ð!œfŽj÷L–¿82£GòŒÁšçÀà¢’/Žæý�¿˜-äú!Œ u¬£WÇÁ”¯`Ì3`ö}œ¼FîãˆáÏœ9S� y´£—Gk¯lÁ˜çÀ¼Òäh¸4Êõ93÷èéÇÞ ž¿>¾#¯�Oæ‚)ØòœÁºì«!¨n'-@ÀÓO?=ÐU*‹ü´€©à¨·OQâ‰zOKK/s°Ôk–F€K{l¹‘«˜Ü¶nœ»Ü6ñS  Ø½~0Õ1ÿ°¶°¯Š ¦8Ä€àßtÓM¡©¾ÂXšæÓ�;3Ž“ñÒp©ÀöéÓo[M'�üÌ�`éÒ¥ìÅg†°ÝrsÅØ±cIƒ˜F~¼Ý�ÀLMz%Ïþ«tàFcñž,q¶u
-åâ`ÚÇœFÃ‡g^<<ÜÇ˜ë3fL´hÑ¢® ¿”�¿ž3È8ž‰¢Ô~¾Ôr£G�f¤r$Ÿ �>0KÒ[ëêf-¢IÂ³Û£gë‹n˜ dqJ>ýãÆ�ÃÕ‹m] mƒæ€|7F`Ï21eÊÞ¨N…Ó+ÎŸZLn®‰NØ�!XL›À¸šƒŽG×�ç˜Ã=Jv	#P`ˆö=…vâ8ðüq·£IACÇäN'ÌÀÁLÝ®õgß)ì+–yrÅùÓã¬ÝT#(½ÏŽ¨U¦»Îž{CPc@^;‘;�|°3°C°ŒWýµbÛˆ_¨P=jŸ 
H¬*ãÑ6Œ”|°ÃÚ"?92è/Š|naôfÌ˜‘AòÁŒÀ
ÌÀ.Þã¯U#è'íØ<s<‹wÿý÷‡:Ooë;$7—ê8LÀŒÀ
Ìâä×ºôÅf™‰OüØuh&{Åõ_êÑY«@° °#°ªò“}‚î¢à$�,’7]L«j“«ê¶Ôk•�î` “<`FfušdÅ®ÑLýCÚ8¬>”ýqþ3Ï<£[ÎãµAÝ•zÝW‰Îè`&`FJ~=†F	Mø<HÿÎtx<9"à¤õ,ŠBÍ¯ž<èˆ®èŒî` `6Æù5×/xÌ4	�ì÷÷eÍîÄgÍjŽx»­G7tDWtF÷X{¿B…&™Û×já,c�™;÷eŽ/SÁi†`\�¤§�.è„nèˆ®èlÞË¨íý
ìö®�T‡ãß, ørÎŽ¯ï*L:PnNÜrï(bË¦Ä#;: ‹!ÞGG«Ô7µb�‡†&œˆR2�ëf¸J		x	’çš µBÂº($HG[6dEfdGtA'tS=[ÉÏCÁÚ€Žâ1câH{Êâ€áÉ
[ GÁÂ6Xs�aGç?Ú†§5dB6dÔ²£º S^êK…$@+	xƒd	ô)ù¼\�A¦Kñ‹÷äü?Û”®ñE$­)Úõ~%;~â!RÒ‘Y�IIGVdFvtPÏK}'Aœ µJØM@ý—\¿QC0ûƒã�?Þ»ýöÛ}ÙwŠ›•mÅ–pí¨ÿuÉ&mò /ò$o[dCFd5ÇìæÄ;Í¶¤\{È'É„ÉýÒ¦Î·Às†•´€7gŽ1Â§ÿùçŸoÝÆ.D¡øjñm»ÚŸ	ÜÃ½<Ã³¤AZ¤IÚäA^J:2 2!›í(Û*{œÖêv¦H½$Í›1ôWå§%¶Aègé…SS„Ûo¿} ïðekš/›H¼c�=¶5ò™ßø�{¸—gx6%½%äEžä�*“Ê™—ølƒ–,®BTƒì2jèÙ³'‡Xm&ñ¯BÎ•R*ï“Ò:[na¦mÚD¦ÅØ=Ëx–4H‹4I›<È‹<ÉÛ–)ïÜUÈâ%N–UÿßÎÛ Ã@PÎLÁ‘	èi)Ÿ¿" ;é¤(‰Ý¼Ó†¡à§óJHSœã’{\ã÷xDdÍg�»ÔPKzÑóB3ô÷ÖÓ}ü›Ž;¼±Å2lù'	>o„ÿ Å%    IEND®B`‚‰PNG

   IHDR         óÿa  =IDATxÚe“»‹ZQÆ‚DHH‘ÅZ…�¤Ý`£��Š °²"i|"h¡ˆ•…�BP+­TTÝFÄI,[dEH%æzOæ;{ÎBÈÀ\3ßoîÌ¹s™Ùlf0Î9‡ÃÚáp`^¯—™L&„ßÁqF9h …�(üææFc/öÑçóÅ›Íæã`0ø	o4�ˆ!G.´Š•“É¤–Íf™Ýn¿�N§¿9™ñb\º�r6›í6“É,‹ÇãZ0dV«õËf³á“ÉäZ­V/dúUÚù|ÖËåòe6›]¡�X¦Ú&ðy4a8�œ§R)ƒKK$bÈQ|<?ƒd½^Ç_!lµZ)4"‘WD¹v»}ÁD`ÀŠ‹¨Õj9·žËåŒh4ÊO§“€—Ë%w:�œnŸ‹Et¥#.{Ûï÷pdtýŠê4¶€·Û-§çëõšÃ‡g0`E�^¯÷]Pðn·ðjµz…Q\ VŒP©TÔù|ó‹¶çó¹€�Ç#G¬P(¼Ž ÆJ¥óx<÷ô†.1
qe8«Kìt:ê‚ƒ«ìÃp8|’Ÿñ„éto‹Å ‹>#mç€b·].³X,Ÿ‹…Aû`Ðÿ·HÔ2É€Z0`™Ãá`Ô¢æ÷ûQäUÿ%;¿ªUÆä Á
Ó&j`Ù~¿gô¹í¸ZË÷n·ûŽÖù¡Ûí~ƒãLo¼CŽ\hÁ€Åo«þHTÅï,ÎÒÞH1ä Qz°û«](ÙÕe‰    IEND®B`‚‰PNG

   IHDR         àw=ø  	IDATxÚ�•Û+m[ÇÇ²Ör9å…„ívè�\ò çAl	‰:
/¶òpäRça‘„”Þ<*—âå’\RÞÎ¡ó€Âƒügk.sœñÍ±3eïs¾5š£ßïûûŒ1ÇsLñ^ñññ¦ëéììôI)íææFÑ7q<xMíµ¶¶&VVVDYYYX ð$''‹ÈÈH¿J¥¦¦vTTThô‰‘Ãƒ—ja|(3£ÜÜ\¯Š)((LNN^ïííÉËËKûááA7úÄÈáÁKµ†ãRII‰¨®®~¯¼¹¾¾–J¯¶mÓ,ÕÒè#‡/5fX0µ"""Dll¬(//÷ªWg[C�XHÉ~}}µ�èS–¼ÔP›––¦Y0a‹¥¥%‘——æÌü×……… lµ–¡ÖÖV933c???c@ÝÐãã£=55e···ËÍÍÍéùùù @0a‹ððpáè'õªSLÛâóùlžýýýY–%ÕÌ%êêê’ä¼^¯öìïïëX 5»¥¥Å[UUÅˆœŸŸã	öööRlÇÄÄhHNNŽ›ÙKµœ:‡ïÀÀ€®…&la466væÔ‡æææô¬Ô4¤©©I"á-Pee¥Îùý~ý\^^¶±�ƒ%Þé—��±Ñèè¨ÌÌÌ”ÍÍÍòþþ^¢——‰vvvdFF†¬¯¯—ÙÙÙr||œ°Ùx	¦@ééé"11ñ·‹‹r–sZ\Ê3Jtpp £££%ß�y+ã¥,˜°E]]�(**ê½»»ÃÏùFz)x03?<<Ôk¾»»+ƒ¾õRLØ¢¶¶Vö|o  èèè¸^¤Ž.ƒw ˜°EJJŠHHHh>;;{¿D \ð­­-×ÌÏ÷K&l£Ÿ×××Co7yddDfeeq‚ô†ªïÛÌÑíí­lhhÐž‰‰	×&Ã‚éºä†††þR3pSskjj¾ÍÜñûð˜’‡e¸l²·¸¸X¨;ä÷ããcÍéééq}hEàFOOORù?üÐ`À‚	[¨O]8ò÷õõ;W…õöªPñÿº*8¾q° jvRR³7—]ñììì?Î:Zÿç²kkk“ÛÛÛN-@0aóÇqqq"??ßKÂãñ|VÆ¯Ê�ôu­fn›+›FŸ9<©¡,˜°~“ŒjÖ« »»ûäôôT:?³hô‰‘Ãƒ—
aÀ‚é’Z
1==ÍÉ,—_Ý˜_ÔÿöÏÕÕÕàÉÉ‰T/›FŸ9<fÍ©…ë#q½ŠŽŽ¡þ³aÃÃÃµ¢´´”Ô§¨¨¨zumwÒè#‡/5ÔÂø¡X7£ÆÆFßÕÕ•G}ÉBÝ?æ›Ñ}bäð¸kÝú•Ú°x•XÓK    IEND®B`‚‰PNG

   IHDR         \r¨f  %·IDATxÚì�_HTyÇS·ÌM‰Í"·%Ã¨,«ÝhÚ w1S²"-²—Œd70Y1!‚�"¢zèßî‚Vû0�FJ›…ØBÁÊ¦QRæºi%¦†•gÏ÷Ç}X†{gFÇgÆï¾ ãÌ½¿ß9ß{æÞ;÷ž;�B!„B!„B!„B!„B!„B!„B!„BH¸£ŠƒÌß„�ˆåSÕ<U†*Sµ]µ_õ“ê´ªJåVÕ«šTÍªÕ–Z¬×š¬÷¸­Ïœ¶–±ßZf¦µŽyf�„��ò™µæª*T¿ªU©þU«$ÈÆº¬u6Zc¨°Æ”aÆH	˜DÕrU�ê¤õíÜÈF¢âÐi�õ¤5öåf.„¯$¨V«öªjTíª!•D¸†¬¹ÔXs[mæJ™–¢ÊW�Sý©zè7}út™;w®,Z´HV­Z%.—Krrr¤  @vïÞ-ûöí“²²2)//—ÊÊJã5üïÁ{ñ|ËÀ²°L,{"
Â;ÌÕšs¾‰!SˆTU±ªVÕ3ž�hæÌ™²`ÁÙ°aƒÙ`�9"UUUrëÖ-yðà�<{öLÞ¼y#### X–…ebÙXÖ…ubÝÆ‚1�· ôX±(6±!$
™§*RÕ©úTâ¯déÒ¥²uëV³Ñ]»vMÚÚÚ¤¯¯OFGGe’Á0Œ	cÃ1VŒck1è³bTdbFH¯ÊTý¢êòw#HLL”5kÖHII‰ÔÔÔ˜k``@"ŒcÇ0Ì	sK1è²b—ibIH„ð…ªTÕªõÇìiiiRTT$ÕÕÕÒÑÑ!ïß¿—(sÂÜ0GÌsö·ŒZ±,5±%$LùJuFõ�?Æ^±b…9ñÖØØ(ýýý2ÅÀœ1wÄ ±ð· ¶gL¬		\ªßTƒ¾¼dÉ)--•¦¦&b@,Ä1ò§"æ&ö„L±ªlUƒêƒ7³&''ËŽ;¤¶¶Ö|ëŸ{ˆb†Øù*¬d›œ¾Uýîëø~åÊ•râÄ	yúô©�q�Ø!†ˆ¥?ç	~7¹!$H|­r«>x»'++KÜn7wñ'ö1Elc_{n“+B&ˆ4ÕYoÇøIII²sçNinnTcÄ1÷uŽà¬É!ã$IU¡êñ¶áïÙ³Ç\!GB
bŽØû*=È¡É%!c KuÏÉXñññ¸–~xä9ñVî™œâƒÏU?«FìŒ+yyyÒÒÒ"$¬@N�äÈ©Œ ·&Ç„ØP¨ú[%vZ·n�Ü¸qCHxƒ!WNyDŽM®	±HQ]r2LJJŠœ:uJ†††„DÈr†Üy+—x+2ÉQuØ$..Î[>yòDHD‚Ü!‡È¥Sè0 S²ÝÖq§cýŒŒ©«« —È©·sÇÙ¶lê�®ºít!Ï�¤··WHT�œ"·Þ.$ºm¼A¢š<Õs;,^¼X®_¿.$ªAŽ‘k§"ðÜx„DŸ¨;íòïÚµKººº„L	�käÜÛ!Áaã$«®Ø%{Îœ9ráÂ!Säp*WŒwHD“¦j¶K0ºÝÞ½{WÈ”€œŠ@3ï'ˆ\¾Q=¶K,Ú^÷ôô! ^€'ŠÀcã%QäªzíÎò£k-úÓâÑ³Þpú• ×xŠDEªA»ãýË—/!^€GœÎo‘°æ»3ý©©©rçÎ!ÄàxÆþxŒ„%?ª>z&ýè>|(„ŒxÞ±+�×HXQi×£/33S^¼x!„Œx²ïAÏ‘° B%žÚ´i“¼zõJ	x^²ó˜ñ™TÊì¾ù·mÛfMEÈ /ÁSö{ð ™öÚtèEÃHvä%ÁèLoÙw"†IHÙn÷,ýÂÂBB‚ ¼�Ù�wÆ“$$|§ê÷LB~~¾¼}ûV	"ð¼fWú�7IPùRÕíü�7ò±[$TÀkðœ]è6%AëÝ×æôõë×ËË—/…�ÏÁ{vE �½ƒÓÂë¦g°ÓÓÓ¥³³S™à=xÐ®Üd‹±‰#FuÎ3ÈóçÏÇC!Bþ›0n½xñ¢”——›B999æ™uÙÙÙ²eË)))Á-ÑžšÅiŽ·ïß¿/ÕÕÕrèÐ!ÓÄ#77ñ6»à›7o6O:zô¨yvà£G�B}£</Ú�sÆ»$`¾÷î¬Y³¤¡¡ABÁë×¯åêÕ«ævÑ…:v˜uj8âr¹äØ±cÒÞÞ.Ä¿3íõõõR\\,Ë–-“3føo<&líÚµrðàAimm•/Â“6cRï’€ïéøPcbbäüùólº»»Íí¡Vÿ¸€5{ölì1°	‰—kèÐc]°þcïÜc{Ê¶8žw<3—xuÃ½mÏD¸^Ñ‹ÉEõ
†xDQ"Uq›¹‚‘Æ„ÄõNäj<[Tƒ¦‰6c"hKIZ-Ó™qµîùî¿Î]9¿£ûüö:¿ýIÖŸÍÞgw}ûœ½×£iÓ¦ê-!''‡êëëI3ðIø&ŸÇ¶–€¾qìþ�MMMÕÞTbçÎ�Ô¥Kbc7˜cÎž=›>|HR;vŒ•ín8ƒ(Ç�Ä/|Ók¿(_¶D\Äó'¾˜cÆŒÑÚ¡çöíÛ4|øpŒ¥Ý:tè v¼>P¬RVVFÉÉÉ�¬7^Ñ7lØ 3J¾	õÿ'[d42Rù"ÆÇÇkíÒsøðajÓ¦Æ
ÔRRR¨¶¶–b�+W®P·nÝ_o´¼¼\k7"ø*Wù´å“àX-{mÖÚ˜333“7n˜ÆzÚ2Uq&­õîÙ³§Î$ø*|–�[«|ÛòQZzUñÝ´ié"===ZŽÈ»ÇÄ�ÀÁƒ©Y³fQ_oœñ”””�&à³žU†m|ÀÇÙÂmÔ¨Qôöí[Ò :ÈbcläÈ‘øs�¾¨‹Ÿwƒ*--%Àgá»|LåãOþ†Â‹üýþýûºîn™3šaóæÍS×VaãÁƒgÜz'%%éªßõ*0ú_åë–ÿ£¹c…üŸ“••¥+„A=ÃHÛ¿Øúõ³Û³lõêÕ¤	ø°×˜…Êç-@±†/ÒÄ‰éýû÷ÔÀàÚ�v0Ï°SâŠ,$ ÒèõF´a^^é >_æc*Ÿ·(þÊ›x´k×NÅuëàòåË^'þF~
„ üÙk°™6dÈ|·k[ø4o6¢|?ÆA²D6[Dâéêþ‚o>Œa¼á|¢¨¨ˆ„ƒ˜~<�ÓÙ8>í5fv¬'Màuý†¦­¬Wnn.Kæ1Ú2,}÷g÷ýfÛ AƒèÝ»wÚ’œàÛ¼ž`,·káX±{Aš4iBùùù¤	VÙÕ|kÕª•º¦’JFF†¨õÆæpíÚ5Ò|>ÎÇ-VZˆAóÀÂ…IÔ¶m[Œ#ÊvíÚ%6­·_¿~âÖ{Ñ¢E¤ø8Si!ÆhïX9/ðñìÙ3ÒÅ�0Ž4C&›Ä„!œ_°N»"ÁA:{JÀÇ½
ˆ”+MÄßó…ß¶médÎœ9" Ú·o¯jHcÇŽ"×7D7oÞ$�À×ù¸J1BgÇ*ÝŸ˜˜¨5¶®®NÔë(Ïg¿zõ*IcÚ´i˜?Ì~v1àëðy6n¥ÒF°•/ø¾}ûH'ÏŸ?g÷°²Õf$�“ô¾}ûŠ]o|§ë>ÏÇUÚ9]«v?tÿþýu·òB}8ü#ËP€TUUU(x"v½Ç�D«1ø>»Zi$Äd|Á¹téÆksçÎ%I<~ü:Å®÷À�IÈ‚ïó±•FBJÇ*Ü‹
®HÑÍ©S§Dÿ  üµ$îÝ»Ç2-Ejý#,8ˆ$)h€�_¡´BÒøB£Wœ8qBô úÓKâÎ�;¬"Ž(C9ò šÌB^sHc¥ŸŸÝÙ«W¯Àšyž={Vò 
gŠËýoÞ¼¹ØõîÝ»wPF h�Ïáç°UJæ‹Œj<AqýúuV³]–¡Û� ì‚0f±ë�f. «2Ur˜J|ç¹®cÇŽê¤8 Ð•GòŽ„ÖWÒš|°Š¿¢1Aßš@|ya)%>È±:÷Ã­\¹’‚�]»vë�8ÃB—±‹Š]ïõë×SÀ@|uJ;!à÷ƒa'¾{÷nà9zôh‘ÎˆÃ4œªKcÅŠö7 	þ–ª´#œ¶üêÝt!È€AW‘Îˆö¸.’ÆÉ“'%®7Î.¢RŽš€6ø• Ò�`fò>}ú4Eƒ‚‚‘Ñ€K–,!MØðkïÒìQ«Êmðù(	æ¬ëAp0„ïñhå§ãzG\"ÐÅ‹I*S§N÷°{÷nŠÐ?<UÊ·Žýê~˜´´4[�6²ûh�y6“ÞXP8&Š@#|^¿*-	$ÕGžµî×R$©ØÝ(¸~ HÃ¶Ÿ[ �@+Ò‹~Áïþ â«£®x8#«‘ » ˜Ã?Ä‹DhZá1ÒªÿÅ±ßÜ±qãF2�ÊÊJÖÈL;rä	…×ÀÁšñë½víZ2h…Ïï7¥)A,u? jÃÝºu‹€%`˜i&L`]‘Dƒj¸FßÀ ¿¦¦†LZáõ•¦ñ^ô¯6†€ktÞ1Ò;wî,¸¸wXðäÉ“�ÍÅhÑ¢…ú�2	h…QšÂ×ŽUñæ‹¦ñúõkôä7®PNN…T×�4i’-»îh†ÍµJiK ÿpO¼Q£FªŸ‰<zôˆ�©F»wï�$žæjz DfjÉuhÚas†¶Ìç_®	ãÀÍäÓlôpGˆ¨w§Ý³gO˜v~ÓÅ�ä£ÏY ~X­´e8r¬È=i8‚é<yò„†GDï¼C‡QH@àÒiM®û�ôj©‘”EJcÓÍ±ß]³³áL`Á‚�:#Jg#GA2<ÜzæÌ™ÆŠ¿S§N”��MB€vø3ü®4f0Sø«mqq1Iâøñã”�� Ó‘ö‰WP~õ$=êÝŒ#]\wáL{ÓÏéÓ§«jÅ‚€v !ö<Ð˜¹ìpO¶{÷îê{PÕÕÕ´yófìêˆè;eÊÖ÷?;ÿ¬Y³"^r¡®
³²²´üŒ1‚ÎŸ?/õ,bÏ�™I#Ç
Ü“…³¹èã†:ñŸÕè2>>Ÿ<*,‘~è[àKüÛ·oç_ªcNRRÞ’>+©…TÏ�;§Š{
âÏW ´f qüþëÖ­$Þ[°°°Ïƒ{mµSµnÝÚ3º­eË–æÁÎ£^óÏœ9C/_¾$FñÏŸ?ß�øY3XïÞøž1cõéÓ­Ýñåù9GƒFko„P³.Ó²�Ïñx ¥5âX½;—=77—Âî¸ËËËUË±¼¼<ºpá‚º·½qã†J(yõê…ì¬~M‘–qdÞÆJJJÐ(ë�nO8@Å5.Šjª+½ñ(Êz¥5ùÎ5IµC>}ú”,¡?v[ßŽ-Ÿ4-±u„ÖÌ#‹ÇÿãÑ.°Ó.]ºÔ—ø·lÙB–ˆ?³¼ò²L< ÌwOWB–ð‰Ù²e¾ÄŸ‘‘A_x]¯æ›vøgÇÊÜ“ÌÌÌ$‹lxejjª/ñ£"³Å7Ð_Ó2¥9ƒHpì�{’(m	H˜Yµj•¿9%Öß(ÍÄßy¼5NÈ-áØù×¬YãKüëÖ­#Ëç-ñ+g¥9ƒXÀ1^¼xAñ;?Jeù?~4ð÷–ÏZâ=”æâŸîÉõèÑCÅ†[DƒÜ�øñ¹`Åß°yÐ[ghÎþížÜØ±cÉ"¦ô�g�ÏKƒM±µ†æÌá²{r)))d‘Kzzº/ñ/_¾\]ZhŠ­74g_:VÌK€[D‚,H_âG| "-�½‘+íÀWŽ•òB‹q L×—ø/^lÅ¯hŠ¯{©Òž|ãX�{rG�%‹¸`?¥»‘`Å¯hŠ¯}�Òž$ò  t´µˆJ9õ%~¤#Uúì�YhI†™TÄ%
n	c\³9Å¸0>L$Îh„Éƒcp�ƒGÜÔ3Š>hŒâ‚IÜŒk"*.D£÷@¢¸$5ý×Ss¸à½×ÜîszÎçQouUýé®ªSÿQb4E“�¬ö0Ú‰�îkÀ(p¨ˆ ÷ò£ÿœ9sô²—w@Stœ>Zí1 ‹z¼ÕÕÕ…?ëÖ­#Þóá€pG_ñhŠºRYí1à'w£ºtébn(¼Y¿~=Ì2#?¼ÿTüÞMA[d< =ÿùÙÝ(X7Á’IáËÆ�£?,¿a ªx4m‘1�öü§ÀÝ¨¾}ûÚÜ
O¶lÙ�øáÍ§éÝþMA[d\ =ÿù�V·…­¶ÂXoGS¦•~Tü¬ê¡-26ÐžïRl¼Px±}ûö¨¬ÍQž
þôŠ¯@SÐŸBvf ýû÷·e¶6ÀkŸT˜	+àI¯âg4mQsP–_ °ÅVxPRR�øQÿ@ÅÏh*ä€î( $»ví"Å4Â‹¼¼<[®KÑ=€ˆOúõë§§ @ÉñN�:E,þiÓ¦©øyž@[,O~¡y ���FñõâHTâÏÍÍµõùv@SÐËJÁ¹îFuíÚÕ–aV|+oUaM8Î¼yóÆ(,�¦ -2nÐžÿdÓ» (ì¨xOii©éÜ¹sÄâÏÉÉÑ�[æ@Sô×j�cœøä¾ˆ2ØŠ·”••¡2qÄâŸ2eŠæmðš¢·?Yí1 •ú R®â‡"EÂ
Ôá×!@SÔÀj�ñN¼r7nß¾}Fñ†#GŽ�µax1yòd[V[4EÇð•Õº;Ñàn.œ(±çØ±c¦[·n‹?33Ó<{öÌ(b€¦è86Xí1 ƒµîÆ­\¹Ò(±åøñã¦{÷î‹âÄ‰*~y@St,k­ö˜PI½â”ØqòäI±øÇ�§%ÛdM‘ñ„æø°‡&”(±áÔ©S¦G�‹?##Ã<}úÔ("�¦È˜Bs|øËÝ¸áÃ‡«mT¨¨¨0={öŒFüêÒ$h	š"ã
Íñáwwãz÷î­ëÌvæôéÓ$4¼5j”yüø±QÄ-ASdl¡9>Lu7×Okkk�Ò>œ={–”‡/FŽi=zdÙ@KôJ·Õ#ÒœxçnàáÃ‡�òõœ;wŽüõ/ÒÓÓM}}½QÄ-Ññ}g5Çˆ8'ž¸¹víZ£|/^4}úô‰XüX/>|øÐ(� Z¢cüÄjŽß:QM+Ç(ÑSUUEî‡Ã†3÷ïß7J`€–è8W[Í1c§»‘cÇŽÕ¢‘QréÒ¥¨ÄŸššjîÝ»g”À AKd¬¡5~üAŒA4é$
._¾lTü
°¢§?VkÉr¢D æ6°”ð¹zõ*1~/†jîÜ¹c”@nÓú�mVkIpâ¥{bnØ°Á‘––ÓÐÐ`[YY‰Ô\\×´ëö»wïFe®qíÚ5bû^<ØÜºu+ð‰0Èb¼qã†9sæúÛfD^¸pÏno5~þüÙhˆŽùK«5†|ïD­%P¿¦¦uô­]vJJ
rñCVÙ�)Ü[qÝvÉ’%öçùóç_<ç0`@Äâ2dH`Ý—ð\[·nµ%ÉFŒ�Ïà�Ç°?ÃIÉøñãÍ‚ÌÞ½{ƒ”õÑg®±ZcÊ?®†B(¢KJá­ƒúùcÆŒ‰¸ª­•0wîÜ�NI7oÞ4ƒŠøÿ8p ý·†¤(b£âkY ijÖ¬Y¸1)y#Ú�†ÈóAc|ùÕÝX8ÓÞ¾}[¤ûªU«ÈfÜ×Þ`¨¶ƒ�>€¾Á[<ÒÿK…ë×¯iI…º…d²·Odee™'N‰`~Pwg«1Æ¤8ÑânðÎ�;Å¹ê&%%µûD¤Ÿ­óçÏ�jÂ'&&bï!P›\&Lˆe£2–ÒÜª¡ú,-Vc<	mRPP ¥ö>ÓÑf¶�¥6ƒÀ‡`rAÞp±|Ñíß¿ßÚ	mÂœ­ôˆª¹¹Ùp9ó“&Mb-þøøx»P`æÌ™¾ô#6nW¯^m˜Í@;¤ýÐòi‡#§�)8F"ŸâüY�ÕÕÕ�©q7uêT¿û'4¬�¡zÊdµ%€œxínøŠ+G<x`’“’UüÞ-³P‡€Mß.]ºÔ´µµ†@3´½¯­¶ð�åÄ‹géÜ&#Ù|b¸Œ7APrÚq4Ç®�7mÚÄ1ïš¡m-·ÚB=þBZ[[Maa!kñ÷êÕËº äSpìg”Rc—²­Ð¤'«)AüHB�EÇ…={ö°?&%RŒƒÂ•+WHå"V�+Ô¬Ê£A+Ô ÄjJß9QEüèñÈ¡Î:ÎÒÙMBR`ÇUA9îCZ4ž‹u,[¶ŒËR	Z¡í«²šF1Çe@qq1ÚÃ>’““Q«÷îÝúEVp‘‹çç?´$�4'šUBn?ñ×ã›7o6@p.;ŒIÅô÷¢E‹8V j¶Z,‹*Ü“––ækRÐš5kØOBêí‡<y©<xPTãÆacc£ŸÉ?ÐmW…Õ’Pæ¹õÍËËË�¼ÿžWà´¿¤2cÆ<B¿ºÂ c�1'm‚†ÄïÄ÷áR†À<Â�Y¥Ÿ¥,·H-‘��m�‰} Ú íya5$œÝ…rÖÈÀóšåË—‹™„dÙ$ÒSáÀ�û›�¾S�&h©w«� �íD«Ÿ©ÁH÷ÌÉÉ9!;vì(ÒõgñâÅh¿È(--å�úÛjµ :«08àxyÄ…ß‚å–NHïþàÂˆCjã¨Øk'¤P®P5V;aíä’’ã8ß%S²×W%ÑÔÔD&´¬ÈÏÏ7^-Ð6XÍˆ8'ê]Ÿ=ÏJˆŸ?žì®ÊŠ…AÀ”ki©ý�¯/�¡Ú†z«™€ñ'9âò¬€èÑ£Gñ›úFòÔ(�üÅ…ãbÏn¯Bôådµ@É‘ Ü_½¸€5´è? yyyFuuuØ¼”Úß0ˆAÞˆ'yÿÐ õý·Z	(›ñ�®êAx;kFÚbúôéÒ<ý‰×Ÿ¨@™5/–§˜û´ê�±	0)N4¹833ÓÞ‹!¨"#úÀìÙ³� à¾K®ÿŠ
¬Éc�„9�¹O»Éj$àl§{eee±®¹G² eEQQ‘Ju‘KW²"77×ÄÌùkh#ø$9ñÖýàÈvÓ´ÔÐa¶mÛ&Î ==]j£fCÌoIŽ=šþî[«�ÿ	ÓNß±cG,=ÖD]K¥_H(ˆ)œ\0è?ž>�˜ëô7­&þGüÇÞÙ…V•]qœ6MÇÖ–¤Xµ¢A|Q:µÕŠ>XüS‘ú Òh¬PŒ¨´¥¨ÕhE§ !1’A©J¬Á¨Z�ƒÑø eLmƒ3„h	MRâ¨4qÚ±¶ìîßê}˜nö=Ü˜»oÎ¹wýà!¹9ký÷½çž³÷ZS¬ú�.·AË2­[·.‘f¤6`__ŸI555‰Œ7_éá<Ž×ÝýöË˜(0~íûöí&‰4ä’%KdjmÂ ÿ¡ÓP5¢Wãàà 	÷ì—±Px”Zu~.Ü9Õô’B|ÐËÑÜÕ_Hä×.ZŒoûžŽtÊX(PÖ¹	X¶lY¨Ž-´£JÜÒÔ®®.“TöîÝ›¤xÓD4T‰p<�·=ûe.ÅVÍîM¯Ó§O›\¿~�$'Æ�&ÉÜ¿ßYãkÑŒ#Ôœ<í{ì×,c Àù®Õ Û»§§'äÔËØ‹™t|�N:7nLÌÀ™3gL ð²¯ý x_Þu“±~ýz‚æææDL
¢sQ>ÀU@iiiÜãM-þ`Óñ²»?ñ¼B©U‡ó}ŒE<!ŠU8}×ã§ñãÇ‡(K¥Õ˜Ó¨¤¤$T'&<ìûÚÙ!žWþ�·­^}>P“'O6ÝÝÝ&Ë°ÍXw:qâ„É'˜ù6oÞ¼ØÆ›.ÁÀgxØÝß+ñºâå=79+W®òTàêÕ«|ÏŽå¥?Qòjpe·xsO(Ès<‹wÝý‰Ç•´|Ýê#7hõõõ&µµµ±+IM}¸|åÒ¥K¼éÆiÒO¨Ç¬xÖ·Ï�ÄãJ$¬>sŸ‡ß¾}Û„ ªª*fœ3gŽéíí5y½cñ&0eÊ”P½*ñª¯$Úgâm%#ö¹	›1c†töÁ�FôÉÀ‚dð
çÎ�c~ÀˆöZ¸{÷n°îÓxÕÝ§xZÉ˜7­nºA\µjU°Y‚���¦¬¬,çfä—ý…FKKËˆT^¸p¡yøða¨Ù~xÔ·ß›âieHL·êqƒÉ#¥P´µµåìn53Ž;&�%u:&œÆŒCw(š­æúqg�xYy-~hõÒyfK�¿ �¬>ÌwÄ`�~˜âÛÙÙi#œ={–Ëæ`õXQÉß€àI¼éîÿ¥xX{|mœ¹ÑÖàïÛ·�;ÅY1"ßyiþˆ3*Íš5+ko´‹/6—/_ýX/úWšâ]eØ”X]pƒ;}út™hšçÏŸËM«Õ«W3yhH‹‰˜K“	.éN¤d¶Œ¸©©‰5”çv>U£ÅR[ÊË±æž:�9 âEßñ\ï*YaœÕ_Ü Ï�;×<}úÔäŠgÏžñ	NI'
uÊ'zyy¹Y´h‘Yºt)?¤‹Ï¡C‡Ì•+WÄÊëóâÅYCêÔ)³k×.³víZz$o>Ý¥\ú†h�F‘MÖÈ‚¯\�÷ð ëK¼*žU²~S°ÛöòåËåÆŽ¢ä<‡÷|ƒ¿[oú…�$4à�O
*JÀkxÎ7øt²Ox~lõ/7ø•••òVQB‚Çðšë?<)ÞTrÂ«ÿ¸IØºu«ÜñU”à-<æú/Š'•œ²‹à»Ú¶m›^	(A>ùñ–ÏsâE%ç|ÁªÚ—�-[¶è›€’ÍÁ�§Òþjñ¢2"YNWÞ™OŠ2ð^òyï‰•…ÔúÄä���£(¯ÞÁCé­þøðE«_¢˜4ÂMExï¤ü5â9%V��ß¦ë÷ÞÑÑa%ð
žñy	�éà�7¿²ú·¯�A%<â_	Š§ð–’6ZýÓMâØ±cÍñãÇ�¢øÀxÄõ^O)‰âGVŸøÖ‡SšuÿŠxOxZw¡OÄKJ"ùžUGºÒP¬S
<€|Á;â!%Ñ|Ëª%]eØ‹/¥ !÷Q•ŸZÄ;J^0Öêw¾D›;vÈÚs¥0 ×äœÜû<�WÄ3JÞM®ô-'Fv¸sçŽQòrì/â!À#:µ7¿™kõqºº}”²TJ^ANÉmT?‚�ÅJA0ÑêLT¿8jÊ)ù¹$§éò�ÄJÁ}%ø™ÕLà›3°{÷n)
ª$rGýÏöEOð€^ò63­®aŸfÎœiÎŸ?/<”d@®È¹K—Wr.¹WË(«_Z=Og˜+VH…Z%Ö�#r5ðÉñ/$çŠâð–ÕûQuç7oÞ,-¥•XANÈ9ŠüïKŽ%‚/Y½cÕ•ÎHãÆ�“:õ�=2ÊˆBÈ9‰ø]äTr«(CxRPgõ�tÆš8q¢Ù³g�yüø±Qr
1'öä jà“»:½Ã¯‡ï[ý1ÂdfÒ¤IÒyöÁƒF	1&ÖÄ<*'äLr§(Yzd¸Âêƒ(Ó•••ÑÓNšE*Ù…˜[b•rD®ôÑž‚7RÍ>Œ2!-YaÖØØ¨ó†±#†Ä2ƒ&¡’É‘¢æËV?µjÇ|Qš6mšt«mkkÓ¹@Œˆ1#vÇhµ“É‰¢äLWaõ§LúÕÓ*¼®®N[…{ &Ä†«>1¯Ð�¯Ä�«·­þ`õ©cTï4c.kkkkM{{»´´.08gÎ�Ït]¯>%ÆÄZ{ï+qå;VÕžVæ^�=ÚÌž=›;Û¤”žóù
çÆ9r®œ3çžIŒˆ%1•Ø*JBø†ÕO¬®E\x«1••¥«·nÝ2ýýý&¡pìœçÂ9ù«ïDÚ_#†KEI03¬vXýÙêU”ñÝ¦&L0óçÏ—®´¦µµÕôõõÑ£>Nýò9&Ž�cäX9fŽÝSh3R¯ˆ±’˜)JžQœ*2ù«V§tyF***bÚ«4®X³f�©ªª2'Ož47nÜ0÷îÝ3½½½fpp0«ÍQÙÛdÛìƒ}±OöÍ1p,Ç6Ôó!Ä‚˜‰‘¢ ý-«Ÿ[5YýÍÊG£F�’�8uêTùŽ]^^.tÓ¦MfçÎ�fÿþý¦ººÚ9rÄÔ××›£G�"~æwü�×ðZþ‡ÿel‹m²möÁ¾†+Îµ‰s':èåóÕ—Y½kuÓ)T’t=áœ87ÎQçæ+
D3Éê©vTR5ëþž€ÁÎ1r¬8vÎAÎEQ”a1ÚjªÕÂTåÚ÷¬®[u¤º×¼Ìá g_ì³ƒcHK%ÇÆ1Ê±*Š’Þ´ú¦Õ·Sð�Ô]ô«ß[]J]~·ZÝMÚ¿¦ÖÈw#~æwü�×ðZþ‡ÿel‹m²möÁ¾Ø§ì[Q”DP”*ƒ5Æê+V_µúâg~Çßx�¼VQþÛ    úÿÚ                X•dºšˆ½u°    IEND®B`‚‰PNG

   IHDR           szzô  �IDATxÚ­—_HUIÇÏ=÷šQk%m!b¦n‚‘,PIXAI2¤‡é¡„|Ðõi}nÅÀó†.È®‹¨½X¢/Ë*õ Vš‚²»j (ëŠJ­÷zfç3Ü9½÷šµþ`î™3ó›ïgþþæ\ãsÌår¹óòò<faa¡‘––¦yÊ¨ÃÇ8j‹‹‹s777»êëë�‹/êb@_‘üyU‡¾´ùbàÙ³g�èèh#""ÂÌÊÊ2Ož<É;‚YQQQ?ŒVTTÌ×ÕÕ­�ÈSF>øÒ†¶h …æ¡L
©i®¬¬gÎœ1eqé�7Þ>}úTÌÍÍY?~´„4Ë²TÂ(£|iC[4ÐÒºÚ¥K—Œ””ãÄ‰zúâ¯\¹ò[__Ÿðù|»’³+�;òéÛ•F	£Ì_§ÊhC[4BmAíØ±c81íþmYYÙ?kkkÐë“öáÃK>5&ö%U‡¾´¡-h!ˆ6XÁv¸qêÔ)^[[û/³Œ�ðÎ`Éb<�yêÈúMuœw´t'`À
€‡……éÒ„òòò5¿˜o``@dgg[©©©Bn8±µµe�	[__ÕÕÕBNµÈÍÍµž?®4ÐBm °:!UÊÌÌ|±´´¤z?88(d•EµÛí<oÝº%0D÷w ??_8}%ÄUZh¢­9{Fþüy=õßõôôè©2À(¸\3%jš¦J333c©IØË—/ÔãñàCõ^RRBï”&Ú0 Á„m„‡‡Û£—Àq¹‰ªVNNŽ‘ó	, ÃÃÃÚÇîÏë×¯´84hÃÐ<ØüpÎ±Ì––œõ9·±GO>99YììììßxbccCÄÄÄè©·ý÷kò b_¾|ÙK°øarrR9K�ðÞ½{ö¨’’’ÄÄÄ„sØ�‘áWM{||¼ò•MÔÔÔ8;j¡LØÆôô´)§Ô¸víÚ £ÀÉÂ£[\\oÞ¼!ÚÙ‚N8£úäÉ�Y^^&kk ˆ6X0aÛëûöí)¿£Ïy¶õk1ý®á­­­Î©¦žvyžh“‡¥¹ÚÂªªªþPiAb#ïèèPðÇ�ëNÙ�°ÐæL›ÎKeeå¡: á���
þèÑ#'üP€sO *--�øÔx½^�uuu)xSS“Ç4;h	`ÙKðìÙ3woo/w÷¯„ÒP›pjjJ`ÝÝÝ
þàÁîôå¬¿~ý:ä&„&lCžkÏ¹sç¸	¿õêÕ'�!GíþýûAáccc"!!!è1Dm°`ÂæbÐ�(ýáÃ‡V¨@Dp!/Ï¯ØÞÞÞ0.)ùI†A(d ‚ lîfÖÂÅzÈlÄ‚†b-:>>ŠGFFtŠY´aÀ‚	Û�¢ú³+lkk³ïñP—‘ Ÿ{‘¼ííí ˜°•?~Üx÷î�ëýû÷†\ç_fggÕáu¼#¿Ú0`Át3¡¿¢$äOÿ:{ûûû¿øƒdhhHi …&Ú6+ˆ9oÆŒ»wïþÍ‘¢÷úX~Æ'™ú¡-h¡i3‚™Ç£N›Ò­OÅÍ›7ÿšŸŸW£�â^v2Á(ÔG)uøàKùoI ¡w=Ú0`…üC"ÿ\°'t'¾NLLü™£´¹¹Éˆà(qvµ3QF>øÒ†¶h „&Ú04ùQÁ_1ãôéÓfzzº^«Ü«W¯¾�qÁK°Y]]µœ!š<eÔáƒ/mhˆZh¢}c�ÔrÈÝì’.Ly–uÕ7r«222~*..þýÎ�;Ó$ò”Q‡Ž´¡-h¡ùþ+ºåî6ù',OƒQTTàCuøàKã(ÍnÍ.xÜ:z’ÈSF>øÖþD«Ó¦ëŠõ    IEND®B`‚‰PNG

   IHDR   0   0   Wù‡  <IDATxÚíšihUG€ï{‰Kb±.‰¸b‹Ü1îŠ¸€Eb¤(4úË…
)(i#¨!AÿY("�è×R(âVü-ˆŒ”×Ä$ïåNÏ7Í¹\soòÞÓ,z`¸÷Ý;sÎ73gfÎÌ}NKÄ¦ÿˆD#‘Hú”)SÒnÜ¸áœ={ÖÙ¿?ÉÞóŒwä!o�Ó>ÜB80íñãÇNii©3sæL–^’ú‘¸×‡ä!/e(‹tu· ?~¼#-ÊïLI¹’
¢Ñhé�!CnNš4©jêÔ©OIÜóŒwä!/e(‹tu[¯¤‰ôéÓÇAèk¹ü2fÌ˜ê¼¼<süøq÷Úµk®´®y÷î�ijj"Ù{žñŽ<ä¥eÑ�.t¢»K¤è×VúJZ¯lÉ’%ñS§N™×¯_»Æ˜×u›%Åä>Îï6)Î;òð›2”EºÐ‰bltæÀW‰îÞ½Û™7oð§iÓ¦5]¸pÁ Ò
Õ‹Å\R<w[ZZŒ<û(ñŒwšOÄ–EºÐ‰nl`›ØîÑn•žž^QPP -k�ð`Ã¤í{ÊPèB'º±�-µÝYðSüôüùóØn¦ñm®ÚÚ
˜Hüyi¿.tc[ØüÜJD~äÈ‘µwîÜÁnìÃ‡¸Æ´áá™‚%‚Wwò?³®‡nl`›ØV–Tý>¢n#­ñøÖ­[Vqcc#WkH&sùòeóàÁ…
©D8¼ºÒýû÷Í¥K—ÌíÛ·Mss³Í†laÛ0xLÉHVV–#
œÉ“'Së?Ïœ9óüÅ‹Í„	Œ¼³I¦A³nÝ:SSSã¶'ú®ªªÊ,[¶Ì“§GVisõêÕ�*�m`�	¶„"@ês?îÛ·Ïú<-ŽbZ\�ržÄoY°˜ïƒU+ü‹/Ì¸qã´ò$Ogß¾}Íõë×ý•h†eK´Hi7Mš>}z=J\¤•fÆŒ(c¦àê¥Þ½{Ûë¡C‡ÈÆ€T€gÈÞ½{ýe¼Ô«W/{]¾|¹Ž+W+Lc˜ddd8Ã†ÓÁòëéÓ§-3ŠÄ_<�´/^ì÷ó°é“žò—	¤˜gÏžÙbŒ`�	0as¯õ.\Ø¨sukK0ÐPÒafÏžÝ®iÏHì£.ªKB
óðáCí¯÷a‚MYÃz@ý«èÄ‰ÖžÎóÈË—/�d¡ÆµgˆqÚs!�6W¯^móŠ+„6ÂØ±cn£å`@%L°)k»Ã`Äˆ•Ož<±ž âúýw×®]ê¿ �ünE°¦-h}Ü!þQŸ§¬êÐ1PTTôQ#À L°ÁØÑ¢5mýúõº°XxM³Ñš5kB{áØ±c|ÛrZ¡W¯^á
�1 º6oÞlÂâ(Ð°Á¨Ìþ…KkõýáÃ‡=÷ñAø•ÙVÜ°aƒ�Ëóóó+§4þíÛ·&77×‚®\¹Ò\¹rÅlß¾�hÔlÚ´ÉÈ®M[<`SÝ6=f•Aƒé�ãD†¨ù…­¶�¸F‡Á/Z´ã ëzÌÔáï�l0zÌ*[·n�Î™3ÇÉÌÌü½²²ÒV Ð�P@[„¤ÁX‡-,ÐÀS	*£cÂ§ƒ€W�&Ø`„fGE^Ú”““ós0ö)Ô�ü<¬åëëëq3¿`Áàõ}˜ŽD!H6•70�e
û»®®Îfn_iâHihh0+V¬°ðóçÏg×€OQw6Û‹N£²O½Ï|ŸZ‚‘&³xÙa1û„Á§\Ø`Ô
´u!–éÛÕÕÕŸäB
Ï"¤‹ÕÜ¹sFÃáSw!Ø`¸ÐªU«8"ádàÂÝ»wu»Éb€ÄMk×®µð³fÍ2µµµaðú,•AìÂŒ°Âì¨ôïß_§¤æã$§ÑÀJË¾ x¢VÂæx®�•:Ùi6•9l!Ë+,,Lz![ºt©Ù±c‡ô6nÜˆrNÌóçÏ.lfÛ¶mèHz!ƒFe%¾”®‰k·!I„˜*³3…W8äàÁƒäO6”pÕ�aƒÐö2+ÜMö¹0$Ìi@ÇPÝ)Ìç‘sçÎi,”J0‡	6åˆ(Ñ.ùáÈ‘#©„Ó@$NÓƒŸNÃ›²v´¡%®P§ûà64Ì<‰64¤´¡ÑS˜`SÖ°ÓÿF¡˜ð¸§·”Ø†˜t3k¨ˆokÍrää †Ù=ÈêÆM½ö|°À¤ŒÉ'~·eË=r{àXÅú>°$}Ì8tèP';;[§¨ßJJJôl¨Û¶°…MlÃ L°%�À€Î’®½YVV¦•Pn-ºþ-lb�)EñÆƒl"*}•À?Mît+<6±­,Ÿ{B�-÷ÆÑ£Gm%ÄX‹´”¯»Ÿz¼NYt ‹™ÝØÀ6=†ÏU ‹X§cë`,†Q° H²=@ÞVx�¡ÝØÀVgÁ«DÄUÙ·òY´¦¸¸Ø¼ÿÞçc@ø±ÿ3“&ÿç%ò�—2”EºÐ‰nK-ÒÈ#2¨Ò¸é×¯ß ¹ü<qâÄ—0²Ù!oŒ¡Ñ&ÅxG2R†²è@:Ñ�luégVù®ÁØò(_VÇr9óiØ³g�9yò¤[^^nîÝ»g=zD²÷<ãyÈKÊ¢]èD·ÓMaIß¹s§ÿqÊ7’
%�’ýC¾°T�¸çïÈC^-„tõÔ*hµtY…#2í9²’:oÞ¼i73ïÈC^ÊPÖÞãHš¸DúèÑ£Ód§‘ÕÙ&îyÆ;òØ¼ÿË¿ò] h#xœe    IEND®B`‚‰PNG

   IHDR         ôxÔú  \ßIDATxÚìÁ   €�þ¯î                                                          €Ù»»Ð,Ë7 à¿œÓ™-!*²8'ê2(¡Ëƒr$¢Ñè2
£ “ÔƒØIÁpEAE	XÍZ)ØAö1"�>ìKtÎD‡âÔûÏõžýêÏ?ß}éõƒÆ¶÷yîûº/¸Ÿ÷yï÷~RJ)¥”RJ—ªËP‹:LF=¦â
4`æ × -ˆhÆ5hÄÌB®ÀTÔc2êP‹Ë¤”RJiÈ&ô‰¨ÇUhÆõX‰uxO¢�xïàcìÁ—Ø‡8ˆÃèCÄôã("úq}ˆ8Œƒ8€}ø{ð1ÞÁkèDžÄÃX‡•¸Í¸
õ˜˜)¥”Ò«ÅÌÁõ¸b3^Ä{ø
¿¡'pe”Æiœ@?~ÃWx/b3ÄXŠ9˜‚Z)¥”ÒEªXŒ6<�mèÁ·8„œC¹Èãpß¢ÛðÚ°ya�RJi,‡z´`%6â|ŠpçP2þöâà~À§x±-¨Ç8)¥”Ò«EnÁãØŽoÐ‡A9¡W+Ñ‡o°�ã4å�‚”RJÃáJ´¢Ïc~Á9IwœÁ/Ø…çÑŽV\)¥”Rº@Ó°íx½�“ïh�ôâ´c!¦I)¥”þ‡:ÌÇ:taoNøc:°]X‡ù¨“RJ)anÆV|„#(c!jjjJ}}}ihh(³fÍ*MMM¥¥¥¥,X° ,\¸°,Z´¨,[¶¬¬X±¢Üyç�eÍš5eíÚµeýúõ¥½½½Üwß}ñsü.þÿÿ¯‰×Æ1âXqÌ8vœ#ÎçŒsWÚ€±Gð¶âfÌ�RJé’1MX�W±´-Ø«­­-Ó§O/³gÏ.sçÎ-K—.-wÝuWyä‘GÊÖ­[KgggÙ¾}{ùàƒÊž={JoooùþûïËï¿ÿ^Ž;VNž<YNŸ>]Îž=[ÎŸ?_þ¥xm#ŽÇŒcÇ9â\qÎ8w´!ÚmŠ¶E£­Ñæh{ô!ú}�÷ãU¬GS~Ã ¥”.>1°‡PF2&Ož\y'=oÞ¼²|ùòòÀT&Ð—^z©ôôô”/¾ø¢8p ?~¼œ9s¦2�ÑÖhs´=ú}‰>Eß¢�Ñ×èsô=r¹ÀHÇ!ìÀÌÇD)¥”Æ¤ñ˜‹‡ðúQ†;&L˜·Ë+ï†W­ZU}ôÑòÜsÏ•÷ß¿|÷ÝwåÄ‰•wÙ—šèsô=r¹xöÙg#7‘£ÈUä¬’;ŒDôã-<„¹/¥”Ò¨v®Æ½Ø1ÜŸçOš4©Ì˜1£rûûþûï/¥»»»ìß¿¿2Ù–ô�"G‘«ÈYä.r¹ŒœFn#Ç#±n`îÅÕù\ƒ”R]¦ã6táW”áˆX×ÜÜ\ÚÚÚÊ¦M›ÊÛo¿]~úé§rêÔ©’ª+r¹�G®#ç‘ûWüŠ.Ü†éRJ)�ˆñX„-èŽÍx¦L™R/^\Y9¿mÛ¶²wïÞòÇ”sçÎ•4¬"ç‘ûƒ‹“›£áÚ„¨[°(?"H)¥á1÷`'ŽõB½ë®»®2¹¼üòË±ò½²°-�J161F1V1f1vÃ±Àð8vâÌ”RJ©ªÆ£øq(¿WßØØXV¯^]žyæ™xwYù<:�M1v1†1–m«Ûbl‡zß‚Ñ�Ö¼+�RJfÖb'†jáÞ’%KÊÆ�+‹Î<XÒE)Æ6Æ8Æ:Æ|(`'ÖæVÄ)¥ôÿiÄ|†Á¡X¼wÃ7T“íÚµ«=z´¤KJŒyŒ}Ô@ÔÂP-&ÄgØ€F)¥”þVžÆÏ(ÕŒË/¿¼ò®oóæÍq[8Wê§*µðùçŸGmD�TjÕŽŸñ4Z¤”R5hE'W{Òomm-O=õTÙ½{wùóÏ?KJÿ j$j%j&jg(.£­¨‘RJ— 	¸	¯W{5l1ûØc�•O>ù¤²‡}JÿFÔNÔPÔRÔªÇñ:nÂ)¥t	¨Ã*tã/”jÄÌ™3+O³{óÍ7K___I©š¢¦¢¶¢Æ¢ÖP­øÝX•�*N)]¬êp;º«µiO]]]l[ùš×¾}ûJJÃ j-j.j/j°š›uãö¼H)],jp+zª5ñÇƒbî¾ûîòá‡æçúi$×DF-FMVóB ·æ�”ÒXUƒñN¢\HŒ7®\{íµeË–-åë¯¿ÎíwÓ¨µ5µ5µŠ�“x7æ…@Ji,Y€.Tãqºñ=í®®®Òßß_RÅ¢F£V£f«õ8ãta�”RÅÑ�>”‰©S§–5kÖ”wß}7oó§1'j6j7j8j}èÈ…þÃÞý¼Fq‡"Ö°‚°M`«x*AŠ"ˆà%·r[BPD°'õ¤bÅxð¨Hoñæ%"Ø„J$"¢/M‘=yc †·¼9	¥Õ™1?vó|àýæyag¿3#i½é~^U]t�F#N�:SSSñéÓ§�ÚY^Ãy-ç5�×6Pu^ek~ŽXÒZëšÀŸU[___\¸pÁÓüêè§òÏk¨:Ù\“lP’VÙAà^Õ“ý{öìY^Š³³³!my­ç5Ÿ×>ÕŸ¸G¶(I«ààWà]Õ_üçÏŸ�7oÞ„´åµŸT¿#À;²ÉlS’VÀw@˜©²¬vìØá/~é3¯_¿Î&–Û ªL¶Ù$[•¤oäGàw`¡ìrêééY>5==’þ-ÛÈF² ì,�­f³’TAøø»ÊùÆÆÆâÉ“'!é‹²•l¦ê—³Ùl·Ž$t˜,»€6oÞƒƒƒñàÁç“
Êf²�l([ÊÎ$Ù²$}…:p©Ê!¿ýû÷ÇÄÄDÌÏÏ‡¤Ò²¡l)›ªzHð’w$ýŸA`ªì¢ÙµkW\»vÍWöJßX6•mec@Ùùƒl\’>S.–ýÕ_«Õbtt4fffBÒŠÉÆ²µl®ÊÝ€‹Þ�”~Qf8�ï<÷~i•dkÙ\¶”�‡dû’6¤pø«ÌÙ¾}{\¾|9Z­VHZ}Ù^6˜-ef8Ô�´aô·Ë~—xx8ž>}’Ö^¶˜Mf›@™¹ô#©£u#ÀË2‹bïÞ½qëÖ­øøñcHZ?²Él3ÊÌK`èBRÇé®óE—Cwww?~Ü×÷Jë\6š­f³@Ñ™®=HêûÊôˆ»wïzÈOjÙj6›íV9 ¸Imo˜-º¶lÙÇŽók}R›Êv³ál(:³À’ÚÒVà\™[þ;wîŒ›7oÆââbHj[Ùp¶œM—ýKà°Imc7pX*|WWWÅ³gÏBRçÈ¦³íl(2KÀ`7’Ö½#À4E¦··7ÆÇÇãÃ‡!©ódÛÙx¶�ià’Ö¥MÀI U4îC‡ÅãÇ�CRçËÖ³y è´€“À&$­Û€+ÀBÑÇûNŸ>oß¾IF6Ÿí—y\p¸lCÒšk @™F£±üâ�¥¥¥�´ñdû¹r Egh iÍ “e>àóèÑ£�¤Ü%?,4	 iÕ^}�³ÙŒ¹¹¹�¤”r'än(ñ=�Àa$­š±¢‡ýêõzÜ¸qÃ÷øKú¯ï	äŽÈ]Qæpà’VÔ&à,ð¾H ýýýqÿþý�¤/É]‘;(2ï�³>! ­ŒpX,æÑ£Gãùóç!I_+wFî È,W�’¾™ï�ßŠ¾ÕïÄ‰ÑjµB’þaïî^¢Lã0Ž_äJ¦µ¥Q"´-kîÁ¢Ëj±A1TKED„R!iA±±–A„DQô^GQ!hP�È„“4PTÐÉÐS‰iÌµüîÓXö¾·Ugž¹>ðû”ûþÎ3ó¼…²vXCÂŸèZU
ûÛüŠŠŠxàÀQDä?²†XK¬)ºMPdŒýàvÈÆ+//çÙ³g™Éd("ò­¬%Ök€�¹í&"Á~Ð²áæÌ™ÃÎÎNŠˆüß¬-Ö !ÓãZ&"ÞªÄC6Zmm-ãñ8EDF‹5ÆZ dâ®i"ò¯~Ð²Áb±“É$EDF›µÆš dú\ÛDäýàIÈÆÚ°aS©EDÆŠ5ÇÚ dž¸Æ‰ÈW~�¹Ío÷îÝL§ÓcÖkPèm‚	×:1N€§¾›¨°°�---z¬¯ˆŒ+k�µÈšÀwžºæ‰ˆÛ!þmmmz�¯ˆdk‘5)ô `@’ïj ôûnš’’?~\þ"’uÖ&k ßéwÉC¿ xì»Y&OžÌS§NQD$[Y£¬U |ç±k¡H©Ðë»I¦N�Ê3gÎPD$ÛY«¬Y |§×5Q$ü à¾ïæ˜>}:ÏŸ?O‘\aÍ²vð�û®�"V 3äÃÿêÕ«É1Ö®Ðƒ€N×H‘*pÝw3”••ñÒ¥KÉUÖ0k ß¹îZ)!Å :|7Á”)StÎ_D"ÁZfMà;®™"ð€v ß«ý;::("Ö´�»2ÖL×N‘÷'€Ÿ…?qâDž8q‚""Qcm³Æð™×N‘Ö `ÐgÁO˜0�‡b&“¡ˆHÔXÛ¬q¾ƒ®¡"9( å³ÐmCìÛ·�ÃÃÃ‰(kœµ.ä  åZ*’C~�ô}«ß®]»822B‘|8Ø¹sgÈ[“®©"9ò Ÿ ô™­[·òÃ‡ÉÖ<k ßéÑƒ‚$Û• ¸è»¨c±S©EDò�µÏÀw.ºÆŠd¡ G}óüùóùâÅæ»/_¾ðóçÏî½âƒƒƒÒµ%vzÏÖµ­o[ç¶ÞuÊ�Ž5Ðµ€ïu­É2� †}qee%ãñ8óÅÇ�ùêÕ+>xð€W®\a{{»»îaË–-\¿~=W¯^Í+VpÙ²e\¹r%×¬YÃM›6qûöíÜ¿?OŸ>Í»wïr``€oÞ¼Ñë�%ë¼{÷ŽÉd’]]]<wî<È;v°¾¾žk×®µuíÖ÷òåË¹jÕ*®[·Ž›7ofss3>Ì.ðÞ½{|þü9Óé4ó‰µÐšÀg†]kE²Èß+þgÌ˜á"eŸ>}b¿{XSS/^ÌŠŠ
Nš4ÉÝî xìþa{ÃXuu57nÜÈ¶¶6vwwëŠŒ‹÷ïßóáÃ‡<vìX[[ËiÓ¦Ù:ýêâ6ß‹�‹ŠŠ\,XÀmÛ¶¹Wë>zô(¬‰ö·‡Ü°"Y @Âó)‘}Ä¯EÊ¾ÁìÝ»—.dii)Œê³ªªÊ~Ipß ^¾|I‘ÑòúõkÞ¸qÃý2USScûyÔ×¸ôÎ›7�{öìá�;wøöíÛ(?28äšpíGß¸é»™[ÿjeÔ<{öŒ'Ožä¢E‹Ü2€qû5{öl;µ`"î<«È·²ÓM½½½liiáÜ¹s=î_™ð_ÁêêêxäÈ&	F‘5€ïÜt'­¾‹µ±±Ñ]Eû&4kÖ¬1� ï/-v¾õòåËît„H(;€¼uë–�¿÷ø5kì§¼¼Ü®!p§Á¢Äi­à;­ Hû,Ò¥K—Fæ\u__Ÿ;¯?sæLÈê),,tÿûk×®¹EþfïìB²Jƒ8>Š„l+±%û^XI,¹™†´¬}	íUÑM„�aB"B7ùÒE7ÕJeuÝõeluaRñ’	}@-QFŸ�‘Xàj}³üö"–êõ=GçÌü`î›ó?ïyž™ÿHLjºººÐ¨‡ž•É^ãè;@£!l“4ˆçVú7Zì81²�ˆ^ŠÇ†‰8®ëëëãíÛ·Ñ¨£'


xÅŠœÉdØq¾šú0�2eÊu5Ž^�††~ôè' h&´Sšÿ‹ ÉŽ%DÔ-)Ì3f¨é`ncxåååÈIuàj ±±1ŒZ9 ýýý¡yµ¸¸X}�Ïš5‹ÛÚÚ’09 í„†JsïÚì8›ý´Küìß¿Ÿ5óàÁÌéF÷T~ÌÀ�À7/:¡³~ñâÅ¨‹DN¼nÝºÅÊ�†Ž¦ñ²ÝM‚œ(©#¢�‚BÄ—¦ZG;¼�?ÎsæÌA.‰Üï¢‰_ŽMãl¥+**Jl�Ïœ9/Pè�æžh©4ç�A£'~%¢g’BÄÜîë×¯Õšø¤Óia”þ€IÑíÛ·Ù±ÃÓ§OÑäg¡¾ñõGBÍMÈÐRhª4çgA«'‡ü@D�’L¥Rh&Rû ­]»y˜
Ü›^¸p��äsóæM^°`�¹_¾|9<;47hB[¥ùvÍvœÑBD#YŠÝÃp³R{ß¿lÙ2äa2Ð †ÿ;'¹t�ï\k%6`W¬¹/ Ï§tBc$h¶ãä€ßˆè­äÛ¶m¶ÛiœíÏòUd#¦N�Êd'qÀåæk|îÜ¹ÜÓÓ£us(4VšëÛ ÝŽ3~"¢IÁÁ
›ê´�e#æ…ñËæÀöövv’Ã±cÇxúôéæk�€{çåË—Y!ÐXh­4×ž áŽ3òˆh· È°éN\Í6°ÔÄ¼ ~Í/àðáÃìèçÌ_g`åk¾¦ÿeee|ýúuV´š+ÍuwÐrÇ%Ñ{I—í‘#GXØÏ_]]m^¿·i£�Ž^.^¼ˆÞóµü=—ÒÞÞ^V4Wêð>h¹ãŒ‚ý-(.å·<M¼{÷ÝþæP²pG¥Ž>îÞ½‹UÑæk8[ÔÔÔ`Í±F‡Rh¯4OhyŠGÈŸ’ÂBGñãÇ�µ­7ÅjSóÂ'�ÊÊJ·ÖyOl¾v¥±iÓ&�fAÐ^ùT4ÝqÔÑ�däÍEÚ8qâöŠ›½ÑÄªU«|› >þÌ[·n5_³£Ýš¹wï^­žÒÑÀ¡ íŽóŠ¥Gÿ6l€Ø¨ëøŸ={¶yÁK@ /ÿ�;ÆµÂW¯^UùƒoãÆ�ò« h¼ã|ƒ´ðX÷fê,~W®\i^èÆ˜!G×´3yyòä	Ž„Í×êK‘TZ˜¿zõ
š,Í3MŽóª‰h@2"vîÜ9VnÐ5k^äÆk§:44ÄÎäãÃ‡\__o¾FÇ---·dB“¡Í’‚Ö;ÎÑyAñà~14ÒiâáÃ‡ð»7/n¹ˆC‡±3ù8uêî‚Í×çxcÚ´i*=M ÉòÞ� õ…ä8ÿQODŸ²Îüùó1?¯íÁÀÚ[óÂ–K+U5;“‡��^´h‘ùÚÌU¬^½cv½M Ñ’?Íw"*%¢{ÙŠ¦°°�Ož<©q‹–;¡å8š››Ù™<ìÙ³Ç|Mæ2ÐD‰#u…@£¡Õ’<ïíw€i»ß’‡býúõêºþñï]·n�yA‹Â ”œ‰§¯¯Ï'["ˆ¥K—j}…æA«¥yp›`ÛÔÑ?‚å*-3Ñµ^TTd^Ì¢ˆÍ›7‡f)gbÙµk—ùZŒ"ÐOqúôiV´š-ÉÚ_CŽI~$¢L¶"ÉËËã}ûö±Bð’2/dQEII	ß¿Ÿ�‰#kåååæk1ª¨­­Ó
�fC»%yfÂ»À1G�HŽÂ†‡‡YwîÜÁÆ,ó"e´¶¶²3a`""o¾£\�ÝÝÝÍ
�fC»%yŽ„w�cŠŸ‰¨W²îÒ¥K¬‘;v˜°¨£¢¢‚ß¼yÃÎ„ÌýCàÍ×`Ô±eËV
´.É³7¼3ì”cc£ºÆ?088è{þc+utt°?7nÜ€ñ‹ùŒ:ÊÊÊøùóçZ÷B@Ã¥¹î$Ç¿ÑËlQZZ¶Mi$“É`Æ¼xÅuuuìÄO:�6_{qD~~>=z”•‡–Kr}ÞN¢ÉÇè‡äË®­­�‚ÎtÌ©›®¸#h0 qâ½ß­ªª2_{qÅš5k‚¡˜R åÐtéX`>9‰åw"ÌVK–,QëùŽ;éyóæ™­8¿�Îž=ËN|\»vÍ�ÿcŒT*¥õ @Ë¡é’\Ã;ÂI$DÔ!qÁêììd­\¹rÅ�ÿcŽ¦¦&vþeïü^ªÊ¢8¾„œHñùÃˆÆ@A%FóA_´™Ê|0AòA2é©�DÅ—Àz)ŒÄ� Á‹æ�Bê!ƒH�ÊBÒ²±0äj©µ†µ_:†³÷={­|ÿ€{Îºë{Ï¹k¯¯1(š™}Í™TtttÐäRO×�‰þ[y…àe ö*€ºº:ÜÞÞÆ réÒ%öË´


pcc3ÙÕÕÕìkÎ´ÚÚÚ‚¼øŠz:õv�ÏV^!8E Üóºù´3ÿÉ“'Tvww±¾¾ž}³²±øÅ‹(øÏÇ�1++‹}Í™Vqq±š½0ÔÛusQî)Ïœ¡ vtŽý™/_¾Èÿÿvæ ä8 !>|ˆñññìkÎ´öïß�pt�î(Ïœ  xÝôôôôÀ¼ÐìÄÄDöÍÊ†._¾Œ‚‘íìkÍV6@(Â€C=žz½Îg~ ¼C<õ:YÿíííH|Ð…¾¨ì›•544 à;4pÉ¾Öl©¿¿€z½ÎçÝVÞ!šx x¬³ôçÍ›7túúúØ7)[*,,Äïß¿£àïŒKmm-ûZ³¥ÖÖVt êõºË�+ýô¿«ê"OG¢ÿ%L[]]EÁ?(Ÿ>??Ÿ}­ÙÒ‰'Ô) ž¯$o‚ýô?åu“)NtiiÉ…ãQ´––}“²¥ŒŒ5ƒ!øz€rÞÙ×š-QøÒææ&: õ|Ý(é)yLê4&ÿi©ˆ3éhUUUì›”Í)i
¨üãÕ«Wtä’}­ÙŒ­¯¯s[(µ£¼D¿@Hãµ­3{ÜiMii)û&eK;:::Š‚ÌÍÍÑ-öµfK™™™øéÓ'têýº;%BÊS„Àð lzÝØîîntŠ –€ËëRïÜ¹ƒ‚ÌÎÎÊ ‹JIIÁååetò �Ï¾©<EÌÎÿa�ÿþWVVÐ>þŒyyyì›”Íe@CCC(øÇôô´„ Yþ@¡@A ;0,Á  ¾zÝÐ+W® K¬­­ann.û&eS·nÝBÁ?&''166–}�ÙRrr2...¢c�è|þ¯Ê[„ˆ&
 t2Üß¾}‹Ak€iH‡}“²%ÊFÁ?=z„qqqìkÍæ šžwòò�k0 <FˆX~€÷^7²³³]ƒ¦s�=Ê¾IÙ\•z÷î]üsIHH`_k¶”ššŠ>|@!OÐ¹ï•ÇË�"žŸŸG×‡ÃXVVÆ¾IÙ=™Ž��£à”¸˜””Ä¾ÖléðáÃê¯F!O oÐ¹@ˆHÒ `Þë666Øfe%ïZÖ¤Z~=úôéS|}UKA.ìkÍæºkŠvòò�ë0¯¼Fˆ8þ€^Oi333è*§OŸfß¤lž‘¦E5‚¿']:Ä¾Öl©²²Òå¼ò�“Êk„ˆ"F'ò·¦¦Æéîèè`ß¤l);;[íbückkKJJØ×š-�<y†¼�<B7*8„ˆ¡ Â¿ºi{öìq~QËõë×1**Š}£²!š¿ ´:Á?~þü)yuþüytòò
¯kVž#DÌÑ¿A¯â¥-y4)ï2´’–}£²¡––üçâÅ‹ìkÍ†èÁâÆ�è8äºUåH`d� +^ÅÛÓÓƒŽCK:hYûfeCýýý(øÏàà í\`_o6².h#È+tÞ¤®(ï¬sÎ«xipèÝ»w,òÒ‹ŠŠØ7+ÓÚ»w/†B!üçÙ³gt\‹}Í™Ö�TxÈ+t‡MÏ�`•8 ˜õºQgÏžE.455±oV¦uðàAuDMð:†&/-¨ººZEŽ3�<CçºÌ*¬ñ' |ûÕM¢Ýá´Cœ2hXåååjƒ`†3gÎ°¯9Óêêê’Ü‰ÿê›ò ÁW½
÷øñãêøž?.‘©†Ea"‚9nÞ¼)?rÿÿ?55ÅíÈ)y‡Îõ¹
‚2 àµW@ËíÛ·‘4pìØ1öMKš£»¼|ùÓÒÒØ×ž)åää¨°1f�wèœ¾V^$ç”×æ¿#GŽ¨ð
nôöö²oZ¦TPP þ—Ì±³³ƒUUUìkOŽ¸ú
yyˆÎfÀS % î{nss3rdnnÙ7.jooGÁ<×®]c_{&´oß>A¦�‡è\§ûÊ“cdÀ?^…;66†¡•–ì›—�ÀÙ;÷—ª²(Žïz‘=5(LH(„°ÈÒ)¥&*œ¨~*zL5¿EÍãTXÐP‘ASö¤H‚~‰¨¤ìeØ#(,“£¥=4J/½ÈZÃwÿÕÙçž{îñ\÷÷ëXg³¾÷î½Öwñú¿ƒÀÞ…AƒYƒX ÔÚÚ*–�–˜òÔ¬5‰F‘Rê«ÓGÉÏÏ—H$"¶²ÿ~¦Ðý�f!B[àÎ¥¥¥b1Ðh‰)O_µ&‘ÀÿœçÁuæÅ‹2bÄë­Q;/gÎœÁ¿3ëÏb¼«—ïÝ»'¶-q‘¯ó\yJ©ˆÓÇè×¯Ÿv³�ÒÒRë‹X¼"++K^½z%¤CGµøÔÇX²d‰�–@SLùŠhm"qç_ÓÁ-((Ðïà¶wºŒŒëYþýÓû?$9rÛÛ¬?“~GJJŠÜ¸qCˆ@K )æ¼A›H\IVJ]3}ˆÝ»wÍúõë­/f~Gvv¶´´´¡ïEgXŠ£Ï‚h )nòvMk‰9J©6§�€Îà»wï
Í“'O$33Óú‚æW$%%é4*++¹ÛÇ€ÉÒ­[·„ 4ÅÍÔI›Ö(7þ1^„´··ÑhÊÊÊ¬/j~vþcg8	ØÃ0wî\ëÏ¦_±jÕ*!ß Mqg>�"q»þ¿`ú {öìò-oÞ¼‘É“'[_Øü˜û¿té’�ðq³ö&}|²ýÅÚ_òÐ79¼Àg€ø�kºþOMM•ºº:!ßsùòeéÓ§�õ.–X±bßECÌÎ�;é}CtëÖM:$ä‡@[ 1æg hñ�¿]\Ï²ûß�Õ«W[_äbñüojj^jjjpKcýY�¡ñ�k­Ó Ðc.¡UÄwïÿJSâñ€üœ×¯_Ë´iÓ¬/tÑö*TWW	/×¯_—‘#GZV½ÆèÑ£åÙ³gBŒ·LnòYÉÝ þ’¡”j4Í­bM(qæÎ�;’žžn}Á‹fæÃ†BB:ÖñvmýYõ¸Ö¾råŠ#Ðh�)§�Z³ˆoüaðþÇ,0}Ù]RQQ!½{÷¶¾ð¹‰Èû÷ï…„Wü‡ný9õ]ºt‘½{÷
qí>éÆwâ«Ö,âå¦ƒ\RR"Ä=[¶l¡ƒš!Æ�¯}Hh›²pumý9�±±•}SÑ­1çšE|!E)Uç”ì®]»r<ËÃìôÊ•+­/€?	ü«ä"”�³Œ5ÊúsKÌ›7O;)’¨€Ö@sLù­ÓÚE|YþóÁ)Ù¹¹¹ÒÜÜ,$zÕÅ…‹­/„?ÿÚÚZ!á¤¾¾^rrr¬?§±ÄÌ™3Y3½�¼AsL9þÀå@þð—é0/_¾\ˆ7ÚÚÚdÑ¢EÖDbØ°a\‚nñGñµþœÆÓ§O×ëÂ‰g 9æ\C»HL$)¥Ž›¼Ù�;&Ä;‘HD–-[f½‰Jvv6=ÐÃ=ÁÂQ¿cáÂ…üçïG�…ö˜ò}\kñLºRªÁ)É�††!±ññãGY»v-ÜÀlmøãiˆA?ÆØ±c­ðX–X-]ºTÛ‚“˜�æ@{LyoÐF<ó»Rê³S’§L™Âñ?Ÿ€Íí�¤ÿþVÇÙ³gKcc£�prÿþ}¾ùÇØ”¸qãFºüù;í1åþ³Ö0â™Óá...â/UUUV\µ&''ãÖƒÛýÂ-þ¸�±^Ä½Æ�!CäðáÃÜaá?Ðcþµ†Ïïÿ•&‹sçÎ	ñŸG�Éüùó;m_@VV–Þ#OÂËãÇ�eÂ„	Ö‹¸Ç€í7—£Åh4ÈhÌ> o¤ÞÿaiKÿê8/¿À“ÀÐ¡C;Õu(ÞB!.$¼<|ø�âï1ÒÒÒdëÖ­zÂ‡Äh�[õ­e$j~SJ}rJîŒ3ø®LÃ6…%ü:áqãÆiä/_¾	/<€Ýj�OAØ”‰ñ8ì~HØóÝ£Gtùs’%835h�é»|ÒZF¢¦Øtà×¬Y#$¸Á«W¯Ê¬Y³à‚•pÆ>;vì`t‚<=ååå*šûöíðîÝ;ìÃOH{a¬©=}ú´´··	h�ùû@ËHTü¢”ªpJ*Þ¦Oœ8!$X°¾S§NEñsQÄ†8t?óº?q®ý�ÕþFÏž=e×®]ß5È=þ\¶oßŽ¡¾À.�üü|9xð Y;h�›>©ãZÓˆkR•Rõ¦õ¿è&7söìY™3g¾E¨Šâ˜1c¤¬¬Œý!	DSS“Lš4)Ðþ8#N´´´Hyy¹žBèÞ½{hÎxß¾}ñ\¡ˆ·¶¶
éÐ)7õ¯^kqÍ¯J©·NI�8q"Y„ ¼§ß¾}[6oÞ¬e¯^½:¤(fffJaa¡œ:uŠWý	<


‚:+süówÝ‚§�‹/bs¦Gð�¯CÞ÷a�¼nÝ:XU³÷)<ûT E¦ï÷VkqÍŸ†„êNn¾ç�ššÙ´i
:f�ã¶r855U_ÑéBOŸ>’pàº�T�Šÿ¶mÛ<ÏÅ¿|ùRNž<‰pÝT:pàÀ¸9÷<â¢½*ª««yÍN Eæo
M#®ùÏ)™x—Cã	/hFÂÛûÿìÝ=HÝWð·j¥“‚RÅ�Qº·K-HMÀŠZ?P‹´~ê%Ñàu
UADâ"A££ j\²pF¯Y$|Ãs6±÷‡Þsÿy~à,_ïsÏ×{666tzzZ›››Í¦¨¨H³³³Íu<QWŸ‡ŒŒÍËË33¯ŠŠ
ó÷ââ"VÌZx�wÕ}…?Ú\#üÿ×m0<KŒ/ £££ØC-|ñÅ²0ËÞë	ZÊ˜/´uuuXM3úŽ��9Ó>d‘û¬2�îÝ hËuxgwwW)|+Ø—GxommáAÓg`ff‡®ðáŒ¥Yóµ°° ëëëø;ãZf?¼¾÷€ ÊËË}†?îÆ'´†°ª€»÷¸É°··gÅ,--éÜÜê5ŽSïóóóº¼¼¬›››zxx¨§§§f«�BŸQÈ$Wn±!Ðýü "G¶Á,,,4KqD:8\‡Õ¯C#‘ÛáR" ‹�I®:<2ÙFN?9 bæÀ¥1¢úøïG¯á�m$,©Çb1%J d‘{5™†l#§ßiNãQ¸D£Q}òø‰·ðÇüØØ›ãP¢!“Ü5‰l#§gŽÓ±< H2———Z]]ísÙ·Qþä2	ÙäªËgBV�DäµmÑ�~ggG‰(<3ÿÚÚZŸËþØógø“/È¤û¼•òÚdÅ•!"ïmƒˆë2¸>DD�‡ÛŸ34Ëá�ò	™„lrÕç{“q×�"òÉ6ˆeeeæ™Z"
þ²MM�¯ðG‡>4Íáaò™„lrÕè'“q×¯"òÅ6ˆ���JDÁ†õMMM^Ã¿§§G¯¯¯•(	�M®:ýb2ŽâúÓõ�>99©DèðGG;_á�ÃWxÏŸáOÉ„lr×+2ŽâzîÚß[]]U"
&tÂkkkó:óïëë3my‰’Ùä~ûGq[ ¿²úÂ£m&³Õskk«·ðGÿõÞÞ^ž	¢ @6!£\uûŠ-�ÿÛw"òÖ6x¹¹¹¼@<x˜	¯¢ùÎü)H�MÈ(Wí¾5YGwäŠÈ‰mððü&fD¨7Ñq Êëžww7ÃŸ‚¶†ŒrÕï‰É:ºãg¹´îó~/QÀ>ôÚÛÛ1#÷õ _68  A6Ý§çÅ¥É:ºã±ˆÄlƒ788¨D˜ðÇ¼·ðÇïéèè0·ˆåªã˜É:ºã/ÇÀ™·´‰(ùpå®««KEÄ×ræOA†Œr×2²Žî˜°ZZZš®­­)%öÞûûû±ï-üqµm…‰…¬rÕó„Ð-ßˆÈKÛ eeeéþþ¾Qr[žyÝóGGAÜ2 
8d²ÊUÓ/Mæ)"òÆ6hùùùzrr¢D”¼ðð:óoii1Í…ˆB …¬rÕõ“yÆ÷"òÎ6hÅÅÅü  Jâ²ÿðð°×ðohhà²?…	2
Yåªíw&óŒù`´’’¾ïM”±X½ö}†?^äi
d²ÊUßLæÑ­g€/lƒÖØØ¨Däÿ´ÿÈÈzœ{ÿúúz�F£JBÈ*W�_ðYàÛ~‘Ï¶AÃÁ#"òÚØá�w¼…UU•^]])QH!«\uþÙd�ñ›«	ÐÄÄ„‘¿¥ÌH$¢©©©^—ýÏÏÏ•(Ä�Uîf@È<ã×‡Ãìì¬‘—ðÇ‡–ý½Îü/..”(ä�UîšGæ»Z€®¬¬(%ÖÍÍ�Ž��kJJŠÏðçž?=È*wŸd�ñÔ6Xéééº½½­D”ÐÓþ˜ù£“™·ð¯¬¬Ô³³3%z �UÈ,Wí?ã…m°233õàà@‰(q3ÿ©©)¯3ÿÒÒRó†:Ñ‚¬Bf¹êÿ…�ñ­ˆüc¬œœ=::RúÊÞÝ¼T™†qÿ­fµpÀqßðå˜ø‚‘Šø’££Î¸q-Å]´WD!ˆ®Ü´¨\ŠÑJ„JPÑ±ÌEŠ¸Í"MS{·Å¡¸†ëÞ1÷}ÇnŸßçO¸à:ßç<ÏsÎMô}Þöïëë“cÇŽy‹KK‹ìììÑ£­Òf¹và/Ó>Â FmÃÊÌÌ”��!¢ÃwíÚ5¯·ýdkkKˆŽ m•6Ëµ£¦}„Ÿ LÙ†
…dooOˆèÐ�/Õç•^oû¿zõJˆŽ(m•6ËµS¦}„ã žØ†UPPÀÓÀˆÙ�7¼Æ¿±±Q677…èÓVi³\ûðÄ´��à©mX¥¥¥‡…ˆÇÍ›7½>ó¯««ãm
m•6ËµOMû¿ Ø´«©©‰’ë×¯K||¼·ø×××ó

m•6Ëµ›¦}„4 Û¶a�;wÎ¼©LD±�¸¸8oñ¯©©‘õõu!
m•6ËµÛ¦}„\ »¶aµ¶¶
Å¦¿¿ßë7ÿÚÚZyñâ…Œ6Ëµ»¦}„B ¯mÃºpá‚‘…Ãàà ×øWUUÉêêª�6Ëµ#¯Mû¥ ÞØ†ÕÞÞ.D¤¢744$			Þâ_YY)ÏŸ?¢€Òf¹öä�i¡À;Û°:;;…ˆ¢7<<,'NœðÿêêjY[[¢ Óf¹vå�i¡ÀÛ°._¾,D�Û·o{�yy9ãO$¢ÍríËÓ>Âo >Ú†uåÊ!¢ÈÝºuK½Å¿¬¬Œçu‰¡ÍríÌGÓ>B½ë ««Kˆ(âóÈõ42¯ßü—––„ˆmV$ õ 48°«»»[ˆÈíÎ�;^ãúôiYYY"R†6Ëµ;¦}„? |¶«§§GˆÈnddD’’’¼ÅÿÌ™3²¸¸(Dô/Ú,×þ|6í#üéº èíí"úowïÞõÿ’’Y^^"ú†6Ë} í#> ŠÅèè¨$''3þD|ð¿ó;€O|	�(zcccròäIoñ/..–……!¢˜^üdÚGîŸ^½zUˆèÛø§¤¤x‹ÿ©S§"7m¡³ü# ¢èÜ»wORSS½Å¿¨¨H?~,Dtht„* ïmÃºté’‘<�´´4oñÏÉÉ‘ùùy!¢ˆh³\{õÞ´�Pà­mXBD"ããã’‘‘á-þùùùòðáC!¢ˆi³\»õÖ´�Pì:øâÅ‹BtSSS^ã
…äÑ£GBDQÑfErp1! »¶aµµµ	QÐãŸ™™éó¶?ãO¤¢§ÍríØ®i!À¶mXçÏŸ—¯_¿
QMOOKVV–·øçææÊÌÌŒQÔ´UÚ,×žm›ö~ðÒ6¬ææfùòå‹Íìì¬~÷ÿôôt™œœ"RQÓVi³\»öÒ´�ð3€g¶aUTTH8¢€Å_¿�{‹vv¶LLLYØi«´Y®}{fÚG8`É6¬ÂÂB988¢ ˜››“¼¼<oñ×ÿ¸ÿ¾QL´UÚ,×Î-™öâ üm–~îïïãÿ}nûëÏ‰(vÚ*÷þšæÅ�ð#€1Û°þaïÞ^iÏÃ8Ž?ã\„,šË¡¹q(’I.d´IÂ&©‰í`Òž\,9µ#‡d·ÉáF$’ÒÈ¾œö-ZJØ‘í|Ì!$lÏô|ïvkÖï»Úñ]¿µú¼þ„§ïõûZë÷MLLäƒƒt‹‹‹œ’’b,þòB!y«  ¼i•4K·{ÿ¨öÑ„îxrss“Ùòò2§¦¦šŠ¿\"„c€—%­òæ5Ýª} |´–Üsîr¹ P---Éûö�Å_.šŸŸg xQÒ*i–n?å½Õ°"##Õo¡ÑÊÊ
§§§‹BBÏÌÌ0 ¼8i•4K·‡ï	„òÎjXAAA<;;Ë �ÿŒŒ£ñŸ››c xÒ*i–nßå­fX<22Â �duu•333�Åßápðää$À«‘Vé÷QšBùƒˆ¾Y¬««‹ÅÚÚgee‹\\OOO3 ¼*i•n¿©æ�PÞÑ­ÕÐœN'‚õõu‰¿Ñ'ÿ©©)€W'­Òíä­j%“ˆ®p%0º��ÎÎÎ6ÿØØXûØë*à+Õ<ðþFÀ’’Ü~ÿœœcñ�ŽŽæ‰‰	 #¤QÒ*Üø÷|±š|SúîîŽüôå FãÃ£££ ÆH£¼ùUÏÜð½0"ú×jhr%êáá!ø›­­-ÎÍÍ5ùòØØ€YÒ(ýõÝªuaB	"¢IÝkKå7Ó þd{{Ûhü£¢¢xpp�À8i”´J·§“ªyð�ÍSÞ[~egg‡óòòŒ>ù3 ø„4Jÿ@i¸ù[34` °»»k<þCCC >#�Òï«´Üü©{Pcc#ØÝÞÞççç›Œ?>øž4Jÿ i¸ù�ˆn¬†WWWÇÏÏÏ`Wûûû\XXh,þáááÜßßÏ àSÒ&i”ngoTëÀÍ¯Dt`5<yªº¿¿g »~¸  Àè“oo/>øž´É›“¿Õ:pID«VÃKJJâËËK°›££#...6ÿ°°0 °i“4J·»«ªuà&˜ˆ>Y/>>^]¢`'ÇÇÇ\TTd,þÜÙÙ‰7cØ‡´I¥ÛßOªuð¿>èþß¹°°À vqrr"OþFãßÝÝ�c {‘6I£t;ü�À£¿4Ãã¾¾>°ƒÓÓS.--5zìßÓÓƒøØ�´I¿ÇÒ8ð¨œˆž¬X__Ï ¾vvvÆeeeF¿íßÑÑ�øØ“´I·ÇOªqàÑoºk�+**øññ‘|åüüœ+++�Å?$$„ÛÚÚøéé‰Àv¤IÒ&ý5ÀÒ8ðèg"Ú¶brr2~	 >=ö///7zìßÞÞŽ½ ö%M’6éöy[5<
%¢ÏVCt8ìr¹À´‹‹ù”o,þÁÁÁÜÒÒ‚øØ›4IÚ¤ÛéÏªqàÑODÔo5ÄÐÐPg “®®®¸ººÚè±SS?<<0 Øš4IÚ¤Ûë~Õ8°ôV3Dnhh` S®¯¯�Æ_þ�´¶¶âÉÀ?H“ô»-m¯î¸µdUU¾Æâ_SScôØ¿¹¹ñðÒ"i’n·oq€w~!¢¯VÃLKKSG² ¯éææ†kkk�ÆßétâØÀH‹¤IºýþªÚÿ±w¦!Uma&ÜHÈ2oz1%‚Š¢",­¼Du+úQ”ÒõC.ˆ…v‰²’À¬2š³I£2Ê ";M6Q	Ò`ÙwÏ»¸÷G÷ÚYûœ³÷n÷ûÀ÷ÿ¸ör½k}ë[ï§åoTúÌˆˆ©¿U/„X(þšÎ^æF‡díÚµòùóg!„„Ð"h’î¼Ri1D�æ¤ÄB@biÚþüù¶‰XXîÙé’�Ð, „&ùþ?‡¦ÃdéÍuëÖ		-ZZZTËÜ›7oÊ¥K—äèÑ£²ÿ~Ùµk—äçç£»�êm_PP ÅÅÅræÌ¹~ýºx<inn¶¥ùÍ»wïdÁ‚¶žüW­Z%?~úýàß¾}+>”7n(oøÃ‡ËÞ½{1¯1¿j¾ïÛ·OJJJäÂ…RWW'Ož<‘>	9 Eúÿuhñ«°ÅÇ`Âƒ�'&‡Æ<zôHÎŸ?¯š×,\¸P†&ñññÒ£G	7T)qqq2`À ™:uªlÞ¼;nl"”X›Éû÷ïeéÒ¥¶ŠÿêÕ«ÕÆˆ„Ø´Ý¹sYø5¨B°�Jß¾}ñ&&N†š;uïÞ]µ‘<x°*8ÍÍÍ•Ó§OËýû÷Yâl AFú�´° Ð?b¼ÑàkPccc¥±±Qˆ³NøW¯^•œœIMMÅBˆ÷ì–ˆ'Ún2DV¬X�™… û’%KìLûÃ;œ›ØìqâÄ	Y¿~½Œ1BzõêeÙüˆ‰‰‘1cÆÈ–-[äâÅ‹*F4Z¤ûžJÓˆaÐ/¹Lw:D™ü\�–Çi§–Q£FIçÎ�­MÍI:11Q233åÔ©Sêß�z]¾|¹­¿wåÊ•Lû‡˜—/_Æ7C&JsßkMtêÔI†ªÌ¡ªªª˜pÐ #@eJÓˆ_ü©TuÒ$?/ýyöìY¤=�X`Úé ‡Ì j
�0òw oëoÌÊÊbÚ?D¬Ÿ±±EªÞ1s¼k×®’žžŽÌ—z­B~Ð ý7ƒ–¿I÷F«¯�ÍÈÈ !�Í@¸JKKeâÄ‰8•à;86’’’ÐHµ?º¿Cž­':d)P»@œË‹/P¬‡;ydk;¿±Ù9r¤8p€×öí�é¾S«Ò2â7	ÞhÔ-ð¯_¿bO…óµk×ÐWSÜä¼HNN–�;wâjà»“?îqq×jÓïÀÓB.ÔE EEE~|¯�Š	& p�"û€ö@ƒtß¦Qi	È¨\w/VYY)ÄZîÝ»'‹/Fêã²1|øp9~ü8D¦;8ÝÙ)þL×:˜òòrIKK3yNØ_'0wî\©­­b9Ð#YÐr Nž®˜jëÖ­B¬®tx§Ÿ��€ñn�"EÜéj
wÌø
 û@œyŠÛ´iž›¶›9-Û·oWžÄ2 =ú#4ŒÌÞøæcpñ6œ�S, f&sæÌù÷~œ¸øs!v(W®\AV¨ÝÎ½É“'K}=-Ó- šíÑ}ƒoJÃHÀü¦«èÓ§�rÑ"æQVVC×‹w°1oÞ<¦ýjÞ’——/‰v?áÅqäÈUÃCLšíÑßÿCÃHPu çt}`¹IÌ)ôCÊ¿[·n®ï`cöìÙìXéÌÎmp{Ô¤nÛUÀu¯aè`Ð#ÙÑs¼ÿžlÝGUü©Žc;vt½x3fÌ�¦¦&!Îsm›6mšç$^»À‚µ(æ ÍÑ�;´‹Mš7¾úèñãÇ«'<$ð8Ë–-ã}¿	�g’/_¾â,<x€§r®ŸŸÞW|:üsQhŽn¬¿*í"¦ôðøì.]ºHuuµ¿A�úÞ»~a4!pºäâê@îÞ½‹—®ŸŸÿ\¹Ih4G7Îúÿ›C˜7Ju“zÇŽBüßÉ.Ê\äúÑŒ˜9s¦jCœECC*ý]??ÿÓ§Oçf50 5FÆ¸Ti1…,Ý€O™2….XÆAA<ð]¿š”öçbêÐJíÑ£G»~~þ(fÍšÅ«Sÿí¡5ìÿo3ÉÞhò5àh�‰{>bŒmÛ¶ÁKÜõ‹`°�·À¯^½â(Pì†oãúù©t8„á1\K­Ñ�k“Ò,báÞ¨ÐMæC‡	ÑsìØ1‰ˆˆpýâlLš4Iž?.Äy&-kÖ¬qýü4pÄÜ½{·C@cŒŒk…Ò,b*9îaix¡áöíÛëú…/Ø7nœ<{öLˆó8xð V¹~Ž"Á‘h}R 1ú1…VÓIõÆ_§,lI›àm:ìA]¿à™ÑyíñãÇBœG]]Ö×ÏQŸ>}*Ä§=º‘¹õEi1�_½Q«›È°½$m³qãF×/tf¤ýa(CégÁnà�ŽŸtô´ÅÀ8Ö*­"–�kÄ�üŸŠŠ
Þûýû÷çÉßÙÏ³`ñëúyhÀ´¨¨HH›@[ôã�"–‘â�O¾>@||<›µQ�’’âú.ØˆŠŠâ]©C©©®‘Þ½{»~ŽIIIÌpµý¤Ú¢¿OJ£ˆeDzã–¯�€@qq±…"??ßõ›™÷ÿÍÍÍBœåi‘‘‘áú¹iVlØ°AÈw@SŒd—n)�"–ò—nc1hmm"*e�˜˜èúEÍÌ¦*{öìâNž<‰Žw®Ÿ›fEÏž=¥¶¶VˆZblƒ	m"–ó»î5@tt´x<!"ÙÙÙ®_ÐÌŽAƒÉ›7o„8ÃÎzìØ±®Ÿ“òIµ( %Ð}õ?´‰XN”7jt× ………âvðl¥_¿~®_ÌLÌ/öžp%%%t´´¨Þ¥ªªJˆ@KŒ¤ÿk”6‘¿Ù;¿—ª²(Ž:¡Ò5GG%BA¯–†"ŠB=„W¡7'�|�pô¡`(%ABôÁTüa>ôÃû „ŠR6à”	ŠŠø;ÔÖœuþ€öyÙ{ß³×úÀ÷8û,Ö÷Þ³÷þ.%ü#*à’’;Œ2ÍÍÍä™,¥§§s°f¾}ûwîÜ!_‹²TUUEþ+€å!è%<û?ÈÈµtø£>| ªà¸O¯×K¾‰Éü
ÐÝÝŒ>Þ¼y/^$_‹²?~Â ‡ —ˆÖêÐö$Fél€qQ?|ø¨ÒÕÕ¡¡¡ä›˜ìø/”ÑËZ^^N¾e¿"=ÄÉ:�sö¿zþrrXkˆ�Ó½øÓ¨EFFÂÄÄ0Zæüó½ÊÉÉ¡ØC|nôñ:¡1ÊIµ´!J¶òûý@�@  �‡|óR¡ºº:`”ƒW1É×ž
áË«W¯€ èè!¢5Ú°½ˆQNˆ¥ç¢®¨¨ —	ÐÒÒB¾q©Rvv6 £ö`–Ïç#_{ªT]]Mñî?z‡“õyn{£…2Kg¢Q—óóó|/š%C@ÃÛ ŠYZZÂ°òµ§2xgg�ž�Þ!Z›3ÛƒmÄYú$*àG�æææxè�b=yòu<{öŒ‡þð�\™ g8Y›O¶1Zi½¨ÌÌL{>:::¸9ª¿ÀcTRYYI¾æT«©©	ˆ€^�ž!^ôF;Ù–vô¢0)¬§§€žä›•j%%%Ù©‹Œ|ð¼Åõë×É×œj•––ÂÉÉ	 ½ÂIºä®í=Œv~¶ôZTÀx-Øôýÿ¼¼<òÍJ†ø¶Ip0;;±±±äkN±0ŸÂ˜`ô§W¨_ÛÞÃX:ìc?Ë}ee®�oVÄ³ÑÛÛËWšÎLNN‚á G8™,yj{4ÄZš£žmýöí[‹ÊW¥ŒæÁƒäk�£¯¥¥K¢G8Y�9Ûs˜ ¢�z¶ugg' Ô¤Û·oÃÙÙ0ÿkªêëëÁ`ÐÐ#Äk�^Ã¿YZ§< ¡¡�|“Ò¥ÔÔTØÝÝFîô¿‚‚òµ¦IŒÃ¹ÿè1è5LPò¯è¦¤¤ÀÚÚ˜Èýû÷É7)]JLL´óé¹×³®^½J¾Öt©¸¸Øž3b è	èâu@�a‚–,K;¢—ØÞÞ¦�÷ÐïÞ½K¾IéRLLŒ=:”‘^µÄO´äkMã` Sc¯Ñœ¬ÁŽí1LP_	|!z‘7oÞ„íím0‰¯_¿â>4ù&¥s2àØØ0òXXX€èèhòµ¦K×®]3­o"øLè	NÖà_ý~J,�ŠN´âu"“ØÛÛƒÜÜ\òMJ—.\¸ ###ÀÈcff.]ºD¾Öt	óÖ××M¼Zêäðô©í-LÐii\TÌEEEpxx†€Ã:8!M£ðnúÐÐ0ò˜ššÂ/-äkMç6×êê*z z�“ç·½…q¿[:Åõ+--�|“Ò©¾¾>`ä†´„‡‡“¯3]Â�13ô '±¿ç¶§0®Ácé?QAcl.~:7å„tFFù&¥3(e`` y`]DDùZÓùàË—/&m›:�NG/‰ú‰q:iÚýýý` x²�oRºÃÃÃÀÈãÝ»w<êZï “®Pcïwœ†^Â¸Ž8K¢—›ŸŸ�ûçFìe’oR:³ÒGGG�‘G €Ë—/“¯5�Y[[[¦œ™ÂÞïä¹xæ¿{©½à��ŒÐ5bŠ•Ïç#ß¤t	�izzy`ÐÒ•+WÈ×š&á!cS¶L±çcï?7zãZ~µôYô’³²²\ÿàüüœsÒ5*>>�‘ÇÆÆ$$$�¯5]ºuë›ðï{¾“gþl{ãjþ¶ô]tàéÓ§àvjkkÉ7)]JNN†ÍÍM`äqtt7nÜ _kºTVVfÿÑp9Øë�ìý·½ƒ1â,À¢¨¸½^¯ëC.Z[[É7)�1©˜“ÎH§-rÜµFÕÔÔ€ËÁ�½ÞÉó.òÞ¿9T;)ðÆÆFp3/_¾ÄD:ò�J‡îÝ»å2Ymmmàr°Ç;{^ôÆ~±ô^ôÒqÒØòò2¸Üƒöx<ä•=~ü%ŸoÉ×š®¨k¿ß.{»Ói’ïmÏ`þgïÜBªÚ¢0§sðbeˆe/aÉÁf� ñAéP/l©—Nå‹øP˜>øAõPQPb¡r² *é~�ÒD» tQºiPF™5ÎüçSD�=·îµ¶c�ñÁÿîÄ±þµ×œsŒ?P”�†ùÇãƒõå–ˆ7+¿…ÛÄÇ�'Å{ÚÚÚt@Œº\=z$a÷hÔ¾+”@f\r(tÄº²=#…BâÍÊo¡5IuŠ/� ¸p)¾æüÖÒ¥K9GÃÓ]gH\Ò™ÿÁ%d4®Ö¬Yc_¦©««oV~+//ÏbRüiw-))_s~«²²’¾}ûÆõÃžî²ÎûŽPK‚Q‹ÃT7¶Ñ®/^¤øøxñ†å§°µ¨øÇÎ�;Å×œßc®›››‰)ðrxºËZ[ì;B	4…Fï]Úº°Ã�ÁÁA½àóù?ÌQñ�+W®h(��JOOç‡—»¬ó½}7(�ç7£C.…¿}ûvb¶é°]'Þ´üÒìÙ³©¿¿ŸßÀY´_ù¨ÒÒR®€àá®ë<dßŠþ4z®(ÒÒÒèîÝ»Ä�sçÎé1€OÂøeÅjkkÅ×ž_;\$†À»áá.ë|nß	Š(ê\€òòrúòå·h`wˆ7/¯5iÒ$mÿ‹×¯_×c 4wî\ŽÛÿðlx·Û:ñ.PÄ‘î2"_Ò§N�"nlÛ¶M¼yy-ŒÅ�%&é—§_ƒ^kóæÍÄx¶ë.h—þÈ¥Üès¸"Áy#ú�9ÑÑÑA3fÌo`^ª¦¦†”Ø±oß>„ºˆ¯C¯”��@.\à8+ÂõŽÈgûPÄgÔT³ß°aƒxóJ©©©ÔÝÝMJìxùò%effŠ¯E¯´lÙ2»ÓÂxµë[ì;@Í_F¯ÃËôéÓéæÍ›Ä‰k×®éØT�„Wè¸Pbî"¾½šýâÄ	b<^í²Æ×ÖûÅPãø‹ßX]„)++of^Œþ½wï)±çéÓ§hÅ_“ÑîW|øð�o†G»­ž¯(ß¥ÞW48oÜµkqâÆ�4uêTñ†í±¨ÊÄaÇŽâk2šŠ‹‹ã8	Þìz'ä¶¦ý)?Rj4®xfÎœ‰`	V³Ó7nÜ(ÞÔ¢¥yóæQOO)‡��ÊÏÏ_›ÑÒªU«èÓ§OÜÂ~àÍ.ë¶^¯(?ð»Ñ—dÅŠ4<<L\xøð!r°Å[4„<zeâÑÐÐ€skñõ9^%''ÛŒ€Ã“]×xÄz½¢ü„L£g.`°íÈ‰½{÷âïopãQqq1‘21ç¬]»V|�ŽWUUUÜ.·Â‹]½­Ïz¼¢üë�FÃÎÕ¯^½J\øøñ#-_¾\¼Á�U)))öÿ­L\p43gÎñµ:V-Y²Ä¶V2Ï¤ë§QëíŠ†x£“.Laa!½yó†¸ÐÞÞ®7¦Ç(DÐ*Ÿ£G�â›øz�TS¦L¡Ë—/#à½ð`×5ž´Þ®(ä¸@[¶laµeV__¯¡V®\i[¢­¯âk6Â¼n?pá¹ð^×5>³ž®(ð�Ñ×pÅ…@’3gÎ°ê
Øºu«xÓsUvv6=yò„Vðø2_»®Z·n�ŒŒ#à¹®aP_­—+J„$5¹<@¹¹¹HÂj`F(o|.ÎŸ?O
?:;;iþüùâk8œ


èÅ‹Ü†?Ás]×Ød½\QÆ@†Q�C‘á2«Øàþþ~Z¼x±xü•éØ±c¤ðåìÙ³+¾–¥ŒŒêêêâvÄI·G�õpEeFŸ]ÎÑöïßOœ¸ÿ>åääˆ7ÂŸë iNáOSc“NÂüyÎ?Ç®x,¼Ö-éÞ­(ãä£FäÄí&-:�k/Þ¿�@Ý³g)Áê˜6mšøÚ† Y³fq<Ú‚·F²£sÀz·¢D�t£—Â[´hõõõ'l“••%Þ'Ožl&)Á£±±³Ä×8FY·µµ3à©ðV×uvXÏV”(ò·Ñ;—\½zµ¼Ã‰PQQ‘XcÄ—ÅáÃ‡I	.§ÿ=-zPÐÂ…éÖ­[Äx)<Õu�ï¬W+ŠT;!·QÁ SÀDv 'mEJàA^<v»DŽ±~üøqðÓáÑŠâIF­.…ˆ3ÇÖÖV–¿¶kkkq.&÷üÎ�;¤È¡··—JJJDÔ7fäoÚ´‰‰!ðÐHîo´Z�VÉ6êu(Fô!sŒŽÅ”-´Àa»4Ð—ý“üêÕ+Räñöí[ª®®¦¤¤¤ÀÖxZZíÞ½C~¸f;D2Ë¡×z³ò{÷JkÇÜ¿0&™Å ‰™BV§™&©»`Á¡	�a�\¢¥”—"ÅÂ-ÿŠ%ÎÂ¿(J·X˜»°ºnÎ‘äOWýæý>«©i¦ç¹qÎû¾çû©gcçô¼ßç}Ÿ?¿‡‚à7«ÝétL\ÀƒšÕN„}555åª`ÌËË“¥¥%õ¢Cám}}—à¸nð/..Vëý…Ì4¹¼ìNe2Q�DZ­O§T0Z[[›*`áD233ƒAÓçû[[[YÚ—þIÍõõõa#¨+ö³Œ��Éíí­“ïs@fêþÏÈà>•ÉDAô�Õ–t:iLLŒŒ��‹“¡üfoo¯$'';.ñûã‹hccCˆþËÞÞžTUUIll¬ãúxRR’477Ëùù¹8²Ï¬îÿ¾¤²˜(~´Ú±NGÅZ#¦��îääDÚÛÛ%%%Å·œ•””à8oó#-X/_]]Å&AìqÄ5¾õõõ²»»+.€Œ4Ù—q¬2˜(„ÞXí³N‡MOOŸÏ'nptt„Mt¨*fË©~¬...ªSD¦žžžÔ‹@uu5J	Ûò¢ªÆÆFÙÞÞ—@6"#uƒÏ*{‰l Õj_t:n~~¾:†ä8[<99)EEE¸@'d�)™™™ÒÙÙ‰’¡*À‰^àúl¼ìâ
m\žƒcu!ëãqqqâñxp.÷x¸íh&²Q÷·ø¢2—ÈF÷Lè>È^¯W®®®ÄE°é/6Sáe (_MxáÀ1¡¦¦&™››SåB‰^®Í]^^ÆÌ.ÑÂLSPÖöQ·»»[�Xðûýâ6ÈÂ²²2“ße‚uþÉn¾Ó-„VWW'÷÷÷âF˜v?==Ei]ìPÅvÒÒÒ°¦úÕG
±1aXPP µµµ2<<ŒéOUà„(ØnnnÔ¦Á‰‰	\O‹2»X�ÇW:f£¾j+>>^m²-,,”––™ššÂe]êåÚ¥��ÈB“ßjMe-‘M7êvæ®®.µéÈí°ïòò•Ô&Ÿ‘‘LÕãËu°á
_ jÝ¾¼¼\*++
êK«¿¿ÇÕþ³³3¹¾¾VÓ²Dv+,„Â5›››2;;+¨À‡zêdAEE…êß¥¥¥èï¨m¯Öð;::dhh3X˜AÃUøá²áh2ørÓÙÝÏVûK§CãkxttTÂÙóó3ÖëQo@}<>>ª` rœkG¿FÿF?GÇßÂ²Ï`F™úK‘Cnôk–¤å´DN�y&Ç,ý¼á�œæ­ÕuÏò.,,‘Ë!ë�yºƒ?2´=‚Èa¢­öÎj¢{{àÊÊŠ¹2Îäv?´w*K‰è[«½×íì²µµ%DD.ƒlCÆ™þïU†9Ø÷&Çq/vË¹2Íôzñ5•�D.ðƒÕvt;vv¶ìïï‘Ã!Ë�i&ƒÿŽÊL"ùI÷â 4”E	R""‡B†!ËLÿc••D.T`µºCNNŽ
‘Ã »�a&ƒÿ•‘D.ö«Õ>ê>¹¹¹\ "§Mû#»Lÿ�*‰Â@™Õ>é>YYYrpp DD6‡¬Bf™þŸT&…‘j«L6îìì‘M!£L7üT…¡?¬æ79"èóù„ˆÈf�M¦Gýü*‰ÂØŸV˜Z[[""›@&™ù	¨ì#¢ˆZ“—€ÔÔT™ŸŸ"¢C!“Ìd�Rg²�˜˜(ÓÓÓBD"È d‘Ù´?²Žˆþ¥Æä% !!Ay·82Ùƒ2ü‘qDô¿Ë×ºUtt´ôôôÈÝÝ�½2d2Ùc2ø_sÚŸHÏï&/h„ˆèµ c�5&Ù„,S™FDÚ¼V»4yÐ¼^¯\\\ÑC¶ cLÿK•eDdì�ÕÎL8�ÇÃÒÁDô’�)ÈÓÁÿLeýÍÞý¼TZ†aG8A`CâBðP¶0r#M‚	B¡¶�ˆÑâljþ	Ä…„"¸q%ÑB0Ôaf1èÒÙ9AcFdÐ	‘#£ âñî¾‚"{ž×#çÇ÷×p®ë9?Þ÷=@²Ï=/bŠ—ÏçmyyÙ  #m‰6%öð¶@fžç1ljj²™™»ºº2 ˆ¤íÐ†hKbÿçü¥/p·>ð<õXÌ…BÁŠÅ¢Àÿ¤ÍÐvÄ^é¯<[àÎµx~õXL†‡‡mooÏ à6Ú
mFìÎh›ÂF(›÷<³žRL9;;;ù#! ÿE¡­ˆ=øKÚ¤°M ÊîÏ�žbLQ[ZZlvv–ë ü�6AÛ �ˆ=ü‹Ú¢°I îÕ7žƒØëÆÆÆìèèÈ @[ MHø½ÿ€ÿò*ä6ÁØçlnn€º¥øëþ~nóªÔ'ž'±%nmmµ……»¼¼4 uC�W÷µ)‡ÿ“°9 *ÆûžyÏuL™s¹œ���Ûññ±¨yêº:¯îÇü×Ú˜°5 *òâÀ<§‹Iww·mll€š¥Ž«ë)ŸúOµ-\ìT¾/=/cKÞÜÜl“““<8¨-ê´º­Ž§þ/Ã¦ ¨{~óXllkkË T?uY�NÙmHØ Uç�ç'ÏÛ”çææìââÂ TuWN½Ðï­¶#l€ªöµçÀc)�ÞÝÝ5 UC�M}œ¯r6@Íxèy–2mmmá“Äùù¹¨Xê¨ºªÎ¦þÏÂV ¨9Íž)ÏEì0444ØÈÈˆmoo€Š£nª£êjÊÁ¡m ¦}åùÝc±Éçó655Å�@…PÕIu3¥ÓÚ‚°	 êê.�_<×)£ÑÛÛkëëëvssc î�º§ª‹©ÿµ6€«ü�ú”ó|çy�2 ���V(lß ÜuNÝSSÿ×ê~Ø  uíSÏš§”2&ííí6==m''' lÔ1uM�K=øKêzè< 8y×óÈó‡ÇRÒÓÓÃÏ@¿îWÇRû©n«ã¡ë ð/>ó¬y,õg�ÑÑQÛÙÙ1 ™©KêT–¯û•µÐm ¸ÅÏ#Ï�¥>;`bbÂ@4uGÊrO¿òF]æ‰~ b=ô¬¤^ tttØüü¼�žž€[©+êŒº“åà/©»<Ô@Ök¾õìx,5]]]¶¸¸hgggàŸÔuD]ÉÒ5uU�å·~ wåCÏ´§˜:LzBY__Ÿ­¬¬ð'C€uA�P7Ô‘Q]€2øÂó8ËÏ¹\Îúûûmii‰ÿ@=?·_PÔ‰¬_÷?Ý€2kô|ïyå±,o†††øF õø‰_¯ý¬¿òJ]�€{ô‘çgO1ë�ÁÁA[]]å� jùà×k\¯õ»8ø‹ê^è þdïìB«ÊÎ0ã_RÅ‘(Z*QHe¥D/rQ¬0Tg@b›(
¢• ¢ƒP™Ž?WV+bdøsÑâÍ¨ˆŽb@ì ƒ?E'7F1Ž$ÕÚišÐ$_ßgÝ¶¥âÙ'9IÞÉ9{­õ}ïqy’}ö6Æ#µò¼ì‘ñ¾Nš4‰¿ƒ¦¡^½zÆŒÈ2™&Ûd<ß�¿GžO¯9cŒ)ÆË5²EÊÈÇ%K–Ä±cÇ|3R!»d˜,“é|”-rMz­cL2U6Ê{2ò•kžïÜ¹3îß¿aLCFÉ*™%»d8ïÉÆôÚ2Æ˜@¥Ü.ÉÈ×™3gÆ†âÊ•+¾–€)6È$Ù$£d5«�ÿ‘Üž^KÆ3™%›äc˜ïyË–-‹ƒF{{{3Œ�A²H&ÉfVÿcÙ”^;Æ3
¨’ûe›Œ,¬ªªJ÷DoiiñõÌPAÖÈÙ#ƒd1+ÛäþôZ1Æ˜QH•üLvÈÈBî’VWWÇ��¶¶¶0¦ �-2FÖÈ\–‡üÌ¿1f¬0_î‘­2²rîÜ¹Q__.\ˆ—/_†1y@†È™"[d,KÉþžôZ0Æ˜1È\ùyWFV–––Æ¢E‹¢©©)®^½ÝÝÝaÌ;@VÈÙ!Cd)ë�ÿ.™OÙ7ÆSR!-oÊ^Y9qâDþ!OÍºvíšÿ3`þÛ¦O6ÈY!3Yoú½d›Œ§¬cŒù~ WÉœ|)#K9S{ñâÅ±cÇŽ¸téR<þ<Ì˜„Þ“²@&ÈÉZ2œ#Ó)ÛÆcÞ‰äç²]FÖrëÕêêêX¿~}œ;w.ž<yýýýaF%ô–ÓkzNïÉ Y(„íd7eØcÌ{óc¹Y^—ÿ�Q9ÉkõêÕqøðá¸uëVtuu…ÙÐCzIOé-=.T~È&%«)³Æc2£\®’Íò™ŒB9yòä¨©©‰Í›7Ç™3g¢µµÕW ,~è½¢gôŽÒKzZHÉb3ÙL5ÆSPªäy]~/£�NŸ>=jkkÓ¦’ËåâáÃ‡ñæÍ›0Ã= ô„ÞÐ#zUè<�9²Gýù}cŒÊä
ù;ùùO…”¿O›6-–.]qäÈ‘¸qãFttt¤{¾›Â@m©1µ¦æÔžÐzRè¾“-2FÖÈ\Êž1Æ˜¢à‡rµ<.Ûd¿Œ¡�3ÈgÍš+W®Œ­[·¦ÛÀÞ¼y3ž>}êË¿ÔŒÚQCjIM©-5¦ÖÔ|ˆì'KdŠl¥ŒcŒ)jfË�dNvÈCiyyyTVVÆòåËÓ»Õ}ûöÅÙ³gãÎ�;ñâÅ‹èéé‰ÁÁÁ£°vj@-¨	µ¡FÔŠšQ;jH-‡Z²Bfrd(eÉcÌˆ£TÎ“õ2'ËÉ'L˜1oÞ¼tMù�7ÆÞ½{ãÄ‰qùòåxðàAtvvÆÛ·o£¯¯�Mr$oð¬�µ°&ÖÆY+kfíÔ€ZPjC�†K2A6rd…Ì¤ìcŒ5Ì–ÊßËû²OF1È¯¶gÌ˜sæÌ‰…¦_y766ÆîÝ»ãÐ¡CÑÜÜ/^ŒÛ·os¦{º�Íë×¯£··—Ï¸³áÅ¦ÎXŒÉØÌ�¹0'æÆ™+sfî¬�µ°&ÖÆYk±ØGÈ™ð;}cŒ;TÊ:¹_~%»d³eeel¤éóì,`så*vé�ôÚµkcÓ¦M±mÛ¶ØµkWz—}àÀ�ôø£G�r'»ôîûäÉ“qêÔ©8}ú4ò5ßãg<†ÇòžË18ÇäØŒÁXŒÉØÌ�¹0'æÆ‹Ý.zMÏé}Ê€1Æ˜1ÍdY-ëåiyO~/ÃŽhé!½¤§õô8õÚcŒùTÈ¹E~!¿‘+ñ†ZìÒ#zEÏè]�o¾cŒ1&fÈŸÊOd³ü³üN–xÓ.é½ 'ô†¥^cŒ1¢\VËUòSyI¶Ê¿–xc.”Ô¶•ZSsjO|ù]cŒ1ÃÉ8Y)—ÊuòSù'yO>“=%ÞÀßÕjFí¨!µ¤¦Ô–§ZcŒ1EÎY-ëd£ü\~)ÉÎ1~^kï¤Ô„ÚP#jEÍRíŒ1Æ˜QÄx9UÎ—µr�Ü.�Èó²E¶Êg²[öÊaö2wÖÀZXkc�¬•5³vj@-RMŒ1Æ˜1Ì89AN•Uògr�l�;äoåäåUùµüV¶Ëç²KvË7òï²GöÉ~9ðNZä1<–çð\ŽÁ±8&ÇfÆbLÆfÌ…917æÈ\™3sg¬…5ùW÷ÆcLþ”Ê‰²LN‘Óå�äOäb¹L®�?—¿�¿”ëäÇr½¬—¿B¾æ{üŒÇðXžÃs9Çâ˜›1‹1›9ø’¹æßìÁ�     �ÿk#¨ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª*íÁ	   € ÿ¯û*      #¹Æoå§s«    IEND®B`‚‰PNG

   IHDR   @   @   ªiqÞ  
§IDATxÚí›iˆTËÇ»ÛqÜ÷}qE—pù$
A�Ê3âIô›>E.®<P4¢Ñh1w£>w1bœ}<·`ô=5ˆKDÅÝîž®œ_Ñçrç¶sçöÜig<PS5÷Þ:çÿ¯:UunÝêÈWù*_Db’ª‘jÕª›8qbdÔ¨Q‘.]º�l™kÜÓçl�*.Õb±X5cLdìØ±‘fÍšÙ|Ýºu‘mÛ¶E4h�/ÏÔ&Qæ÷ÜÏRèª*¤£€q.Ô‘¬¿¤ßHúƒ¤ï%ý é^4ý/‰2×¸Ç3<Kêªt’a£2÷89½[S²’¶KzØ®]»ÔðáÃSsæÌImÚ´É;vÌ\¾|Ù\½z•DÙ^ãÏð,u¨‹t¡ÝØ¨,¡`øC¢·›J6_ÒO]»vµd.^¼hÞ¿Ÿ2Æ$R©TBrRRR‘'%ÝÏP‡ºè@:Ñ�¶áØC…‰¸o5¼´U«V¸ê·òÿÿlŽ=šJ$Jr©d2™ŠÇã\7RþlâÏð,u¨‹t¡ÝØÀ6E,†Š U7ÌÏÏ"Ù¿ûõëgÎŸ?`H'%)YŠFSiâz–ºè ŒØÅ¶°‰m~SŽE'£¹ŒYòuëÖ5ë×¯·.Ž+§{2…(¡²ŠÖE:Ñ�laÛ` ‹bËõ˜�áv�:uj,ÿžêÓ§�¹{÷®ÓÚÛþÄÃ7„z6±°€	l`Ìe0Ãx/�ìæøñãéé8¸ ä&N*gA§×#l`Øk.Ü^ÉÿgöìÙ�ã’ôˆÒ	NË.ÀazÝ” o Y,`Ëu8Ô¨Q#Z³fÍH¯^½pûgÍš…Á ŠŠŠ @žá:÷õZ¶=@7¹zCl`+˜ÁŠ|£F�È¢¢E“ðÔ¶¶ö€’{ýúµ‘PÖL™2ÅH\ofÎœiöïßo>}ú¤`7‚›<òöí[³sçN3uêT«{úôéfÏž=æÃ‡ªÛ=$â`+˜Á‡0¢kì’Þ½{C(@íyäìÙ³¦}ûöe�.–SçæÍ›JH	&éÒ%Ó¹sçÏêîÞ½»¹víšÛSh‹»`VaÆ=ò‹:uê]¿~]%Ïºod-¶€äy'ååå‘Ûë-[¶4wîÜÑÞ*µT÷•+WLíÚµ}u7nÜØÜ¸qÃÑ­XÁö2ÍÕ«W·ùš5k(üsåÊ•¶¡%Jsf{Ü»gÏž yF=69rdàÐ¼ÿþ�t:Ô©60‚Ì`‡ƒr
*îðòw}ûöE1‘�3Ö�C‡iï�û&Yš�ôŠã®%‰Þ;}ú´ÖóÕ«Ã¡°°Pëƒ±˜Áå8Ì%oÓ¦MÉ~>pà€í<"1
Ú óçÏÔ zûöíFë—Ôûô²lÙ²¬toØ°¡˜n°‚ìp€‹rË¦÷;hÐ «�	&-Ž–œl@ÊfGà˜;wnVº—/_nê«§‚sp€KV^ ÉþE¯¥Ã\u+‡ÀªU«�T7¦7|À}�Í¦X&Ýõg
ìp€œ‚ˆ3ó˜7oÞØ™ñ,Qld0I¥ŽÑ¦M›š§OŸêDXê
pëÖ-�äJÕ]¿~}óðáÃŒxÀá 8)Ç îÿ��ª½ïª†&Mš„b–B e T‹/Ö¢¾ïì¯Ã`Äˆ~ºuùeÃD;Fõx½ 8éêG"9—û6T}ùò¥8p ‚"á–Å<cÌ˜1€óÖÍÐç&¿{÷n#a¬—´W7�ÄrìÕ�1à'ËÍGôfW	ã�?F“‰W±ÛÝ&¶6l¨@� hõêÕ�/®¤ÆTò„¹:¶›4ibCß-ZÓÝ¼ysV
êøê#E¸À	nÊÕ/ìýÕ€lïëØwI‰/;ÏŸ?7gÎœ1{÷î5ìåñ~ ®”ü¾}û ï¸þ‘#GÝ„Üè¾pá‚yõê•Ÿn¯ëp‚›_xœ—ÎOž<Ùâr¹¿_#x_}Ý.˜<«QŸFy‡6qÖ­’9âp‚›ÃÕ#úùóÒ¥Ku,-tÕ¤Þ@%oÏ”J²�ÖÐ÷àÁƒîû^ÝžÙÞŸ¾*Ã	nW�èg)äÔ–-[œ(ñ#Ï²û…Šaàº~‡I Nps¸zE"&-
]rIž�!ÌöJž1îC>T$á7åê'??~ÜVÉù'NÙµÑh‘¥ÏÎÚVà@'¸EÈ5zF äOž<iÄò»víÒû>[¸€ÜJdÝ¡C-þƒµX‡@y“g©”Í
g]ß±cG òá‡ œà¦\½Â�ŽmÜ¸Q'Ár%îÜ9“þ˜Ab1(ùÐ“ œà¦\ýÞþ¸páB[‰ïta—A%O S¯^=‡<³²yÕz„\à7åê};nÜ8C¥°��ÆéD†òyÛ!¿yófòÞ€'| ”€Ü”«_(<œ½¾ôçê2‡Â„«º³«ï	$\ÑŸ|¦î/^”9&ãQ8ÁM¹ú½µ“úí½{÷B½É3oÞ<Ó¶m[þ×­« äÉ8W`,XÀîo¨—!¸À	n.®™Ò±cG-^Úºuk¨×aïŽÐÚµk}É{uóA„ó ª;Ìë0\à¤ƒ|ùýèÑ£Ñ“7+ó†Qžî	ø“ÏÜš1cFè°Ã.pRŽA¶ÄzˆÛ%=z¤Ã Ô–.ûäÉ“R¿¨îÛ·oC0Ô–˜)Â.p
ôåX‚§V¬XQå7Eá å–Í¶ø¨nÝº1Æè–*·-ŽJ°Ã.Ê-HèÞ ®R˜ž¼’UðÃHìp€‹ró—ÌÍ‘_Ê–2³}Rç‚ÊþiLÇ>˜Á‡SPáp�k­< ßû52¬ôG5ö3ØÕ±á”•ˆáhz÷¤³d/èq8èa¨Jøy\É�Ì`W.aH|‘$ôŒ ©’�€¼âI�¬`v8”U–,YâVð�|n&<�{¡¢�È8äÁF°*y8„>ë9!ò}Œ9Ž¦é!ŒWà!)0èØ�ƒŒ`3ØÃŠNŠQrYžòÙT F÷î�žL…“#ç°€	l`t0—§è‘3ùÐ‰�¿öèÑÃÜ¿?Ng°~Ó_ê $¶°I`Ø¬9�MUù*ùÞÆX/ÒCê¹:*ë±‘À6À¢Ës}X:J–.�‘ì9o…Ïž=Ã“n�å4¼Ä“ØÂ&¶Áà@Û—mY‹[Köù’KLÎ�„$½£“¤žÿñÝï÷Þ§uu’C'º±�-lbÛÁRÑ!!‘Ù`ÉþÞºukvqØ…Ñ_‰¸4AOBÌH^,¥¯û±uÑ�.t¢ØR—·*X¢"1ù�OdÂ„	 J*QØ»!C†pF ÅÞÁÇ�µAâäÞä¾Ç³Ô¡.:Ð…Ntc[Ø¬l? Ò_m¨w¤Og•±ù”hqØ°a©iÓ¦¥-ZÄë1»Ã$[æ÷x†g©C]t +ã×*•X ó,¡õ% é×„’þ”~Q9A¢Ì5îñÏR§„_V±=%Ë’Óòë/ß
Þg¨ë÷[ÁªÖJ&��ÈI/ÛD™kÜs<ˆ:_å«ä\þNÏ0¨œž    IEND®B`‚‰PNG

   IHDR   `   `   â˜w8  ÕIDATxÚí�{ŒTE‡»g QPy‚HÈ*Š’¨k„„‡€&Âê
kÄ¬î.a�¢q‰«ÐtVyüŠ
®¨+ *ˆŸø Œ(.ˆ ²Q^.OqºûÖž¯sOoYi2ÓÕ·{zfú$5÷Îí{«Îù�S§ªNÕ­+S™ÊT¦2•©D).©ÒJ5x¦Ây&+“àcb'NŒ=þøã±-[¶TÜ{ï½Mn¼ñÆ¦$Î¹ÆoÜÃ½.•RèjÝ_|qlüøñ±‘#GVœqÆ�š5k6¨¢¢b´ü4]ÒK’ÖJÚ(éß’¶‘8ç¿q÷òÏ’y‘'yk-)+#áÜsÏ�)uîÜ¹]Ó¦M'§�JÚ é�$Ì98á„‚öíÛ›óÎ;ÏôîÝÛ4È<˜Ä9×Ò¿q÷òÏ’y‘'yS†–GÙªü<©M›6 ëÒ¥Kf¸\["é¿€&ÿ\pA –k{ì±ÔÛo¿�øæ›o‡Nc’A�RržNœs�ß¸‡{y†gÉƒ¼È“¼)ƒ²(“²á^”¯zíjl[·nÝ¥²²òrú€iÑ¢EpõÕW›yóæ%·oßžHƒ’ «GÃ!•J¥S2™$eþç7HŸ±(�'ySeQ&eÃ¼8¯wV/‚ÆÅ'ÇN9å”nâŸçÈµ#€ ~9�Æ3¹k×®Öl�g‰IAæb�’*GŸWÝA”AY”IÙð /ðoð¯õ¥6Ä+…ZµjE5oÝ¨Q£irí°k®ºêªÔš5k¡û€ - 0lˆcŽ¤ÏØJQeá5(Í¼À¼Á#¼Â3¼×ÙÚ�Ç3UYüíïÕÕôïß?õþûï'À&FA÷ ÜK!ªŽÏOð¦®	ž3¢ K]",§eË–1ñµíÄ¢^B¨3Ï<3õâ‹/¼mí G«»Vp	ážá�™êøR•+›4i;þøãŠåìD�[n¹%±ÿþ",Éø‚*Bùâx…gxGdA&d+e—“i¸Ž;î¸±ôÃÅ�K—.M[}Ø(z _ô¯ü›æ�™ÔÆ�µÁ�wïÞ=.–2Ë¹ä’KÒõÃêÓBáoý€/¾"àž9GdA&dCFd…J	üØ©§žÚ¨qãÆ‹`ôºë®«’xX}iÕÎ‘™�‘Ue/	ðO>ùäÆB‹að¶Ûn«‚ÿ°/ž±zR] —_d@.#2"+2×ª(W»™ÂÐ³0vÇwT©¿·\ŽÛw“Û-V£ëòÁ5ûÛ%eÚdDVd¶ì°øàWq.~q:Ýzë­.ø¶ ®pÙ,�d_�x(äÏ½îºý?«�™CÙÁ‚†¹¸]Mé#3ÀúŒ\{íµiG�`6ø®Àûöí3Ë–-3>ø ¹ûî»�ÄîÍÂ…ièTXWQ‘[½*÷‹/¾0O=õ”™0a‚¹çž{Ì#�<bV­Ze:tLE!×�™‘ÀLŠ6ÂeL"!ß¾òoUÏž=ƒƒÂaVð¡üÑŒ7Î´mÛÖÀ´›$/sýõ×§A�Œ|è�wÞ1Ä…dåE¢£fúôéæèÑ£<—U	‘ÙÁ ,ÀlŠÒî6oÞ¼µœo•Q¢ùüóÏ“!ØYÁ_¿~½9ûì³M8¨I'a6“ˆÁ¨ð2à1óçÏ×ç#Q€"5Žòµ<Ê·¿éï½zõ2ß~û­�\%¨¬È`&Ú.2ÄPçÂä‚¡ÅfãÆ�F"Œ&Ö«pY“Àù“O>é*Á|Í—gƒ~L>0xå\&lÌ÷ßo 7@¨2ƒ÷‚‰bT0ü \Ïo)ð¦›nB²LXÁNÐO?ýd¤Š*ø«MúUóñÇ«¼k�‚/ñWÉÕ&uQ×\s�*ÔMZ°à^°#°ŠÜõðç´ÓNk.‡Í2í‡e¤\¿¯=hêÔ©9�¯I­sÈ�!¶åyûÿŸþÙÈèÕV0)'ƒxùå—mcpÛƒ4`6!F‘»¢Ê°¿?†fÏž�Õõè%œþù^BÛŠÀ…©à¹�mK–,ñæ´¸µÑuE`Â½!F‘Ö5t”Ãn‰‹ ùÌ$
É­ò6l°ö|ÆŒv¯ÈGŒÌí<sJê®d‚ÆìÞ½Ûn�]·€	Ø€X)v‘Y¿ :9¬ŽÝtƒk¡Ÿþù¼­Ÿã¨Q£¼ @õë×ÏåÅGôæÜÚèöŠ°á~°Rì"±~ño,åØuÙe—Qžký®à(�y)@]y+€a•ù*€ôî»ïÚ
ÈZÀŒÀ
ÌÃ(|ÿ_aâ¹çž³}¿K\×^G$5àöÛoÏ»\~ùåQÔ Üê1Û#0â0‹¤ÈÚ2ØÐµkWsäÈJÏjý6sŸ~ú©ö~òRÀÌ™3ónÆŒ“wÀ~ïÞ½N�µÆ`V`vù. Š�tÒI}aâ¾ûî£ä@ãûÕLh0ÈÇòt™M›6åÝzõÕWLoC6lXuc{þ  +ž;ÅÒ×ý@3aä³Ï>C"FU'8Ö«ã _¡}Çîˆ•µGy�V¬XQ#è¼X!Øåå†¤AiFœƒ†Ìi|«¼ªªÊ\zé¥^#a‰«`ý^
à^{Mž<ÙVnN#ááÃ‡gE¸ä6Æ`v`èë~XVÒ[±Ê¨©/V?ùå—_šÓO?]• ÀÇôµ68>ër Âzeµ›*˜¤!‰jcA]t!t[5u}˜‘*¦>îg\ØÓ¾�˜°ÁÛ¼y³éÑ£Gh; æ!Ó|ô Ôuxƒ¯Ï®\¹’øŒë‚®ÊÐdóÈŠkwðU#ÙuÒÌÈ}Ü�ö]—I–IŠ¤ú¥”Àóæ¡‡bqVV«ø›o¾ÙìØ±#Û|€—å3¹râ‰'þÂ¶k×Î,Z´ÈÜpÃü²ÖDâFsæÌ±ýædÚ€Ø�¡×x`À€ø®L^�¯�/†TU„¬Å4³fÍ2“&M"`—ž!ûá‡lÊü7ß|“È/À—õ=æÃ?Ì<ƒ²©mS¦L1÷ß¿yâ‰'ø�vÃåÛw’;0Ë\ý?ËÇy{!q×]wÇÿû.ñ¨nNØ¸Æe¹nÓˆÛà3'ñÁhÃLY¹Ì	ûv�°C°Tlkêÿ‰û�ù§Ÿ~:©
ð l1ôÈVE¸–O¸@Öq*ø÷öÞ{ïÙJ:Ö
�Èæ£U``©Øæ|ã6ÀQ�«‡|\@vÁçøW%é³9ðâGnC–¹* šBCµmÛ¶Ì ¬TÈ÷bO}†Ý?³víZ�•?¹1Ø�!Xú(`žÄµ‰�¨J|NX|à·ÞzËµü¢+ ìÀ,sQ€6K;tèÀÜnB(5ð?úè£¬à¯^½Úüèù;0KÅ6—1ÀJ‰ê‘™* ¤Àÿä“O˜©²ÁO�xßxã×í�j…W°C°ô¬>çœsÈ'©™–
øÄæeò[ÁÏ,îzýõ×kÕò]~ÁÁ2æA«”øÌ50¢UðuA×òåË=À/šVù„!–ŸuÖYt©ÔÕ:øDHñ©6øòæŠyå•WJ|—o°C°Tlsi„ÿ%–Fø@P›à³ÐtìØÑŸPFÉ€ïòv`–¹Ž„¡Ù2�!N£ÝÐZŸˆj§N�üÌŒÙâÅ‹=‚wÅë†‚‚¥Ï8`¢‹ð:®ðeV,+øz$�¦–Õh6ò‘0ØÁ+Xæ¬ yp¤ˆ©ÛsQ‡"¼Àá…ü|-?Rå¹s`Ï`™ó@LbéýÂ•	©bã´œ¯¾úŠeí
ºNä°ìÃ×íp_Qƒq`ß`™ó@Lz�åp�‰’b…£µ!ýúë¯|Z¼Mãcùn9EGƒ‚eÎ1ñ_T—Má„<kÐ>!ñºR·nÝŒþ3Ï<ã~¶Éž‚NÈ�ÀìÀ,}&å¡ùLnX=!2�|J’È%ë@	)3ì¾Ð1wîÜHÀ×QôÐ¡C9G>%É=vìÀP1õY’Hã�•&ÔpRK·�$ÀÈ¾×[2Ó¦MC±�”W÷fä†Š©Ï´ä¯äP%¯ej;rY
GûÙTIµ¼Áà�È³ËRNÁìÀÐÂÔ‹ÖÉpšÐ*’ra–mý¼ÊšoWSÁ'Ta/M)èÂ,NÁ
ÌÀ.Š÷Æ;ã�‚.M${iº–çÛãù/¼°(KÝþ?ØÙXz5Ä2áÑ�ª$/¢ç¥¼B.ÎEqQ.Î…�B-ÎÍöÒž3°óu?î&+hÑ¿ûî;] U^ž~ŒÞ�˜E±‘„.Qúå¤6ÆaÁþçe½ ŒxÌ"{YOÞ³j"‡õÒ�gÛ­åW”ë0«¾}û6‰òU6æø“Xê­c‚òKzŽõƒ÷ƒ•…]4$–”®ây1YkAƒMU­LÀŒÀªû=³"~¡Ò
(¿¨ýëî#³ÈˆùmÍ#;Î†L5Ø­
Tv°à^°±°ŠœâáK{­H|‡ ›½_DƒÙ¬Ã–ÀLÀF±*ÔfA•’Øt4Ì�=:aíŒØ`¶«±wTî°£X!I,#ÎQ„ º1I’c6fÃ&•Ù¹,,l
Nq�)Ë¶¼(G³nÝº¤Ö„ú¾e™ÊˆÌÈ`&`S´}ã¤š2Bþ5Sn²d„¦”2X7í{øá‡«Ý´OeCVdFv0 0)ú&ÝbEÐ†±·²t;S2¤J¨wÛVªLÈˆ¬ÈŒì`àì˜X+ÛWþYþ¥×“´”P/6nuÁGFdEf�í*#wEvM%—ø’QRV5¤´±* °EQ”6¸È„lÈˆ¬jù` •ŠFP5eF ìI��ÓKrudA&dCÆRßUn@	¿aP"]JV3$¬�¼Kº6Ø¼Ùv#² ²!£~i)A˜¥wÔCÎ7S]GŒ‘8pà@¦]pÚRÛ)=ãïáÞ‘Y�	ÙJ|·a–è![Ú·”ªúO¹Ä@,%o¯hmP·dP«À;<ð
ÏðŽÈ‚LÈV¿ ô9ìW$¥�´?äãô<Šíjl×À<Â+<Ã{�ý’Lc1²ê��·u�.Û1Þb¼óÎ;“ÄÏý>eý'¬àžàážáÔ˜êü÷Ää-Æ>òÿÚð-ö@Y©ðýEC?oÅ1Ÿ¥ãÙVdÛ¡sŽé²á^à	ÞàÑµúúòE½ô'ee‹
iÐËµ5X›øØàŠ+®$$‘Ü³gOF�åŸÝÏfMîàŠk
¸‚N”E™”ðOð�ðZ_?uK)>vìX—å½ÄÊx‹|_¸±FÀçiYW/K[KZµ#§¤€“y‘'ySeQ&eÃ¼À¼5”OÛVêz�l#ýë?†Ÿ´Ýºƒ@>ÆHä’ï¶¤?kûÚk¯%$¼�ØºukbçÎ�	ñÝ$Î¹–þ�{¸—gx–<È‹<É›2(‹2)[}<5Ô�:“”ø¾p+ñÃWÊé¤pqÓvIGC õ£j†“eí$Î¹¦¿s/Ïð,y�y’wÖòËôËÏšË«�t_Ù0<Ö§OŸfòV|W‰¹÷ŸM·ðo’þ.i†¤GIœs�ß¸‡{y†g%ò"ÏòçÌsQF„ ÅËô�ÎUUÖ$•]K™ÊT¦2•©.Ðÿ j<nF›ßâ    IEND®B`‚‰PNG

   IHDR   €   €   Ã>aË  F‚IDATxÚì}x]Å¹í‘ä	ÂGÚ#7	éí¦¼.4ƒ�Ü›ZJè„ÐcpÁãŽ�Ü$Ër‘,	7Y66ÆŒ1Å`‚Wõv¤£^­ö¿µþ3óýÇg›<›G
¹Þ‹™ÝgÖZóÏìÙ[Ç¡cË±åØrl9¶[Ž-Ç–cË±åßn),,‡JJJvïÞ�ðâ‹/*^~ùå„íÛ·'¼þúëÌûíz�å9<÷Øò)X>üðÃP{{{HDB¯¼òJÂûï¿Ÿ€|"�ôpiÈã£–ØcâÎMä5ymîëèèÐ{[þIKvvvhüøñ¡¥K—†V¬X‘ÐØØ˜ð7„öù^'b¹è¢‹N½ñÆÿ×�wÞyÚý÷ßÿ5âŽ;î8�Ûx*�á±"ò7�Á{._¾<aÉ’%¡1cÆ„233CÇ–¿ã²C7ß|shêÔ©¡µk×&tww'=JKKµUz|ýë_?iÔ¨QßÚ¶mÛÀýû÷ß‹pþD$YÜÐÐ°¡¹¹ù­¶¶¶ý¬ ª5	æ¹�ûxL}}ýžƒs'ó¯¾úêÅ#GŽüÖüÇœ{¯êêê–�eY·n]Â”)SB7Ýt“–õØò	-›6m
4(4aÂ„PMM�†õùóç« \¾ð…/œ˜••õË½{÷Þ‡S›ššÞ†˜����ÝXä£î#‚Kð8^‹×äµyÞQè—§žzê‰>B¸2%Á‰ŒN=ô�–ýØò1—õë×‡RRRBÓ¦M¡E&µ¶¶&ú}¿øÅ/NÁÀí×hýÏ@”wÐ'·{1½°]]]Ò‰ÿuvvu(°D3]D7¶~½K�ÿx�U.±†Ñ”÷ä½Y–å—¿üå)¾|0K"Ëüä“O†æÎ�Âà2tl9‚eåÊ•¾Ïe¨O8pà@„V/|/ô³}0:Ÿâ÷B má��Œ3õ¢bƒtC<ù›èTà@ÀÖ¹¯‹@¾Ó]OäîÁ}îG×±·¨¨hÆ}PÖÞ@hõêÕ‰èBzÀ	.bqÌ:¶¡©©©¡éÓ§'€È6lH<í´ÓBÀ	èƒ¯CøßÔŽÅµn/JÕh�æEWñ�vvH{G‡´utJ}{§”µuHak‡hí”}À^ä÷´t:`8 `_9öÕ·wÈAœ�@a�½GÁ{Òqüy%XF”u#Ëüå/ùtì
Y'Ö�uLKK[Ür×]w…>÷¹Ïi¢'íÙ³'#óBêÉo¼ñÆÍuuuo�`/:Co'„í˜W¡Uä[!Z9…mî�·šÚeS}‡¬­ë�Õ@Nm‡¬ –4tÿÊšvÉ©é�ÜÚvœÛ.›q��²·×nÃ=:ô^zÏnW†ö(°Y{‘ÝÀ[¬ërß}÷…0vHÜ¸qcëzÒI'iÝÿÇ.xc¨W°µoÙ²¥Çw¾ó�ÐOúÓÞ|óÍ»@Þ{ ”Âw3Ü·G…‚àÒ‰´º­‚·Ë«¢­ –B@b9° ø¹À*ìË…¨4±ù5µÈÜVï�ã9í²Òãùšv@‚ãy/šŒ÷fÌ€(# ÑÉ2»²Óe�~þóŸŸðÝï~7Äº²Î®þÿóŒðÈ#�„®¾úêÐ•W^™€<Ÿß°™ÏÕ>·±õ Ý ²‹dFIe‹k—. þ`»ì…è[ê!8ÄÉ®>(K‘.VÖ¤€�:ˆLÔúÔò«¼Q`š%Çà>"z�¥zOÞ›BË¢e‚Ú M`F 86Q#à	aÛ²eË°®¬3ž$z�ƒ«®ºJ9ù·_úõëÂ¨Y§X‡¢­ž- áñô‚‚‚Ù±P|’FTA,Ð”´¶Ë¶úƒ’â³"åyÀ‹N¬ðùZ yÎ)$,8ÑÝîáE÷yw—òì~,Ë’ƒu–�eì`™]ÙY_Ö�ud]xà�o°î›7oî1tèPŽBeeeÊÑ¿åò£ýÈgùLOá9ºOÚºuë-˜U+ñÂƒBˆ®öƒÒŽ´¨ýyÝAméYÀ2€ä¯@ºœ`žÂ› ßŸ®%×�¨ÐN˜ê ¦z~,ô€OÝ}–¹²=_�¨€²¶ ì(7M€´‚ucXgo!ä‚œ¸úw[¾öµ¯%¤§§÷¼å–[B—\rÉ©yyyÉl%$„�ènƒà� ¬(h>(jÙÂ '¶¡ýÐ<…¨Ìf¤
Í›àŠºC[>÷›ÚƒâSx…¿?I¸í4B¤MñÊžß¬uÑ:±n¬#À1‚Fr@.n»í¶PFFFOrôo%:ÃÜ:ãŒ3srrzr}æÌ™¿ÂTë/<¦`»HN;Ð¢ªZÊ�—©á•m²,ÔøuÞ§ �\h`•
L4ÁËS|;_óÕîº=` ”�edÙª­¬KÕ¬ƒÖEëÔí"ëÊ:{#�‹Y³f�%"œ'èI®È×?µËqÇÇ
è[ºßÿþ÷‰õq	HïÀDN*N(~wk[›tl“f¤;H^›dT1uˆXÞ‘ìHw"hë4¸îÁLÀÔ`¢œ)†qâë5	mÌˆÞ ®lZN¦+ïæ‘î¬�Ö±ue�Yw@ŸnÈ	¹qõÀ 9Ñ¿á$—Ÿª%)))ä—+®¸"iß¾}IÜ¼sçÎ1¨°†ALívJD)kj“5 ,Âg“0 ,‡”zx´‘|¿g g VÐ ‚&1ñq�8SY÷£÷¶²°Œ,3Êªˆ¨´Né•m²ÛJ›Qç6˜À�\�rCŽÈ9#w±œ~*–„ëÂÐ·ùÁÞqx>•ÔVÏ
·@üƒm­Ò¼×Ðª}æŠî�Í´ÊÁZa¤#5˜@ ÙDó&@
¨¨Á¨gžý¼f‰X.+óZ�jÖÃ¡
ëÀ’*­«Ö¹Ýq@.È	¹!G|ðÁrFîÈa€ÛOC¿Ùe—õ@–ˆ×ë'c><c%;[ZZºYaV¾¾¥ýc«,®)^ø*¢¤UÜf0’ 5�E„å‘�¸nBÆ �©3�]<>(º…ûHlÈ'4H™Í 4 Òt€u'ä¢)¹!GäŠœa†ôd¼I$—ŸŠñÀÃ?zî¹çB—_~yÒðáÃ{öìùy<ó®B…X¹í@…ÃÍ­’¡øFÓ,¤.O ¸|›ÖDœ	TlÅáÍPCC¸®ûÌH„‰—WT¡LU¾Œñhµú©øÎ¬;ÖÉA¸©œ´À-jrEÎÈ9$—ä”Ü’ãéå‡?üa\Ë°õôcékN|V�m–’Æf�×Š>Ñ‘â4@œ	@®7@Ü q™‰¢ð&0#ø–Ï4Ø]Aá™úu3™òœ)Y–xñ«¬ìf «£¯gF¥ÖœÄ˜ ð& ‡ä’œ’ÛIÑO?ýtMñæ+‘Ï²ÈöÄ7tÏR|¼&í�¶H{K³ä5´Hf¸E2(>�ET1%Z OSJ2™*Ù„ÏSŒ€	<¼È^@oK¹ßŽ1T+ìÏ"îÕjý}\y‚­ßÃêIdV•ÎÜNÈM;J3Ñ¬Ü‘CrIN9‡BŽÉõ7¾ñ�ñ¢4íÕ«WÂÄ‰{!›øöÛo?N{ñ›€ƒÀÞºfVV‘éQÕ‚´Å·
#)hÁZ™7„!Ö ­N8Ô„Â¡ùàè^�¿Õ•…h†ü XWo Ö=šf„£¼ì©§	¢œy�KrJnÉ1¹6îÿ5–„±cÇê‡”xÝù'Wðn<Ûvã;*ˆß$ê›%]ÅoÑÊ/	[å—p‰ñ0™
/º	oy
o­“yKÍ>ð>ÙÌ[(²Î±ër›™�0ñm{¬a­.
gvu7.2�’rEÎÈ9—„�[rL®Éù¿Œú7ÜpƒŠ?gÎœþµXXX/~[S£Õ7F]N±Ã€]+îà…Gpš@‰fZ“Wq4µVªˆ1¡çµè`oK‹È«ÍÝóº-ûLü8ác[¾?Øò¬Ì fz6 ¿î#�ã¥&h;Ô‚7¥µ³gÏî/"Êù?Ss~ŒÉ„n$}ûÛßNÂŒ¯àMßÛW˜Æìlhl”ˆ_ÞÐ¤Ä.vbÃåf¦*¾’e¤Xˆë²=éÈ[¿{x¡LÌ¨ kê:eS¤YžÛöŽ_ñ"Á¼n[SßÉcx¬»NÌõ¼Ù<" ËBxÁ­¼
Ý�ip�À¸Èp¥#%gä®µIM œ’[rL®¿õ­o%aÊ8É´ø','Ÿ|râí·ßN'öÂäEJ¬øÍ@MC£¬¬l–E*z³)ÁÊ"ÍäöXBˆ°Â7.ð¤“poyCÐlù9üÀ#¿Bnx6UÎ1Qú§8wä$¹á¹ùØæ1zM3“¾…°Á¨–£Å—ÁÊEXYƒ¢[
Œ×@¢œ­Ä15�MÒ5€x�krNî©Á?­ß=z4C??~ü“+`—¦j€´ª&YPÁ
ÑÕ ²ÂVi3€å[£&ˆ�>Oâ­å1¯ðâÙ†©ßp„N•þÃ'ÈÀ1Säª§æÌsMÀc(°…yßÖý}ñ­Ü¢˜Â›@ûz¢Y·[Ý�
ã$ÃxwÍäP¹lhP(ÇèdÍš5:€ÿØñÀ	'œ é™gžÙ	#À÷ñ­|
ÅvÕCüVxgÅGe ßWÎ;�û<L)¸K5ïaÂ�‚¹®¢Ç‰Æc!jNC—LÞúŽœ�–ÑcSäáœ�ØÎ}Íš¿&à>³ÝDVE“?Ÿ©™�ðëaâáƒá>l0óÇ
î¹Ð<¹˜ª1È!¸ŒrZ5�€œãò÷©>"ùÇÎ~ö³ŸM¼÷Þ{é¼ž»víJA�øÝ['ØÔ6H:…÷(÷&°mÈ3�bf0€Ì#�‰Ã¼7@‘s êƒK×Iÿ¡cåªésTà¥nÎ ynë7tœ]¶V^;(<Ÿ×ô­=ØâÃ
»¿hâ»Ö„qá¸ir<Ž¿Å.-¬%·jåšœ¿÷Þ{)Ô€ZP“˜n½õV}¯¿páÂß`ÐßÙ-”4 µÀ
´¸…Z!3"Ì -$@a]ƒ!0èºî‰öà>
n0#¸ý+ë»ä põ´Ù²¶ªIük…®š:KŒ~Bþ{ÂÓ2aÝËüª‡³ƒŒPv-…>˜ZØ·z¶å›È@“ãÇ™ÀÁ¹TNkÇuõõÝäœÜSQMþ!âãËÖDÌüñf_À\õkìïñév
%ÍÀ›‘FI+oÒŠ-FŠÖÏ¼UÊŒa Ž3ƒõ‹¾{ðäÆð0X¡ÐžŒ}ù9}=…™³^6W·È–êfä_’F=!bûù#&HÿGÇËÝ©™²®¢ž/‰x/ÜõÍ ¼¿™ÓÆ2
39ó&<ò1â[>lü�7‚r}>Ò7"à¸Njëê”sFj@-¾ùÍoöüÙÏ~öw�	øf¿·ˆð4¤Y¨(©­GEeQ9ÅovðÂ7Åoy5L¼ð~Ý‡Ð ðÁ|ÐLý q	îsÍ<+FM–«¦Ìr-2¶�Ó}7ÎY,ÀçÀœ™&/TÔñI åh²hc÷4h›¬ås?Ênõ‰÷jzãÀòÖPÈ›BóäT�)©!×fj@-¨	µù»¿÷½ïIìsŽ?þøÓð'Zua¨�h}¸AÒ\ÁÇ!�0 ¶�)M`­?ˆ`aFk­Öb›ôåMò¾r
­‘ ÿ�Ç¥ß�1È�—kñh8ï@X�rwÆ*0r’šàŽäÅ².B±[!hì½‚÷7Ä�ì}(<áë«uoŒåÄÃ¸«°(@nÉqCT|åžPjBm¨ðwùÊ'ƒ�ÞÌçææÞSçXñëjåÃH½¤•5¢°Ml÷b/tÞýFŠ#Ì¥>ïÉB…Á~ˆÌ|Ð^ èÀ÷iDwð¶<°l�<¸|�ŒÃÈŸ‘‹J<vÂþ=™¹úTÐØxyÃµõ�¬Cœ¼ØqÂÜÆr`uŒrâ`PþÊŒC®û”ï®®—&p^ëL@-¨	µ¡FÔê“ÖŸwß.ãÈÿËùùù;8è«q­¿®¶Fr+ÐúUh3€¯„å�øJ—;�ON|×àaæP±}‹34ÿ´¼»}Ô3tAPë¯³ÜÄ“3ä|DŠ`„Yoîâ_
Ñ<ÎL&¸/‡	o¦e˜7Á}Ë7ÁMä�Î/Š1Àjp]ÞÉ=5€¼Emðý`/jõ‰ŠÏ·Oe²õóW9nÇœ´ ÝÕH þîH-
Ö@‘QP…ÞÌ °îAó�I2SÄ¶˜Ø(ÝoëqFðQ�àº¦…t HÜî@!±�]Aj^X~;i†ŽþžV–Õs¢Êµx»?ò&üG¶vëç=/éžÊœèL•SÍÊ1¹çuà¾Vª�€PjD­¨Ù'"þç?ÿy~ÏŸ„¿Égë?(¼Œ�Ã?sêâMë€0Zž_ŠÂZÐX#”WaÜíóâ[ª2ïHXXª×Wò¬åÙq‹AÎB-G¶è‹xÃÄå³x-œ¿-~Ìæ·äŽ0GðØêM:UœîŒlƒ7”­Tï59à·›Éyìá‚Âø
pµp¼²^àºQ9¯�ŠO-4
@›-Ôïgzá×L’ Ý'ò‘'ÿv­'³“'O¾¤²²²+zÓšî¤{áÄ4%ÜÁ
jyî?¼ŒÛf¤±âûÙçæâ¹|Cc·lB¼±¦h‘�‘fÙP�´¦U6Õ¶Éæ¼ìiê–qgñ4{X+50oë8ÞÊ®}="Áõ³É9C—Ë&>#YUúÆnUu›Þoî»ßýonì’@NõA=o¡»FFl¨/³–oõmÐÔøQ£A.K	å™œƒ{¾�Ô„ÚLš4éjEÍ¨Ý'2ë‡Ÿhaøï‰ßÝ™ÃÖ‰D:#ÕÕR¼„Ç¤y¥õly,a….ý&Ðpf$)*>·“D}M»±¡KŸÉìÜ#S6l“!Ù¹rOZ¶Üžœ.7aþþæYäÎ”¹wA¶[ºF&¯ß*³·ï”Ü’jöçU�AxáËéî^Ü¾Áõ��úgá/…ëåå†yúí½èSÃ¨Ü�’ÛÐ-30&¸}î"¹+u‰<°x™ŒÄ[Å'7m—Œòe}e£l€—GZ£QÁu5Îè®~¬¿îÓTËöo–÷H6€û:h@-¨	µ¡Fìµñí`oj÷I<þõ øøé›øÆýpoÖUƒ›–EªeI„Ñ°[Ä¤Þ„Ï›	bóŽ®+!<_[æ&�˜µ§ˆ¢ây}¦€}�‘³�
âáhú+ ÏàÇ¤/pÃ³ó!pƒoÙNx¤*ˆ–AÓ•4#"Éò¥òÌ+oÉà¬Uòû'gÁ\i’^Áü@ºô{ä1¹zÊs:+wSÊùù=�H_ló÷eÙ.5ã…Y2
MË”ÉD"ŠÏº©ð&¶E@å&9Êm£ãÔ¡œK°­´ªZjª#ÔDäøÃÛýÔŠšQ»ÿïàšk®éÍ¿usmUUo$U@=núN¸FRKêI¤	oy/ºå-JxÁŽ˜¸ß½³�{Â|ì	’Œ–ó0�séãSåJóÇ¹ér[Úór×âr×¢årkj'q°o¶ü×¸éè·Ç#t/¤ÀîÌF˜^qÆ—í/‘‰k·ÈM˜¸„o‡>C�–>•÷�õa±Lzm—Þÿ\L%OÛ¶SfcÛí¸ÿ-ó2åú™äwO<'ã\îgyi@^k4Œ°¾²‰O¬›ß`œfåÌ5¤žSŽ©÷Ô€ZPÕ†Q+¾$ºöÚkíMáÇÿwß}÷q)-©pû™NÞ¤7[]†ð_¢2xÁYH3á*+Ã– ÂTbÞ» Rn˜1Oú€Èsv/†	nŸÿ¼Èfï)•E%uÑ¾=ì?¯jEÞÍ˜×IÊþ
yúÝ² ¨FŠ*¼»×r¿!~ÊþÔ–×å¶9qý)Úzû Šô‡p�š$—£¥ß¾ày÷Ê;:FXPX#WL™IC ìgò‘PïëvŠkåÙ÷eôÆ×åfDF–�×½™¯™EtlàLÀ:GžE€Kœ—>eã£Õ‘*¾²ªª“á¯ŽS©µ£†wâÇ‡ÿ^x¶ü:~°é}Œ6y“®jÜ,¿2Â
¨«µ€Ì[Á±�Ð¼UÊÖàµØÿ¯,­•ë¦ÏÖºó'7Í],Ï¼—O¡ùI¸ˆŠê‘ND]îY¾•Âû2RxÛee^¹ŒÉÝ W<1}:E-ý ê@vÝsi2dõ™þÎ>š‡ãNé5žÇàî¾ì5ÒÇÿ×Ø'eþ¾2–÷®GÚÀ¹’Çé£âS;÷ËXFƒŸ™§�‘útÄô�éÖ½À>o’;äë åÙ­+oª5¡6ÔˆZQ3jG¡åÇýŸ{î¹!=ðëËËË;bx“îºªJy³¢Zæ»‚³0u„9ÕÄÜkùE%ÒpÎ
šþ’±BCè î^žQý˜b‘;×Âgì`ÒŒ -%VÉÓ'��õÚ·?’™#—Ž™Êë«�ç#¤_�×Àƒr6È3ÍSÃ,­n‡Ù|Ën ÀzÝlaÒö]ìZ´eOØôº,­9ˆºÕEËáEs]"ËLƒü)=‡&Ð{ÎÎåÀ�üh�UhãGay
mL9â¶3C<ŽGªTjD­<�ÚQÃ�û4�ˆŸP=ž)¦GðÂ|ÌÀMè6„ÐZI)†Ø “¦)`…5ñ	ÚÜK’îx~=ëÝ}ráˆ	Jð-)™ ±�äºã)†	8â5Åg™2°í%þía¥_öûcßý�1˜¼qö"N³;a«¥`¼ËãEÔL„šc~AD.ÃÄP_Œþ¼p©d;cúu
X¬ÆàË,D±t9Ñæb¼tJý°H_ùj�LøØmÑ2^|mýäœÐíÔ€Z@“J@5¢VÔ,VÃ£Ÿ¿b•„gIžüYüªv6Fÿü
¥³ª²RJ�%¸9D¼	s°ƒUÎœžVT«S¯ÉÊ%¹*ÖL²8ƒffaJÑJ¾mã±Ir0GðÅÆ¯ÙÌpí„L.9AîÀÀm:ëøDÀVMqi/zºÂGK�x¼êå€ƒÃ‘r%ÆéÅµöôX9-°[xÑ…ã
v5ƒ—­ã_¡‹‰m .o\ŒKÔ3®^|å¾Væ#Ÿ�´,\)Ô†Q+jFíðgæÇSË£îðÎß÷ÿ§c†é}¸ŠïŠT†ewE•Ì7ñYÐ
f…vÇXe(¸9Y+î„Å5®E8îó—hýK‚I[	A!Œ`‹ ¾Rx�ÌÙP×.ÿºO®:™�mÚâ ó©áIŸé¾.Æy&|@p@¯kûºH1ê¥×ôšCÐ9»
$ÝLjO8%Ù¼		qJŸ‡FpÞ‚×3><‚â+ŸÊ­qêòÖøæ;þ©I5´©€FB³]½{÷æŸlõvZ&íoúè×¾—^zéYxþoAh‘òŠpwM¸B^/‹¸ðOGÆE‚"@qhÁ­R&<Á<{Rð*ö×�O…†Ë •ø{@¼Ž3Œl0‚Ig	_@(öüjŒÆK¿Á|‚xL®y:E&¿þ¾ÿ“Â0<Ç‰î¯ï×u›ïE‘x¾ð{\Füü«fÖIj°�}™8æþç_€†ËoÆO—yyU¬3Ï
_¬ˆ‹¢µf'¸‚û�R‹7 	´¡ºi jFí¨!µ<êþÿâ‹/æã_OüÌéuøõ*¶~ B"À†’ˆ$;¡ç{'Õ5çf+4¨œ7É˜ùAûHÎFÊˆµ[ÙRµ’ö„a!ráÎeº­~ÞŽäŠIÏˆïç/Á£ãàÜÍ*^ûjj±n]ÇÀŽ‹¶äÔüˆüfÂSr6Ä|(+—_{!ƒ(UÔ Cr7I_D·KðÈ9go¹v¾!Xëv­Þ8ƒÈÆ#¶“_€y3´€&˜¤*Âª5ÃÏí^Gñ3øÔ2ñ¨€rbÿß¿k7*Úú+º* >±7K)ô­Ÿ4UiÑ"h7Xšµ§”¢)I�¢ïFÿŒkÔÄ…H3 Ç~|}¤YÃdËyCÇê3üylqBèÙ
Ù×R8ÞÛ…dOÜçÎ¡iì¾,ëM@Ò Î­÷¢ºN°ÚuÆ“ÆÙ—K1¾™»?LX¤<´_7ñÆí|Ï­ïÿ§)Ø¶²¸Z¼>ÔŠšQ;jH-�Ê ‰XðJñ3ø±æd„:ª³¢¼\JË+0è¨‘yZ :ä}ÁtÝLaà>ÂWÎ*LÂæåWÉoÑ²~õà£2({[-¯ÁªDÆŽ„SAê²ªÉ-ŽÈ�˜Èé‹	œs1á2_ñ_÷*9@‚ýÃD¢ ~›ÙfÂç�U¨‰µ\÷f®–_=0L~7ñiI+¬v×wÂÓpþ^N8žóà’UZ·ß!J¥T3¢ÅEHÇS@xæ}t5#øþŸü§¢1Rj†ü#;µ£†Ô’¹ð«=@œŒÀo€0�WV¡“$ókæPEšn÷&�·h0ƒêÏ¥�ØGå�hYJ�À…Øh~®»Š“-ÈU“ŸQñÏAÈ¿â‰gÙ?ƒì6Yí‚\ñß�¨Â¼?Faç õ×IÃ½U†®Þ¢ýù%£'I2g&Ë`¶x£²Ü®žX¿~FŠà&D'�JEN|ÇƒÝàç>r©¼ÆA9R‘§&Ô†Q+jFí¨!µ¤¦Gów=†�Óð£E¯!œà¢å]•¸ø¥aIe�ÔZ Û¦y- U„ûŠçj_‰î<Îž=°t­{)Æówó1‘(>�^-¹ÕmìïAþd>V©ø·¥f¡UEøM!ïÃcÍ8±(±Ô�"»c™jÞÁÖ=X~8vËõéâ©»ù™D«q&5aµ,õó>,D�&±nüÛ¾N&7Î ±¢{áÍÖ�|ðÜºßéQ­ÚTF ]À»ï¾û5¤–À‘6þÕ¯~•�	¤oãÇ	vqPQZŠ‹b`ñNI…ÌÓW›LtÒÁ¡(æ6ƒdNVŸxã}¹`ØXÌŒ�10tRtéªø­2sÛ;<†°¿ç,!dƒ^KU&´‰g†8bøVM0OA8»7õ­Uüó`¾±›ßägÞl‰jE±‚q~ƒ¯�uls!Î™ºc§¼MXÂ™Åƒ\¥}4¯ºÝPMŽ¨	´	5¢VÔŒÚQCj©šá’€ßèï…ô8œôcüÄy%¥¥ÝáÒy7I¶bÞ¹Òì�ã~«(÷põ´9:ÀºæÉ™’]Rä Ï\ñgà5-E×Ö‡Ï´Fmx�-®ÿ¬ÑÔPD¬	4´*¹ÜvD`ù8xã$Õ@ÌôEHçèž³ˆóQÆXñý -ƒ³k¦>'gãØßOŸc­¾PáÊ -Û-²‚Üšð¦A2¶S›*€ZQ3üô~¾úOjé4M8"@øÞ<	Ï�¿À„B5zÑJ`[Q…Ì-p@¥Qq+d�…$[?ÔµfÂžŠc9xöÂ+ÒoÐHí“6¼¦ïÌ—ááÌ×vFÅçT.æãÇoÝ©â§áþ6ý¨ÚL`yÃ|×M,C(^Šk»mq-¸.x¾°¦äUÊ¯1šÿÕýCå/nf�\Ä>ÍË�èÇ§“^z5ZŒU0@eq�£ÎZµ�¼ºÑÃ!V|Fj²­8,ÔˆZQ3jÿ7µ¤¦Gm üvÿø¹²^¬ØàUÜdŽ7 Q ©Á‰n•Ñm¶^b#ˆ’ÎI~z¥ä^>y†¾Ì™÷ön´ø±”†Ñ	ÛþJñ=é4@ ¸ý#ÄÏ„©Ö…ñÈ÷î^YüÞ>y±²‰Žè>;Öúf5E!AãÔª~ƒoÎºˆ<�µãWonŠ‚n#»°J®œøû~ÔåYš‚]Ÿ	©<¶nûÔ™ €ˆåÛò¼5ÙêP\RÚÍy j‡¿:ã¨€pqOÂ‡ gãÕb« ¤¤»²¤X^.
ËlŠ˜ïûž
 u…2¸®ÀâM ÛâÏs"Ú?>¾y‡œ‡0OFŽdí+‘ÿÆü@´¢†>ÎïùÙçòXT<^xD™(àîÅA_æþR¹ñ©9r®Ž#“›ŸI‘,lãèÜ·(BÏ·<¡&MÅ#ëåxœ;ë¾ÁroÆJŽAXÿ´Ã.‹o6ùöQÅ?ï7F¬�­Ÿåö�ÇZ½ERÇó¶åÓ§DÄ8åõ`,hm*„A+€ÚáÑ³©%5=R$zðd^¿J!EÅÅÝa5@…3 
¡ˆÂÀuƒ9Ú
Îu«´‡Ç~&KV”ÖÈ¦ÏÒ9ôsÑú]·UÒ½ø$Û‹ëÈ4¡}ÞÂzš3'/oÃ7„gÞ7„†"43>K/©3¡û–qÿ«§<«¸{áRýÁG€yØÇ¯�æ¼¹KMÜ¸~æ|ÎX—YDXD4�)ª!Nx^›0ž¹�üÓ H©5*Ž1 qŸ$‘¾ò•¯ðàãò“Ÿœ…A`CÔ %j€W
+dnps Ï"€�…"b�À4G’Ñ¬ÄDÏÃé+tö¬?FÐÎXÅO£\Ë÷Æ‰CXT1#¸ÈÃ'N9³9ÈcÀ}²˜ù~‘c]Uìõl�÷á‹«3ï,wÌËä¢«_D£Hö�rùÞBöC¹/>ž_'ñºÆƒïú‚\˜ð&òá˜k€Ô€ZPjC�¨5£vÔ�ZBÓ#7 þµ+5À~ðƒ30’¬ñ ¢¸H¶–ËlÞÜÀLà¶év¦U\§	tÝWÎmÛ”w~J~¥Nñ>³õm†}ÿÚ©0D«¬Š´ÒñY,zŠ]O3ñ4|ÏÚ]Q& uŽö@[êÅ#'b_©{|‹Ä^yÂZ.ÊŠ§”ÙQ¤Ò 0�¶PŒ/pþmÏ¥ºÐ?‚ƒZdÉ‡ýA1mÇy�	®f ã8Ïó¯fPl-*WB+jíª¿ÿýïŸA-¡é‘à‹_ü"þÂÆOñ{4ˆ(%RXTÔ]VT(ÛË0âôî"•Â›	 ¦4q˜nÂoóy¾$?,WŒŸ&}A"_»Î…0œüyzóvÉ7ò9…ÿoð¶Ö»¯PñÎÑÑùH9ëÞGäLÕ.v¡Ü‹žxÔ�p»Ž®ÆÌ#Ï»+íyýp$Q+3‚£ÖoÃ vˆôy`¨Ü¹`)}c œÑƒ­ÜÖUTæ«—Ê§­¼TjD­¨µƒ†?£–Ðôˆ�pÊ)§pÄx&~€Ù¤÷y±‚ÂÂ®ÒÂBy«°T’}Áˆ¼(Ì „ß_`'r /ÓJhèÏFëtér6æÚûÃ #Ö¿Ê¿èe‹Õ¾zÞÀ½PÕâ+n0X·î‡ÐnÊ‡ô1ëøÛñÓ1šŸ&÷a$ï…÷e²ÇÜCïÁî$å@¥\Ž÷gÂ w/ZNã��ÓwîÇuŸ’f¦±îÞ0®Þ¾U»|0¬›øÆŸ5$ÝqoüR“Ð† VÔ³¸ïSCj	M�ü) ¿RÝ8ùÓñïÞmg8Ñ‹È»%±…Ð4E»¦º®K°î¶ÌÙ‡†=ž£Ï½œ69*×>�¬¤ÎÙWÆGB¨tBehÖ*˜ Ù‘ReÆŠN³·ûQ8[¦>ÎÍ(lp\8× ÔßŒ�*gÝó°Ü“¾’¿ƒà»AÎB²ó÷±òyÎ\c1ñÑÔ¸
44Ûo°ó¨5¢VÔÿTÝvjH-�#7 ÿÂƒ‡“�ÿ"þ}»5j€‚‚ÎbD€=…E —›SÜº!62ñë‘€‰(ÿ`cHöj9s œf�ðê»<)éÏî*”ßŽ›<*}Ô9²&à>Þ_E¢!ŒT<?ÞQ!üóujžEÕÁ.Š)[t2Þç_2r"ðˆÜŸ½†ö…ò‡±?ZG¶pîAøc™VÆñf°uÏ¹åSjC�¨5£vÔ�ZRÓ#6 –žø‡
h€ñ§x1üIxgaA� A¬dsŸz`ýðF0G+!T`ô<U¯®{&…ÏÔÜGs°e9L“~FMpï¼|�ïò0û7Ç˜PŠ¸'älÝúP`ùý���E™PŽw÷Ë…ÃÆÂ¨Cðfp¿"b·×/S”Ã÷×Áíä‚ç[ƒrF0n�·À6j±ÌƒøE1€viÿÔ’šÍga=Î9çœyrjjêx|^$ù]¸°Kó*@x$¾€f†D%Ö	Ûg•2p{2Žç7ð6½�Qÿpé‹V>rý6Ó ‰a—ÝÁŒ÷
0Søæá‡áÕñPLèÌ–yåò|y#çxßç�þÖDÐui[ËŒ9—P±¼Õ”S¶½‹5JËúø¦7ýô°3t\d4‘Ý5�÷0Îë.É[ U–�ãp®M¨�G5ƒvã¨aÿþý©åQý™X�ÿøÇ'0Œ1â–¼¼<þÍ¢@�ççËÚ¼2™�÷Q�Þ
oÈ'l[2Z>¿©»oá29ãÏƒäRŒüùÂ…ƒ6‹4JX'bæì)ãø &Ê±‚>s/xg·¬®lq×s&°èƒuËÛhºÒí³ý¶Œ`¼6�:††>4LMðÄö]œhrõ2Mt¢ÒGj|°Ï¶	¯Ïf!¿6/�
ò%ß™ “@‚hâVjˆ÷'­’¾ô¥/}†îéÛ·ï€Ý»w·Ñ yùùÝ¥¸É+ù¥2û€ÀZ»­[w`Û]d0Ä \‹¿ù;óîArý³©:_`h¡ƒàÛ0	Óèó@TŒñ¹/ÉÚÊFY\\ƒ�c…�D°[ŠM�yl»�Ÿ‘Yñ¢ `�Ÿ|³<)±!œ°óœ)	ê­ÞÎŽ—ý^0îŒ7jñr>€ùyªµÂ¿ÑÔÖ§OŸÔÐi™tTßbÔx<Ò“ð›ôÿ¹cÇŽ=)ˆ]…ˆ;ó
]a‚HVøÆm#‚çi¨�½»-¢œq÷_ä¾%9:½:ƒ­äýŽ ëFÐç…I´†ãA+ÖS|>wëàñŽYóe9æõWU6ã¸J~çH7ò‘¬;¡mû·ÏÊÉ²ð-¢þ„Ü0êeã¦áúå<÷°­”uf·”Ê²Fçì±^�í,ÿá¹rfëŠ Õ„ÚP#jEÍ¨5¤–GýQ(Nî�·�'#ÿ%ü.í*ü•ÈËëÌÇMöP‰¹@
aÑuƒñÀá+&´µÌÁíÀa�k0rùZýõîœŠ’âÃ�§ö¿“·¿§ƒÃ>”��¹‚KñÙö/¾,k+ðâ§´Nfƒt-«žg-GËÆ| eYÞ`‘áÚ©3Õ¨7j¤Šøã­Œh‘¼çV‡›dMIDròËeuqDÖ„ñ‚)j„WÇ›ñcpyöÛæ"¿ ]è>hBm¨µ¢fÔoO¦–Gk€ ~ŽüsH?—œœ<Qû¸‹ã�`å�2†k!‡/x@tˆ	˜Iø‰ô~qƒ?;ÿ‘‘rî ‘­cäòqOÊ¨¥kdeQ;ÑÒOÐ\„zŽÌùWÃ·&§ã	a"Á`�|z.^÷î•µ0Ób<¾ÍÆ±JœŠŸl¿!Œî)Qƒ�	ü9}…Î!$ï[÷¦QeâÁ‚°<š•Ã'˜{¬üvÌòð¢¥²jaaµ7A€/ À£Ü Ñ‰Phr€­}žÖ©µÃo:SÃ�õgâ=0�x"/rýõ×_�yeÿÿ¶wîÁQVi¯Qpt oU3»VQ+èz[tvjvGav�q×UÔYEpf PFe4ÂænXÀ$Ü‚"73¢ÜIw'éî$�H¢dýcücöòÇÉÙçwø¾=™|é®ØÕ¸È¤«žêî¯¿ïœó>Ï{Þóžó]ºIÉE«°¯¹Õä1fYa‚(rà;¢;øÛD =è�ø	sÿ’×5žkz§¹,³ŽU˜}L"nÐÒ0=Õ•í¢ÄãˆÃ6‹>úÔüð¥7TÎ\[Æ½æè	e	õ
�÷_+âóÛé¡žÐ¼ƒžB«íæš…eš|_NJ´™¿s?—‹!¸³—ÏrØõ:!ô/:c8fÚ³6_¸eÚlû>F6M‘s—Ô·’ÇÐvÇ‰ã+)\=h€Ò¤ÉjƒFÊÙ:ÐíÐÐ%€_-ôÓ•¤öÊàþýû�ÖªRƒÖ¸È ã¸*ªm>~Zün: Û{ÆK�ÇJ{œVúþY·QÏÔâÊ�_ÏV¦½€Pk	S¬¹>ãm°LGÅ�¯sÓ4£¸Gëü·Ë	p„¿]°Ä<¿q›òƒ“f§�Š[m¢Ø%*~"–$Òp“È\E¥[§?gîÕ	¤åU80àÛM™v]bVñ»²i¶§©"O™©;ƒzóms·NnaëS…Å¦˜õcp¶ùã½‡Î´J@i"mšmïG+4C;4DËt"Àyº¯œ«‚.g5I‹
É.›šN5ãiò¸ÍÍÌh<F€`CÝw~÷à‰E¯}‹[­´Î�P�–2¥bJ(ÂÛÍd-ÿÞ&²™æ&Nú"óîz‹×û(¯¡]„¶3¦³f §zÔšŸ¾Yh‡…Ûè…Â$-3¿ ÛÇ6ê²òr�Ç›$*í!áôÄp!¸›³®•Ø�j�jì´Yºiuû‘Ì‡=®@	í¤EK©ñ½åæÓ+šsé»l�¨a.7zœhá8I	W‡ï ùªk³úX“íýtÎSh„Vh†vh˜ÖÝÁÞAè¯IH/›?þÓºÆŒJL£p¢©Ñhj1y4&yc“ƒÀLŸ^ÙWi{É]Êâ_ÓgÎ¾­ÐbN0§l§ûÔ,3AÓ­ìè	Æ<„`Ìuõ4Ÿ.«XâlSÂµZÙ5ß‰þ9úÅj¦¼–mëøk9=x¼zðô·‹MQE�Ù©O¶ëXî²¥¼Ü„;qRõ8;H s$Øß=ÿ²¢ž\½QNö¥³ÝµÅ›z.%”Ïèä•eÁûq6ÙsK´À…³ß£aäµÃÕ´�öùKÍ'�îÑ -ÐÄjƒFh…fh‡†é: !ãü‹õ¢0�Mºµ²²²Ec•u6«²XS³YÝÙ®qV_¤ A2XÑ0ž7•ø½`×ÕlÚf~§«ËÔ[>Pï|"{C€zÓo8��×»º¨Ã+Ò×ÆŽ›7Ê÷šÒ„öcÌÆ	<p�Ïê"y7s�áYõäÙrŠùæ!=-dñ»;Í;-&Évh-¡ì¤®Þ¥wB´ž
Ôn.é§«“n‘°ä¬0æë·|9ûä
vÚ)çù¡" ‘bza‰)×�S¦Ù¶=[²'$7á6uf9ðáxqN—ð ÷h€h"m˜þµ šyÚ¹%à4^ýôºHÿX9„Ç�nØ°¡Ty WšœJÈÓŽ5&ÌÖ¦6/
x‘Ú0ûÀÒ7å Ïª×,²ãtÞ'Uæç«JÉlo{¼hd3c�áï@djö¯z¦Ð_>2ÍÌÐ¾%
µˆâ×ËqìËõ}D‘%Š4üoQà69QGÃúúJ³°l»Éÿ$dÞküLS¸/íÔm›³E'}Þø$b^Úõ‰r%¯œýÓ0¶^‘à=]Tº]IæÎvM=ãÇÍd%zw*Qü9Ûì5Mþ¡�™Wúž¹gWð�šJâ¸An’ó°ßïý[Û¬h�&h³~ýúuh…fhX JgÐåDv˜:uêÃZaê$Ì4$¦Y8ÒxÌ¤n°ƒNh—0'‰<ˆI=ËöJV#¦•=«‡þ`áR.©";W=NÔ®ââSŠí1ç-6…Úß.9' ,!óîŸë·IÜ/6ìàÜ¾’³çU÷,9ÃL3FÐ
£¦n/™‡—å˜¹¥ïÚUÆ•º ¥´¦ÑN»ÊêO-¦¬¡Å¬ÅÍ›{›—¶”+j‘ÓØáævå r0œËÙ$|_É©òz?tã¥«}ðÙîÃmàî}@´Ñ� £šÂšÃ@=h` ž2AøÞž={Žj˜ÊëLS¢Á”©§äßœan[@@�z•„¬÷HB4$=¤Ž0¹Ê'*è v»=~•’½_1ìãåJ4ž³6`ëN¸úÇ z Ig¡~_ªûf”lQ®°Ò†ç;˜†>õK3öÉ_š›ÿí8†Æî¹êÑóÍ½Ï½`Æk„8	ßÍÚ0öÓûòÛÍjŠ˜6b3 •ÿ–Yz¨ÆE4ÇW�Ÿàotqý…å¼Qü£�?EG4B+4C»Lü@?�J¼HÄ†ê_+ç{•vÖ74˜¦†zóiC3Ó)˜Ì˜”Ûé™Ì‰‰¯+'X²÷(½Ó_Œqâ§(�c'/]¡ñy¦™¼$Ë7Jd×¦Àþ¾#ÈI)¨ŸMD*Õ]oæëÐ'uÏ!9kþ\�ä÷ê[2ä8õ1Sá7†0–‡9‡ôš–É–_kØÉ’mä1Ôåõ|êö°+)àúÓ„ÖdÄ? š ¡š%	ÿéò¨AºÃø
þ5æÀ�q2NT¹IŠ	z›k¨3. œpàw„ð:bêÄoåÊè¹lˆ°>wënR˜�m^Ü¶Ë”Ø‹@?ï™`ŽëÚ’9¯ä	þ½y$”[>Ó%±æÅ�+8ÿÏÝ@Ü"l7³tùÚ¼m{ÌK»+ˆV”ÃqØ@”�#ðÛüä8Ø–ÜVz?‘®áîÑ -ÐmÐ­R…ÿ´…„oéY38À·õÆ/v�‡šL~RC ›°k‘\HÛ#-øøÍC�åúŽð#=fæõÐ¿WÎŒÀæ—º~oœ�©àF�g_ ›?^+ßÇâ‘ý¿»ƒˆ{<ÁqÊÄ™�k»-�ö¥td‡à>¶Ýë‡ÊüÅy×Þ�&hãiXüÉT¸”J”]ÞzðàÁF/ñè�š„ðnC«ÉÅSipWÑœa©Dõ‘z›Ûˆ ä„îÛ§Ÿ^z�½v£Ù¤éWnÝg½¬ß�£c8vŽÖîošú4KËôp+Hž~cµÑâ:��u¤ŒÚOyp»YÃµ8‡{z?OmTÏ¿mÐ(C½?˜âYúw*<ìJ=:þU<�FÔY¨3áú„)

ÕÓw�”�ÔÄ8RÜv¥|#WS-±¹&ç`•)mûAS“ÞMüRõrŽ½KÉ™ü?eå°_°þ }gÄ~;•Õwq×ðl"®GÄ¿Š&hƒF.ùËì‹�r¡þ‰b°¼ìJ}¾YYg-HCâuõ¦±.n~×pÜäÐh?ŒƒÀ÷ \Èw¿§Ü¯$@pz!a8ëHœÙ„œ`¶¹OS¹ÒØ1Î¾IØ6ïØdå¶#>K¾ö±ï“üš9;Y¾MNWÙeÞÏ]©ìÉ ý”§pÇq‰¯kþéýü¥|­´ƒ&hƒFHþ’¯âaºÂÄF=ŒxZ4íðÂ‘EL(i !ôœ ’ÒÞßíË…%¬-ÌÑ…"·sVQ˜¬3�uöm�zuvü3Ã@y
åú­M=ÿ÷:sØj¦h&a×$tüs*‹2)»×m°á²XœÆââ8.àîÑ -Ðm’­üe2 ñfÐ0½ôùúuëÖm!ˆÅb15¬!3udÃÞ¸˜ ,—þéXÄçIÈèíqÅ"ËSk6iÊ6ÓÎËÿA'�ÖTÅÍ6­Ø­QOFpz;àójMÏøã«µá:ó£ÅKOŸ’Ö±ÜûGöÎ>½n·ÛŽí°ÿsqÚ`¹…c¸†s¸G´Ð´�Ì?páÇ‰ªì[zeÉQWœü ¢¢âe£4¬Ów‚�êšO¯�c�30€|ž±IÈLk;ùÀã¥ZQœe§Eœùzõ¦ºãf»–x·ëI ÛÛ­ÿ“\=¯Û¹ïfEÒÿ±‚[F~oÛ•ZÈ4ì—“ê.NüNE\ûÜ£Z I†{ê«…„Kôø‘«xÑÂ…_®óÆ%5Ð€za³–K1ÀÚ�ˆnY´û­Þ†c½÷D’ÛæÊppÇ¹r¹<ëçzÎÀ�,Åj•ŽÅ›ñZeœªËÉŸÕýÜwÊÌ+ÍÄ¹‹ìªß-Â�Ï<gž)ÝB>á•õYïëwb³;.ûánsÝ	ËeÌ¡®áîÑ -¾êU?™X¼PCÁeC‡®ïß---ÝJ`\¢¡q¡&7k5öæb$zøƒd8Ô''<¸=(�_!üe=Ùkò«¿5wè¤Ó˜Ÿ=cþêñfôcÓ…§íç1OÌ0w(Û¿ÿ•å<ø‰L®®têì×{ûÙgp‡qO|¸%ë‡k8‡{4@‹ô¿ôsÂÍ@eŸWèê“«µþ|·2Ò„ïÑhÌÔE£¦2VgVÕ{‰—Þ1ÒÁ#%Ùö �¼{ßS–Á~þ1üå<c±Vó>Õ°PÌ‚‘½õ>eú\pòX~±Yôá!’.–k9&õƒn¶¥¶ŽàJœµ™£â®.5ÑXŒ¿ŠgÕ•Û½pçp�h‘ÆØŸ™Å!aÐ�!C†Ž¦L™2U×ü—†ÜY�Ê	jÍáX½)Ä°Ô¢§ÞÜž¢¬à÷¼x½G " 0™-|V�×vÁÛ7“õ÷ÚV_|ÞK|¸ƒC¸$ì‹Ûÿ„c¸Vï‡ó´—|3¶Dì…ŸË†~µÞGêN¢×üpõNP[kÈ	òºF‚¯Š:Ž´”û9’õ¸h 
º…kDg¨~�Â>'>Ø«g5Æ_\vŠSÆýßˆã×.ôÆþ¯y(ð2Ð!z
Åwø§¹+Vü»pS#`ÐfEðˆÊ³H-zž�ÔÛS£. Ç¹ãÿ_ëG|WÎÞXƒ‰‹«êñVSc9„K8…[8†k8Ï@èÏèPp1g¢ô$
xSQQÑ»
[qJ°N×ûþh½)PÌuÄ¤"Ôåt°û;¸ò\Owå¹mn¿³£þ\E8�›¸ÇœÁÂ%œÂ-Ãu¦B&Ï.ÑräUÊ	p‚1ÊV?Öœ•gÖâxµ5ðPmÜÅ[O/Âô@J^²m É¶ z¸màk®?ß•ËgËAQ]+œˆ›jSí‰gˆ_RRò1\Â©îðñ§|2ú3²ˆ1éRýÍü0=� o½«¬¬ì°ï‚©–q1ZQ5«ã-&"‚d;"ã °½·–÷ÑEˆ8p"žùú]Ý Û×ˆƒŠÚ¨‰‰›ÂëÝÓ¦M‡á.áná8p²ç,t‚ÁZ�®F�Ðtå.yñn�cÖ!tVWkl«Ž˜�Þ7ÅšÍ[I^4èI°žIâ=¤<>	ÎxýÎáÛC	7pWÅÅÅÃÂ%œž¥â�€Ë‘h°?\a>BŸoÉÏÏß¢lÖ:A$éÄàŽñåµõ"¥RqI©Õ!å~©v8SõãvØã³ln°¶×DN‹'
ýp”——ÇÿX¸ƒC¸„Ó³[üàÌ€_†š³ŽÔçÑYYYk	qLmÂáp‡g¸‰FÂæ`uÔ¬ÑµýoÅ•%#ßžt[®'L7AZS—2\>ßU7‘jøÃæˆ×óáNûá®àîà.Ï‚Œ?­SÇ6(1®?,À	þBÿh™¥“Gÿ�§‡B¡Ž° ÔFÂz¯6;Ô3¸U<›0
y‰¹1Žx»Ý¡GsØ€;>‰3¤]¿N] ±~{M½µµ[Ã`Å‡8�8‚+8ƒ;8œäù&:�.#¦sÖ8Áõú«Ÿ}ðÁM $2"á°©‡ÌáH�Ùmâü¼…íE±n¢Å|t#?æ# t`¿Ünû¹ßƒõä¥Q¿ßþµM²©Û°›q~k7<åååMp7pWßXñƒÃ�›(”]©Ð6JŸGéö¥	ú›ór†…¾N	…Ã�‚©…LµÈÚ]3ÅµÍ"‘^Ô&R[<@zÁ’
×¢íœx]�
Û7àT®m´ácmjû1ÙÅÙ†øÖVl–íÜÇ_p7pÔ5ÛO'ìŸÍ³ƒK„+t2c¤aôìÙ³³öíÛ÷{V!G÷¶Y' Õ¡*m™=‘¨)•#äˆø•"!<ÂùÜ-�íI·¥êwIÛÞòÞKÕãwGd�B¡°¶a#‘›gÍš•p'pG™ÎöÏ¶Å¢‹…!šÛ^­Å�k	{7ÞxãŠ;u_;F–(¡£
â<#ÂÞp�ÙXÛh
c'Dv›EŽ"µø©~~O~l·úüvÐ¦MjÛ^	O[i3mØ‚MØ†�;o¸á†°àNà&É"Ï9åöÁZä¸Jáo”æ¹Dƒ›ôgÕ³¶nÝZï¾#Dª*…*SÖÔ13%êi±Òï} azBT¿E[ ß{�<ÞqÙ~}
õl£´¥BÎJû@U(8{GÛ	õÀ`6b+6Óóá .ànÎUñƒ×¸!a¨È¸FŽ@4¸Vç¸ÇÍ›7ïM%F­$K‰�Y©wÁ„„j†"fGuÜ¬Wï{;z\B·Xgð�"»«SDb>ûp=:D= 8eo;u¬¯iT�1Õ¦~[ÔN	�Ó:á6È–lRO‡�ØŠÍØîB~Ó¼s /Àãz=àÊÁƒ�Ô#Mì° ‚Æ+?x]ÿƒßDï§…¼^ŽVUé³r„J	PyÔ
pDìi*©YVÝ`ÿE¼0zLbŸðz/Îa{°‡6žÃDµ�'¾ŽAl•ÑDY¶Ì}*›:¨‹:©‡¤-~»h£ßVÚNŽ3pàÀñØ„mØˆ­ØŒíp�ÆxÎFƒËµü9ŒlX‘À:‚¾ß=}úôWô?¸µº²ÃïUêev<:Ž"„À¶�„‰ ŽÀ¶#r’Cm�ÄÛ®5„£f»ÄÜ‰›­ø¼C(GµOûê˜0bÛ2Â^™”MlS� ƒ6ðÝ�V´‘¶Î˜1ãÚŽØ‚MØ†�èõçtn0H"²†CšÂæµ'¯Ó¶Û&Mš4=;;{Ë‡~Ø.â�ïDáÈÑ#rˆÊÎ£¯ßÙÁ@HŸÃG� ‹ˆƒýîà	­÷J ÏGlyàh§Ÿo�Ž:}Ñ©‡6Ñ6ÚH[i3mÇlÁ&lŒõ}¯‡HºTêEE"Â(á»ú|ß£�>ú«œœœz âqýGn§zý¬ÛöP9D§VØNUT9%á:€15Øœª8-6ù‡-³kÔIÝ´�¶Ð&Ú&ÐV×ãe¶`ÓŸ{¸ï…nñh@×ˆ 5LsåZ&µÉ¢Lˆ
ßÓªÙø	&<¹xñâ\]8±[¢Û¿ÿŠ}Á8ß@o™ìïƒc ŸåD†2)›:¨kâÄ‰OR7m -´‰¶ÑFÚÚ­Çðu°±Ïz/âù]"Â%Þ‰‘+©Ê¤Gè
™ëDö(Ï!®gz¥‹&&è�’~òÈ#�ÌY´hQÎòåËß_½zõ~�ËÕ;vìhÚµk×èêå?ìÝ»÷´óGÀgÝçø~#qÓcÖª9fÙ²eï«Œ\Ê¢LÊ¦ê¢Nê¦´…6Ñ6ÚH[]�—ØÒ÷J;*œçr›8ôzÖåN˜U–ý]+w­U®Ó6Ð+êFa´p§¯'OÒ¾è	šSFŒñàÈ‘#ÔçkÛýüÆ>ìË1K”E™”MÔE�ÔMhm¢m¶�nŒ?¯¯·gêå;‚.‚p¯·ö†‰oÓ•u_£éÖ	5Jâ^§—ëÔ{:À¨T`öåŽ¥Ê¢LÊ¦ê¢Nê¦¶-.Ì÷ëËì¿^g¸ ‹C\ì‰r)¡ØŠûæx¨ÅUôXN³
W× *à3Ûø�}Ø—c8–2(‹2)›:|Á©»Oô³ËÎž8º(!Ñœs€AIp‰Yp½›²øå÷‰þÍÉ@ÿnÎ.H·�;®_ßx~î8†ƒÔÁßÞ7Më{õ½ú^>¯ÿ¶¥²óø…    IEND®B`‚‰PNG

   IHDR         óÿa  IDATxÚu‘ÙOSQÆï“þ1<øê“‰šhÀy@A�Qh4âF‚\¨²-MºÐ…RJ¡‹ÐÅˆ¡I4„`B)P
ôÒRº\
©ØE›Ï9U!a’INf¾ßwÎÌáö‡CÈ}+äÌŽä¯ÐÄ÷|v’’�YÍF=î x¶9“MÈæIˆ!!‹›½6Ü¢Iæ@°oýÌ[„¬‰i÷ÀR*Æ³S±°ÄÓ°±LdP­·à´èÔÓ^Æ3`¦•þobŽ¥uÑ]Œn¥1.üÀÇÍŒ&3p%ÒDPÚ*‡e1ˆñd#Bý›»è'æœÌéÛÜÍ[×·pMkÆ©ÆVœzÖŠºÔ3¸i°£øEG¡Vò²wLCŠì€1ŒåŒá”¼7¼ƒ'®�¸EM{$óü**:Õ8OÙèùåBÅ¢6ô\×¢Á1
Æ#)9goû¡mÔš†Ñê™@ûØJž·C4öâ»xû#‰+$JtÍú!r�á¶Ù	Æô„w|œ>(¤ôüš'¾áÌ‹vœ}Ý	ÙÜZAPÙeÀº±‡O¢ZÙ‹öñi”6IÐôyº Àê)N»–HéV0øx$B­Á
7-Ñ@;©ì6á†ÑÎÄƒªî~\U¡[ %†X2Ä½š•ZÝ¸K^.V¡FÕÇZV^ qZê—µtB2ã‡+¼×Fš•83ñrš@L¬	DQÞ&ÃE±ªÅ0î›Þ¢øi�¸ƒq8é5'ˆ`'³*¹•rº—£`,§÷Ejÿf¾B¢ÆÚºz)‚+2šFÆqI¦ÅÉ‡"\¦¯oD¥Â€cu�qABºåh^ï�q,Ô‹™jqÿòžåA*8ù,K<Š7¡†æ¯wx �@µ´µ?"ãþÅ pˆžî¡ÿ¦?£kžÇ9©¬¹¥¯:pIÚ]¨ÿíÓ%!c»ÇDé[—)Bytyƒhp‚ht’Î<óëPøBy¦)À…Ê,"±Âô˜bÉÎŠ9^¬òÒÌûâ7’!«0­æB    IEND®B`‚‰PNG

   IHDR         àw=ø   bKGD ÿ ÿ ÿ ½§“  4IDATHÇ=•Û�ÝUÇ?kïß9Ó9gÎÌœé”éMì¤7 ½¨HQcxQ^Hˆj�Äøæ?`|À„‰WT4j£jB‰–›@‹¥ÐRí´´�)ÃLÛé\ÏÌ9ç·÷úú0-ûq=ì•µòý¬�üi>A5Âc†}»¹š—CYuÂöHøœÉ¿`ðáBDvÍHœ—Ù_RÖ3!'­E7÷wâ—~²*ÿê»¢ÑÍ|¹¿Àþ<±ÈµgE²àfÚ#ã‘hvÀzdf&	30Œì.�I,g³ƒ&\ØQÉƒçì×þ«Ò³®N©Pä¥Ž«°%=kâ!ezÜ•]"yÆÌ@�rF€ zLþ�¤g-Úƒ«æ:N
Em¤NR•¢oü2�²¬¯HTW}_)ýÀ0IJ†EA�D5b·�B Ç—,JH(¹ÌO-÷¯ZŸ•~Ø>?ê“-·ƒ—£aãëÊþÛ«‹P0'íÙ^8tˆ��î¹÷3,¦ŒË1Hpw™Ì,„ð ð;I±0³,Ø­œÂa„2gb DŒK³óœ›œbùÜyj½½ìÙ¿Ÿ�²L`FdrI–³�1¼iÆÛöÔ{Á~
|Ó ÄTc°VƒT’RIŒ­,.\gxp€ÿ¾s‚5ƒÜ´k7I0·´DX™¦Ä¬"égÉã·ì“­›Ýý0RÍÉÌê£'Þfzf†,QïëçÖÛn§ãÆ9wö<cï±mëÚ­E6¬ÛÀúmÛhu€®¦a)„p H)T3#g'ÖªŽ¼ø<m36n¾�zOEî2züïž£Ú×Çúë7Ñ,;¤ìôoÜÄÑão±Ðisýö�¤2(›¨%×'¤û„�+„¢`fzš™ù9|ú³Œ4Y˜œà•×Ž¢¢Ê®½è§^¯Q	ÆÔøîØyƒ�‡_|žÍ;vSº°`a…¿¯pi«!ÜDð1’R¢aôØQ^?~‚·îaÓ–-ô®ÌÜR›zc€©‹oÐnw)<Q—�2( Œ­òµ.° Ë9QkôÑ7ØäµW^æJ«Åþ»îf¨Ù$¥Ì«¯`ç¾�l%Ä9§Þ9Áº�×ã9#\W©·µ	äx’‘Sâ–Û=s†½·ÝÆðê!æ[‹„`,–™VÊ z{z83zŠ¹V‹Í7ÜH*Z!ÉQv‚KBHRöDa�cGßdÃÖ8rä0K'iÖûXZZæ£{÷±gï~º� ín‡J½Á-ûŠHö.äYr�4$?½B¢c!Ð^˜g©µÀÇöïcóŽ›ùÇ¡Cœ{ç-V÷V@ÙéÐM™ÜíPv»®f¤^£iN—#€£Óô´\xv/Š
ããcœ;{–×�fÓ–­|âS÷òîØ8ÿ|ææ/œ¥fbM³ŸÎÜkGÖ2ØSåé¿ý•§~ý¦¯`!àî¾ÒDOæö’`Á¥F0Óâò’]ºx‘÷ÞŸdwÎ,ÎÍ°kÇN.-.ñê±ãôÆ¬bva‘U½«ø÷‹Ï2zfÌµZÔ‡VË]‘À‚åð’ýòS`ú±ÐÃfV¦TV¦/_¤Ñ¤o Ÿ‰±qN½ñ_üÊ×˜^l13}‰ËãcÌÎÎÐÓ×O,
††‡©Vª4‡‡J bð
ß±'ÏLl÷œ	Ö™™•JÈ)áîEÁ^ú5sn?p'Áàåž£oÝz¶}d’CÄåä”]R0ãý@¼8i??509p?Îýj¤0‚™aÈ9ñæ‘W Û¥›ýkFØµgr­ÄQ`†ƒ†ÅÀ‚ƒˆPL“>”¡æ•ƒ
Õµÿ‘KÁ°$÷(ÜbˆÜqç]\žš"V*4‡†Heºv×d�È-Ø÷¬�.Çn¸<\×^Í‡ÖlôvI±8ßyL²€)¹
@†eÏÙS·Ôðu#4›”ÝÎ
��‘$T€¦Ìì�¥Åîcm¼ØpÝÉCØ/FÇ>�¾d—´ÝÄÃYþUÄàŠ~1IpUú×j³Áì÷XxÂà$ò`âéÀ“§ßçþ­k©›ñøÉ³ñJšÍ«c³ˆ„î–ôy3Û&i=B&;MàïžK”§®ä…4T4â#Û7ç–ÄÁ3“|cÛ:þ?¨gÒ¶²    IEND®B`‚‰PNG

   IHDR         \r¨f  ” IDATxÚì][ŒU×yîH&�8nepÀ‰›VJÒHQåF~èCå—D­±\+j]ãÇZ}ªäJ­\©/}ªÓJyµMS©¶lƒ‡aC©0�\‚cÀ5-8à2ÜæÜæ03gï}x÷ÿÖü?ßÞk�ËœÌÍkIŸþuÙçœ½Öú¿ÿ²öø…Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xn©ò‹‹B,±Är[‘û—æ�_îŽÁŸ�F"–Xn2Ñ�ùWºàW†ð»ú�hb‰eñe0ÑCb/|F°BðYÁjÁÝ‚{¿)X#¸OðEÅ:ÅzHƒ]£r�~öý®ÕúÝ+ô·–ø†¢—aˆF!–X† |¢/U®RbÞ²>ôÐC_Ù´iÓ<xpãÉ“'Ÿ�˜˜øçjµú/—/_mµZ{³,;våÊ•ÓW¯^�T>þøã©<Ï["¯ˆ¼"²%ýS“ë&?ÇgðY|¾ß‰ï>pàÀSø-ü¦‹{õ^Vë½-íe¢Aˆ%”ùždÿ¼’lÝ3Ï<ó{{÷îýó3gÎüC£Ñx]HúŽ�uRœÏBp“Åú‚¯Çoãp/¸'Üî÷ª÷üy…Þ!ƒX>�¤	¿R½é}�<òÈ×öíÛ·Q<ï÷ÅïâUEèÅ_O„Ÿ·º†êÌÌÌ~Ü;æ€¹hZñÌÑ7ÑÄòé"=Cäåê%×<úè£¿ûî»ï>]©Tþ-MÓÿ"]¡nHðEÌE"…ã˜æøØc�}sÖ¹/·õˆÆ –OéWÀË/[¶lÝ«¯¾ú�³gÏþ£xøÿ’túîŽæŠ9ôÑGÏmÞ¼ùÛX�|VDcËíOü0¼_n¤{ôâÅ‹›$L>/p„€´ºI ï8qc®'®ûïw:�óX¬Mh˜&DCËíäí—iˆûEñrtþüùç%Æ	û ‚Ü‚?¾øûÌÆ`k%ÑÑã0Q×pYŒ
b¹e½½Gü•‚{‘ÓðÁŸ$Éñ˜/aˆÅúúßqÝîk‡5Ü°aÃ7°¦XÛ¢!ˆQA,7?Ìç‹8«ë%Œý“Z­6"ŠÜºÎ„�w4ÉºÊ;XK¬éèèèã¬²‘bzËÍ&þj_ž�?%�¾‘ !llx‚Ÿî\ÉÏµÚùÉV'?2ÓÉ:ÝÎr¹“ïìivòRß%òß§DNAZ�òM½v·`Ÿà@3ËOwò£‚ÿ�mçç“NÞl÷¾¿Ozþ³³³‡vïÞýÖkA,7ƒøK‘›Ê�ÕýòfÜÓr¢}lhC¾švòSBôw…�û/a…´;o4Ú© Ñvc^³³/xíNHÀúø�€´ÛòÛm¹‡¹{ù0éàÞ>ñù›Äš¿ýöÛOË¬×s‚¥ÑÄr#ˆ·”>üW’£žBá‡FK<íñèïÑßšâÕÛùv!Þ¸q„‡l@ª HXÖ};›È©¶ mÏ  ®²�º^¤‡qÃ”Êº»Gw¯ïLÏÝ{ÒzþCˆ4MO`/°'Ø›hbYTéCü/¬_¿þ+ï½÷ÞßˆÒýüz)°I |” |Ï.¤áë&Ð×F]¤‘Pˆ˜1`HL# 4”ì2æ¼<$„^¯mz¤ŸøÝf| a˜€qHg´¯Ž¹ÌÍéÿÌ±ëüìÉÑ£Gÿ{„½êf¢ˆe¯ÏÃ½»îºëËÇ�V<þ9([»Ýv@]åÐ°ÏN‹—?.ùú�§2Gî1%��_�)‰ A(z\#Û0$)ÆXÇ¸zñfÌ0X]eÓÕ½”¢L~Â“Ýc÷¡óÈ¤_çƒþZ–ï•¹bÎ—3®¡·ž¬‡ãƒÁ¹÷ßÿïV®\ù¥âaaŒb6ÜÿuÁ}¯¼òÊ9x::H!ýñKEžlµ¶!Æœ·WiÞT	…~�IÛJ6Gtí'1IþRÞÎóŽñ/¼§��vÑ h˜Oò·»{ÿ:É¯FÀ<¥o›Ã×l»µH‡4žƒöCd�½ôÒK°‡ØË˜Ä2ßp™à7üñoÊÛi/‰2]%‰ûa°A8+Š~°™ÁªGì@Ž4èc
 XhÒÆAþ:ÉÈ°\Û¬«—o«‡g¾Ï1@û,rð#ýü¸ýN=ˆ ìKF }Œdh0ÿm²ÛðY‘?ifn�®×zcï°‡ØKì)ö6¦±ô÷q²äÈ‘¿Î²¬J¥è�z¢š¶óŸMKž’F¡ðí«�ôž@¿Èyw!	 ý@zõ¶¢ãŸð0Ï‹vú‘ $=¼Á¾Ÿ‘ ¤’Ýr} ×ÐûC–ç²@Û_ÔUb­°fµ¬'Á‡ö{Š½�iA,=ÃýçŸþ;ò`üJ³XœMÚù	ñGU±Œô"=�(ŒH"‹H4FLŠ9º†ï½ÀsÔUò©AÂs\‰_0 j„Šž~ÌÐ(7�šÎ×7ˆ€®ÕVÁž)·–Fd“¬«œ°·/¾øâ·e¯×bÏc4½><ÁÝ?üð7ä¯ò6u¤xžÃ¤‡Þ
xf6ËÔH…øQK�ü&A H¯ž‰o`øldŒ@1
ÈÔS»¨ÁOOî×ëmÊzï�:¯áÉ?¡¿ÍÐß7L™EÝ# Ôpm0Vì³~ÁîF*kËu^¨AÀc¯±çØû|z½þgàõ·lÙòÝV«u®¿V¸…øoÖç<þÖj
iJ†ý@yL	!õ0
0Ú #=a‚ôÜ?"è~ ÈëÌëÓ X×È.m­×Ôû×èýÑÏyô	ÿÙG ­ØZÏÞwj6	?¤ÁÆì=t º£�;´ôðú+—.]ú¥'N<�@%ÿ3“å»êi¾Õ)mRÉïÉj*°>ß 
F ¡p¤‚ ¸¶!+’Pá{ëlŽÈðê¨ÓÃÅG‡êÙõ³"­`èïêÞÁŸæÿž÷gÝÍÏê3 UÌ_×«šrÝ,p}Xg k.k?Ý•àÃDè t:aÑ@4wXÈï½ÐsÏO<ñûõz}ïâˆŸÊSP@y�ºk{À)5Iî Gp%„åÅÁFF<ÂHXJ ™Aš G—6¤¶‹Q®5Y6 ÅC>´™’¨dîOòs.ÌõÑOòsœ0`é `u¹nD×{€½XÌ^Bž|òÉ¡ÅˆbJpg…ü¿&X'›ÿ§ò_X¨²L¶ä`ª1§|#sžIà¤öA¢oL	L¹-"PÅ÷Ó %Œ’G€>HkgnÓûó°d5#�º÷ì¾Hð¶ö—…¶µŸ�÷´Íß,=’D¿»7»ï6ë%{1ü7�ü�üº†®�ëÊuwHÑïÖw{³pC �€n@G +1%¸óBþäoËÿIÂ¾+išæ!œò˜ÐnŠÒUDéæù�ìôP)CÖkg*éñEjÞË> #	©mMøÚ-£€º‘ÔˆM¼q�àJvH’c4*Itø‚Ðq¦)œÃ X‹m�ô Ú^øßïÏõGÛõ©ÁÍvßÏb_W@7$%øžèÊ—cJpÛ“Ÿ!ÿÆ�¿U«ÕöõÚøAáÃé4ßQ‡çXøYuÞG•Q¢[_-Td`›«ô|¡°:$ÏÂ(ÀÎ¼h aõv ô¿¡ã…P¾˜20ŸWò�1ÐÏu‚ß·ŸÞ?õÙfÔcë ÒÁ"'À+ÖTëåõÑöëAÕ]‡{V&ü€®@g,%ˆFàöÍ÷×¾üòËß•Wy/bc‡EUBÊ=õD+éUBÙDÚ8â3*p ¼aH=,� @oLRóÑ¡‚ÞÞ‡õ“ø
æô$>_îágì^”øÁc¿š«sNœ¯y~ ®•“ôþ\ÓŸüf”ÑÖqjÈ·ê‰ÛÃ…ì=tºŠç·ùùßd­Ûµk×_Èf&Q€£Í‚g!ùMj$@¥¼s Oy-@¿#�€÷˜Ð?(£q x.p-ô	€tfÜçR�’oç�®€cvŠOÒ“üz½ïùz}+|öñþ Ö¤Z2˜€‘]QŒ¼˜ÿ;ã\1ã,r2É·Ð‡½\ˆ$R CÐ%Õ©%ÑÜÚ‡}Kô çþC‡áÏv;º‘]�1“VoˆÇøQ­HzHõ2$?#  –¢˜’RæñÌ( �)€†º©y=}SŽ3�ü”ŠòKCE¤J^|>µ<èQ§d½Ð®©äo£¯hlô¾SEðRÚ*ºÌó³9`-¬·ÈQKLò äWÀHÍ°¥šˆÄž&y}vàþ›,öw KÐ)Õ­%ñpðÖ%ÿrþt÷¹²§œžnåã¦PU=ÊÉ]¢
Å-y|ï„šýÞY@ðøËˆÁG�|ü§„2r)Ñ¬×Ð@Ž«ô„¾dÆÕd¬ =ÐãÓ((Ùi”Âœ?|äg`¿y~�†Ô (¶–¼?ƒF]	ÚŒÊl¿*�Ü»-"±/˜ã™™á€Ièt:�À­yÒ—œÞþ–üu?À¦‹ÃS	½†Ê T0HÀ�pŠjù*½£ÈÔ dÈ,DÌcÒPT³~é Éè¿‰Ô÷ða›×ù‡Œ$?È,’¿AÅûm—Ò>âs’mz%=úmÝ2/ççºÒ6®Wòƒô ú]R÷{½9}úô cÐµø„àÖ:éÿìÚµk¿zîÜ¹íÃn*ÂÂV*L-+ô“ð0%`€¶E	$}Í)³)}Ù»‘Ýžøi rdH#!‰¨°q†é©HÏk“¸Ý#Ò.~Wx@D/ïŒ–J›�I@Ç·kÀ:û!-%°‹)ƒyÛFkÜŸb@Ã€=o1%òŒA× sñ	Á­AþÕ>øà7«Õê�[­–Û$H«›üñÓÓI>
òS1@|HËý�ôèƒb¡˜Âé8�ôúJvVQÁ™ïk<.$h@xKeñ…!€i�“!,M §'émœÒõñÛ|·m»€QŠßæ3ïoóŒìº^ìSCJÂë:z)@�üŒ°‡¶7ÜWkÛ^j¤qúrwýÁ±J¥²:Ý‹Fàæ’ÿsòp|«Ñhé¶�…¾ ?k•#u ¢¤„]3™X¨ÉH€ÞÞI"ãA!Ú�‹èõH|¯¾Ò?I§`ÝóêŒÂ1ÔIòÌ€6¡mï»<sPƒ¤Àî©˜ºÐÈqnž—ðñ^ÆÐŸ�Yƒ'.ÖhŒµ>IO¯ÆÀ";«s¯µ]èCxÈ Ð9èt0�›CþU°ÂõzýÈü<>q@6|s aŠDoF%ïo 6nðó^�$
öñàÐˆE0Ï¦gÖº’Ù#0ûÞÆ<�ïÝ%Ÿ^øy>Yâ³m'ÿ4†€ý�Š¤pP›1ÔGŸ·�Œ Ðg P#0 {	¬ŠFàÆ’åš5k¾>99¹o˜›ìù•Ø›'Õh¾O…R ¯o¨šHÃT€O	
©Án/=`*à¿£ÄÊ ‹a7ë�a˜Î6	O²+üq“¼ ñ	mó°Ò÷öÝ_ž"ùi Hv•|ÑÇí¡í/jëb <èÞO¨§N7f“átPtñkÐÉhnùW,Y²äw&&&¶Ëà�­›Ã1È©™ÙüÍjb¤çÆû§Åa›ä·6�€_ëNYM!yH¨0# ›¢Ó(H’‰@_HFÂËÅUu‚íuÏÛà“
5Tš¶ÈüC#àÍ±;ùu­ØOï_B7òkšVDqý”�z€¶9èHsv¸H ‡ÏÐIèf4Ÿ,ù—~ûÔ©SÿjäVÙ5ÙÐrêûÚ¥–Ûè×h hœGGTÐ‚r@:„Š•zi€‚g„^ëÈoc )…š|#ÀÈ ¤™z\>!èÙ#­‚ã*{“>óeÙ„9¿Õ�äüTÒ(jš”ð:Œ“Œ°ôÌ¥‡÷'ÑYwû9×vû™po�¤@€Žì]©NÏB·ˆPßJ}ÐIè&t4�ëA~ |Ãï�cÇŽ}¯ËôÄ…Ë³ùXÅm¬ƒÛd(€ü1På°C¿–ÀêI·°RÁ1 #½«Cšâ• 	˜Ì›ËQ€J�Æ à8àÚýÐÓ€ŒòP¯Ðg¿ƒzBâw—’Þs®™�D[×Âóþh‡žŸëò33Ø^A4ä[LªQ(E�E# :�¹8Ý5¢ìi ›ÐQÿ�ÁøÚð�¥Ç»ý÷ïß¿ÿY’{0&š³ù6æú�¦¦j�ôþJr­SY‚÷èu0ÿ�‡¨Ü~ÈËH€^PP
�-´¾66×&� ýˆ�y$'±Yççµî½Ú›†é‰›O”ï—s*„ý€—
I�†QdÎg_˜ã“üvÎãÈ/ Q@zàœ„9Ü»ÔÏ6¡KótºZüÛ�,žüëÆÇÇÿR¬lgò�TtSÝ'¨›T£�ª'ÀxÁCPq˜`uŽÙëÁ¥'Œ˜@™ý¿!ÀµÀÆùê°O"�Þ�Ä¡DUI¸6ÉFôÚv-Ç-
HŒøðäüMÔ9®ÄVC@c¦ÑÉÎH¤Ár~ž¡èÚðñÉÏµ/çù-ÖÕ°‹¤ñ¯¦n¯úcLuBõâUKñ›2>1„€ŽBW¡³Ñ,žüË÷¾ðÂOÈâ&333n‘!Cpìâô,Èb©dH~à5%øk
G[¡i@Ñð<€uHmCIµ/TVô3Ÿ…â“*é	ItôÓû+Á´mu°ñ„Äs{æÿEcQŽ"Ø¦Ç'áÃß÷tœóÓùò, <®ä7Ð`Òˆr=yˆg{ÂT�©[ÑáZzw5ø*-E¤.°�µmågf‹:ÆºJÉ¦M›þºŽF`a‡~X¸ÏÉÿêòòï¹_$Ñûc²9#¯¾º…€$éƒÍE?�6½†‚}€*™ïuR?(?ú£W³¨ !ª4 
’»¦õ*ë|j ™Ö�ARC¢/�3¹u�¥&ùû|¦ÏûbÈÏ°ß#?×‰ë„þÁ!ý”+í~ÊOcÀÜŸãêýÕhÛ¼¿“®ceÇ°½š8Ýš¯Bg¡»Ðaèr<\À‰¿<Zùê¥K—öÏwÑ§¦gò“B|l �€k[$pIÉ¬J ¹ 7œá¿�ñ0Ðz@åâÙ€—JtSv?¨ÒËè£Ç„ÎHHŽûÀ˜’r¼žæ;;j¨ówô¼Ïwõöåû½:ú}ÏOâ«±äk¿ECH#É¼ŸÆ–ä¸Ü›`ïèõ+ŽiÓCÈ$�@§ [Ð±y�.ü't8>˜— ùíÄ_þ;§ï÷[àééék²)ø�ê,6Œy¾ züÐâáy(hä°ÿuH‡„’9§§ -/Oåi·z:JõrTüHá¤k+‰Â°:ôÈ£!hÔ‹íi¤ùÁf;?ÔÌJ@ß[2†kFItz~~«ñy‰^‡>óø
HH[ïðÅž°n{òºJ" ;CÿJb§þ„’_$#D'©CÿÏÞ™ßU\wþ»*å™8™q2®Ô8ãqfj6�=å$Ž—©šrÂfððx·1N)Ûox`-;Bû¾ƒ6´#	d³oB „�ôÛý6Éq�ãºs¾­søÜÛýžÊÌ„ÍþU}ëôëîûÞ½Ýç{–î~ï·®ÿX5:ùÑOíLeg #ðð«ýÞ2cÆŒs,—ú‡6„/°ÉÈ¿@„ï1ÙÛôüªÃDØ8F*�Ê„‚Q;À@úÆt3[Á\Ñ1ãmMoßl/×0Qw�ýèîÑÿ]íÙõ¯ÈôTóžx®š÷ä~•Í X»C}³ë1&£¤z7�ß‘E‚§FBC9	ùö+õD`ÌEDi½îýƒÔ�¸™îùÂ`šÿÔ.iP�ë�]C�Ú’Ž™®�ë�¢,üƒtY:ý›EÁ_E~òþß;óÌ3?022ÒÁ`°wŠð
Ó„úä%BûäañQ†ãd_‚^¢¾uØÒàqX3àÄ ·÷ÒWXJ„ë îùí=ƒL*¡ »@N�$hwëðqâ¯;<P]°|Cuæ¤›ªÓ.ŸÚÀ™“oR›úÈPèš¸¾u˜Ÿ—Ceµç¤÷{·²Kƒ?£_ Zb!Uãrû˜’j±;Sìù;˜SÒ/f»C’8RÕI—$wƒôí€¤Öº¥ÓÒíXø�h½è§c¾ï°ï\og Û°ðÀÀQóðÇ'f~šÏbdÝS»a‘ :$‘ Dw�"‹� �ˆ0jÇ8œô’l±> �‚TN87A¾D&È„Ý`ù½}õ¦]Õ'\[�vÙ”êTƒ¤ ò‡N¿bZuõæût�®ÅÛóþòÞe¸O¨ŸÞËjÇx¨C�í÷ÇXA~¨Ê¤b^†Ð*7æ	ò\˜ï„(;éx¹H·Tö´Rç�¡Ÿ�£Ÿ@:-Ý–ŽÿfQ°}Þÿ~øáÉ>hãbÿÐØñÉèÑÉBG¨¦:“B
í ½çýX|Õ•©@}‹å"¤,�@¾F�å© ÿÒÊÏœ"C"¹KÁ	CÂ•9·Ã°Âêï7"Ùºš·Ÿ‚ô2è]»‚Ï…ø|^ÝÓÜo±ÒŠœŸhÉ=ä'½Ê×l„û!¿úõF´óiè' %Ä1$ xý„c‚—�tðDõUºm:þ~³Ð:ïÿCû÷Üç˜ýÅ‰æÀèQSvóú²Ê�^A‘ ¯ÑÃ(°%ÈDƒé£.ÈŽBIÉØEÈ¼F °ˆa-ˆ´Aí.£ŠÀÃz9É“ôŒäÍåñy@]	»ö~ûYt3T¼7Ÿ	ñISüþ1fApÊnôžŸœ=ÊDP¤ìÌä«ý�˜'Ò="»lÛ/¼¿$�Þ$éea>º:”ä|ƒtp`ìÅP?$e—‚t[:.]oµðëúÿîûÞ÷¾÷Û÷«»4`m°Q·¾Ì&Ç'¢û˜Ê	‰ü}.­��_ÀÚ³åãž€v�‘/‘øv‘•C‰Z?d¯�H	ˆ2R4ˆ¤z<ªKoÃãfÀã®9Ü_}ÈBúÓZþŒ+§UŸ¿u^uömóTö(@íÈ3ìÚµ±oÏZC|	Ç”î‡-MÂ}@ÈÏ³&röc9ÑŒ¼¨##:ã@�]/™ÝË„û*ã$‚ø.�ä_[
‡#�SYQçº~tÓe;è‡Dº¤ëÒù_ÏT ýÿ™Bû·]3Ç³ �ŸÕà™…†øD’�<RI,:Vi€e@¡„l•Ò£¨¬HbÂË±�ˆa r«�5‚�DöÑ1@L…î­¼§ðð*Ÿ¿bcµ°ûè‹k»ÆªoY�Úr\hï±’Å¼fŠ’Ë0b�œH ¢ o'*Âp‚ho{¸GoÏ|ø1ßà„wCÐé{Ðêb]IÝr½r$£`:™G í±gÏž™Òyé~ž
ü:†þpÙe—}ÜîR{ìÓäB~¤Âãõ	ý	íR„<¤ÎàÊš¤CýQÊc®¤’æ!°âÍ6˜·IBêlM Ä‹²ä]v*ïc“o.À7—m¨™C9’ß\±ÁûM–L8ËvîJ†'ïAÜû÷xz¤Às¶Íù+Æ¯)iƒü>?öãý3¯_ƒ{t½éb=2’Na ¨«“ßq4éæ‰è°t]:/Ýo•
üº­ú¿ÓNû=x"×?:V-±�žg˜¯Á�	ˆ�¬U`}Ã@àý�j¢=ìÃ8°ÒK›)eÁ0^ã� xÇZÖ-qÅ·÷‡4D
†°_h¦¤ÞAg?×]�úãÉ‰ü!OŸp­yûQõa=Aeßù�#êãFÜõB¯~OÁú×S“Ò%‰Áâþ‰nÜëÃ h,¼.½ör6~U/CòD|^gägnEtI ¾ED(Ýê•>™´2F@}!ý<ƒd]—õè(z{ýµ­í�:%øàë_ÿúÿÖnWà×%ôÛ¦M›~¨¤rÀ„õ}x{<~L–˜\MeM¤#HN*�€W Œ’ 	+kg²º<Œ%—Í½Ø±¼=óˆ…Å;ŠUwÁS†Û/â'oò‹·Ì®–y_Âw ¶/Þ<[ýXðÔóÕývŽ`ë°Îd†ÈËÜG´ðø<"(c`’\¾&<~HŒn¹è§ùŒ¹bnƒÜÌ?í=YÞÃõ¦áPDvÕIº®IÎs©ë6Ø³´Öç7n¼Hh�
¼öCÿ7�|òÉ°E‘Á’ðå >80†åíö(À ²O„¿>d/B6Ò�Z
à%ð:/ƒZT�ç‘"³Ø„òfe?‘›ÁA>Œ$4N×@¬^'ƒÕa4$¯üyyòDà�gß83^šEa8´â¯>5>>å–jÆÃ{’ØiXéÛ�…·zYÄãþ0n<k›œŸ1€qf®4Ž�Ùë"5X ²TÐô'•I]§Ô]2é¨E•Y
0O°k+ô€áááAq@\x-§xBY¼·ïÛ·oa{�º†Fl2|€ë–·ˆÊœ-^cÙS_îõx PÀª3FÁ£�æV–”�fŸå„ jÏ<"§á §»xf•gìï-<ù�Ø[ûF«M:àÃþ»ÊªS›úd×MzQ~}îòjsïˆŽ[J@d 2÷íuB¯?!@ããÄâ*S¶5Ëøg9Œ?D¯…L|þ©ëV½—I']&gá‹T@åŸ™Pÿ£ÒYt¸ î™gžY(.8'~ëµàý9ðó–I“&}Îá—n	¼\Ô¦>YVàQ€Ê&UÆ
7;Í]ƒ˜d&ÝÑÛT”„m¤bJF¢€¡„DMDDÀ‘W†¯�rY›¿Æó“64^Ÿ¥E@Hœð½%käÉv*LªÍûµÅ'¯½­Zñ\§úË¤{€ôqÿäñD@vFx~!Æ,Nk2®ÜQß,”N~æ‘m=/ žû§2k N|µ“t;é½¿ˆ¯r`cßX{òÈürâÄ‰ŸÓop@ˆ(àµ¶ð§0ç�oxÃþ¸§§ç‰V’„§Gœô
Å|ÐM “Q@?êyÝëeù°ö^Æ�+–¤DR@¢�Ph¼ÞßÊ�£€T¨_ŒD ¶ÔH	Å¿µ|cÃƒ§\:©úîâ»ª-æÉïwòoé±º»Õo|ØõºršR�~Ž§'„Ïùx=§Éðø<³¿Î‚�Y¾-ñ]¶Yô£Ü‹÷ºDÈýU/I
`ðßœÃaz¥—ô¤»Òãñœ¸ NˆâH¾ øZ[øû£Í›7_ÆÀ´ A+/Wèß‹u-!RCv�‡l�<Õ‡R¨#àÄW¿l} óö¬!H™ÕÖôR„£Aì†ì…c$œ0€þ*ã]‰
 !©ÇÌúí0Ïµ…He“Ÿ½nFõ¹ëg¨Oí!OsÂ§º€×)U¸ã¡§ª]¶0¸²?>/á…,"êIhæû„úµqÈÆ´÷üª/öõÍmÔåy¿�H�èQh¯Wx" �vÆ’Ÿ Ä	q£Õ‚àkiáïwÞüæ7¿g`` ëDå¾>óþ6ˆs»ÇXHíeê@ö�Ô©Ý'�0¯e8˜�#
(Nö <R¥-==„P¯2€ø N6Æ@`7á’Í?�:G^~ïÃÕ5»Ÿ¬>:ñ®ÇH¸Øcƒ¶(˜Ý#÷.@x†øŽÊQ•%ëe"-�“I¤/py¹™gúàúÉ‘èSú«}ÞÿþþÑ2 â„¸!Ž¼Ë…?¶ý.=‘éÐÂ_—ˆoÉ}€AÓŽÅnÁ˜àbŒB&8@�Ê¡í¶‹P¼¢žð5ËY)Q u´…Ä`°hÖ.5@FÎèäŸ=>ˆ¾½jÓ‹ûó3ôUŸ¿i6ÆCÒqº^¸çùjû�ÖZx|¤PŸ6�–Š|?÷ømr~¶ñT–ôHN ì‡üîá“n¸®>ÿN`à¯C×ÊÜèý\ïtÊRº|":/nˆ#­_Þÿ�o|ãŸ™¥{Á¶þ* 4!×÷Œ˜çgk¥=òIaÒZnbC i„Ži—¢I
ª™AŠ+é^,½g”# ¬ÏbõÁkBŒ€£uª€d«í’-?U:�E %¡ÕgÂŽ‡ý:>w~çhõ×3%Ô®;óêéÕ:ûÞÁ=ƒ?Ï¼¼Æþ$éWÆÈ	‹1 ï_ áAž®1wNþlnõ�Á ¥.AøˆF»\â˜@m[pŽõ[ß;Šn»@Ü0Ž´�^õÞß~.ù‚„r@(?Õ?â<¦L9×¤ƒ!WªSÙÛYÀjµ…LïŸ¢�…¤R$È�äeÒ	BÓ¤è.sTFæÀx]F$¹5©Aif½0P�¿rcuÖ”›�¸×"±d:6üýµÛ«;ôiFHEdçÎZrüÚK¿ÞäìüÀö�cÕ*}i*H¯k‡ lûé¹UÑÛçûAÜ<âò2dÆûCv¼š{ˆßå: ô"¨§—Nü.IÈ/ÔCÿ¹	ºÖ¤p\ÇLŽ&�FçÛë¿8òêŽJïÿY4;öø§väw_û Ë»G�ÌBÊÿ%�¬X`IÁÃþˆ Ô—´€É+r84ÙN\¢¼ §,V�ñ.´7ÖX½Î³@þŒB"Pá1!vcP–é‰ëPX?ýÉÕ�{^¨ævñE7µ!‰4ø\>û–9¬+È¸¼Ð¾Kpï‘¿çÚVG~ñô!lÕù1¶›]æ�Ý!À<ã$DzRÀ1¯}¡ƒ(à˜ÐpJ±¦º0 Þ¾¢gl< hG`Ÿ¸"Îˆ;yðjõþÿvÁ‚ßáAÛã‰þaTG*Î×ÜË’‘D�ÄÇ*'°uèùŸGÝeŠ�d]¡GùœØä˜l3y{=<%ÇK-ìƒø‹Ã(XÒkÚÜ€�J¡ýöb”!#})—×'xŸÙ‡†ª�O½Mž_ÄGf?ö¬¥)•14‰½¨õóSg(Ò€:Á‹Œ9JãÁ–/¡½C É%êÒ<g$�_D xtÍAè/½“#›ãÎLº}"X´hÑ·Å™WaPzßÛüûòÃ“ã<¸þßzµ²kÔImè´�ó²T#ˆ|?Yä˜B6I ¾êÓL	Ô?Cà!e¦@(¢ ±”S¤ÃSä&]H} :ïU‹�‹ÖÑ8Y'I]{AŸV×#IInÞsH_ª§¥7¥Ó‚Ë0d¤&~¿mž_(�'á»�EaŸS~B‘Ã—s�ñp�@G 5ý½ì:EúéQgž¹º”!XÕ3:žþKêçÃž4Îü©s§ˆ^mÞÿßÜqÇ_ÓÃe¨?´çþÃ¨„˜Â««<ˆzßÊ©Žz'4)@ªÉÂ!Ñ^Ÿ•`rÆÌ8¨�r&/F{CYQØxÃŒØäÐÑFšà×"!©¤÷…ì�Ye€¡ðþY¯×™1ºtë"}ý¸èK¼?QhûÜÜ/ý x¾ØÇ<e¼�E^¼¿ÿz É¤´QßÐ«zD€crýl�>úÍ‘33HÇ[èqFÜi¼šVþ[ÞÿÐ¡C•LYRXÝ=¢AÓ@1pz-t«ìƒåöþGY$T}BL°0¼i�&@ö<øvYÃ õ‹6ÀN ž//D¡­LX€”‹”uu —…¡ÂgF¥M"œ;sIa N³ˆ`¹^‹‡ôw2»$/QÏJ=Rh\¶l1Ê™ÏŒ<sóN!�u#ÁIêm´÷àýCoYÃ2©>’†Õ†ú_@œwœCÅŽÀ«åÔß[¦L™ò%¬=ž"_²…¦9àä÷2“ƒUá!·O“‡ŠFÕ‡íÃTN`¢¤&Q>oÃb @qA�ïŽ©ìRÇd!IÚ jk@lÊÔ��âf<×W�1ajuò�®d ’<ï¶ùÕV‹šŸE¿Úócb,ºÇÊ£Ú9¹ñðªCrÈ‹~>§®Åvz!ŒºôHTí!sïßÐMÏû1 x~Ç¯—®ŸHD,îˆC¯ŠÓ�œùoxÿwìÝ»wõ‰€5=5Â'òû æ1 ²O© O*Àµ>áÈÖùF€ð# °pÄš�7Þ¤ð…"G¿qSƒc3ï<- <Å:$oo(èËõ”ù¤áâM»Ãû7ŒÀ>¥(€€ð½Ê]ˆ/``Éé�®c¿Lïðü�Rr’"ºl…¹®#&¹¦ÛÛÐG‹�w[¤{"œ°ŸÉ[mú¯õ(€ï¼RÃ¼ÿ›ÞûÞ÷ž<88ø÷†JÐC¹l`_ÿP�à#�H2rw»UuòGº0OÒÀ�‡ÿ*Çäbñu�Ú;Q»#@‹J*£tä“RbEÞ_åPà¥¦°«ôS]vn~�‘bÝÀÏÒjùFÃ&ƒÊ¬n½Iµ­±=õ»û�U+{íÚ^70ŒAw"í"©×	‹!j½\®ãzÊ|F’Ajžÿ“×ÝQ�’Èopyöô;h<â@NÂbÃZ=«AÏº¶ßžÕÆeµ�Ë²^}æQ"W'¾d¶Êä®Ï© Ú©#ïÇ9�2:�ýu'etM2¢Q/K’¾šLzš0·C:ÍZ€ÊÒùñ€¸óîw¿ûdq‰(€4à•þËRýsÃ¿¿çž{&Šðã€u=¨!ÖRõEd@$@Ð*$S[DXn¼B3äSªíô!‰—�üx%õK^yµ)òzSì-öÏ7w	vÚQÙ]C?—4Hz� r	}ÑÆÀ5ÛMn¶÷Ú`Fb¥‘¥H� ÷êì0@rê[²ƒ¬ÏÕ»Ÿ4¯?Qž©(à¡§«6�¬ÚÞö¹#�'Ø<h†ÐÆp¹î�(¬ôúŽFTÀª~Ì�ÏµKo£]ÀË‡‘p¢‡.u£{èb €¡#tx„õ,×aé|Ix8eqH\§œ[¤¯àïûÿŽá=���{1 ­qxàH˜9äýäKa=%;Ëô ã@›GŽ°âaðìDj3˜l„ÿ]™ue)Aä”’Ž•}Ç½ùS`AŠ,òo?b„}®«ºùþÇªÉ[vWW¬Û®_ìM_ÁýÚœeÕWf.²ÛXV}gÑj;L³¾ºäîÍÕëï­¦nûI5óá½Õªç»uÊÎ	yî–°ûÉ± YþæA–ªPWï›_á—õ÷ÖÍsßëÏ¦ûPŸ³o™+ïßÀ,
P”“¢ Ã]FèµûªK×l©¾¿tMõ£Õ«	ë¶U×l¹¿ºñ¾Gì{ª�]CÕÎÃ#’?Oån|¼F:r~"¹�¬„Á?épBÝÓ»ô:<?9¾ëpÔ¹n‰øÉû›T•S»ä¨t¿/0 â�¸ÄÁ ,
xnýÉRýëK/½ô;ÛœD2Ê!÷÷U³Ó€Ä@™Av!KÈ©ÈÁ »07•yÍ£K”Á¤Åñ}_—„�Dž¿ë?Æî0OÄßÐu¤š¶ãÁêûKÖèˆ¬}kn’{ÅÒCž‚Ô¨î’‰öÓ\7UsûüêK×V3Ý+Oêx//¢I’2 [ ê2�B(4Wz"²7�Ð0^|……©?{ü~/nÞûœÇ÷UKâsì+Ê½êºqŸÿ#ö�„sí\fÆA×oí?ZítC°ÍŒÂš¥ž˜Ì<?†Yu�Qv‚'²CüB'Xð‹5(ŽôŽ(µîõ1�Ôç¡¿t=úÝ×3$ŒqIœ·^y[‚åÖßoè¡‡fçÒÂ èØoXD¡iY}ÀT7»Cý¨Oý›Q ‹†.}ò0,(Æ	¯Â#¨m>“Š—'œŒ‚ä	·ËC6öŒT7ìz¸úÊ�‹ì`
Ú”"«ãZÉk¶î–gu$ò;±‘ª)¤PÂ«®!Õw©É5ölF4Ât'üÊý])2ùÚì¥Õ_N¼¾:ëšéÕ»…êºö³fðâþê»ÖÛ´y÷ÿÕó0ý$Ù2û!’§eˆÜØšŠ'"´šÇ>§*Ç¼KÖçýhx~¢Hœ�ë‘§IÚ!<º˜¤;5ï/Qn`¹ÕãÛC\§Ä­|Kð•¸ø÷»v–ù½vî¿k¼àÙ¾A#8ƒ2;aÄÈnèŒÐ_e�:RXß´¼Ý>>¡äp¼êH04îù‘”Õ.àMØ!HÞl›…µ"Å†Î#Õ¶ðÒIò|ÿHˆ(HÊ´ãQ£Œüøä[ä}‘í¨Ê[j&Õ}0Avïg¯µ÷¿Æ¼ü–ô\xù5‡ú’a;ÁªêcWOyõÙ’�ò�<“Þ÷Ê]�Ïxªµßu°Oi„~càÿùùÏ¼ú†êŠ÷V[úF“!Øl÷½-àùs#Ï\×Û:ñØBsÊO2tï¡Ft¤Á£ÝÐwã üh}? Ë8õq«Õbà+mñï-W\qÅyåƒ”`[ÏPfG€­¬÷H€(€É¢<ÏežrÈðð1ùÙkÐXV˜Ëmí;Z]µa‡ýë­©((Àc#Oœà-ÛK|âºÛ¥øžû&PvoÞ¾°ÚžC‹uÒkÍáòµÛªO_{ë	ßßëï�Ý}³°xþKm]#ýºSÇˆ~[àÿËóËL±hd{JO,‰cÞÉ£Cú’ü¤	œ=q¢£/ ÝB¦r�*ÏŸëDÏtW×ù#2Úñ£Q7aÂ„sÅ­WÔb`›sÿo·ÿ‚:o<«Ög˜¯Ey‘¬â°Ø°ê1*],3–˜Éãan ºØúËÏH
lE(ˆT.¬pÁž¦äÓ3…\…¬•?råuÕÙ7Ï­¾fß»{[uÑ=»Òwô'ì|´š¸û‰jâ}�W—m{°úáÆûª¬Ùn?È±±úÛ…wÙ5óª¿´0;ëªûwo^œs
Èˆ–ÖØ³Y(íÄ_{¸?ý#Ñ/Üp'ŸÕ†€€¶)í}Ñ°üÝÚ{‹ç?Ë~Uh]ŸoËÚœOz`�¥?©.X·£úî][ªo,]_}éÎ%Õ'¦ÝV�þã)¼ÿ	ŒïošUÝ}°7-J®�‘�ÌA|à‹}’‡v€4òCl�RTtt6×[ý°×»n{”ëÎl�µ÷Á‹¶§üL@ñý€—;ü}=üÝë^÷ß{ì¯¿¿?Ý¸ËOôQ¨/øàŒ
>@¦Ú}"H0l±¸1Á
ûÄqF€þz�EÃ‚QÐ5™÷�§”‚Ýò“ÇS>z’)Ÿ tÙÀ™×ÜhJ½®šôàÓöÝ}‚³Ý$t•X�äh’sU7=uP¤O†â–½)ŒOíqþ@èù?�ÞdÞ2v'6u§ÅÊsoÕê}I0 NB
éŸ�^´a;ö93žï«N½äšÂ€Ì|ôYk5Ø}›äÙG‹E¼›ö2ù@õåù+e<Û ½¯¤o{àI›£ŸÙºóÇ<²22Àv³Áu„u€$/Ž¤siÇ
§åºëä§.¢ƒŒÃ,ë#.Œg ,¥î1n½?K^Oðò‡ÿ¿­åÂ/Ôê?äw™„Ý"¬,¤$2š×©•õ r®úi+úBzÊå–Ng(F€°_µE±±¤XWZÈ�ò•
©Õþoš'»î±ýù·Aó¨1Ê�F@H¯²å…‡ç/Ô©¯IE.[��Ûëg½¿¿än²ì@;ÂéœÿÙ·ÎI?2íÑý6†#<‡!ŒÖ¹æÍãÚ�ç/\�<tŒ×ù9÷ÊjW9ÆNÄºú'OVçÍY–�ÔzüÍˆ]UMßõHµÃžu‰Œ ¤n�æ¡'çÓ¢�ð]u‘óãtäÑ1þ> ºpX*¯ë/Æ…¸%Ž‰kyðJ	ÿÿÓ¶mÛnïA:ûúmR‡�{ÿÃ#Õ,•n!m`2c` ¤Ju>à�|ÊënM|…rÂ™(NréÂA)èV[›¸qçqÏ÷Ã«\R6¥´Ð~Muûs=®À±ë€r§ú¯ïF	S[’n¼=ÈŒ!Ð{A2�úÓ×ä"3ZkµhëÌÉ?ó‘½Õ—ïXdnó<È Õg,-ø¶ý’Ðd‹fæÚ|¥Ï"BqÉ3J²AÏ°ß¼»g„1©?¿P—ÜØ®¾<wEÛˆå+ßdç-¶S*às9’®e~™wO%Ñ#�@È�� å“ºç�5 Iéµë·ëvè+u®÷‡�;´®þ_í0qKk“¼üá¿áÏ8ðPë ü`Ï¬¡�ŽXepØ	ïý™�úA!ê˜@„+\êù‘]¢íñÏj¿…´­ÃâON»=…ãDÙÉBÀ)CB~”;�z‘âc$1("F!ÁÊ:j¬ˆEÄßÚ?ZM»÷�ê3ZÐ—ð”?eG{•Ÿß¾¯§n€¢iýóc§$êfR„Q|Þ-¦«/Ï�Œ-:½OO¶oÇ”‡ž±4kzËçÑ®Ä¢§Ú¥£¾fTŸSæ|úâ’³'œ‡Óˆ<]¿ÐGê\o‰ºðü³q^!Å‰q# qK{ùÓ€òð�B’ß×»Þuºüí ¯¯OÒBž#XHá°#yþQ—„ìNvòû$ëÑ@„hH V;ê“ÐÎ¤«\ËÙîéªþ§+ZŽsg.­f<býQÒ".†¡¾$çÚN”Bå†c4+»!0¬ê«¶9ñ7Ú}ÿØVÞ?2áÚ6„/ñ1û­Àï®Þ¬ûh~^Hâ»äu½¬kþêŽ…Åç}ÇÒ€¥½éZž_ÀH2Í¯ncxŒ€êsç��êœÛ´|>¼Í½º§† Úk:
ô�4Bc$Ñé,$®uQFï…àÁºÎñ€¸%Ž×~OœË½ÜáÿÍ™3ç‚ñ¢×0ß&b–\ˆ\è°×"…çg0dXOR&�…š&¯ï.ÐÎN‡MŠ�>ûÆÜe®\W&œìe…ü�ƒ!~F!ÈËâ“ê Ejg�BëÔc�®¯¬TŽïÄßÒ7–öÈ?<ajáñyžGaù7–¬Kë‰h,HÁóE;ÊõÈÅï]‡~b¼$…�^9MG‡uãÄsæ©ùº/¸%ÙÁ¸Ï>4\}ÑM<�ž5äÅ«î©VõŒ9ñ!¦è«üDåMÀkgäw27õ5úHá%Uù¥÷ó­½Çdh8Í(‹câÚË˜”‡üœò;íÄÒÒñ`Oß`�[9�“^R¯G\Æ ÖKêu>¸,"º5†ÐîñÝˆH2)L>¨…zž'–íë¨NvI†2vú,}^�Ô•¨v# ðv"Nz{È²Œ‘YÞs4ÜÙaØnÆJ{âgê˜-ÏHY?ÝuÑ=÷U³Ö½9y|*‡×õvd‘®p_�Û÷÷j�1trÎ|r?_ÈÉÏáÛw©ÆÕ¤�·¿–©>5íŽx¾�–‚\S­í:âs;,Pfî›‘%$2Ï/Œ¢oè`è¥{ÿÆúUÔåºAfš¾KJï÷ôsÈ€8&®9çŠCA/×ÙÿaxŸýŠÉ3Üp	µÝÛe ��×^GÈÄ¢‘€G•ÉÅ/c$|’‘ný	ÿ˜ðå>~{á*'ø°…Ô·>ÛíŠÊ1crÆ„h'´m„Ð¹§«G¤x{õ‹ìµ¾#â7Þ÷hõñI7rŸ 7 úE_m%y!µÀk%‰> ÷Â3�4õ>wãÌüžt(ˆ´¨ù^€v÷ú�ãë©¦ÛéiFøü³®ºggÚÅa'âºÌu�)ôòKBt®}ÆÁ<Ý•ô:"aq£p˜!£,Ž‰kÎ¹â»/×ößï¿ãï8Ýnð—¾5–wÉÓ·+ùÎÀÈÂªô:›•S»®•„è¥×'œ#šàý“‡X~h@+Í…B]¸aRNC¾9
š‚ðv <x$°xåPž¿}0‘?�‹ÿì´ÛÛ^å‹®¬N»ä[9_YÝðø� vÝS;¡GËU–Œz¯Ò½¹a ¼Ü·ÉØ‰Â“³1Ô¹§.øü:_¹²èŒÏgY¼ûæòÅóÌ ­ìÁƒCrœJHÊ!àD²vôÝ‰ú¡ÐQƒérÈD|Âþ\ï%Å�ñø#Ž‰kâÜË´Xþæ¿ám7ÜpÃùÙÍêðBÈ„ÎÞþðøIF¸?óP"y"?Û#ùBJ=¿âµ*‘€�‰Éé«|‚cA0Á\¯—œ¾ûQ)’èŠå‡&L©fÔ5 c ÙQXy®¬O¦à"
eõi Ü^dÁ¦�c)Ï_{x úÚ¬%õ{kíý-üþª-ºÝ¶¯ÇH–÷§ÁçÇç·MCr@b'p¬¶kÛNFˆ{2œnç%–)y~†�¡�È¿æM™ñ»ù™ÛŒôÜüÀS¡K"?Î �­/yº”‡ýD ™sŠr8¯Ùè5ë\é¼ë?<°~âÈxF`úôéßòŸ/þwÀËòåÃÛwîÜyûx7þDw2 éAgE¸¨9 ªCÆà%I$�,ŒF¼�Ê´§k ?aÜaÕ�øÙ&Ü•D«Õ"–”7ä×—¬Åãd×5ì0™šuD’�$ä/«o�pwõÿþÁ½æùõM¼]6Åï)7 ”õ|nzú {ü'*ïmÒï3ÿ¼¬L�×'‚g«ê<_zïãŸé}Gõ­AGÆrÎžÔÆ˜øõ9ñçp�Bx_,Bî/ÍXàãÀø\r÷BþÃ…� ÞõÄÉŽÓ¡œ9±!×§!ò}«’þfëZnÐ[“¡ÿOvc Ú9Ô;vÜ.ÎµûrÐË‘ÿ¿ûÙgŸÝíž¾-vvú Ax
ÒL’œ‰Á#ÏÊ,¯ú¡LÑC(
un L	XÙþ““o,À»³~éóÂë¨/å25È
Qr<oáþÃó’[’×?V­Ø×YýÕM³Ò}ü…îB!_¸u~u�…ú‰”ù¯!9�È��Ï�~¬¼#ã>Ëˆ�h¥UNÞ�‹tÏ	'¹œ´u7ÏßÁøa`1˜D #íáí—n{ÀÇ‚ñùª}þ<¶†�àÌ?`˜¨À$aýhxo<?^?Âþè{]\çDo¦¾C^w;ºàLˆkâ\»u€—:ÿÿ—†ÿÑÕÕ58Þ�¯î8’ÈLPÏû±ŽlF„�ú ï/)ë‹%f¥µ\lá}ñ©Û8Þg¡áTËÿCaCÎ8ÐçJ¢	"âíë¤A
D^�¬ŸŠ[«E¾ô­Ã1ûfÞÖê4»Wl$e;­7£šüÐÓ¬°eŒQG�Ïô~ù}GD÷…Ñó¾Miðh@RPÿÜ½­¸ßóç¯¨æ§ëX7)øÔ–^Ó/_ˆ‹¹p~í#ûü3ÀÇ,™ÇuNÈ¢‰½"ÓžŒ€ëpé°š^_HúÛ�Ók„üµrèç]�GÆ5 âš8'î±ðR€rÿÿN9å”³ìû?éæ\Rv)Ì“µs«7Ë-Ÿª”ÁÃ*7V-¨â6H)`}ë‘á_!xÿ™öe–“‚ü&ißP›Áù~7«ØiÀ  à¹àú Ýâ.yýãáþ¼'öWŸžzsÜƒ€Qr|Ø¾sÙö‡j7òw<tòxMÊ1^6d£ðþ„ùm<²÷›ôÓ§Ó3$ø˜~Â¶!—v××JÜÆï_7ÞDb,Îx¡¿6>|æ�Ï÷g$O:•öi†øxpJó|Šë(¹~ §ƒ±p]Æ` çƒ"kW2>çÄ½ü<À?©h³ÿÿ¶©S§žï7Ýû»zÈ÷ÓÀ`4H�šaD~Ï`ù5Ôáé™0kÎd´>�E^6ý±ý¦8)“¤¥75ÓŽ vWSgCz€b;±œH™AXÙ;–rýM=ÃÕ÷¯	â»,ñ•y+õÍ;Hï‡„œ&)«½è[Ö‘âP¼?)C£ÿ8l‹åý/9Ø×Ìý+Aåöh¤nÍ-â�šQÌ>KßÓP[Ó³Á…þÐŽµŠ&ñò�V&çG7åú\¦¼Á¯1<ß�¾t¨“'O>_Ükuà¥>ÿÿ_Ö¯_}vƒ”]>ÖÝç¤Ná¿o�×W9^°�©Â3àÃL,“XN Q<ØökäoÓ¾:I¤sâI~vÚ­¾€4„òPÄx ÝËH”^§À6è‹;¶µ·xïÉØ� £³lÏò{k‹ˆùÖ#÷C9'¬ÀõD6‰9”y¯�žH‡²KýžaÓ�7þôÉÂó3~’”gãñ%ýž¢ó¡9úÈ„©�ñ’¼cŸ{üðüM]€”äî¤”É± [¤ Ž#n ¾€[“®ÛáøèãpCa\éwµÇÚµk¯÷Ú}/à¥\ ü“GydÍx7¼£s@$Ngç“Lƒ‘‘¾ž¯»A°ô�M×ù$H:Âêæõä`M# �½Ê†•¿ñéC®8àcW_¯Æû&I$€,‰ŸêÃ{¢Ä±Ý¸°3-ô¥�’ý Ç©O¥-" �ªÓ·òtz�<}Ø¥—1™QÈë‰Z
pM¢óùÙ~½@zCÛWç®(¼òÅ«7Æ8HfQ@Û³õ±#u‘™›ýÈÌiöíLè_¿é�ùw¯ïoQîh8tÒ
Y$Àöuî¤pn†ˆréëÎ-¡;Fƒúîè× ˆsâ^»…À—rðýû÷ïœ›ÝÝÝ/Êuƒz@3 C’é�yx¡æñCªO™e:ÀÒ–0¢ë0„yÙAÖnÝ×�+�m½MV~î§ƒèyDÐÞ °ÌràmG«vìogØyv÷X.øôõ3ªëŸ|¡A.QEÂw¼pÓCG©ö²._¤Ò³ —À=4¼ûí ÕIþ,!¿2c�|´áñ‘�>#¾À5‡¹v‰ÍãF´qçA~€&ùA}¯Þû€’üxàú‹Þz ê­“ÿ ×¬ëÈùCÙ¥8'î½D�€lðM†Øo—ŒwÃKÆÙƒß)é!‘&)I­­`ð‘L“`r‡0œ1ÀxØvÊÅW¢¬.ìo*èa”O`aÉ•×Ëô!”]­�a!ÿÒgÙ·o@a1‚¼¾�>Ü™yD•!œKÊÞ^‹$âR¯2c$ãžç’&	”3C†s©÷ÒO†Fí3SoµßÈÇ2Œ15Pz|�\^X°¿»øœ^rMý`^ßç_2ôCz–äAôLuòCú2ì—éÆõ’Í”–°ÇøÂñk7çÄ=ç �€—äà¿zë[ßzF”@“Å‚�ÊÍœ‰":8(ð’ÙÂ ƒÝ�áHíI
õMÒ�u…ð,–‡Ûêû®D.o}h¯RÖŠHD@z@* y×õ?Î{óîÇì×„¯v#Ÿ…<sâtûÕ�çüóX Ã´™%¹¤€‘pòBêôÏNhžî�û¡®¹ö¡Üžéòô¬!Ï°³û‹"ªòþÙºE­iì]b8’Œòõ÷=ª±³÷Çx~ú�q�¡nðÑ…BO ¸@ø.»”.4"Vœ[=-Ès~BÿCq�t]—>Á£ö÷ÄÁ—äD`›€xÞyç}q¼}¡«'õu
òú²”&}ðTÆRXVËš`u��Áá½ˆ“%e”<oæR'âå!íW€ïCÊè^£€’º�Âë§�üž¾£é¿ü\²z#ïí²Ž¿ž±ÈVøû!}œJ;eÀŠ¨ ‚b\
´Ó§ØBmßb„ï’~AL<yÈÓ/½¦ñÌÂÜç{kžÒ·
õßÆ·¶þ3×æá¢ëGÿœ¯/ºïíù8ŽÝ’L:�Ùš&ä÷u)'7i,úyç†.ºŽ¦öÔýO²IœÁ�R)ˆ{â`«�ÿ”; ¿U3 ÿnÚ´ißÏ <ÝÕaƒÀuâû@2@~�#¯€@ï�ufK+îmN`·¾ùº@Dß]½Å”ÇÕåßÜ6·Z*�•®s…ìHtDT€²-0…ÞÔo?Ám§ûþ×¬ÅA€Â h»ì‚u24Ã àU2I
NJ•!©@¹¨+�'Ç3cpF%ùLÂvŒ`v¿!?e!n n}||N¤K¤R>’j—ôÏš—Ë»Fì‚gúgI]¼éþ4¯	è„#>ËíUÎÒ‘"â½¥Oè«×¡ëêïRHõýâ“Î
^7˜83¯Ä=q n²ðRì üçåË—O¶“I• ›rÙÀÃ�}z0³pƒµ(@ L:à—Ô5©‚ÉÒ¤~„d©LD@ž&4×ZŠHkŸj¡wî•Oµ/šÜÕqÅsÌ¢®C…•Ò-´zKÿXZ=gúŒô^nJ*üÒ~,ã:åÊN&¼Þ/õ"½÷U™ëEZ'o¼�ê�äéº.õcÍ¤x$gëŸÏÇ@œ{Û|=kãù§ì|ØÚ‹#á‘ã{tÅüÌ¡Ï�Ï™ææT_»©Øi�=WKCêæÑÚI);)Ñ/œŒ#ßõÑ$á¾]Æ™¡Ã®ßª“4¨Þ��83ž÷ÄÁv;/ÅÀ;í¿—Þ7äÏÂ®Ãý"Bzè ¾:?Lª>Ò�ðäœ�…ø„T³X7ˆI¤êƒÄPƒýÔ4$uè'ç{;Š„g	òGÝ+oµ•þUÏwUŸ˜4={?ÊçÜ:Ï«ôâióÃDI9Ú1
%Dö‚ „û´é³£ÿ\Þc Ùö~FBÒßÃûo,¼«xþ¯ÝÆ8&â»ôhŒ( –ÄxwþÏ·þS·îÆ †Q½bZ±5<³å¶1Ž7:ˆþ†Ã0¨\D°80÷üè¾¤#ø!¹«£¿-Ÿ$qOÌv^2ð&Ã»î»ï¾%­o�ò–C}n)eâá3# °„AIˆO×†„ð„l¾qf€u¶Ã ïÐ»"�/ß>ÏVðGC)Y8Â¨ÎÉ?”È¿dïÁê£¦ò>Î_±ÒŠˆ.äåKOu£9$½™ydÊ\}!ZHí	Ùû»ä~ÉÑ)»‘¸`Í¶üÙõ­Ë <÷@ºÆÂ�“0½Nerrµ¯ê©Î¹aFñþú'ÑëADƒ�ÔA¾ïáø,t*î£ö'RšdNÞ�þ*Ëáeú/9(„SgÚòIRØµk×ãà‹‹/‘à€ú‡¾Û~¢hƒßP[l8¤ À€?¨Ê�—©y|,.å�€‰�¤?íDÖpX9)ñWÝÿDõçw™IR°•åË«åÏuÊÖ×ð0®¤�ü
û=u@gZ_ù¾þ;Žúƒáä½ì$‚#ýãµƒò¸àý 8åHR]H¶Ù0,áûÿáî<ƒô¸®ô\eýRÕî¿µ­µÖI«²ËåX[ûCÞ•D1II‰£(Ri+Q«ƒ("F ‰8 f@äA‘	‚"!$äI˜€0 H¢ØUkWû¼çê©¾÷ûÔŸ‡à ÖT½uîtßî¾á¼çœº¿á;öfmðýóÿsRyŸ$–2†cóíØŠö5Ûx¼Â÷ú>ì+õµëBý�ßÁX=ïK2<%¼OÒîàÎ#fÄ	Ð±M5WñJÜY
7Y
ü¸_ú3Ãß:tèíª‚®í³
:á“¡@É�öNðQ"B¤p\Àz·ÜXìóA�4„tRÑ'xâóo5É� J5lå†àqZðD¥ñáBƒ<ÿBûöÝ�ÏŽ-]ï¥Ýj£wrÆz4^PHÞ|$Ÿ$€p¥ÿ!/„ŽË˜’ixðš×û˜Ÿ(�gÉDZ²ùã¦Oy§õŽ1/+Þ=.…Åò1·ƒÇ—ê›ýß@ûº¼uÌ”8Ùëó=’xcúŸù'ôïïý£X]‡žu»wŸ/{sé.†G
p":G?¶Î8“ðHkÿQˆ{ÆÁ¿Ó¥@qöãÞ ‡~±½½ý°¨.Võ~àd…ìvËGãh0B~&þJùJ�:¯o¸€/MDâZL¦›�$[³=#ð�¶œµñäyŸ\Óµ�i‘‘d»Íö/°ß´¿áéQÊ\9o>^_á�ÆO	±!4`Ù
ˆŒxDÊ= sâÁ=M”‘F¤#{>÷)±Ò—œf¶�*‘T¸ñ™1";íN˜ï¤'‚`®‡xmÏ^kæWžzò»üÅêmåádWŸèU/˜‹Î•‡˜®§&‰H]MâHÐIÿÑ[»ÖÓQÿ/H¢×n€Vg }m î¯ªc þÑÇýà?6\ÓÕÕÕW»€ U–M„'ô�i<?�Øé°¸>æ¢ÃqPîØóRd=×	ÅÒ£ÃïIYf´�V¨�]>µrcð<séàŠnµ°¿õH7ž?Á-öYì©{JÏ$!/„Uº´²PL€’véi$Þ›Wc§×¾�žÏ¢D@B<ÆýB>ä5NNIA›uæÓÌÊ3ˆ2®/¯Ú/=±l]ÉÀJ~åéÑ¡ï8 ¼G‰ŒÝ]bXº“Äó['†>º±0D''(-xDË°˜ù¥[íxm>qÏ8xµ¸ø1¿˜oò‡^ÛÝÝÝ_,ê>g q‰ r´8B~ƒ7"NÈï¥<LÞÑùt"Q C
‡ƒß{ÂÅŸ,X�)˜¼ûŠî3�Ïî±ùì‡6í3ÿ’òdÐÏYO;Òg×xhÛc…fìYZÎ„DDB&H‰EºÕ–&Wžþ�Á¾2léÚùe0�òa(ÍuuÊ‰|ý°‘åˆÈ0Ïàu7ª0slM²®é>c÷‘±ôÃ¬„í‰Ç‡ÈèAæùñøŒ2Ð)t‘ˆ!œU¦ÿ8Æf—:¦<YdmRÁ+ýRP¿8è\Ì6}ÜßÔÄëì3Åç«
ºÀ*¤
b%ÏCf,(‘AL'4™5:Æ˜Ì%!Ñ€ÿß—\�…GYzIO7Ò^74*.x|ùúßï_oïò¿jÊøÍ'e
îãQ…ÀÉò“ƒ s(93ß¤•—ë=}B1@T?&,?iC›ŸØqÎa»%·–�„ÔÉ2›KÒ<?ÔŸóLÜyy!­Ò7)2JÚ±¥ónì–K<1ˆ‘ÀÛUù‹Å«ü~Ï9žû5fïï÷tÉ~ú_ÏbX!ÂCb“œÃë3Dui@?�G=&*õðžI?œXYïíÚÝ¹8qâD”âžqðzqñãü>`¾p}OOÏ‡U`¾UlÎñªÖ®…F Q¼¡æt:çÞ¹=Ô"­k00@ÿ;ð°td˜`(Âñ �t®0¿d­+¤¾süÌ X«õb§~SÜmïñ_=ä¹”ïÛà3íèIWÆ’—ƒÜ’‚ŽE0,òü�Ì �à¾¤W˜Çßaä×Ï‚ÏÚ} ±a‡áõ¢yÿaÔ»Ò3³q‰d�:Îÿ·¼0^mBûig9Q&w}P6 †ÕúªðÁvóö~/Š~é(F%¯ŸF€èÇà ¼¤“îÉ9d¢§Id;GÀÓ#{%y–8¢ÿçYZ$�_RèëëûðñìÄ ä» õÐ¯Z!þgMLoæ¸e¤!h19ØK¾92Ç=ÍØÞÓ&ýšz«sc§h¼ïñƒ\÷jÏ8v:x–/¹âJ~¿ei±,lôù¶?`!ŠíRÐf¢©‡z‚R³3Ì�¬>”v™‘Æ‹
=©GEÆ{‰¬ìU'‚XbÞ\Ÿðú.óÂc¼|”õ6ûnÞä�{ØðÀËÉ%)Ï÷èâo¨ƒÏàëw!«?{úÁã±ü��=.ýœïùßjà®x/€¾å¨±,{lofáÝë»~1÷ã8'ºÂ#KóO§U"»=#86=K’sAw�DÊš¯ªŠ Ä=qP\d7àà€j¸Ñ
ô¿!{MP1á8h	äÿ€F0xºäÕiT­LfC‡®e8Áð€ù„rØ‡poëJÁrs#ß|ÏÞ`î®	MÅ,ûUàí6îº|„áå—ÉŽ3éy˜5–â1æÄ›bÂ1 ¹�D’[o„»õÍÄ@)�FmÞYl¶¼L¶!ñð<WŠ*™MžñÜ5nºž#*„ôÔwÛ½½Yv£Þ FB›Î|¨—©j¶ù�µ;²P¾9	÷ñúÔÍ=pzž¥:†“,ã¡[è]Hãä|¬Ïx?ÑÏ9a~,FÈè¿òVñJÜÅÅËk °HQ–ÒÁó;Œø^Q‡è TÜä9-6¾@ãøµ<’Ò{^Æp\/Žã	¸W¼6¹cå¿ ñeøùëÍ¦ˆ“vî‘"gUscö–Å±Ÿ+8…T:ªüÉä÷Hîçù2’sžåQ˜Q éYö©®yáz•'Ï«5.NÀäÿ{'ÍÊÊ0iÏaë»>3ò»!zÕ†(Ze¹ö‰áÙ}îœ0Ó®ÍÇùÍDvî‰ƒä¼tÒ¢_"eÙ)é\IŸÐM&¶=¿È­çúŸ{ù³£®GNÌéÒy¥¯<ð‰šÀ‡ 	á³‚Î�VNžŸÆUÅÝ£c}±¤¡íƒ0æ÷ûx¸…ÅÎÆhÑ¢
IxO‡;éDÒòFÈÉu›}6E\ÚÖ^>�@xÓçvìI÷‹£Ð�â²ùƒI§ãù\ž•´“ˆhGé?0ka=Â»$ý�IMÚ[Ÿ "iê‘D4¥½úm{Æ³%âŽ{ûýlYŽÇ ð2šhþânEIÙ5ó?A‘ctAÏ•L"Œ$ÜÇ•æ” 9éÄÁ@üò¸_ºá™íx¦ó�ýŸk>Õv°r Î†øŠ-~X»€`^ß@Êhñ¥ñú4‚b%I“à�ê×98_ÐðÀ‰îé|7Îþ.é»¨ˆßziJlÊv	Í¤Sj´ø?'„JÃzŒA5`<='lÀyÎ‰‡9æ´Ÿ.M<òo6¤qx=©¿�i…4-¸X†ÇŸBzÔŽ½±ÿ¢ñð™{ž»°ÏæZl~â‘ù+²öZ¶AùK}Î
ÓéD¤gbÚÇå¤WèHŒ<N|“Q§‰*•§tÚŽ£ó@^ý‡D ó­Lµ*÷Œƒ7\np¾v@zžÈ�…TžŽ��¥¼=’¢ ‹ªÆ�Ñ c+ÈÉÌD¢wF>¿ éà]¥1náå‘·Xèÿè¢U5‰sßÌÌQ˜dû(žLé˜1•Ì<ùºKÞŒc�·ÿN;S¤sYC‚Ô5¡®�>Ù	Çq¢%PÎCH¯_éÉÀðm»ÜPõ˜dÒÎîµÕ¾¢4nû[5Ë‹-½Îê<ë?mÚ˜¥7Hè¤Ï=|2D$ïI†­™þé<Ž,¢BctÐyçB”e)Î8¯êBÜ/§ø²íFê¯*èB#ñl,\”¥ôì®sÓj8';ó¤id¬÷‡ò0Ah2�ì˜wK�t°ß£„^ÂC¥WŸ´%´=QÀ’"N¯ô²¥²Hâ™ÊûÉó5hŸ´ªc�R �‡f0å@wm@Z²„—çžñ9Á›#…|Ò4¤ƒ¤üDQÌ^”xÄë{ ¿ç£^Âpká�Žâ:ó£�’®³ï&¾´ïKp=%�‘KdK–ãtC\gáCQæ«ˆpVÍ†ÆÉO:äï
×òLæ ”O\gêDÔ@Ü/§¸®£££Ï¤�	Q–Ò‹»ÏªRn€HÏP€Fe8P£s<"�*”&]J“0\gR€Ø¤c:ºÁqâcž°Ý~†[†�3%~Öñ\�×aßïë,õ]Ð,uØ¸ÒŒ«„”>¬ Ù”€Ò„Ç�D°5‡ïï]íäqYÚ·ÀõIB“�=ÛZ‹¢§ýþÌyþÊòâûˆ˜d]
:¾Ê>Æú�ÆSv—ÂÐÍo•¶×b´3¯+ÐÇ:‡¸ŒN¢¬G8,'+«Y©CC_3ÏŽ®™ghr‰éy=>I
Æ½^qðr€kŽ=z¤¶…¢°Ë»Ï`%©¬¾yÇ1?¯cäÑyÿŸ°ÊäYV°Ú¤Ã‹¡{bº‰`õkNÌÐ‰úg;ÏV×$MX~R¨zæwú=?¯Ì¬íÿ�Õ	ÂS#�íXD1•å%œÍÎg¼!hHÛæ˜u5Ë¡H?¶fÏÈßÒ’]mQ’'Ö0÷Om¾ø<‡ÒcìGW‰XØÑ�ñC‹Ö”ù£¹ËÊ½'¶«H>§}‚g“pBæDJäw‰þ¡£ÂY—@~€3t�Gÿí¸¤qæl]>I
âž¶×3 ƒ±øÅ÷Þ{o—¨.´E–
:éMBv—€ˆ @v®aŽ Ï¡Ó°Îyò$$‹ûÌ"k/ü{Çœ8ÏÓß~¹9\³H{æß=V|×fÑo5/úÌêÍÅ6aK¡;cêÒ®1†/õÀùT™!¡Éh@@šÜ1nå¦üHƒö7h<�A 8C,Ú,•)0Nß™Ø„ðçŽÛu°€ðÉì¼á.]“”÷v›€�ÕeŽ #c2’ž>ô;Ž"#¾îÃä2ºÇ0ÓÃuˆ�ä¾œœàäÍôŸ!r”âL¯Ä=½x9÷|~÷îÝ›«
º±çLnñò>Ð0!†I„K<€ôÞØõ�ˆ¯±*žžˆƒÙX†J{ˆçÇÜ l6ïÿ]­aGÏéø²½Ü2åHOÈ;ëØ©â«O�*ìg-KŠízO@FÀ‰ñCç0¢$¤”7ux:!]zŽ	L¼²~ðä[©C
mmn²<D‘ô±e�G²T>ÊtÌVN¦BdÇ„½G‹ÖÙ!¦§l]_2 ú¥ä—ö8ññúÌ#Åþ“¤ÿégú?y�Ò}ò‰¾³ äˆL¢Ë†D÷íÎEòs�¤8“òÈ¶ÝG î‰ƒƒo Ø
ü¹mÛ¶-¯]@°­û4•W…]
~ŒF¢á ¹d$/H¢�ÔÂæ„Ì/„ÿéx—Ü…P9–ÚÖÓ)oî»¨€�=ƒ4è{QÙF¾ý¾Ôó<ý³¹­�À©ßqïð,¼Uþê¨Îa ”¤ÿïùdñæ;¶Z1ß~CoœmU_|gjKñÔæ·’û1qIÚ¥@¹�”9¦)óí£&Ñ>îÍ'½Ó1‚qèôãÇ¯,×+ÖŠPôa‘Ú»ëè7ÒÏÿ¯ßÿùœvFZƒ®•<‹®àPüiÐõs%ýŸ%™8DqNÕæ×öíÛ—‹ƒƒ·8è¯×®]Û\»€¤ßè9íòö�=4( „PnqÕøA�(y6¿¿]#4I	¸Dâx/±ð®4ìEŸoŽœ€âº¼uÌË¡,ÑûL;Üc_¡»„_YjFÀ†fJá%ËJ€=üÏæ‘(Ù[¨G’ÆC_ÀS'Q×:[  Æ
ÒcÐ¨ÏÅ|ß1ÞÛ„¶|ù@á¿?'IÏ*ÉœÄ")1ä8¥éóÌãça»€ÇŽçq:Ê„fM2ç@’ì4ÎÔã“¤ î‰ƒƒð2PÝ×�ÿË‚&Ö. éÝÝ'K„FBb³‚XEÃ¬ÎsD�ù�ÀÃ.¥%³(€ûcÉ•öcê0Èƒ¢g6iýµ·‹«LQ¦´ÈQod"Ñë1dÝ)µÃò"e|8`»ìœ8Nè|68‚±väÀ€Ø=\žÇ à9Ë¤ã^¬@lÀÿxVfÄ1NB²+ï¦gG{›`H§î}ÀÌ{)â DƒeoŽç'ÜwãÀ°“{Ó’ž‡òãÝë‘XçS]“ƒ2u—h·VÈŸ8±2Ä™È«züš7oÞq°âuà�õƒ ÿnÄˆC)dmèé+5\NV$6�Š,7îY¢‚R~óÈ.9©°ê<'üÏ0ÃÒ(ÆºS¿-î=ÙÜ3¥¹`â©g?¾v;y“!ÁCó–Ù
Á‡Å}Mˆm§¥¨€t(+`ç!ôHâáüiÏØSÁ„d:!FšóžŸ�?ÉÚ:Ðù½´–ïm47Á²® e^ÈžŒ©Ë†’ÒN®/yfÃLt«¦Ç×q÷ì’äwçƒÞ±œ]ÃÁu…ë]§,H ÎTñJÜÓ‚æ'Áþòž{îùqUAÛ{z!0€ÜuO:2"Xj‰ßÌµå°«Îü@ÞDˆÞ@R›Rfìz/#¿0f×!u*„,+¤–ÒÌÓ=òFÓÚœÀÖþß›lbq^//šþ>8÷ƒàŽóÈèáE>IåGú[iÑª³.oÒwRúõ–FZ>ÒþŒ`dtMé/É¶þR›×?ù²µB|IõQ­­âNâ�ö¾¨öøô/c|]_Zž¦<Ñ‘HF=dè)È)	µõÙVT¢œÕ¸þ‹3Úé'þH’v)ˆ{âàà},ÿ(è?ÿÔ§>u»¨TÈ-NÄŒàH!�<ü×�ÀÀµœ2‚c(Q‚àÖ7Z|¬È‹Õ—‚,³M?ÿ}j‹üâiyÿd�×%Ê¦{é£”Nüh À}“gëm¦wÛ™Í3Š8‘¨NdMŒÇ'ÔÅ#"ICÖ
T^Ï1/’s=„ó1­s3ÞïÈÚá#'x_	ùL~^?'(Ëp¤�¸©Çç<ŽÀû=Ð)/×Ìæ8Ñ¥@:és‚Wë¿ÎµØ=Å£*ˆ{â`½�‚ÆgÁÿ™áfû:éùÜB‘–\Üu†¨Û 9æt"eEi´òqu„àÊDg8ši`¥'ìJaç²ÎS¶d†çDæáoìÃëc°PL—Âc«·Éh(íò6Sþem=á›K	Í”v’•—¯’½.[Ê+Ê‡ôóš–dø Išh£ËC9‚LÖÙÙ{O„5þWï”êoÐëÁîiñ¾µçCüíŽ·w)Ì&ç£A¡¿ÈÏdá>zéÓáegÔM¤öOà H£#é¿¸‚ó¬qÎ¸w“sðÏœ“€Aúa�?7\ÿþûï¬*ð«]§ë�ü,’´¼=dï”TCû*@)?†«r«ë•?‚eÈ˜±Œ\ÿºïJ{_{~œ”,ñø(+!”ìÑÕ[
"¤ðUûýÿ¹ï)¶ÛÂqø°…ÈBky4“ ¯ž9“÷&Ø%É>t®ç¸ß×¯‘tOî’÷ÜM’¿4YWé_ØüfVÿÎ^”®¼HBxHÏl~�Ù1€{ñx/7
&KÞšy¤²nè8ÃH#*E·<BEÐOdcúo\9UT9TqÎ·ÿyúÃ ƒùÓ`Ÿ2|Ñ~¢hc•xíø©Ú!?2�cPo��ìOG‚Ÿ	GK2?Ðì�Íó£÷¸ˆE6Fþö¸©®¨OI<¼bcô$,C¹PPŒ•Ž=±n‡Gá~AFãr�}?`âë»Â2áúS¶BåC:R@è+@æÒx<É“¯g“Ÿ{2—�œ°ÝàåtéÀ(>im—ÖÿáÅkKOˆŸzTƒøyT` ‰�wè¿]Èõ0}.úå’þ2ç˜HÞ þ‹+pè+À¿—;wîÜ(î9ùi°AþqP=ü¯[[[gTxwWonñ ÈI”òÏrY2n’}ì8ôó–_çM
(ÌâÎ~…ª�ß¤0q»
ÊÍ¬nyÉ§3’Ÿ2kŽ&½¸Ÿ€�Ñol³‰Á-3@RVˆ¡tƒdÈ1s\Û3w!uÏ|ŒÓ’BBrd‰ì&!±/ã>8oyÖžO¼º�ë xìÿ²aˆÆV’‰1×y"»xŒãèEgÔƒ˜NÆõD™ ÕWôÒs?dƒú¿çx_å@œ÷ÄÁÁýqÐ|;ð¿ê©§ž¬2 GŽ÷¤²ÕBV£ççY.t8Ñâ¹ÒH
D“ÞÜQI5¸üÆˆ	R(HHX*I½Xµ€´žwüþcÅÍÏ¿TÓ ÷½<K!`˜X©!�+#c¤´‰Šç@HÒ@d—^'Éº×ÇÈ)$~�©·¤þáš“ßŸÖâuÏmßÍ°Œº½9j-#ž€Ç'ÜOÈ¯|Apèb¾ŒŒ~¼_ÉOwœ‰z(™çoTÿÅ•wjñiØ°aCÅ½F^ú¸w~æsŸûÜ}*T‚¬-µ,bf1‘ÇÊ˜•çÏ#¡£t·úg¢@Ê@(íÁc‹×@N—7ebÉ�H(
ÊÖO¤cê¡Þâö±S1..>/0²˜iË�¯Ù¼ÀFÛ44¯›9ƒ§!äCÉ÷²tJ1zÇ’’üHŽãù»»ð2Ì·(âŽQ“½®OK
¶™ê@1a@YrKÈóÒÏ~.÷øu¼½Ï%á ºÑ!¤úU³¢Ä	äú]­ÿZ¨Eøâœ¸Wµp0~èÓ†[:;;/Ô.0XÑy:!2h8dâi,´Þzóc	:$“°_éã‰×våúÞ¤Y®¤`è¦7&$¼Kî�XÿE�	Uµùå{ÓçÒP2
�/YSl9u¡Øf† µïÏÀëšä¹JC˜: OZfƒQ'³“)ÈN“¥k’!€·§Ò­=4ë*)L=ìCCŒ’á@6Ô€àç�:dÚÿ„ø	ñKF"JÖ1 ©~EïOÄ‰ÌX5VtõÃ™ÚÐw .ˆsâÞ`lª¿€¥À/ïß¿OUÁ·?IƒTx|<=’4²©ÖùŽäþµŸ9§Žo6Ü¢0=1 ãö·•‡L@2qÉPÂ¥„L\ó³Öušã9	î¶·ç–ëF`�¾×ŸŽw%Q ò’d4A:x>¢xUÊ˜Úƒ éé¥%!‚úéÝ¶,â¹Ñ¶ÏÆ»çž>_"Â‹ØÁ³,Ÿ<º„W÷¾¡ÿ9ïzÃ�ÒÀDžÎ�–lD_¹‡P©ÿÛ»NV qMœ÷a@¾¨‡%K�³zõêùV8}¦ÈJZRØg�³¼3$UÞe%òËÉé³{b$¹cP•Cã\› ¼Z¤žj˜dÀ�ù%1(¤+i€‡•é¤�¢¿°s¿~ÝVÏ
äˆ2âzýÎ½}o»MÊ,ï=_ò\ŒŸQìlÈà¯ìHóûy¿/iÚ1¦¹ãy#ü=�QÛ~•€ïLž­¼NXŒÃ�$â#ú*G€Bôæ�¿\æR_ãýÑ�ROÐ¨¨Ôq$ò¥ŸÄ5q.Y'³%ÀÁZ	ø�68¬Ê ´²£J�SÝ`ùõM!OTu€ò2~–gê$DtyÃÐa­~óiû$øIûJm�^ã¤£Q&)4EÊ+)!!Ì{æ·'Ïªa À}v¾õhO0›l¹p�6¨D…7°dZ)½ê*BgíédöcYÛ&w"y&F˜(¨©<¾xusù³…«Ë^9–ÑËïe�ÆÁ�§�ç÷ØÚ¹EG[úVQ¶™ÜªˆÉÞâ\Š±ôv¡NÞÿ’�ÖëßÔÑ_S›âsÉ�¬vhUú/ŽT qMœkd`°Vþõg?ûÙ{¬pÿÇ_‹5PÝ`�è Üûç®´+y›÷ˆøŽ§‚üºý"Ð¦¸‚ýVÞØÖì=$OÆ˜ÉNF¼–’…t¢@ÀŸ¯Ø>ØŸÿÅŸ#…kísXÏ¬Üès«Mñ›™4Ë–Å@¾‘Št%äªÁ‘uwº�¿qÿäÙÔÅåÐM;•×ï›ì°sÉPK(‡ðó�Ôš$UŸÈ8Ë0nì³¸zÏê˜þ}µÙò,êþ€þïh\ÿÈ“ço\»ßãFÄ1qMœ¬€|% -ø/78p £ª›;O|	ò„Ì.›„`é�[w¿.Wˆ•}ç‹•í}N8y¤ðÕ§F?™½°˜ö«ý¦\ò:¿5EŒåIÇ�x-ÂçsÈRˆKè;Æ>‘õ5ÍA”£�’÷Ô6âæ}‡/F%V†eš$$§~]Hò3žFz>�Ì°®×ž	çC‚3á§®o´!N4¦QŽÛw4BfâmÝS/Tm1rO|mWñƒés‹/k�…·“6W}oâLÛÍ¹½ØØ{.‚evMI§jé—<¿t…ˆÒ�P7 âF¥ÇŒk_çò×€«W .ý[�¬|iëÖ­kl5à÷…U:Ê˜ÞÛÙMƒ Ð�„ÌjP!Ñ:��¬.•wYïy)Š)Íku<pùØ=ã¦­GŽ›"ÚG>J!¥Àd¤ËÔ €„¬"Òô#'‹ûg.( Ò”ç!{³pmO0›ŒKz™�/{yO#ç�ž/=¿6ÛGxL;fÑ¼£½^^pµm²jjïÏ<dh?¿ŸÊ["T¿-)žäeÿ‘âö'„ûåýd|&ïØ­¾_Ûm
÷Ëû_h<¤ÏhHSˆâI]ºyóÿà§}p0^
ÒdÄ_�=zdUÚM¶ü!‰$ý’tâñÿP´_”¯˜¢I©~>™l¨c²¾¢×Y÷Ð=ãiWÔ²	L6²­	˜Äzþõ=6[>¦¦T6E%òt›OÉ€Éü¦XäCÆÏYXÊ²©$åÓ1IƒŽE)°Œ¥ò1f'-ëðò›û3‚Þ:jrRï3¡Ðç)tOÕO„¾Ö–Uÿ«òþªÙ^OkèdFRkíô?ºÒTO·8Æù†=>C“ço6Ù�ÓÌáçÆŽ;R\çª^ì‰À¿´¿ïZ!ÿÒ×ÆªŽ“xƒsM~}“çuY"ìÛu÷ÌªM@�R@@E»¥øYDChé‘õsÂ¹R¬T0o1Ó>6ú“ö9rÛ@CÙr…ÿšŠ—¶ü*K¶ùÅMVFÂ¢;Á™`wœ$ù(M„"éP9A'Rh1<¶p¥—“²~ö¢Q˜ŸpLè§Ý ´Ú­eß!­Ò4b ³ö»y§í°<¯2¢7r@98×h~ê¿ºó¤¸Q…ÇÄµÁ� ¬žü'þ^òM¶FùžmT(Úe	;;{ë™Ò=š�ÁúÎÝ´ø’Æ×(L	×øÄœÒ€¼÷ÚV®–b¹¢R¼,
.Ùï›J”7Î4ã!\––3Çî¶�wÌÊ‡÷+yØÛFŒ7¹çâ²ái3'Í—!€¸¤9IÆrW™ÔÁ`qLiŒKž?”}± ÓKºñM¯w–)]îÿÑÀZ›ˆ½å¹±õê/#©¾Ê ýøL±¼­/z~ô 1çú…¬Â’Nõ_œ¨4 â–8&®¥4P±#ðo—,YÒâÆ$áhgW1çÒXTÒ¸_“§5¦|`æ¼šå{Ó^)Æî9Æ«ÓŸ(žÞòVqÃÓ/*O†©o½”8�»+’»¤È¹Áéþó\Ëø:œÓ×†l’ëyž]wÙ§Ìf¾ýn±Í�>nÚªïà¡!»«Ü;Ñ‘ÀËËø©ú-<Ö[.×#ÞV»óþÊ	¥úÓžöÿ¨;üe|Ý~9høŽ}ÅŒc'Ã.ËÑö½Æo�Ÿ™õ§ÒÏ[f«7	`H	.�¾ŠG:àL=þˆ[âãÿêï öŽÀÿpß}÷=áëWhõï‡ýHÒ øÀC²æ#½afú®XQþdþJ÷ý%™r¨§¸á©³ü?�³ÐòÇ¼§�ý®HQòü�¦®¿¶¼G!'Çä÷�÷Í˜Ÿ�2‘¾wütû=ÃZ“!C„•úñ& !r(O ¯Òx+Ïðdn˜\ö#/m{+‹¨n91ös%’åöò! í£¹£{'LÏêü»ß&Ñ§Óû¦Ïóv 7nÑY¼>¨ÐÇ
Q}= ¿¸ ^TBÜÇß8øó ÿâŸøÄmGŽ9›€»:{ª=@Ñ�lÐ Œ}coF ›ž]Ì<ŠRÅ�1|Ø¦7ñh.o2£0;äùó]É»„”Üyý‰úÔMéÑ¶dx§Â#SÜaDccà°,væ·šôs{Îe‘i$i'in°L‚¹üýœE^¦'…�~`ÞrnàÝ�ð€þ÷¶´|í'm˜6ÌÛœºê…"&õNs�]£¯®ò\�LÚs¨Bÿ �tHâ‚xrˆSâ–8v9ÆÿÕó ì¸fýúõ+ª*Ôfh‘âÐé™à¤?ßdºf[F­õÇ|M(×é+ ?ãÑmn4Úy¾”ƒ ¡•‘‘ˆH!ä�$iý»¢a Úxvû¯‹¯Êñ\BÀëŸxÞvæ­*–Û®Â­6£¾Í°Á6-í±M;´-åŒðþ‚ø Ð?ó»Ï7?3ŠvrCðÜk»c}M‚ØÆÈòJÍÄwÚKí-|ù—ÃmHÓŸè&ê`ËµÓKõ—¾ýíØÿ.® á¤â€¸PÅqJÜÇ.ÓøP±à??ðÀ�w4R©Ž¾jƒKBx@þG–®s�,�-Xiaâ9@rÿU¶Þ~µfå…œf†¡É•¸|-
”•<ÀÉÕjY„\g“ŠºÏb$<\&li•š'7¾QÜÄ$eËB8þý©ÍEÓ.›'ÐŽ:Á¢‚6i¨M3s-Lfˆ’¶¯žïdqi°cÈ	ûŽ–ž)|ÉÞ˜~´/Ú"ÈÚ:¦Çî9œ´¯™�Ñæ­´bx¯_¦þÁ´–¬þÃ¬�.¡Õ×.=�l@�'Ä…JˆSâVÅú?`Ðæòƒþ¥…*·:t¨ß
®�z%HK
û;Ž'Hº¡è 0dÝk™ç¼×6ùlÒ2š‘ Í¿ÒÈ¯J´Mb×~¾”Ü¥Ÿo»x~fÛi¥et¢WØbÐXÝ	nÄB:œL�Â\»	&"}Ûãm�|C±äPgxîVÇ†Ólƒ”ƒ.ÆézNú|þ'ßð×÷fízÇØiëL[x;Ðÿ3“þ�˜vHQ×“ÀË¿¶»ß¢—s™Á]d“»›­…¤õ¾co®;èF¥¾\ÿ8&ìkï¬$ÿáÃ‡ûÅ)q+(ÿ_ŽaÀŸò^@X¢¸æÕW_]‰QË ,è8E_O§eÈ;À1æ×‡ òÃÈ™Á3þÆ<ñ…@ú5æ‘7šBéØ¦6gÊxçKÓ˜È£NÕ
ÖFè»Â¼Ùè�;Š;_œTÜ£ûýúýbEïyî§ûçm‰X2ÂÐoß´{y­^H�:“¾Ý¾|ôÔ²uÅâƒÑ…mÏ›Ì¬¶½öKÂP¡^{âÕ§ì‘Q,ÝÿñW_«C0ÒHî7Ûê²¸ûœyüÑ^êñèüåÁXm´¨i•µÕ*+ãú“tÌÖýßpÒ“ÿ*‹|¦XÙ(3 NUå«[dEÿÏo?…CÌøAzÍš5ËÄ©À-öÿÿé`‡ÿÕï0øO÷ßÿ£ª@¶¶÷Ô'Hã`FÞå%\I£üêÐŠo¿Sòˆ›zí…�yËjè‘å›Š™^<šK‡HIÙrŒzm7÷4h·[ë‘î¤pº,¹7õöÊñ;ámÃà~Â€1p™Õ_¸Õ"ƒaË×‹¶‡ú‡¶p#¸Åä3Œ.ÌÓòŸÕÊS*ë{î¶wáf–<Øº6	íAÚV’2¤-"ZÙ<yxþ�E«(mo/Hm°<b_9Á^A¾Ö¶+¿êë}ÇKS«<þ€ÏWë#�î7ÀÍþÿBœ"ü¯Üÿù‡†[ßyç�vU ­­-@é(#X”7Ø¥
ÉïÀÇVo•‚e‰2¦ï¶}ø•ÖâG3æ7¡c( §¯³‰µé‡ûŠ™5=¼$Š-©cü¸¥‚:†,Z­/êXþŠúû½Ië<Wä¿÷XñÃæ¥š¤®.ëÕ?Ê›mÿÃOšæ#×m/¾ßf† ®uƒyß5É¬0ã ùŒf^é:&[s»$Z‚5H.´<­öÆÞJóÞ¯ZÄ¥á—æ#¢áÝØw®»e§69y»@è(¿nÑÁßÍZP<Ø²DQŒŽžM˜î¾4 ä~ÒýJò¿ûî»íâÒ•þW/2ø|SSÓ4*ùM–°¢ãDÒ`WD€—4éi�Á*£X dA©†¬Ýïg÷rI9HÇò”Œù]¹ãøŠ­[¯6"Q/�?Ãù©¿Œ€äô£'Š'Öï°1ùÔ„P×ßfàŸß(xzÅúbÖî÷‹W�÷GÂ*:�§ðÐŽÙ5ár�½ä4ÉöüÿlÎB{ÓïynâÑ‘¤ëõ×=“çÔìÿÆõÉµÿï÷“ÎÃ�úR—ÿ+–ÿ® aÀ¿ýÌg>sÿ±cÇþWí
‚}í]õYJ7l±‘„àu:lÒ»�ÅÃF¢@U
æøaKk� Ñ+Ÿï„�r »¸ÆVRâMÜöv17Ž712Ž¼þ3©7²ÎóÇí=Zütá…éÔ¯¡úç¸ÞÆü·�œ`s$sl%ey1bíÖbêÎ=Å‚÷Ž‹tØPÂv´ì´ÉÆ®bÉá.½CŽM}so1üÕ­ÅÃs[í5ÞŠ6¸o5)¯í§oÖjÿ�èK®�÷¿tÔq�âŽíý¿O\j4ü¿Ò†7Ú+Â[T™*,k?QM�vH•EnØ`L|·ãb$ðÐ)à]j]Ç3/O$(dEaìc¡¯dÏúÎ¸i
©³úËhH2ö>Ué‘d<òúëx¿m¡=`uVè‹’ú_VÐ �»'6iSÐ%÷èÕùóóKÛÝûW@Ü‡®œð¿zð'ÉjÀ_ÙúåfÉ
A•rIÚå®c(²K”ºnƒb$roG¾†->dÒoúé·ì!D¸êçÃ,”œ]Œýõaî5 fŠ¸þìáö�ÀÏ?ôK!</ÊEæ9çxŸÕ¿-«?ÆÁó`˜@,ÕßóÏö<cmuDîö±SŠ«ZÛ p¬±ó ÏO]Óúg÷»}ô”âù×ö£Þz¯¸÷å°"Sóy·hsÓ¯æñ«õk@ýÿë¶ÎDÿkóCÜ‡’Ùÿ?¹Âÿê—ƒ|¿ò¿2Ü¶{÷î�X¼%í'i°�50Æ¢Ú€4dpÆî>TürýÅÃËÖ�®Úl/½mž¤'}þ¥ö ZÃÏ ðx¥G3Ï�dh YYÿ6 ú‘äß,|Ê^„úQËÒâ›¶¥ø‹òº—4B¨6 ×Ú[~ÿ­i¾~a)k¯ÉïwÙ·ö†ÉÜG–m,žÜ°³¿¯í£ô?ù.a*o„âŒ¸#9—ª_þ¹üÃ ~84¾`øÜ�!CžË-^Ž·ÛºjYÙàà’uXµÂ SÔÏ_mÀ]±ÉÉeÊïòK¶~­í»ÍIÈ:³VD�¬g0¸¾Nýgz^òQv…ÓÏoß"„ïN�«ùˆd¢,¥9� Îòê¶½ù¥âsã3ãè‰ÿïûW{—t½�?þøóÆ�ÿÊÞ~ ôr‡ÿÕïð­ÀOû¯—Ü±wïÞc�T|aÛÉ
�e�‘x¿¬ëçGæ÷'}©"ŠFœfkØO—!ü¬y‘¶!7^�«®?éÖ–Éfónã÷QÒÏÍÿhÎ3-Å]/M?«vãÓ£l6¸-A
Ïë»}¶Â1¢øš‘\ß9øö¤ÙÅs—¿X½E»-êèýcêévCäWÄçÎ§ùö_ÅÞÿ+dÀ+ÂL~þ™gžÕHåß<ÖIãUtHc
�lÜC_¢ó ñç›™_•yÔ«Ì+¶é.^é8sÅÔ_¿£°Q;ï|éoi÷¹�Rÿ?Úþ—n7ÂqEœaò�W+Âÿ+r2ð/Ÿµ½ÌwÙÆ ã�4Àü¶6x5W&ã\
ºÖeuyÈ[ÿzP�ÚÁÞ‹[i1 !ýÓÙŠõ'l{ðRÿu'Ïëã°m¹õp—�¶î~”úÿÑõÿ‚½¿8"®ˆ3âÎ•:ùW=£ &¿0jÔ¨ñªdÄÑ£G£,�( A¹48pðýª=ÒƒöûùŸpˆá—_ð1ôÜ}‡ÍÓž½ìõoí>g¤?nÛ¦GÄò…÷Z:ú?JýÿèúÿWm>ö¯ÐqD\aòÏ½ÿ•7ù—OòÓa5wþ›O~ò“wÛÖÆ±²4BÞ ËŽõ ƒI7tì~àc{þô#}öÑÑá% yÛðqÅÆˆh—­þzö&ýï9�aŠ•M“w“Þëø¨Ïÿ£éÿ¥¦Ë�¤ú/nˆ#âJ­�üôW2ùwÅê/	^=qâÄ)ªtÞ=Úf!îÉ®ñü(U¢l—B!IWÔçÿ²wíÁUTi¾ÊZ´¦Jpjkt@)`‡Ú‘•Ýuf�Åµf×qÖÅ†AfYDVŒº2²ìŒ:®:ÃðJ„ÄL*ïðHÂ+r“{o!	�°Jÿ´
¬Þï×{®?Ò'=§sì\î%�ª_�Sé¾}û;ßï{œïœîû‹-{h`ÈTû«Í;œ�âÖ]ùñ�˜†,zo7î%UÅOõå	Ëxòg½þàrÎ/[¶llÄéOOÿ3s gƒ•G»}Ð AÓb±ØyyÅ‘+´j{De[§i€Í×&}Õ²ï§@œÃVõÙ„³¿¿‚Ö��‰ñ]ã'Ü‚à»Í§dUàbºåÇzx\K“Ú}Mxõ­°äÏzýƒÃ)>_Éy/ÿ›ššÎÃ6`#ÊVkÑß�þgÞ’ þ| <Û}«V­Ê3�hiuJTAÐwÀ¥ÏV)ÙO�ökw<8Œ×{£®I6ß,ÐŒíg¯ÿÆÙÝuõ€´É_ÑyÁýÎÉ‹ßv˜•°H¹äHc˜òg­þÁ]pXnºCX±bEl6¢íû7,ýehÀç<Y@Îõ×_ÿˆìtjã ø{ÈÚÖST¦¦Pö
·óøì[G’RõÙš"–†9¥ïÁØ4Ì^]äþXèÆöOú\þ21~|×œ5¥=ÞËÓÅ›Ã–?[õî’ÏÈuØlB‹þÜ÷oˆþÙ—üã´iÓðŒÀ—þ€ØÚvÖ?b°Õ²‚M0; öƒœÀ#¼²ãîM×Ðîyþeà«þ/7oÇóùb çûLþ�Ÿ¸Æÿê{Sßíð Q^òl_ÈŸmúgÁ]�÷_NŸ>{þÇYDÿ¬ÍF
&É«Žva ’É¤Õ×ª±¥Í)$IŒ0GŒ4|ÞêzfƒYz´Ñù�ìÃÿ'ž2¾TûÛýò³`R•ßÔy!tù+Ä±Àøßª<ÔcäÇk¶Þ¨mê;ù³Gÿà*8kt àº¼:o'l6aý³0àŠÀ�999³åçŽ?»r@üÂþ¶“G·:nVøÇl]¨¾EÄ2\/0çï¨Q Y [â’U0TéP©ÿÚò¯•{Û*×Ú'›}–‰ƒ¹—‘¿ðB”4ÈŸúß×ÚÞ>Ü‡ÀXùÏîèo^à¾€ï~$¿vºR ‡°¹µ‹ŠðQHúª½¢”¼–~}+ð³f™†xn#ê)ÃGKgð?Û]ƒÝ#Ët¨ØÊ¿A^2º[®�k-Úê.÷ÑÙ ªÿdayºäÏtýƒ£4zä×´WŠÜ[àº¿¹òŸ�Y€¾;p¸`”l{|ôèÑ£ñ Ö$ÕâÖ�8àá*T?ŸäÓ®ïK8¶Ú÷i××ÁkèÖðøêb�A²ÿLA‰³­ýO0^¼¸ÓukòÓð?‘Ï¸Qß}-×Ï×–ÊuÿÀµS­‹©Ë×a™2�òg¬þ‹ZÏ9±¤
X€óà>l@Ùwý¢Vgž_ú+'Mšô²Ê¥ W—l‘í#€êgG ûó­&?yVÞ¸»úÿ�ò91P }Õâ�}HÛaÈ¨TJ4ß"Ë…ïÊ9K$º¯"c³Õ;Ò/�cˆø©óóŸpüåb^×ƒG–­‘�Š¥_þÔÿZ¸0ú_çÁ}eüµŸìŽþæÝ�ž'‡©‡~ºyóæ÷18‰DÂAË¾ÛvëW¶´›b"Œ5ZÙ²�Vƒù|ýûpmàó±Uxúªb&�ÀWxL^ƒý»êZ§òÜEvÊÀ=}~þ‘ò
²ÕzÄ'ä—wœ¼ÄÙ«%¦éœ4=ù®ƒóŠûÃ<OüvýeeÀ'µ÷¨‚àÐ¡CŸ”½ÐçÕ ±©µK#û�oïŸÂò|ÃõÅ’àfùØŸSºÕSÔÂ�äý/W8oî©qÖÖ�t~ßÒélm•G‹’ÎòªZç¿ŠË�¿ò:?çƒÙë+ð½ Fè\Ô–ÃÓ~ç…ë,üiÏûó‰¿ì�þæ÷pY�ÁûfÍšµPê’À1¡1‘tÖ·ž3(Œ}»9§žRÚŸ9Bêà1ÿûeûòd{ð+�ß'C x>[öÝÖÝ‰8[U&ÉÕõ¿^20p1g‘úƒãj¿ÿw´e?‹çý³}Y�A5(,,,Á`Am²�ÊFË¾F AB#$¿ßÉ{>^ñ�¹ù¸çæ0ÜTëƒylÙ×ÎÃ¯û¼},™Áò§_ÿkà`P¾®[·nSþ,–ý®¹‚àmª’+•ÑiÕÕÕÇãñ¸;hªe_µ©~eò´'¢|”jTßBá
?"RÊ¦Z<¶po­3þW¯û~`‡ðoòœÿüUY úõ¿G¸ÔøkjjŽƒÛà¸âúm¶…¿k© Èˆr‡à÷F�=GæJ}Ss´t˜	£D�YÊ|>>Áõëa[î+{�Èk³%}ŸïŒû¹ÊTëÔþýW:¯TÉùÓ­pÎ ˆ†††‹à4¸Í|Ñ§Eá/Ë‚úDoöL~8sæÌE2gºlÊ Rí––3¹,GR÷¡Ðšî/¬Fà—zço¯rž�‡x&/ý�Ùï“¢àý//r>ûgo¬pfÊ1üšðŠ¦öl”?múÿ}²CãŸ_€‡Ÿxâ‰WÁiOê³Ï‹>µèß§9‚‡dÎ´Q¤Íñ„S!í5JYhÙ1ÃùÖ.ÜûÓÉßÇò—·t‚käžà°z¿Žmêß§¨�Ž‘9ÓcUUUõ²gÚ0 ªí1q¥-]Aj�Ì„f›ë÷ÉßGòƒ[1$#À]p\§mRÿþ2àª 7�üCnnîó2‡ú”Æ�Öß!4ˆw~§ålp�ßÂ¶[ß÷øÇh}¯—ßÂÀ±|ýü¾¹?ö#ùC¾~q²Ü"ß gÁ]Îû¹á‡UsêßŸ§#-¸ÿñÇ_$ÿ…É¤úÇ›Ø—ÅYÀ>5��Â6äû�äézE‚ñ¤€|€×{}1cÆŒ…à®âðˆ(õ7O¸A(õ{¬L˜7oÞ›2¸—”Œøƒ(l]Ë9’Ñ7B±µ‰8ùlƒ^Ïþ~ÿïgDòÍï[×z\"·Ì¸ôÒK/½	Î¦æý|¿?7ü˜Rÿþ<¸©‡zÀ(ÁCK–,ÉSÖ…êû*£NeÁ	 {íUË¾j°¸žÑ`ÌÐ?Éo)�Ÿ\3ðW]Îêóþ›ú{êï;Ð–õz@®à?òóóKuc÷W¦ÅÉ3½ˆhp&‚"�e„"|	‹{aË{íùþÙ�äï�üà¸C>¾ ÜGÁUmÞ¯/ùýE7~ÿz€ÿþ€1‚©ÛÌ™ýúæ¸³Aª"Ü©ƒÇ‚šð'0Áûv‘üåGµœ!‡Ì§¼¼|¸	Žú­÷Góþ^Õô¢ Ø±²´2cçÎ�5ôÆfÝ(
-Ov’AÇ¾½±µ9?ìû�ä7\9ÙÔÍ¸}2L\'ÁMÅQ­èÍûeþEAÏÊÀ]œµÿþz*ÂŒ˜(»¸@ +Â„ó÷©¾ODf„A#ù}äßœì Güù‹¥Ú¯úûöí«.>)œü{OÅ_+úEóþ¯SÔWî<xð3‡n¥’‚áýÄi'?)ZÐZFâªE`Ü{ªeßçó”5’ß#?8AŽs à8.z+þQÑ/”z€¾2àqãFŽù<¡)ˆý¸+.�§H%°#,ID²ì®o³�«ˆäw±;ñ¡Æ4>�sà8è1~­âÍûÃ+
~Ë³<ˆ�¿^Ó�Þ(8Ü”pÖ'»H�@„E„ÑÀcö„¥‘™¯ÇsŸï§òC÷Gš“ùB€kà¸z–û¾ýúÞ	ñ8�ïË<l6Š1>ß'bMNY¢#œc�-ÈÂ@èGòCçÐ=¹ø!�5çÿ¾Çø‡DÆ¢àÊ@`'ð]©ÄþgYYÙv*,8vÊ”  yV­mD;ËÖ|=užv¾ÁCøþ~ �œ»3þaNà÷úS­p×¿ªøG ¼•��Ü# 9�¿L_½zõF¥4‚ÊôUðáæ$ÒÂ^/ÝP-€ch­Rl"„Ú>%¿få‡n5%týëüÐ N�[à˜fü\ëUü¯¾¸S0uñâÅùòV¡ËT°Ù ÇcNY¼Ý‡ÐDÑl@ìó8[Oô´0P<v­Éÿn¼)¿Aÿ:À!p	œ·"ãÏ'0F0å…^ø�(ð*”0e»›[�5	U ô'$IfNq°HÁ	+ƒ!|ï7Ûå‡¡Ë^ë wæÎ�û6¸NEÆŸ¹N€5.Þ!˜ôè£�.–ß_ÿ”ŠŽ?JÄ¨ˆŸ6DÄîÏK°p­•�>Í~ ƒg_û¼!g¥ü›DwÐ¡�îÁpG=Øs—ú8ç�Œ?ãœ ÷	¨]Y£ãG�5Wvl5ˆGO¥uöMd¨‘ycq¢Ó½�À1¶Á	‹nvì1ðl‘_tuÆ©ŽÅ5ýÕ?¸Î€;ŠCÂ%®óGÆŸYN@ß' EñÙ�Q‚qR½�%Ok•cNG'HƒÔv4c¥ Ëa„ò�˜ÑÏl€æˆi6öµãÁ¿�­é~”Ü+�¤ûÛEGÐUú$üõ®ÌgÀîí§ôuþÈø3Í	pÛðm'0VðÈôéÓ—JzwŠ·A]£ìhn×	m	oc0Ø[ãýÒØ2Nþòx»«[½‚Â�%à¸BãçÞ~p+2þtž}7yœÀpõlöíj.7>''gîž={ê¤À{ÝR-ûª=K8EñNF(Úl0æïëbëBõƒD|ÂòüôË_”è„. k€à¸¡8r»âÌp�ñ·¸Îæ8nâ³)¸E=“=Œ+îœîL	V®\YV__Ù–8pû…|ïÄ;hp€¼hý	M#ÕAc6§ÜøÝÁâúi•¿Dœï¾Æ„�ƒ6;t…Ëà ¸ N¸Ü`¥˜âÎ-à÷ös“Odü™èø Ñ õ,6—	Y%ø[¤{S§N]rìØ±$ˆ¡4Æ�ÒxGØÕl <ÇÓ×ˆ}‹ëY9�ðåßo—±nÆ˜úª««» ÝƒŠ£Xìã2ŸâÐ Ôƒ=‘ñg¦ÐŸ"ô_!á�2ä…’’’ˆŸˆa&ú5â66ŸÖœƒß`íRèòo”ºKõÉfãø«ÖÈø kè¼‡”„_¥ßûT_´½7£� —	}ŠƒÞ)Á÷	Æ�¿èÀ�	Æ‡$J•5Ÿb
 %'Œmwœ°0H«ûýÚòc1–!èOñ%|ðÁ…Ð5t®¥ü=û¸Ì¯xêœp• ‘à_0\¸páZ©
.Ñ"5ì%Î­;)O�ÅZ¤`Ø‚�ZGÜv úõ1V;šZ�Ú†Æ^�¿Ÿ¾ KèTÍõïƒ®YågÊå|?ªô_;N@¯pJÀUfc‡þyúk¯¤”_5x“Ã8t²ÉÙÒÔæ¬�ŸùŠì«ãl¯è§Ç ‰îÇðyÃ÷­‘1ÙkÃiãj;þÐt]B§Ð-£>«üLù»Ï÷£JÿµS Õ�æq•€Ù kw›<yò¯«««Oi­Ž0E,YtöK­ S:ƒPÇÐêç‡„8[öí®Ù1ûdn‚ãh}¼¡³I“&ýZ=Áw7çúŒú¬òƒÚ|@Tì»6ëßÐW	˜xjc÷0àiy"¬¨¶¶ö&ŽÕ78»e9«¬‰Î ká,Ž×³¸?=d†ìƒèp	èº�=ÝA‡ž¹>£¾^åÿF4ßïOSÿl`ÄÙ@®Z&šxã�7>ûÚk¯­?räÈŸ@¶°�(XÕ /-•ùo±T½]Ã¨V‹¸ì?ÎkºÁáœIµ
©>Ïƒ,�©ZÒû4úP�@7¢£9Ð•ÒY.£¾èÔ'êG)¿œ°@èSæÙ7�«^1á†nxvÁ‚ùìr÷Ä	è«V�?ÿ�b,Ub4Û¤ˆX*BA¼“†¦œÙ@ÑWçû8^+ÐùºƒZ#âl”{Å=ãÞ!C ù­qèÐ¡.èBtòt£t”ëY×Öó\Ÿ…¾(åïNÀ?`mÀ³R0”Ó!W]~|Ýu×=õâ‹/®�ß�?M2‡áü�­—ú�Ì™±²PÑô¡]á»­:´DP‡Á>Rù"ùnÜÃ¶Æ$î	÷Öçò§ZŒ9Æ^tð4t¡trGÊð™îC‡¬ðës}Fý(å�²Uð›¨Õ:‚±j3ÉS³gÏþ­<Fšô!°áA�DÚƒ1§ÎAò½X«³)ÖæÖJšN»Kk…’A¬mîpÖHëÖÐ/�ÿãXas§³^{ƒ|¦,vJ®Ñê^kÛÉ„³·1î~ÇNZp8òcŒ1Ös5öciøªºï—î«¹~õ£?C6 öpZðmƒ#¸Sð€àÉ‡~xé¦M›?~ü6`aÀéÆcŠ±•1ž%øWŒ¹Áð¿�J÷SëúQÔ�þz›ä"®üGð7j£ÉÔ¡C‡Î“ŸŠ.©©©éø3ÄNµÝúç[Àúúiû>ŒÆc‰1ÅØª1ö3|V÷¹¡g`õ£?s6`vß48‚+‹…cÔVÓŸ U�8qââÂÂÂR©¾`aàvÇ‰4œoBp‡1ÂXaÌ0vC5–c®,îÿ›~†Eýè¯WÓ­> ;NX,¼Ý]{fVðÁ)X=;eÊ”7ŠŠŠv=zôÓ4\V8ŒEqqñ.›¥#Œ•;fŒö£1¦,î1Õ÷¾6Ï�Òýè/„ië=9ÖÔªwæx²‚±‚VÎ`Î„	/_¾|seeeRö«_î­áÈgR-ûªÍd@VÈÙ1Œ‰›±žhŸÃÝ{ªªÏ9~†Ïy~”îGÖN  #àÔ€ÅÂ!ÜGà›ŒQE¬{?Ì¼õÖ[çÉ+¨W—––î“m¬�I¿LƒÁ§åú�2A6È(²¾™•ì÷ª±ãí¹Ž?„Å=¦ú^Ã�Òýè/-Ž@+rÕà–nÓf#»9fHu¿+x@EÂÙpXîZµjÕû»víŠÉ×Ï5ƒ´3h»ã„ÉAàeŸãžóòòÞ‡�2)Ù€¬�™‘žF�1b´gš�1eU¿{q/2üèïj:}Õ€ûnöd=8N<ÙÁ]‚ª÷ÒÏÌÉÍÍ�?sæÌeo½õVYyyù¡½{÷¶IÑì3Í Óã 0wÿ÷€%:Üî÷ˆ{U÷ü�’á.O”gzßƒÑ{¢ýÍ\Ç×«ú‘áGÿ×ÞÙ³6†a‡J†Rè)ÄR¤Å 8tèG7—.‚¤PÐÁ? äH~AÜuÊ »C6ÿ€³»tèàóâç!ï±¦õ¾á¦CrÞ“×õ~œÐ®˜ü{œlÖe`K]ÎX „‘´o}ä'ã‡Ö¶¦iÞŒÇã·6Û¾ŸL&¦ÓéÇÙlöÙÀü:ŸÏ¿ÙÂøn_[þiÿÓþ´@k3ô™ý´sƒûÂ@.=_,gå5Ê©}½öG¹¦\[Æ°º/6æ§2v¹‡Ýë]¹§ƒ~äŸå©¶}ÿ¬#€g–gOo¿súMö÷¿Ÿã|eE²=2h83ðÕA[ÃL
Þ‡Öð‰ï­Ÿù³óçéKë±C{b}å}í?Oüµcï‘_{XÆò1û=üžvïöaxŸåÙÓè› =Ëüð8Oà++#‚Úª€-Â²•g¬‚Ï–H!r(Qƒ”>¨”÷¶Ç¸äèÀîŸà™åÙÓ/›é}‰_›í¾r¶upxèOXl·W.¶Q{m9¸ èÝÐ{¡ñõ!õñ/‚îÝöÖ¿Í,ï'øæU¡×2_¹«‚\ëá 1
¡¤°“ˆ¡ôvKô-ðRÊ{¸À}ìÝô� {?òÖ3è5Û+ÿ›z‰6–Ha+C[t€(º—ë|œ yúÖØ7à{‚^‘:!“Br@¡·:¶OÈè)ìuà½" 5!)°R@È�˜ˆâÏÊµŒä€nt`¯ /èÔ…@o&b@‚kÇr-€y:°W€ôŠÒUH!r@´w¹2F{-Ø¼¢ü})äb@±k—iÈsÐ»¢ü1 ‡z8Â\ï�®(WVy·¢(Š¢(Š¢(Š¢(ÊõÌ/¥h—EÞÔ    IEND®B`‚‰PNG

   IHDR           szzô  ¬IDATxÚ­Vëo“çõ§nû&mšúl·Oë*ˆºQTu‘PË¥í.HûÐ	Ö@¹…4I�ÀI±Çqì\mÇv®„@Ú…¡’8ÛI|·ã˜Ü7��ßóÊ—µÀ²©¯tt?ÏïwÎyž÷’è¶z5 ßíJbOgâŸÝ‰Í'=‰Íà•ä¿Ö2–9Y“©Õ}[W[bõuWbÝÙß\éŒo +±š¡‡Ü³˜åîø&:cëèäïŽèúŠ+¶élKàõÿÛØáÇ÷œÑ5½3º¾êŒ­ÁMñ 	!Aˆ8Ãd,ë„ª#\ìqÆØKÑúßÌWñ#Glýq{díÑ5¸"D”âSœXCg\‚ÖÒÈ�Z'{œÑU8¨á¤–hníÈ£?³GVCŽÈ
Ú)ÂRí$ÜîäøÖâú‰Ž	Í< *½
*„ÒŒnüô•æ®ØÊí¡Õ -¼»Â
ažáT§°ÊÓÐÐ»°ˆÏzPqûúâb(5™õ*¸ƒý{h¶ è­Åã¥O¹-¼ö°•…m„j
I³ˆd@a®>ä•^T0�Œ¢W¯hÈa�¦)ÚâñÂ·„fZÏYD�Û‚„4¨0LsAçMl/¾ °ë\5,�<pÒˆ'&Æ¯õ¶	BJ‹Ð´Åë?ºèÊZ‚ËË’P‘mvR´‹»tˆIˆk�JïŒ â�å#cx»ìÜÞÜ\sq×4#ež>Õö´*~¾,ž™ œ07Í/¡ya	-)�Yì`€��½!˜z`|0›Ç7çíAÑìjtwk(é»ƒÃŽ+hñøÑ>5�Ûì»a 1M¢™ è%fm÷ÀkÍ�Ô’˜7§C�[É®éyì74b×ùËØolÆG¦6ì¾dF%w|#º÷ä<NôÞÂîªzì©iÄÎ³U8hïE~¥o}^�ê$‘Ñ&š4–0Kâ­³Î-í´úÑ4—Dã|R
ìü�ÿ=
oKƒì@íæJ˜÷pl,¼MÃCîk¨x8©BÿÉÖƒsCë§ÃØ_ÛŒ#í½ÔKRŸà|£æ+Y¼uMs©ZëÜ"ý
R¨øâÝÇx¯Ê¨~7³ÁNô—pØÕ§ŒO\ÿMÞZU¸¤Âé/îã�;Ã¤Ø£…øuéÅŒn“?© 7M^ªÕY|‰!«/2'Ø@±¡8P×B¡E8˜Ü66‹ürX�¨RóÍJsaœ`'�žfê·�Z;ŠÎQO4i*Lˆ¹òô'‡`qB3—qÄÕ¢~Ô�¼¢28ùd7>šÀ¯JÊQ|{${Ry-”h§FÈÜöÂ³h™Kp¼ˆÚû£Ø]Y—@}åã�dzë¬ÞXªa6‹À—f)ŒãÞÃcî«<Ær”?B£�Bl¦˜ý}m~gl–ymgÞ8O õópóKùAuNößCÑ$+(�Í/¥³0€eF36“XÀE"
ût;K. æÞWhöÇØ¬š´€Ä^½ûV«S#Ç�î2.5‰SWe÷ÔmM×ìÝ¸hÓ+*¼¤k˜‰zÌ3äBXYô©£ûùz½SVû¸­rß( @12ŽŠ‰ÞÅ¨~<‹#Ý¸ôxFæDOùìD¡qD= 3�Ž†ƒfN˜§e’ü,ŒzÂâYÀ¶ã¥¨_À‰kCx«ø<¬üÜºæâ"¢Í2!!"Ø~ü4j<ó &�sëÂj.â­£Y5�\Hº
¾Rûøºý1ªøÖß±ƒXag?ú	´ùh*&b 6@ƒñ9ì8qZ3'®’¸àÛÀZÑ4Ô'kož@(Ï4‚Ât–?n°áÍÃE8ÖÞCA-Tõ£gx�_¹üó¼ÏÃq•AìÞ¨
abMùÐ}ì­2©ZË¸ïž®À¶£%¨Ío@¼Õ§¸~*œãº© „�“šŸÂŸœÄ/

åýVó£^Ø¦p’¡wÎTâ]~�Î\ÿn~²ûâ8îºŠO�½èæm*Výoüù$>Ô[P7©´3,žâ­“Ë4ÒkA¤ù·üýüÐq|XÛÄ¹€Â¡ö>´8`–�AÝ¼‡½—ÍØv¬¿a˜½Uuøû>2X�Wx¿<ZŒ7N¡¨&êR#‡úì?#3áï›&‚Ïë¸Ó\ÆýÂ4[P¸Ä[°�¢mc^˜8¯‚‘ÍäÏ{p�ŽtÝÄÑžAT=˜TkµãóŠs!^â©Ë½ê¦%i3áÜ19ƒ�[ºðþE=º}´ð>ÚøtÛGg±ãX	Îþõ0z²µßÐódÆ%º¯_}“øŽqbþ®‘¯PíK 5|ÒßçQçŸ­DYÿ—ø¬û&òøº~â¾ž®ÉÖg8;®£‡x}Í>{+Xà—c{1æ2|¤óö0È>>¥·G8§L2LäÌeÆ~uô¯ºêÆC?1zæübR3æGš¹s/X'ær˜59l§ætðÇº­\’’�w•Ø(A&D(Ã¹ãìz–sÇ¢õßvþÂg‚»+©õ?—Ã¨/Ã
O³Lp-Ë
ì�—Ýó-ŸMô†QoR3ò‚üJ°>)=j×ßÖåxŠ×Œc¾<Ã“Ùjîn�ðèŸzS4LéŸÎz8?hxâ«6°Fj·ªûo×7Õ©,V‡Å    IEND®B`‚‰PNG

   IHDR   0   0   Wù‡  CIDATxÚÍš	l”×µÇ?c’(m^eyOHO•
j^*”D*QÑ£J£6Mv[	K’&‘<RJ1$`v;6¶1¶ïØxÁ°ÁxaŒÍf{¼cÏx¯³x<ÞÇ³œwþGóñƒ×¦iÒ÷®ô×wç~÷žó;÷;÷ÞoÆV¾«rùòeåæÍ›JYY™R\\ìSUUåÓÐÐàS__ïSYYéƒ6Ü+//—¾ÿçåÒ¥K
‰jjj|ìv»/×ýX“ÐöpÉ=?ôÅµýŸfWÙ¶m›²~ýze`` Ð�âv»•µª¼2±ò³ÿüµï±Ø„'3/å=…žŽòg³~å;sîBe�ÿ6ôpŒôÝ¸q£òé§Ÿ*%%%ß¸F£ñÎäÐÐ '5uv+“YÉúêÒS­óûûû�ŽŒ\rÚÇêÜŽñnrŒ[!ÔÑ†{èƒ¾™/=Õn²(��=òd<6Q_ßi±Z­˜m¥³³ÓgxxØë¨¶±q¶ÍfKb89�äv¹ÜcNõ;\Ô;î¢n;äD]Úp}Èé §Ýnéç±°¡Úñ…ø‚Ï¸$%%ygÝh4NRó»ª¶v–m`àª{|Üíbp‹ÝAÕCã®BÛ¸ã‚uÜ™mweYî¯m¸‡>ÕCÆ`,lØlW+kjg©ë¾<uaøV…w/|OO�ïîý�JHxØzz�<ã.§ÃA­#ã®«V»#ÝlwŸ±Ø)£oœ²X9V�gåŠ¤Ž6Üã>v:c§t‹Ý}µßî€Ø‚Í£1"$,ü»÷‹OÕ?Xþ®Â[ ~€YK{‡RZV>ƒó·†gŒzFìÎü¾1gªyŒÎ˜ítŽá³
€Ù˜�  «GhIQ&�ÁXØÈ·Ž9a¶9­jà«Å`ß*˜¾QÉÎÎ¾¿X9ßMÖ~¥B«ýÍÐà Õa·S¥mÔ‘js³èœÙ+!PYª$‘ÔEž>ç 	|LÄ¶X£nØ†øª¨ÒþÆlµ
ƒÊ“““ó·àmM:÷õY}]ÝÊÝÊªß²Á±ÑÑQ*ìu&Gé¬i”Ò!‡2D² 
8îyÛ }¿¿:¶Ä&Ûf#Nø‚Oøî`°xv¿¿ÊÎû—Ë¥´µ·OªÔj•Âââ—mýýÖ‘‘Ê3�¸záh„Î°3–'€¼Aˆøò0‰2û&‚Cƒñ�ØóL|À|ÂwaqÉË`“ÓéÆÿµà€ÉÊÊò™;w®²}ÇŽáÝ@;6<Læag|/ƒG(M$uoÈ×$éÑ;D;²òD=ƒœ¡öQÇ~¢]ö_ð962L`øŒYæÍ›+l`|h)**R^|ñEE=Y[ZÛ"íCƒtÛ2èˆí¦´ÞaJõ
Ÿ%¯ÎB&\‡éü€›üÓré£3èÃ´´-ý"å�¥õyÀeŒ
[Ø�íßcÌ gõäž1cX¾çëõúI:�NÑ”•ýzÀÚGmýî„î!Jæ  ÑÄ ÔY¡Îí96­�I¡…7)øFýêO{)¸´’Îs{*�—¾2v"x
Ôsß_B÷°0€L`crròDø…*áááˆP^°Cþ ÍF¹=Î8 AÜ—áQ
>wŠR¹_*_38ÿ£ïuÑªˆ8Z•DGï4Ð¢£‘t°è6esÉ]Òc'Úùº¶ß`°˜ÀF°.X°ÀË�rp˜L&¥H£ù­Íb¦:s¿ûtç ÃRR×‹¯Ýø,Žäs
Ïâ9«C rX|=×ç` !u—‘™Îæ”Šiî¥‡Â)¶¹›²¸Ædp_Ì:lÁ.$þ¾¦Ó|,`Á:!€O>ùDQ_ø1¥Øø‘�ï¶9c;Äx"àUuógn‡ó3�ýR¦¥Ï/SÀ…k´/_Cw(Î;mH1Í4�R/ê­¼&þ˜’C1µ­´›û‡Ý¬¥³]6›^èD¯ÏC³Ø¬VÒéõ)êë˜¥øøøà¨ö)((P>Û0µ·«ËÜbî£¸›;�!Ø@"‚m˜ÙƒœßKŽ„sŠ$ÒG©¹äŸ~‰6ÅgÐ’²8Ÿ±�9UZŒÜ†	´4(’ör
­æ´Ú•§¡’²ií‰DZz$‚Ýb›vØVýÀ'|£MXÀdìî2ö—]SÁ
f°+“'Oöî<EÅË­&#iºû\'l¬ƒ`©†â;úéàKîÒüý¡t¬¦•Ò-ãœFNÊàk§ÓW#D	œ&[“3i	ÃmŒK§ÀR-�Ò›(³ßEëO¥ÑçåôÕñ:F¡Úš·?„k*(�mÃüAð¿`Ø
ŠŠ–«;Ø•ÇÜ€V«µ˜L”Õauœ2°!6/²A¨Ë‚[CËj(¾ÝJqí}’Ëéüø?Ë¸Hosp[Ò/"ï±F0»H	6àj­çê,ÃÆ¶õ‰�ýà;ÇNR*Î ñëõ'`ÉîèsXÌ&£ Ø•Å‹{wŸ¦ÆÆ‚Î^#%µ÷9c cñF!ÌÆé6->A';Ir”û ,J«£e‡ÃiÃE7÷àiÈ‚L ‘¤Ö±êZöe”úte]E6tÐ¶‰€Ð¦úƒo(ÖÐÏLV'ØÀ¨îF`WBBB8‘¤ü°U×Ü¬ë12dŸ`�„¨½_rsù—Ñr§‘Ü�Ìîþ«7èÍÝ‡( à‚Á6éy2Þ
( ¹}ºÅ,ëáCÃöû Ûõ´<$Áˆ�ûþ¼&°�¬ ö+W®øÄÇÇ+o.\4ÕÐ¢7Õv)¦ÕâŽkëã <òÔO·Z(�óöÃälú0!ƒr‡‰vfçÓ[_QD];§…}�Ä.¤¦…*@–¡�¬)ÿ”lØ„mñ'~'ú�i³¸ë˜­]¯7½¹`áÔØØX%//ÏGV3~Y³aãOÛõºÁªŽŠæ bÛ,HV…Ï²¸Bªt´�S[çœ/ŽRŒ®;7{g,‰û]¯  Mê…IÁ²òØ)
ä{øt²±ƒæ±�°ÚvoŠÂ·×g«|¦ªÎ^#XÁv,\ŸŠŠ
eÕ»ë§µéš‡*;º)ªÅìŽe˜Ó"Ë�j1ÉITVMoí9L±œ	žÔ�™ã>ÈïpÞ¡fùÿ‰~É
¯nEÁžŒ]~š>/¼-ïE+9�üyÁ§G`ûÃ,ÌdqWòä‚qåºõÓÀvüÐäƒße^{cÎ¿ëï5šµ†.ŠÖ›Ý :%2y®†¯¬ž‘åG�“ÿ™\úâb‘¼BœÂLy„@Nê�ô{Þç•Èu“'ÍrP­=Iû5UÊOr]TÖîA€†�|Gó¤‚Œ`3Ø•ÄÄDu?ÕP[£o0tÒÉ“ûöIŒ@\×eáîäÔy'4FÚüÀ/iKüYJ7Ž`¡¡? $]dñl¨ó² DÚ–Ÿ@ X²ÈRüÜéER�Ñ›\`#X,ì«V­Â–„ ©¸s§Xßn 8½Ñ#ðF–\!äºl‹+C¢y?/Ç²«¬;CÉ­&yˆÖõr»RTIÛâCa|÷žÀG7÷"pžu^¨çõçà™©×	60‚Ì`W{ì1ïAv­°ðD{k+�Õu;£tìLÇ ½\Eqüxì–×ä¤”ÝeSìYš¿û •ÜÅ+5RFÎƒ“€�^,FYö‡È9"O¤�ƒ¨ÖóûQÅó~ð£
`ØÀ¨d`W|}}½/r±	‰ïò"¡+º×q`c˜(º©G ö”ÑïvÒ\Þ÷÷æ—b§À=I­=×nËÂÞqšNT6áŒˆ{Ý²;í-(—÷u“ØÃïJoqàóxÜ�Â[ª=ñ)Áð5Rgd&ƒl`T_èÀŽâ=‰ç-\ø|}MµU«o¥¨æ^wÏ Gl´[òwÑ�P
dG‡4•Øþ�â0šg4Å iÀ{z½p�ð¹C‰-FJî´Éé¼…ßF?â=?Õ8*çÄâƒ¡t”w´=ù¥\?Æ;Ø Es°€‡à,`ª¯©±Î[¸èyõ$VÔrôèQ‰ˆ«~EÅÅÙ-:¥6u:#›Ø ÃA˜Aì.ó[çâ}GiI`0mI=�“¼=R^G«ƒ#é´Þˆ@å`Û’–K¿äþAô‡¨x
8•ròéÐµr
)­¢Ýç¯Ðïv|AË9ˆE{�Ò¶Ì<<%øÂ¤<Òš:œ`*f60‚5((Hñ–©S§zÓ(($dYS}iîµ¸�¼cuC»+ÿýå²¹­¶c�ÈÙ{åv!Ì"‘þûö�üÝxo©+9È%<Ó˜ù•¼“íÊ+e{¥p¥‹ãT›â¥÷Z\`›š>`ö–)S¦ QIJNFRý°¤äºF×ÔD)�gä=â^—ÌŠˆë±žmu§žÎŸ/–Ð‚ÏS"/ÖÈÆ.Š¬7à�Gz¯‘Í§R)´²b�"ý`KlI "®Ã7À&°%§¤`Ãæ	å•W^Qøëš<…Àƒ—òZ [M®H/¤÷ÊP�Ðmq¾‚÷øMœûgº %°iœÿÃOÑ¢ƒaØ0„à ÕÞ?|ƒ,�.gÎœ©<Pž~úi¹ÆÅÅûá¡œÏ½�¢kl ‹u:Gx#Ïˆê”'"Ô½íêÓ�…þÎ�:�¯¡WJi%r|îKZD1ôD[RW¯â‹}²ïf‡®¡�Îçæ¦€	l*ë_ÏÞ~ûm%##Ãå…Ÿÿ|úõë×›ï5ÔÓÙºg8;ŠVgK¤Î¢Wœ2xôX|òš±„Á‘ïø�R}¤ÿÃ%>ÂºØ§ÞÙÄð`ø�^˜&°�¬-Ï<óŒòúë¯+ÁÁÁX“¶lÝ:çö­[Ãuuu”\×â
4‚øŸ(	 KÒGo‚P÷ô3Lì?Qb;Œ}¤°/ø„o0€L`ã_-¯¾úªòþûï+� ê€Ý{ÖÝ½sÇQ[[Kgjt.8  `"½êx ~œ_�#y+=.âúÃûÃŽWaõ�”Æ>àëÎ�ÛŽ]»w¯XÀ¶¿Yüüü”5kÖ(aaaÊmß>¹÷ç�;ß½Y^>\_[C¹Õ�Îˆ:…#¾BS÷T?ñªŽ‡­nƒm>¬¨œ}í`Ÿð°€	lß¨<÷ÜsÊöíÛ‹Å¢lÞ¼ûÕä7ÍçŸ3Zë«µt][ãŒ¯Ñ»Âà\àÚ¿•06`6a»àÚµÖ›6Í‡OøXž}öYåï*³gÏVV¬X� ”÷Þ{OžÄ´éÓ_HJIÉ¬¸}›ªµZºZUëŠ¯nvFÔ¶»�!N›ÖqQEz$Ÿ=÷ÂXè‹1{…mÀlÂötö_ð	ß` Ë·*o¼ñ†üjwøðaÅßßßoÎœ9�ró“nÞ¼æÂ…w+nÝ$mU%iªª)»ªÞ¯mvFU·¸"jÚÜa¬c	…Õ¶¹Ñ†{èƒ¾šÊj°Å6×Â6|lÝºÕïÈ‘#øÛ±0üÃeß¾}ò/ééé>Ë–-›òãýiõo›·lYŸž‘‘§))ª¼u‹ª**èv%T©¥Bä?=B¨£�ïUIŸJ†Öaìæ-þëa6a>nÜ¸!>¿Ë‚­Fåï·ü‹€ßk¯½öè”GEjýxÆK/ÍÚð14Içsrnäç®ZK‹‹F¡®_ÍÏ7äò½¸¸¸$ô�ñâK³06`6a>àë{+™™™ê+8~Öðýàƒ¦ðÁ‚@&óõ	¾þ«¯Ÿßó?™6mæK¿˜9ûeÖO~:m&Úp}Ðc06`KµýO+òîÚ5ü£‡ü¿°°Ð7&&æ‘Õ«WO~â‰'Ð#)Bmüp2ú /Æ`,lÀÖÿ—Uø×¡ïô¿¼æ¸f°šK    IEND®B`‚‰PNG

   IHDR   @   @   ªiqÞ  ¤IDATxÚí[	tUåµ¾œª»êÔWìê`[ÅÚª]¼ª¼" ØÊr ±ÏöQ
OT° …0È\ !	IÈ<‘‘@†9!džç„›éÞ$77óMî°ßþvÏ¹ç&Á�§µv­žµ>þ?çüÿÞß·ÿýç$èþ}}MWrr².>>^§KOOwËËËs+,,¤Ž{‡–çIIIÿÚb£££u›6mÒíÜ¹S�6›m4�a tcè õRVžI[ôA_Ø€­˜˜˜o¶èððpg½¨¨ÈÍáp@È(UÜØ±c�Ï_}õßòõõûnDDÄ½€¯¯ïwçÎ}õõ9Úªý`¶`ÓÕ×7æ:zô¨“l[[�þðÃ�÷Xà=•••3­­kÍ]]Ñ=}}™ýKõÀÀ€q`pÐ¬Àˆ{=½}™hc0¶®­¬ªšy·jÇÓÓåhøPï¥¤¤üó„?~Ü)²¥¥#>
eyY©.,,ì®úúú¿°˜‹eÀd·Ùˆv†ƒø)5Øµ:	äúô˜:ÙFÛ
»«¤¤D×ÔÔ$Ù_ªpùZ¯ââbÝ¥K—tiiiº¾¾>u^cñúQ‹Á°«¯¿¿Õf³Bˆƒìv´ZímVkmŸÕZÜkµ]é¶Ú3º­ŽK
PÇ=<C´°Úìè°ÕË6a›Ó©ë|ƒ¸€Ó×qA°Îb±èºººÜ:;;GŸ<qBçããsgssónÞ-£m·9,ƒVÛÕþAÛå®AÇÇæAJ4RœÉ*H`$vîÉsy6HÇ¹ú^í´ÁlÂ6|4±¯ì3íäI8€8�Û?êÂÖåLy½^?J]àJKK_ëîéi°Y­D6«½›ÙtØ�uPlû Å0âY|’i€’YÜ¤…zmÐ}¸?0@Ç8 °Ùe°g|ÁgûVJpRêàúÕ§¼jœçö¨)“&éÜW¯¾½©©9Ø20@dtô3¹ü®ÈGµÐa&žÀHX�¤ ¹CÀ‚QªÐž'j€Ø‚M±ðŸðÍkÂ¡÷ÝWßNà¦ðüê¦Dvv¶S|kkëè¬¬,]rRÒÏÚM¦ÂÁÁrX¬õ=ûÑvE´Zèp›…âÛù61\2‘(‘¹'ÐÚ¡÷Ø†øªïé·ÛÙ÷àà �KRbâÏ²._Ž*_pÿÒ—Õjc£ËËËtéŸ|2¡Ãln´rô-ý}Öls?E2©hF\› D¥Œ\$ƒˆDªxÒ¶†!Š}ÁgŽ¹Ÿ9ô[™8}ÂÜÊÊÊ„+8ƒû—ºjkka©ÅâË±êÿÆlîl°ïÙ¶Ó¦~
3öS,F¾•K@ À"@Ô5aQD–pŒ>`�Õ—øp´XÜÀ\ÁÜ¡áÿu�?^Ç†pªu’WÛø¸¸9Õ,ýdîéµ¥¶õQ˜AˆPŒ u@ˆ@„‚qŠyÆe‚ò|äˆ«¶ ~¤?pHmû;§�þ~Ç8æ
Îà^QQ¡»xñâõk±ˆðžëöÀè/~ë;£1¿¿¯�ºº»mÇX|¨�Iû(š#ÀÏZ„´S¤†xE|J§�Òºt²ÛŽ:î)âû5áêhkâ×é\ú8àÖcã)Aƒ1œÇ?ø h(((Àáìë—Æ?üáe{apÕ÷ööRow·5­­—BZÄ9E�ÄP2ÚèÕ@h�Qç6ÉfTÓ|Ÿ`š „
«y°â™šCÅµQ.>£\2À)�ƒ ŽàZ[W¬n‘÷Ýwß˜7ožnÝºu8rÊB’››;ßÜÙI–žnÛåö
née‡½% ©	*�  líƒÔe«k¥™›vÓÿ†'R�nè ¸önÓ«‰‡-Ã`[õ3Ä¤Â!˜ƒ�É-Ý]6>B¿fÏ‡>¤�öððmŸ{-X°@^aÏœ9£Û¸qã÷8õëû{º©ÒÔeifg€qŠº8Ö€Ÿ%¨÷R2§û¶‹ôì‡ž”Ög¤þAÒI:ÑCJà ´×ú«âµ «4N(C™#¸‚ssß°aÃ÷xwÐñ4pƒ¶Ï¼Æ�§;ÁG["’Ñ/++ßÛÍ‘4™ÍÖC�g-=qŽRB€@¨PôBîÉ(ÕiÆÆ]´4,ž–…'Ð³œÓ7ì¤¥\OéTúõ
4[šM| ña~à˜`èÎ]Ì š ?õš4iŽ¹òbãïç÷ ¿Âvõuš)³µÓÔÄNš{(€C
- ZF =(5AÜÓ`O^%ÍÝ$Ø[PCU-ô”ÇvZ{”Ž˜m,¦G>,ÀâO Nà qCÄ ç>žºœÁ]þþþB´Aã5/777]ww·sô‹KJöt™ÍÔbê°E5uqd»)€£&©S Nµ D¨ÏqÏ%M¥·AÜ§¼åEˆW|.mä•_M¿]½‘ö\.¢x¾‡6áOD«Âá7A(·gp‡†’’Ò=jpVˆÖ×í·ßŽ7+·þþ~�»»ûø�ËØcî £ÙØØ%Â¨Ðˆ	äYlÛ€lkGMVJæÔOâtLní¥cf+¥˜m"^€€ÀNc'Ep‰´O$Z‘”F/lõ’!‘×�#Ü÷(6cÚ,ðq-ñ#ø6vS†ÁìèeÐ²zõêðî 3›ÍnÐ:âº÷Þ{�£áÂ…ÅíííÔÚÖn‹mê¤`@ÐÀ	¢u“ÂVv¨¸ŽVrÿÉë ÍÞ±�^ÜæEsþ¶Ÿ^ûÈ�VÅ£há]²­aa)|¯l¤§.ÒîKùô¯ÛÏfÓ»Ñ)ôÂæÝôgž&îñ©RZ/>Â•þR*œ4Wá|˜¹·¶·ÛL¬å<kR³ ZG\¼ZÊž‰zyEÅñ®ÚmA�l°“B]‚0W°8ŽãÔ^™D“Ý?¤9{ÒÒ¸ã´6-ƒ6¤_‘ò�ØTZÆ÷`Çå£�<Ï«›i}Ê)š»Ë‡f¬ÛNÓ×ï -òhéáTúÃ™«SÏÑ;üóK»ýh
Û^“_Ê ç~€p&p‡h�&hƒFh1ÿM&“,~o¼ñÆýú†Sg{¥5u8 \êâ@JqÂ÷pF_Â+úSk¶’gv…¼¾Æan›¹>Hq”	˜fdI--Š¢ik¶Ðï·í¥eñ'È« FF5Ál§ÝÙåô4?;Tm Ä.ìÈÔÚ™UJS>ØBË"’àS|‡	ÂQá ïd&´èM‹-º¡uÄ: žúÇÅÍ1ØCí1|8	Ò›Ù‘Õ8ÂÏ"yîîå}2/^åVòâe“û¡Ü6mõÌ?ã'¢²‰FÑn;w_mÏ(’U=Þd•ƒNFUÐI¿ãÔ_ûñ9ŠaáÁWM°Ç¶í´+»œ3a#ysÀ°¸Â8©ˆæÞI¬�µ´Ú¡	ÚÔÓáˆP�ÿç/\Üfjm¥Êf£íV2$âˆ‰uÈW›¿Æ}L/íôæWâ>´ƒpŒ×;„dQ7¥ž¡©œÂ/yúÒ®+e2¢1­Œ:ÈJ6…3P?Ì#þgÿZ…ÌqÚ{¼8¾ÀkË{‰ib#˜ï‰pëäçÂ š.\¼¸M]†,„o½õ–3 ù……I­FÊi4Ú^5Ã)„pãNâ{øäõfx"ý÷Þ@YÔB@HŒ¨j¦×vûòÚ°‰Öœ¼(m¢�ýê®ADÊZ™rš^Øæ…�B]yÍýçòóVd2ûd&U°Rºpe°h�&hSðæ›o:õãu71)n--+Ë3t¶Áh÷¯c
¨†ÝzEó\\Î[×‹
Y8bR8ñygÓTN÷ÙùÓÁ*ƒŒX¨íP§ q®"%@Û.Ð�mXcÄâ†ûˆiÂÛäzïÈid8€‹ÆË…k šJËÊó Zñ%Ùy544`Äàð/$®¶Zè„¾ÕîãD¤Å0JœÁ9ödÌK¤·_q"y‘Ù~ê=ùîûôvt
NqØ²`P�þ€ë=�†M9Nç…p—ÍèÛ.»�OaûÚHž9²õJ „—ÂP¹r š ¡šUýxó“ Ìœ9óþêêj“±¹™R®¶:üÙé!@5ŠrˆÔ;„Ø,>¼,âîHÑæãçèñ¥îô~ê9Œº3hÚôéÀ\Å«/€ºöŒ‰c*øóÑx¯øÛ/Ê:XÛ*Ûç;aq4kÛ^øÆc$Gpg¬Åè067QkƒFh…fU?^% /¿üòx@�¡©‰’ê�ÿ:	 R7qÝÕî·	AÞëÿÀ‡ÏóÙôø’ÕôÁñó$)ÊÏ !Rr*sé‘xœ<ø-0B¯�"€�©?cíVÚ|6!™åÏ6iÅZ9[D°Oø`¯:á+÷¡ZM�@ÏìÙ³Ç+¿ÍÒÀ¢% /½ôÒøªªªž–ÆFJ¬ã Ô¶‹€ 'Ú]GjdD|ùà2y…‡¬	Q<²Aµ (¢´å{Øjn3áí•‚U‰ÜÞ ‚ÐF‚„oëvÐº“—Dl4gÅœ{i®W€DÄá£”ÊÜ¡!Q@Uu4B+4»~ü” L›6íg••-�”\gpø1YˆDY‡RàêÔy?’ÓøÞž^åû}$§s 3H’- ÚÊËŒû±³ôÄÒÕ÷Ô³¸§Ž¨+ˆSþÙuÛÈãÄŠãýqHMYµ�ü*š0…Fð „Ÿ:X
w? ´°&œ; Z¡YÕ//A8~ÿûßÿAIi©¾¹AO©u-v_1ÒªoÕ ©*#²îX:M^¹žöÕrên¡QIò±3@!‚@¨RD®åmqÍñqÜSGT²  ÊÀ‹àfÚpú2Eñ®°þt&ýír	ÎìS8h™©ðÁ�ë¬�µ4Û›õzâ7\=4B+4»®:þ=NGßÉÉË+lá œ®m´ûÖ°v @‹Ô5g¡,æ÷ë·ÓâÈd9¹mLÏ’u`EDÎíÈô×F«VJõ…ÊuŠAŒÄ·¬A¶Ð­ò•-RI¶c„O5(]yi wh€h‚6h„Vhv^H‰ÌÌÌ1\½ñâ¥KG›õWéR­Þæ+†ŒJ ÔR«¬6©Lsçy¤0F	Ä±.ÜÏ¤«í"Â¿Ê€QQGv2Z±-[ìGØZ9åwçT åÅW@µ‘K#ì ®
uå¥AyÐM.^:
�c yÈÅ‹ŸÜ<’’²»¡¾ž
kêmp"¨QJp­WµÈ!e)ïõ/nÝƒÏ^ ˆC�aO^Mãéð;†_½  7$v%X›>ÉâØ@Ê0=¸|·â „/KXW�›†÷ š ù60ØC.|4”£°—×Þy5ÕÕTUSk¯n!U, �‚”~•ÍÍ+ôÛ!‡iêÊuä™žIaumüŒEV¶ •¥ÝŸ|Bè‰wVÊ”ˆ®oÅ‰v±×k„rO>pü•¿)ünãNå6	|x}m;qŽV²ÿÜ
l©Ò^¸ãÀ4@4yyyÍƒFhþ:Œ)€EaÔ3Ï<óHQq±Y_[CGª`¬Ê Ãøg8ÆÈìÎ(¤§W­£Y[>’}ièa¤,ž#]	„ogOñœ~öý�´95�b˜|åE’)m!Y…$ù òÇý‡�IXùe�y;(š&.{Ÿžáíq*Ÿ¼²J°n Cã†œT)¥ªÁ-ÐmÐ­×zÖ­Y³æ¼ž;>]_[K•u6_Ì7q NT0©f!7Ï'˜^æ“Yb'Ñz9é¯kè@©ž$eF$ÞâšD½–@ßý€~ÏÓb]â	
«h XÎ¼ XþLÞ‡ûÿ×2w|“ðåLó.Ñ³íèÃO.SbÑ[vÓ_üÂÀ\†ñk‘ øVYC­€&hƒFh½æŒ ¸…„„¸óš@å••¶P~›óƒñJ8pb°2³ xš±j=æWÐ[4íýMä¯´E	"ï†Æ‘çÅ|,�8åñVYG‹x_ŸüÞ:É5´`ïAÚ~ò<(©¡Ø~àCÐ²ˆD:Ä¾cù|p˜3%¤LOS–¯¥¥Á±t0—?˜¬ô ·#“Á\àÏÂÜ¡¡šµ„„†º+Ú qÄ…!ü‘"òbÌôéÓÉËÏ7ÕWUÒ‰Šz‡O%GUÒ´¢T Ú2Z³ÿæM—¬âu`=öm¤%FÀÊ\žÇ"ÃôfÎŽ
ÄBÇußòF9ÍÞéC“9¥§ð?ï±•æ}t€Vð™9O§%�ô?žÞä|.˜Î~’×“W<ðVÙÂEgœÁ½Ž5@4Aÿ±¦´~êµbÅŠ¹¸9ùÈ‘ D®¨¼Ü1?yŒ0yòGŽ%zìç<ç²Q<|àùíÒUä“_-•_y‹—QÃ¡G^€|J®Ò^ùWÅ§¾aòexzqû^ú“÷!z/)�3§g_åÊŽa`#y�k£¨¼BFZ I´}ÞµdÉ¬�7üñµ×&çôÕT”ÓñòZ‡w�8œ!R
 � !ÂÏ€ö\žá\¿�ì¤H>Óû”5¨Ï$ü~gà“BëRÏâ}'CP}M†}d"Ž¾Â\ÁÜ¡á5ÖM¢í³®›o¾YÃùóçßŒ‰‰‰!¼gRqi©-”«pÇ#¡×€vª@r6ŸÍ¡	‹–ÑÖç)‚ƒà]ªG
²À…ó"¸•×�G,¦µ'."h8à¹
Å6¦ÖGúGpçÊÊ
J`ÐMÐ�Ÿ{=ÿüó£�‰'>v9+«¥ª¼Œ.”V8”s  ô:�c->h¼žHÿùúRÚu:ƒbyWæPßõI&ýfÑRZ‘(£í[Ú€¾×æx¡¤ÂÎ™—³Zž|òÉÇ E4}‘§ûÜsÏáÛÀÍè¸oß¾ÕüA%E¶c¥5´A�´È‹s­QG™ðFðašðúZèåOÛùP³ƒG}á¾ƒrï�C±8£íÐþ#lŽôNàv¬´š¹ÛÀÜ¡Z 	Ú¾ð5fÌ7ŽÞ­\½‹ÿ4™ÿ\†Š­1¥u´¿Œjéé
!¥•®Ð‚°áT/pž4™Ï“yåŸµÉ“Ö§eà[Ú\»¿3�#À\ ¾‰bÊê¨¸¨ÐZÆ£ŸÈœÁý‰'ž¸Zt×s�5JÊŸÿüçc0~üã?œ~ægUÚÂKëi?H‚ìu‡$,bxSó.ªPÇ=<û6$�*ÀA¸„1'pGpgp‡UÓu]=ô~K¤›0a¦ÂmsæÌ™ÁoŠmeœZ9ö0d‚„R†”ˆR«Ýw¶<l™j£Ž{_°¿?†ˆ/©§Ü‚B;¸�#¸‚3¸C´|©‹Óè[0¸èõ×_ÉÈÌì.-)ÆáÂ]RCûJBzE€^�Ô5hÏ5”¸Ü¿Žþ¾
àÀ¥´¸˜ÀÁõñÇç/wá…A­²ÁÛp–^¸pá+ü›ÖövX�—k;RTAÞLÌ»„ƒPâ*ì3êŸÖîóûC8ü	à;?/Ï.ànà¨puS5|©kôèÑÎ pJ}fÍš5“ÿ ±¶¨¨˜Š8éùEŽ â:Ú‡ôI¤øèÕR­Ÿ]†Ù�í}hø‚Oø.fñii§jÁ	ÜŽn*÷¯äºé¦›œAøÕ¯~…èŽ½ï¾q�FFE}ÌéGÅùŽìœÛ‘‚2‡_q=íe¢Þ ]¬@ê0xæZju@í/¶ö±MØfì‹…³ÏÜ¼<‡ûÆ�{œnnÃ8uAHMME<ù­Ÿüä'wp}ÿ®ÝãÌÙ³mü‘�Šrs™L.9¿ÔXTKûA¼XOû!žÉøT\uýmÑ¢¥?lÁ&låæ8à>×¯_ïàNà†ÿ=®_ù5|>ñ6s¯®Â�?1(((†W`KA~2É+Ù9¶´Ü[LA¹#€x³¨},to±žÁâ†a¯@�º´EŸØ‚
l\ÉÎ¶B8g|À×xö	ßà .®ÿá×âÅ‹¥¼ñÆG?öØcß¾çž{ˆ»§L™ò\``Pô™³çºssr¨0/×Q�“MYÙÙö³Ù¹¶�s
í‰y%ö˜ü2G‹+¨DäW8pÏ¸·Í³¡úÂl�=w®;0((
>àëž{ï½¾ÁAåôu^�B�7>üðÃco¹å	Ä/~ñ‹É[¶lÙŸ��ÉÁè½’•Ey,¢ AaQùŒ¼lWr�3Èáz¡ÏYî°›°ðŸð­rù§^wß}7ŠQ�<òÈM¿þõ¯ÇòÑó ßY˜ìÔåË—/óöö9›žrôXEÚ©S-üßZºx[ ÔqÏ¢cbÓ½}|¢úÂ†j¶á¾àówÝvÛm’|ü¼áé§Ÿ¾õþûïÇÛ‡ŠïòüÇåÜnÂOúÓÉ¿üå/§¨ãž¡Úªý`¶`¶áã}¹ž¹9]GqêÞðÔSOÝ2uêÔÛ}ôÑÛïºë.»&î¼óÎ±hƒ¶èƒ¾°ájû_îâÔq”ØžÜ8 £ð‚ÂâÆpŠß  Îszž¡�kŸ_ÿàëÿ tBœþg    IEND®B`‚‰PNG

   IHDR   `   `   â˜w8  .7IDATxÚì}˜UÕÕöŠbl1¢~&_úŸª"J¬‰±%ÆDE¿ïWì]ÄBGA@ºÀ3ÃÀ0Cf`èU¤H›Þ{ï½×;wýï»rîÝ÷reP¢‰æ÷<¼ì}ÏÙgïµÞµöÚåœ{ÇöíñíñíñíñíÑãñÉ'ŸØ8 øôÓO}|’’’|²²²æõ¯Yåôžo�/x¬X±ÂöÚk¯ÙÆŽk;vì˜�ˆôz»�çlÄ©‡ó¼–ñ¼§×ñãÇ}Xç«¯¾ªm|{¸ÉÉÉ¶Ã‡+Z[[�„3µ}Ù½ô£]ðÊ+¯\6yòä+gÎœyõŒ3®ž4iÒ•<÷ãÿø–ñ6ŠBëfV{Úöÿ—G\\œíùçŸ·ÝpÃ¶¦¦&õX‡Ã�Ôöì³Ï^‚02!fxeeå¬ºººÍÍÍ‡ÚÚÚR:::Š�j ±³³“`¾˜×Pß!–å=¸÷)„£AÏ=÷Ü%îu[mõnllô0`€×U¦ÿøƒ±yþüù¶	&Ø@X/z¥óZ¿~ýúnÛ¶m@AAÁÛõõõ[@fQWW—½»»[@˜8P¸iOÀ?QÀsÝ±ã`]¬“u³¶ål—2 ¬«Ç¡Íÿ<âKJJlÛ·o·}ðÁ¶öööÞðä^–òŒÉ?1ãá�Ç;q(á¡v0Ø Øì�Ú»²«Ð¼ƒ`^¯±L€Ûõ?‡—XëÁ�è%ÇóóóÇ‡„„üÜâ(eC8³EEEÙŠ‹‹¿ùÄ‡‡‡»bqCCC/„§ÇûìÙ³ghUUÕz(ÝLb”pgWÂ»�éê|îìê’ºŽ.©ì°K^[—¤¶tI"O4[©uŽ×òZ»¤¢½Kê;y¯]P—°.ÖiØ†³=´Ý‚PµŽ²P&
†žÒ‹²ŠˆÑá›x@1<Í§¶¶¶·¥P¯ýû÷ßU]]½!¨Ë"ÝÁPãPÂ»� ¦ƒÌ£�]²§¾K¶ÔuI¤…ˆZ“ßD0ïD­3í”-õ¼·SŽ5i]ZgŒÉ6Ð`7ÛdÛ”�²P&ÊF)+eFÏô�“ØˆoÊAOwvìÖÎÍªU«~YQQ�(C/§g;º:á¦]�à¾SªÚ;%¡¹Svƒ4¸¡¦S6"%©›ëÔŠ­À¶z7˜Ï¼â;µÜfË ë´.äQw�¶¡mÙa¶M(d¢!„2RVçÌÉÒÁÙ‹¿ÞäoÙ²Å†i¡í­·Þ¢çëtpÈ�!fff¾‹�°A•D˜‡H¼´ÃÙ-²¯¾C"j:d}u‡lY›j;@`§DÕu HA¤ÂÂÍ  0çPž¨E
l®c]¬Sëfl‹m¢m•A L”�2bªÚ@™t!u@Oè=zôhÛìÙ³m[·nýz’_SS£’““Ã)^À¶iÓ¦�8‡î®Ä·wtØ�ŽVxZFs‡ì9ë@Æ�‰tÀ”Þº‰¤‘@…jÁn ç�±\÷¡Nt*"Ø&À¶)C:diƒL”­2r.@™†â¨Æ
BU†SêH]¿VÇ‰'l±±±6Lñœ)[ttôK---�T¤­½½««£Ãaïì�<(»d¬­nW"ÜéJ;E	cŠÏ Ó[ 5„‹tz»UÎI8ªFUh[jp‚†h‡,”	²¡7ÚaÊJ™);u€./R'êF©+uþZ©©©6,xØ55äüæ7¿9?//o9ã)ÐÝÚÖÖÝÝÑ.5­ír°ÊVµËz Š™*)H5<(Y$Ç2‚ÂéÑî0Ä+éžÐû˜j]nä#Ï¶˜ß¨P9š`•Qe¥Ì­míÝÐ�êôë_ÿú|êH]¢l)))ÿ>âïºë.]X}üñÇ¶•+Wö¾âŠ+¸º½sþèÂÞÞÞÖæ°··Kfˆ†rk@<ÓpÉ·@â-˜Þ`AÑéiÍ{Á“|‚žoê²Èï .„×t ”Ç’±’)dnl(À©ª£ºP'êF©+u¦îäàøÃ¿–üsÏ=W§fñññ6__ßÞÆ6mÚ´”——£·´´¶uu´µ1•£um²š^Oe«ÚdƒÂÍN€¦Æ ›N‡ZÂä=¯›û­:•|5ø©F 6–\ëªUf•½züC—Ö.êF± üAhh¨êNÈ9ù—@·‚ƒƒ{sÕ8uêÔbÎŸD›!hg[«Ôƒü�5m
�²HwO©¨�Ëí&1u’ˆ¼§!ÚéÈæšç=&¼YV¸ ƒ)á-c5eW¤®¥U¨S³eêJ�©;9 ää_rÜwß}¶GyÄ6nÜ8]Õ6ì²ÒÒÒã5Í--]�­­RÙÜ*Qô"(@…Öx(în†'¢FIr#ŽDR�1�z‘îQ†÷»`È7yoò-y+�²R‡vÕ¥
:Q7êH]ËÊÊŽSwr@.È	¹ùJ�k®¹†	÷ë¹ºõùþ÷¿AaaáÌñ¥©¥ÅÞÑÚ"e�-P²MÂ*  Yga½§b¬nïòÈ6�°á	ÃÌ�u�P^3Ä·{Ïrš7mh›ž²G©lEJ¹©C+tiÕ:J›Z„:RWêLÝû÷ï¹ '†£¯à8çœs4½üòËmGŽÑy~vvv0ilnîjki–
�®«²ÎÀRŠ©·Â=àn„6’ìií9­jŒmv‚½†áËZåM†ø*¢Ý™z“_éF¾e€µ*?ª’FhU©+u¦îä@Dø¤®Ï¥—^j¸ú²,Ïm¶6ôÎƒ_mnj’¦æf{ks“Ô46É¦*’�ÎÔATxA	9… C$ÉµÖkØv°ËÞÜ—Y¤Ø[ÛFCðš1SÍ›ú´îJ¦Ú;MÈqÉfg­35º¨6U¶HMS³´67«îä€\�“õë×÷MKKãéË%Ÿ^ÿ½ï}�Kq]d………F·kF<lí:!Äv¶²œ‚¶¨ÀŠ
7œ¨0F0Ê{Â‚'‘¸?
ä¯É(’'|ƒå¶‰3äCd5ÎáC†;ñžp¶ÃÔ„EC¼',Z,à°ª¼E¶ÁÑa�ï 	‚]ÞæÕ«W"7³fÍê}É%—(g_ê1|øpŸŸüä'½~ùË_^‚ùp\Èohl´·Áû×4ËŠ2PÖ�š‡qÖžF Œ×m ” VE8`ˆCžÄråZ\/Ÿ»D†Žÿ@ž	Þ Ï„l`^Ï­+ªÃ½ñ¦ÏX_éÕ¶%`dö$¿pÓmípu³´55*ä‚œ�rôä“Oú|iÄ_ýõ¶‡zˆÛ=Ür˜‚B©ohè¢ ©µM²²¬EÖ@ÈÕ „DÞÀÝƒŒ'™qÁÀEŽå¡ÆL×ãÞ¨Æn™q(N�ž"o„ï�MðxbòƒF½'�'É®V‘5eMÎûL[ž=ÓÓiÔGat£!�§Î)Ð��†¢˜˜˜)"Â•rß¿ÿýïÊÝ—rÌ�;—¡‡�Ø7‡Ñ›¤¹¡ÁQZß¨Þ¨5@³e§÷x‚ÊZ 	ÞÀyÓ+ÜÐà�I{�ÊÍïL–YŸœ”=m"{@ø‡NÈ�±Óä™ÀP‰Ì+—í0Û¡ô~ïúñÆ)¼ä\côšU7ÍSgK7r@.È	¹ñóó "ÊÙ—BþM7Ýäƒ…FdûbÏg3b¾ÔÕ×ÛÑ¨ì­l’�2¦ °H�À–H�B¦K[ãà"B¢hQ
7ÒZôáË¢„\¹!ç‘y²*)[V%fkþŽwgÊÐqÓäÞiódYl�Àö¬û‘jý^mšÞYîíõ*»¥‹>SWèLÝ÷TÒë•rCŽÈÕ‚ú�»–®ôtÊ¹yóæ?càeCŽ4˜^Ó +,òÃ,!)8¯1µà"ÞÁ³W$JSccž×qàÍˆ]††Œy˜¢ù·6í‘÷öÓAù®IJP\:ÎØ•(S§¦ñÍîä{À’Ûx¿ÑÏÒ·…ç4¥�‹–úzå†‘+QîÎšx(Üb°Í™3§/-ŠùîN<8çˆo¯©«—È²F4îi BtyŠ1†•õ„1‚IŒ1˜§GsJ9ãH¼¼)/…mB>�kŒ™Ž1âváþióeMv†6š=ê3ÀÔ`�Æ�ñ†|�ƒÈò&!'õàÏØv’3r÷þûï+—gsðé–zÿòåËÿ„øæ€…¥¹®Î_U/!¥M€h6©•·„fj`àiäJˆ•'a„—1Zq^óÖs`»<ÇÁw3Æ‰	;É-'žÅ˜UÕj ÙªßÀod³z-Ò&F?MKM>ÔJƒqŽœ�›ZpD®È¹ÃËc_¼p»õé§Ÿ¶-^¼˜7÷ÁžFz©­©±× ‹©÷—4B
¡°„k¶4Pò=�b<åCK«¬é)š×ú«1à9Öšë ´I{Éð¥kä–·'É,Ð|>†vŒ³^Ê¯$›6½È÷Ô…å-”‚|&'ä†±`AAî0qéóÔSO)§_èð÷÷×‡ÑS¦Lˆ-Ø–Úº:i¬­q$ÂÒÁJ¾X©�§¨¤ž3Åü*€SO>TßÝÐ-»jñx°ºUvV5kº+Ý=õ¸ÖØ­{ükNñ\%›¤Ó‹µNÓVêÌ(ÖPô÷Ù¾²¾¸Ž!
m´cw³•çÑ¦��2¹Í Õù§1€§ŽF÷\äÜ€£Z¸âÃý„Ÿ�ä0   ×Ù¼(Ëy?ß¡œÆ�¥–­«©‘-e?%lXA!Œ;²òš–5ÆÛVáî½ï	ó*dá¡h¾M^X&O,Z&�Í�ÿ»0Hžñ_!o„n”I›wKPlºlÐÒ‰r…EJ#Ã\%uW’^ Q¥õòúúmrÓÈ	2½ ,¿J†û.‚å•àu21r§ø�—È‚*Ù	CsULÙh@…ê ²;uq×zš” '[Ë4J(WäŒÜ‰ˆrù…Èøá‡}î¹ç†Ÿïâ!{,-ZW]Ý�WU£¡g•¢Á‚§˜ZB9»¹•ê=êÍ²Kå­Õ‘r7f+7½9An~ë]¹SË»§Ì‘{¦ÍC:WîÄ5Îp®}ŒÜ?ý#Â5Cëk Wòy HÇ›¥u€EØ˜õ[åñ�2ñÿ±�‚Ä/9_nÅÔ”ÛþIyò§©ót†ôû±SÑîDÅ=SfË¨uQ²1·œOÞ _ƒÊª0úhïµRÃ¡Üä‚#rUÎÈ9¼÷Þ{ûüíoûüSR>é¡å¦OŸ~ÂOwUu�4``9R^'ËŠ$Ô�oR#¤WïÐ8‰û¸Uì{,Aî~o–Üâœå‹)ån™}<EüS‹dYN…„äUËòœJ	Ì,•E‰¹òÁÁXY›©3–PÔÁÁ÷¢V$dÊèõ[äÁé`Ä‰Š? îÇË¤=G5ì“¡£&Ë’„l1%â—R 3�&êjú�™‹äFô’ûÞŸ#þ'’¸¥Y�Üõ!ñÔ7TS Ø�ON–ãó‘òZpUå@/rG­Eìç[˜á5oÎ_5üàM±I5¨�Üì•UUQ‚ðSlYÛXÞDdÞ�ÏTËÖkØY�"·ÁûnŸð�ŒÝö‰¬*ª—px_Ka,63kÊY¥�*9Wg}úÄöŠFYüiœ<½$D†€XòxöK¡‘2óÓ	Ê.·îmÓº§ì?!7ƒà·7lã‹Z¬Ÿ×Ø¦^_QX+£¢öÉmè)wŒŸ&1éÜ¹…õ¢¤$ØÓÙh$+­wñŒsäˆ\‘3aß¾}“DD9%·g<°‡á3fÌÆ¬óðÔ7+©©¬´gWVË
4††ÝAA�Fw#¯à9‚Za�üíÃEò{,š¦}‹·Þììâ–Ázœ…î¯Auê•;ÛŽ‘aó–h\Œ½Ÿÿñ[�º¢%8¯Š„ì)¬ƒmë´5 ½DîÂ`üð?Yr`H«=•�31•eÊÇ'eÈè÷ä”[[Rçr&…;ù„Kÿz�<Sr”]Q­œ‘;|a7¹$§äöŒ9r$õÂ+?Æ‹HeUÕÕR[Yá8^V#ËŠÐPò†1ˆG¯@ù:õ¨iû�ÁÇsá¢:Y�é-J¾'Và:½•/N-EÏáÀ|3¼ý÷žÃèü˜ö>×e9N¨áÔ ÿCÝ†û–$çqÂepE±ê¤¯¥<·bƒBŠa�tÊh`t4¤ê˜7AHÉU8#wä�\’SåößnÐÅö2îÅsO©¨¬”êŠ
ÙYR‹ÊÙdê„Âx…’Ï¼–Qe^^/ƒ£çžLãV/Ã”w‘ X^oyQ_/ÁåíÕ›tPôö»˜Û‡É|ŒúpP/FYC¸!ž`|ùë�Í{åæ7ÆÉ˜1¬Yá…eY‡:ÉZÈøá±$5À«a‘”zÖ±¬!ßwÝ=9Yì*©!gÊ9$—"¢ÜžÑ K—.eüç“¯70—å@b/+/—&@CCðÆðè%¼®ç0xðˆ³éÅºRÅ”@…ED½Î.vÔ´ëôôÏ˜Ä,è¯³}ß­ml�Ïïq’è…0Ë8ë@8Ç`ÄšÍ:­,´Œ¯mk»*“_j¡ö”Ç}ƒµW©ñª›Ñú»øÐ¼žÈ9v@È¥ˆ(·gâŸž~�Ê¿¬,/³ç–UÈ*¢ÄkcL	Ó8`<ÁtO‚SÆa˜Þ9n*HüLù@êâžOâï›¡nnÅfg*+
jà¹Ä÷Œbã¦–¤é ûøGKeµÃ	Ë	(‹®QÒŠÐæÌ¢–s/‹zo7^nH7<¸Î‘#rEÎÈ9$—äT¹íéÀCe¬|ÏEö\¼¹CPVjO-­�å4€´Agž0QHx�»‹O-]-CFÇeq;—sŒ2|Þ»:½P†Íõ“^#bz87:ÄwÐËµ|¨EšlŒGM¨0çMÏBýžñ‘Ü‹9?§¹ˆYÞ¯«¡b4aòÙåëôÁ‹êb7©•7\È[ç–Ô	9«*+ÓÙ#¹$§XŸKŽOk ¼ŽÝ_œ£•.Ãè�†JJ»cJ*%¨ �°ÁZ6â…ŠZ#h¡e ‚ZÆW�Ã7¾>ZÞÛyP4¾âüª"
[#›@>Ú{&Ï”›FŒ“g–­‘e¹•œ~j9†4ƒ78Ëiü'h8��-\&wŒ}_áåì�ê V¯¥Œ”iÒörãk£eô–ý§ô¼!^õ£NÆñ
4=åÆJ€œ‘;rH.É)¹%Ç=­€y±Ï\ðC¼‘Í8VYZÒ}¤¨R–R D¡�y£€yFPž×ÝÃ¹1:G÷^¨Lp>Éo“�ï{¿ý.µ‡ñ˜[–ºkzóšö õ^Ë»Ÿ^ïž óN¦²~m_Ã¦¥Çº²Fn…`ÀŸÄ�ž2SvÞo ºys`Î5ÊÕ‘âJåŽ¦§§gŸþùÿMnñ×épÿý÷÷f¡k¯½öÿ`ÿ¿B’’bÇÇ0@ Uy0`5æj8Øä-òÝŒP`ÂÒ#Øçù=Hö�Í�U x#¼l>f&C¡ô­˜ƒOÞ{”žHbA„“x“7aÐÊóœ7ê\ÞÍ±äÆWGÉÔÑ¢=Æ§WS'öß˜4úÖDÈ¨F_a<Üèä©7aœ 7.(R8JËÊù| œþ’Ü*Ç§9øð]0tèÐßÁ ¥˜BUÂ {Ñò-äšº‘oŒbPXcA=^Ø
‚�É@�ðz_'\x8V~òéýS?‰Q¢BHŒzž‚jy…ãµèæ×ÖòF	ÇbfÊã^ÖÇzGcµ{ÃËoËä=Ga «Æk¤áØÂ~.`%Bä<U;Á£2›mtôB¾Ox€œ‘;rH.É)¹UŽOwÜ}÷Ýj€;ï¼s 6’ZKJ±(.rìBe�ylL1àg@a„0ÝÑ¤V� ‡=¹d¥,‹Ï”»ÆM…÷¿ËU(c.êª&éž(pBï×ú×�°…\ÏZ,�Íñ•EGbBšØŽ1S%¨Z=~Ü¶2ð•wð°æ ',ò«ua6øo1Vžàê½lÇ¯ Ž®T‘O8y¨æ=l\Õ9#w%¥¥4@ëwÜ1€Ü*Ç§;n»í6} sûí·ßÀ›ŠKJ¥¼¨Ð±« ‚•r¡Ô¸`õ#¡ç¨Ë„e•ÈCÓçËMPzôÖ�Aˆ!ß2És~6yÔÇñÀ?)W�7!c0pçØ)â—˜Ã•·–1TyÔ£ßÝu!è³yŸ~^žW¥åWg•Ê˜Ahœu,™cò�FOOç#–ŸÊEže pVîf rJn•ãÓè&¼ØwðàÁ×á Å%%j€Ýùå€JÙÐrÁÂ ¦C,ƒÒìî/…É „ƒ×Voæf<Õ,ãc={“‹Ì)ûOÊà7ÇË'N'�ŸÀ^ÄÅË˜û,pÐ}ãÇ€·#v±d©Ö5Ïú…È€W ËÚ-œdHõBõi`¸¡v”+wä�\’SrKŽ{z…Ïù5Ì‚*xsia�c_A+ÕÊ—X�Ò,ã-lH®Ò½ü™ûŽÊM¯�Â›lþ²‹²eÑÉ^Ú€{ÕÃñnçªup]‚©ä=Øv¾å�qÀXÎï¹ÍÌ¸�¶<ï£<4ÀÄ�‡äF=zÓ^×Ó³1˜_ûÜë˜¢Yå=‰÷îéÔ·†:è9ÂÓ û`€2pWT\ÌYP%(ý¹%Ç=½Çøtîw¾ó�ŸbîšÃ›K
ò»æÓ ¬¼J–ƒHÓàg'Œ€¦kj9õªU9åò—©sÔcbþÍÛåÚçß�w#vÊfÄå «NÂ† ]x-ˆÏÒõÂÓº?”Åsž÷:‰CïâÂoÜÖ�1¿%c‘’|Îž¦c{ãIÿ•â›ZÀÐ¦:§:Å†d£o¾¥s®çyà8ƒóv“CüžQ9%·ä¸§WQzáÝÆ~È^‰×ìbysq~~÷ñüc  ÞŒF‘ºâ/	Ê­Ôî=1j¯xéMy!dƒÆý9Ø˜ûÓ¤™:3š¸q»l©jA�ªˆ!Ð¬—[.Oæœ_�l†ÏZ–:ÝV…÷†¼8R& '@žg�áÎ+{
õ áÞžmà­g®'È9"WäŒÜ1Š�Krú³Ÿý¬9îé; ½{ì±ï {~*fo.ÊÏ³'äÉÒS30ç�`VZ­y%,¯RþúÁ<�v~ŸÍ�UW¯ó°@»ûÝj„QxL¹¹¬�±›Fó$ž°NwyLO#òÕƒ	^Ó}žo¢¼ÏçÃ%�4€^Ó”Ä¹Œ)a¼{™Ñ�$ý�ÞŸƒ€xpFîŠáÄäœ^HnÉ±­‡Ãoöž‡ô<üºIPaQ‘äåÙÓò
$‚Y+´1óÙPiâ=9ð4ì<Î>/7còÄ’$^¯eW°ë«îCL¿ž½Ã?D6æWê¦ÙÒìr˜�†Ô�äí±Î²†0ÈÀ6øŽÐ cdö±dí=ËrTN/Ç!>£·»teªð"Ÿ\¥å(wä�\’Ó'žx‚Üúœž}X(°Ð9���cð}ÉC%¹yy²&·B–²1ox
”ChÞ2@¹nˆ½¹n‹Üðâ›˜�Bðù¯*„”!Ä7¹@_!¹aâá$8.]"*še©UŸz¤”ÄÓ\3Â5Á0¾ÒþÇžNOyþÔrh:f{êÆ6ôzŽÑÑÀ[grD®òòó•»|¤x-e9%·äØÖÓ�·!Îea<B{óW­¨0/W¢rK% Â²!oÀò€÷y¬¨ÿÅ>Ë ¬4'dëF]`V…ËÃX†¤,Í*×Au ¦¨·¾=Q¦oÛ/QI¡E,_®FóŒ»•„÷9¦.B²ÊäÞI3äî‰Óù°Ÿ½Ä½ƒô
-·šÏÐ;T¶¥äöŒ ãlä†‘+r¦Ü‘CrIN•Û3øM6}üƒüàw‰‰‰•yèJ…¹9ŽOrŠÄ_­èY …!?Ê¯…b�Ï÷—!˜»/:xR"—‹ê@x…éº	9S¹mÔ$€óÔÂ¥²2!S"ÑZh8î^zºÞh!öž†Ž'Ãæp&eÉÊrJ¾>+Ï+— “É²,&U"
«aôZ\S£»t±ô2Ÿ½¸¨PŽÈ9#wä�\’SåöLÇÅ_Ü¿£v>²W`ð8�Ï0”�Ý��“ÏMÃÙ&ÁÌyU`%ÛÀèTùÓ„ir3æÿœ‹ÿeÊ‡âûi<\°ŒÇ½òóÑå#×#$ÝŠÕîÄð­ž‹—mË›�M�0ä{�u­ätsÿq„¿‘œ}é“° ½WåÑuúôíô�0Q¾G—Åep¢À2Ô¥'°.CÅƒ«üœìnrwðàÁä’œ’Û3 ¼HD|ßŸ…8ÆndÏÎÉ‘ÕÙXX�¢­Ï
=o@ïÄ#È?sŸäÿ<Oú… ?ZþˆíƒÀä\’‰²å÷.E¯Ñ©$<tôæ}ºÕpL÷a¶4mË^Ùˆ¸ÁU/Ê€Ì¥ÀgõLžÃx3oØxá¾´«=LIØãü²äNô¶[0@÷_‰§fA˜*¿%�:[‚±M¤Žatö„Ñ™¬É)r•ÎÈ¾Ü8‹\’Sr{FpŒ8p`?vüšàCXÅ9rrs¥ '[ö0q�roÜK°r¦T^Ÿ½¾·ëˆzßÓ¡l=\yyU„x~„ŒŠØ¥ðÒÌ2·ú”*Î”38ŸÃ¢k0V¾X¹¢Í’©Q{dmF¡lB�c¸? õfêý.9BPÏÃ3?’¡â2¹¾Àù2Yë‰ÉÁõ�åõ5[øÜ—SWu’�/�”©û�1„QO½õ%'~ödI~v–�Üá·%"—ä”Ü~.\tÑE}ñ-¿ññÇG�M¡%s³²ºã³s=”cê%Ÿƒ�zÛ˜¨½ªàø�;d#¿6LÃS±kŸ}M^_EX–a�÷“]3„g—HÒ šùU¨«Vß {Ê%1Vï¿kôdysÅ:Yz<Q"0u�ÄÖôšâ:� Ìj@z–ÜˆAý¾)³éùj$ÿŒRñK+ÖÕðˆ5QrêúpßQ}ÿ4ÛÜï@®ëŸ!¶B ¦úžäˆ\‘3rGÉ%958sê}ë­·Ò â+©srr¹¡dÏÉÊ’õ &€W²o!xŽBsžÎÆ[rî?U>:pLüÇ $}RÞâÃ†ö €©®`gŽ“;1zÛÝÓ a4ëc\žs"U^ÀsÛ;ÇLÑq#b÷_Ñ+F¯Ž¿#1èYT#›Ñ;Â±Ò�€=Ÿ9sÖóÍgÔ·“‚<ÛƒMŠÜ©qÿ!l‘ø�“yû>•?¢Þ!èmó¢ÓtÆ¤ò}¦¾æ39!7äˆ\å"j�;rH.É©íó½{÷öÁ²™ë�}ôÑ?a_¨-Ó©ÜÌÇ¡¬<YÂ™ˆ
cDxæ]¤½ÆU(ÂÐ ìûÜ€X< x~ùZÎÁ-ïr7Z¿ñ¢«Ö¿aå¼2·’3)×õÀI!‹“òÐÃöÉ£¬‡ŒÏ^¡õßñÎDy|ÖB¼V&Gl—Å‡¢An¼ø"å,ìƒ­ûä�Uá2læŒçÔƒà tÊGÜˆ1`äúmœ1Q—NLÊ×5pBnÈ¹"gäŽ’KrúE’¦ï¯~õ«‹�ýþÎ�;wÑ¢Ø!íÎÈÌÔýü ÆZ
à„ÌKPN3'ï9&O†"„¬’‰1KaHðº×š§ëèFmîÁh…½À£Á�–1šõÏ�É”±[ö#~¯�{°¿tˆýõÓ¯ÈïžyU®µ€PƒÁ@Êó\?„·%Æ£§ñyÁS«ðMË0yÿ	ÊàNôióä€rBnÈ¹g»É9$—_€z3úùÏ~»Ðˆ#žÀ·d´�œŒt9�‰^@¨÷ž(C²ô!ÀT§wÞ÷Zä–èõwwÒ±cø‚ 	Ã=ŒÛÞeËœá‰ÓQë	Êbæå‹ß’É2=äÕÐH†,È_Y/o¬Û*“vAˆI§­G‹*›+Ï:-ù	ï¼1 "B99!7Ê¹"gäŽö0ûé9õíÛ÷ìŽ~¯Á�›ÊùÇÈÞ�–‘!¡ Š–2‚9É6y÷ó%J¹wïUÞ€ŸuPÆæÝ|íóœPrÒqßië/eýJ¾ádŠŒX*KSùš
ï7¯ÎX$³ç°ý #ÁzLýg@ @.È	¹áì‡\‘3rG{?=Ïˆzÿâ¿à`|~çyX�d8²ÓÓäHz¶øÂTo2õz�eøÙ ÌE	âô�/Œ”ßû��¹ø"Qžõ›:IœÎ~Â²Kå/“gÈ¯ž|áä¸,Çª×?­˜4°Hü§ä/%à"G²À	¹!GãÇ�žœ‘;rh;ÛÃGŸ>}ÎÅRú|ü!võ>æÞ±g¦¥ÉFÌ6ü¼…ôDÁüi „žåIãðpìžþö©—å¼µ°SÌ%ézÍ´iÝÏsK€�%uòjà*ùîá”•^®Ý“<g!?Ë.�îä€\�rCŽÈŽKÈ]›oŸJzÕUW±|/ý?óÞ’Îî–šêˆKË� í¶ž›üÙƒÊ0ä›œ/÷cP½ƒæ;+Ã%²˜ƒn…Îã—XðK-Ö•j$Èºƒì«r/îÁ½¬ƒÆñªßC¾³�Ÿ:S÷¸Ôtp‘â€÷¹!GäŠœéÔóŸ=¬øuFóK‘^Ž7|—dÂ É))öÌÔ9�–%Kè….áNU¶ÄÞ×½ËRAÆs®s1ï¿kÌ{r-f5/ø.“°ä\�]Ï_G!4¿:5O^ôælGËÎ9žÂ{ù6öéêïAžžå§®~eª;9 àÜøóDrEÎ` ãýÿl/À3ÍóaŒKñÚâuø©Fö™’”œÜ�‘’,Qiyâ�–zKOöäÎ§)c7·yÕ`±õÛá/ÉíØÙ|ÅßŽ‰Ú-Ó±%ñBÎíØjø-bþïÍ"ùVÜ/:cý„!úÌòóœ/òÔ™º“rANÈ9"Wêý_ÖaÅ±¾W^y%gD—âÉÎãøÙšv|™GrrŠ„¥Š�Ç%O/"¼ËH¤îµ,ÁŒæ••åŽQ“´7üæÉÍßŽ÷z^^Î/à1ÑpŸ·~æz�?€ŽÔ•^/)Ðð™o;ž$>Nn,ŽúzÅþ/!q.Ûï§?ýéeÜ^Åï LÇÀCt§&'I|Jª¬H/â@¨Fð&½Ø ‡ó§É[Þ¬‹4Yœ˜+“°p‰ùü›X±2¿(!‡{@,Ã²_´þ3‚:ù!ùñp¸Ôäd¡›à—Ä¦“‹›~ÊÕWpø°[Á°çc„ï�Ïÿ½víÚ­˜ûJBb’�Fˆ†–¹áóÀL?GÙ"~�Õµð
q>ˆçƒœÃ5”é±þ³u¡NÔídrªP×Ä¤$;u'ä‚œ�rD®€¯äÐP„¿Ár1â],2®Ã�—û‡í©I‰r<F Q~4‚!Ã‹„Âóœ7yæ=œáHá¯(â¹/©~ÏòÔ�ºP'ê–š˜(		‰J>~®ÿ¦š×]xá…ýÉ	¹ù
É7[á±½z	,ÞÓ­Á»víJKG,ŒOH°SÀ“I)’Z ¾i0‰”¤„’hÀÏÞç<òÖý_aý”ÝiHZ�œ€Nt°x‹|èœŠx?tô'äÄsËá«7B?üc^|óã�øBr>¤8!91Ab“$4%_»HRåÎg¾÷K®?ÀeÅô6º$'$¨ƒQGêJ�©»ÅA¿ùfPÆÁ†/ÇÁ]?¼rw7v Ó8(á­íI	ñ’ ¡#“³Õ‹–P)†
…QÖä	sÝáUþÌ÷ž}ý”‘²RfÊ®:P—8èDÝ¨#žïÞM�-Ýû)ÿŽFïƒä¼Ë.»Œ‚ô¿úê«‡DFFžp!!>Þ‘'{Ó$±zqj±1‚Y…
Í›¸þÙPÂ¼`î9Ëúêõ*ëÞ¤4x}<ôˆsÐó©uCÈB]©3uWþ�‡�»ð=¨+1Ý€ŸgÙ�×180wÇÆÅuÓÇe{”ôSeK<Èàg…WÞƒhSÆ\3è©~ÊA™(dÌQY“âc…²CB¨u£Žîä›A÷ßk„Þ³�Ë®Â�üÏð·gã�h¶a� 1P$>.Ö‘+û0@sl !N%+å”Ïæœwyï¼~&z¬Ÿ ”2å©l‰qqBYcbc»ñV³PêB�0è^E©«×tókb„~ç�wÞ÷ðâW#õƒ>øäŽ;r©ºq7•JŒ�¥AdgBª„$çªò¾)E¢ä(œä05PbÍù³�ÖoÝï°íàä<ÙYbbã$16F(#e¥Ì”�:PêDÝ¨£!ÿkvX{ßçBÀ‹á-WãóUè²·Ì›7o9Þh¥R±PK÷î(K¥wÇ§HhRŽ’²ˆÆ°È÷7ð$�yoœæšg¾lÃ2vhR®ìBÛ \‰�…Lr #~	½?¼ºk�[¨u¡NÔMuüš½ ä9H/À·Â¯@¼do¸ß‘¶nÝºOñ­qAL¥âä»ã££q àp\‚lNH—ÃýœEôPËSýœd2M6¤zÊœóSÂµ‚çÙãÐFšB[q11­2PÊDÙ(#¾Ç5Œ2Svê@],�zßˆÃ‡Î8.aìÄƒiŽ¿Â�€¿�¯8�£›S<x��„Øè“0ÆI‰1cd[|ª¬MÌ”å0H öõ5d�Ìž�¬`YÞÃ{Y‡Öu¤³n¶Á¶Ø&ÛN ñ”2‡l#(#e¥Ì”�:P9ß°ÃÇ½7àçï/§Gaé®†À+/ã'ßâ�At`ÊÊœà‹$}òdwÌÉÝñ'O8âh�è9'Ã(»â’eÈŒŒO“pô–	Š�Èã¯±Ê&ò½—u°®XÔMÄà\|‚°M¶½fÍšƒøS$/S&ÊF)«»×÷@þ7ª7ôCzþìI(ø_–!~�o>Šx»¿8ž…q¢O•HÆ
%ÐqòäI{4<4æÄñîXq Ô…±0¯³l4òz/B==ŽFFÊ6ØÛdÛ”�²P&ÊF)«ñúÿœƒž¤¯¾SIüí•+°�ü/|¾
Ÿ¯>ðÀOã—f—0`¹_‹¿+ïÀ€-�L9vx ˜ÏîdóÞÿ×Þ¤&Da˜ÒŠ �’B”,²êÆ�{W¥+Ákô*½AîÐƒz/à\¸óû†)	77é<x8dÞüïù¿É03�bñv‹_±õ¡/}êÛŒÅ˜ŒÍC¬#•‡N"ìeÓ<Ïú;[
É`U/1kˆyg˜úäíÛ_MÓ|sÌï‡�×›`G	å	Ô‰ãógÕ²×¬ã�³ÚÚÆ¶bˆ%fÄ¾Ø>^éÛŒ¥%žÿ‰øeÃ´�0¼0ã( fÉpàÌI]ÅÏ}C7l�o*>ø±ÃŽ#{Õ²×¬Ó&ÚÖ]1ÅÖ‡¾ô}?èñ£¼+²¿d0çž²ìŸ³ÓøZUUéR!ÌJÚÄô5Ôi£mlSŠ!–˜-éúŠ½=I?±W>E²ž%Î¡‚>ƒÌœ!dŽ.X(µì5ë´ÑÖ6¶C,1éÃÒMŠšIèÍ´é’�¿£$‚“Ü,}FÓ]LÆ…    IEND®B`‚<?xml version="1.0" encoding="utf-8"?>
<!--suppress XmlUnusedNamespaceDeclaration -->
<Package
   xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
   xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
   xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
   xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities">
  <!-- use single quotes to avoid double quotes escaping in the publisher value  -->
  <Identity Name="${identityName}"
    ProcessorArchitecture="${arch}"
    Publisher='${publisher}'
    Version="${version}" />
  <Properties>
    <DisplayName>${displayName}</DisplayName>
    <PublisherDisplayName>${publisherDisplayName}</PublisherDisplayName>
    <Description>${description}</Description>
    <Logo>${logo}</Logo>
  </Properties>
  <Resources>
    ${resourceLanguages}
  </Resources>
  <Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14316.0" MaxVersionTested="10.0.14316.0" />
  </Dependencies>
  <Capabilities>
    <rescap:Capability Name="runFullTrust"/>
  </Capabilities>
  <Applications>
    <Application Id="${applicationId}" Executable="${executable}" EntryPoint="Windows.FullTrustApplication">
      <uap:VisualElements
       BackgroundColor="${backgroundColor}"
       DisplayName="${displayName}"
       Square150x150Logo="${square150x150Logo}"
       Square44x44Logo="${square44x44Logo}"
       Description="${description}">
        ${lockScreen}
        ${defaultTile}
        ${splashScreen}
      </uap:VisualElements>
      ${extensions}
    </Application>
  </Applications>
</Package>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<resources targetOsVersion="10.0.0" majorVersion="1">
	<packaging>
		<autoResourcePackage qualifier="Language"/>
		<autoResourcePackage qualifier="Scale"/>
		<autoResourcePackage qualifier="DXFeatureLevel"/>
	</packaging>
	<index root="\" startIndexAt="\">
		<default>
			<qualifier name="Language" value="en-US"/>
			<qualifier name="Contrast" value="standard"/>
			<qualifier name="Scale" value="100"/>
			<qualifier name="HomeRegion" value="001"/>
			<qualifier name="TargetSize" value="256"/>
			<qualifier name="LayoutDirection" value="LTR"/>
			<qualifier name="Theme" value="dark"/>
			<qualifier name="AlternateForm" value=""/>
			<qualifier name="DXFeatureLevel" value="DX9"/>
			<qualifier name="Configuration" value=""/>
			<qualifier name="DeviceFamily" value="Universal"/>
			<qualifier name="Custom" value=""/>
		</default>
		<indexer-config type="folder" foldernameAsQualifier="true" filenameAsQualifier="true" qualifierDelimiter="."/>
		<indexer-config type="resw" convertDotsToSlashes="true" initialPath=""/>
		<indexer-config type="resjson" initialPath=""/>
		<indexer-config type="PRI"/>
	</index>
</resources>"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isElectronBased = isElectronBased;

function isElectronBased(framework) {
  return framework.name === "electron";
} 
// __ts-babel@6.0.4
//# sourceMappingURL=Framework.js.map{"version":3,"sources":["../src/Framework.ts"],"names":[],"mappings":";;;;;;;AAmDM,SAAU,eAAV,CAA0B,SAA1B,EAA8C;AAClD,SAAO,SAAS,CAAC,IAAV,KAAmB,UAA1B;AACD,C","sourcesContent":["import { FileTransformer } from \"builder-util/out/fs\"\nimport { AsarIntegrity } from \"./asar/integrity\"\nimport { Platform, PlatformPackager, ElectronPlatformName, AfterPackContext } from \"./index\"\n\nexport interface Framework {\n  readonly name: string\n  readonly version: string\n  readonly distMacOsAppName: string\n  readonly macOsDefaultTargets: Array<string>\n  readonly defaultAppIdPrefix: string\n\n  readonly isNpmRebuildRequired: boolean\n\n  readonly isCopyElevateHelper: boolean\n\n  getDefaultIcon?(platform: Platform): string | null\n\n  getMainFile?(platform: Platform): string | null\n\n  getExcludedDependencies?(platform: Platform): Array<string> | null\n\n  prepareApplicationStageDirectory(options: PrepareApplicationStageDirectoryOptions): Promise<any>\n\n  beforeCopyExtraFiles?(options: BeforeCopyExtraFilesOptions): Promise<any>\n\n  afterPack?(context: AfterPackContext): Promise<any>\n\n  createTransformer?(): FileTransformer | null\n}\n\nexport interface BeforeCopyExtraFilesOptions {\n  packager: PlatformPackager<any>\n  appOutDir: string\n\n  asarIntegrity: AsarIntegrity | null\n\n  // ElectronPlatformName\n  platformName: string\n}\n\nexport interface PrepareApplicationStageDirectoryOptions {\n  readonly packager: PlatformPackager<any>\n  /**\n   * Platform doesn't process application output directory in any way. Unpack implementation must create or empty dir if need.\n   */\n  readonly appOutDir: string\n  readonly platformName: ElectronPlatformName\n  readonly arch: string\n  readonly version: string\n}\n\nexport function isElectronBased(framework: Framework) {\n  return framework.name === \"electron\"\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ProtonFramework = void 0;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("./core");

  _core = function () {
    return data;
  };

  return data;
}

function _fileTransformer() {
  const data = require("./fileTransformer");

  _fileTransformer = function () {
    return data;
  };

  return data;
}

function _LibUiFramework() {
  const data = require("./frameworks/LibUiFramework");

  _LibUiFramework = function () {
    return data;
  };

  return data;
}

function _pathManager() {
  const data = require("./util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

class ProtonFramework extends _LibUiFramework().LibUiFramework {
  constructor(version, distMacOsAppName, isUseLaunchUi) {
    super(version, distMacOsAppName, isUseLaunchUi);
    this.name = "proton"; // noinspection JSUnusedGlobalSymbols

    this.defaultAppIdPrefix = "com.proton-native.";
  }

  getDefaultIcon(platform) {
    if (platform === _core().Platform.WINDOWS) {
      return (0, _pathManager().getTemplatePath)("icons/proton-native/proton-native.ico");
    } else if (platform === _core().Platform.LINUX) {
      return (0, _pathManager().getTemplatePath)("icons/proton-native/linux");
    } else {
      return (0, _pathManager().getTemplatePath)("icons/proton-native/proton-native.icns");
    }
  }

  createTransformer() {
    let babel;
    const babelOptions = {
      ast: false,
      sourceMaps: "inline"
    };

    if (process.env.TEST_SET_BABEL_PRESET === "true") {
      babel = require("@babel/core");
      babel = testOnlyBabel(babel, babelOptions, this.version);
    } else {
      try {
        babel = require("babel-core");
      } catch (e) {
        // babel isn't installed
        _builderUtil().log.debug(null, "don't transpile source code using Babel");

        return null;
      }
    }

    _builderUtil().log.info({
      options: (0, _builderUtilRuntime().safeStringifyJson)(babelOptions, new Set(["presets"]))
    }, "transpile source code using Babel");

    return file => {
      if (!(file.endsWith(".js") || file.endsWith(".jsx")) || file.includes(_fileTransformer().NODE_MODULES_PATTERN)) {
        return null;
      }

      return new Promise((resolve, reject) => {
        return babel.transformFile(file, babelOptions, (error, result) => {
          if (error == null) {
            resolve(result.code);
          } else {
            reject(error);
          }
        });
      });
    };
  }

}

exports.ProtonFramework = ProtonFramework;

function testOnlyBabel(babel, babelOptions, nodeVersion) {
  // out test dir can be located outside of electron-builder node_modules and babel cannot resolve string names of preset
  babelOptions.presets = [[require("@babel/preset-env").default, {
    targets: {
      node: nodeVersion
    }
  }], require("@babel/preset-react")];
  babelOptions.plugins = [// stage 0
  require("@babel/plugin-proposal-function-bind").default, // stage 1
  require("@babel/plugin-proposal-export-default-from").default, require("@babel/plugin-proposal-logical-assignment-operators").default, [require("@babel/plugin-proposal-optional-chaining").default, {
    loose: false
  }], [require("@babel/plugin-proposal-pipeline-operator").default, {
    proposal: "minimal"
  }], [require("@babel/plugin-proposal-nullish-coalescing-operator").default, {
    loose: false
  }], require("@babel/plugin-proposal-do-expressions").default, // stage 2
  [require("@babel/plugin-proposal-decorators").default, {
    legacy: true
  }], require("@babel/plugin-proposal-function-sent").default, require("@babel/plugin-proposal-export-namespace-from").default, require("@babel/plugin-proposal-numeric-separator").default, require("@babel/plugin-proposal-throw-expressions").default, // stage 3
  require("@babel/plugin-syntax-dynamic-import").default, require("@babel/plugin-syntax-import-meta").default, [require("@babel/plugin-proposal-class-properties").default, {
    loose: false
  }], require("@babel/plugin-proposal-json-strings").default];
  babelOptions.babelrc = false;
  return babel;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=ProtonFramework.js.map{"version":3,"sources":["../src/ProtonFramework.ts"],"names":[],"mappings":"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","sourcesContent":["import { FileTransformer } from \"builder-util/out/fs\"\nimport { log } from \"builder-util\"\nimport { safeStringifyJson } from \"builder-util-runtime\"\nimport { Platform } from \"./core\"\nimport { NODE_MODULES_PATTERN } from \"./fileTransformer\"\nimport { LibUiFramework } from \"./frameworks/LibUiFramework\"\nimport { getTemplatePath } from \"./util/pathManager\"\n\nexport class ProtonFramework extends LibUiFramework {\n  readonly name = \"proton\"\n\n  // noinspection JSUnusedGlobalSymbols\n  readonly defaultAppIdPrefix = \"com.proton-native.\"\n\n  constructor(version: string, distMacOsAppName: string, isUseLaunchUi: boolean) {\n    super(version, distMacOsAppName, isUseLaunchUi)\n  }\n\n  getDefaultIcon(platform: Platform) {\n    if (platform === Platform.WINDOWS) {\n      return getTemplatePath(\"icons/proton-native/proton-native.ico\")\n    }\n    else if (platform === Platform.LINUX) {\n      return getTemplatePath(\"icons/proton-native/linux\")\n    }\n    else {\n      return getTemplatePath(\"icons/proton-native/proton-native.icns\")\n    }\n  }\n\n  createTransformer(): FileTransformer | null {\n    let babel: any\n    const babelOptions: any = {ast: false, sourceMaps: \"inline\"}\n    if (process.env.TEST_SET_BABEL_PRESET === \"true\") {\n      babel = require(\"@babel/core\")\n      babel = testOnlyBabel(babel, babelOptions, this.version)\n    }\n    else {\n      try {\n        babel = require(\"babel-core\")\n      }\n      catch (e) {\n        // babel isn't installed\n        log.debug(null, \"don't transpile source code using Babel\")\n        return null\n      }\n    }\n\n    log.info({options: safeStringifyJson(babelOptions, new Set<string>([\"presets\"]))}, \"transpile source code using Babel\")\n    return file => {\n      if (!(file.endsWith(\".js\") || file.endsWith(\".jsx\")) || file.includes(NODE_MODULES_PATTERN)) {\n        return null\n      }\n\n      return new Promise((resolve, reject) => {\n        return babel.transformFile(file, babelOptions, (error: Error, result: any) => {\n          if (error == null) {\n            resolve(result.code)\n          }\n          else {\n            reject(error)\n          }\n        })\n      })\n    }\n  }\n}\n\nfunction testOnlyBabel(babel: any, babelOptions: any, nodeVersion: string) {\n  // out test dir can be located outside of electron-builder node_modules and babel cannot resolve string names of preset\n  babelOptions.presets = [\n    [require(\"@babel/preset-env\").default, {targets: {node: nodeVersion}}],\n    require(\"@babel/preset-react\"),\n  ]\n  babelOptions.plugins = [\n    // stage 0\n    require(\"@babel/plugin-proposal-function-bind\").default,\n\n    // stage 1\n    require(\"@babel/plugin-proposal-export-default-from\").default,\n    require(\"@babel/plugin-proposal-logical-assignment-operators\").default,\n    [require(\"@babel/plugin-proposal-optional-chaining\").default, {loose: false}],\n    [require(\"@babel/plugin-proposal-pipeline-operator\").default, {proposal: \"minimal\"}],\n    [require(\"@babel/plugin-proposal-nullish-coalescing-operator\").default, {loose: false}],\n    require(\"@babel/plugin-proposal-do-expressions\").default,\n\n    // stage 2\n    [require(\"@babel/plugin-proposal-decorators\").default, {legacy: true}],\n    require(\"@babel/plugin-proposal-function-sent\").default,\n    require(\"@babel/plugin-proposal-export-namespace-from\").default,\n    require(\"@babel/plugin-proposal-numeric-separator\").default,\n    require(\"@babel/plugin-proposal-throw-expressions\").default,\n\n    // stage 3\n    require(\"@babel/plugin-syntax-dynamic-import\").default,\n    require(\"@babel/plugin-syntax-import-meta\").default,\n    [require(\"@babel/plugin-proposal-class-properties\").default, {loose: false}],\n    require(\"@babel/plugin-proposal-json-strings\").default,\n  ]\n  babelOptions.babelrc = false\n  return babel\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.filterCFBundleIdentifier = filterCFBundleIdentifier;
exports.smarten = smarten;
exports.AppInfo = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _sanitizeFilename() {
  const data = _interopRequireDefault(require("sanitize-filename"));

  _sanitizeFilename = function () {
    return data;
  };

  return data;
}

function _semver() {
  const data = require("semver");

  _semver = function () {
    return data;
  };

  return data;
}

function _macroExpander() {
  const data = require("./util/macroExpander");

  _macroExpander = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

class AppInfo {
  constructor(info, buildVersion, platformSpecificOptions = null) {
    this.info = info;
    this.platformSpecificOptions = platformSpecificOptions;
    this.description = smarten(this.info.metadata.description || "");
    this.version = info.metadata.version;

    if (buildVersion == null) {
      buildVersion = info.config.buildVersion;
    }

    this.buildNumber = process.env.BUILD_NUMBER || process.env.TRAVIS_BUILD_NUMBER || process.env.APPVEYOR_BUILD_NUMBER || process.env.CIRCLE_BUILD_NUM || process.env.BUILD_BUILDNUMBER || process.env.CI_PIPELINE_IID;

    if (buildVersion == null) {
      buildVersion = this.version;

      if (!(0, _builderUtil().isEmptyOrSpaces)(this.buildNumber)) {
        buildVersion += `.${this.buildNumber}`;
      }
    }

    this.buildVersion = buildVersion;
    this.productName = info.config.productName || info.metadata.productName || info.metadata.name;
    this.productFilename = (0, _sanitizeFilename().default)(this.productName);
  }

  get channel() {
    const prereleaseInfo = (0, _semver().prerelease)(this.version);

    if (prereleaseInfo != null && prereleaseInfo.length > 0) {
      return prereleaseInfo[0];
    }

    return null;
  }

  getVersionInWeirdWindowsForm(isSetBuildNumber = true) {
    const parsedVersion = new (_semver().SemVer)(this.version); // https://github.com/electron-userland/electron-builder/issues/2635#issuecomment-371792272

    let buildNumber = isSetBuildNumber ? this.buildNumber : null;

    if (buildNumber == null || !/^\d+$/.test(buildNumber)) {
      buildNumber = "0";
    }

    return `${parsedVersion.major}.${parsedVersion.minor}.${parsedVersion.patch}.${buildNumber}`;
  }

  get notNullDevMetadata() {
    return this.info.devMetadata || {};
  }

  get companyName() {
    const author = this.info.metadata.author || this.notNullDevMetadata.author;
    return author == null ? null : author.name;
  }

  get id() {
    let appId = null;

    for (const options of [this.platformSpecificOptions, this.info.config]) {
      if (options != null && appId == null) {
        appId = options.appId;
      }
    }

    const generateDefaultAppId = () => {
      const info = this.info;
      return `${info.framework.defaultAppIdPrefix}${info.metadata.name.toLowerCase()}`;
    };

    if (appId != null && (appId === "your.id" || (0, _builderUtil().isEmptyOrSpaces)(appId))) {
      const incorrectAppId = appId;
      appId = generateDefaultAppId();

      _builderUtil().log.warn(`do not use "${incorrectAppId}" as appId, "${appId}" will be used instead`);
    }

    return appId == null ? generateDefaultAppId() : appId;
  }

  get macBundleIdentifier() {
    return filterCFBundleIdentifier(this.id);
  }

  get name() {
    return this.info.metadata.name;
  }

  get linuxPackageName() {
    const name = this.name; // https://github.com/electron-userland/electron-builder/issues/2963

    return name.startsWith("@") ? this.productFilename : name;
  }

  get sanitizedName() {
    return (0, _sanitizeFilename().default)(this.name);
  }

  get updaterCacheDirName() {
    return this.sanitizedName.toLowerCase() + "-updater";
  }

  get copyright() {
    const copyright = this.info.config.copyright;

    if (copyright != null) {
      return (0, _macroExpander().expandMacro)(copyright, null, this);
    }

    return `Copyright Â© ${new Date().getFullYear()} ${this.companyName || this.productName}`;
  }

  computePackageUrl() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const url = _this.info.metadata.homepage || _this.notNullDevMetadata.homepage;

      if (url != null) {
        return url;
      }

      const info = yield _this.info.repositoryInfo;
      return info == null || info.type !== "github" ? null : `https://${info.domain}/${info.user}/${info.project}`;
    })();
  }

}
/** @internal */


exports.AppInfo = AppInfo;

function filterCFBundleIdentifier(identifier) {
  // Remove special characters and allow only alphanumeric (A-Z,a-z,0-9), hyphen (-), and period (.)
  // Apple documentation: https://developer.apple.com/library/mac/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070
  return identifier.replace(/ /g, "-").replace(/[^a-zA-Z0-9.-]/g, "");
} // fpm bug - rpm build --description is not escaped, well... decided to replace quite to smart quote
// http://leancrew.com/all-this/2010/11/smart-quotes-in-javascript/


function smarten(s) {
  // opening singles
  s = s.replace(/(^|[-\u2014\s(\["])'/g, "$1\u2018"); // closing singles & apostrophes

  s = s.replace(/'/g, "\u2019"); // opening doubles

  s = s.replace(/(^|[-\u2014/\[(\u2018\s])"/g, "$1\u201c"); // closing doubles

  s = s.replace(/"/g, "\u201d");
  return s;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=appInfo.js.map{"version":3,"sources":["../src/appInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEmptyOrSpaces, log } from \"builder-util\"\nimport sanitizeFileName from \"sanitize-filename\"\nimport { prerelease, SemVer } from \"semver\"\nimport { PlatformSpecificBuildOptions } from \"./options/PlatformSpecificBuildOptions\"\nimport { Packager } from \"./packager\"\nimport { expandMacro } from \"./util/macroExpander\"\n\nexport class AppInfo {\n  readonly description = smarten(this.info.metadata.description || \"\")\n  readonly version: string\n\n  readonly buildNumber: string | undefined\n  readonly buildVersion: string\n\n  readonly productName: string\n  readonly productFilename: string\n\n  constructor(private readonly info: Packager, buildVersion: string | null | undefined, private readonly platformSpecificOptions: PlatformSpecificBuildOptions | null = null) {\n    this.version = info.metadata.version!!\n\n    if (buildVersion == null) {\n      buildVersion = info.config.buildVersion\n    }\n\n    this.buildNumber = process.env.BUILD_NUMBER || process.env.TRAVIS_BUILD_NUMBER || process.env.APPVEYOR_BUILD_NUMBER || process.env.CIRCLE_BUILD_NUM || process.env.BUILD_BUILDNUMBER || process.env.CI_PIPELINE_IID\n    if (buildVersion == null) {\n      buildVersion = this.version\n      if (!isEmptyOrSpaces(this.buildNumber)) {\n        buildVersion += `.${this.buildNumber}`\n      }\n    }\n    this.buildVersion = buildVersion\n\n    this.productName = info.config.productName || info.metadata.productName || info.metadata.name!!\n    this.productFilename = sanitizeFileName(this.productName)\n  }\n\n  get channel(): string | null {\n    const prereleaseInfo = prerelease(this.version)\n    if (prereleaseInfo != null && prereleaseInfo.length > 0) {\n      return prereleaseInfo[0]\n    }\n    return null\n  }\n\n  getVersionInWeirdWindowsForm(isSetBuildNumber = true): string {\n    const parsedVersion = new SemVer(this.version)\n    // https://github.com/electron-userland/electron-builder/issues/2635#issuecomment-371792272\n    let buildNumber = isSetBuildNumber ? this.buildNumber : null\n    if (buildNumber == null || !/^\\d+$/.test(buildNumber)) {\n      buildNumber = \"0\"\n    }\n    return `${parsedVersion.major}.${parsedVersion.minor}.${parsedVersion.patch}.${buildNumber}`\n  }\n\n  private get notNullDevMetadata() {\n    return this.info.devMetadata || {}\n  }\n\n  get companyName(): string | null {\n    const author = this.info.metadata.author || this.notNullDevMetadata.author\n    return author == null ? null : author.name\n  }\n\n  get id(): string {\n    let appId: string | null | undefined = null\n    for (const options of [this.platformSpecificOptions, this.info.config]) {\n      if (options != null && appId == null) {\n        appId = options.appId\n      }\n    }\n\n    const generateDefaultAppId = () => {\n      const info = this.info\n      return `${info.framework.defaultAppIdPrefix}${info.metadata.name!.toLowerCase()}`\n    }\n\n    if (appId != null && (appId === \"your.id\" || isEmptyOrSpaces(appId))) {\n      const incorrectAppId = appId\n      appId = generateDefaultAppId()\n      log.warn(`do not use \"${incorrectAppId}\" as appId, \"${appId}\" will be used instead`)\n    }\n\n    return appId == null ? generateDefaultAppId() : appId\n  }\n\n  get macBundleIdentifier(): string {\n    return filterCFBundleIdentifier(this.id)\n  }\n\n  get name(): string {\n    return this.info.metadata.name!!\n  }\n\n  get linuxPackageName(): string {\n    const name = this.name\n    // https://github.com/electron-userland/electron-builder/issues/2963\n    return name.startsWith(\"@\") ? this.productFilename : name\n  }\n\n  get sanitizedName(): string {\n    return sanitizeFileName(this.name)\n  }\n\n  get updaterCacheDirName(): string {\n    return this.sanitizedName.toLowerCase() + \"-updater\"\n  }\n\n  get copyright(): string {\n    const copyright = this.info.config.copyright\n    if (copyright != null) {\n      return expandMacro(copyright, null, this)\n    }\n    return `Copyright Â© ${new Date().getFullYear()} ${this.companyName || this.productName}`\n  }\n\n  async computePackageUrl(): Promise<string | null> {\n    const url = this.info.metadata.homepage || this.notNullDevMetadata.homepage\n    if (url != null) {\n      return url\n    }\n\n    const info = await this.info.repositoryInfo\n    return info == null || info.type !== \"github\"  ? null : `https://${info.domain}/${info.user}/${info.project}`\n  }\n}\n\n/** @internal */\nexport function filterCFBundleIdentifier(identifier: string) {\n  // Remove special characters and allow only alphanumeric (A-Z,a-z,0-9), hyphen (-), and period (.)\n  // Apple documentation: https://developer.apple.com/library/mac/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070\n  return identifier.replace(/ /g, \"-\").replace(/[^a-zA-Z0-9.-]/g, \"\")\n}\n\n// fpm bug - rpm build --description is not escaped, well... decided to replace quite to smart quote\n// http://leancrew.com/all-this/2010/11/smart-quotes-in-javascript/\nexport function smarten(s: string): string {\n  // opening singles\n  s = s.replace(/(^|[-\\u2014\\s(\\[\"])'/g, \"$1\\u2018\")\n  // closing singles & apostrophes\n  s = s.replace(/'/g, \"\\u2019\")\n  // opening doubles\n  s = s.replace(/(^|[-\\u2014/\\[(\\u2018\\s])\"/g, \"$1\\u201c\")\n  // closing doubles\n  s = s.replace(/\"/g, \"\\u201d\")\n  return s\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.download = download;
exports.getBinFromUrl = getBinFromUrl;
exports.getBin = getBin;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

const versionToPromise = new Map();

function download(url, output, checksum) {
  const args = ["download", "--url", url, "--output", output];

  if (checksum != null) {
    args.push("--sha512", checksum);
  }

  return (0, _builderUtil().executeAppBuilder)(args);
}

function getBinFromUrl(name, version, checksum) {
  const dirName = `${name}-${version}`;
  let url;

  if (process.env.ELECTRON_BUILDER_BINARIES_DOWNLOAD_OVERRIDE_URL) {
    url = process.env.ELECTRON_BUILDER_BINARIES_DOWNLOAD_OVERRIDE_URL + "/" + dirName + ".7z";
  } else {
    const baseUrl = process.env.NPM_CONFIG_ELECTRON_BUILDER_BINARIES_MIRROR || process.env.npm_config_electron_builder_binaries_mirror || process.env.npm_package_config_electron_builder_binaries_mirror || process.env.ELECTRON_BUILDER_BINARIES_MIRROR || "https://github.com/electron-userland/electron-builder-binaries/releases/download/";
    const middleUrl = process.env.NPM_CONFIG_ELECTRON_BUILDER_BINARIES_CUSTOM_DIR || process.env.npm_config_electron_builder_binaries_custom_dir || process.env.npm_package_config_electron_builder_binaries_custom_dir || process.env.ELECTRON_BUILDER_BINARIES_CUSTOM_DIR || dirName;
    const urlSuffix = dirName + ".7z";
    url = `${baseUrl}${middleUrl}/${urlSuffix}`;
  }

  return getBin(dirName, url, checksum);
}

function getBin(name, url, checksum) {
  let promise = versionToPromise.get(name); // if rejected, we will try to download again

  if (promise != null) {
    return promise;
  }

  promise = doGetBin(name, url, checksum);
  versionToPromise.set(name, promise);
  return promise;
}

function doGetBin(name, url, checksum) {
  const args = ["download-artifact", "--name", name];

  if (url != null) {
    args.push("--url", url);
  }

  if (checksum != null) {
    args.push("--sha512", checksum);
  }

  return (0, _builderUtil().executeAppBuilder)(args);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=binDownload.js.map{"version":3,"sources":["../src/binDownload.ts"],"names":[],"mappings":";;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA,MAAM,gBAAgB,GAAG,IAAI,GAAJ,EAAzB;;AAEM,SAAU,QAAV,CAAmB,GAAnB,EAAgC,MAAhC,EAAgD,QAAhD,EAAwE;AAC5E,QAAM,IAAI,GAAG,CAAC,UAAD,EAAa,OAAb,EAAsB,GAAtB,EAA2B,UAA3B,EAAuC,MAAvC,CAAb;;AACA,MAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,IAAA,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,QAAtB;AACD;;AACD,SAAO,sCAAkB,IAAlB,CAAP;AACD;;AAEK,SAAU,aAAV,CAAwB,IAAxB,EAAsC,OAAtC,EAAuD,QAAvD,EAAuE;AAC3E,QAAM,OAAO,GAAG,GAAG,IAAI,IAAI,OAAO,EAAlC;AACA,MAAI,GAAJ;;AACA,MAAI,OAAO,CAAC,GAAR,CAAY,+CAAhB,EAAiE;AAC/D,IAAA,GAAG,GAAG,OAAO,CAAC,GAAR,CAAY,+CAAZ,GAA8D,GAA9D,GAAoE,OAApE,GAA8E,KAApF;AACD,GAFD,MAGK;AAEH,UAAM,OAAO,GAAG,OAAO,CAAC,GAAR,CAAY,2CAAZ,IACd,OAAO,CAAC,GAAR,CAAY,2CADE,IAEd,OAAO,CAAC,GAAR,CAAY,mDAFE,IAGd,OAAO,CAAC,GAAR,CAAY,gCAHE,IAId,mFAJF;AAKA,UAAM,SAAS,GAAG,OAAO,CAAC,GAAR,CAAY,+CAAZ,IAChB,OAAO,CAAC,GAAR,CAAY,+CADI,IAEhB,OAAO,CAAC,GAAR,CAAY,uDAFI,IAGhB,OAAO,CAAC,GAAR,CAAY,oCAHI,IAIhB,OAJF;AAKA,UAAM,SAAS,GAAG,OAAO,GAAG,KAA5B;AACA,IAAA,GAAG,GAAG,GAAG,OAAO,GAAG,SAAS,IAAI,SAAS,EAAzC;AACD;;AAED,SAAO,MAAM,CAAC,OAAD,EAAU,GAAV,EAAe,QAAf,CAAb;AACD;;AAEK,SAAU,MAAV,CAAiB,IAAjB,EAA+B,GAA/B,EAAoD,QAApD,EAA4E;AAChF,MAAI,OAAO,GAAG,gBAAgB,CAAC,GAAjB,CAAqB,IAArB,CAAd,CADgF,CAEhF;;AACA,MAAI,OAAO,IAAI,IAAf,EAAqB;AACnB,WAAO,OAAP;AACD;;AAED,EAAA,OAAO,GAAG,QAAQ,CAAC,IAAD,EAAO,GAAP,EAAY,QAAZ,CAAlB;AACA,EAAA,gBAAgB,CAAC,GAAjB,CAAqB,IAArB,EAA2B,OAA3B;AACA,SAAO,OAAP;AACD;;AAED,SAAS,QAAT,CAAkB,IAAlB,EAAgC,GAAhC,EAAgE,QAAhE,EAAmG;AACjG,QAAM,IAAI,GAAG,CAAC,mBAAD,EAAsB,QAAtB,EAAgC,IAAhC,CAAb;;AACA,MAAI,GAAG,IAAI,IAAX,EAAiB;AACf,IAAA,IAAI,CAAC,IAAL,CAAU,OAAV,EAAmB,GAAnB;AACD;;AACD,MAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,IAAA,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,QAAtB;AACD;;AACD,SAAO,sCAAkB,IAAlB,CAAP;AACD,C","sourcesContent":["import { executeAppBuilder } from \"builder-util\"\n\nconst versionToPromise = new Map<string, Promise<string>>()\n\nexport function download(url: string, output: string, checksum?: string | null): Promise<void> {\n  const args = [\"download\", \"--url\", url, \"--output\", output]\n  if (checksum != null) {\n    args.push(\"--sha512\", checksum)\n  }\n  return executeAppBuilder(args) as Promise<any>\n}\n\nexport function getBinFromUrl(name: string, version: string, checksum: string): Promise<string> {\n  const dirName = `${name}-${version}`\n  let url: string\n  if (process.env.ELECTRON_BUILDER_BINARIES_DOWNLOAD_OVERRIDE_URL) {\n    url = process.env.ELECTRON_BUILDER_BINARIES_DOWNLOAD_OVERRIDE_URL + \"/\" + dirName + \".7z\"\n  }\n  else {\n\n    const baseUrl = process.env.NPM_CONFIG_ELECTRON_BUILDER_BINARIES_MIRROR ||\n      process.env.npm_config_electron_builder_binaries_mirror ||\n      process.env.npm_package_config_electron_builder_binaries_mirror ||\n      process.env.ELECTRON_BUILDER_BINARIES_MIRROR ||\n      \"https://github.com/electron-userland/electron-builder-binaries/releases/download/\"\n    const middleUrl = process.env.NPM_CONFIG_ELECTRON_BUILDER_BINARIES_CUSTOM_DIR ||\n      process.env.npm_config_electron_builder_binaries_custom_dir ||\n      process.env.npm_package_config_electron_builder_binaries_custom_dir ||\n      process.env.ELECTRON_BUILDER_BINARIES_CUSTOM_DIR ||\n      dirName\n    const urlSuffix = dirName + \".7z\"\n    url = `${baseUrl}${middleUrl}/${urlSuffix}`\n  }\n\n  return getBin(dirName, url, checksum)\n}\n\nexport function getBin(name: string, url?: string | null, checksum?: string | null): Promise<string> {\n  let promise = versionToPromise.get(name)\n  // if rejected, we will try to download again\n  if (promise != null) {\n    return promise\n  }\n\n  promise = doGetBin(name, url, checksum)\n  versionToPromise.set(name, promise)\n  return promise\n}\n\nfunction doGetBin(name: string, url: string | undefined | null, checksum: string | null | undefined): Promise<string> {\n  const args = [\"download-artifact\", \"--name\", name]\n  if (url != null) {\n    args.push(\"--url\", url)\n  }\n  if (checksum != null) {\n    args.push(\"--sha512\", checksum)\n  }\n  return executeAppBuilder(args)\n}"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=configuration.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.DIR_TARGET = exports.DEFAULT_TARGET = exports.Target = exports.Platform = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

class Platform {
  constructor(name, buildConfigurationKey, nodeName) {
    this.name = name;
    this.buildConfigurationKey = buildConfigurationKey;
    this.nodeName = nodeName;
  }

  toString() {
    return this.name;
  }

  createTarget(type, ...archs) {
    if (type == null && (archs == null || archs.length === 0)) {
      return new Map([[this, new Map()]]);
    }

    const archToType = new Map();

    if (this === Platform.MAC) {
      archs = [_builderUtil().Arch.x64];
    }

    for (const arch of archs == null || archs.length === 0 ? [(0, _builderUtil().archFromString)(process.arch)] : archs) {
      archToType.set(arch, type == null ? [] : Array.isArray(type) ? type : [type]);
    }

    return new Map([[this, archToType]]);
  }

  static current() {
    return Platform.fromString(process.platform);
  }

  static fromString(name) {
    name = name.toLowerCase();

    switch (name) {
      case Platform.MAC.nodeName:
      case Platform.MAC.name:
        return Platform.MAC;

      case Platform.WINDOWS.nodeName:
      case Platform.WINDOWS.name:
      case Platform.WINDOWS.buildConfigurationKey:
        return Platform.WINDOWS;

      case Platform.LINUX.nodeName:
        return Platform.LINUX;

      default:
        throw new Error(`Unknown platform: ${name}`);
    }
  }

}

exports.Platform = Platform;
Platform.MAC = new Platform("mac", "mac", "darwin");
Platform.LINUX = new Platform("linux", "linux", "linux");
Platform.WINDOWS = new Platform("windows", "win", "win32");

class Target {
  constructor(name, isAsyncSupported = true) {
    this.name = name;
    this.isAsyncSupported = isAsyncSupported;
  }

  checkOptions() {// ignore

    return (0, _bluebirdLst().coroutine)(function* () {})();
  }

  finishBuild() {
    return Promise.resolve();
  }

}

exports.Target = Target;
const DEFAULT_TARGET = "default";
exports.DEFAULT_TARGET = DEFAULT_TARGET;
const DIR_TARGET = "dir"; exports.DIR_TARGET = DIR_TARGET;
// __ts-babel@6.0.4
//# sourceMappingURL=core.js.map{"version":3,"sources":["../src/core.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, archFromString, ArchType } from \"builder-util\"\nimport { Publish } from \"builder-util-runtime\"\n\nexport type TargetConfigType = Array<string | TargetConfiguration> | string | TargetConfiguration | null\n\nexport interface TargetConfiguration {\n  /**\n   * The target name. e.g. `snap`.\n   */\n  readonly target: string\n\n  /**\n   * The arch or list of archs.\n   */\n  readonly arch?: Array<ArchType> | ArchType\n}\n\nexport class Platform {\n  static MAC = new Platform(\"mac\", \"mac\", \"darwin\")\n  static LINUX = new Platform(\"linux\", \"linux\", \"linux\")\n  static WINDOWS = new Platform(\"windows\", \"win\", \"win32\")\n\n  constructor(public name: string, public buildConfigurationKey: string, public nodeName: NodeJS.Platform) {\n  }\n\n  toString() {\n    return this.name\n  }\n\n  createTarget(type?: string | Array<string> | null, ...archs: Array<Arch>): Map<Platform, Map<Arch, Array<string>>> {\n    if (type == null && (archs == null || archs.length === 0)) {\n      return new Map([[this, new Map()]])\n    }\n\n    const archToType = new Map()\n    if (this === Platform.MAC) {\n      archs = [Arch.x64]\n    }\n\n    for (const arch of (archs == null || archs.length === 0 ? [archFromString(process.arch)] : archs)) {\n      archToType.set(arch, type == null ? [] : (Array.isArray(type) ? type : [type]))\n    }\n    return new Map([[this, archToType]])\n  }\n\n  static current(): Platform {\n    return Platform.fromString(process.platform)\n  }\n\n  static fromString(name: string): Platform {\n    name = name.toLowerCase()\n    switch (name) {\n      case Platform.MAC.nodeName:\n      case Platform.MAC.name:\n        return Platform.MAC\n\n      case Platform.WINDOWS.nodeName:\n      case Platform.WINDOWS.name:\n      case Platform.WINDOWS.buildConfigurationKey:\n        return Platform.WINDOWS\n\n      case Platform.LINUX.nodeName:\n        return Platform.LINUX\n\n      default:\n        throw new Error(`Unknown platform: ${name}`)\n    }\n  }\n}\n\nexport abstract class Target {\n  abstract readonly outDir: string\n  abstract readonly options: TargetSpecificOptions | null | undefined\n\n  protected constructor(readonly name: string, readonly isAsyncSupported: boolean = true) {\n  }\n\n  async checkOptions(): Promise<any> {\n    // ignore\n  }\n\n  abstract build(appOutDir: string, arch: Arch): Promise<any>\n\n  finishBuild(): Promise<any> {\n    return Promise.resolve()\n  }\n}\n\nexport interface TargetSpecificOptions {\n  /**\n   The [artifact file name template](/configuration/configuration#artifact-file-name-template).\n   */\n  readonly artifactName?: string | null\n\n  publish?: Publish\n}\n\nexport const DEFAULT_TARGET = \"default\"\nexport const DIR_TARGET = \"dir\"\n\nexport type CompressionLevel = \"store\" | \"normal\" | \"maximum\"\n\nexport interface BeforeBuildContext {\n  readonly appDir: string\n  readonly electronVersion: string\n  readonly platform: Platform\n  readonly arch: string\n}\n\nexport interface SourceRepositoryInfo {\n  type?: string\n  domain?: string\n  user: string\n  project: string\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.authorEmailIsMissed = void 0;
const authorEmailIsMissed = `Please specify author 'email' in the application package.json

See https://docs.npmjs.com/files/package.json#people-fields-author-contributors

It is required to set Linux .deb package maintainer. Or you can set maintainer in the custom linux options.
(see https://www.electron.build/configuration/linux).
`; exports.authorEmailIsMissed = authorEmailIsMissed;
// __ts-babel@6.0.4
//# sourceMappingURL=errorMessages.js.map{"version":3,"sources":["../src/errorMessages.ts"],"names":[],"mappings":";;;;;;AAAO,MAAM,mBAAmB,GAAG;;;;;;CAA5B,C","sourcesContent":["export const authorEmailIsMissed = `Please specify author 'email' in the application package.json\n\nSee https://docs.npmjs.com/files/package.json#people-fields-author-contributors\n\nIt is required to set Linux .deb package maintainer. Or you can set maintainer in the custom linux options.\n(see https://www.electron.build/configuration/linux).\n`"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getMainFileMatchers = getMainFileMatchers;
exports.getNodeModuleFileMatcher = getNodeModuleFileMatcher;
exports.getFileMatchers = getFileMatchers;
exports.copyFiles = copyFiles;
exports.FileMatcher = exports.excludedExts = exports.excludedNames = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _minimatch() {
  const data = require("minimatch");

  _minimatch = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _filter() {
  const data = require("./util/filter");

  _filter = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

// https://github.com/electron-userland/electron-builder/issues/733
const minimatchOptions = {
  dot: true
}; // noinspection SpellCheckingInspection

const excludedNames = ".git,.hg,.svn,CVS,RCS,SCCS," + "__pycache__,.DS_Store,thumbs.db,.gitignore,.gitkeep,.gitattributes,.npmignore," + ".idea,.vs,.flowconfig,.jshintrc,.eslintrc,.circleci," + ".yarn-integrity,.yarn-metadata.json,yarn-error.log,yarn.lock,package-lock.json,npm-debug.log," + "appveyor.yml,.travis.yml,circle.yml,.nyc_output";
exports.excludedNames = excludedNames;
const excludedExts = "iml,hprof,orig,pyc,pyo,rbc,swp,csproj,sln,suo,xproj,cc,d.ts";
exports.excludedExts = excludedExts;

function ensureNoEndSlash(file) {
  if (path.sep !== "/") {
    file = file.replace(/\//g, path.sep);
  }

  if (path.sep !== "\\") {
    file = file.replace(/\\/g, path.sep);
  }

  if (file.endsWith(path.sep)) {
    return file.substring(0, file.length - 1);
  } else {
    return file;
  }
}
/** @internal */


class FileMatcher {
  constructor(from, to, macroExpander, patterns) {
    this.macroExpander = macroExpander;
    this.excludePatterns = null;
    this.from = ensureNoEndSlash(macroExpander(from));
    this.to = ensureNoEndSlash(macroExpander(to));
    this.patterns = (0, _builderUtil().asArray)(patterns).map(it => this.normalizePattern(it));
    this.isSpecifiedAsEmptyArray = Array.isArray(patterns) && patterns.length === 0;
  }

  normalizePattern(pattern) {
    if (pattern.startsWith("./")) {
      pattern = pattern.substring("./".length);
    }

    return path.posix.normalize(this.macroExpander(pattern.replace(/\\/g, "/")));
  }

  addPattern(pattern) {
    this.patterns.push(this.normalizePattern(pattern));
  }

  prependPattern(pattern) {
    this.patterns.unshift(this.normalizePattern(pattern));
  }

  isEmpty() {
    return this.patterns.length === 0;
  }

  containsOnlyIgnore() {
    return !this.isEmpty() && this.patterns.find(it => !it.startsWith("!")) == null;
  }

  computeParsedPatterns(result, fromDir) {
    const relativeFrom = fromDir == null ? null : path.relative(fromDir, this.from);

    if (this.patterns.length === 0 && relativeFrom != null) {
      // file mappings, from here is a file
      result.push(new (_minimatch().Minimatch)(relativeFrom, minimatchOptions));
      return;
    }

    for (let pattern of this.patterns) {
      if (relativeFrom != null) {
        pattern = path.join(relativeFrom, pattern);
      }

      const parsedPattern = new (_minimatch().Minimatch)(pattern, minimatchOptions);
      result.push(parsedPattern); // do not add if contains dot (possibly file if has extension)

      if (!pattern.includes(".") && !(0, _filter().hasMagic)(parsedPattern)) {
        // https://github.com/electron-userland/electron-builder/issues/545
        // add **/*
        result.push(new (_minimatch().Minimatch)(`${pattern}/**/*`, minimatchOptions));
      }
    }
  }

  createFilter() {
    const parsedPatterns = [];
    this.computeParsedPatterns(parsedPatterns);
    return (0, _filter().createFilter)(this.from, parsedPatterns, this.excludePatterns);
  }

  toString() {
    return `from: ${this.from}, to: ${this.to}, patterns: ${this.patterns.join(", ")}`;
  }

}
/** @internal */


exports.FileMatcher = FileMatcher;

function getMainFileMatchers(appDir, destination, macroExpander, platformSpecificBuildOptions, platformPackager, outDir, isElectronCompile) {
  const packager = platformPackager.info;
  const buildResourceDir = path.resolve(packager.projectDir, packager.buildResourcesDir);
  let matchers = packager.isPrepackedAppAsar ? null : getFileMatchers(packager.config, "files", destination, {
    macroExpander,
    customBuildOptions: platformSpecificBuildOptions,
    globalOutDir: outDir,
    defaultSrc: appDir
  });

  if (matchers == null) {
    matchers = [new FileMatcher(appDir, destination, macroExpander)];
  }

  const matcher = matchers[0]; // add default patterns, but only if from equals to app dir

  if (matcher.from !== appDir) {
    return matchers;
  } // https://github.com/electron-userland/electron-builder/issues/1741#issuecomment-311111418 so, do not use inclusive patterns


  const patterns = matcher.patterns;
  const customFirstPatterns = []; // electron-webpack - we need to copy only package.json and node_modules from root dir (and these files are added by default), so, explicit empty array is specified

  if (!matcher.isSpecifiedAsEmptyArray && (matcher.isEmpty() || matcher.containsOnlyIgnore())) {
    customFirstPatterns.push("**/*");
  } else if (!patterns.includes("package.json")) {
    patterns.push("package.json");
  } // https://github.com/electron-userland/electron-builder/issues/1482


  const relativeBuildResourceDir = path.relative(matcher.from, buildResourceDir);

  if (relativeBuildResourceDir.length !== 0 && !relativeBuildResourceDir.startsWith(".")) {
    customFirstPatterns.push(`!${relativeBuildResourceDir}{,/**/*}`);
  }

  const relativeOutDir = matcher.normalizePattern(path.relative(packager.projectDir, outDir));

  if (!relativeOutDir.startsWith(".")) {
    customFirstPatterns.push(`!${relativeOutDir}{,/**/*}`);
  } // add our default exclusions after last user possibly defined "all"/permissive pattern


  let insertIndex = 0;

  for (let i = patterns.length - 1; i >= 0; i--) {
    if (patterns[i].startsWith("**/")) {
      insertIndex = i + 1;
      break;
    }
  }

  patterns.splice(insertIndex, 0, ...customFirstPatterns);
  patterns.push(`!**/*.{${excludedExts}${packager.config.includePdb === true ? "" : ",pdb"}`);
  patterns.push("!**/._*");
  patterns.push("!**/electron-builder.{yaml,yml,json,json5,toml}");
  patterns.push(`!**/{${excludedNames}}`);

  if (isElectronCompile) {
    patterns.push("!.cache{,/**/*}");
  } // https://github.com/electron-userland/electron-builder/issues/1969
  // exclude ony for app root, use .yarnclean to clean node_modules


  patterns.push("!.editorconfig");
  const debugLogger = packager.debugLogger;

  if (debugLogger.isEnabled) {
    //tslint:disable-next-line:no-invalid-template-strings
    debugLogger.add(`${macroExpander("${arch}")}.firstOrDefaultFilePatterns`, patterns);
  }

  return matchers;
}
/** @internal */


function getNodeModuleFileMatcher(appDir, destination, macroExpander, platformSpecificBuildOptions, packager) {
  // https://github.com/electron-userland/electron-builder/pull/2948#issuecomment-392241632
  // grab only excludes
  const matcher = new FileMatcher(appDir, destination, macroExpander);

  function addPatterns(patterns) {
    if (patterns == null) {
      return;
    } else if (!Array.isArray(patterns)) {
      if (typeof patterns === "string" && patterns.startsWith("!")) {
        matcher.addPattern(patterns);
        return;
      } // ignore object form


      return;
    }

    for (const pattern of patterns) {
      if (typeof pattern === "string") {
        if (pattern.startsWith("!")) {
          matcher.addPattern(pattern);
        }
      } else {
        const fileSet = pattern;

        if (fileSet.from == null || fileSet.from === ".") {
          for (const p of (0, _builderUtil().asArray)(fileSet.filter)) {
            matcher.addPattern(p);
          }
        }
      }
    }
  }

  addPatterns(packager.config.files);
  addPatterns(platformSpecificBuildOptions.files);

  if (!matcher.isEmpty()) {
    matcher.prependPattern("**/*");
  }

  const debugLogger = packager.debugLogger;

  if (debugLogger.isEnabled) {
    //tslint:disable-next-line:no-invalid-template-strings
    debugLogger.add(`${macroExpander("${arch}")}.nodeModuleFilePatterns`, matcher.patterns);
  }

  return matcher;
}
/** @internal */


function getFileMatchers(config, name, defaultDestination, options) {
  const defaultMatcher = new FileMatcher(options.defaultSrc, defaultDestination, options.macroExpander);
  const fileMatchers = [];

  function addPatterns(patterns) {
    if (patterns == null) {
      return;
    } else if (!Array.isArray(patterns)) {
      if (typeof patterns === "string") {
        defaultMatcher.addPattern(patterns);
        return;
      }

      patterns = [patterns];
    }

    for (const pattern of patterns) {
      if (typeof pattern === "string") {
        // use normalize to transform ./foo to foo
        defaultMatcher.addPattern(pattern);
      } else if (name === "asarUnpack") {
        throw new Error(`Advanced file copying not supported for "${name}"`);
      } else {
        const from = pattern.from == null ? options.defaultSrc : path.resolve(options.defaultSrc, pattern.from);
        const to = pattern.to == null ? defaultDestination : path.resolve(defaultDestination, pattern.to);
        fileMatchers.push(new FileMatcher(from, to, options.macroExpander, pattern.filter));
      }
    }
  }

  if (name !== "extraDistFiles") {
    addPatterns(config[name]);
  }

  addPatterns(options.customBuildOptions[name]);

  if (!defaultMatcher.isEmpty()) {
    // default matcher should be first in the array
    fileMatchers.unshift(defaultMatcher);
  } // we cannot exclude the whole out dir, because sometimes users want to use some file in the out dir in the patterns


  const relativeOutDir = defaultMatcher.normalizePattern(path.relative(options.defaultSrc, options.globalOutDir));

  if (!relativeOutDir.startsWith(".")) {
    defaultMatcher.addPattern(`!${relativeOutDir}/*-unpacked{,/**/*}`);
  }

  return fileMatchers.length === 0 ? null : fileMatchers;
}
/** @internal */


function copyFiles(matchers, transformer, isUseHardLink) {
  if (matchers == null || matchers.length === 0) {
    return Promise.resolve();
  }

  return _bluebirdLst().default.map(matchers,
  /*#__PURE__*/
  function () {
    var _ref = (0, _bluebirdLst().coroutine)(function* (matcher) {
      const fromStat = yield (0, _fs().statOrNull)(matcher.from);

      if (fromStat == null) {
        _builderUtil().log.warn({
          from: matcher.from
        }, `file source doesn't exist`);

        return;
      }

      if (fromStat.isFile()) {
        const toStat = yield (0, _fs().statOrNull)(matcher.to); // https://github.com/electron-userland/electron-builder/issues/1245

        if (toStat != null && toStat.isDirectory()) {
          return yield (0, _fs().copyOrLinkFile)(matcher.from, path.join(matcher.to, path.basename(matcher.from)), fromStat, isUseHardLink);
        }

        yield (0, _fsExtraP().ensureDir)(path.dirname(matcher.to));
        return yield (0, _fs().copyOrLinkFile)(matcher.from, matcher.to, fromStat);
      }

      if (matcher.isEmpty() || matcher.containsOnlyIgnore()) {
        matcher.prependPattern("**/*");
      }

      _builderUtil().log.debug({
        matcher
      }, "copying files using pattern");

      return yield (0, _fs().copyDir)(matcher.from, matcher.to, {
        filter: matcher.createFilter(),
        transformer,
        isUseHardLink: isUseHardLink ? _fs().USE_HARD_LINKS : null
      });
    });

    return function (_x) {
      return _ref.apply(this, arguments);
    };
  }());
} 
// __ts-babel@6.0.4
//# sourceMappingURL=fileMatcher.js.map{"version":3,"sources":["../src/fileMatcher.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { asArray, log } from \"builder-util\"\nimport { copyDir, copyOrLinkFile, Filter, statOrNull, FileTransformer, USE_HARD_LINKS } from \"builder-util/out/fs\"\nimport { ensureDir } from \"fs-extra-p\"\nimport { Minimatch } from \"minimatch\"\nimport * as path from \"path\"\nimport { Configuration, FileSet, Packager, PlatformSpecificBuildOptions } from \"./index\"\nimport { PlatformPackager } from \"./platformPackager\"\nimport { createFilter, hasMagic } from \"./util/filter\"\n\n// https://github.com/electron-userland/electron-builder/issues/733\nconst minimatchOptions = {dot: true}\n\n// noinspection SpellCheckingInspection\nexport const excludedNames = \".git,.hg,.svn,CVS,RCS,SCCS,\" +\n  \"__pycache__,.DS_Store,thumbs.db,.gitignore,.gitkeep,.gitattributes,.npmignore,\" +\n  \".idea,.vs,.flowconfig,.jshintrc,.eslintrc,.circleci,\" +\n  \".yarn-integrity,.yarn-metadata.json,yarn-error.log,yarn.lock,package-lock.json,npm-debug.log,\" +\n  \"appveyor.yml,.travis.yml,circle.yml,.nyc_output\"\n\nexport const excludedExts = \"iml,hprof,orig,pyc,pyo,rbc,swp,csproj,sln,suo,xproj,cc,d.ts\"\n\nfunction ensureNoEndSlash(file: string): string {\n  if (path.sep !== \"/\") {\n    file = file.replace(/\\//g, path.sep)\n  }\n  if (path.sep !== \"\\\\\") {\n    file = file.replace(/\\\\/g, path.sep)\n  }\n\n  if (file.endsWith(path.sep)) {\n    return file.substring(0, file.length - 1)\n  }\n  else {\n    return file\n  }\n}\n\n/** @internal */\nexport class FileMatcher {\n  readonly from: string\n  readonly to: string\n\n  readonly patterns: Array<string>\n\n  excludePatterns: Array<Minimatch> | null = null\n\n  readonly isSpecifiedAsEmptyArray: boolean\n\n  constructor(from: string, to: string, readonly macroExpander: (pattern: string) => string, patterns?: Array<string> | string | null | undefined) {\n    this.from = ensureNoEndSlash(macroExpander(from))\n    this.to = ensureNoEndSlash(macroExpander(to))\n    this.patterns = asArray(patterns).map(it => this.normalizePattern(it))\n    this.isSpecifiedAsEmptyArray = Array.isArray(patterns) && patterns.length === 0\n  }\n\n  normalizePattern(pattern: string) {\n    if (pattern.startsWith(\"./\")) {\n      pattern = pattern.substring(\"./\".length)\n    }\n    return path.posix.normalize(this.macroExpander(pattern.replace(/\\\\/g, \"/\")))\n  }\n\n  addPattern(pattern: string) {\n    this.patterns.push(this.normalizePattern(pattern))\n  }\n\n  prependPattern(pattern: string) {\n    this.patterns.unshift(this.normalizePattern(pattern))\n  }\n\n  isEmpty() {\n    return this.patterns.length === 0\n  }\n\n  containsOnlyIgnore(): boolean {\n    return !this.isEmpty() && this.patterns.find(it => !it.startsWith(\"!\")) == null\n  }\n\n  computeParsedPatterns(result: Array<Minimatch>, fromDir?: string): void {\n    const relativeFrom = fromDir == null ? null : path.relative(fromDir, this.from)\n\n    if (this.patterns.length === 0 && relativeFrom != null) {\n      // file mappings, from here is a file\n      result.push(new Minimatch(relativeFrom, minimatchOptions))\n      return\n    }\n\n    for (let pattern of this.patterns) {\n      if (relativeFrom != null) {\n        pattern = path.join(relativeFrom, pattern)\n      }\n\n      const parsedPattern = new Minimatch(pattern, minimatchOptions)\n      result.push(parsedPattern)\n\n      // do not add if contains dot (possibly file if has extension)\n      if (!pattern.includes(\".\") && !hasMagic(parsedPattern)) {\n        // https://github.com/electron-userland/electron-builder/issues/545\n        // add **/*\n        result.push(new Minimatch(`${pattern}/**/*`, minimatchOptions))\n      }\n    }\n  }\n\n  createFilter(): Filter {\n    const parsedPatterns: Array<Minimatch> = []\n    this.computeParsedPatterns(parsedPatterns)\n    return createFilter(this.from, parsedPatterns, this.excludePatterns)\n  }\n\n  toString() {\n    return `from: ${this.from}, to: ${this.to}, patterns: ${this.patterns.join(\", \")}`\n  }\n}\n\n/** @internal */\nexport function getMainFileMatchers(appDir: string, destination: string, macroExpander: (pattern: string) => string, platformSpecificBuildOptions: PlatformSpecificBuildOptions, platformPackager: PlatformPackager<any>, outDir: string, isElectronCompile: boolean): Array<FileMatcher> {\n  const packager = platformPackager.info\n  const buildResourceDir = path.resolve(packager.projectDir, packager.buildResourcesDir)\n\n  let matchers = packager.isPrepackedAppAsar ? null : getFileMatchers(packager.config, \"files\", destination, {\n    macroExpander,\n    customBuildOptions: platformSpecificBuildOptions,\n    globalOutDir: outDir,\n    defaultSrc: appDir,\n  })\n  if (matchers == null) {\n    matchers = [new FileMatcher(appDir, destination, macroExpander)]\n  }\n\n  const matcher = matchers[0]\n  // add default patterns, but only if from equals to app dir\n  if (matcher.from !== appDir) {\n    return matchers\n  }\n\n  // https://github.com/electron-userland/electron-builder/issues/1741#issuecomment-311111418 so, do not use inclusive patterns\n  const patterns = matcher.patterns\n\n  const customFirstPatterns: Array<string> = []\n  // electron-webpack - we need to copy only package.json and node_modules from root dir (and these files are added by default), so, explicit empty array is specified\n  if (!matcher.isSpecifiedAsEmptyArray && (matcher.isEmpty() || matcher.containsOnlyIgnore())) {\n    customFirstPatterns.push(\"**/*\")\n  }\n  else if (!patterns.includes(\"package.json\")) {\n    patterns.push(\"package.json\")\n  }\n\n  // https://github.com/electron-userland/electron-builder/issues/1482\n  const relativeBuildResourceDir = path.relative(matcher.from, buildResourceDir)\n  if (relativeBuildResourceDir.length !== 0 && !relativeBuildResourceDir.startsWith(\".\")) {\n    customFirstPatterns.push(`!${relativeBuildResourceDir}{,/**/*}`)\n  }\n\n  const relativeOutDir = matcher.normalizePattern(path.relative(packager.projectDir, outDir))\n  if (!relativeOutDir.startsWith(\".\")) {\n    customFirstPatterns.push(`!${relativeOutDir}{,/**/*}`)\n  }\n\n  // add our default exclusions after last user possibly defined \"all\"/permissive pattern\n  let insertIndex = 0\n  for (let i = patterns.length - 1; i >= 0; i--) {\n    if (patterns[i].startsWith(\"**/\")) {\n      insertIndex = i + 1\n      break\n    }\n  }\n  patterns.splice(insertIndex, 0, ...customFirstPatterns)\n\n  patterns.push(`!**/*.{${excludedExts}${packager.config.includePdb === true ? \"\" : \",pdb\"}`)\n  patterns.push(\"!**/._*\")\n  patterns.push(\"!**/electron-builder.{yaml,yml,json,json5,toml}\")\n  patterns.push(`!**/{${excludedNames}}`)\n\n  if (isElectronCompile) {\n    patterns.push(\"!.cache{,/**/*}\")\n  }\n\n  // https://github.com/electron-userland/electron-builder/issues/1969\n  // exclude ony for app root, use .yarnclean to clean node_modules\n  patterns.push(\"!.editorconfig\")\n\n  const debugLogger = packager.debugLogger\n  if (debugLogger.isEnabled) {\n    //tslint:disable-next-line:no-invalid-template-strings\n    debugLogger.add(`${macroExpander(\"${arch}\")}.firstOrDefaultFilePatterns`, patterns)\n  }\n  return matchers\n}\n\n/** @internal */\nexport function getNodeModuleFileMatcher(appDir: string, destination: string, macroExpander: (pattern: string) => string, platformSpecificBuildOptions: PlatformSpecificBuildOptions, packager: Packager): FileMatcher {\n  // https://github.com/electron-userland/electron-builder/pull/2948#issuecomment-392241632\n  // grab only excludes\n  const matcher = new FileMatcher(appDir, destination, macroExpander)\n\n  function addPatterns(patterns: Array<string | FileSet> | string | null | undefined | FileSet) {\n    if (patterns == null) {\n      return\n    }\n    else if (!Array.isArray(patterns)) {\n      if (typeof patterns === \"string\" && patterns.startsWith(\"!\")) {\n        matcher.addPattern(patterns)\n        return\n      }\n      // ignore object form\n      return\n    }\n\n    for (const pattern of patterns) {\n      if (typeof pattern === \"string\") {\n        if (pattern.startsWith(\"!\")) {\n          matcher.addPattern(pattern)\n        }\n      }\n      else {\n        const fileSet = (pattern as FileSet)\n        if (fileSet.from == null || fileSet.from === \".\") {\n          for (const p of asArray(fileSet.filter)) {\n            matcher.addPattern(p)\n          }\n        }\n      }\n    }\n  }\n\n  addPatterns(packager.config.files)\n  addPatterns(platformSpecificBuildOptions.files)\n\n  if (!matcher.isEmpty()) {\n    matcher.prependPattern(\"**/*\")\n  }\n\n  const debugLogger = packager.debugLogger\n  if (debugLogger.isEnabled) {\n    //tslint:disable-next-line:no-invalid-template-strings\n    debugLogger.add(`${macroExpander(\"${arch}\")}.nodeModuleFilePatterns`, matcher.patterns)\n  }\n\n  return matcher\n}\n\nexport interface GetFileMatchersOptions {\n  readonly macroExpander: (pattern: string) => string\n  readonly customBuildOptions: PlatformSpecificBuildOptions\n  readonly globalOutDir: string\n\n  readonly defaultSrc: string\n}\n\n/** @internal */\nexport function getFileMatchers(config: Configuration, name: \"files\" | \"extraFiles\" | \"extraResources\" | \"asarUnpack\" | \"extraDistFiles\", defaultDestination: string, options: GetFileMatchersOptions): Array<FileMatcher> | null {\n  const defaultMatcher = new FileMatcher(options.defaultSrc, defaultDestination, options.macroExpander)\n  const fileMatchers: Array<FileMatcher> = []\n\n  function addPatterns(patterns: Array<string | FileSet> | string | null | undefined | FileSet) {\n    if (patterns == null) {\n      return\n    }\n    else if (!Array.isArray(patterns)) {\n      if (typeof patterns === \"string\") {\n        defaultMatcher.addPattern(patterns)\n        return\n      }\n      patterns = [patterns]\n    }\n\n    for (const pattern of patterns) {\n      if (typeof pattern === \"string\") {\n        // use normalize to transform ./foo to foo\n        defaultMatcher.addPattern(pattern)\n      }\n      else if (name === \"asarUnpack\") {\n        throw new Error(`Advanced file copying not supported for \"${name}\"`)\n      }\n      else {\n        const from = pattern.from == null ? options.defaultSrc : path.resolve(options.defaultSrc, pattern.from)\n        const to = pattern.to == null ? defaultDestination : path.resolve(defaultDestination, pattern.to)\n        fileMatchers.push(new FileMatcher(from, to, options.macroExpander, pattern.filter))\n      }\n    }\n  }\n\n  if (name !== \"extraDistFiles\") {\n    addPatterns((config as any)[name])\n  }\n  addPatterns((options.customBuildOptions as any)[name])\n\n  if (!defaultMatcher.isEmpty()) {\n    // default matcher should be first in the array\n    fileMatchers.unshift(defaultMatcher)\n  }\n\n  // we cannot exclude the whole out dir, because sometimes users want to use some file in the out dir in the patterns\n  const relativeOutDir = defaultMatcher.normalizePattern(path.relative(options.defaultSrc, options.globalOutDir))\n  if (!relativeOutDir.startsWith(\".\")) {\n    defaultMatcher.addPattern(`!${relativeOutDir}/*-unpacked{,/**/*}`)\n  }\n\n  return fileMatchers.length === 0 ? null : fileMatchers\n}\n\n/** @internal */\nexport function copyFiles(matchers: Array<FileMatcher> | null, transformer: FileTransformer | null, isUseHardLink?: boolean): Promise<any> {\n  if (matchers == null || matchers.length === 0) {\n    return Promise.resolve()\n  }\n\n  return BluebirdPromise.map(matchers, async (matcher: FileMatcher) => {\n    const fromStat = await statOrNull(matcher.from)\n    if (fromStat == null) {\n      log.warn({from: matcher.from}, `file source doesn't exist`)\n      return\n    }\n\n    if (fromStat.isFile()) {\n      const toStat = await statOrNull(matcher.to)\n      // https://github.com/electron-userland/electron-builder/issues/1245\n      if (toStat != null && toStat.isDirectory()) {\n        return await copyOrLinkFile(matcher.from, path.join(matcher.to, path.basename(matcher.from)), fromStat, isUseHardLink)\n      }\n\n      await ensureDir(path.dirname(matcher.to))\n      return await copyOrLinkFile(matcher.from, matcher.to, fromStat)\n    }\n\n    if (matcher.isEmpty() || matcher.containsOnlyIgnore()) {\n      matcher.prependPattern(\"**/*\")\n    }\n    log.debug({matcher}, \"copying files using pattern\")\n    return await copyDir(matcher.from, matcher.to, {filter: matcher.createFilter(), transformer, isUseHardLink: isUseHardLink ? USE_HARD_LINKS : null})\n  })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isElectronCompileUsed = isElectronCompileUsed;
exports.hasDep = hasDep;
exports.createTransformer = createTransformer;
exports.createElectronCompilerHost = createElectronCompilerHost;
exports.NODE_MODULES_PATTERN = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/** @internal */
const NODE_MODULES_PATTERN = `${path.sep}node_modules${path.sep}`;
/** @internal */

exports.NODE_MODULES_PATTERN = NODE_MODULES_PATTERN;

function isElectronCompileUsed(info) {
  if (info.config.electronCompile != null) {
    return info.config.electronCompile;
  } // if in devDependencies - it means that babel is used for precompilation or for some reason user decided to not use electron-compile for production


  return hasDep("electron-compile", info);
}
/** @internal */


function hasDep(name, info) {
  const deps = info.metadata.dependencies;
  return deps != null && name in deps;
}
/** @internal */


function createTransformer(srcDir, configuration, extraMetadata, extraTransformer) {
  const mainPackageJson = path.join(srcDir, "package.json");
  const isRemovePackageScripts = configuration.removePackageScripts !== false;
  const packageJson = path.sep + "package.json";
  return file => {
    if (file === mainPackageJson) {
      return modifyMainPackageJson(file, extraMetadata, isRemovePackageScripts);
    }

    if (file.endsWith(packageJson) && file.includes(NODE_MODULES_PATTERN)) {
      return (0, _fsExtraP().readFile)(file, "utf-8").then(it => cleanupPackageJson(JSON.parse(it), {
        isMain: false,
        isRemovePackageScripts
      })).catch(e => _builderUtil().log.warn(e));
    } else if (extraTransformer != null) {
      return extraTransformer(file);
    } else {
      return null;
    }
  };
}
/** @internal */


function createElectronCompilerHost(projectDir, cacheDir) {
  const electronCompilePath = path.join(projectDir, "node_modules", "electron-compile", "lib");
  return require(path.join(electronCompilePath, "config-parser")).createCompilerHostFromProjectRoot(projectDir, cacheDir);
}

const ignoredPackageMetadataProperties = new Set(["dist", "gitHead", "keywords", "build", "jspm", "ava", "xo", "nyc", "eslintConfig", "contributors", "bundleDependencies", "tags"]);

function cleanupPackageJson(data, options) {
  const deps = data.dependencies; // https://github.com/electron-userland/electron-builder/issues/507#issuecomment-312772099

  const isRemoveBabel = deps != null && typeof deps === "object" && !Object.getOwnPropertyNames(deps).some(it => it.startsWith("babel"));

  try {
    let changed = false;

    for (const prop of Object.getOwnPropertyNames(data)) {
      // removing devDependencies from package.json breaks levelup in electron, so, remove it only from main package.json
      if (prop[0] === "_" || ignoredPackageMetadataProperties.has(prop) || options.isRemovePackageScripts && prop === "scripts" || options.isMain && prop === "devDependencies" || !options.isMain && prop === "bugs" || isRemoveBabel && prop === "babel") {
        delete data[prop];
        changed = true;
      }
    }

    if (changed) {
      return JSON.stringify(data, null, 2);
    }
  } catch (e) {
    (0, _builderUtil().debug)(e);
  }

  return null;
}

function modifyMainPackageJson(_x, _x2, _x3) {
  return _modifyMainPackageJson.apply(this, arguments);
} function _modifyMainPackageJson() {
  _modifyMainPackageJson = (0, _bluebirdLst().coroutine)(function* (file, extraMetadata, isRemovePackageScripts) {
    const mainPackageData = JSON.parse((yield (0, _fsExtraP().readFile)(file, "utf-8")));

    if (extraMetadata != null) {
      (0, _builderUtil().deepAssign)(mainPackageData, extraMetadata);
    } // https://github.com/electron-userland/electron-builder/issues/1212


    const serializedDataIfChanged = cleanupPackageJson(mainPackageData, {
      isMain: true,
      isRemovePackageScripts
    });

    if (serializedDataIfChanged != null) {
      return serializedDataIfChanged;
    } else if (extraMetadata != null) {
      return JSON.stringify(mainPackageData, null, 2);
    }

    return null;
  });
  return _modifyMainPackageJson.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=fileTransformer.js.map{"version":3,"sources":["../src/fileTransformer.ts"],"names":[],"mappings":"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","sourcesContent":["import { debug, log, deepAssign } from \"builder-util\"\nimport { FileTransformer } from \"builder-util/out/fs\"\nimport { readFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { Configuration } from \"./configuration\"\nimport { Packager } from \"./packager\"\n\n/** @internal */\nexport const NODE_MODULES_PATTERN = `${path.sep}node_modules${path.sep}`\n\n/** @internal */\nexport function isElectronCompileUsed(info: Packager): boolean {\n  if (info.config.electronCompile != null) {\n    return info.config.electronCompile\n  }\n\n  // if in devDependencies - it means that babel is used for precompilation or for some reason user decided to not use electron-compile for production\n  return hasDep(\"electron-compile\", info)\n}\n\n/** @internal */\nexport function hasDep(name: string, info: Packager) {\n  const deps = info.metadata.dependencies\n  return deps != null && name in deps\n}\n\n/** @internal */\nexport function createTransformer(srcDir: string, configuration: Configuration, extraMetadata: any, extraTransformer: FileTransformer | null): FileTransformer {\n  const mainPackageJson = path.join(srcDir, \"package.json\")\n  const isRemovePackageScripts = configuration.removePackageScripts !== false\n  const packageJson = path.sep + \"package.json\"\n  return file => {\n    if (file === mainPackageJson) {\n      return modifyMainPackageJson(file, extraMetadata, isRemovePackageScripts)\n    }\n\n    if (file.endsWith(packageJson) && file.includes(NODE_MODULES_PATTERN)) {\n      return readFile(file, \"utf-8\")\n        .then(it => cleanupPackageJson(JSON.parse(it), {\n          isMain: false,\n          isRemovePackageScripts,\n        }))\n        .catch(e => log.warn(e))\n    }\n    else if (extraTransformer != null) {\n      return extraTransformer(file)\n    }\n    else {\n      return null\n    }\n  }\n}\n\n/** @internal */\nexport interface CompilerHost {\n  compile(file: string): any\n\n  saveConfiguration(): Promise<any>\n}\n\n/** @internal */\nexport function createElectronCompilerHost(projectDir: string, cacheDir: string): Promise<CompilerHost> {\n  const electronCompilePath = path.join(projectDir, \"node_modules\", \"electron-compile\", \"lib\")\n  return require(path.join(electronCompilePath, \"config-parser\")).createCompilerHostFromProjectRoot(projectDir, cacheDir)\n}\n\nconst ignoredPackageMetadataProperties = new Set([\"dist\", \"gitHead\", \"keywords\", \"build\", \"jspm\", \"ava\", \"xo\", \"nyc\", \"eslintConfig\", \"contributors\", \"bundleDependencies\", \"tags\"])\n\ninterface CleanupPackageFileOptions {\n  readonly isRemovePackageScripts: boolean\n  readonly isMain: boolean\n}\n\nfunction cleanupPackageJson(data: any, options: CleanupPackageFileOptions): any {\n  const deps = data.dependencies\n  // https://github.com/electron-userland/electron-builder/issues/507#issuecomment-312772099\n  const isRemoveBabel = deps != null && typeof deps === \"object\" && !Object.getOwnPropertyNames(deps).some(it => it.startsWith(\"babel\"))\n  try {\n    let changed = false\n    for (const prop of Object.getOwnPropertyNames(data)) {\n      // removing devDependencies from package.json breaks levelup in electron, so, remove it only from main package.json\n      if (prop[0] === \"_\" ||\n        ignoredPackageMetadataProperties.has(prop) ||\n        (options.isRemovePackageScripts && prop === \"scripts\") ||\n        (options.isMain && prop === \"devDependencies\") ||\n        (!options.isMain && prop === \"bugs\") ||\n        (isRemoveBabel && prop === \"babel\")) {\n        delete data[prop]\n        changed = true\n      }\n    }\n\n    if (changed) {\n      return JSON.stringify(data, null, 2)\n    }\n  }\n  catch (e) {\n    debug(e)\n  }\n\n  return null\n}\n\nasync function modifyMainPackageJson(file: string, extraMetadata: any, isRemovePackageScripts: boolean) {\n  const mainPackageData = JSON.parse(await readFile(file, \"utf-8\"))\n  if (extraMetadata != null) {\n    deepAssign(mainPackageData, extraMetadata)\n  }\n\n  // https://github.com/electron-userland/electron-builder/issues/1212\n  const serializedDataIfChanged = cleanupPackageJson(mainPackageData, {\n    isMain: true,\n    isRemovePackageScripts,\n  })\n  if (serializedDataIfChanged != null) {\n    return serializedDataIfChanged\n  }\n  else if (extraMetadata != null) {\n    return JSON.stringify(mainPackageData, null, 2)\n  }\n  return null\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.buildForge = buildForge;

var path = _interopRequireWildcard(require("path"));

function _index() {
  const data = require("./index");

  _index = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function buildForge(forgeOptions, options) {
  const appDir = forgeOptions.dir;
  return (0, _index().build)(Object.assign({
    prepackaged: appDir,
    config: {
      directories: {
        // https://github.com/electron-userland/electron-forge/blob/master/src/makers/generic/zip.js
        output: path.resolve(appDir, "..", "make")
      }
    }
  }, options));
} 
// __ts-babel@6.0.4
//# sourceMappingURL=forge-maker.js.map{"version":3,"sources":["../src/forge-maker.ts"],"names":[],"mappings":";;;;;;;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAOM,SAAU,UAAV,CAAqB,YAArB,EAAiD,OAAjD,EAAyE;AAC7E,QAAM,MAAM,GAAG,YAAY,CAAC,GAA5B;AACA,SAAO,oBAAK,MAAA,CAAA,MAAA,CAAA;AACV,IAAA,WAAW,EAAE,MADH;AAEV,IAAA,MAAM,EAAE;AACN,MAAA,WAAW,EAAE;AACX;AACA,QAAA,MAAM,EAAE,IAAI,CAAC,OAAL,CAAa,MAAb,EAAqB,IAArB,EAA2B,MAA3B;AAFG;AADP;AAFE,GAAA,EAQP,OARO,CAAL,CAAP;AAUD,C","sourcesContent":["import * as path from \"path\"\nimport { build } from \"./index\"\nimport { PackagerOptions } from \"./packagerApi\"\n\nexport interface ForgeOptions {\n  readonly dir: string\n}\n\nexport function buildForge(forgeOptions: ForgeOptions, options: PackagerOptions) {\n  const appDir = forgeOptions.dir\n  return build({\n    prepackaged: appDir,\n    config: {\n      directories: {\n        // https://github.com/electron-userland/electron-forge/blob/master/src/makers/generic/zip.js\n        output: path.resolve(appDir, \"..\", \"make\"),\n      },\n    },\n    ...options\n  })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.checkBuildRequestOptions = checkBuildRequestOptions;
exports.build = build;
Object.defineProperty(exports, "getArchSuffix", {
  enumerable: true,
  get: function () {
    return _builderUtil().getArchSuffix;
  }
});
Object.defineProperty(exports, "Arch", {
  enumerable: true,
  get: function () {
    return _builderUtil().Arch;
  }
});
Object.defineProperty(exports, "archFromString", {
  enumerable: true,
  get: function () {
    return _builderUtil().archFromString;
  }
});
Object.defineProperty(exports, "CancellationToken", {
  enumerable: true,
  get: function () {
    return _builderUtilRuntime().CancellationToken;
  }
});
Object.defineProperty(exports, "Packager", {
  enumerable: true,
  get: function () {
    return _packager().Packager;
  }
});
Object.defineProperty(exports, "PlatformPackager", {
  enumerable: true,
  get: function () {
    return _platformPackager().PlatformPackager;
  }
});
Object.defineProperty(exports, "PublishManager", {
  enumerable: true,
  get: function () {
    return _PublishManager().PublishManager;
  }
});
Object.defineProperty(exports, "Platform", {
  enumerable: true,
  get: function () {
    return _core().Platform;
  }
});
Object.defineProperty(exports, "Target", {
  enumerable: true,
  get: function () {
    return _core().Target;
  }
});
Object.defineProperty(exports, "DIR_TARGET", {
  enumerable: true,
  get: function () {
    return _core().DIR_TARGET;
  }
});
Object.defineProperty(exports, "DEFAULT_TARGET", {
  enumerable: true,
  get: function () {
    return _core().DEFAULT_TARGET;
  }
});
Object.defineProperty(exports, "AppInfo", {
  enumerable: true,
  get: function () {
    return _appInfo().AppInfo;
  }
});
Object.defineProperty(exports, "buildForge", {
  enumerable: true,
  get: function () {
    return _forgeMaker().buildForge;
  }
});

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _packager() {
  const data = require("./packager");

  _packager = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("./platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _PublishManager() {
  const data = require("./publish/PublishManager");

  _PublishManager = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("./core");

  _core = function () {
    return data;
  };

  return data;
}

function _appInfo() {
  const data = require("./appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _forgeMaker() {
  const data = require("./forge-maker");

  _forgeMaker = function () {
    return data;
  };

  return data;
}

const expectedOptions = new Set(["publish", "targets", "mac", "win", "linux", "projectDir", "platformPackagerFactory", "config", "effectiveOptionComputed", "prepackaged"]);

function checkBuildRequestOptions(options) {
  for (const optionName of Object.keys(options)) {
    if (!expectedOptions.has(optionName) && options[optionName] !== undefined) {
      throw new (_builderUtil().InvalidConfigurationError)(`Unknown option "${optionName}"`);
    }
  }
}

function build(options, packager = new (_packager().Packager)(options)) {
  checkBuildRequestOptions(options);
  const publishManager = new (_PublishManager().PublishManager)(packager, options);

  const sigIntHandler = () => {
    _builderUtil().log.warn("cancelled by SIGINT");

    packager.cancellationToken.cancel();
    publishManager.cancelTasks();
  };

  process.once("SIGINT", sigIntHandler);
  const promise = packager.build().then(
  /*#__PURE__*/
  function () {
    var _ref = (0, _bluebirdLst().coroutine)(function* (buildResult) {
      const afterAllArtifactBuild = (0, _platformPackager().resolveFunction)(buildResult.configuration.afterAllArtifactBuild, "afterAllArtifactBuild");

      if (afterAllArtifactBuild != null) {
        const newArtifacts = (0, _builderUtilRuntime().asArray)((yield Promise.resolve(afterAllArtifactBuild(buildResult))));

        if (newArtifacts.length === 0 || !publishManager.isPublish) {
          return buildResult.artifactPaths;
        }

        const publishConfigurations = yield publishManager.getGlobalPublishConfigurations();

        if (publishConfigurations == null || publishConfigurations.length === 0) {
          return buildResult.artifactPaths;
        }

        for (const newArtifact of newArtifacts) {
          buildResult.artifactPaths.push(newArtifact);

          for (const publishConfiguration of publishConfigurations) {
            publishManager.scheduleUpload(publishConfiguration, {
              file: newArtifact,
              arch: null
            }, packager.appInfo);
          }
        }
      }

      return buildResult.artifactPaths;
    });

    return function (_x) {
      return _ref.apply(this, arguments);
    };
  }());
  return (0, _promise().executeFinally)(promise, isErrorOccurred => {
    let promise;

    if (isErrorOccurred) {
      publishManager.cancelTasks();
      promise = Promise.resolve(null);
    } else {
      promise = publishManager.awaitTasks();
    }

    return promise.then(() => process.removeListener("SIGINT", sigIntHandler));
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=index.js.map{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { executeFinally } from \"builder-util/out/promise\"\nimport { PublishOptions } from \"electron-publish/out/publisher\"\nimport { log, InvalidConfigurationError } from \"builder-util\"\nimport { asArray } from \"builder-util-runtime\"\nimport { Packager } from \"./packager\"\nimport { PackagerOptions } from \"./packagerApi\"\nimport { resolveFunction } from \"./platformPackager\"\nimport { PublishManager } from \"./publish/PublishManager\"\n\nexport { Packager, BuildResult } from \"./packager\"\nexport { PackagerOptions, ArtifactCreated, ArtifactBuildStarted } from \"./packagerApi\"\nexport { TargetConfiguration, Platform, Target, DIR_TARGET, BeforeBuildContext, SourceRepositoryInfo, TargetSpecificOptions, TargetConfigType, DEFAULT_TARGET, CompressionLevel } from \"./core\"\nexport { getArchSuffix, Arch, archFromString } from \"builder-util\"\nexport { Configuration, AfterPackContext, MetadataDirectories } from \"./configuration\"\nexport { ElectronDownloadOptions, ElectronPlatformName } from \"./electron/ElectronFramework\"\nexport { PlatformSpecificBuildOptions, AsarOptions, FileSet, Protocol, ReleaseInfo } from \"./options/PlatformSpecificBuildOptions\"\nexport { FileAssociation } from \"./options/FileAssociation\"\nexport { MacConfiguration, DmgOptions, MasConfiguration, MacOsTargetName, DmgContent, DmgWindow } from \"./options/macOptions\"\nexport { PkgOptions, PkgBackgroundOptions, BackgroundAlignment, BackgroundScaling } from \"./options/pkgOptions\"\nexport { WindowsConfiguration } from \"./options/winOptions\"\nexport { AppXOptions } from \"./options/AppXOptions\"\nexport { MsiOptions } from \"./options/MsiOptions\"\nexport { CommonWindowsInstallerConfiguration } from \"./options/CommonWindowsInstallerConfiguration\"\nexport { NsisOptions, NsisWebOptions, PortableOptions, CommonNsisOptions } from \"./targets/nsis/nsisOptions\"\nexport { LinuxConfiguration, DebOptions, CommonLinuxOptions, LinuxTargetSpecificOptions, AppImageOptions } from \"./options/linuxOptions\"\nexport { SnapOptions } from \"./options/SnapOptions\"\nexport { Metadata, AuthorMetadata, RepositoryInfo } from \"./options/metadata\"\nexport { AppInfo } from \"./appInfo\"\nexport { SquirrelWindowsOptions } from \"./options/SquirrelWindowsOptions\"\nexport { WindowsSignOptions, CustomWindowsSignTaskConfiguration, WindowsSignTaskConfiguration, CustomWindowsSign, FileCodeSigningInfo, CertificateFromStoreInfo } from \"./codeSign/windowsCodeSign\"\nexport { CancellationToken, ProgressInfo } from \"builder-util-runtime\"\nexport { PublishOptions, UploadTask } from \"electron-publish\"\nexport { PublishManager } from \"./publish/PublishManager\"\nexport { PlatformPackager } from \"./platformPackager\"\nexport { Framework, PrepareApplicationStageDirectoryOptions } from \"./Framework\"\nexport { buildForge, ForgeOptions } from \"./forge-maker\"\n\nconst expectedOptions = new Set([\"publish\", \"targets\", \"mac\", \"win\", \"linux\", \"projectDir\", \"platformPackagerFactory\", \"config\", \"effectiveOptionComputed\", \"prepackaged\"])\n\nexport function checkBuildRequestOptions(options: PackagerOptions & PublishOptions) {\n  for (const optionName of Object.keys(options)) {\n    if (!expectedOptions.has(optionName) && (options as any)[optionName] !== undefined) {\n      throw new InvalidConfigurationError(`Unknown option \"${optionName}\"`)\n    }\n  }\n}\n\nexport function build(options: PackagerOptions & PublishOptions, packager: Packager = new Packager(options)): Promise<Array<string>> {\n  checkBuildRequestOptions(options)\n\n  const publishManager = new PublishManager(packager, options)\n  const sigIntHandler = () => {\n    log.warn(\"cancelled by SIGINT\")\n    packager.cancellationToken.cancel()\n    publishManager.cancelTasks()\n  }\n  process.once(\"SIGINT\", sigIntHandler)\n\n  const promise = packager.build()\n    .then(async buildResult => {\n      const afterAllArtifactBuild = resolveFunction(buildResult.configuration.afterAllArtifactBuild, \"afterAllArtifactBuild\")\n      if (afterAllArtifactBuild != null) {\n        const newArtifacts = asArray(await Promise.resolve(afterAllArtifactBuild(buildResult)))\n        if (newArtifacts.length === 0 || !publishManager.isPublish) {\n          return buildResult.artifactPaths\n        }\n\n        const publishConfigurations = await publishManager.getGlobalPublishConfigurations()\n        if (publishConfigurations == null || publishConfigurations.length === 0) {\n          return buildResult.artifactPaths\n        }\n\n        for (const newArtifact of newArtifacts) {\n          buildResult.artifactPaths.push(newArtifact)\n          for (const publishConfiguration of publishConfigurations) {\n            publishManager.scheduleUpload(publishConfiguration, {\n              file: newArtifact,\n              arch: null\n            }, packager.appInfo)\n          }\n        }\n      }\n      return buildResult.artifactPaths\n    })\n\n  return executeFinally(promise, isErrorOccurred => {\n    let promise: Promise<any>\n    if (isErrorOccurred) {\n      publishManager.cancelTasks()\n      promise = Promise.resolve(null)\n    }\n    else {\n      promise = publishManager.awaitTasks()\n    }\n\n    return promise\n      .then(() => process.removeListener(\"SIGINT\", sigIntHandler))\n  })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.toAppImageOrSnapArch = toAppImageOrSnapArch;
exports.LinuxPackager = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _sanitizeFilename() {
  const data = _interopRequireDefault(require("sanitize-filename"));

  _sanitizeFilename = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("./core");

  _core = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("./platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _RemoteBuilder() {
  const data = require("./remoteBuilder/RemoteBuilder");

  _RemoteBuilder = function () {
    return data;
  };

  return data;
}

function _LinuxTargetHelper() {
  const data = require("./targets/LinuxTargetHelper");

  _LinuxTargetHelper = function () {
    return data;
  };

  return data;
}

function _targetFactory() {
  const data = require("./targets/targetFactory");

  _targetFactory = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

class LinuxPackager extends _platformPackager().PlatformPackager {
  constructor(info) {
    super(info, _core().Platform.LINUX);
    const executableName = this.platformSpecificBuildOptions.executableName;
    this.executableName = executableName == null ? this.appInfo.sanitizedName.toLowerCase() : (0, _sanitizeFilename().default)(executableName);
  }

  get defaultTarget() {
    // on Windows default target is only Snap - reduce build server load, and... snap in most cases is fully enough.
    return process.platform === "win32" ? ["snap"] : ["snap", "appimage"];
  }

  createTargets(targets, mapper) {
    let helper;

    const getHelper = () => {
      if (helper == null) {
        helper = new (_LinuxTargetHelper().LinuxTargetHelper)(this);
      }

      return helper;
    };

    let remoteBuilder = null;

    for (const name of targets) {
      if (name === _core().DIR_TARGET) {
        continue;
      }

      const targetClass = (() => {
        switch (name) {
          case "appimage":
            return require("./targets/AppImageTarget").default;

          case "snap":
            return require("./targets/snap").default;

          case "deb":
          case "rpm":
          case "sh":
          case "freebsd":
          case "pacman":
          case "apk":
          case "p5p":
            return require("./targets/fpm").default;

          default:
            return null;
        }
      })();

      mapper(name, outDir => {
        if (targetClass === null) {
          return (0, _targetFactory().createCommonTarget)(name, outDir, this);
        }

        const target = new targetClass(name, this, getHelper(), outDir);

        if (process.platform === "win32" || process.env._REMOTE_BUILD) {
          if (remoteBuilder == null) {
            remoteBuilder = new (_RemoteBuilder().RemoteBuilder)(this);
          } // return remoteBuilder.buildTarget(this, arch, appOutDir, this.packager)


          return new RemoteTarget(target, remoteBuilder);
        }

        return target;
      });
    }
  }

}

exports.LinuxPackager = LinuxPackager;

class RemoteTarget extends _core().Target {
  constructor(target, remoteBuilder) {
    super(target.name, true
    /* all must be scheduled in time (so, on finishBuild RemoteBuilder will have all targets added - so, we must set isAsyncSupported to true (resolved promise is returned)) */
    );
    this.target = target;
    this.remoteBuilder = remoteBuilder;
    this.buildTaskManager = new (_builderUtil().AsyncTaskManager)(this.remoteBuilder.packager.info.cancellationToken);
  }

  get options() {
    return this.target.options;
  }

  get outDir() {
    return this.target.outDir;
  }

  finishBuild() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield _this.buildTaskManager.awaitTasks();
      yield _this.remoteBuilder.build();
    })();
  }

  build(appOutDir, arch) {
    const promise = this.doBuild(appOutDir, arch);
    this.buildTaskManager.addTask(promise);
    return promise;
  }

  doBuild(appOutDir, arch) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      _builderUtil().log.info({
        target: _this2.target.name,
        arch: _builderUtil().Arch[arch]
      }, "scheduling remote build");

      yield _this2.target.checkOptions();

      _this2.remoteBuilder.scheduleBuild(_this2.target, arch, appOutDir);
    })();
  }

}

function toAppImageOrSnapArch(arch) {
  switch (arch) {
    case _builderUtil().Arch.x64:
      return "x86_64";

    case _builderUtil().Arch.ia32:
      return "i386";

    case _builderUtil().Arch.armv7l:
      return "arm";

    case _builderUtil().Arch.arm64:
      return "arm_aarch64";

    default:
      throw new Error(`Unsupported arch ${arch}`);
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=linuxPackager.js.map{"version":3,"sources":["../src/linuxPackager.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, AsyncTaskManager, log } from \"builder-util\"\nimport sanitizeFileName from \"sanitize-filename\"\nimport { DIR_TARGET, Platform, Target, TargetSpecificOptions } from \"./core\"\nimport { LinuxConfiguration } from \"./options/linuxOptions\"\nimport { Packager } from \"./packager\"\nimport { PlatformPackager } from \"./platformPackager\"\nimport { RemoteBuilder } from \"./remoteBuilder/RemoteBuilder\"\nimport AppImageTarget from \"./targets/AppImageTarget\"\nimport FpmTarget from \"./targets/fpm\"\nimport { LinuxTargetHelper } from \"./targets/LinuxTargetHelper\"\nimport SnapTarget from \"./targets/snap\"\nimport { createCommonTarget } from \"./targets/targetFactory\"\n\nexport class LinuxPackager extends PlatformPackager<LinuxConfiguration> {\n  readonly executableName: string\n\n  constructor(info: Packager) {\n    super(info, Platform.LINUX)\n\n    const executableName = this.platformSpecificBuildOptions.executableName\n    this.executableName = executableName == null ? this.appInfo.sanitizedName.toLowerCase() : sanitizeFileName(executableName)\n  }\n\n  get defaultTarget(): Array<string> {\n    // on Windows default target is only Snap - reduce build server load, and... snap in most cases is fully enough.\n    return process.platform === \"win32\" ? [\"snap\"] : [\"snap\", \"appimage\"]\n  }\n\n  createTargets(targets: Array<string>, mapper: (name: string, factory: (outDir: string) => Target) => void): void {\n    let helper: LinuxTargetHelper | null\n    const getHelper = () => {\n      if (helper == null) {\n        helper = new LinuxTargetHelper(this)\n      }\n      return helper\n    }\n\n    let remoteBuilder: RemoteBuilder | null = null\n\n    for (const name of targets) {\n      if (name === DIR_TARGET) {\n        continue\n      }\n\n      const targetClass: typeof AppImageTarget | typeof SnapTarget | typeof FpmTarget | null = (() => {\n        switch (name) {\n          case \"appimage\":\n            return require(\"./targets/AppImageTarget\").default\n          case \"snap\":\n            return require(\"./targets/snap\").default\n          case \"deb\":\n          case \"rpm\":\n          case \"sh\":\n          case \"freebsd\":\n          case \"pacman\":\n          case \"apk\":\n          case \"p5p\":\n            return require(\"./targets/fpm\").default\n          default:\n            return null\n        }\n      })()\n\n      mapper(name, outDir => {\n        if (targetClass === null) {\n          return createCommonTarget(name, outDir, this)\n        }\n\n        const target = new targetClass(name, this, getHelper(), outDir)\n        if (process.platform === \"win32\" || process.env._REMOTE_BUILD) {\n          if (remoteBuilder == null) {\n            remoteBuilder = new RemoteBuilder(this)\n          }\n          // return remoteBuilder.buildTarget(this, arch, appOutDir, this.packager)\n          return new RemoteTarget(target, remoteBuilder)\n        }\n        return target\n      })\n    }\n  }\n}\n\nclass RemoteTarget extends Target {\n  private buildTaskManager = new AsyncTaskManager(this.remoteBuilder.packager.info.cancellationToken)\n\n  get options(): TargetSpecificOptions | null | undefined {\n    return this.target.options\n  }\n\n  get outDir(): string {\n    return this.target.outDir\n  }\n\n  constructor(private readonly target: Target, private readonly remoteBuilder: RemoteBuilder) {\n    super(target.name, true /* all must be scheduled in time (so, on finishBuild RemoteBuilder will have all targets added - so, we must set isAsyncSupported to true (resolved promise is returned)) */)\n  }\n\n  async finishBuild() {\n    await this.buildTaskManager.awaitTasks()\n    await this.remoteBuilder.build()\n  }\n\n  build(appOutDir: string, arch: Arch) {\n    const promise = this.doBuild(appOutDir, arch)\n    this.buildTaskManager.addTask(promise)\n    return promise\n  }\n\n  private async doBuild(appOutDir: string, arch: Arch) {\n    log.info({target: this.target.name, arch: Arch[arch]}, \"scheduling remote build\")\n    await this.target.checkOptions()\n    this.remoteBuilder.scheduleBuild(this.target, arch, appOutDir)\n  }\n}\n\nexport function toAppImageOrSnapArch(arch: Arch): string {\n  switch (arch) {\n    case Arch.x64:\n      return \"x86_64\"\n    case Arch.ia32:\n      return \"i386\"\n    case Arch.armv7l:\n      return \"arm\"\n    case Arch.arm64:\n      return \"arm_aarch64\"\n\n    default:\n      throw new Error(`Unsupported arch ${arch}`)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _electronOsxSign() {
  const data = require("electron-osx-sign");

  _electronOsxSign = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _appInfo() {
  const data = require("./appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _macCodeSign() {
  const data = require("./codeSign/macCodeSign");

  _macCodeSign = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("./core");

  _core = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("./platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _ArchiveTarget() {
  const data = require("./targets/ArchiveTarget");

  _ArchiveTarget = function () {
    return data;
  };

  return data;
}

function _pkg() {
  const data = require("./targets/pkg");

  _pkg = function () {
    return data;
  };

  return data;
}

function _targetFactory() {
  const data = require("./targets/targetFactory");

  _targetFactory = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class MacPackager extends _platformPackager().PlatformPackager {
  constructor(info) {
    super(info, _core().Platform.MAC);
    this.codeSigningInfo = new (_lazyVal().Lazy)(() => {
      const cscLink = this.getCscLink();

      if (cscLink == null || process.platform !== "darwin") {
        return Promise.resolve({
          keychainName: process.env.CSC_KEYCHAIN || null
        });
      }

      return (0, _macCodeSign().createKeychain)({
        tmpDir: this.info.tempDirManager,
        cscLink,
        cscKeyPassword: this.getCscPassword(),
        cscILink: (0, _platformPackager().chooseNotNull)(this.platformSpecificBuildOptions.cscInstallerLink, process.env.CSC_INSTALLER_LINK),
        cscIKeyPassword: (0, _platformPackager().chooseNotNull)(this.platformSpecificBuildOptions.cscInstallerKeyPassword, process.env.CSC_INSTALLER_KEY_PASSWORD),
        currentDir: this.projectDir
      });
    });
    this._iconPath = new (_lazyVal().Lazy)(() => this.getOrConvertIcon("icns"));
  }

  get defaultTarget() {
    return this.info.framework.macOsDefaultTargets;
  }

  prepareAppInfo(appInfo) {
    return new (_appInfo().AppInfo)(this.info, this.platformSpecificBuildOptions.bundleVersion, this.platformSpecificBuildOptions);
  }

  getIconPath() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      return _this._iconPath.value;
    })();
  }

  createTargets(targets, mapper) {
    for (const name of targets) {
      switch (name) {
        case _core().DIR_TARGET:
          break;

        case "dmg":
          const {
            DmgTarget
          } = require("dmg-builder");

          mapper(name, outDir => new DmgTarget(this, outDir));
          break;

        case "zip":
          // https://github.com/electron-userland/electron-builder/issues/2313
          mapper(name, outDir => new (_ArchiveTarget().ArchiveTarget)(name, outDir, this, true));
          break;

        case "pkg":
          mapper(name, outDir => new (_pkg().PkgTarget)(this, outDir));
          break;

        default:
          mapper(name, outDir => name === "mas" || name === "mas-dev" ? new (_targetFactory().NoOpTarget)(name) : (0, _targetFactory().createCommonTarget)(name, outDir, this));
          break;
      }
    }
  }

  pack(outDir, arch, targets, taskManager) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      let nonMasPromise = null;
      const hasMas = targets.length !== 0 && targets.some(it => it.name === "mas" || it.name === "mas-dev");
      const prepackaged = _this2.packagerOptions.prepackaged;

      if (!hasMas || targets.length > 1) {
        const appPath = prepackaged == null ? path.join(_this2.computeAppOutDir(outDir, arch), `${_this2.appInfo.productFilename}.app`) : prepackaged;
        nonMasPromise = (prepackaged ? Promise.resolve() : _this2.doPack(outDir, path.dirname(appPath), _this2.platform.nodeName, arch, _this2.platformSpecificBuildOptions, targets)).then(() => _this2.packageInDistributableFormat(appPath, _builderUtil().Arch.x64, targets, taskManager));
      }

      for (const target of targets) {
        const targetName = target.name;

        if (!(targetName === "mas" || targetName === "mas-dev")) {
          continue;
        }

        const masBuildOptions = (0, _builderUtil().deepAssign)({}, _this2.platformSpecificBuildOptions, _this2.config.mas);

        if (targetName === "mas-dev") {
          (0, _builderUtil().deepAssign)(masBuildOptions, _this2.config[targetName], {
            type: "development"
          });
        }

        const targetOutDir = path.join(outDir, targetName);

        if (prepackaged == null) {
          yield _this2.doPack(outDir, targetOutDir, "mas", arch, masBuildOptions, [target]);
          yield _this2.sign(path.join(targetOutDir, `${_this2.appInfo.productFilename}.app`), targetOutDir, masBuildOptions);
        } else {
          yield _this2.sign(prepackaged, targetOutDir, masBuildOptions);
        }
      }

      if (nonMasPromise != null) {
        yield nonMasPromise;
      }
    })();
  }

  sign(appPath, outDir, masOptions) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (!(0, _macCodeSign().isSignAllowed)()) {
        return;
      }

      const isMas = masOptions != null;
      const macOptions = _this3.platformSpecificBuildOptions;
      const qualifier = (isMas ? masOptions.identity : null) || macOptions.identity;

      if (!isMas && qualifier === null) {
        if (_this3.forceCodeSigning) {
          throw new (_builderUtil().InvalidConfigurationError)("identity explicitly is set to null, but forceCodeSigning is set to true");
        }

        _builderUtil().log.info({
          reason: "identity explicitly is set to null"
        }, "skipped macOS code signing");

        return;
      }

      const keychainName = (yield _this3.codeSigningInfo.value).keychainName;
      const explicitType = isMas ? masOptions.type : macOptions.type;
      const type = explicitType || "distribution";
      const isDevelopment = type === "development";
      const certificateType = getCertificateType(isMas, isDevelopment);
      let identity = yield (0, _macCodeSign().findIdentity)(certificateType, qualifier, keychainName);

      if (identity == null) {
        if (!isMas && !isDevelopment && explicitType !== "distribution") {
          identity = yield (0, _macCodeSign().findIdentity)("Mac Developer", qualifier, keychainName);

          if (identity != null) {
            _builderUtil().log.warn("Mac Developer is used to sign app â€” it is only for development and testing, not for production");
          }
        }

        if (identity == null) {
          yield (0, _macCodeSign().reportError)(isMas, certificateType, qualifier, keychainName, _this3.forceCodeSigning);
          return;
        }
      }

      const signOptions = {
        "identity-validation": false,
        // https://github.com/electron-userland/electron-builder/issues/1699
        // kext are signed by the chipset manufacturers. You need a special certificate (only available on request) from Apple to be able to sign kext.
        ignore: file => {
          return file.endsWith(".kext") || file.startsWith("/Contents/PlugIns", appPath.length) || // https://github.com/electron-userland/electron-builder/issues/2010
          file.includes("/node_modules/puppeteer/.local-chromium");
        },
        identity: identity,
        type,
        platform: isMas ? "mas" : "darwin",
        version: _this3.config.electronVersion,
        app: appPath,
        keychain: keychainName || undefined,
        binaries: (isMas && masOptions != null ? masOptions.binaries : macOptions.binaries) || undefined,
        requirements: isMas || macOptions.requirements == null ? undefined : yield _this3.getResource(macOptions.requirements),
        // https://github.com/electron-userland/electron-osx-sign/issues/196
        // will fail on 10.14.5+ because a signed but unnotarized app is also rejected.
        "gatekeeper-assess": macOptions.gatekeeperAssess,
        "hardened-runtime": macOptions.hardenedRuntime
      };
      yield _this3.adjustSignOptions(signOptions, masOptions);

      _builderUtil().log.info({
        file: _builderUtil().log.filePath(appPath),
        identityName: identity.name,
        identityHash: identity.hash,
        provisioningProfile: signOptions["provisioning-profile"] || "none"
      }, "signing");

      yield _this3.doSign(signOptions); // https://github.com/electron-userland/electron-builder/issues/1196#issuecomment-312310209

      if (masOptions != null && !isDevelopment) {
        const certType = isDevelopment ? "Mac Developer" : "3rd Party Mac Developer Installer";
        const masInstallerIdentity = yield (0, _macCodeSign().findIdentity)(certType, masOptions.identity, keychainName);

        if (masInstallerIdentity == null) {
          throw new (_builderUtil().InvalidConfigurationError)(`Cannot find valid "${certType}" identity to sign MAS installer, please see https://electron.build/code-signing`);
        } // mas uploaded to AppStore, so, use "-" instead of space for name


        const artifactName = _this3.expandArtifactNamePattern(masOptions, "pkg");

        const artifactPath = path.join(outDir, artifactName);
        yield _this3.doFlat(appPath, artifactPath, masInstallerIdentity, keychainName);
        yield _this3.dispatchArtifactCreated(artifactPath, null, _builderUtil().Arch.x64, _this3.computeSafeArtifactName(artifactName, "pkg"));
      }
    })();
  }

  adjustSignOptions(signOptions, masOptions) {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const resourceList = yield _this4.resourceList;

      if (resourceList.includes(`entitlements.osx.plist`)) {
        throw new (_builderUtil().InvalidConfigurationError)("entitlements.osx.plist is deprecated name, please use entitlements.mac.plist");
      }

      if (resourceList.includes(`entitlements.osx.inherit.plist`)) {
        throw new (_builderUtil().InvalidConfigurationError)("entitlements.osx.inherit.plist is deprecated name, please use entitlements.mac.inherit.plist");
      }

      const customSignOptions = masOptions || _this4.platformSpecificBuildOptions;
      const entitlementsSuffix = masOptions == null ? "mac" : "mas";

      if (customSignOptions.entitlements == null) {
        const p = `entitlements.${entitlementsSuffix}.plist`;

        if (resourceList.includes(p)) {
          signOptions.entitlements = path.join(_this4.info.buildResourcesDir, p);
        }
      } else {
        signOptions.entitlements = customSignOptions.entitlements;
      }

      if (customSignOptions.entitlementsInherit == null) {
        const p = `entitlements.${entitlementsSuffix}.inherit.plist`;

        if (resourceList.includes(p)) {
          signOptions["entitlements-inherit"] = path.join(_this4.info.buildResourcesDir, p);
        }
      } else {
        signOptions["entitlements-inherit"] = customSignOptions.entitlementsInherit;
      }

      if (customSignOptions.provisioningProfile != null) {
        signOptions["provisioning-profile"] = customSignOptions.provisioningProfile;
      }
    })();
  } //noinspection JSMethodCanBeStatic


  doSign(opts) {
    return (0, _bluebirdLst().coroutine)(function* () {
      return (0, _electronOsxSign().signAsync)(opts);
    })();
  } //noinspection JSMethodCanBeStatic


  doFlat(appPath, outFile, identity, keychain) {
    return (0, _bluebirdLst().coroutine)(function* () {
      // productbuild doesn't created directory for out file
      yield (0, _fsExtraP().ensureDir)(path.dirname(outFile));
      const args = (0, _pkg().prepareProductBuildArgs)(identity, keychain);
      args.push("--component", appPath, "/Applications");
      args.push(outFile);
      return yield (0, _builderUtil().exec)("productbuild", args);
    })();
  }

  getElectronSrcDir(dist) {
    return path.resolve(this.projectDir, dist, this.info.framework.distMacOsAppName);
  }

  getElectronDestinationDir(appOutDir) {
    return path.join(appOutDir, this.info.framework.distMacOsAppName);
  } // todo fileAssociations


  applyCommonInfo(appPlist, contentsPath) {
    var _this5 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appInfo = _this5.appInfo;
      const appFilename = appInfo.productFilename; // https://github.com/electron-userland/electron-builder/issues/1278

      appPlist.CFBundleExecutable = appFilename.endsWith(" Helper") ? appFilename.substring(0, appFilename.length - " Helper".length) : appFilename;
      const icon = yield _this5.getIconPath();

      if (icon != null) {
        const oldIcon = appPlist.CFBundleIconFile;
        const resourcesPath = path.join(contentsPath, "Resources");

        if (oldIcon != null) {
          yield (0, _fs().unlinkIfExists)(path.join(resourcesPath, oldIcon));
        }

        const iconFileName = `${appFilename}.icns`;
        appPlist.CFBundleIconFile = iconFileName;
        yield (0, _fs().copyFile)(icon, path.join(resourcesPath, iconFileName));
      }

      appPlist.CFBundleName = appInfo.productName;
      appPlist.CFBundleDisplayName = appInfo.productName;
      const minimumSystemVersion = _this5.platformSpecificBuildOptions.minimumSystemVersion;

      if (minimumSystemVersion != null) {
        appPlist.LSMinimumSystemVersion = minimumSystemVersion;
      }

      appPlist.CFBundleIdentifier = appInfo.macBundleIdentifier;
      appPlist.CFBundleShortVersionString = _this5.platformSpecificBuildOptions.bundleShortVersion || appInfo.version;
      appPlist.CFBundleVersion = appInfo.buildVersion;
      (0, _builderUtil().use)(_this5.platformSpecificBuildOptions.category || _this5.config.category, it => appPlist.LSApplicationCategoryType = it);
      appPlist.NSHumanReadableCopyright = appInfo.copyright;

      if (_this5.platformSpecificBuildOptions.darkModeSupport) {
        appPlist.NSRequiresAquaSystemAppearance = false;
      }

      const extendInfo = _this5.platformSpecificBuildOptions.extendInfo;

      if (extendInfo != null) {
        Object.assign(appPlist, extendInfo);
      }
    })();
  }

  signApp(packContext, isAsar) {
    var _this6 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appFileName = `${_this6.appInfo.productFilename}.app`;
      yield _bluebirdLst().default.map((0, _fsExtraP().readdir)(packContext.appOutDir), file => {
        if (file === appFileName) {
          return _this6.sign(path.join(packContext.appOutDir, file), null, null);
        }

        return null;
      });

      if (!isAsar) {
        return;
      }

      const outResourcesDir = path.join(packContext.appOutDir, "resources", "app.asar.unpacked");
      yield _bluebirdLst().default.map((0, _promise().orIfFileNotExist)((0, _fsExtraP().readdir)(outResourcesDir), []), file => {
        if (file.endsWith(".app")) {
          return _this6.sign(path.join(outResourcesDir, file), null, null);
        } else {
          return null;
        }
      });
    })();
  }

}

exports.default = MacPackager;

function getCertificateType(isMas, isDevelopment) {
  if (isDevelopment) {
    return "Mac Developer";
  }

  return isMas ? "3rd Party Mac Developer Application" : "Developer ID Application";
} 
// __ts-babel@6.0.4
//# sourceMappingURL=macPackager.js.map{"version":3,"sources":["../src/macPackager.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { deepAssign, Arch, AsyncTaskManager, exec, InvalidConfigurationError, log, use } from \"builder-util\"\nimport { signAsync, SignOptions } from \"electron-osx-sign\"\nimport { ensureDir, readdir } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { copyFile, unlinkIfExists } from \"builder-util/out/fs\"\nimport { orIfFileNotExist } from \"builder-util/out/promise\"\nimport { AppInfo } from \"./appInfo\"\nimport { CertType, CodeSigningInfo, createKeychain, findIdentity, Identity, isSignAllowed, reportError } from \"./codeSign/macCodeSign\"\nimport { DIR_TARGET, Platform, Target } from \"./core\"\nimport { AfterPackContext, ElectronPlatformName } from \"./index\"\nimport { MacConfiguration, MasConfiguration } from \"./options/macOptions\"\nimport { Packager } from \"./packager\"\nimport { chooseNotNull, PlatformPackager } from \"./platformPackager\"\nimport { ArchiveTarget } from \"./targets/ArchiveTarget\"\nimport { PkgTarget, prepareProductBuildArgs } from \"./targets/pkg\"\nimport { createCommonTarget, NoOpTarget } from \"./targets/targetFactory\"\n\nexport default class MacPackager extends PlatformPackager<MacConfiguration> {\n  readonly codeSigningInfo = new Lazy<CodeSigningInfo>(() => {\n    const cscLink = this.getCscLink()\n    if (cscLink == null || process.platform !== \"darwin\") {\n      return Promise.resolve({keychainName: process.env.CSC_KEYCHAIN || null})\n    }\n\n    return createKeychain({\n      tmpDir: this.info.tempDirManager,\n      cscLink,\n      cscKeyPassword: this.getCscPassword(),\n      cscILink: chooseNotNull(this.platformSpecificBuildOptions.cscInstallerLink, process.env.CSC_INSTALLER_LINK),\n      cscIKeyPassword: chooseNotNull(this.platformSpecificBuildOptions.cscInstallerKeyPassword, process.env.CSC_INSTALLER_KEY_PASSWORD),\n      currentDir: this.projectDir\n    })\n  })\n\n  private _iconPath = new Lazy(() => this.getOrConvertIcon(\"icns\"))\n\n  constructor(info: Packager) {\n    super(info, Platform.MAC)\n  }\n\n  get defaultTarget(): Array<string> {\n    return this.info.framework.macOsDefaultTargets\n  }\n\n  protected prepareAppInfo(appInfo: AppInfo): AppInfo {\n    return new AppInfo(this.info, this.platformSpecificBuildOptions.bundleVersion, this.platformSpecificBuildOptions)\n  }\n\n  async getIconPath(): Promise<string | null> {\n    return this._iconPath.value\n  }\n\n  createTargets(targets: Array<string>, mapper: (name: string, factory: (outDir: string) => Target) => void): void {\n    for (const name of targets) {\n      switch (name) {\n        case DIR_TARGET:\n          break\n\n        case \"dmg\":\n          const { DmgTarget } = require(\"dmg-builder\")\n          mapper(name, outDir => new DmgTarget(this, outDir))\n          break\n\n        case \"zip\":\n          // https://github.com/electron-userland/electron-builder/issues/2313\n          mapper(name, outDir => new ArchiveTarget(name, outDir, this, true))\n          break\n\n        case \"pkg\":\n          mapper(name, outDir => new PkgTarget(this, outDir))\n          break\n\n        default:\n          mapper(name, outDir => name === \"mas\" || name === \"mas-dev\" ? new NoOpTarget(name) : createCommonTarget(name, outDir, this))\n          break\n      }\n    }\n  }\n\n  async pack(outDir: string, arch: Arch, targets: Array<Target>, taskManager: AsyncTaskManager): Promise<any> {\n    let nonMasPromise: Promise<any> | null = null\n\n    const hasMas = targets.length !== 0 && targets.some(it => it.name === \"mas\" || it.name === \"mas-dev\")\n    const prepackaged = this.packagerOptions.prepackaged\n\n    if (!hasMas || targets.length > 1) {\n      const appPath = prepackaged == null ? path.join(this.computeAppOutDir(outDir, arch), `${this.appInfo.productFilename}.app`) : prepackaged\n      nonMasPromise = (prepackaged ? Promise.resolve() : this.doPack(outDir, path.dirname(appPath), this.platform.nodeName as ElectronPlatformName, arch, this.platformSpecificBuildOptions, targets))\n        .then(() => this.packageInDistributableFormat(appPath, Arch.x64, targets, taskManager))\n    }\n\n    for (const target of targets) {\n      const targetName = target.name\n      if (!(targetName === \"mas\" || targetName === \"mas-dev\")) {\n        continue\n      }\n\n      const masBuildOptions = deepAssign({}, this.platformSpecificBuildOptions, (this.config as any).mas)\n      if (targetName === \"mas-dev\") {\n        deepAssign(masBuildOptions, (this.config as any)[targetName], {\n          type: \"development\",\n        })\n      }\n\n      const targetOutDir = path.join(outDir, targetName)\n      if (prepackaged == null) {\n        await this.doPack(outDir, targetOutDir, \"mas\", arch, masBuildOptions, [target])\n        await this.sign(path.join(targetOutDir, `${this.appInfo.productFilename}.app`), targetOutDir, masBuildOptions)\n      }\n      else {\n        await this.sign(prepackaged, targetOutDir, masBuildOptions)\n      }\n    }\n\n    if (nonMasPromise != null) {\n      await nonMasPromise\n    }\n  }\n\n  private async sign(appPath: string, outDir: string | null, masOptions: MasConfiguration | null): Promise<void> {\n    if (!isSignAllowed()) {\n      return\n    }\n\n    const isMas = masOptions != null\n    const macOptions = this.platformSpecificBuildOptions\n    const qualifier = (isMas ? masOptions!.identity : null) || macOptions.identity\n\n    if (!isMas && qualifier === null) {\n      if (this.forceCodeSigning) {\n        throw new InvalidConfigurationError(\"identity explicitly is set to null, but forceCodeSigning is set to true\")\n      }\n      log.info({reason: \"identity explicitly is set to null\"}, \"skipped macOS code signing\")\n      return\n    }\n\n    const keychainName = (await this.codeSigningInfo.value).keychainName\n    const explicitType = isMas ? masOptions!.type : macOptions.type\n    const type = explicitType || \"distribution\"\n    const isDevelopment = type === \"development\"\n    const certificateType = getCertificateType(isMas, isDevelopment)\n    let identity = await findIdentity(certificateType, qualifier, keychainName)\n    if (identity == null) {\n      if (!isMas && !isDevelopment && explicitType !== \"distribution\") {\n        identity = await findIdentity(\"Mac Developer\", qualifier, keychainName)\n        if (identity != null) {\n          log.warn(\"Mac Developer is used to sign app â€” it is only for development and testing, not for production\")\n        }\n      }\n\n      if (identity == null) {\n        await reportError(isMas, certificateType, qualifier, keychainName, this.forceCodeSigning)\n        return\n      }\n    }\n\n    const signOptions: any = {\n      \"identity-validation\": false,\n      // https://github.com/electron-userland/electron-builder/issues/1699\n      // kext are signed by the chipset manufacturers. You need a special certificate (only available on request) from Apple to be able to sign kext.\n      ignore: (file: string) => {\n        return file.endsWith(\".kext\") || file.startsWith(\"/Contents/PlugIns\", appPath.length) ||\n          // https://github.com/electron-userland/electron-builder/issues/2010\n          file.includes(\"/node_modules/puppeteer/.local-chromium\")\n      },\n      identity: identity!,\n      type,\n      platform: isMas ? \"mas\" : \"darwin\",\n      version: this.config.electronVersion,\n      app: appPath,\n      keychain: keychainName || undefined,\n      binaries: (isMas && masOptions != null ? masOptions.binaries : macOptions.binaries) || undefined,\n      requirements: isMas || macOptions.requirements == null ? undefined : await this.getResource(macOptions.requirements),\n      // https://github.com/electron-userland/electron-osx-sign/issues/196\n      // will fail on 10.14.5+ because a signed but unnotarized app is also rejected.\n      \"gatekeeper-assess\": macOptions.gatekeeperAssess,\n      \"hardened-runtime\": macOptions.hardenedRuntime,\n    }\n\n    await this.adjustSignOptions(signOptions, masOptions)\n    log.info({\n      file: log.filePath(appPath),\n      identityName: identity.name,\n      identityHash: identity.hash,\n      provisioningProfile: signOptions[\"provisioning-profile\"] || \"none\",\n    }, \"signing\")\n    await this.doSign(signOptions)\n\n    // https://github.com/electron-userland/electron-builder/issues/1196#issuecomment-312310209\n    if (masOptions != null && !isDevelopment) {\n      const certType = isDevelopment ? \"Mac Developer\" : \"3rd Party Mac Developer Installer\"\n      const masInstallerIdentity = await findIdentity(certType, masOptions.identity, keychainName)\n      if (masInstallerIdentity == null) {\n        throw new InvalidConfigurationError(`Cannot find valid \"${certType}\" identity to sign MAS installer, please see https://electron.build/code-signing`)\n      }\n\n      // mas uploaded to AppStore, so, use \"-\" instead of space for name\n      const artifactName = this.expandArtifactNamePattern(masOptions, \"pkg\")\n      const artifactPath = path.join(outDir!, artifactName)\n      await this.doFlat(appPath, artifactPath, masInstallerIdentity, keychainName)\n      await this.dispatchArtifactCreated(artifactPath, null, Arch.x64, this.computeSafeArtifactName(artifactName, \"pkg\"))\n    }\n  }\n\n  private async adjustSignOptions(signOptions: any, masOptions: MasConfiguration | null) {\n    const resourceList = await this.resourceList\n    if (resourceList.includes(`entitlements.osx.plist`)) {\n      throw new InvalidConfigurationError(\"entitlements.osx.plist is deprecated name, please use entitlements.mac.plist\")\n    }\n    if (resourceList.includes(`entitlements.osx.inherit.plist`)) {\n      throw new InvalidConfigurationError(\"entitlements.osx.inherit.plist is deprecated name, please use entitlements.mac.inherit.plist\")\n    }\n\n    const customSignOptions = masOptions || this.platformSpecificBuildOptions\n    const entitlementsSuffix = masOptions == null ? \"mac\" : \"mas\"\n    if (customSignOptions.entitlements == null) {\n      const p = `entitlements.${entitlementsSuffix}.plist`\n      if (resourceList.includes(p)) {\n        signOptions.entitlements = path.join(this.info.buildResourcesDir, p)\n      }\n    }\n    else {\n      signOptions.entitlements = customSignOptions.entitlements\n    }\n\n    if (customSignOptions.entitlementsInherit == null) {\n      const p = `entitlements.${entitlementsSuffix}.inherit.plist`\n      if (resourceList.includes(p)) {\n        signOptions[\"entitlements-inherit\"] = path.join(this.info.buildResourcesDir, p)\n      }\n    }\n    else {\n      signOptions[\"entitlements-inherit\"] = customSignOptions.entitlementsInherit\n    }\n\n    if (customSignOptions.provisioningProfile != null) {\n      signOptions[\"provisioning-profile\"] = customSignOptions.provisioningProfile\n    }\n  }\n\n  //noinspection JSMethodCanBeStatic\n  protected async doSign(opts: SignOptions): Promise<any> {\n    return signAsync(opts)\n  }\n\n  //noinspection JSMethodCanBeStatic\n  protected async doFlat(appPath: string, outFile: string, identity: Identity, keychain: string | null | undefined): Promise<any> {\n    // productbuild doesn't created directory for out file\n    await ensureDir(path.dirname(outFile))\n\n    const args = prepareProductBuildArgs(identity, keychain)\n    args.push(\"--component\", appPath, \"/Applications\")\n    args.push(outFile)\n    return await exec(\"productbuild\", args)\n  }\n\n  public getElectronSrcDir(dist: string) {\n    return path.resolve(this.projectDir, dist, this.info.framework.distMacOsAppName)\n  }\n\n  public getElectronDestinationDir(appOutDir: string) {\n    return path.join(appOutDir, this.info.framework.distMacOsAppName)\n  }\n\n  // todo fileAssociations\n  async applyCommonInfo(appPlist: any, contentsPath: string) {\n    const appInfo = this.appInfo\n    const appFilename = appInfo.productFilename\n\n    // https://github.com/electron-userland/electron-builder/issues/1278\n    appPlist.CFBundleExecutable = appFilename.endsWith(\" Helper\") ? appFilename.substring(0, appFilename.length - \" Helper\".length) : appFilename\n\n    const icon = await this.getIconPath()\n    if (icon != null) {\n      const oldIcon = appPlist.CFBundleIconFile\n      const resourcesPath = path.join(contentsPath, \"Resources\")\n      if (oldIcon != null) {\n        await unlinkIfExists(path.join(resourcesPath, oldIcon))\n      }\n      const iconFileName = `${appFilename}.icns`\n      appPlist.CFBundleIconFile = iconFileName\n      await copyFile(icon, path.join(resourcesPath, iconFileName))\n    }\n    appPlist.CFBundleName = appInfo.productName\n    appPlist.CFBundleDisplayName = appInfo.productName\n\n    const minimumSystemVersion = this.platformSpecificBuildOptions.minimumSystemVersion\n    if (minimumSystemVersion != null) {\n      appPlist.LSMinimumSystemVersion = minimumSystemVersion\n    }\n\n    appPlist.CFBundleIdentifier = appInfo.macBundleIdentifier\n\n    appPlist.CFBundleShortVersionString = this.platformSpecificBuildOptions.bundleShortVersion || appInfo.version\n    appPlist.CFBundleVersion = appInfo.buildVersion\n\n    use(this.platformSpecificBuildOptions.category || (this.config as any).category, it => appPlist.LSApplicationCategoryType = it)\n    appPlist.NSHumanReadableCopyright = appInfo.copyright\n\n    if (this.platformSpecificBuildOptions.darkModeSupport) {\n      appPlist.NSRequiresAquaSystemAppearance = false\n    }\n\n    const extendInfo = this.platformSpecificBuildOptions.extendInfo\n    if (extendInfo != null) {\n      Object.assign(appPlist, extendInfo)\n    }\n  }\n\n  protected async signApp(packContext: AfterPackContext, isAsar: boolean): Promise<any> {\n    const appFileName = `${this.appInfo.productFilename}.app`\n\n    await BluebirdPromise.map(readdir(packContext.appOutDir), (file: string): any => {\n      if (file === appFileName) {\n        return this.sign(path.join(packContext.appOutDir, file), null, null)\n      }\n      return null\n    })\n\n    if (!isAsar) {\n      return\n    }\n\n    const outResourcesDir = path.join(packContext.appOutDir, \"resources\", \"app.asar.unpacked\")\n    await BluebirdPromise.map(orIfFileNotExist(readdir(outResourcesDir), []), (file: string): any => {\n      if (file.endsWith(\".app\")) {\n        return this.sign(path.join(outResourcesDir, file), null, null)\n      }\n      else {\n        return null\n      }\n    })\n  }\n}\n\nfunction getCertificateType(isMas: boolean, isDevelopment: boolean): CertType {\n  if (isDevelopment) {\n    return \"Mac Developer\"\n  }\n  return isMas ? \"3rd Party Mac Developer Application\" : \"Developer ID Application\"\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Packager = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _events() {
  const data = require("events");

  _events = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _isCi() {
  const data = _interopRequireDefault(require("is-ci"));

  _isCi = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _appInfo() {
  const data = require("./appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _asar() {
  const data = require("./asar/asar");

  _asar = function () {
    return data;
  };

  return data;
}

function _ElectronFramework() {
  const data = require("./electron/ElectronFramework");

  _ElectronFramework = function () {
    return data;
  };

  return data;
}

function _LibUiFramework() {
  const data = require("./frameworks/LibUiFramework");

  _LibUiFramework = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("./index");

  _index = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("./platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _ProtonFramework() {
  const data = require("./ProtonFramework");

  _ProtonFramework = function () {
    return data;
  };

  return data;
}

function _targetFactory() {
  const data = require("./targets/targetFactory");

  _targetFactory = function () {
    return data;
  };

  return data;
}

function _config() {
  const data = require("./util/config");

  _config = function () {
    return data;
  };

  return data;
}

function _macroExpander() {
  const data = require("./util/macroExpander");

  _macroExpander = function () {
    return data;
  };

  return data;
}

function _packageDependencies() {
  const data = require("./util/packageDependencies");

  _packageDependencies = function () {
    return data;
  };

  return data;
}

function _packageMetadata() {
  const data = require("./util/packageMetadata");

  _packageMetadata = function () {
    return data;
  };

  return data;
}

function _repositoryInfo() {
  const data = require("./util/repositoryInfo");

  _repositoryInfo = function () {
    return data;
  };

  return data;
}

function _yarn() {
  const data = require("./util/yarn");

  _yarn = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function addHandler(emitter, event, handler) {
  emitter.on(event, handler);
}

function createFrameworkInfo(_x, _x2) {
  return _createFrameworkInfo.apply(this, arguments);
}

function _createFrameworkInfo() {
  _createFrameworkInfo = (0, _bluebirdLst().coroutine)(function* (configuration, packager) {
    let framework = configuration.framework;

    if (framework != null) {
      framework = framework.toLowerCase();
    }

    let nodeVersion = configuration.nodeVersion; // noinspection JSDeprecatedSymbols

    if (framework == null && configuration.protonNodeVersion != null) {
      framework = "proton"; // noinspection JSDeprecatedSymbols

      nodeVersion = configuration.protonNodeVersion;
    }

    if (framework === "electron" || framework == null) {
      return yield (0, _ElectronFramework().createElectronFrameworkSupport)(configuration, packager);
    }

    if (nodeVersion == null || nodeVersion === "current") {
      nodeVersion = process.versions.node;
    }

    const distMacOsName = `${packager.appInfo.productFilename}.app`;
    const isUseLaunchUi = configuration.launchUiVersion !== false;

    if (framework === "proton") {
      return new (_ProtonFramework().ProtonFramework)(nodeVersion, distMacOsName, isUseLaunchUi);
    } else if (framework === "libui") {
      return new (_LibUiFramework().LibUiFramework)(nodeVersion, distMacOsName, isUseLaunchUi);
    } else {
      throw new (_builderUtil().InvalidConfigurationError)(`Unknown framework: ${framework}`);
    }
  });
  return _createFrameworkInfo.apply(this, arguments);
}

class Packager {
  //noinspection JSUnusedGlobalSymbols
  constructor(options, cancellationToken = new (_builderUtilRuntime().CancellationToken)()) {
    this.cancellationToken = cancellationToken;
    this._metadata = null;
    this._nodeModulesHandledExternally = false;
    this._isPrepackedAppAsar = false;
    this._devMetadata = null;
    this._configuration = null;
    this.isTwoPackageJsonProjectLayoutUsed = false;
    this.eventEmitter = new (_events().EventEmitter)();
    this._appInfo = null;
    this.tempDirManager = new (_builderUtil().TmpDir)("packager");
    this._repositoryInfo = new (_lazyVal().Lazy)(() => (0, _repositoryInfo().getRepositoryInfo)(this.projectDir, this.metadata, this.devMetadata));
    this.afterPackHandlers = [];
    this.debugLogger = new (_builderUtil().DebugLogger)(_builderUtil().log.isDebugEnabled);
    this._productionDeps = null;

    this.stageDirPathCustomizer = (target, packager, arch) => {
      return path.join(target.outDir, `__${target.name}-${_builderUtil().Arch[arch]}`);
    };

    this._buildResourcesDir = null;
    this._framework = null;

    if ("devMetadata" in options) {
      throw new (_builderUtil().InvalidConfigurationError)("devMetadata in the options is deprecated, please use config instead");
    }

    if ("extraMetadata" in options) {
      throw new (_builderUtil().InvalidConfigurationError)("extraMetadata in the options is deprecated, please use config.extraMetadata instead");
    }

    const targets = options.targets || new Map();

    if (options.targets == null) {
      options.targets = targets;
    }

    function processTargets(platform, types) {
      function commonArch(currentIfNotSpecified) {
        if (platform === _index().Platform.MAC) {
          return currentIfNotSpecified ? [_builderUtil().Arch.x64] : [];
        }

        const result = Array();
        return result.length === 0 && currentIfNotSpecified ? [(0, _builderUtil().archFromString)(process.arch)] : result;
      }

      let archToType = targets.get(platform);

      if (archToType == null) {
        archToType = new Map();
        targets.set(platform, archToType);
      }

      if (types.length === 0) {
        for (const arch of commonArch(false)) {
          archToType.set(arch, []);
        }

        return;
      }

      for (const type of types) {
        const suffixPos = type.lastIndexOf(":");

        if (suffixPos > 0) {
          (0, _builderUtil().addValue)(archToType, (0, _builderUtil().archFromString)(type.substring(suffixPos + 1)), type.substring(0, suffixPos));
        } else {
          for (const arch of commonArch(true)) {
            (0, _builderUtil().addValue)(archToType, arch, type);
          }
        }
      }
    }

    if (options.mac != null) {
      processTargets(_index().Platform.MAC, options.mac);
    }

    if (options.linux != null) {
      processTargets(_index().Platform.LINUX, options.linux);
    }

    if (options.win != null) {
      processTargets(_index().Platform.WINDOWS, options.win);
    }

    this.projectDir = options.projectDir == null ? process.cwd() : path.resolve(options.projectDir);
    this._appDir = this.projectDir;
    this.options = Object.assign({}, options, {
      prepackaged: options.prepackaged == null ? null : path.resolve(this.projectDir, options.prepackaged)
    });

    try {
      _builderUtil().log.info({
        version: "20.44.4"
      }, "electron-builder");
    } catch (e) {
      // error in dev mode without babel
      if (!(e instanceof ReferenceError)) {
        throw e;
      }
    }
  }

  get appDir() {
    return this._appDir;
  }

  get metadata() {
    return this._metadata;
  }

  get areNodeModulesHandledExternally() {
    return this._nodeModulesHandledExternally;
  }

  get isPrepackedAppAsar() {
    return this._isPrepackedAppAsar;
  }

  get devMetadata() {
    return this._devMetadata;
  }

  get config() {
    return this._configuration;
  }

  get appInfo() {
    return this._appInfo;
  }

  get repositoryInfo() {
    return this._repositoryInfo.value;
  }

  get productionDeps() {
    var _this = this;

    let result = this._productionDeps;

    if (result == null) {
      // https://github.com/electron-userland/electron-builder/issues/2551
      result = new (_lazyVal().Lazy)(
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        if (_this.config.beforeBuild == null || (yield (0, _fs().exists)(path.join(_this.appDir, "node_modules")))) {
          return yield (0, _packageDependencies().getProductionDependencies)(_this.appDir);
        } else {
          return [];
        }
      }));
      this._productionDeps = result;
    }

    return result;
  }

  get buildResourcesDir() {
    let result = this._buildResourcesDir;

    if (result == null) {
      result = path.resolve(this.projectDir, this.relativeBuildResourcesDirname);
      this._buildResourcesDir = result;
    }

    return result;
  }

  get relativeBuildResourcesDirname() {
    return this.config.directories.buildResources;
  }

  get framework() {
    return this._framework;
  }

  addAfterPackHandler(handler) {
    this.afterPackHandlers.push(handler);
  }

  artifactCreated(handler) {
    addHandler(this.eventEmitter, "artifactCreated", handler);
    return this;
  }

  callArtifactBuildStarted(event, logFields) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      _builderUtil().log.info(logFields || {
        target: event.targetPresentableName,
        arch: event.arch == null ? null : _builderUtil().Arch[event.arch],
        file: _builderUtil().log.filePath(event.file)
      }, "building");

      const handler = (0, _platformPackager().resolveFunction)(_this2.config.artifactBuildStarted, "artifactBuildStarted");

      if (handler != null) {
        yield Promise.resolve(handler(event));
      }
    })();
  }
  /**
   * Only for sub artifacts (update info), for main artifacts use `callArtifactBuildCompleted`.
   */


  dispatchArtifactCreated(event) {
    this.eventEmitter.emit("artifactCreated", event);
  }

  callArtifactBuildCompleted(event) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      _this3.dispatchArtifactCreated(event);

      const handler = (0, _platformPackager().resolveFunction)(_this3.config.artifactBuildCompleted, "artifactBuildCompleted");

      if (handler != null) {
        yield Promise.resolve(handler(event));
      }
    })();
  }

  build() {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      let configPath = null;
      let configFromOptions = _this4.options.config;

      if (typeof configFromOptions === "string") {
        // it is a path to config file
        configPath = configFromOptions;
        configFromOptions = null;
      } else if (configFromOptions != null && configFromOptions.extends != null && configFromOptions.extends.includes(".")) {
        configPath = configFromOptions.extends;
        delete configFromOptions.extends;
      }

      const projectDir = _this4.projectDir;
      const devPackageFile = path.join(projectDir, "package.json");
      _this4._devMetadata = yield (0, _promise().orNullIfFileNotExist)((0, _packageMetadata().readPackageJson)(devPackageFile));
      const devMetadata = _this4.devMetadata;
      const configuration = yield (0, _config().getConfig)(projectDir, configPath, configFromOptions, new (_lazyVal().Lazy)(() => Promise.resolve(devMetadata)));

      if (_builderUtil().log.isDebugEnabled) {
        _builderUtil().log.debug({
          config: getSafeEffectiveConfig(configuration)
        }, "effective config");
      }

      _this4._appDir = yield (0, _config().computeDefaultAppDirectory)(projectDir, configuration.directories.app);
      _this4.isTwoPackageJsonProjectLayoutUsed = _this4._appDir !== projectDir;
      const appPackageFile = _this4.isTwoPackageJsonProjectLayoutUsed ? path.join(_this4.appDir, "package.json") : devPackageFile; // tslint:disable:prefer-conditional-expression

      if (_this4.devMetadata != null && !_this4.isTwoPackageJsonProjectLayoutUsed) {
        _this4._metadata = _this4.devMetadata;
      } else {
        _this4._metadata = yield _this4.readProjectMetadataIfTwoPackageStructureOrPrepacked(appPackageFile);
      }

      (0, _builderUtil().deepAssign)(_this4.metadata, configuration.extraMetadata);

      if (_this4.isTwoPackageJsonProjectLayoutUsed) {
        _builderUtil().log.debug({
          devPackageFile,
          appPackageFile
        }, "two package.json structure is used");
      }

      (0, _packageMetadata().checkMetadata)(_this4.metadata, _this4.devMetadata, appPackageFile, devPackageFile);
      return yield _this4._build(configuration, _this4._metadata, _this4._devMetadata);
    })();
  } // external caller of this method always uses isTwoPackageJsonProjectLayoutUsed=false and appDir=projectDir, no way (and need) to use another values


  _build(configuration, metadata, devMetadata, repositoryInfo) {
    var _this5 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield (0, _config().validateConfig)(configuration, _this5.debugLogger);
      _this5._configuration = configuration;
      _this5._metadata = metadata;
      _this5._devMetadata = devMetadata;

      if (repositoryInfo != null) {
        _this5._repositoryInfo.value = Promise.resolve(repositoryInfo);
      }

      _this5._appInfo = new (_appInfo().AppInfo)(_this5, null);
      _this5._framework = yield createFrameworkInfo(_this5.config, _this5);
      const commonOutDirWithoutPossibleOsMacro = path.resolve(_this5.projectDir, (0, _macroExpander().expandMacro)(configuration.directories.output, null, _this5._appInfo, {
        os: ""
      }));

      if (!_isCi().default && process.stdout.isTTY) {
        const effectiveConfigFile = path.join(commonOutDirWithoutPossibleOsMacro, "builder-effective-config.yaml");

        _builderUtil().log.info({
          file: _builderUtil().log.filePath(effectiveConfigFile)
        }, "writing effective config");

        yield (0, _fsExtraP().outputFile)(effectiveConfigFile, getSafeEffectiveConfig(configuration));
      } // because artifact event maybe dispatched several times for different publish providers


      const artifactPaths = new Set();

      _this5.artifactCreated(event => {
        if (event.file != null) {
          artifactPaths.add(event.file);
        }
      });

      const platformToTargets = yield (0, _promise().executeFinally)(_this5.doBuild(),
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        if (_this5.debugLogger.isEnabled) {
          yield _this5.debugLogger.save(path.join(commonOutDirWithoutPossibleOsMacro, "builder-debug.yml"));
        }

        yield _this5.tempDirManager.cleanup();
      }));
      return {
        outDir: commonOutDirWithoutPossibleOsMacro,
        artifactPaths: Array.from(artifactPaths),
        platformToTargets,
        configuration
      };
    })();
  }

  readProjectMetadataIfTwoPackageStructureOrPrepacked(appPackageFile) {
    var _this6 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      let data = yield (0, _promise().orNullIfFileNotExist)((0, _packageMetadata().readPackageJson)(appPackageFile));

      if (data != null) {
        return data;
      }

      data = yield (0, _promise().orNullIfFileNotExist)((0, _asar().readAsarJson)(path.join(_this6.projectDir, "app.asar"), "package.json"));

      if (data != null) {
        _this6._isPrepackedAppAsar = true;
        return data;
      }

      throw new Error(`Cannot find package.json in the ${path.dirname(appPackageFile)}`);
    })();
  }

  doBuild() {
    var _this7 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const taskManager = new (_builderUtil().AsyncTaskManager)(_this7.cancellationToken);
      const platformToTarget = new Map();
      const createdOutDirs = new Set();

      for (const [platform, archToType] of _this7.options.targets) {
        if (_this7.cancellationToken.cancelled) {
          break;
        }

        if (platform === _index().Platform.MAC && process.platform === _index().Platform.WINDOWS.nodeName) {
          throw new (_builderUtil().InvalidConfigurationError)("Build for macOS is supported only on macOS, please see https://electron.build/multi-platform-build");
        }

        const packager = _this7.createHelper(platform);

        const nameToTarget = new Map();
        platformToTarget.set(platform, nameToTarget);

        for (const [arch, targetNames] of (0, _targetFactory().computeArchToTargetNamesMap)(archToType, packager.platformSpecificBuildOptions, platform)) {
          if (_this7.cancellationToken.cancelled) {
            break;
          }

          yield _this7.installAppDependencies(platform, arch);

          if (_this7.cancellationToken.cancelled) {
            break;
          } // support os and arch macro in output value


          const outDir = path.resolve(_this7.projectDir, packager.expandMacro(_this7._configuration.directories.output, _builderUtil().Arch[arch]));
          const targetList = (0, _targetFactory().createTargets)(nameToTarget, targetNames.length === 0 ? packager.defaultTarget : targetNames, outDir, packager);
          yield createOutDirIfNeed(targetList, createdOutDirs);
          yield packager.pack(outDir, arch, targetList, taskManager);
        }

        if (_this7.cancellationToken.cancelled) {
          break;
        }

        for (const target of nameToTarget.values()) {
          taskManager.addTask(target.finishBuild());
        }
      }

      yield taskManager.awaitTasks();
      return platformToTarget;
    })();
  }

  createHelper(platform) {
    if (this.options.platformPackagerFactory != null) {
      return this.options.platformPackagerFactory(this, platform);
    }

    switch (platform) {
      case _index().Platform.MAC:
        {
          const helperClass = require("./macPackager").default;

          return new helperClass(this);
        }

      case _index().Platform.WINDOWS:
        {
          const helperClass = require("./winPackager").WinPackager;

          return new helperClass(this);
        }

      case _index().Platform.LINUX:
        return new (require("./linuxPackager").LinuxPackager)(this);

      default:
        throw new Error(`Unknown platform: ${platform}`);
    }
  }

  installAppDependencies(platform, arch) {
    var _this8 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (_this8.options.prepackaged != null || _this8.framework.isNpmRebuildRequired !== true) {
        return;
      }

      const frameworkInfo = {
        version: _this8.framework.version,
        useCustomDist: true
      };
      const config = _this8.config;

      if (config.nodeGypRebuild === true) {
        _builderUtil().log.info({
          arch: _builderUtil().Arch[arch]
        }, "executing node-gyp rebuild");

        yield (0, _builderUtil().exec)(process.platform === "win32" ? "node-gyp.cmd" : "node-gyp", ["rebuild"], {
          env: (0, _yarn().getGypEnv)(frameworkInfo, platform.nodeName, _builderUtil().Arch[arch], true)
        });
      }

      if (config.npmRebuild === false) {
        _builderUtil().log.info({
          reason: "npmRebuild is set to false"
        }, "skipped app dependencies rebuild");

        return;
      }

      const beforeBuild = (0, _platformPackager().resolveFunction)(config.beforeBuild, "beforeBuild");

      if (beforeBuild != null) {
        const performDependenciesInstallOrRebuild = yield beforeBuild({
          appDir: _this8.appDir,
          electronVersion: _this8.config.electronVersion,
          platform,
          arch: _builderUtil().Arch[arch]
        }); // If beforeBuild resolves to false, it means that handling node_modules is done outside of electron-builder.

        _this8._nodeModulesHandledExternally = !performDependenciesInstallOrRebuild;

        if (!performDependenciesInstallOrRebuild) {
          return;
        }
      }

      if (config.buildDependenciesFromSource === true && platform.nodeName !== process.platform) {
        _builderUtil().log.info({
          reason: "platform is different and buildDependenciesFromSource is set to true"
        }, "skipped app dependencies rebuild");
      } else {
        yield (0, _yarn().installOrRebuild)(config, _this8.appDir, {
          frameworkInfo,
          platform: platform.nodeName,
          arch: _builderUtil().Arch[arch],
          productionDeps: _this8.productionDeps
        });
      }
    })();
  }

  afterPack(context) {
    const afterPack = (0, _platformPackager().resolveFunction)(this.config.afterPack, "afterPack");
    const handlers = this.afterPackHandlers.slice();

    if (afterPack != null) {
      // user handler should be last
      handlers.push(afterPack);
    }

    return _bluebirdLst().default.each(handlers, it => it(context));
  }

}

exports.Packager = Packager;

function createOutDirIfNeed(targetList, createdOutDirs) {
  const ourDirs = new Set();

  for (const target of targetList) {
    // noinspection SuspiciousInstanceOfGuard
    if (target instanceof _targetFactory().NoOpTarget) {
      continue;
    }

    const outDir = target.outDir;

    if (!createdOutDirs.has(outDir)) {
      ourDirs.add(outDir);
    }
  }

  if (ourDirs.size > 0) {
    return _bluebirdLst().default.map(Array.from(ourDirs).sort(), it => {
      createdOutDirs.add(it);
      return (0, _fsExtraP().ensureDir)(it);
    });
  }

  return Promise.resolve();
}

function getSafeEffectiveConfig(configuration) {
  const o = JSON.parse((0, _builderUtil().safeStringifyJson)(configuration));

  if (o.cscLink != null) {
    o.cscLink = "<hidden by builder>";
  }

  return (0, _builderUtil().serializeToYaml)(o, true);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=packager.js.map{"version":3,"sources":["../src/packager.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { addValue, Arch, archFromString, AsyncTaskManager, DebugLogger, deepAssign, exec, InvalidConfigurationError, log, safeStringifyJson, serializeToYaml, TmpDir } from \"builder-util\"\nimport { CancellationToken } from \"builder-util-runtime\"\nimport { exists } from \"builder-util/out/fs\"\nimport { executeFinally, orNullIfFileNotExist } from \"builder-util/out/promise\"\nimport { EventEmitter } from \"events\"\nimport { ensureDir, outputFile } from \"fs-extra-p\"\nimport isCI from \"is-ci\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { AppInfo } from \"./appInfo\"\nimport { readAsarJson } from \"./asar/asar\"\nimport { createElectronFrameworkSupport } from \"./electron/ElectronFramework\"\nimport { LibUiFramework } from \"./frameworks/LibUiFramework\"\nimport { AfterPackContext, Configuration, Framework, Platform, SourceRepositoryInfo, Target } from \"./index\"\nimport MacPackager from \"./macPackager\"\nimport { Metadata } from \"./options/metadata\"\nimport { ArtifactBuildStarted, ArtifactCreated, PackagerOptions } from \"./packagerApi\"\nimport { PlatformPackager, resolveFunction } from \"./platformPackager\"\nimport { ProtonFramework } from \"./ProtonFramework\"\nimport { computeArchToTargetNamesMap, createTargets, NoOpTarget } from \"./targets/targetFactory\"\nimport { computeDefaultAppDirectory, getConfig, validateConfig } from \"./util/config\"\nimport { expandMacro } from \"./util/macroExpander\"\nimport { Dependency, getProductionDependencies } from \"./util/packageDependencies\"\nimport { checkMetadata, readPackageJson } from \"./util/packageMetadata\"\nimport { getRepositoryInfo } from \"./util/repositoryInfo\"\nimport { getGypEnv, installOrRebuild } from \"./util/yarn\"\nimport { WinPackager } from \"./winPackager\"\n\nfunction addHandler(emitter: EventEmitter, event: string, handler: (...args: Array<any>) => void) {\n  emitter.on(event, handler)\n}\n\ndeclare const PACKAGE_VERSION: string\n\nasync function createFrameworkInfo(configuration: Configuration, packager: Packager): Promise<Framework> {\n  let framework = configuration.framework\n  if (framework != null) {\n    framework = framework.toLowerCase()\n  }\n\n  let nodeVersion = configuration.nodeVersion\n  // noinspection JSDeprecatedSymbols\n  if (framework == null && configuration.protonNodeVersion != null) {\n    framework = \"proton\"\n    // noinspection JSDeprecatedSymbols\n    nodeVersion = configuration.protonNodeVersion\n  }\n\n  if (framework === \"electron\" || framework == null) {\n    return await createElectronFrameworkSupport(configuration, packager)\n  }\n\n  if (nodeVersion == null || nodeVersion === \"current\") {\n    nodeVersion = process.versions.node\n  }\n\n  const distMacOsName = `${packager.appInfo.productFilename}.app`\n  const isUseLaunchUi = configuration.launchUiVersion !== false\n  if (framework === \"proton\") {\n    return new ProtonFramework(nodeVersion, distMacOsName, isUseLaunchUi)\n  }\n  else if (framework === \"libui\") {\n    return new LibUiFramework(nodeVersion, distMacOsName, isUseLaunchUi)\n  }\n  else {\n    throw new InvalidConfigurationError(`Unknown framework: ${framework}`)\n  }\n}\n\nexport class Packager {\n  readonly projectDir: string\n\n  private _appDir: string\n  get appDir(): string {\n    return this._appDir\n  }\n\n  private _metadata: Metadata | null = null\n  get metadata(): Metadata {\n    return this._metadata!!\n  }\n\n  private _nodeModulesHandledExternally: boolean = false\n\n  get areNodeModulesHandledExternally(): boolean {\n    return this._nodeModulesHandledExternally\n  }\n\n  private _isPrepackedAppAsar: boolean = false\n\n  get isPrepackedAppAsar(): boolean {\n    return this._isPrepackedAppAsar\n  }\n\n  private _devMetadata: Metadata | null = null\n  get devMetadata(): Metadata | null {\n    return this._devMetadata\n  }\n\n  private _configuration: Configuration | null = null\n\n  get config(): Configuration {\n    return this._configuration!!\n  }\n\n  isTwoPackageJsonProjectLayoutUsed = false\n\n  readonly eventEmitter = new EventEmitter()\n\n  _appInfo: AppInfo | null = null\n  get appInfo(): AppInfo {\n    return this._appInfo!!\n  }\n\n  readonly tempDirManager = new TmpDir(\"packager\")\n\n  private _repositoryInfo = new Lazy<SourceRepositoryInfo | null>(() => getRepositoryInfo(this.projectDir, this.metadata, this.devMetadata))\n\n  private readonly afterPackHandlers: Array<(context: AfterPackContext) => Promise<any> | null> = []\n\n  readonly options: PackagerOptions\n\n  readonly debugLogger = new DebugLogger(log.isDebugEnabled)\n\n  get repositoryInfo(): Promise<SourceRepositoryInfo | null> {\n    return this._repositoryInfo.value\n  }\n\n  private _productionDeps: Lazy<Array<Dependency>> | null = null\n\n  private get productionDeps(): Lazy<Array<Dependency>> {\n    let result = this._productionDeps\n    if (result == null) {\n      // https://github.com/electron-userland/electron-builder/issues/2551\n      result = new Lazy(async () => {\n        if (this.config.beforeBuild == null || (await exists(path.join(this.appDir, \"node_modules\")))) {\n          return await getProductionDependencies(this.appDir)\n        }\n        else {\n          return []\n        }\n      })\n      this._productionDeps = result\n    }\n    return result\n  }\n\n  stageDirPathCustomizer: (target: Target, packager: PlatformPackager<any>, arch: Arch) => string = (target, packager, arch) => {\n    return path.join(target.outDir, `__${target.name}-${Arch[arch]}`)\n  }\n\n  private _buildResourcesDir: string | null = null\n\n  get buildResourcesDir(): string {\n    let result = this._buildResourcesDir\n    if (result == null) {\n      result = path.resolve(this.projectDir, this.relativeBuildResourcesDirname)\n      this._buildResourcesDir = result\n    }\n    return result\n  }\n\n  get relativeBuildResourcesDirname(): string {\n    return this.config.directories!!.buildResources!!\n  }\n\n  private _framework: Framework | null = null\n  get framework(): Framework {\n    return this._framework!!\n  }\n\n  //noinspection JSUnusedGlobalSymbols\n  constructor(options: PackagerOptions, readonly cancellationToken = new CancellationToken()) {\n    if (\"devMetadata\" in options) {\n      throw new InvalidConfigurationError(\"devMetadata in the options is deprecated, please use config instead\")\n    }\n    if (\"extraMetadata\" in options) {\n      throw new InvalidConfigurationError(\"extraMetadata in the options is deprecated, please use config.extraMetadata instead\")\n    }\n\n    const targets = options.targets || new Map<Platform, Map<Arch, Array<string>>>()\n    if (options.targets == null) {\n      options.targets = targets\n    }\n\n    function processTargets(platform: Platform, types: Array<string>) {\n      function commonArch(currentIfNotSpecified: boolean): Array<Arch> {\n        if (platform === Platform.MAC) {\n          return currentIfNotSpecified ? [Arch.x64] : []\n        }\n\n        const result = Array<Arch>()\n        return result.length === 0 && currentIfNotSpecified ? [archFromString(process.arch)] : result\n      }\n\n      let archToType = targets.get(platform)\n      if (archToType == null) {\n        archToType = new Map<Arch, Array<string>>()\n        targets.set(platform, archToType)\n      }\n\n      if (types.length === 0) {\n        for (const arch of commonArch(false)) {\n          archToType.set(arch, [])\n        }\n        return\n      }\n\n      for (const type of types) {\n        const suffixPos = type.lastIndexOf(\":\")\n        if (suffixPos > 0) {\n          addValue(archToType, archFromString(type.substring(suffixPos + 1)), type.substring(0, suffixPos))\n        }\n        else {\n          for (const arch of commonArch(true)) {\n            addValue(archToType, arch, type)\n          }\n        }\n      }\n    }\n\n    if (options.mac != null) {\n      processTargets(Platform.MAC, options.mac)\n    }\n    if (options.linux != null) {\n      processTargets(Platform.LINUX, options.linux)\n    }\n    if (options.win != null) {\n      processTargets(Platform.WINDOWS, options.win)\n    }\n\n    this.projectDir = options.projectDir == null ? process.cwd() : path.resolve(options.projectDir)\n    this._appDir = this.projectDir\n    this.options = {\n      ...options,\n      prepackaged: options.prepackaged == null ? null : path.resolve(this.projectDir, options.prepackaged)\n    }\n\n    try {\n      log.info({version: PACKAGE_VERSION}, \"electron-builder\")\n    }\n    catch (e) {\n      // error in dev mode without babel\n      if (!(e instanceof ReferenceError)) {\n        throw e\n      }\n    }\n  }\n\n  addAfterPackHandler(handler: (context: AfterPackContext) => Promise<any> | null) {\n    this.afterPackHandlers.push(handler)\n  }\n\n  artifactCreated(handler: (event: ArtifactCreated) => void): Packager {\n    addHandler(this.eventEmitter, \"artifactCreated\", handler)\n    return this\n  }\n\n  async callArtifactBuildStarted(event: ArtifactBuildStarted, logFields?: any): Promise<void> {\n    log.info(logFields || {\n      target: event.targetPresentableName,\n      arch: event.arch == null ? null : Arch[event.arch],\n      file: log.filePath(event.file),\n    }, \"building\")\n    const handler = resolveFunction(this.config.artifactBuildStarted, \"artifactBuildStarted\")\n    if (handler != null) {\n      await Promise.resolve(handler(event))\n    }\n  }\n\n  /**\n   * Only for sub artifacts (update info), for main artifacts use `callArtifactBuildCompleted`.\n   */\n  dispatchArtifactCreated(event: ArtifactCreated): void {\n    this.eventEmitter.emit(\"artifactCreated\", event)\n  }\n\n  async callArtifactBuildCompleted(event: ArtifactCreated): Promise<void> {\n    this.dispatchArtifactCreated(event)\n\n    const handler = resolveFunction(this.config.artifactBuildCompleted, \"artifactBuildCompleted\")\n    if (handler != null) {\n      await Promise.resolve(handler(event))\n    }\n  }\n\n  async build(): Promise<BuildResult> {\n    let configPath: string | null = null\n    let configFromOptions = this.options.config\n    if (typeof configFromOptions === \"string\") {\n      // it is a path to config file\n      configPath = configFromOptions\n      configFromOptions = null\n    }\n    else if (configFromOptions != null && configFromOptions.extends != null && configFromOptions.extends.includes(\".\")) {\n      configPath = configFromOptions.extends\n      delete configFromOptions.extends\n    }\n\n    const projectDir = this.projectDir\n\n    const devPackageFile = path.join(projectDir, \"package.json\")\n    this._devMetadata = await orNullIfFileNotExist(readPackageJson(devPackageFile))\n\n    const devMetadata = this.devMetadata\n    const configuration = await getConfig(projectDir, configPath, configFromOptions, new Lazy(() => Promise.resolve(devMetadata)))\n    if (log.isDebugEnabled) {\n      log.debug({config: getSafeEffectiveConfig(configuration)}, \"effective config\")\n    }\n\n    this._appDir = await computeDefaultAppDirectory(projectDir, configuration.directories!!.app)\n    this.isTwoPackageJsonProjectLayoutUsed = this._appDir !== projectDir\n\n    const appPackageFile = this.isTwoPackageJsonProjectLayoutUsed ? path.join(this.appDir, \"package.json\") : devPackageFile\n\n    // tslint:disable:prefer-conditional-expression\n    if (this.devMetadata != null && !this.isTwoPackageJsonProjectLayoutUsed) {\n      this._metadata = this.devMetadata\n    }\n    else {\n      this._metadata = await this.readProjectMetadataIfTwoPackageStructureOrPrepacked(appPackageFile)\n    }\n    deepAssign(this.metadata, configuration.extraMetadata)\n\n    if (this.isTwoPackageJsonProjectLayoutUsed) {\n      log.debug({devPackageFile, appPackageFile}, \"two package.json structure is used\")\n    }\n    checkMetadata(this.metadata, this.devMetadata, appPackageFile, devPackageFile)\n\n    return await this._build(configuration, this._metadata, this._devMetadata)\n  }\n\n  // external caller of this method always uses isTwoPackageJsonProjectLayoutUsed=false and appDir=projectDir, no way (and need) to use another values\n  async _build(configuration: Configuration, metadata: Metadata, devMetadata: Metadata | null, repositoryInfo?: SourceRepositoryInfo): Promise<BuildResult> {\n    await validateConfig(configuration, this.debugLogger)\n    this._configuration = configuration\n    this._metadata = metadata\n    this._devMetadata = devMetadata\n\n    if (repositoryInfo != null) {\n      this._repositoryInfo.value = Promise.resolve(repositoryInfo)\n    }\n\n    this._appInfo = new AppInfo(this, null)\n    this._framework = await createFrameworkInfo(this.config, this)\n\n    const commonOutDirWithoutPossibleOsMacro = path.resolve(this.projectDir, expandMacro(configuration.directories!!.output!!, null, this._appInfo, {\n      os: \"\",\n    }))\n\n    if (!isCI && (process.stdout as any).isTTY) {\n      const effectiveConfigFile = path.join(commonOutDirWithoutPossibleOsMacro, \"builder-effective-config.yaml\")\n      log.info({file: log.filePath(effectiveConfigFile)}, \"writing effective config\")\n      await outputFile(effectiveConfigFile, getSafeEffectiveConfig(configuration))\n    }\n\n    // because artifact event maybe dispatched several times for different publish providers\n    const artifactPaths = new Set<string>()\n    this.artifactCreated(event => {\n      if (event.file != null) {\n        artifactPaths.add(event.file)\n      }\n    })\n\n    const platformToTargets = await executeFinally(this.doBuild(), async () => {\n      if (this.debugLogger.isEnabled) {\n        await this.debugLogger.save(path.join(commonOutDirWithoutPossibleOsMacro, \"builder-debug.yml\"))\n      }\n      await this.tempDirManager.cleanup()\n    })\n\n    return {\n      outDir: commonOutDirWithoutPossibleOsMacro,\n      artifactPaths: Array.from(artifactPaths),\n      platformToTargets,\n      configuration,\n    }\n  }\n\n  private async readProjectMetadataIfTwoPackageStructureOrPrepacked(appPackageFile: string): Promise<Metadata> {\n    let data = await orNullIfFileNotExist(readPackageJson(appPackageFile))\n    if (data != null) {\n      return data\n    }\n\n    data = await orNullIfFileNotExist(readAsarJson(path.join(this.projectDir, \"app.asar\"), \"package.json\"))\n    if (data != null) {\n      this._isPrepackedAppAsar = true\n      return data\n    }\n\n    throw new Error(`Cannot find package.json in the ${path.dirname(appPackageFile)}`)\n  }\n\n  private async doBuild(): Promise<Map<Platform, Map<string, Target>>> {\n    const taskManager = new AsyncTaskManager(this.cancellationToken)\n\n    const platformToTarget = new Map<Platform, Map<string, Target>>()\n    const createdOutDirs = new Set<string>()\n\n    for (const [platform, archToType] of this.options.targets!) {\n      if (this.cancellationToken.cancelled) {\n        break\n      }\n\n      if (platform === Platform.MAC && process.platform === Platform.WINDOWS.nodeName) {\n        throw new InvalidConfigurationError(\"Build for macOS is supported only on macOS, please see https://electron.build/multi-platform-build\")\n      }\n\n      const packager = this.createHelper(platform)\n      const nameToTarget: Map<string, Target> = new Map()\n      platformToTarget.set(platform, nameToTarget)\n\n      for (const [arch, targetNames] of computeArchToTargetNamesMap(archToType, packager.platformSpecificBuildOptions, platform)) {\n        if (this.cancellationToken.cancelled) {\n          break\n        }\n\n        await this.installAppDependencies(platform, arch)\n\n        if (this.cancellationToken.cancelled) {\n          break\n        }\n\n        // support os and arch macro in output value\n        const outDir = path.resolve(this.projectDir, packager.expandMacro(this._configuration!!.directories!!.output!!, Arch[arch]))\n        const targetList = createTargets(nameToTarget, targetNames.length === 0 ? packager.defaultTarget : targetNames, outDir, packager)\n        await createOutDirIfNeed(targetList, createdOutDirs)\n        await packager.pack(outDir, arch, targetList, taskManager)\n      }\n\n      if (this.cancellationToken.cancelled) {\n        break\n      }\n\n      for (const target of nameToTarget.values()) {\n        taskManager.addTask(target.finishBuild())\n      }\n    }\n\n    await taskManager.awaitTasks()\n    return platformToTarget\n  }\n\n  private createHelper(platform: Platform): PlatformPackager<any> {\n    if (this.options.platformPackagerFactory != null) {\n      return this.options.platformPackagerFactory!(this, platform)\n    }\n\n    switch (platform) {\n      case Platform.MAC: {\n        const helperClass: typeof MacPackager = require(\"./macPackager\").default\n        return new helperClass(this)\n      }\n\n      case Platform.WINDOWS: {\n        const helperClass: typeof WinPackager = require(\"./winPackager\").WinPackager\n        return new helperClass(this)\n      }\n\n      case Platform.LINUX:\n        return new (require(\"./linuxPackager\").LinuxPackager)(this)\n\n      default:\n        throw new Error(`Unknown platform: ${platform}`)\n    }\n  }\n\n  private async installAppDependencies(platform: Platform, arch: Arch): Promise<any> {\n    if (this.options.prepackaged != null || this.framework.isNpmRebuildRequired !== true) {\n      return\n    }\n\n    const frameworkInfo = {version: this.framework.version, useCustomDist: true}\n    const config = this.config\n    if (config.nodeGypRebuild === true) {\n      log.info({arch: Arch[arch]}, \"executing node-gyp rebuild\")\n      await exec(process.platform === \"win32\" ? \"node-gyp.cmd\" : \"node-gyp\", [\"rebuild\"], {\n        env: getGypEnv(frameworkInfo, platform.nodeName, Arch[arch], true),\n      })\n    }\n\n    if (config.npmRebuild === false) {\n      log.info({reason: \"npmRebuild is set to false\"}, \"skipped app dependencies rebuild\")\n      return\n    }\n\n    const beforeBuild = resolveFunction(config.beforeBuild, \"beforeBuild\")\n    if (beforeBuild != null) {\n      const performDependenciesInstallOrRebuild = await beforeBuild({\n        appDir: this.appDir,\n        electronVersion: this.config.electronVersion!,\n        platform,\n        arch: Arch[arch]\n      })\n\n      // If beforeBuild resolves to false, it means that handling node_modules is done outside of electron-builder.\n      this._nodeModulesHandledExternally = !performDependenciesInstallOrRebuild\n      if (!performDependenciesInstallOrRebuild) {\n        return\n      }\n    }\n\n    if (config.buildDependenciesFromSource === true && platform.nodeName !== process.platform) {\n      log.info({reason: \"platform is different and buildDependenciesFromSource is set to true\"}, \"skipped app dependencies rebuild\")\n    }\n    else {\n      await installOrRebuild(config, this.appDir, {\n        frameworkInfo,\n        platform: platform.nodeName,\n        arch: Arch[arch],\n        productionDeps: this.productionDeps,\n      })\n    }\n  }\n\n  afterPack(context: AfterPackContext): Promise<any> {\n    const afterPack = resolveFunction(this.config.afterPack, \"afterPack\")\n    const handlers = this.afterPackHandlers.slice()\n    if (afterPack != null) {\n      // user handler should be last\n      handlers.push(afterPack)\n    }\n    return BluebirdPromise.each(handlers, it => it(context))\n  }\n}\n\nfunction createOutDirIfNeed(targetList: Array<Target>, createdOutDirs: Set<string>): Promise<any> {\n  const ourDirs = new Set<string>()\n  for (const target of targetList) {\n    // noinspection SuspiciousInstanceOfGuard\n    if (target instanceof NoOpTarget) {\n      continue\n    }\n\n    const outDir = (target as Target).outDir\n    if (!createdOutDirs.has(outDir)) {\n      ourDirs.add(outDir)\n    }\n  }\n\n  if (ourDirs.size > 0) {\n    return BluebirdPromise.map(Array.from(ourDirs).sort(), it => {\n      createdOutDirs.add(it)\n      return ensureDir(it)\n    })\n  }\n  return Promise.resolve()\n}\n\nexport interface BuildResult {\n  readonly outDir: string\n  readonly artifactPaths: Array<string>\n  readonly platformToTargets: Map<Platform, Map<string, Target>>\n  readonly configuration: Configuration\n}\n\nfunction getSafeEffectiveConfig(configuration: Configuration): string {\n  const o = JSON.parse(safeStringifyJson(configuration))\n  if (o.cscLink != null) {\n    o.cscLink = \"<hidden by builder>\"\n  }\n  return serializeToYaml(o, true)\n}"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=packagerApi.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isSafeGithubName = isSafeGithubName;
exports.normalizeExt = normalizeExt;
exports.resolveFunction = resolveFunction;
exports.chooseNotNull = chooseNotNull;
exports.PlatformPackager = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _appInfo() {
  const data = require("./appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _asarFileChecker() {
  const data = require("./asar/asarFileChecker");

  _asarFileChecker = function () {
    return data;
  };

  return data;
}

function _asarUtil() {
  const data = require("./asar/asarUtil");

  _asarUtil = function () {
    return data;
  };

  return data;
}

function _integrity() {
  const data = require("./asar/integrity");

  _integrity = function () {
    return data;
  };

  return data;
}

function _fileMatcher() {
  const data = require("./fileMatcher");

  _fileMatcher = function () {
    return data;
  };

  return data;
}

function _fileTransformer() {
  const data = require("./fileTransformer");

  _fileTransformer = function () {
    return data;
  };

  return data;
}

function _Framework() {
  const data = require("./Framework");

  _Framework = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("./index");

  _index = function () {
    return data;
  };

  return data;
}

function _appBuilder() {
  const data = require("./util/appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _appFileCopier() {
  const data = require("./util/appFileCopier");

  _appFileCopier = function () {
    return data;
  };

  return data;
}

function _macroExpander() {
  const data = require("./util/macroExpander");

  _macroExpander = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class PlatformPackager {
  constructor(info, platform) {
    this.info = info;
    this.platform = platform;
    this._resourceList = new (_lazyVal().Lazy)(() => (0, _promise().orIfFileNotExist)((0, _fsExtraP().readdir)(this.info.buildResourcesDir), []));
    this.platformSpecificBuildOptions = PlatformPackager.normalizePlatformSpecificBuildOptions(this.config[platform.buildConfigurationKey]);
    this.appInfo = this.prepareAppInfo(info.appInfo);
  }

  get packagerOptions() {
    return this.info.options;
  }

  get buildResourcesDir() {
    return this.info.buildResourcesDir;
  }

  get projectDir() {
    return this.info.projectDir;
  }

  get config() {
    return this.info.config;
  }

  get resourceList() {
    return this._resourceList.value;
  }

  get compression() {
    const compression = this.platformSpecificBuildOptions.compression; // explicitly set to null - request to use default value instead of parent (in the config)

    if (compression === null) {
      return "normal";
    }

    return compression || this.config.compression || "normal";
  }

  get debugLogger() {
    return this.info.debugLogger;
  }

  prepareAppInfo(appInfo) {
    return new (_appInfo().AppInfo)(this.info, null, this.platformSpecificBuildOptions);
  }

  static normalizePlatformSpecificBuildOptions(options) {
    return options == null ? Object.create(null) : options;
  }

  getCscPassword() {
    const password = this.doGetCscPassword();

    if ((0, _builderUtil().isEmptyOrSpaces)(password)) {
      _builderUtil().log.info({
        reason: "CSC_KEY_PASSWORD is not defined"
      }, "empty password will be used for code signing");

      return "";
    } else {
      return password.trim();
    }
  }

  getCscLink(extraEnvName) {
    // allow to specify as empty string
    const envValue = chooseNotNull(extraEnvName == null ? null : process.env[extraEnvName], process.env.CSC_LINK);
    return chooseNotNull(chooseNotNull(this.info.config.cscLink, this.platformSpecificBuildOptions.cscLink), envValue);
  }

  doGetCscPassword() {
    // allow to specify as empty string
    return chooseNotNull(chooseNotNull(this.info.config.cscKeyPassword, this.platformSpecificBuildOptions.cscKeyPassword), process.env.CSC_KEY_PASSWORD);
  }

  computeAppOutDir(outDir, arch) {
    return this.packagerOptions.prepackaged || path.join(outDir, `${this.platform.buildConfigurationKey}${(0, _builderUtil().getArchSuffix)(arch)}${this.platform === _index().Platform.MAC ? "" : "-unpacked"}`);
  }

  dispatchArtifactCreated(file, target, arch, safeArtifactName) {
    return this.info.callArtifactBuildCompleted({
      file,
      safeArtifactName,
      target,
      arch,
      packager: this
    });
  }

  pack(outDir, arch, targets, taskManager) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appOutDir = _this.computeAppOutDir(outDir, arch);

      yield _this.doPack(outDir, appOutDir, _this.platform.nodeName, arch, _this.platformSpecificBuildOptions, targets);

      _this.packageInDistributableFormat(appOutDir, arch, targets, taskManager);
    })();
  }

  packageInDistributableFormat(appOutDir, arch, targets, taskManager) {
    var _this2 = this;

    if (targets.find(it => !it.isAsyncSupported) == null) {
      PlatformPackager.buildAsyncTargets(targets, taskManager, appOutDir, arch);
      return;
    }

    taskManager.add(
    /*#__PURE__*/
    (0, _bluebirdLst().coroutine)(function* () {
      // BluebirdPromise.map doesn't invoke target.build immediately, but for RemoteTarget it is very critical to call build() before finishBuild()
      const subTaskManager = new (_builderUtil().AsyncTaskManager)(_this2.info.cancellationToken);
      PlatformPackager.buildAsyncTargets(targets, subTaskManager, appOutDir, arch);
      yield subTaskManager.awaitTasks();

      for (const target of targets) {
        if (!target.isAsyncSupported) {
          yield target.build(appOutDir, arch);
        }
      }
    }));
  }

  static buildAsyncTargets(targets, taskManager, appOutDir, arch) {
    for (const target of targets) {
      if (target.isAsyncSupported) {
        taskManager.addTask(target.build(appOutDir, arch));
      }
    }
  }

  getExtraFileMatchers(isResources, appOutDir, options) {
    const base = isResources ? this.getResourcesDir(appOutDir) : this.platform === _index().Platform.MAC ? path.join(appOutDir, `${this.appInfo.productFilename}.app`, "Contents") : appOutDir;
    return (0, _fileMatcher().getFileMatchers)(this.config, isResources ? "extraResources" : "extraFiles", base, options);
  }

  get electronDistExecutableName() {
    return "electron";
  }

  get electronDistMacOsExecutableName() {
    return "Electron";
  }

  createGetFileMatchersOptions(outDir, arch, customBuildOptions) {
    return {
      macroExpander: it => this.expandMacro(it, arch == null ? null : _builderUtil().Arch[arch], {
        "/*": "{,/**/*}"
      }),
      customBuildOptions,
      globalOutDir: outDir,
      defaultSrc: this.projectDir
    };
  }

  doPack(outDir, appOutDir, platformName, arch, platformSpecificBuildOptions, targets) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (_this3.packagerOptions.prepackaged != null) {
        return;
      }

      const framework = _this3.info.framework;

      _builderUtil().log.info({
        platform: platformName,
        arch: _builderUtil().Arch[arch],
        [`${framework.name}`]: framework.version,
        appOutDir: _builderUtil().log.filePath(appOutDir)
      }, `packaging`);

      yield framework.prepareApplicationStageDirectory({
        packager: _this3,
        appOutDir,
        platformName,
        arch: _builderUtil().Arch[arch],
        version: framework.version
      });
      const excludePatterns = [];

      const computeParsedPatterns = patterns => {
        if (patterns != null) {
          for (const pattern of patterns) {
            pattern.computeParsedPatterns(excludePatterns, _this3.info.projectDir);
          }
        }
      };

      const getFileMatchersOptions = _this3.createGetFileMatchersOptions(outDir, arch, platformSpecificBuildOptions);

      const macroExpander = getFileMatchersOptions.macroExpander;

      const extraResourceMatchers = _this3.getExtraFileMatchers(true, appOutDir, getFileMatchersOptions);

      computeParsedPatterns(extraResourceMatchers);

      const extraFileMatchers = _this3.getExtraFileMatchers(false, appOutDir, getFileMatchersOptions);

      computeParsedPatterns(extraFileMatchers);
      const packContext = {
        appOutDir,
        outDir,
        arch,
        targets,
        packager: _this3,
        electronPlatformName: platformName
      };
      const asarOptions = yield _this3.computeAsarOptions(platformSpecificBuildOptions);
      const resourcesPath = _this3.platform === _index().Platform.MAC ? path.join(appOutDir, framework.distMacOsAppName, "Contents", "Resources") : (0, _Framework().isElectronBased)(framework) ? path.join(appOutDir, "resources") : appOutDir;
      const taskManager = new (_builderUtil().AsyncTaskManager)(_this3.info.cancellationToken);

      _this3.copyAppFiles(taskManager, asarOptions, resourcesPath, path.join(resourcesPath, "app"), packContext, platformSpecificBuildOptions, excludePatterns, macroExpander);

      yield taskManager.awaitTasks();

      if (_this3.info.cancellationToken.cancelled) {
        return;
      }

      if (framework.beforeCopyExtraFiles != null) {
        yield framework.beforeCopyExtraFiles({
          packager: _this3,
          appOutDir,
          asarIntegrity: asarOptions == null ? null : yield (0, _integrity().computeData)(resourcesPath, asarOptions.externalAllowed ? {
            externalAllowed: true
          } : null),
          platformName
        });
      }

      if (_this3.info.cancellationToken.cancelled) {
        return;
      }

      const transformerForExtraFiles = _this3.createTransformerForExtraFiles(packContext);

      yield (0, _fileMatcher().copyFiles)(extraResourceMatchers, transformerForExtraFiles);
      yield (0, _fileMatcher().copyFiles)(extraFileMatchers, transformerForExtraFiles);

      if (_this3.info.cancellationToken.cancelled) {
        return;
      }

      yield _this3.info.afterPack(packContext);

      if (framework.afterPack != null) {
        yield framework.afterPack(packContext);
      }

      const isAsar = asarOptions != null;
      yield _this3.sanityCheckPackage(appOutDir, isAsar, framework);
      yield _this3.signApp(packContext, isAsar);
      const afterSign = resolveFunction(_this3.config.afterSign, "afterSign");

      if (afterSign != null) {
        yield Promise.resolve(afterSign(packContext));
      }
    })();
  }

  createTransformerForExtraFiles(packContext) {
    return null;
  }

  copyAppFiles(taskManager, asarOptions, resourcePath, defaultDestination, packContext, platformSpecificBuildOptions, excludePatterns, macroExpander) {
    var _this4 = this;

    const appDir = this.info.appDir;
    const config = this.config;
    const isElectronCompile = asarOptions != null && (0, _fileTransformer().isElectronCompileUsed)(this.info);
    const mainMatchers = (0, _fileMatcher().getMainFileMatchers)(appDir, defaultDestination, macroExpander, platformSpecificBuildOptions, this, packContext.outDir, isElectronCompile);

    if (excludePatterns.length > 0) {
      for (const matcher of mainMatchers) {
        matcher.excludePatterns = excludePatterns;
      }
    }

    const framework = this.info.framework;
    const transformer = (0, _fileTransformer().createTransformer)(appDir, config, isElectronCompile ? Object.assign({
      originalMain: this.info.metadata.main,
      main: _appFileCopier().ELECTRON_COMPILE_SHIM_FILENAME
    }, config.extraMetadata) : config.extraMetadata, framework.createTransformer == null ? null : framework.createTransformer());

    const _computeFileSets = matchers => {
      return (0, _appFileCopier().computeFileSets)(matchers, this.info.isPrepackedAppAsar ? null : transformer, this, isElectronCompile).then(
      /*#__PURE__*/
      function () {
        var _ref2 = (0, _bluebirdLst().coroutine)(function* (result) {
          if (!_this4.info.isPrepackedAppAsar && !_this4.info.areNodeModulesHandledExternally) {
            const moduleFileMatcher = (0, _fileMatcher().getNodeModuleFileMatcher)(appDir, defaultDestination, macroExpander, platformSpecificBuildOptions, _this4.info);
            result = result.concat((yield (0, _appFileCopier().computeNodeModuleFileSets)(_this4, moduleFileMatcher)));
          }

          return result.filter(it => it.files.length > 0);
        });

        return function (_x) {
          return _ref2.apply(this, arguments);
        };
      }());
    };

    if (this.info.isPrepackedAppAsar) {
      taskManager.addTask(_bluebirdLst().default.each(_computeFileSets([new (_fileMatcher().FileMatcher)(appDir, resourcePath, macroExpander)]), it => (0, _appFileCopier().copyAppFiles)(it, this.info, transformer)));
    } else if (asarOptions == null) {
      // for ASAR all asar unpacked files will be extra transformed (e.g. sign of EXE and DLL) later,
      // for prepackaged asar extra transformation not supported yet,
      // so, extra transform if asar is disabled
      const transformerForExtraFiles = this.createTransformerForExtraFiles(packContext);

      const combinedTransformer = file => {
        if (transformerForExtraFiles != null) {
          const result = transformerForExtraFiles(file);

          if (result != null) {
            return result;
          }
        }

        return transformer(file);
      };

      taskManager.addTask(_bluebirdLst().default.each(_computeFileSets(mainMatchers), it => (0, _appFileCopier().copyAppFiles)(it, this.info, combinedTransformer)));
    } else {
      const unpackPattern = (0, _fileMatcher().getFileMatchers)(config, "asarUnpack", defaultDestination, {
        macroExpander,
        customBuildOptions: platformSpecificBuildOptions,
        globalOutDir: packContext.outDir,
        defaultSrc: appDir
      });
      const fileMatcher = unpackPattern == null ? null : unpackPattern[0];
      taskManager.addTask(_computeFileSets(mainMatchers).then(
      /*#__PURE__*/
      function () {
        var _ref3 = (0, _bluebirdLst().coroutine)(function* (fileSets) {
          for (const fileSet of fileSets) {
            yield (0, _appFileCopier().transformFiles)(transformer, fileSet);
          }

          yield new (_asarUtil().AsarPackager)(appDir, resourcePath, asarOptions, fileMatcher == null ? null : fileMatcher.createFilter()).pack(fileSets, _this4);
        });

        return function (_x2) {
          return _ref3.apply(this, arguments);
        };
      }()));
    }
  }

  signApp(packContext, isAsar) {
    return Promise.resolve();
  }

  getIconPath() {
    return (0, _bluebirdLst().coroutine)(function* () {
      return null;
    })();
  }

  computeAsarOptions(customBuildOptions) {
    var _this5 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (!(0, _Framework().isElectronBased)(_this5.info.framework)) {
        return null;
      }

      function errorMessage(name) {
        return `${name} is deprecated is deprecated and not supported â€” please use asarUnpack`;
      }

      const buildMetadata = _this5.config;

      if (buildMetadata["asar-unpack"] != null) {
        throw new Error(errorMessage("asar-unpack"));
      }

      if (buildMetadata["asar-unpack-dir"] != null) {
        throw new Error(errorMessage("asar-unpack-dir"));
      }

      const platformSpecific = customBuildOptions.asar;
      const result = platformSpecific == null ? _this5.config.asar : platformSpecific;

      if (result === false) {
        const appAsarStat = yield (0, _fs().statOrNull)(path.join(_this5.info.appDir, "app.asar")); //noinspection ES6MissingAwait

        if (appAsarStat == null || !appAsarStat.isFile()) {
          _builderUtil().log.warn({
            solution: "enable asar and use asarUnpack to unpack files that must be externally available"
          }, "asar using is disabled â€” it is strongly not recommended");
        }

        return null;
      }

      if (result == null || result === true) {
        return {};
      }

      for (const name of ["unpackDir", "unpack"]) {
        if (result[name] != null) {
          throw new Error(errorMessage(`asar.${name}`));
        }
      }

      return (0, _builderUtil().deepAssign)({}, result);
    })();
  }

  getElectronSrcDir(dist) {
    return path.resolve(this.projectDir, dist);
  }

  getElectronDestinationDir(appOutDir) {
    return appOutDir;
  }

  getResourcesDir(appOutDir) {
    if (this.platform === _index().Platform.MAC) {
      return this.getMacOsResourcesDir(appOutDir);
    } else if ((0, _Framework().isElectronBased)(this.info.framework)) {
      return path.join(appOutDir, "resources");
    } else {
      return appOutDir;
    }
  }

  getMacOsResourcesDir(appOutDir) {
    return path.join(appOutDir, `${this.appInfo.productFilename}.app`, "Contents", "Resources");
  }

  checkFileInPackage(resourcesDir, file, messagePrefix, isAsar) {
    var _this6 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const relativeFile = path.relative(_this6.info.appDir, path.resolve(_this6.info.appDir, file));

      if (isAsar) {
        yield (0, _asarFileChecker().checkFileInArchive)(path.join(resourcesDir, "app.asar"), relativeFile, messagePrefix);
        return;
      }

      const pathParsed = path.parse(file); // Even when packaging to asar is disabled, it does not imply that the main file can not be inside an .asar archive.
      // This may occur when the packaging is done manually before processing with electron-builder.

      if (pathParsed.dir.includes(".asar")) {
        // The path needs to be split to the part with an asar archive which acts like a directory and the part with
        // the path to main file itself. (e.g. path/arch.asar/dir/index.js -> path/arch.asar, dir/index.js)
        // noinspection TypeScriptValidateJSTypes
        const pathSplit = pathParsed.dir.split(path.sep);
        let partWithAsarIndex = 0;
        pathSplit.some((pathPart, index) => {
          partWithAsarIndex = index;
          return pathPart.endsWith(".asar");
        });
        const asarPath = path.join.apply(path, pathSplit.slice(0, partWithAsarIndex + 1));
        let mainPath = pathSplit.length > partWithAsarIndex + 1 ? path.join.apply(pathSplit.slice(partWithAsarIndex + 1)) : "";
        mainPath += path.join(mainPath, pathParsed.base);
        yield (0, _asarFileChecker().checkFileInArchive)(path.join(resourcesDir, "app", asarPath), mainPath, messagePrefix);
      } else {
        const fullPath = path.join(resourcesDir, "app", relativeFile);
        const outStat = yield (0, _fs().statOrNull)(fullPath);

        if (outStat == null) {
          throw new Error(`${messagePrefix} "${fullPath}" does not exist. Seems like a wrong configuration.`);
        } else {
          //noinspection ES6MissingAwait
          if (!outStat.isFile()) {
            throw new Error(`${messagePrefix} "${fullPath}" is not a file. Seems like a wrong configuration.`);
          }
        }
      }
    })();
  }

  sanityCheckPackage(appOutDir, isAsar, framework) {
    var _this7 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const outStat = yield (0, _fs().statOrNull)(appOutDir);

      if (outStat == null) {
        throw new Error(`Output directory "${appOutDir}" does not exist. Seems like a wrong configuration.`);
      } else {
        //noinspection ES6MissingAwait
        if (!outStat.isDirectory()) {
          throw new Error(`Output directory "${appOutDir}" is not a directory. Seems like a wrong configuration.`);
        }
      }

      const resourcesDir = _this7.getResourcesDir(appOutDir);

      const mainFile = (framework.getMainFile == null ? null : framework.getMainFile(_this7.platform)) || _this7.info.metadata.main || "index.js";
      yield _this7.checkFileInPackage(resourcesDir, mainFile, "Application entry file", isAsar);
      yield _this7.checkFileInPackage(resourcesDir, "package.json", "Application", isAsar);
    })();
  } // tslint:disable-next-line:no-invalid-template-strings


  computeSafeArtifactName(suggestedName, ext, arch, skipArchIfX64 = true, safePattern = "${name}-${version}-${arch}.${ext}") {
    // GitHub only allows the listed characters in file names.
    if (suggestedName != null && isSafeGithubName(suggestedName)) {
      return null;
    }

    return this.computeArtifactName(safePattern, ext, skipArchIfX64 && arch === _builderUtil().Arch.x64 ? null : arch);
  }

  expandArtifactNamePattern(targetSpecificOptions, ext, arch, defaultPattern, skipArchIfX64 = true) {
    let pattern = targetSpecificOptions == null ? null : targetSpecificOptions.artifactName;

    if (pattern == null) {
      pattern = this.platformSpecificBuildOptions.artifactName || this.config.artifactName;
    }

    if (pattern == null) {
      // tslint:disable-next-line:no-invalid-template-strings
      pattern = defaultPattern || "${productName}-${version}-${arch}.${ext}";
    } else {
      // https://github.com/electron-userland/electron-builder/issues/3510
      // always respect arch in user custom artifact pattern
      skipArchIfX64 = false;
    }

    return this.computeArtifactName(pattern, ext, skipArchIfX64 && arch === _builderUtil().Arch.x64 ? null : arch);
  }

  expandArtifactBeautyNamePattern(targetSpecificOptions, ext, arch) {
    // tslint:disable-next-line:no-invalid-template-strings
    return this.expandArtifactNamePattern(targetSpecificOptions, ext, arch, "${productName} ${version} ${arch}.${ext}", true);
  }

  computeArtifactName(pattern, ext, arch) {
    let archName = arch == null ? null : _builderUtil().Arch[arch];

    if (arch === _builderUtil().Arch.x64) {
      if (ext === "AppImage" || ext === "rpm") {
        archName = "x86_64";
      } else if (ext === "deb" || ext === "snap") {
        archName = "amd64";
      }
    } else if (arch === _builderUtil().Arch.ia32) {
      if (ext === "deb" || ext === "AppImage" || ext === "snap") {
        archName = "i386";
      } else if (ext === "pacman" || ext === "rpm") {
        archName = "i686";
      }
    }

    return this.expandMacro(pattern, this.platform === _index().Platform.MAC ? null : archName, {
      ext
    });
  }

  expandMacro(pattern, arch, extra = {}, isProductNameSanitized = true) {
    return (0, _macroExpander().expandMacro)(pattern, arch, this.appInfo, Object.assign({
      os: this.platform.buildConfigurationKey
    }, extra), isProductNameSanitized);
  }

  generateName2(ext, classifier, deployment) {
    const dotExt = ext == null ? "" : `.${ext}`;
    const separator = ext === "deb" ? "_" : "-";
    return `${deployment ? this.appInfo.name : this.appInfo.productFilename}${separator}${this.appInfo.version}${classifier == null ? "" : `${separator}${classifier}`}${dotExt}`;
  }

  getTempFile(suffix) {
    return this.info.tempDirManager.getTempFile({
      suffix
    });
  }

  get fileAssociations() {
    return (0, _builderUtil().asArray)(this.config.fileAssociations).concat((0, _builderUtil().asArray)(this.platformSpecificBuildOptions.fileAssociations));
  }

  getResource(custom, ...names) {
    var _this8 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const resourcesDir = _this8.info.buildResourcesDir;

      if (custom === undefined) {
        const resourceList = yield _this8.resourceList;

        for (const name of names) {
          if (resourceList.includes(name)) {
            return path.join(resourcesDir, name);
          }
        }
      } else if (custom != null && !(0, _builderUtil().isEmptyOrSpaces)(custom)) {
        const resourceList = yield _this8.resourceList;

        if (resourceList.includes(custom)) {
          return path.join(resourcesDir, custom);
        }

        let p = path.resolve(resourcesDir, custom);

        if ((yield (0, _fs().statOrNull)(p)) == null) {
          p = path.resolve(_this8.projectDir, custom);

          if ((yield (0, _fs().statOrNull)(p)) == null) {
            throw new (_builderUtil().InvalidConfigurationError)(`cannot find specified resource "${custom}", nor relative to "${resourcesDir}", neither relative to project dir ("${_this8.projectDir}")`);
          }
        }

        return p;
      }

      return null;
    })();
  }

  get forceCodeSigning() {
    const forceCodeSigningPlatform = this.platformSpecificBuildOptions.forceCodeSigning;
    return (forceCodeSigningPlatform == null ? this.config.forceCodeSigning : forceCodeSigningPlatform) || false;
  }

  getOrConvertIcon(format) {
    var _this9 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const result = yield _this9.resolveIcon((0, _builderUtil().asArray)(_this9.platformSpecificBuildOptions.icon || _this9.config.icon), [], format);

      if (result.length === 0) {
        const framework = _this9.info.framework;

        if (framework.getDefaultIcon != null) {
          return framework.getDefaultIcon(_this9.platform);
        }

        _builderUtil().log.warn({
          reason: "application icon is not set"
        }, `default ${capitalizeFirstLetter(framework.name)} icon is used`);

        return _this9.getDefaultFrameworkIcon();
      } else {
        return result[0].file;
      }
    })();
  }

  getDefaultFrameworkIcon() {
    const framework = this.info.framework;
    return framework.getDefaultIcon == null ? null : framework.getDefaultIcon(this.platform);
  } // convert if need, validate size (it is a reason why tool is called even if file has target extension (already specified as foo.icns for example))


  resolveIcon(sources, fallbackSources, outputFormat) {
    var _this10 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const args = ["icon", "--format", outputFormat, "--root", _this10.buildResourcesDir, "--root", _this10.projectDir, "--out", path.resolve(_this10.projectDir, _this10.config.directories.output, `.icon-${outputFormat}`)];

      for (const source of sources) {
        args.push("--input", source);
      }

      for (const source of fallbackSources) {
        args.push("--fallback-input", source);
      }

      const result = yield (0, _appBuilder().executeAppBuilderAsJson)(args);
      const errorMessage = result.error;

      if (errorMessage != null) {
        throw new (_builderUtil().InvalidConfigurationError)(errorMessage, result.errorCode);
      }

      if (result.isFallback) {
        _builderUtil().log.warn({
          reason: "application icon is not set"
        }, `default ${capitalizeFirstLetter(_this10.info.framework.name)} icon is used`);
      }

      return result.icons || [];
    })();
  }

}

exports.PlatformPackager = PlatformPackager;

function isSafeGithubName(name) {
  return /^[0-9A-Za-z._-]+$/.test(name);
} // remove leading dot


function normalizeExt(ext) {
  return ext.startsWith(".") ? ext.substring(1) : ext;
}

function resolveFunction(executor, name) {
  if (executor == null || typeof executor !== "string") {
    return executor;
  }

  let p = executor;

  if (p.startsWith(".")) {
    p = path.resolve(p);
  }

  try {
    p = require.resolve(p);
  } catch (e) {
    (0, _builderUtil().debug)(e);
    p = path.resolve(p);
  }

  const m = require(p);

  const namedExport = m[name];

  if (namedExport == null) {
    return m.default || m;
  } else {
    return namedExport;
  }
}

function chooseNotNull(v1, v2) {
  return v1 == null ? v2 : v1;
}

function capitalizeFirstLetter(text) {
  return text.charAt(0).toUpperCase() + text.slice(1);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=platformPackager.js.map{"version":3,"sources":["../src/platformPackager.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEM,MAAgB,gBAAhB,CAAgC;AA2BpC,EAAA,WAAA,CAA+B,IAA/B,EAAwD,QAAxD,EAA0E;AAA3C,SAAA,IAAA,GAAA,IAAA;AAAyB,SAAA,QAAA,GAAA,QAAA;AAJvC,SAAA,aAAA,GAAgB,KAAI,eAAJ,EAAwB,MAAM,iCAAiB,yBAAQ,KAAK,IAAL,CAAU,iBAAlB,CAAjB,EAAuD,EAAvD,CAA9B,CAAhB;AAKf,SAAK,4BAAL,GAAoC,gBAAgB,CAAC,qCAAjB,CAAwD,KAAK,MAAL,CAAoB,QAAQ,CAAC,qBAA7B,CAAxD,CAApC;AACA,SAAK,OAAL,GAAe,KAAK,cAAL,CAAoB,IAAI,CAAC,OAAzB,CAAf;AACD;;AA7BD,MAAI,eAAJ,GAAmB;AACjB,WAAO,KAAK,IAAL,CAAU,OAAjB;AACD;;AAED,MAAI,iBAAJ,GAAqB;AACnB,WAAO,KAAK,IAAL,CAAU,iBAAjB;AACD;;AAED,MAAI,UAAJ,GAAc;AACZ,WAAO,KAAK,IAAL,CAAU,UAAjB;AACD;;AAED,MAAI,MAAJ,GAAU;AACR,WAAO,KAAK,IAAL,CAAU,MAAjB;AACD;;AAID,MAAI,YAAJ,GAAgB;AACd,WAAO,KAAK,aAAL,CAAmB,KAA1B;AACD;;AAWD,MAAI,WAAJ,GAAe;AACb,UAAM,WAAW,GAAG,KAAK,4BAAL,CAAkC,WAAtD,CADa,CAEb;;AACA,QAAI,WAAW,KAAK,IAApB,EAA0B;AACxB,aAAO,QAAP;AACD;;AACD,WAAO,WAAW,IAAI,KAAK,MAAL,CAAY,WAA3B,IAA0C,QAAjD;AACD;;AAED,MAAI,WAAJ,GAAe;AACb,WAAO,KAAK,IAAL,CAAU,WAAjB;AACD;;AAIS,EAAA,cAAc,CAAC,OAAD,EAAiB;AACvC,WAAO,KAAI,kBAAJ,EAAY,KAAK,IAAjB,EAAuB,IAAvB,EAA6B,KAAK,4BAAlC,CAAP;AACD;;AAEO,SAAO,qCAAP,CAA6C,OAA7C,EAA4E;AAClF,WAAO,OAAO,IAAI,IAAX,GAAkB,MAAM,CAAC,MAAP,CAAc,IAAd,CAAlB,GAAwC,OAA/C;AACD;;AAIS,EAAA,cAAc,GAAA;AACtB,UAAM,QAAQ,GAAG,KAAK,gBAAL,EAAjB;;AACA,QAAI,oCAAgB,QAAhB,CAAJ,EAA+B;AAC7B,yBAAI,IAAJ,CAAS;AAAC,QAAA,MAAM,EAAE;AAAT,OAAT,EAAsD,8CAAtD;;AACA,aAAO,EAAP;AACD,KAHD,MAIK;AACH,aAAO,QAAS,CAAC,IAAV,EAAP;AACD;AACF;;AAES,EAAA,UAAU,CAAC,YAAD,EAA6B;AAC/C;AACA,UAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,IAAI,IAAhB,GAAuB,IAAvB,GAA8B,OAAO,CAAC,GAAR,CAAY,YAAZ,CAA/B,EAA0D,OAAO,CAAC,GAAR,CAAY,QAAtE,CAA9B;AACA,WAAO,aAAa,CAAC,aAAa,CAAC,KAAK,IAAL,CAAU,MAAV,CAAiB,OAAlB,EAA2B,KAAK,4BAAL,CAAkC,OAA7D,CAAd,EAAqF,QAArF,CAApB;AACD;;AAES,EAAA,gBAAgB,GAAA;AACxB;AACA,WAAO,aAAa,CAAC,aAAa,CAAC,KAAK,IAAL,CAAU,MAAV,CAAiB,cAAlB,EAAkC,KAAK,4BAAL,CAAkC,cAApE,CAAd,EAAmG,OAAO,CAAC,GAAR,CAAY,gBAA/G,CAApB;AACD;;AAES,EAAA,gBAAgB,CAAC,MAAD,EAAiB,IAAjB,EAA2B;AACnD,WAAO,KAAK,eAAL,CAAqB,WAArB,IAAoC,IAAI,CAAC,IAAL,CAAU,MAAV,EAAkB,GAAG,KAAK,QAAL,CAAc,qBAAqB,GAAG,kCAAc,IAAd,CAAmB,GAAG,KAAK,QAAL,KAAkB,kBAAS,GAA3B,GAAiC,EAAjC,GAAsC,WAAW,EAAlI,CAA3C;AACD;;AAED,EAAA,uBAAuB,CAAC,IAAD,EAAe,MAAf,EAAsC,IAAtC,EAAyD,gBAAzD,EAAyF;AAC9G,WAAO,KAAK,IAAL,CAAU,0BAAV,CAAqC;AAC1C,MAAA,IAD0C;AACpC,MAAA,gBADoC;AAClB,MAAA,MADkB;AACV,MAAA,IADU;AAE1C,MAAA,QAAQ,EAAE;AAFgC,KAArC,CAAP;AAID;;AAEK,EAAA,IAAN,CAAW,MAAX,EAA2B,IAA3B,EAAuC,OAAvC,EAA+D,WAA/D,EAA4F;AAAA;;AAAA;AAC1F,YAAM,SAAS,GAAG,KAAI,CAAC,gBAAL,CAAsB,MAAtB,EAA8B,IAA9B,CAAlB;;AACA,YAAM,KAAI,CAAC,MAAL,CAAY,MAAZ,EAAoB,SAApB,EAA+B,KAAI,CAAC,QAAL,CAAc,QAA7C,EAA+E,IAA/E,EAAqF,KAAI,CAAC,4BAA1F,EAAwH,OAAxH,CAAN;;AACA,MAAA,KAAI,CAAC,4BAAL,CAAkC,SAAlC,EAA6C,IAA7C,EAAmD,OAAnD,EAA4D,WAA5D;AAH0F;AAI3F;;AAES,EAAA,4BAA4B,CAAC,SAAD,EAAoB,IAApB,EAAgC,OAAhC,EAAwD,WAAxD,EAAqF;AAAA;;AACzH,QAAI,OAAO,CAAC,IAAR,CAAa,EAAE,IAAI,CAAC,EAAE,CAAC,gBAAvB,KAA4C,IAAhD,EAAsD;AACpD,MAAA,gBAAgB,CAAC,iBAAjB,CAAmC,OAAnC,EAA4C,WAA5C,EAAyD,SAAzD,EAAoE,IAApE;AACA;AACD;;AAED,IAAA,WAAW,CAAC,GAAZ;AAAA;AAAA,kCAAgB,aAAW;AACzB;AACA,YAAM,cAAc,GAAG,KAAI,+BAAJ,EAAqB,MAAI,CAAC,IAAL,CAAU,iBAA/B,CAAvB;AACA,MAAA,gBAAgB,CAAC,iBAAjB,CAAmC,OAAnC,EAA4C,cAA5C,EAA4D,SAA5D,EAAuE,IAAvE;AACA,YAAM,cAAc,CAAC,UAAf,EAAN;;AAEA,WAAK,MAAM,MAAX,IAAqB,OAArB,EAA8B;AAC5B,YAAI,CAAC,MAAM,CAAC,gBAAZ,EAA8B;AAC5B,gBAAM,MAAM,CAAC,KAAP,CAAa,SAAb,EAAwB,IAAxB,CAAN;AACD;AACF;AACF,KAXD;AAYD;;AAEO,SAAO,iBAAP,CAAyB,OAAzB,EAAiD,WAAjD,EAAgF,SAAhF,EAAmG,IAAnG,EAA6G;AACnH,SAAK,MAAM,MAAX,IAAqB,OAArB,EAA8B;AAC5B,UAAI,MAAM,CAAC,gBAAX,EAA6B;AAC3B,QAAA,WAAW,CAAC,OAAZ,CAAoB,MAAM,CAAC,KAAP,CAAa,SAAb,EAAwB,IAAxB,CAApB;AACD;AACF;AACF;;AAEO,EAAA,oBAAoB,CAAC,WAAD,EAAuB,SAAvB,EAA0C,OAA1C,EAAyE;AACnG,UAAM,IAAI,GAAG,WAAW,GAAG,KAAK,eAAL,CAAqB,SAArB,CAAH,GAAsC,KAAK,QAAL,KAAkB,kBAAS,GAA3B,GAAiC,IAAI,CAAC,IAAL,CAAU,SAAV,EAAqB,GAAG,KAAK,OAAL,CAAa,eAAe,MAApD,EAA4D,UAA5D,CAAjC,GAA2G,SAAzK;AACA,WAAO,oCAAgB,KAAK,MAArB,EAA6B,WAAW,GAAG,gBAAH,GAAsB,YAA9D,EAA4E,IAA5E,EAAkF,OAAlF,CAAP;AACD;;AAED,MAAI,0BAAJ,GAA8B;AAC5B,WAAO,UAAP;AACD;;AAED,MAAI,+BAAJ,GAAmC;AACjC,WAAO,UAAP;AACD;;AAED,EAAA,4BAA4B,CAAC,MAAD,EAAiB,IAAjB,EAA6B,kBAA7B,EAA6E;AACvG,WAAO;AACL,MAAA,aAAa,EAAE,EAAE,IAAI,KAAK,WAAL,CAAiB,EAAjB,EAAqB,IAAI,IAAI,IAAR,GAAe,IAAf,GAAsB,oBAAK,IAAL,CAA3C,EAAuD;AAAC,cAAM;AAAP,OAAvD,CADhB;AAEL,MAAA,kBAFK;AAGL,MAAA,YAAY,EAAE,MAHT;AAIL,MAAA,UAAU,EAAE,KAAK;AAJZ,KAAP;AAMD;;AAEe,EAAA,MAAN,CAAa,MAAb,EAA6B,SAA7B,EAAgD,YAAhD,EAAoF,IAApF,EAAgG,4BAAhG,EAAkI,OAAlI,EAAwJ;AAAA;;AAAA;AAChK,UAAI,MAAI,CAAC,eAAL,CAAqB,WAArB,IAAoC,IAAxC,EAA8C;AAC5C;AACD;;AAED,YAAM,SAAS,GAAG,MAAI,CAAC,IAAL,CAAU,SAA5B;;AACA,yBAAI,IAAJ,CAAS;AACP,QAAA,QAAQ,EAAE,YADH;AAEP,QAAA,IAAI,EAAE,oBAAK,IAAL,CAFC;AAGP,SAAC,GAAG,SAAS,CAAC,IAAI,EAAlB,GAAuB,SAAS,CAAC,OAH1B;AAIP,QAAA,SAAS,EAAE,mBAAI,QAAJ,CAAa,SAAb;AAJJ,OAAT,EAKG,WALH;;AAOA,YAAM,SAAS,CAAC,gCAAV,CAA2C;AAC/C,QAAA,QAAQ,EAAE,MADqC;AAE/C,QAAA,SAF+C;AAG/C,QAAA,YAH+C;AAI/C,QAAA,IAAI,EAAE,oBAAK,IAAL,CAJyC;AAK/C,QAAA,OAAO,EAAE,SAAS,CAAC;AAL4B,OAA3C,CAAN;AAQA,YAAM,eAAe,GAAqB,EAA1C;;AAEA,YAAM,qBAAqB,GAAI,QAAD,IAAwC;AACpE,YAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,eAAK,MAAM,OAAX,IAAsB,QAAtB,EAAgC;AAC9B,YAAA,OAAO,CAAC,qBAAR,CAA8B,eAA9B,EAA+C,MAAI,CAAC,IAAL,CAAU,UAAzD;AACD;AACF;AACF,OAND;;AAQA,YAAM,sBAAsB,GAAG,MAAI,CAAC,4BAAL,CAAkC,MAAlC,EAA0C,IAA1C,EAAgD,4BAAhD,CAA/B;;AACA,YAAM,aAAa,GAAG,sBAAsB,CAAC,aAA7C;;AACA,YAAM,qBAAqB,GAAG,MAAI,CAAC,oBAAL,CAA0B,IAA1B,EAAgC,SAAhC,EAA2C,sBAA3C,CAA9B;;AACA,MAAA,qBAAqB,CAAC,qBAAD,CAArB;;AACA,YAAM,iBAAiB,GAAG,MAAI,CAAC,oBAAL,CAA0B,KAA1B,EAAiC,SAAjC,EAA4C,sBAA5C,CAA1B;;AACA,MAAA,qBAAqB,CAAC,iBAAD,CAArB;AAEA,YAAM,WAAW,GAAqB;AACpC,QAAA,SADoC;AACzB,QAAA,MADyB;AACjB,QAAA,IADiB;AACX,QAAA,OADW;AAEpC,QAAA,QAAQ,EAAE,MAF0B;AAGpC,QAAA,oBAAoB,EAAE;AAHc,OAAtC;AAMA,YAAM,WAAW,SAAS,MAAI,CAAC,kBAAL,CAAwB,4BAAxB,CAA1B;AACA,YAAM,aAAa,GAAG,MAAI,CAAC,QAAL,KAAkB,kBAAS,GAA3B,GAAiC,IAAI,CAAC,IAAL,CAAU,SAAV,EAAqB,SAAS,CAAC,gBAA/B,EAAiD,UAAjD,EAA6D,WAA7D,CAAjC,GAA8G,kCAAgB,SAAhB,IAA6B,IAAI,CAAC,IAAL,CAAU,SAAV,EAAqB,WAArB,CAA7B,GAAiE,SAArM;AACA,YAAM,WAAW,GAAG,KAAI,+BAAJ,EAAqB,MAAI,CAAC,IAAL,CAAU,iBAA/B,CAApB;;AACA,MAAA,MAAI,CAAC,YAAL,CAAkB,WAAlB,EAA+B,WAA/B,EAA4C,aAA5C,EAA2D,IAAI,CAAC,IAAL,CAAU,aAAV,EAAyB,KAAzB,CAA3D,EAA4F,WAA5F,EAAyG,4BAAzG,EAAuI,eAAvI,EAAwJ,aAAxJ;;AACA,YAAM,WAAW,CAAC,UAAZ,EAAN;;AAEA,UAAI,MAAI,CAAC,IAAL,CAAU,iBAAV,CAA4B,SAAhC,EAA2C;AACzC;AACD;;AAED,UAAI,SAAS,CAAC,oBAAV,IAAkC,IAAtC,EAA4C;AAC1C,cAAM,SAAS,CAAC,oBAAV,CAA+B;AACnC,UAAA,QAAQ,EAAE,MADyB;AAEnC,UAAA,SAFmC;AAGnC,UAAA,aAAa,EAAE,WAAW,IAAI,IAAf,GAAsB,IAAtB,SAAmC,8BAAY,aAAZ,EAA2B,WAAW,CAAC,eAAZ,GAA8B;AAAC,YAAA,eAAe,EAAE;AAAlB,WAA9B,GAAwD,IAAnF,CAHf;AAInC,UAAA;AAJmC,SAA/B,CAAN;AAMD;;AAED,UAAI,MAAI,CAAC,IAAL,CAAU,iBAAV,CAA4B,SAAhC,EAA2C;AACzC;AACD;;AAED,YAAM,wBAAwB,GAAG,MAAI,CAAC,8BAAL,CAAoC,WAApC,CAAjC;;AACA,YAAM,8BAAU,qBAAV,EAAiC,wBAAjC,CAAN;AACA,YAAM,8BAAU,iBAAV,EAA6B,wBAA7B,CAAN;;AAEA,UAAI,MAAI,CAAC,IAAL,CAAU,iBAAV,CAA4B,SAAhC,EAA2C;AACzC;AACD;;AAED,YAAM,MAAI,CAAC,IAAL,CAAU,SAAV,CAAoB,WAApB,CAAN;;AAEA,UAAI,SAAS,CAAC,SAAV,IAAuB,IAA3B,EAAiC;AAC/B,cAAM,SAAS,CAAC,SAAV,CAAoB,WAApB,CAAN;AACD;;AAED,YAAM,MAAM,GAAG,WAAW,IAAI,IAA9B;AACA,YAAM,MAAI,CAAC,kBAAL,CAAwB,SAAxB,EAAmC,MAAnC,EAA2C,SAA3C,CAAN;AACA,YAAM,MAAI,CAAC,OAAL,CAAa,WAAb,EAA0B,MAA1B,CAAN;AAEA,YAAM,SAAS,GAAG,eAAe,CAAC,MAAI,CAAC,MAAL,CAAY,SAAb,EAAwB,WAAxB,CAAjC;;AACA,UAAI,SAAS,IAAI,IAAjB,EAAuB;AACrB,cAAM,OAAO,CAAC,OAAR,CAAgB,SAAS,CAAC,WAAD,CAAzB,CAAN;AACD;AAxF+J;AAyFjK;;AAES,EAAA,8BAA8B,CAAC,WAAD,EAA8B;AACpE,WAAO,IAAP;AACD;;AAEO,EAAA,YAAY,CAAC,WAAD,EAAgC,WAAhC,EAAiE,YAAjE,EAAuF,kBAAvF,EAAmH,WAAnH,EAAkJ,4BAAlJ,EAAoL,eAApL,EAAuN,aAAvN,EAA8P;AAAA;;AAChR,UAAM,MAAM,GAAG,KAAK,IAAL,CAAU,MAAzB;AACA,UAAM,MAAM,GAAG,KAAK,MAApB;AACA,UAAM,iBAAiB,GAAG,WAAW,IAAI,IAAf,IAAuB,8CAAsB,KAAK,IAA3B,CAAjD;AAEA,UAAM,YAAY,GAAG,wCAAoB,MAApB,EAA4B,kBAA5B,EAAgD,aAAhD,EAA+D,4BAA/D,EAA6F,IAA7F,EAAmG,WAAW,CAAC,MAA/G,EAAuH,iBAAvH,CAArB;;AACA,QAAI,eAAe,CAAC,MAAhB,GAAyB,CAA7B,EAAgC;AAC9B,WAAK,MAAM,OAAX,IAAsB,YAAtB,EAAoC;AAClC,QAAA,OAAO,CAAC,eAAR,GAA0B,eAA1B;AACD;AACF;;AAED,UAAM,SAAS,GAAG,KAAK,IAAL,CAAU,SAA5B;AACA,UAAM,WAAW,GAAG,0CAAkB,MAAlB,EAA0B,MAA1B,EAAkC,iBAAiB,GAAE,MAAA,CAAA,MAAA,CAAA;AACvE,MAAA,YAAY,EAAE,KAAK,IAAL,CAAU,QAAV,CAAmB,IADsC;AAEvE,MAAA,IAAI,EAAE;AAFiE,KAAA,EAGpE,MAAM,CAAC,aAH6D,CAAF,GAInE,MAAM,CAAC,aAJS,EAIM,SAAS,CAAC,iBAAV,IAA+B,IAA/B,GAAsC,IAAtC,GAA6C,SAAS,CAAC,iBAAV,EAJnD,CAApB;;AAMA,UAAM,gBAAgB,GAAI,QAAD,IAAiC;AACxD,aAAO,sCAAgB,QAAhB,EAA0B,KAAK,IAAL,CAAU,kBAAV,GAA+B,IAA/B,GAAsC,WAAhE,EAA6E,IAA7E,EAAmF,iBAAnF,EACJ,IADI;AAAA;AAAA;AAAA,kDACC,WAAM,MAAN,EAAe;AACnB,cAAI,CAAC,MAAI,CAAC,IAAL,CAAU,kBAAX,IAAiC,CAAC,MAAI,CAAC,IAAL,CAAU,+BAAhD,EAAiF;AAC/E,kBAAM,iBAAiB,GAAG,6CAAyB,MAAzB,EAAiC,kBAAjC,EAAqD,aAArD,EAAoE,4BAApE,EAAkG,MAAI,CAAC,IAAvG,CAA1B;AACA,YAAA,MAAM,GAAG,MAAM,CAAC,MAAP,QAAoB,gDAA0B,MAA1B,EAAgC,iBAAhC,CAApB,EAAT;AACD;;AACD,iBAAO,MAAM,CAAC,MAAP,CAAc,EAAE,IAAI,EAAE,CAAC,KAAH,CAAS,MAAT,GAAkB,CAAtC,CAAP;AACD,SAPI;;AAAA;AAAA;AAAA;AAAA,UAAP;AAQD,KATD;;AAWA,QAAI,KAAK,IAAL,CAAU,kBAAd,EAAkC;AAChC,MAAA,WAAW,CAAC,OAAZ,CAAoB,uBAAgB,IAAhB,CAAqB,gBAAgB,CAAC,CAAC,KAAI,0BAAJ,EAAgB,MAAhB,EAAwB,YAAxB,EAAsC,aAAtC,CAAD,CAAD,CAArC,EAA+F,EAAE,IAAI,mCAAa,EAAb,EAAiB,KAAK,IAAtB,EAA4B,WAA5B,CAArG,CAApB;AACD,KAFD,MAGK,IAAI,WAAW,IAAI,IAAnB,EAAyB;AAC5B;AACA;AACA;AACA,YAAM,wBAAwB,GAAG,KAAK,8BAAL,CAAoC,WAApC,CAAjC;;AACA,YAAM,mBAAmB,GAAoB,IAAI,IAAG;AAClD,YAAI,wBAAwB,IAAI,IAAhC,EAAsC;AACpC,gBAAM,MAAM,GAAG,wBAAwB,CAAC,IAAD,CAAvC;;AACA,cAAI,MAAM,IAAI,IAAd,EAAoB;AAClB,mBAAO,MAAP;AACD;AACF;;AACD,eAAO,WAAW,CAAC,IAAD,CAAlB;AACD,OARD;;AAUA,MAAA,WAAW,CAAC,OAAZ,CAAoB,uBAAgB,IAAhB,CAAqB,gBAAgB,CAAC,YAAD,CAArC,EAAqD,EAAE,IAAI,mCAAa,EAAb,EAAiB,KAAK,IAAtB,EAA4B,mBAA5B,CAA3D,CAApB;AACD,KAhBI,MAiBA;AACH,YAAM,aAAa,GAAG,oCAAgB,MAAhB,EAAwB,YAAxB,EAAsC,kBAAtC,EAA0D;AAC9E,QAAA,aAD8E;AAE9E,QAAA,kBAAkB,EAAE,4BAF0D;AAG9E,QAAA,YAAY,EAAE,WAAW,CAAC,MAHoD;AAI9E,QAAA,UAAU,EAAE;AAJkE,OAA1D,CAAtB;AAMA,YAAM,WAAW,GAAG,aAAa,IAAI,IAAjB,GAAwB,IAAxB,GAA+B,aAAa,CAAC,CAAD,CAAhE;AACA,MAAA,WAAW,CAAC,OAAZ,CAAoB,gBAAgB,CAAC,YAAD,CAAhB,CACjB,IADiB;AAAA;AAAA;AAAA,kDACZ,WAAM,QAAN,EAAiB;AACrB,eAAK,MAAM,OAAX,IAAsB,QAAtB,EAAgC;AAC9B,kBAAM,qCAAe,WAAf,EAA4B,OAA5B,CAAN;AACD;;AAED,gBAAM,KAAI,wBAAJ,EAAiB,MAAjB,EAAyB,YAAzB,EAAuC,WAAvC,EAAoD,WAAW,IAAI,IAAf,GAAsB,IAAtB,GAA6B,WAAW,CAAC,YAAZ,EAAjF,EACH,IADG,CACE,QADF,EACY,MADZ,CAAN;AAED,SARiB;;AAAA;AAAA;AAAA;AAAA,UAApB;AASD;AACF;;AAES,EAAA,OAAO,CAAC,WAAD,EAAgC,MAAhC,EAA+C;AAC9D,WAAO,OAAO,CAAC,OAAR,EAAP;AACD;;AAEK,EAAA,WAAN,GAAiB;AAAA;AACf,aAAO,IAAP;AADe;AAEhB;;AAEa,EAAA,kBAAN,CAAyB,kBAAzB,EAA+C;AAAA;;AAAA;AACrD,UAAI,CAAC,kCAAgB,MAAI,CAAC,IAAL,CAAU,SAA1B,CAAL,EAA2C;AACzC,eAAO,IAAP;AACD;;AAED,eAAS,YAAT,CAAsB,IAAtB,EAAkC;AAChC,eAAO,GAAG,IAAI,wEAAd;AACD;;AAED,YAAM,aAAa,GAAG,MAAI,CAAC,MAA3B;;AACA,UAAI,aAAa,CAAC,aAAD,CAAb,IAAgC,IAApC,EAA0C;AACxC,cAAM,IAAI,KAAJ,CAAU,YAAY,CAAC,aAAD,CAAtB,CAAN;AACD;;AACD,UAAI,aAAa,CAAC,iBAAD,CAAb,IAAoC,IAAxC,EAA8C;AAC5C,cAAM,IAAI,KAAJ,CAAU,YAAY,CAAC,iBAAD,CAAtB,CAAN;AACD;;AAED,YAAM,gBAAgB,GAAG,kBAAkB,CAAC,IAA5C;AACA,YAAM,MAAM,GAAG,gBAAgB,IAAI,IAApB,GAA2B,MAAI,CAAC,MAAL,CAAY,IAAvC,GAA8C,gBAA7D;;AACA,UAAI,MAAM,KAAK,KAAf,EAAsB;AACpB,cAAM,WAAW,SAAS,sBAAW,IAAI,CAAC,IAAL,CAAU,MAAI,CAAC,IAAL,CAAU,MAApB,EAA4B,UAA5B,CAAX,CAA1B,CADoB,CAEpB;;AACA,YAAI,WAAW,IAAI,IAAf,IAAuB,CAAC,WAAW,CAAC,MAAZ,EAA5B,EAAkD;AAChD,6BAAI,IAAJ,CAAS;AACP,YAAA,QAAQ,EAAE;AADH,WAAT,EAEG,yDAFH;AAGD;;AACD,eAAO,IAAP;AACD;;AAED,UAAI,MAAM,IAAI,IAAV,IAAkB,MAAM,KAAK,IAAjC,EAAuC;AACrC,eAAO,EAAP;AACD;;AAED,WAAK,MAAM,IAAX,IAAmB,CAAC,WAAD,EAAc,QAAd,CAAnB,EAA4C;AAC1C,YAAK,MAAc,CAAC,IAAD,CAAd,IAAwB,IAA7B,EAAmC;AACjC,gBAAM,IAAI,KAAJ,CAAU,YAAY,CAAC,QAAQ,IAAI,EAAb,CAAtB,CAAN;AACD;AACF;;AACD,aAAO,+BAAW,EAAX,EAAe,MAAf,CAAP;AAvCqD;AAwCtD;;AAEM,EAAA,iBAAiB,CAAC,IAAD,EAAa;AACnC,WAAO,IAAI,CAAC,OAAL,CAAa,KAAK,UAAlB,EAA8B,IAA9B,CAAP;AACD;;AAEM,EAAA,yBAAyB,CAAC,SAAD,EAAkB;AAChD,WAAO,SAAP;AACD;;AAED,EAAA,eAAe,CAAC,SAAD,EAAkB;AAC/B,QAAI,KAAK,QAAL,KAAkB,kBAAS,GAA/B,EAAoC;AAClC,aAAO,KAAK,oBAAL,CAA0B,SAA1B,CAAP;AACD,KAFD,MAGK,IAAI,kCAAgB,KAAK,IAAL,CAAU,SAA1B,CAAJ,EAA0C;AAC7C,aAAO,IAAI,CAAC,IAAL,CAAU,SAAV,EAAqB,WAArB,CAAP;AACD,KAFI,MAGA;AACH,aAAO,SAAP;AACD;AACF;;AAEM,EAAA,oBAAoB,CAAC,SAAD,EAAkB;AAC3C,WAAO,IAAI,CAAC,IAAL,CAAU,SAAV,EAAqB,GAAG,KAAK,OAAL,CAAa,eAAe,MAApD,EAA4D,UAA5D,EAAwE,WAAxE,CAAP;AACD;;AAEa,EAAA,kBAAN,CAAyB,YAAzB,EAA+C,IAA/C,EAA6D,aAA7D,EAAoF,MAApF,EAAmG;AAAA;;AAAA;AACzG,YAAM,YAAY,GAAG,IAAI,CAAC,QAAL,CAAc,MAAI,CAAC,IAAL,CAAU,MAAxB,EAAgC,IAAI,CAAC,OAAL,CAAa,MAAI,CAAC,IAAL,CAAU,MAAvB,EAA+B,IAA/B,CAAhC,CAArB;;AACA,UAAI,MAAJ,EAAY;AACV,cAAM,2CAAmB,IAAI,CAAC,IAAL,CAAU,YAAV,EAAwB,UAAxB,CAAnB,EAAwD,YAAxD,EAAsE,aAAtE,CAAN;AACA;AACD;;AAED,YAAM,UAAU,GAAG,IAAI,CAAC,KAAL,CAAW,IAAX,CAAnB,CAPyG,CAQzG;AACA;;AACA,UAAI,UAAU,CAAC,GAAX,CAAe,QAAf,CAAwB,OAAxB,CAAJ,EAAsC;AACpC;AACA;AACA;AACA,cAAM,SAAS,GAAkB,UAAU,CAAC,GAAX,CAAe,KAAf,CAAqB,IAAI,CAAC,GAA1B,CAAjC;AACA,YAAI,iBAAiB,GAAG,CAAxB;AACA,QAAA,SAAS,CAAC,IAAV,CAAe,CAAC,QAAD,EAAmB,KAAnB,KAAoC;AACjD,UAAA,iBAAiB,GAAG,KAApB;AACA,iBAAO,QAAQ,CAAC,QAAT,CAAkB,OAAlB,CAAP;AACD,SAHD;AAIA,cAAM,QAAQ,GAAG,IAAI,CAAC,IAAL,CAAU,KAAV,CAAgB,IAAhB,EAAsB,SAAS,CAAC,KAAV,CAAgB,CAAhB,EAAmB,iBAAiB,GAAG,CAAvC,CAAtB,CAAjB;AACA,YAAI,QAAQ,GAAG,SAAS,CAAC,MAAV,GAAoB,iBAAiB,GAAG,CAAxC,GAA6C,IAAI,CAAC,IAAL,CAAU,KAAV,CAAgB,SAAS,CAAC,KAAV,CAAgB,iBAAiB,GAAG,CAApC,CAAhB,CAA7C,GAAuG,EAAtH;AACA,QAAA,QAAQ,IAAI,IAAI,CAAC,IAAL,CAAU,QAAV,EAAoB,UAAU,CAAC,IAA/B,CAAZ;AACA,cAAM,2CAAmB,IAAI,CAAC,IAAL,CAAU,YAAV,EAAwB,KAAxB,EAA+B,QAA/B,CAAnB,EAA6D,QAA7D,EAAuE,aAAvE,CAAN;AACD,OAdD,MAeK;AACH,cAAM,QAAQ,GAAG,IAAI,CAAC,IAAL,CAAU,YAAV,EAAwB,KAAxB,EAA+B,YAA/B,CAAjB;AACA,cAAM,OAAO,SAAS,sBAAW,QAAX,CAAtB;;AACA,YAAI,OAAO,IAAI,IAAf,EAAqB;AACnB,gBAAM,IAAI,KAAJ,CAAU,GAAG,aAAa,KAAK,QAAQ,qDAAvC,CAAN;AACD,SAFD,MAGK;AACH;AACA,cAAI,CAAC,OAAO,CAAC,MAAR,EAAL,EAAuB;AACrB,kBAAM,IAAI,KAAJ,CAAU,GAAG,aAAa,KAAK,QAAQ,oDAAvC,CAAN;AACD;AACF;AACF;AArCwG;AAsC1G;;AAEa,EAAA,kBAAN,CAAyB,SAAzB,EAA4C,MAA5C,EAA6D,SAA7D,EAAiF;AAAA;;AAAA;AACvF,YAAM,OAAO,SAAS,sBAAW,SAAX,CAAtB;;AACA,UAAI,OAAO,IAAI,IAAf,EAAqB;AACnB,cAAM,IAAI,KAAJ,CAAU,qBAAqB,SAAS,qDAAxC,CAAN;AACD,OAFD,MAGK;AACH;AACA,YAAI,CAAC,OAAO,CAAC,WAAR,EAAL,EAA4B;AAC1B,gBAAM,IAAI,KAAJ,CAAU,qBAAqB,SAAS,yDAAxC,CAAN;AACD;AACF;;AAED,YAAM,YAAY,GAAG,MAAI,CAAC,eAAL,CAAqB,SAArB,CAArB;;AACA,YAAM,QAAQ,GAAG,CAAC,SAAS,CAAC,WAAV,IAAyB,IAAzB,GAAgC,IAAhC,GAAuC,SAAS,CAAC,WAAV,CAAsB,MAAI,CAAC,QAA3B,CAAxC,KAAiF,MAAI,CAAC,IAAL,CAAU,QAAV,CAAmB,IAApG,IAA4G,UAA7H;AACA,YAAM,MAAI,CAAC,kBAAL,CAAwB,YAAxB,EAAsC,QAAtC,EAAgD,wBAAhD,EAA0E,MAA1E,CAAN;AACA,YAAM,MAAI,CAAC,kBAAL,CAAwB,YAAxB,EAAsC,cAAtC,EAAsD,aAAtD,EAAqE,MAArE,CAAN;AAfuF;AAgBxF,GAzbmC,CA2bpC;;;AACA,EAAA,uBAAuB,CAAC,aAAD,EAA+B,GAA/B,EAA4C,IAA5C,EAAgE,aAAa,GAAG,IAAhF,EAAsF,WAAA,GAAsB,mCAA5G,EAA+I;AACpK;AACA,QAAI,aAAa,IAAI,IAAjB,IAAyB,gBAAgB,CAAC,aAAD,CAA7C,EAA8D;AAC5D,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,mBAAL,CAAyB,WAAzB,EAAsC,GAAtC,EAA2C,aAAa,IAAI,IAAI,KAAK,oBAAK,GAA/B,GAAqC,IAArC,GAA4C,IAAvF,CAAP;AACD;;AAED,EAAA,yBAAyB,CAAC,qBAAD,EAAkE,GAAlE,EAA+E,IAA/E,EAAmG,cAAnG,EAA4H,aAAa,GAAG,IAA5I,EAAgJ;AACvK,QAAI,OAAO,GAAG,qBAAqB,IAAI,IAAzB,GAAgC,IAAhC,GAAuC,qBAAqB,CAAC,YAA3E;;AACA,QAAI,OAAO,IAAI,IAAf,EAAqB;AACnB,MAAA,OAAO,GAAG,KAAK,4BAAL,CAAkC,YAAlC,IAAkD,KAAK,MAAL,CAAY,YAAxE;AACD;;AAED,QAAI,OAAO,IAAI,IAAf,EAAqB;AACnB;AACA,MAAA,OAAO,GAAG,cAAc,IAAI,0CAA5B;AACD,KAHD,MAIK;AACH;AACA;AACA,MAAA,aAAa,GAAG,KAAhB;AACD;;AACD,WAAO,KAAK,mBAAL,CAAyB,OAAzB,EAAkC,GAAlC,EAAuC,aAAa,IAAI,IAAI,KAAK,oBAAK,GAA/B,GAAqC,IAArC,GAA4C,IAAnF,CAAP;AACD;;AAED,EAAA,+BAA+B,CAAC,qBAAD,EAAkE,GAAlE,EAA+E,IAA/E,EAAiG;AAC9H;AACA,WAAO,KAAK,yBAAL,CAA+B,qBAA/B,EAAsD,GAAtD,EAA2D,IAA3D,EAAiE,0CAAjE,EAA6G,IAA7G,CAAP;AACD;;AAEO,EAAA,mBAAmB,CAAC,OAAD,EAAe,GAAf,EAA4B,IAA5B,EAAyD;AAClF,QAAI,QAAQ,GAAkB,IAAI,IAAI,IAAR,GAAe,IAAf,GAAsB,oBAAK,IAAL,CAApD;;AACA,QAAI,IAAI,KAAK,oBAAK,GAAlB,EAAuB;AACrB,UAAI,GAAG,KAAK,UAAR,IAAsB,GAAG,KAAK,KAAlC,EAAyC;AACvC,QAAA,QAAQ,GAAG,QAAX;AACD,OAFD,MAGK,IAAI,GAAG,KAAK,KAAR,IAAiB,GAAG,KAAK,MAA7B,EAAqC;AACxC,QAAA,QAAQ,GAAG,OAAX;AACD;AACF,KAPD,MAQK,IAAI,IAAI,KAAK,oBAAK,IAAlB,EAAwB;AAC3B,UAAI,GAAG,KAAK,KAAR,IAAiB,GAAG,KAAK,UAAzB,IAAuC,GAAG,KAAK,MAAnD,EAA2D;AACzD,QAAA,QAAQ,GAAG,MAAX;AACD,OAFD,MAGK,IAAI,GAAG,KAAK,QAAR,IAAoB,GAAG,KAAK,KAAhC,EAAuC;AAC1C,QAAA,QAAQ,GAAG,MAAX;AACD;AACF;;AAED,WAAO,KAAK,WAAL,CAAiB,OAAjB,EAA0B,KAAK,QAAL,KAAkB,kBAAS,GAA3B,GAAiC,IAAjC,GAAwC,QAAlE,EAA4E;AACjF,MAAA;AADiF,KAA5E,CAAP;AAGD;;AAED,EAAA,WAAW,CAAC,OAAD,EAAkB,IAAlB,EAAwC,KAAA,GAAa,EAArD,EAAyD,sBAAsB,GAAG,IAAlF,EAAsF;AAC/F,WAAO,kCAAc,OAAd,EAAuB,IAAvB,EAA6B,KAAK,OAAlC,EAAyC,MAAA,CAAA,MAAA,CAAA;AAAG,MAAA,EAAE,EAAE,KAAK,QAAL,CAAc;AAArB,KAAA,EAA+C,KAA/C,CAAzC,EAAgG,sBAAhG,CAAP;AACD;;AAED,EAAA,aAAa,CAAC,GAAD,EAAqB,UAArB,EAA4D,UAA5D,EAA+E;AAC1F,UAAM,MAAM,GAAG,GAAG,IAAI,IAAP,GAAc,EAAd,GAAmB,IAAI,GAAG,EAAzC;AACA,UAAM,SAAS,GAAG,GAAG,KAAK,KAAR,GAAgB,GAAhB,GAAsB,GAAxC;AACA,WAAO,GAAG,UAAU,GAAG,KAAK,OAAL,CAAa,IAAhB,GAAuB,KAAK,OAAL,CAAa,eAAe,GAAG,SAAS,GAAG,KAAK,OAAL,CAAa,OAAO,GAAG,UAAU,IAAI,IAAd,GAAqB,EAArB,GAA0B,GAAG,SAAS,GAAG,UAAU,EAAE,GAAG,MAAM,EAA3K;AACD;;AAED,EAAA,WAAW,CAAC,MAAD,EAAe;AACxB,WAAO,KAAK,IAAL,CAAU,cAAV,CAAyB,WAAzB,CAAqC;AAAC,MAAA;AAAD,KAArC,CAAP;AACD;;AAED,MAAI,gBAAJ,GAAoB;AAClB,WAAO,4BAAQ,KAAK,MAAL,CAAY,gBAApB,EAAsC,MAAtC,CAA6C,4BAAQ,KAAK,4BAAL,CAAkC,gBAA1C,CAA7C,CAAP;AACD;;AAEK,EAAA,WAAN,CAAkB,MAAlB,EAAqD,GAAG,KAAxD,EAA4E;AAAA;;AAAA;AAC1E,YAAM,YAAY,GAAG,MAAI,CAAC,IAAL,CAAU,iBAA/B;;AACA,UAAI,MAAM,KAAK,SAAf,EAA0B;AACxB,cAAM,YAAY,SAAS,MAAI,CAAC,YAAhC;;AACA,aAAK,MAAM,IAAX,IAAmB,KAAnB,EAA0B;AACxB,cAAI,YAAY,CAAC,QAAb,CAAsB,IAAtB,CAAJ,EAAiC;AAC/B,mBAAO,IAAI,CAAC,IAAL,CAAU,YAAV,EAAwB,IAAxB,CAAP;AACD;AACF;AACF,OAPD,MAQK,IAAI,MAAM,IAAI,IAAV,IAAkB,CAAC,oCAAgB,MAAhB,CAAvB,EAAgD;AACnD,cAAM,YAAY,SAAS,MAAI,CAAC,YAAhC;;AACA,YAAI,YAAY,CAAC,QAAb,CAAsB,MAAtB,CAAJ,EAAmC;AACjC,iBAAO,IAAI,CAAC,IAAL,CAAU,YAAV,EAAwB,MAAxB,CAAP;AACD;;AAED,YAAI,CAAC,GAAG,IAAI,CAAC,OAAL,CAAa,YAAb,EAA2B,MAA3B,CAAR;;AACA,YAAI,OAAM,sBAAW,CAAX,CAAN,KAAuB,IAA3B,EAAiC;AAC/B,UAAA,CAAC,GAAG,IAAI,CAAC,OAAL,CAAa,MAAI,CAAC,UAAlB,EAA8B,MAA9B,CAAJ;;AACA,cAAI,OAAM,sBAAW,CAAX,CAAN,KAAuB,IAA3B,EAAiC;AAC/B,kBAAM,KAAI,wCAAJ,EAA8B,mCAAmC,MAAM,uBAAuB,YAAY,wCAAwC,MAAI,CAAC,UAAU,IAAjK,CAAN;AACD;AACF;;AACD,eAAO,CAAP;AACD;;AACD,aAAO,IAAP;AAzB0E;AA0B3E;;AAED,MAAI,gBAAJ,GAAoB;AAClB,UAAM,wBAAwB,GAAG,KAAK,4BAAL,CAAkC,gBAAnE;AACA,WAAO,CAAC,wBAAwB,IAAI,IAA5B,GAAmC,KAAK,MAAL,CAAY,gBAA/C,GAAkE,wBAAnE,KAAgG,KAAvG;AACD;;AAEe,EAAA,gBAAN,CAAuB,MAAvB,EAAyC;AAAA;;AAAA;AACjD,YAAM,MAAM,SAAS,MAAI,CAAC,WAAL,CAAiB,4BAAQ,MAAI,CAAC,4BAAL,CAAkC,IAAlC,IAA0C,MAAI,CAAC,MAAL,CAAY,IAA9D,CAAjB,EAAsF,EAAtF,EAA0F,MAA1F,CAArB;;AACA,UAAI,MAAM,CAAC,MAAP,KAAkB,CAAtB,EAAyB;AACvB,cAAM,SAAS,GAAG,MAAI,CAAC,IAAL,CAAU,SAA5B;;AACA,YAAI,SAAS,CAAC,cAAV,IAA4B,IAAhC,EAAsC;AACpC,iBAAO,SAAS,CAAC,cAAV,CAAyB,MAAI,CAAC,QAA9B,CAAP;AACD;;AAED,2BAAI,IAAJ,CAAS;AAAC,UAAA,MAAM,EAAE;AAAT,SAAT,EAAkD,WAAW,qBAAqB,CAAC,SAAS,CAAC,IAAX,CAAgB,eAAlG;;AACA,eAAO,MAAI,CAAC,uBAAL,EAAP;AACD,OARD,MASK;AACH,eAAO,MAAM,CAAC,CAAD,CAAN,CAAU,IAAjB;AACD;AAbgD;AAclD;;AAED,EAAA,uBAAuB,GAAA;AACrB,UAAM,SAAS,GAAG,KAAK,IAAL,CAAU,SAA5B;AACA,WAAO,SAAS,CAAC,cAAV,IAA4B,IAA5B,GAAmC,IAAnC,GAA0C,SAAS,CAAC,cAAV,CAAyB,KAAK,QAA9B,CAAjD;AACD,GA1jBmC,CA4jBpC;;;AACM,EAAA,WAAN,CAAkB,OAAlB,EAA0C,eAA1C,EAA0E,YAA1E,EAAkG;AAAA;;AAAA;AAChG,YAAM,IAAI,GAAG,CACX,MADW,EAEX,UAFW,EAEC,YAFD,EAGX,QAHW,EAGD,OAAI,CAAC,iBAHJ,EAIX,QAJW,EAID,OAAI,CAAC,UAJJ,EAKX,OALW,EAKF,IAAI,CAAC,OAAL,CAAa,OAAI,CAAC,UAAlB,EAA8B,OAAI,CAAC,MAAL,CAAY,WAAZ,CAA0B,MAAxD,EAAkE,SAAS,YAAY,EAAvF,CALE,CAAb;;AAOA,WAAK,MAAM,MAAX,IAAqB,OAArB,EAA8B;AAC5B,QAAA,IAAI,CAAC,IAAL,CAAU,SAAV,EAAqB,MAArB;AACD;;AACD,WAAK,MAAM,MAAX,IAAqB,eAArB,EAAsC;AACpC,QAAA,IAAI,CAAC,IAAL,CAAU,kBAAV,EAA8B,MAA9B;AACD;;AAED,YAAM,MAAM,SAA4B,2CAAwB,IAAxB,CAAxC;AACA,YAAM,YAAY,GAAG,MAAM,CAAC,KAA5B;;AACA,UAAI,YAAY,IAAI,IAApB,EAA0B;AACxB,cAAM,KAAI,wCAAJ,EAA8B,YAA9B,EAA4C,MAAM,CAAC,SAAnD,CAAN;AACD;;AAED,UAAI,MAAM,CAAC,UAAX,EAAuB;AACrB,2BAAI,IAAJ,CAAS;AAAC,UAAA,MAAM,EAAE;AAAT,SAAT,EAAkD,WAAW,qBAAqB,CAAC,OAAI,CAAC,IAAL,CAAU,SAAV,CAAoB,IAArB,CAA0B,eAA5G;AACD;;AAED,aAAO,MAAM,CAAC,KAAP,IAAgB,EAAvB;AAzBgG;AA0BjG;;AAvlBmC;;;;AAymBhC,SAAU,gBAAV,CAA2B,IAA3B,EAAuC;AAC3C,SAAO,oBAAoB,IAApB,CAAyB,IAAzB,CAAP;AACD,C,CAED;;;AACM,SAAU,YAAV,CAAuB,GAAvB,EAAkC;AACtC,SAAO,GAAG,CAAC,UAAJ,CAAe,GAAf,IAAsB,GAAG,CAAC,SAAJ,CAAc,CAAd,CAAtB,GAAyC,GAAhD;AACD;;AAEK,SAAU,eAAV,CAA6B,QAA7B,EAAmD,IAAnD,EAA+D;AACnE,MAAI,QAAQ,IAAI,IAAZ,IAAoB,OAAO,QAAP,KAAoB,QAA5C,EAAsD;AACpD,WAAO,QAAP;AACD;;AAED,MAAI,CAAC,GAAG,QAAR;;AACA,MAAI,CAAC,CAAC,UAAF,CAAa,GAAb,CAAJ,EAAuB;AACrB,IAAA,CAAC,GAAG,IAAI,CAAC,OAAL,CAAa,CAAb,CAAJ;AACD;;AAED,MAAI;AACF,IAAA,CAAC,GAAG,OAAO,CAAC,OAAR,CAAgB,CAAhB,CAAJ;AACD,GAFD,CAGA,OAAO,CAAP,EAAU;AACR,8BAAM,CAAN;AACA,IAAA,CAAC,GAAG,IAAI,CAAC,OAAL,CAAa,CAAb,CAAJ;AACD;;AAED,QAAM,CAAC,GAAG,OAAO,CAAC,CAAD,CAAjB;;AACA,QAAM,WAAW,GAAG,CAAC,CAAC,IAAD,CAArB;;AACA,MAAI,WAAW,IAAI,IAAnB,EAAyB;AACvB,WAAO,CAAC,CAAC,OAAF,IAAa,CAApB;AACD,GAFD,MAGK;AACH,WAAO,WAAP;AACD;AACF;;AAEK,SAAU,aAAV,CAAwB,EAAxB,EAAuD,EAAvD,EAAoF;AACxF,SAAO,EAAE,IAAI,IAAN,GAAa,EAAb,GAAkB,EAAzB;AACD;;AAED,SAAS,qBAAT,CAA+B,IAA/B,EAA2C;AACzC,SAAO,IAAI,CAAC,MAAL,CAAY,CAAZ,EAAe,WAAf,KAA+B,IAAI,CAAC,KAAL,CAAW,CAAX,CAAtC;AACD,C","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, asArray, AsyncTaskManager, debug, DebugLogger, deepAssign, getArchSuffix, InvalidConfigurationError, isEmptyOrSpaces, log } from \"builder-util\"\nimport { FileTransformer, statOrNull } from \"builder-util/out/fs\"\nimport { orIfFileNotExist } from \"builder-util/out/promise\"\nimport { readdir } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport { Minimatch } from \"minimatch\"\nimport * as path from \"path\"\nimport { AppInfo } from \"./appInfo\"\nimport { checkFileInArchive } from \"./asar/asarFileChecker\"\nimport { AsarPackager } from \"./asar/asarUtil\"\nimport { computeData } from \"./asar/integrity\"\nimport { copyFiles, FileMatcher, getFileMatchers, GetFileMatchersOptions, getMainFileMatchers, getNodeModuleFileMatcher } from \"./fileMatcher\"\nimport { createTransformer, isElectronCompileUsed } from \"./fileTransformer\"\nimport { Framework, isElectronBased } from \"./Framework\"\nimport { AfterPackContext, AsarOptions, CompressionLevel, Configuration, ElectronPlatformName, FileAssociation, Packager, PackagerOptions, Platform, PlatformSpecificBuildOptions, Target, TargetSpecificOptions } from \"./index\"\nimport { executeAppBuilderAsJson } from \"./util/appBuilder\"\nimport { computeFileSets, computeNodeModuleFileSets, copyAppFiles, ELECTRON_COMPILE_SHIM_FILENAME, transformFiles } from \"./util/appFileCopier\"\nimport { expandMacro as doExpandMacro } from \"./util/macroExpander\"\n\nexport abstract class PlatformPackager<DC extends PlatformSpecificBuildOptions> {\n  get packagerOptions(): PackagerOptions {\n    return this.info.options\n  }\n\n  get buildResourcesDir(): string {\n    return this.info.buildResourcesDir\n  }\n\n  get projectDir(): string {\n    return this.info.projectDir\n  }\n\n  get config(): Configuration {\n    return this.info.config\n  }\n\n  readonly platformSpecificBuildOptions: DC\n\n  get resourceList(): Promise<Array<string>> {\n    return this._resourceList.value\n  }\n\n  private readonly _resourceList = new Lazy<Array<string>>(() => orIfFileNotExist(readdir(this.info.buildResourcesDir), []))\n\n  readonly appInfo: AppInfo\n\n  protected constructor(readonly info: Packager, readonly platform: Platform) {\n    this.platformSpecificBuildOptions = PlatformPackager.normalizePlatformSpecificBuildOptions((this.config as any)[platform.buildConfigurationKey])\n    this.appInfo = this.prepareAppInfo(info.appInfo)\n  }\n\n  get compression(): CompressionLevel {\n    const compression = this.platformSpecificBuildOptions.compression\n    // explicitly set to null - request to use default value instead of parent (in the config)\n    if (compression === null) {\n      return \"normal\"\n    }\n    return compression || this.config.compression || \"normal\"\n  }\n\n  get debugLogger(): DebugLogger {\n    return this.info.debugLogger\n  }\n\n  abstract get defaultTarget(): Array<string>\n\n  protected prepareAppInfo(appInfo: AppInfo) {\n    return new AppInfo(this.info, null, this.platformSpecificBuildOptions)\n  }\n\n  private static normalizePlatformSpecificBuildOptions(options: any | null | undefined): any {\n    return options == null ? Object.create(null) : options\n  }\n\n  abstract createTargets(targets: Array<string>, mapper: (name: string, factory: (outDir: string) => Target) => void): void\n\n  protected getCscPassword(): string {\n    const password = this.doGetCscPassword()\n    if (isEmptyOrSpaces(password)) {\n      log.info({reason: \"CSC_KEY_PASSWORD is not defined\"}, \"empty password will be used for code signing\")\n      return \"\"\n    }\n    else {\n      return password!.trim()\n    }\n  }\n\n  protected getCscLink(extraEnvName?: string | null): string | null | undefined {\n    // allow to specify as empty string\n    const envValue = chooseNotNull(extraEnvName == null ? null : process.env[extraEnvName], process.env.CSC_LINK)\n    return chooseNotNull(chooseNotNull(this.info.config.cscLink, this.platformSpecificBuildOptions.cscLink), envValue)\n  }\n\n  protected doGetCscPassword(): string | null | undefined {\n    // allow to specify as empty string\n    return chooseNotNull(chooseNotNull(this.info.config.cscKeyPassword, this.platformSpecificBuildOptions.cscKeyPassword), process.env.CSC_KEY_PASSWORD)\n  }\n\n  protected computeAppOutDir(outDir: string, arch: Arch): string {\n    return this.packagerOptions.prepackaged || path.join(outDir, `${this.platform.buildConfigurationKey}${getArchSuffix(arch)}${this.platform === Platform.MAC ? \"\" : \"-unpacked\"}`)\n  }\n\n  dispatchArtifactCreated(file: string, target: Target | null, arch: Arch | null, safeArtifactName?: string | null): Promise<void> {\n    return this.info.callArtifactBuildCompleted({\n      file, safeArtifactName, target, arch,\n      packager: this,\n    })\n  }\n\n  async pack(outDir: string, arch: Arch, targets: Array<Target>, taskManager: AsyncTaskManager): Promise<any> {\n    const appOutDir = this.computeAppOutDir(outDir, arch)\n    await this.doPack(outDir, appOutDir, this.platform.nodeName as ElectronPlatformName, arch, this.platformSpecificBuildOptions, targets)\n    this.packageInDistributableFormat(appOutDir, arch, targets, taskManager)\n  }\n\n  protected packageInDistributableFormat(appOutDir: string, arch: Arch, targets: Array<Target>, taskManager: AsyncTaskManager): void {\n    if (targets.find(it => !it.isAsyncSupported) == null) {\n      PlatformPackager.buildAsyncTargets(targets, taskManager, appOutDir, arch)\n      return\n    }\n\n    taskManager.add(async () => {\n      // BluebirdPromise.map doesn't invoke target.build immediately, but for RemoteTarget it is very critical to call build() before finishBuild()\n      const subTaskManager = new AsyncTaskManager(this.info.cancellationToken)\n      PlatformPackager.buildAsyncTargets(targets, subTaskManager, appOutDir, arch)\n      await subTaskManager.awaitTasks()\n\n      for (const target of targets) {\n        if (!target.isAsyncSupported) {\n          await target.build(appOutDir, arch)\n        }\n      }\n    })\n  }\n\n  private static buildAsyncTargets(targets: Array<Target>, taskManager: AsyncTaskManager, appOutDir: string, arch: Arch) {\n    for (const target of targets) {\n      if (target.isAsyncSupported) {\n        taskManager.addTask(target.build(appOutDir, arch))\n      }\n    }\n  }\n\n  private getExtraFileMatchers(isResources: boolean, appOutDir: string, options: GetFileMatchersOptions): Array<FileMatcher> | null {\n    const base = isResources ? this.getResourcesDir(appOutDir) : (this.platform === Platform.MAC ? path.join(appOutDir, `${this.appInfo.productFilename}.app`, \"Contents\") : appOutDir)\n    return getFileMatchers(this.config, isResources ? \"extraResources\" : \"extraFiles\", base, options)\n  }\n\n  get electronDistExecutableName() {\n    return \"electron\"\n  }\n\n  get electronDistMacOsExecutableName() {\n    return \"Electron\"\n  }\n\n  createGetFileMatchersOptions(outDir: string, arch: Arch, customBuildOptions: PlatformSpecificBuildOptions): GetFileMatchersOptions {\n    return {\n      macroExpander: it => this.expandMacro(it, arch == null ? null : Arch[arch], {\"/*\": \"{,/**/*}\"}),\n      customBuildOptions,\n      globalOutDir: outDir,\n      defaultSrc: this.projectDir,\n    }\n  }\n\n  protected async doPack(outDir: string, appOutDir: string, platformName: ElectronPlatformName, arch: Arch, platformSpecificBuildOptions: DC, targets: Array<Target>) {\n    if (this.packagerOptions.prepackaged != null) {\n      return\n    }\n\n    const framework = this.info.framework\n    log.info({\n      platform: platformName,\n      arch: Arch[arch],\n      [`${framework.name}`]: framework.version,\n      appOutDir: log.filePath(appOutDir),\n    }, `packaging`)\n\n    await framework.prepareApplicationStageDirectory({\n      packager: this,\n      appOutDir,\n      platformName,\n      arch: Arch[arch],\n      version: framework.version,\n    })\n\n    const excludePatterns: Array<Minimatch> = []\n\n    const computeParsedPatterns = (patterns: Array<FileMatcher> | null) => {\n      if (patterns != null) {\n        for (const pattern of patterns) {\n          pattern.computeParsedPatterns(excludePatterns, this.info.projectDir)\n        }\n      }\n    }\n\n    const getFileMatchersOptions = this.createGetFileMatchersOptions(outDir, arch, platformSpecificBuildOptions)\n    const macroExpander = getFileMatchersOptions.macroExpander\n    const extraResourceMatchers = this.getExtraFileMatchers(true, appOutDir, getFileMatchersOptions)\n    computeParsedPatterns(extraResourceMatchers)\n    const extraFileMatchers = this.getExtraFileMatchers(false, appOutDir, getFileMatchersOptions)\n    computeParsedPatterns(extraFileMatchers)\n\n    const packContext: AfterPackContext = {\n      appOutDir, outDir, arch, targets,\n      packager: this,\n      electronPlatformName: platformName,\n    }\n\n    const asarOptions = await this.computeAsarOptions(platformSpecificBuildOptions)\n    const resourcesPath = this.platform === Platform.MAC ? path.join(appOutDir, framework.distMacOsAppName, \"Contents\", \"Resources\") : (isElectronBased(framework) ? path.join(appOutDir, \"resources\") : appOutDir)\n    const taskManager = new AsyncTaskManager(this.info.cancellationToken)\n    this.copyAppFiles(taskManager, asarOptions, resourcesPath, path.join(resourcesPath, \"app\"), packContext, platformSpecificBuildOptions, excludePatterns, macroExpander)\n    await taskManager.awaitTasks()\n\n    if (this.info.cancellationToken.cancelled) {\n      return\n    }\n\n    if (framework.beforeCopyExtraFiles != null) {\n      await framework.beforeCopyExtraFiles({\n        packager: this,\n        appOutDir,\n        asarIntegrity: asarOptions == null ? null : await computeData(resourcesPath, asarOptions.externalAllowed ? {externalAllowed: true} : null),\n        platformName,\n      })\n    }\n\n    if (this.info.cancellationToken.cancelled) {\n      return\n    }\n\n    const transformerForExtraFiles = this.createTransformerForExtraFiles(packContext)\n    await copyFiles(extraResourceMatchers, transformerForExtraFiles)\n    await copyFiles(extraFileMatchers, transformerForExtraFiles)\n\n    if (this.info.cancellationToken.cancelled) {\n      return\n    }\n\n    await this.info.afterPack(packContext)\n\n    if (framework.afterPack != null) {\n      await framework.afterPack(packContext)\n    }\n\n    const isAsar = asarOptions != null\n    await this.sanityCheckPackage(appOutDir, isAsar, framework)\n    await this.signApp(packContext, isAsar)\n\n    const afterSign = resolveFunction(this.config.afterSign, \"afterSign\")\n    if (afterSign != null) {\n      await Promise.resolve(afterSign(packContext))\n    }\n  }\n\n  protected createTransformerForExtraFiles(packContext: AfterPackContext): FileTransformer | null {\n    return null\n  }\n\n  private copyAppFiles(taskManager: AsyncTaskManager, asarOptions: AsarOptions | null, resourcePath: string, defaultDestination: string, packContext: AfterPackContext, platformSpecificBuildOptions: DC, excludePatterns: Array<Minimatch>, macroExpander: ((it: string) => string)) {\n    const appDir = this.info.appDir\n    const config = this.config\n    const isElectronCompile = asarOptions != null && isElectronCompileUsed(this.info)\n\n    const mainMatchers = getMainFileMatchers(appDir, defaultDestination, macroExpander, platformSpecificBuildOptions, this, packContext.outDir, isElectronCompile)\n    if (excludePatterns.length > 0) {\n      for (const matcher of mainMatchers) {\n        matcher.excludePatterns = excludePatterns\n      }\n    }\n\n    const framework = this.info.framework\n    const transformer = createTransformer(appDir, config, isElectronCompile ? {\n      originalMain: this.info.metadata.main,\n      main: ELECTRON_COMPILE_SHIM_FILENAME,\n      ...config.extraMetadata\n    } : config.extraMetadata, framework.createTransformer == null ? null : framework.createTransformer())\n\n    const _computeFileSets = (matchers: Array<FileMatcher>) => {\n      return computeFileSets(matchers, this.info.isPrepackedAppAsar ? null : transformer, this, isElectronCompile)\n        .then(async result => {\n          if (!this.info.isPrepackedAppAsar && !this.info.areNodeModulesHandledExternally) {\n            const moduleFileMatcher = getNodeModuleFileMatcher(appDir, defaultDestination, macroExpander, platformSpecificBuildOptions, this.info)\n            result = result.concat(await computeNodeModuleFileSets(this, moduleFileMatcher))\n          }\n          return result.filter(it => it.files.length > 0)\n        })\n    }\n\n    if (this.info.isPrepackedAppAsar) {\n      taskManager.addTask(BluebirdPromise.each(_computeFileSets([new FileMatcher(appDir, resourcePath, macroExpander)]), it => copyAppFiles(it, this.info, transformer)))\n    }\n    else if (asarOptions == null) {\n      // for ASAR all asar unpacked files will be extra transformed (e.g. sign of EXE and DLL) later,\n      // for prepackaged asar extra transformation not supported yet,\n      // so, extra transform if asar is disabled\n      const transformerForExtraFiles = this.createTransformerForExtraFiles(packContext)\n      const combinedTransformer: FileTransformer = file => {\n        if (transformerForExtraFiles != null) {\n          const result = transformerForExtraFiles(file)\n          if (result != null) {\n            return result\n          }\n        }\n        return transformer(file)\n      }\n\n      taskManager.addTask(BluebirdPromise.each(_computeFileSets(mainMatchers), it => copyAppFiles(it, this.info, combinedTransformer)))\n    }\n    else {\n      const unpackPattern = getFileMatchers(config, \"asarUnpack\", defaultDestination, {\n        macroExpander,\n        customBuildOptions: platformSpecificBuildOptions,\n        globalOutDir: packContext.outDir,\n        defaultSrc: appDir,\n      })\n      const fileMatcher = unpackPattern == null ? null : unpackPattern[0]\n      taskManager.addTask(_computeFileSets(mainMatchers)\n        .then(async fileSets => {\n          for (const fileSet of fileSets) {\n            await transformFiles(transformer, fileSet)\n          }\n\n          await new AsarPackager(appDir, resourcePath, asarOptions, fileMatcher == null ? null : fileMatcher.createFilter())\n            .pack(fileSets, this)\n        }))\n    }\n  }\n\n  protected signApp(packContext: AfterPackContext, isAsar: boolean): Promise<any> {\n    return Promise.resolve()\n  }\n\n  async getIconPath(): Promise<string | null> {\n    return null\n  }\n\n  private async computeAsarOptions(customBuildOptions: DC): Promise<AsarOptions | null> {\n    if (!isElectronBased(this.info.framework)) {\n      return null\n    }\n\n    function errorMessage(name: string) {\n      return `${name} is deprecated is deprecated and not supported â€” please use asarUnpack`\n    }\n\n    const buildMetadata = this.config as any\n    if (buildMetadata[\"asar-unpack\"] != null) {\n      throw new Error(errorMessage(\"asar-unpack\"))\n    }\n    if (buildMetadata[\"asar-unpack-dir\"] != null) {\n      throw new Error(errorMessage(\"asar-unpack-dir\"))\n    }\n\n    const platformSpecific = customBuildOptions.asar\n    const result = platformSpecific == null ? this.config.asar : platformSpecific\n    if (result === false) {\n      const appAsarStat = await statOrNull(path.join(this.info.appDir, \"app.asar\"))\n      //noinspection ES6MissingAwait\n      if (appAsarStat == null || !appAsarStat.isFile()) {\n        log.warn({\n          solution: \"enable asar and use asarUnpack to unpack files that must be externally available\",\n        }, \"asar using is disabled â€” it is strongly not recommended\")\n      }\n      return null\n    }\n\n    if (result == null || result === true) {\n      return {}\n    }\n\n    for (const name of [\"unpackDir\", \"unpack\"]) {\n      if ((result as any)[name] != null) {\n        throw new Error(errorMessage(`asar.${name}`))\n      }\n    }\n    return deepAssign({}, result)\n  }\n\n  public getElectronSrcDir(dist: string): string {\n    return path.resolve(this.projectDir, dist)\n  }\n\n  public getElectronDestinationDir(appOutDir: string): string {\n    return appOutDir\n  }\n\n  getResourcesDir(appOutDir: string): string {\n    if (this.platform === Platform.MAC) {\n      return this.getMacOsResourcesDir(appOutDir)\n    }\n    else if (isElectronBased(this.info.framework)) {\n      return path.join(appOutDir, \"resources\")\n    }\n    else {\n      return appOutDir\n    }\n  }\n\n  public getMacOsResourcesDir(appOutDir: string): string {\n    return path.join(appOutDir, `${this.appInfo.productFilename}.app`, \"Contents\", \"Resources\")\n  }\n\n  private async checkFileInPackage(resourcesDir: string, file: string, messagePrefix: string, isAsar: boolean) {\n    const relativeFile = path.relative(this.info.appDir, path.resolve(this.info.appDir, file))\n    if (isAsar) {\n      await checkFileInArchive(path.join(resourcesDir, \"app.asar\"), relativeFile, messagePrefix)\n      return\n    }\n\n    const pathParsed = path.parse(file)\n    // Even when packaging to asar is disabled, it does not imply that the main file can not be inside an .asar archive.\n    // This may occur when the packaging is done manually before processing with electron-builder.\n    if (pathParsed.dir.includes(\".asar\")) {\n      // The path needs to be split to the part with an asar archive which acts like a directory and the part with\n      // the path to main file itself. (e.g. path/arch.asar/dir/index.js -> path/arch.asar, dir/index.js)\n      // noinspection TypeScriptValidateJSTypes\n      const pathSplit: Array<string> = pathParsed.dir.split(path.sep)\n      let partWithAsarIndex = 0\n      pathSplit.some((pathPart: string, index: number) => {\n        partWithAsarIndex = index\n        return pathPart.endsWith(\".asar\")\n      })\n      const asarPath = path.join.apply(path, pathSplit.slice(0, partWithAsarIndex + 1))\n      let mainPath = pathSplit.length > (partWithAsarIndex + 1) ? path.join.apply(pathSplit.slice(partWithAsarIndex + 1)) : \"\"\n      mainPath += path.join(mainPath, pathParsed.base)\n      await checkFileInArchive(path.join(resourcesDir, \"app\", asarPath), mainPath, messagePrefix)\n    }\n    else {\n      const fullPath = path.join(resourcesDir, \"app\", relativeFile)\n      const outStat = await statOrNull(fullPath)\n      if (outStat == null) {\n        throw new Error(`${messagePrefix} \"${fullPath}\" does not exist. Seems like a wrong configuration.`)\n      }\n      else {\n        //noinspection ES6MissingAwait\n        if (!outStat.isFile()) {\n          throw new Error(`${messagePrefix} \"${fullPath}\" is not a file. Seems like a wrong configuration.`)\n        }\n      }\n    }\n  }\n\n  private async sanityCheckPackage(appOutDir: string, isAsar: boolean, framework: Framework): Promise<any> {\n    const outStat = await statOrNull(appOutDir)\n    if (outStat == null) {\n      throw new Error(`Output directory \"${appOutDir}\" does not exist. Seems like a wrong configuration.`)\n    }\n    else {\n      //noinspection ES6MissingAwait\n      if (!outStat.isDirectory()) {\n        throw new Error(`Output directory \"${appOutDir}\" is not a directory. Seems like a wrong configuration.`)\n      }\n    }\n\n    const resourcesDir = this.getResourcesDir(appOutDir)\n    const mainFile = (framework.getMainFile == null ? null : framework.getMainFile(this.platform)) || this.info.metadata.main || \"index.js\"\n    await this.checkFileInPackage(resourcesDir, mainFile, \"Application entry file\", isAsar)\n    await this.checkFileInPackage(resourcesDir, \"package.json\", \"Application\", isAsar)\n  }\n\n  // tslint:disable-next-line:no-invalid-template-strings\n  computeSafeArtifactName(suggestedName: string | null, ext: string, arch?: Arch | null, skipArchIfX64 = true, safePattern: string = \"${name}-${version}-${arch}.${ext}\"): string | null {\n    // GitHub only allows the listed characters in file names.\n    if (suggestedName != null && isSafeGithubName(suggestedName)) {\n      return null\n    }\n\n    return this.computeArtifactName(safePattern, ext, skipArchIfX64 && arch === Arch.x64 ? null : arch)\n  }\n\n  expandArtifactNamePattern(targetSpecificOptions: TargetSpecificOptions | null | undefined, ext: string, arch?: Arch | null, defaultPattern?: string, skipArchIfX64 = true): string {\n    let pattern = targetSpecificOptions == null ? null : targetSpecificOptions.artifactName\n    if (pattern == null) {\n      pattern = this.platformSpecificBuildOptions.artifactName || this.config.artifactName\n    }\n\n    if (pattern == null) {\n      // tslint:disable-next-line:no-invalid-template-strings\n      pattern = defaultPattern || \"${productName}-${version}-${arch}.${ext}\"\n    }\n    else {\n      // https://github.com/electron-userland/electron-builder/issues/3510\n      // always respect arch in user custom artifact pattern\n      skipArchIfX64 = false\n    }\n    return this.computeArtifactName(pattern, ext, skipArchIfX64 && arch === Arch.x64 ? null : arch)\n  }\n\n  expandArtifactBeautyNamePattern(targetSpecificOptions: TargetSpecificOptions | null | undefined, ext: string, arch?: Arch | null): string {\n    // tslint:disable-next-line:no-invalid-template-strings\n    return this.expandArtifactNamePattern(targetSpecificOptions, ext, arch, \"${productName} ${version} ${arch}.${ext}\", true)\n  }\n\n  private computeArtifactName(pattern: any, ext: string, arch: Arch | null | undefined) {\n    let archName: string | null = arch == null ? null : Arch[arch]\n    if (arch === Arch.x64) {\n      if (ext === \"AppImage\" || ext === \"rpm\") {\n        archName = \"x86_64\"\n      }\n      else if (ext === \"deb\" || ext === \"snap\") {\n        archName = \"amd64\"\n      }\n    }\n    else if (arch === Arch.ia32) {\n      if (ext === \"deb\" || ext === \"AppImage\" || ext === \"snap\") {\n        archName = \"i386\"\n      }\n      else if (ext === \"pacman\" || ext === \"rpm\") {\n        archName = \"i686\"\n      }\n    }\n\n    return this.expandMacro(pattern, this.platform === Platform.MAC ? null : archName, {\n      ext\n    })\n  }\n\n  expandMacro(pattern: string, arch?: string | null, extra: any = {}, isProductNameSanitized = true): string {\n    return doExpandMacro(pattern, arch, this.appInfo, {os: this.platform.buildConfigurationKey, ...extra}, isProductNameSanitized)\n  }\n\n  generateName2(ext: string | null, classifier: string | null | undefined, deployment: boolean): string {\n    const dotExt = ext == null ? \"\" : `.${ext}`\n    const separator = ext === \"deb\" ? \"_\" : \"-\"\n    return `${deployment ? this.appInfo.name : this.appInfo.productFilename}${separator}${this.appInfo.version}${classifier == null ? \"\" : `${separator}${classifier}`}${dotExt}`\n  }\n\n  getTempFile(suffix: string): Promise<string> {\n    return this.info.tempDirManager.getTempFile({suffix})\n  }\n\n  get fileAssociations(): Array<FileAssociation> {\n    return asArray(this.config.fileAssociations).concat(asArray(this.platformSpecificBuildOptions.fileAssociations))\n  }\n\n  async getResource(custom: string | null | undefined, ...names: Array<string>): Promise<string | null> {\n    const resourcesDir = this.info.buildResourcesDir\n    if (custom === undefined) {\n      const resourceList = await this.resourceList\n      for (const name of names) {\n        if (resourceList.includes(name)) {\n          return path.join(resourcesDir, name)\n        }\n      }\n    }\n    else if (custom != null && !isEmptyOrSpaces(custom)) {\n      const resourceList = await this.resourceList\n      if (resourceList.includes(custom)) {\n        return path.join(resourcesDir, custom)\n      }\n\n      let p = path.resolve(resourcesDir, custom)\n      if (await statOrNull(p) == null) {\n        p = path.resolve(this.projectDir, custom)\n        if (await statOrNull(p) == null) {\n          throw new InvalidConfigurationError(`cannot find specified resource \"${custom}\", nor relative to \"${resourcesDir}\", neither relative to project dir (\"${this.projectDir}\")`)\n        }\n      }\n      return p\n    }\n    return null\n  }\n\n  get forceCodeSigning(): boolean {\n    const forceCodeSigningPlatform = this.platformSpecificBuildOptions.forceCodeSigning\n    return (forceCodeSigningPlatform == null ? this.config.forceCodeSigning : forceCodeSigningPlatform) || false\n  }\n\n  protected async getOrConvertIcon(format: IconFormat): Promise<string | null> {\n    const result = await this.resolveIcon(asArray(this.platformSpecificBuildOptions.icon || this.config.icon), [], format)\n    if (result.length === 0) {\n      const framework = this.info.framework\n      if (framework.getDefaultIcon != null) {\n        return framework.getDefaultIcon(this.platform)\n      }\n\n      log.warn({reason: \"application icon is not set\"}, `default ${capitalizeFirstLetter(framework.name)} icon is used`)\n      return this.getDefaultFrameworkIcon()\n    }\n    else {\n      return result[0].file\n    }\n  }\n\n  getDefaultFrameworkIcon(): string | null {\n    const framework = this.info.framework\n    return framework.getDefaultIcon == null ? null : framework.getDefaultIcon(this.platform)\n  }\n\n  // convert if need, validate size (it is a reason why tool is called even if file has target extension (already specified as foo.icns for example))\n  async resolveIcon(sources: Array<string>, fallbackSources: Array<string>, outputFormat: IconFormat): Promise<Array<IconInfo>> {\n    const args = [\n      \"icon\",\n      \"--format\", outputFormat,\n      \"--root\", this.buildResourcesDir,\n      \"--root\", this.projectDir,\n      \"--out\", path.resolve(this.projectDir, this.config.directories!!.output!!, `.icon-${outputFormat}`),\n    ]\n    for (const source of sources) {\n      args.push(\"--input\", source)\n    }\n    for (const source of fallbackSources) {\n      args.push(\"--fallback-input\", source)\n    }\n\n    const result: IconConvertResult = await executeAppBuilderAsJson(args)\n    const errorMessage = result.error\n    if (errorMessage != null) {\n      throw new InvalidConfigurationError(errorMessage, result.errorCode)\n    }\n\n    if (result.isFallback) {\n      log.warn({reason: \"application icon is not set\"}, `default ${capitalizeFirstLetter(this.info.framework.name)} icon is used`)\n    }\n\n    return result.icons || []\n  }\n}\n\nexport interface IconInfo {\n  file: string\n  size: number\n}\n\ninterface IconConvertResult {\n  icons?: Array<IconInfo>\n\n  error?: string\n  errorCode?: string\n  isFallback?: boolean\n}\n\nexport type IconFormat = \"icns\" | \"ico\" | \"set\"\n\nexport function isSafeGithubName(name: string) {\n  return /^[0-9A-Za-z._-]+$/.test(name)\n}\n\n// remove leading dot\nexport function normalizeExt(ext: string) {\n  return ext.startsWith(\".\") ? ext.substring(1) : ext\n}\n\nexport function resolveFunction<T>(executor: T | string, name: string): T {\n  if (executor == null || typeof executor !== \"string\") {\n    return executor\n  }\n\n  let p = executor as string\n  if (p.startsWith(\".\")) {\n    p = path.resolve(p)\n  }\n\n  try {\n    p = require.resolve(p)\n  }\n  catch (e) {\n    debug(e)\n    p = path.resolve(p)\n  }\n\n  const m = require(p)\n  const namedExport = m[name]\n  if (namedExport == null) {\n    return m.default || m\n  }\n  else {\n    return namedExport\n  }\n}\n\nexport function chooseNotNull(v1: string | null | undefined, v2: string | null | undefined): string | null | undefined {\n  return v1 == null ? v2 : v1\n}\n\nfunction capitalizeFirstLetter(text: string) {\n  return text.charAt(0).toUpperCase() + text.slice(1)\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.WinPackager = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _isCi() {
  const data = _interopRequireDefault(require("is-ci"));

  _isCi = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _codesign() {
  const data = require("./codeSign/codesign");

  _codesign = function () {
    return data;
  };

  return data;
}

function _windowsCodeSign() {
  const data = require("./codeSign/windowsCodeSign");

  _windowsCodeSign = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("./core");

  _core = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("./platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _NsisTarget() {
  const data = require("./targets/nsis/NsisTarget");

  _NsisTarget = function () {
    return data;
  };

  return data;
}

function _nsisUtil() {
  const data = require("./targets/nsis/nsisUtil");

  _nsisUtil = function () {
    return data;
  };

  return data;
}

function _WebInstallerTarget() {
  const data = require("./targets/nsis/WebInstallerTarget");

  _WebInstallerTarget = function () {
    return data;
  };

  return data;
}

function _targetFactory() {
  const data = require("./targets/targetFactory");

  _targetFactory = function () {
    return data;
  };

  return data;
}

function _cacheManager() {
  const data = require("./util/cacheManager");

  _cacheManager = function () {
    return data;
  };

  return data;
}

function _flags() {
  const data = require("./util/flags");

  _flags = function () {
    return data;
  };

  return data;
}

function _timer() {
  const data = require("./util/timer");

  _timer = function () {
    return data;
  };

  return data;
}

function _vm() {
  const data = require("./vm/vm");

  _vm = function () {
    return data;
  };

  return data;
}

function _wine() {
  const data = require("./wine");

  _wine = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class WinPackager extends _platformPackager().PlatformPackager {
  constructor(info) {
    var _this;

    super(info, _core().Platform.WINDOWS);
    _this = this;
    this.cscInfo = new (_lazyVal().Lazy)(() => {
      const platformSpecificBuildOptions = this.platformSpecificBuildOptions;

      if (platformSpecificBuildOptions.certificateSubjectName != null || platformSpecificBuildOptions.certificateSha1 != null) {
        return this.vm.value.then(vm => (0, _windowsCodeSign().getCertificateFromStoreInfo)(platformSpecificBuildOptions, vm)).catch(e => {
          // https://github.com/electron-userland/electron-builder/pull/2397
          if (platformSpecificBuildOptions.sign == null) {
            throw e;
          } else {
            _builderUtil().log.debug({
              error: e
            }, "getCertificateFromStoreInfo error");

            return null;
          }
        });
      }

      const certificateFile = platformSpecificBuildOptions.certificateFile;

      if (certificateFile != null) {
        const certificatePassword = this.getCscPassword();
        return Promise.resolve({
          file: certificateFile,
          password: certificatePassword == null ? null : certificatePassword.trim()
        });
      }

      const cscLink = this.getCscLink("WIN_CSC_LINK");

      if (cscLink == null) {
        return Promise.resolve(null);
      }

      return (0, _codesign().downloadCertificate)(cscLink, this.info.tempDirManager, this.projectDir) // before then
      .catch(e => {
        if (e instanceof _builderUtil().InvalidConfigurationError) {
          throw new (_builderUtil().InvalidConfigurationError)(`Env WIN_CSC_LINK is not correct, cannot resolve: ${e.message}`);
        } else {
          throw e;
        }
      }).then(path => {
        return {
          file: path,
          password: this.getCscPassword()
        };
      });
    });
    this._iconPath = new (_lazyVal().Lazy)(() => this.getOrConvertIcon("ico"));
    this.vm = new (_lazyVal().Lazy)(() => process.platform === "win32" ? Promise.resolve(new (_vm().VmManager)()) : (0, _vm().getWindowsVm)(this.debugLogger));
    this.computedPublisherName = new (_lazyVal().Lazy)(
    /*#__PURE__*/
    (0, _bluebirdLst().coroutine)(function* () {
      const publisherName = _this.platformSpecificBuildOptions.publisherName;

      if (publisherName === null) {
        return null;
      } else if (publisherName != null) {
        return (0, _builderUtil().asArray)(publisherName);
      }

      const certInfo = yield _this.lazyCertInfo.value;
      return certInfo == null ? null : [certInfo.commonName];
    }));
    this.lazyCertInfo = new (_lazyVal().Lazy)(
    /*#__PURE__*/
    (0, _bluebirdLst().coroutine)(function* () {
      const cscInfo = yield _this.cscInfo.value;

      if (cscInfo == null) {
        return null;
      }

      if ("subject" in cscInfo) {
        const bloodyMicrosoftSubjectDn = cscInfo.subject;
        return {
          commonName: (0, _builderUtilRuntime().parseDn)(bloodyMicrosoftSubjectDn).get("CN"),
          bloodyMicrosoftSubjectDn
        };
      }

      const cscFile = cscInfo.file;

      if (cscFile == null) {
        return null;
      }

      return yield (0, _windowsCodeSign().getCertInfo)(cscFile, cscInfo.password || "");
    }));
  }

  get isForceCodeSigningVerification() {
    return this.platformSpecificBuildOptions.verifyUpdateCodeSignature !== false;
  }

  get defaultTarget() {
    return ["nsis"];
  }

  doGetCscPassword() {
    return (0, _platformPackager().chooseNotNull)((0, _platformPackager().chooseNotNull)(this.platformSpecificBuildOptions.certificatePassword, process.env.WIN_CSC_KEY_PASSWORD), super.doGetCscPassword());
  }

  createTargets(targets, mapper) {
    let copyElevateHelper;

    const getCopyElevateHelper = () => {
      if (copyElevateHelper == null) {
        copyElevateHelper = new (_nsisUtil().CopyElevateHelper)();
      }

      return copyElevateHelper;
    };

    let helper;

    const getHelper = () => {
      if (helper == null) {
        helper = new (_nsisUtil().AppPackageHelper)(getCopyElevateHelper());
      }

      return helper;
    };

    for (const name of targets) {
      if (name === _core().DIR_TARGET) {
        continue;
      }

      if (name === "nsis" || name === "portable") {
        mapper(name, outDir => new (_NsisTarget().NsisTarget)(this, outDir, name, getHelper()));
      } else if (name === "nsis-web") {
        // package file format differs from nsis target
        mapper(name, outDir => new (_WebInstallerTarget().WebInstallerTarget)(this, path.join(outDir, name), name, new (_nsisUtil().AppPackageHelper)(getCopyElevateHelper())));
      } else {
        const targetClass = (() => {
          switch (name) {
            case "squirrel":
              try {
                return require("electron-builder-squirrel-windows").default;
              } catch (e) {
                throw new (_builderUtil().InvalidConfigurationError)(`Module electron-builder-squirrel-windows must be installed in addition to build Squirrel.Windows: ${e.stack || e}`);
              }

            case "appx":
              return require("./targets/AppxTarget").default;

            case "msi":
              return require("./targets/MsiTarget").default;

            default:
              return null;
          }
        })();

        mapper(name, outDir => targetClass === null ? (0, _targetFactory().createCommonTarget)(name, outDir, this) : new targetClass(this, outDir, name));
      }
    }
  }

  getIconPath() {
    return this._iconPath.value;
  }

  sign(file, logMessagePrefix) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const signOptions = {
        path: file,
        name: _this2.appInfo.productName,
        site: yield _this2.appInfo.computePackageUrl(),
        options: _this2.platformSpecificBuildOptions
      };
      const cscInfo = yield _this2.cscInfo.value;

      if (cscInfo == null) {
        if (_this2.platformSpecificBuildOptions.sign != null) {
          yield (0, _windowsCodeSign().sign)(signOptions, _this2);
        } else if (_this2.forceCodeSigning) {
          throw new (_builderUtil().InvalidConfigurationError)(`App is not signed and "forceCodeSigning" is set to true, please ensure that code signing configuration is correct, please see https://electron.build/code-signing`);
        }

        return;
      }

      if (logMessagePrefix == null) {
        logMessagePrefix = "signing";
      }

      if ("file" in cscInfo) {
        _builderUtil().log.info({
          file: _builderUtil().log.filePath(file),
          certificateFile: cscInfo.file
        }, logMessagePrefix);
      } else {
        const info = cscInfo;

        _builderUtil().log.info({
          file: _builderUtil().log.filePath(file),
          subject: info.subject,
          thumbprint: info.thumbprint,
          store: info.store,
          user: info.isLocalMachineStore ? "local machine" : "current user"
        }, logMessagePrefix);
      }

      yield _this2.doSign(Object.assign({}, signOptions, {
        cscInfo,
        options: Object.assign({}, _this2.platformSpecificBuildOptions)
      }));
    })();
  }

  doSign(options) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      for (let i = 0; i < 3; i++) {
        try {
          yield (0, _windowsCodeSign().sign)(options, _this3);
          break;
        } catch (e) {
          // https://github.com/electron-userland/electron-builder/issues/1414
          const message = e.message;

          if (message != null && message.includes("Couldn't resolve host name")) {
            _builderUtil().log.warn({
              error: message,
              attempt: i + 1
            }, `cannot sign`);

            continue;
          }

          throw e;
        }
      }
    })();
  }

  signAndEditResources(file, arch, outDir, internalName, requestedExecutionLevel) {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appInfo = _this4.appInfo;
      const files = [];
      const args = [file, "--set-version-string", "FileDescription", appInfo.productName, "--set-version-string", "ProductName", appInfo.productName, "--set-version-string", "LegalCopyright", appInfo.copyright, "--set-file-version", appInfo.buildVersion, "--set-product-version", appInfo.getVersionInWeirdWindowsForm()];

      if (internalName != null) {
        args.push("--set-version-string", "InternalName", internalName, "--set-version-string", "OriginalFilename", "");
      }

      if (requestedExecutionLevel != null && requestedExecutionLevel !== "asInvoker") {
        args.push("--set-requested-execution-level", requestedExecutionLevel);
      }

      (0, _builderUtil().use)(appInfo.companyName, it => args.push("--set-version-string", "CompanyName", it));
      (0, _builderUtil().use)(_this4.platformSpecificBuildOptions.legalTrademarks, it => args.push("--set-version-string", "LegalTrademarks", it));
      const iconPath = yield _this4.getIconPath();
      (0, _builderUtil().use)(iconPath, it => {
        files.push(it);
        args.push("--set-icon", it);
      });
      const config = _this4.config;
      const cscInfoForCacheDigest = !(0, _flags().isBuildCacheEnabled)() || _isCi().default || config.electronDist != null ? null : yield _this4.cscInfo.value;
      let buildCacheManager = null; // resources editing doesn't change executable for the same input and executed quickly - no need to complicate

      if (cscInfoForCacheDigest != null) {
        const cscFile = cscInfoForCacheDigest.file;

        if (cscFile != null) {
          files.push(cscFile);
        }

        const timer = (0, _timer().time)("executable cache");
        const hash = (0, _crypto().createHash)("sha512");
        hash.update(config.electronVersion || "no electronVersion");
        hash.update(JSON.stringify(_this4.platformSpecificBuildOptions));
        hash.update(JSON.stringify(args));
        hash.update(_this4.platformSpecificBuildOptions.certificateSha1 || "no certificateSha1");
        hash.update(_this4.platformSpecificBuildOptions.certificateSubjectName || "no subjectName");
        buildCacheManager = new (_cacheManager().BuildCacheManager)(outDir, file, arch);

        if (yield buildCacheManager.copyIfValid((yield (0, _cacheManager().digest)(hash, files)))) {
          timer.end();
          return;
        }

        timer.end();
      }

      const timer = (0, _timer().time)("wine&sign"); // rcedit crashed of executed using wine, resourcehacker works

      if (process.platform === "win32" || _this4.info.framework.name === "electron") {
        const vendorPath = yield (0, _windowsCodeSign().getSignVendorPath)();
        yield (0, _wine().execWine)(path.join(vendorPath, "rcedit-ia32.exe"), path.join(vendorPath, "rcedit-x64.exe"), args);
      }

      yield _this4.sign(file);
      timer.end();

      if (buildCacheManager != null) {
        yield buildCacheManager.save();
      }
    })();
  }

  isSignDlls() {
    return this.platformSpecificBuildOptions.signDlls === true;
  }

  createTransformerForExtraFiles(packContext) {
    if (this.platformSpecificBuildOptions.signAndEditExecutable === false) {
      return null;
    }

    return file => {
      if (file.endsWith(".exe") || this.isSignDlls() && file.endsWith(".dll")) {
        const parentDir = path.dirname(file);

        if (parentDir !== packContext.appOutDir) {
          return new (_fs().CopyFileTransformer)(file => this.sign(file));
        }
      }

      return null;
    };
  }

  signApp(packContext, isAsar) {
    var _this5 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const exeFileName = `${_this5.appInfo.productFilename}.exe`;

      if (_this5.platformSpecificBuildOptions.signAndEditExecutable === false) {
        return;
      }

      yield _bluebirdLst().default.map((0, _fsExtraP().readdir)(packContext.appOutDir), file => {
        if (file === exeFileName) {
          return _this5.signAndEditResources(path.join(packContext.appOutDir, exeFileName), packContext.arch, packContext.outDir, path.basename(exeFileName, ".exe"), _this5.platformSpecificBuildOptions.requestedExecutionLevel);
        } else if (file.endsWith(".exe") || _this5.isSignDlls() && file.endsWith(".dll")) {
          return _this5.sign(path.join(packContext.appOutDir, file));
        }

        return null;
      });

      if (!isAsar) {
        return;
      }

      const outResourcesDir = path.join(packContext.appOutDir, "resources", "app.asar.unpacked");
      yield _bluebirdLst().default.map((0, _promise().orIfFileNotExist)((0, _fsExtraP().readdir)(outResourcesDir), []), file => {
        if (file.endsWith(".exe") || file.endsWith(".dll")) {
          return _this5.sign(path.join(outResourcesDir, file));
        } else {
          return null;
        }
      });
    })();
  }

} exports.WinPackager = WinPackager;
// __ts-babel@6.0.4
//# sourceMappingURL=winPackager.js.map{"version":3,"sources":["../src/winPackager.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, asArray, InvalidConfigurationError, log, use } from \"builder-util\"\nimport { parseDn } from \"builder-util-runtime\"\nimport { CopyFileTransformer, FileTransformer } from \"builder-util/out/fs\"\nimport { orIfFileNotExist } from \"builder-util/out/promise\"\nimport { createHash } from \"crypto\"\nimport { readdir } from \"fs-extra-p\"\nimport isCI from \"is-ci\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { downloadCertificate } from \"./codeSign/codesign\"\nimport { CertificateFromStoreInfo, CertificateInfo, FileCodeSigningInfo, getCertificateFromStoreInfo, getCertInfo, getSignVendorPath, sign, WindowsSignOptions } from \"./codeSign/windowsCodeSign\"\nimport { AfterPackContext } from \"./configuration\"\nimport { DIR_TARGET, Platform, Target } from \"./core\"\nimport { RequestedExecutionLevel, WindowsConfiguration } from \"./options/winOptions\"\nimport { Packager } from \"./packager\"\nimport { chooseNotNull, PlatformPackager } from \"./platformPackager\"\nimport AppXTarget from \"./targets/AppxTarget\"\nimport { NsisTarget } from \"./targets/nsis/NsisTarget\"\nimport { AppPackageHelper, CopyElevateHelper } from \"./targets/nsis/nsisUtil\"\nimport { WebInstallerTarget } from \"./targets/nsis/WebInstallerTarget\"\nimport { createCommonTarget } from \"./targets/targetFactory\"\nimport { BuildCacheManager, digest } from \"./util/cacheManager\"\nimport { isBuildCacheEnabled } from \"./util/flags\"\nimport { time } from \"./util/timer\"\nimport { getWindowsVm, VmManager } from \"./vm/vm\"\nimport { execWine } from \"./wine\"\n\nexport class WinPackager extends PlatformPackager<WindowsConfiguration> {\n  readonly cscInfo = new Lazy<FileCodeSigningInfo | CertificateFromStoreInfo | null>(() => {\n    const platformSpecificBuildOptions = this.platformSpecificBuildOptions\n    if (platformSpecificBuildOptions.certificateSubjectName != null || platformSpecificBuildOptions.certificateSha1 != null) {\n      return this.vm.value\n        .then(vm => getCertificateFromStoreInfo(platformSpecificBuildOptions, vm))\n        .catch(e => {\n          // https://github.com/electron-userland/electron-builder/pull/2397\n          if (platformSpecificBuildOptions.sign == null) {\n            throw e\n          }\n          else {\n            log.debug({error: e}, \"getCertificateFromStoreInfo error\")\n            return null\n          }\n        })\n    }\n\n    const certificateFile = platformSpecificBuildOptions.certificateFile\n    if (certificateFile != null) {\n      const certificatePassword = this.getCscPassword()\n      return Promise.resolve({\n        file: certificateFile,\n        password: certificatePassword == null ? null : certificatePassword.trim(),\n      })\n    }\n\n    const cscLink = this.getCscLink(\"WIN_CSC_LINK\")\n    if (cscLink == null) {\n      return Promise.resolve(null)\n    }\n\n    return downloadCertificate(cscLink, this.info.tempDirManager, this.projectDir)\n      // before then\n      .catch(e => {\n        if (e instanceof InvalidConfigurationError) {\n          throw new InvalidConfigurationError(`Env WIN_CSC_LINK is not correct, cannot resolve: ${e.message}`)\n        }\n        else {\n          throw e\n        }\n      })\n      .then(path => {\n        return {\n          file: path!!,\n          password: this.getCscPassword(),\n        }\n      })\n  })\n\n  private _iconPath = new Lazy(() => this.getOrConvertIcon(\"ico\"))\n\n  readonly vm = new Lazy<VmManager>(() => process.platform === \"win32\" ? Promise.resolve(new VmManager()) : getWindowsVm(this.debugLogger))\n\n  readonly computedPublisherName = new Lazy<Array<string> | null>(async () => {\n    const publisherName = (this.platformSpecificBuildOptions as WindowsConfiguration).publisherName\n    if (publisherName === null) {\n      return null\n    }\n    else if (publisherName != null) {\n      return asArray(publisherName)\n    }\n\n    const certInfo = await this.lazyCertInfo.value\n    return certInfo == null ? null : [certInfo.commonName]\n  })\n\n  readonly lazyCertInfo = new Lazy<CertificateInfo | null>(async () => {\n    const cscInfo = await this.cscInfo.value\n    if (cscInfo == null) {\n      return null\n    }\n\n    if (\"subject\" in cscInfo) {\n      const bloodyMicrosoftSubjectDn = (cscInfo as CertificateFromStoreInfo).subject\n      return {\n        commonName: parseDn(bloodyMicrosoftSubjectDn).get(\"CN\")!!,\n        bloodyMicrosoftSubjectDn,\n      }\n    }\n\n    const cscFile = (cscInfo as FileCodeSigningInfo).file\n    if (cscFile == null) {\n      return null\n    }\n    return await getCertInfo(cscFile, (cscInfo as FileCodeSigningInfo).password || \"\")\n  })\n\n  get isForceCodeSigningVerification(): boolean {\n    return this.platformSpecificBuildOptions.verifyUpdateCodeSignature !== false\n  }\n\n  constructor(info: Packager) {\n    super(info, Platform.WINDOWS)\n  }\n\n  get defaultTarget(): Array<string> {\n    return [\"nsis\"]\n  }\n\n  protected doGetCscPassword(): string | undefined | null {\n    return chooseNotNull(chooseNotNull(this.platformSpecificBuildOptions.certificatePassword, process.env.WIN_CSC_KEY_PASSWORD), super.doGetCscPassword())\n  }\n\n  createTargets(targets: Array<string>, mapper: (name: string, factory: (outDir: string) => Target) => void): void {\n    let copyElevateHelper: CopyElevateHelper | null\n    const getCopyElevateHelper = () => {\n      if (copyElevateHelper == null) {\n        copyElevateHelper = new CopyElevateHelper()\n      }\n      return copyElevateHelper\n    }\n\n    let helper: AppPackageHelper | null\n    const getHelper = () => {\n      if (helper == null) {\n        helper = new AppPackageHelper(getCopyElevateHelper())\n      }\n      return helper\n    }\n\n    for (const name of targets) {\n      if (name === DIR_TARGET) {\n        continue\n      }\n\n      if (name === \"nsis\" || name === \"portable\") {\n        mapper(name, outDir => new NsisTarget(this, outDir, name, getHelper()))\n      }\n      else if (name === \"nsis-web\") {\n        // package file format differs from nsis target\n        mapper(name, outDir => new WebInstallerTarget(this, path.join(outDir, name), name, new AppPackageHelper(getCopyElevateHelper())))\n      }\n      else {\n        const targetClass: typeof NsisTarget | typeof AppXTarget | null = (() => {\n          switch (name) {\n            case \"squirrel\":\n              try {\n                return require(\"electron-builder-squirrel-windows\").default\n              }\n              catch (e) {\n                throw new InvalidConfigurationError(`Module electron-builder-squirrel-windows must be installed in addition to build Squirrel.Windows: ${e.stack || e}`)\n              }\n\n            case \"appx\":\n              return require(\"./targets/AppxTarget\").default\n\n            case \"msi\":\n              return require(\"./targets/MsiTarget\").default\n\n            default:\n              return null\n          }\n        })()\n\n        mapper(name, outDir => targetClass === null ? createCommonTarget(name, outDir, this) : new (targetClass as any)(this, outDir, name))\n      }\n    }\n  }\n\n  getIconPath() {\n    return this._iconPath.value\n  }\n\n  async sign(file: string, logMessagePrefix?: string): Promise<void> {\n    const signOptions: WindowsSignOptions = {\n      path: file,\n      name: this.appInfo.productName,\n      site: await this.appInfo.computePackageUrl(),\n      options: this.platformSpecificBuildOptions,\n    }\n\n    const cscInfo = await this.cscInfo.value\n    if (cscInfo == null) {\n      if (this.platformSpecificBuildOptions.sign != null) {\n        await sign(signOptions, this)\n      }\n      else if (this.forceCodeSigning) {\n        throw new InvalidConfigurationError(`App is not signed and \"forceCodeSigning\" is set to true, please ensure that code signing configuration is correct, please see https://electron.build/code-signing`)\n      }\n      return\n    }\n\n    if (logMessagePrefix == null) {\n      logMessagePrefix = \"signing\"\n    }\n\n    if (\"file\" in cscInfo) {\n      log.info({\n        file: log.filePath(file),\n        certificateFile: (cscInfo as FileCodeSigningInfo).file,\n      }, logMessagePrefix)\n    }\n    else {\n      const info = cscInfo as CertificateFromStoreInfo\n      log.info({\n        file: log.filePath(file),\n        subject: info.subject,\n        thumbprint: info.thumbprint,\n        store: info.store,\n        user: info.isLocalMachineStore ? \"local machine\" : \"current user\",\n      }, logMessagePrefix)\n    }\n\n    await this.doSign({\n      ...signOptions,\n      cscInfo,\n      options: {\n        ...this.platformSpecificBuildOptions,\n      },\n    })\n  }\n\n  private async doSign(options: WindowsSignOptions) {\n    for (let i = 0; i < 3; i++) {\n      try {\n        await sign(options, this)\n        break\n      }\n      catch (e) {\n        // https://github.com/electron-userland/electron-builder/issues/1414\n        const message = e.message\n        if (message != null && message.includes(\"Couldn't resolve host name\")) {\n          log.warn({error: message, attempt: i + 1}, `cannot sign`)\n          continue\n        }\n        throw e\n      }\n    }\n  }\n\n  async signAndEditResources(file: string, arch: Arch, outDir: string, internalName?: string | null, requestedExecutionLevel?: RequestedExecutionLevel | null) {\n    const appInfo = this.appInfo\n\n    const files: Array<string> = []\n\n    const args = [\n      file,\n      \"--set-version-string\", \"FileDescription\", appInfo.productName,\n      \"--set-version-string\", \"ProductName\", appInfo.productName,\n      \"--set-version-string\", \"LegalCopyright\", appInfo.copyright,\n      \"--set-file-version\", appInfo.buildVersion,\n      \"--set-product-version\", appInfo.getVersionInWeirdWindowsForm(),\n    ]\n\n    if (internalName != null) {\n      args.push(\n        \"--set-version-string\", \"InternalName\", internalName,\n        \"--set-version-string\", \"OriginalFilename\", \"\",\n      )\n    }\n\n    if (requestedExecutionLevel != null && requestedExecutionLevel !== \"asInvoker\") {\n      args.push(\"--set-requested-execution-level\", requestedExecutionLevel)\n    }\n\n    use(appInfo.companyName, it => args.push(\"--set-version-string\", \"CompanyName\", it!))\n    use(this.platformSpecificBuildOptions.legalTrademarks, it => args.push(\"--set-version-string\", \"LegalTrademarks\", it!))\n    const iconPath = await this.getIconPath()\n    use(iconPath, it => {\n      files.push(it)\n      args.push(\"--set-icon\", it)\n    })\n\n    const config = this.config\n    const cscInfoForCacheDigest = !isBuildCacheEnabled() || isCI || config.electronDist != null ? null : await this.cscInfo.value\n    let buildCacheManager: BuildCacheManager | null = null\n    // resources editing doesn't change executable for the same input and executed quickly - no need to complicate\n    if (cscInfoForCacheDigest != null) {\n      const cscFile = (cscInfoForCacheDigest as FileCodeSigningInfo).file\n      if (cscFile != null) {\n        files.push(cscFile)\n      }\n\n      const timer = time(\"executable cache\")\n      const hash = createHash(\"sha512\")\n      hash.update(config.electronVersion || \"no electronVersion\")\n      hash.update(JSON.stringify(this.platformSpecificBuildOptions))\n      hash.update(JSON.stringify(args))\n      hash.update(this.platformSpecificBuildOptions.certificateSha1 || \"no certificateSha1\")\n      hash.update(this.platformSpecificBuildOptions.certificateSubjectName || \"no subjectName\")\n\n      buildCacheManager = new BuildCacheManager(outDir, file, arch)\n      if (await buildCacheManager.copyIfValid(await digest(hash, files))) {\n        timer.end()\n        return\n      }\n      timer.end()\n    }\n\n    const timer = time(\"wine&sign\")\n    // rcedit crashed of executed using wine, resourcehacker works\n    if (process.platform === \"win32\" || this.info.framework.name === \"electron\") {\n      const vendorPath = await getSignVendorPath()\n      await execWine(path.join(vendorPath, \"rcedit-ia32.exe\"), path.join(vendorPath, \"rcedit-x64.exe\"), args)\n    }\n\n    await this.sign(file)\n    timer.end()\n\n    if (buildCacheManager != null) {\n      await buildCacheManager.save()\n    }\n  }\n\n  private isSignDlls(): boolean {\n    return this.platformSpecificBuildOptions.signDlls === true\n  }\n\n  protected createTransformerForExtraFiles(packContext: AfterPackContext): FileTransformer | null {\n    if (this.platformSpecificBuildOptions.signAndEditExecutable === false) {\n      return null\n    }\n\n    return file => {\n      if (file.endsWith(\".exe\") || (this.isSignDlls() && file.endsWith(\".dll\"))) {\n        const parentDir = path.dirname(file)\n        if (parentDir !== packContext.appOutDir) {\n          return new CopyFileTransformer(file => this.sign(file))\n        }\n      }\n      return null\n    }\n  }\n\n  protected async signApp(packContext: AfterPackContext, isAsar: boolean): Promise<any> {\n    const exeFileName = `${this.appInfo.productFilename}.exe`\n    if (this.platformSpecificBuildOptions.signAndEditExecutable === false) {\n      return\n    }\n\n    await BluebirdPromise.map(readdir(packContext.appOutDir), (file: string): any => {\n      if (file === exeFileName) {\n        return this.signAndEditResources(path.join(packContext.appOutDir, exeFileName), packContext.arch, packContext.outDir, path.basename(exeFileName, \".exe\"), this.platformSpecificBuildOptions.requestedExecutionLevel)\n      }\n      else if (file.endsWith(\".exe\") || (this.isSignDlls() && file.endsWith(\".dll\"))) {\n        return this.sign(path.join(packContext.appOutDir, file))\n      }\n      return null\n    })\n\n    if (!isAsar) {\n      return\n    }\n\n    const outResourcesDir = path.join(packContext.appOutDir, \"resources\", \"app.asar.unpacked\")\n    await BluebirdPromise.map(orIfFileNotExist(readdir(outResourcesDir), []), (file: string): any => {\n      if (file.endsWith(\".exe\") || file.endsWith(\".dll\")) {\n        return this.sign(path.join(outResourcesDir, file))\n      }\n      else {\n        return null\n      }\n    })\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.execWine = execWine;
exports.prepareWindowsExecutableArgs = prepareWindowsExecutableArgs;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

/** @private */
function execWine(file, file64 = null, appArgs = [], options = {}) {
  if (process.platform === "win32") {
    if (options.timeout == null) {
      // 2 minutes
      options.timeout = 120 * 1000;
    }

    return (0, _builderUtil().exec)(file, appArgs, options);
  }

  const commandArgs = ["wine", "--ia32", file];

  if (file64 != null) {
    commandArgs.push("--x64", file64);
  }

  if (appArgs.length > 0) {
    commandArgs.push("--args", JSON.stringify(appArgs));
  }

  return (0, _builderUtil().executeAppBuilder)(commandArgs, undefined, options);
}
/** @private */


function prepareWindowsExecutableArgs(args, exePath) {
  if (process.platform !== "win32") {
    args.unshift(exePath);
  }

  return args;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=wine.js.map{"version":3,"sources":["../src/wine.ts"],"names":[],"mappings":";;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AACM,SAAU,QAAV,CAAmB,IAAnB,EAAiC,MAAA,GAAwB,IAAzD,EAA+D,OAAA,GAAyB,EAAxF,EAA4F,OAAA,GAA2B,EAAvH,EAAyH;AAC7H,MAAI,OAAO,CAAC,QAAR,KAAqB,OAAzB,EAAkC;AAChC,QAAI,OAAO,CAAC,OAAR,IAAmB,IAAvB,EAA6B;AAC3B;AACA,MAAA,OAAO,CAAC,OAAR,GAAkB,MAAM,IAAxB;AACD;;AACD,WAAO,yBAAK,IAAL,EAAW,OAAX,EAAoB,OAApB,CAAP;AACD;;AAED,QAAM,WAAW,GAAG,CAClB,MADkB,EAElB,QAFkB,EAER,IAFQ,CAApB;;AAIA,MAAI,MAAM,IAAI,IAAd,EAAoB;AAClB,IAAA,WAAW,CAAC,IAAZ,CAAiB,OAAjB,EAA0B,MAA1B;AACD;;AACD,MAAI,OAAO,CAAC,MAAR,GAAiB,CAArB,EAAwB;AACtB,IAAA,WAAW,CAAC,IAAZ,CAAiB,QAAjB,EAA2B,IAAI,CAAC,SAAL,CAAe,OAAf,CAA3B;AACD;;AACD,SAAO,sCAAkB,WAAlB,EAA+B,SAA/B,EAA0C,OAA1C,CAAP;AACD;AAED;;;AACM,SAAU,4BAAV,CAAuC,IAAvC,EAA4D,OAA5D,EAA2E;AAC/E,MAAI,OAAO,CAAC,QAAR,KAAqB,OAAzB,EAAkC;AAChC,IAAA,IAAI,CAAC,OAAL,CAAa,OAAb;AACD;;AACD,SAAO,IAAP;AACD,C","sourcesContent":["import { ExecFileOptions } from \"child_process\"\nimport { exec, executeAppBuilder } from \"builder-util\"\n\n/** @private */\nexport function execWine(file: string, file64: string | null = null, appArgs: Array<string> = [], options: ExecFileOptions = {}): Promise<string> {\n  if (process.platform === \"win32\") {\n    if (options.timeout == null) {\n      // 2 minutes\n      options.timeout = 120 * 1000\n    }\n    return exec(file, appArgs, options)\n  }\n\n  const commandArgs = [\n    \"wine\",\n    \"--ia32\", file,\n  ]\n  if (file64 != null) {\n    commandArgs.push(\"--x64\", file64)\n  }\n  if (appArgs.length > 0) {\n    commandArgs.push(\"--args\", JSON.stringify(appArgs))\n  }\n  return executeAppBuilder(commandArgs, undefined, options)\n}\n\n/** @private */\nexport function prepareWindowsExecutableArgs(args: Array<string>, exePath: string) {\n  if (process.platform !== \"win32\") {\n    args.unshift(exePath)\n  }\n  return args\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MonoVmManager = void 0;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _vm() {
  const data = require("./vm");

  _vm = function () {
    return data;
  };

  return data;
}

class MonoVmManager extends _vm().VmManager {
  constructor() {
    super();
  }

  exec(file, args, options, isLogOutIfDebug = true) {
    return (0, _builderUtil().exec)("mono", [file].concat(args), Object.assign({}, options), isLogOutIfDebug);
  }

  spawn(file, args, options, extraOptions) {
    return (0, _builderUtil().spawn)("mono", [file].concat(args), options, extraOptions);
  }

} exports.MonoVmManager = MonoVmManager;
// __ts-babel@6.0.4
//# sourceMappingURL=MonoVm.js.map{"version":3,"sources":["../../src/vm/MonoVm.ts"],"names":[],"mappings":";;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEM,MAAO,aAAP,SAA6B,eAA7B,CAAsC;AAC1C,EAAA,WAAA,GAAA;AACE;AACD;;AAED,EAAA,IAAI,CAAC,IAAD,EAAe,IAAf,EAAoC,OAApC,EAA+D,eAAe,GAAG,IAAjF,EAAqF;AACvF,WAAO,yBAAK,MAAL,EAAa,CAAC,IAAD,EAAO,MAAP,CAAc,IAAd,CAAb,EAAgC,MAAA,CAAA,MAAA,CAAA,EAAA,EAClC,OADkC,CAAhC,EAEJ,eAFI,CAAP;AAGD;;AAED,EAAA,KAAK,CAAC,IAAD,EAAe,IAAf,EAAoC,OAApC,EAA4D,YAA5D,EAA4F;AAC/F,WAAO,0BAAM,MAAN,EAAc,CAAC,IAAD,EAAO,MAAP,CAAc,IAAd,CAAd,EAAmC,OAAnC,EAA4C,YAA5C,CAAP;AACD;;AAbyC,C","sourcesContent":["import { SpawnOptions, ExecFileOptions } from \"child_process\"\nimport { exec, ExtraSpawnOptions, spawn } from \"builder-util\"\nimport { VmManager } from \"./vm\"\n\nexport class MonoVmManager extends VmManager {\n  constructor() {\n    super()\n  }\n\n  exec(file: string, args: Array<string>, options?: ExecFileOptions, isLogOutIfDebug = true): Promise<string> {\n    return exec(\"mono\", [file].concat(args), {\n      ...options,\n    }, isLogOutIfDebug)\n  }\n\n  spawn(file: string, args: Array<string>, options?: SpawnOptions, extraOptions?: ExtraSpawnOptions): Promise<any> {\n    return spawn(\"mono\", [file].concat(args), options, extraOptions)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.parseVmList = parseVmList;
exports.macPathToParallelsWindows = macPathToParallelsWindows;
exports.ParallelsVmManager = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _child_process() {
  const data = require("child_process");

  _child_process = function () {
    return data;
  };

  return data;
}

function _vm() {
  const data = require("./vm");

  _vm = function () {
    return data;
  };

  return data;
}

/** @internal */
function parseVmList(_x) {
  return _parseVmList.apply(this, arguments);
}
/** @internal */


function _parseVmList() {
  _parseVmList = (0, _bluebirdLst().coroutine)(function* (debugLogger) {
    // do not log output if debug - it is huge, logged using debugLogger
    let rawList = yield (0, _builderUtil().exec)("prlctl", ["list", "-i", "-s", "name"], undefined, false);
    debugLogger.add("parallels.list", rawList);
    rawList = rawList.substring(rawList.indexOf("ID:")); // let match: Array<string> | null

    const result = [];

    for (const info of rawList.split("\n\n").map(it => it.trim()).filter(it => it.length > 0)) {
      const vm = {};

      for (const line of info.split("\n")) {
        const meta = /^([^:("]+): (.*)$/.exec(line);

        if (meta == null) {
          continue;
        }

        const key = meta[1].toLowerCase();

        if (key === "id" || key === "os" || key === "name" || key === "state" || key === "name") {
          vm[key] = meta[2].trim();
        }
      }

      result.push(vm);
    }

    return result;
  });
  return _parseVmList.apply(this, arguments);
}

class ParallelsVmManager extends _vm().VmManager {
  constructor(vm) {
    super();
    this.vm = vm;
    this.isExitHookAdded = false;
    this.startPromise = this.doStartVm();
  }

  get pathSep() {
    return "/";
  }

  handleExecuteError(error) {
    if (error.message.includes("Unable to open new session in this virtual machine")) {
      throw new Error(`Please ensure that your are logged in "${this.vm.name}" parallels virtual machine. In the future please do not stop VM, but suspend.\n\n${error.message}`);
    }

    _builderUtil().log.warn("ensure that 'Share folders' is set to 'All Disks', see https://goo.gl/E6XphP");

    throw error;
  }

  exec(file, args, options) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield _this.ensureThatVmStarted(); // it is important to use "--current-user" to execute command under logged in user - to access certs.

      return yield (0, _builderUtil().exec)("prlctl", ["exec", _this.vm.id, "--current-user", file.startsWith("/") ? macPathToParallelsWindows(file) : file].concat(args), options).catch(error => _this.handleExecuteError(error));
    })();
  }

  spawn(file, args, options, extraOptions) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield _this2.ensureThatVmStarted();
      return yield (0, _builderUtil().spawn)("prlctl", ["exec", _this2.vm.id, file].concat(args), options, extraOptions).catch(error => _this2.handleExecuteError(error));
    })();
  }

  doStartVm() {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const vmId = _this3.vm.id;
      const state = _this3.vm.state;

      if (state === "running") {
        return;
      }

      if (!_this3.isExitHookAdded) {
        _this3.isExitHookAdded = true;

        require("async-exit-hook")(callback => {
          const stopArgs = ["suspend", vmId];

          if (callback == null) {
            (0, _child_process().execFileSync)("prlctl", stopArgs);
          } else {
            (0, _builderUtil().exec)("prlctl", stopArgs).then(callback).catch(callback);
          }
        });
      }

      yield (0, _builderUtil().exec)("prlctl", ["start", vmId]);
    })();
  }

  ensureThatVmStarted() {
    let startPromise = this.startPromise;

    if (startPromise == null) {
      startPromise = this.doStartVm();
      this.startPromise = startPromise;
    }

    return startPromise;
  }

  toVmFile(file) {
    // https://stackoverflow.com/questions/4742992/cannot-access-network-drive-in-powershell-running-as-administrator
    return macPathToParallelsWindows(file);
  }

}

exports.ParallelsVmManager = ParallelsVmManager;

function macPathToParallelsWindows(file) {
  if (file.startsWith("C:\\")) {
    return file;
  }

  return "\\\\Mac\\Host\\" + file.replace(/\//g, "\\");
} 
// __ts-babel@6.0.4
//# sourceMappingURL=ParallelsVm.js.map{"version":3,"sources":["../../src/vm/ParallelsVm.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;SACsB,W;;;AA2BtB;;;;+CA3BO,WAA2B,WAA3B,EAAmD;AACxD;AACA,QAAI,OAAO,SAAS,yBAAK,QAAL,EAAe,CAAC,MAAD,EAAS,IAAT,EAAe,IAAf,EAAqB,MAArB,CAAf,EAA6C,SAA7C,EAAwD,KAAxD,CAApB;AACA,IAAA,WAAW,CAAC,GAAZ,CAAgB,gBAAhB,EAAkC,OAAlC;AAEA,IAAA,OAAO,GAAG,OAAO,CAAC,SAAR,CAAkB,OAAO,CAAC,OAAR,CAAgB,KAAhB,CAAlB,CAAV,CALwD,CAOxD;;AACA,UAAM,MAAM,GAAuB,EAAnC;;AACA,SAAK,MAAM,IAAX,IAAmB,OAAO,CAAC,KAAR,CAAc,MAAd,EAAsB,GAAtB,CAA0B,EAAE,IAAI,EAAE,CAAC,IAAH,EAAhC,EAA2C,MAA3C,CAAkD,EAAE,IAAI,EAAE,CAAC,MAAH,GAAY,CAApE,CAAnB,EAA2F;AACzF,YAAM,EAAE,GAAQ,EAAhB;;AACA,WAAK,MAAM,IAAX,IAAmB,IAAI,CAAC,KAAL,CAAW,IAAX,CAAnB,EAAqC;AACnC,cAAM,IAAI,GAAG,oBAAoB,IAApB,CAAyB,IAAzB,CAAb;;AACA,YAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB;AACD;;AAED,cAAM,GAAG,GAAG,IAAI,CAAC,CAAD,CAAJ,CAAQ,WAAR,EAAZ;;AACA,YAAI,GAAG,KAAK,IAAR,IAAgB,GAAG,KAAK,IAAxB,IAAgC,GAAG,KAAK,MAAxC,IAAkD,GAAG,KAAK,OAA1D,IAAqE,GAAG,KAAK,MAAjF,EAAyF;AACvF,UAAA,EAAE,CAAC,GAAD,CAAF,GAAU,IAAI,CAAC,CAAD,CAAJ,CAAQ,IAAR,EAAV;AACD;AACF;;AACD,MAAA,MAAM,CAAC,IAAP,CAAY,EAAZ;AACD;;AACD,WAAO,MAAP;AACD,G;;;;AAGK,MAAO,kBAAP,SAAkC,eAAlC,CAA2C;AAK/C,EAAA,WAAA,CAA6B,EAA7B,EAA4C;AAC1C;AAD2B,SAAA,EAAA,GAAA,EAAA;AAFrB,SAAA,eAAA,GAAkB,KAAlB;AAKN,SAAK,YAAL,GAAoB,KAAK,SAAL,EAApB;AACD;;AAED,MAAI,OAAJ,GAAW;AACT,WAAO,GAAP;AACD;;AAEO,EAAA,kBAAkB,CAAC,KAAD,EAAa;AACrC,QAAI,KAAK,CAAC,OAAN,CAAc,QAAd,CAAuB,oDAAvB,CAAJ,EAAkF;AAChF,YAAM,IAAI,KAAJ,CAAU,0CAA0C,KAAK,EAAL,CAAQ,IAAI,qFAAqF,KAAK,CAAC,OAAO,EAAlK,CAAN;AACD;;AAED,uBAAI,IAAJ,CAAS,8EAAT;;AACA,UAAM,KAAN;AACD;;AAEK,EAAA,IAAN,CAAW,IAAX,EAAyB,IAAzB,EAA8C,OAA9C,EAAuE;AAAA;;AAAA;AACrE,YAAM,KAAI,CAAC,mBAAL,EAAN,CADqE,CAErE;;AACA,mBAAa,yBAAK,QAAL,EAAe,CAAC,MAAD,EAAS,KAAI,CAAC,EAAL,CAAQ,EAAjB,EAAqB,gBAArB,EAAuC,IAAI,CAAC,UAAL,CAAgB,GAAhB,IAAuB,yBAAyB,CAAC,IAAD,CAAhD,GAAyD,IAAhG,EAAsG,MAAtG,CAA6G,IAA7G,CAAf,EAAmI,OAAnI,EACV,KADU,CACJ,KAAK,IAAI,KAAI,CAAC,kBAAL,CAAwB,KAAxB,CADL,CAAb;AAHqE;AAKtE;;AAEK,EAAA,KAAN,CAAY,IAAZ,EAA0B,IAA1B,EAA+C,OAA/C,EAAuE,YAAvE,EAAuG;AAAA;;AAAA;AACrG,YAAM,MAAI,CAAC,mBAAL,EAAN;AACA,mBAAa,0BAAM,QAAN,EAAgB,CAAC,MAAD,EAAS,MAAI,CAAC,EAAL,CAAQ,EAAjB,EAAqB,IAArB,EAA2B,MAA3B,CAAkC,IAAlC,CAAhB,EAAyD,OAAzD,EAAkE,YAAlE,EACV,KADU,CACJ,KAAK,IAAI,MAAI,CAAC,kBAAL,CAAwB,KAAxB,CADL,CAAb;AAFqG;AAItG;;AAEa,EAAA,SAAN,GAAe;AAAA;;AAAA;AACrB,YAAM,IAAI,GAAG,MAAI,CAAC,EAAL,CAAQ,EAArB;AACA,YAAM,KAAK,GAAG,MAAI,CAAC,EAAL,CAAQ,KAAtB;;AACA,UAAI,KAAK,KAAK,SAAd,EAAyB;AACvB;AACD;;AAED,UAAI,CAAC,MAAI,CAAC,eAAV,EAA2B;AACzB,QAAA,MAAI,CAAC,eAAL,GAAuB,IAAvB;;AACA,QAAA,OAAO,CAAC,iBAAD,CAAP,CAA4B,QAAD,IAAkC;AAC3D,gBAAM,QAAQ,GAAG,CAAC,SAAD,EAAY,IAAZ,CAAjB;;AACA,cAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,+CAAa,QAAb,EAAuB,QAAvB;AACD,WAFD,MAGK;AACH,qCAAK,QAAL,EAAe,QAAf,EACG,IADH,CACQ,QADR,EAEG,KAFH,CAES,QAFT;AAGD;AACF,SAVD;AAWD;;AACD,YAAM,yBAAK,QAAL,EAAe,CAAC,OAAD,EAAU,IAAV,CAAf,CAAN;AArBqB;AAsBtB;;AAEO,EAAA,mBAAmB,GAAA;AACzB,QAAI,YAAY,GAAG,KAAK,YAAxB;;AACA,QAAI,YAAY,IAAI,IAApB,EAA0B;AACxB,MAAA,YAAY,GAAG,KAAK,SAAL,EAAf;AACA,WAAK,YAAL,GAAoB,YAApB;AACD;;AACD,WAAO,YAAP;AACD;;AAED,EAAA,QAAQ,CAAC,IAAD,EAAa;AACnB;AACA,WAAO,yBAAyB,CAAC,IAAD,CAAhC;AACD;;AAzE8C;;;;AA4E3C,SAAU,yBAAV,CAAoC,IAApC,EAAgD;AACpD,MAAI,IAAI,CAAC,UAAL,CAAgB,MAAhB,CAAJ,EAA6B;AAC3B,WAAO,IAAP;AACD;;AACD,SAAO,oBAAoB,IAAI,CAAC,OAAL,CAAa,KAAb,EAAoB,IAApB,CAA3B;AACD,C","sourcesContent":["import { exec, spawn, DebugLogger, ExtraSpawnOptions, log } from \"builder-util\"\nimport { SpawnOptions, execFileSync, ExecFileOptions } from \"child_process\"\nimport { VmManager } from \"./vm\"\n\n/** @internal */\nexport async function parseVmList(debugLogger: DebugLogger) {\n  // do not log output if debug - it is huge, logged using debugLogger\n  let rawList = await exec(\"prlctl\", [\"list\", \"-i\", \"-s\", \"name\"], undefined, false)\n  debugLogger.add(\"parallels.list\", rawList)\n\n  rawList = rawList.substring(rawList.indexOf(\"ID:\"))\n\n  // let match: Array<string> | null\n  const result: Array<ParallelsVm> = []\n  for (const info of rawList.split(\"\\n\\n\").map(it => it.trim()).filter(it => it.length > 0)) {\n    const vm: any = {}\n    for (const line of info.split(\"\\n\")) {\n      const meta = /^([^:(\"]+): (.*)$/.exec(line)\n      if (meta == null) {\n        continue\n      }\n\n      const key = meta[1].toLowerCase()\n      if (key === \"id\" || key === \"os\" || key === \"name\" || key === \"state\" || key === \"name\") {\n        vm[key] = meta[2].trim()\n      }\n    }\n    result.push(vm)\n  }\n  return result\n}\n\n/** @internal */\nexport class ParallelsVmManager extends VmManager {\n  private startPromise: Promise<any>\n\n  private isExitHookAdded = false\n\n  constructor(private readonly vm: ParallelsVm) {\n    super()\n\n    this.startPromise = this.doStartVm()\n  }\n\n  get pathSep(): string {\n    return \"/\"\n  }\n\n  private handleExecuteError(error: Error): any {\n    if (error.message.includes(\"Unable to open new session in this virtual machine\")) {\n      throw new Error(`Please ensure that your are logged in \"${this.vm.name}\" parallels virtual machine. In the future please do not stop VM, but suspend.\\n\\n${error.message}`)\n    }\n\n    log.warn(\"ensure that 'Share folders' is set to 'All Disks', see https://goo.gl/E6XphP\")\n    throw error\n  }\n\n  async exec(file: string, args: Array<string>, options?: ExecFileOptions): Promise<string> {\n    await this.ensureThatVmStarted()\n    // it is important to use \"--current-user\" to execute command under logged in user - to access certs.\n    return await exec(\"prlctl\", [\"exec\", this.vm.id, \"--current-user\", file.startsWith(\"/\") ? macPathToParallelsWindows(file) : file].concat(args), options)\n      .catch(error => this.handleExecuteError(error))\n  }\n\n  async spawn(file: string, args: Array<string>, options?: SpawnOptions, extraOptions?: ExtraSpawnOptions): Promise<any> {\n    await this.ensureThatVmStarted()\n    return await spawn(\"prlctl\", [\"exec\", this.vm.id, file].concat(args), options, extraOptions)\n      .catch(error => this.handleExecuteError(error))\n  }\n\n  private async doStartVm() {\n    const vmId = this.vm.id\n    const state = this.vm.state\n    if (state === \"running\") {\n      return\n    }\n\n    if (!this.isExitHookAdded) {\n      this.isExitHookAdded = true\n      require(\"async-exit-hook\")((callback: (() => void) | null) => {\n        const stopArgs = [\"suspend\", vmId]\n        if (callback == null) {\n          execFileSync(\"prlctl\", stopArgs)\n        }\n        else {\n          exec(\"prlctl\", stopArgs)\n            .then(callback)\n            .catch(callback)\n        }\n      })\n    }\n    await exec(\"prlctl\", [\"start\", vmId])\n  }\n\n  private ensureThatVmStarted() {\n    let startPromise = this.startPromise\n    if (startPromise == null) {\n      startPromise = this.doStartVm()\n      this.startPromise = startPromise\n    }\n    return startPromise\n  }\n\n  toVmFile(file: string): string {\n    // https://stackoverflow.com/questions/4742992/cannot-access-network-drive-in-powershell-running-as-administrator\n    return macPathToParallelsWindows(file)\n  }\n}\n\nexport function macPathToParallelsWindows(file: string) {\n  if (file.startsWith(\"C:\\\\\")) {\n    return file\n  }\n  return \"\\\\\\\\Mac\\\\Host\\\\\" + file.replace(/\\//g, \"\\\\\")\n}\n\nexport interface ParallelsVm {\n  id: string\n  name: string\n  os: \"win-10\" | \"ubuntu\" | \"elementary\"\n  state: \"running\" | \"suspended\" | \"stopped\"\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.WineVmManager = void 0;

function _wine() {
  const data = require("../wine");

  _wine = function () {
    return data;
  };

  return data;
}

function _vm() {
  const data = require("./vm");

  _vm = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class WineVmManager extends _vm().VmManager {
  constructor() {
    super();
  }

  exec(file, args, options, isLogOutIfDebug = true) {
    return (0, _wine().execWine)(file, null, args, options);
  }

  spawn(file, args, options, extraOptions) {
    throw new Error("Unsupported");
  }

  toVmFile(file) {
    return path.win32.join("Z:", file);
  }

} exports.WineVmManager = WineVmManager;
// __ts-babel@6.0.4
//# sourceMappingURL=WineVm.js.map{"version":3,"sources":["../../src/vm/WineVm.ts"],"names":[],"mappings":";;;;;;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;;;AAEM,MAAO,aAAP,SAA6B,eAA7B,CAAsC;AAC1C,EAAA,WAAA,GAAA;AACE;AACD;;AAED,EAAA,IAAI,CAAC,IAAD,EAAe,IAAf,EAAoC,OAApC,EAA+D,eAAe,GAAG,IAAjF,EAAqF;AACvF,WAAO,sBAAS,IAAT,EAAe,IAAf,EAAqB,IAArB,EAA2B,OAA3B,CAAP;AACD;;AAED,EAAA,KAAK,CAAC,IAAD,EAAe,IAAf,EAAoC,OAApC,EAA4D,YAA5D,EAA4F;AAC/F,UAAM,IAAI,KAAJ,CAAU,aAAV,CAAN;AACD;;AAED,EAAA,QAAQ,CAAC,IAAD,EAAa;AACnB,WAAO,IAAI,CAAC,KAAL,CAAW,IAAX,CAAgB,IAAhB,EAAsB,IAAtB,CAAP;AACD;;AAfyC,C","sourcesContent":["import { SpawnOptions, ExecFileOptions } from \"child_process\"\nimport { ExtraSpawnOptions } from \"builder-util\"\nimport { execWine } from \"../wine\"\nimport { VmManager } from \"./vm\"\nimport * as path from \"path\"\n\nexport class WineVmManager extends VmManager {\n  constructor() {\n    super()\n  }\n\n  exec(file: string, args: Array<string>, options?: ExecFileOptions, isLogOutIfDebug = true): Promise<string> {\n    return execWine(file, null, args, options)\n  }\n\n  spawn(file: string, args: Array<string>, options?: SpawnOptions, extraOptions?: ExtraSpawnOptions): Promise<any> {\n    throw new Error(\"Unsupported\")\n  }\n\n  toVmFile(file: string): string {\n    return path.win32.join(\"Z:\", file)\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getWindowsVm = getWindowsVm;
exports.VmManager = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _ParallelsVm() {
  const data = require("./ParallelsVm");

  _ParallelsVm = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class VmManager {
  get pathSep() {
    return path.sep;
  }

  exec(file, args, options, isLogOutIfDebug = true) {
    return (0, _builderUtil().exec)(file, args, options, isLogOutIfDebug);
  }

  spawn(file, args, options, extraOptions) {
    return (0, _builderUtil().spawn)(file, args, options, extraOptions);
  }

  toVmFile(file) {
    return file;
  }

}

exports.VmManager = VmManager;

function getWindowsVm(_x) {
  return _getWindowsVm.apply(this, arguments);
} function _getWindowsVm() {
  _getWindowsVm = (0, _bluebirdLst().coroutine)(function* (debugLogger) {
    const vmList = (yield (0, _ParallelsVm().parseVmList)(debugLogger)).filter(it => it.os === "win-10");

    if (vmList.length === 0) {
      throw new (_builderUtil().InvalidConfigurationError)("Cannot find suitable Parallels Desktop virtual machine (Windows 10 is required)");
    } // prefer running or suspended vm


    return new (_ParallelsVm().ParallelsVmManager)(vmList.find(it => it.state === "running") || vmList.find(it => it.state === "suspended") || vmList[0]);
  });
  return _getWindowsVm.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=vm.js.map{"version":3,"sources":["../../src/vm/vm.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEM,MAAO,SAAP,CAAgB;AACpB,MAAI,OAAJ,GAAW;AACT,WAAO,IAAI,CAAC,GAAZ;AACD;;AAED,EAAA,IAAI,CAAC,IAAD,EAAe,IAAf,EAAoC,OAApC,EAA+D,eAAe,GAAG,IAAjF,EAAqF;AACvF,WAAO,yBAAK,IAAL,EAAW,IAAX,EAAiB,OAAjB,EAA0B,eAA1B,CAAP;AACD;;AAED,EAAA,KAAK,CAAC,IAAD,EAAe,IAAf,EAAoC,OAApC,EAA4D,YAA5D,EAA4F;AAC/F,WAAO,0BAAM,IAAN,EAAY,IAAZ,EAAkB,OAAlB,EAA2B,YAA3B,CAAP;AACD;;AAED,EAAA,QAAQ,CAAC,IAAD,EAAa;AACnB,WAAO,IAAP;AACD;;AAfmB;;;;SAkBA,Y;;;;;;gDAAf,WAA4B,WAA5B,EAAoD;AACzD,UAAM,MAAM,GAAG,OAAO,gCAAY,WAAZ,CAAP,EAAiC,MAAjC,CAAwC,EAAE,IAAI,EAAE,CAAC,EAAH,KAAU,QAAxD,CAAf;;AACA,QAAI,MAAM,CAAC,MAAP,KAAkB,CAAtB,EAAyB;AACvB,YAAM,KAAI,wCAAJ,EAA8B,iFAA9B,CAAN;AACD,KAJwD,CAMzD;;;AACA,WAAO,KAAI,iCAAJ,EAAuB,MAAM,CAAC,IAAP,CAAY,EAAE,IAAI,EAAE,CAAC,KAAH,KAAa,SAA/B,KAA6C,MAAM,CAAC,IAAP,CAAY,EAAE,IAAI,EAAE,CAAC,KAAH,KAAa,WAA/B,CAA7C,IAA4F,MAAM,CAAC,CAAD,CAAzH,CAAP;AACD,G","sourcesContent":["import { DebugLogger, exec, ExtraSpawnOptions, InvalidConfigurationError, spawn } from \"builder-util\"\nimport { ExecFileOptions, SpawnOptions } from \"child_process\"\nimport * as path from \"path\"\nimport { ParallelsVmManager, parseVmList } from \"./ParallelsVm\"\n\nexport class VmManager {\n  get pathSep(): string {\n    return path.sep\n  }\n\n  exec(file: string, args: Array<string>, options?: ExecFileOptions, isLogOutIfDebug = true): Promise<string> {\n    return exec(file, args, options, isLogOutIfDebug)\n  }\n\n  spawn(file: string, args: Array<string>, options?: SpawnOptions, extraOptions?: ExtraSpawnOptions): Promise<any> {\n    return spawn(file, args, options, extraOptions)\n  }\n\n  toVmFile(file: string): string {\n    return file\n  }\n}\n\nexport async function getWindowsVm(debugLogger: DebugLogger): Promise<VmManager> {\n  const vmList = (await parseVmList(debugLogger)).filter(it => it.os === \"win-10\")\n  if (vmList.length === 0) {\n    throw new InvalidConfigurationError(\"Cannot find suitable Parallels Desktop virtual machine (Windows 10 is required)\")\n  }\n\n  // prefer running or suspended vm\n  return new ParallelsVmManager(vmList.find(it => it.state === \"running\") || vmList.find(it => it.state === \"suspended\") || vmList[0])\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.AppFileWalker = exports.FileCopyHelper = void 0;

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const nodeModulesSystemDependentSuffix = `${path.sep}node_modules`;

function addAllPatternIfNeed(matcher) {
  if (!matcher.isSpecifiedAsEmptyArray && (matcher.isEmpty() || matcher.containsOnlyIgnore())) {
    matcher.prependPattern("**/*");
  }

  return matcher;
}

class FileCopyHelper {
  constructor(matcher, filter, packager) {
    this.matcher = matcher;
    this.filter = filter;
    this.packager = packager;
    this.metadata = new Map();
  }

  handleFile(file, parent, fileStat) {
    if (!fileStat.isSymbolicLink()) {
      return null;
    }

    return (0, _fsExtraP().readlink)(file).then(linkTarget => {
      // http://unix.stackexchange.com/questions/105637/is-symlinks-target-relative-to-the-destinations-parent-directory-and-if-so-wh
      return this.handleSymlink(fileStat, file, parent, linkTarget);
    });
  }

  handleSymlink(fileStat, file, parent, linkTarget) {
    const resolvedLinkTarget = path.resolve(parent, linkTarget);
    const link = path.relative(this.matcher.from, resolvedLinkTarget);

    if (link.startsWith("..")) {
      // outside of project, linked module (https://github.com/electron-userland/electron-builder/issues/675)
      return (0, _fsExtraP().stat)(resolvedLinkTarget).then(targetFileStat => {
        this.metadata.set(file, targetFileStat);
        return targetFileStat;
      });
    } else {
      const s = fileStat;
      s.relativeLink = link;
      s.linkRelativeToFile = path.relative(parent, resolvedLinkTarget);
    }

    return null;
  }

}

exports.FileCopyHelper = FileCopyHelper;

function createAppFilter(matcher, packager) {
  if (packager.areNodeModulesHandledExternally) {
    return matcher.isEmpty() ? null : matcher.createFilter();
  }

  const nodeModulesFilter = (file, fileStat) => {
    return !(fileStat.isDirectory() && file.endsWith(nodeModulesSystemDependentSuffix));
  };

  if (matcher.isEmpty()) {
    return nodeModulesFilter;
  }

  const filter = matcher.createFilter();
  return (file, fileStat) => {
    if (!nodeModulesFilter(file, fileStat)) {
      return false;
    }

    return filter(file, fileStat);
  };
}
/** @internal */


class AppFileWalker extends FileCopyHelper {
  constructor(matcher, packager) {
    super(addAllPatternIfNeed(matcher), createAppFilter(matcher, packager), packager);
  } // noinspection JSUnusedGlobalSymbols


  consume(file, fileStat, parent, siblingNames) {
    if (fileStat.isDirectory()) {
      // https://github.com/electron-userland/electron-builder/issues/1539
      // but do not filter if we inside node_modules dir
      // update: solution disabled, node module resolver should support such setup
      if (file.endsWith(nodeModulesSystemDependentSuffix)) {
        return false;
      }
    } else {
      // save memory - no need to store stat for directory
      this.metadata.set(file, fileStat);
    }

    return this.handleFile(file, parent, fileStat);
  }

} exports.AppFileWalker = AppFileWalker;
// __ts-babel@6.0.4
//# sourceMappingURL=AppFileWalker.js.map{"version":3,"sources":["../../src/util/AppFileWalker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Filter, FileConsumer } from \"builder-util/out/fs\"\nimport { readlink, stat, Stats } from \"fs-extra-p\"\nimport { FileMatcher } from \"../fileMatcher\"\nimport { Packager } from \"../packager\"\nimport * as path from \"path\"\n\nconst nodeModulesSystemDependentSuffix = `${path.sep}node_modules`\n\nfunction addAllPatternIfNeed(matcher: FileMatcher) {\n  if (!matcher.isSpecifiedAsEmptyArray && (matcher.isEmpty() || matcher.containsOnlyIgnore())) {\n    matcher.prependPattern(\"**/*\")\n  }\n  return matcher\n}\n\nexport abstract class FileCopyHelper {\n  readonly metadata = new Map<string, Stats>()\n\n  protected constructor(protected readonly matcher: FileMatcher, readonly filter: Filter | null, protected readonly packager: Packager) {\n  }\n\n  protected handleFile(file: string, parent: string, fileStat: Stats): Promise<Stats | null> | null {\n    if (!fileStat.isSymbolicLink()) {\n      return null\n    }\n\n    return readlink(file)\n      .then((linkTarget): any => {\n        // http://unix.stackexchange.com/questions/105637/is-symlinks-target-relative-to-the-destinations-parent-directory-and-if-so-wh\n        return this.handleSymlink(fileStat, file, parent, linkTarget)\n      })\n  }\n\n  private handleSymlink(fileStat: Stats, file: string, parent: string, linkTarget: string): Promise<Stats> | null {\n    const resolvedLinkTarget = path.resolve(parent, linkTarget)\n    const link = path.relative(this.matcher.from, resolvedLinkTarget)\n    if (link.startsWith(\"..\")) {\n      // outside of project, linked module (https://github.com/electron-userland/electron-builder/issues/675)\n      return stat(resolvedLinkTarget)\n        .then(targetFileStat => {\n          this.metadata.set(file, targetFileStat)\n          return targetFileStat\n        })\n    }\n    else {\n      const s = (fileStat as any)\n      s.relativeLink = link\n      s.linkRelativeToFile = path.relative(parent, resolvedLinkTarget)\n    }\n    return null\n  }\n}\n\nfunction createAppFilter(matcher: FileMatcher, packager: Packager): Filter | null {\n  if (packager.areNodeModulesHandledExternally) {\n    return matcher.isEmpty() ? null : matcher.createFilter()\n  }\n\n  const nodeModulesFilter: Filter = (file, fileStat) => {\n    return !(fileStat.isDirectory() && file.endsWith(nodeModulesSystemDependentSuffix))\n  }\n\n  if (matcher.isEmpty()) {\n    return nodeModulesFilter\n  }\n\n  const filter = matcher.createFilter()\n  return (file, fileStat) => {\n    if (!nodeModulesFilter(file, fileStat)) {\n      return false\n    }\n    return filter(file, fileStat)\n  }\n}\n\n/** @internal */\nexport class AppFileWalker extends FileCopyHelper implements FileConsumer {\n  constructor(matcher: FileMatcher, packager: Packager) {\n    super(addAllPatternIfNeed(matcher), createAppFilter(matcher, packager), packager)\n  }\n\n  // noinspection JSUnusedGlobalSymbols\n  consume(file: string, fileStat: Stats, parent: string, siblingNames: Array<string>): any {\n    if (fileStat.isDirectory()) {\n      // https://github.com/electron-userland/electron-builder/issues/1539\n      // but do not filter if we inside node_modules dir\n      // update: solution disabled, node module resolver should support such setup\n      if (file.endsWith(nodeModulesSystemDependentSuffix)) {\n        return false\n      }\n    }\n    else {\n      // save memory - no need to store stat for directory\n      this.metadata.set(file, fileStat)\n    }\n\n    return this.handleFile(file, parent, fileStat)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.NodeModuleCopyHelper = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _fileMatcher() {
  const data = require("../fileMatcher");

  _fileMatcher = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("../platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _AppFileWalker() {
  const data = require("./AppFileWalker");

  _AppFileWalker = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const excludedFiles = new Set([".DS_Store", "node_modules"
/* already in the queue */
, "CHANGELOG.md", "ChangeLog", "changelog.md", "binding.gyp", ".npmignore"].concat(_fileMatcher().excludedNames.split(",")));
const topLevelExcludedFiles = new Set(["test.js", "karma.conf.js", ".coveralls.yml", "README.md", "readme.markdown", "README", "readme.md", "readme", "test", "__tests__", "tests", "powered-test", "example", "examples", ".bin"]);
/** @internal */

class NodeModuleCopyHelper extends _AppFileWalker().FileCopyHelper {
  constructor(matcher, packager) {
    super(matcher, matcher.isEmpty() ? null : matcher.createFilter(), packager);
  }

  collectNodeModules(baseDir, moduleNames, nodeModuleExcludedExts) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const filter = _this.filter;
      const metadata = _this.metadata;
      const onNodeModuleFile = (0, _platformPackager().resolveFunction)(_this.packager.config.onNodeModuleFile, "onNodeModuleFile");
      const result = [];
      const queue = [];

      for (const moduleName of moduleNames) {
        const tmpPath = baseDir + path.sep + moduleName;
        queue.length = 1; // The path should be corrected in Windows that when the moduleName is Scoped packages named.

        const depPath = path.normalize(tmpPath);
        queue[0] = depPath;

        while (queue.length > 0) {
          const dirPath = queue.pop();
          const childNames = yield (0, _fsExtraP().readdir)(dirPath);
          childNames.sort();
          const isTopLevel = dirPath === depPath;
          const dirs = []; // our handler is async, but we should add sorted files, so, we add file to result not in the mapper, but after map

          const sortedFilePaths = yield _bluebirdLst().default.map(childNames, name => {
            if (onNodeModuleFile != null) {
              onNodeModuleFile(dirPath + path.sep + name);
            }

            if (excludedFiles.has(name) || name.startsWith("._")) {
              return null;
            }

            for (const ext of nodeModuleExcludedExts) {
              if (name.endsWith(ext)) {
                return null;
              }
            } // noinspection SpellCheckingInspection


            if (isTopLevel && (topLevelExcludedFiles.has(name) || moduleName === "libui-node" && (name === "build" || name === "docs" || name === "src"))) {
              return null;
            }

            if (dirPath.endsWith("build")) {
              if (name === "gyp-mac-tool" || name === "Makefile" || name.endsWith(".mk") || name.endsWith(".gypi") || name.endsWith(".Makefile")) {
                return null;
              }
            } else if (dirPath.endsWith("Release") && (name === ".deps" || name === "obj.target")) {
              return null;
            } else if (name === "src" && (dirPath.endsWith("keytar") || dirPath.endsWith("keytar-prebuild"))) {
              return null;
            } else if (dirPath.endsWith("lzma-native") && (name === "build" || name === "deps")) {
              return null;
            }

            const filePath = dirPath + path.sep + name;
            return (0, _fsExtraP().lstat)(filePath).then(stat => {
              if (filter != null && !filter(filePath, stat)) {
                return null;
              }

              if (!stat.isDirectory()) {
                metadata.set(filePath, stat);
              }

              const consumerResult = _this.handleFile(filePath, dirPath, stat);

              if (consumerResult == null) {
                if (stat.isDirectory()) {
                  dirs.push(name);
                  return null;
                } else {
                  return filePath;
                }
              } else {
                return consumerResult.then(it => {
                  // asarUtil can return modified stat (symlink handling)
                  if ((it == null ? stat : it).isDirectory()) {
                    dirs.push(name);
                    return null;
                  } else {
                    return filePath;
                  }
                });
              }
            });
          }, _fs().CONCURRENCY);

          for (const child of sortedFilePaths) {
            if (child != null) {
              result.push(child);
            }
          }

          dirs.sort();

          for (const child of dirs) {
            queue.push(dirPath + path.sep + child);
          }
        }
      }

      return result;
    })();
  }

} exports.NodeModuleCopyHelper = NodeModuleCopyHelper;
// __ts-babel@6.0.4
//# sourceMappingURL=NodeModuleCopyHelper.js.map{"version":3,"sources":["../../src/util/NodeModuleCopyHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { CONCURRENCY } from \"builder-util/out/fs\"\nimport { lstat, readdir } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { excludedNames, FileMatcher } from \"../fileMatcher\"\nimport { Packager } from \"../packager\"\nimport { resolveFunction } from \"../platformPackager\"\nimport { FileCopyHelper } from \"./AppFileWalker\"\n\nconst excludedFiles = new Set([\".DS_Store\", \"node_modules\" /* already in the queue */, \"CHANGELOG.md\", \"ChangeLog\", \"changelog.md\", \"binding.gyp\", \".npmignore\"].concat(excludedNames.split(\",\")))\nconst topLevelExcludedFiles = new Set([\"test.js\", \"karma.conf.js\", \".coveralls.yml\", \"README.md\", \"readme.markdown\", \"README\", \"readme.md\", \"readme\", \"test\", \"__tests__\", \"tests\", \"powered-test\", \"example\", \"examples\", \".bin\"])\n\n/** @internal */\nexport class NodeModuleCopyHelper extends FileCopyHelper {\n  constructor(matcher: FileMatcher, packager: Packager) {\n    super(matcher, matcher.isEmpty() ? null : matcher.createFilter(), packager)\n  }\n\n  async collectNodeModules(baseDir: string, moduleNames: Iterable<string>, nodeModuleExcludedExts: Array<string>): Promise<Array<string>> {\n    const filter = this.filter\n    const metadata = this.metadata\n\n    const onNodeModuleFile = resolveFunction(this.packager.config.onNodeModuleFile, \"onNodeModuleFile\")\n\n    const result: Array<string> = []\n    const queue: Array<string> = []\n    for (const moduleName of moduleNames) {\n      const tmpPath = baseDir + path.sep + moduleName\n      queue.length = 1\n      // The path should be corrected in Windows that when the moduleName is Scoped packages named.\n      const depPath = path.normalize(tmpPath)\n      queue[0] = depPath\n\n      while (queue.length > 0) {\n        const dirPath = queue.pop()!\n\n        const childNames = await readdir(dirPath)\n        childNames.sort()\n\n        const isTopLevel = dirPath === depPath\n        const dirs: Array<string> = []\n        // our handler is async, but we should add sorted files, so, we add file to result not in the mapper, but after map\n        const sortedFilePaths = await BluebirdPromise.map(childNames, name => {\n          if (onNodeModuleFile != null) {\n            onNodeModuleFile(dirPath + path.sep + name)\n          }\n\n          if (excludedFiles.has(name) || name.startsWith(\"._\")) {\n            return null\n          }\n\n          for (const ext of nodeModuleExcludedExts) {\n            if (name.endsWith(ext)) {\n              return null\n            }\n          }\n\n          // noinspection SpellCheckingInspection\n          if (isTopLevel && (topLevelExcludedFiles.has(name) || (moduleName === \"libui-node\" && (name === \"build\" || name === \"docs\" || name === \"src\")))) {\n            return null\n          }\n\n          if (dirPath.endsWith(\"build\")) {\n            if (name === \"gyp-mac-tool\" || name === \"Makefile\" || name.endsWith(\".mk\") || name.endsWith(\".gypi\") || name.endsWith(\".Makefile\")) {\n              return null\n            }\n          }\n          else if (dirPath.endsWith(\"Release\") && (name === \".deps\" || name === \"obj.target\")) {\n            return null\n          }\n          else if (name === \"src\" && (dirPath.endsWith(\"keytar\") || dirPath.endsWith(\"keytar-prebuild\"))) {\n            return null\n          }\n          else if (dirPath.endsWith(\"lzma-native\") && (name === \"build\" || name === \"deps\")) {\n            return null\n          }\n\n          const filePath = dirPath + path.sep + name\n          return lstat(filePath)\n            .then(stat => {\n              if (filter != null && !filter(filePath, stat)) {\n                return null\n              }\n\n              if (!stat.isDirectory()) {\n                metadata.set(filePath, stat)\n              }\n              const consumerResult = this.handleFile(filePath, dirPath, stat)\n              if (consumerResult == null) {\n                if (stat.isDirectory()) {\n                  dirs.push(name)\n                  return null\n                }\n                else {\n                  return filePath\n                }\n              }\n              else {\n                return consumerResult\n                  .then(it => {\n                    // asarUtil can return modified stat (symlink handling)\n                    if ((it == null ? stat : it).isDirectory()) {\n                      dirs.push(name)\n                      return null\n                    }\n                    else {\n                      return filePath\n                    }\n                  })\n              }\n            })\n        }, CONCURRENCY)\n\n        for (const child of sortedFilePaths) {\n          if (child != null) {\n            result.push(child)\n          }\n        }\n\n        dirs.sort()\n        for (const child of dirs) {\n          queue.push(dirPath + path.sep + child)\n        }\n      }\n    }\n    return result\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.executeAppBuilderAsJson = executeAppBuilderAsJson;
exports.objectToArgs = objectToArgs;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function executeAppBuilderAsJson(args) {
  return (0, _builderUtil().executeAppBuilder)(args).then(rawResult => {
    try {
      return JSON.parse(rawResult);
    } catch (e) {
      throw new Error(`Cannot parse result: ${e.message}: "${rawResult}"`);
    }
  });
}

function objectToArgs(to, argNameToValue) {
  for (const name of Object.keys(argNameToValue)) {
    const value = argNameToValue[name];

    if (value != null) {
      to.push(`--${name}`, value);
    }
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=appBuilder.js.map{"version":3,"sources":["../../src/util/appBuilder.ts"],"names":[],"mappings":";;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEM,SAAU,uBAAV,CAAqC,IAArC,EAAwD;AAC5D,SAAO,sCAAkB,IAAlB,EACJ,IADI,CACC,SAAS,IAAG;AAChB,QAAI;AACF,aAAO,IAAI,CAAC,KAAL,CAAW,SAAX,CAAP;AACD,KAFD,CAGA,OAAO,CAAP,EAAU;AACR,YAAM,IAAI,KAAJ,CAAU,wBAAwB,CAAC,CAAC,OAAO,MAAM,SAAS,GAA1D,CAAN;AACD;AACF,GARI,CAAP;AASD;;AAEK,SAAU,YAAV,CAAuB,EAAvB,EAA0C,cAA1C,EAA2F;AAC/F,OAAK,MAAM,IAAX,IAAmB,MAAM,CAAC,IAAP,CAAY,cAAZ,CAAnB,EAAgD;AAC9C,UAAM,KAAK,GAAG,cAAc,CAAC,IAAD,CAA5B;;AACA,QAAI,KAAK,IAAI,IAAb,EAAmB;AACjB,MAAA,EAAE,CAAC,IAAH,CAAQ,KAAK,IAAI,EAAjB,EAAqB,KAArB;AACD;AACF;AACF,C","sourcesContent":["import { executeAppBuilder } from \"builder-util\"\n\nexport function executeAppBuilderAsJson<T>(args: Array<string>): Promise<T> {\n  return executeAppBuilder(args)\n    .then(rawResult => {\n      try {\n        return JSON.parse(rawResult) as T\n      }\n      catch (e) {\n        throw new Error(`Cannot parse result: ${e.message}: \"${rawResult}\"`)\n      }\n    })\n}\n\nexport function objectToArgs(to: Array<string>, argNameToValue: { [key: string]: string | null; }): void {\n  for (const name of Object.keys(argNameToValue)) {\n    const value = argNameToValue[name]\n    if (value != null) {\n      to.push(`--${name}`, value)\n    }\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getDestinationPath = getDestinationPath;
exports.copyAppFiles = copyAppFiles;
exports.transformFiles = transformFiles;
exports.computeFileSets = computeFileSets;
exports.computeNodeModuleFileSets = computeNodeModuleFileSets;
exports.ELECTRON_COMPILE_SHIM_FILENAME = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _unpackDetector() {
  const data = require("../asar/unpackDetector");

  _unpackDetector = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _fileMatcher() {
  const data = require("../fileMatcher");

  _fileMatcher = function () {
    return data;
  };

  return data;
}

function _fileTransformer() {
  const data = require("../fileTransformer");

  _fileTransformer = function () {
    return data;
  };

  return data;
}

function _appBuilder() {
  const data = require("./appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _AppFileWalker() {
  const data = require("./AppFileWalker");

  _AppFileWalker = function () {
    return data;
  };

  return data;
}

function _NodeModuleCopyHelper() {
  const data = require("./NodeModuleCopyHelper");

  _NodeModuleCopyHelper = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const BOWER_COMPONENTS_PATTERN = `${path.sep}bower_components${path.sep}`;
/** @internal */

const ELECTRON_COMPILE_SHIM_FILENAME = "__shim.js";
exports.ELECTRON_COMPILE_SHIM_FILENAME = ELECTRON_COMPILE_SHIM_FILENAME;

function getDestinationPath(file, fileSet) {
  if (file === fileSet.src) {
    return fileSet.destination;
  } else {
    const src = fileSet.src;
    const dest = fileSet.destination;

    if (file.length > src.length && file.startsWith(src) && file[src.length] === path.sep) {
      return dest + file.substring(src.length);
    } else {
      // hoisted node_modules
      // not lastIndexOf, to ensure that nested module (top-level module depends on) copied to parent node_modules, not to top-level directory
      // project https://github.com/angexis/punchcontrol/commit/cf929aba55c40d0d8901c54df7945e1d001ce022
      const index = file.indexOf(_fileTransformer().NODE_MODULES_PATTERN);

      if (index < 0) {
        throw new Error(`File "${file}" not under the source directory "${fileSet.src}"`);
      }

      return dest + file.substring(index + 1
      /* leading slash */
      );
    }
  }
}

function copyAppFiles(_x, _x2, _x3) {
  return _copyAppFiles.apply(this, arguments);
} // used only for ASAR, if no asar, file transformed on the fly


function _copyAppFiles() {
  _copyAppFiles = (0, _bluebirdLst().coroutine)(function* (fileSet, packager, transformer) {
    const metadata = fileSet.metadata; // search auto unpacked dir

    const taskManager = new (_builderUtil().AsyncTaskManager)(packager.cancellationToken);
    const createdParentDirs = new Set();
    const fileCopier = new (_fs().FileCopier)(file => {
      // https://github.com/electron-userland/electron-builder/issues/3038
      return !((0, _unpackDetector().isLibOrExe)(file) || file.endsWith(".node"));
    }, transformer);
    const links = [];

    for (let i = 0, n = fileSet.files.length; i < n; i++) {
      const sourceFile = fileSet.files[i];
      const stat = metadata.get(sourceFile);

      if (stat == null) {
        // dir
        continue;
      }

      const destinationFile = getDestinationPath(sourceFile, fileSet);

      if (stat.isSymbolicLink()) {
        links.push({
          file: destinationFile,
          link: yield (0, _fsExtraP().readlink)(sourceFile)
        });
        continue;
      }

      const fileParent = path.dirname(destinationFile);

      if (!createdParentDirs.has(fileParent)) {
        createdParentDirs.add(fileParent);
        yield (0, _fsExtraP().ensureDir)(fileParent);
      }

      taskManager.addTask(fileCopier.copy(sourceFile, destinationFile, stat));

      if (taskManager.tasks.length > _fs().MAX_FILE_REQUESTS) {
        yield taskManager.awaitTasks();
      }
    }

    if (taskManager.tasks.length > 0) {
      yield taskManager.awaitTasks();
    }

    if (links.length > 0) {
      yield _bluebirdLst().default.map(links, it => (0, _fsExtraP().symlink)(it.link, it.file), _fs().CONCURRENCY);
    }
  });
  return _copyAppFiles.apply(this, arguments);
}

function transformFiles(_x4, _x5) {
  return _transformFiles.apply(this, arguments);
}

function _transformFiles() {
  _transformFiles = (0, _bluebirdLst().coroutine)(function* (transformer, fileSet) {
    if (transformer == null) {
      return;
    }

    let transformedFiles = fileSet.transformedFiles;

    if (fileSet.transformedFiles == null) {
      transformedFiles = new Map();
      fileSet.transformedFiles = transformedFiles;
    }

    const metadata = fileSet.metadata;
    yield _bluebirdLst().default.filter(fileSet.files, (it, index) => {
      const fileStat = metadata.get(it);

      if (fileStat == null || !fileStat.isFile()) {
        return false;
      }

      const transformedValue = transformer(it);

      if (transformedValue == null) {
        return false;
      }

      if (typeof transformedValue === "object" && "then" in transformedValue) {
        return transformedValue.then(it => {
          if (it != null) {
            transformedFiles.set(index, it);
          }

          return false;
        });
      }

      transformedFiles.set(index, transformedValue);
      return false;
    }, _fs().CONCURRENCY);
  });
  return _transformFiles.apply(this, arguments);
}

function computeFileSets(_x6, _x7, _x8, _x9) {
  return _computeFileSets.apply(this, arguments);
}

function _computeFileSets() {
  _computeFileSets = (0, _bluebirdLst().coroutine)(function* (matchers, transformer, platformPackager, isElectronCompile) {
    const fileSets = [];
    const packager = platformPackager.info;

    for (const matcher of matchers) {
      const fileWalker = new (_AppFileWalker().AppFileWalker)(matcher, packager);
      const fromStat = yield (0, _fs().statOrNull)(matcher.from);

      if (fromStat == null) {
        _builderUtil().log.debug({
          directory: matcher.from,
          reason: "doesn't exist"
        }, `skipped copying`);

        continue;
      }

      const files = yield (0, _fs().walk)(matcher.from, fileWalker.filter, fileWalker);
      const metadata = fileWalker.metadata;
      fileSets.push(validateFileSet({
        src: matcher.from,
        files,
        metadata,
        destination: matcher.to
      }));
    }

    if (isElectronCompile) {
      // cache files should be first (better IO)
      fileSets.unshift((yield compileUsingElectronCompile(fileSets[0], packager)));
    }

    return fileSets;
  });
  return _computeFileSets.apply(this, arguments);
}

function getNodeModuleExcludedExts(platformPackager) {
  // do not exclude *.h files (https://github.com/electron-userland/electron-builder/issues/2852)
  const result = [".o", ".obj"].concat(_fileMatcher().excludedExts.split(",").map(it => `.${it}`));

  if (platformPackager.config.includePdb !== true) {
    result.push(".pdb");
  }

  if (platformPackager.platform !== _core().Platform.WINDOWS) {
    // https://github.com/electron-userland/electron-builder/issues/1738
    result.push(".dll");
    result.push(".exe");
  }

  return result;
}

function validateFileSet(fileSet) {
  if (fileSet.src == null || fileSet.src.length === 0) {
    throw new Error("fileset src is empty");
  }

  return fileSet;
}
/** @internal */


function computeNodeModuleFileSets(_x10, _x11) {
  return _computeNodeModuleFileSets.apply(this, arguments);
}

function _computeNodeModuleFileSets() {
  _computeNodeModuleFileSets = (0, _bluebirdLst().coroutine)(function* (platformPackager, mainMatcher) {
    const args = ["node-dep-tree", "--dir", platformPackager.info.appDir];

    if (platformPackager.info.framework.getExcludedDependencies != null) {
      const excludedDependencies = platformPackager.info.framework.getExcludedDependencies(platformPackager.platform);

      if (excludedDependencies != null) {
        for (const name of excludedDependencies) {
          args.push("--exclude-dep", name);
        }
      }
    }

    const deps = yield (0, _appBuilder().executeAppBuilderAsJson)(args);
    const nodeModuleExcludedExts = getNodeModuleExcludedExts(platformPackager); // mapSeries instead of map because copyNodeModules is concurrent and so, no need to increase queue/pressure

    return yield _bluebirdLst().default.mapSeries(deps,
    /*#__PURE__*/
    function () {
      var _ref = (0, _bluebirdLst().coroutine)(function* (info) {
        const source = info.dir;
        let destination;

        if (source.length > mainMatcher.from.length && source.startsWith(mainMatcher.from) && source[mainMatcher.from.length] === path.sep) {
          destination = getDestinationPath(source, {
            src: mainMatcher.from,
            destination: mainMatcher.to,
            files: [],
            metadata: null
          });
        } else {
          destination = mainMatcher.to + path.sep + "node_modules";
        } // use main matcher patterns, so, user can exclude some files in such hoisted node modules
        // source here includes node_modules, but pattern base should be without because users expect that pattern "!node_modules/loot-core/src{,/**/*}" will work


        const matcher = new (_fileMatcher().FileMatcher)(path.dirname(source), destination, mainMatcher.macroExpander, mainMatcher.patterns);
        const copier = new (_NodeModuleCopyHelper().NodeModuleCopyHelper)(matcher, platformPackager.info);
        const names = info.deps;
        const files = yield copier.collectNodeModules(source, names, nodeModuleExcludedExts);
        return validateFileSet({
          src: source,
          destination,
          files,
          metadata: copier.metadata
        });
      });

      return function (_x14) {
        return _ref.apply(this, arguments);
      };
    }());
  });
  return _computeNodeModuleFileSets.apply(this, arguments);
}

function compileUsingElectronCompile(_x12, _x13) {
  return _compileUsingElectronCompile.apply(this, arguments);
} function _compileUsingElectronCompile() {
  _compileUsingElectronCompile = (0, _bluebirdLst().coroutine)(function* (mainFileSet, packager) {
    _builderUtil().log.info("compiling using electron-compile");

    const electronCompileCache = yield packager.tempDirManager.getTempDir({
      prefix: "electron-compile-cache"
    });
    const cacheDir = path.join(electronCompileCache, ".cache"); // clear and create cache dir

    yield (0, _fsExtraP().ensureDir)(cacheDir);
    const compilerHost = yield (0, _fileTransformer().createElectronCompilerHost)(mainFileSet.src, cacheDir);
    const nextSlashIndex = mainFileSet.src.length + 1; // pre-compute electron-compile to cache dir - we need to process only subdirectories, not direct files of app dir

    yield _bluebirdLst().default.map(mainFileSet.files, file => {
      if (file.includes(_fileTransformer().NODE_MODULES_PATTERN) || file.includes(BOWER_COMPONENTS_PATTERN) || !file.includes(path.sep, nextSlashIndex) // ignore not root files
      || !mainFileSet.metadata.get(file).isFile()) {
        return null;
      }

      return compilerHost.compile(file).then(() => null);
    }, _fs().CONCURRENCY);
    yield compilerHost.saveConfiguration();
    const metadata = new Map();
    const cacheFiles = yield (0, _fs().walk)(cacheDir, file => !file.startsWith("."), {
      consume: (file, fileStat) => {
        if (fileStat.isFile()) {
          metadata.set(file, fileStat);
        }

        return null;
      }
    }); // add shim

    const shimPath = `${mainFileSet.src}${path.sep}${ELECTRON_COMPILE_SHIM_FILENAME}`;
    mainFileSet.files.push(shimPath);
    mainFileSet.metadata.set(shimPath, {
      isFile: () => true,
      isDirectory: () => false,
      isSymbolicLink: () => false
    });

    if (mainFileSet.transformedFiles == null) {
      mainFileSet.transformedFiles = new Map();
    }

    mainFileSet.transformedFiles.set(mainFileSet.files.length - 1, `
'use strict';
require('electron-compile').init(__dirname, require('path').resolve(__dirname, '${packager.metadata.main || "index"}'), true);
`);
    return {
      src: electronCompileCache,
      files: cacheFiles,
      metadata,
      destination: mainFileSet.destination
    };
  });
  return _compileUsingElectronCompile.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=appFileCopier.js.map{"version":3,"sources":["../../src/util/appFileCopier.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { AsyncTaskManager, log } from \"builder-util\"\nimport { CONCURRENCY, FileCopier, Link, MAX_FILE_REQUESTS, FileTransformer, statOrNull, walk } from \"builder-util/out/fs\"\nimport { ensureDir, readlink, Stats, symlink } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { isLibOrExe } from \"../asar/unpackDetector\"\nimport { Platform } from \"../core\"\nimport { Packager } from \"../packager\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { excludedExts, FileMatcher } from \"../fileMatcher\"\nimport { createElectronCompilerHost, NODE_MODULES_PATTERN } from \"../fileTransformer\"\nimport { executeAppBuilderAsJson } from \"./appBuilder\"\nimport { AppFileWalker } from \"./AppFileWalker\"\nimport { NodeModuleCopyHelper } from \"./NodeModuleCopyHelper\"\n\nconst BOWER_COMPONENTS_PATTERN = `${path.sep}bower_components${path.sep}`\n/** @internal */\nexport const ELECTRON_COMPILE_SHIM_FILENAME = \"__shim.js\"\n\nexport function getDestinationPath(file: string, fileSet: ResolvedFileSet) {\n  if (file === fileSet.src) {\n    return fileSet.destination\n  }\n  else {\n    const src = fileSet.src\n    const dest = fileSet.destination\n    if (file.length > src.length && file.startsWith(src) && file[src.length] === path.sep) {\n      return dest + file.substring(src.length)\n    }\n    else {\n      // hoisted node_modules\n      // not lastIndexOf, to ensure that nested module (top-level module depends on) copied to parent node_modules, not to top-level directory\n      // project https://github.com/angexis/punchcontrol/commit/cf929aba55c40d0d8901c54df7945e1d001ce022\n      const index = file.indexOf(NODE_MODULES_PATTERN)\n      if (index < 0) {\n        throw new Error(`File \"${file}\" not under the source directory \"${fileSet.src}\"`)\n      }\n      return dest + file.substring(index + 1 /* leading slash */)\n    }\n  }\n}\n\nexport async function copyAppFiles(fileSet: ResolvedFileSet, packager: Packager, transformer: FileTransformer) {\n  const metadata = fileSet.metadata\n  // search auto unpacked dir\n  const taskManager = new AsyncTaskManager(packager.cancellationToken)\n  const createdParentDirs = new Set<string>()\n\n  const fileCopier = new FileCopier(file => {\n    // https://github.com/electron-userland/electron-builder/issues/3038\n    return !(isLibOrExe(file) || file.endsWith(\".node\"))\n  }, transformer)\n  const links: Array<Link> = []\n  for (let i = 0, n = fileSet.files.length; i < n; i++) {\n    const sourceFile = fileSet.files[i]\n    const stat = metadata.get(sourceFile)\n    if (stat == null) {\n      // dir\n      continue\n    }\n\n    const destinationFile = getDestinationPath(sourceFile, fileSet)\n    if (stat.isSymbolicLink()) {\n      links.push({file: destinationFile, link: await readlink(sourceFile)})\n      continue\n    }\n\n    const fileParent = path.dirname(destinationFile)\n    if (!createdParentDirs.has(fileParent)) {\n      createdParentDirs.add(fileParent)\n      await ensureDir(fileParent)\n    }\n\n    taskManager.addTask(fileCopier.copy(sourceFile, destinationFile, stat))\n    if (taskManager.tasks.length > MAX_FILE_REQUESTS) {\n      await taskManager.awaitTasks()\n    }\n  }\n\n  if (taskManager.tasks.length > 0) {\n    await taskManager.awaitTasks()\n  }\n  if (links.length > 0) {\n    await BluebirdPromise.map(links, it => symlink(it.link, it.file), CONCURRENCY)\n  }\n}\n\n// os path separator is used\nexport interface ResolvedFileSet {\n  src: string\n  destination: string\n\n  files: Array<string>\n  metadata: Map<string, Stats>\n  transformedFiles?: Map<number, string | Buffer> | null\n}\n\n// used only for ASAR, if no asar, file transformed on the fly\nexport async function transformFiles(transformer: FileTransformer, fileSet: ResolvedFileSet): Promise<void> {\n  if (transformer == null) {\n    return\n  }\n\n  let transformedFiles = fileSet.transformedFiles\n  if (fileSet.transformedFiles == null) {\n    transformedFiles = new Map()\n    fileSet.transformedFiles = transformedFiles\n  }\n\n  const metadata = fileSet.metadata\n  await BluebirdPromise.filter(fileSet.files, (it, index) => {\n    const fileStat = metadata.get(it)\n    if (fileStat == null || !fileStat.isFile()) {\n      return false\n    }\n\n    const transformedValue = transformer(it)\n    if (transformedValue == null) {\n      return false\n    }\n\n    if (typeof transformedValue === \"object\" && \"then\" in transformedValue) {\n      return (transformedValue as Promise<any>)\n        .then(it => {\n          if (it != null) {\n            transformedFiles!!.set(index, it)\n          }\n          return false\n        })\n    }\n    transformedFiles!!.set(index, transformedValue as string | Buffer)\n    return false\n  }, CONCURRENCY)\n}\n\nexport async function computeFileSets(matchers: Array<FileMatcher>, transformer: FileTransformer | null, platformPackager: PlatformPackager<any>, isElectronCompile: boolean): Promise<Array<ResolvedFileSet>> {\n  const fileSets: Array<ResolvedFileSet> = []\n  const packager = platformPackager.info\n\n  for (const matcher of matchers) {\n    const fileWalker = new AppFileWalker(matcher, packager)\n\n    const fromStat = await statOrNull(matcher.from)\n    if (fromStat == null) {\n      log.debug({directory: matcher.from, reason: \"doesn't exist\"}, `skipped copying`)\n      continue\n    }\n\n    const files = await walk(matcher.from, fileWalker.filter, fileWalker)\n    const metadata = fileWalker.metadata\n    fileSets.push(validateFileSet({src: matcher.from, files, metadata, destination: matcher.to}))\n  }\n\n  if (isElectronCompile) {\n    // cache files should be first (better IO)\n    fileSets.unshift(await compileUsingElectronCompile(fileSets[0], packager))\n  }\n  return fileSets\n}\n\nfunction getNodeModuleExcludedExts(platformPackager: PlatformPackager<any>) {\n  // do not exclude *.h files (https://github.com/electron-userland/electron-builder/issues/2852)\n  const result = [\".o\", \".obj\"].concat(excludedExts.split(\",\").map(it => `.${it}`))\n  if (platformPackager.config.includePdb !== true) {\n    result.push(\".pdb\")\n  }\n  if (platformPackager.platform !== Platform.WINDOWS) {\n    // https://github.com/electron-userland/electron-builder/issues/1738\n    result.push(\".dll\")\n    result.push(\".exe\")\n  }\n  return result\n}\n\nfunction validateFileSet(fileSet: ResolvedFileSet): ResolvedFileSet {\n  if (fileSet.src == null || fileSet.src.length === 0) {\n    throw new Error(\"fileset src is empty\")\n  }\n  return fileSet\n}\n\n/** @internal */\nexport async function computeNodeModuleFileSets(platformPackager: PlatformPackager<any>, mainMatcher: FileMatcher): Promise<Array<ResolvedFileSet>> {\n  const args = [\"node-dep-tree\", \"--dir\", platformPackager.info.appDir]\n  if (platformPackager.info.framework.getExcludedDependencies != null) {\n    const excludedDependencies = platformPackager.info.framework.getExcludedDependencies(platformPackager.platform)\n    if (excludedDependencies != null) {\n      for (const name of excludedDependencies) {\n        args.push(\"--exclude-dep\", name)\n      }\n    }\n  }\n\n  const deps = await executeAppBuilderAsJson<Array<any>>(args)\n  const nodeModuleExcludedExts = getNodeModuleExcludedExts(platformPackager)\n  // mapSeries instead of map because copyNodeModules is concurrent and so, no need to increase queue/pressure\n  return await BluebirdPromise.mapSeries(deps, async info => {\n    const source = info.dir\n    let destination: string\n    if (source.length > mainMatcher.from.length && source.startsWith(mainMatcher.from) && source[mainMatcher.from.length] === path.sep) {\n      destination = getDestinationPath(source, {src: mainMatcher.from, destination: mainMatcher.to, files: [], metadata: null as any})\n    }\n    else {\n      destination = mainMatcher.to + path.sep + \"node_modules\"\n    }\n\n    // use main matcher patterns, so, user can exclude some files in such hoisted node modules\n    // source here includes node_modules, but pattern base should be without because users expect that pattern \"!node_modules/loot-core/src{,/**/*}\" will work\n    const matcher = new FileMatcher(path.dirname(source), destination, mainMatcher.macroExpander, mainMatcher.patterns)\n    const copier = new NodeModuleCopyHelper(matcher, platformPackager.info)\n    const names = info.deps\n    const files = await copier.collectNodeModules(source, names, nodeModuleExcludedExts)\n    return validateFileSet({src: source, destination, files, metadata: copier.metadata})\n  })\n}\n\nasync function compileUsingElectronCompile(mainFileSet: ResolvedFileSet, packager: Packager): Promise<ResolvedFileSet> {\n  log.info(\"compiling using electron-compile\")\n\n  const electronCompileCache = await packager.tempDirManager.getTempDir({prefix: \"electron-compile-cache\"})\n  const cacheDir = path.join(electronCompileCache, \".cache\")\n  // clear and create cache dir\n  await ensureDir(cacheDir)\n  const compilerHost = await createElectronCompilerHost(mainFileSet.src, cacheDir)\n  const nextSlashIndex = mainFileSet.src.length + 1\n  // pre-compute electron-compile to cache dir - we need to process only subdirectories, not direct files of app dir\n  await BluebirdPromise.map(mainFileSet.files, file => {\n    if (file.includes(NODE_MODULES_PATTERN) || file.includes(BOWER_COMPONENTS_PATTERN)\n      || !file.includes(path.sep, nextSlashIndex) // ignore not root files\n      || !mainFileSet.metadata.get(file)!.isFile()) {\n      return null\n    }\n    return compilerHost.compile(file)\n      .then(() => null)\n  }, CONCURRENCY)\n\n  await compilerHost.saveConfiguration()\n\n  const metadata = new Map<string, Stats>()\n  const cacheFiles = await walk(cacheDir, file => !file.startsWith(\".\"), {\n    consume: (file, fileStat) => {\n      if (fileStat.isFile()) {\n        metadata.set(file, fileStat)\n      }\n      return null\n    }\n  })\n\n  // add shim\n  const shimPath = `${mainFileSet.src}${path.sep}${ELECTRON_COMPILE_SHIM_FILENAME}`\n  mainFileSet.files.push(shimPath)\n  mainFileSet.metadata.set(shimPath, {isFile: () => true, isDirectory: () => false, isSymbolicLink: () => false} as any)\n  if (mainFileSet.transformedFiles == null) {\n    mainFileSet.transformedFiles = new Map()\n  }\n  mainFileSet.transformedFiles.set(mainFileSet.files.length - 1, `\n'use strict';\nrequire('electron-compile').init(__dirname, require('path').resolve(__dirname, '${packager.metadata.main || \"index\"}'), true);\n`)\n  return {src: electronCompileCache, files: cacheFiles, metadata, destination: mainFileSet.destination}\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.computeEnv = computeEnv;
exports.computeToolEnv = computeToolEnv;

function computeEnv(oldValue, newValues) {
  const parsedOldValue = oldValue ? oldValue.split(":") : [];
  return newValues.concat(parsedOldValue).filter(it => it.length > 0).join(":");
}

function computeToolEnv(libPath) {
  // noinspection SpellCheckingInspection
  return Object.assign({}, process.env, {
    DYLD_LIBRARY_PATH: computeEnv(process.env.DYLD_LIBRARY_PATH, libPath)
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=bundledTool.js.map{"version":3,"sources":["../../src/util/bundledTool.ts"],"names":[],"mappings":";;;;;;;;AAKM,SAAU,UAAV,CAAqB,QAArB,EAA0D,SAA1D,EAAkF;AACtF,QAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC,KAAT,CAAe,GAAf,CAAH,GAAyB,EAAxD;AACA,SAAO,SAAS,CAAC,MAAV,CAAiB,cAAjB,EAAiC,MAAjC,CAAwC,EAAE,IAAI,EAAE,CAAC,MAAH,GAAY,CAA1D,EAA6D,IAA7D,CAAkE,GAAlE,CAAP;AACD;;AAEK,SAAU,cAAV,CAAyB,OAAzB,EAA+C;AACnD;AACA,SAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACK,OAAO,CAAC,GADb,EACgB;AACd,IAAA,iBAAiB,EAAE,UAAU,CAAC,OAAO,CAAC,GAAR,CAAY,iBAAb,EAAgC,OAAhC;AADf,GADhB,CAAA;AAID,C","sourcesContent":["export interface ToolInfo {\n  path: string\n  env?: any\n}\n\nexport function computeEnv(oldValue: string | null | undefined, newValues: Array<string>): string {\n  const parsedOldValue = oldValue ? oldValue.split(\":\") : []\n  return newValues.concat(parsedOldValue).filter(it => it.length > 0).join(\":\")\n}\n\nexport function computeToolEnv(libPath: Array<string>): any {\n  // noinspection SpellCheckingInspection\n  return {\n    ...process.env,\n    DYLD_LIBRARY_PATH: computeEnv(process.env.DYLD_LIBRARY_PATH, libPath)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.digest = digest;
exports.BuildCacheManager = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class BuildCacheManager {
  constructor(outDir, executableFile, arch) {
    this.executableFile = executableFile;
    this.cacheInfo = null;
    this.newDigest = null;
    this.cacheDir = path.join(outDir, ".cache", _builderUtil().Arch[arch]);
    this.cacheFile = path.join(this.cacheDir, "app.exe");
    this.cacheInfoFile = path.join(this.cacheDir, "info.json");
  }

  copyIfValid(digest) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      _this.newDigest = digest;
      _this.cacheInfo = yield (0, _promise().orNullIfFileNotExist)((0, _fsExtraP().readJson)(_this.cacheInfoFile));
      const oldDigest = _this.cacheInfo == null ? null : _this.cacheInfo.executableDigest;

      if (oldDigest !== digest) {
        _builderUtil().log.debug({
          oldDigest,
          newDigest: digest
        }, "no valid cached executable found");

        return false;
      }

      _builderUtil().log.debug({
        cacheFile: _this.cacheFile,
        file: _this.executableFile
      }, `copying cached executable`);

      try {
        yield (0, _fs().copyFile)(_this.cacheFile, _this.executableFile, false);
        return true;
      } catch (e) {
        if (e.code === "ENOENT" || e.code === "ENOTDIR") {
          _builderUtil().log.debug({
            error: e.code
          }, "copy cached executable failed");
        } else {
          _builderUtil().log.warn({
            error: e.stack || e
          }, `cannot copy cached executable`);
        }
      }

      return false;
    })();
  }

  save() {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (_this2.newDigest == null) {
        throw new Error("call copyIfValid before");
      }

      if (_this2.cacheInfo == null) {
        _this2.cacheInfo = {
          executableDigest: _this2.newDigest
        };
      } else {
        _this2.cacheInfo.executableDigest = _this2.newDigest;
      }

      try {
        yield (0, _fsExtraP().ensureDir)(_this2.cacheDir);
        yield Promise.all([(0, _fsExtraP().writeJson)(_this2.cacheInfoFile, _this2.cacheInfo), (0, _fs().copyFile)(_this2.executableFile, _this2.cacheFile, false)]);
      } catch (e) {
        _builderUtil().log.warn({
          error: e.stack || e
        }, `cannot save build cache`);
      }
    })();
  }

}

exports.BuildCacheManager = BuildCacheManager;
BuildCacheManager.VERSION = "0";

function digest(_x, _x2) {
  return _digest.apply(this, arguments);
} function _digest() {
  _digest = (0, _bluebirdLst().coroutine)(function* (hash, files) {
    // do not use pipe - better do bulk file read (https://github.com/yarnpkg/yarn/commit/7a63e0d23c46a4564bc06645caf8a59690f04d01)
    for (const content of yield _bluebirdLst().default.map(files, it => (0, _fsExtraP().readFile)(it))) {
      hash.update(content);
    }

    hash.update(BuildCacheManager.VERSION);
    return hash.digest("base64");
  });
  return _digest.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=cacheManager.js.map{"version":3,"sources":["../../src/util/cacheManager.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, log } from \"builder-util\"\nimport { copyFile } from \"builder-util/out/fs\"\nimport { orNullIfFileNotExist } from \"builder-util/out/promise\"\nimport { Hash } from \"crypto\"\nimport { ensureDir, readFile, readJson, writeJson } from \"fs-extra-p\"\nimport * as path from \"path\"\n\nexport interface BuildCacheInfo {\n  executableDigest: string\n}\n\nexport class BuildCacheManager {\n  static VERSION: string = \"0\"\n\n  readonly cacheDir: string\n  readonly cacheInfoFile: string\n  readonly cacheFile: string\n\n  cacheInfo: BuildCacheInfo | null = null\n\n  private newDigest: string | null = null\n\n  constructor(outDir: string, private readonly executableFile: string, arch: Arch) {\n    this.cacheDir = path.join(outDir, \".cache\", Arch[arch])\n    this.cacheFile = path.join(this.cacheDir, \"app.exe\")\n    this.cacheInfoFile = path.join(this.cacheDir, \"info.json\")\n  }\n\n  async copyIfValid(digest: string): Promise<boolean> {\n    this.newDigest = digest\n\n    this.cacheInfo = await orNullIfFileNotExist(readJson(this.cacheInfoFile))\n    const oldDigest = this.cacheInfo == null ? null : this.cacheInfo.executableDigest\n    if (oldDigest !== digest) {\n      log.debug({oldDigest, newDigest: digest}, \"no valid cached executable found\")\n      return false\n    }\n\n    log.debug({cacheFile: this.cacheFile, file: this.executableFile}, `copying cached executable`)\n    try {\n      await copyFile(this.cacheFile, this.executableFile, false)\n      return true\n    }\n    catch (e) {\n      if (e.code === \"ENOENT\" || e.code === \"ENOTDIR\") {\n        log.debug({error: e.code}, \"copy cached executable failed\")\n      }\n      else {\n        log.warn({error: e.stack || e}, `cannot copy cached executable`)\n      }\n    }\n    return false\n  }\n\n  async save() {\n    if (this.newDigest == null) {\n      throw new Error(\"call copyIfValid before\")\n    }\n\n    if (this.cacheInfo == null) {\n      this.cacheInfo = {executableDigest: this.newDigest}\n    }\n    else {\n      this.cacheInfo.executableDigest = this.newDigest\n    }\n\n    try {\n      await ensureDir(this.cacheDir)\n      await Promise.all([writeJson(this.cacheInfoFile, this.cacheInfo), copyFile(this.executableFile, this.cacheFile, false)])\n    }\n    catch (e) {\n      log.warn({error: e.stack || e}, `cannot save build cache`)\n    }\n  }\n}\n\nexport async function digest(hash: Hash, files: Array<string>) {\n  // do not use pipe - better do bulk file read (https://github.com/yarnpkg/yarn/commit/7a63e0d23c46a4564bc06645caf8a59690f04d01)\n  for (const content of await BluebirdPromise.map(files, it => readFile(it))) {\n    hash.update(content)\n  }\n\n  hash.update(BuildCacheManager.VERSION)\n  return hash.digest(\"base64\")\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getConfig = getConfig;
exports.doMergeConfigs = doMergeConfigs;
exports.validateConfig = validateConfig;
exports.computeDefaultAppDirectory = computeDefaultAppDirectory;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _readConfigFile() {
  const data = require("read-config-file");

  _readConfigFile = function () {
    return data;
  };

  return data;
}

function _rectCra() {
  const data = require("../presets/rectCra");

  _rectCra = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

// https://github.com/electron-userland/electron-builder/issues/1847
function mergePublish(config, configFromOptions) {
  // if config from disk doesn't have publish (or object), no need to handle, it will be simply merged by deepAssign
  const publish = Array.isArray(config.publish) ? configFromOptions.publish : null;

  if (publish != null) {
    delete configFromOptions.publish;
  }

  (0, _builderUtil().deepAssign)(config, configFromOptions);

  if (publish == null) {
    return;
  }

  const listOnDisk = config.publish;

  if (listOnDisk.length === 0) {
    config.publish = publish;
  } else {
    // apply to first
    Object.assign(listOnDisk[0], publish);
  }
}

function getConfig(_x, _x2, _x3) {
  return _getConfig2.apply(this, arguments);
} // normalize for easy merge


function _getConfig2() {
  _getConfig2 = (0, _bluebirdLst().coroutine)(function* (projectDir, configPath, configFromOptions, packageMetadata = new (_lazyVal().Lazy)(() => (0, _readConfigFile().orNullIfFileNotExist)((0, _fsExtraP().readJson)(path.join(projectDir, "package.json"))))) {
    const configRequest = {
      packageKey: "build",
      configFilename: "electron-builder",
      projectDir,
      packageMetadata
    };
    const configAndEffectiveFile = yield (0, _readConfigFile().getConfig)(configRequest, configPath);
    const config = configAndEffectiveFile == null ? {} : configAndEffectiveFile.result;

    if (configFromOptions != null) {
      mergePublish(config, configFromOptions);
    }

    if (configAndEffectiveFile != null) {
      _builderUtil().log.info({
        file: configAndEffectiveFile.configFile == null ? 'package.json ("build" field)' : configAndEffectiveFile.configFile
      }, "loaded configuration");
    }

    if (config.extends == null && config.extends !== null) {
      const metadata = (yield packageMetadata.value) || {};
      const devDependencies = metadata.devDependencies;
      const dependencies = metadata.dependencies;

      if (dependencies != null && "react-scripts" in dependencies || devDependencies != null && "react-scripts" in devDependencies) {
        config.extends = "react-cra";
      } else if (devDependencies != null && "electron-webpack" in devDependencies) {
        let file = "electron-webpack/out/electron-builder.js";

        try {
          file = require.resolve(file);
        } catch (ignore) {
          file = require.resolve("electron-webpack/electron-builder.yml");
        }

        config.extends = `file:${file}`;
      }
    }

    let parentConfig;

    if (config.extends === "react-cra") {
      parentConfig = yield (0, _rectCra().reactCra)(projectDir);

      _builderUtil().log.info({
        preset: config.extends
      }, "loaded parent configuration");
    } else if (config.extends != null) {
      const parentConfigAndEffectiveFile = yield (0, _readConfigFile().loadParentConfig)(configRequest, config.extends);

      _builderUtil().log.info({
        file: parentConfigAndEffectiveFile.configFile
      }, "loaded parent configuration");

      parentConfig = parentConfigAndEffectiveFile.result;
    } else {
      parentConfig = null;
    }

    return doMergeConfigs(config, parentConfig);
  });
  return _getConfig2.apply(this, arguments);
}

function normalizeFiles(configuration, name) {
  let value = configuration[name];

  if (value == null) {
    return;
  }

  if (!Array.isArray(value)) {
    value = [value];
  }

  itemLoop: for (let i = 0; i < value.length; i++) {
    let item = value[i];

    if (typeof item === "string") {
      // merge with previous if possible
      if (i !== 0) {
        let prevItemIndex = i - 1;
        let prevItem;

        do {
          prevItem = value[prevItemIndex--];
        } while (prevItem == null);

        if (prevItem.from == null && prevItem.to == null) {
          if (prevItem.filter == null) {
            prevItem.filter = [item];
          } else {
            prevItem.filter.push(item);
          }

          value[i] = null;
          continue itemLoop;
        }
      }

      item = {
        filter: [item]
      };
      value[i] = item;
    } else if (Array.isArray(item)) {
      throw new Error(`${name} configuration is invalid, nested array not expected for index ${i}: ` + item);
    } // make sure that merge logic is not complex - unify different presentations


    if (item.from === ".") {
      item.from = undefined;
    }

    if (item.to === ".") {
      item.to = undefined;
    }

    if (item.filter != null && typeof item.filter === "string") {
      item.filter = [item.filter];
    }
  }

  configuration[name] = value.filter(it => it != null);
}

function mergeFiles(configuration, parentConfiguration, mergedConfiguration, name) {
  const list = configuration[name];
  const parentList = parentConfiguration[name];

  if (list == null || parentList == null) {
    return;
  }

  const result = list.slice();
  mergedConfiguration[name] = result;

  itemLoop: for (const item of parentConfiguration.files) {
    for (const existingItem of list) {
      if (existingItem.from === item.from && existingItem.to === item.to) {
        if (item.filter != null) {
          if (existingItem.filter == null) {
            existingItem.filter = item.filter.slice();
          } else {
            existingItem.filter = item.filter.concat(existingItem.filter);
          }
        }

        continue itemLoop;
      }
    } // existing item not found, simply add


    result.push(item);
  }
}

function doMergeConfigs(configuration, parentConfiguration) {
  normalizeFiles(configuration, "files");
  normalizeFiles(configuration, "extraFiles");
  normalizeFiles(configuration, "extraResources");

  if (parentConfiguration == null) {
    return (0, _builderUtil().deepAssign)(getDefaultConfig(), configuration);
  }

  normalizeFiles(parentConfiguration, "files");
  normalizeFiles(parentConfiguration, "extraFiles");
  normalizeFiles(parentConfiguration, "extraResources");
  const result = (0, _builderUtil().deepAssign)(getDefaultConfig(), parentConfiguration, configuration);
  mergeFiles(configuration, parentConfiguration, result, "files");
  return result;
}

function getDefaultConfig() {
  return {
    directories: {
      output: "dist",
      buildResources: "build"
    }
  };
}

const schemeDataPromise = new (_lazyVal().Lazy)(() => (0, _fsExtraP().readJson)(path.join(__dirname, "..", "..", "scheme.json")));

function validateConfig(_x4, _x5) {
  return _validateConfig2.apply(this, arguments);
}

function _validateConfig2() {
  _validateConfig2 = (0, _bluebirdLst().coroutine)(function* (config, debugLogger) {
    const extraMetadata = config.extraMetadata;

    if (extraMetadata != null) {
      if (extraMetadata.build != null) {
        throw new (_builderUtil().InvalidConfigurationError)(`--em.build is deprecated, please specify as -c"`);
      }

      if (extraMetadata.directories != null) {
        throw new (_builderUtil().InvalidConfigurationError)(`--em.directories is deprecated, please specify as -c.directories"`);
      }
    } // noinspection JSDeprecatedSymbols


    if (config.npmSkipBuildFromSource === false) {
      config.buildDependenciesFromSource = false;
    }

    yield (0, _readConfigFile().validateConfig)(config, schemeDataPromise, (message, errors) => {
      if (debugLogger.isEnabled) {
        debugLogger.add("invalidConfig", JSON.stringify(errors, null, 2));
      }

      return `${message}

How to fix:
1. Open https://electron.build/configuration/configuration
2. Search the option name on the page.
  * Not found? The option was deprecated or not exists (check spelling).
  * Found? Check that the option in the appropriate place. e.g. "title" only in the "dmg", not in the root.
`;
    });
  });
  return _validateConfig2.apply(this, arguments);
}

const DEFAULT_APP_DIR_NAMES = ["app", "www"];

function computeDefaultAppDirectory(_x6, _x7) {
  return _computeDefaultAppDirectory.apply(this, arguments);
} function _computeDefaultAppDirectory() {
  _computeDefaultAppDirectory = (0, _bluebirdLst().coroutine)(function* (projectDir, userAppDir) {
    if (userAppDir != null) {
      const absolutePath = path.resolve(projectDir, userAppDir);
      const stat = yield (0, _fs().statOrNull)(absolutePath);

      if (stat == null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Application directory ${userAppDir} doesn't exist`);
      } else if (!stat.isDirectory()) {
        throw new (_builderUtil().InvalidConfigurationError)(`Application directory ${userAppDir} is not a directory`);
      } else if (projectDir === absolutePath) {
        _builderUtil().log.warn({
          appDirectory: userAppDir
        }, `Specified application directory equals to project dir â€” superfluous or wrong configuration`);
      }

      return absolutePath;
    }

    for (const dir of DEFAULT_APP_DIR_NAMES) {
      const absolutePath = path.join(projectDir, dir);
      const packageJson = path.join(absolutePath, "package.json");
      const stat = yield (0, _fs().statOrNull)(packageJson);

      if (stat != null && stat.isFile()) {
        return absolutePath;
      }
    }

    return projectDir;
  });
  return _computeDefaultAppDirectory.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=config.js.map{"version":3,"sources":["../../src/util/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { DebugLogger, deepAssign, InvalidConfigurationError, log } from \"builder-util\"\nimport { statOrNull } from \"builder-util/out/fs\"\nimport { readJson } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { getConfig as _getConfig, loadParentConfig, orNullIfFileNotExist, ReadConfigRequest, validateConfig as _validateConfig } from \"read-config-file\"\nimport { FileSet } from \"..\"\nimport { Configuration } from \"../configuration\"\nimport { reactCra } from \"../presets/rectCra\"\n\n// https://github.com/electron-userland/electron-builder/issues/1847\nfunction mergePublish(config: Configuration, configFromOptions: Configuration) {\n  // if config from disk doesn't have publish (or object), no need to handle, it will be simply merged by deepAssign\n  const publish = Array.isArray(config.publish) ? configFromOptions.publish : null\n  if (publish != null) {\n    delete (configFromOptions as any).publish\n  }\n\n  deepAssign(config, configFromOptions)\n\n  if (publish == null) {\n    return\n  }\n\n  const listOnDisk = config.publish as Array<any>\n  if (listOnDisk.length === 0) {\n    config.publish = publish\n  }\n  else {\n    // apply to first\n    Object.assign(listOnDisk[0], publish)\n  }\n}\n\nexport async function getConfig(projectDir: string,\n                                configPath: string | null,\n                                configFromOptions: Configuration | null | undefined,\n                                packageMetadata: Lazy<{ [key: string]: any } | null> = new Lazy(() => orNullIfFileNotExist(readJson(path.join(projectDir, \"package.json\"))))): Promise<Configuration> {\n  const configRequest: ReadConfigRequest = {packageKey: \"build\", configFilename: \"electron-builder\", projectDir, packageMetadata}\n  const configAndEffectiveFile = await _getConfig<Configuration>(configRequest, configPath)\n  const config = configAndEffectiveFile == null ? {} : configAndEffectiveFile.result\n  if (configFromOptions != null) {\n    mergePublish(config, configFromOptions)\n  }\n\n  if (configAndEffectiveFile != null) {\n    log.info({file: configAndEffectiveFile.configFile == null ? 'package.json (\"build\" field)' : configAndEffectiveFile.configFile}, \"loaded configuration\")\n  }\n\n  if (config.extends == null && config.extends !== null) {\n    const metadata = await packageMetadata.value || {}\n    const devDependencies = metadata.devDependencies\n    const dependencies = metadata.dependencies\n    if ((dependencies != null && \"react-scripts\" in dependencies) || (devDependencies != null && \"react-scripts\" in devDependencies)) {\n      config.extends = \"react-cra\"\n    }\n    else if (devDependencies != null && \"electron-webpack\" in devDependencies) {\n      let file = \"electron-webpack/out/electron-builder.js\"\n      try {\n        file = require.resolve(file)\n      }\n      catch (ignore) {\n        file = require.resolve(\"electron-webpack/electron-builder.yml\")\n      }\n      config.extends = `file:${file}`\n    }\n  }\n\n  let parentConfig: Configuration | null\n  if (config.extends === \"react-cra\") {\n    parentConfig = await reactCra(projectDir)\n    log.info({preset: config.extends}, \"loaded parent configuration\")\n  }\n  else if (config.extends != null) {\n    const parentConfigAndEffectiveFile = await loadParentConfig<Configuration>(configRequest, config.extends)\n    log.info({file: parentConfigAndEffectiveFile.configFile}, \"loaded parent configuration\")\n    parentConfig = parentConfigAndEffectiveFile.result\n  }\n  else {\n    parentConfig = null\n  }\n\n  return doMergeConfigs(config, parentConfig)\n}\n\n// normalize for easy merge\nfunction normalizeFiles(configuration: Configuration, name: \"files\" | \"extraFiles\" | \"extraResources\") {\n  let value = configuration[name]\n  if (value == null) {\n    return\n  }\n\n  if (!Array.isArray(value)) {\n    value = [value]\n  }\n\n  itemLoop: for (let i = 0; i < value.length; i++) {\n    let item = value[i]\n    if (typeof item === \"string\") {\n      // merge with previous if possible\n      if (i !== 0) {\n        let prevItemIndex = i - 1\n        let prevItem: FileSet\n        do {\n          prevItem = value[prevItemIndex--] as FileSet\n        } while (prevItem == null)\n\n        if (prevItem.from == null && prevItem.to == null) {\n          if (prevItem.filter == null) {\n            prevItem.filter = [item]\n          }\n          else {\n            (prevItem.filter as Array<string>).push(item)\n          }\n          value[i] = null as any\n          continue itemLoop\n        }\n      }\n\n      item = {\n        filter: [item],\n      }\n      value[i] = item\n    }\n    else if (Array.isArray(item)) {\n      throw new Error(`${name} configuration is invalid, nested array not expected for index ${i}: ` + item)\n    }\n\n    // make sure that merge logic is not complex - unify different presentations\n    if (item.from === \".\") {\n      item.from = undefined\n    }\n\n    if (item.to === \".\") {\n      item.to = undefined\n    }\n\n    if (item.filter != null && typeof item.filter === \"string\") {\n      item.filter = [item.filter]\n    }\n  }\n\n  configuration[name] = value.filter(it => it != null)\n}\n\nfunction mergeFiles(configuration: Configuration, parentConfiguration: Configuration, mergedConfiguration: Configuration, name: \"files\" | \"extraFiles\" | \"extraResources\") {\n  const list = configuration[name] as Array<FileSet> | null\n  const parentList = parentConfiguration[name] as Array<FileSet> | null\n  if (list == null || parentList == null) {\n    return\n  }\n\n  const result = list.slice()\n  mergedConfiguration[name] = result\n\n  itemLoop: for (const item of parentConfiguration.files as Array<FileSet>) {\n    for (const existingItem of list) {\n      if (existingItem.from === item.from && existingItem.to === item.to) {\n        if (item.filter != null) {\n          if (existingItem.filter == null) {\n            existingItem.filter = item.filter.slice()\n          }\n          else {\n            existingItem.filter = (item.filter as Array<string>).concat(existingItem.filter)\n          }\n        }\n\n        continue itemLoop\n      }\n    }\n\n    // existing item not found, simply add\n    result.push(item)\n  }\n}\n\nexport function doMergeConfigs(configuration: Configuration, parentConfiguration: Configuration | null) {\n  normalizeFiles(configuration, \"files\")\n  normalizeFiles(configuration, \"extraFiles\")\n  normalizeFiles(configuration, \"extraResources\")\n\n  if (parentConfiguration == null) {\n    return deepAssign(getDefaultConfig(), configuration)\n  }\n\n  normalizeFiles(parentConfiguration, \"files\")\n  normalizeFiles(parentConfiguration, \"extraFiles\")\n  normalizeFiles(parentConfiguration, \"extraResources\")\n\n  const result = deepAssign(getDefaultConfig(), parentConfiguration, configuration)\n  mergeFiles(configuration, parentConfiguration, result, \"files\")\n  return result\n}\n\nfunction getDefaultConfig(): Configuration {\n  return {\n    directories: {\n      output: \"dist\",\n      buildResources: \"build\",\n    },\n  }\n}\n\nconst schemeDataPromise = new Lazy(() => readJson(path.join(__dirname, \"..\", \"..\", \"scheme.json\")))\n\nexport async function validateConfig(config: Configuration, debugLogger: DebugLogger) {\n  const extraMetadata = config.extraMetadata\n  if (extraMetadata != null) {\n    if (extraMetadata.build != null) {\n      throw new InvalidConfigurationError(`--em.build is deprecated, please specify as -c\"`)\n    }\n    if (extraMetadata.directories != null) {\n      throw new InvalidConfigurationError(`--em.directories is deprecated, please specify as -c.directories\"`)\n    }\n  }\n\n  // noinspection JSDeprecatedSymbols\n  if (config.npmSkipBuildFromSource === false) {\n    config.buildDependenciesFromSource = false\n  }\n\n  await _validateConfig(config, schemeDataPromise, (message, errors) => {\n    if (debugLogger.isEnabled) {\n      debugLogger.add(\"invalidConfig\", JSON.stringify(errors, null, 2))\n    }\n\n    return `${message}\n\nHow to fix:\n1. Open https://electron.build/configuration/configuration\n2. Search the option name on the page.\n  * Not found? The option was deprecated or not exists (check spelling).\n  * Found? Check that the option in the appropriate place. e.g. \"title\" only in the \"dmg\", not in the root.\n`\n  })\n}\n\nconst DEFAULT_APP_DIR_NAMES = [\"app\", \"www\"]\n\nexport async function computeDefaultAppDirectory(projectDir: string, userAppDir: string | null | undefined): Promise<string> {\n  if (userAppDir != null) {\n    const absolutePath = path.resolve(projectDir, userAppDir)\n    const stat = await statOrNull(absolutePath)\n    if (stat == null) {\n      throw new InvalidConfigurationError(`Application directory ${userAppDir} doesn't exist`)\n    }\n    else if (!stat.isDirectory()) {\n      throw new InvalidConfigurationError(`Application directory ${userAppDir} is not a directory`)\n    }\n    else if (projectDir === absolutePath) {\n      log.warn({appDirectory: userAppDir}, `Specified application directory equals to project dir â€” superfluous or wrong configuration`)\n    }\n    return absolutePath\n  }\n\n  for (const dir of DEFAULT_APP_DIR_NAMES) {\n    const absolutePath = path.join(projectDir, dir)\n    const packageJson = path.join(absolutePath, \"package.json\")\n    const stat = await statOrNull(packageJson)\n    if (stat != null && stat.isFile()) {\n      return absolutePath\n    }\n  }\n  return projectDir\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.hasMagic = hasMagic;
exports.createFilter = createFilter;

var path = _interopRequireWildcard(require("path"));

function _fileTransformer() {
  const data = require("../fileTransformer");

  _fileTransformer = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/** @internal */
function hasMagic(pattern) {
  const set = pattern.set;

  if (set.length > 1) {
    return true;
  }

  for (const i of set[0]) {
    if (typeof i !== "string") {
      return true;
    }
  }

  return false;
} // sometimes, destination may not contain path separator in the end (path to folder), but the src does. So let's ensure paths have path separators in the end


function ensureEndSlash(s) {
  return s.length === 0 || s.endsWith(path.sep) ? s : s + path.sep;
}

function getRelativePath(file, srcWithEndSlash) {
  if (!file.startsWith(srcWithEndSlash)) {
    const index = file.indexOf(_fileTransformer().NODE_MODULES_PATTERN);

    if (index < 0) {
      throw new Error(`${file} must be under ${srcWithEndSlash}`);
    } else {
      return file.substring(index + 1
      /* leading slash */
      );
    }
  }

  let relative = file.substring(srcWithEndSlash.length);

  if (path.sep === "\\") {
    if (relative.startsWith("\\")) {
      // windows problem: double backslash, the above substring call removes root path with a single slash, so here can me some leftovers
      relative = relative.substring(1);
    }

    relative = relative.replace(/\\/g, "/");
  }

  return relative;
}
/** @internal */


function createFilter(src, patterns, excludePatterns) {
  const srcWithEndSlash = ensureEndSlash(src);
  return (file, stat) => {
    if (src === file) {
      return true;
    }

    const relative = getRelativePath(file, srcWithEndSlash); // https://github.com/electron-userland/electron-builder/issues/867

    return minimatchAll(relative, patterns, stat) && (excludePatterns == null || stat.isDirectory() || !minimatchAll(relative, excludePatterns, stat));
  };
} // https://github.com/joshwnj/minimatch-all/blob/master/index.js


function minimatchAll(path, patterns, stat) {
  let match = false;

  for (const pattern of patterns) {
    // If we've got a match, only re-test for exclusions.
    // if we don't have a match, only re-test for inclusions.
    if (match !== pattern.negate) {
      continue;
    } // partial match â€” pattern: foo/bar.txt path: foo â€” we must allow foo
    // use it only for non-negate patterns: const m = new Minimatch("!node_modules/@(electron-download|electron)/**/*", {dot: true }); m.match("node_modules", true) will return false, but must be true


    match = pattern.match(path, stat.isDirectory() && !pattern.negate);
  }

  return match;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=filter.js.map{"version":3,"sources":["../../src/util/filter.ts"],"names":[],"mappings":";;;;;;;;AAGA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEA;AACM,SAAU,QAAV,CAAmB,OAAnB,EAAqC;AACzC,QAAM,GAAG,GAAG,OAAO,CAAC,GAApB;;AACA,MAAI,GAAG,CAAC,MAAJ,GAAa,CAAjB,EAAoB;AAClB,WAAO,IAAP;AACD;;AAED,OAAK,MAAM,CAAX,IAAgB,GAAG,CAAC,CAAD,CAAnB,EAAwB;AACtB,QAAI,OAAO,CAAP,KAAa,QAAjB,EAA2B;AACzB,aAAO,IAAP;AACD;AACF;;AAED,SAAO,KAAP;AACD,C,CAED;;;AACA,SAAS,cAAT,CAAwB,CAAxB,EAAiC;AAC/B,SAAO,CAAC,CAAC,MAAF,KAAa,CAAb,IAAkB,CAAC,CAAC,QAAF,CAAW,IAAI,CAAC,GAAhB,CAAlB,GAAyC,CAAzC,GAA8C,CAAC,GAAG,IAAI,CAAC,GAA9D;AACD;;AAED,SAAS,eAAT,CAAyB,IAAzB,EAAuC,eAAvC,EAA8D;AAC5D,MAAI,CAAC,IAAI,CAAC,UAAL,CAAgB,eAAhB,CAAL,EAAuC;AACrC,UAAM,KAAK,GAAG,IAAI,CAAC,OAAL,CAAa,uCAAb,CAAd;;AACA,QAAI,KAAK,GAAG,CAAZ,EAAe;AACb,YAAM,IAAI,KAAJ,CAAU,GAAG,IAAI,kBAAkB,eAAe,EAAlD,CAAN;AACD,KAFD,MAGK;AACH,aAAO,IAAI,CAAC,SAAL,CAAe,KAAK,GAAG;AAAE;AAAzB,OAAP;AACD;AACF;;AAED,MAAI,QAAQ,GAAG,IAAI,CAAC,SAAL,CAAe,eAAe,CAAC,MAA/B,CAAf;;AACA,MAAI,IAAI,CAAC,GAAL,KAAa,IAAjB,EAAuB;AACrB,QAAI,QAAQ,CAAC,UAAT,CAAoB,IAApB,CAAJ,EAA+B;AAC7B;AACA,MAAA,QAAQ,GAAG,QAAQ,CAAC,SAAT,CAAmB,CAAnB,CAAX;AACD;;AACD,IAAA,QAAQ,GAAG,QAAQ,CAAC,OAAT,CAAiB,KAAjB,EAAwB,GAAxB,CAAX;AACD;;AACD,SAAO,QAAP;AACD;AAED;;;AACM,SAAU,YAAV,CAAuB,GAAvB,EAAoC,QAApC,EAAgE,eAAhE,EAAyG;AAC7G,QAAM,eAAe,GAAG,cAAc,CAAC,GAAD,CAAtC;AACA,SAAO,CAAC,IAAD,EAAO,IAAP,KAAe;AACpB,QAAI,GAAG,KAAK,IAAZ,EAAkB;AAChB,aAAO,IAAP;AACD;;AAED,UAAM,QAAQ,GAAG,eAAe,CAAC,IAAD,EAAO,eAAP,CAAhC,CALoB,CAMpB;;AACA,WAAO,YAAY,CAAC,QAAD,EAAW,QAAX,EAAqB,IAArB,CAAZ,KAA2C,eAAe,IAAI,IAAnB,IAA2B,IAAI,CAAC,WAAL,EAA3B,IAAiD,CAAC,YAAY,CAAC,QAAD,EAAW,eAAX,EAA4B,IAA5B,CAAzG,CAAP;AACD,GARD;AASD,C,CAED;;;AACA,SAAS,YAAT,CAAsB,IAAtB,EAAoC,QAApC,EAAgE,IAAhE,EAA2E;AACzE,MAAI,KAAK,GAAG,KAAZ;;AACA,OAAK,MAAM,OAAX,IAAsB,QAAtB,EAAgC;AAC9B;AACA;AACA,QAAI,KAAK,KAAK,OAAO,CAAC,MAAtB,EAA8B;AAC5B;AACD,KAL6B,CAO9B;AACA;;;AACA,IAAA,KAAK,GAAG,OAAO,CAAC,KAAR,CAAc,IAAd,EAAoB,IAAI,CAAC,WAAL,MAAsB,CAAC,OAAO,CAAC,MAAnD,CAAR;AACD;;AACD,SAAO,KAAP;AACD,C","sourcesContent":["import { Filter } from \"builder-util/out/fs\"\nimport { Stats } from \"fs-extra-p\"\nimport { Minimatch } from \"minimatch\"\nimport * as path from \"path\"\nimport { NODE_MODULES_PATTERN } from \"../fileTransformer\"\n\n/** @internal */\nexport function hasMagic(pattern: Minimatch) {\n  const set = pattern.set\n  if (set.length > 1) {\n    return true\n  }\n\n  for (const i of set[0]) {\n    if (typeof i !== \"string\") {\n      return true\n    }\n  }\n\n  return false\n}\n\n// sometimes, destination may not contain path separator in the end (path to folder), but the src does. So let's ensure paths have path separators in the end\nfunction ensureEndSlash(s: string) {\n  return s.length === 0 || s.endsWith(path.sep) ? s : (s + path.sep)\n}\n\nfunction getRelativePath(file: string, srcWithEndSlash: string) {\n  if (!file.startsWith(srcWithEndSlash)) {\n    const index = file.indexOf(NODE_MODULES_PATTERN)\n    if (index < 0) {\n      throw new Error(`${file} must be under ${srcWithEndSlash}`)\n    }\n    else {\n      return file.substring(index + 1 /* leading slash */)\n    }\n  }\n\n  let relative = file.substring(srcWithEndSlash.length)\n  if (path.sep === \"\\\\\") {\n    if (relative.startsWith(\"\\\\\")) {\n      // windows problem: double backslash, the above substring call removes root path with a single slash, so here can me some leftovers\n      relative = relative.substring(1)\n    }\n    relative = relative.replace(/\\\\/g, \"/\")\n  }\n  return relative\n}\n\n/** @internal */\nexport function createFilter(src: string, patterns: Array<Minimatch>, excludePatterns?: Array<Minimatch> | null): Filter {\n  const srcWithEndSlash = ensureEndSlash(src)\n  return (file, stat) => {\n    if (src === file) {\n      return true\n    }\n\n    const relative = getRelativePath(file, srcWithEndSlash)\n    // https://github.com/electron-userland/electron-builder/issues/867\n    return minimatchAll(relative, patterns, stat) && (excludePatterns == null || stat.isDirectory() || !minimatchAll(relative, excludePatterns, stat))\n  }\n}\n\n// https://github.com/joshwnj/minimatch-all/blob/master/index.js\nfunction minimatchAll(path: string, patterns: Array<Minimatch>, stat: Stats): boolean {\n  let match = false\n  for (const pattern of patterns) {\n    // If we've got a match, only re-test for exclusions.\n    // if we don't have a match, only re-test for inclusions.\n    if (match !== pattern.negate) {\n      continue\n    }\n\n    // partial match â€” pattern: foo/bar.txt path: foo â€” we must allow foo\n    // use it only for non-negate patterns: const m = new Minimatch(\"!node_modules/@(electron-download|electron)/**/*\", {dot: true }); m.match(\"node_modules\", true) will return false, but must be true\n    match = pattern.match(path, stat.isDirectory() && !pattern.negate)\n  }\n  return match\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isUseSystemSigncode = isUseSystemSigncode;
exports.isBuildCacheEnabled = isBuildCacheEnabled;
exports.isAutoDiscoveryCodeSignIdentity = isAutoDiscoveryCodeSignIdentity;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function isUseSystemSigncode() {
  return (0, _builderUtil().isEnvTrue)(process.env.USE_SYSTEM_SIGNCODE);
}

function isBuildCacheEnabled() {
  return !(0, _builderUtil().isEnvTrue)(process.env.ELECTRON_BUILDER_DISABLE_BUILD_CACHE);
}

function isAutoDiscoveryCodeSignIdentity() {
  return process.env.CSC_IDENTITY_AUTO_DISCOVERY !== "false";
} 
// __ts-babel@6.0.4
//# sourceMappingURL=flags.js.map{"version":3,"sources":["../../src/util/flags.ts"],"names":[],"mappings":";;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEM,SAAU,mBAAV,GAA6B;AACjC,SAAO,8BAAU,OAAO,CAAC,GAAR,CAAY,mBAAtB,CAAP;AACD;;AAEK,SAAU,mBAAV,GAA6B;AACjC,SAAO,CAAC,8BAAU,OAAO,CAAC,GAAR,CAAY,oCAAtB,CAAR;AACD;;AAEK,SAAU,+BAAV,GAAyC;AAC7C,SAAO,OAAO,CAAC,GAAR,CAAY,2BAAZ,KAA4C,OAAnD;AACD,C","sourcesContent":["import { isEnvTrue } from \"builder-util\"\n\nexport function isUseSystemSigncode() {\n  return isEnvTrue(process.env.USE_SYSTEM_SIGNCODE)\n}\n\nexport function isBuildCacheEnabled() {\n  return !isEnvTrue(process.env.ELECTRON_BUILDER_DISABLE_BUILD_CACHE)\n}\n\nexport function isAutoDiscoveryCodeSignIdentity() {\n  return process.env.CSC_IDENTITY_AUTO_DISCOVERY !== \"false\"\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.hashFile = hashFile;

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("fs");

  _fs = function () {
    return data;
  };

  return data;
}

function hashFile(file, algorithm = "sha512", encoding = "base64", options) {
  return new Promise((resolve, reject) => {
    const hash = (0, _crypto().createHash)(algorithm);
    hash.on("error", reject).setEncoding(encoding);
    (0, _fs().createReadStream)(file, Object.assign({}, options, {
      highWaterMark: 1024 * 1024
      /* better to use more memory but hash faster */

    })).on("error", reject).on("end", () => {
      hash.end();
      resolve(hash.read());
    }).pipe(hash, {
      end: false
    });
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=hash.js.map{"version":3,"sources":["../../src/util/hash.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEM,SAAU,QAAV,CAAmB,IAAnB,EAAiC,SAAA,GAAoB,QAArD,EAA+D,QAAA,GAA6B,QAA5F,EAAsG,OAAtG,EAAmH;AACvH,SAAO,IAAI,OAAJ,CAAoB,CAAC,OAAD,EAAU,MAAV,KAAoB;AAC7C,UAAM,IAAI,GAAG,0BAAW,SAAX,CAAb;AACA,IAAA,IAAI,CACD,EADH,CACM,OADN,EACe,MADf,EAEG,WAFH,CAEe,QAFf;AAIA,gCAAiB,IAAjB,EAAqB,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,OAAN,EAAa;AAAE,MAAA,aAAa,EAAE,OAAO;AAAK;;AAA7B,KAAb,CAArB,EACG,EADH,CACM,OADN,EACe,MADf,EAEG,EAFH,CAEM,KAFN,EAEa,MAAK;AACd,MAAA,IAAI,CAAC,GAAL;AACA,MAAA,OAAO,CAAC,IAAI,CAAC,IAAL,EAAD,CAAP;AACD,KALH,EAMG,IANH,CAMQ,IANR,EAMc;AAAC,MAAA,GAAG,EAAE;AAAN,KANd;AAOD,GAbM,CAAP;AAcD,C","sourcesContent":["import { createHash } from \"crypto\"\nimport { createReadStream } from \"fs\"\n\nexport function hashFile(file: string, algorithm: string = \"sha512\", encoding: \"base64\" | \"hex\" = \"base64\", options?: any) {\n  return new Promise<string>((resolve, reject) => {\n    const hash = createHash(algorithm)\n    hash\n      .on(\"error\", reject)\n      .setEncoding(encoding)\n\n    createReadStream(file, {...options, highWaterMark: 1024 * 1024 /* better to use more memory but hash faster */})\n      .on(\"error\", reject)\n      .on(\"end\", () => {\n        hash.end()\n        resolve(hash.read() as string)\n      })\n      .pipe(hash, {end: false})\n  })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.toLangWithRegion = toLangWithRegion;
exports.langIdToName = exports.lcid = exports.bundledLanguages = void 0;
const bundledLanguages = ["en_US", "de_DE", "fr_FR", "es_ES", "zh_CN", "zh_TW", "ja_JP", "ko_KR", "it_IT", "nl_NL", "da_DK", "sv_SE", "nb_NO", "fi_FI", "ru_RU", "pt_PT", "pt_BR", "pl_PL", "uk_UA", "cs_CZ", "sk_SK", "hu_HU", "ar_SA", "tr_TR", "th_TH", "vi_VN"]; // todo "ro_RO" "el_GR" "et_EE" "ka_GE"

exports.bundledLanguages = bundledLanguages;
const langToLangWithRegion = new Map();

for (const id of bundledLanguages) {
  langToLangWithRegion.set(id.substring(0, id.indexOf("_")), id);
}

function toLangWithRegion(lang) {
  if (lang.includes("_")) {
    return lang;
  }

  lang = lang.toLowerCase();
  const result = langToLangWithRegion.get(lang);
  return result == null ? `${lang}_${lang.toUpperCase()}` : result;
}

const lcid = {
  af_ZA: 1078,
  am_ET: 1118,
  ar_AE: 14337,
  ar_BH: 15361,
  ar_DZ: 5121,
  ar_EG: 3073,
  ar_IQ: 2049,
  ar_JO: 11265,
  ar_KW: 13313,
  ar_LB: 12289,
  ar_LY: 4097,
  ar_MA: 6145,
  ar_OM: 8193,
  ar_QA: 16385,
  ar_SA: 1025,
  ar_SY: 10241,
  ar_TN: 7169,
  ar_YE: 9217,
  arn_CL: 1146,
  as_IN: 1101,
  az_AZ: 2092,
  ba_RU: 1133,
  be_BY: 1059,
  bg_BG: 1026,
  bn_IN: 1093,
  bo_BT: 2129,
  bo_CN: 1105,
  br_FR: 1150,
  bs_BA: 8218,
  ca_ES: 1027,
  co_FR: 1155,
  cs_CZ: 1029,
  cy_GB: 1106,
  da_DK: 1030,
  de_AT: 3079,
  de_CH: 2055,
  de_DE: 1031,
  de_LI: 5127,
  de_LU: 4103,
  div_MV: 1125,
  dsb_DE: 2094,
  el_GR: 1032,
  en_AU: 3081,
  en_BZ: 10249,
  en_CA: 4105,
  en_CB: 9225,
  en_GB: 2057,
  en_IE: 6153,
  en_IN: 18441,
  en_JA: 8201,
  en_MY: 17417,
  en_NZ: 5129,
  en_PH: 13321,
  en_TT: 11273,
  en_US: 1033,
  en_ZA: 7177,
  en_ZW: 12297,
  es_AR: 11274,
  es_BO: 16394,
  es_CL: 13322,
  es_CO: 9226,
  es_CR: 5130,
  es_DO: 7178,
  es_EC: 12298,
  es_ES: 3082,
  es_GT: 4106,
  es_HN: 18442,
  es_MX: 2058,
  es_NI: 19466,
  es_PA: 6154,
  es_PE: 10250,
  es_PR: 20490,
  es_PY: 15370,
  es_SV: 17418,
  es_UR: 14346,
  es_US: 21514,
  es_VE: 8202,
  et_EE: 1061,
  eu_ES: 1069,
  fa_IR: 1065,
  fi_FI: 1035,
  fil_PH: 1124,
  fo_FO: 1080,
  fr_BE: 2060,
  fr_CA: 3084,
  fr_CH: 4108,
  fr_FR: 1036,
  fr_LU: 5132,
  fr_MC: 6156,
  fy_NL: 1122,
  ga_IE: 2108,
  gbz_AF: 1164,
  gl_ES: 1110,
  gsw_FR: 1156,
  gu_IN: 1095,
  ha_NG: 1128,
  he_IL: 1037,
  hi_IN: 1081,
  hr_BA: 4122,
  hr_HR: 1050,
  hu_HU: 1038,
  hy_AM: 1067,
  id_ID: 1057,
  ii_CN: 1144,
  is_IS: 1039,
  it_CH: 2064,
  it_IT: 1040,
  iu_CA: 2141,
  ja_JP: 1041,
  ka_GE: 1079,
  kh_KH: 1107,
  kk_KZ: 1087,
  kl_GL: 1135,
  kn_IN: 1099,
  ko_KR: 1042,
  kok_IN: 1111,
  ky_KG: 1088,
  lb_LU: 1134,
  lo_LA: 1108,
  lt_LT: 1063,
  lv_LV: 1062,
  mi_NZ: 1153,
  mk_MK: 1071,
  ml_IN: 1100,
  mn_CN: 2128,
  mn_MN: 1104,
  moh_CA: 1148,
  mr_IN: 1102,
  ms_BN: 2110,
  ms_MY: 1086,
  mt_MT: 1082,
  my_MM: 1109,
  nb_NO: 1044,
  ne_NP: 1121,
  nl_BE: 2067,
  nl_NL: 1043,
  nn_NO: 2068,
  ns_ZA: 1132,
  oc_FR: 1154,
  or_IN: 1096,
  pa_IN: 1094,
  pl_PL: 1045,
  ps_AF: 1123,
  pt_BR: 1046,
  pt_PT: 2070,
  qut_GT: 1158,
  quz_BO: 1131,
  quz_EC: 2155,
  quz_PE: 3179,
  rm_CH: 1047,
  ro_RO: 1048,
  ru_RU: 1049,
  rw_RW: 1159,
  sa_IN: 1103,
  sah_RU: 1157,
  se_FI: 3131,
  se_NO: 1083,
  se_SE: 2107,
  si_LK: 1115,
  sk_SK: 1051,
  sl_SI: 1060,
  sma_NO: 6203,
  sma_SE: 7227,
  smj_NO: 4155,
  smj_SE: 5179,
  smn_FI: 9275,
  sms_FI: 8251,
  sq_AL: 1052,
  sr_BA: 7194,
  sr_SP: 3098,
  sv_FI: 2077,
  sv_SE: 1053,
  sw_KE: 1089,
  syr_SY: 1114,
  ta_IN: 1097,
  te_IN: 1098,
  tg_TJ: 1064,
  th_TH: 1054,
  tk_TM: 1090,
  tmz_DZ: 2143,
  tn_ZA: 1074,
  tr_TR: 1055,
  tt_RU: 1092,
  ug_CN: 1152,
  uk_UA: 1058,
  ur_IN: 2080,
  ur_PK: 1056,
  uz_UZ: 2115,
  vi_VN: 1066,
  wen_DE: 1070,
  wo_SN: 1160,
  xh_ZA: 1076,
  yo_NG: 1130,
  zh_CHS: 4,
  zh_CHT: 31748,
  zh_CN: 2052,
  zh_HK: 3076,
  zh_MO: 5124,
  zh_SG: 4100,
  zh_TW: 1028,
  zu_ZA: 1077
}; // noinspection SpellCheckingInspection

exports.lcid = lcid;
const langIdToName = {
  ab: "Abkhaz",
  aa: "Afar",
  af: "Afrikaans",
  ak: "Akan",
  sq: "Albanian",
  am: "Amharic",
  ar: "Arabic",
  an: "Aragonese",
  hy: "Armenian",
  as: "Assamese",
  av: "Avaric",
  ae: "Avestan",
  ay: "Aymara",
  az: "Azerbaijani",
  bm: "Bambara",
  ba: "Bashkir",
  eu: "Basque",
  be: "Belarusian",
  bn: "Bengali",
  bh: "Bihari",
  bi: "Bislama",
  bs: "Bosnian",
  br: "Breton",
  bg: "Bulgarian",
  my: "Burmese",
  ca: "Catalan",
  ch: "Chamorro",
  ce: "Chechen",
  ny: "Chichewa",
  zh: "Chinese",
  cv: "Chuvash",
  kw: "Cornish",
  co: "Corsican",
  cr: "Cree",
  hr: "Croatian",
  cs: "Czech",
  da: "Danish",
  dv: "Divehi",
  nl: "Dutch",
  dz: "Dzongkha",
  en: "English",
  eo: "Esperanto",
  et: "Estonian",
  ee: "Ewe",
  fo: "Faroese",
  fj: "Fijian",
  fi: "Finnish",
  fr: "French",
  ff: "Fula",
  gl: "Galician",
  ka: "Georgian",
  de: "German",
  el: "Greek",
  gn: "GuaranÃ­",
  gu: "Gujarati",
  ht: "Haitian",
  ha: "Hausa",
  he: "Hebrew",
  hz: "Herero",
  hi: "Hindi",
  ho: "Hiri Motu",
  hu: "Hungarian",
  ia: "Interlingua",
  id: "Indonesian",
  ie: "Interlingue",
  ga: "Irish",
  ig: "Igbo",
  ik: "Inupiaq",
  io: "Ido",
  is: "Icelandic",
  it: "Italian",
  iu: "Inuktitut",
  ja: "Japanese",
  jv: "Javanese",
  kl: "Kalaallisut",
  kn: "Kannada",
  kr: "Kanuri",
  ks: "Kashmiri",
  kk: "Kazakh",
  km: "Khmer",
  ki: "Kikuyu",
  rw: "Kinyarwanda",
  ky: "Kyrgyz",
  kv: "Komi",
  kg: "Kongo",
  ko: "Korean",
  ku: "Kurdish",
  kj: "Kwanyama",
  la: "Latin",
  lb: "Luxembourgish",
  lg: "Ganda",
  li: "Limburgish",
  ln: "Lingala",
  lo: "Lao",
  lt: "Lithuanian",
  lu: "Luba-Katanga",
  lv: "Latvian",
  gv: "Manx",
  mk: "Macedonian",
  mg: "Malagasy",
  ms: "Malay",
  ml: "Malayalam",
  mt: "Maltese",
  mi: "MÄ�ori",
  mr: "Marathi",
  mh: "Marshallese",
  mn: "Mongolian",
  na: "Nauru",
  nv: "Navajo",
  nd: "Northern Ndebele",
  ne: "Nepali",
  ng: "Ndonga",
  nb: "Norwegian BokmÃ¥l",
  nn: "Norwegian Nynorsk",
  no: "Norwegian",
  ii: "Nuosu",
  nr: "Southern Ndebele",
  oc: "Occitan",
  oj: "Ojibwe",
  cu: "Old Church Slavonic",
  om: "Oromo",
  or: "Oriya",
  os: "Ossetian",
  pa: "Panjabi",
  pi: "PÄ�li",
  fa: "Persian",
  pl: "Polish",
  ps: "Pashto",
  pt: "Portuguese",
  qu: "Quechua",
  rm: "Romansh",
  rn: "Kirundi",
  ro: "Romanian",
  ru: "Russian",
  sa: "Sanskrit",
  sc: "Sardinian",
  sd: "Sindhi",
  se: "Northern Sami",
  sm: "Samoan",
  sg: "Sango",
  sr: "Serbian",
  gd: "Gaelic",
  sn: "Shona",
  si: "Sinhala",
  sk: "Slovak",
  sl: "Slovene",
  so: "Somali",
  st: "Southern Sotho",
  es: "Spanish",
  su: "Sundanese",
  sw: "Swahili",
  ss: "Swati",
  sv: "Swedish",
  ta: "Tamil",
  te: "Telugu",
  tg: "Tajik",
  th: "Thai",
  ti: "Tigrinya",
  bo: "Tibetan Standard",
  tk: "Turkmen",
  tl: "Tagalog",
  tn: "Tswana",
  to: "Tonga",
  tr: "Turkish",
  ts: "Tsonga",
  tt: "Tatar",
  tw: "Twi",
  ty: "Tahitian",
  ug: "Uyghur",
  uk: "Ukrainian",
  ur: "Urdu",
  uz: "Uzbek",
  ve: "Venda",
  vi: "Vietnamese",
  vo: "VolapÃ¼k",
  wa: "Walloon",
  cy: "Welsh",
  wo: "Wolof",
  fy: "Western Frisian",
  xh: "Xhosa",
  yi: "Yiddish",
  yo: "Yoruba",
  za: "Zhuang",
  zu: "Zulu"
}; exports.langIdToName = langIdToName;
// __ts-babel@6.0.4
//# sourceMappingURL=langs.js.map{"version":3,"sources":["../../src/util/langs.ts"],"names":[],"mappings":";;;;;;;AAAO,MAAM,gBAAgB,GAAG,CAC9B,OAD8B,EACrB,OADqB,EACZ,OADY,EACH,OADG,EACM,OADN,EACe,OADf,EACwB,OADxB,EACiC,OADjC,EAC0C,OAD1C,EACmD,OADnD,EAC4D,OAD5D,EACqE,OADrE,EAE9B,OAF8B,EAErB,OAFqB,EAEZ,OAFY,EAEH,OAFG,EAEM,OAFN,EAEe,OAFf,EAEwB,OAFxB,EAEiC,OAFjC,EAE0C,OAF1C,EAEmD,OAFnD,EAE4D,OAF5D,EAEqE,OAFrE,EAG9B,OAH8B,EAGrB,OAHqB,CAAzB,C,CAMP;;;AAEA,MAAM,oBAAoB,GAAG,IAAI,GAAJ,EAA7B;;AACA,KAAK,MAAM,EAAX,IAAiB,gBAAjB,EAAmC;AACjC,EAAA,oBAAoB,CAAC,GAArB,CAAyB,EAAE,CAAC,SAAH,CAAa,CAAb,EAAgB,EAAE,CAAC,OAAH,CAAW,GAAX,CAAhB,CAAzB,EAA2D,EAA3D;AACD;;AAEK,SAAU,gBAAV,CAA2B,IAA3B,EAAuC;AAC3C,MAAI,IAAI,CAAC,QAAL,CAAc,GAAd,CAAJ,EAAwB;AACtB,WAAO,IAAP;AACD;;AAED,EAAA,IAAI,GAAG,IAAI,CAAC,WAAL,EAAP;AAEA,QAAM,MAAM,GAAG,oBAAoB,CAAC,GAArB,CAAyB,IAAzB,CAAf;AACA,SAAO,MAAM,IAAI,IAAV,GAAiB,GAAG,IAAI,IAAI,IAAI,CAAC,WAAL,EAAkB,EAA9C,GAAmD,MAA1D;AACD;;AAEM,MAAM,IAAI,GAAQ;AACvB,EAAA,KAAK,EAAE,IADgB;AAEvB,EAAA,KAAK,EAAE,IAFgB;AAGvB,EAAA,KAAK,EAAE,KAHgB;AAIvB,EAAA,KAAK,EAAE,KAJgB;AAKvB,EAAA,KAAK,EAAE,IALgB;AAMvB,EAAA,KAAK,EAAE,IANgB;AAOvB,EAAA,KAAK,EAAE,IAPgB;AAQvB,EAAA,KAAK,EAAE,KARgB;AASvB,EAAA,KAAK,EAAE,KATgB;AAUvB,EAAA,KAAK,EAAE,KAVgB;AAWvB,EAAA,KAAK,EAAE,IAXgB;AAYvB,EAAA,KAAK,EAAE,IAZgB;AAavB,EAAA,KAAK,EAAE,IAbgB;AAcvB,EAAA,KAAK,EAAE,KAdgB;AAevB,EAAA,KAAK,EAAE,IAfgB;AAgBvB,EAAA,KAAK,EAAE,KAhBgB;AAiBvB,EAAA,KAAK,EAAE,IAjBgB;AAkBvB,EAAA,KAAK,EAAE,IAlBgB;AAmBvB,EAAA,MAAM,EAAE,IAnBe;AAoBvB,EAAA,KAAK,EAAE,IApBgB;AAqBvB,EAAA,KAAK,EAAE,IArBgB;AAsBvB,EAAA,KAAK,EAAE,IAtBgB;AAuBvB,EAAA,KAAK,EAAE,IAvBgB;AAwBvB,EAAA,KAAK,EAAE,IAxBgB;AAyBvB,EAAA,KAAK,EAAE,IAzBgB;AA0BvB,EAAA,KAAK,EAAE,IA1BgB;AA2BvB,EAAA,KAAK,EAAE,IA3BgB;AA4BvB,EAAA,KAAK,EAAE,IA5BgB;AA6BvB,EAAA,KAAK,EAAE,IA7BgB;AA8BvB,EAAA,KAAK,EAAE,IA9BgB;AA+BvB,EAAA,KAAK,EAAE,IA/BgB;AAgCvB,EAAA,KAAK,EAAE,IAhCgB;AAiCvB,EAAA,KAAK,EAAE,IAjCgB;AAkCvB,EAAA,KAAK,EAAE,IAlCgB;AAmCvB,EAAA,KAAK,EAAE,IAnCgB;AAoCvB,EAAA,KAAK,EAAE,IApCgB;AAqCvB,EAAA,KAAK,EAAE,IArCgB;AAsCvB,EAAA,KAAK,EAAE,IAtCgB;AAuCvB,EAAA,KAAK,EAAE,IAvCgB;AAwCvB,EAAA,MAAM,EAAE,IAxCe;AAyCvB,EAAA,MAAM,EAAE,IAzCe;AA0CvB,EAAA,KAAK,EAAE,IA1CgB;AA2CvB,EAAA,KAAK,EAAE,IA3CgB;AA4CvB,EAAA,KAAK,EAAE,KA5CgB;AA6CvB,EAAA,KAAK,EAAE,IA7CgB;AA8CvB,EAAA,KAAK,EAAE,IA9CgB;AA+CvB,EAAA,KAAK,EAAE,IA/CgB;AAgDvB,EAAA,KAAK,EAAE,IAhDgB;AAiDvB,EAAA,KAAK,EAAE,KAjDgB;AAkDvB,EAAA,KAAK,EAAE,IAlDgB;AAmDvB,EAAA,KAAK,EAAE,KAnDgB;AAoDvB,EAAA,KAAK,EAAE,IApDgB;AAqDvB,EAAA,KAAK,EAAE,KArDgB;AAsDvB,EAAA,KAAK,EAAE,KAtDgB;AAuDvB,EAAA,KAAK,EAAE,IAvDgB;AAwDvB,EAAA,KAAK,EAAE,IAxDgB;AAyDvB,EAAA,KAAK,EAAE,KAzDgB;AA0DvB,EAAA,KAAK,EAAE,KA1DgB;AA2DvB,EAAA,KAAK,EAAE,KA3DgB;AA4DvB,EAAA,KAAK,EAAE,KA5DgB;AA6DvB,EAAA,KAAK,EAAE,IA7DgB;AA8DvB,EAAA,KAAK,EAAE,IA9DgB;AA+DvB,EAAA,KAAK,EAAE,IA/DgB;AAgEvB,EAAA,KAAK,EAAE,KAhEgB;AAiEvB,EAAA,KAAK,EAAE,IAjEgB;AAkEvB,EAAA,KAAK,EAAE,IAlEgB;AAmEvB,EAAA,KAAK,EAAE,KAnEgB;AAoEvB,EAAA,KAAK,EAAE,IApEgB;AAqEvB,EAAA,KAAK,EAAE,KArEgB;AAsEvB,EAAA,KAAK,EAAE,IAtEgB;AAuEvB,EAAA,KAAK,EAAE,KAvEgB;AAwEvB,EAAA,KAAK,EAAE,KAxEgB;AAyEvB,EAAA,KAAK,EAAE,KAzEgB;AA0EvB,EAAA,KAAK,EAAE,KA1EgB;AA2EvB,EAAA,KAAK,EAAE,KA3EgB;AA4EvB,EAAA,KAAK,EAAE,KA5EgB;AA6EvB,EAAA,KAAK,EAAE,IA7EgB;AA8EvB,EAAA,KAAK,EAAE,IA9EgB;AA+EvB,EAAA,KAAK,EAAE,IA/EgB;AAgFvB,EAAA,KAAK,EAAE,IAhFgB;AAiFvB,EAAA,KAAK,EAAE,IAjFgB;AAkFvB,EAAA,MAAM,EAAE,IAlFe;AAmFvB,EAAA,KAAK,EAAE,IAnFgB;AAoFvB,EAAA,KAAK,EAAE,IApFgB;AAqFvB,EAAA,KAAK,EAAE,IArFgB;AAsFvB,EAAA,KAAK,EAAE,IAtFgB;AAuFvB,EAAA,KAAK,EAAE,IAvFgB;AAwFvB,EAAA,KAAK,EAAE,IAxFgB;AAyFvB,EAAA,KAAK,EAAE,IAzFgB;AA0FvB,EAAA,KAAK,EAAE,IA1FgB;AA2FvB,EAAA,KAAK,EAAE,IA3FgB;AA4FvB,EAAA,MAAM,EAAE,IA5Fe;AA6FvB,EAAA,KAAK,EAAE,IA7FgB;AA8FvB,EAAA,MAAM,EAAE,IA9Fe;AA+FvB,EAAA,KAAK,EAAE,IA/FgB;AAgGvB,EAAA,KAAK,EAAE,IAhGgB;AAiGvB,EAAA,KAAK,EAAE,IAjGgB;AAkGvB,EAAA,KAAK,EAAE,IAlGgB;AAmGvB,EAAA,KAAK,EAAE,IAnGgB;AAoGvB,EAAA,KAAK,EAAE,IApGgB;AAqGvB,EAAA,KAAK,EAAE,IArGgB;AAsGvB,EAAA,KAAK,EAAE,IAtGgB;AAuGvB,EAAA,KAAK,EAAE,IAvGgB;AAwGvB,EAAA,KAAK,EAAE,IAxGgB;AAyGvB,EAAA,KAAK,EAAE,IAzGgB;AA0GvB,EAAA,KAAK,EAAE,IA1GgB;AA2GvB,EAAA,KAAK,EAAE,IA3GgB;AA4GvB,EAAA,KAAK,EAAE,IA5GgB;AA6GvB,EAAA,KAAK,EAAE,IA7GgB;AA8GvB,EAAA,KAAK,EAAE,IA9GgB;AA+GvB,EAAA,KAAK,EAAE,IA/GgB;AAgHvB,EAAA,KAAK,EAAE,IAhHgB;AAiHvB,EAAA,KAAK,EAAE,IAjHgB;AAkHvB,EAAA,KAAK,EAAE,IAlHgB;AAmHvB,EAAA,KAAK,EAAE,IAnHgB;AAoHvB,EAAA,MAAM,EAAE,IApHe;AAqHvB,EAAA,KAAK,EAAE,IArHgB;AAsHvB,EAAA,KAAK,EAAE,IAtHgB;AAuHvB,EAAA,KAAK,EAAE,IAvHgB;AAwHvB,EAAA,KAAK,EAAE,IAxHgB;AAyHvB,EAAA,KAAK,EAAE,IAzHgB;AA0HvB,EAAA,KAAK,EAAE,IA1HgB;AA2HvB,EAAA,KAAK,EAAE,IA3HgB;AA4HvB,EAAA,KAAK,EAAE,IA5HgB;AA6HvB,EAAA,KAAK,EAAE,IA7HgB;AA8HvB,EAAA,KAAK,EAAE,IA9HgB;AA+HvB,EAAA,MAAM,EAAE,IA/He;AAgIvB,EAAA,KAAK,EAAE,IAhIgB;AAiIvB,EAAA,KAAK,EAAE,IAjIgB;AAkIvB,EAAA,KAAK,EAAE,IAlIgB;AAmIvB,EAAA,KAAK,EAAE,IAnIgB;AAoIvB,EAAA,KAAK,EAAE,IApIgB;AAqIvB,EAAA,KAAK,EAAE,IArIgB;AAsIvB,EAAA,KAAK,EAAE,IAtIgB;AAuIvB,EAAA,KAAK,EAAE,IAvIgB;AAwIvB,EAAA,KAAK,EAAE,IAxIgB;AAyIvB,EAAA,KAAK,EAAE,IAzIgB;AA0IvB,EAAA,KAAK,EAAE,IA1IgB;AA2IvB,EAAA,KAAK,EAAE,IA3IgB;AA4IvB,EAAA,KAAK,EAAE,IA5IgB;AA6IvB,EAAA,KAAK,EAAE,IA7IgB;AA8IvB,EAAA,KAAK,EAAE,IA9IgB;AA+IvB,EAAA,KAAK,EAAE,IA/IgB;AAgJvB,EAAA,KAAK,EAAE,IAhJgB;AAiJvB,EAAA,KAAK,EAAE,IAjJgB;AAkJvB,EAAA,MAAM,EAAE,IAlJe;AAmJvB,EAAA,MAAM,EAAE,IAnJe;AAoJvB,EAAA,MAAM,EAAE,IApJe;AAqJvB,EAAA,MAAM,EAAE,IArJe;AAsJvB,EAAA,KAAK,EAAE,IAtJgB;AAuJvB,EAAA,KAAK,EAAE,IAvJgB;AAwJvB,EAAA,KAAK,EAAE,IAxJgB;AAyJvB,EAAA,KAAK,EAAE,IAzJgB;AA0JvB,EAAA,KAAK,EAAE,IA1JgB;AA2JvB,EAAA,MAAM,EAAE,IA3Je;AA4JvB,EAAA,KAAK,EAAE,IA5JgB;AA6JvB,EAAA,KAAK,EAAE,IA7JgB;AA8JvB,EAAA,KAAK,EAAE,IA9JgB;AA+JvB,EAAA,KAAK,EAAE,IA/JgB;AAgKvB,EAAA,KAAK,EAAE,IAhKgB;AAiKvB,EAAA,KAAK,EAAE,IAjKgB;AAkKvB,EAAA,MAAM,EAAE,IAlKe;AAmKvB,EAAA,MAAM,EAAE,IAnKe;AAoKvB,EAAA,MAAM,EAAE,IApKe;AAqKvB,EAAA,MAAM,EAAE,IArKe;AAsKvB,EAAA,MAAM,EAAE,IAtKe;AAuKvB,EAAA,MAAM,EAAE,IAvKe;AAwKvB,EAAA,KAAK,EAAE,IAxKgB;AAyKvB,EAAA,KAAK,EAAE,IAzKgB;AA0KvB,EAAA,KAAK,EAAE,IA1KgB;AA2KvB,EAAA,KAAK,EAAE,IA3KgB;AA4KvB,EAAA,KAAK,EAAE,IA5KgB;AA6KvB,EAAA,KAAK,EAAE,IA7KgB;AA8KvB,EAAA,MAAM,EAAE,IA9Ke;AA+KvB,EAAA,KAAK,EAAE,IA/KgB;AAgLvB,EAAA,KAAK,EAAE,IAhLgB;AAiLvB,EAAA,KAAK,EAAE,IAjLgB;AAkLvB,EAAA,KAAK,EAAE,IAlLgB;AAmLvB,EAAA,KAAK,EAAE,IAnLgB;AAoLvB,EAAA,MAAM,EAAE,IApLe;AAqLvB,EAAA,KAAK,EAAE,IArLgB;AAsLvB,EAAA,KAAK,EAAE,IAtLgB;AAuLvB,EAAA,KAAK,EAAE,IAvLgB;AAwLvB,EAAA,KAAK,EAAE,IAxLgB;AAyLvB,EAAA,KAAK,EAAE,IAzLgB;AA0LvB,EAAA,KAAK,EAAE,IA1LgB;AA2LvB,EAAA,KAAK,EAAE,IA3LgB;AA4LvB,EAAA,KAAK,EAAE,IA5LgB;AA6LvB,EAAA,KAAK,EAAE,IA7LgB;AA8LvB,EAAA,MAAM,EAAE,IA9Le;AA+LvB,EAAA,KAAK,EAAE,IA/LgB;AAgMvB,EAAA,KAAK,EAAE,IAhMgB;AAiMvB,EAAA,KAAK,EAAE,IAjMgB;AAkMvB,EAAA,MAAM,EAAE,CAlMe;AAmMvB,EAAA,MAAM,EAAE,KAnMe;AAoMvB,EAAA,KAAK,EAAE,IApMgB;AAqMvB,EAAA,KAAK,EAAE,IArMgB;AAsMvB,EAAA,KAAK,EAAE,IAtMgB;AAuMvB,EAAA,KAAK,EAAE,IAvMgB;AAwMvB,EAAA,KAAK,EAAE,IAxMgB;AAyMvB,EAAA,KAAK,EAAE;AAzMgB,CAAlB,C,CA4MP;;;AACO,MAAM,YAAY,GAAG;AAC1B,EAAA,EAAE,EAAE,QADsB;AAE1B,EAAA,EAAE,EAAE,MAFsB;AAG1B,EAAA,EAAE,EAAE,WAHsB;AAI1B,EAAA,EAAE,EAAE,MAJsB;AAK1B,EAAA,EAAE,EAAE,UALsB;AAM1B,EAAA,EAAE,EAAE,SANsB;AAO1B,EAAA,EAAE,EAAE,QAPsB;AAQ1B,EAAA,EAAE,EAAE,WARsB;AAS1B,EAAA,EAAE,EAAE,UATsB;AAU1B,EAAA,EAAE,EAAE,UAVsB;AAW1B,EAAA,EAAE,EAAE,QAXsB;AAY1B,EAAA,EAAE,EAAE,SAZsB;AAa1B,EAAA,EAAE,EAAE,QAbsB;AAc1B,EAAA,EAAE,EAAE,aAdsB;AAe1B,EAAA,EAAE,EAAE,SAfsB;AAgB1B,EAAA,EAAE,EAAE,SAhBsB;AAiB1B,EAAA,EAAE,EAAE,QAjBsB;AAkB1B,EAAA,EAAE,EAAE,YAlBsB;AAmB1B,EAAA,EAAE,EAAE,SAnBsB;AAoB1B,EAAA,EAAE,EAAE,QApBsB;AAqB1B,EAAA,EAAE,EAAE,SArBsB;AAsB1B,EAAA,EAAE,EAAE,SAtBsB;AAuB1B,EAAA,EAAE,EAAE,QAvBsB;AAwB1B,EAAA,EAAE,EAAE,WAxBsB;AAyB1B,EAAA,EAAE,EAAE,SAzBsB;AA0B1B,EAAA,EAAE,EAAE,SA1BsB;AA2B1B,EAAA,EAAE,EAAE,UA3BsB;AA4B1B,EAAA,EAAE,EAAE,SA5BsB;AA6B1B,EAAA,EAAE,EAAE,UA7BsB;AA8B1B,EAAA,EAAE,EAAE,SA9BsB;AA+B1B,EAAA,EAAE,EAAE,SA/BsB;AAgC1B,EAAA,EAAE,EAAE,SAhCsB;AAiC1B,EAAA,EAAE,EAAE,UAjCsB;AAkC1B,EAAA,EAAE,EAAE,MAlCsB;AAmC1B,EAAA,EAAE,EAAE,UAnCsB;AAoC1B,EAAA,EAAE,EAAE,OApCsB;AAqC1B,EAAA,EAAE,EAAE,QArCsB;AAsC1B,EAAA,EAAE,EAAE,QAtCsB;AAuC1B,EAAA,EAAE,EAAE,OAvCsB;AAwC1B,EAAA,EAAE,EAAE,UAxCsB;AAyC1B,EAAA,EAAE,EAAE,SAzCsB;AA0C1B,EAAA,EAAE,EAAE,WA1CsB;AA2C1B,EAAA,EAAE,EAAE,UA3CsB;AA4C1B,EAAA,EAAE,EAAE,KA5CsB;AA6C1B,EAAA,EAAE,EAAE,SA7CsB;AA8C1B,EAAA,EAAE,EAAE,QA9CsB;AA+C1B,EAAA,EAAE,EAAE,SA/CsB;AAgD1B,EAAA,EAAE,EAAE,QAhDsB;AAiD1B,EAAA,EAAE,EAAE,MAjDsB;AAkD1B,EAAA,EAAE,EAAE,UAlDsB;AAmD1B,EAAA,EAAE,EAAE,UAnDsB;AAoD1B,EAAA,EAAE,EAAE,QApDsB;AAqD1B,EAAA,EAAE,EAAE,OArDsB;AAsD1B,EAAA,EAAE,EAAE,SAtDsB;AAuD1B,EAAA,EAAE,EAAE,UAvDsB;AAwD1B,EAAA,EAAE,EAAE,SAxDsB;AAyD1B,EAAA,EAAE,EAAE,OAzDsB;AA0D1B,EAAA,EAAE,EAAE,QA1DsB;AA2D1B,EAAA,EAAE,EAAE,QA3DsB;AA4D1B,EAAA,EAAE,EAAE,OA5DsB;AA6D1B,EAAA,EAAE,EAAE,WA7DsB;AA8D1B,EAAA,EAAE,EAAE,WA9DsB;AA+D1B,EAAA,EAAE,EAAE,aA/DsB;AAgE1B,EAAA,EAAE,EAAE,YAhEsB;AAiE1B,EAAA,EAAE,EAAE,aAjEsB;AAkE1B,EAAA,EAAE,EAAE,OAlEsB;AAmE1B,EAAA,EAAE,EAAE,MAnEsB;AAoE1B,EAAA,EAAE,EAAE,SApEsB;AAqE1B,EAAA,EAAE,EAAE,KArEsB;AAsE1B,EAAA,EAAE,EAAE,WAtEsB;AAuE1B,EAAA,EAAE,EAAE,SAvEsB;AAwE1B,EAAA,EAAE,EAAE,WAxEsB;AAyE1B,EAAA,EAAE,EAAE,UAzEsB;AA0E1B,EAAA,EAAE,EAAE,UA1EsB;AA2E1B,EAAA,EAAE,EAAE,aA3EsB;AA4E1B,EAAA,EAAE,EAAE,SA5EsB;AA6E1B,EAAA,EAAE,EAAE,QA7EsB;AA8E1B,EAAA,EAAE,EAAE,UA9EsB;AA+E1B,EAAA,EAAE,EAAE,QA/EsB;AAgF1B,EAAA,EAAE,EAAE,OAhFsB;AAiF1B,EAAA,EAAE,EAAE,QAjFsB;AAkF1B,EAAA,EAAE,EAAE,aAlFsB;AAmF1B,EAAA,EAAE,EAAE,QAnFsB;AAoF1B,EAAA,EAAE,EAAE,MApFsB;AAqF1B,EAAA,EAAE,EAAE,OArFsB;AAsF1B,EAAA,EAAE,EAAE,QAtFsB;AAuF1B,EAAA,EAAE,EAAE,SAvFsB;AAwF1B,EAAA,EAAE,EAAE,UAxFsB;AAyF1B,EAAA,EAAE,EAAE,OAzFsB;AA0F1B,EAAA,EAAE,EAAE,eA1FsB;AA2F1B,EAAA,EAAE,EAAE,OA3FsB;AA4F1B,EAAA,EAAE,EAAE,YA5FsB;AA6F1B,EAAA,EAAE,EAAE,SA7FsB;AA8F1B,EAAA,EAAE,EAAE,KA9FsB;AA+F1B,EAAA,EAAE,EAAE,YA/FsB;AAgG1B,EAAA,EAAE,EAAE,cAhGsB;AAiG1B,EAAA,EAAE,EAAE,SAjGsB;AAkG1B,EAAA,EAAE,EAAE,MAlGsB;AAmG1B,EAAA,EAAE,EAAE,YAnGsB;AAoG1B,EAAA,EAAE,EAAE,UApGsB;AAqG1B,EAAA,EAAE,EAAE,OArGsB;AAsG1B,EAAA,EAAE,EAAE,WAtGsB;AAuG1B,EAAA,EAAE,EAAE,SAvGsB;AAwG1B,EAAA,EAAE,EAAE,OAxGsB;AAyG1B,EAAA,EAAE,EAAE,SAzGsB;AA0G1B,EAAA,EAAE,EAAE,aA1GsB;AA2G1B,EAAA,EAAE,EAAE,WA3GsB;AA4G1B,EAAA,EAAE,EAAE,OA5GsB;AA6G1B,EAAA,EAAE,EAAE,QA7GsB;AA8G1B,EAAA,EAAE,EAAE,kBA9GsB;AA+G1B,EAAA,EAAE,EAAE,QA/GsB;AAgH1B,EAAA,EAAE,EAAE,QAhHsB;AAiH1B,EAAA,EAAE,EAAE,kBAjHsB;AAkH1B,EAAA,EAAE,EAAE,mBAlHsB;AAmH1B,EAAA,EAAE,EAAE,WAnHsB;AAoH1B,EAAA,EAAE,EAAE,OApHsB;AAqH1B,EAAA,EAAE,EAAE,kBArHsB;AAsH1B,EAAA,EAAE,EAAE,SAtHsB;AAuH1B,EAAA,EAAE,EAAE,QAvHsB;AAwH1B,EAAA,EAAE,EAAE,qBAxHsB;AAyH1B,EAAA,EAAE,EAAE,OAzHsB;AA0H1B,EAAA,EAAE,EAAE,OA1HsB;AA2H1B,EAAA,EAAE,EAAE,UA3HsB;AA4H1B,EAAA,EAAE,EAAE,SA5HsB;AA6H1B,EAAA,EAAE,EAAE,MA7HsB;AA8H1B,EAAA,EAAE,EAAE,SA9HsB;AA+H1B,EAAA,EAAE,EAAE,QA/HsB;AAgI1B,EAAA,EAAE,EAAE,QAhIsB;AAiI1B,EAAA,EAAE,EAAE,YAjIsB;AAkI1B,EAAA,EAAE,EAAE,SAlIsB;AAmI1B,EAAA,EAAE,EAAE,SAnIsB;AAoI1B,EAAA,EAAE,EAAE,SApIsB;AAqI1B,EAAA,EAAE,EAAE,UArIsB;AAsI1B,EAAA,EAAE,EAAE,SAtIsB;AAuI1B,EAAA,EAAE,EAAE,UAvIsB;AAwI1B,EAAA,EAAE,EAAE,WAxIsB;AAyI1B,EAAA,EAAE,EAAE,QAzIsB;AA0I1B,EAAA,EAAE,EAAE,eA1IsB;AA2I1B,EAAA,EAAE,EAAE,QA3IsB;AA4I1B,EAAA,EAAE,EAAE,OA5IsB;AA6I1B,EAAA,EAAE,EAAE,SA7IsB;AA8I1B,EAAA,EAAE,EAAE,QA9IsB;AA+I1B,EAAA,EAAE,EAAE,OA/IsB;AAgJ1B,EAAA,EAAE,EAAE,SAhJsB;AAiJ1B,EAAA,EAAE,EAAE,QAjJsB;AAkJ1B,EAAA,EAAE,EAAE,SAlJsB;AAmJ1B,EAAA,EAAE,EAAE,QAnJsB;AAoJ1B,EAAA,EAAE,EAAE,gBApJsB;AAqJ1B,EAAA,EAAE,EAAE,SArJsB;AAsJ1B,EAAA,EAAE,EAAE,WAtJsB;AAuJ1B,EAAA,EAAE,EAAE,SAvJsB;AAwJ1B,EAAA,EAAE,EAAE,OAxJsB;AAyJ1B,EAAA,EAAE,EAAE,SAzJsB;AA0J1B,EAAA,EAAE,EAAE,OA1JsB;AA2J1B,EAAA,EAAE,EAAE,QA3JsB;AA4J1B,EAAA,EAAE,EAAE,OA5JsB;AA6J1B,EAAA,EAAE,EAAE,MA7JsB;AA8J1B,EAAA,EAAE,EAAE,UA9JsB;AA+J1B,EAAA,EAAE,EAAE,kBA/JsB;AAgK1B,EAAA,EAAE,EAAE,SAhKsB;AAiK1B,EAAA,EAAE,EAAE,SAjKsB;AAkK1B,EAAA,EAAE,EAAE,QAlKsB;AAmK1B,EAAA,EAAE,EAAE,OAnKsB;AAoK1B,EAAA,EAAE,EAAE,SApKsB;AAqK1B,EAAA,EAAE,EAAE,QArKsB;AAsK1B,EAAA,EAAE,EAAE,OAtKsB;AAuK1B,EAAA,EAAE,EAAE,KAvKsB;AAwK1B,EAAA,EAAE,EAAE,UAxKsB;AAyK1B,EAAA,EAAE,EAAE,QAzKsB;AA0K1B,EAAA,EAAE,EAAE,WA1KsB;AA2K1B,EAAA,EAAE,EAAE,MA3KsB;AA4K1B,EAAA,EAAE,EAAE,OA5KsB;AA6K1B,EAAA,EAAE,EAAE,OA7KsB;AA8K1B,EAAA,EAAE,EAAE,YA9KsB;AA+K1B,EAAA,EAAE,EAAE,SA/KsB;AAgL1B,EAAA,EAAE,EAAE,SAhLsB;AAiL1B,EAAA,EAAE,EAAE,OAjLsB;AAkL1B,EAAA,EAAE,EAAE,OAlLsB;AAmL1B,EAAA,EAAE,EAAE,iBAnLsB;AAoL1B,EAAA,EAAE,EAAE,OApLsB;AAqL1B,EAAA,EAAE,EAAE,SArLsB;AAsL1B,EAAA,EAAE,EAAE,QAtLsB;AAuL1B,EAAA,EAAE,EAAE,QAvLsB;AAwL1B,EAAA,EAAE,EAAE;AAxLsB,CAArB,C","sourcesContent":["export const bundledLanguages = [\n  \"en_US\", \"de_DE\", \"fr_FR\", \"es_ES\", \"zh_CN\", \"zh_TW\", \"ja_JP\", \"ko_KR\", \"it_IT\", \"nl_NL\", \"da_DK\", \"sv_SE\",\n  \"nb_NO\", \"fi_FI\", \"ru_RU\", \"pt_PT\", \"pt_BR\", \"pl_PL\", \"uk_UA\", \"cs_CZ\", \"sk_SK\", \"hu_HU\", \"ar_SA\", \"tr_TR\",\n  \"th_TH\", \"vi_VN\",\n]\n\n// todo \"ro_RO\" \"el_GR\" \"et_EE\" \"ka_GE\"\n\nconst langToLangWithRegion = new Map<string, string>()\nfor (const id of bundledLanguages) {\n  langToLangWithRegion.set(id.substring(0, id.indexOf(\"_\")), id)\n}\n\nexport function toLangWithRegion(lang: string): string {\n  if (lang.includes(\"_\")) {\n    return lang\n  }\n\n  lang = lang.toLowerCase()\n\n  const result = langToLangWithRegion.get(lang)\n  return result == null ? `${lang}_${lang.toUpperCase()}` : result\n}\n\nexport const lcid: any = {\n  af_ZA: 1078,\n  am_ET: 1118,\n  ar_AE: 14337,\n  ar_BH: 15361,\n  ar_DZ: 5121,\n  ar_EG: 3073,\n  ar_IQ: 2049,\n  ar_JO: 11265,\n  ar_KW: 13313,\n  ar_LB: 12289,\n  ar_LY: 4097,\n  ar_MA: 6145,\n  ar_OM: 8193,\n  ar_QA: 16385,\n  ar_SA: 1025,\n  ar_SY: 10241,\n  ar_TN: 7169,\n  ar_YE: 9217,\n  arn_CL: 1146,\n  as_IN: 1101,\n  az_AZ: 2092,\n  ba_RU: 1133,\n  be_BY: 1059,\n  bg_BG: 1026,\n  bn_IN: 1093,\n  bo_BT: 2129,\n  bo_CN: 1105,\n  br_FR: 1150,\n  bs_BA: 8218,\n  ca_ES: 1027,\n  co_FR: 1155,\n  cs_CZ: 1029,\n  cy_GB: 1106,\n  da_DK: 1030,\n  de_AT: 3079,\n  de_CH: 2055,\n  de_DE: 1031,\n  de_LI: 5127,\n  de_LU: 4103,\n  div_MV: 1125,\n  dsb_DE: 2094,\n  el_GR: 1032,\n  en_AU: 3081,\n  en_BZ: 10249,\n  en_CA: 4105,\n  en_CB: 9225,\n  en_GB: 2057,\n  en_IE: 6153,\n  en_IN: 18441,\n  en_JA: 8201,\n  en_MY: 17417,\n  en_NZ: 5129,\n  en_PH: 13321,\n  en_TT: 11273,\n  en_US: 1033,\n  en_ZA: 7177,\n  en_ZW: 12297,\n  es_AR: 11274,\n  es_BO: 16394,\n  es_CL: 13322,\n  es_CO: 9226,\n  es_CR: 5130,\n  es_DO: 7178,\n  es_EC: 12298,\n  es_ES: 3082,\n  es_GT: 4106,\n  es_HN: 18442,\n  es_MX: 2058,\n  es_NI: 19466,\n  es_PA: 6154,\n  es_PE: 10250,\n  es_PR: 20490,\n  es_PY: 15370,\n  es_SV: 17418,\n  es_UR: 14346,\n  es_US: 21514,\n  es_VE: 8202,\n  et_EE: 1061,\n  eu_ES: 1069,\n  fa_IR: 1065,\n  fi_FI: 1035,\n  fil_PH: 1124,\n  fo_FO: 1080,\n  fr_BE: 2060,\n  fr_CA: 3084,\n  fr_CH: 4108,\n  fr_FR: 1036,\n  fr_LU: 5132,\n  fr_MC: 6156,\n  fy_NL: 1122,\n  ga_IE: 2108,\n  gbz_AF: 1164,\n  gl_ES: 1110,\n  gsw_FR: 1156,\n  gu_IN: 1095,\n  ha_NG: 1128,\n  he_IL: 1037,\n  hi_IN: 1081,\n  hr_BA: 4122,\n  hr_HR: 1050,\n  hu_HU: 1038,\n  hy_AM: 1067,\n  id_ID: 1057,\n  ii_CN: 1144,\n  is_IS: 1039,\n  it_CH: 2064,\n  it_IT: 1040,\n  iu_CA: 2141,\n  ja_JP: 1041,\n  ka_GE: 1079,\n  kh_KH: 1107,\n  kk_KZ: 1087,\n  kl_GL: 1135,\n  kn_IN: 1099,\n  ko_KR: 1042,\n  kok_IN: 1111,\n  ky_KG: 1088,\n  lb_LU: 1134,\n  lo_LA: 1108,\n  lt_LT: 1063,\n  lv_LV: 1062,\n  mi_NZ: 1153,\n  mk_MK: 1071,\n  ml_IN: 1100,\n  mn_CN: 2128,\n  mn_MN: 1104,\n  moh_CA: 1148,\n  mr_IN: 1102,\n  ms_BN: 2110,\n  ms_MY: 1086,\n  mt_MT: 1082,\n  my_MM: 1109,\n  nb_NO: 1044,\n  ne_NP: 1121,\n  nl_BE: 2067,\n  nl_NL: 1043,\n  nn_NO: 2068,\n  ns_ZA: 1132,\n  oc_FR: 1154,\n  or_IN: 1096,\n  pa_IN: 1094,\n  pl_PL: 1045,\n  ps_AF: 1123,\n  pt_BR: 1046,\n  pt_PT: 2070,\n  qut_GT: 1158,\n  quz_BO: 1131,\n  quz_EC: 2155,\n  quz_PE: 3179,\n  rm_CH: 1047,\n  ro_RO: 1048,\n  ru_RU: 1049,\n  rw_RW: 1159,\n  sa_IN: 1103,\n  sah_RU: 1157,\n  se_FI: 3131,\n  se_NO: 1083,\n  se_SE: 2107,\n  si_LK: 1115,\n  sk_SK: 1051,\n  sl_SI: 1060,\n  sma_NO: 6203,\n  sma_SE: 7227,\n  smj_NO: 4155,\n  smj_SE: 5179,\n  smn_FI: 9275,\n  sms_FI: 8251,\n  sq_AL: 1052,\n  sr_BA: 7194,\n  sr_SP: 3098,\n  sv_FI: 2077,\n  sv_SE: 1053,\n  sw_KE: 1089,\n  syr_SY: 1114,\n  ta_IN: 1097,\n  te_IN: 1098,\n  tg_TJ: 1064,\n  th_TH: 1054,\n  tk_TM: 1090,\n  tmz_DZ: 2143,\n  tn_ZA: 1074,\n  tr_TR: 1055,\n  tt_RU: 1092,\n  ug_CN: 1152,\n  uk_UA: 1058,\n  ur_IN: 2080,\n  ur_PK: 1056,\n  uz_UZ: 2115,\n  vi_VN: 1066,\n  wen_DE: 1070,\n  wo_SN: 1160,\n  xh_ZA: 1076,\n  yo_NG: 1130,\n  zh_CHS: 4,\n  zh_CHT: 31748,\n  zh_CN: 2052,\n  zh_HK: 3076,\n  zh_MO: 5124,\n  zh_SG: 4100,\n  zh_TW: 1028,\n  zu_ZA: 1077\n}\n\n// noinspection SpellCheckingInspection\nexport const langIdToName = {\n  ab: \"Abkhaz\",\n  aa: \"Afar\",\n  af: \"Afrikaans\",\n  ak: \"Akan\",\n  sq: \"Albanian\",\n  am: \"Amharic\",\n  ar: \"Arabic\",\n  an: \"Aragonese\",\n  hy: \"Armenian\",\n  as: \"Assamese\",\n  av: \"Avaric\",\n  ae: \"Avestan\",\n  ay: \"Aymara\",\n  az: \"Azerbaijani\",\n  bm: \"Bambara\",\n  ba: \"Bashkir\",\n  eu: \"Basque\",\n  be: \"Belarusian\",\n  bn: \"Bengali\",\n  bh: \"Bihari\",\n  bi: \"Bislama\",\n  bs: \"Bosnian\",\n  br: \"Breton\",\n  bg: \"Bulgarian\",\n  my: \"Burmese\",\n  ca: \"Catalan\",\n  ch: \"Chamorro\",\n  ce: \"Chechen\",\n  ny: \"Chichewa\",\n  zh: \"Chinese\",\n  cv: \"Chuvash\",\n  kw: \"Cornish\",\n  co: \"Corsican\",\n  cr: \"Cree\",\n  hr: \"Croatian\",\n  cs: \"Czech\",\n  da: \"Danish\",\n  dv: \"Divehi\",\n  nl: \"Dutch\",\n  dz: \"Dzongkha\",\n  en: \"English\",\n  eo: \"Esperanto\",\n  et: \"Estonian\",\n  ee: \"Ewe\",\n  fo: \"Faroese\",\n  fj: \"Fijian\",\n  fi: \"Finnish\",\n  fr: \"French\",\n  ff: \"Fula\",\n  gl: \"Galician\",\n  ka: \"Georgian\",\n  de: \"German\",\n  el: \"Greek\",\n  gn: \"GuaranÃ­\",\n  gu: \"Gujarati\",\n  ht: \"Haitian\",\n  ha: \"Hausa\",\n  he: \"Hebrew\",\n  hz: \"Herero\",\n  hi: \"Hindi\",\n  ho: \"Hiri Motu\",\n  hu: \"Hungarian\",\n  ia: \"Interlingua\",\n  id: \"Indonesian\",\n  ie: \"Interlingue\",\n  ga: \"Irish\",\n  ig: \"Igbo\",\n  ik: \"Inupiaq\",\n  io: \"Ido\",\n  is: \"Icelandic\",\n  it: \"Italian\",\n  iu: \"Inuktitut\",\n  ja: \"Japanese\",\n  jv: \"Javanese\",\n  kl: \"Kalaallisut\",\n  kn: \"Kannada\",\n  kr: \"Kanuri\",\n  ks: \"Kashmiri\",\n  kk: \"Kazakh\",\n  km: \"Khmer\",\n  ki: \"Kikuyu\",\n  rw: \"Kinyarwanda\",\n  ky: \"Kyrgyz\",\n  kv: \"Komi\",\n  kg: \"Kongo\",\n  ko: \"Korean\",\n  ku: \"Kurdish\",\n  kj: \"Kwanyama\",\n  la: \"Latin\",\n  lb: \"Luxembourgish\",\n  lg: \"Ganda\",\n  li: \"Limburgish\",\n  ln: \"Lingala\",\n  lo: \"Lao\",\n  lt: \"Lithuanian\",\n  lu: \"Luba-Katanga\",\n  lv: \"Latvian\",\n  gv: \"Manx\",\n  mk: \"Macedonian\",\n  mg: \"Malagasy\",\n  ms: \"Malay\",\n  ml: \"Malayalam\",\n  mt: \"Maltese\",\n  mi: \"MÄ�ori\",\n  mr: \"Marathi\",\n  mh: \"Marshallese\",\n  mn: \"Mongolian\",\n  na: \"Nauru\",\n  nv: \"Navajo\",\n  nd: \"Northern Ndebele\",\n  ne: \"Nepali\",\n  ng: \"Ndonga\",\n  nb: \"Norwegian BokmÃ¥l\",\n  nn: \"Norwegian Nynorsk\",\n  no: \"Norwegian\",\n  ii: \"Nuosu\",\n  nr: \"Southern Ndebele\",\n  oc: \"Occitan\",\n  oj: \"Ojibwe\",\n  cu: \"Old Church Slavonic\",\n  om: \"Oromo\",\n  or: \"Oriya\",\n  os: \"Ossetian\",\n  pa: \"Panjabi\",\n  pi: \"PÄ�li\",\n  fa: \"Persian\",\n  pl: \"Polish\",\n  ps: \"Pashto\",\n  pt: \"Portuguese\",\n  qu: \"Quechua\",\n  rm: \"Romansh\",\n  rn: \"Kirundi\",\n  ro: \"Romanian\",\n  ru: \"Russian\",\n  sa: \"Sanskrit\",\n  sc: \"Sardinian\",\n  sd: \"Sindhi\",\n  se: \"Northern Sami\",\n  sm: \"Samoan\",\n  sg: \"Sango\",\n  sr: \"Serbian\",\n  gd: \"Gaelic\",\n  sn: \"Shona\",\n  si: \"Sinhala\",\n  sk: \"Slovak\",\n  sl: \"Slovene\",\n  so: \"Somali\",\n  st: \"Southern Sotho\",\n  es: \"Spanish\",\n  su: \"Sundanese\",\n  sw: \"Swahili\",\n  ss: \"Swati\",\n  sv: \"Swedish\",\n  ta: \"Tamil\",\n  te: \"Telugu\",\n  tg: \"Tajik\",\n  th: \"Thai\",\n  ti: \"Tigrinya\",\n  bo: \"Tibetan Standard\",\n  tk: \"Turkmen\",\n  tl: \"Tagalog\",\n  tn: \"Tswana\",\n  to: \"Tonga\",\n  tr: \"Turkish\",\n  ts: \"Tsonga\",\n  tt: \"Tatar\",\n  tw: \"Twi\",\n  ty: \"Tahitian\",\n  ug: \"Uyghur\",\n  uk: \"Ukrainian\",\n  ur: \"Urdu\",\n  uz: \"Uzbek\",\n  ve: \"Venda\",\n  vi: \"Vietnamese\",\n  vo: \"VolapÃ¼k\",\n  wa: \"Walloon\",\n  cy: \"Welsh\",\n  wo: \"Wolof\",\n  fy: \"Western Frisian\",\n  xh: \"Xhosa\",\n  yi: \"Yiddish\",\n  yo: \"Yoruba\",\n  za: \"Zhuang\",\n  zu: \"Zulu\"\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getLicenseAssets = getLicenseAssets;
exports.getNotLocalizedLicenseFile = getNotLocalizedLicenseFile;
exports.getLicenseFiles = getLicenseFiles;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _langs() {
  const data = require("./langs");

  _langs = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function getLicenseAssets(fileNames, packager) {
  return fileNames.sort((a, b) => {
    const aW = a.includes("_en") ? 0 : 100;
    const bW = b.includes("_en") ? 0 : 100;
    return aW === bW ? a.localeCompare(b) : aW - bW;
  }).map(file => {
    let lang = file.match(/_([^.]+)\./)[1];
    let langWithRegion;

    if (lang.includes("_")) {
      langWithRegion = lang;
      lang = langWithRegion.substring(0, lang.indexOf("_"));
    } else {
      lang = lang.toLowerCase();
      langWithRegion = (0, _langs().toLangWithRegion)(lang);
    }

    return {
      file: path.join(packager.buildResourcesDir, file),
      lang,
      langWithRegion,
      langName: _langs().langIdToName[lang]
    };
  });
}

function getNotLocalizedLicenseFile(_x, _x2) {
  return _getNotLocalizedLicenseFile.apply(this, arguments);
}

function _getNotLocalizedLicenseFile() {
  _getNotLocalizedLicenseFile = (0, _bluebirdLst().coroutine)(function* (custom, packager, supportedExtension = ["rtf", "txt", "html"]) {
    const possibleFiles = [];

    for (const name of ["license", "eula"]) {
      for (const ext of supportedExtension) {
        possibleFiles.push(`${name}.${ext}`);
        possibleFiles.push(`${name.toUpperCase()}.${ext}`);
        possibleFiles.push(`${name}.${ext.toUpperCase()}`);
        possibleFiles.push(`${name.toUpperCase()}.${ext.toUpperCase()}`);
      }
    }

    return yield packager.getResource(custom, ...possibleFiles);
  });
  return _getNotLocalizedLicenseFile.apply(this, arguments);
}

function getLicenseFiles(_x3) {
  return _getLicenseFiles.apply(this, arguments);
} function _getLicenseFiles() {
  _getLicenseFiles = (0, _bluebirdLst().coroutine)(function* (packager) {
    return getLicenseAssets((yield packager.resourceList).filter(it => {
      const name = it.toLowerCase();
      return (name.startsWith("license_") || name.startsWith("eula_")) && (name.endsWith(".rtf") || name.endsWith(".txt"));
    }), packager);
  });
  return _getLicenseFiles.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=license.js.map{"version":3,"sources":["../../src/util/license.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAGM,SAAU,gBAAV,CAA2B,SAA3B,EAAqD,QAArD,EAAoF;AACxF,SAAO,SAAS,CAAC,IAAV,CAAe,CAAC,CAAD,EAAI,CAAJ,KAAS;AAC7B,UAAM,EAAE,GAAG,CAAC,CAAC,QAAF,CAAW,KAAX,IAAoB,CAApB,GAAwB,GAAnC;AACA,UAAM,EAAE,GAAG,CAAC,CAAC,QAAF,CAAW,KAAX,IAAoB,CAApB,GAAwB,GAAnC;AACA,WAAO,EAAE,KAAK,EAAP,GAAY,CAAC,CAAC,aAAF,CAAgB,CAAhB,CAAZ,GAAiC,EAAE,GAAG,EAA7C;AACD,GAJM,EAKJ,GALI,CAKA,IAAI,IAAG;AACV,QAAI,IAAI,GAAG,IAAI,CAAC,KAAL,CAAW,YAAX,EAA0B,CAA1B,CAAX;AACA,QAAI,cAAJ;;AACA,QAAI,IAAI,CAAC,QAAL,CAAc,GAAd,CAAJ,EAAwB;AACtB,MAAA,cAAc,GAAG,IAAjB;AACA,MAAA,IAAI,GAAG,cAAc,CAAC,SAAf,CAAyB,CAAzB,EAA4B,IAAI,CAAC,OAAL,CAAa,GAAb,CAA5B,CAAP;AACD,KAHD,MAIK;AACH,MAAA,IAAI,GAAG,IAAI,CAAC,WAAL,EAAP;AACA,MAAA,cAAc,GAAG,+BAAiB,IAAjB,CAAjB;AACD;;AACD,WAAO;AAAC,MAAA,IAAI,EAAE,IAAI,CAAC,IAAL,CAAU,QAAQ,CAAC,iBAAnB,EAAsC,IAAtC,CAAP;AAAoD,MAAA,IAApD;AAA0D,MAAA,cAA1D;AAA0E,MAAA,QAAQ,EAAG,sBAAqB,IAArB;AAArF,KAAP;AACD,GAjBI,CAAP;AAkBD;;SAEqB,0B;;;;;8DAAf,WAA0C,MAA1C,EAA6E,QAA7E,EAA8G,kBAAA,GAAoC,CAAC,KAAD,EAAQ,KAAR,EAAe,MAAf,CAAlJ,EAAwK;AAC7K,UAAM,aAAa,GAAkB,EAArC;;AACA,SAAK,MAAM,IAAX,IAAmB,CAAC,SAAD,EAAY,MAAZ,CAAnB,EAAwC;AACtC,WAAK,MAAM,GAAX,IAAkB,kBAAlB,EAAsC;AACpC,QAAA,aAAa,CAAC,IAAd,CAAmB,GAAG,IAAI,IAAI,GAAG,EAAjC;AACA,QAAA,aAAa,CAAC,IAAd,CAAmB,GAAG,IAAI,CAAC,WAAL,EAAkB,IAAI,GAAG,EAA/C;AACA,QAAA,aAAa,CAAC,IAAd,CAAmB,GAAG,IAAI,IAAI,GAAG,CAAC,WAAJ,EAAiB,EAA/C;AACA,QAAA,aAAa,CAAC,IAAd,CAAmB,GAAG,IAAI,CAAC,WAAL,EAAkB,IAAI,GAAG,CAAC,WAAJ,EAAiB,EAA7D;AACD;AACF;;AAED,iBAAa,QAAQ,CAAC,WAAT,CAAqB,MAArB,EAA6B,GAAG,aAAhC,CAAb;AACD,G;;;;SAEqB,e;;;;;;mDAAf,WAA+B,QAA/B,EAA8D;AACnE,WAAO,gBAAgB,CAAC,OAAO,QAAQ,CAAC,YAAhB,EACrB,MADqB,CACd,EAAE,IAAG;AACX,YAAM,IAAI,GAAG,EAAE,CAAC,WAAH,EAAb;AACA,aAAO,CAAC,IAAI,CAAC,UAAL,CAAgB,UAAhB,KAA+B,IAAI,CAAC,UAAL,CAAgB,OAAhB,CAAhC,MAA8D,IAAI,CAAC,QAAL,CAAc,MAAd,KAAyB,IAAI,CAAC,QAAL,CAAc,MAAd,CAAvF,CAAP;AACD,KAJqB,CAAD,EAIjB,QAJiB,CAAvB;AAKD,G","sourcesContent":["import * as path from \"path\"\nimport { langIdToName, toLangWithRegion } from \"./langs\"\nimport { PlatformPackager } from \"../platformPackager\"\n\nexport function getLicenseAssets(fileNames: Array<string>, packager: PlatformPackager<any>) {\n  return fileNames.sort((a, b) => {\n    const aW = a.includes(\"_en\") ? 0 : 100\n    const bW = b.includes(\"_en\") ? 0 : 100\n    return aW === bW ? a.localeCompare(b) : aW - bW\n  })\n    .map(file => {\n      let lang = file.match(/_([^.]+)\\./)![1]\n      let langWithRegion\n      if (lang.includes(\"_\")) {\n        langWithRegion = lang\n        lang = langWithRegion.substring(0, lang.indexOf(\"_\"))\n      }\n      else {\n        lang = lang.toLowerCase()\n        langWithRegion = toLangWithRegion(lang)\n      }\n      return {file: path.join(packager.buildResourcesDir, file), lang, langWithRegion, langName: (langIdToName as any)[lang]}\n    })\n}\n\nexport async function getNotLocalizedLicenseFile(custom: string | null | undefined, packager: PlatformPackager<any>, supportedExtension: Array<string> = [\"rtf\", \"txt\", \"html\"]): Promise<string | null> {\n  const possibleFiles: Array<string> = []\n  for (const name of [\"license\", \"eula\"]) {\n    for (const ext of supportedExtension) {\n      possibleFiles.push(`${name}.${ext}`)\n      possibleFiles.push(`${name.toUpperCase()}.${ext}`)\n      possibleFiles.push(`${name}.${ext.toUpperCase()}`)\n      possibleFiles.push(`${name.toUpperCase()}.${ext.toUpperCase()}`)\n    }\n  }\n\n  return await packager.getResource(custom, ...possibleFiles)\n}\n\nexport async function getLicenseFiles(packager: PlatformPackager<any>): Promise<Array<LicenseFile>> {\n  return getLicenseAssets((await packager.resourceList)\n    .filter(it => {\n      const name = it.toLowerCase()\n      return (name.startsWith(\"license_\") || name.startsWith(\"eula_\")) && (name.endsWith(\".rtf\") || name.endsWith(\".txt\"))\n    }), packager)\n}\n\nexport interface LicenseFile {\n  file: string\n  lang: string\n  langWithRegion: string\n  langName: string\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getMacOsVersion = getMacOsVersion;
exports.isMacOsSierra = isMacOsSierra;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

function semver() {
  const data = _interopRequireWildcard(require("semver"));

  semver = function () {
    return data;
  };

  return data;
}

function _log() {
  const data = require("builder-util/out/log");

  _log = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const macOsVersion = new (_lazyVal().Lazy)(
/*#__PURE__*/
(0, _bluebirdLst().coroutine)(function* () {
  const file = yield (0, _fsExtraP().readFile)("/System/Library/CoreServices/SystemVersion.plist", "utf8");
  const matches = /<key>ProductVersion<\/key>[\s\S]*<string>([\d.]+)<\/string>/.exec(file);

  if (!matches) {
    throw new Error("Couldn't find the macOS version");
  }

  _log().log.debug({
    version: matches[1]
  }, "macOS version");

  return clean(matches[1]);
}));

function clean(version) {
  return version.split(".").length === 2 ? `${version}.0` : version;
}

function isOsVersionGreaterThanOrEqualTo(_x) {
  return _isOsVersionGreaterThanOrEqualTo.apply(this, arguments);
}

function _isOsVersionGreaterThanOrEqualTo() {
  _isOsVersionGreaterThanOrEqualTo = (0, _bluebirdLst().coroutine)(function* (input) {
    return semver().gte((yield macOsVersion.value), clean(input));
  });
  return _isOsVersionGreaterThanOrEqualTo.apply(this, arguments);
}

function getMacOsVersion() {
  return macOsVersion.value;
}

function isMacOsSierra() {
  return _isMacOsSierra.apply(this, arguments);
} function _isMacOsSierra() {
  _isMacOsSierra = (0, _bluebirdLst().coroutine)(function* () {
    return process.platform === "darwin" && (yield isOsVersionGreaterThanOrEqualTo("10.12.0"));
  });
  return _isMacOsSierra.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=macosVersion.js.map{"version":3,"sources":["../../src/util/macosVersion.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEA,MAAM,YAAY,GAAG,KAAI,eAAJ;AAAA;AAAA,8BAAiB,aAAW;AAC/C,QAAM,IAAI,SAAS,0BAAS,kDAAT,EAA6D,MAA7D,CAAnB;AACA,QAAM,OAAO,GAAG,8DAA8D,IAA9D,CAAmE,IAAnE,CAAhB;;AACA,MAAI,CAAC,OAAL,EAAc;AACZ,UAAM,IAAI,KAAJ,CAAU,iCAAV,CAAN;AACD;;AACD,aAAI,KAAJ,CAAU;AAAC,IAAA,OAAO,EAAE,OAAO,CAAC,CAAD;AAAjB,GAAV,EAAiC,eAAjC;;AACA,SAAO,KAAK,CAAC,OAAO,CAAC,CAAD,CAAR,CAAZ;AACD,CARoB,EAArB;;AAUA,SAAS,KAAT,CAAe,OAAf,EAA8B;AAC5B,SAAO,OAAO,CAAC,KAAR,CAAc,GAAd,EAAmB,MAAnB,KAA8B,CAA9B,GAAkC,GAAG,OAAO,IAA5C,GAAmD,OAA1D;AACD;;SAEc,+B;;;;;mEAAf,WAA+C,KAA/C,EAA4D;AAC1D,WAAO,MAAM,GAAC,GAAP,QAAiB,YAAY,CAAC,KAA9B,GAAqC,KAAK,CAAC,KAAD,CAA1C,CAAP;AACD,G;;;;AAEK,SAAU,eAAV,GAAyB;AAC7B,SAAO,YAAY,CAAC,KAApB;AACD;;SAEqB,a;;;;;;iDAAf,aAA4B;AACjC,WAAO,OAAO,CAAC,QAAR,KAAqB,QAArB,WAAuC,+BAA+B,CAAC,SAAD,CAAtE,CAAP;AACD,G","sourcesContent":["import { readFile } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as semver from \"semver\"\nimport { log } from \"builder-util/out/log\"\n\nconst macOsVersion = new Lazy<string>(async () => {\n  const file = await readFile(\"/System/Library/CoreServices/SystemVersion.plist\", \"utf8\")\n  const matches = /<key>ProductVersion<\\/key>[\\s\\S]*<string>([\\d.]+)<\\/string>/.exec(file)\n  if (!matches) {\n    throw new Error(\"Couldn't find the macOS version\")\n  }\n  log.debug({version: matches[1]}, \"macOS version\")\n  return clean(matches[1])\n})\n\nfunction clean(version: string) {\n  return version.split(\".\").length === 2 ? `${version}.0` : version\n}\n\nasync function isOsVersionGreaterThanOrEqualTo(input: string) {\n  return semver.gte(await macOsVersion.value, clean(input))\n}\n\nexport function getMacOsVersion() {\n  return macOsVersion.value\n}\n\nexport async function isMacOsSierra() {\n  return process.platform === \"darwin\" && await isOsVersionGreaterThanOrEqualTo(\"10.12.0\")\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.expandMacro = expandMacro;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function expandMacro(pattern, arch, appInfo, extra = {}, isProductNameSanitized = true) {
  if (arch == null) {
    pattern = pattern // tslint:disable-next-line:no-invalid-template-strings
    .replace("-${arch}", "") // tslint:disable-next-line:no-invalid-template-strings
    .replace(" ${arch}", "") // tslint:disable-next-line:no-invalid-template-strings
    .replace("_${arch}", "") // tslint:disable-next-line:no-invalid-template-strings
    .replace("/${arch}", "");
  }

  return pattern.replace(/\${([_a-zA-Z./*]+)}/g, (match, p1) => {
    switch (p1) {
      case "productName":
        return isProductNameSanitized ? appInfo.productFilename : appInfo.productName;

      case "arch":
        if (arch == null) {
          // see above, we remove macro if no arch
          return "";
        }

        return arch;

      case "author":
        const companyName = appInfo.companyName;

        if (companyName == null) {
          throw new (_builderUtil().InvalidConfigurationError)(`cannot expand pattern "${pattern}": author is not specified`, "ERR_ELECTRON_BUILDER_AUTHOR_UNSPECIFIED");
        }

        return companyName;

      case "platform":
        return process.platform;

      case "channel":
        return appInfo.channel || "latest";

      default:
        if (p1 in appInfo) {
          return appInfo[p1];
        }

        if (p1.startsWith("env.")) {
          const envName = p1.substring("env.".length);
          const envValue = process.env[envName];

          if (envValue == null) {
            throw new (_builderUtil().InvalidConfigurationError)(`cannot expand pattern "${pattern}": env ${envName} is not defined`, "ERR_ELECTRON_BUILDER_ENV_NOT_DEFINED");
          }

          return envValue;
        }

        const value = extra[p1];

        if (value == null) {
          throw new (_builderUtil().InvalidConfigurationError)(`cannot expand pattern "${pattern}": macro ${p1} is not defined`, "ERR_ELECTRON_BUILDER_MACRO_NOT_DEFINED");
        } else {
          return value;
        }

    }
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=macroExpander.js.map{"version":3,"sources":["../../src/util/macroExpander.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGM,SAAU,WAAV,CAAsB,OAAtB,EAAuC,IAAvC,EAAwE,OAAxE,EAA0F,KAAA,GAAa,EAAvG,EAA2G,sBAAsB,GAAG,IAApI,EAAwI;AAC5I,MAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB,IAAA,OAAO,GAAG,OAAO,CACjB;AADiB,KAEd,OAFO,CAEC,UAFD,EAEa,EAFb,EAGR;AAHQ,KAIP,OAJO,CAIC,UAJD,EAIa,EAJb,EAKR;AALQ,KAMP,OANO,CAMC,UAND,EAMa,EANb,EAOR;AAPQ,KAQP,OARO,CAQC,UARD,EAQa,EARb,CAAV;AASD;;AAED,SAAO,OAAO,CAAC,OAAR,CAAgB,sBAAhB,EAAwC,CAAC,KAAD,EAAQ,EAAR,KAAsB;AACnE,YAAQ,EAAR;AACE,WAAK,aAAL;AACE,eAAO,sBAAsB,GAAG,OAAO,CAAC,eAAX,GAA6B,OAAO,CAAC,WAAlE;;AAEF,WAAK,MAAL;AACE,YAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB;AACA,iBAAO,EAAP;AACD;;AACD,eAAO,IAAP;;AAEF,WAAK,QAAL;AACE,cAAM,WAAW,GAAG,OAAO,CAAC,WAA5B;;AACA,YAAI,WAAW,IAAI,IAAnB,EAAyB;AACvB,gBAAM,KAAI,wCAAJ,EAA8B,0BAA0B,OAAO,4BAA/D,EAA6F,yCAA7F,CAAN;AACD;;AACD,eAAO,WAAP;;AAEF,WAAK,UAAL;AACE,eAAO,OAAO,CAAC,QAAf;;AAEF,WAAK,SAAL;AACE,eAAO,OAAO,CAAC,OAAR,IAAmB,QAA1B;;AAEF;AACE,YAAI,EAAE,IAAI,OAAV,EAAmB;AACjB,iBAAQ,OAAe,CAAC,EAAD,CAAvB;AACD;;AAED,YAAI,EAAE,CAAC,UAAH,CAAc,MAAd,CAAJ,EAA2B;AACzB,gBAAM,OAAO,GAAG,EAAE,CAAC,SAAH,CAAa,OAAO,MAApB,CAAhB;AACA,gBAAM,QAAQ,GAAG,OAAO,CAAC,GAAR,CAAY,OAAZ,CAAjB;;AACA,cAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,kBAAM,KAAI,wCAAJ,EAA8B,0BAA0B,OAAO,UAAU,OAAO,iBAAhF,EAAmG,sCAAnG,CAAN;AACD;;AACD,iBAAO,QAAP;AACD;;AAED,cAAM,KAAK,GAAG,KAAK,CAAC,EAAD,CAAnB;;AACA,YAAI,KAAK,IAAI,IAAb,EAAmB;AACjB,gBAAM,KAAI,wCAAJ,EAA8B,0BAA0B,OAAO,YAAY,EAAE,iBAA7E,EAAgG,wCAAhG,CAAN;AACD,SAFD,MAGK;AACH,iBAAO,KAAP;AACD;;AA5CL;AA8CD,GA/CM,CAAP;AAgDD,C","sourcesContent":["import { InvalidConfigurationError } from \"builder-util\"\nimport { AppInfo } from \"../appInfo\"\n\nexport function expandMacro(pattern: string, arch: string | null | undefined, appInfo: AppInfo, extra: any = {}, isProductNameSanitized = true): string {\n  if (arch == null) {\n    pattern = pattern\n    // tslint:disable-next-line:no-invalid-template-strings\n      .replace(\"-${arch}\", \"\")\n      // tslint:disable-next-line:no-invalid-template-strings\n      .replace(\" ${arch}\", \"\")\n      // tslint:disable-next-line:no-invalid-template-strings\n      .replace(\"_${arch}\", \"\")\n      // tslint:disable-next-line:no-invalid-template-strings\n      .replace(\"/${arch}\", \"\")\n  }\n\n  return pattern.replace(/\\${([_a-zA-Z./*]+)}/g, (match, p1): string => {\n    switch (p1) {\n      case \"productName\":\n        return isProductNameSanitized ? appInfo.productFilename : appInfo.productName\n\n      case \"arch\":\n        if (arch == null) {\n          // see above, we remove macro if no arch\n          return \"\"\n        }\n        return arch\n\n      case \"author\":\n        const companyName = appInfo.companyName\n        if (companyName == null) {\n          throw new InvalidConfigurationError(`cannot expand pattern \"${pattern}\": author is not specified`, \"ERR_ELECTRON_BUILDER_AUTHOR_UNSPECIFIED\")\n        }\n        return companyName\n\n      case \"platform\":\n        return process.platform\n\n      case \"channel\":\n        return appInfo.channel || \"latest\"\n\n      default:\n        if (p1 in appInfo) {\n          return (appInfo as any)[p1]\n        }\n\n        if (p1.startsWith(\"env.\")) {\n          const envName = p1.substring(\"env.\".length)\n          const envValue = process.env[envName]\n          if (envValue == null) {\n            throw new InvalidConfigurationError(`cannot expand pattern \"${pattern}\": env ${envName} is not defined`, \"ERR_ELECTRON_BUILDER_ENV_NOT_DEFINED\")\n          }\n          return envValue\n        }\n\n        const value = extra[p1]\n        if (value == null) {\n          throw new InvalidConfigurationError(`cannot expand pattern \"${pattern}\": macro ${p1} is not defined`, \"ERR_ELECTRON_BUILDER_MACRO_NOT_DEFINED\")\n        }\n        else {\n          return value\n        }\n    }\n  })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createLazyProductionDeps = createLazyProductionDeps;
exports.getProductionDependencies = getProductionDependencies;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

// noinspection SpellCheckingInspection
const knownAlwaysIgnoredDevDeps = new Set(["electron-builder-tslint-config", "electron-download", "libui-download", "electron-forge", "electron-packager", "electron-compilers", "prebuild-install", "nan", "electron-webpack", "electron-webpack-ts", "electron-webpack-vue", "@types"]); // noinspection JSUnusedGlobalSymbols

function createLazyProductionDeps(projectDir) {
  return new (_lazyVal().Lazy)(() => getProductionDependencies(projectDir));
}
/** @internal */


function getProductionDependencies(_x) {
  return _getProductionDependencies.apply(this, arguments);
}

function _getProductionDependencies() {
  _getProductionDependencies = (0, _bluebirdLst().coroutine)(function* (folder) {
    const result = [];
    computeSortedPaths((yield new Collector().collect(folder)), result, false);
    return result;
  });
  return _getProductionDependencies.apply(this, arguments);
}

const ignoredProperties = new Set(["description", "author", "bugs", "engines", "repository", "build", "main", "license", "homepage", "scripts", "maintainers", "contributors", "keywords", "devDependencies", "files", "typings", "types", "xo", "resolutions"]);

function readJson(file) {
  return (0, _fsExtraP().readFile)(file, "utf-8").then(it => JSON.parse(it, (key, value) => ignoredProperties.has(key) ? undefined : value));
}

function computeSortedPaths(parent, result, isExtraneous) {
  const dependencies = parent.dependencies;

  if (dependencies == null) {
    return;
  }

  for (const dep of dependencies.values()) {
    if (dep.extraneous === isExtraneous) {
      result.push(dep);
      computeSortedPaths(dep, result, isExtraneous);
    }
  }
}

class Collector {
  constructor() {
    this.pathToMetadata = new Map();
    this.unresolved = new Map();
  }

  collect(dir) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const rootDependency = yield readJson(path.join(dir, "package.json"));
      yield _this.readInstalled(path.join(dir, "node_modules"), rootDependency, rootDependency.name);

      _this.unmarkExtraneous(rootDependency);

      if (_this.unresolved.size > 0) {
        _builderUtil().log.debug({
          unresolved: Array.from(_this.unresolved.keys()).join(", ")
        }, "unresolved dependencies after first round");

        yield _this.resolveUnresolvedHoisted(rootDependency, dir);
      }

      return rootDependency;
    })();
  }

  resolveUnresolvedHoisted(rootDependency, dir) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      let nameToMetadata = rootDependency.dependencies;

      if (nameToMetadata == null) {
        rootDependency.dependencies = new Map();
        nameToMetadata = rootDependency.dependencies;
      }

      let parentDir = dir;

      do {
        parentDir = path.dirname(parentDir);

        if (parentDir === "" || parentDir.endsWith("/") || parentDir.endsWith("\\")) {
          // https://github.com/electron-userland/electron-builder/issues/2220
          const list = Array.from(_this2.unresolved.keys()).filter(it => !_this2.unresolved.get(it));

          if (list.length === 1 && list[0] === "proton-native") {
            // resolve in tests
            parentDir = process.cwd();
          } else {
            if (list.length !== 0) {
              const message = `Unresolved node modules: ${list.join(", ")}`;

              if ((0, _builderUtil().isEnvTrue)(process.env.ELECTRON_BUILDER_ALLOW_UNRESOLVED_DEPENDENCIES)) {
                _builderUtil().log.warn(message);
              } else {
                throw new Error(message);
              }
            }

            break;
          }
        }

        const parentNodeModulesDir = parentDir + path.sep + "node_modules";
        const dirStat = yield (0, _fs().statOrNull)(parentNodeModulesDir);

        if (dirStat == null || !dirStat.isDirectory()) {
          if (dirStat == null || !dirStat.isDirectory()) {
            continue;
          }
        } // https://github.com/electron-userland/electron-builder/issues/2222#issuecomment-339060335
        // step 1: resolve current unresolved
        // step n: try to resolve new unresolved in the same parent dir until at least something is resolved in the dir


        while (true) {
          const unresolved = Array.from(_this2.unresolved.keys());

          _this2.unresolved.clear();

          const resolved = yield _bluebirdLst().default.map(unresolved, it => {
            return _this2.readChildPackage(it, parentNodeModulesDir, rootDependency).catch(e => {
              if (e.code === "ENOENT") {
                return null;
              } else {
                throw e;
              }
            });
          }, _fs().CONCURRENCY);
          let hasResolved = false;

          for (const dep of resolved) {
            if (dep != null) {
              hasResolved = true;

              _this2.unmarkExtraneous(dep);

              nameToMetadata.set(dep.realName, dep);
            }
          }

          if (!hasResolved) {
            break;
          }

          _this2.unmarkExtraneous(rootDependency);

          if (_this2.unresolved.size === 0) {
            return;
          }
        }
      } while (_this2.unresolved.size > 0);
    })();
  }

  readInstalled(nodeModulesDir, dependency, name) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      dependency.realName = name;
      dependency.directDependencyNames = dependency.dependencies == null ? null : Object.keys(dependency.dependencies); // mark as extraneous at this point.
      // this will be un-marked in unmarkExtraneous, where we mark as not-extraneous everything that is required in some way from the root object.

      dependency.extraneous = true;
      dependency.optional = true;

      if (dependency.dependencies == null && dependency.optionalDependencies == null) {
        // package has only dev or peer dependencies - no need to check child node_module
        dependency.dependencies = null;
        return;
      }

      const childModules = yield readNodeModulesDir(nodeModulesDir);

      if (childModules == null) {
        dependency.dependencies = null;
        return;
      }

      const deps = yield _bluebirdLst().default.map(childModules, it => _this3.readChildPackage(it, nodeModulesDir, dependency), _fs().CONCURRENCY);

      if (deps.length === 0) {
        dependency.dependencies = null;
        return;
      }

      const nameToMetadata = new Map();

      for (const dep of deps) {
        if (dep != null) {
          nameToMetadata.set(dep.realName, dep);
        }
      }

      dependency.dependencies = nameToMetadata;
    })();
  }

  readChildPackage(name, nodeModulesDir, parent) {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const rawDir = path.join(nodeModulesDir, name);
      let dir = rawDir;
      const stat = yield (0, _fsExtraP().lstat)(dir);
      const isSymbolicLink = stat.isSymbolicLink();

      if (isSymbolicLink) {
        dir = yield (0, _promise().orNullIfFileNotExist)((0, _fsExtraP().realpath)(dir));

        if (dir == null) {
          _builderUtil().log.debug({
            path: rawDir
          }, "broken symlink");

          return null;
        }
      }

      const processed = _this4.pathToMetadata.get(dir);

      if (processed != null) {
        return processed;
      }

      const metadata = yield (0, _promise().orNullIfFileNotExist)(readJson(path.join(dir, "package.json")));

      if (metadata == null) {
        return null;
      }

      if (isSymbolicLink) {
        metadata.link = dir;
        metadata.stat = stat;
      } else {
        metadata.parent = parent; // overwrite if already set by project package.json

        metadata.link = undefined;
      }

      metadata.path = rawDir; // do not add root project to result

      _this4.pathToMetadata.set(dir, metadata);

      yield _this4.readInstalled(dir + path.sep + "node_modules", metadata, name);
      return metadata;
    })();
  }

  unmark(deps, obj, unsetOptional, isOptional) {
    for (const name of deps) {
      const dep = this.findDep(obj, name, isOptional);

      if (dep != null) {
        if (unsetOptional) {
          dep.optional = false;
        }

        if (dep.extraneous) {
          this.unmarkExtraneous(dep);
        }
      }
    }
  }

  unmarkExtraneous(obj) {
    // Mark all non-required deps as extraneous.
    // start from the root object and mark as non-extraneous all modules
    // that haven't been previously flagged as extraneous then propagate to all their dependencies
    obj.extraneous = false;

    if (obj.directDependencyNames != null) {
      this.unmark(obj.directDependencyNames, obj, true, false);
    }

    if (obj.peerDependencies != null) {
      this.unmark(Object.keys(obj.peerDependencies), obj, true, false);
    }

    if (obj.optionalDependencies != null) {
      this.unmark(Object.keys(obj.optionalDependencies), obj, false, true);
    }
  } // find the one that will actually be loaded by require() so we can make sure it's valid


  findDep(obj, name, isOptional) {
    if (isIgnoredDep(name)) {
      return null;
    }

    let r = obj;
    let found = null;

    while (r != null && found == null) {
      // if r is a valid choice, then use that.
      // kinda weird if a pkg depends on itself, but after the first iteration of this loop, it indicates a dep cycle.
      found = r.dependencies == null ? null : r.dependencies.get(name);

      if (found == null && r.realName === name) {
        found = r;
      }

      r = r.link == null ? r.parent : null;
    }

    if (found == null) {
      this.unresolved.set(name, isOptional);
    }

    return found;
  }

}

function isIgnoredDep(name) {
  return knownAlwaysIgnoredDevDeps.has(name) || name.startsWith("@types/");
}

function readNodeModulesDir(_x2) {
  return _readNodeModulesDir.apply(this, arguments);
} function _readNodeModulesDir() {
  _readNodeModulesDir = (0, _bluebirdLst().coroutine)(function* (dir) {
    let files;

    try {
      files = (yield (0, _fsExtraP().readdir)(dir)).filter(it => !it.startsWith(".") && !knownAlwaysIgnoredDevDeps.has(it));
    } catch (e) {
      // error indicates that nothing is installed here
      return null;
    }

    files.sort();
    const scopes = files.filter(it => it.startsWith("@"));

    if (scopes.length === 0) {
      return files;
    }

    const result = files.filter(it => !it.startsWith("@"));
    const scopeFileList = yield _bluebirdLst().default.map(scopes, it => (0, _fsExtraP().readdir)(path.join(dir, it)));

    for (let i = 0; i < scopes.length; i++) {
      const list = scopeFileList[i];
      list.sort();

      for (const file of list) {
        if (!file.startsWith(".")) {
          result.push(`${scopes[i]}/${file}`);
        }
      }
    }

    return result;
  });
  return _readNodeModulesDir.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=packageDependencies.js.map{"version":3,"sources":["../../src/util/packageDependencies.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { isEnvTrue, log } from \"builder-util\"\nimport { CONCURRENCY, statOrNull } from \"builder-util/out/fs\"\nimport { orNullIfFileNotExist } from \"builder-util/out/promise\"\nimport { lstat, readdir, readFile, realpath, Stats } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\n\nexport interface Dependency {\n  name: string\n  version: string\n  path: string\n  extraneous: boolean\n  optional: boolean\n\n  dependencies: Map<string, Dependency> | null\n  directDependencyNames: Array<string> | null\n  peerDependencies: { [key: string]: any } | null\n  optionalDependencies: { [key: string]: any } | null\n\n  realName: string\n  link?: string\n\n  parent?: Dependency\n\n  // only if link\n  stat?: Stats\n}\n\n// noinspection SpellCheckingInspection\nconst knownAlwaysIgnoredDevDeps = new Set([\n  \"electron-builder-tslint-config\", \"electron-download\", \"libui-download\",\n  \"electron-forge\", \"electron-packager\", \"electron-compilers\",\n  \"prebuild-install\", \"nan\",\n  \"electron-webpack\", \"electron-webpack-ts\", \"electron-webpack-vue\",\n  \"@types\",\n])\n\n// noinspection JSUnusedGlobalSymbols\nexport function createLazyProductionDeps(projectDir: string) {\n  return new Lazy(() => getProductionDependencies(projectDir))\n}\n\n/** @internal */\nexport async function getProductionDependencies(folder: string): Promise<Array<Dependency>> {\n  const result: Array<Dependency> = []\n  computeSortedPaths(await new Collector().collect(folder), result, false)\n  return result\n}\n\nconst ignoredProperties = new Set([\"description\", \"author\", \"bugs\", \"engines\", \"repository\", \"build\", \"main\", \"license\", \"homepage\", \"scripts\", \"maintainers\", \"contributors\", \"keywords\", \"devDependencies\", \"files\", \"typings\", \"types\", \"xo\", \"resolutions\"])\n\nfunction readJson(file: string) {\n  return readFile(file, \"utf-8\")\n    .then(it => JSON.parse(it, (key, value) => ignoredProperties.has(key) ? undefined : value))\n}\n\nfunction computeSortedPaths(parent: Dependency, result: Array<Dependency>, isExtraneous: boolean) {\n  const dependencies = parent.dependencies\n  if (dependencies == null) {\n    return\n  }\n\n  for (const dep of dependencies.values()) {\n    if (dep.extraneous === isExtraneous) {\n      result.push(dep)\n      computeSortedPaths(dep, result, isExtraneous)\n    }\n  }\n}\n\nclass Collector {\n  readonly pathToMetadata = new Map<string, Dependency>()\n  private unresolved = new Map<string, boolean>()\n\n  async collect(dir: string) {\n    const rootDependency: Dependency = await readJson(path.join(dir, \"package.json\"))\n    await this.readInstalled(path.join(dir, \"node_modules\"), rootDependency, rootDependency.name)\n    this.unmarkExtraneous(rootDependency)\n\n    if (this.unresolved.size > 0) {\n      log.debug({unresolved: Array.from(this.unresolved.keys()).join(\", \")}, \"unresolved dependencies after first round\")\n      await this.resolveUnresolvedHoisted(rootDependency, dir)\n    }\n    return rootDependency\n  }\n\n  private async resolveUnresolvedHoisted(rootDependency: Dependency, dir: string): Promise<void> {\n    let nameToMetadata = rootDependency.dependencies\n    if (nameToMetadata == null) {\n      rootDependency.dependencies = new Map<string, Dependency>()\n      nameToMetadata = rootDependency.dependencies\n    }\n\n    let parentDir = dir\n    do {\n      parentDir = path.dirname(parentDir)\n      if (parentDir === \"\" || parentDir.endsWith(\"/\") || parentDir.endsWith(\"\\\\\")) {\n        // https://github.com/electron-userland/electron-builder/issues/2220\n        const list = Array.from(this.unresolved.keys()).filter(it => !this.unresolved.get(it))\n        if (list.length === 1 && list[0] === \"proton-native\") {\n          // resolve in tests\n          parentDir = process.cwd()\n        }\n        else {\n          if (list.length !== 0) {\n            const message = `Unresolved node modules: ${list.join(\", \")}`\n            if (isEnvTrue(process.env.ELECTRON_BUILDER_ALLOW_UNRESOLVED_DEPENDENCIES)) {\n              log.warn(message)\n            }\n            else {\n              throw new Error(message)\n            }\n          }\n          break\n        }\n      }\n\n      const parentNodeModulesDir = parentDir + path.sep + \"node_modules\"\n      const dirStat = await statOrNull(parentNodeModulesDir)\n      if (dirStat == null || !dirStat.isDirectory()) {\n        if (dirStat == null || !dirStat.isDirectory()) {\n          continue\n        }\n      }\n\n      // https://github.com/electron-userland/electron-builder/issues/2222#issuecomment-339060335\n      // step 1: resolve current unresolved\n      // step n: try to resolve new unresolved in the same parent dir until at least something is resolved in the dir\n      while (true) {\n        const unresolved = Array.from(this.unresolved.keys())\n        this.unresolved.clear()\n\n        const resolved = await BluebirdPromise.map(unresolved, it => {\n          return this.readChildPackage(it, parentNodeModulesDir, rootDependency)\n            .catch(e => {\n              if ((e as NodeJS.ErrnoException).code === \"ENOENT\") {\n                return null\n              }\n              else {\n                throw e\n              }\n            })\n        }, CONCURRENCY)\n\n        let hasResolved = false\n\n        for (const dep of resolved) {\n          if (dep != null) {\n            hasResolved = true\n            this.unmarkExtraneous(dep)\n            nameToMetadata.set(dep.realName, dep)\n          }\n        }\n\n        if (!hasResolved) {\n          break\n        }\n\n        this.unmarkExtraneous(rootDependency)\n\n        if (this.unresolved.size === 0) {\n          return\n        }\n      }\n    }\n    while (this.unresolved.size > 0)\n  }\n\n  private async readInstalled(nodeModulesDir: string, dependency: Dependency, name: string): Promise<void> {\n    dependency.realName = name\n    dependency.directDependencyNames = dependency.dependencies == null ? null : Object.keys(dependency.dependencies)\n\n    // mark as extraneous at this point.\n    // this will be un-marked in unmarkExtraneous, where we mark as not-extraneous everything that is required in some way from the root object.\n    dependency.extraneous = true\n    dependency.optional = true\n\n    if (dependency.dependencies == null && dependency.optionalDependencies == null) {\n      // package has only dev or peer dependencies - no need to check child node_module\n      dependency.dependencies = null\n      return\n    }\n\n    const childModules = await readNodeModulesDir(nodeModulesDir)\n    if (childModules == null) {\n      dependency.dependencies = null\n      return\n    }\n\n    const deps = await BluebirdPromise.map(childModules, it => this.readChildPackage(it, nodeModulesDir, dependency), CONCURRENCY)\n    if (deps.length === 0) {\n      dependency.dependencies = null\n      return\n    }\n\n    const nameToMetadata = new Map<string, Dependency>()\n    for (const dep of deps) {\n      if (dep != null) {\n        nameToMetadata.set(dep.realName, dep)\n      }\n    }\n    dependency.dependencies = nameToMetadata\n  }\n\n  private async readChildPackage(name: string, nodeModulesDir: string, parent: Dependency): Promise<Dependency | null> {\n    const rawDir = path.join(nodeModulesDir, name)\n    let dir: string | null = rawDir\n    const stat = await lstat(dir)\n    const isSymbolicLink = stat.isSymbolicLink()\n    if (isSymbolicLink) {\n      dir = await orNullIfFileNotExist(realpath(dir))\n      if (dir == null) {\n        log.debug({path: rawDir}, \"broken symlink\")\n        return null\n      }\n    }\n\n    const processed = this.pathToMetadata.get(dir)\n    if (processed != null) {\n      return processed\n    }\n\n    const metadata: Dependency = await orNullIfFileNotExist(readJson(path.join(dir, \"package.json\")))\n    if (metadata == null) {\n      return null\n    }\n\n    if (isSymbolicLink) {\n      metadata.link = dir\n      metadata.stat = stat\n    }\n    else {\n      metadata.parent = parent\n\n      // overwrite if already set by project package.json\n      metadata.link = undefined\n    }\n\n    metadata.path = rawDir\n\n    // do not add root project to result\n    this.pathToMetadata.set(dir, metadata)\n\n    await this.readInstalled(dir + path.sep + \"node_modules\", metadata, name)\n    return metadata\n  }\n\n  private unmark(deps: Iterable<string>, obj: Dependency, unsetOptional: boolean, isOptional: boolean) {\n    for (const name of deps) {\n      const dep = this.findDep(obj, name, isOptional)\n      if (dep != null) {\n        if (unsetOptional) {\n          dep.optional = false\n        }\n        if (dep.extraneous) {\n          this.unmarkExtraneous(dep)\n        }\n      }\n    }\n  }\n\n  private unmarkExtraneous(obj: Dependency) {\n    // Mark all non-required deps as extraneous.\n    // start from the root object and mark as non-extraneous all modules\n    // that haven't been previously flagged as extraneous then propagate to all their dependencies\n\n    obj.extraneous = false\n\n    if (obj.directDependencyNames != null) {\n      this.unmark(obj.directDependencyNames, obj, true, false)\n    }\n\n    if (obj.peerDependencies != null) {\n      this.unmark(Object.keys(obj.peerDependencies), obj, true, false)\n    }\n\n    if (obj.optionalDependencies != null) {\n      this.unmark(Object.keys(obj.optionalDependencies), obj, false, true)\n    }\n  }\n\n  // find the one that will actually be loaded by require() so we can make sure it's valid\n  private findDep(obj: Dependency, name: string, isOptional: boolean) {\n    if (isIgnoredDep(name)) {\n      return null\n    }\n\n    let r: Dependency | null | undefined = obj\n    let found = null\n    while (r != null && found == null) {\n      // if r is a valid choice, then use that.\n      // kinda weird if a pkg depends on itself, but after the first iteration of this loop, it indicates a dep cycle.\n      found = r.dependencies == null ? null : r.dependencies.get(name)\n      if (found == null && r.realName === name) {\n        found = r\n      }\n      r = r.link == null ? r.parent : null\n    }\n\n    if (found == null) {\n      this.unresolved.set(name, isOptional)\n    }\n    return found\n  }\n}\n\nfunction isIgnoredDep(name: string) {\n  return knownAlwaysIgnoredDevDeps.has(name) || name.startsWith(\"@types/\")\n}\n\nasync function readNodeModulesDir(dir: string): Promise<Array<string> | null> {\n  let files: Array<string>\n  try {\n    files = (await readdir(dir)).filter(it => !it.startsWith(\".\") && !knownAlwaysIgnoredDevDeps.has(it))\n  }\n  catch (e) {\n    // error indicates that nothing is installed here\n    return null\n  }\n\n  files.sort()\n\n  const scopes = files.filter(it => it.startsWith(\"@\"))\n  if (scopes.length === 0) {\n    return files\n  }\n\n  const result = files.filter(it => !it.startsWith(\"@\"))\n  const scopeFileList = await BluebirdPromise.map(scopes, it => readdir(path.join(dir, it)))\n  for (let i = 0; i < scopes.length; i++) {\n    const list = scopeFileList[i]\n    list.sort()\n    for (const file of list) {\n      if (!file.startsWith(\".\")) {\n        result.push(`${scopes[i]}/${file}`)\n      }\n    }\n  }\n\n  return result\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.readPackageJson = readPackageJson;
exports.checkMetadata = checkMetadata;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function semver() {
  const data = _interopRequireWildcard(require("semver"));

  semver = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const normalizeData = require("normalize-package-data");
/** @internal */


function readPackageJson(_x) {
  return _readPackageJson.apply(this, arguments);
}

function _readPackageJson() {
  _readPackageJson = (0, _bluebirdLst().coroutine)(function* (file) {
    const data = yield (0, _fsExtraP().readJson)(file);
    yield authors(file, data);
    normalizeData(data); // remove not required fields because can be used for remote build

    delete data.scripts;
    delete data.readme;
    return data;
  });
  return _readPackageJson.apply(this, arguments);
}

function authors(_x2, _x3) {
  return _authors.apply(this, arguments);
}
/** @internal */


function _authors() {
  _authors = (0, _bluebirdLst().coroutine)(function* (file, data) {
    if (data.contributors != null) {
      return;
    }

    let authorData;

    try {
      authorData = yield (0, _fsExtraP().readFile)(path.resolve(path.dirname(file), "AUTHORS"), "utf8");
    } catch (ignored) {
      return;
    }

    data.contributors = authorData.split(/\r?\n/g).map(it => it.replace(/^\s*#.*$/, "").trim());
  });
  return _authors.apply(this, arguments);
}

function checkMetadata(metadata, devMetadata, appPackageFile, devAppPackageFile) {
  const errors = [];

  const reportError = missedFieldName => {
    errors.push(`Please specify '${missedFieldName}' in the package.json (${appPackageFile})`);
  };

  const checkNotEmpty = (name, value) => {
    if ((0, _builderUtil().isEmptyOrSpaces)(value)) {
      reportError(name);
    }
  };

  if (metadata.directories != null) {
    errors.push(`"directories" in the root is deprecated, please specify in the "build"`);
  }

  checkNotEmpty("name", metadata.name);

  if ((0, _builderUtil().isEmptyOrSpaces)(metadata.description)) {
    _builderUtil().log.warn({
      appPackageFile
    }, `description is missed in the package.json`);
  }

  if (metadata.author == null) {
    _builderUtil().log.warn({
      appPackageFile
    }, `author is missed in the package.json`);
  }

  checkNotEmpty("version", metadata.version);

  if (metadata != null) {
    checkDependencies(metadata.dependencies, errors);
  }

  if (metadata !== devMetadata) {
    if (metadata.build != null) {
      errors.push(`'build' in the application package.json (${appPackageFile}) is not supported since 3.0 anymore. Please move 'build' into the development package.json (${devAppPackageFile})`);
    }
  }

  const devDependencies = metadata.devDependencies;

  if (devDependencies != null && "electron-rebuild" in devDependencies) {
    _builderUtil().log.info('electron-rebuild not required if you use electron-builder, please consider to remove excess dependency from devDependencies\n\nTo ensure your native dependencies are always matched electron version, simply add script `"postinstall": "electron-builder install-app-deps" to your `package.json`');
  }

  if (errors.length > 0) {
    throw new (_builderUtil().InvalidConfigurationError)(errors.join("\n"));
  }
}

function versionSatisfies(version, range, loose) {
  if (version == null) {
    return false;
  }

  const coerced = semver().coerce(version);

  if (coerced == null) {
    return false;
  }

  return semver().satisfies(coerced, range, loose);
}

function checkDependencies(dependencies, errors) {
  if (dependencies == null) {
    return;
  }

  const updaterVersion = dependencies["electron-updater"];
  const requiredElectronUpdaterVersion = "4.0.0";

  if (updaterVersion != null && !versionSatisfies(updaterVersion, `>=${requiredElectronUpdaterVersion}`)) {
    errors.push(`At least electron-updater ${requiredElectronUpdaterVersion} is recommended by current electron-builder version. Please set electron-updater version to "^${requiredElectronUpdaterVersion}"`);
  }

  const swVersion = dependencies["electron-builder-squirrel-windows"];

  if (swVersion != null && !versionSatisfies(swVersion, ">=20.32.0")) {
    errors.push(`At least electron-builder-squirrel-windows 20.32.0 is required by current electron-builder version. Please set electron-builder-squirrel-windows to "^20.32.0"`);
  }

  const deps = ["electron", "electron-prebuilt", "electron-rebuild"];

  if (process.env.ALLOW_ELECTRON_BUILDER_AS_PRODUCTION_DEPENDENCY !== "true") {
    deps.push("electron-builder");
  }

  for (const name of deps) {
    if (name in dependencies) {
      errors.push(`Package "${name}" is only allowed in "devDependencies". ` + `Please remove it from the "dependencies" section in your package.json.`);
    }
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=packageMetadata.js.map{"version":3,"sources":["../../src/util/packageMetadata.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEmptyOrSpaces, log, InvalidConfigurationError } from \"builder-util\"\nimport { readFile, readJson } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport * as semver from \"semver\"\nimport { Metadata } from \"..\"\n\nconst normalizeData = require(\"normalize-package-data\")\n\n/** @internal */\nexport async function readPackageJson(file: string): Promise<any> {\n  const data = await readJson(file)\n  await authors(file, data)\n  normalizeData(data)\n  // remove not required fields because can be used for remote build\n  delete data.scripts\n  delete data.readme\n  return data\n}\n\nasync function authors(file: string, data: any) {\n  if (data.contributors != null) {\n    return\n  }\n\n  let authorData\n  try {\n    authorData = await readFile(path.resolve(path.dirname(file), \"AUTHORS\"), \"utf8\")\n  }\n  catch (ignored) {\n    return\n  }\n\n  data.contributors = authorData\n    .split(/\\r?\\n/g)\n    .map(it => it.replace(/^\\s*#.*$/, \"\").trim())\n}\n\n/** @internal */\nexport function checkMetadata(metadata: Metadata, devMetadata: any | null, appPackageFile: string, devAppPackageFile: string): void {\n  const errors: Array<string> = []\n  const reportError = (missedFieldName: string) => {\n    errors.push(`Please specify '${missedFieldName}' in the package.json (${appPackageFile})`)\n  }\n\n  const checkNotEmpty = (name: string, value: string | null | undefined) => {\n    if (isEmptyOrSpaces(value)) {\n      reportError(name)\n    }\n  }\n\n  if ((metadata as any).directories != null) {\n    errors.push(`\"directories\" in the root is deprecated, please specify in the \"build\"`)\n  }\n\n  checkNotEmpty(\"name\", metadata.name)\n\n  if (isEmptyOrSpaces(metadata.description)) {\n    log.warn({appPackageFile}, `description is missed in the package.json`)\n  }\n  if (metadata.author == null) {\n    log.warn({appPackageFile}, `author is missed in the package.json`)\n  }\n  checkNotEmpty(\"version\", metadata.version)\n\n  if (metadata != null) {\n    checkDependencies(metadata.dependencies, errors)\n  }\n  if (metadata !== devMetadata) {\n    if (metadata.build != null) {\n      errors.push(`'build' in the application package.json (${appPackageFile}) is not supported since 3.0 anymore. Please move 'build' into the development package.json (${devAppPackageFile})`)\n    }\n  }\n\n  const devDependencies = (metadata as any).devDependencies\n  if (devDependencies != null && \"electron-rebuild\" in devDependencies) {\n    log.info('electron-rebuild not required if you use electron-builder, please consider to remove excess dependency from devDependencies\\n\\nTo ensure your native dependencies are always matched electron version, simply add script `\"postinstall\": \"electron-builder install-app-deps\" to your `package.json`')\n  }\n\n  if (errors.length > 0) {\n    throw new InvalidConfigurationError(errors.join(\"\\n\"))\n  }\n}\n\nfunction versionSatisfies(version: string | semver.SemVer | null, range: string | semver.Range, loose?: boolean): boolean {\n  if (version == null) {\n    return false\n  }\n\n  const coerced = semver.coerce(version)\n  if (coerced == null) {\n    return false\n  }\n\n  return semver.satisfies(coerced, range, loose)\n}\n\nfunction checkDependencies(dependencies: { [key: string]: string } | null | undefined, errors: Array<string>) {\n  if (dependencies == null) {\n    return\n  }\n\n  const updaterVersion = dependencies[\"electron-updater\"]\n  const requiredElectronUpdaterVersion = \"4.0.0\"\n  if (updaterVersion != null && !versionSatisfies(updaterVersion, `>=${requiredElectronUpdaterVersion}`)) {\n    errors.push(`At least electron-updater ${requiredElectronUpdaterVersion} is recommended by current electron-builder version. Please set electron-updater version to \"^${requiredElectronUpdaterVersion}\"`)\n  }\n\n  const swVersion = dependencies[\"electron-builder-squirrel-windows\"]\n  if (swVersion != null && !versionSatisfies(swVersion, \">=20.32.0\")) {\n    errors.push(`At least electron-builder-squirrel-windows 20.32.0 is required by current electron-builder version. Please set electron-builder-squirrel-windows to \"^20.32.0\"`)\n  }\n\n  const deps = [\"electron\", \"electron-prebuilt\", \"electron-rebuild\"]\n  if (process.env.ALLOW_ELECTRON_BUILDER_AS_PRODUCTION_DEPENDENCY !== \"true\") {\n    deps.push(\"electron-builder\")\n  }\n  for (const name of deps) {\n    if (name in dependencies) {\n      errors.push(`Package \"${name}\" is only allowed in \"devDependencies\". `\n        + `Please remove it from the \"dependencies\" section in your package.json.`)\n    }\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getTemplatePath = getTemplatePath;
exports.getVendorPath = getVendorPath;

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const root = path.join(__dirname, "..", "..");

function getTemplatePath(file) {
  return path.join(root, "templates", file);
}

function getVendorPath(file) {
  return file == null ? path.join(root, "vendor") : path.join(root, "vendor", file);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=pathManager.js.map{"version":3,"sources":["../../src/util/pathManager.ts"],"names":[],"mappings":";;;;;;;;AAAA;;;;AAEA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAL,CAAU,SAAV,EAAqB,IAArB,EAA2B,IAA3B,CAAb;;AAEM,SAAU,eAAV,CAA0B,IAA1B,EAAsC;AAC1C,SAAO,IAAI,CAAC,IAAL,CAAU,IAAV,EAAgB,WAAhB,EAA6B,IAA7B,CAAP;AACD;;AAEK,SAAU,aAAV,CAAwB,IAAxB,EAAqC;AACzC,SAAO,IAAI,IAAI,IAAR,GAAe,IAAI,CAAC,IAAL,CAAU,IAAV,EAAgB,QAAhB,CAAf,GAA2C,IAAI,CAAC,IAAL,CAAU,IAAV,EAAgB,QAAhB,EAA0B,IAA1B,CAAlD;AACD,C","sourcesContent":["import * as path from \"path\"\n\nconst root = path.join(__dirname, \"..\", \"..\")\n\nexport function getTemplatePath(file: string) {\n  return path.join(root, \"templates\", file)\n}\n\nexport function getVendorPath(file?: string) {\n  return file == null ? path.join(root, \"vendor\") : path.join(root, \"vendor\", file)\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getRepositoryInfo = getRepositoryInfo;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _hostedGitInfo() {
  const data = require("hosted-git-info");

  _hostedGitInfo = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function getRepositoryInfo(projectDir, metadata, devMetadata) {
  return _getInfo(projectDir, (devMetadata == null ? null : devMetadata.repository) || (metadata == null ? null : metadata.repository));
}

function getGitUrlFromGitConfig(_x) {
  return _getGitUrlFromGitConfig.apply(this, arguments);
}

function _getGitUrlFromGitConfig() {
  _getGitUrlFromGitConfig = (0, _bluebirdLst().coroutine)(function* (projectDir) {
    const data = yield (0, _promise().orNullIfFileNotExist)((0, _fsExtraP().readFile)(path.join(projectDir, ".git", "config"), "utf8"));

    if (data == null) {
      return null;
    }

    const conf = data.split(/\r?\n/);
    const i = conf.indexOf('[remote "origin"]');

    if (i !== -1) {
      let u = conf[i + 1];

      if (!u.match(/^\s*url =/)) {
        u = conf[i + 2];
      }

      if (u.match(/^\s*url =/)) {
        return u.replace(/^\s*url = /, "");
      }
    }

    return null;
  });
  return _getGitUrlFromGitConfig.apply(this, arguments);
}

function _getInfo(_x2, _x3) {
  return _getInfo2.apply(this, arguments);
}

function _getInfo2() {
  _getInfo2 = (0, _bluebirdLst().coroutine)(function* (projectDir, repo) {
    if (repo != null) {
      return parseRepositoryUrl(typeof repo === "string" ? repo : repo.url);
    }

    const slug = process.env.TRAVIS_REPO_SLUG || process.env.APPVEYOR_REPO_NAME;

    if (slug != null) {
      const splitted = slug.split("/");
      return {
        user: splitted[0],
        project: splitted[1]
      };
    }

    const user = process.env.CIRCLE_PROJECT_USERNAME;
    const project = process.env.CIRCLE_PROJECT_REPONAME;

    if (user != null && project != null) {
      return {
        user,
        project
      };
    }

    const url = yield getGitUrlFromGitConfig(projectDir);
    return url == null ? null : parseRepositoryUrl(url);
  });
  return _getInfo2.apply(this, arguments);
}

function parseRepositoryUrl(url) {
  const info = (0, _hostedGitInfo().fromUrl)(url);

  if (info != null) {
    delete info.protocols;
    delete info.treepath;
    delete info.filetemplate;
    delete info.bugstemplate;
    delete info.gittemplate;
    delete info.tarballtemplate;
    delete info.sshtemplate;
    delete info.sshurltemplate;
    delete info.browsetemplate;
    delete info.docstemplate;
    delete info.httpstemplate;
    delete info.shortcuttemplate;
    delete info.pathtemplate;
    delete info.pathmatch;
    delete info.protocols_re;
    delete info.committish;
    delete info.default;
    delete info.opts;
    delete info.browsefiletemplate;
    delete info.auth;
  }

  return info;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=repositoryInfo.js.map{"version":3,"sources":["../../src/util/repositoryInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import { orNullIfFileNotExist } from \"builder-util/out/promise\"\nimport { readFile } from \"fs-extra-p\"\nimport { fromUrl, Info } from \"hosted-git-info\"\nimport * as path from \"path\"\nimport { SourceRepositoryInfo } from \"../core\"\nimport { Metadata, RepositoryInfo } from \"..\"\n\nexport function getRepositoryInfo(projectDir: string, metadata?: Metadata, devMetadata?: Metadata | null): Promise<SourceRepositoryInfo | null> {\n  return _getInfo(projectDir, (devMetadata == null ? null : devMetadata.repository) || (metadata == null ? null : metadata.repository))\n}\n\nasync function getGitUrlFromGitConfig(projectDir: string): Promise<string | null> {\n  const data = await orNullIfFileNotExist(readFile(path.join(projectDir, \".git\", \"config\"), \"utf8\"))\n  if (data == null) {\n    return null\n  }\n\n  const conf = data.split(/\\r?\\n/)\n  const i = conf.indexOf('[remote \"origin\"]')\n  if (i !== -1) {\n    let u = conf[i + 1]\n    if (!u.match(/^\\s*url =/)) {\n      u = conf[i + 2]\n    }\n\n    if (u.match(/^\\s*url =/)) {\n      return u.replace(/^\\s*url = /, \"\")\n    }\n  }\n  return null\n}\n\nasync function _getInfo(projectDir: string, repo?: RepositoryInfo | string | null): Promise<SourceRepositoryInfo | null> {\n  if (repo != null) {\n    return parseRepositoryUrl(typeof repo === \"string\" ? repo : repo.url)\n  }\n\n  const slug = process.env.TRAVIS_REPO_SLUG || process.env.APPVEYOR_REPO_NAME\n  if (slug != null) {\n    const splitted = slug.split(\"/\")\n    return {\n      user: splitted[0],\n      project: splitted[1],\n    }\n  }\n\n  const user = process.env.CIRCLE_PROJECT_USERNAME\n  const project = process.env.CIRCLE_PROJECT_REPONAME\n  if (user != null && project != null) {\n    return {\n      user,\n      project,\n    }\n  }\n\n  const url = await getGitUrlFromGitConfig(projectDir)\n  return url == null ? null : parseRepositoryUrl(url)\n}\n\nfunction parseRepositoryUrl(url: string): Info {\n  const info: any = fromUrl(url)\n  if (info != null) {\n    delete info.protocols\n    delete info.treepath\n    delete info.filetemplate\n    delete info.bugstemplate\n    delete info.gittemplate\n    delete info.tarballtemplate\n    delete info.sshtemplate\n    delete info.sshurltemplate\n    delete info.browsetemplate\n    delete info.docstemplate\n    delete info.httpstemplate\n    delete info.shortcuttemplate\n    delete info.pathtemplate\n    delete info.pathmatch\n    delete info.protocols_re\n    delete info.committish\n    delete info.default\n    delete info.opts\n    delete info.browsefiletemplate\n    delete info.auth\n  }\n  return info\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.time = time;
exports.DevTimer = void 0;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

class DevTimer {
  constructor(label) {
    this.label = label;
    this.start = process.hrtime();
  }

  endAndGet() {
    const end = process.hrtime(this.start);
    return `${end[0]}s ${Math.round(end[1] / 1000000)}ms`;
  }

  end() {
    console.info(`${this.label}: ${this.endAndGet()}`);
  }

}

exports.DevTimer = DevTimer;

class ProductionTimer {
  end() {// ignore
  }

}

function time(label) {
  return _builderUtil().debug.enabled ? new DevTimer(label) : new ProductionTimer();
} 
// __ts-babel@6.0.4
//# sourceMappingURL=timer.js.map{"version":3,"sources":["../../src/util/timer.ts"],"names":[],"mappings":";;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAMM,MAAO,QAAP,CAAe;AAGnB,EAAA,WAAA,CAA6B,KAA7B,EAA0C;AAAb,SAAA,KAAA,GAAA,KAAA;AAFrB,SAAA,KAAA,GAAQ,OAAO,CAAC,MAAR,EAAR;AAGP;;AAED,EAAA,SAAS,GAAA;AACP,UAAM,GAAG,GAAG,OAAO,CAAC,MAAR,CAAe,KAAK,KAApB,CAAZ;AACA,WAAO,GAAG,GAAG,CAAC,CAAD,CAAG,KAAK,IAAI,CAAC,KAAL,CAAW,GAAG,CAAC,CAAD,CAAH,GAAS,OAApB,CAA4B,IAAjD;AACD;;AAED,EAAA,GAAG,GAAA;AACD,IAAA,OAAO,CAAC,IAAR,CAAa,GAAG,KAAK,KAAK,KAAK,KAAK,SAAL,EAAgB,EAA/C;AACD;;AAbkB;;;;AAgBrB,MAAM,eAAN,CAAqB;AACnB,EAAA,GAAG,GAAA,CACD;AACD;;AAHkB;;AAMf,SAAU,IAAV,CAAe,KAAf,EAA4B;AAChC,SAAO,qBAAM,OAAN,GAAgB,IAAI,QAAJ,CAAa,KAAb,CAAhB,GAAsC,IAAI,eAAJ,EAA7C;AACD,C","sourcesContent":["import { debug } from \"builder-util\"\n\nexport interface Timer {\n  end(): void\n}\n\nexport class DevTimer implements Timer {\n  private start = process.hrtime()\n\n  constructor(private readonly label: string) {\n  }\n\n  endAndGet(): string {\n    const end = process.hrtime(this.start)\n    return `${end[0]}s ${Math.round(end[1] / 1000000)}ms`\n  }\n\n  end(): void {\n    console.info(`${this.label}: ${this.endAndGet()}`)\n  }\n}\n\nclass ProductionTimer implements Timer {\n  end(): void {\n    // ignore\n  }\n}\n\nexport function time(label: string): Timer {\n  return debug.enabled ? new DevTimer(label) : new ProductionTimer()\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.installOrRebuild = installOrRebuild;
exports.getGypEnv = getGypEnv;
exports.rebuild = rebuild;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _os() {
  const data = require("os");

  _os = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function installOrRebuild(_x, _x2, _x3) {
  return _installOrRebuild.apply(this, arguments);
}

function _installOrRebuild() {
  _installOrRebuild = (0, _bluebirdLst().coroutine)(function* (config, appDir, options, forceInstall = false) {
    const effectiveOptions = Object.assign({
      buildFromSource: config.buildDependenciesFromSource === true,
      additionalArgs: (0, _builderUtil().asArray)(config.npmArgs)
    }, options);

    if (forceInstall || !(yield (0, _fs().exists)(path.join(appDir, "node_modules")))) {
      yield installDependencies(appDir, effectiveOptions);
    } else {
      yield rebuild(appDir, effectiveOptions);
    }
  });
  return _installOrRebuild.apply(this, arguments);
}

function getElectronGypCacheDir() {
  return path.join((0, _os().homedir)(), ".electron-gyp");
}

function getGypEnv(frameworkInfo, platform, arch, buildFromSource) {
  const npmConfigArch = arch === "armv7l" ? "arm" : arch;
  const common = Object.assign({}, process.env, {
    npm_config_arch: npmConfigArch,
    npm_config_target_arch: npmConfigArch,
    npm_config_platform: platform,
    npm_config_build_from_source: buildFromSource,
    // required for node-pre-gyp
    npm_config_target_platform: platform,
    npm_config_update_binary: true,
    npm_config_fallback_to_build: true
  });

  if (platform === "win32") {
    common.npm_config_target_libc = "unknown";
  }

  if (!frameworkInfo.useCustomDist) {
    return common;
  } // https://github.com/nodejs/node-gyp/issues/21


  return Object.assign({}, common, {
    npm_config_disturl: "https://atom.io/download/electron",
    npm_config_target: frameworkInfo.version,
    npm_config_runtime: "electron",
    npm_config_devdir: getElectronGypCacheDir()
  });
}

function installDependencies(appDir, options) {
  const platform = options.platform || process.platform;
  const arch = options.arch || process.arch;
  const additionalArgs = options.additionalArgs;

  _builderUtil().log.info({
    platform,
    arch,
    appDir
  }, `installing production dependencies`);

  let execPath = process.env.npm_execpath || process.env.NPM_CLI_JS;
  const execArgs = ["install", "--production"];

  if (!isRunningYarn(execPath)) {
    if (process.env.NPM_NO_BIN_LINKS === "true") {
      execArgs.push("--no-bin-links");
    }

    execArgs.push("--cache-min", "999999999");
  }

  if (execPath == null) {
    execPath = getPackageToolPath();
  } else {
    execArgs.unshift(execPath);
    execPath = process.env.npm_node_execpath || process.env.NODE_EXE || "node";
  }

  if (additionalArgs != null) {
    execArgs.push(...additionalArgs);
  }

  return (0, _builderUtil().spawn)(execPath, execArgs, {
    cwd: appDir,
    env: getGypEnv(options.frameworkInfo, platform, arch, options.buildFromSource === true)
  });
}

function getPackageToolPath() {
  if (process.env.FORCE_YARN === "true") {
    return process.platform === "win32" ? "yarn.cmd" : "yarn";
  } else {
    return process.platform === "win32" ? "npm.cmd" : "npm";
  }
}

function isRunningYarn(execPath) {
  const userAgent = process.env.npm_config_user_agent;
  return process.env.FORCE_YARN === "true" || execPath != null && path.basename(execPath).startsWith("yarn") || userAgent != null && /\byarn\b/.test(userAgent);
}
/** @internal */


function rebuild(_x4, _x5) {
  return _rebuild.apply(this, arguments);
} function _rebuild() {
  _rebuild = (0, _bluebirdLst().coroutine)(function* (appDir, options) {
    const nativeDeps = yield _bluebirdLst().default.filter((yield options.productionDeps.value), it => (0, _fs().exists)(path.join(it.path, "binding.gyp")), {
      concurrency: 8
    });

    if (nativeDeps.length === 0) {
      _builderUtil().log.info("no native production dependencies");

      return;
    }

    const platform = options.platform || process.platform;
    const arch = options.arch || process.arch;
    const additionalArgs = options.additionalArgs;

    _builderUtil().log.info({
      platform,
      arch
    }, "rebuilding native production dependencies");

    let execPath = process.env.npm_execpath || process.env.NPM_CLI_JS;
    const isYarn = isRunningYarn(execPath);
    const execArgs = [];

    if (execPath == null) {
      execPath = getPackageToolPath();
    } else {
      execArgs.push(execPath);
      execPath = process.env.npm_node_execpath || process.env.NODE_EXE || "node";
    }

    const env = getGypEnv(options.frameworkInfo, platform, arch, options.buildFromSource === true);

    if (isYarn) {
      execArgs.push("run", "install");

      if (additionalArgs != null) {
        execArgs.push(...additionalArgs);
      }

      yield _bluebirdLst().default.map(nativeDeps, dep => {
        _builderUtil().log.info({
          name: dep.name
        }, `rebuilding native dependency`);

        return (0, _builderUtil().spawn)(execPath, execArgs, {
          cwd: dep.path,
          env
        }).catch(error => {
          if (dep.optional) {
            _builderUtil().log.warn({
              dep: dep.name
            }, "cannot build optional native dep");
          } else {
            throw error;
          }
        });
      }, {
        concurrency: process.platform === "win32" ? 1 : 2
      });
    } else {
      execArgs.push("rebuild");

      if (additionalArgs != null) {
        execArgs.push(...additionalArgs);
      }

      execArgs.push(...nativeDeps.map(it => `${it.name}@${it.version}`));
      yield (0, _builderUtil().spawn)(execPath, execArgs, {
        cwd: appDir,
        env
      });
    }
  });
  return _rebuild.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=yarn.js.map{"version":3,"sources":["../../src/util/yarn.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { asArray, log, spawn } from \"builder-util\"\nimport { exists } from \"builder-util/out/fs\"\nimport { Lazy } from \"lazy-val\"\nimport { homedir } from \"os\"\nimport * as path from \"path\"\nimport { Configuration } from \"../configuration\"\nimport { Dependency } from \"./packageDependencies\"\n\nexport async function installOrRebuild(config: Configuration, appDir: string, options: RebuildOptions, forceInstall: boolean = false) {\n  const effectiveOptions = {\n    buildFromSource: config.buildDependenciesFromSource === true,\n    additionalArgs: asArray(config.npmArgs), ...options\n  }\n\n  if (forceInstall || !(await exists(path.join(appDir, \"node_modules\")))) {\n    await installDependencies(appDir, effectiveOptions)\n  }\n  else {\n    await rebuild(appDir, effectiveOptions)\n  }\n}\n\nexport interface DesktopFrameworkInfo {\n  version: string\n  useCustomDist: boolean\n}\n\nfunction getElectronGypCacheDir() {\n  return path.join(homedir(), \".electron-gyp\")\n}\n\nexport function getGypEnv(frameworkInfo: DesktopFrameworkInfo, platform: NodeJS.Platform, arch: string, buildFromSource: boolean) {\n  const npmConfigArch = arch === \"armv7l\" ? \"arm\" : arch\n  const common: any = {\n    ...process.env,\n    npm_config_arch: npmConfigArch,\n    npm_config_target_arch: npmConfigArch,\n    npm_config_platform: platform,\n    npm_config_build_from_source: buildFromSource,\n    // required for node-pre-gyp\n    npm_config_target_platform: platform,\n    npm_config_update_binary: true,\n    npm_config_fallback_to_build: true,\n  }\n\n  if (platform === \"win32\") {\n    common.npm_config_target_libc = \"unknown\"\n  }\n\n  if (!frameworkInfo.useCustomDist) {\n    return common\n  }\n\n  // https://github.com/nodejs/node-gyp/issues/21\n  return {\n    ...common,\n    npm_config_disturl: \"https://atom.io/download/electron\",\n    npm_config_target: frameworkInfo.version,\n    npm_config_runtime: \"electron\",\n    npm_config_devdir: getElectronGypCacheDir(),\n  }\n}\n\nfunction installDependencies(appDir: string, options: RebuildOptions): Promise<any> {\n  const platform = options.platform || process.platform\n  const arch = options.arch || process.arch\n  const additionalArgs = options.additionalArgs\n\n  log.info({platform, arch, appDir}, `installing production dependencies`)\n  let execPath = process.env.npm_execpath || process.env.NPM_CLI_JS\n  const execArgs = [\"install\", \"--production\"]\n\n  if (!isRunningYarn(execPath)) {\n    if (process.env.NPM_NO_BIN_LINKS === \"true\") {\n      execArgs.push(\"--no-bin-links\")\n    }\n    execArgs.push(\"--cache-min\", \"999999999\")\n  }\n\n  if (execPath == null) {\n    execPath = getPackageToolPath()\n  }\n  else {\n    execArgs.unshift(execPath)\n    execPath = process.env.npm_node_execpath || process.env.NODE_EXE || \"node\"\n  }\n\n  if (additionalArgs != null) {\n    execArgs.push(...additionalArgs)\n  }\n  return spawn(execPath, execArgs, {\n    cwd: appDir,\n    env: getGypEnv(options.frameworkInfo, platform, arch, options.buildFromSource === true),\n  })\n}\n\nfunction getPackageToolPath() {\n  if (process.env.FORCE_YARN === \"true\") {\n    return process.platform === \"win32\" ? \"yarn.cmd\" : \"yarn\"\n  }\n  else {\n    return process.platform === \"win32\" ? \"npm.cmd\" : \"npm\"\n  }\n}\n\nfunction isRunningYarn(execPath: string | null | undefined) {\n  const userAgent = process.env.npm_config_user_agent\n  return process.env.FORCE_YARN === \"true\" ||\n    (execPath != null && path.basename(execPath).startsWith(\"yarn\")) ||\n    (userAgent != null && /\\byarn\\b/.test(userAgent))\n}\n\nexport interface RebuildOptions {\n  frameworkInfo: DesktopFrameworkInfo\n  productionDeps?: Lazy<Array<Dependency>>\n\n  platform?: NodeJS.Platform\n  arch?: string\n\n  buildFromSource?: boolean\n\n  additionalArgs?: Array<string> | null\n}\n\n/** @internal */\nexport async function rebuild(appDir: string, options: RebuildOptions) {\n  const nativeDeps = await BluebirdPromise.filter(await options.productionDeps!.value, it => exists(path.join(it.path, \"binding.gyp\")), {concurrency: 8})\n  if (nativeDeps.length === 0) {\n    log.info(\"no native production dependencies\")\n    return\n  }\n\n  const platform = options.platform || process.platform\n  const arch = options.arch || process.arch\n  const additionalArgs = options.additionalArgs\n\n  log.info({platform, arch}, \"rebuilding native production dependencies\")\n\n  let execPath = process.env.npm_execpath || process.env.NPM_CLI_JS\n  const isYarn = isRunningYarn(execPath)\n  const execArgs: Array<string> = []\n  if (execPath == null) {\n    execPath = getPackageToolPath()\n  }\n  else {\n    execArgs.push(execPath)\n    execPath = process.env.npm_node_execpath || process.env.NODE_EXE || \"node\"\n  }\n\n  const env = getGypEnv(options.frameworkInfo, platform, arch, options.buildFromSource === true)\n  if (isYarn) {\n    execArgs.push(\"run\", \"install\")\n    if (additionalArgs != null) {\n      execArgs.push(...additionalArgs)\n    }\n    await BluebirdPromise.map(nativeDeps, dep => {\n      log.info({name: dep.name}, `rebuilding native dependency`)\n      return spawn(execPath!, execArgs, {\n        cwd: dep.path,\n        env,\n      })\n        .catch(error => {\n          if (dep.optional) {\n            log.warn({dep: dep.name}, \"cannot build optional native dep\")\n          }\n          else {\n            throw error\n          }\n        })\n    }, {concurrency: process.platform === \"win32\" ? 1 : 2})\n  }\n  else {\n    execArgs.push(\"rebuild\")\n    if (additionalArgs != null) {\n      execArgs.push(...additionalArgs)\n    }\n    execArgs.push(...nativeDeps.map(it => `${it.name}@${it.version}`))\n    await spawn(execPath, execArgs, {\n      cwd: appDir,\n      env,\n    })\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _PublishManager() {
  const data = require("../publish/PublishManager");

  _PublishManager = function () {
    return data;
  };

  return data;
}

function _appBuilder() {
  const data = require("../util/appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _license() {
  const data = require("../util/license");

  _license = function () {
    return data;
  };

  return data;
}

function _targetUtil() {
  const data = require("./targetUtil");

  _targetUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

// https://unix.stackexchange.com/questions/375191/append-to-sub-directory-inside-squashfs-file
class AppImageTarget extends _core().Target {
  constructor(ignored, packager, helper, outDir) {
    super("appImage");
    this.packager = packager;
    this.helper = helper;
    this.outDir = outDir;
    this.options = Object.assign({}, this.packager.platformSpecificBuildOptions, this.packager.config[this.name]);
    this.desktopEntry = new (_lazyVal().Lazy)(() => helper.computeDesktopEntry(this.options, "AppRun", {
      "X-AppImage-Version": `${packager.appInfo.buildVersion}`
    }));
  }

  build(appOutDir, arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;
      const options = _this.options; // https://github.com/electron-userland/electron-builder/issues/775
      // https://github.com/electron-userland/electron-builder/issues/1726
      // tslint:disable-next-line:no-invalid-template-strings

      const artifactName = packager.expandArtifactBeautyNamePattern(options, "AppImage", arch);
      const artifactPath = path.join(_this.outDir, artifactName);
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: "AppImage",
        file: artifactPath,
        arch
      });
      const c = yield Promise.all([_this.desktopEntry.value, _this.helper.icons, (0, _PublishManager().getAppUpdatePublishConfiguration)(packager, arch, false
      /* in any case validation will be done on publish */
      ), (0, _license().getNotLocalizedLicenseFile)(options.license, _this.packager, ["txt", "html"]), (0, _targetUtil().createStageDir)(_this, packager, arch)]);
      const license = c[3];
      const stageDir = c[4];
      const publishConfig = c[2];

      if (publishConfig != null) {
        yield (0, _fsExtraP().outputFile)(path.join(packager.getResourcesDir(stageDir.dir), "app-update.yml"), (0, _builderUtil().serializeToYaml)(publishConfig));
      }

      if (_this.packager.packagerOptions.effectiveOptionComputed != null && (yield _this.packager.packagerOptions.effectiveOptionComputed({
        desktop: yield _this.desktopEntry.value
      }))) {
        return;
      }

      const args = ["appimage", "--stage", stageDir.dir, "--arch", _builderUtil().Arch[arch], "--output", artifactPath, "--app", appOutDir, "--configuration", JSON.stringify(Object.assign({
        productName: _this.packager.appInfo.productName,
        desktopEntry: c[0],
        executableName: _this.packager.executableName,
        icons: c[1],
        fileAssociations: _this.packager.fileAssociations
      }, options))];
      (0, _appBuilder().objectToArgs)(args, {
        license
      });

      if (packager.compression === "maximum") {
        args.push("--compression", "xz");
      }

      yield packager.info.callArtifactBuildCompleted({
        file: artifactPath,
        safeArtifactName: packager.computeSafeArtifactName(artifactName, "AppImage", arch, false),
        target: _this,
        arch,
        packager,
        isWriteUpdateInfo: true,
        updateInfo: yield (0, _appBuilder().executeAppBuilderAsJson)(args)
      });
    })();
  }

} exports.default = AppImageTarget;
// __ts-babel@6.0.4
//# sourceMappingURL=AppImageTarget.js.map{"version":3,"sources":["../../src/targets/AppImageTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, serializeToYaml } from \"builder-util\"\nimport { outputFile } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { AppImageOptions } from \"..\"\nimport { Target } from \"../core\"\nimport { LinuxPackager } from \"../linuxPackager\"\nimport { getAppUpdatePublishConfiguration } from \"../publish/PublishManager\"\nimport { executeAppBuilderAsJson, objectToArgs } from \"../util/appBuilder\"\nimport { getNotLocalizedLicenseFile } from \"../util/license\"\nimport { LinuxTargetHelper } from \"./LinuxTargetHelper\"\nimport { createStageDir } from \"./targetUtil\"\n\n// https://unix.stackexchange.com/questions/375191/append-to-sub-directory-inside-squashfs-file\nexport default class AppImageTarget extends Target {\n  readonly options: AppImageOptions = {...this.packager.platformSpecificBuildOptions, ...(this.packager.config as any)[this.name]}\n  private readonly desktopEntry: Lazy<string>\n\n  constructor(ignored: string, private readonly packager: LinuxPackager, private readonly helper: LinuxTargetHelper, readonly outDir: string) {\n    super(\"appImage\")\n\n    this.desktopEntry = new Lazy<string>(() => helper.computeDesktopEntry(this.options, \"AppRun\", {\n      \"X-AppImage-Version\": `${packager.appInfo.buildVersion}`,\n    }))\n  }\n\n  async build(appOutDir: string, arch: Arch): Promise<any> {\n    const packager = this.packager\n    const options = this.options\n    // https://github.com/electron-userland/electron-builder/issues/775\n    // https://github.com/electron-userland/electron-builder/issues/1726\n    // tslint:disable-next-line:no-invalid-template-strings\n    const artifactName = packager.expandArtifactBeautyNamePattern(options, \"AppImage\", arch)\n    const artifactPath = path.join(this.outDir, artifactName)\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: \"AppImage\",\n      file: artifactPath,\n      arch,\n    })\n\n    const c = await Promise.all([\n      this.desktopEntry.value,\n      this.helper.icons,\n      getAppUpdatePublishConfiguration(packager, arch, false /* in any case validation will be done on publish */),\n      getNotLocalizedLicenseFile(options.license, this.packager, [\"txt\", \"html\"]),\n      createStageDir(this, packager, arch),\n    ])\n    const license = c[3]\n    const stageDir = c[4]\n\n    const publishConfig = c[2]\n    if (publishConfig != null) {\n      await outputFile(path.join(packager.getResourcesDir(stageDir.dir), \"app-update.yml\"), serializeToYaml(publishConfig))\n    }\n\n    if (this.packager.packagerOptions.effectiveOptionComputed != null && await this.packager.packagerOptions.effectiveOptionComputed({desktop: await this.desktopEntry.value})) {\n      return\n    }\n\n    const args = [\n      \"appimage\",\n      \"--stage\", stageDir.dir,\n      \"--arch\", Arch[arch],\n      \"--output\", artifactPath,\n      \"--app\", appOutDir,\n      \"--configuration\", (JSON.stringify({\n        productName: this.packager.appInfo.productName,\n        desktopEntry: c[0],\n        executableName: this.packager.executableName,\n        icons: c[1],\n        fileAssociations: this.packager.fileAssociations,\n        ...options,\n      })),\n    ]\n    objectToArgs(args, {\n      license,\n    })\n    if (packager.compression === \"maximum\") {\n      args.push(\"--compression\", \"xz\")\n    }\n\n    await packager.info.callArtifactBuildCompleted({\n      file: artifactPath,\n      safeArtifactName: packager.computeSafeArtifactName(artifactName, \"AppImage\", arch, false),\n      target: this,\n      arch,\n      packager,\n      isWriteUpdateInfo: true,\n      updateInfo: await executeAppBuilderAsJson(args),\n    })\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _windowsCodeSign() {
  const data = require("../codeSign/windowsCodeSign");

  _windowsCodeSign = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _pathManager() {
  const data = require("../util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

function _targetUtil() {
  const data = require("./targetUtil");

  _targetUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const APPX_ASSETS_DIR_NAME = "appx";
const vendorAssetsForDefaultAssets = {
  "StoreLogo.png": "SampleAppx.50x50.png",
  "Square150x150Logo.png": "SampleAppx.150x150.png",
  "Square44x44Logo.png": "SampleAppx.44x44.png",
  "Wide310x150Logo.png": "SampleAppx.310x150.png"
};
const DEFAULT_RESOURCE_LANG = "en-US";

class AppXTarget extends _core().Target {
  constructor(packager, outDir) {
    super("appx");
    this.packager = packager;
    this.outDir = outDir;
    this.options = (0, _builderUtil().deepAssign)({}, this.packager.platformSpecificBuildOptions, this.packager.config.appx);

    if (process.platform !== "darwin" && (process.platform !== "win32" || (0, _windowsCodeSign().isOldWin6)())) {
      throw new Error("AppX is supported only on Windows 10 or Windows Server 2012 R2 (version number 6.3+)");
    }
  } // https://docs.microsoft.com/en-us/windows/uwp/packaging/create-app-package-with-makeappx-tool#mapping-files


  build(appOutDir, arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;
      const artifactName = packager.expandArtifactBeautyNamePattern(_this.options, "appx", arch);
      const artifactPath = path.join(_this.outDir, artifactName);
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: "AppX",
        file: artifactPath,
        arch
      });
      const vendorPath = yield (0, _windowsCodeSign().getSignVendorPath)();
      const vm = yield packager.vm.value;
      const stageDir = yield (0, _targetUtil().createStageDir)(_this, packager, arch);
      const mappingFile = stageDir.getTempFile("mapping.txt");
      const makeAppXArgs = ["pack", "/o"
      /* overwrite the output file if it exists */
      , "/f", vm.toVmFile(mappingFile), "/p", vm.toVmFile(artifactPath)];

      if (packager.compression === "store") {
        makeAppXArgs.push("/nc");
      }

      const mappingList = [];
      mappingList.push((yield _bluebirdLst().default.map((0, _fs().walk)(appOutDir), file => {
        let appxPath = file.substring(appOutDir.length + 1);

        if (path.sep !== "\\") {
          appxPath = appxPath.replace(/\//g, "\\");
        }

        return `"${vm.toVmFile(file)}" "app\\${appxPath}"`;
      })));
      const userAssetDir = yield _this.packager.getResource(undefined, APPX_ASSETS_DIR_NAME);
      const assetInfo = yield AppXTarget.computeUserAssets(vm, vendorPath, userAssetDir);
      const userAssets = assetInfo.userAssets;
      const manifestFile = stageDir.getTempFile("AppxManifest.xml");
      yield _this.writeManifest(manifestFile, arch, (yield _this.computePublisherName()), userAssets);
      mappingList.push(assetInfo.mappings);
      mappingList.push([`"${vm.toVmFile(manifestFile)}" "AppxManifest.xml"`]);

      if (isScaledAssetsProvided(userAssets)) {
        const outFile = vm.toVmFile(stageDir.getTempFile("resources.pri"));
        const makePriPath = vm.toVmFile(path.join(vendorPath, "windows-10", _builderUtil().Arch[arch], "makepri.exe"));
        const assetRoot = stageDir.getTempFile("appx/assets");
        yield (0, _fsExtraP().emptyDir)(assetRoot);
        yield _bluebirdLst().default.map(assetInfo.allAssets, it => (0, _fs().copyOrLinkFile)(it, path.join(assetRoot, path.basename(it))));
        yield vm.exec(makePriPath, ["new", "/Overwrite", "/Manifest", vm.toVmFile(manifestFile), "/ProjectRoot", vm.toVmFile(path.dirname(assetRoot)), "/ConfigXml", vm.toVmFile(path.join((0, _pathManager().getTemplatePath)("appx"), "priconfig.xml")), "/OutputFile", outFile]); // in addition to resources.pri, resources.scale-140.pri and other such files will be generated

        for (const resourceFile of (yield (0, _fsExtraP().readdir)(stageDir.dir)).filter(it => it.startsWith("resources.")).sort()) {
          mappingList.push([`"${vm.toVmFile(stageDir.getTempFile(resourceFile))}" "${resourceFile}"`]);
        }

        makeAppXArgs.push("/l");
      }

      let mapping = "[Files]";

      for (const list of mappingList) {
        mapping += "\r\n" + list.join("\r\n");
      }

      yield (0, _fsExtraP().writeFile)(mappingFile, mapping);
      packager.debugLogger.add("appx.mapping", mapping);

      if (_this.options.makeappxArgs != null) {
        makeAppXArgs.push(..._this.options.makeappxArgs);
      }

      yield vm.exec(vm.toVmFile(path.join(vendorPath, "windows-10", _builderUtil().Arch[arch], "makeappx.exe")), makeAppXArgs);
      yield packager.sign(artifactPath);
      yield stageDir.cleanup();
      yield packager.info.callArtifactBuildCompleted({
        file: artifactPath,
        packager,
        arch,
        safeArtifactName: packager.computeSafeArtifactName(artifactName, "appx"),
        target: _this,
        isWriteUpdateInfo: _this.options.electronUpdaterAware
      });
    })();
  }

  static computeUserAssets(vm, vendorPath, userAssetDir) {
    return (0, _bluebirdLst().coroutine)(function* () {
      const mappings = [];
      let userAssets;
      const allAssets = [];

      if (userAssetDir == null) {
        userAssets = [];
      } else {
        userAssets = (yield (0, _fsExtraP().readdir)(userAssetDir)).filter(it => !it.startsWith(".") && !it.endsWith(".db") && it.includes("."));

        for (const name of userAssets) {
          mappings.push(`"${vm.toVmFile(userAssetDir)}${vm.pathSep}${name}" "assets\\${name}"`);
          allAssets.push(path.join(userAssetDir, name));
        }
      }

      for (const defaultAsset of Object.keys(vendorAssetsForDefaultAssets)) {
        if (userAssets.length === 0 || !isDefaultAssetIncluded(userAssets, defaultAsset)) {
          const file = path.join(vendorPath, "appxAssets", vendorAssetsForDefaultAssets[defaultAsset]);
          mappings.push(`"${vm.toVmFile(file)}" "assets\\${defaultAsset}"`);
          allAssets.push(file);
        }
      } // we do not use process.arch to build path to tools, because even if you are on x64, ia32 appx tool must be used if you build appx for ia32


      return {
        userAssets,
        mappings,
        allAssets
      };
    })();
  } // https://github.com/electron-userland/electron-builder/issues/2108#issuecomment-333200711


  computePublisherName() {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if ((yield _this2.packager.cscInfo.value) == null) {
        _builderUtil().log.info({
          reason: "Windows Store only build"
        }, "AppX is not signed");

        return _this2.options.publisher || "CN=ms";
      }

      const certInfo = yield _this2.packager.lazyCertInfo.value;
      const publisher = certInfo == null ? null : certInfo.bloodyMicrosoftSubjectDn;

      if (publisher == null) {
        throw new Error("Internal error: cannot compute subject using certificate info");
      }

      return publisher;
    })();
  }

  writeManifest(outFile, arch, publisher, userAssets) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appInfo = _this3.packager.appInfo;
      const options = _this3.options;
      const executable = `app\\${appInfo.productFilename}.exe`;
      const displayName = options.displayName || appInfo.productName;
      const manifest = (yield (0, _fsExtraP().readFile)(path.join((0, _pathManager().getTemplatePath)("appx"), "appxmanifest.xml"), "utf8")).replace(/\${([a-zA-Z0-9]+)}/g, (match, p1) => {
        switch (p1) {
          case "publisher":
            return publisher;

          case "publisherDisplayName":
            const name = options.publisherDisplayName || appInfo.companyName;

            if (name == null) {
              throw new (_builderUtil().InvalidConfigurationError)(`Please specify "author" in the application package.json â€” it is required because "appx.publisherDisplayName" is not set.`);
            }

            return name;

          case "version":
            return appInfo.getVersionInWeirdWindowsForm(options.setBuildNumber === true);

          case "applicationId":
            const result = options.applicationId || options.identityName || appInfo.name;

            if (!isNaN(parseInt(result[0], 10))) {
              let message = `AppX Application.Id canâ€™t start with numbers: "${result}"`;

              if (options.applicationId == null) {
                message += `\nPlease set appx.applicationId (or correct appx.identityName or name)`;
              }

              throw new (_builderUtil().InvalidConfigurationError)(message);
            }

            return result;

          case "identityName":
            return options.identityName || appInfo.name;

          case "executable":
            return executable;

          case "displayName":
            return displayName;

          case "description":
            return appInfo.description || appInfo.productName;

          case "backgroundColor":
            return options.backgroundColor || "#464646";

          case "logo":
            return "assets\\StoreLogo.png";

          case "square150x150Logo":
            return "assets\\Square150x150Logo.png";

          case "square44x44Logo":
            return "assets\\Square44x44Logo.png";

          case "lockScreen":
            return lockScreenTag(userAssets);

          case "defaultTile":
            return defaultTileTag(userAssets, options.showNameOnTiles || false);

          case "splashScreen":
            return splashScreenTag(userAssets);

          case "arch":
            return arch === _builderUtil().Arch.ia32 ? "x86" : "x64";

          case "resourceLanguages":
            return resourceLanguageTag((0, _builderUtil().asArray)(options.languages));

          case "extensions":
            return _this3.getExtensions(executable, displayName);

          default:
            throw new Error(`Macro ${p1} is not defined`);
        }
      });
      yield (0, _fsExtraP().writeFile)(outFile, manifest);
    })();
  }

  getExtensions(executable, displayName) {
    const uriSchemes = (0, _builderUtil().asArray)(this.packager.config.protocols).concat((0, _builderUtil().asArray)(this.packager.platformSpecificBuildOptions.protocols));
    let isAddAutoLaunchExtension = this.options.addAutoLaunchExtension;

    if (isAddAutoLaunchExtension === undefined) {
      const deps = this.packager.info.metadata.dependencies;
      isAddAutoLaunchExtension = deps != null && deps["electron-winstore-auto-launch"] != null;
    }

    if (!isAddAutoLaunchExtension && uriSchemes.length === 0) {
      return "";
    }

    let extensions = "<Extensions>";

    if (isAddAutoLaunchExtension) {
      extensions += `
        <desktop:Extension Category="windows.startupTask" Executable="${executable}" EntryPoint="Windows.FullTrustApplication">
          <desktop:StartupTask TaskId="SlackStartup" Enabled="true" DisplayName="${displayName}" />
        </desktop:Extension>`;
    }

    for (const protocol of uriSchemes) {
      for (const scheme of (0, _builderUtil().asArray)(protocol.schemes)) {
        extensions += `
          <uap:Extension Category="windows.protocol">
            <uap:Protocol Name="${scheme}">
               <uap:DisplayName>${protocol.name}</uap:DisplayName>
             </uap:Protocol>
          </uap:Extension>`;
      }
    }

    extensions += "</Extensions>";
    return extensions;
  }

} // get the resource - language tag, see https://docs.microsoft.com/en-us/windows/uwp/globalizing/manage-language-and-region#specify-the-supported-languages-in-the-apps-manifest


exports.default = AppXTarget;

function resourceLanguageTag(userLanguages) {
  if (userLanguages == null || userLanguages.length === 0) {
    userLanguages = [DEFAULT_RESOURCE_LANG];
  }

  return userLanguages.map(it => `<Resource Language="${it.replace(/_/g, "-")}" />`).join("\n");
}

function lockScreenTag(userAssets) {
  if (isDefaultAssetIncluded(userAssets, "BadgeLogo.png")) {
    return '<uap:LockScreen Notification="badgeAndTileText" BadgeLogo="assets\\BadgeLogo.png" />';
  } else {
    return "";
  }
}

function defaultTileTag(userAssets, showNameOnTiles) {
  const defaultTiles = ["<uap:DefaultTile", 'Wide310x150Logo="assets\\Wide310x150Logo.png"'];

  if (isDefaultAssetIncluded(userAssets, "LargeTile.png")) {
    defaultTiles.push('Square310x310Logo="assets\\LargeTile.png"');
  }

  if (isDefaultAssetIncluded(userAssets, "SmallTile.png")) {
    defaultTiles.push('Square71x71Logo="assets\\SmallTile.png"');
  }

  if (showNameOnTiles) {
    defaultTiles.push(">");
    defaultTiles.push("<uap:ShowNameOnTiles>");
    defaultTiles.push("<uap:ShowOn", 'Tile="wide310x150Logo"', "/>");
    defaultTiles.push("<uap:ShowOn", 'Tile="square150x150Logo"', "/>");
    defaultTiles.push("</uap:ShowNameOnTiles>");
    defaultTiles.push("</uap:DefaultTile>");
  } else {
    defaultTiles.push("/>");
  }

  return defaultTiles.join(" ");
}

function splashScreenTag(userAssets) {
  if (isDefaultAssetIncluded(userAssets, "SplashScreen.png")) {
    return '<uap:SplashScreen Image="assets\\SplashScreen.png" />';
  } else {
    return "";
  }
}

function isDefaultAssetIncluded(userAssets, defaultAsset) {
  const defaultAssetName = defaultAsset.substring(0, defaultAsset.indexOf("."));
  return userAssets.some(it => it.includes(defaultAssetName));
}

function isScaledAssetsProvided(userAssets) {
  return userAssets.some(it => it.includes(".scale-") || it.includes(".targetsize-"));
} 
// __ts-babel@6.0.4
//# sourceMappingURL=AppxTarget.js.map{"version":3,"sources":["../../src/targets/AppxTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, asArray, deepAssign, InvalidConfigurationError, log } from \"builder-util\"\nimport { copyOrLinkFile, walk } from \"builder-util/out/fs\"\nimport { emptyDir, readdir, readFile, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { AppXOptions } from \"../\"\nimport { getSignVendorPath, isOldWin6 } from \"../codeSign/windowsCodeSign\"\nimport { Target } from \"../core\"\nimport { getTemplatePath } from \"../util/pathManager\"\nimport { VmManager } from \"../vm/vm\"\nimport { WinPackager } from \"../winPackager\"\nimport { createStageDir } from \"./targetUtil\"\n\nconst APPX_ASSETS_DIR_NAME = \"appx\"\n\nconst vendorAssetsForDefaultAssets: { [key: string]: string; } = {\n  \"StoreLogo.png\": \"SampleAppx.50x50.png\",\n  \"Square150x150Logo.png\": \"SampleAppx.150x150.png\",\n  \"Square44x44Logo.png\": \"SampleAppx.44x44.png\",\n  \"Wide310x150Logo.png\": \"SampleAppx.310x150.png\",\n}\n\nconst DEFAULT_RESOURCE_LANG = \"en-US\"\n\nexport default class AppXTarget extends Target {\n  readonly options: AppXOptions = deepAssign({}, this.packager.platformSpecificBuildOptions, this.packager.config.appx)\n\n  constructor(private readonly packager: WinPackager, readonly outDir: string) {\n    super(\"appx\")\n\n    if (process.platform !== \"darwin\" && (process.platform !== \"win32\" || isOldWin6())) {\n      throw new Error(\"AppX is supported only on Windows 10 or Windows Server 2012 R2 (version number 6.3+)\")\n    }\n  }\n\n  // https://docs.microsoft.com/en-us/windows/uwp/packaging/create-app-package-with-makeappx-tool#mapping-files\n  async build(appOutDir: string, arch: Arch): Promise<any> {\n    const packager = this.packager\n    const artifactName = packager.expandArtifactBeautyNamePattern(this.options, \"appx\", arch)\n    const artifactPath = path.join(this.outDir, artifactName)\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: \"AppX\",\n      file: artifactPath,\n      arch,\n    })\n\n    const vendorPath = await getSignVendorPath()\n    const vm = await packager.vm.value\n\n    const stageDir = await createStageDir(this, packager, arch)\n\n    const mappingFile = stageDir.getTempFile(\"mapping.txt\")\n    const makeAppXArgs = [\"pack\", \"/o\" /* overwrite the output file if it exists */,\n      \"/f\", vm.toVmFile(mappingFile),\n      \"/p\", vm.toVmFile(artifactPath),\n    ]\n    if (packager.compression === \"store\") {\n      makeAppXArgs.push(\"/nc\")\n    }\n\n    const mappingList: Array<Array<string>> = []\n    mappingList.push(await BluebirdPromise.map(walk(appOutDir), file => {\n      let appxPath = file.substring(appOutDir.length + 1)\n      if (path.sep !== \"\\\\\") {\n        appxPath = appxPath.replace(/\\//g, \"\\\\\")\n      }\n      return `\"${vm.toVmFile(file)}\" \"app\\\\${appxPath}\"`\n    }))\n\n    const userAssetDir = await this.packager.getResource(undefined, APPX_ASSETS_DIR_NAME)\n    const assetInfo = await AppXTarget.computeUserAssets(vm, vendorPath, userAssetDir)\n    const userAssets = assetInfo.userAssets\n\n    const manifestFile = stageDir.getTempFile(\"AppxManifest.xml\")\n    await this.writeManifest(manifestFile, arch, await this.computePublisherName(), userAssets)\n    mappingList.push(assetInfo.mappings)\n    mappingList.push([`\"${vm.toVmFile(manifestFile)}\" \"AppxManifest.xml\"`])\n\n    if (isScaledAssetsProvided(userAssets)) {\n      const outFile = vm.toVmFile(stageDir.getTempFile(\"resources.pri\"))\n      const makePriPath = vm.toVmFile(path.join(vendorPath, \"windows-10\", Arch[arch], \"makepri.exe\"))\n\n      const assetRoot = stageDir.getTempFile(\"appx/assets\")\n      await emptyDir(assetRoot)\n      await BluebirdPromise.map(assetInfo.allAssets, it => copyOrLinkFile(it, path.join(assetRoot, path.basename(it))))\n\n      await vm.exec(makePriPath, [\"new\",\n        \"/Overwrite\",\n        \"/Manifest\", vm.toVmFile(manifestFile),\n        \"/ProjectRoot\", vm.toVmFile(path.dirname(assetRoot)),\n        \"/ConfigXml\", vm.toVmFile(path.join(getTemplatePath(\"appx\"), \"priconfig.xml\")),\n        \"/OutputFile\", outFile,\n      ])\n\n      // in addition to resources.pri, resources.scale-140.pri and other such files will be generated\n      for (const resourceFile of (await readdir(stageDir.dir)).filter(it => it.startsWith(\"resources.\")).sort()) {\n        mappingList.push([`\"${vm.toVmFile(stageDir.getTempFile(resourceFile))}\" \"${resourceFile}\"`])\n      }\n      makeAppXArgs.push(\"/l\")\n    }\n\n    let mapping = \"[Files]\"\n    for (const list of mappingList) {\n      mapping += \"\\r\\n\" + list.join(\"\\r\\n\")\n    }\n    await writeFile(mappingFile, mapping)\n    packager.debugLogger.add(\"appx.mapping\", mapping)\n\n    if (this.options.makeappxArgs != null) {\n      makeAppXArgs.push(...this.options.makeappxArgs)\n    }\n    await vm.exec(vm.toVmFile(path.join(vendorPath, \"windows-10\", Arch[arch], \"makeappx.exe\")), makeAppXArgs)\n    await packager.sign(artifactPath)\n\n    await stageDir.cleanup()\n\n    await packager.info.callArtifactBuildCompleted({\n      file: artifactPath,\n      packager,\n      arch,\n      safeArtifactName: packager.computeSafeArtifactName(artifactName, \"appx\"),\n      target: this,\n      isWriteUpdateInfo: this.options.electronUpdaterAware,\n    })\n  }\n\n  private static async computeUserAssets(vm: VmManager, vendorPath: string, userAssetDir: string | null) {\n    const mappings: Array<string> = []\n    let userAssets: Array<string>\n    const allAssets: Array<string> = []\n    if (userAssetDir == null) {\n      userAssets = []\n    }\n    else {\n      userAssets = (await readdir(userAssetDir)).filter(it => !it.startsWith(\".\") && !it.endsWith(\".db\") && it.includes(\".\"))\n      for (const name of userAssets) {\n        mappings.push(`\"${vm.toVmFile(userAssetDir)}${vm.pathSep}${name}\" \"assets\\\\${name}\"`)\n        allAssets.push(path.join(userAssetDir, name))\n      }\n    }\n\n    for (const defaultAsset of Object.keys(vendorAssetsForDefaultAssets)) {\n      if (userAssets.length === 0 || !isDefaultAssetIncluded(userAssets, defaultAsset)) {\n        const file = path.join(vendorPath, \"appxAssets\", vendorAssetsForDefaultAssets[defaultAsset])\n        mappings.push(`\"${vm.toVmFile(file)}\" \"assets\\\\${defaultAsset}\"`)\n        allAssets.push(file)\n      }\n    }\n\n    // we do not use process.arch to build path to tools, because even if you are on x64, ia32 appx tool must be used if you build appx for ia32\n    return {userAssets, mappings, allAssets}\n  }\n\n  // https://github.com/electron-userland/electron-builder/issues/2108#issuecomment-333200711\n  private async computePublisherName() {\n    if (await this.packager.cscInfo.value == null) {\n      log.info({reason: \"Windows Store only build\"}, \"AppX is not signed\")\n      return this.options.publisher || \"CN=ms\"\n    }\n\n    const certInfo = await this.packager.lazyCertInfo.value\n    const publisher = certInfo == null ? null : certInfo.bloodyMicrosoftSubjectDn\n    if (publisher == null) {\n      throw new Error(\"Internal error: cannot compute subject using certificate info\")\n    }\n    return publisher\n  }\n\n  private async writeManifest(outFile: string, arch: Arch, publisher: string, userAssets: Array<string>) {\n    const appInfo = this.packager.appInfo\n    const options = this.options\n    const executable = `app\\\\${appInfo.productFilename}.exe`\n    const displayName = options.displayName || appInfo.productName\n    const manifest = (await readFile(path.join(getTemplatePath(\"appx\"), \"appxmanifest.xml\"), \"utf8\"))\n      .replace(/\\${([a-zA-Z0-9]+)}/g, (match, p1): string => {\n        switch (p1) {\n          case \"publisher\":\n            return publisher\n\n          case \"publisherDisplayName\":\n            const name = options.publisherDisplayName || appInfo.companyName\n            if (name == null) {\n              throw new InvalidConfigurationError(`Please specify \"author\" in the application package.json â€” it is required because \"appx.publisherDisplayName\" is not set.`)\n            }\n            return name\n\n          case \"version\":\n            return appInfo.getVersionInWeirdWindowsForm(options.setBuildNumber === true)\n\n          case \"applicationId\":\n            const result = options.applicationId || options.identityName || appInfo.name\n            if (!isNaN(parseInt(result[0], 10))) {\n              let message = `AppX Application.Id canâ€™t start with numbers: \"${result}\"`\n              if (options.applicationId == null) {\n                message += `\\nPlease set appx.applicationId (or correct appx.identityName or name)`\n              }\n              throw new InvalidConfigurationError(message)\n            }\n            return result\n\n          case \"identityName\":\n            return options.identityName  || appInfo.name\n\n          case \"executable\":\n            return executable\n\n          case \"displayName\":\n            return displayName\n\n          case \"description\":\n            return appInfo.description || appInfo.productName\n\n          case \"backgroundColor\":\n            return options.backgroundColor || \"#464646\"\n\n          case \"logo\":\n            return \"assets\\\\StoreLogo.png\"\n\n          case \"square150x150Logo\":\n            return \"assets\\\\Square150x150Logo.png\"\n\n          case \"square44x44Logo\":\n            return \"assets\\\\Square44x44Logo.png\"\n\n          case \"lockScreen\":\n            return lockScreenTag(userAssets)\n\n          case \"defaultTile\":\n            return defaultTileTag(userAssets, options.showNameOnTiles || false)\n\n          case \"splashScreen\":\n            return splashScreenTag(userAssets)\n\n          case \"arch\":\n            return arch === Arch.ia32 ? \"x86\" : \"x64\"\n\n          case \"resourceLanguages\":\n            return resourceLanguageTag(asArray(options.languages))\n\n          case \"extensions\":\n            return this.getExtensions(executable, displayName)\n\n          default:\n            throw new Error(`Macro ${p1} is not defined`)\n        }\n      })\n    await writeFile(outFile, manifest)\n  }\n\n  private getExtensions(executable: string, displayName: string): string {\n    const uriSchemes = asArray(this.packager.config.protocols)\n      .concat(asArray(this.packager.platformSpecificBuildOptions.protocols))\n\n    let isAddAutoLaunchExtension = this.options.addAutoLaunchExtension\n    if (isAddAutoLaunchExtension === undefined) {\n      const deps = this.packager.info.metadata.dependencies\n      isAddAutoLaunchExtension = deps != null && deps[\"electron-winstore-auto-launch\"] != null\n    }\n\n    if (!isAddAutoLaunchExtension && uriSchemes.length === 0) {\n      return \"\"\n    }\n\n    let extensions = \"<Extensions>\"\n\n    if (isAddAutoLaunchExtension) {\n      extensions += `\n        <desktop:Extension Category=\"windows.startupTask\" Executable=\"${executable}\" EntryPoint=\"Windows.FullTrustApplication\">\n          <desktop:StartupTask TaskId=\"SlackStartup\" Enabled=\"true\" DisplayName=\"${displayName}\" />\n        </desktop:Extension>`\n    }\n\n    for (const protocol of uriSchemes) {\n      for (const scheme of asArray(protocol.schemes)) {\n        extensions += `\n          <uap:Extension Category=\"windows.protocol\">\n            <uap:Protocol Name=\"${scheme}\">\n               <uap:DisplayName>${protocol.name}</uap:DisplayName>\n             </uap:Protocol>\n          </uap:Extension>`\n      }\n    }\n\n    extensions += \"</Extensions>\"\n    return extensions\n  }\n}\n\n// get the resource - language tag, see https://docs.microsoft.com/en-us/windows/uwp/globalizing/manage-language-and-region#specify-the-supported-languages-in-the-apps-manifest\nfunction resourceLanguageTag(userLanguages: Array<string> | null | undefined): string {\n  if (userLanguages == null || userLanguages.length === 0) {\n    userLanguages = [DEFAULT_RESOURCE_LANG]\n  }\n  return userLanguages.map(it => `<Resource Language=\"${it.replace(/_/g, \"-\")}\" />`).join(\"\\n\")\n}\n\nfunction lockScreenTag(userAssets: Array<string>): string {\n  if (isDefaultAssetIncluded(userAssets, \"BadgeLogo.png\")) {\n    return '<uap:LockScreen Notification=\"badgeAndTileText\" BadgeLogo=\"assets\\\\BadgeLogo.png\" />'\n  }\n  else {\n    return \"\"\n  }\n}\n\nfunction defaultTileTag(userAssets: Array<string>, showNameOnTiles: boolean): string {\n  const defaultTiles: Array<string> = [\"<uap:DefaultTile\", 'Wide310x150Logo=\"assets\\\\Wide310x150Logo.png\"']\n\n  if (isDefaultAssetIncluded(userAssets, \"LargeTile.png\")) {\n    defaultTiles.push('Square310x310Logo=\"assets\\\\LargeTile.png\"')\n  }\n  if (isDefaultAssetIncluded(userAssets, \"SmallTile.png\")) {\n    defaultTiles.push('Square71x71Logo=\"assets\\\\SmallTile.png\"')\n  }\n\n  if (showNameOnTiles) {\n    defaultTiles.push(\">\")\n    defaultTiles.push(\"<uap:ShowNameOnTiles>\")\n    defaultTiles.push(\"<uap:ShowOn\", 'Tile=\"wide310x150Logo\"', \"/>\")\n    defaultTiles.push(\"<uap:ShowOn\", 'Tile=\"square150x150Logo\"', \"/>\")\n    defaultTiles.push(\"</uap:ShowNameOnTiles>\")\n    defaultTiles.push(\"</uap:DefaultTile>\")\n  } else {\n    defaultTiles.push(\"/>\")\n  }\n  return defaultTiles.join(\" \")\n}\n\nfunction splashScreenTag(userAssets: Array<string>): string {\n  if (isDefaultAssetIncluded(userAssets, \"SplashScreen.png\")) {\n    return '<uap:SplashScreen Image=\"assets\\\\SplashScreen.png\" />'\n  }\n  else {\n    return \"\"\n  }\n}\n\nfunction isDefaultAssetIncluded(userAssets: Array<string>, defaultAsset: string) {\n  const defaultAssetName = defaultAsset.substring(0, defaultAsset.indexOf(\".\"))\n  return userAssets.some(it => it.includes(defaultAssetName))\n}\n\nfunction isScaledAssetsProvided(userAssets: Array<string>) {\n  return userAssets.some(it => it.includes(\".scale-\") || it.includes(\".targetsize-\"))\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ArchiveTarget = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _fileMatcher() {
  const data = require("../fileMatcher");

  _fileMatcher = function () {
    return data;
  };

  return data;
}

function _archive() {
  const data = require("./archive");

  _archive = function () {
    return data;
  };

  return data;
}

function _differentialUpdateInfoBuilder() {
  const data = require("./differentialUpdateInfoBuilder");

  _differentialUpdateInfoBuilder = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class ArchiveTarget extends _core().Target {
  constructor(name, outDir, packager, isWriteUpdateInfo = false) {
    super(name);
    this.outDir = outDir;
    this.packager = packager;
    this.isWriteUpdateInfo = isWriteUpdateInfo;
    this.options = this.packager.config[this.name];
  }

  build(appOutDir, arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;

      const isMac = packager.platform === _core().Platform.MAC;

      const format = _this.name;
      let defaultPattern;

      if (packager.platform === _core().Platform.LINUX) {
        // tslint:disable-next-line:no-invalid-template-strings
        defaultPattern = "${name}-${version}" + (arch === _builderUtil().Arch.x64 ? "" : "-${arch}") + ".${ext}";
      } else {
        // tslint:disable-next-line:no-invalid-template-strings
        defaultPattern = "${productName}-${version}" + (arch === _builderUtil().Arch.x64 ? "" : "-${arch}") + "-${os}.${ext}";
      }

      const artifactName = packager.expandArtifactNamePattern(_this.options, format, arch, defaultPattern, false);
      const artifactPath = path.join(_this.outDir, artifactName);
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: `${isMac ? "macOS " : ""}${format}`,
        file: artifactPath,
        arch
      });
      let updateInfo = null;

      if (format.startsWith("tar.")) {
        yield (0, _archive().tar)(packager.compression, format, artifactPath, appOutDir, isMac, packager.info.tempDirManager);
      } else {
        let withoutDir = !isMac;
        let dirToArchive = appOutDir;

        if (isMac) {
          dirToArchive = path.dirname(appOutDir);
          const fileMatchers = (0, _fileMatcher().getFileMatchers)(packager.config, "extraDistFiles", dirToArchive, packager.createGetFileMatchersOptions(_this.outDir, arch, packager.platformSpecificBuildOptions));

          if (fileMatchers == null) {
            dirToArchive = appOutDir;
          } else {
            yield (0, _fileMatcher().copyFiles)(fileMatchers, null, true);
            withoutDir = true;
          }
        }

        const archiveOptions = {
          compression: packager.compression,
          withoutDir
        };
        yield (0, _archive().archive)(format, artifactPath, dirToArchive, archiveOptions);

        if (_this.isWriteUpdateInfo && format === "zip") {
          updateInfo = yield (0, _differentialUpdateInfoBuilder().appendBlockmap)(artifactPath);
        }
      }

      yield packager.info.callArtifactBuildCompleted({
        updateInfo,
        file: artifactPath,
        // tslint:disable-next-line:no-invalid-template-strings
        safeArtifactName: packager.computeSafeArtifactName(artifactName, format, arch, false, defaultPattern.replace("${productName}", "${name}")),
        target: _this,
        arch,
        packager,
        isWriteUpdateInfo: _this.isWriteUpdateInfo
      });
    })();
  }

} exports.ArchiveTarget = ArchiveTarget;
// __ts-babel@6.0.4
//# sourceMappingURL=ArchiveTarget.js.map{"version":3,"sources":["../../src/targets/ArchiveTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch } from \"builder-util\"\nimport * as path from \"path\"\nimport { Platform, Target, TargetSpecificOptions } from \"../core\"\nimport { copyFiles, getFileMatchers } from \"../fileMatcher\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { archive, tar } from \"./archive\"\nimport { appendBlockmap } from \"./differentialUpdateInfoBuilder\"\n\nexport class ArchiveTarget extends Target {\n  readonly options: TargetSpecificOptions = (this.packager.config as any)[this.name]\n\n  constructor(name: string, readonly outDir: string, private readonly packager: PlatformPackager<any>, private readonly isWriteUpdateInfo = false) {\n    super(name)\n  }\n\n  async build(appOutDir: string, arch: Arch): Promise<any> {\n    const packager = this.packager\n    const isMac = packager.platform === Platform.MAC\n    const format = this.name\n\n    let defaultPattern: string\n    if (packager.platform === Platform.LINUX) {\n      // tslint:disable-next-line:no-invalid-template-strings\n      defaultPattern = \"${name}-${version}\" + (arch === Arch.x64 ? \"\" : \"-${arch}\") + \".${ext}\"\n    }\n    else {\n      // tslint:disable-next-line:no-invalid-template-strings\n      defaultPattern = \"${productName}-${version}\" + (arch === Arch.x64 ? \"\" : \"-${arch}\") + \"-${os}.${ext}\"\n    }\n\n    const artifactName = packager.expandArtifactNamePattern(this.options, format, arch, defaultPattern, false)\n    const artifactPath = path.join(this.outDir, artifactName)\n\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: `${isMac ? \"macOS \" : \"\"}${format}`,\n      file: artifactPath,\n      arch,\n    })\n    let updateInfo: any = null\n    if (format.startsWith(\"tar.\")) {\n      await tar(packager.compression, format, artifactPath, appOutDir, isMac, packager.info.tempDirManager)\n    }\n    else {\n      let withoutDir = !isMac\n      let dirToArchive = appOutDir\n      if (isMac) {\n        dirToArchive = path.dirname(appOutDir)\n        const fileMatchers = getFileMatchers(packager.config, \"extraDistFiles\", dirToArchive, packager.createGetFileMatchersOptions(this.outDir, arch, packager.platformSpecificBuildOptions))\n        if (fileMatchers == null) {\n          dirToArchive = appOutDir\n        }\n        else {\n          await copyFiles(fileMatchers, null, true)\n          withoutDir = true\n        }\n      }\n\n      const archiveOptions = {\n        compression: packager.compression,\n        withoutDir,\n      }\n      await archive(format, artifactPath, dirToArchive, archiveOptions)\n\n      if (this.isWriteUpdateInfo && format === \"zip\") {\n        updateInfo = await appendBlockmap(artifactPath)\n      }\n    }\n\n    await packager.info.callArtifactBuildCompleted({\n      updateInfo,\n      file: artifactPath,\n      // tslint:disable-next-line:no-invalid-template-strings\n      safeArtifactName: packager.computeSafeArtifactName(artifactName, format, arch, false, defaultPattern.replace(\"${productName}\", \"${name}\")),\n      target: this,\n      arch,\n      packager,\n      isWriteUpdateInfo: this.isWriteUpdateInfo,\n    })\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.LinuxTargetHelper = exports.installPrefix = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

const installPrefix = "/opt";
exports.installPrefix = installPrefix;

class LinuxTargetHelper {
  constructor(packager) {
    this.packager = packager;
    this.iconPromise = new (_lazyVal().Lazy)(() => this.computeDesktopIcons());
    this.maxIconPath = null;
  }

  get icons() {
    return this.iconPromise.value;
  } // must be name without spaces and other special characters, but not product name used


  computeDesktopIcons() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;
      const iconDir = packager.platformSpecificBuildOptions.icon;
      const sources = iconDir == null ? [] : [iconDir];
      const commonConfiguration = packager.config;
      const icnsPath = (commonConfiguration.mac || {}).icon || commonConfiguration.icon;

      if (icnsPath != null) {
        sources.push(icnsPath);
      } // need to put here and not as default because need to resolve image size


      const result = yield packager.resolveIcon(sources, (0, _builderUtil().asArray)(packager.getDefaultFrameworkIcon()), "set");
      _this.maxIconPath = result[result.length - 1].file;
      return result;
    })();
  }

  getDescription(options) {
    return options.description || this.packager.appInfo.description;
  }

  writeDesktopEntry(targetSpecificOptions, exec, destination, extra) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const data = yield _this2.computeDesktopEntry(targetSpecificOptions, exec, extra);
      const file = destination || (yield _this2.packager.getTempFile(`${_this2.packager.appInfo.productFilename}.desktop`));
      yield (0, _fsExtraP().outputFile)(file, data);
      return file;
    })();
  }

  computeDesktopEntry(targetSpecificOptions, exec, extra) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (exec != null && exec.length === 0) {
        throw new Error("Specified exec is empty");
      } // https://github.com/electron-userland/electron-builder/issues/3418


      if (targetSpecificOptions.desktop != null && targetSpecificOptions.desktop.Exec != null) {
        throw new Error("Please specify executable name as linux.executableName instead of linux.desktop.Exec");
      }

      const packager = _this3.packager;
      const appInfo = packager.appInfo;
      const productFilename = appInfo.productFilename;
      const desktopMeta = Object.assign({
        Name: appInfo.productName,
        Comment: _this3.getDescription(targetSpecificOptions),
        Exec: exec == null ? `"${installPrefix}/${productFilename}/${packager.executableName}" %U` : exec,
        Terminal: "false",
        Type: "Application",
        Icon: packager.executableName,
        // https://askubuntu.com/questions/367396/what-represent-the-startupwmclass-field-of-a-desktop-file
        // must be set to package.json name (because it is Electron set WM_CLASS)
        // to get WM_CLASS of running window: xprop WM_CLASS
        // StartupWMClass doesn't work for unicode
        // https://github.com/electron/electron/blob/2-0-x/atom/browser/native_window_views.cc#L226
        StartupWMClass: appInfo.productName
      }, extra, targetSpecificOptions.desktop);
      const mimeTypes = (0, _builderUtil().asArray)(targetSpecificOptions.mimeTypes);

      for (const fileAssociation of packager.fileAssociations) {
        if (fileAssociation.mimeType != null) {
          mimeTypes.push(fileAssociation.mimeType);
        }
      }

      for (const protocol of (0, _builderUtil().asArray)(packager.config.protocols).concat((0, _builderUtil().asArray)(packager.platformSpecificBuildOptions.protocols))) {
        for (const scheme of (0, _builderUtil().asArray)(protocol.schemes)) {
          mimeTypes.push(`x-scheme-handler/${scheme}`);
        }
      }

      if (mimeTypes.length !== 0) {
        desktopMeta.MimeType = mimeTypes.join(";") + ";";
      }

      let category = targetSpecificOptions.category;

      if ((0, _builderUtil().isEmptyOrSpaces)(category)) {
        const macCategory = (packager.config.mac || {}).category;

        if (macCategory != null) {
          category = macToLinuxCategory[macCategory];
        }

        if (category == null) {
          // https://github.com/develar/onshape-desktop-shell/issues/48
          if (macCategory != null) {
            _builderUtil().log.warn({
              macCategory
            }, "cannot map macOS category to Linux. If possible mapping is known for you, please file issue to add it.");
          }

          _builderUtil().log.warn({
            reason: "linux.category is not set and cannot map from macOS",
            docs: "https://www.electron.build/configuration/linux"
          }, "application Linux category is set to default \"Utility\"");

          category = "Utility";
        }
      }

      desktopMeta.Categories = `${category}${category.endsWith(";") ? "" : ";"}`;
      let data = `[Desktop Entry]`;

      for (const name of Object.keys(desktopMeta)) {
        data += `\n${name}=${desktopMeta[name]}`;
      }

      data += "\n";
      return data;
    })();
  }

}

exports.LinuxTargetHelper = LinuxTargetHelper;
const macToLinuxCategory = {
  "public.app-category.graphics-design": "Graphics",
  "public.app-category.developer-tools": "Development",
  "public.app-category.education": "Education",
  "public.app-category.games": "Game",
  "public.app-category.video": "Video;AudioVideo",
  "public.app-category.utilities": "Utility",
  "public.app-category.social-networking": "Network;Chat",
  "public.app-category.finance": "Office;Finance"
}; 
// __ts-babel@6.0.4
//# sourceMappingURL=LinuxTargetHelper.js.map{"version":3,"sources":["../../src/targets/LinuxTargetHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { asArray, isEmptyOrSpaces, log } from \"builder-util\"\nimport { outputFile } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport { LinuxTargetSpecificOptions } from \"..\"\nimport { LinuxPackager } from \"../linuxPackager\"\nimport { IconInfo } from \"../platformPackager\"\n\nexport const installPrefix = \"/opt\"\n\nexport class LinuxTargetHelper {\n  private readonly iconPromise = new Lazy(() => this.computeDesktopIcons())\n\n  maxIconPath: string | null = null\n\n  constructor(private packager: LinuxPackager) {\n  }\n\n  get icons(): Promise<Array<IconInfo>> {\n    return this.iconPromise.value\n  }\n\n  // must be name without spaces and other special characters, but not product name used\n  private async computeDesktopIcons(): Promise<Array<IconInfo>> {\n    const packager = this.packager\n    const iconDir = packager.platformSpecificBuildOptions.icon\n    const sources = iconDir == null ? [] : [iconDir]\n\n    const commonConfiguration = packager.config\n    const icnsPath = (commonConfiguration.mac || {}).icon || commonConfiguration.icon\n    if (icnsPath != null) {\n      sources.push(icnsPath)\n    }\n\n    // need to put here and not as default because need to resolve image size\n    const result = await packager.resolveIcon(sources, asArray(packager.getDefaultFrameworkIcon()), \"set\")\n    this.maxIconPath = result[result.length - 1].file\n    return result\n  }\n\n  getDescription(options: LinuxTargetSpecificOptions) {\n    return options.description || this.packager.appInfo.description\n  }\n\n  async writeDesktopEntry(targetSpecificOptions: LinuxTargetSpecificOptions, exec?: string, destination?: string | null, extra?: { [key: string]: string; }): Promise<string> {\n    const data = await this.computeDesktopEntry(targetSpecificOptions, exec, extra)\n    const file = destination || await this.packager.getTempFile(`${this.packager.appInfo.productFilename}.desktop`)\n    await outputFile(file, data)\n    return file\n  }\n\n  async computeDesktopEntry(targetSpecificOptions: LinuxTargetSpecificOptions, exec?: string, extra?: { [key: string]: string; }): Promise<string> {\n    if (exec != null && exec.length === 0) {\n      throw new Error(\"Specified exec is empty\")\n    }\n    // https://github.com/electron-userland/electron-builder/issues/3418\n    if (targetSpecificOptions.desktop != null && targetSpecificOptions.desktop.Exec != null) {\n      throw new Error(\"Please specify executable name as linux.executableName instead of linux.desktop.Exec\")\n    }\n\n    const packager = this.packager\n    const appInfo = packager.appInfo\n\n    const productFilename = appInfo.productFilename\n\n    const desktopMeta: any = {\n      Name: appInfo.productName,\n      Comment: this.getDescription(targetSpecificOptions),\n      Exec: exec == null ? `\"${installPrefix}/${productFilename}/${packager.executableName}\" %U` : exec,\n      Terminal: \"false\",\n      Type: \"Application\",\n      Icon: packager.executableName,\n      // https://askubuntu.com/questions/367396/what-represent-the-startupwmclass-field-of-a-desktop-file\n      // must be set to package.json name (because it is Electron set WM_CLASS)\n      // to get WM_CLASS of running window: xprop WM_CLASS\n      // StartupWMClass doesn't work for unicode\n      // https://github.com/electron/electron/blob/2-0-x/atom/browser/native_window_views.cc#L226\n      StartupWMClass: appInfo.productName,\n      ...extra,\n      ...targetSpecificOptions.desktop,\n    }\n\n    const mimeTypes: Array<string> = asArray(targetSpecificOptions.mimeTypes)\n    for (const fileAssociation of packager.fileAssociations) {\n      if (fileAssociation.mimeType != null) {\n        mimeTypes.push(fileAssociation.mimeType)\n      }\n    }\n\n    for (const protocol of asArray(packager.config.protocols).concat(asArray(packager.platformSpecificBuildOptions.protocols))) {\n      for (const scheme of asArray(protocol.schemes)) {\n        mimeTypes.push(`x-scheme-handler/${scheme}`)\n      }\n    }\n\n    if (mimeTypes.length !== 0) {\n      desktopMeta.MimeType = mimeTypes.join(\";\") + \";\"\n    }\n\n    let category = targetSpecificOptions.category\n    if (isEmptyOrSpaces(category)) {\n      const macCategory = (packager.config.mac || {}).category\n      if (macCategory != null) {\n        category = macToLinuxCategory[macCategory]\n      }\n\n      if (category == null) {\n        // https://github.com/develar/onshape-desktop-shell/issues/48\n        if (macCategory != null) {\n          log.warn({macCategory}, \"cannot map macOS category to Linux. If possible mapping is known for you, please file issue to add it.\")\n        }\n        log.warn({\n          reason: \"linux.category is not set and cannot map from macOS\",\n          docs: \"https://www.electron.build/configuration/linux\",\n        }, \"application Linux category is set to default \\\"Utility\\\"\")\n        category = \"Utility\"\n      }\n    }\n    desktopMeta.Categories = `${category}${category.endsWith(\";\") ? \"\" : \";\"}`\n\n    let data = `[Desktop Entry]`\n    for (const name of Object.keys(desktopMeta)) {\n      data += `\\n${name}=${desktopMeta[name]}`\n    }\n    data += \"\\n\"\n    return data\n  }\n}\n\nconst macToLinuxCategory: any = {\n  \"public.app-category.graphics-design\": \"Graphics\",\n  \"public.app-category.developer-tools\": \"Development\",\n  \"public.app-category.education\": \"Education\",\n  \"public.app-category.games\": \"Game\",\n  \"public.app-category.video\": \"Video;AudioVideo\",\n  \"public.app-category.utilities\": \"Utility\",\n  \"public.app-category.social-networking\": \"Network;Chat\",\n  \"public.app-category.finance\": \"Office;Finance\",\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _binDownload() {
  const data = require("../binDownload");

  _binDownload = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

function ejs() {
  const data = _interopRequireWildcard(require("ejs"));

  ejs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _CommonWindowsInstallerConfiguration() {
  const data = require("../options/CommonWindowsInstallerConfiguration");

  _CommonWindowsInstallerConfiguration = function () {
    return data;
  };

  return data;
}

function _pathManager() {
  const data = require("../util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

function _vm() {
  const data = require("../vm/vm");

  _vm = function () {
    return data;
  };

  return data;
}

function _WineVm() {
  const data = require("../vm/WineVm");

  _WineVm = function () {
    return data;
  };

  return data;
}

function _targetUtil() {
  const data = require("./targetUtil");

  _targetUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const ELECTRON_BUILDER_UPGRADE_CODE_NS_UUID = _builderUtilRuntime().UUID.parse("d752fe43-5d44-44d5-9fc9-6dd1bf19d5cc");

const ROOT_DIR_ID = "APPLICATIONFOLDER";
const ASSISTED_UI_FILE_NAME = "WixUI_Assisted.wxs";
const projectTemplate = new (_lazyVal().Lazy)(
/*#__PURE__*/
(0, _bluebirdLst().coroutine)(function* () {
  const template = (yield (0, _fsExtraP().readFile)(path.join((0, _pathManager().getTemplatePath)("msi"), "template.xml"), "utf8")).replace(/{{/g, "<%").replace(/}}/g, "%>").replace(/\${([^}]+)}/g, "<%=$1%>");
  return ejs().compile(template);
})); // WiX doesn't support Mono, so, dontnet462 is required to be installed for wine (preinstalled in our bundled wine)

class MsiTarget extends _core().Target {
  constructor(packager, outDir) {
    super("msi");
    this.packager = packager;
    this.outDir = outDir;
    this.vm = process.platform === "win32" ? new (_vm().VmManager)() : new (_WineVm().WineVmManager)();
    this.options = (0, _builderUtil().deepAssign)(this.packager.platformSpecificBuildOptions, this.packager.config.msi);
  }

  build(appOutDir, arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;
      const artifactName = packager.expandArtifactBeautyNamePattern(_this.options, "msi", arch);
      const artifactPath = path.join(_this.outDir, artifactName);
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: "MSI",
        file: artifactPath,
        arch
      });
      const stageDir = yield (0, _targetUtil().createStageDir)(_this, packager, arch);
      const vm = _this.vm;
      const commonOptions = (0, _CommonWindowsInstallerConfiguration().getEffectiveOptions)(_this.options, _this.packager);

      if (commonOptions.isAssisted) {
        // F*** *** ***  ***  ***  ***  ***  ***  ***  ***  ***  ***  *** WiX  ***  ***  ***  ***  ***  ***  ***  ***  ***
        // cannot understand how to set MSIINSTALLPERUSER on radio box change. In any case installed per user.
        _builderUtil().log.warn(`MSI DOESN'T SUPPORT assisted installer. Please use NSIS instead.`);
      }

      const projectFile = stageDir.getTempFile("project.wxs");
      const objectFiles = ["project.wixobj"];
      const uiFile = commonOptions.isAssisted ? stageDir.getTempFile(ASSISTED_UI_FILE_NAME) : null;
      yield (0, _fsExtraP().writeFile)(projectFile, (yield _this.writeManifest(appOutDir, arch, commonOptions)));

      if (uiFile !== null) {
        yield (0, _fsExtraP().writeFile)(uiFile, (yield (0, _fsExtraP().readFile)(path.join((0, _pathManager().getTemplatePath)("msi"), ASSISTED_UI_FILE_NAME), "utf8")));
        objectFiles.push(ASSISTED_UI_FILE_NAME.replace(".wxs", ".wixobj"));
      } // noinspection SpellCheckingInspection


      const vendorPath = yield (0, _binDownload().getBinFromUrl)("wix", "4.0.0.5512.2", "/X5poahdCc3199Vt6AP7gluTlT1nxi9cbbHhZhCMEu+ngyP1LiBMn+oZX7QAZVaKeBMc2SjVp7fJqNLqsUnPNQ=="); // noinspection SpellCheckingInspection

      const candleArgs = ["-arch", arch === _builderUtil().Arch.ia32 ? "x86" : arch === _builderUtil().Arch.armv7l ? "arm" : "x64", `-dappDir=${vm.toVmFile(appOutDir)}`].concat(_this.getCommonWixArgs());
      candleArgs.push("project.wxs");

      if (uiFile !== null) {
        candleArgs.push(ASSISTED_UI_FILE_NAME);
      }

      yield vm.exec(vm.toVmFile(path.join(vendorPath, "candle.exe")), candleArgs, {
        cwd: stageDir.dir
      });
      yield _this.light(objectFiles, vm, artifactPath, appOutDir, vendorPath, stageDir.dir);
      yield stageDir.cleanup();
      yield packager.sign(artifactPath);
      yield packager.info.callArtifactBuildCompleted({
        file: artifactPath,
        packager,
        arch,
        safeArtifactName: packager.computeSafeArtifactName(artifactName, "msi"),
        target: _this,
        isWriteUpdateInfo: false
      });
    })();
  }

  light(objectFiles, vm, artifactPath, appOutDir, vendorPath, tempDir) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      // noinspection SpellCheckingInspection
      const lightArgs = ["-out", vm.toVmFile(artifactPath), "-v", // https://github.com/wixtoolset/issues/issues/5169
      "-spdb", // https://sourceforge.net/p/wix/bugs/2405/
      // error LGHT1076 : ICE61: This product should remove only older versions of itself. The Maximum version is not less than the current product. (1.1.0.42 1.1.0.42)
      "-sw1076", `-dappDir=${vm.toVmFile(appOutDir)}`].concat(_this2.getCommonWixArgs()); // http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Build-3-5-2229-0-give-me-the-following-error-error-LGHT0216-An-unexpected-Win32-exception-with-errorn-td5707443.html

      if (process.platform !== "win32") {
        // noinspection SpellCheckingInspection
        lightArgs.push("-sval");
      }

      if (_this2.options.oneClick === false) {
        lightArgs.push("-ext", "WixUIExtension");
      } // objectFiles - only filenames, we set current directory to our temp stage dir


      lightArgs.push(...objectFiles);
      yield vm.exec(vm.toVmFile(path.join(vendorPath, "light.exe")), lightArgs, {
        cwd: tempDir
      });
    })();
  }

  getCommonWixArgs() {
    const args = ["-pedantic"];

    if (this.options.warningsAsErrors !== false) {
      args.push("-wx");
    }

    return args;
  }

  writeManifest(appOutDir, arch, commonOptions) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appInfo = _this3.packager.appInfo;
      const {
        files,
        dirs
      } = yield _this3.computeFileDeclaration(appOutDir);
      const companyName = appInfo.companyName;

      if (!companyName) {
        _builderUtil().log.warn(`Manufacturer is not set for MSI â€” please set "author" in the package.json`);
      }

      const compression = _this3.packager.compression;
      const options = _this3.options;
      const iconPath = yield _this3.packager.getIconPath();
      return (yield projectTemplate.value)(Object.assign({}, commonOptions, {
        isCreateDesktopShortcut: commonOptions.isCreateDesktopShortcut !== _CommonWindowsInstallerConfiguration().DesktopShortcutCreationPolicy.NEVER,
        isRunAfterFinish: options.runAfterFinish !== false,
        iconPath: iconPath == null ? null : _this3.vm.toVmFile(iconPath),
        compressionLevel: compression === "store" ? "none" : "high",
        version: appInfo.getVersionInWeirdWindowsForm(),
        productName: appInfo.productName,
        upgradeCode: (options.upgradeCode || _builderUtilRuntime().UUID.v5(appInfo.id, ELECTRON_BUILDER_UPGRADE_CODE_NS_UUID)).toUpperCase(),
        manufacturer: companyName || appInfo.productName,
        appDescription: appInfo.description,
        // https://stackoverflow.com/questions/1929038/compilation-error-ice80-the-64bitcomponent-uses-32bitdirectory
        programFilesId: arch === _builderUtil().Arch.x64 ? "ProgramFiles64Folder" : "ProgramFilesFolder",
        // wix in the name because special wix format can be used in the name
        installationDirectoryWixName: (0, _targetUtil().getWindowsInstallationDirName)(appInfo, commonOptions.isPerMachine === true),
        dirs,
        files
      }));
    })();
  }

  computeFileDeclaration(appOutDir) {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appInfo = _this4.packager.appInfo;
      let isRootDirAddedToRemoveTable = false;
      const dirNames = new Set();
      const dirs = [];
      const fileSpace = " ".repeat(6);
      const commonOptions = (0, _CommonWindowsInstallerConfiguration().getEffectiveOptions)(_this4.options, _this4.packager);
      const files = yield _bluebirdLst().default.map((0, _fs().walk)(appOutDir), file => {
        const packagePath = file.substring(appOutDir.length + 1);
        const lastSlash = packagePath.lastIndexOf(path.sep);
        const fileName = lastSlash > 0 ? packagePath.substring(lastSlash + 1) : packagePath;
        let directoryId = null;
        let dirName = ""; // Wix Directory.FileSource doesn't work - https://stackoverflow.com/questions/21519388/wix-filesource-confusion

        if (lastSlash > 0) {
          // This Name attribute may also define multiple directories using the inline directory syntax.
          // For example, "ProgramFilesFolder:\My Company\My Product\bin" would create a reference to a Directory element with Id="ProgramFilesFolder" then create directories named "My Company" then "My Product" then "bin" nested beneath each other.
          // This syntax is a shortcut to defining each directory in an individual Directory element.
          dirName = packagePath.substring(0, lastSlash); // https://github.com/electron-userland/electron-builder/issues/3027

          directoryId = "d" + (0, _crypto().createHash)("md5").update(dirName).digest("base64").replace(/\//g, "_").replace(/\+/g, ".").replace(/=+$/, "");

          if (!dirNames.has(dirName)) {
            dirNames.add(dirName);
            dirs.push(`<Directory Id="${directoryId}" Name="${ROOT_DIR_ID}:\\${dirName.replace(/\//g, "\\")}\\"/>`);
          }
        } else if (!isRootDirAddedToRemoveTable) {
          isRootDirAddedToRemoveTable = true;
        } // since RegistryValue can be part of Component, *** *** *** *** *** *** *** *** *** wix cannot auto generate guid
        // https://stackoverflow.com/questions/1405100/change-my-component-guid-in-wix


        let result = `<Component${directoryId === null ? "" : ` Directory="${directoryId}"`}>`;
        result += `\n${fileSpace}  <File Name="${fileName}" Source="$(var.appDir)${path.sep}${packagePath}" ReadOnly="yes" KeyPath="yes"`;
        const isMainExecutable = packagePath === `${appInfo.productFilename}.exe`;

        if (isMainExecutable) {
          result += ' Id="mainExecutable"';
        } else if (directoryId === null) {
          result += ` Id="${path.basename(packagePath)}_f"`;
        }

        const isCreateDesktopShortcut = commonOptions.isCreateDesktopShortcut !== _CommonWindowsInstallerConfiguration().DesktopShortcutCreationPolicy.NEVER;

        if (isMainExecutable && (isCreateDesktopShortcut || commonOptions.isCreateStartMenuShortcut)) {
          result += `>\n`;
          const shortcutName = commonOptions.shortcutName;

          if (isCreateDesktopShortcut) {
            result += `${fileSpace}  <Shortcut Id="desktopShortcut" Directory="DesktopFolder" Name="${shortcutName}" WorkingDirectory="APPLICATIONFOLDER" Advertise="yes" Icon="icon.ico"/>\n`;
          }

          const hasMenuCategory = commonOptions.menuCategory != null;
          const startMenuShortcutDirectoryId = hasMenuCategory ? "AppProgramMenuDir" : "ProgramMenuFolder";

          if (commonOptions.isCreateStartMenuShortcut) {
            if (hasMenuCategory) {
              dirs.push(`<Directory Id="${startMenuShortcutDirectoryId}" Name="ProgramMenuFolder:\\${commonOptions.menuCategory}\\"/>`);
            }

            result += `${fileSpace}  <Shortcut Id="startMenuShortcut" Directory="${startMenuShortcutDirectoryId}" Name="${shortcutName}" WorkingDirectory="APPLICATIONFOLDER" Advertise="yes" Icon="icon.ico">\n`;
            result += `${fileSpace}    <ShortcutProperty Key="System.AppUserModel.ID" Value="${_this4.packager.appInfo.id}"/>\n`;
            result += `${fileSpace}  </Shortcut>\n`;
          }

          result += `${fileSpace}</File>`;

          if (hasMenuCategory) {
            result += `<RemoveFolder Id="${startMenuShortcutDirectoryId}" Directory="${startMenuShortcutDirectoryId}" On="uninstall"/>\n`;
          }
        } else {
          result += `/>`;
        }

        return `${result}\n${fileSpace}</Component>`;
      });
      return {
        dirs: listToString(dirs, 2),
        files: listToString(files, 3)
      };
    })();
  }

}

exports.default = MsiTarget;

function listToString(list, indentLevel) {
  const space = " ".repeat(indentLevel * 2);
  return list.join(`\n${space}`);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=MsiTarget.js.map{"version":3,"sources":["../../src/targets/MsiTarget.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEA,MAAM,qCAAqC,GAAG,2BAAK,KAAL,CAAW,sCAAX,CAA9C;;AACA,MAAM,WAAW,GAAG,mBAApB;AAEA,MAAM,qBAAqB,GAAG,oBAA9B;AAEA,MAAM,eAAe,GAAG,KAAI,eAAJ;AAAA;AAAA,8BAAgC,aAAW;AACjE,QAAM,QAAQ,GAAG,OAAO,0BAAS,IAAI,CAAC,IAAL,CAAU,oCAAgB,KAAhB,CAAV,EAAkC,cAAlC,CAAT,EAA4D,MAA5D,CAAP,EACd,OADc,CACN,KADM,EACC,IADD,EAEd,OAFc,CAEN,KAFM,EAEC,IAFD,EAGd,OAHc,CAGN,cAHM,EAGU,SAHV,CAAjB;AAIA,SAAO,GAAG,GAAC,OAAJ,CAAY,QAAZ,CAAP;AACD,CANuB,EAAxB,C,CAQA;;AACc,MAAO,SAAP,SAAyB,cAAzB,CAA+B;AAK3C,EAAA,WAAA,CAA6B,QAA7B,EAA6D,MAA7D,EAA2E;AACzE,UAAM,KAAN;AAD2B,SAAA,QAAA,GAAA,QAAA;AAAgC,SAAA,MAAA,GAAA,MAAA;AAJ5C,SAAA,EAAA,GAAK,OAAO,CAAC,QAAR,KAAqB,OAArB,GAA+B,KAAI,eAAJ,GAA/B,GAAiD,KAAI,uBAAJ,GAAtD;AAER,SAAA,OAAA,GAAsB,+BAAW,KAAK,QAAL,CAAc,4BAAzB,EAAuD,KAAK,QAAL,CAAc,MAAd,CAAqB,GAA5E,CAAtB;AAIR;;AAEK,EAAA,KAAN,CAAY,SAAZ,EAA+B,IAA/B,EAAyC;AAAA;;AAAA;AACvC,YAAM,QAAQ,GAAG,KAAI,CAAC,QAAtB;AACA,YAAM,YAAY,GAAG,QAAQ,CAAC,+BAAT,CAAyC,KAAI,CAAC,OAA9C,EAAuD,KAAvD,EAA8D,IAA9D,CAArB;AACA,YAAM,YAAY,GAAG,IAAI,CAAC,IAAL,CAAU,KAAI,CAAC,MAAf,EAAuB,YAAvB,CAArB;AACA,YAAM,QAAQ,CAAC,IAAT,CAAc,wBAAd,CAAuC;AAC3C,QAAA,qBAAqB,EAAE,KADoB;AAE3C,QAAA,IAAI,EAAE,YAFqC;AAG3C,QAAA;AAH2C,OAAvC,CAAN;AAMA,YAAM,QAAQ,SAAS,kCAAe,KAAf,EAAqB,QAArB,EAA+B,IAA/B,CAAvB;AACA,YAAM,EAAE,GAAG,KAAI,CAAC,EAAhB;AAEA,YAAM,aAAa,GAAG,gEAAoB,KAAI,CAAC,OAAzB,EAAkC,KAAI,CAAC,QAAvC,CAAtB;;AAEA,UAAI,aAAa,CAAC,UAAlB,EAA8B;AAC5B;AACA;AACA,2BAAI,IAAJ,CAAS,kEAAT;AACD;;AAED,YAAM,WAAW,GAAG,QAAQ,CAAC,WAAT,CAAqB,aAArB,CAApB;AACA,YAAM,WAAW,GAAG,CAAC,gBAAD,CAApB;AACA,YAAM,MAAM,GAAG,aAAa,CAAC,UAAd,GAA4B,QAAQ,CAAC,WAAT,CAAqB,qBAArB,CAA5B,GAA0E,IAAzF;AACA,YAAM,2BAAU,WAAV,SAA6B,KAAI,CAAC,aAAL,CAAmB,SAAnB,EAA8B,IAA9B,EAAoC,aAApC,CAA7B,EAAN;;AACA,UAAI,MAAM,KAAK,IAAf,EAAqB;AACnB,cAAM,2BAAU,MAAV,SAAwB,0BAAS,IAAI,CAAC,IAAL,CAAU,oCAAgB,KAAhB,CAAV,EAAkC,qBAAlC,CAAT,EAAmE,MAAnE,CAAxB,EAAN;AACA,QAAA,WAAW,CAAC,IAAZ,CAAiB,qBAAqB,CAAC,OAAtB,CAA8B,MAA9B,EAAsC,SAAtC,CAAjB;AACD,OA5BsC,CA8BvC;;;AACA,YAAM,UAAU,SAAS,kCAAc,KAAd,EAAqB,cAArB,EAAqC,0FAArC,CAAzB,CA/BuC,CAiCvC;;AACA,YAAM,UAAU,GAAG,CACjB,OADiB,EACR,IAAI,KAAK,oBAAK,IAAd,GAAqB,KAArB,GAA8B,IAAI,KAAK,oBAAK,MAAd,GAAuB,KAAvB,GAA+B,KADrD,EAEjB,YAAY,EAAE,CAAC,QAAH,CAAY,SAAZ,CAAsB,EAFjB,EAGjB,MAHiB,CAGV,KAAI,CAAC,gBAAL,EAHU,CAAnB;AAIA,MAAA,UAAU,CAAC,IAAX,CAAgB,aAAhB;;AACA,UAAI,MAAM,KAAK,IAAf,EAAqB;AACnB,QAAA,UAAU,CAAC,IAAX,CAAgB,qBAAhB;AACD;;AACD,YAAM,EAAE,CAAC,IAAH,CAAQ,EAAE,CAAC,QAAH,CAAY,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,YAAtB,CAAZ,CAAR,EAA0D,UAA1D,EAAsE;AAC1E,QAAA,GAAG,EAAE,QAAQ,CAAC;AAD4D,OAAtE,CAAN;AAIA,YAAM,KAAI,CAAC,KAAL,CAAW,WAAX,EAAwB,EAAxB,EAA4B,YAA5B,EAA0C,SAA1C,EAAqD,UAArD,EAAiE,QAAQ,CAAC,GAA1E,CAAN;AAEA,YAAM,QAAQ,CAAC,OAAT,EAAN;AAEA,YAAM,QAAQ,CAAC,IAAT,CAAc,YAAd,CAAN;AAEA,YAAM,QAAQ,CAAC,IAAT,CAAc,0BAAd,CAAyC;AAC7C,QAAA,IAAI,EAAE,YADuC;AAE7C,QAAA,QAF6C;AAG7C,QAAA,IAH6C;AAI7C,QAAA,gBAAgB,EAAE,QAAQ,CAAC,uBAAT,CAAiC,YAAjC,EAA+C,KAA/C,CAJ2B;AAK7C,QAAA,MAAM,EAAE,KALqC;AAM7C,QAAA,iBAAiB,EAAE;AAN0B,OAAzC,CAAN;AApDuC;AA4DxC;;AAEa,EAAA,KAAN,CAAY,WAAZ,EAAwC,EAAxC,EAAuD,YAAvD,EAA6E,SAA7E,EAAgG,UAAhG,EAAoH,OAApH,EAAmI;AAAA;;AAAA;AACzI;AACA,YAAM,SAAS,GAAG,CAChB,MADgB,EACR,EAAE,CAAC,QAAH,CAAY,YAAZ,CADQ,EAEhB,IAFgB,EAGhB;AACA,aAJgB,EAKhB;AACA;AACA,eAPgB,EAQhB,YAAY,EAAE,CAAC,QAAH,CAAY,SAAZ,CAAsB,EARlB,EAUhB,MAVgB,CAUT,MAAI,CAAC,gBAAL,EAVS,CAAlB,CAFyI,CAczI;;AACA,UAAI,OAAO,CAAC,QAAR,KAAqB,OAAzB,EAAkC;AAChC;AACA,QAAA,SAAS,CAAC,IAAV,CAAe,OAAf;AACD;;AAED,UAAI,MAAI,CAAC,OAAL,CAAa,QAAb,KAA0B,KAA9B,EAAqC;AACnC,QAAA,SAAS,CAAC,IAAV,CAAe,MAAf,EAAuB,gBAAvB;AACD,OAtBwI,CAwBzI;;;AACA,MAAA,SAAS,CAAC,IAAV,CAAe,GAAG,WAAlB;AACA,YAAM,EAAE,CAAC,IAAH,CAAQ,EAAE,CAAC,QAAH,CAAY,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,WAAtB,CAAZ,CAAR,EAAyD,SAAzD,EAAoE;AACxE,QAAA,GAAG,EAAE;AADmE,OAApE,CAAN;AA1ByI;AA6B1I;;AAEO,EAAA,gBAAgB,GAAA;AACtB,UAAM,IAAI,GAAkB,CAAC,WAAD,CAA5B;;AACA,QAAI,KAAK,OAAL,CAAa,gBAAb,KAAkC,KAAtC,EAA6C;AAC3C,MAAA,IAAI,CAAC,IAAL,CAAU,KAAV;AACD;;AACD,WAAO,IAAP;AACD;;AAEa,EAAA,aAAN,CAAoB,SAApB,EAAuC,IAAvC,EAAmD,aAAnD,EAAoG;AAAA;;AAAA;AAC1G,YAAM,OAAO,GAAG,MAAI,CAAC,QAAL,CAAc,OAA9B;AACA,YAAM;AAAC,QAAA,KAAD;AAAQ,QAAA;AAAR,gBAAsB,MAAI,CAAC,sBAAL,CAA4B,SAA5B,CAA5B;AAEA,YAAM,WAAW,GAAG,OAAO,CAAC,WAA5B;;AACA,UAAI,CAAC,WAAL,EAAkB;AAChB,2BAAI,IAAJ,CAAS,2EAAT;AACD;;AAED,YAAM,WAAW,GAAG,MAAI,CAAC,QAAL,CAAc,WAAlC;AACA,YAAM,OAAO,GAAG,MAAI,CAAC,OAArB;AACA,YAAM,QAAQ,SAAS,MAAI,CAAC,QAAL,CAAc,WAAd,EAAvB;AACA,aAAO,OAAO,eAAe,CAAC,KAAvB,EAA6B,MAAA,CAAA,MAAA,CAAA,EAAA,EAC/B,aAD+B,EAClB;AAChB,QAAA,uBAAuB,EAAE,aAAa,CAAC,uBAAd,KAA0C,qEAA8B,KADjF;AAEhB,QAAA,gBAAgB,EAAE,OAAO,CAAC,cAAR,KAA2B,KAF7B;AAGhB,QAAA,QAAQ,EAAE,QAAQ,IAAI,IAAZ,GAAmB,IAAnB,GAA0B,MAAI,CAAC,EAAL,CAAQ,QAAR,CAAiB,QAAjB,CAHpB;AAIhB,QAAA,gBAAgB,EAAE,WAAW,KAAK,OAAhB,GAA0B,MAA1B,GAAmC,MAJrC;AAKhB,QAAA,OAAO,EAAE,OAAO,CAAC,4BAAR,EALO;AAMhB,QAAA,WAAW,EAAE,OAAO,CAAC,WANL;AAOhB,QAAA,WAAW,EAAE,CAAC,OAAO,CAAC,WAAR,IAAuB,2BAAK,EAAL,CAAQ,OAAO,CAAC,EAAhB,EAAoB,qCAApB,CAAxB,EAAoF,WAApF,EAPG;AAQhB,QAAA,YAAY,EAAE,WAAW,IAAI,OAAO,CAAC,WARrB;AAShB,QAAA,cAAc,EAAE,OAAO,CAAC,WATR;AAUhB;AACA,QAAA,cAAc,EAAE,IAAI,KAAK,oBAAK,GAAd,GAAoB,sBAApB,GAA6C,oBAX7C;AAYhB;AACA,QAAA,4BAA4B,EAAE,iDAA8B,OAA9B,EAAuC,aAAa,CAAC,YAAd,KAA+B,IAAtE,CAbd;AAchB,QAAA,IAdgB;AAehB,QAAA;AAfgB,OADkB,CAA7B,CAAP;AAZ0G;AA8B3G;;AAEa,EAAA,sBAAN,CAA6B,SAA7B,EAA8C;AAAA;;AAAA;AACpD,YAAM,OAAO,GAAG,MAAI,CAAC,QAAL,CAAc,OAA9B;AACA,UAAI,2BAA2B,GAAG,KAAlC;AACA,YAAM,QAAQ,GAAG,IAAI,GAAJ,EAAjB;AACA,YAAM,IAAI,GAAkB,EAA5B;AACA,YAAM,SAAS,GAAG,IAAI,MAAJ,CAAW,CAAX,CAAlB;AACA,YAAM,aAAa,GAAG,gEAAoB,MAAI,CAAC,OAAzB,EAAkC,MAAI,CAAC,QAAvC,CAAtB;AACA,YAAM,KAAK,SAAS,uBAAgB,GAAhB,CAAoB,gBAAK,SAAL,CAApB,EAAqC,IAAI,IAAG;AAC9D,cAAM,WAAW,GAAG,IAAI,CAAC,SAAL,CAAe,SAAS,CAAC,MAAV,GAAmB,CAAlC,CAApB;AAEA,cAAM,SAAS,GAAG,WAAW,CAAC,WAAZ,CAAwB,IAAI,CAAC,GAA7B,CAAlB;AACA,cAAM,QAAQ,GAAG,SAAS,GAAG,CAAZ,GAAgB,WAAW,CAAC,SAAZ,CAAsB,SAAS,GAAG,CAAlC,CAAhB,GAAuD,WAAxE;AACA,YAAI,WAAW,GAAkB,IAAjC;AACA,YAAI,OAAO,GAAG,EAAd,CAN8D,CAO9D;;AACA,YAAI,SAAS,GAAG,CAAhB,EAAmB;AACjB;AACA;AACA;AACA,UAAA,OAAO,GAAG,WAAW,CAAC,SAAZ,CAAsB,CAAtB,EAAyB,SAAzB,CAAV,CAJiB,CAKjB;;AACA,UAAA,WAAW,GAAG,MAAM,0BAAW,KAAX,EAAkB,MAAlB,CAAyB,OAAzB,EAAkC,MAAlC,CAAyC,QAAzC,EAAmD,OAAnD,CAA2D,KAA3D,EAAkE,GAAlE,EAAuE,OAAvE,CAA+E,KAA/E,EAAsF,GAAtF,EAA2F,OAA3F,CAAmG,KAAnG,EAA0G,EAA1G,CAApB;;AACA,cAAI,CAAC,QAAQ,CAAC,GAAT,CAAa,OAAb,CAAL,EAA4B;AAC1B,YAAA,QAAQ,CAAC,GAAT,CAAa,OAAb;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,kBAAkB,WAAW,WAAW,WAAW,MAAM,OAAO,CAAC,OAAR,CAAgB,KAAhB,EAAuB,IAAvB,CAA4B,OAA/F;AACD;AACF,SAXD,MAYK,IAAI,CAAC,2BAAL,EAAkC;AACrC,UAAA,2BAA2B,GAAG,IAA9B;AACD,SAtB6D,CAwB9D;AACA;;;AACA,YAAI,MAAM,GAAG,aAAa,WAAW,KAAK,IAAhB,GAAuB,EAAvB,GAA4B,eAAe,WAAW,GAAG,GAAnF;AACA,QAAA,MAAM,IAAI,KAAK,SAAS,iBAAiB,QAAQ,0BAA0B,IAAI,CAAC,GAAG,GAAG,WAAW,gCAAjG;AACA,cAAM,gBAAgB,GAAG,WAAW,KAAK,GAAG,OAAO,CAAC,eAAe,MAAnE;;AACA,YAAI,gBAAJ,EAAsB;AACpB,UAAA,MAAM,IAAI,sBAAV;AACD,SAFD,MAGK,IAAI,WAAW,KAAK,IAApB,EAA0B;AAC7B,UAAA,MAAM,IAAI,QAAQ,IAAI,CAAC,QAAL,CAAc,WAAd,CAA0B,KAA5C;AACD;;AAED,cAAM,uBAAuB,GAAG,aAAa,CAAC,uBAAd,KAA0C,qEAA8B,KAAxG;;AACA,YAAI,gBAAgB,KAAK,uBAAuB,IAAI,aAAa,CAAC,yBAA9C,CAApB,EAA8F;AAC5F,UAAA,MAAM,IAAI,KAAV;AACA,gBAAM,YAAY,GAAG,aAAa,CAAC,YAAnC;;AACA,cAAI,uBAAJ,EAA6B;AAC3B,YAAA,MAAM,IAAI,GAAG,SAAS,oEAAoE,YAAY,4EAAtG;AACD;;AAED,gBAAM,eAAe,GAAG,aAAa,CAAC,YAAd,IAA8B,IAAtD;AACA,gBAAM,4BAA4B,GAAG,eAAe,GAAG,mBAAH,GAAyB,mBAA7E;;AACA,cAAI,aAAa,CAAC,yBAAlB,EAA6C;AAC3C,gBAAI,eAAJ,EAAqB;AACnB,cAAA,IAAI,CAAC,IAAL,CAAU,kBAAkB,4BAA4B,+BAA+B,aAAa,CAAC,YAAY,OAAjH;AACD;;AACD,YAAA,MAAM,IAAI,GAAG,SAAS,iDAAiD,4BAA4B,WAAW,YAAY,2EAA1H;AACA,YAAA,MAAM,IAAI,GAAG,SAAS,6DAA6D,MAAI,CAAC,QAAL,CAAc,OAAd,CAAsB,EAAE,OAA3G;AACA,YAAA,MAAM,IAAI,GAAG,SAAS,iBAAtB;AACD;;AACD,UAAA,MAAM,IAAI,GAAG,SAAS,SAAtB;;AAEA,cAAI,eAAJ,EAAqB;AACnB,YAAA,MAAM,IAAI,qBAAqB,4BAA4B,gBAAgB,4BAA4B,sBAAvG;AACD;AACF,SAtBD,MAuBK;AACH,UAAA,MAAM,IAAI,IAAV;AACD;;AAED,eAAO,GAAG,MAAM,KAAK,SAAS,cAA9B;AACD,OAjEmB,CAApB;AAmEA,aAAO;AAAC,QAAA,IAAI,EAAE,YAAY,CAAC,IAAD,EAAO,CAAP,CAAnB;AAA8B,QAAA,KAAK,EAAE,YAAY,CAAC,KAAD,EAAQ,CAAR;AAAjD,OAAP;AA1EoD;AA2ErD;;AAzN0C;;;;AA4N7C,SAAS,YAAT,CAAsB,IAAtB,EAA2C,WAA3C,EAA+D;AAC7D,QAAM,KAAK,GAAG,IAAI,MAAJ,CAAW,WAAW,GAAG,CAAzB,CAAd;AACA,SAAO,IAAI,CAAC,IAAL,CAAU,KAAK,KAAK,EAApB,CAAP;AACD,C","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, log, deepAssign } from \"builder-util\"\nimport { UUID } from \"builder-util-runtime\"\nimport { getBinFromUrl } from \"../binDownload\"\nimport { walk } from \"builder-util/out/fs\"\nimport { createHash } from \"crypto\"\nimport * as ejs from \"ejs\"\nimport { readFile, writeFile } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { MsiOptions } from \"../\"\nimport { Target } from \"../core\"\nimport { DesktopShortcutCreationPolicy, FinalCommonWindowsInstallerOptions, getEffectiveOptions } from \"../options/CommonWindowsInstallerConfiguration\"\nimport { getTemplatePath } from \"../util/pathManager\"\nimport { VmManager } from \"../vm/vm\"\nimport { WineVmManager } from \"../vm/WineVm\"\nimport { WinPackager } from \"../winPackager\"\nimport { createStageDir, getWindowsInstallationDirName } from \"./targetUtil\"\n\nconst ELECTRON_BUILDER_UPGRADE_CODE_NS_UUID = UUID.parse(\"d752fe43-5d44-44d5-9fc9-6dd1bf19d5cc\")\nconst ROOT_DIR_ID = \"APPLICATIONFOLDER\"\n\nconst ASSISTED_UI_FILE_NAME = \"WixUI_Assisted.wxs\"\n\nconst projectTemplate = new Lazy<(data: any) => string>(async () => {\n  const template = (await readFile(path.join(getTemplatePath(\"msi\"), \"template.xml\"), \"utf8\"))\n    .replace(/{{/g, \"<%\")\n    .replace(/}}/g, \"%>\")\n    .replace(/\\${([^}]+)}/g, \"<%=$1%>\")\n  return ejs.compile(template)\n})\n\n// WiX doesn't support Mono, so, dontnet462 is required to be installed for wine (preinstalled in our bundled wine)\nexport default class MsiTarget extends Target {\n  private readonly vm = process.platform === \"win32\" ? new VmManager() : new WineVmManager()\n\n  readonly options: MsiOptions = deepAssign(this.packager.platformSpecificBuildOptions, this.packager.config.msi)\n\n  constructor(private readonly packager: WinPackager, readonly outDir: string) {\n    super(\"msi\")\n  }\n\n  async build(appOutDir: string, arch: Arch) {\n    const packager = this.packager\n    const artifactName = packager.expandArtifactBeautyNamePattern(this.options, \"msi\", arch)\n    const artifactPath = path.join(this.outDir, artifactName)\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: \"MSI\",\n      file: artifactPath,\n      arch,\n    })\n\n    const stageDir = await createStageDir(this, packager, arch)\n    const vm = this.vm\n\n    const commonOptions = getEffectiveOptions(this.options, this.packager)\n\n    if (commonOptions.isAssisted) {\n      // F*** *** ***  ***  ***  ***  ***  ***  ***  ***  ***  ***  *** WiX  ***  ***  ***  ***  ***  ***  ***  ***  ***\n      // cannot understand how to set MSIINSTALLPERUSER on radio box change. In any case installed per user.\n      log.warn(`MSI DOESN'T SUPPORT assisted installer. Please use NSIS instead.`)\n    }\n\n    const projectFile = stageDir.getTempFile(\"project.wxs\")\n    const objectFiles = [\"project.wixobj\"]\n    const uiFile = commonOptions.isAssisted ?  stageDir.getTempFile(ASSISTED_UI_FILE_NAME) : null\n    await writeFile(projectFile, await this.writeManifest(appOutDir, arch, commonOptions))\n    if (uiFile !== null) {\n      await writeFile(uiFile, await readFile(path.join(getTemplatePath(\"msi\"), ASSISTED_UI_FILE_NAME), \"utf8\"))\n      objectFiles.push(ASSISTED_UI_FILE_NAME.replace(\".wxs\", \".wixobj\"))\n    }\n\n    // noinspection SpellCheckingInspection\n    const vendorPath = await getBinFromUrl(\"wix\", \"4.0.0.5512.2\", \"/X5poahdCc3199Vt6AP7gluTlT1nxi9cbbHhZhCMEu+ngyP1LiBMn+oZX7QAZVaKeBMc2SjVp7fJqNLqsUnPNQ==\")\n\n    // noinspection SpellCheckingInspection\n    const candleArgs = [\n      \"-arch\", arch === Arch.ia32 ? \"x86\" : (arch === Arch.armv7l ? \"arm\" : \"x64\"),\n      `-dappDir=${vm.toVmFile(appOutDir)}`,\n    ].concat(this.getCommonWixArgs())\n    candleArgs.push(\"project.wxs\")\n    if (uiFile !== null) {\n      candleArgs.push(ASSISTED_UI_FILE_NAME)\n    }\n    await vm.exec(vm.toVmFile(path.join(vendorPath, \"candle.exe\")), candleArgs, {\n      cwd: stageDir.dir,\n    })\n\n    await this.light(objectFiles, vm, artifactPath, appOutDir, vendorPath, stageDir.dir)\n\n    await stageDir.cleanup()\n\n    await packager.sign(artifactPath)\n\n    await packager.info.callArtifactBuildCompleted({\n      file: artifactPath,\n      packager,\n      arch,\n      safeArtifactName: packager.computeSafeArtifactName(artifactName, \"msi\"),\n      target: this,\n      isWriteUpdateInfo: false,\n    })\n  }\n\n  private async light(objectFiles: Array<string>, vm: VmManager, artifactPath: string, appOutDir: string, vendorPath: string, tempDir: string) {\n    // noinspection SpellCheckingInspection\n    const lightArgs = [\n      \"-out\", vm.toVmFile(artifactPath),\n      \"-v\",\n      // https://github.com/wixtoolset/issues/issues/5169\n      \"-spdb\",\n      // https://sourceforge.net/p/wix/bugs/2405/\n      // error LGHT1076 : ICE61: This product should remove only older versions of itself. The Maximum version is not less than the current product. (1.1.0.42 1.1.0.42)\n      \"-sw1076\",\n      `-dappDir=${vm.toVmFile(appOutDir)}`,\n      // \"-dcl:high\",\n    ].concat(this.getCommonWixArgs())\n\n    // http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Build-3-5-2229-0-give-me-the-following-error-error-LGHT0216-An-unexpected-Win32-exception-with-errorn-td5707443.html\n    if (process.platform !== \"win32\") {\n      // noinspection SpellCheckingInspection\n      lightArgs.push(\"-sval\")\n    }\n\n    if (this.options.oneClick === false) {\n      lightArgs.push(\"-ext\", \"WixUIExtension\")\n    }\n\n    // objectFiles - only filenames, we set current directory to our temp stage dir\n    lightArgs.push(...objectFiles)\n    await vm.exec(vm.toVmFile(path.join(vendorPath, \"light.exe\")), lightArgs, {\n      cwd: tempDir,\n    })\n  }\n\n  private getCommonWixArgs() {\n    const args: Array<string> = [\"-pedantic\"]\n    if (this.options.warningsAsErrors !== false) {\n      args.push(\"-wx\")\n    }\n    return args\n  }\n\n  private async writeManifest(appOutDir: string, arch: Arch, commonOptions: FinalCommonWindowsInstallerOptions) {\n    const appInfo = this.packager.appInfo\n    const {files, dirs} = await this.computeFileDeclaration(appOutDir)\n\n    const companyName = appInfo.companyName\n    if (!companyName) {\n      log.warn(`Manufacturer is not set for MSI â€” please set \"author\" in the package.json`)\n    }\n\n    const compression = this.packager.compression\n    const options = this.options\n    const iconPath = await this.packager.getIconPath()\n    return (await projectTemplate.value)({\n      ...commonOptions,\n      isCreateDesktopShortcut: commonOptions.isCreateDesktopShortcut !== DesktopShortcutCreationPolicy.NEVER,\n      isRunAfterFinish: options.runAfterFinish !== false,\n      iconPath: iconPath == null ? null : this.vm.toVmFile(iconPath),\n      compressionLevel: compression === \"store\" ? \"none\" : \"high\",\n      version: appInfo.getVersionInWeirdWindowsForm(),\n      productName: appInfo.productName,\n      upgradeCode: (options.upgradeCode || UUID.v5(appInfo.id, ELECTRON_BUILDER_UPGRADE_CODE_NS_UUID)).toUpperCase(),\n      manufacturer: companyName || appInfo.productName,\n      appDescription: appInfo.description,\n      // https://stackoverflow.com/questions/1929038/compilation-error-ice80-the-64bitcomponent-uses-32bitdirectory\n      programFilesId: arch === Arch.x64 ? \"ProgramFiles64Folder\" : \"ProgramFilesFolder\",\n      // wix in the name because special wix format can be used in the name\n      installationDirectoryWixName: getWindowsInstallationDirName(appInfo, commonOptions.isPerMachine === true),\n      dirs,\n      files,\n    })\n  }\n\n  private async computeFileDeclaration(appOutDir: string) {\n    const appInfo = this.packager.appInfo\n    let isRootDirAddedToRemoveTable = false\n    const dirNames = new Set<string>()\n    const dirs: Array<string> = []\n    const fileSpace = \" \".repeat(6)\n    const commonOptions = getEffectiveOptions(this.options, this.packager)\n    const files = await BluebirdPromise.map(walk(appOutDir), file => {\n      const packagePath = file.substring(appOutDir.length + 1)\n\n      const lastSlash = packagePath.lastIndexOf(path.sep)\n      const fileName = lastSlash > 0 ? packagePath.substring(lastSlash + 1) : packagePath\n      let directoryId: string | null = null\n      let dirName = \"\"\n      // Wix Directory.FileSource doesn't work - https://stackoverflow.com/questions/21519388/wix-filesource-confusion\n      if (lastSlash > 0) {\n        // This Name attribute may also define multiple directories using the inline directory syntax.\n        // For example, \"ProgramFilesFolder:\\My Company\\My Product\\bin\" would create a reference to a Directory element with Id=\"ProgramFilesFolder\" then create directories named \"My Company\" then \"My Product\" then \"bin\" nested beneath each other.\n        // This syntax is a shortcut to defining each directory in an individual Directory element.\n        dirName = packagePath.substring(0, lastSlash)\n        // https://github.com/electron-userland/electron-builder/issues/3027\n        directoryId = \"d\" + createHash(\"md5\").update(dirName).digest(\"base64\").replace(/\\//g, \"_\").replace(/\\+/g, \".\").replace(/=+$/, \"\")\n        if (!dirNames.has(dirName)) {\n          dirNames.add(dirName)\n          dirs.push(`<Directory Id=\"${directoryId}\" Name=\"${ROOT_DIR_ID}:\\\\${dirName.replace(/\\//g, \"\\\\\")}\\\\\"/>`)\n        }\n      }\n      else if (!isRootDirAddedToRemoveTable) {\n        isRootDirAddedToRemoveTable = true\n      }\n\n      // since RegistryValue can be part of Component, *** *** *** *** *** *** *** *** *** wix cannot auto generate guid\n      // https://stackoverflow.com/questions/1405100/change-my-component-guid-in-wix\n      let result = `<Component${directoryId === null ? \"\" : ` Directory=\"${directoryId}\"`}>`\n      result += `\\n${fileSpace}  <File Name=\"${fileName}\" Source=\"$(var.appDir)${path.sep}${packagePath}\" ReadOnly=\"yes\" KeyPath=\"yes\"`\n      const isMainExecutable = packagePath === `${appInfo.productFilename}.exe`\n      if (isMainExecutable) {\n        result += ' Id=\"mainExecutable\"'\n      }\n      else if (directoryId === null) {\n        result += ` Id=\"${path.basename(packagePath)}_f\"`\n      }\n\n      const isCreateDesktopShortcut = commonOptions.isCreateDesktopShortcut !== DesktopShortcutCreationPolicy.NEVER\n      if (isMainExecutable && (isCreateDesktopShortcut || commonOptions.isCreateStartMenuShortcut)) {\n        result += `>\\n`\n        const shortcutName = commonOptions.shortcutName\n        if (isCreateDesktopShortcut) {\n          result += `${fileSpace}  <Shortcut Id=\"desktopShortcut\" Directory=\"DesktopFolder\" Name=\"${shortcutName}\" WorkingDirectory=\"APPLICATIONFOLDER\" Advertise=\"yes\" Icon=\"icon.ico\"/>\\n`\n        }\n\n        const hasMenuCategory = commonOptions.menuCategory != null\n        const startMenuShortcutDirectoryId = hasMenuCategory ? \"AppProgramMenuDir\" : \"ProgramMenuFolder\"\n        if (commonOptions.isCreateStartMenuShortcut) {\n          if (hasMenuCategory) {\n            dirs.push(`<Directory Id=\"${startMenuShortcutDirectoryId}\" Name=\"ProgramMenuFolder:\\\\${commonOptions.menuCategory}\\\\\"/>`)\n          }\n          result += `${fileSpace}  <Shortcut Id=\"startMenuShortcut\" Directory=\"${startMenuShortcutDirectoryId}\" Name=\"${shortcutName}\" WorkingDirectory=\"APPLICATIONFOLDER\" Advertise=\"yes\" Icon=\"icon.ico\">\\n`\n          result += `${fileSpace}    <ShortcutProperty Key=\"System.AppUserModel.ID\" Value=\"${this.packager.appInfo.id}\"/>\\n`\n          result += `${fileSpace}  </Shortcut>\\n`\n        }\n        result += `${fileSpace}</File>`\n\n        if (hasMenuCategory) {\n          result += `<RemoveFolder Id=\"${startMenuShortcutDirectoryId}\" Directory=\"${startMenuShortcutDirectoryId}\" On=\"uninstall\"/>\\n`\n        }\n      }\n      else {\n        result += `/>`\n      }\n\n      return `${result}\\n${fileSpace}</Component>`\n    })\n\n    return {dirs: listToString(dirs, 2), files: listToString(files, 3)}\n  }\n}\n\nfunction listToString(list: Array<string>, indentLevel:  number) {\n  const space = \" \".repeat(indentLevel * 2)\n  return list.join(`\\n${space}`)\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.tar = tar;
exports.compute7zCompressArgs = compute7zCompressArgs;
exports.archive = archive;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _zipBin() {
  const data = require("7zip-bin");

  _zipBin = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _tools() {
  const data = require("./tools");

  _tools = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/** @internal */
function tar(_x, _x2, _x3, _x4, _x5, _x6) {
  return _tar.apply(this, arguments);
}

function _tar() {
  _tar = (0, _bluebirdLst().coroutine)(function* (compression, format, outFile, dirToArchive, isMacApp, tempDirManager) {
    const tarFile = yield tempDirManager.getTempFile({
      suffix: ".tar"
    });
    const tarArgs = debug7zArgs("a");
    tarArgs.push(tarFile);
    tarArgs.push(path.basename(dirToArchive));
    yield Promise.all([(0, _builderUtil().exec)(_zipBin().path7za, tarArgs, {
      cwd: path.dirname(dirToArchive)
    }), // remove file before - 7z doesn't overwrite file, but update
    (0, _fs().unlinkIfExists)(outFile)]);

    if (!isMacApp) {
      yield (0, _builderUtil().exec)(_zipBin().path7za, ["rn", tarFile, path.basename(dirToArchive), path.basename(outFile, `.${format}`)]);
    }

    if (format === "tar.lz") {
      // noinspection SpellCheckingInspection
      let lzipPath = "lzip";

      if (process.platform === "darwin") {
        lzipPath = path.join((yield (0, _tools().getLinuxToolsPath)()), "bin", lzipPath);
      }

      yield (0, _builderUtil().exec)(lzipPath, [compression === "store" ? "-1" : "-9", "--keep"
      /* keep (don't delete) input files */
      , tarFile]); // bloody lzip creates file in the same dir where input file with postfix `.lz`, option --output doesn't work

      yield (0, _fsExtraP().move)(`${tarFile}.lz`, outFile);
      return;
    }

    const args = compute7zCompressArgs(format === "tar.xz" ? "xz" : format === "tar.bz2" ? "bzip2" : "gzip", {
      isRegularFile: true,
      method: "DEFAULT",
      compression
    });
    args.push(outFile, tarFile);
    yield (0, _builderUtil().exec)(_zipBin().path7za, args, {
      cwd: path.dirname(dirToArchive)
    }, _builderUtil().debug7z.enabled);
  });
  return _tar.apply(this, arguments);
}

function compute7zCompressArgs(format, options = {}) {
  let storeOnly = options.compression === "store";
  const args = debug7zArgs("a");
  let isLevelSet = false;

  if (process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL != null) {
    storeOnly = false;
    args.push(`-mx=${process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL}`);
    isLevelSet = true;
  }

  const isZip = format === "zip";

  if (!storeOnly) {
    if (isZip && options.compression === "maximum") {
      // http://superuser.com/a/742034
      args.push("-mfb=258", "-mpass=15");
    }

    if (!isLevelSet) {
      // https://github.com/electron-userland/electron-builder/pull/3032
      args.push("-mx=" + (!isZip || options.compression === "maximum" ? "9" : "7"));
    }
  }

  if (options.dictSize != null) {
    args.push(`-md=${options.dictSize}m`);
  } // https://sevenzip.osdn.jp/chm/cmdline/switches/method.htm#7Z
  // https://stackoverflow.com/questions/27136783/7zip-produces-different-output-from-identical-input
  // tc and ta are off by default, but to be sure, we explicitly set it to off
  // disable "Stores NTFS timestamps for files: Modification time, Creation time, Last access time." to produce the same archive for the same data


  if (!options.isRegularFile) {
    args.push("-mtc=off");
  }

  if (format === "7z" || format.endsWith(".7z")) {
    if (options.solid === false) {
      args.push("-ms=off");
    }

    if (options.isArchiveHeaderCompressed === false) {
      args.push("-mhc=off");
    } // args valid only for 7z
    // -mtm=off disable "Stores last Modified timestamps for files."


    args.push("-mtm=off", "-mta=off");
  }

  if (options.method != null) {
    if (options.method !== "DEFAULT") {
      args.push(`-mm=${options.method}`);
    }
  } else if (isZip || storeOnly) {
    args.push(`-mm=${storeOnly ? "Copy" : "Deflate"}`);
  }

  if (isZip) {
    // -mcu switch:  7-Zip uses UTF-8, if there are non-ASCII symbols.
    // because default mode: 7-Zip uses UTF-8, if the local code page doesn't contain required symbols.
    // but archive should be the same regardless where produced
    args.push("-mcu");
  }

  return args;
} // 7z is very fast, so, use ultra compression

/** @internal */


function archive(_x7, _x8, _x9) {
  return _archive.apply(this, arguments);
}

function _archive() {
  _archive = (0, _bluebirdLst().coroutine)(function* (format, outFile, dirToArchive, options = {}) {
    const args = compute7zCompressArgs(format, options); // remove file before - 7z doesn't overwrite file, but update

    yield (0, _fs().unlinkIfExists)(outFile);
    args.push(outFile, options.withoutDir ? "." : path.basename(dirToArchive));

    if (options.excluded != null) {
      for (const mask of options.excluded) {
        args.push(`-xr!${mask}`);
      }
    }

    try {
      yield (0, _builderUtil().exec)(_zipBin().path7za, args, {
        cwd: options.withoutDir ? dirToArchive : path.dirname(dirToArchive)
      }, _builderUtil().debug7z.enabled);
    } catch (e) {
      if (e.code === "ENOENT" && !(yield (0, _fs().exists)(dirToArchive))) {
        throw new Error(`Cannot create archive: "${dirToArchive}" doesn't exist`);
      } else {
        throw e;
      }
    }

    return outFile;
  });
  return _archive.apply(this, arguments);
}

function debug7zArgs(command) {
  const args = [command, "-bd"];

  if (_builderUtil().debug7z.enabled) {
    args.push("-bb");
  }

  return args;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=archive.js.map{"version":3,"sources":["../../src/targets/archive.ts"],"names":[],"mappings":"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","sourcesContent":["import { path7za } from \"7zip-bin\"\nimport { debug7z, exec } from \"builder-util\"\nimport { exists, unlinkIfExists } from \"builder-util/out/fs\"\nimport { move } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { TmpDir } from \"temp-file\"\nimport { CompressionLevel } from \"../core\"\nimport { getLinuxToolsPath } from \"./tools\"\n\n/** @internal */\nexport async function tar(compression: CompressionLevel | any | any, format: string, outFile: string, dirToArchive: string, isMacApp: boolean, tempDirManager: TmpDir): Promise<void> {\n  const tarFile = await tempDirManager.getTempFile({suffix: \".tar\"})\n  const tarArgs = debug7zArgs(\"a\")\n  tarArgs.push(tarFile)\n  tarArgs.push(path.basename(dirToArchive))\n\n  await Promise.all([\n    exec(path7za, tarArgs, {cwd: path.dirname(dirToArchive)}),\n    // remove file before - 7z doesn't overwrite file, but update\n    unlinkIfExists(outFile),\n  ])\n\n  if (!isMacApp) {\n    await exec(path7za, [\"rn\", tarFile, path.basename(dirToArchive), path.basename(outFile, `.${format}`)])\n  }\n\n  if (format === \"tar.lz\") {\n    // noinspection SpellCheckingInspection\n    let lzipPath = \"lzip\"\n    if (process.platform === \"darwin\") {\n      lzipPath = path.join(await getLinuxToolsPath(), \"bin\", lzipPath)\n    }\n    await exec(lzipPath, [compression === \"store\" ? \"-1\" : \"-9\", \"--keep\" /* keep (don't delete) input files */, tarFile])\n    // bloody lzip creates file in the same dir where input file with postfix `.lz`, option --output doesn't work\n    await move(`${tarFile}.lz`, outFile)\n    return\n  }\n\n  const args = compute7zCompressArgs(format === \"tar.xz\" ? \"xz\" : (format === \"tar.bz2\" ? \"bzip2\" : \"gzip\"), {\n    isRegularFile: true,\n    method: \"DEFAULT\",\n    compression,\n  })\n  args.push(outFile, tarFile)\n  await exec(path7za, args, {\n    cwd: path.dirname(dirToArchive),\n  }, debug7z.enabled)\n}\n\nexport interface ArchiveOptions {\n  compression?: CompressionLevel | null\n\n  /**\n   * @default false\n   */\n  withoutDir?: boolean\n\n  /**\n   * @default true\n   */\n  solid?: boolean\n\n  /**\n   * @default true\n   */\n  isArchiveHeaderCompressed?: boolean\n\n  dictSize?: number\n  excluded?: Array<string> | null\n\n  // DEFAULT allows to disable custom logic and do not pass method switch at all\n  method?: \"Copy\" | \"LZMA\" | \"Deflate\" | \"DEFAULT\"\n\n  isRegularFile?: boolean\n}\n\nexport function compute7zCompressArgs(format: string, options: ArchiveOptions = {}) {\n  let storeOnly = options.compression === \"store\"\n  const args = debug7zArgs(\"a\")\n\n  let isLevelSet = false\n  if (process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL != null) {\n    storeOnly = false\n    args.push(`-mx=${process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL}`)\n    isLevelSet = true\n  }\n\n  const isZip = format === \"zip\"\n  if (!storeOnly) {\n    if (isZip && options.compression === \"maximum\") {\n      // http://superuser.com/a/742034\n      args.push(\"-mfb=258\", \"-mpass=15\")\n    }\n\n    if (!isLevelSet) {\n      // https://github.com/electron-userland/electron-builder/pull/3032\n      args.push(\"-mx=\" + ((!isZip || options.compression === \"maximum\") ? \"9\" : \"7\"))\n    }\n  }\n\n  if (options.dictSize != null) {\n    args.push(`-md=${options.dictSize}m`)\n  }\n\n  // https://sevenzip.osdn.jp/chm/cmdline/switches/method.htm#7Z\n  // https://stackoverflow.com/questions/27136783/7zip-produces-different-output-from-identical-input\n  // tc and ta are off by default, but to be sure, we explicitly set it to off\n  // disable \"Stores NTFS timestamps for files: Modification time, Creation time, Last access time.\" to produce the same archive for the same data\n  if (!options.isRegularFile) {\n    args.push(\"-mtc=off\")\n  }\n\n  if (format === \"7z\" || format.endsWith(\".7z\")) {\n    if (options.solid === false) {\n      args.push(\"-ms=off\")\n    }\n\n    if (options.isArchiveHeaderCompressed === false) {\n      args.push(\"-mhc=off\")\n    }\n\n    // args valid only for 7z\n    // -mtm=off disable \"Stores last Modified timestamps for files.\"\n    args.push(\"-mtm=off\", \"-mta=off\")\n  }\n\n  if (options.method != null) {\n    if (options.method !== \"DEFAULT\") {\n      args.push(`-mm=${options.method}`)\n    }\n  }\n  else if (isZip || storeOnly) {\n    args.push(`-mm=${storeOnly ? \"Copy\" : \"Deflate\"}`)\n  }\n\n  if (isZip) {\n    // -mcu switch:  7-Zip uses UTF-8, if there are non-ASCII symbols.\n    // because default mode: 7-Zip uses UTF-8, if the local code page doesn't contain required symbols.\n    // but archive should be the same regardless where produced\n    args.push(\"-mcu\")\n  }\n  return args\n}\n\n// 7z is very fast, so, use ultra compression\n/** @internal */\nexport async function archive(format: string, outFile: string, dirToArchive: string, options: ArchiveOptions = {}): Promise<string> {\n  const args = compute7zCompressArgs(format, options)\n  // remove file before - 7z doesn't overwrite file, but update\n  await unlinkIfExists(outFile)\n\n  args.push(outFile, options.withoutDir ? \".\" : path.basename(dirToArchive))\n  if (options.excluded != null) {\n    for (const mask of options.excluded) {\n      args.push(`-xr!${mask}`)\n    }\n  }\n\n  try {\n    await exec(path7za, args, {\n      cwd: options.withoutDir ? dirToArchive : path.dirname(dirToArchive),\n    }, debug7z.enabled)\n  }\n  catch (e) {\n    if (e.code === \"ENOENT\" && !(await exists(dirToArchive))) {\n      throw new Error(`Cannot create archive: \"${dirToArchive}\" doesn't exist`)\n    }\n    else {\n      throw e\n    }\n  }\n\n  return outFile\n}\n\nfunction debug7zArgs(command: \"a\" | \"x\"): Array<string> {\n  const args = [command, \"-bd\"]\n  if (debug7z.enabled) {\n    args.push(\"-bb\")\n  }\n  return args\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createNsisWebDifferentialUpdateInfo = createNsisWebDifferentialUpdateInfo;
exports.configureDifferentialAwareArchiveOptions = configureDifferentialAwareArchiveOptions;
exports.appendBlockmap = appendBlockmap;
exports.createBlockmap = createBlockmap;
exports.BLOCK_MAP_FILE_SUFFIX = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _appBuilder() {
  const data = require("../util/appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const BLOCK_MAP_FILE_SUFFIX = ".blockmap";
exports.BLOCK_MAP_FILE_SUFFIX = BLOCK_MAP_FILE_SUFFIX;

function createNsisWebDifferentialUpdateInfo(artifactPath, packageFiles) {
  if (packageFiles == null) {
    return null;
  }

  const keys = Object.keys(packageFiles);

  if (keys.length <= 0) {
    return null;
  }

  const packages = {};

  for (const arch of keys) {
    const packageFileInfo = packageFiles[arch];
    const file = path.basename(packageFileInfo.path);
    packages[arch] = Object.assign({}, packageFileInfo, {
      path: file,
      // https://github.com/electron-userland/electron-builder/issues/2583
      file
    });
  }

  return {
    packages
  };
}

function configureDifferentialAwareArchiveOptions(archiveOptions) {
  /*
   * dict size 64 MB: Full: 33,744.88 KB, To download: 17,630.3 KB (52%)
   * dict size 16 MB: Full: 33,936.84 KB, To download: 16,175.9 KB (48%)
   * dict size  8 MB: Full: 34,187.59 KB, To download:  8,229.9 KB (24%)
   * dict size  4 MB: Full: 34,628.73 KB, To download: 3,782.97 KB (11%)
      as we can see, if file changed in one place, all block is invalidated (and update size approximately equals to dict size)
      1 MB is used:
      1MB:
      2018/01/11 11:54:41:0045 File has 59 changed blocks
   2018/01/11 11:54:41:0050 Full: 71,588.59 KB, To download: 1,243.39 KB (2%)
      4MB:
      2018/01/11 11:31:43:0440 Full: 70,303.55 KB, To download: 4,843.27 KB (7%)
   2018/01/11 11:31:43:0435 File has 234 changed blocks
      */
  archiveOptions.dictSize = 1; // solid compression leads to a lot of changed blocks

  archiveOptions.solid = false; // do not allow to change compression level to avoid different packages

  archiveOptions.compression = "normal";
  return archiveOptions;
}

function appendBlockmap(_x) {
  return _appendBlockmap.apply(this, arguments);
}

function _appendBlockmap() {
  _appendBlockmap = (0, _bluebirdLst().coroutine)(function* (file) {
    _builderUtil().log.info({
      file: _builderUtil().log.filePath(file)
    }, "building embedded block map");

    return yield (0, _appBuilder().executeAppBuilderAsJson)(["blockmap", "--input", file, "--compression", "deflate"]);
  });
  return _appendBlockmap.apply(this, arguments);
}

function createBlockmap(_x2, _x3, _x4, _x5) {
  return _createBlockmap.apply(this, arguments);
} function _createBlockmap() {
  _createBlockmap = (0, _bluebirdLst().coroutine)(function* (file, target, packager, safeArtifactName) {
    const blockMapFile = `${file}${BLOCK_MAP_FILE_SUFFIX}`;

    _builderUtil().log.info({
      blockMapFile: _builderUtil().log.filePath(blockMapFile)
    }, "building block map");

    const updateInfo = yield (0, _appBuilder().executeAppBuilderAsJson)(["blockmap", "--input", file, "--output", blockMapFile]);
    yield packager.info.callArtifactBuildCompleted({
      file: blockMapFile,
      safeArtifactName: safeArtifactName == null ? null : `${safeArtifactName}${BLOCK_MAP_FILE_SUFFIX}`,
      target,
      arch: null,
      packager,
      updateInfo
    });
    return updateInfo;
  });
  return _createBlockmap.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=differentialUpdateInfoBuilder.js.map{"version":3,"sources":["../../src/targets/differentialUpdateInfoBuilder.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAGO,MAAM,qBAAqB,GAAG,WAA9B;;;AAED,SAAU,mCAAV,CAA8C,YAA9C,EAAoE,YAApE,EAAqH;AACzH,MAAI,YAAY,IAAI,IAApB,EAA0B;AACxB,WAAO,IAAP;AACD;;AAED,QAAM,IAAI,GAAG,MAAM,CAAC,IAAP,CAAY,YAAZ,CAAb;;AACA,MAAI,IAAI,CAAC,MAAL,IAAe,CAAnB,EAAsB;AACpB,WAAO,IAAP;AACD;;AAED,QAAM,QAAQ,GAAwC,EAAtD;;AACA,OAAK,MAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,UAAM,eAAe,GAAG,YAAY,CAAC,IAAD,CAApC;AACA,UAAM,IAAI,GAAG,IAAI,CAAC,QAAL,CAAc,eAAe,CAAC,IAA9B,CAAb;AACA,IAAA,QAAQ,CAAC,IAAD,CAAR,GAAiB,MAAA,CAAA,MAAA,CAAA,EAAA,EACZ,eADY,EACG;AAClB,MAAA,IAAI,EAAE,IADY;AAElB;AACA,MAAA;AAHkB,KADH,CAAjB;AAMD;;AACD,SAAO;AAAC,IAAA;AAAD,GAAP;AACD;;AAEK,SAAU,wCAAV,CAAmD,cAAnD,EAAiF;AACrF;;;;;;;;;;;;;;AAqBA,EAAA,cAAc,CAAC,QAAf,GAA0B,CAA1B,CAtBqF,CAuBrF;;AACA,EAAA,cAAc,CAAC,KAAf,GAAuB,KAAvB,CAxBqF,CAyBrF;;AACA,EAAA,cAAc,CAAC,WAAf,GAA6B,QAA7B;AACA,SAAO,cAAP;AACD;;SAEqB,c;;;;;kDAAf,WAA8B,IAA9B,EAA0C;AAC/C,uBAAI,IAAJ,CAAS;AAAC,MAAA,IAAI,EAAE,mBAAI,QAAJ,CAAa,IAAb;AAAP,KAAT,EAAqC,6BAArC;;AACA,iBAAa,2CAA4C,CAAC,UAAD,EAAa,SAAb,EAAwB,IAAxB,EAA8B,eAA9B,EAA+C,SAA/C,CAA5C,CAAb;AACD,G;;;;SAEqB,c;;;;;;kDAAf,WAA8B,IAA9B,EAA4C,MAA5C,EAA4D,QAA5D,EAA6F,gBAA7F,EAA4H;AACjI,UAAM,YAAY,GAAG,GAAG,IAAI,GAAG,qBAAqB,EAApD;;AACA,uBAAI,IAAJ,CAAS;AAAC,MAAA,YAAY,EAAE,mBAAI,QAAJ,CAAa,YAAb;AAAf,KAAT,EAAqD,oBAArD;;AACA,UAAM,UAAU,SAAS,2CAA4C,CAAC,UAAD,EAAa,SAAb,EAAwB,IAAxB,EAA8B,UAA9B,EAA0C,YAA1C,CAA5C,CAAzB;AACA,UAAM,QAAQ,CAAC,IAAT,CAAc,0BAAd,CAAyC;AAC7C,MAAA,IAAI,EAAE,YADuC;AAE7C,MAAA,gBAAgB,EAAE,gBAAgB,IAAI,IAApB,GAA2B,IAA3B,GAAkC,GAAG,gBAAgB,GAAG,qBAAqB,EAFlD;AAG7C,MAAA,MAH6C;AAI7C,MAAA,IAAI,EAAE,IAJuC;AAK7C,MAAA,QAL6C;AAM7C,MAAA;AAN6C,KAAzC,CAAN;AAQA,WAAO,UAAP;AACD,G","sourcesContent":["import { log } from \"builder-util\"\nimport { BlockMapDataHolder, PackageFileInfo } from \"builder-util-runtime\"\nimport * as path from \"path\"\nimport { Target } from \"../core\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { executeAppBuilderAsJson } from \"../util/appBuilder\"\nimport { ArchiveOptions } from \"./archive\"\n\nexport const BLOCK_MAP_FILE_SUFFIX = \".blockmap\"\n\nexport function createNsisWebDifferentialUpdateInfo(artifactPath: string, packageFiles: { [arch: string]: PackageFileInfo }) {\n  if (packageFiles == null) {\n    return null\n  }\n\n  const keys = Object.keys(packageFiles)\n  if (keys.length <= 0) {\n    return null\n  }\n\n  const packages: { [arch: string]: PackageFileInfo } = {}\n  for (const arch of keys) {\n    const packageFileInfo = packageFiles[arch]\n    const file = path.basename(packageFileInfo.path)\n    packages[arch] = {\n      ...packageFileInfo,\n      path: file,\n      // https://github.com/electron-userland/electron-builder/issues/2583\n      file,\n    } as any\n  }\n  return {packages}\n}\n\nexport function configureDifferentialAwareArchiveOptions(archiveOptions: ArchiveOptions): ArchiveOptions {\n  /*\n   * dict size 64 MB: Full: 33,744.88 KB, To download: 17,630.3 KB (52%)\n   * dict size 16 MB: Full: 33,936.84 KB, To download: 16,175.9 KB (48%)\n   * dict size  8 MB: Full: 34,187.59 KB, To download:  8,229.9 KB (24%)\n   * dict size  4 MB: Full: 34,628.73 KB, To download: 3,782.97 KB (11%)\n\n   as we can see, if file changed in one place, all block is invalidated (and update size approximately equals to dict size)\n\n   1 MB is used:\n\n   1MB:\n\n   2018/01/11 11:54:41:0045 File has 59 changed blocks\n   2018/01/11 11:54:41:0050 Full: 71,588.59 KB, To download: 1,243.39 KB (2%)\n\n   4MB:\n\n   2018/01/11 11:31:43:0440 Full: 70,303.55 KB, To download: 4,843.27 KB (7%)\n   2018/01/11 11:31:43:0435 File has 234 changed blocks\n\n   */\n  archiveOptions.dictSize = 1\n  // solid compression leads to a lot of changed blocks\n  archiveOptions.solid = false\n  // do not allow to change compression level to avoid different packages\n  archiveOptions.compression = \"normal\"\n  return archiveOptions\n}\n\nexport async function appendBlockmap(file: string): Promise<BlockMapDataHolder> {\n  log.info({file: log.filePath(file)}, \"building embedded block map\")\n  return await executeAppBuilderAsJson<BlockMapDataHolder>([\"blockmap\", \"--input\", file, \"--compression\", \"deflate\"])\n}\n\nexport async function createBlockmap(file: string, target: Target, packager: PlatformPackager<any>, safeArtifactName: string | null): Promise<BlockMapDataHolder> {\n  const blockMapFile = `${file}${BLOCK_MAP_FILE_SUFFIX}`\n  log.info({blockMapFile: log.filePath(blockMapFile)}, \"building block map\")\n  const updateInfo = await executeAppBuilderAsJson<BlockMapDataHolder>([\"blockmap\", \"--input\", file, \"--output\", blockMapFile])\n  await packager.info.callArtifactBuildCompleted({\n    file: blockMapFile,\n    safeArtifactName: safeArtifactName == null ? null : `${safeArtifactName}${BLOCK_MAP_FILE_SUFFIX}`,\n    target,\n    arch: null,\n    packager,\n    updateInfo,\n  })\n  return updateInfo\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _zipBin() {
  const data = require("7zip-bin");

  _zipBin = function () {
    return data;
  };

  return data;
}

function _appBuilderBin() {
  const data = require("app-builder-bin");

  _appBuilderBin = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _appInfo() {
  const data = require("../appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _appBuilder() {
  const data = require("../util/appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _bundledTool() {
  const data = require("../util/bundledTool");

  _bundledTool = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function errorMessages() {
  const data = _interopRequireWildcard(require("../errorMessages"));

  errorMessages = function () {
    return data;
  };

  return data;
}

function _macosVersion() {
  const data = require("../util/macosVersion");

  _macosVersion = function () {
    return data;
  };

  return data;
}

function _pathManager() {
  const data = require("../util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

function _LinuxTargetHelper() {
  const data = require("./LinuxTargetHelper");

  _LinuxTargetHelper = function () {
    return data;
  };

  return data;
}

function _tools() {
  const data = require("./tools");

  _tools = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class FpmTarget extends _core().Target {
  constructor(name, packager, helper, outDir) {
    super(name, false);
    this.packager = packager;
    this.helper = helper;
    this.outDir = outDir;
    this.options = Object.assign({}, this.packager.platformSpecificBuildOptions, this.packager.config[this.name]);
    this.scriptFiles = this.createScripts();
  }

  createScripts() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const defaultTemplatesDir = (0, _pathManager().getTemplatePath)("linux");
      const packager = _this.packager;
      const templateOptions = Object.assign({
        // old API compatibility
        executable: packager.executableName,
        productFilename: packager.appInfo.productFilename
      }, packager.platformSpecificBuildOptions);

      function getResource(value, defaultFile) {
        if (value == null) {
          return path.join(defaultTemplatesDir, defaultFile);
        }

        return path.resolve(packager.projectDir, value);
      }

      return yield Promise.all([writeConfigFile(packager.info.tempDirManager, getResource(_this.options.afterInstall, "after-install.tpl"), templateOptions), writeConfigFile(packager.info.tempDirManager, getResource(_this.options.afterRemove, "after-remove.tpl"), templateOptions)]);
    })();
  }

  checkOptions() {
    return this.computeFpmMetaInfoOptions();
  }

  computeFpmMetaInfoOptions() {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this2.packager;
      const projectUrl = yield packager.appInfo.computePackageUrl();
      const errors = [];

      if (projectUrl == null) {
        errors.push("Please specify project homepage, see https://electron.build/configuration/configuration#Metadata-homepage");
      }

      const options = _this2.options;
      let author = options.maintainer;

      if (author == null) {
        const a = packager.info.metadata.author;

        if (a == null || a.email == null) {
          errors.push(errorMessages().authorEmailIsMissed);
        } else {
          author = `${a.name} <${a.email}>`;
        }
      }

      if (errors.length > 0) {
        throw new Error(errors.join("\n\n"));
      }

      return {
        maintainer: author,
        url: projectUrl,
        vendor: options.vendor || author
      };
    })();
  }

  build(appOutDir, arch) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const fpmMetaInfoOptions = yield _this3.computeFpmMetaInfoOptions();
      const target = _this3.name; // tslint:disable:no-invalid-template-strings

      let nameFormat = "${name}-${version}-${arch}.${ext}";
      let isUseArchIfX64 = false;

      if (target === "deb") {
        nameFormat = "${name}_${version}_${arch}.${ext}";
        isUseArchIfX64 = true;
      } else if (target === "rpm") {
        nameFormat = "${name}-${version}.${arch}.${ext}";
        isUseArchIfX64 = true;
      }

      const packager = _this3.packager;
      const artifactPath = path.join(_this3.outDir, packager.expandArtifactNamePattern(_this3.options, target, arch, nameFormat, !isUseArchIfX64));
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: target,
        file: artifactPath,
        arch
      });
      yield (0, _fs().unlinkIfExists)(artifactPath);

      if (packager.packagerOptions.prepackaged != null) {
        yield (0, _fsExtraP().ensureDir)(_this3.outDir);
      }

      const scripts = yield _this3.scriptFiles;
      const appInfo = packager.appInfo;
      const options = _this3.options;
      const synopsis = options.synopsis;
      const args = ["-s", "dir", "-t", target, "--architecture", target === "pacman" && arch === _builderUtil().Arch.ia32 ? "i686" : (0, _builderUtil().toLinuxArchString)(arch), "--name", appInfo.linuxPackageName, "--force", "--after-install", scripts[0], "--after-remove", scripts[1], "--description", (0, _appInfo().smarten)(target === "rpm" ? _this3.helper.getDescription(options) : `${synopsis || ""}\n ${_this3.helper.getDescription(options)}`), "--version", appInfo.version, "--package", artifactPath];
      (0, _appBuilder().objectToArgs)(args, fpmMetaInfoOptions);

      if (_builderUtil().debug.enabled) {
        args.push("--log", "debug", "--debug");
      }

      const packageCategory = options.packageCategory;

      if (packageCategory != null) {
        args.push("--category", packageCategory);
      }

      const compression = options.compression;

      if (target === "deb") {
        args.push("--deb-compression", compression || "xz");
        (0, _builderUtil().use)(options.priority, it => args.push("--deb-priority", it));
      } else if (target === "rpm") {
        args.push("--rpm-compression", (compression === "xz" ? "xzmt" : compression) || "xzmt");
        args.push("--rpm-os", "linux");

        if (synopsis != null) {
          args.push("--rpm-summary", (0, _appInfo().smarten)(synopsis));
        }
      } // noinspection JSDeprecatedSymbols


      let depends = options.depends || packager.platformSpecificBuildOptions.depends;

      if (depends == null) {
        if (target === "deb") {
          depends = ["gconf2", "gconf-service", "libnotify4", "libappindicator1", "libxtst6", "libnss3", "libxss1"];
        } else if (target === "pacman") {
          // noinspection SpellCheckingInspection
          depends = ["c-ares", "ffmpeg", "gtk3", "http-parser", "libevent", "libvpx", "libxslt", "libxss", "minizip", "nss", "re2", "snappy", "libnotify", "libappindicator-gtk2", "libappindicator-gtk3", "libappindicator-sharp"];
        } else if (target === "rpm") {
          // noinspection SpellCheckingInspection
          depends = ["libnotify", "libappindicator", "libXScrnSaver"];
        } else {
          depends = [];
        }
      } else if (!Array.isArray(depends)) {
        // noinspection SuspiciousTypeOfGuard
        if (typeof depends === "string") {
          depends = [depends];
        } else {
          throw new Error(`depends must be Array or String, but specified as: ${depends}`);
        }
      }

      for (const dep of depends) {
        args.push("--depends", dep);
      }

      (0, _builderUtil().use)(packager.info.metadata.license, it => args.push("--license", it));
      (0, _builderUtil().use)(appInfo.buildNumber, it => args.push("--iteration", it));
      (0, _builderUtil().use)(options.fpm, it => args.push(...it));
      args.push(`${appOutDir}/=${_LinuxTargetHelper().installPrefix}/${appInfo.productFilename}`);

      for (const icon of yield _this3.helper.icons) {
        const extWithDot = path.extname(icon.file);
        const sizeName = extWithDot === ".svg" ? "scalable" : `${icon.size}x${icon.size}`;
        args.push(`${icon.file}=/usr/share/icons/hicolor/${sizeName}/apps/${packager.executableName}${extWithDot}`);
      }

      const desktopFilePath = yield _this3.helper.writeDesktopEntry(_this3.options);
      args.push(`${desktopFilePath}=/usr/share/applications/${packager.executableName}.desktop`);

      if (packager.packagerOptions.effectiveOptionComputed != null && (yield packager.packagerOptions.effectiveOptionComputed([args, desktopFilePath]))) {
        return;
      }

      const env = Object.assign({}, process.env, {
        FPM_COMPRESS_PROGRAM: _appBuilderBin().appBuilderPath,
        SZA_PATH: _zipBin().path7za,
        SZA_COMPRESSION_LEVEL: packager.compression === "store" ? "0" : "9",
        SZA_ARCHIVE_TYPE: "xz"
      }); // rpmbuild wants directory rpm with some default config files. Even if we can use dylibbundler, path to such config files are not changed (we need to replace in the binary)
      // so, for now, brew install rpm is still required.

      if (target !== "rpm" && (yield (0, _macosVersion().isMacOsSierra)())) {
        const linuxToolsPath = yield (0, _tools().getLinuxToolsPath)();
        Object.assign(env, {
          PATH: (0, _bundledTool().computeEnv)(process.env.PATH, [path.join(linuxToolsPath, "bin")]),
          DYLD_LIBRARY_PATH: (0, _bundledTool().computeEnv)(process.env.DYLD_LIBRARY_PATH, [path.join(linuxToolsPath, "lib")])
        });
      }

      yield (0, _builderUtil().exec)((yield _tools().fpmPath.value), args, {
        env
      });
      yield packager.dispatchArtifactCreated(artifactPath, _this3, arch);
    })();
  }

}

exports.default = FpmTarget;

function writeConfigFile(_x, _x2, _x3) {
  return _writeConfigFile.apply(this, arguments);
} function _writeConfigFile() {
  _writeConfigFile = (0, _bluebirdLst().coroutine)(function* (tmpDir, templatePath, options) {
    //noinspection JSUnusedLocalSymbols
    function replacer(match, p1) {
      if (p1 in options) {
        return options[p1];
      } else {
        throw new Error(`Macro ${p1} is not defined`);
      }
    }

    const config = (yield (0, _fsExtraP().readFile)(templatePath, "utf8")).replace(/\${([a-zA-Z]+)}/g, replacer).replace(/<%=([a-zA-Z]+)%>/g, (match, p1) => {
      _builderUtil().log.warn("<%= varName %> is deprecated, please use ${varName} instead");

      return replacer(match, p1.trim());
    });
    const outputPath = yield tmpDir.getTempFile({
      suffix: path.basename(templatePath, ".tpl")
    });
    yield (0, _fsExtraP().outputFile)(outputPath, config);
    return outputPath;
  });
  return _writeConfigFile.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=fpm.js.map{"version":3,"sources":["../../src/targets/fpm.ts"],"names":[],"mappings":"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","sourcesContent":["import { path7za } from \"7zip-bin\"\nimport { appBuilderPath } from \"app-builder-bin\"\nimport { Arch, debug, exec, log, TmpDir, toLinuxArchString, use } from \"builder-util\"\nimport { smarten } from \"../appInfo\"\nimport { objectToArgs } from \"../util/appBuilder\"\nimport { computeEnv } from \"../util/bundledTool\"\nimport { unlinkIfExists } from \"builder-util/out/fs\"\nimport { ensureDir, outputFile, readFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { DebOptions, LinuxTargetSpecificOptions } from \"..\"\nimport { Target } from \"../core\"\nimport * as errorMessages from \"../errorMessages\"\nimport { LinuxPackager } from \"../linuxPackager\"\nimport { isMacOsSierra } from \"../util/macosVersion\"\nimport { getTemplatePath } from \"../util/pathManager\"\nimport { installPrefix, LinuxTargetHelper } from \"./LinuxTargetHelper\"\nimport { fpmPath, getLinuxToolsPath } from \"./tools\"\n\ninterface FpmOptions {\n  maintainer: string | undefined\n  vendor: string\n  url: string\n}\n\nexport default class FpmTarget extends Target {\n  readonly options: LinuxTargetSpecificOptions = {...this.packager.platformSpecificBuildOptions, ...(this.packager.config as any)[this.name]}\n\n  private readonly scriptFiles: Promise<Array<string>>\n\n  constructor(name: string, private readonly packager: LinuxPackager, private readonly helper: LinuxTargetHelper, readonly outDir: string) {\n    super(name, false)\n\n    this.scriptFiles = this.createScripts()\n  }\n\n  private async createScripts(): Promise<Array<string>> {\n    const defaultTemplatesDir = getTemplatePath(\"linux\")\n\n    const packager = this.packager\n    const templateOptions = {\n      // old API compatibility\n      executable: packager.executableName,\n      productFilename: packager.appInfo.productFilename, ...packager.platformSpecificBuildOptions}\n\n    function getResource(value: string | null | undefined, defaultFile: string) {\n      if (value == null) {\n        return path.join(defaultTemplatesDir, defaultFile)\n      }\n      return path.resolve(packager.projectDir, value)\n    }\n\n    return await Promise.all<string>([\n      writeConfigFile(packager.info.tempDirManager, getResource(this.options.afterInstall, \"after-install.tpl\"), templateOptions),\n      writeConfigFile(packager.info.tempDirManager, getResource(this.options.afterRemove, \"after-remove.tpl\"), templateOptions)\n    ])\n  }\n\n  checkOptions(): Promise<any> {\n    return this.computeFpmMetaInfoOptions()\n  }\n\n  private async computeFpmMetaInfoOptions(): Promise<FpmOptions> {\n    const packager = this.packager\n    const projectUrl = await packager.appInfo.computePackageUrl()\n    const errors: Array<string> = []\n    if (projectUrl == null) {\n      errors.push(\"Please specify project homepage, see https://electron.build/configuration/configuration#Metadata-homepage\")\n    }\n\n    const options = this.options\n    let author = options.maintainer\n    if (author == null) {\n      const a = packager.info.metadata.author\n      if (a == null || a.email == null) {\n        errors.push(errorMessages.authorEmailIsMissed)\n      }\n      else {\n        author = `${a.name} <${a.email}>`\n      }\n    }\n\n    if (errors.length > 0) {\n      throw new Error(errors.join(\"\\n\\n\"))\n    }\n\n    return {\n      maintainer: author!!,\n      url: projectUrl!!,\n      vendor: options.vendor || author!!,\n    }\n  }\n\n  async build(appOutDir: string, arch: Arch): Promise<any> {\n    const fpmMetaInfoOptions = await this.computeFpmMetaInfoOptions()\n\n    const target = this.name\n\n    // tslint:disable:no-invalid-template-strings\n    let nameFormat = \"${name}-${version}-${arch}.${ext}\"\n    let isUseArchIfX64 = false\n    if (target === \"deb\") {\n      nameFormat = \"${name}_${version}_${arch}.${ext}\"\n      isUseArchIfX64 = true\n    }\n    else if (target === \"rpm\") {\n      nameFormat = \"${name}-${version}.${arch}.${ext}\"\n      isUseArchIfX64 = true\n    }\n\n    const packager = this.packager\n    const artifactPath = path.join(this.outDir, packager.expandArtifactNamePattern(this.options, target, arch, nameFormat, !isUseArchIfX64))\n\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: target,\n      file: artifactPath,\n      arch,\n    })\n\n    await unlinkIfExists(artifactPath)\n    if (packager.packagerOptions.prepackaged != null) {\n      await ensureDir(this.outDir)\n    }\n\n    const scripts = await this.scriptFiles\n    const appInfo = packager.appInfo\n    const options = this.options\n    const synopsis = options.synopsis\n    const args = [\n      \"-s\", \"dir\",\n      \"-t\", target,\n      \"--architecture\", (target === \"pacman\" && arch === Arch.ia32) ? \"i686\" : toLinuxArchString(arch),\n      \"--name\", appInfo.linuxPackageName,\n      \"--force\",\n      \"--after-install\", scripts[0],\n      \"--after-remove\", scripts[1],\n      \"--description\", smarten(target === \"rpm\" ? this.helper.getDescription(options)! : `${synopsis || \"\"}\\n ${this.helper.getDescription(options)}`),\n      \"--version\", appInfo.version,\n      \"--package\", artifactPath,\n    ]\n\n    objectToArgs(args, fpmMetaInfoOptions as any)\n\n    if (debug.enabled) {\n      args.push(\n        \"--log\", \"debug\",\n        \"--debug\")\n    }\n\n    const packageCategory = options.packageCategory\n    if (packageCategory != null) {\n      args.push(\"--category\", packageCategory)\n    }\n\n    const compression = options.compression\n    if (target === \"deb\") {\n      args.push(\"--deb-compression\", compression || \"xz\")\n      use((options as DebOptions).priority, it => args.push(\"--deb-priority\", it!))\n    }\n    else if (target === \"rpm\") {\n      args.push(\"--rpm-compression\", (compression === \"xz\" ? \"xzmt\" : compression) || \"xzmt\")\n      args.push(\"--rpm-os\", \"linux\")\n\n      if (synopsis != null) {\n        args.push(\"--rpm-summary\", smarten(synopsis))\n      }\n    }\n\n    // noinspection JSDeprecatedSymbols\n    let depends = options.depends || packager.platformSpecificBuildOptions.depends\n    if (depends == null) {\n      if (target === \"deb\") {\n        depends = [\"gconf2\", \"gconf-service\", \"libnotify4\", \"libappindicator1\", \"libxtst6\", \"libnss3\", \"libxss1\"]\n      }\n      else if (target === \"pacman\") {\n        // noinspection SpellCheckingInspection\n        depends = [\"c-ares\", \"ffmpeg\", \"gtk3\", \"http-parser\", \"libevent\", \"libvpx\", \"libxslt\", \"libxss\", \"minizip\", \"nss\", \"re2\", \"snappy\", \"libnotify\", \"libappindicator-gtk2\", \"libappindicator-gtk3\", \"libappindicator-sharp\"]\n      }\n      else if (target === \"rpm\") {\n        // noinspection SpellCheckingInspection\n        depends = [\"libnotify\", \"libappindicator\", \"libXScrnSaver\"]\n      }\n      else {\n        depends = []\n      }\n    }\n    else if (!Array.isArray(depends)) {\n      // noinspection SuspiciousTypeOfGuard\n      if (typeof depends === \"string\") {\n        depends = [depends as string]\n      }\n      else {\n        throw new Error(`depends must be Array or String, but specified as: ${depends}`)\n      }\n    }\n\n    for (const dep of depends) {\n      args.push(\"--depends\", dep)\n    }\n\n    use(packager.info.metadata.license, it => args.push(\"--license\", it!))\n    use(appInfo.buildNumber, it => args.push(\"--iteration\", it!))\n\n    use(options.fpm, it => args.push(...it as any))\n\n    args.push(`${appOutDir}/=${installPrefix}/${appInfo.productFilename}`)\n    for (const icon of (await this.helper.icons)) {\n      const extWithDot = path.extname(icon.file)\n      const sizeName = extWithDot === \".svg\" ? \"scalable\" : `${icon.size}x${icon.size}`\n      args.push(`${icon.file}=/usr/share/icons/hicolor/${sizeName}/apps/${packager.executableName}${extWithDot}`)\n    }\n\n    const desktopFilePath = await this.helper.writeDesktopEntry(this.options)\n    args.push(`${desktopFilePath}=/usr/share/applications/${packager.executableName}.desktop`)\n\n    if (packager.packagerOptions.effectiveOptionComputed != null && await packager.packagerOptions.effectiveOptionComputed([args, desktopFilePath])) {\n      return\n    }\n\n    const env = {\n      ...process.env,\n      FPM_COMPRESS_PROGRAM: appBuilderPath,\n      SZA_PATH: path7za,\n      SZA_COMPRESSION_LEVEL: packager.compression === \"store\" ? \"0\" : \"9\",\n      SZA_ARCHIVE_TYPE: \"xz\",\n    }\n\n    // rpmbuild wants directory rpm with some default config files. Even if we can use dylibbundler, path to such config files are not changed (we need to replace in the binary)\n    // so, for now, brew install rpm is still required.\n    if (target !== \"rpm\" && await isMacOsSierra()) {\n      const linuxToolsPath = await getLinuxToolsPath()\n      Object.assign(env, {\n        PATH: computeEnv(process.env.PATH, [path.join(linuxToolsPath, \"bin\")]),\n        DYLD_LIBRARY_PATH: computeEnv(process.env.DYLD_LIBRARY_PATH, [path.join(linuxToolsPath, \"lib\")]),\n      })\n    }\n    await exec(await fpmPath.value, args, {env})\n\n    await packager.dispatchArtifactCreated(artifactPath, this, arch)\n  }\n}\n\nasync function writeConfigFile(tmpDir: TmpDir, templatePath: string, options: any): Promise<string> {\n  //noinspection JSUnusedLocalSymbols\n  function replacer(match: string, p1: string) {\n    if (p1 in options) {\n      return options[p1]\n    }\n    else {\n      throw new Error(`Macro ${p1} is not defined`)\n    }\n  }\n  const config = (await readFile(templatePath, \"utf8\"))\n    .replace(/\\${([a-zA-Z]+)}/g, replacer)\n    .replace(/<%=([a-zA-Z]+)%>/g, (match, p1) => {\n      log.warn(\"<%= varName %> is deprecated, please use ${varName} instead\")\n      return replacer(match, p1.trim())\n    })\n\n  const outputPath = await tmpDir.getTempFile({suffix: path.basename(templatePath, \".tpl\")})\n  await outputFile(outputPath, config)\n  return outputPath\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.prepareProductBuildArgs = prepareProductBuildArgs;
exports.PkgTarget = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _license() {
  const data = require("../util/license");

  _license = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _plist() {
  const data = require("plist");

  _plist = function () {
    return data;
  };

  return data;
}

function _appInfo() {
  const data = require("../appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _macCodeSign() {
  const data = require("../codeSign/macCodeSign");

  _macCodeSign = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const certType = "Developer ID Installer"; // http://www.shanekirk.com/2013/10/creating-flat-packages-in-osx/
// to use --scripts, we must build .app bundle separately using pkgbuild
// productbuild --scripts doesn't work (because scripts in this case not added to our package)
// https://github.com/electron-userland/electron-osx-sign/issues/96#issuecomment-274986942

class PkgTarget extends _core().Target {
  constructor(packager, outDir) {
    super("pkg");
    this.packager = packager;
    this.outDir = outDir;
    this.options = Object.assign({
      allowAnywhere: true,
      allowCurrentUserHome: true,
      allowRootDirectory: true
    }, this.packager.config.pkg);
  }

  build(appPath, arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;
      const options = _this.options;
      const appInfo = packager.appInfo; // pkg doesn't like not ASCII symbols (Could not open package to list files: /Volumes/test/t-gIjdGK/test-project-0/dist/Test App ÃŸW-1.1.0.pkg)

      const artifactName = packager.expandArtifactNamePattern(options, "pkg");
      const artifactPath = path.join(_this.outDir, artifactName);
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: "pkg",
        file: artifactPath,
        arch
      });
      const keychainName = (yield packager.codeSigningInfo.value).keychainName;
      const appOutDir = _this.outDir; // https://developer.apple.com/library/content/documentation/DeveloperTools/Reference/DistributionDefinitionRef/Chapters/Distribution_XML_Ref.html

      const distInfoFile = path.join(appOutDir, "distribution.xml");
      const innerPackageFile = path.join(appOutDir, `${(0, _appInfo().filterCFBundleIdentifier)(appInfo.id)}.pkg`);
      const componentPropertyListFile = path.join(appOutDir, `${(0, _appInfo().filterCFBundleIdentifier)(appInfo.id)}.plist`);
      const identity = (yield Promise.all([(0, _macCodeSign().findIdentity)(certType, options.identity || packager.platformSpecificBuildOptions.identity, keychainName), _this.customizeDistributionConfiguration(distInfoFile, appPath), _this.buildComponentPackage(appPath, componentPropertyListFile, innerPackageFile)]))[0];

      if (identity == null && packager.forceCodeSigning) {
        throw new Error(`Cannot find valid "${certType}" to sign standalone installer, please see https://electron.build/code-signing`);
      }

      const args = prepareProductBuildArgs(identity, keychainName);
      args.push("--distribution", distInfoFile);
      args.push(artifactPath);
      (0, _builderUtil().use)(options.productbuild, it => args.push(...it));
      yield (0, _builderUtil().exec)("productbuild", args, {
        cwd: appOutDir
      });
      yield Promise.all([(0, _fsExtraP().unlink)(innerPackageFile), (0, _fsExtraP().unlink)(distInfoFile)]);
      yield packager.dispatchArtifactCreated(artifactPath, _this, arch, packager.computeSafeArtifactName(artifactName, "pkg", arch));
    })();
  }

  customizeDistributionConfiguration(distInfoFile, appPath) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield (0, _builderUtil().exec)("productbuild", ["--synthesize", "--component", appPath, distInfoFile], {
        cwd: _this2.outDir
      });
      const options = _this2.options;
      let distInfo = yield (0, _fsExtraP().readFile)(distInfoFile, "utf-8");
      const insertIndex = distInfo.lastIndexOf("</installer-gui-script>");
      distInfo = distInfo.substring(0, insertIndex) + `    <domains enable_anywhere="${options.allowAnywhere}" enable_currentUserHome="${options.allowCurrentUserHome}" enable_localSystem="${options.allowRootDirectory}" />\n` + distInfo.substring(insertIndex);

      if (options.background != null) {
        const background = yield _this2.packager.getResource(options.background.file);

        if (background != null) {
          const alignment = options.background.alignment || "center"; // noinspection SpellCheckingInspection

          const scaling = options.background.scaling || "tofit";
          distInfo = distInfo.substring(0, insertIndex) + `    <background file="${background}" alignment="${alignment}" scaling="${scaling}"/>\n` + distInfo.substring(insertIndex);
        }
      }

      const welcome = yield _this2.packager.getResource(options.welcome);

      if (welcome != null) {
        distInfo = distInfo.substring(0, insertIndex) + `    <welcome file="${welcome}"/>\n` + distInfo.substring(insertIndex);
      }

      const license = yield (0, _license().getNotLocalizedLicenseFile)(options.license, _this2.packager);

      if (license != null) {
        distInfo = distInfo.substring(0, insertIndex) + `    <license file="${license}"/>\n` + distInfo.substring(insertIndex);
      }

      const conclusion = yield _this2.packager.getResource(options.conclusion);

      if (conclusion != null) {
        distInfo = distInfo.substring(0, insertIndex) + `    <conclusion file="${conclusion}"/>\n` + distInfo.substring(insertIndex);
      }

      (0, _builderUtil().debug)(distInfo);
      yield (0, _fsExtraP().writeFile)(distInfoFile, distInfo);
    })();
  }

  buildComponentPackage(appPath, propertyListOutputFile, packageOutputFile) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const options = _this3.options;
      const rootPath = path.dirname(appPath); // first produce a component plist template

      yield (0, _builderUtil().exec)("pkgbuild", ["--analyze", "--root", rootPath, propertyListOutputFile]); // process the template plist

      const plistInfo = (0, _plist().parse)((yield (0, _fsExtraP().readFile)(propertyListOutputFile, "utf8")));

      if (plistInfo.length > 0) {
        const packageInfo = plistInfo[0]; // ChildBundles lists all of electron binaries within the .app.
        // There is no particular reason for removing that key, except to be as close as possible to
        // the PackageInfo generated by previous versions of electron-builder.

        delete packageInfo.ChildBundles;

        if (options.isRelocatable != null) {
          packageInfo.BundleIsRelocatable = options.isRelocatable;
        }

        if (options.isVersionChecked != null) {
          packageInfo.BundleIsVersionChecked = options.isVersionChecked;
        }

        if (options.hasStrictIdentifier != null) {
          packageInfo.BundleHasStrictIdentifier = options.hasStrictIdentifier;
        }

        if (options.overwriteAction != null) {
          packageInfo.BundleOverwriteAction = options.overwriteAction;
        }

        yield (0, _fsExtraP().writeFile)(propertyListOutputFile, (0, _plist().build)(plistInfo));
      } // now build the package


      const args = ["--root", rootPath, "--component-plist", propertyListOutputFile];
      (0, _builderUtil().use)(_this3.options.installLocation || "/Applications", it => args.push("--install-location", it));

      if (options.scripts != null) {
        args.push("--scripts", path.resolve(_this3.packager.info.buildResourcesDir, options.scripts));
      } else if (options.scripts !== null) {
        const dir = path.join(_this3.packager.info.buildResourcesDir, "pkg-scripts");
        const stat = yield (0, _fs().statOrNull)(dir);

        if (stat != null && stat.isDirectory()) {
          args.push("--scripts", dir);
        }
      }

      args.push(packageOutputFile);
      yield (0, _builderUtil().exec)("pkgbuild", args);
    })();
  }

}

exports.PkgTarget = PkgTarget;

function prepareProductBuildArgs(identity, keychain) {
  const args = [];

  if (identity != null) {
    args.push("--sign", identity.hash);

    if (keychain != null) {
      args.push("--keychain", keychain);
    }
  }

  return args;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=pkg.js.map{"version":3,"sources":["../../src/targets/pkg.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, debug, exec, use } from \"builder-util\"\nimport { statOrNull } from \"builder-util/out/fs\"\nimport { getNotLocalizedLicenseFile } from \"../util/license\"\nimport { readFile, unlink, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { build as buildPlist, parse as parsePlist } from \"plist\"\nimport { PkgOptions } from \"..\"\nimport { filterCFBundleIdentifier } from \"../appInfo\"\nimport { findIdentity, Identity } from \"../codeSign/macCodeSign\"\nimport { Target } from \"../core\"\nimport MacPackager from \"../macPackager\"\n\nconst certType = \"Developer ID Installer\"\n\n// http://www.shanekirk.com/2013/10/creating-flat-packages-in-osx/\n// to use --scripts, we must build .app bundle separately using pkgbuild\n// productbuild --scripts doesn't work (because scripts in this case not added to our package)\n// https://github.com/electron-userland/electron-osx-sign/issues/96#issuecomment-274986942\nexport class PkgTarget extends Target {\n  readonly options: PkgOptions = {\n    allowAnywhere: true,\n    allowCurrentUserHome: true,\n    allowRootDirectory: true,\n    ...this.packager.config.pkg,\n  }\n\n  constructor(private readonly packager: MacPackager, readonly outDir: string) {\n    super(\"pkg\")\n  }\n\n  async build(appPath: string, arch: Arch): Promise<any> {\n    const packager = this.packager\n    const options = this.options\n    const appInfo = packager.appInfo\n\n    // pkg doesn't like not ASCII symbols (Could not open package to list files: /Volumes/test/t-gIjdGK/test-project-0/dist/Test App ÃŸW-1.1.0.pkg)\n    const artifactName = packager.expandArtifactNamePattern(options, \"pkg\")\n    const artifactPath = path.join(this.outDir, artifactName)\n\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: \"pkg\",\n      file: artifactPath,\n      arch,\n    })\n\n    const keychainName = (await packager.codeSigningInfo.value).keychainName\n\n    const appOutDir = this.outDir\n    // https://developer.apple.com/library/content/documentation/DeveloperTools/Reference/DistributionDefinitionRef/Chapters/Distribution_XML_Ref.html\n    const distInfoFile = path.join(appOutDir, \"distribution.xml\")\n\n    const innerPackageFile = path.join(appOutDir, `${filterCFBundleIdentifier(appInfo.id)}.pkg`)\n    const componentPropertyListFile = path.join(appOutDir, `${filterCFBundleIdentifier(appInfo.id)}.plist`)\n    const identity = (await Promise.all([\n      findIdentity(certType, options.identity || packager.platformSpecificBuildOptions.identity, keychainName),\n      this.customizeDistributionConfiguration(distInfoFile, appPath),\n      this.buildComponentPackage(appPath, componentPropertyListFile, innerPackageFile),\n    ]))[0]\n\n    if (identity == null && packager.forceCodeSigning) {\n      throw new Error(`Cannot find valid \"${certType}\" to sign standalone installer, please see https://electron.build/code-signing`)\n    }\n\n    const args = prepareProductBuildArgs(identity, keychainName)\n    args.push(\"--distribution\", distInfoFile)\n    args.push(artifactPath)\n    use(options.productbuild, it => args.push(...it as any))\n    await exec(\"productbuild\", args, {\n      cwd: appOutDir,\n    })\n    await Promise.all([unlink(innerPackageFile), unlink(distInfoFile)])\n\n    await packager.dispatchArtifactCreated(artifactPath, this, arch, packager.computeSafeArtifactName(artifactName, \"pkg\", arch))\n  }\n\n  private async customizeDistributionConfiguration(distInfoFile: string, appPath: string) {\n    await exec(\"productbuild\", [\"--synthesize\", \"--component\", appPath, distInfoFile], {\n      cwd: this.outDir,\n    })\n\n    const options = this.options\n    let distInfo = await readFile(distInfoFile, \"utf-8\")\n    const insertIndex = distInfo.lastIndexOf(\"</installer-gui-script>\")\n    distInfo = distInfo.substring(0, insertIndex) + `    <domains enable_anywhere=\"${options.allowAnywhere}\" enable_currentUserHome=\"${options.allowCurrentUserHome}\" enable_localSystem=\"${options.allowRootDirectory}\" />\\n` + distInfo.substring(insertIndex)\n\n    if (options.background != null) {\n      const background = await this.packager.getResource(options.background.file)\n      if (background != null) {\n        const alignment = options.background.alignment || \"center\"\n        // noinspection SpellCheckingInspection\n        const scaling = options.background.scaling || \"tofit\"\n        distInfo = distInfo.substring(0, insertIndex) + `    <background file=\"${background}\" alignment=\"${alignment}\" scaling=\"${scaling}\"/>\\n` + distInfo.substring(insertIndex)\n      }\n    }\n\n    const welcome = await this.packager.getResource(options.welcome)\n    if (welcome != null) {\n      distInfo = distInfo.substring(0, insertIndex) + `    <welcome file=\"${welcome}\"/>\\n` + distInfo.substring(insertIndex)\n    }\n\n    const license = await getNotLocalizedLicenseFile(options.license, this.packager)\n    if (license != null) {\n      distInfo = distInfo.substring(0, insertIndex) + `    <license file=\"${license}\"/>\\n` + distInfo.substring(insertIndex)\n    }\n\n    const conclusion = await this.packager.getResource(options.conclusion)\n    if (conclusion != null) {\n      distInfo = distInfo.substring(0, insertIndex) + `    <conclusion file=\"${conclusion}\"/>\\n` + distInfo.substring(insertIndex)\n    }\n\n    debug(distInfo)\n    await writeFile(distInfoFile, distInfo)\n  }\n\n  private async buildComponentPackage(appPath: string, propertyListOutputFile: string, packageOutputFile: string) {\n    const options = this.options\n    const rootPath = path.dirname(appPath)\n\n    // first produce a component plist template\n    await exec(\"pkgbuild\", [\n      \"--analyze\",\n      \"--root\", rootPath,\n      propertyListOutputFile,\n    ])\n\n    // process the template plist\n    const plistInfo = parsePlist(await readFile(propertyListOutputFile, \"utf8\"))\n    if (plistInfo.length > 0) {\n      const packageInfo = plistInfo[0]\n\n      // ChildBundles lists all of electron binaries within the .app.\n      // There is no particular reason for removing that key, except to be as close as possible to\n      // the PackageInfo generated by previous versions of electron-builder.\n      delete packageInfo.ChildBundles\n\n      if (options.isRelocatable != null) {\n        packageInfo.BundleIsRelocatable = options.isRelocatable\n      }\n\n      if (options.isVersionChecked != null) {\n        packageInfo.BundleIsVersionChecked = options.isVersionChecked\n      }\n\n      if (options.hasStrictIdentifier != null) {\n        packageInfo.BundleHasStrictIdentifier = options.hasStrictIdentifier\n      }\n\n      if (options.overwriteAction != null) {\n        packageInfo.BundleOverwriteAction = options.overwriteAction\n      }\n\n      await writeFile(propertyListOutputFile, buildPlist(plistInfo))\n    }\n\n    // now build the package\n    const args = [\n      \"--root\", rootPath,\n      \"--component-plist\", propertyListOutputFile,\n    ]\n\n    use(this.options.installLocation || \"/Applications\", it => args.push(\"--install-location\", it!))\n    if (options.scripts != null) {\n      args.push(\"--scripts\", path.resolve(this.packager.info.buildResourcesDir, options.scripts))\n    }\n    else if (options.scripts !== null) {\n      const dir = path.join(this.packager.info.buildResourcesDir, \"pkg-scripts\")\n      const stat = await statOrNull(dir)\n      if (stat != null && stat.isDirectory()) {\n        args.push(\"--scripts\", dir)\n      }\n    }\n\n    args.push(packageOutputFile)\n\n    await exec(\"pkgbuild\", args)\n  }\n}\n\nexport function prepareProductBuildArgs(identity: Identity | null, keychain: string | null | undefined): Array<string> {\n  const args: Array<string> = []\n  if (identity != null) {\n    args.push(\"--sign\", identity.hash)\n    if (keychain != null) {\n      args.push(\"--keychain\", keychain)\n    }\n  }\n  return args\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _jsYaml() {
  const data = require("js-yaml");

  _jsYaml = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function semver() {
  const data = _interopRequireWildcard(require("semver"));

  semver = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _linuxPackager() {
  const data = require("../linuxPackager");

  _linuxPackager = function () {
    return data;
  };

  return data;
}

function _pathManager() {
  const data = require("../util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

function _targetUtil() {
  const data = require("./targetUtil");

  _targetUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const defaultPlugs = ["desktop", "desktop-legacy", "home", "x11", "unity7", "browser-support", "network", "gsettings", "pulseaudio", "opengl"];

class SnapTarget extends _core().Target {
  constructor(name, packager, helper, outDir) {
    super(name);
    this.packager = packager;
    this.helper = helper;
    this.outDir = outDir;
    this.options = Object.assign({}, this.packager.platformSpecificBuildOptions, this.packager.config[this.name]);
    this.isUseTemplateApp = false;
  }

  replaceDefault(inList, defaultList) {
    const result = (0, _builderUtil().replaceDefault)(inList, defaultList);

    if (result !== defaultList) {
      this.isUseTemplateApp = false;
    }

    return result;
  }

  static getDefaultStagePackages() {
    // libxss1 - was "error while loading shared libraries: libXss.so.1" on Xubuntu 16.04
    // noinspection SpellCheckingInspection
    return ["libnspr4", "libnss3", "libxss1", "libappindicator3-1", "libsecret-1-0"];
  }

  createDescriptor(arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (!_this.isElectronVersionGreaterOrEqualThen("4.0.0")) {
        if (!_this.isElectronVersionGreaterOrEqualThen("2.0.0-beta.1")) {
          throw new (_builderUtil().InvalidConfigurationError)("Electron 2 and higher is required to build Snap");
        }

        _builderUtil().log.warn("Electron 4 and higher is highly recommended for Snap");
      }

      const appInfo = _this.packager.appInfo;

      const snapName = _this.packager.executableName.toLowerCase();

      const options = _this.options;
      const linuxArchName = (0, _linuxPackager().toAppImageOrSnapArch)(arch);
      const plugs = normalizePlugConfiguration(_this.options.plugs);

      const plugNames = _this.replaceDefault(plugs == null ? null : Object.getOwnPropertyNames(plugs), defaultPlugs);

      const buildPackages = (0, _builderUtilRuntime().asArray)(options.buildPackages);
      _this.isUseTemplateApp = _this.options.useTemplateApp !== false && arch === _builderUtil().Arch.x64 && buildPackages.length === 0;
      const appDescriptor = {
        command: "command.sh",
        plugs: plugNames,
        adapter: "none"
      };
      const snap = (0, _jsYaml().safeLoad)((yield (0, _fsExtraP().readFile)(path.join((0, _pathManager().getTemplatePath)("snap"), "snapcraft.yaml"), "utf-8")));

      if (_this.isUseTemplateApp) {
        delete appDescriptor.adapter;
      }

      if (options.grade != null) {
        snap.grade = options.grade;
      }

      if (options.confinement != null) {
        snap.confinement = options.confinement;
      }

      (0, _builderUtil().deepAssign)(snap, {
        name: snapName,
        version: appInfo.version,
        summary: options.summary || appInfo.productName,
        description: _this.helper.getDescription(options),
        architectures: [(0, _builderUtil().toLinuxArchString)(arch, true)],
        apps: {
          [snapName]: appDescriptor
        },
        parts: {
          app: {
            "stage-packages": _this.replaceDefault(options.stagePackages, SnapTarget.getDefaultStagePackages())
          }
        }
      });

      if (options.confinement === "classic") {
        delete appDescriptor.plugs;
        delete snap.plugs;
      } else {
        appDescriptor.environment = Object.assign({
          TMPDIR: "$XDG_RUNTIME_DIR",
          PATH: "$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH",
          SNAP_DESKTOP_RUNTIME: "$SNAP/gnome-platform",
          LD_LIBRARY_PATH: ["$SNAP_LIBRARY_PATH", "$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/" + linuxArchName + "-linux-gnu:$SNAP/usr/lib/" + linuxArchName + "-linux-gnu", "$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib", "$SNAP/lib/" + linuxArchName + "-linux-gnu:$SNAP/usr/lib/" + linuxArchName + "-linux-gnu"].join(":")
        }, options.environment);

        if (plugs != null) {
          for (const plugName of plugNames) {
            const plugOptions = plugs[plugName];

            if (plugOptions == null) {
              continue;
            }

            snap.plugs[plugName] = plugOptions;
          }
        }
      }

      if (buildPackages.length > 0) {
        snap.parts.app["build-packages"] = buildPackages;
      }

      if (options.after != null) {
        snap.parts.app.after = options.after;
      }

      if (options.assumes != null) {
        snap.assumes = (0, _builderUtilRuntime().asArray)(options.assumes);
      }

      return snap;
    })();
  }

  build(appOutDir, arch) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this2.packager;
      const options = _this2.options; // tslint:disable-next-line:no-invalid-template-strings

      const artifactName = packager.expandArtifactNamePattern(_this2.options, "snap", arch, "${name}_${version}_${arch}.${ext}", false);
      const artifactPath = path.join(_this2.outDir, artifactName);
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: "snap",
        file: artifactPath,
        arch
      });
      const snap = yield _this2.createDescriptor(arch);

      if (_this2.isUseTemplateApp) {
        delete snap.parts;
      }

      const stageDir = yield (0, _targetUtil().createStageDirPath)(_this2, packager, arch);
      const args = ["snap", "--app", appOutDir, "--stage", stageDir, "--arch", (0, _builderUtil().toLinuxArchString)(arch, true), "--output", artifactPath, "--executable", _this2.packager.executableName];
      yield _this2.helper.icons;

      if (_this2.helper.maxIconPath != null) {
        if (!_this2.isUseTemplateApp) {
          snap.icon = "snap/gui/icon.png";
        }

        args.push("--icon", _this2.helper.maxIconPath);
      } // snapcraft.yaml inside a snap directory


      const snapMetaDir = path.join(stageDir, _this2.isUseTemplateApp ? "meta" : "snap");
      const desktopFile = path.join(snapMetaDir, "gui", `${snap.name}.desktop`);
      yield _this2.helper.writeDesktopEntry(_this2.options, packager.executableName, desktopFile, {
        // tslint:disable:no-invalid-template-strings
        Icon: "${SNAP}/meta/gui/icon.png"
      });

      if (_this2.isElectronVersionGreaterOrEqualThen("5.0.0") && !isBrowserSandboxAllowed(snap)) {
        args.push("--extraAppArgs=--no-sandbox");

        if (_this2.isUseTemplateApp) {
          args.push("--exclude", "chrome-sandbox");
        }
      }

      if (packager.packagerOptions.effectiveOptionComputed != null && (yield packager.packagerOptions.effectiveOptionComputed({
        snap,
        desktopFile,
        args
      }))) {
        return;
      }

      yield (0, _fsExtraP().outputFile)(path.join(snapMetaDir, _this2.isUseTemplateApp ? "snap.yaml" : "snapcraft.yaml"), (0, _builderUtil().serializeToYaml)(snap));
      const hooksDir = yield packager.getResource(options.hooks, "snap-hooks");

      if (hooksDir != null) {
        args.push("--hooks", hooksDir);
      }

      if (_this2.isUseTemplateApp) {
        args.push("--template-url", "electron4");
      }

      yield (0, _builderUtil().executeAppBuilder)(args);
      yield packager.dispatchArtifactCreated(artifactPath, _this2, arch, packager.computeSafeArtifactName(artifactName, "snap", arch, false));
    })();
  }

  isElectronVersionGreaterOrEqualThen(version) {
    return semver().gte(this.packager.config.electronVersion || "5.0.3", version);
  }

}

exports.default = SnapTarget;

function normalizePlugConfiguration(raw) {
  if (raw == null) {
    return null;
  }

  const result = {};

  for (const item of Array.isArray(raw) ? raw : [raw]) {
    if (typeof item === "string") {
      result[item] = null;
    } else {
      Object.assign(result, item);
    }
  }

  return result;
}

function isBrowserSandboxAllowed(snap) {
  if (snap.plugs != null) {
    for (const plugName of Object.keys(snap.plugs)) {
      const plug = snap.plugs[plugName];

      if (plug.interface === "browser-support" && plug["allow-sandbox"] === true) {
        return true;
      }
    }
  }

  return false;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=snap.js.map{"version":3,"sources":["../../src/targets/snap.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, deepAssign, executeAppBuilder, replaceDefault as _replaceDefault, serializeToYaml, toLinuxArchString, InvalidConfigurationError, log } from \"builder-util\"\nimport { asArray } from \"builder-util-runtime\"\nimport { outputFile, readFile } from \"fs-extra-p\"\nimport { safeLoad } from \"js-yaml\"\nimport * as path from \"path\"\nimport * as semver from \"semver\"\nimport { SnapOptions } from \"..\"\nimport { Target } from \"../core\"\nimport { LinuxPackager, toAppImageOrSnapArch } from \"../linuxPackager\"\nimport { PlugDescriptor } from \"../options/SnapOptions\"\nimport { getTemplatePath } from \"../util/pathManager\"\nimport { LinuxTargetHelper } from \"./LinuxTargetHelper\"\nimport { createStageDirPath } from \"./targetUtil\"\n\nconst defaultPlugs = [\"desktop\", \"desktop-legacy\", \"home\", \"x11\", \"unity7\", \"browser-support\", \"network\", \"gsettings\", \"pulseaudio\", \"opengl\"]\n\nexport default class SnapTarget extends Target {\n  readonly options: SnapOptions = {...this.packager.platformSpecificBuildOptions, ...(this.packager.config as any)[this.name]}\n\n  public isUseTemplateApp = false\n\n  constructor(name: string, private readonly packager: LinuxPackager, private readonly helper: LinuxTargetHelper, readonly outDir: string) {\n    super(name)\n  }\n\n  private replaceDefault(inList: Array<string> | null | undefined, defaultList: Array<string>) {\n    const result = _replaceDefault(inList, defaultList)\n    if (result !== defaultList) {\n      this.isUseTemplateApp = false\n    }\n    return result\n  }\n\n  private static getDefaultStagePackages() {\n    // libxss1 - was \"error while loading shared libraries: libXss.so.1\" on Xubuntu 16.04\n    // noinspection SpellCheckingInspection\n    return [\"libnspr4\", \"libnss3\", \"libxss1\", \"libappindicator3-1\", \"libsecret-1-0\"]\n  }\n\n  private async createDescriptor(arch: Arch): Promise<any> {\n    if (!this.isElectronVersionGreaterOrEqualThen(\"4.0.0\")) {\n      if (!this.isElectronVersionGreaterOrEqualThen(\"2.0.0-beta.1\")) {\n        throw new InvalidConfigurationError(\"Electron 2 and higher is required to build Snap\")\n      }\n\n      log.warn(\"Electron 4 and higher is highly recommended for Snap\")\n    }\n\n    const appInfo = this.packager.appInfo\n    const snapName = this.packager.executableName.toLowerCase()\n    const options = this.options\n    const linuxArchName = toAppImageOrSnapArch(arch)\n\n    const plugs = normalizePlugConfiguration(this.options.plugs)\n\n    const plugNames = this.replaceDefault(plugs == null ? null : Object.getOwnPropertyNames(plugs), defaultPlugs)\n    const buildPackages = asArray(options.buildPackages)\n    this.isUseTemplateApp = this.options.useTemplateApp !== false && arch === Arch.x64 && buildPackages.length === 0\n\n    const appDescriptor: any = {\n      command: \"command.sh\",\n      plugs: plugNames,\n      adapter: \"none\",\n    }\n\n    const snap: any = safeLoad(await readFile(path.join(getTemplatePath(\"snap\"), \"snapcraft.yaml\"), \"utf-8\"))\n    if (this.isUseTemplateApp) {\n      delete appDescriptor.adapter\n    }\n    if (options.grade != null) {\n      snap.grade = options.grade\n    }\n    if (options.confinement != null) {\n      snap.confinement = options.confinement\n    }\n    deepAssign(snap, {\n      name: snapName,\n      version: appInfo.version,\n      summary: options.summary || appInfo.productName,\n      description: this.helper.getDescription(options),\n      architectures: [toLinuxArchString(arch, true)],\n      apps: {\n        [snapName]: appDescriptor\n      },\n      parts: {\n        app: {\n          \"stage-packages\": this.replaceDefault(options.stagePackages, SnapTarget.getDefaultStagePackages()),\n        }\n      },\n    })\n\n    if (options.confinement === \"classic\") {\n      delete appDescriptor.plugs\n      delete snap.plugs\n    }\n    else {\n      appDescriptor.environment = {\n        TMPDIR: \"$XDG_RUNTIME_DIR\",\n        PATH: \"$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH\",\n        SNAP_DESKTOP_RUNTIME: \"$SNAP/gnome-platform\",\n        LD_LIBRARY_PATH: [\n          \"$SNAP_LIBRARY_PATH\",\n          \"$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/\" + linuxArchName + \"-linux-gnu:$SNAP/usr/lib/\" + linuxArchName + \"-linux-gnu\",\n          \"$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib\",\n          \"$SNAP/lib/\" + linuxArchName + \"-linux-gnu:$SNAP/usr/lib/\" + linuxArchName + \"-linux-gnu\"\n        ].join(\":\"),\n        ...options.environment,\n      }\n\n      if (plugs != null) {\n        for (const plugName of plugNames) {\n          const plugOptions = plugs[plugName]\n          if (plugOptions == null) {\n            continue\n          }\n\n          snap.plugs[plugName] = plugOptions\n        }\n      }\n    }\n\n    if (buildPackages.length > 0) {\n      snap.parts.app[\"build-packages\"] = buildPackages\n    }\n    if (options.after != null) {\n      snap.parts.app.after = options.after\n    }\n\n    if (options.assumes != null) {\n      snap.assumes = asArray(options.assumes)\n    }\n\n    return snap\n  }\n\n  async build(appOutDir: string, arch: Arch): Promise<any> {\n    const packager = this.packager\n    const options = this.options\n    // tslint:disable-next-line:no-invalid-template-strings\n    const artifactName = packager.expandArtifactNamePattern(this.options, \"snap\", arch, \"${name}_${version}_${arch}.${ext}\", false)\n    const artifactPath = path.join(this.outDir, artifactName)\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: \"snap\",\n      file: artifactPath,\n      arch,\n    })\n\n    const snap = await this.createDescriptor(arch)\n    if (this.isUseTemplateApp) {\n      delete snap.parts\n    }\n\n    const stageDir = await createStageDirPath(this, packager, arch)\n    const args = [\n      \"snap\",\n      \"--app\", appOutDir,\n      \"--stage\", stageDir,\n      \"--arch\", toLinuxArchString(arch, true),\n      \"--output\", artifactPath,\n      \"--executable\", this.packager.executableName,\n    ]\n\n    await this.helper.icons\n    if (this.helper.maxIconPath != null) {\n      if (!this.isUseTemplateApp) {\n        snap.icon = \"snap/gui/icon.png\"\n      }\n      args.push(\"--icon\", this.helper.maxIconPath)\n    }\n\n    // snapcraft.yaml inside a snap directory\n    const snapMetaDir = path.join(stageDir, this.isUseTemplateApp ? \"meta\" : \"snap\")\n    const desktopFile = path.join(snapMetaDir, \"gui\", `${snap.name}.desktop`)\n    await this.helper.writeDesktopEntry(this.options, packager.executableName, desktopFile, {\n      // tslint:disable:no-invalid-template-strings\n      Icon: \"${SNAP}/meta/gui/icon.png\"\n    })\n\n    if (this.isElectronVersionGreaterOrEqualThen(\"5.0.0\") && !isBrowserSandboxAllowed(snap)) {\n      args.push(\"--extraAppArgs=--no-sandbox\")\n      if (this.isUseTemplateApp) {\n        args.push(\"--exclude\", \"chrome-sandbox\")\n      }\n    }\n\n    if (packager.packagerOptions.effectiveOptionComputed != null && await packager.packagerOptions.effectiveOptionComputed({snap, desktopFile, args})) {\n      return\n    }\n\n    await outputFile(path.join(snapMetaDir, this.isUseTemplateApp ? \"snap.yaml\" : \"snapcraft.yaml\"), serializeToYaml(snap))\n\n    const hooksDir = await packager.getResource(options.hooks, \"snap-hooks\")\n    if (hooksDir != null) {\n      args.push(\"--hooks\", hooksDir)\n    }\n\n    if (this.isUseTemplateApp) {\n      args.push(\"--template-url\", \"electron4\")\n    }\n    await executeAppBuilder(args)\n\n    await packager.dispatchArtifactCreated(artifactPath, this, arch, packager.computeSafeArtifactName(artifactName, \"snap\", arch, false))\n  }\n\n  private isElectronVersionGreaterOrEqualThen(version: string) {\n    return semver.gte(this.packager.config.electronVersion || \"5.0.3\", version)\n  }\n}\n\nfunction normalizePlugConfiguration(raw: Array<string | PlugDescriptor> | PlugDescriptor | null | undefined): { [key: string]: {[name: string]: any; } | null } | null {\n  if (raw == null) {\n    return null\n  }\n\n  const result: any = {}\n  for (const item of (Array.isArray(raw) ? raw : [raw])) {\n    if (typeof item === \"string\") {\n      result[item] = null\n    }\n    else {\n      Object.assign(result, item)\n    }\n  }\n  return result\n}\n\nfunction isBrowserSandboxAllowed(snap: any): boolean {\n  if (snap.plugs != null) {\n    for (const plugName of Object.keys(snap.plugs)) {\n      const plug = snap.plugs[plugName]\n      if (plug.interface === \"browser-support\" && plug[\"allow-sandbox\"] === true) {\n        return true\n      }\n    }\n  }\n  return false\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.computeArchToTargetNamesMap = computeArchToTargetNamesMap;
exports.createTargets = createTargets;
exports.createCommonTarget = createCommonTarget;
exports.NoOpTarget = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("../index");

  _index = function () {
    return data;
  };

  return data;
}

function _ArchiveTarget() {
  const data = require("./ArchiveTarget");

  _ArchiveTarget = function () {
    return data;
  };

  return data;
}

const archiveTargets = new Set(["zip", "7z", "tar.xz", "tar.lz", "tar.gz", "tar.bz2"]);

function computeArchToTargetNamesMap(raw, options, platform) {
  for (const targetNames of raw.values()) {
    if (targetNames.length > 0) {
      // https://github.com/electron-userland/electron-builder/issues/1355
      return raw;
    }
  }

  const defaultArchs = raw.size === 0 ? [platform === _index().Platform.MAC ? "x64" : process.arch] : Array.from(raw.keys()).map(it => _builderUtil().Arch[it]);
  const result = new Map(raw);

  for (const target of (0, _builderUtil().asArray)(options.target).map(it => typeof it === "string" ? {
    target: it
  } : it)) {
    let name = target.target;
    let archs = target.arch;
    const suffixPos = name.lastIndexOf(":");

    if (suffixPos > 0) {
      name = target.target.substring(0, suffixPos);

      if (archs == null) {
        archs = target.target.substring(suffixPos + 1);
      }
    }

    for (const arch of archs == null ? defaultArchs : (0, _builderUtil().asArray)(archs)) {
      (0, _builderUtil().addValue)(result, (0, _builderUtil().archFromString)(arch), name);
    }
  }

  if (result.size === 0) {
    for (const arch of defaultArchs) {
      result.set((0, _builderUtil().archFromString)(arch), []);
    }
  }

  return result;
}

function createTargets(nameToTarget, rawList, outDir, packager) {
  const result = [];

  const mapper = (name, factory) => {
    let target = nameToTarget.get(name);

    if (target == null) {
      target = factory(outDir);
      nameToTarget.set(name, target);
    }

    result.push(target);
  };

  const targets = normalizeTargets(rawList, packager.defaultTarget);
  packager.createTargets(targets, mapper);
  return result;
}

function normalizeTargets(targets, defaultTarget) {
  const list = [];

  for (const t of targets) {
    const name = t.toLowerCase().trim();

    if (name === _index().DEFAULT_TARGET) {
      list.push(...defaultTarget);
    } else {
      list.push(name);
    }
  }

  return list;
}

function createCommonTarget(target, outDir, packager) {
  if (archiveTargets.has(target)) {
    return new (_ArchiveTarget().ArchiveTarget)(target, outDir, packager);
  } else if (target === _index().DIR_TARGET) {
    return new NoOpTarget(_index().DIR_TARGET);
  } else {
    throw new Error(`Unknown target: ${target}`);
  }
}

class NoOpTarget extends _index().Target {
  constructor(name) {
    super(name);
    this.options = null;
  }

  get outDir() {
    throw new Error("NoOpTarget");
  }

  build(appOutDir, arch) {// no build

    return (0, _bluebirdLst().coroutine)(function* () {})();
  }

} exports.NoOpTarget = NoOpTarget;
// __ts-babel@6.0.4
//# sourceMappingURL=targetFactory.js.map{"version":3,"sources":["../../src/targets/targetFactory.ts"],"names":[],"mappings":"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","sourcesContent":["import { addValue, Arch, archFromString, ArchType, asArray } from \"builder-util\"\nimport { PlatformSpecificBuildOptions, DEFAULT_TARGET, DIR_TARGET, Platform, Target, TargetConfiguration } from \"../index\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { ArchiveTarget } from \"./ArchiveTarget\"\n\nconst archiveTargets = new Set([\"zip\", \"7z\", \"tar.xz\", \"tar.lz\", \"tar.gz\", \"tar.bz2\"])\n\nexport function computeArchToTargetNamesMap(raw: Map<Arch, Array<string>>, options: PlatformSpecificBuildOptions, platform: Platform): Map<Arch, Array<string>> {\n  for (const targetNames of raw.values()) {\n    if (targetNames.length > 0) {\n      // https://github.com/electron-userland/electron-builder/issues/1355\n      return raw\n    }\n  }\n\n  const defaultArchs: Array<ArchType> = raw.size === 0 ? [platform === Platform.MAC ? \"x64\" : process.arch as ArchType] : Array.from(raw.keys()).map(it => Arch[it] as ArchType)\n  const result = new Map(raw)\n  for (const target of asArray(options.target).map<TargetConfiguration>(it => typeof it === \"string\" ? {target: it} : it)) {\n    let name = target.target\n    let archs = target.arch\n    const suffixPos = name.lastIndexOf(\":\")\n    if (suffixPos > 0) {\n      name = target.target.substring(0, suffixPos)\n      if (archs == null) {\n        archs = target.target.substring(suffixPos + 1) as ArchType\n      }\n    }\n\n    for (const arch of archs == null ? defaultArchs : asArray(archs)) {\n      addValue(result, archFromString(arch), name)\n    }\n  }\n\n  if (result.size === 0) {\n    for (const arch of defaultArchs) {\n      result.set(archFromString(arch), [])\n    }\n  }\n\n  return result\n}\n\nexport function createTargets(nameToTarget: Map<string, Target>, rawList: Array<string>, outDir: string, packager: PlatformPackager<any>): Array<Target> {\n  const result: Array<Target> = []\n\n  const mapper = (name: string, factory: (outDir: string) => Target) => {\n    let target = nameToTarget.get(name)\n    if (target == null) {\n      target = factory(outDir)\n      nameToTarget.set(name, target)\n    }\n    result.push(target)\n  }\n\n  const targets = normalizeTargets(rawList, packager.defaultTarget)\n  packager.createTargets(targets, mapper)\n  return result\n}\n\nfunction normalizeTargets(targets: Array<string>, defaultTarget: Array<string>): Array<string> {\n  const list: Array<string> = []\n  for (const t of targets) {\n    const name = t.toLowerCase().trim()\n    if (name === DEFAULT_TARGET) {\n      list.push(...defaultTarget)\n    }\n    else {\n      list.push(name)\n    }\n  }\n  return list\n}\n\nexport function createCommonTarget(target: string, outDir: string, packager: PlatformPackager<any>): Target {\n  if (archiveTargets.has(target)) {\n    return new ArchiveTarget(target, outDir, packager)\n  }\n  else if (target === DIR_TARGET) {\n    return new NoOpTarget(DIR_TARGET)\n  }\n  else {\n    throw new Error(`Unknown target: ${target}`)\n  }\n}\n\nexport class NoOpTarget extends Target {\n  readonly options = null\n\n  constructor(name: string) {\n    super(name)\n  }\n\n  get outDir(): string {\n    throw new Error(\"NoOpTarget\")\n  }\n\n  async build(appOutDir: string, arch: Arch): Promise<any> {\n    // no build\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createStageDir = createStageDir;
exports.createStageDirPath = createStageDirPath;
exports.getWindowsInstallationDirName = getWindowsInstallationDirName;
exports.StageDir = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class StageDir {
  constructor(dir) {
    this.dir = dir;
  }

  getTempFile(name) {
    return this.dir + path.sep + name;
  }

  cleanup() {
    if (!_builderUtil().debug.enabled || process.env.ELECTRON_BUILDER_REMOVE_STAGE_EVEN_IF_DEBUG === "true") {
      return (0, _fsExtraP().remove)(this.dir);
    }

    return Promise.resolve();
  }

  toString() {
    return this.dir;
  }

}

exports.StageDir = StageDir;

function createStageDir(_x, _x2, _x3) {
  return _createStageDir.apply(this, arguments);
}

function _createStageDir() {
  _createStageDir = (0, _bluebirdLst().coroutine)(function* (target, packager, arch) {
    return new StageDir((yield createStageDirPath(target, packager, arch)));
  });
  return _createStageDir.apply(this, arguments);
}

function createStageDirPath(_x4, _x5, _x6) {
  return _createStageDirPath.apply(this, arguments);
} // https://github.com/electron-userland/electron-builder/issues/3100
// https://github.com/electron-userland/electron-builder/commit/2539cfba20dc639128e75c5b786651b652bb4b78


function _createStageDirPath() {
  _createStageDirPath = (0, _bluebirdLst().coroutine)(function* (target, packager, arch) {
    const tempDir = packager.info.stageDirPathCustomizer(target, packager, arch);
    yield (0, _fsExtraP().emptyDir)(tempDir);
    return tempDir;
  });
  return _createStageDirPath.apply(this, arguments);
}

function getWindowsInstallationDirName(appInfo, isTryToUseProductName) {
  return isTryToUseProductName && /^[-_+0-9a-zA-Z .]+$/.test(appInfo.productFilename) ? appInfo.productFilename : appInfo.sanitizedName;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=targetUtil.js.map{"version":3,"sources":["../../src/targets/targetUtil.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAGM,MAAO,QAAP,CAAe;AACnB,EAAA,WAAA,CAAqB,GAArB,EAAgC;AAAX,SAAA,GAAA,GAAA,GAAA;AACpB;;AAED,EAAA,WAAW,CAAC,IAAD,EAAa;AACtB,WAAO,KAAK,GAAL,GAAW,IAAI,CAAC,GAAhB,GAAsB,IAA7B;AACD;;AAED,EAAA,OAAO,GAAA;AACL,QAAI,CAAC,qBAAM,OAAP,IAAkB,OAAO,CAAC,GAAR,CAAY,2CAAZ,KAA4D,MAAlF,EAA0F;AACxF,aAAO,wBAAO,KAAK,GAAZ,CAAP;AACD;;AACD,WAAO,OAAO,CAAC,OAAR,EAAP;AACD;;AAED,EAAA,QAAQ,GAAA;AACN,WAAO,KAAK,GAAZ;AACD;;AAjBkB;;;;SAoBC,c;;;;;kDAAf,WAA8B,MAA9B,EAA8C,QAA9C,EAA+E,IAA/E,EAAyF;AAC9F,WAAO,IAAI,QAAJ,QAAmB,kBAAkB,CAAC,MAAD,EAAS,QAAT,EAAmB,IAAnB,CAArC,EAAP;AACD,G;;;;SAEqB,kB;;EAMtB;AACA;;;;sDAPO,WAAkC,MAAlC,EAAkD,QAAlD,EAAmF,IAAnF,EAA6F;AAClG,UAAM,OAAO,GAAG,QAAQ,CAAC,IAAT,CAAc,sBAAd,CAAqC,MAArC,EAA6C,QAA7C,EAAuD,IAAvD,CAAhB;AACA,UAAM,0BAAS,OAAT,CAAN;AACA,WAAO,OAAP;AACD,G;;;;AAIK,SAAU,6BAAV,CAAwC,OAAxC,EAA0D,qBAA1D,EAAwF;AAC5F,SAAO,qBAAqB,IAAI,sBAAsB,IAAtB,CAA2B,OAAO,CAAC,eAAnC,CAAzB,GAA+E,OAAO,CAAC,eAAvF,GAAyG,OAAO,CAAC,aAAxH;AACD,C","sourcesContent":["import { emptyDir, remove } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { Target, AppInfo } from \"../\"\nimport { Arch, debug } from \"builder-util\"\nimport { PlatformPackager } from \"../platformPackager\"\n\nexport class StageDir {\n  constructor(readonly dir: string) {\n  }\n\n  getTempFile(name: string) {\n    return this.dir + path.sep + name\n  }\n\n  cleanup() {\n    if (!debug.enabled || process.env.ELECTRON_BUILDER_REMOVE_STAGE_EVEN_IF_DEBUG === \"true\") {\n      return remove(this.dir)\n    }\n    return Promise.resolve()\n  }\n\n  toString() {\n    return this.dir\n  }\n}\n\nexport async function createStageDir(target: Target, packager: PlatformPackager<any>, arch: Arch): Promise<StageDir> {\n  return new StageDir(await createStageDirPath(target, packager, arch))\n}\n\nexport async function createStageDirPath(target: Target, packager: PlatformPackager<any>, arch: Arch): Promise<string> {\n  const tempDir = packager.info.stageDirPathCustomizer(target, packager, arch)\n  await emptyDir(tempDir)\n  return tempDir\n}\n\n// https://github.com/electron-userland/electron-builder/issues/3100\n// https://github.com/electron-userland/electron-builder/commit/2539cfba20dc639128e75c5b786651b652bb4b78\nexport function getWindowsInstallationDirName(appInfo: AppInfo, isTryToUseProductName: boolean): string {\n  return isTryToUseProductName && /^[-_+0-9a-zA-Z .]+$/.test(appInfo.productFilename) ? appInfo.productFilename : appInfo.sanitizedName\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getLinuxToolsPath = getLinuxToolsPath;
exports.prefetchBuildTools = prefetchBuildTools;
exports.fpmPath = void 0;

function _binDownload() {
  const data = require("../binDownload");

  _binDownload = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function getLinuxToolsPath() {
  //noinspection SpellCheckingInspection
  return (0, _binDownload().getBinFromUrl)("linux-tools", "mac-10.12.3", "SQ8fqIRVXuQVWnVgaMTDWyf2TLAJjJYw3tRSqQJECmgF6qdM7Kogfa6KD49RbGzzMYIFca9Uw3MdsxzOPRWcYw==");
}

const fpmPath = new (_lazyVal().Lazy)(() => {
  if (process.platform === "win32" || process.env.USE_SYSTEM_FPM === "true") {
    return Promise.resolve("fpm");
  }

  return (0, _binDownload().getBin)("fpm").then(it => path.join(it, "fpm"));
}); // noinspection JSUnusedGlobalSymbols

exports.fpmPath = fpmPath;

function prefetchBuildTools() {
  // yes, we starting to use native Promise
  return fpmPath.value;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=tools.js.map{"version":3,"sources":["../../src/targets/tools.ts"],"names":[],"mappings":";;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;;;AAEM,SAAU,iBAAV,GAA2B;AAC/B;AACA,SAAO,kCAAc,aAAd,EAA6B,aAA7B,EAA4C,0FAA5C,CAAP;AACD;;AAEM,MAAM,OAAO,GAAG,KAAI,eAAJ,EAAS,MAAK;AACnC,MAAI,OAAO,CAAC,QAAR,KAAqB,OAArB,IAAgC,OAAO,CAAC,GAAR,CAAY,cAAZ,KAA+B,MAAnE,EAA2E;AACzE,WAAO,OAAO,CAAC,OAAR,CAAgB,KAAhB,CAAP;AACD;;AAED,SAAO,2BAAO,KAAP,EACJ,IADI,CACC,EAAE,IAAI,IAAI,CAAC,IAAL,CAAU,EAAV,EAAc,KAAd,CADP,CAAP;AAED,CAPsB,CAAhB,C,CASP;;;;AACM,SAAU,kBAAV,GAA4B;AAChC;AACA,SAAO,OAAO,CAAC,KAAf;AACD,C","sourcesContent":["import { getBin, getBinFromUrl } from \"../binDownload\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\n\nexport function getLinuxToolsPath() {\n  //noinspection SpellCheckingInspection\n  return getBinFromUrl(\"linux-tools\", \"mac-10.12.3\", \"SQ8fqIRVXuQVWnVgaMTDWyf2TLAJjJYw3tRSqQJECmgF6qdM7Kogfa6KD49RbGzzMYIFca9Uw3MdsxzOPRWcYw==\")\n}\n\nexport const fpmPath = new Lazy(() => {\n  if (process.platform === \"win32\" || process.env.USE_SYSTEM_FPM === \"true\") {\n    return Promise.resolve(\"fpm\")\n  }\n\n  return getBin(\"fpm\")\n    .then(it => path.join(it, \"fpm\"))\n})\n\n// noinspection JSUnusedGlobalSymbols\nexport function prefetchBuildTools(): Promise<any> {\n  // yes, we starting to use native Promise\n  return fpmPath.value\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.NsisTarget = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _zipBin() {
  const data = require("7zip-bin");

  _zipBin = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _binDownload() {
  const data = require("../../binDownload");

  _binDownload = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _hash() {
  const data = require("../../util/hash");

  _hash = function () {
    return data;
  };

  return data;
}

var _debug2 = _interopRequireDefault(require("debug"));

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _core() {
  const data = require("../../core");

  _core = function () {
    return data;
  };

  return data;
}

function _CommonWindowsInstallerConfiguration() {
  const data = require("../../options/CommonWindowsInstallerConfiguration");

  _CommonWindowsInstallerConfiguration = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("../../platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _timer() {
  const data = require("../../util/timer");

  _timer = function () {
    return data;
  };

  return data;
}

function _wine() {
  const data = require("../../wine");

  _wine = function () {
    return data;
  };

  return data;
}

function _archive() {
  const data = require("../archive");

  _archive = function () {
    return data;
  };

  return data;
}

function _differentialUpdateInfoBuilder() {
  const data = require("../differentialUpdateInfoBuilder");

  _differentialUpdateInfoBuilder = function () {
    return data;
  };

  return data;
}

function _targetUtil() {
  const data = require("../targetUtil");

  _targetUtil = function () {
    return data;
  };

  return data;
}

function _nsisLang() {
  const data = require("./nsisLang");

  _nsisLang = function () {
    return data;
  };

  return data;
}

function _nsisLicense() {
  const data = require("./nsisLicense");

  _nsisLicense = function () {
    return data;
  };

  return data;
}

function _nsisScriptGenerator() {
  const data = require("./nsisScriptGenerator");

  _nsisScriptGenerator = function () {
    return data;
  };

  return data;
}

function _nsisUtil() {
  const data = require("./nsisUtil");

  _nsisUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const debug = (0, _debug2.default)("electron-builder:nsis"); // noinspection SpellCheckingInspection

const ELECTRON_BUILDER_NS_UUID = _builderUtilRuntime().UUID.parse("50e065bc-3134-11e6-9bab-38c9862bdaf3"); // noinspection SpellCheckingInspection


const nsisResourcePathPromise = new (_lazyVal().Lazy)(() => (0, _binDownload().getBinFromUrl)("nsis-resources", "3.3.0", "4okc98BD0v9xDcSjhPVhAkBMqos+FvD/5/H72fTTIwoHTuWd2WdD7r+1j72hxd+ZXxq1y3FRW0x6Z3jR0VfpMw=="));
const USE_NSIS_BUILT_IN_COMPRESSOR = false;

class NsisTarget extends _core().Target {
  constructor(packager, outDir, targetName, packageHelper) {
    super(targetName);
    this.packager = packager;
    this.outDir = outDir;
    this.packageHelper = packageHelper;
    /** @private */

    this.archs = new Map();
    this.packageHelper.refCount++;
    this.options = targetName === "portable" ? Object.create(null) : Object.assign({}, this.packager.config.nsis, {
      preCompressedFileExtensions: [".avi", ".mov", ".m4v", ".mp4", ".m4p", ".qt", ".mkv", ".webm", ".vmdk"]
    });

    if (targetName !== "nsis") {
      Object.assign(this.options, this.packager.config[targetName === "nsis-web" ? "nsisWeb" : targetName]);
    }

    const deps = packager.info.metadata.dependencies;

    if (deps != null && deps["electron-squirrel-startup"] != null) {
      _builderUtil().log.warn('"electron-squirrel-startup" dependency is not required for NSIS');
    }
  }

  build(appOutDir, arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      _this.archs.set(arch, appOutDir);
    })();
  }

  get isBuildDifferentialAware() {
    return !this.isPortable && this.options.differentialPackage !== false;
  }

  getPreCompressedFileExtensions() {
    const result = this.isWebInstaller ? null : this.options.preCompressedFileExtensions;
    return result == null ? null : (0, _builderUtil().asArray)(result).map(it => it.startsWith(".") ? it : `.${it}`);
  }
  /** @private */


  buildAppPackage(appOutDir, arch) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const options = _this2.options;
      const packager = _this2.packager;
      const isBuildDifferentialAware = _this2.isBuildDifferentialAware;
      const format = !isBuildDifferentialAware && options.useZip ? "zip" : "7z";
      const archiveFile = path.join(_this2.outDir, `${packager.appInfo.sanitizedName}-${packager.appInfo.version}-${_builderUtil().Arch[arch]}.nsis.${format}`);

      const preCompressedFileExtensions = _this2.getPreCompressedFileExtensions();

      const archiveOptions = {
        withoutDir: true,
        compression: packager.compression,
        excluded: preCompressedFileExtensions == null ? null : preCompressedFileExtensions.map(it => `*${it}`)
      };
      const timer = (0, _timer().time)(`nsis package, ${_builderUtil().Arch[arch]}`);
      yield (0, _archive().archive)(format, archiveFile, appOutDir, isBuildDifferentialAware ? (0, _differentialUpdateInfoBuilder().configureDifferentialAwareArchiveOptions)(archiveOptions) : archiveOptions);
      timer.end();

      if (isBuildDifferentialAware && _this2.isWebInstaller) {
        const data = yield (0, _differentialUpdateInfoBuilder().appendBlockmap)(archiveFile);
        return Object.assign({}, data, {
          path: archiveFile
        });
      } else {
        return yield createPackageFileInfo(archiveFile);
      }
    })();
  }

  finishBuild() {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      try {
        yield _this3.buildInstaller();
      } finally {
        yield _this3.packageHelper.finishBuild();
      }
    })();
  }

  get installerFilenamePattern() {
    // tslint:disable:no-invalid-template-strings
    return "${productName} " + (this.isPortable ? "" : "Setup ") + "${version}.${ext}";
  }

  get isPortable() {
    return this.name === "portable";
  }

  buildInstaller() {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this4.packager;
      const appInfo = packager.appInfo;
      const options = _this4.options;
      const installerFilename = packager.expandArtifactNamePattern(options, "exe", null, _this4.installerFilenamePattern);
      const oneClick = options.oneClick !== false;
      const installerPath = path.join(_this4.outDir, installerFilename);
      const logFields = {
        target: _this4.name,
        file: _builderUtil().log.filePath(installerPath),
        archs: Array.from(_this4.archs.keys()).map(it => _builderUtil().Arch[it]).join(", ")
      };
      const isPerMachine = options.perMachine === true;

      if (!_this4.isPortable) {
        logFields.oneClick = oneClick;
        logFields.perMachine = isPerMachine;
      }

      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: _this4.name,
        file: installerPath,
        arch: null
      }, logFields);

      const guid = options.guid || _builderUtilRuntime().UUID.v5(appInfo.id, ELECTRON_BUILDER_NS_UUID);

      const uninstallAppKey = guid.replace(/\\/g, " - ");
      const defines = {
        APP_ID: appInfo.id,
        APP_GUID: guid,
        // Windows bug - entry in Software\Microsoft\Windows\CurrentVersion\Uninstall cannot have \ symbols (dir)
        UNINSTALL_APP_KEY: uninstallAppKey,
        PRODUCT_NAME: appInfo.productName,
        PRODUCT_FILENAME: appInfo.productFilename,
        APP_FILENAME: (0, _targetUtil().getWindowsInstallationDirName)(appInfo, !oneClick || isPerMachine),
        APP_DESCRIPTION: appInfo.description,
        VERSION: appInfo.version,
        PROJECT_DIR: packager.projectDir,
        BUILD_RESOURCES_DIR: packager.info.buildResourcesDir,
        APP_PACKAGE_NAME: appInfo.name
      };

      if (uninstallAppKey !== guid) {
        defines.UNINSTALL_REGISTRY_KEY_2 = `Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${guid}`;
      }

      const commands = {
        OutFile: `"${installerPath}"`,
        VIProductVersion: appInfo.getVersionInWeirdWindowsForm(),
        VIAddVersionKey: _this4.computeVersionKey(),
        Unicode: _this4.isUnicodeEnabled
      };
      const isPortable = _this4.isPortable;
      const iconPath = (isPortable ? null : yield packager.getResource(options.installerIcon, "installerIcon.ico")) || (yield packager.getIconPath());

      if (iconPath != null) {
        if (isPortable) {
          commands.Icon = `"${iconPath}"`;
        } else {
          defines.MUI_ICON = iconPath;
          defines.MUI_UNICON = iconPath;
        }
      }

      const packageFiles = {};
      let estimatedSize = 0;

      if (_this4.isPortable && options.useZip) {
        for (const [arch, dir] of _this4.archs.entries()) {
          defines[arch === _builderUtil().Arch.x64 ? "APP_DIR_64" : "APP_DIR_32"] = dir;
        }
      } else if (USE_NSIS_BUILT_IN_COMPRESSOR && _this4.archs.size === 1) {
        defines.APP_BUILD_DIR = _this4.archs.get(_this4.archs.keys().next().value);
      } else {
        yield _bluebirdLst().default.map(_this4.archs.keys(),
        /*#__PURE__*/
        function () {
          var _ref = (0, _bluebirdLst().coroutine)(function* (arch) {
            const fileInfo = yield _this4.packageHelper.packArch(arch, _this4);
            const file = fileInfo.path;
            const defineKey = arch === _builderUtil().Arch.x64 ? "APP_64" : "APP_32";
            defines[defineKey] = file;
            defines[`${defineKey}_NAME`] = path.basename(file); // nsis expect a hexadecimal string

            defines[`${defineKey}_HASH`] = Buffer.from(fileInfo.sha512, "base64").toString("hex").toUpperCase();

            if (_this4.isWebInstaller) {
              yield packager.dispatchArtifactCreated(file, _this4, arch);
              packageFiles[_builderUtil().Arch[arch]] = fileInfo;
            }

            const archiveInfo = (yield (0, _builderUtil().exec)(_zipBin().path7za, ["l", file])).trim(); // after adding blockmap data will be "Warnings: 1" in the end of output

            const match = archiveInfo.match(/(\d+)\s+\d+\s+\d+\s+files/);

            if (match == null) {
              _builderUtil().log.warn({
                output: archiveInfo
              }, "cannot compute size of app package");
            } else {
              estimatedSize += parseInt(match[1], 10);
            }
          });

          return function (_x) {
            return _ref.apply(this, arguments);
          };
        }());
      }

      _this4.configureDefinesForAllTypeOfInstaller(defines);

      if (isPortable) {
        const portableOptions = options;
        defines.REQUEST_EXECUTION_LEVEL = portableOptions.requestExecutionLevel || "user";
        defines.UNPACK_DIR_NAME = portableOptions.unpackDirName || (yield (0, _builderUtil().executeAppBuilder)(["ksuid"]));
      } else {
        yield _this4.configureDefines(oneClick, defines);
      }

      if (estimatedSize !== 0) {
        // in kb
        defines.ESTIMATED_SIZE = Math.round(estimatedSize / 1024);
      }

      if (packager.compression === "store") {
        commands.SetCompress = "off";
      } else {
        // difference - 33.540 vs 33.601, only 61 KB (but zip is faster to decompress)
        // do not use /SOLID - "With solid compression, files are uncompressed to temporary file before they are copied to their final destination",
        // it is not good for portable installer (where built-in NSIS compression is used). http://forums.winamp.com/showpost.php?p=2982902&postcount=6
        commands.SetCompressor = "zlib";

        if (!_this4.isWebInstaller) {
          defines.COMPRESS = "auto";
        }
      }

      debug(defines);
      debug(commands);

      if (packager.packagerOptions.effectiveOptionComputed != null && (yield packager.packagerOptions.effectiveOptionComputed([defines, commands]))) {
        return;
      }

      const sharedHeader = yield _this4.computeCommonInstallerScriptHeader();
      const script = isPortable ? yield (0, _fsExtraP().readFile)(path.join(_nsisUtil().nsisTemplatesDir, "portable.nsi"), "utf8") : yield _this4.computeScriptAndSignUninstaller(defines, commands, installerPath, sharedHeader);
      yield _this4.executeMakensis(defines, commands, sharedHeader + (yield _this4.computeFinalScript(script, true)));
      yield Promise.all([packager.sign(installerPath), defines.UNINSTALLER_OUT_FILE == null ? Promise.resolve() : (0, _fsExtraP().unlink)(defines.UNINSTALLER_OUT_FILE)]);
      const safeArtifactName = (0, _platformPackager().isSafeGithubName)(installerFilename) ? installerFilename : _this4.generateGitHubInstallerName();
      let updateInfo;

      if (_this4.isWebInstaller) {
        updateInfo = (0, _differentialUpdateInfoBuilder().createNsisWebDifferentialUpdateInfo)(installerPath, packageFiles);
      } else if (_this4.isBuildDifferentialAware) {
        updateInfo = yield (0, _differentialUpdateInfoBuilder().createBlockmap)(installerPath, _this4, packager, safeArtifactName);
      }

      if (updateInfo != null && isPerMachine && oneClick) {
        updateInfo.isAdminRightsRequired = true;
      }

      yield packager.info.callArtifactBuildCompleted({
        file: installerPath,
        updateInfo,
        target: _this4,
        packager,
        arch: _this4.archs.size === 1 ? _this4.archs.keys().next().value : null,
        safeArtifactName,
        isWriteUpdateInfo: !_this4.isPortable
      });
    })();
  }

  generateGitHubInstallerName() {
    const appInfo = this.packager.appInfo;
    const classifier = appInfo.name.toLowerCase() === appInfo.name ? "setup-" : "Setup-";
    return `${appInfo.name}-${this.isPortable ? "" : classifier}${appInfo.version}.exe`;
  }

  get isUnicodeEnabled() {
    return this.options.unicode !== false;
  }

  get isWebInstaller() {
    return false;
  }

  computeScriptAndSignUninstaller(defines, commands, installerPath, sharedHeader) {
    var _this5 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this5.packager;
      const customScriptPath = yield packager.getResource(_this5.options.script, "installer.nsi");
      const script = yield (0, _fsExtraP().readFile)(customScriptPath || path.join(_nsisUtil().nsisTemplatesDir, "installer.nsi"), "utf8");

      if (customScriptPath != null) {
        _builderUtil().log.info({
          reason: "custom NSIS script is used"
        }, "uninstaller is not signed by electron-builder");

        return script;
      } // https://github.com/electron-userland/electron-builder/issues/2103
      // it is more safe and reliable to write uninstaller to our out dir


      const uninstallerPath = path.join(_this5.outDir, `.__uninstaller-${_this5.name}-${_this5.packager.appInfo.sanitizedName}.exe`);
      const isWin = process.platform === "win32";
      defines.BUILD_UNINSTALLER = null;
      defines.UNINSTALLER_OUT_FILE = isWin ? uninstallerPath : path.win32.join("Z:", uninstallerPath);
      yield _this5.executeMakensis(defines, commands, sharedHeader + (yield _this5.computeFinalScript(script, false)));
      yield (0, _wine().execWine)(installerPath);
      yield packager.sign(uninstallerPath, "  Signing NSIS uninstaller");
      delete defines.BUILD_UNINSTALLER; // platform-specific path, not wine

      defines.UNINSTALLER_OUT_FILE = uninstallerPath;
      return script;
    })();
  }

  computeVersionKey() {
    // Error: invalid VIProductVersion format, should be X.X.X.X
    // so, we must strip beta
    const localeId = this.options.language || "1033";
    const appInfo = this.packager.appInfo;
    const versionKey = [`/LANG=${localeId} ProductName "${appInfo.productName}"`, `/LANG=${localeId} ProductVersion "${appInfo.version}"`, `/LANG=${localeId} LegalCopyright "${appInfo.copyright}"`, `/LANG=${localeId} FileDescription "${appInfo.description}"`, `/LANG=${localeId} FileVersion "${appInfo.buildVersion}"`];
    (0, _builderUtil().use)(this.packager.platformSpecificBuildOptions.legalTrademarks, it => versionKey.push(`/LANG=${localeId} LegalTrademarks "${it}"`));
    (0, _builderUtil().use)(appInfo.companyName, it => versionKey.push(`/LANG=${localeId} CompanyName "${it}"`));
    return versionKey;
  }

  configureDefines(oneClick, defines) {
    const packager = this.packager;
    const options = this.options;
    const asyncTaskManager = new (_builderUtil().AsyncTaskManager)(packager.info.cancellationToken);

    if (oneClick) {
      defines.ONE_CLICK = null;

      if (options.runAfterFinish !== false) {
        defines.RUN_AFTER_FINISH = null;
      }

      asyncTaskManager.add(
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        const installerHeaderIcon = yield packager.getResource(options.installerHeaderIcon, "installerHeaderIcon.ico");

        if (installerHeaderIcon != null) {
          defines.HEADER_ICO = installerHeaderIcon;
        }
      }));
    } else {
      if (options.runAfterFinish === false) {
        defines.HIDE_RUN_AFTER_FINISH = null;
      }

      asyncTaskManager.add(
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        const installerHeader = yield packager.getResource(options.installerHeader, "installerHeader.bmp");

        if (installerHeader != null) {
          defines.MUI_HEADERIMAGE = null;
          defines.MUI_HEADERIMAGE_RIGHT = null;
          defines.MUI_HEADERIMAGE_BITMAP = installerHeader;
        }
      }));
      asyncTaskManager.add(
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        const bitmap = (yield packager.getResource(options.installerSidebar, "installerSidebar.bmp")) || "${NSISDIR}\\Contrib\\Graphics\\Wizard\\nsis3-metro.bmp";
        defines.MUI_WELCOMEFINISHPAGE_BITMAP = bitmap;
        defines.MUI_UNWELCOMEFINISHPAGE_BITMAP = (yield packager.getResource(options.uninstallerSidebar, "uninstallerSidebar.bmp")) || bitmap;
      }));

      if (options.allowElevation !== false) {
        defines.MULTIUSER_INSTALLMODE_ALLOW_ELEVATION = null;
      }
    }

    if (options.perMachine === true) {
      defines.INSTALL_MODE_PER_ALL_USERS = null;
    }

    if (!oneClick || options.perMachine === true) {
      defines.INSTALL_MODE_PER_ALL_USERS_REQUIRED = null;
    }

    if (options.allowToChangeInstallationDirectory) {
      if (oneClick) {
        throw new (_builderUtil().InvalidConfigurationError)("allowToChangeInstallationDirectory makes sense only for assisted installer (please set oneClick to false)");
      }

      defines.allowToChangeInstallationDirectory = null;
    }

    const commonOptions = (0, _CommonWindowsInstallerConfiguration().getEffectiveOptions)(options, packager);

    if (commonOptions.menuCategory != null) {
      defines.MENU_FILENAME = commonOptions.menuCategory;
    }

    defines.SHORTCUT_NAME = commonOptions.shortcutName;

    if (options.deleteAppDataOnUninstall) {
      defines.DELETE_APP_DATA_ON_UNINSTALL = null;
    }

    asyncTaskManager.add(
    /*#__PURE__*/
    (0, _bluebirdLst().coroutine)(function* () {
      const uninstallerIcon = yield packager.getResource(options.uninstallerIcon, "uninstallerIcon.ico");

      if (uninstallerIcon != null) {
        // we don't need to copy MUI_UNICON (defaults to app icon), so, we have 2 defines
        defines.UNINSTALLER_ICON = uninstallerIcon;
        defines.MUI_UNICON = uninstallerIcon;
      }
    }));
    defines.UNINSTALL_DISPLAY_NAME = packager.expandMacro(options.uninstallDisplayName || "${productName} ${version}", null, {}, false);

    if (commonOptions.isCreateDesktopShortcut === _CommonWindowsInstallerConfiguration().DesktopShortcutCreationPolicy.NEVER) {
      defines.DO_NOT_CREATE_DESKTOP_SHORTCUT = null;
    }

    if (commonOptions.isCreateDesktopShortcut === _CommonWindowsInstallerConfiguration().DesktopShortcutCreationPolicy.ALWAYS) {
      defines.RECREATE_DESKTOP_SHORTCUT = null;
    }

    if (!commonOptions.isCreateStartMenuShortcut) {
      defines.DO_NOT_CREATE_START_MENU_SHORTCUT = null;
    }

    if (options.displayLanguageSelector === true) {
      defines.DISPLAY_LANG_SELECTOR = null;
    }

    return asyncTaskManager.awaitTasks();
  }

  configureDefinesForAllTypeOfInstaller(defines) {
    const appInfo = this.packager.appInfo;
    const companyName = appInfo.companyName;

    if (companyName != null) {
      defines.COMPANY_NAME = companyName;
    } // electron uses product file name as app data, define it as well to remove on uninstall


    if (defines.APP_FILENAME !== appInfo.productFilename) {
      defines.APP_PRODUCT_FILENAME = appInfo.productFilename;
    }

    if (this.isWebInstaller) {
      defines.APP_PACKAGE_STORE_FILE = `${appInfo.updaterCacheDirName}\\${_builderUtilRuntime().CURRENT_APP_PACKAGE_FILE_NAME}`;
    } else {
      defines.APP_INSTALLER_STORE_FILE = `${appInfo.updaterCacheDirName}\\${_builderUtilRuntime().CURRENT_APP_INSTALLER_FILE_NAME}`;
    }

    if (!this.isWebInstaller && defines.APP_BUILD_DIR == null) {
      const options = this.options;

      if (options.useZip) {
        defines.ZIP_COMPRESSION = null;
      }

      defines.COMPRESSION_METHOD = options.useZip ? "zip" : "7z";
    }
  }

  executeMakensis(defines, commands, script) {
    var _this6 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const args = _this6.options.warningsAsErrors === false ? [] : ["-WX"];

      for (const name of Object.keys(defines)) {
        const value = defines[name];

        if (value == null) {
          args.push(`-D${name}`);
        } else {
          args.push(`-D${name}=${value}`);
        }
      }

      for (const name of Object.keys(commands)) {
        const value = commands[name];

        if (Array.isArray(value)) {
          for (const c of value) {
            args.push(`-X${name} ${c}`);
          }
        } else {
          args.push(`-X${name} ${value}`);
        }
      }

      args.push("-");

      if (_this6.packager.debugLogger.isEnabled) {
        _this6.packager.debugLogger.add("nsis.script", script);
      }

      const nsisPath = yield _nsisUtil().NSIS_PATH.value;
      const command = path.join(nsisPath, process.platform === "darwin" ? "mac" : process.platform === "win32" ? "Bin" : "linux", process.platform === "win32" ? "makensis.exe" : "makensis");
      yield (0, _builderUtil().spawnAndWrite)(command, args, script, {
        // we use NSIS_CONFIG_CONST_DATA_PATH=no to build makensis on Linux, but in any case it doesn't use stubs as MacOS/Windows version, so, we explicitly set NSISDIR
        env: Object.assign({}, process.env, {
          NSISDIR: nsisPath
        }),
        cwd: _nsisUtil().nsisTemplatesDir
      });
    })();
  }

  computeCommonInstallerScriptHeader() {
    var _this7 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this7.packager;
      const options = _this7.options;
      const scriptGenerator = new (_nsisScriptGenerator().NsisScriptGenerator)();
      const langConfigurator = new (_nsisLang().LangConfigurator)(options);
      scriptGenerator.include(path.join(_nsisUtil().nsisTemplatesDir, "include", "StdUtils.nsh"));
      const includeDir = path.join(_nsisUtil().nsisTemplatesDir, "include");
      scriptGenerator.addIncludeDir(includeDir);
      scriptGenerator.flags(["updated", "force-run", "keep-shortcuts", "no-desktop-shortcut", "delete-app-data", "allusers", "currentuser"]);
      (0, _nsisLang().createAddLangsMacro)(scriptGenerator, langConfigurator);
      const taskManager = new (_builderUtil().AsyncTaskManager)(packager.info.cancellationToken);
      const pluginArch = _this7.isUnicodeEnabled ? "x86-unicode" : "x86-ansi";
      taskManager.add(
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        scriptGenerator.addPluginDir(pluginArch, path.join((yield nsisResourcePathPromise.value), "plugins", pluginArch));
      }));
      taskManager.add(
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        const userPluginDir = path.join(packager.info.buildResourcesDir, pluginArch);
        const stat = yield (0, _fs().statOrNull)(userPluginDir);

        if (stat != null && stat.isDirectory()) {
          scriptGenerator.addPluginDir(pluginArch, userPluginDir);
        }
      }));
      taskManager.addTask((0, _nsisLang().addCustomMessageFileInclude)("messages.yml", packager, scriptGenerator, langConfigurator));

      if (!_this7.isPortable) {
        if (options.oneClick === false) {
          taskManager.addTask((0, _nsisLang().addCustomMessageFileInclude)("assistedMessages.yml", packager, scriptGenerator, langConfigurator));
        }

        taskManager.add(
        /*#__PURE__*/
        (0, _bluebirdLst().coroutine)(function* () {
          const customInclude = yield packager.getResource(_this7.options.include, "installer.nsh");

          if (customInclude != null) {
            scriptGenerator.addIncludeDir(packager.info.buildResourcesDir);
            scriptGenerator.include(customInclude);
          }
        }));
      }

      yield taskManager.awaitTasks();
      return scriptGenerator.build();
    })();
  }

  computeFinalScript(originalScript, isInstaller) {
    var _this8 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this8.packager;
      const options = _this8.options;
      const langConfigurator = new (_nsisLang().LangConfigurator)(options);
      const scriptGenerator = new (_nsisScriptGenerator().NsisScriptGenerator)();
      const taskManager = new (_builderUtil().AsyncTaskManager)(packager.info.cancellationToken);

      if (isInstaller) {
        // http://stackoverflow.com/questions/997456/nsis-license-file-based-on-language-selection
        taskManager.add(() => (0, _nsisLicense().computeLicensePage)(packager, options, scriptGenerator, langConfigurator.langs));
      }

      yield taskManager.awaitTasks();

      if (_this8.isPortable) {
        return scriptGenerator.build() + originalScript;
      }

      const preCompressedFileExtensions = _this8.getPreCompressedFileExtensions();

      if (preCompressedFileExtensions != null && preCompressedFileExtensions.length !== 0) {
        for (const [arch, dir] of _this8.archs.entries()) {
          yield generateForPreCompressed(preCompressedFileExtensions, dir, arch, scriptGenerator);
        }
      }

      const fileAssociations = packager.fileAssociations;

      if (fileAssociations.length !== 0) {
        scriptGenerator.include(path.join(path.join(_nsisUtil().nsisTemplatesDir, "include"), "FileAssociation.nsh"));

        if (isInstaller) {
          const registerFileAssociationsScript = new (_nsisScriptGenerator().NsisScriptGenerator)();

          for (const item of fileAssociations) {
            const extensions = (0, _builderUtil().asArray)(item.ext).map(_platformPackager().normalizeExt);

            for (const ext of extensions) {
              const customIcon = yield packager.getResource((0, _builderUtil().getPlatformIconFileName)(item.icon, false), `${extensions[0]}.ico`);
              let installedIconPath = "$appExe,0";

              if (customIcon != null) {
                installedIconPath = `$INSTDIR\\resources\\${path.basename(customIcon)}`;
                registerFileAssociationsScript.file(installedIconPath, customIcon);
              }

              const icon = `"${installedIconPath}"`;
              const commandText = `"Open with ${packager.appInfo.productName}"`;
              const command = '"$appExe $\\"%1$\\""';
              registerFileAssociationsScript.insertMacro("APP_ASSOCIATE", `"${ext}" "${item.name || ext}" "${item.description || ""}" ${icon} ${commandText} ${command}`);
            }
          }

          scriptGenerator.macro("registerFileAssociations", registerFileAssociationsScript);
        } else {
          const unregisterFileAssociationsScript = new (_nsisScriptGenerator().NsisScriptGenerator)();

          for (const item of fileAssociations) {
            for (const ext of (0, _builderUtil().asArray)(item.ext)) {
              unregisterFileAssociationsScript.insertMacro("APP_UNASSOCIATE", `"${(0, _platformPackager().normalizeExt)(ext)}" "${item.name || ext}"`);
            }
          }

          scriptGenerator.macro("unregisterFileAssociations", unregisterFileAssociationsScript);
        }
      }

      return scriptGenerator.build() + originalScript;
    })();
  }

}

exports.NsisTarget = NsisTarget;

function generateForPreCompressed(_x2, _x3, _x4, _x5) {
  return _generateForPreCompressed.apply(this, arguments);
}

function _generateForPreCompressed() {
  _generateForPreCompressed = (0, _bluebirdLst().coroutine)(function* (preCompressedFileExtensions, dir, arch, scriptGenerator) {
    const resourcesDir = path.join(dir, "resources");
    const dirInfo = yield (0, _fs().statOrNull)(resourcesDir);

    if (dirInfo == null || !dirInfo.isDirectory()) {
      return;
    }

    const nodeModules = `${path.sep}node_modules`;
    const preCompressedAssets = yield (0, _fs().walk)(resourcesDir, (file, stat) => {
      if (stat.isDirectory()) {
        return !file.endsWith(nodeModules);
      } else {
        return preCompressedFileExtensions.some(it => file.endsWith(it));
      }
    });

    if (preCompressedAssets.length !== 0) {
      const macro = new (_nsisScriptGenerator().NsisScriptGenerator)();

      for (const file of preCompressedAssets) {
        macro.file(`$INSTDIR\\${path.relative(dir, file).replace(/\//g, "\\")}`, file);
      }

      scriptGenerator.macro(`customFiles_${_builderUtil().Arch[arch]}`, macro);
    }
  });
  return _generateForPreCompressed.apply(this, arguments);
}

function createPackageFileInfo(_x6) {
  return _createPackageFileInfo.apply(this, arguments);
} function _createPackageFileInfo() {
  _createPackageFileInfo = (0, _bluebirdLst().coroutine)(function* (file) {
    return {
      path: file,
      size: (yield (0, _fsExtraP().stat)(file)).size,
      sha512: yield (0, _hash().hashFile)(file)
    };
  });
  return _createPackageFileInfo.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=NsisTarget.js.map{"version":3,"sources":["../../../src/targets/nsis/NsisTarget.ts"],"names":[],"mappings":";;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AADA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;AAEA,MAAM,KAAK,GAAG,qBAAO,uBAAP,CAAd,C,CAEA;;AACA,MAAM,wBAAwB,GAAG,2BAAK,KAAL,CAAW,sCAAX,CAAjC,C,CAEA;;;AACA,MAAM,uBAAuB,GAAG,KAAI,eAAJ,EAAS,MAAM,kCAAc,gBAAd,EAAgC,OAAhC,EAAyC,0FAAzC,CAAf,CAAhC;AAEA,MAAM,4BAA4B,GAAG,KAArC;;AAEM,MAAO,UAAP,SAA0B,cAA1B,CAAgC;AAMpC,EAAA,WAAA,CAAqB,QAArB,EAAqD,MAArD,EAAqE,UAArE,EAA4G,aAA5G,EAA2I;AACzI,UAAM,UAAN;AADmB,SAAA,QAAA,GAAA,QAAA;AAAgC,SAAA,MAAA,GAAA,MAAA;AAAuD,SAAA,aAAA,GAAA,aAAA;AAH5G;;AACS,SAAA,KAAA,GAA2B,IAAI,GAAJ,EAA3B;AAKP,SAAK,aAAL,CAAmB,QAAnB;AAEA,SAAK,OAAL,GAAe,UAAU,KAAK,UAAf,GAA4B,MAAM,CAAC,MAAP,CAAc,IAAd,CAA5B,GAAiD,MAAA,CAAA,MAAA,CAAA,EAAA,EAC3D,KAAK,QAAL,CAAc,MAAd,CAAqB,IADsC,EAClC;AAC5B,MAAA,2BAA2B,EAAE,CAAC,MAAD,EAAS,MAAT,EAAiB,MAAjB,EAAyB,MAAzB,EAAiC,MAAjC,EAAyC,KAAzC,EAAgD,MAAhD,EAAwD,OAAxD,EAAiE,OAAjE;AADD,KADkC,CAAhE;;AAKA,QAAI,UAAU,KAAK,MAAnB,EAA2B;AACzB,MAAA,MAAM,CAAC,MAAP,CAAc,KAAK,OAAnB,EAA6B,KAAK,QAAL,CAAc,MAAd,CAA6B,UAAU,KAAK,UAAf,GAA4B,SAA5B,GAAwC,UAArE,CAA7B;AACD;;AAED,UAAM,IAAI,GAAG,QAAQ,CAAC,IAAT,CAAc,QAAd,CAAuB,YAApC;;AACA,QAAI,IAAI,IAAI,IAAR,IAAgB,IAAI,CAAC,2BAAD,CAAJ,IAAqC,IAAzD,EAA+D;AAC7D,yBAAI,IAAJ,CAAS,iEAAT;AACD;AACF;;AAEK,EAAA,KAAN,CAAY,SAAZ,EAA+B,IAA/B,EAAyC;AAAA;;AAAA;AACvC,MAAA,KAAI,CAAC,KAAL,CAAW,GAAX,CAAe,IAAf,EAAqB,SAArB;AADuC;AAExC;;AAED,MAAI,wBAAJ,GAA4B;AAC1B,WAAO,CAAC,KAAK,UAAN,IAAoB,KAAK,OAAL,CAAa,mBAAb,KAAqC,KAAhE;AACD;;AAEO,EAAA,8BAA8B,GAAA;AACpC,UAAM,MAAM,GAAG,KAAK,cAAL,GAAsB,IAAtB,GAA6B,KAAK,OAAL,CAAa,2BAAzD;AACA,WAAO,MAAM,IAAI,IAAV,GAAiB,IAAjB,GAAwB,4BAAQ,MAAR,EAAgB,GAAhB,CAAoB,EAAE,IAAI,EAAE,CAAC,UAAH,CAAc,GAAd,IAAqB,EAArB,GAA0B,IAAI,EAAE,EAA1D,CAA/B;AACD;AAED;;;AACM,EAAA,eAAN,CAAsB,SAAtB,EAAyC,IAAzC,EAAmD;AAAA;;AAAA;AACjD,YAAM,OAAO,GAAG,MAAI,CAAC,OAArB;AACA,YAAM,QAAQ,GAAG,MAAI,CAAC,QAAtB;AAEA,YAAM,wBAAwB,GAAG,MAAI,CAAC,wBAAtC;AACA,YAAM,MAAM,GAAG,CAAC,wBAAD,IAA6B,OAAO,CAAC,MAArC,GAA8C,KAA9C,GAAsD,IAArE;AACA,YAAM,WAAW,GAAG,IAAI,CAAC,IAAL,CAAU,MAAI,CAAC,MAAf,EAAuB,GAAG,QAAQ,CAAC,OAAT,CAAiB,aAAa,IAAI,QAAQ,CAAC,OAAT,CAAiB,OAAO,IAAI,oBAAK,IAAL,CAAU,SAAS,MAAM,EAAjH,CAApB;;AACA,YAAM,2BAA2B,GAAG,MAAI,CAAC,8BAAL,EAApC;;AACA,YAAM,cAAc,GAAmB;AACrC,QAAA,UAAU,EAAE,IADyB;AAErC,QAAA,WAAW,EAAE,QAAQ,CAAC,WAFe;AAGrC,QAAA,QAAQ,EAAE,2BAA2B,IAAI,IAA/B,GAAsC,IAAtC,GAA6C,2BAA2B,CAAC,GAA5B,CAAgC,EAAE,IAAI,IAAI,EAAE,EAA5C;AAHlB,OAAvC;AAMA,YAAM,KAAK,GAAG,mBAAK,iBAAiB,oBAAK,IAAL,CAAU,EAAhC,CAAd;AACA,YAAM,wBAAQ,MAAR,EAAgB,WAAhB,EAA6B,SAA7B,EAAwC,wBAAwB,GAAG,+EAAyC,cAAzC,CAAH,GAA8D,cAA9H,CAAN;AACA,MAAA,KAAK,CAAC,GAAN;;AAEA,UAAI,wBAAwB,IAAI,MAAI,CAAC,cAArC,EAAqD;AACnD,cAAM,IAAI,SAAS,qDAAe,WAAf,CAAnB;AACA,eAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACK,IADL,EACS;AACP,UAAA,IAAI,EAAE;AADC,SADT,CAAA;AAID,OAND,MAOK;AACH,qBAAa,qBAAqB,CAAC,WAAD,CAAlC;AACD;AA3BgD;AA4BlD;;AAEK,EAAA,WAAN,GAAiB;AAAA;;AAAA;AACf,UAAI;AACF,cAAM,MAAI,CAAC,cAAL,EAAN;AACD,OAFD,SAGQ;AACN,cAAM,MAAI,CAAC,aAAL,CAAmB,WAAnB,EAAN;AACD;AANc;AAOhB;;AAED,MAAc,wBAAd,GAAsC;AACpC;AACA,WAAO,qBAAqB,KAAK,UAAL,GAAkB,EAAlB,GAAuB,QAA5C,IAAwD,mBAA/D;AACD;;AAED,MAAY,UAAZ,GAAsB;AACpB,WAAO,KAAK,IAAL,KAAc,UAArB;AACD;;AAEa,EAAA,cAAN,GAAoB;AAAA;;AAAA;AAC1B,YAAM,QAAQ,GAAG,MAAI,CAAC,QAAtB;AACA,YAAM,OAAO,GAAG,QAAQ,CAAC,OAAzB;AACA,YAAM,OAAO,GAAG,MAAI,CAAC,OAArB;AACA,YAAM,iBAAiB,GAAG,QAAQ,CAAC,yBAAT,CAAmC,OAAnC,EAA4C,KAA5C,EAAmD,IAAnD,EAAyD,MAAI,CAAC,wBAA9D,CAA1B;AACA,YAAM,QAAQ,GAAG,OAAO,CAAC,QAAR,KAAqB,KAAtC;AACA,YAAM,aAAa,GAAG,IAAI,CAAC,IAAL,CAAU,MAAI,CAAC,MAAf,EAAuB,iBAAvB,CAAtB;AAEA,YAAM,SAAS,GAAQ;AACrB,QAAA,MAAM,EAAE,MAAI,CAAC,IADQ;AAErB,QAAA,IAAI,EAAE,mBAAI,QAAJ,CAAa,aAAb,CAFe;AAGrB,QAAA,KAAK,EAAE,KAAK,CAAC,IAAN,CAAW,MAAI,CAAC,KAAL,CAAW,IAAX,EAAX,EAA8B,GAA9B,CAAkC,EAAE,IAAI,oBAAK,EAAL,CAAxC,EAAkD,IAAlD,CAAuD,IAAvD;AAHc,OAAvB;AAKA,YAAM,YAAY,GAAG,OAAO,CAAC,UAAR,KAAuB,IAA5C;;AACA,UAAI,CAAC,MAAI,CAAC,UAAV,EAAsB;AACpB,QAAA,SAAS,CAAC,QAAV,GAAqB,QAArB;AACA,QAAA,SAAS,CAAC,UAAV,GAAuB,YAAvB;AACD;;AAED,YAAM,QAAQ,CAAC,IAAT,CAAc,wBAAd,CAAuC;AAC3C,QAAA,qBAAqB,EAAE,MAAI,CAAC,IADe;AAE3C,QAAA,IAAI,EAAE,aAFqC;AAG3C,QAAA,IAAI,EAAE;AAHqC,OAAvC,EAIH,SAJG,CAAN;;AAMA,YAAM,IAAI,GAAG,OAAO,CAAC,IAAR,IAAgB,2BAAK,EAAL,CAAQ,OAAO,CAAC,EAAhB,EAAoB,wBAApB,CAA7B;;AACA,YAAM,eAAe,GAAG,IAAI,CAAC,OAAL,CAAa,KAAb,EAAoB,KAApB,CAAxB;AACA,YAAM,OAAO,GAAQ;AACnB,QAAA,MAAM,EAAE,OAAO,CAAC,EADG;AAEnB,QAAA,QAAQ,EAAE,IAFS;AAGnB;AACA,QAAA,iBAAiB,EAAE,eAJA;AAKnB,QAAA,YAAY,EAAE,OAAO,CAAC,WALH;AAMnB,QAAA,gBAAgB,EAAE,OAAO,CAAC,eANP;AAOnB,QAAA,YAAY,EAAE,iDAA8B,OAA9B,EAAuC,CAAC,QAAD,IAAa,YAApD,CAPK;AAQnB,QAAA,eAAe,EAAE,OAAO,CAAC,WARN;AASnB,QAAA,OAAO,EAAE,OAAO,CAAC,OATE;AAWnB,QAAA,WAAW,EAAE,QAAQ,CAAC,UAXH;AAYnB,QAAA,mBAAmB,EAAE,QAAQ,CAAC,IAAT,CAAc,iBAZhB;AAcnB,QAAA,gBAAgB,EAAE,OAAO,CAAC;AAdP,OAArB;;AAgBA,UAAI,eAAe,KAAK,IAAxB,EAA8B;AAC5B,QAAA,OAAO,CAAC,wBAAR,GAAmC,4DAA4D,IAAI,EAAnG;AACD;;AAED,YAAM,QAAQ,GAAQ;AACpB,QAAA,OAAO,EAAE,IAAI,aAAa,GADN;AAEpB,QAAA,gBAAgB,EAAE,OAAO,CAAC,4BAAR,EAFE;AAGpB,QAAA,eAAe,EAAE,MAAI,CAAC,iBAAL,EAHG;AAIpB,QAAA,OAAO,EAAE,MAAI,CAAC;AAJM,OAAtB;AAOA,YAAM,UAAU,GAAG,MAAI,CAAC,UAAxB;AACA,YAAM,QAAQ,GAAG,CAAC,UAAU,GAAG,IAAH,SAAgB,QAAQ,CAAC,WAAT,CAAqB,OAAO,CAAC,aAA7B,EAA4C,mBAA5C,CAA3B,YAAsG,QAAQ,CAAC,WAAT,EAAtG,CAAjB;;AACA,UAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,YAAI,UAAJ,EAAgB;AACd,UAAA,QAAQ,CAAC,IAAT,GAAgB,IAAI,QAAQ,GAA5B;AACD,SAFD,MAGK;AACH,UAAA,OAAO,CAAC,QAAR,GAAmB,QAAnB;AACA,UAAA,OAAO,CAAC,UAAR,GAAqB,QAArB;AACD;AACF;;AAED,YAAM,YAAY,GAAwC,EAA1D;AACA,UAAI,aAAa,GAAG,CAApB;;AACA,UAAI,MAAI,CAAC,UAAL,IAAmB,OAAO,CAAC,MAA/B,EAAuC;AACrC,aAAK,MAAM,CAAC,IAAD,EAAO,GAAP,CAAX,IAA0B,MAAI,CAAC,KAAL,CAAW,OAAX,EAA1B,EAAgD;AAC9C,UAAA,OAAO,CAAC,IAAI,KAAK,oBAAK,GAAd,GAAoB,YAApB,GAAmC,YAApC,CAAP,GAA2D,GAA3D;AACD;AACF,OAJD,MAKK,IAAI,4BAA4B,IAAI,MAAI,CAAC,KAAL,CAAW,IAAX,KAAoB,CAAxD,EAA2D;AAC9D,QAAA,OAAO,CAAC,aAAR,GAAwB,MAAI,CAAC,KAAL,CAAW,GAAX,CAAe,MAAI,CAAC,KAAL,CAAW,IAAX,GAAkB,IAAlB,GAAyB,KAAxC,CAAxB;AACD,OAFI,MAGA;AACH,cAAM,uBAAgB,GAAhB,CAAoB,MAAI,CAAC,KAAL,CAAW,IAAX,EAApB;AAAA;AAAA;AAAA,mDAAuC,WAAM,IAAN,EAAa;AACxD,kBAAM,QAAQ,SAAS,MAAI,CAAC,aAAL,CAAmB,QAAnB,CAA4B,IAA5B,EAAkC,MAAlC,CAAvB;AACA,kBAAM,IAAI,GAAG,QAAQ,CAAC,IAAtB;AACA,kBAAM,SAAS,GAAG,IAAI,KAAK,oBAAK,GAAd,GAAoB,QAApB,GAA+B,QAAjD;AACA,YAAA,OAAO,CAAC,SAAD,CAAP,GAAqB,IAArB;AACA,YAAA,OAAO,CAAC,GAAG,SAAS,OAAb,CAAP,GAA+B,IAAI,CAAC,QAAL,CAAc,IAAd,CAA/B,CALwD,CAMxD;;AACA,YAAA,OAAO,CAAC,GAAG,SAAS,OAAb,CAAP,GAA+B,MAAM,CAAC,IAAP,CAAY,QAAQ,CAAC,MAArB,EAA6B,QAA7B,EAAuC,QAAvC,CAAgD,KAAhD,EAAuD,WAAvD,EAA/B;;AAEA,gBAAI,MAAI,CAAC,cAAT,EAAyB;AACvB,oBAAM,QAAQ,CAAC,uBAAT,CAAiC,IAAjC,EAAuC,MAAvC,EAA6C,IAA7C,CAAN;AACA,cAAA,YAAY,CAAC,oBAAK,IAAL,CAAD,CAAZ,GAA2B,QAA3B;AACD;;AAED,kBAAM,WAAW,GAAG,OAAO,yBAAK,iBAAL,EAAc,CAAC,GAAD,EAAM,IAAN,CAAd,CAAP,EAAmC,IAAnC,EAApB,CAdwD,CAexD;;AACA,kBAAM,KAAK,GAAG,WAAW,CAAC,KAAZ,CAAkB,2BAAlB,CAAd;;AACA,gBAAI,KAAK,IAAI,IAAb,EAAmB;AACjB,iCAAI,IAAJ,CAAS;AAAC,gBAAA,MAAM,EAAE;AAAT,eAAT,EAAgC,oCAAhC;AACD,aAFD,MAGK;AACH,cAAA,aAAa,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAD,CAAN,EAAW,EAAX,CAAzB;AACD;AACF,WAvBK;;AAAA;AAAA;AAAA;AAAA,YAAN;AAwBD;;AAED,MAAA,MAAI,CAAC,qCAAL,CAA2C,OAA3C;;AACA,UAAI,UAAJ,EAAgB;AACd,cAAM,eAAe,GAAG,OAAxB;AACA,QAAA,OAAO,CAAC,uBAAR,GAAkC,eAAe,CAAC,qBAAhB,IAAyC,MAA3E;AACA,QAAA,OAAO,CAAC,eAAR,GAA0B,eAAe,CAAC,aAAhB,WAAwC,sCAAkB,CAAC,OAAD,CAAlB,CAAxC,CAA1B;AACD,OAJD,MAKK;AACH,cAAM,MAAI,CAAC,gBAAL,CAAsB,QAAtB,EAAgC,OAAhC,CAAN;AACD;;AAED,UAAI,aAAa,KAAK,CAAtB,EAAyB;AACvB;AACA,QAAA,OAAO,CAAC,cAAR,GAAyB,IAAI,CAAC,KAAL,CAAW,aAAa,GAAG,IAA3B,CAAzB;AACD;;AAED,UAAI,QAAQ,CAAC,WAAT,KAAyB,OAA7B,EAAsC;AACpC,QAAA,QAAQ,CAAC,WAAT,GAAuB,KAAvB;AACD,OAFD,MAGK;AACH;AACA;AACA;AACA,QAAA,QAAQ,CAAC,aAAT,GAAyB,MAAzB;;AACA,YAAI,CAAC,MAAI,CAAC,cAAV,EAA0B;AACxB,UAAA,OAAO,CAAC,QAAR,GAAmB,MAAnB;AACD;AACF;;AAED,MAAA,KAAK,CAAC,OAAD,CAAL;AACA,MAAA,KAAK,CAAC,QAAD,CAAL;;AAEA,UAAI,QAAQ,CAAC,eAAT,CAAyB,uBAAzB,IAAoD,IAApD,WAAkE,QAAQ,CAAC,eAAT,CAAyB,uBAAzB,CAAiD,CAAC,OAAD,EAAU,QAAV,CAAjD,CAAlE,CAAJ,EAA6I;AAC3I;AACD;;AAED,YAAM,YAAY,SAAS,MAAI,CAAC,kCAAL,EAA3B;AACA,YAAM,MAAM,GAAG,UAAU,SAAS,0BAAS,IAAI,CAAC,IAAL,CAAU,4BAAV,EAA4B,cAA5B,CAAT,EAAsD,MAAtD,CAAT,SAA+E,MAAI,CAAC,+BAAL,CAAqC,OAArC,EAA8C,QAA9C,EAAwD,aAAxD,EAAuE,YAAvE,CAAxG;AACA,YAAM,MAAI,CAAC,eAAL,CAAqB,OAArB,EAA8B,QAA9B,EAAwC,YAAY,UAAS,MAAI,CAAC,kBAAL,CAAwB,MAAxB,EAAgC,IAAhC,CAAT,CAApD,CAAN;AACA,YAAM,OAAO,CAAC,GAAR,CAAiB,CAAC,QAAQ,CAAC,IAAT,CAAc,aAAd,CAAD,EAA+B,OAAO,CAAC,oBAAR,IAAgC,IAAhC,GAAuC,OAAO,CAAC,OAAR,EAAvC,GAA2D,wBAAO,OAAO,CAAC,oBAAf,CAA1F,CAAjB,CAAN;AAEA,YAAM,gBAAgB,GAAG,0CAAiB,iBAAjB,IAAsC,iBAAtC,GAA0D,MAAI,CAAC,2BAAL,EAAnF;AAEA,UAAI,UAAJ;;AACA,UAAI,MAAI,CAAC,cAAT,EAAyB;AACvB,QAAA,UAAU,GAAG,0EAAoC,aAApC,EAAmD,YAAnD,CAAb;AACD,OAFD,MAGK,IAAI,MAAI,CAAC,wBAAT,EAAmC;AACtC,QAAA,UAAU,SAAS,qDAAe,aAAf,EAA8B,MAA9B,EAAoC,QAApC,EAA8C,gBAA9C,CAAnB;AACD;;AAED,UAAI,UAAU,IAAI,IAAd,IAAsB,YAAtB,IAAsC,QAA1C,EAAoD;AAClD,QAAA,UAAU,CAAC,qBAAX,GAAmC,IAAnC;AACD;;AAED,YAAM,QAAQ,CAAC,IAAT,CAAc,0BAAd,CAAyC;AAC7C,QAAA,IAAI,EAAE,aADuC;AAE7C,QAAA,UAF6C;AAG7C,QAAA,MAAM,EAAE,MAHqC;AAI7C,QAAA,QAJ6C;AAK7C,QAAA,IAAI,EAAE,MAAI,CAAC,KAAL,CAAW,IAAX,KAAoB,CAApB,GAAwB,MAAI,CAAC,KAAL,CAAW,IAAX,GAAkB,IAAlB,GAAyB,KAAjD,GAAyD,IALlB;AAM7C,QAAA,gBAN6C;AAO7C,QAAA,iBAAiB,EAAE,CAAC,MAAI,CAAC;AAPoB,OAAzC,CAAN;AA7J0B;AAsK3B;;AAES,EAAA,2BAA2B,GAAA;AACnC,UAAM,OAAO,GAAG,KAAK,QAAL,CAAc,OAA9B;AACA,UAAM,UAAU,GAAG,OAAO,CAAC,IAAR,CAAa,WAAb,OAA+B,OAAO,CAAC,IAAvC,GAA8C,QAA9C,GAAyD,QAA5E;AACA,WAAO,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,UAAL,GAAkB,EAAlB,GAAuB,UAAU,GAAG,OAAO,CAAC,OAAO,MAA7E;AACD;;AAED,MAAY,gBAAZ,GAA4B;AAC1B,WAAO,KAAK,OAAL,CAAa,OAAb,KAAyB,KAAhC;AACD;;AAED,MAAI,cAAJ,GAAkB;AAChB,WAAO,KAAP;AACD;;AAEa,EAAA,+BAAN,CAAsC,OAAtC,EAAoD,QAApD,EAAmE,aAAnE,EAA0F,YAA1F,EAA8G;AAAA;;AAAA;AACpH,YAAM,QAAQ,GAAG,MAAI,CAAC,QAAtB;AACA,YAAM,gBAAgB,SAAS,QAAQ,CAAC,WAAT,CAAqB,MAAI,CAAC,OAAL,CAAa,MAAlC,EAA0C,eAA1C,CAA/B;AACA,YAAM,MAAM,SAAS,0BAAS,gBAAgB,IAAI,IAAI,CAAC,IAAL,CAAU,4BAAV,EAA4B,eAA5B,CAA7B,EAA2E,MAA3E,CAArB;;AAEA,UAAI,gBAAgB,IAAI,IAAxB,EAA8B;AAC5B,2BAAI,IAAJ,CAAS;AAAC,UAAA,MAAM,EAAE;AAAT,SAAT,EAAiD,+CAAjD;;AACA,eAAO,MAAP;AACD,OARmH,CAUpH;AACA;;;AACA,YAAM,eAAe,GAAG,IAAI,CAAC,IAAL,CAAU,MAAI,CAAC,MAAf,EAAuB,kBAAkB,MAAI,CAAC,IAAI,IAAI,MAAI,CAAC,QAAL,CAAc,OAAd,CAAsB,aAAa,MAAzF,CAAxB;AACA,YAAM,KAAK,GAAG,OAAO,CAAC,QAAR,KAAqB,OAAnC;AACA,MAAA,OAAO,CAAC,iBAAR,GAA4B,IAA5B;AACA,MAAA,OAAO,CAAC,oBAAR,GAA+B,KAAK,GAAG,eAAH,GAAqB,IAAI,CAAC,KAAL,CAAW,IAAX,CAAgB,IAAhB,EAAsB,eAAtB,CAAzD;AACA,YAAM,MAAI,CAAC,eAAL,CAAqB,OAArB,EAA8B,QAA9B,EAAwC,YAAY,UAAS,MAAI,CAAC,kBAAL,CAAwB,MAAxB,EAAgC,KAAhC,CAAT,CAApD,CAAN;AACA,YAAM,sBAAS,aAAT,CAAN;AACA,YAAM,QAAQ,CAAC,IAAT,CAAc,eAAd,EAA+B,4BAA/B,CAAN;AAEA,aAAO,OAAO,CAAC,iBAAf,CApBoH,CAqBpH;;AACA,MAAA,OAAO,CAAC,oBAAR,GAA+B,eAA/B;AACA,aAAO,MAAP;AAvBoH;AAwBrH;;AAEO,EAAA,iBAAiB,GAAA;AACvB;AACA;AACA,UAAM,QAAQ,GAAG,KAAK,OAAL,CAAa,QAAb,IAAyB,MAA1C;AACA,UAAM,OAAO,GAAG,KAAK,QAAL,CAAc,OAA9B;AACA,UAAM,UAAU,GAAG,CACjB,SAAS,QAAQ,iBAAiB,OAAO,CAAC,WAAW,GADpC,EAEjB,SAAS,QAAQ,oBAAoB,OAAO,CAAC,OAAO,GAFnC,EAGjB,SAAS,QAAQ,oBAAoB,OAAO,CAAC,SAAS,GAHrC,EAIjB,SAAS,QAAQ,qBAAqB,OAAO,CAAC,WAAW,GAJxC,EAKjB,SAAS,QAAQ,iBAAiB,OAAO,CAAC,YAAY,GALrC,CAAnB;AAOA,4BAAI,KAAK,QAAL,CAAc,4BAAd,CAA2C,eAA/C,EAAgE,EAAE,IAAI,UAAU,CAAC,IAAX,CAAgB,SAAS,QAAQ,qBAAqB,EAAE,GAAxD,CAAtE;AACA,4BAAI,OAAO,CAAC,WAAZ,EAAyB,EAAE,IAAI,UAAU,CAAC,IAAX,CAAgB,SAAS,QAAQ,iBAAiB,EAAE,GAApD,CAA/B;AACA,WAAO,UAAP;AACD;;AAES,EAAA,gBAAgB,CAAC,QAAD,EAAoB,OAApB,EAAgC;AACxD,UAAM,QAAQ,GAAG,KAAK,QAAtB;AACA,UAAM,OAAO,GAAG,KAAK,OAArB;AAEA,UAAM,gBAAgB,GAAG,KAAI,+BAAJ,EAAqB,QAAQ,CAAC,IAAT,CAAc,iBAAnC,CAAzB;;AAEA,QAAI,QAAJ,EAAc;AACZ,MAAA,OAAO,CAAC,SAAR,GAAoB,IAApB;;AAEA,UAAI,OAAO,CAAC,cAAR,KAA2B,KAA/B,EAAsC;AACpC,QAAA,OAAO,CAAC,gBAAR,GAA2B,IAA3B;AACD;;AAED,MAAA,gBAAgB,CAAC,GAAjB;AAAA;AAAA,oCAAqB,aAAW;AAC9B,cAAM,mBAAmB,SAAS,QAAQ,CAAC,WAAT,CAAqB,OAAO,CAAC,mBAA7B,EAAkD,yBAAlD,CAAlC;;AACA,YAAI,mBAAmB,IAAI,IAA3B,EAAiC;AAC/B,UAAA,OAAO,CAAC,UAAR,GAAqB,mBAArB;AACD;AACF,OALD;AAMD,KAbD,MAcK;AACH,UAAI,OAAO,CAAC,cAAR,KAA2B,KAA/B,EAAsC;AACpC,QAAA,OAAO,CAAC,qBAAR,GAAgC,IAAhC;AACD;;AAED,MAAA,gBAAgB,CAAC,GAAjB;AAAA;AAAA,oCAAqB,aAAW;AAC9B,cAAM,eAAe,SAAS,QAAQ,CAAC,WAAT,CAAqB,OAAO,CAAC,eAA7B,EAA8C,qBAA9C,CAA9B;;AACA,YAAI,eAAe,IAAI,IAAvB,EAA6B;AAC3B,UAAA,OAAO,CAAC,eAAR,GAA0B,IAA1B;AACA,UAAA,OAAO,CAAC,qBAAR,GAAgC,IAAhC;AACA,UAAA,OAAO,CAAC,sBAAR,GAAiC,eAAjC;AACD;AACF,OAPD;AASA,MAAA,gBAAgB,CAAC,GAAjB;AAAA;AAAA,oCAAqB,aAAW;AAC9B,cAAM,MAAM,GAAG,OAAO,QAAQ,CAAC,WAAT,CAAqB,OAAO,CAAC,gBAA7B,EAA+C,sBAA/C,CAAP,KAAkF,wDAAjG;AACA,QAAA,OAAO,CAAC,4BAAR,GAAuC,MAAvC;AACA,QAAA,OAAO,CAAC,8BAAR,GAAyC,OAAO,QAAQ,CAAC,WAAT,CAAqB,OAAO,CAAC,kBAA7B,EAAiD,wBAAjD,CAAP,KAAsF,MAA/H;AACD,OAJD;;AAMA,UAAI,OAAO,CAAC,cAAR,KAA2B,KAA/B,EAAsC;AACpC,QAAA,OAAO,CAAC,qCAAR,GAAgD,IAAhD;AACD;AACF;;AAED,QAAI,OAAO,CAAC,UAAR,KAAuB,IAA3B,EAAiC;AAC/B,MAAA,OAAO,CAAC,0BAAR,GAAqC,IAArC;AACD;;AAED,QAAI,CAAC,QAAD,IAAa,OAAO,CAAC,UAAR,KAAuB,IAAxC,EAA8C;AAC5C,MAAA,OAAO,CAAC,mCAAR,GAA8C,IAA9C;AACD;;AAED,QAAI,OAAO,CAAC,kCAAZ,EAAgD;AAC9C,UAAI,QAAJ,EAAc;AACZ,cAAM,KAAI,wCAAJ,EAA8B,2GAA9B,CAAN;AACD;;AACD,MAAA,OAAO,CAAC,kCAAR,GAA6C,IAA7C;AACD;;AAED,UAAM,aAAa,GAAG,gEAAoB,OAApB,EAA6B,QAA7B,CAAtB;;AAEA,QAAI,aAAa,CAAC,YAAd,IAA8B,IAAlC,EAAwC;AACtC,MAAA,OAAO,CAAC,aAAR,GAAwB,aAAa,CAAC,YAAtC;AACD;;AAED,IAAA,OAAO,CAAC,aAAR,GAAwB,aAAa,CAAC,YAAtC;;AAEA,QAAI,OAAO,CAAC,wBAAZ,EAAsC;AACpC,MAAA,OAAO,CAAC,4BAAR,GAAuC,IAAvC;AACD;;AAED,IAAA,gBAAgB,CAAC,GAAjB;AAAA;AAAA,kCAAqB,aAAW;AAC9B,YAAM,eAAe,SAAS,QAAQ,CAAC,WAAT,CAAqB,OAAO,CAAC,eAA7B,EAA8C,qBAA9C,CAA9B;;AACA,UAAI,eAAe,IAAI,IAAvB,EAA6B;AAC3B;AACA,QAAA,OAAO,CAAC,gBAAR,GAA2B,eAA3B;AACA,QAAA,OAAO,CAAC,UAAR,GAAqB,eAArB;AACD;AACF,KAPD;AASA,IAAA,OAAO,CAAC,sBAAR,GAAiC,QAAQ,CAAC,WAAT,CAAqB,OAAO,CAAC,oBAAR,IAAgC,2BAArD,EAAkF,IAAlF,EAAwF,EAAxF,EAA4F,KAA5F,CAAjC;;AACA,QAAI,aAAa,CAAC,uBAAd,KAA0C,qEAA8B,KAA5E,EAAmF;AACjF,MAAA,OAAO,CAAC,8BAAR,GAAyC,IAAzC;AACD;;AACD,QAAI,aAAa,CAAC,uBAAd,KAA0C,qEAA8B,MAA5E,EAAoF;AAClF,MAAA,OAAO,CAAC,yBAAR,GAAoC,IAApC;AACD;;AACD,QAAI,CAAC,aAAa,CAAC,yBAAnB,EAA8C;AAC5C,MAAA,OAAO,CAAC,iCAAR,GAA4C,IAA5C;AACD;;AAED,QAAI,OAAO,CAAC,uBAAR,KAAoC,IAAxC,EAA8C;AAC5C,MAAA,OAAO,CAAC,qBAAR,GAAgC,IAAhC;AACD;;AAED,WAAO,gBAAgB,CAAC,UAAjB,EAAP;AACD;;AAEO,EAAA,qCAAqC,CAAC,OAAD,EAAa;AACxD,UAAM,OAAO,GAAG,KAAK,QAAL,CAAc,OAA9B;AACA,UAAM,WAAW,GAAG,OAAO,CAAC,WAA5B;;AACA,QAAI,WAAW,IAAI,IAAnB,EAAyB;AACvB,MAAA,OAAO,CAAC,YAAR,GAAuB,WAAvB;AACD,KALuD,CAOxD;;;AACA,QAAI,OAAO,CAAC,YAAR,KAAyB,OAAO,CAAC,eAArC,EAAsD;AACpD,MAAA,OAAO,CAAC,oBAAR,GAA+B,OAAO,CAAC,eAAvC;AACD;;AAED,QAAI,KAAK,cAAT,EAAyB;AACvB,MAAA,OAAO,CAAC,sBAAR,GAAiC,GAAG,OAAO,CAAC,mBAAmB,KAAK,mDAA6B,EAAjG;AACD,KAFD,MAGK;AACH,MAAA,OAAO,CAAC,wBAAR,GAAmC,GAAG,OAAO,CAAC,mBAAmB,KAAK,qDAA+B,EAArG;AACD;;AAED,QAAI,CAAC,KAAK,cAAN,IAAwB,OAAO,CAAC,aAAR,IAAyB,IAArD,EAA2D;AACzD,YAAM,OAAO,GAAG,KAAK,OAArB;;AACA,UAAI,OAAO,CAAC,MAAZ,EAAoB;AAClB,QAAA,OAAO,CAAC,eAAR,GAA0B,IAA1B;AACD;;AAED,MAAA,OAAO,CAAC,kBAAR,GAA6B,OAAO,CAAC,MAAR,GAAiB,KAAjB,GAAyB,IAAtD;AACD;AACF;;AAEa,EAAA,eAAN,CAAsB,OAAtB,EAAoC,QAApC,EAAmD,MAAnD,EAAiE;AAAA;;AAAA;AACvE,YAAM,IAAI,GAAmB,MAAI,CAAC,OAAL,CAAa,gBAAb,KAAkC,KAAnC,GAA4C,EAA5C,GAAiD,CAAC,KAAD,CAA7E;;AACA,WAAK,MAAM,IAAX,IAAmB,MAAM,CAAC,IAAP,CAAY,OAAZ,CAAnB,EAAyC;AACvC,cAAM,KAAK,GAAG,OAAO,CAAC,IAAD,CAArB;;AACA,YAAI,KAAK,IAAI,IAAb,EAAmB;AACjB,UAAA,IAAI,CAAC,IAAL,CAAU,KAAK,IAAI,EAAnB;AACD,SAFD,MAGK;AACH,UAAA,IAAI,CAAC,IAAL,CAAU,KAAK,IAAI,IAAI,KAAK,EAA5B;AACD;AACF;;AAED,WAAK,MAAM,IAAX,IAAmB,MAAM,CAAC,IAAP,CAAY,QAAZ,CAAnB,EAA0C;AACxC,cAAM,KAAK,GAAG,QAAQ,CAAC,IAAD,CAAtB;;AACA,YAAI,KAAK,CAAC,OAAN,CAAc,KAAd,CAAJ,EAA0B;AACxB,eAAK,MAAM,CAAX,IAAgB,KAAhB,EAAuB;AACrB,YAAA,IAAI,CAAC,IAAL,CAAU,KAAK,IAAI,IAAI,CAAC,EAAxB;AACD;AACF,SAJD,MAKK;AACH,UAAA,IAAI,CAAC,IAAL,CAAU,KAAK,IAAI,IAAI,KAAK,EAA5B;AACD;AACF;;AAED,MAAA,IAAI,CAAC,IAAL,CAAU,GAAV;;AAEA,UAAI,MAAI,CAAC,QAAL,CAAc,WAAd,CAA0B,SAA9B,EAAyC;AACvC,QAAA,MAAI,CAAC,QAAL,CAAc,WAAd,CAA0B,GAA1B,CAA8B,aAA9B,EAA6C,MAA7C;AACD;;AAED,YAAM,QAAQ,SAAS,sBAAU,KAAjC;AACA,YAAM,OAAO,GAAG,IAAI,CAAC,IAAL,CAAU,QAAV,EAAoB,OAAO,CAAC,QAAR,KAAqB,QAArB,GAAgC,KAAhC,GAAyC,OAAO,CAAC,QAAR,KAAqB,OAArB,GAA+B,KAA/B,GAAuC,OAApG,EAA8G,OAAO,CAAC,QAAR,KAAqB,OAArB,GAA+B,cAA/B,GAAgD,UAA9J,CAAhB;AACA,YAAM,kCAAc,OAAd,EAAuB,IAAvB,EAA6B,MAA7B,EAAqC;AACzC;AACA,QAAA,GAAG,EAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,OAAO,CAAC,GAAd,EAAiB;AAAE,UAAA,OAAO,EAAE;AAAX,SAAjB,CAFsC;AAGzC,QAAA,GAAG,EAAE;AAHoC,OAArC,CAAN;AAhCuE;AAqCxE;;AAEa,EAAA,kCAAN,GAAwC;AAAA;;AAAA;AAC9C,YAAM,QAAQ,GAAG,MAAI,CAAC,QAAtB;AACA,YAAM,OAAO,GAAG,MAAI,CAAC,OAArB;AACA,YAAM,eAAe,GAAG,KAAI,0CAAJ,GAAxB;AACA,YAAM,gBAAgB,GAAG,KAAI,4BAAJ,EAAqB,OAArB,CAAzB;AAEA,MAAA,eAAe,CAAC,OAAhB,CAAwB,IAAI,CAAC,IAAL,CAAU,4BAAV,EAA4B,SAA5B,EAAuC,cAAvC,CAAxB;AAEA,YAAM,UAAU,GAAG,IAAI,CAAC,IAAL,CAAU,4BAAV,EAA4B,SAA5B,CAAnB;AACA,MAAA,eAAe,CAAC,aAAhB,CAA8B,UAA9B;AACA,MAAA,eAAe,CAAC,KAAhB,CAAsB,CAAC,SAAD,EAAY,WAAZ,EAAyB,gBAAzB,EAA2C,qBAA3C,EAAkE,iBAAlE,EAAqF,UAArF,EAAiG,aAAjG,CAAtB;AAEA,2CAAoB,eAApB,EAAqC,gBAArC;AAEA,YAAM,WAAW,GAAG,KAAI,+BAAJ,EAAqB,QAAQ,CAAC,IAAT,CAAc,iBAAnC,CAApB;AAEA,YAAM,UAAU,GAAG,MAAI,CAAC,gBAAL,GAAwB,aAAxB,GAAwC,UAA3D;AACA,MAAA,WAAW,CAAC,GAAZ;AAAA;AAAA,oCAAgB,aAAW;AACzB,QAAA,eAAe,CAAC,YAAhB,CAA6B,UAA7B,EAAyC,IAAI,CAAC,IAAL,QAAgB,uBAAuB,CAAC,KAAxC,GAA+C,SAA/C,EAA0D,UAA1D,CAAzC;AACD,OAFD;AAIA,MAAA,WAAW,CAAC,GAAZ;AAAA;AAAA,oCAAgB,aAAW;AACzB,cAAM,aAAa,GAAG,IAAI,CAAC,IAAL,CAAU,QAAQ,CAAC,IAAT,CAAc,iBAAxB,EAA2C,UAA3C,CAAtB;AACA,cAAM,IAAI,SAAS,sBAAW,aAAX,CAAnB;;AACA,YAAI,IAAI,IAAI,IAAR,IAAgB,IAAI,CAAC,WAAL,EAApB,EAAwC;AACtC,UAAA,eAAe,CAAC,YAAhB,CAA6B,UAA7B,EAAyC,aAAzC;AACD;AACF,OAND;AAQA,MAAA,WAAW,CAAC,OAAZ,CAAoB,6CAA4B,cAA5B,EAA4C,QAA5C,EAAsD,eAAtD,EAAuE,gBAAvE,CAApB;;AAEA,UAAI,CAAC,MAAI,CAAC,UAAV,EAAsB;AACpB,YAAI,OAAO,CAAC,QAAR,KAAqB,KAAzB,EAAgC;AAC9B,UAAA,WAAW,CAAC,OAAZ,CAAoB,6CAA4B,sBAA5B,EAAoD,QAApD,EAA8D,eAA9D,EAA+E,gBAA/E,CAApB;AACD;;AAED,QAAA,WAAW,CAAC,GAAZ;AAAA;AAAA,sCAAgB,aAAW;AACzB,gBAAM,aAAa,SAAS,QAAQ,CAAC,WAAT,CAAqB,MAAI,CAAC,OAAL,CAAa,OAAlC,EAA2C,eAA3C,CAA5B;;AACA,cAAI,aAAa,IAAI,IAArB,EAA2B;AACzB,YAAA,eAAe,CAAC,aAAhB,CAA8B,QAAQ,CAAC,IAAT,CAAc,iBAA5C;AACA,YAAA,eAAe,CAAC,OAAhB,CAAwB,aAAxB;AACD;AACF,SAND;AAOD;;AAED,YAAM,WAAW,CAAC,UAAZ,EAAN;AACA,aAAO,eAAe,CAAC,KAAhB,EAAP;AA9C8C;AA+C/C;;AAEa,EAAA,kBAAN,CAAyB,cAAzB,EAAiD,WAAjD,EAAqE;AAAA;;AAAA;AAC3E,YAAM,QAAQ,GAAG,MAAI,CAAC,QAAtB;AACA,YAAM,OAAO,GAAG,MAAI,CAAC,OAArB;AACA,YAAM,gBAAgB,GAAG,KAAI,4BAAJ,EAAqB,OAArB,CAAzB;AAEA,YAAM,eAAe,GAAG,KAAI,0CAAJ,GAAxB;AACA,YAAM,WAAW,GAAG,KAAI,+BAAJ,EAAqB,QAAQ,CAAC,IAAT,CAAc,iBAAnC,CAApB;;AAEA,UAAI,WAAJ,EAAiB;AACf;AACA,QAAA,WAAW,CAAC,GAAZ,CAAgB,MAAM,uCAAmB,QAAnB,EAA6B,OAA7B,EAAsC,eAAtC,EAAuD,gBAAgB,CAAC,KAAxE,CAAtB;AACD;;AAED,YAAM,WAAW,CAAC,UAAZ,EAAN;;AAEA,UAAI,MAAI,CAAC,UAAT,EAAqB;AACnB,eAAO,eAAe,CAAC,KAAhB,KAA0B,cAAjC;AACD;;AAED,YAAM,2BAA2B,GAAG,MAAI,CAAC,8BAAL,EAApC;;AACA,UAAI,2BAA2B,IAAI,IAA/B,IAAuC,2BAA2B,CAAC,MAA5B,KAAuC,CAAlF,EAAqF;AACnF,aAAK,MAAM,CAAC,IAAD,EAAO,GAAP,CAAX,IAA0B,MAAI,CAAC,KAAL,CAAW,OAAX,EAA1B,EAAgD;AAC9C,gBAAM,wBAAwB,CAAC,2BAAD,EAA8B,GAA9B,EAAmC,IAAnC,EAAyC,eAAzC,CAA9B;AACD;AACF;;AAED,YAAM,gBAAgB,GAAG,QAAQ,CAAC,gBAAlC;;AACA,UAAI,gBAAgB,CAAC,MAAjB,KAA4B,CAAhC,EAAmC;AAEjC,QAAA,eAAe,CAAC,OAAhB,CAAwB,IAAI,CAAC,IAAL,CAAU,IAAI,CAAC,IAAL,CAAU,4BAAV,EAA4B,SAA5B,CAAV,EAAkD,qBAAlD,CAAxB;;AACA,YAAI,WAAJ,EAAiB;AACf,gBAAM,8BAA8B,GAAG,KAAI,0CAAJ,GAAvC;;AACA,eAAK,MAAM,IAAX,IAAmB,gBAAnB,EAAqC;AACnC,kBAAM,UAAU,GAAG,4BAAQ,IAAI,CAAC,GAAb,EAAkB,GAAlB,CAAsB,gCAAtB,CAAnB;;AACA,iBAAK,MAAM,GAAX,IAAkB,UAAlB,EAA8B;AAC5B,oBAAM,UAAU,SAAS,QAAQ,CAAC,WAAT,CAAqB,4CAAwB,IAAI,CAAC,IAA7B,EAAmC,KAAnC,CAArB,EAAgE,GAAG,UAAU,CAAC,CAAD,CAAG,MAAhF,CAAzB;AACA,kBAAI,iBAAiB,GAAG,WAAxB;;AACA,kBAAI,UAAU,IAAI,IAAlB,EAAwB;AACtB,gBAAA,iBAAiB,GAAG,wBAAwB,IAAI,CAAC,QAAL,CAAc,UAAd,CAAyB,EAArE;AACA,gBAAA,8BAA8B,CAAC,IAA/B,CAAoC,iBAApC,EAAuD,UAAvD;AACD;;AAED,oBAAM,IAAI,GAAG,IAAI,iBAAiB,GAAlC;AACA,oBAAM,WAAW,GAAG,cAAc,QAAQ,CAAC,OAAT,CAAiB,WAAW,GAA9D;AACA,oBAAM,OAAO,GAAG,sBAAhB;AACA,cAAA,8BAA8B,CAAC,WAA/B,CAA2C,eAA3C,EAA4D,IAAI,GAAG,MAAM,IAAI,CAAC,IAAL,IAAa,GAAG,MAAM,IAAI,CAAC,WAAL,IAAoB,EAAE,KAAK,IAAI,IAAI,WAAW,IAAI,OAAO,EAAxJ;AACD;AACF;;AACD,UAAA,eAAe,CAAC,KAAhB,CAAsB,0BAAtB,EAAkD,8BAAlD;AACD,SAnBD,MAoBK;AACH,gBAAM,gCAAgC,GAAG,KAAI,0CAAJ,GAAzC;;AACA,eAAK,MAAM,IAAX,IAAmB,gBAAnB,EAAqC;AACnC,iBAAK,MAAM,GAAX,IAAkB,4BAAQ,IAAI,CAAC,GAAb,CAAlB,EAAqC;AACnC,cAAA,gCAAgC,CAAC,WAAjC,CAA6C,iBAA7C,EAAgE,IAAI,sCAAa,GAAb,CAAiB,MAAM,IAAI,CAAC,IAAL,IAAa,GAAG,GAA3G;AACD;AACF;;AACD,UAAA,eAAe,CAAC,KAAhB,CAAsB,4BAAtB,EAAoD,gCAApD;AACD;AACF;;AAED,aAAO,eAAe,CAAC,KAAhB,KAA0B,cAAjC;AA7D2E;AA8D5E;;AA/kBmC;;;;SAklBvB,wB;;;;;4DAAf,WAAwC,2BAAxC,EAAoF,GAApF,EAAiG,IAAjG,EAA6G,eAA7G,EAAiJ;AAC/I,UAAM,YAAY,GAAG,IAAI,CAAC,IAAL,CAAU,GAAV,EAAe,WAAf,CAArB;AACA,UAAM,OAAO,SAAS,sBAAW,YAAX,CAAtB;;AACA,QAAI,OAAO,IAAI,IAAX,IAAmB,CAAC,OAAO,CAAC,WAAR,EAAxB,EAA+C;AAC7C;AACD;;AAED,UAAM,WAAW,GAAG,GAAG,IAAI,CAAC,GAAG,cAA/B;AACA,UAAM,mBAAmB,SAAS,gBAAK,YAAL,EAAmB,CAAC,IAAD,EAAO,IAAP,KAAe;AAClE,UAAI,IAAI,CAAC,WAAL,EAAJ,EAAwB;AACtB,eAAO,CAAC,IAAI,CAAC,QAAL,CAAc,WAAd,CAAR;AACD,OAFD,MAGK;AACH,eAAO,2BAA2B,CAAC,IAA5B,CAAiC,EAAE,IAAI,IAAI,CAAC,QAAL,CAAc,EAAd,CAAvC,CAAP;AACD;AACF,KAPiC,CAAlC;;AASA,QAAI,mBAAmB,CAAC,MAApB,KAA+B,CAAnC,EAAsC;AACpC,YAAM,KAAK,GAAG,KAAI,0CAAJ,GAAd;;AACA,WAAK,MAAM,IAAX,IAAmB,mBAAnB,EAAwC;AACtC,QAAA,KAAK,CAAC,IAAN,CAAW,aAAa,IAAI,CAAC,QAAL,CAAc,GAAd,EAAmB,IAAnB,EAAyB,OAAzB,CAAiC,KAAjC,EAAwC,IAAxC,CAA6C,EAArE,EAAyE,IAAzE;AACD;;AACD,MAAA,eAAe,CAAC,KAAhB,CAAsB,eAAe,oBAAK,IAAL,CAAU,EAA/C,EAAmD,KAAnD;AACD;AACF,G;;;;SAEc,qB;;;;;;yDAAf,WAAqC,IAArC,EAAiD;AAC/C,WAAO;AACL,MAAA,IAAI,EAAE,IADD;AAEL,MAAA,IAAI,EAAE,OAAO,sBAAK,IAAL,CAAP,EAAmB,IAFpB;AAGL,MAAA,MAAM,QAAQ,sBAAS,IAAT;AAHT,KAAP;AAKD,G","sourcesContent":["import { path7za } from \"7zip-bin\"\nimport BluebirdPromise from \"bluebird-lst\"\nimport { executeAppBuilder, Arch, asArray, AsyncTaskManager, getPlatformIconFileName, InvalidConfigurationError, log, spawnAndWrite, use, exec } from \"builder-util\"\nimport { PackageFileInfo, UUID, CURRENT_APP_PACKAGE_FILE_NAME, CURRENT_APP_INSTALLER_FILE_NAME } from \"builder-util-runtime\"\nimport { getBinFromUrl } from \"../../binDownload\"\nimport { statOrNull, walk } from \"builder-util/out/fs\"\nimport { hashFile } from \"../../util/hash\"\nimport _debug from \"debug\"\nimport { readFile, stat, unlink } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { Target } from \"../../core\"\nimport { DesktopShortcutCreationPolicy, getEffectiveOptions } from \"../../options/CommonWindowsInstallerConfiguration\"\nimport { isSafeGithubName, normalizeExt } from \"../../platformPackager\"\nimport { time } from \"../../util/timer\"\nimport { execWine } from \"../../wine\"\nimport { WinPackager } from \"../../winPackager\"\nimport { archive, ArchiveOptions } from \"../archive\"\nimport { appendBlockmap, configureDifferentialAwareArchiveOptions, createBlockmap, createNsisWebDifferentialUpdateInfo } from \"../differentialUpdateInfoBuilder\"\nimport { getWindowsInstallationDirName } from \"../targetUtil\"\nimport { addCustomMessageFileInclude, createAddLangsMacro, LangConfigurator } from \"./nsisLang\"\nimport { computeLicensePage } from \"./nsisLicense\"\nimport { NsisOptions, PortableOptions } from \"./nsisOptions\"\nimport { NsisScriptGenerator } from \"./nsisScriptGenerator\"\nimport { AppPackageHelper, NSIS_PATH, nsisTemplatesDir } from \"./nsisUtil\"\n\nconst debug = _debug(\"electron-builder:nsis\")\n\n// noinspection SpellCheckingInspection\nconst ELECTRON_BUILDER_NS_UUID = UUID.parse(\"50e065bc-3134-11e6-9bab-38c9862bdaf3\")\n\n// noinspection SpellCheckingInspection\nconst nsisResourcePathPromise = new Lazy(() => getBinFromUrl(\"nsis-resources\", \"3.3.0\", \"4okc98BD0v9xDcSjhPVhAkBMqos+FvD/5/H72fTTIwoHTuWd2WdD7r+1j72hxd+ZXxq1y3FRW0x6Z3jR0VfpMw==\"))\n\nconst USE_NSIS_BUILT_IN_COMPRESSOR = false\n\nexport class NsisTarget extends Target {\n  readonly options: NsisOptions\n\n  /** @private */\n  readonly archs: Map<Arch, string> = new Map()\n\n  constructor(readonly packager: WinPackager, readonly outDir: string, targetName: string, protected readonly packageHelper: AppPackageHelper) {\n    super(targetName)\n\n    this.packageHelper.refCount++\n\n    this.options = targetName === \"portable\" ? Object.create(null) : {\n      ...this.packager.config.nsis,\n      preCompressedFileExtensions: [\".avi\", \".mov\", \".m4v\", \".mp4\", \".m4p\", \".qt\", \".mkv\", \".webm\", \".vmdk\"],\n    }\n\n    if (targetName !== \"nsis\") {\n      Object.assign(this.options, (this.packager.config as any)[targetName === \"nsis-web\" ? \"nsisWeb\" : targetName])\n    }\n\n    const deps = packager.info.metadata.dependencies\n    if (deps != null && deps[\"electron-squirrel-startup\"] != null) {\n      log.warn('\"electron-squirrel-startup\" dependency is not required for NSIS')\n    }\n  }\n\n  async build(appOutDir: string, arch: Arch) {\n    this.archs.set(arch, appOutDir)\n  }\n\n  get isBuildDifferentialAware() {\n    return !this.isPortable && this.options.differentialPackage !== false\n  }\n\n  private getPreCompressedFileExtensions(): Array<string> | null {\n    const result = this.isWebInstaller ? null : this.options.preCompressedFileExtensions\n    return result == null ? null : asArray(result).map(it => it.startsWith(\".\") ? it : `.${it}`)\n  }\n\n  /** @private */\n  async buildAppPackage(appOutDir: string, arch: Arch): Promise<PackageFileInfo> {\n    const options = this.options\n    const packager = this.packager\n\n    const isBuildDifferentialAware = this.isBuildDifferentialAware\n    const format = !isBuildDifferentialAware && options.useZip ? \"zip\" : \"7z\"\n    const archiveFile = path.join(this.outDir, `${packager.appInfo.sanitizedName}-${packager.appInfo.version}-${Arch[arch]}.nsis.${format}`)\n    const preCompressedFileExtensions = this.getPreCompressedFileExtensions()\n    const archiveOptions: ArchiveOptions = {\n      withoutDir: true,\n      compression: packager.compression,\n      excluded: preCompressedFileExtensions == null ? null : preCompressedFileExtensions.map(it => `*${it}`)\n    }\n\n    const timer = time(`nsis package, ${Arch[arch]}`)\n    await archive(format, archiveFile, appOutDir, isBuildDifferentialAware ? configureDifferentialAwareArchiveOptions(archiveOptions) : archiveOptions)\n    timer.end()\n\n    if (isBuildDifferentialAware && this.isWebInstaller) {\n      const data = await appendBlockmap(archiveFile)\n      return {\n        ...data,\n        path: archiveFile,\n      }\n    }\n    else {\n      return await createPackageFileInfo(archiveFile)\n    }\n  }\n\n  async finishBuild(): Promise<any> {\n    try {\n      await this.buildInstaller()\n    }\n    finally {\n      await this.packageHelper.finishBuild()\n    }\n  }\n\n  protected get installerFilenamePattern(): string {\n    // tslint:disable:no-invalid-template-strings\n    return \"${productName} \" + (this.isPortable ? \"\" : \"Setup \") + \"${version}.${ext}\"\n  }\n\n  private get isPortable() {\n    return this.name === \"portable\"\n  }\n\n  private async buildInstaller(): Promise<any> {\n    const packager = this.packager\n    const appInfo = packager.appInfo\n    const options = this.options\n    const installerFilename = packager.expandArtifactNamePattern(options, \"exe\", null, this.installerFilenamePattern)\n    const oneClick = options.oneClick !== false\n    const installerPath = path.join(this.outDir, installerFilename)\n\n    const logFields: any = {\n      target: this.name,\n      file: log.filePath(installerPath),\n      archs: Array.from(this.archs.keys()).map(it => Arch[it]).join(\", \"),\n    }\n    const isPerMachine = options.perMachine === true\n    if (!this.isPortable) {\n      logFields.oneClick = oneClick\n      logFields.perMachine = isPerMachine\n    }\n\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: this.name,\n      file: installerPath,\n      arch: null,\n    }, logFields)\n\n    const guid = options.guid || UUID.v5(appInfo.id, ELECTRON_BUILDER_NS_UUID)\n    const uninstallAppKey = guid.replace(/\\\\/g, \" - \")\n    const defines: any = {\n      APP_ID: appInfo.id,\n      APP_GUID: guid,\n      // Windows bug - entry in Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall cannot have \\ symbols (dir)\n      UNINSTALL_APP_KEY: uninstallAppKey,\n      PRODUCT_NAME: appInfo.productName,\n      PRODUCT_FILENAME: appInfo.productFilename,\n      APP_FILENAME: getWindowsInstallationDirName(appInfo, !oneClick || isPerMachine),\n      APP_DESCRIPTION: appInfo.description,\n      VERSION: appInfo.version,\n\n      PROJECT_DIR: packager.projectDir,\n      BUILD_RESOURCES_DIR: packager.info.buildResourcesDir,\n\n      APP_PACKAGE_NAME: appInfo.name\n    }\n    if (uninstallAppKey !== guid) {\n      defines.UNINSTALL_REGISTRY_KEY_2 = `Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\${guid}`\n    }\n\n    const commands: any = {\n      OutFile: `\"${installerPath}\"`,\n      VIProductVersion: appInfo.getVersionInWeirdWindowsForm(),\n      VIAddVersionKey: this.computeVersionKey(),\n      Unicode: this.isUnicodeEnabled,\n    }\n\n    const isPortable = this.isPortable\n    const iconPath = (isPortable ? null : await packager.getResource(options.installerIcon, \"installerIcon.ico\")) || await packager.getIconPath()\n    if (iconPath != null) {\n      if (isPortable) {\n        commands.Icon = `\"${iconPath}\"`\n      }\n      else {\n        defines.MUI_ICON = iconPath\n        defines.MUI_UNICON = iconPath\n      }\n    }\n\n    const packageFiles: { [arch: string]: PackageFileInfo } = {}\n    let estimatedSize = 0\n    if (this.isPortable && options.useZip) {\n      for (const [arch, dir] of this.archs.entries()) {\n        defines[arch === Arch.x64 ? \"APP_DIR_64\" : \"APP_DIR_32\"] = dir\n      }\n    }\n    else if (USE_NSIS_BUILT_IN_COMPRESSOR && this.archs.size === 1) {\n      defines.APP_BUILD_DIR = this.archs.get(this.archs.keys().next().value)\n    }\n    else {\n      await BluebirdPromise.map(this.archs.keys(), async arch => {\n        const fileInfo = await this.packageHelper.packArch(arch, this)\n        const file = fileInfo.path\n        const defineKey = arch === Arch.x64 ? \"APP_64\" : \"APP_32\"\n        defines[defineKey] = file\n        defines[`${defineKey}_NAME`] = path.basename(file)\n        // nsis expect a hexadecimal string\n        defines[`${defineKey}_HASH`] = Buffer.from(fileInfo.sha512, \"base64\").toString(\"hex\").toUpperCase()\n\n        if (this.isWebInstaller) {\n          await packager.dispatchArtifactCreated(file, this, arch)\n          packageFiles[Arch[arch]] = fileInfo\n        }\n\n        const archiveInfo = (await exec(path7za, [\"l\", file])).trim()\n        // after adding blockmap data will be \"Warnings: 1\" in the end of output\n        const match = archiveInfo.match(/(\\d+)\\s+\\d+\\s+\\d+\\s+files/)\n        if (match == null) {\n          log.warn({output: archiveInfo}, \"cannot compute size of app package\")\n        }\n        else {\n          estimatedSize += parseInt(match[1], 10)\n        }\n      })\n    }\n\n    this.configureDefinesForAllTypeOfInstaller(defines)\n    if (isPortable) {\n      const portableOptions = options as PortableOptions\n      defines.REQUEST_EXECUTION_LEVEL = portableOptions.requestExecutionLevel || \"user\"\n      defines.UNPACK_DIR_NAME = portableOptions.unpackDirName || (await executeAppBuilder([\"ksuid\"]))\n    }\n    else {\n      await this.configureDefines(oneClick, defines)\n    }\n\n    if (estimatedSize !== 0) {\n      // in kb\n      defines.ESTIMATED_SIZE = Math.round(estimatedSize / 1024)\n    }\n\n    if (packager.compression === \"store\") {\n      commands.SetCompress = \"off\"\n    }\n    else {\n      // difference - 33.540 vs 33.601, only 61 KB (but zip is faster to decompress)\n      // do not use /SOLID - \"With solid compression, files are uncompressed to temporary file before they are copied to their final destination\",\n      // it is not good for portable installer (where built-in NSIS compression is used). http://forums.winamp.com/showpost.php?p=2982902&postcount=6\n      commands.SetCompressor = \"zlib\"\n      if (!this.isWebInstaller) {\n        defines.COMPRESS = \"auto\"\n      }\n    }\n\n    debug(defines)\n    debug(commands)\n\n    if (packager.packagerOptions.effectiveOptionComputed != null && await packager.packagerOptions.effectiveOptionComputed([defines, commands])) {\n      return\n    }\n\n    const sharedHeader = await this.computeCommonInstallerScriptHeader()\n    const script = isPortable ? await readFile(path.join(nsisTemplatesDir, \"portable.nsi\"), \"utf8\") : await this.computeScriptAndSignUninstaller(defines, commands, installerPath, sharedHeader)\n    await this.executeMakensis(defines, commands, sharedHeader + await this.computeFinalScript(script, true))\n    await Promise.all<any>([packager.sign(installerPath), defines.UNINSTALLER_OUT_FILE == null ? Promise.resolve() : unlink(defines.UNINSTALLER_OUT_FILE)])\n\n    const safeArtifactName = isSafeGithubName(installerFilename) ? installerFilename : this.generateGitHubInstallerName()\n\n    let updateInfo: any\n    if (this.isWebInstaller) {\n      updateInfo = createNsisWebDifferentialUpdateInfo(installerPath, packageFiles)\n    }\n    else if (this.isBuildDifferentialAware) {\n      updateInfo = await createBlockmap(installerPath, this, packager, safeArtifactName)\n    }\n\n    if (updateInfo != null && isPerMachine && oneClick) {\n      updateInfo.isAdminRightsRequired = true\n    }\n\n    await packager.info.callArtifactBuildCompleted({\n      file: installerPath,\n      updateInfo,\n      target: this,\n      packager,\n      arch: this.archs.size === 1 ? this.archs.keys().next().value : null,\n      safeArtifactName,\n      isWriteUpdateInfo: !this.isPortable,\n    })\n  }\n\n  protected generateGitHubInstallerName() {\n    const appInfo = this.packager.appInfo\n    const classifier = appInfo.name.toLowerCase() === appInfo.name ? \"setup-\" : \"Setup-\"\n    return `${appInfo.name}-${this.isPortable ? \"\" : classifier}${appInfo.version}.exe`\n  }\n\n  private get isUnicodeEnabled() {\n    return this.options.unicode !== false\n  }\n\n  get isWebInstaller(): boolean {\n    return false\n  }\n\n  private async computeScriptAndSignUninstaller(defines: any, commands: any, installerPath: string, sharedHeader: string) {\n    const packager = this.packager\n    const customScriptPath = await packager.getResource(this.options.script, \"installer.nsi\")\n    const script = await readFile(customScriptPath || path.join(nsisTemplatesDir, \"installer.nsi\"), \"utf8\")\n\n    if (customScriptPath != null) {\n      log.info({reason: \"custom NSIS script is used\"}, \"uninstaller is not signed by electron-builder\")\n      return script\n    }\n\n    // https://github.com/electron-userland/electron-builder/issues/2103\n    // it is more safe and reliable to write uninstaller to our out dir\n    const uninstallerPath = path.join(this.outDir, `.__uninstaller-${this.name}-${this.packager.appInfo.sanitizedName}.exe`)\n    const isWin = process.platform === \"win32\"\n    defines.BUILD_UNINSTALLER = null\n    defines.UNINSTALLER_OUT_FILE = isWin ? uninstallerPath : path.win32.join(\"Z:\", uninstallerPath)\n    await this.executeMakensis(defines, commands, sharedHeader + await this.computeFinalScript(script, false))\n    await execWine(installerPath)\n    await packager.sign(uninstallerPath, \"  Signing NSIS uninstaller\")\n\n    delete defines.BUILD_UNINSTALLER\n    // platform-specific path, not wine\n    defines.UNINSTALLER_OUT_FILE = uninstallerPath\n    return script\n  }\n\n  private computeVersionKey() {\n    // Error: invalid VIProductVersion format, should be X.X.X.X\n    // so, we must strip beta\n    const localeId = this.options.language || \"1033\"\n    const appInfo = this.packager.appInfo\n    const versionKey = [\n      `/LANG=${localeId} ProductName \"${appInfo.productName}\"`,\n      `/LANG=${localeId} ProductVersion \"${appInfo.version}\"`,\n      `/LANG=${localeId} LegalCopyright \"${appInfo.copyright}\"`,\n      `/LANG=${localeId} FileDescription \"${appInfo.description}\"`,\n      `/LANG=${localeId} FileVersion \"${appInfo.buildVersion}\"`,\n    ]\n    use(this.packager.platformSpecificBuildOptions.legalTrademarks, it => versionKey.push(`/LANG=${localeId} LegalTrademarks \"${it}\"`))\n    use(appInfo.companyName, it => versionKey.push(`/LANG=${localeId} CompanyName \"${it}\"`))\n    return versionKey\n  }\n\n  protected configureDefines(oneClick: boolean, defines: any): Promise<any> {\n    const packager = this.packager\n    const options = this.options\n\n    const asyncTaskManager = new AsyncTaskManager(packager.info.cancellationToken)\n\n    if (oneClick) {\n      defines.ONE_CLICK = null\n\n      if (options.runAfterFinish !== false) {\n        defines.RUN_AFTER_FINISH = null\n      }\n\n      asyncTaskManager.add(async () => {\n        const installerHeaderIcon = await packager.getResource(options.installerHeaderIcon, \"installerHeaderIcon.ico\")\n        if (installerHeaderIcon != null) {\n          defines.HEADER_ICO = installerHeaderIcon\n        }\n      })\n    }\n    else {\n      if (options.runAfterFinish === false) {\n        defines.HIDE_RUN_AFTER_FINISH = null\n      }\n\n      asyncTaskManager.add(async () => {\n        const installerHeader = await packager.getResource(options.installerHeader, \"installerHeader.bmp\")\n        if (installerHeader != null) {\n          defines.MUI_HEADERIMAGE = null\n          defines.MUI_HEADERIMAGE_RIGHT = null\n          defines.MUI_HEADERIMAGE_BITMAP = installerHeader\n        }\n      })\n\n      asyncTaskManager.add(async () => {\n        const bitmap = (await packager.getResource(options.installerSidebar, \"installerSidebar.bmp\")) || \"${NSISDIR}\\\\Contrib\\\\Graphics\\\\Wizard\\\\nsis3-metro.bmp\"\n        defines.MUI_WELCOMEFINISHPAGE_BITMAP = bitmap\n        defines.MUI_UNWELCOMEFINISHPAGE_BITMAP = (await packager.getResource(options.uninstallerSidebar, \"uninstallerSidebar.bmp\")) || bitmap\n      })\n\n      if (options.allowElevation !== false) {\n        defines.MULTIUSER_INSTALLMODE_ALLOW_ELEVATION = null\n      }\n    }\n\n    if (options.perMachine === true) {\n      defines.INSTALL_MODE_PER_ALL_USERS = null\n    }\n\n    if (!oneClick || options.perMachine === true) {\n      defines.INSTALL_MODE_PER_ALL_USERS_REQUIRED = null\n    }\n\n    if (options.allowToChangeInstallationDirectory) {\n      if (oneClick) {\n        throw new InvalidConfigurationError(\"allowToChangeInstallationDirectory makes sense only for assisted installer (please set oneClick to false)\")\n      }\n      defines.allowToChangeInstallationDirectory = null\n    }\n\n    const commonOptions = getEffectiveOptions(options, packager)\n\n    if (commonOptions.menuCategory != null) {\n      defines.MENU_FILENAME = commonOptions.menuCategory\n    }\n\n    defines.SHORTCUT_NAME = commonOptions.shortcutName\n\n    if (options.deleteAppDataOnUninstall) {\n      defines.DELETE_APP_DATA_ON_UNINSTALL = null\n    }\n\n    asyncTaskManager.add(async () => {\n      const uninstallerIcon = await packager.getResource(options.uninstallerIcon, \"uninstallerIcon.ico\")\n      if (uninstallerIcon != null) {\n        // we don't need to copy MUI_UNICON (defaults to app icon), so, we have 2 defines\n        defines.UNINSTALLER_ICON = uninstallerIcon\n        defines.MUI_UNICON = uninstallerIcon\n      }\n    })\n\n    defines.UNINSTALL_DISPLAY_NAME = packager.expandMacro(options.uninstallDisplayName || \"${productName} ${version}\", null, {}, false)\n    if (commonOptions.isCreateDesktopShortcut === DesktopShortcutCreationPolicy.NEVER) {\n      defines.DO_NOT_CREATE_DESKTOP_SHORTCUT = null\n    }\n    if (commonOptions.isCreateDesktopShortcut === DesktopShortcutCreationPolicy.ALWAYS) {\n      defines.RECREATE_DESKTOP_SHORTCUT = null\n    }\n    if (!commonOptions.isCreateStartMenuShortcut) {\n      defines.DO_NOT_CREATE_START_MENU_SHORTCUT = null\n    }\n\n    if (options.displayLanguageSelector === true) {\n      defines.DISPLAY_LANG_SELECTOR = null\n    }\n\n    return asyncTaskManager.awaitTasks()\n  }\n\n  private configureDefinesForAllTypeOfInstaller(defines: any) {\n    const appInfo = this.packager.appInfo\n    const companyName = appInfo.companyName\n    if (companyName != null) {\n      defines.COMPANY_NAME = companyName\n    }\n\n    // electron uses product file name as app data, define it as well to remove on uninstall\n    if (defines.APP_FILENAME !== appInfo.productFilename) {\n      defines.APP_PRODUCT_FILENAME = appInfo.productFilename\n    }\n\n    if (this.isWebInstaller) {\n      defines.APP_PACKAGE_STORE_FILE = `${appInfo.updaterCacheDirName}\\\\${CURRENT_APP_PACKAGE_FILE_NAME}`\n    }\n    else {\n      defines.APP_INSTALLER_STORE_FILE = `${appInfo.updaterCacheDirName}\\\\${CURRENT_APP_INSTALLER_FILE_NAME}`\n    }\n\n    if (!this.isWebInstaller && defines.APP_BUILD_DIR == null) {\n      const options = this.options\n      if (options.useZip) {\n        defines.ZIP_COMPRESSION = null\n      }\n\n      defines.COMPRESSION_METHOD = options.useZip ? \"zip\" : \"7z\"\n    }\n  }\n\n  private async executeMakensis(defines: any, commands: any, script: string) {\n    const args: Array<string> = (this.options.warningsAsErrors === false) ? [] : [\"-WX\"]\n    for (const name of Object.keys(defines)) {\n      const value = defines[name]\n      if (value == null) {\n        args.push(`-D${name}`)\n      }\n      else {\n        args.push(`-D${name}=${value}`)\n      }\n    }\n\n    for (const name of Object.keys(commands)) {\n      const value = commands[name]\n      if (Array.isArray(value)) {\n        for (const c of value) {\n          args.push(`-X${name} ${c}`)\n        }\n      }\n      else {\n        args.push(`-X${name} ${value}`)\n      }\n    }\n\n    args.push(\"-\")\n\n    if (this.packager.debugLogger.isEnabled) {\n      this.packager.debugLogger.add(\"nsis.script\", script)\n    }\n\n    const nsisPath = await NSIS_PATH.value\n    const command = path.join(nsisPath, process.platform === \"darwin\" ? \"mac\" : (process.platform === \"win32\" ? \"Bin\" : \"linux\"), process.platform === \"win32\" ? \"makensis.exe\" : \"makensis\")\n    await spawnAndWrite(command, args, script, {\n      // we use NSIS_CONFIG_CONST_DATA_PATH=no to build makensis on Linux, but in any case it doesn't use stubs as MacOS/Windows version, so, we explicitly set NSISDIR\n      env: {...process.env, NSISDIR: nsisPath},\n      cwd: nsisTemplatesDir,\n    })\n  }\n\n  private async computeCommonInstallerScriptHeader() {\n    const packager = this.packager\n    const options = this.options\n    const scriptGenerator = new NsisScriptGenerator()\n    const langConfigurator = new LangConfigurator(options)\n\n    scriptGenerator.include(path.join(nsisTemplatesDir, \"include\", \"StdUtils.nsh\"))\n\n    const includeDir = path.join(nsisTemplatesDir, \"include\")\n    scriptGenerator.addIncludeDir(includeDir)\n    scriptGenerator.flags([\"updated\", \"force-run\", \"keep-shortcuts\", \"no-desktop-shortcut\", \"delete-app-data\", \"allusers\", \"currentuser\"])\n\n    createAddLangsMacro(scriptGenerator, langConfigurator)\n\n    const taskManager = new AsyncTaskManager(packager.info.cancellationToken)\n\n    const pluginArch = this.isUnicodeEnabled ? \"x86-unicode\" : \"x86-ansi\"\n    taskManager.add(async () => {\n      scriptGenerator.addPluginDir(pluginArch, path.join(await nsisResourcePathPromise.value, \"plugins\", pluginArch))\n    })\n\n    taskManager.add(async () => {\n      const userPluginDir = path.join(packager.info.buildResourcesDir, pluginArch)\n      const stat = await statOrNull(userPluginDir)\n      if (stat != null && stat.isDirectory()) {\n        scriptGenerator.addPluginDir(pluginArch, userPluginDir)\n      }\n    })\n\n    taskManager.addTask(addCustomMessageFileInclude(\"messages.yml\", packager, scriptGenerator, langConfigurator))\n\n    if (!this.isPortable) {\n      if (options.oneClick === false) {\n        taskManager.addTask(addCustomMessageFileInclude(\"assistedMessages.yml\", packager, scriptGenerator, langConfigurator))\n      }\n\n      taskManager.add(async () => {\n        const customInclude = await packager.getResource(this.options.include, \"installer.nsh\")\n        if (customInclude != null) {\n          scriptGenerator.addIncludeDir(packager.info.buildResourcesDir)\n          scriptGenerator.include(customInclude)\n        }\n      })\n    }\n\n    await taskManager.awaitTasks()\n    return scriptGenerator.build()\n  }\n\n  private async computeFinalScript(originalScript: string, isInstaller: boolean) {\n    const packager = this.packager\n    const options = this.options\n    const langConfigurator = new LangConfigurator(options)\n\n    const scriptGenerator = new NsisScriptGenerator()\n    const taskManager = new AsyncTaskManager(packager.info.cancellationToken)\n\n    if (isInstaller) {\n      // http://stackoverflow.com/questions/997456/nsis-license-file-based-on-language-selection\n      taskManager.add(() => computeLicensePage(packager, options, scriptGenerator, langConfigurator.langs))\n    }\n\n    await taskManager.awaitTasks()\n\n    if (this.isPortable) {\n      return scriptGenerator.build() + originalScript\n    }\n\n    const preCompressedFileExtensions = this.getPreCompressedFileExtensions()\n    if (preCompressedFileExtensions != null && preCompressedFileExtensions.length !== 0) {\n      for (const [arch, dir] of this.archs.entries()) {\n        await generateForPreCompressed(preCompressedFileExtensions, dir, arch, scriptGenerator)\n      }\n    }\n\n    const fileAssociations = packager.fileAssociations\n    if (fileAssociations.length !== 0) {\n\n      scriptGenerator.include(path.join(path.join(nsisTemplatesDir, \"include\"), \"FileAssociation.nsh\"))\n      if (isInstaller) {\n        const registerFileAssociationsScript = new NsisScriptGenerator()\n        for (const item of fileAssociations) {\n          const extensions = asArray(item.ext).map(normalizeExt)\n          for (const ext of extensions) {\n            const customIcon = await packager.getResource(getPlatformIconFileName(item.icon, false), `${extensions[0]}.ico`)\n            let installedIconPath = \"$appExe,0\"\n            if (customIcon != null) {\n              installedIconPath = `$INSTDIR\\\\resources\\\\${path.basename(customIcon)}`\n              registerFileAssociationsScript.file(installedIconPath, customIcon)\n            }\n\n            const icon = `\"${installedIconPath}\"`\n            const commandText = `\"Open with ${packager.appInfo.productName}\"`\n            const command = '\"$appExe $\\\\\"%1$\\\\\"\"'\n            registerFileAssociationsScript.insertMacro(\"APP_ASSOCIATE\", `\"${ext}\" \"${item.name || ext}\" \"${item.description || \"\"}\" ${icon} ${commandText} ${command}`)\n          }\n        }\n        scriptGenerator.macro(\"registerFileAssociations\", registerFileAssociationsScript)\n      }\n      else {\n        const unregisterFileAssociationsScript = new NsisScriptGenerator()\n        for (const item of fileAssociations) {\n          for (const ext of asArray(item.ext)) {\n            unregisterFileAssociationsScript.insertMacro(\"APP_UNASSOCIATE\", `\"${normalizeExt(ext)}\" \"${item.name || ext}\"`)\n          }\n        }\n        scriptGenerator.macro(\"unregisterFileAssociations\", unregisterFileAssociationsScript)\n      }\n    }\n\n    return scriptGenerator.build() + originalScript\n  }\n}\n\nasync function generateForPreCompressed(preCompressedFileExtensions: Array<string>, dir: string, arch: Arch, scriptGenerator: NsisScriptGenerator) {\n  const resourcesDir = path.join(dir, \"resources\")\n  const dirInfo = await statOrNull(resourcesDir)\n  if (dirInfo == null || !dirInfo.isDirectory()) {\n    return\n  }\n\n  const nodeModules = `${path.sep}node_modules`\n  const preCompressedAssets = await walk(resourcesDir, (file, stat) => {\n    if (stat.isDirectory()) {\n      return !file.endsWith(nodeModules)\n    }\n    else {\n      return preCompressedFileExtensions.some(it => file.endsWith(it))\n    }\n  })\n\n  if (preCompressedAssets.length !== 0) {\n    const macro = new NsisScriptGenerator()\n    for (const file of preCompressedAssets) {\n      macro.file(`$INSTDIR\\\\${path.relative(dir, file).replace(/\\//g, \"\\\\\")}`, file)\n    }\n    scriptGenerator.macro(`customFiles_${Arch[arch]}`, macro)\n  }\n}\n\nasync function createPackageFileInfo(file: string): Promise<PackageFileInfo> {\n  return {\n    path: file,\n    size: (await stat(file)).size,\n    sha512: await hashFile(file),\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.WebInstallerTarget = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _PublishManager() {
  const data = require("../../publish/PublishManager");

  _PublishManager = function () {
    return data;
  };

  return data;
}

function _NsisTarget() {
  const data = require("./NsisTarget");

  _NsisTarget = function () {
    return data;
  };

  return data;
}

/** @private */
class WebInstallerTarget extends _NsisTarget().NsisTarget {
  constructor(packager, outDir, targetName, packageHelper) {
    super(packager, outDir, targetName, packageHelper);
  }

  get isWebInstaller() {
    return true;
  }

  configureDefines(oneClick, defines) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      //noinspection ES6MissingAwait
      yield _NsisTarget().NsisTarget.prototype.configureDefines.call(_this, oneClick, defines);
      const packager = _this.packager;
      const options = _this.options;
      let appPackageUrl = options.appPackageUrl;

      if (appPackageUrl == null) {
        const publishConfigs = yield (0, _PublishManager().getPublishConfigsForUpdateInfo)(packager, (yield (0, _PublishManager().getPublishConfigs)(packager, packager.info.config, null, false)), null);

        if (publishConfigs == null || publishConfigs.length === 0) {
          throw new Error("Cannot compute app package download URL");
        }

        appPackageUrl = (0, _PublishManager().computeDownloadUrl)(publishConfigs[0], null, packager);
        defines.APP_PACKAGE_URL_IS_INCOMLETE = null;
      }

      defines.APP_PACKAGE_URL = appPackageUrl;
    })();
  }

  get installerFilenamePattern() {
    // tslint:disable:no-invalid-template-strings
    return "${productName} Web Setup ${version}.${ext}";
  }

  generateGitHubInstallerName() {
    const appInfo = this.packager.appInfo;
    const classifier = appInfo.name.toLowerCase() === appInfo.name ? "web-setup" : "WebSetup";
    return `${appInfo.name}-${classifier}-${appInfo.version}.exe`;
  }

} exports.WebInstallerTarget = WebInstallerTarget;
// __ts-babel@6.0.4
//# sourceMappingURL=WebInstallerTarget.js.map{"version":3,"sources":["../../../src/targets/nsis/WebInstallerTarget.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AACM,MAAO,kBAAP,SAAkC,wBAAlC,CAA4C;AAChD,EAAA,WAAA,CAAY,QAAZ,EAAmC,MAAnC,EAAmD,UAAnD,EAAuE,aAAvE,EAAsG;AACpG,UAAM,QAAN,EAAgB,MAAhB,EAAwB,UAAxB,EAAoC,aAApC;AACD;;AAED,MAAI,cAAJ,GAAkB;AAChB,WAAO,IAAP;AACD;;AAEe,EAAA,gBAAN,CAAuB,QAAvB,EAA0C,OAA1C,EAAsD;AAAA;;AAAA;AAC9D;AACA,YAAO,yBAAW,SAAX,CAA4C,gBAA5C,CAA6D,IAA7D,CAAkE,KAAlE,EAAwE,QAAxE,EAAkF,OAAlF,CAAP;AAEA,YAAM,QAAQ,GAAG,KAAI,CAAC,QAAtB;AACA,YAAM,OAAO,GAAG,KAAI,CAAC,OAArB;AAEA,UAAI,aAAa,GAAG,OAAO,CAAC,aAA5B;;AACA,UAAI,aAAa,IAAI,IAArB,EAA2B;AACzB,cAAM,cAAc,SAAS,sDAA+B,QAA/B,SAA+C,yCAAkB,QAAlB,EAA4B,QAAQ,CAAC,IAAT,CAAc,MAA1C,EAAkD,IAAlD,EAAwD,KAAxD,CAA/C,GAA+G,IAA/G,CAA7B;;AACA,YAAI,cAAc,IAAI,IAAlB,IAA0B,cAAc,CAAC,MAAf,KAA0B,CAAxD,EAA2D;AACzD,gBAAM,IAAI,KAAJ,CAAU,yCAAV,CAAN;AACD;;AAED,QAAA,aAAa,GAAG,0CAAmB,cAAc,CAAC,CAAD,CAAjC,EAAsC,IAAtC,EAA4C,QAA5C,CAAhB;AAEA,QAAA,OAAO,CAAC,4BAAR,GAAuC,IAAvC;AACD;;AAED,MAAA,OAAO,CAAC,eAAR,GAA0B,aAA1B;AAnB8D;AAoB/D;;AAED,MAAc,wBAAd,GAAsC;AACpC;AACA,WAAO,4CAAP;AACD;;AAES,EAAA,2BAA2B,GAAA;AACnC,UAAM,OAAO,GAAG,KAAK,QAAL,CAAc,OAA9B;AACA,UAAM,UAAU,GAAG,OAAO,CAAC,IAAR,CAAa,WAAb,OAA+B,OAAO,CAAC,IAAvC,GAA8C,WAA9C,GAA4D,UAA/E;AACA,WAAO,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,IAAI,OAAO,CAAC,OAAO,MAAvD;AACD;;AAxC+C,C","sourcesContent":["import { computeDownloadUrl, getPublishConfigs, getPublishConfigsForUpdateInfo } from \"../../publish/PublishManager\"\nimport { WinPackager } from \"../../winPackager\"\nimport { NsisWebOptions } from \"./nsisOptions\"\nimport { NsisTarget } from \"./NsisTarget\"\nimport { AppPackageHelper } from \"./nsisUtil\"\n\n/** @private */\nexport class WebInstallerTarget extends NsisTarget {\n  constructor(packager: WinPackager, outDir: string, targetName: string, packageHelper: AppPackageHelper) {\n    super(packager, outDir, targetName, packageHelper)\n  }\n\n  get isWebInstaller(): boolean {\n    return true\n  }\n\n  protected async configureDefines(oneClick: boolean, defines: any): Promise<any> {\n    //noinspection ES6MissingAwait\n    await (NsisTarget.prototype as WebInstallerTarget).configureDefines.call(this, oneClick, defines)\n\n    const packager = this.packager\n    const options = this.options as NsisWebOptions\n\n    let appPackageUrl = options.appPackageUrl\n    if (appPackageUrl == null) {\n      const publishConfigs = await getPublishConfigsForUpdateInfo(packager, await getPublishConfigs(packager, packager.info.config, null, false), null)\n      if (publishConfigs == null || publishConfigs.length === 0) {\n        throw new Error(\"Cannot compute app package download URL\")\n      }\n\n      appPackageUrl = computeDownloadUrl(publishConfigs[0], null, packager)\n\n      defines.APP_PACKAGE_URL_IS_INCOMLETE = null\n    }\n\n    defines.APP_PACKAGE_URL = appPackageUrl\n  }\n\n  protected get installerFilenamePattern(): string {\n    // tslint:disable:no-invalid-template-strings\n    return \"${productName} Web Setup ${version}.${ext}\"\n  }\n\n  protected generateGitHubInstallerName(): string {\n    const appInfo = this.packager.appInfo\n    const classifier = appInfo.name.toLowerCase() === appInfo.name ? \"web-setup\" : \"WebSetup\"\n    return `${appInfo.name}-${classifier}-${appInfo.version}.exe`\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createAddLangsMacro = createAddLangsMacro;
exports.addCustomMessageFileInclude = addCustomMessageFileInclude;
exports.LangConfigurator = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _langs() {
  const data = require("../../util/langs");

  _langs = function () {
    return data;
  };

  return data;
}

var _debug2 = _interopRequireDefault(require("debug"));

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _jsYaml() {
  const data = require("js-yaml");

  _jsYaml = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _nsisUtil() {
  const data = require("./nsisUtil");

  _nsisUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const debug = (0, _debug2.default)("electron-builder:nsis");

class LangConfigurator {
  constructor(options) {
    const rawList = options.installerLanguages;

    if (options.unicode === false || rawList === null || Array.isArray(rawList) && rawList.length === 0) {
      this.isMultiLang = false;
    } else {
      this.isMultiLang = options.multiLanguageInstaller !== false;
    }

    if (this.isMultiLang) {
      this.langs = rawList == null ? _langs().bundledLanguages.slice() : (0, _builderUtil().asArray)(rawList).map(it => (0, _langs().toLangWithRegion)(it.replace("-", "_")));
    } else {
      this.langs = ["en_US"];
    }
  }

}

exports.LangConfigurator = LangConfigurator;

function createAddLangsMacro(scriptGenerator, langConfigurator) {
  const result = [];

  for (const langWithRegion of langConfigurator.langs) {
    let name;

    if (langWithRegion === "zh_CN") {
      name = "SimpChinese";
    } else if (langWithRegion === "zh_TW") {
      name = "TradChinese";
    } else if (langWithRegion === "nb_NO") {
      name = "Norwegian";
    } else if (langWithRegion === "pt_BR") {
      name = "PortugueseBR";
    } else {
      const lang = langWithRegion.substring(0, langWithRegion.indexOf("_"));
      name = _langs().langIdToName[lang];

      if (name == null) {
        throw new Error(`Language name is unknown for ${lang}`);
      }

      if (name === "Spanish") {
        name = "SpanishInternational";
      }
    }

    result.push(`!insertmacro MUI_LANGUAGE "${name}"`);
  }

  scriptGenerator.macro("addLangs", result);
}

function writeCustomLangFile(_x, _x2) {
  return _writeCustomLangFile.apply(this, arguments);
}

function _writeCustomLangFile() {
  _writeCustomLangFile = (0, _bluebirdLst().coroutine)(function* (data, packager) {
    const file = yield packager.getTempFile("messages.nsh");
    yield (0, _fsExtraP().outputFile)(file, data);
    return file;
  });
  return _writeCustomLangFile.apply(this, arguments);
}

function addCustomMessageFileInclude(_x3, _x4, _x5, _x6) {
  return _addCustomMessageFileInclude.apply(this, arguments);
}

function _addCustomMessageFileInclude() {
  _addCustomMessageFileInclude = (0, _bluebirdLst().coroutine)(function* (input, packager, scriptGenerator, langConfigurator) {
    const data = (0, _jsYaml().safeLoad)((yield (0, _fsExtraP().readFile)(path.join(_nsisUtil().nsisTemplatesDir, input), "utf-8")));
    const instructions = computeCustomMessageTranslations(data, langConfigurator).join("\n");
    debug(instructions);
    scriptGenerator.include((yield writeCustomLangFile(instructions, packager)));
  });
  return _addCustomMessageFileInclude.apply(this, arguments);
}

function computeCustomMessageTranslations(messages, langConfigurator) {
  const result = [];
  const includedLangs = new Set(langConfigurator.langs);

  for (const messageId of Object.keys(messages)) {
    const langToTranslations = messages[messageId];
    const unspecifiedLangs = new Set(langConfigurator.langs);

    for (const lang of Object.keys(langToTranslations)) {
      const langWithRegion = (0, _langs().toLangWithRegion)(lang);

      if (!includedLangs.has(langWithRegion)) {
        continue;
      }

      const value = langToTranslations[lang];

      if (value == null) {
        throw new Error(`${messageId} not specified for ${lang}`);
      }

      result.push(`LangString ${messageId} ${_langs().lcid[langWithRegion]} "${value.replace(/\n/g, "$\\r$\\n")}"`);
      unspecifiedLangs.delete(langWithRegion);
    }

    if (langConfigurator.isMultiLang) {
      const defaultTranslation = langToTranslations.en.replace(/\n/g, "$\\r$\\n");

      for (const langWithRegion of unspecifiedLangs) {
        result.push(`LangString ${messageId} ${_langs().lcid[langWithRegion]} "${defaultTranslation}"`);
      }
    }
  }

  return result;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=nsisLang.js.map{"version":3,"sources":["../../../src/targets/nsis/nsisLang.ts"],"names":[],"mappings":"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","sourcesContent":["import { asArray } from \"builder-util\"\nimport { bundledLanguages, langIdToName, lcid, toLangWithRegion } from \"../../util/langs\"\nimport _debug from \"debug\"\nimport { outputFile, readFile } from \"fs-extra-p\"\nimport { safeLoad } from \"js-yaml\"\nimport * as path from \"path\"\nimport { PlatformPackager } from \"../../platformPackager\"\nimport { NsisOptions } from \"./nsisOptions\"\nimport { NsisScriptGenerator } from \"./nsisScriptGenerator\"\nimport { nsisTemplatesDir } from \"./nsisUtil\"\n\nconst debug = _debug(\"electron-builder:nsis\")\n\nexport class LangConfigurator {\n  readonly isMultiLang: boolean\n  readonly langs: Array<string>\n\n  constructor(options: NsisOptions) {\n    const rawList = options.installerLanguages\n\n    if (options.unicode === false || rawList === null || (Array.isArray(rawList) && rawList.length === 0)) {\n      this.isMultiLang = false\n    }\n    else {\n      this.isMultiLang = options.multiLanguageInstaller !== false\n    }\n\n    if (this.isMultiLang) {\n      this.langs = rawList == null ? bundledLanguages.slice() : asArray(rawList)\n        .map(it => toLangWithRegion(it.replace(\"-\", \"_\")))\n    }\n    else {\n      this.langs = [\"en_US\"]\n    }\n  }\n}\n\nexport function createAddLangsMacro(scriptGenerator: NsisScriptGenerator, langConfigurator: LangConfigurator) {\n  const result: Array<string> = []\n  for (const langWithRegion of langConfigurator.langs) {\n    let name: string\n    if (langWithRegion === \"zh_CN\") {\n      name = \"SimpChinese\"\n    }\n    else if (langWithRegion === \"zh_TW\") {\n      name = \"TradChinese\"\n    }\n    else if (langWithRegion === \"nb_NO\") {\n      name = \"Norwegian\"\n    }\n    else if (langWithRegion === \"pt_BR\") {\n      name = \"PortugueseBR\"\n    }\n    else {\n      const lang = langWithRegion.substring(0, langWithRegion.indexOf(\"_\"))\n      name = (langIdToName as any)[lang]\n      if (name == null) {\n        throw new Error(`Language name is unknown for ${lang}`)\n      }\n\n      if (name === \"Spanish\") {\n        name = \"SpanishInternational\"\n      }\n    }\n    result.push(`!insertmacro MUI_LANGUAGE \"${name}\"`)\n  }\n\n  scriptGenerator.macro(\"addLangs\", result)\n}\n\nasync function writeCustomLangFile(data: string, packager: PlatformPackager<any>) {\n  const file = await packager.getTempFile(\"messages.nsh\")\n  await outputFile(file, data)\n  return file\n}\n\nexport async function addCustomMessageFileInclude(input: string, packager: PlatformPackager<any>, scriptGenerator: NsisScriptGenerator, langConfigurator: LangConfigurator) {\n  const data = safeLoad(await readFile(path.join(nsisTemplatesDir, input), \"utf-8\"))\n  const instructions = computeCustomMessageTranslations(data, langConfigurator).join(\"\\n\")\n  debug(instructions)\n  scriptGenerator.include(await writeCustomLangFile(instructions, packager))\n}\n\nfunction computeCustomMessageTranslations(messages: any, langConfigurator: LangConfigurator): Array<string> {\n  const result: Array<string> = []\n  const includedLangs = new Set(langConfigurator.langs)\n  for (const messageId of Object.keys(messages)) {\n    const langToTranslations = messages[messageId]\n    const unspecifiedLangs = new Set(langConfigurator.langs)\n    for (const lang of Object.keys(langToTranslations)) {\n      const langWithRegion = toLangWithRegion(lang)\n\n      if (!includedLangs.has(langWithRegion)) {\n        continue\n      }\n\n      const value = langToTranslations[lang]\n      if (value == null) {\n        throw new Error(`${messageId} not specified for ${lang}`)\n      }\n\n      result.push(`LangString ${messageId} ${lcid[langWithRegion]} \"${value.replace(/\\n/g, \"$\\\\r$\\\\n\")}\"`)\n      unspecifiedLangs.delete(langWithRegion)\n    }\n\n    if (langConfigurator.isMultiLang) {\n      const defaultTranslation = langToTranslations.en.replace(/\\n/g, \"$\\\\r$\\\\n\")\n      for (const langWithRegion of unspecifiedLangs) {\n        result.push(`LangString ${messageId} ${lcid[langWithRegion]} \"${defaultTranslation}\"`)\n      }\n    }\n  }\n  return result\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.computeLicensePage = computeLicensePage;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _langs() {
  const data = require("../../util/langs");

  _langs = function () {
    return data;
  };

  return data;
}

function _license() {
  const data = require("../../util/license");

  _license = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _nsisUtil() {
  const data = require("./nsisUtil");

  _nsisUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function computeLicensePage(_x, _x2, _x3, _x4) {
  return _computeLicensePage.apply(this, arguments);
} function _computeLicensePage() {
  _computeLicensePage = (0, _bluebirdLst().coroutine)(function* (packager, options, scriptGenerator, languages) {
    const license = yield (0, _license().getNotLocalizedLicenseFile)(options.license, packager);

    if (license != null) {
      let licensePage;

      if (license.endsWith(".html")) {
        licensePage = ["!define MUI_PAGE_CUSTOMFUNCTION_SHOW LicenseShow", "Function LicenseShow", "  FindWindow $R0 `#32770` `` $HWNDPARENT", "  GetDlgItem $R0 $R0 1000", "EmbedHTML::Load /replace $R0 file://$PLUGINSDIR\\license.html", "FunctionEnd", `!insertmacro MUI_PAGE_LICENSE "${path.join(_nsisUtil().nsisTemplatesDir, "empty-license.txt")}"`];
      } else {
        licensePage = [`!insertmacro MUI_PAGE_LICENSE "${license}"`];
      }

      scriptGenerator.macro("licensePage", licensePage);

      if (license.endsWith(".html")) {
        scriptGenerator.macro("addLicenseFiles", [`File /oname=$PLUGINSDIR\\license.html "${license}"`]);
      }

      return;
    }

    const licenseFiles = yield (0, _license().getLicenseFiles)(packager);

    if (licenseFiles.length === 0) {
      return;
    }

    const licensePage = [];
    const unspecifiedLangs = new Set(languages);
    let defaultFile = null;

    for (const item of licenseFiles) {
      unspecifiedLangs.delete(item.langWithRegion);

      if (defaultFile == null) {
        defaultFile = item.file;
      }

      licensePage.push(`LicenseLangString MUILicense ${_langs().lcid[item.langWithRegion] || item.lang} "${item.file}"`);
    }

    for (const l of unspecifiedLangs) {
      licensePage.push(`LicenseLangString MUILicense ${_langs().lcid[l]} "${defaultFile}"`);
    }

    licensePage.push('!insertmacro MUI_PAGE_LICENSE "$(MUILicense)"');
    scriptGenerator.macro("licensePage", licensePage);
  });
  return _computeLicensePage.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=nsisLicense.js.map{"version":3,"sources":["../../../src/targets/nsis/nsisLicense.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AAIA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;SAEsB,kB;;;;;;sDAAf,WAAkC,QAAlC,EAAyD,OAAzD,EAA+E,eAA/E,EAAqH,SAArH,EAA6I;AAClJ,UAAM,OAAO,SAAS,2CAA2B,OAAO,CAAC,OAAnC,EAA4C,QAA5C,CAAtB;;AACA,QAAI,OAAO,IAAI,IAAf,EAAqB;AACnB,UAAI,WAAJ;;AACA,UAAI,OAAO,CAAC,QAAR,CAAiB,OAAjB,CAAJ,EAA+B;AAC7B,QAAA,WAAW,GAAG,CACZ,kDADY,EAEZ,sBAFY,EAGZ,0CAHY,EAIZ,2BAJY,EAKZ,+DALY,EAMZ,aANY,EAQZ,kCAAkC,IAAI,CAAC,IAAL,CAAU,4BAAV,EAA4B,mBAA5B,CAAgD,GARtE,CAAd;AAUD,OAXD,MAYK;AACH,QAAA,WAAW,GAAG,CAAC,kCAAkC,OAAO,GAA1C,CAAd;AACD;;AAED,MAAA,eAAe,CAAC,KAAhB,CAAsB,aAAtB,EAAqC,WAArC;;AACA,UAAI,OAAO,CAAC,QAAR,CAAiB,OAAjB,CAAJ,EAA+B;AAC7B,QAAA,eAAe,CAAC,KAAhB,CAAsB,iBAAtB,EAAyC,CAAC,0CAA0C,OAAO,GAAlD,CAAzC;AACD;;AACD;AACD;;AAED,UAAM,YAAY,SAAS,gCAAgB,QAAhB,CAA3B;;AACA,QAAI,YAAY,CAAC,MAAb,KAAwB,CAA5B,EAA+B;AAC7B;AACD;;AAED,UAAM,WAAW,GAAkB,EAAnC;AACA,UAAM,gBAAgB,GAAG,IAAI,GAAJ,CAAQ,SAAR,CAAzB;AAEA,QAAI,WAAW,GAAkB,IAAjC;;AACA,SAAK,MAAM,IAAX,IAAmB,YAAnB,EAAiC;AAC/B,MAAA,gBAAgB,CAAC,MAAjB,CAAwB,IAAI,CAAC,cAA7B;;AACA,UAAI,WAAW,IAAI,IAAnB,EAAyB;AACvB,QAAA,WAAW,GAAG,IAAI,CAAC,IAAnB;AACD;;AACD,MAAA,WAAW,CAAC,IAAZ,CAAiB,gCAAgC,cAAK,IAAI,CAAC,cAAV,KAA6B,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,GAArG;AACD;;AAED,SAAK,MAAM,CAAX,IAAgB,gBAAhB,EAAkC;AAChC,MAAA,WAAW,CAAC,IAAZ,CAAiB,gCAAgC,cAAK,CAAL,CAAO,KAAK,WAAW,GAAxE;AACD;;AAED,IAAA,WAAW,CAAC,IAAZ,CAAiB,+CAAjB;AACA,IAAA,eAAe,CAAC,KAAhB,CAAsB,aAAtB,EAAqC,WAArC;AACD,G","sourcesContent":["import { lcid } from \"../../util/langs\"\nimport { getLicenseFiles, getNotLocalizedLicenseFile } from \"../../util/license\"\nimport * as path from \"path\"\nimport { WinPackager } from \"../../winPackager\"\nimport { NsisOptions } from \"./nsisOptions\"\nimport { NsisScriptGenerator } from \"./nsisScriptGenerator\"\nimport { nsisTemplatesDir } from \"./nsisUtil\"\n\nexport async function computeLicensePage(packager: WinPackager, options: NsisOptions, scriptGenerator: NsisScriptGenerator, languages: Array<string>): Promise<void> {\n  const license = await getNotLocalizedLicenseFile(options.license, packager)\n  if (license != null) {\n    let licensePage: Array<string>\n    if (license.endsWith(\".html\")) {\n      licensePage = [\n        \"!define MUI_PAGE_CUSTOMFUNCTION_SHOW LicenseShow\",\n        \"Function LicenseShow\",\n        \"  FindWindow $R0 `#32770` `` $HWNDPARENT\",\n        \"  GetDlgItem $R0 $R0 1000\",\n        \"EmbedHTML::Load /replace $R0 file://$PLUGINSDIR\\\\license.html\",\n        \"FunctionEnd\",\n\n        `!insertmacro MUI_PAGE_LICENSE \"${path.join(nsisTemplatesDir, \"empty-license.txt\")}\"`,\n      ]\n    }\n    else {\n      licensePage = [`!insertmacro MUI_PAGE_LICENSE \"${license}\"`]\n    }\n\n    scriptGenerator.macro(\"licensePage\", licensePage)\n    if (license.endsWith(\".html\")) {\n      scriptGenerator.macro(\"addLicenseFiles\", [`File /oname=$PLUGINSDIR\\\\license.html \"${license}\"`])\n    }\n    return\n  }\n\n  const licenseFiles = await getLicenseFiles(packager)\n  if (licenseFiles.length === 0) {\n    return\n  }\n\n  const licensePage: Array<string> = []\n  const unspecifiedLangs = new Set(languages)\n\n  let defaultFile: string | null = null\n  for (const item of licenseFiles) {\n    unspecifiedLangs.delete(item.langWithRegion)\n    if (defaultFile == null) {\n      defaultFile = item.file\n    }\n    licensePage.push(`LicenseLangString MUILicense ${lcid[item.langWithRegion] || item.lang} \"${item.file}\"`)\n  }\n\n  for (const l of unspecifiedLangs) {\n    licensePage.push(`LicenseLangString MUILicense ${lcid[l]} \"${defaultFile}\"`)\n  }\n\n  licensePage.push('!insertmacro MUI_PAGE_LICENSE \"$(MUILicense)\"')\n  scriptGenerator.macro(\"licensePage\", licensePage)\n}\n"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=nsisOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.NsisScriptGenerator = void 0;

class NsisScriptGenerator {
  constructor() {
    this.lines = [];
  }

  addIncludeDir(file) {
    this.lines.push(`!addincludedir "${file}"`);
  }

  addPluginDir(pluginArch, dir) {
    this.lines.push(`!addplugindir /${pluginArch} "${dir}"`);
  }

  include(file) {
    this.lines.push(`!include "${file}"`);
  }

  macro(name, lines) {
    this.lines.push(`!macro ${name}`, `  ${(Array.isArray(lines) ? lines : lines.lines).join("\n  ")}`, `!macroend\n`);
  }

  file(outputName, file) {
    this.lines.push(`File${outputName == null ? "" : ` "/oname=${outputName}"`} "${file}"`);
  }

  insertMacro(name, parameters) {
    this.lines.push(`!insertmacro ${name} ${parameters}`);
  } // without -- !!!


  flags(flags) {
    for (const flagName of flags) {
      const variableName = getVarNameForFlag(flagName).replace(/[\-]+(\w|$)/g, (m, p1) => p1.toUpperCase());
      this.lines.push(`!macro _${variableName} _a _b _t _f
  $\{StdUtils.TestParameter} $R9 "${flagName}"
  StrCmp "$R9" "true" \`$\{_t}\` \`$\{_f}\`
!macroend
!define ${variableName} \`"" ${variableName} ""\`
`);
    }
  }

  build() {
    return this.lines.join("\n") + "\n";
  }

}

exports.NsisScriptGenerator = NsisScriptGenerator;

function getVarNameForFlag(flagName) {
  if (flagName === "allusers") {
    return "isForAllUsers";
  }

  if (flagName === "currentuser") {
    return "isForCurrentUser";
  }

  return "is" + flagName[0].toUpperCase() + flagName.substring(1);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=nsisScriptGenerator.js.map{"version":3,"sources":["../../../src/targets/nsis/nsisScriptGenerator.ts"],"names":[],"mappings":";;;;;;;AAAM,MAAO,mBAAP,CAA0B;AAAhC,EAAA,WAAA,GAAA;AACmB,SAAA,KAAA,GAAuB,EAAvB;AA+ClB;;AA7CC,EAAA,aAAa,CAAC,IAAD,EAAa;AACxB,SAAK,KAAL,CAAW,IAAX,CAAgB,mBAAmB,IAAI,GAAvC;AACD;;AAED,EAAA,YAAY,CAAC,UAAD,EAAqB,GAArB,EAAgC;AAC1C,SAAK,KAAL,CAAW,IAAX,CAAgB,kBAAkB,UAAU,KAAK,GAAG,GAApD;AACD;;AAED,EAAA,OAAO,CAAC,IAAD,EAAa;AAClB,SAAK,KAAL,CAAW,IAAX,CAAgB,aAAa,IAAI,GAAjC;AACD;;AAED,EAAA,KAAK,CAAC,IAAD,EAAe,KAAf,EAAyD;AAC5D,SAAK,KAAL,CAAW,IAAX,CACE,UAAU,IAAI,EADhB,EAEE,KAAK,CAAC,KAAK,CAAC,OAAN,CAAc,KAAd,IAAuB,KAAvB,GAAgC,KAA6B,CAAC,KAA/D,EAAsE,IAAtE,CAA2E,MAA3E,CAAkF,EAFzF,EAGE,aAHF;AAKD;;AAED,EAAA,IAAI,CAAC,UAAD,EAA4B,IAA5B,EAAwC;AAC1C,SAAK,KAAL,CAAW,IAAX,CAAgB,OAAO,UAAU,IAAI,IAAd,GAAqB,EAArB,GAA0B,YAAY,UAAU,GAAG,KAAK,IAAI,GAAnF;AACD;;AAED,EAAA,WAAW,CAAC,IAAD,EAAe,UAAf,EAAiC;AAC1C,SAAK,KAAL,CAAW,IAAX,CAAgB,gBAAgB,IAAI,IAAI,UAAU,EAAlD;AACD,GA7B6B,CA+B9B;;;AACA,EAAA,KAAK,CAAC,KAAD,EAAqB;AACxB,SAAK,MAAM,QAAX,IAAuB,KAAvB,EAA8B;AAC5B,YAAM,YAAY,GAAG,iBAAiB,CAAC,QAAD,CAAjB,CAClB,OADkB,CACV,cADU,EACM,CAAC,CAAD,EAAI,EAAJ,KAAW,EAAE,CAAC,WAAH,EADjB,CAArB;AAEA,WAAK,KAAL,CAAW,IAAX,CAAgB,WAAW,YAAY;oCACT,QAAQ;;;UAGlC,YAAY,SAAS,YAAY;CAJrC;AAMD;AACF;;AAED,EAAA,KAAK,GAAA;AACH,WAAO,KAAK,KAAL,CAAW,IAAX,CAAgB,IAAhB,IAAwB,IAA/B;AACD;;AA/C6B;;;;AAkDhC,SAAS,iBAAT,CAA2B,QAA3B,EAA2C;AACzC,MAAI,QAAQ,KAAK,UAAjB,EAA6B;AAC3B,WAAO,eAAP;AACD;;AACD,MAAI,QAAQ,KAAK,aAAjB,EAAgC;AAC9B,WAAO,kBAAP;AACD;;AACD,SAAO,OAAO,QAAQ,CAAC,CAAD,CAAR,CAAY,WAAZ,EAAP,GAAmC,QAAQ,CAAC,SAAT,CAAmB,CAAnB,CAA1C;AACD,C","sourcesContent":["export class NsisScriptGenerator {\n  private readonly lines: Array<string> = []\n\n  addIncludeDir(file: string) {\n    this.lines.push(`!addincludedir \"${file}\"`)\n  }\n\n  addPluginDir(pluginArch: string, dir: string) {\n    this.lines.push(`!addplugindir /${pluginArch} \"${dir}\"`)\n  }\n\n  include(file: string) {\n    this.lines.push(`!include \"${file}\"`)\n  }\n\n  macro(name: string, lines: Array<string> | NsisScriptGenerator) {\n    this.lines.push(\n      `!macro ${name}`,\n      `  ${(Array.isArray(lines) ? lines : (lines as NsisScriptGenerator).lines).join(\"\\n  \")}`,\n      `!macroend\\n`\n    )\n  }\n\n  file(outputName: string | null, file: string) {\n    this.lines.push(`File${outputName == null ? \"\" : ` \"/oname=${outputName}\"`} \"${file}\"`)\n  }\n\n  insertMacro(name: string, parameters: string) {\n    this.lines.push(`!insertmacro ${name} ${parameters}`)\n  }\n\n  // without -- !!!\n  flags(flags: Array<string>) {\n    for (const flagName of flags) {\n      const variableName = getVarNameForFlag(flagName)\n        .replace(/[\\-]+(\\w|$)/g, (m, p1) => p1.toUpperCase())\n      this.lines.push(`!macro _${variableName} _a _b _t _f\n  $\\{StdUtils.TestParameter} $R9 \"${flagName}\"\n  StrCmp \"$R9\" \"true\" \\`$\\{_t}\\` \\`$\\{_f}\\`\n!macroend\n!define ${variableName} \\`\"\" ${variableName} \"\"\\`\n`)\n    }\n  }\n\n  build() {\n    return this.lines.join(\"\\n\") + \"\\n\"\n  }\n}\n\nfunction getVarNameForFlag(flagName: string): string {\n  if (flagName === \"allusers\") {\n    return \"isForAllUsers\"\n  }\n  if (flagName === \"currentuser\") {\n    return \"isForCurrentUser\"\n  }\n  return \"is\" + flagName[0].toUpperCase() + flagName.substring(1)\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CopyElevateHelper = exports.AppPackageHelper = exports.NSIS_PATH = exports.nsisTemplatesDir = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _binDownload() {
  const data = require("../../binDownload");

  _binDownload = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _pathManager() {
  const data = require("../../util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const nsisTemplatesDir = (0, _pathManager().getTemplatePath)("nsis");
exports.nsisTemplatesDir = nsisTemplatesDir;
const NSIS_PATH = new (_lazyVal().Lazy)(() => {
  const custom = process.env.ELECTRON_BUILDER_NSIS_DIR;

  if (custom != null && custom.length > 0) {
    return Promise.resolve(custom.trim());
  } // noinspection SpellCheckingInspection


  return (0, _binDownload().getBinFromUrl)("nsis", "3.0.3.2", "tUrlDPQtbjcooNbTrjUzLupttWlATLDNWqK57TVr+gAt3wkaxFxBS3k80AzEFJbmSeOWrUooO72FFOVGXcoxhA==");
});
exports.NSIS_PATH = NSIS_PATH;

class AppPackageHelper {
  constructor(elevateHelper) {
    this.elevateHelper = elevateHelper;
    this.archToFileInfo = new Map();
    this.infoToIsDelete = new Map();
    /** @private */

    this.refCount = 0;
  }

  packArch(arch, target) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      let infoPromise = _this.archToFileInfo.get(arch);

      if (infoPromise == null) {
        const appOutDir = target.archs.get(arch);
        infoPromise = _this.elevateHelper.copy(appOutDir, target).then(() => target.buildAppPackage(appOutDir, arch));

        _this.archToFileInfo.set(arch, infoPromise);
      }

      const info = yield infoPromise;

      if (target.isWebInstaller) {
        _this.infoToIsDelete.set(info, false);
      } else if (!_this.infoToIsDelete.has(info)) {
        _this.infoToIsDelete.set(info, true);
      }

      return info;
    })();
  }

  finishBuild() {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (--_this2.refCount > 0) {
        return;
      }

      const filesToDelete = [];

      for (const [info, isDelete] of _this2.infoToIsDelete.entries()) {
        if (isDelete) {
          filesToDelete.push(info.path);
        }
      }

      yield _bluebirdLst().default.map(filesToDelete, it => (0, _fsExtraP().unlink)(it));
    })();
  }

}

exports.AppPackageHelper = AppPackageHelper;

class CopyElevateHelper {
  constructor() {
    this.copied = new Map();
  }

  copy(appOutDir, target) {
    if (!target.packager.info.framework.isCopyElevateHelper) {
      return Promise.resolve();
    }

    let isPackElevateHelper = target.options.packElevateHelper;

    if (isPackElevateHelper === false && target.options.perMachine === true) {
      isPackElevateHelper = true;

      _builderUtil().log.warn("`packElevateHelper = false` is ignored, because `perMachine` is set to `true`");
    }

    if (isPackElevateHelper === false) {
      return Promise.resolve();
    }

    let promise = this.copied.get(appOutDir);

    if (promise != null) {
      return promise;
    }

    promise = NSIS_PATH.value.then(it => {
      const outFile = path.join(appOutDir, "resources", "elevate.exe");
      const promise = (0, _fs().copyFile)(path.join(it, "elevate.exe"), outFile, false);

      if (target.packager.platformSpecificBuildOptions.signAndEditExecutable !== false) {
        return promise.then(() => target.packager.sign(outFile));
      }

      return promise;
    });
    this.copied.set(appOutDir, promise);
    return promise;
  }

} exports.CopyElevateHelper = CopyElevateHelper;
// __ts-babel@6.0.4
//# sourceMappingURL=nsisUtil.js.map{"version":3,"sources":["../../../src/targets/nsis/nsisUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, log } from \"builder-util\"\nimport { PackageFileInfo } from \"builder-util-runtime\"\nimport { getBinFromUrl } from \"../../binDownload\"\nimport { copyFile } from \"builder-util/out/fs\"\nimport { unlink } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { getTemplatePath } from \"../../util/pathManager\"\nimport { NsisTarget } from \"./NsisTarget\"\n\nexport const nsisTemplatesDir = getTemplatePath(\"nsis\")\n\nexport const NSIS_PATH = new Lazy(() => {\n  const custom = process.env.ELECTRON_BUILDER_NSIS_DIR\n  if (custom != null && custom.length > 0) {\n    return Promise.resolve(custom.trim())\n  }\n  // noinspection SpellCheckingInspection\n  return getBinFromUrl(\"nsis\", \"3.0.3.2\", \"tUrlDPQtbjcooNbTrjUzLupttWlATLDNWqK57TVr+gAt3wkaxFxBS3k80AzEFJbmSeOWrUooO72FFOVGXcoxhA==\")\n})\n\nexport class AppPackageHelper {\n  private readonly archToFileInfo = new Map<Arch, Promise<PackageFileInfo>>()\n  private readonly infoToIsDelete = new Map<PackageFileInfo, boolean>()\n\n  /** @private */\n  refCount = 0\n\n  constructor(private readonly elevateHelper: CopyElevateHelper) {\n  }\n\n  async packArch(arch: Arch, target: NsisTarget): Promise<PackageFileInfo> {\n    let infoPromise = this.archToFileInfo.get(arch)\n    if (infoPromise == null) {\n      const appOutDir = target.archs.get(arch)!\n      infoPromise = this.elevateHelper.copy(appOutDir, target)\n        .then(() => target.buildAppPackage(appOutDir, arch))\n      this.archToFileInfo.set(arch, infoPromise)\n    }\n\n    const info = await infoPromise\n    if (target.isWebInstaller) {\n      this.infoToIsDelete.set(info, false)\n    }\n    else if (!this.infoToIsDelete.has(info)) {\n      this.infoToIsDelete.set(info, true)\n    }\n    return info\n  }\n\n  async finishBuild(): Promise<any> {\n    if (--this.refCount > 0) {\n      return\n    }\n\n    const filesToDelete: Array<string> = []\n    for (const [info, isDelete] of this.infoToIsDelete.entries()) {\n      if (isDelete) {\n        filesToDelete.push(info.path)\n      }\n    }\n\n    await BluebirdPromise.map(filesToDelete, it => unlink(it))\n  }\n}\n\nexport class CopyElevateHelper {\n  private readonly copied = new Map<string, Promise<any>>()\n\n  copy(appOutDir: string, target: NsisTarget): Promise<any> {\n    if (!target.packager.info.framework.isCopyElevateHelper) {\n      return Promise.resolve()\n    }\n\n    let isPackElevateHelper = target.options.packElevateHelper\n    if (isPackElevateHelper === false && target.options.perMachine === true) {\n      isPackElevateHelper = true\n      log.warn(\"`packElevateHelper = false` is ignored, because `perMachine` is set to `true`\")\n    }\n\n    if (isPackElevateHelper === false) {\n      return Promise.resolve()\n    }\n\n    let promise = this.copied.get(appOutDir)\n    if (promise != null) {\n      return promise\n    }\n\n    promise = NSIS_PATH.value\n      .then(it => {\n        const outFile = path.join(appOutDir, \"resources\", \"elevate.exe\")\n        const promise = copyFile(path.join(it, \"elevate.exe\"), outFile, false)\n        if (target.packager.platformSpecificBuildOptions.signAndEditExecutable !== false) {\n          return promise.then(() => target.packager.sign(outFile))\n        }\n        return promise\n      })\n    this.copied.set(appOutDir, promise)\n    return promise\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ProjectInfoManager = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class ProjectInfoManager {
  constructor(packager) {
    this.packager = packager;
    this.infoFile = new (_lazyVal().Lazy)(() => this.saveConfigurationAndMetadata());
  }

  saveConfigurationAndMetadata() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;
      const tempDir = yield packager.tempDirManager.createTempDir({
        prefix: "remote-build-metadata"
      }); // we cannot use getTempFile because file name must be constant

      const info = {
        metadata: packager.metadata,
        configuration: packager.config,
        repositoryInfo: yield packager.repositoryInfo,
        buildResourceDirName: path.basename(packager.buildResourcesDir)
      };

      if (packager.metadata !== packager.devMetadata && packager.devMetadata != null) {
        info.devMetadata = packager.devMetadata;
      }

      const file = path.join(tempDir, "info.json");
      yield (0, _fsExtraP().outputJson)(file, info);
      return file;
    })();
  }

} exports.ProjectInfoManager = ProjectInfoManager;
// __ts-babel@6.0.4
//# sourceMappingURL=ProjectInfoManager.js.map{"version":3,"sources":["../../src/remoteBuilder/ProjectInfoManager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;;;AAGM,MAAO,kBAAP,CAAyB;AAG7B,EAAA,WAAA,CAAqB,QAArB,EAAuC;AAAlB,SAAA,QAAA,GAAA,QAAA;AAFZ,SAAA,QAAA,GAAW,KAAI,eAAJ,EAAS,MAAM,KAAK,4BAAL,EAAf,CAAX;AAGR;;AAEa,EAAA,4BAAN,GAAkC;AAAA;;AAAA;AACxC,YAAM,QAAQ,GAAG,KAAI,CAAC,QAAtB;AACA,YAAM,OAAO,SAAS,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAAsC;AAAC,QAAA,MAAM,EAAE;AAAT,OAAtC,CAAtB,CAFwC,CAGxC;;AACA,YAAM,IAAI,GAAQ;AAChB,QAAA,QAAQ,EAAE,QAAQ,CAAC,QADH;AAEhB,QAAA,aAAa,EAAE,QAAQ,CAAC,MAFR;AAGhB,QAAA,cAAc,QAAQ,QAAQ,CAAC,cAHf;AAIhB,QAAA,oBAAoB,EAAE,IAAI,CAAC,QAAL,CAAc,QAAQ,CAAC,iBAAvB;AAJN,OAAlB;;AAMA,UAAI,QAAQ,CAAC,QAAT,KAAsB,QAAQ,CAAC,WAA/B,IAA8C,QAAQ,CAAC,WAAT,IAAwB,IAA1E,EAAgF;AAC9E,QAAA,IAAI,CAAC,WAAL,GAAmB,QAAQ,CAAC,WAA5B;AACD;;AACD,YAAM,IAAI,GAAG,IAAI,CAAC,IAAL,CAAU,OAAV,EAAmB,WAAnB,CAAb;AACA,YAAM,4BAAW,IAAX,EAAiB,IAAjB,CAAN;AACA,aAAO,IAAP;AAfwC;AAgBzC;;AAtB4B,C","sourcesContent":["import { outputJson } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { Packager } from \"../packager\"\n\nexport class ProjectInfoManager {\n  readonly infoFile = new Lazy(() => this.saveConfigurationAndMetadata())\n\n  constructor(readonly packager: Packager) {\n  }\n\n  private async saveConfigurationAndMetadata() {\n    const packager = this.packager\n    const tempDir = await packager.tempDirManager.createTempDir({prefix: \"remote-build-metadata\"})\n    // we cannot use getTempFile because file name must be constant\n    const info: any = {\n      metadata: packager.metadata,\n      configuration: packager.config,\n      repositoryInfo: await packager.repositoryInfo,\n      buildResourceDirName: path.basename(packager.buildResourcesDir)\n    }\n    if (packager.metadata !== packager.devMetadata && packager.devMetadata != null) {\n      info.devMetadata = packager.devMetadata\n    }\n    const file = path.join(tempDir, \"info.json\")\n    await outputJson(file, info)\n    return file\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.RemoteBuilder = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _appBuilder() {
  const data = require("../util/appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _ProjectInfoManager() {
  const data = require("./ProjectInfoManager");

  _ProjectInfoManager = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class RemoteBuilder {
  constructor(packager) {
    this.packager = packager;
    this.toBuild = new Map();
    this.buildStarted = false;
  }

  scheduleBuild(target, arch, unpackedDirectory) {
    if (!(0, _builderUtil().isEnvTrue)(process.env._REMOTE_BUILD) && this.packager.config.remoteBuild === false) {
      throw new (_builderUtil().InvalidConfigurationError)("Target is not supported on your OS and using of Electron Build Service is disabled (\"remoteBuild\" option)");
    }

    let list = this.toBuild.get(arch);

    if (list == null) {
      list = [];
      this.toBuild.set(arch, list);
    }

    list.push({
      name: target.name,
      arch: _builderUtil().Arch[arch],
      unpackedDirectory,
      outDir: target.outDir
    });
  }

  build() {
    if (this.buildStarted) {
      return Promise.resolve();
    }

    this.buildStarted = true;
    return _bluebirdLst().default.mapSeries(Array.from(this.toBuild.keys()), arch => {
      return this._build(this.toBuild.get(arch), this.packager);
    });
  } // noinspection JSMethodCanBeStatic


  _build(targets, packager) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (_builderUtil().log.isDebugEnabled) {
        _builderUtil().log.debug({
          remoteTargets: JSON.stringify(targets, null, 2)
        }, "remote building");
      }

      const projectInfoManager = new (_ProjectInfoManager().ProjectInfoManager)(packager.info);
      const req = Buffer.from(JSON.stringify({
        targets: targets.map(it => {
          return {
            name: it.name,
            arch: it.arch,
            unpackedDirName: path.basename(it.unpackedDirectory)
          };
        }),
        platform: packager.platform.buildConfigurationKey
      })).toString("base64");
      const outDir = targets[0].outDir;
      const args = ["remote-build", "--request", req, "--output", outDir];
      args.push("--file", targets[0].unpackedDirectory);
      args.push("--file", (yield projectInfoManager.infoFile.value));
      const buildResourcesDir = packager.buildResourcesDir;

      if (buildResourcesDir === packager.projectDir) {
        throw new (_builderUtil().InvalidConfigurationError)(`Build resources dir equals to project dir and so, not sent to remote build agent. It will lead to incorrect results.\nPlease set "directories.buildResources" to separate dir or leave default ("build" directory in the project root)`);
      }

      args.push("--build-resource-dir", buildResourcesDir);
      const result = yield (0, _appBuilder().executeAppBuilderAsJson)(args);

      if (result.error != null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Remote builder error (if you think that it is not your application misconfiguration issue, please file issue to https://github.com/electron-userland/electron-builder/issues):\n\n${result.error}`, "REMOTE_BUILDER_ERROR");
      } else if (result.files != null) {
        for (const artifact of result.files) {
          const localFile = path.join(outDir, artifact.file);

          const artifactCreatedEvent = _this.artifactInfoToArtifactCreatedEvent(artifact, localFile, outDir); // PublishManager uses outDir and options, real (the same as for local build) values must be used


          yield _this.packager.info.callArtifactBuildCompleted(artifactCreatedEvent);
        }
      }
    })();
  }

  artifactInfoToArtifactCreatedEvent(artifact, localFile, outDir) {
    const target = artifact.target; // noinspection SpellCheckingInspection

    return Object.assign({}, artifact, {
      file: localFile,
      target: target == null ? null : new FakeTarget(target, outDir, this.packager.config[target]),
      packager: this.packager
    });
  }

}

exports.RemoteBuilder = RemoteBuilder;

class FakeTarget extends _core().Target {
  constructor(name, outDir, options) {
    super(name);
    this.outDir = outDir;
    this.options = options;
  }

  build(appOutDir, arch) {// no build

    return (0, _bluebirdLst().coroutine)(function* () {})();
  }

} 
// __ts-babel@6.0.4
//# sourceMappingURL=RemoteBuilder.js.map{"version":3,"sources":["../../src/remoteBuilder/RemoteBuilder.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AASM,MAAO,aAAP,CAAoB;AAIxB,EAAA,WAAA,CAAqB,QAArB,EAAoD;AAA/B,SAAA,QAAA,GAAA,QAAA;AAHJ,SAAA,OAAA,GAAU,IAAI,GAAJ,EAAV;AACT,SAAA,YAAA,GAAe,KAAf;AAGP;;AAED,EAAA,aAAa,CAAC,MAAD,EAAiB,IAAjB,EAA6B,iBAA7B,EAAsD;AACjE,QAAI,CAAC,8BAAU,OAAO,CAAC,GAAR,CAAY,aAAtB,CAAD,IAAyC,KAAK,QAAL,CAAc,MAAd,CAAqB,WAArB,KAAqC,KAAlF,EAAyF;AACvF,YAAM,KAAI,wCAAJ,EAA8B,6GAA9B,CAAN;AACD;;AAED,QAAI,IAAI,GAAG,KAAK,OAAL,CAAa,GAAb,CAAiB,IAAjB,CAAX;;AACA,QAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB,MAAA,IAAI,GAAG,EAAP;AACA,WAAK,OAAL,CAAa,GAAb,CAAiB,IAAjB,EAAuB,IAAvB;AACD;;AAED,IAAA,IAAI,CAAC,IAAL,CAAU;AACR,MAAA,IAAI,EAAE,MAAM,CAAC,IADL;AAER,MAAA,IAAI,EAAE,oBAAK,IAAL,CAFE;AAGR,MAAA,iBAHQ;AAIR,MAAA,MAAM,EAAE,MAAM,CAAC;AAJP,KAAV;AAMD;;AAED,EAAA,KAAK,GAAA;AACH,QAAI,KAAK,YAAT,EAAuB;AACrB,aAAO,OAAO,CAAC,OAAR,EAAP;AACD;;AAED,SAAK,YAAL,GAAoB,IAApB;AAEA,WAAO,uBAAgB,SAAhB,CAA0B,KAAK,CAAC,IAAN,CAAW,KAAK,OAAL,CAAa,IAAb,EAAX,CAA1B,EAA4D,IAAD,IAAe;AAC/E,aAAO,KAAK,MAAL,CAAY,KAAK,OAAL,CAAa,GAAb,CAAiB,IAAjB,CAAZ,EAAsC,KAAK,QAA3C,CAAP;AACD,KAFM,CAAP;AAGD,GApCuB,CAsCxB;;;AACc,EAAA,MAAN,CAAa,OAAb,EAAyC,QAAzC,EAAwE;AAAA;;AAAA;AAC9E,UAAI,mBAAI,cAAR,EAAwB;AACtB,2BAAI,KAAJ,CAAU;AAAC,UAAA,aAAa,EAAE,IAAI,CAAC,SAAL,CAAe,OAAf,EAAwB,IAAxB,EAA8B,CAA9B;AAAhB,SAAV,EAA6D,iBAA7D;AACD;;AAED,YAAM,kBAAkB,GAAG,KAAI,wCAAJ,EAAuB,QAAQ,CAAC,IAAhC,CAA3B;AAEA,YAAM,GAAG,GAAG,MAAM,CAAC,IAAP,CAAY,IAAI,CAAC,SAAL,CAAe;AACrC,QAAA,OAAO,EAAE,OAAO,CAAC,GAAR,CAAY,EAAE,IAAG;AACxB,iBAAO;AACL,YAAA,IAAI,EAAE,EAAE,CAAC,IADJ;AAEL,YAAA,IAAI,EAAE,EAAE,CAAC,IAFJ;AAGL,YAAA,eAAe,EAAE,IAAI,CAAC,QAAL,CAAc,EAAE,CAAC,iBAAjB;AAHZ,WAAP;AAKD,SANQ,CAD4B;AAQrC,QAAA,QAAQ,EAAE,QAAQ,CAAC,QAAT,CAAkB;AARS,OAAf,CAAZ,EASR,QATQ,CASC,QATD,CAAZ;AAUA,YAAM,MAAM,GAAG,OAAO,CAAC,CAAD,CAAP,CAAW,MAA1B;AACA,YAAM,IAAI,GAAG,CAAC,cAAD,EAAiB,WAAjB,EAA8B,GAA9B,EAAmC,UAAnC,EAA+C,MAA/C,CAAb;AAEA,MAAA,IAAI,CAAC,IAAL,CAAU,QAAV,EAAoB,OAAO,CAAC,CAAD,CAAP,CAAW,iBAA/B;AACA,MAAA,IAAI,CAAC,IAAL,CAAU,QAAV,SAA0B,kBAAkB,CAAC,QAAnB,CAA4B,KAAtD;AAEA,YAAM,iBAAiB,GAAG,QAAQ,CAAC,iBAAnC;;AACA,UAAI,iBAAiB,KAAK,QAAQ,CAAC,UAAnC,EAA+C;AAC7C,cAAM,KAAI,wCAAJ,EAA8B,wOAA9B,CAAN;AACD;;AAED,MAAA,IAAI,CAAC,IAAL,CAAU,sBAAV,EAAkC,iBAAlC;AAEA,YAAM,MAAM,SAAc,2CAAwB,IAAxB,CAA1B;;AACA,UAAI,MAAM,CAAC,KAAP,IAAgB,IAApB,EAA0B;AACxB,cAAM,KAAI,wCAAJ,EAA8B,qLAAqL,MAAM,CAAC,KAAK,EAA/N,EAAmO,sBAAnO,CAAN;AACD,OAFD,MAGK,IAAI,MAAM,CAAC,KAAP,IAAgB,IAApB,EAA0B;AAC7B,aAAK,MAAM,QAAX,IAAuB,MAAM,CAAC,KAA9B,EAAqC;AACnC,gBAAM,SAAS,GAAG,IAAI,CAAC,IAAL,CAAU,MAAV,EAAkB,QAAQ,CAAC,IAA3B,CAAlB;;AACA,gBAAM,oBAAoB,GAAG,KAAI,CAAC,kCAAL,CAAwC,QAAxC,EAAkD,SAAlD,EAA6D,MAA7D,CAA7B,CAFmC,CAGnC;;;AACA,gBAAM,KAAI,CAAC,QAAL,CAAc,IAAd,CAAmB,0BAAnB,CAA8C,oBAA9C,CAAN;AACD;AACF;AAzC6E;AA0C/E;;AAEO,EAAA,kCAAkC,CAAC,QAAD,EAAyB,SAAzB,EAA4C,MAA5C,EAA0D;AAClG,UAAM,MAAM,GAAG,QAAQ,CAAC,MAAxB,CADkG,CAElG;;AACA,WAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACK,QADL,EACa;AACX,MAAA,IAAI,EAAE,SADK;AAEX,MAAA,MAAM,EAAE,MAAM,IAAI,IAAV,GAAiB,IAAjB,GAAwB,IAAI,UAAJ,CAAe,MAAf,EAAuB,MAAvB,EAAgC,KAAK,QAAL,CAAc,MAAd,CAA6B,MAA7B,CAAhC,CAFrB;AAGX,MAAA,QAAQ,EAAE,KAAK;AAHJ,KADb,CAAA;AAMD;;AA5FuB;;;;AA+F1B,MAAM,UAAN,SAAyB,cAAzB,CAA+B;AAC7B,EAAA,WAAA,CAAY,IAAZ,EAAmC,MAAnC,EAA4D,OAA5D,EAA6G;AAC3G,UAAM,IAAN;AADiC,SAAA,MAAA,GAAA,MAAA;AAAyB,SAAA,OAAA,GAAA,OAAA;AAE3D;;AAEK,EAAA,KAAN,CAAY,SAAZ,EAA+B,IAA/B,EAAyC,CACvC;;AADuC;AAExC;;AAP4B,C","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, isEnvTrue, log, InvalidConfigurationError } from \"builder-util\"\nimport * as path from \"path\"\nimport { UploadTask } from \"electron-publish/out/publisher\"\nimport { Target, TargetSpecificOptions } from \"../core\"\nimport { ArtifactCreated } from \"../packagerApi\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { executeAppBuilderAsJson } from \"../util/appBuilder\"\nimport { ProjectInfoManager } from \"./ProjectInfoManager\"\n\ninterface TargetInfo {\n  name: string\n  arch: string\n  unpackedDirectory: string\n  outDir: string\n}\n\nexport class RemoteBuilder {\n  private readonly toBuild = new Map<Arch, Array<TargetInfo>>()\n  private buildStarted = false\n\n  constructor(readonly packager: PlatformPackager<any>) {\n  }\n\n  scheduleBuild(target: Target, arch: Arch, unpackedDirectory: string) {\n    if (!isEnvTrue(process.env._REMOTE_BUILD) && this.packager.config.remoteBuild === false) {\n      throw new InvalidConfigurationError(\"Target is not supported on your OS and using of Electron Build Service is disabled (\\\"remoteBuild\\\" option)\")\n    }\n\n    let list = this.toBuild.get(arch)\n    if (list == null) {\n      list = []\n      this.toBuild.set(arch, list)\n    }\n\n    list.push({\n      name: target.name,\n      arch: Arch[arch],\n      unpackedDirectory,\n      outDir: target.outDir,\n    })\n  }\n\n  build(): Promise<any> {\n    if (this.buildStarted) {\n      return Promise.resolve()\n    }\n\n    this.buildStarted = true\n\n    return BluebirdPromise.mapSeries(Array.from(this.toBuild.keys()), (arch: Arch) => {\n      return this._build(this.toBuild.get(arch)!!, this.packager)\n    })\n  }\n\n  // noinspection JSMethodCanBeStatic\n  private async _build(targets: Array<TargetInfo>, packager: PlatformPackager<any>): Promise<void> {\n    if (log.isDebugEnabled) {\n      log.debug({remoteTargets: JSON.stringify(targets, null, 2)}, \"remote building\")\n    }\n\n    const projectInfoManager = new ProjectInfoManager(packager.info)\n\n    const req = Buffer.from(JSON.stringify({\n      targets: targets.map(it => {\n        return {\n          name: it.name,\n          arch: it.arch,\n          unpackedDirName: path.basename(it.unpackedDirectory),\n        }\n      }),\n      platform: packager.platform.buildConfigurationKey,\n    })).toString(\"base64\")\n    const outDir = targets[0].outDir\n    const args = [\"remote-build\", \"--request\", req, \"--output\", outDir]\n\n    args.push(\"--file\", targets[0].unpackedDirectory)\n    args.push(\"--file\", await projectInfoManager.infoFile.value)\n\n    const buildResourcesDir = packager.buildResourcesDir\n    if (buildResourcesDir === packager.projectDir) {\n      throw new InvalidConfigurationError(`Build resources dir equals to project dir and so, not sent to remote build agent. It will lead to incorrect results.\\nPlease set \"directories.buildResources\" to separate dir or leave default (\"build\" directory in the project root)`)\n    }\n\n    args.push(\"--build-resource-dir\", buildResourcesDir)\n\n    const result: any = await executeAppBuilderAsJson(args)\n    if (result.error != null) {\n      throw new InvalidConfigurationError(`Remote builder error (if you think that it is not your application misconfiguration issue, please file issue to https://github.com/electron-userland/electron-builder/issues):\\n\\n${result.error}`, \"REMOTE_BUILDER_ERROR\")\n    }\n    else if (result.files != null) {\n      for (const artifact of result.files) {\n        const localFile = path.join(outDir, artifact.file)\n        const artifactCreatedEvent = this.artifactInfoToArtifactCreatedEvent(artifact, localFile, outDir)\n        // PublishManager uses outDir and options, real (the same as for local build) values must be used\n        await this.packager.info.callArtifactBuildCompleted(artifactCreatedEvent)\n      }\n    }\n  }\n\n  private artifactInfoToArtifactCreatedEvent(artifact: ArtifactInfo, localFile: string, outDir: string): ArtifactCreated {\n    const target = artifact.target\n    // noinspection SpellCheckingInspection\n    return {\n      ...artifact,\n      file: localFile,\n      target: target == null ? null : new FakeTarget(target, outDir, (this.packager.config as any)[target]),\n      packager: this.packager,\n    }\n  }\n}\n\nclass FakeTarget extends Target {\n  constructor(name: string, readonly outDir: string, readonly options: TargetSpecificOptions | null | undefined) {\n    super(name)\n  }\n\n  async build(appOutDir: string, arch: Arch) {\n    // no build\n  }\n}\n\ninterface ArtifactInfo extends UploadTask {\n  target: string | null\n\n  readonly isWriteUpdateInfo?: boolean\n  readonly updateInfo?: any\n}"],"sourceRoot":""}
"use strict";

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _() {
  const data = require("..");

  _ = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

if (process.env.BUILDER_REMOVE_STAGE_EVEN_IF_DEBUG == null) {
  process.env.BUILDER_REMOVE_STAGE_EVEN_IF_DEBUG = "true";
}

function doBuild(_x) {
  return _doBuild.apply(this, arguments);
}

function _doBuild() {
  _doBuild = (0, _bluebirdLst().coroutine)(function* (data) {
    if (process.env.APP_BUILDER_TMP_DIR == null) {
      throw new (_builderUtil().InvalidConfigurationError)("Env APP_BUILDER_TMP_DIR must be set for builder process");
    }

    const projectDir = process.env.PROJECT_DIR;

    if (projectDir == null) {
      throw new (_builderUtil().InvalidConfigurationError)("Env PROJECT_DIR must be set for builder process");
    }

    const targets = data.targets;

    if (data.platform == null) {
      throw new (_builderUtil().InvalidConfigurationError)("platform not specified");
    }

    if (targets == null) {
      throw new (_builderUtil().InvalidConfigurationError)("targets path not specified");
    }

    if (!Array.isArray(targets)) {
      throw new (_builderUtil().InvalidConfigurationError)("targets must be array of target name");
    }

    const infoFile = projectDir + path.sep + "info.json";
    const info = yield (0, _fsExtraP().readJson)(infoFile);
    const projectOutDir = process.env.PROJECT_OUT_DIR;

    if (projectDir == null) {
      throw new (_builderUtil().InvalidConfigurationError)("Env PROJECT_OUT_DIR must be set for builder process");
    } // yes, for now we expect the only target


    const prepackaged = projectDir + path.sep + targets[0].unpackedDirName; // do not use build function because we don't need to publish artifacts

    const options = {
      prepackaged,
      projectDir,
      [data.platform]: targets.map(it => it.name + ":" + it.arch),
      publish: "never"
    };
    const packager = new (_().Packager)(options);
    const artifacts = [];
    const relativePathOffset = projectOutDir.length + 1;
    packager.artifactCreated(event => {
      if (event.file == null) {
        return;
      }

      artifacts.push({
        file: event.file.substring(relativePathOffset),
        target: event.target == null ? null : event.target.name,
        arch: event.arch,
        safeArtifactName: event.safeArtifactName,
        isWriteUpdateInfo: event.isWriteUpdateInfo === true,
        updateInfo: event.updateInfo
      });
    });

    packager.stageDirPathCustomizer = (target, packager, arch) => {
      // snap creates a lot of files and so, we cannot use tmpfs to avoid out of memory error
      const parentDir = target.name === "snap" && !target.isUseTemplateApp ? projectOutDir : projectDir;
      return parentDir + path.sep + `__${target.name}-${_().Arch[arch]}`;
    }; // _build method expects final effective configuration - packager.options.config is ignored


    yield packager._build(Object.assign({}, info.configuration, {
      publish: null,
      beforeBuild: null,
      afterPack: null,
      afterSign: null,
      afterAllArtifactBuild: null,
      onNodeModuleFile: null,
      directories: {
        output: projectOutDir,
        buildResources: projectDir + path.sep + info.buildResourceDirName
      }
    }), info.metadata, info.devMetadata, info.repositoryInfo); // writeJson must be not used because it adds unwanted \n as last file symbol

    yield (0, _fsExtraP().writeFile)(path.join(process.env.APP_BUILDER_TMP_DIR, "__build-result.json"), JSON.stringify(artifacts));
  });
  return _doBuild.apply(this, arguments);
}

doBuild(JSON.parse(process.argv[2])).catch(error => {
  process.exitCode = 0;
  return (0, _fsExtraP().writeFile)(path.join(process.env.APP_BUILDER_TMP_DIR, "__build-result.json"), (error.stack || error).toString());
}); 
// __ts-babel@6.0.4
//# sourceMappingURL=builder-cli.js.map{"version":3,"sources":["../../src/remoteBuilder/builder-cli.ts"],"names":[],"mappings":"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","sourcesContent":["import { readJson, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { UploadTask, Arch, Packager, PackagerOptions, PublishOptions } from \"..\"\nimport { InvalidConfigurationError } from \"builder-util\"\nimport SnapTarget from \"../targets/snap\"\n\nif (process.env.BUILDER_REMOVE_STAGE_EVEN_IF_DEBUG == null) {\n  process.env.BUILDER_REMOVE_STAGE_EVEN_IF_DEBUG = \"true\"\n}\n\nasync function doBuild(data: BuildTask): Promise<void> {\n  if (process.env.APP_BUILDER_TMP_DIR == null) {\n    throw new InvalidConfigurationError(\"Env APP_BUILDER_TMP_DIR must be set for builder process\")\n  }\n\n  const projectDir = process.env.PROJECT_DIR\n  if (projectDir == null) {\n    throw new InvalidConfigurationError(\"Env PROJECT_DIR must be set for builder process\")\n  }\n\n  const targets = data.targets\n  if (data.platform == null) {\n    throw new InvalidConfigurationError(\"platform not specified\")\n  }\n  if (targets == null) {\n    throw new InvalidConfigurationError(\"targets path not specified\")\n  }\n  if (!Array.isArray(targets)) {\n    throw new InvalidConfigurationError(\"targets must be array of target name\")\n  }\n\n  const infoFile = projectDir + path.sep + \"info.json\"\n  const info = await readJson(infoFile)\n\n  const projectOutDir = process.env.PROJECT_OUT_DIR\n  if (projectDir == null) {\n    throw new InvalidConfigurationError(\"Env PROJECT_OUT_DIR must be set for builder process\")\n  }\n\n  // yes, for now we expect the only target\n  const prepackaged = projectDir + path.sep + targets[0].unpackedDirName\n  // do not use build function because we don't need to publish artifacts\n  const options: PackagerOptions & PublishOptions = {\n    prepackaged,\n    projectDir,\n    [data.platform]: targets.map(it => it.name + \":\" + it.arch),\n    publish: \"never\",\n  }\n  const packager = new Packager(options)\n\n  const artifacts: Array<ArtifactInfo> = []\n  const relativePathOffset = projectOutDir!!.length + 1\n  packager.artifactCreated(event => {\n    if (event.file == null) {\n      return\n    }\n\n    artifacts.push({\n      file: event.file.substring(relativePathOffset),\n      target: event.target == null ? null : event.target.name,\n      arch: event.arch,\n      safeArtifactName: event.safeArtifactName,\n      isWriteUpdateInfo: event.isWriteUpdateInfo === true,\n      updateInfo: event.updateInfo,\n    })\n  })\n\n  packager.stageDirPathCustomizer = (target, packager, arch) => {\n    // snap creates a lot of files and so, we cannot use tmpfs to avoid out of memory error\n    const parentDir = target.name === \"snap\" && !(target as SnapTarget).isUseTemplateApp ? projectOutDir : projectDir\n    return parentDir + path.sep + `__${target.name}-${Arch[arch]}`\n  }\n\n  // _build method expects final effective configuration - packager.options.config is ignored\n  await packager._build({\n    ...info.configuration,\n    publish: null,\n    beforeBuild: null,\n    afterPack: null,\n    afterSign: null,\n    afterAllArtifactBuild: null,\n    onNodeModuleFile: null,\n    directories: {\n      output: projectOutDir,\n      buildResources: projectDir + path.sep + info.buildResourceDirName\n    },\n  }, info.metadata, info.devMetadata, info.repositoryInfo)\n\n  // writeJson must be not used because it adds unwanted \\n as last file symbol\n  await writeFile(path.join(process.env.APP_BUILDER_TMP_DIR!!, \"__build-result.json\"), JSON.stringify(artifacts))\n}\n\ndoBuild(JSON.parse(process.argv[2]))\n  .catch(error => {\n    process.exitCode = 0\n    return writeFile(path.join(process.env.APP_BUILDER_TMP_DIR!!, \"__build-result.json\"), (error.stack || error).toString())\n  })\n\ninterface TargetInfo {\n  name: string\n  arch: string\n  unpackedDirName: string\n}\n\ninterface ArtifactInfo extends UploadTask {\n  target: string | null\n\n  readonly isWriteUpdateInfo?: boolean\n  readonly updateInfo?: any\n}\n\ninterface BuildTask {\n  platform: string\n  targets: Array<TargetInfo>\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ELECTRON_BUILD_SERVICE_CA_CERT = exports.ELECTRON_BUILD_SERVICE_LOCAL_CA_CERT = void 0;
// noinspection SpellCheckingInspection
const ELECTRON_BUILD_SERVICE_LOCAL_CA_CERT = Buffer.from(`-----BEGIN CERTIFICATE-----
MIIBiDCCAS+gAwIBAgIRAPHSzTRLcN2nElhQdaRP47IwCgYIKoZIzj0EAwIwJDEi
MCAGA1UEAxMZZWxlY3Ryb24uYnVpbGQubG9jYWwgcm9vdDAeFw0xNzExMTMxNzI4
NDFaFw0yNzExMTExNzI4NDFaMCQxIjAgBgNVBAMTGWVsZWN0cm9uLmJ1aWxkLmxv
Y2FsIHJvb3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQVyduuCT2acuk2QH06
yal/b6O7eTTpOHk3Ucjc+ZZta2vC2+c1IKcSAwimKbTbK+nRxWWJl9ZYx9RTwbRf
QjD6o0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
FgQUlm08vBe4CUNAOTQN5Z1RNTfJjjYwCgYIKoZIzj0EAwIDRwAwRAIgMXlT6YM8
4pQtnhUjijVMz+NlcYafS1CEbNBMaWhP87YCIGXUmu7ON9hRLanXzBNBlrtTQG+i
l/NT6REwZA64/lNy
-----END CERTIFICATE-----
`); // noinspection SpellCheckingInspection

exports.ELECTRON_BUILD_SERVICE_LOCAL_CA_CERT = ELECTRON_BUILD_SERVICE_LOCAL_CA_CERT;
const ELECTRON_BUILD_SERVICE_CA_CERT = Buffer.from(`-----BEGIN CERTIFICATE-----
MIIBfTCCASOgAwIBAgIRAIdieK1+3C4abgOvQ7pVVqAwCgYIKoZIzj0EAwIwHjEc
MBoGA1UEAxMTZWxlY3Ryb24uYnVpbGQgcm9vdDAeFw0xNzExMTMxNzI4NDFaFw0x
ODExMTMxNzI4NDFaMB4xHDAaBgNVBAMTE2VsZWN0cm9uLmJ1aWxkIHJvb3QwWTAT
BgcqhkjOPQIBBggqhkjOPQMBBwNCAAR+4b6twzizN/z27yvwrCV5kinGUrfo+W7n
L/l28ErscNe1BDSyh/IYrnMWb1rDMSLGhvkgI9Cfex1whNPHR101o0IwQDAOBgNV
HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU6Dq8kK7tQlrt
zkIYrYiTZGpHEp0wCgYIKoZIzj0EAwIDSAAwRQIgKSfjAQbYlY/S1wMLUi84r8QN
hhMnUwsOmlDan0xPalICIQDLIAXAIyArVtH38a4aizvhH8YeXrxzpJh3U8RolBZF
SA==
-----END CERTIFICATE-----
`); exports.ELECTRON_BUILD_SERVICE_CA_CERT = ELECTRON_BUILD_SERVICE_CA_CERT;
// __ts-babel@6.0.4
//# sourceMappingURL=remote-builder-certs.js.map{"version":3,"sources":["../../src/remoteBuilder/remote-builder-certs.ts"],"names":[],"mappings":";;;;;;AAAA;AACO,MAAM,oCAAoC,GAAG,MAAM,CAAC,IAAP,CAAY;;;;;;;;;;;CAAZ,CAA7C,C,CAaP;;;AACO,MAAM,8BAA8B,GAAG,MAAM,CAAC,IAAP,CAAY;;;;;;;;;;;CAAZ,CAAvC,C","sourcesContent":["// noinspection SpellCheckingInspection\nexport const ELECTRON_BUILD_SERVICE_LOCAL_CA_CERT = Buffer.from(`-----BEGIN CERTIFICATE-----\nMIIBiDCCAS+gAwIBAgIRAPHSzTRLcN2nElhQdaRP47IwCgYIKoZIzj0EAwIwJDEi\nMCAGA1UEAxMZZWxlY3Ryb24uYnVpbGQubG9jYWwgcm9vdDAeFw0xNzExMTMxNzI4\nNDFaFw0yNzExMTExNzI4NDFaMCQxIjAgBgNVBAMTGWVsZWN0cm9uLmJ1aWxkLmxv\nY2FsIHJvb3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQVyduuCT2acuk2QH06\nyal/b6O7eTTpOHk3Ucjc+ZZta2vC2+c1IKcSAwimKbTbK+nRxWWJl9ZYx9RTwbRf\nQjD6o0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\nFgQUlm08vBe4CUNAOTQN5Z1RNTfJjjYwCgYIKoZIzj0EAwIDRwAwRAIgMXlT6YM8\n4pQtnhUjijVMz+NlcYafS1CEbNBMaWhP87YCIGXUmu7ON9hRLanXzBNBlrtTQG+i\nl/NT6REwZA64/lNy\n-----END CERTIFICATE-----\n`)\n\n// noinspection SpellCheckingInspection\nexport const ELECTRON_BUILD_SERVICE_CA_CERT = Buffer.from(`-----BEGIN CERTIFICATE-----\nMIIBfTCCASOgAwIBAgIRAIdieK1+3C4abgOvQ7pVVqAwCgYIKoZIzj0EAwIwHjEc\nMBoGA1UEAxMTZWxlY3Ryb24uYnVpbGQgcm9vdDAeFw0xNzExMTMxNzI4NDFaFw0x\nODExMTMxNzI4NDFaMB4xHDAaBgNVBAMTE2VsZWN0cm9uLmJ1aWxkIHJvb3QwWTAT\nBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR+4b6twzizN/z27yvwrCV5kinGUrfo+W7n\nL/l28ErscNe1BDSyh/IYrnMWb1rDMSLGhvkgI9Cfex1whNPHR101o0IwQDAOBgNV\nHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU6Dq8kK7tQlrt\nzkIYrYiTZGpHEp0wCgYIKoZIzj0EAwIDSAAwRQIgKSfjAQbYlY/S1wMLUi84r8QN\nhhMnUwsOmlDan0xPalICIQDLIAXAIyArVtH38a4aizvhH8YeXrxzpJh3U8RolBZF\nSA==\n-----END CERTIFICATE-----\n`)"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getAppUpdatePublishConfiguration = getAppUpdatePublishConfiguration;
exports.getPublishConfigsForUpdateInfo = getPublishConfigsForUpdateInfo;
exports.createPublisher = createPublisher;
exports.computeDownloadUrl = computeDownloadUrl;
exports.getPublishConfigs = getPublishConfigs;
exports.PublishManager = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

var _debug2 = _interopRequireDefault(require("debug"));

function _electronPublish() {
  const data = require("electron-publish");

  _electronPublish = function () {
    return data;
  };

  return data;
}

function _BintrayPublisher() {
  const data = require("electron-publish/out/BintrayPublisher");

  _BintrayPublisher = function () {
    return data;
  };

  return data;
}

function _gitHubPublisher() {
  const data = require("electron-publish/out/gitHubPublisher");

  _gitHubPublisher = function () {
    return data;
  };

  return data;
}

function _multiProgress() {
  const data = require("electron-publish/out/multiProgress");

  _multiProgress = function () {
    return data;
  };

  return data;
}

function _s3Publisher() {
  const data = _interopRequireDefault(require("electron-publish/out/s3/s3Publisher"));

  _s3Publisher = function () {
    return data;
  };

  return data;
}

function _spacesPublisher() {
  const data = _interopRequireDefault(require("electron-publish/out/s3/spacesPublisher"));

  _spacesPublisher = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _isCi() {
  const data = _interopRequireDefault(require("is-ci"));

  _isCi = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function url() {
  const data = _interopRequireWildcard(require("url"));

  url = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("../index");

  _index = function () {
    return data;
  };

  return data;
}

function _macroExpander() {
  const data = require("../util/macroExpander");

  _macroExpander = function () {
    return data;
  };

  return data;
}

function _updateInfoBuilder() {
  const data = require("./updateInfoBuilder");

  _updateInfoBuilder = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const publishForPrWarning = "There are serious security concerns with PUBLISH_FOR_PULL_REQUEST=true (see the  CircleCI documentation (https://circleci.com/docs/1.0/fork-pr-builds/) for details)" + "\nIf you have SSH keys, sensitive env vars or AWS credentials stored in your project settings and untrusted forks can make pull requests against your repo, then this option isn't for you.";
const debug = (0, _debug2.default)("electron-builder:publish");

function checkOptions(publishPolicy) {
  if (publishPolicy != null && publishPolicy !== "onTag" && publishPolicy !== "onTagOrDraft" && publishPolicy !== "always" && publishPolicy !== "never") {
    if (typeof publishPolicy === "string") {
      throw new (_builderUtil().InvalidConfigurationError)(`Expected one of "onTag", "onTagOrDraft", "always", "never", but got ${JSON.stringify(publishPolicy)}.\nPlease note that publish configuration should be specified under "config"`);
    }
  }
}

class PublishManager {
  constructor(packager, publishOptions, cancellationToken = packager.cancellationToken) {
    var _this = this;

    this.packager = packager;
    this.publishOptions = publishOptions;
    this.cancellationToken = cancellationToken;
    this.nameToPublisher = new Map();
    this.isPublish = false;
    this.progress = process.stdout.isTTY ? new (_multiProgress().MultiProgress)() : null;
    this.updateFileWriteTask = [];
    checkOptions(publishOptions.publish);
    this.taskManager = new (_builderUtil().AsyncTaskManager)(cancellationToken);
    const forcePublishForPr = process.env.PUBLISH_FOR_PULL_REQUEST === "true";

    if (!(0, _builderUtil().isPullRequest)() || forcePublishForPr) {
      if (publishOptions.publish === undefined) {
        if (process.env.npm_lifecycle_event === "release") {
          publishOptions.publish = "always";
        } else {
          const tag = (0, _electronPublish().getCiTag)();

          if (tag != null) {
            _builderUtil().log.info({
              reason: "tag is defined",
              tag
            }, "artifacts will be published");

            publishOptions.publish = "onTag";
          } else if (_isCi().default) {
            _builderUtil().log.info({
              reason: "CI detected"
            }, "artifacts will be published if draft release exists");

            publishOptions.publish = "onTagOrDraft";
          }
        }
      }

      const publishPolicy = publishOptions.publish;
      this.isPublish = publishPolicy != null && publishOptions.publish !== "never" && (publishPolicy !== "onTag" || (0, _electronPublish().getCiTag)() != null);

      if (this.isPublish && forcePublishForPr) {
        _builderUtil().log.warn(publishForPrWarning);
      }
    } else if (publishOptions.publish !== "never") {
      _builderUtil().log.info({
        reason: "current build is a part of pull request",
        solution: `set env PUBLISH_FOR_PULL_REQUEST to true to force code signing\n${publishForPrWarning}`
      }, "publishing will be skipped");
    }

    packager.addAfterPackHandler(
    /*#__PURE__*/
    function () {
      var _ref = (0, _bluebirdLst().coroutine)(function* (event) {
        const packager = event.packager;

        if (event.electronPlatformName === "darwin") {
          if (!event.targets.some(it => it.name === "dmg" || it.name === "zip")) {
            return;
          }
        } else if (packager.platform === _index().Platform.WINDOWS) {
          if (!event.targets.some(it => isSuitableWindowsTarget(it))) {
            return;
          }
        } else {
          // AppImage writes data to AppImage stage dir, not to linux-unpacked
          return;
        }

        const publishConfig = yield getAppUpdatePublishConfiguration(packager, event.arch, _this.isPublish);

        if (publishConfig != null) {
          yield (0, _fsExtraP().writeFile)(path.join(packager.getResourcesDir(event.appOutDir), "app-update.yml"), (0, _builderUtil().serializeToYaml)(publishConfig));
        }
      });

      return function (_x) {
        return _ref.apply(this, arguments);
      };
    }());
    packager.artifactCreated(event => {
      const publishConfiguration = event.publishConfig;

      if (publishConfiguration == null) {
        this.taskManager.addTask(this.artifactCreatedWithoutExplicitPublishConfig(event));
      } else if (this.isPublish) {
        if (debug.enabled) {
          debug(`artifactCreated (isPublish: ${this.isPublish}): ${(0, _builderUtil().safeStringifyJson)(event, new Set(["packager"]))},\n  publishConfig: ${(0, _builderUtil().safeStringifyJson)(publishConfiguration)}`);
        }

        this.scheduleUpload(publishConfiguration, event, this.getAppInfo(event.packager));
      }
    });
  }

  getAppInfo(platformPackager) {
    return platformPackager == null ? this.packager.appInfo : platformPackager.appInfo;
  }

  getGlobalPublishConfigurations() {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const publishers = _this2.packager.config.publish;
      return yield resolvePublishConfigurations(publishers, null, _this2.packager, null, true);
    })();
  }
  /** @internal */


  scheduleUpload(publishConfig, event, appInfo) {
    if (publishConfig.provider === "generic") {
      return;
    }

    const publisher = this.getOrCreatePublisher(publishConfig, appInfo);

    if (publisher == null) {
      _builderUtil().log.debug({
        file: event.file,
        reason: "publisher is null",
        publishConfig: (0, _builderUtil().safeStringifyJson)(publishConfig)
      }, "not published");

      return;
    }

    const providerName = publisher.providerName;

    if (this.publishOptions.publish === "onTagOrDraft" && (0, _electronPublish().getCiTag)() == null && !(providerName === "GitHub" || providerName === "Bintray")) {
      _builderUtil().log.info({
        file: event.file,
        reason: "current build is not for a git tag",
        publishPolicy: "onTagOrDraft"
      }, `not published to ${providerName}`);

      return;
    }

    this.taskManager.addTask(publisher.upload(event));
  }

  artifactCreatedWithoutExplicitPublishConfig(event) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const platformPackager = event.packager;
      const target = event.target;
      const publishConfigs = yield getPublishConfigs(platformPackager, target == null ? null : target.options, event.arch, _this3.isPublish);

      if (debug.enabled) {
        debug(`artifactCreated (isPublish: ${_this3.isPublish}): ${(0, _builderUtil().safeStringifyJson)(event, new Set(["packager"]))},\n  publishConfigs: ${(0, _builderUtil().safeStringifyJson)(publishConfigs)}`);
      }

      const eventFile = event.file;

      if (publishConfigs == null) {
        if (_this3.isPublish) {
          _builderUtil().log.debug({
            file: eventFile,
            reason: "no publish configs"
          }, "not published");
        }

        return;
      }

      if (_this3.isPublish) {
        for (const publishConfig of publishConfigs) {
          if (_this3.cancellationToken.cancelled) {
            _builderUtil().log.debug({
              file: event.file,
              reason: "cancelled"
            }, "not published");

            break;
          }

          _this3.scheduleUpload(publishConfig, event, _this3.getAppInfo(platformPackager));
        }
      }

      if (event.isWriteUpdateInfo && target != null && eventFile != null && !_this3.cancellationToken.cancelled && (platformPackager.platform !== _index().Platform.WINDOWS || isSuitableWindowsTarget(target))) {
        _this3.taskManager.addTask((0, _updateInfoBuilder().createUpdateInfoTasks)(event, publishConfigs).then(it => _this3.updateFileWriteTask.push(...it)));
      }
    })();
  }

  getOrCreatePublisher(publishConfig, appInfo) {
    // to not include token into cache key
    const providerCacheKey = (0, _builderUtil().safeStringifyJson)(publishConfig);
    let publisher = this.nameToPublisher.get(providerCacheKey);

    if (publisher == null) {
      publisher = createPublisher(this, appInfo.version, publishConfig, this.publishOptions, this.packager);
      this.nameToPublisher.set(providerCacheKey, publisher);

      _builderUtil().log.info({
        publisher: publisher.toString()
      }, "publishing");
    }

    return publisher;
  } // noinspection JSUnusedGlobalSymbols


  cancelTasks() {
    this.taskManager.cancelTasks();
    this.nameToPublisher.clear();
  }

  awaitTasks() {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield _this4.taskManager.awaitTasks();
      const updateInfoFileTasks = _this4.updateFileWriteTask;

      if (_this4.cancellationToken.cancelled || updateInfoFileTasks.length === 0) {
        return;
      }

      yield (0, _updateInfoBuilder().writeUpdateInfoFiles)(updateInfoFileTasks, _this4.packager);
      yield _this4.taskManager.awaitTasks();
    })();
  }

}

exports.PublishManager = PublishManager;

function getAppUpdatePublishConfiguration(_x2, _x3, _x4) {
  return _getAppUpdatePublishConfiguration.apply(this, arguments);
}

function _getAppUpdatePublishConfiguration() {
  _getAppUpdatePublishConfiguration = (0, _bluebirdLst().coroutine)(function* (packager, arch, errorIfCannot) {
    const publishConfigs = yield getPublishConfigsForUpdateInfo(packager, (yield getPublishConfigs(packager, null, arch, errorIfCannot)), arch);

    if (publishConfigs == null || publishConfigs.length === 0) {
      return null;
    }

    const publishConfig = Object.assign({}, publishConfigs[0], {
      updaterCacheDirName: packager.appInfo.updaterCacheDirName
    });

    if (packager.platform === _index().Platform.WINDOWS && publishConfig.publisherName == null) {
      const winPackager = packager;
      const publisherName = winPackager.isForceCodeSigningVerification ? yield winPackager.computedPublisherName.value : undefined;

      if (publisherName != null) {
        publishConfig.publisherName = publisherName;
      }
    }

    return publishConfig;
  });
  return _getAppUpdatePublishConfiguration.apply(this, arguments);
}

function getPublishConfigsForUpdateInfo(_x5, _x6, _x7) {
  return _getPublishConfigsForUpdateInfo.apply(this, arguments);
}

function _getPublishConfigsForUpdateInfo() {
  _getPublishConfigsForUpdateInfo = (0, _bluebirdLst().coroutine)(function* (packager, publishConfigs, arch) {
    if (publishConfigs === null) {
      return null;
    }

    if (publishConfigs.length === 0) {
      _builderUtil().log.debug(null, "getPublishConfigsForUpdateInfo: no publishConfigs, detect using repository info"); // https://github.com/electron-userland/electron-builder/issues/925#issuecomment-261732378
      // default publish config is github, file should be generated regardless of publish state (user can test installer locally or manage the release process manually)


      const repositoryInfo = yield packager.info.repositoryInfo;
      debug(`getPublishConfigsForUpdateInfo: ${(0, _builderUtil().safeStringifyJson)(repositoryInfo)}`);

      if (repositoryInfo != null && repositoryInfo.type === "github") {
        const resolvedPublishConfig = yield getResolvedPublishConfig(packager, packager.info, {
          provider: repositoryInfo.type
        }, arch, false);

        if (resolvedPublishConfig != null) {
          debug(`getPublishConfigsForUpdateInfo: resolve to publish config ${(0, _builderUtil().safeStringifyJson)(resolvedPublishConfig)}`);
          return [resolvedPublishConfig];
        }
      }
    }

    return publishConfigs;
  });
  return _getPublishConfigsForUpdateInfo.apply(this, arguments);
}

function createPublisher(context, version, publishConfig, options, packager) {
  if (debug.enabled) {
    debug(`Create publisher: ${(0, _builderUtil().safeStringifyJson)(publishConfig)}`);
  }

  const provider = publishConfig.provider;

  switch (provider) {
    case "github":
      return new (_gitHubPublisher().GitHubPublisher)(context, publishConfig, version, options);

    case "bintray":
      return new (_BintrayPublisher().BintrayPublisher)(context, publishConfig, version, options);

    case "generic":
      return null;

    default:
      const clazz = requireProviderClass(provider, packager);
      return clazz == null ? null : new clazz(context, publishConfig);
  }
}

function requireProviderClass(provider, packager) {
  switch (provider) {
    case "github":
      return _gitHubPublisher().GitHubPublisher;

    case "bintray":
      return _BintrayPublisher().BintrayPublisher;

    case "generic":
      return null;

    case "s3":
      return _s3Publisher().default;

    case "spaces":
      return _spacesPublisher().default;

    default:
      const name = `electron-publisher-${provider}`;
      let module = null;

      try {
        module = require(path.join(packager.buildResourcesDir, name + ".js"));
      } catch (ignored) {
        console.log(ignored);
      }

      if (module == null) {
        module = require(name);
      }

      return module.default || module;
  }
}

function computeDownloadUrl(publishConfiguration, fileName, packager) {
  if (publishConfiguration.provider === "generic") {
    const baseUrlString = publishConfiguration.url;

    if (fileName == null) {
      return baseUrlString;
    }

    const baseUrl = url().parse(baseUrlString);
    return url().format(Object.assign({}, baseUrl, {
      pathname: path.posix.resolve(baseUrl.pathname || "/", encodeURI(fileName))
    }));
  }

  let baseUrl;

  if (publishConfiguration.provider === "github") {
    const gh = publishConfiguration;
    baseUrl = `${(0, _builderUtilRuntime().githubUrl)(gh)}/${gh.owner}/${gh.repo}/releases/download/${gh.vPrefixedTagName === false ? "" : "v"}${packager.appInfo.version}`;
  } else {
    baseUrl = (0, _builderUtilRuntime().getS3LikeProviderBaseUrl)(publishConfiguration);
  }

  if (fileName == null) {
    return baseUrl;
  }

  return `${baseUrl}/${encodeURI(fileName)}`;
}

function getPublishConfigs(_x8, _x9, _x10, _x11) {
  return _getPublishConfigs.apply(this, arguments);
}

function _getPublishConfigs() {
  _getPublishConfigs = (0, _bluebirdLst().coroutine)(function* (platformPackager, targetSpecificOptions, arch, errorIfCannot) {
    let publishers; // check build.nsis (target)

    if (targetSpecificOptions != null) {
      publishers = targetSpecificOptions.publish; // if explicitly set to null - do not publish

      if (publishers === null) {
        return null;
      }
    } // check build.win (platform)


    if (publishers == null) {
      publishers = platformPackager.platformSpecificBuildOptions.publish;

      if (publishers === null) {
        return null;
      }
    }

    if (publishers == null) {
      publishers = platformPackager.config.publish;

      if (publishers === null) {
        return null;
      }
    }

    return yield resolvePublishConfigurations(publishers, platformPackager, platformPackager.info, arch, errorIfCannot);
  });
  return _getPublishConfigs.apply(this, arguments);
}

function resolvePublishConfigurations(_x12, _x13, _x14, _x15, _x16) {
  return _resolvePublishConfigurations.apply(this, arguments);
}

function _resolvePublishConfigurations() {
  _resolvePublishConfigurations = (0, _bluebirdLst().coroutine)(function* (publishers, platformPackager, packager, arch, errorIfCannot) {
    if (publishers == null) {
      let serviceName = null;

      if (!(0, _builderUtil().isEmptyOrSpaces)(process.env.GH_TOKEN) || !(0, _builderUtil().isEmptyOrSpaces)(process.env.GITHUB_TOKEN)) {
        serviceName = "github";
      } else if (!(0, _builderUtil().isEmptyOrSpaces)(process.env.BT_TOKEN)) {
        serviceName = "bintray";
      }

      if (serviceName != null) {
        _builderUtil().log.debug(null, `Detect ${serviceName} as publish provider`);

        return [yield getResolvedPublishConfig(platformPackager, packager, {
          provider: serviceName
        }, arch, errorIfCannot)];
      }
    }

    if (publishers == null) {
      return [];
    }

    debug(`Explicit publish provider: ${(0, _builderUtil().safeStringifyJson)(publishers)}`);
    return yield _bluebirdLst().default.map((0, _builderUtil().asArray)(publishers), it => getResolvedPublishConfig(platformPackager, packager, typeof it === "string" ? {
      provider: it
    } : it, arch, errorIfCannot));
  });
  return _resolvePublishConfigurations.apply(this, arguments);
}

function isSuitableWindowsTarget(target) {
  if (target.name === "appx" && target.options != null && target.options.electronUpdaterAware) {
    return true;
  }

  return target.name === "nsis" || target.name.startsWith("nsis-");
}

function expandPublishConfig(options, platformPackager, packager, arch) {
  for (const name of Object.keys(options)) {
    const value = options[name];

    if (typeof value === "string") {
      const archValue = arch == null ? null : _builderUtil().Arch[arch];
      const expanded = platformPackager == null ? (0, _macroExpander().expandMacro)(value, archValue, packager.appInfo) : platformPackager.expandMacro(value, archValue);

      if (expanded !== value) {
        options[name] = expanded;
      }
    }
  }
}

function isDetectUpdateChannel(platformSpecificConfiguration, configuration) {
  const value = platformSpecificConfiguration == null ? null : platformSpecificConfiguration.detectUpdateChannel;
  return value == null ? configuration.detectUpdateChannel !== false : value;
}

function getResolvedPublishConfig(_x17, _x18, _x19, _x20, _x21) {
  return _getResolvedPublishConfig.apply(this, arguments);
} function _getResolvedPublishConfig() {
  _getResolvedPublishConfig = (0, _bluebirdLst().coroutine)(function* (platformPackager, packager, options, arch, errorIfCannot) {
    options = Object.assign({}, options);
    expandPublishConfig(options, platformPackager, packager, arch);
    let channelFromAppVersion = null;

    if (options.channel == null && isDetectUpdateChannel(platformPackager == null ? null : platformPackager.platformSpecificBuildOptions, packager.config)) {
      channelFromAppVersion = packager.appInfo.channel;
    }

    const provider = options.provider;

    if (provider === "generic") {
      const o = options;

      if (o.url == null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Please specify "url" for "generic" update server`);
      }

      if (channelFromAppVersion != null) {
        o.channel = channelFromAppVersion;
      }

      return options;
    }

    const providerClass = requireProviderClass(options.provider, packager);

    if (providerClass != null && providerClass.checkAndResolveOptions != null) {
      yield providerClass.checkAndResolveOptions(options, channelFromAppVersion, errorIfCannot);
      return options;
    }

    const isGithub = provider === "github";

    if (!isGithub && provider !== "bintray") {
      return options;
    }

    let owner = isGithub ? options.owner : options.owner;
    let project = isGithub ? options.repo : options.package;

    if (isGithub && owner == null && project != null) {
      const index = project.indexOf("/");

      if (index > 0) {
        const repo = project;
        project = repo.substring(0, index);
        owner = repo.substring(index + 1);
      }
    }

    function getInfo() {
      return _getInfo.apply(this, arguments);
    }

    function _getInfo() {
      _getInfo = (0, _bluebirdLst().coroutine)(function* () {
        const info = yield packager.repositoryInfo;

        if (info != null) {
          return info;
        }

        const message = `Cannot detect repository by .git/config. Please specify "repository" in the package.json (https://docs.npmjs.com/files/package.json#repository).\nPlease see https://electron.build/configuration/publish`;

        if (errorIfCannot) {
          throw new Error(message);
        } else {
          _builderUtil().log.warn(message);

          return null;
        }
      });
      return _getInfo.apply(this, arguments);
    }

    if (!owner || !project) {
      _builderUtil().log.debug({
        reason: "owner or project is not specified explicitly",
        provider,
        owner,
        project
      }, "calling getInfo");

      const info = yield getInfo();

      if (info == null) {
        return null;
      }

      if (!owner) {
        owner = info.user;
      }

      if (!project) {
        project = info.project;
      }
    }

    if (isGithub) {
      if (options.token != null && !options.private) {
        _builderUtil().log.warn('"token" specified in the github publish options. It should be used only for [setFeedURL](module:electron-updater/out/AppUpdater.AppUpdater+setFeedURL).');
      } //tslint:disable-next-line:no-object-literal-type-assertion


      return Object.assign({
        owner,
        repo: project
      }, options);
    } else {
      //tslint:disable-next-line:no-object-literal-type-assertion
      return Object.assign({
        owner,
        package: project
      }, options);
    }
  });
  return _getResolvedPublishConfig.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=PublishManager.js.map{"version":3,"sources":["../../src/publish/PublishManager.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;AAEA,MAAM,mBAAmB,GAAG,yKAC1B,6LADF;AAGA,MAAM,KAAK,GAAG,qBAAO,0BAAP,CAAd;;AAEA,SAAS,YAAT,CAAsB,aAAtB,EAAwC;AACtC,MAAI,aAAa,IAAI,IAAjB,IAAyB,aAAa,KAAK,OAA3C,IAAsD,aAAa,KAAK,cAAxE,IAA0F,aAAa,KAAK,QAA5G,IAAwH,aAAa,KAAK,OAA9I,EAAuJ;AACrJ,QAAI,OAAO,aAAP,KAAyB,QAA7B,EAAuC;AACrC,YAAM,KAAI,wCAAJ,EAA8B,uEAAuE,IAAI,CAAC,SAAL,CAAe,aAAf,CAA6B,8EAAlI,CAAN;AACD;AACF;AACF;;AAEK,MAAO,cAAP,CAAqB;AAWzB,EAAA,WAAA,CAA6B,QAA7B,EAAkE,cAAlE,EAA2G,iBAAA,GAAuC,QAAQ,CAAC,iBAA3J,EAA4K;AAAA;;AAA/I,SAAA,QAAA,GAAA,QAAA;AAAqC,SAAA,cAAA,GAAA,cAAA;AAAyC,SAAA,iBAAA,GAAA,iBAAA;AAV1F,SAAA,eAAA,GAAkB,IAAI,GAAJ,EAAlB;AAIR,SAAA,SAAA,GAAqB,KAArB;AAEA,SAAA,QAAA,GAAY,OAAO,CAAC,MAAR,CAAkC,KAAlC,GAA0C,KAAI,8BAAJ,GAA1C,GAAgE,IAA5E;AAEQ,SAAA,mBAAA,GAAiD,EAAjD;AAGf,IAAA,YAAY,CAAC,cAAc,CAAC,OAAhB,CAAZ;AAEA,SAAK,WAAL,GAAmB,KAAI,+BAAJ,EAAqB,iBAArB,CAAnB;AAEA,UAAM,iBAAiB,GAAG,OAAO,CAAC,GAAR,CAAY,wBAAZ,KAAyC,MAAnE;;AACA,QAAI,CAAC,mCAAD,IAAoB,iBAAxB,EAA2C;AACzC,UAAI,cAAc,CAAC,OAAf,KAA2B,SAA/B,EAA0C;AACxC,YAAI,OAAO,CAAC,GAAR,CAAY,mBAAZ,KAAoC,SAAxC,EAAmD;AACjD,UAAA,cAAc,CAAC,OAAf,GAAyB,QAAzB;AACD,SAFD,MAGK;AACH,gBAAM,GAAG,GAAG,kCAAZ;;AACA,cAAI,GAAG,IAAI,IAAX,EAAiB;AACf,+BAAI,IAAJ,CAAS;AAAC,cAAA,MAAM,EAAE,gBAAT;AAA2B,cAAA;AAA3B,aAAT,EAA0C,6BAA1C;;AACA,YAAA,cAAc,CAAC,OAAf,GAAyB,OAAzB;AACD,WAHD,MAIK,IAAI,eAAJ,EAAU;AACb,+BAAI,IAAJ,CAAS;AAAC,cAAA,MAAM,EAAE;AAAT,aAAT,EAAkC,qDAAlC;;AACA,YAAA,cAAc,CAAC,OAAf,GAAyB,cAAzB;AACD;AACF;AACF;;AAED,YAAM,aAAa,GAAG,cAAc,CAAC,OAArC;AACA,WAAK,SAAL,GAAiB,aAAa,IAAI,IAAjB,IAAyB,cAAc,CAAC,OAAf,KAA2B,OAApD,KAAgE,aAAa,KAAK,OAAlB,IAA6B,sCAAc,IAA3G,CAAjB;;AACA,UAAI,KAAK,SAAL,IAAkB,iBAAtB,EAAyC;AACvC,2BAAI,IAAJ,CAAS,mBAAT;AACD;AACF,KAvBD,MAwBK,IAAI,cAAc,CAAC,OAAf,KAA2B,OAA/B,EAAwC;AAC3C,yBAAI,IAAJ,CAAS;AACP,QAAA,MAAM,EAAE,yCADD;AAEP,QAAA,QAAQ,EAAE,mEAAmE,mBAAmB;AAFzF,OAAT,EAGG,4BAHH;AAID;;AAED,IAAA,QAAQ,CAAC,mBAAT;AAAA;AAAA;AAAA,+CAA6B,WAAM,KAAN,EAAc;AACzC,cAAM,QAAQ,GAAG,KAAK,CAAC,QAAvB;;AACA,YAAI,KAAK,CAAC,oBAAN,KAA+B,QAAnC,EAA6C;AAC3C,cAAI,CAAC,KAAK,CAAC,OAAN,CAAc,IAAd,CAAmB,EAAE,IAAI,EAAE,CAAC,IAAH,KAAY,KAAZ,IAAqB,EAAE,CAAC,IAAH,KAAY,KAA1D,CAAL,EAAuE;AACrE;AACD;AACF,SAJD,MAKK,IAAI,QAAQ,CAAC,QAAT,KAAsB,kBAAS,OAAnC,EAA4C;AAC/C,cAAI,CAAC,KAAK,CAAC,OAAN,CAAc,IAAd,CAAmB,EAAE,IAAI,uBAAuB,CAAC,EAAD,CAAhD,CAAL,EAA4D;AAC1D;AACD;AACF,SAJI,MAKA;AACH;AACA;AACD;;AAED,cAAM,aAAa,SAAS,gCAAgC,CAAC,QAAD,EAAW,KAAK,CAAC,IAAjB,EAAuB,KAAI,CAAC,SAA5B,CAA5D;;AACA,YAAI,aAAa,IAAI,IAArB,EAA2B;AACzB,gBAAM,2BAAU,IAAI,CAAC,IAAL,CAAU,QAAQ,CAAC,eAAT,CAAyB,KAAK,CAAC,SAA/B,CAAV,EAAqD,gBAArD,CAAV,EAAkF,oCAAgB,aAAhB,CAAlF,CAAN;AACD;AACF,OArBD;;AAAA;AAAA;AAAA;AAAA;AAuBA,IAAA,QAAQ,CAAC,eAAT,CAAyB,KAAK,IAAG;AAC/B,YAAM,oBAAoB,GAAG,KAAK,CAAC,aAAnC;;AACA,UAAI,oBAAoB,IAAI,IAA5B,EAAkC;AAChC,aAAK,WAAL,CAAiB,OAAjB,CAAyB,KAAK,2CAAL,CAAiD,KAAjD,CAAzB;AACD,OAFD,MAGK,IAAI,KAAK,SAAT,EAAoB;AACvB,YAAI,KAAK,CAAC,OAAV,EAAmB;AACjB,UAAA,KAAK,CAAC,+BAA+B,KAAK,SAAS,MAAM,sCAAkB,KAAlB,EAAyB,IAAI,GAAJ,CAAQ,CAAC,UAAD,CAAR,CAAzB,CAA+C,uBAAuB,sCAAkB,oBAAlB,CAAuC,EAAjK,CAAL;AACD;;AACD,aAAK,cAAL,CAAoB,oBAApB,EAA0C,KAA1C,EAAiD,KAAK,UAAL,CAAgB,KAAK,CAAC,QAAtB,CAAjD;AACD;AACF,KAXD;AAYD;;AAEO,EAAA,UAAU,CAAC,gBAAD,EAA+C;AAC/D,WAAO,gBAAgB,IAAI,IAApB,GAA2B,KAAK,QAAL,CAAc,OAAzC,GAAmD,gBAAgB,CAAC,OAA3E;AACD;;AAEK,EAAA,8BAAN,GAAoC;AAAA;;AAAA;AAClC,YAAM,UAAU,GAAG,MAAI,CAAC,QAAL,CAAc,MAAd,CAAqB,OAAxC;AACA,mBAAa,4BAA4B,CAAC,UAAD,EAAa,IAAb,EAAmB,MAAI,CAAC,QAAxB,EAAkC,IAAlC,EAAwC,IAAxC,CAAzC;AAFkC;AAGnC;AAED;;;AACA,EAAA,cAAc,CAAC,aAAD,EAAsC,KAAtC,EAAyD,OAAzD,EAAyE;AACrF,QAAI,aAAa,CAAC,QAAd,KAA2B,SAA/B,EAA0C;AACxC;AACD;;AAED,UAAM,SAAS,GAAG,KAAK,oBAAL,CAA0B,aAA1B,EAAyC,OAAzC,CAAlB;;AACA,QAAI,SAAS,IAAI,IAAjB,EAAuB;AACrB,yBAAI,KAAJ,CAAU;AACR,QAAA,IAAI,EAAE,KAAK,CAAC,IADJ;AAER,QAAA,MAAM,EAAE,mBAFA;AAGR,QAAA,aAAa,EAAE,sCAAkB,aAAlB;AAHP,OAAV,EAIG,eAJH;;AAKA;AACD;;AAED,UAAM,YAAY,GAAG,SAAS,CAAC,YAA/B;;AACA,QAAI,KAAK,cAAL,CAAoB,OAApB,KAAgC,cAAhC,IAAkD,sCAAc,IAAhE,IAAwE,EAAE,YAAY,KAAK,QAAjB,IAA6B,YAAY,KAAK,SAAhD,CAA5E,EAAwI;AACtI,yBAAI,IAAJ,CAAS;AAAC,QAAA,IAAI,EAAE,KAAK,CAAC,IAAb;AAAmB,QAAA,MAAM,EAAE,oCAA3B;AAAiE,QAAA,aAAa,EAAE;AAAhF,OAAT,EAA0G,oBAAoB,YAAY,EAA1I;;AACA;AACD;;AAED,SAAK,WAAL,CAAiB,OAAjB,CAAyB,SAAS,CAAC,MAAV,CAAiB,KAAjB,CAAzB;AACD;;AAEa,EAAA,2CAAN,CAAkD,KAAlD,EAAwE;AAAA;;AAAA;AAC9E,YAAM,gBAAgB,GAAG,KAAK,CAAC,QAA/B;AACA,YAAM,MAAM,GAAG,KAAK,CAAC,MAArB;AACA,YAAM,cAAc,SAAS,iBAAiB,CAAC,gBAAD,EAAmB,MAAM,IAAI,IAAV,GAAiB,IAAjB,GAAwB,MAAM,CAAC,OAAlD,EAA2D,KAAK,CAAC,IAAjE,EAAuE,MAAI,CAAC,SAA5E,CAA9C;;AAEA,UAAI,KAAK,CAAC,OAAV,EAAmB;AACjB,QAAA,KAAK,CAAC,+BAA+B,MAAI,CAAC,SAAS,MAAM,sCAAkB,KAAlB,EAAyB,IAAI,GAAJ,CAAQ,CAAC,UAAD,CAAR,CAAzB,CAA+C,wBAAwB,sCAAkB,cAAlB,CAAiC,EAA5J,CAAL;AACD;;AAED,YAAM,SAAS,GAAG,KAAK,CAAC,IAAxB;;AACA,UAAI,cAAc,IAAI,IAAtB,EAA4B;AAC1B,YAAI,MAAI,CAAC,SAAT,EAAoB;AAClB,6BAAI,KAAJ,CAAU;AAAC,YAAA,IAAI,EAAE,SAAP;AAAkB,YAAA,MAAM,EAAE;AAA1B,WAAV,EAA2D,eAA3D;AACD;;AACD;AACD;;AAED,UAAI,MAAI,CAAC,SAAT,EAAoB;AAClB,aAAK,MAAM,aAAX,IAA4B,cAA5B,EAA4C;AAC1C,cAAI,MAAI,CAAC,iBAAL,CAAuB,SAA3B,EAAsC;AACpC,+BAAI,KAAJ,CAAU;AAAC,cAAA,IAAI,EAAE,KAAK,CAAC,IAAb;AAAmB,cAAA,MAAM,EAAE;AAA3B,aAAV,EAAmD,eAAnD;;AACA;AACD;;AAED,UAAA,MAAI,CAAC,cAAL,CAAoB,aAApB,EAAmC,KAAnC,EAA0C,MAAI,CAAC,UAAL,CAAgB,gBAAhB,CAA1C;AACD;AACF;;AAED,UAAI,KAAK,CAAC,iBAAN,IAA2B,MAAM,IAAI,IAArC,IAA6C,SAAS,IAAI,IAA1D,IACF,CAAC,MAAI,CAAC,iBAAL,CAAuB,SADtB,KAED,gBAAgB,CAAC,QAAjB,KAA8B,kBAAS,OAAvC,IAAkD,uBAAuB,CAAC,MAAD,CAFxE,CAAJ,EAEuF;AACrF,QAAA,MAAI,CAAC,WAAL,CAAiB,OAAjB,CAAyB,gDAAsB,KAAtB,EAA6B,cAA7B,EAA6C,IAA7C,CAAkD,EAAE,IAAI,MAAI,CAAC,mBAAL,CAAyB,IAAzB,CAA8B,GAAG,EAAjC,CAAxD,CAAzB;AACD;AAhC6E;AAiC/E;;AAEO,EAAA,oBAAoB,CAAC,aAAD,EAAsC,OAAtC,EAAsD;AAChF;AACA,UAAM,gBAAgB,GAAG,sCAAkB,aAAlB,CAAzB;AACA,QAAI,SAAS,GAAG,KAAK,eAAL,CAAqB,GAArB,CAAyB,gBAAzB,CAAhB;;AACA,QAAI,SAAS,IAAI,IAAjB,EAAuB;AACrB,MAAA,SAAS,GAAG,eAAe,CAAC,IAAD,EAAO,OAAO,CAAC,OAAf,EAAwB,aAAxB,EAAuC,KAAK,cAA5C,EAA4D,KAAK,QAAjE,CAA3B;AACA,WAAK,eAAL,CAAqB,GAArB,CAAyB,gBAAzB,EAA2C,SAA3C;;AACA,yBAAI,IAAJ,CAAS;AAAC,QAAA,SAAS,EAAE,SAAW,CAAC,QAAZ;AAAZ,OAAT,EAA8C,YAA9C;AACD;;AACD,WAAO,SAAP;AACD,GApKwB,CAsKzB;;;AACA,EAAA,WAAW,GAAA;AACT,SAAK,WAAL,CAAiB,WAAjB;AACA,SAAK,eAAL,CAAqB,KAArB;AACD;;AAEK,EAAA,UAAN,GAAgB;AAAA;;AAAA;AACd,YAAM,MAAI,CAAC,WAAL,CAAiB,UAAjB,EAAN;AAEA,YAAM,mBAAmB,GAAG,MAAI,CAAC,mBAAjC;;AACA,UAAI,MAAI,CAAC,iBAAL,CAAuB,SAAvB,IAAoC,mBAAmB,CAAC,MAApB,KAA+B,CAAvE,EAA0E;AACxE;AACD;;AAED,YAAM,+CAAqB,mBAArB,EAA0C,MAAI,CAAC,QAA/C,CAAN;AACA,YAAM,MAAI,CAAC,WAAL,CAAiB,UAAjB,EAAN;AATc;AAUf;;AAtLwB;;;;SAyLL,gC;;;;;oEAAf,WAAgD,QAAhD,EAAiF,IAAjF,EAA6F,aAA7F,EAAmH;AACxH,UAAM,cAAc,SAAS,8BAA8B,CAAC,QAAD,SAAiB,iBAAiB,CAAC,QAAD,EAAW,IAAX,EAAiB,IAAjB,EAAuB,aAAvB,CAAlC,GAAyE,IAAzE,CAA3D;;AACA,QAAI,cAAc,IAAI,IAAlB,IAA0B,cAAc,CAAC,MAAf,KAA0B,CAAxD,EAA2D;AACzD,aAAO,IAAP;AACD;;AAED,UAAM,aAAa,GAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACd,cAAc,CAAC,CAAD,CADA,EACG;AACpB,MAAA,mBAAmB,EAAE,QAAQ,CAAC,OAAT,CAAiB;AADlB,KADH,CAAnB;;AAKA,QAAI,QAAQ,CAAC,QAAT,KAAsB,kBAAS,OAA/B,IAA0C,aAAa,CAAC,aAAd,IAA+B,IAA7E,EAAmF;AACjF,YAAM,WAAW,GAAG,QAApB;AACA,YAAM,aAAa,GAAG,WAAW,CAAC,8BAAZ,SAAmD,WAAW,CAAC,qBAAZ,CAAkC,KAArF,GAA6F,SAAnH;;AACA,UAAI,aAAa,IAAI,IAArB,EAA2B;AACzB,QAAA,aAAa,CAAC,aAAd,GAA8B,aAA9B;AACD;AACF;;AACD,WAAO,aAAP;AACD,G;;;;SAEqB,8B;;;;;kEAAf,WAA8C,QAA9C,EAA+E,cAA/E,EAAmI,IAAnI,EAAoJ;AACzJ,QAAI,cAAc,KAAK,IAAvB,EAA6B;AAC3B,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,CAAC,MAAf,KAA0B,CAA9B,EAAiC;AAC/B,yBAAI,KAAJ,CAAU,IAAV,EAAgB,iFAAhB,EAD+B,CAE/B;AACA;;;AACA,YAAM,cAAc,SAAS,QAAQ,CAAC,IAAT,CAAc,cAA3C;AACA,MAAA,KAAK,CAAC,mCAAmC,sCAAkB,cAAlB,CAAiC,EAArE,CAAL;;AACA,UAAI,cAAc,IAAI,IAAlB,IAA0B,cAAc,CAAC,IAAf,KAAwB,QAAtD,EAAgE;AAC9D,cAAM,qBAAqB,SAAS,wBAAwB,CAAC,QAAD,EAAW,QAAQ,CAAC,IAApB,EAA0B;AAAC,UAAA,QAAQ,EAAE,cAAc,CAAC;AAA1B,SAA1B,EAA2D,IAA3D,EAAiE,KAAjE,CAA5D;;AACA,YAAI,qBAAqB,IAAI,IAA7B,EAAmC;AACjC,UAAA,KAAK,CAAC,6DAA6D,sCAAkB,qBAAlB,CAAwC,EAAtG,CAAL;AACA,iBAAO,CAAC,qBAAD,CAAP;AACD;AACF;AACF;;AACD,WAAO,cAAP;AACD,G;;;;AAEK,SAAU,eAAV,CAA0B,OAA1B,EAAmD,OAAnD,EAAoE,aAApE,EAAyG,OAAzG,EAAkI,QAAlI,EAAoJ;AACxJ,MAAI,KAAK,CAAC,OAAV,EAAmB;AACjB,IAAA,KAAK,CAAC,qBAAqB,sCAAkB,aAAlB,CAAgC,EAAtD,CAAL;AACD;;AAED,QAAM,QAAQ,GAAG,aAAa,CAAC,QAA/B;;AACA,UAAQ,QAAR;AACE,SAAK,QAAL;AACE,aAAO,KAAI,kCAAJ,EAAoB,OAApB,EAA6B,aAA7B,EAA6D,OAA7D,EAAsE,OAAtE,CAAP;;AAEF,SAAK,SAAL;AACE,aAAO,KAAI,oCAAJ,EAAqB,OAArB,EAA8B,aAA9B,EAA+D,OAA/D,EAAwE,OAAxE,CAAP;;AAEF,SAAK,SAAL;AACE,aAAO,IAAP;;AAEF;AACE,YAAM,KAAK,GAAG,oBAAoB,CAAC,QAAD,EAAW,QAAX,CAAlC;AACA,aAAO,KAAK,IAAI,IAAT,GAAgB,IAAhB,GAAuB,IAAI,KAAJ,CAAU,OAAV,EAAmB,aAAnB,CAA9B;AAZJ;AAcD;;AAED,SAAS,oBAAT,CAA8B,QAA9B,EAAgD,QAAhD,EAAkE;AAChE,UAAQ,QAAR;AACE,SAAK,QAAL;AACE,aAAO,kCAAP;;AAEF,SAAK,SAAL;AACE,aAAO,oCAAP;;AAEF,SAAK,SAAL;AACE,aAAO,IAAP;;AAEF,SAAK,IAAL;AACE,aAAO,sBAAP;;AAEF,SAAK,QAAL;AACE,aAAO,0BAAP;;AAEF;AACE,YAAM,IAAI,GAAG,sBAAsB,QAAQ,EAA3C;AACA,UAAI,MAAM,GAAQ,IAAlB;;AACA,UAAI;AACF,QAAA,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAL,CAAU,QAAQ,CAAC,iBAAnB,EAAsC,IAAI,GAAG,KAA7C,CAAD,CAAhB;AACD,OAFD,CAGA,OAAO,OAAP,EAAgB;AACd,QAAA,OAAO,CAAC,GAAR,CAAY,OAAZ;AACD;;AAED,UAAI,MAAM,IAAI,IAAd,EAAoB;AAClB,QAAA,MAAM,GAAG,OAAO,CAAC,IAAD,CAAhB;AACD;;AACD,aAAO,MAAM,CAAC,OAAP,IAAkB,MAAzB;AA7BJ;AA+BD;;AAEK,SAAU,kBAAV,CAA6B,oBAA7B,EAAyE,QAAzE,EAAkG,QAAlG,EAAiI;AACrI,MAAI,oBAAoB,CAAC,QAArB,KAAkC,SAAtC,EAAiD;AAC/C,UAAM,aAAa,GAAI,oBAA6C,CAAC,GAArE;;AACA,QAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,aAAO,aAAP;AACD;;AAED,UAAM,OAAO,GAAG,GAAG,GAAC,KAAJ,CAAU,aAAV,CAAhB;AACA,WAAO,GAAG,GAAC,MAAJ,CAAU,MAAA,CAAA,MAAA,CAAA,EAAA,EAAK,OAAL,EAA6B;AAAE,MAAA,QAAQ,EAAE,IAAI,CAAC,KAAL,CAAW,OAAX,CAAmB,OAAO,CAAC,QAAR,IAAoB,GAAvC,EAA4C,SAAS,CAAC,QAAD,CAArD;AAAZ,KAA7B,CAAV,CAAP;AACD;;AAED,MAAI,OAAJ;;AACA,MAAI,oBAAoB,CAAC,QAArB,KAAkC,QAAtC,EAAgD;AAC9C,UAAM,EAAE,GAAG,oBAAX;AACA,IAAA,OAAO,GAAG,GAAG,qCAAU,EAAV,CAAa,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,sBAAsB,EAAE,CAAC,gBAAH,KAAwB,KAAxB,GAAgC,EAAhC,GAAqC,GAAG,GAAG,QAAQ,CAAC,OAAT,CAAiB,OAAO,EAA1I;AACD,GAHD,MAIK;AACH,IAAA,OAAO,GAAG,oDAAyB,oBAAzB,CAAV;AACD;;AAED,MAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,WAAO,OAAP;AACD;;AACD,SAAO,GAAG,OAAO,IAAI,SAAS,CAAC,QAAD,CAAU,EAAxC;AACD;;SAEqB,iB;;;;;qDAAf,WAAiC,gBAAjC,EAA0E,qBAA1E,EAAkJ,IAAlJ,EAAqK,aAArK,EAA2L;AAChM,QAAI,UAAJ,CADgM,CAGhM;;AACA,QAAI,qBAAqB,IAAI,IAA7B,EAAmC;AACjC,MAAA,UAAU,GAAG,qBAAqB,CAAC,OAAnC,CADiC,CAEjC;;AACA,UAAI,UAAU,KAAK,IAAnB,EAAyB;AACvB,eAAO,IAAP;AACD;AACF,KAV+L,CAYhM;;;AACA,QAAI,UAAU,IAAI,IAAlB,EAAwB;AACtB,MAAA,UAAU,GAAG,gBAAgB,CAAC,4BAAjB,CAA8C,OAA3D;;AACA,UAAI,UAAU,KAAK,IAAnB,EAAyB;AACvB,eAAO,IAAP;AACD;AACF;;AAED,QAAI,UAAU,IAAI,IAAlB,EAAwB;AACtB,MAAA,UAAU,GAAG,gBAAgB,CAAC,MAAjB,CAAwB,OAArC;;AACA,UAAI,UAAU,KAAK,IAAnB,EAAyB;AACvB,eAAO,IAAP;AACD;AACF;;AACD,iBAAa,4BAA4B,CAAC,UAAD,EAAa,gBAAb,EAA+B,gBAAgB,CAAC,IAAhD,EAAsD,IAAtD,EAA4D,aAA5D,CAAzC;AACD,G;;;;SAEc,4B;;;;;gEAAf,WAA4C,UAA5C,EAA6D,gBAA7D,EAA6G,QAA7G,EAAiI,IAAjI,EAAoJ,aAApJ,EAA0K;AACxK,QAAI,UAAU,IAAI,IAAlB,EAAwB;AACtB,UAAI,WAAW,GAA2B,IAA1C;;AACA,UAAI,CAAC,oCAAgB,OAAO,CAAC,GAAR,CAAY,QAA5B,CAAD,IAA0C,CAAC,oCAAgB,OAAO,CAAC,GAAR,CAAY,YAA5B,CAA/C,EAA0F;AACxF,QAAA,WAAW,GAAG,QAAd;AACD,OAFD,MAGK,IAAI,CAAC,oCAAgB,OAAO,CAAC,GAAR,CAAY,QAA5B,CAAL,EAA4C;AAC/C,QAAA,WAAW,GAAG,SAAd;AACD;;AAED,UAAI,WAAW,IAAI,IAAnB,EAAyB;AACvB,2BAAI,KAAJ,CAAU,IAAV,EAAgB,UAAU,WAAW,sBAArC;;AACA,eAAO,OAAQ,wBAAwB,CAAC,gBAAD,EAAmB,QAAnB,EAA6B;AAAC,UAAA,QAAQ,EAAE;AAAX,SAA7B,EAAsD,IAAtD,EAA4D,aAA5D,CAAhC,CAAP;AACD;AACF;;AAED,QAAI,UAAU,IAAI,IAAlB,EAAwB;AACtB,aAAO,EAAP;AACD;;AAED,IAAA,KAAK,CAAC,8BAA8B,sCAAkB,UAAlB,CAA6B,EAA5D,CAAL;AACA,iBAAc,uBAAgB,GAAhB,CAAoB,4BAAQ,UAAR,CAApB,EAAyC,EAAE,IAAI,wBAAwB,CAAC,gBAAD,EAAmB,QAAnB,EAA6B,OAAO,EAAP,KAAc,QAAd,GAAyB;AAAC,MAAA,QAAQ,EAAE;AAAX,KAAzB,GAA0C,EAAvE,EAA2E,IAA3E,EAAiF,aAAjF,CAAvE,CAAd;AACD,G;;;;AAED,SAAS,uBAAT,CAAiC,MAAjC,EAA+C;AAC7C,MAAI,MAAM,CAAC,IAAP,KAAgB,MAAhB,IAA0B,MAAM,CAAC,OAAP,IAAkB,IAA5C,IAAqD,MAAM,CAAC,OAAP,CAAuB,oBAAhF,EAAsG;AACpG,WAAO,IAAP;AACD;;AACD,SAAO,MAAM,CAAC,IAAP,KAAgB,MAAhB,IAA0B,MAAM,CAAC,IAAP,CAAY,UAAZ,CAAuB,OAAvB,CAAjC;AACD;;AAED,SAAS,mBAAT,CAA6B,OAA7B,EAA2C,gBAA3C,EAA2F,QAA3F,EAA+G,IAA/G,EAAgI;AAC9H,OAAK,MAAM,IAAX,IAAmB,MAAM,CAAC,IAAP,CAAY,OAAZ,CAAnB,EAAyC;AACvC,UAAM,KAAK,GAAG,OAAO,CAAC,IAAD,CAArB;;AACA,QAAI,OAAO,KAAP,KAAiB,QAArB,EAA+B;AAC7B,YAAM,SAAS,GAAG,IAAI,IAAI,IAAR,GAAe,IAAf,GAAsB,oBAAK,IAAL,CAAxC;AACA,YAAM,QAAQ,GAAG,gBAAgB,IAAI,IAApB,GAA2B,kCAAY,KAAZ,EAAmB,SAAnB,EAA8B,QAAQ,CAAC,OAAvC,CAA3B,GAA6E,gBAAgB,CAAC,WAAjB,CAA6B,KAA7B,EAAoC,SAApC,CAA9F;;AACA,UAAI,QAAQ,KAAK,KAAjB,EAAwB;AACtB,QAAA,OAAO,CAAC,IAAD,CAAP,GAAgB,QAAhB;AACD;AACF;AACF;AACF;;AAED,SAAS,qBAAT,CAA+B,6BAA/B,EAAmG,aAAnG,EAA+H;AAC7H,QAAM,KAAK,GAAG,6BAA6B,IAAI,IAAjC,GAAwC,IAAxC,GAA+C,6BAA6B,CAAC,mBAA3F;AACA,SAAO,KAAK,IAAI,IAAT,GAAgB,aAAa,CAAC,mBAAd,KAAsC,KAAtD,GAA8D,KAArE;AACD;;SAEc,wB;;;;;;4DAAf,WAAwC,gBAAxC,EAAwF,QAAxF,EAA4G,OAA5G,EAA2I,IAA3I,EAA8J,aAA9J,EAAoL;AAClL,IAAA,OAAO,GAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAO,OAAP,CAAP;AACA,IAAA,mBAAmB,CAAC,OAAD,EAAU,gBAAV,EAA4B,QAA5B,EAAsC,IAAtC,CAAnB;AAEA,QAAI,qBAAqB,GAAkB,IAA3C;;AACA,QAAK,OAAgC,CAAC,OAAjC,IAA4C,IAA5C,IAAoD,qBAAqB,CAAC,gBAAgB,IAAI,IAApB,GAA2B,IAA3B,GAAkC,gBAAgB,CAAC,4BAApD,EAAkF,QAAQ,CAAC,MAA3F,CAA9E,EAAkL;AAChL,MAAA,qBAAqB,GAAG,QAAQ,CAAC,OAAT,CAAiB,OAAzC;AACD;;AAED,UAAM,QAAQ,GAAG,OAAO,CAAC,QAAzB;;AACA,QAAI,QAAQ,KAAK,SAAjB,EAA4B;AAC1B,YAAM,CAAC,GAAG,OAAV;;AACA,UAAI,CAAC,CAAC,GAAF,IAAS,IAAb,EAAmB;AACjB,cAAM,KAAI,wCAAJ,EAA8B,kDAA9B,CAAN;AACD;;AAED,UAAI,qBAAqB,IAAI,IAA7B,EAAmC;AAChC,QAAA,CAAS,CAAC,OAAV,GAAoB,qBAApB;AACF;;AACD,aAAO,OAAP;AACD;;AAED,UAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAT,EAAmB,QAAnB,CAA1C;;AACA,QAAI,aAAa,IAAI,IAAjB,IAAyB,aAAa,CAAC,sBAAd,IAAwC,IAArE,EAA2E;AACzE,YAAM,aAAa,CAAC,sBAAd,CAAqC,OAArC,EAA8C,qBAA9C,EAAqE,aAArE,CAAN;AACA,aAAO,OAAP;AACD;;AAED,UAAM,QAAQ,GAAG,QAAQ,KAAK,QAA9B;;AACA,QAAI,CAAC,QAAD,IAAa,QAAQ,KAAK,SAA9B,EAAyC;AACvC,aAAO,OAAP;AACD;;AAED,QAAI,KAAK,GAAG,QAAQ,GAAI,OAAyB,CAAC,KAA9B,GAAuC,OAA0B,CAAC,KAAtF;AACA,QAAI,OAAO,GAAG,QAAQ,GAAI,OAAyB,CAAC,IAA9B,GAAsC,OAA0B,CAAC,OAAvF;;AAEA,QAAI,QAAQ,IAAI,KAAK,IAAI,IAArB,IAA6B,OAAO,IAAI,IAA5C,EAAkD;AAChD,YAAM,KAAK,GAAG,OAAO,CAAC,OAAR,CAAgB,GAAhB,CAAd;;AACA,UAAI,KAAK,GAAG,CAAZ,EAAe;AACb,cAAM,IAAI,GAAG,OAAb;AACA,QAAA,OAAO,GAAG,IAAI,CAAC,SAAL,CAAe,CAAf,EAAkB,KAAlB,CAAV;AACA,QAAA,KAAK,GAAG,IAAI,CAAC,SAAL,CAAe,KAAK,GAAG,CAAvB,CAAR;AACD;AACF;;AA3CiL,aA6CnK,OA7CmK;AAAA;AAAA;;AAAA;AAAA,+CA6ClL,aAAsB;AACpB,cAAM,IAAI,SAAS,QAAQ,CAAC,cAA5B;;AACA,YAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB,iBAAO,IAAP;AACD;;AAED,cAAM,OAAO,GAAG,2MAAhB;;AACA,YAAI,aAAJ,EAAmB;AACjB,gBAAM,IAAI,KAAJ,CAAU,OAAV,CAAN;AACD,SAFD,MAGK;AACH,6BAAI,IAAJ,CAAS,OAAT;;AACA,iBAAO,IAAP;AACD;AACF,OA3DiL;AAAA;AAAA;;AA6DlL,QAAI,CAAC,KAAD,IAAU,CAAC,OAAf,EAAwB;AACtB,yBAAI,KAAJ,CAAU;AAAC,QAAA,MAAM,EAAE,8CAAT;AAAyD,QAAA,QAAzD;AAAmE,QAAA,KAAnE;AAA0E,QAAA;AAA1E,OAAV,EAA8F,iBAA9F;;AACA,YAAM,IAAI,SAAS,OAAO,EAA1B;;AACA,UAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB,eAAO,IAAP;AACD;;AAED,UAAI,CAAC,KAAL,EAAY;AACV,QAAA,KAAK,GAAG,IAAI,CAAC,IAAb;AACD;;AACD,UAAI,CAAC,OAAL,EAAc;AACZ,QAAA,OAAO,GAAG,IAAI,CAAC,OAAf;AACD;AACF;;AAED,QAAI,QAAJ,EAAc;AACZ,UAAK,OAAyB,CAAC,KAA1B,IAAmC,IAAnC,IAA2C,CAAE,OAAyB,CAAC,OAA5E,EAAqF;AACnF,2BAAI,IAAJ,CAAS,yJAAT;AACD,OAHW,CAIZ;;;AACA,aAAO,MAAA,CAAA,MAAA,CAAA;AAAC,QAAA,KAAD;AAAQ,QAAA,IAAI,EAAE;AAAd,OAAA,EAA0B,OAA1B,CAAP;AACD,KAND,MAOK;AACH;AACA,aAAO,MAAA,CAAA,MAAA,CAAA;AAAC,QAAA,KAAD;AAAQ,QAAA,OAAO,EAAE;AAAjB,OAAA,EAA6B,OAA7B,CAAP;AACD;AACF,G","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, asArray, AsyncTaskManager, InvalidConfigurationError, isEmptyOrSpaces, isPullRequest, log, safeStringifyJson, serializeToYaml } from \"builder-util\"\nimport { BintrayOptions, CancellationToken, GenericServerOptions, getS3LikeProviderBaseUrl, GithubOptions, githubUrl, PublishConfiguration, PublishProvider } from \"builder-util-runtime\"\nimport _debug from \"debug\"\nimport { getCiTag, PublishContext, Publisher, PublishOptions, UploadTask } from \"electron-publish\"\nimport { BintrayPublisher } from \"electron-publish/out/BintrayPublisher\"\nimport { GitHubPublisher } from \"electron-publish/out/gitHubPublisher\"\nimport { MultiProgress } from \"electron-publish/out/multiProgress\"\nimport S3Publisher from \"electron-publish/out/s3/s3Publisher\"\nimport SpacesPublisher from \"electron-publish/out/s3/spacesPublisher\"\nimport { writeFile } from \"fs-extra-p\"\nimport isCi from \"is-ci\"\nimport * as path from \"path\"\nimport { WriteStream as TtyWriteStream } from \"tty\"\nimport * as url from \"url\"\nimport { AppInfo, ArtifactCreated, Configuration, Platform, PlatformSpecificBuildOptions, Target } from \"../index\"\nimport { Packager } from \"../packager\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { expandMacro } from \"../util/macroExpander\"\nimport { WinPackager } from \"../winPackager\"\nimport { createUpdateInfoTasks, UpdateInfoFileTask, writeUpdateInfoFiles } from \"./updateInfoBuilder\"\n\nconst publishForPrWarning = \"There are serious security concerns with PUBLISH_FOR_PULL_REQUEST=true (see the  CircleCI documentation (https://circleci.com/docs/1.0/fork-pr-builds/) for details)\" +\n  \"\\nIf you have SSH keys, sensitive env vars or AWS credentials stored in your project settings and untrusted forks can make pull requests against your repo, then this option isn't for you.\"\n\nconst debug = _debug(\"electron-builder:publish\")\n\nfunction checkOptions(publishPolicy: any) {\n  if (publishPolicy != null && publishPolicy !== \"onTag\" && publishPolicy !== \"onTagOrDraft\" && publishPolicy !== \"always\" && publishPolicy !== \"never\") {\n    if (typeof publishPolicy === \"string\") {\n      throw new InvalidConfigurationError(`Expected one of \"onTag\", \"onTagOrDraft\", \"always\", \"never\", but got ${JSON.stringify(publishPolicy)}.\\nPlease note that publish configuration should be specified under \"config\"`)\n    }\n  }\n}\n\nexport class PublishManager implements PublishContext {\n  private readonly nameToPublisher = new Map<string, Publisher | null>()\n\n  private readonly taskManager: AsyncTaskManager\n\n  readonly isPublish: boolean = false\n\n  readonly progress = (process.stdout as TtyWriteStream).isTTY ? new MultiProgress() : null\n\n  private readonly updateFileWriteTask: Array<UpdateInfoFileTask> = []\n\n  constructor(private readonly packager: Packager, private readonly publishOptions: PublishOptions, readonly cancellationToken: CancellationToken = packager.cancellationToken) {\n    checkOptions(publishOptions.publish)\n\n    this.taskManager = new AsyncTaskManager(cancellationToken)\n\n    const forcePublishForPr = process.env.PUBLISH_FOR_PULL_REQUEST === \"true\"\n    if (!isPullRequest() || forcePublishForPr) {\n      if (publishOptions.publish === undefined) {\n        if (process.env.npm_lifecycle_event === \"release\") {\n          publishOptions.publish = \"always\"\n        }\n        else {\n          const tag = getCiTag()\n          if (tag != null) {\n            log.info({reason: \"tag is defined\", tag}, \"artifacts will be published\")\n            publishOptions.publish = \"onTag\"\n          }\n          else if (isCi) {\n            log.info({reason: \"CI detected\"}, \"artifacts will be published if draft release exists\")\n            publishOptions.publish = \"onTagOrDraft\"\n          }\n        }\n      }\n\n      const publishPolicy = publishOptions.publish\n      this.isPublish = publishPolicy != null && publishOptions.publish !== \"never\" && (publishPolicy !== \"onTag\" || getCiTag() != null)\n      if (this.isPublish && forcePublishForPr) {\n        log.warn(publishForPrWarning)\n      }\n    }\n    else if (publishOptions.publish !== \"never\") {\n      log.info({\n        reason: \"current build is a part of pull request\",\n        solution: `set env PUBLISH_FOR_PULL_REQUEST to true to force code signing\\n${publishForPrWarning}`,\n      }, \"publishing will be skipped\")\n    }\n\n    packager.addAfterPackHandler(async event => {\n      const packager = event.packager\n      if (event.electronPlatformName === \"darwin\") {\n        if (!event.targets.some(it => it.name === \"dmg\" || it.name === \"zip\")) {\n          return\n        }\n      }\n      else if (packager.platform === Platform.WINDOWS) {\n        if (!event.targets.some(it => isSuitableWindowsTarget(it))) {\n          return\n        }\n      }\n      else {\n        // AppImage writes data to AppImage stage dir, not to linux-unpacked\n        return\n      }\n\n      const publishConfig = await getAppUpdatePublishConfiguration(packager, event.arch, this.isPublish)\n      if (publishConfig != null) {\n        await writeFile(path.join(packager.getResourcesDir(event.appOutDir), \"app-update.yml\"), serializeToYaml(publishConfig))\n      }\n    })\n\n    packager.artifactCreated(event => {\n      const publishConfiguration = event.publishConfig\n      if (publishConfiguration == null) {\n        this.taskManager.addTask(this.artifactCreatedWithoutExplicitPublishConfig(event))\n      }\n      else if (this.isPublish) {\n        if (debug.enabled) {\n          debug(`artifactCreated (isPublish: ${this.isPublish}): ${safeStringifyJson(event, new Set([\"packager\"]))},\\n  publishConfig: ${safeStringifyJson(publishConfiguration)}`)\n        }\n        this.scheduleUpload(publishConfiguration, event, this.getAppInfo(event.packager))\n      }\n    })\n  }\n\n  private getAppInfo(platformPackager: PlatformPackager<any> | null) {\n    return platformPackager == null ? this.packager.appInfo : platformPackager.appInfo\n  }\n\n  async getGlobalPublishConfigurations(): Promise<Array<PublishConfiguration> | null> {\n    const publishers = this.packager.config.publish\n    return await resolvePublishConfigurations(publishers, null, this.packager, null, true)\n  }\n\n  /** @internal */\n  scheduleUpload(publishConfig: PublishConfiguration, event: UploadTask, appInfo: AppInfo): void {\n    if (publishConfig.provider === \"generic\") {\n      return\n    }\n\n    const publisher = this.getOrCreatePublisher(publishConfig, appInfo)\n    if (publisher == null) {\n      log.debug({\n        file: event.file,\n        reason: \"publisher is null\",\n        publishConfig: safeStringifyJson(publishConfig),\n      }, \"not published\")\n      return\n    }\n\n    const providerName = publisher.providerName\n    if (this.publishOptions.publish === \"onTagOrDraft\" && getCiTag() == null && !(providerName === \"GitHub\" || providerName === \"Bintray\")) {\n      log.info({file: event.file, reason: \"current build is not for a git tag\", publishPolicy: \"onTagOrDraft\"}, `not published to ${providerName}`)\n      return\n    }\n\n    this.taskManager.addTask(publisher.upload(event))\n  }\n\n  private async artifactCreatedWithoutExplicitPublishConfig(event: ArtifactCreated) {\n    const platformPackager = event.packager\n    const target = event.target\n    const publishConfigs = await getPublishConfigs(platformPackager, target == null ? null : target.options, event.arch, this.isPublish)\n\n    if (debug.enabled) {\n      debug(`artifactCreated (isPublish: ${this.isPublish}): ${safeStringifyJson(event, new Set([\"packager\"]))},\\n  publishConfigs: ${safeStringifyJson(publishConfigs)}`)\n    }\n\n    const eventFile = event.file\n    if (publishConfigs == null) {\n      if (this.isPublish) {\n        log.debug({file: eventFile, reason: \"no publish configs\"}, \"not published\")\n      }\n      return\n    }\n\n    if (this.isPublish) {\n      for (const publishConfig of publishConfigs) {\n        if (this.cancellationToken.cancelled) {\n          log.debug({file: event.file, reason: \"cancelled\"}, \"not published\")\n          break\n        }\n\n        this.scheduleUpload(publishConfig, event, this.getAppInfo(platformPackager))\n      }\n    }\n\n    if (event.isWriteUpdateInfo && target != null && eventFile != null &&\n      !this.cancellationToken.cancelled &&\n      (platformPackager.platform !== Platform.WINDOWS || isSuitableWindowsTarget(target))) {\n      this.taskManager.addTask(createUpdateInfoTasks(event, publishConfigs).then(it => this.updateFileWriteTask.push(...it)))\n    }\n  }\n\n  private getOrCreatePublisher(publishConfig: PublishConfiguration, appInfo: AppInfo): Publisher | null {\n    // to not include token into cache key\n    const providerCacheKey = safeStringifyJson(publishConfig)\n    let publisher = this.nameToPublisher.get(providerCacheKey)\n    if (publisher == null) {\n      publisher = createPublisher(this, appInfo.version, publishConfig, this.publishOptions, this.packager)\n      this.nameToPublisher.set(providerCacheKey, publisher)\n      log.info({publisher: publisher!!.toString()}, \"publishing\")\n    }\n    return publisher\n  }\n\n  // noinspection JSUnusedGlobalSymbols\n  cancelTasks() {\n    this.taskManager.cancelTasks()\n    this.nameToPublisher.clear()\n  }\n\n  async awaitTasks(): Promise<void> {\n    await this.taskManager.awaitTasks()\n\n    const updateInfoFileTasks = this.updateFileWriteTask\n    if (this.cancellationToken.cancelled || updateInfoFileTasks.length === 0) {\n      return\n    }\n\n    await writeUpdateInfoFiles(updateInfoFileTasks, this.packager)\n    await this.taskManager.awaitTasks()\n  }\n}\n\nexport async function getAppUpdatePublishConfiguration(packager: PlatformPackager<any>, arch: Arch, errorIfCannot: boolean) {\n  const publishConfigs = await getPublishConfigsForUpdateInfo(packager, await getPublishConfigs(packager, null, arch, errorIfCannot), arch)\n  if (publishConfigs == null || publishConfigs.length === 0) {\n    return null\n  }\n\n  const publishConfig = {\n    ...publishConfigs[0],\n    updaterCacheDirName: packager.appInfo.updaterCacheDirName,\n  }\n\n  if (packager.platform === Platform.WINDOWS && publishConfig.publisherName == null) {\n    const winPackager = packager as WinPackager\n    const publisherName = winPackager.isForceCodeSigningVerification ? await winPackager.computedPublisherName.value : undefined\n    if (publisherName != null) {\n      publishConfig.publisherName = publisherName\n    }\n  }\n  return publishConfig\n}\n\nexport async function getPublishConfigsForUpdateInfo(packager: PlatformPackager<any>, publishConfigs: Array<PublishConfiguration> | null, arch: Arch | null): Promise<Array<PublishConfiguration> | null> {\n  if (publishConfigs === null) {\n    return null\n  }\n\n  if (publishConfigs.length === 0) {\n    log.debug(null, \"getPublishConfigsForUpdateInfo: no publishConfigs, detect using repository info\")\n    // https://github.com/electron-userland/electron-builder/issues/925#issuecomment-261732378\n    // default publish config is github, file should be generated regardless of publish state (user can test installer locally or manage the release process manually)\n    const repositoryInfo = await packager.info.repositoryInfo\n    debug(`getPublishConfigsForUpdateInfo: ${safeStringifyJson(repositoryInfo)}`)\n    if (repositoryInfo != null && repositoryInfo.type === \"github\") {\n      const resolvedPublishConfig = await getResolvedPublishConfig(packager, packager.info, {provider: repositoryInfo.type}, arch, false)\n      if (resolvedPublishConfig != null) {\n        debug(`getPublishConfigsForUpdateInfo: resolve to publish config ${safeStringifyJson(resolvedPublishConfig)}`)\n        return [resolvedPublishConfig]\n      }\n    }\n  }\n  return publishConfigs\n}\n\nexport function createPublisher(context: PublishContext, version: string, publishConfig: PublishConfiguration, options: PublishOptions, packager: Packager): Publisher | null {\n  if (debug.enabled) {\n    debug(`Create publisher: ${safeStringifyJson(publishConfig)}`)\n  }\n\n  const provider = publishConfig.provider\n  switch (provider) {\n    case \"github\":\n      return new GitHubPublisher(context, publishConfig as GithubOptions, version, options)\n\n    case \"bintray\":\n      return new BintrayPublisher(context, publishConfig as BintrayOptions, version, options)\n\n    case \"generic\":\n      return null\n\n    default:\n      const clazz = requireProviderClass(provider, packager)\n      return clazz == null ? null : new clazz(context, publishConfig)\n  }\n}\n\nfunction requireProviderClass(provider: string, packager: Packager): any | null {\n  switch (provider) {\n    case \"github\":\n      return GitHubPublisher\n\n    case \"bintray\":\n      return BintrayPublisher\n\n    case \"generic\":\n      return null\n\n    case \"s3\":\n      return S3Publisher\n\n    case \"spaces\":\n      return SpacesPublisher\n\n    default:\n      const name = `electron-publisher-${provider}`\n      let module: any = null\n      try {\n        module = require(path.join(packager.buildResourcesDir, name + \".js\"))\n      }\n      catch (ignored) {\n        console.log(ignored)\n      }\n\n      if (module == null) {\n        module = require(name)\n      }\n      return module.default || module\n  }\n}\n\nexport function computeDownloadUrl(publishConfiguration: PublishConfiguration, fileName: string | null, packager: PlatformPackager<any>) {\n  if (publishConfiguration.provider === \"generic\") {\n    const baseUrlString = (publishConfiguration as GenericServerOptions).url\n    if (fileName == null) {\n      return baseUrlString\n    }\n\n    const baseUrl = url.parse(baseUrlString)\n    return url.format({...baseUrl as url.UrlObject, pathname: path.posix.resolve(baseUrl.pathname || \"/\", encodeURI(fileName))})\n  }\n\n  let baseUrl\n  if (publishConfiguration.provider === \"github\") {\n    const gh = publishConfiguration as GithubOptions\n    baseUrl = `${githubUrl(gh)}/${gh.owner}/${gh.repo}/releases/download/${gh.vPrefixedTagName === false ? \"\" : \"v\"}${packager.appInfo.version}`\n  }\n  else {\n    baseUrl = getS3LikeProviderBaseUrl(publishConfiguration)\n  }\n\n  if (fileName == null) {\n    return baseUrl\n  }\n  return `${baseUrl}/${encodeURI(fileName)}`\n}\n\nexport async function getPublishConfigs(platformPackager: PlatformPackager<any>, targetSpecificOptions: PlatformSpecificBuildOptions | null | undefined, arch: Arch | null, errorIfCannot: boolean): Promise<Array<PublishConfiguration> | null> {\n  let publishers\n\n  // check build.nsis (target)\n  if (targetSpecificOptions != null) {\n    publishers = targetSpecificOptions.publish\n    // if explicitly set to null - do not publish\n    if (publishers === null) {\n      return null\n    }\n  }\n\n  // check build.win (platform)\n  if (publishers == null) {\n    publishers = platformPackager.platformSpecificBuildOptions.publish\n    if (publishers === null) {\n      return null\n    }\n  }\n\n  if (publishers == null) {\n    publishers = platformPackager.config.publish\n    if (publishers === null) {\n      return null\n    }\n  }\n  return await resolvePublishConfigurations(publishers, platformPackager, platformPackager.info, arch, errorIfCannot)\n}\n\nasync function resolvePublishConfigurations(publishers: any, platformPackager: PlatformPackager<any> | null, packager: Packager, arch: Arch | null, errorIfCannot: boolean): Promise<Array<PublishConfiguration> | null> {\n  if (publishers == null) {\n    let serviceName: PublishProvider | null = null\n    if (!isEmptyOrSpaces(process.env.GH_TOKEN) || !isEmptyOrSpaces(process.env.GITHUB_TOKEN)) {\n      serviceName = \"github\"\n    }\n    else if (!isEmptyOrSpaces(process.env.BT_TOKEN)) {\n      serviceName = \"bintray\"\n    }\n\n    if (serviceName != null) {\n      log.debug(null, `Detect ${serviceName} as publish provider`)\n      return [(await getResolvedPublishConfig(platformPackager, packager, {provider: serviceName}, arch, errorIfCannot))!]\n    }\n  }\n\n  if (publishers == null) {\n    return []\n  }\n\n  debug(`Explicit publish provider: ${safeStringifyJson(publishers)}`)\n  return await (BluebirdPromise.map(asArray(publishers), it => getResolvedPublishConfig(platformPackager, packager, typeof it === \"string\" ? {provider: it} : it, arch, errorIfCannot)) as Promise<Array<PublishConfiguration>>)\n}\n\nfunction isSuitableWindowsTarget(target: Target) {\n  if (target.name === \"appx\" && target.options != null && (target.options as any).electronUpdaterAware) {\n    return true\n  }\n  return target.name === \"nsis\" || target.name.startsWith(\"nsis-\")\n}\n\nfunction expandPublishConfig(options: any, platformPackager: PlatformPackager<any> | null, packager: Packager, arch: Arch | null): void {\n  for (const name of Object.keys(options)) {\n    const value = options[name]\n    if (typeof value === \"string\") {\n      const archValue = arch == null ? null : Arch[arch]\n      const expanded = platformPackager == null ? expandMacro(value, archValue, packager.appInfo) : platformPackager.expandMacro(value, archValue)\n      if (expanded !== value) {\n        options[name] = expanded\n      }\n    }\n  }\n}\n\nfunction isDetectUpdateChannel(platformSpecificConfiguration: PlatformSpecificBuildOptions | null, configuration: Configuration) {\n  const value = platformSpecificConfiguration == null ? null : platformSpecificConfiguration.detectUpdateChannel\n  return value == null ? configuration.detectUpdateChannel !== false : value\n}\n\nasync function getResolvedPublishConfig(platformPackager: PlatformPackager<any> | null, packager: Packager, options: PublishConfiguration, arch: Arch | null, errorIfCannot: boolean): Promise<PublishConfiguration | GithubOptions | BintrayOptions | null> {\n  options = {...options}\n  expandPublishConfig(options, platformPackager, packager, arch)\n\n  let channelFromAppVersion: string | null = null\n  if ((options as GenericServerOptions).channel == null && isDetectUpdateChannel(platformPackager == null ? null : platformPackager.platformSpecificBuildOptions, packager.config)) {\n    channelFromAppVersion = packager.appInfo.channel\n  }\n\n  const provider = options.provider\n  if (provider === \"generic\") {\n    const o = options as GenericServerOptions\n    if (o.url == null) {\n      throw new InvalidConfigurationError(`Please specify \"url\" for \"generic\" update server`)\n    }\n\n    if (channelFromAppVersion != null) {\n      (o as any).channel = channelFromAppVersion\n    }\n    return options\n  }\n\n  const providerClass = requireProviderClass(options.provider, packager)\n  if (providerClass != null && providerClass.checkAndResolveOptions != null) {\n    await providerClass.checkAndResolveOptions(options, channelFromAppVersion, errorIfCannot)\n    return options\n  }\n\n  const isGithub = provider === \"github\"\n  if (!isGithub && provider !== \"bintray\") {\n    return options\n  }\n\n  let owner = isGithub ? (options as GithubOptions).owner : (options as BintrayOptions).owner\n  let project = isGithub ? (options as GithubOptions).repo : (options as BintrayOptions).package\n\n  if (isGithub && owner == null && project != null) {\n    const index = project.indexOf(\"/\")\n    if (index > 0) {\n      const repo = project\n      project = repo.substring(0, index)\n      owner = repo.substring(index + 1)\n    }\n  }\n\n  async function getInfo() {\n    const info = await packager.repositoryInfo\n    if (info != null) {\n      return info\n    }\n\n    const message = `Cannot detect repository by .git/config. Please specify \"repository\" in the package.json (https://docs.npmjs.com/files/package.json#repository).\\nPlease see https://electron.build/configuration/publish`\n    if (errorIfCannot) {\n      throw new Error(message)\n    }\n    else {\n      log.warn(message)\n      return null\n    }\n  }\n\n  if (!owner || !project) {\n    log.debug({reason: \"owner or project is not specified explicitly\", provider, owner, project}, \"calling getInfo\")\n    const info = await getInfo()\n    if (info == null) {\n      return null\n    }\n\n    if (!owner) {\n      owner = info.user\n    }\n    if (!project) {\n      project = info.project\n    }\n  }\n\n  if (isGithub) {\n    if ((options as GithubOptions).token != null && !(options as GithubOptions).private) {\n      log.warn('\"token\" specified in the github publish options. It should be used only for [setFeedURL](module:electron-updater/out/AppUpdater.AppUpdater+setFeedURL).')\n    }\n    //tslint:disable-next-line:no-object-literal-type-assertion\n    return {owner, repo: project, ...options} as GithubOptions\n  }\n  else {\n    //tslint:disable-next-line:no-object-literal-type-assertion\n    return {owner, package: project, ...options} as BintrayOptions\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createUpdateInfoTasks = createUpdateInfoTasks;
exports.writeUpdateInfoFiles = writeUpdateInfoFiles;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function semver() {
  const data = _interopRequireWildcard(require("semver"));

  semver = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _hash() {
  const data = require("../util/hash");

  _hash = function () {
    return data;
  };

  return data;
}

function _PublishManager() {
  const data = require("./PublishManager");

  _PublishManager = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function getReleaseInfo(_x) {
  return _getReleaseInfo.apply(this, arguments);
}

function _getReleaseInfo() {
  _getReleaseInfo = (0, _bluebirdLst().coroutine)(function* (packager) {
    const releaseInfo = Object.assign({}, packager.platformSpecificBuildOptions.releaseInfo || packager.config.releaseInfo);

    if (releaseInfo.releaseNotes == null) {
      const releaseNotesFile = yield packager.getResource(releaseInfo.releaseNotesFile, `release-notes-${packager.platform.buildConfigurationKey}.md`, `release-notes-${packager.platform.name}.md`, `release-notes-${packager.platform.nodeName}.md`, "release-notes.md");
      const releaseNotes = releaseNotesFile == null ? null : yield (0, _fsExtraP().readFile)(releaseNotesFile, "utf-8"); // to avoid undefined in the file, check for null

      if (releaseNotes != null) {
        releaseInfo.releaseNotes = releaseNotes;
      }
    }

    delete releaseInfo.releaseNotesFile;
    return releaseInfo;
  });
  return _getReleaseInfo.apply(this, arguments);
}

function isGenerateUpdatesFilesForAllChannels(packager) {
  const value = packager.platformSpecificBuildOptions.generateUpdatesFilesForAllChannels;
  return value == null ? packager.config.generateUpdatesFilesForAllChannels : value;
}
/**
 if this is an "alpha" version, we need to generate only the "alpha" .yml file
 if this is a "beta" version, we need to generate both the "alpha" and "beta" .yml file
 if this is a "stable" version, we need to generate all the "alpha", "beta" and "stable" .yml file
 */


function computeChannelNames(packager, publishConfig) {
  const currentChannel = publishConfig.channel || "latest"; // for GitHub should be pre-release way be used

  if (currentChannel === "alpha" || publishConfig.provider === "github" || !isGenerateUpdatesFilesForAllChannels(packager)) {
    return [currentChannel];
  }

  switch (currentChannel) {
    case "beta":
      return [currentChannel, "alpha"];

    case "latest":
      return [currentChannel, "alpha", "beta"];

    default:
      return [currentChannel];
  }
}

function getUpdateInfoFileName(channel, packager, arch) {
  const osSuffix = packager.platform === _core().Platform.WINDOWS ? "" : `-${packager.platform.buildConfigurationKey}`;
  return `${channel}${osSuffix}${getArchPrefixForUpdateFile(arch, packager)}.yml`;
}

function getArchPrefixForUpdateFile(arch, packager) {
  if (arch == null || arch === _builderUtil().Arch.x64 || packager.platform !== _core().Platform.LINUX) {
    return "";
  }

  return arch === _builderUtil().Arch.armv7l ? "-arm" : `-${_builderUtil().Arch[arch]}`;
}

function computeIsisElectronUpdater1xCompatibility(updaterCompatibility, publishConfiguration, packager) {
  if (updaterCompatibility != null) {
    return semver().satisfies("1.0.0", updaterCompatibility);
  } // spaces is a new publish provider, no need to keep backward compatibility


  if (publishConfiguration.provider === "spaces") {
    return false;
  }

  const updaterVersion = packager.metadata.dependencies == null ? null : packager.metadata.dependencies["electron-updater"];
  return updaterVersion == null || semver().lt(updaterVersion, "4.0.0");
}
/** @internal */


function createUpdateInfoTasks(_x2, _x3) {
  return _createUpdateInfoTasks.apply(this, arguments);
}

function _createUpdateInfoTasks() {
  _createUpdateInfoTasks = (0, _bluebirdLst().coroutine)(function* (event, _publishConfigs) {
    const packager = event.packager;
    const publishConfigs = yield (0, _PublishManager().getPublishConfigsForUpdateInfo)(packager, _publishConfigs, event.arch);

    if (publishConfigs == null || publishConfigs.length === 0) {
      return [];
    }

    const outDir = event.target.outDir;
    const version = packager.appInfo.version;
    const sha2 = new (_lazyVal().Lazy)(() => (0, _hash().hashFile)(event.file, "sha256", "hex"));

    const isMac = packager.platform === _core().Platform.MAC;

    const createdFiles = new Set();
    const sharedInfo = yield createUpdateInfo(version, event, (yield getReleaseInfo(packager)));
    const tasks = [];
    const electronUpdaterCompatibility = packager.platformSpecificBuildOptions.electronUpdaterCompatibility || packager.config.electronUpdaterCompatibility || ">=2.15";

    for (const publishConfiguration of publishConfigs) {
      const isBintray = publishConfiguration.provider === "bintray";
      let dir = outDir; // Bintray uses different variant of channel file info, better to generate it to a separate dir by always

      if (isBintray || publishConfigs.length > 1 && publishConfiguration !== publishConfigs[0]) {
        dir = path.join(outDir, publishConfiguration.provider);
      }

      let isElectronUpdater1xCompatibility = computeIsisElectronUpdater1xCompatibility(electronUpdaterCompatibility, publishConfiguration, packager.info);
      let info = sharedInfo; // noinspection JSDeprecatedSymbols

      if (isElectronUpdater1xCompatibility && packager.platform === _core().Platform.WINDOWS) {
        info = Object.assign({}, info); // noinspection JSDeprecatedSymbols

        info.sha2 = yield sha2.value;
      }

      if (event.safeArtifactName != null && publishConfiguration.provider === "github") {
        const newFiles = info.files.slice();
        newFiles[0].url = event.safeArtifactName;
        info = Object.assign({}, info, {
          files: newFiles,
          path: event.safeArtifactName
        });
      }

      for (const channel of computeChannelNames(packager, publishConfiguration)) {
        if (isMac && isElectronUpdater1xCompatibility && event.file.endsWith(".zip")) {
          // write only for first channel (generateUpdatesFilesForAllChannels is a new functionality, no need to generate old mac update info file)
          isElectronUpdater1xCompatibility = false;
          yield writeOldMacInfo(publishConfiguration, outDir, dir, channel, createdFiles, version, packager);
        }

        const updateInfoFile = path.join(dir, (isBintray ? `${version}_` : "") + getUpdateInfoFileName(channel, packager, event.arch));

        if (createdFiles.has(updateInfoFile)) {
          continue;
        }

        createdFiles.add(updateInfoFile); // artifact should be uploaded only to designated publish provider

        tasks.push({
          file: updateInfoFile,
          info,
          publishConfiguration,
          packager
        });
      }
    }

    return tasks;
  });
  return _createUpdateInfoTasks.apply(this, arguments);
}

function createUpdateInfo(_x4, _x5, _x6) {
  return _createUpdateInfo.apply(this, arguments);
}

function _createUpdateInfo() {
  _createUpdateInfo = (0, _bluebirdLst().coroutine)(function* (version, event, releaseInfo) {
    const customUpdateInfo = event.updateInfo;
    const url = path.basename(event.file);
    const sha512 = (customUpdateInfo == null ? null : customUpdateInfo.sha512) || (yield (0, _hash().hashFile)(event.file));
    const files = [{
      url,
      sha512
    }];
    const result = Object.assign({
      version,
      files,
      path: url
      /* backward compatibility, electron-updater 1.x - electron-updater 2.15.0 */
      ,
      sha512
      /* backward compatibility, electron-updater 1.x - electron-updater 2.15.0 */

    }, releaseInfo);

    if (customUpdateInfo != null) {
      // file info or nsis web installer packages info
      Object.assign("sha512" in customUpdateInfo ? files[0] : result, customUpdateInfo);
    }

    return result;
  });
  return _createUpdateInfo.apply(this, arguments);
}

function writeUpdateInfoFiles(_x7, _x8) {
  return _writeUpdateInfoFiles.apply(this, arguments);
} // backward compatibility - write json file


function _writeUpdateInfoFiles() {
  _writeUpdateInfoFiles = (0, _bluebirdLst().coroutine)(function* (updateInfoFileTasks, packager) {
    // zip must be first and zip info must be used for old path/sha512 properties in the update info
    updateInfoFileTasks.sort((a, b) => (a.info.files[0].url.endsWith(".zip") ? 0 : 100) - (b.info.files[0].url.endsWith(".zip") ? 0 : 100));
    const updateChannelFileToInfo = new Map();

    for (const task of updateInfoFileTasks) {
      // https://github.com/electron-userland/electron-builder/pull/2994
      const key = `${task.file}@${(0, _builderUtil().safeStringifyJson)(task.publishConfiguration, new Set(["releaseType"]))}`;
      const existingTask = updateChannelFileToInfo.get(key);

      if (existingTask == null) {
        updateChannelFileToInfo.set(key, task);
        continue;
      }

      existingTask.info.files.push(...task.info.files);
    }

    const releaseDate = new Date().toISOString();
    yield _bluebirdLst().default.map(updateChannelFileToInfo.values(),
    /*#__PURE__*/
    function () {
      var _ref = (0, _bluebirdLst().coroutine)(function* (task) {
        const publishConfig = task.publishConfiguration;

        if (publishConfig.publishAutoUpdate === false) {
          _builderUtil().log.debug({
            provider: publishConfig.provider,
            reason: "publishAutoUpdate is set to false"
          }, "auto update metadata file not published");

          return;
        }

        if (task.info.releaseDate == null) {
          task.info.releaseDate = releaseDate;
        }

        const fileContent = Buffer.from((0, _builderUtil().serializeToYaml)(task.info, false, true));
        yield (0, _fsExtraP().outputFile)(task.file, fileContent);
        packager.dispatchArtifactCreated({
          file: task.file,
          fileContent,
          arch: null,
          packager: task.packager,
          target: null,
          publishConfig
        });
      });

      return function (_x16) {
        return _ref.apply(this, arguments);
      };
    }(), {
      concurrency: 4
    });
  });
  return _writeUpdateInfoFiles.apply(this, arguments);
}

function writeOldMacInfo(_x9, _x10, _x11, _x12, _x13, _x14, _x15) {
  return _writeOldMacInfo.apply(this, arguments);
} function _writeOldMacInfo() {
  _writeOldMacInfo = (0, _bluebirdLst().coroutine)(function* (publishConfig, outDir, dir, channel, createdFiles, version, packager) {
    const isGitHub = publishConfig.provider === "github";
    const updateInfoFile = isGitHub && outDir === dir ? path.join(dir, "github", `${channel}-mac.json`) : path.join(dir, `${channel}-mac.json`);

    if (!createdFiles.has(updateInfoFile)) {
      createdFiles.add(updateInfoFile);
      yield (0, _fsExtraP().outputJson)(updateInfoFile, {
        version,
        releaseDate: new Date().toISOString(),
        url: (0, _PublishManager().computeDownloadUrl)(publishConfig, packager.generateName2("zip", "mac", isGitHub), packager)
      }, {
        spaces: 2
      });
      packager.info.dispatchArtifactCreated({
        file: updateInfoFile,
        arch: null,
        packager,
        target: null,
        publishConfig
      });
    }
  });
  return _writeOldMacInfo.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=updateInfoBuilder.js.map{"version":3,"sources":["../../src/publish/updateInfoBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, log, safeStringifyJson, serializeToYaml } from \"builder-util\"\nimport { GenericServerOptions, PublishConfiguration, UpdateInfo, WindowsUpdateInfo } from \"builder-util-runtime\"\nimport { outputFile, outputJson, readFile } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport * as semver from \"semver\"\nimport { ReleaseInfo } from \"..\"\nimport { Platform } from \"../core\"\nimport { Packager } from \"../packager\"\nimport { ArtifactCreated } from \"../packagerApi\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { hashFile } from \"../util/hash\"\nimport { computeDownloadUrl, getPublishConfigsForUpdateInfo } from \"./PublishManager\"\n\nasync function getReleaseInfo(packager: PlatformPackager<any>) {\n  const releaseInfo: ReleaseInfo = {...(packager.platformSpecificBuildOptions.releaseInfo || packager.config.releaseInfo)}\n  if (releaseInfo.releaseNotes == null) {\n    const releaseNotesFile = await packager.getResource(releaseInfo.releaseNotesFile, `release-notes-${packager.platform.buildConfigurationKey}.md`, `release-notes-${packager.platform.name}.md`, `release-notes-${packager.platform.nodeName}.md`, \"release-notes.md\")\n    const releaseNotes = releaseNotesFile == null ? null : await readFile(releaseNotesFile, \"utf-8\")\n    // to avoid undefined in the file, check for null\n    if (releaseNotes != null) {\n      releaseInfo.releaseNotes = releaseNotes\n    }\n  }\n  delete releaseInfo.releaseNotesFile\n  return releaseInfo\n}\n\nfunction isGenerateUpdatesFilesForAllChannels(packager: PlatformPackager<any>) {\n  const value = packager.platformSpecificBuildOptions.generateUpdatesFilesForAllChannels\n  return value == null ? packager.config.generateUpdatesFilesForAllChannels : value\n}\n\n/**\n if this is an \"alpha\" version, we need to generate only the \"alpha\" .yml file\n if this is a \"beta\" version, we need to generate both the \"alpha\" and \"beta\" .yml file\n if this is a \"stable\" version, we need to generate all the \"alpha\", \"beta\" and \"stable\" .yml file\n */\nfunction computeChannelNames(packager: PlatformPackager<any>, publishConfig: PublishConfiguration): Array<string> {\n  const currentChannel: string = (publishConfig as GenericServerOptions).channel || \"latest\"\n  // for GitHub should be pre-release way be used\n  if (currentChannel === \"alpha\" || publishConfig.provider === \"github\" || !isGenerateUpdatesFilesForAllChannels(packager)) {\n    return [currentChannel]\n  }\n\n  switch (currentChannel) {\n    case \"beta\":\n      return [currentChannel, \"alpha\"]\n\n    case \"latest\":\n      return [currentChannel, \"alpha\", \"beta\"]\n\n    default:\n      return [currentChannel]\n  }\n}\n\nfunction getUpdateInfoFileName(channel: string, packager: PlatformPackager<any>, arch: Arch | null): string {\n  const osSuffix = packager.platform === Platform.WINDOWS ? \"\" : `-${packager.platform.buildConfigurationKey}`\n  return `${channel}${osSuffix}${getArchPrefixForUpdateFile(arch, packager)}.yml`\n}\n\nfunction getArchPrefixForUpdateFile(arch: Arch | null, packager: PlatformPackager<any>) {\n  if (arch == null || arch === Arch.x64 || packager.platform !== Platform.LINUX) {\n    return \"\"\n  }\n  return arch === Arch.armv7l ? \"-arm\" : `-${Arch[arch]}`\n}\n\nexport interface UpdateInfoFileTask {\n  readonly file: string\n  readonly info: UpdateInfo\n  readonly publishConfiguration: PublishConfiguration\n\n  readonly packager: PlatformPackager<any>\n}\n\nfunction computeIsisElectronUpdater1xCompatibility(updaterCompatibility: string | null, publishConfiguration: PublishConfiguration, packager: Packager) {\n  if (updaterCompatibility != null) {\n    return semver.satisfies(\"1.0.0\", updaterCompatibility)\n  }\n\n  // spaces is a new publish provider, no need to keep backward compatibility\n  if (publishConfiguration.provider === \"spaces\") {\n    return false\n  }\n\n  const updaterVersion = packager.metadata.dependencies == null ? null : packager.metadata.dependencies[\"electron-updater\"]\n  return updaterVersion == null || semver.lt(updaterVersion, \"4.0.0\")\n}\n\n/** @internal */\nexport async function createUpdateInfoTasks(event: ArtifactCreated, _publishConfigs: Array<PublishConfiguration>): Promise<Array<UpdateInfoFileTask>> {\n  const packager = event.packager\n  const publishConfigs = await getPublishConfigsForUpdateInfo(packager, _publishConfigs, event.arch)\n  if (publishConfigs == null || publishConfigs.length === 0) {\n    return []\n  }\n\n  const outDir = event.target!.outDir\n  const version = packager.appInfo.version\n  const sha2 = new Lazy<string>(() => hashFile(event.file!, \"sha256\", \"hex\"))\n  const isMac = packager.platform === Platform.MAC\n  const createdFiles = new Set<string>()\n  const sharedInfo = await createUpdateInfo(version, event, await getReleaseInfo(packager))\n  const tasks: Array<UpdateInfoFileTask> = []\n  const electronUpdaterCompatibility = packager.platformSpecificBuildOptions.electronUpdaterCompatibility || packager.config.electronUpdaterCompatibility || \">=2.15\"\n  for (const publishConfiguration of publishConfigs) {\n    const isBintray = publishConfiguration.provider === \"bintray\"\n    let dir = outDir\n    // Bintray uses different variant of channel file info, better to generate it to a separate dir by always\n    if (isBintray || (publishConfigs.length > 1 && publishConfiguration !== publishConfigs[0])) {\n      dir = path.join(outDir, publishConfiguration.provider)\n    }\n\n    let isElectronUpdater1xCompatibility = computeIsisElectronUpdater1xCompatibility(electronUpdaterCompatibility, publishConfiguration, packager.info)\n\n    let info = sharedInfo\n    // noinspection JSDeprecatedSymbols\n    if (isElectronUpdater1xCompatibility && packager.platform === Platform.WINDOWS) {\n      info = {\n        ...info,\n      };\n      // noinspection JSDeprecatedSymbols\n      (info as WindowsUpdateInfo).sha2 = await sha2.value\n    }\n\n    if (event.safeArtifactName != null && publishConfiguration.provider === \"github\") {\n      const newFiles = info.files.slice()\n      newFiles[0].url = event.safeArtifactName\n      info = {\n        ...info,\n        files: newFiles,\n        path: event.safeArtifactName,\n      }\n    }\n\n    for (const channel of computeChannelNames(packager, publishConfiguration)) {\n      if (isMac && isElectronUpdater1xCompatibility && event.file.endsWith(\".zip\")) {\n        // write only for first channel (generateUpdatesFilesForAllChannels is a new functionality, no need to generate old mac update info file)\n        isElectronUpdater1xCompatibility = false\n        await writeOldMacInfo(publishConfiguration, outDir, dir, channel, createdFiles, version, packager)\n      }\n\n      const updateInfoFile = path.join(dir, (isBintray ? `${version}_` : \"\") + getUpdateInfoFileName(channel, packager, event.arch))\n      if (createdFiles.has(updateInfoFile)) {\n        continue\n      }\n\n      createdFiles.add(updateInfoFile)\n\n      // artifact should be uploaded only to designated publish provider\n      tasks.push({\n        file: updateInfoFile,\n        info,\n        publishConfiguration,\n        packager,\n      })\n    }\n  }\n  return tasks\n}\n\nasync function createUpdateInfo(version: string, event: ArtifactCreated, releaseInfo: ReleaseInfo): Promise<UpdateInfo> {\n  const customUpdateInfo = event.updateInfo\n  const url = path.basename(event.file!)\n  const sha512 = (customUpdateInfo == null ? null : customUpdateInfo.sha512) || await hashFile(event.file!)\n  const files = [{url, sha512}]\n  const result: UpdateInfo = {\n    version,\n    files,\n    path: url /* backward compatibility, electron-updater 1.x - electron-updater 2.15.0 */,\n    sha512 /* backward compatibility, electron-updater 1.x - electron-updater 2.15.0 */,\n    ...releaseInfo as UpdateInfo,\n  }\n\n  if (customUpdateInfo != null) {\n    // file info or nsis web installer packages info\n    Object.assign(\"sha512\" in customUpdateInfo ? files[0] : result, customUpdateInfo)\n  }\n  return result\n}\n\nexport async function writeUpdateInfoFiles(updateInfoFileTasks: Array<UpdateInfoFileTask>, packager: Packager) {\n  // zip must be first and zip info must be used for old path/sha512 properties in the update info\n  updateInfoFileTasks.sort((a, b) => (a.info.files[0].url.endsWith(\".zip\") ? 0 : 100) - (b.info.files[0].url.endsWith(\".zip\") ? 0 : 100))\n\n  const updateChannelFileToInfo = new Map<string, UpdateInfoFileTask>()\n  for (const task of updateInfoFileTasks) {\n    // https://github.com/electron-userland/electron-builder/pull/2994\n    const key = `${task.file}@${safeStringifyJson(task.publishConfiguration, new Set([\"releaseType\"]))}`\n    const existingTask = updateChannelFileToInfo.get(key)\n    if (existingTask == null) {\n      updateChannelFileToInfo.set(key, task)\n      continue\n    }\n\n    existingTask.info.files.push(...task.info.files)\n  }\n\n  const releaseDate = new Date().toISOString()\n  await BluebirdPromise.map(updateChannelFileToInfo.values(), async task => {\n    const publishConfig = task.publishConfiguration\n    if (publishConfig.publishAutoUpdate === false) {\n      log.debug({\n        provider: publishConfig.provider,\n        reason: \"publishAutoUpdate is set to false\"\n      }, \"auto update metadata file not published\")\n      return\n    }\n\n    if (task.info.releaseDate == null) {\n      task.info.releaseDate = releaseDate\n    }\n\n    const fileContent = Buffer.from(serializeToYaml(task.info, false, true))\n    await outputFile(task.file, fileContent)\n    packager.dispatchArtifactCreated({\n      file: task.file,\n      fileContent,\n      arch: null,\n      packager: task.packager,\n      target: null,\n      publishConfig,\n    })\n  }, {concurrency: 4})\n}\n\n// backward compatibility - write json file\nasync function writeOldMacInfo(publishConfig: PublishConfiguration, outDir: string, dir: string, channel: string, createdFiles: Set<string>, version: string, packager: PlatformPackager<any>) {\n  const isGitHub = publishConfig.provider === \"github\"\n  const updateInfoFile = (isGitHub && outDir === dir) ? path.join(dir, \"github\", `${channel}-mac.json`) : path.join(dir, `${channel}-mac.json`)\n  if (!createdFiles.has(updateInfoFile)) {\n    createdFiles.add(updateInfoFile)\n    await outputJson(updateInfoFile, {\n      version,\n      releaseDate: new Date().toISOString(),\n      url: computeDownloadUrl(publishConfig, packager.generateName2(\"zip\", \"mac\", isGitHub), packager),\n    }, {spaces: 2})\n\n    packager.info.dispatchArtifactCreated({\n      file: updateInfoFile,\n      arch: null,\n      packager,\n      target: null,\n      publishConfig,\n    })\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.reactCra = reactCra;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/** @internal */
function reactCra(_x) {
  return _reactCra.apply(this, arguments);
} function _reactCra() {
  _reactCra = (0, _bluebirdLst().coroutine)(function* (projectDir) {
    if ((yield (0, _fs().statOrNull)(path.join(projectDir, "public", "electron.js"))) == null) {
      // noinspection SpellCheckingInspection
      _builderUtil().log.warn("public/electron.js not found. Please see https://medium.com/@kitze/%EF%B8%8F-from-react-to-an-electron-app-ready-for-production-a0468ecb1da3");
    }

    return {
      directories: {
        buildResources: "assets"
      },
      files: ["build/**/*"],
      extraMetadata: {
        main: "build/electron.js"
      }
    };
  });
  return _reactCra.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=rectCra.js.map{"version":3,"sources":["../../src/presets/rectCra.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;;;AAGA;SACsB,Q;;;;;;4CAAf,WAAwB,UAAxB,EAA0C;AAC/C,QAAI,OAAO,sBAAW,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,QAAtB,EAAgC,aAAhC,CAAX,CAAP,KAAsE,IAA1E,EAAgF;AAC9E;AACA,yBAAI,IAAJ,CAAS,8IAAT;AACD;;AAED,WAAO;AACL,MAAA,WAAW,EAAE;AACX,QAAA,cAAc,EAAE;AADL,OADR;AAIL,MAAA,KAAK,EAAE,CAAC,YAAD,CAJF;AAKL,MAAA,aAAa,EAAE;AACb,QAAA,IAAI,EAAE;AADO;AALV,KAAP;AAQE,G","sourcesContent":["import { log } from \"builder-util\"\nimport { statOrNull } from \"builder-util/out/fs\"\nimport * as path from \"path\"\nimport { Configuration } from \"../configuration\"\n\n/** @internal */\nexport async function reactCra(projectDir: string): Promise<Configuration> {\n  if ((await statOrNull(path.join(projectDir, \"public\", \"electron.js\"))) == null) {\n    // noinspection SpellCheckingInspection\n    log.warn(\"public/electron.js not found. Please see https://medium.com/@kitze/%EF%B8%8F-from-react-to-an-electron-app-ready-for-production-a0468ecb1da3\")\n  }\n\n  return {\n    directories: {\n      buildResources: \"assets\"\n    },\n    files: [\"build/**/*\"],\n    extraMetadata: {\n      main: \"build/electron.js\"\n    }\n  }}"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=AppXOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getEffectiveOptions = getEffectiveOptions;
exports.DesktopShortcutCreationPolicy = void 0;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _sanitizeFilename() {
  const data = _interopRequireDefault(require("sanitize-filename"));

  _sanitizeFilename = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function getEffectiveOptions(options, packager) {
  const appInfo = packager.appInfo;
  let menuCategory = null;

  if (options.menuCategory != null && options.menuCategory !== false) {
    if (options.menuCategory === true) {
      const companyName = packager.appInfo.companyName;

      if (companyName == null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Please specify "author" in the application package.json â€” it is required because "menuCategory" is set to true.`);
      }

      menuCategory = (0, _sanitizeFilename().default)(companyName);
    } else {
      menuCategory = options.menuCategory.split(/[\/\\]/).map(it => (0, _sanitizeFilename().default)(it)).join("\\");
    }
  }

  return {
    isPerMachine: options.perMachine === true,
    isAssisted: options.oneClick === false,
    shortcutName: (0, _builderUtil().isEmptyOrSpaces)(options.shortcutName) ? appInfo.productFilename : packager.expandMacro(options.shortcutName),
    isCreateDesktopShortcut: convertToDesktopShortcutCreationPolicy(options.createDesktopShortcut),
    isCreateStartMenuShortcut: options.createStartMenuShortcut !== false,
    menuCategory
  };
}

function convertToDesktopShortcutCreationPolicy(value) {
  if (value === false) {
    return DesktopShortcutCreationPolicy.NEVER;
  } else if (value === "always") {
    return DesktopShortcutCreationPolicy.ALWAYS;
  } else {
    return DesktopShortcutCreationPolicy.FRESH_INSTALL;
  }
}

var DesktopShortcutCreationPolicy;
exports.DesktopShortcutCreationPolicy = DesktopShortcutCreationPolicy;

(function (DesktopShortcutCreationPolicy) {
  DesktopShortcutCreationPolicy[DesktopShortcutCreationPolicy["FRESH_INSTALL"] = 0] = "FRESH_INSTALL";
  DesktopShortcutCreationPolicy[DesktopShortcutCreationPolicy["ALWAYS"] = 1] = "ALWAYS";
  DesktopShortcutCreationPolicy[DesktopShortcutCreationPolicy["NEVER"] = 2] = "NEVER";
})(DesktopShortcutCreationPolicy || (exports.DesktopShortcutCreationPolicy = DesktopShortcutCreationPolicy = {})); 
// __ts-babel@6.0.4
//# sourceMappingURL=CommonWindowsInstallerConfiguration.js.map{"version":3,"sources":["../../src/options/CommonWindowsInstallerConfiguration.ts"],"names":[],"mappings":";;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAqDM,SAAU,mBAAV,CAA8B,OAA9B,EAA4E,QAA5E,EAAiG;AACrG,QAAM,OAAO,GAAG,QAAQ,CAAC,OAAzB;AAEA,MAAI,YAAY,GAAkB,IAAlC;;AACA,MAAI,OAAO,CAAC,YAAR,IAAwB,IAAxB,IAAgC,OAAO,CAAC,YAAR,KAAyB,KAA7D,EAAoE;AAClE,QAAI,OAAO,CAAC,YAAR,KAAyB,IAA7B,EAAmC;AACjC,YAAM,WAAW,GAAG,QAAQ,CAAC,OAAT,CAAiB,WAArC;;AACA,UAAI,WAAW,IAAI,IAAnB,EAAyB;AACvB,cAAM,KAAI,wCAAJ,EAA8B,iHAA9B,CAAN;AACD;;AACD,MAAA,YAAY,GAAG,iCAAiB,WAAjB,CAAf;AACD,KAND,MAOK;AACH,MAAA,YAAY,GAAI,OAAO,CAAC,YAAR,CAAgC,KAAhC,CAAsC,QAAtC,EAAgD,GAAhD,CAAoD,EAAE,IAAI,iCAAiB,EAAjB,CAA1D,EAAgF,IAAhF,CAAqF,IAArF,CAAhB;AACD;AACF;;AAED,SAAO;AACL,IAAA,YAAY,EAAE,OAAO,CAAC,UAAR,KAAuB,IADhC;AAEL,IAAA,UAAU,EAAE,OAAO,CAAC,QAAR,KAAqB,KAF5B;AAIL,IAAA,YAAY,EAAE,oCAAgB,OAAO,CAAC,YAAxB,IAAwC,OAAO,CAAC,eAAhD,GAAkE,QAAQ,CAAC,WAAT,CAAqB,OAAO,CAAC,YAA7B,CAJ3E;AAKL,IAAA,uBAAuB,EAAE,sCAAsC,CAAC,OAAO,CAAC,qBAAT,CAL1D;AAML,IAAA,yBAAyB,EAAE,OAAO,CAAC,uBAAR,KAAoC,KAN1D;AAOL,IAAA;AAPK,GAAP;AASD;;AAED,SAAS,sCAAT,CAAgD,KAAhD,EAAmF;AACjF,MAAI,KAAK,KAAK,KAAd,EAAqB;AACnB,WAAO,6BAA6B,CAAC,KAArC;AACD,GAFD,MAGK,IAAI,KAAK,KAAK,QAAd,EAAwB;AAC3B,WAAO,6BAA6B,CAAC,MAArC;AACD,GAFI,MAGA;AACH,WAAO,6BAA6B,CAAC,aAArC;AACD;AACF;;AAED,IAAY,6BAAZ;;;AAAA,CAAA,UAAY,6BAAZ,EAAyC;AACvC,EAAA,6BAAA,CAAA,6BAAA,CAAA,eAAA,CAAA,GAAA,CAAA,CAAA,GAAA,eAAA;AAAe,EAAA,6BAAA,CAAA,6BAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AAAQ,EAAA,6BAAA,CAAA,6BAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACxB,CAFD,EAAY,6BAA6B,6CAA7B,6BAA6B,GAAA,EAAA,CAAzC,E","sourcesContent":["import { InvalidConfigurationError, isEmptyOrSpaces } from \"builder-util\"\nimport sanitizeFileName from \"sanitize-filename\"\nimport { WinPackager } from \"../winPackager\"\n\nexport interface CommonWindowsInstallerConfiguration {\n  readonly oneClick?: boolean\n\n  /**\n   * Whether to install per all users (per-machine).\n   * @default false\n   */\n  readonly perMachine?: boolean\n\n  /**\n   * Whether to run the installed application after finish. For assisted installer corresponding checkbox will be removed.\n   * @default true\n   */\n  readonly runAfterFinish?: boolean\n\n  /**\n   * Whether to create desktop shortcut. Set to `always` if to recreate also on reinstall (even if removed by user).\n   * @default true\n   */\n  readonly createDesktopShortcut?: boolean | \"always\"\n\n  /**\n   * Whether to create start menu shortcut.\n   * @default true\n   */\n  readonly createStartMenuShortcut?: boolean\n\n  /**\n   * Whether to create submenu for start menu shortcut and program files directory. If `true`, company name will be used. Or string value.\n   * @default false\n   */\n  readonly menuCategory?: boolean | string\n\n  /**\n   * The name that will be used for all shortcuts. Defaults to the application name.\n   */\n  readonly shortcutName?: string | null\n}\n\nexport interface FinalCommonWindowsInstallerOptions {\n  isAssisted: boolean\n  isPerMachine: boolean\n\n  shortcutName: string\n  menuCategory: string | null\n\n  isCreateDesktopShortcut: DesktopShortcutCreationPolicy\n  isCreateStartMenuShortcut: boolean\n}\n\nexport function getEffectiveOptions(options: CommonWindowsInstallerConfiguration, packager: WinPackager): FinalCommonWindowsInstallerOptions {\n  const appInfo = packager.appInfo\n\n  let menuCategory: string | null = null\n  if (options.menuCategory != null && options.menuCategory !== false) {\n    if (options.menuCategory === true) {\n      const companyName = packager.appInfo.companyName\n      if (companyName == null) {\n        throw new InvalidConfigurationError(`Please specify \"author\" in the application package.json â€” it is required because \"menuCategory\" is set to true.`)\n      }\n      menuCategory = sanitizeFileName(companyName)\n    }\n    else {\n      menuCategory = (options.menuCategory as string).split(/[\\/\\\\]/).map(it => sanitizeFileName(it)).join(\"\\\\\")\n    }\n  }\n\n  return {\n    isPerMachine: options.perMachine === true,\n    isAssisted: options.oneClick === false,\n\n    shortcutName: isEmptyOrSpaces(options.shortcutName) ? appInfo.productFilename : packager.expandMacro(options.shortcutName!!),\n    isCreateDesktopShortcut: convertToDesktopShortcutCreationPolicy(options.createDesktopShortcut),\n    isCreateStartMenuShortcut: options.createStartMenuShortcut !== false,\n    menuCategory,\n  }\n}\n\nfunction convertToDesktopShortcutCreationPolicy(value: boolean | undefined | string): DesktopShortcutCreationPolicy {\n  if (value === false) {\n    return DesktopShortcutCreationPolicy.NEVER\n  }\n  else if (value === \"always\") {\n    return DesktopShortcutCreationPolicy.ALWAYS\n  }\n  else {\n    return DesktopShortcutCreationPolicy.FRESH_INSTALL\n  }\n}\n\nexport enum DesktopShortcutCreationPolicy {\n  FRESH_INSTALL, ALWAYS, NEVER\n}"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=FileAssociation.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=MsiOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=PlatformSpecificBuildOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=SnapOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=SquirrelWindowsOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=linuxOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=macOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=metadata.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=pkgOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=winOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.LibUiFramework = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _plist() {
  const data = require("plist");

  _plist = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class LibUiFramework {
  constructor(version, distMacOsAppName, isUseLaunchUi) {
    this.version = version;
    this.distMacOsAppName = distMacOsAppName;
    this.isUseLaunchUi = isUseLaunchUi;
    this.name = "libui"; // noinspection JSUnusedGlobalSymbols

    this.macOsDefaultTargets = ["dmg"];
    this.defaultAppIdPrefix = "com.libui."; // noinspection JSUnusedGlobalSymbols

    this.isCopyElevateHelper = false; // noinspection JSUnusedGlobalSymbols

    this.isNpmRebuildRequired = false;
  }

  prepareApplicationStageDirectory(options) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield (0, _fsExtraP().emptyDir)(options.appOutDir);
      const packager = options.packager;
      const platform = packager.platform;

      if (_this.isUseLaunchUiForPlatform(platform)) {
        const appOutDir = options.appOutDir;
        yield (0, _builderUtil().executeAppBuilder)(["proton-native", "--node-version", _this.version, "--use-launch-ui", "--platform", platform.nodeName, "--arch", options.arch, "--stage", appOutDir, "--executable", `${packager.appInfo.productFilename}${platform === _core().Platform.WINDOWS ? ".exe" : ""}`]);
        return;
      }

      if (platform === _core().Platform.MAC) {
        yield _this.prepareMacosApplicationStageDirectory(packager, options);
      } else if (platform === _core().Platform.LINUX) {
        yield _this.prepareLinuxApplicationStageDirectory(options);
      }
    })();
  }

  prepareMacosApplicationStageDirectory(packager, options) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appContentsDir = path.join(options.appOutDir, _this2.distMacOsAppName, "Contents");
      yield (0, _fsExtraP().ensureDir)(path.join(appContentsDir, "Resources"));
      yield (0, _fsExtraP().ensureDir)(path.join(appContentsDir, "MacOS"));
      yield (0, _builderUtil().executeAppBuilder)(["proton-native", "--node-version", _this2.version, "--platform", "darwin", "--stage", path.join(appContentsDir, "MacOS")]);
      const appPlist = {
        // https://github.com/albe-rosado/create-proton-app/issues/13
        NSHighResolutionCapable: true
      };
      yield packager.applyCommonInfo(appPlist, appContentsDir);
      yield Promise.all([(0, _fsExtraP().writeFile)(path.join(appContentsDir, "Info.plist"), (0, _plist().build)(appPlist)), writeExecutableMain(path.join(appContentsDir, "MacOS", appPlist.CFBundleExecutable), `#!/bin/sh
  DIR=$(dirname "$0")
  "$DIR/node" "$DIR/../Resources/app/${options.packager.info.metadata.main || "index.js"}"
  `)]);
    })();
  }

  prepareLinuxApplicationStageDirectory(options) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appOutDir = options.appOutDir;
      yield (0, _builderUtil().executeAppBuilder)(["proton-native", "--node-version", _this3.version, "--platform", "linux", "--arch", options.arch, "--stage", appOutDir]);
      const mainPath = path.join(appOutDir, options.packager.executableName);
      yield writeExecutableMain(mainPath, `#!/bin/sh
  DIR=$(dirname "$0")
  "$DIR/node" "$DIR/app/${options.packager.info.metadata.main || "index.js"}"
  `);
    })();
  }

  afterPack(context) {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = context.packager;

      if (!_this4.isUseLaunchUiForPlatform(packager.platform)) {
        return;
      } // LaunchUI requires main.js, rename if need


      const userMain = packager.info.metadata.main || "index.js";

      if (userMain === "main.js") {
        return;
      }

      yield (0, _fsExtraP().rename)(path.join(context.appOutDir, "app", userMain), path.join(context.appOutDir, "app", "main.js"));
    })();
  }

  getMainFile(platform) {
    return this.isUseLaunchUiForPlatform(platform) ? "main.js" : null;
  }

  isUseLaunchUiForPlatform(platform) {
    return platform === _core().Platform.WINDOWS || this.isUseLaunchUi && platform === _core().Platform.LINUX;
  }

  getExcludedDependencies(platform) {
    // part of launchui
    return this.isUseLaunchUiForPlatform(platform) ? ["libui-node"] : null;
  }

}

exports.LibUiFramework = LibUiFramework;

function writeExecutableMain(_x, _x2) {
  return _writeExecutableMain.apply(this, arguments);
} function _writeExecutableMain() {
  _writeExecutableMain = (0, _bluebirdLst().coroutine)(function* (file, content) {
    yield (0, _fsExtraP().writeFile)(file, content, {
      mode: 0o755
    });
    yield (0, _fsExtraP().chmod)(file, 0o755);
  });
  return _writeExecutableMain.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=LibUiFramework.js.map{"version":3,"sources":["../../src/frameworks/LibUiFramework.ts"],"names":[],"mappings":"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","sourcesContent":["import { chmod, emptyDir, ensureDir, rename, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { build as buildPlist } from \"plist\"\nimport { executeAppBuilder } from \"builder-util\"\nimport { AfterPackContext } from \"../configuration\"\nimport { Platform } from \"../core\"\nimport { Framework, PrepareApplicationStageDirectoryOptions } from \"../Framework\"\nimport { LinuxPackager } from \"../linuxPackager\"\nimport MacPackager from \"../macPackager\"\n\nexport class LibUiFramework implements Framework {\n  readonly name: string = \"libui\"\n  // noinspection JSUnusedGlobalSymbols\n  readonly macOsDefaultTargets = [\"dmg\"]\n\n  readonly defaultAppIdPrefix: string = \"com.libui.\"\n\n  // noinspection JSUnusedGlobalSymbols\n  readonly isCopyElevateHelper = false\n\n  // noinspection JSUnusedGlobalSymbols\n  readonly isNpmRebuildRequired = false\n\n  constructor(readonly version: string, readonly distMacOsAppName: string, protected readonly isUseLaunchUi: boolean) {\n  }\n\n  async prepareApplicationStageDirectory(options: PrepareApplicationStageDirectoryOptions) {\n    await emptyDir(options.appOutDir)\n\n    const packager = options.packager\n    const platform = packager.platform\n\n    if (this.isUseLaunchUiForPlatform(platform)) {\n      const appOutDir = options.appOutDir\n      await executeAppBuilder([\"proton-native\",\n        \"--node-version\", this.version,\n        \"--use-launch-ui\",\n        \"--platform\", platform.nodeName,\n        \"--arch\", options.arch,\n        \"--stage\", appOutDir,\n        \"--executable\", `${packager.appInfo.productFilename}${platform === Platform.WINDOWS ? \".exe\" : \"\"}`,\n      ])\n      return\n    }\n\n    if (platform === Platform.MAC) {\n      await this.prepareMacosApplicationStageDirectory(packager as MacPackager, options)\n    }\n    else if (platform === Platform.LINUX) {\n      await this.prepareLinuxApplicationStageDirectory(options)\n    }\n  }\n\n  private async prepareMacosApplicationStageDirectory(packager: MacPackager, options: PrepareApplicationStageDirectoryOptions) {\n    const appContentsDir = path.join(options.appOutDir, this.distMacOsAppName, \"Contents\")\n    await ensureDir(path.join(appContentsDir, \"Resources\"))\n    await ensureDir(path.join(appContentsDir, \"MacOS\"))\n    await executeAppBuilder([\"proton-native\", \"--node-version\", this.version, \"--platform\", \"darwin\", \"--stage\", path.join(appContentsDir, \"MacOS\")])\n\n    const appPlist: any = {\n      // https://github.com/albe-rosado/create-proton-app/issues/13\n      NSHighResolutionCapable: true,\n    }\n    await packager.applyCommonInfo(appPlist, appContentsDir)\n    await Promise.all([\n      writeFile(path.join(appContentsDir, \"Info.plist\"), buildPlist(appPlist)),\n      writeExecutableMain(path.join(appContentsDir, \"MacOS\", appPlist.CFBundleExecutable), `#!/bin/sh\n  DIR=$(dirname \"$0\")\n  \"$DIR/node\" \"$DIR/../Resources/app/${options.packager.info.metadata.main || \"index.js\"}\"\n  `),\n    ])\n  }\n\n  private async prepareLinuxApplicationStageDirectory(options: PrepareApplicationStageDirectoryOptions) {\n    const appOutDir = options.appOutDir\n    await executeAppBuilder([\"proton-native\", \"--node-version\", this.version, \"--platform\", \"linux\", \"--arch\", options.arch, \"--stage\", appOutDir])\n    const mainPath = path.join(appOutDir, (options.packager as LinuxPackager).executableName)\n    await writeExecutableMain(mainPath, `#!/bin/sh\n  DIR=$(dirname \"$0\")\n  \"$DIR/node\" \"$DIR/app/${options.packager.info.metadata.main || \"index.js\"}\"\n  `)\n  }\n\n  async afterPack(context: AfterPackContext) {\n    const packager = context.packager\n    if (!this.isUseLaunchUiForPlatform(packager.platform)) {\n      return\n    }\n\n    // LaunchUI requires main.js, rename if need\n    const userMain = packager.info.metadata.main || \"index.js\"\n    if (userMain === \"main.js\") {\n      return\n    }\n\n    await rename(path.join(context.appOutDir, \"app\", userMain), path.join(context.appOutDir, \"app\", \"main.js\"))\n  }\n\n  getMainFile(platform: Platform): string | null {\n    return this.isUseLaunchUiForPlatform(platform) ? \"main.js\" : null\n  }\n\n  private isUseLaunchUiForPlatform(platform: Platform) {\n    return platform === Platform.WINDOWS || (this.isUseLaunchUi && platform === Platform.LINUX)\n  }\n\n  getExcludedDependencies(platform: Platform): Array<string> | null {\n    // part of launchui\n    return this.isUseLaunchUiForPlatform(platform) ? [\"libui-node\"] : null\n  }\n}\n\nasync function writeExecutableMain(file: string, content: string) {\n  await writeFile(file, content, {mode: 0o755})\n  await chmod(file, 0o755)\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createElectronFrameworkSupport = createElectronFrameworkSupport;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _index() {
  const data = require("../index");

  _index = function () {
    return data;
  };

  return data;
}

function _pathManager() {
  const data = require("../util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

function _electronMac() {
  const data = require("./electronMac");

  _electronMac = function () {
    return data;
  };

  return data;
}

function _electronVersion() {
  const data = require("./electronVersion");

  _electronVersion = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function createDownloadOpts(opts, platform, arch, electronVersion) {
  return Object.assign({
    platform,
    arch,
    version: electronVersion
  }, opts.electronDownload);
}

function beforeCopyExtraFiles(_x) {
  return _beforeCopyExtraFiles.apply(this, arguments);
}

function _beforeCopyExtraFiles() {
  _beforeCopyExtraFiles = (0, _bluebirdLst().coroutine)(function* (options) {
    const packager = options.packager;
    const appOutDir = options.appOutDir;

    if (packager.platform === _index().Platform.LINUX) {
      const linuxPackager = packager;
      const executable = path.join(appOutDir, linuxPackager.executableName);
      yield (0, _fsExtraP().rename)(path.join(appOutDir, packager.electronDistExecutableName), executable);
    } else if (packager.platform === _index().Platform.WINDOWS) {
      const executable = path.join(appOutDir, `${packager.appInfo.productFilename}.exe`);
      yield (0, _fsExtraP().rename)(path.join(appOutDir, `${packager.electronDistExecutableName}.exe`), executable);
    } else {
      yield (0, _electronMac().createMacApp)(packager, appOutDir, options.asarIntegrity, options.platformName === "mas");
      const wantedLanguages = (0, _builderUtil().asArray)(packager.platformSpecificBuildOptions.electronLanguages);

      if (wantedLanguages.length === 0) {
        return;
      } // noinspection SpellCheckingInspection


      const langFileExt = ".lproj";
      const resourcesDir = packager.getResourcesDir(appOutDir);
      yield _bluebirdLst().default.map((0, _fsExtraP().readdir)(resourcesDir), file => {
        if (!file.endsWith(langFileExt)) {
          return;
        }

        const language = file.substring(0, file.length - langFileExt.length);

        if (!wantedLanguages.includes(language)) {
          return (0, _fsExtraP().remove)(path.join(resourcesDir, file));
        }

        return;
      }, _fs().CONCURRENCY);
    }
  });
  return _beforeCopyExtraFiles.apply(this, arguments);
}

class ElectronFramework {
  constructor(name, version, distMacOsAppName) {
    this.name = name;
    this.version = version;
    this.distMacOsAppName = distMacOsAppName; // noinspection JSUnusedGlobalSymbols

    this.macOsDefaultTargets = ["zip", "dmg"]; // noinspection JSUnusedGlobalSymbols

    this.defaultAppIdPrefix = "com.electron."; // noinspection JSUnusedGlobalSymbols

    this.isCopyElevateHelper = true; // noinspection JSUnusedGlobalSymbols

    this.isNpmRebuildRequired = true;
  }

  getDefaultIcon(platform) {
    if (platform === _index().Platform.LINUX) {
      return path.join((0, _pathManager().getTemplatePath)("icons"), "electron-linux");
    } else {
      // default icon is embedded into app skeleton
      return null;
    }
  }

  prepareApplicationStageDirectory(options) {
    return unpack(options, createDownloadOpts(options.packager.config, options.platformName, options.arch, this.version), this.distMacOsAppName);
  }

  beforeCopyExtraFiles(options) {
    return beforeCopyExtraFiles(options);
  }

}

function createElectronFrameworkSupport(_x2, _x3) {
  return _createElectronFrameworkSupport.apply(this, arguments);
}

function _createElectronFrameworkSupport() {
  _createElectronFrameworkSupport = (0, _bluebirdLst().coroutine)(function* (configuration, packager) {
    let version = configuration.electronVersion;

    if (version == null) {
      // for prepacked app asar no dev deps in the app.asar
      if (packager.isPrepackedAppAsar) {
        version = yield (0, _electronVersion().getElectronVersionFromInstalled)(packager.projectDir);

        if (version == null) {
          throw new Error(`Cannot compute electron version for prepacked asar`);
        }
      } else {
        version = yield (0, _electronVersion().computeElectronVersion)(packager.projectDir, new (_lazyVal().Lazy)(() => Promise.resolve(packager.metadata)));
      }

      configuration.electronVersion = version;
    }

    return new ElectronFramework("electron", version, "Electron.app");
  });
  return _createElectronFrameworkSupport.apply(this, arguments);
}

function unpack(_x4, _x5, _x6) {
  return _unpack.apply(this, arguments);
}

function _unpack() {
  _unpack = (0, _bluebirdLst().coroutine)(function* (prepareOptions, options, distMacOsAppName) {
    const packager = prepareOptions.packager;
    const out = prepareOptions.appOutDir;
    let dist = packager.config.electronDist;

    if (dist != null) {
      const zipFile = `electron-v${options.version}-${prepareOptions.platformName}-${options.arch}.zip`;
      const resolvedDist = path.resolve(packager.projectDir, dist);

      if ((yield (0, _fs().statOrNull)(path.join(resolvedDist, zipFile))) != null) {
        options.cache = resolvedDist;
        dist = null;
      }
    }

    let isFullCleanup = false;

    if (dist == null) {
      yield (0, _builderUtil().executeAppBuilder)(["unpack-electron", "--configuration", JSON.stringify([options]), "--output", out, "--distMacOsAppName", distMacOsAppName]);
    } else {
      isFullCleanup = true;
      const source = packager.getElectronSrcDir(dist);
      const destination = packager.getElectronDestinationDir(out);

      _builderUtil().log.info({
        source,
        destination
      }, "copying Electron");

      yield (0, _fsExtraP().emptyDir)(out);
      yield (0, _fs().copyDir)(source, destination, {
        isUseHardLink: _fs().DO_NOT_USE_HARD_LINKS
      });
    }

    yield cleanupAfterUnpack(prepareOptions, distMacOsAppName, isFullCleanup);
  });
  return _unpack.apply(this, arguments);
}

function cleanupAfterUnpack(prepareOptions, distMacOsAppName, isFullCleanup) {
  const out = prepareOptions.appOutDir;

  const isMac = prepareOptions.packager.platform === _index().Platform.MAC;

  const resourcesPath = isMac ? path.join(out, distMacOsAppName, "Contents", "Resources") : path.join(out, "resources");
  return Promise.all([isFullCleanup ? (0, _fs().unlinkIfExists)(path.join(resourcesPath, "default_app.asar")) : Promise.resolve(), isFullCleanup ? (0, _fs().unlinkIfExists)(path.join(out, "version")) : Promise.resolve(), isMac ? Promise.resolve() : (0, _fsExtraP().rename)(path.join(out, "LICENSE"), path.join(out, "LICENSE.electron.txt")).catch(() => {})]);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=ElectronFramework.js.map{"version":3,"sources":["../../src/electron/ElectronFramework.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { asArray, executeAppBuilder, log } from \"builder-util\"\nimport { CONCURRENCY, copyDir, DO_NOT_USE_HARD_LINKS, statOrNull, unlinkIfExists } from \"builder-util/out/fs\"\nimport { emptyDir, readdir, remove, rename } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { Configuration } from \"../configuration\"\nimport { BeforeCopyExtraFilesOptions, Framework, PrepareApplicationStageDirectoryOptions } from \"../Framework\"\nimport { ElectronPlatformName, Packager, Platform } from \"../index\"\nimport { LinuxPackager } from \"../linuxPackager\"\nimport MacPackager from \"../macPackager\"\nimport { getTemplatePath } from \"../util/pathManager\"\nimport { createMacApp } from \"./electronMac\"\nimport { computeElectronVersion, getElectronVersionFromInstalled } from \"./electronVersion\"\n\nexport type ElectronPlatformName = \"darwin\" | \"linux\" | \"win32\" | \"mas\"\n\nexport interface ElectronDownloadOptions {\n  // https://github.com/electron-userland/electron-builder/issues/3077\n  // must be optional\n  version?: string\n\n  /**\n   * The [cache location](https://github.com/electron-userland/electron-download#cache-location).\n   */\n  cache?: string | null\n\n  /**\n   * The mirror.\n   */\n  mirror?: string | null\n\n  /** @private */\n  customDir?: string | null\n  /** @private */\n  customFilename?: string | null\n\n  strictSSL?: boolean\n  isVerifyChecksum?: boolean\n\n  platform?: ElectronPlatformName\n  arch?: string\n}\n\nfunction createDownloadOpts(opts: Configuration, platform: ElectronPlatformName, arch: string, electronVersion: string): ElectronDownloadOptions {\n  return {\n    platform,\n    arch,\n    version: electronVersion,\n    ...opts.electronDownload,\n  }\n}\n\nasync function beforeCopyExtraFiles(options: BeforeCopyExtraFilesOptions) {\n  const packager = options.packager\n  const appOutDir = options.appOutDir\n  if (packager.platform === Platform.LINUX) {\n    const linuxPackager = (packager as LinuxPackager)\n    const executable = path.join(appOutDir, linuxPackager.executableName)\n    await rename(path.join(appOutDir, packager.electronDistExecutableName), executable)\n  }\n  else if (packager.platform === Platform.WINDOWS) {\n    const executable = path.join(appOutDir, `${packager.appInfo.productFilename}.exe`)\n    await rename(path.join(appOutDir, `${packager.electronDistExecutableName}.exe`), executable)\n  }\n  else {\n    await createMacApp(packager as MacPackager, appOutDir, options.asarIntegrity, (options.platformName as ElectronPlatformName) === \"mas\")\n\n    const wantedLanguages = asArray(packager.platformSpecificBuildOptions.electronLanguages)\n    if (wantedLanguages.length === 0) {\n      return\n    }\n\n    // noinspection SpellCheckingInspection\n    const langFileExt = \".lproj\"\n    const resourcesDir = packager.getResourcesDir(appOutDir)\n    await BluebirdPromise.map(readdir(resourcesDir), file => {\n      if (!file.endsWith(langFileExt)) {\n        return\n      }\n\n      const language = file.substring(0, file.length - langFileExt.length)\n      if (!wantedLanguages.includes(language)) {\n        return remove(path.join(resourcesDir, file))\n      }\n      return\n    }, CONCURRENCY)\n  }\n}\n\nclass ElectronFramework implements Framework {\n  // noinspection JSUnusedGlobalSymbols\n  readonly macOsDefaultTargets = [\"zip\", \"dmg\"]\n  // noinspection JSUnusedGlobalSymbols\n  readonly defaultAppIdPrefix = \"com.electron.\"\n  // noinspection JSUnusedGlobalSymbols\n  readonly isCopyElevateHelper = true\n  // noinspection JSUnusedGlobalSymbols\n  readonly isNpmRebuildRequired = true\n\n  constructor(readonly name: string, readonly version: string, readonly distMacOsAppName: string) {\n  }\n\n  getDefaultIcon(platform: Platform) {\n    if (platform === Platform.LINUX) {\n      return path.join(getTemplatePath(\"icons\"), \"electron-linux\")\n    }\n    else {\n      // default icon is embedded into app skeleton\n      return null\n    }\n  }\n\n  prepareApplicationStageDirectory(options: PrepareApplicationStageDirectoryOptions) {\n    return unpack(options, createDownloadOpts(options.packager.config, options.platformName, options.arch, this.version), this.distMacOsAppName)\n  }\n\n  beforeCopyExtraFiles(options: BeforeCopyExtraFilesOptions) {\n    return beforeCopyExtraFiles(options)\n  }\n}\n\nexport async function createElectronFrameworkSupport(configuration: Configuration, packager: Packager): Promise<Framework> {\n  let version = configuration.electronVersion\n  if (version == null) {\n    // for prepacked app asar no dev deps in the app.asar\n    if (packager.isPrepackedAppAsar) {\n      version = await getElectronVersionFromInstalled(packager.projectDir)\n      if (version == null) {\n        throw new Error(`Cannot compute electron version for prepacked asar`)\n      }\n    }\n    else {\n      version = await computeElectronVersion(packager.projectDir, new Lazy(() => Promise.resolve(packager.metadata)))\n    }\n    configuration.electronVersion = version\n  }\n\n  return new ElectronFramework(\"electron\", version, \"Electron.app\")\n}\n\nasync function unpack(prepareOptions: PrepareApplicationStageDirectoryOptions, options: ElectronDownloadOptions, distMacOsAppName: string) {\n  const packager = prepareOptions.packager\n  const out = prepareOptions.appOutDir\n\n  let dist: string | null | undefined = packager.config.electronDist\n  if (dist != null) {\n    const zipFile = `electron-v${options.version}-${prepareOptions.platformName}-${options.arch}.zip`\n    const resolvedDist = path.resolve(packager.projectDir, dist)\n    if ((await statOrNull(path.join(resolvedDist, zipFile))) != null) {\n      options.cache = resolvedDist\n      dist = null\n    }\n  }\n\n  let isFullCleanup = false\n  if (dist == null) {\n    await executeAppBuilder([\"unpack-electron\", \"--configuration\", JSON.stringify([options]), \"--output\", out, \"--distMacOsAppName\", distMacOsAppName])\n  }\n  else {\n    isFullCleanup = true\n    const source = packager.getElectronSrcDir(dist)\n    const destination = packager.getElectronDestinationDir(out)\n    log.info({source, destination}, \"copying Electron\")\n    await emptyDir(out)\n    await copyDir(source, destination, {\n      isUseHardLink: DO_NOT_USE_HARD_LINKS,\n    })\n  }\n\n  await cleanupAfterUnpack(prepareOptions, distMacOsAppName, isFullCleanup)\n}\n\nfunction cleanupAfterUnpack(prepareOptions: PrepareApplicationStageDirectoryOptions, distMacOsAppName: string, isFullCleanup: boolean) {\n  const out = prepareOptions.appOutDir\n  const isMac = prepareOptions.packager.platform === Platform.MAC\n  const resourcesPath = isMac ? path.join(out, distMacOsAppName, \"Contents\", \"Resources\") : path.join(out, \"resources\")\n\n  return Promise.all([\n    isFullCleanup ? unlinkIfExists(path.join(resourcesPath, \"default_app.asar\")) : Promise.resolve(),\n    isFullCleanup ? unlinkIfExists(path.join(out, \"version\")) : Promise.resolve(),\n    isMac ? Promise.resolve() : rename(path.join(out, \"LICENSE\"), path.join(out, \"LICENSE.electron.txt\")).catch(() => {/* ignore */}),\n  ])\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createMacApp = createMacApp;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _plist() {
  const data = require("plist");

  _plist = function () {
    return data;
  };

  return data;
}

function _appInfo() {
  const data = require("../appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("../platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function doRename(basePath, oldName, newName) {
  return (0, _fsExtraP().rename)(path.join(basePath, oldName), path.join(basePath, newName));
}

function moveHelpers(helperSuffixes, frameworksPath, appName, prefix) {
  return _bluebirdLst().default.map(helperSuffixes, suffix => {
    const executableBasePath = path.join(frameworksPath, `${prefix}${suffix}.app`, "Contents", "MacOS");
    return doRename(executableBasePath, `${prefix}${suffix}`, appName + suffix).then(() => doRename(frameworksPath, `${prefix}${suffix}.app`, `${appName}${suffix}.app`));
  });
}

function getAvailableHelperSuffixes(helperEHPlist, helperNPPlist) {
  const result = [" Helper"];

  if (helperEHPlist != null) {
    result.push(" Helper EH");
  }

  if (helperNPPlist != null) {
    result.push(" Helper NP");
  }

  return result;
}
/** @internal */


function createMacApp(_x, _x2, _x3, _x4) {
  return _createMacApp.apply(this, arguments);
}

function _createMacApp() {
  _createMacApp = (0, _bluebirdLst().coroutine)(function* (packager, appOutDir, asarIntegrity, isMas) {
    const appInfo = packager.appInfo;
    const appFilename = appInfo.productFilename;
    const contentsPath = path.join(appOutDir, packager.info.framework.distMacOsAppName, "Contents");
    const frameworksPath = path.join(contentsPath, "Frameworks");
    const loginItemPath = path.join(contentsPath, "Library", "LoginItems");
    const appPlistFilename = path.join(contentsPath, "Info.plist");
    const helperPlistFilename = path.join(frameworksPath, `${packager.electronDistMacOsExecutableName} Helper.app`, "Contents", "Info.plist");
    const helperEHPlistFilename = path.join(frameworksPath, `${packager.electronDistMacOsExecutableName} Helper EH.app`, "Contents", "Info.plist");
    const helperNPPlistFilename = path.join(frameworksPath, `${packager.electronDistMacOsExecutableName} Helper NP.app`, "Contents", "Info.plist");
    const helperLoginPlistFilename = path.join(loginItemPath, `${packager.electronDistMacOsExecutableName} Login Helper.app`, "Contents", "Info.plist");
    const buildMetadata = packager.config;
    const fileContents = yield _bluebirdLst().default.map([appPlistFilename, helperPlistFilename, helperEHPlistFilename, helperNPPlistFilename, helperLoginPlistFilename, buildMetadata["extend-info"]], it => it == null ? it : (0, _promise().orIfFileNotExist)((0, _fsExtraP().readFile)(it, "utf8"), null));
    const appPlist = (0, _plist().parse)(fileContents[0]);
    const helperPlist = (0, _plist().parse)(fileContents[1]);
    const helperEHPlist = fileContents[2] == null ? null : (0, _plist().parse)(fileContents[2]);
    const helperNPPlist = fileContents[3] == null ? null : (0, _plist().parse)(fileContents[3]);
    const helperLoginPlist = fileContents[4] == null ? null : (0, _plist().parse)(fileContents[4]); // if an extend-info file was supplied, copy its contents in first

    if (fileContents[5] != null) {
      Object.assign(appPlist, (0, _plist().parse)(fileContents[5]));
    }

    const oldHelperBundleId = buildMetadata["helper-bundle-id"];

    if (oldHelperBundleId != null) {
      _builderUtil().log.warn("build.helper-bundle-id is deprecated, please set as build.mac.helperBundleId");
    }

    const helperBundleIdentifier = (0, _appInfo().filterCFBundleIdentifier)(packager.platformSpecificBuildOptions.helperBundleId || oldHelperBundleId || `${appInfo.macBundleIdentifier}.helper`);
    yield packager.applyCommonInfo(appPlist, contentsPath); // required for electron-updater proxy

    if (!isMas) {
      configureLocalhostAts(appPlist);
    }

    helperPlist.CFBundleExecutable = `${appFilename} Helper`;
    helperPlist.CFBundleDisplayName = `${appInfo.productName} Helper`;
    helperPlist.CFBundleIdentifier = helperBundleIdentifier;
    helperPlist.CFBundleVersion = appPlist.CFBundleVersion;

    function configureHelper(helper, postfix) {
      helper.CFBundleExecutable = `${appFilename} Helper ${postfix}`;
      helper.CFBundleDisplayName = `${appInfo.productName} Helper ${postfix}`;
      helper.CFBundleIdentifier = `${helperBundleIdentifier}.${postfix}`;
      helper.CFBundleVersion = appPlist.CFBundleVersion;
    }

    if (helperEHPlist != null) {
      configureHelper(helperEHPlist, "EH");
    }

    if (helperNPPlist != null) {
      configureHelper(helperNPPlist, "NP");
    }

    if (helperLoginPlist != null) {
      helperLoginPlist.CFBundleExecutable = `${appFilename} Login Helper`;
      helperLoginPlist.CFBundleDisplayName = `${appInfo.productName} Login Helper`; // noinspection SpellCheckingInspection

      helperLoginPlist.CFBundleIdentifier = `${appInfo.macBundleIdentifier}.loginhelper`;
      helperLoginPlist.CFBundleVersion = appPlist.CFBundleVersion;
    }

    const protocols = (0, _builderUtil().asArray)(buildMetadata.protocols).concat((0, _builderUtil().asArray)(packager.platformSpecificBuildOptions.protocols));

    if (protocols.length > 0) {
      appPlist.CFBundleURLTypes = protocols.map(protocol => {
        const schemes = (0, _builderUtil().asArray)(protocol.schemes);

        if (schemes.length === 0) {
          throw new (_builderUtil().InvalidConfigurationError)(`Protocol "${protocol.name}": must be at least one scheme specified`);
        }

        return {
          CFBundleURLName: protocol.name,
          CFBundleTypeRole: protocol.role || "Editor",
          CFBundleURLSchemes: schemes.slice()
        };
      });
    }

    const fileAssociations = packager.fileAssociations;

    if (fileAssociations.length > 0) {
      appPlist.CFBundleDocumentTypes = yield _bluebirdLst().default.map(fileAssociations,
      /*#__PURE__*/
      function () {
        var _ref = (0, _bluebirdLst().coroutine)(function* (fileAssociation) {
          const extensions = (0, _builderUtil().asArray)(fileAssociation.ext).map(_platformPackager().normalizeExt);
          const customIcon = yield packager.getResource((0, _builderUtil().getPlatformIconFileName)(fileAssociation.icon, true), `${extensions[0]}.icns`);
          let iconFile = appPlist.CFBundleIconFile;

          if (customIcon != null) {
            iconFile = path.basename(customIcon);
            yield (0, _fs().copyOrLinkFile)(customIcon, path.join(path.join(contentsPath, "Resources"), iconFile));
          }

          const result = {
            CFBundleTypeExtensions: extensions,
            CFBundleTypeName: fileAssociation.name || extensions[0],
            CFBundleTypeRole: fileAssociation.role || "Editor",
            CFBundleTypeIconFile: iconFile
          };

          if (fileAssociation.isPackage) {
            result.LSTypeIsPackage = true;
          }

          return result;
        });

        return function (_x5) {
          return _ref.apply(this, arguments);
        };
      }());
    }

    if (asarIntegrity != null) {
      appPlist.AsarIntegrity = JSON.stringify(asarIntegrity);
    }

    yield Promise.all([(0, _fsExtraP().writeFile)(appPlistFilename, (0, _plist().build)(appPlist)), (0, _fsExtraP().writeFile)(helperPlistFilename, (0, _plist().build)(helperPlist)), helperEHPlist == null ? Promise.resolve() : (0, _fsExtraP().writeFile)(helperEHPlistFilename, (0, _plist().build)(helperEHPlist)), helperNPPlist == null ? Promise.resolve() : (0, _fsExtraP().writeFile)(helperNPPlistFilename, (0, _plist().build)(helperNPPlist)), helperLoginPlist == null ? Promise.resolve() : (0, _fsExtraP().writeFile)(helperLoginPlistFilename, (0, _plist().build)(helperLoginPlist)), doRename(path.join(contentsPath, "MacOS"), packager.electronDistMacOsExecutableName, appPlist.CFBundleExecutable), (0, _fs().unlinkIfExists)(path.join(appOutDir, "LICENSE")), (0, _fs().unlinkIfExists)(path.join(appOutDir, "LICENSES.chromium.html"))]);
    yield moveHelpers(getAvailableHelperSuffixes(helperEHPlist, helperNPPlist), frameworksPath, appFilename, packager.electronDistMacOsExecutableName);

    if (helperLoginPlist != null) {
      const prefix = packager.electronDistMacOsExecutableName;
      const suffix = " Login Helper";
      const executableBasePath = path.join(loginItemPath, `${prefix}${suffix}.app`, "Contents", "MacOS");
      yield doRename(executableBasePath, `${prefix}${suffix}`, appFilename + suffix).then(() => doRename(loginItemPath, `${prefix}${suffix}.app`, `${appFilename}${suffix}.app`));
    }

    const appPath = path.join(appOutDir, `${appFilename}.app`);
    yield (0, _fsExtraP().rename)(path.dirname(contentsPath), appPath); // https://github.com/electron-userland/electron-builder/issues/840

    const now = Date.now() / 1000;
    yield (0, _fsExtraP().utimes)(appPath, now, now);
  });
  return _createMacApp.apply(this, arguments);
}

function configureLocalhostAts(appPlist) {
  // https://bencoding.com/2015/07/20/app-transport-security-and-localhost/
  let ats = appPlist.NSAppTransportSecurity;

  if (ats == null) {
    ats = {};
    appPlist.NSAppTransportSecurity = ats;
  }

  ats.NSAllowsLocalNetworking = true; // https://github.com/electron-userland/electron-builder/issues/3377#issuecomment-446035814

  ats.NSAllowsArbitraryLoads = true;
  let exceptionDomains = ats.NSExceptionDomains;

  if (exceptionDomains == null) {
    exceptionDomains = {};
    ats.NSExceptionDomains = exceptionDomains;
  }

  if (exceptionDomains.localhost == null) {
    const allowHttp = {
      NSTemporaryExceptionAllowsInsecureHTTPSLoads: false,
      NSIncludesSubdomains: false,
      NSTemporaryExceptionAllowsInsecureHTTPLoads: true,
      NSTemporaryExceptionMinimumTLSVersion: "1.0",
      NSTemporaryExceptionRequiresForwardSecrecy: false
    };
    exceptionDomains.localhost = allowHttp;
    exceptionDomains["127.0.0.1"] = allowHttp;
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=electronMac.js.map{"version":3,"sources":["../../src/electron/electronMac.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { asArray, getPlatformIconFileName, InvalidConfigurationError, log } from \"builder-util\"\nimport { copyOrLinkFile, unlinkIfExists } from \"builder-util/out/fs\"\nimport { orIfFileNotExist } from \"builder-util/out/promise\"\nimport { readFile, rename, utimes, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { build as buildPlist, parse as parsePlist } from \"plist\"\nimport { filterCFBundleIdentifier } from \"../appInfo\"\nimport { AsarIntegrity } from \"../asar/integrity\"\nimport MacPackager from \"../macPackager\"\nimport { normalizeExt } from \"../platformPackager\"\n\nfunction doRename(basePath: string, oldName: string, newName: string) {\n  return rename(path.join(basePath, oldName), path.join(basePath, newName))\n}\n\nfunction moveHelpers(helperSuffixes: Array<string>, frameworksPath: string, appName: string, prefix: string): Promise<any> {\n  return BluebirdPromise.map(helperSuffixes, suffix => {\n    const executableBasePath = path.join(frameworksPath, `${prefix}${suffix}.app`, \"Contents\", \"MacOS\")\n    return doRename(executableBasePath, `${prefix}${suffix}`, appName + suffix)\n      .then(() => doRename(frameworksPath, `${prefix}${suffix}.app`, `${appName}${suffix}.app`))\n  })\n}\n\nfunction getAvailableHelperSuffixes(helperEHPlist: string | null, helperNPPlist: string | null) {\n  const result = [\" Helper\"]\n  if (helperEHPlist != null) {\n    result.push(\" Helper EH\")\n  }\n  if (helperNPPlist != null) {\n    result.push(\" Helper NP\")\n  }\n  return result\n}\n\n/** @internal */\nexport async function createMacApp(packager: MacPackager, appOutDir: string, asarIntegrity: AsarIntegrity | null, isMas: boolean) {\n  const appInfo = packager.appInfo\n  const appFilename = appInfo.productFilename\n\n  const contentsPath = path.join(appOutDir, packager.info.framework.distMacOsAppName, \"Contents\")\n  const frameworksPath = path.join(contentsPath, \"Frameworks\")\n  const loginItemPath = path.join(contentsPath, \"Library\", \"LoginItems\")\n\n  const appPlistFilename = path.join(contentsPath, \"Info.plist\")\n  const helperPlistFilename = path.join(frameworksPath, `${packager.electronDistMacOsExecutableName} Helper.app`, \"Contents\", \"Info.plist\")\n  const helperEHPlistFilename = path.join(frameworksPath, `${packager.electronDistMacOsExecutableName} Helper EH.app`, \"Contents\", \"Info.plist\")\n  const helperNPPlistFilename = path.join(frameworksPath, `${packager.electronDistMacOsExecutableName} Helper NP.app`, \"Contents\", \"Info.plist\")\n  const helperLoginPlistFilename = path.join(loginItemPath, `${packager.electronDistMacOsExecutableName} Login Helper.app`, \"Contents\", \"Info.plist\")\n\n  const buildMetadata = packager.config!\n  const fileContents: Array<string | null> = await BluebirdPromise.map([\n    appPlistFilename,\n    helperPlistFilename,\n    helperEHPlistFilename,\n    helperNPPlistFilename,\n    helperLoginPlistFilename,\n    (buildMetadata as any)[\"extend-info\"]\n  ], it => it == null ? it : orIfFileNotExist(readFile(it, \"utf8\"), null))\n  const appPlist = parsePlist(fileContents[0]!!)\n  const helperPlist = parsePlist(fileContents[1]!!)\n  const helperEHPlist = fileContents[2] == null ? null : parsePlist(fileContents[2]!!)\n  const helperNPPlist = fileContents[3] == null ? null : parsePlist(fileContents[3]!!)\n  const helperLoginPlist = fileContents[4] == null ? null : parsePlist(fileContents[4]!!)\n\n  // if an extend-info file was supplied, copy its contents in first\n  if (fileContents[5] != null) {\n    Object.assign(appPlist, parsePlist(fileContents[5]!!))\n  }\n\n  const oldHelperBundleId = (buildMetadata as any)[\"helper-bundle-id\"]\n  if (oldHelperBundleId != null) {\n    log.warn(\"build.helper-bundle-id is deprecated, please set as build.mac.helperBundleId\")\n  }\n  const helperBundleIdentifier = filterCFBundleIdentifier(packager.platformSpecificBuildOptions.helperBundleId || oldHelperBundleId || `${appInfo.macBundleIdentifier}.helper`)\n\n  await packager.applyCommonInfo(appPlist, contentsPath)\n\n  // required for electron-updater proxy\n  if (!isMas) {\n    configureLocalhostAts(appPlist)\n  }\n\n  helperPlist.CFBundleExecutable = `${appFilename} Helper`\n  helperPlist.CFBundleDisplayName = `${appInfo.productName} Helper`\n  helperPlist.CFBundleIdentifier = helperBundleIdentifier\n  helperPlist.CFBundleVersion = appPlist.CFBundleVersion\n\n  function configureHelper(helper: any, postfix: string) {\n    helper.CFBundleExecutable = `${appFilename} Helper ${postfix}`\n    helper.CFBundleDisplayName = `${appInfo.productName} Helper ${postfix}`\n    helper.CFBundleIdentifier = `${helperBundleIdentifier}.${postfix}`\n    helper.CFBundleVersion = appPlist.CFBundleVersion\n  }\n\n  if (helperEHPlist != null) {\n    configureHelper(helperEHPlist, \"EH\")\n  }\n  if (helperNPPlist != null) {\n    configureHelper(helperNPPlist, \"NP\")\n  }\n  if (helperLoginPlist != null) {\n    helperLoginPlist.CFBundleExecutable = `${appFilename} Login Helper`\n    helperLoginPlist.CFBundleDisplayName = `${appInfo.productName} Login Helper`\n    // noinspection SpellCheckingInspection\n    helperLoginPlist.CFBundleIdentifier = `${appInfo.macBundleIdentifier}.loginhelper`\n    helperLoginPlist.CFBundleVersion = appPlist.CFBundleVersion\n  }\n\n  const protocols = asArray(buildMetadata.protocols).concat(asArray(packager.platformSpecificBuildOptions.protocols))\n  if (protocols.length > 0) {\n    appPlist.CFBundleURLTypes = protocols.map(protocol => {\n      const schemes = asArray(protocol.schemes)\n      if (schemes.length === 0) {\n        throw new InvalidConfigurationError(`Protocol \"${protocol.name}\": must be at least one scheme specified`)\n      }\n      return {\n        CFBundleURLName: protocol.name,\n        CFBundleTypeRole: protocol.role || \"Editor\",\n        CFBundleURLSchemes: schemes.slice()\n      }\n    })\n  }\n\n  const fileAssociations = packager.fileAssociations\n  if (fileAssociations.length > 0) {\n    appPlist.CFBundleDocumentTypes = await BluebirdPromise.map(fileAssociations, async fileAssociation => {\n      const extensions = asArray(fileAssociation.ext).map(normalizeExt)\n      const customIcon = await packager.getResource(getPlatformIconFileName(fileAssociation.icon, true), `${extensions[0]}.icns`)\n      let iconFile = appPlist.CFBundleIconFile\n      if (customIcon != null) {\n        iconFile = path.basename(customIcon)\n        await copyOrLinkFile(customIcon, path.join(path.join(contentsPath, \"Resources\"), iconFile))\n      }\n\n      const result = {\n        CFBundleTypeExtensions: extensions,\n        CFBundleTypeName: fileAssociation.name || extensions[0],\n        CFBundleTypeRole: fileAssociation.role || \"Editor\",\n        CFBundleTypeIconFile: iconFile\n      } as any\n\n      if (fileAssociation.isPackage) {\n        result.LSTypeIsPackage = true\n      }\n      return result\n    })\n  }\n\n  if (asarIntegrity != null) {\n    appPlist.AsarIntegrity = JSON.stringify(asarIntegrity)\n  }\n\n  await Promise.all([\n    writeFile(appPlistFilename, buildPlist(appPlist)),\n    writeFile(helperPlistFilename, buildPlist(helperPlist)),\n    helperEHPlist == null ? Promise.resolve() : writeFile(helperEHPlistFilename, buildPlist(helperEHPlist)),\n    helperNPPlist == null ? Promise.resolve() : writeFile(helperNPPlistFilename, buildPlist(helperNPPlist)),\n    helperLoginPlist == null ? Promise.resolve() : writeFile(helperLoginPlistFilename, buildPlist(helperLoginPlist)),\n    doRename(path.join(contentsPath, \"MacOS\"), packager.electronDistMacOsExecutableName, appPlist.CFBundleExecutable),\n    unlinkIfExists(path.join(appOutDir, \"LICENSE\")),\n    unlinkIfExists(path.join(appOutDir, \"LICENSES.chromium.html\")),\n  ])\n\n  await moveHelpers(getAvailableHelperSuffixes(helperEHPlist, helperNPPlist), frameworksPath, appFilename, packager.electronDistMacOsExecutableName)\n\n  if (helperLoginPlist != null) {\n    const prefix = packager.electronDistMacOsExecutableName\n    const suffix = \" Login Helper\"\n    const executableBasePath = path.join(loginItemPath, `${prefix}${suffix}.app`, \"Contents\", \"MacOS\")\n    await doRename(executableBasePath, `${prefix}${suffix}`, appFilename + suffix)\n      .then(() => doRename(loginItemPath, `${prefix}${suffix}.app`, `${appFilename}${suffix}.app`))\n  }\n\n  const appPath = path.join(appOutDir, `${appFilename}.app`)\n  await rename(path.dirname(contentsPath), appPath)\n  // https://github.com/electron-userland/electron-builder/issues/840\n  const now = Date.now() / 1000\n  await utimes(appPath, now, now)\n}\n\nfunction configureLocalhostAts(appPlist: any) {\n  // https://bencoding.com/2015/07/20/app-transport-security-and-localhost/\n  let ats = appPlist.NSAppTransportSecurity\n  if (ats == null) {\n    ats = {}\n    appPlist.NSAppTransportSecurity = ats\n  }\n\n  ats.NSAllowsLocalNetworking = true\n  // https://github.com/electron-userland/electron-builder/issues/3377#issuecomment-446035814\n  ats.NSAllowsArbitraryLoads = true\n\n  let exceptionDomains = ats.NSExceptionDomains\n  if (exceptionDomains == null) {\n    exceptionDomains = {}\n    ats.NSExceptionDomains = exceptionDomains\n  }\n\n  if (exceptionDomains.localhost == null) {\n    const allowHttp = {\n      NSTemporaryExceptionAllowsInsecureHTTPSLoads: false,\n      NSIncludesSubdomains: false,\n      NSTemporaryExceptionAllowsInsecureHTTPLoads: true,\n      NSTemporaryExceptionMinimumTLSVersion: \"1.0\",\n      NSTemporaryExceptionRequiresForwardSecrecy: false\n    }\n    exceptionDomains.localhost = allowHttp\n    exceptionDomains[\"127.0.0.1\"] = allowHttp\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getElectronVersion = getElectronVersion;
exports.getElectronVersionFromInstalled = getElectronVersionFromInstalled;
exports.computeElectronVersion = computeElectronVersion;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _nodeHttpExecutor() {
  const data = require("builder-util/out/nodeHttpExecutor");

  _nodeHttpExecutor = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function semver() {
  const data = _interopRequireWildcard(require("semver"));

  semver = function () {
    return data;
  };

  return data;
}

function _readConfigFile() {
  const data = require("read-config-file");

  _readConfigFile = function () {
    return data;
  };

  return data;
}

function _config() {
  const data = require("../util/config");

  _config = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function getElectronVersion(_x, _x2) {
  return _getElectronVersion.apply(this, arguments);
}

function _getElectronVersion() {
  _getElectronVersion = (0, _bluebirdLst().coroutine)(function* (projectDir, config, projectMetadata = new (_lazyVal().Lazy)(() => (0, _readConfigFile().orNullIfFileNotExist)((0, _fsExtraP().readJson)(path.join(projectDir, "package.json"))))) {
    if (config == null) {
      config = yield (0, _config().getConfig)(projectDir, null, null);
    }

    if (config.electronVersion != null) {
      return config.electronVersion;
    }

    return yield computeElectronVersion(projectDir, projectMetadata);
  });
  return _getElectronVersion.apply(this, arguments);
}

function getElectronVersionFromInstalled(_x3) {
  return _getElectronVersionFromInstalled.apply(this, arguments);
}
/** @internal */


function _getElectronVersionFromInstalled() {
  _getElectronVersionFromInstalled = (0, _bluebirdLst().coroutine)(function* (projectDir) {
    for (const name of ["electron", "electron-prebuilt", "electron-prebuilt-compile"]) {
      try {
        return (yield (0, _fsExtraP().readJson)(path.join(projectDir, "node_modules", name, "package.json"))).version;
      } catch (e) {
        if (e.code !== "ENOENT") {
          _builderUtil().log.warn({
            name,
            error: e
          }, `cannot read electron version package.json`);
        }
      }
    }

    return null;
  });
  return _getElectronVersionFromInstalled.apply(this, arguments);
}

function computeElectronVersion(_x4, _x5) {
  return _computeElectronVersion.apply(this, arguments);
}

function _computeElectronVersion() {
  _computeElectronVersion = (0, _bluebirdLst().coroutine)(function* (projectDir, projectMetadata) {
    const result = yield getElectronVersionFromInstalled(projectDir);

    if (result != null) {
      return result;
    }

    const electronPrebuiltDep = findFromElectronPrebuilt((yield projectMetadata.value));

    if (electronPrebuiltDep == null || electronPrebuiltDep === "latest") {
      try {
        const releaseInfo = JSON.parse((yield _nodeHttpExecutor().httpExecutor.request({
          hostname: "github.com",
          path: "/electron/electron/releases/latest",
          headers: {
            accept: "application/json"
          }
        })));
        return releaseInfo.tag_name.startsWith("v") ? releaseInfo.tag_name.substring(1) : releaseInfo.tag_name;
      } catch (e) {
        _builderUtil().log.warn(e);
      }

      throw new Error(`Cannot find electron dependency to get electron version in the '${path.join(projectDir, "package.json")}'`);
    }

    const version = semver().coerce(electronPrebuiltDep);

    if (version == null) {
      throw new Error("cannot compute electron version");
    }

    return version.toString();
  });
  return _computeElectronVersion.apply(this, arguments);
}

function findFromElectronPrebuilt(packageData) {
  for (const name of ["electron", "electron-prebuilt", "electron-prebuilt-compile"]) {
    const devDependencies = packageData.devDependencies;
    let dep = devDependencies == null ? null : devDependencies[name];

    if (dep == null) {
      const dependencies = packageData.dependencies;
      dep = dependencies == null ? null : dependencies[name];
    }

    if (dep != null) {
      return dep;
    }
  }

  return null;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=electronVersion.js.map{"version":3,"sources":["../../src/electron/electronVersion.ts"],"names":[],"mappings":"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","sourcesContent":["import { log } from \"builder-util\"\nimport { httpExecutor } from \"builder-util/out/nodeHttpExecutor\"\nimport { readJson } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport * as semver from \"semver\"\nimport { orNullIfFileNotExist } from \"read-config-file\"\nimport { Configuration } from \"../configuration\"\nimport { getConfig } from \"../util/config\"\n\nexport type MetadataValue = Lazy<{ [key: string]: any } | null>\n\nexport async function getElectronVersion(projectDir: string, config?: Configuration, projectMetadata: MetadataValue = new Lazy(() => orNullIfFileNotExist(readJson(path.join(projectDir, \"package.json\"))))): Promise<string> {\n  if (config == null) {\n    config = await getConfig(projectDir, null, null)\n  }\n  if (config.electronVersion != null) {\n    return config.electronVersion\n  }\n  return await computeElectronVersion(projectDir, projectMetadata)\n}\n\nexport async function getElectronVersionFromInstalled(projectDir: string) {\n  for (const name of [\"electron\", \"electron-prebuilt\", \"electron-prebuilt-compile\"]) {\n    try {\n      return (await readJson(path.join(projectDir, \"node_modules\", name, \"package.json\"))).version\n    }\n    catch (e) {\n      if (e.code !== \"ENOENT\") {\n        log.warn({name, error: e}, `cannot read electron version package.json`)\n      }\n    }\n  }\n  return null\n}\n\n/** @internal */\nexport async function computeElectronVersion(projectDir: string, projectMetadata: MetadataValue): Promise<string> {\n  const result = await getElectronVersionFromInstalled(projectDir)\n  if (result != null) {\n    return result\n  }\n\n  const electronPrebuiltDep = findFromElectronPrebuilt(await projectMetadata!!.value)\n  if (electronPrebuiltDep == null || electronPrebuiltDep === \"latest\") {\n    try {\n      const releaseInfo = JSON.parse((await httpExecutor.request({\n        hostname: \"github.com\",\n        path: \"/electron/electron/releases/latest\",\n        headers: {\n          accept: \"application/json\",\n        },\n      }))!!)\n      return (releaseInfo.tag_name.startsWith(\"v\")) ? releaseInfo.tag_name.substring(1) : releaseInfo.tag_name\n    }\n    catch (e) {\n      log.warn(e)\n    }\n\n    throw new Error(`Cannot find electron dependency to get electron version in the '${path.join(projectDir, \"package.json\")}'`)\n  }\n\n  const version = semver.coerce(electronPrebuiltDep)\n  if (version == null) {\n    throw new Error(\"cannot compute electron version\")\n  }\n  return version.toString()\n}\n\nfunction findFromElectronPrebuilt(packageData: any): any {\n  for (const name of [\"electron\", \"electron-prebuilt\", \"electron-prebuilt-compile\"]) {\n    const devDependencies = packageData.devDependencies\n    let dep = devDependencies == null ? null : devDependencies[name]\n    if (dep == null) {\n      const dependencies = packageData.dependencies\n      dep = dependencies == null ? null : dependencies[name]\n    }\n    if (dep != null) {\n      return dep\n    }\n  }\n  return null\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.downloadCertificate = downloadCertificate;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _os() {
  const data = require("os");

  _os = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _binDownload() {
  const data = require("../binDownload");

  _binDownload = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/** @private */
function downloadCertificate(_x, _x2, _x3) {
  return _downloadCertificate.apply(this, arguments);
} function _downloadCertificate() {
  _downloadCertificate = (0, _bluebirdLst().coroutine)(function* (urlOrBase64, tmpDir, currentDir) {
    urlOrBase64 = urlOrBase64.trim();
    let file = null;

    if (urlOrBase64.length > 3 && urlOrBase64[1] === ":" || urlOrBase64.startsWith("/") || urlOrBase64.startsWith(".")) {
      file = urlOrBase64;
    } else if (urlOrBase64.startsWith("file://")) {
      file = urlOrBase64.substring("file://".length);
    } else if (urlOrBase64.startsWith("~/")) {
      file = path.join((0, _os().homedir)(), urlOrBase64.substring("~/".length));
    } else {
      const isUrl = urlOrBase64.startsWith("https://");

      if (isUrl || urlOrBase64.length > 2048 || urlOrBase64.endsWith("=")) {
        const tempFile = yield tmpDir.getTempFile({
          suffix: ".p12"
        });

        if (isUrl) {
          yield (0, _binDownload().download)(urlOrBase64, tempFile);
        } else {
          yield (0, _fsExtraP().outputFile)(tempFile, Buffer.from(urlOrBase64, "base64"));
        }

        return tempFile;
      } else {
        file = urlOrBase64;
      }
    }

    file = path.resolve(currentDir, file);
    const stat = yield (0, _fs().statOrNull)(file);

    if (stat == null) {
      throw new (_builderUtil().InvalidConfigurationError)(`${file} doesn't exist`);
    } else if (!stat.isFile()) {
      throw new (_builderUtil().InvalidConfigurationError)(`${file} not a file`);
    } else {
      return file;
    }
  });
  return _downloadCertificate.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=codesign.js.map{"version":3,"sources":["../../src/codeSign/codesign.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEA;SACsB,mB;;;;;;uDAAf,WAAmC,WAAnC,EAAwD,MAAxD,EAAwE,UAAxE,EAA0F;AAC/F,IAAA,WAAW,GAAG,WAAW,CAAC,IAAZ,EAAd;AAEA,QAAI,IAAI,GAAkB,IAA1B;;AACA,QAAK,WAAW,CAAC,MAAZ,GAAqB,CAArB,IAA0B,WAAW,CAAC,CAAD,CAAX,KAAmB,GAA9C,IAAsD,WAAW,CAAC,UAAZ,CAAuB,GAAvB,CAAtD,IAAqF,WAAW,CAAC,UAAZ,CAAuB,GAAvB,CAAzF,EAAsH;AACpH,MAAA,IAAI,GAAG,WAAP;AACD,KAFD,MAGK,IAAI,WAAW,CAAC,UAAZ,CAAuB,SAAvB,CAAJ,EAAuC;AAC1C,MAAA,IAAI,GAAG,WAAW,CAAC,SAAZ,CAAsB,UAAU,MAAhC,CAAP;AACD,KAFI,MAGA,IAAI,WAAW,CAAC,UAAZ,CAAuB,IAAvB,CAAJ,EAAkC;AACrC,MAAA,IAAI,GAAG,IAAI,CAAC,IAAL,CAAU,oBAAV,EAAqB,WAAW,CAAC,SAAZ,CAAsB,KAAK,MAA3B,CAArB,CAAP;AACD,KAFI,MAGA;AACH,YAAM,KAAK,GAAG,WAAW,CAAC,UAAZ,CAAuB,UAAvB,CAAd;;AACA,UAAI,KAAK,IAAI,WAAW,CAAC,MAAZ,GAAqB,IAA9B,IAAsC,WAAW,CAAC,QAAZ,CAAqB,GAArB,CAA1C,EAAqE;AACnE,cAAM,QAAQ,SAAS,MAAM,CAAC,WAAP,CAAmB;AAAC,UAAA,MAAM,EAAE;AAAT,SAAnB,CAAvB;;AACA,YAAI,KAAJ,EAAW;AACT,gBAAM,6BAAS,WAAT,EAAsB,QAAtB,CAAN;AACD,SAFD,MAGK;AACH,gBAAM,4BAAW,QAAX,EAAqB,MAAM,CAAC,IAAP,CAAY,WAAZ,EAAyB,QAAzB,CAArB,CAAN;AACD;;AACD,eAAO,QAAP;AACD,OATD,MAUK;AACH,QAAA,IAAI,GAAG,WAAP;AACD;AACF;;AAED,IAAA,IAAI,GAAG,IAAI,CAAC,OAAL,CAAa,UAAb,EAAyB,IAAzB,CAAP;AACA,UAAM,IAAI,SAAS,sBAAW,IAAX,CAAnB;;AACA,QAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB,YAAM,KAAI,wCAAJ,EAA8B,GAAG,IAAI,gBAArC,CAAN;AACD,KAFD,MAGK,IAAI,CAAC,IAAI,CAAC,MAAL,EAAL,EAAoB;AACvB,YAAM,KAAI,wCAAJ,EAA8B,GAAG,IAAI,aAArC,CAAN;AACD,KAFI,MAGA;AACH,aAAO,IAAP;AACD;AACF,G","sourcesContent":["import { outputFile } from \"fs-extra-p\"\nimport { homedir } from \"os\"\nimport * as path from \"path\"\nimport { TmpDir } from \"temp-file\"\nimport { InvalidConfigurationError } from \"builder-util\"\nimport { statOrNull } from \"builder-util/out/fs\"\nimport { download } from \"../binDownload\"\n\n/** @private */\nexport async function downloadCertificate(urlOrBase64: string, tmpDir: TmpDir, currentDir: string): Promise<string> {\n  urlOrBase64 = urlOrBase64.trim()\n\n  let file: string | null = null\n  if ((urlOrBase64.length > 3 && urlOrBase64[1] === \":\") || urlOrBase64.startsWith(\"/\") || urlOrBase64.startsWith(\".\")) {\n    file = urlOrBase64\n  }\n  else if (urlOrBase64.startsWith(\"file://\")) {\n    file = urlOrBase64.substring(\"file://\".length)\n  }\n  else if (urlOrBase64.startsWith(\"~/\")) {\n    file = path.join(homedir(), urlOrBase64.substring(\"~/\".length))\n  }\n  else {\n    const isUrl = urlOrBase64.startsWith(\"https://\")\n    if (isUrl || urlOrBase64.length > 2048 || urlOrBase64.endsWith(\"=\")) {\n      const tempFile = await tmpDir.getTempFile({suffix: \".p12\"})\n      if (isUrl) {\n        await download(urlOrBase64, tempFile)\n      }\n      else {\n        await outputFile(tempFile, Buffer.from(urlOrBase64, \"base64\"))\n      }\n      return tempFile\n    }\n    else {\n      file = urlOrBase64\n    }\n  }\n\n  file = path.resolve(currentDir, file)\n  const stat = await statOrNull(file)\n  if (stat == null) {\n    throw new InvalidConfigurationError(`${file} doesn't exist`)\n  }\n  else if (!stat.isFile()) {\n    throw new InvalidConfigurationError(`${file} not a file`)\n  }\n  else {\n    return file\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isSignAllowed = isSignAllowed;
exports.reportError = reportError;
exports.createKeychain = createKeychain;
exports.sign = sign;
exports.findIdentity = findIdentity;
exports.findIdentityRawResult = exports.appleCertificatePrefixes = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _util() {
  const data = require("builder-util/out/util");

  _util = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _log() {
  const data = require("builder-util/out/log");

  _log = function () {
    return data;
  };

  return data;
}

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

function _os() {
  const data = require("os");

  _os = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _tempFile() {
  const data = require("temp-file");

  _tempFile = function () {
    return data;
  };

  return data;
}

function _flags() {
  const data = require("../util/flags");

  _flags = function () {
    return data;
  };

  return data;
}

function _macosVersion() {
  const data = require("../util/macosVersion");

  _macosVersion = function () {
    return data;
  };

  return data;
}

function _codesign() {
  const data = require("./codesign");

  _codesign = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const appleCertificatePrefixes = ["Developer ID Application:", "Developer ID Installer:", "3rd Party Mac Developer Application:", "3rd Party Mac Developer Installer:"];
exports.appleCertificatePrefixes = appleCertificatePrefixes;

function isSignAllowed(isPrintWarn = true) {
  if (process.platform !== "darwin") {
    if (isPrintWarn) {
      _util().log.warn({
        reason: "supported only on macOS"
      }, "skipped macOS application code signing");
    }

    return false;
  }

  const buildForPrWarning = "There are serious security concerns with CSC_FOR_PULL_REQUEST=true (see the  CircleCI documentation (https://circleci.com/docs/1.0/fork-pr-builds/) for details)" + "\nIf you have SSH keys, sensitive env vars or AWS credentials stored in your project settings and untrusted forks can make pull requests against your repo, then this option isn't for you.";

  if ((0, _util().isPullRequest)()) {
    if ((0, _util().isEnvTrue)(process.env.CSC_FOR_PULL_REQUEST)) {
      if (isPrintWarn) {
        _util().log.warn(buildForPrWarning);
      }
    } else {
      if (isPrintWarn) {
        // https://github.com/electron-userland/electron-builder/issues/1524
        _util().log.warn("Current build is a part of pull request, code signing will be skipped." + "\nSet env CSC_FOR_PULL_REQUEST to true to force code signing." + `\n${buildForPrWarning}`);
      }

      return false;
    }
  }

  return true;
}

function reportError(_x, _x2, _x3, _x4, _x5) {
  return _reportError.apply(this, arguments);
} // "Note that filename will not be searched to resolve the signing identity's certificate chain unless it is also on the user's keychain search list."
// but "security list-keychains" doesn't support add - we should 1) get current list 2) set new list - it is very bad http://stackoverflow.com/questions/10538942/add-a-keychain-to-search-list
// "overly complicated and introduces a race condition."
// https://github.com/electron-userland/electron-builder/issues/398


function _reportError() {
  _reportError = (0, _bluebirdLst().coroutine)(function* (isMas, certificateType, qualifier, keychainName, isForceCodeSigning) {
    const logFields = {};

    if (qualifier == null) {
      logFields.reason = "";

      if ((0, _flags().isAutoDiscoveryCodeSignIdentity)()) {
        logFields.reason += `cannot find valid "${certificateType}" identity${isMas ? "" : ` or custom non-Apple code signing certificate`}`;
      }

      logFields.reason += ", see https://electron.build/code-signing";

      if (!(0, _flags().isAutoDiscoveryCodeSignIdentity)()) {
        logFields.CSC_IDENTITY_AUTO_DISCOVERY = false;
      }
    } else {
      logFields.reason = "Identity name is specified, but no valid identity with this name in the keychain";
      logFields.identity = qualifier;
    }

    const args = ["find-identity"];

    if (keychainName != null) {
      args.push(keychainName);
    }

    if (qualifier != null || (0, _flags().isAutoDiscoveryCodeSignIdentity)()) {
      logFields.allIdentities = (yield (0, _util().exec)("security", args)).trim().split("\n").filter(it => !(it.includes("Policy: X.509 Basic") || it.includes("Matching identities"))).join("\n");
    }

    if (isMas || isForceCodeSigning) {
      throw new Error(_log().Logger.createMessage("skipped macOS application code signing", logFields, "error", it => it));
    } else {
      _util().log.warn(logFields, "skipped macOS application code signing");
    }
  });
  return _reportError.apply(this, arguments);
}

const bundledCertKeychainAdded = new (_lazyVal().Lazy)(
/*#__PURE__*/
(0, _bluebirdLst().coroutine)(function* () {
  // copy to temp and then atomic rename to final path
  const cacheDir = getCacheDirectory();
  const tmpKeychainPath = path.join(cacheDir, (0, _tempFile().getTempName)("electron-builder-root-certs"));
  const keychainPath = path.join(cacheDir, "electron-builder-root-certs.keychain");
  const results = yield Promise.all([listUserKeychains(), (0, _fs().copyFile)(path.join(__dirname, "..", "..", "certs", "root_certs.keychain"), tmpKeychainPath).then(() => (0, _fsExtraP().rename)(tmpKeychainPath, keychainPath))]);
  const list = results[0];

  if (!list.includes(keychainPath)) {
    yield (0, _util().exec)("security", ["list-keychains", "-d", "user", "-s", keychainPath].concat(list));
  }
}));

function getCacheDirectory() {
  const env = process.env.ELECTRON_BUILDER_CACHE;
  return (0, _util().isEmptyOrSpaces)(env) ? path.join((0, _os().homedir)(), "Library", "Caches", "electron-builder") : path.resolve(env);
}

function listUserKeychains() {
  return (0, _util().exec)("security", ["list-keychains", "-d", "user"]).then(it => it.split("\n").map(it => {
    const r = it.trim();
    return r.substring(1, r.length - 1);
  }).filter(it => it.length > 0));
}

function removeKeychain(_x6) {
  return _removeKeychain.apply(this, arguments);
}

function _removeKeychain() {
  _removeKeychain = (0, _bluebirdLst().coroutine)(function* (keychainFile) {
    try {
      yield (0, _util().exec)("security", ["delete-keychain", keychainFile]);
    } catch (e) {
      console.warn(`Cannot delete keychain ${keychainFile}: ${e.stack || e}`);
      yield (0, _fs().unlinkIfExists)(keychainFile);
    }
  });
  return _removeKeychain.apply(this, arguments);
}

function createKeychain(_x7) {
  return _createKeychain.apply(this, arguments);
}

function _createKeychain() {
  _createKeychain = (0, _bluebirdLst().coroutine)(function* ({
    tmpDir,
    cscLink,
    cscKeyPassword,
    cscILink,
    cscIKeyPassword,
    currentDir
  }) {
    // travis has correct AppleWWDRCA cert
    if (process.env.TRAVIS !== "true") {
      yield bundledCertKeychainAdded.value;
    }

    const keychainFile = yield tmpDir.getTempFile({
      suffix: ".keychain",
      disposer: removeKeychain
    });
    const certLinks = [cscLink];

    if (cscILink != null) {
      certLinks.push(cscILink);
    }

    const certPaths = new Array(certLinks.length);
    const keychainPassword = (0, _crypto().randomBytes)(8).toString("base64");
    const securityCommands = [["create-keychain", "-p", keychainPassword, keychainFile], ["unlock-keychain", "-p", keychainPassword, keychainFile], ["set-keychain-settings", keychainFile]]; // https://stackoverflow.com/questions/42484678/codesign-keychain-gets-ignored
    // https://github.com/electron-userland/electron-builder/issues/1457

    const list = yield listUserKeychains();

    if (!list.includes(keychainFile)) {
      securityCommands.push(["list-keychains", "-d", "user", "-s", keychainFile].concat(list));
    }

    yield Promise.all([// we do not clear downloaded files - will be removed on tmpDir cleanup automatically. not a security issue since in any case data is available as env variables and protected by password.
    _bluebirdLst().default.map(certLinks, (link, i) => (0, _codesign().downloadCertificate)(link, tmpDir, currentDir).then(it => certPaths[i] = it)), _bluebirdLst().default.mapSeries(securityCommands, it => (0, _util().exec)("security", it))]);
    return yield importCerts(keychainFile, certPaths, [cscKeyPassword, cscIKeyPassword].filter(it => it != null));
  });
  return _createKeychain.apply(this, arguments);
}

function importCerts(_x8, _x9, _x10) {
  return _importCerts.apply(this, arguments);
}
/** @private */


function _importCerts() {
  _importCerts = (0, _bluebirdLst().coroutine)(function* (keychainName, paths, keyPasswords) {
    for (let i = 0; i < paths.length; i++) {
      const password = keyPasswords[i];
      yield (0, _util().exec)("security", ["import", paths[i], "-k", keychainName, "-T", "/usr/bin/codesign", "-T", "/usr/bin/productbuild", "-P", password]); // https://stackoverflow.com/questions/39868578/security-codesign-in-sierra-keychain-ignores-access-control-settings-and-ui-p
      // https://github.com/electron-userland/electron-packager/issues/701#issuecomment-322315996

      if (yield (0, _macosVersion().isMacOsSierra)()) {
        yield (0, _util().exec)("security", ["set-key-partition-list", "-S", "apple-tool:,apple:", "-s", "-k", password, keychainName]);
      }
    }

    return {
      keychainName
    };
  });
  return _importCerts.apply(this, arguments);
}

function sign(path, name, keychain) {
  const args = ["--deep", "--force", "--sign", name, path];

  if (keychain != null) {
    args.push("--keychain", keychain);
  }

  return (0, _util().exec)("codesign", args);
}

let findIdentityRawResult = null;
exports.findIdentityRawResult = findIdentityRawResult;

function getValidIdentities(_x11) {
  return _getValidIdentities.apply(this, arguments);
}

function _getValidIdentities() {
  _getValidIdentities = (0, _bluebirdLst().coroutine)(function* (keychain) {
    function addKeychain(args) {
      if (keychain != null) {
        args.push(keychain);
      }

      return args;
    }

    let result = findIdentityRawResult;

    if (result == null || keychain != null) {
      // https://github.com/electron-userland/electron-builder/issues/481
      // https://github.com/electron-userland/electron-builder/issues/535
      result = Promise.all([(0, _util().exec)("security", addKeychain(["find-identity", "-v"])).then(it => it.trim().split("\n").filter(it => {
        for (const prefix of appleCertificatePrefixes) {
          if (it.includes(prefix)) {
            return true;
          }
        }

        return false;
      })), (0, _util().exec)("security", addKeychain(["find-identity", "-v", "-p", "codesigning"])).then(it => it.trim().split("\n"))]).then(it => {
        const array = it[0].concat(it[1]).filter(it => !it.includes("(Missing required extension)") && !it.includes("valid identities found") && !it.includes("iPhone ") && !it.includes("com.apple.idms.appleid.prd.")) // remove 1)
        .map(it => it.substring(it.indexOf(")") + 1).trim());
        return Array.from(new Set(array));
      });

      if (keychain == null) {
        exports.findIdentityRawResult = findIdentityRawResult = result;
      }
    }

    return result;
  });
  return _getValidIdentities.apply(this, arguments);
}

function _findIdentity(_x12, _x13, _x14) {
  return _findIdentity2.apply(this, arguments);
}

function _findIdentity2() {
  _findIdentity2 = (0, _bluebirdLst().coroutine)(function* (type, qualifier, keychain) {
    // https://github.com/electron-userland/electron-builder/issues/484
    //noinspection SpellCheckingInspection
    const lines = yield getValidIdentities(keychain);
    const namePrefix = `${type}:`;

    for (const line of lines) {
      if (qualifier != null && !line.includes(qualifier)) {
        continue;
      }

      if (line.includes(namePrefix)) {
        return parseIdentity(line);
      }
    }

    if (type === "Developer ID Application") {
      // find non-Apple certificate
      // https://github.com/electron-userland/electron-builder/issues/458
      l: for (const line of lines) {
        if (qualifier != null && !line.includes(qualifier)) {
          continue;
        }

        if (line.includes("Mac Developer:")) {
          continue;
        }

        for (const prefix of appleCertificatePrefixes) {
          if (line.includes(prefix)) {
            continue l;
          }
        }

        return parseIdentity(line);
      }
    }

    return null;
  });
  return _findIdentity2.apply(this, arguments);
}

const _Identity = require("electron-osx-sign/util-identities").Identity;

function parseIdentity(line) {
  const firstQuoteIndex = line.indexOf('"');
  const name = line.substring(firstQuoteIndex + 1, line.lastIndexOf('"'));
  const hash = line.substring(0, firstQuoteIndex - 1);
  return new _Identity(name, hash);
}

function findIdentity(certType, qualifier, keychain) {
  let identity = qualifier || process.env.CSC_NAME;

  if ((0, _util().isEmptyOrSpaces)(identity)) {
    if ((0, _flags().isAutoDiscoveryCodeSignIdentity)()) {
      return _findIdentity(certType, null, keychain);
    } else {
      return Promise.resolve(null);
    }
  } else {
    identity = identity.trim();

    for (const prefix of appleCertificatePrefixes) {
      checkPrefix(identity, prefix);
    }

    return _findIdentity(certType, identity, keychain);
  }
}

function checkPrefix(name, prefix) {
  if (name.startsWith(prefix)) {
    throw new (_util().InvalidConfigurationError)(`Please remove prefix "${prefix}" from the specified name â€” appropriate certificate will be chosen automatically`);
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=macCodeSign.js.map{"version":3,"sources":["../../src/codeSign/macCodeSign.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { exec, InvalidConfigurationError, isEmptyOrSpaces, isEnvTrue, isPullRequest, log, TmpDir } from \"builder-util/out/util\"\nimport { copyFile, unlinkIfExists } from \"builder-util/out/fs\"\nimport { Fields, Logger } from \"builder-util/out/log\"\nimport { randomBytes } from \"crypto\"\nimport { rename } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport { homedir } from \"os\"\nimport * as path from \"path\"\nimport { getTempName } from \"temp-file\"\nimport { isAutoDiscoveryCodeSignIdentity } from \"../util/flags\"\nimport { isMacOsSierra } from \"../util/macosVersion\"\nimport { downloadCertificate } from \"./codesign\"\n\nexport const appleCertificatePrefixes = [\"Developer ID Application:\", \"Developer ID Installer:\", \"3rd Party Mac Developer Application:\", \"3rd Party Mac Developer Installer:\"]\n\nexport type CertType = \"Developer ID Application\" | \"Developer ID Installer\" | \"3rd Party Mac Developer Application\" | \"3rd Party Mac Developer Installer\" | \"Mac Developer\"\n\nexport interface CodeSigningInfo {\n  keychainName?: string | null\n}\n\nexport function isSignAllowed(isPrintWarn = true): boolean {\n  if (process.platform !== \"darwin\") {\n    if (isPrintWarn) {\n      log.warn({reason: \"supported only on macOS\"}, \"skipped macOS application code signing\")\n    }\n    return false\n  }\n\n  const buildForPrWarning = \"There are serious security concerns with CSC_FOR_PULL_REQUEST=true (see the  CircleCI documentation (https://circleci.com/docs/1.0/fork-pr-builds/) for details)\" +\n    \"\\nIf you have SSH keys, sensitive env vars or AWS credentials stored in your project settings and untrusted forks can make pull requests against your repo, then this option isn't for you.\"\n\n  if (isPullRequest()) {\n    if (isEnvTrue(process.env.CSC_FOR_PULL_REQUEST)) {\n      if (isPrintWarn) {\n        log.warn(buildForPrWarning)\n      }\n    }\n    else {\n      if (isPrintWarn) {\n        // https://github.com/electron-userland/electron-builder/issues/1524\n        log.warn(\"Current build is a part of pull request, code signing will be skipped.\" +\n          \"\\nSet env CSC_FOR_PULL_REQUEST to true to force code signing.\" +\n          `\\n${buildForPrWarning}`)\n      }\n      return false\n    }\n  }\n  return true\n}\n\nexport async function reportError(isMas: boolean, certificateType: CertType, qualifier: string | null | undefined, keychainName: string | null | undefined, isForceCodeSigning: boolean) {\n  const logFields: Fields = {}\n  if (qualifier == null) {\n    logFields.reason = \"\"\n    if (isAutoDiscoveryCodeSignIdentity()) {\n      logFields.reason += `cannot find valid \"${certificateType}\" identity${(isMas ? \"\" : ` or custom non-Apple code signing certificate`)}`\n    }\n    logFields.reason += \", see https://electron.build/code-signing\"\n    if (!isAutoDiscoveryCodeSignIdentity()) {\n      logFields.CSC_IDENTITY_AUTO_DISCOVERY = false\n    }\n  }\n  else {\n    logFields.reason = \"Identity name is specified, but no valid identity with this name in the keychain\"\n    logFields.identity = qualifier\n  }\n\n  const args = [\"find-identity\"]\n  if (keychainName != null) {\n    args.push(keychainName)\n  }\n\n  if (qualifier != null || isAutoDiscoveryCodeSignIdentity()) {\n    logFields.allIdentities = (await exec(\"security\", args))\n      .trim()\n      .split(\"\\n\")\n      .filter(it => !(it.includes(\"Policy: X.509 Basic\") || it.includes(\"Matching identities\")))\n      .join(\"\\n\")\n  }\n\n  if (isMas || isForceCodeSigning) {\n    throw new Error(Logger.createMessage(\"skipped macOS application code signing\", logFields, \"error\", it => it))\n  }\n  else {\n    log.warn(logFields, \"skipped macOS application code signing\")\n  }\n}\n\n// \"Note that filename will not be searched to resolve the signing identity's certificate chain unless it is also on the user's keychain search list.\"\n// but \"security list-keychains\" doesn't support add - we should 1) get current list 2) set new list - it is very bad http://stackoverflow.com/questions/10538942/add-a-keychain-to-search-list\n// \"overly complicated and introduces a race condition.\"\n// https://github.com/electron-userland/electron-builder/issues/398\nconst bundledCertKeychainAdded = new Lazy<void>(async () => {\n  // copy to temp and then atomic rename to final path\n  const cacheDir = getCacheDirectory()\n  const tmpKeychainPath = path.join(cacheDir, getTempName(\"electron-builder-root-certs\"))\n  const keychainPath = path.join(cacheDir, \"electron-builder-root-certs.keychain\")\n  const results = await Promise.all<any>([\n    listUserKeychains(),\n    copyFile(path.join(__dirname, \"..\", \"..\", \"certs\", \"root_certs.keychain\"), tmpKeychainPath)\n      .then(() => rename(tmpKeychainPath, keychainPath)),\n  ])\n  const list = results[0]\n  if (!list.includes(keychainPath)) {\n    await exec(\"security\", [\"list-keychains\", \"-d\", \"user\", \"-s\", keychainPath].concat(list))\n  }\n})\n\nfunction getCacheDirectory(): string {\n  const env = process.env.ELECTRON_BUILDER_CACHE\n  return isEmptyOrSpaces(env) ? path.join(homedir(), \"Library\", \"Caches\", \"electron-builder\") : path.resolve(env!!)\n}\n\nfunction listUserKeychains(): Promise<Array<string>> {\n  return exec(\"security\", [\"list-keychains\", \"-d\", \"user\"])\n    .then(it => it\n      .split(\"\\n\")\n      .map(it => {\n        const r = it.trim()\n        return r.substring(1, r.length - 1)\n      })\n      .filter(it => it.length > 0))\n}\n\nexport interface CreateKeychainOptions {\n  tmpDir: TmpDir\n  cscLink: string\n  cscKeyPassword: string\n  cscILink?: string | null\n  cscIKeyPassword?: string | null\n  currentDir: string\n}\n\nasync function removeKeychain(keychainFile: string) {\n  try {\n    await exec(\"security\", [\"delete-keychain\", keychainFile])\n  }\n  catch (e) {\n    console.warn(`Cannot delete keychain ${keychainFile}: ${e.stack || e}`)\n    await unlinkIfExists(keychainFile)\n  }\n}\n\nexport async function createKeychain({tmpDir, cscLink, cscKeyPassword, cscILink, cscIKeyPassword, currentDir}: CreateKeychainOptions): Promise<CodeSigningInfo> {\n  // travis has correct AppleWWDRCA cert\n  if (process.env.TRAVIS !== \"true\") {\n    await bundledCertKeychainAdded.value\n  }\n\n  const keychainFile = await tmpDir.getTempFile({suffix: \".keychain\", disposer: removeKeychain})\n\n  const certLinks = [cscLink]\n  if (cscILink != null) {\n    certLinks.push(cscILink)\n  }\n\n  const certPaths = new Array(certLinks.length)\n  const keychainPassword = randomBytes(8).toString(\"base64\")\n  const securityCommands = [\n    [\"create-keychain\", \"-p\", keychainPassword, keychainFile],\n    [\"unlock-keychain\", \"-p\", keychainPassword, keychainFile],\n    [\"set-keychain-settings\", keychainFile]\n  ]\n\n  // https://stackoverflow.com/questions/42484678/codesign-keychain-gets-ignored\n  // https://github.com/electron-userland/electron-builder/issues/1457\n  const list = await listUserKeychains()\n  if (!list.includes(keychainFile)) {\n    securityCommands.push([\"list-keychains\", \"-d\", \"user\", \"-s\", keychainFile].concat(list))\n  }\n\n  await Promise.all([\n    // we do not clear downloaded files - will be removed on tmpDir cleanup automatically. not a security issue since in any case data is available as env variables and protected by password.\n    BluebirdPromise.map(certLinks, (link, i) => downloadCertificate(link, tmpDir, currentDir).then(it => certPaths[i] = it)),\n    BluebirdPromise.mapSeries(securityCommands, it => exec(\"security\", it))\n  ])\n  return await importCerts(keychainFile, certPaths, [cscKeyPassword, cscIKeyPassword].filter(it => it != null) as Array<string>)\n}\n\nasync function importCerts(keychainName: string, paths: Array<string>, keyPasswords: Array<string>): Promise<CodeSigningInfo> {\n  for (let i = 0; i < paths.length; i++) {\n    const password = keyPasswords[i]\n    await exec(\"security\", [\"import\", paths[i], \"-k\", keychainName, \"-T\", \"/usr/bin/codesign\", \"-T\", \"/usr/bin/productbuild\", \"-P\", password])\n\n    // https://stackoverflow.com/questions/39868578/security-codesign-in-sierra-keychain-ignores-access-control-settings-and-ui-p\n    // https://github.com/electron-userland/electron-packager/issues/701#issuecomment-322315996\n    if (await isMacOsSierra()) {\n      await exec(\"security\", [\"set-key-partition-list\", \"-S\", \"apple-tool:,apple:\", \"-s\", \"-k\", password, keychainName])\n    }\n  }\n\n  return {\n    keychainName,\n  }\n}\n\n/** @private */\nexport function sign(path: string, name: string, keychain: string): Promise<any> {\n  const args = [\"--deep\", \"--force\", \"--sign\", name, path]\n  if (keychain != null) {\n    args.push(\"--keychain\", keychain)\n  }\n  return exec(\"codesign\", args)\n}\n\nexport let findIdentityRawResult: Promise<Array<string>> | null = null\n\nasync function getValidIdentities(keychain?: string | null): Promise<Array<string>> {\n  function addKeychain(args: Array<string>) {\n    if (keychain != null) {\n      args.push(keychain)\n    }\n    return args\n  }\n\n  let result = findIdentityRawResult\n  if (result == null || keychain != null) {\n    // https://github.com/electron-userland/electron-builder/issues/481\n    // https://github.com/electron-userland/electron-builder/issues/535\n    result = Promise.all<Array<string>>([\n      exec(\"security\", addKeychain([\"find-identity\", \"-v\"]))\n        .then(it => it.trim().split(\"\\n\").filter(it => {\n          for (const prefix of appleCertificatePrefixes) {\n            if (it.includes(prefix)) {\n              return true\n            }\n          }\n          return false\n        })),\n      exec(\"security\", addKeychain([\"find-identity\", \"-v\", \"-p\", \"codesigning\"]))\n        .then(it => it.trim().split((\"\\n\"))),\n    ])\n      .then(it => {\n        const array = it[0].concat(it[1])\n          .filter(it => !it.includes(\"(Missing required extension)\") && !it.includes(\"valid identities found\") && !it.includes(\"iPhone \") && !it.includes(\"com.apple.idms.appleid.prd.\"))\n          // remove 1)\n          .map(it => it.substring(it.indexOf(\")\") + 1).trim())\n        return Array.from(new Set(array))\n      })\n\n    if (keychain == null) {\n      findIdentityRawResult = result\n    }\n  }\n  return result\n}\n\nasync function _findIdentity(type: CertType, qualifier?: string | null, keychain?: string | null): Promise<Identity | null> {\n  // https://github.com/electron-userland/electron-builder/issues/484\n  //noinspection SpellCheckingInspection\n  const lines = await getValidIdentities(keychain)\n  const namePrefix = `${type}:`\n  for (const line of lines) {\n    if (qualifier != null && !line.includes(qualifier)) {\n      continue\n    }\n\n    if (line.includes(namePrefix)) {\n      return parseIdentity(line)\n    }\n  }\n\n  if (type === \"Developer ID Application\") {\n    // find non-Apple certificate\n    // https://github.com/electron-userland/electron-builder/issues/458\n    l: for (const line of lines) {\n      if (qualifier != null && !line.includes(qualifier)) {\n        continue\n      }\n\n      if (line.includes(\"Mac Developer:\")) {\n        continue\n      }\n\n      for (const prefix of appleCertificatePrefixes) {\n        if (line.includes(prefix)) {\n          continue l\n        }\n      }\n\n      return parseIdentity(line)\n    }\n  }\n  return null\n}\n\nexport declare class Identity {\n  readonly name: string\n  readonly hash: string\n\n  constructor(name: string, hash: string)\n}\n\nconst _Identity = require(\"electron-osx-sign/util-identities\").Identity\n\nfunction parseIdentity(line: string): Identity {\n  const firstQuoteIndex = line.indexOf('\"')\n  const name = line.substring(firstQuoteIndex + 1, line.lastIndexOf('\"'))\n  const hash = line.substring(0, firstQuoteIndex - 1)\n  return new _Identity(name, hash)\n}\n\nexport function findIdentity(certType: CertType, qualifier?: string | null, keychain?: string | null): Promise<Identity | null> {\n  let identity = qualifier || process.env.CSC_NAME\n  if (isEmptyOrSpaces(identity)) {\n    if (isAutoDiscoveryCodeSignIdentity()) {\n      return _findIdentity(certType, null, keychain)\n    }\n    else {\n      return Promise.resolve(null)\n    }\n  }\n  else {\n    identity = identity!.trim()\n    for (const prefix of appleCertificatePrefixes) {\n      checkPrefix(identity, prefix)\n    }\n    return _findIdentity(certType, identity, keychain)\n  }\n}\n\nfunction checkPrefix(name: string, prefix: string) {\n  if (name.startsWith(prefix)) {\n    throw new InvalidConfigurationError(`Please remove prefix \"${prefix}\" from the specified name â€” appropriate certificate will be chosen automatically`)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getSignVendorPath = getSignVendorPath;
exports.sign = sign;
exports.getCertInfo = getCertInfo;
exports.getCertificateFromStoreInfo = getCertificateFromStoreInfo;
exports.isOldWin6 = isOldWin6;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _util() {
  const data = require("builder-util/out/util");

  _util = function () {
    return data;
  };

  return data;
}

function _binDownload() {
  const data = require("../binDownload");

  _binDownload = function () {
    return data;
  };

  return data;
}

function _appBuilder() {
  const data = require("../util/appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _bundledTool() {
  const data = require("../util/bundledTool");

  _bundledTool = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function os() {
  const data = _interopRequireWildcard(require("os"));

  os = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _platformPackager() {
  const data = require("../platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _flags() {
  const data = require("../util/flags");

  _flags = function () {
    return data;
  };

  return data;
}

function _vm() {
  const data = require("../vm/vm");

  _vm = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function getSignVendorPath() {
  return (0, _binDownload().getBin)("winCodeSign");
}

function sign(_x, _x2) {
  return _sign.apply(this, arguments);
}

function _sign() {
  _sign = (0, _bluebirdLst().coroutine)(function* (options, packager) {
    let hashes = options.options.signingHashAlgorithms; // msi does not support dual-signing

    if (options.path.endsWith(".msi")) {
      hashes = [hashes != null && !hashes.includes("sha1") ? "sha256" : "sha1"];
    } else if (options.path.endsWith(".appx")) {
      hashes = ["sha256"];
    } else if (hashes == null) {
      hashes = ["sha1", "sha256"];
    } else {
      hashes = Array.isArray(hashes) ? hashes : [hashes];
    }

    function defaultExecutor(configuration) {
      return doSign(configuration, packager);
    }

    const executor = (0, _platformPackager().resolveFunction)(options.options.sign, "sign") || defaultExecutor;
    let isNest = false;

    for (const hash of hashes) {
      const taskConfiguration = Object.assign({}, options, {
        hash,
        isNest
      });
      yield executor(Object.assign({}, taskConfiguration, {
        computeSignToolArgs: isWin => computeSignToolArgs(taskConfiguration, isWin)
      }));
      isNest = true;

      if (taskConfiguration.resultOutputPath != null) {
        yield (0, _fsExtraP().rename)(taskConfiguration.resultOutputPath, options.path);
      }
    }
  });
  return _sign.apply(this, arguments);
}

function getCertInfo(_x3, _x4) {
  return _getCertInfo.apply(this, arguments);
}

function _getCertInfo() {
  _getCertInfo = (0, _bluebirdLst().coroutine)(function* (file, password) {
    let result = null;

    try {
      result = yield (0, _appBuilder().executeAppBuilderAsJson)(["certificate-info", "--input", file, "--password", password]);
    } catch (e) {
      throw new Error(`Cannot extract publisher name from code signing certificate, please file issue. As workaround, set win.publisherName: ${e.stack || e}`);
    }

    if (result.error != null) {
      // noinspection ExceptionCaughtLocallyJS
      throw new (_util().InvalidConfigurationError)(`Cannot extract publisher name from code signing certificate: ${result.error}`);
    }

    return result;
  });
  return _getCertInfo.apply(this, arguments);
}

function getCertificateFromStoreInfo(_x5, _x6) {
  return _getCertificateFromStoreInfo.apply(this, arguments);
}

function _getCertificateFromStoreInfo() {
  _getCertificateFromStoreInfo = (0, _bluebirdLst().coroutine)(function* (options, vm) {
    const certificateSubjectName = options.certificateSubjectName;
    const certificateSha1 = options.certificateSha1; // ExcludeProperty doesn't work, so, we cannot exclude RawData, it is ok
    // powershell can return object if the only item

    const rawResult = yield vm.exec("powershell.exe", ["Get-ChildItem -Recurse Cert: -CodeSigningCert | Select-Object -Property Subject,PSParentPath,Thumbprint | ConvertTo-Json -Compress"]);
    const certList = rawResult.length === 0 ? [] : (0, _util().asArray)(JSON.parse(rawResult));

    for (const certInfo of certList) {
      if (certificateSubjectName != null) {
        if (!certInfo.Subject.includes(certificateSubjectName)) {
          continue;
        }
      } else if (certInfo.Thumbprint !== certificateSha1) {
        continue;
      }

      const parentPath = certInfo.PSParentPath;
      const store = parentPath.substring(parentPath.lastIndexOf("\\") + 1);

      _util().log.debug({
        store,
        PSParentPath: parentPath
      }, "auto-detect certificate store"); // https://github.com/electron-userland/electron-builder/issues/1717


      const isLocalMachineStore = parentPath.includes("Certificate::LocalMachine");

      _util().log.debug(null, "auto-detect using of LocalMachine store");

      return {
        thumbprint: certInfo.Thumbprint,
        subject: certInfo.Subject,
        store,
        isLocalMachineStore
      };
    }

    throw new Error(`Cannot find certificate ${certificateSubjectName || certificateSha1}, all certs: ${rawResult}`);
  });
  return _getCertificateFromStoreInfo.apply(this, arguments);
}

function doSign(_x7, _x8) {
  return _doSign.apply(this, arguments);
} // on windows be aware of http://stackoverflow.com/a/32640183/1910191


function _doSign() {
  _doSign = (0, _bluebirdLst().coroutine)(function* (configuration, packager) {
    // https://github.com/electron-userland/electron-builder/pull/1944
    const timeout = parseInt(process.env.SIGNTOOL_TIMEOUT, 10) || 10 * 60 * 1000;
    let tool;
    let args;
    let env = process.env;
    let vm;

    if (configuration.path.endsWith(".appx") || !("file" in configuration.cscInfo)
    /* certificateSubjectName and other such options */
    ) {
        vm = yield packager.vm.value;
        tool = getWinSignTool((yield getSignVendorPath()));
        args = computeSignToolArgs(configuration, true, vm);
      } else {
      vm = new (_vm().VmManager)();
      const toolInfo = yield getToolPath();
      tool = toolInfo.path;
      args = configuration.computeSignToolArgs(process.platform === "win32");

      if (toolInfo.env != null) {
        env = toolInfo.env;
      }
    }

    try {
      yield vm.exec(tool, args, {
        timeout,
        env
      });
    } catch (e) {
      if (e.message.includes("The file is being used by another process") || e.message.includes("The specified timestamp server either could not be reached")) {
        _util().log.warn(`First attempt to code sign failed, another attempt will be made in 2 seconds: ${e.message}`);

        yield new Promise((resolve, reject) => {
          setTimeout(() => {
            vm.exec(tool, args, {
              timeout,
              env
            }).then(resolve).catch(reject);
          }, 2000);
        });
      }

      throw e;
    }
  });
  return _doSign.apply(this, arguments);
}

function computeSignToolArgs(options, isWin, vm = new (_vm().VmManager)()) {
  const inputFile = vm.toVmFile(options.path);
  const outputPath = isWin ? inputFile : getOutputPath(inputFile, options.hash);

  if (!isWin) {
    options.resultOutputPath = outputPath;
  }

  const args = isWin ? ["sign"] : ["-in", inputFile, "-out", outputPath];

  if (process.env.ELECTRON_BUILDER_OFFLINE !== "true") {
    const timestampingServiceUrl = options.options.timeStampServer || "http://timestamp.digicert.com";

    if (isWin) {
      args.push(options.isNest || options.hash === "sha256" ? "/tr" : "/t", options.isNest || options.hash === "sha256" ? options.options.rfc3161TimeStampServer || "http://timestamp.comodoca.com/rfc3161" : timestampingServiceUrl);
    } else {
      args.push("-t", timestampingServiceUrl);
    }
  }

  const certificateFile = options.cscInfo.file;

  if (certificateFile == null) {
    const cscInfo = options.cscInfo;
    const subjectName = cscInfo.thumbprint;

    if (!isWin) {
      throw new Error(`${subjectName == null ? "certificateSha1" : "certificateSubjectName"} supported only on Windows`);
    }

    args.push("/sha1", cscInfo.thumbprint);
    args.push("/s", cscInfo.store);

    if (cscInfo.isLocalMachineStore) {
      args.push("/sm");
    }
  } else {
    const certExtension = path.extname(certificateFile);

    if (certExtension === ".p12" || certExtension === ".pfx") {
      args.push(isWin ? "/f" : "-pkcs12", vm.toVmFile(certificateFile));
    } else {
      throw new Error(`Please specify pkcs12 (.p12/.pfx) file, ${certificateFile} is not correct`);
    }
  }

  if (!isWin || options.hash !== "sha1") {
    args.push(isWin ? "/fd" : "-h", options.hash);

    if (isWin && process.env.ELECTRON_BUILDER_OFFLINE !== "true") {
      args.push("/td", "sha256");
    }
  }

  if (options.name) {
    args.push(isWin ? "/d" : "-n", options.name);
  }

  if (options.site) {
    args.push(isWin ? "/du" : "-i", options.site);
  } // msi does not support dual-signing


  if (options.isNest) {
    args.push(isWin ? "/as" : "-nest");
  }

  const password = options.cscInfo == null ? null : options.cscInfo.password;

  if (password) {
    args.push(isWin ? "/p" : "-pass", password);
  }

  if (options.options.additionalCertificateFile) {
    args.push(isWin ? "/ac" : "-ac", vm.toVmFile(options.options.additionalCertificateFile));
  }

  const httpsProxyFromEnv = process.env.HTTPS_PROXY;

  if (!isWin && httpsProxyFromEnv != null && httpsProxyFromEnv.length) {
    args.push("-p", httpsProxyFromEnv);
  }

  if (isWin) {
    // https://github.com/electron-userland/electron-builder/issues/2875#issuecomment-387233610
    args.push("/debug"); // must be last argument

    args.push(inputFile);
  }

  return args;
}

function getOutputPath(inputPath, hash) {
  const extension = path.extname(inputPath);
  return path.join(path.dirname(inputPath), `${path.basename(inputPath, extension)}-signed-${hash}${extension}`);
}
/** @internal */


function isOldWin6() {
  const winVersion = os().release();
  return winVersion.startsWith("6.") && !winVersion.startsWith("6.3");
}

function getWinSignTool(vendorPath) {
  // use modern signtool on Windows Server 2012 R2 to be able to sign AppX
  if (isOldWin6()) {
    return path.join(vendorPath, "windows-6", "signtool.exe");
  } else {
    return path.join(vendorPath, "windows-10", process.arch, "signtool.exe");
  }
}

function getToolPath() {
  return _getToolPath.apply(this, arguments);
} function _getToolPath() {
  _getToolPath = (0, _bluebirdLst().coroutine)(function* () {
    if ((0, _flags().isUseSystemSigncode)()) {
      return {
        path: "osslsigncode"
      };
    }

    const result = process.env.SIGNTOOL_PATH;

    if (result) {
      return {
        path: result
      };
    }

    const vendorPath = yield getSignVendorPath();

    if (process.platform === "win32") {
      // use modern signtool on Windows Server 2012 R2 to be able to sign AppX
      return {
        path: getWinSignTool(vendorPath)
      };
    } else if (process.platform === "darwin") {
      const toolDirPath = path.join(vendorPath, process.platform, "10.12");
      return {
        path: path.join(toolDirPath, "osslsigncode"),
        env: (0, _bundledTool().computeToolEnv)([path.join(toolDirPath, "lib")])
      };
    } else {
      return {
        path: path.join(vendorPath, process.platform, "osslsigncode")
      };
    }
  });
  return _getToolPath.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=windowsCodeSign.js.map{"version":3,"sources":["../../src/codeSign/windowsCodeSign.ts"],"names":[],"mappings":"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","sourcesContent":["import { InvalidConfigurationError, asArray, log } from \"builder-util/out/util\"\nimport { getBin } from \"../binDownload\"\nimport { executeAppBuilderAsJson } from \"../util/appBuilder\"\nimport { computeToolEnv, ToolInfo } from \"../util/bundledTool\"\nimport { rename } from \"fs-extra-p\"\nimport * as os from \"os\"\nimport * as path from \"path\"\nimport { WindowsConfiguration } from \"..\"\nimport { resolveFunction } from \"../platformPackager\"\nimport { isUseSystemSigncode } from \"../util/flags\"\nimport { VmManager } from \"../vm/vm\"\nimport { WinPackager } from \"../winPackager\"\n\nexport function getSignVendorPath() {\n  return getBin(\"winCodeSign\")\n}\n\nexport type CustomWindowsSign = (configuration: CustomWindowsSignTaskConfiguration) => Promise<any>\n\nexport interface WindowsSignOptions {\n  readonly path: string\n\n  readonly name?: string | null\n  readonly cscInfo?: FileCodeSigningInfo | CertificateFromStoreInfo | null\n  readonly site?: string | null\n\n  readonly options: WindowsConfiguration\n}\n\nexport interface WindowsSignTaskConfiguration extends WindowsSignOptions {\n  // set if output path differs from input (e.g. osslsigncode cannot sign file inplace)\n  resultOutputPath?: string\n\n  hash: string\n  isNest: boolean\n}\n\nexport interface CustomWindowsSignTaskConfiguration extends WindowsSignTaskConfiguration {\n  computeSignToolArgs(isWin: boolean): Array<string>\n}\n\nexport async function sign(options: WindowsSignOptions, packager: WinPackager) {\n  let hashes = options.options.signingHashAlgorithms\n  // msi does not support dual-signing\n  if (options.path.endsWith(\".msi\")) {\n    hashes = [hashes != null && !hashes.includes(\"sha1\") ? \"sha256\" : \"sha1\"]\n  }\n  else if (options.path.endsWith(\".appx\")) {\n    hashes = [\"sha256\"]\n  }\n  else if (hashes == null) {\n    hashes = [\"sha1\", \"sha256\"]\n  }\n  else {\n    hashes = Array.isArray(hashes) ? hashes : [hashes]\n  }\n\n  function defaultExecutor(configuration: CustomWindowsSignTaskConfiguration) {\n    return doSign(configuration, packager)\n  }\n\n  const executor = resolveFunction(options.options.sign, \"sign\") || defaultExecutor\n  let isNest = false\n  for (const hash of hashes) {\n    const taskConfiguration: WindowsSignTaskConfiguration = {...options, hash, isNest}\n    await executor({\n      ...taskConfiguration,\n      computeSignToolArgs: isWin => computeSignToolArgs(taskConfiguration, isWin)\n    })\n    isNest = true\n    if (taskConfiguration.resultOutputPath != null) {\n      await rename(taskConfiguration.resultOutputPath, options.path)\n    }\n  }\n}\n\nexport interface FileCodeSigningInfo {\n  readonly file: string\n  readonly password: string | null\n}\n\nexport async function getCertInfo(file: string, password: string): Promise<CertificateInfo> {\n  let result: any = null\n  try {\n    result = await executeAppBuilderAsJson<any>([\"certificate-info\", \"--input\", file, \"--password\", password])\n  }\n  catch (e) {\n    throw new Error(`Cannot extract publisher name from code signing certificate, please file issue. As workaround, set win.publisherName: ${e.stack || e}`)\n  }\n\n  if (result.error != null) {\n    // noinspection ExceptionCaughtLocallyJS\n    throw new InvalidConfigurationError(`Cannot extract publisher name from code signing certificate: ${result.error}`)\n  }\n  return result\n}\n\nexport interface CertificateInfo {\n  readonly commonName: string\n  readonly bloodyMicrosoftSubjectDn: string\n}\n\nexport interface CertificateFromStoreInfo {\n  thumbprint: string\n  subject: string\n  store: string\n  isLocalMachineStore: boolean\n}\n\nexport async function getCertificateFromStoreInfo(options: WindowsConfiguration, vm: VmManager): Promise<CertificateFromStoreInfo> {\n  const certificateSubjectName = options.certificateSubjectName\n  const certificateSha1 = options.certificateSha1\n  // ExcludeProperty doesn't work, so, we cannot exclude RawData, it is ok\n  // powershell can return object if the only item\n  const rawResult = await vm.exec(\"powershell.exe\", [\"Get-ChildItem -Recurse Cert: -CodeSigningCert | Select-Object -Property Subject,PSParentPath,Thumbprint | ConvertTo-Json -Compress\"])\n  const certList = rawResult.length === 0 ? [] : asArray<CertInfo>(JSON.parse(rawResult))\n  for (const certInfo of certList) {\n    if (certificateSubjectName != null) {\n      if (!certInfo.Subject.includes(certificateSubjectName)) {\n        continue\n      }\n    }\n    else if (certInfo.Thumbprint !== certificateSha1) {\n      continue\n    }\n\n    const parentPath = certInfo.PSParentPath\n    const store = parentPath.substring(parentPath.lastIndexOf(\"\\\\\") + 1)\n    log.debug({store, PSParentPath: parentPath}, \"auto-detect certificate store\")\n    // https://github.com/electron-userland/electron-builder/issues/1717\n    const isLocalMachineStore = (parentPath.includes(\"Certificate::LocalMachine\"))\n    log.debug(null, \"auto-detect using of LocalMachine store\")\n    return {\n      thumbprint: certInfo.Thumbprint,\n      subject: certInfo.Subject,\n      store,\n      isLocalMachineStore\n    }\n  }\n\n  throw new Error(`Cannot find certificate ${certificateSubjectName || certificateSha1}, all certs: ${rawResult}`)\n}\n\nasync function doSign(configuration: CustomWindowsSignTaskConfiguration, packager: WinPackager) {\n  // https://github.com/electron-userland/electron-builder/pull/1944\n  const timeout = parseInt(process.env.SIGNTOOL_TIMEOUT as any, 10) || 10 * 60 * 1000\n\n  let tool: string\n  let args: Array<string>\n  let env = process.env\n  let vm: VmManager\n  if (configuration.path.endsWith(\".appx\") || !(\"file\" in configuration.cscInfo!!) /* certificateSubjectName and other such options */) {\n    vm = await packager.vm.value\n    tool = getWinSignTool(await getSignVendorPath())\n    args = computeSignToolArgs(configuration, true, vm)\n  }\n  else {\n    vm = new VmManager()\n    const toolInfo = await getToolPath()\n    tool = toolInfo.path\n    args = configuration.computeSignToolArgs(process.platform === \"win32\")\n    if (toolInfo.env != null) {\n      env = toolInfo.env\n    }\n  }\n\n  try {\n    await vm.exec(tool, args, {timeout, env})\n  }\n  catch (e) {\n    if (e.message.includes(\"The file is being used by another process\") || e.message.includes(\"The specified timestamp server either could not be reached\")) {\n      log.warn(`First attempt to code sign failed, another attempt will be made in 2 seconds: ${e.message}`)\n      await new Promise((resolve, reject) => {\n        setTimeout(() => {\n          vm.exec(tool, args, {timeout, env})\n            .then(resolve)\n            .catch(reject)\n        }, 2000)\n      })\n    }\n    throw e\n  }\n}\n\ninterface CertInfo {\n  Subject: string\n  Thumbprint: string\n  PSParentPath: string\n}\n\n// on windows be aware of http://stackoverflow.com/a/32640183/1910191\nfunction computeSignToolArgs(options: WindowsSignTaskConfiguration, isWin: boolean, vm: VmManager = new VmManager()): Array<string> {\n  const inputFile = vm.toVmFile(options.path)\n  const outputPath = isWin ? inputFile : getOutputPath(inputFile, options.hash)\n  if (!isWin) {\n    options.resultOutputPath = outputPath\n  }\n\n  const args = isWin ? [\"sign\"] : [\"-in\", inputFile, \"-out\", outputPath]\n\n  if (process.env.ELECTRON_BUILDER_OFFLINE !== \"true\") {\n    const timestampingServiceUrl = options.options.timeStampServer || \"http://timestamp.digicert.com\"\n    if (isWin) {\n      args.push(options.isNest || options.hash === \"sha256\" ? \"/tr\" : \"/t\", options.isNest || options.hash === \"sha256\" ? (options.options.rfc3161TimeStampServer || \"http://timestamp.comodoca.com/rfc3161\") : timestampingServiceUrl)\n    }\n    else {\n      args.push(\"-t\", timestampingServiceUrl)\n    }\n  }\n\n  const certificateFile = (options.cscInfo as FileCodeSigningInfo).file\n  if (certificateFile == null) {\n    const cscInfo = (options.cscInfo as CertificateFromStoreInfo)\n    const subjectName = cscInfo.thumbprint\n    if (!isWin) {\n      throw new Error(`${subjectName == null ? \"certificateSha1\" : \"certificateSubjectName\"} supported only on Windows`)\n    }\n\n    args.push(\"/sha1\", cscInfo.thumbprint)\n    args.push(\"/s\", cscInfo.store)\n    if (cscInfo.isLocalMachineStore) {\n      args.push(\"/sm\")\n    }\n  }\n  else {\n    const certExtension = path.extname(certificateFile)\n    if (certExtension === \".p12\" || certExtension === \".pfx\") {\n      args.push(isWin ? \"/f\" : \"-pkcs12\", vm.toVmFile(certificateFile))\n    }\n    else {\n      throw new Error(`Please specify pkcs12 (.p12/.pfx) file, ${certificateFile} is not correct`)\n    }\n  }\n\n  if (!isWin || options.hash !== \"sha1\") {\n    args.push(isWin ? \"/fd\" : \"-h\", options.hash)\n    if (isWin && process.env.ELECTRON_BUILDER_OFFLINE !== \"true\") {\n      args.push(\"/td\", \"sha256\")\n    }\n  }\n\n  if (options.name) {\n    args.push(isWin ? \"/d\" : \"-n\", options.name)\n  }\n\n  if (options.site) {\n    args.push(isWin ? \"/du\" : \"-i\", options.site)\n  }\n\n  // msi does not support dual-signing\n  if (options.isNest) {\n    args.push(isWin ? \"/as\" : \"-nest\")\n  }\n\n  const password = options.cscInfo == null ? null : (options.cscInfo as FileCodeSigningInfo).password\n  if (password) {\n    args.push(isWin ? \"/p\" : \"-pass\", password)\n  }\n\n  if (options.options.additionalCertificateFile) {\n    args.push(isWin ? \"/ac\" : \"-ac\", vm.toVmFile(options.options.additionalCertificateFile))\n  }\n\n  const httpsProxyFromEnv = process.env.HTTPS_PROXY\n  if (!isWin && httpsProxyFromEnv != null && httpsProxyFromEnv.length) {\n    args.push(\"-p\", httpsProxyFromEnv)\n  }\n\n  if (isWin) {\n    // https://github.com/electron-userland/electron-builder/issues/2875#issuecomment-387233610\n    args.push(\"/debug\")\n    // must be last argument\n    args.push(inputFile)\n  }\n\n  return args\n}\n\nfunction getOutputPath(inputPath: string, hash: string) {\n  const extension = path.extname(inputPath)\n  return path.join(path.dirname(inputPath), `${path.basename(inputPath, extension)}-signed-${hash}${extension}`)\n}\n\n/** @internal */\nexport function isOldWin6() {\n  const winVersion = os.release()\n  return winVersion.startsWith(\"6.\") && !winVersion.startsWith(\"6.3\")\n}\n\nfunction getWinSignTool(vendorPath: string): string {\n  // use modern signtool on Windows Server 2012 R2 to be able to sign AppX\n  if (isOldWin6()) {\n    return path.join(vendorPath, \"windows-6\", \"signtool.exe\")\n  }\n  else {\n    return path.join(vendorPath, \"windows-10\", process.arch, \"signtool.exe\")\n  }\n}\n\nasync function getToolPath(): Promise<ToolInfo> {\n  if (isUseSystemSigncode()) {\n    return {path: \"osslsigncode\"}\n  }\n\n  const result = process.env.SIGNTOOL_PATH\n  if (result) {\n    return {path: result}\n  }\n\n  const vendorPath = await getSignVendorPath()\n  if (process.platform === \"win32\") {\n    // use modern signtool on Windows Server 2012 R2 to be able to sign AppX\n    return {path: getWinSignTool(vendorPath)}\n  }\n  else if (process.platform === \"darwin\") {\n    const toolDirPath = path.join(vendorPath, process.platform, \"10.12\")\n    return {\n      path: path.join(toolDirPath, \"osslsigncode\"),\n      env: computeToolEnv([path.join(toolDirPath, \"lib\")]),\n    }\n  }\n  else {\n    return {path: path.join(vendorPath, process.platform, \"osslsigncode\")}\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.readAsar = readAsar;
exports.readAsarJson = readAsarJson;
exports.AsarFilesystem = exports.Node = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _chromiumPickleJs() {
  const data = require("chromium-pickle-js");

  _chromiumPickleJs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/** @internal */
class Node {}
/** @internal */


exports.Node = Node;

class AsarFilesystem {
  constructor(src, header = new Node(), headerSize = -1) {
    this.src = src;
    this.header = header;
    this.headerSize = headerSize;
    this.offset = 0;

    if (this.header.files == null) {
      this.header.files = {};
    }
  }

  searchNodeFromDirectory(p, isCreate) {
    let node = this.header;

    for (const dir of p.split(path.sep)) {
      if (dir !== ".") {
        let child = node.files[dir];

        if (child == null) {
          if (!isCreate) {
            return null;
          }

          child = new Node();
          child.files = {};
          node.files[dir] = child;
        }

        node = child;
      }
    }

    return node;
  }

  getOrCreateNode(p) {
    if (p == null || p.length === 0) {
      return this.header;
    }

    const name = path.basename(p);
    const dirNode = this.searchNodeFromDirectory(path.dirname(p), true);

    if (dirNode.files == null) {
      dirNode.files = {};
    }

    let result = dirNode.files[name];

    if (result == null) {
      result = new Node();
      dirNode.files[name] = result;
    }

    return result;
  }

  addFileNode(file, dirNode, size, unpacked, stat) {
    if (size > 4294967295) {
      throw new Error(`${file}: file size cannot be larger than 4.2GB`);
    }

    const node = new Node();
    node.size = size;

    if (unpacked) {
      node.unpacked = true;
    } else {
      // electron expects string
      node.offset = this.offset.toString();

      if (process.platform !== "win32" && stat.mode & 0o100) {
        node.executable = true;
      }

      this.offset += node.size;
    }

    let children = dirNode.files;

    if (children == null) {
      children = {};
      dirNode.files = children;
    }

    children[path.basename(file)] = node;
    return node;
  }

  getNode(p) {
    const node = this.searchNodeFromDirectory(path.dirname(p), false);
    return node.files[path.basename(p)];
  }

  getFile(p, followLinks = true) {
    const info = this.getNode(p); // if followLinks is false we don't resolve symlinks

    return followLinks && info.link != null ? this.getFile(info.link) : info;
  }

  readJson(file) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      return JSON.parse((yield _this.readFile(file)).toString());
    })();
  }

  readFile(file) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      return yield readFileFromAsar(_this2, file, _this2.getFile(file));
    })();
  }

}

exports.AsarFilesystem = AsarFilesystem;

function readAsar(_x) {
  return _readAsar.apply(this, arguments);
}

function _readAsar() {
  _readAsar = (0, _bluebirdLst().coroutine)(function* (archive) {
    const fd = yield (0, _fsExtraP().open)(archive, "r");
    let size;
    let headerBuf;

    try {
      const sizeBuf = Buffer.allocUnsafe(8);

      if ((yield (0, _fsExtraP().read)(fd, sizeBuf, 0, 8, null)) !== 8) {
        throw new Error("Unable to read header size");
      }

      const sizePickle = (0, _chromiumPickleJs().createFromBuffer)(sizeBuf);
      size = sizePickle.createIterator().readUInt32();
      headerBuf = Buffer.allocUnsafe(size);

      if ((yield (0, _fsExtraP().read)(fd, headerBuf, 0, size, null)) !== size) {
        throw new Error("Unable to read header");
      }
    } finally {
      yield (0, _fsExtraP().close)(fd);
    }

    const headerPickle = (0, _chromiumPickleJs().createFromBuffer)(headerBuf);
    const header = headerPickle.createIterator().readString();
    return new AsarFilesystem(archive, JSON.parse(header), size);
  });
  return _readAsar.apply(this, arguments);
}

function readAsarJson(_x2, _x3) {
  return _readAsarJson.apply(this, arguments);
}

function _readAsarJson() {
  _readAsarJson = (0, _bluebirdLst().coroutine)(function* (archive, file) {
    const fs = yield readAsar(archive);
    return yield fs.readJson(file);
  });
  return _readAsarJson.apply(this, arguments);
}

function readFileFromAsar(_x4, _x5, _x6) {
  return _readFileFromAsar.apply(this, arguments);
} function _readFileFromAsar() {
  _readFileFromAsar = (0, _bluebirdLst().coroutine)(function* (filesystem, filename, info) {
    const size = info.size;
    const buffer = Buffer.allocUnsafe(size);

    if (size <= 0) {
      return buffer;
    }

    if (info.unpacked) {
      return yield (0, _fsExtraP().readFile)(path.join(`${filesystem.src}.unpacked`, filename));
    }

    const fd = yield (0, _fsExtraP().open)(filesystem.src, "r");

    try {
      const offset = 8 + filesystem.headerSize + parseInt(info.offset, 10);
      yield (0, _fsExtraP().read)(fd, buffer, 0, size, offset);
    } finally {
      yield (0, _fsExtraP().close)(fd);
    }

    return buffer;
  });
  return _readFileFromAsar.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=asar.js.map{"version":3,"sources":["../../src/asar/asar.ts"],"names":[],"mappings":"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","sourcesContent":["import { createFromBuffer } from \"chromium-pickle-js\"\nimport { close, open, read, readFile, Stats } from \"fs-extra-p\"\nimport * as path from \"path\"\n\n/** @internal */\nexport class Node {\n  // we don't use Map because later it will be stringified\n  files?: { [key: string]: Node }\n\n  unpacked?: boolean\n\n  size?: number\n  // electron expects string\n  offset?: string\n\n  executable?: boolean\n\n  link?: string\n}\n\n/** @internal */\nexport class AsarFilesystem {\n  private offset = 0\n\n  constructor(readonly src: string, readonly header = new Node(), readonly headerSize: number = -1) {\n    if (this.header.files == null) {\n      this.header.files = {}\n    }\n  }\n\n  searchNodeFromDirectory(p: string, isCreate: boolean): Node | null {\n    let node = this.header\n    for (const dir of p.split(path.sep)) {\n      if (dir !== \".\") {\n        let child = node.files![dir]\n        if (child == null) {\n          if (!isCreate) {\n            return null\n          }\n          child = new Node()\n          child.files = {}\n          node.files![dir] = child\n        }\n        node = child\n      }\n    }\n    return node\n  }\n\n  getOrCreateNode(p: string): Node {\n    if (p == null || p.length === 0) {\n      return this.header\n    }\n\n    const name = path.basename(p)\n    const dirNode = this.searchNodeFromDirectory(path.dirname(p), true)!\n    if (dirNode.files == null) {\n      dirNode.files = {}\n    }\n\n    let result = dirNode.files[name]\n    if (result == null) {\n      result = new Node()\n      dirNode.files[name] = result\n    }\n    return result\n  }\n\n  addFileNode(file: string, dirNode: Node, size: number, unpacked: boolean, stat: Stats): Node {\n    if (size > 4294967295) {\n      throw new Error(`${file}: file size cannot be larger than 4.2GB`)\n    }\n\n    const node = new Node()\n    node.size = size\n    if (unpacked) {\n      node.unpacked = true\n    }\n    else {\n      // electron expects string\n      node.offset = this.offset.toString()\n      if (process.platform !== \"win32\" && (stat.mode & 0o100)) {\n        node.executable = true\n      }\n      this.offset += node.size\n    }\n\n    let children = dirNode.files\n    if (children == null) {\n      children = {}\n      dirNode.files = children\n    }\n    children[path.basename(file)] = node\n\n    return node\n  }\n\n  getNode(p: string) {\n    const node = this.searchNodeFromDirectory(path.dirname(p), false)!\n    return node.files![path.basename(p)]\n  }\n\n  getFile(p: string, followLinks: boolean = true): Node {\n    const info = this.getNode(p)!\n    // if followLinks is false we don't resolve symlinks\n    return followLinks && info.link != null ? this.getFile(info.link) : info\n  }\n\n  async readJson(file: string): Promise<any> {\n    return JSON.parse((await this.readFile(file)).toString())\n  }\n\n  async readFile(file: string): Promise<Buffer> {\n    return await readFileFromAsar(this, file, this.getFile(file))\n  }\n}\n\nexport async function readAsar(archive: string): Promise<AsarFilesystem> {\n  const fd = await open(archive, \"r\")\n  let size\n  let headerBuf\n  try {\n    const sizeBuf = Buffer.allocUnsafe(8)\n    if (await read(fd, sizeBuf, 0, 8, null as any) !== 8) {\n      throw new Error(\"Unable to read header size\")\n    }\n\n    const sizePickle = createFromBuffer(sizeBuf)\n    size = sizePickle.createIterator().readUInt32()\n    headerBuf = Buffer.allocUnsafe(size)\n    if (await read(fd, headerBuf, 0, size, null as any) !== size) {\n      throw new Error(\"Unable to read header\")\n    }\n  }\n  finally {\n    await close(fd)\n  }\n\n  const headerPickle = createFromBuffer(headerBuf!)\n  const header = headerPickle.createIterator().readString()\n  return new AsarFilesystem(archive, JSON.parse(header), size)\n}\n\nexport async function readAsarJson(archive: string, file: string): Promise<any> {\n  const fs = await readAsar(archive)\n  return await fs.readJson(file)\n}\n\nasync function readFileFromAsar(filesystem: AsarFilesystem, filename: string, info: Node): Promise<Buffer> {\n  const size = info.size!!\n  const buffer = Buffer.allocUnsafe(size)\n  if (size <= 0) {\n    return buffer\n  }\n\n  if (info.unpacked) {\n    return await readFile(path.join(`${filesystem.src}.unpacked`, filename))\n  }\n\n  const fd = await open(filesystem.src, \"r\")\n  try {\n    const offset = 8 + filesystem.headerSize + parseInt(info.offset!!, 10)\n    await read(fd, buffer, 0, size, offset)\n  }\n  finally {\n    await close(fd)\n  }\n  return buffer\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.checkFileInArchive = checkFileInArchive;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _asar() {
  const data = require("./asar");

  _asar = function () {
    return data;
  };

  return data;
}

/** @internal */
function checkFileInArchive(_x, _x2, _x3) {
  return _checkFileInArchive.apply(this, arguments);
} function _checkFileInArchive() {
  _checkFileInArchive = (0, _bluebirdLst().coroutine)(function* (asarFile, relativeFile, messagePrefix) {
    function error(text) {
      return new Error(`${messagePrefix} "${relativeFile}" in the "${asarFile}" ${text}`);
    }

    let fs;

    try {
      fs = yield (0, _asar().readAsar)(asarFile);
    } catch (e) {
      throw error(`is corrupted: ${e}`);
    }

    let stat;

    try {
      stat = fs.getFile(relativeFile);
    } catch (e) {
      const fileStat = yield (0, _fs().statOrNull)(asarFile);

      if (fileStat == null) {
        throw error(`does not exist. Seems like a wrong configuration.`);
      } // asar throws error on access to undefined object (info.link)


      stat = null;
    }

    if (stat == null) {
      throw error(`does not exist. Seems like a wrong configuration.`);
    }

    if (stat.size === 0) {
      throw error(`is corrupted: size 0`);
    }
  });
  return _checkFileInArchive.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=asarFileChecker.js.map{"version":3,"sources":["../../src/asar/asarFileChecker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;SACsB,kB;;;;;;sDAAf,WAAkC,QAAlC,EAAoD,YAApD,EAA0E,aAA1E,EAA+F;AACpG,aAAS,KAAT,CAAe,IAAf,EAA2B;AACzB,aAAO,IAAI,KAAJ,CAAU,GAAG,aAAa,KAAK,YAAY,aAAa,QAAQ,KAAK,IAAI,EAAzE,CAAP;AACD;;AAED,QAAI,EAAJ;;AACA,QAAI;AACF,MAAA,EAAE,SAAS,sBAAS,QAAT,CAAX;AACD,KAFD,CAGA,OAAO,CAAP,EAAU;AACR,YAAM,KAAK,CAAC,iBAAiB,CAAC,EAAnB,CAAX;AACD;;AAED,QAAI,IAAJ;;AACA,QAAI;AACF,MAAA,IAAI,GAAG,EAAE,CAAC,OAAH,CAAW,YAAX,CAAP;AACD,KAFD,CAGA,OAAO,CAAP,EAAU;AACR,YAAM,QAAQ,SAAS,sBAAW,QAAX,CAAvB;;AACA,UAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,cAAM,KAAK,CAAC,mDAAD,CAAX;AACD,OAJO,CAMR;;;AACA,MAAA,IAAI,GAAG,IAAP;AACD;;AAED,QAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB,YAAM,KAAK,CAAC,mDAAD,CAAX;AACD;;AACD,QAAI,IAAI,CAAC,IAAL,KAAc,CAAlB,EAAqB;AACnB,YAAM,KAAK,CAAC,sBAAD,CAAX;AACD;AACF,G","sourcesContent":["import { statOrNull } from \"builder-util/out/fs\"\nimport { Node, readAsar } from \"./asar\"\n\n/** @internal */\nexport async function checkFileInArchive(asarFile: string, relativeFile: string, messagePrefix: string) {\n  function error(text: string) {\n    return new Error(`${messagePrefix} \"${relativeFile}\" in the \"${asarFile}\" ${text}`)\n  }\n\n  let fs\n  try {\n    fs = await readAsar(asarFile)\n  }\n  catch (e) {\n    throw error(`is corrupted: ${e}`)\n  }\n\n  let stat: Node | null\n  try {\n    stat = fs.getFile(relativeFile)\n  }\n  catch (e) {\n    const fileStat = await statOrNull(asarFile)\n    if (fileStat == null) {\n      throw error(`does not exist. Seems like a wrong configuration.`)\n    }\n\n    // asar throws error on access to undefined object (info.link)\n    stat = null\n  }\n\n  if (stat == null) {\n    throw error(`does not exist. Seems like a wrong configuration.`)\n  }\n  if (stat.size === 0) {\n    throw error(`is corrupted: size 0`)\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.AsarPackager = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fs2() {
  const data = require("fs");

  _fs2 = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _appFileCopier() {
  const data = require("../util/appFileCopier");

  _appFileCopier = function () {
    return data;
  };

  return data;
}

function _asar() {
  const data = require("./asar");

  _asar = function () {
    return data;
  };

  return data;
}

function _unpackDetector() {
  const data = require("./unpackDetector");

  _unpackDetector = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const pickle = require("chromium-pickle-js");
/** @internal */


class AsarPackager {
  constructor(src, destination, options, unpackPattern) {
    this.src = src;
    this.destination = destination;
    this.options = options;
    this.unpackPattern = unpackPattern;
    this.fs = new (_asar().AsarFilesystem)(this.src);
    this.outFile = path.join(destination, "app.asar");
    this.unpackedDest = `${this.outFile}.unpacked`;
  } // sort files to minimize file change (i.e. asar file is not changed dramatically on small change)


  pack(fileSets, packager) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (_this.options.ordering != null) {
        // ordering doesn't support transformed files, but ordering is not used functionality - wait user report to fix it
        yield order(fileSets[0].files, _this.options.ordering, fileSets[0].src);
      }

      yield (0, _fsExtraP().ensureDir)(path.dirname(_this.outFile));
      const unpackedFileIndexMap = new Map();

      for (const fileSet of fileSets) {
        unpackedFileIndexMap.set(fileSet, (yield _this.createPackageFromFiles(fileSet, packager.info)));
      }

      yield _this.writeAsarFile(fileSets, unpackedFileIndexMap);
    })();
  }

  createPackageFromFiles(fileSet, packager) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const metadata = fileSet.metadata; // search auto unpacked dir

      const unpackedDirs = new Set();
      const rootForAppFilesWithoutAsar = path.join(_this2.destination, "app");

      if (_this2.options.smartUnpack !== false) {
        yield (0, _unpackDetector().detectUnpackedDirs)(fileSet, unpackedDirs, _this2.unpackedDest, rootForAppFilesWithoutAsar);
      }

      const dirToCreateForUnpackedFiles = new Set(unpackedDirs);

      const correctDirNodeUnpackedFlag =
      /*#__PURE__*/
      function () {
        var _ref = (0, _bluebirdLst().coroutine)(function* (filePathInArchive, dirNode) {
          for (const dir of unpackedDirs) {
            if (filePathInArchive.length > dir.length + 2 && filePathInArchive[dir.length] === path.sep && filePathInArchive.startsWith(dir)) {
              dirNode.unpacked = true;
              unpackedDirs.add(filePathInArchive); // not all dirs marked as unpacked after first iteration - because node module dir can be marked as unpacked after processing node module dir content
              // e.g. node-notifier/example/advanced.js processed, but only on process vendor/terminal-notifier.app module will be marked as unpacked

              yield (0, _fsExtraP().ensureDir)(path.join(_this2.unpackedDest, filePathInArchive));
              break;
            }
          }
        });

        return function correctDirNodeUnpackedFlag(_x, _x2) {
          return _ref.apply(this, arguments);
        };
      }();

      const transformedFiles = fileSet.transformedFiles;
      const taskManager = new (_builderUtil().AsyncTaskManager)(packager.cancellationToken);
      const fileCopier = new (_fs().FileCopier)();
      let currentDirNode = null;
      let currentDirPath = null;
      const unpackedFileIndexSet = new Set();

      for (let i = 0, n = fileSet.files.length; i < n; i++) {
        const file = fileSet.files[i];
        const stat = metadata.get(file);

        if (stat == null) {
          continue;
        }

        const pathInArchive = path.relative(rootForAppFilesWithoutAsar, (0, _appFileCopier().getDestinationPath)(file, fileSet));

        if (stat.isSymbolicLink()) {
          const s = stat;
          _this2.fs.getOrCreateNode(pathInArchive).link = s.relativeLink;
          s.pathInArchive = pathInArchive;
          unpackedFileIndexSet.add(i);
          continue;
        }

        let fileParent = path.dirname(pathInArchive);

        if (fileParent === ".") {
          fileParent = "";
        }

        if (currentDirPath !== fileParent) {
          if (fileParent.startsWith("..")) {
            throw new Error(`Internal error: path must not start with "..": ${fileParent}`);
          }

          currentDirPath = fileParent;
          currentDirNode = _this2.fs.getOrCreateNode(fileParent); // do not check for root

          if (fileParent !== "" && !currentDirNode.unpacked) {
            if (unpackedDirs.has(fileParent)) {
              currentDirNode.unpacked = true;
            } else {
              yield correctDirNodeUnpackedFlag(fileParent, currentDirNode);
            }
          }
        }

        const dirNode = currentDirNode;
        const newData = transformedFiles == null ? null : transformedFiles.get(i);

        const isUnpacked = dirNode.unpacked || _this2.unpackPattern != null && _this2.unpackPattern(file, stat);

        _this2.fs.addFileNode(file, dirNode, newData == null ? stat.size : Buffer.byteLength(newData), isUnpacked, stat);

        if (isUnpacked) {
          if (!dirNode.unpacked && !dirToCreateForUnpackedFiles.has(fileParent)) {
            dirToCreateForUnpackedFiles.add(fileParent);
            yield (0, _fsExtraP().ensureDir)(path.join(_this2.unpackedDest, fileParent));
          }

          const unpackedFile = path.join(_this2.unpackedDest, pathInArchive);
          taskManager.addTask(copyFileOrData(fileCopier, newData, file, unpackedFile, stat));

          if (taskManager.tasks.length > _fs().MAX_FILE_REQUESTS) {
            yield taskManager.awaitTasks();
          }

          unpackedFileIndexSet.add(i);
        }
      }

      if (taskManager.tasks.length > 0) {
        yield taskManager.awaitTasks();
      }

      return unpackedFileIndexSet;
    })();
  }

  writeAsarFile(fileSets, unpackedFileIndexMap) {
    return new Promise((resolve, reject) => {
      const headerPickle = pickle.createEmpty();
      headerPickle.writeString(JSON.stringify(this.fs.header));
      const headerBuf = headerPickle.toBuffer();
      const sizePickle = pickle.createEmpty();
      sizePickle.writeUInt32(headerBuf.length);
      const sizeBuf = sizePickle.toBuffer();
      const writeStream = (0, _fsExtraP().createWriteStream)(this.outFile);
      writeStream.on("error", reject);
      writeStream.on("close", resolve);
      writeStream.write(sizeBuf);
      let fileSetIndex = 0;
      let files = fileSets[0].files;
      let metadata = fileSets[0].metadata;
      let transformedFiles = fileSets[0].transformedFiles;
      let unpackedFileIndexSet = unpackedFileIndexMap.get(fileSets[0]);

      const w = index => {
        while (true) {
          if (index >= files.length) {
            if (++fileSetIndex >= fileSets.length) {
              writeStream.end();
              return;
            } else {
              files = fileSets[fileSetIndex].files;
              metadata = fileSets[fileSetIndex].metadata;
              transformedFiles = fileSets[fileSetIndex].transformedFiles;
              unpackedFileIndexSet = unpackedFileIndexMap.get(fileSets[fileSetIndex]);
              index = 0;
            }
          }

          if (!unpackedFileIndexSet.has(index)) {
            break;
          } else {
            const stat = metadata.get(files[index]);

            if (stat != null && stat.isSymbolicLink()) {
              (0, _fs2().symlink)(stat.linkRelativeToFile, path.join(this.unpackedDest, stat.pathInArchive), () => w(index + 1));
              return;
            }
          }

          index++;
        }

        const data = transformedFiles == null ? null : transformedFiles.get(index);
        const file = files[index];

        if (data !== null && data !== undefined) {
          writeStream.write(data, () => w(index + 1));
          return;
        } // https://github.com/yarnpkg/yarn/pull/3539


        const stat = metadata.get(file);

        if (stat != null && stat.size < 2 * 1024 * 1024) {
          (0, _fsExtraP().readFile)(file).then(it => {
            writeStream.write(it, () => w(index + 1));
          }).catch(e => reject(`Cannot read file ${file}: ${e.stack || e}`));
        } else {
          const readStream = (0, _fsExtraP().createReadStream)(file);
          readStream.on("error", reject);
          readStream.once("end", () => w(index + 1));
          readStream.pipe(writeStream, {
            end: false
          });
        }
      };

      writeStream.write(headerBuf, () => w(0));
    });
  }

}

exports.AsarPackager = AsarPackager;

function order(_x3, _x4, _x5) {
  return _order.apply(this, arguments);
}

function _order() {
  _order = (0, _bluebirdLst().coroutine)(function* (filenames, orderingFile, src) {
    const orderingFiles = (yield (0, _fsExtraP().readFile)(orderingFile, "utf8")).split("\n").map(line => {
      if (line.indexOf(":") !== -1) {
        line = line.split(":").pop();
      }

      line = line.trim();

      if (line[0] === "/") {
        line = line.slice(1);
      }

      return line;
    });
    const ordering = [];

    for (const file of orderingFiles) {
      const pathComponents = file.split(path.sep);

      for (const pathComponent of pathComponents) {
        ordering.push(path.join(src, pathComponent));
      }
    }

    const sortedFiles = [];
    let missing = 0;
    const total = filenames.length;

    for (const file of ordering) {
      if (!sortedFiles.includes(file) && filenames.includes(file)) {
        sortedFiles.push(file);
      }
    }

    for (const file of filenames) {
      if (!sortedFiles.includes(file)) {
        sortedFiles.push(file);
        missing += 1;
      }
    }

    _builderUtil().log.info({
      coverage: (total - missing) / total * 100
    }, "ordering files in ASAR archive");

    return sortedFiles;
  });
  return _order.apply(this, arguments);
}

function copyFileOrData(fileCopier, data, source, destination, stats) {
  if (data == null) {
    return fileCopier.copy(source, destination, stats);
  } else {
    return (0, _fsExtraP().writeFile)(destination, data);
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=asarUtil.js.map{"version":3,"sources":["../../src/asar/asarUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncTaskManager, log } from \"builder-util\"\nimport { FileCopier, Filter, MAX_FILE_REQUESTS } from \"builder-util/out/fs\"\nimport { symlink } from \"fs\"\nimport { createReadStream, createWriteStream, ensureDir, readFile, Stats, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { AsarOptions } from \"..\"\nimport { Packager } from \"../packager\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { getDestinationPath, ResolvedFileSet } from \"../util/appFileCopier\"\nimport { AsarFilesystem, Node } from \"./asar\"\nimport { detectUnpackedDirs } from \"./unpackDetector\"\n\nconst pickle = require(\"chromium-pickle-js\")\n\n/** @internal */\nexport class AsarPackager {\n  private readonly fs = new AsarFilesystem(this.src)\n  private readonly outFile: string\n  private readonly unpackedDest: string\n\n  constructor(private readonly src: string, private readonly destination: string, private readonly options: AsarOptions, private readonly unpackPattern: Filter | null) {\n    this.outFile = path.join(destination, \"app.asar\")\n    this.unpackedDest = `${this.outFile}.unpacked`\n  }\n\n  // sort files to minimize file change (i.e. asar file is not changed dramatically on small change)\n  async pack(fileSets: Array<ResolvedFileSet>, packager: PlatformPackager<any>) {\n    if (this.options.ordering != null) {\n      // ordering doesn't support transformed files, but ordering is not used functionality - wait user report to fix it\n      await order(fileSets[0].files, this.options.ordering, fileSets[0].src)\n    }\n    await ensureDir(path.dirname(this.outFile))\n    const unpackedFileIndexMap = new Map<ResolvedFileSet, Set<number>>()\n    for (const fileSet of fileSets) {\n      unpackedFileIndexMap.set(fileSet, await this.createPackageFromFiles(fileSet, packager.info))\n    }\n    await this.writeAsarFile(fileSets, unpackedFileIndexMap)\n  }\n\n  private async createPackageFromFiles(fileSet: ResolvedFileSet, packager: Packager) {\n    const metadata = fileSet.metadata\n    // search auto unpacked dir\n    const unpackedDirs = new Set<string>()\n    const rootForAppFilesWithoutAsar = path.join(this.destination, \"app\")\n\n    if (this.options.smartUnpack !== false) {\n      await detectUnpackedDirs(fileSet, unpackedDirs, this.unpackedDest, rootForAppFilesWithoutAsar)\n    }\n\n    const dirToCreateForUnpackedFiles = new Set<string>(unpackedDirs)\n\n    const correctDirNodeUnpackedFlag = async (filePathInArchive: string, dirNode: Node) => {\n      for (const dir of unpackedDirs) {\n        if (filePathInArchive.length > (dir.length + 2) && filePathInArchive[dir.length] === path.sep && filePathInArchive.startsWith(dir)) {\n          dirNode.unpacked = true\n          unpackedDirs.add(filePathInArchive)\n          // not all dirs marked as unpacked after first iteration - because node module dir can be marked as unpacked after processing node module dir content\n          // e.g. node-notifier/example/advanced.js processed, but only on process vendor/terminal-notifier.app module will be marked as unpacked\n          await ensureDir(path.join(this.unpackedDest, filePathInArchive))\n          break\n        }\n      }\n    }\n\n    const transformedFiles = fileSet.transformedFiles\n    const taskManager = new AsyncTaskManager(packager.cancellationToken)\n    const fileCopier = new FileCopier()\n\n    let currentDirNode: Node | null = null\n    let currentDirPath: string | null = null\n\n    const unpackedFileIndexSet = new Set<number>()\n\n    for (let i = 0, n = fileSet.files.length; i < n; i++) {\n      const file = fileSet.files[i]\n      const stat = metadata.get(file)\n      if (stat == null) {\n        continue\n      }\n\n      const pathInArchive = path.relative(rootForAppFilesWithoutAsar, getDestinationPath(file, fileSet))\n\n      if (stat.isSymbolicLink()) {\n        const s = (stat as any)\n        this.fs.getOrCreateNode(pathInArchive).link = s.relativeLink\n        s.pathInArchive = pathInArchive\n        unpackedFileIndexSet.add(i)\n        continue\n      }\n\n      let fileParent = path.dirname(pathInArchive)\n      if (fileParent === \".\") {\n        fileParent = \"\"\n      }\n\n      if (currentDirPath !== fileParent) {\n        if (fileParent.startsWith(\"..\")) {\n          throw new Error(`Internal error: path must not start with \"..\": ${fileParent}`)\n        }\n\n        currentDirPath = fileParent\n        currentDirNode = this.fs.getOrCreateNode(fileParent)\n        // do not check for root\n        if (fileParent !== \"\" && !currentDirNode.unpacked) {\n          if (unpackedDirs.has(fileParent)) {\n            currentDirNode.unpacked = true\n          }\n          else {\n            await correctDirNodeUnpackedFlag(fileParent, currentDirNode)\n          }\n        }\n      }\n\n      const dirNode = currentDirNode!\n      const newData = transformedFiles == null ? null : transformedFiles.get(i)\n      const isUnpacked = dirNode.unpacked || (this.unpackPattern != null && this.unpackPattern(file, stat))\n      this.fs.addFileNode(file, dirNode, newData == null ? stat.size : Buffer.byteLength(newData), isUnpacked, stat)\n      if (isUnpacked) {\n        if (!dirNode.unpacked && !dirToCreateForUnpackedFiles.has(fileParent)) {\n          dirToCreateForUnpackedFiles.add(fileParent)\n          await ensureDir(path.join(this.unpackedDest, fileParent))\n        }\n\n        const unpackedFile = path.join(this.unpackedDest, pathInArchive)\n        taskManager.addTask(copyFileOrData(fileCopier, newData, file, unpackedFile, stat))\n        if (taskManager.tasks.length > MAX_FILE_REQUESTS) {\n          await taskManager.awaitTasks()\n        }\n\n        unpackedFileIndexSet.add(i)\n      }\n    }\n\n    if (taskManager.tasks.length > 0) {\n      await taskManager.awaitTasks()\n    }\n\n    return unpackedFileIndexSet\n  }\n\n  private writeAsarFile(fileSets: Array<ResolvedFileSet>, unpackedFileIndexMap: Map<ResolvedFileSet, Set<number>>): Promise<any> {\n    return new Promise((resolve, reject) => {\n      const headerPickle = pickle.createEmpty()\n      headerPickle.writeString(JSON.stringify(this.fs.header))\n      const headerBuf = headerPickle.toBuffer()\n\n      const sizePickle = pickle.createEmpty()\n      sizePickle.writeUInt32(headerBuf.length)\n\n      const sizeBuf = sizePickle.toBuffer()\n      const writeStream = createWriteStream(this.outFile)\n      writeStream.on(\"error\", reject)\n      writeStream.on(\"close\", resolve)\n      writeStream.write(sizeBuf)\n\n      let fileSetIndex = 0\n\n      let files = fileSets[0].files\n      let metadata = fileSets[0].metadata\n      let transformedFiles = fileSets[0].transformedFiles\n      let unpackedFileIndexSet = unpackedFileIndexMap.get(fileSets[0])!!\n      const w = (index: number) => {\n        while (true) {\n          if (index >= files.length) {\n            if (++fileSetIndex >= fileSets.length) {\n              writeStream.end()\n              return\n            }\n            else {\n              files = fileSets[fileSetIndex].files\n              metadata = fileSets[fileSetIndex].metadata\n              transformedFiles = fileSets[fileSetIndex].transformedFiles\n              unpackedFileIndexSet = unpackedFileIndexMap.get(fileSets[fileSetIndex])!!\n              index = 0\n            }\n          }\n\n          if (!unpackedFileIndexSet.has(index)) {\n            break\n          }\n          else {\n            const stat = metadata.get(files[index])\n            if (stat != null && stat.isSymbolicLink()) {\n              symlink((stat as any).linkRelativeToFile, path.join(this.unpackedDest, (stat as any).pathInArchive), () => w(index + 1))\n              return\n            }\n          }\n          index++\n        }\n\n        const data = transformedFiles == null ? null : transformedFiles.get(index)\n        const file = files[index]\n        if (data !== null && data !== undefined) {\n          writeStream.write(data, () => w(index + 1))\n          return\n        }\n\n        // https://github.com/yarnpkg/yarn/pull/3539\n        const stat = metadata.get(file)\n        if (stat != null && stat.size < (2 * 1024 * 1024)) {\n          readFile(file)\n            .then(it => {\n              writeStream.write(it, () => w(index + 1))\n            })\n            .catch(e => reject(`Cannot read file ${file}: ${e.stack || e}`))\n        }\n        else {\n          const readStream = createReadStream(file)\n          readStream.on(\"error\", reject)\n          readStream.once(\"end\", () => w(index + 1))\n          readStream.pipe(writeStream, {\n            end: false\n          })\n        }\n      }\n\n      writeStream.write(headerBuf, () => w(0))\n    })\n  }\n}\n\nasync function order(filenames: Array<string>, orderingFile: string, src: string) {\n  const orderingFiles = (await readFile(orderingFile, \"utf8\")).split(\"\\n\").map(line => {\n    if (line.indexOf(\":\") !== -1) {\n      line = line.split(\":\").pop()!\n    }\n    line = line.trim()\n    if (line[0] === \"/\") {\n      line = line.slice(1)\n    }\n    return line\n  })\n\n  const ordering: Array<string> = []\n  for (const file of orderingFiles) {\n    const pathComponents = file.split(path.sep)\n    for (const pathComponent of pathComponents) {\n      ordering.push(path.join(src, pathComponent))\n    }\n  }\n\n  const sortedFiles: Array<string> = []\n  let missing = 0\n  const total = filenames.length\n  for (const file of ordering) {\n    if (!sortedFiles.includes(file) && filenames.includes(file)) {\n      sortedFiles.push(file)\n    }\n  }\n  for (const file of filenames) {\n    if (!sortedFiles.includes(file)) {\n      sortedFiles.push(file)\n      missing += 1\n    }\n  }\n  log.info({coverage: ((total - missing) / total * 100)}, \"ordering files in ASAR archive\")\n  return sortedFiles\n}\n\nfunction copyFileOrData(fileCopier: FileCopier, data: string | Buffer | undefined | null, source: string, destination: string, stats: Stats) {\n  if (data == null) {\n    return fileCopier.copy(source, destination, stats)\n  }\n  else {\n    return writeFile(destination, data)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.computeData = computeData;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function computeData(_x, _x2) {
  return _computeData.apply(this, arguments);
}

function _computeData() {
  _computeData = (0, _bluebirdLst().coroutine)(function* (resourcesPath, options) {
    // sort to produce constant result
    const names = (yield (0, _fsExtraP().readdir)(resourcesPath)).filter(it => it.endsWith(".asar")).sort();
    const checksums = yield _bluebirdLst().default.map(names, it => hashFile(path.join(resourcesPath, it)));
    const result = {};

    for (let i = 0; i < names.length; i++) {
      result[names[i]] = checksums[i];
    }

    return Object.assign({
      checksums: result
    }, options);
  });
  return _computeData.apply(this, arguments);
}

function hashFile(file, algorithm = "sha512", encoding = "base64") {
  return new Promise((resolve, reject) => {
    const hash = (0, _crypto().createHash)(algorithm);
    hash.on("error", reject).setEncoding(encoding);
    (0, _fs().createReadStream)(file).on("error", reject).on("end", () => {
      hash.end();
      resolve(hash.read());
    }).pipe(hash, {
      end: false
    });
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=integrity.js.map{"version":3,"sources":["../../src/asar/integrity.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;;;SAesB,W;;;;;+CAAf,WAA2B,aAA3B,EAAkD,OAAlD,EAAuF;AAC5F;AACA,UAAM,KAAK,GAAG,OAAO,yBAAQ,aAAR,CAAP,EAA+B,MAA/B,CAAsC,EAAE,IAAI,EAAE,CAAC,QAAH,CAAY,OAAZ,CAA5C,EAAkE,IAAlE,EAAd;AACA,UAAM,SAAS,SAAS,uBAAgB,GAAhB,CAAoB,KAApB,EAA2B,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAL,CAAU,aAAV,EAAyB,EAAzB,CAAD,CAAzC,CAAxB;AAEA,UAAM,MAAM,GAA+B,EAA3C;;AACA,SAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,KAAK,CAAC,MAA1B,EAAkC,CAAC,EAAnC,EAAuC;AACrC,MAAA,MAAM,CAAC,KAAK,CAAC,CAAD,CAAN,CAAN,GAAmB,SAAS,CAAC,CAAD,CAA5B;AACD;;AACD,WAAA,MAAA,CAAA,MAAA,CAAA;AAAQ,MAAA,SAAS,EAAE;AAAnB,KAAA,EAA8B,OAA9B,CAAA;AACD,G;;;;AAED,SAAS,QAAT,CAAkB,IAAlB,EAAgC,SAAA,GAAoB,QAApD,EAA8D,QAAA,GAAwC,QAAtG,EAA8G;AAC5G,SAAO,IAAI,OAAJ,CAAoB,CAAC,OAAD,EAAU,MAAV,KAAoB;AAC7C,UAAM,IAAI,GAAG,0BAAW,SAAX,CAAb;AACA,IAAA,IAAI,CACD,EADH,CACM,OADN,EACe,MADf,EAEG,WAFH,CAEe,QAFf;AAIA,gCAAiB,IAAjB,EACG,EADH,CACM,OADN,EACe,MADf,EAEG,EAFH,CAEM,KAFN,EAEa,MAAK;AACd,MAAA,IAAI,CAAC,GAAL;AACA,MAAA,OAAO,CAAC,IAAI,CAAC,IAAL,EAAD,CAAP;AACD,KALH,EAMG,IANH,CAMQ,IANR,EAMc;AAAC,MAAA,GAAG,EAAE;AAAN,KANd;AAOD,GAbM,CAAP;AAcD,C","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { createHash } from \"crypto\"\nimport { createReadStream } from \"fs\"\nimport { readdir } from \"fs-extra-p\"\nimport * as path from \"path\"\n\nexport interface AsarIntegrityOptions {\n  /**\n   * Allows external asar files.\n   *\n   * @default false\n   */\n  readonly externalAllowed?: boolean\n}\n\nexport interface AsarIntegrity extends AsarIntegrityOptions {\n  checksums: { [key: string]: string; }\n}\n\nexport async function computeData(resourcesPath: string, options?: AsarIntegrityOptions | null): Promise<AsarIntegrity> {\n  // sort to produce constant result\n  const names = (await readdir(resourcesPath)).filter(it => it.endsWith(\".asar\")).sort()\n  const checksums = await BluebirdPromise.map(names, it => hashFile(path.join(resourcesPath, it)))\n\n  const result: { [key: string]: string; } = {}\n  for (let i = 0; i < names.length; i++) {\n    result[names[i]] = checksums[i]\n  }\n  return {checksums: result, ...options}\n}\n\nfunction hashFile(file: string, algorithm: string = \"sha512\", encoding: \"hex\" | \"base64\" | \"latin1\" = \"base64\") {\n  return new Promise<string>((resolve, reject) => {\n    const hash = createHash(algorithm)\n    hash\n      .on(\"error\", reject)\n      .setEncoding(encoding)\n\n    createReadStream(file)\n      .on(\"error\", reject)\n      .on(\"end\", () => {\n        hash.end()\n        resolve(hash.read() as string)\n      })\n      .pipe(hash, {end: false})\n  })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isLibOrExe = isLibOrExe;
exports.detectUnpackedDirs = detectUnpackedDirs;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _isbinaryfile() {
  const data = require("isbinaryfile");

  _isbinaryfile = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _fileTransformer() {
  const data = require("../fileTransformer");

  _fileTransformer = function () {
    return data;
  };

  return data;
}

function _appFileCopier() {
  const data = require("../util/appFileCopier");

  _appFileCopier = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function addValue(map, key, value) {
  let list = map.get(key);

  if (list == null) {
    list = [value];
    map.set(key, list);
  } else {
    list.push(value);
  }
}

function isLibOrExe(file) {
  return file.endsWith(".dll") || file.endsWith(".exe") || file.endsWith(".dylib") || file.endsWith(".so");
}
/** @internal */


function detectUnpackedDirs(_x, _x2, _x3, _x4) {
  return _detectUnpackedDirs.apply(this, arguments);
} function _detectUnpackedDirs() {
  _detectUnpackedDirs = (0, _bluebirdLst().coroutine)(function* (fileSet, autoUnpackDirs, unpackedDest, rootForAppFilesWithoutAsar) {
    const dirToCreate = new Map();
    const metadata = fileSet.metadata;

    function addParents(child, root) {
      child = path.dirname(child);

      if (autoUnpackDirs.has(child)) {
        return;
      }

      do {
        autoUnpackDirs.add(child);
        const p = path.dirname(child); // create parent dir to be able to copy file later without directory existence check

        addValue(dirToCreate, p, path.basename(child));

        if (child === root || p === root || autoUnpackDirs.has(p)) {
          break;
        }

        child = p;
      } while (true);

      autoUnpackDirs.add(root);
    }

    for (let i = 0, n = fileSet.files.length; i < n; i++) {
      const file = fileSet.files[i];
      const index = file.lastIndexOf(_fileTransformer().NODE_MODULES_PATTERN);

      if (index < 0) {
        continue;
      }

      let nextSlashIndex = file.indexOf(path.sep, index + _fileTransformer().NODE_MODULES_PATTERN.length + 1);

      if (nextSlashIndex < 0) {
        continue;
      }

      if (file[index + _fileTransformer().NODE_MODULES_PATTERN.length] === "@") {
        nextSlashIndex = file.indexOf(path.sep, nextSlashIndex + 1);
      }

      if (!metadata.get(file).isFile()) {
        continue;
      }

      const packageDir = file.substring(0, nextSlashIndex);
      const packageDirPathInArchive = path.relative(rootForAppFilesWithoutAsar, (0, _appFileCopier().getDestinationPath)(packageDir, fileSet));
      const pathInArchive = path.relative(rootForAppFilesWithoutAsar, (0, _appFileCopier().getDestinationPath)(file, fileSet));

      if (autoUnpackDirs.has(packageDirPathInArchive)) {
        // if package dir is unpacked, any file also unpacked
        addParents(pathInArchive, packageDirPathInArchive);
        continue;
      } // https://github.com/electron-userland/electron-builder/issues/2679


      let shouldUnpack = false; // ffprobe-static and ffmpeg-static are known packages to always unpack

      const moduleName = path.basename(packageDir);

      if (moduleName === "ffprobe-static" || moduleName === "ffmpeg-static" || isLibOrExe(file)) {
        shouldUnpack = true;
      } else if (!file.includes(".", nextSlashIndex) && path.extname(file) === "") {
        shouldUnpack = yield (0, _isbinaryfile().isBinaryFile)(file);
      }

      if (!shouldUnpack) {
        continue;
      }

      if (_builderUtil().log.isDebugEnabled) {
        _builderUtil().log.debug({
          file: pathInArchive,
          reason: "contains executable code"
        }, "not packed into asar archive");
      }

      addParents(pathInArchive, packageDirPathInArchive);
    }

    if (dirToCreate.size > 0) {
      yield (0, _fsExtraP().ensureDir)(unpackedDest + path.sep + "node_modules"); // child directories should be not created asynchronously - parent directories should be created first

      yield _bluebirdLst().default.map(dirToCreate.keys(),
      /*#__PURE__*/
      function () {
        var _ref = (0, _bluebirdLst().coroutine)(function* (parentDir) {
          const base = unpackedDest + path.sep + parentDir;
          yield (0, _fsExtraP().ensureDir)(base);
          yield _bluebirdLst().default.each(dirToCreate.get(parentDir), it => {
            if (dirToCreate.has(parentDir + path.sep + it)) {
              // already created
              return null;
            } else {
              return (0, _fsExtraP().ensureDir)(base + path.sep + it);
            }
          });
        });

        return function (_x5) {
          return _ref.apply(this, arguments);
        };
      }(), _fs().CONCURRENCY);
    }
  });
  return _detectUnpackedDirs.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=unpackDetector.js.map{"version":3,"sources":["../../src/asar/unpackDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { log } from \"builder-util\"\nimport { CONCURRENCY } from \"builder-util/out/fs\"\nimport { ensureDir } from \"fs-extra-p\"\nimport { isBinaryFile } from \"isbinaryfile\"\nimport * as path from \"path\"\nimport { NODE_MODULES_PATTERN } from \"../fileTransformer\"\nimport { getDestinationPath, ResolvedFileSet } from \"../util/appFileCopier\"\n\nfunction addValue(map: Map<string, Array<string>>, key: string, value: string) {\n  let list = map.get(key)\n  if (list == null) {\n    list = [value]\n    map.set(key, list)\n  }\n  else {\n    list.push(value)\n  }\n}\n\nexport function isLibOrExe(file: string): boolean {\n  return file.endsWith(\".dll\") || file.endsWith(\".exe\") || file.endsWith(\".dylib\") || file.endsWith(\".so\")\n}\n\n/** @internal */\nexport async function detectUnpackedDirs(fileSet: ResolvedFileSet, autoUnpackDirs: Set<string>, unpackedDest: string, rootForAppFilesWithoutAsar: string) {\n  const dirToCreate = new Map<string, Array<string>>()\n  const metadata = fileSet.metadata\n\n  function addParents(child: string, root: string) {\n    child = path.dirname(child)\n    if (autoUnpackDirs.has(child)) {\n      return\n    }\n\n    do {\n      autoUnpackDirs.add(child)\n      const p = path.dirname(child)\n      // create parent dir to be able to copy file later without directory existence check\n      addValue(dirToCreate, p, path.basename(child))\n\n      if (child === root || p === root || autoUnpackDirs.has(p)) {\n        break\n      }\n      child = p\n    }\n    while (true)\n\n    autoUnpackDirs.add(root)\n  }\n\n  for (let i = 0, n = fileSet.files.length; i < n; i++) {\n    const file = fileSet.files[i]\n    const index = file.lastIndexOf(NODE_MODULES_PATTERN)\n    if (index < 0) {\n      continue\n    }\n\n    let nextSlashIndex = file.indexOf(path.sep, index + NODE_MODULES_PATTERN.length + 1)\n    if (nextSlashIndex < 0) {\n      continue\n    }\n\n    if (file[index + NODE_MODULES_PATTERN.length] === \"@\") {\n      nextSlashIndex = file.indexOf(path.sep, nextSlashIndex + 1)\n    }\n\n    if (!metadata.get(file)!.isFile()) {\n      continue\n    }\n\n    const packageDir = file.substring(0, nextSlashIndex)\n    const packageDirPathInArchive = path.relative(rootForAppFilesWithoutAsar, getDestinationPath(packageDir, fileSet))\n    const pathInArchive = path.relative(rootForAppFilesWithoutAsar, getDestinationPath(file, fileSet))\n    if (autoUnpackDirs.has(packageDirPathInArchive)) {\n      // if package dir is unpacked, any file also unpacked\n      addParents(pathInArchive, packageDirPathInArchive)\n      continue\n    }\n\n    // https://github.com/electron-userland/electron-builder/issues/2679\n    let shouldUnpack = false\n    // ffprobe-static and ffmpeg-static are known packages to always unpack\n    const moduleName = path.basename(packageDir)\n    if (moduleName ===  \"ffprobe-static\" || moduleName === \"ffmpeg-static\" || isLibOrExe(file)) {\n      shouldUnpack = true\n    }\n    else if (!file.includes(\".\", nextSlashIndex) && path.extname(file) === \"\") {\n      shouldUnpack = await isBinaryFile(file)\n    }\n\n    if (!shouldUnpack) {\n      continue\n    }\n\n    if (log.isDebugEnabled) {\n      log.debug({file: pathInArchive, reason: \"contains executable code\"}, \"not packed into asar archive\")\n    }\n\n    addParents(pathInArchive, packageDirPathInArchive)\n  }\n\n  if (dirToCreate.size > 0) {\n    await ensureDir(unpackedDest + path.sep + \"node_modules\")\n    // child directories should be not created asynchronously - parent directories should be created first\n    await BluebirdPromise.map(dirToCreate.keys(), async parentDir => {\n      const base = unpackedDest + path.sep + parentDir\n      await ensureDir(base)\n      await BluebirdPromise.each(dirToCreate.get(parentDir)!, (it): any => {\n        if (dirToCreate.has(parentDir + path.sep + it)) {\n          // already created\n          return null\n        }\n        else {\n          return ensureDir(base + path.sep + it)\n        }\n      })\n    }, CONCURRENCY)\n  }\n}"],"sourceRoot":""}
kych               _`      8  d  p  Mè  N  Oˆ  Q   Rx  Rø  T  TØ  ^x  ,          L  $          L   Œ   Ð    \  „  ¬  Ô    H  �  Ø   @                      !   %       CSSM_DL_DB_SCHEMA_INFO     D                     !   %      CSSM_DL_DB_SCHEMA_ATTRIBUTES   D                     !   %      CSSM_DL_DB_SCHEMA_INDEXES      H                     !   %       CSSM_DL_DB_SCHEMA_PARSING_MODULE   (                     !   %€          (                     !   %€         (                     !   %€         0                     !   %€ €    DBBlob     D                     !   %      CSSM_DL_DB_RECORD_PUBLIC_KEY   H   	                  !   %      CSSM_DL_DB_RECORD_PRIVATE_KEY      H   
                  !   %      CSSM_DL_DB_RECORD_SYMMETRIC_KEY    L                     !   %€     "CSSM_DL_DB_RECORD_X509_CERTIFICATE                 Z  „         Z  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä  	  	D  	„  	Ä  
  
D  
„  
Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä   @                      -   1   5   9   =€       acct          @                     -   1   5   9   =€       svce          @                     -   1   5   9   =€      acct         @                     -   1   5   9   =€      svce         @                     -   1   5   9   =€      acct          @                     -   1   5   9   =€      vlme          @                     -   1   5   9   =€      addr          @                     -   1   5   9   =€      ssig          @                     -   1   5   9   =€     acct         @   	                  -   1   5   9   =€     vlme         @   
                  -   1   5   9   =€     addr         @                     -   1   5   9   =€     ssig         @                     -   1   5   9   =€      acct          @                     -   1   5   9   =€      sdmn          @                     -   1   5   9   =€      srvr          @                     -   1   5   9   =€      ptcl          @                     -   1   5   9   =€      atyp          @                     -   1   5   9   =€      port          @                     -   1   5   9   =€      path          @                     -   1   5   9   =€     acct         @                     -   1   5   9   =€     	sdmn         @                     -   1   5   9   =€     
srvr         @                     -   1   5   9   =€     ptcl         @                     -   1   5   9   =€     atyp         @                     -   1   5   9   =€     port         @                     -   1   5   9   =€     path         @                     -   1   5   9   =                    @                     -   1   5   9   =                    @                     -   1   5   9   =                    @                     -   1   5   9   =          	          @                     -   1   5   9   =          
          @                     -   1   5   9   =                    @                      -   1   5   9   =                    @   !                  -   1   5   9   =                    @   "                  -   1   5   9   =                  @   #                  -   1   5   9   =                  @   $                  -   1   5   9   =                  @   %                  -   1   5   9   =                  @   &                  -   1   5   9   =                  @   '                  -   1   5   9   =                  @   (                  -   1   5   9   =                  @   )                  -   1   5   9   =                  @   *                  -   1   5   9   =      	            @   +                  -   1   5   9   =      
            @   ,                  -   1   5   9   =                    @   -                  -   1   5   9   =                    @   .                  -   1   5   9   =                    @   /                  -   1   5   9   =          	          @   0                  -   1   5   9   =          
          @   1                  -   1   5   9   =                    @   2                  -   1   5   9   =                    @   3                  -   1   5   9   =                    @   4                  -   1   5   9   =                  @   5                  -   1   5   9   =                  @   6                  -   1   5   9   =                  @   7                  -   1   5   9   =                  @   8                  -   1   5   9   =                  @   9                  -   1   5   9   =                  @   :                  -   1   5   9   =                  @   ;                  -   1   5   9   =                  @   <                  -   1   5   9   =      	            @   =                  -   1   5   9   =      
            @   >                  -   1   5   9   =                    @   ?                  -   1   5   9   =                    @   @                  -   1   5   9   =                    @   A                  -   1   5   9   =          	          @   B                  -   1   5   9   =          
          @   C                  -   1   5   9   =                    @   D                  -   1   5   9   =                    @   E                  -   1   5   9   =                    @   F                  -   1   5   9   =                  @   G                  -   1   5   9   =                  @   H                  -   1   5   9   =                  @   I                  -   1   5   9   =                  @   J                  -   1   5   9   =                  @   K                  -   1   5   9   =                  @   L                  -   1   5   9   =                  @   M                  -   1   5   9   =                  @   N                  -   1   5   9   =      	            @   O                  -   1   5   9   =      
            @   P                  -   1   5   9   =€      ctyp          @   Q                  -   1   5   9   =€      issu          @   R                  -   1   5   9   =€      snbr          @   S                  -   1   5   9   =€     ctyp         @   T                  -   1   5   9   =€     alis         @   U                  -   1   5   9   =€     subj         @   V                  -   1   5   9   =€     issu         @   W                  -   1   5   9   =€     snbr         @   X                  -   1   5   9   =€     skid         @   Y                  -   1   5   9   =€     hpky               2x      ¤  ¬  2p       ¤  ¬  ü  L  œ  ì  D  ˜  ì  @  �  Ü  ,  |  Ô  $  t  À    X  ¬  ì  	,  	l  	¬  	ì  
,  
l  
¼    H  ˆ  È    H  ˆ  È    H  ˆ  È    H  ˆ  Ø  $  d  ¤  ä  $  d  ¤  ä  $  d  ¤  ä  $  d  ¤  ä  $  d  ´     @  €  À     @  €  À     @  €  À    \  ¨  ø  D  ”  à  4  „  Ð  $  x  È    d  ¸    \  ¨  ô  @  ˆ  Ô  $  x  À    X  ¨  ô   D   �   à  !,  !€  !Ð  "  "p  "Ä  #  #`  #°  $  $T  $¨  $ô  %@  %Œ  %Ô  &   &p  &Ä  '  'X  '¤  'ô  (@  (�  (Ü  ),  )x  )Ì  *  *h  *¼  +  +`  +¬  +ü  ,P  ,   ,ô  -@  -Œ  -Ø  .   .l  .¼  /  /X  /¤  /ð  0@  0�  0Ü  1(  1t  1Ä  2   P                      1   5   9   =       M               
RelationID        P                     1   5   9   =       M              RelationName       P                     1   5   9   =       M              
RelationID        P                     1   5   9   =       M             AttributeID       X                     1   5   9   =       U             AttributeNameFormat       T                     1   5   9   =       Q             AttributeName          T                     1   5   9   =       Q             AttributeNameID       T                     1   5   9   =       Q             AttributeFormat       P                     1   5   9   =       M              
RelationID        L   	                  1   5   9   =       I             IndexID       P   
                  1   5   9   =       M             AttributeID       P                     1   5   9   =       M             	IndexType         X                     1   5   9   =       U             IndexedDataLocation       P                     1   5   9   =       M              
RelationID        P                     1   5   9   =       M             AttributeID       L                     1   5   9   =       I             ModuleID      P                     1   5   9   =       M             AddinVersion       H                     1   5   9   =       E             SSID      T                     1   5   9   =       Q             SubserviceType        @                     1   5   9           =€   cdat         @                     1   5   9           =€   mdat         @                     1   5   9           =€   desc         @                     1   5   9           =€   icmt         @                     1   5   9           =€   crtr         @                     1   5   9           =€   type         @                     1   5   9           =€   scrp         P                     1   5   9   =       M€             	PrintName         L                     1   5   9   =       I€             Alias         @                     1   5   9           =€   invi         @                     1   5   9           =€   nega         @                     1   5   9           =€   cusi         @                     1   5   9           =€   prot         @                      1   5   9           =€   acct         @   !                  1   5   9           =€   svce         @   "                  1   5   9           =€   gena         @   #                  1   5   9           =€  cdat         @   $                  1   5   9           =€  mdat         @   %                  1   5   9           =€  desc         @   &                  1   5   9           =€  icmt         @   '                  1   5   9           =€  crtr         @   (                  1   5   9           =€  type         @   )                  1   5   9           =€  scrp         P   *                  1   5   9   =       M€            	PrintName         L   +                  1   5   9   =       I€            Alias         @   ,                  1   5   9           =€  invi         @   -                  1   5   9           =€  nega         @   .                  1   5   9           =€  cusi         @   /                  1   5   9           =€  prot         @   0                  1   5   9           =€  acct         @   1                  1   5   9           =€  vlme         @   2                  1   5   9           =€  srvr         @   3                  1   5   9           =€  ptcl         @   4                  1   5   9           =€  addr         @   5                  1   5   9           =€  ssig         @   6                  1   5   9           =€  cdat         @   7                  1   5   9           =€  mdat         @   8                  1   5   9           =€  desc         @   9                  1   5   9           =€  icmt         @   :                  1   5   9           =€  crtr         @   ;                  1   5   9           =€  type         @   <                  1   5   9           =€  scrp         P   =                  1   5   9   =       M€            	PrintName         L   >                  1   5   9   =       I€            Alias         @   ?                  1   5   9           =€  invi         @   @                  1   5   9           =€  nega         @   A                  1   5   9           =€  cusi         @   B                  1   5   9           =€  prot         @   C                  1   5   9           =€  acct         @   D                  1   5   9           =€  sdmn         @   E                  1   5   9           =€  srvr         @   F                  1   5   9           =€  ptcl         @   G                  1   5   9           =€  atyp         @   H                  1   5   9           =€  port         @   I                  1   5   9           =€  path         L   J                  1   5   9   =       I             KeyClass      P   K                  1   5   9   =       M            	PrintName         L   L                  1   5   9   =       I            Alias         P   M                  1   5   9   =       M            	Permanent         L   N                  1   5   9   =       I            Private       P   O                  1   5   9   =       M            
Modifiable        L   P                  1   5   9   =       I            Label         T   Q                  1   5   9   =       Q            ApplicationTag        P   R                  1   5   9   =       M            
KeyCreator        L   S                  1   5   9   =       I      	      KeyType       T   T                  1   5   9   =       Q      
      KeySizeInBits         T   U                  1   5   9   =       Q            EffectiveKeySize      P   V                  1   5   9   =       M            	StartDate         L   W                  1   5   9   =       I            EndDate       P   X                  1   5   9   =       M            	Sensitive         T   Y                  1   5   9   =       Q            AlwaysSensitive       P   Z                  1   5   9   =       M            Extractable       T   [                  1   5   9   =       Q            NeverExtractable      L   \                  1   5   9   =       I            Encrypt       L   ]                  1   5   9   =       I            Decrypt       L   ^                  1   5   9   =       I            Derive        H   _                  1   5   9   =       E            Sign      L   `                  1   5   9   =       I            Verify        P   a                  1   5   9   =       M            SignRecover       T   b                  1   5   9   =       Q            VerifyRecover         H   c                  1   5   9   =       E            Wrap      L   d                  1   5   9   =       I            Unwrap        L   e                  1   5   9   =       I             KeyClass      P   f                  1   5   9   =       M            	PrintName         L   g                  1   5   9   =       I            Alias         P   h                  1   5   9   =       M            	Permanent         L   i                  1   5   9   =       I            Private       P   j                  1   5   9   =       M            
Modifiable        L   k                  1   5   9   =       I            Label         T   l                  1   5   9   =       Q            ApplicationTag        P   m                  1   5   9   =       M            
KeyCreator        L   n                  1   5   9   =       I      	      KeyType       T   o                  1   5   9   =       Q      
      KeySizeInBits         T   p                  1   5   9   =       Q            EffectiveKeySize      P   q                  1   5   9   =       M            	StartDate         L   r                  1   5   9   =       I            EndDate       P   s                  1   5   9   =       M            	Sensitive         T   t                  1   5   9   =       Q            AlwaysSensitive       P   u                  1   5   9   =       M            Extractable       T   v                  1   5   9   =       Q            NeverExtractable      L   w                  1   5   9   =       I            Encrypt       L   x                  1   5   9   =       I            Decrypt       L   y                  1   5   9   =       I            Derive        H   z                  1   5   9   =       E            Sign      L   {                  1   5   9   =       I            Verify        P   |                  1   5   9   =       M            SignRecover       T   }                  1   5   9   =       Q            VerifyRecover         H   ~                  1   5   9   =       E            Wrap      L                     1   5   9   =       I            Unwrap        L   €                  1   5   9   =       I             KeyClass      P   �                  1   5   9   =       M            	PrintName         L   ‚                  1   5   9   =       I            Alias         P   ƒ                  1   5   9   =       M            	Permanent         L   „                  1   5   9   =       I            Private       P   …                  1   5   9   =       M            
Modifiable        L   †                  1   5   9   =       I            Label         T   ‡                  1   5   9   =       Q            ApplicationTag        P   ˆ                  1   5   9   =       M            
KeyCreator        L   ‰                  1   5   9   =       I      	      KeyType       T   Š                  1   5   9   =       Q      
      KeySizeInBits         T   ‹                  1   5   9   =       Q            EffectiveKeySize      P   Œ                  1   5   9   =       M            	StartDate         L   �                  1   5   9   =       I            EndDate       P   Ž                  1   5   9   =       M            	Sensitive         T   �                  1   5   9   =       Q            AlwaysSensitive       P   �                  1   5   9   =       M            Extractable       T   ‘                  1   5   9   =       Q            NeverExtractable      L   ’                  1   5   9   =       I            Encrypt       L   “                  1   5   9   =       I            Decrypt       L   ”                  1   5   9   =       I            Derive        H   •                  1   5   9   =       E            Sign      L   –                  1   5   9   =       I            Verify        P   —                  1   5   9   =       M            SignRecover       T   ˜                  1   5   9   =       Q            VerifyRecover         H   ™                  1   5   9   =       E            Wrap      L   š                  1   5   9   =       I            Unwrap        L   ›                  1   5   9   =       I€  ctyp      CertType      P   œ                  1   5   9   =       M€  cenc      CertEncoding      P   �                  1   5   9   =       M€  labl      	PrintName         L   ž                  1   5   9   =       I€  alis      Alias         L   Ÿ                  1   5   9   =       I€  subj      Subject       L                      1   5   9   =       I€  issu      Issuer        P   ¡                  1   5   9   =       M€  snbr      SerialNumber      X   ¢                  1   5   9   =       U€  skid      SubjectKeyIdentifier      T   £                  1   5   9   =       Q€  hpky      PublicKeyHash                (                                  x                           X      T   ˆ       ¸   Ð   è       0  H  `   4                      	   
                                                                                                                                                                                   	                    
                x                           X      T   ˆ       ¸   Ð   è       0  H  `   4                      	   
                                                                                                                                                                                   	                    
                x                           X      T   ˆ       ¸   Ð   è       0  H  `   4                      	   
                                                                                                                                                                                   	                    
                 €€                            `      4   P   h             acctsvce                 acct                 svce       €                                 H   x   �   ¨   À   Ø   ð     0          acctsdmnsrvrptclatypportpath                 acct          	       sdmn          
       srvr                 ptcl                 atyp                 port                 path       À€                                  <   `   x   �   ¨   $          acctvlmeaddrssig                 acct                 vlme                 addr                 ssig      	 €           P             0             &      e  i  m  ­  í  �  õ    0‚"0‚
 Þ¼Ä9m 0	*†H†÷ 0b10	UUS10U

Apple Inc.1&0$UApple Certification Authority10UApple Root CA0130207214847Z230207214847Z0�–10	UUS10U

Apple Inc.1,0*U#Apple Worldwide Developer Relations1D0BU;Apple Worldwide Developer Relations Certification Authority0‚"0	*†H†÷ ‚ 0‚
‚ Ê8T¦ËVªÈ$9HéŒîì_¸&‘¼4SzÎ|c€awd^¥#¶9þP-VXp-~ÄnÁJ…>/ðÞ„¡WÉ¯{ÿjúI¬ªÛ*2í–chR=ŒŠì¿k•à¬}—gÎ…•7jí	¶®gÍQdŸÆ\Ñ¼Wng5€v6¤‡�n8�Ø+N{%ØZ¿NƒÁ�Ò“Õqµ`œ�3NUùX†¸ÁåwE�PHº+-ä”…áèÄ�Æh¥°£üg~pºYKwB‘9¹õÍáLïÀ;HŒ¦å!]ýjj»§5`Òæ­óF)ÉèÃ‹éyÀjag²ðýåh¼b_nÏ™Ýïcþ’e« £�¦0�£0Uˆ'	©¶`‹ìëºöGYÅRT£·0Uÿ0ÿ0U#0€+ÐiG”v	þôk�.@¦÷GM^0.U'0%0# ! †http://crl.apple.com/root.crl0Uÿ†0
*†H†÷cd 0	*†H†÷ ‚ OÏïY¾,õ²l/�î‡2è5¨n‹}Éi¹Ù¼w,Ôgâýšm:Y\ßƒ½²®*ar±¯ÍÃE0�£ƒÎG´ñ“Š£t›¤Ã˜r‡;>¯E’T¹2»�Sk
N¶ÙPl!€
‰NWŒk[<=¦ýÞ÷#J&‡?º‘’L¤mWõzX‡{hŠä†ŒJëâIª¥ÝU ©®»K0®á ±¼)€æ	wå¾4¢ÊÜâ
æ;¸»ìºb•ócA‚Í;L•¤Û«ùÉ•éOäMç&™�é¼ù´)Òzfá.Œö!ŠÅøxá�®¿Ó��©­ó¯ý8–g0Q¥\ìqŠ‚´l           ;Apple Worldwide Developer Relations Certification Authority    ;Apple Worldwide Developer Relations Certification Authority    ™0�–10	UUS10U

Apple Inc.1,0*U#Apple Worldwide Developer Relations1D0BU;Apple Worldwide Developer Relations Certification Authority      d0b10	UUS10U

APPLE INC.1&0$UAPPLE CERTIFICATION AUTHORITY10UAPPLE ROOT CA   Þ¼Ä9m    ˆ'	©¶`‹ìëºöGYÅRT£·   ˆ'	©¶`‹ìëºöGYÅRT£·  P     x    D  ¨  l  ø  	(  	d   ¤          ctypissusnbr             x      d0b10	UUS10U

APPLE INC.1&0$UAPPLE CERTIFICATION AUTHORITY10UAPPLE ROOT CA   Þ¼Ä9m    (          ctyp     <             d          alis     d       @   ;Apple Worldwide Developer Relations Certification Authority    Ä          subj     È           ™0�–10	UUS10U

Apple Inc.1,0*U#Apple Worldwide Developer Relations1D0BU;Apple Worldwide Developer Relations Certification Authority      Œ          issu     Œ       h   d0b10	UUS10U

APPLE INC.1&0$UAPPLE CERTIFICATION AUTHORITY10UAPPLE ROOT CA   0          snbr     	          Þ¼Ä9m    <          skid     	H          ˆ'	©¶`‹ìëºöGYÅRT£·   <          hpky     	„          ˆ'	©¶`‹ìëºöGYÅRT£·   è€ €           à              À             ¨    úÞ      x   ¨’ž8ºâX‡¬*½êHþ5    ÿÿÿ   ßa #åuÁ]rþöÄ‚¥1ÒíËð<®¶{Í´p�ÀªƒûL¥±Ž‹«1]\®=                  ser   ½!ãÓfÒ¡sßIŸ%bÃ¬TKuG²£‘—ß€xR†'	ûÃç#u'ƒvÉ          (The MIT License)

Copyright (C) 2012 by Vitaly Puzrin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'use strict';

module.exports = require('./lib/argparse');
{
  "dependencies": {
    "sprintf-js": "~1.0.2"
  },
  "deprecated": false,
  "description": "Very powerful CLI arguments parser. Native port of argparse - python's options parsing library",
  "devDependencies": {
    "eslint": "^2.13.1",
    "istanbul": "^0.4.5",
    "mocha": "^3.1.0",
    "ndoc": "^5.0.1"
  },
  "files": [
    "index.js",
    "lib/"
  ],
  "homepage": "https://github.com/nodeca/argparse#readme",
  "license": "MIT",
  "name": "argparse",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/nodeca/argparse.git"
  },
  "version": "1.0.10"
}/**
 * class Action
 *
 * Base class for all actions
 * Do not call in your code, use this class only for inherits your own action
 *
 * Information about how to convert command line strings to Javascript objects.
 * Action objects are used by an ArgumentParser to represent the information
 * needed to parse a single argument from one or more strings from the command
 * line. The keyword arguments to the Action constructor are also all attributes
 * of Action instances.
 *
 * ##### Allowed keywords:
 *
 * - `store`
 * - `storeConstant`
 * - `storeTrue`
 * - `storeFalse`
 * - `append`
 * - `appendConstant`
 * - `count`
 * - `help`
 * - `version`
 *
 * Information about action options see [[Action.new]]
 *
 * See also [original guide](http://docs.python.org/dev/library/argparse.html#action)
 *
 **/

'use strict';


// Constants
var c = require('./const');


/**
 * new Action(options)
 *
 * Base class for all actions. Used only for inherits
 *
 *
 * ##### Options:
 *
 * - `optionStrings`  A list of command-line option strings for the action.
 * - `dest`  Attribute to hold the created object(s)
 * - `nargs`  The number of command-line arguments that should be consumed.
 * By default, one argument will be consumed and a single value will be
 * produced.
 * - `constant`  Default value for an action with no value.
 * - `defaultValue`  The value to be produced if the option is not specified.
 * - `type`  Cast to 'string'|'int'|'float'|'complex'|function (string). If
 * None, 'string'.
 * - `choices`  The choices available.
 * - `required`  True if the action must always be specified at the command
 * line.
 * - `help`  The help describing the argument.
 * - `metavar`  The name to be used for the option's argument with the help
 * string. If None, the 'dest' value will be used as the name.
 *
 * ##### nargs supported values:
 *
 * - `N` (an integer) consumes N arguments (and produces a list)
 * - `?`  consumes zero or one arguments
 * - `*` consumes zero or more arguments (and produces a list)
 * - `+` consumes one or more arguments (and produces a list)
 *
 * Note: that the difference between the default and nargs=1 is that with the
 * default, a single value will be produced, while with nargs=1, a list
 * containing a single value will be produced.
 **/
var Action = module.exports = function Action(options) {
  options = options || {};
  this.optionStrings = options.optionStrings || [];
  this.dest = options.dest;
  this.nargs = typeof options.nargs !== 'undefined' ? options.nargs : null;
  this.constant = typeof options.constant !== 'undefined' ? options.constant : null;
  this.defaultValue = options.defaultValue;
  this.type = typeof options.type !== 'undefined' ? options.type : null;
  this.choices = typeof options.choices !== 'undefined' ? options.choices : null;
  this.required = typeof options.required !== 'undefined' ? options.required : false;
  this.help = typeof options.help !== 'undefined' ? options.help : null;
  this.metavar = typeof options.metavar !== 'undefined' ? options.metavar : null;

  if (!(this.optionStrings instanceof Array)) {
    throw new Error('optionStrings should be an array');
  }
  if (typeof this.required !== 'undefined' && typeof this.required !== 'boolean') {
    throw new Error('required should be a boolean');
  }
};

/**
 * Action#getName -> String
 *
 * Tells action name
 **/
Action.prototype.getName = function () {
  if (this.optionStrings.length > 0) {
    return this.optionStrings.join('/');
  } else if (this.metavar !== null && this.metavar !== c.SUPPRESS) {
    return this.metavar;
  } else if (typeof this.dest !== 'undefined' && this.dest !== c.SUPPRESS) {
    return this.dest;
  }
  return null;
};

/**
 * Action#isOptional -> Boolean
 *
 * Return true if optional
 **/
Action.prototype.isOptional = function () {
  return !this.isPositional();
};

/**
 * Action#isPositional -> Boolean
 *
 * Return true if positional
 **/
Action.prototype.isPositional = function () {
  return (this.optionStrings.length === 0);
};

/**
 * Action#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Should be implemented in inherited classes
 *
 * ##### Example
 *
 *      ActionCount.prototype.call = function (parser, namespace, values, optionString) {
 *        namespace.set(this.dest, (namespace[this.dest] || 0) + 1);
 *      };
 *
 **/
Action.prototype.call = function () {
  throw new Error('.call() not defined');// Not Implemented error
};
/** internal
 * class ActionContainer
 *
 * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]]
 **/

'use strict';

var format = require('util').format;

// Constants
var c = require('./const');

var $$ = require('./utils');

//Actions
var ActionHelp = require('./action/help');
var ActionAppend = require('./action/append');
var ActionAppendConstant = require('./action/append/constant');
var ActionCount = require('./action/count');
var ActionStore = require('./action/store');
var ActionStoreConstant = require('./action/store/constant');
var ActionStoreTrue = require('./action/store/true');
var ActionStoreFalse = require('./action/store/false');
var ActionVersion = require('./action/version');
var ActionSubparsers = require('./action/subparsers');

// Errors
var argumentErrorHelper = require('./argument/error');

/**
 * new ActionContainer(options)
 *
 * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]]
 *
 * ##### Options:
 *
 * - `description` -- A description of what the program does
 * - `prefixChars`  -- Characters that prefix optional arguments
 * - `argumentDefault`  -- The default value for all arguments
 * - `conflictHandler` -- The conflict handler to use for duplicate arguments
 **/
var ActionContainer = module.exports = function ActionContainer(options) {
  options = options || {};

  this.description = options.description;
  this.argumentDefault = options.argumentDefault;
  this.prefixChars = options.prefixChars || '';
  this.conflictHandler = options.conflictHandler;

  // set up registries
  this._registries = {};

  // register actions
  this.register('action', null, ActionStore);
  this.register('action', 'store', ActionStore);
  this.register('action', 'storeConst', ActionStoreConstant);
  this.register('action', 'storeTrue', ActionStoreTrue);
  this.register('action', 'storeFalse', ActionStoreFalse);
  this.register('action', 'append', ActionAppend);
  this.register('action', 'appendConst', ActionAppendConstant);
  this.register('action', 'count', ActionCount);
  this.register('action', 'help', ActionHelp);
  this.register('action', 'version', ActionVersion);
  this.register('action', 'parsers', ActionSubparsers);

  // raise an exception if the conflict handler is invalid
  this._getHandler();

  // action storage
  this._actions = [];
  this._optionStringActions = {};

  // groups
  this._actionGroups = [];
  this._mutuallyExclusiveGroups = [];

  // defaults storage
  this._defaults = {};

  // determines whether an "option" looks like a negative number
  // -1, -1.5 -5e+4
  this._regexpNegativeNumber = new RegExp('^[-]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$');

  // whether or not there are any optionals that look like negative
  // numbers -- uses a list so it can be shared and edited
  this._hasNegativeNumberOptionals = [];
};

// Groups must be required, then ActionContainer already defined
var ArgumentGroup = require('./argument/group');
var MutuallyExclusiveGroup = require('./argument/exclusive');

//
// Registration methods
//

/**
 * ActionContainer#register(registryName, value, object) -> Void
 * - registryName (String) : object type action|type
 * - value (string) : keyword
 * - object (Object|Function) : handler
 *
 *  Register handlers
 **/
ActionContainer.prototype.register = function (registryName, value, object) {
  this._registries[registryName] = this._registries[registryName] || {};
  this._registries[registryName][value] = object;
};

ActionContainer.prototype._registryGet = function (registryName, value, defaultValue) {
  if (arguments.length < 3) {
    defaultValue = null;
  }
  return this._registries[registryName][value] || defaultValue;
};

//
// Namespace default accessor methods
//

/**
 * ActionContainer#setDefaults(options) -> Void
 * - options (object):hash of options see [[Action.new]]
 *
 * Set defaults
 **/
ActionContainer.prototype.setDefaults = function (options) {
  options = options || {};
  for (var property in options) {
    if ($$.has(options, property)) {
      this._defaults[property] = options[property];
    }
  }

  // if these defaults match any existing arguments, replace the previous
  // default on the object with the new one
  this._actions.forEach(function (action) {
    if ($$.has(options, action.dest)) {
      action.defaultValue = options[action.dest];
    }
  });
};

/**
 * ActionContainer#getDefault(dest) -> Mixed
 * - dest (string): action destination
 *
 * Return action default value
 **/
ActionContainer.prototype.getDefault = function (dest) {
  var result = $$.has(this._defaults, dest) ? this._defaults[dest] : null;

  this._actions.forEach(function (action) {
    if (action.dest === dest && $$.has(action, 'defaultValue')) {
      result = action.defaultValue;
    }
  });

  return result;
};
//
// Adding argument actions
//

/**
 * ActionContainer#addArgument(args, options) -> Object
 * - args (String|Array): argument key, or array of argument keys
 * - options (Object): action objects see [[Action.new]]
 *
 * #### Examples
 * - addArgument([ '-f', '--foo' ], { action: 'store', defaultValue: 1, ... })
 * - addArgument([ 'bar' ], { action: 'store', nargs: 1, ... })
 * - addArgument('--baz', { action: 'store', nargs: 1, ... })
 **/
ActionContainer.prototype.addArgument = function (args, options) {
  args = args;
  options = options || {};

  if (typeof args === 'string') {
    args = [ args ];
  }
  if (!Array.isArray(args)) {
    throw new TypeError('addArgument first argument should be a string or an array');
  }
  if (typeof options !== 'object' || Array.isArray(options)) {
    throw new TypeError('addArgument second argument should be a hash');
  }

  // if no positional args are supplied or only one is supplied and
  // it doesn't look like an option string, parse a positional argument
  if (!args || args.length === 1 && this.prefixChars.indexOf(args[0][0]) < 0) {
    if (args && !!options.dest) {
      throw new Error('dest supplied twice for positional argument');
    }
    options = this._getPositional(args, options);

    // otherwise, we're adding an optional argument
  } else {
    options = this._getOptional(args, options);
  }

  // if no default was supplied, use the parser-level default
  if (typeof options.defaultValue === 'undefined') {
    var dest = options.dest;
    if ($$.has(this._defaults, dest)) {
      options.defaultValue = this._defaults[dest];
    } else if (typeof this.argumentDefault !== 'undefined') {
      options.defaultValue = this.argumentDefault;
    }
  }

  // create the action object, and add it to the parser
  var ActionClass = this._popActionClass(options);
  if (typeof ActionClass !== 'function') {
    throw new Error(format('Unknown action "%s".', ActionClass));
  }
  var action = new ActionClass(options);

  // throw an error if the action type is not callable
  var typeFunction = this._registryGet('type', action.type, action.type);
  if (typeof typeFunction !== 'function') {
    throw new Error(format('"%s" is not callable', typeFunction));
  }

  return this._addAction(action);
};

/**
 * ActionContainer#addArgumentGroup(options) -> ArgumentGroup
 * - options (Object): hash of options see [[ArgumentGroup.new]]
 *
 * Create new arguments groups
 **/
ActionContainer.prototype.addArgumentGroup = function (options) {
  var group = new ArgumentGroup(this, options);
  this._actionGroups.push(group);
  return group;
};

/**
 * ActionContainer#addMutuallyExclusiveGroup(options) -> ArgumentGroup
 * - options (Object): {required: false}
 *
 * Create new mutual exclusive groups
 **/
ActionContainer.prototype.addMutuallyExclusiveGroup = function (options) {
  var group = new MutuallyExclusiveGroup(this, options);
  this._mutuallyExclusiveGroups.push(group);
  return group;
};

ActionContainer.prototype._addAction = function (action) {
  var self = this;

  // resolve any conflicts
  this._checkConflict(action);

  // add to actions list
  this._actions.push(action);
  action.container = this;

  // index the action by any option strings it has
  action.optionStrings.forEach(function (optionString) {
    self._optionStringActions[optionString] = action;
  });

  // set the flag if any option strings look like negative numbers
  action.optionStrings.forEach(function (optionString) {
    if (optionString.match(self._regexpNegativeNumber)) {
      if (!self._hasNegativeNumberOptionals.some(Boolean)) {
        self._hasNegativeNumberOptionals.push(true);
      }
    }
  });

  // return the created action
  return action;
};

ActionContainer.prototype._removeAction = function (action) {
  var actionIndex = this._actions.indexOf(action);
  if (actionIndex >= 0) {
    this._actions.splice(actionIndex, 1);
  }
};

ActionContainer.prototype._addContainerActions = function (container) {
  // collect groups by titles
  var titleGroupMap = {};
  this._actionGroups.forEach(function (group) {
    if (titleGroupMap[group.title]) {
      throw new Error(format('Cannot merge actions - two groups are named "%s".', group.title));
    }
    titleGroupMap[group.title] = group;
  });

  // map each action to its group
  var groupMap = {};
  function actionHash(action) {
    // unique (hopefully?) string suitable as dictionary key
    return action.getName();
  }
  container._actionGroups.forEach(function (group) {
    // if a group with the title exists, use that, otherwise
    // create a new group matching the container's group
    if (!titleGroupMap[group.title]) {
      titleGroupMap[group.title] = this.addArgumentGroup({
        title: group.title,
        description: group.description
      });
    }

    // map the actions to their new group
    group._groupActions.forEach(function (action) {
      groupMap[actionHash(action)] = titleGroupMap[group.title];
    });
  }, this);

  // add container's mutually exclusive groups
  // NOTE: if add_mutually_exclusive_group ever gains title= and
  // description= then this code will need to be expanded as above
  var mutexGroup;
  container._mutuallyExclusiveGroups.forEach(function (group) {
    mutexGroup = this.addMutuallyExclusiveGroup({
      required: group.required
    });
    // map the actions to their new mutex group
    group._groupActions.forEach(function (action) {
      groupMap[actionHash(action)] = mutexGroup;
    });
  }, this);  // forEach takes a 'this' argument

  // add all actions to this container or their group
  container._actions.forEach(function (action) {
    var key = actionHash(action);
    if (groupMap[key]) {
      groupMap[key]._addAction(action);
    } else {
      this._addAction(action);
    }
  });
};

ActionContainer.prototype._getPositional = function (dest, options) {
  if (Array.isArray(dest)) {
    dest = dest[0];
  }
  // make sure required is not specified
  if (options.required) {
    throw new Error('"required" is an invalid argument for positionals.');
  }

  // mark positional arguments as required if at least one is
  // always required
  if (options.nargs !== c.OPTIONAL && options.nargs !== c.ZERO_OR_MORE) {
    options.required = true;
  }
  if (options.nargs === c.ZERO_OR_MORE && typeof options.defaultValue === 'undefined') {
    options.required = true;
  }

  // return the keyword arguments with no option strings
  options.dest = dest;
  options.optionStrings = [];
  return options;
};

ActionContainer.prototype._getOptional = function (args, options) {
  var prefixChars = this.prefixChars;
  var optionStrings = [];
  var optionStringsLong = [];

  // determine short and long option strings
  args.forEach(function (optionString) {
    // error on strings that don't start with an appropriate prefix
    if (prefixChars.indexOf(optionString[0]) < 0) {
      throw new Error(format('Invalid option string "%s": must start with a "%s".',
        optionString,
        prefixChars
      ));
    }

    // strings starting with two prefix characters are long options
    optionStrings.push(optionString);
    if (optionString.length > 1 && prefixChars.indexOf(optionString[1]) >= 0) {
      optionStringsLong.push(optionString);
    }
  });

  // infer dest, '--foo-bar' -> 'foo_bar' and '-x' -> 'x'
  var dest = options.dest || null;
  delete options.dest;

  if (!dest) {
    var optionStringDest = optionStringsLong.length ? optionStringsLong[0] : optionStrings[0];
    dest = $$.trimChars(optionStringDest, this.prefixChars);

    if (dest.length === 0) {
      throw new Error(
        format('dest= is required for options like "%s"', optionStrings.join(', '))
      );
    }
    dest = dest.replace(/-/g, '_');
  }

  // return the updated keyword arguments
  options.dest = dest;
  options.optionStrings = optionStrings;

  return options;
};

ActionContainer.prototype._popActionClass = function (options, defaultValue) {
  defaultValue = defaultValue || null;

  var action = (options.action || defaultValue);
  delete options.action;

  var actionClass = this._registryGet('action', action, action);
  return actionClass;
};

ActionContainer.prototype._getHandler = function () {
  var handlerString = this.conflictHandler;
  var handlerFuncName = '_handleConflict' + $$.capitalize(handlerString);
  var func = this[handlerFuncName];
  if (typeof func === 'undefined') {
    var msg = 'invalid conflict resolution value: ' + handlerString;
    throw new Error(msg);
  } else {
    return func;
  }
};

ActionContainer.prototype._checkConflict = function (action) {
  var optionStringActions = this._optionStringActions;
  var conflictOptionals = [];

  // find all options that conflict with this option
  // collect pairs, the string, and an existing action that it conflicts with
  action.optionStrings.forEach(function (optionString) {
    var conflOptional = optionStringActions[optionString];
    if (typeof conflOptional !== 'undefined') {
      conflictOptionals.push([ optionString, conflOptional ]);
    }
  });

  if (conflictOptionals.length > 0) {
    var conflictHandler = this._getHandler();
    conflictHandler.call(this, action, conflictOptionals);
  }
};

ActionContainer.prototype._handleConflictError = function (action, conflOptionals) {
  var conflicts = conflOptionals.map(function (pair) { return pair[0]; });
  conflicts = conflicts.join(', ');
  throw argumentErrorHelper(
    action,
    format('Conflicting option string(s): %s', conflicts)
  );
};

ActionContainer.prototype._handleConflictResolve = function (action, conflOptionals) {
  // remove all conflicting options
  var self = this;
  conflOptionals.forEach(function (pair) {
    var optionString = pair[0];
    var conflictingAction = pair[1];
    // remove the conflicting option string
    var i = conflictingAction.optionStrings.indexOf(optionString);
    if (i >= 0) {
      conflictingAction.optionStrings.splice(i, 1);
    }
    delete self._optionStringActions[optionString];
    // if the option now has no option string, remove it from the
    // container holding it
    if (conflictingAction.optionStrings.length === 0) {
      conflictingAction.container._removeAction(conflictingAction);
    }
  });
};
'use strict';

module.exports.ArgumentParser = require('./argument_parser.js');
module.exports.Namespace = require('./namespace');
module.exports.Action = require('./action');
module.exports.HelpFormatter = require('./help/formatter.js');
module.exports.Const = require('./const.js');

module.exports.ArgumentDefaultsHelpFormatter =
  require('./help/added_formatters.js').ArgumentDefaultsHelpFormatter;
module.exports.RawDescriptionHelpFormatter =
  require('./help/added_formatters.js').RawDescriptionHelpFormatter;
module.exports.RawTextHelpFormatter =
  require('./help/added_formatters.js').RawTextHelpFormatter;
/**
 * class ArgumentParser
 *
 * Object for parsing command line strings into js objects.
 *
 * Inherited from [[ActionContainer]]
 **/
'use strict';

var util    = require('util');
var format  = require('util').format;
var Path    = require('path');
var sprintf = require('sprintf-js').sprintf;

// Constants
var c = require('./const');

var $$ = require('./utils');

var ActionContainer = require('./action_container');

// Errors
var argumentErrorHelper = require('./argument/error');

var HelpFormatter = require('./help/formatter');

var Namespace = require('./namespace');


/**
 * new ArgumentParser(options)
 *
 * Create a new ArgumentParser object.
 *
 * ##### Options:
 * - `prog`  The name of the program (default: Path.basename(process.argv[1]))
 * - `usage`  A usage message (default: auto-generated from arguments)
 * - `description`  A description of what the program does
 * - `epilog`  Text following the argument descriptions
 * - `parents`  Parsers whose arguments should be copied into this one
 * - `formatterClass`  HelpFormatter class for printing help messages
 * - `prefixChars`  Characters that prefix optional arguments
 * - `fromfilePrefixChars` Characters that prefix files containing additional arguments
 * - `argumentDefault`  The default value for all arguments
 * - `addHelp`  Add a -h/-help option
 * - `conflictHandler`  Specifies how to handle conflicting argument names
 * - `debug`  Enable debug mode. Argument errors throw exception in
 *   debug mode and process.exit in normal. Used for development and
 *   testing (default: false)
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#argumentparser-objects
 **/
function ArgumentParser(options) {
  if (!(this instanceof ArgumentParser)) {
    return new ArgumentParser(options);
  }
  var self = this;
  options = options || {};

  options.description = (options.description || null);
  options.argumentDefault = (options.argumentDefault || null);
  options.prefixChars = (options.prefixChars || '-');
  options.conflictHandler = (options.conflictHandler || 'error');
  ActionContainer.call(this, options);

  options.addHelp = typeof options.addHelp === 'undefined' || !!options.addHelp;
  options.parents = options.parents || [];
  // default program name
  options.prog = (options.prog || Path.basename(process.argv[1]));
  this.prog = options.prog;
  this.usage = options.usage;
  this.epilog = options.epilog;
  this.version = options.version;

  this.debug = (options.debug === true);

  this.formatterClass = (options.formatterClass || HelpFormatter);
  this.fromfilePrefixChars = options.fromfilePrefixChars || null;
  this._positionals = this.addArgumentGroup({ title: 'Positional arguments' });
  this._optionals = this.addArgumentGroup({ title: 'Optional arguments' });
  this._subparsers = null;

  // register types
  function FUNCTION_IDENTITY(o) {
    return o;
  }
  this.register('type', 'auto', FUNCTION_IDENTITY);
  this.register('type', null, FUNCTION_IDENTITY);
  this.register('type', 'int', function (x) {
    var result = parseInt(x, 10);
    if (isNaN(result)) {
      throw new Error(x + ' is not a valid integer.');
    }
    return result;
  });
  this.register('type', 'float', function (x) {
    var result = parseFloat(x);
    if (isNaN(result)) {
      throw new Error(x + ' is not a valid float.');
    }
    return result;
  });
  this.register('type', 'string', function (x) {
    return '' + x;
  });

  // add help and version arguments if necessary
  var defaultPrefix = (this.prefixChars.indexOf('-') > -1) ? '-' : this.prefixChars[0];
  if (options.addHelp) {
    this.addArgument(
      [ defaultPrefix + 'h', defaultPrefix + defaultPrefix + 'help' ],
      {
        action: 'help',
        defaultValue: c.SUPPRESS,
        help: 'Show this help message and exit.'
      }
    );
  }
  if (typeof this.version !== 'undefined') {
    this.addArgument(
      [ defaultPrefix + 'v', defaultPrefix + defaultPrefix + 'version' ],
      {
        action: 'version',
        version: this.version,
        defaultValue: c.SUPPRESS,
        help: "Show program's version number and exit."
      }
    );
  }

  // add parent arguments and defaults
  options.parents.forEach(function (parent) {
    self._addContainerActions(parent);
    if (typeof parent._defaults !== 'undefined') {
      for (var defaultKey in parent._defaults) {
        if (parent._defaults.hasOwnProperty(defaultKey)) {
          self._defaults[defaultKey] = parent._defaults[defaultKey];
        }
      }
    }
  });
}

util.inherits(ArgumentParser, ActionContainer);

/**
 * ArgumentParser#addSubparsers(options) -> [[ActionSubparsers]]
 * - options (object): hash of options see [[ActionSubparsers.new]]
 *
 * See also [subcommands][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#sub-commands
 **/
ArgumentParser.prototype.addSubparsers = function (options) {
  if (this._subparsers) {
    this.error('Cannot have multiple subparser arguments.');
  }

  options = options || {};
  options.debug = (this.debug === true);
  options.optionStrings = [];
  options.parserClass = (options.parserClass || ArgumentParser);


  if (!!options.title || !!options.description) {

    this._subparsers = this.addArgumentGroup({
      title: (options.title || 'subcommands'),
      description: options.description
    });
    delete options.title;
    delete options.description;

  } else {
    this._subparsers = this._positionals;
  }

  // prog defaults to the usage message of this parser, skipping
  // optional arguments and with no "usage:" prefix
  if (!options.prog) {
    var formatter = this._getFormatter();
    var positionals = this._getPositionalActions();
    var groups = this._mutuallyExclusiveGroups;
    formatter.addUsage(this.usage, positionals, groups, '');
    options.prog = formatter.formatHelp().trim();
  }

  // create the parsers action and add it to the positionals list
  var ParsersClass = this._popActionClass(options, 'parsers');
  var action = new ParsersClass(options);
  this._subparsers._addAction(action);

  // return the created parsers action
  return action;
};

ArgumentParser.prototype._addAction = function (action) {
  if (action.isOptional()) {
    this._optionals._addAction(action);
  } else {
    this._positionals._addAction(action);
  }
  return action;
};

ArgumentParser.prototype._getOptionalActions = function () {
  return this._actions.filter(function (action) {
    return action.isOptional();
  });
};

ArgumentParser.prototype._getPositionalActions = function () {
  return this._actions.filter(function (action) {
    return action.isPositional();
  });
};


/**
 * ArgumentParser#parseArgs(args, namespace) -> Namespace|Object
 * - args (array): input elements
 * - namespace (Namespace|Object): result object
 *
 * Parsed args and throws error if some arguments are not recognized
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#the-parse-args-method
 **/
ArgumentParser.prototype.parseArgs = function (args, namespace) {
  var argv;
  var result = this.parseKnownArgs(args, namespace);

  args = result[0];
  argv = result[1];
  if (argv && argv.length > 0) {
    this.error(
      format('Unrecognized arguments: %s.', argv.join(' '))
    );
  }
  return args;
};

/**
 * ArgumentParser#parseKnownArgs(args, namespace) -> array
 * - args (array): input options
 * - namespace (Namespace|Object): result object
 *
 * Parse known arguments and return tuple of result object
 * and unknown args
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#partial-parsing
 **/
ArgumentParser.prototype.parseKnownArgs = function (args, namespace) {
  var self = this;

  // args default to the system args
  args = args || process.argv.slice(2);

  // default Namespace built from parser defaults
  namespace = namespace || new Namespace();

  self._actions.forEach(function (action) {
    if (action.dest !== c.SUPPRESS) {
      if (!$$.has(namespace, action.dest)) {
        if (action.defaultValue !== c.SUPPRESS) {
          var defaultValue = action.defaultValue;
          if (typeof action.defaultValue === 'string') {
            defaultValue = self._getValue(action, defaultValue);
          }
          namespace[action.dest] = defaultValue;
        }
      }
    }
  });

  Object.keys(self._defaults).forEach(function (dest) {
    namespace[dest] = self._defaults[dest];
  });

  // parse the arguments and exit if there are any errors
  try {
    var res = this._parseKnownArgs(args, namespace);

    namespace = res[0];
    args = res[1];
    if ($$.has(namespace, c._UNRECOGNIZED_ARGS_ATTR)) {
      args = $$.arrayUnion(args, namespace[c._UNRECOGNIZED_ARGS_ATTR]);
      delete namespace[c._UNRECOGNIZED_ARGS_ATTR];
    }
    return [ namespace, args ];
  } catch (e) {
    this.error(e);
  }
};

ArgumentParser.prototype._parseKnownArgs = function (argStrings, namespace) {
  var self = this;

  var extras = [];

  // replace arg strings that are file references
  if (this.fromfilePrefixChars !== null) {
    argStrings = this._readArgsFromFiles(argStrings);
  }
  // map all mutually exclusive arguments to the other arguments
  // they can't occur with
  // Python has 'conflicts = action_conflicts.setdefault(mutex_action, [])'
  // though I can't conceive of a way in which an action could be a member
  // of two different mutually exclusive groups.

  function actionHash(action) {
    // some sort of hashable key for this action
    // action itself cannot be a key in actionConflicts
    // I think getName() (join of optionStrings) is unique enough
    return action.getName();
  }

  var conflicts, key;
  var actionConflicts = {};

  this._mutuallyExclusiveGroups.forEach(function (mutexGroup) {
    mutexGroup._groupActions.forEach(function (mutexAction, i, groupActions) {
      key = actionHash(mutexAction);
      if (!$$.has(actionConflicts, key)) {
        actionConflicts[key] = [];
      }
      conflicts = actionConflicts[key];
      conflicts.push.apply(conflicts, groupActions.slice(0, i));
      conflicts.push.apply(conflicts, groupActions.slice(i + 1));
    });
  });

  // find all option indices, and determine the arg_string_pattern
  // which has an 'O' if there is an option at an index,
  // an 'A' if there is an argument, or a '-' if there is a '--'
  var optionStringIndices = {};

  var argStringPatternParts = [];

  argStrings.forEach(function (argString, argStringIndex) {
    if (argString === '--') {
      argStringPatternParts.push('-');
      while (argStringIndex < argStrings.length) {
        argStringPatternParts.push('A');
        argStringIndex++;
      }
    } else {
      // otherwise, add the arg to the arg strings
      // and note the index if it was an option
      var pattern;
      var optionTuple = self._parseOptional(argString);
      if (!optionTuple) {
        pattern = 'A';
      } else {
        optionStringIndices[argStringIndex] = optionTuple;
        pattern = 'O';
      }
      argStringPatternParts.push(pattern);
    }
  });
  var argStringsPattern = argStringPatternParts.join('');

  var seenActions = [];
  var seenNonDefaultActions = [];


  function takeAction(action, argumentStrings, optionString) {
    seenActions.push(action);
    var argumentValues = self._getValues(action, argumentStrings);

    // error if this argument is not allowed with other previously
    // seen arguments, assuming that actions that use the default
    // value don't really count as "present"
    if (argumentValues !== action.defaultValue) {
      seenNonDefaultActions.push(action);
      if (actionConflicts[actionHash(action)]) {
        actionConflicts[actionHash(action)].forEach(function (actionConflict) {
          if (seenNonDefaultActions.indexOf(actionConflict) >= 0) {
            throw argumentErrorHelper(
              action,
              format('Not allowed with argument "%s".', actionConflict.getName())
            );
          }
        });
      }
    }

    if (argumentValues !== c.SUPPRESS) {
      action.call(self, namespace, argumentValues, optionString);
    }
  }

  function consumeOptional(startIndex) {
    // get the optional identified at this index
    var optionTuple = optionStringIndices[startIndex];
    var action = optionTuple[0];
    var optionString = optionTuple[1];
    var explicitArg = optionTuple[2];

    // identify additional optionals in the same arg string
    // (e.g. -xyz is the same as -x -y -z if no args are required)
    var actionTuples = [];

    var args, argCount, start, stop;

    for (;;) {
      if (!action) {
        extras.push(argStrings[startIndex]);
        return startIndex + 1;
      }
      if (explicitArg) {
        argCount = self._matchArgument(action, 'A');

        // if the action is a single-dash option and takes no
        // arguments, try to parse more single-dash options out
        // of the tail of the option string
        var chars = self.prefixChars;
        if (argCount === 0 && chars.indexOf(optionString[1]) < 0) {
          actionTuples.push([ action, [], optionString ]);
          optionString = optionString[0] + explicitArg[0];
          var newExplicitArg = explicitArg.slice(1) || null;
          var optionalsMap = self._optionStringActions;

          if (Object.keys(optionalsMap).indexOf(optionString) >= 0) {
            action = optionalsMap[optionString];
            explicitArg = newExplicitArg;
          } else {
            throw argumentErrorHelper(action, sprintf('ignored explicit argument %r', explicitArg));
          }
        } else if (argCount === 1) {
          // if the action expect exactly one argument, we've
          // successfully matched the option; exit the loop
          stop = startIndex + 1;
          args = [ explicitArg ];
          actionTuples.push([ action, args, optionString ]);
          break;
        } else {
          // error if a double-dash option did not use the
          // explicit argument
          throw argumentErrorHelper(action, sprintf('ignored explicit argument %r', explicitArg));
        }
      } else {
        // if there is no explicit argument, try to match the
        // optional's string arguments with the following strings
        // if successful, exit the loop

        start = startIndex + 1;
        var selectedPatterns = argStringsPattern.substr(start);

        argCount = self._matchArgument(action, selectedPatterns);
        stop = start + argCount;


        args = argStrings.slice(start, stop);

        actionTuples.push([ action, args, optionString ]);
        break;
      }

    }

    // add the Optional to the list and return the index at which
    // the Optional's string args stopped
    if (actionTuples.length < 1) {
      throw new Error('length should be > 0');
    }
    for (var i = 0; i < actionTuples.length; i++) {
      takeAction.apply(self, actionTuples[i]);
    }
    return stop;
  }

  // the list of Positionals left to be parsed; this is modified
  // by consume_positionals()
  var positionals = self._getPositionalActions();

  function consumePositionals(startIndex) {
    // match as many Positionals as possible
    var selectedPattern = argStringsPattern.substr(startIndex);
    var argCounts = self._matchArgumentsPartial(positionals, selectedPattern);

    // slice off the appropriate arg strings for each Positional
    // and add the Positional and its args to the list
    for (var i = 0; i < positionals.length; i++) {
      var action = positionals[i];
      var argCount = argCounts[i];
      if (typeof argCount === 'undefined') {
        continue;
      }
      var args = argStrings.slice(startIndex, startIndex + argCount);

      startIndex += argCount;
      takeAction(action, args);
    }

    // slice off the Positionals that we just parsed and return the
    // index at which the Positionals' string args stopped
    positionals = positionals.slice(argCounts.length);
    return startIndex;
  }

  // consume Positionals and Optionals alternately, until we have
  // passed the last option string
  var startIndex = 0;
  var position;

  var maxOptionStringIndex = -1;

  Object.keys(optionStringIndices).forEach(function (position) {
    maxOptionStringIndex = Math.max(maxOptionStringIndex, parseInt(position, 10));
  });

  var positionalsEndIndex, nextOptionStringIndex;

  while (startIndex <= maxOptionStringIndex) {
    // consume any Positionals preceding the next option
    nextOptionStringIndex = null;
    for (position in optionStringIndices) {
      if (!optionStringIndices.hasOwnProperty(position)) { continue; }

      position = parseInt(position, 10);
      if (position >= startIndex) {
        if (nextOptionStringIndex !== null) {
          nextOptionStringIndex = Math.min(nextOptionStringIndex, position);
        } else {
          nextOptionStringIndex = position;
        }
      }
    }

    if (startIndex !== nextOptionStringIndex) {
      positionalsEndIndex = consumePositionals(startIndex);
      // only try to parse the next optional if we didn't consume
      // the option string during the positionals parsing
      if (positionalsEndIndex > startIndex) {
        startIndex = positionalsEndIndex;
        continue;
      } else {
        startIndex = positionalsEndIndex;
      }
    }

    // if we consumed all the positionals we could and we're not
    // at the index of an option string, there were extra arguments
    if (!optionStringIndices[startIndex]) {
      var strings = argStrings.slice(startIndex, nextOptionStringIndex);
      extras = extras.concat(strings);
      startIndex = nextOptionStringIndex;
    }
    // consume the next optional and any arguments for it
    startIndex = consumeOptional(startIndex);
  }

  // consume any positionals following the last Optional
  var stopIndex = consumePositionals(startIndex);

  // if we didn't consume all the argument strings, there were extras
  extras = extras.concat(argStrings.slice(stopIndex));

  // if we didn't use all the Positional objects, there were too few
  // arg strings supplied.
  if (positionals.length > 0) {
    self.error('too few arguments');
  }

  // make sure all required actions were present
  self._actions.forEach(function (action) {
    if (action.required) {
      if (seenActions.indexOf(action) < 0) {
        self.error(format('Argument "%s" is required', action.getName()));
      }
    }
  });

  // make sure all required groups have one option present
  var actionUsed = false;
  self._mutuallyExclusiveGroups.forEach(function (group) {
    if (group.required) {
      actionUsed = group._groupActions.some(function (action) {
        return seenNonDefaultActions.indexOf(action) !== -1;
      });

      // if no actions were used, report the error
      if (!actionUsed) {
        var names = [];
        group._groupActions.forEach(function (action) {
          if (action.help !== c.SUPPRESS) {
            names.push(action.getName());
          }
        });
        names = names.join(' ');
        var msg = 'one of the arguments ' + names + ' is required';
        self.error(msg);
      }
    }
  });

  // return the updated namespace and the extra arguments
  return [ namespace, extras ];
};

ArgumentParser.prototype._readArgsFromFiles = function (argStrings) {
  // expand arguments referencing files
  var self = this;
  var fs = require('fs');
  var newArgStrings = [];
  argStrings.forEach(function (argString) {
    if (self.fromfilePrefixChars.indexOf(argString[0]) < 0) {
      // for regular arguments, just add them back into the list
      newArgStrings.push(argString);
    } else {
      // replace arguments referencing files with the file content
      try {
        var argstrs = [];
        var filename = argString.slice(1);
        var content = fs.readFileSync(filename, 'utf8');
        content = content.trim().split('\n');
        content.forEach(function (argLine) {
          self.convertArgLineToArgs(argLine).forEach(function (arg) {
            argstrs.push(arg);
          });
          argstrs = self._readArgsFromFiles(argstrs);
        });
        newArgStrings.push.apply(newArgStrings, argstrs);
      } catch (error) {
        return self.error(error.message);
      }
    }
  });
  return newArgStrings;
};

ArgumentParser.prototype.convertArgLineToArgs = function (argLine) {
  return [ argLine ];
};

ArgumentParser.prototype._matchArgument = function (action, regexpArgStrings) {

  // match the pattern for this action to the arg strings
  var regexpNargs = new RegExp('^' + this._getNargsPattern(action));
  var matches = regexpArgStrings.match(regexpNargs);
  var message;

  // throw an exception if we weren't able to find a match
  if (!matches) {
    switch (action.nargs) {
      /*eslint-disable no-undefined*/
      case undefined:
      case null:
        message = 'Expected one argument.';
        break;
      case c.OPTIONAL:
        message = 'Expected at most one argument.';
        break;
      case c.ONE_OR_MORE:
        message = 'Expected at least one argument.';
        break;
      default:
        message = 'Expected %s argument(s)';
    }

    throw argumentErrorHelper(
      action,
      format(message, action.nargs)
    );
  }
  // return the number of arguments matched
  return matches[1].length;
};

ArgumentParser.prototype._matchArgumentsPartial = function (actions, regexpArgStrings) {
  // progressively shorten the actions list by slicing off the
  // final actions until we find a match
  var self = this;
  var result = [];
  var actionSlice, pattern, matches;
  var i, j;

  function getLength(string) {
    return string.length;
  }

  for (i = actions.length; i > 0; i--) {
    pattern = '';
    actionSlice = actions.slice(0, i);
    for (j = 0; j < actionSlice.length; j++) {
      pattern += self._getNargsPattern(actionSlice[j]);
    }

    pattern = new RegExp('^' + pattern);
    matches = regexpArgStrings.match(pattern);

    if (matches && matches.length > 0) {
      // need only groups
      matches = matches.splice(1);
      result = result.concat(matches.map(getLength));
      break;
    }
  }

  // return the list of arg string counts
  return result;
};

ArgumentParser.prototype._parseOptional = function (argString) {
  var action, optionString, argExplicit, optionTuples;

  // if it's an empty string, it was meant to be a positional
  if (!argString) {
    return null;
  }

  // if it doesn't start with a prefix, it was meant to be positional
  if (this.prefixChars.indexOf(argString[0]) < 0) {
    return null;
  }

  // if the option string is present in the parser, return the action
  if (this._optionStringActions[argString]) {
    return [ this._optionStringActions[argString], argString, null ];
  }

  // if it's just a single character, it was meant to be positional
  if (argString.length === 1) {
    return null;
  }

  // if the option string before the "=" is present, return the action
  if (argString.indexOf('=') >= 0) {
    optionString = argString.split('=', 1)[0];
    argExplicit = argString.slice(optionString.length + 1);

    if (this._optionStringActions[optionString]) {
      action = this._optionStringActions[optionString];
      return [ action, optionString, argExplicit ];
    }
  }

  // search through all possible prefixes of the option string
  // and all actions in the parser for possible interpretations
  optionTuples = this._getOptionTuples(argString);

  // if multiple actions match, the option string was ambiguous
  if (optionTuples.length > 1) {
    var optionStrings = optionTuples.map(function (optionTuple) {
      return optionTuple[1];
    });
    this.error(format(
          'Ambiguous option: "%s" could match %s.',
          argString, optionStrings.join(', ')
    ));
  // if exactly one action matched, this segmentation is good,
  // so return the parsed action
  } else if (optionTuples.length === 1) {
    return optionTuples[0];
  }

  // if it was not found as an option, but it looks like a negative
  // number, it was meant to be positional
  // unless there are negative-number-like options
  if (argString.match(this._regexpNegativeNumber)) {
    if (!this._hasNegativeNumberOptionals.some(Boolean)) {
      return null;
    }
  }
  // if it contains a space, it was meant to be a positional
  if (argString.search(' ') >= 0) {
    return null;
  }

  // it was meant to be an optional but there is no such option
  // in this parser (though it might be a valid option in a subparser)
  return [ null, argString, null ];
};

ArgumentParser.prototype._getOptionTuples = function (optionString) {
  var result = [];
  var chars = this.prefixChars;
  var optionPrefix;
  var argExplicit;
  var action;
  var actionOptionString;

  // option strings starting with two prefix characters are only split at
  // the '='
  if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) >= 0) {
    if (optionString.indexOf('=') >= 0) {
      var optionStringSplit = optionString.split('=', 1);

      optionPrefix = optionStringSplit[0];
      argExplicit = optionStringSplit[1];
    } else {
      optionPrefix = optionString;
      argExplicit = null;
    }

    for (actionOptionString in this._optionStringActions) {
      if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) {
        action = this._optionStringActions[actionOptionString];
        result.push([ action, actionOptionString, argExplicit ]);
      }
    }

  // single character options can be concatenated with their arguments
  // but multiple character options always have to have their argument
  // separate
  } else if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) < 0) {
    optionPrefix = optionString;
    argExplicit = null;
    var optionPrefixShort = optionString.substr(0, 2);
    var argExplicitShort = optionString.substr(2);

    for (actionOptionString in this._optionStringActions) {
      if (!$$.has(this._optionStringActions, actionOptionString)) continue;

      action = this._optionStringActions[actionOptionString];
      if (actionOptionString === optionPrefixShort) {
        result.push([ action, actionOptionString, argExplicitShort ]);
      } else if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) {
        result.push([ action, actionOptionString, argExplicit ]);
      }
    }

  // shouldn't ever get here
  } else {
    throw new Error(format('Unexpected option string: %s.', optionString));
  }
  // return the collected option tuples
  return result;
};

ArgumentParser.prototype._getNargsPattern = function (action) {
  // in all examples below, we have to allow for '--' args
  // which are represented as '-' in the pattern
  var regexpNargs;

  switch (action.nargs) {
    // the default (null) is assumed to be a single argument
    case undefined:
    case null:
      regexpNargs = '(-*A-*)';
      break;
    // allow zero or more arguments
    case c.OPTIONAL:
      regexpNargs = '(-*A?-*)';
      break;
    // allow zero or more arguments
    case c.ZERO_OR_MORE:
      regexpNargs = '(-*[A-]*)';
      break;
    // allow one or more arguments
    case c.ONE_OR_MORE:
      regexpNargs = '(-*A[A-]*)';
      break;
    // allow any number of options or arguments
    case c.REMAINDER:
      regexpNargs = '([-AO]*)';
      break;
    // allow one argument followed by any number of options or arguments
    case c.PARSER:
      regexpNargs = '(-*A[-AO]*)';
      break;
    // all others should be integers
    default:
      regexpNargs = '(-*' + $$.repeat('-*A', action.nargs) + '-*)';
  }

  // if this is an optional action, -- is not allowed
  if (action.isOptional()) {
    regexpNargs = regexpNargs.replace(/-\*/g, '');
    regexpNargs = regexpNargs.replace(/-/g, '');
  }

  // return the pattern
  return regexpNargs;
};

//
// Value conversion methods
//

ArgumentParser.prototype._getValues = function (action, argStrings) {
  var self = this;

  // for everything but PARSER args, strip out '--'
  if (action.nargs !== c.PARSER && action.nargs !== c.REMAINDER) {
    argStrings = argStrings.filter(function (arrayElement) {
      return arrayElement !== '--';
    });
  }

  var value, argString;

  // optional argument produces a default when not present
  if (argStrings.length === 0 && action.nargs === c.OPTIONAL) {

    value = (action.isOptional()) ? action.constant : action.defaultValue;

    if (typeof (value) === 'string') {
      value = this._getValue(action, value);
      this._checkValue(action, value);
    }

  // when nargs='*' on a positional, if there were no command-line
  // args, use the default if it is anything other than None
  } else if (argStrings.length === 0 && action.nargs === c.ZERO_OR_MORE &&
    action.optionStrings.length === 0) {

    value = (action.defaultValue || argStrings);
    this._checkValue(action, value);

  // single argument or optional argument produces a single value
  } else if (argStrings.length === 1 &&
        (!action.nargs || action.nargs === c.OPTIONAL)) {

    argString = argStrings[0];
    value = this._getValue(action, argString);
    this._checkValue(action, value);

  // REMAINDER arguments convert all values, checking none
  } else if (action.nargs === c.REMAINDER) {
    value = argStrings.map(function (v) {
      return self._getValue(action, v);
    });

  // PARSER arguments convert all values, but check only the first
  } else if (action.nargs === c.PARSER) {
    value = argStrings.map(function (v) {
      return self._getValue(action, v);
    });
    this._checkValue(action, value[0]);

  // all other types of nargs produce a list
  } else {
    value = argStrings.map(function (v) {
      return self._getValue(action, v);
    });
    value.forEach(function (v) {
      self._checkValue(action, v);
    });
  }

  // return the converted value
  return value;
};

ArgumentParser.prototype._getValue = function (action, argString) {
  var result;

  var typeFunction = this._registryGet('type', action.type, action.type);
  if (typeof typeFunction !== 'function') {
    var message = format('%s is not callable', typeFunction);
    throw argumentErrorHelper(action, message);
  }

  // convert the value to the appropriate type
  try {
    result = typeFunction(argString);

    // ArgumentTypeErrors indicate errors
    // If action.type is not a registered string, it is a function
    // Try to deduce its name for inclusion in the error message
    // Failing that, include the error message it raised.
  } catch (e) {
    var name = null;
    if (typeof action.type === 'string') {
      name = action.type;
    } else {
      name = action.type.name || action.type.displayName || '<function>';
    }
    var msg = format('Invalid %s value: %s', name, argString);
    if (name === '<function>') { msg += '\n' + e.message; }
    throw argumentErrorHelper(action, msg);
  }
  // return the converted value
  return result;
};

ArgumentParser.prototype._checkValue = function (action, value) {
  // converted value must be one of the choices (if specified)
  var choices = action.choices;
  if (choices) {
    // choise for argument can by array or string
    if ((typeof choices === 'string' || Array.isArray(choices)) &&
        choices.indexOf(value) !== -1) {
      return;
    }
    // choise for subparsers can by only hash
    if (typeof choices === 'object' && !Array.isArray(choices) && choices[value]) {
      return;
    }

    if (typeof choices === 'string') {
      choices = choices.split('').join(', ');
    } else if (Array.isArray(choices)) {
      choices =  choices.join(', ');
    } else {
      choices =  Object.keys(choices).join(', ');
    }
    var message = format('Invalid choice: %s (choose from [%s])', value, choices);
    throw argumentErrorHelper(action, message);
  }
};

//
// Help formatting methods
//

/**
 * ArgumentParser#formatUsage -> string
 *
 * Return usage string
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
 **/
ArgumentParser.prototype.formatUsage = function () {
  var formatter = this._getFormatter();
  formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups);
  return formatter.formatHelp();
};

/**
 * ArgumentParser#formatHelp -> string
 *
 * Return help
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
 **/
ArgumentParser.prototype.formatHelp = function () {
  var formatter = this._getFormatter();

  // usage
  formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups);

  // description
  formatter.addText(this.description);

  // positionals, optionals and user-defined groups
  this._actionGroups.forEach(function (actionGroup) {
    formatter.startSection(actionGroup.title);
    formatter.addText(actionGroup.description);
    formatter.addArguments(actionGroup._groupActions);
    formatter.endSection();
  });

  // epilog
  formatter.addText(this.epilog);

  // determine help from format above
  return formatter.formatHelp();
};

ArgumentParser.prototype._getFormatter = function () {
  var FormatterClass = this.formatterClass;
  var formatter = new FormatterClass({ prog: this.prog });
  return formatter;
};

//
//  Print functions
//

/**
 * ArgumentParser#printUsage() -> Void
 *
 * Print usage
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
 **/
ArgumentParser.prototype.printUsage = function () {
  this._printMessage(this.formatUsage());
};

/**
 * ArgumentParser#printHelp() -> Void
 *
 * Print help
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
 **/
ArgumentParser.prototype.printHelp = function () {
  this._printMessage(this.formatHelp());
};

ArgumentParser.prototype._printMessage = function (message, stream) {
  if (!stream) {
    stream = process.stdout;
  }
  if (message) {
    stream.write('' + message);
  }
};

//
//  Exit functions
//

/**
 * ArgumentParser#exit(status=0, message) -> Void
 * - status (int): exit status
 * - message (string): message
 *
 * Print message in stderr/stdout and exit program
 **/
ArgumentParser.prototype.exit = function (status, message) {
  if (message) {
    if (status === 0) {
      this._printMessage(message);
    } else {
      this._printMessage(message, process.stderr);
    }
  }

  process.exit(status);
};

/**
 * ArgumentParser#error(message) -> Void
 * - err (Error|string): message
 *
 * Error method Prints a usage message incorporating the message to stderr and
 * exits. If you override this in a subclass,
 * it should not return -- it should
 * either exit or throw an exception.
 *
 **/
ArgumentParser.prototype.error = function (err) {
  var message;
  if (err instanceof Error) {
    if (this.debug === true) {
      throw err;
    }
    message = err.message;
  } else {
    message = err;
  }
  var msg = format('%s: error: %s', this.prog, message) + c.EOL;

  if (this.debug === true) {
    throw new Error(msg);
  }

  this.printUsage(process.stderr);

  return this.exit(2, msg);
};

module.exports = ArgumentParser;
//
// Constants
//

'use strict';

module.exports.EOL = '\n';

module.exports.SUPPRESS = '==SUPPRESS==';

module.exports.OPTIONAL = '?';

module.exports.ZERO_OR_MORE = '*';

module.exports.ONE_OR_MORE = '+';

module.exports.PARSER = 'A...';

module.exports.REMAINDER = '...';

module.exports._UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args';
/**
 * class Namespace
 *
 * Simple object for storing attributes. Implements equality by attribute names
 * and values, and provides a simple string representation.
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#the-namespace-object
 **/
'use strict';

var $$ = require('./utils');

/**
 * new Namespace(options)
 * - options(object): predefined propertis for result object
 *
 **/
var Namespace = module.exports = function Namespace(options) {
  $$.extend(this, options);
};

/**
 * Namespace#isset(key) -> Boolean
 * - key (string|number): property name
 *
 * Tells whenever `namespace` contains given `key` or not.
 **/
Namespace.prototype.isset = function (key) {
  return $$.has(this, key);
};

/**
 * Namespace#set(key, value) -> self
 * -key (string|number|object): propery name
 * -value (mixed): new property value
 *
 * Set the property named key with value.
 * If key object then set all key properties to namespace object
 **/
Namespace.prototype.set = function (key, value) {
  if (typeof (key) === 'object') {
    $$.extend(this, key);
  } else {
    this[key] = value;
  }
  return this;
};

/**
 * Namespace#get(key, defaultValue) -> mixed
 * - key (string|number): property name
 * - defaultValue (mixed): default value
 *
 * Return the property key or defaulValue if not set
 **/
Namespace.prototype.get = function (key, defaultValue) {
  return !this[key] ? defaultValue : this[key];
};

/**
 * Namespace#unset(key, defaultValue) -> mixed
 * - key (string|number): property name
 * - defaultValue (mixed): default value
 *
 * Return data[key](and delete it) or defaultValue
 **/
Namespace.prototype.unset = function (key, defaultValue) {
  var value = this[key];
  if (value !== null) {
    delete this[key];
    return value;
  }
  return defaultValue;
};
'use strict';

exports.repeat = function (str, num) {
  var result = '';
  for (var i = 0; i < num; i++) { result += str; }
  return result;
};

exports.arrayEqual = function (a, b) {
  if (a.length !== b.length) { return false; }
  for (var i = 0; i < a.length; i++) {
    if (a[i] !== b[i]) { return false; }
  }
  return true;
};

exports.trimChars = function (str, chars) {
  var start = 0;
  var end = str.length - 1;
  while (chars.indexOf(str.charAt(start)) >= 0) { start++; }
  while (chars.indexOf(str.charAt(end)) >= 0) { end--; }
  return str.slice(start, end + 1);
};

exports.capitalize = function (str) {
  return str.charAt(0).toUpperCase() + str.slice(1);
};

exports.arrayUnion = function () {
  var result = [];
  for (var i = 0, values = {}; i < arguments.length; i++) {
    var arr = arguments[i];
    for (var j = 0; j < arr.length; j++) {
      if (!values[arr[j]]) {
        values[arr[j]] = true;
        result.push(arr[j]);
      }
    }
  }
  return result;
};

function has(obj, key) {
  return Object.prototype.hasOwnProperty.call(obj, key);
}

exports.has = has;

exports.extend = function (dest, src) {
  for (var i in src) {
    if (has(src, i)) { dest[i] = src[i]; }
  }
};

exports.trimEnd = function (str) {
  return str.replace(/\s+$/g, '');
};
'use strict';

var util    = require('util');

// Constants
var c = require('../const');

var $$ = require('../utils');
var HelpFormatter = require('./formatter.js');

/**
 * new RawDescriptionHelpFormatter(options)
 * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...})
 *
 * Help message formatter which adds default values to argument help.
 *
 * Only the name of this class is considered a public API. All the methods
 * provided by the class are considered an implementation detail.
 **/

function ArgumentDefaultsHelpFormatter(options) {
  HelpFormatter.call(this, options);
}

util.inherits(ArgumentDefaultsHelpFormatter, HelpFormatter);

ArgumentDefaultsHelpFormatter.prototype._getHelpString = function (action) {
  var help = action.help;
  if (action.help.indexOf('%(defaultValue)s') === -1) {
    if (action.defaultValue !== c.SUPPRESS) {
      var defaulting_nargs = [ c.OPTIONAL, c.ZERO_OR_MORE ];
      if (action.isOptional() || (defaulting_nargs.indexOf(action.nargs) >= 0)) {
        help += ' (default: %(defaultValue)s)';
      }
    }
  }
  return help;
};

module.exports.ArgumentDefaultsHelpFormatter = ArgumentDefaultsHelpFormatter;

/**
 * new RawDescriptionHelpFormatter(options)
 * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...})
 *
 * Help message formatter which retains any formatting in descriptions.
 *
 * Only the name of this class is considered a public API. All the methods
 * provided by the class are considered an implementation detail.
 **/

function RawDescriptionHelpFormatter(options) {
  HelpFormatter.call(this, options);
}

util.inherits(RawDescriptionHelpFormatter, HelpFormatter);

RawDescriptionHelpFormatter.prototype._fillText = function (text, width, indent) {
  var lines = text.split('\n');
  lines = lines.map(function (line) {
    return $$.trimEnd(indent + line);
  });
  return lines.join('\n');
};
module.exports.RawDescriptionHelpFormatter = RawDescriptionHelpFormatter;

/**
 * new RawTextHelpFormatter(options)
 * new ArgumentParser({formatterClass: argparse.RawTextHelpFormatter, ...})
 *
 * Help message formatter which retains formatting of all help text.
 *
 * Only the name of this class is considered a public API. All the methods
 * provided by the class are considered an implementation detail.
 **/

function RawTextHelpFormatter(options) {
  RawDescriptionHelpFormatter.call(this, options);
}

util.inherits(RawTextHelpFormatter, RawDescriptionHelpFormatter);

RawTextHelpFormatter.prototype._splitLines = function (text) {
  return text.split('\n');
};

module.exports.RawTextHelpFormatter = RawTextHelpFormatter;
/**
 * class HelpFormatter
 *
 * Formatter for generating usage messages and argument help strings. Only the
 * name of this class is considered a public API. All the methods provided by
 * the class are considered an implementation detail.
 *
 * Do not call in your code, use this class only for inherits your own forvatter
 *
 * ToDo add [additonal formatters][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#formatter-class
 **/
'use strict';

var sprintf = require('sprintf-js').sprintf;

// Constants
var c = require('../const');

var $$ = require('../utils');


/*:nodoc:* internal
 * new Support(parent, heding)
 * - parent (object): parent section
 * - heading (string): header string
 *
 **/
function Section(parent, heading) {
  this._parent = parent;
  this._heading = heading;
  this._items = [];
}

/*:nodoc:* internal
 * Section#addItem(callback) -> Void
 * - callback (array): tuple with function and args
 *
 * Add function for single element
 **/
Section.prototype.addItem = function (callback) {
  this._items.push(callback);
};

/*:nodoc:* internal
 * Section#formatHelp(formatter) -> string
 * - formatter (HelpFormatter): current formatter
 *
 * Form help section string
 *
 **/
Section.prototype.formatHelp = function (formatter) {
  var itemHelp, heading;

  // format the indented section
  if (this._parent) {
    formatter._indent();
  }

  itemHelp = this._items.map(function (item) {
    var obj, func, args;

    obj = formatter;
    func = item[0];
    args = item[1];
    return func.apply(obj, args);
  });
  itemHelp = formatter._joinParts(itemHelp);

  if (this._parent) {
    formatter._dedent();
  }

  // return nothing if the section was empty
  if (!itemHelp) {
    return '';
  }

  // add the heading if the section was non-empty
  heading = '';
  if (this._heading && this._heading !== c.SUPPRESS) {
    var currentIndent = formatter.currentIndent;
    heading = $$.repeat(' ', currentIndent) + this._heading + ':' + c.EOL;
  }

  // join the section-initialize newline, the heading and the help
  return formatter._joinParts([ c.EOL, heading, itemHelp, c.EOL ]);
};

/**
 * new HelpFormatter(options)
 *
 * #### Options:
 * - `prog`: program name
 * - `indentIncriment`: indent step, default value 2
 * - `maxHelpPosition`: max help position, default value = 24
 * - `width`: line width
 *
 **/
var HelpFormatter = module.exports = function HelpFormatter(options) {
  options = options || {};

  this._prog = options.prog;

  this._maxHelpPosition = options.maxHelpPosition || 24;
  this._width = (options.width || ((process.env.COLUMNS || 80) - 2));

  this._currentIndent = 0;
  this._indentIncriment = options.indentIncriment || 2;
  this._level = 0;
  this._actionMaxLength = 0;

  this._rootSection = new Section(null);
  this._currentSection = this._rootSection;

  this._whitespaceMatcher = new RegExp('\\s+', 'g');
  this._longBreakMatcher = new RegExp(c.EOL + c.EOL + c.EOL + '+', 'g');
};

HelpFormatter.prototype._indent = function () {
  this._currentIndent += this._indentIncriment;
  this._level += 1;
};

HelpFormatter.prototype._dedent = function () {
  this._currentIndent -= this._indentIncriment;
  this._level -= 1;
  if (this._currentIndent < 0) {
    throw new Error('Indent decreased below 0.');
  }
};

HelpFormatter.prototype._addItem = function (func, args) {
  this._currentSection.addItem([ func, args ]);
};

//
// Message building methods
//

/**
 * HelpFormatter#startSection(heading) -> Void
 * - heading (string): header string
 *
 * Start new help section
 *
 * See alse [code example][1]
 *
 * ##### Example
 *
 *      formatter.startSection(actionGroup.title);
 *      formatter.addText(actionGroup.description);
 *      formatter.addArguments(actionGroup._groupActions);
 *      formatter.endSection();
 *
 **/
HelpFormatter.prototype.startSection = function (heading) {
  this._indent();
  var section = new Section(this._currentSection, heading);
  var func = section.formatHelp.bind(section);
  this._addItem(func, [ this ]);
  this._currentSection = section;
};

/**
 * HelpFormatter#endSection -> Void
 *
 * End help section
 *
 * ##### Example
 *
 *      formatter.startSection(actionGroup.title);
 *      formatter.addText(actionGroup.description);
 *      formatter.addArguments(actionGroup._groupActions);
 *      formatter.endSection();
 **/
HelpFormatter.prototype.endSection = function () {
  this._currentSection = this._currentSection._parent;
  this._dedent();
};

/**
 * HelpFormatter#addText(text) -> Void
 * - text (string): plain text
 *
 * Add plain text into current section
 *
 * ##### Example
 *
 *      formatter.startSection(actionGroup.title);
 *      formatter.addText(actionGroup.description);
 *      formatter.addArguments(actionGroup._groupActions);
 *      formatter.endSection();
 *
 **/
HelpFormatter.prototype.addText = function (text) {
  if (text && text !== c.SUPPRESS) {
    this._addItem(this._formatText, [ text ]);
  }
};

/**
 * HelpFormatter#addUsage(usage, actions, groups, prefix) -> Void
 * - usage (string): usage text
 * - actions (array): actions list
 * - groups (array): groups list
 * - prefix (string): usage prefix
 *
 * Add usage data into current section
 *
 * ##### Example
 *
 *      formatter.addUsage(this.usage, this._actions, []);
 *      return formatter.formatHelp();
 *
 **/
HelpFormatter.prototype.addUsage = function (usage, actions, groups, prefix) {
  if (usage !== c.SUPPRESS) {
    this._addItem(this._formatUsage, [ usage, actions, groups, prefix ]);
  }
};

/**
 * HelpFormatter#addArgument(action) -> Void
 * - action (object): action
 *
 * Add argument into current section
 *
 * Single variant of [[HelpFormatter#addArguments]]
 **/
HelpFormatter.prototype.addArgument = function (action) {
  if (action.help !== c.SUPPRESS) {
    var self = this;

    // find all invocations
    var invocations = [ this._formatActionInvocation(action) ];
    var invocationLength = invocations[0].length;

    var actionLength;

    if (action._getSubactions) {
      this._indent();
      action._getSubactions().forEach(function (subaction) {

        var invocationNew = self._formatActionInvocation(subaction);
        invocations.push(invocationNew);
        invocationLength = Math.max(invocationLength, invocationNew.length);

      });
      this._dedent();
    }

    // update the maximum item length
    actionLength = invocationLength + this._currentIndent;
    this._actionMaxLength = Math.max(this._actionMaxLength, actionLength);

    // add the item to the list
    this._addItem(this._formatAction, [ action ]);
  }
};

/**
 * HelpFormatter#addArguments(actions) -> Void
 * - actions (array): actions list
 *
 * Mass add arguments into current section
 *
 * ##### Example
 *
 *      formatter.startSection(actionGroup.title);
 *      formatter.addText(actionGroup.description);
 *      formatter.addArguments(actionGroup._groupActions);
 *      formatter.endSection();
 *
 **/
HelpFormatter.prototype.addArguments = function (actions) {
  var self = this;
  actions.forEach(function (action) {
    self.addArgument(action);
  });
};

//
// Help-formatting methods
//

/**
 * HelpFormatter#formatHelp -> string
 *
 * Format help
 *
 * ##### Example
 *
 *      formatter.addText(this.epilog);
 *      return formatter.formatHelp();
 *
 **/
HelpFormatter.prototype.formatHelp = function () {
  var help = this._rootSection.formatHelp(this);
  if (help) {
    help = help.replace(this._longBreakMatcher, c.EOL + c.EOL);
    help = $$.trimChars(help, c.EOL) + c.EOL;
  }
  return help;
};

HelpFormatter.prototype._joinParts = function (partStrings) {
  return partStrings.filter(function (part) {
    return (part && part !== c.SUPPRESS);
  }).join('');
};

HelpFormatter.prototype._formatUsage = function (usage, actions, groups, prefix) {
  if (!prefix && typeof prefix !== 'string') {
    prefix = 'usage: ';
  }

  actions = actions || [];
  groups = groups || [];


  // if usage is specified, use that
  if (usage) {
    usage = sprintf(usage, { prog: this._prog });

    // if no optionals or positionals are available, usage is just prog
  } else if (!usage && actions.length === 0) {
    usage = this._prog;

    // if optionals and positionals are available, calculate usage
  } else if (!usage) {
    var prog = this._prog;
    var optionals = [];
    var positionals = [];
    var actionUsage;
    var textWidth;

    // split optionals from positionals
    actions.forEach(function (action) {
      if (action.isOptional()) {
        optionals.push(action);
      } else {
        positionals.push(action);
      }
    });

    // build full usage string
    actionUsage = this._formatActionsUsage([].concat(optionals, positionals), groups);
    usage = [ prog, actionUsage ].join(' ');

    // wrap the usage parts if it's too long
    textWidth = this._width - this._currentIndent;
    if ((prefix.length + usage.length) > textWidth) {

      // break usage into wrappable parts
      var regexpPart = new RegExp('\\(.*?\\)+|\\[.*?\\]+|\\S+', 'g');
      var optionalUsage = this._formatActionsUsage(optionals, groups);
      var positionalUsage = this._formatActionsUsage(positionals, groups);


      var optionalParts = optionalUsage.match(regexpPart);
      var positionalParts = positionalUsage.match(regexpPart) || [];

      if (optionalParts.join(' ') !== optionalUsage) {
        throw new Error('assert "optionalParts.join(\' \') === optionalUsage"');
      }
      if (positionalParts.join(' ') !== positionalUsage) {
        throw new Error('assert "positionalParts.join(\' \') === positionalUsage"');
      }

      // helper for wrapping lines
      /*eslint-disable func-style*/ // node 0.10 compat
      var _getLines = function (parts, indent, prefix) {
        var lines = [];
        var line = [];

        var lineLength = prefix ? prefix.length - 1 : indent.length - 1;

        parts.forEach(function (part) {
          if (lineLength + 1 + part.length > textWidth) {
            lines.push(indent + line.join(' '));
            line = [];
            lineLength = indent.length - 1;
          }
          line.push(part);
          lineLength += part.length + 1;
        });

        if (line) {
          lines.push(indent + line.join(' '));
        }
        if (prefix) {
          lines[0] = lines[0].substr(indent.length);
        }
        return lines;
      };

      var lines, indent, parts;
      // if prog is short, follow it with optionals or positionals
      if (prefix.length + prog.length <= 0.75 * textWidth) {
        indent = $$.repeat(' ', (prefix.length + prog.length + 1));
        if (optionalParts) {
          lines = [].concat(
            _getLines([ prog ].concat(optionalParts), indent, prefix),
            _getLines(positionalParts, indent)
          );
        } else if (positionalParts) {
          lines = _getLines([ prog ].concat(positionalParts), indent, prefix);
        } else {
          lines = [ prog ];
        }

        // if prog is long, put it on its own line
      } else {
        indent = $$.repeat(' ', prefix.length);
        parts = optionalParts.concat(positionalParts);
        lines = _getLines(parts, indent);
        if (lines.length > 1) {
          lines = [].concat(
            _getLines(optionalParts, indent),
            _getLines(positionalParts, indent)
          );
        }
        lines = [ prog ].concat(lines);
      }
      // join lines into usage
      usage = lines.join(c.EOL);
    }
  }

  // prefix with 'usage:'
  return prefix + usage + c.EOL + c.EOL;
};

HelpFormatter.prototype._formatActionsUsage = function (actions, groups) {
  // find group indices and identify actions in groups
  var groupActions = [];
  var inserts = [];
  var self = this;

  groups.forEach(function (group) {
    var end;
    var i;

    var start = actions.indexOf(group._groupActions[0]);
    if (start >= 0) {
      end = start + group._groupActions.length;

      //if (actions.slice(start, end) === group._groupActions) {
      if ($$.arrayEqual(actions.slice(start, end), group._groupActions)) {
        group._groupActions.forEach(function (action) {
          groupActions.push(action);
        });

        if (!group.required) {
          if (inserts[start]) {
            inserts[start] += ' [';
          } else {
            inserts[start] = '[';
          }
          inserts[end] = ']';
        } else {
          if (inserts[start]) {
            inserts[start] += ' (';
          } else {
            inserts[start] = '(';
          }
          inserts[end] = ')';
        }
        for (i = start + 1; i < end; i += 1) {
          inserts[i] = '|';
        }
      }
    }
  });

  // collect all actions format strings
  var parts = [];

  actions.forEach(function (action, actionIndex) {
    var part;
    var optionString;
    var argsDefault;
    var argsString;

    // suppressed arguments are marked with None
    // remove | separators for suppressed arguments
    if (action.help === c.SUPPRESS) {
      parts.push(null);
      if (inserts[actionIndex] === '|') {
        inserts.splice(actionIndex, actionIndex);
      } else if (inserts[actionIndex + 1] === '|') {
        inserts.splice(actionIndex + 1, actionIndex + 1);
      }

      // produce all arg strings
    } else if (!action.isOptional()) {
      part = self._formatArgs(action, action.dest);

      // if it's in a group, strip the outer []
      if (groupActions.indexOf(action) >= 0) {
        if (part[0] === '[' && part[part.length - 1] === ']') {
          part = part.slice(1, -1);
        }
      }
      // add the action string to the list
      parts.push(part);

    // produce the first way to invoke the option in brackets
    } else {
      optionString = action.optionStrings[0];

      // if the Optional doesn't take a value, format is: -s or --long
      if (action.nargs === 0) {
        part = '' + optionString;

      // if the Optional takes a value, format is: -s ARGS or --long ARGS
      } else {
        argsDefault = action.dest.toUpperCase();
        argsString = self._formatArgs(action, argsDefault);
        part = optionString + ' ' + argsString;
      }
      // make it look optional if it's not required or in a group
      if (!action.required && groupActions.indexOf(action) < 0) {
        part = '[' + part + ']';
      }
      // add the action string to the list
      parts.push(part);
    }
  });

  // insert things at the necessary indices
  for (var i = inserts.length - 1; i >= 0; --i) {
    if (inserts[i] !== null) {
      parts.splice(i, 0, inserts[i]);
    }
  }

  // join all the action items with spaces
  var text = parts.filter(function (part) {
    return !!part;
  }).join(' ');

  // clean up separators for mutually exclusive groups
  text = text.replace(/([\[(]) /g, '$1'); // remove spaces
  text = text.replace(/ ([\])])/g, '$1');
  text = text.replace(/\[ *\]/g, ''); // remove empty groups
  text = text.replace(/\( *\)/g, '');
  text = text.replace(/\(([^|]*)\)/g, '$1'); // remove () from single action groups

  text = text.trim();

  // return the text
  return text;
};

HelpFormatter.prototype._formatText = function (text) {
  text = sprintf(text, { prog: this._prog });
  var textWidth = this._width - this._currentIndent;
  var indentIncriment = $$.repeat(' ', this._currentIndent);
  return this._fillText(text, textWidth, indentIncriment) + c.EOL + c.EOL;
};

HelpFormatter.prototype._formatAction = function (action) {
  var self = this;

  var helpText;
  var helpLines;
  var parts;
  var indentFirst;

  // determine the required width and the entry label
  var helpPosition = Math.min(this._actionMaxLength + 2, this._maxHelpPosition);
  var helpWidth = this._width - helpPosition;
  var actionWidth = helpPosition - this._currentIndent - 2;
  var actionHeader = this._formatActionInvocation(action);

  // no help; start on same line and add a final newline
  if (!action.help) {
    actionHeader = $$.repeat(' ', this._currentIndent) + actionHeader + c.EOL;

  // short action name; start on the same line and pad two spaces
  } else if (actionHeader.length <= actionWidth) {
    actionHeader = $$.repeat(' ', this._currentIndent) +
        actionHeader +
        '  ' +
        $$.repeat(' ', actionWidth - actionHeader.length);
    indentFirst = 0;

  // long action name; start on the next line
  } else {
    actionHeader = $$.repeat(' ', this._currentIndent) + actionHeader + c.EOL;
    indentFirst = helpPosition;
  }

  // collect the pieces of the action help
  parts = [ actionHeader ];

  // if there was help for the action, add lines of help text
  if (action.help) {
    helpText = this._expandHelp(action);
    helpLines = this._splitLines(helpText, helpWidth);
    parts.push($$.repeat(' ', indentFirst) + helpLines[0] + c.EOL);
    helpLines.slice(1).forEach(function (line) {
      parts.push($$.repeat(' ', helpPosition) + line + c.EOL);
    });

  // or add a newline if the description doesn't end with one
  } else if (actionHeader.charAt(actionHeader.length - 1) !== c.EOL) {
    parts.push(c.EOL);
  }
  // if there are any sub-actions, add their help as well
  if (action._getSubactions) {
    this._indent();
    action._getSubactions().forEach(function (subaction) {
      parts.push(self._formatAction(subaction));
    });
    this._dedent();
  }
  // return a single string
  return this._joinParts(parts);
};

HelpFormatter.prototype._formatActionInvocation = function (action) {
  if (!action.isOptional()) {
    var format_func = this._metavarFormatter(action, action.dest);
    var metavars = format_func(1);
    return metavars[0];
  }

  var parts = [];
  var argsDefault;
  var argsString;

  // if the Optional doesn't take a value, format is: -s, --long
  if (action.nargs === 0) {
    parts = parts.concat(action.optionStrings);

  // if the Optional takes a value, format is: -s ARGS, --long ARGS
  } else {
    argsDefault = action.dest.toUpperCase();
    argsString = this._formatArgs(action, argsDefault);
    action.optionStrings.forEach(function (optionString) {
      parts.push(optionString + ' ' + argsString);
    });
  }
  return parts.join(', ');
};

HelpFormatter.prototype._metavarFormatter = function (action, metavarDefault) {
  var result;

  if (action.metavar || action.metavar === '') {
    result = action.metavar;
  } else if (action.choices) {
    var choices = action.choices;

    if (typeof choices === 'string') {
      choices = choices.split('').join(', ');
    } else if (Array.isArray(choices)) {
      choices = choices.join(',');
    } else {
      choices = Object.keys(choices).join(',');
    }
    result = '{' + choices + '}';
  } else {
    result = metavarDefault;
  }

  return function (size) {
    if (Array.isArray(result)) {
      return result;
    }

    var metavars = [];
    for (var i = 0; i < size; i += 1) {
      metavars.push(result);
    }
    return metavars;
  };
};

HelpFormatter.prototype._formatArgs = function (action, metavarDefault) {
  var result;
  var metavars;

  var buildMetavar = this._metavarFormatter(action, metavarDefault);

  switch (action.nargs) {
    /*eslint-disable no-undefined*/
    case undefined:
    case null:
      metavars = buildMetavar(1);
      result = '' + metavars[0];
      break;
    case c.OPTIONAL:
      metavars = buildMetavar(1);
      result = '[' + metavars[0] + ']';
      break;
    case c.ZERO_OR_MORE:
      metavars = buildMetavar(2);
      result = '[' + metavars[0] + ' [' + metavars[1] + ' ...]]';
      break;
    case c.ONE_OR_MORE:
      metavars = buildMetavar(2);
      result = '' + metavars[0] + ' [' + metavars[1] + ' ...]';
      break;
    case c.REMAINDER:
      result = '...';
      break;
    case c.PARSER:
      metavars = buildMetavar(1);
      result = metavars[0] + ' ...';
      break;
    default:
      metavars = buildMetavar(action.nargs);
      result = metavars.join(' ');
  }
  return result;
};

HelpFormatter.prototype._expandHelp = function (action) {
  var params = { prog: this._prog };

  Object.keys(action).forEach(function (actionProperty) {
    var actionValue = action[actionProperty];

    if (actionValue !== c.SUPPRESS) {
      params[actionProperty] = actionValue;
    }
  });

  if (params.choices) {
    if (typeof params.choices === 'string') {
      params.choices = params.choices.split('').join(', ');
    } else if (Array.isArray(params.choices)) {
      params.choices = params.choices.join(', ');
    } else {
      params.choices = Object.keys(params.choices).join(', ');
    }
  }

  return sprintf(this._getHelpString(action), params);
};

HelpFormatter.prototype._splitLines = function (text, width) {
  var lines = [];
  var delimiters = [ ' ', '.', ',', '!', '?' ];
  var re = new RegExp('[' + delimiters.join('') + '][^' + delimiters.join('') + ']*$');

  text = text.replace(/[\n\|\t]/g, ' ');

  text = text.trim();
  text = text.replace(this._whitespaceMatcher, ' ');

  // Wraps the single paragraph in text (a string) so every line
  // is at most width characters long.
  text.split(c.EOL).forEach(function (line) {
    if (width >= line.length) {
      lines.push(line);
      return;
    }

    var wrapStart = 0;
    var wrapEnd = width;
    var delimiterIndex = 0;
    while (wrapEnd <= line.length) {
      if (wrapEnd !== line.length && delimiters.indexOf(line[wrapEnd] < -1)) {
        delimiterIndex = (re.exec(line.substring(wrapStart, wrapEnd)) || {}).index;
        wrapEnd = wrapStart + delimiterIndex + 1;
      }
      lines.push(line.substring(wrapStart, wrapEnd));
      wrapStart = wrapEnd;
      wrapEnd += width;
    }
    if (wrapStart < line.length) {
      lines.push(line.substring(wrapStart, wrapEnd));
    }
  });

  return lines;
};

HelpFormatter.prototype._fillText = function (text, width, indent) {
  var lines = this._splitLines(text, width);
  lines = lines.map(function (line) {
    return indent + line;
  });
  return lines.join(c.EOL);
};

HelpFormatter.prototype._getHelpString = function (action) {
  return action.help;
};
'use strict';


var format  = require('util').format;


var ERR_CODE = 'ARGError';

/*:nodoc:*
 * argumentError(argument, message) -> TypeError
 * - argument (Object): action with broken argument
 * - message (String): error message
 *
 * Error format helper. An error from creating or using an argument
 * (optional or positional). The string value of this exception
 * is the message, augmented with information
 * about the argument that caused it.
 *
 * #####Example
 *
 *      var argumentErrorHelper = require('./argument/error');
 *      if (conflictOptionals.length > 0) {
 *        throw argumentErrorHelper(
 *          action,
 *          format('Conflicting option string(s): %s', conflictOptionals.join(', '))
 *        );
 *      }
 *
 **/
module.exports = function (argument, message) {
  var argumentName = null;
  var errMessage;
  var err;

  if (argument.getName) {
    argumentName = argument.getName();
  } else {
    argumentName = '' + argument;
  }

  if (!argumentName) {
    errMessage = message;
  } else {
    errMessage = format('argument "%s": %s', argumentName, message);
  }

  err = new TypeError(errMessage);
  err.code = ERR_CODE;
  return err;
};
/** internal
 * class MutuallyExclusiveGroup
 *
 * Group arguments.
 * By default, ArgumentParser groups command-line arguments
 * into â€œpositional argumentsâ€� and â€œoptional argumentsâ€�
 * when displaying help messages. When there is a better
 * conceptual grouping of arguments than this default one,
 * appropriate groups can be created using the addArgumentGroup() method
 *
 * This class inherited from [[ArgumentContainer]]
 **/
'use strict';

var util = require('util');

var ArgumentGroup = require('./group');

/**
 * new MutuallyExclusiveGroup(container, options)
 * - container (object): main container
 * - options (object): options.required -> true/false
 *
 * `required` could be an argument itself, but making it a property of
 * the options argument is more consistent with the JS adaptation of the Python)
 **/
var MutuallyExclusiveGroup = module.exports = function MutuallyExclusiveGroup(container, options) {
  var required;
  options = options || {};
  required = options.required || false;
  ArgumentGroup.call(this, container);
  this.required = required;

};
util.inherits(MutuallyExclusiveGroup, ArgumentGroup);


MutuallyExclusiveGroup.prototype._addAction = function (action) {
  var msg;
  if (action.required) {
    msg = 'mutually exclusive arguments must be optional';
    throw new Error(msg);
  }
  action = this._container._addAction(action);
  this._groupActions.push(action);
  return action;
};


MutuallyExclusiveGroup.prototype._removeAction = function (action) {
  this._container._removeAction(action);
  this._groupActions.remove(action);
};

/** internal
 * class ArgumentGroup
 *
 * Group arguments.
 * By default, ArgumentParser groups command-line arguments
 * into â€œpositional argumentsâ€� and â€œoptional argumentsâ€�
 * when displaying help messages. When there is a better
 * conceptual grouping of arguments than this default one,
 * appropriate groups can be created using the addArgumentGroup() method
 *
 * This class inherited from [[ArgumentContainer]]
 **/
'use strict';

var util = require('util');

var ActionContainer = require('../action_container');


/**
 * new ArgumentGroup(container, options)
 * - container (object): main container
 * - options (object): hash of group options
 *
 * #### options
 * - **prefixChars**  group name prefix
 * - **argumentDefault**  default argument value
 * - **title**  group title
 * - **description** group description
 *
 **/
var ArgumentGroup = module.exports = function ArgumentGroup(container, options) {

  options = options || {};

  // add any missing keyword arguments by checking the container
  options.conflictHandler = (options.conflictHandler || container.conflictHandler);
  options.prefixChars = (options.prefixChars || container.prefixChars);
  options.argumentDefault = (options.argumentDefault || container.argumentDefault);

  ActionContainer.call(this, options);

  // group attributes
  this.title = options.title;
  this._groupActions = [];

  // share most attributes with the container
  this._container = container;
  this._registries = container._registries;
  this._actions = container._actions;
  this._optionStringActions = container._optionStringActions;
  this._defaults = container._defaults;
  this._hasNegativeNumberOptionals = container._hasNegativeNumberOptionals;
  this._mutuallyExclusiveGroups = container._mutuallyExclusiveGroups;
};
util.inherits(ArgumentGroup, ActionContainer);


ArgumentGroup.prototype._addAction = function (action) {
  // Parent add action
  action = ActionContainer.prototype._addAction.call(this, action);
  this._groupActions.push(action);
  return action;
};


ArgumentGroup.prototype._removeAction = function (action) {
  // Parent remove action
  ActionContainer.prototype._removeAction.call(this, action);
  var actionIndex = this._groupActions.indexOf(action);
  if (actionIndex >= 0) {
    this._groupActions.splice(actionIndex, 1);
  }
};

/*:nodoc:*
 * class ActionAppend
 *
 * This action stores a list, and appends each argument value to the list.
 * This is useful to allow an option to be specified multiple times.
 * This class inherided from [[Action]]
 *
 **/

'use strict';

var util = require('util');

var Action = require('../action');

// Constants
var c = require('../const');

/*:nodoc:*
 * new ActionAppend(options)
 * - options (object): options hash see [[Action.new]]
 *
 * Note: options.nargs should be optional for constants
 * and more then zero for other
 **/
var ActionAppend = module.exports = function ActionAppend(options) {
  options = options || {};
  if (this.nargs <= 0) {
    throw new Error('nargs for append actions must be > 0; if arg ' +
        'strings are not supplying the value to append, ' +
        'the append const action may be more appropriate');
  }
  if (!!this.constant && this.nargs !== c.OPTIONAL) {
    throw new Error('nargs must be OPTIONAL to supply const');
  }
  Action.call(this, options);
};
util.inherits(ActionAppend, Action);

/*:nodoc:*
 * ActionAppend#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionAppend.prototype.call = function (parser, namespace, values) {
  var items = (namespace[this.dest] || []).slice();
  items.push(values);
  namespace.set(this.dest, items);
};
/*:nodoc:*
 * class ActionCount
 *
 * This counts the number of times a keyword argument occurs.
 * For example, this is useful for increasing verbosity levels
 *
 * This class inherided from [[Action]]
 *
 **/
'use strict';

var util = require('util');

var Action = require('../action');

/*:nodoc:*
 * new ActionCount(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionCount = module.exports = function ActionCount(options) {
  options = options || {};
  options.nargs = 0;

  Action.call(this, options);
};
util.inherits(ActionCount, Action);

/*:nodoc:*
 * ActionCount#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionCount.prototype.call = function (parser, namespace) {
  namespace.set(this.dest, (namespace[this.dest] || 0) + 1);
};
/*:nodoc:*
 * class ActionHelp
 *
 * Support action for printing help
 * This class inherided from [[Action]]
 **/
'use strict';

var util = require('util');

var Action = require('../action');

// Constants
var c  = require('../const');

/*:nodoc:*
 * new ActionHelp(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionHelp = module.exports = function ActionHelp(options) {
  options = options || {};
  if (options.defaultValue !== null) {
    options.defaultValue = options.defaultValue;
  } else {
    options.defaultValue = c.SUPPRESS;
  }
  options.dest = (options.dest !== null ? options.dest : c.SUPPRESS);
  options.nargs = 0;
  Action.call(this, options);

};
util.inherits(ActionHelp, Action);

/*:nodoc:*
 * ActionHelp#call(parser, namespace, values, optionString)
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Print help and exit
 **/
ActionHelp.prototype.call = function (parser) {
  parser.printHelp();
  parser.exit();
};
/*:nodoc:*
 * class ActionStore
 *
 * This action just stores the argumentâ€™s value. This is the default action.
 *
 * This class inherited from [[Action]]
 *
 **/
'use strict';

var util = require('util');

var Action = require('../action');

// Constants
var c = require('../const');


/*:nodoc:*
 * new ActionStore(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionStore = module.exports = function ActionStore(options) {
  options = options || {};
  if (this.nargs <= 0) {
    throw new Error('nargs for store actions must be > 0; if you ' +
        'have nothing to store, actions such as store ' +
        'true or store const may be more appropriate');

  }
  if (typeof this.constant !== 'undefined' && this.nargs !== c.OPTIONAL) {
    throw new Error('nargs must be OPTIONAL to supply const');
  }
  Action.call(this, options);
};
util.inherits(ActionStore, Action);

/*:nodoc:*
 * ActionStore#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionStore.prototype.call = function (parser, namespace, values) {
  namespace.set(this.dest, values);
};
/** internal
 * class ActionSubparsers
 *
 * Support the creation of such sub-commands with the addSubparsers()
 *
 * This class inherited from [[Action]]
 **/
'use strict';

var util    = require('util');
var format  = require('util').format;


var Action = require('../action');

// Constants
var c = require('../const');

// Errors
var argumentErrorHelper = require('../argument/error');


/*:nodoc:*
 * new ChoicesPseudoAction(name, help)
 *
 * Create pseudo action for correct help text
 *
 **/
function ChoicesPseudoAction(name, help) {
  var options = {
    optionStrings: [],
    dest: name,
    help: help
  };

  Action.call(this, options);
}

util.inherits(ChoicesPseudoAction, Action);

/**
 * new ActionSubparsers(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
function ActionSubparsers(options) {
  options = options || {};
  options.dest = options.dest || c.SUPPRESS;
  options.nargs = c.PARSER;

  this.debug = (options.debug === true);

  this._progPrefix = options.prog;
  this._parserClass = options.parserClass;
  this._nameParserMap = {};
  this._choicesActions = [];

  options.choices = this._nameParserMap;
  Action.call(this, options);
}

util.inherits(ActionSubparsers, Action);

/*:nodoc:*
 * ActionSubparsers#addParser(name, options) -> ArgumentParser
 * - name (string): sub-command name
 * - options (object): see [[ArgumentParser.new]]
 *
 *  Note:
 *  addParser supports an additional aliases option,
 *  which allows multiple strings to refer to the same subparser.
 *  This example, like svn, aliases co as a shorthand for checkout
 *
 **/
ActionSubparsers.prototype.addParser = function (name, options) {
  var parser;

  var self = this;

  options = options || {};

  options.debug = (this.debug === true);

  // set program from the existing prefix
  if (!options.prog) {
    options.prog = this._progPrefix + ' ' + name;
  }

  var aliases = options.aliases || [];

  // create a pseudo-action to hold the choice help
  if (!!options.help || typeof options.help === 'string') {
    var help = options.help;
    delete options.help;

    var choiceAction = new ChoicesPseudoAction(name, help);
    this._choicesActions.push(choiceAction);
  }

  // create the parser and add it to the map
  parser = new this._parserClass(options);
  this._nameParserMap[name] = parser;

  // make parser available under aliases also
  aliases.forEach(function (alias) {
    self._nameParserMap[alias] = parser;
  });

  return parser;
};

ActionSubparsers.prototype._getSubactions = function () {
  return this._choicesActions;
};

/*:nodoc:*
 * ActionSubparsers#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Parse input aguments
 **/
ActionSubparsers.prototype.call = function (parser, namespace, values) {
  var parserName = values[0];
  var argStrings = values.slice(1);

  // set the parser name if requested
  if (this.dest !== c.SUPPRESS) {
    namespace[this.dest] = parserName;
  }

  // select the parser
  if (this._nameParserMap[parserName]) {
    parser = this._nameParserMap[parserName];
  } else {
    throw argumentErrorHelper(format(
      'Unknown parser "%s" (choices: [%s]).',
        parserName,
        Object.keys(this._nameParserMap).join(', ')
    ));
  }

  // parse all the remaining options into the namespace
  parser.parseArgs(argStrings, namespace);
};

module.exports = ActionSubparsers;
/*:nodoc:*
 * class ActionVersion
 *
 * Support action for printing program version
 * This class inherited from [[Action]]
 **/
'use strict';

var util = require('util');

var Action = require('../action');

//
// Constants
//
var c = require('../const');

/*:nodoc:*
 * new ActionVersion(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionVersion = module.exports = function ActionVersion(options) {
  options = options || {};
  options.defaultValue = (options.defaultValue ? options.defaultValue : c.SUPPRESS);
  options.dest = (options.dest || c.SUPPRESS);
  options.nargs = 0;
  this.version = options.version;
  Action.call(this, options);
};
util.inherits(ActionVersion, Action);

/*:nodoc:*
 * ActionVersion#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Print version and exit
 **/
ActionVersion.prototype.call = function (parser) {
  var version = this.version || parser.version;
  var formatter = parser._getFormatter();
  formatter.addText(version);
  parser.exit(0, formatter.formatHelp());
};
/*:nodoc:*
 * class ActionStoreConstant
 *
 * This action stores the value specified by the const keyword argument.
 * (Note that the const keyword argument defaults to the rather unhelpful null.)
 * The 'store_const' action is most commonly used with optional
 * arguments that specify some sort of flag.
 *
 * This class inherited from [[Action]]
 **/
'use strict';

var util = require('util');

var Action = require('../../action');

/*:nodoc:*
 * new ActionStoreConstant(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionStoreConstant = module.exports = function ActionStoreConstant(options) {
  options = options || {};
  options.nargs = 0;
  if (typeof options.constant === 'undefined') {
    throw new Error('constant option is required for storeAction');
  }
  Action.call(this, options);
};
util.inherits(ActionStoreConstant, Action);

/*:nodoc:*
 * ActionStoreConstant#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionStoreConstant.prototype.call = function (parser, namespace) {
  namespace.set(this.dest, this.constant);
};
/*:nodoc:*
 * class ActionStoreFalse
 *
 * This action store the values False respectively.
 * This is special cases of 'storeConst'
 *
 * This class inherited from [[Action]]
 **/

'use strict';

var util = require('util');

var ActionStoreConstant = require('./constant');

/*:nodoc:*
 * new ActionStoreFalse(options)
 * - options (object): hash of options see [[Action.new]]
 *
 **/
var ActionStoreFalse = module.exports = function ActionStoreFalse(options) {
  options = options || {};
  options.constant = false;
  options.defaultValue = options.defaultValue !== null ? options.defaultValue : true;
  ActionStoreConstant.call(this, options);
};
util.inherits(ActionStoreFalse, ActionStoreConstant);
/*:nodoc:*
 * class ActionStoreTrue
 *
 * This action store the values True respectively.
 * This isspecial cases of 'storeConst'
 *
 * This class inherited from [[Action]]
 **/
'use strict';

var util = require('util');

var ActionStoreConstant = require('./constant');

/*:nodoc:*
 * new ActionStoreTrue(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionStoreTrue = module.exports = function ActionStoreTrue(options) {
  options = options || {};
  options.constant = true;
  options.defaultValue = options.defaultValue !== null ? options.defaultValue : false;
  ActionStoreConstant.call(this, options);
};
util.inherits(ActionStoreTrue, ActionStoreConstant);
/*:nodoc:*
 * class ActionAppendConstant
 *
 * This stores a list, and appends the value specified by
 * the const keyword argument to the list.
 * (Note that the const keyword argument defaults to null.)
 * The 'appendConst' action is typically useful when multiple
 * arguments need to store constants to the same list.
 *
 * This class inherited from [[Action]]
 **/

'use strict';

var util = require('util');

var Action = require('../../action');

/*:nodoc:*
 * new ActionAppendConstant(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionAppendConstant = module.exports = function ActionAppendConstant(options) {
  options = options || {};
  options.nargs = 0;
  if (typeof options.constant === 'undefined') {
    throw new Error('constant option is required for appendAction');
  }
  Action.call(this, options);
};
util.inherits(ActionAppendConstant, Action);

/*:nodoc:*
 * ActionAppendConstant#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionAppendConstant.prototype.call = function (parser, namespace) {
  var items = [].concat(namespace[this.dest] || []);
  items.push(this.constant);
  namespace.set(this.dest, items);
};
Dave Eddy <dave@daveeddy.com>
Fred Kuo <fred.kuo@joyent.com>
Lars-Magnus Skog <ralphtheninja@riseup.net>
Mark Cavage <mcavage@gmail.com>
Patrick Mooney <pmooney@pfmooney.com>
Rob Gulewich <robert.gulewich@joyent.com>
# assert-plus Changelog

## 1.0.0

- *BREAKING* assert.number (and derivatives) now accept Infinity as valid input
- Add assert.finite check.  Previous assert.number callers should use this if
  they expect Infinity inputs to throw.

## 0.2.0

- Fix `assert.object(null)` so it throws
- Fix optional/arrayOf exports for non-type-of asserts
- Add optiona/arrayOf exports for Stream/Date/Regex/uuid
- Add basic unit test coverage
// Copyright (c) 2012, Mark Cavage. All rights reserved.
// Copyright 2015 Joyent, Inc.

var assert = require('assert');
var Stream = require('stream').Stream;
var util = require('util');


///--- Globals

/* JSSTYLED */
var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;


///--- Internal

function _capitalize(str) {
    return (str.charAt(0).toUpperCase() + str.slice(1));
}

function _toss(name, expected, oper, arg, actual) {
    throw new assert.AssertionError({
        message: util.format('%s (%s) is required', name, expected),
        actual: (actual === undefined) ? typeof (arg) : actual(arg),
        expected: expected,
        operator: oper || '===',
        stackStartFunction: _toss.caller
    });
}

function _getClass(arg) {
    return (Object.prototype.toString.call(arg).slice(8, -1));
}

function noop() {
    // Why even bother with asserts?
}


///--- Exports

var types = {
    bool: {
        check: function (arg) { return typeof (arg) === 'boolean'; }
    },
    func: {
        check: function (arg) { return typeof (arg) === 'function'; }
    },
    string: {
        check: function (arg) { return typeof (arg) === 'string'; }
    },
    object: {
        check: function (arg) {
            return typeof (arg) === 'object' && arg !== null;
        }
    },
    number: {
        check: function (arg) {
            return typeof (arg) === 'number' && !isNaN(arg);
        }
    },
    finite: {
        check: function (arg) {
            return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg);
        }
    },
    buffer: {
        check: function (arg) { return Buffer.isBuffer(arg); },
        operator: 'Buffer.isBuffer'
    },
    array: {
        check: function (arg) { return Array.isArray(arg); },
        operator: 'Array.isArray'
    },
    stream: {
        check: function (arg) { return arg instanceof Stream; },
        operator: 'instanceof',
        actual: _getClass
    },
    date: {
        check: function (arg) { return arg instanceof Date; },
        operator: 'instanceof',
        actual: _getClass
    },
    regexp: {
        check: function (arg) { return arg instanceof RegExp; },
        operator: 'instanceof',
        actual: _getClass
    },
    uuid: {
        check: function (arg) {
            return typeof (arg) === 'string' && UUID_REGEXP.test(arg);
        },
        operator: 'isUUID'
    }
};

function _setExports(ndebug) {
    var keys = Object.keys(types);
    var out;

    /* re-export standard assert */
    if (process.env.NODE_NDEBUG) {
        out = noop;
    } else {
        out = function (arg, msg) {
            if (!arg) {
                _toss(msg, 'true', arg);
            }
        };
    }

    /* standard checks */
    keys.forEach(function (k) {
        if (ndebug) {
            out[k] = noop;
            return;
        }
        var type = types[k];
        out[k] = function (arg, msg) {
            if (!type.check(arg)) {
                _toss(msg, k, type.operator, arg, type.actual);
            }
        };
    });

    /* optional checks */
    keys.forEach(function (k) {
        var name = 'optional' + _capitalize(k);
        if (ndebug) {
            out[name] = noop;
            return;
        }
        var type = types[k];
        out[name] = function (arg, msg) {
            if (arg === undefined || arg === null) {
                return;
            }
            if (!type.check(arg)) {
                _toss(msg, k, type.operator, arg, type.actual);
            }
        };
    });

    /* arrayOf checks */
    keys.forEach(function (k) {
        var name = 'arrayOf' + _capitalize(k);
        if (ndebug) {
            out[name] = noop;
            return;
        }
        var type = types[k];
        var expected = '[' + k + ']';
        out[name] = function (arg, msg) {
            if (!Array.isArray(arg)) {
                _toss(msg, expected, type.operator, arg, type.actual);
            }
            var i;
            for (i = 0; i < arg.length; i++) {
                if (!type.check(arg[i])) {
                    _toss(msg, expected, type.operator, arg, type.actual);
                }
            }
        };
    });

    /* optionalArrayOf checks */
    keys.forEach(function (k) {
        var name = 'optionalArrayOf' + _capitalize(k);
        if (ndebug) {
            out[name] = noop;
            return;
        }
        var type = types[k];
        var expected = '[' + k + ']';
        out[name] = function (arg, msg) {
            if (arg === undefined || arg === null) {
                return;
            }
            if (!Array.isArray(arg)) {
                _toss(msg, expected, type.operator, arg, type.actual);
            }
            var i;
            for (i = 0; i < arg.length; i++) {
                if (!type.check(arg[i])) {
                    _toss(msg, expected, type.operator, arg, type.actual);
                }
            }
        };
    });

    /* re-export built-in assertions */
    Object.keys(assert).forEach(function (k) {
        if (k === 'AssertionError') {
            out[k] = assert[k];
            return;
        }
        if (ndebug) {
            out[k] = noop;
            return;
        }
        out[k] = assert[k];
    });

    /* export ourselves (for unit tests _only_) */
    out._setExports = _setExports;

    return out;
}

module.exports = _setExports(process.env.NODE_NDEBUG);
{
  "author": {
    "name": "Mark Cavage",
    "email": "mcavage@gmail.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Extra assertions on top of node's assert module",
  "devDependencies": {
    "faucet": "0.0.1",
    "tape": "4.2.2"
  },
  "engines": {
    "node": ">=0.8"
  },
  "homepage": "https://github.com/mcavage/node-assert-plus#readme",
  "license": "MIT",
  "main": "./assert.js",
  "name": "assert-plus",
  "optionalDependencies": {},
  "repository": {
    "type": "git",
    "url": "git+https://github.com/mcavage/node-assert-plus.git"
  },
  "version": "1.0.0"
}'use strict';

const hooks = [];
const errHooks = [];
let called = false;
let waitingFor = 0;
let asyncTimeoutMs = 10000;

const events = {};
const filters = {};

function exit(exit, code, err) {
	// Helper functions
	let doExitDone = false;

	function doExit() {
		if (doExitDone) {
			return;
		}
		doExitDone = true;

		if (exit === true) {
			// All handlers should be called even if the exit-hook handler was registered first
			process.nextTick(process.exit.bind(null, code));
		}
	}

	// Async hook callback, decrements waiting counter
	function stepTowardExit() {
		process.nextTick(() => {
			if (--waitingFor === 0) {
				doExit();
			}
		});
	}

	// Runs a single hook
	function runHook(syncArgCount, err, hook) {
		// Cannot perform async hooks in `exit` event
		if (exit && hook.length > syncArgCount) {
			// Hook is async, expects a finish callback
			waitingFor++;

			if (err) {
				// Pass error, calling uncaught exception handlers
				return hook(err, stepTowardExit);
			}
			return hook(stepTowardExit);
		}

		// Hook is synchronous
		if (err) {
			// Pass error, calling uncaught exception handlers
			return hook(err);
		}
		return hook();
	}

	// Only execute hooks once
	if (called) {
		return;
	}

	called = true;

	// Run hooks
	if (err) {
		// Uncaught exception, run error hooks
		errHooks.map(runHook.bind(null, 1, err));
	}
	hooks.map(runHook.bind(null, 0, null));

	if (waitingFor) {
		// Force exit after x ms (10000 by default), even if async hooks in progress
		setTimeout(() => {
			doExit();
		}, asyncTimeoutMs);
	} else {
		// No asynchronous hooks, exit immediately
		doExit();
	}
}

// Add a hook
function add(hook) {
	hooks.push(hook);

	if (hooks.length === 1) {
		add.hookEvent('exit');
		add.hookEvent('beforeExit', 0);
		add.hookEvent('SIGHUP', 128 + 1);
		add.hookEvent('SIGINT', 128 + 2);
		add.hookEvent('SIGTERM', 128 + 15);
		add.hookEvent('SIGBREAK', 128 + 21);

		// PM2 Cluster shutdown message. Caught to support async handlers with pm2, needed because
		// explicitly calling process.exit() doesn't trigger the beforeExit event, and the exit
		// event cannot support async handlers, since the event loop is never called after it.
		add.hookEvent('message', 0, function (msg) { // eslint-disable-line prefer-arrow-callback
			if (msg !== 'shutdown') {
				return true;
			}
		});
	}
}

// New signal / event to hook
add.hookEvent = function (event, code, filter) {
	events[event] = function () {
		const eventFilters = filters[event];
		for (let i = 0; i < eventFilters.length; i++) {
			if (eventFilters[i].apply(this, arguments)) {
				return;
			}
		}
		exit(code !== undefined && code !== null, code);
	};

	if (!filters[event]) {
		filters[event] = [];
	}

	if (filter) {
		filters[event].push(filter);
	}
	process.on(event, events[event]);
};

// Unhook signal / event
add.unhookEvent = function (event) {
	process.removeListener(event, events[event]);
	delete events[event];
	delete filters[event];
};

// List hooked events
add.hookedEvents = function () {
	const ret = [];
	for (const name in events) {
		if ({}.hasOwnProperty.call(events, name)) {
			ret.push(name);
		}
	}
	return ret;
};

// Add an uncaught exception handler
add.uncaughtExceptionHandler = function (hook) {
	errHooks.push(hook);

	if (errHooks.length === 1) {
		process.once('uncaughtException', exit.bind(null, true, 1));
	}
};

// Add an unhandled rejection handler
add.unhandledRejectionHandler = function (hook) {
	errHooks.push(hook);

	if (errHooks.length === 1) {
		process.once('unhandledRejection', exit.bind(null, true, 1));
	}
};

// Configure async force exit timeout
add.forceExitTimeout = function (ms) {
	asyncTimeoutMs = ms;
};

// Export
module.exports = add;
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Tapani Moilanen",
    "email": "moilanen.tapani@gmail.com",
    "url": "https://github.com/tapppi"
  },
  "deprecated": false,
  "description": "Run some code when the process exits (supports async hooks and pm2 clustering)",
  "devDependencies": {
    "ava": "^0.21.0",
    "coveralls": "^2.11.14",
    "nyc": "^10.3.2",
    "standard-version": "^4.2.0",
    "xo": "^0.18.2"
  },
  "engines": {
    "node": ">=0.12.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/tapppi/async-exit-hook#readme",
  "license": "MIT",
  "name": "async-exit-hook",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/tapppi/async-exit-hook.git"
  },
  "version": "2.0.1"
}(MIT)

Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';
module.exports = balanced;
function balanced(a, b, str) {
  if (a instanceof RegExp) a = maybeMatch(a, str);
  if (b instanceof RegExp) b = maybeMatch(b, str);

  var r = range(a, b, str);

  return r && {
    start: r[0],
    end: r[1],
    pre: str.slice(0, r[0]),
    body: str.slice(r[0] + a.length, r[1]),
    post: str.slice(r[1] + b.length)
  };
}

function maybeMatch(reg, str) {
  var m = str.match(reg);
  return m ? m[0] : null;
}

balanced.range = range;
function range(a, b, str) {
  var begs, beg, left, right, result;
  var ai = str.indexOf(a);
  var bi = str.indexOf(b, ai + 1);
  var i = ai;

  if (ai >= 0 && bi > 0) {
    begs = [];
    left = str.length;

    while (i >= 0 && !result) {
      if (i == ai) {
        begs.push(i);
        ai = str.indexOf(a, i + 1);
      } else if (begs.length == 1) {
        result = [ begs.pop(), bi ];
      } else {
        beg = begs.pop();
        if (beg < left) {
          left = beg;
          right = bi;
        }

        bi = str.indexOf(b, i + 1);
      }

      i = ai < bi && ai >= 0 ? ai : bi;
    }

    if (begs.length) {
      result = [ left, right ];
    }
  }

  return result;
}
{
  "author": {
    "name": "Julian Gruber",
    "email": "mail@juliangruber.com",
    "url": "http://juliangruber.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Match balanced character pairs, like \"{\" and \"}\"",
  "devDependencies": {
    "matcha": "^0.7.0",
    "tape": "^4.6.0"
  },
  "homepage": "https://github.com/juliangruber/balanced-match",
  "license": "MIT",
  "main": "index.js",
  "name": "balanced-match",
  "repository": {
    "type": "git",
    "url": "git://github.com/juliangruber/balanced-match.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/8..latest",
      "firefox/20..latest",
      "firefox/nightly",
      "chrome/25..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  },
  "version": "1.0.0"
}The MIT License (MIT)

Copyright (c) 2014 Jameson Little

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
(function(r){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=r()}else if(typeof define==="function"&&define.amd){define([],r)}else{var e;if(typeof window!=="undefined"){e=window}else if(typeof global!=="undefined"){e=global}else if(typeof self!=="undefined"){e=self}else{e=this}e.base64js=r()}})(function(){var r,e,n;return function(){function d(a,f,i){function u(n,r){if(!f[n]){if(!a[n]){var e="function"==typeof require&&require;if(!r&&e)return e(n,!0);if(v)return v(n,!0);var t=new Error("Cannot find module '"+n+"'");throw t.code="MODULE_NOT_FOUND",t}var o=f[n]={exports:{}};a[n][0].call(o.exports,function(r){var e=a[n][1][r];return u(e||r)},o,o.exports,d,a,f,i)}return f[n].exports}for(var v="function"==typeof require&&require,r=0;r<i.length;r++)u(i[r]);return u}return d}()({"/":[function(r,e,n){"use strict";n.byteLength=f;n.toByteArray=i;n.fromByteArray=p;var u=[];var v=[];var d=typeof Uint8Array!=="undefined"?Uint8Array:Array;var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(var o=0,a=t.length;o<a;++o){u[o]=t[o];v[t.charCodeAt(o)]=o}v["-".charCodeAt(0)]=62;v["_".charCodeAt(0)]=63;function c(r){var e=r.length;if(e%4>0){throw new Error("Invalid string. Length must be a multiple of 4")}var n=r.indexOf("=");if(n===-1)n=e;var t=n===e?0:4-n%4;return[n,t]}function f(r){var e=c(r);var n=e[0];var t=e[1];return(n+t)*3/4-t}function h(r,e,n){return(e+n)*3/4-n}function i(r){var e;var n=c(r);var t=n[0];var o=n[1];var a=new d(h(r,t,o));var f=0;var i=o>0?t-4:t;var u;for(u=0;u<i;u+=4){e=v[r.charCodeAt(u)]<<18|v[r.charCodeAt(u+1)]<<12|v[r.charCodeAt(u+2)]<<6|v[r.charCodeAt(u+3)];a[f++]=e>>16&255;a[f++]=e>>8&255;a[f++]=e&255}if(o===2){e=v[r.charCodeAt(u)]<<2|v[r.charCodeAt(u+1)]>>4;a[f++]=e&255}if(o===1){e=v[r.charCodeAt(u)]<<10|v[r.charCodeAt(u+1)]<<4|v[r.charCodeAt(u+2)]>>2;a[f++]=e>>8&255;a[f++]=e&255}return a}function s(r){return u[r>>18&63]+u[r>>12&63]+u[r>>6&63]+u[r&63]}function l(r,e,n){var t;var o=[];for(var a=e;a<n;a+=3){t=(r[a]<<16&16711680)+(r[a+1]<<8&65280)+(r[a+2]&255);o.push(s(t))}return o.join("")}function p(r){var e;var n=r.length;var t=n%3;var o=[];var a=16383;for(var f=0,i=n-t;f<i;f+=a){o.push(l(r,f,f+a>i?i:f+a))}if(t===1){e=r[n-1];o.push(u[e>>2]+u[e<<4&63]+"==")}else if(t===2){e=(r[n-2]<<8)+r[n-1];o.push(u[e>>10]+u[e>>4&63]+u[e<<2&63]+"=")}return o.join("")}},{}]},{},[])("/")});
'use strict'

exports.byteLength = byteLength
exports.toByteArray = toByteArray
exports.fromByteArray = fromByteArray

var lookup = []
var revLookup = []
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array

var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, len = code.length; i < len; ++i) {
  lookup[i] = code[i]
  revLookup[code.charCodeAt(i)] = i
}

// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
revLookup['-'.charCodeAt(0)] = 62
revLookup['_'.charCodeAt(0)] = 63

function getLens (b64) {
  var len = b64.length

  if (len % 4 > 0) {
    throw new Error('Invalid string. Length must be a multiple of 4')
  }

  // Trim off extra bytes after placeholder bytes are found
  // See: https://github.com/beatgammit/base64-js/issues/42
  var validLen = b64.indexOf('=')
  if (validLen === -1) validLen = len

  var placeHoldersLen = validLen === len
    ? 0
    : 4 - (validLen % 4)

  return [validLen, placeHoldersLen]
}

// base64 is 4/3 + up to two characters of the original data
function byteLength (b64) {
  var lens = getLens(b64)
  var validLen = lens[0]
  var placeHoldersLen = lens[1]
  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}

function _byteLength (b64, validLen, placeHoldersLen) {
  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}

function toByteArray (b64) {
  var tmp
  var lens = getLens(b64)
  var validLen = lens[0]
  var placeHoldersLen = lens[1]

  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))

  var curByte = 0

  // if there are placeholders, only get up to the last complete 4 chars
  var len = placeHoldersLen > 0
    ? validLen - 4
    : validLen

  var i
  for (i = 0; i < len; i += 4) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 18) |
      (revLookup[b64.charCodeAt(i + 1)] << 12) |
      (revLookup[b64.charCodeAt(i + 2)] << 6) |
      revLookup[b64.charCodeAt(i + 3)]
    arr[curByte++] = (tmp >> 16) & 0xFF
    arr[curByte++] = (tmp >> 8) & 0xFF
    arr[curByte++] = tmp & 0xFF
  }

  if (placeHoldersLen === 2) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 2) |
      (revLookup[b64.charCodeAt(i + 1)] >> 4)
    arr[curByte++] = tmp & 0xFF
  }

  if (placeHoldersLen === 1) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 10) |
      (revLookup[b64.charCodeAt(i + 1)] << 4) |
      (revLookup[b64.charCodeAt(i + 2)] >> 2)
    arr[curByte++] = (tmp >> 8) & 0xFF
    arr[curByte++] = tmp & 0xFF
  }

  return arr
}

function tripletToBase64 (num) {
  return lookup[num >> 18 & 0x3F] +
    lookup[num >> 12 & 0x3F] +
    lookup[num >> 6 & 0x3F] +
    lookup[num & 0x3F]
}

function encodeChunk (uint8, start, end) {
  var tmp
  var output = []
  for (var i = start; i < end; i += 3) {
    tmp =
      ((uint8[i] << 16) & 0xFF0000) +
      ((uint8[i + 1] << 8) & 0xFF00) +
      (uint8[i + 2] & 0xFF)
    output.push(tripletToBase64(tmp))
  }
  return output.join('')
}

function fromByteArray (uint8) {
  var tmp
  var len = uint8.length
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  var parts = []
  var maxChunkLength = 16383 // must be multiple of 3

  // go through the array every three bytes, we'll deal with trailing stuff later
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
    parts.push(encodeChunk(
      uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)
    ))
  }

  // pad the end with zeros, but make sure to not forget the extra bytes
  if (extraBytes === 1) {
    tmp = uint8[len - 1]
    parts.push(
      lookup[tmp >> 2] +
      lookup[(tmp << 4) & 0x3F] +
      '=='
    )
  } else if (extraBytes === 2) {
    tmp = (uint8[len - 2] << 8) + uint8[len - 1]
    parts.push(
      lookup[tmp >> 10] +
      lookup[(tmp >> 4) & 0x3F] +
      lookup[(tmp << 2) & 0x3F] +
      '='
    )
  }

  return parts.join('')
}
{
  "author": {
    "name": "T. Jameson Little",
    "email": "t.jameson.little@gmail.com"
  },
  "deprecated": false,
  "description": "Base64 encoding/decoding in pure JS",
  "devDependencies": {
    "benchmark": "^2.1.4",
    "browserify": "^16.3.0",
    "standard": "*",
    "tape": "4.x",
    "uglify-js": "^3.6.0"
  },
  "homepage": "https://github.com/beatgammit/base64-js",
  "license": "MIT",
  "main": "index.js",
  "name": "base64-js",
  "repository": {
    "type": "git",
    "url": "git://github.com/beatgammit/base64-js.git"
  },
  "version": "1.3.1"
}var bigInt = (function (undefined) {
    "use strict";

    var BASE = 1e7,
        LOG_BASE = 7,
        MAX_INT = 9007199254740992,
        MAX_INT_ARR = smallToArray(MAX_INT),
        DEFAULT_ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyz";

    var supportsNativeBigInt = typeof BigInt === "function";

    function Integer(v, radix, alphabet, caseSensitive) {
        if (typeof v === "undefined") return Integer[0];
        if (typeof radix !== "undefined") return +radix === 10 && !alphabet ? parseValue(v) : parseBase(v, radix, alphabet, caseSensitive);
        return parseValue(v);
    }

    function BigInteger(value, sign) {
        this.value = value;
        this.sign = sign;
        this.isSmall = false;
    }
    BigInteger.prototype = Object.create(Integer.prototype);

    function SmallInteger(value) {
        this.value = value;
        this.sign = value < 0;
        this.isSmall = true;
    }
    SmallInteger.prototype = Object.create(Integer.prototype);

    function NativeBigInt(value) {
        this.value = value;
    }
    NativeBigInt.prototype = Object.create(Integer.prototype);

    function isPrecise(n) {
        return -MAX_INT < n && n < MAX_INT;
    }

    function smallToArray(n) { // For performance reasons doesn't reference BASE, need to change this function if BASE changes
        if (n < 1e7)
            return [n];
        if (n < 1e14)
            return [n % 1e7, Math.floor(n / 1e7)];
        return [n % 1e7, Math.floor(n / 1e7) % 1e7, Math.floor(n / 1e14)];
    }

    function arrayToSmall(arr) { // If BASE changes this function may need to change
        trim(arr);
        var length = arr.length;
        if (length < 4 && compareAbs(arr, MAX_INT_ARR) < 0) {
            switch (length) {
                case 0: return 0;
                case 1: return arr[0];
                case 2: return arr[0] + arr[1] * BASE;
                default: return arr[0] + (arr[1] + arr[2] * BASE) * BASE;
            }
        }
        return arr;
    }

    function trim(v) {
        var i = v.length;
        while (v[--i] === 0);
        v.length = i + 1;
    }

    function createArray(length) { // function shamelessly stolen from Yaffle's library https://github.com/Yaffle/BigInteger
        var x = new Array(length);
        var i = -1;
        while (++i < length) {
            x[i] = 0;
        }
        return x;
    }

    function truncate(n) {
        if (n > 0) return Math.floor(n);
        return Math.ceil(n);
    }

    function add(a, b) { // assumes a and b are arrays with a.length >= b.length
        var l_a = a.length,
            l_b = b.length,
            r = new Array(l_a),
            carry = 0,
            base = BASE,
            sum, i;
        for (i = 0; i < l_b; i++) {
            sum = a[i] + b[i] + carry;
            carry = sum >= base ? 1 : 0;
            r[i] = sum - carry * base;
        }
        while (i < l_a) {
            sum = a[i] + carry;
            carry = sum === base ? 1 : 0;
            r[i++] = sum - carry * base;
        }
        if (carry > 0) r.push(carry);
        return r;
    }

    function addAny(a, b) {
        if (a.length >= b.length) return add(a, b);
        return add(b, a);
    }

    function addSmall(a, carry) { // assumes a is array, carry is number with 0 <= carry < MAX_INT
        var l = a.length,
            r = new Array(l),
            base = BASE,
            sum, i;
        for (i = 0; i < l; i++) {
            sum = a[i] - base + carry;
            carry = Math.floor(sum / base);
            r[i] = sum - carry * base;
            carry += 1;
        }
        while (carry > 0) {
            r[i++] = carry % base;
            carry = Math.floor(carry / base);
        }
        return r;
    }

    BigInteger.prototype.add = function (v) {
        var n = parseValue(v);
        if (this.sign !== n.sign) {
            return this.subtract(n.negate());
        }
        var a = this.value, b = n.value;
        if (n.isSmall) {
            return new BigInteger(addSmall(a, Math.abs(b)), this.sign);
        }
        return new BigInteger(addAny(a, b), this.sign);
    };
    BigInteger.prototype.plus = BigInteger.prototype.add;

    SmallInteger.prototype.add = function (v) {
        var n = parseValue(v);
        var a = this.value;
        if (a < 0 !== n.sign) {
            return this.subtract(n.negate());
        }
        var b = n.value;
        if (n.isSmall) {
            if (isPrecise(a + b)) return new SmallInteger(a + b);
            b = smallToArray(Math.abs(b));
        }
        return new BigInteger(addSmall(b, Math.abs(a)), a < 0);
    };
    SmallInteger.prototype.plus = SmallInteger.prototype.add;

    NativeBigInt.prototype.add = function (v) {
        return new NativeBigInt(this.value + parseValue(v).value);
    }
    NativeBigInt.prototype.plus = NativeBigInt.prototype.add;

    function subtract(a, b) { // assumes a and b are arrays with a >= b
        var a_l = a.length,
            b_l = b.length,
            r = new Array(a_l),
            borrow = 0,
            base = BASE,
            i, difference;
        for (i = 0; i < b_l; i++) {
            difference = a[i] - borrow - b[i];
            if (difference < 0) {
                difference += base;
                borrow = 1;
            } else borrow = 0;
            r[i] = difference;
        }
        for (i = b_l; i < a_l; i++) {
            difference = a[i] - borrow;
            if (difference < 0) difference += base;
            else {
                r[i++] = difference;
                break;
            }
            r[i] = difference;
        }
        for (; i < a_l; i++) {
            r[i] = a[i];
        }
        trim(r);
        return r;
    }

    function subtractAny(a, b, sign) {
        var value;
        if (compareAbs(a, b) >= 0) {
            value = subtract(a, b);
        } else {
            value = subtract(b, a);
            sign = !sign;
        }
        value = arrayToSmall(value);
        if (typeof value === "number") {
            if (sign) value = -value;
            return new SmallInteger(value);
        }
        return new BigInteger(value, sign);
    }

    function subtractSmall(a, b, sign) { // assumes a is array, b is number with 0 <= b < MAX_INT
        var l = a.length,
            r = new Array(l),
            carry = -b,
            base = BASE,
            i, difference;
        for (i = 0; i < l; i++) {
            difference = a[i] + carry;
            carry = Math.floor(difference / base);
            difference %= base;
            r[i] = difference < 0 ? difference + base : difference;
        }
        r = arrayToSmall(r);
        if (typeof r === "number") {
            if (sign) r = -r;
            return new SmallInteger(r);
        } return new BigInteger(r, sign);
    }

    BigInteger.prototype.subtract = function (v) {
        var n = parseValue(v);
        if (this.sign !== n.sign) {
            return this.add(n.negate());
        }
        var a = this.value, b = n.value;
        if (n.isSmall)
            return subtractSmall(a, Math.abs(b), this.sign);
        return subtractAny(a, b, this.sign);
    };
    BigInteger.prototype.minus = BigInteger.prototype.subtract;

    SmallInteger.prototype.subtract = function (v) {
        var n = parseValue(v);
        var a = this.value;
        if (a < 0 !== n.sign) {
            return this.add(n.negate());
        }
        var b = n.value;
        if (n.isSmall) {
            return new SmallInteger(a - b);
        }
        return subtractSmall(b, Math.abs(a), a >= 0);
    };
    SmallInteger.prototype.minus = SmallInteger.prototype.subtract;

    NativeBigInt.prototype.subtract = function (v) {
        return new NativeBigInt(this.value - parseValue(v).value);
    }
    NativeBigInt.prototype.minus = NativeBigInt.prototype.subtract;

    BigInteger.prototype.negate = function () {
        return new BigInteger(this.value, !this.sign);
    };
    SmallInteger.prototype.negate = function () {
        var sign = this.sign;
        var small = new SmallInteger(-this.value);
        small.sign = !sign;
        return small;
    };
    NativeBigInt.prototype.negate = function () {
        return new NativeBigInt(-this.value);
    }

    BigInteger.prototype.abs = function () {
        return new BigInteger(this.value, false);
    };
    SmallInteger.prototype.abs = function () {
        return new SmallInteger(Math.abs(this.value));
    };
    NativeBigInt.prototype.abs = function () {
        return new NativeBigInt(this.value >= 0 ? this.value : -this.value);
    }


    function multiplyLong(a, b) {
        var a_l = a.length,
            b_l = b.length,
            l = a_l + b_l,
            r = createArray(l),
            base = BASE,
            product, carry, i, a_i, b_j;
        for (i = 0; i < a_l; ++i) {
            a_i = a[i];
            for (var j = 0; j < b_l; ++j) {
                b_j = b[j];
                product = a_i * b_j + r[i + j];
                carry = Math.floor(product / base);
                r[i + j] = product - carry * base;
                r[i + j + 1] += carry;
            }
        }
        trim(r);
        return r;
    }

    function multiplySmall(a, b) { // assumes a is array, b is number with |b| < BASE
        var l = a.length,
            r = new Array(l),
            base = BASE,
            carry = 0,
            product, i;
        for (i = 0; i < l; i++) {
            product = a[i] * b + carry;
            carry = Math.floor(product / base);
            r[i] = product - carry * base;
        }
        while (carry > 0) {
            r[i++] = carry % base;
            carry = Math.floor(carry / base);
        }
        return r;
    }

    function shiftLeft(x, n) {
        var r = [];
        while (n-- > 0) r.push(0);
        return r.concat(x);
    }

    function multiplyKaratsuba(x, y) {
        var n = Math.max(x.length, y.length);

        if (n <= 30) return multiplyLong(x, y);
        n = Math.ceil(n / 2);

        var b = x.slice(n),
            a = x.slice(0, n),
            d = y.slice(n),
            c = y.slice(0, n);

        var ac = multiplyKaratsuba(a, c),
            bd = multiplyKaratsuba(b, d),
            abcd = multiplyKaratsuba(addAny(a, b), addAny(c, d));

        var product = addAny(addAny(ac, shiftLeft(subtract(subtract(abcd, ac), bd), n)), shiftLeft(bd, 2 * n));
        trim(product);
        return product;
    }

    // The following function is derived from a surface fit of a graph plotting the performance difference
    // between long multiplication and karatsuba multiplication versus the lengths of the two arrays.
    function useKaratsuba(l1, l2) {
        return -0.012 * l1 - 0.012 * l2 + 0.000015 * l1 * l2 > 0;
    }

    BigInteger.prototype.multiply = function (v) {
        var n = parseValue(v),
            a = this.value, b = n.value,
            sign = this.sign !== n.sign,
            abs;
        if (n.isSmall) {
            if (b === 0) return Integer[0];
            if (b === 1) return this;
            if (b === -1) return this.negate();
            abs = Math.abs(b);
            if (abs < BASE) {
                return new BigInteger(multiplySmall(a, abs), sign);
            }
            b = smallToArray(abs);
        }
        if (useKaratsuba(a.length, b.length)) // Karatsuba is only faster for certain array sizes
            return new BigInteger(multiplyKaratsuba(a, b), sign);
        return new BigInteger(multiplyLong(a, b), sign);
    };

    BigInteger.prototype.times = BigInteger.prototype.multiply;

    function multiplySmallAndArray(a, b, sign) { // a >= 0
        if (a < BASE) {
            return new BigInteger(multiplySmall(b, a), sign);
        }
        return new BigInteger(multiplyLong(b, smallToArray(a)), sign);
    }
    SmallInteger.prototype._multiplyBySmall = function (a) {
        if (isPrecise(a.value * this.value)) {
            return new SmallInteger(a.value * this.value);
        }
        return multiplySmallAndArray(Math.abs(a.value), smallToArray(Math.abs(this.value)), this.sign !== a.sign);
    };
    BigInteger.prototype._multiplyBySmall = function (a) {
        if (a.value === 0) return Integer[0];
        if (a.value === 1) return this;
        if (a.value === -1) return this.negate();
        return multiplySmallAndArray(Math.abs(a.value), this.value, this.sign !== a.sign);
    };
    SmallInteger.prototype.multiply = function (v) {
        return parseValue(v)._multiplyBySmall(this);
    };
    SmallInteger.prototype.times = SmallInteger.prototype.multiply;

    NativeBigInt.prototype.multiply = function (v) {
        return new NativeBigInt(this.value * parseValue(v).value);
    }
    NativeBigInt.prototype.times = NativeBigInt.prototype.multiply;

    function square(a) {
        //console.assert(2 * BASE * BASE < MAX_INT);
        var l = a.length,
            r = createArray(l + l),
            base = BASE,
            product, carry, i, a_i, a_j;
        for (i = 0; i < l; i++) {
            a_i = a[i];
            carry = 0 - a_i * a_i;
            for (var j = i; j < l; j++) {
                a_j = a[j];
                product = 2 * (a_i * a_j) + r[i + j] + carry;
                carry = Math.floor(product / base);
                r[i + j] = product - carry * base;
            }
            r[i + l] = carry;
        }
        trim(r);
        return r;
    }

    BigInteger.prototype.square = function () {
        return new BigInteger(square(this.value), false);
    };

    SmallInteger.prototype.square = function () {
        var value = this.value * this.value;
        if (isPrecise(value)) return new SmallInteger(value);
        return new BigInteger(square(smallToArray(Math.abs(this.value))), false);
    };

    NativeBigInt.prototype.square = function (v) {
        return new NativeBigInt(this.value * this.value);
    }

    function divMod1(a, b) { // Left over from previous version. Performs faster than divMod2 on smaller input sizes.
        var a_l = a.length,
            b_l = b.length,
            base = BASE,
            result = createArray(b.length),
            divisorMostSignificantDigit = b[b_l - 1],
            // normalization
            lambda = Math.ceil(base / (2 * divisorMostSignificantDigit)),
            remainder = multiplySmall(a, lambda),
            divisor = multiplySmall(b, lambda),
            quotientDigit, shift, carry, borrow, i, l, q;
        if (remainder.length <= a_l) remainder.push(0);
        divisor.push(0);
        divisorMostSignificantDigit = divisor[b_l - 1];
        for (shift = a_l - b_l; shift >= 0; shift--) {
            quotientDigit = base - 1;
            if (remainder[shift + b_l] !== divisorMostSignificantDigit) {
                quotientDigit = Math.floor((remainder[shift + b_l] * base + remainder[shift + b_l - 1]) / divisorMostSignificantDigit);
            }
            // quotientDigit <= base - 1
            carry = 0;
            borrow = 0;
            l = divisor.length;
            for (i = 0; i < l; i++) {
                carry += quotientDigit * divisor[i];
                q = Math.floor(carry / base);
                borrow += remainder[shift + i] - (carry - q * base);
                carry = q;
                if (borrow < 0) {
                    remainder[shift + i] = borrow + base;
                    borrow = -1;
                } else {
                    remainder[shift + i] = borrow;
                    borrow = 0;
                }
            }
            while (borrow !== 0) {
                quotientDigit -= 1;
                carry = 0;
                for (i = 0; i < l; i++) {
                    carry += remainder[shift + i] - base + divisor[i];
                    if (carry < 0) {
                        remainder[shift + i] = carry + base;
                        carry = 0;
                    } else {
                        remainder[shift + i] = carry;
                        carry = 1;
                    }
                }
                borrow += carry;
            }
            result[shift] = quotientDigit;
        }
        // denormalization
        remainder = divModSmall(remainder, lambda)[0];
        return [arrayToSmall(result), arrayToSmall(remainder)];
    }

    function divMod2(a, b) { // Implementation idea shamelessly stolen from Silent Matt's library http://silentmatt.com/biginteger/
        // Performs faster than divMod1 on larger input sizes.
        var a_l = a.length,
            b_l = b.length,
            result = [],
            part = [],
            base = BASE,
            guess, xlen, highx, highy, check;
        while (a_l) {
            part.unshift(a[--a_l]);
            trim(part);
            if (compareAbs(part, b) < 0) {
                result.push(0);
                continue;
            }
            xlen = part.length;
            highx = part[xlen - 1] * base + part[xlen - 2];
            highy = b[b_l - 1] * base + b[b_l - 2];
            if (xlen > b_l) {
                highx = (highx + 1) * base;
            }
            guess = Math.ceil(highx / highy);
            do {
                check = multiplySmall(b, guess);
                if (compareAbs(check, part) <= 0) break;
                guess--;
            } while (guess);
            result.push(guess);
            part = subtract(part, check);
        }
        result.reverse();
        return [arrayToSmall(result), arrayToSmall(part)];
    }

    function divModSmall(value, lambda) {
        var length = value.length,
            quotient = createArray(length),
            base = BASE,
            i, q, remainder, divisor;
        remainder = 0;
        for (i = length - 1; i >= 0; --i) {
            divisor = remainder * base + value[i];
            q = truncate(divisor / lambda);
            remainder = divisor - q * lambda;
            quotient[i] = q | 0;
        }
        return [quotient, remainder | 0];
    }

    function divModAny(self, v) {
        var value, n = parseValue(v);
        if (supportsNativeBigInt) {
            return [new NativeBigInt(self.value / n.value), new NativeBigInt(self.value % n.value)];
        }
        var a = self.value, b = n.value;
        var quotient;
        if (b === 0) throw new Error("Cannot divide by zero");
        if (self.isSmall) {
            if (n.isSmall) {
                return [new SmallInteger(truncate(a / b)), new SmallInteger(a % b)];
            }
            return [Integer[0], self];
        }
        if (n.isSmall) {
            if (b === 1) return [self, Integer[0]];
            if (b == -1) return [self.negate(), Integer[0]];
            var abs = Math.abs(b);
            if (abs < BASE) {
                value = divModSmall(a, abs);
                quotient = arrayToSmall(value[0]);
                var remainder = value[1];
                if (self.sign) remainder = -remainder;
                if (typeof quotient === "number") {
                    if (self.sign !== n.sign) quotient = -quotient;
                    return [new SmallInteger(quotient), new SmallInteger(remainder)];
                }
                return [new BigInteger(quotient, self.sign !== n.sign), new SmallInteger(remainder)];
            }
            b = smallToArray(abs);
        }
        var comparison = compareAbs(a, b);
        if (comparison === -1) return [Integer[0], self];
        if (comparison === 0) return [Integer[self.sign === n.sign ? 1 : -1], Integer[0]];

        // divMod1 is faster on smaller input sizes
        if (a.length + b.length <= 200)
            value = divMod1(a, b);
        else value = divMod2(a, b);

        quotient = value[0];
        var qSign = self.sign !== n.sign,
            mod = value[1],
            mSign = self.sign;
        if (typeof quotient === "number") {
            if (qSign) quotient = -quotient;
            quotient = new SmallInteger(quotient);
        } else quotient = new BigInteger(quotient, qSign);
        if (typeof mod === "number") {
            if (mSign) mod = -mod;
            mod = new SmallInteger(mod);
        } else mod = new BigInteger(mod, mSign);
        return [quotient, mod];
    }

    BigInteger.prototype.divmod = function (v) {
        var result = divModAny(this, v);
        return {
            quotient: result[0],
            remainder: result[1]
        };
    };
    NativeBigInt.prototype.divmod = SmallInteger.prototype.divmod = BigInteger.prototype.divmod;


    BigInteger.prototype.divide = function (v) {
        return divModAny(this, v)[0];
    };
    NativeBigInt.prototype.over = NativeBigInt.prototype.divide = function (v) {
        return new NativeBigInt(this.value / parseValue(v).value);
    };
    SmallInteger.prototype.over = SmallInteger.prototype.divide = BigInteger.prototype.over = BigInteger.prototype.divide;

    BigInteger.prototype.mod = function (v) {
        return divModAny(this, v)[1];
    };
    NativeBigInt.prototype.mod = NativeBigInt.prototype.remainder = function (v) {
        return new NativeBigInt(this.value % parseValue(v).value);
    };
    SmallInteger.prototype.remainder = SmallInteger.prototype.mod = BigInteger.prototype.remainder = BigInteger.prototype.mod;

    BigInteger.prototype.pow = function (v) {
        var n = parseValue(v),
            a = this.value,
            b = n.value,
            value, x, y;
        if (b === 0) return Integer[1];
        if (a === 0) return Integer[0];
        if (a === 1) return Integer[1];
        if (a === -1) return n.isEven() ? Integer[1] : Integer[-1];
        if (n.sign) {
            return Integer[0];
        }
        if (!n.isSmall) throw new Error("The exponent " + n.toString() + " is too large.");
        if (this.isSmall) {
            if (isPrecise(value = Math.pow(a, b)))
                return new SmallInteger(truncate(value));
        }
        x = this;
        y = Integer[1];
        while (true) {
            if (b & 1 === 1) {
                y = y.times(x);
                --b;
            }
            if (b === 0) break;
            b /= 2;
            x = x.square();
        }
        return y;
    };
    SmallInteger.prototype.pow = BigInteger.prototype.pow;

    NativeBigInt.prototype.pow = function (v) {
        var n = parseValue(v);
        var a = this.value, b = n.value;
        var _0 = BigInt(0), _1 = BigInt(1), _2 = BigInt(2);
        if (b === _0) return Integer[1];
        if (a === _0) return Integer[0];
        if (a === _1) return Integer[1];
        if (a === BigInt(-1)) return n.isEven() ? Integer[1] : Integer[-1];
        if (n.isNegative()) return new NativeBigInt(_0);
        var x = this;
        var y = Integer[1];
        while (true) {
            if ((b & _1) === _1) {
                y = y.times(x);
                --b;
            }
            if (b === _0) break;
            b /= _2;
            x = x.square();
        }
        return y;
    }

    BigInteger.prototype.modPow = function (exp, mod) {
        exp = parseValue(exp);
        mod = parseValue(mod);
        if (mod.isZero()) throw new Error("Cannot take modPow with modulus 0");
        var r = Integer[1],
            base = this.mod(mod);
        if (exp.isNegative()) {
            exp = exp.multiply(Integer[-1]);
            base = base.modInv(mod);
        }
        while (exp.isPositive()) {
            if (base.isZero()) return Integer[0];
            if (exp.isOdd()) r = r.multiply(base).mod(mod);
            exp = exp.divide(2);
            base = base.square().mod(mod);
        }
        return r;
    };
    NativeBigInt.prototype.modPow = SmallInteger.prototype.modPow = BigInteger.prototype.modPow;

    function compareAbs(a, b) {
        if (a.length !== b.length) {
            return a.length > b.length ? 1 : -1;
        }
        for (var i = a.length - 1; i >= 0; i--) {
            if (a[i] !== b[i]) return a[i] > b[i] ? 1 : -1;
        }
        return 0;
    }

    BigInteger.prototype.compareAbs = function (v) {
        var n = parseValue(v),
            a = this.value,
            b = n.value;
        if (n.isSmall) return 1;
        return compareAbs(a, b);
    };
    SmallInteger.prototype.compareAbs = function (v) {
        var n = parseValue(v),
            a = Math.abs(this.value),
            b = n.value;
        if (n.isSmall) {
            b = Math.abs(b);
            return a === b ? 0 : a > b ? 1 : -1;
        }
        return -1;
    };
    NativeBigInt.prototype.compareAbs = function (v) {
        var a = this.value;
        var b = parseValue(v).value;
        a = a >= 0 ? a : -a;
        b = b >= 0 ? b : -b;
        return a === b ? 0 : a > b ? 1 : -1;
    }

    BigInteger.prototype.compare = function (v) {
        // See discussion about comparison with Infinity:
        // https://github.com/peterolson/BigInteger.js/issues/61
        if (v === Infinity) {
            return -1;
        }
        if (v === -Infinity) {
            return 1;
        }

        var n = parseValue(v),
            a = this.value,
            b = n.value;
        if (this.sign !== n.sign) {
            return n.sign ? 1 : -1;
        }
        if (n.isSmall) {
            return this.sign ? -1 : 1;
        }
        return compareAbs(a, b) * (this.sign ? -1 : 1);
    };
    BigInteger.prototype.compareTo = BigInteger.prototype.compare;

    SmallInteger.prototype.compare = function (v) {
        if (v === Infinity) {
            return -1;
        }
        if (v === -Infinity) {
            return 1;
        }

        var n = parseValue(v),
            a = this.value,
            b = n.value;
        if (n.isSmall) {
            return a == b ? 0 : a > b ? 1 : -1;
        }
        if (a < 0 !== n.sign) {
            return a < 0 ? -1 : 1;
        }
        return a < 0 ? 1 : -1;
    };
    SmallInteger.prototype.compareTo = SmallInteger.prototype.compare;

    NativeBigInt.prototype.compare = function (v) {
        if (v === Infinity) {
            return -1;
        }
        if (v === -Infinity) {
            return 1;
        }
        var a = this.value;
        var b = parseValue(v).value;
        return a === b ? 0 : a > b ? 1 : -1;
    }
    NativeBigInt.prototype.compareTo = NativeBigInt.prototype.compare;

    BigInteger.prototype.equals = function (v) {
        return this.compare(v) === 0;
    };
    NativeBigInt.prototype.eq = NativeBigInt.prototype.equals = SmallInteger.prototype.eq = SmallInteger.prototype.equals = BigInteger.prototype.eq = BigInteger.prototype.equals;

    BigInteger.prototype.notEquals = function (v) {
        return this.compare(v) !== 0;
    };
    NativeBigInt.prototype.neq = NativeBigInt.prototype.notEquals = SmallInteger.prototype.neq = SmallInteger.prototype.notEquals = BigInteger.prototype.neq = BigInteger.prototype.notEquals;

    BigInteger.prototype.greater = function (v) {
        return this.compare(v) > 0;
    };
    NativeBigInt.prototype.gt = NativeBigInt.prototype.greater = SmallInteger.prototype.gt = SmallInteger.prototype.greater = BigInteger.prototype.gt = BigInteger.prototype.greater;

    BigInteger.prototype.lesser = function (v) {
        return this.compare(v) < 0;
    };
    NativeBigInt.prototype.lt = NativeBigInt.prototype.lesser = SmallInteger.prototype.lt = SmallInteger.prototype.lesser = BigInteger.prototype.lt = BigInteger.prototype.lesser;

    BigInteger.prototype.greaterOrEquals = function (v) {
        return this.compare(v) >= 0;
    };
    NativeBigInt.prototype.geq = NativeBigInt.prototype.greaterOrEquals = SmallInteger.prototype.geq = SmallInteger.prototype.greaterOrEquals = BigInteger.prototype.geq = BigInteger.prototype.greaterOrEquals;

    BigInteger.prototype.lesserOrEquals = function (v) {
        return this.compare(v) <= 0;
    };
    NativeBigInt.prototype.leq = NativeBigInt.prototype.lesserOrEquals = SmallInteger.prototype.leq = SmallInteger.prototype.lesserOrEquals = BigInteger.prototype.leq = BigInteger.prototype.lesserOrEquals;

    BigInteger.prototype.isEven = function () {
        return (this.value[0] & 1) === 0;
    };
    SmallInteger.prototype.isEven = function () {
        return (this.value & 1) === 0;
    };
    NativeBigInt.prototype.isEven = function () {
        return (this.value & BigInt(1)) === BigInt(0);
    }

    BigInteger.prototype.isOdd = function () {
        return (this.value[0] & 1) === 1;
    };
    SmallInteger.prototype.isOdd = function () {
        return (this.value & 1) === 1;
    };
    NativeBigInt.prototype.isOdd = function () {
        return (this.value & BigInt(1)) === BigInt(1);
    }

    BigInteger.prototype.isPositive = function () {
        return !this.sign;
    };
    SmallInteger.prototype.isPositive = function () {
        return this.value > 0;
    };
    NativeBigInt.prototype.isPositive = SmallInteger.prototype.isPositive;

    BigInteger.prototype.isNegative = function () {
        return this.sign;
    };
    SmallInteger.prototype.isNegative = function () {
        return this.value < 0;
    };
    NativeBigInt.prototype.isNegative = SmallInteger.prototype.isNegative;

    BigInteger.prototype.isUnit = function () {
        return false;
    };
    SmallInteger.prototype.isUnit = function () {
        return Math.abs(this.value) === 1;
    };
    NativeBigInt.prototype.isUnit = function () {
        return this.abs().value === BigInt(1);
    }

    BigInteger.prototype.isZero = function () {
        return false;
    };
    SmallInteger.prototype.isZero = function () {
        return this.value === 0;
    };
    NativeBigInt.prototype.isZero = function () {
        return this.value === BigInt(0);
    }

    BigInteger.prototype.isDivisibleBy = function (v) {
        var n = parseValue(v);
        if (n.isZero()) return false;
        if (n.isUnit()) return true;
        if (n.compareAbs(2) === 0) return this.isEven();
        return this.mod(n).isZero();
    };
    NativeBigInt.prototype.isDivisibleBy = SmallInteger.prototype.isDivisibleBy = BigInteger.prototype.isDivisibleBy;

    function isBasicPrime(v) {
        var n = v.abs();
        if (n.isUnit()) return false;
        if (n.equals(2) || n.equals(3) || n.equals(5)) return true;
        if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5)) return false;
        if (n.lesser(49)) return true;
        // we don't know if it's prime: let the other functions figure it out
    }

    function millerRabinTest(n, a) {
        var nPrev = n.prev(),
            b = nPrev,
            r = 0,
            d, t, i, x;
        while (b.isEven()) b = b.divide(2), r++;
        next: for (i = 0; i < a.length; i++) {
            if (n.lesser(a[i])) continue;
            x = bigInt(a[i]).modPow(b, n);
            if (x.isUnit() || x.equals(nPrev)) continue;
            for (d = r - 1; d != 0; d--) {
                x = x.square().mod(n);
                if (x.isUnit()) return false;
                if (x.equals(nPrev)) continue next;
            }
            return false;
        }
        return true;
    }

    // Set "strict" to true to force GRH-supported lower bound of 2*log(N)^2
    BigInteger.prototype.isPrime = function (strict) {
        var isPrime = isBasicPrime(this);
        if (isPrime !== undefined) return isPrime;
        var n = this.abs();
        var bits = n.bitLength();
        if (bits <= 64)
            return millerRabinTest(n, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]);
        var logN = Math.log(2) * bits.toJSNumber();
        var t = Math.ceil((strict === true) ? (2 * Math.pow(logN, 2)) : logN);
        for (var a = [], i = 0; i < t; i++) {
            a.push(bigInt(i + 2));
        }
        return millerRabinTest(n, a);
    };
    NativeBigInt.prototype.isPrime = SmallInteger.prototype.isPrime = BigInteger.prototype.isPrime;

    BigInteger.prototype.isProbablePrime = function (iterations, rng) {
        var isPrime = isBasicPrime(this);
        if (isPrime !== undefined) return isPrime;
        var n = this.abs();
        var t = iterations === undefined ? 5 : iterations;
        for (var a = [], i = 0; i < t; i++) {
            a.push(bigInt.randBetween(2, n.minus(2), rng));
        }
        return millerRabinTest(n, a);
    };
    NativeBigInt.prototype.isProbablePrime = SmallInteger.prototype.isProbablePrime = BigInteger.prototype.isProbablePrime;

    BigInteger.prototype.modInv = function (n) {
        var t = bigInt.zero, newT = bigInt.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR;
        while (!newR.isZero()) {
            q = r.divide(newR);
            lastT = t;
            lastR = r;
            t = newT;
            r = newR;
            newT = lastT.subtract(q.multiply(newT));
            newR = lastR.subtract(q.multiply(newR));
        }
        if (!r.isUnit()) throw new Error(this.toString() + " and " + n.toString() + " are not co-prime");
        if (t.compare(0) === -1) {
            t = t.add(n);
        }
        if (this.isNegative()) {
            return t.negate();
        }
        return t;
    };

    NativeBigInt.prototype.modInv = SmallInteger.prototype.modInv = BigInteger.prototype.modInv;

    BigInteger.prototype.next = function () {
        var value = this.value;
        if (this.sign) {
            return subtractSmall(value, 1, this.sign);
        }
        return new BigInteger(addSmall(value, 1), this.sign);
    };
    SmallInteger.prototype.next = function () {
        var value = this.value;
        if (value + 1 < MAX_INT) return new SmallInteger(value + 1);
        return new BigInteger(MAX_INT_ARR, false);
    };
    NativeBigInt.prototype.next = function () {
        return new NativeBigInt(this.value + BigInt(1));
    }

    BigInteger.prototype.prev = function () {
        var value = this.value;
        if (this.sign) {
            return new BigInteger(addSmall(value, 1), true);
        }
        return subtractSmall(value, 1, this.sign);
    };
    SmallInteger.prototype.prev = function () {
        var value = this.value;
        if (value - 1 > -MAX_INT) return new SmallInteger(value - 1);
        return new BigInteger(MAX_INT_ARR, true);
    };
    NativeBigInt.prototype.prev = function () {
        return new NativeBigInt(this.value - BigInt(1));
    }

    var powersOfTwo = [1];
    while (2 * powersOfTwo[powersOfTwo.length - 1] <= BASE) powersOfTwo.push(2 * powersOfTwo[powersOfTwo.length - 1]);
    var powers2Length = powersOfTwo.length, highestPower2 = powersOfTwo[powers2Length - 1];

    function shift_isSmall(n) {
        return Math.abs(n) <= BASE;
    }

    BigInteger.prototype.shiftLeft = function (v) {
        var n = parseValue(v).toJSNumber();
        if (!shift_isSmall(n)) {
            throw new Error(String(n) + " is too large for shifting.");
        }
        if (n < 0) return this.shiftRight(-n);
        var result = this;
        if (result.isZero()) return result;
        while (n >= powers2Length) {
            result = result.multiply(highestPower2);
            n -= powers2Length - 1;
        }
        return result.multiply(powersOfTwo[n]);
    };
    NativeBigInt.prototype.shiftLeft = SmallInteger.prototype.shiftLeft = BigInteger.prototype.shiftLeft;

    BigInteger.prototype.shiftRight = function (v) {
        var remQuo;
        var n = parseValue(v).toJSNumber();
        if (!shift_isSmall(n)) {
            throw new Error(String(n) + " is too large for shifting.");
        }
        if (n < 0) return this.shiftLeft(-n);
        var result = this;
        while (n >= powers2Length) {
            if (result.isZero() || (result.isNegative() && result.isUnit())) return result;
            remQuo = divModAny(result, highestPower2);
            result = remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];
            n -= powers2Length - 1;
        }
        remQuo = divModAny(result, powersOfTwo[n]);
        return remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];
    };
    NativeBigInt.prototype.shiftRight = SmallInteger.prototype.shiftRight = BigInteger.prototype.shiftRight;

    function bitwise(x, y, fn) {
        y = parseValue(y);
        var xSign = x.isNegative(), ySign = y.isNegative();
        var xRem = xSign ? x.not() : x,
            yRem = ySign ? y.not() : y;
        var xDigit = 0, yDigit = 0;
        var xDivMod = null, yDivMod = null;
        var result = [];
        while (!xRem.isZero() || !yRem.isZero()) {
            xDivMod = divModAny(xRem, highestPower2);
            xDigit = xDivMod[1].toJSNumber();
            if (xSign) {
                xDigit = highestPower2 - 1 - xDigit; // two's complement for negative numbers
            }

            yDivMod = divModAny(yRem, highestPower2);
            yDigit = yDivMod[1].toJSNumber();
            if (ySign) {
                yDigit = highestPower2 - 1 - yDigit; // two's complement for negative numbers
            }

            xRem = xDivMod[0];
            yRem = yDivMod[0];
            result.push(fn(xDigit, yDigit));
        }
        var sum = fn(xSign ? 1 : 0, ySign ? 1 : 0) !== 0 ? bigInt(-1) : bigInt(0);
        for (var i = result.length - 1; i >= 0; i -= 1) {
            sum = sum.multiply(highestPower2).add(bigInt(result[i]));
        }
        return sum;
    }

    BigInteger.prototype.not = function () {
        return this.negate().prev();
    };
    NativeBigInt.prototype.not = SmallInteger.prototype.not = BigInteger.prototype.not;

    BigInteger.prototype.and = function (n) {
        return bitwise(this, n, function (a, b) { return a & b; });
    };
    NativeBigInt.prototype.and = SmallInteger.prototype.and = BigInteger.prototype.and;

    BigInteger.prototype.or = function (n) {
        return bitwise(this, n, function (a, b) { return a | b; });
    };
    NativeBigInt.prototype.or = SmallInteger.prototype.or = BigInteger.prototype.or;

    BigInteger.prototype.xor = function (n) {
        return bitwise(this, n, function (a, b) { return a ^ b; });
    };
    NativeBigInt.prototype.xor = SmallInteger.prototype.xor = BigInteger.prototype.xor;

    var LOBMASK_I = 1 << 30, LOBMASK_BI = (BASE & -BASE) * (BASE & -BASE) | LOBMASK_I;
    function roughLOB(n) { // get lowestOneBit (rough)
        // SmallInteger: return Min(lowestOneBit(n), 1 << 30)
        // BigInteger: return Min(lowestOneBit(n), 1 << 14) [BASE=1e7]
        var v = n.value,
            x = typeof v === "number" ? v | LOBMASK_I :
                typeof v === "bigint" ? v | BigInt(LOBMASK_I) :
                    v[0] + v[1] * BASE | LOBMASK_BI;
        return x & -x;
    }

    function integerLogarithm(value, base) {
        if (base.compareTo(value) <= 0) {
            var tmp = integerLogarithm(value, base.square(base));
            var p = tmp.p;
            var e = tmp.e;
            var t = p.multiply(base);
            return t.compareTo(value) <= 0 ? { p: t, e: e * 2 + 1 } : { p: p, e: e * 2 };
        }
        return { p: bigInt(1), e: 0 };
    }

    BigInteger.prototype.bitLength = function () {
        var n = this;
        if (n.compareTo(bigInt(0)) < 0) {
            n = n.negate().subtract(bigInt(1));
        }
        if (n.compareTo(bigInt(0)) === 0) {
            return bigInt(0);
        }
        return bigInt(integerLogarithm(n, bigInt(2)).e).add(bigInt(1));
    }
    NativeBigInt.prototype.bitLength = SmallInteger.prototype.bitLength = BigInteger.prototype.bitLength;

    function max(a, b) {
        a = parseValue(a);
        b = parseValue(b);
        return a.greater(b) ? a : b;
    }
    function min(a, b) {
        a = parseValue(a);
        b = parseValue(b);
        return a.lesser(b) ? a : b;
    }
    function gcd(a, b) {
        a = parseValue(a).abs();
        b = parseValue(b).abs();
        if (a.equals(b)) return a;
        if (a.isZero()) return b;
        if (b.isZero()) return a;
        var c = Integer[1], d, t;
        while (a.isEven() && b.isEven()) {
            d = min(roughLOB(a), roughLOB(b));
            a = a.divide(d);
            b = b.divide(d);
            c = c.multiply(d);
        }
        while (a.isEven()) {
            a = a.divide(roughLOB(a));
        }
        do {
            while (b.isEven()) {
                b = b.divide(roughLOB(b));
            }
            if (a.greater(b)) {
                t = b; b = a; a = t;
            }
            b = b.subtract(a);
        } while (!b.isZero());
        return c.isUnit() ? a : a.multiply(c);
    }
    function lcm(a, b) {
        a = parseValue(a).abs();
        b = parseValue(b).abs();
        return a.divide(gcd(a, b)).multiply(b);
    }
    function randBetween(a, b, rng) {
        a = parseValue(a);
        b = parseValue(b);
        var usedRNG = rng || Math.random;
        var low = min(a, b), high = max(a, b);
        var range = high.subtract(low).add(1);
        if (range.isSmall) return low.add(Math.floor(usedRNG() * range));
        var digits = toBase(range, BASE).value;
        var result = [], restricted = true;
        for (var i = 0; i < digits.length; i++) {
            var top = restricted ? digits[i] : BASE;
            var digit = truncate(usedRNG() * top);
            result.push(digit);
            if (digit < top) restricted = false;
        }
        return low.add(Integer.fromArray(result, BASE, false));
    }

    var parseBase = function (text, base, alphabet, caseSensitive) {
        alphabet = alphabet || DEFAULT_ALPHABET;
        text = String(text);
        if (!caseSensitive) {
            text = text.toLowerCase();
            alphabet = alphabet.toLowerCase();
        }
        var length = text.length;
        var i;
        var absBase = Math.abs(base);
        var alphabetValues = {};
        for (i = 0; i < alphabet.length; i++) {
            alphabetValues[alphabet[i]] = i;
        }
        for (i = 0; i < length; i++) {
            var c = text[i];
            if (c === "-") continue;
            if (c in alphabetValues) {
                if (alphabetValues[c] >= absBase) {
                    if (c === "1" && absBase === 1) continue;
                    throw new Error(c + " is not a valid digit in base " + base + ".");
                }
            }
        }
        base = parseValue(base);
        var digits = [];
        var isNegative = text[0] === "-";
        for (i = isNegative ? 1 : 0; i < text.length; i++) {
            var c = text[i];
            if (c in alphabetValues) digits.push(parseValue(alphabetValues[c]));
            else if (c === "<") {
                var start = i;
                do { i++; } while (text[i] !== ">" && i < text.length);
                digits.push(parseValue(text.slice(start + 1, i)));
            }
            else throw new Error(c + " is not a valid character");
        }
        return parseBaseFromArray(digits, base, isNegative);
    };

    function parseBaseFromArray(digits, base, isNegative) {
        var val = Integer[0], pow = Integer[1], i;
        for (i = digits.length - 1; i >= 0; i--) {
            val = val.add(digits[i].times(pow));
            pow = pow.times(base);
        }
        return isNegative ? val.negate() : val;
    }

    function stringify(digit, alphabet) {
        alphabet = alphabet || DEFAULT_ALPHABET;
        if (digit < alphabet.length) {
            return alphabet[digit];
        }
        return "<" + digit + ">";
    }

    function toBase(n, base) {
        base = bigInt(base);
        if (base.isZero()) {
            if (n.isZero()) return { value: [0], isNegative: false };
            throw new Error("Cannot convert nonzero numbers to base 0.");
        }
        if (base.equals(-1)) {
            if (n.isZero()) return { value: [0], isNegative: false };
            if (n.isNegative())
                return {
                    value: [].concat.apply([], Array.apply(null, Array(-n.toJSNumber()))
                        .map(Array.prototype.valueOf, [1, 0])
                    ),
                    isNegative: false
                };

            var arr = Array.apply(null, Array(n.toJSNumber() - 1))
                .map(Array.prototype.valueOf, [0, 1]);
            arr.unshift([1]);
            return {
                value: [].concat.apply([], arr),
                isNegative: false
            };
        }

        var neg = false;
        if (n.isNegative() && base.isPositive()) {
            neg = true;
            n = n.abs();
        }
        if (base.isUnit()) {
            if (n.isZero()) return { value: [0], isNegative: false };

            return {
                value: Array.apply(null, Array(n.toJSNumber()))
                    .map(Number.prototype.valueOf, 1),
                isNegative: neg
            };
        }
        var out = [];
        var left = n, divmod;
        while (left.isNegative() || left.compareAbs(base) >= 0) {
            divmod = left.divmod(base);
            left = divmod.quotient;
            var digit = divmod.remainder;
            if (digit.isNegative()) {
                digit = base.minus(digit).abs();
                left = left.next();
            }
            out.push(digit.toJSNumber());
        }
        out.push(left.toJSNumber());
        return { value: out.reverse(), isNegative: neg };
    }

    function toBaseString(n, base, alphabet) {
        var arr = toBase(n, base);
        return (arr.isNegative ? "-" : "") + arr.value.map(function (x) {
            return stringify(x, alphabet);
        }).join('');
    }

    BigInteger.prototype.toArray = function (radix) {
        return toBase(this, radix);
    };

    SmallInteger.prototype.toArray = function (radix) {
        return toBase(this, radix);
    };

    NativeBigInt.prototype.toArray = function (radix) {
        return toBase(this, radix);
    };

    BigInteger.prototype.toString = function (radix, alphabet) {
        if (radix === undefined) radix = 10;
        if (radix !== 10) return toBaseString(this, radix, alphabet);
        var v = this.value, l = v.length, str = String(v[--l]), zeros = "0000000", digit;
        while (--l >= 0) {
            digit = String(v[l]);
            str += zeros.slice(digit.length) + digit;
        }
        var sign = this.sign ? "-" : "";
        return sign + str;
    };

    SmallInteger.prototype.toString = function (radix, alphabet) {
        if (radix === undefined) radix = 10;
        if (radix != 10) return toBaseString(this, radix, alphabet);
        return String(this.value);
    };

    NativeBigInt.prototype.toString = SmallInteger.prototype.toString;

    NativeBigInt.prototype.toJSON = BigInteger.prototype.toJSON = SmallInteger.prototype.toJSON = function () { return this.toString(); }

    BigInteger.prototype.valueOf = function () {
        return parseInt(this.toString(), 10);
    };
    BigInteger.prototype.toJSNumber = BigInteger.prototype.valueOf;

    SmallInteger.prototype.valueOf = function () {
        return this.value;
    };
    SmallInteger.prototype.toJSNumber = SmallInteger.prototype.valueOf;
    NativeBigInt.prototype.valueOf = NativeBigInt.prototype.toJSNumber = function () {
        return parseInt(this.toString(), 10);
    }

    function parseStringValue(v) {
        if (isPrecise(+v)) {
            var x = +v;
            if (x === truncate(x))
                return supportsNativeBigInt ? new NativeBigInt(BigInt(x)) : new SmallInteger(x);
            throw new Error("Invalid integer: " + v);
        }
        var sign = v[0] === "-";
        if (sign) v = v.slice(1);
        var split = v.split(/e/i);
        if (split.length > 2) throw new Error("Invalid integer: " + split.join("e"));
        if (split.length === 2) {
            var exp = split[1];
            if (exp[0] === "+") exp = exp.slice(1);
            exp = +exp;
            if (exp !== truncate(exp) || !isPrecise(exp)) throw new Error("Invalid integer: " + exp + " is not a valid exponent.");
            var text = split[0];
            var decimalPlace = text.indexOf(".");
            if (decimalPlace >= 0) {
                exp -= text.length - decimalPlace - 1;
                text = text.slice(0, decimalPlace) + text.slice(decimalPlace + 1);
            }
            if (exp < 0) throw new Error("Cannot include negative exponent part for integers");
            text += (new Array(exp + 1)).join("0");
            v = text;
        }
        var isValid = /^([0-9][0-9]*)$/.test(v);
        if (!isValid) throw new Error("Invalid integer: " + v);
        if (supportsNativeBigInt) {
            return new NativeBigInt(BigInt(sign ? "-" + v : v));
        }
        var r = [], max = v.length, l = LOG_BASE, min = max - l;
        while (max > 0) {
            r.push(+v.slice(min, max));
            min -= l;
            if (min < 0) min = 0;
            max -= l;
        }
        trim(r);
        return new BigInteger(r, sign);
    }

    function parseNumberValue(v) {
        if (supportsNativeBigInt) {
            return new NativeBigInt(BigInt(v));
        }
        if (isPrecise(v)) {
            if (v !== truncate(v)) throw new Error(v + " is not an integer.");
            return new SmallInteger(v);
        }
        return parseStringValue(v.toString());
    }

    function parseValue(v) {
        if (typeof v === "number") {
            return parseNumberValue(v);
        }
        if (typeof v === "string") {
            return parseStringValue(v);
        }
        if (typeof v === "bigint") {
            return new NativeBigInt(v);
        }
        return v;
    }
    // Pre-define numbers in range [-999,999]
    for (var i = 0; i < 1000; i++) {
        Integer[i] = parseValue(i);
        if (i > 0) Integer[-i] = parseValue(-i);
    }
    // Backwards compatibility
    Integer.one = Integer[1];
    Integer.zero = Integer[0];
    Integer.minusOne = Integer[-1];
    Integer.max = max;
    Integer.min = min;
    Integer.gcd = gcd;
    Integer.lcm = lcm;
    Integer.isInstance = function (x) { return x instanceof BigInteger || x instanceof SmallInteger || x instanceof NativeBigInt; };
    Integer.randBetween = randBetween;

    Integer.fromArray = function (digits, base, isNegative) {
        return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative);
    };

    return Integer;
})();

// Node.js check
if (typeof module !== "undefined" && module.hasOwnProperty("exports")) {
    module.exports = bigInt;
}

//amd check
if (typeof define === "function" && define.amd) {
    define( function () {
        return bigInt;
    });
}
var bigInt=function(undefined){"use strict";var BASE=1e7,LOG_BASE=7,MAX_INT=9007199254740992,MAX_INT_ARR=smallToArray(MAX_INT),DEFAULT_ALPHABET="0123456789abcdefghijklmnopqrstuvwxyz";var supportsNativeBigInt=typeof BigInt==="function";function Integer(v,radix,alphabet,caseSensitive){if(typeof v==="undefined")return Integer[0];if(typeof radix!=="undefined")return+radix===10&&!alphabet?parseValue(v):parseBase(v,radix,alphabet,caseSensitive);return parseValue(v)}function BigInteger(value,sign){this.value=value;this.sign=sign;this.isSmall=false}BigInteger.prototype=Object.create(Integer.prototype);function SmallInteger(value){this.value=value;this.sign=value<0;this.isSmall=true}SmallInteger.prototype=Object.create(Integer.prototype);function NativeBigInt(value){this.value=value}NativeBigInt.prototype=Object.create(Integer.prototype);function isPrecise(n){return-MAX_INT<n&&n<MAX_INT}function smallToArray(n){if(n<1e7)return[n];if(n<1e14)return[n%1e7,Math.floor(n/1e7)];return[n%1e7,Math.floor(n/1e7)%1e7,Math.floor(n/1e14)]}function arrayToSmall(arr){trim(arr);var length=arr.length;if(length<4&&compareAbs(arr,MAX_INT_ARR)<0){switch(length){case 0:return 0;case 1:return arr[0];case 2:return arr[0]+arr[1]*BASE;default:return arr[0]+(arr[1]+arr[2]*BASE)*BASE}}return arr}function trim(v){var i=v.length;while(v[--i]===0);v.length=i+1}function createArray(length){var x=new Array(length);var i=-1;while(++i<length){x[i]=0}return x}function truncate(n){if(n>0)return Math.floor(n);return Math.ceil(n)}function add(a,b){var l_a=a.length,l_b=b.length,r=new Array(l_a),carry=0,base=BASE,sum,i;for(i=0;i<l_b;i++){sum=a[i]+b[i]+carry;carry=sum>=base?1:0;r[i]=sum-carry*base}while(i<l_a){sum=a[i]+carry;carry=sum===base?1:0;r[i++]=sum-carry*base}if(carry>0)r.push(carry);return r}function addAny(a,b){if(a.length>=b.length)return add(a,b);return add(b,a)}function addSmall(a,carry){var l=a.length,r=new Array(l),base=BASE,sum,i;for(i=0;i<l;i++){sum=a[i]-base+carry;carry=Math.floor(sum/base);r[i]=sum-carry*base;carry+=1}while(carry>0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}BigInteger.prototype.add=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.subtract(n.negate())}var a=this.value,b=n.value;if(n.isSmall){return new BigInteger(addSmall(a,Math.abs(b)),this.sign)}return new BigInteger(addAny(a,b),this.sign)};BigInteger.prototype.plus=BigInteger.prototype.add;SmallInteger.prototype.add=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.subtract(n.negate())}var b=n.value;if(n.isSmall){if(isPrecise(a+b))return new SmallInteger(a+b);b=smallToArray(Math.abs(b))}return new BigInteger(addSmall(b,Math.abs(a)),a<0)};SmallInteger.prototype.plus=SmallInteger.prototype.add;NativeBigInt.prototype.add=function(v){return new NativeBigInt(this.value+parseValue(v).value)};NativeBigInt.prototype.plus=NativeBigInt.prototype.add;function subtract(a,b){var a_l=a.length,b_l=b.length,r=new Array(a_l),borrow=0,base=BASE,i,difference;for(i=0;i<b_l;i++){difference=a[i]-borrow-b[i];if(difference<0){difference+=base;borrow=1}else borrow=0;r[i]=difference}for(i=b_l;i<a_l;i++){difference=a[i]-borrow;if(difference<0)difference+=base;else{r[i++]=difference;break}r[i]=difference}for(;i<a_l;i++){r[i]=a[i]}trim(r);return r}function subtractAny(a,b,sign){var value;if(compareAbs(a,b)>=0){value=subtract(a,b)}else{value=subtract(b,a);sign=!sign}value=arrayToSmall(value);if(typeof value==="number"){if(sign)value=-value;return new SmallInteger(value)}return new BigInteger(value,sign)}function subtractSmall(a,b,sign){var l=a.length,r=new Array(l),carry=-b,base=BASE,i,difference;for(i=0;i<l;i++){difference=a[i]+carry;carry=Math.floor(difference/base);difference%=base;r[i]=difference<0?difference+base:difference}r=arrayToSmall(r);if(typeof r==="number"){if(sign)r=-r;return new SmallInteger(r)}return new BigInteger(r,sign)}BigInteger.prototype.subtract=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.add(n.negate())}var a=this.value,b=n.value;if(n.isSmall)return subtractSmall(a,Math.abs(b),this.sign);return subtractAny(a,b,this.sign)};BigInteger.prototype.minus=BigInteger.prototype.subtract;SmallInteger.prototype.subtract=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.add(n.negate())}var b=n.value;if(n.isSmall){return new SmallInteger(a-b)}return subtractSmall(b,Math.abs(a),a>=0)};SmallInteger.prototype.minus=SmallInteger.prototype.subtract;NativeBigInt.prototype.subtract=function(v){return new NativeBigInt(this.value-parseValue(v).value)};NativeBigInt.prototype.minus=NativeBigInt.prototype.subtract;BigInteger.prototype.negate=function(){return new BigInteger(this.value,!this.sign)};SmallInteger.prototype.negate=function(){var sign=this.sign;var small=new SmallInteger(-this.value);small.sign=!sign;return small};NativeBigInt.prototype.negate=function(){return new NativeBigInt(-this.value)};BigInteger.prototype.abs=function(){return new BigInteger(this.value,false)};SmallInteger.prototype.abs=function(){return new SmallInteger(Math.abs(this.value))};NativeBigInt.prototype.abs=function(){return new NativeBigInt(this.value>=0?this.value:-this.value)};function multiplyLong(a,b){var a_l=a.length,b_l=b.length,l=a_l+b_l,r=createArray(l),base=BASE,product,carry,i,a_i,b_j;for(i=0;i<a_l;++i){a_i=a[i];for(var j=0;j<b_l;++j){b_j=b[j];product=a_i*b_j+r[i+j];carry=Math.floor(product/base);r[i+j]=product-carry*base;r[i+j+1]+=carry}}trim(r);return r}function multiplySmall(a,b){var l=a.length,r=new Array(l),base=BASE,carry=0,product,i;for(i=0;i<l;i++){product=a[i]*b+carry;carry=Math.floor(product/base);r[i]=product-carry*base}while(carry>0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}function shiftLeft(x,n){var r=[];while(n-- >0)r.push(0);return r.concat(x)}function multiplyKaratsuba(x,y){var n=Math.max(x.length,y.length);if(n<=30)return multiplyLong(x,y);n=Math.ceil(n/2);var b=x.slice(n),a=x.slice(0,n),d=y.slice(n),c=y.slice(0,n);var ac=multiplyKaratsuba(a,c),bd=multiplyKaratsuba(b,d),abcd=multiplyKaratsuba(addAny(a,b),addAny(c,d));var product=addAny(addAny(ac,shiftLeft(subtract(subtract(abcd,ac),bd),n)),shiftLeft(bd,2*n));trim(product);return product}function useKaratsuba(l1,l2){return-.012*l1-.012*l2+15e-6*l1*l2>0}BigInteger.prototype.multiply=function(v){var n=parseValue(v),a=this.value,b=n.value,sign=this.sign!==n.sign,abs;if(n.isSmall){if(b===0)return Integer[0];if(b===1)return this;if(b===-1)return this.negate();abs=Math.abs(b);if(abs<BASE){return new BigInteger(multiplySmall(a,abs),sign)}b=smallToArray(abs)}if(useKaratsuba(a.length,b.length))return new BigInteger(multiplyKaratsuba(a,b),sign);return new BigInteger(multiplyLong(a,b),sign)};BigInteger.prototype.times=BigInteger.prototype.multiply;function multiplySmallAndArray(a,b,sign){if(a<BASE){return new BigInteger(multiplySmall(b,a),sign)}return new BigInteger(multiplyLong(b,smallToArray(a)),sign)}SmallInteger.prototype._multiplyBySmall=function(a){if(isPrecise(a.value*this.value)){return new SmallInteger(a.value*this.value)}return multiplySmallAndArray(Math.abs(a.value),smallToArray(Math.abs(this.value)),this.sign!==a.sign)};BigInteger.prototype._multiplyBySmall=function(a){if(a.value===0)return Integer[0];if(a.value===1)return this;if(a.value===-1)return this.negate();return multiplySmallAndArray(Math.abs(a.value),this.value,this.sign!==a.sign)};SmallInteger.prototype.multiply=function(v){return parseValue(v)._multiplyBySmall(this)};SmallInteger.prototype.times=SmallInteger.prototype.multiply;NativeBigInt.prototype.multiply=function(v){return new NativeBigInt(this.value*parseValue(v).value)};NativeBigInt.prototype.times=NativeBigInt.prototype.multiply;function square(a){var l=a.length,r=createArray(l+l),base=BASE,product,carry,i,a_i,a_j;for(i=0;i<l;i++){a_i=a[i];carry=0-a_i*a_i;for(var j=i;j<l;j++){a_j=a[j];product=2*(a_i*a_j)+r[i+j]+carry;carry=Math.floor(product/base);r[i+j]=product-carry*base}r[i+l]=carry}trim(r);return r}BigInteger.prototype.square=function(){return new BigInteger(square(this.value),false)};SmallInteger.prototype.square=function(){var value=this.value*this.value;if(isPrecise(value))return new SmallInteger(value);return new BigInteger(square(smallToArray(Math.abs(this.value))),false)};NativeBigInt.prototype.square=function(v){return new NativeBigInt(this.value*this.value)};function divMod1(a,b){var a_l=a.length,b_l=b.length,base=BASE,result=createArray(b.length),divisorMostSignificantDigit=b[b_l-1],lambda=Math.ceil(base/(2*divisorMostSignificantDigit)),remainder=multiplySmall(a,lambda),divisor=multiplySmall(b,lambda),quotientDigit,shift,carry,borrow,i,l,q;if(remainder.length<=a_l)remainder.push(0);divisor.push(0);divisorMostSignificantDigit=divisor[b_l-1];for(shift=a_l-b_l;shift>=0;shift--){quotientDigit=base-1;if(remainder[shift+b_l]!==divisorMostSignificantDigit){quotientDigit=Math.floor((remainder[shift+b_l]*base+remainder[shift+b_l-1])/divisorMostSignificantDigit)}carry=0;borrow=0;l=divisor.length;for(i=0;i<l;i++){carry+=quotientDigit*divisor[i];q=Math.floor(carry/base);borrow+=remainder[shift+i]-(carry-q*base);carry=q;if(borrow<0){remainder[shift+i]=borrow+base;borrow=-1}else{remainder[shift+i]=borrow;borrow=0}}while(borrow!==0){quotientDigit-=1;carry=0;for(i=0;i<l;i++){carry+=remainder[shift+i]-base+divisor[i];if(carry<0){remainder[shift+i]=carry+base;carry=0}else{remainder[shift+i]=carry;carry=1}}borrow+=carry}result[shift]=quotientDigit}remainder=divModSmall(remainder,lambda)[0];return[arrayToSmall(result),arrayToSmall(remainder)]}function divMod2(a,b){var a_l=a.length,b_l=b.length,result=[],part=[],base=BASE,guess,xlen,highx,highy,check;while(a_l){part.unshift(a[--a_l]);trim(part);if(compareAbs(part,b)<0){result.push(0);continue}xlen=part.length;highx=part[xlen-1]*base+part[xlen-2];highy=b[b_l-1]*base+b[b_l-2];if(xlen>b_l){highx=(highx+1)*base}guess=Math.ceil(highx/highy);do{check=multiplySmall(b,guess);if(compareAbs(check,part)<=0)break;guess--}while(guess);result.push(guess);part=subtract(part,check)}result.reverse();return[arrayToSmall(result),arrayToSmall(part)]}function divModSmall(value,lambda){var length=value.length,quotient=createArray(length),base=BASE,i,q,remainder,divisor;remainder=0;for(i=length-1;i>=0;--i){divisor=remainder*base+value[i];q=truncate(divisor/lambda);remainder=divisor-q*lambda;quotient[i]=q|0}return[quotient,remainder|0]}function divModAny(self,v){var value,n=parseValue(v);if(supportsNativeBigInt){return[new NativeBigInt(self.value/n.value),new NativeBigInt(self.value%n.value)]}var a=self.value,b=n.value;var quotient;if(b===0)throw new Error("Cannot divide by zero");if(self.isSmall){if(n.isSmall){return[new SmallInteger(truncate(a/b)),new SmallInteger(a%b)]}return[Integer[0],self]}if(n.isSmall){if(b===1)return[self,Integer[0]];if(b==-1)return[self.negate(),Integer[0]];var abs=Math.abs(b);if(abs<BASE){value=divModSmall(a,abs);quotient=arrayToSmall(value[0]);var remainder=value[1];if(self.sign)remainder=-remainder;if(typeof quotient==="number"){if(self.sign!==n.sign)quotient=-quotient;return[new SmallInteger(quotient),new SmallInteger(remainder)]}return[new BigInteger(quotient,self.sign!==n.sign),new SmallInteger(remainder)]}b=smallToArray(abs)}var comparison=compareAbs(a,b);if(comparison===-1)return[Integer[0],self];if(comparison===0)return[Integer[self.sign===n.sign?1:-1],Integer[0]];if(a.length+b.length<=200)value=divMod1(a,b);else value=divMod2(a,b);quotient=value[0];var qSign=self.sign!==n.sign,mod=value[1],mSign=self.sign;if(typeof quotient==="number"){if(qSign)quotient=-quotient;quotient=new SmallInteger(quotient)}else quotient=new BigInteger(quotient,qSign);if(typeof mod==="number"){if(mSign)mod=-mod;mod=new SmallInteger(mod)}else mod=new BigInteger(mod,mSign);return[quotient,mod]}BigInteger.prototype.divmod=function(v){var result=divModAny(this,v);return{quotient:result[0],remainder:result[1]}};NativeBigInt.prototype.divmod=SmallInteger.prototype.divmod=BigInteger.prototype.divmod;BigInteger.prototype.divide=function(v){return divModAny(this,v)[0]};NativeBigInt.prototype.over=NativeBigInt.prototype.divide=function(v){return new NativeBigInt(this.value/parseValue(v).value)};SmallInteger.prototype.over=SmallInteger.prototype.divide=BigInteger.prototype.over=BigInteger.prototype.divide;BigInteger.prototype.mod=function(v){return divModAny(this,v)[1]};NativeBigInt.prototype.mod=NativeBigInt.prototype.remainder=function(v){return new NativeBigInt(this.value%parseValue(v).value)};SmallInteger.prototype.remainder=SmallInteger.prototype.mod=BigInteger.prototype.remainder=BigInteger.prototype.mod;BigInteger.prototype.pow=function(v){var n=parseValue(v),a=this.value,b=n.value,value,x,y;if(b===0)return Integer[1];if(a===0)return Integer[0];if(a===1)return Integer[1];if(a===-1)return n.isEven()?Integer[1]:Integer[-1];if(n.sign){return Integer[0]}if(!n.isSmall)throw new Error("The exponent "+n.toString()+" is too large.");if(this.isSmall){if(isPrecise(value=Math.pow(a,b)))return new SmallInteger(truncate(value))}x=this;y=Integer[1];while(true){if(b&1===1){y=y.times(x);--b}if(b===0)break;b/=2;x=x.square()}return y};SmallInteger.prototype.pow=BigInteger.prototype.pow;NativeBigInt.prototype.pow=function(v){var n=parseValue(v);var a=this.value,b=n.value;var _0=BigInt(0),_1=BigInt(1),_2=BigInt(2);if(b===_0)return Integer[1];if(a===_0)return Integer[0];if(a===_1)return Integer[1];if(a===BigInt(-1))return n.isEven()?Integer[1]:Integer[-1];if(n.isNegative())return new NativeBigInt(_0);var x=this;var y=Integer[1];while(true){if((b&_1)===_1){y=y.times(x);--b}if(b===_0)break;b/=_2;x=x.square()}return y};BigInteger.prototype.modPow=function(exp,mod){exp=parseValue(exp);mod=parseValue(mod);if(mod.isZero())throw new Error("Cannot take modPow with modulus 0");var r=Integer[1],base=this.mod(mod);if(exp.isNegative()){exp=exp.multiply(Integer[-1]);base=base.modInv(mod)}while(exp.isPositive()){if(base.isZero())return Integer[0];if(exp.isOdd())r=r.multiply(base).mod(mod);exp=exp.divide(2);base=base.square().mod(mod)}return r};NativeBigInt.prototype.modPow=SmallInteger.prototype.modPow=BigInteger.prototype.modPow;function compareAbs(a,b){if(a.length!==b.length){return a.length>b.length?1:-1}for(var i=a.length-1;i>=0;i--){if(a[i]!==b[i])return a[i]>b[i]?1:-1}return 0}BigInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall)return 1;return compareAbs(a,b)};SmallInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=Math.abs(this.value),b=n.value;if(n.isSmall){b=Math.abs(b);return a===b?0:a>b?1:-1}return-1};NativeBigInt.prototype.compareAbs=function(v){var a=this.value;var b=parseValue(v).value;a=a>=0?a:-a;b=b>=0?b:-b;return a===b?0:a>b?1:-1};BigInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(this.sign!==n.sign){return n.sign?1:-1}if(n.isSmall){return this.sign?-1:1}return compareAbs(a,b)*(this.sign?-1:1)};BigInteger.prototype.compareTo=BigInteger.prototype.compare;SmallInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall){return a==b?0:a>b?1:-1}if(a<0!==n.sign){return a<0?-1:1}return a<0?1:-1};SmallInteger.prototype.compareTo=SmallInteger.prototype.compare;NativeBigInt.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var a=this.value;var b=parseValue(v).value;return a===b?0:a>b?1:-1};NativeBigInt.prototype.compareTo=NativeBigInt.prototype.compare;BigInteger.prototype.equals=function(v){return this.compare(v)===0};NativeBigInt.prototype.eq=NativeBigInt.prototype.equals=SmallInteger.prototype.eq=SmallInteger.prototype.equals=BigInteger.prototype.eq=BigInteger.prototype.equals;BigInteger.prototype.notEquals=function(v){return this.compare(v)!==0};NativeBigInt.prototype.neq=NativeBigInt.prototype.notEquals=SmallInteger.prototype.neq=SmallInteger.prototype.notEquals=BigInteger.prototype.neq=BigInteger.prototype.notEquals;BigInteger.prototype.greater=function(v){return this.compare(v)>0};NativeBigInt.prototype.gt=NativeBigInt.prototype.greater=SmallInteger.prototype.gt=SmallInteger.prototype.greater=BigInteger.prototype.gt=BigInteger.prototype.greater;BigInteger.prototype.lesser=function(v){return this.compare(v)<0};NativeBigInt.prototype.lt=NativeBigInt.prototype.lesser=SmallInteger.prototype.lt=SmallInteger.prototype.lesser=BigInteger.prototype.lt=BigInteger.prototype.lesser;BigInteger.prototype.greaterOrEquals=function(v){return this.compare(v)>=0};NativeBigInt.prototype.geq=NativeBigInt.prototype.greaterOrEquals=SmallInteger.prototype.geq=SmallInteger.prototype.greaterOrEquals=BigInteger.prototype.geq=BigInteger.prototype.greaterOrEquals;BigInteger.prototype.lesserOrEquals=function(v){return this.compare(v)<=0};NativeBigInt.prototype.leq=NativeBigInt.prototype.lesserOrEquals=SmallInteger.prototype.leq=SmallInteger.prototype.lesserOrEquals=BigInteger.prototype.leq=BigInteger.prototype.lesserOrEquals;BigInteger.prototype.isEven=function(){return(this.value[0]&1)===0};SmallInteger.prototype.isEven=function(){return(this.value&1)===0};NativeBigInt.prototype.isEven=function(){return(this.value&BigInt(1))===BigInt(0)};BigInteger.prototype.isOdd=function(){return(this.value[0]&1)===1};SmallInteger.prototype.isOdd=function(){return(this.value&1)===1};NativeBigInt.prototype.isOdd=function(){return(this.value&BigInt(1))===BigInt(1)};BigInteger.prototype.isPositive=function(){return!this.sign};SmallInteger.prototype.isPositive=function(){return this.value>0};NativeBigInt.prototype.isPositive=SmallInteger.prototype.isPositive;BigInteger.prototype.isNegative=function(){return this.sign};SmallInteger.prototype.isNegative=function(){return this.value<0};NativeBigInt.prototype.isNegative=SmallInteger.prototype.isNegative;BigInteger.prototype.isUnit=function(){return false};SmallInteger.prototype.isUnit=function(){return Math.abs(this.value)===1};NativeBigInt.prototype.isUnit=function(){return this.abs().value===BigInt(1)};BigInteger.prototype.isZero=function(){return false};SmallInteger.prototype.isZero=function(){return this.value===0};NativeBigInt.prototype.isZero=function(){return this.value===BigInt(0)};BigInteger.prototype.isDivisibleBy=function(v){var n=parseValue(v);if(n.isZero())return false;if(n.isUnit())return true;if(n.compareAbs(2)===0)return this.isEven();return this.mod(n).isZero()};NativeBigInt.prototype.isDivisibleBy=SmallInteger.prototype.isDivisibleBy=BigInteger.prototype.isDivisibleBy;function isBasicPrime(v){var n=v.abs();if(n.isUnit())return false;if(n.equals(2)||n.equals(3)||n.equals(5))return true;if(n.isEven()||n.isDivisibleBy(3)||n.isDivisibleBy(5))return false;if(n.lesser(49))return true}function millerRabinTest(n,a){var nPrev=n.prev(),b=nPrev,r=0,d,t,i,x;while(b.isEven())b=b.divide(2),r++;next:for(i=0;i<a.length;i++){if(n.lesser(a[i]))continue;x=bigInt(a[i]).modPow(b,n);if(x.isUnit()||x.equals(nPrev))continue;for(d=r-1;d!=0;d--){x=x.square().mod(n);if(x.isUnit())return false;if(x.equals(nPrev))continue next}return false}return true}BigInteger.prototype.isPrime=function(strict){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs();var bits=n.bitLength();if(bits<=64)return millerRabinTest(n,[2,3,5,7,11,13,17,19,23,29,31,37]);var logN=Math.log(2)*bits.toJSNumber();var t=Math.ceil(strict===true?2*Math.pow(logN,2):logN);for(var a=[],i=0;i<t;i++){a.push(bigInt(i+2))}return millerRabinTest(n,a)};NativeBigInt.prototype.isPrime=SmallInteger.prototype.isPrime=BigInteger.prototype.isPrime;BigInteger.prototype.isProbablePrime=function(iterations,rng){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs();var t=iterations===undefined?5:iterations;for(var a=[],i=0;i<t;i++){a.push(bigInt.randBetween(2,n.minus(2),rng))}return millerRabinTest(n,a)};NativeBigInt.prototype.isProbablePrime=SmallInteger.prototype.isProbablePrime=BigInteger.prototype.isProbablePrime;BigInteger.prototype.modInv=function(n){var t=bigInt.zero,newT=bigInt.one,r=parseValue(n),newR=this.abs(),q,lastT,lastR;while(!newR.isZero()){q=r.divide(newR);lastT=t;lastR=r;t=newT;r=newR;newT=lastT.subtract(q.multiply(newT));newR=lastR.subtract(q.multiply(newR))}if(!r.isUnit())throw new Error(this.toString()+" and "+n.toString()+" are not co-prime");if(t.compare(0)===-1){t=t.add(n)}if(this.isNegative()){return t.negate()}return t};NativeBigInt.prototype.modInv=SmallInteger.prototype.modInv=BigInteger.prototype.modInv;BigInteger.prototype.next=function(){var value=this.value;if(this.sign){return subtractSmall(value,1,this.sign)}return new BigInteger(addSmall(value,1),this.sign)};SmallInteger.prototype.next=function(){var value=this.value;if(value+1<MAX_INT)return new SmallInteger(value+1);return new BigInteger(MAX_INT_ARR,false)};NativeBigInt.prototype.next=function(){return new NativeBigInt(this.value+BigInt(1))};BigInteger.prototype.prev=function(){var value=this.value;if(this.sign){return new BigInteger(addSmall(value,1),true)}return subtractSmall(value,1,this.sign)};SmallInteger.prototype.prev=function(){var value=this.value;if(value-1>-MAX_INT)return new SmallInteger(value-1);return new BigInteger(MAX_INT_ARR,true)};NativeBigInt.prototype.prev=function(){return new NativeBigInt(this.value-BigInt(1))};var powersOfTwo=[1];while(2*powersOfTwo[powersOfTwo.length-1]<=BASE)powersOfTwo.push(2*powersOfTwo[powersOfTwo.length-1]);var powers2Length=powersOfTwo.length,highestPower2=powersOfTwo[powers2Length-1];function shift_isSmall(n){return Math.abs(n)<=BASE}BigInteger.prototype.shiftLeft=function(v){var n=parseValue(v).toJSNumber();if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}if(n<0)return this.shiftRight(-n);var result=this;if(result.isZero())return result;while(n>=powers2Length){result=result.multiply(highestPower2);n-=powers2Length-1}return result.multiply(powersOfTwo[n])};NativeBigInt.prototype.shiftLeft=SmallInteger.prototype.shiftLeft=BigInteger.prototype.shiftLeft;BigInteger.prototype.shiftRight=function(v){var remQuo;var n=parseValue(v).toJSNumber();if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}if(n<0)return this.shiftLeft(-n);var result=this;while(n>=powers2Length){if(result.isZero()||result.isNegative()&&result.isUnit())return result;remQuo=divModAny(result,highestPower2);result=remQuo[1].isNegative()?remQuo[0].prev():remQuo[0];n-=powers2Length-1}remQuo=divModAny(result,powersOfTwo[n]);return remQuo[1].isNegative()?remQuo[0].prev():remQuo[0]};NativeBigInt.prototype.shiftRight=SmallInteger.prototype.shiftRight=BigInteger.prototype.shiftRight;function bitwise(x,y,fn){y=parseValue(y);var xSign=x.isNegative(),ySign=y.isNegative();var xRem=xSign?x.not():x,yRem=ySign?y.not():y;var xDigit=0,yDigit=0;var xDivMod=null,yDivMod=null;var result=[];while(!xRem.isZero()||!yRem.isZero()){xDivMod=divModAny(xRem,highestPower2);xDigit=xDivMod[1].toJSNumber();if(xSign){xDigit=highestPower2-1-xDigit}yDivMod=divModAny(yRem,highestPower2);yDigit=yDivMod[1].toJSNumber();if(ySign){yDigit=highestPower2-1-yDigit}xRem=xDivMod[0];yRem=yDivMod[0];result.push(fn(xDigit,yDigit))}var sum=fn(xSign?1:0,ySign?1:0)!==0?bigInt(-1):bigInt(0);for(var i=result.length-1;i>=0;i-=1){sum=sum.multiply(highestPower2).add(bigInt(result[i]))}return sum}BigInteger.prototype.not=function(){return this.negate().prev()};NativeBigInt.prototype.not=SmallInteger.prototype.not=BigInteger.prototype.not;BigInteger.prototype.and=function(n){return bitwise(this,n,function(a,b){return a&b})};NativeBigInt.prototype.and=SmallInteger.prototype.and=BigInteger.prototype.and;BigInteger.prototype.or=function(n){return bitwise(this,n,function(a,b){return a|b})};NativeBigInt.prototype.or=SmallInteger.prototype.or=BigInteger.prototype.or;BigInteger.prototype.xor=function(n){return bitwise(this,n,function(a,b){return a^b})};NativeBigInt.prototype.xor=SmallInteger.prototype.xor=BigInteger.prototype.xor;var LOBMASK_I=1<<30,LOBMASK_BI=(BASE&-BASE)*(BASE&-BASE)|LOBMASK_I;function roughLOB(n){var v=n.value,x=typeof v==="number"?v|LOBMASK_I:typeof v==="bigint"?v|BigInt(LOBMASK_I):v[0]+v[1]*BASE|LOBMASK_BI;return x&-x}function integerLogarithm(value,base){if(base.compareTo(value)<=0){var tmp=integerLogarithm(value,base.square(base));var p=tmp.p;var e=tmp.e;var t=p.multiply(base);return t.compareTo(value)<=0?{p:t,e:e*2+1}:{p:p,e:e*2}}return{p:bigInt(1),e:0}}BigInteger.prototype.bitLength=function(){var n=this;if(n.compareTo(bigInt(0))<0){n=n.negate().subtract(bigInt(1))}if(n.compareTo(bigInt(0))===0){return bigInt(0)}return bigInt(integerLogarithm(n,bigInt(2)).e).add(bigInt(1))};NativeBigInt.prototype.bitLength=SmallInteger.prototype.bitLength=BigInteger.prototype.bitLength;function max(a,b){a=parseValue(a);b=parseValue(b);return a.greater(b)?a:b}function min(a,b){a=parseValue(a);b=parseValue(b);return a.lesser(b)?a:b}function gcd(a,b){a=parseValue(a).abs();b=parseValue(b).abs();if(a.equals(b))return a;if(a.isZero())return b;if(b.isZero())return a;var c=Integer[1],d,t;while(a.isEven()&&b.isEven()){d=min(roughLOB(a),roughLOB(b));a=a.divide(d);b=b.divide(d);c=c.multiply(d)}while(a.isEven()){a=a.divide(roughLOB(a))}do{while(b.isEven()){b=b.divide(roughLOB(b))}if(a.greater(b)){t=b;b=a;a=t}b=b.subtract(a)}while(!b.isZero());return c.isUnit()?a:a.multiply(c)}function lcm(a,b){a=parseValue(a).abs();b=parseValue(b).abs();return a.divide(gcd(a,b)).multiply(b)}function randBetween(a,b,rng){a=parseValue(a);b=parseValue(b);var usedRNG=rng||Math.random;var low=min(a,b),high=max(a,b);var range=high.subtract(low).add(1);if(range.isSmall)return low.add(Math.floor(usedRNG()*range));var digits=toBase(range,BASE).value;var result=[],restricted=true;for(var i=0;i<digits.length;i++){var top=restricted?digits[i]:BASE;var digit=truncate(usedRNG()*top);result.push(digit);if(digit<top)restricted=false}return low.add(Integer.fromArray(result,BASE,false))}var parseBase=function(text,base,alphabet,caseSensitive){alphabet=alphabet||DEFAULT_ALPHABET;text=String(text);if(!caseSensitive){text=text.toLowerCase();alphabet=alphabet.toLowerCase()}var length=text.length;var i;var absBase=Math.abs(base);var alphabetValues={};for(i=0;i<alphabet.length;i++){alphabetValues[alphabet[i]]=i}for(i=0;i<length;i++){var c=text[i];if(c==="-")continue;if(c in alphabetValues){if(alphabetValues[c]>=absBase){if(c==="1"&&absBase===1)continue;throw new Error(c+" is not a valid digit in base "+base+".")}}}base=parseValue(base);var digits=[];var isNegative=text[0]==="-";for(i=isNegative?1:0;i<text.length;i++){var c=text[i];if(c in alphabetValues)digits.push(parseValue(alphabetValues[c]));else if(c==="<"){var start=i;do{i++}while(text[i]!==">"&&i<text.length);digits.push(parseValue(text.slice(start+1,i)))}else throw new Error(c+" is not a valid character")}return parseBaseFromArray(digits,base,isNegative)};function parseBaseFromArray(digits,base,isNegative){var val=Integer[0],pow=Integer[1],i;for(i=digits.length-1;i>=0;i--){val=val.add(digits[i].times(pow));pow=pow.times(base)}return isNegative?val.negate():val}function stringify(digit,alphabet){alphabet=alphabet||DEFAULT_ALPHABET;if(digit<alphabet.length){return alphabet[digit]}return"<"+digit+">"}function toBase(n,base){base=bigInt(base);if(base.isZero()){if(n.isZero())return{value:[0],isNegative:false};throw new Error("Cannot convert nonzero numbers to base 0.")}if(base.equals(-1)){if(n.isZero())return{value:[0],isNegative:false};if(n.isNegative())return{value:[].concat.apply([],Array.apply(null,Array(-n.toJSNumber())).map(Array.prototype.valueOf,[1,0])),isNegative:false};var arr=Array.apply(null,Array(n.toJSNumber()-1)).map(Array.prototype.valueOf,[0,1]);arr.unshift([1]);return{value:[].concat.apply([],arr),isNegative:false}}var neg=false;if(n.isNegative()&&base.isPositive()){neg=true;n=n.abs()}if(base.isUnit()){if(n.isZero())return{value:[0],isNegative:false};return{value:Array.apply(null,Array(n.toJSNumber())).map(Number.prototype.valueOf,1),isNegative:neg}}var out=[];var left=n,divmod;while(left.isNegative()||left.compareAbs(base)>=0){divmod=left.divmod(base);left=divmod.quotient;var digit=divmod.remainder;if(digit.isNegative()){digit=base.minus(digit).abs();left=left.next()}out.push(digit.toJSNumber())}out.push(left.toJSNumber());return{value:out.reverse(),isNegative:neg}}function toBaseString(n,base,alphabet){var arr=toBase(n,base);return(arr.isNegative?"-":"")+arr.value.map(function(x){return stringify(x,alphabet)}).join("")}BigInteger.prototype.toArray=function(radix){return toBase(this,radix)};SmallInteger.prototype.toArray=function(radix){return toBase(this,radix)};NativeBigInt.prototype.toArray=function(radix){return toBase(this,radix)};BigInteger.prototype.toString=function(radix,alphabet){if(radix===undefined)radix=10;if(radix!==10)return toBaseString(this,radix,alphabet);var v=this.value,l=v.length,str=String(v[--l]),zeros="0000000",digit;while(--l>=0){digit=String(v[l]);str+=zeros.slice(digit.length)+digit}var sign=this.sign?"-":"";return sign+str};SmallInteger.prototype.toString=function(radix,alphabet){if(radix===undefined)radix=10;if(radix!=10)return toBaseString(this,radix,alphabet);return String(this.value)};NativeBigInt.prototype.toString=SmallInteger.prototype.toString;NativeBigInt.prototype.toJSON=BigInteger.prototype.toJSON=SmallInteger.prototype.toJSON=function(){return this.toString()};BigInteger.prototype.valueOf=function(){return parseInt(this.toString(),10)};BigInteger.prototype.toJSNumber=BigInteger.prototype.valueOf;SmallInteger.prototype.valueOf=function(){return this.value};SmallInteger.prototype.toJSNumber=SmallInteger.prototype.valueOf;NativeBigInt.prototype.valueOf=NativeBigInt.prototype.toJSNumber=function(){return parseInt(this.toString(),10)};function parseStringValue(v){if(isPrecise(+v)){var x=+v;if(x===truncate(x))return supportsNativeBigInt?new NativeBigInt(BigInt(x)):new SmallInteger(x);throw new Error("Invalid integer: "+v)}var sign=v[0]==="-";if(sign)v=v.slice(1);var split=v.split(/e/i);if(split.length>2)throw new Error("Invalid integer: "+split.join("e"));if(split.length===2){var exp=split[1];if(exp[0]==="+")exp=exp.slice(1);exp=+exp;if(exp!==truncate(exp)||!isPrecise(exp))throw new Error("Invalid integer: "+exp+" is not a valid exponent.");var text=split[0];var decimalPlace=text.indexOf(".");if(decimalPlace>=0){exp-=text.length-decimalPlace-1;text=text.slice(0,decimalPlace)+text.slice(decimalPlace+1)}if(exp<0)throw new Error("Cannot include negative exponent part for integers");text+=new Array(exp+1).join("0");v=text}var isValid=/^([0-9][0-9]*)$/.test(v);if(!isValid)throw new Error("Invalid integer: "+v);if(supportsNativeBigInt){return new NativeBigInt(BigInt(sign?"-"+v:v))}var r=[],max=v.length,l=LOG_BASE,min=max-l;while(max>0){r.push(+v.slice(min,max));min-=l;if(min<0)min=0;max-=l}trim(r);return new BigInteger(r,sign)}function parseNumberValue(v){if(supportsNativeBigInt){return new NativeBigInt(BigInt(v))}if(isPrecise(v)){if(v!==truncate(v))throw new Error(v+" is not an integer.");return new SmallInteger(v)}return parseStringValue(v.toString())}function parseValue(v){if(typeof v==="number"){return parseNumberValue(v)}if(typeof v==="string"){return parseStringValue(v)}if(typeof v==="bigint"){return new NativeBigInt(v)}return v}for(var i=0;i<1e3;i++){Integer[i]=parseValue(i);if(i>0)Integer[-i]=parseValue(-i)}Integer.one=Integer[1];Integer.zero=Integer[0];Integer.minusOne=Integer[-1];Integer.max=max;Integer.min=min;Integer.gcd=gcd;Integer.lcm=lcm;Integer.isInstance=function(x){return x instanceof BigInteger||x instanceof SmallInteger||x instanceof NativeBigInt};Integer.randBetween=randBetween;Integer.fromArray=function(digits,base,isNegative){return parseBaseFromArray(digits.map(parseValue),parseValue(base||10),isNegative)};return Integer}();if(typeof module!=="undefined"&&module.hasOwnProperty("exports")){module.exports=bigInt}if(typeof define==="function"&&define.amd){define(function(){return bigInt})}This is free and unencumbered software released into the public domain.

Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.

In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

For more information, please refer to <http://unlicense.org>
{
  "name": "big-integer",
  "description": "An arbitrary length integer library for Javascript",
  "main": "./BigInteger.js",
  "authors": [
    "Peter Olson"
  ],
  "license": "Unlicense",
  "keywords": [
    "math",
    "big",
    "bignum",
    "bigint",
    "biginteger",
    "integer",
    "arbitrary",
    "precision",
    "arithmetic"
  ],
  "homepage": "https://github.com/peterolson/BigInteger.js",
  "ignore": [
    "**/.*",
    "node_modules",
    "bower_components",
    "test",
    "coverage",
    "tests"
  ]
}
{
  "author": {
    "name": "Peter Olson",
    "email": "peter.e.c.olson+npm@gmail.com"
  },
  "bin": {},
  "deprecated": false,
  "description": "An arbitrary length integer library for Javascript",
  "devDependencies": {
    "@types/lodash": "^4.14.118",
    "@types/node": "^7.10.2",
    "coveralls": "^3.0.6",
    "jasmine": "3.5.0",
    "jasmine-core": "^3.5.0",
    "karma": "^4.3.0",
    "karma-cli": "^2.0.0",
    "karma-coverage": "^2.0.1",
    "karma-jasmine": "^2.0.1",
    "karma-phantomjs-launcher": "^1.0.4",
    "lodash": "^4.17.11",
    "typescript": "^3.6.3",
    "uglifyjs": "^2.4.10"
  },
  "engines": {
    "node": ">=0.6"
  },
  "homepage": "https://github.com/peterolson/BigInteger.js#readme",
  "license": "Unlicense",
  "main": "./BigInteger",
  "name": "big-integer",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/peterolson/BigInteger.js.git"
  },
  "typings": "./BigInteger.d.ts",
  "version": "1.6.48"
}{
    "compilerOptions": {
        "target": "esnext",
        "module": "commonjs",
        "lib": [
            "es6"
        ],
        "noImplicitAny": true,
        "noImplicitThis": true,
        "strictNullChecks": false,
        "baseUrl": "./",
        "moduleResolution": "node",
        "allowJs": true,
        "typeRoots": [
            "./"
        ],
        "types": [
            "node"
        ],
        "forceConsistentCasingInFileNames": true
    },
    "files": [
        "BigInteger.d.ts",
        "spec/tsDefinitions.ts"
    ]
}
The MIT License (MIT)

Copyright (c) 2013-2018 Petka Antonov

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Petka Antonov",
    "email": "petka_antonov@hotmail.com",
    "url": "http://github.com/petkaantonov/"
  },
  "browser": "./js/browser/bluebird.js",
  "deprecated": false,
  "description": "Full featured Promises/A+ implementation with exceptionally good performance",
  "devDependencies": {
    "acorn": "^6.0.2",
    "acorn-walk": "^6.1.0",
    "baconjs": "^0.7.43",
    "bluebird": "^2.9.2",
    "body-parser": "^1.10.2",
    "browserify": "^8.1.1",
    "cli-table": "~0.3.1",
    "co": "^4.2.0",
    "cross-spawn": "^0.2.3",
    "glob": "^4.3.2",
    "grunt-saucelabs": "~8.4.1",
    "highland": "^2.3.0",
    "istanbul": "^0.3.5",
    "jshint": "^2.6.0",
    "jshint-stylish": "~0.2.0",
    "kefir": "^2.4.1",
    "mkdirp": "~0.5.0",
    "mocha": "~2.1",
    "open": "~0.0.5",
    "optimist": "~0.6.1",
    "rimraf": "~2.2.6",
    "rx": "^2.3.25",
    "serve-static": "^1.7.1",
    "sinon": "~1.7.3",
    "uglify-js": "~2.4.16"
  },
  "files": [
    "js/browser",
    "js/release",
    "LICENSE"
  ],
  "homepage": "https://github.com/petkaantonov/bluebird",
  "license": "MIT",
  "main": "./js/release/bluebird.js",
  "name": "bluebird",
  "repository": {
    "type": "git",
    "url": "git://github.com/petkaantonov/bluebird.git"
  },
  "version": "3.7.2",
  "webpack": "./js/release/bluebird.js"
}"use strict";
module.exports = function(Promise) {
var SomePromiseArray = Promise._SomePromiseArray;
function any(promises) {
    var ret = new SomePromiseArray(promises);
    var promise = ret.promise();
    ret.setHowMany(1);
    ret.setUnwrap();
    ret.init();
    return promise;
}

Promise.any = function (promises) {
    return any(promises);
};

Promise.prototype.any = function () {
    return any(this);
};

};
"use strict";
module.exports = (function(){
var AssertionError = (function() {
    function AssertionError(a) {
        this.constructor$(a);
        this.message = a;
        this.name = "AssertionError";
    }
    AssertionError.prototype = new Error();
    AssertionError.prototype.constructor = AssertionError;
    AssertionError.prototype.constructor$ = Error;
    return AssertionError;
})();

function getParams(args) {
    var params = [];
    for (var i = 0; i < args.length; ++i) params.push("arg" + i);
    return params;
}

function nativeAssert(callName, args, expect) {
    try {
        var params = getParams(args);
        var constructorArgs = params;
        constructorArgs.push("return " +
                callName + "("+ params.join(",") + ");");
        var fn = Function.apply(null, constructorArgs);
        return fn.apply(null, args);
    } catch (e) {
        if (!(e instanceof SyntaxError)) {
            throw e;
        } else {
            return expect;
        }
    }
}

return function assert(boolExpr, message) {
    if (boolExpr === true) return;

    if (typeof boolExpr === "string" &&
        boolExpr.charAt(0) === "%") {
        var nativeCallName = boolExpr;
        var $_len = arguments.length;var args = new Array(Math.max($_len - 2, 0)); for(var $_i = 2; $_i < $_len; ++$_i) {args[$_i - 2] = arguments[$_i];};
        if (nativeAssert(nativeCallName, args, message) === message) return;
        message = (nativeCallName + " !== " + message);
    }

    var ret = new AssertionError(message);
    if (Error.captureStackTrace) {
        Error.captureStackTrace(ret, assert);
    }
    throw ret;
};
})();
"use strict";
var firstLineError;
try {throw new Error(); } catch (e) {firstLineError = e;}
var schedule = require("./schedule");
var Queue = require("./queue");

function Async() {
    this._customScheduler = false;
    this._isTickUsed = false;
    this._lateQueue = new Queue(16);
    this._normalQueue = new Queue(16);
    this._haveDrainedQueues = false;
    var self = this;
    this.drainQueues = function () {
        self._drainQueues();
    };
    this._schedule = schedule;
}

Async.prototype.setScheduler = function(fn) {
    var prev = this._schedule;
    this._schedule = fn;
    this._customScheduler = true;
    return prev;
};

Async.prototype.hasCustomScheduler = function() {
    return this._customScheduler;
};

Async.prototype.haveItemsQueued = function () {
    return this._isTickUsed || this._haveDrainedQueues;
};


Async.prototype.fatalError = function(e, isNode) {
    if (isNode) {
        process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) +
            "\n");
        process.exit(2);
    } else {
        this.throwLater(e);
    }
};

Async.prototype.throwLater = function(fn, arg) {
    if (arguments.length === 1) {
        arg = fn;
        fn = function () { throw arg; };
    }
    if (typeof setTimeout !== "undefined") {
        setTimeout(function() {
            fn(arg);
        }, 0);
    } else try {
        this._schedule(function() {
            fn(arg);
        });
    } catch (e) {
        throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
};

function AsyncInvokeLater(fn, receiver, arg) {
    this._lateQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncInvoke(fn, receiver, arg) {
    this._normalQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncSettlePromises(promise) {
    this._normalQueue._pushOne(promise);
    this._queueTick();
}

Async.prototype.invokeLater = AsyncInvokeLater;
Async.prototype.invoke = AsyncInvoke;
Async.prototype.settlePromises = AsyncSettlePromises;


function _drainQueue(queue) {
    while (queue.length() > 0) {
        _drainQueueStep(queue);
    }
}

function _drainQueueStep(queue) {
    var fn = queue.shift();
    if (typeof fn !== "function") {
        fn._settlePromises();
    } else {
        var receiver = queue.shift();
        var arg = queue.shift();
        fn.call(receiver, arg);
    }
}

Async.prototype._drainQueues = function () {
    _drainQueue(this._normalQueue);
    this._reset();
    this._haveDrainedQueues = true;
    _drainQueue(this._lateQueue);
};

Async.prototype._queueTick = function () {
    if (!this._isTickUsed) {
        this._isTickUsed = true;
        this._schedule(this.drainQueues);
    }
};

Async.prototype._reset = function () {
    this._isTickUsed = false;
};

module.exports = Async;
module.exports.firstLineError = firstLineError;
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {
var calledBind = false;
var rejectThis = function(_, e) {
    this._reject(e);
};

var targetRejected = function(e, context) {
    context.promiseRejectionQueued = true;
    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
};

var bindingResolved = function(thisArg, context) {
    if (((this._bitField & 50397184) === 0)) {
        this._resolveCallback(context.target);
    }
};

var bindingRejected = function(e, context) {
    if (!context.promiseRejectionQueued) this._reject(e);
};

Promise.prototype.bind = function (thisArg) {
    if (!calledBind) {
        calledBind = true;
        Promise.prototype._propagateFrom = debug.propagateFromFunction();
        Promise.prototype._boundValue = debug.boundValueFunction();
    }
    var maybePromise = tryConvertToPromise(thisArg);
    var ret = new Promise(INTERNAL);
    ret._propagateFrom(this, 1);
    var target = this._target();
    ret._setBoundTo(maybePromise);
    if (maybePromise instanceof Promise) {
        var context = {
            promiseRejectionQueued: false,
            promise: ret,
            target: target,
            bindingPromise: maybePromise
        };
        target._then(INTERNAL, targetRejected, undefined, ret, context);
        maybePromise._then(
            bindingResolved, bindingRejected, undefined, ret, context);
        ret._setOnCancel(maybePromise);
    } else {
        ret._resolveCallback(target);
    }
    return ret;
};

Promise.prototype._setBoundTo = function (obj) {
    if (obj !== undefined) {
        this._bitField = this._bitField | 2097152;
        this._boundTo = obj;
    } else {
        this._bitField = this._bitField & (~2097152);
    }
};

Promise.prototype._isBound = function () {
    return (this._bitField & 2097152) === 2097152;
};

Promise.bind = function (thisArg, value) {
    return Promise.resolve(value).bind(thisArg);
};
};
"use strict";
var old;
if (typeof Promise !== "undefined") old = Promise;
function noConflict() {
    try { if (Promise === bluebird) Promise = old; }
    catch (e) {}
    return bluebird;
}
var bluebird = require("./promise")();
bluebird.noConflict = noConflict;
module.exports = bluebird;
"use strict";
var cr = Object.create;
if (cr) {
    var callerCache = cr(null);
    var getterCache = cr(null);
    callerCache[" size"] = getterCache[" size"] = 0;
}

module.exports = function(Promise) {
var util = require("./util");
var canEvaluate = util.canEvaluate;
var isIdentifier = util.isIdentifier;

var getMethodCaller;
var getGetter;
if (!false) {
var makeMethodCaller = function (methodName) {
    return new Function("ensureMethod", "                                    \n\
        return function(obj) {                                               \n\
            'use strict'                                                     \n\
            var len = this.length;                                           \n\
            ensureMethod(obj, 'methodName');                                 \n\
            switch(len) {                                                    \n\
                case 1: return obj.methodName(this[0]);                      \n\
                case 2: return obj.methodName(this[0], this[1]);             \n\
                case 3: return obj.methodName(this[0], this[1], this[2]);    \n\
                case 0: return obj.methodName();                             \n\
                default:                                                     \n\
                    return obj.methodName.apply(obj, this);                  \n\
            }                                                                \n\
        };                                                                   \n\
        ".replace(/methodName/g, methodName))(ensureMethod);
};

var makeGetter = function (propertyName) {
    return new Function("obj", "                                             \n\
        'use strict';                                                        \n\
        return obj.propertyName;                                             \n\
        ".replace("propertyName", propertyName));
};

var getCompiled = function(name, compiler, cache) {
    var ret = cache[name];
    if (typeof ret !== "function") {
        if (!isIdentifier(name)) {
            return null;
        }
        ret = compiler(name);
        cache[name] = ret;
        cache[" size"]++;
        if (cache[" size"] > 512) {
            var keys = Object.keys(cache);
            for (var i = 0; i < 256; ++i) delete cache[keys[i]];
            cache[" size"] = keys.length - 256;
        }
    }
    return ret;
};

getMethodCaller = function(name) {
    return getCompiled(name, makeMethodCaller, callerCache);
};

getGetter = function(name) {
    return getCompiled(name, makeGetter, getterCache);
};
}

function ensureMethod(obj, methodName) {
    var fn;
    if (obj != null) fn = obj[methodName];
    if (typeof fn !== "function") {
        var message = "Object " + util.classString(obj) + " has no method '" +
            util.toString(methodName) + "'";
        throw new Promise.TypeError(message);
    }
    return fn;
}

function caller(obj) {
    var methodName = this.pop();
    var fn = ensureMethod(obj, methodName);
    return fn.apply(obj, this);
}
Promise.prototype.call = function (methodName) {
    var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};
    if (!false) {
        if (canEvaluate) {
            var maybeCaller = getMethodCaller(methodName);
            if (maybeCaller !== null) {
                return this._then(
                    maybeCaller, undefined, undefined, args, undefined);
            }
        }
    }
    args.push(methodName);
    return this._then(caller, undefined, undefined, args, undefined);
};

function namedGetter(obj) {
    return obj[this];
}
function indexedGetter(obj) {
    var index = +this;
    if (index < 0) index = Math.max(0, index + obj.length);
    return obj[index];
}
Promise.prototype.get = function (propertyName) {
    var isIndex = (typeof propertyName === "number");
    var getter;
    if (!isIndex) {
        if (canEvaluate) {
            var maybeGetter = getGetter(propertyName);
            getter = maybeGetter !== null ? maybeGetter : namedGetter;
        } else {
            getter = namedGetter;
        }
    } else {
        getter = indexedGetter;
    }
    return this._then(getter, undefined, undefined, propertyName, undefined);
};
};
"use strict";
module.exports = function(Promise, PromiseArray, apiRejection, debug) {
var util = require("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

Promise.prototype["break"] = Promise.prototype.cancel = function() {
    if (!debug.cancellation()) return this._warn("cancellation is disabled");

    var promise = this;
    var child = promise;
    while (promise._isCancellable()) {
        if (!promise._cancelBy(child)) {
            if (child._isFollowing()) {
                child._followee().cancel();
            } else {
                child._cancelBranched();
            }
            break;
        }

        var parent = promise._cancellationParent;
        if (parent == null || !parent._isCancellable()) {
            if (promise._isFollowing()) {
                promise._followee().cancel();
            } else {
                promise._cancelBranched();
            }
            break;
        } else {
            if (promise._isFollowing()) promise._followee().cancel();
            promise._setWillBeCancelled();
            child = promise;
            promise = parent;
        }
    }
};

Promise.prototype._branchHasCancelled = function() {
    this._branchesRemainingToCancel--;
};

Promise.prototype._enoughBranchesHaveCancelled = function() {
    return this._branchesRemainingToCancel === undefined ||
           this._branchesRemainingToCancel <= 0;
};

Promise.prototype._cancelBy = function(canceller) {
    if (canceller === this) {
        this._branchesRemainingToCancel = 0;
        this._invokeOnCancel();
        return true;
    } else {
        this._branchHasCancelled();
        if (this._enoughBranchesHaveCancelled()) {
            this._invokeOnCancel();
            return true;
        }
    }
    return false;
};

Promise.prototype._cancelBranched = function() {
    if (this._enoughBranchesHaveCancelled()) {
        this._cancel();
    }
};

Promise.prototype._cancel = function() {
    if (!this._isCancellable()) return;
    this._setCancelled();
    async.invoke(this._cancelPromises, this, undefined);
};

Promise.prototype._cancelPromises = function() {
    if (this._length() > 0) this._settlePromises();
};

Promise.prototype._unsetOnCancel = function() {
    this._onCancelField = undefined;
};

Promise.prototype._isCancellable = function() {
    return this.isPending() && !this._isCancelled();
};

Promise.prototype.isCancellable = function() {
    return this.isPending() && !this.isCancelled();
};

Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {
    if (util.isArray(onCancelCallback)) {
        for (var i = 0; i < onCancelCallback.length; ++i) {
            this._doInvokeOnCancel(onCancelCallback[i], internalOnly);
        }
    } else if (onCancelCallback !== undefined) {
        if (typeof onCancelCallback === "function") {
            if (!internalOnly) {
                var e = tryCatch(onCancelCallback).call(this._boundValue());
                if (e === errorObj) {
                    this._attachExtraTrace(e.e);
                    async.throwLater(e.e);
                }
            }
        } else {
            onCancelCallback._resultCancelled(this);
        }
    }
};

Promise.prototype._invokeOnCancel = function() {
    var onCancelCallback = this._onCancel();
    this._unsetOnCancel();
    async.invoke(this._doInvokeOnCancel, this, onCancelCallback);
};

Promise.prototype._invokeInternalOnCancel = function() {
    if (this._isCancellable()) {
        this._doInvokeOnCancel(this._onCancel(), true);
        this._unsetOnCancel();
    }
};

Promise.prototype._resultCancelled = function() {
    this.cancel();
};

};
"use strict";
module.exports = function(NEXT_FILTER) {
var util = require("./util");
var getKeys = require("./es5").keys;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function catchFilter(instances, cb, promise) {
    return function(e) {
        var boundTo = promise._boundValue();
        predicateLoop: for (var i = 0; i < instances.length; ++i) {
            var item = instances[i];

            if (item === Error ||
                (item != null && item.prototype instanceof Error)) {
                if (e instanceof item) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (typeof item === "function") {
                var matchesPredicate = tryCatch(item).call(boundTo, e);
                if (matchesPredicate === errorObj) {
                    return matchesPredicate;
                } else if (matchesPredicate) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (util.isObject(e)) {
                var keys = getKeys(item);
                for (var j = 0; j < keys.length; ++j) {
                    var key = keys[j];
                    if (item[key] != e[key]) {
                        continue predicateLoop;
                    }
                }
                return tryCatch(cb).call(boundTo, e);
            }
        }
        return NEXT_FILTER;
    };
}

return catchFilter;
};
"use strict";
module.exports = function(Promise) {
var longStackTraces = false;
var contextStack = [];

Promise.prototype._promiseCreated = function() {};
Promise.prototype._pushContext = function() {};
Promise.prototype._popContext = function() {return null;};
Promise._peekContext = Promise.prototype._peekContext = function() {};

function Context() {
    this._trace = new Context.CapturedTrace(peekContext());
}
Context.prototype._pushContext = function () {
    if (this._trace !== undefined) {
        this._trace._promiseCreated = null;
        contextStack.push(this._trace);
    }
};

Context.prototype._popContext = function () {
    if (this._trace !== undefined) {
        var trace = contextStack.pop();
        var ret = trace._promiseCreated;
        trace._promiseCreated = null;
        return ret;
    }
    return null;
};

function createContext() {
    if (longStackTraces) return new Context();
}

function peekContext() {
    var lastIndex = contextStack.length - 1;
    if (lastIndex >= 0) {
        return contextStack[lastIndex];
    }
    return undefined;
}
Context.CapturedTrace = null;
Context.create = createContext;
Context.deactivateLongStackTraces = function() {};
Context.activateLongStackTraces = function() {
    var Promise_pushContext = Promise.prototype._pushContext;
    var Promise_popContext = Promise.prototype._popContext;
    var Promise_PeekContext = Promise._peekContext;
    var Promise_peekContext = Promise.prototype._peekContext;
    var Promise_promiseCreated = Promise.prototype._promiseCreated;
    Context.deactivateLongStackTraces = function() {
        Promise.prototype._pushContext = Promise_pushContext;
        Promise.prototype._popContext = Promise_popContext;
        Promise._peekContext = Promise_PeekContext;
        Promise.prototype._peekContext = Promise_peekContext;
        Promise.prototype._promiseCreated = Promise_promiseCreated;
        longStackTraces = false;
    };
    longStackTraces = true;
    Promise.prototype._pushContext = Context.prototype._pushContext;
    Promise.prototype._popContext = Context.prototype._popContext;
    Promise._peekContext = Promise.prototype._peekContext = peekContext;
    Promise.prototype._promiseCreated = function() {
        var ctx = this._peekContext();
        if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;
    };
};
return Context;
};
"use strict";
module.exports = function(Promise, Context,
    enableAsyncHooks, disableAsyncHooks) {
var async = Promise._async;
var Warning = require("./errors").Warning;
var util = require("./util");
var es5 = require("./es5");
var canAttachTrace = util.canAttachTrace;
var unhandledRejectionHandled;
var possiblyUnhandledRejection;
var bluebirdFramePattern =
    /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/;
var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/;
var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/;
var stackFramePattern = null;
var formatStack = null;
var indentStackFrames = false;
var printWarning;
var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 &&
                        (false ||
                         util.env("BLUEBIRD_DEBUG") ||
                         util.env("NODE_ENV") === "development"));

var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 &&
    (debugging || util.env("BLUEBIRD_WARNINGS")));

var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 &&
    (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));

var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 &&
    (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));

var deferUnhandledRejectionCheck;
(function() {
    var promises = [];

    function unhandledRejectionCheck() {
        for (var i = 0; i < promises.length; ++i) {
            promises[i]._notifyUnhandledRejection();
        }
        unhandledRejectionClear();
    }

    function unhandledRejectionClear() {
        promises.length = 0;
    }

    deferUnhandledRejectionCheck = function(promise) {
        promises.push(promise);
        setTimeout(unhandledRejectionCheck, 1);
    };

    es5.defineProperty(Promise, "_unhandledRejectionCheck", {
        value: unhandledRejectionCheck
    });
    es5.defineProperty(Promise, "_unhandledRejectionClear", {
        value: unhandledRejectionClear
    });
})();

Promise.prototype.suppressUnhandledRejections = function() {
    var target = this._target();
    target._bitField = ((target._bitField & (~1048576)) |
                      524288);
};

Promise.prototype._ensurePossibleRejectionHandled = function () {
    if ((this._bitField & 524288) !== 0) return;
    this._setRejectionIsUnhandled();
    deferUnhandledRejectionCheck(this);
};

Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
    fireRejectionEvent("rejectionHandled",
                                  unhandledRejectionHandled, undefined, this);
};

Promise.prototype._setReturnedNonUndefined = function() {
    this._bitField = this._bitField | 268435456;
};

Promise.prototype._returnedNonUndefined = function() {
    return (this._bitField & 268435456) !== 0;
};

Promise.prototype._notifyUnhandledRejection = function () {
    if (this._isRejectionUnhandled()) {
        var reason = this._settledValue();
        this._setUnhandledRejectionIsNotified();
        fireRejectionEvent("unhandledRejection",
                                      possiblyUnhandledRejection, reason, this);
    }
};

Promise.prototype._setUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField | 262144;
};

Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField & (~262144);
};

Promise.prototype._isUnhandledRejectionNotified = function () {
    return (this._bitField & 262144) > 0;
};

Promise.prototype._setRejectionIsUnhandled = function () {
    this._bitField = this._bitField | 1048576;
};

Promise.prototype._unsetRejectionIsUnhandled = function () {
    this._bitField = this._bitField & (~1048576);
    if (this._isUnhandledRejectionNotified()) {
        this._unsetUnhandledRejectionIsNotified();
        this._notifyUnhandledRejectionIsHandled();
    }
};

Promise.prototype._isRejectionUnhandled = function () {
    return (this._bitField & 1048576) > 0;
};

Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) {
    return warn(message, shouldUseOwnTrace, promise || this);
};

Promise.onPossiblyUnhandledRejection = function (fn) {
    var context = Promise._getContext();
    possiblyUnhandledRejection = util.contextBind(context, fn);
};

Promise.onUnhandledRejectionHandled = function (fn) {
    var context = Promise._getContext();
    unhandledRejectionHandled = util.contextBind(context, fn);
};

var disableLongStackTraces = function() {};
Promise.longStackTraces = function () {
    if (async.haveItemsQueued() && !config.longStackTraces) {
        throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (!config.longStackTraces && longStackTracesIsSupported()) {
        var Promise_captureStackTrace = Promise.prototype._captureStackTrace;
        var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;
        var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace;
        config.longStackTraces = true;
        disableLongStackTraces = function() {
            if (async.haveItemsQueued() && !config.longStackTraces) {
                throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
            }
            Promise.prototype._captureStackTrace = Promise_captureStackTrace;
            Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;
            Promise.prototype._dereferenceTrace = Promise_dereferenceTrace;
            Context.deactivateLongStackTraces();
            config.longStackTraces = false;
        };
        Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;
        Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;
        Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace;
        Context.activateLongStackTraces();
    }
};

Promise.hasLongStackTraces = function () {
    return config.longStackTraces && longStackTracesIsSupported();
};


var legacyHandlers = {
    unhandledrejection: {
        before: function() {
            var ret = util.global.onunhandledrejection;
            util.global.onunhandledrejection = null;
            return ret;
        },
        after: function(fn) {
            util.global.onunhandledrejection = fn;
        }
    },
    rejectionhandled: {
        before: function() {
            var ret = util.global.onrejectionhandled;
            util.global.onrejectionhandled = null;
            return ret;
        },
        after: function(fn) {
            util.global.onrejectionhandled = fn;
        }
    }
};

var fireDomEvent = (function() {
    var dispatch = function(legacy, e) {
        if (legacy) {
            var fn;
            try {
                fn = legacy.before();
                return !util.global.dispatchEvent(e);
            } finally {
                legacy.after(fn);
            }
        } else {
            return !util.global.dispatchEvent(e);
        }
    };
    try {
        if (typeof CustomEvent === "function") {
            var event = new CustomEvent("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var eventData = {
                    detail: event,
                    cancelable: true
                };
                var domEvent = new CustomEvent(name, eventData);
                es5.defineProperty(
                    domEvent, "promise", {value: event.promise});
                es5.defineProperty(
                    domEvent, "reason", {value: event.reason});

                return dispatch(legacyHandlers[name], domEvent);
            };
        } else if (typeof Event === "function") {
            var event = new Event("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = new Event(name, {
                    cancelable: true
                });
                domEvent.detail = event;
                es5.defineProperty(domEvent, "promise", {value: event.promise});
                es5.defineProperty(domEvent, "reason", {value: event.reason});
                return dispatch(legacyHandlers[name], domEvent);
            };
        } else {
            var event = document.createEvent("CustomEvent");
            event.initCustomEvent("testingtheevent", false, true, {});
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = document.createEvent("CustomEvent");
                domEvent.initCustomEvent(name, false, true,
                    event);
                return dispatch(legacyHandlers[name], domEvent);
            };
        }
    } catch (e) {}
    return function() {
        return false;
    };
})();

var fireGlobalEvent = (function() {
    if (util.isNode) {
        return function() {
            return process.emit.apply(process, arguments);
        };
    } else {
        if (!util.global) {
            return function() {
                return false;
            };
        }
        return function(name) {
            var methodName = "on" + name.toLowerCase();
            var method = util.global[methodName];
            if (!method) return false;
            method.apply(util.global, [].slice.call(arguments, 1));
            return true;
        };
    }
})();

function generatePromiseLifecycleEventObject(name, promise) {
    return {promise: promise};
}

var eventToObjectGenerator = {
    promiseCreated: generatePromiseLifecycleEventObject,
    promiseFulfilled: generatePromiseLifecycleEventObject,
    promiseRejected: generatePromiseLifecycleEventObject,
    promiseResolved: generatePromiseLifecycleEventObject,
    promiseCancelled: generatePromiseLifecycleEventObject,
    promiseChained: function(name, promise, child) {
        return {promise: promise, child: child};
    },
    warning: function(name, warning) {
        return {warning: warning};
    },
    unhandledRejection: function (name, reason, promise) {
        return {reason: reason, promise: promise};
    },
    rejectionHandled: generatePromiseLifecycleEventObject
};

var activeFireEvent = function (name) {
    var globalEventFired = false;
    try {
        globalEventFired = fireGlobalEvent.apply(null, arguments);
    } catch (e) {
        async.throwLater(e);
        globalEventFired = true;
    }

    var domEventFired = false;
    try {
        domEventFired = fireDomEvent(name,
                    eventToObjectGenerator[name].apply(null, arguments));
    } catch (e) {
        async.throwLater(e);
        domEventFired = true;
    }

    return domEventFired || globalEventFired;
};

Promise.config = function(opts) {
    opts = Object(opts);
    if ("longStackTraces" in opts) {
        if (opts.longStackTraces) {
            Promise.longStackTraces();
        } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
            disableLongStackTraces();
        }
    }
    if ("warnings" in opts) {
        var warningsOption = opts.warnings;
        config.warnings = !!warningsOption;
        wForgottenReturn = config.warnings;

        if (util.isObject(warningsOption)) {
            if ("wForgottenReturn" in warningsOption) {
                wForgottenReturn = !!warningsOption.wForgottenReturn;
            }
        }
    }
    if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
        if (async.haveItemsQueued()) {
            throw new Error(
                "cannot enable cancellation after promises are in use");
        }
        Promise.prototype._clearCancellationData =
            cancellationClearCancellationData;
        Promise.prototype._propagateFrom = cancellationPropagateFrom;
        Promise.prototype._onCancel = cancellationOnCancel;
        Promise.prototype._setOnCancel = cancellationSetOnCancel;
        Promise.prototype._attachCancellationCallback =
            cancellationAttachCancellationCallback;
        Promise.prototype._execute = cancellationExecute;
        propagateFromFunction = cancellationPropagateFrom;
        config.cancellation = true;
    }
    if ("monitoring" in opts) {
        if (opts.monitoring && !config.monitoring) {
            config.monitoring = true;
            Promise.prototype._fireEvent = activeFireEvent;
        } else if (!opts.monitoring && config.monitoring) {
            config.monitoring = false;
            Promise.prototype._fireEvent = defaultFireEvent;
        }
    }
    if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) {
        var prev = config.asyncHooks;
        var cur = !!opts.asyncHooks;
        if (prev !== cur) {
            config.asyncHooks = cur;
            if (cur) {
                enableAsyncHooks();
            } else {
                disableAsyncHooks();
            }
        }
    }
    return Promise;
};

function defaultFireEvent() { return false; }

Promise.prototype._fireEvent = defaultFireEvent;
Promise.prototype._execute = function(executor, resolve, reject) {
    try {
        executor(resolve, reject);
    } catch (e) {
        return e;
    }
};
Promise.prototype._onCancel = function () {};
Promise.prototype._setOnCancel = function (handler) { ; };
Promise.prototype._attachCancellationCallback = function(onCancel) {
    ;
};
Promise.prototype._captureStackTrace = function () {};
Promise.prototype._attachExtraTrace = function () {};
Promise.prototype._dereferenceTrace = function () {};
Promise.prototype._clearCancellationData = function() {};
Promise.prototype._propagateFrom = function (parent, flags) {
    ;
    ;
};

function cancellationExecute(executor, resolve, reject) {
    var promise = this;
    try {
        executor(resolve, reject, function(onCancel) {
            if (typeof onCancel !== "function") {
                throw new TypeError("onCancel must be a function, got: " +
                                    util.toString(onCancel));
            }
            promise._attachCancellationCallback(onCancel);
        });
    } catch (e) {
        return e;
    }
}

function cancellationAttachCancellationCallback(onCancel) {
    if (!this._isCancellable()) return this;

    var previousOnCancel = this._onCancel();
    if (previousOnCancel !== undefined) {
        if (util.isArray(previousOnCancel)) {
            previousOnCancel.push(onCancel);
        } else {
            this._setOnCancel([previousOnCancel, onCancel]);
        }
    } else {
        this._setOnCancel(onCancel);
    }
}

function cancellationOnCancel() {
    return this._onCancelField;
}

function cancellationSetOnCancel(onCancel) {
    this._onCancelField = onCancel;
}

function cancellationClearCancellationData() {
    this._cancellationParent = undefined;
    this._onCancelField = undefined;
}

function cancellationPropagateFrom(parent, flags) {
    if ((flags & 1) !== 0) {
        this._cancellationParent = parent;
        var branchesRemainingToCancel = parent._branchesRemainingToCancel;
        if (branchesRemainingToCancel === undefined) {
            branchesRemainingToCancel = 0;
        }
        parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;
    }
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}

function bindingPropagateFrom(parent, flags) {
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}
var propagateFromFunction = bindingPropagateFrom;

function boundValueFunction() {
    var ret = this._boundTo;
    if (ret !== undefined) {
        if (ret instanceof Promise) {
            if (ret.isFulfilled()) {
                return ret.value();
            } else {
                return undefined;
            }
        }
    }
    return ret;
}

function longStackTracesCaptureStackTrace() {
    this._trace = new CapturedTrace(this._peekContext());
}

function longStackTracesAttachExtraTrace(error, ignoreSelf) {
    if (canAttachTrace(error)) {
        var trace = this._trace;
        if (trace !== undefined) {
            if (ignoreSelf) trace = trace._parent;
        }
        if (trace !== undefined) {
            trace.attachExtraTrace(error);
        } else if (!error.__stackCleaned__) {
            var parsed = parseStackAndMessage(error);
            util.notEnumerableProp(error, "stack",
                parsed.message + "\n" + parsed.stack.join("\n"));
            util.notEnumerableProp(error, "__stackCleaned__", true);
        }
    }
}

function longStackTracesDereferenceTrace() {
    this._trace = undefined;
}

function checkForgottenReturns(returnValue, promiseCreated, name, promise,
                               parent) {
    if (returnValue === undefined && promiseCreated !== null &&
        wForgottenReturn) {
        if (parent !== undefined && parent._returnedNonUndefined()) return;
        if ((promise._bitField & 65535) === 0) return;

        if (name) name = name + " ";
        var handlerLine = "";
        var creatorLine = "";
        if (promiseCreated._trace) {
            var traceLines = promiseCreated._trace.stack.split("\n");
            var stack = cleanStack(traceLines);
            for (var i = stack.length - 1; i >= 0; --i) {
                var line = stack[i];
                if (!nodeFramePattern.test(line)) {
                    var lineMatches = line.match(parseLinePattern);
                    if (lineMatches) {
                        handlerLine  = "at " + lineMatches[1] +
                            ":" + lineMatches[2] + ":" + lineMatches[3] + " ";
                    }
                    break;
                }
            }

            if (stack.length > 0) {
                var firstUserLine = stack[0];
                for (var i = 0; i < traceLines.length; ++i) {

                    if (traceLines[i] === firstUserLine) {
                        if (i > 0) {
                            creatorLine = "\n" + traceLines[i - 1];
                        }
                        break;
                    }
                }

            }
        }
        var msg = "a promise was created in a " + name +
            "handler " + handlerLine + "but was not returned from it, " +
            "see http://goo.gl/rRqMUw" +
            creatorLine;
        promise._warn(msg, true, promiseCreated);
    }
}

function deprecated(name, replacement) {
    var message = name +
        " is deprecated and will be removed in a future version.";
    if (replacement) message += " Use " + replacement + " instead.";
    return warn(message);
}

function warn(message, shouldUseOwnTrace, promise) {
    if (!config.warnings) return;
    var warning = new Warning(message);
    var ctx;
    if (shouldUseOwnTrace) {
        promise._attachExtraTrace(warning);
    } else if (config.longStackTraces && (ctx = Promise._peekContext())) {
        ctx.attachExtraTrace(warning);
    } else {
        var parsed = parseStackAndMessage(warning);
        warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
    }

    if (!activeFireEvent("warning", warning)) {
        formatAndLogError(warning, "", true);
    }
}

function reconstructStack(message, stacks) {
    for (var i = 0; i < stacks.length - 1; ++i) {
        stacks[i].push("From previous event:");
        stacks[i] = stacks[i].join("\n");
    }
    if (i < stacks.length) {
        stacks[i] = stacks[i].join("\n");
    }
    return message + "\n" + stacks.join("\n");
}

function removeDuplicateOrEmptyJumps(stacks) {
    for (var i = 0; i < stacks.length; ++i) {
        if (stacks[i].length === 0 ||
            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {
            stacks.splice(i, 1);
            i--;
        }
    }
}

function removeCommonRoots(stacks) {
    var current = stacks[0];
    for (var i = 1; i < stacks.length; ++i) {
        var prev = stacks[i];
        var currentLastIndex = current.length - 1;
        var currentLastLine = current[currentLastIndex];
        var commonRootMeetPoint = -1;

        for (var j = prev.length - 1; j >= 0; --j) {
            if (prev[j] === currentLastLine) {
                commonRootMeetPoint = j;
                break;
            }
        }

        for (var j = commonRootMeetPoint; j >= 0; --j) {
            var line = prev[j];
            if (current[currentLastIndex] === line) {
                current.pop();
                currentLastIndex--;
            } else {
                break;
            }
        }
        current = prev;
    }
}

function cleanStack(stack) {
    var ret = [];
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        var isTraceLine = "    (No stack trace)" === line ||
            stackFramePattern.test(line);
        var isInternalFrame = isTraceLine && shouldIgnore(line);
        if (isTraceLine && !isInternalFrame) {
            if (indentStackFrames && line.charAt(0) !== " ") {
                line = "    " + line;
            }
            ret.push(line);
        }
    }
    return ret;
}

function stackFramesAsArray(error) {
    var stack = error.stack.replace(/\s+$/g, "").split("\n");
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        if ("    (No stack trace)" === line || stackFramePattern.test(line)) {
            break;
        }
    }
    if (i > 0 && error.name != "SyntaxError") {
        stack = stack.slice(i);
    }
    return stack;
}

function parseStackAndMessage(error) {
    var stack = error.stack;
    var message = error.toString();
    stack = typeof stack === "string" && stack.length > 0
                ? stackFramesAsArray(error) : ["    (No stack trace)"];
    return {
        message: message,
        stack: error.name == "SyntaxError" ? stack : cleanStack(stack)
    };
}

function formatAndLogError(error, title, isSoft) {
    if (typeof console !== "undefined") {
        var message;
        if (util.isObject(error)) {
            var stack = error.stack;
            message = title + formatStack(stack, error);
        } else {
            message = title + String(error);
        }
        if (typeof printWarning === "function") {
            printWarning(message, isSoft);
        } else if (typeof console.log === "function" ||
            typeof console.log === "object") {
            console.log(message);
        }
    }
}

function fireRejectionEvent(name, localHandler, reason, promise) {
    var localEventFired = false;
    try {
        if (typeof localHandler === "function") {
            localEventFired = true;
            if (name === "rejectionHandled") {
                localHandler(promise);
            } else {
                localHandler(reason, promise);
            }
        }
    } catch (e) {
        async.throwLater(e);
    }

    if (name === "unhandledRejection") {
        if (!activeFireEvent(name, reason, promise) && !localEventFired) {
            formatAndLogError(reason, "Unhandled rejection ");
        }
    } else {
        activeFireEvent(name, promise);
    }
}

function formatNonError(obj) {
    var str;
    if (typeof obj === "function") {
        str = "[function " +
            (obj.name || "anonymous") +
            "]";
    } else {
        str = obj && typeof obj.toString === "function"
            ? obj.toString() : util.toString(obj);
        var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
        if (ruselessToString.test(str)) {
            try {
                var newStr = JSON.stringify(obj);
                str = newStr;
            }
            catch(e) {

            }
        }
        if (str.length === 0) {
            str = "(empty array)";
        }
    }
    return ("(<" + snip(str) + ">, no stack trace)");
}

function snip(str) {
    var maxChars = 41;
    if (str.length < maxChars) {
        return str;
    }
    return str.substr(0, maxChars - 3) + "...";
}

function longStackTracesIsSupported() {
    return typeof captureStackTrace === "function";
}

var shouldIgnore = function() { return false; };
var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
function parseLineInfo(line) {
    var matches = line.match(parseLineInfoRegex);
    if (matches) {
        return {
            fileName: matches[1],
            line: parseInt(matches[2], 10)
        };
    }
}

function setBounds(firstLineError, lastLineError) {
    if (!longStackTracesIsSupported()) return;
    var firstStackLines = (firstLineError.stack || "").split("\n");
    var lastStackLines = (lastLineError.stack || "").split("\n");
    var firstIndex = -1;
    var lastIndex = -1;
    var firstFileName;
    var lastFileName;
    for (var i = 0; i < firstStackLines.length; ++i) {
        var result = parseLineInfo(firstStackLines[i]);
        if (result) {
            firstFileName = result.fileName;
            firstIndex = result.line;
            break;
        }
    }
    for (var i = 0; i < lastStackLines.length; ++i) {
        var result = parseLineInfo(lastStackLines[i]);
        if (result) {
            lastFileName = result.fileName;
            lastIndex = result.line;
            break;
        }
    }
    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||
        firstFileName !== lastFileName || firstIndex >= lastIndex) {
        return;
    }

    shouldIgnore = function(line) {
        if (bluebirdFramePattern.test(line)) return true;
        var info = parseLineInfo(line);
        if (info) {
            if (info.fileName === firstFileName &&
                (firstIndex <= info.line && info.line <= lastIndex)) {
                return true;
            }
        }
        return false;
    };
}

function CapturedTrace(parent) {
    this._parent = parent;
    this._promisesCreated = 0;
    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
    captureStackTrace(this, CapturedTrace);
    if (length > 32) this.uncycle();
}
util.inherits(CapturedTrace, Error);
Context.CapturedTrace = CapturedTrace;

CapturedTrace.prototype.uncycle = function() {
    var length = this._length;
    if (length < 2) return;
    var nodes = [];
    var stackToIndex = {};

    for (var i = 0, node = this; node !== undefined; ++i) {
        nodes.push(node);
        node = node._parent;
    }
    length = this._length = i;
    for (var i = length - 1; i >= 0; --i) {
        var stack = nodes[i].stack;
        if (stackToIndex[stack] === undefined) {
            stackToIndex[stack] = i;
        }
    }
    for (var i = 0; i < length; ++i) {
        var currentStack = nodes[i].stack;
        var index = stackToIndex[currentStack];
        if (index !== undefined && index !== i) {
            if (index > 0) {
                nodes[index - 1]._parent = undefined;
                nodes[index - 1]._length = 1;
            }
            nodes[i]._parent = undefined;
            nodes[i]._length = 1;
            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;

            if (index < length - 1) {
                cycleEdgeNode._parent = nodes[index + 1];
                cycleEdgeNode._parent.uncycle();
                cycleEdgeNode._length =
                    cycleEdgeNode._parent._length + 1;
            } else {
                cycleEdgeNode._parent = undefined;
                cycleEdgeNode._length = 1;
            }
            var currentChildLength = cycleEdgeNode._length + 1;
            for (var j = i - 2; j >= 0; --j) {
                nodes[j]._length = currentChildLength;
                currentChildLength++;
            }
            return;
        }
    }
};

CapturedTrace.prototype.attachExtraTrace = function(error) {
    if (error.__stackCleaned__) return;
    this.uncycle();
    var parsed = parseStackAndMessage(error);
    var message = parsed.message;
    var stacks = [parsed.stack];

    var trace = this;
    while (trace !== undefined) {
        stacks.push(cleanStack(trace.stack.split("\n")));
        trace = trace._parent;
    }
    removeCommonRoots(stacks);
    removeDuplicateOrEmptyJumps(stacks);
    util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
    util.notEnumerableProp(error, "__stackCleaned__", true);
};

var captureStackTrace = (function stackDetection() {
    var v8stackFramePattern = /^\s*at\s*/;
    var v8stackFormatter = function(stack, error) {
        if (typeof stack === "string") return stack;

        if (error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    if (typeof Error.stackTraceLimit === "number" &&
        typeof Error.captureStackTrace === "function") {
        Error.stackTraceLimit += 6;
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        var captureStackTrace = Error.captureStackTrace;

        shouldIgnore = function(line) {
            return bluebirdFramePattern.test(line);
        };
        return function(receiver, ignoreUntil) {
            Error.stackTraceLimit += 6;
            captureStackTrace(receiver, ignoreUntil);
            Error.stackTraceLimit -= 6;
        };
    }
    var err = new Error();

    if (typeof err.stack === "string" &&
        err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
        stackFramePattern = /@/;
        formatStack = v8stackFormatter;
        indentStackFrames = true;
        return function captureStackTrace(o) {
            o.stack = new Error().stack;
        };
    }

    var hasStackAfterThrow;
    try { throw new Error(); }
    catch(e) {
        hasStackAfterThrow = ("stack" in e);
    }
    if (!("stack" in err) && hasStackAfterThrow &&
        typeof Error.stackTraceLimit === "number") {
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        return function captureStackTrace(o) {
            Error.stackTraceLimit += 6;
            try { throw new Error(); }
            catch(e) { o.stack = e.stack; }
            Error.stackTraceLimit -= 6;
        };
    }

    formatStack = function(stack, error) {
        if (typeof stack === "string") return stack;

        if ((typeof error === "object" ||
            typeof error === "function") &&
            error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    return null;

})([]);

if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
    printWarning = function (message) {
        console.warn(message);
    };
    if (util.isNode && process.stderr.isTTY) {
        printWarning = function(message, isSoft) {
            var color = isSoft ? "\u001b[33m" : "\u001b[31m";
            console.warn(color + message + "\u001b[0m\n");
        };
    } else if (!util.isNode && typeof (new Error().stack) === "string") {
        printWarning = function(message, isSoft) {
            console.warn("%c" + message,
                        isSoft ? "color: darkorange" : "color: red");
        };
    }
}

var config = {
    warnings: warnings,
    longStackTraces: false,
    cancellation: false,
    monitoring: false,
    asyncHooks: false
};

if (longStackTraces) Promise.longStackTraces();

return {
    asyncHooks: function() {
        return config.asyncHooks;
    },
    longStackTraces: function() {
        return config.longStackTraces;
    },
    warnings: function() {
        return config.warnings;
    },
    cancellation: function() {
        return config.cancellation;
    },
    monitoring: function() {
        return config.monitoring;
    },
    propagateFromFunction: function() {
        return propagateFromFunction;
    },
    boundValueFunction: function() {
        return boundValueFunction;
    },
    checkForgottenReturns: checkForgottenReturns,
    setBounds: setBounds,
    warn: warn,
    deprecated: deprecated,
    CapturedTrace: CapturedTrace,
    fireDomEvent: fireDomEvent,
    fireGlobalEvent: fireGlobalEvent
};
};
"use strict";
module.exports = function(Promise) {
function returner() {
    return this.value;
}
function thrower() {
    throw this.reason;
}

Promise.prototype["return"] =
Promise.prototype.thenReturn = function (value) {
    if (value instanceof Promise) value.suppressUnhandledRejections();
    return this._then(
        returner, undefined, undefined, {value: value}, undefined);
};

Promise.prototype["throw"] =
Promise.prototype.thenThrow = function (reason) {
    return this._then(
        thrower, undefined, undefined, {reason: reason}, undefined);
};

Promise.prototype.catchThrow = function (reason) {
    if (arguments.length <= 1) {
        return this._then(
            undefined, thrower, undefined, {reason: reason}, undefined);
    } else {
        var _reason = arguments[1];
        var handler = function() {throw _reason;};
        return this.caught(reason, handler);
    }
};

Promise.prototype.catchReturn = function (value) {
    if (arguments.length <= 1) {
        if (value instanceof Promise) value.suppressUnhandledRejections();
        return this._then(
            undefined, returner, undefined, {value: value}, undefined);
    } else {
        var _value = arguments[1];
        if (_value instanceof Promise) _value.suppressUnhandledRejections();
        var handler = function() {return _value;};
        return this.caught(value, handler);
    }
};
};
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseReduce = Promise.reduce;
var PromiseAll = Promise.all;

function promiseAllThis() {
    return PromiseAll(this);
}

function PromiseMapSeries(promises, fn) {
    return PromiseReduce(promises, fn, INTERNAL, INTERNAL);
}

Promise.prototype.each = function (fn) {
    return PromiseReduce(this, fn, INTERNAL, 0)
              ._then(promiseAllThis, undefined, undefined, this, undefined);
};

Promise.prototype.mapSeries = function (fn) {
    return PromiseReduce(this, fn, INTERNAL, INTERNAL);
};

Promise.each = function (promises, fn) {
    return PromiseReduce(promises, fn, INTERNAL, 0)
              ._then(promiseAllThis, undefined, undefined, promises, undefined);
};

Promise.mapSeries = PromiseMapSeries;
};

"use strict";
var es5 = require("./es5");
var Objectfreeze = es5.freeze;
var util = require("./util");
var inherits = util.inherits;
var notEnumerableProp = util.notEnumerableProp;

function subError(nameProperty, defaultMessage) {
    function SubError(message) {
        if (!(this instanceof SubError)) return new SubError(message);
        notEnumerableProp(this, "message",
            typeof message === "string" ? message : defaultMessage);
        notEnumerableProp(this, "name", nameProperty);
        if (Error.captureStackTrace) {
            Error.captureStackTrace(this, this.constructor);
        } else {
            Error.call(this);
        }
    }
    inherits(SubError, Error);
    return SubError;
}

var _TypeError, _RangeError;
var Warning = subError("Warning", "warning");
var CancellationError = subError("CancellationError", "cancellation error");
var TimeoutError = subError("TimeoutError", "timeout error");
var AggregateError = subError("AggregateError", "aggregate error");
try {
    _TypeError = TypeError;
    _RangeError = RangeError;
} catch(e) {
    _TypeError = subError("TypeError", "type error");
    _RangeError = subError("RangeError", "range error");
}

var methods = ("join pop push shift unshift slice filter forEach some " +
    "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" ");

for (var i = 0; i < methods.length; ++i) {
    if (typeof Array.prototype[methods[i]] === "function") {
        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];
    }
}

es5.defineProperty(AggregateError.prototype, "length", {
    value: 0,
    configurable: false,
    writable: true,
    enumerable: true
});
AggregateError.prototype["isOperational"] = true;
var level = 0;
AggregateError.prototype.toString = function() {
    var indent = Array(level * 4 + 1).join(" ");
    var ret = "\n" + indent + "AggregateError of:" + "\n";
    level++;
    indent = Array(level * 4 + 1).join(" ");
    for (var i = 0; i < this.length; ++i) {
        var str = this[i] === this ? "[Circular AggregateError]" : this[i] + "";
        var lines = str.split("\n");
        for (var j = 0; j < lines.length; ++j) {
            lines[j] = indent + lines[j];
        }
        str = lines.join("\n");
        ret += str + "\n";
    }
    level--;
    return ret;
};

function OperationalError(message) {
    if (!(this instanceof OperationalError))
        return new OperationalError(message);
    notEnumerableProp(this, "name", "OperationalError");
    notEnumerableProp(this, "message", message);
    this.cause = message;
    this["isOperational"] = true;

    if (message instanceof Error) {
        notEnumerableProp(this, "message", message.message);
        notEnumerableProp(this, "stack", message.stack);
    } else if (Error.captureStackTrace) {
        Error.captureStackTrace(this, this.constructor);
    }

}
inherits(OperationalError, Error);

var errorTypes = Error["__BluebirdErrorTypes__"];
if (!errorTypes) {
    errorTypes = Objectfreeze({
        CancellationError: CancellationError,
        TimeoutError: TimeoutError,
        OperationalError: OperationalError,
        RejectionError: OperationalError,
        AggregateError: AggregateError
    });
    es5.defineProperty(Error, "__BluebirdErrorTypes__", {
        value: errorTypes,
        writable: false,
        enumerable: false,
        configurable: false
    });
}

module.exports = {
    Error: Error,
    TypeError: _TypeError,
    RangeError: _RangeError,
    CancellationError: errorTypes.CancellationError,
    OperationalError: errorTypes.OperationalError,
    TimeoutError: errorTypes.TimeoutError,
    AggregateError: errorTypes.AggregateError,
    Warning: Warning
};
var isES5 = (function(){
    "use strict";
    return this === undefined;
})();

if (isES5) {
    module.exports = {
        freeze: Object.freeze,
        defineProperty: Object.defineProperty,
        getDescriptor: Object.getOwnPropertyDescriptor,
        keys: Object.keys,
        names: Object.getOwnPropertyNames,
        getPrototypeOf: Object.getPrototypeOf,
        isArray: Array.isArray,
        isES5: isES5,
        propertyIsWritable: function(obj, prop) {
            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
            return !!(!descriptor || descriptor.writable || descriptor.set);
        }
    };
} else {
    var has = {}.hasOwnProperty;
    var str = {}.toString;
    var proto = {}.constructor.prototype;

    var ObjectKeys = function (o) {
        var ret = [];
        for (var key in o) {
            if (has.call(o, key)) {
                ret.push(key);
            }
        }
        return ret;
    };

    var ObjectGetDescriptor = function(o, key) {
        return {value: o[key]};
    };

    var ObjectDefineProperty = function (o, key, desc) {
        o[key] = desc.value;
        return o;
    };

    var ObjectFreeze = function (obj) {
        return obj;
    };

    var ObjectGetPrototypeOf = function (obj) {
        try {
            return Object(obj).constructor.prototype;
        }
        catch (e) {
            return proto;
        }
    };

    var ArrayIsArray = function (obj) {
        try {
            return str.call(obj) === "[object Array]";
        }
        catch(e) {
            return false;
        }
    };

    module.exports = {
        isArray: ArrayIsArray,
        keys: ObjectKeys,
        names: ObjectKeys,
        defineProperty: ObjectDefineProperty,
        getDescriptor: ObjectGetDescriptor,
        freeze: ObjectFreeze,
        getPrototypeOf: ObjectGetPrototypeOf,
        isES5: isES5,
        propertyIsWritable: function() {
            return true;
        }
    };
}
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseMap = Promise.map;

Promise.prototype.filter = function (fn, options) {
    return PromiseMap(this, fn, options, INTERNAL);
};

Promise.filter = function (promises, fn, options) {
    return PromiseMap(promises, fn, options, INTERNAL);
};
};
"use strict";
module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) {
var util = require("./util");
var CancellationError = Promise.CancellationError;
var errorObj = util.errorObj;
var catchFilter = require("./catch_filter")(NEXT_FILTER);

function PassThroughHandlerContext(promise, type, handler) {
    this.promise = promise;
    this.type = type;
    this.handler = handler;
    this.called = false;
    this.cancelPromise = null;
}

PassThroughHandlerContext.prototype.isFinallyHandler = function() {
    return this.type === 0;
};

function FinallyHandlerCancelReaction(finallyHandler) {
    this.finallyHandler = finallyHandler;
}

FinallyHandlerCancelReaction.prototype._resultCancelled = function() {
    checkCancel(this.finallyHandler);
};

function checkCancel(ctx, reason) {
    if (ctx.cancelPromise != null) {
        if (arguments.length > 1) {
            ctx.cancelPromise._reject(reason);
        } else {
            ctx.cancelPromise._cancel();
        }
        ctx.cancelPromise = null;
        return true;
    }
    return false;
}

function succeed() {
    return finallyHandler.call(this, this.promise._target()._settledValue());
}
function fail(reason) {
    if (checkCancel(this, reason)) return;
    errorObj.e = reason;
    return errorObj;
}
function finallyHandler(reasonOrValue) {
    var promise = this.promise;
    var handler = this.handler;

    if (!this.called) {
        this.called = true;
        var ret = this.isFinallyHandler()
            ? handler.call(promise._boundValue())
            : handler.call(promise._boundValue(), reasonOrValue);
        if (ret === NEXT_FILTER) {
            return ret;
        } else if (ret !== undefined) {
            promise._setReturnedNonUndefined();
            var maybePromise = tryConvertToPromise(ret, promise);
            if (maybePromise instanceof Promise) {
                if (this.cancelPromise != null) {
                    if (maybePromise._isCancelled()) {
                        var reason =
                            new CancellationError("late cancellation observer");
                        promise._attachExtraTrace(reason);
                        errorObj.e = reason;
                        return errorObj;
                    } else if (maybePromise.isPending()) {
                        maybePromise._attachCancellationCallback(
                            new FinallyHandlerCancelReaction(this));
                    }
                }
                return maybePromise._then(
                    succeed, fail, undefined, this, undefined);
            }
        }
    }

    if (promise.isRejected()) {
        checkCancel(this);
        errorObj.e = reasonOrValue;
        return errorObj;
    } else {
        checkCancel(this);
        return reasonOrValue;
    }
}

Promise.prototype._passThrough = function(handler, type, success, fail) {
    if (typeof handler !== "function") return this.then();
    return this._then(success,
                      fail,
                      undefined,
                      new PassThroughHandlerContext(this, type, handler),
                      undefined);
};

Promise.prototype.lastly =
Promise.prototype["finally"] = function (handler) {
    return this._passThrough(handler,
                             0,
                             finallyHandler,
                             finallyHandler);
};


Promise.prototype.tap = function (handler) {
    return this._passThrough(handler, 1, finallyHandler);
};

Promise.prototype.tapCatch = function (handlerOrPredicate) {
    var len = arguments.length;
    if(len === 1) {
        return this._passThrough(handlerOrPredicate,
                                 1,
                                 undefined,
                                 finallyHandler);
    } else {
         var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return Promise.reject(new TypeError(
                    "tapCatch statement predicate: "
                    + "expecting an object but got " + util.classString(item)
                ));
            }
        }
        catchInstances.length = j;
        var handler = arguments[i];
        return this._passThrough(catchFilter(catchInstances, handler, this),
                                 1,
                                 undefined,
                                 finallyHandler);
    }

};

return PassThroughHandlerContext;
};
"use strict";
module.exports = function(Promise,
                          apiRejection,
                          INTERNAL,
                          tryConvertToPromise,
                          Proxyable,
                          debug) {
var errors = require("./errors");
var TypeError = errors.TypeError;
var util = require("./util");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
var yieldHandlers = [];

function promiseFromYieldHandler(value, yieldHandlers, traceParent) {
    for (var i = 0; i < yieldHandlers.length; ++i) {
        traceParent._pushContext();
        var result = tryCatch(yieldHandlers[i])(value);
        traceParent._popContext();
        if (result === errorObj) {
            traceParent._pushContext();
            var ret = Promise.reject(errorObj.e);
            traceParent._popContext();
            return ret;
        }
        var maybePromise = tryConvertToPromise(result, traceParent);
        if (maybePromise instanceof Promise) return maybePromise;
    }
    return null;
}

function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
    if (debug.cancellation()) {
        var internal = new Promise(INTERNAL);
        var _finallyPromise = this._finallyPromise = new Promise(INTERNAL);
        this._promise = internal.lastly(function() {
            return _finallyPromise;
        });
        internal._captureStackTrace();
        internal._setOnCancel(this);
    } else {
        var promise = this._promise = new Promise(INTERNAL);
        promise._captureStackTrace();
    }
    this._stack = stack;
    this._generatorFunction = generatorFunction;
    this._receiver = receiver;
    this._generator = undefined;
    this._yieldHandlers = typeof yieldHandler === "function"
        ? [yieldHandler].concat(yieldHandlers)
        : yieldHandlers;
    this._yieldedPromise = null;
    this._cancellationPhase = false;
}
util.inherits(PromiseSpawn, Proxyable);

PromiseSpawn.prototype._isResolved = function() {
    return this._promise === null;
};

PromiseSpawn.prototype._cleanup = function() {
    this._promise = this._generator = null;
    if (debug.cancellation() && this._finallyPromise !== null) {
        this._finallyPromise._fulfill();
        this._finallyPromise = null;
    }
};

PromiseSpawn.prototype._promiseCancelled = function() {
    if (this._isResolved()) return;
    var implementsReturn = typeof this._generator["return"] !== "undefined";

    var result;
    if (!implementsReturn) {
        var reason = new Promise.CancellationError(
            "generator .return() sentinel");
        Promise.coroutine.returnSentinel = reason;
        this._promise._attachExtraTrace(reason);
        this._promise._pushContext();
        result = tryCatch(this._generator["throw"]).call(this._generator,
                                                         reason);
        this._promise._popContext();
    } else {
        this._promise._pushContext();
        result = tryCatch(this._generator["return"]).call(this._generator,
                                                          undefined);
        this._promise._popContext();
    }
    this._cancellationPhase = true;
    this._yieldedPromise = null;
    this._continue(result);
};

PromiseSpawn.prototype._promiseFulfilled = function(value) {
    this._yieldedPromise = null;
    this._promise._pushContext();
    var result = tryCatch(this._generator.next).call(this._generator, value);
    this._promise._popContext();
    this._continue(result);
};

PromiseSpawn.prototype._promiseRejected = function(reason) {
    this._yieldedPromise = null;
    this._promise._attachExtraTrace(reason);
    this._promise._pushContext();
    var result = tryCatch(this._generator["throw"])
        .call(this._generator, reason);
    this._promise._popContext();
    this._continue(result);
};

PromiseSpawn.prototype._resultCancelled = function() {
    if (this._yieldedPromise instanceof Promise) {
        var promise = this._yieldedPromise;
        this._yieldedPromise = null;
        promise.cancel();
    }
};

PromiseSpawn.prototype.promise = function () {
    return this._promise;
};

PromiseSpawn.prototype._run = function () {
    this._generator = this._generatorFunction.call(this._receiver);
    this._receiver =
        this._generatorFunction = undefined;
    this._promiseFulfilled(undefined);
};

PromiseSpawn.prototype._continue = function (result) {
    var promise = this._promise;
    if (result === errorObj) {
        this._cleanup();
        if (this._cancellationPhase) {
            return promise.cancel();
        } else {
            return promise._rejectCallback(result.e, false);
        }
    }

    var value = result.value;
    if (result.done === true) {
        this._cleanup();
        if (this._cancellationPhase) {
            return promise.cancel();
        } else {
            return promise._resolveCallback(value);
        }
    } else {
        var maybePromise = tryConvertToPromise(value, this._promise);
        if (!(maybePromise instanceof Promise)) {
            maybePromise =
                promiseFromYieldHandler(maybePromise,
                                        this._yieldHandlers,
                                        this._promise);
            if (maybePromise === null) {
                this._promiseRejected(
                    new TypeError(
                        "A value %s was yielded that could not be treated as a promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", String(value)) +
                        "From coroutine:\u000a" +
                        this._stack.split("\n").slice(1, -7).join("\n")
                    )
                );
                return;
            }
        }
        maybePromise = maybePromise._target();
        var bitField = maybePromise._bitField;
        ;
        if (((bitField & 50397184) === 0)) {
            this._yieldedPromise = maybePromise;
            maybePromise._proxy(this, null);
        } else if (((bitField & 33554432) !== 0)) {
            Promise._async.invoke(
                this._promiseFulfilled, this, maybePromise._value()
            );
        } else if (((bitField & 16777216) !== 0)) {
            Promise._async.invoke(
                this._promiseRejected, this, maybePromise._reason()
            );
        } else {
            this._promiseCancelled();
        }
    }
};

Promise.coroutine = function (generatorFunction, options) {
    if (typeof generatorFunction !== "function") {
        throw new TypeError("generatorFunction must be a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var yieldHandler = Object(options).yieldHandler;
    var PromiseSpawn$ = PromiseSpawn;
    var stack = new Error().stack;
    return function () {
        var generator = generatorFunction.apply(this, arguments);
        var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,
                                      stack);
        var ret = spawn.promise();
        spawn._generator = generator;
        spawn._promiseFulfilled(undefined);
        return ret;
    };
};

Promise.coroutine.addYieldHandler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    yieldHandlers.push(fn);
};

Promise.spawn = function (generatorFunction) {
    debug.deprecated("Promise.spawn()", "Promise.coroutine()");
    if (typeof generatorFunction !== "function") {
        return apiRejection("generatorFunction must be a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var spawn = new PromiseSpawn(generatorFunction, this);
    var ret = spawn.promise();
    spawn._run(Promise.spawn);
    return ret;
};
};
"use strict";
module.exports =
function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) {
var util = require("./util");
var canEvaluate = util.canEvaluate;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var reject;

if (!false) {
if (canEvaluate) {
    var thenCallback = function(i) {
        return new Function("value", "holder", "                             \n\
            'use strict';                                                    \n\
            holder.pIndex = value;                                           \n\
            holder.checkFulfillment(this);                                   \n\
            ".replace(/Index/g, i));
    };

    var promiseSetter = function(i) {
        return new Function("promise", "holder", "                           \n\
            'use strict';                                                    \n\
            holder.pIndex = promise;                                         \n\
            ".replace(/Index/g, i));
    };

    var generateHolderClass = function(total) {
        var props = new Array(total);
        for (var i = 0; i < props.length; ++i) {
            props[i] = "this.p" + (i+1);
        }
        var assignment = props.join(" = ") + " = null;";
        var cancellationCode= "var promise;\n" + props.map(function(prop) {
            return "                                                         \n\
                promise = " + prop + ";                                      \n\
                if (promise instanceof Promise) {                            \n\
                    promise.cancel();                                        \n\
                }                                                            \n\
            ";
        }).join("\n");
        var passedArguments = props.join(", ");
        var name = "Holder$" + total;


        var code = "return function(tryCatch, errorObj, Promise, async) {    \n\
            'use strict';                                                    \n\
            function [TheName](fn) {                                         \n\
                [TheProperties]                                              \n\
                this.fn = fn;                                                \n\
                this.asyncNeeded = true;                                     \n\
                this.now = 0;                                                \n\
            }                                                                \n\
                                                                             \n\
            [TheName].prototype._callFunction = function(promise) {          \n\
                promise._pushContext();                                      \n\
                var ret = tryCatch(this.fn)([ThePassedArguments]);           \n\
                promise._popContext();                                       \n\
                if (ret === errorObj) {                                      \n\
                    promise._rejectCallback(ret.e, false);                   \n\
                } else {                                                     \n\
                    promise._resolveCallback(ret);                           \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype.checkFulfillment = function(promise) {       \n\
                var now = ++this.now;                                        \n\
                if (now === [TheTotal]) {                                    \n\
                    if (this.asyncNeeded) {                                  \n\
                        async.invoke(this._callFunction, this, promise);     \n\
                    } else {                                                 \n\
                        this._callFunction(promise);                         \n\
                    }                                                        \n\
                                                                             \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype._resultCancelled = function() {              \n\
                [CancellationCode]                                           \n\
            };                                                               \n\
                                                                             \n\
            return [TheName];                                                \n\
        }(tryCatch, errorObj, Promise, async);                               \n\
        ";

        code = code.replace(/\[TheName\]/g, name)
            .replace(/\[TheTotal\]/g, total)
            .replace(/\[ThePassedArguments\]/g, passedArguments)
            .replace(/\[TheProperties\]/g, assignment)
            .replace(/\[CancellationCode\]/g, cancellationCode);

        return new Function("tryCatch", "errorObj", "Promise", "async", code)
                           (tryCatch, errorObj, Promise, async);
    };

    var holderClasses = [];
    var thenCallbacks = [];
    var promiseSetters = [];

    for (var i = 0; i < 8; ++i) {
        holderClasses.push(generateHolderClass(i + 1));
        thenCallbacks.push(thenCallback(i + 1));
        promiseSetters.push(promiseSetter(i + 1));
    }

    reject = function (reason) {
        this._reject(reason);
    };
}}

Promise.join = function () {
    var last = arguments.length - 1;
    var fn;
    if (last > 0 && typeof arguments[last] === "function") {
        fn = arguments[last];
        if (!false) {
            if (last <= 8 && canEvaluate) {
                var ret = new Promise(INTERNAL);
                ret._captureStackTrace();
                var HolderClass = holderClasses[last - 1];
                var holder = new HolderClass(fn);
                var callbacks = thenCallbacks;

                for (var i = 0; i < last; ++i) {
                    var maybePromise = tryConvertToPromise(arguments[i], ret);
                    if (maybePromise instanceof Promise) {
                        maybePromise = maybePromise._target();
                        var bitField = maybePromise._bitField;
                        ;
                        if (((bitField & 50397184) === 0)) {
                            maybePromise._then(callbacks[i], reject,
                                               undefined, ret, holder);
                            promiseSetters[i](maybePromise, holder);
                            holder.asyncNeeded = false;
                        } else if (((bitField & 33554432) !== 0)) {
                            callbacks[i].call(ret,
                                              maybePromise._value(), holder);
                        } else if (((bitField & 16777216) !== 0)) {
                            ret._reject(maybePromise._reason());
                        } else {
                            ret._cancel();
                        }
                    } else {
                        callbacks[i].call(ret, maybePromise, holder);
                    }
                }

                if (!ret._isFateSealed()) {
                    if (holder.asyncNeeded) {
                        var context = Promise._getContext();
                        holder.fn = util.contextBind(context, holder.fn);
                    }
                    ret._setAsyncGuaranteed();
                    ret._setOnCancel(holder);
                }
                return ret;
            }
        }
    }
    var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len ; ++$_i) {args[$_i] = arguments[$_i ];};
    if (fn) args.pop();
    var ret = new PromiseArray(args).promise();
    return fn !== undefined ? ret.spread(fn) : ret;
};

};
"use strict";
module.exports = function(Promise,
                          PromiseArray,
                          apiRejection,
                          tryConvertToPromise,
                          INTERNAL,
                          debug) {
var util = require("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

function MappingPromiseArray(promises, fn, limit, _filter) {
    this.constructor$(promises);
    this._promise._captureStackTrace();
    var context = Promise._getContext();
    this._callback = util.contextBind(context, fn);
    this._preservedValues = _filter === INTERNAL
        ? new Array(this.length())
        : null;
    this._limit = limit;
    this._inFlight = 0;
    this._queue = [];
    async.invoke(this._asyncInit, this, undefined);
    if (util.isArray(promises)) {
        for (var i = 0; i < promises.length; ++i) {
            var maybePromise = promises[i];
            if (maybePromise instanceof Promise) {
                maybePromise.suppressUnhandledRejections();
            }
        }
    }
}
util.inherits(MappingPromiseArray, PromiseArray);

MappingPromiseArray.prototype._asyncInit = function() {
    this._init$(undefined, -2);
};

MappingPromiseArray.prototype._init = function () {};

MappingPromiseArray.prototype._promiseFulfilled = function (value, index) {
    var values = this._values;
    var length = this.length();
    var preservedValues = this._preservedValues;
    var limit = this._limit;

    if (index < 0) {
        index = (index * -1) - 1;
        values[index] = value;
        if (limit >= 1) {
            this._inFlight--;
            this._drainQueue();
            if (this._isResolved()) return true;
        }
    } else {
        if (limit >= 1 && this._inFlight >= limit) {
            values[index] = value;
            this._queue.push(index);
            return false;
        }
        if (preservedValues !== null) preservedValues[index] = value;

        var promise = this._promise;
        var callback = this._callback;
        var receiver = promise._boundValue();
        promise._pushContext();
        var ret = tryCatch(callback).call(receiver, value, index, length);
        var promiseCreated = promise._popContext();
        debug.checkForgottenReturns(
            ret,
            promiseCreated,
            preservedValues !== null ? "Promise.filter" : "Promise.map",
            promise
        );
        if (ret === errorObj) {
            this._reject(ret.e);
            return true;
        }

        var maybePromise = tryConvertToPromise(ret, this._promise);
        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            var bitField = maybePromise._bitField;
            ;
            if (((bitField & 50397184) === 0)) {
                if (limit >= 1) this._inFlight++;
                values[index] = maybePromise;
                maybePromise._proxy(this, (index + 1) * -1);
                return false;
            } else if (((bitField & 33554432) !== 0)) {
                ret = maybePromise._value();
            } else if (((bitField & 16777216) !== 0)) {
                this._reject(maybePromise._reason());
                return true;
            } else {
                this._cancel();
                return true;
            }
        }
        values[index] = ret;
    }
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= length) {
        if (preservedValues !== null) {
            this._filter(values, preservedValues);
        } else {
            this._resolve(values);
        }
        return true;
    }
    return false;
};

MappingPromiseArray.prototype._drainQueue = function () {
    var queue = this._queue;
    var limit = this._limit;
    var values = this._values;
    while (queue.length > 0 && this._inFlight < limit) {
        if (this._isResolved()) return;
        var index = queue.pop();
        this._promiseFulfilled(values[index], index);
    }
};

MappingPromiseArray.prototype._filter = function (booleans, values) {
    var len = values.length;
    var ret = new Array(len);
    var j = 0;
    for (var i = 0; i < len; ++i) {
        if (booleans[i]) ret[j++] = values[i];
    }
    ret.length = j;
    this._resolve(ret);
};

MappingPromiseArray.prototype.preservedValues = function () {
    return this._preservedValues;
};

function map(promises, fn, options, _filter) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }

    var limit = 0;
    if (options !== undefined) {
        if (typeof options === "object" && options !== null) {
            if (typeof options.concurrency !== "number") {
                return Promise.reject(
                    new TypeError("'concurrency' must be a number but it is " +
                                    util.classString(options.concurrency)));
            }
            limit = options.concurrency;
        } else {
            return Promise.reject(new TypeError(
                            "options argument must be an object but it is " +
                             util.classString(options)));
        }
    }
    limit = typeof limit === "number" &&
        isFinite(limit) && limit >= 1 ? limit : 0;
    return new MappingPromiseArray(promises, fn, limit, _filter).promise();
}

Promise.prototype.map = function (fn, options) {
    return map(this, fn, options, null);
};

Promise.map = function (promises, fn, options, _filter) {
    return map(promises, fn, options, _filter);
};


};
"use strict";
module.exports =
function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {
var util = require("./util");
var tryCatch = util.tryCatch;

Promise.method = function (fn) {
    if (typeof fn !== "function") {
        throw new Promise.TypeError("expecting a function but got " + util.classString(fn));
    }
    return function () {
        var ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._pushContext();
        var value = tryCatch(fn).apply(this, arguments);
        var promiseCreated = ret._popContext();
        debug.checkForgottenReturns(
            value, promiseCreated, "Promise.method", ret);
        ret._resolveFromSyncValue(value);
        return ret;
    };
};

Promise.attempt = Promise["try"] = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._pushContext();
    var value;
    if (arguments.length > 1) {
        debug.deprecated("calling Promise.try with more than 1 argument");
        var arg = arguments[1];
        var ctx = arguments[2];
        value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg)
                                  : tryCatch(fn).call(ctx, arg);
    } else {
        value = tryCatch(fn)();
    }
    var promiseCreated = ret._popContext();
    debug.checkForgottenReturns(
        value, promiseCreated, "Promise.try", ret);
    ret._resolveFromSyncValue(value);
    return ret;
};

Promise.prototype._resolveFromSyncValue = function (value) {
    if (value === util.errorObj) {
        this._rejectCallback(value.e, false);
    } else {
        this._resolveCallback(value, true);
    }
};
};
"use strict";
var util = require("./util");
var maybeWrapAsError = util.maybeWrapAsError;
var errors = require("./errors");
var OperationalError = errors.OperationalError;
var es5 = require("./es5");

function isUntypedError(obj) {
    return obj instanceof Error &&
        es5.getPrototypeOf(obj) === Error.prototype;
}

var rErrorKey = /^(?:name|message|stack|cause)$/;
function wrapAsOperationalError(obj) {
    var ret;
    if (isUntypedError(obj)) {
        ret = new OperationalError(obj);
        ret.name = obj.name;
        ret.message = obj.message;
        ret.stack = obj.stack;
        var keys = es5.keys(obj);
        for (var i = 0; i < keys.length; ++i) {
            var key = keys[i];
            if (!rErrorKey.test(key)) {
                ret[key] = obj[key];
            }
        }
        return ret;
    }
    util.markAsOriginatingFromRejection(obj);
    return obj;
}

function nodebackForPromise(promise, multiArgs) {
    return function(err, value) {
        if (promise === null) return;
        if (err) {
            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));
            promise._attachExtraTrace(wrapped);
            promise._reject(wrapped);
        } else if (!multiArgs) {
            promise._fulfill(value);
        } else {
            var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};
            promise._fulfill(args);
        }
        promise = null;
    };
}

module.exports = nodebackForPromise;
"use strict";
module.exports = function(Promise) {
var util = require("./util");
var async = Promise._async;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function spreadAdapter(val, nodeback) {
    var promise = this;
    if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);
    var ret =
        tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}

function successAdapter(val, nodeback) {
    var promise = this;
    var receiver = promise._boundValue();
    var ret = val === undefined
        ? tryCatch(nodeback).call(receiver, null)
        : tryCatch(nodeback).call(receiver, null, val);
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}
function errorAdapter(reason, nodeback) {
    var promise = this;
    if (!reason) {
        var newReason = new Error(reason + "");
        newReason.cause = reason;
        reason = newReason;
    }
    var ret = tryCatch(nodeback).call(promise._boundValue(), reason);
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}

Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback,
                                                                     options) {
    if (typeof nodeback == "function") {
        var adapter = successAdapter;
        if (options !== undefined && Object(options).spread) {
            adapter = spreadAdapter;
        }
        this._then(
            adapter,
            errorAdapter,
            undefined,
            this,
            nodeback
        );
    }
    return this;
};
};
"use strict";
module.exports = function() {
var makeSelfResolutionError = function () {
    return new TypeError("circular promise resolution chain\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var reflectHandler = function() {
    return new Promise.PromiseInspection(this._target());
};
var apiRejection = function(msg) {
    return Promise.reject(new TypeError(msg));
};
function Proxyable() {}
var UNDEFINED_BINDING = {};
var util = require("./util");
util.setReflectHandler(reflectHandler);

var getDomain = function() {
    var domain = process.domain;
    if (domain === undefined) {
        return null;
    }
    return domain;
};
var getContextDefault = function() {
    return null;
};
var getContextDomain = function() {
    return {
        domain: getDomain(),
        async: null
    };
};
var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ?
    require("async_hooks").AsyncResource : null;
var getContextAsyncHooks = function() {
    return {
        domain: getDomain(),
        async: new AsyncResource("Bluebird::Promise")
    };
};
var getContext = util.isNode ? getContextDomain : getContextDefault;
util.notEnumerableProp(Promise, "_getContext", getContext);
var enableAsyncHooks = function() {
    getContext = getContextAsyncHooks;
    util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks);
};
var disableAsyncHooks = function() {
    getContext = getContextDomain;
    util.notEnumerableProp(Promise, "_getContext", getContextDomain);
};

var es5 = require("./es5");
var Async = require("./async");
var async = new Async();
es5.defineProperty(Promise, "_async", {value: async});
var errors = require("./errors");
var TypeError = Promise.TypeError = errors.TypeError;
Promise.RangeError = errors.RangeError;
var CancellationError = Promise.CancellationError = errors.CancellationError;
Promise.TimeoutError = errors.TimeoutError;
Promise.OperationalError = errors.OperationalError;
Promise.RejectionError = errors.OperationalError;
Promise.AggregateError = errors.AggregateError;
var INTERNAL = function(){};
var APPLY = {};
var NEXT_FILTER = {};
var tryConvertToPromise = require("./thenables")(Promise, INTERNAL);
var PromiseArray =
    require("./promise_array")(Promise, INTERNAL,
                               tryConvertToPromise, apiRejection, Proxyable);
var Context = require("./context")(Promise);
 /*jshint unused:false*/
var createContext = Context.create;

var debug = require("./debuggability")(Promise, Context,
    enableAsyncHooks, disableAsyncHooks);
var CapturedTrace = debug.CapturedTrace;
var PassThroughHandlerContext =
    require("./finally")(Promise, tryConvertToPromise, NEXT_FILTER);
var catchFilter = require("./catch_filter")(NEXT_FILTER);
var nodebackForPromise = require("./nodeback");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
function check(self, executor) {
    if (self == null || self.constructor !== Promise) {
        throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (typeof executor !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(executor));
    }

}

function Promise(executor) {
    if (executor !== INTERNAL) {
        check(this, executor);
    }
    this._bitField = 0;
    this._fulfillmentHandler0 = undefined;
    this._rejectionHandler0 = undefined;
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._resolveFromExecutor(executor);
    this._promiseCreated();
    this._fireEvent("promiseCreated", this);
}

Promise.prototype.toString = function () {
    return "[object Promise]";
};

Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {
    var len = arguments.length;
    if (len > 1) {
        var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return apiRejection("Catch statement predicate: " +
                    "expecting an object but got " + util.classString(item));
            }
        }
        catchInstances.length = j;
        fn = arguments[i];

        if (typeof fn !== "function") {
            throw new TypeError("The last argument to .catch() " +
                "must be a function, got " + util.toString(fn));
        }
        return this.then(undefined, catchFilter(catchInstances, fn, this));
    }
    return this.then(undefined, fn);
};

Promise.prototype.reflect = function () {
    return this._then(reflectHandler,
        reflectHandler, undefined, this, undefined);
};

Promise.prototype.then = function (didFulfill, didReject) {
    if (debug.warnings() && arguments.length > 0 &&
        typeof didFulfill !== "function" &&
        typeof didReject !== "function") {
        var msg = ".then() only accepts functions but was passed: " +
                util.classString(didFulfill);
        if (arguments.length > 1) {
            msg += ", " + util.classString(didReject);
        }
        this._warn(msg);
    }
    return this._then(didFulfill, didReject, undefined, undefined, undefined);
};

Promise.prototype.done = function (didFulfill, didReject) {
    var promise =
        this._then(didFulfill, didReject, undefined, undefined, undefined);
    promise._setIsFinal();
};

Promise.prototype.spread = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    return this.all()._then(fn, undefined, undefined, APPLY, undefined);
};

Promise.prototype.toJSON = function () {
    var ret = {
        isFulfilled: false,
        isRejected: false,
        fulfillmentValue: undefined,
        rejectionReason: undefined
    };
    if (this.isFulfilled()) {
        ret.fulfillmentValue = this.value();
        ret.isFulfilled = true;
    } else if (this.isRejected()) {
        ret.rejectionReason = this.reason();
        ret.isRejected = true;
    }
    return ret;
};

Promise.prototype.all = function () {
    if (arguments.length > 0) {
        this._warn(".all() was passed arguments but it does not take any");
    }
    return new PromiseArray(this).promise();
};

Promise.prototype.error = function (fn) {
    return this.caught(util.originatesFromRejection, fn);
};

Promise.getNewLibraryCopy = module.exports;

Promise.is = function (val) {
    return val instanceof Promise;
};

Promise.fromNode = Promise.fromCallback = function(fn) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs
                                         : false;
    var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));
    if (result === errorObj) {
        ret._rejectCallback(result.e, true);
    }
    if (!ret._isFateSealed()) ret._setAsyncGuaranteed();
    return ret;
};

Promise.all = function (promises) {
    return new PromiseArray(promises).promise();
};

Promise.cast = function (obj) {
    var ret = tryConvertToPromise(obj);
    if (!(ret instanceof Promise)) {
        ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._setFulfilled();
        ret._rejectionHandler0 = obj;
    }
    return ret;
};

Promise.resolve = Promise.fulfilled = Promise.cast;

Promise.reject = Promise.rejected = function (reason) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._rejectCallback(reason, true);
    return ret;
};

Promise.setScheduler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    return async.setScheduler(fn);
};

Promise.prototype._then = function (
    didFulfill,
    didReject,
    _,    receiver,
    internalData
) {
    var haveInternalData = internalData !== undefined;
    var promise = haveInternalData ? internalData : new Promise(INTERNAL);
    var target = this._target();
    var bitField = target._bitField;

    if (!haveInternalData) {
        promise._propagateFrom(this, 3);
        promise._captureStackTrace();
        if (receiver === undefined &&
            ((this._bitField & 2097152) !== 0)) {
            if (!((bitField & 50397184) === 0)) {
                receiver = this._boundValue();
            } else {
                receiver = target === this ? undefined : this._boundTo;
            }
        }
        this._fireEvent("promiseChained", this, promise);
    }

    var context = getContext();
    if (!((bitField & 50397184) === 0)) {
        var handler, value, settler = target._settlePromiseCtx;
        if (((bitField & 33554432) !== 0)) {
            value = target._rejectionHandler0;
            handler = didFulfill;
        } else if (((bitField & 16777216) !== 0)) {
            value = target._fulfillmentHandler0;
            handler = didReject;
            target._unsetRejectionIsUnhandled();
        } else {
            settler = target._settlePromiseLateCancellationObserver;
            value = new CancellationError("late cancellation observer");
            target._attachExtraTrace(value);
            handler = didReject;
        }

        async.invoke(settler, target, {
            handler: util.contextBind(context, handler),
            promise: promise,
            receiver: receiver,
            value: value
        });
    } else {
        target._addCallbacks(didFulfill, didReject, promise,
                receiver, context);
    }

    return promise;
};

Promise.prototype._length = function () {
    return this._bitField & 65535;
};

Promise.prototype._isFateSealed = function () {
    return (this._bitField & 117506048) !== 0;
};

Promise.prototype._isFollowing = function () {
    return (this._bitField & 67108864) === 67108864;
};

Promise.prototype._setLength = function (len) {
    this._bitField = (this._bitField & -65536) |
        (len & 65535);
};

Promise.prototype._setFulfilled = function () {
    this._bitField = this._bitField | 33554432;
    this._fireEvent("promiseFulfilled", this);
};

Promise.prototype._setRejected = function () {
    this._bitField = this._bitField | 16777216;
    this._fireEvent("promiseRejected", this);
};

Promise.prototype._setFollowing = function () {
    this._bitField = this._bitField | 67108864;
    this._fireEvent("promiseResolved", this);
};

Promise.prototype._setIsFinal = function () {
    this._bitField = this._bitField | 4194304;
};

Promise.prototype._isFinal = function () {
    return (this._bitField & 4194304) > 0;
};

Promise.prototype._unsetCancelled = function() {
    this._bitField = this._bitField & (~65536);
};

Promise.prototype._setCancelled = function() {
    this._bitField = this._bitField | 65536;
    this._fireEvent("promiseCancelled", this);
};

Promise.prototype._setWillBeCancelled = function() {
    this._bitField = this._bitField | 8388608;
};

Promise.prototype._setAsyncGuaranteed = function() {
    if (async.hasCustomScheduler()) return;
    var bitField = this._bitField;
    this._bitField = bitField |
        (((bitField & 536870912) >> 2) ^
        134217728);
};

Promise.prototype._setNoAsyncGuarantee = function() {
    this._bitField = (this._bitField | 536870912) &
        (~134217728);
};

Promise.prototype._receiverAt = function (index) {
    var ret = index === 0 ? this._receiver0 : this[
            index * 4 - 4 + 3];
    if (ret === UNDEFINED_BINDING) {
        return undefined;
    } else if (ret === undefined && this._isBound()) {
        return this._boundValue();
    }
    return ret;
};

Promise.prototype._promiseAt = function (index) {
    return this[
            index * 4 - 4 + 2];
};

Promise.prototype._fulfillmentHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 0];
};

Promise.prototype._rejectionHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 1];
};

Promise.prototype._boundValue = function() {};

Promise.prototype._migrateCallback0 = function (follower) {
    var bitField = follower._bitField;
    var fulfill = follower._fulfillmentHandler0;
    var reject = follower._rejectionHandler0;
    var promise = follower._promise0;
    var receiver = follower._receiverAt(0);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._migrateCallbackAt = function (follower, index) {
    var fulfill = follower._fulfillmentHandlerAt(index);
    var reject = follower._rejectionHandlerAt(index);
    var promise = follower._promiseAt(index);
    var receiver = follower._receiverAt(index);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._addCallbacks = function (
    fulfill,
    reject,
    promise,
    receiver,
    context
) {
    var index = this._length();

    if (index >= 65535 - 4) {
        index = 0;
        this._setLength(0);
    }

    if (index === 0) {
        this._promise0 = promise;
        this._receiver0 = receiver;
        if (typeof fulfill === "function") {
            this._fulfillmentHandler0 = util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this._rejectionHandler0 = util.contextBind(context, reject);
        }
    } else {
        var base = index * 4 - 4;
        this[base + 2] = promise;
        this[base + 3] = receiver;
        if (typeof fulfill === "function") {
            this[base + 0] =
                util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this[base + 1] =
                util.contextBind(context, reject);
        }
    }
    this._setLength(index + 1);
    return index;
};

Promise.prototype._proxy = function (proxyable, arg) {
    this._addCallbacks(undefined, undefined, arg, proxyable, null);
};

Promise.prototype._resolveCallback = function(value, shouldBind) {
    if (((this._bitField & 117506048) !== 0)) return;
    if (value === this)
        return this._rejectCallback(makeSelfResolutionError(), false);
    var maybePromise = tryConvertToPromise(value, this);
    if (!(maybePromise instanceof Promise)) return this._fulfill(value);

    if (shouldBind) this._propagateFrom(maybePromise, 2);


    var promise = maybePromise._target();

    if (promise === this) {
        this._reject(makeSelfResolutionError());
        return;
    }

    var bitField = promise._bitField;
    if (((bitField & 50397184) === 0)) {
        var len = this._length();
        if (len > 0) promise._migrateCallback0(this);
        for (var i = 1; i < len; ++i) {
            promise._migrateCallbackAt(this, i);
        }
        this._setFollowing();
        this._setLength(0);
        this._setFollowee(maybePromise);
    } else if (((bitField & 33554432) !== 0)) {
        this._fulfill(promise._value());
    } else if (((bitField & 16777216) !== 0)) {
        this._reject(promise._reason());
    } else {
        var reason = new CancellationError("late cancellation observer");
        promise._attachExtraTrace(reason);
        this._reject(reason);
    }
};

Promise.prototype._rejectCallback =
function(reason, synchronous, ignoreNonErrorWarnings) {
    var trace = util.ensureErrorObject(reason);
    var hasStack = trace === reason;
    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {
        var message = "a promise was rejected with a non-error: " +
            util.classString(reason);
        this._warn(message, true);
    }
    this._attachExtraTrace(trace, synchronous ? hasStack : false);
    this._reject(reason);
};

Promise.prototype._resolveFromExecutor = function (executor) {
    if (executor === INTERNAL) return;
    var promise = this;
    this._captureStackTrace();
    this._pushContext();
    var synchronous = true;
    var r = this._execute(executor, function(value) {
        promise._resolveCallback(value);
    }, function (reason) {
        promise._rejectCallback(reason, synchronous);
    });
    synchronous = false;
    this._popContext();

    if (r !== undefined) {
        promise._rejectCallback(r, true);
    }
};

Promise.prototype._settlePromiseFromHandler = function (
    handler, receiver, value, promise
) {
    var bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;
    promise._pushContext();
    var x;
    if (receiver === APPLY) {
        if (!value || typeof value.length !== "number") {
            x = errorObj;
            x.e = new TypeError("cannot .spread() a non-array: " +
                                    util.classString(value));
        } else {
            x = tryCatch(handler).apply(this._boundValue(), value);
        }
    } else {
        x = tryCatch(handler).call(receiver, value);
    }
    var promiseCreated = promise._popContext();
    bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;

    if (x === NEXT_FILTER) {
        promise._reject(value);
    } else if (x === errorObj) {
        promise._rejectCallback(x.e, false);
    } else {
        debug.checkForgottenReturns(x, promiseCreated, "",  promise, this);
        promise._resolveCallback(x);
    }
};

Promise.prototype._target = function() {
    var ret = this;
    while (ret._isFollowing()) ret = ret._followee();
    return ret;
};

Promise.prototype._followee = function() {
    return this._rejectionHandler0;
};

Promise.prototype._setFollowee = function(promise) {
    this._rejectionHandler0 = promise;
};

Promise.prototype._settlePromise = function(promise, handler, receiver, value) {
    var isPromise = promise instanceof Promise;
    var bitField = this._bitField;
    var asyncGuaranteed = ((bitField & 134217728) !== 0);
    if (((bitField & 65536) !== 0)) {
        if (isPromise) promise._invokeInternalOnCancel();

        if (receiver instanceof PassThroughHandlerContext &&
            receiver.isFinallyHandler()) {
            receiver.cancelPromise = promise;
            if (tryCatch(handler).call(receiver, value) === errorObj) {
                promise._reject(errorObj.e);
            }
        } else if (handler === reflectHandler) {
            promise._fulfill(reflectHandler.call(receiver));
        } else if (receiver instanceof Proxyable) {
            receiver._promiseCancelled(promise);
        } else if (isPromise || promise instanceof PromiseArray) {
            promise._cancel();
        } else {
            receiver.cancel();
        }
    } else if (typeof handler === "function") {
        if (!isPromise) {
            handler.call(receiver, value, promise);
        } else {
            if (asyncGuaranteed) promise._setAsyncGuaranteed();
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (receiver instanceof Proxyable) {
        if (!receiver._isResolved()) {
            if (((bitField & 33554432) !== 0)) {
                receiver._promiseFulfilled(value, promise);
            } else {
                receiver._promiseRejected(value, promise);
            }
        }
    } else if (isPromise) {
        if (asyncGuaranteed) promise._setAsyncGuaranteed();
        if (((bitField & 33554432) !== 0)) {
            promise._fulfill(value);
        } else {
            promise._reject(value);
        }
    }
};

Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) {
    var handler = ctx.handler;
    var promise = ctx.promise;
    var receiver = ctx.receiver;
    var value = ctx.value;
    if (typeof handler === "function") {
        if (!(promise instanceof Promise)) {
            handler.call(receiver, value, promise);
        } else {
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (promise instanceof Promise) {
        promise._reject(value);
    }
};

Promise.prototype._settlePromiseCtx = function(ctx) {
    this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);
};

Promise.prototype._settlePromise0 = function(handler, value, bitField) {
    var promise = this._promise0;
    var receiver = this._receiverAt(0);
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._settlePromise(promise, handler, receiver, value);
};

Promise.prototype._clearCallbackDataAtIndex = function(index) {
    var base = index * 4 - 4;
    this[base + 2] =
    this[base + 3] =
    this[base + 0] =
    this[base + 1] = undefined;
};

Promise.prototype._fulfill = function (value) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    if (value === this) {
        var err = makeSelfResolutionError();
        this._attachExtraTrace(err);
        return this._reject(err);
    }
    this._setFulfilled();
    this._rejectionHandler0 = value;

    if ((bitField & 65535) > 0) {
        if (((bitField & 134217728) !== 0)) {
            this._settlePromises();
        } else {
            async.settlePromises(this);
        }
        this._dereferenceTrace();
    }
};

Promise.prototype._reject = function (reason) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    this._setRejected();
    this._fulfillmentHandler0 = reason;

    if (this._isFinal()) {
        return async.fatalError(reason, util.isNode);
    }

    if ((bitField & 65535) > 0) {
        async.settlePromises(this);
    } else {
        this._ensurePossibleRejectionHandled();
    }
};

Promise.prototype._fulfillPromises = function (len, value) {
    for (var i = 1; i < len; i++) {
        var handler = this._fulfillmentHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, value);
    }
};

Promise.prototype._rejectPromises = function (len, reason) {
    for (var i = 1; i < len; i++) {
        var handler = this._rejectionHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, reason);
    }
};

Promise.prototype._settlePromises = function () {
    var bitField = this._bitField;
    var len = (bitField & 65535);

    if (len > 0) {
        if (((bitField & 16842752) !== 0)) {
            var reason = this._fulfillmentHandler0;
            this._settlePromise0(this._rejectionHandler0, reason, bitField);
            this._rejectPromises(len, reason);
        } else {
            var value = this._rejectionHandler0;
            this._settlePromise0(this._fulfillmentHandler0, value, bitField);
            this._fulfillPromises(len, value);
        }
        this._setLength(0);
    }
    this._clearCancellationData();
};

Promise.prototype._settledValue = function() {
    var bitField = this._bitField;
    if (((bitField & 33554432) !== 0)) {
        return this._rejectionHandler0;
    } else if (((bitField & 16777216) !== 0)) {
        return this._fulfillmentHandler0;
    }
};

if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
    es5.defineProperty(Promise.prototype, Symbol.toStringTag, {
        get: function () {
            return "Object";
        }
    });
}

function deferResolve(v) {this.promise._resolveCallback(v);}
function deferReject(v) {this.promise._rejectCallback(v, false);}

Promise.defer = Promise.pending = function() {
    debug.deprecated("Promise.defer", "new Promise");
    var promise = new Promise(INTERNAL);
    return {
        promise: promise,
        resolve: deferResolve,
        reject: deferReject
    };
};

util.notEnumerableProp(Promise,
                       "_makeSelfResolutionError",
                       makeSelfResolutionError);

require("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection,
    debug);
require("./bind")(Promise, INTERNAL, tryConvertToPromise, debug);
require("./cancel")(Promise, PromiseArray, apiRejection, debug);
require("./direct_resolve")(Promise);
require("./synchronous_inspection")(Promise);
require("./join")(
    Promise, PromiseArray, tryConvertToPromise, INTERNAL, async);
Promise.Promise = Promise;
Promise.version = "3.7.2";
require('./call_get.js')(Promise);
require('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);
require('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
require('./nodeify.js')(Promise);
require('./promisify.js')(Promise, INTERNAL);
require('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);
require('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);
require('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
require('./settle.js')(Promise, PromiseArray, debug);
require('./some.js')(Promise, PromiseArray, apiRejection);
require('./timers.js')(Promise, INTERNAL, debug);
require('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);
require('./any.js')(Promise);
require('./each.js')(Promise, INTERNAL);
require('./filter.js')(Promise, INTERNAL);
                                                         
    util.toFastProperties(Promise);                                          
    util.toFastProperties(Promise.prototype);                                
    function fillTypes(value) {                                              
        var p = new Promise(INTERNAL);                                       
        p._fulfillmentHandler0 = value;                                      
        p._rejectionHandler0 = value;                                        
        p._promise0 = value;                                                 
        p._receiver0 = value;                                                
    }                                                                        
    // Complete slack tracking, opt out of field-type tracking and           
    // stabilize map                                                         
    fillTypes({a: 1});                                                       
    fillTypes({b: 2});                                                       
    fillTypes({c: 3});                                                       
    fillTypes(1);                                                            
    fillTypes(function(){});                                                 
    fillTypes(undefined);                                                    
    fillTypes(false);                                                        
    fillTypes(new Promise(INTERNAL));                                        
    debug.setBounds(Async.firstLineError, util.lastLineError);               
    return Promise;                                                          

};
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise,
    apiRejection, Proxyable) {
var util = require("./util");
var isArray = util.isArray;

function toResolutionValue(val) {
    switch(val) {
    case -2: return [];
    case -3: return {};
    case -6: return new Map();
    }
}

function PromiseArray(values) {
    var promise = this._promise = new Promise(INTERNAL);
    if (values instanceof Promise) {
        promise._propagateFrom(values, 3);
        values.suppressUnhandledRejections();
    }
    promise._setOnCancel(this);
    this._values = values;
    this._length = 0;
    this._totalResolved = 0;
    this._init(undefined, -2);
}
util.inherits(PromiseArray, Proxyable);

PromiseArray.prototype.length = function () {
    return this._length;
};

PromiseArray.prototype.promise = function () {
    return this._promise;
};

PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {
    var values = tryConvertToPromise(this._values, this._promise);
    if (values instanceof Promise) {
        values = values._target();
        var bitField = values._bitField;
        ;
        this._values = values;

        if (((bitField & 50397184) === 0)) {
            this._promise._setAsyncGuaranteed();
            return values._then(
                init,
                this._reject,
                undefined,
                this,
                resolveValueIfEmpty
           );
        } else if (((bitField & 33554432) !== 0)) {
            values = values._value();
        } else if (((bitField & 16777216) !== 0)) {
            return this._reject(values._reason());
        } else {
            return this._cancel();
        }
    }
    values = util.asArray(values);
    if (values === null) {
        var err = apiRejection(
            "expecting an array or an iterable object but got " + util.classString(values)).reason();
        this._promise._rejectCallback(err, false);
        return;
    }

    if (values.length === 0) {
        if (resolveValueIfEmpty === -5) {
            this._resolveEmptyArray();
        }
        else {
            this._resolve(toResolutionValue(resolveValueIfEmpty));
        }
        return;
    }
    this._iterate(values);
};

PromiseArray.prototype._iterate = function(values) {
    var len = this.getActualLength(values.length);
    this._length = len;
    this._values = this.shouldCopyValues() ? new Array(len) : this._values;
    var result = this._promise;
    var isResolved = false;
    var bitField = null;
    for (var i = 0; i < len; ++i) {
        var maybePromise = tryConvertToPromise(values[i], result);

        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            bitField = maybePromise._bitField;
        } else {
            bitField = null;
        }

        if (isResolved) {
            if (bitField !== null) {
                maybePromise.suppressUnhandledRejections();
            }
        } else if (bitField !== null) {
            if (((bitField & 50397184) === 0)) {
                maybePromise._proxy(this, i);
                this._values[i] = maybePromise;
            } else if (((bitField & 33554432) !== 0)) {
                isResolved = this._promiseFulfilled(maybePromise._value(), i);
            } else if (((bitField & 16777216) !== 0)) {
                isResolved = this._promiseRejected(maybePromise._reason(), i);
            } else {
                isResolved = this._promiseCancelled(i);
            }
        } else {
            isResolved = this._promiseFulfilled(maybePromise, i);
        }
    }
    if (!isResolved) result._setAsyncGuaranteed();
};

PromiseArray.prototype._isResolved = function () {
    return this._values === null;
};

PromiseArray.prototype._resolve = function (value) {
    this._values = null;
    this._promise._fulfill(value);
};

PromiseArray.prototype._cancel = function() {
    if (this._isResolved() || !this._promise._isCancellable()) return;
    this._values = null;
    this._promise._cancel();
};

PromiseArray.prototype._reject = function (reason) {
    this._values = null;
    this._promise._rejectCallback(reason, false);
};

PromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

PromiseArray.prototype._promiseCancelled = function() {
    this._cancel();
    return true;
};

PromiseArray.prototype._promiseRejected = function (reason) {
    this._totalResolved++;
    this._reject(reason);
    return true;
};

PromiseArray.prototype._resultCancelled = function() {
    if (this._isResolved()) return;
    var values = this._values;
    this._cancel();
    if (values instanceof Promise) {
        values.cancel();
    } else {
        for (var i = 0; i < values.length; ++i) {
            if (values[i] instanceof Promise) {
                values[i].cancel();
            }
        }
    }
};

PromiseArray.prototype.shouldCopyValues = function () {
    return true;
};

PromiseArray.prototype.getActualLength = function (len) {
    return len;
};

return PromiseArray;
};
"use strict";
module.exports = function(Promise, INTERNAL) {
var THIS = {};
var util = require("./util");
var nodebackForPromise = require("./nodeback");
var withAppended = util.withAppended;
var maybeWrapAsError = util.maybeWrapAsError;
var canEvaluate = util.canEvaluate;
var TypeError = require("./errors").TypeError;
var defaultSuffix = "Async";
var defaultPromisified = {__isPromisified__: true};
var noCopyProps = [
    "arity",    "length",
    "name",
    "arguments",
    "caller",
    "callee",
    "prototype",
    "__isPromisified__"
];
var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$");

var defaultFilter = function(name) {
    return util.isIdentifier(name) &&
        name.charAt(0) !== "_" &&
        name !== "constructor";
};

function propsFilter(key) {
    return !noCopyPropsPattern.test(key);
}

function isPromisified(fn) {
    try {
        return fn.__isPromisified__ === true;
    }
    catch (e) {
        return false;
    }
}

function hasPromisified(obj, key, suffix) {
    var val = util.getDataPropertyOrDefault(obj, key + suffix,
                                            defaultPromisified);
    return val ? isPromisified(val) : false;
}
function checkValid(ret, suffix, suffixRegexp) {
    for (var i = 0; i < ret.length; i += 2) {
        var key = ret[i];
        if (suffixRegexp.test(key)) {
            var keyWithoutAsyncSuffix = key.replace(suffixRegexp, "");
            for (var j = 0; j < ret.length; j += 2) {
                if (ret[j] === keyWithoutAsyncSuffix) {
                    throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a    See http://goo.gl/MqrFmX\u000a"
                        .replace("%s", suffix));
                }
            }
        }
    }
}

function promisifiableMethods(obj, suffix, suffixRegexp, filter) {
    var keys = util.inheritedDataKeys(obj);
    var ret = [];
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var value = obj[key];
        var passesDefaultFilter = filter === defaultFilter
            ? true : defaultFilter(key, value, obj);
        if (typeof value === "function" &&
            !isPromisified(value) &&
            !hasPromisified(obj, key, suffix) &&
            filter(key, value, obj, passesDefaultFilter)) {
            ret.push(key, value);
        }
    }
    checkValid(ret, suffix, suffixRegexp);
    return ret;
}

var escapeIdentRegex = function(str) {
    return str.replace(/([$])/, "\\$");
};

var makeNodePromisifiedEval;
if (!false) {
var switchCaseArgumentOrder = function(likelyArgumentCount) {
    var ret = [likelyArgumentCount];
    var min = Math.max(0, likelyArgumentCount - 1 - 3);
    for(var i = likelyArgumentCount - 1; i >= min; --i) {
        ret.push(i);
    }
    for(var i = likelyArgumentCount + 1; i <= 3; ++i) {
        ret.push(i);
    }
    return ret;
};

var argumentSequence = function(argumentCount) {
    return util.filledRange(argumentCount, "_arg", "");
};

var parameterDeclaration = function(parameterCount) {
    return util.filledRange(
        Math.max(parameterCount, 3), "_arg", "");
};

var parameterCount = function(fn) {
    if (typeof fn.length === "number") {
        return Math.max(Math.min(fn.length, 1023 + 1), 0);
    }
    return 0;
};

makeNodePromisifiedEval =
function(callback, receiver, originalName, fn, _, multiArgs) {
    var newParameterCount = Math.max(0, parameterCount(fn) - 1);
    var argumentOrder = switchCaseArgumentOrder(newParameterCount);
    var shouldProxyThis = typeof callback === "string" || receiver === THIS;

    function generateCallForArgumentCount(count) {
        var args = argumentSequence(count).join(", ");
        var comma = count > 0 ? ", " : "";
        var ret;
        if (shouldProxyThis) {
            ret = "ret = callback.call(this, {{args}}, nodeback); break;\n";
        } else {
            ret = receiver === undefined
                ? "ret = callback({{args}}, nodeback); break;\n"
                : "ret = callback.call(receiver, {{args}}, nodeback); break;\n";
        }
        return ret.replace("{{args}}", args).replace(", ", comma);
    }

    function generateArgumentSwitchCase() {
        var ret = "";
        for (var i = 0; i < argumentOrder.length; ++i) {
            ret += "case " + argumentOrder[i] +":" +
                generateCallForArgumentCount(argumentOrder[i]);
        }

        ret += "                                                             \n\
        default:                                                             \n\
            var args = new Array(len + 1);                                   \n\
            var i = 0;                                                       \n\
            for (var i = 0; i < len; ++i) {                                  \n\
               args[i] = arguments[i];                                       \n\
            }                                                                \n\
            args[i] = nodeback;                                              \n\
            [CodeForCall]                                                    \n\
            break;                                                           \n\
        ".replace("[CodeForCall]", (shouldProxyThis
                                ? "ret = callback.apply(this, args);\n"
                                : "ret = callback.apply(receiver, args);\n"));
        return ret;
    }

    var getFunctionCode = typeof callback === "string"
                                ? ("this != null ? this['"+callback+"'] : fn")
                                : "fn";
    var body = "'use strict';                                                \n\
        var ret = function (Parameters) {                                    \n\
            'use strict';                                                    \n\
            var len = arguments.length;                                      \n\
            var promise = new Promise(INTERNAL);                             \n\
            promise._captureStackTrace();                                    \n\
            var nodeback = nodebackForPromise(promise, " + multiArgs + ");   \n\
            var ret;                                                         \n\
            var callback = tryCatch([GetFunctionCode]);                      \n\
            switch(len) {                                                    \n\
                [CodeForSwitchCase]                                          \n\
            }                                                                \n\
            if (ret === errorObj) {                                          \n\
                promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\
            }                                                                \n\
            if (!promise._isFateSealed()) promise._setAsyncGuaranteed();     \n\
            return promise;                                                  \n\
        };                                                                   \n\
        notEnumerableProp(ret, '__isPromisified__', true);                   \n\
        return ret;                                                          \n\
    ".replace("[CodeForSwitchCase]", generateArgumentSwitchCase())
        .replace("[GetFunctionCode]", getFunctionCode);
    body = body.replace("Parameters", parameterDeclaration(newParameterCount));
    return new Function("Promise",
                        "fn",
                        "receiver",
                        "withAppended",
                        "maybeWrapAsError",
                        "nodebackForPromise",
                        "tryCatch",
                        "errorObj",
                        "notEnumerableProp",
                        "INTERNAL",
                        body)(
                    Promise,
                    fn,
                    receiver,
                    withAppended,
                    maybeWrapAsError,
                    nodebackForPromise,
                    util.tryCatch,
                    util.errorObj,
                    util.notEnumerableProp,
                    INTERNAL);
};
}

function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) {
    var defaultThis = (function() {return this;})();
    var method = callback;
    if (typeof method === "string") {
        callback = fn;
    }
    function promisified() {
        var _receiver = receiver;
        if (receiver === THIS) _receiver = this;
        var promise = new Promise(INTERNAL);
        promise._captureStackTrace();
        var cb = typeof method === "string" && this !== defaultThis
            ? this[method] : callback;
        var fn = nodebackForPromise(promise, multiArgs);
        try {
            cb.apply(_receiver, withAppended(arguments, fn));
        } catch(e) {
            promise._rejectCallback(maybeWrapAsError(e), true, true);
        }
        if (!promise._isFateSealed()) promise._setAsyncGuaranteed();
        return promise;
    }
    util.notEnumerableProp(promisified, "__isPromisified__", true);
    return promisified;
}

var makeNodePromisified = canEvaluate
    ? makeNodePromisifiedEval
    : makeNodePromisifiedClosure;

function promisifyAll(obj, suffix, filter, promisifier, multiArgs) {
    var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$");
    var methods =
        promisifiableMethods(obj, suffix, suffixRegexp, filter);

    for (var i = 0, len = methods.length; i < len; i+= 2) {
        var key = methods[i];
        var fn = methods[i+1];
        var promisifiedKey = key + suffix;
        if (promisifier === makeNodePromisified) {
            obj[promisifiedKey] =
                makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);
        } else {
            var promisified = promisifier(fn, function() {
                return makeNodePromisified(key, THIS, key,
                                           fn, suffix, multiArgs);
            });
            util.notEnumerableProp(promisified, "__isPromisified__", true);
            obj[promisifiedKey] = promisified;
        }
    }
    util.toFastProperties(obj);
    return obj;
}

function promisify(callback, receiver, multiArgs) {
    return makeNodePromisified(callback, receiver, undefined,
                                callback, null, multiArgs);
}

Promise.promisify = function (fn, options) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    if (isPromisified(fn)) {
        return fn;
    }
    options = Object(options);
    var receiver = options.context === undefined ? THIS : options.context;
    var multiArgs = !!options.multiArgs;
    var ret = promisify(fn, receiver, multiArgs);
    util.copyDescriptors(fn, ret, propsFilter);
    return ret;
};

Promise.promisifyAll = function (target, options) {
    if (typeof target !== "function" && typeof target !== "object") {
        throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    options = Object(options);
    var multiArgs = !!options.multiArgs;
    var suffix = options.suffix;
    if (typeof suffix !== "string") suffix = defaultSuffix;
    var filter = options.filter;
    if (typeof filter !== "function") filter = defaultFilter;
    var promisifier = options.promisifier;
    if (typeof promisifier !== "function") promisifier = makeNodePromisified;

    if (!util.isIdentifier(suffix)) {
        throw new RangeError("suffix must be a valid identifier\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }

    var keys = util.inheritedDataKeys(target);
    for (var i = 0; i < keys.length; ++i) {
        var value = target[keys[i]];
        if (keys[i] !== "constructor" &&
            util.isClass(value)) {
            promisifyAll(value.prototype, suffix, filter, promisifier,
                multiArgs);
            promisifyAll(value, suffix, filter, promisifier, multiArgs);
        }
    }

    return promisifyAll(target, suffix, filter, promisifier, multiArgs);
};
};

"use strict";
module.exports = function(
    Promise, PromiseArray, tryConvertToPromise, apiRejection) {
var util = require("./util");
var isObject = util.isObject;
var es5 = require("./es5");
var Es6Map;
if (typeof Map === "function") Es6Map = Map;

var mapToEntries = (function() {
    var index = 0;
    var size = 0;

    function extractEntry(value, key) {
        this[index] = value;
        this[index + size] = key;
        index++;
    }

    return function mapToEntries(map) {
        size = map.size;
        index = 0;
        var ret = new Array(map.size * 2);
        map.forEach(extractEntry, ret);
        return ret;
    };
})();

var entriesToMap = function(entries) {
    var ret = new Es6Map();
    var length = entries.length / 2 | 0;
    for (var i = 0; i < length; ++i) {
        var key = entries[length + i];
        var value = entries[i];
        ret.set(key, value);
    }
    return ret;
};

function PropertiesPromiseArray(obj) {
    var isMap = false;
    var entries;
    if (Es6Map !== undefined && obj instanceof Es6Map) {
        entries = mapToEntries(obj);
        isMap = true;
    } else {
        var keys = es5.keys(obj);
        var len = keys.length;
        entries = new Array(len * 2);
        for (var i = 0; i < len; ++i) {
            var key = keys[i];
            entries[i] = obj[key];
            entries[i + len] = key;
        }
    }
    this.constructor$(entries);
    this._isMap = isMap;
    this._init$(undefined, isMap ? -6 : -3);
}
util.inherits(PropertiesPromiseArray, PromiseArray);

PropertiesPromiseArray.prototype._init = function () {};

PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        var val;
        if (this._isMap) {
            val = entriesToMap(this._values);
        } else {
            val = {};
            var keyOffset = this.length();
            for (var i = 0, len = this.length(); i < len; ++i) {
                val[this._values[i + keyOffset]] = this._values[i];
            }
        }
        this._resolve(val);
        return true;
    }
    return false;
};

PropertiesPromiseArray.prototype.shouldCopyValues = function () {
    return false;
};

PropertiesPromiseArray.prototype.getActualLength = function (len) {
    return len >> 1;
};

function props(promises) {
    var ret;
    var castValue = tryConvertToPromise(promises);

    if (!isObject(castValue)) {
        return apiRejection("cannot await properties of a non-object\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    } else if (castValue instanceof Promise) {
        ret = castValue._then(
            Promise.props, undefined, undefined, undefined, undefined);
    } else {
        ret = new PropertiesPromiseArray(castValue).promise();
    }

    if (castValue instanceof Promise) {
        ret._propagateFrom(castValue, 2);
    }
    return ret;
}

Promise.prototype.props = function () {
    return props(this);
};

Promise.props = function (promises) {
    return props(promises);
};
};
"use strict";
function arrayMove(src, srcIndex, dst, dstIndex, len) {
    for (var j = 0; j < len; ++j) {
        dst[j + dstIndex] = src[j + srcIndex];
        src[j + srcIndex] = void 0;
    }
}

function Queue(capacity) {
    this._capacity = capacity;
    this._length = 0;
    this._front = 0;
}

Queue.prototype._willBeOverCapacity = function (size) {
    return this._capacity < size;
};

Queue.prototype._pushOne = function (arg) {
    var length = this.length();
    this._checkCapacity(length + 1);
    var i = (this._front + length) & (this._capacity - 1);
    this[i] = arg;
    this._length = length + 1;
};

Queue.prototype.push = function (fn, receiver, arg) {
    var length = this.length() + 3;
    if (this._willBeOverCapacity(length)) {
        this._pushOne(fn);
        this._pushOne(receiver);
        this._pushOne(arg);
        return;
    }
    var j = this._front + length - 3;
    this._checkCapacity(length);
    var wrapMask = this._capacity - 1;
    this[(j + 0) & wrapMask] = fn;
    this[(j + 1) & wrapMask] = receiver;
    this[(j + 2) & wrapMask] = arg;
    this._length = length;
};

Queue.prototype.shift = function () {
    var front = this._front,
        ret = this[front];

    this[front] = undefined;
    this._front = (front + 1) & (this._capacity - 1);
    this._length--;
    return ret;
};

Queue.prototype.length = function () {
    return this._length;
};

Queue.prototype._checkCapacity = function (size) {
    if (this._capacity < size) {
        this._resizeTo(this._capacity << 1);
    }
};

Queue.prototype._resizeTo = function (capacity) {
    var oldCapacity = this._capacity;
    this._capacity = capacity;
    var front = this._front;
    var length = this._length;
    var moveItemsCount = (front + length) & (oldCapacity - 1);
    arrayMove(this, 0, this, oldCapacity, moveItemsCount);
};

module.exports = Queue;
"use strict";
module.exports = function(
    Promise, INTERNAL, tryConvertToPromise, apiRejection) {
var util = require("./util");

var raceLater = function (promise) {
    return promise.then(function(array) {
        return race(array, promise);
    });
};

function race(promises, parent) {
    var maybePromise = tryConvertToPromise(promises);

    if (maybePromise instanceof Promise) {
        return raceLater(maybePromise);
    } else {
        promises = util.asArray(promises);
        if (promises === null)
            return apiRejection("expecting an array or an iterable object but got " + util.classString(promises));
    }

    var ret = new Promise(INTERNAL);
    if (parent !== undefined) {
        ret._propagateFrom(parent, 3);
    }
    var fulfill = ret._fulfill;
    var reject = ret._reject;
    for (var i = 0, len = promises.length; i < len; ++i) {
        var val = promises[i];

        if (val === undefined && !(i in promises)) {
            continue;
        }

        Promise.cast(val)._then(fulfill, reject, undefined, ret, null);
    }
    return ret;
}

Promise.race = function (promises) {
    return race(promises, undefined);
};

Promise.prototype.race = function () {
    return race(this, undefined);
};

};
"use strict";
module.exports = function(Promise,
                          PromiseArray,
                          apiRejection,
                          tryConvertToPromise,
                          INTERNAL,
                          debug) {
var util = require("./util");
var tryCatch = util.tryCatch;

function ReductionPromiseArray(promises, fn, initialValue, _each) {
    this.constructor$(promises);
    var context = Promise._getContext();
    this._fn = util.contextBind(context, fn);
    if (initialValue !== undefined) {
        initialValue = Promise.resolve(initialValue);
        initialValue._attachCancellationCallback(this);
    }
    this._initialValue = initialValue;
    this._currentCancellable = null;
    if(_each === INTERNAL) {
        this._eachValues = Array(this._length);
    } else if (_each === 0) {
        this._eachValues = null;
    } else {
        this._eachValues = undefined;
    }
    this._promise._captureStackTrace();
    this._init$(undefined, -5);
}
util.inherits(ReductionPromiseArray, PromiseArray);

ReductionPromiseArray.prototype._gotAccum = function(accum) {
    if (this._eachValues !== undefined &&
        this._eachValues !== null &&
        accum !== INTERNAL) {
        this._eachValues.push(accum);
    }
};

ReductionPromiseArray.prototype._eachComplete = function(value) {
    if (this._eachValues !== null) {
        this._eachValues.push(value);
    }
    return this._eachValues;
};

ReductionPromiseArray.prototype._init = function() {};

ReductionPromiseArray.prototype._resolveEmptyArray = function() {
    this._resolve(this._eachValues !== undefined ? this._eachValues
                                                 : this._initialValue);
};

ReductionPromiseArray.prototype.shouldCopyValues = function () {
    return false;
};

ReductionPromiseArray.prototype._resolve = function(value) {
    this._promise._resolveCallback(value);
    this._values = null;
};

ReductionPromiseArray.prototype._resultCancelled = function(sender) {
    if (sender === this._initialValue) return this._cancel();
    if (this._isResolved()) return;
    this._resultCancelled$();
    if (this._currentCancellable instanceof Promise) {
        this._currentCancellable.cancel();
    }
    if (this._initialValue instanceof Promise) {
        this._initialValue.cancel();
    }
};

ReductionPromiseArray.prototype._iterate = function (values) {
    this._values = values;
    var value;
    var i;
    var length = values.length;
    if (this._initialValue !== undefined) {
        value = this._initialValue;
        i = 0;
    } else {
        value = Promise.resolve(values[0]);
        i = 1;
    }

    this._currentCancellable = value;

    for (var j = i; j < length; ++j) {
        var maybePromise = values[j];
        if (maybePromise instanceof Promise) {
            maybePromise.suppressUnhandledRejections();
        }
    }

    if (!value.isRejected()) {
        for (; i < length; ++i) {
            var ctx = {
                accum: null,
                value: values[i],
                index: i,
                length: length,
                array: this
            };

            value = value._then(gotAccum, undefined, undefined, ctx, undefined);

            if ((i & 127) === 0) {
                value._setNoAsyncGuarantee();
            }
        }
    }

    if (this._eachValues !== undefined) {
        value = value
            ._then(this._eachComplete, undefined, undefined, this, undefined);
    }
    value._then(completed, completed, undefined, value, this);
};

Promise.prototype.reduce = function (fn, initialValue) {
    return reduce(this, fn, initialValue, null);
};

Promise.reduce = function (promises, fn, initialValue, _each) {
    return reduce(promises, fn, initialValue, _each);
};

function completed(valueOrReason, array) {
    if (this.isFulfilled()) {
        array._resolve(valueOrReason);
    } else {
        array._reject(valueOrReason);
    }
}

function reduce(promises, fn, initialValue, _each) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var array = new ReductionPromiseArray(promises, fn, initialValue, _each);
    return array.promise();
}

function gotAccum(accum) {
    this.accum = accum;
    this.array._gotAccum(accum);
    var value = tryConvertToPromise(this.value, this.array._promise);
    if (value instanceof Promise) {
        this.array._currentCancellable = value;
        return value._then(gotValue, undefined, undefined, this, undefined);
    } else {
        return gotValue.call(this, value);
    }
}

function gotValue(value) {
    var array = this.array;
    var promise = array._promise;
    var fn = tryCatch(array._fn);
    promise._pushContext();
    var ret;
    if (array._eachValues !== undefined) {
        ret = fn.call(promise._boundValue(), value, this.index, this.length);
    } else {
        ret = fn.call(promise._boundValue(),
                              this.accum, value, this.index, this.length);
    }
    if (ret instanceof Promise) {
        array._currentCancellable = ret;
    }
    var promiseCreated = promise._popContext();
    debug.checkForgottenReturns(
        ret,
        promiseCreated,
        array._eachValues !== undefined ? "Promise.each" : "Promise.reduce",
        promise
    );
    return ret;
}
};
"use strict";
var util = require("./util");
var schedule;
var noAsyncScheduler = function() {
    throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var NativePromise = util.getNativePromise();
if (util.isNode && typeof MutationObserver === "undefined") {
    var GlobalSetImmediate = global.setImmediate;
    var ProcessNextTick = process.nextTick;
    schedule = util.isRecentNode
                ? function(fn) { GlobalSetImmediate.call(global, fn); }
                : function(fn) { ProcessNextTick.call(process, fn); };
} else if (typeof NativePromise === "function" &&
           typeof NativePromise.resolve === "function") {
    var nativePromise = NativePromise.resolve();
    schedule = function(fn) {
        nativePromise.then(fn);
    };
} else if ((typeof MutationObserver !== "undefined") &&
          !(typeof window !== "undefined" &&
            window.navigator &&
            (window.navigator.standalone || window.cordova)) &&
          ("classList" in document.documentElement)) {
    schedule = (function() {
        var div = document.createElement("div");
        var opts = {attributes: true};
        var toggleScheduled = false;
        var div2 = document.createElement("div");
        var o2 = new MutationObserver(function() {
            div.classList.toggle("foo");
            toggleScheduled = false;
        });
        o2.observe(div2, opts);

        var scheduleToggle = function() {
            if (toggleScheduled) return;
            toggleScheduled = true;
            div2.classList.toggle("foo");
        };

        return function schedule(fn) {
            var o = new MutationObserver(function() {
                o.disconnect();
                fn();
            });
            o.observe(div, opts);
            scheduleToggle();
        };
    })();
} else if (typeof setImmediate !== "undefined") {
    schedule = function (fn) {
        setImmediate(fn);
    };
} else if (typeof setTimeout !== "undefined") {
    schedule = function (fn) {
        setTimeout(fn, 0);
    };
} else {
    schedule = noAsyncScheduler;
}
module.exports = schedule;
"use strict";
module.exports =
    function(Promise, PromiseArray, debug) {
var PromiseInspection = Promise.PromiseInspection;
var util = require("./util");

function SettledPromiseArray(values) {
    this.constructor$(values);
}
util.inherits(SettledPromiseArray, PromiseArray);

SettledPromiseArray.prototype._promiseResolved = function (index, inspection) {
    this._values[index] = inspection;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

SettledPromiseArray.prototype._promiseFulfilled = function (value, index) {
    var ret = new PromiseInspection();
    ret._bitField = 33554432;
    ret._settledValueField = value;
    return this._promiseResolved(index, ret);
};
SettledPromiseArray.prototype._promiseRejected = function (reason, index) {
    var ret = new PromiseInspection();
    ret._bitField = 16777216;
    ret._settledValueField = reason;
    return this._promiseResolved(index, ret);
};

Promise.settle = function (promises) {
    debug.deprecated(".settle()", ".reflect()");
    return new SettledPromiseArray(promises).promise();
};

Promise.allSettled = function (promises) {
    return new SettledPromiseArray(promises).promise();
};

Promise.prototype.settle = function () {
    return Promise.settle(this);
};
};
"use strict";
module.exports =
function(Promise, PromiseArray, apiRejection) {
var util = require("./util");
var RangeError = require("./errors").RangeError;
var AggregateError = require("./errors").AggregateError;
var isArray = util.isArray;
var CANCELLATION = {};


function SomePromiseArray(values) {
    this.constructor$(values);
    this._howMany = 0;
    this._unwrap = false;
    this._initialized = false;
}
util.inherits(SomePromiseArray, PromiseArray);

SomePromiseArray.prototype._init = function () {
    if (!this._initialized) {
        return;
    }
    if (this._howMany === 0) {
        this._resolve([]);
        return;
    }
    this._init$(undefined, -5);
    var isArrayResolved = isArray(this._values);
    if (!this._isResolved() &&
        isArrayResolved &&
        this._howMany > this._canPossiblyFulfill()) {
        this._reject(this._getRangeError(this.length()));
    }
};

SomePromiseArray.prototype.init = function () {
    this._initialized = true;
    this._init();
};

SomePromiseArray.prototype.setUnwrap = function () {
    this._unwrap = true;
};

SomePromiseArray.prototype.howMany = function () {
    return this._howMany;
};

SomePromiseArray.prototype.setHowMany = function (count) {
    this._howMany = count;
};

SomePromiseArray.prototype._promiseFulfilled = function (value) {
    this._addFulfilled(value);
    if (this._fulfilled() === this.howMany()) {
        this._values.length = this.howMany();
        if (this.howMany() === 1 && this._unwrap) {
            this._resolve(this._values[0]);
        } else {
            this._resolve(this._values);
        }
        return true;
    }
    return false;

};
SomePromiseArray.prototype._promiseRejected = function (reason) {
    this._addRejected(reason);
    return this._checkOutcome();
};

SomePromiseArray.prototype._promiseCancelled = function () {
    if (this._values instanceof Promise || this._values == null) {
        return this._cancel();
    }
    this._addRejected(CANCELLATION);
    return this._checkOutcome();
};

SomePromiseArray.prototype._checkOutcome = function() {
    if (this.howMany() > this._canPossiblyFulfill()) {
        var e = new AggregateError();
        for (var i = this.length(); i < this._values.length; ++i) {
            if (this._values[i] !== CANCELLATION) {
                e.push(this._values[i]);
            }
        }
        if (e.length > 0) {
            this._reject(e);
        } else {
            this._cancel();
        }
        return true;
    }
    return false;
};

SomePromiseArray.prototype._fulfilled = function () {
    return this._totalResolved;
};

SomePromiseArray.prototype._rejected = function () {
    return this._values.length - this.length();
};

SomePromiseArray.prototype._addRejected = function (reason) {
    this._values.push(reason);
};

SomePromiseArray.prototype._addFulfilled = function (value) {
    this._values[this._totalResolved++] = value;
};

SomePromiseArray.prototype._canPossiblyFulfill = function () {
    return this.length() - this._rejected();
};

SomePromiseArray.prototype._getRangeError = function (count) {
    var message = "Input array must contain at least " +
            this._howMany + " items but contains only " + count + " items";
    return new RangeError(message);
};

SomePromiseArray.prototype._resolveEmptyArray = function () {
    this._reject(this._getRangeError(0));
};

function some(promises, howMany) {
    if ((howMany | 0) !== howMany || howMany < 0) {
        return apiRejection("expecting a positive integer\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var ret = new SomePromiseArray(promises);
    var promise = ret.promise();
    ret.setHowMany(howMany);
    ret.init();
    return promise;
}

Promise.some = function (promises, howMany) {
    return some(promises, howMany);
};

Promise.prototype.some = function (howMany) {
    return some(this, howMany);
};

Promise._SomePromiseArray = SomePromiseArray;
};
"use strict";
module.exports = function(Promise) {
function PromiseInspection(promise) {
    if (promise !== undefined) {
        promise = promise._target();
        this._bitField = promise._bitField;
        this._settledValueField = promise._isFateSealed()
            ? promise._settledValue() : undefined;
    }
    else {
        this._bitField = 0;
        this._settledValueField = undefined;
    }
}

PromiseInspection.prototype._settledValue = function() {
    return this._settledValueField;
};

var value = PromiseInspection.prototype.value = function () {
    if (!this.isFulfilled()) {
        throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var reason = PromiseInspection.prototype.error =
PromiseInspection.prototype.reason = function () {
    if (!this.isRejected()) {
        throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var isFulfilled = PromiseInspection.prototype.isFulfilled = function() {
    return (this._bitField & 33554432) !== 0;
};

var isRejected = PromiseInspection.prototype.isRejected = function () {
    return (this._bitField & 16777216) !== 0;
};

var isPending = PromiseInspection.prototype.isPending = function () {
    return (this._bitField & 50397184) === 0;
};

var isResolved = PromiseInspection.prototype.isResolved = function () {
    return (this._bitField & 50331648) !== 0;
};

PromiseInspection.prototype.isCancelled = function() {
    return (this._bitField & 8454144) !== 0;
};

Promise.prototype.__isCancelled = function() {
    return (this._bitField & 65536) === 65536;
};

Promise.prototype._isCancelled = function() {
    return this._target().__isCancelled();
};

Promise.prototype.isCancelled = function() {
    return (this._target()._bitField & 8454144) !== 0;
};

Promise.prototype.isPending = function() {
    return isPending.call(this._target());
};

Promise.prototype.isRejected = function() {
    return isRejected.call(this._target());
};

Promise.prototype.isFulfilled = function() {
    return isFulfilled.call(this._target());
};

Promise.prototype.isResolved = function() {
    return isResolved.call(this._target());
};

Promise.prototype.value = function() {
    return value.call(this._target());
};

Promise.prototype.reason = function() {
    var target = this._target();
    target._unsetRejectionIsUnhandled();
    return reason.call(target);
};

Promise.prototype._value = function() {
    return this._settledValue();
};

Promise.prototype._reason = function() {
    this._unsetRejectionIsUnhandled();
    return this._settledValue();
};

Promise.PromiseInspection = PromiseInspection;
};
"use strict";
module.exports = function(Promise, INTERNAL) {
var util = require("./util");
var errorObj = util.errorObj;
var isObject = util.isObject;

function tryConvertToPromise(obj, context) {
    if (isObject(obj)) {
        if (obj instanceof Promise) return obj;
        var then = getThen(obj);
        if (then === errorObj) {
            if (context) context._pushContext();
            var ret = Promise.reject(then.e);
            if (context) context._popContext();
            return ret;
        } else if (typeof then === "function") {
            if (isAnyBluebirdPromise(obj)) {
                var ret = new Promise(INTERNAL);
                obj._then(
                    ret._fulfill,
                    ret._reject,
                    undefined,
                    ret,
                    null
                );
                return ret;
            }
            return doThenable(obj, then, context);
        }
    }
    return obj;
}

function doGetThen(obj) {
    return obj.then;
}

function getThen(obj) {
    try {
        return doGetThen(obj);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}

var hasProp = {}.hasOwnProperty;
function isAnyBluebirdPromise(obj) {
    try {
        return hasProp.call(obj, "_promise0");
    } catch (e) {
        return false;
    }
}

function doThenable(x, then, context) {
    var promise = new Promise(INTERNAL);
    var ret = promise;
    if (context) context._pushContext();
    promise._captureStackTrace();
    if (context) context._popContext();
    var synchronous = true;
    var result = util.tryCatch(then).call(x, resolve, reject);
    synchronous = false;

    if (promise && result === errorObj) {
        promise._rejectCallback(result.e, true, true);
        promise = null;
    }

    function resolve(value) {
        if (!promise) return;
        promise._resolveCallback(value);
        promise = null;
    }

    function reject(reason) {
        if (!promise) return;
        promise._rejectCallback(reason, synchronous, true);
        promise = null;
    }
    return ret;
}

return tryConvertToPromise;
};
"use strict";
module.exports = function(Promise, INTERNAL, debug) {
var util = require("./util");
var TimeoutError = Promise.TimeoutError;

function HandleWrapper(handle)  {
    this.handle = handle;
}

HandleWrapper.prototype._resultCancelled = function() {
    clearTimeout(this.handle);
};

var afterValue = function(value) { return delay(+this).thenReturn(value); };
var delay = Promise.delay = function (ms, value) {
    var ret;
    var handle;
    if (value !== undefined) {
        ret = Promise.resolve(value)
                ._then(afterValue, null, null, ms, undefined);
        if (debug.cancellation() && value instanceof Promise) {
            ret._setOnCancel(value);
        }
    } else {
        ret = new Promise(INTERNAL);
        handle = setTimeout(function() { ret._fulfill(); }, +ms);
        if (debug.cancellation()) {
            ret._setOnCancel(new HandleWrapper(handle));
        }
        ret._captureStackTrace();
    }
    ret._setAsyncGuaranteed();
    return ret;
};

Promise.prototype.delay = function (ms) {
    return delay(ms, this);
};

var afterTimeout = function (promise, message, parent) {
    var err;
    if (typeof message !== "string") {
        if (message instanceof Error) {
            err = message;
        } else {
            err = new TimeoutError("operation timed out");
        }
    } else {
        err = new TimeoutError(message);
    }
    util.markAsOriginatingFromRejection(err);
    promise._attachExtraTrace(err);
    promise._reject(err);

    if (parent != null) {
        parent.cancel();
    }
};

function successClear(value) {
    clearTimeout(this.handle);
    return value;
}

function failureClear(reason) {
    clearTimeout(this.handle);
    throw reason;
}

Promise.prototype.timeout = function (ms, message) {
    ms = +ms;
    var ret, parent;

    var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {
        if (ret.isPending()) {
            afterTimeout(ret, message, parent);
        }
    }, ms));

    if (debug.cancellation()) {
        parent = this.then();
        ret = parent._then(successClear, failureClear,
                            undefined, handleWrapper, undefined);
        ret._setOnCancel(handleWrapper);
    } else {
        ret = this._then(successClear, failureClear,
                            undefined, handleWrapper, undefined);
    }

    return ret;
};

};
"use strict";
module.exports = function (Promise, apiRejection, tryConvertToPromise,
    createContext, INTERNAL, debug) {
    var util = require("./util");
    var TypeError = require("./errors").TypeError;
    var inherits = require("./util").inherits;
    var errorObj = util.errorObj;
    var tryCatch = util.tryCatch;
    var NULL = {};

    function thrower(e) {
        setTimeout(function(){throw e;}, 0);
    }

    function castPreservingDisposable(thenable) {
        var maybePromise = tryConvertToPromise(thenable);
        if (maybePromise !== thenable &&
            typeof thenable._isDisposable === "function" &&
            typeof thenable._getDisposer === "function" &&
            thenable._isDisposable()) {
            maybePromise._setDisposable(thenable._getDisposer());
        }
        return maybePromise;
    }
    function dispose(resources, inspection) {
        var i = 0;
        var len = resources.length;
        var ret = new Promise(INTERNAL);
        function iterator() {
            if (i >= len) return ret._fulfill();
            var maybePromise = castPreservingDisposable(resources[i++]);
            if (maybePromise instanceof Promise &&
                maybePromise._isDisposable()) {
                try {
                    maybePromise = tryConvertToPromise(
                        maybePromise._getDisposer().tryDispose(inspection),
                        resources.promise);
                } catch (e) {
                    return thrower(e);
                }
                if (maybePromise instanceof Promise) {
                    return maybePromise._then(iterator, thrower,
                                              null, null, null);
                }
            }
            iterator();
        }
        iterator();
        return ret;
    }

    function Disposer(data, promise, context) {
        this._data = data;
        this._promise = promise;
        this._context = context;
    }

    Disposer.prototype.data = function () {
        return this._data;
    };

    Disposer.prototype.promise = function () {
        return this._promise;
    };

    Disposer.prototype.resource = function () {
        if (this.promise().isFulfilled()) {
            return this.promise().value();
        }
        return NULL;
    };

    Disposer.prototype.tryDispose = function(inspection) {
        var resource = this.resource();
        var context = this._context;
        if (context !== undefined) context._pushContext();
        var ret = resource !== NULL
            ? this.doDispose(resource, inspection) : null;
        if (context !== undefined) context._popContext();
        this._promise._unsetDisposable();
        this._data = null;
        return ret;
    };

    Disposer.isDisposer = function (d) {
        return (d != null &&
                typeof d.resource === "function" &&
                typeof d.tryDispose === "function");
    };

    function FunctionDisposer(fn, promise, context) {
        this.constructor$(fn, promise, context);
    }
    inherits(FunctionDisposer, Disposer);

    FunctionDisposer.prototype.doDispose = function (resource, inspection) {
        var fn = this.data();
        return fn.call(resource, resource, inspection);
    };

    function maybeUnwrapDisposer(value) {
        if (Disposer.isDisposer(value)) {
            this.resources[this.index]._setDisposable(value);
            return value.promise();
        }
        return value;
    }

    function ResourceList(length) {
        this.length = length;
        this.promise = null;
        this[length-1] = null;
    }

    ResourceList.prototype._resultCancelled = function() {
        var len = this.length;
        for (var i = 0; i < len; ++i) {
            var item = this[i];
            if (item instanceof Promise) {
                item.cancel();
            }
        }
    };

    Promise.using = function () {
        var len = arguments.length;
        if (len < 2) return apiRejection(
                        "you must pass at least 2 arguments to Promise.using");
        var fn = arguments[len - 1];
        if (typeof fn !== "function") {
            return apiRejection("expecting a function but got " + util.classString(fn));
        }
        var input;
        var spreadArgs = true;
        if (len === 2 && Array.isArray(arguments[0])) {
            input = arguments[0];
            len = input.length;
            spreadArgs = false;
        } else {
            input = arguments;
            len--;
        }
        var resources = new ResourceList(len);
        for (var i = 0; i < len; ++i) {
            var resource = input[i];
            if (Disposer.isDisposer(resource)) {
                var disposer = resource;
                resource = resource.promise();
                resource._setDisposable(disposer);
            } else {
                var maybePromise = tryConvertToPromise(resource);
                if (maybePromise instanceof Promise) {
                    resource =
                        maybePromise._then(maybeUnwrapDisposer, null, null, {
                            resources: resources,
                            index: i
                    }, undefined);
                }
            }
            resources[i] = resource;
        }

        var reflectedResources = new Array(resources.length);
        for (var i = 0; i < reflectedResources.length; ++i) {
            reflectedResources[i] = Promise.resolve(resources[i]).reflect();
        }

        var resultPromise = Promise.all(reflectedResources)
            .then(function(inspections) {
                for (var i = 0; i < inspections.length; ++i) {
                    var inspection = inspections[i];
                    if (inspection.isRejected()) {
                        errorObj.e = inspection.error();
                        return errorObj;
                    } else if (!inspection.isFulfilled()) {
                        resultPromise.cancel();
                        return;
                    }
                    inspections[i] = inspection.value();
                }
                promise._pushContext();

                fn = tryCatch(fn);
                var ret = spreadArgs
                    ? fn.apply(undefined, inspections) : fn(inspections);
                var promiseCreated = promise._popContext();
                debug.checkForgottenReturns(
                    ret, promiseCreated, "Promise.using", promise);
                return ret;
            });

        var promise = resultPromise.lastly(function() {
            var inspection = new Promise.PromiseInspection(resultPromise);
            return dispose(resources, inspection);
        });
        resources.promise = promise;
        promise._setOnCancel(resources);
        return promise;
    };

    Promise.prototype._setDisposable = function (disposer) {
        this._bitField = this._bitField | 131072;
        this._disposer = disposer;
    };

    Promise.prototype._isDisposable = function () {
        return (this._bitField & 131072) > 0;
    };

    Promise.prototype._getDisposer = function () {
        return this._disposer;
    };

    Promise.prototype._unsetDisposable = function () {
        this._bitField = this._bitField & (~131072);
        this._disposer = undefined;
    };

    Promise.prototype.disposer = function (fn) {
        if (typeof fn === "function") {
            return new FunctionDisposer(fn, this, createContext());
        }
        throw new TypeError();
    };

};
"use strict";
var es5 = require("./es5");
var canEvaluate = typeof navigator == "undefined";

var errorObj = {e: {}};
var tryCatchTarget;
var globalObject = typeof self !== "undefined" ? self :
    typeof window !== "undefined" ? window :
    typeof global !== "undefined" ? global :
    this !== undefined ? this : null;

function tryCatcher() {
    try {
        var target = tryCatchTarget;
        tryCatchTarget = null;
        return target.apply(this, arguments);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}
function tryCatch(fn) {
    tryCatchTarget = fn;
    return tryCatcher;
}

var inherits = function(Child, Parent) {
    var hasProp = {}.hasOwnProperty;

    function T() {
        this.constructor = Child;
        this.constructor$ = Parent;
        for (var propertyName in Parent.prototype) {
            if (hasProp.call(Parent.prototype, propertyName) &&
                propertyName.charAt(propertyName.length-1) !== "$"
           ) {
                this[propertyName + "$"] = Parent.prototype[propertyName];
            }
        }
    }
    T.prototype = Parent.prototype;
    Child.prototype = new T();
    return Child.prototype;
};


function isPrimitive(val) {
    return val == null || val === true || val === false ||
        typeof val === "string" || typeof val === "number";

}

function isObject(value) {
    return typeof value === "function" ||
           typeof value === "object" && value !== null;
}

function maybeWrapAsError(maybeError) {
    if (!isPrimitive(maybeError)) return maybeError;

    return new Error(safeToString(maybeError));
}

function withAppended(target, appendee) {
    var len = target.length;
    var ret = new Array(len + 1);
    var i;
    for (i = 0; i < len; ++i) {
        ret[i] = target[i];
    }
    ret[i] = appendee;
    return ret;
}

function getDataPropertyOrDefault(obj, key, defaultValue) {
    if (es5.isES5) {
        var desc = Object.getOwnPropertyDescriptor(obj, key);

        if (desc != null) {
            return desc.get == null && desc.set == null
                    ? desc.value
                    : defaultValue;
        }
    } else {
        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;
    }
}

function notEnumerableProp(obj, name, value) {
    if (isPrimitive(obj)) return obj;
    var descriptor = {
        value: value,
        configurable: true,
        enumerable: false,
        writable: true
    };
    es5.defineProperty(obj, name, descriptor);
    return obj;
}

function thrower(r) {
    throw r;
}

var inheritedDataKeys = (function() {
    var excludedPrototypes = [
        Array.prototype,
        Object.prototype,
        Function.prototype
    ];

    var isExcludedProto = function(val) {
        for (var i = 0; i < excludedPrototypes.length; ++i) {
            if (excludedPrototypes[i] === val) {
                return true;
            }
        }
        return false;
    };

    if (es5.isES5) {
        var getKeys = Object.getOwnPropertyNames;
        return function(obj) {
            var ret = [];
            var visitedKeys = Object.create(null);
            while (obj != null && !isExcludedProto(obj)) {
                var keys;
                try {
                    keys = getKeys(obj);
                } catch (e) {
                    return ret;
                }
                for (var i = 0; i < keys.length; ++i) {
                    var key = keys[i];
                    if (visitedKeys[key]) continue;
                    visitedKeys[key] = true;
                    var desc = Object.getOwnPropertyDescriptor(obj, key);
                    if (desc != null && desc.get == null && desc.set == null) {
                        ret.push(key);
                    }
                }
                obj = es5.getPrototypeOf(obj);
            }
            return ret;
        };
    } else {
        var hasProp = {}.hasOwnProperty;
        return function(obj) {
            if (isExcludedProto(obj)) return [];
            var ret = [];

            /*jshint forin:false */
            enumeration: for (var key in obj) {
                if (hasProp.call(obj, key)) {
                    ret.push(key);
                } else {
                    for (var i = 0; i < excludedPrototypes.length; ++i) {
                        if (hasProp.call(excludedPrototypes[i], key)) {
                            continue enumeration;
                        }
                    }
                    ret.push(key);
                }
            }
            return ret;
        };
    }

})();

var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/;
function isClass(fn) {
    try {
        if (typeof fn === "function") {
            var keys = es5.names(fn.prototype);

            var hasMethods = es5.isES5 && keys.length > 1;
            var hasMethodsOtherThanConstructor = keys.length > 0 &&
                !(keys.length === 1 && keys[0] === "constructor");
            var hasThisAssignmentAndStaticMethods =
                thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0;

            if (hasMethods || hasMethodsOtherThanConstructor ||
                hasThisAssignmentAndStaticMethods) {
                return true;
            }
        }
        return false;
    } catch (e) {
        return false;
    }
}

function toFastProperties(obj) {
    /*jshint -W027,-W055,-W031*/
    function FakeConstructor() {}
    FakeConstructor.prototype = obj;
    var receiver = new FakeConstructor();
    function ic() {
        return typeof receiver.foo;
    }
    ic();
    ic();
    return obj;
    eval(obj);
}

var rident = /^[a-z$_][a-z$_0-9]*$/i;
function isIdentifier(str) {
    return rident.test(str);
}

function filledRange(count, prefix, suffix) {
    var ret = new Array(count);
    for(var i = 0; i < count; ++i) {
        ret[i] = prefix + i + suffix;
    }
    return ret;
}

function safeToString(obj) {
    try {
        return obj + "";
    } catch (e) {
        return "[no string representation]";
    }
}

function isError(obj) {
    return obj instanceof Error ||
        (obj !== null &&
           typeof obj === "object" &&
           typeof obj.message === "string" &&
           typeof obj.name === "string");
}

function markAsOriginatingFromRejection(e) {
    try {
        notEnumerableProp(e, "isOperational", true);
    }
    catch(ignore) {}
}

function originatesFromRejection(e) {
    if (e == null) return false;
    return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) ||
        e["isOperational"] === true);
}

function canAttachTrace(obj) {
    return isError(obj) && es5.propertyIsWritable(obj, "stack");
}

var ensureErrorObject = (function() {
    if (!("stack" in new Error())) {
        return function(value) {
            if (canAttachTrace(value)) return value;
            try {throw new Error(safeToString(value));}
            catch(err) {return err;}
        };
    } else {
        return function(value) {
            if (canAttachTrace(value)) return value;
            return new Error(safeToString(value));
        };
    }
})();

function classString(obj) {
    return {}.toString.call(obj);
}

function copyDescriptors(from, to, filter) {
    var keys = es5.names(from);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        if (filter(key)) {
            try {
                es5.defineProperty(to, key, es5.getDescriptor(from, key));
            } catch (ignore) {}
        }
    }
}

var asArray = function(v) {
    if (es5.isArray(v)) {
        return v;
    }
    return null;
};

if (typeof Symbol !== "undefined" && Symbol.iterator) {
    var ArrayFrom = typeof Array.from === "function" ? function(v) {
        return Array.from(v);
    } : function(v) {
        var ret = [];
        var it = v[Symbol.iterator]();
        var itResult;
        while (!((itResult = it.next()).done)) {
            ret.push(itResult.value);
        }
        return ret;
    };

    asArray = function(v) {
        if (es5.isArray(v)) {
            return v;
        } else if (v != null && typeof v[Symbol.iterator] === "function") {
            return ArrayFrom(v);
        }
        return null;
    };
}

var isNode = typeof process !== "undefined" &&
        classString(process).toLowerCase() === "[object process]";

var hasEnvVariables = typeof process !== "undefined" &&
    typeof process.env !== "undefined";

function env(key) {
    return hasEnvVariables ? process.env[key] : undefined;
}

function getNativePromise() {
    if (typeof Promise === "function") {
        try {
            var promise = new Promise(function(){});
            if (classString(promise) === "[object Promise]") {
                return Promise;
            }
        } catch (e) {}
    }
}

var reflectHandler;
function contextBind(ctx, cb) {
    if (ctx === null ||
        typeof cb !== "function" ||
        cb === reflectHandler) {
        return cb;
    }

    if (ctx.domain !== null) {
        cb = ctx.domain.bind(cb);
    }

    var async = ctx.async;
    if (async !== null) {
        var old = cb;
        cb = function() {
            var $_len = arguments.length + 2;var args = new Array($_len); for(var $_i = 2; $_i < $_len ; ++$_i) {args[$_i] = arguments[$_i  - 2];};
            args[0] = old;
            args[1] = this;
            return async.runInAsyncScope.apply(async, args);
        };
    }
    return cb;
}

var ret = {
    setReflectHandler: function(fn) {
        reflectHandler = fn;
    },
    isClass: isClass,
    isIdentifier: isIdentifier,
    inheritedDataKeys: inheritedDataKeys,
    getDataPropertyOrDefault: getDataPropertyOrDefault,
    thrower: thrower,
    isArray: es5.isArray,
    asArray: asArray,
    notEnumerableProp: notEnumerableProp,
    isPrimitive: isPrimitive,
    isObject: isObject,
    isError: isError,
    canEvaluate: canEvaluate,
    errorObj: errorObj,
    tryCatch: tryCatch,
    inherits: inherits,
    withAppended: withAppended,
    maybeWrapAsError: maybeWrapAsError,
    toFastProperties: toFastProperties,
    filledRange: filledRange,
    toString: safeToString,
    canAttachTrace: canAttachTrace,
    ensureErrorObject: ensureErrorObject,
    originatesFromRejection: originatesFromRejection,
    markAsOriginatingFromRejection: markAsOriginatingFromRejection,
    classString: classString,
    copyDescriptors: copyDescriptors,
    isNode: isNode,
    hasEnvVariables: hasEnvVariables,
    env: env,
    global: globalObject,
    getNativePromise: getNativePromise,
    contextBind: contextBind
};
ret.isRecentNode = ret.isNode && (function() {
    var version;
    if (process.versions && process.versions.node) {
        version = process.versions.node.split(".").map(Number);
    } else if (process.version) {
        version = process.version.split(".").map(Number);
    }
    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);
})();
ret.nodeSupportsAsyncResource = ret.isNode && (function() {
    var supportsAsync = false;
    try {
        var res = require("async_hooks").AsyncResource;
        supportsAsync = typeof res.prototype.runInAsyncScope === "function";
    } catch (e) {
        supportsAsync = false;
    }
    return supportsAsync;
})();

if (ret.isNode) ret.toFastProperties(process);

try {throw new Error(); } catch (e) {ret.lastLineError = e;}
module.exports = ret;
/* @preserve
 * The MIT License (MIT)
 * 
 * Copyright (c) 2013-2018 Petka Antonov
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * 
 */
/**
 * bluebird build version 3.7.2
 * Features enabled: core
 * Features disabled: race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Promise=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
"use strict";
var firstLineError;
try {throw new Error(); } catch (e) {firstLineError = e;}
var schedule = _dereq_("./schedule");
var Queue = _dereq_("./queue");

function Async() {
    this._customScheduler = false;
    this._isTickUsed = false;
    this._lateQueue = new Queue(16);
    this._normalQueue = new Queue(16);
    this._haveDrainedQueues = false;
    var self = this;
    this.drainQueues = function () {
        self._drainQueues();
    };
    this._schedule = schedule;
}

Async.prototype.setScheduler = function(fn) {
    var prev = this._schedule;
    this._schedule = fn;
    this._customScheduler = true;
    return prev;
};

Async.prototype.hasCustomScheduler = function() {
    return this._customScheduler;
};

Async.prototype.haveItemsQueued = function () {
    return this._isTickUsed || this._haveDrainedQueues;
};


Async.prototype.fatalError = function(e, isNode) {
    if (isNode) {
        process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) +
            "\n");
        process.exit(2);
    } else {
        this.throwLater(e);
    }
};

Async.prototype.throwLater = function(fn, arg) {
    if (arguments.length === 1) {
        arg = fn;
        fn = function () { throw arg; };
    }
    if (typeof setTimeout !== "undefined") {
        setTimeout(function() {
            fn(arg);
        }, 0);
    } else try {
        this._schedule(function() {
            fn(arg);
        });
    } catch (e) {
        throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
};

function AsyncInvokeLater(fn, receiver, arg) {
    this._lateQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncInvoke(fn, receiver, arg) {
    this._normalQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncSettlePromises(promise) {
    this._normalQueue._pushOne(promise);
    this._queueTick();
}

Async.prototype.invokeLater = AsyncInvokeLater;
Async.prototype.invoke = AsyncInvoke;
Async.prototype.settlePromises = AsyncSettlePromises;


function _drainQueue(queue) {
    while (queue.length() > 0) {
        _drainQueueStep(queue);
    }
}

function _drainQueueStep(queue) {
    var fn = queue.shift();
    if (typeof fn !== "function") {
        fn._settlePromises();
    } else {
        var receiver = queue.shift();
        var arg = queue.shift();
        fn.call(receiver, arg);
    }
}

Async.prototype._drainQueues = function () {
    _drainQueue(this._normalQueue);
    this._reset();
    this._haveDrainedQueues = true;
    _drainQueue(this._lateQueue);
};

Async.prototype._queueTick = function () {
    if (!this._isTickUsed) {
        this._isTickUsed = true;
        this._schedule(this.drainQueues);
    }
};

Async.prototype._reset = function () {
    this._isTickUsed = false;
};

module.exports = Async;
module.exports.firstLineError = firstLineError;

},{"./queue":17,"./schedule":18}],2:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {
var calledBind = false;
var rejectThis = function(_, e) {
    this._reject(e);
};

var targetRejected = function(e, context) {
    context.promiseRejectionQueued = true;
    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
};

var bindingResolved = function(thisArg, context) {
    if (((this._bitField & 50397184) === 0)) {
        this._resolveCallback(context.target);
    }
};

var bindingRejected = function(e, context) {
    if (!context.promiseRejectionQueued) this._reject(e);
};

Promise.prototype.bind = function (thisArg) {
    if (!calledBind) {
        calledBind = true;
        Promise.prototype._propagateFrom = debug.propagateFromFunction();
        Promise.prototype._boundValue = debug.boundValueFunction();
    }
    var maybePromise = tryConvertToPromise(thisArg);
    var ret = new Promise(INTERNAL);
    ret._propagateFrom(this, 1);
    var target = this._target();
    ret._setBoundTo(maybePromise);
    if (maybePromise instanceof Promise) {
        var context = {
            promiseRejectionQueued: false,
            promise: ret,
            target: target,
            bindingPromise: maybePromise
        };
        target._then(INTERNAL, targetRejected, undefined, ret, context);
        maybePromise._then(
            bindingResolved, bindingRejected, undefined, ret, context);
        ret._setOnCancel(maybePromise);
    } else {
        ret._resolveCallback(target);
    }
    return ret;
};

Promise.prototype._setBoundTo = function (obj) {
    if (obj !== undefined) {
        this._bitField = this._bitField | 2097152;
        this._boundTo = obj;
    } else {
        this._bitField = this._bitField & (~2097152);
    }
};

Promise.prototype._isBound = function () {
    return (this._bitField & 2097152) === 2097152;
};

Promise.bind = function (thisArg, value) {
    return Promise.resolve(value).bind(thisArg);
};
};

},{}],3:[function(_dereq_,module,exports){
"use strict";
var old;
if (typeof Promise !== "undefined") old = Promise;
function noConflict() {
    try { if (Promise === bluebird) Promise = old; }
    catch (e) {}
    return bluebird;
}
var bluebird = _dereq_("./promise")();
bluebird.noConflict = noConflict;
module.exports = bluebird;

},{"./promise":15}],4:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, PromiseArray, apiRejection, debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

Promise.prototype["break"] = Promise.prototype.cancel = function() {
    if (!debug.cancellation()) return this._warn("cancellation is disabled");

    var promise = this;
    var child = promise;
    while (promise._isCancellable()) {
        if (!promise._cancelBy(child)) {
            if (child._isFollowing()) {
                child._followee().cancel();
            } else {
                child._cancelBranched();
            }
            break;
        }

        var parent = promise._cancellationParent;
        if (parent == null || !parent._isCancellable()) {
            if (promise._isFollowing()) {
                promise._followee().cancel();
            } else {
                promise._cancelBranched();
            }
            break;
        } else {
            if (promise._isFollowing()) promise._followee().cancel();
            promise._setWillBeCancelled();
            child = promise;
            promise = parent;
        }
    }
};

Promise.prototype._branchHasCancelled = function() {
    this._branchesRemainingToCancel--;
};

Promise.prototype._enoughBranchesHaveCancelled = function() {
    return this._branchesRemainingToCancel === undefined ||
           this._branchesRemainingToCancel <= 0;
};

Promise.prototype._cancelBy = function(canceller) {
    if (canceller === this) {
        this._branchesRemainingToCancel = 0;
        this._invokeOnCancel();
        return true;
    } else {
        this._branchHasCancelled();
        if (this._enoughBranchesHaveCancelled()) {
            this._invokeOnCancel();
            return true;
        }
    }
    return false;
};

Promise.prototype._cancelBranched = function() {
    if (this._enoughBranchesHaveCancelled()) {
        this._cancel();
    }
};

Promise.prototype._cancel = function() {
    if (!this._isCancellable()) return;
    this._setCancelled();
    async.invoke(this._cancelPromises, this, undefined);
};

Promise.prototype._cancelPromises = function() {
    if (this._length() > 0) this._settlePromises();
};

Promise.prototype._unsetOnCancel = function() {
    this._onCancelField = undefined;
};

Promise.prototype._isCancellable = function() {
    return this.isPending() && !this._isCancelled();
};

Promise.prototype.isCancellable = function() {
    return this.isPending() && !this.isCancelled();
};

Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {
    if (util.isArray(onCancelCallback)) {
        for (var i = 0; i < onCancelCallback.length; ++i) {
            this._doInvokeOnCancel(onCancelCallback[i], internalOnly);
        }
    } else if (onCancelCallback !== undefined) {
        if (typeof onCancelCallback === "function") {
            if (!internalOnly) {
                var e = tryCatch(onCancelCallback).call(this._boundValue());
                if (e === errorObj) {
                    this._attachExtraTrace(e.e);
                    async.throwLater(e.e);
                }
            }
        } else {
            onCancelCallback._resultCancelled(this);
        }
    }
};

Promise.prototype._invokeOnCancel = function() {
    var onCancelCallback = this._onCancel();
    this._unsetOnCancel();
    async.invoke(this._doInvokeOnCancel, this, onCancelCallback);
};

Promise.prototype._invokeInternalOnCancel = function() {
    if (this._isCancellable()) {
        this._doInvokeOnCancel(this._onCancel(), true);
        this._unsetOnCancel();
    }
};

Promise.prototype._resultCancelled = function() {
    this.cancel();
};

};

},{"./util":21}],5:[function(_dereq_,module,exports){
"use strict";
module.exports = function(NEXT_FILTER) {
var util = _dereq_("./util");
var getKeys = _dereq_("./es5").keys;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function catchFilter(instances, cb, promise) {
    return function(e) {
        var boundTo = promise._boundValue();
        predicateLoop: for (var i = 0; i < instances.length; ++i) {
            var item = instances[i];

            if (item === Error ||
                (item != null && item.prototype instanceof Error)) {
                if (e instanceof item) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (typeof item === "function") {
                var matchesPredicate = tryCatch(item).call(boundTo, e);
                if (matchesPredicate === errorObj) {
                    return matchesPredicate;
                } else if (matchesPredicate) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (util.isObject(e)) {
                var keys = getKeys(item);
                for (var j = 0; j < keys.length; ++j) {
                    var key = keys[j];
                    if (item[key] != e[key]) {
                        continue predicateLoop;
                    }
                }
                return tryCatch(cb).call(boundTo, e);
            }
        }
        return NEXT_FILTER;
    };
}

return catchFilter;
};

},{"./es5":10,"./util":21}],6:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
var longStackTraces = false;
var contextStack = [];

Promise.prototype._promiseCreated = function() {};
Promise.prototype._pushContext = function() {};
Promise.prototype._popContext = function() {return null;};
Promise._peekContext = Promise.prototype._peekContext = function() {};

function Context() {
    this._trace = new Context.CapturedTrace(peekContext());
}
Context.prototype._pushContext = function () {
    if (this._trace !== undefined) {
        this._trace._promiseCreated = null;
        contextStack.push(this._trace);
    }
};

Context.prototype._popContext = function () {
    if (this._trace !== undefined) {
        var trace = contextStack.pop();
        var ret = trace._promiseCreated;
        trace._promiseCreated = null;
        return ret;
    }
    return null;
};

function createContext() {
    if (longStackTraces) return new Context();
}

function peekContext() {
    var lastIndex = contextStack.length - 1;
    if (lastIndex >= 0) {
        return contextStack[lastIndex];
    }
    return undefined;
}
Context.CapturedTrace = null;
Context.create = createContext;
Context.deactivateLongStackTraces = function() {};
Context.activateLongStackTraces = function() {
    var Promise_pushContext = Promise.prototype._pushContext;
    var Promise_popContext = Promise.prototype._popContext;
    var Promise_PeekContext = Promise._peekContext;
    var Promise_peekContext = Promise.prototype._peekContext;
    var Promise_promiseCreated = Promise.prototype._promiseCreated;
    Context.deactivateLongStackTraces = function() {
        Promise.prototype._pushContext = Promise_pushContext;
        Promise.prototype._popContext = Promise_popContext;
        Promise._peekContext = Promise_PeekContext;
        Promise.prototype._peekContext = Promise_peekContext;
        Promise.prototype._promiseCreated = Promise_promiseCreated;
        longStackTraces = false;
    };
    longStackTraces = true;
    Promise.prototype._pushContext = Context.prototype._pushContext;
    Promise.prototype._popContext = Context.prototype._popContext;
    Promise._peekContext = Promise.prototype._peekContext = peekContext;
    Promise.prototype._promiseCreated = function() {
        var ctx = this._peekContext();
        if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;
    };
};
return Context;
};

},{}],7:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, Context,
    enableAsyncHooks, disableAsyncHooks) {
var async = Promise._async;
var Warning = _dereq_("./errors").Warning;
var util = _dereq_("./util");
var es5 = _dereq_("./es5");
var canAttachTrace = util.canAttachTrace;
var unhandledRejectionHandled;
var possiblyUnhandledRejection;
var bluebirdFramePattern =
    /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/;
var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/;
var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/;
var stackFramePattern = null;
var formatStack = null;
var indentStackFrames = false;
var printWarning;
var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 &&
                        (true ||
                         util.env("BLUEBIRD_DEBUG") ||
                         util.env("NODE_ENV") === "development"));

var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 &&
    (debugging || util.env("BLUEBIRD_WARNINGS")));

var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 &&
    (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));

var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 &&
    (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));

var deferUnhandledRejectionCheck;
(function() {
    var promises = [];

    function unhandledRejectionCheck() {
        for (var i = 0; i < promises.length; ++i) {
            promises[i]._notifyUnhandledRejection();
        }
        unhandledRejectionClear();
    }

    function unhandledRejectionClear() {
        promises.length = 0;
    }

    deferUnhandledRejectionCheck = function(promise) {
        promises.push(promise);
        setTimeout(unhandledRejectionCheck, 1);
    };

    es5.defineProperty(Promise, "_unhandledRejectionCheck", {
        value: unhandledRejectionCheck
    });
    es5.defineProperty(Promise, "_unhandledRejectionClear", {
        value: unhandledRejectionClear
    });
})();

Promise.prototype.suppressUnhandledRejections = function() {
    var target = this._target();
    target._bitField = ((target._bitField & (~1048576)) |
                      524288);
};

Promise.prototype._ensurePossibleRejectionHandled = function () {
    if ((this._bitField & 524288) !== 0) return;
    this._setRejectionIsUnhandled();
    deferUnhandledRejectionCheck(this);
};

Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
    fireRejectionEvent("rejectionHandled",
                                  unhandledRejectionHandled, undefined, this);
};

Promise.prototype._setReturnedNonUndefined = function() {
    this._bitField = this._bitField | 268435456;
};

Promise.prototype._returnedNonUndefined = function() {
    return (this._bitField & 268435456) !== 0;
};

Promise.prototype._notifyUnhandledRejection = function () {
    if (this._isRejectionUnhandled()) {
        var reason = this._settledValue();
        this._setUnhandledRejectionIsNotified();
        fireRejectionEvent("unhandledRejection",
                                      possiblyUnhandledRejection, reason, this);
    }
};

Promise.prototype._setUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField | 262144;
};

Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField & (~262144);
};

Promise.prototype._isUnhandledRejectionNotified = function () {
    return (this._bitField & 262144) > 0;
};

Promise.prototype._setRejectionIsUnhandled = function () {
    this._bitField = this._bitField | 1048576;
};

Promise.prototype._unsetRejectionIsUnhandled = function () {
    this._bitField = this._bitField & (~1048576);
    if (this._isUnhandledRejectionNotified()) {
        this._unsetUnhandledRejectionIsNotified();
        this._notifyUnhandledRejectionIsHandled();
    }
};

Promise.prototype._isRejectionUnhandled = function () {
    return (this._bitField & 1048576) > 0;
};

Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) {
    return warn(message, shouldUseOwnTrace, promise || this);
};

Promise.onPossiblyUnhandledRejection = function (fn) {
    var context = Promise._getContext();
    possiblyUnhandledRejection = util.contextBind(context, fn);
};

Promise.onUnhandledRejectionHandled = function (fn) {
    var context = Promise._getContext();
    unhandledRejectionHandled = util.contextBind(context, fn);
};

var disableLongStackTraces = function() {};
Promise.longStackTraces = function () {
    if (async.haveItemsQueued() && !config.longStackTraces) {
        throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (!config.longStackTraces && longStackTracesIsSupported()) {
        var Promise_captureStackTrace = Promise.prototype._captureStackTrace;
        var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;
        var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace;
        config.longStackTraces = true;
        disableLongStackTraces = function() {
            if (async.haveItemsQueued() && !config.longStackTraces) {
                throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
            }
            Promise.prototype._captureStackTrace = Promise_captureStackTrace;
            Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;
            Promise.prototype._dereferenceTrace = Promise_dereferenceTrace;
            Context.deactivateLongStackTraces();
            config.longStackTraces = false;
        };
        Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;
        Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;
        Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace;
        Context.activateLongStackTraces();
    }
};

Promise.hasLongStackTraces = function () {
    return config.longStackTraces && longStackTracesIsSupported();
};


var legacyHandlers = {
    unhandledrejection: {
        before: function() {
            var ret = util.global.onunhandledrejection;
            util.global.onunhandledrejection = null;
            return ret;
        },
        after: function(fn) {
            util.global.onunhandledrejection = fn;
        }
    },
    rejectionhandled: {
        before: function() {
            var ret = util.global.onrejectionhandled;
            util.global.onrejectionhandled = null;
            return ret;
        },
        after: function(fn) {
            util.global.onrejectionhandled = fn;
        }
    }
};

var fireDomEvent = (function() {
    var dispatch = function(legacy, e) {
        if (legacy) {
            var fn;
            try {
                fn = legacy.before();
                return !util.global.dispatchEvent(e);
            } finally {
                legacy.after(fn);
            }
        } else {
            return !util.global.dispatchEvent(e);
        }
    };
    try {
        if (typeof CustomEvent === "function") {
            var event = new CustomEvent("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var eventData = {
                    detail: event,
                    cancelable: true
                };
                var domEvent = new CustomEvent(name, eventData);
                es5.defineProperty(
                    domEvent, "promise", {value: event.promise});
                es5.defineProperty(
                    domEvent, "reason", {value: event.reason});

                return dispatch(legacyHandlers[name], domEvent);
            };
        } else if (typeof Event === "function") {
            var event = new Event("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = new Event(name, {
                    cancelable: true
                });
                domEvent.detail = event;
                es5.defineProperty(domEvent, "promise", {value: event.promise});
                es5.defineProperty(domEvent, "reason", {value: event.reason});
                return dispatch(legacyHandlers[name], domEvent);
            };
        } else {
            var event = document.createEvent("CustomEvent");
            event.initCustomEvent("testingtheevent", false, true, {});
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = document.createEvent("CustomEvent");
                domEvent.initCustomEvent(name, false, true,
                    event);
                return dispatch(legacyHandlers[name], domEvent);
            };
        }
    } catch (e) {}
    return function() {
        return false;
    };
})();

var fireGlobalEvent = (function() {
    if (util.isNode) {
        return function() {
            return process.emit.apply(process, arguments);
        };
    } else {
        if (!util.global) {
            return function() {
                return false;
            };
        }
        return function(name) {
            var methodName = "on" + name.toLowerCase();
            var method = util.global[methodName];
            if (!method) return false;
            method.apply(util.global, [].slice.call(arguments, 1));
            return true;
        };
    }
})();

function generatePromiseLifecycleEventObject(name, promise) {
    return {promise: promise};
}

var eventToObjectGenerator = {
    promiseCreated: generatePromiseLifecycleEventObject,
    promiseFulfilled: generatePromiseLifecycleEventObject,
    promiseRejected: generatePromiseLifecycleEventObject,
    promiseResolved: generatePromiseLifecycleEventObject,
    promiseCancelled: generatePromiseLifecycleEventObject,
    promiseChained: function(name, promise, child) {
        return {promise: promise, child: child};
    },
    warning: function(name, warning) {
        return {warning: warning};
    },
    unhandledRejection: function (name, reason, promise) {
        return {reason: reason, promise: promise};
    },
    rejectionHandled: generatePromiseLifecycleEventObject
};

var activeFireEvent = function (name) {
    var globalEventFired = false;
    try {
        globalEventFired = fireGlobalEvent.apply(null, arguments);
    } catch (e) {
        async.throwLater(e);
        globalEventFired = true;
    }

    var domEventFired = false;
    try {
        domEventFired = fireDomEvent(name,
                    eventToObjectGenerator[name].apply(null, arguments));
    } catch (e) {
        async.throwLater(e);
        domEventFired = true;
    }

    return domEventFired || globalEventFired;
};

Promise.config = function(opts) {
    opts = Object(opts);
    if ("longStackTraces" in opts) {
        if (opts.longStackTraces) {
            Promise.longStackTraces();
        } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
            disableLongStackTraces();
        }
    }
    if ("warnings" in opts) {
        var warningsOption = opts.warnings;
        config.warnings = !!warningsOption;
        wForgottenReturn = config.warnings;

        if (util.isObject(warningsOption)) {
            if ("wForgottenReturn" in warningsOption) {
                wForgottenReturn = !!warningsOption.wForgottenReturn;
            }
        }
    }
    if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
        if (async.haveItemsQueued()) {
            throw new Error(
                "cannot enable cancellation after promises are in use");
        }
        Promise.prototype._clearCancellationData =
            cancellationClearCancellationData;
        Promise.prototype._propagateFrom = cancellationPropagateFrom;
        Promise.prototype._onCancel = cancellationOnCancel;
        Promise.prototype._setOnCancel = cancellationSetOnCancel;
        Promise.prototype._attachCancellationCallback =
            cancellationAttachCancellationCallback;
        Promise.prototype._execute = cancellationExecute;
        propagateFromFunction = cancellationPropagateFrom;
        config.cancellation = true;
    }
    if ("monitoring" in opts) {
        if (opts.monitoring && !config.monitoring) {
            config.monitoring = true;
            Promise.prototype._fireEvent = activeFireEvent;
        } else if (!opts.monitoring && config.monitoring) {
            config.monitoring = false;
            Promise.prototype._fireEvent = defaultFireEvent;
        }
    }
    if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) {
        var prev = config.asyncHooks;
        var cur = !!opts.asyncHooks;
        if (prev !== cur) {
            config.asyncHooks = cur;
            if (cur) {
                enableAsyncHooks();
            } else {
                disableAsyncHooks();
            }
        }
    }
    return Promise;
};

function defaultFireEvent() { return false; }

Promise.prototype._fireEvent = defaultFireEvent;
Promise.prototype._execute = function(executor, resolve, reject) {
    try {
        executor(resolve, reject);
    } catch (e) {
        return e;
    }
};
Promise.prototype._onCancel = function () {};
Promise.prototype._setOnCancel = function (handler) { ; };
Promise.prototype._attachCancellationCallback = function(onCancel) {
    ;
};
Promise.prototype._captureStackTrace = function () {};
Promise.prototype._attachExtraTrace = function () {};
Promise.prototype._dereferenceTrace = function () {};
Promise.prototype._clearCancellationData = function() {};
Promise.prototype._propagateFrom = function (parent, flags) {
    ;
    ;
};

function cancellationExecute(executor, resolve, reject) {
    var promise = this;
    try {
        executor(resolve, reject, function(onCancel) {
            if (typeof onCancel !== "function") {
                throw new TypeError("onCancel must be a function, got: " +
                                    util.toString(onCancel));
            }
            promise._attachCancellationCallback(onCancel);
        });
    } catch (e) {
        return e;
    }
}

function cancellationAttachCancellationCallback(onCancel) {
    if (!this._isCancellable()) return this;

    var previousOnCancel = this._onCancel();
    if (previousOnCancel !== undefined) {
        if (util.isArray(previousOnCancel)) {
            previousOnCancel.push(onCancel);
        } else {
            this._setOnCancel([previousOnCancel, onCancel]);
        }
    } else {
        this._setOnCancel(onCancel);
    }
}

function cancellationOnCancel() {
    return this._onCancelField;
}

function cancellationSetOnCancel(onCancel) {
    this._onCancelField = onCancel;
}

function cancellationClearCancellationData() {
    this._cancellationParent = undefined;
    this._onCancelField = undefined;
}

function cancellationPropagateFrom(parent, flags) {
    if ((flags & 1) !== 0) {
        this._cancellationParent = parent;
        var branchesRemainingToCancel = parent._branchesRemainingToCancel;
        if (branchesRemainingToCancel === undefined) {
            branchesRemainingToCancel = 0;
        }
        parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;
    }
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}

function bindingPropagateFrom(parent, flags) {
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}
var propagateFromFunction = bindingPropagateFrom;

function boundValueFunction() {
    var ret = this._boundTo;
    if (ret !== undefined) {
        if (ret instanceof Promise) {
            if (ret.isFulfilled()) {
                return ret.value();
            } else {
                return undefined;
            }
        }
    }
    return ret;
}

function longStackTracesCaptureStackTrace() {
    this._trace = new CapturedTrace(this._peekContext());
}

function longStackTracesAttachExtraTrace(error, ignoreSelf) {
    if (canAttachTrace(error)) {
        var trace = this._trace;
        if (trace !== undefined) {
            if (ignoreSelf) trace = trace._parent;
        }
        if (trace !== undefined) {
            trace.attachExtraTrace(error);
        } else if (!error.__stackCleaned__) {
            var parsed = parseStackAndMessage(error);
            util.notEnumerableProp(error, "stack",
                parsed.message + "\n" + parsed.stack.join("\n"));
            util.notEnumerableProp(error, "__stackCleaned__", true);
        }
    }
}

function longStackTracesDereferenceTrace() {
    this._trace = undefined;
}

function checkForgottenReturns(returnValue, promiseCreated, name, promise,
                               parent) {
    if (returnValue === undefined && promiseCreated !== null &&
        wForgottenReturn) {
        if (parent !== undefined && parent._returnedNonUndefined()) return;
        if ((promise._bitField & 65535) === 0) return;

        if (name) name = name + " ";
        var handlerLine = "";
        var creatorLine = "";
        if (promiseCreated._trace) {
            var traceLines = promiseCreated._trace.stack.split("\n");
            var stack = cleanStack(traceLines);
            for (var i = stack.length - 1; i >= 0; --i) {
                var line = stack[i];
                if (!nodeFramePattern.test(line)) {
                    var lineMatches = line.match(parseLinePattern);
                    if (lineMatches) {
                        handlerLine  = "at " + lineMatches[1] +
                            ":" + lineMatches[2] + ":" + lineMatches[3] + " ";
                    }
                    break;
                }
            }

            if (stack.length > 0) {
                var firstUserLine = stack[0];
                for (var i = 0; i < traceLines.length; ++i) {

                    if (traceLines[i] === firstUserLine) {
                        if (i > 0) {
                            creatorLine = "\n" + traceLines[i - 1];
                        }
                        break;
                    }
                }

            }
        }
        var msg = "a promise was created in a " + name +
            "handler " + handlerLine + "but was not returned from it, " +
            "see http://goo.gl/rRqMUw" +
            creatorLine;
        promise._warn(msg, true, promiseCreated);
    }
}

function deprecated(name, replacement) {
    var message = name +
        " is deprecated and will be removed in a future version.";
    if (replacement) message += " Use " + replacement + " instead.";
    return warn(message);
}

function warn(message, shouldUseOwnTrace, promise) {
    if (!config.warnings) return;
    var warning = new Warning(message);
    var ctx;
    if (shouldUseOwnTrace) {
        promise._attachExtraTrace(warning);
    } else if (config.longStackTraces && (ctx = Promise._peekContext())) {
        ctx.attachExtraTrace(warning);
    } else {
        var parsed = parseStackAndMessage(warning);
        warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
    }

    if (!activeFireEvent("warning", warning)) {
        formatAndLogError(warning, "", true);
    }
}

function reconstructStack(message, stacks) {
    for (var i = 0; i < stacks.length - 1; ++i) {
        stacks[i].push("From previous event:");
        stacks[i] = stacks[i].join("\n");
    }
    if (i < stacks.length) {
        stacks[i] = stacks[i].join("\n");
    }
    return message + "\n" + stacks.join("\n");
}

function removeDuplicateOrEmptyJumps(stacks) {
    for (var i = 0; i < stacks.length; ++i) {
        if (stacks[i].length === 0 ||
            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {
            stacks.splice(i, 1);
            i--;
        }
    }
}

function removeCommonRoots(stacks) {
    var current = stacks[0];
    for (var i = 1; i < stacks.length; ++i) {
        var prev = stacks[i];
        var currentLastIndex = current.length - 1;
        var currentLastLine = current[currentLastIndex];
        var commonRootMeetPoint = -1;

        for (var j = prev.length - 1; j >= 0; --j) {
            if (prev[j] === currentLastLine) {
                commonRootMeetPoint = j;
                break;
            }
        }

        for (var j = commonRootMeetPoint; j >= 0; --j) {
            var line = prev[j];
            if (current[currentLastIndex] === line) {
                current.pop();
                currentLastIndex--;
            } else {
                break;
            }
        }
        current = prev;
    }
}

function cleanStack(stack) {
    var ret = [];
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        var isTraceLine = "    (No stack trace)" === line ||
            stackFramePattern.test(line);
        var isInternalFrame = isTraceLine && shouldIgnore(line);
        if (isTraceLine && !isInternalFrame) {
            if (indentStackFrames && line.charAt(0) !== " ") {
                line = "    " + line;
            }
            ret.push(line);
        }
    }
    return ret;
}

function stackFramesAsArray(error) {
    var stack = error.stack.replace(/\s+$/g, "").split("\n");
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        if ("    (No stack trace)" === line || stackFramePattern.test(line)) {
            break;
        }
    }
    if (i > 0 && error.name != "SyntaxError") {
        stack = stack.slice(i);
    }
    return stack;
}

function parseStackAndMessage(error) {
    var stack = error.stack;
    var message = error.toString();
    stack = typeof stack === "string" && stack.length > 0
                ? stackFramesAsArray(error) : ["    (No stack trace)"];
    return {
        message: message,
        stack: error.name == "SyntaxError" ? stack : cleanStack(stack)
    };
}

function formatAndLogError(error, title, isSoft) {
    if (typeof console !== "undefined") {
        var message;
        if (util.isObject(error)) {
            var stack = error.stack;
            message = title + formatStack(stack, error);
        } else {
            message = title + String(error);
        }
        if (typeof printWarning === "function") {
            printWarning(message, isSoft);
        } else if (typeof console.log === "function" ||
            typeof console.log === "object") {
            console.log(message);
        }
    }
}

function fireRejectionEvent(name, localHandler, reason, promise) {
    var localEventFired = false;
    try {
        if (typeof localHandler === "function") {
            localEventFired = true;
            if (name === "rejectionHandled") {
                localHandler(promise);
            } else {
                localHandler(reason, promise);
            }
        }
    } catch (e) {
        async.throwLater(e);
    }

    if (name === "unhandledRejection") {
        if (!activeFireEvent(name, reason, promise) && !localEventFired) {
            formatAndLogError(reason, "Unhandled rejection ");
        }
    } else {
        activeFireEvent(name, promise);
    }
}

function formatNonError(obj) {
    var str;
    if (typeof obj === "function") {
        str = "[function " +
            (obj.name || "anonymous") +
            "]";
    } else {
        str = obj && typeof obj.toString === "function"
            ? obj.toString() : util.toString(obj);
        var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
        if (ruselessToString.test(str)) {
            try {
                var newStr = JSON.stringify(obj);
                str = newStr;
            }
            catch(e) {

            }
        }
        if (str.length === 0) {
            str = "(empty array)";
        }
    }
    return ("(<" + snip(str) + ">, no stack trace)");
}

function snip(str) {
    var maxChars = 41;
    if (str.length < maxChars) {
        return str;
    }
    return str.substr(0, maxChars - 3) + "...";
}

function longStackTracesIsSupported() {
    return typeof captureStackTrace === "function";
}

var shouldIgnore = function() { return false; };
var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
function parseLineInfo(line) {
    var matches = line.match(parseLineInfoRegex);
    if (matches) {
        return {
            fileName: matches[1],
            line: parseInt(matches[2], 10)
        };
    }
}

function setBounds(firstLineError, lastLineError) {
    if (!longStackTracesIsSupported()) return;
    var firstStackLines = (firstLineError.stack || "").split("\n");
    var lastStackLines = (lastLineError.stack || "").split("\n");
    var firstIndex = -1;
    var lastIndex = -1;
    var firstFileName;
    var lastFileName;
    for (var i = 0; i < firstStackLines.length; ++i) {
        var result = parseLineInfo(firstStackLines[i]);
        if (result) {
            firstFileName = result.fileName;
            firstIndex = result.line;
            break;
        }
    }
    for (var i = 0; i < lastStackLines.length; ++i) {
        var result = parseLineInfo(lastStackLines[i]);
        if (result) {
            lastFileName = result.fileName;
            lastIndex = result.line;
            break;
        }
    }
    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||
        firstFileName !== lastFileName || firstIndex >= lastIndex) {
        return;
    }

    shouldIgnore = function(line) {
        if (bluebirdFramePattern.test(line)) return true;
        var info = parseLineInfo(line);
        if (info) {
            if (info.fileName === firstFileName &&
                (firstIndex <= info.line && info.line <= lastIndex)) {
                return true;
            }
        }
        return false;
    };
}

function CapturedTrace(parent) {
    this._parent = parent;
    this._promisesCreated = 0;
    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
    captureStackTrace(this, CapturedTrace);
    if (length > 32) this.uncycle();
}
util.inherits(CapturedTrace, Error);
Context.CapturedTrace = CapturedTrace;

CapturedTrace.prototype.uncycle = function() {
    var length = this._length;
    if (length < 2) return;
    var nodes = [];
    var stackToIndex = {};

    for (var i = 0, node = this; node !== undefined; ++i) {
        nodes.push(node);
        node = node._parent;
    }
    length = this._length = i;
    for (var i = length - 1; i >= 0; --i) {
        var stack = nodes[i].stack;
        if (stackToIndex[stack] === undefined) {
            stackToIndex[stack] = i;
        }
    }
    for (var i = 0; i < length; ++i) {
        var currentStack = nodes[i].stack;
        var index = stackToIndex[currentStack];
        if (index !== undefined && index !== i) {
            if (index > 0) {
                nodes[index - 1]._parent = undefined;
                nodes[index - 1]._length = 1;
            }
            nodes[i]._parent = undefined;
            nodes[i]._length = 1;
            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;

            if (index < length - 1) {
                cycleEdgeNode._parent = nodes[index + 1];
                cycleEdgeNode._parent.uncycle();
                cycleEdgeNode._length =
                    cycleEdgeNode._parent._length + 1;
            } else {
                cycleEdgeNode._parent = undefined;
                cycleEdgeNode._length = 1;
            }
            var currentChildLength = cycleEdgeNode._length + 1;
            for (var j = i - 2; j >= 0; --j) {
                nodes[j]._length = currentChildLength;
                currentChildLength++;
            }
            return;
        }
    }
};

CapturedTrace.prototype.attachExtraTrace = function(error) {
    if (error.__stackCleaned__) return;
    this.uncycle();
    var parsed = parseStackAndMessage(error);
    var message = parsed.message;
    var stacks = [parsed.stack];

    var trace = this;
    while (trace !== undefined) {
        stacks.push(cleanStack(trace.stack.split("\n")));
        trace = trace._parent;
    }
    removeCommonRoots(stacks);
    removeDuplicateOrEmptyJumps(stacks);
    util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
    util.notEnumerableProp(error, "__stackCleaned__", true);
};

var captureStackTrace = (function stackDetection() {
    var v8stackFramePattern = /^\s*at\s*/;
    var v8stackFormatter = function(stack, error) {
        if (typeof stack === "string") return stack;

        if (error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    if (typeof Error.stackTraceLimit === "number" &&
        typeof Error.captureStackTrace === "function") {
        Error.stackTraceLimit += 6;
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        var captureStackTrace = Error.captureStackTrace;

        shouldIgnore = function(line) {
            return bluebirdFramePattern.test(line);
        };
        return function(receiver, ignoreUntil) {
            Error.stackTraceLimit += 6;
            captureStackTrace(receiver, ignoreUntil);
            Error.stackTraceLimit -= 6;
        };
    }
    var err = new Error();

    if (typeof err.stack === "string" &&
        err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
        stackFramePattern = /@/;
        formatStack = v8stackFormatter;
        indentStackFrames = true;
        return function captureStackTrace(o) {
            o.stack = new Error().stack;
        };
    }

    var hasStackAfterThrow;
    try { throw new Error(); }
    catch(e) {
        hasStackAfterThrow = ("stack" in e);
    }
    if (!("stack" in err) && hasStackAfterThrow &&
        typeof Error.stackTraceLimit === "number") {
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        return function captureStackTrace(o) {
            Error.stackTraceLimit += 6;
            try { throw new Error(); }
            catch(e) { o.stack = e.stack; }
            Error.stackTraceLimit -= 6;
        };
    }

    formatStack = function(stack, error) {
        if (typeof stack === "string") return stack;

        if ((typeof error === "object" ||
            typeof error === "function") &&
            error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    return null;

})([]);

if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
    printWarning = function (message) {
        console.warn(message);
    };
    if (util.isNode && process.stderr.isTTY) {
        printWarning = function(message, isSoft) {
            var color = isSoft ? "\u001b[33m" : "\u001b[31m";
            console.warn(color + message + "\u001b[0m\n");
        };
    } else if (!util.isNode && typeof (new Error().stack) === "string") {
        printWarning = function(message, isSoft) {
            console.warn("%c" + message,
                        isSoft ? "color: darkorange" : "color: red");
        };
    }
}

var config = {
    warnings: warnings,
    longStackTraces: false,
    cancellation: false,
    monitoring: false,
    asyncHooks: false
};

if (longStackTraces) Promise.longStackTraces();

return {
    asyncHooks: function() {
        return config.asyncHooks;
    },
    longStackTraces: function() {
        return config.longStackTraces;
    },
    warnings: function() {
        return config.warnings;
    },
    cancellation: function() {
        return config.cancellation;
    },
    monitoring: function() {
        return config.monitoring;
    },
    propagateFromFunction: function() {
        return propagateFromFunction;
    },
    boundValueFunction: function() {
        return boundValueFunction;
    },
    checkForgottenReturns: checkForgottenReturns,
    setBounds: setBounds,
    warn: warn,
    deprecated: deprecated,
    CapturedTrace: CapturedTrace,
    fireDomEvent: fireDomEvent,
    fireGlobalEvent: fireGlobalEvent
};
};

},{"./errors":9,"./es5":10,"./util":21}],8:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
function returner() {
    return this.value;
}
function thrower() {
    throw this.reason;
}

Promise.prototype["return"] =
Promise.prototype.thenReturn = function (value) {
    if (value instanceof Promise) value.suppressUnhandledRejections();
    return this._then(
        returner, undefined, undefined, {value: value}, undefined);
};

Promise.prototype["throw"] =
Promise.prototype.thenThrow = function (reason) {
    return this._then(
        thrower, undefined, undefined, {reason: reason}, undefined);
};

Promise.prototype.catchThrow = function (reason) {
    if (arguments.length <= 1) {
        return this._then(
            undefined, thrower, undefined, {reason: reason}, undefined);
    } else {
        var _reason = arguments[1];
        var handler = function() {throw _reason;};
        return this.caught(reason, handler);
    }
};

Promise.prototype.catchReturn = function (value) {
    if (arguments.length <= 1) {
        if (value instanceof Promise) value.suppressUnhandledRejections();
        return this._then(
            undefined, returner, undefined, {value: value}, undefined);
    } else {
        var _value = arguments[1];
        if (_value instanceof Promise) _value.suppressUnhandledRejections();
        var handler = function() {return _value;};
        return this.caught(value, handler);
    }
};
};

},{}],9:[function(_dereq_,module,exports){
"use strict";
var es5 = _dereq_("./es5");
var Objectfreeze = es5.freeze;
var util = _dereq_("./util");
var inherits = util.inherits;
var notEnumerableProp = util.notEnumerableProp;

function subError(nameProperty, defaultMessage) {
    function SubError(message) {
        if (!(this instanceof SubError)) return new SubError(message);
        notEnumerableProp(this, "message",
            typeof message === "string" ? message : defaultMessage);
        notEnumerableProp(this, "name", nameProperty);
        if (Error.captureStackTrace) {
            Error.captureStackTrace(this, this.constructor);
        } else {
            Error.call(this);
        }
    }
    inherits(SubError, Error);
    return SubError;
}

var _TypeError, _RangeError;
var Warning = subError("Warning", "warning");
var CancellationError = subError("CancellationError", "cancellation error");
var TimeoutError = subError("TimeoutError", "timeout error");
var AggregateError = subError("AggregateError", "aggregate error");
try {
    _TypeError = TypeError;
    _RangeError = RangeError;
} catch(e) {
    _TypeError = subError("TypeError", "type error");
    _RangeError = subError("RangeError", "range error");
}

var methods = ("join pop push shift unshift slice filter forEach some " +
    "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" ");

for (var i = 0; i < methods.length; ++i) {
    if (typeof Array.prototype[methods[i]] === "function") {
        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];
    }
}

es5.defineProperty(AggregateError.prototype, "length", {
    value: 0,
    configurable: false,
    writable: true,
    enumerable: true
});
AggregateError.prototype["isOperational"] = true;
var level = 0;
AggregateError.prototype.toString = function() {
    var indent = Array(level * 4 + 1).join(" ");
    var ret = "\n" + indent + "AggregateError of:" + "\n";
    level++;
    indent = Array(level * 4 + 1).join(" ");
    for (var i = 0; i < this.length; ++i) {
        var str = this[i] === this ? "[Circular AggregateError]" : this[i] + "";
        var lines = str.split("\n");
        for (var j = 0; j < lines.length; ++j) {
            lines[j] = indent + lines[j];
        }
        str = lines.join("\n");
        ret += str + "\n";
    }
    level--;
    return ret;
};

function OperationalError(message) {
    if (!(this instanceof OperationalError))
        return new OperationalError(message);
    notEnumerableProp(this, "name", "OperationalError");
    notEnumerableProp(this, "message", message);
    this.cause = message;
    this["isOperational"] = true;

    if (message instanceof Error) {
        notEnumerableProp(this, "message", message.message);
        notEnumerableProp(this, "stack", message.stack);
    } else if (Error.captureStackTrace) {
        Error.captureStackTrace(this, this.constructor);
    }

}
inherits(OperationalError, Error);

var errorTypes = Error["__BluebirdErrorTypes__"];
if (!errorTypes) {
    errorTypes = Objectfreeze({
        CancellationError: CancellationError,
        TimeoutError: TimeoutError,
        OperationalError: OperationalError,
        RejectionError: OperationalError,
        AggregateError: AggregateError
    });
    es5.defineProperty(Error, "__BluebirdErrorTypes__", {
        value: errorTypes,
        writable: false,
        enumerable: false,
        configurable: false
    });
}

module.exports = {
    Error: Error,
    TypeError: _TypeError,
    RangeError: _RangeError,
    CancellationError: errorTypes.CancellationError,
    OperationalError: errorTypes.OperationalError,
    TimeoutError: errorTypes.TimeoutError,
    AggregateError: errorTypes.AggregateError,
    Warning: Warning
};

},{"./es5":10,"./util":21}],10:[function(_dereq_,module,exports){
var isES5 = (function(){
    "use strict";
    return this === undefined;
})();

if (isES5) {
    module.exports = {
        freeze: Object.freeze,
        defineProperty: Object.defineProperty,
        getDescriptor: Object.getOwnPropertyDescriptor,
        keys: Object.keys,
        names: Object.getOwnPropertyNames,
        getPrototypeOf: Object.getPrototypeOf,
        isArray: Array.isArray,
        isES5: isES5,
        propertyIsWritable: function(obj, prop) {
            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
            return !!(!descriptor || descriptor.writable || descriptor.set);
        }
    };
} else {
    var has = {}.hasOwnProperty;
    var str = {}.toString;
    var proto = {}.constructor.prototype;

    var ObjectKeys = function (o) {
        var ret = [];
        for (var key in o) {
            if (has.call(o, key)) {
                ret.push(key);
            }
        }
        return ret;
    };

    var ObjectGetDescriptor = function(o, key) {
        return {value: o[key]};
    };

    var ObjectDefineProperty = function (o, key, desc) {
        o[key] = desc.value;
        return o;
    };

    var ObjectFreeze = function (obj) {
        return obj;
    };

    var ObjectGetPrototypeOf = function (obj) {
        try {
            return Object(obj).constructor.prototype;
        }
        catch (e) {
            return proto;
        }
    };

    var ArrayIsArray = function (obj) {
        try {
            return str.call(obj) === "[object Array]";
        }
        catch(e) {
            return false;
        }
    };

    module.exports = {
        isArray: ArrayIsArray,
        keys: ObjectKeys,
        names: ObjectKeys,
        defineProperty: ObjectDefineProperty,
        getDescriptor: ObjectGetDescriptor,
        freeze: ObjectFreeze,
        getPrototypeOf: ObjectGetPrototypeOf,
        isES5: isES5,
        propertyIsWritable: function() {
            return true;
        }
    };
}

},{}],11:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) {
var util = _dereq_("./util");
var CancellationError = Promise.CancellationError;
var errorObj = util.errorObj;
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);

function PassThroughHandlerContext(promise, type, handler) {
    this.promise = promise;
    this.type = type;
    this.handler = handler;
    this.called = false;
    this.cancelPromise = null;
}

PassThroughHandlerContext.prototype.isFinallyHandler = function() {
    return this.type === 0;
};

function FinallyHandlerCancelReaction(finallyHandler) {
    this.finallyHandler = finallyHandler;
}

FinallyHandlerCancelReaction.prototype._resultCancelled = function() {
    checkCancel(this.finallyHandler);
};

function checkCancel(ctx, reason) {
    if (ctx.cancelPromise != null) {
        if (arguments.length > 1) {
            ctx.cancelPromise._reject(reason);
        } else {
            ctx.cancelPromise._cancel();
        }
        ctx.cancelPromise = null;
        return true;
    }
    return false;
}

function succeed() {
    return finallyHandler.call(this, this.promise._target()._settledValue());
}
function fail(reason) {
    if (checkCancel(this, reason)) return;
    errorObj.e = reason;
    return errorObj;
}
function finallyHandler(reasonOrValue) {
    var promise = this.promise;
    var handler = this.handler;

    if (!this.called) {
        this.called = true;
        var ret = this.isFinallyHandler()
            ? handler.call(promise._boundValue())
            : handler.call(promise._boundValue(), reasonOrValue);
        if (ret === NEXT_FILTER) {
            return ret;
        } else if (ret !== undefined) {
            promise._setReturnedNonUndefined();
            var maybePromise = tryConvertToPromise(ret, promise);
            if (maybePromise instanceof Promise) {
                if (this.cancelPromise != null) {
                    if (maybePromise._isCancelled()) {
                        var reason =
                            new CancellationError("late cancellation observer");
                        promise._attachExtraTrace(reason);
                        errorObj.e = reason;
                        return errorObj;
                    } else if (maybePromise.isPending()) {
                        maybePromise._attachCancellationCallback(
                            new FinallyHandlerCancelReaction(this));
                    }
                }
                return maybePromise._then(
                    succeed, fail, undefined, this, undefined);
            }
        }
    }

    if (promise.isRejected()) {
        checkCancel(this);
        errorObj.e = reasonOrValue;
        return errorObj;
    } else {
        checkCancel(this);
        return reasonOrValue;
    }
}

Promise.prototype._passThrough = function(handler, type, success, fail) {
    if (typeof handler !== "function") return this.then();
    return this._then(success,
                      fail,
                      undefined,
                      new PassThroughHandlerContext(this, type, handler),
                      undefined);
};

Promise.prototype.lastly =
Promise.prototype["finally"] = function (handler) {
    return this._passThrough(handler,
                             0,
                             finallyHandler,
                             finallyHandler);
};


Promise.prototype.tap = function (handler) {
    return this._passThrough(handler, 1, finallyHandler);
};

Promise.prototype.tapCatch = function (handlerOrPredicate) {
    var len = arguments.length;
    if(len === 1) {
        return this._passThrough(handlerOrPredicate,
                                 1,
                                 undefined,
                                 finallyHandler);
    } else {
         var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return Promise.reject(new TypeError(
                    "tapCatch statement predicate: "
                    + "expecting an object but got " + util.classString(item)
                ));
            }
        }
        catchInstances.length = j;
        var handler = arguments[i];
        return this._passThrough(catchFilter(catchInstances, handler, this),
                                 1,
                                 undefined,
                                 finallyHandler);
    }

};

return PassThroughHandlerContext;
};

},{"./catch_filter":5,"./util":21}],12:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) {
var util = _dereq_("./util");
var canEvaluate = util.canEvaluate;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var reject;

if (!true) {
if (canEvaluate) {
    var thenCallback = function(i) {
        return new Function("value", "holder", "                             \n\
            'use strict';                                                    \n\
            holder.pIndex = value;                                           \n\
            holder.checkFulfillment(this);                                   \n\
            ".replace(/Index/g, i));
    };

    var promiseSetter = function(i) {
        return new Function("promise", "holder", "                           \n\
            'use strict';                                                    \n\
            holder.pIndex = promise;                                         \n\
            ".replace(/Index/g, i));
    };

    var generateHolderClass = function(total) {
        var props = new Array(total);
        for (var i = 0; i < props.length; ++i) {
            props[i] = "this.p" + (i+1);
        }
        var assignment = props.join(" = ") + " = null;";
        var cancellationCode= "var promise;\n" + props.map(function(prop) {
            return "                                                         \n\
                promise = " + prop + ";                                      \n\
                if (promise instanceof Promise) {                            \n\
                    promise.cancel();                                        \n\
                }                                                            \n\
            ";
        }).join("\n");
        var passedArguments = props.join(", ");
        var name = "Holder$" + total;


        var code = "return function(tryCatch, errorObj, Promise, async) {    \n\
            'use strict';                                                    \n\
            function [TheName](fn) {                                         \n\
                [TheProperties]                                              \n\
                this.fn = fn;                                                \n\
                this.asyncNeeded = true;                                     \n\
                this.now = 0;                                                \n\
            }                                                                \n\
                                                                             \n\
            [TheName].prototype._callFunction = function(promise) {          \n\
                promise._pushContext();                                      \n\
                var ret = tryCatch(this.fn)([ThePassedArguments]);           \n\
                promise._popContext();                                       \n\
                if (ret === errorObj) {                                      \n\
                    promise._rejectCallback(ret.e, false);                   \n\
                } else {                                                     \n\
                    promise._resolveCallback(ret);                           \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype.checkFulfillment = function(promise) {       \n\
                var now = ++this.now;                                        \n\
                if (now === [TheTotal]) {                                    \n\
                    if (this.asyncNeeded) {                                  \n\
                        async.invoke(this._callFunction, this, promise);     \n\
                    } else {                                                 \n\
                        this._callFunction(promise);                         \n\
                    }                                                        \n\
                                                                             \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype._resultCancelled = function() {              \n\
                [CancellationCode]                                           \n\
            };                                                               \n\
                                                                             \n\
            return [TheName];                                                \n\
        }(tryCatch, errorObj, Promise, async);                               \n\
        ";

        code = code.replace(/\[TheName\]/g, name)
            .replace(/\[TheTotal\]/g, total)
            .replace(/\[ThePassedArguments\]/g, passedArguments)
            .replace(/\[TheProperties\]/g, assignment)
            .replace(/\[CancellationCode\]/g, cancellationCode);

        return new Function("tryCatch", "errorObj", "Promise", "async", code)
                           (tryCatch, errorObj, Promise, async);
    };

    var holderClasses = [];
    var thenCallbacks = [];
    var promiseSetters = [];

    for (var i = 0; i < 8; ++i) {
        holderClasses.push(generateHolderClass(i + 1));
        thenCallbacks.push(thenCallback(i + 1));
        promiseSetters.push(promiseSetter(i + 1));
    }

    reject = function (reason) {
        this._reject(reason);
    };
}}

Promise.join = function () {
    var last = arguments.length - 1;
    var fn;
    if (last > 0 && typeof arguments[last] === "function") {
        fn = arguments[last];
        if (!true) {
            if (last <= 8 && canEvaluate) {
                var ret = new Promise(INTERNAL);
                ret._captureStackTrace();
                var HolderClass = holderClasses[last - 1];
                var holder = new HolderClass(fn);
                var callbacks = thenCallbacks;

                for (var i = 0; i < last; ++i) {
                    var maybePromise = tryConvertToPromise(arguments[i], ret);
                    if (maybePromise instanceof Promise) {
                        maybePromise = maybePromise._target();
                        var bitField = maybePromise._bitField;
                        ;
                        if (((bitField & 50397184) === 0)) {
                            maybePromise._then(callbacks[i], reject,
                                               undefined, ret, holder);
                            promiseSetters[i](maybePromise, holder);
                            holder.asyncNeeded = false;
                        } else if (((bitField & 33554432) !== 0)) {
                            callbacks[i].call(ret,
                                              maybePromise._value(), holder);
                        } else if (((bitField & 16777216) !== 0)) {
                            ret._reject(maybePromise._reason());
                        } else {
                            ret._cancel();
                        }
                    } else {
                        callbacks[i].call(ret, maybePromise, holder);
                    }
                }

                if (!ret._isFateSealed()) {
                    if (holder.asyncNeeded) {
                        var context = Promise._getContext();
                        holder.fn = util.contextBind(context, holder.fn);
                    }
                    ret._setAsyncGuaranteed();
                    ret._setOnCancel(holder);
                }
                return ret;
            }
        }
    }
    var args = [].slice.call(arguments);;
    if (fn) args.pop();
    var ret = new PromiseArray(args).promise();
    return fn !== undefined ? ret.spread(fn) : ret;
};

};

},{"./util":21}],13:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;

Promise.method = function (fn) {
    if (typeof fn !== "function") {
        throw new Promise.TypeError("expecting a function but got " + util.classString(fn));
    }
    return function () {
        var ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._pushContext();
        var value = tryCatch(fn).apply(this, arguments);
        var promiseCreated = ret._popContext();
        debug.checkForgottenReturns(
            value, promiseCreated, "Promise.method", ret);
        ret._resolveFromSyncValue(value);
        return ret;
    };
};

Promise.attempt = Promise["try"] = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._pushContext();
    var value;
    if (arguments.length > 1) {
        debug.deprecated("calling Promise.try with more than 1 argument");
        var arg = arguments[1];
        var ctx = arguments[2];
        value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg)
                                  : tryCatch(fn).call(ctx, arg);
    } else {
        value = tryCatch(fn)();
    }
    var promiseCreated = ret._popContext();
    debug.checkForgottenReturns(
        value, promiseCreated, "Promise.try", ret);
    ret._resolveFromSyncValue(value);
    return ret;
};

Promise.prototype._resolveFromSyncValue = function (value) {
    if (value === util.errorObj) {
        this._rejectCallback(value.e, false);
    } else {
        this._resolveCallback(value, true);
    }
};
};

},{"./util":21}],14:[function(_dereq_,module,exports){
"use strict";
var util = _dereq_("./util");
var maybeWrapAsError = util.maybeWrapAsError;
var errors = _dereq_("./errors");
var OperationalError = errors.OperationalError;
var es5 = _dereq_("./es5");

function isUntypedError(obj) {
    return obj instanceof Error &&
        es5.getPrototypeOf(obj) === Error.prototype;
}

var rErrorKey = /^(?:name|message|stack|cause)$/;
function wrapAsOperationalError(obj) {
    var ret;
    if (isUntypedError(obj)) {
        ret = new OperationalError(obj);
        ret.name = obj.name;
        ret.message = obj.message;
        ret.stack = obj.stack;
        var keys = es5.keys(obj);
        for (var i = 0; i < keys.length; ++i) {
            var key = keys[i];
            if (!rErrorKey.test(key)) {
                ret[key] = obj[key];
            }
        }
        return ret;
    }
    util.markAsOriginatingFromRejection(obj);
    return obj;
}

function nodebackForPromise(promise, multiArgs) {
    return function(err, value) {
        if (promise === null) return;
        if (err) {
            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));
            promise._attachExtraTrace(wrapped);
            promise._reject(wrapped);
        } else if (!multiArgs) {
            promise._fulfill(value);
        } else {
            var args = [].slice.call(arguments, 1);;
            promise._fulfill(args);
        }
        promise = null;
    };
}

module.exports = nodebackForPromise;

},{"./errors":9,"./es5":10,"./util":21}],15:[function(_dereq_,module,exports){
"use strict";
module.exports = function() {
var makeSelfResolutionError = function () {
    return new TypeError("circular promise resolution chain\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var reflectHandler = function() {
    return new Promise.PromiseInspection(this._target());
};
var apiRejection = function(msg) {
    return Promise.reject(new TypeError(msg));
};
function Proxyable() {}
var UNDEFINED_BINDING = {};
var util = _dereq_("./util");
util.setReflectHandler(reflectHandler);

var getDomain = function() {
    var domain = process.domain;
    if (domain === undefined) {
        return null;
    }
    return domain;
};
var getContextDefault = function() {
    return null;
};
var getContextDomain = function() {
    return {
        domain: getDomain(),
        async: null
    };
};
var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ?
    _dereq_("async_hooks").AsyncResource : null;
var getContextAsyncHooks = function() {
    return {
        domain: getDomain(),
        async: new AsyncResource("Bluebird::Promise")
    };
};
var getContext = util.isNode ? getContextDomain : getContextDefault;
util.notEnumerableProp(Promise, "_getContext", getContext);
var enableAsyncHooks = function() {
    getContext = getContextAsyncHooks;
    util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks);
};
var disableAsyncHooks = function() {
    getContext = getContextDomain;
    util.notEnumerableProp(Promise, "_getContext", getContextDomain);
};

var es5 = _dereq_("./es5");
var Async = _dereq_("./async");
var async = new Async();
es5.defineProperty(Promise, "_async", {value: async});
var errors = _dereq_("./errors");
var TypeError = Promise.TypeError = errors.TypeError;
Promise.RangeError = errors.RangeError;
var CancellationError = Promise.CancellationError = errors.CancellationError;
Promise.TimeoutError = errors.TimeoutError;
Promise.OperationalError = errors.OperationalError;
Promise.RejectionError = errors.OperationalError;
Promise.AggregateError = errors.AggregateError;
var INTERNAL = function(){};
var APPLY = {};
var NEXT_FILTER = {};
var tryConvertToPromise = _dereq_("./thenables")(Promise, INTERNAL);
var PromiseArray =
    _dereq_("./promise_array")(Promise, INTERNAL,
                               tryConvertToPromise, apiRejection, Proxyable);
var Context = _dereq_("./context")(Promise);
 /*jshint unused:false*/
var createContext = Context.create;

var debug = _dereq_("./debuggability")(Promise, Context,
    enableAsyncHooks, disableAsyncHooks);
var CapturedTrace = debug.CapturedTrace;
var PassThroughHandlerContext =
    _dereq_("./finally")(Promise, tryConvertToPromise, NEXT_FILTER);
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);
var nodebackForPromise = _dereq_("./nodeback");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
function check(self, executor) {
    if (self == null || self.constructor !== Promise) {
        throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (typeof executor !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(executor));
    }

}

function Promise(executor) {
    if (executor !== INTERNAL) {
        check(this, executor);
    }
    this._bitField = 0;
    this._fulfillmentHandler0 = undefined;
    this._rejectionHandler0 = undefined;
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._resolveFromExecutor(executor);
    this._promiseCreated();
    this._fireEvent("promiseCreated", this);
}

Promise.prototype.toString = function () {
    return "[object Promise]";
};

Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {
    var len = arguments.length;
    if (len > 1) {
        var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return apiRejection("Catch statement predicate: " +
                    "expecting an object but got " + util.classString(item));
            }
        }
        catchInstances.length = j;
        fn = arguments[i];

        if (typeof fn !== "function") {
            throw new TypeError("The last argument to .catch() " +
                "must be a function, got " + util.toString(fn));
        }
        return this.then(undefined, catchFilter(catchInstances, fn, this));
    }
    return this.then(undefined, fn);
};

Promise.prototype.reflect = function () {
    return this._then(reflectHandler,
        reflectHandler, undefined, this, undefined);
};

Promise.prototype.then = function (didFulfill, didReject) {
    if (debug.warnings() && arguments.length > 0 &&
        typeof didFulfill !== "function" &&
        typeof didReject !== "function") {
        var msg = ".then() only accepts functions but was passed: " +
                util.classString(didFulfill);
        if (arguments.length > 1) {
            msg += ", " + util.classString(didReject);
        }
        this._warn(msg);
    }
    return this._then(didFulfill, didReject, undefined, undefined, undefined);
};

Promise.prototype.done = function (didFulfill, didReject) {
    var promise =
        this._then(didFulfill, didReject, undefined, undefined, undefined);
    promise._setIsFinal();
};

Promise.prototype.spread = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    return this.all()._then(fn, undefined, undefined, APPLY, undefined);
};

Promise.prototype.toJSON = function () {
    var ret = {
        isFulfilled: false,
        isRejected: false,
        fulfillmentValue: undefined,
        rejectionReason: undefined
    };
    if (this.isFulfilled()) {
        ret.fulfillmentValue = this.value();
        ret.isFulfilled = true;
    } else if (this.isRejected()) {
        ret.rejectionReason = this.reason();
        ret.isRejected = true;
    }
    return ret;
};

Promise.prototype.all = function () {
    if (arguments.length > 0) {
        this._warn(".all() was passed arguments but it does not take any");
    }
    return new PromiseArray(this).promise();
};

Promise.prototype.error = function (fn) {
    return this.caught(util.originatesFromRejection, fn);
};

Promise.getNewLibraryCopy = module.exports;

Promise.is = function (val) {
    return val instanceof Promise;
};

Promise.fromNode = Promise.fromCallback = function(fn) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs
                                         : false;
    var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));
    if (result === errorObj) {
        ret._rejectCallback(result.e, true);
    }
    if (!ret._isFateSealed()) ret._setAsyncGuaranteed();
    return ret;
};

Promise.all = function (promises) {
    return new PromiseArray(promises).promise();
};

Promise.cast = function (obj) {
    var ret = tryConvertToPromise(obj);
    if (!(ret instanceof Promise)) {
        ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._setFulfilled();
        ret._rejectionHandler0 = obj;
    }
    return ret;
};

Promise.resolve = Promise.fulfilled = Promise.cast;

Promise.reject = Promise.rejected = function (reason) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._rejectCallback(reason, true);
    return ret;
};

Promise.setScheduler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    return async.setScheduler(fn);
};

Promise.prototype._then = function (
    didFulfill,
    didReject,
    _,    receiver,
    internalData
) {
    var haveInternalData = internalData !== undefined;
    var promise = haveInternalData ? internalData : new Promise(INTERNAL);
    var target = this._target();
    var bitField = target._bitField;

    if (!haveInternalData) {
        promise._propagateFrom(this, 3);
        promise._captureStackTrace();
        if (receiver === undefined &&
            ((this._bitField & 2097152) !== 0)) {
            if (!((bitField & 50397184) === 0)) {
                receiver = this._boundValue();
            } else {
                receiver = target === this ? undefined : this._boundTo;
            }
        }
        this._fireEvent("promiseChained", this, promise);
    }

    var context = getContext();
    if (!((bitField & 50397184) === 0)) {
        var handler, value, settler = target._settlePromiseCtx;
        if (((bitField & 33554432) !== 0)) {
            value = target._rejectionHandler0;
            handler = didFulfill;
        } else if (((bitField & 16777216) !== 0)) {
            value = target._fulfillmentHandler0;
            handler = didReject;
            target._unsetRejectionIsUnhandled();
        } else {
            settler = target._settlePromiseLateCancellationObserver;
            value = new CancellationError("late cancellation observer");
            target._attachExtraTrace(value);
            handler = didReject;
        }

        async.invoke(settler, target, {
            handler: util.contextBind(context, handler),
            promise: promise,
            receiver: receiver,
            value: value
        });
    } else {
        target._addCallbacks(didFulfill, didReject, promise,
                receiver, context);
    }

    return promise;
};

Promise.prototype._length = function () {
    return this._bitField & 65535;
};

Promise.prototype._isFateSealed = function () {
    return (this._bitField & 117506048) !== 0;
};

Promise.prototype._isFollowing = function () {
    return (this._bitField & 67108864) === 67108864;
};

Promise.prototype._setLength = function (len) {
    this._bitField = (this._bitField & -65536) |
        (len & 65535);
};

Promise.prototype._setFulfilled = function () {
    this._bitField = this._bitField | 33554432;
    this._fireEvent("promiseFulfilled", this);
};

Promise.prototype._setRejected = function () {
    this._bitField = this._bitField | 16777216;
    this._fireEvent("promiseRejected", this);
};

Promise.prototype._setFollowing = function () {
    this._bitField = this._bitField | 67108864;
    this._fireEvent("promiseResolved", this);
};

Promise.prototype._setIsFinal = function () {
    this._bitField = this._bitField | 4194304;
};

Promise.prototype._isFinal = function () {
    return (this._bitField & 4194304) > 0;
};

Promise.prototype._unsetCancelled = function() {
    this._bitField = this._bitField & (~65536);
};

Promise.prototype._setCancelled = function() {
    this._bitField = this._bitField | 65536;
    this._fireEvent("promiseCancelled", this);
};

Promise.prototype._setWillBeCancelled = function() {
    this._bitField = this._bitField | 8388608;
};

Promise.prototype._setAsyncGuaranteed = function() {
    if (async.hasCustomScheduler()) return;
    var bitField = this._bitField;
    this._bitField = bitField |
        (((bitField & 536870912) >> 2) ^
        134217728);
};

Promise.prototype._setNoAsyncGuarantee = function() {
    this._bitField = (this._bitField | 536870912) &
        (~134217728);
};

Promise.prototype._receiverAt = function (index) {
    var ret = index === 0 ? this._receiver0 : this[
            index * 4 - 4 + 3];
    if (ret === UNDEFINED_BINDING) {
        return undefined;
    } else if (ret === undefined && this._isBound()) {
        return this._boundValue();
    }
    return ret;
};

Promise.prototype._promiseAt = function (index) {
    return this[
            index * 4 - 4 + 2];
};

Promise.prototype._fulfillmentHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 0];
};

Promise.prototype._rejectionHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 1];
};

Promise.prototype._boundValue = function() {};

Promise.prototype._migrateCallback0 = function (follower) {
    var bitField = follower._bitField;
    var fulfill = follower._fulfillmentHandler0;
    var reject = follower._rejectionHandler0;
    var promise = follower._promise0;
    var receiver = follower._receiverAt(0);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._migrateCallbackAt = function (follower, index) {
    var fulfill = follower._fulfillmentHandlerAt(index);
    var reject = follower._rejectionHandlerAt(index);
    var promise = follower._promiseAt(index);
    var receiver = follower._receiverAt(index);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._addCallbacks = function (
    fulfill,
    reject,
    promise,
    receiver,
    context
) {
    var index = this._length();

    if (index >= 65535 - 4) {
        index = 0;
        this._setLength(0);
    }

    if (index === 0) {
        this._promise0 = promise;
        this._receiver0 = receiver;
        if (typeof fulfill === "function") {
            this._fulfillmentHandler0 = util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this._rejectionHandler0 = util.contextBind(context, reject);
        }
    } else {
        var base = index * 4 - 4;
        this[base + 2] = promise;
        this[base + 3] = receiver;
        if (typeof fulfill === "function") {
            this[base + 0] =
                util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this[base + 1] =
                util.contextBind(context, reject);
        }
    }
    this._setLength(index + 1);
    return index;
};

Promise.prototype._proxy = function (proxyable, arg) {
    this._addCallbacks(undefined, undefined, arg, proxyable, null);
};

Promise.prototype._resolveCallback = function(value, shouldBind) {
    if (((this._bitField & 117506048) !== 0)) return;
    if (value === this)
        return this._rejectCallback(makeSelfResolutionError(), false);
    var maybePromise = tryConvertToPromise(value, this);
    if (!(maybePromise instanceof Promise)) return this._fulfill(value);

    if (shouldBind) this._propagateFrom(maybePromise, 2);


    var promise = maybePromise._target();

    if (promise === this) {
        this._reject(makeSelfResolutionError());
        return;
    }

    var bitField = promise._bitField;
    if (((bitField & 50397184) === 0)) {
        var len = this._length();
        if (len > 0) promise._migrateCallback0(this);
        for (var i = 1; i < len; ++i) {
            promise._migrateCallbackAt(this, i);
        }
        this._setFollowing();
        this._setLength(0);
        this._setFollowee(maybePromise);
    } else if (((bitField & 33554432) !== 0)) {
        this._fulfill(promise._value());
    } else if (((bitField & 16777216) !== 0)) {
        this._reject(promise._reason());
    } else {
        var reason = new CancellationError("late cancellation observer");
        promise._attachExtraTrace(reason);
        this._reject(reason);
    }
};

Promise.prototype._rejectCallback =
function(reason, synchronous, ignoreNonErrorWarnings) {
    var trace = util.ensureErrorObject(reason);
    var hasStack = trace === reason;
    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {
        var message = "a promise was rejected with a non-error: " +
            util.classString(reason);
        this._warn(message, true);
    }
    this._attachExtraTrace(trace, synchronous ? hasStack : false);
    this._reject(reason);
};

Promise.prototype._resolveFromExecutor = function (executor) {
    if (executor === INTERNAL) return;
    var promise = this;
    this._captureStackTrace();
    this._pushContext();
    var synchronous = true;
    var r = this._execute(executor, function(value) {
        promise._resolveCallback(value);
    }, function (reason) {
        promise._rejectCallback(reason, synchronous);
    });
    synchronous = false;
    this._popContext();

    if (r !== undefined) {
        promise._rejectCallback(r, true);
    }
};

Promise.prototype._settlePromiseFromHandler = function (
    handler, receiver, value, promise
) {
    var bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;
    promise._pushContext();
    var x;
    if (receiver === APPLY) {
        if (!value || typeof value.length !== "number") {
            x = errorObj;
            x.e = new TypeError("cannot .spread() a non-array: " +
                                    util.classString(value));
        } else {
            x = tryCatch(handler).apply(this._boundValue(), value);
        }
    } else {
        x = tryCatch(handler).call(receiver, value);
    }
    var promiseCreated = promise._popContext();
    bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;

    if (x === NEXT_FILTER) {
        promise._reject(value);
    } else if (x === errorObj) {
        promise._rejectCallback(x.e, false);
    } else {
        debug.checkForgottenReturns(x, promiseCreated, "",  promise, this);
        promise._resolveCallback(x);
    }
};

Promise.prototype._target = function() {
    var ret = this;
    while (ret._isFollowing()) ret = ret._followee();
    return ret;
};

Promise.prototype._followee = function() {
    return this._rejectionHandler0;
};

Promise.prototype._setFollowee = function(promise) {
    this._rejectionHandler0 = promise;
};

Promise.prototype._settlePromise = function(promise, handler, receiver, value) {
    var isPromise = promise instanceof Promise;
    var bitField = this._bitField;
    var asyncGuaranteed = ((bitField & 134217728) !== 0);
    if (((bitField & 65536) !== 0)) {
        if (isPromise) promise._invokeInternalOnCancel();

        if (receiver instanceof PassThroughHandlerContext &&
            receiver.isFinallyHandler()) {
            receiver.cancelPromise = promise;
            if (tryCatch(handler).call(receiver, value) === errorObj) {
                promise._reject(errorObj.e);
            }
        } else if (handler === reflectHandler) {
            promise._fulfill(reflectHandler.call(receiver));
        } else if (receiver instanceof Proxyable) {
            receiver._promiseCancelled(promise);
        } else if (isPromise || promise instanceof PromiseArray) {
            promise._cancel();
        } else {
            receiver.cancel();
        }
    } else if (typeof handler === "function") {
        if (!isPromise) {
            handler.call(receiver, value, promise);
        } else {
            if (asyncGuaranteed) promise._setAsyncGuaranteed();
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (receiver instanceof Proxyable) {
        if (!receiver._isResolved()) {
            if (((bitField & 33554432) !== 0)) {
                receiver._promiseFulfilled(value, promise);
            } else {
                receiver._promiseRejected(value, promise);
            }
        }
    } else if (isPromise) {
        if (asyncGuaranteed) promise._setAsyncGuaranteed();
        if (((bitField & 33554432) !== 0)) {
            promise._fulfill(value);
        } else {
            promise._reject(value);
        }
    }
};

Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) {
    var handler = ctx.handler;
    var promise = ctx.promise;
    var receiver = ctx.receiver;
    var value = ctx.value;
    if (typeof handler === "function") {
        if (!(promise instanceof Promise)) {
            handler.call(receiver, value, promise);
        } else {
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (promise instanceof Promise) {
        promise._reject(value);
    }
};

Promise.prototype._settlePromiseCtx = function(ctx) {
    this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);
};

Promise.prototype._settlePromise0 = function(handler, value, bitField) {
    var promise = this._promise0;
    var receiver = this._receiverAt(0);
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._settlePromise(promise, handler, receiver, value);
};

Promise.prototype._clearCallbackDataAtIndex = function(index) {
    var base = index * 4 - 4;
    this[base + 2] =
    this[base + 3] =
    this[base + 0] =
    this[base + 1] = undefined;
};

Promise.prototype._fulfill = function (value) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    if (value === this) {
        var err = makeSelfResolutionError();
        this._attachExtraTrace(err);
        return this._reject(err);
    }
    this._setFulfilled();
    this._rejectionHandler0 = value;

    if ((bitField & 65535) > 0) {
        if (((bitField & 134217728) !== 0)) {
            this._settlePromises();
        } else {
            async.settlePromises(this);
        }
        this._dereferenceTrace();
    }
};

Promise.prototype._reject = function (reason) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    this._setRejected();
    this._fulfillmentHandler0 = reason;

    if (this._isFinal()) {
        return async.fatalError(reason, util.isNode);
    }

    if ((bitField & 65535) > 0) {
        async.settlePromises(this);
    } else {
        this._ensurePossibleRejectionHandled();
    }
};

Promise.prototype._fulfillPromises = function (len, value) {
    for (var i = 1; i < len; i++) {
        var handler = this._fulfillmentHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, value);
    }
};

Promise.prototype._rejectPromises = function (len, reason) {
    for (var i = 1; i < len; i++) {
        var handler = this._rejectionHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, reason);
    }
};

Promise.prototype._settlePromises = function () {
    var bitField = this._bitField;
    var len = (bitField & 65535);

    if (len > 0) {
        if (((bitField & 16842752) !== 0)) {
            var reason = this._fulfillmentHandler0;
            this._settlePromise0(this._rejectionHandler0, reason, bitField);
            this._rejectPromises(len, reason);
        } else {
            var value = this._rejectionHandler0;
            this._settlePromise0(this._fulfillmentHandler0, value, bitField);
            this._fulfillPromises(len, value);
        }
        this._setLength(0);
    }
    this._clearCancellationData();
};

Promise.prototype._settledValue = function() {
    var bitField = this._bitField;
    if (((bitField & 33554432) !== 0)) {
        return this._rejectionHandler0;
    } else if (((bitField & 16777216) !== 0)) {
        return this._fulfillmentHandler0;
    }
};

if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
    es5.defineProperty(Promise.prototype, Symbol.toStringTag, {
        get: function () {
            return "Object";
        }
    });
}

function deferResolve(v) {this.promise._resolveCallback(v);}
function deferReject(v) {this.promise._rejectCallback(v, false);}

Promise.defer = Promise.pending = function() {
    debug.deprecated("Promise.defer", "new Promise");
    var promise = new Promise(INTERNAL);
    return {
        promise: promise,
        resolve: deferResolve,
        reject: deferReject
    };
};

util.notEnumerableProp(Promise,
                       "_makeSelfResolutionError",
                       makeSelfResolutionError);

_dereq_("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection,
    debug);
_dereq_("./bind")(Promise, INTERNAL, tryConvertToPromise, debug);
_dereq_("./cancel")(Promise, PromiseArray, apiRejection, debug);
_dereq_("./direct_resolve")(Promise);
_dereq_("./synchronous_inspection")(Promise);
_dereq_("./join")(
    Promise, PromiseArray, tryConvertToPromise, INTERNAL, async);
Promise.Promise = Promise;
Promise.version = "3.7.2";
                                                         
    util.toFastProperties(Promise);                                          
    util.toFastProperties(Promise.prototype);                                
    function fillTypes(value) {                                              
        var p = new Promise(INTERNAL);                                       
        p._fulfillmentHandler0 = value;                                      
        p._rejectionHandler0 = value;                                        
        p._promise0 = value;                                                 
        p._receiver0 = value;                                                
    }                                                                        
    // Complete slack tracking, opt out of field-type tracking and           
    // stabilize map                                                         
    fillTypes({a: 1});                                                       
    fillTypes({b: 2});                                                       
    fillTypes({c: 3});                                                       
    fillTypes(1);                                                            
    fillTypes(function(){});                                                 
    fillTypes(undefined);                                                    
    fillTypes(false);                                                        
    fillTypes(new Promise(INTERNAL));                                        
    debug.setBounds(Async.firstLineError, util.lastLineError);               
    return Promise;                                                          

};

},{"./async":1,"./bind":2,"./cancel":4,"./catch_filter":5,"./context":6,"./debuggability":7,"./direct_resolve":8,"./errors":9,"./es5":10,"./finally":11,"./join":12,"./method":13,"./nodeback":14,"./promise_array":16,"./synchronous_inspection":19,"./thenables":20,"./util":21,"async_hooks":undefined}],16:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise,
    apiRejection, Proxyable) {
var util = _dereq_("./util");
var isArray = util.isArray;

function toResolutionValue(val) {
    switch(val) {
    case -2: return [];
    case -3: return {};
    case -6: return new Map();
    }
}

function PromiseArray(values) {
    var promise = this._promise = new Promise(INTERNAL);
    if (values instanceof Promise) {
        promise._propagateFrom(values, 3);
        values.suppressUnhandledRejections();
    }
    promise._setOnCancel(this);
    this._values = values;
    this._length = 0;
    this._totalResolved = 0;
    this._init(undefined, -2);
}
util.inherits(PromiseArray, Proxyable);

PromiseArray.prototype.length = function () {
    return this._length;
};

PromiseArray.prototype.promise = function () {
    return this._promise;
};

PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {
    var values = tryConvertToPromise(this._values, this._promise);
    if (values instanceof Promise) {
        values = values._target();
        var bitField = values._bitField;
        ;
        this._values = values;

        if (((bitField & 50397184) === 0)) {
            this._promise._setAsyncGuaranteed();
            return values._then(
                init,
                this._reject,
                undefined,
                this,
                resolveValueIfEmpty
           );
        } else if (((bitField & 33554432) !== 0)) {
            values = values._value();
        } else if (((bitField & 16777216) !== 0)) {
            return this._reject(values._reason());
        } else {
            return this._cancel();
        }
    }
    values = util.asArray(values);
    if (values === null) {
        var err = apiRejection(
            "expecting an array or an iterable object but got " + util.classString(values)).reason();
        this._promise._rejectCallback(err, false);
        return;
    }

    if (values.length === 0) {
        if (resolveValueIfEmpty === -5) {
            this._resolveEmptyArray();
        }
        else {
            this._resolve(toResolutionValue(resolveValueIfEmpty));
        }
        return;
    }
    this._iterate(values);
};

PromiseArray.prototype._iterate = function(values) {
    var len = this.getActualLength(values.length);
    this._length = len;
    this._values = this.shouldCopyValues() ? new Array(len) : this._values;
    var result = this._promise;
    var isResolved = false;
    var bitField = null;
    for (var i = 0; i < len; ++i) {
        var maybePromise = tryConvertToPromise(values[i], result);

        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            bitField = maybePromise._bitField;
        } else {
            bitField = null;
        }

        if (isResolved) {
            if (bitField !== null) {
                maybePromise.suppressUnhandledRejections();
            }
        } else if (bitField !== null) {
            if (((bitField & 50397184) === 0)) {
                maybePromise._proxy(this, i);
                this._values[i] = maybePromise;
            } else if (((bitField & 33554432) !== 0)) {
                isResolved = this._promiseFulfilled(maybePromise._value(), i);
            } else if (((bitField & 16777216) !== 0)) {
                isResolved = this._promiseRejected(maybePromise._reason(), i);
            } else {
                isResolved = this._promiseCancelled(i);
            }
        } else {
            isResolved = this._promiseFulfilled(maybePromise, i);
        }
    }
    if (!isResolved) result._setAsyncGuaranteed();
};

PromiseArray.prototype._isResolved = function () {
    return this._values === null;
};

PromiseArray.prototype._resolve = function (value) {
    this._values = null;
    this._promise._fulfill(value);
};

PromiseArray.prototype._cancel = function() {
    if (this._isResolved() || !this._promise._isCancellable()) return;
    this._values = null;
    this._promise._cancel();
};

PromiseArray.prototype._reject = function (reason) {
    this._values = null;
    this._promise._rejectCallback(reason, false);
};

PromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

PromiseArray.prototype._promiseCancelled = function() {
    this._cancel();
    return true;
};

PromiseArray.prototype._promiseRejected = function (reason) {
    this._totalResolved++;
    this._reject(reason);
    return true;
};

PromiseArray.prototype._resultCancelled = function() {
    if (this._isResolved()) return;
    var values = this._values;
    this._cancel();
    if (values instanceof Promise) {
        values.cancel();
    } else {
        for (var i = 0; i < values.length; ++i) {
            if (values[i] instanceof Promise) {
                values[i].cancel();
            }
        }
    }
};

PromiseArray.prototype.shouldCopyValues = function () {
    return true;
};

PromiseArray.prototype.getActualLength = function (len) {
    return len;
};

return PromiseArray;
};

},{"./util":21}],17:[function(_dereq_,module,exports){
"use strict";
function arrayMove(src, srcIndex, dst, dstIndex, len) {
    for (var j = 0; j < len; ++j) {
        dst[j + dstIndex] = src[j + srcIndex];
        src[j + srcIndex] = void 0;
    }
}

function Queue(capacity) {
    this._capacity = capacity;
    this._length = 0;
    this._front = 0;
}

Queue.prototype._willBeOverCapacity = function (size) {
    return this._capacity < size;
};

Queue.prototype._pushOne = function (arg) {
    var length = this.length();
    this._checkCapacity(length + 1);
    var i = (this._front + length) & (this._capacity - 1);
    this[i] = arg;
    this._length = length + 1;
};

Queue.prototype.push = function (fn, receiver, arg) {
    var length = this.length() + 3;
    if (this._willBeOverCapacity(length)) {
        this._pushOne(fn);
        this._pushOne(receiver);
        this._pushOne(arg);
        return;
    }
    var j = this._front + length - 3;
    this._checkCapacity(length);
    var wrapMask = this._capacity - 1;
    this[(j + 0) & wrapMask] = fn;
    this[(j + 1) & wrapMask] = receiver;
    this[(j + 2) & wrapMask] = arg;
    this._length = length;
};

Queue.prototype.shift = function () {
    var front = this._front,
        ret = this[front];

    this[front] = undefined;
    this._front = (front + 1) & (this._capacity - 1);
    this._length--;
    return ret;
};

Queue.prototype.length = function () {
    return this._length;
};

Queue.prototype._checkCapacity = function (size) {
    if (this._capacity < size) {
        this._resizeTo(this._capacity << 1);
    }
};

Queue.prototype._resizeTo = function (capacity) {
    var oldCapacity = this._capacity;
    this._capacity = capacity;
    var front = this._front;
    var length = this._length;
    var moveItemsCount = (front + length) & (oldCapacity - 1);
    arrayMove(this, 0, this, oldCapacity, moveItemsCount);
};

module.exports = Queue;

},{}],18:[function(_dereq_,module,exports){
"use strict";
var util = _dereq_("./util");
var schedule;
var noAsyncScheduler = function() {
    throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var NativePromise = util.getNativePromise();
if (util.isNode && typeof MutationObserver === "undefined") {
    var GlobalSetImmediate = global.setImmediate;
    var ProcessNextTick = process.nextTick;
    schedule = util.isRecentNode
                ? function(fn) { GlobalSetImmediate.call(global, fn); }
                : function(fn) { ProcessNextTick.call(process, fn); };
} else if (typeof NativePromise === "function" &&
           typeof NativePromise.resolve === "function") {
    var nativePromise = NativePromise.resolve();
    schedule = function(fn) {
        nativePromise.then(fn);
    };
} else if ((typeof MutationObserver !== "undefined") &&
          !(typeof window !== "undefined" &&
            window.navigator &&
            (window.navigator.standalone || window.cordova)) &&
          ("classList" in document.documentElement)) {
    schedule = (function() {
        var div = document.createElement("div");
        var opts = {attributes: true};
        var toggleScheduled = false;
        var div2 = document.createElement("div");
        var o2 = new MutationObserver(function() {
            div.classList.toggle("foo");
            toggleScheduled = false;
        });
        o2.observe(div2, opts);

        var scheduleToggle = function() {
            if (toggleScheduled) return;
            toggleScheduled = true;
            div2.classList.toggle("foo");
        };

        return function schedule(fn) {
            var o = new MutationObserver(function() {
                o.disconnect();
                fn();
            });
            o.observe(div, opts);
            scheduleToggle();
        };
    })();
} else if (typeof setImmediate !== "undefined") {
    schedule = function (fn) {
        setImmediate(fn);
    };
} else if (typeof setTimeout !== "undefined") {
    schedule = function (fn) {
        setTimeout(fn, 0);
    };
} else {
    schedule = noAsyncScheduler;
}
module.exports = schedule;

},{"./util":21}],19:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
function PromiseInspection(promise) {
    if (promise !== undefined) {
        promise = promise._target();
        this._bitField = promise._bitField;
        this._settledValueField = promise._isFateSealed()
            ? promise._settledValue() : undefined;
    }
    else {
        this._bitField = 0;
        this._settledValueField = undefined;
    }
}

PromiseInspection.prototype._settledValue = function() {
    return this._settledValueField;
};

var value = PromiseInspection.prototype.value = function () {
    if (!this.isFulfilled()) {
        throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var reason = PromiseInspection.prototype.error =
PromiseInspection.prototype.reason = function () {
    if (!this.isRejected()) {
        throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var isFulfilled = PromiseInspection.prototype.isFulfilled = function() {
    return (this._bitField & 33554432) !== 0;
};

var isRejected = PromiseInspection.prototype.isRejected = function () {
    return (this._bitField & 16777216) !== 0;
};

var isPending = PromiseInspection.prototype.isPending = function () {
    return (this._bitField & 50397184) === 0;
};

var isResolved = PromiseInspection.prototype.isResolved = function () {
    return (this._bitField & 50331648) !== 0;
};

PromiseInspection.prototype.isCancelled = function() {
    return (this._bitField & 8454144) !== 0;
};

Promise.prototype.__isCancelled = function() {
    return (this._bitField & 65536) === 65536;
};

Promise.prototype._isCancelled = function() {
    return this._target().__isCancelled();
};

Promise.prototype.isCancelled = function() {
    return (this._target()._bitField & 8454144) !== 0;
};

Promise.prototype.isPending = function() {
    return isPending.call(this._target());
};

Promise.prototype.isRejected = function() {
    return isRejected.call(this._target());
};

Promise.prototype.isFulfilled = function() {
    return isFulfilled.call(this._target());
};

Promise.prototype.isResolved = function() {
    return isResolved.call(this._target());
};

Promise.prototype.value = function() {
    return value.call(this._target());
};

Promise.prototype.reason = function() {
    var target = this._target();
    target._unsetRejectionIsUnhandled();
    return reason.call(target);
};

Promise.prototype._value = function() {
    return this._settledValue();
};

Promise.prototype._reason = function() {
    this._unsetRejectionIsUnhandled();
    return this._settledValue();
};

Promise.PromiseInspection = PromiseInspection;
};

},{}],20:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var util = _dereq_("./util");
var errorObj = util.errorObj;
var isObject = util.isObject;

function tryConvertToPromise(obj, context) {
    if (isObject(obj)) {
        if (obj instanceof Promise) return obj;
        var then = getThen(obj);
        if (then === errorObj) {
            if (context) context._pushContext();
            var ret = Promise.reject(then.e);
            if (context) context._popContext();
            return ret;
        } else if (typeof then === "function") {
            if (isAnyBluebirdPromise(obj)) {
                var ret = new Promise(INTERNAL);
                obj._then(
                    ret._fulfill,
                    ret._reject,
                    undefined,
                    ret,
                    null
                );
                return ret;
            }
            return doThenable(obj, then, context);
        }
    }
    return obj;
}

function doGetThen(obj) {
    return obj.then;
}

function getThen(obj) {
    try {
        return doGetThen(obj);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}

var hasProp = {}.hasOwnProperty;
function isAnyBluebirdPromise(obj) {
    try {
        return hasProp.call(obj, "_promise0");
    } catch (e) {
        return false;
    }
}

function doThenable(x, then, context) {
    var promise = new Promise(INTERNAL);
    var ret = promise;
    if (context) context._pushContext();
    promise._captureStackTrace();
    if (context) context._popContext();
    var synchronous = true;
    var result = util.tryCatch(then).call(x, resolve, reject);
    synchronous = false;

    if (promise && result === errorObj) {
        promise._rejectCallback(result.e, true, true);
        promise = null;
    }

    function resolve(value) {
        if (!promise) return;
        promise._resolveCallback(value);
        promise = null;
    }

    function reject(reason) {
        if (!promise) return;
        promise._rejectCallback(reason, synchronous, true);
        promise = null;
    }
    return ret;
}

return tryConvertToPromise;
};

},{"./util":21}],21:[function(_dereq_,module,exports){
"use strict";
var es5 = _dereq_("./es5");
var canEvaluate = typeof navigator == "undefined";

var errorObj = {e: {}};
var tryCatchTarget;
var globalObject = typeof self !== "undefined" ? self :
    typeof window !== "undefined" ? window :
    typeof global !== "undefined" ? global :
    this !== undefined ? this : null;

function tryCatcher() {
    try {
        var target = tryCatchTarget;
        tryCatchTarget = null;
        return target.apply(this, arguments);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}
function tryCatch(fn) {
    tryCatchTarget = fn;
    return tryCatcher;
}

var inherits = function(Child, Parent) {
    var hasProp = {}.hasOwnProperty;

    function T() {
        this.constructor = Child;
        this.constructor$ = Parent;
        for (var propertyName in Parent.prototype) {
            if (hasProp.call(Parent.prototype, propertyName) &&
                propertyName.charAt(propertyName.length-1) !== "$"
           ) {
                this[propertyName + "$"] = Parent.prototype[propertyName];
            }
        }
    }
    T.prototype = Parent.prototype;
    Child.prototype = new T();
    return Child.prototype;
};


function isPrimitive(val) {
    return val == null || val === true || val === false ||
        typeof val === "string" || typeof val === "number";

}

function isObject(value) {
    return typeof value === "function" ||
           typeof value === "object" && value !== null;
}

function maybeWrapAsError(maybeError) {
    if (!isPrimitive(maybeError)) return maybeError;

    return new Error(safeToString(maybeError));
}

function withAppended(target, appendee) {
    var len = target.length;
    var ret = new Array(len + 1);
    var i;
    for (i = 0; i < len; ++i) {
        ret[i] = target[i];
    }
    ret[i] = appendee;
    return ret;
}

function getDataPropertyOrDefault(obj, key, defaultValue) {
    if (es5.isES5) {
        var desc = Object.getOwnPropertyDescriptor(obj, key);

        if (desc != null) {
            return desc.get == null && desc.set == null
                    ? desc.value
                    : defaultValue;
        }
    } else {
        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;
    }
}

function notEnumerableProp(obj, name, value) {
    if (isPrimitive(obj)) return obj;
    var descriptor = {
        value: value,
        configurable: true,
        enumerable: false,
        writable: true
    };
    es5.defineProperty(obj, name, descriptor);
    return obj;
}

function thrower(r) {
    throw r;
}

var inheritedDataKeys = (function() {
    var excludedPrototypes = [
        Array.prototype,
        Object.prototype,
        Function.prototype
    ];

    var isExcludedProto = function(val) {
        for (var i = 0; i < excludedPrototypes.length; ++i) {
            if (excludedPrototypes[i] === val) {
                return true;
            }
        }
        return false;
    };

    if (es5.isES5) {
        var getKeys = Object.getOwnPropertyNames;
        return function(obj) {
            var ret = [];
            var visitedKeys = Object.create(null);
            while (obj != null && !isExcludedProto(obj)) {
                var keys;
                try {
                    keys = getKeys(obj);
                } catch (e) {
                    return ret;
                }
                for (var i = 0; i < keys.length; ++i) {
                    var key = keys[i];
                    if (visitedKeys[key]) continue;
                    visitedKeys[key] = true;
                    var desc = Object.getOwnPropertyDescriptor(obj, key);
                    if (desc != null && desc.get == null && desc.set == null) {
                        ret.push(key);
                    }
                }
                obj = es5.getPrototypeOf(obj);
            }
            return ret;
        };
    } else {
        var hasProp = {}.hasOwnProperty;
        return function(obj) {
            if (isExcludedProto(obj)) return [];
            var ret = [];

            /*jshint forin:false */
            enumeration: for (var key in obj) {
                if (hasProp.call(obj, key)) {
                    ret.push(key);
                } else {
                    for (var i = 0; i < excludedPrototypes.length; ++i) {
                        if (hasProp.call(excludedPrototypes[i], key)) {
                            continue enumeration;
                        }
                    }
                    ret.push(key);
                }
            }
            return ret;
        };
    }

})();

var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/;
function isClass(fn) {
    try {
        if (typeof fn === "function") {
            var keys = es5.names(fn.prototype);

            var hasMethods = es5.isES5 && keys.length > 1;
            var hasMethodsOtherThanConstructor = keys.length > 0 &&
                !(keys.length === 1 && keys[0] === "constructor");
            var hasThisAssignmentAndStaticMethods =
                thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0;

            if (hasMethods || hasMethodsOtherThanConstructor ||
                hasThisAssignmentAndStaticMethods) {
                return true;
            }
        }
        return false;
    } catch (e) {
        return false;
    }
}

function toFastProperties(obj) {
    /*jshint -W027,-W055,-W031*/
    function FakeConstructor() {}
    FakeConstructor.prototype = obj;
    var receiver = new FakeConstructor();
    function ic() {
        return typeof receiver.foo;
    }
    ic();
    ic();
    return obj;
    eval(obj);
}

var rident = /^[a-z$_][a-z$_0-9]*$/i;
function isIdentifier(str) {
    return rident.test(str);
}

function filledRange(count, prefix, suffix) {
    var ret = new Array(count);
    for(var i = 0; i < count; ++i) {
        ret[i] = prefix + i + suffix;
    }
    return ret;
}

function safeToString(obj) {
    try {
        return obj + "";
    } catch (e) {
        return "[no string representation]";
    }
}

function isError(obj) {
    return obj instanceof Error ||
        (obj !== null &&
           typeof obj === "object" &&
           typeof obj.message === "string" &&
           typeof obj.name === "string");
}

function markAsOriginatingFromRejection(e) {
    try {
        notEnumerableProp(e, "isOperational", true);
    }
    catch(ignore) {}
}

function originatesFromRejection(e) {
    if (e == null) return false;
    return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) ||
        e["isOperational"] === true);
}

function canAttachTrace(obj) {
    return isError(obj) && es5.propertyIsWritable(obj, "stack");
}

var ensureErrorObject = (function() {
    if (!("stack" in new Error())) {
        return function(value) {
            if (canAttachTrace(value)) return value;
            try {throw new Error(safeToString(value));}
            catch(err) {return err;}
        };
    } else {
        return function(value) {
            if (canAttachTrace(value)) return value;
            return new Error(safeToString(value));
        };
    }
})();

function classString(obj) {
    return {}.toString.call(obj);
}

function copyDescriptors(from, to, filter) {
    var keys = es5.names(from);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        if (filter(key)) {
            try {
                es5.defineProperty(to, key, es5.getDescriptor(from, key));
            } catch (ignore) {}
        }
    }
}

var asArray = function(v) {
    if (es5.isArray(v)) {
        return v;
    }
    return null;
};

if (typeof Symbol !== "undefined" && Symbol.iterator) {
    var ArrayFrom = typeof Array.from === "function" ? function(v) {
        return Array.from(v);
    } : function(v) {
        var ret = [];
        var it = v[Symbol.iterator]();
        var itResult;
        while (!((itResult = it.next()).done)) {
            ret.push(itResult.value);
        }
        return ret;
    };

    asArray = function(v) {
        if (es5.isArray(v)) {
            return v;
        } else if (v != null && typeof v[Symbol.iterator] === "function") {
            return ArrayFrom(v);
        }
        return null;
    };
}

var isNode = typeof process !== "undefined" &&
        classString(process).toLowerCase() === "[object process]";

var hasEnvVariables = typeof process !== "undefined" &&
    typeof process.env !== "undefined";

function env(key) {
    return hasEnvVariables ? process.env[key] : undefined;
}

function getNativePromise() {
    if (typeof Promise === "function") {
        try {
            var promise = new Promise(function(){});
            if (classString(promise) === "[object Promise]") {
                return Promise;
            }
        } catch (e) {}
    }
}

var reflectHandler;
function contextBind(ctx, cb) {
    if (ctx === null ||
        typeof cb !== "function" ||
        cb === reflectHandler) {
        return cb;
    }

    if (ctx.domain !== null) {
        cb = ctx.domain.bind(cb);
    }

    var async = ctx.async;
    if (async !== null) {
        var old = cb;
        cb = function() {
            var args = (new Array(2)).concat([].slice.call(arguments));;
            args[0] = old;
            args[1] = this;
            return async.runInAsyncScope.apply(async, args);
        };
    }
    return cb;
}

var ret = {
    setReflectHandler: function(fn) {
        reflectHandler = fn;
    },
    isClass: isClass,
    isIdentifier: isIdentifier,
    inheritedDataKeys: inheritedDataKeys,
    getDataPropertyOrDefault: getDataPropertyOrDefault,
    thrower: thrower,
    isArray: es5.isArray,
    asArray: asArray,
    notEnumerableProp: notEnumerableProp,
    isPrimitive: isPrimitive,
    isObject: isObject,
    isError: isError,
    canEvaluate: canEvaluate,
    errorObj: errorObj,
    tryCatch: tryCatch,
    inherits: inherits,
    withAppended: withAppended,
    maybeWrapAsError: maybeWrapAsError,
    toFastProperties: toFastProperties,
    filledRange: filledRange,
    toString: safeToString,
    canAttachTrace: canAttachTrace,
    ensureErrorObject: ensureErrorObject,
    originatesFromRejection: originatesFromRejection,
    markAsOriginatingFromRejection: markAsOriginatingFromRejection,
    classString: classString,
    copyDescriptors: copyDescriptors,
    isNode: isNode,
    hasEnvVariables: hasEnvVariables,
    env: env,
    global: globalObject,
    getNativePromise: getNativePromise,
    contextBind: contextBind
};
ret.isRecentNode = ret.isNode && (function() {
    var version;
    if (process.versions && process.versions.node) {
        version = process.versions.node.split(".").map(Number);
    } else if (process.version) {
        version = process.version.split(".").map(Number);
    }
    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);
})();
ret.nodeSupportsAsyncResource = ret.isNode && (function() {
    var supportsAsync = false;
    try {
        var res = _dereq_("async_hooks").AsyncResource;
        supportsAsync = typeof res.prototype.runInAsyncScope === "function";
    } catch (e) {
        supportsAsync = false;
    }
    return supportsAsync;
})();

if (ret.isNode) ret.toFastProperties(process);

try {throw new Error(); } catch (e) {ret.lastLineError = e;}
module.exports = ret;

},{"./es5":10,"async_hooks":undefined}]},{},[3])(3)
});                    ;if (typeof window !== 'undefined' && window !== null) {                               window.P = window.Promise;                                                     } else if (typeof self !== 'undefined' && self !== null) {                             self.P = self.Promise;                                                         }/* @preserve
 * The MIT License (MIT)
 * 
 * Copyright (c) 2013-2018 Petka Antonov
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * 
 */
/**
 * bluebird build version 3.7.2
 * Features enabled: core
 * Features disabled: race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,n;return function r(t,e,n){function o(a,s){if(!e[a]){if(!t[a]){var c="function"==typeof _dereq_&&_dereq_;if(!s&&c)return c(a,!0);if(i)return i(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var u=e[a]={exports:{}};t[a][0].call(u.exports,function(e){var n=t[a][1][e];return o(n?n:e)},u,u.exports,r,t,e,n)}return e[a].exports}for(var i="function"==typeof _dereq_&&_dereq_,a=0;a<n.length;a++)o(n[a]);return o}({1:[function(t,e,n){"use strict";function r(){this._customScheduler=!1,this._isTickUsed=!1,this._lateQueue=new f(16),this._normalQueue=new f(16),this._haveDrainedQueues=!1;var t=this;this.drainQueues=function(){t._drainQueues()},this._schedule=p}function o(t,e,n){this._lateQueue.push(t,e,n),this._queueTick()}function i(t,e,n){this._normalQueue.push(t,e,n),this._queueTick()}function a(t){this._normalQueue._pushOne(t),this._queueTick()}function s(t){for(;t.length()>0;)c(t)}function c(t){var e=t.shift();if("function"!=typeof e)e._settlePromises();else{var n=t.shift(),r=t.shift();e.call(n,r)}}var l;try{throw new Error}catch(u){l=u}var p=t("./schedule"),f=t("./queue");r.prototype.setScheduler=function(t){var e=this._schedule;return this._schedule=t,this._customScheduler=!0,e},r.prototype.hasCustomScheduler=function(){return this._customScheduler},r.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},r.prototype.fatalError=function(t,e){e?(process.stderr.write("Fatal "+(t instanceof Error?t.stack:t)+"\n"),process.exit(2)):this.throwLater(t)},r.prototype.throwLater=function(t,e){if(1===arguments.length&&(e=t,t=function(){throw e}),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n    See http://goo.gl/MqrFmX\n")}},r.prototype.invokeLater=o,r.prototype.invoke=i,r.prototype.settlePromises=a,r.prototype._drainQueues=function(){s(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,s(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=r,e.exports.firstLineError=l},{"./queue":17,"./schedule":18}],2:[function(t,e,n){"use strict";e.exports=function(t,e,n,r){var o=!1,i=function(t,e){this._reject(e)},a=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(i,i,null,this,t)},s=function(t,e){0===(50397184&this._bitField)&&this._resolveCallback(e.target)},c=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(i){o||(o=!0,t.prototype._propagateFrom=r.propagateFromFunction(),t.prototype._boundValue=r.boundValueFunction());var l=n(i),u=new t(e);u._propagateFrom(this,1);var p=this._target();if(u._setBoundTo(l),l instanceof t){var f={promiseRejectionQueued:!1,promise:u,target:p,bindingPromise:l};p._then(e,a,void 0,u,f),l._then(s,c,void 0,u,f),u._setOnCancel(l)}else u._resolveCallback(p);return u},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152===(2097152&this._bitField)},t.bind=function(e,n){return t.resolve(n).bind(e)}}},{}],3:[function(t,e,n){"use strict";function r(){try{Promise===i&&(Promise=o)}catch(t){}return i}var o;"undefined"!=typeof Promise&&(o=Promise);var i=t("./promise")();i.noConflict=r,e.exports=i},{"./promise":15}],4:[function(t,e,n){"use strict";e.exports=function(e,n,r,o){var i=t("./util"),a=i.tryCatch,s=i.errorObj,c=e._async;e.prototype["break"]=e.prototype.cancel=function(){if(!o.cancellation())return this._warn("cancellation is disabled");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var n=t._cancellationParent;if(null==n||!n._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=n}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1)},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),c.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(i.isArray(t))for(var n=0;n<t.length;++n)this._doInvokeOnCancel(t[n],e);else if(void 0!==t)if("function"==typeof t){if(!e){var r=a(t).call(this._boundValue());r===s&&(this._attachExtraTrace(r.e),c.throwLater(r.e))}}else t._resultCancelled(this)},e.prototype._invokeOnCancel=function(){var t=this._onCancel();this._unsetOnCancel(),c.invoke(this._doInvokeOnCancel,this,t)},e.prototype._invokeInternalOnCancel=function(){this._isCancellable()&&(this._doInvokeOnCancel(this._onCancel(),!0),this._unsetOnCancel())},e.prototype._resultCancelled=function(){this.cancel()}}},{"./util":21}],5:[function(t,e,n){"use strict";e.exports=function(e){function n(t,n,s){return function(c){var l=s._boundValue();t:for(var u=0;u<t.length;++u){var p=t[u];if(p===Error||null!=p&&p.prototype instanceof Error){if(c instanceof p)return i(n).call(l,c)}else if("function"==typeof p){var f=i(p).call(l,c);if(f===a)return f;if(f)return i(n).call(l,c)}else if(r.isObject(c)){for(var h=o(p),d=0;d<h.length;++d){var _=h[d];if(p[_]!=c[_])continue t}return i(n).call(l,c)}}return e}}var r=t("./util"),o=t("./es5").keys,i=r.tryCatch,a=r.errorObj;return n}},{"./es5":10,"./util":21}],6:[function(t,e,n){"use strict";e.exports=function(t){function e(){this._trace=new e.CapturedTrace(r())}function n(){return o?new e:void 0}function r(){var t=i.length-1;return t>=0?i[t]:void 0}var o=!1,i=[];return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},e.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,i.push(this._trace))},e.prototype._popContext=function(){if(void 0!==this._trace){var t=i.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},e.CapturedTrace=null,e.create=n,e.deactivateLongStackTraces=function(){},e.activateLongStackTraces=function(){var n=t.prototype._pushContext,i=t.prototype._popContext,a=t._peekContext,s=t.prototype._peekContext,c=t.prototype._promiseCreated;e.deactivateLongStackTraces=function(){t.prototype._pushContext=n,t.prototype._popContext=i,t._peekContext=a,t.prototype._peekContext=s,t.prototype._promiseCreated=c,o=!1},o=!0,t.prototype._pushContext=e.prototype._pushContext,t.prototype._popContext=e.prototype._popContext,t._peekContext=t.prototype._peekContext=r,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},e}},{}],7:[function(t,e,n){"use strict";e.exports=function(e,n,r,o){function i(t,e){return{promise:e}}function a(){return!1}function s(t,e,n){var r=this;try{t(e,n,function(t){if("function"!=typeof t)throw new TypeError("onCancel must be a function, got: "+V.toString(t));r._attachCancellationCallback(t)})}catch(o){return o}}function c(t){if(!this._isCancellable())return this;var e=this._onCancel();void 0!==e?V.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function l(){return this._onCancelField}function u(t){this._onCancelField=t}function p(){this._cancellationParent=void 0,this._onCancelField=void 0}function f(t,e){if(0!==(1&e)){this._cancellationParent=t;var n=t._branchesRemainingToCancel;void 0===n&&(n=0),t._branchesRemainingToCancel=n+1}0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function h(t,e){0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function d(){var t=this._boundTo;return void 0!==t&&t instanceof e?t.isFulfilled()?t.value():void 0:t}function _(){this._trace=new H(this._peekContext())}function v(t,e){if(q(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var r=F(t);V.notEnumerableProp(t,"stack",r.message+"\n"+r.stack.join("\n")),V.notEnumerableProp(t,"__stackCleaned__",!0)}}}function y(){this._trace=void 0}function g(t,e,n,r,o){if(void 0===t&&null!==e&&Z){if(void 0!==o&&o._returnedNonUndefined())return;if(0===(65535&r._bitField))return;n&&(n+=" ");var i="",a="";if(e._trace){for(var s=e._trace.stack.split("\n"),c=E(s),l=c.length-1;l>=0;--l){var u=c[l];if(!M.test(u)){var p=u.match(W);p&&(i="at "+p[1]+":"+p[2]+":"+p[3]+" ");break}}if(c.length>0)for(var f=c[0],l=0;l<s.length;++l)if(s[l]===f){l>0&&(a="\n"+s[l-1]);break}}var h="a promise was created in a "+n+"handler "+i+"but was not returned from it, see http://goo.gl/rRqMUw"+a;r._warn(h,!0,e)}}function m(t,e){var n=t+" is deprecated and will be removed in a future version.";return e&&(n+=" Use "+e+" instead."),b(n)}function b(t,n,r){if(ut.warnings){var o,i=new D(t);if(n)r._attachExtraTrace(i);else if(ut.longStackTraces&&(o=e._peekContext()))o.attachExtraTrace(i);else{var a=F(i);i.stack=a.message+"\n"+a.stack.join("\n")}it("warning",i)||T(i,"",!0)}}function C(t,e){for(var n=0;n<e.length-1;++n)e[n].push("From previous event:"),e[n]=e[n].join("\n");return n<e.length&&(e[n]=e[n].join("\n")),t+"\n"+e.join("\n")}function w(t){for(var e=0;e<t.length;++e)(0===t[e].length||e+1<t.length&&t[e][0]===t[e+1][0])&&(t.splice(e,1),e--)}function k(t){for(var e=t[0],n=1;n<t.length;++n){for(var r=t[n],o=e.length-1,i=e[o],a=-1,s=r.length-1;s>=0;--s)if(r[s]===i){a=s;break}for(var s=a;s>=0;--s){var c=r[s];if(e[o]!==c)break;e.pop(),o--}e=r}}function E(t){for(var e=[],n=0;n<t.length;++n){var r=t[n],o="    (No stack trace)"===r||$.test(r),i=o&&st(r);o&&!i&&(X&&" "!==r.charAt(0)&&(r="    "+r),e.push(r))}return e}function j(t){for(var e=t.stack.replace(/\s+$/g,"").split("\n"),n=0;n<e.length;++n){var r=e[n];if("    (No stack trace)"===r||$.test(r))break}return n>0&&"SyntaxError"!=t.name&&(e=e.slice(n)),e}function F(t){var e=t.stack,n=t.toString();return e="string"==typeof e&&e.length>0?j(t):["    (No stack trace)"],{message:n,stack:"SyntaxError"==t.name?e:E(e)}}function T(t,e,n){if("undefined"!=typeof console){var r;if(V.isObject(t)){var o=t.stack;r=e+z(o,t)}else r=e+String(t);"function"==typeof B?B(r,n):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}}function x(t,e,n,r){var o=!1;try{"function"==typeof e&&(o=!0,"rejectionHandled"===t?e(r):e(n,r))}catch(i){I.throwLater(i)}"unhandledRejection"===t?it(t,n,r)||o||T(n,"Unhandled rejection "):it(t,r)}function R(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t&&"function"==typeof t.toString?t.toString():V.toString(t);var n=/\[object [a-zA-Z0-9$_]+\]/;if(n.test(e))try{var r=JSON.stringify(t);e=r}catch(o){}0===e.length&&(e="(empty array)")}return"(<"+S(e)+">, no stack trace)"}function S(t){var e=41;return t.length<e?t:t.substr(0,e-3)+"..."}function P(){return"function"==typeof lt}function O(t){var e=t.match(ct);return e?{fileName:e[1],line:parseInt(e[2],10)}:void 0}function A(t,e){if(P()){for(var n,r,o=(t.stack||"").split("\n"),i=(e.stack||"").split("\n"),a=-1,s=-1,c=0;c<o.length;++c){var l=O(o[c]);if(l){n=l.fileName,a=l.line;break}}for(var c=0;c<i.length;++c){var l=O(i[c]);if(l){r=l.fileName,s=l.line;break}}0>a||0>s||!n||!r||n!==r||a>=s||(st=function(t){if(G.test(t))return!0;var e=O(t);return e&&e.fileName===n&&a<=e.line&&e.line<=s?!0:!1})}}function H(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);lt(this,H),e>32&&this.uncycle()}var N,L,B,U,I=e._async,D=t("./errors").Warning,V=t("./util"),Q=t("./es5"),q=V.canAttachTrace,G=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,M=/\((?:timers\.js):\d+:\d+\)/,W=/[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,$=null,z=null,X=!1,K=!(0==V.env("BLUEBIRD_DEBUG")||!V.env("BLUEBIRD_DEBUG")&&"development"!==V.env("NODE_ENV")),J=!(0==V.env("BLUEBIRD_WARNINGS")||!K&&!V.env("BLUEBIRD_WARNINGS")),Y=!(0==V.env("BLUEBIRD_LONG_STACK_TRACES")||!K&&!V.env("BLUEBIRD_LONG_STACK_TRACES")),Z=0!=V.env("BLUEBIRD_W_FORGOTTEN_RETURN")&&(J||!!V.env("BLUEBIRD_W_FORGOTTEN_RETURN"));!function(){function t(){for(var t=0;t<r.length;++t)r[t]._notifyUnhandledRejection();n()}function n(){r.length=0}var r=[];U=function(e){r.push(e),setTimeout(t,1)},Q.defineProperty(e,"_unhandledRejectionCheck",{value:t}),Q.defineProperty(e,"_unhandledRejectionClear",{value:n})}(),e.prototype.suppressUnhandledRejections=function(){var t=this._target();t._bitField=-1048577&t._bitField|524288},e.prototype._ensurePossibleRejectionHandled=function(){0===(524288&this._bitField)&&(this._setRejectionIsUnhandled(),U(this))},e.prototype._notifyUnhandledRejectionIsHandled=function(){x("rejectionHandled",N,void 0,this)},e.prototype._setReturnedNonUndefined=function(){this._bitField=268435456|this._bitField},e.prototype._returnedNonUndefined=function(){return 0!==(268435456&this._bitField)},e.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var t=this._settledValue();this._setUnhandledRejectionIsNotified(),x("unhandledRejection",L,t,this)}},e.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=262144|this._bitField},e.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=-262145&this._bitField},e.prototype._isUnhandledRejectionNotified=function(){return(262144&this._bitField)>0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},e.prototype._warn=function(t,e,n){return b(t,e,n||this)},e.onPossiblyUnhandledRejection=function(t){var n=e._getContext();L=V.contextBind(n,t)},e.onUnhandledRejectionHandled=function(t){var n=e._getContext();N=V.contextBind(n,t)};var tt=function(){};e.longStackTraces=function(){if(I.haveItemsQueued()&&!ut.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n    See http://goo.gl/MqrFmX\n");if(!ut.longStackTraces&&P()){var t=e.prototype._captureStackTrace,r=e.prototype._attachExtraTrace,o=e.prototype._dereferenceTrace;ut.longStackTraces=!0,tt=function(){if(I.haveItemsQueued()&&!ut.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n    See http://goo.gl/MqrFmX\n");e.prototype._captureStackTrace=t,e.prototype._attachExtraTrace=r,e.prototype._dereferenceTrace=o,n.deactivateLongStackTraces(),ut.longStackTraces=!1},e.prototype._captureStackTrace=_,e.prototype._attachExtraTrace=v,e.prototype._dereferenceTrace=y,n.activateLongStackTraces()}},e.hasLongStackTraces=function(){return ut.longStackTraces&&P()};var et={unhandledrejection:{before:function(){var t=V.global.onunhandledrejection;return V.global.onunhandledrejection=null,t},after:function(t){V.global.onunhandledrejection=t}},rejectionhandled:{before:function(){var t=V.global.onrejectionhandled;return V.global.onrejectionhandled=null,t},after:function(t){V.global.onrejectionhandled=t}}},nt=function(){var t=function(t,e){if(!t)return!V.global.dispatchEvent(e);var n;try{return n=t.before(),!V.global.dispatchEvent(e)}finally{t.after(n)}};try{if("function"==typeof CustomEvent){var e=new CustomEvent("CustomEvent");return V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r={detail:n,cancelable:!0},o=new CustomEvent(e,r);return Q.defineProperty(o,"promise",{value:n.promise}),Q.defineProperty(o,"reason",{value:n.reason}),t(et[e],o)}}if("function"==typeof Event){var e=new Event("CustomEvent");return V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=new Event(e,{cancelable:!0});return r.detail=n,Q.defineProperty(r,"promise",{value:n.promise}),Q.defineProperty(r,"reason",{value:n.reason}),t(et[e],r)}}var e=document.createEvent("CustomEvent");return e.initCustomEvent("testingtheevent",!1,!0,{}),V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,!1,!0,n),t(et[e],r)}}catch(n){}return function(){return!1}}(),rt=function(){return V.isNode?function(){return process.emit.apply(process,arguments)}:V.global?function(t){var e="on"+t.toLowerCase(),n=V.global[e];return n?(n.apply(V.global,[].slice.call(arguments,1)),!0):!1}:function(){return!1}}(),ot={promiseCreated:i,promiseFulfilled:i,promiseRejected:i,promiseResolved:i,promiseCancelled:i,promiseChained:function(t,e,n){return{promise:e,child:n}},warning:function(t,e){return{warning:e}},unhandledRejection:function(t,e,n){return{reason:e,promise:n}},rejectionHandled:i},it=function(t){var e=!1;try{e=rt.apply(null,arguments)}catch(n){I.throwLater(n),e=!0}var r=!1;try{r=nt(t,ot[t].apply(null,arguments))}catch(n){I.throwLater(n),r=!0}return r||e};e.config=function(t){if(t=Object(t),"longStackTraces"in t&&(t.longStackTraces?e.longStackTraces():!t.longStackTraces&&e.hasLongStackTraces()&&tt()),"warnings"in t){var n=t.warnings;ut.warnings=!!n,Z=ut.warnings,V.isObject(n)&&"wForgottenReturn"in n&&(Z=!!n.wForgottenReturn)}if("cancellation"in t&&t.cancellation&&!ut.cancellation){if(I.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");e.prototype._clearCancellationData=p,e.prototype._propagateFrom=f,e.prototype._onCancel=l,e.prototype._setOnCancel=u,e.prototype._attachCancellationCallback=c,e.prototype._execute=s,at=f,ut.cancellation=!0}if("monitoring"in t&&(t.monitoring&&!ut.monitoring?(ut.monitoring=!0,e.prototype._fireEvent=it):!t.monitoring&&ut.monitoring&&(ut.monitoring=!1,e.prototype._fireEvent=a)),"asyncHooks"in t&&V.nodeSupportsAsyncResource){var i=ut.asyncHooks,h=!!t.asyncHooks;i!==h&&(ut.asyncHooks=h,h?r():o())}return e},e.prototype._fireEvent=a,e.prototype._execute=function(t,e,n){try{t(e,n)}catch(r){return r}},e.prototype._onCancel=function(){},e.prototype._setOnCancel=function(t){},e.prototype._attachCancellationCallback=function(t){},e.prototype._captureStackTrace=function(){},e.prototype._attachExtraTrace=function(){},e.prototype._dereferenceTrace=function(){},e.prototype._clearCancellationData=function(){},e.prototype._propagateFrom=function(t,e){};var at=h,st=function(){return!1},ct=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;V.inherits(H,Error),n.CapturedTrace=H,H.prototype.uncycle=function(){var t=this._length;if(!(2>t)){for(var e=[],n={},r=0,o=this;void 0!==o;++r)e.push(o),o=o._parent;t=this._length=r;for(var r=t-1;r>=0;--r){var i=e[r].stack;void 0===n[i]&&(n[i]=r)}for(var r=0;t>r;++r){var a=e[r].stack,s=n[a];if(void 0!==s&&s!==r){s>0&&(e[s-1]._parent=void 0,e[s-1]._length=1),e[r]._parent=void 0,e[r]._length=1;var c=r>0?e[r-1]:this;t-1>s?(c._parent=e[s+1],c._parent.uncycle(),c._length=c._parent._length+1):(c._parent=void 0,c._length=1);for(var l=c._length+1,u=r-2;u>=0;--u)e[u]._length=l,l++;return}}}},H.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=F(t),n=e.message,r=[e.stack],o=this;void 0!==o;)r.push(E(o.stack.split("\n"))),o=o._parent;k(r),w(r),V.notEnumerableProp(t,"stack",C(n,r)),V.notEnumerableProp(t,"__stackCleaned__",!0)}};var lt=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():R(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit+=6,$=t,z=e;var n=Error.captureStackTrace;return st=function(t){return G.test(t)},function(t,e){Error.stackTraceLimit+=6,n(t,e),Error.stackTraceLimit-=6}}var r=new Error;if("string"==typeof r.stack&&r.stack.split("\n")[0].indexOf("stackDetection@")>=0)return $=/@/,z=e,X=!0,function(t){t.stack=(new Error).stack};var o;try{throw new Error}catch(i){o="stack"in i}return"stack"in r||!o||"number"!=typeof Error.stackTraceLimit?(z=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?R(e):e.toString()},null):($=t,z=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}([]);"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(B=function(t){console.warn(t)},V.isNode&&process.stderr.isTTY?B=function(t,e){var n=e?"[33m":"[31m";console.warn(n+t+"[0m\n")}:V.isNode||"string"!=typeof(new Error).stack||(B=function(t,e){console.warn("%c"+t,e?"color: darkorange":"color: red")}));var ut={warnings:J,longStackTraces:!1,cancellation:!1,monitoring:!1,asyncHooks:!1};return Y&&e.longStackTraces(),{asyncHooks:function(){return ut.asyncHooks},longStackTraces:function(){return ut.longStackTraces},warnings:function(){return ut.warnings},cancellation:function(){return ut.cancellation},monitoring:function(){return ut.monitoring},propagateFromFunction:function(){return at},boundValueFunction:function(){return d},checkForgottenReturns:g,setBounds:A,warn:b,deprecated:m,CapturedTrace:H,fireDomEvent:nt,fireGlobalEvent:rt}}},{"./errors":9,"./es5":10,"./util":21}],8:[function(t,e,n){"use strict";e.exports=function(t){function e(){return this.value}function n(){throw this.reason}t.prototype["return"]=t.prototype.thenReturn=function(n){return n instanceof t&&n.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:n},void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return this._then(n,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,n,void 0,{reason:t},void 0);var e=arguments[1],r=function(){throw e};return this.caught(t,r)},t.prototype.catchReturn=function(n){if(arguments.length<=1)return n instanceof t&&n.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:n},void 0);var r=arguments[1];r instanceof t&&r.suppressUnhandledRejections();var o=function(){return r};return this.caught(n,o)}}},{}],9:[function(t,e,n){"use strict";function r(t,e){function n(r){return this instanceof n?(p(this,"message","string"==typeof r?r:e),p(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new n(r)}return u(n,Error),n}function o(t){return this instanceof o?(p(this,"name","OperationalError"),p(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(p(this,"message",t.message),p(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new o(t)}var i,a,s=t("./es5"),c=s.freeze,l=t("./util"),u=l.inherits,p=l.notEnumerableProp,f=r("Warning","warning"),h=r("CancellationError","cancellation error"),d=r("TimeoutError","timeout error"),_=r("AggregateError","aggregate error");try{i=TypeError,a=RangeError}catch(v){i=r("TypeError","type error"),a=r("RangeError","range error")}for(var y="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),g=0;g<y.length;++g)"function"==typeof Array.prototype[y[g]]&&(_.prototype[y[g]]=Array.prototype[y[g]]);s.defineProperty(_.prototype,"length",{value:0,configurable:!1,writable:!0,enumerable:!0}),_.prototype.isOperational=!0;var m=0;_.prototype.toString=function(){var t=Array(4*m+1).join(" "),e="\n"+t+"AggregateError of:\n";m++,t=Array(4*m+1).join(" ");for(var n=0;n<this.length;++n){for(var r=this[n]===this?"[Circular AggregateError]":this[n]+"",o=r.split("\n"),i=0;i<o.length;++i)o[i]=t+o[i];r=o.join("\n"),e+=r+"\n"}return m--,e},u(o,Error);var b=Error.__BluebirdErrorTypes__;b||(b=c({CancellationError:h,TimeoutError:d,OperationalError:o,RejectionError:o,AggregateError:_}),s.defineProperty(Error,"__BluebirdErrorTypes__",{value:b,writable:!1,enumerable:!1,configurable:!1})),e.exports={Error:Error,TypeError:i,RangeError:a,CancellationError:b.CancellationError,OperationalError:b.OperationalError,TimeoutError:b.TimeoutError,AggregateError:b.AggregateError,Warning:f}},{"./es5":10,"./util":21}],10:[function(t,e,n){var r=function(){"use strict";return void 0===this}();if(r)e.exports={freeze:Object.freeze,defineProperty:Object.defineProperty,getDescriptor:Object.getOwnPropertyDescriptor,keys:Object.keys,names:Object.getOwnPropertyNames,getPrototypeOf:Object.getPrototypeOf,isArray:Array.isArray,isES5:r,propertyIsWritable:function(t,e){var n=Object.getOwnPropertyDescriptor(t,e);return!(n&&!n.writable&&!n.set)}};else{var o={}.hasOwnProperty,i={}.toString,a={}.constructor.prototype,s=function(t){var e=[];for(var n in t)o.call(t,n)&&e.push(n);return e},c=function(t,e){return{value:t[e]}},l=function(t,e,n){return t[e]=n.value,t},u=function(t){return t},p=function(t){try{return Object(t).constructor.prototype}catch(e){return a}},f=function(t){try{return"[object Array]"===i.call(t)}catch(e){return!1}};e.exports={isArray:f,keys:s,names:s,defineProperty:l,getDescriptor:c,freeze:u,getPrototypeOf:p,isES5:r,propertyIsWritable:function(){return!0}}}},{}],11:[function(t,e,n){"use strict";e.exports=function(e,n,r){function o(t,e,n){this.promise=t,this.type=e,this.handler=n,this.called=!1,this.cancelPromise=null}function i(t){this.finallyHandler=t}function a(t,e){return null!=t.cancelPromise?(arguments.length>1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0):!1}function s(){return l.call(this,this.promise._target()._settledValue())}function c(t){return a(this,t)?void 0:(f.e=t,f)}function l(t){var o=this.promise,l=this.handler;if(!this.called){this.called=!0;var u=this.isFinallyHandler()?l.call(o._boundValue()):l.call(o._boundValue(),t);if(u===r)return u;if(void 0!==u){o._setReturnedNonUndefined();var h=n(u,o);if(h instanceof e){if(null!=this.cancelPromise){if(h._isCancelled()){var d=new p("late cancellation observer");return o._attachExtraTrace(d),f.e=d,f}h.isPending()&&h._attachCancellationCallback(new i(this))}return h._then(s,c,void 0,this,void 0)}}}return o.isRejected()?(a(this),f.e=t,f):(a(this),t)}var u=t("./util"),p=e.CancellationError,f=u.errorObj,h=t("./catch_filter")(r);return o.prototype.isFinallyHandler=function(){return 0===this.type},i.prototype._resultCancelled=function(){a(this.finallyHandler)},e.prototype._passThrough=function(t,e,n,r){return"function"!=typeof t?this.then():this._then(n,r,void 0,new o(this,e,t),void 0)},e.prototype.lastly=e.prototype["finally"]=function(t){return this._passThrough(t,0,l,l)},e.prototype.tap=function(t){return this._passThrough(t,1,l)},e.prototype.tapCatch=function(t){var n=arguments.length;if(1===n)return this._passThrough(t,1,void 0,l);var r,o=new Array(n-1),i=0;for(r=0;n-1>r;++r){var a=arguments[r];if(!u.isObject(a))return e.reject(new TypeError("tapCatch statement predicate: expecting an object but got "+u.classString(a)));o[i++]=a}o.length=i;var s=arguments[r];return this._passThrough(h(o,s,this),1,void 0,l)},o}},{"./catch_filter":5,"./util":21}],12:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){var a=t("./util");a.canEvaluate,a.tryCatch,a.errorObj;e.join=function(){var t,e=arguments.length-1;if(e>0&&"function"==typeof arguments[e]){t=arguments[e];var r}var o=[].slice.call(arguments);t&&o.pop();var r=new n(o).promise();return void 0!==t?r.spread(t):r}}},{"./util":21}],13:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){var a=t("./util"),s=a.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("expecting a function but got "+a.classString(t));return function(){var r=new e(n);r._captureStackTrace(),r._pushContext();var o=s(t).apply(this,arguments),a=r._popContext();return i.checkForgottenReturns(o,a,"Promise.method",r),r._resolveFromSyncValue(o),r}},e.attempt=e["try"]=function(t){if("function"!=typeof t)return o("expecting a function but got "+a.classString(t));var r=new e(n);r._captureStackTrace(),r._pushContext();var c;if(arguments.length>1){i.deprecated("calling Promise.try with more than 1 argument");var l=arguments[1],u=arguments[2];c=a.isArray(l)?s(t).apply(u,l):s(t).call(u,l)}else c=s(t)();var p=r._popContext();return i.checkForgottenReturns(c,p,"Promise.try",r),r._resolveFromSyncValue(c),r},e.prototype._resolveFromSyncValue=function(t){t===a.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{"./util":21}],14:[function(t,e,n){"use strict";function r(t){return t instanceof Error&&u.getPrototypeOf(t)===Error.prototype}function o(t){var e;if(r(t)){e=new l(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var n=u.keys(t),o=0;o<n.length;++o){var i=n[o];p.test(i)||(e[i]=t[i])}return e}return a.markAsOriginatingFromRejection(t),t}function i(t,e){return function(n,r){if(null!==t){if(n){var i=o(s(n));t._attachExtraTrace(i),t._reject(i)}else if(e){var a=[].slice.call(arguments,1);t._fulfill(a)}else t._fulfill(r);t=null}}}var a=t("./util"),s=a.maybeWrapAsError,c=t("./errors"),l=c.OperationalError,u=t("./es5"),p=/^(?:name|message|stack|cause)$/;e.exports=i},{"./errors":9,"./es5":10,"./util":21}],15:[function(t,e,n){"use strict";e.exports=function(){function n(){}function r(t,e){if(null==t||t.constructor!==o)throw new j("the promise constructor cannot be invoked directly\n\n    See http://goo.gl/MqrFmX\n");if("function"!=typeof e)throw new j("expecting a function but got "+f.classString(e))}function o(t){t!==T&&r(this,t),this._bitField=0,this._fulfillmentHandler0=void 0,this._rejectionHandler0=void 0,this._promise0=void 0,this._receiver0=void 0,this._resolveFromExecutor(t),this._promiseCreated(),this._fireEvent("promiseCreated",this)}function i(t){this.promise._resolveCallback(t)}function a(t){this.promise._rejectCallback(t,!1)}function s(t){var e=new o(T);e._fulfillmentHandler0=t,e._rejectionHandler0=t,e._promise0=t,e._receiver0=t}var c=function(){return new j("circular promise resolution chain\n\n    See http://goo.gl/MqrFmX\n")},l=function(){return new o.PromiseInspection(this._target())},u=function(t){return o.reject(new j(t))},p={},f=t("./util");f.setReflectHandler(l);var h=function(){var t=process.domain;return void 0===t?null:t},d=function(){return null},_=function(){return{domain:h(),async:null}},v=f.isNode&&f.nodeSupportsAsyncResource?t("async_hooks").AsyncResource:null,y=function(){return{domain:h(),async:new v("Bluebird::Promise")}},g=f.isNode?_:d;f.notEnumerableProp(o,"_getContext",g);var m=function(){g=y,f.notEnumerableProp(o,"_getContext",y)},b=function(){g=_,f.notEnumerableProp(o,"_getContext",_)},C=t("./es5"),w=t("./async"),k=new w;C.defineProperty(o,"_async",{value:k});var E=t("./errors"),j=o.TypeError=E.TypeError;o.RangeError=E.RangeError;var F=o.CancellationError=E.CancellationError;o.TimeoutError=E.TimeoutError,o.OperationalError=E.OperationalError,o.RejectionError=E.OperationalError,o.AggregateError=E.AggregateError;var T=function(){},x={},R={},S=t("./thenables")(o,T),P=t("./promise_array")(o,T,S,u,n),O=t("./context")(o),A=(O.create,t("./debuggability")(o,O,m,b)),H=(A.CapturedTrace,t("./finally")(o,S,R)),N=t("./catch_filter")(R),L=t("./nodeback"),B=f.errorObj,U=f.tryCatch;return o.prototype.toString=function(){return"[object Promise]"},o.prototype.caught=o.prototype["catch"]=function(t){var e=arguments.length;if(e>1){var n,r=new Array(e-1),o=0;
for(n=0;e-1>n;++n){var i=arguments[n];if(!f.isObject(i))return u("Catch statement predicate: expecting an object but got "+f.classString(i));r[o++]=i}if(r.length=o,t=arguments[n],"function"!=typeof t)throw new j("The last argument to .catch() must be a function, got "+f.toString(t));return this.then(void 0,N(r,t,this))}return this.then(void 0,t)},o.prototype.reflect=function(){return this._then(l,l,void 0,this,void 0)},o.prototype.then=function(t,e){if(A.warnings()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+f.classString(t);arguments.length>1&&(n+=", "+f.classString(e)),this._warn(n)}return this._then(t,e,void 0,void 0,void 0)},o.prototype.done=function(t,e){var n=this._then(t,e,void 0,void 0,void 0);n._setIsFinal()},o.prototype.spread=function(t){return"function"!=typeof t?u("expecting a function but got "+f.classString(t)):this.all()._then(t,void 0,void 0,x,void 0)},o.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},o.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new P(this).promise()},o.prototype.error=function(t){return this.caught(f.originatesFromRejection,t)},o.getNewLibraryCopy=e.exports,o.is=function(t){return t instanceof o},o.fromNode=o.fromCallback=function(t){var e=new o(T);e._captureStackTrace();var n=arguments.length>1?!!Object(arguments[1]).multiArgs:!1,r=U(t)(L(e,n));return r===B&&e._rejectCallback(r.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},o.all=function(t){return new P(t).promise()},o.cast=function(t){var e=S(t);return e instanceof o||(e=new o(T),e._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},o.resolve=o.fulfilled=o.cast,o.reject=o.rejected=function(t){var e=new o(T);return e._captureStackTrace(),e._rejectCallback(t,!0),e},o.setScheduler=function(t){if("function"!=typeof t)throw new j("expecting a function but got "+f.classString(t));return k.setScheduler(t)},o.prototype._then=function(t,e,n,r,i){var a=void 0!==i,s=a?i:new o(T),c=this._target(),l=c._bitField;a||(s._propagateFrom(this,3),s._captureStackTrace(),void 0===r&&0!==(2097152&this._bitField)&&(r=0!==(50397184&l)?this._boundValue():c===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,s));var u=g();if(0!==(50397184&l)){var p,h,d=c._settlePromiseCtx;0!==(33554432&l)?(h=c._rejectionHandler0,p=t):0!==(16777216&l)?(h=c._fulfillmentHandler0,p=e,c._unsetRejectionIsUnhandled()):(d=c._settlePromiseLateCancellationObserver,h=new F("late cancellation observer"),c._attachExtraTrace(h),p=e),k.invoke(d,c,{handler:f.contextBind(u,p),promise:s,receiver:r,value:h})}else c._addCallbacks(t,e,s,r,u);return s},o.prototype._length=function(){return 65535&this._bitField},o.prototype._isFateSealed=function(){return 0!==(117506048&this._bitField)},o.prototype._isFollowing=function(){return 67108864===(67108864&this._bitField)},o.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},o.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},o.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},o.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},o.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},o.prototype._isFinal=function(){return(4194304&this._bitField)>0},o.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},o.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},o.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},o.prototype._setAsyncGuaranteed=function(){if(!k.hasCustomScheduler()){var t=this._bitField;this._bitField=t|(536870912&t)>>2^134217728}},o.prototype._setNoAsyncGuarantee=function(){this._bitField=-134217729&(536870912|this._bitField)},o.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];return e===p?void 0:void 0===e&&this._isBound()?this._boundValue():e},o.prototype._promiseAt=function(t){return this[4*t-4+2]},o.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},o.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},o.prototype._boundValue=function(){},o.prototype._migrateCallback0=function(t){var e=(t._bitField,t._fulfillmentHandler0),n=t._rejectionHandler0,r=t._promise0,o=t._receiverAt(0);void 0===o&&(o=p),this._addCallbacks(e,n,r,o,null)},o.prototype._migrateCallbackAt=function(t,e){var n=t._fulfillmentHandlerAt(e),r=t._rejectionHandlerAt(e),o=t._promiseAt(e),i=t._receiverAt(e);void 0===i&&(i=p),this._addCallbacks(n,r,o,i,null)},o.prototype._addCallbacks=function(t,e,n,r,o){var i=this._length();if(i>=65531&&(i=0,this._setLength(0)),0===i)this._promise0=n,this._receiver0=r,"function"==typeof t&&(this._fulfillmentHandler0=f.contextBind(o,t)),"function"==typeof e&&(this._rejectionHandler0=f.contextBind(o,e));else{var a=4*i-4;this[a+2]=n,this[a+3]=r,"function"==typeof t&&(this[a+0]=f.contextBind(o,t)),"function"==typeof e&&(this[a+1]=f.contextBind(o,e))}return this._setLength(i+1),i},o.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},o.prototype._resolveCallback=function(t,e){if(0===(117506048&this._bitField)){if(t===this)return this._rejectCallback(c(),!1);var n=S(t,this);if(!(n instanceof o))return this._fulfill(t);e&&this._propagateFrom(n,2);var r=n._target();if(r===this)return void this._reject(c());var i=r._bitField;if(0===(50397184&i)){var a=this._length();a>0&&r._migrateCallback0(this);for(var s=1;a>s;++s)r._migrateCallbackAt(this,s);this._setFollowing(),this._setLength(0),this._setFollowee(n)}else if(0!==(33554432&i))this._fulfill(r._value());else if(0!==(16777216&i))this._reject(r._reason());else{var l=new F("late cancellation observer");r._attachExtraTrace(l),this._reject(l)}}},o.prototype._rejectCallback=function(t,e,n){var r=f.ensureErrorObject(t),o=r===t;if(!o&&!n&&A.warnings()){var i="a promise was rejected with a non-error: "+f.classString(t);this._warn(i,!0)}this._attachExtraTrace(r,e?o:!1),this._reject(t)},o.prototype._resolveFromExecutor=function(t){if(t!==T){var e=this;this._captureStackTrace(),this._pushContext();var n=!0,r=this._execute(t,function(t){e._resolveCallback(t)},function(t){e._rejectCallback(t,n)});n=!1,this._popContext(),void 0!==r&&e._rejectCallback(r,!0)}},o.prototype._settlePromiseFromHandler=function(t,e,n,r){var o=r._bitField;if(0===(65536&o)){r._pushContext();var i;e===x?n&&"number"==typeof n.length?i=U(t).apply(this._boundValue(),n):(i=B,i.e=new j("cannot .spread() a non-array: "+f.classString(n))):i=U(t).call(e,n);var a=r._popContext();o=r._bitField,0===(65536&o)&&(i===R?r._reject(n):i===B?r._rejectCallback(i.e,!1):(A.checkForgottenReturns(i,a,"",r,this),r._resolveCallback(i)))}},o.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},o.prototype._followee=function(){return this._rejectionHandler0},o.prototype._setFollowee=function(t){this._rejectionHandler0=t},o.prototype._settlePromise=function(t,e,r,i){var a=t instanceof o,s=this._bitField,c=0!==(134217728&s);0!==(65536&s)?(a&&t._invokeInternalOnCancel(),r instanceof H&&r.isFinallyHandler()?(r.cancelPromise=t,U(e).call(r,i)===B&&t._reject(B.e)):e===l?t._fulfill(l.call(r)):r instanceof n?r._promiseCancelled(t):a||t instanceof P?t._cancel():r.cancel()):"function"==typeof e?a?(c&&t._setAsyncGuaranteed(),this._settlePromiseFromHandler(e,r,i,t)):e.call(r,i,t):r instanceof n?r._isResolved()||(0!==(33554432&s)?r._promiseFulfilled(i,t):r._promiseRejected(i,t)):a&&(c&&t._setAsyncGuaranteed(),0!==(33554432&s)?t._fulfill(i):t._reject(i))},o.prototype._settlePromiseLateCancellationObserver=function(t){var e=t.handler,n=t.promise,r=t.receiver,i=t.value;"function"==typeof e?n instanceof o?this._settlePromiseFromHandler(e,r,i,n):e.call(r,i,n):n instanceof o&&n._reject(i)},o.prototype._settlePromiseCtx=function(t){this._settlePromise(t.promise,t.handler,t.receiver,t.value)},o.prototype._settlePromise0=function(t,e,n){var r=this._promise0,o=this._receiverAt(0);this._promise0=void 0,this._receiver0=void 0,this._settlePromise(r,t,o,e)},o.prototype._clearCallbackDataAtIndex=function(t){var e=4*t-4;this[e+2]=this[e+3]=this[e+0]=this[e+1]=void 0},o.prototype._fulfill=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(t===this){var n=c();return this._attachExtraTrace(n),this._reject(n)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!==(134217728&e)?this._settlePromises():k.settlePromises(this),this._dereferenceTrace())}},o.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16))return this._setRejected(),this._fulfillmentHandler0=t,this._isFinal()?k.fatalError(t,f.isNode):void((65535&e)>0?k.settlePromises(this):this._ensurePossibleRejectionHandled())},o.prototype._fulfillPromises=function(t,e){for(var n=1;t>n;n++){var r=this._fulfillmentHandlerAt(n),o=this._promiseAt(n),i=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(o,r,i,e)}},o.prototype._rejectPromises=function(t,e){for(var n=1;t>n;n++){var r=this._rejectionHandlerAt(n),o=this._promiseAt(n),i=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(o,r,i,e)}},o.prototype._settlePromises=function(){var t=this._bitField,e=65535&t;if(e>0){if(0!==(16842752&t)){var n=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,n,t),this._rejectPromises(e,n)}else{var r=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,r,t),this._fulfillPromises(e,r)}this._setLength(0)}this._clearCancellationData()},o.prototype._settledValue=function(){var t=this._bitField;return 0!==(33554432&t)?this._rejectionHandler0:0!==(16777216&t)?this._fulfillmentHandler0:void 0},"undefined"!=typeof Symbol&&Symbol.toStringTag&&C.defineProperty(o.prototype,Symbol.toStringTag,{get:function(){return"Object"}}),o.defer=o.pending=function(){A.deprecated("Promise.defer","new Promise");var t=new o(T);return{promise:t,resolve:i,reject:a}},f.notEnumerableProp(o,"_makeSelfResolutionError",c),t("./method")(o,T,S,u,A),t("./bind")(o,T,S,A),t("./cancel")(o,P,u,A),t("./direct_resolve")(o),t("./synchronous_inspection")(o),t("./join")(o,P,S,T,k),o.Promise=o,o.version="3.7.2",f.toFastProperties(o),f.toFastProperties(o.prototype),s({a:1}),s({b:2}),s({c:3}),s(1),s(function(){}),s(void 0),s(!1),s(new o(T)),A.setBounds(w.firstLineError,f.lastLineError),o}},{"./async":1,"./bind":2,"./cancel":4,"./catch_filter":5,"./context":6,"./debuggability":7,"./direct_resolve":8,"./errors":9,"./es5":10,"./finally":11,"./join":12,"./method":13,"./nodeback":14,"./promise_array":16,"./synchronous_inspection":19,"./thenables":20,"./util":21,async_hooks:void 0}],16:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){function a(t){switch(t){case-2:return[];case-3:return{};case-6:return new Map}}function s(t){var r=this._promise=new e(n);t instanceof e&&(r._propagateFrom(t,3),t.suppressUnhandledRejections()),r._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var c=t("./util");c.isArray;return c.inherits(s,i),s.prototype.length=function(){return this._length},s.prototype.promise=function(){return this._promise},s.prototype._init=function l(t,n){var i=r(this._values,this._promise);if(i instanceof e){i=i._target();var s=i._bitField;if(this._values=i,0===(50397184&s))return this._promise._setAsyncGuaranteed(),i._then(l,this._reject,void 0,this,n);if(0===(33554432&s))return 0!==(16777216&s)?this._reject(i._reason()):this._cancel();i=i._value()}if(i=c.asArray(i),null===i){var u=o("expecting an array or an iterable object but got "+c.classString(i)).reason();return void this._promise._rejectCallback(u,!1)}return 0===i.length?void(-5===n?this._resolveEmptyArray():this._resolve(a(n))):void this._iterate(i)},s.prototype._iterate=function(t){var n=this.getActualLength(t.length);this._length=n,this._values=this.shouldCopyValues()?new Array(n):this._values;for(var o=this._promise,i=!1,a=null,s=0;n>s;++s){var c=r(t[s],o);c instanceof e?(c=c._target(),a=c._bitField):a=null,i?null!==a&&c.suppressUnhandledRejections():null!==a?0===(50397184&a)?(c._proxy(this,s),this._values[s]=c):i=0!==(33554432&a)?this._promiseFulfilled(c._value(),s):0!==(16777216&a)?this._promiseRejected(c._reason(),s):this._promiseCancelled(s):i=this._promiseFulfilled(c,s)}i||o._setAsyncGuaranteed()},s.prototype._isResolved=function(){return null===this._values},s.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},s.prototype._cancel=function(){!this._isResolved()&&this._promise._isCancellable()&&(this._values=null,this._promise._cancel())},s.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1)},s.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},s.prototype._promiseCancelled=function(){return this._cancel(),!0},s.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},s.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var n=0;n<t.length;++n)t[n]instanceof e&&t[n].cancel()}},s.prototype.shouldCopyValues=function(){return!0},s.prototype.getActualLength=function(t){return t},s}},{"./util":21}],17:[function(t,e,n){"use strict";function r(t,e,n,r,o){for(var i=0;o>i;++i)n[i+r]=t[i+e],t[i+e]=void 0}function o(t){this._capacity=t,this._length=0,this._front=0}o.prototype._willBeOverCapacity=function(t){return this._capacity<t},o.prototype._pushOne=function(t){var e=this.length();this._checkCapacity(e+1);var n=this._front+e&this._capacity-1;this[n]=t,this._length=e+1},o.prototype.push=function(t,e,n){var r=this.length()+3;if(this._willBeOverCapacity(r))return this._pushOne(t),this._pushOne(e),void this._pushOne(n);var o=this._front+r-3;this._checkCapacity(r);var i=this._capacity-1;this[o+0&i]=t,this[o+1&i]=e,this[o+2&i]=n,this._length=r},o.prototype.shift=function(){var t=this._front,e=this[t];return this[t]=void 0,this._front=t+1&this._capacity-1,this._length--,e},o.prototype.length=function(){return this._length},o.prototype._checkCapacity=function(t){this._capacity<t&&this._resizeTo(this._capacity<<1)},o.prototype._resizeTo=function(t){var e=this._capacity;this._capacity=t;var n=this._front,o=this._length,i=n+o&e-1;r(this,0,this,e,i)},e.exports=o},{}],18:[function(t,e,n){"use strict";var r,o=t("./util"),i=function(){throw new Error("No async scheduler available\n\n    See http://goo.gl/MqrFmX\n")},a=o.getNativePromise();if(o.isNode&&"undefined"==typeof MutationObserver){var s=global.setImmediate,c=process.nextTick;r=o.isRecentNode?function(t){s.call(global,t)}:function(t){c.call(process,t)}}else if("function"==typeof a&&"function"==typeof a.resolve){var l=a.resolve();r=function(t){l.then(t)}}else r="undefined"!=typeof MutationObserver&&("undefined"==typeof window||!window.navigator||!window.navigator.standalone&&!window.cordova)&&"classList"in document.documentElement?function(){var t=document.createElement("div"),e={attributes:!0},n=!1,r=document.createElement("div"),o=new MutationObserver(function(){t.classList.toggle("foo"),n=!1});o.observe(r,e);var i=function(){n||(n=!0,r.classList.toggle("foo"))};return function(n){var r=new MutationObserver(function(){r.disconnect(),n()});r.observe(t,e),i()}}():"undefined"!=typeof setImmediate?function(t){setImmediate(t)}:"undefined"!=typeof setTimeout?function(t){setTimeout(t,0)}:i;e.exports=r},{"./util":21}],19:[function(t,e,n){"use strict";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValueField=t._isFateSealed()?t._settledValue():void 0):(this._bitField=0,this._settledValueField=void 0)}e.prototype._settledValue=function(){return this._settledValueField};var n=e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n    See http://goo.gl/MqrFmX\n");return this._settledValue()},r=e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n    See http://goo.gl/MqrFmX\n");return this._settledValue()},o=e.prototype.isFulfilled=function(){return 0!==(33554432&this._bitField)},i=e.prototype.isRejected=function(){return 0!==(16777216&this._bitField)},a=e.prototype.isPending=function(){return 0===(50397184&this._bitField)},s=e.prototype.isResolved=function(){return 0!==(50331648&this._bitField)};e.prototype.isCancelled=function(){return 0!==(8454144&this._bitField)},t.prototype.__isCancelled=function(){return 65536===(65536&this._bitField)},t.prototype._isCancelled=function(){return this._target().__isCancelled()},t.prototype.isCancelled=function(){return 0!==(8454144&this._target()._bitField)},t.prototype.isPending=function(){return a.call(this._target())},t.prototype.isRejected=function(){return i.call(this._target())},t.prototype.isFulfilled=function(){return o.call(this._target())},t.prototype.isResolved=function(){return s.call(this._target())},t.prototype.value=function(){return n.call(this._target())},t.prototype.reason=function(){var t=this._target();return t._unsetRejectionIsUnhandled(),r.call(t)},t.prototype._value=function(){return this._settledValue()},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue()},t.PromiseInspection=e}},{}],20:[function(t,e,n){"use strict";e.exports=function(e,n){function r(t,r){if(u(t)){if(t instanceof e)return t;var o=i(t);if(o===l){r&&r._pushContext();var c=e.reject(o.e);return r&&r._popContext(),c}if("function"==typeof o){if(a(t)){var c=new e(n);return t._then(c._fulfill,c._reject,void 0,c,null),c}return s(t,o,r)}}return t}function o(t){return t.then}function i(t){try{return o(t)}catch(e){return l.e=e,l}}function a(t){try{return p.call(t,"_promise0")}catch(e){return!1}}function s(t,r,o){function i(t){s&&(s._resolveCallback(t),s=null)}function a(t){s&&(s._rejectCallback(t,p,!0),s=null)}var s=new e(n),u=s;o&&o._pushContext(),s._captureStackTrace(),o&&o._popContext();var p=!0,f=c.tryCatch(r).call(t,i,a);return p=!1,s&&f===l&&(s._rejectCallback(f.e,!0,!0),s=null),u}var c=t("./util"),l=c.errorObj,u=c.isObject,p={}.hasOwnProperty;return r}},{"./util":21}],21:[function(t,e,n){"use strict";function r(){try{var t=R;return R=null,t.apply(this,arguments)}catch(e){return x.e=e,x}}function o(t){return R=t,r}function i(t){return null==t||t===!0||t===!1||"string"==typeof t||"number"==typeof t}function a(t){return"function"==typeof t||"object"==typeof t&&null!==t}function s(t){return i(t)?new Error(v(t)):t}function c(t,e){var n,r=t.length,o=new Array(r+1);for(n=0;r>n;++n)o[n]=t[n];return o[n]=e,o}function l(t,e,n){if(!F.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var r=Object.getOwnPropertyDescriptor(t,e);return null!=r?null==r.get&&null==r.set?r.value:n:void 0}function u(t,e,n){if(i(t))return t;var r={value:n,configurable:!0,enumerable:!1,writable:!0};return F.defineProperty(t,e,r),t}function p(t){throw t}function f(t){try{if("function"==typeof t){var e=F.names(t.prototype),n=F.isES5&&e.length>1,r=e.length>0&&!(1===e.length&&"constructor"===e[0]),o=A.test(t+"")&&F.names(t).length>0;if(n||r||o)return!0}return!1}catch(i){return!1}}function h(t){function e(){}function n(){return typeof r.foo}e.prototype=t;var r=new e;return n(),n(),t}function d(t){return H.test(t)}function _(t,e,n){for(var r=new Array(t),o=0;t>o;++o)r[o]=e+o+n;return r}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){return t instanceof Error||null!==t&&"object"==typeof t&&"string"==typeof t.message&&"string"==typeof t.name}function g(t){try{u(t,"isOperational",!0)}catch(e){}}function m(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function b(t){return y(t)&&F.propertyIsWritable(t,"stack")}function C(t){return{}.toString.call(t)}function w(t,e,n){for(var r=F.names(t),o=0;o<r.length;++o){var i=r[o];if(n(i))try{F.defineProperty(e,i,F.getDescriptor(t,i))}catch(a){}}}function k(t){return I?process.env[t]:void 0}function E(){if("function"==typeof Promise)try{var t=new Promise(function(){});if("[object Promise]"===C(t))return Promise}catch(e){}}function j(t,e){if(null===t||"function"!=typeof e||e===D)return e;null!==t.domain&&(e=t.domain.bind(e));var n=t.async;if(null!==n){var r=e;e=function(){var t=new Array(2).concat([].slice.call(arguments));return t[0]=r,t[1]=this,n.runInAsyncScope.apply(n,t)}}return e}var F=t("./es5"),T="undefined"==typeof navigator,x={e:{}},R,S="undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0!==this?this:null,P=function(t,e){function n(){this.constructor=t,this.constructor$=e;for(var n in e.prototype)r.call(e.prototype,n)&&"$"!==n.charAt(n.length-1)&&(this[n+"$"]=e.prototype[n])}var r={}.hasOwnProperty;return n.prototype=e.prototype,t.prototype=new n,t.prototype},O=function(){var t=[Array.prototype,Object.prototype,Function.prototype],e=function(e){for(var n=0;n<t.length;++n)if(t[n]===e)return!0;return!1};if(F.isES5){var n=Object.getOwnPropertyNames;return function(t){for(var r=[],o=Object.create(null);null!=t&&!e(t);){var i;try{i=n(t)}catch(a){return r}for(var s=0;s<i.length;++s){var c=i[s];if(!o[c]){o[c]=!0;var l=Object.getOwnPropertyDescriptor(t,c);null!=l&&null==l.get&&null==l.set&&r.push(c)}}t=F.getPrototypeOf(t)}return r}}var r={}.hasOwnProperty;return function(n){if(e(n))return[];var o=[];t:for(var i in n)if(r.call(n,i))o.push(i);else{for(var a=0;a<t.length;++a)if(r.call(t[a],i))continue t;o.push(i)}return o}}(),A=/this\s*\.\s*\S+\s*=/,H=/^[a-z$_][a-z$_0-9]*$/i,N=function(){return"stack"in new Error?function(t){return b(t)?t:new Error(v(t))}:function(t){if(b(t))return t;try{throw new Error(v(t))}catch(e){return e}}}(),L=function(t){return F.isArray(t)?t:null};if("undefined"!=typeof Symbol&&Symbol.iterator){var B="function"==typeof Array.from?function(t){return Array.from(t)}:function(t){for(var e,n=[],r=t[Symbol.iterator]();!(e=r.next()).done;)n.push(e.value);return n};L=function(t){return F.isArray(t)?t:null!=t&&"function"==typeof t[Symbol.iterator]?B(t):null}}var U="undefined"!=typeof process&&"[object process]"===C(process).toLowerCase(),I="undefined"!=typeof process&&"undefined"!=typeof process.env,D,V={setReflectHandler:function(t){D=t},isClass:f,isIdentifier:d,inheritedDataKeys:O,getDataPropertyOrDefault:l,thrower:p,isArray:F.isArray,asArray:L,notEnumerableProp:u,isPrimitive:i,isObject:a,isError:y,canEvaluate:T,errorObj:x,tryCatch:o,inherits:P,withAppended:c,maybeWrapAsError:s,toFastProperties:h,filledRange:_,toString:v,canAttachTrace:b,ensureErrorObject:N,originatesFromRejection:m,markAsOriginatingFromRejection:g,classString:C,copyDescriptors:w,isNode:U,hasEnvVariables:I,env:k,global:S,getNativePromise:E,contextBind:j};V.isRecentNode=V.isNode&&function(){var t;return process.versions&&process.versions.node?t=process.versions.node.split(".").map(Number):process.version&&(t=process.version.split(".").map(Number)),0===t[0]&&t[1]>10||t[0]>0}(),V.nodeSupportsAsyncResource=V.isNode&&function(){var e=!1;try{var n=t("async_hooks").AsyncResource;e="function"==typeof n.prototype.runInAsyncScope}catch(r){e=!1}return e}(),V.isNode&&V.toFastProperties(process);try{throw new Error}catch(Q){V.lastLineError=Q}e.exports=V},{"./es5":10,async_hooks:void 0}]},{},[3])(3)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise);/* @preserve
 * The MIT License (MIT)
 * 
 * Copyright (c) 2013-2018 Petka Antonov
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * 
 */
/**
 * bluebird build version 3.7.2
 * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Promise=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
var SomePromiseArray = Promise._SomePromiseArray;
function any(promises) {
    var ret = new SomePromiseArray(promises);
    var promise = ret.promise();
    ret.setHowMany(1);
    ret.setUnwrap();
    ret.init();
    return promise;
}

Promise.any = function (promises) {
    return any(promises);
};

Promise.prototype.any = function () {
    return any(this);
};

};

},{}],2:[function(_dereq_,module,exports){
"use strict";
var firstLineError;
try {throw new Error(); } catch (e) {firstLineError = e;}
var schedule = _dereq_("./schedule");
var Queue = _dereq_("./queue");

function Async() {
    this._customScheduler = false;
    this._isTickUsed = false;
    this._lateQueue = new Queue(16);
    this._normalQueue = new Queue(16);
    this._haveDrainedQueues = false;
    var self = this;
    this.drainQueues = function () {
        self._drainQueues();
    };
    this._schedule = schedule;
}

Async.prototype.setScheduler = function(fn) {
    var prev = this._schedule;
    this._schedule = fn;
    this._customScheduler = true;
    return prev;
};

Async.prototype.hasCustomScheduler = function() {
    return this._customScheduler;
};

Async.prototype.haveItemsQueued = function () {
    return this._isTickUsed || this._haveDrainedQueues;
};


Async.prototype.fatalError = function(e, isNode) {
    if (isNode) {
        process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) +
            "\n");
        process.exit(2);
    } else {
        this.throwLater(e);
    }
};

Async.prototype.throwLater = function(fn, arg) {
    if (arguments.length === 1) {
        arg = fn;
        fn = function () { throw arg; };
    }
    if (typeof setTimeout !== "undefined") {
        setTimeout(function() {
            fn(arg);
        }, 0);
    } else try {
        this._schedule(function() {
            fn(arg);
        });
    } catch (e) {
        throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
};

function AsyncInvokeLater(fn, receiver, arg) {
    this._lateQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncInvoke(fn, receiver, arg) {
    this._normalQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncSettlePromises(promise) {
    this._normalQueue._pushOne(promise);
    this._queueTick();
}

Async.prototype.invokeLater = AsyncInvokeLater;
Async.prototype.invoke = AsyncInvoke;
Async.prototype.settlePromises = AsyncSettlePromises;


function _drainQueue(queue) {
    while (queue.length() > 0) {
        _drainQueueStep(queue);
    }
}

function _drainQueueStep(queue) {
    var fn = queue.shift();
    if (typeof fn !== "function") {
        fn._settlePromises();
    } else {
        var receiver = queue.shift();
        var arg = queue.shift();
        fn.call(receiver, arg);
    }
}

Async.prototype._drainQueues = function () {
    _drainQueue(this._normalQueue);
    this._reset();
    this._haveDrainedQueues = true;
    _drainQueue(this._lateQueue);
};

Async.prototype._queueTick = function () {
    if (!this._isTickUsed) {
        this._isTickUsed = true;
        this._schedule(this.drainQueues);
    }
};

Async.prototype._reset = function () {
    this._isTickUsed = false;
};

module.exports = Async;
module.exports.firstLineError = firstLineError;

},{"./queue":26,"./schedule":29}],3:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {
var calledBind = false;
var rejectThis = function(_, e) {
    this._reject(e);
};

var targetRejected = function(e, context) {
    context.promiseRejectionQueued = true;
    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
};

var bindingResolved = function(thisArg, context) {
    if (((this._bitField & 50397184) === 0)) {
        this._resolveCallback(context.target);
    }
};

var bindingRejected = function(e, context) {
    if (!context.promiseRejectionQueued) this._reject(e);
};

Promise.prototype.bind = function (thisArg) {
    if (!calledBind) {
        calledBind = true;
        Promise.prototype._propagateFrom = debug.propagateFromFunction();
        Promise.prototype._boundValue = debug.boundValueFunction();
    }
    var maybePromise = tryConvertToPromise(thisArg);
    var ret = new Promise(INTERNAL);
    ret._propagateFrom(this, 1);
    var target = this._target();
    ret._setBoundTo(maybePromise);
    if (maybePromise instanceof Promise) {
        var context = {
            promiseRejectionQueued: false,
            promise: ret,
            target: target,
            bindingPromise: maybePromise
        };
        target._then(INTERNAL, targetRejected, undefined, ret, context);
        maybePromise._then(
            bindingResolved, bindingRejected, undefined, ret, context);
        ret._setOnCancel(maybePromise);
    } else {
        ret._resolveCallback(target);
    }
    return ret;
};

Promise.prototype._setBoundTo = function (obj) {
    if (obj !== undefined) {
        this._bitField = this._bitField | 2097152;
        this._boundTo = obj;
    } else {
        this._bitField = this._bitField & (~2097152);
    }
};

Promise.prototype._isBound = function () {
    return (this._bitField & 2097152) === 2097152;
};

Promise.bind = function (thisArg, value) {
    return Promise.resolve(value).bind(thisArg);
};
};

},{}],4:[function(_dereq_,module,exports){
"use strict";
var old;
if (typeof Promise !== "undefined") old = Promise;
function noConflict() {
    try { if (Promise === bluebird) Promise = old; }
    catch (e) {}
    return bluebird;
}
var bluebird = _dereq_("./promise")();
bluebird.noConflict = noConflict;
module.exports = bluebird;

},{"./promise":22}],5:[function(_dereq_,module,exports){
"use strict";
var cr = Object.create;
if (cr) {
    var callerCache = cr(null);
    var getterCache = cr(null);
    callerCache[" size"] = getterCache[" size"] = 0;
}

module.exports = function(Promise) {
var util = _dereq_("./util");
var canEvaluate = util.canEvaluate;
var isIdentifier = util.isIdentifier;

var getMethodCaller;
var getGetter;
if (!true) {
var makeMethodCaller = function (methodName) {
    return new Function("ensureMethod", "                                    \n\
        return function(obj) {                                               \n\
            'use strict'                                                     \n\
            var len = this.length;                                           \n\
            ensureMethod(obj, 'methodName');                                 \n\
            switch(len) {                                                    \n\
                case 1: return obj.methodName(this[0]);                      \n\
                case 2: return obj.methodName(this[0], this[1]);             \n\
                case 3: return obj.methodName(this[0], this[1], this[2]);    \n\
                case 0: return obj.methodName();                             \n\
                default:                                                     \n\
                    return obj.methodName.apply(obj, this);                  \n\
            }                                                                \n\
        };                                                                   \n\
        ".replace(/methodName/g, methodName))(ensureMethod);
};

var makeGetter = function (propertyName) {
    return new Function("obj", "                                             \n\
        'use strict';                                                        \n\
        return obj.propertyName;                                             \n\
        ".replace("propertyName", propertyName));
};

var getCompiled = function(name, compiler, cache) {
    var ret = cache[name];
    if (typeof ret !== "function") {
        if (!isIdentifier(name)) {
            return null;
        }
        ret = compiler(name);
        cache[name] = ret;
        cache[" size"]++;
        if (cache[" size"] > 512) {
            var keys = Object.keys(cache);
            for (var i = 0; i < 256; ++i) delete cache[keys[i]];
            cache[" size"] = keys.length - 256;
        }
    }
    return ret;
};

getMethodCaller = function(name) {
    return getCompiled(name, makeMethodCaller, callerCache);
};

getGetter = function(name) {
    return getCompiled(name, makeGetter, getterCache);
};
}

function ensureMethod(obj, methodName) {
    var fn;
    if (obj != null) fn = obj[methodName];
    if (typeof fn !== "function") {
        var message = "Object " + util.classString(obj) + " has no method '" +
            util.toString(methodName) + "'";
        throw new Promise.TypeError(message);
    }
    return fn;
}

function caller(obj) {
    var methodName = this.pop();
    var fn = ensureMethod(obj, methodName);
    return fn.apply(obj, this);
}
Promise.prototype.call = function (methodName) {
    var args = [].slice.call(arguments, 1);;
    if (!true) {
        if (canEvaluate) {
            var maybeCaller = getMethodCaller(methodName);
            if (maybeCaller !== null) {
                return this._then(
                    maybeCaller, undefined, undefined, args, undefined);
            }
        }
    }
    args.push(methodName);
    return this._then(caller, undefined, undefined, args, undefined);
};

function namedGetter(obj) {
    return obj[this];
}
function indexedGetter(obj) {
    var index = +this;
    if (index < 0) index = Math.max(0, index + obj.length);
    return obj[index];
}
Promise.prototype.get = function (propertyName) {
    var isIndex = (typeof propertyName === "number");
    var getter;
    if (!isIndex) {
        if (canEvaluate) {
            var maybeGetter = getGetter(propertyName);
            getter = maybeGetter !== null ? maybeGetter : namedGetter;
        } else {
            getter = namedGetter;
        }
    } else {
        getter = indexedGetter;
    }
    return this._then(getter, undefined, undefined, propertyName, undefined);
};
};

},{"./util":36}],6:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, PromiseArray, apiRejection, debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

Promise.prototype["break"] = Promise.prototype.cancel = function() {
    if (!debug.cancellation()) return this._warn("cancellation is disabled");

    var promise = this;
    var child = promise;
    while (promise._isCancellable()) {
        if (!promise._cancelBy(child)) {
            if (child._isFollowing()) {
                child._followee().cancel();
            } else {
                child._cancelBranched();
            }
            break;
        }

        var parent = promise._cancellationParent;
        if (parent == null || !parent._isCancellable()) {
            if (promise._isFollowing()) {
                promise._followee().cancel();
            } else {
                promise._cancelBranched();
            }
            break;
        } else {
            if (promise._isFollowing()) promise._followee().cancel();
            promise._setWillBeCancelled();
            child = promise;
            promise = parent;
        }
    }
};

Promise.prototype._branchHasCancelled = function() {
    this._branchesRemainingToCancel--;
};

Promise.prototype._enoughBranchesHaveCancelled = function() {
    return this._branchesRemainingToCancel === undefined ||
           this._branchesRemainingToCancel <= 0;
};

Promise.prototype._cancelBy = function(canceller) {
    if (canceller === this) {
        this._branchesRemainingToCancel = 0;
        this._invokeOnCancel();
        return true;
    } else {
        this._branchHasCancelled();
        if (this._enoughBranchesHaveCancelled()) {
            this._invokeOnCancel();
            return true;
        }
    }
    return false;
};

Promise.prototype._cancelBranched = function() {
    if (this._enoughBranchesHaveCancelled()) {
        this._cancel();
    }
};

Promise.prototype._cancel = function() {
    if (!this._isCancellable()) return;
    this._setCancelled();
    async.invoke(this._cancelPromises, this, undefined);
};

Promise.prototype._cancelPromises = function() {
    if (this._length() > 0) this._settlePromises();
};

Promise.prototype._unsetOnCancel = function() {
    this._onCancelField = undefined;
};

Promise.prototype._isCancellable = function() {
    return this.isPending() && !this._isCancelled();
};

Promise.prototype.isCancellable = function() {
    return this.isPending() && !this.isCancelled();
};

Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {
    if (util.isArray(onCancelCallback)) {
        for (var i = 0; i < onCancelCallback.length; ++i) {
            this._doInvokeOnCancel(onCancelCallback[i], internalOnly);
        }
    } else if (onCancelCallback !== undefined) {
        if (typeof onCancelCallback === "function") {
            if (!internalOnly) {
                var e = tryCatch(onCancelCallback).call(this._boundValue());
                if (e === errorObj) {
                    this._attachExtraTrace(e.e);
                    async.throwLater(e.e);
                }
            }
        } else {
            onCancelCallback._resultCancelled(this);
        }
    }
};

Promise.prototype._invokeOnCancel = function() {
    var onCancelCallback = this._onCancel();
    this._unsetOnCancel();
    async.invoke(this._doInvokeOnCancel, this, onCancelCallback);
};

Promise.prototype._invokeInternalOnCancel = function() {
    if (this._isCancellable()) {
        this._doInvokeOnCancel(this._onCancel(), true);
        this._unsetOnCancel();
    }
};

Promise.prototype._resultCancelled = function() {
    this.cancel();
};

};

},{"./util":36}],7:[function(_dereq_,module,exports){
"use strict";
module.exports = function(NEXT_FILTER) {
var util = _dereq_("./util");
var getKeys = _dereq_("./es5").keys;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function catchFilter(instances, cb, promise) {
    return function(e) {
        var boundTo = promise._boundValue();
        predicateLoop: for (var i = 0; i < instances.length; ++i) {
            var item = instances[i];

            if (item === Error ||
                (item != null && item.prototype instanceof Error)) {
                if (e instanceof item) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (typeof item === "function") {
                var matchesPredicate = tryCatch(item).call(boundTo, e);
                if (matchesPredicate === errorObj) {
                    return matchesPredicate;
                } else if (matchesPredicate) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (util.isObject(e)) {
                var keys = getKeys(item);
                for (var j = 0; j < keys.length; ++j) {
                    var key = keys[j];
                    if (item[key] != e[key]) {
                        continue predicateLoop;
                    }
                }
                return tryCatch(cb).call(boundTo, e);
            }
        }
        return NEXT_FILTER;
    };
}

return catchFilter;
};

},{"./es5":13,"./util":36}],8:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
var longStackTraces = false;
var contextStack = [];

Promise.prototype._promiseCreated = function() {};
Promise.prototype._pushContext = function() {};
Promise.prototype._popContext = function() {return null;};
Promise._peekContext = Promise.prototype._peekContext = function() {};

function Context() {
    this._trace = new Context.CapturedTrace(peekContext());
}
Context.prototype._pushContext = function () {
    if (this._trace !== undefined) {
        this._trace._promiseCreated = null;
        contextStack.push(this._trace);
    }
};

Context.prototype._popContext = function () {
    if (this._trace !== undefined) {
        var trace = contextStack.pop();
        var ret = trace._promiseCreated;
        trace._promiseCreated = null;
        return ret;
    }
    return null;
};

function createContext() {
    if (longStackTraces) return new Context();
}

function peekContext() {
    var lastIndex = contextStack.length - 1;
    if (lastIndex >= 0) {
        return contextStack[lastIndex];
    }
    return undefined;
}
Context.CapturedTrace = null;
Context.create = createContext;
Context.deactivateLongStackTraces = function() {};
Context.activateLongStackTraces = function() {
    var Promise_pushContext = Promise.prototype._pushContext;
    var Promise_popContext = Promise.prototype._popContext;
    var Promise_PeekContext = Promise._peekContext;
    var Promise_peekContext = Promise.prototype._peekContext;
    var Promise_promiseCreated = Promise.prototype._promiseCreated;
    Context.deactivateLongStackTraces = function() {
        Promise.prototype._pushContext = Promise_pushContext;
        Promise.prototype._popContext = Promise_popContext;
        Promise._peekContext = Promise_PeekContext;
        Promise.prototype._peekContext = Promise_peekContext;
        Promise.prototype._promiseCreated = Promise_promiseCreated;
        longStackTraces = false;
    };
    longStackTraces = true;
    Promise.prototype._pushContext = Context.prototype._pushContext;
    Promise.prototype._popContext = Context.prototype._popContext;
    Promise._peekContext = Promise.prototype._peekContext = peekContext;
    Promise.prototype._promiseCreated = function() {
        var ctx = this._peekContext();
        if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;
    };
};
return Context;
};

},{}],9:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, Context,
    enableAsyncHooks, disableAsyncHooks) {
var async = Promise._async;
var Warning = _dereq_("./errors").Warning;
var util = _dereq_("./util");
var es5 = _dereq_("./es5");
var canAttachTrace = util.canAttachTrace;
var unhandledRejectionHandled;
var possiblyUnhandledRejection;
var bluebirdFramePattern =
    /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/;
var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/;
var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/;
var stackFramePattern = null;
var formatStack = null;
var indentStackFrames = false;
var printWarning;
var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 &&
                        (true ||
                         util.env("BLUEBIRD_DEBUG") ||
                         util.env("NODE_ENV") === "development"));

var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 &&
    (debugging || util.env("BLUEBIRD_WARNINGS")));

var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 &&
    (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));

var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 &&
    (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));

var deferUnhandledRejectionCheck;
(function() {
    var promises = [];

    function unhandledRejectionCheck() {
        for (var i = 0; i < promises.length; ++i) {
            promises[i]._notifyUnhandledRejection();
        }
        unhandledRejectionClear();
    }

    function unhandledRejectionClear() {
        promises.length = 0;
    }

    deferUnhandledRejectionCheck = function(promise) {
        promises.push(promise);
        setTimeout(unhandledRejectionCheck, 1);
    };

    es5.defineProperty(Promise, "_unhandledRejectionCheck", {
        value: unhandledRejectionCheck
    });
    es5.defineProperty(Promise, "_unhandledRejectionClear", {
        value: unhandledRejectionClear
    });
})();

Promise.prototype.suppressUnhandledRejections = function() {
    var target = this._target();
    target._bitField = ((target._bitField & (~1048576)) |
                      524288);
};

Promise.prototype._ensurePossibleRejectionHandled = function () {
    if ((this._bitField & 524288) !== 0) return;
    this._setRejectionIsUnhandled();
    deferUnhandledRejectionCheck(this);
};

Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
    fireRejectionEvent("rejectionHandled",
                                  unhandledRejectionHandled, undefined, this);
};

Promise.prototype._setReturnedNonUndefined = function() {
    this._bitField = this._bitField | 268435456;
};

Promise.prototype._returnedNonUndefined = function() {
    return (this._bitField & 268435456) !== 0;
};

Promise.prototype._notifyUnhandledRejection = function () {
    if (this._isRejectionUnhandled()) {
        var reason = this._settledValue();
        this._setUnhandledRejectionIsNotified();
        fireRejectionEvent("unhandledRejection",
                                      possiblyUnhandledRejection, reason, this);
    }
};

Promise.prototype._setUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField | 262144;
};

Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField & (~262144);
};

Promise.prototype._isUnhandledRejectionNotified = function () {
    return (this._bitField & 262144) > 0;
};

Promise.prototype._setRejectionIsUnhandled = function () {
    this._bitField = this._bitField | 1048576;
};

Promise.prototype._unsetRejectionIsUnhandled = function () {
    this._bitField = this._bitField & (~1048576);
    if (this._isUnhandledRejectionNotified()) {
        this._unsetUnhandledRejectionIsNotified();
        this._notifyUnhandledRejectionIsHandled();
    }
};

Promise.prototype._isRejectionUnhandled = function () {
    return (this._bitField & 1048576) > 0;
};

Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) {
    return warn(message, shouldUseOwnTrace, promise || this);
};

Promise.onPossiblyUnhandledRejection = function (fn) {
    var context = Promise._getContext();
    possiblyUnhandledRejection = util.contextBind(context, fn);
};

Promise.onUnhandledRejectionHandled = function (fn) {
    var context = Promise._getContext();
    unhandledRejectionHandled = util.contextBind(context, fn);
};

var disableLongStackTraces = function() {};
Promise.longStackTraces = function () {
    if (async.haveItemsQueued() && !config.longStackTraces) {
        throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (!config.longStackTraces && longStackTracesIsSupported()) {
        var Promise_captureStackTrace = Promise.prototype._captureStackTrace;
        var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;
        var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace;
        config.longStackTraces = true;
        disableLongStackTraces = function() {
            if (async.haveItemsQueued() && !config.longStackTraces) {
                throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
            }
            Promise.prototype._captureStackTrace = Promise_captureStackTrace;
            Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;
            Promise.prototype._dereferenceTrace = Promise_dereferenceTrace;
            Context.deactivateLongStackTraces();
            config.longStackTraces = false;
        };
        Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;
        Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;
        Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace;
        Context.activateLongStackTraces();
    }
};

Promise.hasLongStackTraces = function () {
    return config.longStackTraces && longStackTracesIsSupported();
};


var legacyHandlers = {
    unhandledrejection: {
        before: function() {
            var ret = util.global.onunhandledrejection;
            util.global.onunhandledrejection = null;
            return ret;
        },
        after: function(fn) {
            util.global.onunhandledrejection = fn;
        }
    },
    rejectionhandled: {
        before: function() {
            var ret = util.global.onrejectionhandled;
            util.global.onrejectionhandled = null;
            return ret;
        },
        after: function(fn) {
            util.global.onrejectionhandled = fn;
        }
    }
};

var fireDomEvent = (function() {
    var dispatch = function(legacy, e) {
        if (legacy) {
            var fn;
            try {
                fn = legacy.before();
                return !util.global.dispatchEvent(e);
            } finally {
                legacy.after(fn);
            }
        } else {
            return !util.global.dispatchEvent(e);
        }
    };
    try {
        if (typeof CustomEvent === "function") {
            var event = new CustomEvent("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var eventData = {
                    detail: event,
                    cancelable: true
                };
                var domEvent = new CustomEvent(name, eventData);
                es5.defineProperty(
                    domEvent, "promise", {value: event.promise});
                es5.defineProperty(
                    domEvent, "reason", {value: event.reason});

                return dispatch(legacyHandlers[name], domEvent);
            };
        } else if (typeof Event === "function") {
            var event = new Event("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = new Event(name, {
                    cancelable: true
                });
                domEvent.detail = event;
                es5.defineProperty(domEvent, "promise", {value: event.promise});
                es5.defineProperty(domEvent, "reason", {value: event.reason});
                return dispatch(legacyHandlers[name], domEvent);
            };
        } else {
            var event = document.createEvent("CustomEvent");
            event.initCustomEvent("testingtheevent", false, true, {});
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = document.createEvent("CustomEvent");
                domEvent.initCustomEvent(name, false, true,
                    event);
                return dispatch(legacyHandlers[name], domEvent);
            };
        }
    } catch (e) {}
    return function() {
        return false;
    };
})();

var fireGlobalEvent = (function() {
    if (util.isNode) {
        return function() {
            return process.emit.apply(process, arguments);
        };
    } else {
        if (!util.global) {
            return function() {
                return false;
            };
        }
        return function(name) {
            var methodName = "on" + name.toLowerCase();
            var method = util.global[methodName];
            if (!method) return false;
            method.apply(util.global, [].slice.call(arguments, 1));
            return true;
        };
    }
})();

function generatePromiseLifecycleEventObject(name, promise) {
    return {promise: promise};
}

var eventToObjectGenerator = {
    promiseCreated: generatePromiseLifecycleEventObject,
    promiseFulfilled: generatePromiseLifecycleEventObject,
    promiseRejected: generatePromiseLifecycleEventObject,
    promiseResolved: generatePromiseLifecycleEventObject,
    promiseCancelled: generatePromiseLifecycleEventObject,
    promiseChained: function(name, promise, child) {
        return {promise: promise, child: child};
    },
    warning: function(name, warning) {
        return {warning: warning};
    },
    unhandledRejection: function (name, reason, promise) {
        return {reason: reason, promise: promise};
    },
    rejectionHandled: generatePromiseLifecycleEventObject
};

var activeFireEvent = function (name) {
    var globalEventFired = false;
    try {
        globalEventFired = fireGlobalEvent.apply(null, arguments);
    } catch (e) {
        async.throwLater(e);
        globalEventFired = true;
    }

    var domEventFired = false;
    try {
        domEventFired = fireDomEvent(name,
                    eventToObjectGenerator[name].apply(null, arguments));
    } catch (e) {
        async.throwLater(e);
        domEventFired = true;
    }

    return domEventFired || globalEventFired;
};

Promise.config = function(opts) {
    opts = Object(opts);
    if ("longStackTraces" in opts) {
        if (opts.longStackTraces) {
            Promise.longStackTraces();
        } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
            disableLongStackTraces();
        }
    }
    if ("warnings" in opts) {
        var warningsOption = opts.warnings;
        config.warnings = !!warningsOption;
        wForgottenReturn = config.warnings;

        if (util.isObject(warningsOption)) {
            if ("wForgottenReturn" in warningsOption) {
                wForgottenReturn = !!warningsOption.wForgottenReturn;
            }
        }
    }
    if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
        if (async.haveItemsQueued()) {
            throw new Error(
                "cannot enable cancellation after promises are in use");
        }
        Promise.prototype._clearCancellationData =
            cancellationClearCancellationData;
        Promise.prototype._propagateFrom = cancellationPropagateFrom;
        Promise.prototype._onCancel = cancellationOnCancel;
        Promise.prototype._setOnCancel = cancellationSetOnCancel;
        Promise.prototype._attachCancellationCallback =
            cancellationAttachCancellationCallback;
        Promise.prototype._execute = cancellationExecute;
        propagateFromFunction = cancellationPropagateFrom;
        config.cancellation = true;
    }
    if ("monitoring" in opts) {
        if (opts.monitoring && !config.monitoring) {
            config.monitoring = true;
            Promise.prototype._fireEvent = activeFireEvent;
        } else if (!opts.monitoring && config.monitoring) {
            config.monitoring = false;
            Promise.prototype._fireEvent = defaultFireEvent;
        }
    }
    if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) {
        var prev = config.asyncHooks;
        var cur = !!opts.asyncHooks;
        if (prev !== cur) {
            config.asyncHooks = cur;
            if (cur) {
                enableAsyncHooks();
            } else {
                disableAsyncHooks();
            }
        }
    }
    return Promise;
};

function defaultFireEvent() { return false; }

Promise.prototype._fireEvent = defaultFireEvent;
Promise.prototype._execute = function(executor, resolve, reject) {
    try {
        executor(resolve, reject);
    } catch (e) {
        return e;
    }
};
Promise.prototype._onCancel = function () {};
Promise.prototype._setOnCancel = function (handler) { ; };
Promise.prototype._attachCancellationCallback = function(onCancel) {
    ;
};
Promise.prototype._captureStackTrace = function () {};
Promise.prototype._attachExtraTrace = function () {};
Promise.prototype._dereferenceTrace = function () {};
Promise.prototype._clearCancellationData = function() {};
Promise.prototype._propagateFrom = function (parent, flags) {
    ;
    ;
};

function cancellationExecute(executor, resolve, reject) {
    var promise = this;
    try {
        executor(resolve, reject, function(onCancel) {
            if (typeof onCancel !== "function") {
                throw new TypeError("onCancel must be a function, got: " +
                                    util.toString(onCancel));
            }
            promise._attachCancellationCallback(onCancel);
        });
    } catch (e) {
        return e;
    }
}

function cancellationAttachCancellationCallback(onCancel) {
    if (!this._isCancellable()) return this;

    var previousOnCancel = this._onCancel();
    if (previousOnCancel !== undefined) {
        if (util.isArray(previousOnCancel)) {
            previousOnCancel.push(onCancel);
        } else {
            this._setOnCancel([previousOnCancel, onCancel]);
        }
    } else {
        this._setOnCancel(onCancel);
    }
}

function cancellationOnCancel() {
    return this._onCancelField;
}

function cancellationSetOnCancel(onCancel) {
    this._onCancelField = onCancel;
}

function cancellationClearCancellationData() {
    this._cancellationParent = undefined;
    this._onCancelField = undefined;
}

function cancellationPropagateFrom(parent, flags) {
    if ((flags & 1) !== 0) {
        this._cancellationParent = parent;
        var branchesRemainingToCancel = parent._branchesRemainingToCancel;
        if (branchesRemainingToCancel === undefined) {
            branchesRemainingToCancel = 0;
        }
        parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;
    }
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}

function bindingPropagateFrom(parent, flags) {
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}
var propagateFromFunction = bindingPropagateFrom;

function boundValueFunction() {
    var ret = this._boundTo;
    if (ret !== undefined) {
        if (ret instanceof Promise) {
            if (ret.isFulfilled()) {
                return ret.value();
            } else {
                return undefined;
            }
        }
    }
    return ret;
}

function longStackTracesCaptureStackTrace() {
    this._trace = new CapturedTrace(this._peekContext());
}

function longStackTracesAttachExtraTrace(error, ignoreSelf) {
    if (canAttachTrace(error)) {
        var trace = this._trace;
        if (trace !== undefined) {
            if (ignoreSelf) trace = trace._parent;
        }
        if (trace !== undefined) {
            trace.attachExtraTrace(error);
        } else if (!error.__stackCleaned__) {
            var parsed = parseStackAndMessage(error);
            util.notEnumerableProp(error, "stack",
                parsed.message + "\n" + parsed.stack.join("\n"));
            util.notEnumerableProp(error, "__stackCleaned__", true);
        }
    }
}

function longStackTracesDereferenceTrace() {
    this._trace = undefined;
}

function checkForgottenReturns(returnValue, promiseCreated, name, promise,
                               parent) {
    if (returnValue === undefined && promiseCreated !== null &&
        wForgottenReturn) {
        if (parent !== undefined && parent._returnedNonUndefined()) return;
        if ((promise._bitField & 65535) === 0) return;

        if (name) name = name + " ";
        var handlerLine = "";
        var creatorLine = "";
        if (promiseCreated._trace) {
            var traceLines = promiseCreated._trace.stack.split("\n");
            var stack = cleanStack(traceLines);
            for (var i = stack.length - 1; i >= 0; --i) {
                var line = stack[i];
                if (!nodeFramePattern.test(line)) {
                    var lineMatches = line.match(parseLinePattern);
                    if (lineMatches) {
                        handlerLine  = "at " + lineMatches[1] +
                            ":" + lineMatches[2] + ":" + lineMatches[3] + " ";
                    }
                    break;
                }
            }

            if (stack.length > 0) {
                var firstUserLine = stack[0];
                for (var i = 0; i < traceLines.length; ++i) {

                    if (traceLines[i] === firstUserLine) {
                        if (i > 0) {
                            creatorLine = "\n" + traceLines[i - 1];
                        }
                        break;
                    }
                }

            }
        }
        var msg = "a promise was created in a " + name +
            "handler " + handlerLine + "but was not returned from it, " +
            "see http://goo.gl/rRqMUw" +
            creatorLine;
        promise._warn(msg, true, promiseCreated);
    }
}

function deprecated(name, replacement) {
    var message = name +
        " is deprecated and will be removed in a future version.";
    if (replacement) message += " Use " + replacement + " instead.";
    return warn(message);
}

function warn(message, shouldUseOwnTrace, promise) {
    if (!config.warnings) return;
    var warning = new Warning(message);
    var ctx;
    if (shouldUseOwnTrace) {
        promise._attachExtraTrace(warning);
    } else if (config.longStackTraces && (ctx = Promise._peekContext())) {
        ctx.attachExtraTrace(warning);
    } else {
        var parsed = parseStackAndMessage(warning);
        warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
    }

    if (!activeFireEvent("warning", warning)) {
        formatAndLogError(warning, "", true);
    }
}

function reconstructStack(message, stacks) {
    for (var i = 0; i < stacks.length - 1; ++i) {
        stacks[i].push("From previous event:");
        stacks[i] = stacks[i].join("\n");
    }
    if (i < stacks.length) {
        stacks[i] = stacks[i].join("\n");
    }
    return message + "\n" + stacks.join("\n");
}

function removeDuplicateOrEmptyJumps(stacks) {
    for (var i = 0; i < stacks.length; ++i) {
        if (stacks[i].length === 0 ||
            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {
            stacks.splice(i, 1);
            i--;
        }
    }
}

function removeCommonRoots(stacks) {
    var current = stacks[0];
    for (var i = 1; i < stacks.length; ++i) {
        var prev = stacks[i];
        var currentLastIndex = current.length - 1;
        var currentLastLine = current[currentLastIndex];
        var commonRootMeetPoint = -1;

        for (var j = prev.length - 1; j >= 0; --j) {
            if (prev[j] === currentLastLine) {
                commonRootMeetPoint = j;
                break;
            }
        }

        for (var j = commonRootMeetPoint; j >= 0; --j) {
            var line = prev[j];
            if (current[currentLastIndex] === line) {
                current.pop();
                currentLastIndex--;
            } else {
                break;
            }
        }
        current = prev;
    }
}

function cleanStack(stack) {
    var ret = [];
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        var isTraceLine = "    (No stack trace)" === line ||
            stackFramePattern.test(line);
        var isInternalFrame = isTraceLine && shouldIgnore(line);
        if (isTraceLine && !isInternalFrame) {
            if (indentStackFrames && line.charAt(0) !== " ") {
                line = "    " + line;
            }
            ret.push(line);
        }
    }
    return ret;
}

function stackFramesAsArray(error) {
    var stack = error.stack.replace(/\s+$/g, "").split("\n");
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        if ("    (No stack trace)" === line || stackFramePattern.test(line)) {
            break;
        }
    }
    if (i > 0 && error.name != "SyntaxError") {
        stack = stack.slice(i);
    }
    return stack;
}

function parseStackAndMessage(error) {
    var stack = error.stack;
    var message = error.toString();
    stack = typeof stack === "string" && stack.length > 0
                ? stackFramesAsArray(error) : ["    (No stack trace)"];
    return {
        message: message,
        stack: error.name == "SyntaxError" ? stack : cleanStack(stack)
    };
}

function formatAndLogError(error, title, isSoft) {
    if (typeof console !== "undefined") {
        var message;
        if (util.isObject(error)) {
            var stack = error.stack;
            message = title + formatStack(stack, error);
        } else {
            message = title + String(error);
        }
        if (typeof printWarning === "function") {
            printWarning(message, isSoft);
        } else if (typeof console.log === "function" ||
            typeof console.log === "object") {
            console.log(message);
        }
    }
}

function fireRejectionEvent(name, localHandler, reason, promise) {
    var localEventFired = false;
    try {
        if (typeof localHandler === "function") {
            localEventFired = true;
            if (name === "rejectionHandled") {
                localHandler(promise);
            } else {
                localHandler(reason, promise);
            }
        }
    } catch (e) {
        async.throwLater(e);
    }

    if (name === "unhandledRejection") {
        if (!activeFireEvent(name, reason, promise) && !localEventFired) {
            formatAndLogError(reason, "Unhandled rejection ");
        }
    } else {
        activeFireEvent(name, promise);
    }
}

function formatNonError(obj) {
    var str;
    if (typeof obj === "function") {
        str = "[function " +
            (obj.name || "anonymous") +
            "]";
    } else {
        str = obj && typeof obj.toString === "function"
            ? obj.toString() : util.toString(obj);
        var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
        if (ruselessToString.test(str)) {
            try {
                var newStr = JSON.stringify(obj);
                str = newStr;
            }
            catch(e) {

            }
        }
        if (str.length === 0) {
            str = "(empty array)";
        }
    }
    return ("(<" + snip(str) + ">, no stack trace)");
}

function snip(str) {
    var maxChars = 41;
    if (str.length < maxChars) {
        return str;
    }
    return str.substr(0, maxChars - 3) + "...";
}

function longStackTracesIsSupported() {
    return typeof captureStackTrace === "function";
}

var shouldIgnore = function() { return false; };
var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
function parseLineInfo(line) {
    var matches = line.match(parseLineInfoRegex);
    if (matches) {
        return {
            fileName: matches[1],
            line: parseInt(matches[2], 10)
        };
    }
}

function setBounds(firstLineError, lastLineError) {
    if (!longStackTracesIsSupported()) return;
    var firstStackLines = (firstLineError.stack || "").split("\n");
    var lastStackLines = (lastLineError.stack || "").split("\n");
    var firstIndex = -1;
    var lastIndex = -1;
    var firstFileName;
    var lastFileName;
    for (var i = 0; i < firstStackLines.length; ++i) {
        var result = parseLineInfo(firstStackLines[i]);
        if (result) {
            firstFileName = result.fileName;
            firstIndex = result.line;
            break;
        }
    }
    for (var i = 0; i < lastStackLines.length; ++i) {
        var result = parseLineInfo(lastStackLines[i]);
        if (result) {
            lastFileName = result.fileName;
            lastIndex = result.line;
            break;
        }
    }
    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||
        firstFileName !== lastFileName || firstIndex >= lastIndex) {
        return;
    }

    shouldIgnore = function(line) {
        if (bluebirdFramePattern.test(line)) return true;
        var info = parseLineInfo(line);
        if (info) {
            if (info.fileName === firstFileName &&
                (firstIndex <= info.line && info.line <= lastIndex)) {
                return true;
            }
        }
        return false;
    };
}

function CapturedTrace(parent) {
    this._parent = parent;
    this._promisesCreated = 0;
    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
    captureStackTrace(this, CapturedTrace);
    if (length > 32) this.uncycle();
}
util.inherits(CapturedTrace, Error);
Context.CapturedTrace = CapturedTrace;

CapturedTrace.prototype.uncycle = function() {
    var length = this._length;
    if (length < 2) return;
    var nodes = [];
    var stackToIndex = {};

    for (var i = 0, node = this; node !== undefined; ++i) {
        nodes.push(node);
        node = node._parent;
    }
    length = this._length = i;
    for (var i = length - 1; i >= 0; --i) {
        var stack = nodes[i].stack;
        if (stackToIndex[stack] === undefined) {
            stackToIndex[stack] = i;
        }
    }
    for (var i = 0; i < length; ++i) {
        var currentStack = nodes[i].stack;
        var index = stackToIndex[currentStack];
        if (index !== undefined && index !== i) {
            if (index > 0) {
                nodes[index - 1]._parent = undefined;
                nodes[index - 1]._length = 1;
            }
            nodes[i]._parent = undefined;
            nodes[i]._length = 1;
            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;

            if (index < length - 1) {
                cycleEdgeNode._parent = nodes[index + 1];
                cycleEdgeNode._parent.uncycle();
                cycleEdgeNode._length =
                    cycleEdgeNode._parent._length + 1;
            } else {
                cycleEdgeNode._parent = undefined;
                cycleEdgeNode._length = 1;
            }
            var currentChildLength = cycleEdgeNode._length + 1;
            for (var j = i - 2; j >= 0; --j) {
                nodes[j]._length = currentChildLength;
                currentChildLength++;
            }
            return;
        }
    }
};

CapturedTrace.prototype.attachExtraTrace = function(error) {
    if (error.__stackCleaned__) return;
    this.uncycle();
    var parsed = parseStackAndMessage(error);
    var message = parsed.message;
    var stacks = [parsed.stack];

    var trace = this;
    while (trace !== undefined) {
        stacks.push(cleanStack(trace.stack.split("\n")));
        trace = trace._parent;
    }
    removeCommonRoots(stacks);
    removeDuplicateOrEmptyJumps(stacks);
    util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
    util.notEnumerableProp(error, "__stackCleaned__", true);
};

var captureStackTrace = (function stackDetection() {
    var v8stackFramePattern = /^\s*at\s*/;
    var v8stackFormatter = function(stack, error) {
        if (typeof stack === "string") return stack;

        if (error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    if (typeof Error.stackTraceLimit === "number" &&
        typeof Error.captureStackTrace === "function") {
        Error.stackTraceLimit += 6;
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        var captureStackTrace = Error.captureStackTrace;

        shouldIgnore = function(line) {
            return bluebirdFramePattern.test(line);
        };
        return function(receiver, ignoreUntil) {
            Error.stackTraceLimit += 6;
            captureStackTrace(receiver, ignoreUntil);
            Error.stackTraceLimit -= 6;
        };
    }
    var err = new Error();

    if (typeof err.stack === "string" &&
        err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
        stackFramePattern = /@/;
        formatStack = v8stackFormatter;
        indentStackFrames = true;
        return function captureStackTrace(o) {
            o.stack = new Error().stack;
        };
    }

    var hasStackAfterThrow;
    try { throw new Error(); }
    catch(e) {
        hasStackAfterThrow = ("stack" in e);
    }
    if (!("stack" in err) && hasStackAfterThrow &&
        typeof Error.stackTraceLimit === "number") {
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        return function captureStackTrace(o) {
            Error.stackTraceLimit += 6;
            try { throw new Error(); }
            catch(e) { o.stack = e.stack; }
            Error.stackTraceLimit -= 6;
        };
    }

    formatStack = function(stack, error) {
        if (typeof stack === "string") return stack;

        if ((typeof error === "object" ||
            typeof error === "function") &&
            error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    return null;

})([]);

if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
    printWarning = function (message) {
        console.warn(message);
    };
    if (util.isNode && process.stderr.isTTY) {
        printWarning = function(message, isSoft) {
            var color = isSoft ? "\u001b[33m" : "\u001b[31m";
            console.warn(color + message + "\u001b[0m\n");
        };
    } else if (!util.isNode && typeof (new Error().stack) === "string") {
        printWarning = function(message, isSoft) {
            console.warn("%c" + message,
                        isSoft ? "color: darkorange" : "color: red");
        };
    }
}

var config = {
    warnings: warnings,
    longStackTraces: false,
    cancellation: false,
    monitoring: false,
    asyncHooks: false
};

if (longStackTraces) Promise.longStackTraces();

return {
    asyncHooks: function() {
        return config.asyncHooks;
    },
    longStackTraces: function() {
        return config.longStackTraces;
    },
    warnings: function() {
        return config.warnings;
    },
    cancellation: function() {
        return config.cancellation;
    },
    monitoring: function() {
        return config.monitoring;
    },
    propagateFromFunction: function() {
        return propagateFromFunction;
    },
    boundValueFunction: function() {
        return boundValueFunction;
    },
    checkForgottenReturns: checkForgottenReturns,
    setBounds: setBounds,
    warn: warn,
    deprecated: deprecated,
    CapturedTrace: CapturedTrace,
    fireDomEvent: fireDomEvent,
    fireGlobalEvent: fireGlobalEvent
};
};

},{"./errors":12,"./es5":13,"./util":36}],10:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
function returner() {
    return this.value;
}
function thrower() {
    throw this.reason;
}

Promise.prototype["return"] =
Promise.prototype.thenReturn = function (value) {
    if (value instanceof Promise) value.suppressUnhandledRejections();
    return this._then(
        returner, undefined, undefined, {value: value}, undefined);
};

Promise.prototype["throw"] =
Promise.prototype.thenThrow = function (reason) {
    return this._then(
        thrower, undefined, undefined, {reason: reason}, undefined);
};

Promise.prototype.catchThrow = function (reason) {
    if (arguments.length <= 1) {
        return this._then(
            undefined, thrower, undefined, {reason: reason}, undefined);
    } else {
        var _reason = arguments[1];
        var handler = function() {throw _reason;};
        return this.caught(reason, handler);
    }
};

Promise.prototype.catchReturn = function (value) {
    if (arguments.length <= 1) {
        if (value instanceof Promise) value.suppressUnhandledRejections();
        return this._then(
            undefined, returner, undefined, {value: value}, undefined);
    } else {
        var _value = arguments[1];
        if (_value instanceof Promise) _value.suppressUnhandledRejections();
        var handler = function() {return _value;};
        return this.caught(value, handler);
    }
};
};

},{}],11:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseReduce = Promise.reduce;
var PromiseAll = Promise.all;

function promiseAllThis() {
    return PromiseAll(this);
}

function PromiseMapSeries(promises, fn) {
    return PromiseReduce(promises, fn, INTERNAL, INTERNAL);
}

Promise.prototype.each = function (fn) {
    return PromiseReduce(this, fn, INTERNAL, 0)
              ._then(promiseAllThis, undefined, undefined, this, undefined);
};

Promise.prototype.mapSeries = function (fn) {
    return PromiseReduce(this, fn, INTERNAL, INTERNAL);
};

Promise.each = function (promises, fn) {
    return PromiseReduce(promises, fn, INTERNAL, 0)
              ._then(promiseAllThis, undefined, undefined, promises, undefined);
};

Promise.mapSeries = PromiseMapSeries;
};


},{}],12:[function(_dereq_,module,exports){
"use strict";
var es5 = _dereq_("./es5");
var Objectfreeze = es5.freeze;
var util = _dereq_("./util");
var inherits = util.inherits;
var notEnumerableProp = util.notEnumerableProp;

function subError(nameProperty, defaultMessage) {
    function SubError(message) {
        if (!(this instanceof SubError)) return new SubError(message);
        notEnumerableProp(this, "message",
            typeof message === "string" ? message : defaultMessage);
        notEnumerableProp(this, "name", nameProperty);
        if (Error.captureStackTrace) {
            Error.captureStackTrace(this, this.constructor);
        } else {
            Error.call(this);
        }
    }
    inherits(SubError, Error);
    return SubError;
}

var _TypeError, _RangeError;
var Warning = subError("Warning", "warning");
var CancellationError = subError("CancellationError", "cancellation error");
var TimeoutError = subError("TimeoutError", "timeout error");
var AggregateError = subError("AggregateError", "aggregate error");
try {
    _TypeError = TypeError;
    _RangeError = RangeError;
} catch(e) {
    _TypeError = subError("TypeError", "type error");
    _RangeError = subError("RangeError", "range error");
}

var methods = ("join pop push shift unshift slice filter forEach some " +
    "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" ");

for (var i = 0; i < methods.length; ++i) {
    if (typeof Array.prototype[methods[i]] === "function") {
        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];
    }
}

es5.defineProperty(AggregateError.prototype, "length", {
    value: 0,
    configurable: false,
    writable: true,
    enumerable: true
});
AggregateError.prototype["isOperational"] = true;
var level = 0;
AggregateError.prototype.toString = function() {
    var indent = Array(level * 4 + 1).join(" ");
    var ret = "\n" + indent + "AggregateError of:" + "\n";
    level++;
    indent = Array(level * 4 + 1).join(" ");
    for (var i = 0; i < this.length; ++i) {
        var str = this[i] === this ? "[Circular AggregateError]" : this[i] + "";
        var lines = str.split("\n");
        for (var j = 0; j < lines.length; ++j) {
            lines[j] = indent + lines[j];
        }
        str = lines.join("\n");
        ret += str + "\n";
    }
    level--;
    return ret;
};

function OperationalError(message) {
    if (!(this instanceof OperationalError))
        return new OperationalError(message);
    notEnumerableProp(this, "name", "OperationalError");
    notEnumerableProp(this, "message", message);
    this.cause = message;
    this["isOperational"] = true;

    if (message instanceof Error) {
        notEnumerableProp(this, "message", message.message);
        notEnumerableProp(this, "stack", message.stack);
    } else if (Error.captureStackTrace) {
        Error.captureStackTrace(this, this.constructor);
    }

}
inherits(OperationalError, Error);

var errorTypes = Error["__BluebirdErrorTypes__"];
if (!errorTypes) {
    errorTypes = Objectfreeze({
        CancellationError: CancellationError,
        TimeoutError: TimeoutError,
        OperationalError: OperationalError,
        RejectionError: OperationalError,
        AggregateError: AggregateError
    });
    es5.defineProperty(Error, "__BluebirdErrorTypes__", {
        value: errorTypes,
        writable: false,
        enumerable: false,
        configurable: false
    });
}

module.exports = {
    Error: Error,
    TypeError: _TypeError,
    RangeError: _RangeError,
    CancellationError: errorTypes.CancellationError,
    OperationalError: errorTypes.OperationalError,
    TimeoutError: errorTypes.TimeoutError,
    AggregateError: errorTypes.AggregateError,
    Warning: Warning
};

},{"./es5":13,"./util":36}],13:[function(_dereq_,module,exports){
var isES5 = (function(){
    "use strict";
    return this === undefined;
})();

if (isES5) {
    module.exports = {
        freeze: Object.freeze,
        defineProperty: Object.defineProperty,
        getDescriptor: Object.getOwnPropertyDescriptor,
        keys: Object.keys,
        names: Object.getOwnPropertyNames,
        getPrototypeOf: Object.getPrototypeOf,
        isArray: Array.isArray,
        isES5: isES5,
        propertyIsWritable: function(obj, prop) {
            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
            return !!(!descriptor || descriptor.writable || descriptor.set);
        }
    };
} else {
    var has = {}.hasOwnProperty;
    var str = {}.toString;
    var proto = {}.constructor.prototype;

    var ObjectKeys = function (o) {
        var ret = [];
        for (var key in o) {
            if (has.call(o, key)) {
                ret.push(key);
            }
        }
        return ret;
    };

    var ObjectGetDescriptor = function(o, key) {
        return {value: o[key]};
    };

    var ObjectDefineProperty = function (o, key, desc) {
        o[key] = desc.value;
        return o;
    };

    var ObjectFreeze = function (obj) {
        return obj;
    };

    var ObjectGetPrototypeOf = function (obj) {
        try {
            return Object(obj).constructor.prototype;
        }
        catch (e) {
            return proto;
        }
    };

    var ArrayIsArray = function (obj) {
        try {
            return str.call(obj) === "[object Array]";
        }
        catch(e) {
            return false;
        }
    };

    module.exports = {
        isArray: ArrayIsArray,
        keys: ObjectKeys,
        names: ObjectKeys,
        defineProperty: ObjectDefineProperty,
        getDescriptor: ObjectGetDescriptor,
        freeze: ObjectFreeze,
        getPrototypeOf: ObjectGetPrototypeOf,
        isES5: isES5,
        propertyIsWritable: function() {
            return true;
        }
    };
}

},{}],14:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseMap = Promise.map;

Promise.prototype.filter = function (fn, options) {
    return PromiseMap(this, fn, options, INTERNAL);
};

Promise.filter = function (promises, fn, options) {
    return PromiseMap(promises, fn, options, INTERNAL);
};
};

},{}],15:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) {
var util = _dereq_("./util");
var CancellationError = Promise.CancellationError;
var errorObj = util.errorObj;
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);

function PassThroughHandlerContext(promise, type, handler) {
    this.promise = promise;
    this.type = type;
    this.handler = handler;
    this.called = false;
    this.cancelPromise = null;
}

PassThroughHandlerContext.prototype.isFinallyHandler = function() {
    return this.type === 0;
};

function FinallyHandlerCancelReaction(finallyHandler) {
    this.finallyHandler = finallyHandler;
}

FinallyHandlerCancelReaction.prototype._resultCancelled = function() {
    checkCancel(this.finallyHandler);
};

function checkCancel(ctx, reason) {
    if (ctx.cancelPromise != null) {
        if (arguments.length > 1) {
            ctx.cancelPromise._reject(reason);
        } else {
            ctx.cancelPromise._cancel();
        }
        ctx.cancelPromise = null;
        return true;
    }
    return false;
}

function succeed() {
    return finallyHandler.call(this, this.promise._target()._settledValue());
}
function fail(reason) {
    if (checkCancel(this, reason)) return;
    errorObj.e = reason;
    return errorObj;
}
function finallyHandler(reasonOrValue) {
    var promise = this.promise;
    var handler = this.handler;

    if (!this.called) {
        this.called = true;
        var ret = this.isFinallyHandler()
            ? handler.call(promise._boundValue())
            : handler.call(promise._boundValue(), reasonOrValue);
        if (ret === NEXT_FILTER) {
            return ret;
        } else if (ret !== undefined) {
            promise._setReturnedNonUndefined();
            var maybePromise = tryConvertToPromise(ret, promise);
            if (maybePromise instanceof Promise) {
                if (this.cancelPromise != null) {
                    if (maybePromise._isCancelled()) {
                        var reason =
                            new CancellationError("late cancellation observer");
                        promise._attachExtraTrace(reason);
                        errorObj.e = reason;
                        return errorObj;
                    } else if (maybePromise.isPending()) {
                        maybePromise._attachCancellationCallback(
                            new FinallyHandlerCancelReaction(this));
                    }
                }
                return maybePromise._then(
                    succeed, fail, undefined, this, undefined);
            }
        }
    }

    if (promise.isRejected()) {
        checkCancel(this);
        errorObj.e = reasonOrValue;
        return errorObj;
    } else {
        checkCancel(this);
        return reasonOrValue;
    }
}

Promise.prototype._passThrough = function(handler, type, success, fail) {
    if (typeof handler !== "function") return this.then();
    return this._then(success,
                      fail,
                      undefined,
                      new PassThroughHandlerContext(this, type, handler),
                      undefined);
};

Promise.prototype.lastly =
Promise.prototype["finally"] = function (handler) {
    return this._passThrough(handler,
                             0,
                             finallyHandler,
                             finallyHandler);
};


Promise.prototype.tap = function (handler) {
    return this._passThrough(handler, 1, finallyHandler);
};

Promise.prototype.tapCatch = function (handlerOrPredicate) {
    var len = arguments.length;
    if(len === 1) {
        return this._passThrough(handlerOrPredicate,
                                 1,
                                 undefined,
                                 finallyHandler);
    } else {
         var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return Promise.reject(new TypeError(
                    "tapCatch statement predicate: "
                    + "expecting an object but got " + util.classString(item)
                ));
            }
        }
        catchInstances.length = j;
        var handler = arguments[i];
        return this._passThrough(catchFilter(catchInstances, handler, this),
                                 1,
                                 undefined,
                                 finallyHandler);
    }

};

return PassThroughHandlerContext;
};

},{"./catch_filter":7,"./util":36}],16:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise,
                          apiRejection,
                          INTERNAL,
                          tryConvertToPromise,
                          Proxyable,
                          debug) {
var errors = _dereq_("./errors");
var TypeError = errors.TypeError;
var util = _dereq_("./util");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
var yieldHandlers = [];

function promiseFromYieldHandler(value, yieldHandlers, traceParent) {
    for (var i = 0; i < yieldHandlers.length; ++i) {
        traceParent._pushContext();
        var result = tryCatch(yieldHandlers[i])(value);
        traceParent._popContext();
        if (result === errorObj) {
            traceParent._pushContext();
            var ret = Promise.reject(errorObj.e);
            traceParent._popContext();
            return ret;
        }
        var maybePromise = tryConvertToPromise(result, traceParent);
        if (maybePromise instanceof Promise) return maybePromise;
    }
    return null;
}

function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
    if (debug.cancellation()) {
        var internal = new Promise(INTERNAL);
        var _finallyPromise = this._finallyPromise = new Promise(INTERNAL);
        this._promise = internal.lastly(function() {
            return _finallyPromise;
        });
        internal._captureStackTrace();
        internal._setOnCancel(this);
    } else {
        var promise = this._promise = new Promise(INTERNAL);
        promise._captureStackTrace();
    }
    this._stack = stack;
    this._generatorFunction = generatorFunction;
    this._receiver = receiver;
    this._generator = undefined;
    this._yieldHandlers = typeof yieldHandler === "function"
        ? [yieldHandler].concat(yieldHandlers)
        : yieldHandlers;
    this._yieldedPromise = null;
    this._cancellationPhase = false;
}
util.inherits(PromiseSpawn, Proxyable);

PromiseSpawn.prototype._isResolved = function() {
    return this._promise === null;
};

PromiseSpawn.prototype._cleanup = function() {
    this._promise = this._generator = null;
    if (debug.cancellation() && this._finallyPromise !== null) {
        this._finallyPromise._fulfill();
        this._finallyPromise = null;
    }
};

PromiseSpawn.prototype._promiseCancelled = function() {
    if (this._isResolved()) return;
    var implementsReturn = typeof this._generator["return"] !== "undefined";

    var result;
    if (!implementsReturn) {
        var reason = new Promise.CancellationError(
            "generator .return() sentinel");
        Promise.coroutine.returnSentinel = reason;
        this._promise._attachExtraTrace(reason);
        this._promise._pushContext();
        result = tryCatch(this._generator["throw"]).call(this._generator,
                                                         reason);
        this._promise._popContext();
    } else {
        this._promise._pushContext();
        result = tryCatch(this._generator["return"]).call(this._generator,
                                                          undefined);
        this._promise._popContext();
    }
    this._cancellationPhase = true;
    this._yieldedPromise = null;
    this._continue(result);
};

PromiseSpawn.prototype._promiseFulfilled = function(value) {
    this._yieldedPromise = null;
    this._promise._pushContext();
    var result = tryCatch(this._generator.next).call(this._generator, value);
    this._promise._popContext();
    this._continue(result);
};

PromiseSpawn.prototype._promiseRejected = function(reason) {
    this._yieldedPromise = null;
    this._promise._attachExtraTrace(reason);
    this._promise._pushContext();
    var result = tryCatch(this._generator["throw"])
        .call(this._generator, reason);
    this._promise._popContext();
    this._continue(result);
};

PromiseSpawn.prototype._resultCancelled = function() {
    if (this._yieldedPromise instanceof Promise) {
        var promise = this._yieldedPromise;
        this._yieldedPromise = null;
        promise.cancel();
    }
};

PromiseSpawn.prototype.promise = function () {
    return this._promise;
};

PromiseSpawn.prototype._run = function () {
    this._generator = this._generatorFunction.call(this._receiver);
    this._receiver =
        this._generatorFunction = undefined;
    this._promiseFulfilled(undefined);
};

PromiseSpawn.prototype._continue = function (result) {
    var promise = this._promise;
    if (result === errorObj) {
        this._cleanup();
        if (this._cancellationPhase) {
            return promise.cancel();
        } else {
            return promise._rejectCallback(result.e, false);
        }
    }

    var value = result.value;
    if (result.done === true) {
        this._cleanup();
        if (this._cancellationPhase) {
            return promise.cancel();
        } else {
            return promise._resolveCallback(value);
        }
    } else {
        var maybePromise = tryConvertToPromise(value, this._promise);
        if (!(maybePromise instanceof Promise)) {
            maybePromise =
                promiseFromYieldHandler(maybePromise,
                                        this._yieldHandlers,
                                        this._promise);
            if (maybePromise === null) {
                this._promiseRejected(
                    new TypeError(
                        "A value %s was yielded that could not be treated as a promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", String(value)) +
                        "From coroutine:\u000a" +
                        this._stack.split("\n").slice(1, -7).join("\n")
                    )
                );
                return;
            }
        }
        maybePromise = maybePromise._target();
        var bitField = maybePromise._bitField;
        ;
        if (((bitField & 50397184) === 0)) {
            this._yieldedPromise = maybePromise;
            maybePromise._proxy(this, null);
        } else if (((bitField & 33554432) !== 0)) {
            Promise._async.invoke(
                this._promiseFulfilled, this, maybePromise._value()
            );
        } else if (((bitField & 16777216) !== 0)) {
            Promise._async.invoke(
                this._promiseRejected, this, maybePromise._reason()
            );
        } else {
            this._promiseCancelled();
        }
    }
};

Promise.coroutine = function (generatorFunction, options) {
    if (typeof generatorFunction !== "function") {
        throw new TypeError("generatorFunction must be a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var yieldHandler = Object(options).yieldHandler;
    var PromiseSpawn$ = PromiseSpawn;
    var stack = new Error().stack;
    return function () {
        var generator = generatorFunction.apply(this, arguments);
        var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,
                                      stack);
        var ret = spawn.promise();
        spawn._generator = generator;
        spawn._promiseFulfilled(undefined);
        return ret;
    };
};

Promise.coroutine.addYieldHandler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    yieldHandlers.push(fn);
};

Promise.spawn = function (generatorFunction) {
    debug.deprecated("Promise.spawn()", "Promise.coroutine()");
    if (typeof generatorFunction !== "function") {
        return apiRejection("generatorFunction must be a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var spawn = new PromiseSpawn(generatorFunction, this);
    var ret = spawn.promise();
    spawn._run(Promise.spawn);
    return ret;
};
};

},{"./errors":12,"./util":36}],17:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) {
var util = _dereq_("./util");
var canEvaluate = util.canEvaluate;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var reject;

if (!true) {
if (canEvaluate) {
    var thenCallback = function(i) {
        return new Function("value", "holder", "                             \n\
            'use strict';                                                    \n\
            holder.pIndex = value;                                           \n\
            holder.checkFulfillment(this);                                   \n\
            ".replace(/Index/g, i));
    };

    var promiseSetter = function(i) {
        return new Function("promise", "holder", "                           \n\
            'use strict';                                                    \n\
            holder.pIndex = promise;                                         \n\
            ".replace(/Index/g, i));
    };

    var generateHolderClass = function(total) {
        var props = new Array(total);
        for (var i = 0; i < props.length; ++i) {
            props[i] = "this.p" + (i+1);
        }
        var assignment = props.join(" = ") + " = null;";
        var cancellationCode= "var promise;\n" + props.map(function(prop) {
            return "                                                         \n\
                promise = " + prop + ";                                      \n\
                if (promise instanceof Promise) {                            \n\
                    promise.cancel();                                        \n\
                }                                                            \n\
            ";
        }).join("\n");
        var passedArguments = props.join(", ");
        var name = "Holder$" + total;


        var code = "return function(tryCatch, errorObj, Promise, async) {    \n\
            'use strict';                                                    \n\
            function [TheName](fn) {                                         \n\
                [TheProperties]                                              \n\
                this.fn = fn;                                                \n\
                this.asyncNeeded = true;                                     \n\
                this.now = 0;                                                \n\
            }                                                                \n\
                                                                             \n\
            [TheName].prototype._callFunction = function(promise) {          \n\
                promise._pushContext();                                      \n\
                var ret = tryCatch(this.fn)([ThePassedArguments]);           \n\
                promise._popContext();                                       \n\
                if (ret === errorObj) {                                      \n\
                    promise._rejectCallback(ret.e, false);                   \n\
                } else {                                                     \n\
                    promise._resolveCallback(ret);                           \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype.checkFulfillment = function(promise) {       \n\
                var now = ++this.now;                                        \n\
                if (now === [TheTotal]) {                                    \n\
                    if (this.asyncNeeded) {                                  \n\
                        async.invoke(this._callFunction, this, promise);     \n\
                    } else {                                                 \n\
                        this._callFunction(promise);                         \n\
                    }                                                        \n\
                                                                             \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype._resultCancelled = function() {              \n\
                [CancellationCode]                                           \n\
            };                                                               \n\
                                                                             \n\
            return [TheName];                                                \n\
        }(tryCatch, errorObj, Promise, async);                               \n\
        ";

        code = code.replace(/\[TheName\]/g, name)
            .replace(/\[TheTotal\]/g, total)
            .replace(/\[ThePassedArguments\]/g, passedArguments)
            .replace(/\[TheProperties\]/g, assignment)
            .replace(/\[CancellationCode\]/g, cancellationCode);

        return new Function("tryCatch", "errorObj", "Promise", "async", code)
                           (tryCatch, errorObj, Promise, async);
    };

    var holderClasses = [];
    var thenCallbacks = [];
    var promiseSetters = [];

    for (var i = 0; i < 8; ++i) {
        holderClasses.push(generateHolderClass(i + 1));
        thenCallbacks.push(thenCallback(i + 1));
        promiseSetters.push(promiseSetter(i + 1));
    }

    reject = function (reason) {
        this._reject(reason);
    };
}}

Promise.join = function () {
    var last = arguments.length - 1;
    var fn;
    if (last > 0 && typeof arguments[last] === "function") {
        fn = arguments[last];
        if (!true) {
            if (last <= 8 && canEvaluate) {
                var ret = new Promise(INTERNAL);
                ret._captureStackTrace();
                var HolderClass = holderClasses[last - 1];
                var holder = new HolderClass(fn);
                var callbacks = thenCallbacks;

                for (var i = 0; i < last; ++i) {
                    var maybePromise = tryConvertToPromise(arguments[i], ret);
                    if (maybePromise instanceof Promise) {
                        maybePromise = maybePromise._target();
                        var bitField = maybePromise._bitField;
                        ;
                        if (((bitField & 50397184) === 0)) {
                            maybePromise._then(callbacks[i], reject,
                                               undefined, ret, holder);
                            promiseSetters[i](maybePromise, holder);
                            holder.asyncNeeded = false;
                        } else if (((bitField & 33554432) !== 0)) {
                            callbacks[i].call(ret,
                                              maybePromise._value(), holder);
                        } else if (((bitField & 16777216) !== 0)) {
                            ret._reject(maybePromise._reason());
                        } else {
                            ret._cancel();
                        }
                    } else {
                        callbacks[i].call(ret, maybePromise, holder);
                    }
                }

                if (!ret._isFateSealed()) {
                    if (holder.asyncNeeded) {
                        var context = Promise._getContext();
                        holder.fn = util.contextBind(context, holder.fn);
                    }
                    ret._setAsyncGuaranteed();
                    ret._setOnCancel(holder);
                }
                return ret;
            }
        }
    }
    var args = [].slice.call(arguments);;
    if (fn) args.pop();
    var ret = new PromiseArray(args).promise();
    return fn !== undefined ? ret.spread(fn) : ret;
};

};

},{"./util":36}],18:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise,
                          PromiseArray,
                          apiRejection,
                          tryConvertToPromise,
                          INTERNAL,
                          debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

function MappingPromiseArray(promises, fn, limit, _filter) {
    this.constructor$(promises);
    this._promise._captureStackTrace();
    var context = Promise._getContext();
    this._callback = util.contextBind(context, fn);
    this._preservedValues = _filter === INTERNAL
        ? new Array(this.length())
        : null;
    this._limit = limit;
    this._inFlight = 0;
    this._queue = [];
    async.invoke(this._asyncInit, this, undefined);
    if (util.isArray(promises)) {
        for (var i = 0; i < promises.length; ++i) {
            var maybePromise = promises[i];
            if (maybePromise instanceof Promise) {
                maybePromise.suppressUnhandledRejections();
            }
        }
    }
}
util.inherits(MappingPromiseArray, PromiseArray);

MappingPromiseArray.prototype._asyncInit = function() {
    this._init$(undefined, -2);
};

MappingPromiseArray.prototype._init = function () {};

MappingPromiseArray.prototype._promiseFulfilled = function (value, index) {
    var values = this._values;
    var length = this.length();
    var preservedValues = this._preservedValues;
    var limit = this._limit;

    if (index < 0) {
        index = (index * -1) - 1;
        values[index] = value;
        if (limit >= 1) {
            this._inFlight--;
            this._drainQueue();
            if (this._isResolved()) return true;
        }
    } else {
        if (limit >= 1 && this._inFlight >= limit) {
            values[index] = value;
            this._queue.push(index);
            return false;
        }
        if (preservedValues !== null) preservedValues[index] = value;

        var promise = this._promise;
        var callback = this._callback;
        var receiver = promise._boundValue();
        promise._pushContext();
        var ret = tryCatch(callback).call(receiver, value, index, length);
        var promiseCreated = promise._popContext();
        debug.checkForgottenReturns(
            ret,
            promiseCreated,
            preservedValues !== null ? "Promise.filter" : "Promise.map",
            promise
        );
        if (ret === errorObj) {
            this._reject(ret.e);
            return true;
        }

        var maybePromise = tryConvertToPromise(ret, this._promise);
        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            var bitField = maybePromise._bitField;
            ;
            if (((bitField & 50397184) === 0)) {
                if (limit >= 1) this._inFlight++;
                values[index] = maybePromise;
                maybePromise._proxy(this, (index + 1) * -1);
                return false;
            } else if (((bitField & 33554432) !== 0)) {
                ret = maybePromise._value();
            } else if (((bitField & 16777216) !== 0)) {
                this._reject(maybePromise._reason());
                return true;
            } else {
                this._cancel();
                return true;
            }
        }
        values[index] = ret;
    }
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= length) {
        if (preservedValues !== null) {
            this._filter(values, preservedValues);
        } else {
            this._resolve(values);
        }
        return true;
    }
    return false;
};

MappingPromiseArray.prototype._drainQueue = function () {
    var queue = this._queue;
    var limit = this._limit;
    var values = this._values;
    while (queue.length > 0 && this._inFlight < limit) {
        if (this._isResolved()) return;
        var index = queue.pop();
        this._promiseFulfilled(values[index], index);
    }
};

MappingPromiseArray.prototype._filter = function (booleans, values) {
    var len = values.length;
    var ret = new Array(len);
    var j = 0;
    for (var i = 0; i < len; ++i) {
        if (booleans[i]) ret[j++] = values[i];
    }
    ret.length = j;
    this._resolve(ret);
};

MappingPromiseArray.prototype.preservedValues = function () {
    return this._preservedValues;
};

function map(promises, fn, options, _filter) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }

    var limit = 0;
    if (options !== undefined) {
        if (typeof options === "object" && options !== null) {
            if (typeof options.concurrency !== "number") {
                return Promise.reject(
                    new TypeError("'concurrency' must be a number but it is " +
                                    util.classString(options.concurrency)));
            }
            limit = options.concurrency;
        } else {
            return Promise.reject(new TypeError(
                            "options argument must be an object but it is " +
                             util.classString(options)));
        }
    }
    limit = typeof limit === "number" &&
        isFinite(limit) && limit >= 1 ? limit : 0;
    return new MappingPromiseArray(promises, fn, limit, _filter).promise();
}

Promise.prototype.map = function (fn, options) {
    return map(this, fn, options, null);
};

Promise.map = function (promises, fn, options, _filter) {
    return map(promises, fn, options, _filter);
};


};

},{"./util":36}],19:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;

Promise.method = function (fn) {
    if (typeof fn !== "function") {
        throw new Promise.TypeError("expecting a function but got " + util.classString(fn));
    }
    return function () {
        var ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._pushContext();
        var value = tryCatch(fn).apply(this, arguments);
        var promiseCreated = ret._popContext();
        debug.checkForgottenReturns(
            value, promiseCreated, "Promise.method", ret);
        ret._resolveFromSyncValue(value);
        return ret;
    };
};

Promise.attempt = Promise["try"] = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._pushContext();
    var value;
    if (arguments.length > 1) {
        debug.deprecated("calling Promise.try with more than 1 argument");
        var arg = arguments[1];
        var ctx = arguments[2];
        value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg)
                                  : tryCatch(fn).call(ctx, arg);
    } else {
        value = tryCatch(fn)();
    }
    var promiseCreated = ret._popContext();
    debug.checkForgottenReturns(
        value, promiseCreated, "Promise.try", ret);
    ret._resolveFromSyncValue(value);
    return ret;
};

Promise.prototype._resolveFromSyncValue = function (value) {
    if (value === util.errorObj) {
        this._rejectCallback(value.e, false);
    } else {
        this._resolveCallback(value, true);
    }
};
};

},{"./util":36}],20:[function(_dereq_,module,exports){
"use strict";
var util = _dereq_("./util");
var maybeWrapAsError = util.maybeWrapAsError;
var errors = _dereq_("./errors");
var OperationalError = errors.OperationalError;
var es5 = _dereq_("./es5");

function isUntypedError(obj) {
    return obj instanceof Error &&
        es5.getPrototypeOf(obj) === Error.prototype;
}

var rErrorKey = /^(?:name|message|stack|cause)$/;
function wrapAsOperationalError(obj) {
    var ret;
    if (isUntypedError(obj)) {
        ret = new OperationalError(obj);
        ret.name = obj.name;
        ret.message = obj.message;
        ret.stack = obj.stack;
        var keys = es5.keys(obj);
        for (var i = 0; i < keys.length; ++i) {
            var key = keys[i];
            if (!rErrorKey.test(key)) {
                ret[key] = obj[key];
            }
        }
        return ret;
    }
    util.markAsOriginatingFromRejection(obj);
    return obj;
}

function nodebackForPromise(promise, multiArgs) {
    return function(err, value) {
        if (promise === null) return;
        if (err) {
            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));
            promise._attachExtraTrace(wrapped);
            promise._reject(wrapped);
        } else if (!multiArgs) {
            promise._fulfill(value);
        } else {
            var args = [].slice.call(arguments, 1);;
            promise._fulfill(args);
        }
        promise = null;
    };
}

module.exports = nodebackForPromise;

},{"./errors":12,"./es5":13,"./util":36}],21:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
var util = _dereq_("./util");
var async = Promise._async;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function spreadAdapter(val, nodeback) {
    var promise = this;
    if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);
    var ret =
        tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}

function successAdapter(val, nodeback) {
    var promise = this;
    var receiver = promise._boundValue();
    var ret = val === undefined
        ? tryCatch(nodeback).call(receiver, null)
        : tryCatch(nodeback).call(receiver, null, val);
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}
function errorAdapter(reason, nodeback) {
    var promise = this;
    if (!reason) {
        var newReason = new Error(reason + "");
        newReason.cause = reason;
        reason = newReason;
    }
    var ret = tryCatch(nodeback).call(promise._boundValue(), reason);
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}

Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback,
                                                                     options) {
    if (typeof nodeback == "function") {
        var adapter = successAdapter;
        if (options !== undefined && Object(options).spread) {
            adapter = spreadAdapter;
        }
        this._then(
            adapter,
            errorAdapter,
            undefined,
            this,
            nodeback
        );
    }
    return this;
};
};

},{"./util":36}],22:[function(_dereq_,module,exports){
"use strict";
module.exports = function() {
var makeSelfResolutionError = function () {
    return new TypeError("circular promise resolution chain\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var reflectHandler = function() {
    return new Promise.PromiseInspection(this._target());
};
var apiRejection = function(msg) {
    return Promise.reject(new TypeError(msg));
};
function Proxyable() {}
var UNDEFINED_BINDING = {};
var util = _dereq_("./util");
util.setReflectHandler(reflectHandler);

var getDomain = function() {
    var domain = process.domain;
    if (domain === undefined) {
        return null;
    }
    return domain;
};
var getContextDefault = function() {
    return null;
};
var getContextDomain = function() {
    return {
        domain: getDomain(),
        async: null
    };
};
var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ?
    _dereq_("async_hooks").AsyncResource : null;
var getContextAsyncHooks = function() {
    return {
        domain: getDomain(),
        async: new AsyncResource("Bluebird::Promise")
    };
};
var getContext = util.isNode ? getContextDomain : getContextDefault;
util.notEnumerableProp(Promise, "_getContext", getContext);
var enableAsyncHooks = function() {
    getContext = getContextAsyncHooks;
    util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks);
};
var disableAsyncHooks = function() {
    getContext = getContextDomain;
    util.notEnumerableProp(Promise, "_getContext", getContextDomain);
};

var es5 = _dereq_("./es5");
var Async = _dereq_("./async");
var async = new Async();
es5.defineProperty(Promise, "_async", {value: async});
var errors = _dereq_("./errors");
var TypeError = Promise.TypeError = errors.TypeError;
Promise.RangeError = errors.RangeError;
var CancellationError = Promise.CancellationError = errors.CancellationError;
Promise.TimeoutError = errors.TimeoutError;
Promise.OperationalError = errors.OperationalError;
Promise.RejectionError = errors.OperationalError;
Promise.AggregateError = errors.AggregateError;
var INTERNAL = function(){};
var APPLY = {};
var NEXT_FILTER = {};
var tryConvertToPromise = _dereq_("./thenables")(Promise, INTERNAL);
var PromiseArray =
    _dereq_("./promise_array")(Promise, INTERNAL,
                               tryConvertToPromise, apiRejection, Proxyable);
var Context = _dereq_("./context")(Promise);
 /*jshint unused:false*/
var createContext = Context.create;

var debug = _dereq_("./debuggability")(Promise, Context,
    enableAsyncHooks, disableAsyncHooks);
var CapturedTrace = debug.CapturedTrace;
var PassThroughHandlerContext =
    _dereq_("./finally")(Promise, tryConvertToPromise, NEXT_FILTER);
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);
var nodebackForPromise = _dereq_("./nodeback");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
function check(self, executor) {
    if (self == null || self.constructor !== Promise) {
        throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (typeof executor !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(executor));
    }

}

function Promise(executor) {
    if (executor !== INTERNAL) {
        check(this, executor);
    }
    this._bitField = 0;
    this._fulfillmentHandler0 = undefined;
    this._rejectionHandler0 = undefined;
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._resolveFromExecutor(executor);
    this._promiseCreated();
    this._fireEvent("promiseCreated", this);
}

Promise.prototype.toString = function () {
    return "[object Promise]";
};

Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {
    var len = arguments.length;
    if (len > 1) {
        var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return apiRejection("Catch statement predicate: " +
                    "expecting an object but got " + util.classString(item));
            }
        }
        catchInstances.length = j;
        fn = arguments[i];

        if (typeof fn !== "function") {
            throw new TypeError("The last argument to .catch() " +
                "must be a function, got " + util.toString(fn));
        }
        return this.then(undefined, catchFilter(catchInstances, fn, this));
    }
    return this.then(undefined, fn);
};

Promise.prototype.reflect = function () {
    return this._then(reflectHandler,
        reflectHandler, undefined, this, undefined);
};

Promise.prototype.then = function (didFulfill, didReject) {
    if (debug.warnings() && arguments.length > 0 &&
        typeof didFulfill !== "function" &&
        typeof didReject !== "function") {
        var msg = ".then() only accepts functions but was passed: " +
                util.classString(didFulfill);
        if (arguments.length > 1) {
            msg += ", " + util.classString(didReject);
        }
        this._warn(msg);
    }
    return this._then(didFulfill, didReject, undefined, undefined, undefined);
};

Promise.prototype.done = function (didFulfill, didReject) {
    var promise =
        this._then(didFulfill, didReject, undefined, undefined, undefined);
    promise._setIsFinal();
};

Promise.prototype.spread = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    return this.all()._then(fn, undefined, undefined, APPLY, undefined);
};

Promise.prototype.toJSON = function () {
    var ret = {
        isFulfilled: false,
        isRejected: false,
        fulfillmentValue: undefined,
        rejectionReason: undefined
    };
    if (this.isFulfilled()) {
        ret.fulfillmentValue = this.value();
        ret.isFulfilled = true;
    } else if (this.isRejected()) {
        ret.rejectionReason = this.reason();
        ret.isRejected = true;
    }
    return ret;
};

Promise.prototype.all = function () {
    if (arguments.length > 0) {
        this._warn(".all() was passed arguments but it does not take any");
    }
    return new PromiseArray(this).promise();
};

Promise.prototype.error = function (fn) {
    return this.caught(util.originatesFromRejection, fn);
};

Promise.getNewLibraryCopy = module.exports;

Promise.is = function (val) {
    return val instanceof Promise;
};

Promise.fromNode = Promise.fromCallback = function(fn) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs
                                         : false;
    var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));
    if (result === errorObj) {
        ret._rejectCallback(result.e, true);
    }
    if (!ret._isFateSealed()) ret._setAsyncGuaranteed();
    return ret;
};

Promise.all = function (promises) {
    return new PromiseArray(promises).promise();
};

Promise.cast = function (obj) {
    var ret = tryConvertToPromise(obj);
    if (!(ret instanceof Promise)) {
        ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._setFulfilled();
        ret._rejectionHandler0 = obj;
    }
    return ret;
};

Promise.resolve = Promise.fulfilled = Promise.cast;

Promise.reject = Promise.rejected = function (reason) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._rejectCallback(reason, true);
    return ret;
};

Promise.setScheduler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    return async.setScheduler(fn);
};

Promise.prototype._then = function (
    didFulfill,
    didReject,
    _,    receiver,
    internalData
) {
    var haveInternalData = internalData !== undefined;
    var promise = haveInternalData ? internalData : new Promise(INTERNAL);
    var target = this._target();
    var bitField = target._bitField;

    if (!haveInternalData) {
        promise._propagateFrom(this, 3);
        promise._captureStackTrace();
        if (receiver === undefined &&
            ((this._bitField & 2097152) !== 0)) {
            if (!((bitField & 50397184) === 0)) {
                receiver = this._boundValue();
            } else {
                receiver = target === this ? undefined : this._boundTo;
            }
        }
        this._fireEvent("promiseChained", this, promise);
    }

    var context = getContext();
    if (!((bitField & 50397184) === 0)) {
        var handler, value, settler = target._settlePromiseCtx;
        if (((bitField & 33554432) !== 0)) {
            value = target._rejectionHandler0;
            handler = didFulfill;
        } else if (((bitField & 16777216) !== 0)) {
            value = target._fulfillmentHandler0;
            handler = didReject;
            target._unsetRejectionIsUnhandled();
        } else {
            settler = target._settlePromiseLateCancellationObserver;
            value = new CancellationError("late cancellation observer");
            target._attachExtraTrace(value);
            handler = didReject;
        }

        async.invoke(settler, target, {
            handler: util.contextBind(context, handler),
            promise: promise,
            receiver: receiver,
            value: value
        });
    } else {
        target._addCallbacks(didFulfill, didReject, promise,
                receiver, context);
    }

    return promise;
};

Promise.prototype._length = function () {
    return this._bitField & 65535;
};

Promise.prototype._isFateSealed = function () {
    return (this._bitField & 117506048) !== 0;
};

Promise.prototype._isFollowing = function () {
    return (this._bitField & 67108864) === 67108864;
};

Promise.prototype._setLength = function (len) {
    this._bitField = (this._bitField & -65536) |
        (len & 65535);
};

Promise.prototype._setFulfilled = function () {
    this._bitField = this._bitField | 33554432;
    this._fireEvent("promiseFulfilled", this);
};

Promise.prototype._setRejected = function () {
    this._bitField = this._bitField | 16777216;
    this._fireEvent("promiseRejected", this);
};

Promise.prototype._setFollowing = function () {
    this._bitField = this._bitField | 67108864;
    this._fireEvent("promiseResolved", this);
};

Promise.prototype._setIsFinal = function () {
    this._bitField = this._bitField | 4194304;
};

Promise.prototype._isFinal = function () {
    return (this._bitField & 4194304) > 0;
};

Promise.prototype._unsetCancelled = function() {
    this._bitField = this._bitField & (~65536);
};

Promise.prototype._setCancelled = function() {
    this._bitField = this._bitField | 65536;
    this._fireEvent("promiseCancelled", this);
};

Promise.prototype._setWillBeCancelled = function() {
    this._bitField = this._bitField | 8388608;
};

Promise.prototype._setAsyncGuaranteed = function() {
    if (async.hasCustomScheduler()) return;
    var bitField = this._bitField;
    this._bitField = bitField |
        (((bitField & 536870912) >> 2) ^
        134217728);
};

Promise.prototype._setNoAsyncGuarantee = function() {
    this._bitField = (this._bitField | 536870912) &
        (~134217728);
};

Promise.prototype._receiverAt = function (index) {
    var ret = index === 0 ? this._receiver0 : this[
            index * 4 - 4 + 3];
    if (ret === UNDEFINED_BINDING) {
        return undefined;
    } else if (ret === undefined && this._isBound()) {
        return this._boundValue();
    }
    return ret;
};

Promise.prototype._promiseAt = function (index) {
    return this[
            index * 4 - 4 + 2];
};

Promise.prototype._fulfillmentHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 0];
};

Promise.prototype._rejectionHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 1];
};

Promise.prototype._boundValue = function() {};

Promise.prototype._migrateCallback0 = function (follower) {
    var bitField = follower._bitField;
    var fulfill = follower._fulfillmentHandler0;
    var reject = follower._rejectionHandler0;
    var promise = follower._promise0;
    var receiver = follower._receiverAt(0);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._migrateCallbackAt = function (follower, index) {
    var fulfill = follower._fulfillmentHandlerAt(index);
    var reject = follower._rejectionHandlerAt(index);
    var promise = follower._promiseAt(index);
    var receiver = follower._receiverAt(index);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._addCallbacks = function (
    fulfill,
    reject,
    promise,
    receiver,
    context
) {
    var index = this._length();

    if (index >= 65535 - 4) {
        index = 0;
        this._setLength(0);
    }

    if (index === 0) {
        this._promise0 = promise;
        this._receiver0 = receiver;
        if (typeof fulfill === "function") {
            this._fulfillmentHandler0 = util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this._rejectionHandler0 = util.contextBind(context, reject);
        }
    } else {
        var base = index * 4 - 4;
        this[base + 2] = promise;
        this[base + 3] = receiver;
        if (typeof fulfill === "function") {
            this[base + 0] =
                util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this[base + 1] =
                util.contextBind(context, reject);
        }
    }
    this._setLength(index + 1);
    return index;
};

Promise.prototype._proxy = function (proxyable, arg) {
    this._addCallbacks(undefined, undefined, arg, proxyable, null);
};

Promise.prototype._resolveCallback = function(value, shouldBind) {
    if (((this._bitField & 117506048) !== 0)) return;
    if (value === this)
        return this._rejectCallback(makeSelfResolutionError(), false);
    var maybePromise = tryConvertToPromise(value, this);
    if (!(maybePromise instanceof Promise)) return this._fulfill(value);

    if (shouldBind) this._propagateFrom(maybePromise, 2);


    var promise = maybePromise._target();

    if (promise === this) {
        this._reject(makeSelfResolutionError());
        return;
    }

    var bitField = promise._bitField;
    if (((bitField & 50397184) === 0)) {
        var len = this._length();
        if (len > 0) promise._migrateCallback0(this);
        for (var i = 1; i < len; ++i) {
            promise._migrateCallbackAt(this, i);
        }
        this._setFollowing();
        this._setLength(0);
        this._setFollowee(maybePromise);
    } else if (((bitField & 33554432) !== 0)) {
        this._fulfill(promise._value());
    } else if (((bitField & 16777216) !== 0)) {
        this._reject(promise._reason());
    } else {
        var reason = new CancellationError("late cancellation observer");
        promise._attachExtraTrace(reason);
        this._reject(reason);
    }
};

Promise.prototype._rejectCallback =
function(reason, synchronous, ignoreNonErrorWarnings) {
    var trace = util.ensureErrorObject(reason);
    var hasStack = trace === reason;
    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {
        var message = "a promise was rejected with a non-error: " +
            util.classString(reason);
        this._warn(message, true);
    }
    this._attachExtraTrace(trace, synchronous ? hasStack : false);
    this._reject(reason);
};

Promise.prototype._resolveFromExecutor = function (executor) {
    if (executor === INTERNAL) return;
    var promise = this;
    this._captureStackTrace();
    this._pushContext();
    var synchronous = true;
    var r = this._execute(executor, function(value) {
        promise._resolveCallback(value);
    }, function (reason) {
        promise._rejectCallback(reason, synchronous);
    });
    synchronous = false;
    this._popContext();

    if (r !== undefined) {
        promise._rejectCallback(r, true);
    }
};

Promise.prototype._settlePromiseFromHandler = function (
    handler, receiver, value, promise
) {
    var bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;
    promise._pushContext();
    var x;
    if (receiver === APPLY) {
        if (!value || typeof value.length !== "number") {
            x = errorObj;
            x.e = new TypeError("cannot .spread() a non-array: " +
                                    util.classString(value));
        } else {
            x = tryCatch(handler).apply(this._boundValue(), value);
        }
    } else {
        x = tryCatch(handler).call(receiver, value);
    }
    var promiseCreated = promise._popContext();
    bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;

    if (x === NEXT_FILTER) {
        promise._reject(value);
    } else if (x === errorObj) {
        promise._rejectCallback(x.e, false);
    } else {
        debug.checkForgottenReturns(x, promiseCreated, "",  promise, this);
        promise._resolveCallback(x);
    }
};

Promise.prototype._target = function() {
    var ret = this;
    while (ret._isFollowing()) ret = ret._followee();
    return ret;
};

Promise.prototype._followee = function() {
    return this._rejectionHandler0;
};

Promise.prototype._setFollowee = function(promise) {
    this._rejectionHandler0 = promise;
};

Promise.prototype._settlePromise = function(promise, handler, receiver, value) {
    var isPromise = promise instanceof Promise;
    var bitField = this._bitField;
    var asyncGuaranteed = ((bitField & 134217728) !== 0);
    if (((bitField & 65536) !== 0)) {
        if (isPromise) promise._invokeInternalOnCancel();

        if (receiver instanceof PassThroughHandlerContext &&
            receiver.isFinallyHandler()) {
            receiver.cancelPromise = promise;
            if (tryCatch(handler).call(receiver, value) === errorObj) {
                promise._reject(errorObj.e);
            }
        } else if (handler === reflectHandler) {
            promise._fulfill(reflectHandler.call(receiver));
        } else if (receiver instanceof Proxyable) {
            receiver._promiseCancelled(promise);
        } else if (isPromise || promise instanceof PromiseArray) {
            promise._cancel();
        } else {
            receiver.cancel();
        }
    } else if (typeof handler === "function") {
        if (!isPromise) {
            handler.call(receiver, value, promise);
        } else {
            if (asyncGuaranteed) promise._setAsyncGuaranteed();
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (receiver instanceof Proxyable) {
        if (!receiver._isResolved()) {
            if (((bitField & 33554432) !== 0)) {
                receiver._promiseFulfilled(value, promise);
            } else {
                receiver._promiseRejected(value, promise);
            }
        }
    } else if (isPromise) {
        if (asyncGuaranteed) promise._setAsyncGuaranteed();
        if (((bitField & 33554432) !== 0)) {
            promise._fulfill(value);
        } else {
            promise._reject(value);
        }
    }
};

Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) {
    var handler = ctx.handler;
    var promise = ctx.promise;
    var receiver = ctx.receiver;
    var value = ctx.value;
    if (typeof handler === "function") {
        if (!(promise instanceof Promise)) {
            handler.call(receiver, value, promise);
        } else {
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (promise instanceof Promise) {
        promise._reject(value);
    }
};

Promise.prototype._settlePromiseCtx = function(ctx) {
    this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);
};

Promise.prototype._settlePromise0 = function(handler, value, bitField) {
    var promise = this._promise0;
    var receiver = this._receiverAt(0);
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._settlePromise(promise, handler, receiver, value);
};

Promise.prototype._clearCallbackDataAtIndex = function(index) {
    var base = index * 4 - 4;
    this[base + 2] =
    this[base + 3] =
    this[base + 0] =
    this[base + 1] = undefined;
};

Promise.prototype._fulfill = function (value) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    if (value === this) {
        var err = makeSelfResolutionError();
        this._attachExtraTrace(err);
        return this._reject(err);
    }
    this._setFulfilled();
    this._rejectionHandler0 = value;

    if ((bitField & 65535) > 0) {
        if (((bitField & 134217728) !== 0)) {
            this._settlePromises();
        } else {
            async.settlePromises(this);
        }
        this._dereferenceTrace();
    }
};

Promise.prototype._reject = function (reason) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    this._setRejected();
    this._fulfillmentHandler0 = reason;

    if (this._isFinal()) {
        return async.fatalError(reason, util.isNode);
    }

    if ((bitField & 65535) > 0) {
        async.settlePromises(this);
    } else {
        this._ensurePossibleRejectionHandled();
    }
};

Promise.prototype._fulfillPromises = function (len, value) {
    for (var i = 1; i < len; i++) {
        var handler = this._fulfillmentHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, value);
    }
};

Promise.prototype._rejectPromises = function (len, reason) {
    for (var i = 1; i < len; i++) {
        var handler = this._rejectionHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, reason);
    }
};

Promise.prototype._settlePromises = function () {
    var bitField = this._bitField;
    var len = (bitField & 65535);

    if (len > 0) {
        if (((bitField & 16842752) !== 0)) {
            var reason = this._fulfillmentHandler0;
            this._settlePromise0(this._rejectionHandler0, reason, bitField);
            this._rejectPromises(len, reason);
        } else {
            var value = this._rejectionHandler0;
            this._settlePromise0(this._fulfillmentHandler0, value, bitField);
            this._fulfillPromises(len, value);
        }
        this._setLength(0);
    }
    this._clearCancellationData();
};

Promise.prototype._settledValue = function() {
    var bitField = this._bitField;
    if (((bitField & 33554432) !== 0)) {
        return this._rejectionHandler0;
    } else if (((bitField & 16777216) !== 0)) {
        return this._fulfillmentHandler0;
    }
};

if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
    es5.defineProperty(Promise.prototype, Symbol.toStringTag, {
        get: function () {
            return "Object";
        }
    });
}

function deferResolve(v) {this.promise._resolveCallback(v);}
function deferReject(v) {this.promise._rejectCallback(v, false);}

Promise.defer = Promise.pending = function() {
    debug.deprecated("Promise.defer", "new Promise");
    var promise = new Promise(INTERNAL);
    return {
        promise: promise,
        resolve: deferResolve,
        reject: deferReject
    };
};

util.notEnumerableProp(Promise,
                       "_makeSelfResolutionError",
                       makeSelfResolutionError);

_dereq_("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection,
    debug);
_dereq_("./bind")(Promise, INTERNAL, tryConvertToPromise, debug);
_dereq_("./cancel")(Promise, PromiseArray, apiRejection, debug);
_dereq_("./direct_resolve")(Promise);
_dereq_("./synchronous_inspection")(Promise);
_dereq_("./join")(
    Promise, PromiseArray, tryConvertToPromise, INTERNAL, async);
Promise.Promise = Promise;
Promise.version = "3.7.2";
_dereq_('./call_get.js')(Promise);
_dereq_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);
_dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
_dereq_('./nodeify.js')(Promise);
_dereq_('./promisify.js')(Promise, INTERNAL);
_dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);
_dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);
_dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
_dereq_('./settle.js')(Promise, PromiseArray, debug);
_dereq_('./some.js')(Promise, PromiseArray, apiRejection);
_dereq_('./timers.js')(Promise, INTERNAL, debug);
_dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);
_dereq_('./any.js')(Promise);
_dereq_('./each.js')(Promise, INTERNAL);
_dereq_('./filter.js')(Promise, INTERNAL);
                                                         
    util.toFastProperties(Promise);                                          
    util.toFastProperties(Promise.prototype);                                
    function fillTypes(value) {                                              
        var p = new Promise(INTERNAL);                                       
        p._fulfillmentHandler0 = value;                                      
        p._rejectionHandler0 = value;                                        
        p._promise0 = value;                                                 
        p._receiver0 = value;                                                
    }                                                                        
    // Complete slack tracking, opt out of field-type tracking and           
    // stabilize map                                                         
    fillTypes({a: 1});                                                       
    fillTypes({b: 2});                                                       
    fillTypes({c: 3});                                                       
    fillTypes(1);                                                            
    fillTypes(function(){});                                                 
    fillTypes(undefined);                                                    
    fillTypes(false);                                                        
    fillTypes(new Promise(INTERNAL));                                        
    debug.setBounds(Async.firstLineError, util.lastLineError);               
    return Promise;                                                          

};

},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36,"async_hooks":undefined}],23:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise,
    apiRejection, Proxyable) {
var util = _dereq_("./util");
var isArray = util.isArray;

function toResolutionValue(val) {
    switch(val) {
    case -2: return [];
    case -3: return {};
    case -6: return new Map();
    }
}

function PromiseArray(values) {
    var promise = this._promise = new Promise(INTERNAL);
    if (values instanceof Promise) {
        promise._propagateFrom(values, 3);
        values.suppressUnhandledRejections();
    }
    promise._setOnCancel(this);
    this._values = values;
    this._length = 0;
    this._totalResolved = 0;
    this._init(undefined, -2);
}
util.inherits(PromiseArray, Proxyable);

PromiseArray.prototype.length = function () {
    return this._length;
};

PromiseArray.prototype.promise = function () {
    return this._promise;
};

PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {
    var values = tryConvertToPromise(this._values, this._promise);
    if (values instanceof Promise) {
        values = values._target();
        var bitField = values._bitField;
        ;
        this._values = values;

        if (((bitField & 50397184) === 0)) {
            this._promise._setAsyncGuaranteed();
            return values._then(
                init,
                this._reject,
                undefined,
                this,
                resolveValueIfEmpty
           );
        } else if (((bitField & 33554432) !== 0)) {
            values = values._value();
        } else if (((bitField & 16777216) !== 0)) {
            return this._reject(values._reason());
        } else {
            return this._cancel();
        }
    }
    values = util.asArray(values);
    if (values === null) {
        var err = apiRejection(
            "expecting an array or an iterable object but got " + util.classString(values)).reason();
        this._promise._rejectCallback(err, false);
        return;
    }

    if (values.length === 0) {
        if (resolveValueIfEmpty === -5) {
            this._resolveEmptyArray();
        }
        else {
            this._resolve(toResolutionValue(resolveValueIfEmpty));
        }
        return;
    }
    this._iterate(values);
};

PromiseArray.prototype._iterate = function(values) {
    var len = this.getActualLength(values.length);
    this._length = len;
    this._values = this.shouldCopyValues() ? new Array(len) : this._values;
    var result = this._promise;
    var isResolved = false;
    var bitField = null;
    for (var i = 0; i < len; ++i) {
        var maybePromise = tryConvertToPromise(values[i], result);

        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            bitField = maybePromise._bitField;
        } else {
            bitField = null;
        }

        if (isResolved) {
            if (bitField !== null) {
                maybePromise.suppressUnhandledRejections();
            }
        } else if (bitField !== null) {
            if (((bitField & 50397184) === 0)) {
                maybePromise._proxy(this, i);
                this._values[i] = maybePromise;
            } else if (((bitField & 33554432) !== 0)) {
                isResolved = this._promiseFulfilled(maybePromise._value(), i);
            } else if (((bitField & 16777216) !== 0)) {
                isResolved = this._promiseRejected(maybePromise._reason(), i);
            } else {
                isResolved = this._promiseCancelled(i);
            }
        } else {
            isResolved = this._promiseFulfilled(maybePromise, i);
        }
    }
    if (!isResolved) result._setAsyncGuaranteed();
};

PromiseArray.prototype._isResolved = function () {
    return this._values === null;
};

PromiseArray.prototype._resolve = function (value) {
    this._values = null;
    this._promise._fulfill(value);
};

PromiseArray.prototype._cancel = function() {
    if (this._isResolved() || !this._promise._isCancellable()) return;
    this._values = null;
    this._promise._cancel();
};

PromiseArray.prototype._reject = function (reason) {
    this._values = null;
    this._promise._rejectCallback(reason, false);
};

PromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

PromiseArray.prototype._promiseCancelled = function() {
    this._cancel();
    return true;
};

PromiseArray.prototype._promiseRejected = function (reason) {
    this._totalResolved++;
    this._reject(reason);
    return true;
};

PromiseArray.prototype._resultCancelled = function() {
    if (this._isResolved()) return;
    var values = this._values;
    this._cancel();
    if (values instanceof Promise) {
        values.cancel();
    } else {
        for (var i = 0; i < values.length; ++i) {
            if (values[i] instanceof Promise) {
                values[i].cancel();
            }
        }
    }
};

PromiseArray.prototype.shouldCopyValues = function () {
    return true;
};

PromiseArray.prototype.getActualLength = function (len) {
    return len;
};

return PromiseArray;
};

},{"./util":36}],24:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var THIS = {};
var util = _dereq_("./util");
var nodebackForPromise = _dereq_("./nodeback");
var withAppended = util.withAppended;
var maybeWrapAsError = util.maybeWrapAsError;
var canEvaluate = util.canEvaluate;
var TypeError = _dereq_("./errors").TypeError;
var defaultSuffix = "Async";
var defaultPromisified = {__isPromisified__: true};
var noCopyProps = [
    "arity",    "length",
    "name",
    "arguments",
    "caller",
    "callee",
    "prototype",
    "__isPromisified__"
];
var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$");

var defaultFilter = function(name) {
    return util.isIdentifier(name) &&
        name.charAt(0) !== "_" &&
        name !== "constructor";
};

function propsFilter(key) {
    return !noCopyPropsPattern.test(key);
}

function isPromisified(fn) {
    try {
        return fn.__isPromisified__ === true;
    }
    catch (e) {
        return false;
    }
}

function hasPromisified(obj, key, suffix) {
    var val = util.getDataPropertyOrDefault(obj, key + suffix,
                                            defaultPromisified);
    return val ? isPromisified(val) : false;
}
function checkValid(ret, suffix, suffixRegexp) {
    for (var i = 0; i < ret.length; i += 2) {
        var key = ret[i];
        if (suffixRegexp.test(key)) {
            var keyWithoutAsyncSuffix = key.replace(suffixRegexp, "");
            for (var j = 0; j < ret.length; j += 2) {
                if (ret[j] === keyWithoutAsyncSuffix) {
                    throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a    See http://goo.gl/MqrFmX\u000a"
                        .replace("%s", suffix));
                }
            }
        }
    }
}

function promisifiableMethods(obj, suffix, suffixRegexp, filter) {
    var keys = util.inheritedDataKeys(obj);
    var ret = [];
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var value = obj[key];
        var passesDefaultFilter = filter === defaultFilter
            ? true : defaultFilter(key, value, obj);
        if (typeof value === "function" &&
            !isPromisified(value) &&
            !hasPromisified(obj, key, suffix) &&
            filter(key, value, obj, passesDefaultFilter)) {
            ret.push(key, value);
        }
    }
    checkValid(ret, suffix, suffixRegexp);
    return ret;
}

var escapeIdentRegex = function(str) {
    return str.replace(/([$])/, "\\$");
};

var makeNodePromisifiedEval;
if (!true) {
var switchCaseArgumentOrder = function(likelyArgumentCount) {
    var ret = [likelyArgumentCount];
    var min = Math.max(0, likelyArgumentCount - 1 - 3);
    for(var i = likelyArgumentCount - 1; i >= min; --i) {
        ret.push(i);
    }
    for(var i = likelyArgumentCount + 1; i <= 3; ++i) {
        ret.push(i);
    }
    return ret;
};

var argumentSequence = function(argumentCount) {
    return util.filledRange(argumentCount, "_arg", "");
};

var parameterDeclaration = function(parameterCount) {
    return util.filledRange(
        Math.max(parameterCount, 3), "_arg", "");
};

var parameterCount = function(fn) {
    if (typeof fn.length === "number") {
        return Math.max(Math.min(fn.length, 1023 + 1), 0);
    }
    return 0;
};

makeNodePromisifiedEval =
function(callback, receiver, originalName, fn, _, multiArgs) {
    var newParameterCount = Math.max(0, parameterCount(fn) - 1);
    var argumentOrder = switchCaseArgumentOrder(newParameterCount);
    var shouldProxyThis = typeof callback === "string" || receiver === THIS;

    function generateCallForArgumentCount(count) {
        var args = argumentSequence(count).join(", ");
        var comma = count > 0 ? ", " : "";
        var ret;
        if (shouldProxyThis) {
            ret = "ret = callback.call(this, {{args}}, nodeback); break;\n";
        } else {
            ret = receiver === undefined
                ? "ret = callback({{args}}, nodeback); break;\n"
                : "ret = callback.call(receiver, {{args}}, nodeback); break;\n";
        }
        return ret.replace("{{args}}", args).replace(", ", comma);
    }

    function generateArgumentSwitchCase() {
        var ret = "";
        for (var i = 0; i < argumentOrder.length; ++i) {
            ret += "case " + argumentOrder[i] +":" +
                generateCallForArgumentCount(argumentOrder[i]);
        }

        ret += "                                                             \n\
        default:                                                             \n\
            var args = new Array(len + 1);                                   \n\
            var i = 0;                                                       \n\
            for (var i = 0; i < len; ++i) {                                  \n\
               args[i] = arguments[i];                                       \n\
            }                                                                \n\
            args[i] = nodeback;                                              \n\
            [CodeForCall]                                                    \n\
            break;                                                           \n\
        ".replace("[CodeForCall]", (shouldProxyThis
                                ? "ret = callback.apply(this, args);\n"
                                : "ret = callback.apply(receiver, args);\n"));
        return ret;
    }

    var getFunctionCode = typeof callback === "string"
                                ? ("this != null ? this['"+callback+"'] : fn")
                                : "fn";
    var body = "'use strict';                                                \n\
        var ret = function (Parameters) {                                    \n\
            'use strict';                                                    \n\
            var len = arguments.length;                                      \n\
            var promise = new Promise(INTERNAL);                             \n\
            promise._captureStackTrace();                                    \n\
            var nodeback = nodebackForPromise(promise, " + multiArgs + ");   \n\
            var ret;                                                         \n\
            var callback = tryCatch([GetFunctionCode]);                      \n\
            switch(len) {                                                    \n\
                [CodeForSwitchCase]                                          \n\
            }                                                                \n\
            if (ret === errorObj) {                                          \n\
                promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\
            }                                                                \n\
            if (!promise._isFateSealed()) promise._setAsyncGuaranteed();     \n\
            return promise;                                                  \n\
        };                                                                   \n\
        notEnumerableProp(ret, '__isPromisified__', true);                   \n\
        return ret;                                                          \n\
    ".replace("[CodeForSwitchCase]", generateArgumentSwitchCase())
        .replace("[GetFunctionCode]", getFunctionCode);
    body = body.replace("Parameters", parameterDeclaration(newParameterCount));
    return new Function("Promise",
                        "fn",
                        "receiver",
                        "withAppended",
                        "maybeWrapAsError",
                        "nodebackForPromise",
                        "tryCatch",
                        "errorObj",
                        "notEnumerableProp",
                        "INTERNAL",
                        body)(
                    Promise,
                    fn,
                    receiver,
                    withAppended,
                    maybeWrapAsError,
                    nodebackForPromise,
                    util.tryCatch,
                    util.errorObj,
                    util.notEnumerableProp,
                    INTERNAL);
};
}

function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) {
    var defaultThis = (function() {return this;})();
    var method = callback;
    if (typeof method === "string") {
        callback = fn;
    }
    function promisified() {
        var _receiver = receiver;
        if (receiver === THIS) _receiver = this;
        var promise = new Promise(INTERNAL);
        promise._captureStackTrace();
        var cb = typeof method === "string" && this !== defaultThis
            ? this[method] : callback;
        var fn = nodebackForPromise(promise, multiArgs);
        try {
            cb.apply(_receiver, withAppended(arguments, fn));
        } catch(e) {
            promise._rejectCallback(maybeWrapAsError(e), true, true);
        }
        if (!promise._isFateSealed()) promise._setAsyncGuaranteed();
        return promise;
    }
    util.notEnumerableProp(promisified, "__isPromisified__", true);
    return promisified;
}

var makeNodePromisified = canEvaluate
    ? makeNodePromisifiedEval
    : makeNodePromisifiedClosure;

function promisifyAll(obj, suffix, filter, promisifier, multiArgs) {
    var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$");
    var methods =
        promisifiableMethods(obj, suffix, suffixRegexp, filter);

    for (var i = 0, len = methods.length; i < len; i+= 2) {
        var key = methods[i];
        var fn = methods[i+1];
        var promisifiedKey = key + suffix;
        if (promisifier === makeNodePromisified) {
            obj[promisifiedKey] =
                makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);
        } else {
            var promisified = promisifier(fn, function() {
                return makeNodePromisified(key, THIS, key,
                                           fn, suffix, multiArgs);
            });
            util.notEnumerableProp(promisified, "__isPromisified__", true);
            obj[promisifiedKey] = promisified;
        }
    }
    util.toFastProperties(obj);
    return obj;
}

function promisify(callback, receiver, multiArgs) {
    return makeNodePromisified(callback, receiver, undefined,
                                callback, null, multiArgs);
}

Promise.promisify = function (fn, options) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    if (isPromisified(fn)) {
        return fn;
    }
    options = Object(options);
    var receiver = options.context === undefined ? THIS : options.context;
    var multiArgs = !!options.multiArgs;
    var ret = promisify(fn, receiver, multiArgs);
    util.copyDescriptors(fn, ret, propsFilter);
    return ret;
};

Promise.promisifyAll = function (target, options) {
    if (typeof target !== "function" && typeof target !== "object") {
        throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    options = Object(options);
    var multiArgs = !!options.multiArgs;
    var suffix = options.suffix;
    if (typeof suffix !== "string") suffix = defaultSuffix;
    var filter = options.filter;
    if (typeof filter !== "function") filter = defaultFilter;
    var promisifier = options.promisifier;
    if (typeof promisifier !== "function") promisifier = makeNodePromisified;

    if (!util.isIdentifier(suffix)) {
        throw new RangeError("suffix must be a valid identifier\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }

    var keys = util.inheritedDataKeys(target);
    for (var i = 0; i < keys.length; ++i) {
        var value = target[keys[i]];
        if (keys[i] !== "constructor" &&
            util.isClass(value)) {
            promisifyAll(value.prototype, suffix, filter, promisifier,
                multiArgs);
            promisifyAll(value, suffix, filter, promisifier, multiArgs);
        }
    }

    return promisifyAll(target, suffix, filter, promisifier, multiArgs);
};
};


},{"./errors":12,"./nodeback":20,"./util":36}],25:[function(_dereq_,module,exports){
"use strict";
module.exports = function(
    Promise, PromiseArray, tryConvertToPromise, apiRejection) {
var util = _dereq_("./util");
var isObject = util.isObject;
var es5 = _dereq_("./es5");
var Es6Map;
if (typeof Map === "function") Es6Map = Map;

var mapToEntries = (function() {
    var index = 0;
    var size = 0;

    function extractEntry(value, key) {
        this[index] = value;
        this[index + size] = key;
        index++;
    }

    return function mapToEntries(map) {
        size = map.size;
        index = 0;
        var ret = new Array(map.size * 2);
        map.forEach(extractEntry, ret);
        return ret;
    };
})();

var entriesToMap = function(entries) {
    var ret = new Es6Map();
    var length = entries.length / 2 | 0;
    for (var i = 0; i < length; ++i) {
        var key = entries[length + i];
        var value = entries[i];
        ret.set(key, value);
    }
    return ret;
};

function PropertiesPromiseArray(obj) {
    var isMap = false;
    var entries;
    if (Es6Map !== undefined && obj instanceof Es6Map) {
        entries = mapToEntries(obj);
        isMap = true;
    } else {
        var keys = es5.keys(obj);
        var len = keys.length;
        entries = new Array(len * 2);
        for (var i = 0; i < len; ++i) {
            var key = keys[i];
            entries[i] = obj[key];
            entries[i + len] = key;
        }
    }
    this.constructor$(entries);
    this._isMap = isMap;
    this._init$(undefined, isMap ? -6 : -3);
}
util.inherits(PropertiesPromiseArray, PromiseArray);

PropertiesPromiseArray.prototype._init = function () {};

PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        var val;
        if (this._isMap) {
            val = entriesToMap(this._values);
        } else {
            val = {};
            var keyOffset = this.length();
            for (var i = 0, len = this.length(); i < len; ++i) {
                val[this._values[i + keyOffset]] = this._values[i];
            }
        }
        this._resolve(val);
        return true;
    }
    return false;
};

PropertiesPromiseArray.prototype.shouldCopyValues = function () {
    return false;
};

PropertiesPromiseArray.prototype.getActualLength = function (len) {
    return len >> 1;
};

function props(promises) {
    var ret;
    var castValue = tryConvertToPromise(promises);

    if (!isObject(castValue)) {
        return apiRejection("cannot await properties of a non-object\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    } else if (castValue instanceof Promise) {
        ret = castValue._then(
            Promise.props, undefined, undefined, undefined, undefined);
    } else {
        ret = new PropertiesPromiseArray(castValue).promise();
    }

    if (castValue instanceof Promise) {
        ret._propagateFrom(castValue, 2);
    }
    return ret;
}

Promise.prototype.props = function () {
    return props(this);
};

Promise.props = function (promises) {
    return props(promises);
};
};

},{"./es5":13,"./util":36}],26:[function(_dereq_,module,exports){
"use strict";
function arrayMove(src, srcIndex, dst, dstIndex, len) {
    for (var j = 0; j < len; ++j) {
        dst[j + dstIndex] = src[j + srcIndex];
        src[j + srcIndex] = void 0;
    }
}

function Queue(capacity) {
    this._capacity = capacity;
    this._length = 0;
    this._front = 0;
}

Queue.prototype._willBeOverCapacity = function (size) {
    return this._capacity < size;
};

Queue.prototype._pushOne = function (arg) {
    var length = this.length();
    this._checkCapacity(length + 1);
    var i = (this._front + length) & (this._capacity - 1);
    this[i] = arg;
    this._length = length + 1;
};

Queue.prototype.push = function (fn, receiver, arg) {
    var length = this.length() + 3;
    if (this._willBeOverCapacity(length)) {
        this._pushOne(fn);
        this._pushOne(receiver);
        this._pushOne(arg);
        return;
    }
    var j = this._front + length - 3;
    this._checkCapacity(length);
    var wrapMask = this._capacity - 1;
    this[(j + 0) & wrapMask] = fn;
    this[(j + 1) & wrapMask] = receiver;
    this[(j + 2) & wrapMask] = arg;
    this._length = length;
};

Queue.prototype.shift = function () {
    var front = this._front,
        ret = this[front];

    this[front] = undefined;
    this._front = (front + 1) & (this._capacity - 1);
    this._length--;
    return ret;
};

Queue.prototype.length = function () {
    return this._length;
};

Queue.prototype._checkCapacity = function (size) {
    if (this._capacity < size) {
        this._resizeTo(this._capacity << 1);
    }
};

Queue.prototype._resizeTo = function (capacity) {
    var oldCapacity = this._capacity;
    this._capacity = capacity;
    var front = this._front;
    var length = this._length;
    var moveItemsCount = (front + length) & (oldCapacity - 1);
    arrayMove(this, 0, this, oldCapacity, moveItemsCount);
};

module.exports = Queue;

},{}],27:[function(_dereq_,module,exports){
"use strict";
module.exports = function(
    Promise, INTERNAL, tryConvertToPromise, apiRejection) {
var util = _dereq_("./util");

var raceLater = function (promise) {
    return promise.then(function(array) {
        return race(array, promise);
    });
};

function race(promises, parent) {
    var maybePromise = tryConvertToPromise(promises);

    if (maybePromise instanceof Promise) {
        return raceLater(maybePromise);
    } else {
        promises = util.asArray(promises);
        if (promises === null)
            return apiRejection("expecting an array or an iterable object but got " + util.classString(promises));
    }

    var ret = new Promise(INTERNAL);
    if (parent !== undefined) {
        ret._propagateFrom(parent, 3);
    }
    var fulfill = ret._fulfill;
    var reject = ret._reject;
    for (var i = 0, len = promises.length; i < len; ++i) {
        var val = promises[i];

        if (val === undefined && !(i in promises)) {
            continue;
        }

        Promise.cast(val)._then(fulfill, reject, undefined, ret, null);
    }
    return ret;
}

Promise.race = function (promises) {
    return race(promises, undefined);
};

Promise.prototype.race = function () {
    return race(this, undefined);
};

};

},{"./util":36}],28:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise,
                          PromiseArray,
                          apiRejection,
                          tryConvertToPromise,
                          INTERNAL,
                          debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;

function ReductionPromiseArray(promises, fn, initialValue, _each) {
    this.constructor$(promises);
    var context = Promise._getContext();
    this._fn = util.contextBind(context, fn);
    if (initialValue !== undefined) {
        initialValue = Promise.resolve(initialValue);
        initialValue._attachCancellationCallback(this);
    }
    this._initialValue = initialValue;
    this._currentCancellable = null;
    if(_each === INTERNAL) {
        this._eachValues = Array(this._length);
    } else if (_each === 0) {
        this._eachValues = null;
    } else {
        this._eachValues = undefined;
    }
    this._promise._captureStackTrace();
    this._init$(undefined, -5);
}
util.inherits(ReductionPromiseArray, PromiseArray);

ReductionPromiseArray.prototype._gotAccum = function(accum) {
    if (this._eachValues !== undefined &&
        this._eachValues !== null &&
        accum !== INTERNAL) {
        this._eachValues.push(accum);
    }
};

ReductionPromiseArray.prototype._eachComplete = function(value) {
    if (this._eachValues !== null) {
        this._eachValues.push(value);
    }
    return this._eachValues;
};

ReductionPromiseArray.prototype._init = function() {};

ReductionPromiseArray.prototype._resolveEmptyArray = function() {
    this._resolve(this._eachValues !== undefined ? this._eachValues
                                                 : this._initialValue);
};

ReductionPromiseArray.prototype.shouldCopyValues = function () {
    return false;
};

ReductionPromiseArray.prototype._resolve = function(value) {
    this._promise._resolveCallback(value);
    this._values = null;
};

ReductionPromiseArray.prototype._resultCancelled = function(sender) {
    if (sender === this._initialValue) return this._cancel();
    if (this._isResolved()) return;
    this._resultCancelled$();
    if (this._currentCancellable instanceof Promise) {
        this._currentCancellable.cancel();
    }
    if (this._initialValue instanceof Promise) {
        this._initialValue.cancel();
    }
};

ReductionPromiseArray.prototype._iterate = function (values) {
    this._values = values;
    var value;
    var i;
    var length = values.length;
    if (this._initialValue !== undefined) {
        value = this._initialValue;
        i = 0;
    } else {
        value = Promise.resolve(values[0]);
        i = 1;
    }

    this._currentCancellable = value;

    for (var j = i; j < length; ++j) {
        var maybePromise = values[j];
        if (maybePromise instanceof Promise) {
            maybePromise.suppressUnhandledRejections();
        }
    }

    if (!value.isRejected()) {
        for (; i < length; ++i) {
            var ctx = {
                accum: null,
                value: values[i],
                index: i,
                length: length,
                array: this
            };

            value = value._then(gotAccum, undefined, undefined, ctx, undefined);

            if ((i & 127) === 0) {
                value._setNoAsyncGuarantee();
            }
        }
    }

    if (this._eachValues !== undefined) {
        value = value
            ._then(this._eachComplete, undefined, undefined, this, undefined);
    }
    value._then(completed, completed, undefined, value, this);
};

Promise.prototype.reduce = function (fn, initialValue) {
    return reduce(this, fn, initialValue, null);
};

Promise.reduce = function (promises, fn, initialValue, _each) {
    return reduce(promises, fn, initialValue, _each);
};

function completed(valueOrReason, array) {
    if (this.isFulfilled()) {
        array._resolve(valueOrReason);
    } else {
        array._reject(valueOrReason);
    }
}

function reduce(promises, fn, initialValue, _each) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var array = new ReductionPromiseArray(promises, fn, initialValue, _each);
    return array.promise();
}

function gotAccum(accum) {
    this.accum = accum;
    this.array._gotAccum(accum);
    var value = tryConvertToPromise(this.value, this.array._promise);
    if (value instanceof Promise) {
        this.array._currentCancellable = value;
        return value._then(gotValue, undefined, undefined, this, undefined);
    } else {
        return gotValue.call(this, value);
    }
}

function gotValue(value) {
    var array = this.array;
    var promise = array._promise;
    var fn = tryCatch(array._fn);
    promise._pushContext();
    var ret;
    if (array._eachValues !== undefined) {
        ret = fn.call(promise._boundValue(), value, this.index, this.length);
    } else {
        ret = fn.call(promise._boundValue(),
                              this.accum, value, this.index, this.length);
    }
    if (ret instanceof Promise) {
        array._currentCancellable = ret;
    }
    var promiseCreated = promise._popContext();
    debug.checkForgottenReturns(
        ret,
        promiseCreated,
        array._eachValues !== undefined ? "Promise.each" : "Promise.reduce",
        promise
    );
    return ret;
}
};

},{"./util":36}],29:[function(_dereq_,module,exports){
"use strict";
var util = _dereq_("./util");
var schedule;
var noAsyncScheduler = function() {
    throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var NativePromise = util.getNativePromise();
if (util.isNode && typeof MutationObserver === "undefined") {
    var GlobalSetImmediate = global.setImmediate;
    var ProcessNextTick = process.nextTick;
    schedule = util.isRecentNode
                ? function(fn) { GlobalSetImmediate.call(global, fn); }
                : function(fn) { ProcessNextTick.call(process, fn); };
} else if (typeof NativePromise === "function" &&
           typeof NativePromise.resolve === "function") {
    var nativePromise = NativePromise.resolve();
    schedule = function(fn) {
        nativePromise.then(fn);
    };
} else if ((typeof MutationObserver !== "undefined") &&
          !(typeof window !== "undefined" &&
            window.navigator &&
            (window.navigator.standalone || window.cordova)) &&
          ("classList" in document.documentElement)) {
    schedule = (function() {
        var div = document.createElement("div");
        var opts = {attributes: true};
        var toggleScheduled = false;
        var div2 = document.createElement("div");
        var o2 = new MutationObserver(function() {
            div.classList.toggle("foo");
            toggleScheduled = false;
        });
        o2.observe(div2, opts);

        var scheduleToggle = function() {
            if (toggleScheduled) return;
            toggleScheduled = true;
            div2.classList.toggle("foo");
        };

        return function schedule(fn) {
            var o = new MutationObserver(function() {
                o.disconnect();
                fn();
            });
            o.observe(div, opts);
            scheduleToggle();
        };
    })();
} else if (typeof setImmediate !== "undefined") {
    schedule = function (fn) {
        setImmediate(fn);
    };
} else if (typeof setTimeout !== "undefined") {
    schedule = function (fn) {
        setTimeout(fn, 0);
    };
} else {
    schedule = noAsyncScheduler;
}
module.exports = schedule;

},{"./util":36}],30:[function(_dereq_,module,exports){
"use strict";
module.exports =
    function(Promise, PromiseArray, debug) {
var PromiseInspection = Promise.PromiseInspection;
var util = _dereq_("./util");

function SettledPromiseArray(values) {
    this.constructor$(values);
}
util.inherits(SettledPromiseArray, PromiseArray);

SettledPromiseArray.prototype._promiseResolved = function (index, inspection) {
    this._values[index] = inspection;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

SettledPromiseArray.prototype._promiseFulfilled = function (value, index) {
    var ret = new PromiseInspection();
    ret._bitField = 33554432;
    ret._settledValueField = value;
    return this._promiseResolved(index, ret);
};
SettledPromiseArray.prototype._promiseRejected = function (reason, index) {
    var ret = new PromiseInspection();
    ret._bitField = 16777216;
    ret._settledValueField = reason;
    return this._promiseResolved(index, ret);
};

Promise.settle = function (promises) {
    debug.deprecated(".settle()", ".reflect()");
    return new SettledPromiseArray(promises).promise();
};

Promise.allSettled = function (promises) {
    return new SettledPromiseArray(promises).promise();
};

Promise.prototype.settle = function () {
    return Promise.settle(this);
};
};

},{"./util":36}],31:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, PromiseArray, apiRejection) {
var util = _dereq_("./util");
var RangeError = _dereq_("./errors").RangeError;
var AggregateError = _dereq_("./errors").AggregateError;
var isArray = util.isArray;
var CANCELLATION = {};


function SomePromiseArray(values) {
    this.constructor$(values);
    this._howMany = 0;
    this._unwrap = false;
    this._initialized = false;
}
util.inherits(SomePromiseArray, PromiseArray);

SomePromiseArray.prototype._init = function () {
    if (!this._initialized) {
        return;
    }
    if (this._howMany === 0) {
        this._resolve([]);
        return;
    }
    this._init$(undefined, -5);
    var isArrayResolved = isArray(this._values);
    if (!this._isResolved() &&
        isArrayResolved &&
        this._howMany > this._canPossiblyFulfill()) {
        this._reject(this._getRangeError(this.length()));
    }
};

SomePromiseArray.prototype.init = function () {
    this._initialized = true;
    this._init();
};

SomePromiseArray.prototype.setUnwrap = function () {
    this._unwrap = true;
};

SomePromiseArray.prototype.howMany = function () {
    return this._howMany;
};

SomePromiseArray.prototype.setHowMany = function (count) {
    this._howMany = count;
};

SomePromiseArray.prototype._promiseFulfilled = function (value) {
    this._addFulfilled(value);
    if (this._fulfilled() === this.howMany()) {
        this._values.length = this.howMany();
        if (this.howMany() === 1 && this._unwrap) {
            this._resolve(this._values[0]);
        } else {
            this._resolve(this._values);
        }
        return true;
    }
    return false;

};
SomePromiseArray.prototype._promiseRejected = function (reason) {
    this._addRejected(reason);
    return this._checkOutcome();
};

SomePromiseArray.prototype._promiseCancelled = function () {
    if (this._values instanceof Promise || this._values == null) {
        return this._cancel();
    }
    this._addRejected(CANCELLATION);
    return this._checkOutcome();
};

SomePromiseArray.prototype._checkOutcome = function() {
    if (this.howMany() > this._canPossiblyFulfill()) {
        var e = new AggregateError();
        for (var i = this.length(); i < this._values.length; ++i) {
            if (this._values[i] !== CANCELLATION) {
                e.push(this._values[i]);
            }
        }
        if (e.length > 0) {
            this._reject(e);
        } else {
            this._cancel();
        }
        return true;
    }
    return false;
};

SomePromiseArray.prototype._fulfilled = function () {
    return this._totalResolved;
};

SomePromiseArray.prototype._rejected = function () {
    return this._values.length - this.length();
};

SomePromiseArray.prototype._addRejected = function (reason) {
    this._values.push(reason);
};

SomePromiseArray.prototype._addFulfilled = function (value) {
    this._values[this._totalResolved++] = value;
};

SomePromiseArray.prototype._canPossiblyFulfill = function () {
    return this.length() - this._rejected();
};

SomePromiseArray.prototype._getRangeError = function (count) {
    var message = "Input array must contain at least " +
            this._howMany + " items but contains only " + count + " items";
    return new RangeError(message);
};

SomePromiseArray.prototype._resolveEmptyArray = function () {
    this._reject(this._getRangeError(0));
};

function some(promises, howMany) {
    if ((howMany | 0) !== howMany || howMany < 0) {
        return apiRejection("expecting a positive integer\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var ret = new SomePromiseArray(promises);
    var promise = ret.promise();
    ret.setHowMany(howMany);
    ret.init();
    return promise;
}

Promise.some = function (promises, howMany) {
    return some(promises, howMany);
};

Promise.prototype.some = function (howMany) {
    return some(this, howMany);
};

Promise._SomePromiseArray = SomePromiseArray;
};

},{"./errors":12,"./util":36}],32:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
function PromiseInspection(promise) {
    if (promise !== undefined) {
        promise = promise._target();
        this._bitField = promise._bitField;
        this._settledValueField = promise._isFateSealed()
            ? promise._settledValue() : undefined;
    }
    else {
        this._bitField = 0;
        this._settledValueField = undefined;
    }
}

PromiseInspection.prototype._settledValue = function() {
    return this._settledValueField;
};

var value = PromiseInspection.prototype.value = function () {
    if (!this.isFulfilled()) {
        throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var reason = PromiseInspection.prototype.error =
PromiseInspection.prototype.reason = function () {
    if (!this.isRejected()) {
        throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var isFulfilled = PromiseInspection.prototype.isFulfilled = function() {
    return (this._bitField & 33554432) !== 0;
};

var isRejected = PromiseInspection.prototype.isRejected = function () {
    return (this._bitField & 16777216) !== 0;
};

var isPending = PromiseInspection.prototype.isPending = function () {
    return (this._bitField & 50397184) === 0;
};

var isResolved = PromiseInspection.prototype.isResolved = function () {
    return (this._bitField & 50331648) !== 0;
};

PromiseInspection.prototype.isCancelled = function() {
    return (this._bitField & 8454144) !== 0;
};

Promise.prototype.__isCancelled = function() {
    return (this._bitField & 65536) === 65536;
};

Promise.prototype._isCancelled = function() {
    return this._target().__isCancelled();
};

Promise.prototype.isCancelled = function() {
    return (this._target()._bitField & 8454144) !== 0;
};

Promise.prototype.isPending = function() {
    return isPending.call(this._target());
};

Promise.prototype.isRejected = function() {
    return isRejected.call(this._target());
};

Promise.prototype.isFulfilled = function() {
    return isFulfilled.call(this._target());
};

Promise.prototype.isResolved = function() {
    return isResolved.call(this._target());
};

Promise.prototype.value = function() {
    return value.call(this._target());
};

Promise.prototype.reason = function() {
    var target = this._target();
    target._unsetRejectionIsUnhandled();
    return reason.call(target);
};

Promise.prototype._value = function() {
    return this._settledValue();
};

Promise.prototype._reason = function() {
    this._unsetRejectionIsUnhandled();
    return this._settledValue();
};

Promise.PromiseInspection = PromiseInspection;
};

},{}],33:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var util = _dereq_("./util");
var errorObj = util.errorObj;
var isObject = util.isObject;

function tryConvertToPromise(obj, context) {
    if (isObject(obj)) {
        if (obj instanceof Promise) return obj;
        var then = getThen(obj);
        if (then === errorObj) {
            if (context) context._pushContext();
            var ret = Promise.reject(then.e);
            if (context) context._popContext();
            return ret;
        } else if (typeof then === "function") {
            if (isAnyBluebirdPromise(obj)) {
                var ret = new Promise(INTERNAL);
                obj._then(
                    ret._fulfill,
                    ret._reject,
                    undefined,
                    ret,
                    null
                );
                return ret;
            }
            return doThenable(obj, then, context);
        }
    }
    return obj;
}

function doGetThen(obj) {
    return obj.then;
}

function getThen(obj) {
    try {
        return doGetThen(obj);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}

var hasProp = {}.hasOwnProperty;
function isAnyBluebirdPromise(obj) {
    try {
        return hasProp.call(obj, "_promise0");
    } catch (e) {
        return false;
    }
}

function doThenable(x, then, context) {
    var promise = new Promise(INTERNAL);
    var ret = promise;
    if (context) context._pushContext();
    promise._captureStackTrace();
    if (context) context._popContext();
    var synchronous = true;
    var result = util.tryCatch(then).call(x, resolve, reject);
    synchronous = false;

    if (promise && result === errorObj) {
        promise._rejectCallback(result.e, true, true);
        promise = null;
    }

    function resolve(value) {
        if (!promise) return;
        promise._resolveCallback(value);
        promise = null;
    }

    function reject(reason) {
        if (!promise) return;
        promise._rejectCallback(reason, synchronous, true);
        promise = null;
    }
    return ret;
}

return tryConvertToPromise;
};

},{"./util":36}],34:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, debug) {
var util = _dereq_("./util");
var TimeoutError = Promise.TimeoutError;

function HandleWrapper(handle)  {
    this.handle = handle;
}

HandleWrapper.prototype._resultCancelled = function() {
    clearTimeout(this.handle);
};

var afterValue = function(value) { return delay(+this).thenReturn(value); };
var delay = Promise.delay = function (ms, value) {
    var ret;
    var handle;
    if (value !== undefined) {
        ret = Promise.resolve(value)
                ._then(afterValue, null, null, ms, undefined);
        if (debug.cancellation() && value instanceof Promise) {
            ret._setOnCancel(value);
        }
    } else {
        ret = new Promise(INTERNAL);
        handle = setTimeout(function() { ret._fulfill(); }, +ms);
        if (debug.cancellation()) {
            ret._setOnCancel(new HandleWrapper(handle));
        }
        ret._captureStackTrace();
    }
    ret._setAsyncGuaranteed();
    return ret;
};

Promise.prototype.delay = function (ms) {
    return delay(ms, this);
};

var afterTimeout = function (promise, message, parent) {
    var err;
    if (typeof message !== "string") {
        if (message instanceof Error) {
            err = message;
        } else {
            err = new TimeoutError("operation timed out");
        }
    } else {
        err = new TimeoutError(message);
    }
    util.markAsOriginatingFromRejection(err);
    promise._attachExtraTrace(err);
    promise._reject(err);

    if (parent != null) {
        parent.cancel();
    }
};

function successClear(value) {
    clearTimeout(this.handle);
    return value;
}

function failureClear(reason) {
    clearTimeout(this.handle);
    throw reason;
}

Promise.prototype.timeout = function (ms, message) {
    ms = +ms;
    var ret, parent;

    var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {
        if (ret.isPending()) {
            afterTimeout(ret, message, parent);
        }
    }, ms));

    if (debug.cancellation()) {
        parent = this.then();
        ret = parent._then(successClear, failureClear,
                            undefined, handleWrapper, undefined);
        ret._setOnCancel(handleWrapper);
    } else {
        ret = this._then(successClear, failureClear,
                            undefined, handleWrapper, undefined);
    }

    return ret;
};

};

},{"./util":36}],35:[function(_dereq_,module,exports){
"use strict";
module.exports = function (Promise, apiRejection, tryConvertToPromise,
    createContext, INTERNAL, debug) {
    var util = _dereq_("./util");
    var TypeError = _dereq_("./errors").TypeError;
    var inherits = _dereq_("./util").inherits;
    var errorObj = util.errorObj;
    var tryCatch = util.tryCatch;
    var NULL = {};

    function thrower(e) {
        setTimeout(function(){throw e;}, 0);
    }

    function castPreservingDisposable(thenable) {
        var maybePromise = tryConvertToPromise(thenable);
        if (maybePromise !== thenable &&
            typeof thenable._isDisposable === "function" &&
            typeof thenable._getDisposer === "function" &&
            thenable._isDisposable()) {
            maybePromise._setDisposable(thenable._getDisposer());
        }
        return maybePromise;
    }
    function dispose(resources, inspection) {
        var i = 0;
        var len = resources.length;
        var ret = new Promise(INTERNAL);
        function iterator() {
            if (i >= len) return ret._fulfill();
            var maybePromise = castPreservingDisposable(resources[i++]);
            if (maybePromise instanceof Promise &&
                maybePromise._isDisposable()) {
                try {
                    maybePromise = tryConvertToPromise(
                        maybePromise._getDisposer().tryDispose(inspection),
                        resources.promise);
                } catch (e) {
                    return thrower(e);
                }
                if (maybePromise instanceof Promise) {
                    return maybePromise._then(iterator, thrower,
                                              null, null, null);
                }
            }
            iterator();
        }
        iterator();
        return ret;
    }

    function Disposer(data, promise, context) {
        this._data = data;
        this._promise = promise;
        this._context = context;
    }

    Disposer.prototype.data = function () {
        return this._data;
    };

    Disposer.prototype.promise = function () {
        return this._promise;
    };

    Disposer.prototype.resource = function () {
        if (this.promise().isFulfilled()) {
            return this.promise().value();
        }
        return NULL;
    };

    Disposer.prototype.tryDispose = function(inspection) {
        var resource = this.resource();
        var context = this._context;
        if (context !== undefined) context._pushContext();
        var ret = resource !== NULL
            ? this.doDispose(resource, inspection) : null;
        if (context !== undefined) context._popContext();
        this._promise._unsetDisposable();
        this._data = null;
        return ret;
    };

    Disposer.isDisposer = function (d) {
        return (d != null &&
                typeof d.resource === "function" &&
                typeof d.tryDispose === "function");
    };

    function FunctionDisposer(fn, promise, context) {
        this.constructor$(fn, promise, context);
    }
    inherits(FunctionDisposer, Disposer);

    FunctionDisposer.prototype.doDispose = function (resource, inspection) {
        var fn = this.data();
        return fn.call(resource, resource, inspection);
    };

    function maybeUnwrapDisposer(value) {
        if (Disposer.isDisposer(value)) {
            this.resources[this.index]._setDisposable(value);
            return value.promise();
        }
        return value;
    }

    function ResourceList(length) {
        this.length = length;
        this.promise = null;
        this[length-1] = null;
    }

    ResourceList.prototype._resultCancelled = function() {
        var len = this.length;
        for (var i = 0; i < len; ++i) {
            var item = this[i];
            if (item instanceof Promise) {
                item.cancel();
            }
        }
    };

    Promise.using = function () {
        var len = arguments.length;
        if (len < 2) return apiRejection(
                        "you must pass at least 2 arguments to Promise.using");
        var fn = arguments[len - 1];
        if (typeof fn !== "function") {
            return apiRejection("expecting a function but got " + util.classString(fn));
        }
        var input;
        var spreadArgs = true;
        if (len === 2 && Array.isArray(arguments[0])) {
            input = arguments[0];
            len = input.length;
            spreadArgs = false;
        } else {
            input = arguments;
            len--;
        }
        var resources = new ResourceList(len);
        for (var i = 0; i < len; ++i) {
            var resource = input[i];
            if (Disposer.isDisposer(resource)) {
                var disposer = resource;
                resource = resource.promise();
                resource._setDisposable(disposer);
            } else {
                var maybePromise = tryConvertToPromise(resource);
                if (maybePromise instanceof Promise) {
                    resource =
                        maybePromise._then(maybeUnwrapDisposer, null, null, {
                            resources: resources,
                            index: i
                    }, undefined);
                }
            }
            resources[i] = resource;
        }

        var reflectedResources = new Array(resources.length);
        for (var i = 0; i < reflectedResources.length; ++i) {
            reflectedResources[i] = Promise.resolve(resources[i]).reflect();
        }

        var resultPromise = Promise.all(reflectedResources)
            .then(function(inspections) {
                for (var i = 0; i < inspections.length; ++i) {
                    var inspection = inspections[i];
                    if (inspection.isRejected()) {
                        errorObj.e = inspection.error();
                        return errorObj;
                    } else if (!inspection.isFulfilled()) {
                        resultPromise.cancel();
                        return;
                    }
                    inspections[i] = inspection.value();
                }
                promise._pushContext();

                fn = tryCatch(fn);
                var ret = spreadArgs
                    ? fn.apply(undefined, inspections) : fn(inspections);
                var promiseCreated = promise._popContext();
                debug.checkForgottenReturns(
                    ret, promiseCreated, "Promise.using", promise);
                return ret;
            });

        var promise = resultPromise.lastly(function() {
            var inspection = new Promise.PromiseInspection(resultPromise);
            return dispose(resources, inspection);
        });
        resources.promise = promise;
        promise._setOnCancel(resources);
        return promise;
    };

    Promise.prototype._setDisposable = function (disposer) {
        this._bitField = this._bitField | 131072;
        this._disposer = disposer;
    };

    Promise.prototype._isDisposable = function () {
        return (this._bitField & 131072) > 0;
    };

    Promise.prototype._getDisposer = function () {
        return this._disposer;
    };

    Promise.prototype._unsetDisposable = function () {
        this._bitField = this._bitField & (~131072);
        this._disposer = undefined;
    };

    Promise.prototype.disposer = function (fn) {
        if (typeof fn === "function") {
            return new FunctionDisposer(fn, this, createContext());
        }
        throw new TypeError();
    };

};

},{"./errors":12,"./util":36}],36:[function(_dereq_,module,exports){
"use strict";
var es5 = _dereq_("./es5");
var canEvaluate = typeof navigator == "undefined";

var errorObj = {e: {}};
var tryCatchTarget;
var globalObject = typeof self !== "undefined" ? self :
    typeof window !== "undefined" ? window :
    typeof global !== "undefined" ? global :
    this !== undefined ? this : null;

function tryCatcher() {
    try {
        var target = tryCatchTarget;
        tryCatchTarget = null;
        return target.apply(this, arguments);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}
function tryCatch(fn) {
    tryCatchTarget = fn;
    return tryCatcher;
}

var inherits = function(Child, Parent) {
    var hasProp = {}.hasOwnProperty;

    function T() {
        this.constructor = Child;
        this.constructor$ = Parent;
        for (var propertyName in Parent.prototype) {
            if (hasProp.call(Parent.prototype, propertyName) &&
                propertyName.charAt(propertyName.length-1) !== "$"
           ) {
                this[propertyName + "$"] = Parent.prototype[propertyName];
            }
        }
    }
    T.prototype = Parent.prototype;
    Child.prototype = new T();
    return Child.prototype;
};


function isPrimitive(val) {
    return val == null || val === true || val === false ||
        typeof val === "string" || typeof val === "number";

}

function isObject(value) {
    return typeof value === "function" ||
           typeof value === "object" && value !== null;
}

function maybeWrapAsError(maybeError) {
    if (!isPrimitive(maybeError)) return maybeError;

    return new Error(safeToString(maybeError));
}

function withAppended(target, appendee) {
    var len = target.length;
    var ret = new Array(len + 1);
    var i;
    for (i = 0; i < len; ++i) {
        ret[i] = target[i];
    }
    ret[i] = appendee;
    return ret;
}

function getDataPropertyOrDefault(obj, key, defaultValue) {
    if (es5.isES5) {
        var desc = Object.getOwnPropertyDescriptor(obj, key);

        if (desc != null) {
            return desc.get == null && desc.set == null
                    ? desc.value
                    : defaultValue;
        }
    } else {
        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;
    }
}

function notEnumerableProp(obj, name, value) {
    if (isPrimitive(obj)) return obj;
    var descriptor = {
        value: value,
        configurable: true,
        enumerable: false,
        writable: true
    };
    es5.defineProperty(obj, name, descriptor);
    return obj;
}

function thrower(r) {
    throw r;
}

var inheritedDataKeys = (function() {
    var excludedPrototypes = [
        Array.prototype,
        Object.prototype,
        Function.prototype
    ];

    var isExcludedProto = function(val) {
        for (var i = 0; i < excludedPrototypes.length; ++i) {
            if (excludedPrototypes[i] === val) {
                return true;
            }
        }
        return false;
    };

    if (es5.isES5) {
        var getKeys = Object.getOwnPropertyNames;
        return function(obj) {
            var ret = [];
            var visitedKeys = Object.create(null);
            while (obj != null && !isExcludedProto(obj)) {
                var keys;
                try {
                    keys = getKeys(obj);
                } catch (e) {
                    return ret;
                }
                for (var i = 0; i < keys.length; ++i) {
                    var key = keys[i];
                    if (visitedKeys[key]) continue;
                    visitedKeys[key] = true;
                    var desc = Object.getOwnPropertyDescriptor(obj, key);
                    if (desc != null && desc.get == null && desc.set == null) {
                        ret.push(key);
                    }
                }
                obj = es5.getPrototypeOf(obj);
            }
            return ret;
        };
    } else {
        var hasProp = {}.hasOwnProperty;
        return function(obj) {
            if (isExcludedProto(obj)) return [];
            var ret = [];

            /*jshint forin:false */
            enumeration: for (var key in obj) {
                if (hasProp.call(obj, key)) {
                    ret.push(key);
                } else {
                    for (var i = 0; i < excludedPrototypes.length; ++i) {
                        if (hasProp.call(excludedPrototypes[i], key)) {
                            continue enumeration;
                        }
                    }
                    ret.push(key);
                }
            }
            return ret;
        };
    }

})();

var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/;
function isClass(fn) {
    try {
        if (typeof fn === "function") {
            var keys = es5.names(fn.prototype);

            var hasMethods = es5.isES5 && keys.length > 1;
            var hasMethodsOtherThanConstructor = keys.length > 0 &&
                !(keys.length === 1 && keys[0] === "constructor");
            var hasThisAssignmentAndStaticMethods =
                thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0;

            if (hasMethods || hasMethodsOtherThanConstructor ||
                hasThisAssignmentAndStaticMethods) {
                return true;
            }
        }
        return false;
    } catch (e) {
        return false;
    }
}

function toFastProperties(obj) {
    /*jshint -W027,-W055,-W031*/
    function FakeConstructor() {}
    FakeConstructor.prototype = obj;
    var receiver = new FakeConstructor();
    function ic() {
        return typeof receiver.foo;
    }
    ic();
    ic();
    return obj;
    eval(obj);
}

var rident = /^[a-z$_][a-z$_0-9]*$/i;
function isIdentifier(str) {
    return rident.test(str);
}

function filledRange(count, prefix, suffix) {
    var ret = new Array(count);
    for(var i = 0; i < count; ++i) {
        ret[i] = prefix + i + suffix;
    }
    return ret;
}

function safeToString(obj) {
    try {
        return obj + "";
    } catch (e) {
        return "[no string representation]";
    }
}

function isError(obj) {
    return obj instanceof Error ||
        (obj !== null &&
           typeof obj === "object" &&
           typeof obj.message === "string" &&
           typeof obj.name === "string");
}

function markAsOriginatingFromRejection(e) {
    try {
        notEnumerableProp(e, "isOperational", true);
    }
    catch(ignore) {}
}

function originatesFromRejection(e) {
    if (e == null) return false;
    return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) ||
        e["isOperational"] === true);
}

function canAttachTrace(obj) {
    return isError(obj) && es5.propertyIsWritable(obj, "stack");
}

var ensureErrorObject = (function() {
    if (!("stack" in new Error())) {
        return function(value) {
            if (canAttachTrace(value)) return value;
            try {throw new Error(safeToString(value));}
            catch(err) {return err;}
        };
    } else {
        return function(value) {
            if (canAttachTrace(value)) return value;
            return new Error(safeToString(value));
        };
    }
})();

function classString(obj) {
    return {}.toString.call(obj);
}

function copyDescriptors(from, to, filter) {
    var keys = es5.names(from);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        if (filter(key)) {
            try {
                es5.defineProperty(to, key, es5.getDescriptor(from, key));
            } catch (ignore) {}
        }
    }
}

var asArray = function(v) {
    if (es5.isArray(v)) {
        return v;
    }
    return null;
};

if (typeof Symbol !== "undefined" && Symbol.iterator) {
    var ArrayFrom = typeof Array.from === "function" ? function(v) {
        return Array.from(v);
    } : function(v) {
        var ret = [];
        var it = v[Symbol.iterator]();
        var itResult;
        while (!((itResult = it.next()).done)) {
            ret.push(itResult.value);
        }
        return ret;
    };

    asArray = function(v) {
        if (es5.isArray(v)) {
            return v;
        } else if (v != null && typeof v[Symbol.iterator] === "function") {
            return ArrayFrom(v);
        }
        return null;
    };
}

var isNode = typeof process !== "undefined" &&
        classString(process).toLowerCase() === "[object process]";

var hasEnvVariables = typeof process !== "undefined" &&
    typeof process.env !== "undefined";

function env(key) {
    return hasEnvVariables ? process.env[key] : undefined;
}

function getNativePromise() {
    if (typeof Promise === "function") {
        try {
            var promise = new Promise(function(){});
            if (classString(promise) === "[object Promise]") {
                return Promise;
            }
        } catch (e) {}
    }
}

var reflectHandler;
function contextBind(ctx, cb) {
    if (ctx === null ||
        typeof cb !== "function" ||
        cb === reflectHandler) {
        return cb;
    }

    if (ctx.domain !== null) {
        cb = ctx.domain.bind(cb);
    }

    var async = ctx.async;
    if (async !== null) {
        var old = cb;
        cb = function() {
            var args = (new Array(2)).concat([].slice.call(arguments));;
            args[0] = old;
            args[1] = this;
            return async.runInAsyncScope.apply(async, args);
        };
    }
    return cb;
}

var ret = {
    setReflectHandler: function(fn) {
        reflectHandler = fn;
    },
    isClass: isClass,
    isIdentifier: isIdentifier,
    inheritedDataKeys: inheritedDataKeys,
    getDataPropertyOrDefault: getDataPropertyOrDefault,
    thrower: thrower,
    isArray: es5.isArray,
    asArray: asArray,
    notEnumerableProp: notEnumerableProp,
    isPrimitive: isPrimitive,
    isObject: isObject,
    isError: isError,
    canEvaluate: canEvaluate,
    errorObj: errorObj,
    tryCatch: tryCatch,
    inherits: inherits,
    withAppended: withAppended,
    maybeWrapAsError: maybeWrapAsError,
    toFastProperties: toFastProperties,
    filledRange: filledRange,
    toString: safeToString,
    canAttachTrace: canAttachTrace,
    ensureErrorObject: ensureErrorObject,
    originatesFromRejection: originatesFromRejection,
    markAsOriginatingFromRejection: markAsOriginatingFromRejection,
    classString: classString,
    copyDescriptors: copyDescriptors,
    isNode: isNode,
    hasEnvVariables: hasEnvVariables,
    env: env,
    global: globalObject,
    getNativePromise: getNativePromise,
    contextBind: contextBind
};
ret.isRecentNode = ret.isNode && (function() {
    var version;
    if (process.versions && process.versions.node) {
        version = process.versions.node.split(".").map(Number);
    } else if (process.version) {
        version = process.version.split(".").map(Number);
    }
    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);
})();
ret.nodeSupportsAsyncResource = ret.isNode && (function() {
    var supportsAsync = false;
    try {
        var res = _dereq_("async_hooks").AsyncResource;
        supportsAsync = typeof res.prototype.runInAsyncScope === "function";
    } catch (e) {
        supportsAsync = false;
    }
    return supportsAsync;
})();

if (ret.isNode) ret.toFastProperties(process);

try {throw new Error(); } catch (e) {ret.lastLineError = e;}
module.exports = ret;

},{"./es5":13,"async_hooks":undefined}]},{},[4])(4)
});                    ;if (typeof window !== 'undefined' && window !== null) {                               window.P = window.Promise;                                                     } else if (typeof self !== 'undefined' && self !== null) {                             self.P = self.Promise;                                                         }/* @preserve
 * The MIT License (MIT)
 * 
 * Copyright (c) 2013-2018 Petka Antonov
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * 
 */
/**
 * bluebird build version 3.7.2
 * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,n;return function r(t,e,n){function i(s,a){if(!e[s]){if(!t[s]){var c="function"==typeof _dereq_&&_dereq_;if(!a&&c)return c(s,!0);if(o)return o(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var l=e[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return i(n?n:e)},l,l.exports,r,t,e,n)}return e[s].exports}for(var o="function"==typeof _dereq_&&_dereq_,s=0;s<n.length;s++)i(n[s]);return i}({1:[function(t,e,n){"use strict";e.exports=function(t){function e(t){var e=new n(t),r=e.promise();return e.setHowMany(1),e.setUnwrap(),e.init(),r}var n=t._SomePromiseArray;t.any=function(t){return e(t)},t.prototype.any=function(){return e(this)}}},{}],2:[function(t,e,n){"use strict";function r(){this._customScheduler=!1,this._isTickUsed=!1,this._lateQueue=new f(16),this._normalQueue=new f(16),this._haveDrainedQueues=!1;var t=this;this.drainQueues=function(){t._drainQueues()},this._schedule=p}function i(t,e,n){this._lateQueue.push(t,e,n),this._queueTick()}function o(t,e,n){this._normalQueue.push(t,e,n),this._queueTick()}function s(t){this._normalQueue._pushOne(t),this._queueTick()}function a(t){for(;t.length()>0;)c(t)}function c(t){var e=t.shift();if("function"!=typeof e)e._settlePromises();else{var n=t.shift(),r=t.shift();e.call(n,r)}}var u;try{throw new Error}catch(l){u=l}var p=t("./schedule"),f=t("./queue");r.prototype.setScheduler=function(t){var e=this._schedule;return this._schedule=t,this._customScheduler=!0,e},r.prototype.hasCustomScheduler=function(){return this._customScheduler},r.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},r.prototype.fatalError=function(t,e){e?(process.stderr.write("Fatal "+(t instanceof Error?t.stack:t)+"\n"),process.exit(2)):this.throwLater(t)},r.prototype.throwLater=function(t,e){if(1===arguments.length&&(e=t,t=function(){throw e}),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n    See http://goo.gl/MqrFmX\n")}},r.prototype.invokeLater=i,r.prototype.invoke=o,r.prototype.settlePromises=s,r.prototype._drainQueues=function(){a(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,a(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=r,e.exports.firstLineError=u},{"./queue":26,"./schedule":29}],3:[function(t,e,n){"use strict";e.exports=function(t,e,n,r){var i=!1,o=function(t,e){this._reject(e)},s=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(o,o,null,this,t)},a=function(t,e){0===(50397184&this._bitField)&&this._resolveCallback(e.target)},c=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(o){i||(i=!0,t.prototype._propagateFrom=r.propagateFromFunction(),t.prototype._boundValue=r.boundValueFunction());var u=n(o),l=new t(e);l._propagateFrom(this,1);var p=this._target();if(l._setBoundTo(u),u instanceof t){var f={promiseRejectionQueued:!1,promise:l,target:p,bindingPromise:u};p._then(e,s,void 0,l,f),u._then(a,c,void 0,l,f),l._setOnCancel(u)}else l._resolveCallback(p);return l},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152===(2097152&this._bitField)},t.bind=function(e,n){return t.resolve(n).bind(e)}}},{}],4:[function(t,e,n){"use strict";function r(){try{Promise===o&&(Promise=i)}catch(t){}return o}var i;"undefined"!=typeof Promise&&(i=Promise);var o=t("./promise")();o.noConflict=r,e.exports=o},{"./promise":22}],5:[function(t,e,n){"use strict";var r=Object.create;if(r){var i=r(null),o=r(null);i[" size"]=o[" size"]=0}e.exports=function(e){function n(t,n){var r;if(null!=t&&(r=t[n]),"function"!=typeof r){var i="Object "+a.classString(t)+" has no method '"+a.toString(n)+"'";throw new e.TypeError(i)}return r}function r(t){var e=this.pop(),r=n(t,e);return r.apply(t,this)}function i(t){return t[this]}function o(t){var e=+this;return 0>e&&(e=Math.max(0,e+t.length)),t[e]}var s,a=t("./util"),c=a.canEvaluate;a.isIdentifier;e.prototype.call=function(t){var e=[].slice.call(arguments,1);return e.push(t),this._then(r,void 0,void 0,e,void 0)},e.prototype.get=function(t){var e,n="number"==typeof t;if(n)e=o;else if(c){var r=s(t);e=null!==r?r:i}else e=i;return this._then(e,void 0,void 0,t,void 0)}}},{"./util":36}],6:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){var o=t("./util"),s=o.tryCatch,a=o.errorObj,c=e._async;e.prototype["break"]=e.prototype.cancel=function(){if(!i.cancellation())return this._warn("cancellation is disabled");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var n=t._cancellationParent;if(null==n||!n._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=n}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1)},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),c.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(o.isArray(t))for(var n=0;n<t.length;++n)this._doInvokeOnCancel(t[n],e);else if(void 0!==t)if("function"==typeof t){if(!e){var r=s(t).call(this._boundValue());r===a&&(this._attachExtraTrace(r.e),c.throwLater(r.e))}}else t._resultCancelled(this)},e.prototype._invokeOnCancel=function(){var t=this._onCancel();this._unsetOnCancel(),c.invoke(this._doInvokeOnCancel,this,t)},e.prototype._invokeInternalOnCancel=function(){this._isCancellable()&&(this._doInvokeOnCancel(this._onCancel(),!0),this._unsetOnCancel())},e.prototype._resultCancelled=function(){this.cancel()}}},{"./util":36}],7:[function(t,e,n){"use strict";e.exports=function(e){function n(t,n,a){return function(c){var u=a._boundValue();t:for(var l=0;l<t.length;++l){var p=t[l];if(p===Error||null!=p&&p.prototype instanceof Error){if(c instanceof p)return o(n).call(u,c)}else if("function"==typeof p){var f=o(p).call(u,c);if(f===s)return f;if(f)return o(n).call(u,c)}else if(r.isObject(c)){for(var h=i(p),_=0;_<h.length;++_){var d=h[_];if(p[d]!=c[d])continue t}return o(n).call(u,c)}}return e}}var r=t("./util"),i=t("./es5").keys,o=r.tryCatch,s=r.errorObj;return n}},{"./es5":13,"./util":36}],8:[function(t,e,n){"use strict";e.exports=function(t){function e(){this._trace=new e.CapturedTrace(r())}function n(){return i?new e:void 0}function r(){var t=o.length-1;return t>=0?o[t]:void 0}var i=!1,o=[];return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},e.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,o.push(this._trace))},e.prototype._popContext=function(){if(void 0!==this._trace){var t=o.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},e.CapturedTrace=null,e.create=n,e.deactivateLongStackTraces=function(){},e.activateLongStackTraces=function(){var n=t.prototype._pushContext,o=t.prototype._popContext,s=t._peekContext,a=t.prototype._peekContext,c=t.prototype._promiseCreated;e.deactivateLongStackTraces=function(){t.prototype._pushContext=n,t.prototype._popContext=o,t._peekContext=s,t.prototype._peekContext=a,t.prototype._promiseCreated=c,i=!1},i=!0,t.prototype._pushContext=e.prototype._pushContext,t.prototype._popContext=e.prototype._popContext,t._peekContext=t.prototype._peekContext=r,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},e}},{}],9:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){function o(t,e){return{promise:e}}function s(){return!1}function a(t,e,n){var r=this;try{t(e,n,function(t){if("function"!=typeof t)throw new TypeError("onCancel must be a function, got: "+B.toString(t));r._attachCancellationCallback(t)})}catch(i){return i}}function c(t){if(!this._isCancellable())return this;var e=this._onCancel();void 0!==e?B.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function u(){return this._onCancelField}function l(t){this._onCancelField=t}function p(){this._cancellationParent=void 0,this._onCancelField=void 0}function f(t,e){if(0!==(1&e)){this._cancellationParent=t;var n=t._branchesRemainingToCancel;void 0===n&&(n=0),t._branchesRemainingToCancel=n+1}0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function h(t,e){0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function _(){var t=this._boundTo;return void 0!==t&&t instanceof e?t.isFulfilled()?t.value():void 0:t}function d(){this._trace=new V(this._peekContext())}function v(t,e){if(q(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var r=F(t);B.notEnumerableProp(t,"stack",r.message+"\n"+r.stack.join("\n")),B.notEnumerableProp(t,"__stackCleaned__",!0)}}}function y(){this._trace=void 0}function g(t,e,n,r,i){if(void 0===t&&null!==e&&Z){if(void 0!==i&&i._returnedNonUndefined())return;if(0===(65535&r._bitField))return;n&&(n+=" ");var o="",s="";if(e._trace){for(var a=e._trace.stack.split("\n"),c=k(a),u=c.length-1;u>=0;--u){var l=c[u];if(!Q.test(l)){var p=l.match(G);p&&(o="at "+p[1]+":"+p[2]+":"+p[3]+" ");break}}if(c.length>0)for(var f=c[0],u=0;u<a.length;++u)if(a[u]===f){u>0&&(s="\n"+a[u-1]);break}}var h="a promise was created in a "+n+"handler "+o+"but was not returned from it, see http://goo.gl/rRqMUw"+s;r._warn(h,!0,e)}}function m(t,e){var n=t+" is deprecated and will be removed in a future version.";return e&&(n+=" Use "+e+" instead."),b(n)}function b(t,n,r){if(lt.warnings){var i,o=new U(t);if(n)r._attachExtraTrace(o);else if(lt.longStackTraces&&(i=e._peekContext()))i.attachExtraTrace(o);else{var s=F(o);o.stack=s.message+"\n"+s.stack.join("\n")}ot("warning",o)||x(o,"",!0)}}function w(t,e){for(var n=0;n<e.length-1;++n)e[n].push("From previous event:"),e[n]=e[n].join("\n");return n<e.length&&(e[n]=e[n].join("\n")),t+"\n"+e.join("\n")}function C(t){for(var e=0;e<t.length;++e)(0===t[e].length||e+1<t.length&&t[e][0]===t[e+1][0])&&(t.splice(e,1),e--)}function j(t){for(var e=t[0],n=1;n<t.length;++n){for(var r=t[n],i=e.length-1,o=e[i],s=-1,a=r.length-1;a>=0;--a)if(r[a]===o){s=a;break}for(var a=s;a>=0;--a){var c=r[a];if(e[i]!==c)break;e.pop(),i--}e=r}}function k(t){for(var e=[],n=0;n<t.length;++n){var r=t[n],i="    (No stack trace)"===r||z.test(r),o=i&&at(r);i&&!o&&(W&&" "!==r.charAt(0)&&(r="    "+r),e.push(r))}return e}function E(t){for(var e=t.stack.replace(/\s+$/g,"").split("\n"),n=0;n<e.length;++n){var r=e[n];if("    (No stack trace)"===r||z.test(r))break}return n>0&&"SyntaxError"!=t.name&&(e=e.slice(n)),e}function F(t){var e=t.stack,n=t.toString();return e="string"==typeof e&&e.length>0?E(t):["    (No stack trace)"],{message:n,stack:"SyntaxError"==t.name?e:k(e)}}function x(t,e,n){if("undefined"!=typeof console){var r;if(B.isObject(t)){var i=t.stack;r=e+X(i,t)}else r=e+String(t);"function"==typeof I?I(r,n):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}}function T(t,e,n,r){var i=!1;try{"function"==typeof e&&(i=!0,"rejectionHandled"===t?e(r):e(n,r))}catch(o){N.throwLater(o)}"unhandledRejection"===t?ot(t,n,r)||i||x(n,"Unhandled rejection "):ot(t,r)}function P(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t&&"function"==typeof t.toString?t.toString():B.toString(t);var n=/\[object [a-zA-Z0-9$_]+\]/;if(n.test(e))try{var r=JSON.stringify(t);e=r}catch(i){}0===e.length&&(e="(empty array)")}return"(<"+R(e)+">, no stack trace)"}function R(t){var e=41;return t.length<e?t:t.substr(0,e-3)+"..."}function S(){return"function"==typeof ut}function O(t){var e=t.match(ct);return e?{fileName:e[1],line:parseInt(e[2],10)}:void 0}function A(t,e){if(S()){for(var n,r,i=(t.stack||"").split("\n"),o=(e.stack||"").split("\n"),s=-1,a=-1,c=0;c<i.length;++c){var u=O(i[c]);if(u){n=u.fileName,s=u.line;break}}for(var c=0;c<o.length;++c){var u=O(o[c]);if(u){r=u.fileName,a=u.line;break}}0>s||0>a||!n||!r||n!==r||s>=a||(at=function(t){if($.test(t))return!0;var e=O(t);return e&&e.fileName===n&&s<=e.line&&e.line<=a?!0:!1})}}function V(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);ut(this,V),e>32&&this.uncycle()}var H,D,I,L,N=e._async,U=t("./errors").Warning,B=t("./util"),M=t("./es5"),q=B.canAttachTrace,$=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,Q=/\((?:timers\.js):\d+:\d+\)/,G=/[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,z=null,X=null,W=!1,K=!(0==B.env("BLUEBIRD_DEBUG")||!B.env("BLUEBIRD_DEBUG")&&"development"!==B.env("NODE_ENV")),J=!(0==B.env("BLUEBIRD_WARNINGS")||!K&&!B.env("BLUEBIRD_WARNINGS")),Y=!(0==B.env("BLUEBIRD_LONG_STACK_TRACES")||!K&&!B.env("BLUEBIRD_LONG_STACK_TRACES")),Z=0!=B.env("BLUEBIRD_W_FORGOTTEN_RETURN")&&(J||!!B.env("BLUEBIRD_W_FORGOTTEN_RETURN"));!function(){function t(){for(var t=0;t<r.length;++t)r[t]._notifyUnhandledRejection();n()}function n(){r.length=0}var r=[];L=function(e){r.push(e),setTimeout(t,1)},M.defineProperty(e,"_unhandledRejectionCheck",{value:t}),M.defineProperty(e,"_unhandledRejectionClear",{value:n})}(),e.prototype.suppressUnhandledRejections=function(){var t=this._target();t._bitField=-1048577&t._bitField|524288},e.prototype._ensurePossibleRejectionHandled=function(){0===(524288&this._bitField)&&(this._setRejectionIsUnhandled(),L(this))},e.prototype._notifyUnhandledRejectionIsHandled=function(){T("rejectionHandled",H,void 0,this)},e.prototype._setReturnedNonUndefined=function(){this._bitField=268435456|this._bitField},e.prototype._returnedNonUndefined=function(){return 0!==(268435456&this._bitField)},e.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var t=this._settledValue();this._setUnhandledRejectionIsNotified(),T("unhandledRejection",D,t,this)}},e.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=262144|this._bitField},e.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=-262145&this._bitField},e.prototype._isUnhandledRejectionNotified=function(){return(262144&this._bitField)>0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},e.prototype._warn=function(t,e,n){return b(t,e,n||this)},e.onPossiblyUnhandledRejection=function(t){var n=e._getContext();D=B.contextBind(n,t)},e.onUnhandledRejectionHandled=function(t){var n=e._getContext();H=B.contextBind(n,t)};var tt=function(){};e.longStackTraces=function(){if(N.haveItemsQueued()&&!lt.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n    See http://goo.gl/MqrFmX\n");if(!lt.longStackTraces&&S()){var t=e.prototype._captureStackTrace,r=e.prototype._attachExtraTrace,i=e.prototype._dereferenceTrace;lt.longStackTraces=!0,tt=function(){if(N.haveItemsQueued()&&!lt.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n    See http://goo.gl/MqrFmX\n");e.prototype._captureStackTrace=t,e.prototype._attachExtraTrace=r,e.prototype._dereferenceTrace=i,n.deactivateLongStackTraces(),lt.longStackTraces=!1},e.prototype._captureStackTrace=d,e.prototype._attachExtraTrace=v,e.prototype._dereferenceTrace=y,n.activateLongStackTraces()}},e.hasLongStackTraces=function(){return lt.longStackTraces&&S()};var et={unhandledrejection:{before:function(){var t=B.global.onunhandledrejection;return B.global.onunhandledrejection=null,t},after:function(t){B.global.onunhandledrejection=t}},rejectionhandled:{before:function(){var t=B.global.onrejectionhandled;return B.global.onrejectionhandled=null,t},after:function(t){B.global.onrejectionhandled=t}}},nt=function(){var t=function(t,e){if(!t)return!B.global.dispatchEvent(e);var n;try{return n=t.before(),!B.global.dispatchEvent(e)}finally{t.after(n)}};try{if("function"==typeof CustomEvent){var e=new CustomEvent("CustomEvent");return B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r={detail:n,cancelable:!0},i=new CustomEvent(e,r);return M.defineProperty(i,"promise",{value:n.promise}),M.defineProperty(i,"reason",{value:n.reason}),t(et[e],i)}}if("function"==typeof Event){var e=new Event("CustomEvent");return B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=new Event(e,{cancelable:!0});return r.detail=n,M.defineProperty(r,"promise",{value:n.promise}),M.defineProperty(r,"reason",{value:n.reason}),t(et[e],r)}}var e=document.createEvent("CustomEvent");return e.initCustomEvent("testingtheevent",!1,!0,{}),B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,!1,!0,n),t(et[e],r)}}catch(n){}return function(){return!1}}(),rt=function(){return B.isNode?function(){return process.emit.apply(process,arguments)}:B.global?function(t){var e="on"+t.toLowerCase(),n=B.global[e];return n?(n.apply(B.global,[].slice.call(arguments,1)),!0):!1}:function(){return!1}}(),it={promiseCreated:o,promiseFulfilled:o,promiseRejected:o,promiseResolved:o,promiseCancelled:o,promiseChained:function(t,e,n){return{promise:e,child:n}},warning:function(t,e){return{warning:e}},unhandledRejection:function(t,e,n){return{reason:e,promise:n}},rejectionHandled:o},ot=function(t){var e=!1;try{e=rt.apply(null,arguments)}catch(n){N.throwLater(n),e=!0}var r=!1;try{r=nt(t,it[t].apply(null,arguments))}catch(n){N.throwLater(n),r=!0}return r||e};e.config=function(t){if(t=Object(t),"longStackTraces"in t&&(t.longStackTraces?e.longStackTraces():!t.longStackTraces&&e.hasLongStackTraces()&&tt()),"warnings"in t){var n=t.warnings;lt.warnings=!!n,Z=lt.warnings,B.isObject(n)&&"wForgottenReturn"in n&&(Z=!!n.wForgottenReturn)}if("cancellation"in t&&t.cancellation&&!lt.cancellation){if(N.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");e.prototype._clearCancellationData=p,e.prototype._propagateFrom=f,e.prototype._onCancel=u,e.prototype._setOnCancel=l,e.prototype._attachCancellationCallback=c,e.prototype._execute=a,st=f,lt.cancellation=!0}if("monitoring"in t&&(t.monitoring&&!lt.monitoring?(lt.monitoring=!0,e.prototype._fireEvent=ot):!t.monitoring&&lt.monitoring&&(lt.monitoring=!1,e.prototype._fireEvent=s)),"asyncHooks"in t&&B.nodeSupportsAsyncResource){var o=lt.asyncHooks,h=!!t.asyncHooks;o!==h&&(lt.asyncHooks=h,h?r():i())}return e},e.prototype._fireEvent=s,e.prototype._execute=function(t,e,n){try{t(e,n)}catch(r){return r}},e.prototype._onCancel=function(){},e.prototype._setOnCancel=function(t){},e.prototype._attachCancellationCallback=function(t){},e.prototype._captureStackTrace=function(){},e.prototype._attachExtraTrace=function(){},e.prototype._dereferenceTrace=function(){},e.prototype._clearCancellationData=function(){},e.prototype._propagateFrom=function(t,e){};var st=h,at=function(){return!1},ct=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;B.inherits(V,Error),n.CapturedTrace=V,V.prototype.uncycle=function(){var t=this._length;if(!(2>t)){for(var e=[],n={},r=0,i=this;void 0!==i;++r)e.push(i),i=i._parent;t=this._length=r;for(var r=t-1;r>=0;--r){var o=e[r].stack;void 0===n[o]&&(n[o]=r)}for(var r=0;t>r;++r){var s=e[r].stack,a=n[s];if(void 0!==a&&a!==r){a>0&&(e[a-1]._parent=void 0,e[a-1]._length=1),e[r]._parent=void 0,e[r]._length=1;var c=r>0?e[r-1]:this;t-1>a?(c._parent=e[a+1],c._parent.uncycle(),c._length=c._parent._length+1):(c._parent=void 0,c._length=1);for(var u=c._length+1,l=r-2;l>=0;--l)e[l]._length=u,u++;return}}}},V.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=F(t),n=e.message,r=[e.stack],i=this;void 0!==i;)r.push(k(i.stack.split("\n"))),i=i._parent;j(r),C(r),B.notEnumerableProp(t,"stack",w(n,r)),B.notEnumerableProp(t,"__stackCleaned__",!0)}};var ut=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():P(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit+=6,z=t,X=e;var n=Error.captureStackTrace;return at=function(t){return $.test(t)},function(t,e){Error.stackTraceLimit+=6,n(t,e),Error.stackTraceLimit-=6}}var r=new Error;if("string"==typeof r.stack&&r.stack.split("\n")[0].indexOf("stackDetection@")>=0)return z=/@/,X=e,W=!0,function(t){t.stack=(new Error).stack};var i;try{throw new Error}catch(o){i="stack"in o}return"stack"in r||!i||"number"!=typeof Error.stackTraceLimit?(X=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?P(e):e.toString()},null):(z=t,X=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}([]);"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(I=function(t){console.warn(t)},B.isNode&&process.stderr.isTTY?I=function(t,e){var n=e?"[33m":"[31m";console.warn(n+t+"[0m\n")}:B.isNode||"string"!=typeof(new Error).stack||(I=function(t,e){console.warn("%c"+t,e?"color: darkorange":"color: red")}));var lt={warnings:J,longStackTraces:!1,cancellation:!1,monitoring:!1,asyncHooks:!1};return Y&&e.longStackTraces(),{asyncHooks:function(){return lt.asyncHooks},longStackTraces:function(){return lt.longStackTraces},warnings:function(){return lt.warnings},cancellation:function(){return lt.cancellation},monitoring:function(){return lt.monitoring},propagateFromFunction:function(){return st},boundValueFunction:function(){return _},checkForgottenReturns:g,setBounds:A,warn:b,deprecated:m,CapturedTrace:V,fireDomEvent:nt,fireGlobalEvent:rt}}},{"./errors":12,"./es5":13,"./util":36}],10:[function(t,e,n){"use strict";e.exports=function(t){function e(){return this.value}function n(){throw this.reason}t.prototype["return"]=t.prototype.thenReturn=function(n){return n instanceof t&&n.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:n},void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return this._then(n,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,n,void 0,{reason:t},void 0);var e=arguments[1],r=function(){throw e};return this.caught(t,r)},t.prototype.catchReturn=function(n){if(arguments.length<=1)return n instanceof t&&n.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:n},void 0);var r=arguments[1];r instanceof t&&r.suppressUnhandledRejections();var i=function(){return r};return this.caught(n,i)}}},{}],11:[function(t,e,n){"use strict";e.exports=function(t,e){function n(){return o(this)}function r(t,n){return i(t,n,e,e)}var i=t.reduce,o=t.all;t.prototype.each=function(t){return i(this,t,e,0)._then(n,void 0,void 0,this,void 0)},t.prototype.mapSeries=function(t){return i(this,t,e,e)},t.each=function(t,r){return i(t,r,e,0)._then(n,void 0,void 0,t,void 0)},t.mapSeries=r}},{}],12:[function(t,e,n){"use strict";function r(t,e){function n(r){return this instanceof n?(p(this,"message","string"==typeof r?r:e),p(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new n(r)}return l(n,Error),n}function i(t){return this instanceof i?(p(this,"name","OperationalError"),p(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(p(this,"message",t.message),p(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new i(t)}var o,s,a=t("./es5"),c=a.freeze,u=t("./util"),l=u.inherits,p=u.notEnumerableProp,f=r("Warning","warning"),h=r("CancellationError","cancellation error"),_=r("TimeoutError","timeout error"),d=r("AggregateError","aggregate error");try{o=TypeError,s=RangeError}catch(v){o=r("TypeError","type error"),s=r("RangeError","range error")}for(var y="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),g=0;g<y.length;++g)"function"==typeof Array.prototype[y[g]]&&(d.prototype[y[g]]=Array.prototype[y[g]]);a.defineProperty(d.prototype,"length",{value:0,configurable:!1,writable:!0,enumerable:!0}),d.prototype.isOperational=!0;var m=0;d.prototype.toString=function(){var t=Array(4*m+1).join(" "),e="\n"+t+"AggregateError of:\n";m++,t=Array(4*m+1).join(" ");for(var n=0;n<this.length;++n){for(var r=this[n]===this?"[Circular AggregateError]":this[n]+"",i=r.split("\n"),o=0;o<i.length;++o)i[o]=t+i[o];r=i.join("\n"),e+=r+"\n"}return m--,e},l(i,Error);var b=Error.__BluebirdErrorTypes__;b||(b=c({CancellationError:h,TimeoutError:_,OperationalError:i,RejectionError:i,AggregateError:d}),a.defineProperty(Error,"__BluebirdErrorTypes__",{value:b,writable:!1,enumerable:!1,configurable:!1})),e.exports={Error:Error,TypeError:o,RangeError:s,CancellationError:b.CancellationError,OperationalError:b.OperationalError,TimeoutError:b.TimeoutError,AggregateError:b.AggregateError,Warning:f}},{"./es5":13,"./util":36}],13:[function(t,e,n){var r=function(){"use strict";return void 0===this}();if(r)e.exports={freeze:Object.freeze,defineProperty:Object.defineProperty,getDescriptor:Object.getOwnPropertyDescriptor,keys:Object.keys,names:Object.getOwnPropertyNames,getPrototypeOf:Object.getPrototypeOf,isArray:Array.isArray,isES5:r,propertyIsWritable:function(t,e){var n=Object.getOwnPropertyDescriptor(t,e);return!(n&&!n.writable&&!n.set)}};else{var i={}.hasOwnProperty,o={}.toString,s={}.constructor.prototype,a=function(t){var e=[];for(var n in t)i.call(t,n)&&e.push(n);return e},c=function(t,e){return{value:t[e]}},u=function(t,e,n){return t[e]=n.value,t},l=function(t){return t},p=function(t){try{return Object(t).constructor.prototype}catch(e){return s}},f=function(t){try{return"[object Array]"===o.call(t)}catch(e){return!1}};e.exports={isArray:f,keys:a,names:a,defineProperty:u,getDescriptor:c,freeze:l,getPrototypeOf:p,isES5:r,propertyIsWritable:function(){return!0}}}},{}],14:[function(t,e,n){"use strict";e.exports=function(t,e){var n=t.map;t.prototype.filter=function(t,r){return n(this,t,r,e)},t.filter=function(t,r,i){return n(t,r,i,e)}}},{}],15:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t,e,n){this.promise=t,this.type=e,this.handler=n,this.called=!1,this.cancelPromise=null}function o(t){this.finallyHandler=t}function s(t,e){return null!=t.cancelPromise?(arguments.length>1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0):!1}function a(){return u.call(this,this.promise._target()._settledValue())}function c(t){return s(this,t)?void 0:(f.e=t,f)}function u(t){var i=this.promise,u=this.handler;if(!this.called){this.called=!0;var l=this.isFinallyHandler()?u.call(i._boundValue()):u.call(i._boundValue(),t);if(l===r)return l;if(void 0!==l){i._setReturnedNonUndefined();var h=n(l,i);if(h instanceof e){if(null!=this.cancelPromise){if(h._isCancelled()){var _=new p("late cancellation observer");return i._attachExtraTrace(_),f.e=_,f}h.isPending()&&h._attachCancellationCallback(new o(this))}return h._then(a,c,void 0,this,void 0)}}}return i.isRejected()?(s(this),f.e=t,f):(s(this),t)}var l=t("./util"),p=e.CancellationError,f=l.errorObj,h=t("./catch_filter")(r);return i.prototype.isFinallyHandler=function(){return 0===this.type},o.prototype._resultCancelled=function(){s(this.finallyHandler)},e.prototype._passThrough=function(t,e,n,r){return"function"!=typeof t?this.then():this._then(n,r,void 0,new i(this,e,t),void 0)},e.prototype.lastly=e.prototype["finally"]=function(t){return this._passThrough(t,0,u,u)},e.prototype.tap=function(t){return this._passThrough(t,1,u)},e.prototype.tapCatch=function(t){var n=arguments.length;if(1===n)return this._passThrough(t,1,void 0,u);var r,i=new Array(n-1),o=0;for(r=0;n-1>r;++r){var s=arguments[r];if(!l.isObject(s))return e.reject(new TypeError("tapCatch statement predicate: expecting an object but got "+l.classString(s)));i[o++]=s}i.length=o;var a=arguments[r];return this._passThrough(h(i,a,this),1,void 0,u)},i}},{"./catch_filter":7,"./util":36}],16:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r){for(var o=0;o<n.length;++o){r._pushContext();var s=h(n[o])(t);if(r._popContext(),s===f){r._pushContext();var a=e.reject(f.e);return r._popContext(),a}var c=i(s,r);if(c instanceof e)return c}return null}function c(t,n,i,o){if(s.cancellation()){var a=new e(r),c=this._finallyPromise=new e(r);this._promise=a.lastly(function(){return c}),a._captureStackTrace(),a._setOnCancel(this)}else{var u=this._promise=new e(r);u._captureStackTrace()}this._stack=o,this._generatorFunction=t,this._receiver=n,this._generator=void 0,this._yieldHandlers="function"==typeof i?[i].concat(_):_,this._yieldedPromise=null,this._cancellationPhase=!1}var u=t("./errors"),l=u.TypeError,p=t("./util"),f=p.errorObj,h=p.tryCatch,_=[];p.inherits(c,o),c.prototype._isResolved=function(){return null===this._promise},c.prototype._cleanup=function(){this._promise=this._generator=null,s.cancellation()&&null!==this._finallyPromise&&(this._finallyPromise._fulfill(),this._finallyPromise=null)},c.prototype._promiseCancelled=function(){if(!this._isResolved()){var t,n="undefined"!=typeof this._generator["return"];if(n)this._promise._pushContext(),t=h(this._generator["return"]).call(this._generator,void 0),this._promise._popContext();else{var r=new e.CancellationError("generator .return() sentinel");e.coroutine.returnSentinel=r,this._promise._attachExtraTrace(r),this._promise._pushContext(),t=h(this._generator["throw"]).call(this._generator,r),this._promise._popContext()}this._cancellationPhase=!0,this._yieldedPromise=null,this._continue(t)}},c.prototype._promiseFulfilled=function(t){this._yieldedPromise=null,this._promise._pushContext();var e=h(this._generator.next).call(this._generator,t);this._promise._popContext(),this._continue(e)},c.prototype._promiseRejected=function(t){this._yieldedPromise=null,this._promise._attachExtraTrace(t),this._promise._pushContext();var e=h(this._generator["throw"]).call(this._generator,t);this._promise._popContext(),this._continue(e)},c.prototype._resultCancelled=function(){if(this._yieldedPromise instanceof e){var t=this._yieldedPromise;this._yieldedPromise=null,t.cancel()}},c.prototype.promise=function(){return this._promise},c.prototype._run=function(){this._generator=this._generatorFunction.call(this._receiver),this._receiver=this._generatorFunction=void 0,this._promiseFulfilled(void 0)},c.prototype._continue=function(t){var n=this._promise;if(t===f)return this._cleanup(),this._cancellationPhase?n.cancel():n._rejectCallback(t.e,!1);var r=t.value;if(t.done===!0)return this._cleanup(),this._cancellationPhase?n.cancel():n._resolveCallback(r);
var o=i(r,this._promise);if(!(o instanceof e)&&(o=a(o,this._yieldHandlers,this._promise),null===o))return void this._promiseRejected(new l("A value %s was yielded that could not be treated as a promise\n\n    See http://goo.gl/MqrFmX\n\n".replace("%s",String(r))+"From coroutine:\n"+this._stack.split("\n").slice(1,-7).join("\n")));o=o._target();var s=o._bitField;0===(50397184&s)?(this._yieldedPromise=o,o._proxy(this,null)):0!==(33554432&s)?e._async.invoke(this._promiseFulfilled,this,o._value()):0!==(16777216&s)?e._async.invoke(this._promiseRejected,this,o._reason()):this._promiseCancelled()},e.coroutine=function(t,e){if("function"!=typeof t)throw new l("generatorFunction must be a function\n\n    See http://goo.gl/MqrFmX\n");var n=Object(e).yieldHandler,r=c,i=(new Error).stack;return function(){var e=t.apply(this,arguments),o=new r(void 0,void 0,n,i),s=o.promise();return o._generator=e,o._promiseFulfilled(void 0),s}},e.coroutine.addYieldHandler=function(t){if("function"!=typeof t)throw new l("expecting a function but got "+p.classString(t));_.push(t)},e.spawn=function(t){if(s.deprecated("Promise.spawn()","Promise.coroutine()"),"function"!=typeof t)return n("generatorFunction must be a function\n\n    See http://goo.gl/MqrFmX\n");var r=new c(t,this),i=r.promise();return r._run(e.spawn),i}}},{"./errors":12,"./util":36}],17:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){var s=t("./util");s.canEvaluate,s.tryCatch,s.errorObj;e.join=function(){var t,e=arguments.length-1;if(e>0&&"function"==typeof arguments[e]){t=arguments[e];var r}var i=[].slice.call(arguments);t&&i.pop();var r=new n(i).promise();return void 0!==t?r.spread(t):r}}},{"./util":36}],18:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r,i){this.constructor$(t),this._promise._captureStackTrace();var s=e._getContext();if(this._callback=u.contextBind(s,n),this._preservedValues=i===o?new Array(this.length()):null,this._limit=r,this._inFlight=0,this._queue=[],f.invoke(this._asyncInit,this,void 0),u.isArray(t))for(var a=0;a<t.length;++a){var c=t[a];c instanceof e&&c.suppressUnhandledRejections()}}function c(t,n,i,o){if("function"!=typeof n)return r("expecting a function but got "+u.classString(n));var s=0;if(void 0!==i){if("object"!=typeof i||null===i)return e.reject(new TypeError("options argument must be an object but it is "+u.classString(i)));if("number"!=typeof i.concurrency)return e.reject(new TypeError("'concurrency' must be a number but it is "+u.classString(i.concurrency)));s=i.concurrency}return s="number"==typeof s&&isFinite(s)&&s>=1?s:0,new a(t,n,s,o).promise()}var u=t("./util"),l=u.tryCatch,p=u.errorObj,f=e._async;u.inherits(a,n),a.prototype._asyncInit=function(){this._init$(void 0,-2)},a.prototype._init=function(){},a.prototype._promiseFulfilled=function(t,n){var r=this._values,o=this.length(),a=this._preservedValues,c=this._limit;if(0>n){if(n=-1*n-1,r[n]=t,c>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return!0}else{if(c>=1&&this._inFlight>=c)return r[n]=t,this._queue.push(n),!1;null!==a&&(a[n]=t);var u=this._promise,f=this._callback,h=u._boundValue();u._pushContext();var _=l(f).call(h,t,n,o),d=u._popContext();if(s.checkForgottenReturns(_,d,null!==a?"Promise.filter":"Promise.map",u),_===p)return this._reject(_.e),!0;var v=i(_,this._promise);if(v instanceof e){v=v._target();var y=v._bitField;if(0===(50397184&y))return c>=1&&this._inFlight++,r[n]=v,v._proxy(this,-1*(n+1)),!1;if(0===(33554432&y))return 0!==(16777216&y)?(this._reject(v._reason()),!0):(this._cancel(),!0);_=v._value()}r[n]=_}var g=++this._totalResolved;return g>=o?(null!==a?this._filter(r,a):this._resolve(r),!0):!1},a.prototype._drainQueue=function(){for(var t=this._queue,e=this._limit,n=this._values;t.length>0&&this._inFlight<e;){if(this._isResolved())return;var r=t.pop();this._promiseFulfilled(n[r],r)}},a.prototype._filter=function(t,e){for(var n=e.length,r=new Array(n),i=0,o=0;n>o;++o)t[o]&&(r[i++]=e[o]);r.length=i,this._resolve(r)},a.prototype.preservedValues=function(){return this._preservedValues},e.prototype.map=function(t,e){return c(this,t,e,null)},e.map=function(t,e,n,r){return c(t,e,n,r)}}},{"./util":36}],19:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){var s=t("./util"),a=s.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("expecting a function but got "+s.classString(t));return function(){var r=new e(n);r._captureStackTrace(),r._pushContext();var i=a(t).apply(this,arguments),s=r._popContext();return o.checkForgottenReturns(i,s,"Promise.method",r),r._resolveFromSyncValue(i),r}},e.attempt=e["try"]=function(t){if("function"!=typeof t)return i("expecting a function but got "+s.classString(t));var r=new e(n);r._captureStackTrace(),r._pushContext();var c;if(arguments.length>1){o.deprecated("calling Promise.try with more than 1 argument");var u=arguments[1],l=arguments[2];c=s.isArray(u)?a(t).apply(l,u):a(t).call(l,u)}else c=a(t)();var p=r._popContext();return o.checkForgottenReturns(c,p,"Promise.try",r),r._resolveFromSyncValue(c),r},e.prototype._resolveFromSyncValue=function(t){t===s.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{"./util":36}],20:[function(t,e,n){"use strict";function r(t){return t instanceof Error&&l.getPrototypeOf(t)===Error.prototype}function i(t){var e;if(r(t)){e=new u(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var n=l.keys(t),i=0;i<n.length;++i){var o=n[i];p.test(o)||(e[o]=t[o])}return e}return s.markAsOriginatingFromRejection(t),t}function o(t,e){return function(n,r){if(null!==t){if(n){var o=i(a(n));t._attachExtraTrace(o),t._reject(o)}else if(e){var s=[].slice.call(arguments,1);t._fulfill(s)}else t._fulfill(r);t=null}}}var s=t("./util"),a=s.maybeWrapAsError,c=t("./errors"),u=c.OperationalError,l=t("./es5"),p=/^(?:name|message|stack|cause)$/;e.exports=o},{"./errors":12,"./es5":13,"./util":36}],21:[function(t,e,n){"use strict";e.exports=function(e){function n(t,e){var n=this;if(!o.isArray(t))return r.call(n,t,e);var i=a(e).apply(n._boundValue(),[null].concat(t));i===c&&s.throwLater(i.e)}function r(t,e){var n=this,r=n._boundValue(),i=void 0===t?a(e).call(r,null):a(e).call(r,null,t);i===c&&s.throwLater(i.e)}function i(t,e){var n=this;if(!t){var r=new Error(t+"");r.cause=t,t=r}var i=a(e).call(n._boundValue(),t);i===c&&s.throwLater(i.e)}var o=t("./util"),s=e._async,a=o.tryCatch,c=o.errorObj;e.prototype.asCallback=e.prototype.nodeify=function(t,e){if("function"==typeof t){var o=r;void 0!==e&&Object(e).spread&&(o=n),this._then(o,i,void 0,this,t)}return this}}},{"./util":36}],22:[function(t,e,n){"use strict";e.exports=function(){function n(){}function r(t,e){if(null==t||t.constructor!==i)throw new E("the promise constructor cannot be invoked directly\n\n    See http://goo.gl/MqrFmX\n");if("function"!=typeof e)throw new E("expecting a function but got "+f.classString(e))}function i(t){t!==x&&r(this,t),this._bitField=0,this._fulfillmentHandler0=void 0,this._rejectionHandler0=void 0,this._promise0=void 0,this._receiver0=void 0,this._resolveFromExecutor(t),this._promiseCreated(),this._fireEvent("promiseCreated",this)}function o(t){this.promise._resolveCallback(t)}function s(t){this.promise._rejectCallback(t,!1)}function a(t){var e=new i(x);e._fulfillmentHandler0=t,e._rejectionHandler0=t,e._promise0=t,e._receiver0=t}var c=function(){return new E("circular promise resolution chain\n\n    See http://goo.gl/MqrFmX\n")},u=function(){return new i.PromiseInspection(this._target())},l=function(t){return i.reject(new E(t))},p={},f=t("./util");f.setReflectHandler(u);var h=function(){var t=process.domain;return void 0===t?null:t},_=function(){return null},d=function(){return{domain:h(),async:null}},v=f.isNode&&f.nodeSupportsAsyncResource?t("async_hooks").AsyncResource:null,y=function(){return{domain:h(),async:new v("Bluebird::Promise")}},g=f.isNode?d:_;f.notEnumerableProp(i,"_getContext",g);var m=function(){g=y,f.notEnumerableProp(i,"_getContext",y)},b=function(){g=d,f.notEnumerableProp(i,"_getContext",d)},w=t("./es5"),C=t("./async"),j=new C;w.defineProperty(i,"_async",{value:j});var k=t("./errors"),E=i.TypeError=k.TypeError;i.RangeError=k.RangeError;var F=i.CancellationError=k.CancellationError;i.TimeoutError=k.TimeoutError,i.OperationalError=k.OperationalError,i.RejectionError=k.OperationalError,i.AggregateError=k.AggregateError;var x=function(){},T={},P={},R=t("./thenables")(i,x),S=t("./promise_array")(i,x,R,l,n),O=t("./context")(i),A=O.create,V=t("./debuggability")(i,O,m,b),H=(V.CapturedTrace,t("./finally")(i,R,P)),D=t("./catch_filter")(P),I=t("./nodeback"),L=f.errorObj,N=f.tryCatch;return i.prototype.toString=function(){return"[object Promise]"},i.prototype.caught=i.prototype["catch"]=function(t){var e=arguments.length;if(e>1){var n,r=new Array(e-1),i=0;for(n=0;e-1>n;++n){var o=arguments[n];if(!f.isObject(o))return l("Catch statement predicate: expecting an object but got "+f.classString(o));r[i++]=o}if(r.length=i,t=arguments[n],"function"!=typeof t)throw new E("The last argument to .catch() must be a function, got "+f.toString(t));return this.then(void 0,D(r,t,this))}return this.then(void 0,t)},i.prototype.reflect=function(){return this._then(u,u,void 0,this,void 0)},i.prototype.then=function(t,e){if(V.warnings()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+f.classString(t);arguments.length>1&&(n+=", "+f.classString(e)),this._warn(n)}return this._then(t,e,void 0,void 0,void 0)},i.prototype.done=function(t,e){var n=this._then(t,e,void 0,void 0,void 0);n._setIsFinal()},i.prototype.spread=function(t){return"function"!=typeof t?l("expecting a function but got "+f.classString(t)):this.all()._then(t,void 0,void 0,T,void 0)},i.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},i.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new S(this).promise()},i.prototype.error=function(t){return this.caught(f.originatesFromRejection,t)},i.getNewLibraryCopy=e.exports,i.is=function(t){return t instanceof i},i.fromNode=i.fromCallback=function(t){var e=new i(x);e._captureStackTrace();var n=arguments.length>1?!!Object(arguments[1]).multiArgs:!1,r=N(t)(I(e,n));return r===L&&e._rejectCallback(r.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},i.all=function(t){return new S(t).promise()},i.cast=function(t){var e=R(t);return e instanceof i||(e=new i(x),e._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},i.resolve=i.fulfilled=i.cast,i.reject=i.rejected=function(t){var e=new i(x);return e._captureStackTrace(),e._rejectCallback(t,!0),e},i.setScheduler=function(t){if("function"!=typeof t)throw new E("expecting a function but got "+f.classString(t));return j.setScheduler(t)},i.prototype._then=function(t,e,n,r,o){var s=void 0!==o,a=s?o:new i(x),c=this._target(),u=c._bitField;s||(a._propagateFrom(this,3),a._captureStackTrace(),void 0===r&&0!==(2097152&this._bitField)&&(r=0!==(50397184&u)?this._boundValue():c===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,a));var l=g();if(0!==(50397184&u)){var p,h,_=c._settlePromiseCtx;0!==(33554432&u)?(h=c._rejectionHandler0,p=t):0!==(16777216&u)?(h=c._fulfillmentHandler0,p=e,c._unsetRejectionIsUnhandled()):(_=c._settlePromiseLateCancellationObserver,h=new F("late cancellation observer"),c._attachExtraTrace(h),p=e),j.invoke(_,c,{handler:f.contextBind(l,p),promise:a,receiver:r,value:h})}else c._addCallbacks(t,e,a,r,l);return a},i.prototype._length=function(){return 65535&this._bitField},i.prototype._isFateSealed=function(){return 0!==(117506048&this._bitField)},i.prototype._isFollowing=function(){return 67108864===(67108864&this._bitField)},i.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},i.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},i.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},i.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},i.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},i.prototype._isFinal=function(){return(4194304&this._bitField)>0},i.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},i.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},i.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},i.prototype._setAsyncGuaranteed=function(){if(!j.hasCustomScheduler()){var t=this._bitField;this._bitField=t|(536870912&t)>>2^134217728}},i.prototype._setNoAsyncGuarantee=function(){this._bitField=-134217729&(536870912|this._bitField)},i.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];return e===p?void 0:void 0===e&&this._isBound()?this._boundValue():e},i.prototype._promiseAt=function(t){return this[4*t-4+2]},i.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},i.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},i.prototype._boundValue=function(){},i.prototype._migrateCallback0=function(t){var e=(t._bitField,t._fulfillmentHandler0),n=t._rejectionHandler0,r=t._promise0,i=t._receiverAt(0);void 0===i&&(i=p),this._addCallbacks(e,n,r,i,null)},i.prototype._migrateCallbackAt=function(t,e){var n=t._fulfillmentHandlerAt(e),r=t._rejectionHandlerAt(e),i=t._promiseAt(e),o=t._receiverAt(e);void 0===o&&(o=p),this._addCallbacks(n,r,i,o,null)},i.prototype._addCallbacks=function(t,e,n,r,i){var o=this._length();if(o>=65531&&(o=0,this._setLength(0)),0===o)this._promise0=n,this._receiver0=r,"function"==typeof t&&(this._fulfillmentHandler0=f.contextBind(i,t)),"function"==typeof e&&(this._rejectionHandler0=f.contextBind(i,e));else{var s=4*o-4;this[s+2]=n,this[s+3]=r,"function"==typeof t&&(this[s+0]=f.contextBind(i,t)),"function"==typeof e&&(this[s+1]=f.contextBind(i,e))}return this._setLength(o+1),o},i.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},i.prototype._resolveCallback=function(t,e){if(0===(117506048&this._bitField)){if(t===this)return this._rejectCallback(c(),!1);var n=R(t,this);if(!(n instanceof i))return this._fulfill(t);e&&this._propagateFrom(n,2);var r=n._target();if(r===this)return void this._reject(c());var o=r._bitField;if(0===(50397184&o)){var s=this._length();s>0&&r._migrateCallback0(this);for(var a=1;s>a;++a)r._migrateCallbackAt(this,a);this._setFollowing(),this._setLength(0),this._setFollowee(n)}else if(0!==(33554432&o))this._fulfill(r._value());else if(0!==(16777216&o))this._reject(r._reason());else{var u=new F("late cancellation observer");r._attachExtraTrace(u),this._reject(u)}}},i.prototype._rejectCallback=function(t,e,n){var r=f.ensureErrorObject(t),i=r===t;if(!i&&!n&&V.warnings()){var o="a promise was rejected with a non-error: "+f.classString(t);this._warn(o,!0)}this._attachExtraTrace(r,e?i:!1),this._reject(t)},i.prototype._resolveFromExecutor=function(t){if(t!==x){var e=this;this._captureStackTrace(),this._pushContext();var n=!0,r=this._execute(t,function(t){e._resolveCallback(t)},function(t){e._rejectCallback(t,n)});n=!1,this._popContext(),void 0!==r&&e._rejectCallback(r,!0)}},i.prototype._settlePromiseFromHandler=function(t,e,n,r){var i=r._bitField;if(0===(65536&i)){r._pushContext();var o;e===T?n&&"number"==typeof n.length?o=N(t).apply(this._boundValue(),n):(o=L,o.e=new E("cannot .spread() a non-array: "+f.classString(n))):o=N(t).call(e,n);var s=r._popContext();i=r._bitField,0===(65536&i)&&(o===P?r._reject(n):o===L?r._rejectCallback(o.e,!1):(V.checkForgottenReturns(o,s,"",r,this),r._resolveCallback(o)))}},i.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},i.prototype._followee=function(){return this._rejectionHandler0},i.prototype._setFollowee=function(t){this._rejectionHandler0=t},i.prototype._settlePromise=function(t,e,r,o){var s=t instanceof i,a=this._bitField,c=0!==(134217728&a);0!==(65536&a)?(s&&t._invokeInternalOnCancel(),r instanceof H&&r.isFinallyHandler()?(r.cancelPromise=t,N(e).call(r,o)===L&&t._reject(L.e)):e===u?t._fulfill(u.call(r)):r instanceof n?r._promiseCancelled(t):s||t instanceof S?t._cancel():r.cancel()):"function"==typeof e?s?(c&&t._setAsyncGuaranteed(),this._settlePromiseFromHandler(e,r,o,t)):e.call(r,o,t):r instanceof n?r._isResolved()||(0!==(33554432&a)?r._promiseFulfilled(o,t):r._promiseRejected(o,t)):s&&(c&&t._setAsyncGuaranteed(),0!==(33554432&a)?t._fulfill(o):t._reject(o))},i.prototype._settlePromiseLateCancellationObserver=function(t){var e=t.handler,n=t.promise,r=t.receiver,o=t.value;"function"==typeof e?n instanceof i?this._settlePromiseFromHandler(e,r,o,n):e.call(r,o,n):n instanceof i&&n._reject(o)},i.prototype._settlePromiseCtx=function(t){this._settlePromise(t.promise,t.handler,t.receiver,t.value)},i.prototype._settlePromise0=function(t,e,n){var r=this._promise0,i=this._receiverAt(0);this._promise0=void 0,this._receiver0=void 0,this._settlePromise(r,t,i,e)},i.prototype._clearCallbackDataAtIndex=function(t){var e=4*t-4;this[e+2]=this[e+3]=this[e+0]=this[e+1]=void 0},i.prototype._fulfill=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(t===this){var n=c();return this._attachExtraTrace(n),this._reject(n)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!==(134217728&e)?this._settlePromises():j.settlePromises(this),this._dereferenceTrace())}},i.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16))return this._setRejected(),this._fulfillmentHandler0=t,this._isFinal()?j.fatalError(t,f.isNode):void((65535&e)>0?j.settlePromises(this):this._ensurePossibleRejectionHandled())},i.prototype._fulfillPromises=function(t,e){for(var n=1;t>n;n++){var r=this._fulfillmentHandlerAt(n),i=this._promiseAt(n),o=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(i,r,o,e)}},i.prototype._rejectPromises=function(t,e){for(var n=1;t>n;n++){var r=this._rejectionHandlerAt(n),i=this._promiseAt(n),o=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(i,r,o,e)}},i.prototype._settlePromises=function(){var t=this._bitField,e=65535&t;if(e>0){if(0!==(16842752&t)){var n=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,n,t),this._rejectPromises(e,n)}else{var r=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,r,t),this._fulfillPromises(e,r)}this._setLength(0)}this._clearCancellationData()},i.prototype._settledValue=function(){var t=this._bitField;return 0!==(33554432&t)?this._rejectionHandler0:0!==(16777216&t)?this._fulfillmentHandler0:void 0},"undefined"!=typeof Symbol&&Symbol.toStringTag&&w.defineProperty(i.prototype,Symbol.toStringTag,{get:function(){return"Object"}}),i.defer=i.pending=function(){V.deprecated("Promise.defer","new Promise");var t=new i(x);return{promise:t,resolve:o,reject:s}},f.notEnumerableProp(i,"_makeSelfResolutionError",c),t("./method")(i,x,R,l,V),t("./bind")(i,x,R,V),t("./cancel")(i,S,l,V),t("./direct_resolve")(i),t("./synchronous_inspection")(i),t("./join")(i,S,R,x,j),i.Promise=i,i.version="3.7.2",t("./call_get.js")(i),t("./generators.js")(i,l,x,R,n,V),t("./map.js")(i,S,l,R,x,V),t("./nodeify.js")(i),t("./promisify.js")(i,x),t("./props.js")(i,S,R,l),t("./race.js")(i,x,R,l),t("./reduce.js")(i,S,l,R,x,V),t("./settle.js")(i,S,V),t("./some.js")(i,S,l),t("./timers.js")(i,x,V),t("./using.js")(i,l,R,A,x,V),t("./any.js")(i),t("./each.js")(i,x),t("./filter.js")(i,x),f.toFastProperties(i),f.toFastProperties(i.prototype),a({a:1}),a({b:2}),a({c:3}),a(1),a(function(){}),a(void 0),a(!1),a(new i(x)),V.setBounds(C.firstLineError,f.lastLineError),i}},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36,async_hooks:void 0}],23:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){function s(t){switch(t){case-2:return[];case-3:return{};case-6:return new Map}}function a(t){var r=this._promise=new e(n);t instanceof e&&(r._propagateFrom(t,3),t.suppressUnhandledRejections()),r._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var c=t("./util");c.isArray;return c.inherits(a,o),a.prototype.length=function(){return this._length},a.prototype.promise=function(){return this._promise},a.prototype._init=function u(t,n){var o=r(this._values,this._promise);if(o instanceof e){o=o._target();var a=o._bitField;if(this._values=o,0===(50397184&a))return this._promise._setAsyncGuaranteed(),o._then(u,this._reject,void 0,this,n);if(0===(33554432&a))return 0!==(16777216&a)?this._reject(o._reason()):this._cancel();o=o._value()}if(o=c.asArray(o),null===o){var l=i("expecting an array or an iterable object but got "+c.classString(o)).reason();return void this._promise._rejectCallback(l,!1)}return 0===o.length?void(-5===n?this._resolveEmptyArray():this._resolve(s(n))):void this._iterate(o)},a.prototype._iterate=function(t){var n=this.getActualLength(t.length);this._length=n,this._values=this.shouldCopyValues()?new Array(n):this._values;for(var i=this._promise,o=!1,s=null,a=0;n>a;++a){var c=r(t[a],i);c instanceof e?(c=c._target(),s=c._bitField):s=null,o?null!==s&&c.suppressUnhandledRejections():null!==s?0===(50397184&s)?(c._proxy(this,a),this._values[a]=c):o=0!==(33554432&s)?this._promiseFulfilled(c._value(),a):0!==(16777216&s)?this._promiseRejected(c._reason(),a):this._promiseCancelled(a):o=this._promiseFulfilled(c,a)}o||i._setAsyncGuaranteed()},a.prototype._isResolved=function(){return null===this._values},a.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},a.prototype._cancel=function(){!this._isResolved()&&this._promise._isCancellable()&&(this._values=null,this._promise._cancel())},a.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1)},a.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},a.prototype._promiseCancelled=function(){return this._cancel(),!0},a.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},a.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var n=0;n<t.length;++n)t[n]instanceof e&&t[n].cancel()}},a.prototype.shouldCopyValues=function(){return!0},a.prototype.getActualLength=function(t){return t},a}},{"./util":36}],24:[function(t,e,n){"use strict";e.exports=function(e,n){function r(t){return!C.test(t)}function i(t){try{return t.__isPromisified__===!0}catch(e){return!1}}function o(t,e,n){var r=h.getDataPropertyOrDefault(t,e+n,b);return r?i(r):!1}function s(t,e,n){for(var r=0;r<t.length;r+=2){var i=t[r];if(n.test(i))for(var o=i.replace(n,""),s=0;s<t.length;s+=2)if(t[s]===o)throw new g("Cannot promisify an API that has normal methods with '%s'-suffix\n\n    See http://goo.gl/MqrFmX\n".replace("%s",e))}}function a(t,e,n,r){for(var a=h.inheritedDataKeys(t),c=[],u=0;u<a.length;++u){var l=a[u],p=t[l],f=r===j?!0:j(l,p,t);"function"!=typeof p||i(p)||o(t,l,e)||!r(l,p,t,f)||c.push(l,p)}return s(c,e,n),c}function c(t,r,i,o,s,a){function c(){var i=r;r===f&&(i=this);var o=new e(n);o._captureStackTrace();var s="string"==typeof l&&this!==u?this[l]:t,c=_(o,a);try{s.apply(i,d(arguments,c))}catch(p){o._rejectCallback(v(p),!0,!0)}return o._isFateSealed()||o._setAsyncGuaranteed(),o}var u=function(){return this}(),l=t;return"string"==typeof l&&(t=o),h.notEnumerableProp(c,"__isPromisified__",!0),c}function u(t,e,n,r,i){for(var o=new RegExp(k(e)+"$"),s=a(t,e,o,n),c=0,u=s.length;u>c;c+=2){var l=s[c],p=s[c+1],_=l+e;if(r===E)t[_]=E(l,f,l,p,e,i);else{var d=r(p,function(){return E(l,f,l,p,e,i)});h.notEnumerableProp(d,"__isPromisified__",!0),t[_]=d}}return h.toFastProperties(t),t}function l(t,e,n){return E(t,e,void 0,t,null,n)}var p,f={},h=t("./util"),_=t("./nodeback"),d=h.withAppended,v=h.maybeWrapAsError,y=h.canEvaluate,g=t("./errors").TypeError,m="Async",b={__isPromisified__:!0},w=["arity","length","name","arguments","caller","callee","prototype","__isPromisified__"],C=new RegExp("^(?:"+w.join("|")+")$"),j=function(t){return h.isIdentifier(t)&&"_"!==t.charAt(0)&&"constructor"!==t},k=function(t){return t.replace(/([$])/,"\\$")},E=y?p:c;e.promisify=function(t,e){if("function"!=typeof t)throw new g("expecting a function but got "+h.classString(t));if(i(t))return t;e=Object(e);var n=void 0===e.context?f:e.context,o=!!e.multiArgs,s=l(t,n,o);return h.copyDescriptors(t,s,r),s},e.promisifyAll=function(t,e){if("function"!=typeof t&&"object"!=typeof t)throw new g("the target of promisifyAll must be an object or a function\n\n    See http://goo.gl/MqrFmX\n");e=Object(e);var n=!!e.multiArgs,r=e.suffix;"string"!=typeof r&&(r=m);var i=e.filter;"function"!=typeof i&&(i=j);var o=e.promisifier;if("function"!=typeof o&&(o=E),!h.isIdentifier(r))throw new RangeError("suffix must be a valid identifier\n\n    See http://goo.gl/MqrFmX\n");for(var s=h.inheritedDataKeys(t),a=0;a<s.length;++a){var c=t[s[a]];"constructor"!==s[a]&&h.isClass(c)&&(u(c.prototype,r,i,o,n),u(c,r,i,o,n))}return u(t,r,i,o,n)}}},{"./errors":12,"./nodeback":20,"./util":36}],25:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){function o(t){var e,n=!1;if(void 0!==a&&t instanceof a)e=p(t),n=!0;else{var r=l.keys(t),i=r.length;e=new Array(2*i);for(var o=0;i>o;++o){var s=r[o];e[o]=t[s],e[o+i]=s}}this.constructor$(e),this._isMap=n,this._init$(void 0,n?-6:-3)}function s(t){var n,s=r(t);return u(s)?(n=s instanceof e?s._then(e.props,void 0,void 0,void 0,void 0):new o(s).promise(),s instanceof e&&n._propagateFrom(s,2),n):i("cannot await properties of a non-object\n\n    See http://goo.gl/MqrFmX\n")}var a,c=t("./util"),u=c.isObject,l=t("./es5");"function"==typeof Map&&(a=Map);var p=function(){function t(t,r){this[e]=t,this[e+n]=r,e++}var e=0,n=0;return function(r){n=r.size,e=0;var i=new Array(2*r.size);return r.forEach(t,i),i}}(),f=function(t){for(var e=new a,n=t.length/2|0,r=0;n>r;++r){var i=t[n+r],o=t[r];e.set(i,o)}return e};c.inherits(o,n),o.prototype._init=function(){},o.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;if(n>=this._length){var r;if(this._isMap)r=f(this._values);else{r={};for(var i=this.length(),o=0,s=this.length();s>o;++o)r[this._values[o+i]]=this._values[o]}return this._resolve(r),!0}return!1},o.prototype.shouldCopyValues=function(){return!1},o.prototype.getActualLength=function(t){return t>>1},e.prototype.props=function(){return s(this)},e.props=function(t){return s(t)}}},{"./es5":13,"./util":36}],26:[function(t,e,n){"use strict";function r(t,e,n,r,i){for(var o=0;i>o;++o)n[o+r]=t[o+e],t[o+e]=void 0}function i(t){this._capacity=t,this._length=0,this._front=0}i.prototype._willBeOverCapacity=function(t){return this._capacity<t},i.prototype._pushOne=function(t){var e=this.length();this._checkCapacity(e+1);var n=this._front+e&this._capacity-1;this[n]=t,this._length=e+1},i.prototype.push=function(t,e,n){var r=this.length()+3;if(this._willBeOverCapacity(r))return this._pushOne(t),this._pushOne(e),void this._pushOne(n);var i=this._front+r-3;this._checkCapacity(r);var o=this._capacity-1;this[i+0&o]=t,this[i+1&o]=e,this[i+2&o]=n,this._length=r},i.prototype.shift=function(){var t=this._front,e=this[t];return this[t]=void 0,this._front=t+1&this._capacity-1,this._length--,e},i.prototype.length=function(){return this._length},i.prototype._checkCapacity=function(t){this._capacity<t&&this._resizeTo(this._capacity<<1)},i.prototype._resizeTo=function(t){var e=this._capacity;this._capacity=t;var n=this._front,i=this._length,o=n+i&e-1;r(this,0,this,e,o)},e.exports=i},{}],27:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){function o(t,o){var c=r(t);if(c instanceof e)return a(c);if(t=s.asArray(t),null===t)return i("expecting an array or an iterable object but got "+s.classString(t));var u=new e(n);void 0!==o&&u._propagateFrom(o,3);for(var l=u._fulfill,p=u._reject,f=0,h=t.length;h>f;++f){var _=t[f];(void 0!==_||f in t)&&e.cast(_)._then(l,p,void 0,u,null)}return u}var s=t("./util"),a=function(t){return t.then(function(e){return o(e,t)})};e.race=function(t){return o(t,void 0)},e.prototype.race=function(){return o(this,void 0)}}},{"./util":36}],28:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r,i){this.constructor$(t);var s=e._getContext();this._fn=f.contextBind(s,n),void 0!==r&&(r=e.resolve(r),r._attachCancellationCallback(this)),this._initialValue=r,this._currentCancellable=null,i===o?this._eachValues=Array(this._length):0===i?this._eachValues=null:this._eachValues=void 0,this._promise._captureStackTrace(),this._init$(void 0,-5)}function c(t,e){this.isFulfilled()?e._resolve(t):e._reject(t)}function u(t,e,n,i){if("function"!=typeof e)return r("expecting a function but got "+f.classString(e));var o=new a(t,e,n,i);return o.promise()}function l(t){this.accum=t,this.array._gotAccum(t);var n=i(this.value,this.array._promise);return n instanceof e?(this.array._currentCancellable=n,n._then(p,void 0,void 0,this,void 0)):p.call(this,n)}function p(t){var n=this.array,r=n._promise,i=h(n._fn);r._pushContext();var o;o=void 0!==n._eachValues?i.call(r._boundValue(),t,this.index,this.length):i.call(r._boundValue(),this.accum,t,this.index,this.length),o instanceof e&&(n._currentCancellable=o);var a=r._popContext();return s.checkForgottenReturns(o,a,void 0!==n._eachValues?"Promise.each":"Promise.reduce",r),o}var f=t("./util"),h=f.tryCatch;f.inherits(a,n),a.prototype._gotAccum=function(t){void 0!==this._eachValues&&null!==this._eachValues&&t!==o&&this._eachValues.push(t)},a.prototype._eachComplete=function(t){return null!==this._eachValues&&this._eachValues.push(t),this._eachValues},a.prototype._init=function(){},a.prototype._resolveEmptyArray=function(){this._resolve(void 0!==this._eachValues?this._eachValues:this._initialValue)},a.prototype.shouldCopyValues=function(){return!1},a.prototype._resolve=function(t){this._promise._resolveCallback(t),this._values=null},a.prototype._resultCancelled=function(t){return t===this._initialValue?this._cancel():void(this._isResolved()||(this._resultCancelled$(),this._currentCancellable instanceof e&&this._currentCancellable.cancel(),this._initialValue instanceof e&&this._initialValue.cancel()))},a.prototype._iterate=function(t){this._values=t;var n,r,i=t.length;void 0!==this._initialValue?(n=this._initialValue,r=0):(n=e.resolve(t[0]),r=1),this._currentCancellable=n;for(var o=r;i>o;++o){var s=t[o];s instanceof e&&s.suppressUnhandledRejections()}if(!n.isRejected())for(;i>r;++r){var a={accum:null,value:t[r],index:r,length:i,array:this};n=n._then(l,void 0,void 0,a,void 0),0===(127&r)&&n._setNoAsyncGuarantee()}void 0!==this._eachValues&&(n=n._then(this._eachComplete,void 0,void 0,this,void 0)),n._then(c,c,void 0,n,this)},e.prototype.reduce=function(t,e){return u(this,t,e,null)},e.reduce=function(t,e,n,r){return u(t,e,n,r)}}},{"./util":36}],29:[function(t,e,n){"use strict";var r,i=t("./util"),o=function(){throw new Error("No async scheduler available\n\n    See http://goo.gl/MqrFmX\n")},s=i.getNativePromise();if(i.isNode&&"undefined"==typeof MutationObserver){var a=global.setImmediate,c=process.nextTick;r=i.isRecentNode?function(t){a.call(global,t)}:function(t){c.call(process,t)}}else if("function"==typeof s&&"function"==typeof s.resolve){
var u=s.resolve();r=function(t){u.then(t)}}else r="undefined"!=typeof MutationObserver&&("undefined"==typeof window||!window.navigator||!window.navigator.standalone&&!window.cordova)&&"classList"in document.documentElement?function(){var t=document.createElement("div"),e={attributes:!0},n=!1,r=document.createElement("div"),i=new MutationObserver(function(){t.classList.toggle("foo"),n=!1});i.observe(r,e);var o=function(){n||(n=!0,r.classList.toggle("foo"))};return function(n){var r=new MutationObserver(function(){r.disconnect(),n()});r.observe(t,e),o()}}():"undefined"!=typeof setImmediate?function(t){setImmediate(t)}:"undefined"!=typeof setTimeout?function(t){setTimeout(t,0)}:o;e.exports=r},{"./util":36}],30:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.constructor$(t)}var o=e.PromiseInspection,s=t("./util");s.inherits(i,n),i.prototype._promiseResolved=function(t,e){this._values[t]=e;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},i.prototype._promiseFulfilled=function(t,e){var n=new o;return n._bitField=33554432,n._settledValueField=t,this._promiseResolved(e,n)},i.prototype._promiseRejected=function(t,e){var n=new o;return n._bitField=16777216,n._settledValueField=t,this._promiseResolved(e,n)},e.settle=function(t){return r.deprecated(".settle()",".reflect()"),new i(t).promise()},e.allSettled=function(t){return new i(t).promise()},e.prototype.settle=function(){return e.settle(this)}}},{"./util":36}],31:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.constructor$(t),this._howMany=0,this._unwrap=!1,this._initialized=!1}function o(t,e){if((0|e)!==e||0>e)return r("expecting a positive integer\n\n    See http://goo.gl/MqrFmX\n");var n=new i(t),o=n.promise();return n.setHowMany(e),n.init(),o}var s=t("./util"),a=t("./errors").RangeError,c=t("./errors").AggregateError,u=s.isArray,l={};s.inherits(i,n),i.prototype._init=function(){if(this._initialized){if(0===this._howMany)return void this._resolve([]);this._init$(void 0,-5);var t=u(this._values);!this._isResolved()&&t&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}},i.prototype.init=function(){this._initialized=!0,this._init()},i.prototype.setUnwrap=function(){this._unwrap=!0},i.prototype.howMany=function(){return this._howMany},i.prototype.setHowMany=function(t){this._howMany=t},i.prototype._promiseFulfilled=function(t){return this._addFulfilled(t),this._fulfilled()===this.howMany()?(this._values.length=this.howMany(),1===this.howMany()&&this._unwrap?this._resolve(this._values[0]):this._resolve(this._values),!0):!1},i.prototype._promiseRejected=function(t){return this._addRejected(t),this._checkOutcome()},i.prototype._promiseCancelled=function(){return this._values instanceof e||null==this._values?this._cancel():(this._addRejected(l),this._checkOutcome())},i.prototype._checkOutcome=function(){if(this.howMany()>this._canPossiblyFulfill()){for(var t=new c,e=this.length();e<this._values.length;++e)this._values[e]!==l&&t.push(this._values[e]);return t.length>0?this._reject(t):this._cancel(),!0}return!1},i.prototype._fulfilled=function(){return this._totalResolved},i.prototype._rejected=function(){return this._values.length-this.length()},i.prototype._addRejected=function(t){this._values.push(t)},i.prototype._addFulfilled=function(t){this._values[this._totalResolved++]=t},i.prototype._canPossiblyFulfill=function(){return this.length()-this._rejected()},i.prototype._getRangeError=function(t){var e="Input array must contain at least "+this._howMany+" items but contains only "+t+" items";return new a(e)},i.prototype._resolveEmptyArray=function(){this._reject(this._getRangeError(0))},e.some=function(t,e){return o(t,e)},e.prototype.some=function(t){return o(this,t)},e._SomePromiseArray=i}},{"./errors":12,"./util":36}],32:[function(t,e,n){"use strict";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValueField=t._isFateSealed()?t._settledValue():void 0):(this._bitField=0,this._settledValueField=void 0)}e.prototype._settledValue=function(){return this._settledValueField};var n=e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n    See http://goo.gl/MqrFmX\n");return this._settledValue()},r=e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n    See http://goo.gl/MqrFmX\n");return this._settledValue()},i=e.prototype.isFulfilled=function(){return 0!==(33554432&this._bitField)},o=e.prototype.isRejected=function(){return 0!==(16777216&this._bitField)},s=e.prototype.isPending=function(){return 0===(50397184&this._bitField)},a=e.prototype.isResolved=function(){return 0!==(50331648&this._bitField)};e.prototype.isCancelled=function(){return 0!==(8454144&this._bitField)},t.prototype.__isCancelled=function(){return 65536===(65536&this._bitField)},t.prototype._isCancelled=function(){return this._target().__isCancelled()},t.prototype.isCancelled=function(){return 0!==(8454144&this._target()._bitField)},t.prototype.isPending=function(){return s.call(this._target())},t.prototype.isRejected=function(){return o.call(this._target())},t.prototype.isFulfilled=function(){return i.call(this._target())},t.prototype.isResolved=function(){return a.call(this._target())},t.prototype.value=function(){return n.call(this._target())},t.prototype.reason=function(){var t=this._target();return t._unsetRejectionIsUnhandled(),r.call(t)},t.prototype._value=function(){return this._settledValue()},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue()},t.PromiseInspection=e}},{}],33:[function(t,e,n){"use strict";e.exports=function(e,n){function r(t,r){if(l(t)){if(t instanceof e)return t;var i=o(t);if(i===u){r&&r._pushContext();var c=e.reject(i.e);return r&&r._popContext(),c}if("function"==typeof i){if(s(t)){var c=new e(n);return t._then(c._fulfill,c._reject,void 0,c,null),c}return a(t,i,r)}}return t}function i(t){return t.then}function o(t){try{return i(t)}catch(e){return u.e=e,u}}function s(t){try{return p.call(t,"_promise0")}catch(e){return!1}}function a(t,r,i){function o(t){a&&(a._resolveCallback(t),a=null)}function s(t){a&&(a._rejectCallback(t,p,!0),a=null)}var a=new e(n),l=a;i&&i._pushContext(),a._captureStackTrace(),i&&i._popContext();var p=!0,f=c.tryCatch(r).call(t,o,s);return p=!1,a&&f===u&&(a._rejectCallback(f.e,!0,!0),a=null),l}var c=t("./util"),u=c.errorObj,l=c.isObject,p={}.hasOwnProperty;return r}},{"./util":36}],34:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.handle=t}function o(t){return clearTimeout(this.handle),t}function s(t){throw clearTimeout(this.handle),t}var a=t("./util"),c=e.TimeoutError;i.prototype._resultCancelled=function(){clearTimeout(this.handle)};var u=function(t){return l(+this).thenReturn(t)},l=e.delay=function(t,o){var s,a;return void 0!==o?(s=e.resolve(o)._then(u,null,null,t,void 0),r.cancellation()&&o instanceof e&&s._setOnCancel(o)):(s=new e(n),a=setTimeout(function(){s._fulfill()},+t),r.cancellation()&&s._setOnCancel(new i(a)),s._captureStackTrace()),s._setAsyncGuaranteed(),s};e.prototype.delay=function(t){return l(t,this)};var p=function(t,e,n){var r;r="string"!=typeof e?e instanceof Error?e:new c("operation timed out"):new c(e),a.markAsOriginatingFromRejection(r),t._attachExtraTrace(r),t._reject(r),null!=n&&n.cancel()};e.prototype.timeout=function(t,e){t=+t;var n,a,c=new i(setTimeout(function(){n.isPending()&&p(n,e,a)},t));return r.cancellation()?(a=this.then(),n=a._then(o,s,void 0,c,void 0),n._setOnCancel(c)):n=this._then(o,s,void 0,c,void 0),n}}},{"./util":36}],35:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t){setTimeout(function(){throw t},0)}function c(t){var e=r(t);return e!==t&&"function"==typeof t._isDisposable&&"function"==typeof t._getDisposer&&t._isDisposable()&&e._setDisposable(t._getDisposer()),e}function u(t,n){function i(){if(s>=u)return l._fulfill();var o=c(t[s++]);if(o instanceof e&&o._isDisposable()){try{o=r(o._getDisposer().tryDispose(n),t.promise)}catch(p){return a(p)}if(o instanceof e)return o._then(i,a,null,null,null)}i()}var s=0,u=t.length,l=new e(o);return i(),l}function l(t,e,n){this._data=t,this._promise=e,this._context=n}function p(t,e,n){this.constructor$(t,e,n)}function f(t){return l.isDisposer(t)?(this.resources[this.index]._setDisposable(t),t.promise()):t}function h(t){this.length=t,this.promise=null,this[t-1]=null}var _=t("./util"),d=t("./errors").TypeError,v=t("./util").inherits,y=_.errorObj,g=_.tryCatch,m={};l.prototype.data=function(){return this._data},l.prototype.promise=function(){return this._promise},l.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():m},l.prototype.tryDispose=function(t){var e=this.resource(),n=this._context;void 0!==n&&n._pushContext();var r=e!==m?this.doDispose(e,t):null;return void 0!==n&&n._popContext(),this._promise._unsetDisposable(),this._data=null,r},l.isDisposer=function(t){return null!=t&&"function"==typeof t.resource&&"function"==typeof t.tryDispose},v(p,l),p.prototype.doDispose=function(t,e){var n=this.data();return n.call(t,t,e)},h.prototype._resultCancelled=function(){for(var t=this.length,n=0;t>n;++n){var r=this[n];r instanceof e&&r.cancel()}},e.using=function(){var t=arguments.length;if(2>t)return n("you must pass at least 2 arguments to Promise.using");var i=arguments[t-1];if("function"!=typeof i)return n("expecting a function but got "+_.classString(i));var o,a=!0;2===t&&Array.isArray(arguments[0])?(o=arguments[0],t=o.length,a=!1):(o=arguments,t--);for(var c=new h(t),p=0;t>p;++p){var d=o[p];if(l.isDisposer(d)){var v=d;d=d.promise(),d._setDisposable(v)}else{var m=r(d);m instanceof e&&(d=m._then(f,null,null,{resources:c,index:p},void 0))}c[p]=d}for(var b=new Array(c.length),p=0;p<b.length;++p)b[p]=e.resolve(c[p]).reflect();var w=e.all(b).then(function(t){for(var e=0;e<t.length;++e){var n=t[e];if(n.isRejected())return y.e=n.error(),y;if(!n.isFulfilled())return void w.cancel();t[e]=n.value()}C._pushContext(),i=g(i);var r=a?i.apply(void 0,t):i(t),o=C._popContext();return s.checkForgottenReturns(r,o,"Promise.using",C),r}),C=w.lastly(function(){var t=new e.PromiseInspection(w);return u(c,t)});return c.promise=C,C._setOnCancel(c),C},e.prototype._setDisposable=function(t){this._bitField=131072|this._bitField,this._disposer=t},e.prototype._isDisposable=function(){return(131072&this._bitField)>0},e.prototype._getDisposer=function(){return this._disposer},e.prototype._unsetDisposable=function(){this._bitField=-131073&this._bitField,this._disposer=void 0},e.prototype.disposer=function(t){if("function"==typeof t)return new p(t,this,i());throw new d}}},{"./errors":12,"./util":36}],36:[function(t,e,n){"use strict";function r(){try{var t=P;return P=null,t.apply(this,arguments)}catch(e){return T.e=e,T}}function i(t){return P=t,r}function o(t){return null==t||t===!0||t===!1||"string"==typeof t||"number"==typeof t}function s(t){return"function"==typeof t||"object"==typeof t&&null!==t}function a(t){return o(t)?new Error(v(t)):t}function c(t,e){var n,r=t.length,i=new Array(r+1);for(n=0;r>n;++n)i[n]=t[n];return i[n]=e,i}function u(t,e,n){if(!F.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var r=Object.getOwnPropertyDescriptor(t,e);return null!=r?null==r.get&&null==r.set?r.value:n:void 0}function l(t,e,n){if(o(t))return t;var r={value:n,configurable:!0,enumerable:!1,writable:!0};return F.defineProperty(t,e,r),t}function p(t){throw t}function f(t){try{if("function"==typeof t){var e=F.names(t.prototype),n=F.isES5&&e.length>1,r=e.length>0&&!(1===e.length&&"constructor"===e[0]),i=A.test(t+"")&&F.names(t).length>0;if(n||r||i)return!0}return!1}catch(o){return!1}}function h(t){function e(){}function n(){return typeof r.foo}e.prototype=t;var r=new e;return n(),n(),t}function _(t){return V.test(t)}function d(t,e,n){for(var r=new Array(t),i=0;t>i;++i)r[i]=e+i+n;return r}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){return t instanceof Error||null!==t&&"object"==typeof t&&"string"==typeof t.message&&"string"==typeof t.name}function g(t){try{l(t,"isOperational",!0)}catch(e){}}function m(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function b(t){return y(t)&&F.propertyIsWritable(t,"stack")}function w(t){return{}.toString.call(t)}function C(t,e,n){for(var r=F.names(t),i=0;i<r.length;++i){var o=r[i];if(n(o))try{F.defineProperty(e,o,F.getDescriptor(t,o))}catch(s){}}}function j(t){return N?process.env[t]:void 0}function k(){if("function"==typeof Promise)try{var t=new Promise(function(){});if("[object Promise]"===w(t))return Promise}catch(e){}}function E(t,e){if(null===t||"function"!=typeof e||e===U)return e;null!==t.domain&&(e=t.domain.bind(e));var n=t.async;if(null!==n){var r=e;e=function(){var t=new Array(2).concat([].slice.call(arguments));return t[0]=r,t[1]=this,n.runInAsyncScope.apply(n,t)}}return e}var F=t("./es5"),x="undefined"==typeof navigator,T={e:{}},P,R="undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0!==this?this:null,S=function(t,e){function n(){this.constructor=t,this.constructor$=e;for(var n in e.prototype)r.call(e.prototype,n)&&"$"!==n.charAt(n.length-1)&&(this[n+"$"]=e.prototype[n])}var r={}.hasOwnProperty;return n.prototype=e.prototype,t.prototype=new n,t.prototype},O=function(){var t=[Array.prototype,Object.prototype,Function.prototype],e=function(e){for(var n=0;n<t.length;++n)if(t[n]===e)return!0;return!1};if(F.isES5){var n=Object.getOwnPropertyNames;return function(t){for(var r=[],i=Object.create(null);null!=t&&!e(t);){var o;try{o=n(t)}catch(s){return r}for(var a=0;a<o.length;++a){var c=o[a];if(!i[c]){i[c]=!0;var u=Object.getOwnPropertyDescriptor(t,c);null!=u&&null==u.get&&null==u.set&&r.push(c)}}t=F.getPrototypeOf(t)}return r}}var r={}.hasOwnProperty;return function(n){if(e(n))return[];var i=[];t:for(var o in n)if(r.call(n,o))i.push(o);else{for(var s=0;s<t.length;++s)if(r.call(t[s],o))continue t;i.push(o)}return i}}(),A=/this\s*\.\s*\S+\s*=/,V=/^[a-z$_][a-z$_0-9]*$/i,H=function(){return"stack"in new Error?function(t){return b(t)?t:new Error(v(t))}:function(t){if(b(t))return t;try{throw new Error(v(t))}catch(e){return e}}}(),D=function(t){return F.isArray(t)?t:null};if("undefined"!=typeof Symbol&&Symbol.iterator){var I="function"==typeof Array.from?function(t){return Array.from(t)}:function(t){for(var e,n=[],r=t[Symbol.iterator]();!(e=r.next()).done;)n.push(e.value);return n};D=function(t){return F.isArray(t)?t:null!=t&&"function"==typeof t[Symbol.iterator]?I(t):null}}var L="undefined"!=typeof process&&"[object process]"===w(process).toLowerCase(),N="undefined"!=typeof process&&"undefined"!=typeof process.env,U,B={setReflectHandler:function(t){U=t},isClass:f,isIdentifier:_,inheritedDataKeys:O,getDataPropertyOrDefault:u,thrower:p,isArray:F.isArray,asArray:D,notEnumerableProp:l,isPrimitive:o,isObject:s,isError:y,canEvaluate:x,errorObj:T,tryCatch:i,inherits:S,withAppended:c,maybeWrapAsError:a,toFastProperties:h,filledRange:d,toString:v,canAttachTrace:b,ensureErrorObject:H,originatesFromRejection:m,markAsOriginatingFromRejection:g,classString:w,copyDescriptors:C,isNode:L,hasEnvVariables:N,env:j,global:R,getNativePromise:k,contextBind:E};B.isRecentNode=B.isNode&&function(){var t;return process.versions&&process.versions.node?t=process.versions.node.split(".").map(Number):process.version&&(t=process.version.split(".").map(Number)),0===t[0]&&t[1]>10||t[0]>0}(),B.nodeSupportsAsyncResource=B.isNode&&function(){var e=!1;try{var n=t("async_hooks").AsyncResource;e="function"==typeof n.prototype.runInAsyncScope}catch(r){e=!1}return e}(),B.isNode&&B.toFastProperties(process);try{throw new Error}catch(M){B.lastLineError=M}e.exports=B},{"./es5":13,async_hooks:void 0}]},{},[4])(4)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise);const BluebirdPromise = require("bluebird/js/release/promise")()
BluebirdPromise.config({
  longStackTraces: true,
})
BluebirdPromise.default = BluebirdPromise
module.exports = BluebirdPromise{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "bluebird": "^3.5.5"
  },
  "deprecated": false,
  "description": "Bluebird â€” longStackTraces: true, cancellation: true",
  "files": [
    "index.*"
  ],
  "homepage": "https://github.com/develar/fs-extra-p",
  "license": "MIT",
  "name": "bluebird-lst",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/develar/fs-extra-p.git"
  },
  "typings": "./index.d.ts",
  "version": "1.0.9"
}'use strict';

// adapted from http://code.google.com/p/plist/source/browse/trunk/src/com/dd/plist/BinaryPropertyListParser.java

var fs = require('fs');
var bigInt = require("big-integer");
var debug = false;

exports.maxObjectSize = 100 * 1000 * 1000; // 100Meg
exports.maxObjectCount = 32768;

// EPOCH = new SimpleDateFormat("yyyy MM dd zzz").parse("2001 01 01 GMT").getTime();
// ...but that's annoying in a static initializer because it can throw exceptions, ick.
// So we just hardcode the correct value.
var EPOCH = 978307200000;

// UID object definition
var UID = exports.UID = function(id) {
  this.UID = id;
}

var parseFile = exports.parseFile = function (fileNameOrBuffer, callback) {
  function tryParseBuffer(buffer) {
    var err = null;
    var result;
    try {
      result = parseBuffer(buffer);
    } catch (ex) {
      err = ex;
    }
    callback(err, result);
  }

  if (Buffer.isBuffer(fileNameOrBuffer)) {
    return tryParseBuffer(fileNameOrBuffer);
  } else {
    fs.readFile(fileNameOrBuffer, function (err, data) {
      if (err) { return callback(err); }
      tryParseBuffer(data);
    });
  }
};

var parseBuffer = exports.parseBuffer = function (buffer) {
  var result = {};

  // check header
  var header = buffer.slice(0, 'bplist'.length).toString('utf8');
  if (header !== 'bplist') {
    throw new Error("Invalid binary plist. Expected 'bplist' at offset 0.");
  }

  // Handle trailer, last 32 bytes of the file
  var trailer = buffer.slice(buffer.length - 32, buffer.length);
  // 6 null bytes (index 0 to 5)
  var offsetSize = trailer.readUInt8(6);
  if (debug) {
    console.log("offsetSize: " + offsetSize);
  }
  var objectRefSize = trailer.readUInt8(7);
  if (debug) {
    console.log("objectRefSize: " + objectRefSize);
  }
  var numObjects = readUInt64BE(trailer, 8);
  if (debug) {
    console.log("numObjects: " + numObjects);
  }
  var topObject = readUInt64BE(trailer, 16);
  if (debug) {
    console.log("topObject: " + topObject);
  }
  var offsetTableOffset = readUInt64BE(trailer, 24);
  if (debug) {
    console.log("offsetTableOffset: " + offsetTableOffset);
  }

  if (numObjects > exports.maxObjectCount) {
    throw new Error("maxObjectCount exceeded");
  }

  // Handle offset table
  var offsetTable = [];

  for (var i = 0; i < numObjects; i++) {
    var offsetBytes = buffer.slice(offsetTableOffset + i * offsetSize, offsetTableOffset + (i + 1) * offsetSize);
    offsetTable[i] = readUInt(offsetBytes, 0);
    if (debug) {
      console.log("Offset for Object #" + i + " is " + offsetTable[i] + " [" + offsetTable[i].toString(16) + "]");
    }
  }

  // Parses an object inside the currently parsed binary property list.
  // For the format specification check
  // <a href="http://www.opensource.apple.com/source/CF/CF-635/CFBinaryPList.c">
  // Apple's binary property list parser implementation</a>.
  function parseObject(tableOffset) {
    var offset = offsetTable[tableOffset];
    var type = buffer[offset];
    var objType = (type & 0xF0) >> 4; //First  4 bits
    var objInfo = (type & 0x0F);      //Second 4 bits
    switch (objType) {
    case 0x0:
      return parseSimple();
    case 0x1:
      return parseInteger();
    case 0x8:
      return parseUID();
    case 0x2:
      return parseReal();
    case 0x3:
      return parseDate();
    case 0x4:
      return parseData();
    case 0x5: // ASCII
      return parsePlistString();
    case 0x6: // UTF-16
      return parsePlistString(true);
    case 0xA:
      return parseArray();
    case 0xD:
      return parseDictionary();
    default:
      throw new Error("Unhandled type 0x" + objType.toString(16));
    }

    function parseSimple() {
      //Simple
      switch (objInfo) {
      case 0x0: // null
        return null;
      case 0x8: // false
        return false;
      case 0x9: // true
        return true;
      case 0xF: // filler byte
        return null;
      default:
        throw new Error("Unhandled simple type 0x" + objType.toString(16));
      }
    }

    function bufferToHexString(buffer) {
      var str = '';
      var i;
      for (i = 0; i < buffer.length; i++) {
        if (buffer[i] != 0x00) {
          break;
        }
      }
      for (; i < buffer.length; i++) {
        var part = '00' + buffer[i].toString(16);
        str += part.substr(part.length - 2);
      }
      return str;
    }

    function parseInteger() {
      var length = Math.pow(2, objInfo);
      if (length > 4) {
        var data = buffer.slice(offset + 1, offset + 1 + length);
        var str = bufferToHexString(data);
        return bigInt(str, 16);
      } if (length < exports.maxObjectSize) {
        return readUInt(buffer.slice(offset + 1, offset + 1 + length));
      } else {
        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
      }
    }

    function parseUID() {
      var length = objInfo + 1;
      if (length < exports.maxObjectSize) {
        return new UID(readUInt(buffer.slice(offset + 1, offset + 1 + length)));
      } else {
        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
      }
    }

    function parseReal() {
      var length = Math.pow(2, objInfo);
      if (length < exports.maxObjectSize) {
        var realBuffer = buffer.slice(offset + 1, offset + 1 + length);
        if (length === 4) {
          return realBuffer.readFloatBE(0);
        }
        else if (length === 8) {
          return realBuffer.readDoubleBE(0);
        }
      } else {
        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
      }
    }

    function parseDate() {
      if (objInfo != 0x3) {
        console.error("Unknown date type :" + objInfo + ". Parsing anyway...");
      }
      var dateBuffer = buffer.slice(offset + 1, offset + 9);
      return new Date(EPOCH + (1000 * dateBuffer.readDoubleBE(0)));
    }

    function parseData() {
      var dataoffset = 1;
      var length = objInfo;
      if (objInfo == 0xF) {
        var int_type = buffer[offset + 1];
        var intType = (int_type & 0xF0) / 0x10;
        if (intType != 0x1) {
          console.error("0x4: UNEXPECTED LENGTH-INT TYPE! " + intType);
        }
        var intInfo = int_type & 0x0F;
        var intLength = Math.pow(2, intInfo);
        dataoffset = 2 + intLength;
        if (intLength < 3) {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        } else {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        }
      }
      if (length < exports.maxObjectSize) {
        return buffer.slice(offset + dataoffset, offset + dataoffset + length);
      } else {
        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
      }
    }

    function parsePlistString (isUtf16) {
      isUtf16 = isUtf16 || 0;
      var enc = "utf8";
      var length = objInfo;
      var stroffset = 1;
      if (objInfo == 0xF) {
        var int_type = buffer[offset + 1];
        var intType = (int_type & 0xF0) / 0x10;
        if (intType != 0x1) {
          console.err("UNEXPECTED LENGTH-INT TYPE! " + intType);
        }
        var intInfo = int_type & 0x0F;
        var intLength = Math.pow(2, intInfo);
        var stroffset = 2 + intLength;
        if (intLength < 3) {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        } else {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        }
      }
      // length is String length -> to get byte length multiply by 2, as 1 character takes 2 bytes in UTF-16
      length *= (isUtf16 + 1);
      if (length < exports.maxObjectSize) {
        var plistString = new Buffer(buffer.slice(offset + stroffset, offset + stroffset + length));
        if (isUtf16) {
          plistString = swapBytes(plistString);
          enc = "ucs2";
        }
        return plistString.toString(enc);
      } else {
        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
      }
    }

    function parseArray() {
      var length = objInfo;
      var arrayoffset = 1;
      if (objInfo == 0xF) {
        var int_type = buffer[offset + 1];
        var intType = (int_type & 0xF0) / 0x10;
        if (intType != 0x1) {
          console.error("0xa: UNEXPECTED LENGTH-INT TYPE! " + intType);
        }
        var intInfo = int_type & 0x0F;
        var intLength = Math.pow(2, intInfo);
        arrayoffset = 2 + intLength;
        if (intLength < 3) {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        } else {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        }
      }
      if (length * objectRefSize > exports.maxObjectSize) {
        throw new Error("To little heap space available!");
      }
      var array = [];
      for (var i = 0; i < length; i++) {
        var objRef = readUInt(buffer.slice(offset + arrayoffset + i * objectRefSize, offset + arrayoffset + (i + 1) * objectRefSize));
        array[i] = parseObject(objRef);
      }
      return array;
    }

    function parseDictionary() {
      var length = objInfo;
      var dictoffset = 1;
      if (objInfo == 0xF) {
        var int_type = buffer[offset + 1];
        var intType = (int_type & 0xF0) / 0x10;
        if (intType != 0x1) {
          console.error("0xD: UNEXPECTED LENGTH-INT TYPE! " + intType);
        }
        var intInfo = int_type & 0x0F;
        var intLength = Math.pow(2, intInfo);
        dictoffset = 2 + intLength;
        if (intLength < 3) {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        } else {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        }
      }
      if (length * 2 * objectRefSize > exports.maxObjectSize) {
        throw new Error("To little heap space available!");
      }
      if (debug) {
        console.log("Parsing dictionary #" + tableOffset);
      }
      var dict = {};
      for (var i = 0; i < length; i++) {
        var keyRef = readUInt(buffer.slice(offset + dictoffset + i * objectRefSize, offset + dictoffset + (i + 1) * objectRefSize));
        var valRef = readUInt(buffer.slice(offset + dictoffset + (length * objectRefSize) + i * objectRefSize, offset + dictoffset + (length * objectRefSize) + (i + 1) * objectRefSize));
        var key = parseObject(keyRef);
        var val = parseObject(valRef);
        if (debug) {
          console.log("  DICT #" + tableOffset + ": Mapped " + key + " to " + val);
        }
        dict[key] = val;
      }
      return dict;
    }
  }

  return [ parseObject(topObject) ];
};

function readUInt(buffer, start) {
  start = start || 0;

  var l = 0;
  for (var i = start; i < buffer.length; i++) {
    l <<= 8;
    l |= buffer[i] & 0xFF;
  }
  return l;
}

// we're just going to toss the high order bits because javascript doesn't have 64-bit ints
function readUInt64BE(buffer, start) {
  var data = buffer.slice(start, start + 8);
  return data.readUInt32BE(4, 8);
}

function swapBytes(buffer) {
  var len = buffer.length;
  for (var i = 0; i < len; i += 2) {
    var a = buffer[i];
    buffer[i] = buffer[i+1];
    buffer[i+1] = a;
  }
  return buffer;
}
{
  "author": {
    "name": "Joe Ferner",
    "email": "joe.ferner@nearinfinity.com"
  },
  "dependencies": {
    "big-integer": "^1.6.7"
  },
  "deprecated": false,
  "description": "Binary plist parser.",
  "devDependencies": {
    "nodeunit": "~0.9.1"
  },
  "homepage": "https://github.com/nearinfinity/node-bplist-parser#readme",
  "license": "MIT",
  "main": "bplistParser.js",
  "name": "bplist-parser",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/nearinfinity/node-bplist-parser.git"
  },
  "version": "0.1.1"
}MIT License

Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var concatMap = require('concat-map');
var balanced = require('balanced-match');

module.exports = expandTop;

var escSlash = '\0SLASH'+Math.random()+'\0';
var escOpen = '\0OPEN'+Math.random()+'\0';
var escClose = '\0CLOSE'+Math.random()+'\0';
var escComma = '\0COMMA'+Math.random()+'\0';
var escPeriod = '\0PERIOD'+Math.random()+'\0';

function numeric(str) {
  return parseInt(str, 10) == str
    ? parseInt(str, 10)
    : str.charCodeAt(0);
}

function escapeBraces(str) {
  return str.split('\\\\').join(escSlash)
            .split('\\{').join(escOpen)
            .split('\\}').join(escClose)
            .split('\\,').join(escComma)
            .split('\\.').join(escPeriod);
}

function unescapeBraces(str) {
  return str.split(escSlash).join('\\')
            .split(escOpen).join('{')
            .split(escClose).join('}')
            .split(escComma).join(',')
            .split(escPeriod).join('.');
}


// Basically just str.split(","), but handling cases
// where we have nested braced sections, which should be
// treated as individual members, like {a,{b,c},d}
function parseCommaParts(str) {
  if (!str)
    return [''];

  var parts = [];
  var m = balanced('{', '}', str);

  if (!m)
    return str.split(',');

  var pre = m.pre;
  var body = m.body;
  var post = m.post;
  var p = pre.split(',');

  p[p.length-1] += '{' + body + '}';
  var postParts = parseCommaParts(post);
  if (post.length) {
    p[p.length-1] += postParts.shift();
    p.push.apply(p, postParts);
  }

  parts.push.apply(parts, p);

  return parts;
}

function expandTop(str) {
  if (!str)
    return [];

  // I don't know why Bash 4.3 does this, but it does.
  // Anything starting with {} will have the first two bytes preserved
  // but *only* at the top level, so {},a}b will not expand to anything,
  // but a{},b}c will be expanded to [a}c,abc].
  // One could argue that this is a bug in Bash, but since the goal of
  // this module is to match Bash's rules, we escape a leading {}
  if (str.substr(0, 2) === '{}') {
    str = '\\{\\}' + str.substr(2);
  }

  return expand(escapeBraces(str), true).map(unescapeBraces);
}

function identity(e) {
  return e;
}

function embrace(str) {
  return '{' + str + '}';
}
function isPadded(el) {
  return /^-?0\d/.test(el);
}

function lte(i, y) {
  return i <= y;
}
function gte(i, y) {
  return i >= y;
}

function expand(str, isTop) {
  var expansions = [];

  var m = balanced('{', '}', str);
  if (!m || /\$$/.test(m.pre)) return [str];

  var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
  var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
  var isSequence = isNumericSequence || isAlphaSequence;
  var isOptions = m.body.indexOf(',') >= 0;
  if (!isSequence && !isOptions) {
    // {a},b}
    if (m.post.match(/,.*\}/)) {
      str = m.pre + '{' + m.body + escClose + m.post;
      return expand(str);
    }
    return [str];
  }

  var n;
  if (isSequence) {
    n = m.body.split(/\.\./);
  } else {
    n = parseCommaParts(m.body);
    if (n.length === 1) {
      // x{{a,b}}y ==> x{a}y x{b}y
      n = expand(n[0], false).map(embrace);
      if (n.length === 1) {
        var post = m.post.length
          ? expand(m.post, false)
          : [''];
        return post.map(function(p) {
          return m.pre + n[0] + p;
        });
      }
    }
  }

  // at this point, n is the parts, and we know it's not a comma set
  // with a single entry.

  // no need to expand pre, since it is guaranteed to be free of brace-sets
  var pre = m.pre;
  var post = m.post.length
    ? expand(m.post, false)
    : [''];

  var N;

  if (isSequence) {
    var x = numeric(n[0]);
    var y = numeric(n[1]);
    var width = Math.max(n[0].length, n[1].length)
    var incr = n.length == 3
      ? Math.abs(numeric(n[2]))
      : 1;
    var test = lte;
    var reverse = y < x;
    if (reverse) {
      incr *= -1;
      test = gte;
    }
    var pad = n.some(isPadded);

    N = [];

    for (var i = x; test(i, y); i += incr) {
      var c;
      if (isAlphaSequence) {
        c = String.fromCharCode(i);
        if (c === '\\')
          c = '';
      } else {
        c = String(i);
        if (pad) {
          var need = width - c.length;
          if (need > 0) {
            var z = new Array(need + 1).join('0');
            if (i < 0)
              c = '-' + z + c.slice(1);
            else
              c = z + c;
          }
        }
      }
      N.push(c);
    }
  } else {
    N = concatMap(n, function(el) { return expand(el, false) });
  }

  for (var j = 0; j < N.length; j++) {
    for (var k = 0; k < post.length; k++) {
      var expansion = pre + N[j] + post[k];
      if (!isTop || isSequence || expansion)
        expansions.push(expansion);
    }
  }

  return expansions;
}

{
  "author": {
    "name": "Julian Gruber",
    "email": "mail@juliangruber.com",
    "url": "http://juliangruber.com"
  },
  "dependencies": {
    "balanced-match": "^1.0.0",
    "concat-map": "0.0.1"
  },
  "deprecated": false,
  "description": "Brace expansion as known from sh/bash",
  "devDependencies": {
    "matcha": "^0.7.0",
    "tape": "^4.6.0"
  },
  "homepage": "https://github.com/juliangruber/brace-expansion",
  "license": "MIT",
  "main": "index.js",
  "name": "brace-expansion",
  "repository": {
    "type": "git",
    "url": "git://github.com/juliangruber/brace-expansion.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/8..latest",
      "firefox/20..latest",
      "firefox/nightly",
      "chrome/25..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  },
  "version": "1.1.11"
}var bufferFill = require('buffer-fill')
var allocUnsafe = require('buffer-alloc-unsafe')

module.exports = function alloc (size, fill, encoding) {
  if (typeof size !== 'number') {
    throw new TypeError('"size" argument must be a number')
  }

  if (size < 0) {
    throw new RangeError('"size" argument must not be negative')
  }

  if (Buffer.alloc) {
    return Buffer.alloc(size, fill, encoding)
  }

  var buffer = allocUnsafe(size)

  if (size === 0) {
    return buffer
  }

  if (fill === undefined) {
    return bufferFill(buffer, 0)
  }

  if (typeof encoding !== 'string') {
    encoding = undefined
  }

  return bufferFill(buffer, fill, encoding)
}
{
  "dependencies": {
    "buffer-alloc-unsafe": "^1.1.0",
    "buffer-fill": "^1.0.0"
  },
  "deprecated": false,
  "description": "A [ponyfill](https://ponyfill.com) for `Buffer.alloc`.",
  "devDependencies": {
    "standard": "^7.1.2"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/LinusU/buffer-alloc#readme",
  "license": "MIT",
  "name": "buffer-alloc",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/LinusU/buffer-alloc.git"
  },
  "version": "1.2.0"
}function allocUnsafe (size) {
  if (typeof size !== 'number') {
    throw new TypeError('"size" argument must be a number')
  }

  if (size < 0) {
    throw new RangeError('"size" argument must not be negative')
  }

  if (Buffer.allocUnsafe) {
    return Buffer.allocUnsafe(size)
  } else {
    return new Buffer(size)
  }
}

module.exports = allocUnsafe
{
  "deprecated": false,
  "description": "A [ponyfill](https://ponyfill.com) for `Buffer.allocUnsafe`.",
  "devDependencies": {
    "standard": "^7.1.2"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/LinusU/buffer-alloc-unsafe#readme",
  "license": "MIT",
  "name": "buffer-alloc-unsafe",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/LinusU/buffer-alloc-unsafe.git"
  },
  "version": "1.1.0"
}/* Node.js 6.4.0 and up has full support */
var hasFullSupport = (function () {
  try {
    if (!Buffer.isEncoding('latin1')) {
      return false
    }

    var buf = Buffer.alloc ? Buffer.alloc(4) : new Buffer(4)

    buf.fill('ab', 'ucs2')

    return (buf.toString('hex') === '61006200')
  } catch (_) {
    return false
  }
}())

function isSingleByte (val) {
  return (val.length === 1 && val.charCodeAt(0) < 256)
}

function fillWithNumber (buffer, val, start, end) {
  if (start < 0 || end > buffer.length) {
    throw new RangeError('Out of range index')
  }

  start = start >>> 0
  end = end === undefined ? buffer.length : end >>> 0

  if (end > start) {
    buffer.fill(val, start, end)
  }

  return buffer
}

function fillWithBuffer (buffer, val, start, end) {
  if (start < 0 || end > buffer.length) {
    throw new RangeError('Out of range index')
  }

  if (end <= start) {
    return buffer
  }

  start = start >>> 0
  end = end === undefined ? buffer.length : end >>> 0

  var pos = start
  var len = val.length
  while (pos <= (end - len)) {
    val.copy(buffer, pos)
    pos += len
  }

  if (pos !== end) {
    val.copy(buffer, pos, 0, end - pos)
  }

  return buffer
}

function fill (buffer, val, start, end, encoding) {
  if (hasFullSupport) {
    return buffer.fill(val, start, end, encoding)
  }

  if (typeof val === 'number') {
    return fillWithNumber(buffer, val, start, end)
  }

  if (typeof val === 'string') {
    if (typeof start === 'string') {
      encoding = start
      start = 0
      end = buffer.length
    } else if (typeof end === 'string') {
      encoding = end
      end = buffer.length
    }

    if (encoding !== undefined && typeof encoding !== 'string') {
      throw new TypeError('encoding must be a string')
    }

    if (encoding === 'latin1') {
      encoding = 'binary'
    }

    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
      throw new TypeError('Unknown encoding: ' + encoding)
    }

    if (val === '') {
      return fillWithNumber(buffer, 0, start, end)
    }

    if (isSingleByte(val)) {
      return fillWithNumber(buffer, val.charCodeAt(0), start, end)
    }

    val = new Buffer(val, encoding)
  }

  if (Buffer.isBuffer(val)) {
    return fillWithBuffer(buffer, val, start, end)
  }

  // Other values (e.g. undefined, boolean, object) results in zero-fill
  return fillWithNumber(buffer, 0, start, end)
}

module.exports = fill
{
  "deprecated": false,
  "description": "A [ponyfill](https://ponyfill.com) for `Buffer.fill`.",
  "devDependencies": {
    "buffer-alloc-unsafe": "^1.1.0",
    "standard": "^7.1.2"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/LinusU/buffer-fill#readme",
  "license": "MIT",
  "name": "buffer-fill",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/LinusU/buffer-fill.git"
  },
  "version": "1.0.0"
}MIT License

Copyright (c) 2016, 2018 Linus UnnebÃ¤ck

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var toString = Object.prototype.toString

var isModern = (
  typeof Buffer.alloc === 'function' &&
  typeof Buffer.allocUnsafe === 'function' &&
  typeof Buffer.from === 'function'
)

function isArrayBuffer (input) {
  return toString.call(input).slice(8, -1) === 'ArrayBuffer'
}

function fromArrayBuffer (obj, byteOffset, length) {
  byteOffset >>>= 0

  var maxLength = obj.byteLength - byteOffset

  if (maxLength < 0) {
    throw new RangeError("'offset' is out of bounds")
  }

  if (length === undefined) {
    length = maxLength
  } else {
    length >>>= 0

    if (length > maxLength) {
      throw new RangeError("'length' is out of bounds")
    }
  }

  return isModern
    ? Buffer.from(obj.slice(byteOffset, byteOffset + length))
    : new Buffer(new Uint8Array(obj.slice(byteOffset, byteOffset + length)))
}

function fromString (string, encoding) {
  if (typeof encoding !== 'string' || encoding === '') {
    encoding = 'utf8'
  }

  if (!Buffer.isEncoding(encoding)) {
    throw new TypeError('"encoding" must be a valid string encoding')
  }

  return isModern
    ? Buffer.from(string, encoding)
    : new Buffer(string, encoding)
}

function bufferFrom (value, encodingOrOffset, length) {
  if (typeof value === 'number') {
    throw new TypeError('"value" argument must not be a number')
  }

  if (isArrayBuffer(value)) {
    return fromArrayBuffer(value, encodingOrOffset, length)
  }

  if (typeof value === 'string') {
    return fromString(value, encodingOrOffset)
  }

  return isModern
    ? Buffer.from(value)
    : new Buffer(value)
}

module.exports = bufferFrom
{
  "deprecated": false,
  "description": "A [ponyfill](https://ponyfill.com) for `Buffer.from`, uses native implementation if available.",
  "devDependencies": {
    "standard": "^7.1.2"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/LinusU/buffer-from#readme",
  "license": "MIT",
  "name": "buffer-from",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/LinusU/buffer-from.git"
  },
  "version": "1.1.1"
}{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "7zip-bin": "~4.1.0",
    "@types/debug": "^4.1.4",
    "app-builder-bin": "2.7.1",
    "bluebird-lst": "^1.0.9",
    "builder-util-runtime": "^8.2.5",
    "chalk": "^2.4.2",
    "debug": "^4.1.1",
    "fs-extra-p": "^8.0.2",
    "is-ci": "^2.0.0",
    "js-yaml": "^3.13.1",
    "source-map-support": "^0.5.12",
    "stat-mode": "^0.3.0",
    "temp-file": "^3.3.3"
  },
  "deprecated": false,
  "description": "Various utilities. Used by [electron-builder](https://github.com/electron-userland/electron-builder).",
  "files": [
    "out"
  ],
  "homepage": "https://github.com/electron-userland/electron-builder",
  "license": "MIT",
  "main": "out/util.js",
  "name": "builder-util",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-builder.git"
  },
  "typings": "./out/util.d.ts",
  "version": "10.1.2"
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.DebugLogger = void 0;

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _util() {
  const data = require("./util");

  _util = function () {
    return data;
  };

  return data;
}

class DebugLogger {
  constructor(isEnabled = true) {
    this.isEnabled = isEnabled;
    this.data = {};
  }

  add(key, value) {
    if (!this.isEnabled) {
      return;
    }

    const dataPath = key.split(".");
    let o = this.data;
    let lastName = null;

    for (const p of dataPath) {
      if (p === dataPath[dataPath.length - 1]) {
        lastName = p;
        break;
      } else {
        if (o[p] == null) {
          o[p] = Object.create(null);
        } else if (typeof o[p] === "string") {
          o[p] = [o[p]];
        }

        o = o[p];
      }
    }

    if (Array.isArray(o[lastName])) {
      o[lastName].push(value);
    } else {
      o[lastName] = value;
    }
  }

  save(file) {
    // toml and json doesn't correctly output multiline string as multiline
    if (this.isEnabled && Object.keys(this.data).length > 0) {
      return (0, _fsExtraP().outputFile)(file, (0, _util().serializeToYaml)(this.data));
    } else {
      return Promise.resolve();
    }
  }

} exports.DebugLogger = DebugLogger;
// __ts-babel@6.0.4
//# sourceMappingURL=DebugLogger.js.map{"version":3,"sources":["../src/DebugLogger.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEM,MAAO,WAAP,CAAkB;AAGtB,EAAA,WAAA,CAAqB,SAAA,GAAY,IAAjC,EAAqC;AAAhB,SAAA,SAAA,GAAA,SAAA;AAFZ,SAAA,IAAA,GAAY,EAAZ;AAGR;;AAED,EAAA,GAAG,CAAC,GAAD,EAAc,KAAd,EAAwB;AACzB,QAAI,CAAC,KAAK,SAAV,EAAqB;AACnB;AACD;;AAED,UAAM,QAAQ,GAAG,GAAG,CAAC,KAAJ,CAAU,GAAV,CAAjB;AACA,QAAI,CAAC,GAAG,KAAK,IAAb;AACA,QAAI,QAAQ,GAAkB,IAA9B;;AACA,SAAK,MAAM,CAAX,IAAgB,QAAhB,EAA0B;AACxB,UAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,MAAT,GAAkB,CAAnB,CAAlB,EAAyC;AACvC,QAAA,QAAQ,GAAG,CAAX;AACA;AACD,OAHD,MAIK;AACH,YAAI,CAAC,CAAC,CAAD,CAAD,IAAQ,IAAZ,EAAkB;AAChB,UAAA,CAAC,CAAC,CAAD,CAAD,GAAO,MAAM,CAAC,MAAP,CAAc,IAAd,CAAP;AACD,SAFD,MAGK,IAAI,OAAO,CAAC,CAAC,CAAD,CAAR,KAAgB,QAApB,EAA8B;AACjC,UAAA,CAAC,CAAC,CAAD,CAAD,GAAO,CAAC,CAAC,CAAC,CAAD,CAAF,CAAP;AACD;;AACD,QAAA,CAAC,GAAG,CAAC,CAAC,CAAD,CAAL;AACD;AACF;;AAED,QAAI,KAAK,CAAC,OAAN,CAAc,CAAC,CAAC,QAAD,CAAf,CAAJ,EAAkC;AAChC,MAAA,CAAC,CAAC,QAAD,CAAD,CAAc,IAAd,CAAmB,KAAnB;AACD,KAFD,MAGK;AACH,MAAA,CAAC,CAAC,QAAD,CAAD,GAAgB,KAAhB;AACD;AACF;;AAED,EAAA,IAAI,CAAC,IAAD,EAAa;AACf;AACA,QAAI,KAAK,SAAL,IAAkB,MAAM,CAAC,IAAP,CAAY,KAAK,IAAjB,EAAuB,MAAvB,GAAgC,CAAtD,EAAyD;AACvD,aAAO,4BAAW,IAAX,EAAiB,6BAAgB,KAAK,IAArB,CAAjB,CAAP;AACD,KAFD,MAGK;AACH,aAAO,OAAO,CAAC,OAAR,EAAP;AACD;AACF;;AA9CqB,C","sourcesContent":["import { outputFile } from \"fs-extra-p\"\nimport { serializeToYaml } from \"./util\"\n\nexport class DebugLogger {\n  readonly data: any = {}\n\n  constructor(readonly isEnabled = true) {\n  }\n\n  add(key: string, value: any) {\n    if (!this.isEnabled) {\n      return\n    }\n\n    const dataPath = key.split(\".\")\n    let o = this.data\n    let lastName: string | null = null\n    for (const p of dataPath) {\n      if (p === dataPath[dataPath.length - 1]) {\n        lastName = p\n        break\n      }\n      else {\n        if (o[p] == null) {\n          o[p] = Object.create(null)\n        }\n        else if (typeof o[p] === \"string\") {\n          o[p] = [o[p]]\n        }\n        o = o[p]\n      }\n    }\n\n    if (Array.isArray(o[lastName!!])) {\n      o[lastName!!].push(value)\n    }\n    else {\n      o[lastName!!] = value\n    }\n  }\n\n  save(file: string) {\n    // toml and json doesn't correctly output multiline string as multiline\n    if (this.isEnabled && Object.keys(this.data).length > 0) {\n      return outputFile(file, serializeToYaml(this.data))\n    }\n    else {\n      return Promise.resolve()\n    }\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.toLinuxArchString = toLinuxArchString;
exports.getArchCliNames = getArchCliNames;
exports.getArchSuffix = getArchSuffix;
exports.archFromString = archFromString;
exports.Arch = void 0;
var Arch;
exports.Arch = Arch;

(function (Arch) {
  Arch[Arch["ia32"] = 0] = "ia32";
  Arch[Arch["x64"] = 1] = "x64";
  Arch[Arch["armv7l"] = 2] = "armv7l";
  Arch[Arch["arm64"] = 3] = "arm64";
})(Arch || (exports.Arch = Arch = {}));

function toLinuxArchString(arch, isSnap = false) {
  switch (arch) {
    case Arch.x64:
      return "amd64";

    case Arch.ia32:
      return "i386";

    case Arch.armv7l:
      return isSnap ? "armhf" : "armv7l";

    case Arch.arm64:
      return "arm64";

    default:
      throw new Error(`Unsupported arch ${arch}`);
  }
}

function getArchCliNames() {
  return [Arch[Arch.ia32], Arch[Arch.x64], Arch[Arch.armv7l], Arch[Arch.arm64]];
}

function getArchSuffix(arch) {
  return arch === Arch.x64 ? "" : `-${Arch[arch]}`;
}

function archFromString(name) {
  switch (name) {
    case "x64":
      return Arch.x64;

    case "ia32":
      return Arch.ia32;

    case "arm64":
      return Arch.arm64;

    case "armv7l":
      return Arch.armv7l;

    default:
      throw new Error(`Unsupported arch ${name}`);
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=arch.js.map{"version":3,"sources":["../src/arch.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,IAAY,IAAZ;;;AAAA,CAAA,UAAY,IAAZ,EAAgB;AACd,EAAA,IAAA,CAAA,IAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AAAM,EAAA,IAAA,CAAA,IAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAA;AAAK,EAAA,IAAA,CAAA,IAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AAAQ,EAAA,IAAA,CAAA,IAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACpB,CAFD,EAAY,IAAI,oBAAJ,IAAI,GAAA,EAAA,CAAhB;;AAMM,SAAU,iBAAV,CAA4B,IAA5B,EAAwC,MAAA,GAAkB,KAA1D,EAA+D;AACnE,UAAQ,IAAR;AACE,SAAK,IAAI,CAAC,GAAV;AACE,aAAO,OAAP;;AACF,SAAK,IAAI,CAAC,IAAV;AACE,aAAO,MAAP;;AACF,SAAK,IAAI,CAAC,MAAV;AACE,aAAO,MAAM,GAAG,OAAH,GAAa,QAA1B;;AACF,SAAK,IAAI,CAAC,KAAV;AACE,aAAO,OAAP;;AAEF;AACE,YAAM,IAAI,KAAJ,CAAU,oBAAoB,IAAI,EAAlC,CAAN;AAXJ;AAaD;;AAEK,SAAU,eAAV,GAAyB;AAC7B,SAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAN,CAAL,EAAkB,IAAI,CAAC,IAAI,CAAC,GAAN,CAAtB,EAAkC,IAAI,CAAC,IAAI,CAAC,MAAN,CAAtC,EAAqD,IAAI,CAAC,IAAI,CAAC,KAAN,CAAzD,CAAP;AACD;;AAEK,SAAU,aAAV,CAAwB,IAAxB,EAAkC;AACtC,SAAO,IAAI,KAAK,IAAI,CAAC,GAAd,GAAoB,EAApB,GAAyB,IAAI,IAAI,CAAC,IAAD,CAAM,EAA9C;AACD;;AAEK,SAAU,cAAV,CAAyB,IAAzB,EAAqC;AACzC,UAAQ,IAAR;AACE,SAAK,KAAL;AACE,aAAO,IAAI,CAAC,GAAZ;;AACF,SAAK,MAAL;AACE,aAAO,IAAI,CAAC,IAAZ;;AACF,SAAK,OAAL;AACE,aAAO,IAAI,CAAC,KAAZ;;AACF,SAAK,QAAL;AACE,aAAO,IAAI,CAAC,MAAZ;;AAEF;AACE,YAAM,IAAI,KAAJ,CAAU,oBAAoB,IAAI,EAAlC,CAAN;AAXJ;AAaD,C","sourcesContent":["export enum Arch {\n  ia32, x64, armv7l, arm64\n}\n\nexport type ArchType = \"x64\" | \"ia32\" | \"armv7l\" | \"arm64\"\n\nexport function toLinuxArchString(arch: Arch, isSnap: boolean = false): string {\n  switch (arch) {\n    case Arch.x64:\n      return \"amd64\"\n    case Arch.ia32:\n      return \"i386\"\n    case Arch.armv7l:\n      return isSnap ? \"armhf\" : \"armv7l\"\n    case Arch.arm64:\n      return \"arm64\"\n\n    default:\n      throw new Error(`Unsupported arch ${arch}`)\n  }\n}\n\nexport function getArchCliNames(): Array<string> {\n  return [Arch[Arch.ia32], Arch[Arch.x64], Arch[Arch.armv7l], Arch[Arch.arm64]]\n}\n\nexport function getArchSuffix(arch: Arch): string {\n  return arch === Arch.x64 ? \"\" : `-${Arch[arch]}`\n}\n\nexport function archFromString(name: string): Arch {\n  switch (name) {\n    case \"x64\":\n      return Arch.x64\n    case \"ia32\":\n      return Arch.ia32\n    case \"arm64\":\n      return Arch.arm64\n    case \"armv7l\":\n      return Arch.armv7l\n\n    default:\n      throw new Error(`Unsupported arch ${name}`)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.AsyncTaskManager = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _log() {
  const data = require("./log");

  _log = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("./promise");

  _promise = function () {
    return data;
  };

  return data;
}

class AsyncTaskManager {
  constructor(cancellationToken) {
    this.cancellationToken = cancellationToken;
    this.tasks = [];
    this.errors = [];
  }

  add(task) {
    if (this.cancellationToken == null || !this.cancellationToken.cancelled) {
      this.addTask(task());
    }
  }

  addTask(promise) {
    if (this.cancellationToken.cancelled) {
      _log().log.debug({
        reason: "cancelled",
        stack: new Error().stack
      }, "async task not added");

      if ("cancel" in promise) {
        promise.cancel();
      }

      return;
    }

    this.tasks.push(promise.catch(it => {
      _log().log.debug({
        error: it.message || it.toString()
      }, "async task error");

      this.errors.push(it);
      return Promise.resolve(null);
    }));
  }

  cancelTasks() {
    for (const task of this.tasks) {
      if ("cancel" in task) {
        task.cancel();
      }
    }

    this.tasks.length = 0;
  }

  awaitTasks() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (_this.cancellationToken.cancelled) {
        _this.cancelTasks();

        return [];
      }

      const checkErrors = () => {
        if (_this.errors.length > 0) {
          _this.cancelTasks();

          throwError(_this.errors);
          return;
        }
      };

      checkErrors();
      let result = null;
      const tasks = _this.tasks;
      let list = tasks.slice();
      tasks.length = 0;

      while (list.length > 0) {
        const subResult = yield Promise.all(list);
        result = result == null ? subResult : result.concat(subResult);
        checkErrors();

        if (tasks.length === 0) {
          break;
        } else {
          if (_this.cancellationToken.cancelled) {
            _this.cancelTasks();

            return [];
          }

          list = tasks.slice();
          tasks.length = 0;
        }
      }

      return result || [];
    })();
  }

}

exports.AsyncTaskManager = AsyncTaskManager;

function throwError(errors) {
  if (errors.length === 1) {
    throw errors[0];
  } else if (errors.length > 1) {
    throw new (_promise().NestedError)(errors, "Cannot cleanup: ");
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=asyncTaskManager.js.map{"version":3,"sources":["../src/asyncTaskManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { CancellationToken } from \"builder-util-runtime\"\nimport { log } from \"./log\"\nimport { NestedError } from \"./promise\"\n\nexport class AsyncTaskManager {\n  readonly tasks: Array<Promise<any>> = []\n  private readonly errors: Array<Error> = []\n\n  constructor(private readonly cancellationToken: CancellationToken) {\n  }\n\n  add(task: () => Promise<any>) {\n    if (this.cancellationToken == null || !this.cancellationToken.cancelled) {\n      this.addTask(task())\n    }\n  }\n\n  addTask(promise: Promise<any>) {\n    if (this.cancellationToken.cancelled) {\n      log.debug({reason: \"cancelled\", stack: new Error().stack}, \"async task not added\")\n      if (\"cancel\" in promise) {\n        (promise as any).cancel()\n      }\n      return\n    }\n\n    this.tasks.push(promise\n      .catch(it => {\n        log.debug({error: it.message || it.toString()}, \"async task error\")\n        this.errors.push(it)\n        return Promise.resolve(null)\n      }))\n  }\n\n  cancelTasks() {\n    for (const task of this.tasks) {\n      if (\"cancel\" in task) {\n        (task as any).cancel()\n      }\n    }\n    this.tasks.length = 0\n  }\n\n  async awaitTasks(): Promise<Array<any>> {\n    if (this.cancellationToken.cancelled) {\n      this.cancelTasks()\n      return []\n    }\n\n    const checkErrors = () => {\n      if (this.errors.length > 0) {\n        this.cancelTasks()\n        throwError(this.errors)\n        return\n      }\n    }\n\n    checkErrors()\n\n    let result: Array<any> | null = null\n    const tasks = this.tasks\n    let list = tasks.slice()\n    tasks.length = 0\n    while (list.length > 0) {\n      const subResult = await Promise.all(list)\n      result = result == null ? subResult : result.concat(subResult)\n      checkErrors()\n      if (tasks.length === 0) {\n        break\n      }\n      else {\n        if (this.cancellationToken.cancelled) {\n          this.cancelTasks()\n          return []\n        }\n\n        list = tasks.slice()\n        tasks.length = 0\n      }\n    }\n    return result || []\n  }\n}\n\nfunction throwError(errors: Array<Error>) {\n  if (errors.length === 1) {\n    throw errors[0]\n  }\n  else if (errors.length > 1) {\n    throw new NestedError(errors, \"Cannot cleanup: \")\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.deepAssign = deepAssign;

function isObject(x) {
  if (Array.isArray(x)) {
    return false;
  }

  const type = typeof x;
  return type === "object" || type === "function";
}

function assignKey(target, from, key) {
  const value = from[key]; // https://github.com/electron-userland/electron-builder/pull/562

  if (value === undefined) {
    return;
  }

  const prevValue = target[key];

  if (prevValue == null || value == null || !isObject(prevValue) || !isObject(value)) {
    target[key] = value;
  } else {
    target[key] = assign(prevValue, value);
  }
}

function assign(to, from) {
  if (to !== from) {
    for (const key of Object.getOwnPropertyNames(from)) {
      assignKey(to, from, key);
    }
  }

  return to;
}

function deepAssign(target, ...objects) {
  for (const o of objects) {
    if (o != null) {
      assign(target, o);
    }
  }

  return target;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=deepAssign.js.map{"version":3,"sources":["../src/deepAssign.ts"],"names":[],"mappings":";;;;;;;AAAA,SAAS,QAAT,CAAkB,CAAlB,EAAwB;AACtB,MAAI,KAAK,CAAC,OAAN,CAAc,CAAd,CAAJ,EAAsB;AACpB,WAAO,KAAP;AACD;;AAED,QAAM,IAAI,GAAG,OAAO,CAApB;AACA,SAAO,IAAI,KAAK,QAAT,IAAqB,IAAI,KAAK,UAArC;AACD;;AAED,SAAS,SAAT,CAAmB,MAAnB,EAAgC,IAAhC,EAA2C,GAA3C,EAAsD;AACpD,QAAM,KAAK,GAAG,IAAI,CAAC,GAAD,CAAlB,CADoD,CAEpD;;AACA,MAAI,KAAK,KAAK,SAAd,EAAyB;AACvB;AACD;;AAED,QAAM,SAAS,GAAG,MAAM,CAAC,GAAD,CAAxB;;AACA,MAAI,SAAS,IAAI,IAAb,IAAqB,KAAK,IAAI,IAA9B,IAAsC,CAAC,QAAQ,CAAC,SAAD,CAA/C,IAA8D,CAAC,QAAQ,CAAC,KAAD,CAA3E,EAAoF;AAClF,IAAA,MAAM,CAAC,GAAD,CAAN,GAAc,KAAd;AACD,GAFD,MAGK;AACH,IAAA,MAAM,CAAC,GAAD,CAAN,GAAc,MAAM,CAAC,SAAD,EAAY,KAAZ,CAApB;AACD;AACF;;AAED,SAAS,MAAT,CAAgB,EAAhB,EAAyB,IAAzB,EAAkC;AAChC,MAAI,EAAE,KAAK,IAAX,EAAiB;AACf,SAAK,MAAM,GAAX,IAAkB,MAAM,CAAC,mBAAP,CAA2B,IAA3B,CAAlB,EAAoD;AAClD,MAAA,SAAS,CAAC,EAAD,EAAK,IAAL,EAAW,GAAX,CAAT;AACD;AACF;;AACD,SAAO,EAAP;AACD;;AAEK,SAAU,UAAV,CAAwB,MAAxB,EAAmC,GAAG,OAAtC,EAAyD;AAC7D,OAAK,MAAM,CAAX,IAAgB,OAAhB,EAAyB;AACvB,QAAI,CAAC,IAAI,IAAT,EAAe;AACb,MAAA,MAAM,CAAC,MAAD,EAAS,CAAT,CAAN;AACD;AACF;;AACD,SAAO,MAAP;AACD,C","sourcesContent":["function isObject(x: any) {\n  if (Array.isArray(x)) {\n    return false\n  }\n\n  const type = typeof x\n  return type === \"object\" || type === \"function\"\n}\n\nfunction assignKey(target: any, from: any, key: string) {\n  const value = from[key]\n  // https://github.com/electron-userland/electron-builder/pull/562\n  if (value === undefined) {\n    return\n  }\n\n  const prevValue = target[key]\n  if (prevValue == null || value == null || !isObject(prevValue) || !isObject(value)) {\n    target[key] = value\n  }\n  else {\n    target[key] = assign(prevValue, value)\n  }\n}\n\nfunction assign(to: any, from: any) {\n  if (to !== from) {\n    for (const key of Object.getOwnPropertyNames(from)) {\n      assignKey(to, from, key)\n    }\n  }\n  return to\n}\n\nexport function deepAssign<T>(target: T, ...objects: Array<any>): T {\n  for (const o of objects) {\n    if (o != null) {\n      assign(target, o)\n    }\n  }\n  return target\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.unlinkIfExists = unlinkIfExists;
exports.statOrNull = statOrNull;
exports.exists = exists;
exports.walk = walk;
exports.copyFile = copyFile;
exports.copyOrLinkFile = copyOrLinkFile;
exports.copyDir = copyDir;
exports.USE_HARD_LINKS = exports.DO_NOT_USE_HARD_LINKS = exports.FileCopier = exports.CopyFileTransformer = exports.CONCURRENCY = exports.MAX_FILE_REQUESTS = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _statMode() {
  const data = _interopRequireDefault(require("stat-mode"));

  _statMode = function () {
    return data;
  };

  return data;
}

function _log() {
  const data = require("./log");

  _log = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("./promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const MAX_FILE_REQUESTS = 8;
exports.MAX_FILE_REQUESTS = MAX_FILE_REQUESTS;
const CONCURRENCY = {
  concurrency: MAX_FILE_REQUESTS
};
exports.CONCURRENCY = CONCURRENCY;

class CopyFileTransformer {
  constructor(afterCopyTransformer) {
    this.afterCopyTransformer = afterCopyTransformer;
  }

}

exports.CopyFileTransformer = CopyFileTransformer;

function unlinkIfExists(file) {
  return (0, _fsExtraP().unlink)(file).catch(() => {});
}

function statOrNull(_x) {
  return _statOrNull.apply(this, arguments);
}

function _statOrNull() {
  _statOrNull = (0, _bluebirdLst().coroutine)(function* (file) {
    return (0, _promise().orNullIfFileNotExist)((0, _fsExtraP().stat)(file));
  });
  return _statOrNull.apply(this, arguments);
}

function exists(_x2) {
  return _exists.apply(this, arguments);
}
/**
 * Returns list of file paths (system-dependent file separator)
 */


function _exists() {
  _exists = (0, _bluebirdLst().coroutine)(function* (file) {
    try {
      yield (0, _fsExtraP().access)(file);
      return true;
    } catch (e) {
      return false;
    }
  });
  return _exists.apply(this, arguments);
}

function walk(_x3, _x4, _x5) {
  return _walk.apply(this, arguments);
}

function _walk() {
  _walk = (0, _bluebirdLst().coroutine)(function* (initialDirPath, filter, consumer) {
    let result = [];
    const queue = [initialDirPath];
    let addDirToResult = false;
    const isIncludeDir = consumer == null ? false : consumer.isIncludeDir === true;

    while (queue.length > 0) {
      const dirPath = queue.pop();

      if (isIncludeDir) {
        if (addDirToResult) {
          result.push(dirPath);
        } else {
          addDirToResult = true;
        }
      }

      const childNames = yield (0, _fsExtraP().readdir)(dirPath);
      childNames.sort();
      let nodeModuleContent = null;
      const dirs = []; // our handler is async, but we should add sorted files, so, we add file to result not in the mapper, but after map

      const sortedFilePaths = yield _bluebirdLst().default.map(childNames, name => {
        if (name === ".DS_Store" || name === ".gitkeep") {
          return null;
        }

        const filePath = dirPath + path.sep + name;
        return (0, _fsExtraP().lstat)(filePath).then(stat => {
          if (filter != null && !filter(filePath, stat)) {
            return null;
          }

          const consumerResult = consumer == null ? null : consumer.consume(filePath, stat, dirPath, childNames);

          if (consumerResult === false) {
            return null;
          } else if (consumerResult == null || !("then" in consumerResult)) {
            if (stat.isDirectory()) {
              dirs.push(name);
              return null;
            } else {
              return filePath;
            }
          } else {
            return consumerResult.then(it => {
              if (it != null && Array.isArray(it)) {
                nodeModuleContent = it;
                return null;
              } // asarUtil can return modified stat (symlink handling)


              if ((it != null && "isDirectory" in it ? it : stat).isDirectory()) {
                dirs.push(name);
                return null;
              } else {
                return filePath;
              }
            });
          }
        });
      }, CONCURRENCY);

      for (const child of sortedFilePaths) {
        if (child != null) {
          result.push(child);
        }
      }

      dirs.sort();

      for (const child of dirs) {
        queue.push(dirPath + path.sep + child);
      }

      if (nodeModuleContent != null) {
        result = result.concat(nodeModuleContent);
      }
    }

    return result;
  });
  return _walk.apply(this, arguments);
}

const _isUseHardLink = process.platform !== "win32" && process.env.USE_HARD_LINKS !== "false" && (require("is-ci") || process.env.USE_HARD_LINKS === "true");

function copyFile(src, dest, isEnsureDir = true) {
  return (isEnsureDir ? (0, _fsExtraP().ensureDir)(path.dirname(dest)) : Promise.resolve()).then(() => copyOrLinkFile(src, dest, null, false));
}
/**
 * Hard links is used if supported and allowed.
 * File permission is fixed â€” allow execute for all if owner can, allow read for all if owner can.
 *
 * ensureDir is not called, dest parent dir must exists
 */


function copyOrLinkFile(src, dest, stats, isUseHardLink, exDevErrorHandler) {
  if (isUseHardLink === undefined) {
    isUseHardLink = _isUseHardLink;
  }

  if (stats != null) {
    const originalModeNumber = stats.mode;
    const mode = new (_statMode().default)(stats);

    if (mode.owner.execute) {
      mode.group.execute = true;
      mode.others.execute = true;
    }

    mode.group.read = true;
    mode.others.read = true;
    mode.setuid = false;
    mode.setgid = false;

    if (originalModeNumber !== stats.mode) {
      if (_log().log.isDebugEnabled) {
        const oldMode = new (_statMode().default)({
          mode: originalModeNumber
        });

        _log().log.debug({
          file: dest,
          oldMode,
          mode
        }, "permissions fixed from");
      } // https://helgeklein.com/blog/2009/05/hard-links-and-permissions-acls/
      // Permissions on all hard links to the same data on disk are always identical. The same applies to attributes.
      // That means if you change the permissions/owner/attributes on one hard link, you will immediately see the changes on all other hard links.


      if (isUseHardLink) {
        isUseHardLink = false;

        _log().log.debug({
          dest
        }, "copied, but not linked, because file permissions need to be fixed");
      }
    }
  }

  if (isUseHardLink) {
    return (0, _fsExtraP().link)(src, dest).catch(e => {
      if (e.code === "EXDEV") {
        const isLog = exDevErrorHandler == null ? true : exDevErrorHandler();

        if (isLog && _log().log.isDebugEnabled) {
          _log().log.debug({
            error: e.message
          }, "cannot copy using hard link");
        }

        return doCopyFile(src, dest, stats);
      } else {
        throw e;
      }
    });
  }

  return doCopyFile(src, dest, stats);
}

function doCopyFile(src, dest, stats) {
  if (_fsExtraP().copyFile == null) {
    return new Promise((resolve, reject) => {
      const reader = (0, _fsExtraP().createReadStream)(src);
      const writer = (0, _fsExtraP().createWriteStream)(dest, stats == null ? undefined : {
        mode: stats.mode
      });
      reader.on("error", reject);
      writer.on("error", reject);
      writer.on("open", () => {
        reader.pipe(writer);
      });
      writer.once("close", resolve);
    });
  } // node 8.5.0+


  const promise = (0, _fsExtraP().copyFile)(src, dest);

  if (stats == null) {
    return promise;
  }

  return promise.then(() => (0, _fsExtraP().chmod)(dest, stats.mode));
}

class FileCopier {
  constructor(isUseHardLinkFunction, transformer) {
    this.isUseHardLinkFunction = isUseHardLinkFunction;
    this.transformer = transformer;

    if (isUseHardLinkFunction === USE_HARD_LINKS) {
      this.isUseHardLink = true;
    } else {
      this.isUseHardLink = _isUseHardLink && isUseHardLinkFunction !== DO_NOT_USE_HARD_LINKS;
    }
  }

  copy(src, dest, stat) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      let afterCopyTransformer = null;

      if (_this.transformer != null && stat != null && stat.isFile()) {
        let data = _this.transformer(src);

        if (data != null) {
          if (typeof data === "object" && "then" in data) {
            data = yield data;
          }

          if (data != null) {
            if (data instanceof CopyFileTransformer) {
              afterCopyTransformer = data.afterCopyTransformer;
            } else {
              yield (0, _fsExtraP().writeFile)(dest, data);
              return;
            }
          }
        }
      }

      const isUseHardLink = afterCopyTransformer == null && (!_this.isUseHardLink || _this.isUseHardLinkFunction == null ? _this.isUseHardLink : _this.isUseHardLinkFunction(dest));
      yield copyOrLinkFile(src, dest, stat, isUseHardLink, isUseHardLink ? () => {
        // files are copied concurrently, so, we must not check here currentIsUseHardLink â€” our code can be executed after that other handler will set currentIsUseHardLink to false
        if (_this.isUseHardLink) {
          _this.isUseHardLink = false;
          return true;
        } else {
          return false;
        }
      } : null);

      if (afterCopyTransformer != null) {
        yield afterCopyTransformer(dest);
      }
    })();
  }

}
/**
 * Empty directories is never created.
 * Hard links is used if supported and allowed.
 */


exports.FileCopier = FileCopier;

function copyDir(src, destination, options = {}) {
  const fileCopier = new FileCopier(options.isUseHardLink, options.transformer);

  if (_log().log.isDebugEnabled) {
    _log().log.debug({
      src,
      destination
    }, `copying${fileCopier.isUseHardLink ? " using hard links" : ""}`);
  }

  const createdSourceDirs = new Set();
  const links = [];
  return walk(src, options.filter, {
    consume: function () {
      var _ref = (0, _bluebirdLst().coroutine)(function* (file, stat, parent) {
        if (!stat.isFile() && !stat.isSymbolicLink()) {
          return;
        }

        if (!createdSourceDirs.has(parent)) {
          yield (0, _fsExtraP().ensureDir)(parent.replace(src, destination));
          createdSourceDirs.add(parent);
        }

        const destFile = file.replace(src, destination);

        if (stat.isFile()) {
          yield fileCopier.copy(file, destFile, stat);
        } else {
          links.push({
            file: destFile,
            link: yield (0, _fsExtraP().readlink)(file)
          });
        }
      });

      return function consume(_x6, _x7, _x8) {
        return _ref.apply(this, arguments);
      };
    }()
  }).then(() => _bluebirdLst().default.map(links, it => (0, _fsExtraP().symlink)(it.link, it.file), CONCURRENCY));
}

const DO_NOT_USE_HARD_LINKS = file => false;

exports.DO_NOT_USE_HARD_LINKS = DO_NOT_USE_HARD_LINKS;

const USE_HARD_LINKS = file => true; exports.USE_HARD_LINKS = USE_HARD_LINKS;
// __ts-babel@6.0.4
//# sourceMappingURL=fs.js.map{"version":3,"sources":["../src/fs.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { access, chmod, copyFile as _nodeCopyFile, createReadStream, createWriteStream, ensureDir, link, lstat, readdir, readlink, stat, Stats, symlink, unlink, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport Mode from \"stat-mode\"\nimport { log } from \"./log\"\nimport { orNullIfFileNotExist } from \"./promise\"\n\nexport const MAX_FILE_REQUESTS = 8\nexport const CONCURRENCY = {concurrency: MAX_FILE_REQUESTS}\n\nexport type AfterCopyFileTransformer = (file: string) => Promise<void>\n\nexport class CopyFileTransformer {\n  constructor(public readonly afterCopyTransformer: AfterCopyFileTransformer) {\n  }\n}\n\nexport type FileTransformer = (file: string) => Promise<null | string | Buffer | CopyFileTransformer> | null | string | Buffer | CopyFileTransformer\nexport type Filter = (file: string, stat: Stats) => boolean\n\nexport function unlinkIfExists(file: string) {\n  return unlink(file)\n    .catch(() => {/* ignore */})\n}\n\nexport async function statOrNull(file: string): Promise<Stats | null> {\n  return orNullIfFileNotExist(stat(file))\n}\n\nexport async function exists(file: string): Promise<boolean> {\n  try {\n    await access(file)\n    return true\n  }\n  catch (e) {\n    return false\n  }\n}\n\nexport interface FileConsumer {\n  consume(file: string, fileStat: Stats, parent: string, siblingNames: Array<string>): any\n\n  /**\n   * @default false\n   */\n  isIncludeDir?: boolean\n}\n\n/**\n * Returns list of file paths (system-dependent file separator)\n */\nexport async function walk(initialDirPath: string, filter?: Filter | null, consumer?: FileConsumer): Promise<Array<string>> {\n  let result: Array<string> = []\n  const queue: Array<string> = [initialDirPath]\n  let addDirToResult = false\n  const isIncludeDir = consumer == null ? false : consumer.isIncludeDir === true\n  while (queue.length > 0) {\n    const dirPath = queue.pop()!\n    if (isIncludeDir) {\n      if (addDirToResult) {\n        result.push(dirPath)\n      }\n      else {\n        addDirToResult = true\n      }\n    }\n\n    const childNames = await readdir(dirPath)\n    childNames.sort()\n\n    let nodeModuleContent: Array<string> | null = null\n\n    const dirs: Array<string> = []\n    // our handler is async, but we should add sorted files, so, we add file to result not in the mapper, but after map\n    const sortedFilePaths = await BluebirdPromise.map(childNames, name => {\n      if (name === \".DS_Store\" || name === \".gitkeep\") {\n        return null\n      }\n\n      const filePath = dirPath + path.sep + name\n      return lstat(filePath)\n        .then(stat => {\n          if (filter != null && !filter(filePath, stat)) {\n            return null\n          }\n\n          const consumerResult = consumer == null ? null : consumer.consume(filePath, stat, dirPath, childNames)\n          if (consumerResult === false) {\n            return null\n          }\n          else if (consumerResult == null || !(\"then\" in consumerResult)) {\n            if (stat.isDirectory()) {\n              dirs.push(name)\n              return null\n            }\n            else {\n              return filePath\n            }\n          }\n          else {\n            return (consumerResult as Promise<any>)\n              .then((it): any => {\n                if (it != null && Array.isArray(it)) {\n                  nodeModuleContent = it\n                  return null\n                }\n\n                // asarUtil can return modified stat (symlink handling)\n                if ((it != null && \"isDirectory\" in it ? (it as Stats) : stat).isDirectory()) {\n                  dirs.push(name)\n                  return null\n                }\n                else {\n                  return filePath\n                }\n              })\n          }\n        })\n    }, CONCURRENCY)\n\n    for (const child of sortedFilePaths) {\n      if (child != null) {\n        result.push(child)\n      }\n    }\n\n    dirs.sort()\n    for (const child of dirs) {\n      queue.push(dirPath + path.sep + child)\n    }\n\n    if (nodeModuleContent != null) {\n      result = result.concat(nodeModuleContent)\n    }\n  }\n\n  return result\n}\n\nconst _isUseHardLink = process.platform !== \"win32\" && process.env.USE_HARD_LINKS !== \"false\" && (require(\"is-ci\") || process.env.USE_HARD_LINKS === \"true\")\n\nexport function copyFile(src: string, dest: string, isEnsureDir = true) {\n  return (isEnsureDir ? ensureDir(path.dirname(dest)) : Promise.resolve())\n    .then(() => copyOrLinkFile(src, dest, null, false))\n}\n\n/**\n * Hard links is used if supported and allowed.\n * File permission is fixed â€” allow execute for all if owner can, allow read for all if owner can.\n *\n * ensureDir is not called, dest parent dir must exists\n */\nexport function copyOrLinkFile(src: string, dest: string, stats?: Stats | null, isUseHardLink?: boolean, exDevErrorHandler?: (() => boolean) | null): Promise<any> {\n  if (isUseHardLink === undefined) {\n    isUseHardLink = _isUseHardLink\n  }\n\n  if (stats != null) {\n    const originalModeNumber = stats.mode\n    const mode = new Mode(stats)\n    if (mode.owner.execute) {\n      mode.group.execute = true\n      mode.others.execute = true\n    }\n\n    mode.group.read = true\n    mode.others.read = true\n\n    mode.setuid = false\n    mode.setgid = false\n\n    if (originalModeNumber !== stats.mode) {\n      if (log.isDebugEnabled) {\n        const oldMode = new Mode({mode: originalModeNumber})\n        log.debug({file: dest, oldMode, mode}, \"permissions fixed from\")\n      }\n\n      // https://helgeklein.com/blog/2009/05/hard-links-and-permissions-acls/\n      // Permissions on all hard links to the same data on disk are always identical. The same applies to attributes.\n      // That means if you change the permissions/owner/attributes on one hard link, you will immediately see the changes on all other hard links.\n      if (isUseHardLink) {\n        isUseHardLink = false\n        log.debug({dest}, \"copied, but not linked, because file permissions need to be fixed\")\n      }\n    }\n  }\n\n  if (isUseHardLink) {\n    return link(src, dest)\n      .catch(e => {\n        if (e.code === \"EXDEV\") {\n          const isLog = exDevErrorHandler == null ? true : exDevErrorHandler()\n          if (isLog && log.isDebugEnabled) {\n            log.debug({error: e.message}, \"cannot copy using hard link\")\n          }\n          return doCopyFile(src, dest, stats)\n        }\n        else {\n          throw e\n        }\n      })\n  }\n  return doCopyFile(src, dest, stats)\n}\n\nfunction doCopyFile(src: string, dest: string, stats: Stats | null | undefined): Promise<any> {\n  if (_nodeCopyFile == null) {\n    return new Promise((resolve, reject) => {\n      const reader = createReadStream(src)\n      const writer = createWriteStream(dest, stats == null ? undefined : {mode: stats!!.mode})\n      reader.on(\"error\", reject)\n      writer.on(\"error\", reject)\n      writer.on(\"open\", () => {\n        reader.pipe(writer)\n      })\n      writer.once(\"close\", resolve)\n    })\n  }\n\n  // node 8.5.0+\n  const promise = _nodeCopyFile(src, dest)\n  if (stats == null) {\n    return promise\n  }\n\n  return promise\n    .then(() => chmod(dest, stats.mode))\n}\n\nexport class FileCopier {\n  isUseHardLink: boolean\n\n  constructor(private readonly isUseHardLinkFunction?: ((file: string) => boolean) | null, private readonly transformer?: FileTransformer | null) {\n    if (isUseHardLinkFunction === USE_HARD_LINKS) {\n      this.isUseHardLink = true\n    }\n    else {\n      this.isUseHardLink = _isUseHardLink && isUseHardLinkFunction !== DO_NOT_USE_HARD_LINKS\n    }\n  }\n\n  async copy(src: string, dest: string, stat: Stats | undefined) {\n    let afterCopyTransformer: AfterCopyFileTransformer | null = null\n    if (this.transformer != null && stat != null && stat.isFile()) {\n      let data = this.transformer(src)\n      if (data != null) {\n        if (typeof data === \"object\" && \"then\" in data) {\n          data = await data\n        }\n\n        if (data != null) {\n          if (data instanceof CopyFileTransformer) {\n            afterCopyTransformer = data.afterCopyTransformer\n          }\n          else {\n            await writeFile(dest, data)\n            return\n          }\n        }\n      }\n    }\n\n    const isUseHardLink = afterCopyTransformer == null && ((!this.isUseHardLink || this.isUseHardLinkFunction == null) ? this.isUseHardLink : this.isUseHardLinkFunction(dest))\n    await copyOrLinkFile(src, dest, stat, isUseHardLink, isUseHardLink ? () => {\n      // files are copied concurrently, so, we must not check here currentIsUseHardLink â€” our code can be executed after that other handler will set currentIsUseHardLink to false\n      if (this.isUseHardLink) {\n        this.isUseHardLink = false\n        return true\n      }\n      else {\n        return false\n      }\n    } : null)\n\n    if (afterCopyTransformer != null) {\n      await afterCopyTransformer(dest)\n    }\n  }\n}\n\nexport interface CopyDirOptions {\n  filter?: Filter | null\n  transformer?: FileTransformer | null\n  isUseHardLink?: ((file: string) => boolean) | null\n}\n\n/**\n * Empty directories is never created.\n * Hard links is used if supported and allowed.\n */\nexport function copyDir(src: string, destination: string, options: CopyDirOptions = {}): Promise<any> {\n  const fileCopier = new FileCopier(options.isUseHardLink, options.transformer)\n\n  if (log.isDebugEnabled) {\n    log.debug({src, destination}, `copying${fileCopier.isUseHardLink ? \" using hard links\" : \"\"}`)\n  }\n\n  const createdSourceDirs = new Set<string>()\n  const links: Array<Link> = []\n  return walk(src, options.filter, {\n    consume: async (file, stat, parent) => {\n      if (!stat.isFile() && !stat.isSymbolicLink()) {\n        return\n      }\n\n      if (!createdSourceDirs.has(parent)) {\n        await ensureDir(parent.replace(src, destination))\n        createdSourceDirs.add(parent)\n      }\n\n      const destFile = file.replace(src, destination)\n      if (stat.isFile()) {\n        await fileCopier.copy(file, destFile, stat)\n      }\n      else {\n        links.push({file: destFile, link: await readlink(file)})\n      }\n    }\n  })\n    .then(() => BluebirdPromise.map(links, it => symlink(it.link, it.file), CONCURRENCY))\n}\n\nexport const DO_NOT_USE_HARD_LINKS = (file: string) => false\nexport const USE_HARD_LINKS = (file: string) => true\n\nexport interface Link {\n  readonly link: string,\n  readonly file: string\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.setPrinter = setPrinter;
exports.log = exports.Logger = exports.PADDING = exports.debug = void 0;

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

var _debug2 = _interopRequireDefault(require("debug"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

let printer = null;
const debug = (0, _debug2.default)("electron-builder");
exports.debug = debug;

function setPrinter(value) {
  printer = value;
}

const PADDING = 2;
exports.PADDING = PADDING;

class Logger {
  constructor(stream) {
    this.stream = stream;

    this.messageTransformer = it => it;
  }

  filePath(file) {
    const cwd = process.cwd();
    return file.startsWith(cwd) ? file.substring(cwd.length + 1) : file;
  } // noinspection JSMethodCanBeStatic


  get isDebugEnabled() {
    return debug.enabled;
  }

  info(messageOrFields, message) {
    this.doLog(message, messageOrFields, "info");
  }

  notice(messageOrFields, message) {
    this.doLog(message, messageOrFields, "notice");
  }

  warn(messageOrFields, message) {
    this.doLog(message, messageOrFields, "warn");
  }

  debug(fields, message) {
    if (debug.enabled) {
      this._doLog(message, fields, "debug");
    }
  }

  doLog(message, messageOrFields, level) {
    if (message === undefined) {
      this._doLog(messageOrFields, null, level);
    } else {
      this._doLog(message, messageOrFields, level);
    }
  }

  _doLog(message, fields, level) {
    // noinspection SuspiciousInstanceOfGuard
    if (message instanceof Error) {
      message = message.stack || message.toString();
    } else {
      message = message.toString();
    }

    const levelIndicator = level === "error" ? "â¨¯" : "â€¢";
    const color = LEVEL_TO_COLOR[level];
    this.stream.write(`${" ".repeat(PADDING)}${color(levelIndicator)} `);
    this.stream.write(Logger.createMessage(this.messageTransformer(message, level), fields, level, color, PADDING + 2
    /* level indicator and space */
    ));
    this.stream.write("\n");
  }

  static createMessage(message, fields, level, color, messagePadding = 0) {
    if (fields == null) {
      return message;
    }

    const fieldPadding = " ".repeat(Math.max(1, 16 - message.length));
    let text = message + fieldPadding;
    const fieldNames = Object.keys(fields);
    let counter = 0;

    for (const name of fieldNames) {
      let fieldValue = fields[name];
      let valuePadding = null;

      if (fieldValue != null && typeof fieldValue === "string" && fieldValue.includes("\n")) {
        valuePadding = " ".repeat(messagePadding + message.length + fieldPadding.length + 2);
        fieldValue = "\n" + valuePadding + fieldValue.replace(/\n/g, `\n${valuePadding}`);
      } else if (Array.isArray(fieldValue)) {
        fieldValue = JSON.stringify(fieldValue);
      } else if (Array.isArray(fieldValue)) {
        fieldValue = JSON.stringify(fieldValue);
      } else if (typeof fieldValue === "object") {// fieldValue = safeStringifyJson(fieldValue)
      }

      text += `${color(name)}=${fieldValue}`;

      if (++counter !== fieldNames.length) {
        if (valuePadding == null) {
          text += " ";
        } else {
          text += "\n" + valuePadding;
        }
      }
    }

    return text;
  }

  log(message) {
    if (printer == null) {
      this.stream.write(`${message}\n`);
    } else {
      printer(message);
    }
  }

}

exports.Logger = Logger;
const LEVEL_TO_COLOR = {
  info: _chalk().default.blue,
  notice: _chalk().default.yellow,
  warn: _chalk().default.yellow,
  debug: _chalk().default.white
};
const log = new Logger(process.stdout); exports.log = log;
// __ts-babel@6.0.4
//# sourceMappingURL=log.js.map{"version":3,"sources":["../src/log.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk, { Chalk } from \"chalk\"\nimport _debug from \"debug\"\nimport WritableStream = NodeJS.WritableStream\n\nlet printer: ((message: string) => void) | null = null\n\nexport const debug = _debug(\"electron-builder\")\n\nexport interface Fields {\n  [index: string]: any\n}\n\nexport function setPrinter(value: ((message: string) => void) | null) {\n  printer = value\n}\n\nexport type LogLevel = \"info\" | \"warn\" | \"debug\" | \"notice\" | \"error\"\n\nexport const PADDING = 2\n\nexport class Logger {\n  constructor(protected readonly stream: WritableStream) {\n  }\n\n  messageTransformer: ((message: string, level: LogLevel) => string) = it => it\n\n  filePath(file: string) {\n    const cwd = process.cwd()\n    return file.startsWith(cwd) ? file.substring(cwd.length + 1) : file\n  }\n\n  // noinspection JSMethodCanBeStatic\n  get isDebugEnabled() {\n    return debug.enabled\n  }\n\n  info(messageOrFields: Fields | null | string, message?: string) {\n    this.doLog(message, messageOrFields, \"info\")\n  }\n\n  notice(messageOrFields: Fields | null | string, message?: string): void {\n    this.doLog(message, messageOrFields, \"notice\")\n  }\n\n  warn(messageOrFields: Fields | null | string, message?: string): void {\n    this.doLog(message, messageOrFields, \"warn\")\n  }\n\n  debug(fields: Fields | null, message: string) {\n    if (debug.enabled) {\n      this._doLog(message, fields, \"debug\")\n    }\n  }\n\n  private doLog(message: string | undefined | Error, messageOrFields: Fields | null | string, level: LogLevel) {\n    if (message === undefined) {\n      this._doLog(messageOrFields as string, null, level)\n    }\n    else {\n      this._doLog(message, messageOrFields as Fields | null, level)\n    }\n  }\n\n  private _doLog(message: string | Error, fields: Fields | null, level: LogLevel) {\n    // noinspection SuspiciousInstanceOfGuard\n    if (message instanceof Error) {\n      message = message.stack || message.toString()\n    }\n    else {\n      message = message.toString()\n    }\n\n    const levelIndicator = level === \"error\" ? \"â¨¯\" : \"â€¢\"\n    const color = LEVEL_TO_COLOR[level]\n    this.stream.write(`${\" \".repeat(PADDING)}${color(levelIndicator)} `)\n    this.stream.write(Logger.createMessage(this.messageTransformer(message, level), fields, level, color, PADDING + 2 /* level indicator and space */))\n    this.stream.write(\"\\n\")\n  }\n\n  static createMessage(message: string, fields: Fields | null, level: LogLevel, color: (it: string) => string, messagePadding = 0): string {\n    if (fields == null) {\n      return message\n    }\n\n    const fieldPadding = \" \".repeat(Math.max(1, 16 - message.length))\n    let text = message + fieldPadding\n    const fieldNames = Object.keys(fields)\n    let counter = 0\n    for (const name of fieldNames) {\n      let fieldValue = fields[name]\n      let valuePadding: string | null = null\n      if (fieldValue != null && typeof fieldValue === \"string\" && fieldValue.includes(\"\\n\")) {\n        valuePadding = \" \".repeat(messagePadding + message.length + fieldPadding.length + 2)\n        fieldValue = \"\\n\" + valuePadding + fieldValue.replace(/\\n/g, `\\n${valuePadding}`)\n      }\n      else if (Array.isArray(fieldValue)) {\n        fieldValue = JSON.stringify(fieldValue)\n      }\n      else if (Array.isArray(fieldValue)) {\n        fieldValue = JSON.stringify(fieldValue)\n      }\n      else if (typeof fieldValue === \"object\") {\n        // fieldValue = safeStringifyJson(fieldValue)\n      }\n\n      text += `${color(name)}=${fieldValue}`\n      if (++counter !== fieldNames.length) {\n        if (valuePadding == null) {\n          text += \" \"\n        }\n        else {\n          text += \"\\n\" + valuePadding\n        }\n      }\n    }\n    return text\n  }\n\n  log(message: string): void {\n    if (printer == null) {\n      this.stream.write(`${message}\\n`)\n    }\n    else {\n      printer(message)\n    }\n  }\n}\n\nconst LEVEL_TO_COLOR: { [index: string]: Chalk } = {\n  info: chalk.blue,\n  notice: chalk.yellow,\n  warn: chalk.yellow,\n  debug: chalk.white,\n}\n\nexport const log = new Logger(process.stdout)"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.httpExecutor = exports.NodeHttpExecutor = void 0;

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _http() {
  const data = require("http");

  _http = function () {
    return data;
  };

  return data;
}

function https() {
  const data = _interopRequireWildcard(require("https"));

  https = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class NodeHttpExecutor extends _builderUtilRuntime().HttpExecutor {
  // noinspection JSMethodCanBeStatic
  // noinspection JSUnusedGlobalSymbols
  createRequest(options, callback) {
    return (options.protocol === "http:" ? _http().request : https().request)(options, callback);
  }

}

exports.NodeHttpExecutor = NodeHttpExecutor;
const httpExecutor = new NodeHttpExecutor(); exports.httpExecutor = httpExecutor;
// __ts-babel@6.0.4
//# sourceMappingURL=nodeHttpExecutor.js.map{"version":3,"sources":["../src/nodeHttpExecutor.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEM,MAAO,gBAAP,SAAgC,kCAAhC,CAA2D;AAC/D;AACA;AACA,EAAA,aAAa,CAAC,OAAD,EAAe,QAAf,EAAgD;AAC3D,WAAO,CAAC,OAAO,CAAC,QAAR,KAAqB,OAArB,GAA+B,eAA/B,GAA6C,KAAK,GAAC,OAApD,EAA6D,OAA7D,EAAsE,QAAtE,CAAP;AACD;;AAL8D;;;AAQ1D,MAAM,YAAY,GAAG,IAAI,gBAAJ,EAArB,C","sourcesContent":["import { HttpExecutor } from \"builder-util-runtime\"\nimport { ClientRequest, request as httpRequest } from \"http\"\nimport * as https from \"https\"\n\nexport class NodeHttpExecutor extends HttpExecutor<ClientRequest> {\n  // noinspection JSMethodCanBeStatic\n  // noinspection JSUnusedGlobalSymbols\n  createRequest(options: any, callback: (response: any) => void): any {\n    return (options.protocol === \"http:\" ? httpRequest : https.request)(options, callback)\n  }\n}\n\nexport const httpExecutor = new NodeHttpExecutor()"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.printErrorAndExit = printErrorAndExit;
exports.executeFinally = executeFinally;
exports.orNullIfFileNotExist = orNullIfFileNotExist;
exports.orIfFileNotExist = orIfFileNotExist;
exports.NestedError = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function printErrorAndExit(error) {
  console.error(_chalk().default.red((error.stack || error).toString()));
  process.exit(1);
} // you don't need to handle error in your task - it is passed only indicate status of promise


function executeFinally(_x, _x2) {
  return _executeFinally.apply(this, arguments);
}

function _executeFinally() {
  _executeFinally = (0, _bluebirdLst().coroutine)(function* (promise, task) {
    let result = null;

    try {
      result = yield promise;
    } catch (originalError) {
      try {
        yield task(true);
      } catch (taskError) {
        throw new NestedError([originalError, taskError]);
      }

      throw originalError;
    }

    yield task(false);
    return result;
  });
  return _executeFinally.apply(this, arguments);
}

class NestedError extends Error {
  constructor(errors, message = "Compound error: ") {
    let m = message;
    let i = 1;

    for (const error of errors) {
      const prefix = `Error #${i++} `;
      m += "\n\n" + prefix + "-".repeat(80) + "\n" + error.stack;
    }

    super(m);
  }

}

exports.NestedError = NestedError;

function orNullIfFileNotExist(promise) {
  return orIfFileNotExist(promise, null);
}

function orIfFileNotExist(promise, fallbackValue) {
  return promise.catch(e => {
    if (e.code === "ENOENT" || e.code === "ENOTDIR") {
      return fallbackValue;
    }

    throw e;
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=promise.js.map{"version":3,"sources":["../src/promise.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEM,SAAU,iBAAV,CAA4B,KAA5B,EAAwC;AAC5C,EAAA,OAAO,CAAC,KAAR,CAAc,iBAAM,GAAN,CAAU,CAAC,KAAK,CAAC,KAAN,IAAe,KAAhB,EAAuB,QAAvB,EAAV,CAAd;AACA,EAAA,OAAO,CAAC,IAAR,CAAa,CAAb;AACD,C,CAED;;;SACsB,c;;;;;kDAAf,WAAiC,OAAjC,EAAsD,IAAtD,EAAsG;AAC3G,QAAI,MAAM,GAAa,IAAvB;;AACA,QAAI;AACF,MAAA,MAAM,SAAS,OAAf;AACD,KAFD,CAGA,OAAO,aAAP,EAAsB;AACpB,UAAI;AACF,cAAM,IAAI,CAAC,IAAD,CAAV;AACD,OAFD,CAGA,OAAO,SAAP,EAAkB;AAChB,cAAM,IAAI,WAAJ,CAAgB,CAAC,aAAD,EAAgB,SAAhB,CAAhB,CAAN;AACD;;AAED,YAAM,aAAN;AACD;;AAED,UAAM,IAAI,CAAC,KAAD,CAAV;AACA,WAAO,MAAP;AACD,G;;;;AAEK,MAAO,WAAP,SAA2B,KAA3B,CAAgC;AACpC,EAAA,WAAA,CAAY,MAAZ,EAAkC,OAAA,GAAkB,kBAApD,EAAsE;AACpE,QAAI,CAAC,GAAG,OAAR;AACA,QAAI,CAAC,GAAG,CAAR;;AACA,SAAK,MAAM,KAAX,IAAoB,MAApB,EAA4B;AAC1B,YAAM,MAAM,GAAG,UAAU,CAAC,EAAE,GAA5B;AACA,MAAA,CAAC,IAAI,SAAS,MAAT,GAAkB,IAAI,MAAJ,CAAW,EAAX,CAAlB,GAAmC,IAAnC,GAA0C,KAAM,CAAC,KAAtD;AACD;;AACD,UAAM,CAAN;AACD;;AATmC;;;;AAYhC,SAAU,oBAAV,CAAkC,OAAlC,EAAqD;AACzD,SAAO,gBAAgB,CAAC,OAAD,EAAU,IAAV,CAAvB;AACD;;AAEK,SAAU,gBAAV,CAA8B,OAA9B,EAAmD,aAAnD,EAAmE;AACvE,SAAO,OAAO,CACX,KADI,CACE,CAAC,IAAG;AACT,QAAI,CAAC,CAAC,IAAF,KAAW,QAAX,IAAuB,CAAC,CAAC,IAAF,KAAW,SAAtC,EAAiD;AAC/C,aAAO,aAAP;AACD;;AACD,UAAM,CAAN;AACD,GANI,CAAP;AAOD,C","sourcesContent":["import chalk from \"chalk\"\n\nexport function printErrorAndExit(error: Error) {\n  console.error(chalk.red((error.stack || error).toString()))\n  process.exit(1)\n}\n\n// you don't need to handle error in your task - it is passed only indicate status of promise\nexport async function executeFinally<T>(promise: Promise<T>, task: (isErrorOccurred: boolean) => Promise<any>): Promise<T> {\n  let result: T | null = null\n  try {\n    result = await promise\n  }\n  catch (originalError) {\n    try {\n      await task(true)\n    }\n    catch (taskError) {\n      throw new NestedError([originalError, taskError])\n    }\n\n    throw originalError\n  }\n\n  await task(false)\n  return result\n}\n\nexport class NestedError extends Error {\n  constructor(errors: Array<Error>, message: string = \"Compound error: \") {\n    let m = message\n    let i = 1\n    for (const error of errors) {\n      const prefix = `Error #${i++} `\n      m += \"\\n\\n\" + prefix + \"-\".repeat(80) + \"\\n\" + error!.stack\n    }\n    super(m)\n  }\n}\n\nexport function orNullIfFileNotExist<T>(promise: Promise<T>): Promise<T | null> {\n  return orIfFileNotExist(promise, null)\n}\n\nexport function orIfFileNotExist<T>(promise: Promise<T>, fallbackValue: T): Promise<T> {\n  return promise\n    .catch(e => {\n      if (e.code === \"ENOENT\" || e.code === \"ENOTDIR\") {\n        return fallbackValue\n      }\n      throw e\n    })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.serializeToYaml = serializeToYaml;
exports.removePassword = removePassword;
exports.exec = exec;
exports.doSpawn = doSpawn;
exports.spawnAndWrite = spawnAndWrite;
exports.spawn = spawn;
exports.use = use;
exports.isEmptyOrSpaces = isEmptyOrSpaces;
exports.isTokenCharValid = isTokenCharValid;
exports.addValue = addValue;
exports.replaceDefault = replaceDefault;
exports.getPlatformIconFileName = getPlatformIconFileName;
exports.isPullRequest = isPullRequest;
exports.isEnvTrue = isEnvTrue;
exports.executeAppBuilder = executeAppBuilder;
Object.defineProperty(exports, "safeStringifyJson", {
  enumerable: true,
  get: function () {
    return _builderUtilRuntime().safeStringifyJson;
  }
});
Object.defineProperty(exports, "asArray", {
  enumerable: true,
  get: function () {
    return _builderUtilRuntime().asArray;
  }
});
Object.defineProperty(exports, "log", {
  enumerable: true,
  get: function () {
    return _log().log;
  }
});
Object.defineProperty(exports, "debug", {
  enumerable: true,
  get: function () {
    return _log().debug;
  }
});
Object.defineProperty(exports, "TmpDir", {
  enumerable: true,
  get: function () {
    return _tempFile().TmpDir;
  }
});
Object.defineProperty(exports, "Arch", {
  enumerable: true,
  get: function () {
    return _arch().Arch;
  }
});
Object.defineProperty(exports, "getArchCliNames", {
  enumerable: true,
  get: function () {
    return _arch().getArchCliNames;
  }
});
Object.defineProperty(exports, "toLinuxArchString", {
  enumerable: true,
  get: function () {
    return _arch().toLinuxArchString;
  }
});
Object.defineProperty(exports, "getArchSuffix", {
  enumerable: true,
  get: function () {
    return _arch().getArchSuffix;
  }
});
Object.defineProperty(exports, "archFromString", {
  enumerable: true,
  get: function () {
    return _arch().archFromString;
  }
});
Object.defineProperty(exports, "AsyncTaskManager", {
  enumerable: true,
  get: function () {
    return _asyncTaskManager().AsyncTaskManager;
  }
});
Object.defineProperty(exports, "DebugLogger", {
  enumerable: true,
  get: function () {
    return _DebugLogger().DebugLogger;
  }
});
Object.defineProperty(exports, "copyFile", {
  enumerable: true,
  get: function () {
    return _fs().copyFile;
  }
});
Object.defineProperty(exports, "deepAssign", {
  enumerable: true,
  get: function () {
    return _deepAssign().deepAssign;
  }
});
exports.InvalidConfigurationError = exports.debug7z = void 0;

function _zipBin() {
  const data = require("7zip-bin");

  _zipBin = function () {
    return data;
  };

  return data;
}

function _appBuilderBin() {
  const data = require("app-builder-bin");

  _appBuilderBin = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

function _child_process() {
  const data = require("child_process");

  _child_process = function () {
    return data;
  };

  return data;
}

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

var _debug2 = _interopRequireDefault(require("debug"));

function _jsYaml() {
  const data = require("js-yaml");

  _jsYaml = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

require("source-map-support/register");

function _log() {
  const data = require("./log");

  _log = function () {
    return data;
  };

  return data;
}

function _isCi() {
  const data = _interopRequireDefault(require("is-ci"));

  _isCi = function () {
    return data;
  };

  return data;
}

function _tempFile() {
  const data = require("temp-file");

  _tempFile = function () {
    return data;
  };

  return data;
}

function _arch() {
  const data = require("./arch");

  _arch = function () {
    return data;
  };

  return data;
}

function _asyncTaskManager() {
  const data = require("./asyncTaskManager");

  _asyncTaskManager = function () {
    return data;
  };

  return data;
}

function _DebugLogger() {
  const data = require("./DebugLogger");

  _DebugLogger = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("./fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _deepAssign() {
  const data = require("./deepAssign");

  _deepAssign = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const debug7z = (0, _debug2.default)("electron-builder:7z");
exports.debug7z = debug7z;

function serializeToYaml(object, skipInvalid = false, noRefs = false) {
  return (0, _jsYaml().safeDump)(object, {
    lineWidth: 8000,
    skipInvalid,
    noRefs
  });
}

function removePassword(input) {
  return input.replace(/(-String |-P |pass:| \/p |-pass |--secretKey |--accessKey )([^ ]+)/g, (match, p1, p2) => {
    if (p1.trim() === "/p" && p2.startsWith("\\\\Mac\\Host\\\\")) {
      // appx /p
      return `${p1}${p2}`;
    }

    return `${p1}${(0, _crypto().createHash)("sha256").update(p2).digest("hex")} (sha256 hash)`;
  });
}

function getProcessEnv(env) {
  if (process.platform === "win32") {
    return env == null ? undefined : env;
  }

  const finalEnv = Object.assign({}, env || process.env); // without LC_CTYPE dpkg can returns encoded unicode symbols
  // set LC_CTYPE to avoid crash https://github.com/electron-userland/electron-builder/issues/503 Even "en_DE.UTF-8" leads to error.

  const locale = process.platform === "linux" ? process.env.LANG || "C.UTF-8" : "en_US.UTF-8";
  finalEnv.LANG = locale;
  finalEnv.LC_CTYPE = locale;
  finalEnv.LC_ALL = locale;
  return finalEnv;
}

function exec(file, args, options, isLogOutIfDebug = true) {
  if (_log().log.isDebugEnabled) {
    const logFields = {
      file,
      args: args == null ? "" : removePassword(args.join(" "))
    };

    if (options != null) {
      if (options.cwd != null) {
        logFields.cwd = options.cwd;
      }

      if (options.env != null) {
        const diffEnv = Object.assign({}, options.env);

        for (const name of Object.keys(process.env)) {
          if (process.env[name] === options.env[name]) {
            delete diffEnv[name];
          }
        }

        logFields.env = (0, _builderUtilRuntime().safeStringifyJson)(diffEnv);
      }
    }

    _log().log.debug(logFields, "executing");
  }

  return new Promise((resolve, reject) => {
    (0, _child_process().execFile)(file, args, Object.assign({}, options, {
      maxBuffer: 1000 * 1024 * 1024,
      env: getProcessEnv(options == null ? null : options.env)
    }), (error, stdout, stderr) => {
      if (error == null) {
        if (isLogOutIfDebug && _log().log.isDebugEnabled) {
          const logFields = {
            file
          };

          if (stdout.length > 0) {
            logFields.stdout = stdout;
          }

          if (stderr.length > 0) {
            logFields.stderr = stderr;
          }

          _log().log.debug(logFields, "executed");
        }

        resolve(stdout.toString());
      } else {
        let message = _chalk().default.red(removePassword(`Exit code: ${error.code}. ${error.message}`));

        if (stdout.length !== 0) {
          if (file.endsWith("wine")) {
            stdout = stdout.toString();
          }

          message += `\n${_chalk().default.yellow(stdout.toString())}`;
        }

        if (stderr.length !== 0) {
          if (file.endsWith("wine")) {
            stderr = stderr.toString();
          }

          message += `\n${_chalk().default.red(stderr.toString())}`;
        }

        reject(new Error(message));
      }
    });
  });
}

function logSpawn(command, args, options) {
  // use general debug.enabled to log spawn, because it doesn't produce a lot of output (the only line), but important in any case
  if (!_log().log.isDebugEnabled) {
    return;
  }

  const argsString = removePassword(args.join(" "));
  const logFields = {
    command: command + " " + (command === "docker" ? argsString : removePassword(argsString))
  };

  if (options != null && options.cwd != null) {
    logFields.cwd = options.cwd;
  }

  _log().log.debug(logFields, "spawning");
}

function doSpawn(command, args, options, extraOptions) {
  if (options == null) {
    options = {};
  }

  options.env = getProcessEnv(options.env);

  if (options.stdio == null) {
    const isDebugEnabled = _log().debug.enabled; // do not ignore stdout/stderr if not debug, because in this case we will read into buffer and print on error


    options.stdio = [extraOptions != null && extraOptions.isPipeInput ? "pipe" : "ignore", isDebugEnabled ? "inherit" : "pipe", isDebugEnabled ? "inherit" : "pipe"];
  }

  logSpawn(command, args, options);

  try {
    return (0, _child_process().spawn)(command, args, options);
  } catch (e) {
    throw new Error(`Cannot spawn ${command}: ${e.stack || e}`);
  }
}

function spawnAndWrite(command, args, data, options) {
  const childProcess = doSpawn(command, args, options, {
    isPipeInput: true
  });
  const timeout = setTimeout(() => childProcess.kill(), 4 * 60 * 1000);
  return new Promise((resolve, reject) => {
    handleProcess("close", childProcess, command, () => {
      try {
        clearTimeout(timeout);
      } finally {
        resolve();
      }
    }, error => {
      try {
        clearTimeout(timeout);
      } finally {
        reject(error.stack || error.toString());
      }
    });
    childProcess.stdin.end(data);
  });
}

function spawn(command, args, options, extraOptions) {
  return new Promise((resolve, reject) => {
    handleProcess("close", doSpawn(command, args || [], options, extraOptions), command, resolve, reject);
  });
}

function handleProcess(event, childProcess, command, resolve, reject) {
  childProcess.on("error", reject);
  let out = "";

  if (childProcess.stdout != null) {
    childProcess.stdout.on("data", data => {
      out += data;
    });
  }

  let errorOut = "";

  if (childProcess.stderr != null) {
    childProcess.stderr.on("data", data => {
      errorOut += data;
    });
  }

  childProcess.once(event, code => {
    if (_log().log.isDebugEnabled) {
      const fields = {
        command: path.basename(command),
        code,
        pid: childProcess.pid
      };

      if (out.length > 0) {
        fields.out = out;
      }

      _log().log.debug(fields, "exited");
    }

    if (code === 0) {
      if (resolve != null) {
        resolve(out);
      }
    } else {
      function formatOut(text, title) {
        return text.length === 0 ? "" : `\n${title}:\n${text}`;
      }

      reject(new Error(`${command} exited with code ${code}${formatOut(out, "Output")}${formatOut(errorOut, "Error output")}`));
    }
  });
}

function use(value, task) {
  return value == null ? null : task(value);
}

function isEmptyOrSpaces(s) {
  return s == null || s.trim().length === 0;
}

function isTokenCharValid(token) {
  return /^[\w\/=+-]+$/.test(token);
}

function addValue(map, key, value) {
  const list = map.get(key);

  if (list == null) {
    map.set(key, [value]);
  } else if (!list.includes(value)) {
    list.push(value);
  }
}

function replaceDefault(inList, defaultList) {
  if (inList == null || inList.length === 1 && inList[0] === "default") {
    return defaultList;
  }

  const index = inList.indexOf("default");

  if (index >= 0) {
    const list = inList.slice(0, index);
    list.push(...defaultList);

    if (index !== inList.length - 1) {
      list.push(...inList.slice(index + 1));
    }

    inList = list;
  }

  return inList;
}

function getPlatformIconFileName(value, isMac) {
  if (value === undefined) {
    return undefined;
  }

  if (value === null) {
    return null;
  }

  if (!value.includes(".")) {
    return `${value}.${isMac ? "icns" : "ico"}`;
  }

  return value.replace(isMac ? ".ico" : ".icns", isMac ? ".icns" : ".ico");
}

function isPullRequest() {
  // TRAVIS_PULL_REQUEST is set to the pull request number if the current job is a pull request build, or false if itâ€™s not.
  function isSet(value) {
    // value can be or null, or empty string
    return value && value !== "false";
  }

  return isSet(process.env.TRAVIS_PULL_REQUEST) || isSet(process.env.CI_PULL_REQUEST) || isSet(process.env.CI_PULL_REQUESTS) || isSet(process.env.BITRISE_PULL_REQUEST) || isSet(process.env.APPVEYOR_PULL_REQUEST_NUMBER);
}

function isEnvTrue(value) {
  if (value != null) {
    value = value.trim();
  }

  return value === "true" || value === "" || value === "1";
}

class InvalidConfigurationError extends Error {
  constructor(message, code = "ERR_ELECTRON_BUILDER_INVALID_CONFIGURATION") {
    super(message);
    this.code = code;
  }

}

exports.InvalidConfigurationError = InvalidConfigurationError;

function executeAppBuilder(args, childProcessConsumer, extraOptions = {}) {
  return new Promise((resolve, reject) => {
    const command = _appBuilderBin().appBuilderPath;

    const env = Object.assign({
      // before process.env to allow customize by user
      SNAP_USE_HARD_LINKS_IF_POSSIBLE: _isCi().default.toString()
    }, process.env, {
      SZA_PATH: _zipBin().path7za,
      FORCE_COLOR: _chalk().default.enabled ? "1" : "0"
    });
    const cacheEnv = process.env.ELECTRON_BUILDER_CACHE;

    if (cacheEnv != null && cacheEnv.length > 0) {
      env.ELECTRON_BUILDER_CACHE = path.resolve(cacheEnv);
    }

    if (extraOptions.env != null) {
      Object.assign(env, extraOptions.env);
    }

    const childProcess = doSpawn(command, args, Object.assign({}, extraOptions, {
      env,
      stdio: ["ignore", "pipe", process.stdout]
    }));

    if (childProcessConsumer != null) {
      childProcessConsumer(childProcess);
    }

    handleProcess("close", childProcess, command, resolve, reject);
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=util.js.map{"version":3,"sources":["../src/util.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AACA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;AAEO,MAAM,OAAO,GAAG,qBAAO,qBAAP,CAAhB;;;AAED,SAAU,eAAV,CAA0B,MAA1B,EAA0C,WAAW,GAAG,KAAxD,EAA+D,MAAM,GAAG,KAAxE,EAA6E;AACjF,SAAO,wBAAS,MAAT,EAAiB;AACtB,IAAA,SAAS,EAAE,IADW;AAEtB,IAAA,WAFsB;AAGtB,IAAA;AAHsB,GAAjB,CAAP;AAKD;;AAEK,SAAU,cAAV,CAAyB,KAAzB,EAAsC;AAC1C,SAAO,KAAK,CAAC,OAAN,CAAc,qEAAd,EAAqF,CAAC,KAAD,EAAQ,EAAR,EAAY,EAAZ,KAAkB;AAC5G,QAAI,EAAE,CAAC,IAAH,OAAc,IAAd,IAAsB,EAAE,CAAC,UAAH,CAAc,mBAAd,CAA1B,EAA8D;AAC5D;AACA,aAAO,GAAG,EAAE,GAAG,EAAE,EAAjB;AACD;;AACD,WAAO,GAAG,EAAE,GAAG,0BAAW,QAAX,EAAqB,MAArB,CAA4B,EAA5B,EAAgC,MAAhC,CAAuC,KAAvC,CAA6C,gBAA5D;AACD,GANM,CAAP;AAOD;;AAED,SAAS,aAAT,CAAuB,GAAvB,EAAoF;AAClF,MAAI,OAAO,CAAC,QAAR,KAAqB,OAAzB,EAAkC;AAChC,WAAO,GAAG,IAAI,IAAP,GAAc,SAAd,GAA0B,GAAjC;AACD;;AAED,QAAM,QAAQ,GAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACR,GAAG,IAAI,OAAO,CAAC,GADP,CAAd,CALkF,CASlF;AACA;;AACA,QAAM,MAAM,GAAG,OAAO,CAAC,QAAR,KAAqB,OAArB,GAAgC,OAAO,CAAC,GAAR,CAAY,IAAZ,IAAoB,SAApD,GAAiE,aAAhF;AACA,EAAA,QAAQ,CAAC,IAAT,GAAgB,MAAhB;AACA,EAAA,QAAQ,CAAC,QAAT,GAAoB,MAApB;AACA,EAAA,QAAQ,CAAC,MAAT,GAAkB,MAAlB;AACA,SAAO,QAAP;AACD;;AAEK,SAAU,IAAV,CAAe,IAAf,EAA6B,IAA7B,EAA0D,OAA1D,EAAqF,eAAe,GAAG,IAAvG,EAA2G;AAC/G,MAAI,WAAI,cAAR,EAAwB;AACtB,UAAM,SAAS,GAAQ;AACrB,MAAA,IADqB;AAErB,MAAA,IAAI,EAAE,IAAI,IAAI,IAAR,GAAe,EAAf,GAAoB,cAAc,CAAC,IAAI,CAAC,IAAL,CAAU,GAAV,CAAD;AAFnB,KAAvB;;AAIA,QAAI,OAAO,IAAI,IAAf,EAAqB;AACnB,UAAI,OAAO,CAAC,GAAR,IAAe,IAAnB,EAAyB;AACvB,QAAA,SAAS,CAAC,GAAV,GAAgB,OAAO,CAAC,GAAxB;AACD;;AAED,UAAI,OAAO,CAAC,GAAR,IAAe,IAAnB,EAAyB;AACvB,cAAM,OAAO,GAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAO,OAAO,CAAC,GAAf,CAAb;;AACA,aAAK,MAAM,IAAX,IAAmB,MAAM,CAAC,IAAP,CAAY,OAAO,CAAC,GAApB,CAAnB,EAA6C;AAC3C,cAAI,OAAO,CAAC,GAAR,CAAY,IAAZ,MAAsB,OAAO,CAAC,GAAR,CAAY,IAAZ,CAA1B,EAA6C;AAC3C,mBAAO,OAAO,CAAC,IAAD,CAAd;AACD;AACF;;AACD,QAAA,SAAS,CAAC,GAAV,GAAgB,6CAAkB,OAAlB,CAAhB;AACD;AACF;;AAED,eAAI,KAAJ,CAAU,SAAV,EAAqB,WAArB;AACD;;AAED,SAAO,IAAI,OAAJ,CAAoB,CAAC,OAAD,EAAU,MAAV,KAAoB;AAC7C,mCAAS,IAAT,EAAe,IAAf,EAAmB,MAAA,CAAA,MAAA,CAAA,EAAA,EAChB,OADgB,EACT;AACV,MAAA,SAAS,EAAE,OAAO,IAAP,GAAc,IADf;AAEV,MAAA,GAAG,EAAE,aAAa,CAAC,OAAO,IAAI,IAAX,GAAkB,IAAlB,GAAyB,OAAO,CAAC,GAAlC;AAFR,KADS,CAAnB,EAIC,CAAC,KAAD,EAAQ,MAAR,EAAgB,MAAhB,KAA0B;AACzB,UAAI,KAAK,IAAI,IAAb,EAAmB;AACjB,YAAI,eAAe,IAAI,WAAI,cAA3B,EAA2C;AACzC,gBAAM,SAAS,GAAQ;AACrB,YAAA;AADqB,WAAvB;;AAGA,cAAI,MAAM,CAAC,MAAP,GAAgB,CAApB,EAAuB;AACrB,YAAA,SAAS,CAAC,MAAV,GAAmB,MAAnB;AACD;;AACD,cAAI,MAAM,CAAC,MAAP,GAAgB,CAApB,EAAuB;AACrB,YAAA,SAAS,CAAC,MAAV,GAAmB,MAAnB;AACD;;AAED,qBAAI,KAAJ,CAAU,SAAV,EAAqB,UAArB;AACD;;AACD,QAAA,OAAO,CAAC,MAAM,CAAC,QAAP,EAAD,CAAP;AACD,OAfD,MAgBK;AACH,YAAI,OAAO,GAAG,iBAAM,GAAN,CAAU,cAAc,CAAC,cAAe,KAAa,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAApD,CAAxB,CAAd;;AACA,YAAI,MAAM,CAAC,MAAP,KAAkB,CAAtB,EAAyB;AACvB,cAAI,IAAI,CAAC,QAAL,CAAc,MAAd,CAAJ,EAA2B;AACzB,YAAA,MAAM,GAAG,MAAM,CAAC,QAAP,EAAT;AACD;;AACD,UAAA,OAAO,IAAI,KAAK,iBAAM,MAAN,CAAa,MAAM,CAAC,QAAP,EAAb,CAA+B,EAA/C;AACD;;AACD,YAAI,MAAM,CAAC,MAAP,KAAkB,CAAtB,EAAyB;AACvB,cAAI,IAAI,CAAC,QAAL,CAAc,MAAd,CAAJ,EAA2B;AACzB,YAAA,MAAM,GAAG,MAAM,CAAC,QAAP,EAAT;AACD;;AACD,UAAA,OAAO,IAAI,KAAK,iBAAM,GAAN,CAAU,MAAM,CAAC,QAAP,EAAV,CAA4B,EAA5C;AACD;;AAED,QAAA,MAAM,CAAC,IAAI,KAAJ,CAAU,OAAV,CAAD,CAAN;AACD;AACF,KAtCD;AAuCD,GAxCM,CAAP;AAyCD;;AAMD,SAAS,QAAT,CAAkB,OAAlB,EAAmC,IAAnC,EAAwD,OAAxD,EAA6E;AAC3E;AACA,MAAI,CAAC,WAAI,cAAT,EAAyB;AACvB;AACD;;AAED,QAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,IAAL,CAAU,GAAV,CAAD,CAAjC;AACA,QAAM,SAAS,GAAQ;AACrB,IAAA,OAAO,EAAE,OAAO,GAAG,GAAV,IAAiB,OAAO,KAAK,QAAZ,GAAuB,UAAvB,GAAoC,cAAc,CAAC,UAAD,CAAnE;AADY,GAAvB;;AAGA,MAAI,OAAO,IAAI,IAAX,IAAmB,OAAO,CAAC,GAAR,IAAe,IAAtC,EAA4C;AAC1C,IAAA,SAAS,CAAC,GAAV,GAAgB,OAAO,CAAC,GAAxB;AACD;;AACD,aAAI,KAAJ,CAAU,SAAV,EAAqB,UAArB;AACD;;AAEK,SAAU,OAAV,CAAkB,OAAlB,EAAmC,IAAnC,EAAwD,OAAxD,EAAgF,YAAhF,EAAgH;AACpH,MAAI,OAAO,IAAI,IAAf,EAAqB;AACnB,IAAA,OAAO,GAAG,EAAV;AACD;;AAED,EAAA,OAAO,CAAC,GAAR,GAAc,aAAa,CAAC,OAAO,CAAC,GAAT,CAA3B;;AAEA,MAAI,OAAO,CAAC,KAAR,IAAiB,IAArB,EAA2B;AACzB,UAAM,cAAc,GAAG,aAAM,OAA7B,CADyB,CAEzB;;;AACA,IAAA,OAAO,CAAC,KAAR,GAAgB,CAAC,YAAY,IAAI,IAAhB,IAAwB,YAAY,CAAC,WAArC,GAAmD,MAAnD,GAA4D,QAA7D,EAAuE,cAAc,GAAG,SAAH,GAAe,MAApG,EAA4G,cAAc,GAAG,SAAH,GAAe,MAAzI,CAAhB;AACD;;AAED,EAAA,QAAQ,CAAC,OAAD,EAAU,IAAV,EAAgB,OAAhB,CAAR;;AACA,MAAI;AACF,WAAO,4BAAO,OAAP,EAAgB,IAAhB,EAAsB,OAAtB,CAAP;AACD,GAFD,CAGA,OAAO,CAAP,EAAU;AACR,UAAM,IAAI,KAAJ,CAAU,gBAAgB,OAAO,KAAK,CAAC,CAAC,KAAF,IAAW,CAAC,EAAlD,CAAN;AACD;AACF;;AAEK,SAAU,aAAV,CAAwB,OAAxB,EAAyC,IAAzC,EAA8D,IAA9D,EAA4E,OAA5E,EAAkG;AACtG,QAAM,YAAY,GAAG,OAAO,CAAC,OAAD,EAAU,IAAV,EAAgB,OAAhB,EAAyB;AAAC,IAAA,WAAW,EAAE;AAAd,GAAzB,CAA5B;AACA,QAAM,OAAO,GAAG,UAAU,CAAC,MAAM,YAAY,CAAC,IAAb,EAAP,EAA4B,IAAI,EAAJ,GAAS,IAArC,CAA1B;AACA,SAAO,IAAI,OAAJ,CAAiB,CAAC,OAAD,EAAU,MAAV,KAAoB;AAC1C,IAAA,aAAa,CAAC,OAAD,EAAU,YAAV,EAAwB,OAAxB,EAAiC,MAAK;AACjD,UAAI;AACF,QAAA,YAAY,CAAC,OAAD,CAAZ;AACD,OAFD,SAGQ;AACN,QAAA,OAAO;AACR;AACF,KAPY,EAOV,KAAK,IAAG;AACT,UAAI;AACF,QAAA,YAAY,CAAC,OAAD,CAAZ;AACD,OAFD,SAGQ;AACN,QAAA,MAAM,CAAC,KAAK,CAAC,KAAN,IAAe,KAAK,CAAC,QAAN,EAAhB,CAAN;AACD;AACF,KAdY,CAAb;AAgBA,IAAA,YAAY,CAAC,KAAb,CAAqB,GAArB,CAAyB,IAAzB;AACD,GAlBM,CAAP;AAmBD;;AAEK,SAAU,KAAV,CAAgB,OAAhB,EAAiC,IAAjC,EAA8D,OAA9D,EAAsF,YAAtF,EAAsH;AAC1H,SAAO,IAAI,OAAJ,CAAiB,CAAC,OAAD,EAAU,MAAV,KAAoB;AAC1C,IAAA,aAAa,CAAC,OAAD,EAAU,OAAO,CAAC,OAAD,EAAU,IAAI,IAAI,EAAlB,EAAsB,OAAtB,EAA+B,YAA/B,CAAjB,EAA+D,OAA/D,EAAwE,OAAxE,EAAiF,MAAjF,CAAb;AACD,GAFM,CAAP;AAGD;;AAED,SAAS,aAAT,CAAuB,KAAvB,EAAsC,YAAtC,EAAkE,OAAlE,EAAmF,OAAnF,EAA4H,MAA5H,EAA0J;AACxJ,EAAA,YAAY,CAAC,EAAb,CAAgB,OAAhB,EAAyB,MAAzB;AAEA,MAAI,GAAG,GAAG,EAAV;;AACA,MAAI,YAAY,CAAC,MAAb,IAAuB,IAA3B,EAAiC;AAC/B,IAAA,YAAY,CAAC,MAAb,CAAoB,EAApB,CAAuB,MAAvB,EAAgC,IAAD,IAAiB;AAC9C,MAAA,GAAG,IAAI,IAAP;AACD,KAFD;AAGD;;AAED,MAAI,QAAQ,GAAG,EAAf;;AACA,MAAI,YAAY,CAAC,MAAb,IAAuB,IAA3B,EAAiC;AAC/B,IAAA,YAAY,CAAC,MAAb,CAAoB,EAApB,CAAuB,MAAvB,EAAgC,IAAD,IAAiB;AAC9C,MAAA,QAAQ,IAAI,IAAZ;AACD,KAFD;AAGD;;AAED,EAAA,YAAY,CAAC,IAAb,CAAkB,KAAlB,EAA0B,IAAD,IAAiB;AACxC,QAAI,WAAI,cAAR,EAAwB;AACtB,YAAM,MAAM,GAAQ;AAClB,QAAA,OAAO,EAAE,IAAI,CAAC,QAAL,CAAc,OAAd,CADS;AAElB,QAAA,IAFkB;AAGlB,QAAA,GAAG,EAAE,YAAY,CAAC;AAHA,OAApB;;AAKA,UAAI,GAAG,CAAC,MAAJ,GAAa,CAAjB,EAAoB;AAClB,QAAA,MAAM,CAAC,GAAP,GAAa,GAAb;AACD;;AACD,iBAAI,KAAJ,CAAU,MAAV,EAAkB,QAAlB;AACD;;AAED,QAAI,IAAI,KAAK,CAAb,EAAgB;AACd,UAAI,OAAO,IAAI,IAAf,EAAqB;AACnB,QAAA,OAAO,CAAC,GAAD,CAAP;AACD;AACF,KAJD,MAKK;AACH,eAAS,SAAT,CAAmB,IAAnB,EAAiC,KAAjC,EAA8C;AAC5C,eAAO,IAAI,CAAC,MAAL,KAAgB,CAAhB,GAAoB,EAApB,GAAyB,KAAK,KAAK,MAAM,IAAI,EAApD;AACD;;AAED,MAAA,MAAM,CAAC,IAAI,KAAJ,CAAU,GAAG,OAAO,qBAAqB,IAAI,GAAG,SAAS,CAAC,GAAD,EAAM,QAAN,CAAe,GAAG,SAAS,CAAC,QAAD,EAAW,cAAX,CAA0B,EAA9G,CAAD,CAAN;AACD;AACF,GAzBD;AA0BD;;AAEK,SAAU,GAAV,CAAoB,KAApB,EAAqC,IAArC,EAAuD;AAC3D,SAAO,KAAK,IAAI,IAAT,GAAgB,IAAhB,GAAuB,IAAI,CAAC,KAAD,CAAlC;AACD;;AAEK,SAAU,eAAV,CAA0B,CAA1B,EAAsD;AAC1D,SAAO,CAAC,IAAI,IAAL,IAAa,CAAC,CAAC,IAAF,GAAS,MAAT,KAAoB,CAAxC;AACD;;AAEK,SAAU,gBAAV,CAA2B,KAA3B,EAAwC;AAC5C,SAAO,eAAe,IAAf,CAAoB,KAApB,CAAP;AACD;;AAEK,SAAU,QAAV,CAAyB,GAAzB,EAAgD,GAAhD,EAAwD,KAAxD,EAAgE;AACpE,QAAM,IAAI,GAAG,GAAG,CAAC,GAAJ,CAAQ,GAAR,CAAb;;AACA,MAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB,IAAA,GAAG,CAAC,GAAJ,CAAQ,GAAR,EAAa,CAAC,KAAD,CAAb;AACD,GAFD,MAGK,IAAI,CAAC,IAAI,CAAC,QAAL,CAAc,KAAd,CAAL,EAA2B;AAC9B,IAAA,IAAI,CAAC,IAAL,CAAU,KAAV;AACD;AACF;;AAEK,SAAU,cAAV,CAAyB,MAAzB,EAAmE,WAAnE,EAA6F;AACjG,MAAI,MAAM,IAAI,IAAV,IAAmB,MAAM,CAAC,MAAP,KAAkB,CAAlB,IAAuB,MAAM,CAAC,CAAD,CAAN,KAAc,SAA5D,EAAwE;AACtE,WAAO,WAAP;AACD;;AAED,QAAM,KAAK,GAAG,MAAM,CAAC,OAAP,CAAe,SAAf,CAAd;;AACA,MAAI,KAAK,IAAI,CAAb,EAAgB;AACd,UAAM,IAAI,GAAG,MAAM,CAAC,KAAP,CAAa,CAAb,EAAgB,KAAhB,CAAb;AACA,IAAA,IAAI,CAAC,IAAL,CAAU,GAAG,WAAb;;AACA,QAAI,KAAK,KAAM,MAAM,CAAC,MAAP,GAAgB,CAA/B,EAAmC;AACjC,MAAA,IAAI,CAAC,IAAL,CAAU,GAAG,MAAM,CAAC,KAAP,CAAa,KAAK,GAAG,CAArB,CAAb;AACD;;AACD,IAAA,MAAM,GAAG,IAAT;AACD;;AACD,SAAO,MAAP;AACD;;AAEK,SAAU,uBAAV,CAAkC,KAAlC,EAAoE,KAApE,EAAkF;AACtF,MAAI,KAAK,KAAK,SAAd,EAAyB;AACvB,WAAO,SAAP;AACD;;AACD,MAAI,KAAK,KAAK,IAAd,EAAoB;AAClB,WAAO,IAAP;AACD;;AAED,MAAI,CAAC,KAAK,CAAC,QAAN,CAAe,GAAf,CAAL,EAA0B;AACxB,WAAO,GAAG,KAAK,IAAI,KAAK,GAAG,MAAH,GAAY,KAAK,EAAzC;AACD;;AAED,SAAO,KAAK,CAAC,OAAN,CAAc,KAAK,GAAG,MAAH,GAAY,OAA/B,EAAwC,KAAK,GAAG,OAAH,GAAa,MAA1D,CAAP;AACD;;AAEK,SAAU,aAAV,GAAuB;AAC3B;AACA,WAAS,KAAT,CAAe,KAAf,EAAwC;AACtC;AACA,WAAO,KAAK,IAAI,KAAK,KAAK,OAA1B;AACD;;AAED,SAAO,KAAK,CAAC,OAAO,CAAC,GAAR,CAAY,mBAAb,CAAL,IAA0C,KAAK,CAAC,OAAO,CAAC,GAAR,CAAY,eAAb,CAA/C,IAAgF,KAAK,CAAC,OAAO,CAAC,GAAR,CAAY,gBAAb,CAArF,IAAuH,KAAK,CAAC,OAAO,CAAC,GAAR,CAAY,oBAAb,CAA5H,IAAkK,KAAK,CAAC,OAAO,CAAC,GAAR,CAAY,4BAAb,CAA9K;AACD;;AAEK,SAAU,SAAV,CAAoB,KAApB,EAAoD;AACxD,MAAI,KAAK,IAAI,IAAb,EAAmB;AACjB,IAAA,KAAK,GAAG,KAAK,CAAC,IAAN,EAAR;AACD;;AACD,SAAO,KAAK,KAAK,MAAV,IAAoB,KAAK,KAAK,EAA9B,IAAoC,KAAK,KAAK,GAArD;AACD;;AAEK,MAAO,yBAAP,SAAyC,KAAzC,CAA8C;AAClD,EAAA,WAAA,CAAY,OAAZ,EAA6B,IAAA,GAAe,4CAA5C,EAAwF;AACtF,UAAM,OAAN;AAEC,SAA+B,IAA/B,GAAsC,IAAtC;AACF;;AALiD;;;;AAQ9C,SAAU,iBAAV,CAA4B,IAA5B,EAAiD,oBAAjD,EAA8G,YAAA,GAAgC,EAA9I,EAAgJ;AACpJ,SAAO,IAAI,OAAJ,CAAoB,CAAC,OAAD,EAAU,MAAV,KAAoB;AAC7C,UAAM,OAAO,GAAG,+BAAhB;;AACA,UAAM,GAAG,GAAA,MAAA,CAAA,MAAA,CAAA;AACP;AACA,MAAA,+BAA+B,EAAE,gBAAK,QAAL;AAF1B,KAAA,EAGJ,OAAO,CAAC,GAHJ,EAGO;AACd,MAAA,QAAQ,EAAE,iBADI;AAEd,MAAA,WAAW,EAAE,iBAAM,OAAN,GAAgB,GAAhB,GAAsB;AAFrB,KAHP,CAAT;AAOA,UAAM,QAAQ,GAAG,OAAO,CAAC,GAAR,CAAY,sBAA7B;;AACA,QAAI,QAAQ,IAAI,IAAZ,IAAoB,QAAQ,CAAC,MAAT,GAAkB,CAA1C,EAA6C;AAC3C,MAAA,GAAG,CAAC,sBAAJ,GAA6B,IAAI,CAAC,OAAL,CAAa,QAAb,CAA7B;AACD;;AAED,QAAI,YAAY,CAAC,GAAb,IAAoB,IAAxB,EAA8B;AAC5B,MAAA,MAAM,CAAC,MAAP,CAAc,GAAd,EAAmB,YAAY,CAAC,GAAhC;AACD;;AAED,UAAM,YAAY,GAAG,OAAO,CAAC,OAAD,EAAU,IAAV,EAAc,MAAA,CAAA,MAAA,CAAA,EAAA,EACrC,YADqC,EACzB;AACf,MAAA,GADe;AAEf,MAAA,KAAK,EAAE,CAAC,QAAD,EAAW,MAAX,EAAmB,OAAO,CAAC,MAA3B;AAFQ,KADyB,CAAd,CAA5B;;AAKA,QAAI,oBAAoB,IAAI,IAA5B,EAAkC;AAChC,MAAA,oBAAoB,CAAC,YAAD,CAApB;AACD;;AACD,IAAA,aAAa,CAAC,OAAD,EAAU,YAAV,EAAwB,OAAxB,EAAiC,OAAjC,EAA0C,MAA1C,CAAb;AACD,GA3BM,CAAP;AA4BD,C","sourcesContent":["import { path7za } from \"7zip-bin\"\nimport { appBuilderPath } from \"app-builder-bin\"\nimport { safeStringifyJson } from \"builder-util-runtime\"\nimport chalk from \"chalk\"\nimport { ChildProcess, execFile, ExecFileOptions, spawn as _spawn, SpawnOptions } from \"child_process\"\nimport { createHash } from \"crypto\"\nimport _debug from \"debug\"\nimport { safeDump } from \"js-yaml\"\nimport * as path from \"path\"\nimport \"source-map-support/register\"\nimport { debug, log } from \"./log\"\nimport isCI from \"is-ci\"\n\nexport { safeStringifyJson } from \"builder-util-runtime\"\nexport { TmpDir } from \"temp-file\"\nexport { log, debug } from \"./log\"\nexport { Arch, getArchCliNames, toLinuxArchString, getArchSuffix, ArchType, archFromString } from \"./arch\"\nexport { AsyncTaskManager } from \"./asyncTaskManager\"\nexport { DebugLogger } from \"./DebugLogger\"\n\nexport { copyFile } from \"./fs\"\nexport { asArray } from \"builder-util-runtime\"\n\nexport { deepAssign } from \"./deepAssign\"\n\nexport const debug7z = _debug(\"electron-builder:7z\")\n\nexport function serializeToYaml(object: object, skipInvalid = false, noRefs = false) {\n  return safeDump(object, {\n    lineWidth: 8000,\n    skipInvalid,\n    noRefs,\n  })\n}\n\nexport function removePassword(input: string) {\n  return input.replace(/(-String |-P |pass:| \\/p |-pass |--secretKey |--accessKey )([^ ]+)/g, (match, p1, p2) => {\n    if (p1.trim() === \"/p\" && p2.startsWith(\"\\\\\\\\Mac\\\\Host\\\\\\\\\")) {\n      // appx /p\n      return `${p1}${p2}`\n    }\n    return `${p1}${createHash(\"sha256\").update(p2).digest(\"hex\")} (sha256 hash)`\n  })\n}\n\nfunction getProcessEnv(env: { [key: string]: string | undefined } | undefined | null): NodeJS.ProcessEnv | undefined {\n  if (process.platform === \"win32\") {\n    return env == null ? undefined : env\n  }\n\n  const finalEnv = {\n    ...(env || process.env)\n  }\n\n  // without LC_CTYPE dpkg can returns encoded unicode symbols\n  // set LC_CTYPE to avoid crash https://github.com/electron-userland/electron-builder/issues/503 Even \"en_DE.UTF-8\" leads to error.\n  const locale = process.platform === \"linux\" ? (process.env.LANG || \"C.UTF-8\") : \"en_US.UTF-8\"\n  finalEnv.LANG = locale\n  finalEnv.LC_CTYPE = locale\n  finalEnv.LC_ALL = locale\n  return finalEnv\n}\n\nexport function exec(file: string, args?: Array<string> | null, options?: ExecFileOptions, isLogOutIfDebug = true): Promise<string> {\n  if (log.isDebugEnabled) {\n    const logFields: any = {\n      file,\n      args: args == null ? \"\" : removePassword(args.join(\" \")),\n    }\n    if (options != null) {\n      if (options.cwd != null) {\n        logFields.cwd = options.cwd\n      }\n\n      if (options.env != null) {\n        const diffEnv = {...options.env}\n        for (const name of Object.keys(process.env)) {\n          if (process.env[name] === options.env[name]) {\n            delete diffEnv[name]\n          }\n        }\n        logFields.env = safeStringifyJson(diffEnv)\n      }\n    }\n\n    log.debug(logFields, \"executing\")\n  }\n\n  return new Promise<string>((resolve, reject) => {\n    execFile(file, args, {\n    ...options,\n    maxBuffer: 1000 * 1024 * 1024,\n    env: getProcessEnv(options == null ? null : options.env),\n  }, (error, stdout, stderr) => {\n      if (error == null) {\n        if (isLogOutIfDebug && log.isDebugEnabled) {\n          const logFields: any = {\n            file,\n          }\n          if (stdout.length > 0) {\n            logFields.stdout = stdout\n          }\n          if (stderr.length > 0) {\n            logFields.stderr = stderr\n          }\n\n          log.debug(logFields, \"executed\")\n        }\n        resolve(stdout.toString())\n      }\n      else {\n        let message = chalk.red(removePassword(`Exit code: ${(error as any).code}. ${error.message}`))\n        if (stdout.length !== 0) {\n          if (file.endsWith(\"wine\")) {\n            stdout = stdout.toString()\n          }\n          message += `\\n${chalk.yellow(stdout.toString())}`\n        }\n        if (stderr.length !== 0) {\n          if (file.endsWith(\"wine\")) {\n            stderr = stderr.toString()\n          }\n          message += `\\n${chalk.red(stderr.toString())}`\n        }\n\n        reject(new Error(message))\n      }\n    })\n  })\n}\n\nexport interface ExtraSpawnOptions {\n  isPipeInput?: boolean\n}\n\nfunction logSpawn(command: string, args: Array<string>, options: SpawnOptions) {\n  // use general debug.enabled to log spawn, because it doesn't produce a lot of output (the only line), but important in any case\n  if (!log.isDebugEnabled) {\n    return\n  }\n\n  const argsString = removePassword(args.join(\" \"))\n  const logFields: any = {\n    command: command + \" \" + (command === \"docker\" ? argsString : removePassword(argsString)),\n  }\n  if (options != null && options.cwd != null) {\n    logFields.cwd = options.cwd\n  }\n  log.debug(logFields, \"spawning\")\n}\n\nexport function doSpawn(command: string, args: Array<string>, options?: SpawnOptions, extraOptions?: ExtraSpawnOptions): ChildProcess {\n  if (options == null) {\n    options = {}\n  }\n\n  options.env = getProcessEnv(options.env)\n\n  if (options.stdio == null) {\n    const isDebugEnabled = debug.enabled\n    // do not ignore stdout/stderr if not debug, because in this case we will read into buffer and print on error\n    options.stdio = [extraOptions != null && extraOptions.isPipeInput ? \"pipe\" : \"ignore\", isDebugEnabled ? \"inherit\" : \"pipe\", isDebugEnabled ? \"inherit\" : \"pipe\"] as any\n  }\n\n  logSpawn(command, args, options)\n  try {\n    return _spawn(command, args, options)\n  }\n  catch (e) {\n    throw new Error(`Cannot spawn ${command}: ${e.stack || e}`)\n  }\n}\n\nexport function spawnAndWrite(command: string, args: Array<string>, data: string, options?: SpawnOptions) {\n  const childProcess = doSpawn(command, args, options, {isPipeInput: true})\n  const timeout = setTimeout(() => childProcess.kill(), 4 * 60 * 1000)\n  return new Promise<any>((resolve, reject) => {\n    handleProcess(\"close\", childProcess, command, () => {\n      try {\n        clearTimeout(timeout)\n      }\n      finally {\n        resolve()\n      }\n    }, error => {\n      try {\n        clearTimeout(timeout)\n      }\n      finally {\n        reject(error.stack || error.toString())\n      }\n    })\n\n    childProcess.stdin!!.end(data)\n  })\n}\n\nexport function spawn(command: string, args?: Array<string> | null, options?: SpawnOptions, extraOptions?: ExtraSpawnOptions): Promise<any> {\n  return new Promise<any>((resolve, reject) => {\n    handleProcess(\"close\", doSpawn(command, args || [], options, extraOptions), command, resolve, reject)\n  })\n}\n\nfunction handleProcess(event: string, childProcess: ChildProcess, command: string, resolve: ((value?: any) => void) | null, reject: (reason?: any) => void) {\n  childProcess.on(\"error\", reject)\n\n  let out = \"\"\n  if (childProcess.stdout != null) {\n    childProcess.stdout.on(\"data\", (data: string) => {\n      out += data\n    })\n  }\n\n  let errorOut = \"\"\n  if (childProcess.stderr != null) {\n    childProcess.stderr.on(\"data\", (data: string) => {\n      errorOut += data\n    })\n  }\n\n  childProcess.once(event, (code: number) => {\n    if (log.isDebugEnabled) {\n      const fields: any = {\n        command: path.basename(command),\n        code,\n        pid: childProcess.pid,\n      }\n      if (out.length > 0) {\n        fields.out = out\n      }\n      log.debug(fields, \"exited\")\n    }\n\n    if (code === 0) {\n      if (resolve != null) {\n        resolve(out)\n      }\n    }\n    else {\n      function formatOut(text: string, title: string) {\n        return text.length === 0 ? \"\" : `\\n${title}:\\n${text}`\n      }\n\n      reject(new Error(`${command} exited with code ${code}${formatOut(out, \"Output\")}${formatOut(errorOut, \"Error output\")}`))\n    }\n  })\n}\n\nexport function use<T, R>(value: T | null, task: (it: T) => R): R | null {\n  return value == null ? null : task(value)\n}\n\nexport function isEmptyOrSpaces(s: string | null | undefined): s is \"\" | null | undefined {\n  return s == null || s.trim().length === 0\n}\n\nexport function isTokenCharValid(token: string) {\n  return /^[\\w\\/=+-]+$/.test(token)\n}\n\nexport function addValue<K, T>(map: Map<K, Array<T>>, key: K, value: T) {\n  const list = map.get(key)\n  if (list == null) {\n    map.set(key, [value])\n  }\n  else if (!list.includes(value)) {\n    list.push(value)\n  }\n}\n\nexport function replaceDefault(inList: Array<string> | null | undefined, defaultList: Array<string>): Array<string> {\n  if (inList == null || (inList.length === 1 && inList[0] === \"default\")) {\n    return defaultList\n  }\n\n  const index = inList.indexOf(\"default\")\n  if (index >= 0) {\n    const list = inList.slice(0, index)\n    list.push(...defaultList)\n    if (index !== (inList.length - 1)) {\n      list.push(...inList.slice(index + 1))\n    }\n    inList = list\n  }\n  return inList\n}\n\nexport function getPlatformIconFileName(value: string | null | undefined, isMac: boolean) {\n  if (value === undefined) {\n    return undefined\n  }\n  if (value === null) {\n    return null\n  }\n\n  if (!value.includes(\".\")) {\n    return `${value}.${isMac ? \"icns\" : \"ico\"}`\n  }\n\n  return value.replace(isMac ? \".ico\" : \".icns\", isMac ? \".icns\" : \".ico\")\n}\n\nexport function isPullRequest() {\n  // TRAVIS_PULL_REQUEST is set to the pull request number if the current job is a pull request build, or false if itâ€™s not.\n  function isSet(value: string | undefined) {\n    // value can be or null, or empty string\n    return value && value !== \"false\"\n  }\n\n  return isSet(process.env.TRAVIS_PULL_REQUEST) || isSet(process.env.CI_PULL_REQUEST) || isSet(process.env.CI_PULL_REQUESTS) || isSet(process.env.BITRISE_PULL_REQUEST) || isSet(process.env.APPVEYOR_PULL_REQUEST_NUMBER)\n}\n\nexport function isEnvTrue(value: string | null | undefined) {\n  if (value != null) {\n    value = value.trim()\n  }\n  return value === \"true\" || value === \"\" || value === \"1\"\n}\n\nexport class InvalidConfigurationError extends Error {\n  constructor(message: string, code: string = \"ERR_ELECTRON_BUILDER_INVALID_CONFIGURATION\") {\n    super(message);\n\n    (this as NodeJS.ErrnoException).code = code\n  }\n}\n\nexport function executeAppBuilder(args: Array<string>, childProcessConsumer?: (childProcess: ChildProcess) => void, extraOptions: ExecFileOptions = {}): Promise<string> {\n  return new Promise<string>((resolve, reject) => {\n    const command = appBuilderPath\n    const env: any = {\n      // before process.env to allow customize by user\n      SNAP_USE_HARD_LINKS_IF_POSSIBLE: isCI.toString(),\n      ...process.env,\n      SZA_PATH: path7za,\n      FORCE_COLOR: chalk.enabled ? \"1\" : \"0\",\n    }\n    const cacheEnv = process.env.ELECTRON_BUILDER_CACHE\n    if (cacheEnv != null && cacheEnv.length > 0) {\n      env.ELECTRON_BUILDER_CACHE = path.resolve(cacheEnv)\n    }\n\n    if (extraOptions.env != null) {\n      Object.assign(env, extraOptions.env)\n    }\n\n    const childProcess = doSpawn(command, args, {\n      ...extraOptions,\n      env,\n      stdio: [\"ignore\", \"pipe\", process.stdout]\n    })\n    if (childProcessConsumer != null) {\n      childProcessConsumer(childProcess)\n    }\n    handleProcess(\"close\", childProcess, command, resolve, reject)\n  })\n}\n"],"sourceRoot":""}
{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "bluebird-lst": "^1.0.9",
    "debug": "^4.1.1",
    "fs-extra-p": "^8.0.2",
    "sax": "^1.2.4"
  },
  "deprecated": false,
  "description": "HTTP utilities. Used by [electron-builder](https://github.com/electron-userland/electron-builder).",
  "engines": {
    "node": ">=6.0.0"
  },
  "files": [
    "out"
  ],
  "homepage": "https://github.com/electron-userland/electron-builder",
  "license": "MIT",
  "main": "out/index.js",
  "name": "builder-util-runtime",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-builder.git"
  },
  "types": "./out/index.d.ts",
  "version": "8.2.5"
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CancellationError = exports.CancellationToken = void 0;

function _events() {
  const data = require("events");

  _events = function () {
    return data;
  };

  return data;
}

class CancellationToken extends _events().EventEmitter {
  // babel cannot compile ... correctly for super calls
  constructor(parent) {
    super();
    this.parentCancelHandler = null;
    this._parent = null;
    this._cancelled = false;

    if (parent != null) {
      this.parent = parent;
    }
  }

  get cancelled() {
    return this._cancelled || this._parent != null && this._parent.cancelled;
  }

  set parent(value) {
    this.removeParentCancelHandler();
    this._parent = value;

    this.parentCancelHandler = () => this.cancel();

    this._parent.onCancel(this.parentCancelHandler);
  }

  cancel() {
    this._cancelled = true;
    this.emit("cancel");
  }

  onCancel(handler) {
    if (this.cancelled) {
      handler();
    } else {
      this.once("cancel", handler);
    }
  }

  createPromise(callback) {
    if (this.cancelled) {
      return Promise.reject(new CancellationError());
    }

    const finallyHandler = () => {
      if (cancelHandler != null) {
        try {
          this.removeListener("cancel", cancelHandler);
          cancelHandler = null;
        } catch (ignore) {// ignore
        }
      }
    };

    let cancelHandler = null;
    return new Promise((resolve, reject) => {
      let addedCancelHandler = null;

      cancelHandler = () => {
        try {
          if (addedCancelHandler != null) {
            addedCancelHandler();
            addedCancelHandler = null;
          }
        } finally {
          reject(new CancellationError());
        }
      };

      if (this.cancelled) {
        cancelHandler();
        return;
      }

      this.onCancel(cancelHandler);
      callback(resolve, reject, callback => {
        addedCancelHandler = callback;
      });
    }).then(it => {
      finallyHandler();
      return it;
    }).catch(e => {
      finallyHandler();
      throw e;
    });
  }

  removeParentCancelHandler() {
    const parent = this._parent;

    if (parent != null && this.parentCancelHandler != null) {
      parent.removeListener("cancel", this.parentCancelHandler);
      this.parentCancelHandler = null;
    }
  }

  dispose() {
    try {
      this.removeParentCancelHandler();
    } finally {
      this.removeAllListeners();
      this._parent = null;
    }
  }

}

exports.CancellationToken = CancellationToken;

class CancellationError extends Error {
  constructor() {
    super("Cancelled");
  }

} exports.CancellationError = CancellationError;
// __ts-babel@6.0.4
//# sourceMappingURL=CancellationToken.js.map{"version":3,"sources":["../src/CancellationToken.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from \"events\"\n\nexport class CancellationToken extends EventEmitter {\n  private parentCancelHandler: (() => any) | null = null\n\n  private _cancelled: boolean\n  get cancelled(): boolean {\n    return this._cancelled || (this._parent != null && this._parent.cancelled)\n  }\n\n  private _parent: CancellationToken | null = null\n  set parent(value: CancellationToken) {\n    this.removeParentCancelHandler()\n\n    this._parent = value\n    this.parentCancelHandler = () => this.cancel()\n    this._parent.onCancel(this.parentCancelHandler)\n  }\n\n  // babel cannot compile ... correctly for super calls\n  constructor(parent?: CancellationToken) {\n    super()\n\n    this._cancelled = false\n    if (parent != null) {\n      this.parent = parent\n    }\n  }\n\n  cancel() {\n    this._cancelled = true\n    this.emit(\"cancel\")\n  }\n\n  private onCancel(handler: () => any) {\n    if (this.cancelled) {\n      handler()\n    }\n    else {\n      this.once(\"cancel\", handler)\n    }\n  }\n\n  createPromise<R>(callback: (resolve: (thenableOrResult?: R) => void, reject: (error: Error) => void, onCancel: (callback: () => void) => void) => void): Promise<R> {\n    if (this.cancelled) {\n      return Promise.reject<R>(new CancellationError())\n    }\n\n    const finallyHandler = () => {\n      if (cancelHandler != null) {\n        try {\n          this.removeListener(\"cancel\", cancelHandler)\n          cancelHandler = null\n        }\n        catch (ignore) {\n          // ignore\n        }\n      }\n    }\n\n    let cancelHandler: (() => void) | null = null\n    return new Promise<R>((resolve, reject) => {\n      let addedCancelHandler: (() => void) | null = null\n\n      cancelHandler = () => {\n        try {\n          if (addedCancelHandler != null) {\n            addedCancelHandler()\n            addedCancelHandler = null\n          }\n        }\n        finally {\n          reject(new CancellationError())\n        }\n      }\n\n      if (this.cancelled) {\n        cancelHandler()\n        return\n      }\n\n      this.onCancel(cancelHandler)\n\n      callback(resolve, reject, (callback: () => void) => {\n        addedCancelHandler = callback\n      })\n    })\n      .then(it => {\n        finallyHandler()\n        return it\n      })\n      .catch(e => {\n        finallyHandler()\n        throw e\n      })\n  }\n\n  private removeParentCancelHandler() {\n    const parent = this._parent\n    if (parent != null && this.parentCancelHandler != null) {\n      parent.removeListener(\"cancel\", this.parentCancelHandler)\n      this.parentCancelHandler = null\n    }\n  }\n\n  dispose() {\n    try {\n      this.removeParentCancelHandler()\n    }\n    finally {\n      this.removeAllListeners()\n      this._parent = null\n    }\n  }\n}\n\nexport class CancellationError extends Error {\n  constructor() {\n    super(\"Cancelled\")\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ProgressCallbackTransform = void 0;

function _stream() {
  const data = require("stream");

  _stream = function () {
    return data;
  };

  return data;
}

class ProgressCallbackTransform extends _stream().Transform {
  constructor(total, cancellationToken, onProgress) {
    super();
    this.total = total;
    this.cancellationToken = cancellationToken;
    this.onProgress = onProgress;
    this.start = Date.now();
    this.transferred = 0;
    this.delta = 0;
    this.nextUpdate = this.start + 1000;
  }

  _transform(chunk, encoding, callback) {
    if (this.cancellationToken.cancelled) {
      callback(new Error("Cancelled"), null);
      return;
    }

    this.transferred += chunk.length;
    this.delta += chunk.length;
    const now = Date.now();

    if (now >= this.nextUpdate && this.transferred !== this.total
    /* will be emitted on _flush */
    ) {
        this.nextUpdate = now + 1000;
        this.onProgress({
          total: this.total,
          delta: this.delta,
          transferred: this.transferred,
          percent: this.transferred / this.total * 100,
          bytesPerSecond: Math.round(this.transferred / ((now - this.start) / 1000))
        });
        this.delta = 0;
      }

    callback(null, chunk);
  }

  _flush(callback) {
    if (this.cancellationToken.cancelled) {
      callback(new Error("Cancelled"));
      return;
    }

    this.onProgress({
      total: this.total,
      delta: this.delta,
      transferred: this.total,
      percent: 100,
      bytesPerSecond: Math.round(this.transferred / ((Date.now() - this.start) / 1000))
    });
    this.delta = 0;
    callback(null);
  }

} exports.ProgressCallbackTransform = ProgressCallbackTransform;
// __ts-babel@6.0.4
//# sourceMappingURL=ProgressCallbackTransform.js.map{"version":3,"sources":["../src/ProgressCallbackTransform.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAWM,MAAO,yBAAP,SAAyC,mBAAzC,CAAkD;AAOtD,EAAA,WAAA,CAA6B,KAA7B,EAA6D,iBAA7D,EAAoH,UAApH,EAA2J;AACzJ;AAD2B,SAAA,KAAA,GAAA,KAAA;AAAgC,SAAA,iBAAA,GAAA,iBAAA;AAAuD,SAAA,UAAA,GAAA,UAAA;AAN5G,SAAA,KAAA,GAAQ,IAAI,CAAC,GAAL,EAAR;AACA,SAAA,WAAA,GAAc,CAAd;AACA,SAAA,KAAA,GAAQ,CAAR;AAEA,SAAA,UAAA,GAAa,KAAK,KAAL,GAAa,IAA1B;AAIP;;AAED,EAAA,UAAU,CAAC,KAAD,EAAa,QAAb,EAA+B,QAA/B,EAA4C;AACpD,QAAI,KAAK,iBAAL,CAAuB,SAA3B,EAAsC;AACpC,MAAA,QAAQ,CAAC,IAAI,KAAJ,CAAU,WAAV,CAAD,EAAyB,IAAzB,CAAR;AACA;AACD;;AAED,SAAK,WAAL,IAAoB,KAAK,CAAC,MAA1B;AACA,SAAK,KAAL,IAAc,KAAK,CAAC,MAApB;AAEA,UAAM,GAAG,GAAG,IAAI,CAAC,GAAL,EAAZ;;AACA,QAAI,GAAG,IAAI,KAAK,UAAZ,IAA0B,KAAK,WAAL,KAAqB,KAAK;AAAM;AAA9D,MAA+F;AAC7F,aAAK,UAAL,GAAkB,GAAG,GAAG,IAAxB;AAEA,aAAK,UAAL,CAAgB;AACd,UAAA,KAAK,EAAE,KAAK,KADE;AAEd,UAAA,KAAK,EAAE,KAAK,KAFE;AAGd,UAAA,WAAW,EAAE,KAAK,WAHJ;AAId,UAAA,OAAO,EAAG,KAAK,WAAL,GAAmB,KAAK,KAAzB,GAAkC,GAJ7B;AAKd,UAAA,cAAc,EAAE,IAAI,CAAC,KAAL,CAAW,KAAK,WAAL,IAAoB,CAAC,GAAG,GAAG,KAAK,KAAZ,IAAqB,IAAzC,CAAX;AALF,SAAhB;AAOA,aAAK,KAAL,GAAa,CAAb;AACD;;AAED,IAAA,QAAQ,CAAC,IAAD,EAAO,KAAP,CAAR;AACD;;AAED,EAAA,MAAM,CAAC,QAAD,EAAc;AAClB,QAAI,KAAK,iBAAL,CAAuB,SAA3B,EAAsC;AACpC,MAAA,QAAQ,CAAC,IAAI,KAAJ,CAAU,WAAV,CAAD,CAAR;AACA;AACD;;AAED,SAAK,UAAL,CAAgB;AACd,MAAA,KAAK,EAAE,KAAK,KADE;AAEd,MAAA,KAAK,EAAE,KAAK,KAFE;AAGd,MAAA,WAAW,EAAE,KAAK,KAHJ;AAId,MAAA,OAAO,EAAE,GAJK;AAKd,MAAA,cAAc,EAAE,IAAI,CAAC,KAAL,CAAW,KAAK,WAAL,IAAoB,CAAC,IAAI,CAAC,GAAL,KAAa,KAAK,KAAnB,IAA4B,IAAhD,CAAX;AALF,KAAhB;AAOA,SAAK,KAAL,GAAa,CAAb;AAEA,IAAA,QAAQ,CAAC,IAAD,CAAR;AACD;;AArDqD,C","sourcesContent":["import { Transform } from \"stream\"\nimport { CancellationToken } from \"./CancellationToken\"\n\nexport interface ProgressInfo {\n  total: number\n  delta: number\n  transferred: number\n  percent: number\n  bytesPerSecond: number\n}\n\nexport class ProgressCallbackTransform extends Transform {\n  private start = Date.now()\n  private transferred = 0\n  private delta = 0\n\n  private nextUpdate = this.start + 1000\n\n  constructor(private readonly total: number, private readonly cancellationToken: CancellationToken, private readonly onProgress: (info: ProgressInfo) => any) {\n    super()\n  }\n\n  _transform(chunk: any, encoding: string, callback: any) {\n    if (this.cancellationToken.cancelled) {\n      callback(new Error(\"Cancelled\"), null)\n      return\n    }\n\n    this.transferred += chunk.length\n    this.delta += chunk.length\n\n    const now = Date.now()\n    if (now >= this.nextUpdate && this.transferred !== this.total /* will be emitted on _flush */) {\n      this.nextUpdate = now + 1000\n\n      this.onProgress({\n        total: this.total,\n        delta: this.delta,\n        transferred: this.transferred,\n        percent: (this.transferred / this.total) * 100,\n        bytesPerSecond: Math.round(this.transferred / ((now - this.start) / 1000))\n      })\n      this.delta = 0\n    }\n\n    callback(null, chunk)\n  }\n\n  _flush(callback: any): void {\n    if (this.cancellationToken.cancelled) {\n      callback(new Error(\"Cancelled\"))\n      return\n    }\n\n    this.onProgress({\n      total: this.total,\n      delta: this.delta,\n      transferred: this.total,\n      percent: 100,\n      bytesPerSecond: Math.round(this.transferred / ((Date.now() - this.start) / 1000))\n    })\n    this.delta = 0\n\n    callback(null)\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.BintrayClient = void 0;

function _httpExecutor() {
  const data = require("./httpExecutor");

  _httpExecutor = function () {
    return data;
  };

  return data;
}

class BintrayClient {
  constructor(options, httpExecutor, cancellationToken, apiKey) {
    this.httpExecutor = httpExecutor;
    this.cancellationToken = cancellationToken;
    this.requestHeaders = null;

    if (options.owner == null) {
      throw new Error("owner is not specified");
    }

    if (options.package == null) {
      throw new Error("package is not specified");
    }

    this.repo = options.repo || "generic";
    this.packageName = options.package;
    this.owner = options.owner;
    this.user = options.user || options.owner;
    this.component = options.component || null;
    this.distribution = options.distribution || "stable";
    this.auth = apiKey == null ? null : `Basic ${Buffer.from(`${this.user}:${apiKey}`).toString("base64")}`;
    this.basePath = `/packages/${this.owner}/${this.repo}/${this.packageName}`;
  }

  setRequestHeaders(value) {
    this.requestHeaders = value;
  }

  bintrayRequest(path, auth, data = null, cancellationToken, method) {
    return (0, _httpExecutor().parseJson)(this.httpExecutor.request((0, _httpExecutor().configureRequestOptions)({
      hostname: "api.bintray.com",
      path,
      headers: this.requestHeaders || undefined
    }, auth, method), cancellationToken, data));
  }

  getVersion(version) {
    return this.bintrayRequest(`${this.basePath}/versions/${version}`, this.auth, null, this.cancellationToken);
  }

  getVersionFiles(version) {
    return this.bintrayRequest(`${this.basePath}/versions/${version}/files`, this.auth, null, this.cancellationToken);
  }

  createVersion(version) {
    return this.bintrayRequest(`${this.basePath}/versions`, this.auth, {
      name: version
    }, this.cancellationToken);
  }

  deleteVersion(version) {
    return this.bintrayRequest(`${this.basePath}/versions/${version}`, this.auth, null, this.cancellationToken, "DELETE");
  }

} exports.BintrayClient = BintrayClient;
// __ts-babel@6.0.4
//# sourceMappingURL=bintray.js.map{"version":3,"sources":["../src/bintray.ts"],"names":[],"mappings":";;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAiBM,MAAO,aAAP,CAAoB;AAiBxB,EAAA,WAAA,CAAY,OAAZ,EAAsD,YAAtD,EAAwG,iBAAxG,EAA8I,MAA9I,EAAoK;AAA9G,SAAA,YAAA,GAAA,YAAA;AAAkD,SAAA,iBAAA,GAAA,iBAAA;AANhG,SAAA,cAAA,GAAwC,IAAxC;;AAON,QAAI,OAAO,CAAC,KAAR,IAAiB,IAArB,EAA2B;AACzB,YAAM,IAAI,KAAJ,CAAU,wBAAV,CAAN;AACD;;AACD,QAAI,OAAO,CAAC,OAAR,IAAmB,IAAvB,EAA6B;AAC3B,YAAM,IAAI,KAAJ,CAAU,0BAAV,CAAN;AACD;;AAED,SAAK,IAAL,GAAY,OAAO,CAAC,IAAR,IAAgB,SAA5B;AACA,SAAK,WAAL,GAAmB,OAAO,CAAC,OAA3B;AACA,SAAK,KAAL,GAAa,OAAO,CAAC,KAArB;AACA,SAAK,IAAL,GAAY,OAAO,CAAC,IAAR,IAAgB,OAAO,CAAC,KAApC;AACA,SAAK,SAAL,GAAiB,OAAO,CAAC,SAAR,IAAqB,IAAtC;AACA,SAAK,YAAL,GAAoB,OAAO,CAAC,YAAR,IAAwB,QAA5C;AACA,SAAK,IAAL,GAAY,MAAM,IAAI,IAAV,GAAiB,IAAjB,GAAwB,SAAS,MAAM,CAAC,IAAP,CAAY,GAAG,KAAK,IAAI,IAAI,MAAM,EAAlC,EAAsC,QAAtC,CAA+C,QAA/C,CAAwD,EAArG;AACA,SAAK,QAAL,GAAgB,aAAa,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,KAAK,WAAW,EAAxE;AACD;;AApBD,EAAA,iBAAiB,CAAC,KAAD,EAA6B;AAC5C,SAAK,cAAL,GAAsB,KAAtB;AACD;;AAoBO,EAAA,cAAc,CAAI,IAAJ,EAAkB,IAAlB,EAAuC,IAAA,GAAuC,IAA9E,EAAoF,iBAApF,EAA0H,MAA1H,EAA2J;AAC/K,WAAO,+BAAU,KAAK,YAAL,CAAkB,OAAlB,CAA0B,6CAAwB;AAAC,MAAA,QAAQ,EAAE,iBAAX;AAA8B,MAAA,IAA9B;AAAoC,MAAA,OAAO,EAAE,KAAK,cAAL,IAAuB;AAApE,KAAxB,EAAwG,IAAxG,EAA8G,MAA9G,CAA1B,EAAiJ,iBAAjJ,EAAoK,IAApK,CAAV,CAAP;AACD;;AAED,EAAA,UAAU,CAAC,OAAD,EAAgB;AACxB,WAAO,KAAK,cAAL,CAAoB,GAAG,KAAK,QAAQ,aAAa,OAAO,EAAxD,EAA4D,KAAK,IAAjE,EAAuE,IAAvE,EAA6E,KAAK,iBAAlF,CAAP;AACD;;AAED,EAAA,eAAe,CAAC,OAAD,EAAgB;AAC7B,WAAO,KAAK,cAAL,CAAiC,GAAG,KAAK,QAAQ,aAAa,OAAO,QAArE,EAA+E,KAAK,IAApF,EAA0F,IAA1F,EAAgG,KAAK,iBAArG,CAAP;AACD;;AAED,EAAA,aAAa,CAAC,OAAD,EAAgB;AAC3B,WAAO,KAAK,cAAL,CAA6B,GAAG,KAAK,QAAQ,WAA7C,EAA0D,KAAK,IAA/D,EAAqE;AAC1E,MAAA,IAAI,EAAE;AADoE,KAArE,EAEJ,KAAK,iBAFD,CAAP;AAGD;;AAED,EAAA,aAAa,CAAC,OAAD,EAAgB;AAC3B,WAAO,KAAK,cAAL,CAAoB,GAAG,KAAK,QAAQ,aAAa,OAAO,EAAxD,EAA4D,KAAK,IAAjE,EAAuE,IAAvE,EAA6E,KAAK,iBAAlF,EAAqG,QAArG,CAAP;AACD;;AAvDuB,C","sourcesContent":["import { CancellationToken } from \"./CancellationToken\"\nimport { configureRequestOptions, HttpExecutor, parseJson, RequestHeaders } from \"./httpExecutor\"\nimport { BintrayOptions } from \"./publishOptions\"\n\nexport interface Version {\n  readonly name: string\n  //noinspection ReservedWordAsName\n  readonly package: string\n}\n\nexport interface File {\n  name: string\n  path: string\n\n  sha1: string\n  sha256: string\n}\n\nexport class BintrayClient {\n  private readonly basePath: string\n  readonly auth: string | null\n  readonly repo: string\n\n  readonly owner: string\n  readonly user: string\n  readonly component: string | null\n  readonly distribution: string | null\n  readonly packageName: string\n\n  private requestHeaders: RequestHeaders | null = null\n\n  setRequestHeaders(value: RequestHeaders | null) {\n    this.requestHeaders = value\n  }\n\n  constructor(options: BintrayOptions, private readonly httpExecutor: HttpExecutor<any>, private readonly cancellationToken: CancellationToken, apiKey?: string | null) {\n    if (options.owner == null) {\n      throw new Error(\"owner is not specified\")\n    }\n    if (options.package == null) {\n      throw new Error(\"package is not specified\")\n    }\n\n    this.repo = options.repo || \"generic\"\n    this.packageName = options.package\n    this.owner = options.owner\n    this.user = options.user || options.owner\n    this.component = options.component || null\n    this.distribution = options.distribution || \"stable\"\n    this.auth = apiKey == null ? null : `Basic ${Buffer.from(`${this.user}:${apiKey}`).toString(\"base64\")}`\n    this.basePath = `/packages/${this.owner}/${this.repo}/${this.packageName}`\n  }\n\n  private bintrayRequest<T>(path: string, auth: string | null, data: {[name: string]: any; } | null = null, cancellationToken: CancellationToken, method?: \"GET\" | \"DELETE\" | \"PUT\"): Promise<T> {\n    return parseJson(this.httpExecutor.request(configureRequestOptions({hostname: \"api.bintray.com\", path, headers: this.requestHeaders || undefined}, auth, method), cancellationToken, data))\n  }\n\n  getVersion(version: string): Promise<Version> {\n    return this.bintrayRequest(`${this.basePath}/versions/${version}`, this.auth, null, this.cancellationToken)\n  }\n\n  getVersionFiles(version: string): Promise<Array<File>> {\n    return this.bintrayRequest<Array<File>>(`${this.basePath}/versions/${version}/files`, this.auth, null, this.cancellationToken)\n  }\n\n  createVersion(version: string): Promise<any> {\n    return this.bintrayRequest<Version>(`${this.basePath}/versions`, this.auth, {\n      name: version,\n    }, this.cancellationToken)\n  }\n\n  deleteVersion(version: string): Promise<any> {\n    return this.bintrayRequest(`${this.basePath}/versions/${version}`, this.auth, null, this.cancellationToken, \"DELETE\")\n  }\n}"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=blockMapApi.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createHttpError = createHttpError;
exports.parseJson = parseJson;
exports.configureRequestOptionsFromUrl = configureRequestOptionsFromUrl;
exports.configureRequestUrl = configureRequestUrl;
exports.safeGetHeader = safeGetHeader;
exports.configureRequestOptions = configureRequestOptions;
exports.safeStringifyJson = safeStringifyJson;
exports.DigestTransform = exports.HttpExecutor = exports.HttpError = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

var _debug2 = _interopRequireDefault(require("debug"));

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _stream() {
  const data = require("stream");

  _stream = function () {
    return data;
  };

  return data;
}

function _url() {
  const data = require("url");

  _url = function () {
    return data;
  };

  return data;
}

function _CancellationToken() {
  const data = require("./CancellationToken");

  _CancellationToken = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("./index");

  _index = function () {
    return data;
  };

  return data;
}

function _ProgressCallbackTransform() {
  const data = require("./ProgressCallbackTransform");

  _ProgressCallbackTransform = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const debug = (0, _debug2.default)("electron-builder");

function createHttpError(response, description = null) {
  return new HttpError(response.statusCode || -1, `${response.statusCode} ${response.statusMessage}` + (description == null ? "" : "\n" + JSON.stringify(description, null, "  ")) + "\nHeaders: " + safeStringifyJson(response.headers), description);
}

const HTTP_STATUS_CODES = new Map([[429, "Too many requests"], [400, "Bad request"], [403, "Forbidden"], [404, "Not found"], [405, "Method not allowed"], [406, "Not acceptable"], [408, "Request timeout"], [413, "Request entity too large"], [500, "Internal server error"], [502, "Bad gateway"], [503, "Service unavailable"], [504, "Gateway timeout"], [505, "HTTP version not supported"]]);

class HttpError extends Error {
  constructor(statusCode, message = `HTTP error: ${HTTP_STATUS_CODES.get(statusCode) || statusCode}`, description = null) {
    super(message);
    this.statusCode = statusCode;
    this.description = description;
    this.name = "HttpError";
  }

}

exports.HttpError = HttpError;

function parseJson(result) {
  return result.then(it => it == null || it.length === 0 ? null : JSON.parse(it));
}

class HttpExecutor {
  constructor() {
    this.maxRedirects = 10;
  }

  request(options, cancellationToken = new (_CancellationToken().CancellationToken)(), data) {
    configureRequestOptions(options);
    const encodedData = data == null ? undefined : Buffer.from(JSON.stringify(data));

    if (encodedData != null) {
      options.method = "post";
      options.headers["Content-Type"] = "application/json";
      options.headers["Content-Length"] = encodedData.length;
    }

    return this.doApiRequest(options, cancellationToken, it => {
      it.end(encodedData);
    });
  }

  doApiRequest(options, cancellationToken, requestProcessor, redirectCount = 0) {
    if (debug.enabled) {
      debug(`Request: ${safeStringifyJson(options)}`);
    }

    return cancellationToken.createPromise((resolve, reject, onCancel) => {
      const request = this.createRequest(options, response => {
        try {
          this.handleResponse(response, options, cancellationToken, resolve, reject, redirectCount, requestProcessor);
        } catch (e) {
          reject(e);
        }
      });
      this.addErrorAndTimeoutHandlers(request, reject);
      this.addRedirectHandlers(request, options, reject, redirectCount, options => {
        this.doApiRequest(options, cancellationToken, requestProcessor, redirectCount).then(resolve).catch(reject);
      });
      requestProcessor(request, reject);
      onCancel(() => request.abort());
    });
  } // noinspection JSUnusedLocalSymbols


  addRedirectHandlers(request, options, reject, redirectCount, handler) {// not required for NodeJS
  }

  addErrorAndTimeoutHandlers(request, reject) {
    this.addTimeOutHandler(request, reject);
    request.on("error", reject);
    request.on("aborted", () => {
      reject(new Error("Request has been aborted by the server"));
    });
  }

  handleResponse(response, options, cancellationToken, resolve, reject, redirectCount, requestProcessor) {
    if (debug.enabled) {
      debug(`Response: ${response.statusCode} ${response.statusMessage}, request options: ${safeStringifyJson(options)}`);
    } // we handle any other >= 400 error on request end (read detailed message in the response body)


    if (response.statusCode === 404) {
      // error is clear, we don't need to read detailed error description
      reject(createHttpError(response, `method: ${options.method || "GET"} url: ${options.protocol || "https:"}//${options.hostname}${options.port ? `:${options.port}` : ""}${options.path}

Please double check that your authentication token is correct. Due to security reasons actual status maybe not reported, but 404.
`));
      return;
    } else if (response.statusCode === 204) {
      // on DELETE request
      resolve();
      return;
    }

    const redirectUrl = safeGetHeader(response, "location");

    if (redirectUrl != null) {
      if (redirectCount > this.maxRedirects) {
        reject(this.createMaxRedirectError());
        return;
      }

      this.doApiRequest(HttpExecutor.prepareRedirectUrlOptions(redirectUrl, options), cancellationToken, requestProcessor, redirectCount).then(resolve).catch(reject);
      return;
    }

    response.setEncoding("utf8");
    let data = "";
    response.on("data", chunk => data += chunk);
    response.on("end", () => {
      try {
        if (response.statusCode != null && response.statusCode >= 400) {
          const contentType = safeGetHeader(response, "content-type");
          const isJson = contentType != null && (Array.isArray(contentType) ? contentType.find(it => it.includes("json")) != null : contentType.includes("json"));
          reject(createHttpError(response, isJson ? JSON.parse(data) : data));
        } else {
          resolve(data.length === 0 ? null : data);
        }
      } catch (e) {
        reject(e);
      }
    });
  }

  downloadToBuffer(url, options) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      return yield options.cancellationToken.createPromise((resolve, reject, onCancel) => {
        let result = null;
        const requestOptions = {
          headers: options.headers || undefined,
          // because PrivateGitHubProvider requires HttpExecutor.prepareRedirectUrlOptions logic, so, we need to redirect manually
          redirect: "manual"
        };
        configureRequestUrl(url, requestOptions);
        configureRequestOptions(requestOptions);

        _this.doDownload(requestOptions, {
          destination: null,
          options,
          onCancel,
          callback: error => {
            if (error == null) {
              resolve(result);
            } else {
              reject(error);
            }
          },
          responseHandler: (response, callback) => {
            const contentLength = safeGetHeader(response, "content-length");
            let position = -1;

            if (contentLength != null) {
              const size = parseInt(contentLength, 10);

              if (size > 0) {
                if (size > 5242880) {
                  callback(new Error("Maximum allowed size is 5 MB"));
                  return;
                }

                result = Buffer.alloc(size);
                position = 0;
              }
            }

            response.on("data", chunk => {
              if (position !== -1) {
                chunk.copy(result, position);
                position += chunk.length;
              } else if (result == null) {
                result = chunk;
              } else {
                if (result.length > 5242880) {
                  callback(new Error("Maximum allowed size is 5 MB"));
                  return;
                }

                result = Buffer.concat([result, chunk]);
              }
            });
            response.on("end", () => {
              if (result != null && position !== -1 && position !== result.length) {
                callback(new Error(`Received data length ${position} is not equal to expected ${result.length}`));
              } else {
                callback(null);
              }
            });
          }
        }, 0);
      });
    })();
  }

  doDownload(requestOptions, options, redirectCount) {
    const request = this.createRequest(requestOptions, response => {
      if (response.statusCode >= 400) {
        options.callback(new Error(`Cannot download "${requestOptions.protocol || "https:"}//${requestOptions.hostname}${requestOptions.path}", status ${response.statusCode}: ${response.statusMessage}`));
        return;
      } // this code not relevant for Electron (redirect event instead handled)


      const redirectUrl = safeGetHeader(response, "location");

      if (redirectUrl != null) {
        if (redirectCount < this.maxRedirects) {
          this.doDownload(HttpExecutor.prepareRedirectUrlOptions(redirectUrl, requestOptions), options, redirectCount++);
        } else {
          options.callback(this.createMaxRedirectError());
        }

        return;
      }

      if (options.responseHandler == null) {
        configurePipes(options, response);
      } else {
        options.responseHandler(response, options.callback);
      }
    });
    this.addErrorAndTimeoutHandlers(request, options.callback);
    this.addRedirectHandlers(request, requestOptions, options.callback, redirectCount, requestOptions => {
      this.doDownload(requestOptions, options, redirectCount++);
    });
    request.end();
  }

  createMaxRedirectError() {
    return new Error(`Too many redirects (> ${this.maxRedirects})`);
  }

  addTimeOutHandler(request, callback) {
    request.on("socket", socket => {
      socket.setTimeout(60 * 1000, () => {
        request.abort();
        callback(new Error("Request timed out"));
      });
    });
  }

  static prepareRedirectUrlOptions(redirectUrl, options) {
    const newOptions = configureRequestOptionsFromUrl(redirectUrl, Object.assign({}, options));
    const headers = newOptions.headers;

    if (headers != null && headers.authorization != null && headers.authorization.startsWith("token")) {
      const parsedNewUrl = new (_url().URL)(redirectUrl);

      if (parsedNewUrl.hostname.endsWith(".amazonaws.com")) {
        delete headers.authorization;
      }
    }

    return newOptions;
  }

}

exports.HttpExecutor = HttpExecutor;

function configureRequestOptionsFromUrl(url, options) {
  const result = configureRequestOptions(options);
  configureRequestUrl(new (_url().URL)(url), result);
  return result;
}

function configureRequestUrl(url, options) {
  options.protocol = url.protocol;
  options.hostname = url.hostname;

  if (url.port) {
    options.port = url.port;
  } else if (options.port) {
    delete options.port;
  }

  options.path = url.pathname + url.search;
}

class DigestTransform extends _stream().Transform {
  constructor(expected, algorithm = "sha512", encoding = "base64") {
    super();
    this.expected = expected;
    this.algorithm = algorithm;
    this.encoding = encoding;
    this._actual = null;
    this.isValidateOnEnd = true;
    this.digester = (0, _crypto().createHash)(algorithm);
  } // noinspection JSUnusedGlobalSymbols


  get actual() {
    return this._actual;
  } // noinspection JSUnusedGlobalSymbols


  _transform(chunk, encoding, callback) {
    this.digester.update(chunk);
    callback(null, chunk);
  } // noinspection JSUnusedGlobalSymbols


  _flush(callback) {
    this._actual = this.digester.digest(this.encoding);

    if (this.isValidateOnEnd) {
      try {
        this.validate();
      } catch (e) {
        callback(e);
        return;
      }
    }

    callback(null);
  }

  validate() {
    if (this._actual == null) {
      throw (0, _index().newError)("Not finished yet", "ERR_STREAM_NOT_FINISHED");
    }

    if (this._actual !== this.expected) {
      throw (0, _index().newError)(`${this.algorithm} checksum mismatch, expected ${this.expected}, got ${this._actual}`, "ERR_CHECKSUM_MISMATCH");
    }

    return null;
  }

}

exports.DigestTransform = DigestTransform;

function checkSha2(sha2Header, sha2, callback) {
  if (sha2Header != null && sha2 != null && sha2Header !== sha2) {
    callback(new Error(`checksum mismatch: expected ${sha2} but got ${sha2Header} (X-Checksum-Sha2 header)`));
    return false;
  }

  return true;
}

function safeGetHeader(response, headerKey) {
  const value = response.headers[headerKey];

  if (value == null) {
    return null;
  } else if (Array.isArray(value)) {
    // electron API
    return value.length === 0 ? null : value[value.length - 1];
  } else {
    return value;
  }
}

function configurePipes(options, response) {
  if (!checkSha2(safeGetHeader(response, "X-Checksum-Sha2"), options.options.sha2, options.callback)) {
    return;
  }

  const streams = [];

  if (options.options.onProgress != null) {
    const contentLength = safeGetHeader(response, "content-length");

    if (contentLength != null) {
      streams.push(new (_ProgressCallbackTransform().ProgressCallbackTransform)(parseInt(contentLength, 10), options.options.cancellationToken, options.options.onProgress));
    }
  }

  const sha512 = options.options.sha512;

  if (sha512 != null) {
    streams.push(new DigestTransform(sha512, "sha512", sha512.length === 128 && !sha512.includes("+") && !sha512.includes("Z") && !sha512.includes("=") ? "hex" : "base64"));
  } else if (options.options.sha2 != null) {
    streams.push(new DigestTransform(options.options.sha2, "sha256", "hex"));
  }

  const fileOut = (0, _fsExtraP().createWriteStream)(options.destination);
  streams.push(fileOut);
  let lastStream = response;

  for (const stream of streams) {
    stream.on("error", error => {
      if (!options.options.cancellationToken.cancelled) {
        options.callback(error);
      }
    });
    lastStream = lastStream.pipe(stream);
  }

  fileOut.on("finish", () => {
    fileOut.close(options.callback);
  });
}

function configureRequestOptions(options, token, method) {
  if (method != null) {
    options.method = method;
  }

  let headers = options.headers;

  if (headers == null) {
    headers = {};
    options.headers = headers;
  }

  if (token != null) {
    headers.authorization = token.startsWith("Basic") ? token : `token ${token}`;
  }

  if (headers["User-Agent"] == null) {
    headers["User-Agent"] = "electron-builder";
  }

  if (method == null || method === "GET" || headers["Cache-Control"] == null) {
    headers["Cache-Control"] = "no-cache";
  } // do not specify for node (in any case we use https module)


  if (options.protocol == null && process.versions.electron != null) {
    options.protocol = "https:";
  }

  return options;
}

function safeStringifyJson(data, skippedNames) {
  return JSON.stringify(data, (name, value) => {
    if (name.endsWith("authorization") || name.endsWith("Password") || name.endsWith("PASSWORD") || name.endsWith("Token") || name.includes("password") || name.includes("token") || skippedNames != null && skippedNames.has(name)) {
      return "<stripped sensitive data>";
    }

    return value;
  }, 2);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=httpExecutor.js.map{"version":3,"sources":["../src/httpExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, Hash } from \"crypto\"\nimport _debug from \"debug\"\nimport { createWriteStream } from \"fs-extra-p\"\nimport { IncomingMessage, OutgoingHttpHeaders, RequestOptions } from \"http\"\nimport { Socket } from \"net\"\nimport { Transform } from \"stream\"\nimport { URL } from \"url\"\nimport { CancellationToken } from \"./CancellationToken\"\nimport { newError } from \"./index\"\nimport { ProgressCallbackTransform, ProgressInfo } from \"./ProgressCallbackTransform\"\n\nconst debug = _debug(\"electron-builder\")\n\nexport interface RequestHeaders extends OutgoingHttpHeaders {\n  [key: string]: string\n}\n\nexport interface DownloadOptions {\n  readonly headers?: OutgoingHttpHeaders | null\n  readonly sha2?: string | null\n  readonly sha512?: string | null\n\n  readonly cancellationToken: CancellationToken\n\n  // noinspection JSUnusedLocalSymbols\n  onProgress?(progress: ProgressInfo): void\n}\n\nexport function createHttpError(response: IncomingMessage, description: any | null = null) {\n  return new HttpError(response.statusCode || -1, `${response.statusCode} ${response.statusMessage}` + (description == null ? \"\" : (\"\\n\" + JSON.stringify(description, null, \"  \"))) + \"\\nHeaders: \" + safeStringifyJson(response.headers), description)\n}\n\nconst HTTP_STATUS_CODES = new Map<number, string>([\n  [429, \"Too many requests\"],\n  [400, \"Bad request\"],\n  [403, \"Forbidden\"],\n  [404, \"Not found\"],\n  [405, \"Method not allowed\"],\n  [406, \"Not acceptable\"],\n  [408, \"Request timeout\"],\n  [413, \"Request entity too large\"],\n  [500, \"Internal server error\"],\n  [502, \"Bad gateway\"],\n  [503, \"Service unavailable\"],\n  [504, \"Gateway timeout\"],\n  [505, \"HTTP version not supported\"],\n])\n\nexport class HttpError extends Error {\n  constructor(readonly statusCode: number, message: string = `HTTP error: ${HTTP_STATUS_CODES.get(statusCode) || statusCode}`, readonly description: any | null = null) {\n    super(message)\n\n    this.name = \"HttpError\"\n  }\n}\n\nexport function parseJson(result: Promise<string | null>) {\n  return result.then(it => it == null || it.length === 0 ? null : JSON.parse(it))\n}\n\nexport abstract class HttpExecutor<REQUEST> {\n  protected readonly maxRedirects = 10\n\n  request(options: RequestOptions, cancellationToken: CancellationToken = new CancellationToken(), data?: { [name: string]: any; } | null): Promise<string | null> {\n    configureRequestOptions(options)\n    const encodedData = data == null ? undefined : Buffer.from(JSON.stringify(data))\n    if (encodedData != null) {\n      options.method = \"post\"\n      options.headers![\"Content-Type\"] = \"application/json\"\n      options.headers![\"Content-Length\"] = encodedData.length\n    }\n    return this.doApiRequest(options, cancellationToken, it => {\n      (it as any).end(encodedData)\n    })\n  }\n\n  doApiRequest(options: RequestOptions, cancellationToken: CancellationToken, requestProcessor: (request: REQUEST, reject: (error: Error) => void) => void, redirectCount: number = 0): Promise<string> {\n    if (debug.enabled) {\n      debug(`Request: ${safeStringifyJson(options)}`)\n    }\n\n    return cancellationToken.createPromise<string>((resolve, reject, onCancel) => {\n      const request = this.createRequest(options, (response: any) => {\n        try {\n          this.handleResponse(response, options, cancellationToken, resolve, reject, redirectCount, requestProcessor)\n        }\n        catch (e) {\n          reject(e)\n        }\n      })\n      this.addErrorAndTimeoutHandlers(request, reject)\n      this.addRedirectHandlers(request, options, reject, redirectCount, options => {\n        this.doApiRequest(options, cancellationToken, requestProcessor, redirectCount)\n          .then(resolve)\n          .catch(reject)\n      })\n      requestProcessor(request, reject)\n      onCancel(() => request.abort())\n    })\n  }\n\n  // noinspection JSUnusedLocalSymbols\n  protected addRedirectHandlers(request: any, options: RequestOptions, reject: (error: Error) => void, redirectCount: number, handler: (options: RequestOptions) => void) {\n    // not required for NodeJS\n  }\n\n  addErrorAndTimeoutHandlers(request: any, reject: (error: Error) => void) {\n    this.addTimeOutHandler(request, reject)\n    request.on(\"error\", reject)\n    request.on(\"aborted\", () => {\n      reject(new Error(\"Request has been aborted by the server\"))\n    })\n  }\n\n  private handleResponse(response: IncomingMessage,\n                         options: RequestOptions,\n                         cancellationToken: CancellationToken,\n                         resolve: (data?: any) => void,\n                         reject: (error: Error) => void,\n                         redirectCount: number,\n                         requestProcessor: (request: REQUEST, reject: (error: Error) => void) => void) {\n    if (debug.enabled) {\n      debug(`Response: ${response.statusCode} ${response.statusMessage}, request options: ${safeStringifyJson(options)}`)\n    }\n\n    // we handle any other >= 400 error on request end (read detailed message in the response body)\n    if (response.statusCode === 404) {\n      // error is clear, we don't need to read detailed error description\n      reject(createHttpError(response, `method: ${options.method || \"GET\"} url: ${options.protocol || \"https:\"}//${options.hostname}${options.port ? `:${options.port}` : \"\"}${options.path}\n\nPlease double check that your authentication token is correct. Due to security reasons actual status maybe not reported, but 404.\n`))\n      return\n    }\n    else if (response.statusCode === 204) {\n      // on DELETE request\n      resolve()\n      return\n    }\n\n    const redirectUrl = safeGetHeader(response, \"location\")\n    if (redirectUrl != null) {\n      if (redirectCount > this.maxRedirects) {\n        reject(this.createMaxRedirectError())\n        return\n      }\n\n      this.doApiRequest(HttpExecutor.prepareRedirectUrlOptions(redirectUrl, options), cancellationToken, requestProcessor, redirectCount)\n        .then(resolve)\n        .catch(reject)\n      return\n    }\n\n    response.setEncoding(\"utf8\")\n\n    let data = \"\"\n    response.on(\"data\", (chunk: string) => data += chunk)\n    response.on(\"end\", () => {\n      try {\n        if (response.statusCode != null && response.statusCode >= 400) {\n          const contentType = safeGetHeader(response, \"content-type\")\n          const isJson = contentType != null && (Array.isArray(contentType) ? contentType.find(it => it.includes(\"json\")) != null : contentType.includes(\"json\"))\n          reject(createHttpError(response, isJson ? JSON.parse(data) : data))\n        }\n        else {\n          resolve(data.length === 0 ? null : data)\n        }\n      }\n      catch (e) {\n        reject(e)\n      }\n    })\n  }\n\n  // noinspection JSUnusedLocalSymbols\n  abstract createRequest(options: any, callback: (response: any) => void): any\n\n  async downloadToBuffer(url: URL, options: DownloadOptions): Promise<Buffer> {\n    return await options.cancellationToken.createPromise<Buffer>((resolve, reject, onCancel) => {\n      let result: Buffer | null = null\n      const requestOptions = {\n        headers: options.headers || undefined,\n        // because PrivateGitHubProvider requires HttpExecutor.prepareRedirectUrlOptions logic, so, we need to redirect manually\n        redirect: \"manual\",\n      }\n      configureRequestUrl(url, requestOptions)\n      configureRequestOptions(requestOptions)\n      this.doDownload(requestOptions, {\n        destination: null,\n        options,\n        onCancel,\n        callback: error => {\n          if (error == null) {\n            resolve(result!!)\n          }\n          else {\n            reject(error)\n          }\n        },\n        responseHandler: (response, callback) => {\n          const contentLength = safeGetHeader(response, \"content-length\")\n          let position = -1\n          if (contentLength != null) {\n            const size = parseInt(contentLength, 10)\n            if (size > 0) {\n              if (size > 5242880) {\n                callback(new Error(\"Maximum allowed size is 5 MB\"))\n                return\n              }\n\n              result = Buffer.alloc(size)\n              position = 0\n            }\n          }\n          response.on(\"data\", (chunk: Buffer) => {\n            if (position !== -1) {\n              chunk.copy(result!!, position)\n              position += chunk.length\n            }\n            else if (result == null) {\n              result = chunk\n            }\n            else {\n              if (result.length > 5242880) {\n                callback(new Error(\"Maximum allowed size is 5 MB\"))\n                return\n              }\n              result = Buffer.concat([result, chunk])\n            }\n          })\n          response.on(\"end\", () => {\n            if (result != null && position !== -1 && position !== result.length) {\n              callback(new Error(`Received data length ${position} is not equal to expected ${result.length}`))\n            }\n            else {\n              callback(null)\n            }\n          })\n        },\n      }, 0)\n    })\n  }\n\n  protected doDownload(requestOptions: any, options: DownloadCallOptions, redirectCount: number) {\n    const request = this.createRequest(requestOptions, (response: IncomingMessage) => {\n      if (response.statusCode! >= 400) {\n        options.callback(new Error(`Cannot download \"${requestOptions.protocol || \"https:\"}//${requestOptions.hostname}${requestOptions.path}\", status ${response.statusCode}: ${response.statusMessage}`))\n        return\n      }\n\n      // this code not relevant for Electron (redirect event instead handled)\n      const redirectUrl = safeGetHeader(response, \"location\")\n      if (redirectUrl != null) {\n        if (redirectCount < this.maxRedirects) {\n          this.doDownload(HttpExecutor.prepareRedirectUrlOptions(redirectUrl, requestOptions), options, redirectCount++)\n        }\n        else {\n          options.callback(this.createMaxRedirectError())\n        }\n        return\n      }\n\n      if (options.responseHandler == null) {\n        configurePipes(options, response)\n      }\n      else {\n        options.responseHandler(response, options.callback)\n      }\n    })\n    this.addErrorAndTimeoutHandlers(request, options.callback)\n    this.addRedirectHandlers(request, requestOptions, options.callback, redirectCount, requestOptions => {\n      this.doDownload(requestOptions, options, redirectCount++)\n    })\n    request.end()\n  }\n\n  protected createMaxRedirectError() {\n    return new Error(`Too many redirects (> ${this.maxRedirects})`)\n  }\n\n  private addTimeOutHandler(request: any, callback: (error: Error) => void) {\n    request.on(\"socket\", (socket: Socket) => {\n      socket.setTimeout(60 * 1000, () => {\n        request.abort()\n        callback(new Error(\"Request timed out\"))\n      })\n    })\n  }\n\n  static prepareRedirectUrlOptions(redirectUrl: string, options: RequestOptions): RequestOptions {\n    const newOptions = configureRequestOptionsFromUrl(redirectUrl, {...options})\n    const headers = newOptions.headers\n    if (headers != null && headers.authorization != null && (headers.authorization as string).startsWith(\"token\")) {\n      const parsedNewUrl = new URL(redirectUrl)\n      if (parsedNewUrl.hostname.endsWith(\".amazonaws.com\")) {\n        delete headers.authorization\n      }\n    }\n    return newOptions\n  }\n}\n\nexport interface DownloadCallOptions {\n  responseHandler: ((response: IncomingMessage, callback: (error: Error | null) => void) => void) | null\n  onCancel: (callback: () => void) => void\n  callback: (error: Error | null) => void\n\n  options: DownloadOptions\n\n  destination: string | null\n}\n\nexport function configureRequestOptionsFromUrl(url: string, options: RequestOptions) {\n  const result = configureRequestOptions(options)\n  configureRequestUrl(new URL(url), result)\n  return result\n}\n\nexport function configureRequestUrl(url: URL, options: RequestOptions): void {\n  options.protocol = url.protocol\n  options.hostname = url.hostname\n  if (url.port) {\n    options.port = url.port\n  }\n  else if (options.port) {\n    delete options.port\n  }\n  options.path = url.pathname + url.search\n}\n\nexport class DigestTransform extends Transform {\n  private readonly digester: Hash\n\n  private _actual: string | null = null\n\n  // noinspection JSUnusedGlobalSymbols\n  get actual() {\n    return this._actual\n  }\n\n  isValidateOnEnd: boolean = true\n\n  constructor(readonly expected: string, private readonly algorithm: string = \"sha512\", private readonly encoding: \"hex\" | \"base64\" | \"latin1\" = \"base64\") {\n    super()\n\n    this.digester = createHash(algorithm)\n  }\n\n  // noinspection JSUnusedGlobalSymbols\n  _transform(chunk: Buffer, encoding: string, callback: any) {\n    this.digester.update(chunk)\n    callback(null, chunk)\n  }\n\n  // noinspection JSUnusedGlobalSymbols\n  _flush(callback: any): void {\n    this._actual = this.digester.digest(this.encoding)\n\n    if (this.isValidateOnEnd) {\n      try {\n        this.validate()\n      }\n      catch (e) {\n        callback(e)\n        return\n      }\n    }\n\n    callback(null)\n  }\n\n  validate() {\n    if (this._actual == null) {\n      throw newError(\"Not finished yet\", \"ERR_STREAM_NOT_FINISHED\")\n    }\n\n    if (this._actual !== this.expected) {\n      throw newError(`${this.algorithm} checksum mismatch, expected ${this.expected}, got ${this._actual}`, \"ERR_CHECKSUM_MISMATCH\")\n    }\n\n    return null\n  }\n}\n\nfunction checkSha2(sha2Header: string | null | undefined, sha2: string | null | undefined, callback: (error: Error | null) => void): boolean {\n  if (sha2Header != null && sha2 != null && sha2Header !== sha2) {\n    callback(new Error(`checksum mismatch: expected ${sha2} but got ${sha2Header} (X-Checksum-Sha2 header)`))\n    return false\n  }\n  return true\n}\n\nexport function safeGetHeader(response: any, headerKey: string) {\n  const value = response.headers[headerKey]\n  if (value == null) {\n    return null\n  }\n  else if (Array.isArray(value)) {\n    // electron API\n    return value.length === 0 ? null : value[value.length - 1]\n  }\n  else {\n    return value\n  }\n}\n\nfunction configurePipes(options: DownloadCallOptions, response: IncomingMessage) {\n  if (!checkSha2(safeGetHeader(response, \"X-Checksum-Sha2\"), options.options.sha2, options.callback)) {\n    return\n  }\n\n  const streams: Array<any> = []\n  if (options.options.onProgress != null) {\n    const contentLength = safeGetHeader(response, \"content-length\")\n    if (contentLength != null) {\n      streams.push(new ProgressCallbackTransform(parseInt(contentLength, 10), options.options.cancellationToken, options.options.onProgress))\n    }\n  }\n\n  const sha512 = options.options.sha512\n  if (sha512 != null) {\n    streams.push(new DigestTransform(sha512, \"sha512\", sha512.length === 128 && !sha512.includes(\"+\") && !sha512.includes(\"Z\") && !sha512.includes(\"=\") ? \"hex\" : \"base64\"))\n  }\n  else if (options.options.sha2 != null) {\n    streams.push(new DigestTransform(options.options.sha2, \"sha256\", \"hex\"))\n  }\n\n  const fileOut = createWriteStream(options.destination!!)\n  streams.push(fileOut)\n\n  let lastStream = response\n  for (const stream of streams) {\n    stream.on(\"error\", (error: Error) => {\n      if (!options.options.cancellationToken.cancelled) {\n        options.callback(error)\n      }\n    })\n    lastStream = lastStream.pipe(stream)\n  }\n\n  fileOut.on(\"finish\", () => {\n    (fileOut.close as any)(options.callback)\n  })\n}\n\nexport function configureRequestOptions(options: RequestOptions, token?: string | null, method?: \"GET\" | \"DELETE\" | \"PUT\"): RequestOptions {\n  if (method != null) {\n    options.method = method\n  }\n\n  let headers = options.headers\n  if (headers == null) {\n    headers = {}\n    options.headers = headers\n  }\n  if (token != null) {\n    (headers as any).authorization = token.startsWith(\"Basic\") ? token : `token ${token}`\n  }\n  if (headers[\"User-Agent\"] == null) {\n    headers[\"User-Agent\"] = \"electron-builder\"\n  }\n\n  if ((method == null || method === \"GET\") || headers[\"Cache-Control\"] == null) {\n    headers[\"Cache-Control\"] = \"no-cache\"\n  }\n\n  // do not specify for node (in any case we use https module)\n  if (options.protocol == null && (process.versions as any).electron != null) {\n    options.protocol = \"https:\"\n  }\n  return options\n}\n\nexport function safeStringifyJson(data: any, skippedNames?: Set<string>) {\n  return JSON.stringify(data, (name, value) => {\n    if (name.endsWith(\"authorization\") || name.endsWith(\"Password\") || name.endsWith(\"PASSWORD\") || name.endsWith(\"Token\") || name.includes(\"password\") || name.includes(\"token\") || (skippedNames != null && skippedNames.has(name))) {\n      return \"<stripped sensitive data>\"\n    }\n    return value\n  }, 2)\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.asArray = asArray;
exports.newError = newError;
Object.defineProperty(exports, "CancellationToken", {
  enumerable: true,
  get: function () {
    return _CancellationToken().CancellationToken;
  }
});
Object.defineProperty(exports, "CancellationError", {
  enumerable: true,
  get: function () {
    return _CancellationToken().CancellationError;
  }
});
Object.defineProperty(exports, "HttpError", {
  enumerable: true,
  get: function () {
    return _httpExecutor().HttpError;
  }
});
Object.defineProperty(exports, "createHttpError", {
  enumerable: true,
  get: function () {
    return _httpExecutor().createHttpError;
  }
});
Object.defineProperty(exports, "HttpExecutor", {
  enumerable: true,
  get: function () {
    return _httpExecutor().HttpExecutor;
  }
});
Object.defineProperty(exports, "DigestTransform", {
  enumerable: true,
  get: function () {
    return _httpExecutor().DigestTransform;
  }
});
Object.defineProperty(exports, "safeGetHeader", {
  enumerable: true,
  get: function () {
    return _httpExecutor().safeGetHeader;
  }
});
Object.defineProperty(exports, "configureRequestOptions", {
  enumerable: true,
  get: function () {
    return _httpExecutor().configureRequestOptions;
  }
});
Object.defineProperty(exports, "configureRequestOptionsFromUrl", {
  enumerable: true,
  get: function () {
    return _httpExecutor().configureRequestOptionsFromUrl;
  }
});
Object.defineProperty(exports, "safeStringifyJson", {
  enumerable: true,
  get: function () {
    return _httpExecutor().safeStringifyJson;
  }
});
Object.defineProperty(exports, "parseJson", {
  enumerable: true,
  get: function () {
    return _httpExecutor().parseJson;
  }
});
Object.defineProperty(exports, "configureRequestUrl", {
  enumerable: true,
  get: function () {
    return _httpExecutor().configureRequestUrl;
  }
});
Object.defineProperty(exports, "getS3LikeProviderBaseUrl", {
  enumerable: true,
  get: function () {
    return _publishOptions().getS3LikeProviderBaseUrl;
  }
});
Object.defineProperty(exports, "githubUrl", {
  enumerable: true,
  get: function () {
    return _publishOptions().githubUrl;
  }
});
Object.defineProperty(exports, "parseDn", {
  enumerable: true,
  get: function () {
    return _rfc2253Parser().parseDn;
  }
});
Object.defineProperty(exports, "UUID", {
  enumerable: true,
  get: function () {
    return _uuid().UUID;
  }
});
Object.defineProperty(exports, "ProgressCallbackTransform", {
  enumerable: true,
  get: function () {
    return _ProgressCallbackTransform().ProgressCallbackTransform;
  }
});
Object.defineProperty(exports, "parseXml", {
  enumerable: true,
  get: function () {
    return _xml().parseXml;
  }
});
Object.defineProperty(exports, "XElement", {
  enumerable: true,
  get: function () {
    return _xml().XElement;
  }
});
exports.CURRENT_APP_PACKAGE_FILE_NAME = exports.CURRENT_APP_INSTALLER_FILE_NAME = void 0;

function _CancellationToken() {
  const data = require("./CancellationToken");

  _CancellationToken = function () {
    return data;
  };

  return data;
}

function _httpExecutor() {
  const data = require("./httpExecutor");

  _httpExecutor = function () {
    return data;
  };

  return data;
}

function _publishOptions() {
  const data = require("./publishOptions");

  _publishOptions = function () {
    return data;
  };

  return data;
}

function _rfc2253Parser() {
  const data = require("./rfc2253Parser");

  _rfc2253Parser = function () {
    return data;
  };

  return data;
}

function _uuid() {
  const data = require("./uuid");

  _uuid = function () {
    return data;
  };

  return data;
}

function _ProgressCallbackTransform() {
  const data = require("./ProgressCallbackTransform");

  _ProgressCallbackTransform = function () {
    return data;
  };

  return data;
}

function _xml() {
  const data = require("./xml");

  _xml = function () {
    return data;
  };

  return data;
}

// nsis
const CURRENT_APP_INSTALLER_FILE_NAME = "installer.exe"; // nsis-web

exports.CURRENT_APP_INSTALLER_FILE_NAME = CURRENT_APP_INSTALLER_FILE_NAME;
const CURRENT_APP_PACKAGE_FILE_NAME = "package.7z";
exports.CURRENT_APP_PACKAGE_FILE_NAME = CURRENT_APP_PACKAGE_FILE_NAME;

function asArray(v) {
  if (v == null) {
    return [];
  } else if (Array.isArray(v)) {
    return v;
  } else {
    return [v];
  }
}

function newError(message, code) {
  const error = new Error(message);
  error.code = code;
  return error;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=index.js.map{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AACO,MAAM,+BAA+B,GAAG,eAAxC,C,CACP;;;AACO,MAAM,6BAA6B,GAAG,YAAtC;;;AAED,SAAU,OAAV,CAAqB,CAArB,EAAuD;AAC3D,MAAI,CAAC,IAAI,IAAT,EAAe;AACb,WAAO,EAAP;AACD,GAFD,MAGK,IAAI,KAAK,CAAC,OAAN,CAAc,CAAd,CAAJ,EAAsB;AACzB,WAAO,CAAP;AACD,GAFI,MAGA;AACH,WAAO,CAAC,CAAD,CAAP;AACD;AACF;;AAEK,SAAU,QAAV,CAAmB,OAAnB,EAAoC,IAApC,EAAgD;AACpD,QAAM,KAAK,GAAG,IAAI,KAAJ,CAAU,OAAV,CAAd;AACC,EAAA,KAA+B,CAAC,IAAhC,GAAuC,IAAvC;AACD,SAAO,KAAP;AACD,C","sourcesContent":["export { CancellationToken, CancellationError } from \"./CancellationToken\"\nexport { HttpError, createHttpError, HttpExecutor, DownloadOptions, DigestTransform, RequestHeaders, safeGetHeader, configureRequestOptions, configureRequestOptionsFromUrl, safeStringifyJson, parseJson, configureRequestUrl } from \"./httpExecutor\"\nexport { BintrayOptions, GenericServerOptions, GithubOptions, PublishConfiguration, S3Options, SpacesOptions, BaseS3Options, getS3LikeProviderBaseUrl, Publish, githubUrl, PublishProvider, AllPublishOptions } from \"./publishOptions\"\nexport { UpdateInfo, UpdateFileInfo, WindowsUpdateInfo, BlockMapDataHolder, PackageFileInfo, ReleaseNoteInfo } from \"./updateInfo\"\nexport { parseDn } from \"./rfc2253Parser\"\nexport { UUID } from \"./uuid\"\nexport { ProgressCallbackTransform, ProgressInfo } from \"./ProgressCallbackTransform\"\nexport { parseXml, XElement } from \"./xml\"\nexport { BlockMap } from \"./blockMapApi\"\n\n// nsis\nexport const CURRENT_APP_INSTALLER_FILE_NAME = \"installer.exe\"\n// nsis-web\nexport const CURRENT_APP_PACKAGE_FILE_NAME = \"package.7z\"\n\nexport function asArray<T>(v: null | undefined | T | Array<T>): Array<T> {\n  if (v == null) {\n    return []\n  }\n  else if (Array.isArray(v)) {\n    return v\n  }\n  else {\n    return [v]\n  }\n}\n\nexport function newError(message: string, code: string) {\n  const error = new Error(message);\n  (error as NodeJS.ErrnoException).code = code\n  return error\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.githubUrl = githubUrl;
exports.getS3LikeProviderBaseUrl = getS3LikeProviderBaseUrl;

/** @private */
function githubUrl(options, defaultHost = "github.com") {
  return `${options.protocol || "https"}://${options.host || defaultHost}`;
}

function getS3LikeProviderBaseUrl(configuration) {
  const provider = configuration.provider;

  if (provider === "s3") {
    return s3Url(configuration);
  }

  if (provider === "spaces") {
    return spacesUrl(configuration);
  }

  throw new Error(`Not supported provider: ${provider}`);
}

function s3Url(options) {
  let url;

  if (options.endpoint != null) {
    url = `${options.endpoint}/${options.bucket}`;
  } else if (options.bucket.includes(".")) {
    if (options.region == null) {
      throw new Error(`Bucket name "${options.bucket}" includes a dot, but S3 region is missing`);
    } // special case, see http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro


    if (options.region === "us-east-1") {
      url = `https://s3.amazonaws.com/${options.bucket}`;
    } else {
      url = `https://s3-${options.region}.amazonaws.com/${options.bucket}`;
    }
  } else if (options.region === "cn-north-1") {
    url = `https://${options.bucket}.s3.${options.region}.amazonaws.com.cn`;
  } else {
    url = `https://${options.bucket}.s3.amazonaws.com`;
  }

  return appendPath(url, options.path);
}

function appendPath(url, p) {
  if (p != null && p.length > 0) {
    if (!p.startsWith("/")) {
      url += "/";
    }

    url += p;
  }

  return url;
}

function spacesUrl(options) {
  if (options.name == null) {
    throw new Error(`name is missing`);
  }

  if (options.region == null) {
    throw new Error(`region is missing`);
  }

  return appendPath(`https://${options.name}.${options.region}.digitaloceanspaces.com`, options.path);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=publishOptions.js.map{"version":3,"sources":["../src/publishOptions.ts"],"names":[],"mappings":";;;;;;;;AAoGA;AACM,SAAU,SAAV,CAAoB,OAApB,EAA4C,WAAA,GAAsB,YAAlE,EAA8E;AAClF,SAAO,GAAG,OAAO,CAAC,QAAR,IAAoB,OAAO,MAAM,OAAO,CAAC,IAAR,IAAgB,WAAW,EAAtE;AACD;;AAkHK,SAAU,wBAAV,CAAmC,aAAnC,EAAsE;AAC1E,QAAM,QAAQ,GAAG,aAAa,CAAC,QAA/B;;AACA,MAAI,QAAQ,KAAK,IAAjB,EAAuB;AACrB,WAAO,KAAK,CAAE,aAAF,CAAZ;AACD;;AACD,MAAI,QAAQ,KAAK,QAAjB,EAA2B;AACzB,WAAO,SAAS,CAAE,aAAF,CAAhB;AACD;;AACD,QAAM,IAAI,KAAJ,CAAU,2BAA2B,QAAQ,EAA7C,CAAN;AACD;;AAED,SAAS,KAAT,CAAe,OAAf,EAAiC;AAC/B,MAAI,GAAJ;;AACA,MAAI,OAAO,CAAC,QAAR,IAAoB,IAAxB,EAA8B;AAC5B,IAAA,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,EAA3C;AACD,GAFD,MAGK,IAAI,OAAO,CAAC,MAAR,CAAe,QAAf,CAAwB,GAAxB,CAAJ,EAAkC;AACrC,QAAI,OAAO,CAAC,MAAR,IAAkB,IAAtB,EAA4B;AAC1B,YAAM,IAAI,KAAJ,CAAU,gBAAgB,OAAO,CAAC,MAAM,4CAAxC,CAAN;AACD,KAHoC,CAKrC;;;AACA,QAAI,OAAO,CAAC,MAAR,KAAmB,WAAvB,EAAoC;AAClC,MAAA,GAAG,GAAG,4BAA4B,OAAO,CAAC,MAAM,EAAhD;AACD,KAFD,MAGK;AACH,MAAA,GAAG,GAAG,cAAc,OAAO,CAAC,MAAM,kBAAkB,OAAO,CAAC,MAAM,EAAlE;AACD;AACF,GAZI,MAaA,IAAI,OAAO,CAAC,MAAR,KAAmB,YAAvB,EAAqC;AACxC,IAAA,GAAG,GAAG,WAAW,OAAO,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,mBAApD;AACD,GAFI,MAGA;AACH,IAAA,GAAG,GAAG,WAAW,OAAO,CAAC,MAAM,mBAA/B;AACD;;AACD,SAAO,UAAU,CAAC,GAAD,EAAM,OAAO,CAAC,IAAd,CAAjB;AACD;;AAED,SAAS,UAAT,CAAoB,GAApB,EAAiC,CAAjC,EAA6D;AAC3D,MAAI,CAAC,IAAI,IAAL,IAAa,CAAC,CAAC,MAAF,GAAW,CAA5B,EAA+B;AAC7B,QAAI,CAAC,CAAC,CAAC,UAAF,CAAa,GAAb,CAAL,EAAwB;AACtB,MAAA,GAAG,IAAI,GAAP;AACD;;AACD,IAAA,GAAG,IAAI,CAAP;AACD;;AACD,SAAO,GAAP;AACD;;AAED,SAAS,SAAT,CAAmB,OAAnB,EAAyC;AACvC,MAAI,OAAO,CAAC,IAAR,IAAgB,IAApB,EAA0B;AACxB,UAAM,IAAI,KAAJ,CAAU,iBAAV,CAAN;AACD;;AACD,MAAI,OAAO,CAAC,MAAR,IAAkB,IAAtB,EAA4B;AAC1B,UAAM,IAAI,KAAJ,CAAU,mBAAV,CAAN;AACD;;AACD,SAAO,UAAU,CAAC,WAAW,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,yBAA1C,EAAqE,OAAO,CAAC,IAA7E,CAAjB;AACD,C","sourcesContent":["export type PublishProvider = \"github\" | \"bintray\" | \"s3\" | \"spaces\" | \"generic\" | \"custom\"\n\n// typescript-json-schema generates only PublishConfiguration if it is specified in the list, so, it is not added here\nexport type AllPublishOptions = string | GithubOptions | S3Options | SpacesOptions | GenericServerOptions | BintrayOptions | CustomPublishOptions\n// https://github.com/YousefED/typescript-json-schema/issues/80\nexport type Publish = AllPublishOptions | Array<AllPublishOptions> | null\n\nexport interface PublishConfiguration {\n  /**\n   * The provider.\n   */\n  readonly provider: PublishProvider\n\n  /**\n   * @private\n   * win-only\n   */\n  publisherName?: Array<string> | null\n\n  /**\n   * @private\n   * win-only\n   */\n  readonly updaterCacheDirName?: string | null\n\n  /**\n   * Whether to publish auto update info files.\n   *\n   * Auto update relies only on the first provider in the list (you can specify several publishers).\n   * Thus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.\n   *\n   * @default true\n   */\n  readonly publishAutoUpdate?: boolean\n}\n\n// https://github.com/electron-userland/electron-builder/issues/3261\nexport interface CustomPublishOptions extends PublishConfiguration {\n  [index: string]: any\n}\n\n/**\n * [GitHub](https://help.github.com/articles/about-releases/) options.\n *\n * GitHub [personal access token](https://help.github.com/articles/creating-an-access-token-for-command-line-use/) is required. You can generate by going to [https://github.com/settings/tokens/new](https://github.com/settings/tokens/new). The access token should have the repo scope/permission.\n * Define `GH_TOKEN` environment variable.\n */\nexport interface GithubOptions extends PublishConfiguration {\n  /**\n   * The provider. Must be `github`.\n   */\n  readonly provider: \"github\"\n\n  /**\n   * The repository name. [Detected automatically](#github-repository-and-bintray-package).\n   */\n  readonly repo?: string | null\n\n  /**\n   * The owner.\n   */\n  readonly owner?: string | null\n\n  /**\n   * Whether to use `v`-prefixed tag name.\n   * @default true\n   */\n  readonly vPrefixedTagName?: boolean\n\n  /**\n   * The host (including the port if need).\n   * @default github.com\n   */\n  readonly host?: string | null\n\n  /**\n   * The protocol. GitHub Publisher supports only `https`.\n   * @default https\n   */\n  readonly protocol?: \"https\" | \"http\" | null\n\n  /**\n   * The access token to support auto-update from private github repositories. Never specify it in the configuration files. Only for [setFeedURL](/auto-update#appupdatersetfeedurloptions).\n   */\n  readonly token?: string | null\n\n  /**\n   * Whether to use private github auto-update provider if `GH_TOKEN` environment variable is defined. See [Private GitHub Update Repo](/auto-update#private-github-update-repo).\n   */\n  readonly private?: boolean | null\n\n  /**\n   * The type of release. By default `draft` release will be created.\n   *\n   * Also you can set release type using environment variable. If `EP_DRAFT`is set to `true` â€” `draft`, if `EP_PRE_RELEASE`is set to `true` â€” `prerelease`.\n   * @default draft\n   */\n  releaseType?: \"draft\" | \"prerelease\" | \"release\" | null\n}\n\n/** @private */\nexport function githubUrl(options: GithubOptions, defaultHost: string = \"github.com\") {\n  return `${options.protocol || \"https\"}://${options.host || defaultHost}`\n}\n\n/**\n * Generic (any HTTP(S) server) options.\n * In all publish options [File Macros](/file-patterns#file-macros) are supported.\n */\nexport interface GenericServerOptions extends PublishConfiguration {\n  /**\n   * The provider. Must be `generic`.\n   */\n  readonly provider: \"generic\"\n\n  /**\n   * The base url. e.g. `https://bucket_name.s3.amazonaws.com`.\n   */\n  readonly url: string\n\n  /**\n   * The channel.\n   * @default latest\n   */\n  readonly channel?: string | null\n\n  /**\n   * Whether to use multiple range requests for differential update. Defaults to `true` if `url` doesn't contain `s3.amazonaws.com`.\n   */\n  readonly useMultipleRangeRequest?: boolean\n}\n\nexport interface BaseS3Options extends PublishConfiguration {\n  /**\n   * The update channel.\n   * @default latest\n   */\n  channel?: string | null\n\n  /**\n   * The directory path.\n   * @default /\n   */\n  readonly path?: string | null\n\n  /**\n   * The ACL. Set to `null` to not [add](https://github.com/electron-userland/electron-builder/issues/1822).\n   *\n   * @default public-read\n   */\n  readonly acl?: \"private\" | \"public-read\" | null\n}\n\nexport interface S3Options extends BaseS3Options {\n  /**\n   * The provider. Must be `s3`.\n   */\n  readonly provider: \"s3\"\n\n  /**\n   * The bucket name.\n   */\n  readonly bucket: string\n\n  /**\n   * The region. Is determined and set automatically when publishing.\n   */\n  region?: string | null\n\n  /**\n   * The ACL. Set to `null` to not [add](https://github.com/electron-userland/electron-builder/issues/1822).\n   *\n   * Please see [required permissions for the S3 provider](https://github.com/electron-userland/electron-builder/issues/1618#issuecomment-314679128).\n   *\n   * @default public-read\n   */\n  readonly acl?: \"private\" | \"public-read\" | null\n\n  /**\n   * The type of storage to use for the object.\n   * @default STANDARD\n   */\n  readonly storageClass?: \"STANDARD\" | \"REDUCED_REDUNDANCY\" | \"STANDARD_IA\" | null\n\n  /**\n   * Server-side encryption algorithm to use for the object.\n   */\n  readonly encryption?: \"AES256\" | \"aws:kms\" | null\n\n  /**\n   * The endpoint URI to send requests to. The default endpoint is built from the configured region.\n   * The endpoint should be a string like `https://{service}.{region}.amazonaws.com`.\n   */\n  readonly endpoint?: string | null\n}\n\n/**\n * [DigitalOcean Spaces](https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-spaces) options.\n * Access key is required, define `DO_KEY_ID` and `DO_SECRET_KEY` environment variables.\n */\nexport interface SpacesOptions extends BaseS3Options {\n  /**\n   * The provider. Must be `spaces`.\n   */\n  readonly provider: \"spaces\"\n\n  /**\n   * The space name.\n   */\n  readonly name: string\n\n  /**\n   * The region (e.g. `nyc3`).\n   */\n  readonly region: string\n}\n\nexport function getS3LikeProviderBaseUrl(configuration: PublishConfiguration) {\n  const provider = configuration.provider\n  if (provider === \"s3\") {\n    return s3Url((configuration as S3Options))\n  }\n  if (provider === \"spaces\") {\n    return spacesUrl((configuration as SpacesOptions))\n  }\n  throw new Error(`Not supported provider: ${provider}`)\n}\n\nfunction s3Url(options: S3Options) {\n  let url: string\n  if (options.endpoint != null) {\n    url = `${options.endpoint}/${options.bucket}`\n  }\n  else if (options.bucket.includes(\".\")) {\n    if (options.region == null) {\n      throw new Error(`Bucket name \"${options.bucket}\" includes a dot, but S3 region is missing`)\n    }\n\n    // special case, see http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n    if (options.region === \"us-east-1\") {\n      url = `https://s3.amazonaws.com/${options.bucket}`\n    }\n    else {\n      url = `https://s3-${options.region}.amazonaws.com/${options.bucket}`\n    }\n  }\n  else if (options.region === \"cn-north-1\") {\n    url = `https://${options.bucket}.s3.${options.region}.amazonaws.com.cn`\n  }\n  else {\n    url = `https://${options.bucket}.s3.amazonaws.com`\n  }\n  return appendPath(url, options.path)\n}\n\nfunction appendPath(url: string, p: string | null | undefined): string {\n  if (p != null && p.length > 0) {\n    if (!p.startsWith(\"/\")) {\n      url += \"/\"\n    }\n    url += p\n  }\n  return url\n}\n\nfunction spacesUrl(options: SpacesOptions) {\n  if (options.name == null) {\n    throw new Error(`name is missing`)\n  }\n  if (options.region == null) {\n    throw new Error(`region is missing`)\n  }\n  return appendPath(`https://${options.name}.${options.region}.digitaloceanspaces.com`, options.path)\n}\n\n/**\n * [Bintray](https://bintray.com/) options. Requires an API key. An API key can be obtained from the user [profile](https://bintray.com/profile/edit) page (\"Edit Your Profile\" -> API Key).\n * Define `BT_TOKEN` environment variable.\n */\nexport interface BintrayOptions extends PublishConfiguration {\n  /**\n   * The provider. Must be `bintray`.\n   */\n  readonly provider: \"bintray\"\n\n  /**\n   * The Bintray package name.\n   */\n  readonly package?: string | null\n\n  /**\n   * The Bintray repository name.\n   * @default generic\n   */\n  readonly repo?: string | null\n\n  /**\n   * The owner.\n   */\n  readonly owner?: string | null\n\n  /**\n   * The Bintray component (Debian only).\n   */\n  readonly component?: string | null\n\n  /**\n   * The Bintray distribution (Debian only).\n   * @default stable\n   */\n  readonly distribution?: string | null\n\n  /**\n   * The Bintray user account. Used in cases where the owner is an organization.\n   */\n  readonly user?: string | null\n\n  readonly token?: string | null\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.parseDn = parseDn;

function parseDn(seq) {
  let quoted = false;
  let key = null;
  let token = "";
  let nextNonSpace = 0;
  seq = seq.trim();
  const result = new Map();

  for (let i = 0; i <= seq.length; i++) {
    if (i === seq.length) {
      if (key !== null) {
        result.set(key, token);
      }

      break;
    }

    const ch = seq[i];

    if (quoted) {
      if (ch === '"') {
        quoted = false;
        continue;
      }
    } else {
      if (ch === '"') {
        quoted = true;
        continue;
      }

      if (ch === "\\") {
        i++;
        const ord = parseInt(seq.slice(i, i + 2), 16);

        if (Number.isNaN(ord)) {
          token += seq[i];
        } else {
          i++;
          token += String.fromCharCode(ord);
        }

        continue;
      }

      if (key === null && ch === "=") {
        key = token;
        token = "";
        continue;
      }

      if (ch === "," || ch === ";" || ch === "+") {
        if (key !== null) {
          result.set(key, token);
        }

        key = null;
        token = "";
        continue;
      }
    }

    if (ch === " " && !quoted) {
      if (token.length === 0) {
        continue;
      }

      if (i > nextNonSpace) {
        let j = i;

        while (seq[j] === " ") {
          j++;
        }

        nextNonSpace = j;
      }

      if (nextNonSpace >= seq.length || seq[nextNonSpace] === "," || seq[nextNonSpace] === ";" || key === null && seq[nextNonSpace] === "=" || key !== null && seq[nextNonSpace] === "+") {
        i = nextNonSpace - 1;
        continue;
      }
    }

    token += ch;
  }

  return result;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=rfc2253Parser.js.map{"version":3,"sources":["../src/rfc2253Parser.ts"],"names":[],"mappings":";;;;;;;AAAM,SAAU,OAAV,CAAkB,GAAlB,EAA6B;AACjC,MAAI,MAAM,GAAG,KAAb;AACA,MAAI,GAAG,GAAkB,IAAzB;AACA,MAAI,KAAK,GAAG,EAAZ;AACA,MAAI,YAAY,GAAG,CAAnB;AAEA,EAAA,GAAG,GAAG,GAAG,CAAC,IAAJ,EAAN;AACA,QAAM,MAAM,GAAG,IAAI,GAAJ,EAAf;;AACA,OAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,IAAI,GAAG,CAAC,MAAzB,EAAiC,CAAC,EAAlC,EAAsC;AACpC,QAAI,CAAC,KAAK,GAAG,CAAC,MAAd,EAAsB;AACpB,UAAI,GAAG,KAAK,IAAZ,EAAkB;AAChB,QAAA,MAAM,CAAC,GAAP,CAAW,GAAX,EAAgB,KAAhB;AACD;;AACD;AACD;;AAED,UAAM,EAAE,GAAG,GAAG,CAAC,CAAD,CAAd;;AACA,QAAI,MAAJ,EAAY;AACV,UAAI,EAAE,KAAK,GAAX,EAAgB;AACd,QAAA,MAAM,GAAG,KAAT;AACA;AACD;AACF,KALD,MAMK;AACH,UAAI,EAAE,KAAK,GAAX,EAAgB;AACd,QAAA,MAAM,GAAG,IAAT;AACA;AACD;;AAED,UAAI,EAAE,KAAK,IAAX,EAAiB;AACf,QAAA,CAAC;AACD,cAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAJ,CAAU,CAAV,EAAa,CAAC,GAAG,CAAjB,CAAD,EAAsB,EAAtB,CAApB;;AACA,YAAI,MAAM,CAAC,KAAP,CAAa,GAAb,CAAJ,EAAuB;AACrB,UAAA,KAAK,IAAI,GAAG,CAAC,CAAD,CAAZ;AACD,SAFD,MAGK;AACH,UAAA,CAAC;AACD,UAAA,KAAK,IAAI,MAAM,CAAC,YAAP,CAAoB,GAApB,CAAT;AACD;;AACD;AACD;;AAED,UAAI,GAAG,KAAK,IAAR,IAAgB,EAAE,KAAK,GAA3B,EAAgC;AAC9B,QAAA,GAAG,GAAG,KAAN;AACA,QAAA,KAAK,GAAG,EAAR;AACA;AACD;;AAED,UAAI,EAAE,KAAK,GAAP,IAAc,EAAE,KAAK,GAArB,IAA4B,EAAE,KAAK,GAAvC,EAA4C;AAC1C,YAAI,GAAG,KAAK,IAAZ,EAAkB;AAChB,UAAA,MAAM,CAAC,GAAP,CAAW,GAAX,EAAgB,KAAhB;AACD;;AACD,QAAA,GAAG,GAAG,IAAN;AACA,QAAA,KAAK,GAAG,EAAR;AACA;AACD;AACF;;AAED,QAAI,EAAE,KAAK,GAAP,IAAc,CAAC,MAAnB,EAA2B;AACzB,UAAI,KAAK,CAAC,MAAN,KAAiB,CAArB,EAAwB;AACtB;AACD;;AAED,UAAI,CAAC,GAAG,YAAR,EAAsB;AACpB,YAAI,CAAC,GAAG,CAAR;;AACA,eAAO,GAAG,CAAC,CAAD,CAAH,KAAW,GAAlB,EAAuB;AACrB,UAAA,CAAC;AACF;;AACD,QAAA,YAAY,GAAG,CAAf;AACD;;AAED,UAAI,YAAY,IAAI,GAAG,CAAC,MAApB,IACC,GAAG,CAAC,YAAD,CAAH,KAAsB,GADvB,IAEC,GAAG,CAAC,YAAD,CAAH,KAAsB,GAFvB,IAGE,GAAG,KAAK,IAAR,IAAgB,GAAG,CAAC,YAAD,CAAH,KAAsB,GAHxC,IAIE,GAAG,KAAK,IAAR,IAAgB,GAAG,CAAC,YAAD,CAAH,KAAsB,GAJ5C,EAKE;AACA,QAAA,CAAC,GAAG,YAAY,GAAG,CAAnB;AACA;AACD;AACF;;AAED,IAAA,KAAK,IAAI,EAAT;AACD;;AAED,SAAO,MAAP;AACD,C","sourcesContent":["export function parseDn(seq: string): Map<string, string> {\n  let quoted = false\n  let key: string | null = null\n  let token = \"\"\n  let nextNonSpace = 0\n\n  seq = seq.trim()\n  const result = new Map<string, string>()\n  for (let i = 0; i <= seq.length; i++) {\n    if (i === seq.length) {\n      if (key !== null) {\n        result.set(key, token)\n      }\n      break\n    }\n\n    const ch = seq[i]\n    if (quoted) {\n      if (ch === '\"') {\n        quoted = false\n        continue\n      }\n    }\n    else {\n      if (ch === '\"') {\n        quoted = true\n        continue\n      }\n\n      if (ch === \"\\\\\") {\n        i++\n        const ord = parseInt(seq.slice(i, i + 2), 16)\n        if (Number.isNaN(ord)) {\n          token += seq[i]\n        }\n        else {\n          i++\n          token += String.fromCharCode(ord)\n        }\n        continue\n      }\n\n      if (key === null && ch === \"=\") {\n        key = token\n        token = \"\"\n        continue\n      }\n\n      if (ch === \",\" || ch === \";\" || ch === \"+\") {\n        if (key !== null) {\n          result.set(key, token)\n        }\n        key = null\n        token = \"\"\n        continue\n      }\n    }\n\n    if (ch === \" \" && !quoted) {\n      if (token.length === 0) {\n        continue\n      }\n\n      if (i > nextNonSpace) {\n        let j = i\n        while (seq[j] === \" \") {\n          j++\n        }\n        nextNonSpace = j\n      }\n\n      if (nextNonSpace >= seq.length\n        || seq[nextNonSpace] === \",\"\n        || seq[nextNonSpace] === \";\"\n        || (key === null && seq[nextNonSpace] === \"=\")\n        || (key !== null && seq[nextNonSpace] === \"+\")\n      ) {\n        i = nextNonSpace - 1\n        continue\n      }\n    }\n\n    token += ch\n  }\n\n  return result\n}"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=updateInfo.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.nil = exports.UUID = void 0;

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("./index");

  _index = function () {
    return data;
  };

  return data;
}

const invalidName = "options.name must be either a string or a Buffer"; // Node ID according to rfc4122#section-4.5

const randomHost = (0, _crypto().randomBytes)(16);
randomHost[0] = randomHost[0] | 0x01; // lookup table hex to byte

const hex2byte = {}; // lookup table byte to hex

const byte2hex = []; // populate lookup tables

for (let i = 0; i < 256; i++) {
  const hex = (i + 0x100).toString(16).substr(1);
  hex2byte[hex] = i;
  byte2hex[i] = hex;
} // UUID class


class UUID {
  constructor(uuid) {
    this.ascii = null;
    this.binary = null;
    const check = UUID.check(uuid);

    if (!check) {
      throw new Error("not a UUID");
    }

    this.version = check.version;

    if (check.format === "ascii") {
      this.ascii = uuid;
    } else {
      this.binary = uuid;
    }
  }

  static v5(name, namespace) {
    return uuidNamed(name, "sha1", 0x50, namespace);
  }

  toString() {
    if (this.ascii == null) {
      this.ascii = stringify(this.binary);
    }

    return this.ascii;
  }

  inspect() {
    return `UUID v${this.version} ${this.toString()}`;
  }

  static check(uuid, offset = 0) {
    if (typeof uuid === "string") {
      uuid = uuid.toLowerCase();

      if (!/^[a-f0-9]{8}(-[a-f0-9]{4}){3}-([a-f0-9]{12})$/.test(uuid)) {
        return false;
      }

      if (uuid === "00000000-0000-0000-0000-000000000000") {
        return {
          version: undefined,
          variant: "nil",
          format: "ascii"
        };
      }

      return {
        version: (hex2byte[uuid[14] + uuid[15]] & 0xf0) >> 4,
        variant: getVariant((hex2byte[uuid[19] + uuid[20]] & 0xe0) >> 5),
        format: "ascii"
      };
    }

    if (Buffer.isBuffer(uuid)) {
      if (uuid.length < offset + 16) {
        return false;
      }

      let i = 0;

      for (; i < 16; i++) {
        if (uuid[offset + i] !== 0) {
          break;
        }
      }

      if (i === 16) {
        return {
          version: undefined,
          variant: "nil",
          format: "binary"
        };
      }

      return {
        version: (uuid[offset + 6] & 0xf0) >> 4,
        variant: getVariant((uuid[offset + 8] & 0xe0) >> 5),
        format: "binary"
      };
    }

    throw (0, _index().newError)("Unknown type of uuid", "ERR_UNKNOWN_UUID_TYPE");
  } // read stringified uuid into a Buffer


  static parse(input) {
    const buffer = Buffer.allocUnsafe(16);
    let j = 0;

    for (let i = 0; i < 16; i++) {
      buffer[i] = hex2byte[input[j++] + input[j++]];

      if (i === 3 || i === 5 || i === 7 || i === 9) {
        j += 1;
      }
    }

    return buffer;
  }

} // from rfc4122#appendix-C


exports.UUID = UUID;
UUID.OID = UUID.parse("6ba7b812-9dad-11d1-80b4-00c04fd430c8"); // according to rfc4122#section-4.1.1

function getVariant(bits) {
  switch (bits) {
    case 0:
    case 1:
    case 3:
      return "ncs";

    case 4:
    case 5:
      return "rfc4122";

    case 6:
      return "microsoft";

    default:
      return "future";
  }
}

var UuidEncoding;

(function (UuidEncoding) {
  UuidEncoding[UuidEncoding["ASCII"] = 0] = "ASCII";
  UuidEncoding[UuidEncoding["BINARY"] = 1] = "BINARY";
  UuidEncoding[UuidEncoding["OBJECT"] = 2] = "OBJECT";
})(UuidEncoding || (UuidEncoding = {})); // v3 + v5


function uuidNamed(name, hashMethod, version, namespace, encoding = UuidEncoding.ASCII) {
  const hash = (0, _crypto().createHash)(hashMethod);
  const nameIsNotAString = typeof name !== "string";

  if (nameIsNotAString && !Buffer.isBuffer(name)) {
    throw (0, _index().newError)(invalidName, "ERR_INVALID_UUID_NAME");
  }

  hash.update(namespace);
  hash.update(name);
  const buffer = hash.digest();
  let result;

  switch (encoding) {
    case UuidEncoding.BINARY:
      buffer[6] = buffer[6] & 0x0f | version;
      buffer[8] = buffer[8] & 0x3f | 0x80;
      result = buffer;
      break;

    case UuidEncoding.OBJECT:
      buffer[6] = buffer[6] & 0x0f | version;
      buffer[8] = buffer[8] & 0x3f | 0x80;
      result = new UUID(buffer);
      break;

    default:
      result = byte2hex[buffer[0]] + byte2hex[buffer[1]] + byte2hex[buffer[2]] + byte2hex[buffer[3]] + "-" + byte2hex[buffer[4]] + byte2hex[buffer[5]] + "-" + byte2hex[buffer[6] & 0x0f | version] + byte2hex[buffer[7]] + "-" + byte2hex[buffer[8] & 0x3f | 0x80] + byte2hex[buffer[9]] + "-" + byte2hex[buffer[10]] + byte2hex[buffer[11]] + byte2hex[buffer[12]] + byte2hex[buffer[13]] + byte2hex[buffer[14]] + byte2hex[buffer[15]];
      break;
  }

  return result;
}

function stringify(buffer) {
  return byte2hex[buffer[0]] + byte2hex[buffer[1]] + byte2hex[buffer[2]] + byte2hex[buffer[3]] + "-" + byte2hex[buffer[4]] + byte2hex[buffer[5]] + "-" + byte2hex[buffer[6]] + byte2hex[buffer[7]] + "-" + byte2hex[buffer[8]] + byte2hex[buffer[9]] + "-" + byte2hex[buffer[10]] + byte2hex[buffer[11]] + byte2hex[buffer[12]] + byte2hex[buffer[13]] + byte2hex[buffer[14]] + byte2hex[buffer[15]];
} // according to rfc4122#section-4.1.7


const nil = new UUID("00000000-0000-0000-0000-000000000000"); // UUID.v4 = uuidRandom
// UUID.v4fast = uuidRandomFast
// UUID.v3 = function(options, callback) {
//     return uuidNamed("md5", 0x30, options, callback)
// }
exports.nil = nil;
// __ts-babel@6.0.4
//# sourceMappingURL=uuid.js.map{"version":3,"sources":["../src/uuid.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from \"crypto\"\nimport { newError } from \"./index\"\n\nconst invalidName = \"options.name must be either a string or a Buffer\"\n\n// Node ID according to rfc4122#section-4.5\nconst randomHost = randomBytes(16)\nrandomHost[0] = randomHost[0] | 0x01\n\n// lookup table hex to byte\nconst hex2byte: any = {}\n\n// lookup table byte to hex\nconst byte2hex: Array<string> = []\n// populate lookup tables\nfor (let i = 0; i < 256; i++) {\n    const hex = (i + 0x100).toString(16).substr(1)\n    hex2byte[hex] = i\n    byte2hex[i] = hex\n}\n\n// UUID class\nexport class UUID {\n  private ascii: string | null = null\n  private readonly binary: Buffer | null = null\n  private readonly version: number\n\n  // from rfc4122#appendix-C\n  static readonly OID = UUID.parse(\"6ba7b812-9dad-11d1-80b4-00c04fd430c8\")\n\n  constructor(uuid: Buffer | string) {\n    const check = UUID.check(uuid)\n    if (!check) {\n      throw new Error(\"not a UUID\")\n    }\n\n    this.version = check.version!!\n\n    if (check.format === \"ascii\") {\n      this.ascii = uuid as string\n    }\n    else {\n      this.binary = uuid as Buffer\n    }\n  }\n\n  static v5(name: string | Buffer, namespace: Buffer) {\n    return uuidNamed(name, \"sha1\", 0x50, namespace)\n  }\n\n  toString() {\n    if (this.ascii == null) {\n      this.ascii = stringify(this.binary!!)\n    }\n    return this.ascii\n  }\n\n  inspect() {\n    return `UUID v${this.version} ${this.toString()}`\n  }\n\n  static check(uuid: Buffer | string, offset: number = 0) {\n    if (typeof uuid === \"string\") {\n      uuid = uuid.toLowerCase()\n\n      if (!/^[a-f0-9]{8}(-[a-f0-9]{4}){3}-([a-f0-9]{12})$/.test(uuid)) {\n        return false\n      }\n\n      if (uuid === \"00000000-0000-0000-0000-000000000000\") {\n        return {version: undefined, variant: \"nil\", format: \"ascii\"}\n      }\n\n      return {\n        version: (hex2byte[uuid[14] + uuid[15]] & 0xf0) >> 4,\n        variant: getVariant((hex2byte[uuid[19] + uuid[20]] & 0xe0) >> 5),\n        format: \"ascii\"\n      }\n    }\n\n    if (Buffer.isBuffer(uuid)) {\n      if (uuid.length < offset + 16) {\n        return false\n      }\n\n      let i = 0\n      for (; i < 16; i++) {\n        if (uuid[offset + i] !== 0) {\n          break\n        }\n      }\n      if (i === 16) {\n        return {version: undefined, variant: \"nil\", format: \"binary\"}\n      }\n\n      return {\n        version: (uuid[offset + 6] & 0xf0) >> 4,\n        variant: getVariant((uuid[offset + 8] & 0xe0) >> 5),\n        format: \"binary\"\n      }\n    }\n\n    throw newError(\"Unknown type of uuid\", \"ERR_UNKNOWN_UUID_TYPE\")\n  }\n\n  // read stringified uuid into a Buffer\n  static parse(input: string) {\n    const buffer = Buffer.allocUnsafe(16)\n    let j = 0\n    for (let i = 0; i < 16; i++) {\n      buffer[i] = hex2byte[input[j++] + input[j++]]\n      if (i === 3 || i === 5 || i === 7 || i === 9) {\n        j += 1\n      }\n    }\n    return buffer\n  }\n}\n\n// according to rfc4122#section-4.1.1\nfunction getVariant(bits: number) {\n  switch (bits) {\n    case 0:\n    case 1:\n    case 3:\n      return \"ncs\"\n    case 4:\n    case 5:\n      return \"rfc4122\"\n    case 6:\n      return \"microsoft\"\n    default:\n      return \"future\"\n  }\n}\n\nenum UuidEncoding {\n  ASCII, BINARY, OBJECT\n}\n\n// v3 + v5\nfunction uuidNamed(name: string | Buffer, hashMethod: string, version: number, namespace: Buffer, encoding: UuidEncoding = UuidEncoding.ASCII) {\n  const hash = createHash(hashMethod)\n\n  const nameIsNotAString = typeof name !== \"string\"\n  if (nameIsNotAString && !Buffer.isBuffer(name)) {\n    throw newError(invalidName, \"ERR_INVALID_UUID_NAME\")\n  }\n\n  hash.update(namespace)\n  hash.update(name)\n\n  const buffer = hash.digest()\n  let result: any\n  switch (encoding) {\n    case UuidEncoding.BINARY:\n      buffer[6] = (buffer[6] & 0x0f) | version\n      buffer[8] = (buffer[8] & 0x3f) | 0x80\n      result = buffer\n      break\n    case UuidEncoding.OBJECT:\n      buffer[6] = (buffer[6] & 0x0f) | version\n      buffer[8] = (buffer[8] & 0x3f) | 0x80\n      result = new UUID(buffer)\n      break\n    default:\n      result = byte2hex[buffer[0]] + byte2hex[buffer[1]] +\n        byte2hex[buffer[2]] + byte2hex[buffer[3]] + \"-\" +\n        byte2hex[buffer[4]] + byte2hex[buffer[5]] + \"-\" +\n        byte2hex[(buffer[6] & 0x0f) | version] +\n        byte2hex[buffer[7]] + \"-\" +\n        byte2hex[(buffer[8] & 0x3f) | 0x80] +\n        byte2hex[buffer[9]] + \"-\" +\n        byte2hex[buffer[10]] + byte2hex[buffer[11]] +\n        byte2hex[buffer[12]] + byte2hex[buffer[13]] +\n        byte2hex[buffer[14]] + byte2hex[buffer[15]]\n      break\n  }\n  return result\n}\n\nfunction stringify(buffer: Buffer) {\n  return byte2hex[buffer[0]] + byte2hex[buffer[1]] +\n    byte2hex[buffer[2]] + byte2hex[buffer[3]] + \"-\" +\n    byte2hex[buffer[4]] + byte2hex[buffer[5]] + \"-\" +\n    byte2hex[buffer[6]] + byte2hex[buffer[7]] + \"-\" +\n    byte2hex[buffer[8]] + byte2hex[buffer[9]] + \"-\" +\n    byte2hex[buffer[10]] + byte2hex[buffer[11]] +\n    byte2hex[buffer[12]] + byte2hex[buffer[13]] +\n    byte2hex[buffer[14]] + byte2hex[buffer[15]]\n}\n\n// according to rfc4122#section-4.1.7\nexport const nil = new UUID(\"00000000-0000-0000-0000-000000000000\")\n\n// UUID.v4 = uuidRandom\n\n// UUID.v4fast = uuidRandomFast\n\n// UUID.v3 = function(options, callback) {\n//     return uuidNamed(\"md5\", 0x30, options, callback)\n// }"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.parseXml = parseXml;
exports.XElement = void 0;

function sax() {
  const data = _interopRequireWildcard(require("sax"));

  sax = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("./index");

  _index = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class XElement {
  constructor(name) {
    this.name = name;
    this.value = "";
    this.attributes = null;
    this.isCData = false;
    this.elements = null;

    if (!name) {
      throw (0, _index().newError)("Element name cannot be empty", "ERR_XML_ELEMENT_NAME_EMPTY");
    }

    if (!isValidName(name)) {
      throw (0, _index().newError)(`Invalid element name: ${name}`, "ERR_XML_ELEMENT_INVALID_NAME");
    }
  }

  attribute(name) {
    const result = this.attributes === null ? null : this.attributes[name];

    if (result == null) {
      throw (0, _index().newError)(`No attribute "${name}"`, "ERR_XML_MISSED_ATTRIBUTE");
    }

    return result;
  }

  removeAttribute(name) {
    if (this.attributes !== null) {
      delete this.attributes[name];
    }
  }

  element(name, ignoreCase = false, errorIfMissed = null) {
    const result = this.elementOrNull(name, ignoreCase);

    if (result === null) {
      throw (0, _index().newError)(errorIfMissed || `No element "${name}"`, "ERR_XML_MISSED_ELEMENT");
    }

    return result;
  }

  elementOrNull(name, ignoreCase = false) {
    if (this.elements === null) {
      return null;
    }

    for (const element of this.elements) {
      if (isNameEquals(element, name, ignoreCase)) {
        return element;
      }
    }

    return null;
  }

  getElements(name, ignoreCase = false) {
    if (this.elements === null) {
      return [];
    }

    return this.elements.filter(it => isNameEquals(it, name, ignoreCase));
  }

  elementValueOrEmpty(name, ignoreCase = false) {
    const element = this.elementOrNull(name, ignoreCase);
    return element === null ? "" : element.value;
  }

}

exports.XElement = XElement;
const NAME_REG_EXP = new RegExp(/^[A-Za-z_][:A-Za-z0-9_-]*$/i);

function isValidName(name) {
  return NAME_REG_EXP.test(name);
}

function isNameEquals(element, name, ignoreCase) {
  const elementName = element.name;
  return elementName === name || ignoreCase === true && elementName.length === name.length && elementName.toLowerCase() === name.toLowerCase();
}

function parseXml(data) {
  let rootElement = null;
  const parser = sax().parser(true, {});
  const elements = [];

  parser.onopentag = saxElement => {
    const element = new XElement(saxElement.name);
    element.attributes = saxElement.attributes;

    if (rootElement === null) {
      rootElement = element;
    } else {
      const parent = elements[elements.length - 1];

      if (parent.elements == null) {
        parent.elements = [];
      }

      parent.elements.push(element);
    }

    elements.push(element);
  };

  parser.onclosetag = () => {
    elements.pop();
  };

  parser.ontext = text => {
    if (elements.length > 0) {
      elements[elements.length - 1].value = text;
    }
  };

  parser.oncdata = cdata => {
    const element = elements[elements.length - 1];
    element.value = cdata;
    element.isCData = true;
  };

  parser.onerror = err => {
    throw err;
  };

  parser.write(data);
  return rootElement;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=xml.js.map{"version":3,"sources":["../src/xml.ts"],"names":[],"mappings":"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","sourcesContent":["import * as sax from \"sax\"\nimport { newError } from \"./index\"\n\nexport class XElement {\n  value = \"\"\n  attributes: { [key: string]: string } | null = null\n  isCData = false\n  elements: Array<XElement> | null = null\n\n  constructor(readonly name: string) {\n    if (!name) {\n      throw newError(\"Element name cannot be empty\", \"ERR_XML_ELEMENT_NAME_EMPTY\")\n    }\n    if (!isValidName(name)) {\n      throw newError(`Invalid element name: ${name}`, \"ERR_XML_ELEMENT_INVALID_NAME\")\n    }\n  }\n\n  attribute(name: string): string {\n    const result = this.attributes === null ? null : this.attributes[name]\n    if (result == null) {\n      throw newError(`No attribute \"${name}\"`, \"ERR_XML_MISSED_ATTRIBUTE\")\n    }\n    return result\n  }\n\n  removeAttribute(name: string): void {\n    if (this.attributes !== null) {\n      delete this.attributes[name]\n    }\n  }\n\n  element(name: string, ignoreCase = false, errorIfMissed: string | null = null): XElement {\n    const result = this.elementOrNull(name, ignoreCase)\n    if (result === null) {\n      throw newError(errorIfMissed || `No element \"${name}\"`, \"ERR_XML_MISSED_ELEMENT\")\n    }\n    return result\n  }\n\n  elementOrNull(name: string, ignoreCase = false): XElement | null {\n    if (this.elements === null) {\n      return null\n    }\n\n    for (const element of this.elements) {\n      if (isNameEquals(element, name, ignoreCase)) {\n        return element\n      }\n    }\n\n    return null\n  }\n\n  getElements(name: string, ignoreCase = false) {\n    if (this.elements === null) {\n      return []\n    }\n    return this.elements.filter(it => isNameEquals(it, name, ignoreCase))\n  }\n\n  elementValueOrEmpty(name: string, ignoreCase = false): string {\n    const element = this.elementOrNull(name, ignoreCase)\n    return element === null ? \"\" : element.value\n  }\n}\n\nconst NAME_REG_EXP = new RegExp(/^[A-Za-z_][:A-Za-z0-9_-]*$/i)\n\nfunction isValidName(name: string) {\n  return (NAME_REG_EXP.test(name))\n}\n\nfunction isNameEquals(element: XElement, name: string, ignoreCase: boolean) {\n  const elementName = element.name\n  return elementName === name || (ignoreCase === true && elementName.length === name.length && elementName.toLowerCase() === name.toLowerCase())\n}\n\nexport function parseXml(data: string): XElement {\n  let rootElement: XElement | null = null\n  const parser = sax.parser(true, {})\n  const elements: Array<XElement> = []\n\n  parser.onopentag = saxElement => {\n    const element = new XElement(saxElement.name)\n    element.attributes = saxElement.attributes as { [key: string]: string }\n\n    if (rootElement === null) {\n      rootElement = element\n    }\n    else {\n      const parent = elements[elements.length - 1]\n      if (parent.elements == null) {\n        parent.elements = []\n      }\n      parent.elements.push(element)\n    }\n    elements.push(element)\n  }\n\n  parser.onclosetag = () => {\n    elements.pop()\n  }\n\n  parser.ontext = text => {\n    if (elements.length > 0) {\n      elements[elements.length - 1].value = text\n    }\n  }\n\n  parser.oncdata = cdata => {\n    const element = elements[elements.length - 1]\n    element.value = cdata\n    element.isCData = true\n  }\n\n  parser.onerror = err => {\n    throw err\n  }\n\n  parser.write(data)\n  return rootElement!!\n}"],"sourceRoot":""}
'use strict';
const escapeStringRegexp = require('escape-string-regexp');
const ansiStyles = require('ansi-styles');
const stdoutColor = require('supports-color').stdout;

const template = require('./templates.js');

const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm');

// `supportsColor.level` â†’ `ansiStyles.color[name]` mapping
const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m'];

// `color-convert` models to exclude from the Chalk API due to conflicts and such
const skipModels = new Set(['gray']);

const styles = Object.create(null);

function applyOptions(obj, options) {
	options = options || {};

	// Detect level if not set manually
	const scLevel = stdoutColor ? stdoutColor.level : 0;
	obj.level = options.level === undefined ? scLevel : options.level;
	obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0;
}

function Chalk(options) {
	// We check for this.template here since calling `chalk.constructor()`
	// by itself will have a `this` of a previously constructed chalk object
	if (!this || !(this instanceof Chalk) || this.template) {
		const chalk = {};
		applyOptions(chalk, options);

		chalk.template = function () {
			const args = [].slice.call(arguments);
			return chalkTag.apply(null, [chalk.template].concat(args));
		};

		Object.setPrototypeOf(chalk, Chalk.prototype);
		Object.setPrototypeOf(chalk.template, chalk);

		chalk.template.constructor = Chalk;

		return chalk.template;
	}

	applyOptions(this, options);
}

// Use bright blue on Windows as the normal blue color is illegible
if (isSimpleWindowsTerm) {
	ansiStyles.blue.open = '\u001B[94m';
}

for (const key of Object.keys(ansiStyles)) {
	ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');

	styles[key] = {
		get() {
			const codes = ansiStyles[key];
			return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key);
		}
	};
}

styles.visible = {
	get() {
		return build.call(this, this._styles || [], true, 'visible');
	}
};

ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g');
for (const model of Object.keys(ansiStyles.color.ansi)) {
	if (skipModels.has(model)) {
		continue;
	}

	styles[model] = {
		get() {
			const level = this.level;
			return function () {
				const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments);
				const codes = {
					open,
					close: ansiStyles.color.close,
					closeRe: ansiStyles.color.closeRe
				};
				return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
			};
		}
	};
}

ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g');
for (const model of Object.keys(ansiStyles.bgColor.ansi)) {
	if (skipModels.has(model)) {
		continue;
	}

	const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);
	styles[bgModel] = {
		get() {
			const level = this.level;
			return function () {
				const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments);
				const codes = {
					open,
					close: ansiStyles.bgColor.close,
					closeRe: ansiStyles.bgColor.closeRe
				};
				return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
			};
		}
	};
}

const proto = Object.defineProperties(() => {}, styles);

function build(_styles, _empty, key) {
	const builder = function () {
		return applyStyle.apply(builder, arguments);
	};

	builder._styles = _styles;
	builder._empty = _empty;

	const self = this;

	Object.defineProperty(builder, 'level', {
		enumerable: true,
		get() {
			return self.level;
		},
		set(level) {
			self.level = level;
		}
	});

	Object.defineProperty(builder, 'enabled', {
		enumerable: true,
		get() {
			return self.enabled;
		},
		set(enabled) {
			self.enabled = enabled;
		}
	});

	// See below for fix regarding invisible grey/dim combination on Windows
	builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey';

	// `__proto__` is used because we must return a function, but there is
	// no way to create a function with a different prototype
	builder.__proto__ = proto; // eslint-disable-line no-proto

	return builder;
}

function applyStyle() {
	// Support varags, but simply cast to string in case there's only one arg
	const args = arguments;
	const argsLen = args.length;
	let str = String(arguments[0]);

	if (argsLen === 0) {
		return '';
	}

	if (argsLen > 1) {
		// Don't slice `arguments`, it prevents V8 optimizations
		for (let a = 1; a < argsLen; a++) {
			str += ' ' + args[a];
		}
	}

	if (!this.enabled || this.level <= 0 || !str) {
		return this._empty ? '' : str;
	}

	// Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,
	// see https://github.com/chalk/chalk/issues/58
	// If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.
	const originalDim = ansiStyles.dim.open;
	if (isSimpleWindowsTerm && this.hasGrey) {
		ansiStyles.dim.open = '';
	}

	for (const code of this._styles.slice().reverse()) {
		// Replace any instances already present with a re-opening code
		// otherwise only the part of the string until said closing code
		// will be colored, and the rest will simply be 'plain'.
		str = code.open + str.replace(code.closeRe, code.open) + code.close;

		// Close the styling before a linebreak and reopen
		// after next line to fix a bleed issue on macOS
		// https://github.com/chalk/chalk/pull/92
		str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`);
	}

	// Reset the original `dim` if we changed it to work around the Windows dimmed gray issue
	ansiStyles.dim.open = originalDim;

	return str;
}

function chalkTag(chalk, strings) {
	if (!Array.isArray(strings)) {
		// If chalk() was called by itself or with a string,
		// return the string itself as a string.
		return [].slice.call(arguments, 1).join(' ');
	}

	const args = [].slice.call(arguments, 2);
	const parts = [strings.raw[0]];

	for (let i = 1; i < strings.length; i++) {
		parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&'));
		parts.push(String(strings.raw[i]));
	}

	return template(chalk, parts.join(''));
}

Object.defineProperties(Chalk.prototype, styles);

module.exports = Chalk(); // eslint-disable-line new-cap
module.exports.supportsColor = stdoutColor;
module.exports.default = module.exports; // For TypeScript
// @flow strict

type TemplateStringsArray = $ReadOnlyArray<string>;

export type Level = $Values<{
	None: 0,
	Basic: 1,
	Ansi256: 2,
	TrueColor: 3
}>;

export type ChalkOptions = {|
	enabled?: boolean,
	level?: Level
|};

export type ColorSupport = {|
	level: Level,
	hasBasic: boolean,
	has256: boolean,
	has16m: boolean
|};

export interface Chalk {
	(...text: string[]): string,
	(text: TemplateStringsArray, ...placeholders: string[]): string,
	constructor(options?: ChalkOptions): Chalk,
	enabled: boolean,
	level: Level,
	rgb(r: number, g: number, b: number): Chalk,
	hsl(h: number, s: number, l: number): Chalk,
	hsv(h: number, s: number, v: number): Chalk,
	hwb(h: number, w: number, b: number): Chalk,
	bgHex(color: string): Chalk,
	bgKeyword(color: string): Chalk,
	bgRgb(r: number, g: number, b: number): Chalk,
	bgHsl(h: number, s: number, l: number): Chalk,
	bgHsv(h: number, s: number, v: number): Chalk,
	bgHwb(h: number, w: number, b: number): Chalk,
	hex(color: string): Chalk,
	keyword(color: string): Chalk,

	+reset: Chalk,
	+bold: Chalk,
	+dim: Chalk,
	+italic: Chalk,
	+underline: Chalk,
	+inverse: Chalk,
	+hidden: Chalk,
	+strikethrough: Chalk,

	+visible: Chalk,

	+black: Chalk,
	+red: Chalk,
	+green: Chalk,
	+yellow: Chalk,
	+blue: Chalk,
	+magenta: Chalk,
	+cyan: Chalk,
	+white: Chalk,
	+gray: Chalk,
	+grey: Chalk,
	+blackBright: Chalk,
	+redBright: Chalk,
	+greenBright: Chalk,
	+yellowBright: Chalk,
	+blueBright: Chalk,
	+magentaBright: Chalk,
	+cyanBright: Chalk,
	+whiteBright: Chalk,

	+bgBlack: Chalk,
	+bgRed: Chalk,
	+bgGreen: Chalk,
	+bgYellow: Chalk,
	+bgBlue: Chalk,
	+bgMagenta: Chalk,
	+bgCyan: Chalk,
	+bgWhite: Chalk,
	+bgBlackBright: Chalk,
	+bgRedBright: Chalk,
	+bgGreenBright: Chalk,
	+bgYellowBright: Chalk,
	+bgBlueBright: Chalk,
	+bgMagentaBright: Chalk,
	+bgCyanBright: Chalk,
	+bgWhiteBrigh: Chalk,

	supportsColor: ColorSupport
};

declare module.exports: Chalk;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "dependencies": {
    "ansi-styles": "^3.2.1",
    "escape-string-regexp": "^1.0.5",
    "supports-color": "^5.3.0"
  },
  "deprecated": false,
  "description": "Terminal string styling done right",
  "devDependencies": {
    "ava": "*",
    "coveralls": "^3.0.0",
    "execa": "^0.9.0",
    "flow-bin": "^0.68.0",
    "import-fresh": "^2.0.0",
    "matcha": "^0.7.0",
    "nyc": "^11.0.2",
    "resolve-from": "^4.0.0",
    "typescript": "^2.5.3",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js",
    "templates.js",
    "types/index.d.ts",
    "index.js.flow"
  ],
  "homepage": "https://github.com/chalk/chalk#readme",
  "license": "MIT",
  "name": "chalk",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/chalk.git"
  },
  "types": "types/index.d.ts",
  "version": "2.4.2"
}'use strict';
const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi;

const ESCAPES = new Map([
	['n', '\n'],
	['r', '\r'],
	['t', '\t'],
	['b', '\b'],
	['f', '\f'],
	['v', '\v'],
	['0', '\0'],
	['\\', '\\'],
	['e', '\u001B'],
	['a', '\u0007']
]);

function unescape(c) {
	if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) {
		return String.fromCharCode(parseInt(c.slice(1), 16));
	}

	return ESCAPES.get(c) || c;
}

function parseArguments(name, args) {
	const results = [];
	const chunks = args.trim().split(/\s*,\s*/g);
	let matches;

	for (const chunk of chunks) {
		if (!isNaN(chunk)) {
			results.push(Number(chunk));
		} else if ((matches = chunk.match(STRING_REGEX))) {
			results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr));
		} else {
			throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);
		}
	}

	return results;
}

function parseStyle(style) {
	STYLE_REGEX.lastIndex = 0;

	const results = [];
	let matches;

	while ((matches = STYLE_REGEX.exec(style)) !== null) {
		const name = matches[1];

		if (matches[2]) {
			const args = parseArguments(name, matches[2]);
			results.push([name].concat(args));
		} else {
			results.push([name]);
		}
	}

	return results;
}

function buildStyle(chalk, styles) {
	const enabled = {};

	for (const layer of styles) {
		for (const style of layer.styles) {
			enabled[style[0]] = layer.inverse ? null : style.slice(1);
		}
	}

	let current = chalk;
	for (const styleName of Object.keys(enabled)) {
		if (Array.isArray(enabled[styleName])) {
			if (!(styleName in current)) {
				throw new Error(`Unknown Chalk style: ${styleName}`);
			}

			if (enabled[styleName].length > 0) {
				current = current[styleName].apply(current, enabled[styleName]);
			} else {
				current = current[styleName];
			}
		}
	}

	return current;
}

module.exports = (chalk, tmp) => {
	const styles = [];
	const chunks = [];
	let chunk = [];

	// eslint-disable-next-line max-params
	tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => {
		if (escapeChar) {
			chunk.push(unescape(escapeChar));
		} else if (style) {
			const str = chunk.join('');
			chunk = [];
			chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str));
			styles.push({inverse, styles: parseStyle(style)});
		} else if (close) {
			if (styles.length === 0) {
				throw new Error('Found extraneous } in Chalk template literal');
			}

			chunks.push(buildStyle(chalk, styles)(chunk.join('')));
			chunk = [];
			styles.pop();
		} else {
			chunk.push(chr);
		}
	});

	chunks.push(chunk.join(''));

	if (styles.length > 0) {
		const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`;
		throw new Error(errMsg);
	}

	return chunks.join('');
};
{
  "deprecated": false,
  "description": "Binary value packing and unpacking",
  "devDependencies": {
    "mocha": "^3.0.2",
    "standard": "^8.0.0"
  },
  "homepage": "https://github.com/electron/node-chromium-pickle-js#readme",
  "license": "MIT",
  "main": "./lib/exports.js",
  "name": "chromium-pickle-js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron/node-chromium-pickle-js.git"
  },
  "version": "0.2.0"
}var Pickle = require('./pickle')

module.exports = {
  createEmpty: function () {
    return new Pickle()
  },

  createFromBuffer: function (buffer) {
    return new Pickle(buffer)
  }
}
// sizeof(T).
var SIZE_INT32 = 4
var SIZE_UINT32 = 4
var SIZE_INT64 = 8
var SIZE_UINT64 = 8
var SIZE_FLOAT = 4
var SIZE_DOUBLE = 8

// The allocation granularity of the payload.
var PAYLOAD_UNIT = 64

// Largest JS number.
var CAPACITY_READ_ONLY = 9007199254740992

// Aligns 'i' by rounding it up to the next multiple of 'alignment'.
var alignInt = function (i, alignment) {
  return i + (alignment - (i % alignment)) % alignment
}

// PickleIterator reads data from a Pickle. The Pickle object must remain valid
// while the PickleIterator object is in use.
var PickleIterator = (function () {
  function PickleIterator (pickle) {
    this.payload = pickle.header
    this.payloadOffset = pickle.headerSize
    this.readIndex = 0
    this.endIndex = pickle.getPayloadSize()
  }

  PickleIterator.prototype.readBool = function () {
    return this.readInt() !== 0
  }

  PickleIterator.prototype.readInt = function () {
    return this.readBytes(SIZE_INT32, Buffer.prototype.readInt32LE)
  }

  PickleIterator.prototype.readUInt32 = function () {
    return this.readBytes(SIZE_UINT32, Buffer.prototype.readUInt32LE)
  }

  PickleIterator.prototype.readInt64 = function () {
    return this.readBytes(SIZE_INT64, Buffer.prototype.readInt64LE)
  }

  PickleIterator.prototype.readUInt64 = function () {
    return this.readBytes(SIZE_UINT64, Buffer.prototype.readUInt64LE)
  }

  PickleIterator.prototype.readFloat = function () {
    return this.readBytes(SIZE_FLOAT, Buffer.prototype.readFloatLE)
  }

  PickleIterator.prototype.readDouble = function () {
    return this.readBytes(SIZE_DOUBLE, Buffer.prototype.readDoubleLE)
  }

  PickleIterator.prototype.readString = function () {
    return this.readBytes(this.readInt()).toString()
  }

  PickleIterator.prototype.readBytes = function (length, method) {
    var readPayloadOffset = this.getReadPayloadOffsetAndAdvance(length)
    if (method != null) {
      return method.call(this.payload, readPayloadOffset, length)
    } else {
      return this.payload.slice(readPayloadOffset, readPayloadOffset + length)
    }
  }

  PickleIterator.prototype.getReadPayloadOffsetAndAdvance = function (length) {
    if (length > this.endIndex - this.readIndex) {
      this.readIndex = this.endIndex
      throw new Error('Failed to read data with length of ' + length)
    }
    var readPayloadOffset = this.payloadOffset + this.readIndex
    this.advance(length)
    return readPayloadOffset
  }

  PickleIterator.prototype.advance = function (size) {
    var alignedSize = alignInt(size, SIZE_UINT32)
    if (this.endIndex - this.readIndex < alignedSize) {
      this.readIndex = this.endIndex
    } else {
      this.readIndex += alignedSize
    }
  }

  return PickleIterator
})()

// This class provides facilities for basic binary value packing and unpacking.
//
// The Pickle class supports appending primitive values (ints, strings, etc.)
// to a pickle instance.  The Pickle instance grows its internal memory buffer
// dynamically to hold the sequence of primitive values.   The internal memory
// buffer is exposed as the "data" of the Pickle.  This "data" can be passed
// to a Pickle object to initialize it for reading.
//
// When reading from a Pickle object, it is important for the consumer to know
// what value types to read and in what order to read them as the Pickle does
// not keep track of the type of data written to it.
//
// The Pickle's data has a header which contains the size of the Pickle's
// payload.  It can optionally support additional space in the header.  That
// space is controlled by the header_size parameter passed to the Pickle
// constructor.
var Pickle = (function () {
  function Pickle (buffer) {
    if (buffer) {
      this.initFromBuffer(buffer)
    } else {
      this.initEmpty()
    }
  }

  Pickle.prototype.initEmpty = function () {
    this.header = new Buffer(0)
    this.headerSize = SIZE_UINT32
    this.capacityAfterHeader = 0
    this.writeOffset = 0
    this.resize(PAYLOAD_UNIT)
    this.setPayloadSize(0)
  }

  Pickle.prototype.initFromBuffer = function (buffer) {
    this.header = buffer
    this.headerSize = buffer.length - this.getPayloadSize()
    this.capacityAfterHeader = CAPACITY_READ_ONLY
    this.writeOffset = 0
    if (this.headerSize > buffer.length) {
      this.headerSize = 0
    }
    if (this.headerSize !== alignInt(this.headerSize, SIZE_UINT32)) {
      this.headerSize = 0
    }
    if (this.headerSize === 0) {
      this.header = new Buffer(0)
    }
  }

  Pickle.prototype.createIterator = function () {
    return new PickleIterator(this)
  }

  Pickle.prototype.toBuffer = function () {
    return this.header.slice(0, this.headerSize + this.getPayloadSize())
  }

  Pickle.prototype.writeBool = function (value) {
    return this.writeInt(value ? 1 : 0)
  }

  Pickle.prototype.writeInt = function (value) {
    return this.writeBytes(value, SIZE_INT32, Buffer.prototype.writeInt32LE)
  }

  Pickle.prototype.writeUInt32 = function (value) {
    return this.writeBytes(value, SIZE_UINT32, Buffer.prototype.writeUInt32LE)
  }

  Pickle.prototype.writeInt64 = function (value) {
    return this.writeBytes(value, SIZE_INT64, Buffer.prototype.writeInt64LE)
  }

  Pickle.prototype.writeUInt64 = function (value) {
    return this.writeBytes(value, SIZE_UINT64, Buffer.prototype.writeUInt64LE)
  }

  Pickle.prototype.writeFloat = function (value) {
    return this.writeBytes(value, SIZE_FLOAT, Buffer.prototype.writeFloatLE)
  }

  Pickle.prototype.writeDouble = function (value) {
    return this.writeBytes(value, SIZE_DOUBLE, Buffer.prototype.writeDoubleLE)
  }

  Pickle.prototype.writeString = function (value) {
    var length = Buffer.byteLength(value, 'utf8')
    if (!this.writeInt(length)) {
      return false
    }
    return this.writeBytes(value, length)
  }

  Pickle.prototype.setPayloadSize = function (payloadSize) {
    return this.header.writeUInt32LE(payloadSize, 0)
  }

  Pickle.prototype.getPayloadSize = function () {
    return this.header.readUInt32LE(0)
  }

  Pickle.prototype.writeBytes = function (data, length, method) {
    var dataLength = alignInt(length, SIZE_UINT32)
    var newSize = this.writeOffset + dataLength
    if (newSize > this.capacityAfterHeader) {
      this.resize(Math.max(this.capacityAfterHeader * 2, newSize))
    }
    if (method != null) {
      method.call(this.header, data, this.headerSize + this.writeOffset)
    } else {
      this.header.write(data, this.headerSize + this.writeOffset, length)
    }
    var endOffset = this.headerSize + this.writeOffset + length
    this.header.fill(0, endOffset, endOffset + dataLength - length)
    this.setPayloadSize(newSize)
    this.writeOffset = newSize
    return true
  }

  Pickle.prototype.resize = function (newCapacity) {
    newCapacity = alignInt(newCapacity, PAYLOAD_UNIT)
    this.header = Buffer.concat([this.header, new Buffer(newCapacity)])
    this.capacityAfterHeader = newCapacity
  }

  return Pickle
})()

module.exports = Pickle
The MIT License (MIT)

Copyright (c) 2016-2018 Thomas Watson Steen

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict'

var vendors = require('./vendors.json')

var env = process.env

// Used for testing only
Object.defineProperty(exports, '_vendors', {
  value: vendors.map(function (v) { return v.constant })
})

exports.name = null
exports.isPR = null

vendors.forEach(function (vendor) {
  var envs = Array.isArray(vendor.env) ? vendor.env : [vendor.env]
  var isCI = envs.every(function (obj) {
    return checkEnv(obj)
  })

  exports[vendor.constant] = isCI

  if (isCI) {
    exports.name = vendor.name

    switch (typeof vendor.pr) {
      case 'string':
        // "pr": "CIRRUS_PR"
        exports.isPR = !!env[vendor.pr]
        break
      case 'object':
        if ('env' in vendor.pr) {
          // "pr": { "env": "BUILDKITE_PULL_REQUEST", "ne": "false" }
          exports.isPR = vendor.pr.env in env && env[vendor.pr.env] !== vendor.pr.ne
        } else if ('any' in vendor.pr) {
          // "pr": { "any": ["ghprbPullId", "CHANGE_ID"] }
          exports.isPR = vendor.pr.any.some(function (key) {
            return !!env[key]
          })
        } else {
          // "pr": { "DRONE_BUILD_EVENT": "pull_request" }
          exports.isPR = checkEnv(vendor.pr)
        }
        break
      default:
        // PR detection not supported for this vendor
        exports.isPR = null
    }
  }
})

exports.isCI = !!(
  env.CI || // Travis CI, CircleCI, Cirrus CI, Gitlab CI, Appveyor, CodeShip, dsari
  env.CONTINUOUS_INTEGRATION || // Travis CI, Cirrus CI
  env.BUILD_NUMBER || // Jenkins, TeamCity
  env.RUN_ID || // TaskCluster, dsari
  exports.name ||
  false
)

function checkEnv (obj) {
  if (typeof obj === 'string') return !!env[obj]
  return Object.keys(obj).every(function (k) {
    return env[k] === obj[k]
  })
}
{
  "author": {
    "name": "Thomas Watson Steen",
    "email": "w@tson.dk",
    "url": "https://twitter.com/wa7son"
  },
  "coordinates": [
    55.778231,
    12.593179
  ],
  "dependencies": {},
  "deprecated": false,
  "description": "Get details about the current Continuous Integration environment",
  "devDependencies": {
    "clear-require": "^1.0.1",
    "standard": "^12.0.1",
    "tape": "^4.9.1"
  },
  "homepage": "https://github.com/watson/ci-info",
  "license": "MIT",
  "main": "index.js",
  "name": "ci-info",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/watson/ci-info.git"
  },
  "version": "2.0.0"
}[
  {
    "name": "AppVeyor",
    "constant": "APPVEYOR",
    "env": "APPVEYOR",
    "pr": "APPVEYOR_PULL_REQUEST_NUMBER"
  },
  {
    "name": "Azure Pipelines",
    "constant": "AZURE_PIPELINES",
    "env": "SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",
    "pr": "SYSTEM_PULLREQUEST_PULLREQUESTID"
  },
  {
    "name": "Bamboo",
    "constant": "BAMBOO",
    "env": "bamboo_planKey"
  },
  {
    "name": "Bitbucket Pipelines",
    "constant": "BITBUCKET",
    "env": "BITBUCKET_COMMIT",
    "pr": "BITBUCKET_PR_ID"
  },
  {
    "name": "Bitrise",
    "constant": "BITRISE",
    "env": "BITRISE_IO",
    "pr": "BITRISE_PULL_REQUEST"
  },
  {
    "name": "Buddy",
    "constant": "BUDDY",
    "env": "BUDDY_WORKSPACE_ID",
    "pr": "BUDDY_EXECUTION_PULL_REQUEST_ID"
  },
  {
    "name": "Buildkite",
    "constant": "BUILDKITE",
    "env": "BUILDKITE",
    "pr": { "env": "BUILDKITE_PULL_REQUEST", "ne": "false" }
  },
  {
    "name": "CircleCI",
    "constant": "CIRCLE",
    "env": "CIRCLECI",
    "pr": "CIRCLE_PULL_REQUEST"
  },
  {
    "name": "Cirrus CI",
    "constant": "CIRRUS",
    "env": "CIRRUS_CI",
    "pr": "CIRRUS_PR"
  },
  {
    "name": "AWS CodeBuild",
    "constant": "CODEBUILD",
    "env": "CODEBUILD_BUILD_ARN"
  },
  {
    "name": "Codeship",
    "constant": "CODESHIP",
    "env": { "CI_NAME": "codeship" }
  },
  {
    "name": "Drone",
    "constant": "DRONE",
    "env": "DRONE",
    "pr": { "DRONE_BUILD_EVENT": "pull_request" }
  },
  {
    "name": "dsari",
    "constant": "DSARI",
    "env": "DSARI"
  },
  {
    "name": "GitLab CI",
    "constant": "GITLAB",
    "env": "GITLAB_CI"
  },
  {
    "name": "GoCD",
    "constant": "GOCD",
    "env": "GO_PIPELINE_LABEL"
  },
  {
    "name": "Hudson",
    "constant": "HUDSON",
    "env": "HUDSON_URL"
  },
  {
    "name": "Jenkins",
    "constant": "JENKINS",
    "env": ["JENKINS_URL", "BUILD_ID"],
    "pr": { "any": ["ghprbPullId", "CHANGE_ID"] }
  },
  {
    "name": "Magnum CI",
    "constant": "MAGNUM",
    "env": "MAGNUM"
  },
  {
    "name": "Netlify CI",
    "constant": "NETLIFY",
    "env": "NETLIFY_BUILD_BASE",
    "pr": { "env": "PULL_REQUEST", "ne": "false" }
  },
  {
    "name": "Sail CI",
    "constant": "SAIL",
    "env": "SAILCI",
    "pr": "SAIL_PULL_REQUEST_NUMBER"
  },
  {
    "name": "Semaphore",
    "constant": "SEMAPHORE",
    "env": "SEMAPHORE",
    "pr": "PULL_REQUEST_NUMBER"
  },
  {
    "name": "Shippable",
    "constant": "SHIPPABLE",
    "env": "SHIPPABLE",
    "pr": { "IS_PULL_REQUEST": "true" }
  },
  {
    "name": "Solano CI",
    "constant": "SOLANO",
    "env": "TDDIUM",
    "pr": "TDDIUM_PR_ID"
  },
  {
    "name": "Strider CD",
    "constant": "STRIDER",
    "env": "STRIDER"
  },
  {
    "name": "TaskCluster",
    "constant": "TASKCLUSTER",
    "env": ["TASK_ID", "RUN_ID"]
  },
  {
    "name": "TeamCity",
    "constant": "TEAMCITY",
    "env": "TEAMCITY_VERSION"
  },
  {
    "name": "Travis CI",
    "constant": "TRAVIS",
    "env": "TRAVIS",
    "pr": { "env": "TRAVIS_PULL_REQUEST", "ne": "false" }
  }
]
Copyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

/* MIT license */
var cssKeywords = require('color-name');

// NOTE: conversions should only return primitive values (i.e. arrays, or
//       values that give correct `typeof` results).
//       do not use box values types (i.e. Number(), String(), etc.)

var reverseKeywords = {};
for (var key in cssKeywords) {
	if (cssKeywords.hasOwnProperty(key)) {
		reverseKeywords[cssKeywords[key]] = key;
	}
}

var convert = module.exports = {
	rgb: {channels: 3, labels: 'rgb'},
	hsl: {channels: 3, labels: 'hsl'},
	hsv: {channels: 3, labels: 'hsv'},
	hwb: {channels: 3, labels: 'hwb'},
	cmyk: {channels: 4, labels: 'cmyk'},
	xyz: {channels: 3, labels: 'xyz'},
	lab: {channels: 3, labels: 'lab'},
	lch: {channels: 3, labels: 'lch'},
	hex: {channels: 1, labels: ['hex']},
	keyword: {channels: 1, labels: ['keyword']},
	ansi16: {channels: 1, labels: ['ansi16']},
	ansi256: {channels: 1, labels: ['ansi256']},
	hcg: {channels: 3, labels: ['h', 'c', 'g']},
	apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
	gray: {channels: 1, labels: ['gray']}
};

// hide .channels and .labels properties
for (var model in convert) {
	if (convert.hasOwnProperty(model)) {
		if (!('channels' in convert[model])) {
			throw new Error('missing channels property: ' + model);
		}

		if (!('labels' in convert[model])) {
			throw new Error('missing channel labels property: ' + model);
		}

		if (convert[model].labels.length !== convert[model].channels) {
			throw new Error('channel and label counts mismatch: ' + model);
		}

		var channels = convert[model].channels;
		var labels = convert[model].labels;
		delete convert[model].channels;
		delete convert[model].labels;
		Object.defineProperty(convert[model], 'channels', {value: channels});
		Object.defineProperty(convert[model], 'labels', {value: labels});
	}
}

convert.rgb.hsl = function (rgb) {
	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;
	var min = Math.min(r, g, b);
	var max = Math.max(r, g, b);
	var delta = max - min;
	var h;
	var s;
	var l;

	if (max === min) {
		h = 0;
	} else if (r === max) {
		h = (g - b) / delta;
	} else if (g === max) {
		h = 2 + (b - r) / delta;
	} else if (b === max) {
		h = 4 + (r - g) / delta;
	}

	h = Math.min(h * 60, 360);

	if (h < 0) {
		h += 360;
	}

	l = (min + max) / 2;

	if (max === min) {
		s = 0;
	} else if (l <= 0.5) {
		s = delta / (max + min);
	} else {
		s = delta / (2 - max - min);
	}

	return [h, s * 100, l * 100];
};

convert.rgb.hsv = function (rgb) {
	var rdif;
	var gdif;
	var bdif;
	var h;
	var s;

	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;
	var v = Math.max(r, g, b);
	var diff = v - Math.min(r, g, b);
	var diffc = function (c) {
		return (v - c) / 6 / diff + 1 / 2;
	};

	if (diff === 0) {
		h = s = 0;
	} else {
		s = diff / v;
		rdif = diffc(r);
		gdif = diffc(g);
		bdif = diffc(b);

		if (r === v) {
			h = bdif - gdif;
		} else if (g === v) {
			h = (1 / 3) + rdif - bdif;
		} else if (b === v) {
			h = (2 / 3) + gdif - rdif;
		}
		if (h < 0) {
			h += 1;
		} else if (h > 1) {
			h -= 1;
		}
	}

	return [
		h * 360,
		s * 100,
		v * 100
	];
};

convert.rgb.hwb = function (rgb) {
	var r = rgb[0];
	var g = rgb[1];
	var b = rgb[2];
	var h = convert.rgb.hsl(rgb)[0];
	var w = 1 / 255 * Math.min(r, Math.min(g, b));

	b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));

	return [h, w * 100, b * 100];
};

convert.rgb.cmyk = function (rgb) {
	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;
	var c;
	var m;
	var y;
	var k;

	k = Math.min(1 - r, 1 - g, 1 - b);
	c = (1 - r - k) / (1 - k) || 0;
	m = (1 - g - k) / (1 - k) || 0;
	y = (1 - b - k) / (1 - k) || 0;

	return [c * 100, m * 100, y * 100, k * 100];
};

/**
 * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
 * */
function comparativeDistance(x, y) {
	return (
		Math.pow(x[0] - y[0], 2) +
		Math.pow(x[1] - y[1], 2) +
		Math.pow(x[2] - y[2], 2)
	);
}

convert.rgb.keyword = function (rgb) {
	var reversed = reverseKeywords[rgb];
	if (reversed) {
		return reversed;
	}

	var currentClosestDistance = Infinity;
	var currentClosestKeyword;

	for (var keyword in cssKeywords) {
		if (cssKeywords.hasOwnProperty(keyword)) {
			var value = cssKeywords[keyword];

			// Compute comparative distance
			var distance = comparativeDistance(rgb, value);

			// Check if its less, if so set as closest
			if (distance < currentClosestDistance) {
				currentClosestDistance = distance;
				currentClosestKeyword = keyword;
			}
		}
	}

	return currentClosestKeyword;
};

convert.keyword.rgb = function (keyword) {
	return cssKeywords[keyword];
};

convert.rgb.xyz = function (rgb) {
	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;

	// assume sRGB
	r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
	g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
	b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);

	var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
	var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
	var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);

	return [x * 100, y * 100, z * 100];
};

convert.rgb.lab = function (rgb) {
	var xyz = convert.rgb.xyz(rgb);
	var x = xyz[0];
	var y = xyz[1];
	var z = xyz[2];
	var l;
	var a;
	var b;

	x /= 95.047;
	y /= 100;
	z /= 108.883;

	x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
	y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
	z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);

	l = (116 * y) - 16;
	a = 500 * (x - y);
	b = 200 * (y - z);

	return [l, a, b];
};

convert.hsl.rgb = function (hsl) {
	var h = hsl[0] / 360;
	var s = hsl[1] / 100;
	var l = hsl[2] / 100;
	var t1;
	var t2;
	var t3;
	var rgb;
	var val;

	if (s === 0) {
		val = l * 255;
		return [val, val, val];
	}

	if (l < 0.5) {
		t2 = l * (1 + s);
	} else {
		t2 = l + s - l * s;
	}

	t1 = 2 * l - t2;

	rgb = [0, 0, 0];
	for (var i = 0; i < 3; i++) {
		t3 = h + 1 / 3 * -(i - 1);
		if (t3 < 0) {
			t3++;
		}
		if (t3 > 1) {
			t3--;
		}

		if (6 * t3 < 1) {
			val = t1 + (t2 - t1) * 6 * t3;
		} else if (2 * t3 < 1) {
			val = t2;
		} else if (3 * t3 < 2) {
			val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
		} else {
			val = t1;
		}

		rgb[i] = val * 255;
	}

	return rgb;
};

convert.hsl.hsv = function (hsl) {
	var h = hsl[0];
	var s = hsl[1] / 100;
	var l = hsl[2] / 100;
	var smin = s;
	var lmin = Math.max(l, 0.01);
	var sv;
	var v;

	l *= 2;
	s *= (l <= 1) ? l : 2 - l;
	smin *= lmin <= 1 ? lmin : 2 - lmin;
	v = (l + s) / 2;
	sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);

	return [h, sv * 100, v * 100];
};

convert.hsv.rgb = function (hsv) {
	var h = hsv[0] / 60;
	var s = hsv[1] / 100;
	var v = hsv[2] / 100;
	var hi = Math.floor(h) % 6;

	var f = h - Math.floor(h);
	var p = 255 * v * (1 - s);
	var q = 255 * v * (1 - (s * f));
	var t = 255 * v * (1 - (s * (1 - f)));
	v *= 255;

	switch (hi) {
		case 0:
			return [v, t, p];
		case 1:
			return [q, v, p];
		case 2:
			return [p, v, t];
		case 3:
			return [p, q, v];
		case 4:
			return [t, p, v];
		case 5:
			return [v, p, q];
	}
};

convert.hsv.hsl = function (hsv) {
	var h = hsv[0];
	var s = hsv[1] / 100;
	var v = hsv[2] / 100;
	var vmin = Math.max(v, 0.01);
	var lmin;
	var sl;
	var l;

	l = (2 - s) * v;
	lmin = (2 - s) * vmin;
	sl = s * vmin;
	sl /= (lmin <= 1) ? lmin : 2 - lmin;
	sl = sl || 0;
	l /= 2;

	return [h, sl * 100, l * 100];
};

// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
convert.hwb.rgb = function (hwb) {
	var h = hwb[0] / 360;
	var wh = hwb[1] / 100;
	var bl = hwb[2] / 100;
	var ratio = wh + bl;
	var i;
	var v;
	var f;
	var n;

	// wh + bl cant be > 1
	if (ratio > 1) {
		wh /= ratio;
		bl /= ratio;
	}

	i = Math.floor(6 * h);
	v = 1 - bl;
	f = 6 * h - i;

	if ((i & 0x01) !== 0) {
		f = 1 - f;
	}

	n = wh + f * (v - wh); // linear interpolation

	var r;
	var g;
	var b;
	switch (i) {
		default:
		case 6:
		case 0: r = v; g = n; b = wh; break;
		case 1: r = n; g = v; b = wh; break;
		case 2: r = wh; g = v; b = n; break;
		case 3: r = wh; g = n; b = v; break;
		case 4: r = n; g = wh; b = v; break;
		case 5: r = v; g = wh; b = n; break;
	}

	return [r * 255, g * 255, b * 255];
};

convert.cmyk.rgb = function (cmyk) {
	var c = cmyk[0] / 100;
	var m = cmyk[1] / 100;
	var y = cmyk[2] / 100;
	var k = cmyk[3] / 100;
	var r;
	var g;
	var b;

	r = 1 - Math.min(1, c * (1 - k) + k);
	g = 1 - Math.min(1, m * (1 - k) + k);
	b = 1 - Math.min(1, y * (1 - k) + k);

	return [r * 255, g * 255, b * 255];
};

convert.xyz.rgb = function (xyz) {
	var x = xyz[0] / 100;
	var y = xyz[1] / 100;
	var z = xyz[2] / 100;
	var r;
	var g;
	var b;

	r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
	g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
	b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);

	// assume sRGB
	r = r > 0.0031308
		? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
		: r * 12.92;

	g = g > 0.0031308
		? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
		: g * 12.92;

	b = b > 0.0031308
		? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
		: b * 12.92;

	r = Math.min(Math.max(0, r), 1);
	g = Math.min(Math.max(0, g), 1);
	b = Math.min(Math.max(0, b), 1);

	return [r * 255, g * 255, b * 255];
};

convert.xyz.lab = function (xyz) {
	var x = xyz[0];
	var y = xyz[1];
	var z = xyz[2];
	var l;
	var a;
	var b;

	x /= 95.047;
	y /= 100;
	z /= 108.883;

	x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
	y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
	z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);

	l = (116 * y) - 16;
	a = 500 * (x - y);
	b = 200 * (y - z);

	return [l, a, b];
};

convert.lab.xyz = function (lab) {
	var l = lab[0];
	var a = lab[1];
	var b = lab[2];
	var x;
	var y;
	var z;

	y = (l + 16) / 116;
	x = a / 500 + y;
	z = y - b / 200;

	var y2 = Math.pow(y, 3);
	var x2 = Math.pow(x, 3);
	var z2 = Math.pow(z, 3);
	y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
	x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
	z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;

	x *= 95.047;
	y *= 100;
	z *= 108.883;

	return [x, y, z];
};

convert.lab.lch = function (lab) {
	var l = lab[0];
	var a = lab[1];
	var b = lab[2];
	var hr;
	var h;
	var c;

	hr = Math.atan2(b, a);
	h = hr * 360 / 2 / Math.PI;

	if (h < 0) {
		h += 360;
	}

	c = Math.sqrt(a * a + b * b);

	return [l, c, h];
};

convert.lch.lab = function (lch) {
	var l = lch[0];
	var c = lch[1];
	var h = lch[2];
	var a;
	var b;
	var hr;

	hr = h / 360 * 2 * Math.PI;
	a = c * Math.cos(hr);
	b = c * Math.sin(hr);

	return [l, a, b];
};

convert.rgb.ansi16 = function (args) {
	var r = args[0];
	var g = args[1];
	var b = args[2];
	var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization

	value = Math.round(value / 50);

	if (value === 0) {
		return 30;
	}

	var ansi = 30
		+ ((Math.round(b / 255) << 2)
		| (Math.round(g / 255) << 1)
		| Math.round(r / 255));

	if (value === 2) {
		ansi += 60;
	}

	return ansi;
};

convert.hsv.ansi16 = function (args) {
	// optimization here; we already know the value and don't need to get
	// it converted for us.
	return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
};

convert.rgb.ansi256 = function (args) {
	var r = args[0];
	var g = args[1];
	var b = args[2];

	// we use the extended greyscale palette here, with the exception of
	// black and white. normal palette only has 4 greyscale shades.
	if (r === g && g === b) {
		if (r < 8) {
			return 16;
		}

		if (r > 248) {
			return 231;
		}

		return Math.round(((r - 8) / 247) * 24) + 232;
	}

	var ansi = 16
		+ (36 * Math.round(r / 255 * 5))
		+ (6 * Math.round(g / 255 * 5))
		+ Math.round(b / 255 * 5);

	return ansi;
};

convert.ansi16.rgb = function (args) {
	var color = args % 10;

	// handle greyscale
	if (color === 0 || color === 7) {
		if (args > 50) {
			color += 3.5;
		}

		color = color / 10.5 * 255;

		return [color, color, color];
	}

	var mult = (~~(args > 50) + 1) * 0.5;
	var r = ((color & 1) * mult) * 255;
	var g = (((color >> 1) & 1) * mult) * 255;
	var b = (((color >> 2) & 1) * mult) * 255;

	return [r, g, b];
};

convert.ansi256.rgb = function (args) {
	// handle greyscale
	if (args >= 232) {
		var c = (args - 232) * 10 + 8;
		return [c, c, c];
	}

	args -= 16;

	var rem;
	var r = Math.floor(args / 36) / 5 * 255;
	var g = Math.floor((rem = args % 36) / 6) / 5 * 255;
	var b = (rem % 6) / 5 * 255;

	return [r, g, b];
};

convert.rgb.hex = function (args) {
	var integer = ((Math.round(args[0]) & 0xFF) << 16)
		+ ((Math.round(args[1]) & 0xFF) << 8)
		+ (Math.round(args[2]) & 0xFF);

	var string = integer.toString(16).toUpperCase();
	return '000000'.substring(string.length) + string;
};

convert.hex.rgb = function (args) {
	var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
	if (!match) {
		return [0, 0, 0];
	}

	var colorString = match[0];

	if (match[0].length === 3) {
		colorString = colorString.split('').map(function (char) {
			return char + char;
		}).join('');
	}

	var integer = parseInt(colorString, 16);
	var r = (integer >> 16) & 0xFF;
	var g = (integer >> 8) & 0xFF;
	var b = integer & 0xFF;

	return [r, g, b];
};

convert.rgb.hcg = function (rgb) {
	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;
	var max = Math.max(Math.max(r, g), b);
	var min = Math.min(Math.min(r, g), b);
	var chroma = (max - min);
	var grayscale;
	var hue;

	if (chroma < 1) {
		grayscale = min / (1 - chroma);
	} else {
		grayscale = 0;
	}

	if (chroma <= 0) {
		hue = 0;
	} else
	if (max === r) {
		hue = ((g - b) / chroma) % 6;
	} else
	if (max === g) {
		hue = 2 + (b - r) / chroma;
	} else {
		hue = 4 + (r - g) / chroma + 4;
	}

	hue /= 6;
	hue %= 1;

	return [hue * 360, chroma * 100, grayscale * 100];
};

convert.hsl.hcg = function (hsl) {
	var s = hsl[1] / 100;
	var l = hsl[2] / 100;
	var c = 1;
	var f = 0;

	if (l < 0.5) {
		c = 2.0 * s * l;
	} else {
		c = 2.0 * s * (1.0 - l);
	}

	if (c < 1.0) {
		f = (l - 0.5 * c) / (1.0 - c);
	}

	return [hsl[0], c * 100, f * 100];
};

convert.hsv.hcg = function (hsv) {
	var s = hsv[1] / 100;
	var v = hsv[2] / 100;

	var c = s * v;
	var f = 0;

	if (c < 1.0) {
		f = (v - c) / (1 - c);
	}

	return [hsv[0], c * 100, f * 100];
};

convert.hcg.rgb = function (hcg) {
	var h = hcg[0] / 360;
	var c = hcg[1] / 100;
	var g = hcg[2] / 100;

	if (c === 0.0) {
		return [g * 255, g * 255, g * 255];
	}

	var pure = [0, 0, 0];
	var hi = (h % 1) * 6;
	var v = hi % 1;
	var w = 1 - v;
	var mg = 0;

	switch (Math.floor(hi)) {
		case 0:
			pure[0] = 1; pure[1] = v; pure[2] = 0; break;
		case 1:
			pure[0] = w; pure[1] = 1; pure[2] = 0; break;
		case 2:
			pure[0] = 0; pure[1] = 1; pure[2] = v; break;
		case 3:
			pure[0] = 0; pure[1] = w; pure[2] = 1; break;
		case 4:
			pure[0] = v; pure[1] = 0; pure[2] = 1; break;
		default:
			pure[0] = 1; pure[1] = 0; pure[2] = w;
	}

	mg = (1.0 - c) * g;

	return [
		(c * pure[0] + mg) * 255,
		(c * pure[1] + mg) * 255,
		(c * pure[2] + mg) * 255
	];
};

convert.hcg.hsv = function (hcg) {
	var c = hcg[1] / 100;
	var g = hcg[2] / 100;

	var v = c + g * (1.0 - c);
	var f = 0;

	if (v > 0.0) {
		f = c / v;
	}

	return [hcg[0], f * 100, v * 100];
};

convert.hcg.hsl = function (hcg) {
	var c = hcg[1] / 100;
	var g = hcg[2] / 100;

	var l = g * (1.0 - c) + 0.5 * c;
	var s = 0;

	if (l > 0.0 && l < 0.5) {
		s = c / (2 * l);
	} else
	if (l >= 0.5 && l < 1.0) {
		s = c / (2 * (1 - l));
	}

	return [hcg[0], s * 100, l * 100];
};

convert.hcg.hwb = function (hcg) {
	var c = hcg[1] / 100;
	var g = hcg[2] / 100;
	var v = c + g * (1.0 - c);
	return [hcg[0], (v - c) * 100, (1 - v) * 100];
};

convert.hwb.hcg = function (hwb) {
	var w = hwb[1] / 100;
	var b = hwb[2] / 100;
	var v = 1 - b;
	var c = v - w;
	var g = 0;

	if (c < 1) {
		g = (v - c) / (1 - c);
	}

	return [hwb[0], c * 100, g * 100];
};

convert.apple.rgb = function (apple) {
	return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
};

convert.rgb.apple = function (rgb) {
	return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
};

convert.gray.rgb = function (args) {
	return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
};

convert.gray.hsl = convert.gray.hsv = function (args) {
	return [0, 0, args[0]];
};

convert.gray.hwb = function (gray) {
	return [0, 100, gray[0]];
};

convert.gray.cmyk = function (gray) {
	return [0, 0, 0, gray[0]];
};

convert.gray.lab = function (gray) {
	return [gray[0], 0, 0];
};

convert.gray.hex = function (gray) {
	var val = Math.round(gray[0] / 100 * 255) & 0xFF;
	var integer = (val << 16) + (val << 8) + val;

	var string = integer.toString(16).toUpperCase();
	return '000000'.substring(string.length) + string;
};

convert.rgb.gray = function (rgb) {
	var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
	return [val / 255 * 100];
};
var conversions = require('./conversions');
var route = require('./route');

var convert = {};

var models = Object.keys(conversions);

function wrapRaw(fn) {
	var wrappedFn = function (args) {
		if (args === undefined || args === null) {
			return args;
		}

		if (arguments.length > 1) {
			args = Array.prototype.slice.call(arguments);
		}

		return fn(args);
	};

	// preserve .conversion property if there is one
	if ('conversion' in fn) {
		wrappedFn.conversion = fn.conversion;
	}

	return wrappedFn;
}

function wrapRounded(fn) {
	var wrappedFn = function (args) {
		if (args === undefined || args === null) {
			return args;
		}

		if (arguments.length > 1) {
			args = Array.prototype.slice.call(arguments);
		}

		var result = fn(args);

		// we're assuming the result is an array here.
		// see notice in conversions.js; don't use box types
		// in conversion functions.
		if (typeof result === 'object') {
			for (var len = result.length, i = 0; i < len; i++) {
				result[i] = Math.round(result[i]);
			}
		}

		return result;
	};

	// preserve .conversion property if there is one
	if ('conversion' in fn) {
		wrappedFn.conversion = fn.conversion;
	}

	return wrappedFn;
}

models.forEach(function (fromModel) {
	convert[fromModel] = {};

	Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
	Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});

	var routes = route(fromModel);
	var routeModels = Object.keys(routes);

	routeModels.forEach(function (toModel) {
		var fn = routes[toModel];

		convert[fromModel][toModel] = wrapRounded(fn);
		convert[fromModel][toModel].raw = wrapRaw(fn);
	});
});

module.exports = convert;
{
  "author": {
    "name": "Heather Arthur",
    "email": "fayearthur@gmail.com"
  },
  "dependencies": {
    "color-name": "1.1.3"
  },
  "deprecated": false,
  "description": "Plain color conversion functions",
  "devDependencies": {
    "chalk": "1.1.1",
    "xo": "0.11.2"
  },
  "files": [
    "index.js",
    "conversions.js",
    "css-keywords.js",
    "route.js"
  ],
  "homepage": "https://github.com/Qix-/color-convert#readme",
  "license": "MIT",
  "name": "color-convert",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/Qix-/color-convert.git"
  },
  "version": "1.9.3"
}var conversions = require('./conversions');

/*
	this function routes a model to all other models.

	all functions that are routed have a property `.conversion` attached
	to the returned synthetic function. This property is an array
	of strings, each with the steps in between the 'from' and 'to'
	color models (inclusive).

	conversions that are not possible simply are not included.
*/

function buildGraph() {
	var graph = {};
	// https://jsperf.com/object-keys-vs-for-in-with-closure/3
	var models = Object.keys(conversions);

	for (var len = models.length, i = 0; i < len; i++) {
		graph[models[i]] = {
			// http://jsperf.com/1-vs-infinity
			// micro-opt, but this is simple.
			distance: -1,
			parent: null
		};
	}

	return graph;
}

// https://en.wikipedia.org/wiki/Breadth-first_search
function deriveBFS(fromModel) {
	var graph = buildGraph();
	var queue = [fromModel]; // unshift -> queue -> pop

	graph[fromModel].distance = 0;

	while (queue.length) {
		var current = queue.pop();
		var adjacents = Object.keys(conversions[current]);

		for (var len = adjacents.length, i = 0; i < len; i++) {
			var adjacent = adjacents[i];
			var node = graph[adjacent];

			if (node.distance === -1) {
				node.distance = graph[current].distance + 1;
				node.parent = current;
				queue.unshift(adjacent);
			}
		}
	}

	return graph;
}

function link(from, to) {
	return function (args) {
		return to(from(args));
	};
}

function wrapConversion(toModel, graph) {
	var path = [graph[toModel].parent, toModel];
	var fn = conversions[graph[toModel].parent][toModel];

	var cur = graph[toModel].parent;
	while (graph[cur].parent) {
		path.unshift(graph[cur].parent);
		fn = link(conversions[graph[cur].parent][cur], fn);
		cur = graph[cur].parent;
	}

	fn.conversion = path;
	return fn;
}

module.exports = function (fromModel) {
	var graph = deriveBFS(fromModel);
	var conversion = {};

	var models = Object.keys(graph);
	for (var len = models.length, i = 0; i < len; i++) {
		var toModel = models[i];
		var node = graph[toModel];

		if (node.parent === null) {
			// no possible conversion, or this node is the source model.
			continue;
		}

		conversion[toModel] = wrapConversion(toModel, graph);
	}

	return conversion;
};

{
    "env": {
        "browser": true,
        "node": true,
        "commonjs": true,
        "es6": true
    },
    "extends": "eslint:recommended",
    "rules": {
        "strict": 2,
        "indent": 0,
        "linebreak-style": 0,
        "quotes": 0,
        "semi": 0,
        "no-cond-assign": 1,
        "no-constant-condition": 1,
        "no-duplicate-case": 1,
        "no-empty": 1,
        "no-ex-assign": 1,
        "no-extra-boolean-cast": 1,
        "no-extra-semi": 1,
        "no-fallthrough": 1,
        "no-func-assign": 1,
        "no-global-assign": 1,
        "no-implicit-globals": 2,
        "no-inner-declarations": ["error", "functions"],
        "no-irregular-whitespace": 2,
        "no-loop-func": 1,
        "no-multi-str": 1,
        "no-mixed-spaces-and-tabs": 1,
        "no-proto": 1,
        "no-sequences": 1,
        "no-throw-literal": 1,
        "no-unmodified-loop-condition": 1,
        "no-useless-call": 1,
        "no-void": 1,
        "no-with": 2,
        "wrap-iife": 1,
        "no-redeclare": 1,
        "no-unused-vars": ["error", { "vars": "all", "args": "none" }],
        "no-sparse-arrays": 1
    }
}
The MIT License (MIT)
Copyright (c) 2015 Dmitry Ivanov

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.'use strict'

module.exports = {
	"aliceblue": [240, 248, 255],
	"antiquewhite": [250, 235, 215],
	"aqua": [0, 255, 255],
	"aquamarine": [127, 255, 212],
	"azure": [240, 255, 255],
	"beige": [245, 245, 220],
	"bisque": [255, 228, 196],
	"black": [0, 0, 0],
	"blanchedalmond": [255, 235, 205],
	"blue": [0, 0, 255],
	"blueviolet": [138, 43, 226],
	"brown": [165, 42, 42],
	"burlywood": [222, 184, 135],
	"cadetblue": [95, 158, 160],
	"chartreuse": [127, 255, 0],
	"chocolate": [210, 105, 30],
	"coral": [255, 127, 80],
	"cornflowerblue": [100, 149, 237],
	"cornsilk": [255, 248, 220],
	"crimson": [220, 20, 60],
	"cyan": [0, 255, 255],
	"darkblue": [0, 0, 139],
	"darkcyan": [0, 139, 139],
	"darkgoldenrod": [184, 134, 11],
	"darkgray": [169, 169, 169],
	"darkgreen": [0, 100, 0],
	"darkgrey": [169, 169, 169],
	"darkkhaki": [189, 183, 107],
	"darkmagenta": [139, 0, 139],
	"darkolivegreen": [85, 107, 47],
	"darkorange": [255, 140, 0],
	"darkorchid": [153, 50, 204],
	"darkred": [139, 0, 0],
	"darksalmon": [233, 150, 122],
	"darkseagreen": [143, 188, 143],
	"darkslateblue": [72, 61, 139],
	"darkslategray": [47, 79, 79],
	"darkslategrey": [47, 79, 79],
	"darkturquoise": [0, 206, 209],
	"darkviolet": [148, 0, 211],
	"deeppink": [255, 20, 147],
	"deepskyblue": [0, 191, 255],
	"dimgray": [105, 105, 105],
	"dimgrey": [105, 105, 105],
	"dodgerblue": [30, 144, 255],
	"firebrick": [178, 34, 34],
	"floralwhite": [255, 250, 240],
	"forestgreen": [34, 139, 34],
	"fuchsia": [255, 0, 255],
	"gainsboro": [220, 220, 220],
	"ghostwhite": [248, 248, 255],
	"gold": [255, 215, 0],
	"goldenrod": [218, 165, 32],
	"gray": [128, 128, 128],
	"green": [0, 128, 0],
	"greenyellow": [173, 255, 47],
	"grey": [128, 128, 128],
	"honeydew": [240, 255, 240],
	"hotpink": [255, 105, 180],
	"indianred": [205, 92, 92],
	"indigo": [75, 0, 130],
	"ivory": [255, 255, 240],
	"khaki": [240, 230, 140],
	"lavender": [230, 230, 250],
	"lavenderblush": [255, 240, 245],
	"lawngreen": [124, 252, 0],
	"lemonchiffon": [255, 250, 205],
	"lightblue": [173, 216, 230],
	"lightcoral": [240, 128, 128],
	"lightcyan": [224, 255, 255],
	"lightgoldenrodyellow": [250, 250, 210],
	"lightgray": [211, 211, 211],
	"lightgreen": [144, 238, 144],
	"lightgrey": [211, 211, 211],
	"lightpink": [255, 182, 193],
	"lightsalmon": [255, 160, 122],
	"lightseagreen": [32, 178, 170],
	"lightskyblue": [135, 206, 250],
	"lightslategray": [119, 136, 153],
	"lightslategrey": [119, 136, 153],
	"lightsteelblue": [176, 196, 222],
	"lightyellow": [255, 255, 224],
	"lime": [0, 255, 0],
	"limegreen": [50, 205, 50],
	"linen": [250, 240, 230],
	"magenta": [255, 0, 255],
	"maroon": [128, 0, 0],
	"mediumaquamarine": [102, 205, 170],
	"mediumblue": [0, 0, 205],
	"mediumorchid": [186, 85, 211],
	"mediumpurple": [147, 112, 219],
	"mediumseagreen": [60, 179, 113],
	"mediumslateblue": [123, 104, 238],
	"mediumspringgreen": [0, 250, 154],
	"mediumturquoise": [72, 209, 204],
	"mediumvioletred": [199, 21, 133],
	"midnightblue": [25, 25, 112],
	"mintcream": [245, 255, 250],
	"mistyrose": [255, 228, 225],
	"moccasin": [255, 228, 181],
	"navajowhite": [255, 222, 173],
	"navy": [0, 0, 128],
	"oldlace": [253, 245, 230],
	"olive": [128, 128, 0],
	"olivedrab": [107, 142, 35],
	"orange": [255, 165, 0],
	"orangered": [255, 69, 0],
	"orchid": [218, 112, 214],
	"palegoldenrod": [238, 232, 170],
	"palegreen": [152, 251, 152],
	"paleturquoise": [175, 238, 238],
	"palevioletred": [219, 112, 147],
	"papayawhip": [255, 239, 213],
	"peachpuff": [255, 218, 185],
	"peru": [205, 133, 63],
	"pink": [255, 192, 203],
	"plum": [221, 160, 221],
	"powderblue": [176, 224, 230],
	"purple": [128, 0, 128],
	"rebeccapurple": [102, 51, 153],
	"red": [255, 0, 0],
	"rosybrown": [188, 143, 143],
	"royalblue": [65, 105, 225],
	"saddlebrown": [139, 69, 19],
	"salmon": [250, 128, 114],
	"sandybrown": [244, 164, 96],
	"seagreen": [46, 139, 87],
	"seashell": [255, 245, 238],
	"sienna": [160, 82, 45],
	"silver": [192, 192, 192],
	"skyblue": [135, 206, 235],
	"slateblue": [106, 90, 205],
	"slategray": [112, 128, 144],
	"slategrey": [112, 128, 144],
	"snow": [255, 250, 250],
	"springgreen": [0, 255, 127],
	"steelblue": [70, 130, 180],
	"tan": [210, 180, 140],
	"teal": [0, 128, 128],
	"thistle": [216, 191, 216],
	"tomato": [255, 99, 71],
	"turquoise": [64, 224, 208],
	"violet": [238, 130, 238],
	"wheat": [245, 222, 179],
	"white": [255, 255, 255],
	"whitesmoke": [245, 245, 245],
	"yellow": [255, 255, 0],
	"yellowgreen": [154, 205, 50]
};
{
  "author": {
    "name": "DY",
    "email": "dfcreative@gmail.com"
  },
  "deprecated": false,
  "description": "A list of color names and its values",
  "homepage": "https://github.com/dfcreative/color-name",
  "license": "MIT",
  "main": "index.js",
  "name": "color-name",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/dfcreative/color-name.git"
  },
  "version": "1.1.3"
}Copyright (c) 2011 Debuggable Limited <felix@debuggable.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
# combined-stream

A stream that emits multiple other streams one after another.

**NB** Currently `combined-stream` works with streams version 1 only. There is ongoing effort to switch this library to streams version 2. Any help is welcome. :) Meanwhile you can explore other libraries that provide streams2 support with more or less compatibility with `combined-stream`.

- [combined-stream2](https://www.npmjs.com/package/combined-stream2): A drop-in streams2-compatible replacement for the combined-stream module.

- [multistream](https://www.npmjs.com/package/multistream): A stream that emits multiple other streams one after another.

## Installation

``` bash
npm install combined-stream
```

## Usage

Here is a simple example that shows how you can use combined-stream to combine
two files into one:

``` javascript
var CombinedStream = require('combined-stream');
var fs = require('fs');

var combinedStream = CombinedStream.create();
combinedStream.append(fs.createReadStream('file1.txt'));
combinedStream.append(fs.createReadStream('file2.txt'));

combinedStream.pipe(fs.createWriteStream('combined.txt'));
```

While the example above works great, it will pause all source streams until
they are needed. If you don't want that to happen, you can set `pauseStreams`
to `false`:

``` javascript
var CombinedStream = require('combined-stream');
var fs = require('fs');

var combinedStream = CombinedStream.create({pauseStreams: false});
combinedStream.append(fs.createReadStream('file1.txt'));
combinedStream.append(fs.createReadStream('file2.txt'));

combinedStream.pipe(fs.createWriteStream('combined.txt'));
```

However, what if you don't have all the source streams yet, or you don't want
to allocate the resources (file descriptors, memory, etc.) for them right away?
Well, in that case you can simply provide a callback that supplies the stream
by calling a `next()` function:

``` javascript
var CombinedStream = require('combined-stream');
var fs = require('fs');

var combinedStream = CombinedStream.create();
combinedStream.append(function(next) {
  next(fs.createReadStream('file1.txt'));
});
combinedStream.append(function(next) {
  next(fs.createReadStream('file2.txt'));
});

combinedStream.pipe(fs.createWriteStream('combined.txt'));
```

## API

### CombinedStream.create([options])

Returns a new combined stream object. Available options are:

* `maxDataSize`
* `pauseStreams`

The effect of those options is described below.

### combinedStream.pauseStreams = `true`

Whether to apply back pressure to the underlaying streams. If set to `false`,
the underlaying streams will never be paused. If set to `true`, the
underlaying streams will be paused right after being appended, as well as when
`delayedStream.pipe()` wants to throttle.

### combinedStream.maxDataSize = `2 * 1024 * 1024`

The maximum amount of bytes (or characters) to buffer for all source streams.
If this value is exceeded, `combinedStream` emits an `'error'` event.

### combinedStream.dataSize = `0`

The amount of bytes (or characters) currently buffered by `combinedStream`.

### combinedStream.append(stream)

Appends the given `stream` to the combinedStream object. If `pauseStreams` is
set to `true, this stream will also be paused right away.

`streams` can also be a function that takes one parameter called `next`. `next`
is a function that must be invoked in order to provide the `next` stream, see
example above.

Regardless of how the `stream` is appended, combined-stream always attaches an
`'error'` listener to it, so you don't have to do that manually.

Special case: `stream` can also be a String or Buffer.

### combinedStream.write(data)

You should not call this, `combinedStream` takes care of piping the appended
streams into itself for you.

### combinedStream.resume()

Causes `combinedStream` to start drain the streams it manages. The function is
idempotent, and also emits a `'resume'` event each time which usually goes to
the stream that is currently being drained.

### combinedStream.pause();

If `combinedStream.pauseStreams` is set to `false`, this does nothing.
Otherwise a `'pause'` event is emitted, this goes to the stream that is
currently being drained, so you can use it to apply back pressure.

### combinedStream.end();

Sets `combinedStream.writable` to false, emits an `'end'` event, and removes
all streams from the queue.

### combinedStream.destroy();

Same as `combinedStream.end()`, except it emits a `'close'` event instead of
`'end'`.

## License

combined-stream is licensed under the MIT license.
{
  "author": {
    "name": "Felix GeisendÃ¶rfer",
    "email": "felix@debuggable.com",
    "url": "http://debuggable.com/"
  },
  "dependencies": {
    "delayed-stream": "~1.0.0"
  },
  "deprecated": false,
  "description": "A stream that emits multiple other streams one after another.",
  "devDependencies": {
    "far": "~0.0.7"
  },
  "engines": {
    "node": ">= 0.8"
  },
  "homepage": "https://github.com/felixge/node-combined-stream",
  "license": "MIT",
  "main": "./lib/combined_stream",
  "name": "combined-stream",
  "repository": {
    "type": "git",
    "url": "git://github.com/felixge/node-combined-stream.git"
  },
  "version": "1.0.8"
}var util = require('util');
var Stream = require('stream').Stream;
var DelayedStream = require('delayed-stream');

module.exports = CombinedStream;
function CombinedStream() {
  this.writable = false;
  this.readable = true;
  this.dataSize = 0;
  this.maxDataSize = 2 * 1024 * 1024;
  this.pauseStreams = true;

  this._released = false;
  this._streams = [];
  this._currentStream = null;
  this._insideLoop = false;
  this._pendingNext = false;
}
util.inherits(CombinedStream, Stream);

CombinedStream.create = function(options) {
  var combinedStream = new this();

  options = options || {};
  for (var option in options) {
    combinedStream[option] = options[option];
  }

  return combinedStream;
};

CombinedStream.isStreamLike = function(stream) {
  return (typeof stream !== 'function')
    && (typeof stream !== 'string')
    && (typeof stream !== 'boolean')
    && (typeof stream !== 'number')
    && (!Buffer.isBuffer(stream));
};

CombinedStream.prototype.append = function(stream) {
  var isStreamLike = CombinedStream.isStreamLike(stream);

  if (isStreamLike) {
    if (!(stream instanceof DelayedStream)) {
      var newStream = DelayedStream.create(stream, {
        maxDataSize: Infinity,
        pauseStream: this.pauseStreams,
      });
      stream.on('data', this._checkDataSize.bind(this));
      stream = newStream;
    }

    this._handleErrors(stream);

    if (this.pauseStreams) {
      stream.pause();
    }
  }

  this._streams.push(stream);
  return this;
};

CombinedStream.prototype.pipe = function(dest, options) {
  Stream.prototype.pipe.call(this, dest, options);
  this.resume();
  return dest;
};

CombinedStream.prototype._getNext = function() {
  this._currentStream = null;

  if (this._insideLoop) {
    this._pendingNext = true;
    return; // defer call
  }

  this._insideLoop = true;
  try {
    do {
      this._pendingNext = false;
      this._realGetNext();
    } while (this._pendingNext);
  } finally {
    this._insideLoop = false;
  }
};

CombinedStream.prototype._realGetNext = function() {
  var stream = this._streams.shift();


  if (typeof stream == 'undefined') {
    this.end();
    return;
  }

  if (typeof stream !== 'function') {
    this._pipeNext(stream);
    return;
  }

  var getStream = stream;
  getStream(function(stream) {
    var isStreamLike = CombinedStream.isStreamLike(stream);
    if (isStreamLike) {
      stream.on('data', this._checkDataSize.bind(this));
      this._handleErrors(stream);
    }

    this._pipeNext(stream);
  }.bind(this));
};

CombinedStream.prototype._pipeNext = function(stream) {
  this._currentStream = stream;

  var isStreamLike = CombinedStream.isStreamLike(stream);
  if (isStreamLike) {
    stream.on('end', this._getNext.bind(this));
    stream.pipe(this, {end: false});
    return;
  }

  var value = stream;
  this.write(value);
  this._getNext();
};

CombinedStream.prototype._handleErrors = function(stream) {
  var self = this;
  stream.on('error', function(err) {
    self._emitError(err);
  });
};

CombinedStream.prototype.write = function(data) {
  this.emit('data', data);
};

CombinedStream.prototype.pause = function() {
  if (!this.pauseStreams) {
    return;
  }

  if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause();
  this.emit('pause');
};

CombinedStream.prototype.resume = function() {
  if (!this._released) {
    this._released = true;
    this.writable = true;
    this._getNext();
  }

  if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume();
  this.emit('resume');
};

CombinedStream.prototype.end = function() {
  this._reset();
  this.emit('end');
};

CombinedStream.prototype.destroy = function() {
  this._reset();
  this.emit('close');
};

CombinedStream.prototype._reset = function() {
  this.writable = false;
  this._streams = [];
  this._currentStream = null;
};

CombinedStream.prototype._checkDataSize = function() {
  this._updateDataSize();
  if (this.dataSize <= this.maxDataSize) {
    return;
  }

  var message =
    'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.';
  this._emitError(new Error(message));
};

CombinedStream.prototype._updateDataSize = function() {
  this.dataSize = 0;

  var self = this;
  this._streams.forEach(function(stream) {
    if (!stream.dataSize) {
      return;
    }

    self.dataSize += stream.dataSize;
  });

  if (this._currentStream && this._currentStream.dataSize) {
    this.dataSize += this._currentStream.dataSize;
  }
};

CombinedStream.prototype._emitError = function(err) {
  this._reset();
  this.emit('error', err);
};
'use strict';

/**
 * Compare semver version numbers
 *
 * @param {String} a
 * @param {String} b
 * @api public
 */

module.exports = function(a, b) {
    var i;
    var len;

    if (typeof a + typeof b !== 'stringstring') {
        return false;
    }

    a = a.split('.');
    b = b.split('.');
    i = 0;
    len = Math.max(a.length, b.length);

    for (; i < len; i++) {
        if ((a[i] && !b[i] && parseInt(a[i]) > 0) || (parseInt(a[i]) > parseInt(b[i]))) {
            return 1;
        } else if ((b[i] && !a[i] && parseInt(b[i]) > 0) || (parseInt(a[i]) < parseInt(b[i]))) {
            return -1;
        }
    }

    return 0;
};
{
  "author": {
    "name": "Kevin MÃ¥rtensson",
    "email": "kevinmartensson@gmail.com",
    "url": "https://github.com/kevva"
  },
  "deprecated": false,
  "description": "Compare semver version numbers",
  "devDependencies": {
    "browserify": "^3.44.2",
    "mocha": "^1.18.2"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/kevva/compare-version#readme",
  "license": "MIT",
  "name": "compare-version",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/kevva/compare-version.git"
  },
  "version": "0.1.2"
}This software is released under the MIT license:

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
concat-map
==========

Concatenative mapdashery.

[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map)

[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map)

example
=======

``` js
var concatMap = require('concat-map');
var xs = [ 1, 2, 3, 4, 5, 6 ];
var ys = concatMap(xs, function (x) {
    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
});
console.dir(ys);
```

***

```
[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]
```

methods
=======

``` js
var concatMap = require('concat-map')
```

concatMap(xs, fn)
-----------------

Return an array of concatenated elements by calling `fn(x, i)` for each element
`x` and each index `i` in the array `xs`.

When `fn(x, i)` returns an array, its result will be concatenated with the
result array. If `fn(x, i)` returns anything else, that value will be pushed
onto the end of the result array.

install
=======

With [npm](http://npmjs.org) do:

```
npm install concat-map
```

license
=======

MIT

notes
=====

This module was written while sitting high above the ground in a tree.
module.exports = function (xs, fn) {
    var res = [];
    for (var i = 0; i < xs.length; i++) {
        var x = fn(xs[i], i);
        if (isArray(x)) res.push.apply(res, x);
        else res.push(x);
    }
    return res;
};

var isArray = Array.isArray || function (xs) {
    return Object.prototype.toString.call(xs) === '[object Array]';
};
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "deprecated": false,
  "description": "concatenative mapdashery",
  "devDependencies": {
    "tape": "~2.4.0"
  },
  "directories": {
    "example": "example",
    "test": "test"
  },
  "homepage": "https://github.com/substack/node-concat-map#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "concat-map",
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/node-concat-map.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": {
      "ie": [
        6,
        7,
        8,
        9
      ],
      "ff": [
        3.5,
        10,
        15
      ],
      "chrome": [
        10,
        22
      ],
      "safari": [
        5.1
      ],
      "opera": [
        12
      ]
    }
  },
  "version": "0.0.1"
}spec/fixtures/*
root: true
extends: semistandard
rules:
  indent:
    - error
    - 4
  camelcase: off
  no-unused-vars:
    - error
    - args: after-used
fixtures
coverage
jasmine.json
appveyor.yml
package-lock.json
<!--
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#
-->
# Cordova-common Release Notes

### 3.2.1 (Oct 28, 2019)

* [GH-78](https://github.com/apache/cordova-common/pull/78) (windows) Add `.jsproj` as file extension for XML files ([GH-62](https://github.com/apache/cordova-common/pull/62))
* [GH-89](https://github.com/apache/cordova-common/pull/89) revert: ([GH-24](https://github.com/apache/cordova-common/pull/24)) [CB-14108](https://issues.apache.org/jira/browse/CB-14108) fix incorrect count in `config_munge`
* [GH-82](https://github.com/apache/cordova-common/pull/82) General cleanup with eslint updates
* [GH-86](https://github.com/apache/cordova-common/pull/86) eslint cleanup fixes: `operator-linebreak`
* [GH-81](https://github.com/apache/cordova-common/pull/81) remove `no-throw-literal` lint exception not needed
* [GH-83](https://github.com/apache/cordova-common/pull/83) Fix ESLint violations where applicable
* [GH-80](https://github.com/apache/cordova-common/pull/80) Update to jasmine 3.4 & fix resulting spec failures
* [GH-79](https://github.com/apache/cordova-common/pull/79) Promise handling cleanup in specs
* [GH-77](https://github.com/apache/cordova-common/pull/77) Do not ignore AppVeyor failures on Node.js 12

### 3.2.0 (Jun 12, 2019)
* (ios) plist document not indented with tabs ([#69](https://github.com/apache/cordova-common/pull/69))
* Update fs-extra to v8 ([#70](https://github.com/apache/cordova-common/pull/70))
* Add example usage of podspec declarations ([#67](https://github.com/apache/cordova-common/pull/67))
* implement setPreference and setPlatformPreference ([#63](https://github.com/apache/cordova-common/pull/63))
* Catch leaked exceptions in superspawn and convert them to rejections ([#66](https://github.com/apache/cordova-common/pull/66))

### 3.1.0 (Dec 24, 2018)
* Update Cordova events into a real singleton class ([#60](https://github.com/apache/cordova-common/pull/60))
* Refactor CordovaLogger to singleton class ([#53](https://github.com/apache/cordova-common/pull/53))

### 3.0.0 (Nov 05, 2018)
* [CB-14166](https://issues.apache.org/jira/browse/CB-14166) Use `cross-spawn` for platform-independent spawning
* add `PluginInfo.getPodSpecs` method
* [CB-13496](https://issues.apache.org/jira/browse/CB-13496) Fix greedy regex in plist-helpers
* [CB-14108](https://issues.apache.org/jira/browse/CB-14108) fix incorrect count in config_munge in ios.json and android.json
* [CB-13685](https://issues.apache.org/jira/browse/CB-13685) **Android**: Update ConfigParser for Adaptive Icons
* [CB-10071](https://issues.apache.org/jira/browse/CB-10071) Add BridgingHeader type attributes for header-file
* [CB-12016](https://issues.apache.org/jira/browse/CB-12016) Removed cordova-registry-mapper dependency
* [CB-14099](https://issues.apache.org/jira/browse/CB-14099) **osx**: Fixed Resolve Config Path for OSX
* [CB-14140](https://issues.apache.org/jira/browse/CB-14140) Replace shelljs calls with fs-extra & which

### 2.2.2 (May 30, 2018)
* [CB-13979](https://issues.apache.org/jira/browse/CB-13979) More consistency for `config.xml` lookups
* [CB-14064](https://issues.apache.org/jira/browse/CB-14064) Remove Node 4 from CI matrix
* [CB-14088](https://issues.apache.org/jira/browse/CB-14088) Update dependencies
* [CB-11691](https://issues.apache.org/jira/browse/CB-11691) Fix for modifying binary plists
* [CB-13770](https://issues.apache.org/jira/browse/CB-13770) Warn when <edit-config> or <config-file> not found
* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) Fix tests and path issues for **Windows**
* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) added unit test for config file provider
* [CB-13744](https://issues.apache.org/jira/browse/CB-13744) Recognize storyboards as XML files
* [CB-13674](https://issues.apache.org/jira/browse/CB-13674) Incremented package version to -dev

### 2.2.1 (Dec 14, 2017)
* [CB-13674](https://issues.apache.org/jira/browse/CB-13674): updated dependencies

### 2.2.0 (Nov 22, 2017)
* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) File Provider fix belongs in cordova-common
* [CB-11244](https://issues.apache.org/jira/browse/CB-11244) Spot fix for upcoming `cordova-android@7` changes. https://github.com/apache/cordova-android/pull/389

### 2.1.1 (Oct 04, 2017)
* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added `getFrameworks` to unit tests
* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added variable replacing to framework tag

### 2.1.0 (August 30, 2017)
* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added variable replacing to `framework` tag
* [CB-13211](https://issues.apache.org/jira/browse/CB-13211) Add `allows-arbitrary-loads-for-media` attribute parsing for `getAccesses`
* [CB-11968](https://issues.apache.org/jira/browse/CB-11968) Added support for `<config-file>` in `config.xml`
* [CB-12895](https://issues.apache.org/jira/browse/CB-12895) set up `eslint` and removed `jshint`
* [CB-12785](https://issues.apache.org/jira/browse/CB-12785) added `.gitignore`, `travis`, and `appveyor` support
* [CB-12250](https://issues.apache.org/jira/browse/CB-12250) & [CB-12409](https://issues.apache.org/jira/browse/CB-12409) *iOS*: Fix bug with escaping properties from `plist` file
* [CB-12762](https://issues.apache.org/jira/browse/CB-12762) updated `common`, `fetch`, and `serve` `pkgJson` to point `pkgJson` repo items to github mirrors
* [CB-12766](https://issues.apache.org/jira/browse/CB-12766) Consistently write `JSON` with 2 spaces indentation

### 2.0.3 (May 02, 2017)
* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Add option to get `resource-file` from `root`
* [CB-11908](https://issues.apache.org/jira/browse/CB-11908) Add tests for `edit-config` in `config.xml`
* [CB-12665](https://issues.apache.org/jira/browse/CB-12665) removed `enginestrict` since it is deprecated

### 2.0.2 (Apr 14, 2017)
* [CB-11233](https://issues.apache.org/jira/browse/CB-11233) - Support installing frameworks into 'Embedded Binaries' section of the Xcode project
* [CB-10438](https://issues.apache.org/jira/browse/CB-10438) - Install correct dependency version. Removed shell.remove, added pkg.json to dependency tests 1-3, and updated install.js (.replace) to fix tests in uninstall.spec.js and update to workw with jasmine 2.0
* [CB-11120](https://issues.apache.org/jira/browse/CB-11120) - Allow short/display name in config.xml
* [CB-11346](https://issues.apache.org/jira/browse/CB-11346) - Remove known platforms check
* [CB-11977](https://issues.apache.org/jira/browse/CB-11977) - updated engines and enginescript for common, fetch, and serve

### 2.0.1 (Mar 09, 2017)
* [CB-12557](https://issues.apache.org/jira/browse/CB-12557) add both stdout and stderr properties to the error object passed to superspawn reject handler.

### 2.0.0 (Jan 17, 2017)
* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Add `resource-file` parsing to `config.xml`
* [CB-12018](https://issues.apache.org/jira/browse/CB-12018): updated `jshint` and updated tests to work with `jasmine@2` instead of `jasmine-node`
* [CB-12163](https://issues.apache.org/jira/browse/CB-12163) Add reference attrib to `resource-file` for **Windows**
* Move windows-specific logic to `cordova-windows`
* [CB-12189](https://issues.apache.org/jira/browse/CB-12189) Add implementation attribute to framework

### 1.5.1 (Oct 12, 2016)
* [CB-12002](https://issues.apache.org/jira/browse/CB-12002) Add `getAllowIntents()` to `ConfigParser`
* [CB-11998](https://issues.apache.org/jira/browse/CB-11998) `cordova platform add` error with `cordova-common@1.5.0`

### 1.5.0 (Oct 06, 2016)
* [CB-11776](https://issues.apache.org/jira/browse/CB-11776) Add test case for different `edit-config` targets
* [CB-11908](https://issues.apache.org/jira/browse/CB-11908) Add `edit-config` to `config.xml`
* [CB-11936](https://issues.apache.org/jira/browse/CB-11936) Support four new **App Transport Security (ATS)** keys
* update `config.xml` location if it is a **Android Studio** project.
* use `array` methods and `object.keys` for iterating. avoiding `for-in` loops
* [CB-11517](https://issues.apache.org/jira/browse/CB-11517) Allow `.folder` matches
* [CB-11776](https://issues.apache.org/jira/browse/CB-11776) check `edit-config` target exists

### 1.4.1 (Aug 09, 2016)
* Add general purpose `ConfigParser.getAttribute` API
* [CB-11653](https://issues.apache.org/jira/browse/CB-11653) moved `findProjectRoot` from `cordova-lib` to `cordova-common`
* [CB-11636](https://issues.apache.org/jira/browse/CB-11636) Handle attributes with quotes correctly
* [CB-11645](https://issues.apache.org/jira/browse/CB-11645) added check to see if `getEditConfig` exists before trying to use it
* [CB-9825](https://issues.apache.org/jira/browse/CB-9825) framework tag spec parsing

### 1.4.0 (Jul 12, 2016)
* [CB-11023](https://issues.apache.org/jira/browse/CB-11023) Add edit-config functionality

### 1.3.0 (May 12, 2016)
* [CB-11259](https://issues.apache.org/jira/browse/CB-11259): Improving prepare and build logging
* [CB-11194](https://issues.apache.org/jira/browse/CB-11194) Improve cordova load time
* [CB-1117](https://issues.apache.org/jira/browse/CB-1117) Add `FileUpdater` module to `cordova-common`.
* [CB-11131](https://issues.apache.org/jira/browse/CB-11131) Fix `TypeError: message.toUpperCase` is not a function in `CordovaLogger`

### 1.2.0 (Apr 18, 2016)
* [CB-11022](https://issues.apache.org/jira/browse/CB-11022) Save modulesMetadata to both www and platform_www when necessary
* [CB-10833](https://issues.apache.org/jira/browse/CB-10833) Deduplicate common logic for plugin installation/uninstallation
* [CB-10822](https://issues.apache.org/jira/browse/CB-10822) Manage plugins/modules metadata using PlatformJson
* [CB-10940](https://issues.apache.org/jira/browse/CB-10940) Can't add Android platform from path
* [CB-10965](https://issues.apache.org/jira/browse/CB-10965) xml helper allows multiple instances to be merge in config.xml

### 1.1.1 (Mar 18, 2016)
* [CB-10694](https://issues.apache.org/jira/browse/CB-10694) Update test to reflect merging of [CB-9264](https://issues.apache.org/jira/browse/CB-9264) fix
* [CB-10694](https://issues.apache.org/jira/browse/CB-10694) Platform-specific configuration preferences don't override global settings
* [CB-9264](https://issues.apache.org/jira/browse/CB-9264) Duplicate entries in `config.xml`
* [CB-10791](https://issues.apache.org/jira/browse/CB-10791) Add `adjustLoggerLevel` to `cordova-common.CordovaLogger`
* [CB-10662](https://issues.apache.org/jira/browse/CB-10662) Add tests for `ConfigParser.getStaticResources`
* [CB-10622](https://issues.apache.org/jira/browse/CB-10622) fix target attribute being ignored for images in `config.xml`.
* [CB-10583](https://issues.apache.org/jira/browse/CB-10583) Protect plugin preferences from adding extra Array properties.

### 1.1.0 (Feb 16, 2016)
* [CB-10482](https://issues.apache.org/jira/browse/CB-10482) Remove references to windows8 from cordova-lib/cli
* [CB-10430](https://issues.apache.org/jira/browse/CB-10430) Adds forwardEvents method to easily connect two EventEmitters
* [CB-10176](https://issues.apache.org/jira/browse/CB-10176) Adds CordovaLogger class, based on logger module from cordova-cli
* [CB-10052](https://issues.apache.org/jira/browse/CB-10052) Expose child process' io streams via promise progress notification
* [CB-10497](https://issues.apache.org/jira/browse/CB-10497) Prefer .bat over .cmd on windows platform
* [CB-9984](https://issues.apache.org/jira/browse/CB-9984) Bumps plist version and fixes failing cordova-common test

### 1.0.0 (Oct 29, 2015)

* [CB-9890](https://issues.apache.org/jira/browse/CB-9890) Documents cordova-common
* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Correct cordova-lib -> cordova-common in README
* Pick ConfigParser changes from apache@0c3614e
* [CB-9743](https://issues.apache.org/jira/browse/CB-9743) Removes system frameworks handling from ConfigChanges
* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Cleans out code which has been moved to `cordova-common`
* Pick ConfigParser changes from apache@ddb027b
* Picking CordovaError changes from apache@a3b1fca
* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Adds tests and fixtures based on existing cordova-lib ones
* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Initial implementation for cordova-common

/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

var addProperty = require('./src/util/addProperty');

module.exports = { };

addProperty(module, 'events', './src/events');
addProperty(module, 'superspawn', './src/superspawn');

addProperty(module, 'ActionStack', './src/ActionStack');
addProperty(module, 'CordovaError', './src/CordovaError/CordovaError');
addProperty(module, 'CordovaLogger', './src/CordovaLogger');
addProperty(module, 'CordovaCheck', './src/CordovaCheck');
addProperty(module, 'CordovaExternalToolErrorContext', './src/CordovaError/CordovaExternalToolErrorContext');
addProperty(module, 'PlatformJson', './src/PlatformJson');
addProperty(module, 'ConfigParser', './src/ConfigParser/ConfigParser');
addProperty(module, 'FileUpdater', './src/FileUpdater');

addProperty(module, 'PluginInfo', './src/PluginInfo/PluginInfo');
addProperty(module, 'PluginInfoProvider', './src/PluginInfo/PluginInfoProvider');

addProperty(module, 'PluginManager', './src/PluginManager');

addProperty(module, 'ConfigChanges', './src/ConfigChanges/ConfigChanges');
addProperty(module, 'ConfigKeeper', './src/ConfigChanges/ConfigKeeper');
addProperty(module, 'ConfigFile', './src/ConfigChanges/ConfigFile');
addProperty(module, 'mungeUtil', './src/ConfigChanges/munge-util');

addProperty(module, 'xmlHelpers', './src/util/xml-helpers');

{
  "author": {
    "name": "Apache Software Foundation"
  },
  "dependencies": {
    "ansi": "^0.3.1",
    "bplist-parser": "^0.1.0",
    "cross-spawn": "^6.0.5",
    "elementtree": "0.1.7",
    "endent": "^1.1.1",
    "fs-extra": "^8.0.0",
    "glob": "^7.1.2",
    "minimatch": "^3.0.0",
    "plist": "^3.0.1",
    "q": "^1.4.1",
    "strip-bom": "^3.0.0",
    "underscore": "^1.8.3",
    "which": "^1.3.0"
  },
  "deprecated": false,
  "description": "Apache Cordova tools and platforms shared routines",
  "devDependencies": {
    "eslint": "^5.0.0",
    "eslint-config-semistandard": "^14.0.0",
    "eslint-config-standard": "^13.0.1",
    "eslint-plugin-import": "^2.14.0",
    "eslint-plugin-node": "^8.0.0",
    "eslint-plugin-promise": "^4.0.0",
    "eslint-plugin-standard": "^4.0.0",
    "istanbul": "^0.4.5",
    "jasmine": "^3.4.0",
    "jasmine-spec-reporter": "^4.2.1",
    "osenv": "^0.1.3",
    "promise-matchers": "^0.9.6",
    "rewire": "^4.0.1"
  },
  "engines": {
    "node": ">=6.0.0"
  },
  "homepage": "https://github.com/apache/cordova-common#readme",
  "license": "Apache-2.0",
  "main": "cordova-common.js",
  "name": "cordova-common",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/apache/cordova-common.git"
  },
  "version": "3.2.1"
}/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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 quotmark:false */

var events = require('./events');
var Q = require('q');

function ActionStack () {
    this.stack = [];
    this.completed = [];
}

ActionStack.prototype = {
    createAction: function (handler, action_params, reverter, revert_params) {
        return {
            handler: {
                run: handler,
                params: action_params
            },
            reverter: {
                run: reverter,
                params: revert_params
            }
        };
    },
    push: function (tx) {
        this.stack.push(tx);
    },
    // Returns a promise.
    process: function (platform) {
        events.emit('verbose', 'Beginning processing of action stack for ' + platform + ' project...');

        while (this.stack.length) {
            var action = this.stack.shift();
            var handler = action.handler.run;
            var action_params = action.handler.params;

            try {
                handler.apply(null, action_params);
            } catch (e) {
                events.emit('warn', 'Error during processing of action! Attempting to revert...');
                this.stack.unshift(action);
                var issue = 'Uh oh!\n';
                // revert completed tasks
                while (this.completed.length) {
                    var undo = this.completed.shift();
                    var revert = undo.reverter.run;
                    var revert_params = undo.reverter.params;

                    try {
                        revert.apply(null, revert_params);
                    } catch (err) {
                        events.emit('warn', 'Error during reversion of action! We probably really messed up your project now, sorry! D:');
                        issue += 'A reversion action failed: ' + err.message + '\n';
                    }
                }
                e.message = issue + e.message;
                return Q.reject(e);
            }
            this.completed.push(action);
        }
        events.emit('verbose', 'Action stack processing complete.');

        return Q();
    }
};

module.exports = ActionStack;
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

var fs = require('fs-extra');
var path = require('path');

function isRootDir (dir) {
    if (fs.existsSync(path.join(dir, 'www'))) {
        if (fs.existsSync(path.join(dir, 'config.xml'))) {
            // For sure is.
            if (fs.existsSync(path.join(dir, 'platforms'))) {
                return 2;
            } else {
                return 1;
            }
        }
        // Might be (or may be under platforms/).
        if (fs.existsSync(path.join(dir, 'www', 'config.xml'))) {
            return 1;
        }
    }
    return 0;
}

// Runs up the directory chain looking for a .cordova directory.
// IF it is found we are in a Cordova project.
// Omit argument to use CWD.
function isCordova (dir) {
    if (!dir) {
        // Prefer PWD over cwd so that symlinked dirs within your PWD work correctly (CB-5687).
        var pwd = process.env.PWD;
        var cwd = process.cwd();
        if (pwd && pwd !== cwd && pwd !== 'undefined') {
            return isCordova(pwd) || isCordova(cwd);
        }
        return isCordova(cwd);
    }
    var bestReturnValueSoFar = false;
    for (var i = 0; i < 1000; ++i) {
        var result = isRootDir(dir);
        if (result === 2) {
            return dir;
        }
        if (result === 1) {
            bestReturnValueSoFar = dir;
        }
        var parentDir = path.normalize(path.join(dir, '..'));
        // Detect fs root.
        if (parentDir === dir) {
            return bestReturnValueSoFar;
        }
        dir = parentDir;
    }
    console.error('Hit an unhandled case in CordovaCheck.isCordova');
    return false;
}

module.exports = {
    findProjectRoot: isCordova
};
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
 */

const ansi = require('ansi');
const EventEmitter = require('events').EventEmitter;
const EOL = require('os').EOL;
const formatError = require('./util/formatError');

const INSTANCE_KEY = Symbol.for('org.apache.cordova.common.CordovaLogger');

/**
 * @typedef {'verbose'|'normal'|'warn'|'info'|'error'|'results'} CordovaLoggerLevel
 */

/**
 * Implements logging facility that anybody could use.
 *
 * Should not be instantiated directly! `CordovaLogger.get()` method should be
 * used instead to acquire the logger instance.
 */
class CordovaLogger {
    // Encapsulate the default logging level values with constants:
    static get VERBOSE () { return 'verbose'; }

    static get NORMAL () { return 'normal'; }

    static get WARN () { return 'warn'; }

    static get INFO () { return 'info'; }

    static get ERROR () { return 'error'; }

    static get RESULTS () { return 'results'; }

    /**
     * Static method to create new or acquire existing instance.
     *
     * @returns {CordovaLogger} Logger instance
     */
    static get () {
        // This singleton instance pattern is based on the ideas from
        // https://derickbailey.com/2016/03/09/creating-a-true-singleton-in-node-js-with-es6-symbols/
        if (Object.getOwnPropertySymbols(global).indexOf(INSTANCE_KEY) === -1) {
            global[INSTANCE_KEY] = new CordovaLogger();
        }
        return global[INSTANCE_KEY];
    }

    constructor () {
        /** @private */
        this.levels = {};
        /** @private */
        this.colors = {};
        /** @private */
        this.stdout = process.stdout;
        /** @private */
        this.stderr = process.stderr;

        /** @private */
        this.stdoutCursor = ansi(this.stdout);
        /** @private */
        this.stderrCursor = ansi(this.stderr);

        this.addLevel(CordovaLogger.VERBOSE, 1000, 'grey');
        this.addLevel(CordovaLogger.NORMAL, 2000);
        this.addLevel(CordovaLogger.WARN, 2000, 'yellow');
        this.addLevel(CordovaLogger.INFO, 3000, 'blue');
        this.addLevel(CordovaLogger.ERROR, 5000, 'red');
        this.addLevel(CordovaLogger.RESULTS, 10000);

        this.setLevel(CordovaLogger.NORMAL);
    }

    /**
     * Emits log message to process' stdout/stderr depending on message's
     * severity and current log level. If severity is less than current
     * logger's level, then the message is ignored.
     *
     * @param {CordovaLoggerLevel} logLevel - The message's log level. The
     *   logger should have corresponding level added (via logger.addLevel),
     *   otherwise `CordovaLogger.NORMAL` level will be used.
     *
     * @param {string} message - The message, that should be logged to
     *   process's stdio.
     *
     * @returns {CordovaLogger} Return the current instance, to allow chaining.
     */
    log (logLevel, message) {
        // if there is no such logLevel defined, or provided level has
        // less severity than active level, then just ignore this call and return
        if (!this.levels[logLevel] || this.levels[logLevel] < this.levels[this.logLevel]) {
            // return instance to allow to chain calls
            return this;
        }

        var isVerbose = this.logLevel === CordovaLogger.VERBOSE;
        var cursor = this.stdoutCursor;

        if (message instanceof Error || logLevel === CordovaLogger.ERROR) {
            message = formatError(message, isVerbose);
            cursor = this.stderrCursor;
        }

        var color = this.colors[logLevel];
        if (color) {
            cursor.bold().fg[color]();
        }

        cursor.write(message).reset().write(EOL);

        return this;
    }

    /**
     * Adds a new level to logger instance.
     *
     * This method also creates a shortcut method to log events with the level
     * provided.
     * (i.e. after adding new level 'debug', the method `logger.debug(message)`
     * will exist, equal to `logger.log('debug', message)`)
     *
     * @param {CordovaLoggerLevel} level - A log level name. The levels with
     *   the following names are added by default to every instance: 'verbose',
     *   'normal', 'warn', 'info', 'error', 'results'.
     *
     * @param {number} severity - A number that represents level's severity.
     *
     * @param {string} color - A valid color name, that will be used to log
     *   messages with this level. Any CSS color code or RGB value is allowed
     *   (according to ansi documentation:
     *   https://github.com/TooTallNate/ansi.js#features).
     *
     * @returns {CordovaLogger} Return the current instance, to allow chaining.
     */
    addLevel (level, severity, color) {
        this.levels[level] = severity;

        if (color) {
            this.colors[level] = color;
        }

        // Define own method with corresponding name
        if (!this[level]) {
            Object.defineProperty(this, level, {
                get () { return this.log.bind(this, level); }
            });
        }

        return this;
    }

    /**
     * Sets the current logger level to provided value.
     *
     * If logger doesn't have level with this name, `CordovaLogger.NORMAL` will
     * be used.
     *
     * @param {CordovaLoggerLevel} logLevel - Level name. The level with this
     *   name should be added to logger before.
     *
     * @returns {CordovaLogger} Current instance, to allow chaining.
     */
    setLevel (logLevel) {
        this.logLevel = this.levels[logLevel] ? logLevel : CordovaLogger.NORMAL;

        return this;
    }

    /**
     * Adjusts the current logger level according to the passed options.
     *
     * @param {Object|Array<string>} opts - An object or args array with
     *   options.
     *
     * @returns {CordovaLogger} Current instance, to allow chaining.
     */
    adjustLevel (opts) {
        if (opts.verbose || (Array.isArray(opts) && opts.includes('--verbose'))) {
            this.setLevel('verbose');
        } else if (opts.silent || (Array.isArray(opts) && opts.includes('--silent'))) {
            this.setLevel('error');
        }

        return this;
    }

    /**
     * Attaches logger to EventEmitter instance provided.
     *
     * @param {EventEmitter} eventEmitter - An EventEmitter instance to attach
     *   the logger to.
     *
     * @returns {CordovaLogger} Current instance, to allow chaining.
     */
    subscribe (eventEmitter) {
        if (!(eventEmitter instanceof EventEmitter)) {
            throw new Error('Subscribe method only accepts an EventEmitter instance as argument');
        }

        eventEmitter.on('verbose', this.verbose)
            .on('log', this.normal)
            .on('info', this.info)
            .on('warn', this.warn)
            .on('warning', this.warn)
            // Set up event handlers for logging and results emitted as events.
            .on('results', this.results);

        return this;
    }
}

module.exports = CordovaLogger;
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

'use strict';

var fs = require('fs-extra');
var path = require('path');
var minimatch = require('minimatch');

/**
 * Logging callback used in the FileUpdater methods.
 * @callback loggingCallback
 * @param {string} message A message describing a single file update operation.
 */

/**
 * Updates a target file or directory with a source file or directory. (Directory updates are
 * not recursive.) Stats for target and source items must be passed in. This is an internal
 * helper function used by other methods in this module.
 *
 * @param {?string} sourcePath Source file or directory to be used to update the
 *     destination. If the source is null, then the destination is deleted if it exists.
 * @param {?fs.Stats} sourceStats An instance of fs.Stats for the source path, or null if
 *     the source does not exist.
 * @param {string} targetPath Required destination file or directory to be updated. If it does
 *     not exist, it will be created.
 * @param {?fs.Stats} targetStats An instance of fs.Stats for the target path, or null if
 *     the target does not exist.
 * @param {Object} [options] Optional additional parameters for the update.
 * @param {string} [options.rootDir] Optional root directory (such as a project) to which target
 *     and source path parameters are relative; may be omitted if the paths are absolute. The
 *     rootDir is always omitted from any logged paths, to make the logs easier to read.
 * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
 *     Otherwise, a file is copied if the source's last-modified time is greather than or
 *     equal to the target's last-modified time, or if the file sizes are different.
 * @param {loggingCallback} [log] Optional logging callback that takes a string message
 *     describing any file operations that are performed.
 * @return {boolean} true if any changes were made, or false if the force flag is not set
 *     and everything was up to date
 */
function updatePathWithStats (sourcePath, sourceStats, targetPath, targetStats, options, log) {
    var updated = false;

    var rootDir = (options && options.rootDir) || '';
    var copyAll = (options && options.all) || false;

    var targetFullPath = path.join(rootDir || '', targetPath);

    if (sourceStats) {
        var sourceFullPath = path.join(rootDir || '', sourcePath);

        if (targetStats && (targetStats.isDirectory() !== sourceStats.isDirectory())) {
            // The target exists. But if the directory status doesn't match the source, delete it.
            log('delete ' + targetPath);
            fs.removeSync(targetFullPath);
            targetStats = null;
            updated = true;
        }

        if (!targetStats) {
            if (sourceStats.isDirectory()) {
                // The target directory does not exist, so it should be created.
                log('mkdir ' + targetPath);
                fs.ensureDirSync(targetFullPath);
                updated = true;
            } else if (sourceStats.isFile()) {
                // The target file does not exist, so it should be copied from the source.
                log('copy  ' + sourcePath + ' ' + targetPath + (copyAll ? '' : ' (new file)'));
                fs.copySync(sourceFullPath, targetFullPath);
                updated = true;
            }
        } else if (sourceStats.isFile() && targetStats.isFile()) {
            // The source and target paths both exist and are files.
            if (copyAll) {
                // The caller specified all files should be copied.
                log('copy  ' + sourcePath + ' ' + targetPath);
                fs.copySync(sourceFullPath, targetFullPath);
                updated = true;
            } else {
                // Copy if the source has been modified since it was copied to the target, or if
                // the file sizes are different. (The latter catches most cases in which something
                // was done to the file after copying.) Comparison is >= rather than > to allow
                // for timestamps lacking sub-second precision in some filesystems.
                if (sourceStats.mtime.getTime() >= targetStats.mtime.getTime() ||
                        sourceStats.size !== targetStats.size) {
                    log('copy  ' + sourcePath + ' ' + targetPath + ' (updated file)');
                    fs.copySync(sourceFullPath, targetFullPath);
                    updated = true;
                }
            }
        }
    } else if (targetStats) {
        // The target exists but the source is null, so the target should be deleted.
        log('delete ' + targetPath + (copyAll ? '' : ' (no source)'));
        fs.removeSync(targetFullPath);
        updated = true;
    }

    return updated;
}

/**
 * Helper for updatePath and updatePaths functions. Queries stats for source and target
 * and ensures target directory exists before copying a file.
 */
function updatePathInternal (sourcePath, targetPath, options, log) {
    var rootDir = (options && options.rootDir) || '';
    var targetFullPath = path.join(rootDir, targetPath);
    var targetStats = fs.existsSync(targetFullPath) ? fs.statSync(targetFullPath) : null;
    var sourceStats = null;

    if (sourcePath) {
        // A non-null source path was specified. It should exist.
        var sourceFullPath = path.join(rootDir, sourcePath);
        if (!fs.existsSync(sourceFullPath)) {
            throw new Error('Source path does not exist: ' + sourcePath);
        }

        sourceStats = fs.statSync(sourceFullPath);

        // Create the target's parent directory if it doesn't exist.
        var parentDir = path.dirname(targetFullPath);
        if (!fs.existsSync(parentDir)) {
            fs.ensureDirSync(parentDir);
        }
    }

    return updatePathWithStats(sourcePath, sourceStats, targetPath, targetStats, options, log);
}

/**
 * Updates a target file or directory with a source file or directory. (Directory updates are
 * not recursive.)
 *
 * @param {?string} sourcePath Source file or directory to be used to update the
 *     destination. If the source is null, then the destination is deleted if it exists.
 * @param {string} targetPath Required destination file or directory to be updated. If it does
 *     not exist, it will be created.
 * @param {Object} [options] Optional additional parameters for the update.
 * @param {string} [options.rootDir] Optional root directory (such as a project) to which target
 *     and source path parameters are relative; may be omitted if the paths are absolute. The
 *     rootDir is always omitted from any logged paths, to make the logs easier to read.
 * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
 *     Otherwise, a file is copied if the source's last-modified time is greather than or
 *     equal to the target's last-modified time, or if the file sizes are different.
 * @param {loggingCallback} [log] Optional logging callback that takes a string message
 *     describing any file operations that are performed.
 * @return {boolean} true if any changes were made, or false if the force flag is not set
 *     and everything was up to date
 */
function updatePath (sourcePath, targetPath, options, log) {
    if (sourcePath !== null && typeof sourcePath !== 'string') {
        throw new Error('A source path (or null) is required.');
    }

    if (!targetPath || typeof targetPath !== 'string') {
        throw new Error('A target path is required.');
    }

    log = log || function () { };

    return updatePathInternal(sourcePath, targetPath, options, log);
}

/**
 * Updates files and directories based on a mapping from target paths to source paths. Targets
 * with null sources in the map are deleted.
 *
 * @param {Object} pathMap A dictionary mapping from target paths to source paths.
 * @param {Object} [options] Optional additional parameters for the update.
 * @param {string} [options.rootDir] Optional root directory (such as a project) to which target
 *     and source path parameters are relative; may be omitted if the paths are absolute. The
 *     rootDir is always omitted from any logged paths, to make the logs easier to read.
 * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
 *     Otherwise, a file is copied if the source's last-modified time is greather than or
 *     equal to the target's last-modified time, or if the file sizes are different.
 * @param {loggingCallback} [log] Optional logging callback that takes a string message
 *     describing any file operations that are performed.
 * @return {boolean} true if any changes were made, or false if the force flag is not set
 *     and everything was up to date
 */
function updatePaths (pathMap, options, log) {
    if (!pathMap || typeof pathMap !== 'object' || Array.isArray(pathMap)) {
        throw new Error('An object mapping from target paths to source paths is required.');
    }

    log = log || function () { };

    var updated = false;

    // Iterate in sorted order to ensure directories are created before files under them.
    Object.keys(pathMap).sort().forEach(function (targetPath) {
        var sourcePath = pathMap[targetPath];
        updated = updatePathInternal(sourcePath, targetPath, options, log) || updated;
    });

    return updated;
}

/**
 * Updates a target directory with merged files and subdirectories from source directories.
 *
 * @param {string|string[]} sourceDirs Required source directory or array of source directories
 *     to be merged into the target. The directories are listed in order of precedence; files in
 *     directories later in the array supersede files in directories earlier in the array
 *     (regardless of timestamps).
 * @param {string} targetDir Required destination directory to be updated. If it does not exist,
 *     it will be created. If it exists, newer files from source directories will be copied over,
 *     and files missing in the source directories will be deleted.
 * @param {Object} [options] Optional additional parameters for the update.
 * @param {string} [options.rootDir] Optional root directory (such as a project) to which target
 *     and source path parameters are relative; may be omitted if the paths are absolute. The
 *     rootDir is always omitted from any logged paths, to make the logs easier to read.
 * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
 *     Otherwise, a file is copied if the source's last-modified time is greather than or
 *     equal to the target's last-modified time, or if the file sizes are different.
 * @param {string|string[]} [options.include] Optional glob string or array of glob strings that
 *     are tested against both target and source relative paths to determine if they are included
 *     in the merge-and-update. If unspecified, all items are included.
 * @param {string|string[]} [options.exclude] Optional glob string or array of glob strings that
 *     are tested against both target and source relative paths to determine if they are excluded
 *     from the merge-and-update. Exclusions override inclusions. If unspecified, no items are
 *     excluded.
 * @param {loggingCallback} [log] Optional logging callback that takes a string message
 *     describing any file operations that are performed.
 * @return {boolean} true if any changes were made, or false if the force flag is not set
 *     and everything was up to date
 */
function mergeAndUpdateDir (sourceDirs, targetDir, options, log) {
    if (sourceDirs && typeof sourceDirs === 'string') {
        sourceDirs = [sourceDirs];
    } else if (!Array.isArray(sourceDirs)) {
        throw new Error('A source directory path or array of paths is required.');
    }

    if (!targetDir || typeof targetDir !== 'string') {
        throw new Error('A target directory path is required.');
    }

    log = log || function () { };

    var rootDir = (options && options.rootDir) || '';

    var include = (options && options.include) || ['**'];
    if (typeof include === 'string') {
        include = [include];
    } else if (!Array.isArray(include)) {
        throw new Error('Include parameter must be a glob string or array of glob strings.');
    }

    var exclude = (options && options.exclude) || [];
    if (typeof exclude === 'string') {
        exclude = [exclude];
    } else if (!Array.isArray(exclude)) {
        throw new Error('Exclude parameter must be a glob string or array of glob strings.');
    }

    // Scan the files in each of the source directories.
    var sourceMaps = sourceDirs.map(function (sourceDir) {
        return path.join(rootDir, sourceDir);
    }).map(function (sourcePath) {
        if (!fs.existsSync(sourcePath)) {
            throw new Error('Source directory does not exist: ' + sourcePath);
        }
        return mapDirectory(rootDir, path.relative(rootDir, sourcePath), include, exclude);
    });

    // Scan the files in the target directory, if it exists.
    var targetMap = {};
    var targetFullPath = path.join(rootDir, targetDir);
    if (fs.existsSync(targetFullPath)) {
        targetMap = mapDirectory(rootDir, targetDir, include, exclude);
    }

    var pathMap = mergePathMaps(sourceMaps, targetMap, targetDir);

    var updated = false;

    // Iterate in sorted order to ensure directories are created before files under them.
    Object.keys(pathMap).sort().forEach(function (subPath) {
        var entry = pathMap[subPath];
        updated = updatePathWithStats(
            entry.sourcePath,
            entry.sourceStats,
            entry.targetPath,
            entry.targetStats,
            options,
            log) || updated;
    });

    return updated;
}

/**
 * Creates a dictionary map of all files and directories under a path.
 */
function mapDirectory (rootDir, subDir, include, exclude) {
    var dirMap = { '': { subDir: subDir, stats: fs.statSync(path.join(rootDir, subDir)) } };
    mapSubdirectory(rootDir, subDir, '', include, exclude, dirMap);
    return dirMap;

    function mapSubdirectory (rootDir, subDir, relativeDir, include, exclude, dirMap) {
        var itemMapped = false;
        var items = fs.readdirSync(path.join(rootDir, subDir, relativeDir));

        items.forEach(function (item) {
            var relativePath = path.join(relativeDir, item);
            if (!matchGlobArray(relativePath, exclude)) {
                // Stats obtained here (required at least to know where to recurse in directories)
                // are saved for later, where the modified times may also be used. This minimizes
                // the number of file I/O operations performed.
                var fullPath = path.join(rootDir, subDir, relativePath);
                var stats = fs.statSync(fullPath);

                if (stats.isDirectory()) {
                    // Directories are included if either something under them is included or they
                    // match an include glob.
                    if (mapSubdirectory(rootDir, subDir, relativePath, include, exclude, dirMap) ||
                            matchGlobArray(relativePath, include)) {
                        dirMap[relativePath] = { subDir: subDir, stats: stats };
                        itemMapped = true;
                    }
                } else if (stats.isFile()) {
                    // Files are included only if they match an include glob.
                    if (matchGlobArray(relativePath, include)) {
                        dirMap[relativePath] = { subDir: subDir, stats: stats };
                        itemMapped = true;
                    }
                }
            }
        });
        return itemMapped;
    }

    function matchGlobArray (path, globs) {
        return globs.some(function (elem) {
            return minimatch(path, elem, { dot: true });
        });
    }
}

/**
 * Merges together multiple source maps and a target map into a single mapping from
 * relative paths to objects with target and source paths and stats.
 */
function mergePathMaps (sourceMaps, targetMap, targetDir) {
    // Merge multiple source maps together, along with target path info.
    // Entries in later source maps override those in earlier source maps.
    // Target stats will be filled in below for targets that exist.
    var pathMap = {};
    sourceMaps.forEach(function (sourceMap) {
        Object.keys(sourceMap).forEach(function (sourceSubPath) {
            var sourceEntry = sourceMap[sourceSubPath];
            pathMap[sourceSubPath] = {
                targetPath: path.join(targetDir, sourceSubPath),
                targetStats: null,
                sourcePath: path.join(sourceEntry.subDir, sourceSubPath),
                sourceStats: sourceEntry.stats
            };
        });
    });

    // Fill in target stats for targets that exist, and create entries
    // for targets that don't have any corresponding sources.
    Object.keys(targetMap).forEach(function (subPath) {
        var entry = pathMap[subPath];
        if (entry) {
            entry.targetStats = targetMap[subPath].stats;
        } else {
            pathMap[subPath] = {
                targetPath: path.join(targetDir, subPath),
                targetStats: targetMap[subPath].stats,
                sourcePath: null,
                sourceStats: null
            };
        }
    });

    return pathMap;
}

module.exports = {
    updatePath: updatePath,
    updatePaths: updatePaths,
    mergeAndUpdateDir: mergeAndUpdateDir
};
/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var fs = require('fs-extra');
var path = require('path');
var endent = require('endent');
var mungeutil = require('./ConfigChanges/munge-util');

function PlatformJson (filePath, platform, root) {
    this.filePath = filePath;
    this.platform = platform;
    this.root = fix_munge(root || {});
}

PlatformJson.load = function (plugins_dir, platform) {
    var filePath = path.join(plugins_dir, platform + '.json');
    var root = null;
    if (fs.existsSync(filePath)) {
        root = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
    }
    return new PlatformJson(filePath, platform, root);
};

PlatformJson.prototype.save = function () {
    fs.outputJsonSync(this.filePath, this.root, { spaces: 2 });
};

/**
 * Indicates whether the specified plugin is installed as a top-level (not as
 *  dependency to others)
 * @method function
 * @param  {String} pluginId A plugin id to check for.
 * @return {Boolean} true if plugin installed as top-level, otherwise false.
 */
PlatformJson.prototype.isPluginTopLevel = function (pluginId) {
    return this.root.installed_plugins[pluginId];
};

/**
 * Indicates whether the specified plugin is installed as a dependency to other
 *  plugin.
 * @method function
 * @param  {String} pluginId A plugin id to check for.
 * @return {Boolean} true if plugin installed as a dependency, otherwise false.
 */
PlatformJson.prototype.isPluginDependent = function (pluginId) {
    return this.root.dependent_plugins[pluginId];
};

/**
 * Indicates whether plugin is installed either as top-level or as dependency.
 * @method function
 * @param  {String} pluginId A plugin id to check for.
 * @return {Boolean} true if plugin installed, otherwise false.
 */
PlatformJson.prototype.isPluginInstalled = function (pluginId) {
    return this.isPluginTopLevel(pluginId) ||
        this.isPluginDependent(pluginId);
};

PlatformJson.prototype.addPlugin = function (pluginId, variables, isTopLevel) {
    var pluginsList = isTopLevel
        ? this.root.installed_plugins
        : this.root.dependent_plugins;

    pluginsList[pluginId] = variables;

    return this;
};

/**
 * @chaining
 * Generates and adds metadata for provided plugin into associated <platform>.json file
 *
 * @param   {PluginInfo}  pluginInfo  A pluginInfo instance to add metadata from
 * @returns {this} Current PlatformJson instance to allow calls chaining
 */
PlatformJson.prototype.addPluginMetadata = function (pluginInfo) {
    var installedModules = this.root.modules || [];

    var installedPaths = installedModules.map(function (installedModule) {
        return installedModule.file;
    });

    var modulesToInstall = pluginInfo.getJsModules(this.platform)
        .map(function (module) {
            return new ModuleMetadata(pluginInfo.id, module);
        })
        .filter(function (metadata) {
            // Filter out modules which are already added to metadata
            return !installedPaths.includes(metadata.file);
        });

    this.root.modules = installedModules.concat(modulesToInstall);

    this.root.plugin_metadata = this.root.plugin_metadata || {};
    this.root.plugin_metadata[pluginInfo.id] = pluginInfo.version;

    return this;
};

PlatformJson.prototype.removePlugin = function (pluginId, isTopLevel) {
    var pluginsList = isTopLevel
        ? this.root.installed_plugins
        : this.root.dependent_plugins;

    delete pluginsList[pluginId];

    return this;
};

/**
 * @chaining
 * Removes metadata for provided plugin from associated file
 *
 * @param   {PluginInfo}  pluginInfo A PluginInfo instance to which modules' metadata
 *   we need to remove
 *
 * @returns {this} Current PlatformJson instance to allow calls chaining
 */
PlatformJson.prototype.removePluginMetadata = function (pluginInfo) {
    var modulesToRemove = pluginInfo.getJsModules(this.platform)
        .map(function (jsModule) {
            return ['plugins', pluginInfo.id, jsModule.src].join('/');
        });

    var installedModules = this.root.modules || [];
    this.root.modules = installedModules
        .filter(function (installedModule) {
            // Leave only those metadatas which 'file' is not in removed modules
            return !modulesToRemove.includes(installedModule.file);
        });

    if (this.root.plugin_metadata) {
        delete this.root.plugin_metadata[pluginInfo.id];
    }

    return this;
};

PlatformJson.prototype.addInstalledPluginToPrepareQueue = function (pluginDirName, vars, is_top_level, force) {
    this.root.prepare_queue.installed.push({ plugin: pluginDirName, vars: vars, topLevel: is_top_level, force: force });
};

PlatformJson.prototype.addUninstalledPluginToPrepareQueue = function (pluginId, is_top_level) {
    this.root.prepare_queue.uninstalled.push({ plugin: pluginId, id: pluginId, topLevel: is_top_level });
};

/**
 * Moves plugin, specified by id to top-level plugins. If plugin is top-level
 *  already, then does nothing.
 * @method function
 * @param  {String} pluginId A plugin id to make top-level.
 * @return {PlatformJson} PlatformJson instance.
 */
PlatformJson.prototype.makeTopLevel = function (pluginId) {
    var plugin = this.root.dependent_plugins[pluginId];
    if (plugin) {
        delete this.root.dependent_plugins[pluginId];
        this.root.installed_plugins[pluginId] = plugin;
    }
    return this;
};

/**
 * Generates a metadata for all installed plugins and js modules. The resultant
 *   string is ready to be written to 'cordova_plugins.js'
 *
 * @returns {String} cordova_plugins.js contents
 */
PlatformJson.prototype.generateMetadata = function () {
    const stringify = o => JSON.stringify(o, null, 2);
    return endent`
        cordova.define('cordova/plugin_list', function(require, exports, module) {
          module.exports = ${stringify(this.root.modules)};
          module.exports.metadata = ${stringify(this.root.plugin_metadata)};
        });
    `;
};

/**
 * @chaining
 * Generates and then saves metadata to specified file. Doesn't check if file exists.
 *
 * @param {String} destination  File metadata will be written to
 * @return {PlatformJson} PlatformJson instance
 */
PlatformJson.prototype.generateAndSaveMetadata = function (destination) {
    fs.outputFileSync(destination, this.generateMetadata());

    return this;
};

// convert a munge from the old format ([file][parent][xml] = count) to the current one
function fix_munge (root) {
    root.prepare_queue = root.prepare_queue || { installed: [], uninstalled: [] };
    root.config_munge = root.config_munge || { files: {} };
    root.installed_plugins = root.installed_plugins || {};
    root.dependent_plugins = root.dependent_plugins || {};

    var munge = root.config_munge;
    if (!munge.files) {
        var new_munge = { files: {} };
        for (var file in munge) {
            for (var selector in munge[file]) {
                for (var xml_child in munge[file][selector]) {
                    var val = parseInt(munge[file][selector][xml_child]);
                    for (var i = 0; i < val; i++) {
                        mungeutil.deep_add(new_munge, [file, selector, { xml: xml_child, count: val }]);
                    }
                }
            }
        }
        root.config_munge = new_munge;
    }

    return root;
}

/**
 * @constructor
 * @class ModuleMetadata
 *
 * Creates a ModuleMetadata object that represents module entry in 'cordova_plugins.js'
 *   file at run time
 *
 * @param {String}  pluginId  Plugin id where this module installed from
 * @param (JsModule|Object)  jsModule  A js-module entry from PluginInfo class to generate metadata for
 */
function ModuleMetadata (pluginId, jsModule) {
    if (!pluginId) throw new TypeError('pluginId argument must be a valid plugin id');
    if (!jsModule.src && !jsModule.name) throw new TypeError('jsModule argument must contain src or/and name properties');

    this.id = pluginId + '.' + (jsModule.name || jsModule.src.match(/([^/]+)\.js/)[1]);
    this.file = ['plugins', pluginId, jsModule.src].join('/');
    this.pluginId = pluginId;

    if (jsModule.clobbers && jsModule.clobbers.length > 0) {
        this.clobbers = jsModule.clobbers.map(function (o) { return o.target; });
    }
    if (jsModule.merges && jsModule.merges.length > 0) {
        this.merges = jsModule.merges.map(function (o) { return o.target; });
    }
    if (jsModule.runs) {
        this.runs = true;
    }
}

module.exports = PlatformJson;
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
*/

var Q = require('q');
var fs = require('fs-extra');
var path = require('path');

var ActionStack = require('./ActionStack');
var PlatformJson = require('./PlatformJson');
var CordovaError = require('./CordovaError/CordovaError');
var PlatformMunger = require('./ConfigChanges/ConfigChanges').PlatformMunger;
var PluginInfoProvider = require('./PluginInfo/PluginInfoProvider');

/**
 * @constructor
 * @class PluginManager
 * Represents an entity for adding/removing plugins for platforms
 *
 * @param {String} platform Platform name
 * @param {Object} locations - Platform files and directories
 * @param {IDEProject} ideProject The IDE project to add/remove plugin changes to/from
 */
function PluginManager (platform, locations, ideProject) {
    this.platform = platform;
    this.locations = locations;
    this.project = ideProject;

    var platformJson = PlatformJson.load(locations.root, platform);
    this.munger = new PlatformMunger(platform, locations.root, platformJson, new PluginInfoProvider());
}

/**
 * @constructs PluginManager
 * A convenience shortcut to new PluginManager(...)
 *
 * @param {String} platform Platform name
 * @param {Object} locations - Platform files and directories
 * @param {IDEProject} ideProject The IDE project to add/remove plugin changes to/from
 * @returns new PluginManager instance
 */
PluginManager.get = function (platform, locations, ideProject) {
    return new PluginManager(platform, locations, ideProject);
};

PluginManager.INSTALL = 'install';
PluginManager.UNINSTALL = 'uninstall';

module.exports = PluginManager;

/**
 * Describes and implements common plugin installation/uninstallation routine. The flow is the following:
 *  * Validate and set defaults for options. Note that options are empty by default. Everything
 *    needed for platform IDE project must be passed from outside. Plugin variables (which
 *    are the part of the options) also must be already populated with 'PACKAGE_NAME' variable.
 *  * Collect all plugin's native and web files, get installers/uninstallers and process
 *    all these via ActionStack.
 *  * Save the IDE project, so the changes made by installers are persisted.
 *  * Generate config changes munge for plugin and apply it to all required files
 *  * Generate metadata for plugin and plugin modules and save it to 'cordova_plugins.js'
 *
 * @param {PluginInfo} plugin A PluginInfo structure representing plugin to install
 * @param {Object} [options={}] An installation options. It is expected but is not necessary
 *   that options would contain 'variables' inner object with 'PACKAGE_NAME' field set by caller.
 *
 * @returns {Promise} Returns a Q promise, either resolved in case of success, rejected otherwise.
 */
PluginManager.prototype.doOperation = function (operation, plugin, options) {
    if (operation !== PluginManager.INSTALL && operation !== PluginManager.UNINSTALL) { return Q.reject(new CordovaError('The parameter is incorrect. The opeation must be either "add" or "remove"')); }

    if (!plugin || plugin.constructor.name !== 'PluginInfo') { return Q.reject(new CordovaError('The parameter is incorrect. The first parameter should be a PluginInfo instance')); }

    // Set default to empty object to play safe when accesing properties
    options = options || {};

    var self = this;
    var actions = new ActionStack();

    // gather all files need to be handled during operation ...
    plugin.getFilesAndFrameworks(this.platform, options)
        .concat(plugin.getAssets(this.platform))
        .concat(plugin.getJsModules(this.platform))
        // ... put them into stack ...
        .forEach(function (item) {
            var installer = self.project.getInstaller(item.itemType);
            var uninstaller = self.project.getUninstaller(item.itemType);
            var actionArgs = [item, plugin, self.project, options];

            var action;
            if (operation === PluginManager.INSTALL) {
                action = actions.createAction(installer, actionArgs, uninstaller, actionArgs);
            } else /* op === PluginManager.UNINSTALL */{
                action = actions.createAction(uninstaller, actionArgs, installer, actionArgs);
            }
            actions.push(action);
        });

    // ... and run through the action stack
    return actions.process(this.platform)
        .then(function () {
            if (self.project.write) {
                self.project.write();
            }

            if (operation === PluginManager.INSTALL) {
                // Ignore passed `is_top_level` option since platform itself doesn't know
                // anything about managing dependencies - it's responsibility of caller.
                self.munger.add_plugin_changes(plugin, options.variables, /* is_top_level= */true, /* should_increment= */true, options.force);
                self.munger.platformJson.addPluginMetadata(plugin);
            } else {
                self.munger.remove_plugin_changes(plugin, /* is_top_level= */true);
                self.munger.platformJson.removePluginMetadata(plugin);
            }

            // Save everything (munge and plugin/modules metadata)
            self.munger.save_all();

            var metadata = self.munger.platformJson.generateMetadata();
            fs.writeFileSync(path.join(self.locations.www, 'cordova_plugins.js'), metadata, 'utf-8');

            // CB-11022 save plugin metadata to both www and platform_www if options.usePlatformWww is specified
            if (options.usePlatformWww) {
                fs.writeFileSync(path.join(self.locations.platformWww, 'cordova_plugins.js'), metadata, 'utf-8');
            }
        });
};

PluginManager.prototype.addPlugin = function (plugin, installOptions) {
    return this.doOperation(PluginManager.INSTALL, plugin, installOptions);
};

PluginManager.prototype.removePlugin = function (plugin, uninstallOptions) {
    return this.doOperation(PluginManager.UNINSTALL, plugin, uninstallOptions);
};
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const EventEmitter = require('events').EventEmitter;

const MAX_LISTENERS = 20;

const INSTANCE_KEY = Symbol.for('org.apache.cordova.common.CordovaEvents');

let EVENTS_RECEIVER = null;

class CordovaEventEmitter extends EventEmitter {
    /**
     * Sets up current instance to forward emitted events to another EventEmitter
     *   instance.
     *
     * @param   {EventEmitter}  [eventEmitter]  The emitter instance to forward
     *   events to. Falsy value, when passed, disables forwarding.
     */
    forwardEventsTo (eventEmitter) {
        // If no argument is specified disable events forwarding
        if (!eventEmitter) {
            EVENTS_RECEIVER = undefined;
            return;
        }

        if (!(eventEmitter instanceof EventEmitter)) {
            throw new Error('Cordova events can be redirected to another EventEmitter instance only');
        }

        // CB-10940 Skipping forwarding to self to avoid infinite recursion.
        // This is the case when the modules are npm-linked.
        if (this !== eventEmitter) {
            EVENTS_RECEIVER = eventEmitter;
        } else {
            // Reset forwarding if we are subscribing to self
            EVENTS_RECEIVER = undefined;
        }
    }

    /**
     * Sets up current instance to forward emitted events to another EventEmitter
     *   instance.
     *
     * @param   {EventEmitter}  [eventEmitter]  The emitter instance to forward
     *   events to. Falsy value, when passed, disables forwarding.
     */
    emit (eventName, ...args) {
        if (EVENTS_RECEIVER) {
            EVENTS_RECEIVER.emit(eventName, ...args);
        }

        return super.emit(eventName, ...args);
    }
}

// This singleton instance pattern is based on the ideas from
// https://derickbailey.com/2016/03/09/creating-a-true-singleton-in-node-js-with-es6-symbols/
if (Object.getOwnPropertySymbols(global).indexOf(INSTANCE_KEY) === -1) {
    const events = new CordovaEventEmitter();
    events.setMaxListeners(MAX_LISTENERS);
    global[INSTANCE_KEY] = events;
}

module.exports = global[INSTANCE_KEY];
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

var crossSpawn = require('cross-spawn');
var fs = require('fs-extra');
var _ = require('underscore');
var Q = require('q');
var events = require('./events');
var iswin32 = process.platform === 'win32';

/**
 * A special implementation for child_process.spawn that handles
 *   Windows-specific issues with batch files and spaces in paths. Returns a
 *   promise that succeeds only for return code 0. It is also possible to
 *   subscribe on spawned process' stdout and stderr streams using progress
 *   handler for resultant promise.
 *
 * @example spawn('mycommand', [], {stdio: 'pipe'}) .progress(function (stdio){
 *   if (stdio.stderr) { console.error(stdio.stderr); } })
 *   .then(function(result){ // do other stuff })
 *
 * @param   {String}   cmd       A command to spawn
 * @param   {String[]} [args=[]]  An array of arguments, passed to spawned
 *   process
 * @param   {Object}   [opts={}]  A configuration object
 * @param   {String|String[]|Object} opts.stdio Property that configures how
 *   spawned process' stdio will behave. Has the same meaning and possible
 *   values as 'stdio' options for child_process.spawn method
 *   (https://nodejs.org/api/child_process.html#child_process_options_stdio).
 * @param {Object}     [env={}]  A map of extra environment variables
 * @param {String}     [cwd=process.cwd()]  Working directory for the command
 * @param {Boolean}    [chmod=false]  If truthy, will attempt to set the execute
 *   bit before executing on non-Windows platforms
 *
 * @return  {Promise}        A promise that is either fulfilled if the spawned
 *   process is exited with zero error code or rejected otherwise. If the
 *   'stdio' option set to 'default' or 'pipe', the promise also emits progress
 *   messages with the following contents:
 *   {
 *       'stdout': ...,
 *       'stderr': ...
 *   }
 */
exports.spawn = function (cmd, args, opts) {
    args = args || [];
    opts = opts || {};
    var spawnOpts = {};
    var d = Q.defer();

    if (opts.stdio !== 'default') {
        // Ignore 'default' value for stdio because it corresponds to child_process's default 'pipe' option
        spawnOpts.stdio = opts.stdio;
    }

    if (opts.cwd) {
        spawnOpts.cwd = opts.cwd;
    }

    if (opts.env) {
        spawnOpts.env = _.extend(_.extend({}, process.env), opts.env);
    }

    if (opts.chmod && !iswin32) {
        try {
            // This fails when module is installed in a system directory (e.g. via sudo npm install)
            fs.chmodSync(cmd, '755');
        } catch (e) {
            // If the perms weren't set right, then this will come as an error upon execution.
        }
    }

    events.emit(opts.printCommand ? 'log' : 'verbose', 'Running command: ' + cmd + ' ' + args.join(' '));

    // At least until Node.js 8, child_process.spawn will throw exceptions
    // instead of emitting error events in certain cases (like EACCES), Thus we
    // have to wrap the execution in try/catch to convert them into rejections.
    try {
        var child = crossSpawn.spawn(cmd, args, spawnOpts);
    } catch (e) {
        whenDone(e);
        return d.promise;
    }
    var capturedOut = '';
    var capturedErr = '';

    if (child.stdout) {
        child.stdout.setEncoding('utf8');
        child.stdout.on('data', function (data) {
            capturedOut += data;
            d.notify({ stdout: data });
        });
    }

    if (child.stderr) {
        child.stderr.setEncoding('utf8');
        child.stderr.on('data', function (data) {
            capturedErr += data;
            d.notify({ stderr: data });
        });
    }

    child.on('close', whenDone);
    child.on('error', whenDone);
    function whenDone (arg) {
        if (child) {
            child.removeListener('close', whenDone);
            child.removeListener('error', whenDone);
        }
        var code = typeof arg === 'number' ? arg : arg && arg.code;

        events.emit('verbose', 'Command finished with error code ' + code + ': ' + cmd + ' ' + args);
        if (code === 0) {
            d.resolve(capturedOut.trim());
        } else {
            var errMsg = cmd + ': Command failed with exit code ' + code;
            if (capturedErr) {
                errMsg += ' Error output:\n' + capturedErr.trim();
            }
            var err = new Error(errMsg);
            if (capturedErr) {
                err.stderr = capturedErr;
            }
            if (capturedOut) {
                err.stdout = capturedOut;
            }
            err.code = code;
            d.reject(err);
        }
    }

    return d.promise;
};

exports.maybeSpawn = function (cmd, args, opts) {
    if (fs.existsSync(cmd)) {
        return exports.spawn(cmd, args, opts);
    }
    return Q(null);
};
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
*/

module.exports = function addProperty (module, property, modulePath, obj) {
    obj = obj || module.exports;
    // Add properties as getter to delay load the modules on first invocation
    Object.defineProperty(obj, property, {
        configurable: true,
        get: function () {
            var delayLoadedModule = module.require(modulePath);
            obj[property] = delayLoadedModule;
            return delayLoadedModule;
        }
    });
};
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
*/

const CordovaError = require('../CordovaError/CordovaError');

/**
 * Formats an error for logging.
 *
 * @param {Error} error - The error to be formatted.
 * @param {boolean} isVerbose - Whether the include additional debugging
 *   information when formatting the error.
 *
 * @returns {string} The formatted error message.
 */
module.exports = function formatError (error, isVerbose) {
    var message = '';

    if (error instanceof CordovaError) {
        message = error.toString(isVerbose);
    } else if (error instanceof Error) {
        if (isVerbose) {
            message = error.stack;
        } else {
            message = error.message;
        }
    } else {
        // Plain text error message
        message = error;
    }

    if (typeof message === 'string' && !message.toUpperCase().startsWith('ERROR:')) {
        // Needed for backward compatibility with external tools
        message = 'Error: ' + message;
    }

    return message;
};
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

// contains PLIST utility functions
var __ = require('underscore');
var plist = require('plist');

// adds node to doc at selector
module.exports.graftPLIST = graftPLIST;
function graftPLIST (doc, xml, selector) {
    var obj = plist.parse('<plist>' + xml + '</plist>');

    var node = doc[selector];
    if (node && Array.isArray(node) && Array.isArray(obj)) {
        node = node.concat(obj);
        for (var i = 0; i < node.length; i++) {
            for (var j = i + 1; j < node.length; ++j) {
                if (nodeEqual(node[i], node[j])) { node.splice(j--, 1); }
            }
        }
        doc[selector] = node;
    } else {
        // plist uses objects for <dict>. If we have two dicts we merge them instead of
        // overriding the old one. See CB-6472
        if (node && __.isObject(node) && __.isObject(obj) && !__.isDate(node) && !__.isDate(obj)) { // arrays checked above
            __.extend(obj, node);
        }
        doc[selector] = obj;
    }

    return true;
}

// removes node from doc at selector
module.exports.prunePLIST = prunePLIST;
function prunePLIST (doc, xml, selector) {
    var obj = plist.parse('<plist>' + xml + '</plist>');

    pruneOBJECT(doc, selector, obj);

    return true;
}

function pruneOBJECT (doc, selector, fragment) {
    if (Array.isArray(fragment) && Array.isArray(doc[selector])) {
        var empty = true;
        for (var i in fragment) {
            for (var j in doc[selector]) {
                empty = pruneOBJECT(doc[selector], j, fragment[i]) && empty;
            }
        }
        if (empty) {
            delete doc[selector];
            return true;
        }
    } else if (nodeEqual(doc[selector], fragment)) {
        delete doc[selector];
        return true;
    }

    return false;
}

function nodeEqual (node1, node2) {
    if (typeof node1 !== typeof node2) { return false; } else if (typeof node1 === 'string') {
        node2 = escapeRE(node2).replace(/\\\$\(\S+\)/gm, '(.*?)');
        return new RegExp('^' + node2 + '$').test(node1);
    } else {
        for (var key in node2) {
            if (!nodeEqual(node1[key], node2[key])) return false;
        }
        return true;
    }
}

// escape string for use in regex
function escapeRE (str) {
    return str.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&');
}
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

/**
 * contains XML utility functions, some of which are specific to elementtree
 */

var fs = require('fs-extra');
var path = require('path');
var _ = require('underscore');
var et = require('elementtree');
var stripBom = require('strip-bom');

var ROOT = /^\/([^/]*)/;
var ABSOLUTE = /^\/([^/]*)\/(.*)/;

module.exports = {
    // compare two et.XML nodes, see if they match
    // compares tagName, text, attributes and children (recursively)
    equalNodes: function (one, two) {
        if (one.tag !== two.tag) {
            return false;
        } else if (one.text.trim() !== two.text.trim()) {
            return false;
        } else if (one._children.length !== two._children.length) {
            return false;
        }

        if (!attribMatch(one, two)) return false;

        for (var i = 0; i < one._children.length; i++) {
            if (!module.exports.equalNodes(one._children[i], two._children[i])) {
                return false;
            }
        }

        return true;
    },

    // adds node to doc at selector, creating parent if it doesn't exist
    graftXML: function (doc, nodes, selector, after) {
        var parent = module.exports.resolveParent(doc, selector);
        if (!parent) {
            // Try to create the parent recursively if necessary
            try {
                var parentToCreate = et.XML('<' + path.basename(selector) + '/>');
                var parentSelector = path.dirname(selector);

                this.graftXML(doc, [parentToCreate], parentSelector);
            } catch (e) {
                return false;
            }
            parent = module.exports.resolveParent(doc, selector);
            if (!parent) return false;
        }

        nodes.forEach(function (node) {
            // check if child is unique first
            if (uniqueChild(node, parent)) {
                var children = parent.getchildren();
                var insertIdx = after ? findInsertIdx(children, after) : children.length;

                // TODO: replace with parent.insert after the bug in ElementTree is fixed
                parent.getchildren().splice(insertIdx, 0, node);
            }
        });

        return true;
    },

    // adds new attributes to doc at selector
    // Will only merge if attribute has not been modified already or --force is used
    graftXMLMerge: function (doc, nodes, selector, xml) {
        var target = module.exports.resolveParent(doc, selector);
        if (!target) return false;

        // saves the attributes of the original xml before making changes
        xml.oldAttrib = _.extend({}, target.attrib);

        nodes.forEach(function (node) {
            var attributes = node.attrib;
            for (var attribute in attributes) {
                target.attrib[attribute] = node.attrib[attribute];
            }
        });

        return true;
    },

    // overwrite all attributes to doc at selector with new attributes
    // Will only overwrite if attribute has not been modified already or --force is used
    graftXMLOverwrite: function (doc, nodes, selector, xml) {
        var target = module.exports.resolveParent(doc, selector);
        if (!target) return false;

        // saves the attributes of the original xml before making changes
        xml.oldAttrib = _.extend({}, target.attrib);

        // remove old attributes from target
        var targetAttributes = target.attrib;
        for (var targetAttribute in targetAttributes) {
            delete targetAttributes[targetAttribute];
        }

        // add new attributes to target
        nodes.forEach(function (node) {
            var attributes = node.attrib;
            for (var attribute in attributes) {
                target.attrib[attribute] = node.attrib[attribute];
            }
        });

        return true;
    },

    // removes node from doc at selector
    pruneXML: function (doc, nodes, selector) {
        var parent = module.exports.resolveParent(doc, selector);
        if (!parent) return false;

        nodes.forEach(function (node) {
            var matchingKid = findChild(node, parent);
            if (matchingKid !== undefined) {
                // stupid elementtree takes an index argument it doesn't use
                // and does not conform to the python lib
                parent.remove(matchingKid);
            }
        });

        return true;
    },

    // restores attributes from doc at selector
    pruneXMLRestore: function (doc, selector, xml) {
        var target = module.exports.resolveParent(doc, selector);
        if (!target) return false;

        if (xml.oldAttrib) {
            target.attrib = _.extend({}, xml.oldAttrib);
        }

        return true;
    },

    pruneXMLRemove: function (doc, selector, nodes) {
        var target = module.exports.resolveParent(doc, selector);
        if (!target) return false;

        nodes.forEach(function (node) {
            var attributes = node.attrib;
            for (var attribute in attributes) {
                if (target.attrib[attribute]) {
                    delete target.attrib[attribute];
                }
            }
        });

        return true;
    },

    parseElementtreeSync: function (filename) {
        var contents = stripBom(fs.readFileSync(filename, 'utf-8'));
        return new et.ElementTree(et.XML(contents));
    },

    resolveParent: function (doc, selector) {
        var parent, tagName, subSelector;

        // handle absolute selector (which elementtree doesn't like)
        if (ROOT.test(selector)) {
            tagName = selector.match(ROOT)[1];
            // test for wildcard "any-tag" root selector
            if (tagName === '*' || tagName === doc._root.tag) {
                parent = doc._root;

                // could be an absolute path, but not selecting the root
                if (ABSOLUTE.test(selector)) {
                    subSelector = selector.match(ABSOLUTE)[2];
                    parent = parent.find(subSelector);
                }
            } else {
                return false;
            }
        } else {
            parent = doc.find(selector);
        }
        return parent;
    }
};

function findChild (node, parent) {
    const matches = parent.findall(node.tag);
    return matches.find(m => module.exports.equalNodes(node, m));
}

function uniqueChild (node, parent) {
    return !findChild(node, parent);
}

// Find the index at which to insert an entry. After is a ;-separated priority list
// of tags after which the insertion should be made. E.g. If we need to
// insert an element C, and the rule is that the order of children has to be
// As, Bs, Cs. After will be equal to "C;B;A".
function findInsertIdx (children, after) {
    var childrenTags = children.map(function (child) { return child.tag; });
    var afters = after.split(';');
    var afterIndexes = afters.map(function (current) { return childrenTags.lastIndexOf(current); });
    var foundIndex = _.find(afterIndexes, function (index) { return index !== -1; });

    // add to the beginning if no matching nodes are found
    return typeof foundIndex === 'undefined' ? 0 : foundIndex + 1;
}

var BLACKLIST = ['platform', 'feature', 'plugin', 'engine'];
var SINGLETONS = ['content', 'author', 'name'];
function mergeXml (src, dest, platform, clobber) {
    // Do nothing for blacklisted tags.
    if (BLACKLIST.includes(src.tag)) return;

    // Handle attributes
    Object.getOwnPropertyNames(src.attrib).forEach(function (attribute) {
        if (clobber || !dest.attrib[attribute]) {
            dest.attrib[attribute] = src.attrib[attribute];
        }
    });
    // Handle text
    if (src.text && (clobber || !dest.text)) {
        dest.text = src.text;
    }
    // Handle children
    src.getchildren().forEach(mergeChild);

    // Handle platform
    if (platform) {
        src.findall('platform[@name="' + platform + '"]').forEach(function (platformElement) {
            platformElement.getchildren().forEach(mergeChild);
        });
    }

    // Handle duplicate preference tags (by name attribute)
    removeDuplicatePreferences(dest);

    function mergeChild (srcChild) {
        var srcTag = srcChild.tag;
        var destChild = new et.Element(srcTag);
        var foundChild;
        var query = srcTag + '';
        var shouldMerge = true;

        if (BLACKLIST.includes(srcTag)) return;

        if (SINGLETONS.includes(srcTag)) {
            foundChild = dest.find(query);
            if (foundChild) {
                destChild = foundChild;
                dest.remove(destChild);
            }
        } else {
            // Check for an exact match and if you find one don't add
            var mergeCandidates = dest.findall(query)
                .filter(function (foundChild) {
                    return foundChild && textMatch(srcChild, foundChild) && attribMatch(srcChild, foundChild);
                });

            if (mergeCandidates.length > 0) {
                destChild = mergeCandidates[0];
                dest.remove(destChild);
                shouldMerge = false;
            }
        }

        mergeXml(srcChild, destChild, platform, clobber && shouldMerge);
        dest.append(destChild);
    }

    function removeDuplicatePreferences (xml) {
        // reduce preference tags to a hashtable to remove dupes
        var prefHash = xml.findall('preference[@name][@value]').reduce(function (previousValue, currentValue) {
            previousValue[currentValue.attrib.name] = currentValue.attrib.value;
            return previousValue;
        }, {});

        // remove all preferences
        xml.findall('preference[@name][@value]').forEach(function (pref) {
            xml.remove(pref);
        });

        // write new preferences
        Object.keys(prefHash).forEach(function (key) {
            var element = et.SubElement(xml, 'preference');
            element.set('name', key);
            element.set('value', this[key]);
        }, prefHash);
    }
}

// Expose for testing.
module.exports.mergeXml = mergeXml;

function textMatch (elm1, elm2) {
    var text1 = elm1.text ? elm1.text.replace(/\s+/, '') : '';
    var text2 = elm2.text ? elm2.text.replace(/\s+/, '') : '';
    return (text1 === '' || text1 === text2);
}

function attribMatch (one, two) {
    var oneAttribKeys = Object.keys(one.attrib);
    var twoAttribKeys = Object.keys(two.attrib);

    if (oneAttribKeys.length !== twoAttribKeys.length) {
        return false;
    }

    for (var i = 0; i < oneAttribKeys.length; i++) {
        var attribName = oneAttribKeys[i];

        if (one.attrib[attribName] !== two.attrib[attribName]) {
            return false;
        }
    }

    return true;
}
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

/*
A class for holidng the information currently stored in plugin.xml
It should also be able to answer questions like whether the plugin
is compatible with a given engine version.

TODO (kamrik): refactor this to not use sync functions and return promises.
*/

var path = require('path');
var fs = require('fs-extra');
var xml_helpers = require('../util/xml-helpers');
var CordovaError = require('../CordovaError/CordovaError');

function PluginInfo (dirname) {
    var self = this;

    // METHODS
    // Defined inside the constructor to avoid the "this" binding problems.

    // <preference> tag
    // Example: <preference name="API_KEY" />
    // Used to require a variable to be specified via --variable when installing the plugin.
    // returns { key : default | null}
    self.getPreferences = getPreferences;
    function getPreferences (platform) {
        return _getTags(self._et, 'preference', platform, _parsePreference)
            .reduce(function (preferences, pref) {
                preferences[pref.preference] = pref.default;
                return preferences;
            }, {});
    }

    function _parsePreference (prefTag) {
        var name = prefTag.attrib.name.toUpperCase();
        var def = prefTag.attrib.default || null;
        return { preference: name, default: def };
    }

    // <asset>
    self.getAssets = getAssets;
    function getAssets (platform) {
        var assets = _getTags(self._et, 'asset', platform, _parseAsset);
        return assets;
    }

    function _parseAsset (tag) {
        var src = tag.attrib.src;
        var target = tag.attrib.target;

        if (!src || !target) {
            var msg =
                'Malformed <asset> tag. Both "src" and "target" attributes' +
                'must be specified in\n' +
                self.filepath
                ;
            throw new Error(msg);
        }

        var asset = {
            itemType: 'asset',
            src: src,
            target: target
        };
        return asset;
    }

    // <dependency>
    // Example:
    // <dependency id="com.plugin.id"
    //     url="https://github.com/myuser/someplugin"
    //     commit="428931ada3891801"
    //     subdir="some/path/here" />
    self.getDependencies = getDependencies;
    function getDependencies (platform) {
        var deps = _getTags(
            self._et,
            'dependency',
            platform,
            _parseDependency
        );
        return deps;
    }

    function _parseDependency (tag) {
        var dep =
            { id: tag.attrib.id,
                version: tag.attrib.version || '',
                url: tag.attrib.url || '',
                subdir: tag.attrib.subdir || '',
                commit: tag.attrib.commit
            };

        dep.git_ref = dep.commit;

        if (!dep.id) {
            var msg =
                '<dependency> tag is missing id attribute in ' +
                self.filepath
                ;
            throw new CordovaError(msg);
        }
        return dep;
    }

    // <config-file> tag
    self.getConfigFiles = getConfigFiles;
    function getConfigFiles (platform) {
        var configFiles = _getTags(self._et, 'config-file', platform, _parseConfigFile);
        return configFiles;
    }

    function _parseConfigFile (tag) {
        var configFile =
            { target: tag.attrib['target'],
                parent: tag.attrib['parent'],
                after: tag.attrib['after'],
                xmls: tag.getchildren(),
                // To support demuxing via versions
                versions: tag.attrib['versions'],
                deviceTarget: tag.attrib['device-target']
            };
        return configFile;
    }

    self.getEditConfigs = getEditConfigs;
    function getEditConfigs (platform) {
        var editConfigs = _getTags(self._et, 'edit-config', platform, _parseEditConfigs);
        return editConfigs;
    }

    function _parseEditConfigs (tag) {
        var editConfig =
            { file: tag.attrib['file'],
                target: tag.attrib['target'],
                mode: tag.attrib['mode'],
                xmls: tag.getchildren()
            };
        return editConfig;
    }

    // <info> tags, both global and within a <platform>
    // TODO (kamrik): Do we ever use <info> under <platform>? Example wanted.
    self.getInfo = getInfo;
    function getInfo (platform) {
        var infos = _getTags(
            self._et,
            'info',
            platform,
            function (elem) { return elem.text; }
        );
        // Filter out any undefined or empty strings.
        infos = infos.filter(Boolean);
        return infos;
    }

    // <source-file>
    // Examples:
    // <source-file src="src/ios/someLib.a" framework="true" />
    // <source-file src="src/ios/someLib.a" compiler-flags="-fno-objc-arc" />
    self.getSourceFiles = getSourceFiles;
    function getSourceFiles (platform) {
        var sourceFiles = _getTagsInPlatform(self._et, 'source-file', platform, _parseSourceFile);
        return sourceFiles;
    }

    function _parseSourceFile (tag) {
        return {
            itemType: 'source-file',
            src: tag.attrib.src,
            framework: isStrTrue(tag.attrib.framework),
            weak: isStrTrue(tag.attrib.weak),
            compilerFlags: tag.attrib['compiler-flags'],
            targetDir: tag.attrib['target-dir']
        };
    }

    // <header-file>
    // Example:
    // <header-file src="CDVFoo.h" />
    self.getHeaderFiles = getHeaderFiles;
    function getHeaderFiles (platform) {
        var headerFiles = _getTagsInPlatform(self._et, 'header-file', platform, function (tag) {
            return {
                itemType: 'header-file',
                src: tag.attrib.src,
                targetDir: tag.attrib['target-dir'],
                type: tag.attrib['type']
            };
        });
        return headerFiles;
    }

    // <resource-file>
    // Example:
    // <resource-file src="FooPluginStrings.xml" target="res/values/FooPluginStrings.xml" device-target="win" arch="x86" versions="&gt;=8.1" />
    self.getResourceFiles = getResourceFiles;
    function getResourceFiles (platform) {
        var resourceFiles = _getTagsInPlatform(self._et, 'resource-file', platform, function (tag) {
            return {
                itemType: 'resource-file',
                src: tag.attrib.src,
                target: tag.attrib.target,
                versions: tag.attrib.versions,
                deviceTarget: tag.attrib['device-target'],
                arch: tag.attrib.arch,
                reference: tag.attrib.reference
            };
        });
        return resourceFiles;
    }

    // <lib-file>
    // Example:
    // <lib-file src="src/BlackBerry10/native/device/libfoo.so" arch="device" />
    self.getLibFiles = getLibFiles;
    function getLibFiles (platform) {
        var libFiles = _getTagsInPlatform(self._et, 'lib-file', platform, function (tag) {
            return {
                itemType: 'lib-file',
                src: tag.attrib.src,
                arch: tag.attrib.arch,
                Include: tag.attrib.Include,
                versions: tag.attrib.versions,
                deviceTarget: tag.attrib['device-target'] || tag.attrib.target
            };
        });
        return libFiles;
    }

    // <podspec>
    // Example:
    // <podspec>
    //   <config>
    //     <source url="https://github.com/brightcove/BrightcoveSpecs.git" />
    //     <source url="https://github.com/CocoaPods/Specs.git"/>
    //   </config>
    //   <pods use-frameworks="true" inhibit-all-warnings="true">
    //     <pod name="PromiseKit" />
    //     <pod name="Foobar1" spec="~> 2.0.0" />
    //     <pod name="Foobar2" git="git@github.com:hoge/foobar1.git" />
    //     <pod name="Foobar3" git="git@github.com:hoge/foobar2.git" branch="next" />
    //     <pod name="Foobar4" swift-version="4.1" />
    //     <pod name="Foobar5" swift-version="3.0" />
    //   </pods>
    // </podspec>
    self.getPodSpecs = getPodSpecs;
    function getPodSpecs (platform) {
        var podSpecs = _getTagsInPlatform(self._et, 'podspec', platform, function (tag) {
            var declarations = null;
            var sources = null;
            var libraries = null;
            var config = tag.find('config');
            var pods = tag.find('pods');
            if (config != null) {
                sources = config.findall('source').map(function (t) {
                    return {
                        url: t.attrib.url
                    };
                }).reduce(function (acc, val) {
                    return Object.assign({}, acc, { [val.url]: { source: val.url } });
                }, {});
            }
            if (pods != null) {
                declarations = Object.keys(pods.attrib).reduce(function (acc, key) {
                    return pods.attrib[key] === undefined ? acc : Object.assign({}, acc, { [key]: pods.attrib[key] });
                }, {});
                libraries = pods.findall('pod').map(function (t) {
                    return Object.keys(t.attrib).reduce(function (acc, key) {
                        return t.attrib[key] === undefined ? acc : Object.assign({}, acc, { [key]: t.attrib[key] });
                    }, {});
                }).reduce(function (acc, val) {
                    return Object.assign({}, acc, { [val.name]: val });
                }, {});
            }
            return {
                declarations: declarations,
                sources: sources,
                libraries: libraries
            };
        });
        return podSpecs;
    }

    // <hook>
    // Example:
    // <hook type="before_build" src="scripts/beforeBuild.js" />
    self.getHookScripts = getHookScripts;
    function getHookScripts (hook, platforms) {
        var scriptElements = self._et.findall('./hook');

        if (platforms) {
            platforms.forEach(function (platform) {
                scriptElements = scriptElements.concat(self._et.findall('./platform[@name="' + platform + '"]/hook'));
            });
        }

        function filterScriptByHookType (el) {
            return el.attrib.src && el.attrib.type && el.attrib.type.toLowerCase() === hook;
        }

        return scriptElements.filter(filterScriptByHookType);
    }

    self.getJsModules = getJsModules;
    function getJsModules (platform) {
        var modules = _getTags(self._et, 'js-module', platform, _parseJsModule);
        return modules;
    }

    function _parseJsModule (tag) {
        var ret = {
            itemType: 'js-module',
            name: tag.attrib.name,
            src: tag.attrib.src,
            clobbers: tag.findall('clobbers').map(function (tag) { return { target: tag.attrib.target }; }),
            merges: tag.findall('merges').map(function (tag) { return { target: tag.attrib.target }; }),
            runs: tag.findall('runs').length > 0
        };

        return ret;
    }

    self.getEngines = function () {
        return self._et.findall('engines/engine').map(function (n) {
            return {
                name: n.attrib.name,
                version: n.attrib.version,
                platform: n.attrib.platform,
                scriptSrc: n.attrib.scriptSrc
            };
        });
    };

    self.getPlatforms = function () {
        return self._et.findall('platform').map(function (n) {
            return { name: n.attrib.name };
        });
    };

    self.getPlatformsArray = function () {
        return self._et.findall('platform').map(function (n) {
            return n.attrib.name;
        });
    };

    self.getFrameworks = function (platform, options) {
        return _getTags(self._et, 'framework', platform, function (el) {
            var src = el.attrib.src;
            if (options) {
                var vars = options.cli_variables || {};

                if (Object.keys(vars).length === 0) {
                    // get variable defaults from plugin.xml for removal
                    vars = self.getPreferences(platform);
                }
                var regExp;
                // Iterate over plugin variables.
                // Replace them in framework src if they exist
                Object.keys(vars).forEach(function (name) {
                    if (vars[name]) {
                        regExp = new RegExp('\\$' + name, 'g');
                        src = src.replace(regExp, vars[name]);
                    }
                });
            }
            var ret = {
                itemType: 'framework',
                type: el.attrib.type,
                parent: el.attrib.parent,
                custom: isStrTrue(el.attrib.custom),
                embed: isStrTrue(el.attrib.embed),
                src: src,
                spec: el.attrib.spec,
                weak: isStrTrue(el.attrib.weak),
                versions: el.attrib.versions,
                targetDir: el.attrib['target-dir'],
                deviceTarget: el.attrib['device-target'] || el.attrib.target,
                arch: el.attrib.arch,
                implementation: el.attrib.implementation
            };
            return ret;
        });
    };

    self.getFilesAndFrameworks = getFilesAndFrameworks;
    function getFilesAndFrameworks (platform, options) {
        // Please avoid changing the order of the calls below, files will be
        // installed in this order.
        var items = [].concat(
            self.getSourceFiles(platform),
            self.getHeaderFiles(platform),
            self.getResourceFiles(platform),
            self.getFrameworks(platform, options),
            self.getLibFiles(platform)
        );
        return items;
    }
    /// // End of PluginInfo methods /////

    /// // PluginInfo Constructor logic  /////
    self.filepath = path.join(dirname, 'plugin.xml');
    if (!fs.existsSync(self.filepath)) {
        throw new CordovaError('Cannot find plugin.xml for plugin "' + path.basename(dirname) + '". Please try adding it again.');
    }

    self.dir = dirname;
    var et = self._et = xml_helpers.parseElementtreeSync(self.filepath);
    var pelem = et.getroot();
    self.id = pelem.attrib.id;
    self.version = pelem.attrib.version;

    // Optional fields
    self.name = pelem.findtext('name');
    self.description = pelem.findtext('description');
    self.license = pelem.findtext('license');
    self.repo = pelem.findtext('repo');
    self.issue = pelem.findtext('issue');
    self.keywords = pelem.findtext('keywords');
    self.info = pelem.findtext('info');
    if (self.keywords) {
        self.keywords = self.keywords.split(',').map(function (s) { return s.trim(); });
    }
    self.getKeywordsAndPlatforms = function () {
        var ret = self.keywords || [];
        return ret.concat('ecosystem:cordova').concat(addCordova(self.getPlatformsArray()));
    };
} // End of PluginInfo constructor.

// Helper function used to prefix every element of an array with cordova-
// Useful when we want to modify platforms to be cordova-platform
function addCordova (someArray) {
    var newArray = someArray.map(function (element) {
        return 'cordova-' + element;
    });
    return newArray;
}

// Helper function used by most of the getSomething methods of PluginInfo.
// Get all elements of a given name. Both in root and in platform sections
// for the given platform. If transform is given and is a function, it is
// applied to each element.
function _getTags (pelem, tag, platform, transform) {
    var platformTag = pelem.find('./platform[@name="' + platform + '"]');
    var tagsInRoot = pelem.findall(tag);
    tagsInRoot = tagsInRoot || [];
    var tagsInPlatform = platformTag ? platformTag.findall(tag) : [];
    var tags = tagsInRoot.concat(tagsInPlatform);
    if (typeof transform === 'function') {
        tags = tags.map(transform);
    }
    return tags;
}

// Same as _getTags() but only looks inside a platform section.
function _getTagsInPlatform (pelem, tag, platform, transform) {
    var platformTag = pelem.find('./platform[@name="' + platform + '"]');
    var tags = platformTag ? platformTag.findall(tag) : [];
    if (typeof transform === 'function') {
        tags = tags.map(transform);
    }
    return tags;
}

// Check if x is a string 'true'.
function isStrTrue (x) {
    return String(x).toLowerCase() === 'true';
}

module.exports = PluginInfo;
// Backwards compat:
PluginInfo.PluginInfo = PluginInfo;
PluginInfo.loadPluginsDir = function (dir) {
    var PluginInfoProvider = require('./PluginInfoProvider');
    return new PluginInfoProvider().getAllWithinSearchPath(dir);
};
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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 sub:true, laxcomma:true, laxbreak:true */

var fs = require('fs-extra');
var path = require('path');
var PluginInfo = require('./PluginInfo');
var events = require('../events');

function PluginInfoProvider () {
    this._cache = {};
    this._getAllCache = {};
}

PluginInfoProvider.prototype.get = function (dirName) {
    var absPath = path.resolve(dirName);
    if (!this._cache[absPath]) {
        this._cache[absPath] = new PluginInfo(dirName);
    }
    return this._cache[absPath];
};

// Normally you don't need to put() entries, but it's used
// when copying plugins, and in unit tests.
PluginInfoProvider.prototype.put = function (pluginInfo) {
    var absPath = path.resolve(pluginInfo.dir);
    this._cache[absPath] = pluginInfo;
};

// Used for plugin search path processing.
// Given a dir containing multiple plugins, create a PluginInfo object for
// each of them and return as array.
// Should load them all in parallel and return a promise, but not yet.
PluginInfoProvider.prototype.getAllWithinSearchPath = function (dirName) {
    var absPath = path.resolve(dirName);
    if (!this._getAllCache[absPath]) {
        this._getAllCache[absPath] = getAllHelper(absPath, this);
    }
    return this._getAllCache[absPath];
};

function getAllHelper (absPath, provider) {
    if (!fs.existsSync(absPath)) {
        return [];
    }
    // If dir itself is a plugin, return it in an array with one element.
    if (fs.existsSync(path.join(absPath, 'plugin.xml'))) {
        return [provider.get(absPath)];
    }
    var subdirs = fs.readdirSync(absPath);
    var plugins = [];
    subdirs.forEach(function (subdir) {
        var d = path.join(absPath, subdir);
        if (fs.existsSync(path.join(d, 'plugin.xml'))) {
            try {
                plugins.push(provider.get(d));
            } catch (e) {
                events.emit('warn', 'Error parsing ' + path.join(d, 'plugin.xml.\n' + e.stack));
            }
        }
    });
    return plugins;
}

module.exports = PluginInfoProvider;
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

var EOL = require('os').EOL;

/**
 * A derived exception class. See usage example in cli.js
 * Based on:
 * stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/8460753#8460753
 * @param {String} message Error message
 * @param {Number} [code=0] Error code
 * @param {CordovaExternalToolErrorContext} [context] External tool error context object
 * @constructor
 */
function CordovaError (message, code, context) {
    Error.captureStackTrace(this, this.constructor);
    this.name = this.constructor.name;
    this.message = message;
    this.code = code || CordovaError.UNKNOWN_ERROR;
    this.context = context;
}

// FIXME __proto__ property has been deprecated as of ECMAScript 3.1
// eslint-disable-next-line no-proto
CordovaError.prototype.__proto__ = Error.prototype;

// TODO: Extend error codes according the projects specifics
CordovaError.UNKNOWN_ERROR = 0;
CordovaError.EXTERNAL_TOOL_ERROR = 1;

/**
 * Translates instance's error code number into error code name, e.g. 0 -> UNKNOWN_ERROR
 * @returns {string} Error code string name
 */
CordovaError.prototype.getErrorCodeName = function () {
    for (const key of Object.keys(CordovaError)) {
        if (CordovaError[key] === this.code) {
            return key;
        }
    }
};

/**
 * Converts CordovaError instance to string representation
 * @param   {Boolean}  [isVerbose]  Set up verbose mode. Used to provide more
 *   details including information about error code name and context
 * @return  {String}              Stringified error representation
 */
CordovaError.prototype.toString = function (isVerbose) {
    var message = '';
    var codePrefix = '';

    if (this.code !== CordovaError.UNKNOWN_ERROR) {
        codePrefix = 'code: ' + this.code + (isVerbose ? (' (' + this.getErrorCodeName() + ')') : '') + ' ';
    }

    if (this.code === CordovaError.EXTERNAL_TOOL_ERROR) {
        if (typeof this.context !== 'undefined') {
            if (isVerbose) {
                message = codePrefix + EOL + this.context.toString(isVerbose) + '\n failed with an error: ' +
                    this.message + EOL + 'Stack trace: ' + this.stack;
            } else {
                message = codePrefix + '\'' + this.context.toString(isVerbose) + '\' ' + this.message;
            }
        } else {
            message = 'External tool failed with an error: ' + this.message;
        }
    } else {
        message = isVerbose ? codePrefix + this.stack : codePrefix + this.message;
    }

    return message;
};

module.exports = CordovaError;
/**
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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 proto:true */

var path = require('path');

/**
 * @param {String} cmd Command full path
 * @param {String[]} args Command args
 * @param {String} [cwd] Command working directory
 * @constructor
 */
function CordovaExternalToolErrorContext (cmd, args, cwd) {
    this.cmd = cmd;
    // Helper field for readability
    this.cmdShortName = path.basename(cmd);
    this.args = args;
    this.cwd = cwd;
}

CordovaExternalToolErrorContext.prototype.toString = function (isVerbose) {
    if (isVerbose) {
        return 'External tool \'' + this.cmdShortName + '\'' +
            '\nCommand full path: ' + this.cmd + '\nCommand args: ' + this.args +
            (typeof this.cwd !== 'undefined' ? '\nCommand cwd: ' + this.cwd : '');
    }

    return this.cmdShortName;
};

module.exports = CordovaExternalToolErrorContext;
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

var et = require('elementtree');
var xml = require('../util/xml-helpers');
var CordovaError = require('../CordovaError/CordovaError');
var fs = require('fs-extra');
var events = require('../events');

/** Wraps a config.xml file */
function ConfigParser (path) {
    this.path = path;
    try {
        this.doc = xml.parseElementtreeSync(path);
        this.cdvNamespacePrefix = getCordovaNamespacePrefix(this.doc);
        et.register_namespace(this.cdvNamespacePrefix, 'http://cordova.apache.org/ns/1.0');
    } catch (e) {
        events.emit('error', 'Parsing ' + path + ' failed');
        throw e;
    }
    var r = this.doc.getroot();
    if (r.tag !== 'widget') {
        throw new CordovaError(path + ' has incorrect root node name (expected "widget", was "' + r.tag + '")');
    }
}

function getNodeTextSafe (el) {
    return el && el.text && el.text.trim();
}

function findOrCreate (doc, name) {
    var ret = doc.find(name);
    if (!ret) {
        ret = new et.Element(name);
        doc.getroot().append(ret);
    }
    return ret;
}

function getCordovaNamespacePrefix (doc) {
    var rootAtribs = Object.getOwnPropertyNames(doc.getroot().attrib);
    var prefix = 'cdv';
    for (var j = 0; j < rootAtribs.length; j++) {
        if (rootAtribs[j].startsWith('xmlns:') &&
            doc.getroot().attrib[rootAtribs[j]] === 'http://cordova.apache.org/ns/1.0') {
            var strings = rootAtribs[j].split(':');
            prefix = strings[1];
            break;
        }
    }
    return prefix;
}

/**
 * Finds the value of an element's attribute
 * @param  {String} attributeName Name of the attribute to search for
 * @param  {Array}  elems         An array of ElementTree nodes
 * @return {String}
 */
function findElementAttributeValue (attributeName, elems) {
    elems = Array.isArray(elems) ? elems : [elems];

    var value = elems.filter(function (elem) {
        return elem.attrib.name.toLowerCase() === attributeName.toLowerCase();
    }).map(function (filteredElems) {
        return filteredElems.attrib.value;
    }).pop();

    return value || '';
}

function removeChildren (el, selector) {
    const matches = el.findall(selector);
    matches.forEach(child => el.remove(child));
}

ConfigParser.prototype = {
    getAttribute: function (attr) {
        return this.doc.getroot().attrib[attr];
    },

    packageName: function () {
        return this.getAttribute('id');
    },
    setPackageName: function (id) {
        this.doc.getroot().attrib['id'] = id;
    },
    android_packageName: function () {
        return this.getAttribute('android-packageName');
    },
    android_activityName: function () {
        return this.getAttribute('android-activityName');
    },
    ios_CFBundleIdentifier: function () {
        return this.getAttribute('ios-CFBundleIdentifier');
    },
    name: function () {
        return getNodeTextSafe(this.doc.find('name'));
    },
    setName: function (name) {
        var el = findOrCreate(this.doc, 'name');
        el.text = name;
    },
    shortName: function () {
        return this.doc.find('name').attrib['short'] || this.name();
    },
    setShortName: function (shortname) {
        var el = findOrCreate(this.doc, 'name');
        if (!el.text) {
            el.text = shortname;
        }
        el.attrib['short'] = shortname;
    },
    description: function () {
        return getNodeTextSafe(this.doc.find('description'));
    },
    setDescription: function (text) {
        var el = findOrCreate(this.doc, 'description');
        el.text = text;
    },
    version: function () {
        return this.getAttribute('version');
    },
    windows_packageVersion: function () {
        return this.getAttribute('windows-packageVersion');
    },
    android_versionCode: function () {
        return this.getAttribute('android-versionCode');
    },
    ios_CFBundleVersion: function () {
        return this.getAttribute('ios-CFBundleVersion');
    },
    setVersion: function (value) {
        this.doc.getroot().attrib['version'] = value;
    },
    author: function () {
        return getNodeTextSafe(this.doc.find('author'));
    },
    getGlobalPreference: function (name) {
        return findElementAttributeValue(name, this.doc.findall('preference'));
    },
    setGlobalPreference: function (name, value) {
        var pref = this.doc.find('preference[@name="' + name + '"]');
        if (!pref) {
            pref = new et.Element('preference');
            pref.attrib.name = name;
            this.doc.getroot().append(pref);
        }
        pref.attrib.value = value;
    },
    getPlatformPreference: function (name, platform) {
        return findElementAttributeValue(name, this.doc.findall('./platform[@name="' + platform + '"]/preference'));
    },
    setPlatformPreference: function (name, platform, value) {
        const platformEl = this.doc.find('./platform[@name="' + platform + '"]');
        if (!platformEl) {
            throw new CordovaError('platform does not exist (received platform: ' + platform + ')');
        }
        const elems = this.doc.findall('./platform[@name="' + platform + '"]/preference');
        let pref = elems.filter(function (elem) {
            return elem.attrib.name.toLowerCase() === name.toLowerCase();
        }).pop();

        if (!pref) {
            pref = new et.Element('preference');
            pref.attrib.name = name;
            platformEl.append(pref);
        }
        pref.attrib.value = value;
    },
    getPreference: function (name, platform) {
        var platformPreference = '';

        if (platform) {
            platformPreference = this.getPlatformPreference(name, platform);
        }

        return platformPreference || this.getGlobalPreference(name);
    },
    setPreference: function (name, platform, value) {
        if (!value) {
            value = platform;
            platform = undefined;
        }

        if (platform) {
            this.setPlatformPreference(name, platform, value);
        } else {
            this.setGlobalPreference(name, value);
        }
    },
    /**
     * Returns all resources for the platform specified.
     * @param  {String} platform     The platform.
     * @param {string}  resourceName Type of static resources to return.
     *                               "icon" and "splash" currently supported.
     * @return {Array}               Resources for the platform specified.
     */
    getStaticResources: function (platform, resourceName) {
        var ret = [];
        var staticResources = [];
        if (platform) { // platform specific icons
            this.doc.findall('./platform[@name="' + platform + '"]/' + resourceName).forEach(function (elt) {
                elt.platform = platform; // mark as platform specific resource
                staticResources.push(elt);
            });
        }
        // root level resources
        staticResources = staticResources.concat(this.doc.findall(resourceName));
        // parse resource elements
        var that = this;
        staticResources.forEach(function (elt) {
            var res = {};
            res.src = elt.attrib.src;
            res.target = elt.attrib.target || undefined;
            res.density = elt.attrib['density'] || elt.attrib[that.cdvNamespacePrefix + ':density'] || elt.attrib['gap:density'];
            res.platform = elt.platform || null; // null means icon represents default icon (shared between platforms)
            res.width = +elt.attrib.width || undefined;
            res.height = +elt.attrib.height || undefined;
            res.background = elt.attrib.background || undefined;
            res.foreground = elt.attrib.foreground || undefined;

            // default icon
            if (!res.width && !res.height && !res.density) {
                ret.defaultResource = res;
            }
            ret.push(res);
        });

        /**
         * Returns resource with specified width and/or height.
         * @param  {number} width Width of resource.
         * @param  {number} height Height of resource.
         * @return {Resource} Resource object or null if not found.
         */
        ret.getBySize = function (width, height) {
            return ret.filter(function (res) {
                if (!res.width && !res.height) {
                    return false;
                }
                return ((!res.width || (width === res.width)) &&
                    (!res.height || (height === res.height)));
            })[0] || null;
        };

        /**
         * Returns resource with specified density.
         * @param  {string} density Density of resource.
         * @return {Resource}       Resource object or null if not found.
         */
        ret.getByDensity = function (density) {
            return ret.filter(function (res) {
                return res.density === density;
            })[0] || null;
        };

        /** Returns default icons */
        ret.getDefault = function () {
            return ret.defaultResource;
        };

        return ret;
    },

    /**
     * Returns all icons for specific platform.
     * @param  {string} platform Platform name
     * @return {Resource[]}      Array of icon objects.
     */
    getIcons: function (platform) {
        return this.getStaticResources(platform, 'icon');
    },

    /**
     * Returns all splash images for specific platform.
     * @param  {string} platform Platform name
     * @return {Resource[]}      Array of Splash objects.
     */
    getSplashScreens: function (platform) {
        return this.getStaticResources(platform, 'splash');
    },

    /**
     * Returns all resource-files for a specific platform.
     * @param  {string} platform Platform name
     * @param  {boolean} includeGlobal Whether to return resource-files at the
     *                                 root level.
     * @return {Resource[]}      Array of resource file objects.
     */
    getFileResources: function (platform, includeGlobal) {
        var fileResources = [];

        if (platform) { // platform specific resources
            fileResources = this.doc.findall('./platform[@name="' + platform + '"]/resource-file').map(function (tag) {
                return {
                    platform: platform,
                    src: tag.attrib.src,
                    target: tag.attrib.target,
                    versions: tag.attrib.versions,
                    deviceTarget: tag.attrib['device-target'],
                    arch: tag.attrib.arch
                };
            });
        }

        if (includeGlobal) {
            this.doc.findall('resource-file').forEach(function (tag) {
                fileResources.push({
                    platform: platform || null,
                    src: tag.attrib.src,
                    target: tag.attrib.target,
                    versions: tag.attrib.versions,
                    deviceTarget: tag.attrib['device-target'],
                    arch: tag.attrib.arch
                });
            });
        }

        return fileResources;
    },

    /**
     * Returns all hook scripts for the hook type specified.
     * @param  {String} hook     The hook type.
     * @param {Array}  platforms Platforms to look for scripts into (root scripts will be included as well).
     * @return {Array}               Script elements.
     */
    getHookScripts: function (hook, platforms) {
        var self = this;
        var scriptElements = self.doc.findall('./hook');

        if (platforms) {
            platforms.forEach(function (platform) {
                scriptElements = scriptElements.concat(self.doc.findall('./platform[@name="' + platform + '"]/hook'));
            });
        }

        function filterScriptByHookType (el) {
            return el.attrib.src && el.attrib.type && el.attrib.type.toLowerCase() === hook;
        }

        return scriptElements.filter(filterScriptByHookType);
    },
    /**
    * Returns a list of plugin (IDs).
    *
    * This function also returns any plugin's that
    * were defined using the legacy <feature> tags.
    * @return {string[]} Array of plugin IDs
    */
    getPluginIdList: function () {
        var plugins = this.doc.findall('plugin');
        var result = plugins.map(function (plugin) {
            return plugin.attrib.name;
        });
        var features = this.doc.findall('feature');
        features.forEach(function (element) {
            var idTag = element.find('./param[@name="id"]');
            if (idTag) {
                result.push(idTag.attrib.value);
            }
        });
        return result;
    },
    getPlugins: function () {
        return this.getPluginIdList().map(function (pluginId) {
            return this.getPlugin(pluginId);
        }, this);
    },
    /**
     * Adds a plugin element. Does not check for duplicates.
     * @name addPlugin
     * @function
     * @param {object} attributes name and spec are supported
     * @param {Array|object} variables name, value or arbitary object
     */
    addPlugin: function (attributes, variables) {
        if (!attributes && !attributes.name) return;
        var el = new et.Element('plugin');
        el.attrib.name = attributes.name;
        if (attributes.spec) {
            el.attrib.spec = attributes.spec;
        }

        // support arbitrary object as variables source
        if (variables && typeof variables === 'object' && !Array.isArray(variables)) {
            variables = Object.keys(variables)
                .map(function (variableName) {
                    return { name: variableName, value: variables[variableName] };
                });
        }

        if (variables) {
            variables.forEach(function (variable) {
                el.append(new et.Element('variable', { name: variable.name, value: variable.value }));
            });
        }
        this.doc.getroot().append(el);
    },
    /**
     * Retrives the plugin with the given id or null if not found.
     *
     * This function also returns any plugin's that
     * were defined using the legacy <feature> tags.
     * @name getPlugin
     * @function
     * @param {String} id
     * @returns {object} plugin including any variables
     */
    getPlugin: function (id) {
        if (!id) {
            return undefined;
        }
        var pluginElement = this.doc.find('./plugin/[@name="' + id + '"]');
        if (pluginElement === null) {
            var legacyFeature = this.doc.find('./feature/param[@name="id"][@value="' + id + '"]/..');
            if (legacyFeature) {
                events.emit('log', 'Found deprecated feature entry for ' + id + ' in config.xml.');
                return featureToPlugin(legacyFeature);
            }
            return undefined;
        }
        var plugin = {};

        plugin.name = pluginElement.attrib.name;
        plugin.spec = pluginElement.attrib.spec || pluginElement.attrib.src || pluginElement.attrib.version;
        plugin.variables = {};
        var variableElements = pluginElement.findall('variable');
        variableElements.forEach(function (varElement) {
            var name = varElement.attrib.name;
            var value = varElement.attrib.value;
            if (name) {
                plugin.variables[name] = value;
            }
        });
        return plugin;
    },
    /**
     * Remove the plugin entry with give name (id).
     *
     * This function also operates on any plugin's that
     * were defined using the legacy <feature> tags.
     * @name removePlugin
     * @function
     * @param id name of the plugin
     */
    removePlugin: function (id) {
        if (!id) return;
        const root = this.doc.getroot();
        removeChildren(root, `./plugin/[@name="${id}"]`);
        removeChildren(root, `./feature/param[@name="id"][@value="${id}"]/..`);
    },

    // Add any element to the root
    addElement: function (name, attributes) {
        var el = et.Element(name);
        for (var a in attributes) {
            el.attrib[a] = attributes[a];
        }
        this.doc.getroot().append(el);
    },

    /**
     * Adds an engine. Does not check for duplicates.
     * @param  {String} name the engine name
     * @param  {String} spec engine source location or version (optional)
     */
    addEngine: function (name, spec) {
        if (!name) return;
        var el = et.Element('engine');
        el.attrib.name = name;
        if (spec) {
            el.attrib.spec = spec;
        }
        this.doc.getroot().append(el);
    },
    /**
     * Removes all the engines with given name
     * @param  {String} name the engine name.
     */
    removeEngine: function (name) {
        removeChildren(this.doc.getroot(), `./engine/[@name="${name}"]`);
    },
    getEngines: function () {
        var engines = this.doc.findall('./engine');
        return engines.map(function (engine) {
            var spec = engine.attrib.spec || engine.attrib.version;
            return {
                name: engine.attrib.name,
                spec: spec || null
            };
        });
    },
    /* Get all the access tags */
    getAccesses: function () {
        var accesses = this.doc.findall('./access');
        return accesses.map(function (access) {
            var minimum_tls_version = access.attrib['minimum-tls-version']; /* String */
            var requires_forward_secrecy = access.attrib['requires-forward-secrecy']; /* Boolean */
            var requires_certificate_transparency = access.attrib['requires-certificate-transparency']; /* Boolean */
            var allows_arbitrary_loads_in_web_content = access.attrib['allows-arbitrary-loads-in-web-content']; /* Boolean */
            var allows_arbitrary_loads_in_media = access.attrib['allows-arbitrary-loads-in-media']; /* Boolean (DEPRECATED) */
            var allows_arbitrary_loads_for_media = access.attrib['allows-arbitrary-loads-for-media']; /* Boolean */
            var allows_local_networking = access.attrib['allows-local-networking']; /* Boolean */

            return {
                origin: access.attrib.origin,
                minimum_tls_version: minimum_tls_version,
                requires_forward_secrecy: requires_forward_secrecy,
                requires_certificate_transparency: requires_certificate_transparency,
                allows_arbitrary_loads_in_web_content: allows_arbitrary_loads_in_web_content,
                allows_arbitrary_loads_in_media: allows_arbitrary_loads_in_media,
                allows_arbitrary_loads_for_media: allows_arbitrary_loads_for_media,
                allows_local_networking: allows_local_networking
            };
        });
    },
    /* Get all the allow-navigation tags */
    getAllowNavigations: function () {
        var allow_navigations = this.doc.findall('./allow-navigation');
        return allow_navigations.map(function (allow_navigation) {
            var minimum_tls_version = allow_navigation.attrib['minimum-tls-version']; /* String */
            var requires_forward_secrecy = allow_navigation.attrib['requires-forward-secrecy']; /* Boolean */
            var requires_certificate_transparency = allow_navigation.attrib['requires-certificate-transparency']; /* Boolean */

            return {
                href: allow_navigation.attrib.href,
                minimum_tls_version: minimum_tls_version,
                requires_forward_secrecy: requires_forward_secrecy,
                requires_certificate_transparency: requires_certificate_transparency
            };
        });
    },
    /* Get all the allow-intent tags */
    getAllowIntents: function () {
        var allow_intents = this.doc.findall('./allow-intent');
        return allow_intents.map(function (allow_intent) {
            return {
                href: allow_intent.attrib.href
            };
        });
    },
    /* Get all edit-config tags */
    getEditConfigs: function (platform) {
        var platform_edit_configs = this.doc.findall('./platform[@name="' + platform + '"]/edit-config');
        var edit_configs = this.doc.findall('edit-config').concat(platform_edit_configs);

        return edit_configs.map(function (tag) {
            var editConfig =
                {
                    file: tag.attrib['file'],
                    target: tag.attrib['target'],
                    mode: tag.attrib['mode'],
                    id: 'config.xml',
                    xmls: tag.getchildren()
                };
            return editConfig;
        });
    },

    /* Get all config-file tags */
    getConfigFiles: function (platform) {
        var platform_config_files = this.doc.findall('./platform[@name="' + platform + '"]/config-file');
        var config_files = this.doc.findall('config-file').concat(platform_config_files);

        return config_files.map(function (tag) {
            var configFile =
                {
                    target: tag.attrib['target'],
                    parent: tag.attrib['parent'],
                    after: tag.attrib['after'],
                    xmls: tag.getchildren(),
                    // To support demuxing via versions
                    versions: tag.attrib['versions'],
                    deviceTarget: tag.attrib['device-target']
                };
            return configFile;
        });
    },

    write: function () {
        fs.writeFileSync(this.path, this.doc.write({ indent: 4 }), 'utf-8');
    }
};

function featureToPlugin (featureElement) {
    var plugin = {};
    plugin.variables = [];
    var pluginVersion,
        pluginSrc;

    var nodes = featureElement.findall('param');
    nodes.forEach(function (element) {
        var n = element.attrib.name;
        var v = element.attrib.value;
        if (n === 'id') {
            plugin.name = v;
        } else if (n === 'version') {
            pluginVersion = v;
        } else if (n === 'url' || n === 'installPath') {
            pluginSrc = v;
        } else {
            plugin.variables[n] = v;
        }
    });

    var spec = pluginSrc || pluginVersion;
    if (spec) {
        plugin.spec = spec;
    }

    return plugin;
}
module.exports = ConfigParser;
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

/*
 * This module deals with shared configuration / dependency "stuff". That is:
 * - XML configuration files such as config.xml, AndroidManifest.xml or WMAppManifest.xml.
 * - plist files in iOS
 * Essentially, any type of shared resources that we need to handle with awareness
 * of how potentially multiple plugins depend on a single shared resource, should be
 * handled in this module.
 *
 * The implementation uses an object as a hash table, with "leaves" of the table tracking
 * reference counts.
 */

var path = require('path');
var et = require('elementtree');
var ConfigKeeper = require('./ConfigKeeper');
var events = require('../events');

var mungeutil = require('./munge-util');
var xml_helpers = require('../util/xml-helpers');

exports.PlatformMunger = PlatformMunger;

exports.process = function (plugins_dir, project_dir, platform, platformJson, pluginInfoProvider) {
    var munger = new PlatformMunger(platform, project_dir, platformJson, pluginInfoProvider);
    munger.process(plugins_dir);
    munger.save_all();
};

/******************************************************************************
* PlatformMunger class
*
* Can deal with config file of a single project.
* Parsed config files are cached in a ConfigKeeper object.
******************************************************************************/
function PlatformMunger (platform, project_dir, platformJson, pluginInfoProvider) {
    this.platform = platform;
    this.project_dir = project_dir;
    this.config_keeper = new ConfigKeeper(project_dir);
    this.platformJson = platformJson;
    this.pluginInfoProvider = pluginInfoProvider;
}

// Write out all unsaved files.
PlatformMunger.prototype.save_all = PlatformMunger_save_all;
function PlatformMunger_save_all () {
    this.config_keeper.save_all();
    this.platformJson.save();
}

// Apply a munge object to a single config file.
// The remove parameter tells whether to add the change or remove it.
PlatformMunger.prototype.apply_file_munge = PlatformMunger_apply_file_munge;
function PlatformMunger_apply_file_munge (file, munge, remove) {
    var self = this;

    for (var selector in munge.parents) {
        for (var xml_child in munge.parents[selector]) {
            // this xml child is new, graft it (only if config file exists)
            var config_file = self.config_keeper.get(self.project_dir, self.platform, file);
            if (config_file.exists) {
                if (remove) config_file.prune_child(selector, munge.parents[selector][xml_child]);
                else config_file.graft_child(selector, munge.parents[selector][xml_child]);
            } else {
                events.emit('warn', 'config file ' + file + ' requested for changes not found at ' + config_file.filepath + ', ignoring');
            }
        }
    }
}

PlatformMunger.prototype.remove_plugin_changes = remove_plugin_changes;
function remove_plugin_changes (pluginInfo, is_top_level) {
    var self = this;
    var platform_config = self.platformJson.root;
    var plugin_vars = is_top_level
        ? platform_config.installed_plugins[pluginInfo.id]
        : platform_config.dependent_plugins[pluginInfo.id];
    var edit_config_changes = null;
    if (pluginInfo.getEditConfigs) {
        edit_config_changes = pluginInfo.getEditConfigs(self.platform);
    }

    // get config munge, aka how did this plugin change various config files
    var config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes);
    // global munge looks at all plugins' changes to config files
    var global_munge = platform_config.config_munge;
    var munge = mungeutil.decrement_munge(global_munge, config_munge);

    for (var file in munge.files) {
        self.apply_file_munge(file, munge.files[file], /* remove = */ true);
    }

    // Remove from installed_plugins
    self.platformJson.removePlugin(pluginInfo.id, is_top_level);
    return self;
}

PlatformMunger.prototype.add_plugin_changes = add_plugin_changes;
function add_plugin_changes (pluginInfo, plugin_vars, is_top_level, should_increment, plugin_force) {
    var self = this;
    var platform_config = self.platformJson.root;

    var edit_config_changes = null;
    if (pluginInfo.getEditConfigs) {
        edit_config_changes = pluginInfo.getEditConfigs(self.platform);
    }

    var config_munge;

    if (!edit_config_changes || edit_config_changes.length === 0) {
        // get config munge, aka how should this plugin change various config files
        config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars);
    } else {
        var isConflictingInfo = is_conflicting(edit_config_changes, platform_config.config_munge, self, plugin_force);

        if (isConflictingInfo.conflictWithConfigxml) {
            throw new Error(pluginInfo.id +
                ' cannot be added. <edit-config> changes in this plugin conflicts with <edit-config> changes in config.xml. Conflicts must be resolved before plugin can be added.');
        }
        if (plugin_force) {
            events.emit('warn', '--force is used. edit-config will overwrite conflicts if any. Conflicting plugins may not work as expected.');

            // remove conflicting munges
            var conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.conflictingMunge);
            for (var conflict_file in conflict_munge.files) {
                self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true);
            }

            // force add new munges
            config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes);
        } else if (isConflictingInfo.conflictFound) {
            throw new Error('There was a conflict trying to modify attributes with <edit-config> in plugin ' + pluginInfo.id +
            '. The conflicting plugin, ' + isConflictingInfo.conflictingPlugin + ', already modified the same attributes. The conflict must be resolved before ' +
            pluginInfo.id + ' can be added. You may use --force to add the plugin and overwrite the conflicting attributes.');
        } else {
            // no conflicts, will handle edit-config
            config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes);
        }
    }

    self = munge_helper(should_increment, self, platform_config, config_munge);

    // Move to installed/dependent_plugins
    self.platformJson.addPlugin(pluginInfo.id, plugin_vars || {}, is_top_level);
    return self;
}

// Handle edit-config changes from config.xml
PlatformMunger.prototype.add_config_changes = add_config_changes;
function add_config_changes (config, should_increment) {
    var self = this;
    var platform_config = self.platformJson.root;

    var config_munge;
    var changes = [];

    if (config.getEditConfigs) {
        var edit_config_changes = config.getEditConfigs(self.platform);
        if (edit_config_changes) {
            changes = changes.concat(edit_config_changes);
        }
    }

    if (config.getConfigFiles) {
        var config_files_changes = config.getConfigFiles(self.platform);
        if (config_files_changes) {
            changes = changes.concat(config_files_changes);
        }
    }

    if (changes && changes.length > 0) {
        var isConflictingInfo = is_conflicting(changes, platform_config.config_munge, self, true /* always force overwrite other edit-config */);
        if (isConflictingInfo.conflictFound) {
            var conflict_munge;
            var conflict_file;

            if (Object.keys(isConflictingInfo.configxmlMunge.files).length !== 0) {
                // silently remove conflicting config.xml munges so new munges can be added
                conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.configxmlMunge);
                for (conflict_file in conflict_munge.files) {
                    self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true);
                }
            }
            if (Object.keys(isConflictingInfo.conflictingMunge.files).length !== 0) {
                events.emit('warn', 'Conflict found, edit-config changes from config.xml will overwrite plugin.xml changes');

                // remove conflicting plugin.xml munges
                conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.conflictingMunge);
                for (conflict_file in conflict_munge.files) {
                    self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true);
                }
            }
        }
    }

    // Add config.xml edit-config and config-file munges
    config_munge = self.generate_config_xml_munge(config, changes, 'config.xml');
    self = munge_helper(should_increment, self, platform_config, config_munge);

    // Move to installed/dependent_plugins
    return self;
}

function munge_helper (should_increment, self, platform_config, config_munge) {
    // global munge looks at all changes to config files

    // TODO: The should_increment param is only used by cordova-cli and is going away soon.
    // If should_increment is set to false, avoid modifying the global_munge (use clone)
    // and apply the entire config_munge because it's already a proper subset of the global_munge.
    var munge, global_munge;
    if (should_increment) {
        global_munge = platform_config.config_munge;
        munge = mungeutil.increment_munge(global_munge, config_munge);
    } else {
        global_munge = mungeutil.clone_munge(platform_config.config_munge);
        munge = config_munge;
    }

    for (var file in munge.files) {
        self.apply_file_munge(file, munge.files[file]);
    }

    return self;
}

// Load the global munge from platform json and apply all of it.
// Used by cordova prepare to re-generate some config file from platform
// defaults and the global munge.
PlatformMunger.prototype.reapply_global_munge = reapply_global_munge;
function reapply_global_munge () {
    var self = this;

    var platform_config = self.platformJson.root;
    var global_munge = platform_config.config_munge;
    for (var file in global_munge.files) {
        self.apply_file_munge(file, global_munge.files[file]);
    }

    return self;
}

// generate_plugin_config_munge
// Generate the munge object from config.xml
PlatformMunger.prototype.generate_config_xml_munge = generate_config_xml_munge;
function generate_config_xml_munge (config, config_changes, type) {
    var munge = { files: {} };
    var id;

    if (!config_changes) {
        return munge;
    }

    if (type === 'config.xml') {
        id = type;
    } else {
        id = config.id;
    }

    config_changes.forEach(function (change) {
        change.xmls.forEach(function (xml) {
            // 1. stringify each xml
            var stringified = (new et.ElementTree(xml)).write({ xml_declaration: false });
            // 2. add into munge
            if (change.mode) {
                mungeutil.deep_add(munge, change.file, change.target, { xml: stringified, count: 1, mode: change.mode, id: id });
            } else {
                mungeutil.deep_add(munge, change.target, change.parent, { xml: stringified, count: 1, after: change.after });
            }
        });
    });
    return munge;
}

// generate_plugin_config_munge
// Generate the munge object from plugin.xml + vars
PlatformMunger.prototype.generate_plugin_config_munge = generate_plugin_config_munge;
function generate_plugin_config_munge (pluginInfo, vars, edit_config_changes) {
    var self = this;

    vars = vars || {};
    var munge = { files: {} };
    var changes = pluginInfo.getConfigFiles(self.platform);

    if (edit_config_changes) {
        Array.prototype.push.apply(changes, edit_config_changes);
    }

    changes.forEach(function (change) {
        change.xmls.forEach(function (xml) {
            // 1. stringify each xml
            var stringified = (new et.ElementTree(xml)).write({ xml_declaration: false });
            // interp vars
            if (vars) {
                Object.keys(vars).forEach(function (key) {
                    var regExp = new RegExp('\\$' + key, 'g');
                    stringified = stringified.replace(regExp, vars[key]);
                });
            }
            // 2. add into munge
            if (change.mode) {
                if (change.mode !== 'remove') {
                    mungeutil.deep_add(munge, change.file, change.target, { xml: stringified, count: 1, mode: change.mode, plugin: pluginInfo.id });
                }
            } else {
                mungeutil.deep_add(munge, change.target, change.parent, { xml: stringified, count: 1, after: change.after });
            }
        });
    });
    return munge;
}

function is_conflicting (editchanges, config_munge, self, force) {
    var files = config_munge.files;
    var conflictFound = false;
    var conflictWithConfigxml = false;
    var conflictingMunge = { files: {} };
    var configxmlMunge = { files: {} };
    var conflictingParent;
    var conflictingPlugin;

    editchanges.forEach(function (editchange) {
        if (files[editchange.file]) {
            var parents = files[editchange.file].parents;
            var target = parents[editchange.target];

            // Check if the edit target will resolve to an existing target
            if (!target || target.length === 0) {
                var file_xml = self.config_keeper.get(self.project_dir, self.platform, editchange.file).data;
                var resolveEditTarget = xml_helpers.resolveParent(file_xml, editchange.target);
                var resolveTarget;

                if (resolveEditTarget) {
                    for (var parent in parents) {
                        resolveTarget = xml_helpers.resolveParent(file_xml, parent);
                        if (resolveEditTarget === resolveTarget) {
                            conflictingParent = parent;
                            target = parents[parent];
                            break;
                        }
                    }
                }
            } else {
                conflictingParent = editchange.target;
            }

            if (target && target.length !== 0) {
                // conflict has been found
                conflictFound = true;

                if (editchange.id === 'config.xml') {
                    if (target[0].id === 'config.xml') {
                        // Keep track of config.xml/config.xml edit-config conflicts
                        mungeutil.deep_add(configxmlMunge, editchange.file, conflictingParent, target[0]);
                    } else {
                        // Keep track of config.xml x plugin.xml edit-config conflicts
                        mungeutil.deep_add(conflictingMunge, editchange.file, conflictingParent, target[0]);
                    }
                } else {
                    if (target[0].id === 'config.xml') {
                        // plugin.xml cannot overwrite config.xml changes even if --force is used
                        conflictWithConfigxml = true;
                        return;
                    }

                    if (force) {
                        // Need to find all conflicts when --force is used, track conflicting munges
                        mungeutil.deep_add(conflictingMunge, editchange.file, conflictingParent, target[0]);
                    } else {
                        // plugin cannot overwrite other plugin changes without --force
                        conflictingPlugin = target[0].plugin;
                    }
                }
            }
        }
    });

    return { conflictFound: conflictFound,
        conflictingPlugin: conflictingPlugin,
        conflictingMunge: conflictingMunge,
        configxmlMunge: configxmlMunge,
        conflictWithConfigxml: conflictWithConfigxml
    };
}

// Go over the prepare queue and apply the config munges for each plugin
// that has been (un)installed.
PlatformMunger.prototype.process = PlatformMunger_process;
function PlatformMunger_process (plugins_dir) {
    var self = this;
    var platform_config = self.platformJson.root;

    // Uninstallation first
    platform_config.prepare_queue.uninstalled.forEach(function (u) {
        var pluginInfo = self.pluginInfoProvider.get(path.join(plugins_dir, u.plugin));
        self.remove_plugin_changes(pluginInfo, u.topLevel);
    });

    // Now handle installation
    platform_config.prepare_queue.installed.forEach(function (u) {
        var pluginInfo = self.pluginInfoProvider.get(path.join(plugins_dir, u.plugin));
        self.add_plugin_changes(pluginInfo, u.vars, u.topLevel, true, u.force);
    });

    // Empty out installed/ uninstalled queues.
    platform_config.prepare_queue.uninstalled = [];
    platform_config.prepare_queue.installed = [];
}
/** ** END of PlatformMunger ****/
/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var fs = require('fs-extra');
var path = require('path');

var modules = {};
var addProperty = require('../util/addProperty');

// Use delay loading to ensure plist and other node modules to not get loaded
// on Android, Windows platforms
addProperty(module, 'bplist', 'bplist-parser', modules);
addProperty(module, 'et', 'elementtree', modules);
addProperty(module, 'glob', 'glob', modules);
addProperty(module, 'plist', 'plist', modules);
addProperty(module, 'plist_helpers', '../util/plist-helpers', modules);
addProperty(module, 'xml_helpers', '../util/xml-helpers', modules);

/******************************************************************************
* ConfigFile class
*
* Can load and keep various types of config files. Provides some functionality
* specific to some file types such as grafting XML children. In most cases it
* should be instantiated by ConfigKeeper.
*
* For plugin.xml files use as:
* plugin_config = self.config_keeper.get(plugin_dir, '', 'plugin.xml');
*
* TODO: Consider moving it out to a separate file and maybe partially with
* overrides in platform handlers.
******************************************************************************/
function ConfigFile (project_dir, platform, file_tag) {
    this.project_dir = project_dir;
    this.platform = platform;
    this.file_tag = file_tag;
    this.is_changed = false;

    this.load();
}

// ConfigFile.load()
ConfigFile.prototype.load = ConfigFile_load;
function ConfigFile_load () {
    var self = this;

    // config file may be in a place not exactly specified in the target
    var filepath = self.filepath = resolveConfigFilePath(self.project_dir, self.platform, self.file_tag);

    if (!filepath || !fs.existsSync(filepath)) {
        self.exists = false;
        return;
    }
    self.exists = true;
    self.mtime = fs.statSync(self.filepath).mtime;

    var ext = path.extname(filepath);
    // Windows8 uses an appxmanifest, and wp8 will likely use
    // the same in a future release
    if (ext === '.xml' || ext === '.appxmanifest' || ext === '.storyboard' || ext === '.jsproj') {
        self.type = 'xml';
        self.data = modules.xml_helpers.parseElementtreeSync(filepath);
    } else {
        // plist file
        self.type = 'plist';
        // TODO: isBinaryPlist() reads the file and then parse re-reads it again.
        //       We always write out text plist, not binary.
        //       Do we still need to support binary plist?
        //       If yes, use plist.parseStringSync() and read the file once.
        self.data = isBinaryPlist(filepath)
            ? modules.bplist.parseBuffer(fs.readFileSync(filepath))[0]
            : modules.plist.parse(fs.readFileSync(filepath, 'utf8'));
    }
}

ConfigFile.prototype.save = function ConfigFile_save () {
    var self = this;
    if (self.type === 'xml') {
        fs.writeFileSync(self.filepath, self.data.write({ indent: 4 }), 'utf-8');
    } else {
        // plist
        var regExp = /<string>[ \t\r\n]+?<\/string>/g;
        fs.writeFileSync(self.filepath, modules.plist.build(self.data, { indent: '\t', offset: -1 }).replace(regExp, '<string></string>'));
    }
    self.is_changed = false;
};

ConfigFile.prototype.graft_child = function ConfigFile_graft_child (selector, xml_child) {
    var self = this;
    var filepath = self.filepath;
    var result;
    if (self.type === 'xml') {
        var xml_to_graft = [modules.et.XML(xml_child.xml)];
        switch (xml_child.mode) {
        case 'merge':
            result = modules.xml_helpers.graftXMLMerge(self.data, xml_to_graft, selector, xml_child);
            break;
        case 'overwrite':
            result = modules.xml_helpers.graftXMLOverwrite(self.data, xml_to_graft, selector, xml_child);
            break;
        case 'remove':
            result = modules.xml_helpers.pruneXMLRemove(self.data, selector, xml_to_graft);
            break;
        default:
            result = modules.xml_helpers.graftXML(self.data, xml_to_graft, selector, xml_child.after);
        }
        if (!result) {
            throw new Error('Unable to graft xml at selector "' + selector + '" from "' + filepath + '" during config install');
        }
    } else {
        // plist file
        result = modules.plist_helpers.graftPLIST(self.data, xml_child.xml, selector);
        if (!result) {
            throw new Error('Unable to graft plist "' + filepath + '" during config install');
        }
    }
    self.is_changed = true;
};

ConfigFile.prototype.prune_child = function ConfigFile_prune_child (selector, xml_child) {
    var self = this;
    var filepath = self.filepath;
    var result;
    if (self.type === 'xml') {
        var xml_to_graft = [modules.et.XML(xml_child.xml)];
        switch (xml_child.mode) {
        case 'merge':
        case 'overwrite':
            result = modules.xml_helpers.pruneXMLRestore(self.data, selector, xml_child);
            break;
        case 'remove':
            result = modules.xml_helpers.pruneXMLRemove(self.data, selector, xml_to_graft);
            break;
        default:
            result = modules.xml_helpers.pruneXML(self.data, xml_to_graft, selector);
        }
    } else {
        // plist file
        result = modules.plist_helpers.prunePLIST(self.data, xml_child.xml, selector);
    }
    if (!result) {
        var err_msg = 'Pruning at selector "' + selector + '" from "' + filepath + '" went bad.';
        throw new Error(err_msg);
    }
    self.is_changed = true;
};

// Some config-file target attributes are not qualified with a full leading directory, or contain wildcards.
// Resolve to a real path in this function.
// TODO: getIOSProjectname is slow because of glob, try to avoid calling it several times per project.
function resolveConfigFilePath (project_dir, platform, file) {
    var filepath = path.join(project_dir, file);
    var matches;

    file = path.normalize(file);

    if (file.includes('*')) {
        // handle wildcards in targets using glob.
        matches = modules.glob.sync(path.join(project_dir, '**', file));
        if (matches.length) filepath = matches[0];

        // [CB-5989] multiple Info.plist files may exist. default to $PROJECT_NAME-Info.plist
        if (matches.length > 1 && file.includes('-Info.plist')) {
            var plistName = getIOSProjectname(project_dir) + '-Info.plist';
            for (var i = 0; i < matches.length; i++) {
                if (matches[i].includes(plistName)) {
                    filepath = matches[i];
                    break;
                }
            }
        }
        return filepath;
    }

    // XXX this checks for android studio projects
    // only if none of the options above are satisfied does this get called
    // TODO: Move this out of cordova-common and into the platforms somehow
    if (platform === 'android' && !fs.existsSync(filepath)) {
        var config_file;

        if (file === 'AndroidManifest.xml') {
            filepath = path.join(project_dir, 'app', 'src', 'main', 'AndroidManifest.xml');
        } else if (file.endsWith('config.xml')) {
            filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'xml', 'config.xml');
        } else if (file.endsWith('strings.xml')) {
            // Plugins really shouldn't mess with strings.xml, since it's able to be localized
            filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'values', 'strings.xml');
        } else if (file.includes(path.join('res', 'values'))) {
            config_file = path.basename(file);
            filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'values', config_file);
        } else if (file.includes(path.join('res', 'xml'))) {
            // Catch-all for all other stored XML configuration in legacy plugins
            config_file = path.basename(file);
            filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'xml', config_file);
        }
        return filepath;
    }

    // special-case config.xml target that is just "config.xml" for other platforms. This should
    // be resolved to the real location of the file.
    // TODO: Move this out of cordova-common into platforms
    if (file === 'config.xml') {
        if (platform === 'ubuntu') {
            filepath = path.join(project_dir, 'config.xml');
        } else if (platform === 'ios' || platform === 'osx') {
            filepath = path.join(
                project_dir,
                module.exports.getIOSProjectname(project_dir),
                'config.xml'
            );
        } else {
            matches = modules.glob.sync(path.join(project_dir, '**', 'config.xml'));
            if (matches.length) filepath = matches[0];
        }
        return filepath;
    }

    // None of the special cases matched, returning project_dir/file.
    return filepath;
}

// Find out the real name of an iOS or OSX project
// TODO: glob is slow, need a better way or caching, or avoid using more than once.
function getIOSProjectname (project_dir) {
    var matches = modules.glob.sync(path.join(project_dir, '*.xcodeproj'));
    var iospath;
    if (matches.length === 1) {
        iospath = path.basename(matches[0], '.xcodeproj');
    } else {
        var msg;
        if (matches.length === 0) {
            msg = 'Does not appear to be an xcode project, no xcode project file in ' + project_dir;
        } else {
            msg = 'There are multiple *.xcodeproj dirs in ' + project_dir;
        }
        throw new Error(msg);
    }
    return iospath;
}

// determine if a plist file is binary
function isBinaryPlist (filename) {
    // I wish there was a synchronous way to read only the first 6 bytes of a
    // file. This is wasteful :/
    var buf = '' + fs.readFileSync(filename, 'utf8');
    // binary plists start with a magic header, "bplist"
    return buf.substring(0, 6) === 'bplist';
}

module.exports = ConfigFile;
module.exports.isBinaryPlist = isBinaryPlist;
module.exports.getIOSProjectname = getIOSProjectname;
module.exports.resolveConfigFilePath = resolveConfigFilePath;
/*
 * 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 sub:true */

var path = require('path');
var ConfigFile = require('./ConfigFile');

/******************************************************************************
* ConfigKeeper class
*
* Used to load and store config files to avoid re-parsing and writing them out
* multiple times.
*
* The config files are referred to by a fake path constructed as
* project_dir/platform/file
* where file is the name used for the file in config munges.
******************************************************************************/
function ConfigKeeper (project_dir, plugins_dir) {
    this.project_dir = project_dir;
    this.plugins_dir = plugins_dir;
    this._cached = {};
}

ConfigKeeper.prototype.get = function ConfigKeeper_get (project_dir, platform, file) {
    var self = this;

    // This fixes a bug with older plugins - when specifying config xml instead of res/xml/config.xml
    // https://issues.apache.org/jira/browse/CB-6414
    if (file === 'config.xml' && platform === 'android') {
        file = 'res/xml/config.xml';
    }
    var fake_path = path.join(project_dir, platform, file);

    if (self._cached[fake_path]) {
        return self._cached[fake_path];
    }
    // File was not cached, need to load.
    var config_file = new ConfigFile(project_dir, platform, file);
    self._cached[fake_path] = config_file;
    return config_file;
};

ConfigKeeper.prototype.save_all = function ConfigKeeper_save_all () {
    var self = this;
    Object.keys(self._cached).forEach(function (fake_path) {
        var config_file = self._cached[fake_path];
        if (config_file.is_changed) config_file.save();
    });
};

module.exports = ConfigKeeper;
/*
 * 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 sub:true  */

var _ = require('underscore');

// add the count of [key1][key2]...[keyN] to obj
// return true if it didn't exist before
exports.deep_add = function deep_add (obj, keys /* or key1, key2 .... */) {
    if (!Array.isArray(keys)) {
        keys = Array.prototype.slice.call(arguments, 1);
    }

    return exports.process_munge(obj, true/* createParents */, function (parentArray, k) {
        var found = _.find(parentArray, function (element) {
            return element.xml === k.xml;
        });
        if (found) {
            found.after = found.after || k.after;
            found.count += k.count;
        } else {
            parentArray.push(k);
        }
        return !found;
    }, keys);
};

// decrement the count of [key1][key2]...[keyN] from obj and remove if it reaches 0
// return true if it was removed or not found
exports.deep_remove = function deep_remove (obj, keys /* or key1, key2 .... */) {
    if (!Array.isArray(keys)) {
        keys = Array.prototype.slice.call(arguments, 1);
    }

    var result = exports.process_munge(obj, false/* createParents */, function (parentArray, k) {
        var index = -1;
        var found = _.find(parentArray, function (element) {
            index++;
            return element.xml === k.xml;
        });
        if (found) {
            if (parentArray[index].oldAttrib) {
                k.oldAttrib = _.extend({}, parentArray[index].oldAttrib);
            }
            found.count -= k.count;
            if (found.count > 0) {
                return false;
            } else {
                parentArray.splice(index, 1);
            }
        }
        return undefined;
    }, keys);

    return typeof result === 'undefined' ? true : result;
};

// search for [key1][key2]...[keyN]
// return the object or undefined if not found
exports.deep_find = function deep_find (obj, keys /* or key1, key2 .... */) {
    if (!Array.isArray(keys)) {
        keys = Array.prototype.slice.call(arguments, 1);
    }

    return exports.process_munge(obj, false/* createParents? */, function (parentArray, k) {
        return _.find(parentArray, function (element) {
            return element.xml === (k.xml || k);
        });
    }, keys);
};

// Execute func passing it the parent array and the xmlChild key.
// When createParents is true, add the file and parent items  they are missing
// When createParents is false, stop and return undefined if the file and/or parent items are missing

exports.process_munge = function process_munge (obj, createParents, func, keys /* or key1, key2 .... */) {
    if (!Array.isArray(keys)) {
        keys = Array.prototype.slice.call(arguments, 1);
    }
    var k = keys[0];
    if (keys.length === 1) {
        return func(obj, k);
    } else if (keys.length === 2) {
        if (!obj.parents[k] && !createParents) {
            return undefined;
        }
        obj.parents[k] = obj.parents[k] || [];
        return exports.process_munge(obj.parents[k], createParents, func, keys.slice(1));
    } else if (keys.length === 3) {
        if (!obj.files[k] && !createParents) {
            return undefined;
        }
        obj.files[k] = obj.files[k] || { parents: {} };
        return exports.process_munge(obj.files[k], createParents, func, keys.slice(1));
    } else {
        throw new Error('Invalid key format. Must contain at most 3 elements (file, parent, xmlChild).');
    }
};

// All values from munge are added to base as
// base[file][selector][child] += munge[file][selector][child]
// Returns a munge object containing values that exist in munge
// but not in base.
exports.increment_munge = function increment_munge (base, munge) {
    var diff = { files: {} };

    for (var file in munge.files) {
        for (var selector in munge.files[file].parents) {
            for (var xml_child in munge.files[file].parents[selector]) {
                var val = munge.files[file].parents[selector][xml_child];
                // if node not in base, add it to diff and base
                // else increment it's value in base without adding to diff
                var newlyAdded = exports.deep_add(base, [file, selector, val]);
                if (newlyAdded) {
                    exports.deep_add(diff, file, selector, val);
                }
            }
        }
    }
    return diff;
};

// Update the base munge object as
// base[file][selector][child] -= munge[file][selector][child]
// nodes that reached zero value are removed from base and added to the returned munge
// object.
exports.decrement_munge = function decrement_munge (base, munge) {
    var zeroed = { files: {} };

    for (var file in munge.files) {
        for (var selector in munge.files[file].parents) {
            for (var xml_child in munge.files[file].parents[selector]) {
                var val = munge.files[file].parents[selector][xml_child];
                // if node not in base, add it to diff and base
                // else increment it's value in base without adding to diff
                var removed = exports.deep_remove(base, [file, selector, val]);
                if (removed) {
                    exports.deep_add(zeroed, file, selector, val);
                }
            }
        }
    }
    return zeroed;
};

// For better readability where used
exports.clone_munge = function clone_munge (munge) {
    return exports.increment_munge({}, munge);
};
<!--
Please have a look at the issue templates you get when you click "New issue" in the GitHub UI.
We very much prefer issues created by using one of these templates.
-->

### Issue Type
<!-- Please check the boxes by putting an x in the [ ] like so: [x] -->

- [ ] Bug Report
- [ ] Feature Request
- [ ] Support Question

## Description

## Information
<!-- Include all relevant information that might help understand and reproduce the problem -->

### Command or Code
<!-- What command or code is needed to reproduce the problem? -->

### Environment, Platform, Device
<!-- In what environment, on what platform or on which device are you experiencing the issue? -->



### Version information
<!-- 
What are relevant versions you are using?
For example:
Cordova: Cordova CLI, Cordova Platforms, Cordova Plugins 
Other Frameworks: Ionic Framework and CLI version
Operating System, Android Studio, Xcode etc.
-->



## Checklist
<!-- Please check the boxes by putting an `x` in the `[ ]` like so: `[x]` -->

- [ ] I searched for already existing GitHub issues about this
- [ ] I updated all Cordova tooling to their most recent version
- [ ] I included all the necessary information above
<!--
Please make sure the checklist boxes are all checked before submitting the PR. The checklist is intended as a quick reference, for complete details please see our Contributor Guidelines:

http://cordova.apache.org/contribute/contribute_guidelines.html

Thanks!
-->

### Platforms affected



### Motivation and Context
<!-- Why is this change required? What problem does it solve? -->
<!-- If it fixes an open issue, please link to the issue here. -->



### Description
<!-- Describe your changes in detail -->



### Testing
<!-- Please describe in detail how you tested your changes. -->



### Checklist

- [ ] I've run the tests to see all new and existing tests pass
- [ ] I added automated test coverage as appropriate for this change
- [ ] Commit is prefixed with `(platform)` if this change only applies to one platform (e.g. `(android)`)
- [ ] If this Pull Request resolves an issue, I linked to the issue in the text above (and used the correct [keyword to close issues using keywords](https://help.github.com/articles/closing-issues-using-keywords/))
- [ ] I've updated the documentation if necessary
---
name: ðŸ�› Bug Report
about: If something isn't working as expected.

---

# Bug Report

## Problem

### What is expected to happen?



### What does actually happen?



## Information
<!-- Include all relevant information that might help understand and reproduce the problem -->



### Command or Code
<!-- What command or code is needed to reproduce the problem? -->



### Environment, Platform, Device
<!-- In what environment, on what platform or on which device are you experiencing the issue? -->



### Version information
<!-- 
What are relevant versions you are using?
For example:
Cordova: Cordova CLI, Cordova Platforms, Cordova Plugins 
Other Frameworks: Ionic Framework and CLI version
Operating System, Android Studio, Xcode etc.
-->



## Checklist
<!-- Please check the boxes by putting an x in the [ ] like so: [x] -->

- [ ] I searched for existing GitHub issues
- [ ] I updated all Cordova tooling to most recent version
- [ ] I included all the necessary information above
---
name: ðŸš€ Feature Request
about: A suggestion for a new functionality

---

# Feature Request

## Motivation Behind Feature
<!-- Why should this feature be implemented? What problem does it solve? -->



## Feature Description
<!-- 
Describe your feature request in detail
Please provide any code examples or screenshots of what this feature would look like
Are there any drawbacks? Will this break anything for existing users? 
-->



## Alternatives or Workarounds
<!-- 
Describe alternatives or workarounds you are currently using 
Are there ways to do this with existing functionality?
-->


---
name: ðŸ’¬ Support Question
about: If you have a question, please check out our Slack or StackOverflow!

---

<!------------^ Click "Preview" for a nicer view! -->

Apache Cordova uses GitHub Issues as a feature request and bug tracker _only_.
For usage and support questions, please check out the resources below. Thanks!

---

You can get answers to your usage and support questions about **Apache Cordova** on:

* Slack Community Chat: https://cordova.slack.com (you can sign-up at http://slack.cordova.io/)
* StackOverflow: https://stackoverflow.com/questions/tagged/cordova using the tag `cordova`

---

If you are using a tool that uses Cordova internally, like e.g. Ionic, check their support channels:

* **Ionic Framework**
  * [Ionic Community Forum](https://forum.ionicframework.com/)
  * [Ionic Worldwide Slack](https://ionicworldwide.herokuapp.com/)
* **PhoneGap**
  * [PhoneGap Developer Community](https://forums.adobe.com/community/phonegap)
Copyright Node.js contributors. All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
diff --git a/lib/util.js b/lib/util.js
index a03e874..9074e8e 100644
--- a/lib/util.js
+++ b/lib/util.js
@@ -19,430 +19,6 @@
 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 // USE OR OTHER DEALINGS IN THE SOFTWARE.

-var formatRegExp = /%[sdj%]/g;
-exports.format = function(f) {
-  if (!isString(f)) {
-    var objects = [];
-    for (var i = 0; i < arguments.length; i++) {
-      objects.push(inspect(arguments[i]));
-    }
-    return objects.join(' ');
-  }
-
-  var i = 1;
-  var args = arguments;
-  var len = args.length;
-  var str = String(f).replace(formatRegExp, function(x) {
-    if (x === '%%') return '%';
-    if (i >= len) return x;
-    switch (x) {
-      case '%s': return String(args[i++]);
-      case '%d': return Number(args[i++]);
-      case '%j':
-        try {
-          return JSON.stringify(args[i++]);
-        } catch (_) {
-          return '[Circular]';
-        }
-      default:
-        return x;
-    }
-  });
-  for (var x = args[i]; i < len; x = args[++i]) {
-    if (isNull(x) || !isObject(x)) {
-      str += ' ' + x;
-    } else {
-      str += ' ' + inspect(x);
-    }
-  }
-  return str;
-};
-
-
-// Mark that a method should not be used.
-// Returns a modified function which warns once by default.
-// If --no-deprecation is set, then it is a no-op.
-exports.deprecate = function(fn, msg) {
-  // Allow for deprecating things in the process of starting up.
-  if (isUndefined(global.process)) {
-    return function() {
-      return exports.deprecate(fn, msg).apply(this, arguments);
-    };
-  }
-
-  if (process.noDeprecation === true) {
-    return fn;
-  }
-
-  var warned = false;
-  function deprecated() {
-    if (!warned) {
-      if (process.throwDeprecation) {
-        throw new Error(msg);
-      } else if (process.traceDeprecation) {
-        console.trace(msg);
-      } else {
-        console.error(msg);
-      }
-      warned = true;
-    }
-    return fn.apply(this, arguments);
-  }
-
-  return deprecated;
-};
-
-
-var debugs = {};
-var debugEnviron;
-exports.debuglog = function(set) {
-  if (isUndefined(debugEnviron))
-    debugEnviron = process.env.NODE_DEBUG || '';
-  set = set.toUpperCase();
-  if (!debugs[set]) {
-    if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
-      var pid = process.pid;
-      debugs[set] = function() {
-        var msg = exports.format.apply(exports, arguments);
-        console.error('%s %d: %s', set, pid, msg);
-      };
-    } else {
-      debugs[set] = function() {};
-    }
-  }
-  return debugs[set];
-};
-
-
-/**
- * Echos the value of a value. Trys to print the value out
- * in the best way possible given the different types.
- *
- * @param {Object} obj The object to print out.
- * @param {Object} opts Optional options object that alters the output.
- */
-/* legacy: obj, showHidden, depth, colors*/
-function inspect(obj, opts) {
-  // default options
-  var ctx = {
-    seen: [],
-    stylize: stylizeNoColor
-  };
-  // legacy...
-  if (arguments.length >= 3) ctx.depth = arguments[2];
-  if (arguments.length >= 4) ctx.colors = arguments[3];
-  if (isBoolean(opts)) {
-    // legacy...
-    ctx.showHidden = opts;
-  } else if (opts) {
-    // got an "options" object
-    exports._extend(ctx, opts);
-  }
-  // set default options
-  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
-  if (isUndefined(ctx.depth)) ctx.depth = 2;
-  if (isUndefined(ctx.colors)) ctx.colors = false;
-  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
-  if (ctx.colors) ctx.stylize = stylizeWithColor;
-  return formatValue(ctx, obj, ctx.depth);
-}
-exports.inspect = inspect;
-
-
-// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
-inspect.colors = {
-  'bold' : [1, 22],
-  'italic' : [3, 23],
-  'underline' : [4, 24],
-  'inverse' : [7, 27],
-  'white' : [37, 39],
-  'grey' : [90, 39],
-  'black' : [30, 39],
-  'blue' : [34, 39],
-  'cyan' : [36, 39],
-  'green' : [32, 39],
-  'magenta' : [35, 39],
-  'red' : [31, 39],
-  'yellow' : [33, 39]
-};
-
-// Don't use 'blue' not visible on cmd.exe
-inspect.styles = {
-  'special': 'cyan',
-  'number': 'yellow',
-  'boolean': 'yellow',
-  'undefined': 'grey',
-  'null': 'bold',
-  'string': 'green',
-  'date': 'magenta',
-  // "name": intentionally not styling
-  'regexp': 'red'
-};
-
-
-function stylizeWithColor(str, styleType) {
-  var style = inspect.styles[styleType];
-
-  if (style) {
-    return '\u001b[' + inspect.colors[style][0] + 'm' + str +
-           '\u001b[' + inspect.colors[style][1] + 'm';
-  } else {
-    return str;
-  }
-}
-
-
-function stylizeNoColor(str, styleType) {
-  return str;
-}
-
-
-function arrayToHash(array) {
-  var hash = {};
-
-  array.forEach(function(val, idx) {
-    hash[val] = true;
-  });
-
-  return hash;
-}
-
-
-function formatValue(ctx, value, recurseTimes) {
-  // Provide a hook for user-specified inspect functions.
-  // Check that value is an object with an inspect function on it
-  if (ctx.customInspect &&
-      value &&
-      isFunction(value.inspect) &&
-      // Filter out the util module, it's inspect function is special
-      value.inspect !== exports.inspect &&
-      // Also filter out any prototype objects using the circular check.
-      !(value.constructor && value.constructor.prototype === value)) {
-    var ret = value.inspect(recurseTimes, ctx);
-    if (!isString(ret)) {
-      ret = formatValue(ctx, ret, recurseTimes);
-    }
-    return ret;
-  }
-
-  // Primitive types cannot have properties
-  var primitive = formatPrimitive(ctx, value);
-  if (primitive) {
-    return primitive;
-  }
-
-  // Look up the keys of the object.
-  var keys = Object.keys(value);
-  var visibleKeys = arrayToHash(keys);
-
-  if (ctx.showHidden) {
-    keys = Object.getOwnPropertyNames(value);
-  }
-
-  // Some type of object without properties can be shortcutted.
-  if (keys.length === 0) {
-    if (isFunction(value)) {
-      var name = value.name ? ': ' + value.name : '';
-      return ctx.stylize('[Function' + name + ']', 'special');
-    }
-    if (isRegExp(value)) {
-      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
-    }
-    if (isDate(value)) {
-      return ctx.stylize(Date.prototype.toString.call(value), 'date');
-    }
-    if (isError(value)) {
-      return formatError(value);
-    }
-  }
-
-  var base = '', array = false, braces = ['{', '}'];
-
-  // Make Array say that they are Array
-  if (isArray(value)) {
-    array = true;
-    braces = ['[', ']'];
-  }
-
-  // Make functions say that they are functions
-  if (isFunction(value)) {
-    var n = value.name ? ': ' + value.name : '';
-    base = ' [Function' + n + ']';
-  }
-
-  // Make RegExps say that they are RegExps
-  if (isRegExp(value)) {
-    base = ' ' + RegExp.prototype.toString.call(value);
-  }
-
-  // Make dates with properties first say the date
-  if (isDate(value)) {
-    base = ' ' + Date.prototype.toUTCString.call(value);
-  }
-
-  // Make error with message first say the error
-  if (isError(value)) {
-    base = ' ' + formatError(value);
-  }
-
-  if (keys.length === 0 && (!array || value.length == 0)) {
-    return braces[0] + base + braces[1];
-  }
-
-  if (recurseTimes < 0) {
-    if (isRegExp(value)) {
-      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
-    } else {
-      return ctx.stylize('[Object]', 'special');
-    }
-  }
-
-  ctx.seen.push(value);
-
-  var output;
-  if (array) {
-    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
-  } else {
-    output = keys.map(function(key) {
-      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
-    });
-  }
-
-  ctx.seen.pop();
-
-  return reduceToSingleString(output, base, braces);
-}
-
-
-function formatPrimitive(ctx, value) {
-  if (isUndefined(value))
-    return ctx.stylize('undefined', 'undefined');
-  if (isString(value)) {
-    var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
-                                             .replace(/'/g, "\\'")
-                                             .replace(/\\"/g, '"') + '\'';
-    return ctx.stylize(simple, 'string');
-  }
-  if (isNumber(value)) {
-    // Format -0 as '-0'. Strict equality won't distinguish 0 from -0,
-    // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 .
-    if (value === 0 && 1 / value < 0)
-      return ctx.stylize('-0', 'number');
-    return ctx.stylize('' + value, 'number');
-  }
-  if (isBoolean(value))
-    return ctx.stylize('' + value, 'boolean');
-  // For some reason typeof null is "object", so special case here.
-  if (isNull(value))
-    return ctx.stylize('null', 'null');
-}
-
-
-function formatError(value) {
-  return '[' + Error.prototype.toString.call(value) + ']';
-}
-
-
-function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
-  var output = [];
-  for (var i = 0, l = value.length; i < l; ++i) {
-    if (hasOwnProperty(value, String(i))) {
-      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
-          String(i), true));
-    } else {
-      output.push('');
-    }
-  }
-  keys.forEach(function(key) {
-    if (!key.match(/^\d+$/)) {
-      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
-          key, true));
-    }
-  });
-  return output;
-}
-
-
-function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
-  var name, str, desc;
-  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
-  if (desc.get) {
-    if (desc.set) {
-      str = ctx.stylize('[Getter/Setter]', 'special');
-    } else {
-      str = ctx.stylize('[Getter]', 'special');
-    }
-  } else {
-    if (desc.set) {
-      str = ctx.stylize('[Setter]', 'special');
-    }
-  }
-  if (!hasOwnProperty(visibleKeys, key)) {
-    name = '[' + key + ']';
-  }
-  if (!str) {
-    if (ctx.seen.indexOf(desc.value) < 0) {
-      if (isNull(recurseTimes)) {
-        str = formatValue(ctx, desc.value, null);
-      } else {
-        str = formatValue(ctx, desc.value, recurseTimes - 1);
-      }
-      if (str.indexOf('\n') > -1) {
-        if (array) {
-          str = str.split('\n').map(function(line) {
-            return '  ' + line;
-          }).join('\n').substr(2);
-        } else {
-          str = '\n' + str.split('\n').map(function(line) {
-            return '   ' + line;
-          }).join('\n');
-        }
-      }
-    } else {
-      str = ctx.stylize('[Circular]', 'special');
-    }
-  }
-  if (isUndefined(name)) {
-    if (array && key.match(/^\d+$/)) {
-      return str;
-    }
-    name = JSON.stringify('' + key);
-    if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
-      name = name.substr(1, name.length - 2);
-      name = ctx.stylize(name, 'name');
-    } else {
-      name = name.replace(/'/g, "\\'")
-                 .replace(/\\"/g, '"')
-                 .replace(/(^"|"$)/g, "'");
-      name = ctx.stylize(name, 'string');
-    }
-  }
-
-  return name + ': ' + str;
-}
-
-
-function reduceToSingleString(output, base, braces) {
-  var numLinesEst = 0;
-  var length = output.reduce(function(prev, cur) {
-    numLinesEst++;
-    if (cur.indexOf('\n') >= 0) numLinesEst++;
-    return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
-  }, 0);
-
-  if (length > 60) {
-    return braces[0] +
-           (base === '' ? '' : base + '\n ') +
-           ' ' +
-           output.join(',\n  ') +
-           ' ' +
-           braces[1];
-  }
-
-  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
-}
-
-
 // NOTE: These type checking functions intentionally don't use `instanceof`
 // because it is fragile and can be easily faked with `Object.create()`.
 function isArray(ar) {
@@ -522,166 +98,10 @@ function isPrimitive(arg) {
 exports.isPrimitive = isPrimitive;

 function isBuffer(arg) {
-  return arg instanceof Buffer;
+  return Buffer.isBuffer(arg);
 }
 exports.isBuffer = isBuffer;

 function objectToString(o) {
   return Object.prototype.toString.call(o);
-}
-
-
-function pad(n) {
-  return n < 10 ? '0' + n.toString(10) : n.toString(10);
-}
-
-
-var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
-              'Oct', 'Nov', 'Dec'];
-
-// 26 Feb 16:19:34
-function timestamp() {
-  var d = new Date();
-  var time = [pad(d.getHours()),
-              pad(d.getMinutes()),
-              pad(d.getSeconds())].join(':');
-  return [d.getDate(), months[d.getMonth()], time].join(' ');
-}
-
-
-// log is just a thin wrapper to console.log that prepends a timestamp
-exports.log = function() {
-  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
-};
-
-
-/**
- * Inherit the prototype methods from one constructor into another.
- *
- * The Function.prototype.inherits from lang.js rewritten as a standalone
- * function (not on Function.prototype). NOTE: If this file is to be loaded
- * during bootstrapping this function needs to be rewritten using some native
- * functions as prototype setup using normal JavaScript does not work as
- * expected during bootstrapping (see mirror.js in r114903).
- *
- * @param {function} ctor Constructor function which needs to inherit the
- *     prototype.
- * @param {function} superCtor Constructor function to inherit prototype from.
- */
-exports.inherits = function(ctor, superCtor) {
-  ctor.super_ = superCtor;
-  ctor.prototype = Object.create(superCtor.prototype, {
-    constructor: {
-      value: ctor,
-      enumerable: false,
-      writable: true,
-      configurable: true
-    }
-  });
-};
-
-exports._extend = function(origin, add) {
-  // Don't do anything if add isn't an object
-  if (!add || !isObject(add)) return origin;
-
-  var keys = Object.keys(add);
-  var i = keys.length;
-  while (i--) {
-    origin[keys[i]] = add[keys[i]];
-  }
-  return origin;
-};
-
-function hasOwnProperty(obj, prop) {
-  return Object.prototype.hasOwnProperty.call(obj, prop);
-}
-
-
-// Deprecated old stuff.
-
-exports.p = exports.deprecate(function() {
-  for (var i = 0, len = arguments.length; i < len; ++i) {
-    console.error(exports.inspect(arguments[i]));
-  }
-}, 'util.p: Use console.error() instead');
-
-
-exports.exec = exports.deprecate(function() {
-  return require('child_process').exec.apply(this, arguments);
-}, 'util.exec is now called `child_process.exec`.');
-
-
-exports.print = exports.deprecate(function() {
-  for (var i = 0, len = arguments.length; i < len; ++i) {
-    process.stdout.write(String(arguments[i]));
-  }
-}, 'util.print: Use console.log instead');
-
-
-exports.puts = exports.deprecate(function() {
-  for (var i = 0, len = arguments.length; i < len; ++i) {
-    process.stdout.write(arguments[i] + '\n');
-  }
-}, 'util.puts: Use console.log instead');
-
-
-exports.debug = exports.deprecate(function(x) {
-  process.stderr.write('DEBUG: ' + x + '\n');
-}, 'util.debug: Use console.error instead');
-
-
-exports.error = exports.deprecate(function(x) {
-  for (var i = 0, len = arguments.length; i < len; ++i) {
-    process.stderr.write(arguments[i] + '\n');
-  }
-}, 'util.error: Use console.error instead');
-
-
-exports.pump = exports.deprecate(function(readStream, writeStream, callback) {
-  var callbackCalled = false;
-
-  function call(a, b, c) {
-    if (callback && !callbackCalled) {
-      callback(a, b, c);
-      callbackCalled = true;
-    }
-  }
-
-  readStream.addListener('data', function(chunk) {
-    if (writeStream.write(chunk) === false) readStream.pause();
-  });
-
-  writeStream.addListener('drain', function() {
-    readStream.resume();
-  });
-
-  readStream.addListener('end', function() {
-    writeStream.end();
-  });
-
-  readStream.addListener('close', function() {
-    call();
-  });
-
-  readStream.addListener('error', function(err) {
-    writeStream.end();
-    call(err);
-  });
-
-  writeStream.addListener('error', function(err) {
-    readStream.destroy();
-    call(err);
-  });
-}, 'util.pump(): Use readableStream.pipe() instead');
-
-
-var uv;
-exports._errnoException = function(err, syscall) {
-  if (isUndefined(uv)) uv = process.binding('uv');
-  var errname = uv.errname(err);
-  var e = new Error(syscall + ' ' + errname);
-  e.code = errname;
-  e.errno = errname;
-  e.syscall = syscall;
-  return e;
-};
+}{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "deprecated": false,
  "description": "The `util.is*` functions introduced in Node v0.12.",
  "devDependencies": {
    "tap": "^2.3.0"
  },
  "homepage": "https://github.com/isaacs/core-util-is#readme",
  "license": "MIT",
  "main": "lib/util.js",
  "name": "core-util-is",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/core-util-is.git"
  },
  "version": "1.0.2"
}// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// NOTE: These type checking functions intentionally don't use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.

function isArray(arg) {
  if (Array.isArray) {
    return Array.isArray(arg);
  }
  return objectToString(arg) === '[object Array]';
}
exports.isArray = isArray;

function isBoolean(arg) {
  return typeof arg === 'boolean';
}
exports.isBoolean = isBoolean;

function isNull(arg) {
  return arg === null;
}
exports.isNull = isNull;

function isNullOrUndefined(arg) {
  return arg == null;
}
exports.isNullOrUndefined = isNullOrUndefined;

function isNumber(arg) {
  return typeof arg === 'number';
}
exports.isNumber = isNumber;

function isString(arg) {
  return typeof arg === 'string';
}
exports.isString = isString;

function isSymbol(arg) {
  return typeof arg === 'symbol';
}
exports.isSymbol = isSymbol;

function isUndefined(arg) {
  return arg === void 0;
}
exports.isUndefined = isUndefined;

function isRegExp(re) {
  return objectToString(re) === '[object RegExp]';
}
exports.isRegExp = isRegExp;

function isObject(arg) {
  return typeof arg === 'object' && arg !== null;
}
exports.isObject = isObject;

function isDate(d) {
  return objectToString(d) === '[object Date]';
}
exports.isDate = isDate;

function isError(e) {
  return (objectToString(e) === '[object Error]' || e instanceof Error);
}
exports.isError = isError;

function isFunction(arg) {
  return typeof arg === 'function';
}
exports.isFunction = isFunction;

function isPrimitive(arg) {
  return arg === null ||
         typeof arg === 'boolean' ||
         typeof arg === 'number' ||
         typeof arg === 'string' ||
         typeof arg === 'symbol' ||  // ES6 symbol
         typeof arg === 'undefined';
}
exports.isPrimitive = isPrimitive;

exports.isBuffer = Buffer.isBuffer;

function objectToString(o) {
  return Object.prototype.toString.call(o);
}
The MIT License (MIT)

Copyright (c) 2018 Made With MOXY Lda <hello@moxy.studio>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'use strict';

const cp = require('child_process');
const parse = require('./lib/parse');
const enoent = require('./lib/enoent');

function spawn(command, args, options) {
    // Parse the arguments
    const parsed = parse(command, args, options);

    // Spawn the child process
    const spawned = cp.spawn(parsed.command, parsed.args, parsed.options);

    // Hook into child process "exit" event to emit an error if the command
    // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
    enoent.hookChildProcess(spawned, parsed);

    return spawned;
}

function spawnSync(command, args, options) {
    // Parse the arguments
    const parsed = parse(command, args, options);

    // Spawn the child process
    const result = cp.spawnSync(parsed.command, parsed.args, parsed.options);

    // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
    result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);

    return result;
}

module.exports = spawn;
module.exports.spawn = spawn;
module.exports.sync = spawnSync;

module.exports._parse = parse;
module.exports._enoent = enoent;
{
  "author": {
    "name": "AndrÃ© Cruz",
    "email": "andre@moxy.studio"
  },
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "dependencies": {
    "nice-try": "^1.0.4",
    "path-key": "^2.0.1",
    "semver": "^5.5.0",
    "shebang-command": "^1.2.0",
    "which": "^1.2.9"
  },
  "deprecated": false,
  "description": "Cross platform child_process#spawn and child_process#spawnSync",
  "devDependencies": {
    "@commitlint/cli": "^6.0.0",
    "@commitlint/config-conventional": "^6.0.2",
    "babel-core": "^6.26.0",
    "babel-jest": "^22.1.0",
    "babel-preset-moxy": "^2.2.1",
    "eslint": "^4.3.0",
    "eslint-config-moxy": "^5.0.0",
    "husky": "^0.14.3",
    "jest": "^22.0.0",
    "lint-staged": "^7.0.0",
    "mkdirp": "^0.5.1",
    "regenerator-runtime": "^0.11.1",
    "rimraf": "^2.6.2",
    "standard-version": "^4.2.0"
  },
  "engines": {
    "node": ">=4.8"
  },
  "files": [
    "lib"
  ],
  "homepage": "https://github.com/moxystudio/node-cross-spawn",
  "license": "MIT",
  "lint-staged": {
    "*.js": [
      "eslint --fix",
      "git add"
    ]
  },
  "main": "index.js",
  "name": "cross-spawn",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/moxystudio/node-cross-spawn.git"
  },
  "standard-version": {
    "scripts": {
      "posttag": "git push --follow-tags origin master && npm publish"
    }
  },
  "version": "6.0.5"
}'use strict';

const isWin = process.platform === 'win32';

function notFoundError(original, syscall) {
    return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), {
        code: 'ENOENT',
        errno: 'ENOENT',
        syscall: `${syscall} ${original.command}`,
        path: original.command,
        spawnargs: original.args,
    });
}

function hookChildProcess(cp, parsed) {
    if (!isWin) {
        return;
    }

    const originalEmit = cp.emit;

    cp.emit = function (name, arg1) {
        // If emitting "exit" event and exit code is 1, we need to check if
        // the command exists and emit an "error" instead
        // See https://github.com/IndigoUnited/node-cross-spawn/issues/16
        if (name === 'exit') {
            const err = verifyENOENT(arg1, parsed, 'spawn');

            if (err) {
                return originalEmit.call(cp, 'error', err);
            }
        }

        return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params
    };
}

function verifyENOENT(status, parsed) {
    if (isWin && status === 1 && !parsed.file) {
        return notFoundError(parsed.original, 'spawn');
    }

    return null;
}

function verifyENOENTSync(status, parsed) {
    if (isWin && status === 1 && !parsed.file) {
        return notFoundError(parsed.original, 'spawnSync');
    }

    return null;
}

module.exports = {
    hookChildProcess,
    verifyENOENT,
    verifyENOENTSync,
    notFoundError,
};
'use strict';

const path = require('path');
const niceTry = require('nice-try');
const resolveCommand = require('./util/resolveCommand');
const escape = require('./util/escape');
const readShebang = require('./util/readShebang');
const semver = require('semver');

const isWin = process.platform === 'win32';
const isExecutableRegExp = /\.(?:com|exe)$/i;
const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;

// `options.shell` is supported in Node ^4.8.0, ^5.7.0 and >= 6.0.0
const supportsShellOption = niceTry(() => semver.satisfies(process.version, '^4.8.0 || ^5.7.0 || >= 6.0.0', true)) || false;

function detectShebang(parsed) {
    parsed.file = resolveCommand(parsed);

    const shebang = parsed.file && readShebang(parsed.file);

    if (shebang) {
        parsed.args.unshift(parsed.file);
        parsed.command = shebang;

        return resolveCommand(parsed);
    }

    return parsed.file;
}

function parseNonShell(parsed) {
    if (!isWin) {
        return parsed;
    }

    // Detect & add support for shebangs
    const commandFile = detectShebang(parsed);

    // We don't need a shell if the command filename is an executable
    const needsShell = !isExecutableRegExp.test(commandFile);

    // If a shell is required, use cmd.exe and take care of escaping everything correctly
    // Note that `forceShell` is an hidden option used only in tests
    if (parsed.options.forceShell || needsShell) {
        // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/`
        // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument
        // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called,
        // we need to double escape them
        const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile);

        // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar)
        // This is necessary otherwise it will always fail with ENOENT in those cases
        parsed.command = path.normalize(parsed.command);

        // Escape command & arguments
        parsed.command = escape.command(parsed.command);
        parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars));

        const shellCommand = [parsed.command].concat(parsed.args).join(' ');

        parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`];
        parsed.command = process.env.comspec || 'cmd.exe';
        parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped
    }

    return parsed;
}

function parseShell(parsed) {
    // If node supports the shell option, there's no need to mimic its behavior
    if (supportsShellOption) {
        return parsed;
    }

    // Mimic node shell option
    // See https://github.com/nodejs/node/blob/b9f6a2dc059a1062776133f3d4fd848c4da7d150/lib/child_process.js#L335
    const shellCommand = [parsed.command].concat(parsed.args).join(' ');

    if (isWin) {
        parsed.command = typeof parsed.options.shell === 'string' ? parsed.options.shell : process.env.comspec || 'cmd.exe';
        parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`];
        parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped
    } else {
        if (typeof parsed.options.shell === 'string') {
            parsed.command = parsed.options.shell;
        } else if (process.platform === 'android') {
            parsed.command = '/system/bin/sh';
        } else {
            parsed.command = '/bin/sh';
        }

        parsed.args = ['-c', shellCommand];
    }

    return parsed;
}

function parse(command, args, options) {
    // Normalize arguments, similar to nodejs
    if (args && !Array.isArray(args)) {
        options = args;
        args = null;
    }

    args = args ? args.slice(0) : []; // Clone array to avoid changing the original
    options = Object.assign({}, options); // Clone object to avoid changing the original

    // Build our parsed object
    const parsed = {
        command,
        args,
        options,
        file: undefined,
        original: {
            command,
            args,
        },
    };

    // Delegate further parsing to shell or non-shell
    return options.shell ? parseShell(parsed) : parseNonShell(parsed);
}

module.exports = parse;
'use strict';

// See http://www.robvanderwoude.com/escapechars.php
const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g;

function escapeCommand(arg) {
    // Escape meta chars
    arg = arg.replace(metaCharsRegExp, '^$1');

    return arg;
}

function escapeArgument(arg, doubleEscapeMetaChars) {
    // Convert to string
    arg = `${arg}`;

    // Algorithm below is based on https://qntm.org/cmd

    // Sequence of backslashes followed by a double quote:
    // double up all the backslashes and escape the double quote
    arg = arg.replace(/(\\*)"/g, '$1$1\\"');

    // Sequence of backslashes followed by the end of the string
    // (which will become a double quote later):
    // double up all the backslashes
    arg = arg.replace(/(\\*)$/, '$1$1');

    // All other backslashes occur literally

    // Quote the whole thing:
    arg = `"${arg}"`;

    // Escape meta chars
    arg = arg.replace(metaCharsRegExp, '^$1');

    // Double escape meta chars if necessary
    if (doubleEscapeMetaChars) {
        arg = arg.replace(metaCharsRegExp, '^$1');
    }

    return arg;
}

module.exports.command = escapeCommand;
module.exports.argument = escapeArgument;
'use strict';

const fs = require('fs');
const shebangCommand = require('shebang-command');

function readShebang(command) {
    // Read the first 150 bytes from the file
    const size = 150;
    let buffer;

    if (Buffer.alloc) {
        // Node.js v4.5+ / v5.10+
        buffer = Buffer.alloc(size);
    } else {
        // Old Node.js API
        buffer = new Buffer(size);
        buffer.fill(0); // zero-fill
    }

    let fd;

    try {
        fd = fs.openSync(command, 'r');
        fs.readSync(fd, buffer, 0, size, 0);
        fs.closeSync(fd);
    } catch (e) { /* Empty */ }

    // Attempt to extract shebang (null is returned if not a shebang)
    return shebangCommand(buffer.toString());
}

module.exports = readShebang;
'use strict';

const path = require('path');
const which = require('which');
const pathKey = require('path-key')();

function resolveCommandAttempt(parsed, withoutPathExt) {
    const cwd = process.cwd();
    const hasCustomCwd = parsed.options.cwd != null;

    // If a custom `cwd` was specified, we need to change the process cwd
    // because `which` will do stat calls but does not support a custom cwd
    if (hasCustomCwd) {
        try {
            process.chdir(parsed.options.cwd);
        } catch (err) {
            /* Empty */
        }
    }

    let resolved;

    try {
        resolved = which.sync(parsed.command, {
            path: (parsed.options.env || process.env)[pathKey],
            pathExt: withoutPathExt ? path.delimiter : undefined,
        });
    } catch (e) {
        /* Empty */
    } finally {
        process.chdir(cwd);
    }

    // If we successfully resolved, ensure that an absolute path is returned
    // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it
    if (resolved) {
        resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved);
    }

    return resolved;
}

function resolveCommand(parsed) {
    return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true);
}

module.exports = resolveCommand;
'use strict';
module.exports = function (str, sep) {
	if (typeof str !== 'string') {
		throw new TypeError('Expected a string');
	}

	sep = typeof sep === 'undefined' ? '_' : sep;

	return str
		.replace(/([a-z\d])([A-Z])/g, '$1' + sep + '$2')
		.replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + sep + '$2')
		.toLowerCase();
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Convert a camelized string into a lowercased one with a custom separator: unicornRainbow â†’ unicorn_rainbow",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/decamelize#readme",
  "license": "MIT",
  "name": "decamelize",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/decamelize.git"
  },
  "version": "1.2.0"
}The MIT License (MIT)

Copyright (c) 2015 Desmond Brand (dmnd@desmondbrand.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Desmond Brand",
    "email": "dmnd@desmondbrand.com",
    "url": "http://desmondbrand.com"
  },
  "deprecated": false,
  "description": "An ES6 string tag that strips indentation from multi-line strings",
  "devDependencies": {
    "babel-cli": "^6.22.2",
    "babel-preset-es2015": "^6.22.0",
    "babel-preset-es2016": "^6.22.0",
    "babel-preset-es2017": "^6.22.0",
    "eslint": "^3.14.1",
    "jest": "^18.1.0"
  },
  "files": [
    "dist/dedent.js",
    "LICENSE"
  ],
  "homepage": "https://github.com/dmnd/dedent",
  "license": "MIT",
  "main": "dist/dedent.js",
  "name": "dedent",
  "repository": {
    "type": "git",
    "url": "git://github.com/dmnd/dedent.git"
  },
  "version": "0.7.0"
}"use strict";

function dedent(strings) {

  var raw = void 0;
  if (typeof strings === "string") {
    // dedent can be used as a plain function
    raw = [strings];
  } else {
    raw = strings.raw;
  }

  // first, perform interpolation
  var result = "";
  for (var i = 0; i < raw.length; i++) {
    result += raw[i].
    // join lines when there is a suppressed newline
    replace(/\\\n[ \t]*/g, "").

    // handle escaped backticks
    replace(/\\`/g, "`");

    if (i < (arguments.length <= 1 ? 0 : arguments.length - 1)) {
      result += arguments.length <= i + 1 ? undefined : arguments[i + 1];
    }
  }

  // now strip indentation
  var lines = result.split("\n");
  var mindent = null;
  lines.forEach(function (l) {
    var m = l.match(/^(\s+)\S+/);
    if (m) {
      var indent = m[1].length;
      if (!mindent) {
        // this is the first indented line
        mindent = indent;
      } else {
        mindent = Math.min(mindent, indent);
      }
    }
  });

  if (mindent !== null) {
    result = lines.map(function (l) {
      return l[0] === " " ? l.slice(mindent) : l;
    }).join("\n");
  }

  // dedent eats leading and trailing whitespace too
  result = result.trim();

  // handle escaped newlines at the end to ensure they don't get stripped too
  return result.replace(/\\n/g, "\n");
}

if (typeof module !== "undefined") {
  module.exports = dedent;
}
MIT License

Copyright (c) 2012, 2013, 2014 James Halliday <mail@substack.net>, 2009 Thomas Robinson <280north.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var objectKeys = require('object-keys');
var isArguments = require('is-arguments');
var is = require('object-is');
var isRegex = require('is-regex');
var flags = require('regexp.prototype.flags');
var isDate = require('is-date-object');

var getTime = Date.prototype.getTime;

function deepEqual(actual, expected, options) {
  var opts = options || {};

  // 7.1. All identical values are equivalent, as determined by ===.
  if (opts.strict ? is(actual, expected) : actual === expected) {
    return true;
  }

  // 7.3. Other pairs that do not both pass typeof value == 'object', equivalence is determined by ==.
  if (!actual || !expected || (typeof actual !== 'object' && typeof expected !== 'object')) {
    return opts.strict ? is(actual, expected) : actual == expected;
  }

  /*
   * 7.4. For all other Object pairs, including Array objects, equivalence is
   * determined by having the same number of owned properties (as verified
   * with Object.prototype.hasOwnProperty.call), the same set of keys
   * (although not necessarily the same order), equivalent values for every
   * corresponding key, and an identical 'prototype' property. Note: this
   * accounts for both named and indexed properties on Arrays.
   */
  // eslint-disable-next-line no-use-before-define
  return objEquiv(actual, expected, opts);
}

function isUndefinedOrNull(value) {
  return value === null || value === undefined;
}

function isBuffer(x) {
  if (!x || typeof x !== 'object' || typeof x.length !== 'number') {
    return false;
  }
  if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {
    return false;
  }
  if (x.length > 0 && typeof x[0] !== 'number') {
    return false;
  }
  return true;
}

function objEquiv(a, b, opts) {
  /* eslint max-statements: [2, 50] */
  var i, key;
  if (typeof a !== typeof b) { return false; }
  if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) { return false; }

  // an identical 'prototype' property.
  if (a.prototype !== b.prototype) { return false; }

  if (isArguments(a) !== isArguments(b)) { return false; }

  var aIsRegex = isRegex(a);
  var bIsRegex = isRegex(b);
  if (aIsRegex !== bIsRegex) { return false; }
  if (aIsRegex || bIsRegex) {
    return a.source === b.source && flags(a) === flags(b);
  }

  if (isDate(a) && isDate(b)) {
    return getTime.call(a) === getTime.call(b);
  }

  var aIsBuffer = isBuffer(a);
  var bIsBuffer = isBuffer(b);
  if (aIsBuffer !== bIsBuffer) { return false; }
  if (aIsBuffer || bIsBuffer) { // && would work too, because both are true or both false here
    if (a.length !== b.length) { return false; }
    for (i = 0; i < a.length; i++) {
      if (a[i] !== b[i]) { return false; }
    }
    return true;
  }

  if (typeof a !== typeof b) { return false; }

  try {
    var ka = objectKeys(a);
    var kb = objectKeys(b);
  } catch (e) { // happens when one is a string literal and the other isn't
    return false;
  }
  // having the same number of owned properties (keys incorporates hasOwnProperty)
  if (ka.length !== kb.length) { return false; }

  // the same set of keys (although not necessarily the same order),
  ka.sort();
  kb.sort();
  // ~~~cheap key test
  for (i = ka.length - 1; i >= 0; i--) {
    if (ka[i] != kb[i]) { return false; }
  }
  // equivalent values for every corresponding key, and ~~~possibly expensive deep test
  for (i = ka.length - 1; i >= 0; i--) {
    key = ka[i];
    if (!deepEqual(a[key], b[key], opts)) { return false; }
  }

  return true;
}

module.exports = deepEqual;
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false
  },
  "dependencies": {
    "is-arguments": "^1.0.4",
    "is-date-object": "^1.0.1",
    "is-regex": "^1.0.4",
    "object-is": "^1.0.1",
    "object-keys": "^1.1.1",
    "regexp.prototype.flags": "^1.2.0"
  },
  "deprecated": false,
  "description": "node's assert.deepEqual algorithm",
  "devDependencies": {
    "@ljharb/eslint-config": "^15.0.1",
    "auto-changelog": "^1.16.2",
    "eslint": "^6.6.0",
    "safe-publish-latest": "^1.1.4",
    "tape": "^4.11.0"
  },
  "directories": {
    "lib": ".",
    "example": "example",
    "test": "test"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/substack/node-deep-equal#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "deep-equal",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/substack/node-deep-equal.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": {
      "ie": [
        6,
        7,
        8,
        9
      ],
      "ff": [
        3.5,
        10,
        15
      ],
      "chrome": [
        10,
        22
      ],
      "safari": [
        5.1
      ],
      "opera": [
        12
      ]
    }
  },
  "version": "1.1.1"
}module.exports = require('is-arguments');
module.exports = require('object-keys');
The MIT License (MIT)

Copyright (c) 2013-2018, Viacheslav Lotsmanov

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
module.exports = require('./lib/deep-extend');
{
  "author": {
    "name": "Viacheslav Lotsmanov",
    "email": "lotsmanov89@gmail.com"
  },
  "deprecated": false,
  "description": "Recursive object extending",
  "devDependencies": {
    "mocha": "5.2.0",
    "should": "13.2.1"
  },
  "engines": {
    "node": ">=4.0.0"
  },
  "files": [
    "index.js",
    "lib/"
  ],
  "homepage": "https://github.com/unclechu/node-deep-extend",
  "license": "MIT",
  "licenses": [
    {
      "type": "MIT",
      "url": "https://raw.githubusercontent.com/unclechu/node-deep-extend/master/LICENSE"
    }
  ],
  "main": "lib/deep-extend.js",
  "name": "deep-extend",
  "repository": {
    "type": "git",
    "url": "git://github.com/unclechu/node-deep-extend.git"
  },
  "version": "0.6.0"
}/*!
 * @description Recursive object extending
 * @author Viacheslav Lotsmanov <lotsmanov89@gmail.com>
 * @license MIT
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013-2018 Viacheslav Lotsmanov
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

'use strict';

function isSpecificValue(val) {
	return (
		val instanceof Buffer
		|| val instanceof Date
		|| val instanceof RegExp
	) ? true : false;
}

function cloneSpecificValue(val) {
	if (val instanceof Buffer) {
		var x = Buffer.alloc
			? Buffer.alloc(val.length)
			: new Buffer(val.length);
		val.copy(x);
		return x;
	} else if (val instanceof Date) {
		return new Date(val.getTime());
	} else if (val instanceof RegExp) {
		return new RegExp(val);
	} else {
		throw new Error('Unexpected situation');
	}
}

/**
 * Recursive cloning array.
 */
function deepCloneArray(arr) {
	var clone = [];
	arr.forEach(function (item, index) {
		if (typeof item === 'object' && item !== null) {
			if (Array.isArray(item)) {
				clone[index] = deepCloneArray(item);
			} else if (isSpecificValue(item)) {
				clone[index] = cloneSpecificValue(item);
			} else {
				clone[index] = deepExtend({}, item);
			}
		} else {
			clone[index] = item;
		}
	});
	return clone;
}

function safeGetProperty(object, property) {
	return property === '__proto__' ? undefined : object[property];
}

/**
 * Extening object that entered in first argument.
 *
 * Returns extended object or false if have no target object or incorrect type.
 *
 * If you wish to clone source object (without modify it), just use empty new
 * object as first argument, like this:
 *   deepExtend({}, yourObj_1, [yourObj_N]);
 */
var deepExtend = module.exports = function (/*obj_1, [obj_2], [obj_N]*/) {
	if (arguments.length < 1 || typeof arguments[0] !== 'object') {
		return false;
	}

	if (arguments.length < 2) {
		return arguments[0];
	}

	var target = arguments[0];

	// convert arguments to array and cut off target object
	var args = Array.prototype.slice.call(arguments, 1);

	var val, src, clone;

	args.forEach(function (obj) {
		// skip argument if isn't an object, is null, or is an array
		if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
			return;
		}

		Object.keys(obj).forEach(function (key) {
			src = safeGetProperty(target, key); // source value
			val = safeGetProperty(obj, key); // new value

			// recursion prevention
			if (val === target) {
				return;

			/**
			 * if new value isn't object then just overwrite by new value
			 * instead of extending.
			 */
			} else if (typeof val !== 'object' || val === null) {
				target[key] = val;
				return;

			// just clone arrays (and recursive clone objects inside)
			} else if (Array.isArray(val)) {
				target[key] = deepCloneArray(val);
				return;

			// custom cloning and overwrite for specific objects
			} else if (isSpecificValue(val)) {
				target[key] = cloneSpecificValue(val);
				return;

			// overwrite by new value if source isn't object or array
			} else if (typeof src !== 'object' || src === null || Array.isArray(src)) {
				target[key] = deepExtend({}, val);
				return;

			// source value and new value is objects both, extending...
			} else {
				target[key] = deepExtend(src, val);
				return;
			}
		});
	});

	return target;
};
root = true

[*]
indent_style = tab;
insert_final_newline = true;
quote_type = auto;
space_after_anonymous_functions = true;
space_after_control_statements = true;
spaces_around_operators = true;
trim_trailing_whitespace = true;
spaces_in_brackets = false;
end_of_line = lf;

{
	"es3": true,

	"additionalRules": [],

	"requireSemicolons": true,

	"disallowMultipleSpaces": true,

	"disallowIdentifierNames": [],

	"requireCurlyBraces": {
		"allExcept": [],
		"keywords": ["if", "else", "for", "while", "do", "try", "catch"]
	},

	"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],

	"disallowSpaceAfterKeywords": [],

	"disallowSpaceBeforeComma": true,
	"disallowSpaceAfterComma": false,
	"disallowSpaceBeforeSemicolon": true,

	"disallowNodeTypes": [
		"DebuggerStatement",
		"LabeledStatement",
		"SwitchCase",
		"SwitchStatement",
		"WithStatement"
	],

	"requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },

	"requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
	"requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
	"disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
	"requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
	"disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },

	"requireSpaceBetweenArguments": true,

	"disallowSpacesInsideParentheses": true,

	"disallowSpacesInsideArrayBrackets": true,

	"disallowQuotedKeysInObjects": { "allExcept": ["reserved"] },

	"disallowSpaceAfterObjectKeys": true,

	"requireCommaBeforeLineBreak": true,

	"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
	"requireSpaceAfterPrefixUnaryOperators": [],

	"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
	"requireSpaceBeforePostfixUnaryOperators": [],

	"disallowSpaceBeforeBinaryOperators": [],
	"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],

	"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
	"disallowSpaceAfterBinaryOperators": [],

	"disallowImplicitTypeConversion": ["binary", "string"],

	"disallowKeywords": ["with", "eval"],

	"requireKeywordsOnNewLine": [],
	"disallowKeywordsOnNewLine": ["else"],

	"requireLineFeedAtFileEnd": true,

	"disallowTrailingWhitespace": true,

	"disallowTrailingComma": true,

	"excludeFiles": ["node_modules/**", "vendor/**"],

	"disallowMultipleLineStrings": true,

	"requireDotNotation": { "allExcept": ["keywords"] },

	"requireParenthesesAroundIIFE": true,

	"validateLineBreaks": "LF",

	"validateQuoteMarks": {
		"escape": true,
		"mark": "'"
	},

	"disallowOperatorBeforeLineBreak": [],

	"requireSpaceBeforeKeywords": [
		"do",
		"for",
		"if",
		"else",
		"switch",
		"case",
		"try",
		"catch",
		"finally",
		"while",
		"with",
		"return"
	],

	"validateAlignedFunctionParameters": {
		"lineBreakAfterOpeningBraces": true,
		"lineBreakBeforeClosingBraces": true
	},

	"requirePaddingNewLinesBeforeExport": true,

	"validateNewlineAfterArrayElements": {
		"maximum": 3
	},

	"requirePaddingNewLinesAfterUseStrict": true,

	"disallowArrowFunctions": true,

	"disallowMultiLineTernary": true,

	"validateOrderInObjectKeys": "asc-insensitive",

	"disallowIdenticalDestructuringNames": true,

	"disallowNestedTernaries": { "maxLevel": 1 },

	"requireSpaceAfterComma": { "allExcept": ["trailing"] },
	"requireAlignedMultilineParams": false,

	"requireSpacesInGenerator": {
		"afterStar": true
	},

	"disallowSpacesInGenerator": {
		"beforeStar": true
	},

	"disallowVar": false,

	"requireArrayDestructuring": false,

	"requireEnhancedObjectLiterals": false,

	"requireObjectDestructuring": false,

	"requireEarlyReturn": false,

	"requireCapitalizedConstructorsNew": {
		"allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
	},

	"requireImportAlphabetized": false,

	"requireSpaceBeforeObjectValues": true,
	"requireSpaceBeforeDestructuredValues": true,

	"disallowSpacesInsideTemplateStringPlaceholders": true,

	"disallowArrayDestructuringReturn": false,

	"requireNewlineBeforeSingleStatementsInIf": false,

	"disallowUnusedVariables": true,

	"requireSpacesInsideImportedObjectBraces": true,

	"requireUseStrict": true
}

The MIT License (MIT)

Copyright (C) 2015 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.'use strict';

var keys = require('object-keys');
var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';

var toStr = Object.prototype.toString;
var concat = Array.prototype.concat;
var origDefineProperty = Object.defineProperty;

var isFunction = function (fn) {
	return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
};

var arePropertyDescriptorsSupported = function () {
	var obj = {};
	try {
		origDefineProperty(obj, 'x', { enumerable: false, value: obj });
		// eslint-disable-next-line no-unused-vars, no-restricted-syntax
		for (var _ in obj) { // jscs:ignore disallowUnusedVariables
			return false;
		}
		return obj.x === obj;
	} catch (e) { /* this is IE 8. */
		return false;
	}
};
var supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported();

var defineProperty = function (object, name, value, predicate) {
	if (name in object && (!isFunction(predicate) || !predicate())) {
		return;
	}
	if (supportsDescriptors) {
		origDefineProperty(object, name, {
			configurable: true,
			enumerable: false,
			value: value,
			writable: true
		});
	} else {
		object[name] = value;
	}
};

var defineProperties = function (object, map) {
	var predicates = arguments.length > 2 ? arguments[2] : {};
	var props = keys(map);
	if (hasSymbols) {
		props = concat.call(props, Object.getOwnPropertySymbols(map));
	}
	for (var i = 0; i < props.length; i += 1) {
		defineProperty(object, props[i], map[props[i]], predicates[props[i]]);
	}
};

defineProperties.supportsDescriptors = !!supportsDescriptors;

module.exports = defineProperties;
{
  "author": {
    "name": "Jordan Harband"
  },
  "dependencies": {
    "object-keys": "^1.0.12"
  },
  "deprecated": false,
  "description": "Define multiple non-enumerable properties at once. Uses `Object.defineProperty` when available; falls back to standard assignment in older engines.",
  "devDependencies": {
    "@ljharb/eslint-config": "^13.0.0",
    "covert": "^1.1.0",
    "eslint": "^5.3.0",
    "jscs": "^3.0.7",
    "nsp": "^3.2.1",
    "tape": "^4.9.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "homepage": "https://github.com/ljharb/define-properties#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "define-properties",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/define-properties.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "1.1.3"
}This software is released under the MIT license:

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
module.exports = function () {
    for (var i = 0; i < arguments.length; i++) {
        if (arguments[i] !== undefined) return arguments[i];
    }
};
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "return the first argument that is `!== undefined`",
  "devDependencies": {
    "tape": "~3.5.0"
  },
  "directories": {
    "example": "example",
    "test": "test"
  },
  "homepage": "https://github.com/substack/defined",
  "license": "MIT",
  "main": "index.js",
  "name": "defined",
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/defined.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": {
      "ie": [
        6,
        7,
        8,
        9
      ],
      "ff": [
        3.5,
        10,
        15
      ],
      "chrome": [
        10,
        22
      ],
      "safari": [
        5.1
      ],
      "opera": [
        12
      ]
    }
  },
  "version": "1.0.0"
}Copyright (c) 2011 Debuggable Limited <felix@debuggable.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
SHELL := /bin/bash

test:
	@./test/run.js

.PHONY: test

# delayed-stream

Buffers events from a stream until you are ready to handle them.

## Installation

``` bash
npm install delayed-stream
```

## Usage

The following example shows how to write a http echo server that delays its
response by 1000 ms.

``` javascript
var DelayedStream = require('delayed-stream');
var http = require('http');

http.createServer(function(req, res) {
  var delayed = DelayedStream.create(req);

  setTimeout(function() {
    res.writeHead(200);
    delayed.pipe(res);
  }, 1000);
});
```

If you are not using `Stream#pipe`, you can also manually release the buffered
events by calling `delayedStream.resume()`:

``` javascript
var delayed = DelayedStream.create(req);

setTimeout(function() {
  // Emit all buffered events and resume underlaying source
  delayed.resume();
}, 1000);
```

## Implementation

In order to use this meta stream properly, here are a few things you should
know about the implementation.

### Event Buffering / Proxying

All events of the `source` stream are hijacked by overwriting the `source.emit`
method. Until node implements a catch-all event listener, this is the only way.

However, delayed-stream still continues to emit all events it captures on the
`source`, regardless of whether you have released the delayed stream yet or
not.

Upon creation, delayed-stream captures all `source` events and stores them in
an internal event buffer. Once `delayedStream.release()` is called, all
buffered events are emitted on the `delayedStream`, and the event buffer is
cleared. After that, delayed-stream merely acts as a proxy for the underlaying
source.

### Error handling

Error events on `source` are buffered / proxied just like any other events.
However, `delayedStream.create` attaches a no-op `'error'` listener to the
`source`. This way you only have to handle errors on the `delayedStream`
object, rather than in two places.

### Buffer limits

delayed-stream provides a `maxDataSize` property that can be used to limit
the amount of data being buffered. In order to protect you from bad `source`
streams that don't react to `source.pause()`, this feature is enabled by
default.

## API

### DelayedStream.create(source, [options])

Returns a new `delayedStream`. Available options are:

* `pauseStream`
* `maxDataSize`

The description for those properties can be found below.

### delayedStream.source

The `source` stream managed by this object. This is useful if you are
passing your `delayedStream` around, and you still want to access properties
on the `source` object.

### delayedStream.pauseStream = true

Whether to pause the underlaying `source` when calling
`DelayedStream.create()`. Modifying this property afterwards has no effect.

### delayedStream.maxDataSize = 1024 * 1024

The amount of data to buffer before emitting an `error`.

If the underlaying source is emitting `Buffer` objects, the `maxDataSize`
refers to bytes.

If the underlaying source is emitting JavaScript strings, the size refers to
characters.

If you know what you are doing, you can set this property to `Infinity` to
disable this feature. You can also modify this property during runtime.

### delayedStream.dataSize = 0

The amount of data buffered so far.

### delayedStream.readable

An ECMA5 getter that returns the value of `source.readable`.

### delayedStream.resume()

If the `delayedStream` has not been released so far, `delayedStream.release()`
is called.

In either case, `source.resume()` is called.

### delayedStream.pause()

Calls `source.pause()`.

### delayedStream.pipe(dest)

Calls `delayedStream.resume()` and then proxies the arguments to `source.pipe`.

### delayedStream.release()

Emits and clears all events that have been buffered up so far. This does not
resume the underlaying source, use `delayedStream.resume()` instead.

## License

delayed-stream is licensed under the MIT license.
{
  "author": {
    "name": "Felix GeisendÃ¶rfer",
    "email": "felix@debuggable.com",
    "url": "http://debuggable.com/"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Buffers events from a stream until you are ready to handle them.",
  "devDependencies": {
    "fake": "0.2.0",
    "far": "0.0.1"
  },
  "engines": {
    "node": ">=0.4.0"
  },
  "homepage": "https://github.com/felixge/node-delayed-stream",
  "license": "MIT",
  "main": "./lib/delayed_stream",
  "name": "delayed-stream",
  "repository": {
    "type": "git",
    "url": "git://github.com/felixge/node-delayed-stream.git"
  },
  "version": "1.0.0"
}var Stream = require('stream').Stream;
var util = require('util');

module.exports = DelayedStream;
function DelayedStream() {
  this.source = null;
  this.dataSize = 0;
  this.maxDataSize = 1024 * 1024;
  this.pauseStream = true;

  this._maxDataSizeExceeded = false;
  this._released = false;
  this._bufferedEvents = [];
}
util.inherits(DelayedStream, Stream);

DelayedStream.create = function(source, options) {
  var delayedStream = new this();

  options = options || {};
  for (var option in options) {
    delayedStream[option] = options[option];
  }

  delayedStream.source = source;

  var realEmit = source.emit;
  source.emit = function() {
    delayedStream._handleEmit(arguments);
    return realEmit.apply(source, arguments);
  };

  source.on('error', function() {});
  if (delayedStream.pauseStream) {
    source.pause();
  }

  return delayedStream;
};

Object.defineProperty(DelayedStream.prototype, 'readable', {
  configurable: true,
  enumerable: true,
  get: function() {
    return this.source.readable;
  }
});

DelayedStream.prototype.setEncoding = function() {
  return this.source.setEncoding.apply(this.source, arguments);
};

DelayedStream.prototype.resume = function() {
  if (!this._released) {
    this.release();
  }

  this.source.resume();
};

DelayedStream.prototype.pause = function() {
  this.source.pause();
};

DelayedStream.prototype.release = function() {
  this._released = true;

  this._bufferedEvents.forEach(function(args) {
    this.emit.apply(this, args);
  }.bind(this));
  this._bufferedEvents = [];
};

DelayedStream.prototype.pipe = function() {
  var r = Stream.prototype.pipe.apply(this, arguments);
  this.resume();
  return r;
};

DelayedStream.prototype._handleEmit = function(args) {
  if (this._released) {
    this.emit.apply(this, args);
    return;
  }

  if (args[0] === 'data') {
    this.dataSize += args[1].length;
    this._checkIfMaxDataSizeExceeded();
  }

  this._bufferedEvents.push(args);
};

DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {
  if (this._maxDataSizeExceeded) {
    return;
  }

  if (this.dataSize <= this.maxDataSize) {
    return;
  }

  this._maxDataSizeExceeded = true;
  var message =
    'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'
  this.emit('error', new Error(message));
};
Copyright (c) 2015, Scott Motte
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/* @flow */

(function () {
  require('./lib/main').config(
    Object.assign(
      {},
      require('./lib/env-options'),
      require('./lib/cli-options')(process.argv)
    )
  )
})()
{
  "dependencies": {},
  "deprecated": false,
  "description": "Loads environment variables from .env file",
  "devDependencies": {
    "decache": "^4.5.0",
    "flow-bin": "^0.84.0",
    "sinon": "^6.3.5",
    "standard": "^12.0.1",
    "standard-markdown": "^5.0.1",
    "tap": "^12.0.1"
  },
  "engines": {
    "node": ">=6"
  },
  "homepage": "https://github.com/motdotla/dotenv#readme",
  "license": "BSD-2-Clause",
  "main": "lib/main.js",
  "name": "dotenv",
  "repository": {
    "type": "git",
    "url": "git://github.com/motdotla/dotenv.git"
  },
  "standard": {
    "ignore": [
      "flow-typed/"
    ]
  },
  "version": "6.2.0"
}/* @flow */

const re = /^dotenv_config_(encoding|path|debug)=(.+)$/

module.exports = function optionMatcher (args /*: Array<string> */) {
  return args.reduce(function (acc, cur) {
    const matches = cur.match(re)
    if (matches) {
      acc[matches[1]] = matches[2]
    }
    return acc
  }, {})
}
/* @flow */

// ../config.js accepts options via environment variables
const options = {}

if (process.env.DOTENV_CONFIG_ENCODING) {
  options.encoding = process.env.DOTENV_CONFIG_ENCODING
}

if (process.env.DOTENV_CONFIG_PATH) {
  options.path = process.env.DOTENV_CONFIG_PATH
}

if (process.env.DOTENV_CONFIG_DEBUG) {
  options.debug = process.env.DOTENV_CONFIG_DEBUG
}

module.exports = options
/* @flow */
/*::

type DotenvParseOptions = {
  debug?: boolean
}

// keys and values from src
type DotenvParseOutput = { [string]: string }

type DotenvConfigOptions = {
  path?: string, // path to .env file
  encoding?: string, // encoding of .env file
  debug?: string // turn on logging for debugging purposes
}

type DotenvConfigOutput = {
  parsed?: DotenvParseOutput,
  error?: Error
}

*/

const fs = require('fs')
const path = require('path')

function log (message /*: string */) {
  console.log(`[dotenv][DEBUG] ${message}`)
}

// Parses src into an Object
function parse (src /*: string | Buffer */, options /*: ?DotenvParseOptions */) /*: DotenvParseOutput */ {
  const debug = Boolean(options && options.debug)
  const obj = {}

  // convert Buffers before splitting into lines and processing
  src.toString().split('\n').forEach(function (line, idx) {
    // matching "KEY' and 'VAL' in 'KEY=VAL'
    const keyValueArr = line.match(/^\s*([\w.-]+)\s*=\s*(.*)?\s*$/)
    // matched?
    if (keyValueArr != null) {
      const key = keyValueArr[1]

      // default undefined or missing values to empty string
      let value = keyValueArr[2] || ''

      // expand newlines in quoted values
      const len = value ? value.length : 0
      if (len > 0 && value.charAt(0) === '"' && value.charAt(len - 1) === '"') {
        value = value.replace(/\\n/gm, '\n')
      }

      // remove any surrounding quotes and extra spaces
      value = value.replace(/(^['"]|['"]$)/g, '').trim()

      obj[key] = value
    } else if (debug) {
      log(`did not match key and value when parsing line ${idx + 1}: ${line}`)
    }
  })

  return obj
}

// Populates process.env from .env file
function config (options /*: ?DotenvConfigOptions */) /*: DotenvConfigOutput */ {
  let dotenvPath = path.resolve(process.cwd(), '.env')
  let encoding /*: string */ = 'utf8'
  let debug = false

  if (options) {
    if (options.path != null) {
      dotenvPath = options.path
    }
    if (options.encoding != null) {
      encoding = options.encoding
    }
    if (options.debug != null) {
      debug = true
    }
  }

  try {
    // specifying an encoding returns a string instead of a buffer
    const parsed = parse(fs.readFileSync(dotenvPath, { encoding }), { debug })

    Object.keys(parsed).forEach(function (key) {
      if (!process.env.hasOwnProperty(key)) {
        process.env[key] = parsed[key]
      } else if (debug) {
        log(`"${key}" is already defined in \`process.env\` and will not be overwritten`)
      }
    })

    return { parsed }
  } catch (e) {
    return { error: e }
  }
}

module.exports.config = config
module.exports.load = config
module.exports.parse = parse
# Contributing

1. Fork it
2. `npm install`
3. Create your feature branch (`git checkout -b my-new-feature`)
4. Commit your changes (`git commit -am 'Added some feature'`)
5. `npm test`
6. Push to the branch (`git push origin my-new-feature`)
7. Create new Pull Request

## Testing

We use [lab](https://github.com/hapijs/lab) and [should](https://github.com/shouldjs/should.js) to write BDD test. Run our test suite with this command:

```
npm test
```

## Code Style

We use [standard](https://www.npmjs.com/package/standard) and [editorconfig](http://editorconfig.org) to maintain code style and best practices. Please make sure your PR adheres to the guides by running:

```
npm run lint
```

Copyright (c) 2016, Scott Motte
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

‰PNG

   IHDR  �   È   Æ·â   sRGB ®Îé  +­IDATxí�X×Ùþo"(¨ñLÐ mÀ^‹ùÐL­¦	kMRÀ“F¬µŠm"/¶ÒTßKªi*Ú4ú6ø¯@mµ­Ø¼Áš‰¦­ÔB*$‘ø%	4…A%á\ØÝ9³;»ëÇÜs]ËÎœ9Ï9g~{˜{Î×3>³t€	�€”À�	ÅÒp’ 	 ×	� 	� 	!@1B�6$@$@l�°� 	� 	#Àˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž€¯œû¨o×�ƒ/ú¡—é’¿À€@DEÒÌÿ\cÞ~ï3Írúøv £½&~)A~}×þ†÷?Ã{gÛ¤ùuååƒ#ƒâß¯§ÌíŸã­·šÑÖO)‹OO¸jï„�¿£»¿Š57´âh½«ßSá xT•ÌSñë÷cïÊé@{;àë‹ºÒµ;3ËSÙ1]¸ìÜÿß}Ù/I]€7_~³~\£>áå�A#PóâdúÈoþoî©ÕUÎ¤Ï§Œîcé¿@áS‡ñ“Š�œ¦ó³íwáÛ±Cºã|Þôî˜·¿ûØÙÎYÿ…üaÎ¢8×�}¹ocáo?pi;ü+ñVA$ø8:—ÉèŽä?Hˆ±Ø„x(ÛÐ!�ßüC×*ù�ì»Z?¿+C'‡Œé'Ú@Ú›Þr­y¯ÿ§U;!�g‚F;+MW"Z:ýFÆ³÷�Ò•ÃÞí�øè‹ÏuÅÕ©ã|v½Ø¨+zúwFyM<t¨¯‘¢S°¥ø êš/âTIf_S£ý5O ñññª�ýeÇc_]3šëŽ xK&¢íOº<2…€¸¤à¥ç?uS÷YÇ9|wÃ{8×ñ…—Jn›Íu¸gÞÛ ÍýÏŽ¾‹òÚ6ÍóFN|øö'(n<çÚôº‘¸'v°ëxnŒÑìÆ´ì“ŠGþ¾#¸xxÒãè‹ð;æÁb‰G$`GÀ²)¥¥¥ªOÕ›š“òMÜˆÀÐH$¦­ÃáÖÓ(Ù´È.ggt®àsµ/Öà…¿}rYJxã­Á˜4@WÞ/–¹³Œ(Åy—›µP·§„`B€w[žÓBíÇ[üü†!ÞZ £ßÑ™8Ò\ŠÔ„È®î1k:�Ñx,½·Ï‹Vc~››@`÷åg&Ï‚÷‘ØñÁìe¹h¬È×Õ¡€ØÂ»Êöôíc8uAØzyó€oÌ¡+×íÜÖ�Õqþ<þ¼óC]ù~Ã2\tzzìÃ‚-%J—R+:::°n^¤]Ùü#ç¡T„·6žBÉ–t»súRPñú:Döü¿Û™=Îî˜$Ð[ý/JM‚cRñòÁMÒs¶�[WÛþçÿÁêê/C©}pç}:Ç?¯Åë'ú>^£\ä™·?ÖÙ}†øHûÖ€»!¥l*AcÇ.¤ÍVº”ìžáTYù‡cvÚF\¬;ˆÞ46ÜŒ™x4”cÅ?ÌÌ(VåÅ è�¬™c1eEš$F!qË°�ó64DÎ“AîRþòìØsò3OYšöˆ¨!øÆpí)É¶FÚ'«ž¶1ôìwào:»¯î_1cú{®û*½°
Û–ÍF°žbÛÄñ�ÃÆŠSØdÓmsÚ~7z=�“äÐVƒ#§!§Ê>:�HÀ(�ªœdÜ½j�Xâ Þ¦?¾ÒiW–çþËÔe¹âC�ˆðë\ÏL2v!ŸaðX?§³°Œ¥,ýÑ)¼Q0Isz°Ñt�ÚùúãÁÔPüîgÇœFSNþ%ç#|¸(£úÀ¶7ÝW�Ìê²LF#D§ã™¤(£æbŠo8–m¯À¡€X8IeQF"d“€l^‚'v<EFTeÏÁóó±,Æá¡%ôndˆ1õä<yª+—ë†£äÿ…¨@}ƒÃV³+áûÌ?�ã/‡`Õ,}ãî*óÔq‹Ó! øü}¼V3�L–õÇè+�Þî«À‰cá¼KI_Ž²XÑXŸ™h?˜m­'ªßFýÇÀˆˆÉˆ³[¤›~˜Ÿ‚‚…ÚòÕ¸±jÓöøSF™:œ!$àË·•cIÌl‡ú-?Ç¤ˆÔåu•]X6à}qõâØð½8Ò"³¹D·î™„%¡=‹�%^üJ_º±Äì«}úf_=ü­ŒèCKÇÙ5DgnÄlY³@5Ta®OÆGOÃŒÓ0),sWí”ö-+yD>´Ê¿¥|KÁMajl;^ÎÖ‡CÝA ç¯¨•ôc�ùòTÍÔ¯Þ;¦æ%™ôÄ§ñÔóïãs¯ºjé�¹i¡º€¿ôË|`pÆ˜Ò}µcÇ‡®óñˆû§ë4×‰©cŒ%O»½~¾›Ç!íâìùºb·´o�0Ss,¤%Ï/¶¨Åp�“8#™ïâ;P»W†]Xnƒùzý«±óþ}ê*êíUL‰Ýf?ÖaõEÊjnÆ‚h�n'Iœ9ªoöUXü|e”vew’…®S·Ç�‘Æ;ò—BhŽiçXðÒS‘ªþWëß{Òü]F[RðõÉÐŠVqƒhm=‹“‡¢¸L³Ô®’ôâùhX%`ò°€Î<[Ï¾�ÃypGGžÂ%aòPFÌ”û¦’Ãï¿�¼ÇG�Î¬ûô':Þ‚iS&C¹Œ€€ 4~P�œ¼>æ�”iSpÃ%6g=Tvg®®ÕÎbóÜOàÉ§ÞEÂ_nñX7Ž#€£‘y×0d¿vÖñ”êø÷{ÎÑ}õW}ÝWÊÚ��~ÆT…1àïç'±jÃ;•òþakäÿ{õ8“"­‡—¾u§èÄ*pnë`Ô«ÃôMÅH_0áÁêî0%¡ö–Tz¹+’‘'Ñ’èôx5û>Eqìòõ7ÁC›jO#Ž_�ãÅßAˆp*iÛ#â+nœ¯>ƒñsºLfAÖ¬0‘|W,å|ÝÞg0É"ÎÇ§£øgK1+&Â~¡›R’Ü|4œ¨ÀŸŸËÄâœÞJ‰X»Sœ‰âc"VôË¶Ü|1–Uõ7üfÍd»¸Ç;^ƒ˜%ßÖCX6³³Eºhý¬Lý"BÔOÙ„Ê—~�…–íISÖäcå7-ˆ
V�ÍÍoBõþb¬ž¹'UgÝÀ.,÷3½¬)¶=…ŸîÔwÃuOAûáëÊŸÌÓý…†^/|ÔÝ}%&AÜ{ÛõŽYºõx€ÃðbWâþ¸9F³/ª3Êé3ŸHËqê’ŠNÇþºVl\–¨)J�|C“�„ÜÃÍ(Y¯¾†ªœ—ñ�¸}Û}ýƒ‘ð�,MW*[~öD
÷*;_¼µg7‹ðqað÷ìN;ÐßcÇ… zQ!šK7"Q&�Ö¾‰ˆCÚÆRœÚ·¾;=W;éùûÑ¬¬Ýî`´Ä£+ù@DˆÁäu»:pj¾Soácì¯!8X\÷ÐAâæ�âãÍÈ]9O*]ù#&q%7V!Óùr‹îKË?xÛV§JÅÃšfTB*v5W!C_ïrwÚFv( F¨]á6¿ùQÊ?r¯*g—<é¶á¸ÙÁé¢4¾XøøZuïÖ¬œ9Ú¬kñ`ø½!øÒYAZC�¯:%µ›4û1i¸5°xù4ø�ÀŽŸØÅ.o­	ôæÛ²	u1=TÞê�'ˆÙ+wa¿j�JRÖìÑ0‰ÁZ1“Lµ¥â[ÒÕ�@SùÏaÉîiêœ¿hÛ>éJÉ?*‡s“ ~^WåÔž°R8–\#?iºEÜx7¦N×�®Õ4|z*öÖ•hŠÈy»6–ÕêüþÔëHŒÐyÁQX·÷Ò­æß›6"5Nc‡£M`’æÅ8†ºý˜âv¤W@‚Ÿà»ßÃyáFÃ[¿à�Xô5}û÷/�íÅ@þYzZ×%<ñÐp�{Þm9/Ù¥óOÄéŠBÍ›Œ®pG$ÑuT·k$Ã-ºRŸ¾,¶~ö#e}@ne“Ô>*å‡pt»·ãéÕ]NŠu{þ{Z†4�¾†Ï^�}NVL/*<‚4½7^Ia|Cg#‡«Û»�¡("ÃuŠ‡ÕÌ7O9ñ°œ²¥ËdK­ö—é›Ò¾úðÎ·;Ë^îXŸò�÷qiy|Çl«”w�¸4îuýzÿ^Ð€“­ò±c¶J÷Õ‹Ûuˆð¼;;VßªxÇ<zs\¼|N¨š;“‰IBië)ìX#y*ïM&JÜøÛ1®—÷ÅlÇ¯¿Í^‹¶T–èôÌZÓ Õ:FÒÚ-JRvÛâØgPkré@ÜôVÚÞXÓK0WcÎ�Ÿ/�ÆZ4YÊÝaMõ'Pyà Êkê¥ÏúÖˆ	éÙ]j™X¥²Zµ£¶ú Šr7#wëNTÖÊ…R‰>ï)¬Ñí»Ò¾’4Õ×¢º²åÕ'ÐbÊZ�ÎïÐ»¿¡1µ{~ø¸³ÖDêOT£²²õMZ¿­]Vš²6¼ŸŸöÄù(’fò×ð‰ŽìÝ×€Éƒûã¢›ŸÜÛÅúóÛoÚç·¾sñ,øÞD|^V‡"¸î
z2é8fWÙ£n=¬5Âê¡woóyk�ü[L7.«:‡ñqýåçmB•î«ß�q}�w>‚ñ®Ó³IÚàn6ìZŠÜyr{ÿpÌ[½Ó×ãe{ñ§¿ENAoyEÒnB�$‡ºêJIè¥ ±B~n„üßYY£ò¨˜fl[’ôÂ
lLRß”£ÀúèÅÈèéidcùfv-‹Så1/™buJ¶èóß—é¸­+z[Mfôrd[m)2Î„Ý¹EÎo_	©FÆa™h…gÙ^¥Ðb1®*µP�\ñ²³ÅsR6íGþ²é’Ñ®PÌJ¶ «JO·c×ïÐT³ÿ½Ä‚<»"YPX‘‡¤I‹Ý?
Å58\ƒeK"å?-ZD&Yì¦�Ç§ç#?;á½éÅìdtŠÂ9L.ð?­³¥){ Ð(–”øµ(Þ±‘¹¬Â3×ès=TÜ†('J®7ãþ£‚ñdÖ=üO×&bêìÿŒÄ–Çnp·�1º<ôŽÆÞßžr™Ò=‹Çâ®wé-Wo÷UÊ1•ØK[Þü'ðÀ©½˜®ý¯ãŠé‰©�ŸìgO`ïöç`Yž£»„[–~MÒÔŽSoÔL#?m–ä¦´ToÅÈØ…*»œäXŒ¾á4VNw¼‘…à¡ÕéÈ˜o_^egç×[1Ou÷ÇÒ’tdï¿ŠcõV�gIV;	i¯/Å½cgÚ	^gôâñàq§*VC†êÜG ‡›oPÈiN'Š2Tâ¡D,X>SãN‹î"õÅø]/MJØT™‹¡±‹%çŠ‘ÛŒˆÆRÈz¤F„„9Ø·ý³5š>`âa§OÂº,g!Æ–6 îðJí©C.]‡UØ_Õ€Ù¡íXÑÒ|LŒ�å-W‹'»°¤ Ýèã'þ¹Ýƒú3ñRªÑ·ŽÔýVÀí?­AÙûöÓ0Ý|u—’zçŽÔ•ô‘Â�pÔY[^I¥½Mg÷UîŒóJ½¶•aÎØXl-¯×•£H—	O¼�G°i‘Æ� ;%òÖ!-JÒÕv…6ÐÝ&�;k0+Rö¸Ù†¿nP‹‡Õ6#ïÈ:<ÂnŽ´F±ûžÿDìBºBg‹ë[— 9ToÍOíÒSš�U;7«nŠÝ‘«²°ü7ò–X`Ôýªn¦“¯—`çî�Ø¹³ëSTTÔ¹ÿÇíBízídwv¶;£&ÄÚ:ÙoÁž”‰‡Õ¤Ï×Xì¾/žw˜™ÿ8¦ËÔRtèíÉ^ê„S2¶VÛ¥­ç »ðUi�ˆ[¶û%¯$pÏ]MOÉÇM:D:×!eU¤¾™O¢eµôj½òöÂ“tzèÝXûê”Ç™c-ºº¯<íyW^È*,œ†v£ÁIŸ¶­­op$–åFUñÛà®}ñÒ¨ŠºFÑuºKÌ²qxú»ûÀæÕÞˆ€èô)RÇ‹h9ŒµêìºC
þ€cÑ¡*[ŽÕEòŸ´=&Vè§8ñ÷Õ]‡¿µ‰S¼x§|LFÌ±
gQìVd`¾e>æÏïú$''wîghˆ¤ù×™h`oÞqd_Ç£–æsŽA�Çcn½Ý.<zÚDùÌ±¶*ºpÉÜ"^}Üë­@¬	*—=&øcºx%AGk3N/éo’þî½Î”^'0`ÄõxîéIøêßr™w]é;øÕ«!øAüP—qûAxè}$5Lxè=ê2™­/}„'î¢9sªòeƒç"—G¾æákrr%dÄcSñÏ°àÞëøoŠJ\-Þö&V?Ûv+�Ç„Ð`i”’}ížµbAÝ}`-Ú¸È1RÛvˆé¤UâF)] 	á.Å$—À	S;o²ó’— åžR¨z¾¬…éþnÁÖ%szµ@®ÛÔåN6þV“…pU«Ë£Ç)­<'âp)mëÊð1C•Ök×
ýÎSb•þ¨[F]Šåý¯€!öýdãÂC¤¿mÓá×5(úZêåÓÅØã/‰iÈ’Ê!Öí„„…t‹šŽ*ß×âÐÞS¦>|–ü²Ï+î_]lk…åß1lŽMÝX:äøE7Vf¸Üû±è¾úóï>tqEÀ ‰7áŽ±Þì¾’©Ë-±X.‘Ó×,Áý_¿S£#Ç!í•·½UmÙ‡hën³è±³‹asÐv c/­Ü¶	µßÕ˜· ŒÅDFÉ[4ö	89}p-ÃŒ¡u[’Öƒzgbµ»³±P¦@Y=<ñ‘€¦Œ‹t" ñ‹�¿ò1ÌŠ›‚P�ÕùFËã1;�ßöä¿K=–¥E�eü8Õ±Mc‚[»”;»°<ø3x>éøþ–Éú²ÝFOæýG_Ü>Ä
œ0XŸ‡Þ/Î`ï¿ä3¬štv_=ú­áö ë’Þa¨BNÖbÌŒ/fÛMÁÚ¢Ýÿd²t¢¾µ²gÊ¦èîÐ”Aÿéh®Ê—%Ñ–p§C¿M÷ƒ;²¹œ¶I‰nŽgJ�Œµ”QÍ¶µpû~Ùòq
yF)Øqð.–æ"UyƒäÕ"âbƒä?†_w@~Å}MÁÁFmñ€oOî�¾‘ÖmÝŽ/tÇíMÄá“†cë¢›t™¼úÜ¿ñâ1ùM[Wº"é÷ÐûÛÝI;zùŒëœ„çÝ<èy×uœÅ¨BVòMIÃ�zÉ ƒb*¦l.µ®ü>Y‹CÕ5]S(%ÉF¥âHá"É™® ~îîHè¹Aheê4O¿�½½)e
‚üÆª.o:ªZ·a^\¸´+HÿÊ
¹3v¬×Txä×ÒbJA”u9Õÿ¨FÝ¥R¹»æyýbÝ™áÝ3G#d�û‘|vÎƒ}=õ¦C$¦�Ã¬íup¹CÀJKo¾ø%ñäîNröiéõÐ[ûÒ¼•51Á6k8:»¯¬ÕÓ>]Û#ÅónŒ=ïÚæex¿*3ÂÎ¡¢y›ôÝæÝ^²«²1#ºë‰=sGÖÍ‹Re™´éâµpö“k»¢U¾#xEEªlÚšÐxÉQ¡ê¤f€¨ÿgßé¾AÈ¢E‹ƒßw6"ÄñÙýëQ0#Cfî–°f8ígëÎcýþLDIºò­”âÉ÷ëEj—êà…!¦Ü]ÎoMØMß5ïˆmÙ¬<7¥¯JF¬'zXÕ5(bµ×£è©$Û-ÌQ\Grë" œñýtã­ˆÐûdså€».h0Ö®ŸŒ½ßyÃe¡>;ú.~þÒ(¬ýú0œ÷P«HñÐûôÝ#ðô«.œ:Šn¬=‡>AŒÍ››Ž}ªköU²p]âIÏ»Ž 7	_JÊÚ€váa¶k^W}°YŒù,/sŒm{\€5E+°+-Æ6°sÌÔñm?P�=?CöËÖgDàA±È,Ça�ƒ’ÐézùŒžÖ£[æv÷!)È_#_0ØyQ—þ„L_†‹Ä¨<ÛP÷íÇß¢cm“pí’ª!tí•ÈþÁBdIfcE¯?ˆÃ+ãÜWØ>¤t¸þ©µ§q®ypšDÚQš5GˆG•ª,ìÂ²Ar±Ý3ÝL6Yxl÷æ{Â:oÚz2øÅ÷�Š·^@ ¿§ZEý0çÁ0=EAáÏÚM1þ×~ÙB‡¤„Øß7Uxs»4“É×Wå£d m'=…´ŸYc=ã«±°Tk}Fè¤)VS»ïæ6ùÓxÀð1vñÜq�Y²^ÚšR§í�y?=Ø=ÝS}¾o!“Â‡JhG]mÏMÎ2÷ùôæ¶j|wd¬T<”DÇù_9‘AlBçÃ‡AŸ‚âqÇÍê”S†ó5Ö Q@l€»k±ŸM’^Üí‡'²&éËO<ùÿäWµøx€çú±ÆO†i]ÿ#Ö•}ˆê3ºÊÝ~%§]^Ãø‡FàK¶Ý^.-úAÞç€	ññ.¯;#Ói¿¨1Å¦ê%©j-ð+ÛS.}u®Älq]<INAÂÓnælÙ¬®v´È†z‚ãÄçt�Ä´ƒU‹é£F¯ÇÙS1÷Ã·{d\¨\¸«ÿßjç~¹¸®·ŽEòÔñÉš¤3ô£g©Y:–¡Ù1Àåq†Hfs´;¤9e˜âêÕaÐÁØõÃ›uxÏ¯k°º°z3êJÐ!’â¡w~Â0‡PÉ¡ðüò¡®I�Êì«>t]í³„¸tƒ"É©OA•J_´jóEÂÒŸ¸ðÂ�=«²T>8¤1³ªï[çIÚXÊÛ"BÙ.¼!+„sÄMÎgpõ$�ôLí�záU
ûž•»Yo8�… G‹¤7ºðÄ,•‡ßž<å{£&ÊyYc¯.EÞ²hoÀQ›Á¡#�/H´¦gÿ�‰gW�AÙÇñÞQUi�ôaÂ½È
'+ æøe/ˆéuA5ë˜FJ0WkðÝ)cñ�áú=Ó~z¼ÃC—ªßCïïŠÏtÎÆ:¼ßÅ˜‰RÒ~£1+z ‡Ê¬�lÞËoIo�ž.^´éÒ'}vTýQøˆ’5~ü‰k±Ô.‘í™2lþsµm@÷¾2ƒëôÁ|±JE{KYSˆãÂ7ÓÆu¿ãòx‹
Ÿ×ðuU‹Ü¥b@q2
ª%ª'D,íù§ù;æ*Ü³Ì—$Sx™^9]Ö
þQ$œ:öleo|Ðs`³õpfÏj›ðøô-8Þº>)mbzq·*–rË`’~‰ƒ[dœRPrJ{&•;K/¯ÙîÌ�iy—€Xžõü-øÝÃåÞÍW’›^½ue§Q]Š½EÒÇh»”½çy×.[ /û×&Jo¢�	ØXzOÕTà_•GÐxa0nŒ¾·k¾QO¤-ÖJ<ÛKµ%²;,^¼ÕßÚ&�q—ŠÃ­³Púâ_ð·ÊZ`È„„Ü„ÉÑ·à–É‘èYá‹ûVŠkM¶Kñ›°VÃ%ú‰�9Ý¾®./‚¥4MH†Ã&Þ§Q ^>Ý·&q©¹h½w^}å5=smmA¸ç‘‡£ùž�¼ôl–CÆÏÓ¢km[kþi/Ž]8�ƒÃ1íö;j¤Åâ�¥¿P†Ç7&J·}—–‹Æ{CÉ+å8ƒá¸ejœózçæò]V2Á¦½Ù‹ûø˜¥±Íuô­!øÅ¼ÑøÞÎÿ\Ö‹W<ô&=†½yï:/‡èÆZžV�·êeO°ö¦îfàµ£2¬ÈÞƒÃgkäè‹ÐÈ8$Š�ž­üW™ó¯ôX9‹S Þ˜ŒÃë4Ê'^r”0/M|œ¥!–§D<(Z!ÑböTUwÄùKä]Fb0zƒ­×Þ²ÅxîÀX-™ù•ºk6t‹Mwâ’ež›rcò‰Äl!\WdgÙR]¤Zù^¶|;N,‰“·(I©H°Kå
=È®ôÓ/bžÔ©",^ï›$>—ccÖå îñ<¯CÒÊÉº±=[Ü1Ûµ«ueæ­£®ÅýnÀ]‘Þï¾²2ªÊ™ƒEÕÖCÃßõ¥0Í�­kA”·¦m­´üVÞñ>®ÛÖ²©BóÆU™§ŒÎš‘£áè0Oý^´ntl½~ªm©Ä“â&êM¼¿årç�ê¸=!-õò—WŽý²Çf•õä.ß›/Æ’´^f&·ðN(Ä;œ½žK¿àÁøéÚH¯çë˜¡½Ê8Ìàñ®…!qåŒºÎSS�K.?ÎIŽFÂŠ"ÔÊfÉMlBÛPž›†°™ØiôÈØd€¼…±˜»a�S7*¶ñí÷[P^´JøèºÔ3½›–iÄ6À“’÷C(/ŸZ·ó„}²—Žü#“pp½ŽÞƒÖZª±êÎXÍYUyÉ�`k¥ë®ÑîäÄË¯‚Â2pÜºÜÇzBù‡éX—m¤®ýê ¾…ˆÅ¦ãgmèE½kÃîUiØ]+»�¾ÅÖšbKãÛÿrâ�øþ—U=ÒÞ½ÊKz]eúéqùb8[»$O{¶ÍÌÉ~YN2ÆLÁ†�4Ý�Øš··5¡ú@Ò¦`Úb}+ëdI†�¶MVs¿8cŽp£² E¥Õhjs}ikªÅñŽ¹>A˜–Ü3�¾:IÃ™žxÅ3Úï¢È›ÿ4*54 .u™‹Yk@ù¯,HX%\¶79){{ª…o«„ hh,Q¸ÄG¸Þ�)\ï‹ôœ½ƒ¦­{rW h’2þS€ƒGd0§ÙOGhûL¦êíb‘®ó­ù¹K¡Ö�?Ñ6,Ëõn.ŠÔHßÙa5l©¯Ä†q°dç¡æ½Fkp÷÷9ÇwŽXÏDÇâÉ0�³2ùˆñOMÃ±KóÛ[c oì8�øUoj–£ó„Xœvðß_¹¬+Ñõ”óÑÌ©âƒòY(²üøX#ÆÞ{@vJWØ/þ�ÑAºâjEúôd#ÆÌ2^%]Åón—ï>óè©£ñ)‹0mâmH{Êö5¢m(Ýœ‰Í»JQ\Ö3ž ÅÈ1<ÿH3R#ÿ›ë±Ö'ŽCÅŽ¶ŽÇJùâ§Æ "t.ÔŸEñ�OÏâƒ£5øûÁQ>GïoªhÄ²õNuî‚nOÅñ)é˜}çÜ4lpg¡.ˆrŸ®ÌwæèpÚ®¾Ë¢5˜s×$Œ¯®¾ Ü–XÓËé]][4¥ÏCÌ”×\À§õà¥…È+î}}S®=zÍ~^=]…¡:wnO«Ôál¯»ì¯�ÃŽ‹8züSº¾¿˜®é9MõÐcF*?¸w¶!‚Q¸ô&$?çb ÛƒÅ<®ËC¯·óZÅHúöˆ+Èó®})Ë
ò„ìc°¤Û
ÈEÛeüæ¼ëµcB@»�B1_ÌfÊêÅl&¥¤�å»Úî�——äˆòÛóîËQq^Šõ5û’�l«ÄÄ@cB¡U¸Œ¤©’SMø{I±$¼+ˆbE#f}óÁýÖ#�}š�c/Nö¢'ÜûÄxXŠ>Dq£ën"Ï\x—‡Þçìú½%Òü…ç]Ë�ê'UiÜË(i¥I‚ô¯ó­{ÂV¸ƒAdê³Ø²« Öa
‡Ó<$CRò+ÄL.•mû‰§uÍ»ýªâ™/`Èï+Ói³6L¾¬°;=ô,AXüˆ.0˜ ‡Ìf›ÍO—Ÿ,‡Ýläìk6T[ÒvÖ!_¾rQ›$àŠ@faòS[»ŠUvmPÆ„´7
ˆ6�œ9ÿ©çºÇœ8â®QXwŸÄQš3#7ž³zè5’dòCÃ¼Øb3RBÅæ$JvíÁ�ÒR”ŠÏ�Ò?aŸvË_W&9–Dù,ßP¤n,EÅ3štåÄHf%°©¢ë’b$‹�š�™.½)³Ë45§kCV½¨J£{ÑtyèuéâÝ1S1¹áþÛúÐä˜žÇŽ«�1Ž›S¯‚eì<”ß†ÙŽê-¨y½�
åæÒ2¹«�À[ïŠûAŒcÝâ±{&Ù.Õ¸4¶@4À\‹ÁF_�—ž¾|]Yz=ôÚ²ÿÐ(LôÞ¤Û¼¯ŒýbÌ„¹{Ð`»ö¤éßø_7._×ÊRx›@ÞóÿgçÉY™¼9m
&é|%1ÄÛ¿ØeÎïöGnÄc£.Ï½â¡÷á{ÅÒ^li–a^÷¼Û‹ây-jÎâ9àƒ¶¢üD-Ê‹ÄÌ¯«}cÈeÿË~ƒáíDùn¬MK‹(c±ÜÆ��«òñtEÈç?×LÓã#¾�ùü—ðÂƒÿÐ,…çN\‡™÷�v~¨/áy÷«·vÍÿ×gpíÇÊÉXˆƒÙ¯4:Ÿ|Ü(Š ÞòØS2_ßv|ÔP×À=¨BrìXÃy˜¢âÛßû3Ÿ´~‘A!ýÄµ|óÓñ>öAƒ}äÆ½5[Ý¤Ë¢¿oßó³ÍèÆ[‡Â2t m�æþ½KFal>ãhºÊOdÍ?ø‰·=Z?>>˜)ymïU~©×lñ/ëJôk–*/ìš! g%ú5s±¼è%S´@zÉ„ÑI€H€t €è€Ä($@$@j5†� 	� 	è @Ñ‰QH€H€Ô( j&! ÐA€¢£� 	� 	¨	P@ÔLB$@$ ƒ D$F! P €¨™0„H€H@
ˆHŒB$@$ &@Q3a	� 	�€�…H€H@M€¢fÂ  ( : 1
	� 	�€š DÍ„!$@$@:P@t@b  5
ˆš	CH€H€t €è€Ä($@$@j5†� 	� 	è @Ñ‰QH€H€Ô( j&! ÐAàÿÜr Ç%Âb    IEND®B`‚{
  "author": {
    "name": "motdotla"
  },
  "deprecated": false,
  "description": "Expand environment variables using dotenv",
  "devDependencies": {
    "dotenv": "^4.0.0",
    "lab": "^13.0.1",
    "should": "^11.2.1",
    "standard": "^9.0.2"
  },
  "license": "BSD-2-Clause",
  "main": "lib/main.js",
  "name": "dotenv-expand",
  "types": "./index.d.ts",
  "version": "4.2.0"
}'use strict'

var dotenvExpand = function (config) {
  var interpolate = function (env) {
    var matches = env.match(/\$([a-zA-Z0-9_]+)|\${([a-zA-Z0-9_]+)}/g) || []

    matches.forEach(function (match) {
      var key = match.replace(/\$|{|}/g, '')

      // process.env value 'wins' over .env file's value
      var variable = process.env[key] || config.parsed[key] || ''

      // Resolve recursive interpolations
      variable = interpolate(variable)

      env = env.replace(match, variable)
    })

    return env
  }

  for (var configKey in config.parsed) {
    var value = process.env[configKey] || config.parsed[configKey]

    if (config.parsed[configKey].substring(0, 2) === '\\$') {
      config.parsed[configKey] = value.substring(1)
    } else if (config.parsed[configKey].indexOf('\\$') > 0) {
      config.parsed[configKey] = value.replace(/\\\$/g, '$')
    } else {
      config.parsed[configKey] = interpolate(value)
    }
  }

  for (var processKey in config.parsed) {
    process.env[processKey] = config.parsed[processKey]
  }

  return config
}

module.exports = dotenvExpand
'use strict';

var minimatch = require('minimatch');
var path = require('path');

function IgnoreMatcher(str) {
  var negated = [];
  this.negated = negated;
  var rooted = [];
  this.rooted = rooted;
  this.matchers = str.split(/\r?\n|\r/).map(function (line) {
    var negatedLine = line[0] === '!';
    var commentLine = line[0] === '#';
    var rootedLine = line[0] === '/';
    if (negatedLine || commentLine || rootedLine) {
      line = line.slice(1);
    }
    var emptyLine = line === '';
    if (emptyLine) {
      return null;
    }
    var isShellGlob = line.indexOf('/') >= 0;
    negated[negated.length] = negatedLine;
    rooted[rooted.length] = rootedLine || isShellGlob;
    return minimatch.makeRe(line, {
      comment: commentLine,
      empty: emptyLine,
      matchBase: !rootedLine,
      negated: true // negated
    });
  }).filter(Boolean);
  return this;
}
IgnoreMatcher.prototype.delimiter = path.sep;
IgnoreMatcher.prototype.shouldIgnore = function (filename) {
  var isMatching = false;
  for (var i = 0; i < this.matchers.length; i++) {
    var matcher = this.matchers[i];
    if (this.rooted[i]) {
      if (matcher.test(filename)) {
        isMatching = !this.negated[i];
      }
    } else if (filename.split(this.delimiter).some(function (part) {
      return matcher.test(part);
    })) {
      isMatching = !this.negated[i];
    }
  }
  return isMatching;
};
exports.createMatcher = function (ignoreFileStr) {
  return new IgnoreMatcher(ignoreFileStr);
};
{
  "author": {
    "name": "bradleymeck"
  },
  "bin": {
    "ignored": "bin/ignored"
  },
  "dependencies": {
    "minimatch": "^3.0.4"
  },
  "deprecated": false,
  "description": "ignorefile/includefile matching .gitignore spec",
  "devDependencies": {
    "@ljharb/eslint-config": "^15.1.0",
    "covert": "^1.1.1",
    "eslint": "^6.8.0",
    "safe-publish-latest": "^1.1.4",
    "tape": "^4.12.1"
  },
  "homepage": "https://github.com/bmeck/dotignore#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "dotignore",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/bmeck/dotignore.git"
  },
  "version": "0.1.2"
}#!/usr/bin/env node

'use strict';

var fs = require('fs');
var path = require('path');
var rules = String(fs.readFileSync(process.argv[2] || '.gitignore'));
var matcher = require('../').createMatcher(rules);

function checkDir(dir) {
  fs.readdirSync(dir).forEach(function (filename) {
    var resolved = path.join(dir, filename);
    if (matcher.shouldIgnore(resolved)) {
      console.log('- ' + resolved);
    } else if (fs.statSync(resolved).isDirectory()) {
      checkDir(resolved);
    } else {
      console.log('+ ' + resolved);
    }
  });
}
checkDir('.');


                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ejs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
/*
 * EJS Embedded JavaScript templates
 * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
*/

'use strict';

/**
 * @file Embedded JavaScript templating engine. {@link http://ejs.co}
 * @author Matthew Eernisse <mde@fleegix.org>
 * @author Tiancheng "Timothy" Gu <timothygu99@gmail.com>
 * @project EJS
 * @license {@link http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0}
 */

/**
 * EJS internal functions.
 *
 * Technically this "module" lies in the same file as {@link module:ejs}, for
 * the sake of organization all the private functions re grouped into this
 * module.
 *
 * @module ejs-internal
 * @private
 */

/**
 * Embedded JavaScript templating engine.
 *
 * @module ejs
 * @public
 */

var fs = require('fs');
var path = require('path');
var utils = require('./utils');

var scopeOptionWarned = false;
var _VERSION_STRING = require('../package.json').version;
var _DEFAULT_OPEN_DELIMITER = '<';
var _DEFAULT_CLOSE_DELIMITER = '>';
var _DEFAULT_DELIMITER = '%';
var _DEFAULT_LOCALS_NAME = 'locals';
var _NAME = 'ejs';
var _REGEX_STRING = '(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)';
var _OPTS_PASSABLE_WITH_DATA = ['delimiter', 'scope', 'context', 'debug', 'compileDebug',
  'client', '_with', 'rmWhitespace', 'strict', 'filename', 'async'];
// We don't allow 'cache' option to be passed in the data obj for
// the normal `render` call, but this is where Express 2 & 3 put it
// so we make an exception for `renderFile`
var _OPTS_PASSABLE_WITH_DATA_EXPRESS = _OPTS_PASSABLE_WITH_DATA.concat('cache');
var _BOM = /^\uFEFF/;

/**
 * EJS template function cache. This can be a LRU object from lru-cache NPM
 * module. By default, it is {@link module:utils.cache}, a simple in-process
 * cache that grows continuously.
 *
 * @type {Cache}
 */

exports.cache = utils.cache;

/**
 * Custom file loader. Useful for template preprocessing or restricting access
 * to a certain part of the filesystem.
 *
 * @type {fileLoader}
 */

exports.fileLoader = fs.readFileSync;

/**
 * Name of the object containing the locals.
 *
 * This variable is overridden by {@link Options}`.localsName` if it is not
 * `undefined`.
 *
 * @type {String}
 * @public
 */

exports.localsName = _DEFAULT_LOCALS_NAME;

/**
 * Promise implementation -- defaults to the native implementation if available
 * This is mostly just for testability
 *
 * @type {Function}
 * @public
 */

exports.promiseImpl = (new Function('return this;'))().Promise;

/**
 * Get the path to the included file from the parent file path and the
 * specified path.
 *
 * @param {String}  name     specified path
 * @param {String}  filename parent file path
 * @param {Boolean} isDir    parent file path whether is directory
 * @return {String}
 */
exports.resolveInclude = function(name, filename, isDir) {
  var dirname = path.dirname;
  var extname = path.extname;
  var resolve = path.resolve;
  var includePath = resolve(isDir ? filename : dirname(filename), name);
  var ext = extname(name);
  if (!ext) {
    includePath += '.ejs';
  }
  return includePath;
};

/**
 * Get the path to the included file by Options
 *
 * @param  {String}  path    specified path
 * @param  {Options} options compilation options
 * @return {String}
 */
function getIncludePath(path, options) {
  var includePath;
  var filePath;
  var views = options.views;
  var match = /^[A-Za-z]+:\\|^\//.exec(path);

  // Abs path
  if (match && match.length) {
    includePath = exports.resolveInclude(path.replace(/^\/*/,''), options.root || '/', true);
  }
  // Relative paths
  else {
    // Look relative to a passed filename first
    if (options.filename) {
      filePath = exports.resolveInclude(path, options.filename);
      if (fs.existsSync(filePath)) {
        includePath = filePath;
      }
    }
    // Then look in any views directories
    if (!includePath) {
      if (Array.isArray(views) && views.some(function (v) {
        filePath = exports.resolveInclude(path, v, true);
        return fs.existsSync(filePath);
      })) {
        includePath = filePath;
      }
    }
    if (!includePath) {
      throw new Error('Could not find the include file "' +
          options.escapeFunction(path) + '"');
    }
  }
  return includePath;
}

/**
 * Get the template from a string or a file, either compiled on-the-fly or
 * read from cache (if enabled), and cache the template if needed.
 *
 * If `template` is not set, the file specified in `options.filename` will be
 * read.
 *
 * If `options.cache` is true, this function reads the file from
 * `options.filename` so it must be set prior to calling this function.
 *
 * @memberof module:ejs-internal
 * @param {Options} options   compilation options
 * @param {String} [template] template source
 * @return {(TemplateFunction|ClientFunction)}
 * Depending on the value of `options.client`, either type might be returned.
 * @static
 */

function handleCache(options, template) {
  var func;
  var filename = options.filename;
  var hasTemplate = arguments.length > 1;

  if (options.cache) {
    if (!filename) {
      throw new Error('cache option requires a filename');
    }
    func = exports.cache.get(filename);
    if (func) {
      return func;
    }
    if (!hasTemplate) {
      template = fileLoader(filename).toString().replace(_BOM, '');
    }
  }
  else if (!hasTemplate) {
    // istanbul ignore if: should not happen at all
    if (!filename) {
      throw new Error('Internal EJS error: no file name or template '
                    + 'provided');
    }
    template = fileLoader(filename).toString().replace(_BOM, '');
  }
  func = exports.compile(template, options);
  if (options.cache) {
    exports.cache.set(filename, func);
  }
  return func;
}

/**
 * Try calling handleCache with the given options and data and call the
 * callback with the result. If an error occurs, call the callback with
 * the error. Used by renderFile().
 *
 * @memberof module:ejs-internal
 * @param {Options} options    compilation options
 * @param {Object} data        template data
 * @param {RenderFileCallback} cb callback
 * @static
 */

function tryHandleCache(options, data, cb) {
  var result;
  if (!cb) {
    if (typeof exports.promiseImpl == 'function') {
      return new exports.promiseImpl(function (resolve, reject) {
        try {
          result = handleCache(options)(data);
          resolve(result);
        }
        catch (err) {
          reject(err);
        }
      });
    }
    else {
      throw new Error('Please provide a callback function');
    }
  }
  else {
    try {
      result = handleCache(options)(data);
    }
    catch (err) {
      return cb(err);
    }

    cb(null, result);
  }
}

/**
 * fileLoader is independent
 *
 * @param {String} filePath ejs file path.
 * @return {String} The contents of the specified file.
 * @static
 */

function fileLoader(filePath){
  return exports.fileLoader(filePath);
}

/**
 * Get the template function.
 *
 * If `options.cache` is `true`, then the template is cached.
 *
 * @memberof module:ejs-internal
 * @param {String}  path    path for the specified file
 * @param {Options} options compilation options
 * @return {(TemplateFunction|ClientFunction)}
 * Depending on the value of `options.client`, either type might be returned
 * @static
 */

function includeFile(path, options) {
  var opts = utils.shallowCopy({}, options);
  opts.filename = getIncludePath(path, opts);
  return handleCache(opts);
}

/**
 * Get the JavaScript source of an included file.
 *
 * @memberof module:ejs-internal
 * @param {String}  path    path for the specified file
 * @param {Options} options compilation options
 * @return {Object}
 * @static
 */

function includeSource(path, options) {
  var opts = utils.shallowCopy({}, options);
  var includePath;
  var template;
  includePath = getIncludePath(path, opts);
  template = fileLoader(includePath).toString().replace(_BOM, '');
  opts.filename = includePath;
  var templ = new Template(template, opts);
  templ.generateSource();
  return {
    source: templ.source,
    filename: includePath,
    template: template
  };
}

/**
 * Re-throw the given `err` in context to the `str` of ejs, `filename`, and
 * `lineno`.
 *
 * @implements RethrowCallback
 * @memberof module:ejs-internal
 * @param {Error}  err      Error object
 * @param {String} str      EJS source
 * @param {String} filename file name of the EJS file
 * @param {String} lineno   line number of the error
 * @static
 */

function rethrow(err, str, flnm, lineno, esc){
  var lines = str.split('\n');
  var start = Math.max(lineno - 3, 0);
  var end = Math.min(lines.length, lineno + 3);
  var filename = esc(flnm); // eslint-disable-line
  // Error context
  var context = lines.slice(start, end).map(function (line, i){
    var curr = i + start + 1;
    return (curr == lineno ? ' >> ' : '    ')
      + curr
      + '| '
      + line;
  }).join('\n');

  // Alter exception message
  err.path = filename;
  err.message = (filename || 'ejs') + ':'
    + lineno + '\n'
    + context + '\n\n'
    + err.message;

  throw err;
}

function stripSemi(str){
  return str.replace(/;(\s*$)/, '$1');
}

/**
 * Compile the given `str` of ejs into a template function.
 *
 * @param {String}  template EJS template
 *
 * @param {Options} opts     compilation options
 *
 * @return {(TemplateFunction|ClientFunction)}
 * Depending on the value of `opts.client`, either type might be returned.
 * Note that the return type of the function also depends on the value of `opts.async`.
 * @public
 */

exports.compile = function compile(template, opts) {
  var templ;

  // v1 compat
  // 'scope' is 'context'
  // FIXME: Remove this in a future version
  if (opts && opts.scope) {
    if (!scopeOptionWarned){
      console.warn('`scope` option is deprecated and will be removed in EJS 3');
      scopeOptionWarned = true;
    }
    if (!opts.context) {
      opts.context = opts.scope;
    }
    delete opts.scope;
  }
  templ = new Template(template, opts);
  return templ.compile();
};

/**
 * Render the given `template` of ejs.
 *
 * If you would like to include options but not data, you need to explicitly
 * call this function with `data` being an empty object or `null`.
 *
 * @param {String}   template EJS template
 * @param {Object}  [data={}] template data
 * @param {Options} [opts={}] compilation and rendering options
 * @return {(String|Promise<String>)}
 * Return value type depends on `opts.async`.
 * @public
 */

exports.render = function (template, d, o) {
  var data = d || {};
  var opts = o || {};

  // No options object -- if there are optiony names
  // in the data, copy them to options
  if (arguments.length == 2) {
    utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA);
  }

  return handleCache(opts, template)(data);
};

/**
 * Render an EJS file at the given `path` and callback `cb(err, str)`.
 *
 * If you would like to include options but not data, you need to explicitly
 * call this function with `data` being an empty object or `null`.
 *
 * @param {String}             path     path to the EJS file
 * @param {Object}            [data={}] template data
 * @param {Options}           [opts={}] compilation and rendering options
 * @param {RenderFileCallback} cb callback
 * @public
 */

exports.renderFile = function () {
  var args = Array.prototype.slice.call(arguments);
  var filename = args.shift();
  var cb;
  var opts = {filename: filename};
  var data;
  var viewOpts;

  // Do we have a callback?
  if (typeof arguments[arguments.length - 1] == 'function') {
    cb = args.pop();
  }
  // Do we have data/opts?
  if (args.length) {
    // Should always have data obj
    data = args.shift();
    // Normal passed opts (data obj + opts obj)
    if (args.length) {
      // Use shallowCopy so we don't pollute passed in opts obj with new vals
      utils.shallowCopy(opts, args.pop());
    }
    // Special casing for Express (settings + opts-in-data)
    else {
      // Express 3 and 4
      if (data.settings) {
        // Pull a few things from known locations
        if (data.settings.views) {
          opts.views = data.settings.views;
        }
        if (data.settings['view cache']) {
          opts.cache = true;
        }
        // Undocumented after Express 2, but still usable, esp. for
        // items that are unsafe to be passed along with data, like `root`
        viewOpts = data.settings['view options'];
        if (viewOpts) {
          utils.shallowCopy(opts, viewOpts);
        }
      }
      // Express 2 and lower, values set in app.locals, or people who just
      // want to pass options in their data. NOTE: These values will override
      // anything previously set in settings  or settings['view options']
      utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA_EXPRESS);
    }
    opts.filename = filename;
  }
  else {
    data = {};
  }

  return tryHandleCache(opts, data, cb);
};

/**
 * Clear intermediate JavaScript cache. Calls {@link Cache#reset}.
 * @public
 */

/**
 * EJS template class
 * @public
 */
exports.Template = Template;

exports.clearCache = function () {
  exports.cache.reset();
};

function Template(text, opts) {
  opts = opts || {};
  var options = {};
  this.templateText = text;
  this.mode = null;
  this.truncate = false;
  this.currentLine = 1;
  this.source = '';
  this.dependencies = [];
  options.client = opts.client || false;
  options.escapeFunction = opts.escape || opts.escapeFunction || utils.escapeXML;
  options.compileDebug = opts.compileDebug !== false;
  options.debug = !!opts.debug;
  options.filename = opts.filename;
  options.openDelimiter = opts.openDelimiter || exports.openDelimiter || _DEFAULT_OPEN_DELIMITER;
  options.closeDelimiter = opts.closeDelimiter || exports.closeDelimiter || _DEFAULT_CLOSE_DELIMITER;
  options.delimiter = opts.delimiter || exports.delimiter || _DEFAULT_DELIMITER;
  options.strict = opts.strict || false;
  options.context = opts.context;
  options.cache = opts.cache || false;
  options.rmWhitespace = opts.rmWhitespace;
  options.root = opts.root;
  options.outputFunctionName = opts.outputFunctionName;
  options.localsName = opts.localsName || exports.localsName || _DEFAULT_LOCALS_NAME;
  options.views = opts.views;
  options.async = opts.async;
  options.destructuredLocals = opts.destructuredLocals;
  options.legacyInclude = typeof opts.legacyInclude != 'undefined' ? !!opts.legacyInclude : true;

  if (options.strict) {
    options._with = false;
  }
  else {
    options._with = typeof opts._with != 'undefined' ? opts._with : true;
  }

  this.opts = options;

  this.regex = this.createRegex();
}

Template.modes = {
  EVAL: 'eval',
  ESCAPED: 'escaped',
  RAW: 'raw',
  COMMENT: 'comment',
  LITERAL: 'literal'
};

Template.prototype = {
  createRegex: function () {
    var str = _REGEX_STRING;
    var delim = utils.escapeRegExpChars(this.opts.delimiter);
    var open = utils.escapeRegExpChars(this.opts.openDelimiter);
    var close = utils.escapeRegExpChars(this.opts.closeDelimiter);
    str = str.replace(/%/g, delim)
      .replace(/</g, open)
      .replace(/>/g, close);
    return new RegExp(str);
  },

  compile: function () {
    var src;
    var fn;
    var opts = this.opts;
    var prepended = '';
    var appended = '';
    var escapeFn = opts.escapeFunction;
    var ctor;

    if (!this.source) {
      this.generateSource();
      prepended +=
        '  var __output = "";\n' +
        '  function __append(s) { if (s !== undefined && s !== null) __output += s }\n';
      if (opts.outputFunctionName) {
        prepended += '  var ' + opts.outputFunctionName + ' = __append;' + '\n';
      }
      if (opts.destructuredLocals && opts.destructuredLocals.length) {
        var destructuring = '  var __locals = (' + opts.localsName + ' || {}),\n';
        for (var i = 0; i < opts.destructuredLocals.length; i++) {
          var name = opts.destructuredLocals[i];
          if (i > 0) {
            destructuring += ',\n  ';
          }
          destructuring += name + ' = __locals.' + name;
        }
        prepended += destructuring + ';\n';
      }
      if (opts._with !== false) {
        prepended +=  '  with (' + opts.localsName + ' || {}) {' + '\n';
        appended += '  }' + '\n';
      }
      appended += '  return __output;' + '\n';
      this.source = prepended + this.source + appended;
    }

    if (opts.compileDebug) {
      src = 'var __line = 1' + '\n'
        + '  , __lines = ' + JSON.stringify(this.templateText) + '\n'
        + '  , __filename = ' + (opts.filename ?
        JSON.stringify(opts.filename) : 'undefined') + ';' + '\n'
        + 'try {' + '\n'
        + this.source
        + '} catch (e) {' + '\n'
        + '  rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
        + '}' + '\n';
    }
    else {
      src = this.source;
    }

    if (opts.client) {
      src = 'escapeFn = escapeFn || ' + escapeFn.toString() + ';' + '\n' + src;
      if (opts.compileDebug) {
        src = 'rethrow = rethrow || ' + rethrow.toString() + ';' + '\n' + src;
      }
    }

    if (opts.strict) {
      src = '"use strict";\n' + src;
    }
    if (opts.debug) {
      console.log(src);
    }
    if (opts.compileDebug && opts.filename) {
      src = src + '\n'
        + '//# sourceURL=' + opts.filename + '\n';
    }

    try {
      if (opts.async) {
        // Have to use generated function for this, since in envs without support,
        // it breaks in parsing
        try {
          ctor = (new Function('return (async function(){}).constructor;'))();
        }
        catch(e) {
          if (e instanceof SyntaxError) {
            throw new Error('This environment does not support async/await');
          }
          else {
            throw e;
          }
        }
      }
      else {
        ctor = Function;
      }
      fn = new ctor(opts.localsName + ', escapeFn, include, rethrow', src);
    }
    catch(e) {
      // istanbul ignore else
      if (e instanceof SyntaxError) {
        if (opts.filename) {
          e.message += ' in ' + opts.filename;
        }
        e.message += ' while compiling ejs\n\n';
        e.message += 'If the above error is not helpful, you may want to try EJS-Lint:\n';
        e.message += 'https://github.com/RyanZim/EJS-Lint';
        if (!opts.async) {
          e.message += '\n';
          e.message += 'Or, if you meant to create an async function, pass `async: true` as an option.';
        }
      }
      throw e;
    }

    // Return a callable function which will execute the function
    // created by the source-code, with the passed data as locals
    // Adds a local `include` function which allows full recursive include
    var returnedFn = opts.client ? fn : function anonymous(data) {
      var include = function (path, includeData) {
        var d = utils.shallowCopy({}, data);
        if (includeData) {
          d = utils.shallowCopy(d, includeData);
        }
        return includeFile(path, opts)(d);
      };
      return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]);
    };
    returnedFn.dependencies = this.dependencies;
    if (opts.filename && typeof Object.defineProperty === 'function') {
      var filename = opts.filename;
      var basename = path.basename(filename, path.extname(filename));
      try {
        Object.defineProperty(returnedFn, 'name', {
          value: basename,
          writable: false,
          enumerable: false,
          configurable: true
        });
      } catch (e) {/* ignore */}
    }
    return returnedFn;
  },

  generateSource: function () {
    var opts = this.opts;

    if (opts.rmWhitespace) {
      // Have to use two separate replace here as `^` and `$` operators don't
      // work well with `\r` and empty lines don't work well with the `m` flag.
      this.templateText =
        this.templateText.replace(/[\r\n]+/g, '\n').replace(/^\s+|\s+$/gm, '');
    }

    // Slurp spaces and tabs before <%_ and after _%>
    this.templateText =
      this.templateText.replace(/[ \t]*<%_/gm, '<%_').replace(/_%>[ \t]*/gm, '_%>');

    var self = this;
    var matches = this.parseTemplateText();
    var d = this.opts.delimiter;
    var o = this.opts.openDelimiter;
    var c = this.opts.closeDelimiter;

    if (matches && matches.length) {
      matches.forEach(function (line, index) {
        var opening;
        var closing;
        var include;
        var includeOpts;
        var includeObj;
        var includeSrc;
        // If this is an opening tag, check for closing tags
        // FIXME: May end up with some false positives here
        // Better to store modes as k/v with openDelimiter + delimiter as key
        // Then this can simply check against the map
        if ( line.indexOf(o + d) === 0        // If it is a tag
          && line.indexOf(o + d + d) !== 0) { // and is not escaped
          closing = matches[index + 2];
          if (!(closing == d + c || closing == '-' + d + c || closing == '_' + d + c)) {
            throw new Error('Could not find matching close tag for "' + line + '".');
          }
        }
        // HACK: backward-compat `include` preprocessor directives
        if (opts.legacyInclude && (include = line.match(/^\s*include\s+(\S+)/))) {
          opening = matches[index - 1];
          // Must be in EVAL or RAW mode
          if (opening && (opening == o + d || opening == o + d + '-' || opening == o + d + '_')) {
            includeOpts = utils.shallowCopy({}, self.opts);
            includeObj = includeSource(include[1], includeOpts);
            if (self.opts.compileDebug) {
              includeSrc =
                  '    ; (function(){' + '\n'
                  + '      var __line = 1' + '\n'
                  + '      , __lines = ' + JSON.stringify(includeObj.template) + '\n'
                  + '      , __filename = ' + JSON.stringify(includeObj.filename) + ';' + '\n'
                  + '      try {' + '\n'
                  + includeObj.source
                  + '      } catch (e) {' + '\n'
                  + '        rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
                  + '      }' + '\n'
                  + '    ; }).call(this)' + '\n';
            }else{
              includeSrc = '    ; (function(){' + '\n' + includeObj.source +
                  '    ; }).call(this)' + '\n';
            }
            self.source += includeSrc;
            self.dependencies.push(exports.resolveInclude(include[1],
              includeOpts.filename));
            return;
          }
        }
        self.scanLine(line);
      });
    }

  },

  parseTemplateText: function () {
    var str = this.templateText;
    var pat = this.regex;
    var result = pat.exec(str);
    var arr = [];
    var firstPos;

    while (result) {
      firstPos = result.index;

      if (firstPos !== 0) {
        arr.push(str.substring(0, firstPos));
        str = str.slice(firstPos);
      }

      arr.push(result[0]);
      str = str.slice(result[0].length);
      result = pat.exec(str);
    }

    if (str) {
      arr.push(str);
    }

    return arr;
  },

  _addOutput: function (line) {
    if (this.truncate) {
      // Only replace single leading linebreak in the line after
      // -%> tag -- this is the single, trailing linebreak
      // after the tag that the truncation mode replaces
      // Handle Win / Unix / old Mac linebreaks -- do the \r\n
      // combo first in the regex-or
      line = line.replace(/^(?:\r\n|\r|\n)/, '');
      this.truncate = false;
    }
    if (!line) {
      return line;
    }

    // Preserve literal slashes
    line = line.replace(/\\/g, '\\\\');

    // Convert linebreaks
    line = line.replace(/\n/g, '\\n');
    line = line.replace(/\r/g, '\\r');

    // Escape double-quotes
    // - this will be the delimiter during execution
    line = line.replace(/"/g, '\\"');
    this.source += '    ; __append("' + line + '")' + '\n';
  },

  scanLine: function (line) {
    var self = this;
    var d = this.opts.delimiter;
    var o = this.opts.openDelimiter;
    var c = this.opts.closeDelimiter;
    var newLineCount = 0;

    newLineCount = (line.split('\n').length - 1);

    switch (line) {
    case o + d:
    case o + d + '_':
      this.mode = Template.modes.EVAL;
      break;
    case o + d + '=':
      this.mode = Template.modes.ESCAPED;
      break;
    case o + d + '-':
      this.mode = Template.modes.RAW;
      break;
    case o + d + '#':
      this.mode = Template.modes.COMMENT;
      break;
    case o + d + d:
      this.mode = Template.modes.LITERAL;
      this.source += '    ; __append("' + line.replace(o + d + d, o + d) + '")' + '\n';
      break;
    case d + d + c:
      this.mode = Template.modes.LITERAL;
      this.source += '    ; __append("' + line.replace(d + d + c, d + c) + '")' + '\n';
      break;
    case d + c:
    case '-' + d + c:
    case '_' + d + c:
      if (this.mode == Template.modes.LITERAL) {
        this._addOutput(line);
      }

      this.mode = null;
      this.truncate = line.indexOf('-') === 0 || line.indexOf('_') === 0;
      break;
    default:
      // In script mode, depends on type of tag
      if (this.mode) {
        // If '//' is found without a line break, add a line break.
        switch (this.mode) {
        case Template.modes.EVAL:
        case Template.modes.ESCAPED:
        case Template.modes.RAW:
          if (line.lastIndexOf('//') > line.lastIndexOf('\n')) {
            line += '\n';
          }
        }
        switch (this.mode) {
        // Just executing code
        case Template.modes.EVAL:
          this.source += '    ; ' + line + '\n';
          break;
          // Exec, esc, and output
        case Template.modes.ESCAPED:
          this.source += '    ; __append(escapeFn(' + stripSemi(line) + '))' + '\n';
          break;
          // Exec and output
        case Template.modes.RAW:
          this.source += '    ; __append(' + stripSemi(line) + ')' + '\n';
          break;
        case Template.modes.COMMENT:
          // Do nothing
          break;
          // Literal <%% mode, append as raw output
        case Template.modes.LITERAL:
          this._addOutput(line);
          break;
        }
      }
      // In string mode, just add the output
      else {
        this._addOutput(line);
      }
    }

    if (self.opts.compileDebug && newLineCount) {
      this.currentLine += newLineCount;
      this.source += '    ; __line = ' + this.currentLine + '\n';
    }
  }
};

/**
 * Escape characters reserved in XML.
 *
 * This is simply an export of {@link module:utils.escapeXML}.
 *
 * If `markup` is `undefined` or `null`, the empty string is returned.
 *
 * @param {String} markup Input string
 * @return {String} Escaped string
 * @public
 * @func
 * */
exports.escapeXML = utils.escapeXML;

/**
 * Express.js support.
 *
 * This is an alias for {@link module:ejs.renderFile}, in order to support
 * Express.js out-of-the-box.
 *
 * @func
 */

exports.__express = exports.renderFile;

// Add require support
/* istanbul ignore else */
if (require.extensions) {
  require.extensions['.ejs'] = function (module, flnm) {
    console.log('Deprecated: this API will go away in EJS v2.8');
    var filename = flnm || /* istanbul ignore next */ module.filename;
    var options = {
      filename: filename,
      client: true
    };
    var template = fileLoader(filename).toString();
    var fn = exports.compile(template, options);
    module._compile('module.exports = ' + fn.toString() + ';', filename);
  };
}

/**
 * Version of EJS.
 *
 * @readonly
 * @type {String}
 * @public
 */

exports.VERSION = _VERSION_STRING;

/**
 * Name for detection of EJS.
 *
 * @readonly
 * @type {String}
 * @public
 */

exports.name = _NAME;

/* istanbul ignore if */
if (typeof window != 'undefined') {
  window.ejs = exports;
}

},{"../package.json":6,"./utils":2,"fs":3,"path":4}],2:[function(require,module,exports){
/*
 * EJS Embedded JavaScript templates
 * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
 *
 * 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.
 *
*/

/**
 * Private utility functions
 * @module utils
 * @private
 */

'use strict';

var regExpChars = /[|\\{}()[\]^$+*?.]/g;

/**
 * Escape characters reserved in regular expressions.
 *
 * If `string` is `undefined` or `null`, the empty string is returned.
 *
 * @param {String} string Input string
 * @return {String} Escaped string
 * @static
 * @private
 */
exports.escapeRegExpChars = function (string) {
  // istanbul ignore if
  if (!string) {
    return '';
  }
  return String(string).replace(regExpChars, '\\$&');
};

var _ENCODE_HTML_RULES = {
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&#34;',
  "'": '&#39;'
};
var _MATCH_HTML = /[&<>'"]/g;

function encode_char(c) {
  return _ENCODE_HTML_RULES[c] || c;
}

/**
 * Stringified version of constants used by {@link module:utils.escapeXML}.
 *
 * It is used in the process of generating {@link ClientFunction}s.
 *
 * @readonly
 * @type {String}
 */

var escapeFuncStr =
  'var _ENCODE_HTML_RULES = {\n'
+ '      "&": "&amp;"\n'
+ '    , "<": "&lt;"\n'
+ '    , ">": "&gt;"\n'
+ '    , \'"\': "&#34;"\n'
+ '    , "\'": "&#39;"\n'
+ '    }\n'
+ '  , _MATCH_HTML = /[&<>\'"]/g;\n'
+ 'function encode_char(c) {\n'
+ '  return _ENCODE_HTML_RULES[c] || c;\n'
+ '};\n';

/**
 * Escape characters reserved in XML.
 *
 * If `markup` is `undefined` or `null`, the empty string is returned.
 *
 * @implements {EscapeCallback}
 * @param {String} markup Input string
 * @return {String} Escaped string
 * @static
 * @private
 */

exports.escapeXML = function (markup) {
  return markup == undefined
    ? ''
    : String(markup)
      .replace(_MATCH_HTML, encode_char);
};
exports.escapeXML.toString = function () {
  return Function.prototype.toString.call(this) + ';\n' + escapeFuncStr;
};

/**
 * Naive copy of properties from one object to another.
 * Does not recurse into non-scalar properties
 * Does not check to see if the property has a value before copying
 *
 * @param  {Object} to   Destination object
 * @param  {Object} from Source object
 * @return {Object}      Destination object
 * @static
 * @private
 */
exports.shallowCopy = function (to, from) {
  from = from || {};
  for (var p in from) {
    to[p] = from[p];
  }
  return to;
};

/**
 * Naive copy of a list of key names, from one object to another.
 * Only copies property if it is actually defined
 * Does not recurse into non-scalar properties
 *
 * @param  {Object} to   Destination object
 * @param  {Object} from Source object
 * @param  {Array} list List of properties to copy
 * @return {Object}      Destination object
 * @static
 * @private
 */
exports.shallowCopyFromList = function (to, from, list) {
  for (var i = 0; i < list.length; i++) {
    var p = list[i];
    if (typeof from[p] != 'undefined') {
      to[p] = from[p];
    }
  }
  return to;
};

/**
 * Simple in-process cache implementation. Does not implement limits of any
 * sort.
 *
 * @implements Cache
 * @static
 * @private
 */
exports.cache = {
  _data: {},
  set: function (key, val) {
    this._data[key] = val;
  },
  get: function (key) {
    return this._data[key];
  },
  remove: function (key) {
    delete this._data[key];
  },
  reset: function () {
    this._data = {};
  }
};

},{}],3:[function(require,module,exports){

},{}],4:[function(require,module,exports){
(function (process){
// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,
// backported and transplited with Babel, with backwards-compat fixes

// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// resolves . and .. elements in a path array with directory names there
// must be no slashes, empty elements, or device names (c:\) in the array
// (so also no leading and trailing slashes - it does not distinguish
// relative and absolute paths)
function normalizeArray(parts, allowAboveRoot) {
  // if the path tries to go above the root, `up` ends up > 0
  var up = 0;
  for (var i = parts.length - 1; i >= 0; i--) {
    var last = parts[i];
    if (last === '.') {
      parts.splice(i, 1);
    } else if (last === '..') {
      parts.splice(i, 1);
      up++;
    } else if (up) {
      parts.splice(i, 1);
      up--;
    }
  }

  // if the path is allowed to go above the root, restore leading ..s
  if (allowAboveRoot) {
    for (; up--; up) {
      parts.unshift('..');
    }
  }

  return parts;
}

// path.resolve([from ...], to)
// posix version
exports.resolve = function() {
  var resolvedPath = '',
      resolvedAbsolute = false;

  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
    var path = (i >= 0) ? arguments[i] : process.cwd();

    // Skip empty and invalid entries
    if (typeof path !== 'string') {
      throw new TypeError('Arguments to path.resolve must be strings');
    } else if (!path) {
      continue;
    }

    resolvedPath = path + '/' + resolvedPath;
    resolvedAbsolute = path.charAt(0) === '/';
  }

  // At this point the path should be resolved to a full absolute path, but
  // handle relative paths to be safe (might happen when process.cwd() fails)

  // Normalize the path
  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
    return !!p;
  }), !resolvedAbsolute).join('/');

  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
};

// path.normalize(path)
// posix version
exports.normalize = function(path) {
  var isAbsolute = exports.isAbsolute(path),
      trailingSlash = substr(path, -1) === '/';

  // Normalize the path
  path = normalizeArray(filter(path.split('/'), function(p) {
    return !!p;
  }), !isAbsolute).join('/');

  if (!path && !isAbsolute) {
    path = '.';
  }
  if (path && trailingSlash) {
    path += '/';
  }

  return (isAbsolute ? '/' : '') + path;
};

// posix version
exports.isAbsolute = function(path) {
  return path.charAt(0) === '/';
};

// posix version
exports.join = function() {
  var paths = Array.prototype.slice.call(arguments, 0);
  return exports.normalize(filter(paths, function(p, index) {
    if (typeof p !== 'string') {
      throw new TypeError('Arguments to path.join must be strings');
    }
    return p;
  }).join('/'));
};


// path.relative(from, to)
// posix version
exports.relative = function(from, to) {
  from = exports.resolve(from).substr(1);
  to = exports.resolve(to).substr(1);

  function trim(arr) {
    var start = 0;
    for (; start < arr.length; start++) {
      if (arr[start] !== '') break;
    }

    var end = arr.length - 1;
    for (; end >= 0; end--) {
      if (arr[end] !== '') break;
    }

    if (start > end) return [];
    return arr.slice(start, end - start + 1);
  }

  var fromParts = trim(from.split('/'));
  var toParts = trim(to.split('/'));

  var length = Math.min(fromParts.length, toParts.length);
  var samePartsLength = length;
  for (var i = 0; i < length; i++) {
    if (fromParts[i] !== toParts[i]) {
      samePartsLength = i;
      break;
    }
  }

  var outputParts = [];
  for (var i = samePartsLength; i < fromParts.length; i++) {
    outputParts.push('..');
  }

  outputParts = outputParts.concat(toParts.slice(samePartsLength));

  return outputParts.join('/');
};

exports.sep = '/';
exports.delimiter = ':';

exports.dirname = function (path) {
  if (typeof path !== 'string') path = path + '';
  if (path.length === 0) return '.';
  var code = path.charCodeAt(0);
  var hasRoot = code === 47 /*/*/;
  var end = -1;
  var matchedSlash = true;
  for (var i = path.length - 1; i >= 1; --i) {
    code = path.charCodeAt(i);
    if (code === 47 /*/*/) {
        if (!matchedSlash) {
          end = i;
          break;
        }
      } else {
      // We saw the first non-path separator
      matchedSlash = false;
    }
  }

  if (end === -1) return hasRoot ? '/' : '.';
  if (hasRoot && end === 1) {
    // return '//';
    // Backwards-compat fix:
    return '/';
  }
  return path.slice(0, end);
};

function basename(path) {
  if (typeof path !== 'string') path = path + '';

  var start = 0;
  var end = -1;
  var matchedSlash = true;
  var i;

  for (i = path.length - 1; i >= 0; --i) {
    if (path.charCodeAt(i) === 47 /*/*/) {
        // If we reached a path separator that was not part of a set of path
        // separators at the end of the string, stop now
        if (!matchedSlash) {
          start = i + 1;
          break;
        }
      } else if (end === -1) {
      // We saw the first non-path separator, mark this as the end of our
      // path component
      matchedSlash = false;
      end = i + 1;
    }
  }

  if (end === -1) return '';
  return path.slice(start, end);
}

// Uses a mixed approach for backwards-compatibility, as ext behavior changed
// in new Node.js versions, so only basename() above is backported here
exports.basename = function (path, ext) {
  var f = basename(path);
  if (ext && f.substr(-1 * ext.length) === ext) {
    f = f.substr(0, f.length - ext.length);
  }
  return f;
};

exports.extname = function (path) {
  if (typeof path !== 'string') path = path + '';
  var startDot = -1;
  var startPart = 0;
  var end = -1;
  var matchedSlash = true;
  // Track the state of characters (if any) we see before our first dot and
  // after any path separator we find
  var preDotState = 0;
  for (var i = path.length - 1; i >= 0; --i) {
    var code = path.charCodeAt(i);
    if (code === 47 /*/*/) {
        // If we reached a path separator that was not part of a set of path
        // separators at the end of the string, stop now
        if (!matchedSlash) {
          startPart = i + 1;
          break;
        }
        continue;
      }
    if (end === -1) {
      // We saw the first non-path separator, mark this as the end of our
      // extension
      matchedSlash = false;
      end = i + 1;
    }
    if (code === 46 /*.*/) {
        // If this is our first dot, mark it as the start of our extension
        if (startDot === -1)
          startDot = i;
        else if (preDotState !== 1)
          preDotState = 1;
    } else if (startDot !== -1) {
      // We saw a non-dot and non-path separator before our dot, so we should
      // have a good chance at having a non-empty extension
      preDotState = -1;
    }
  }

  if (startDot === -1 || end === -1 ||
      // We saw a non-dot character immediately before the dot
      preDotState === 0 ||
      // The (right-most) trimmed path component is exactly '..'
      preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
    return '';
  }
  return path.slice(startDot, end);
};

function filter (xs, f) {
    if (xs.filter) return xs.filter(f);
    var res = [];
    for (var i = 0; i < xs.length; i++) {
        if (f(xs[i], i, xs)) res.push(xs[i]);
    }
    return res;
}

// String.prototype.substr - negative index don't work in IE8
var substr = 'ab'.substr(-1) === 'b'
    ? function (str, start, len) { return str.substr(start, len) }
    : function (str, start, len) {
        if (start < 0) start = str.length + start;
        return str.substr(start, len);
    }
;

}).call(this,require('_process'))
},{"_process":5}],5:[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};

// cached from whatever global is present so that test runners that stub it
// don't break things.  But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals.  It's inside a
// function because try/catches deoptimize in certain engines.

var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout() {
    throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
    throw new Error('clearTimeout has not been defined');
}
(function () {
    try {
        if (typeof setTimeout === 'function') {
            cachedSetTimeout = setTimeout;
        } else {
            cachedSetTimeout = defaultSetTimout;
        }
    } catch (e) {
        cachedSetTimeout = defaultSetTimout;
    }
    try {
        if (typeof clearTimeout === 'function') {
            cachedClearTimeout = clearTimeout;
        } else {
            cachedClearTimeout = defaultClearTimeout;
        }
    } catch (e) {
        cachedClearTimeout = defaultClearTimeout;
    }
} ())
function runTimeout(fun) {
    if (cachedSetTimeout === setTimeout) {
        //normal enviroments in sane situations
        return setTimeout(fun, 0);
    }
    // if setTimeout wasn't available but was latter defined
    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
        cachedSetTimeout = setTimeout;
        return setTimeout(fun, 0);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedSetTimeout(fun, 0);
    } catch(e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
            return cachedSetTimeout.call(null, fun, 0);
        } catch(e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
            return cachedSetTimeout.call(this, fun, 0);
        }
    }


}
function runClearTimeout(marker) {
    if (cachedClearTimeout === clearTimeout) {
        //normal enviroments in sane situations
        return clearTimeout(marker);
    }
    // if clearTimeout wasn't available but was latter defined
    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
        cachedClearTimeout = clearTimeout;
        return clearTimeout(marker);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedClearTimeout(marker);
    } catch (e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
            return cachedClearTimeout.call(null, marker);
        } catch (e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
            return cachedClearTimeout.call(this, marker);
        }
    }



}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;

function cleanUpNextTick() {
    if (!draining || !currentQueue) {
        return;
    }
    draining = false;
    if (currentQueue.length) {
        queue = currentQueue.concat(queue);
    } else {
        queueIndex = -1;
    }
    if (queue.length) {
        drainQueue();
    }
}

function drainQueue() {
    if (draining) {
        return;
    }
    var timeout = runTimeout(cleanUpNextTick);
    draining = true;

    var len = queue.length;
    while(len) {
        currentQueue = queue;
        queue = [];
        while (++queueIndex < len) {
            if (currentQueue) {
                currentQueue[queueIndex].run();
            }
        }
        queueIndex = -1;
        len = queue.length;
    }
    currentQueue = null;
    draining = false;
    runClearTimeout(timeout);
}

process.nextTick = function (fun) {
    var args = new Array(arguments.length - 1);
    if (arguments.length > 1) {
        for (var i = 1; i < arguments.length; i++) {
            args[i - 1] = arguments[i];
        }
    }
    queue.push(new Item(fun, args));
    if (queue.length === 1 && !draining) {
        runTimeout(drainQueue);
    }
};

// v8 likes predictible objects
function Item(fun, array) {
    this.fun = fun;
    this.array = array;
}
Item.prototype.run = function () {
    this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;

process.listeners = function (name) { return [] }

process.binding = function (name) {
    throw new Error('process.binding is not supported');
};

process.cwd = function () { return '/' };
process.chdir = function (dir) {
    throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };

},{}],6:[function(require,module,exports){
module.exports={
  "name": "ejs",
  "description": "Embedded JavaScript templates",
  "keywords": [
    "template",
    "engine",
    "ejs"
  ],
  "version": "2.7.4",
  "author": "Matthew Eernisse <mde@fleegix.org> (http://fleegix.org)",
  "license": "Apache-2.0",
  "main": "./lib/ejs.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/mde/ejs.git"
  },
  "bugs": "https://github.com/mde/ejs/issues",
  "homepage": "https://github.com/mde/ejs",
  "dependencies": {},
  "devDependencies": {
    "browserify": "^13.1.1",
    "eslint": "^4.14.0",
    "git-directory-deploy": "^1.5.1",
    "jake": "^10.3.1",
    "jsdoc": "^3.4.0",
    "lru-cache": "^4.0.1",
    "mocha": "^5.0.5",
    "uglify-js": "^3.3.16"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "scripts": {
    "test": "mocha",
    "postinstall": "node ./postinstall.js"
  }
}

},{}]},{},[1])(1)
});
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ejs=f()}})(function(){var define,module,exports;return function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r}()({1:[function(require,module,exports){"use strict";var fs=require("fs");var path=require("path");var utils=require("./utils");var scopeOptionWarned=false;var _VERSION_STRING=require("../package.json").version;var _DEFAULT_OPEN_DELIMITER="<";var _DEFAULT_CLOSE_DELIMITER=">";var _DEFAULT_DELIMITER="%";var _DEFAULT_LOCALS_NAME="locals";var _NAME="ejs";var _REGEX_STRING="(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)";var _OPTS_PASSABLE_WITH_DATA=["delimiter","scope","context","debug","compileDebug","client","_with","rmWhitespace","strict","filename","async"];var _OPTS_PASSABLE_WITH_DATA_EXPRESS=_OPTS_PASSABLE_WITH_DATA.concat("cache");var _BOM=/^\uFEFF/;exports.cache=utils.cache;exports.fileLoader=fs.readFileSync;exports.localsName=_DEFAULT_LOCALS_NAME;exports.promiseImpl=new Function("return this;")().Promise;exports.resolveInclude=function(name,filename,isDir){var dirname=path.dirname;var extname=path.extname;var resolve=path.resolve;var includePath=resolve(isDir?filename:dirname(filename),name);var ext=extname(name);if(!ext){includePath+=".ejs"}return includePath};function getIncludePath(path,options){var includePath;var filePath;var views=options.views;var match=/^[A-Za-z]+:\\|^\//.exec(path);if(match&&match.length){includePath=exports.resolveInclude(path.replace(/^\/*/,""),options.root||"/",true)}else{if(options.filename){filePath=exports.resolveInclude(path,options.filename);if(fs.existsSync(filePath)){includePath=filePath}}if(!includePath){if(Array.isArray(views)&&views.some(function(v){filePath=exports.resolveInclude(path,v,true);return fs.existsSync(filePath)})){includePath=filePath}}if(!includePath){throw new Error('Could not find the include file "'+options.escapeFunction(path)+'"')}}return includePath}function handleCache(options,template){var func;var filename=options.filename;var hasTemplate=arguments.length>1;if(options.cache){if(!filename){throw new Error("cache option requires a filename")}func=exports.cache.get(filename);if(func){return func}if(!hasTemplate){template=fileLoader(filename).toString().replace(_BOM,"")}}else if(!hasTemplate){if(!filename){throw new Error("Internal EJS error: no file name or template "+"provided")}template=fileLoader(filename).toString().replace(_BOM,"")}func=exports.compile(template,options);if(options.cache){exports.cache.set(filename,func)}return func}function tryHandleCache(options,data,cb){var result;if(!cb){if(typeof exports.promiseImpl=="function"){return new exports.promiseImpl(function(resolve,reject){try{result=handleCache(options)(data);resolve(result)}catch(err){reject(err)}})}else{throw new Error("Please provide a callback function")}}else{try{result=handleCache(options)(data)}catch(err){return cb(err)}cb(null,result)}}function fileLoader(filePath){return exports.fileLoader(filePath)}function includeFile(path,options){var opts=utils.shallowCopy({},options);opts.filename=getIncludePath(path,opts);return handleCache(opts)}function includeSource(path,options){var opts=utils.shallowCopy({},options);var includePath;var template;includePath=getIncludePath(path,opts);template=fileLoader(includePath).toString().replace(_BOM,"");opts.filename=includePath;var templ=new Template(template,opts);templ.generateSource();return{source:templ.source,filename:includePath,template:template}}function rethrow(err,str,flnm,lineno,esc){var lines=str.split("\n");var start=Math.max(lineno-3,0);var end=Math.min(lines.length,lineno+3);var filename=esc(flnm);var context=lines.slice(start,end).map(function(line,i){var curr=i+start+1;return(curr==lineno?" >> ":"    ")+curr+"| "+line}).join("\n");err.path=filename;err.message=(filename||"ejs")+":"+lineno+"\n"+context+"\n\n"+err.message;throw err}function stripSemi(str){return str.replace(/;(\s*$)/,"$1")}exports.compile=function compile(template,opts){var templ;if(opts&&opts.scope){if(!scopeOptionWarned){console.warn("`scope` option is deprecated and will be removed in EJS 3");scopeOptionWarned=true}if(!opts.context){opts.context=opts.scope}delete opts.scope}templ=new Template(template,opts);return templ.compile()};exports.render=function(template,d,o){var data=d||{};var opts=o||{};if(arguments.length==2){utils.shallowCopyFromList(opts,data,_OPTS_PASSABLE_WITH_DATA)}return handleCache(opts,template)(data)};exports.renderFile=function(){var args=Array.prototype.slice.call(arguments);var filename=args.shift();var cb;var opts={filename:filename};var data;var viewOpts;if(typeof arguments[arguments.length-1]=="function"){cb=args.pop()}if(args.length){data=args.shift();if(args.length){utils.shallowCopy(opts,args.pop())}else{if(data.settings){if(data.settings.views){opts.views=data.settings.views}if(data.settings["view cache"]){opts.cache=true}viewOpts=data.settings["view options"];if(viewOpts){utils.shallowCopy(opts,viewOpts)}}utils.shallowCopyFromList(opts,data,_OPTS_PASSABLE_WITH_DATA_EXPRESS)}opts.filename=filename}else{data={}}return tryHandleCache(opts,data,cb)};exports.Template=Template;exports.clearCache=function(){exports.cache.reset()};function Template(text,opts){opts=opts||{};var options={};this.templateText=text;this.mode=null;this.truncate=false;this.currentLine=1;this.source="";this.dependencies=[];options.client=opts.client||false;options.escapeFunction=opts.escape||opts.escapeFunction||utils.escapeXML;options.compileDebug=opts.compileDebug!==false;options.debug=!!opts.debug;options.filename=opts.filename;options.openDelimiter=opts.openDelimiter||exports.openDelimiter||_DEFAULT_OPEN_DELIMITER;options.closeDelimiter=opts.closeDelimiter||exports.closeDelimiter||_DEFAULT_CLOSE_DELIMITER;options.delimiter=opts.delimiter||exports.delimiter||_DEFAULT_DELIMITER;options.strict=opts.strict||false;options.context=opts.context;options.cache=opts.cache||false;options.rmWhitespace=opts.rmWhitespace;options.root=opts.root;options.outputFunctionName=opts.outputFunctionName;options.localsName=opts.localsName||exports.localsName||_DEFAULT_LOCALS_NAME;options.views=opts.views;options.async=opts.async;options.destructuredLocals=opts.destructuredLocals;options.legacyInclude=typeof opts.legacyInclude!="undefined"?!!opts.legacyInclude:true;if(options.strict){options._with=false}else{options._with=typeof opts._with!="undefined"?opts._with:true}this.opts=options;this.regex=this.createRegex()}Template.modes={EVAL:"eval",ESCAPED:"escaped",RAW:"raw",COMMENT:"comment",LITERAL:"literal"};Template.prototype={createRegex:function(){var str=_REGEX_STRING;var delim=utils.escapeRegExpChars(this.opts.delimiter);var open=utils.escapeRegExpChars(this.opts.openDelimiter);var close=utils.escapeRegExpChars(this.opts.closeDelimiter);str=str.replace(/%/g,delim).replace(/</g,open).replace(/>/g,close);return new RegExp(str)},compile:function(){var src;var fn;var opts=this.opts;var prepended="";var appended="";var escapeFn=opts.escapeFunction;var ctor;if(!this.source){this.generateSource();prepended+='  var __output = "";\n'+"  function __append(s) { if (s !== undefined && s !== null) __output += s }\n";if(opts.outputFunctionName){prepended+="  var "+opts.outputFunctionName+" = __append;"+"\n"}if(opts.destructuredLocals&&opts.destructuredLocals.length){var destructuring="  var __locals = ("+opts.localsName+" || {}),\n";for(var i=0;i<opts.destructuredLocals.length;i++){var name=opts.destructuredLocals[i];if(i>0){destructuring+=",\n  "}destructuring+=name+" = __locals."+name}prepended+=destructuring+";\n"}if(opts._with!==false){prepended+="  with ("+opts.localsName+" || {}) {"+"\n";appended+="  }"+"\n"}appended+="  return __output;"+"\n";this.source=prepended+this.source+appended}if(opts.compileDebug){src="var __line = 1"+"\n"+"  , __lines = "+JSON.stringify(this.templateText)+"\n"+"  , __filename = "+(opts.filename?JSON.stringify(opts.filename):"undefined")+";"+"\n"+"try {"+"\n"+this.source+"} catch (e) {"+"\n"+"  rethrow(e, __lines, __filename, __line, escapeFn);"+"\n"+"}"+"\n"}else{src=this.source}if(opts.client){src="escapeFn = escapeFn || "+escapeFn.toString()+";"+"\n"+src;if(opts.compileDebug){src="rethrow = rethrow || "+rethrow.toString()+";"+"\n"+src}}if(opts.strict){src='"use strict";\n'+src}if(opts.debug){console.log(src)}if(opts.compileDebug&&opts.filename){src=src+"\n"+"//# sourceURL="+opts.filename+"\n"}try{if(opts.async){try{ctor=new Function("return (async function(){}).constructor;")()}catch(e){if(e instanceof SyntaxError){throw new Error("This environment does not support async/await")}else{throw e}}}else{ctor=Function}fn=new ctor(opts.localsName+", escapeFn, include, rethrow",src)}catch(e){if(e instanceof SyntaxError){if(opts.filename){e.message+=" in "+opts.filename}e.message+=" while compiling ejs\n\n";e.message+="If the above error is not helpful, you may want to try EJS-Lint:\n";e.message+="https://github.com/RyanZim/EJS-Lint";if(!opts.async){e.message+="\n";e.message+="Or, if you meant to create an async function, pass `async: true` as an option."}}throw e}var returnedFn=opts.client?fn:function anonymous(data){var include=function(path,includeData){var d=utils.shallowCopy({},data);if(includeData){d=utils.shallowCopy(d,includeData)}return includeFile(path,opts)(d)};return fn.apply(opts.context,[data||{},escapeFn,include,rethrow])};returnedFn.dependencies=this.dependencies;if(opts.filename&&typeof Object.defineProperty==="function"){var filename=opts.filename;var basename=path.basename(filename,path.extname(filename));try{Object.defineProperty(returnedFn,"name",{value:basename,writable:false,enumerable:false,configurable:true})}catch(e){}}return returnedFn},generateSource:function(){var opts=this.opts;if(opts.rmWhitespace){this.templateText=this.templateText.replace(/[\r\n]+/g,"\n").replace(/^\s+|\s+$/gm,"")}this.templateText=this.templateText.replace(/[ \t]*<%_/gm,"<%_").replace(/_%>[ \t]*/gm,"_%>");var self=this;var matches=this.parseTemplateText();var d=this.opts.delimiter;var o=this.opts.openDelimiter;var c=this.opts.closeDelimiter;if(matches&&matches.length){matches.forEach(function(line,index){var opening;var closing;var include;var includeOpts;var includeObj;var includeSrc;if(line.indexOf(o+d)===0&&line.indexOf(o+d+d)!==0){closing=matches[index+2];if(!(closing==d+c||closing=="-"+d+c||closing=="_"+d+c)){throw new Error('Could not find matching close tag for "'+line+'".')}}if(opts.legacyInclude&&(include=line.match(/^\s*include\s+(\S+)/))){opening=matches[index-1];if(opening&&(opening==o+d||opening==o+d+"-"||opening==o+d+"_")){includeOpts=utils.shallowCopy({},self.opts);includeObj=includeSource(include[1],includeOpts);if(self.opts.compileDebug){includeSrc="    ; (function(){"+"\n"+"      var __line = 1"+"\n"+"      , __lines = "+JSON.stringify(includeObj.template)+"\n"+"      , __filename = "+JSON.stringify(includeObj.filename)+";"+"\n"+"      try {"+"\n"+includeObj.source+"      } catch (e) {"+"\n"+"        rethrow(e, __lines, __filename, __line, escapeFn);"+"\n"+"      }"+"\n"+"    ; }).call(this)"+"\n"}else{includeSrc="    ; (function(){"+"\n"+includeObj.source+"    ; }).call(this)"+"\n"}self.source+=includeSrc;self.dependencies.push(exports.resolveInclude(include[1],includeOpts.filename));return}}self.scanLine(line)})}},parseTemplateText:function(){var str=this.templateText;var pat=this.regex;var result=pat.exec(str);var arr=[];var firstPos;while(result){firstPos=result.index;if(firstPos!==0){arr.push(str.substring(0,firstPos));str=str.slice(firstPos)}arr.push(result[0]);str=str.slice(result[0].length);result=pat.exec(str)}if(str){arr.push(str)}return arr},_addOutput:function(line){if(this.truncate){line=line.replace(/^(?:\r\n|\r|\n)/,"");this.truncate=false}if(!line){return line}line=line.replace(/\\/g,"\\\\");line=line.replace(/\n/g,"\\n");line=line.replace(/\r/g,"\\r");line=line.replace(/"/g,'\\"');this.source+='    ; __append("'+line+'")'+"\n"},scanLine:function(line){var self=this;var d=this.opts.delimiter;var o=this.opts.openDelimiter;var c=this.opts.closeDelimiter;var newLineCount=0;newLineCount=line.split("\n").length-1;switch(line){case o+d:case o+d+"_":this.mode=Template.modes.EVAL;break;case o+d+"=":this.mode=Template.modes.ESCAPED;break;case o+d+"-":this.mode=Template.modes.RAW;break;case o+d+"#":this.mode=Template.modes.COMMENT;break;case o+d+d:this.mode=Template.modes.LITERAL;this.source+='    ; __append("'+line.replace(o+d+d,o+d)+'")'+"\n";break;case d+d+c:this.mode=Template.modes.LITERAL;this.source+='    ; __append("'+line.replace(d+d+c,d+c)+'")'+"\n";break;case d+c:case"-"+d+c:case"_"+d+c:if(this.mode==Template.modes.LITERAL){this._addOutput(line)}this.mode=null;this.truncate=line.indexOf("-")===0||line.indexOf("_")===0;break;default:if(this.mode){switch(this.mode){case Template.modes.EVAL:case Template.modes.ESCAPED:case Template.modes.RAW:if(line.lastIndexOf("//")>line.lastIndexOf("\n")){line+="\n"}}switch(this.mode){case Template.modes.EVAL:this.source+="    ; "+line+"\n";break;case Template.modes.ESCAPED:this.source+="    ; __append(escapeFn("+stripSemi(line)+"))"+"\n";break;case Template.modes.RAW:this.source+="    ; __append("+stripSemi(line)+")"+"\n";break;case Template.modes.COMMENT:break;case Template.modes.LITERAL:this._addOutput(line);break}}else{this._addOutput(line)}}if(self.opts.compileDebug&&newLineCount){this.currentLine+=newLineCount;this.source+="    ; __line = "+this.currentLine+"\n"}}};exports.escapeXML=utils.escapeXML;exports.__express=exports.renderFile;if(require.extensions){require.extensions[".ejs"]=function(module,flnm){console.log("Deprecated: this API will go away in EJS v2.8");var filename=flnm||module.filename;var options={filename:filename,client:true};var template=fileLoader(filename).toString();var fn=exports.compile(template,options);module._compile("module.exports = "+fn.toString()+";",filename)}}exports.VERSION=_VERSION_STRING;exports.name=_NAME;if(typeof window!="undefined"){window.ejs=exports}},{"../package.json":6,"./utils":2,fs:3,path:4}],2:[function(require,module,exports){"use strict";var regExpChars=/[|\\{}()[\]^$+*?.]/g;exports.escapeRegExpChars=function(string){if(!string){return""}return String(string).replace(regExpChars,"\\$&")};var _ENCODE_HTML_RULES={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&#34;","'":"&#39;"};var _MATCH_HTML=/[&<>'"]/g;function encode_char(c){return _ENCODE_HTML_RULES[c]||c}var escapeFuncStr="var _ENCODE_HTML_RULES = {\n"+'      "&": "&amp;"\n'+'    , "<": "&lt;"\n'+'    , ">": "&gt;"\n'+'    , \'"\': "&#34;"\n'+'    , "\'": "&#39;"\n'+"    }\n"+"  , _MATCH_HTML = /[&<>'\"]/g;\n"+"function encode_char(c) {\n"+"  return _ENCODE_HTML_RULES[c] || c;\n"+"};\n";exports.escapeXML=function(markup){return markup==undefined?"":String(markup).replace(_MATCH_HTML,encode_char)};exports.escapeXML.toString=function(){return Function.prototype.toString.call(this)+";\n"+escapeFuncStr};exports.shallowCopy=function(to,from){from=from||{};for(var p in from){to[p]=from[p]}return to};exports.shallowCopyFromList=function(to,from,list){for(var i=0;i<list.length;i++){var p=list[i];if(typeof from[p]!="undefined"){to[p]=from[p]}}return to};exports.cache={_data:{},set:function(key,val){this._data[key]=val},get:function(key){return this._data[key]},remove:function(key){delete this._data[key]},reset:function(){this._data={}}}},{}],3:[function(require,module,exports){},{}],4:[function(require,module,exports){(function(process){function normalizeArray(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}exports.resolve=function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:process.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){continue}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=normalizeArray(filter(resolvedPath.split("/"),function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."};exports.normalize=function(path){var isAbsolute=exports.isAbsolute(path),trailingSlash=substr(path,-1)==="/";path=normalizeArray(filter(path.split("/"),function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path};exports.isAbsolute=function(path){return path.charAt(0)==="/"};exports.join=function(){var paths=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(paths,function(p,index){if(typeof p!=="string"){throw new TypeError("Arguments to path.join must be strings")}return p}).join("/"))};exports.relative=function(from,to){from=exports.resolve(from).substr(1);to=exports.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")};exports.sep="/";exports.delimiter=":";exports.dirname=function(path){if(typeof path!=="string")path=path+"";if(path.length===0)return".";var code=path.charCodeAt(0);var hasRoot=code===47;var end=-1;var matchedSlash=true;for(var i=path.length-1;i>=1;--i){code=path.charCodeAt(i);if(code===47){if(!matchedSlash){end=i;break}}else{matchedSlash=false}}if(end===-1)return hasRoot?"/":".";if(hasRoot&&end===1){return"/"}return path.slice(0,end)};function basename(path){if(typeof path!=="string")path=path+"";var start=0;var end=-1;var matchedSlash=true;var i;for(i=path.length-1;i>=0;--i){if(path.charCodeAt(i)===47){if(!matchedSlash){start=i+1;break}}else if(end===-1){matchedSlash=false;end=i+1}}if(end===-1)return"";return path.slice(start,end)}exports.basename=function(path,ext){var f=basename(path);if(ext&&f.substr(-1*ext.length)===ext){f=f.substr(0,f.length-ext.length)}return f};exports.extname=function(path){if(typeof path!=="string")path=path+"";var startDot=-1;var startPart=0;var end=-1;var matchedSlash=true;var preDotState=0;for(var i=path.length-1;i>=0;--i){var code=path.charCodeAt(i);if(code===47){if(!matchedSlash){startPart=i+1;break}continue}if(end===-1){matchedSlash=false;end=i+1}if(code===46){if(startDot===-1)startDot=i;else if(preDotState!==1)preDotState=1}else if(startDot!==-1){preDotState=-1}}if(startDot===-1||end===-1||preDotState===0||preDotState===1&&startDot===end-1&&startDot===startPart+1){return""}return path.slice(startDot,end)};function filter(xs,f){if(xs.filter)return xs.filter(f);var res=[];for(var i=0;i<xs.length;i++){if(f(xs[i],i,xs))res.push(xs[i])}return res}var substr="ab".substr(-1)==="b"?function(str,start,len){return str.substr(start,len)}:function(str,start,len){if(start<0)start=str.length+start;return str.substr(start,len)}}).call(this,require("_process"))},{_process:5}],5:[function(require,module,exports){var process=module.exports={};var cachedSetTimeout;var cachedClearTimeout;function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}(function(){try{if(typeof setTimeout==="function"){cachedSetTimeout=setTimeout}else{cachedSetTimeout=defaultSetTimout}}catch(e){cachedSetTimeout=defaultSetTimout}try{if(typeof clearTimeout==="function"){cachedClearTimeout=clearTimeout}else{cachedClearTimeout=defaultClearTimeout}}catch(e){cachedClearTimeout=defaultClearTimeout}})();function runTimeout(fun){if(cachedSetTimeout===setTimeout){return setTimeout(fun,0)}if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout){cachedSetTimeout=setTimeout;return setTimeout(fun,0)}try{return cachedSetTimeout(fun,0)}catch(e){try{return cachedSetTimeout.call(null,fun,0)}catch(e){return cachedSetTimeout.call(this,fun,0)}}}function runClearTimeout(marker){if(cachedClearTimeout===clearTimeout){return clearTimeout(marker)}if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout){cachedClearTimeout=clearTimeout;return clearTimeout(marker)}try{return cachedClearTimeout(marker)}catch(e){try{return cachedClearTimeout.call(null,marker)}catch(e){return cachedClearTimeout.call(this,marker)}}}var queue=[];var draining=false;var currentQueue;var queueIndex=-1;function cleanUpNextTick(){if(!draining||!currentQueue){return}draining=false;if(currentQueue.length){queue=currentQueue.concat(queue)}else{queueIndex=-1}if(queue.length){drainQueue()}}function drainQueue(){if(draining){return}var timeout=runTimeout(cleanUpNextTick);draining=true;var len=queue.length;while(len){currentQueue=queue;queue=[];while(++queueIndex<len){if(currentQueue){currentQueue[queueIndex].run()}}queueIndex=-1;len=queue.length}currentQueue=null;draining=false;runClearTimeout(timeout)}process.nextTick=function(fun){var args=new Array(arguments.length-1);if(arguments.length>1){for(var i=1;i<arguments.length;i++){args[i-1]=arguments[i]}}queue.push(new Item(fun,args));if(queue.length===1&&!draining){runTimeout(drainQueue)}};function Item(fun,array){this.fun=fun;this.array=array}Item.prototype.run=function(){this.fun.apply(null,this.array)};process.title="browser";process.browser=true;process.env={};process.argv=[];process.version="";process.versions={};function noop(){}process.on=noop;process.addListener=noop;process.once=noop;process.off=noop;process.removeListener=noop;process.removeAllListeners=noop;process.emit=noop;process.prependListener=noop;process.prependOnceListener=noop;process.listeners=function(name){return[]};process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")};process.umask=function(){return 0}},{}],6:[function(require,module,exports){module.exports={name:"ejs",description:"Embedded JavaScript templates",keywords:["template","engine","ejs"],version:"2.7.4",author:"Matthew Eernisse <mde@fleegix.org> (http://fleegix.org)",license:"Apache-2.0",main:"./lib/ejs.js",repository:{type:"git",url:"git://github.com/mde/ejs.git"},bugs:"https://github.com/mde/ejs/issues",homepage:"https://github.com/mde/ejs",dependencies:{},devDependencies:{browserify:"^13.1.1",eslint:"^4.14.0","git-directory-deploy":"^1.5.1",jake:"^10.3.1",jsdoc:"^3.4.0","lru-cache":"^4.0.1",mocha:"^5.0.5","uglify-js":"^3.3.16"},engines:{node:">=0.10.0"},scripts:{test:"mocha",postinstall:"node ./postinstall.js"}}},{}]},{},[1])(1)});
var fs = require('fs');
var execSync = require('child_process').execSync;
var exec = function (cmd) {
  execSync(cmd, {stdio: 'inherit'});
};

/* global jake, task, desc, publishTask */

task('build', ['lint', 'clean', 'browserify', 'minify'], function () {
  console.log('Build completed.');
});

desc('Cleans browerified/minified files and package files');
task('clean', ['clobber'], function () {
  jake.rmRf('./ejs.js');
  jake.rmRf('./ejs.min.js');
  console.log('Cleaned up compiled files.');
});

desc('Lints the source code');
task('lint', ['clean'], function () {
  exec('./node_modules/.bin/eslint "**/*.js"');
  console.log('Linting completed.');
});

task('browserify', function () {
  exec('./node_modules/browserify/bin/cmd.js --standalone ejs lib/ejs.js > ejs.js');
  console.log('Browserification completed.');
});

task('minify', function () {
  exec('./node_modules/uglify-js/bin/uglifyjs ejs.js > ejs.min.js');
  console.log('Minification completed.');
});

desc('Generates the EJS API docs');
task('doc', function (dev) {
  jake.rmRf('out');
  var p = dev ? '-p' : '';
  exec('./node_modules/.bin/jsdoc ' + p + ' -c jsdoc.json lib/* docs/jsdoc/*');
  console.log('Documentation generated.');
});

desc('Publishes the EJS API docs');
task('docPublish', ['doc'], function () {
  fs.writeFileSync('out/CNAME', 'api.ejs.co');
  console.log('Pushing docs to gh-pages...');
  exec('./node_modules/.bin/git-directory-deploy --directory out/');
  console.log('Docs published to gh-pages.');
});

desc('Runs the EJS test suite');
task('test', ['lint'], function () {
  exec('./node_modules/.bin/mocha');
});

publishTask('ejs', ['build'], function () {
  this.packageFiles.include([
    'jakefile.js',
    'README.md',
    'LICENSE',
    'package.json',
    'postinstall.js',
    'ejs.js',
    'ejs.min.js',
    'lib/**'
  ]);
});

jake.Task.publish.on('complete', function () {
  console.log('Updating hosted docs...');
  console.log('If this fails, run jake docPublish to re-try.');
  jake.Task.docPublish.invoke();
});
{
  "author": {
    "name": "Matthew Eernisse",
    "email": "mde@fleegix.org",
    "url": "http://fleegix.org"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Embedded JavaScript templates",
  "devDependencies": {
    "browserify": "^13.1.1",
    "eslint": "^4.14.0",
    "git-directory-deploy": "^1.5.1",
    "jake": "^10.3.1",
    "jsdoc": "^3.4.0",
    "lru-cache": "^4.0.1",
    "mocha": "^5.0.5",
    "uglify-js": "^3.3.16"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "homepage": "https://github.com/mde/ejs",
  "license": "Apache-2.0",
  "main": "./lib/ejs.js",
  "name": "ejs",
  "repository": {
    "type": "git",
    "url": "git://github.com/mde/ejs.git"
  },
  "version": "2.7.4"
}#!/usr/bin/env node

'use strict';

function isTrue(value) {
  return !!value && value !== '0' && value !== 'false';
}

let envDisable = isTrue(process.env.DISABLE_OPENCOLLECTIVE) || isTrue(process.env.CI);
let logLevel = process.env.npm_config_loglevel;
let logLevelDisplay = ['silent', 'error', 'warn'].indexOf(logLevel) > -1;

if (!envDisable && !logLevelDisplay) {
  console.log('Thank you for installing \u001b[35mEJS\u001b[0m: built with the \u001b[32mJake\u001b[0m JavaScript build tool (\u001b[32mhttps://jakejs.com/\u001b[0m)\n');
}


/*
 * EJS Embedded JavaScript templates
 * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
*/

'use strict';

/**
 * @file Embedded JavaScript templating engine. {@link http://ejs.co}
 * @author Matthew Eernisse <mde@fleegix.org>
 * @author Tiancheng "Timothy" Gu <timothygu99@gmail.com>
 * @project EJS
 * @license {@link http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0}
 */

/**
 * EJS internal functions.
 *
 * Technically this "module" lies in the same file as {@link module:ejs}, for
 * the sake of organization all the private functions re grouped into this
 * module.
 *
 * @module ejs-internal
 * @private
 */

/**
 * Embedded JavaScript templating engine.
 *
 * @module ejs
 * @public
 */

var fs = require('fs');
var path = require('path');
var utils = require('./utils');

var scopeOptionWarned = false;
var _VERSION_STRING = require('../package.json').version;
var _DEFAULT_OPEN_DELIMITER = '<';
var _DEFAULT_CLOSE_DELIMITER = '>';
var _DEFAULT_DELIMITER = '%';
var _DEFAULT_LOCALS_NAME = 'locals';
var _NAME = 'ejs';
var _REGEX_STRING = '(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)';
var _OPTS_PASSABLE_WITH_DATA = ['delimiter', 'scope', 'context', 'debug', 'compileDebug',
  'client', '_with', 'rmWhitespace', 'strict', 'filename', 'async'];
// We don't allow 'cache' option to be passed in the data obj for
// the normal `render` call, but this is where Express 2 & 3 put it
// so we make an exception for `renderFile`
var _OPTS_PASSABLE_WITH_DATA_EXPRESS = _OPTS_PASSABLE_WITH_DATA.concat('cache');
var _BOM = /^\uFEFF/;

/**
 * EJS template function cache. This can be a LRU object from lru-cache NPM
 * module. By default, it is {@link module:utils.cache}, a simple in-process
 * cache that grows continuously.
 *
 * @type {Cache}
 */

exports.cache = utils.cache;

/**
 * Custom file loader. Useful for template preprocessing or restricting access
 * to a certain part of the filesystem.
 *
 * @type {fileLoader}
 */

exports.fileLoader = fs.readFileSync;

/**
 * Name of the object containing the locals.
 *
 * This variable is overridden by {@link Options}`.localsName` if it is not
 * `undefined`.
 *
 * @type {String}
 * @public
 */

exports.localsName = _DEFAULT_LOCALS_NAME;

/**
 * Promise implementation -- defaults to the native implementation if available
 * This is mostly just for testability
 *
 * @type {Function}
 * @public
 */

exports.promiseImpl = (new Function('return this;'))().Promise;

/**
 * Get the path to the included file from the parent file path and the
 * specified path.
 *
 * @param {String}  name     specified path
 * @param {String}  filename parent file path
 * @param {Boolean} isDir    parent file path whether is directory
 * @return {String}
 */
exports.resolveInclude = function(name, filename, isDir) {
  var dirname = path.dirname;
  var extname = path.extname;
  var resolve = path.resolve;
  var includePath = resolve(isDir ? filename : dirname(filename), name);
  var ext = extname(name);
  if (!ext) {
    includePath += '.ejs';
  }
  return includePath;
};

/**
 * Get the path to the included file by Options
 *
 * @param  {String}  path    specified path
 * @param  {Options} options compilation options
 * @return {String}
 */
function getIncludePath(path, options) {
  var includePath;
  var filePath;
  var views = options.views;
  var match = /^[A-Za-z]+:\\|^\//.exec(path);

  // Abs path
  if (match && match.length) {
    includePath = exports.resolveInclude(path.replace(/^\/*/,''), options.root || '/', true);
  }
  // Relative paths
  else {
    // Look relative to a passed filename first
    if (options.filename) {
      filePath = exports.resolveInclude(path, options.filename);
      if (fs.existsSync(filePath)) {
        includePath = filePath;
      }
    }
    // Then look in any views directories
    if (!includePath) {
      if (Array.isArray(views) && views.some(function (v) {
        filePath = exports.resolveInclude(path, v, true);
        return fs.existsSync(filePath);
      })) {
        includePath = filePath;
      }
    }
    if (!includePath) {
      throw new Error('Could not find the include file "' +
          options.escapeFunction(path) + '"');
    }
  }
  return includePath;
}

/**
 * Get the template from a string or a file, either compiled on-the-fly or
 * read from cache (if enabled), and cache the template if needed.
 *
 * If `template` is not set, the file specified in `options.filename` will be
 * read.
 *
 * If `options.cache` is true, this function reads the file from
 * `options.filename` so it must be set prior to calling this function.
 *
 * @memberof module:ejs-internal
 * @param {Options} options   compilation options
 * @param {String} [template] template source
 * @return {(TemplateFunction|ClientFunction)}
 * Depending on the value of `options.client`, either type might be returned.
 * @static
 */

function handleCache(options, template) {
  var func;
  var filename = options.filename;
  var hasTemplate = arguments.length > 1;

  if (options.cache) {
    if (!filename) {
      throw new Error('cache option requires a filename');
    }
    func = exports.cache.get(filename);
    if (func) {
      return func;
    }
    if (!hasTemplate) {
      template = fileLoader(filename).toString().replace(_BOM, '');
    }
  }
  else if (!hasTemplate) {
    // istanbul ignore if: should not happen at all
    if (!filename) {
      throw new Error('Internal EJS error: no file name or template '
                    + 'provided');
    }
    template = fileLoader(filename).toString().replace(_BOM, '');
  }
  func = exports.compile(template, options);
  if (options.cache) {
    exports.cache.set(filename, func);
  }
  return func;
}

/**
 * Try calling handleCache with the given options and data and call the
 * callback with the result. If an error occurs, call the callback with
 * the error. Used by renderFile().
 *
 * @memberof module:ejs-internal
 * @param {Options} options    compilation options
 * @param {Object} data        template data
 * @param {RenderFileCallback} cb callback
 * @static
 */

function tryHandleCache(options, data, cb) {
  var result;
  if (!cb) {
    if (typeof exports.promiseImpl == 'function') {
      return new exports.promiseImpl(function (resolve, reject) {
        try {
          result = handleCache(options)(data);
          resolve(result);
        }
        catch (err) {
          reject(err);
        }
      });
    }
    else {
      throw new Error('Please provide a callback function');
    }
  }
  else {
    try {
      result = handleCache(options)(data);
    }
    catch (err) {
      return cb(err);
    }

    cb(null, result);
  }
}

/**
 * fileLoader is independent
 *
 * @param {String} filePath ejs file path.
 * @return {String} The contents of the specified file.
 * @static
 */

function fileLoader(filePath){
  return exports.fileLoader(filePath);
}

/**
 * Get the template function.
 *
 * If `options.cache` is `true`, then the template is cached.
 *
 * @memberof module:ejs-internal
 * @param {String}  path    path for the specified file
 * @param {Options} options compilation options
 * @return {(TemplateFunction|ClientFunction)}
 * Depending on the value of `options.client`, either type might be returned
 * @static
 */

function includeFile(path, options) {
  var opts = utils.shallowCopy({}, options);
  opts.filename = getIncludePath(path, opts);
  return handleCache(opts);
}

/**
 * Get the JavaScript source of an included file.
 *
 * @memberof module:ejs-internal
 * @param {String}  path    path for the specified file
 * @param {Options} options compilation options
 * @return {Object}
 * @static
 */

function includeSource(path, options) {
  var opts = utils.shallowCopy({}, options);
  var includePath;
  var template;
  includePath = getIncludePath(path, opts);
  template = fileLoader(includePath).toString().replace(_BOM, '');
  opts.filename = includePath;
  var templ = new Template(template, opts);
  templ.generateSource();
  return {
    source: templ.source,
    filename: includePath,
    template: template
  };
}

/**
 * Re-throw the given `err` in context to the `str` of ejs, `filename`, and
 * `lineno`.
 *
 * @implements RethrowCallback
 * @memberof module:ejs-internal
 * @param {Error}  err      Error object
 * @param {String} str      EJS source
 * @param {String} filename file name of the EJS file
 * @param {String} lineno   line number of the error
 * @static
 */

function rethrow(err, str, flnm, lineno, esc){
  var lines = str.split('\n');
  var start = Math.max(lineno - 3, 0);
  var end = Math.min(lines.length, lineno + 3);
  var filename = esc(flnm); // eslint-disable-line
  // Error context
  var context = lines.slice(start, end).map(function (line, i){
    var curr = i + start + 1;
    return (curr == lineno ? ' >> ' : '    ')
      + curr
      + '| '
      + line;
  }).join('\n');

  // Alter exception message
  err.path = filename;
  err.message = (filename || 'ejs') + ':'
    + lineno + '\n'
    + context + '\n\n'
    + err.message;

  throw err;
}

function stripSemi(str){
  return str.replace(/;(\s*$)/, '$1');
}

/**
 * Compile the given `str` of ejs into a template function.
 *
 * @param {String}  template EJS template
 *
 * @param {Options} opts     compilation options
 *
 * @return {(TemplateFunction|ClientFunction)}
 * Depending on the value of `opts.client`, either type might be returned.
 * Note that the return type of the function also depends on the value of `opts.async`.
 * @public
 */

exports.compile = function compile(template, opts) {
  var templ;

  // v1 compat
  // 'scope' is 'context'
  // FIXME: Remove this in a future version
  if (opts && opts.scope) {
    if (!scopeOptionWarned){
      console.warn('`scope` option is deprecated and will be removed in EJS 3');
      scopeOptionWarned = true;
    }
    if (!opts.context) {
      opts.context = opts.scope;
    }
    delete opts.scope;
  }
  templ = new Template(template, opts);
  return templ.compile();
};

/**
 * Render the given `template` of ejs.
 *
 * If you would like to include options but not data, you need to explicitly
 * call this function with `data` being an empty object or `null`.
 *
 * @param {String}   template EJS template
 * @param {Object}  [data={}] template data
 * @param {Options} [opts={}] compilation and rendering options
 * @return {(String|Promise<String>)}
 * Return value type depends on `opts.async`.
 * @public
 */

exports.render = function (template, d, o) {
  var data = d || {};
  var opts = o || {};

  // No options object -- if there are optiony names
  // in the data, copy them to options
  if (arguments.length == 2) {
    utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA);
  }

  return handleCache(opts, template)(data);
};

/**
 * Render an EJS file at the given `path` and callback `cb(err, str)`.
 *
 * If you would like to include options but not data, you need to explicitly
 * call this function with `data` being an empty object or `null`.
 *
 * @param {String}             path     path to the EJS file
 * @param {Object}            [data={}] template data
 * @param {Options}           [opts={}] compilation and rendering options
 * @param {RenderFileCallback} cb callback
 * @public
 */

exports.renderFile = function () {
  var args = Array.prototype.slice.call(arguments);
  var filename = args.shift();
  var cb;
  var opts = {filename: filename};
  var data;
  var viewOpts;

  // Do we have a callback?
  if (typeof arguments[arguments.length - 1] == 'function') {
    cb = args.pop();
  }
  // Do we have data/opts?
  if (args.length) {
    // Should always have data obj
    data = args.shift();
    // Normal passed opts (data obj + opts obj)
    if (args.length) {
      // Use shallowCopy so we don't pollute passed in opts obj with new vals
      utils.shallowCopy(opts, args.pop());
    }
    // Special casing for Express (settings + opts-in-data)
    else {
      // Express 3 and 4
      if (data.settings) {
        // Pull a few things from known locations
        if (data.settings.views) {
          opts.views = data.settings.views;
        }
        if (data.settings['view cache']) {
          opts.cache = true;
        }
        // Undocumented after Express 2, but still usable, esp. for
        // items that are unsafe to be passed along with data, like `root`
        viewOpts = data.settings['view options'];
        if (viewOpts) {
          utils.shallowCopy(opts, viewOpts);
        }
      }
      // Express 2 and lower, values set in app.locals, or people who just
      // want to pass options in their data. NOTE: These values will override
      // anything previously set in settings  or settings['view options']
      utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA_EXPRESS);
    }
    opts.filename = filename;
  }
  else {
    data = {};
  }

  return tryHandleCache(opts, data, cb);
};

/**
 * Clear intermediate JavaScript cache. Calls {@link Cache#reset}.
 * @public
 */

/**
 * EJS template class
 * @public
 */
exports.Template = Template;

exports.clearCache = function () {
  exports.cache.reset();
};

function Template(text, opts) {
  opts = opts || {};
  var options = {};
  this.templateText = text;
  this.mode = null;
  this.truncate = false;
  this.currentLine = 1;
  this.source = '';
  this.dependencies = [];
  options.client = opts.client || false;
  options.escapeFunction = opts.escape || opts.escapeFunction || utils.escapeXML;
  options.compileDebug = opts.compileDebug !== false;
  options.debug = !!opts.debug;
  options.filename = opts.filename;
  options.openDelimiter = opts.openDelimiter || exports.openDelimiter || _DEFAULT_OPEN_DELIMITER;
  options.closeDelimiter = opts.closeDelimiter || exports.closeDelimiter || _DEFAULT_CLOSE_DELIMITER;
  options.delimiter = opts.delimiter || exports.delimiter || _DEFAULT_DELIMITER;
  options.strict = opts.strict || false;
  options.context = opts.context;
  options.cache = opts.cache || false;
  options.rmWhitespace = opts.rmWhitespace;
  options.root = opts.root;
  options.outputFunctionName = opts.outputFunctionName;
  options.localsName = opts.localsName || exports.localsName || _DEFAULT_LOCALS_NAME;
  options.views = opts.views;
  options.async = opts.async;
  options.destructuredLocals = opts.destructuredLocals;
  options.legacyInclude = typeof opts.legacyInclude != 'undefined' ? !!opts.legacyInclude : true;

  if (options.strict) {
    options._with = false;
  }
  else {
    options._with = typeof opts._with != 'undefined' ? opts._with : true;
  }

  this.opts = options;

  this.regex = this.createRegex();
}

Template.modes = {
  EVAL: 'eval',
  ESCAPED: 'escaped',
  RAW: 'raw',
  COMMENT: 'comment',
  LITERAL: 'literal'
};

Template.prototype = {
  createRegex: function () {
    var str = _REGEX_STRING;
    var delim = utils.escapeRegExpChars(this.opts.delimiter);
    var open = utils.escapeRegExpChars(this.opts.openDelimiter);
    var close = utils.escapeRegExpChars(this.opts.closeDelimiter);
    str = str.replace(/%/g, delim)
      .replace(/</g, open)
      .replace(/>/g, close);
    return new RegExp(str);
  },

  compile: function () {
    var src;
    var fn;
    var opts = this.opts;
    var prepended = '';
    var appended = '';
    var escapeFn = opts.escapeFunction;
    var ctor;

    if (!this.source) {
      this.generateSource();
      prepended +=
        '  var __output = "";\n' +
        '  function __append(s) { if (s !== undefined && s !== null) __output += s }\n';
      if (opts.outputFunctionName) {
        prepended += '  var ' + opts.outputFunctionName + ' = __append;' + '\n';
      }
      if (opts.destructuredLocals && opts.destructuredLocals.length) {
        var destructuring = '  var __locals = (' + opts.localsName + ' || {}),\n';
        for (var i = 0; i < opts.destructuredLocals.length; i++) {
          var name = opts.destructuredLocals[i];
          if (i > 0) {
            destructuring += ',\n  ';
          }
          destructuring += name + ' = __locals.' + name;
        }
        prepended += destructuring + ';\n';
      }
      if (opts._with !== false) {
        prepended +=  '  with (' + opts.localsName + ' || {}) {' + '\n';
        appended += '  }' + '\n';
      }
      appended += '  return __output;' + '\n';
      this.source = prepended + this.source + appended;
    }

    if (opts.compileDebug) {
      src = 'var __line = 1' + '\n'
        + '  , __lines = ' + JSON.stringify(this.templateText) + '\n'
        + '  , __filename = ' + (opts.filename ?
        JSON.stringify(opts.filename) : 'undefined') + ';' + '\n'
        + 'try {' + '\n'
        + this.source
        + '} catch (e) {' + '\n'
        + '  rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
        + '}' + '\n';
    }
    else {
      src = this.source;
    }

    if (opts.client) {
      src = 'escapeFn = escapeFn || ' + escapeFn.toString() + ';' + '\n' + src;
      if (opts.compileDebug) {
        src = 'rethrow = rethrow || ' + rethrow.toString() + ';' + '\n' + src;
      }
    }

    if (opts.strict) {
      src = '"use strict";\n' + src;
    }
    if (opts.debug) {
      console.log(src);
    }
    if (opts.compileDebug && opts.filename) {
      src = src + '\n'
        + '//# sourceURL=' + opts.filename + '\n';
    }

    try {
      if (opts.async) {
        // Have to use generated function for this, since in envs without support,
        // it breaks in parsing
        try {
          ctor = (new Function('return (async function(){}).constructor;'))();
        }
        catch(e) {
          if (e instanceof SyntaxError) {
            throw new Error('This environment does not support async/await');
          }
          else {
            throw e;
          }
        }
      }
      else {
        ctor = Function;
      }
      fn = new ctor(opts.localsName + ', escapeFn, include, rethrow', src);
    }
    catch(e) {
      // istanbul ignore else
      if (e instanceof SyntaxError) {
        if (opts.filename) {
          e.message += ' in ' + opts.filename;
        }
        e.message += ' while compiling ejs\n\n';
        e.message += 'If the above error is not helpful, you may want to try EJS-Lint:\n';
        e.message += 'https://github.com/RyanZim/EJS-Lint';
        if (!opts.async) {
          e.message += '\n';
          e.message += 'Or, if you meant to create an async function, pass `async: true` as an option.';
        }
      }
      throw e;
    }

    // Return a callable function which will execute the function
    // created by the source-code, with the passed data as locals
    // Adds a local `include` function which allows full recursive include
    var returnedFn = opts.client ? fn : function anonymous(data) {
      var include = function (path, includeData) {
        var d = utils.shallowCopy({}, data);
        if (includeData) {
          d = utils.shallowCopy(d, includeData);
        }
        return includeFile(path, opts)(d);
      };
      return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]);
    };
    returnedFn.dependencies = this.dependencies;
    if (opts.filename && typeof Object.defineProperty === 'function') {
      var filename = opts.filename;
      var basename = path.basename(filename, path.extname(filename));
      try {
        Object.defineProperty(returnedFn, 'name', {
          value: basename,
          writable: false,
          enumerable: false,
          configurable: true
        });
      } catch (e) {/* ignore */}
    }
    return returnedFn;
  },

  generateSource: function () {
    var opts = this.opts;

    if (opts.rmWhitespace) {
      // Have to use two separate replace here as `^` and `$` operators don't
      // work well with `\r` and empty lines don't work well with the `m` flag.
      this.templateText =
        this.templateText.replace(/[\r\n]+/g, '\n').replace(/^\s+|\s+$/gm, '');
    }

    // Slurp spaces and tabs before <%_ and after _%>
    this.templateText =
      this.templateText.replace(/[ \t]*<%_/gm, '<%_').replace(/_%>[ \t]*/gm, '_%>');

    var self = this;
    var matches = this.parseTemplateText();
    var d = this.opts.delimiter;
    var o = this.opts.openDelimiter;
    var c = this.opts.closeDelimiter;

    if (matches && matches.length) {
      matches.forEach(function (line, index) {
        var opening;
        var closing;
        var include;
        var includeOpts;
        var includeObj;
        var includeSrc;
        // If this is an opening tag, check for closing tags
        // FIXME: May end up with some false positives here
        // Better to store modes as k/v with openDelimiter + delimiter as key
        // Then this can simply check against the map
        if ( line.indexOf(o + d) === 0        // If it is a tag
          && line.indexOf(o + d + d) !== 0) { // and is not escaped
          closing = matches[index + 2];
          if (!(closing == d + c || closing == '-' + d + c || closing == '_' + d + c)) {
            throw new Error('Could not find matching close tag for "' + line + '".');
          }
        }
        // HACK: backward-compat `include` preprocessor directives
        if (opts.legacyInclude && (include = line.match(/^\s*include\s+(\S+)/))) {
          opening = matches[index - 1];
          // Must be in EVAL or RAW mode
          if (opening && (opening == o + d || opening == o + d + '-' || opening == o + d + '_')) {
            includeOpts = utils.shallowCopy({}, self.opts);
            includeObj = includeSource(include[1], includeOpts);
            if (self.opts.compileDebug) {
              includeSrc =
                  '    ; (function(){' + '\n'
                  + '      var __line = 1' + '\n'
                  + '      , __lines = ' + JSON.stringify(includeObj.template) + '\n'
                  + '      , __filename = ' + JSON.stringify(includeObj.filename) + ';' + '\n'
                  + '      try {' + '\n'
                  + includeObj.source
                  + '      } catch (e) {' + '\n'
                  + '        rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
                  + '      }' + '\n'
                  + '    ; }).call(this)' + '\n';
            }else{
              includeSrc = '    ; (function(){' + '\n' + includeObj.source +
                  '    ; }).call(this)' + '\n';
            }
            self.source += includeSrc;
            self.dependencies.push(exports.resolveInclude(include[1],
              includeOpts.filename));
            return;
          }
        }
        self.scanLine(line);
      });
    }

  },

  parseTemplateText: function () {
    var str = this.templateText;
    var pat = this.regex;
    var result = pat.exec(str);
    var arr = [];
    var firstPos;

    while (result) {
      firstPos = result.index;

      if (firstPos !== 0) {
        arr.push(str.substring(0, firstPos));
        str = str.slice(firstPos);
      }

      arr.push(result[0]);
      str = str.slice(result[0].length);
      result = pat.exec(str);
    }

    if (str) {
      arr.push(str);
    }

    return arr;
  },

  _addOutput: function (line) {
    if (this.truncate) {
      // Only replace single leading linebreak in the line after
      // -%> tag -- this is the single, trailing linebreak
      // after the tag that the truncation mode replaces
      // Handle Win / Unix / old Mac linebreaks -- do the \r\n
      // combo first in the regex-or
      line = line.replace(/^(?:\r\n|\r|\n)/, '');
      this.truncate = false;
    }
    if (!line) {
      return line;
    }

    // Preserve literal slashes
    line = line.replace(/\\/g, '\\\\');

    // Convert linebreaks
    line = line.replace(/\n/g, '\\n');
    line = line.replace(/\r/g, '\\r');

    // Escape double-quotes
    // - this will be the delimiter during execution
    line = line.replace(/"/g, '\\"');
    this.source += '    ; __append("' + line + '")' + '\n';
  },

  scanLine: function (line) {
    var self = this;
    var d = this.opts.delimiter;
    var o = this.opts.openDelimiter;
    var c = this.opts.closeDelimiter;
    var newLineCount = 0;

    newLineCount = (line.split('\n').length - 1);

    switch (line) {
    case o + d:
    case o + d + '_':
      this.mode = Template.modes.EVAL;
      break;
    case o + d + '=':
      this.mode = Template.modes.ESCAPED;
      break;
    case o + d + '-':
      this.mode = Template.modes.RAW;
      break;
    case o + d + '#':
      this.mode = Template.modes.COMMENT;
      break;
    case o + d + d:
      this.mode = Template.modes.LITERAL;
      this.source += '    ; __append("' + line.replace(o + d + d, o + d) + '")' + '\n';
      break;
    case d + d + c:
      this.mode = Template.modes.LITERAL;
      this.source += '    ; __append("' + line.replace(d + d + c, d + c) + '")' + '\n';
      break;
    case d + c:
    case '-' + d + c:
    case '_' + d + c:
      if (this.mode == Template.modes.LITERAL) {
        this._addOutput(line);
      }

      this.mode = null;
      this.truncate = line.indexOf('-') === 0 || line.indexOf('_') === 0;
      break;
    default:
      // In script mode, depends on type of tag
      if (this.mode) {
        // If '//' is found without a line break, add a line break.
        switch (this.mode) {
        case Template.modes.EVAL:
        case Template.modes.ESCAPED:
        case Template.modes.RAW:
          if (line.lastIndexOf('//') > line.lastIndexOf('\n')) {
            line += '\n';
          }
        }
        switch (this.mode) {
        // Just executing code
        case Template.modes.EVAL:
          this.source += '    ; ' + line + '\n';
          break;
          // Exec, esc, and output
        case Template.modes.ESCAPED:
          this.source += '    ; __append(escapeFn(' + stripSemi(line) + '))' + '\n';
          break;
          // Exec and output
        case Template.modes.RAW:
          this.source += '    ; __append(' + stripSemi(line) + ')' + '\n';
          break;
        case Template.modes.COMMENT:
          // Do nothing
          break;
          // Literal <%% mode, append as raw output
        case Template.modes.LITERAL:
          this._addOutput(line);
          break;
        }
      }
      // In string mode, just add the output
      else {
        this._addOutput(line);
      }
    }

    if (self.opts.compileDebug && newLineCount) {
      this.currentLine += newLineCount;
      this.source += '    ; __line = ' + this.currentLine + '\n';
    }
  }
};

/**
 * Escape characters reserved in XML.
 *
 * This is simply an export of {@link module:utils.escapeXML}.
 *
 * If `markup` is `undefined` or `null`, the empty string is returned.
 *
 * @param {String} markup Input string
 * @return {String} Escaped string
 * @public
 * @func
 * */
exports.escapeXML = utils.escapeXML;

/**
 * Express.js support.
 *
 * This is an alias for {@link module:ejs.renderFile}, in order to support
 * Express.js out-of-the-box.
 *
 * @func
 */

exports.__express = exports.renderFile;

// Add require support
/* istanbul ignore else */
if (require.extensions) {
  require.extensions['.ejs'] = function (module, flnm) {
    console.log('Deprecated: this API will go away in EJS v2.8');
    var filename = flnm || /* istanbul ignore next */ module.filename;
    var options = {
      filename: filename,
      client: true
    };
    var template = fileLoader(filename).toString();
    var fn = exports.compile(template, options);
    module._compile('module.exports = ' + fn.toString() + ';', filename);
  };
}

/**
 * Version of EJS.
 *
 * @readonly
 * @type {String}
 * @public
 */

exports.VERSION = _VERSION_STRING;

/**
 * Name for detection of EJS.
 *
 * @readonly
 * @type {String}
 * @public
 */

exports.name = _NAME;

/* istanbul ignore if */
if (typeof window != 'undefined') {
  window.ejs = exports;
}
/*
 * EJS Embedded JavaScript templates
 * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
 *
 * 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.
 *
*/

/**
 * Private utility functions
 * @module utils
 * @private
 */

'use strict';

var regExpChars = /[|\\{}()[\]^$+*?.]/g;

/**
 * Escape characters reserved in regular expressions.
 *
 * If `string` is `undefined` or `null`, the empty string is returned.
 *
 * @param {String} string Input string
 * @return {String} Escaped string
 * @static
 * @private
 */
exports.escapeRegExpChars = function (string) {
  // istanbul ignore if
  if (!string) {
    return '';
  }
  return String(string).replace(regExpChars, '\\$&');
};

var _ENCODE_HTML_RULES = {
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&#34;',
  "'": '&#39;'
};
var _MATCH_HTML = /[&<>'"]/g;

function encode_char(c) {
  return _ENCODE_HTML_RULES[c] || c;
}

/**
 * Stringified version of constants used by {@link module:utils.escapeXML}.
 *
 * It is used in the process of generating {@link ClientFunction}s.
 *
 * @readonly
 * @type {String}
 */

var escapeFuncStr =
  'var _ENCODE_HTML_RULES = {\n'
+ '      "&": "&amp;"\n'
+ '    , "<": "&lt;"\n'
+ '    , ">": "&gt;"\n'
+ '    , \'"\': "&#34;"\n'
+ '    , "\'": "&#39;"\n'
+ '    }\n'
+ '  , _MATCH_HTML = /[&<>\'"]/g;\n'
+ 'function encode_char(c) {\n'
+ '  return _ENCODE_HTML_RULES[c] || c;\n'
+ '};\n';

/**
 * Escape characters reserved in XML.
 *
 * If `markup` is `undefined` or `null`, the empty string is returned.
 *
 * @implements {EscapeCallback}
 * @param {String} markup Input string
 * @return {String} Escaped string
 * @static
 * @private
 */

exports.escapeXML = function (markup) {
  return markup == undefined
    ? ''
    : String(markup)
      .replace(_MATCH_HTML, encode_char);
};
exports.escapeXML.toString = function () {
  return Function.prototype.toString.call(this) + ';\n' + escapeFuncStr;
};

/**
 * Naive copy of properties from one object to another.
 * Does not recurse into non-scalar properties
 * Does not check to see if the property has a value before copying
 *
 * @param  {Object} to   Destination object
 * @param  {Object} from Source object
 * @return {Object}      Destination object
 * @static
 * @private
 */
exports.shallowCopy = function (to, from) {
  from = from || {};
  for (var p in from) {
    to[p] = from[p];
  }
  return to;
};

/**
 * Naive copy of a list of key names, from one object to another.
 * Only copies property if it is actually defined
 * Does not recurse into non-scalar properties
 *
 * @param  {Object} to   Destination object
 * @param  {Object} from Source object
 * @param  {Array} list List of properties to copy
 * @return {Object}      Destination object
 * @static
 * @private
 */
exports.shallowCopyFromList = function (to, from, list) {
  for (var i = 0; i < list.length; i++) {
    var p = list[i];
    if (typeof from[p] != 'undefined') {
      to[p] = from[p];
    }
  }
  return to;
};

/**
 * Simple in-process cache implementation. Does not implement limits of any
 * sort.
 *
 * @implements Cache
 * @static
 * @private
 */
exports.cache = {
  _data: {},
  set: function (key, val) {
    this._data[key] = val;
  },
  get: function (key) {
    return this._data[key];
  },
  remove: function (key) {
    delete this._data[key];
  },
  reset: function () {
    this._data = {};
  }
};
{
  "env": {
    "es6": true,
    "node": true
  },
  "extends": "eslint:recommended",
  "parserOptions": {
    "sourceType": "module"
  },
  "rules": {
    "accessor-pairs": 2,
    "array-bracket-spacing": [
      2,
      "never"
    ],
    "array-callback-return": 2,
    "arrow-body-style": 2,
    "arrow-parens": 2,
    "arrow-spacing": 2,
    "block-scoped-var": 2,
    "block-spacing": 2,
    "brace-style": [
      2,
      "1tbs"
    ],
    "callback-return": 0,
    "camelcase": 2,
    "comma-spacing": [
      2,
      {
        "after": true,
        "before": false
      }
    ],
    "comma-style": [
      2,
      "last"
    ],
    "complexity": 2,
    "computed-property-spacing": [
      2,
      "never"
    ],
    "consistent-return": 0,
    "consistent-this": 2,
    "curly": 0,
    "default-case": 0,
    "dot-location": [
      2,
      "property"
    ],
    "dot-notation": [
      2,
      {
        "allowKeywords": true
      }
    ],
    "eol-last": 2,
    "func-names": 0,
    "func-style": [
      2,
      "declaration"
    ],
    "generator-star-spacing": 2,
    "global-require": 2,
    "guard-for-in": 2,
    "handle-callback-err": 0,
    "id-blacklist": 2,
    "id-length": 0,
    "id-match": 2,
    "indent": 0,
    "init-declarations": 0,
    "jsx-quotes": 2,
    "key-spacing": 2,
    "keyword-spacing": [
      2,
      {
        "after": true,
        "before": true
      }
    ],
    "linebreak-style": [
      2,
      "unix"
    ],
    "lines-around-comment": 2,
    "max-depth": 2,
    "max-len": 0,
    "max-nested-callbacks": 2,
    "max-params": 2,
    "new-cap": 2,
    "new-parens": 2,
    "newline-after-var": 0,
    "newline-per-chained-call": 0,
    "no-alert": 2,
    "no-array-constructor": 2,
    "no-bitwise": 2,
    "no-caller": 2,
    "no-console": [
      "error",
      {
        "allow": [
          "log",
          "warn",
          "error"
        ]
      }
    ],
    "no-catch-shadow": 2,
    "no-confusing-arrow": 2,
    "no-continue": 2,
    "no-div-regex": 2,
    "no-else-return": 0,
    "no-eq-null": 0,
    "no-eval": 2,
    "no-extend-native": 2,
    "no-extra-bind": 2,
    "no-extra-label": 2,
    "no-extra-parens": 2,
    "no-floating-decimal": 2,
    "no-implicit-coercion": 2,
    "no-implicit-globals": 2,
    "no-implied-eval": 2,
    "no-inline-comments": 0,
    "no-inner-declarations": [
      2,
      "functions"
    ],
    "no-invalid-this": 2,
    "no-iterator": 2,
    "no-label-var": 2,
    "no-labels": 2,
    "no-lone-blocks": 2,
    "no-lonely-if": 2,
    "no-loop-func": 2,
    "no-magic-numbers": 0,
    "no-mixed-requires": 2,
    "no-multi-spaces": 2,
    "no-multi-str": 2,
    "no-multiple-empty-lines": 2,
    "no-native-reassign": 2,
    "no-negated-condition": 0,
    "no-nested-ternary": 2,
    "no-new": 2,
    "no-new-func": 2,
    "no-new-object": 2,
    "no-new-require": 2,
    "no-new-wrappers": 2,
    "no-octal-escape": 2,
    "no-param-reassign": 0,
    "no-path-concat": 2,
    "no-plusplus": [
      2,
      {
        "allowForLoopAfterthoughts": true
      }
    ],
    "no-process-env": 2,
    "no-process-exit": 2,
    "no-proto": 2,
    "no-restricted-imports": 2,
    "no-restricted-modules": 2,
    "no-restricted-syntax": 2,
    "no-return-assign": 2,
    "no-script-url": 2,
    "no-self-compare": 2,
    "no-sequences": 2,
    "no-shadow": 0,
    "no-shadow-restricted-names": 2,
    "no-spaced-func": 2,
    "no-sync": 0,
    "no-ternary": 0,
    "no-throw-literal": 2,
    "no-trailing-spaces": 2,
    "no-undef-init": 2,
    "no-undefined": 2,
    "no-underscore-dangle": 0,
    "no-unmodified-loop-condition": 2,
    "no-unneeded-ternary": 2,
    "no-unused-expressions": 2,
    "no-use-before-define": 0,
    "no-useless-call": 2,
    "no-useless-concat": 2,
    "no-useless-constructor": 2,
    "no-var": 0,
    "no-void": 2,
    "no-warning-comments": 0,
    "no-whitespace-before-property": 2,
    "no-with": 2,
    "object-curly-spacing": 2,
    "object-shorthand": 2,
    "one-var": 0,
    "one-var-declaration-per-line": 2,
    "operator-assignment": 2,
    "operator-linebreak": 2,
    "padded-blocks": 0,
    "prefer-arrow-callback": 0,
    "prefer-const": 0,
    "prefer-reflect": 2,
    "prefer-rest-params": 2,
    "prefer-spread": 2,
    "prefer-template": 0,
    "quote-props": 2,
    "quotes": 0,
    "radix": 2,
    "require-jsdoc": 0,
    "require-yield": 2,
    "semi": 0,
    "semi-spacing": [
      2,
      {
        "after": true,
        "before": false
      }
    ],
    "sort-imports": 2,
    "sort-vars": 2,
    "space-before-blocks": 2,
    "space-before-function-paren": 2,
    "space-in-parens": [
      2,
      "never"
    ],
    "space-infix-ops": 2,
    "space-unary-ops": 2,
    "spaced-comment": [
      2,
      "always"
    ],
    "strict": 0,
    "template-curly-spacing": 2,
    "valid-jsdoc": 2,
    "vars-on-top": 0,
    "wrap-iife": 2,
    "wrap-regex": 2,
    "yield-star-spacing": 2,
    "yoda": [
      2,
      "never"
    ]
  }
}
Copyright (c) 2015-2016 Zhuo Lu, Jason Hinkle, et al.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
  </dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
  </dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.inherit</key>
    <true/>
  </dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
  </dict>
</plist>
/**
 * @module flat
 */

'use strict'

const path = require('path')

const Promise = require('bluebird')

const pkg = require('./package.json')
const util = require('./util')
const debuglog = util.debuglog
const debugwarn = util.debugwarn
const execFileAsync = util.execFileAsync
const validateOptsAppAsync = util.validateOptsAppAsync
const validateOptsPlatformAsync = util.validateOptsPlatformAsync
const Identity = require('./util-identities').findIdentitiesAsync
const findIdentitiesAsync = require('./util-identities').findIdentitiesAsync

/**
 * This function returns a promise validating all options passed in opts.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
function validateFlatOptsAsync (opts) {
  if (opts.pkg) {
    if (typeof opts.pkg !== 'string') return Promise.reject(new Error('`pkg` must be a string.'))
    if (path.extname(opts.pkg) !== '.pkg') return Promise.reject(new Error('Extension of output package must be `.pkg`.'))
  } else {
    debugwarn('No `pkg` passed in arguments, will fallback to default inferred from the given application.')
    opts.pkg = path.join(path.dirname(opts.app), path.basename(opts.app, '.app') + '.pkg')
  }

  if (opts.install) {
    if (typeof opts.install !== 'string') return Promise.reject(new Error('`install` must be a string.'))
  } else {
    debugwarn('No `install` passed in arguments, will fallback to default `/Applications`.')
    opts.install = '/Applications'
  }

  return Promise.map([
    validateOptsAppAsync,
    validateOptsPlatformAsync
  ], function (validate) {
    return validate(opts)
  })
}

/**
 * This function returns a promise flattening the application.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
function flatApplicationAsync (opts) {
  var args = [
    '--component', opts.app, opts.install,
    '--sign', opts.identity.name,
    opts.pkg
  ]
  if (opts.keychain) {
    args.unshift('--keychain', opts.keychain)
  }
  if (opts.scripts) {
    args.unshift('--scripts', opts.scripts)
  }

  debuglog('Flattening... ' + opts.app)
  return execFileAsync('productbuild', args)
    .thenReturn(undefined)
}

/**
 * This function is exported and returns a promise flattening the application.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
var flatAsync = module.exports.flatAsync = function (opts) {
  debuglog('electron-osx-sign@%s', pkg.version)
  return validateFlatOptsAsync(opts)
    .then(function () {
      var promise
      if (opts.identity) {
        debuglog('`identity` passed in arguments.')
        if (opts['identity-validation'] === false || opts.identity instanceof Identity) {
          return Promise.resolve()
        }
        promise = findIdentitiesAsync(opts, opts.identity)
      } else {
        debugwarn('No `identity` passed in arguments...')
        if (opts.platform === 'mas') {
          debuglog('Finding `3rd Party Mac Developer Installer` certificate for flattening app distribution in the Mac App Store...')
          promise = findIdentitiesAsync(opts, '3rd Party Mac Developer Installer:')
        } else {
          debuglog('Finding `Developer ID Application` certificate for distribution outside the Mac App Store...')
          promise = findIdentitiesAsync(opts, 'Developer ID Installer:')
        }
      }
      return promise
        .then(function (identities) {
          if (identities.length > 0) {
            // Provisioning profile(s) found
            if (identities.length > 1) {
              debugwarn('Multiple identities found, will use the first discovered.')
            } else {
              debuglog('Found 1 identity.')
            }
            opts.identity = identities[0]
          } else {
            // No identity found
            return Promise.reject(new Error('No identity found for signing.'))
          }
        })
    })
    .then(function () {
      // Pre-flat operations
    })
    .then(function () {
      debuglog('Flattening application...', '\n',
        '> Application:', opts.app, '\n',
        '> Package output:', opts.pkg, '\n',
        '> Install path:', opts.install, '\n',
        '> Identity:', opts.identity, '\n',
        '> Scripts:', opts.scripts)
      return flatApplicationAsync(opts)
    })
    .then(function () {
      // Post-flat operations
      debuglog('Application flattened.')
    })
}

/**
 * This function is exported with normal callback implementation.
 * @function
 * @param {Object} opts - Options.
 * @param {RequestCallback} cb - Callback.
 */
module.exports.flat = function (opts, cb) {
  flatAsync(opts)
    .then(function () {
      debuglog('Application flattened, saved to: ' + opts.app)
      if (cb) cb()
    })
    .catch(function (err) {
      debuglog('Flat failed:')
      if (err.message) debuglog(err.message)
      else if (err.stack) debuglog(err.stack)
      else debuglog(err)
      if (cb) cb(err)
    })
}
/**
 * @module electron-osx-sign
 */

'use strict'

const sign = require('./sign')
const flat = require('./flat')

/**
 * This function is a normal callback implementation.
 * @param {Object} opts - Options.
 * @param {RequestCallback} cb - Callback.
 */
module.exports = sign.sign // Aliasing

/**
 * This function is a normal callback implementation.
 * @function
 * @param {Object} opts - Options.
 * @param {RequestCallback} cb - Callback.
 */
module.exports.sign = sign.sign

/**
 * This function returns a promise signing the application.
 * @function
 * @param {mixed} opts - Options.
 * @returns {Promise} Promise.
 */
module.exports.signAsync = sign.signAsync

/**
 * This function is exported with normal callback implementation.
 * @function
 * @param {Object} opts - Options.
 * @param {RequestCallback} cb - Callback.
 */
module.exports.flat = flat.flat

/**
 * This function is exported and returns a promise flattening the application.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
module.exports.flatAsync = flat.flatAsync
{
  "author": {
    "name": "sethlu"
  },
  "bin": {
    "electron-osx-flat": "bin/electron-osx-flat.js",
    "electron-osx-sign": "bin/electron-osx-sign.js"
  },
  "dependencies": {
    "bluebird": "^3.5.0",
    "compare-version": "^0.1.2",
    "debug": "^2.6.8",
    "isbinaryfile": "^3.0.2",
    "minimist": "^1.2.0",
    "plist": "^3.0.1"
  },
  "deprecated": false,
  "description": "Codesign Electron macOS apps",
  "devDependencies": {
    "electron-download": "^4.1.0",
    "eslint": "^4.2.0",
    "eslint-config-eslint": "^4.0.0",
    "extract-zip": "^1.6.5",
    "mkdirp": "^0.5.1",
    "rimraf": "^2.6.1",
    "run-series": "^1.1.4",
    "run-waterfall": "^1.1.3",
    "standard": "^10.0.2",
    "tape": "^4.7.0"
  },
  "engines": {
    "node": ">=4.0.0"
  },
  "homepage": "https://github.com/electron-userland/electron-osx-sign",
  "license": "BSD-2-Clause",
  "main": "index.js",
  "name": "electron-osx-sign",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-osx-sign.git"
  },
  "standard": {
    "ignore": [
      "test/work"
    ]
  },
  "version": "0.4.11"
}/**
 * @module sign
 */

'use strict'

const path = require('path')

const Promise = require('bluebird')
const compareVersion = require('compare-version')

const pkg = require('./package.json')
const util = require('./util')
const debuglog = util.debuglog
const debugwarn = util.debugwarn
const getAppContentsPath = util.getAppContentsPath
const execFileAsync = util.execFileAsync
const validateOptsAppAsync = util.validateOptsAppAsync
const validateOptsPlatformAsync = util.validateOptsPlatformAsync
const walkAsync = util.walkAsync
const Identity = require('./util-identities').Identity
const findIdentitiesAsync = require('./util-identities').findIdentitiesAsync
const ProvisioningProfile = require('./util-provisioning-profiles').ProvisioningProfile
const preEmbedProvisioningProfile = require('./util-provisioning-profiles').preEmbedProvisioningProfile
const preAutoEntitlements = require('./util-entitlements').preAutoEntitlements

const osRelease = require('os').release()

/**
 * This function returns a promise validating opts.binaries, the additional binaries to be signed along with the discovered enclosed components.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
function validateOptsBinariesAsync (opts) {
  return new Promise(function (resolve, reject) {
    if (opts.binaries) {
      if (!Array.isArray(opts.binaries)) {
        reject(new Error('Additional binaries should be an Array.'))
        return
      }
      // TODO: Presence check for binary files, reject if any does not exist
    }
    resolve()
  })
}

/**
 * This function returns a promise validating all options passed in opts.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
function validateSignOptsAsync (opts) {
  if (opts.ignore && !(opts.ignore instanceof Array)) {
    opts.ignore = [opts.ignore]
  }

  if (opts['provisioning-profile']) {
    if (typeof opts['provisioning-profile'] !== 'string' && !(opts['provisioning-profile'] instanceof ProvisioningProfile)) return Promise.reject(new Error('Path to provisioning profile should be a string or a ProvisioningProfile object.'))
  }

  if (opts['type']) {
    if (opts['type'] !== 'development' && opts['type'] !== 'distribution') return Promise.reject(new Error('Type must be either `development` or `distribution`.'))
  } else {
    opts['type'] = 'distribution'
  }

  return Promise.map([
    validateOptsAppAsync,
    validateOptsPlatformAsync,
    validateOptsBinariesAsync
  ], function (validate) {
    return validate(opts)
  })
}

/**
 * This function returns a promise verifying the code sign of application bundle.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise resolving output.
 */
function verifySignApplicationAsync (opts) {
  // Verify with codesign
  var compareVersion = require('compare-version')
  debuglog('Verifying application bundle with codesign...')

  var promise = execFileAsync('codesign', [
    '--verify',
    '--deep'
  ]
    .concat(
      opts['strict-verify'] !== false &&
      compareVersion(osRelease, '15.0.0') >= 0 // Only pass strict flag in El Capitan and later
        ? ['--strict' +
            (opts['strict-verify']
             ? '=' + opts['strict-verify'] // Array should be converted to a comma separated string
             : '')]
        : [],
      ['--verbose=2', opts.app]))

  // Additionally test Gatekeeper acceptance for darwin platform
  if (opts.platform === 'darwin' && opts['gatekeeper-assess'] !== false) {
    promise = promise
      .then(function () {
        debuglog('Verifying Gatekeeper acceptance for darwin platform...')
        return execFileAsync('spctl', [
          '--assess',
          '--type', 'execute',
          '--verbose',
          '--ignore-cache',
          '--no-cache',
          opts.app
        ])
      })
  }

  return promise
    .thenReturn()
}

/**
 * This function returns a promise codesigning only.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
function signApplicationAsync (opts) {
  return walkAsync(getAppContentsPath(opts))
    .then(function (childPaths) {
      function ignoreFilePath (opts, filePath) {
        if (opts.ignore) {
          return opts.ignore.some(function (ignore) {
            if (typeof ignore === 'function') {
              return ignore(filePath)
            }
            return filePath.match(ignore)
          })
        }
        return false
      }

      if (opts.binaries) childPaths = childPaths.concat(opts.binaries)

      var args = [
        '--sign', opts.identity.hash || opts.identity.name,
        '--force'
      ]
      if (opts.keychain) {
        args.push('--keychain', opts.keychain)
      }
      if (opts.requirements) {
        args.push('--requirements', opts.requirements)
      }
      if (opts.timestamp) {
        args.push('--timestamp=' + opts.timestamp)
      }
      if (opts.hardenedRuntime || opts['hardened-runtime']) {
        // 17.7.0 === 10.13.6
        if (compareVersion(osRelease, '17.7.0') >= 0) {
          args.push('--options', 'runtime')
        } else {
          debuglog('Not enabling hardened runtime, current macOS version too low, requires 10.13.6 and higher')
        }
      }

      var promise
      if (opts.entitlements) {
        // Sign with entitlements
        promise = Promise.mapSeries(childPaths, function (filePath) {
          if (ignoreFilePath(opts, filePath)) {
            debuglog('Skipped... ' + filePath)
            return
          }
          debuglog('Signing... ' + filePath)
          return execFileAsync('codesign', args.concat('--entitlements', opts['entitlements-inherit'], filePath))
        })
          .then(function () {
            debuglog('Signing... ' + opts.app)
            return execFileAsync('codesign', args.concat('--entitlements', opts.entitlements, opts.app))
          })
      } else {
        // Otherwise normally
        promise = Promise.mapSeries(childPaths, function (filePath) {
          if (ignoreFilePath(opts, filePath)) {
            debuglog('Skipped... ' + filePath)
            return
          }
          debuglog('Signing... ' + filePath)
          return execFileAsync('codesign', args.concat(filePath))
        })
          .then(function () {
            debuglog('Signing... ' + opts.app)
            return execFileAsync('codesign', args.concat(opts.app))
          })
      }

      return promise
        .then(function () {
          // Verify code sign
          debuglog('Verifying...')
          var promise = verifySignApplicationAsync(opts)
            .then(function (result) {
              debuglog('Verified.')
            })

          // Check entitlements if applicable
          if (opts.entitlements) {
            promise = promise
              .then(function () {
                debuglog('Displaying entitlements...')
                return execFileAsync('codesign', [
                  '--display',
                  '--entitlements', ':-', // Write to standard output and strip off the blob header
                  opts.app
                ])
              })
              .then(function (result) {
                debuglog('Entitlements:', '\n',
                  result)
              })
          }

          return promise
        })
    })
}

/**
 * This function returns a promise signing the application.
 * @function
 * @param {mixed} opts - Options.
 * @returns {Promise} Promise.
 */
var signAsync = module.exports.signAsync = function (opts) {
  debuglog('electron-osx-sign@%s', pkg.version)
  return validateSignOptsAsync(opts)
    .then(function () {
      // Determine identity for signing
      var promise
      if (opts.identity) {
        debuglog('`identity` passed in arguments.')
        if (opts['identity-validation'] === false) {
          if (!(opts.identity instanceof Identity)) {
            opts.identity = new Identity(opts.identity)
          }
          return Promise.resolve()
        }
        promise = findIdentitiesAsync(opts, opts.identity)
      } else {
        debugwarn('No `identity` passed in arguments...')
        if (opts.platform === 'mas') {
          if (opts.type === 'distribution') {
            debuglog('Finding `3rd Party Mac Developer Application` certificate for signing app distribution in the Mac App Store...')
            promise = findIdentitiesAsync(opts, '3rd Party Mac Developer Application:')
          } else {
            debuglog('Finding `Mac Developer` certificate for signing app in development for the Mac App Store signing...')
            promise = findIdentitiesAsync(opts, 'Mac Developer:')
          }
        } else {
          debuglog('Finding `Developer ID Application` certificate for distribution outside the Mac App Store...')
          promise = findIdentitiesAsync(opts, 'Developer ID Application:')
        }
      }
      return promise
        .then(function (identities) {
          if (identities.length > 0) {
            // Identity(/ies) found
            if (identities.length > 1) {
              debugwarn('Multiple identities found, will use the first discovered.')
            } else {
              debuglog('Found 1 identity.')
            }
            opts.identity = identities[0]
          } else {
            // No identity found
            return Promise.reject(new Error('No identity found for signing.'))
          }
        })
    })
    .then(function () {
      // Determine entitlements for code signing
      var filePath
      if (opts.platform === 'mas') {
        // To sign apps for Mac App Store, an entitlements file is required, especially for app sandboxing (as well some other services).
        // Fallback entitlements for sandboxing by default: Note this may cause troubles while running an signed app due to missing keys special to the project.
        // Further reading: https://developer.apple.com/library/mac/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html
        if (!opts.entitlements) {
          filePath = path.join(__dirname, 'default.entitlements.mas.plist')
          debugwarn('No `entitlements` passed in arguments:', '\n',
            '* Sandbox entitlements are required for Mac App Store distribution, your codesign entitlements file is default to:', filePath)
          opts.entitlements = filePath
        }
        if (!opts['entitlements-inherit']) {
          filePath = path.join(__dirname, 'default.entitlements.mas.inherit.plist')
          debugwarn('No `entitlements-inherit` passed in arguments:', '\n',
            '* Sandbox entitlements file for enclosing app files is default to:', filePath)
          opts['entitlements-inherit'] = filePath
        }
      } else {
        // Not necessary to have entitlements for non Mac App Store distribution
        if (!opts.entitlements) {
          debugwarn('No `entitlements` passed in arguments:', '\n',
            '* Provide `entitlements` to specify entitlements file for codesign.')
        } else {
          // If entitlements is provided as a flag, fallback to default
          if (opts.entitlements === true) {
            filePath = path.join(__dirname, 'default.entitlements.darwin.plist')
            debugwarn('`entitlements` not specified in arguments:', '\n',
              '* Provide `entitlements` to specify entitlements file for codesign.', '\n',
              '* Sandbox entitlements file for enclosing app files is default to:', filePath)
            opts.entitlements = filePath
          }
          if (!opts['entitlements-inherit']) {
            filePath = path.join(__dirname, 'default.entitlements.darwin.inherit.plist')
            debugwarn('No `entitlements-inherit` passed in arguments:', '\n',
              '* Sandbox entitlements file for enclosing app files is default to:', filePath)
            opts['entitlements-inherit'] = filePath
          }
        }
      }
    })
    .then(function () {
      // Pre-sign operations
      var preSignOperations = []

      if (opts['pre-embed-provisioning-profile'] === false) {
        debugwarn('Pre-sign operation disabled for provisioning profile embedding:', '\n',
          '* Enable by setting `pre-embed-provisioning-profile` to `true`.')
      } else {
        debuglog('Pre-sign operation enabled for provisioning profile:', '\n',
          '* Disable by setting `pre-embed-previsioning-profile` to `false`.')
        preSignOperations.push(preEmbedProvisioningProfile)
      }

      if (opts['pre-auto-entitlements'] === false) {
        debugwarn('Pre-sign operation disabled for entitlements automation.')
      } else {
        debuglog('Pre-sign operation enabled for entitlements automation with versions >= `1.1.1`:', '\n',
          '* Disable by setting `pre-auto-entitlements` to `false`.')
        if (opts.entitlements && (!opts.version || compareVersion(opts.version, '1.1.1') >= 0)) {
          // Enable Mac App Store sandboxing without using temporary-exception, introduced in Electron v1.1.1. Relates to electron#5601
          preSignOperations.push(preAutoEntitlements)
        }
      }

      return Promise.mapSeries(preSignOperations, function (preSignOperation) {
        return preSignOperation(opts)
      })
    })
    .then(function () {
      debuglog('Signing application...', '\n',
        '> Application:', opts.app, '\n',
        '> Platform:', opts.platform, '\n',
        '> Entitlements:', opts.entitlements, '\n',
        '> Child entitlements:', opts['entitlements-inherit'], '\n',
        '> Additional binaries:', opts.binaries, '\n',
        '> Identity:', opts.identity)
      return signApplicationAsync(opts)
    })
    .then(function () {
      // Post-sign operations
      debuglog('Application signed.')
    })
}

/**
 * This function is a normal callback implementation.
 * @function
 * @param {Object} opts - Options.
 * @param {RequestCallback} cb - Callback.
 */
module.exports.sign = function (opts, cb) {
  signAsync(opts)
    .then(function () {
      debuglog('Application signed: ' + opts.app)
      if (cb) cb()
    })
    .catch(function (err) {
      debuglog('Sign failed:')
      if (err.message) debuglog(err.message)
      else if (err.stack) debuglog(err.stack)
      else debuglog(err)
      if (cb) cb(err)
    })
}
/**
 * @module util-entitlements
 */

'use strict'

const os = require('os')
const path = require('path')

const plist = require('plist')

const util = require('./util')
const debuglog = util.debuglog
const getAppContentsPath = util.getAppContentsPath
const readFileAsync = util.readFileAsync
const writeFileAsync = util.writeFileAsync

let tmpFileCounter = 0

/**
 * This function returns a promise completing the entitlements automation: The process includes checking in `Info.plist` for `ElectronTeamID` or setting parsed value from identity, and checking in entitlements file for `com.apple.security.application-groups` or inserting new into array. A temporary entitlements file may be created to replace the input for any changes introduced.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
module.exports.preAutoEntitlements = function (opts) {
  // If entitlements file not provided, default will be used. Fixes #41
  var appInfoPath = path.join(getAppContentsPath(opts), 'Info.plist')
  var appInfo
  var entitlements

  debuglog('Automating entitlement app group...', '\n',
    '> Info.plist:', appInfoPath, '\n',
    '> Entitlements:', opts.entitlements)
  return readFileAsync(opts.entitlements, 'utf8')
    .then(function (result) {
      entitlements = plist.parse(result)
      if (!entitlements['com.apple.security.app-sandbox']) {
        // Only automate when app sandbox enabled by user
        return
      }

      return readFileAsync(appInfoPath, 'utf8')
        .then(function (result) {
          appInfo = plist.parse(result)
          // Use ElectronTeamID in Info.plist if already specified
          if (appInfo.ElectronTeamID) {
            debuglog('`ElectronTeamID` found in `Info.plist`: ' + appInfo.ElectronTeamID)
          } else {
            // The team identifier in signing identity should not be trusted
            if (opts['provisioning-profile']) {
              appInfo.ElectronTeamID = opts['provisioning-profile'].message.Entitlements['com.apple.developer.team-identifier']
              debuglog('`ElectronTeamID` not found in `Info.plist`, use parsed from provisioning profile: ' + appInfo.ElectronTeamID)
            } else {
              appInfo.ElectronTeamID = opts.identity.name.substring(opts.identity.name.indexOf('(') + 1, opts.identity.name.lastIndexOf(')'))
              debuglog('`ElectronTeamID` not found in `Info.plist`, use parsed from signing identity: ' + appInfo.ElectronTeamID)
            }
            return writeFileAsync(appInfoPath, plist.build(appInfo), 'utf8')
              .then(function () {
                debuglog('`Info.plist` updated:', '\n',
                  '> Info.plist:', appInfoPath)
              })
          }
        })
        .then(function () {
          var appIdentifier = appInfo.ElectronTeamID + '.' + appInfo.CFBundleIdentifier
          // Insert application identifier if not exists
          if (entitlements['com.apple.application-identifier']) {
            debuglog('`com.apple.application-identifier` found in entitlements file: ' + entitlements['com.apple.application-identifier'])
          } else {
            debuglog('`com.apple.application-identifier` not found in entitlements file, new inserted: ' + appIdentifier)
            entitlements['com.apple.application-identifier'] = appIdentifier
          }
          // Insert developer team identifier if not exists
          if (entitlements['com.apple.developer.team-identifier']) {
            debuglog('`com.apple.developer.team-identifier` found in entitlements file: ' + entitlements['com.apple.developer.team-identifier'])
          } else {
            debuglog('`com.apple.developer.team-identifier` not found in entitlements file, new inserted: ' + appInfo.ElectronTeamID)
            entitlements['com.apple.developer.team-identifier'] = appInfo.ElectronTeamID
          }
          // Init entitlements app group key to array if not exists
          if (!entitlements['com.apple.security.application-groups']) {
            entitlements['com.apple.security.application-groups'] = []
          }
          // Insert app group if not exists
          if (Array.isArray(entitlements['com.apple.security.application-groups']) && entitlements['com.apple.security.application-groups'].indexOf(appIdentifier) === -1) {
            debuglog('`com.apple.security.application-groups` not found in entitlements file, new inserted: ' + appIdentifier)
            entitlements['com.apple.security.application-groups'].push(appIdentifier)
          } else {
            debuglog('`com.apple.security.application-groups` found in entitlements file: ' + appIdentifier)
          }
          // Create temporary entitlements file
          const entitlementsPath = path.join(os.tmpdir(), `tmp-entitlements-${process.pid.toString(16)}-${(tmpFileCounter++).toString(16)}.plist`)
          opts.entitlements = entitlementsPath
          return writeFileAsync(entitlementsPath, plist.build(entitlements), 'utf8')
            .then(function () {
              debuglog('Entitlements file updated:', '\n',
                '> Entitlements:', entitlementsPath)
            })
        })
    })
}
/**
 * @module util-identities
 */

'use strict'

const util = require('./util')
const debuglog = util.debuglog
const flatList = util.flatList
const execFileAsync = util.execFileAsync

/**
 * @constructor
 * @param {string} name - Name of the signing identity.
 * @param {String} hash - SHA-1 hash of the identity.
 */
var Identity = module.exports.Identity = function (name, hash) {
  this.name = name
  this.hash = hash
}

/**
 * This function returns a promise checking the indentity proposed and updates the identity option to a exact finding from results.
 * @function
 * @param {Object} opts - Options.
 * @param {string} identity - The proposed identity.
 * @returns {Promise} Promise.
 */
module.exports.findIdentitiesAsync = function (opts, identity) {
  // Only to look for valid identities, excluding those flagged with
  // CSSMERR_TP_CERT_EXPIRED or CSSMERR_TP_NOT_TRUSTED. Fixes #9

  var args = [
    'find-identity',
    '-v'
  ]
  if (opts.keychain) {
    args.push(opts.keychain)
  }

  return execFileAsync('security', args)
    .then(function (result) {
      return result.split('\n').map(function (line) {
        if (line.indexOf(identity) >= 0) {
          var identityFound = line.substring(line.indexOf('"') + 1, line.lastIndexOf('"'))
          var identityHashFound = line.substring(line.indexOf(')') + 2, line.indexOf('"') - 1)
          debuglog('Identity:', '\n',
            '> Name:', identityFound, '\n',
            '> Hash:', identityHashFound)
          return new Identity(identityFound, identityHashFound)
        }
      })
    })
    .then(flatList)
}
/**
 * @module util-provisioning-profiles
 */

'use strict'

const path = require('path')

const Promise = require('bluebird')
const plist = require('plist')

const util = require('./util')
const debuglog = util.debuglog
const debugwarn = util.debugwarn
const getAppContentsPath = util.getAppContentsPath
const flatList = util.flatList
const copyFileAsync = util.copyFileAsync
const execFileAsync = util.execFileAsync
const lstatAsync = util.lstatAsync
const readdirAsync = util.readdirAsync

/**
 * @constructor
 * @param {string} filePath - Path to provisioning profile.
 * @param {Object} message - Decoded message in provisioning profile.
 */
var ProvisioningProfile = module.exports.ProvisioningProfile = function (filePath, message) {
  this.filePath = filePath
  this.message = message
}

Object.defineProperty(ProvisioningProfile.prototype, 'name', {
  get: function () {
    return this.message['Name']
  }
})

Object.defineProperty(ProvisioningProfile.prototype, 'platforms', {
  get: function () {
    if ('ProvisionsAllDevices' in this.message) return ['darwin'] // Developer ID
    else if (this.type === 'distribution') return ['mas'] // Mac App Store
    else return ['darwin', 'mas'] // Mac App Development
  }
})

Object.defineProperty(ProvisioningProfile.prototype, 'type', {
  get: function () {
    if ('ProvisionedDevices' in this.message) return 'development' // Mac App Development
    else return 'distribution' // Developer ID or Mac App Store
  }
})

/**
 * Returns a promise resolving to a ProvisioningProfile instance based on file.
 * @function
 * @param {string} filePath - Path to provisioning profile.
 * @returns {Promise} Promise.
 */
var getProvisioningProfileAsync = module.exports.getProvisioningProfileAsync = function (filePath) {
  return execFileAsync('security', [
    'cms',
    '-D', // Decode a CMS message
    '-i', filePath // Use infile as source of data
  ])
    .then(function (result) {
      var provisioningProfile = new ProvisioningProfile(filePath, plist.parse(result))
      debuglog('Provisioning profile:', '\n',
        '> Name:', provisioningProfile.name, '\n',
        '> Platforms:', provisioningProfile.platforms, '\n',
        '> Type:', provisioningProfile.type, '\n',
        '> Path:', provisioningProfile.filePath, '\n',
        '> Message:', provisioningProfile.message)
      return provisioningProfile
    })
}

/**
 * Returns a promise resolving to a list of suitable provisioning profile within the current working directory.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
var findProvisioningProfilesAsync = module.exports.findProvisioningProfilesAsync = function (opts) {
  return Promise.map([
    process.cwd() // Current working directory
  ], function (dirPath) {
    return readdirAsync(dirPath)
      .map(function (name) {
        var filePath = path.join(dirPath, name)
        return lstatAsync(filePath)
          .then(function (stat) {
            if (stat.isFile()) {
              switch (path.extname(filePath)) {
                case '.provisionprofile':
                  return filePath
              }
            }
            return undefined
          })
      })
  })
    .then(flatList)
    .map(function (filePath) {
      return getProvisioningProfileAsync(filePath)
        .then(function (provisioningProfile) {
          if (provisioningProfile.platforms.indexOf(opts.platform) >= 0 && provisioningProfile.type === opts.type) return provisioningProfile
          debugwarn('Provisioning profile above ignored, not for ' + opts.platform + ' ' + opts.type + '.')
          return undefined
        })
    })
    .then(flatList)
}

/**
 * Returns a promise embedding the provisioning profile in the app Contents folder.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
module.exports.preEmbedProvisioningProfile = function (opts) {
  function embedProvisioningProfile () {
    if (opts['provisioning-profile']) {
      debuglog('Looking for existing provisioning profile...')
      var embeddedFilePath = path.join(getAppContentsPath(opts), 'embedded.provisionprofile')
      return lstatAsync(embeddedFilePath)
        .then(function (stat) {
          debuglog('Found embedded provisioning profile:', '\n',
            '* Please manually remove the existing file if not wanted.', '\n',
            '* Current file at:', embeddedFilePath)
        })
        .catch(function (err) {
          if (err.code === 'ENOENT') {
            // File does not exist
            debuglog('Embedding provisioning profile...')
            return copyFileAsync(opts['provisioning-profile'].filePath, embeddedFilePath)
          } else throw err
        })
    }
  }

  if (opts['provisioning-profile']) {
    // User input provisioning profile
    debuglog('`provisioning-profile` passed in arguments.')
    if (opts['provisioning-profile'] instanceof ProvisioningProfile) {
      return embedProvisioningProfile()
    } else {
      return getProvisioningProfileAsync(opts['provisioning-profile'])
        .then(function (provisioningProfile) {
          opts['provisioning-profile'] = provisioningProfile
        })
        .then(embedProvisioningProfile)
    }
  } else {
    // Discover provisioning profile
    debuglog('No `provisioning-profile` passed in arguments, will find in current working directory and in user library...')
    return findProvisioningProfilesAsync(opts)
      .then(function (provisioningProfiles) {
        if (provisioningProfiles.length > 0) {
          // Provisioning profile(s) found
          if (provisioningProfiles.length > 1) {
            debuglog('Multiple provisioning profiles found, will use the first discovered.')
          } else {
            debuglog('Found 1 provisioning profile.')
          }
          opts['provisioning-profile'] = provisioningProfiles[0]
        } else {
          // No provisioning profile found
          debuglog('No provisioning profile found, will not embed profile in app contents.')
        }
      })
      .then(embedProvisioningProfile)
  }
}
/**
 * @module util
 */

'use strict'

const child = require('child_process')
const fs = require('fs')
const path = require('path')

const Promise = require('bluebird')
const debug = require('debug')

/**
 * This callback is used across signing and flattening.
 * @callback RequestCallback
 * @param {?Error} err
 */

/** @function */
const debuglog = module.exports.debuglog = debug('electron-osx-sign')
debuglog.log = console.log.bind(console)

/** @function */
const debugwarn = module.exports.debugwarn = debug('electron-osx-sign:warn')
debugwarn.log = console.warn.bind(console)

/** @function */
const isBinaryFileAsync = module.exports.isBinaryFileAsync = Promise.promisify(require('isbinaryfile'))

/** @function */
const removePassword = function (input) {
  return input.replace(/(-P |pass:|\/p|-pass )([^ ]+)/, function (match, p1, p2) {
    return `${p1}***`
  })
}

/** @function */
module.exports.execFileAsync = function (file, args, options) {
  if (debuglog.enabled) {
    debuglog('Executing...', file, args && Array.isArray(args) ? removePassword(args.join(' ')) : '')
  }

  return new Promise(function (resolve, reject) {
    child.execFile(file, args, options, function (err, stdout, stderr) {
      if (err) {
        debuglog('Error executing file:', '\n',
          '> Stdout:', stdout, '\n',
          '> Stderr:', stderr)
        reject(err)
        return
      }
      resolve(stdout)
    })
  })
}

/** @function */
const lstatAsync = module.exports.lstatAsync = Promise.promisify(fs.lstat)

/** @function */
const readdirAsync = module.exports.readdirAsync = Promise.promisify(fs.readdir)

/** @function */
module.exports.readFileAsync = Promise.promisify(fs.readFile)

/** @function */
module.exports.writeFileAsync = Promise.promisify(fs.writeFile)

/**
 * This function returns a flattened list of elements from an array of lists.
 * @function
 * @param {*} list - List.
 * @returns Flattened list.
 */
var flatList = module.exports.flatList = function (list) {
  function populateResult (list) {
    if (!Array.isArray(list)) {
      result.push(list)
    } else if (list.length > 0) {
      for (let item of list) if (item) populateResult(item)
    }
  }

  var result = []
  populateResult(list)
  return result
}

/**
 * This function returns the path to app contents.
 * @function
 * @param {Object} opts - Options.
 * @returns {string} App contents path.
 */
var getAppContentsPath = module.exports.getAppContentsPath = function (opts) {
  return path.join(opts.app, 'Contents')
}

/**
 * This function returns the path to app frameworks within contents.
 * @function
 * @param {Object} opts - Options.
 * @returns {string} App frameworks path.
 */
var getAppFrameworksPath = module.exports.getAppFrameworksPath = function (opts) {
  return path.join(getAppContentsPath(opts), 'Frameworks')
}

/**
 * This function returns a promise copying a file from the source to the target.
 * @function
 * @param {string} source - Source path.
 * @param {string} target - Target path.
 * @returns {Promise} Promise.
 */
module.exports.copyFileAsync = function (source, target) {
  debuglog('Copying file...', '\n',
    '> Source:', source, '\n',
    '> Target:', target)
  return new Promise(function (resolve, reject) {
    var readStream = fs.createReadStream(source)
    readStream.on('error', reject)
    var writeStream = fs.createWriteStream(target)
    writeStream.on('error', reject)
    writeStream.on('close', resolve)
    readStream.pipe(writeStream)
  })
}

/**
 * This function returns a promise with platform resolved.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise resolving platform.
 */
var detectElectronPlatformAsync = module.exports.detectElectronPlatformAsync = function (opts) {
  return new Promise(function (resolve) {
    var appFrameworksPath = getAppFrameworksPath(opts)
    // The presence of Squirrel.framework identifies a Mac App Store build as used in https://github.com/atom/electron/blob/master/docs/tutorial/mac-app-store-submission-guide.md
    return lstatAsync(path.join(appFrameworksPath, 'Squirrel.framework'))
      .then(function () {
        resolve('darwin')
      })
      .catch(function () {
        resolve('mas')
      })
  })
}

/**
 * This function returns a promise resolving the file path if file binary.
 * @function
 * @param {string} filePath - Path to file.
 * @returns {Promise} Promise resolving file path or undefined.
 */
var getFilePathIfBinaryAsync = module.exports.getFilePathIfBinaryAsync = function (filePath) {
  return isBinaryFileAsync(filePath)
    .then(function (isBinary) {
      return isBinary ? filePath : undefined
    })
}

/**
 * This function returns a promise validating opts.app, the application to be signed or flattened.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
module.exports.validateOptsAppAsync = function (opts) {
  if (!opts.app) {
    return Promise.reject(new Error('Path to aplication must be specified.'))
  }
  if (path.extname(opts.app) !== '.app') {
    return Promise.reject(new Error('Extension of application must be `.app`.'))
  }
  return lstatAsync(opts.app)
    .thenReturn()
}

/**
 * This function returns a promise validating opts.platform, the platform of Electron build. It allows auto-discovery if no opts.platform is specified.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
module.exports.validateOptsPlatformAsync = function (opts) {
  if (opts.platform) {
    if (opts.platform === 'mas' || opts.platform === 'darwin') {
      return Promise.resolve()
    } else {
      debugwarn('`platform` passed in arguments not supported, checking Electron platform...')
    }
  } else {
    debugwarn('No `platform` passed in arguments, checking Electron platform...')
  }

  return detectElectronPlatformAsync(opts)
    .then(function (platform) {
      opts.platform = platform
    })
}

/**
 * This function returns a promise resolving all child paths within the directory specified.
 * @function
 * @param {string} dirPath - Path to directory.
 * @returns {Promise} Promise resolving child paths needing signing in order.
 */
module.exports.walkAsync = function (dirPath) {
  debuglog('Walking... ' + dirPath)

  var unlinkAsync = Promise.promisify(fs.unlink)

  function _walkAsync (dirPath) {
    return readdirAsync(dirPath)
      .then(function (names) {
        return Promise.map(names, function (name) {
          var filePath = path.join(dirPath, name)
          return lstatAsync(filePath)
            .then(function (stat) {
              if (stat.isFile()) {
                switch (path.extname(filePath)) {
                  case '': // Binary
                    if (path.basename(filePath)[0] !== '.') {
                      return getFilePathIfBinaryAsync(filePath)
                    } // Else reject hidden file
                    break
                  case '.dylib': // Dynamic library
                  case '.node': // Native node addon
                    return filePath
                  case '.cstemp': // Temporary file generated from past codesign
                    debuglog('Removing... ' + filePath)
                    return unlinkAsync(filePath)
                      .thenReturn(undefined)
                  default:
                    if (path.extname(filePath).indexOf(' ') >= 0) {
                      // Still consider the file as binary if extension seems invalid
                      return getFilePathIfBinaryAsync(filePath)
                    }
                }
              } else if (stat.isDirectory() && !stat.isSymbolicLink()) {
                return _walkAsync(filePath)
                  .then(function (result) {
                    switch (path.extname(filePath)) {
                      case '.app': // Application
                      case '.framework': // Framework
                        result.push(filePath)
                    }
                    return result
                  })
              }
            })
        })
      })
  }

  return _walkAsync(dirPath)
    .then(flatList)
}

NAME
  electron-osx-flat -- product building for Electron apps

SYNOPSIS
  electron-osx-flat app [options ...]

DESCRIPTION
  app
    Path to the application package.
    Needs file extension ``.app''.

  --help
    Flag to display all commands.

  --identity=identity
    Name of certificate to use when signing.
    Default to selected with respect to --platform from --keychain specified or keychain by system default.

  --identity-validation, --no-identity-validation
    Flag to enable/disable validation for the signing identity.

  --install=install-path
    Path to install the bundle.
    Default to ``/Applications''.

  --keychain=keychain
    The keychain name.
    Default to system default keychain.

  --platform=platform
    Build platform of Electron.
    Allowed values: ``darwin'', ``mas''.
    Default to auto detect from application bundle.

  --pkg
    Path to the output the flattened package.
    Needs file extension ``.pkg''.

  --scripts
    Path to a directory containing pre and/or post install scripts.
#!/usr/bin/env node

var fs = require('fs')
var path = require('path')
var args = require('minimist')(process.argv.slice(2), {
  'boolean': [
    'help'
  ]
})
var usage = fs.readFileSync(path.join(__dirname, 'electron-osx-flat-usage.txt')).toString()
var flat = require('../').flat

args.app = args._.shift()

if (!args.app || args.help) {
  console.log(usage)
  process.exit(0)
}

// Remove excess arguments
delete args._
delete args.help

flat(args, function done (err) {
  if (err) {
    console.error('Flat failed:')
    if (err.message) console.error(err.message)
    else if (err.stack) console.error(err.stack)
    else console.log(err)
    process.exit(1)
  }
  console.log('Application flattened, saved to:', args.pkg)
  process.exit(0)
})

NAME
  electron-osx-sign -- code signing for Electron apps

SYNOPSIS
  electron-osx-sign app [embedded-binary ...] [options ...]

DESCRIPTION
  app
    Path to the application package.
    Needs file extension ``.app''.

  embedded-binary ...
    Path to additional binaries that will be signed along with built-ins of Electron, spaced.

  --entitlements=file
    Path to entitlements file for signing the app.
    Default to built-in entitlements file, Sandbox enabled for Mac App Store platform.

  --entitlements-inherit=file
    Path to child entitlements which inherit the security settings for signing frameworks and bundles of a distribution.
    This option only applies when signing with entitlements.

  --gatekeeper-assess, --no-gatekeeper-assess
    Flag to enable/disable Gatekeeper assessment after signing the app. Disabling it is useful for signing with self-signed certificates.
    Gatekeeper assessment is enabled by default on ``darwin'' platform.

  --hardened-runtime
    Flag to enable the Mojave hardened runtime when signing the app.  Disabled by default, requires Xcode >= 10 and macOS
    >= 10.13.6.

  --help
    Flag to display all commands.

  --identity=identity
    Name of certificate to use when signing.
    Default to selected with respect to --provisioning-profile and --platform from --keychain specified or keychain by system default.

  --identity-validation, --no-identity-validation
    Flag to enable/disable validation for the signing identity.

  --ignore=path
    Path to skip signing. The string will be treated as a regular expression when used to match the file paths.

  --keychain=keychain
    The keychain name.
    Default to system default keychain.

  --platform=platform
    Build platform of Electron.
    Allowed values: ``darwin'', ``mas''.
    Default to auto detect from application bundle.

  --pre-auto-entitlements, --no-pre-auto-entitlements
    Flag to enable/disable automation of entitlements file and Info.plist.

  --pre-embed-provisioning-profile, --no-pre-embed-provisioning-profile
    Flag to enable/disable embedding of provisioning profile.

  --provisioning-profile=file
    Path to provisioning profile.

  --requirements=requirements
    Specify the criteria that you recommend to be used to evaluate the code signature.

  --strict-verify, --strict-verify=options, --no-strict-verify
    Flag to enable/disable ``--strict'' flag when verifying the signed application bundle.
    Each component should be separated in ``options'' with comma (``,'').
    Enabled by default.

  --timestamp=timestamp
    Specify the URL of the timestamp authority server, default to server provided by Apple.
    Disable the timestamp service with ``none''.

  --type=type
    Specify whether to sign app for development or for distribution.
    Allowed values: ``development'', ``distribution''.
    Default to ``distribution''.

  --version=version
    Build version of Electron.
    Values may be: ``1.2.0''.
    Default to latest Electron version.
#!/usr/bin/env node

var fs = require('fs')
var path = require('path')
var args = require('minimist')(process.argv.slice(2), {
  'boolean': [
    'help',
    'pre-auto-entitlements',
    'pre-embed-provisioning-profile',
    'gatekeeper-assess',
    'hardened-runtime'
  ],
  'default': {
    'pre-auto-entitlements': true,
    'pre-embed-provisioning-profile': true,
    'gatekeeper-assess': true
  }
})
var usage = fs.readFileSync(path.join(__dirname, 'electron-osx-sign-usage.txt')).toString()
var sign = require('../').sign

args.app = args._.shift()
args.binaries = args._

if (!args.app || args.help) {
  console.log(usage)
  process.exit(0)
}

// Remove excess arguments
delete args._
delete args.help

sign(args, function done (err) {
  if (err) {
    console.error('Sign failed:')
    if (err.message) console.error(err.message)
    else if (err.stack) console.error(err.stack)
    else console.log(err)
    process.exit(1)
  }
  console.log('Application signed:', args.app)
  process.exit(0)
})
{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "bluebird-lst": "^1.0.9",
    "builder-util": "~10.1.2",
    "builder-util-runtime": "^8.2.5",
    "chalk": "^2.4.2",
    "fs-extra-p": "^8.0.2",
    "lazy-val": "^1.0.4",
    "mime": "^2.4.4"
  },
  "deprecated": false,
  "description": "Part of [electron-builder](https://github.com/electron-userland/electron-builder).",
  "files": [
    "out"
  ],
  "homepage": "https://github.com/electron-userland/electron-builder",
  "license": "MIT",
  "main": "out/publisher.js",
  "name": "electron-publish",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-builder.git"
  },
  "typings": "./out/publisher.d.ts",
  "version": "20.44.4"
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.BintrayPublisher = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _bintray() {
  const data = require("builder-util-runtime/out/bintray");

  _bintray = function () {
    return data;
  };

  return data;
}

function _nodeHttpExecutor() {
  const data = require("builder-util/out/nodeHttpExecutor");

  _nodeHttpExecutor = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

function _publisher() {
  const data = require("./publisher");

  _publisher = function () {
    return data;
  };

  return data;
}

class BintrayPublisher extends _publisher().HttpPublisher {
  constructor(context, info, version, options = {}) {
    super(context);
    this.version = version;
    this.options = options;
    this._versionPromise = new (_lazyVal().Lazy)(() => this.init());
    this.providerName = "Bintray";
    let token = info.token;

    if ((0, _builderUtil().isEmptyOrSpaces)(token)) {
      token = process.env.BT_TOKEN;

      if ((0, _builderUtil().isEmptyOrSpaces)(token)) {
        throw new (_builderUtil().InvalidConfigurationError)(`Bintray token is not set, neither programmatically, nor using env "BT_TOKEN" (see https://www.electron.build/configuration/publish#bintrayoptions)`);
      }

      token = token.trim();

      if (!(0, _builderUtil().isTokenCharValid)(token)) {
        throw new (_builderUtil().InvalidConfigurationError)(`Bintray token (${JSON.stringify(token)}) contains invalid characters, please check env "BT_TOKEN"`);
      }
    }

    this.client = new (_bintray().BintrayClient)(info, _nodeHttpExecutor().httpExecutor, this.context.cancellationToken, token);
  }

  init() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      try {
        return yield _this.client.getVersion(_this.version);
      } catch (e) {
        if (e instanceof _builderUtilRuntime().HttpError && e.statusCode === 404) {
          if (_this.options.publish !== "onTagOrDraft") {
            _builderUtil().log.info({
              version: _this.version
            }, "version doesn't exist, creating one");

            return _this.client.createVersion(_this.version);
          } else {
            _builderUtil().log.notice({
              reason: "version doesn't exist",
              version: _this.version
            }, "skipped publishing");
          }
        }

        throw e;
      }
    })();
  }

  doUpload(fileName, arch, dataLength, requestProcessor) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const version = yield _this2._versionPromise.value;

      if (version == null) {
        _builderUtil().log.notice({
          file: fileName,
          reason: "version doesn't exist and is not created",
          version: _this2.version
        }, "skipped publishing");

        return;
      }

      const options = {
        hostname: "api.bintray.com",
        path: `/content/${_this2.client.owner}/${_this2.client.repo}/${_this2.client.packageName}/${encodeURI(`${version.name}/${fileName}`)}`,
        method: "PUT",
        headers: {
          "Content-Length": dataLength,
          "X-Bintray-Override": "1",
          "X-Bintray-Publish": "1",
          "X-Bintray-Debian-Architecture": (0, _builderUtil().toLinuxArchString)(arch)
        }
      };

      if (_this2.client.distribution != null) {
        options.headers["X-Bintray-Debian-Distribution"] = _this2.client.distribution;
      }

      if (_this2.client.component != null) {
        options.headers["X-Bintray-Debian-Component"] = _this2.client.component;
      }

      for (let attemptNumber = 0;; attemptNumber++) {
        try {
          return yield _nodeHttpExecutor().httpExecutor.doApiRequest((0, _builderUtilRuntime().configureRequestOptions)(options, _this2.client.auth), _this2.context.cancellationToken, requestProcessor);
        } catch (e) {
          if (attemptNumber < 3 && (e instanceof _builderUtilRuntime().HttpError && e.statusCode === 502 || e.code === "EPIPE")) {
            continue;
          }

          throw e;
        }
      }
    })();
  } //noinspection JSUnusedGlobalSymbols


  deleteRelease(isForce = false) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (!isForce && !_this3._versionPromise.hasValue) {
        return;
      }

      const version = yield _this3._versionPromise.value;

      if (version != null) {
        yield _this3.client.deleteVersion(version.name);
      }
    })();
  }

  toString() {
    return `Bintray (user: ${this.client.user || this.client.owner}, owner: ${this.client.owner},  package: ${this.client.packageName}, repository: ${this.client.repo}, version: ${this.version})`;
  }

} exports.BintrayPublisher = BintrayPublisher;
// __ts-babel@6.0.4
//# sourceMappingURL=BintrayPublisher.js.map{"version":3,"sources":["../src/BintrayPublisher.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, InvalidConfigurationError, isEmptyOrSpaces, isTokenCharValid, log, toLinuxArchString } from \"builder-util\"\nimport { BintrayOptions, configureRequestOptions, HttpError } from \"builder-util-runtime\"\nimport { BintrayClient, Version } from \"builder-util-runtime/out/bintray\"\nimport { httpExecutor } from \"builder-util/out/nodeHttpExecutor\"\nimport { ClientRequest, RequestOptions } from \"http\"\nimport { Lazy } from \"lazy-val\"\nimport { HttpPublisher, PublishContext, PublishOptions } from \"./publisher\"\n\nexport class BintrayPublisher extends HttpPublisher {\n  private readonly _versionPromise = new Lazy(() => this.init())\n\n  private readonly client: BintrayClient\n\n  readonly providerName = \"Bintray\"\n\n  constructor(context: PublishContext, info: BintrayOptions, private readonly version: string, private readonly options: PublishOptions = {}) {\n    super(context)\n\n    let token = info.token\n    if (isEmptyOrSpaces(token)) {\n      token = process.env.BT_TOKEN\n      if (isEmptyOrSpaces(token)) {\n        throw new InvalidConfigurationError(`Bintray token is not set, neither programmatically, nor using env \"BT_TOKEN\" (see https://www.electron.build/configuration/publish#bintrayoptions)`)\n      }\n\n      token = token.trim()\n\n      if (!isTokenCharValid(token)) {\n        throw new InvalidConfigurationError(`Bintray token (${JSON.stringify(token)}) contains invalid characters, please check env \"BT_TOKEN\"`)\n      }\n    }\n\n    this.client = new BintrayClient(info, httpExecutor, this.context.cancellationToken, token)\n  }\n\n  private async init(): Promise<Version | null> {\n    try {\n      return await this.client.getVersion(this.version)\n    }\n    catch (e) {\n      if (e instanceof HttpError && e.statusCode === 404) {\n        if (this.options.publish !== \"onTagOrDraft\") {\n          log.info({version: this.version}, \"version doesn't exist, creating one\")\n          return this.client.createVersion(this.version)\n        }\n        else {\n          log.notice({reason: \"version doesn't exist\", version: this.version}, \"skipped publishing\")\n        }\n      }\n\n      throw e\n    }\n  }\n\n  protected async doUpload(fileName: string, arch: Arch, dataLength: number, requestProcessor: (request: ClientRequest, reject: (error: Error) => void) => void) {\n    const version = await this._versionPromise.value\n    if (version == null) {\n      log.notice({file: fileName, reason: \"version doesn't exist and is not created\", version: this.version}, \"skipped publishing\")\n      return\n    }\n\n    const options: RequestOptions = {\n      hostname: \"api.bintray.com\",\n      path: `/content/${this.client.owner}/${this.client.repo}/${this.client.packageName}/${encodeURI(`${version.name}/${fileName}`)}`,\n      method: \"PUT\",\n      headers: {\n        \"Content-Length\": dataLength,\n        \"X-Bintray-Override\": \"1\",\n        \"X-Bintray-Publish\": \"1\",\n        \"X-Bintray-Debian-Architecture\": toLinuxArchString(arch)\n      }\n    }\n\n    if (this.client.distribution != null) {\n      options.headers!![\"X-Bintray-Debian-Distribution\"] = this.client.distribution\n    }\n\n    if (this.client.component != null) {\n      options.headers!![\"X-Bintray-Debian-Component\"] = this.client.component\n    }\n\n    for (let attemptNumber = 0; ; attemptNumber++) {\n      try {\n        return await httpExecutor.doApiRequest(configureRequestOptions(options, this.client.auth), this.context.cancellationToken, requestProcessor)\n      }\n      catch (e) {\n        if (attemptNumber < 3 && ((e instanceof HttpError && e.statusCode === 502) || e.code === \"EPIPE\")) {\n          continue\n        }\n\n        throw e\n      }\n    }\n  }\n\n  //noinspection JSUnusedGlobalSymbols\n  async deleteRelease(isForce = false): Promise<void> {\n    if (!isForce && !this._versionPromise.hasValue) {\n      return\n    }\n\n    const version = (await this._versionPromise.value)\n    if (version != null) {\n      await this.client.deleteVersion(version.name)\n    }\n  }\n\n  toString() {\n    return `Bintray (user: ${this.client.user || this.client.owner}, owner: ${this.client.owner},  package: ${this.client.packageName}, repository: ${this.client.repo}, version: ${this.version})`\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.GitHubPublisher = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _nodeHttpExecutor() {
  const data = require("builder-util/out/nodeHttpExecutor");

  _nodeHttpExecutor = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

function _mime() {
  const data = _interopRequireDefault(require("mime"));

  _mime = function () {
    return data;
  };

  return data;
}

function _url() {
  const data = require("url");

  _url = function () {
    return data;
  };

  return data;
}

function _publisher() {
  const data = require("./publisher");

  _publisher = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

class GitHubPublisher extends _publisher().HttpPublisher {
  constructor(context, info, version, options = {}) {
    super(context, true);
    this.info = info;
    this.version = version;
    this.options = options;
    this._release = new (_lazyVal().Lazy)(() => this.token === "__test__" ? Promise.resolve(null) : this.getOrCreateRelease());
    this.providerName = "GitHub";
    this.releaseLogFields = null;
    let token = info.token;

    if ((0, _builderUtil().isEmptyOrSpaces)(token)) {
      token = process.env.GH_TOKEN || process.env.GITHUB_TOKEN;

      if ((0, _builderUtil().isEmptyOrSpaces)(token)) {
        throw new (_builderUtil().InvalidConfigurationError)(`GitHub Personal Access Token is not set, neither programmatically, nor using env "GH_TOKEN"`);
      }

      token = token.trim();

      if (!(0, _builderUtil().isTokenCharValid)(token)) {
        throw new (_builderUtil().InvalidConfigurationError)(`GitHub Personal Access Token (${JSON.stringify(token)}) contains invalid characters, please check env "GH_TOKEN"`);
      }
    }

    this.token = token;

    if (version.startsWith("v")) {
      throw new (_builderUtil().InvalidConfigurationError)(`Version must not start with "v": ${version}`);
    }

    this.tag = info.vPrefixedTagName === false ? version : `v${version}`;

    if ((0, _builderUtil().isEnvTrue)(process.env.EP_DRAFT)) {
      this.releaseType = "draft";

      _builderUtil().log.info({
        reason: "env EP_DRAFT is set to true"
      }, "GitHub provider release type is set to draft");
    } else if ((0, _builderUtil().isEnvTrue)(process.env.EP_PRE_RELEASE) || (0, _builderUtil().isEnvTrue)(process.env.EP_PRELEASE)
    /* https://github.com/electron-userland/electron-builder/issues/2878 */
    ) {
        this.releaseType = "prerelease";

        _builderUtil().log.info({
          reason: "env EP_PRE_RELEASE is set to true"
        }, "GitHub provider release type is set to prerelease");
      } else if (info.releaseType != null) {
      this.releaseType = info.releaseType;
    } else if (options.prerelease) {
      this.releaseType = "prerelease";
    } else {
      this.releaseType = options.draft === false ? "release" : "draft";
    }
  }

  getOrCreateRelease() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const logFields = {
        tag: _this.tag,
        version: _this.version
      }; // we don't use "Get a release by tag name" because "tag name" means existing git tag, but we draft release and don't create git tag

      const releases = yield _this.githubRequest(`/repos/${_this.info.owner}/${_this.info.repo}/releases`, _this.token);

      for (const release of releases) {
        if (!(release.tag_name === _this.tag || release.tag_name === _this.version)) {
          continue;
        }

        if (release.draft) {
          return release;
        } // https://github.com/electron-userland/electron-builder/issues/1197
        // https://electron-builder.slack.com/archives/general/p1485961449000202
        // https://github.com/electron-userland/electron-builder/issues/2072


        if (_this.releaseType === "draft") {
          _this.releaseLogFields = Object.assign({
            reason: "existing type not compatible with publishing type"
          }, logFields, {
            existingType: release.prerelease ? "pre-release" : "release",
            publishingType: _this.releaseType
          });

          _builderUtil().log.warn(_this.releaseLogFields, "GitHub release not created");

          return null;
        } // https://github.com/electron-userland/electron-builder/issues/1133
        // https://github.com/electron-userland/electron-builder/issues/2074
        // if release created < 2 hours â€” allow to upload


        const publishedAt = release.published_at == null ? null : Date.parse(release.published_at);

        if (publishedAt != null && Date.now() - publishedAt > 2 * 3600 * 1000) {
          // https://github.com/electron-userland/electron-builder/issues/1183#issuecomment-275867187
          _this.releaseLogFields = Object.assign({
            reason: "existing release published more than 2 hours ago"
          }, logFields, {
            date: new Date(publishedAt).toString()
          });

          _builderUtil().log.warn(_this.releaseLogFields, "GitHub release not created");

          return null;
        }

        return release;
      } // https://github.com/electron-userland/electron-builder/issues/1835


      if (_this.options.publish === "always" || (0, _publisher().getCiTag)() != null) {
        _builderUtil().log.info(Object.assign({
          reason: "release doesn't exist"
        }, logFields), `creating GitHub release`);

        return _this.createRelease();
      }

      _this.releaseLogFields = Object.assign({
        reason: "release doesn't exist and not created because \"publish\" is not \"always\" and build is not on tag"
      }, logFields);
      return null;
    })();
  }

  overwriteArtifact(fileName, release) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      // delete old artifact and re-upload
      _builderUtil().log.notice({
        file: fileName,
        reason: "already exists on GitHub"
      }, "overwrite published file");

      const assets = yield _this2.githubRequest(`/repos/${_this2.info.owner}/${_this2.info.repo}/releases/${release.id}/assets`, _this2.token, null);

      for (const asset of assets) {
        if (asset.name === fileName) {
          yield _this2.githubRequest(`/repos/${_this2.info.owner}/${_this2.info.repo}/releases/assets/${asset.id}`, _this2.token, null, "DELETE");
          return;
        }
      }

      _builderUtil().log.debug({
        file: fileName,
        reason: "not found on GitHub"
      }, "trying to upload again");
    })();
  }

  doUpload(fileName, arch, dataLength, requestProcessor) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const release = yield _this3._release.value;

      if (release == null) {
        _builderUtil().log.warn(Object.assign({
          file: fileName
        }, _this3.releaseLogFields), "skipped publishing");

        return;
      }

      const parsedUrl = (0, _url().parse)(release.upload_url.substring(0, release.upload_url.indexOf("{")) + "?name=" + fileName);
      let attemptNumber = 0;

      for (let i = 0; i < 3; i++) {
        try {
          return yield _nodeHttpExecutor().httpExecutor.doApiRequest((0, _builderUtilRuntime().configureRequestOptions)({
            hostname: parsedUrl.hostname,
            path: parsedUrl.path,
            method: "POST",
            headers: {
              accept: "application/vnd.github.v3+json",
              "Content-Type": _mime().default.getType(fileName) || "application/octet-stream",
              "Content-Length": dataLength
            }
          }, _this3.token), _this3.context.cancellationToken, requestProcessor);
        } catch (e) {
          if (e instanceof _builderUtilRuntime().HttpError && e.statusCode === 422 && e.description != null && e.description.errors != null && e.description.errors[0].code === "already_exists") {
            yield _this3.overwriteArtifact(fileName, release);
            continue;
          }

          if (!(attemptNumber++ < 3 && (e instanceof _builderUtilRuntime().HttpError || e.code === "EPIPE" || e.code === "ECONNRESET"))) {
            throw e;
          }
        }
      }
    })();
  }

  createRelease() {
    return this.githubRequest(`/repos/${this.info.owner}/${this.info.repo}/releases`, this.token, {
      tag_name: this.tag,
      name: this.version,
      draft: this.releaseType === "draft",
      prerelease: this.releaseType === "prerelease"
    });
  } // test only
  //noinspection JSUnusedGlobalSymbols


  getRelease() {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      return _this4.githubRequest(`/repos/${_this4.info.owner}/${_this4.info.repo}/releases/${(yield _this4._release.value).id}`, _this4.token);
    })();
  } //noinspection JSUnusedGlobalSymbols


  deleteRelease() {
    var _this5 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (!_this5._release.hasValue) {
        return;
      }

      const release = yield _this5._release.value;

      for (let i = 0; i < 3; i++) {
        try {
          return yield _this5.githubRequest(`/repos/${_this5.info.owner}/${_this5.info.repo}/releases/${release.id}`, _this5.token, null, "DELETE");
        } catch (e) {
          if (e instanceof _builderUtilRuntime().HttpError) {
            if (e.statusCode === 404) {
              _builderUtil().log.warn({
                releaseId: release.id,
                reason: "doesn't exist"
              }, "cannot delete release");

              return;
            } else if (e.statusCode === 405 || e.statusCode === 502) {
              continue;
            }
          }

          throw e;
        }
      }

      _builderUtil().log.warn({
        releaseId: release.id
      }, "cannot delete release");
    })();
  }

  githubRequest(path, token, data = null, method) {
    // host can contains port, but node http doesn't support host as url does
    const baseUrl = (0, _url().parse)(`https://${this.info.host || "api.github.com"}`);
    return (0, _builderUtilRuntime().parseJson)(_nodeHttpExecutor().httpExecutor.request((0, _builderUtilRuntime().configureRequestOptions)({
      hostname: baseUrl.hostname,
      port: baseUrl.port,
      path: this.info.host != null && this.info.host !== "github.com" ? `/api/v3${path.startsWith("/") ? path : `/${path}`}` : path,
      headers: {
        accept: "application/vnd.github.v3+json"
      }
    }, token, method), this.context.cancellationToken, data));
  }

  toString() {
    return `Github (owner: ${this.info.owner}, project: ${this.info.repo}, version: ${this.version})`;
  }

} exports.GitHubPublisher = GitHubPublisher;
// __ts-babel@6.0.4
//# sourceMappingURL=gitHubPublisher.js.map{"version":3,"sources":["../src/gitHubPublisher.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, InvalidConfigurationError, isEmptyOrSpaces, isEnvTrue, isTokenCharValid, log } from \"builder-util\"\nimport { configureRequestOptions, GithubOptions, HttpError, parseJson } from \"builder-util-runtime\"\nimport { Fields } from \"builder-util/out/log\"\nimport { httpExecutor } from \"builder-util/out/nodeHttpExecutor\"\nimport { ClientRequest } from \"http\"\nimport { Lazy } from \"lazy-val\"\nimport mime from \"mime\"\nimport { parse as parseUrl } from \"url\"\nimport { getCiTag, HttpPublisher, PublishContext, PublishOptions } from \"./publisher\"\n\nexport interface Release {\n  id: number\n  tag_name: string\n\n  draft: boolean\n  prerelease: boolean\n\n  published_at: string\n\n  upload_url: string\n}\n\ninterface Asset {\n  id: number\n  name: string\n}\n\nexport class GitHubPublisher extends HttpPublisher {\n  private readonly tag: string\n  readonly _release = new Lazy(() => this.token === \"__test__\" ? Promise.resolve(null as any) : this.getOrCreateRelease())\n\n  private readonly token: string\n\n  readonly providerName = \"GitHub\"\n\n  private readonly releaseType: \"draft\" | \"prerelease\" | \"release\"\n\n  private releaseLogFields: Fields | null = null\n\n  constructor(context: PublishContext, private readonly info: GithubOptions, private readonly version: string, private readonly options: PublishOptions = {}) {\n    super(context, true)\n\n    let token = info.token\n    if (isEmptyOrSpaces(token)) {\n      token = process.env.GH_TOKEN || process.env.GITHUB_TOKEN\n      if (isEmptyOrSpaces(token)) {\n        throw new InvalidConfigurationError(`GitHub Personal Access Token is not set, neither programmatically, nor using env \"GH_TOKEN\"`)\n      }\n\n      token = token.trim()\n\n      if (!isTokenCharValid(token)) {\n        throw new InvalidConfigurationError(`GitHub Personal Access Token (${JSON.stringify(token)}) contains invalid characters, please check env \"GH_TOKEN\"`)\n      }\n    }\n\n    this.token = token!\n\n    if (version.startsWith(\"v\")) {\n      throw new InvalidConfigurationError(`Version must not start with \"v\": ${version}`)\n    }\n\n    this.tag = info.vPrefixedTagName === false ? version : `v${version}`\n\n    if (isEnvTrue(process.env.EP_DRAFT)) {\n      this.releaseType = \"draft\"\n      log.info({reason: \"env EP_DRAFT is set to true\"}, \"GitHub provider release type is set to draft\")\n    }\n    else if (isEnvTrue(process.env.EP_PRE_RELEASE) || isEnvTrue(process.env.EP_PRELEASE) /* https://github.com/electron-userland/electron-builder/issues/2878 */) {\n      this.releaseType = \"prerelease\"\n      log.info({reason: \"env EP_PRE_RELEASE is set to true\"}, \"GitHub provider release type is set to prerelease\")\n    }\n    else if (info.releaseType != null) {\n      this.releaseType = info.releaseType\n    }\n    else if ((options as any).prerelease) {\n      this.releaseType = \"prerelease\"\n    }\n    else {\n      this.releaseType = (options as any).draft === false ? \"release\" : \"draft\"\n    }\n  }\n\n  private async getOrCreateRelease(): Promise<Release | null> {\n    const logFields = {\n      tag: this.tag,\n      version: this.version,\n    }\n\n    // we don't use \"Get a release by tag name\" because \"tag name\" means existing git tag, but we draft release and don't create git tag\n    const releases = await this.githubRequest<Array<Release>>(`/repos/${this.info.owner}/${this.info.repo}/releases`, this.token)\n    for (const release of releases) {\n      if (!(release.tag_name === this.tag || release.tag_name === this.version)) {\n        continue\n      }\n\n      if (release.draft) {\n        return release\n      }\n\n      // https://github.com/electron-userland/electron-builder/issues/1197\n      // https://electron-builder.slack.com/archives/general/p1485961449000202\n      // https://github.com/electron-userland/electron-builder/issues/2072\n      if (this.releaseType === \"draft\") {\n        this.releaseLogFields = {\n          reason: \"existing type not compatible with publishing type\",\n          ...logFields,\n          existingType: release.prerelease ? \"pre-release\" : \"release\",\n          publishingType: this.releaseType,\n        }\n        log.warn(this.releaseLogFields, \"GitHub release not created\")\n        return null\n      }\n\n      // https://github.com/electron-userland/electron-builder/issues/1133\n      // https://github.com/electron-userland/electron-builder/issues/2074\n      // if release created < 2 hours â€” allow to upload\n      const publishedAt = release.published_at == null ? null : Date.parse(release.published_at)\n      if (publishedAt != null && (Date.now() - publishedAt) > (2 * 3600 * 1000)) {\n        // https://github.com/electron-userland/electron-builder/issues/1183#issuecomment-275867187\n        this.releaseLogFields = {\n          reason: \"existing release published more than 2 hours ago\",\n          ...logFields,\n          date: new Date(publishedAt).toString(),\n        }\n        log.warn(this.releaseLogFields, \"GitHub release not created\")\n        return null\n      }\n      return release\n    }\n\n    // https://github.com/electron-userland/electron-builder/issues/1835\n    if (this.options.publish === \"always\" || getCiTag() != null) {\n      log.info({\n        reason: \"release doesn't exist\",\n        ...logFields,\n      }, `creating GitHub release`)\n      return this.createRelease()\n    }\n\n    this.releaseLogFields = {\n      reason: \"release doesn't exist and not created because \\\"publish\\\" is not \\\"always\\\" and build is not on tag\",\n      ...logFields,\n    }\n    return null\n  }\n\n  private async overwriteArtifact(fileName: string, release: Release) {\n    // delete old artifact and re-upload\n    log.notice({file: fileName, reason: \"already exists on GitHub\"}, \"overwrite published file\")\n\n    const assets = await this.githubRequest<Array<Asset>>(`/repos/${this.info.owner}/${this.info.repo}/releases/${release.id}/assets`, this.token, null)\n    for (const asset of assets) {\n      if (asset!.name === fileName) {\n        await this.githubRequest<void>(`/repos/${this.info.owner}/${this.info.repo}/releases/assets/${asset!.id}`, this.token, null, \"DELETE\")\n        return\n      }\n    }\n\n    log.debug({file: fileName, reason: \"not found on GitHub\"}, \"trying to upload again\")\n  }\n\n  protected async doUpload(fileName: string, arch: Arch, dataLength: number, requestProcessor: (request: ClientRequest, reject: (error: Error) => void) => void): Promise<any> {\n    const release = await this._release.value\n    if (release == null) {\n      log.warn({file: fileName, ...this.releaseLogFields}, \"skipped publishing\")\n      return\n    }\n\n    const parsedUrl = parseUrl(release.upload_url.substring(0, release.upload_url.indexOf(\"{\")) + \"?name=\" + fileName)\n    let attemptNumber = 0\n    for (let i = 0; i < 3; i++) {\n      try {\n        return await httpExecutor.doApiRequest(configureRequestOptions({\n          hostname: parsedUrl.hostname,\n          path: parsedUrl.path,\n          method: \"POST\",\n          headers: {\n            accept: \"application/vnd.github.v3+json\",\n            \"Content-Type\": mime.getType(fileName) || \"application/octet-stream\",\n            \"Content-Length\": dataLength\n          }\n        }, this.token), this.context.cancellationToken, requestProcessor)\n      }\n      catch (e) {\n        if (e instanceof HttpError && e.statusCode === 422 && e.description != null && e.description.errors != null && e.description.errors[0].code === \"already_exists\") {\n          await this.overwriteArtifact(fileName, release)\n          continue\n        }\n\n        if (!(attemptNumber++ < 3 && (e instanceof HttpError || (e.code === \"EPIPE\" || e.code === \"ECONNRESET\")))) {\n          throw e\n        }\n      }\n    }\n  }\n\n  private createRelease() {\n    return this.githubRequest<Release>(`/repos/${this.info.owner}/${this.info.repo}/releases`, this.token, {\n      tag_name: this.tag,\n      name: this.version,\n      draft: this.releaseType === \"draft\",\n      prerelease: this.releaseType === \"prerelease\",\n    })\n  }\n\n  // test only\n  //noinspection JSUnusedGlobalSymbols\n  async getRelease(): Promise<any> {\n    return this.githubRequest<Release>(`/repos/${this.info.owner}/${this.info.repo}/releases/${(await this._release.value)!.id}`, this.token)\n  }\n\n  //noinspection JSUnusedGlobalSymbols\n  async deleteRelease(): Promise<any> {\n    if (!this._release.hasValue) {\n      return\n    }\n\n    const release = await this._release.value\n    for (let i = 0; i < 3; i++) {\n      try {\n        return await this.githubRequest(`/repos/${this.info.owner}/${this.info.repo}/releases/${release.id}`, this.token, null, \"DELETE\")\n      }\n      catch (e) {\n        if (e instanceof HttpError) {\n          if (e.statusCode === 404) {\n            log.warn({releaseId: release.id, reason: \"doesn't exist\"}, \"cannot delete release\")\n            return\n          }\n          else if (e.statusCode === 405 || e.statusCode === 502) {\n            continue\n          }\n        }\n\n        throw e\n      }\n    }\n\n    log.warn({releaseId: release.id}, \"cannot delete release\")\n  }\n\n  private githubRequest<T>(path: string, token: string | null, data: {[name: string]: any; } | null = null, method?: \"GET\" | \"DELETE\" | \"PUT\"): Promise<T> {\n    // host can contains port, but node http doesn't support host as url does\n    const baseUrl = parseUrl(`https://${this.info.host || \"api.github.com\"}`)\n    return parseJson(httpExecutor.request(configureRequestOptions({\n      hostname: baseUrl.hostname,\n      port: baseUrl.port as any,\n      path: (this.info.host != null && this.info.host !== \"github.com\") ? `/api/v3${path.startsWith(\"/\") ? path : `/${path}`}` : path,\n      headers: {accept: \"application/vnd.github.v3+json\"}\n    }, token, method), this.context.cancellationToken, data))\n  }\n\n  toString() {\n    return `Github (owner: ${this.info.owner}, project: ${this.info.repo}, version: ${this.version})`\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MultiProgress = void 0;

function _log() {
  const data = require("builder-util/out/log");

  _log = function () {
    return data;
  };

  return data;
}

function _progress() {
  const data = require("./progress");

  _progress = function () {
    return data;
  };

  return data;
}

class MultiProgress {
  constructor() {
    this.stream = process.stdout;
    this.cursor = 0;
    this.totalLines = 0;
    this.isLogListenerAdded = false;
    this.barCount = 0;
  }

  createBar(format, options) {
    options.stream = this.stream; // tslint:disable:no-this-assignment

    const manager = this;

    class MultiProgressBar extends _progress().ProgressBar {
      constructor(format, options) {
        super(format, options);
        this.index = -1;
      }

      render() {
        if (this.index === -1) {
          this.index = manager.totalLines;
          manager.allocateLines(1);
        } else {
          manager.moveCursor(this.index);
        }

        super.render();

        if (!manager.isLogListenerAdded) {
          manager.isLogListenerAdded = true;
          (0, _log().setPrinter)(message => {
            let newLineCount = 0;
            let newLineIndex = message.indexOf("\n");

            while (newLineIndex > -1) {
              newLineCount++;
              newLineIndex = message.indexOf("\n", ++newLineIndex);
            }

            manager.allocateLines(newLineCount + 1);
            manager.stream.write(message);
          });
        }
      }

      terminate() {
        manager.barCount--;

        if (manager.barCount === 0 && manager.totalLines > 0) {
          manager.allocateLines(1);
          manager.totalLines = 0;
          manager.cursor = 0;
          (0, _log().setPrinter)(null);
          manager.isLogListenerAdded = false;
        }
      }

    }

    const bar = new MultiProgressBar(format, options);
    this.barCount++;
    return bar;
  }

  allocateLines(count) {
    this.stream.moveCursor(0, this.totalLines - 1); // if cursor pointed to previous line where \n is already printed, another \n is ignored, so, we can simply print it

    this.stream.write("\n");
    this.totalLines += count;
    this.cursor = this.totalLines - 1;
  }

  moveCursor(index) {
    this.stream.moveCursor(0, index - this.cursor);
    this.cursor = index;
  }

  terminate() {
    this.moveCursor(this.totalLines);
    this.stream.clearLine();
    this.stream.cursorTo(0);
  }

} exports.MultiProgress = MultiProgress;
// __ts-babel@6.0.4
//# sourceMappingURL=multiProgress.js.map{"version":3,"sources":["../src/multiProgress.ts"],"names":[],"mappings":"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","sourcesContent":["import { setPrinter } from \"builder-util/out/log\"\nimport { ProgressBar } from \"./progress\"\n\nexport class MultiProgress {\n  private readonly stream = process.stdout as any\n  private cursor = 0\n\n  private totalLines = 0\n\n  private isLogListenerAdded = false\n\n  private barCount = 0\n\n  createBar(format: string, options: any): ProgressBar {\n    options.stream = this.stream\n\n    // tslint:disable:no-this-assignment\n    const manager = this\n    class MultiProgressBar extends ProgressBar {\n      private index = -1\n\n      constructor(format: string, options: any) {\n        super(format, options)\n      }\n\n      render() {\n        if (this.index === -1) {\n          this.index = manager.totalLines\n          manager.allocateLines(1)\n        }\n        else {\n          manager.moveCursor(this.index)\n        }\n\n        super.render()\n\n        if (!manager.isLogListenerAdded) {\n          manager.isLogListenerAdded = true\n          setPrinter(message => {\n            let newLineCount = 0\n            let newLineIndex = message.indexOf(\"\\n\")\n            while (newLineIndex > -1) {\n              newLineCount++\n              newLineIndex = message.indexOf(\"\\n\", ++newLineIndex)\n            }\n\n            manager.allocateLines(newLineCount + 1)\n            manager.stream.write(message)\n          })\n        }\n      }\n\n      terminate() {\n        manager.barCount--\n        if (manager.barCount === 0 && manager.totalLines > 0) {\n          manager.allocateLines(1)\n          manager.totalLines = 0\n          manager.cursor = 0\n          setPrinter(null)\n          manager.isLogListenerAdded = false\n        }\n      }\n    }\n\n    const bar = new MultiProgressBar(format, options)\n    this.barCount++\n    return bar\n  }\n\n  private allocateLines(count: number) {\n    this.stream.moveCursor(0, this.totalLines - 1)\n    // if cursor pointed to previous line where \\n is already printed, another \\n is ignored, so, we can simply print it\n    this.stream.write(\"\\n\")\n    this.totalLines += count\n    this.cursor = this.totalLines - 1\n  }\n\n  private moveCursor(index: number) {\n    this.stream.moveCursor(0, index - this.cursor)\n    this.cursor = index\n  }\n\n  terminate() {\n    this.moveCursor(this.totalLines)\n    this.stream.clearLine()\n    this.stream.cursorTo(0)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ProgressCallback = exports.ProgressBar = void 0;

/*!
 * node-progress
 * Copyright(c) 2011 TJ Holowaychuk <tj@vision-media.ca>
 * MIT Licensed
 */
class ProgressBar {
  /**
   * Initialize a `ProgressBar` with the given `fmt` string and `options` or`total`.
   *
   * Options:
   *   - `curr` current completed index
   *   - `total` total number of ticks to complete
   *   - `width` the displayed width of the progress bar defaulting to total
   *   - `stream` the output stream defaulting to stderr
   *   - `head` head character defaulting to complete character
   *   - `complete` completion character defaulting to "="
   *   - `incomplete` incomplete character defaulting to "-"
   *   - `renderThrottle` minimum time between updates in milliseconds defaulting to 16
   *   - `callback` optional function to call when the progress bar completes
   *   - `clear` will clear the progress bar upon termination
   *
   * Tokens:
   *   - `:bar` the progress bar itself
   *   - `:current` current tick number
   *   - `:total` total ticks
   *   - `:elapsed` time elapsed in seconds
   *   - `:percent` completion percentage
   *   - `:eta` eta in seconds
   *   - `:rate` rate of ticks per second
   */
  constructor(format, options = {}) {
    this.format = format;
    this.current = 0;
    this.total = 0;
    this.tokens = null;
    this.lastDraw = "";
    this.start = 0;
    this.complete = false;
    this.stream = options.stream || process.stderr;
    this.total = options.total;
    this.width = options.width || this.total;
    this.chars = {
      complete: options.complete || "=",
      incomplete: options.incomplete || "-",
      head: options.head || options.complete || "="
    };
  }
  /**
   * "tick" the progress bar with optional `len` and optional `tokens`.
   */


  tick(delta) {
    this.currentAmount = this.current + delta;
  }

  set currentAmount(value) {
    this.current = value;

    if (this.complete) {
      return;
    }

    this.render();

    if (this.current >= this.total) {
      this.complete = true;
      this.terminate();
    }
  }

  render() {
    // start time for eta
    if (this.start === 0) {
      this.start = Date.now();
    }

    const ratio = Math.min(Math.max(this.current / this.total, 0), 1);
    const percent = ratio * 100;
    const elapsed = Date.now() - this.start;
    const eta = percent === 100 ? 0 : elapsed * (this.total / this.current - 1);
    const rate = this.current / (elapsed / 1000);
    /* populate the bar template with percentages and timestamps */

    let str = this.format.replace(":current", this.current.toString()).replace(":total", this.total.toString()).replace(":elapsed", isNaN(elapsed) ? "0.0" : (elapsed / 1000).toFixed(1)).replace(":eta", isNaN(eta) || !isFinite(eta) ? "0.0" : (eta / 1000).toFixed(1)).replace(":percent", percent.toFixed(0) + "%").replace(":rate", Math.round(rate).toString()); // compute the available space (non-zero) for the bar

    let availableSpace = Math.max(0, this.stream.columns - str.replace(":bar", "").length);

    if (availableSpace && process.platform === "win32") {
      availableSpace -= 1;
    }

    const width = Math.min(this.width, availableSpace);
    const completeLength = Math.round(width * ratio);
    let complete = Array(Math.max(0, completeLength + 1)).join(this.chars.complete);
    const incomplete = Array(Math.max(0, width - completeLength + 1)).join(this.chars.incomplete);
    /* add head to the complete string */

    if (completeLength > 0) {
      complete = complete.slice(0, -1) + this.chars.head;
    }
    /* fill in the actual progress bar */


    str = str.replace(":bar", complete + incomplete);
    /* replace the extra tokens */

    if (this.tokens != null) {
      for (const key of Object.keys(this.tokens)) {
        str = str.replace(`:${key}`, this.tokens[key]);
      }
    }

    if (this.lastDraw !== str) {
      this.stream.cursorTo(0);
      this.stream.write(str);
      this.stream.clearLine(1);
      this.lastDraw = str;
    }
  }
  /**
   * "update" the progress bar to represent an exact percentage.
   * The ratio (between 0 and 1) specified will be multiplied by `total` and
   * floored, representing the closest available "tick." For example, if a
   * progress bar has a length of 3 and `update(0.5)` is called, the progress
   * will be set to 1.
   *
   * A ratio of 0.5 will attempt to set the progress to halfway.
   */


  update(ratio) {
    const goal = Math.floor(ratio * this.total);
    const delta = goal - this.current;
    this.tick(delta);
  }
  /**
   * "interrupt" the progress bar and write a message above it.
   */


  interrupt(message) {
    // clear the current line
    const stream = this.stream;
    stream.clearLine(); // move the cursor to the start of the line

    stream.cursorTo(0); // write the message text

    stream.write(message); // terminate the line after writing the message

    stream.write("\n"); // re-display the progress bar with its lastDraw

    stream.write(this.lastDraw);
  }

}

exports.ProgressBar = ProgressBar;

class ProgressCallback {
  constructor(progressBar) {
    this.progressBar = progressBar;
    this.start = Date.now();
    this.nextUpdate = this.start + 1000;
  }

  update(transferred, total) {
    const now = Date.now();

    if (now >= this.nextUpdate || transferred >= total) {
      this.nextUpdate = now + 1000;
      this.progressBar.total = total;
      this.progressBar.currentAmount = transferred;
    }
  }

} exports.ProgressCallback = ProgressCallback;
// __ts-babel@6.0.4
//# sourceMappingURL=progress.js.map{"version":3,"sources":["../src/progress.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * node-progress\n * Copyright(c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n * MIT Licensed\n */\n\nexport abstract class ProgressBar {\n  private stream: any\n\n  private current = 0\n  total = 0\n  private width: number\n\n  private chars: any\n  private tokens: any = null\n  private lastDraw = \"\"\n\n  private start = 0\n\n  private complete = false\n\n  /**\n   * Initialize a `ProgressBar` with the given `fmt` string and `options` or`total`.\n   *\n   * Options:\n   *   - `curr` current completed index\n   *   - `total` total number of ticks to complete\n   *   - `width` the displayed width of the progress bar defaulting to total\n   *   - `stream` the output stream defaulting to stderr\n   *   - `head` head character defaulting to complete character\n   *   - `complete` completion character defaulting to \"=\"\n   *   - `incomplete` incomplete character defaulting to \"-\"\n   *   - `renderThrottle` minimum time between updates in milliseconds defaulting to 16\n   *   - `callback` optional function to call when the progress bar completes\n   *   - `clear` will clear the progress bar upon termination\n   *\n   * Tokens:\n   *   - `:bar` the progress bar itself\n   *   - `:current` current tick number\n   *   - `:total` total ticks\n   *   - `:elapsed` time elapsed in seconds\n   *   - `:percent` completion percentage\n   *   - `:eta` eta in seconds\n   *   - `:rate` rate of ticks per second\n   */\n  constructor(private readonly format: string, options: any = {}) {\n    this.stream = options.stream || process.stderr\n\n    this.total = options.total\n    this.width = options.width || this.total\n    this.chars = {\n      complete: options.complete || \"=\",\n      incomplete: options.incomplete || \"-\",\n      head: options.head || (options.complete || \"=\")\n    }\n  }\n\n  /**\n   * \"tick\" the progress bar with optional `len` and optional `tokens`.\n   */\n  tick(delta: number) {\n    this.currentAmount = this.current + delta\n  }\n\n  set currentAmount(value: number) {\n    this.current = value\n\n    if (this.complete) {\n      return\n    }\n\n    this.render()\n\n    if (this.current >= this.total) {\n      this.complete = true\n      this.terminate()\n    }\n  }\n\n  render() {\n    // start time for eta\n    if (this.start === 0) {\n      this.start = Date.now()\n    }\n\n    const ratio = Math.min(Math.max(this.current / this.total, 0), 1)\n\n    const percent = ratio * 100\n    const elapsed = Date.now() - this.start\n    const eta = percent === 100 ? 0 : (elapsed * (this.total / this.current - 1))\n    const rate = this.current / (elapsed / 1000)\n\n    /* populate the bar template with percentages and timestamps */\n    let str = this.format\n      .replace(\":current\", this.current.toString())\n      .replace(\":total\", this.total.toString())\n      .replace(\":elapsed\", isNaN(elapsed) ? \"0.0\" : (elapsed / 1000).toFixed(1))\n      .replace(\":eta\", (isNaN(eta) || !isFinite(eta)) ? \"0.0\" : (eta / 1000).toFixed(1))\n      .replace(\":percent\", percent.toFixed(0) + \"%\")\n      .replace(\":rate\", Math.round(rate).toString())\n\n    // compute the available space (non-zero) for the bar\n    let availableSpace = Math.max(0, this.stream.columns - str.replace(\":bar\", \"\").length)\n    if (availableSpace && process.platform === \"win32\") {\n      availableSpace -= 1\n    }\n\n    const width = Math.min(this.width, availableSpace)\n    const completeLength = Math.round(width * ratio)\n    let complete = Array(Math.max(0, completeLength + 1)).join(this.chars.complete)\n    const incomplete = Array(Math.max(0, width - completeLength + 1)).join(this.chars.incomplete)\n\n    /* add head to the complete string */\n    if (completeLength > 0) {\n      complete = complete.slice(0, -1) + this.chars.head\n    }\n\n    /* fill in the actual progress bar */\n    str = str.replace(\":bar\", complete + incomplete)\n\n    /* replace the extra tokens */\n    if (this.tokens != null) {\n      for (const key of Object.keys(this.tokens)) {\n        str = str.replace(`:${key}`, this.tokens[key])\n      }\n    }\n\n    if (this.lastDraw !== str) {\n      this.stream.cursorTo(0)\n      this.stream.write(str)\n      this.stream.clearLine(1)\n      this.lastDraw = str\n    }\n  }\n\n  /**\n   * \"update\" the progress bar to represent an exact percentage.\n   * The ratio (between 0 and 1) specified will be multiplied by `total` and\n   * floored, representing the closest available \"tick.\" For example, if a\n   * progress bar has a length of 3 and `update(0.5)` is called, the progress\n   * will be set to 1.\n   *\n   * A ratio of 0.5 will attempt to set the progress to halfway.\n   */\n  update(ratio: number) {\n    const goal = Math.floor(ratio * this.total)\n    const delta = goal - this.current\n    this.tick(delta)\n  }\n\n  /**\n   * \"interrupt\" the progress bar and write a message above it.\n   */\n  interrupt(message: string) {\n    // clear the current line\n    const stream = this.stream\n    stream.clearLine()\n    // move the cursor to the start of the line\n    stream.cursorTo(0)\n    // write the message text\n    stream.write(message)\n    // terminate the line after writing the message\n    stream.write(\"\\n\")\n    // re-display the progress bar with its lastDraw\n    stream.write(this.lastDraw)\n  }\n\n  abstract terminate(): void\n}\n\nexport class ProgressCallback {\n  private start = Date.now()\n  private nextUpdate = this.start + 1000\n\n  constructor(private readonly progressBar: ProgressBar) {\n  }\n\n  update(transferred: number, total: number) {\n    const now = Date.now()\n    if (now >= this.nextUpdate || transferred >= total) {\n      this.nextUpdate = now + 1000\n\n      this.progressBar.total = total\n      this.progressBar.currentAmount = transferred\n    }\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getCiTag = getCiTag;
Object.defineProperty(exports, "ProgressCallback", {
  enumerable: true,
  get: function () {
    return _progress().ProgressCallback;
  }
});
exports.HttpPublisher = exports.Publisher = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _log() {
  const data = require("builder-util/out/log");

  _log = function () {
    return data;
  };

  return data;
}

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var _path = require("path");

function _progress() {
  const data = require("./progress");

  _progress = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const progressBarOptions = {
  incomplete: " ",
  width: 20
};

class Publisher {
  constructor(context) {
    this.context = context;
  }

  createProgressBar(fileName, size) {
    _builderUtil().log.info({
      file: fileName,
      provider: this.providerName
    }, "uploading");

    if (this.context.progress == null || size < 512 * 1024) {
      return null;
    }

    return this.context.progress.createBar(`${" ".repeat(_log().PADDING + 2)}[:bar] :percent :etas | ${_chalk().default.green(fileName)} to ${this.providerName}`, Object.assign({
      total: size
    }, progressBarOptions));
  }

  createReadStreamAndProgressBar(file, fileStat, progressBar, reject) {
    const fileInputStream = (0, _fsExtraP().createReadStream)(file);
    fileInputStream.on("error", reject);

    if (progressBar == null) {
      return fileInputStream;
    } else {
      const progressStream = new (_builderUtilRuntime().ProgressCallbackTransform)(fileStat.size, this.context.cancellationToken, it => progressBar.tick(it.delta));
      progressStream.on("error", reject);
      return fileInputStream.pipe(progressStream);
    }
  }

}

exports.Publisher = Publisher;

class HttpPublisher extends Publisher {
  constructor(context, useSafeArtifactName = false) {
    super(context);
    this.context = context;
    this.useSafeArtifactName = useSafeArtifactName;
  }

  upload(task) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const fileName = (_this.useSafeArtifactName ? task.safeArtifactName : null) || (0, _path.basename)(task.file);

      if (task.fileContent != null) {
        yield _this.doUpload(fileName, task.arch || _builderUtil().Arch.x64, task.fileContent.length, it => it.end(task.fileContent));
        return;
      }

      const fileStat = yield (0, _fsExtraP().stat)(task.file);

      const progressBar = _this.createProgressBar(fileName, fileStat.size);

      yield _this.doUpload(fileName, task.arch || _builderUtil().Arch.x64, fileStat.size, (request, reject) => {
        if (progressBar != null) {
          // reset (because can be called several times (several attempts)
          progressBar.update(0);
        }

        return _this.createReadStreamAndProgressBar(task.file, fileStat, progressBar, reject).pipe(request);
      }, task.file);
    })();
  }

}

exports.HttpPublisher = HttpPublisher;

function getCiTag() {
  const tag = process.env.TRAVIS_TAG || process.env.APPVEYOR_REPO_TAG_NAME || process.env.CIRCLE_TAG || process.env.BITRISE_GIT_TAG || process.env.CI_BUILD_TAG;
  return tag != null && tag.length > 0 ? tag : null;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=publisher.js.map{"version":3,"sources":["../src/publisher.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, log } from \"builder-util\"\nimport { CancellationToken, ProgressCallbackTransform } from \"builder-util-runtime\"\nimport { PADDING } from \"builder-util/out/log\"\nimport chalk from \"chalk\"\nimport { createReadStream, stat, Stats } from \"fs-extra-p\"\nimport { ClientRequest } from \"http\"\nimport { basename } from \"path\"\nimport { MultiProgress } from \"./multiProgress\"\nimport { ProgressBar } from \"./progress\"\n\nexport type PublishPolicy = \"onTag\" | \"onTagOrDraft\" | \"always\" | \"never\"\n\nexport { ProgressCallback } from \"./progress\"\n\nexport interface PublishOptions {\n  publish?: PublishPolicy | null\n}\n\nexport interface PublishContext {\n  readonly cancellationToken: CancellationToken\n  readonly progress: MultiProgress | null\n}\n\nconst progressBarOptions = {\n  incomplete: \" \",\n  width: 20,\n}\n\nexport interface UploadTask {\n  file: string\n  fileContent?: Buffer | null\n\n  arch: Arch | null\n  safeArtifactName?: string | null\n}\n\nexport abstract class Publisher {\n  protected constructor(protected readonly context: PublishContext) {\n  }\n\n  abstract get providerName(): string\n\n  abstract upload(task: UploadTask): Promise<any>\n\n  protected createProgressBar(fileName: string, size: number): ProgressBar | null {\n    log.info({file: fileName, provider: this.providerName}, \"uploading\")\n    if (this.context.progress == null || size < (512 * 1024)) {\n      return null\n    }\n    return this.context.progress.createBar(`${\" \".repeat(PADDING + 2)}[:bar] :percent :etas | ${chalk.green(fileName)} to ${this.providerName}`, {total: size, ...progressBarOptions})\n  }\n\n  protected createReadStreamAndProgressBar(file: string, fileStat: Stats, progressBar: ProgressBar | null, reject: (error: Error) => void): NodeJS.ReadableStream {\n    const fileInputStream = createReadStream(file)\n    fileInputStream.on(\"error\", reject)\n\n    if (progressBar == null) {\n      return fileInputStream\n    }\n    else {\n      const progressStream = new ProgressCallbackTransform(fileStat.size, this.context.cancellationToken, it => progressBar.tick(it.delta))\n      progressStream.on(\"error\", reject)\n      return fileInputStream.pipe(progressStream)\n    }\n  }\n\n  abstract toString(): string\n}\n\nexport abstract class HttpPublisher extends Publisher {\n  constructor(protected readonly context: PublishContext, private readonly useSafeArtifactName = false) {\n    super(context)\n  }\n\n  async upload(task: UploadTask): Promise<any> {\n    const fileName = (this.useSafeArtifactName ? task.safeArtifactName : null) || basename(task.file)\n\n    if (task.fileContent != null) {\n      await this.doUpload(fileName, task.arch || Arch.x64, task.fileContent.length, it => it.end(task.fileContent))\n      return\n    }\n\n    const fileStat = await stat(task.file)\n\n    const progressBar = this.createProgressBar(fileName, fileStat.size)\n    await this.doUpload(fileName, task.arch || Arch.x64, fileStat.size, (request, reject) => {\n      if (progressBar != null) {\n        // reset (because can be called several times (several attempts)\n        progressBar.update(0)\n      }\n      return this.createReadStreamAndProgressBar(task.file, fileStat, progressBar, reject).pipe(request)\n    }, task.file)\n  }\n\n  protected abstract doUpload(fileName: string, arch: Arch, dataLength: number, requestProcessor: (request: ClientRequest, reject: (error: Error) => void) => void, file?: string): Promise<any>\n}\n\nexport function getCiTag() {\n  const tag = process.env.TRAVIS_TAG || process.env.APPVEYOR_REPO_TAG_NAME || process.env.CIRCLE_TAG || process.env.BITRISE_GIT_TAG || process.env.CI_BUILD_TAG\n  return tag != null && tag.length > 0 ? tag : null\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.BaseS3Publisher = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _publisher() {
  const data = require("../publisher");

  _publisher = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class BaseS3Publisher extends _publisher().Publisher {
  constructor(context, options) {
    super(context);
    this.options = options;
  }

  configureS3Options(args) {
    // if explicitly set to null, do not add
    if (this.options.acl !== null) {
      args.push("--acl", this.options.acl || "public-read");
    }
  } // http://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-example-creating-buckets.html


  upload(task) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const fileName = path.basename(task.file);
      const cancellationToken = _this.context.cancellationToken;
      const target = (_this.options.path == null ? "" : `${_this.options.path}/`) + fileName;
      const args = ["publish-s3", "--bucket", _this.getBucketName(), "--key", target, "--file", task.file];

      _this.configureS3Options(args);

      if (process.env.__TEST_S3_PUBLISHER__ != null) {
        const testFile = path.join(process.env.__TEST_S3_PUBLISHER__, target);
        yield (0, _fsExtraP().ensureDir)(path.dirname(testFile));
        yield (0, _fsExtraP().symlink)(task.file, testFile);
        return;
      } // https://github.com/aws/aws-sdk-go/issues/279


      _this.createProgressBar(fileName, -1); // if (progressBar != null) {
      //   const callback = new ProgressCallback(progressBar)
      //   uploader.on("progress", () => {
      //     if (!cancellationToken.cancelled) {
      //       callback.update(uploader.loaded, uploader.contentLength)
      //     }
      //   })
      // }


      return yield cancellationToken.createPromise((resolve, reject, onCancel) => {
        (0, _builderUtil().executeAppBuilder)(args, process => {
          onCancel(() => {
            process.kill("SIGINT");
          });
        }).then(() => {
          try {
            _builderUtil().log.debug({
              provider: _this.providerName,
              file: fileName,
              bucket: _this.getBucketName()
            }, "uploaded");
          } finally {
            resolve();
          }
        }).catch(reject);
      });
    })();
  }

  toString() {
    return `${this.providerName} (bucket: ${this.getBucketName()})`;
  }

} exports.BaseS3Publisher = BaseS3Publisher;
// __ts-babel@6.0.4
//# sourceMappingURL=BaseS3Publisher.js.map{"version":3,"sources":["../../src/s3/BaseS3Publisher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;;;AAEM,MAAgB,eAAhB,SAAwC,sBAAxC,CAAiD;AACrD,EAAA,WAAA,CAAsB,OAAtB,EAAuD,OAAvD,EAA6E;AAC3E,UAAM,OAAN;AADqD,SAAA,OAAA,GAAA,OAAA;AAEtD;;AAIS,EAAA,kBAAkB,CAAC,IAAD,EAAoB;AAC9C;AACA,QAAI,KAAK,OAAL,CAAa,GAAb,KAAqB,IAAzB,EAA+B;AAC7B,MAAA,IAAI,CAAC,IAAL,CAAU,OAAV,EAAmB,KAAK,OAAL,CAAa,GAAb,IAAoB,aAAvC;AACD;AACF,GAZoD,CAcrD;;;AACM,EAAA,MAAN,CAAa,IAAb,EAA6B;AAAA;;AAAA;AAC3B,YAAM,QAAQ,GAAG,IAAI,CAAC,QAAL,CAAc,IAAI,CAAC,IAAnB,CAAjB;AACA,YAAM,iBAAiB,GAAG,KAAI,CAAC,OAAL,CAAa,iBAAvC;AAEA,YAAM,MAAM,GAAG,CAAC,KAAI,CAAC,OAAL,CAAa,IAAb,IAAqB,IAArB,GAA4B,EAA5B,GAAiC,GAAG,KAAI,CAAC,OAAL,CAAa,IAAI,GAAtD,IAA6D,QAA5E;AAEA,YAAM,IAAI,GAAG,CAAC,YAAD,EAAe,UAAf,EAA2B,KAAI,CAAC,aAAL,EAA3B,EAAiD,OAAjD,EAA0D,MAA1D,EAAkE,QAAlE,EAA4E,IAAI,CAAC,IAAjF,CAAb;;AACA,MAAA,KAAI,CAAC,kBAAL,CAAwB,IAAxB;;AAEA,UAAI,OAAO,CAAC,GAAR,CAAY,qBAAZ,IAAqC,IAAzC,EAA+C;AAC7C,cAAM,QAAQ,GAAG,IAAI,CAAC,IAAL,CAAU,OAAO,CAAC,GAAR,CAAY,qBAAtB,EAA8C,MAA9C,CAAjB;AACA,cAAM,2BAAU,IAAI,CAAC,OAAL,CAAa,QAAb,CAAV,CAAN;AACA,cAAM,yBAAQ,IAAI,CAAC,IAAb,EAAmB,QAAnB,CAAN;AACA;AACD,OAd0B,CAgB3B;;;AACA,MAAA,KAAI,CAAC,iBAAL,CAAuB,QAAvB,EAAiC,CAAC,CAAlC,EAjB2B,CAkB3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAEA,mBAAa,iBAAiB,CAAC,aAAlB,CAAgC,CAAC,OAAD,EAAU,MAAV,EAAkB,QAAlB,KAA8B;AACzE,8CAAkB,IAAlB,EAAwB,OAAO,IAAG;AAChC,UAAA,QAAQ,CAAC,MAAK;AACZ,YAAA,OAAO,CAAC,IAAR,CAAa,QAAb;AACD,WAFO,CAAR;AAGD,SAJD,EAKG,IALH,CAKQ,MAAK;AACT,cAAI;AACF,+BAAI,KAAJ,CAAU;AAAC,cAAA,QAAQ,EAAE,KAAI,CAAC,YAAhB;AAA8B,cAAA,IAAI,EAAE,QAApC;AAA8C,cAAA,MAAM,EAAE,KAAI,CAAC,aAAL;AAAtD,aAAV,EAAuF,UAAvF;AACD,WAFD,SAGQ;AACN,YAAA,OAAO;AACR;AACF,SAZH,EAaG,KAbH,CAaS,MAbT;AAcD,OAfY,CAAb;AA3B2B;AA2C5B;;AAED,EAAA,QAAQ,GAAA;AACN,WAAO,GAAG,KAAK,YAAY,aAAa,KAAK,aAAL,EAAoB,GAA5D;AACD;;AA9DoD,C","sourcesContent":["import { log, executeAppBuilder } from \"builder-util\"\nimport { BaseS3Options } from \"builder-util-runtime\"\nimport { PublishContext, Publisher, UploadTask } from \"../publisher\"\nimport { ensureDir, symlink } from \"fs-extra-p\"\nimport * as path from \"path\"\n\nexport abstract class BaseS3Publisher extends Publisher {\n  protected constructor(context: PublishContext, private options: BaseS3Options) {\n    super(context)\n  }\n\n  protected abstract getBucketName(): string\n\n  protected configureS3Options(args: Array<string>) {\n    // if explicitly set to null, do not add\n    if (this.options.acl !== null) {\n      args.push(\"--acl\", this.options.acl || \"public-read\")\n    }\n  }\n\n  // http://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-example-creating-buckets.html\n  async upload(task: UploadTask): Promise<any> {\n    const fileName = path.basename(task.file)\n    const cancellationToken = this.context.cancellationToken\n\n    const target = (this.options.path == null ? \"\" : `${this.options.path}/`) + fileName\n\n    const args = [\"publish-s3\", \"--bucket\", this.getBucketName(), \"--key\", target, \"--file\", task.file]\n    this.configureS3Options(args)\n\n    if (process.env.__TEST_S3_PUBLISHER__ != null) {\n      const testFile = path.join(process.env.__TEST_S3_PUBLISHER__!, target)\n      await ensureDir(path.dirname(testFile))\n      await symlink(task.file, testFile)\n      return\n    }\n\n    // https://github.com/aws/aws-sdk-go/issues/279\n    this.createProgressBar(fileName, -1)\n    // if (progressBar != null) {\n    //   const callback = new ProgressCallback(progressBar)\n    //   uploader.on(\"progress\", () => {\n    //     if (!cancellationToken.cancelled) {\n    //       callback.update(uploader.loaded, uploader.contentLength)\n    //     }\n    //   })\n    // }\n\n    return await cancellationToken.createPromise((resolve, reject, onCancel) => {\n      executeAppBuilder(args, process => {\n        onCancel(() => {\n          process.kill(\"SIGINT\")\n        })\n      })\n        .then(() => {\n          try {\n            log.debug({provider: this.providerName, file: fileName, bucket: this.getBucketName()}, \"uploaded\")\n          }\n          finally {\n            resolve()\n          }\n        })\n        .catch(reject)\n    })\n  }\n\n  toString() {\n    return `${this.providerName} (bucket: ${this.getBucketName()})`\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _BaseS3Publisher() {
  const data = require("./BaseS3Publisher");

  _BaseS3Publisher = function () {
    return data;
  };

  return data;
}

class S3Publisher extends _BaseS3Publisher().BaseS3Publisher {
  constructor(context, info) {
    super(context, info);
    this.info = info;
    this.providerName = "S3";
  }

  static checkAndResolveOptions(options, channelFromAppVersion, errorIfCannot) {
    return (0, _bluebirdLst().coroutine)(function* () {
      const bucket = options.bucket;

      if (bucket == null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Please specify "bucket" for "s3" publish provider`);
      }

      if (options.endpoint == null && bucket.includes(".") && options.region == null) {
        // on dotted bucket names, we need to use a path-based endpoint URL. Path-based endpoint URLs need to include the region.
        try {
          options.region = yield (0, _builderUtil().executeAppBuilder)(["get-bucket-location", "--bucket", bucket]);
        } catch (e) {
          if (errorIfCannot) {
            throw e;
          } else {
            _builderUtil().log.warn(`cannot compute region for bucket (required because on dotted bucket names, we need to use a path-based endpoint URL): ${e}`);
          }
        }
      }

      if (options.channel == null && channelFromAppVersion != null) {
        options.channel = channelFromAppVersion;
      }

      if (options.endpoint != null && options.endpoint.endsWith("/")) {
        options.endpoint = options.endpoint.slice(0, -1);
      }
    })();
  }

  getBucketName() {
    return this.info.bucket;
  }

  configureS3Options(args) {
    super.configureS3Options(args);

    if (this.info.endpoint != null) {
      args.push("--endpoint", this.info.endpoint);
    }

    if (this.info.region != null) {
      args.push("--region", this.info.region);
    }

    if (this.info.storageClass != null) {
      args.push("--storageClass", this.info.storageClass);
    }

    if (this.info.encryption != null) {
      args.push("--encryption", this.info.encryption);
    }
  }

  toString() {
    const result = super.toString();
    const endpoint = this.info.endpoint;

    if (endpoint != null) {
      return result.substring(0, result.length - 1) + `, endpoint: ${endpoint})`;
    }

    return result;
  }

} exports.default = S3Publisher;
// __ts-babel@6.0.4
//# sourceMappingURL=s3Publisher.js.map{"version":3,"sources":["../../src/s3/s3Publisher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEc,MAAO,WAAP,SAA2B,kCAA3B,CAA0C;AAGtD,EAAA,WAAA,CAAY,OAAZ,EAAsD,IAAtD,EAAqE;AACnE,UAAM,OAAN,EAAe,IAAf;AADoD,SAAA,IAAA,GAAA,IAAA;AAF7C,SAAA,YAAA,GAAe,IAAf;AAIR;;AAED,SAAa,sBAAb,CAAoC,OAApC,EAAwD,qBAAxD,EAA8F,aAA9F,EAAoH;AAAA;AAClH,YAAM,MAAM,GAAG,OAAO,CAAC,MAAvB;;AACA,UAAI,MAAM,IAAI,IAAd,EAAoB;AAClB,cAAM,KAAI,wCAAJ,EAA8B,mDAA9B,CAAN;AACD;;AAED,UAAI,OAAO,CAAC,QAAR,IAAoB,IAApB,IAA6B,MAAM,CAAC,QAAP,CAAgB,GAAhB,KAAwB,OAAO,CAAC,MAAR,IAAkB,IAA3E,EAAkF;AAChF;AACA,YAAI;AACF,UAAA,OAAO,CAAC,MAAR,SAAuB,sCAAkB,CAAC,qBAAD,EAAwB,UAAxB,EAAoC,MAApC,CAAlB,CAAvB;AACD,SAFD,CAGA,OAAO,CAAP,EAAU;AACR,cAAI,aAAJ,EAAmB;AACjB,kBAAM,CAAN;AACD,WAFD,MAGK;AACH,+BAAI,IAAJ,CAAS,yHAAyH,CAAC,EAAnI;AACD;AACF;AACF;;AAED,UAAI,OAAO,CAAC,OAAR,IAAmB,IAAnB,IAA2B,qBAAqB,IAAI,IAAxD,EAA8D;AAC5D,QAAA,OAAO,CAAC,OAAR,GAAkB,qBAAlB;AACD;;AAED,UAAI,OAAO,CAAC,QAAR,IAAoB,IAApB,IAA4B,OAAO,CAAC,QAAR,CAAiB,QAAjB,CAA0B,GAA1B,CAAhC,EAAgE;AAC7D,QAAA,OAAe,CAAC,QAAhB,GAA2B,OAAO,CAAC,QAAR,CAAiB,KAAjB,CAAuB,CAAvB,EAA0B,CAAC,CAA3B,CAA3B;AACF;AA3BiH;AA4BnH;;AAES,EAAA,aAAa,GAAA;AACrB,WAAO,KAAK,IAAL,CAAU,MAAjB;AACD;;AAES,EAAA,kBAAkB,CAAC,IAAD,EAAoB;AAC9C,UAAM,kBAAN,CAAyB,IAAzB;;AAEA,QAAI,KAAK,IAAL,CAAU,QAAV,IAAsB,IAA1B,EAAgC;AAC9B,MAAA,IAAI,CAAC,IAAL,CAAU,YAAV,EAAwB,KAAK,IAAL,CAAU,QAAlC;AACD;;AACD,QAAI,KAAK,IAAL,CAAU,MAAV,IAAoB,IAAxB,EAA8B;AAC5B,MAAA,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,KAAK,IAAL,CAAU,MAAhC;AACD;;AAED,QAAI,KAAK,IAAL,CAAU,YAAV,IAA0B,IAA9B,EAAoC;AAClC,MAAA,IAAI,CAAC,IAAL,CAAU,gBAAV,EAA4B,KAAK,IAAL,CAAU,YAAtC;AACD;;AACD,QAAI,KAAK,IAAL,CAAU,UAAV,IAAwB,IAA5B,EAAkC;AAChC,MAAA,IAAI,CAAC,IAAL,CAAU,cAAV,EAA0B,KAAK,IAAL,CAAU,UAApC;AACD;AACF;;AAED,EAAA,QAAQ,GAAA;AACN,UAAM,MAAM,GAAG,MAAM,QAAN,EAAf;AACA,UAAM,QAAQ,GAAG,KAAK,IAAL,CAAU,QAA3B;;AACA,QAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,aAAO,MAAM,CAAC,SAAP,CAAiB,CAAjB,EAAoB,MAAM,CAAC,MAAP,GAAgB,CAApC,IAAyC,eAAe,QAAQ,GAAvE;AACD;;AACD,WAAO,MAAP;AACD;;AAlEqD,C","sourcesContent":["import { executeAppBuilder, InvalidConfigurationError, log } from \"builder-util\"\nimport { S3Options } from \"builder-util-runtime\"\nimport { PublishContext } from \"../publisher\"\nimport { BaseS3Publisher } from \"./BaseS3Publisher\"\n\nexport default class S3Publisher extends BaseS3Publisher {\n  readonly providerName = \"S3\"\n\n  constructor(context: PublishContext, private readonly info: S3Options) {\n    super(context, info)\n  }\n\n  static async checkAndResolveOptions(options: S3Options, channelFromAppVersion: string | null, errorIfCannot: boolean) {\n    const bucket = options.bucket\n    if (bucket == null) {\n      throw new InvalidConfigurationError(`Please specify \"bucket\" for \"s3\" publish provider`)\n    }\n\n    if (options.endpoint == null && (bucket.includes(\".\") && options.region == null)) {\n      // on dotted bucket names, we need to use a path-based endpoint URL. Path-based endpoint URLs need to include the region.\n      try {\n        options.region = await executeAppBuilder([\"get-bucket-location\", \"--bucket\", bucket])\n      }\n      catch (e) {\n        if (errorIfCannot) {\n          throw e\n        }\n        else {\n          log.warn(`cannot compute region for bucket (required because on dotted bucket names, we need to use a path-based endpoint URL): ${e}`)\n        }\n      }\n    }\n\n    if (options.channel == null && channelFromAppVersion != null) {\n      options.channel = channelFromAppVersion\n    }\n\n    if (options.endpoint != null && options.endpoint.endsWith(\"/\")) {\n      (options as any).endpoint = options.endpoint.slice(0, -1)\n    }\n  }\n\n  protected getBucketName(): string {\n    return this.info.bucket!\n  }\n\n  protected configureS3Options(args: Array<string>): void {\n    super.configureS3Options(args)\n\n    if (this.info.endpoint != null) {\n      args.push(\"--endpoint\", this.info.endpoint)\n    }\n    if (this.info.region != null) {\n      args.push(\"--region\", this.info.region)\n    }\n\n    if (this.info.storageClass != null) {\n      args.push(\"--storageClass\", this.info.storageClass)\n    }\n    if (this.info.encryption != null) {\n      args.push(\"--encryption\", this.info.encryption)\n    }\n  }\n\n  toString() {\n    const result = super.toString()\n    const endpoint = this.info.endpoint\n    if (endpoint != null) {\n      return result.substring(0, result.length - 1) + `, endpoint: ${endpoint})`\n    }\n    return result\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _BaseS3Publisher() {
  const data = require("./BaseS3Publisher");

  _BaseS3Publisher = function () {
    return data;
  };

  return data;
}

class SpacesPublisher extends _BaseS3Publisher().BaseS3Publisher {
  constructor(context, info) {
    super(context, info);
    this.info = info;
    this.providerName = "Spaces";
  }

  static checkAndResolveOptions(options, channelFromAppVersion, errorIfCannot) {
    return (0, _bluebirdLst().coroutine)(function* () {
      if (options.name == null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Please specify "name" for "spaces" publish provider (see https://www.electron.build/configuration/publish#spacesoptions)`);
      }

      if (options.region == null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Please specify "region" for "spaces" publish provider (see https://www.electron.build/configuration/publish#spacesoptions)`);
      }

      if (options.channel == null && channelFromAppVersion != null) {
        options.channel = channelFromAppVersion;
      }
    })();
  }

  getBucketName() {
    return this.info.name;
  }

  configureS3Options(args) {
    super.configureS3Options(args);
    args.push("--endpoint", `${this.info.region}.digitaloceanspaces.com`);
    args.push("--region", this.info.region);
    const accessKey = process.env.DO_KEY_ID;
    const secretKey = process.env.DO_SECRET_KEY;

    if ((0, _builderUtil().isEmptyOrSpaces)(accessKey)) {
      throw new (_builderUtil().InvalidConfigurationError)("Please set env DO_KEY_ID (see https://www.electron.build/configuration/publish#spacesoptions)");
    }

    if ((0, _builderUtil().isEmptyOrSpaces)(secretKey)) {
      throw new (_builderUtil().InvalidConfigurationError)("Please set env DO_SECRET_KEY (see https://www.electron.build/configuration/publish#spacesoptions)");
    }

    args.push("--accessKey", accessKey);
    args.push("--secretKey", secretKey);
  }

} exports.default = SpacesPublisher;
// __ts-babel@6.0.4
//# sourceMappingURL=spacesPublisher.js.map{"version":3,"sources":["../../src/s3/spacesPublisher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEc,MAAO,eAAP,SAA+B,kCAA/B,CAA8C;AAG1D,EAAA,WAAA,CAAY,OAAZ,EAAsD,IAAtD,EAAyE;AACvE,UAAM,OAAN,EAAe,IAAf;AADoD,SAAA,IAAA,GAAA,IAAA;AAF7C,SAAA,YAAA,GAAe,QAAf;AAIR;;AAED,SAAa,sBAAb,CAAoC,OAApC,EAA4D,qBAA5D,EAAkG,aAAlG,EAAwH;AAAA;AACtH,UAAI,OAAO,CAAC,IAAR,IAAgB,IAApB,EAA0B;AACxB,cAAM,KAAI,wCAAJ,EAA8B,0HAA9B,CAAN;AACD;;AACD,UAAI,OAAO,CAAC,MAAR,IAAkB,IAAtB,EAA4B;AAC1B,cAAM,KAAI,wCAAJ,EAA8B,4HAA9B,CAAN;AACD;;AAED,UAAI,OAAO,CAAC,OAAR,IAAmB,IAAnB,IAA2B,qBAAqB,IAAI,IAAxD,EAA8D;AAC5D,QAAA,OAAO,CAAC,OAAR,GAAkB,qBAAlB;AACD;AAVqH;AAWvH;;AAES,EAAA,aAAa,GAAA;AACrB,WAAO,KAAK,IAAL,CAAU,IAAjB;AACD;;AAES,EAAA,kBAAkB,CAAC,IAAD,EAAoB;AAC9C,UAAM,kBAAN,CAAyB,IAAzB;AAEA,IAAA,IAAI,CAAC,IAAL,CAAU,YAAV,EAAwB,GAAG,KAAK,IAAL,CAAU,MAAM,yBAA3C;AACA,IAAA,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,KAAK,IAAL,CAAU,MAAhC;AAEA,UAAM,SAAS,GAAG,OAAO,CAAC,GAAR,CAAY,SAA9B;AACA,UAAM,SAAS,GAAG,OAAO,CAAC,GAAR,CAAY,aAA9B;;AACA,QAAI,oCAAgB,SAAhB,CAAJ,EAAgC;AAC9B,YAAM,KAAI,wCAAJ,EAA8B,+FAA9B,CAAN;AACD;;AACD,QAAI,oCAAgB,SAAhB,CAAJ,EAAgC;AAC9B,YAAM,KAAI,wCAAJ,EAA8B,mGAA9B,CAAN;AACD;;AACD,IAAA,IAAI,CAAC,IAAL,CAAU,aAAV,EAAyB,SAAzB;AACA,IAAA,IAAI,CAAC,IAAL,CAAU,aAAV,EAAyB,SAAzB;AACD;;AAxCyD,C","sourcesContent":["import { InvalidConfigurationError, isEmptyOrSpaces } from \"builder-util\"\nimport { SpacesOptions } from \"builder-util-runtime\"\nimport { PublishContext } from \"../publisher\"\nimport { BaseS3Publisher } from \"./BaseS3Publisher\"\n\nexport default class SpacesPublisher extends BaseS3Publisher {\n  readonly providerName = \"Spaces\"\n\n  constructor(context: PublishContext, private readonly info: SpacesOptions) {\n    super(context, info)\n  }\n\n  static async checkAndResolveOptions(options: SpacesOptions, channelFromAppVersion: string | null, errorIfCannot: boolean) {\n    if (options.name == null) {\n      throw new InvalidConfigurationError(`Please specify \"name\" for \"spaces\" publish provider (see https://www.electron.build/configuration/publish#spacesoptions)`)\n    }\n    if (options.region == null) {\n      throw new InvalidConfigurationError(`Please specify \"region\" for \"spaces\" publish provider (see https://www.electron.build/configuration/publish#spacesoptions)`)\n    }\n\n    if (options.channel == null && channelFromAppVersion != null) {\n      options.channel = channelFromAppVersion\n    }\n  }\n\n  protected getBucketName(): string {\n    return this.info.name\n  }\n\n  protected configureS3Options(args: Array<string>): void {\n    super.configureS3Options(args)\n\n    args.push(\"--endpoint\", `${this.info.region}.digitaloceanspaces.com`)\n    args.push(\"--region\", this.info.region)\n\n    const accessKey = process.env.DO_KEY_ID\n    const secretKey = process.env.DO_SECRET_KEY\n    if (isEmptyOrSpaces(accessKey)) {\n      throw new InvalidConfigurationError(\"Please set env DO_KEY_ID (see https://www.electron.build/configuration/publish#spacesoptions)\")\n    }\n    if (isEmptyOrSpaces(secretKey)) {\n      throw new InvalidConfigurationError(\"Please set env DO_SECRET_KEY (see https://www.electron.build/configuration/publish#spacesoptions)\")\n    }\n    args.push(\"--accessKey\", accessKey)\n    args.push(\"--secretKey\", secretKey)\n  }\n}"],"sourceRoot":""}
elementtree v0.1.6 - 2014-02-06

* Add support for CData elements. (#14)
  [hermannpencole]

elementtree v0.1.5 - 2012-11-14

* Fix a bug in the find() and findtext() method which could manifest itself
  under some conditions.
  [metagriffin]

elementtree v0.1.4 - 2012-10-15

* Allow user to use namespaced attributes when using find* functions.
  [Andrew Lunny]

elementtree v0.1.3 - 2012-09-21

* Improve the output of text content in the tags (strip unnecessary line break
  characters).

[Darryl Pogue]

elementtree v0.1.2 - 2012-09-04

 * Allow user to pass 'indent' option to ElementTree.write method. If this
   option is specified (e.g. {'indent': 4}). XML will be pretty printed.
   [Darryl Pogue, Tomaz Muraus]

 * Bump sax dependency version.

elementtree v0.1.1 - 2011-09-23

 * Improve special character escaping.
   [Ryan Phillips]

elementtree v0.1.0 - 2011-09-05

 * Initial release.

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

TESTS := \
	tests/test-simple.js



PATH := ./node_modules/.bin:$(PATH)

WHISKEY := $(shell bash -c 'PATH=$(PATH) type -p whiskey')

default: test

test:
	NODE_PATH=`pwd`/lib/ ${WHISKEY} --scope-leaks --sequential --real-time --tests "${TESTS}"

tap:
	NODE_PATH=`pwd`/lib/ ${WHISKEY} --test-reporter tap --sequential --real-time --tests "${TESTS}"

coverage:
	NODE_PATH=`pwd`/lib/ ${WHISKEY} --sequential --coverage  --coverage-reporter html --coverage-dir coverage_html --tests "${TESTS}"

.PHONY: default test coverage tap scope
node-elementtree
Copyright (c) 2011, Rackspace, Inc.

The ElementTree toolkit is Copyright (c) 1999-2007 by Fredrik Lundh

{
  "author": {
    "name": "Rackspace US, Inc."
  },
  "dependencies": {
    "sax": "1.1.4"
  },
  "deprecated": false,
  "description": "XML Serialization and Parsing module based on Python's ElementTree.",
  "devDependencies": {
    "whiskey": "0.8.x"
  },
  "directories": {
    "lib": "lib"
  },
  "engines": {
    "node": ">= 0.4.0"
  },
  "homepage": "https://github.com/racker/node-elementtree",
  "license": "Apache-2.0",
  "main": "lib/elementtree.js",
  "name": "elementtree",
  "repository": {
    "type": "git",
    "url": "git://github.com/racker/node-elementtree.git"
  },
  "version": "0.1.7"
}/*
 *  Copyright 2011 Rackspace
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

var DEFAULT_PARSER = 'sax';

exports.DEFAULT_PARSER = DEFAULT_PARSER;
/**
 *  Copyright 2011 Rackspace
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

var sprintf = require('./sprintf').sprintf;

var utils = require('./utils');
var SyntaxError = require('./errors').SyntaxError;

var _cache = {};

var RE = new RegExp(
  "(" +
  "'[^']*'|\"[^\"]*\"|" +
  "::|" +
  "//?|" +
  "\\.\\.|" +
  "\\(\\)|" +
  "[/.*:\\[\\]\\(\\)@=])|" +
  "((?:\\{[^}]+\\})?[^/\\[\\]\\(\\)@=\\s]+)|" +
  "\\s+", 'g'
);

var xpath_tokenizer = utils.findall.bind(null, RE);

function prepare_tag(next, token) {
  var tag = token[0];

  function select(context, result) {
    var i, len, elem, rv = [];

    for (i = 0, len = result.length; i < len; i++) {
      elem = result[i];
      elem._children.forEach(function(e) {
        if (e.tag === tag) {
          rv.push(e);
        }
      });
    }

    return rv;
  }

  return select;
}

function prepare_star(next, token) {
  function select(context, result) {
    var i, len, elem, rv = [];

    for (i = 0, len = result.length; i < len; i++) {
      elem = result[i];
      elem._children.forEach(function(e) {
        rv.push(e);
      });
    }

    return rv;
  }

  return select;
}

function prepare_dot(next, token) {
  function select(context, result) {
    var i, len, elem, rv = [];

    for (i = 0, len = result.length; i < len; i++) {
      elem = result[i];
      rv.push(elem);
    }

    return rv;
  }

  return select;
}

function prepare_iter(next, token) {
  var tag;
  token = next();

  if (token[1] === '*') {
    tag = '*';
  }
  else if (!token[1]) {
    tag = token[0] || '';
  }
  else {
    throw new SyntaxError(token);
  }

  function select(context, result) {
    var i, len, elem, rv = [];

    for (i = 0, len = result.length; i < len; i++) {
      elem = result[i];
      elem.iter(tag, function(e) {
        if (e !== elem) {
          rv.push(e);
        }
      });
    }

    return rv;
  }

  return select;
}

function prepare_dot_dot(next, token) {
  function select(context, result) {
    var i, len, elem, rv = [], parent_map = context.parent_map;

    if (!parent_map) {
      context.parent_map = parent_map = {};

      context.root.iter(null, function(p) {
        p._children.forEach(function(e) {
          parent_map[e] = p;
        });
      });
    }

    for (i = 0, len = result.length; i < len; i++) {
      elem = result[i];

      if (parent_map.hasOwnProperty(elem)) {
        rv.push(parent_map[elem]);
      }
    }

    return rv;
  }

  return select;
}


function prepare_predicate(next, token) {
  var tag, key, value, select;
  token = next();

  if (token[1] === '@') {
    // attribute
    token = next();

    if (token[1]) {
      throw new SyntaxError(token, 'Invalid attribute predicate');
    }

    key = token[0];
    token = next();

    if (token[1] === ']') {
      select = function(context, result) {
        var i, len, elem, rv = [];

        for (i = 0, len = result.length; i < len; i++) {
          elem = result[i];

          if (elem.get(key)) {
            rv.push(elem);
          }
        }

        return rv;
      };
    }
    else if (token[1] === '=') {
      value = next()[1];

      if (value[0] === '"' || value[value.length - 1] === '\'') {
        value = value.slice(1, value.length - 1);
      }
      else {
        throw new SyntaxError(token, 'Ivalid comparison target');
      }

      token = next();
      select = function(context, result) {
        var i, len, elem, rv = [];

        for (i = 0, len = result.length; i < len; i++) {
          elem = result[i];

          if (elem.get(key) === value) {
            rv.push(elem);
          }
        }

        return rv;
      };
    }

    if (token[1] !== ']') {
      throw new SyntaxError(token, 'Invalid attribute predicate');
    }
  }
  else if (!token[1]) {
    tag = token[0] || '';
    token = next();

    if (token[1] !== ']') {
      throw new SyntaxError(token, 'Invalid node predicate');
    }

    select = function(context, result) {
      var i, len, elem, rv = [];

      for (i = 0, len = result.length; i < len; i++) {
        elem = result[i];

        if (elem.find(tag)) {
          rv.push(elem);
        }
      }

      return rv;
    };
  }
  else {
    throw new SyntaxError(null, 'Invalid predicate');
  }

  return select;
}



var ops = {
  "": prepare_tag,
  "*": prepare_star,
  ".": prepare_dot,
  "..": prepare_dot_dot,
  "//": prepare_iter,
  "[": prepare_predicate,
};

function _SelectorContext(root) {
  this.parent_map = null;
  this.root = root;
}

function findall(elem, path) {
  var selector, result, i, len, token, value, select, context;

  if (_cache.hasOwnProperty(path)) {
    selector = _cache[path];
  }
  else {
    // TODO: Use smarter cache purging approach
    if (Object.keys(_cache).length > 100) {
      _cache = {};
    }

    if (path.charAt(0) === '/') {
      throw new SyntaxError(null, 'Cannot use absolute path on element');
    }

    result = xpath_tokenizer(path);
    selector = [];

    function getToken() {
      return result.shift();
    }

    token = getToken();
    while (true) {
      var c = token[1] || '';
      value = ops[c](getToken, token);

      if (!value) {
        throw new SyntaxError(null, sprintf('Invalid path: %s', path));
      }

      selector.push(value);
      token = getToken();

      if (!token) {
        break;
      }
      else if (token[1] === '/') {
        token = getToken();
      }

      if (!token) {
        break;
      }
    }

    _cache[path] = selector;
  }

  // Execute slector pattern
  result = [elem];
  context = new _SelectorContext(elem);

  for (i = 0, len = selector.length; i < len; i++) {
    select = selector[i];
    result = select(context, result);
  }

  return result || [];
}

function find(element, path) {
  var resultElements = findall(element, path);

  if (resultElements && resultElements.length > 0) {
    return resultElements[0];
  }

  return null;
}

function findtext(element, path, defvalue) {
  var resultElements = findall(element, path);

  if (resultElements && resultElements.length > 0) {
    return resultElements[0].text;
  }

  return defvalue;
}


exports.find = find;
exports.findall = findall;
exports.findtext = findtext;
/**
 *  Copyright 2011 Rackspace
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

var sprintf = require('./sprintf').sprintf;

var utils = require('./utils');
var ElementPath = require('./elementpath');
var TreeBuilder = require('./treebuilder').TreeBuilder;
var get_parser = require('./parser').get_parser;
var constants = require('./constants');

var element_ids = 0;

function Element(tag, attrib)
{
  this._id = element_ids++;
  this.tag = tag;
  this.attrib = {};
  this.text = null;
  this.tail = null;
  this._children = [];

  if (attrib) {
    this.attrib = utils.merge(this.attrib, attrib);
  }
}

Element.prototype.toString = function()
{
  return sprintf("<Element %s at %s>", this.tag, this._id);
};

Element.prototype.makeelement = function(tag, attrib)
{
  return new Element(tag, attrib);
};

Element.prototype.len = function()
{
  return this._children.length;
};

Element.prototype.getItem = function(index)
{
  return this._children[index];
};

Element.prototype.setItem = function(index, element)
{
  this._children[index] = element;
};

Element.prototype.delItem = function(index)
{
  this._children.splice(index, 1);
};

Element.prototype.getSlice = function(start, stop)
{
  return this._children.slice(start, stop);
};

Element.prototype.setSlice = function(start, stop, elements)
{
  var i;
  var k = 0;
  for (i = start; i < stop; i++, k++) {
    this._children[i] = elements[k];
  }
};

Element.prototype.delSlice = function(start, stop)
{
  this._children.splice(start, stop - start);
};

Element.prototype.append = function(element)
{
  this._children.push(element);
};

Element.prototype.extend = function(elements)
{
  this._children.concat(elements);
};

Element.prototype.insert = function(index, element)
{
  this._children[index] = element;
};

Element.prototype.remove = function(element)
{
  this._children = this._children.filter(function(e) {
    /* TODO: is this the right way to do this? */
    if (e._id === element._id) {
      return false;
    }
    return true;
  });
};

Element.prototype.getchildren = function() {
  return this._children;
};

Element.prototype.find = function(path)
{
  return ElementPath.find(this, path);
};

Element.prototype.findtext = function(path, defvalue)
{
  return ElementPath.findtext(this, path, defvalue);
};

Element.prototype.findall = function(path, defvalue)
{
  return ElementPath.findall(this, path, defvalue);
};

Element.prototype.clear = function()
{
  this.attrib = {};
  this._children = [];
  this.text = null;
  this.tail = null;
};

Element.prototype.get = function(key, defvalue)
{
  if (this.attrib[key] !== undefined) {
    return this.attrib[key];
  }
  else {
    return defvalue;
  }
};

Element.prototype.set = function(key, value)
{
  this.attrib[key] = value;
};

Element.prototype.keys = function()
{
  return Object.keys(this.attrib);
};

Element.prototype.items = function()
{
  return utils.items(this.attrib);
};

/*
 * In python this uses a generator, but in v8 we don't have em,
 * so we use a callback instead.
 **/
Element.prototype.iter = function(tag, callback)
{
  var self = this;
  var i, child;

  if (tag === "*") {
    tag = null;
  }

  if (tag === null || this.tag === tag) {
    callback(self);
  }

  for (i = 0; i < this._children.length; i++) {
    child = this._children[i];
    child.iter(tag, function(e) {
      callback(e);
    });
  }
};

Element.prototype.itertext = function(callback)
{
  this.iter(null, function(e) {
    if (e.text) {
      callback(e.text);
    }

    if (e.tail) {
      callback(e.tail);
    }
  });
};


function SubElement(parent, tag, attrib) {
  var element = parent.makeelement(tag, attrib);
  parent.append(element);
  return element;
}

function Comment(text) {
  var element = new Element(Comment);
  if (text) {
    element.text = text;
  }
  return element;
}

function CData(text) {
  var element = new Element(CData);
  if (text) {
    element.text = text;
  }
  return element;
}

function ProcessingInstruction(target, text)
{
  var element = new Element(ProcessingInstruction);
  element.text = target;
  if (text) {
    element.text = element.text + " " + text;
  }
  return element;
}

function QName(text_or_uri, tag)
{
  if (tag) {
    text_or_uri = sprintf("{%s}%s", text_or_uri, tag);
  }
  this.text = text_or_uri;
}

QName.prototype.toString = function() {
  return this.text;
};

function ElementTree(element)
{
  this._root = element;
}

ElementTree.prototype.getroot = function() {
  return this._root;
};

ElementTree.prototype._setroot = function(element) {
  this._root = element;
};

ElementTree.prototype.parse = function(source, parser) {
  if (!parser) {
    parser = get_parser(constants.DEFAULT_PARSER);
    parser = new parser.XMLParser(new TreeBuilder());
  }

  parser.feed(source);
  this._root = parser.close();
  return this._root;
};

ElementTree.prototype.iter = function(tag, callback) {
  this._root.iter(tag, callback);
};

ElementTree.prototype.find = function(path) {
  return this._root.find(path);
};

ElementTree.prototype.findtext = function(path, defvalue) {
  return this._root.findtext(path, defvalue);
};

ElementTree.prototype.findall = function(path) {
  return this._root.findall(path);
};

/**
 * Unlike ElementTree, we don't write to a file, we return you a string.
 */
ElementTree.prototype.write = function(options) {
  var sb = [];
  options = utils.merge({
    encoding: 'utf-8',
    xml_declaration: null,
    default_namespace: null,
    method: 'xml'}, options);

  if (options.xml_declaration !== false) {
    sb.push("<?xml version='1.0' encoding='"+options.encoding +"'?>\n");
  }

  if (options.method === "text") {
    _serialize_text(sb, self._root, encoding);
  }
  else {
    var qnames, namespaces, indent, indent_string;
    var x = _namespaces(this._root, options.encoding, options.default_namespace);
    qnames = x[0];
    namespaces = x[1];

    if (options.hasOwnProperty('indent')) {
      indent = 0;
      indent_string = new Array(options.indent + 1).join(' ');
    }
    else {
      indent = false;
    }

    if (options.method === "xml") {
      _serialize_xml(function(data) {
        sb.push(data);
      }, this._root, options.encoding, qnames, namespaces, indent, indent_string);
    }
    else {
      /* TODO: html */
      throw new Error("unknown serialization method "+ options.method);
    }
  }

  return sb.join("");
};

var _namespace_map = {
    /* "well-known" namespace prefixes */
    "http://www.w3.org/XML/1998/namespace": "xml",
    "http://www.w3.org/1999/xhtml": "html",
    "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf",
    "http://schemas.xmlsoap.org/wsdl/": "wsdl",
    /* xml schema */
    "http://www.w3.org/2001/XMLSchema": "xs",
    "http://www.w3.org/2001/XMLSchema-instance": "xsi",
    /* dublic core */
    "http://purl.org/dc/elements/1.1/": "dc",
};

function register_namespace(prefix, uri) {
  if (/ns\d+$/.test(prefix)) {
    throw new Error('Prefix format reserved for internal use');
  }

  if (_namespace_map.hasOwnProperty(uri) && _namespace_map[uri] === prefix) {
    delete _namespace_map[uri];
  }

  _namespace_map[uri] = prefix;
}


function _escape(text, encoding, isAttribute, isText) {
  if (text) {
    text = text.toString();
    text = text.replace(/&/g, '&amp;');
    text = text.replace(/</g, '&lt;');
    text = text.replace(/>/g, '&gt;');
    if (!isText) {
        text = text.replace(/\n/g, '&#xA;');
        text = text.replace(/\r/g, '&#xD;');
    }
    if (isAttribute) {
      text = text.replace(/"/g, '&quot;');
    }
  }
  return text;
}

/* TODO: benchmark single regex */
function _escape_attrib(text, encoding) {
  return _escape(text, encoding, true);
}

function _escape_cdata(text, encoding) {
  return _escape(text, encoding, false);
}

function _escape_text(text, encoding) {
  return _escape(text, encoding, false, true);
}

function _namespaces(elem, encoding, default_namespace) {
  var qnames = {};
  var namespaces = {};

  if (default_namespace) {
    namespaces[default_namespace] = "";
  }

  function encode(text) {
    return text;
  }

  function add_qname(qname) {
    if (qname[0] === "{") {
      var tmp = qname.substring(1).split("}", 2);
      var uri = tmp[0];
      var tag = tmp[1];
      var prefix = namespaces[uri];

      if (prefix === undefined) {
        prefix = _namespace_map[uri];
        if (prefix === undefined) {
          prefix = "ns" + Object.keys(namespaces).length;
        }
        if (prefix !== "xml") {
          namespaces[uri] = prefix;
        }
      }

      if (prefix) {
        qnames[qname] = sprintf("%s:%s", prefix, tag);
      }
      else {
        qnames[qname] = tag;
      }
    }
    else {
      if (default_namespace) {
        throw new Error('cannot use non-qualified names with default_namespace option');
      }

      qnames[qname] = qname;
    }
  }


  elem.iter(null, function(e) {
    var i;
    var tag = e.tag;
    var text = e.text;
    var items = e.items();

    if (tag instanceof QName && qnames[tag.text] === undefined) {
      add_qname(tag.text);
    }
    else if (typeof(tag) === "string") {
      add_qname(tag);
    }
    else if (tag !== null && tag !== Comment && tag !== CData && tag !== ProcessingInstruction) {
      throw new Error('Invalid tag type for serialization: '+ tag);
    }

    if (text instanceof QName && qnames[text.text] === undefined) {
      add_qname(text.text);
    }

    items.forEach(function(item) {
      var key = item[0],
          value = item[1];
      if (key instanceof QName) {
        key = key.text;
      }

      if (qnames[key] === undefined) {
        add_qname(key);
      }

      if (value instanceof QName && qnames[value.text] === undefined) {
        add_qname(value.text);
      }
    });
  });
  return [qnames, namespaces];
}

function _serialize_xml(write, elem, encoding, qnames, namespaces, indent, indent_string) {
  var tag = elem.tag;
  var text = elem.text;
  var items;
  var i;

  var newlines = indent || (indent === 0);
  write(Array(indent + 1).join(indent_string));

  if (tag === Comment) {
    write(sprintf("<!--%s-->", _escape_cdata(text, encoding)));
  }
  else if (tag === ProcessingInstruction) {
    write(sprintf("<?%s?>", _escape_cdata(text, encoding)));
  }
  else if (tag === CData) {
    text = text || '';
    write(sprintf("<![CDATA[%s]]>", text));
  }
  else {
    tag = qnames[tag];
    if (tag === undefined) {
      if (text) {
        write(_escape_text(text, encoding));
      }
      elem.iter(function(e) {
        _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string);
      });
    }
    else {
      write("<" + tag);
      items = elem.items();

      if (items || namespaces) {
        items.sort(); // lexical order

        items.forEach(function(item) {
          var k = item[0],
              v = item[1];

            if (k instanceof QName) {
              k = k.text;
            }

            if (v instanceof QName) {
              v = qnames[v.text];
            }
            else {
              v = _escape_attrib(v, encoding);
            }
            write(sprintf(" %s=\"%s\"", qnames[k], v));
        });

        if (namespaces) {
          items = utils.items(namespaces);
          items.sort(function(a, b) { return a[1] < b[1]; });

          items.forEach(function(item) {
            var k = item[1],
                v = item[0];

            if (k) {
              k = ':' + k;
            }

            write(sprintf(" xmlns%s=\"%s\"", k, _escape_attrib(v, encoding)));
          });
        }
      }

      if (text || elem.len()) {
        if (text && text.toString().match(/^\s*$/)) {
            text = null;
        }

        write(">");
        if (!text && newlines) {
          write("\n");
        }

        if (text) {
          write(_escape_text(text, encoding));
        }
        elem._children.forEach(function(e) {
          _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string);
        });

        if (!text && indent) {
          write(Array(indent + 1).join(indent_string));
        }
        write("</" + tag + ">");
      }
      else {
        write(" />");
      }
    }
  }

  if (newlines) {
    write("\n");
  }
}

function parse(source, parser) {
  var tree = new ElementTree();
  tree.parse(source, parser);
  return tree;
}

function tostring(element, options) {
  return new ElementTree(element).write(options);
}

exports.PI = ProcessingInstruction;
exports.Comment = Comment;
exports.CData = CData;
exports.ProcessingInstruction = ProcessingInstruction;
exports.SubElement = SubElement;
exports.QName = QName;
exports.ElementTree = ElementTree;
exports.ElementPath = ElementPath;
exports.Element = function(tag, attrib) {
  return new Element(tag, attrib);
};

exports.XML = function(data) {
  var et = new ElementTree();
  return et.parse(data);
};

exports.parse = parse;
exports.register_namespace = register_namespace;
exports.tostring = tostring;
/**
 *  Copyright 2011 Rackspace
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

var util = require('util');

var sprintf = require('./sprintf').sprintf;

function SyntaxError(token, msg) {
  msg = msg || sprintf('Syntax Error at token %s', token.toString());
  this.token = token;
  this.message = msg;
  Error.call(this, msg);
}

util.inherits(SyntaxError, Error);

exports.SyntaxError = SyntaxError;
/*
 *  Copyright 2011 Rackspace
 *
 *  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.
 *
 */

/* TODO: support node-expat C++ module optionally */

var util = require('util');
var parsers = require('./parsers/index');

function get_parser(name) {
  if (name === 'sax') {
    return parsers.sax;
  }
  else {
    throw new Error('Invalid parser: ' + name);
  }
}


exports.get_parser = get_parser;
/*
 *  Copyright 2011 Rackspace
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

var cache = {};


// Do any others need escaping?
var TO_ESCAPE = {
  '\'': '\\\'',
  '\n': '\\n'
};


function populate(formatter) {
  var i, type,
      key = formatter,
      prev = 0,
      arg = 1,
      builder = 'return \'';

  for (i = 0; i < formatter.length; i++) {
    if (formatter[i] === '%') {
      type = formatter[i + 1];

      switch (type) {
        case 's':
          builder += formatter.slice(prev, i) + '\' + arguments[' + arg + '] + \'';
          prev = i + 2;
          arg++;
          break;
        case 'j':
          builder += formatter.slice(prev, i) + '\' + JSON.stringify(arguments[' + arg + ']) + \'';
          prev = i + 2;
          arg++;
          break;
        case '%':
          builder += formatter.slice(prev, i + 1);
          prev = i + 2;
          i++;
          break;
      }


    } else if (TO_ESCAPE[formatter[i]]) {
      builder += formatter.slice(prev, i) + TO_ESCAPE[formatter[i]];
      prev = i + 1;
    }
  }

  builder += formatter.slice(prev) + '\';';
  cache[key] = new Function(builder);
}


/**
 * A fast version of sprintf(), which currently only supports the %s and %j.
 * This caches a formatting function for each format string that is used, so
 * you should only use this sprintf() will be called many times with a single
 * format string and a limited number of format strings will ever be used (in
 * general this means that format strings should be string literals).
 *
 * @param {String} formatter A format string.
 * @param {...String} var_args Values that will be formatted by %s and %j.
 * @return {String} The formatted output.
 */
exports.sprintf = function(formatter, var_args) {
  if (!cache[formatter]) {
    populate(formatter);
  }

  return cache[formatter].apply(null, arguments);
};
function TreeBuilder(element_factory) {
  this._data = [];
  this._elem = [];
  this._last = null;
  this._tail = null;
  if (!element_factory) {
    /* evil circular dep */
    element_factory = require('./elementtree').Element;
  }
  this._factory = element_factory;
}

TreeBuilder.prototype.close = function() {
  return this._last;
};

TreeBuilder.prototype._flush = function() {
  if (this._data) {
    if (this._last !== null) {
      var text = this._data.join("");
      if (this._tail) {
        this._last.tail = text;
      }
      else {
        this._last.text = text;
      }
    }
    this._data = [];
  }
};

TreeBuilder.prototype.data = function(data) {
  this._data.push(data);
};

TreeBuilder.prototype.start = function(tag, attrs) {
  this._flush();
  var elem = this._factory(tag, attrs);
  this._last = elem;

  if (this._elem.length) {
    this._elem[this._elem.length - 1].append(elem);
  }

  this._elem.push(elem);

  this._tail = null;
};

TreeBuilder.prototype.end = function(tag) {
  this._flush();
  this._last = this._elem.pop();
  if (this._last.tag !== tag) {
    throw new Error("end tag mismatch");
  }
  this._tail = 1;
  return this._last;
};

exports.TreeBuilder = TreeBuilder;
/**
 *  Copyright 2011 Rackspace
 *
 *  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.
 *
 */

/**
 * @param {Object} hash.
 * @param {Array} ignored.
 */
function items(hash, ignored) {
  ignored = ignored || null;
  var k, rv = [];

  function is_ignored(key) {
    if (!ignored || ignored.length === 0) {
      return false;
    }

    return ignored.indexOf(key);
  }

  for (k in hash) {
    if (hash.hasOwnProperty(k) && !(is_ignored(ignored))) {
      rv.push([k, hash[k]]);
    }
  }

  return rv;
}


function findall(re, str) {
  var match, matches = [];

  while ((match = re.exec(str))) {
      matches.push(match);
  }

  return matches;
}

function merge(a, b) {
  var c = {}, attrname;

  for (attrname in a) {
    if (a.hasOwnProperty(attrname)) {
      c[attrname] = a[attrname];
    }
  }
  for (attrname in b) {
    if (b.hasOwnProperty(attrname)) {
      c[attrname] = b[attrname];
    }
  }
  return c;
}

exports.items = items;
exports.findall = findall;
exports.merge = merge;
exports.sax = require('./sax');
var util = require('util');

var sax = require('sax');

var TreeBuilder = require('./../treebuilder').TreeBuilder;

function XMLParser(target) {
  this.parser = sax.parser(true);

  this.target = (target) ? target : new TreeBuilder();

  this.parser.onopentag = this._handleOpenTag.bind(this);
  this.parser.ontext = this._handleText.bind(this);
  this.parser.oncdata = this._handleCdata.bind(this);
  this.parser.ondoctype = this._handleDoctype.bind(this);
  this.parser.oncomment = this._handleComment.bind(this);
  this.parser.onclosetag = this._handleCloseTag.bind(this);
  this.parser.onerror = this._handleError.bind(this);
}

XMLParser.prototype._handleOpenTag = function(tag) {
  this.target.start(tag.name, tag.attributes);
};

XMLParser.prototype._handleText = function(text) {
  this.target.data(text);
};

XMLParser.prototype._handleCdata = function(text) {
  this.target.data(text);
};

XMLParser.prototype._handleDoctype = function(text) {
};

XMLParser.prototype._handleComment = function(comment) {
};

XMLParser.prototype._handleCloseTag = function(tag) {
  this.target.end(tag);
};

XMLParser.prototype._handleError = function(err) {
  throw err;
};

XMLParser.prototype.feed = function(chunk) {
  this.parser.write(chunk);
};

XMLParser.prototype.close = function() {
  this.parser.close();
  return this.target.close();
};

exports.XMLParser = XMLParser;
Copyright Mathias Bynens <https://mathiasbynens.be/>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
"use strict";

module.exports = function () {
  // https://mths.be/emoji
  return /\uD83C\uDFF4(?:\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74)\uDB40\uDC7F|\u200D\u2620\uFE0F)|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC68(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3]))|\uD83D\uDC69\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\uD83D\uDC68(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83D\uDC69\u200D[\u2695\u2696\u2708])\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC68(?:\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDD1-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDEEB\uDEEC\uDEF4-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC69\uDC6E\uDC70-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD26\uDD30-\uDD39\uDD3D\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDD1-\uDDDD])/g;
};
{
  "author": {
    "name": "Mathias Bynens",
    "url": "https://mathiasbynens.be/"
  },
  "deprecated": false,
  "description": "A regular expression to match all Emoji-only symbols as per the Unicode Standard.",
  "devDependencies": {
    "@babel/cli": "^7.0.0",
    "@babel/core": "^7.0.0",
    "@babel/plugin-proposal-unicode-property-regex": "^7.0.0",
    "@babel/preset-env": "^7.0.0",
    "mocha": "^5.2.0",
    "regexgen": "^1.3.0",
    "unicode-11.0.0": "^0.7.7",
    "unicode-tr51": "^9.0.1"
  },
  "files": [
    "LICENSE-MIT.txt",
    "index.js",
    "index.d.ts",
    "text.js",
    "es2015/index.js",
    "es2015/text.js"
  ],
  "homepage": "https://mths.be/emoji-regex",
  "license": "MIT",
  "main": "index.js",
  "name": "emoji-regex",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/mathiasbynens/emoji-regex.git"
  },
  "types": "index.d.ts",
  "version": "7.0.3"
}"use strict";

module.exports = function () {
  // https://mths.be/emoji
  return /\uD83C\uDFF4(?:\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74)\uDB40\uDC7F|\u200D\u2620\uFE0F)|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC68(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3]))|\uD83D\uDC69\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\uD83D\uDC68(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83D\uDC69\u200D[\u2695\u2696\u2708])\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC68(?:\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDD1-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDEEB\uDEEC\uDEF4-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])\uFE0F?|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC69\uDC6E\uDC70-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD26\uDD30-\uDD39\uDD3D\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDD1-\uDDDD])/g;
};
"use strict";

module.exports = () => {
  // https://mths.be/emoji
  return /\u{1F3F4}(?:\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074})\u{E007F}|\u200D\u2620\uFE0F)|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F468}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u{1F468}(?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F469}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F468}(?:\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|[\u{1F3FB}-\u{1F3FF}])|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u{1F469}\u200D\u{1F466}|\u{1F1F6}\u{1F1E6}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9D1}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]\uFE0F|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F469}\u{1F46E}\u{1F470}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9D1}-\u{1F9DD}]/gu;
};
"use strict";

module.exports = () => {
  // https://mths.be/emoji
  return /\u{1F3F4}(?:\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074})\u{E007F}|\u200D\u2620\uFE0F)|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F468}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u{1F468}(?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F469}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F468}(?:\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|[\u{1F3FB}-\u{1F3FF}])|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u{1F469}\u200D\u{1F466}|\u{1F1F6}\u{1F1E6}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9D1}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]\uFE0F?|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F469}\u{1F46E}\u{1F470}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9D1}-\u{1F9DD}]/gu;
};
The MIT License (MIT)

Copyright (c) 2014 Mathias Buus

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.var once = require('once');

var noop = function() {};

var isRequest = function(stream) {
	return stream.setHeader && typeof stream.abort === 'function';
};

var isChildProcess = function(stream) {
	return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3
};

var eos = function(stream, opts, callback) {
	if (typeof opts === 'function') return eos(stream, null, opts);
	if (!opts) opts = {};

	callback = once(callback || noop);

	var ws = stream._writableState;
	var rs = stream._readableState;
	var readable = opts.readable || (opts.readable !== false && stream.readable);
	var writable = opts.writable || (opts.writable !== false && stream.writable);
	var cancelled = false;

	var onlegacyfinish = function() {
		if (!stream.writable) onfinish();
	};

	var onfinish = function() {
		writable = false;
		if (!readable) callback.call(stream);
	};

	var onend = function() {
		readable = false;
		if (!writable) callback.call(stream);
	};

	var onexit = function(exitCode) {
		callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);
	};

	var onerror = function(err) {
		callback.call(stream, err);
	};

	var onclose = function() {
		process.nextTick(onclosenexttick);
	};

	var onclosenexttick = function() {
		if (cancelled) return;
		if (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close'));
		if (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close'));
	};

	var onrequest = function() {
		stream.req.on('finish', onfinish);
	};

	if (isRequest(stream)) {
		stream.on('complete', onfinish);
		stream.on('abort', onclose);
		if (stream.req) onrequest();
		else stream.on('request', onrequest);
	} else if (writable && !ws) { // legacy streams
		stream.on('end', onlegacyfinish);
		stream.on('close', onlegacyfinish);
	}

	if (isChildProcess(stream)) stream.on('exit', onexit);

	stream.on('end', onend);
	stream.on('finish', onfinish);
	if (opts.error !== false) stream.on('error', onerror);
	stream.on('close', onclose);

	return function() {
		cancelled = true;
		stream.removeListener('complete', onfinish);
		stream.removeListener('abort', onclose);
		stream.removeListener('request', onrequest);
		if (stream.req) stream.req.removeListener('finish', onfinish);
		stream.removeListener('end', onlegacyfinish);
		stream.removeListener('close', onlegacyfinish);
		stream.removeListener('finish', onfinish);
		stream.removeListener('exit', onexit);
		stream.removeListener('end', onend);
		stream.removeListener('error', onerror);
		stream.removeListener('close', onclose);
	};
};

module.exports = eos;
{
  "author": {
    "name": "Mathias Buus",
    "email": "mathiasbuus@gmail.com"
  },
  "dependencies": {
    "once": "^1.4.0"
  },
  "deprecated": false,
  "description": "Call a callback when a readable/writable/duplex stream has completed or failed.",
  "devDependencies": {
    "tape": "^4.11.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/mafintosh/end-of-stream",
  "license": "MIT",
  "main": "index.js",
  "name": "end-of-stream",
  "repository": {
    "type": "git",
    "url": "git://github.com/mafintosh/end-of-stream.git"
  },
  "version": "1.4.4"
}The MIT License (MIT)

Copyright (c) 2017 Zhou Hancheng (z308114274@gmail.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
const dedent = require('dedent')
const objectorarray = require('objectorarray')
const parse = require('fast-json-parse')

module.exports = endent

const ENDENT_ID = 'twhZNwxI1aFG3r4'

function endent (strings, ...values) {
  strings = [].concat(strings)

  let result = ''

  for (let i = 0; i < strings.length; i++) {
    result += strings[i]

    if (i < values.length) {
      let value = values[i]
      let isJson = false

      if (parse(value).value) {
        value = parse(value).value
        isJson = true
      }

      if ((value && value[ENDENT_ID]) || isJson) {
        let rawlines = result.split('\n')
        let l = rawlines[rawlines.length - 1].search(/\S/)
        let endentation = l > 0 ? ' '.repeat(l) : ''
        let valueJson = isJson ? JSON.stringify(value, null, 2) : value[ENDENT_ID]
        let valueLines = valueJson.split('\n')

        valueLines.forEach((l, index) => {
          if (index > 0) {
            result += ('\n' + endentation + l)
          } else {
            result += l
          }
        })
      } else if (typeof value === 'string' && value.includes('\n')) {
        let endentations = result.match(/(?:^|\n)( *)$/)

        if (typeof value === 'string') {
          let endentation = endentations ? endentations[1] : ''
          result += value
            .split('\n')
            .map((str, i) => {
              str = (ENDENT_ID + str)
              return i === 0 ? str : `${endentation}${str}`
            })
            .join('\n')
        } else {
          result += value
        }
      } else {
        result += value
      }
    }
  }
  result = dedent(result)
  return result.split(ENDENT_ID).join('')
}

endent.pretty = (data) => {
  return objectorarray(data) ? {[ENDENT_ID]: JSON.stringify(data, null, 2)} : data
}
{
  "author": {
    "name": "zhouhancheng",
    "email": "z308114274@gmail.com"
  },
  "dependencies": {
    "dedent": "^0.7.0",
    "fast-json-parse": "^1.0.3",
    "objectorarray": "^1.0.3"
  },
  "deprecated": false,
  "description": "âž¡ï¸� An ES6 string tag that makes indentation right",
  "devDependencies": {
    "standard": "^11.0.1",
    "tape": "^4.8.0"
  },
  "homepage": "https://github.com/ZhouHansen/endent#readme",
  "license": "MIT",
  "main": "endent.js",
  "name": "endent",
  "repository": {
    "type": "git",
    "url": "git://github.com/ZhouHansen/endent.git"
  },
  "version": "1.4.0"
}root = true

[*]
indent_style = tab;
insert_final_newline = true;
quote_type = auto;
space_after_anonymous_functions = true;
space_after_control_statements = true;
spaces_around_operators = true;
trim_trailing_whitespace = true;
spaces_in_brackets = false;
end_of_line = lf;

coverage
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"lines": 86,
	"statements": 85.93,
	"functions": 82.43,
	"branches": 76.06,
	"exclude": [
		"coverage",
		"operations",
		"test"
	]
}
'use strict';

/* globals
	Atomics,
	SharedArrayBuffer,
*/

var undefined;

var $TypeError = TypeError;

var $gOPD = Object.getOwnPropertyDescriptor;
if ($gOPD) {
	try {
		$gOPD({}, '');
	} catch (e) {
		$gOPD = null; // this is IE 8, which has a broken gOPD
	}
}

var throwTypeError = function () { throw new $TypeError(); };
var ThrowTypeError = $gOPD
	? (function () {
		try {
			// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties
			arguments.callee; // IE 8 does not throw here
			return throwTypeError;
		} catch (calleeThrows) {
			try {
				// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')
				return $gOPD(arguments, 'callee').get;
			} catch (gOPDthrows) {
				return throwTypeError;
			}
		}
	}())
	: throwTypeError;

var hasSymbols = require('has-symbols')();

var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto

var generator; // = function * () {};
var generatorFunction = generator ? getProto(generator) : undefined;
var asyncFn; // async function() {};
var asyncFunction = asyncFn ? asyncFn.constructor : undefined;
var asyncGen; // async function * () {};
var asyncGenFunction = asyncGen ? getProto(asyncGen) : undefined;
var asyncGenIterator = asyncGen ? asyncGen() : undefined;

var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);

var INTRINSICS = {
	'%Array%': Array,
	'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
	'%ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer.prototype,
	'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,
	'%ArrayPrototype%': Array.prototype,
	'%ArrayProto_entries%': Array.prototype.entries,
	'%ArrayProto_forEach%': Array.prototype.forEach,
	'%ArrayProto_keys%': Array.prototype.keys,
	'%ArrayProto_values%': Array.prototype.values,
	'%AsyncFromSyncIteratorPrototype%': undefined,
	'%AsyncFunction%': asyncFunction,
	'%AsyncFunctionPrototype%': asyncFunction ? asyncFunction.prototype : undefined,
	'%AsyncGenerator%': asyncGen ? getProto(asyncGenIterator) : undefined,
	'%AsyncGeneratorFunction%': asyncGenFunction,
	'%AsyncGeneratorPrototype%': asyncGenFunction ? asyncGenFunction.prototype : undefined,
	'%AsyncIteratorPrototype%': asyncGenIterator && hasSymbols && Symbol.asyncIterator ? asyncGenIterator[Symbol.asyncIterator]() : undefined,
	'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
	'%Boolean%': Boolean,
	'%BooleanPrototype%': Boolean.prototype,
	'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,
	'%DataViewPrototype%': typeof DataView === 'undefined' ? undefined : DataView.prototype,
	'%Date%': Date,
	'%DatePrototype%': Date.prototype,
	'%decodeURI%': decodeURI,
	'%decodeURIComponent%': decodeURIComponent,
	'%encodeURI%': encodeURI,
	'%encodeURIComponent%': encodeURIComponent,
	'%Error%': Error,
	'%ErrorPrototype%': Error.prototype,
	'%eval%': eval, // eslint-disable-line no-eval
	'%EvalError%': EvalError,
	'%EvalErrorPrototype%': EvalError.prototype,
	'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
	'%Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined : Float32Array.prototype,
	'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
	'%Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined : Float64Array.prototype,
	'%Function%': Function,
	'%FunctionPrototype%': Function.prototype,
	'%Generator%': generator ? getProto(generator()) : undefined,
	'%GeneratorFunction%': generatorFunction,
	'%GeneratorPrototype%': generatorFunction ? generatorFunction.prototype : undefined,
	'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
	'%Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined : Int8Array.prototype,
	'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
	'%Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined : Int8Array.prototype,
	'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
	'%Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined : Int32Array.prototype,
	'%isFinite%': isFinite,
	'%isNaN%': isNaN,
	'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,
	'%JSON%': typeof JSON === 'object' ? JSON : undefined,
	'%JSONParse%': typeof JSON === 'object' ? JSON.parse : undefined,
	'%Map%': typeof Map === 'undefined' ? undefined : Map,
	'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),
	'%MapPrototype%': typeof Map === 'undefined' ? undefined : Map.prototype,
	'%Math%': Math,
	'%Number%': Number,
	'%NumberPrototype%': Number.prototype,
	'%Object%': Object,
	'%ObjectPrototype%': Object.prototype,
	'%ObjProto_toString%': Object.prototype.toString,
	'%ObjProto_valueOf%': Object.prototype.valueOf,
	'%parseFloat%': parseFloat,
	'%parseInt%': parseInt,
	'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,
	'%PromisePrototype%': typeof Promise === 'undefined' ? undefined : Promise.prototype,
	'%PromiseProto_then%': typeof Promise === 'undefined' ? undefined : Promise.prototype.then,
	'%Promise_all%': typeof Promise === 'undefined' ? undefined : Promise.all,
	'%Promise_reject%': typeof Promise === 'undefined' ? undefined : Promise.reject,
	'%Promise_resolve%': typeof Promise === 'undefined' ? undefined : Promise.resolve,
	'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
	'%RangeError%': RangeError,
	'%RangeErrorPrototype%': RangeError.prototype,
	'%ReferenceError%': ReferenceError,
	'%ReferenceErrorPrototype%': ReferenceError.prototype,
	'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
	'%RegExp%': RegExp,
	'%RegExpPrototype%': RegExp.prototype,
	'%Set%': typeof Set === 'undefined' ? undefined : Set,
	'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),
	'%SetPrototype%': typeof Set === 'undefined' ? undefined : Set.prototype,
	'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
	'%SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer.prototype,
	'%String%': String,
	'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,
	'%StringPrototype%': String.prototype,
	'%Symbol%': hasSymbols ? Symbol : undefined,
	'%SymbolPrototype%': hasSymbols ? Symbol.prototype : undefined,
	'%SyntaxError%': SyntaxError,
	'%SyntaxErrorPrototype%': SyntaxError.prototype,
	'%ThrowTypeError%': ThrowTypeError,
	'%TypedArray%': TypedArray,
	'%TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined,
	'%TypeError%': $TypeError,
	'%TypeErrorPrototype%': $TypeError.prototype,
	'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
	'%Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array.prototype,
	'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
	'%Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray.prototype,
	'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
	'%Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array.prototype,
	'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
	'%Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array.prototype,
	'%URIError%': URIError,
	'%URIErrorPrototype%': URIError.prototype,
	'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
	'%WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined : WeakMap.prototype,
	'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,
	'%WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined : WeakSet.prototype
};

var bind = require('function-bind');
var $replace = bind.call(Function.call, String.prototype.replace);

/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */
var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */
var stringToPath = function stringToPath(string) {
	var result = [];
	$replace(string, rePropName, function (match, number, quote, subString) {
		result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : (number || match);
	});
	return result;
};
/* end adaptation */

var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {
	if (!(name in INTRINSICS)) {
		throw new SyntaxError('intrinsic ' + name + ' does not exist!');
	}

	// istanbul ignore if // hopefully this is impossible to test :-)
	if (typeof INTRINSICS[name] === 'undefined' && !allowMissing) {
		throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
	}

	return INTRINSICS[name];
};

module.exports = function GetIntrinsic(name, allowMissing) {
	if (typeof name !== 'string' || name.length === 0) {
		throw new TypeError('intrinsic name must be a non-empty string');
	}
	if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
		throw new TypeError('"allowMissing" argument must be a boolean');
	}

	var parts = stringToPath(name);

	var value = getBaseIntrinsic('%' + (parts.length > 0 ? parts[0] : '') + '%', allowMissing);
	for (var i = 1; i < parts.length; i += 1) {
		if (value != null) {
			if ($gOPD && (i + 1) >= parts.length) {
				var desc = $gOPD(value, parts[i]);
				if (!allowMissing && !(parts[i] in value)) {
					throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');
				}
				value = desc ? (desc.get || desc.value) : value[parts[i]];
			} else {
				value = value[parts[i]];
			}
		}
	}
	return value;
};
The MIT License (MIT)

Copyright (C) 2015 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.'use strict';

/* eslint global-require: 0 */
// https://www.ecma-international.org/ecma-262/6.0/#sec-abstract-operations
var ES6 = {
	'Abstract Equality Comparison': require('./2015/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./2015/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./2015/StrictEqualityComparison'),
	AdvanceStringIndex: require('./2015/AdvanceStringIndex'),
	ArrayCreate: require('./2015/ArrayCreate'),
	ArraySetLength: require('./2015/ArraySetLength'),
	ArraySpeciesCreate: require('./2015/ArraySpeciesCreate'),
	Call: require('./2015/Call'),
	CanonicalNumericIndexString: require('./2015/CanonicalNumericIndexString'),
	CompletePropertyDescriptor: require('./2015/CompletePropertyDescriptor'),
	CreateDataProperty: require('./2015/CreateDataProperty'),
	CreateDataPropertyOrThrow: require('./2015/CreateDataPropertyOrThrow'),
	CreateHTML: require('./2015/CreateHTML'),
	CreateIterResultObject: require('./2015/CreateIterResultObject'),
	CreateListFromArrayLike: require('./2015/CreateListFromArrayLike'),
	CreateMethodProperty: require('./2015/CreateMethodProperty'),
	DateFromTime: require('./2015/DateFromTime'),
	Day: require('./2015/Day'),
	DayFromYear: require('./2015/DayFromYear'),
	DaysInYear: require('./2015/DaysInYear'),
	DayWithinYear: require('./2015/DayWithinYear'),
	DefinePropertyOrThrow: require('./2015/DefinePropertyOrThrow'),
	DeletePropertyOrThrow: require('./2015/DeletePropertyOrThrow'),
	EnumerableOwnNames: require('./2015/EnumerableOwnNames'),
	FromPropertyDescriptor: require('./2015/FromPropertyDescriptor'),
	Get: require('./2015/Get'),
	GetIterator: require('./2015/GetIterator'),
	GetMethod: require('./2015/GetMethod'),
	GetOwnPropertyKeys: require('./2015/GetOwnPropertyKeys'),
	GetPrototypeFromConstructor: require('./2015/GetPrototypeFromConstructor'),
	GetSubstitution: require('./2015/GetSubstitution'),
	GetV: require('./2015/GetV'),
	HasOwnProperty: require('./2015/HasOwnProperty'),
	HasProperty: require('./2015/HasProperty'),
	HourFromTime: require('./2015/HourFromTime'),
	InLeapYear: require('./2015/InLeapYear'),
	InstanceofOperator: require('./2015/InstanceofOperator'),
	Invoke: require('./2015/Invoke'),
	IsAccessorDescriptor: require('./2015/IsAccessorDescriptor'),
	IsArray: require('./2015/IsArray'),
	IsCallable: require('./2015/IsCallable'),
	IsConcatSpreadable: require('./2015/IsConcatSpreadable'),
	IsConstructor: require('./2015/IsConstructor'),
	IsDataDescriptor: require('./2015/IsDataDescriptor'),
	IsExtensible: require('./2015/IsExtensible'),
	IsGenericDescriptor: require('./2015/IsGenericDescriptor'),
	IsInteger: require('./2015/IsInteger'),
	IsPromise: require('./2015/IsPromise'),
	IsPropertyDescriptor: require('./2015/IsPropertyDescriptor'),
	IsPropertyKey: require('./2015/IsPropertyKey'),
	IsRegExp: require('./2015/IsRegExp'),
	IteratorClose: require('./2015/IteratorClose'),
	IteratorComplete: require('./2015/IteratorComplete'),
	IteratorNext: require('./2015/IteratorNext'),
	IteratorStep: require('./2015/IteratorStep'),
	IteratorValue: require('./2015/IteratorValue'),
	MakeDate: require('./2015/MakeDate'),
	MakeDay: require('./2015/MakeDay'),
	MakeTime: require('./2015/MakeTime'),
	MinFromTime: require('./2015/MinFromTime'),
	modulo: require('./2015/modulo'),
	MonthFromTime: require('./2015/MonthFromTime'),
	msFromTime: require('./2015/msFromTime'),
	ObjectCreate: require('./2015/ObjectCreate'),
	OrdinaryDefineOwnProperty: require('./2015/OrdinaryDefineOwnProperty'),
	OrdinaryGetOwnProperty: require('./2015/OrdinaryGetOwnProperty'),
	OrdinaryHasInstance: require('./2015/OrdinaryHasInstance'),
	OrdinaryHasProperty: require('./2015/OrdinaryHasProperty'),
	RegExpExec: require('./2015/RegExpExec'),
	RequireObjectCoercible: require('./2015/RequireObjectCoercible'),
	SameValue: require('./2015/SameValue'),
	SameValueZero: require('./2015/SameValueZero'),
	SecFromTime: require('./2015/SecFromTime'),
	Set: require('./2015/Set'),
	SetFunctionName: require('./2015/SetFunctionName'),
	SetIntegrityLevel: require('./2015/SetIntegrityLevel'),
	SpeciesConstructor: require('./2015/SpeciesConstructor'),
	SymbolDescriptiveString: require('./2015/SymbolDescriptiveString'),
	TestIntegrityLevel: require('./2015/TestIntegrityLevel'),
	thisBooleanValue: require('./2015/thisBooleanValue'),
	thisNumberValue: require('./2015/thisNumberValue'),
	thisStringValue: require('./2015/thisStringValue'),
	thisTimeValue: require('./2015/thisTimeValue'),
	TimeClip: require('./2015/TimeClip'),
	TimeFromYear: require('./2015/TimeFromYear'),
	TimeWithinDay: require('./2015/TimeWithinDay'),
	ToBoolean: require('./2015/ToBoolean'),
	ToDateString: require('./2015/ToDateString'),
	ToInt16: require('./2015/ToInt16'),
	ToInt32: require('./2015/ToInt32'),
	ToInt8: require('./2015/ToInt8'),
	ToInteger: require('./2015/ToInteger'),
	ToLength: require('./2015/ToLength'),
	ToNumber: require('./2015/ToNumber'),
	ToObject: require('./2015/ToObject'),
	ToPrimitive: require('./2015/ToPrimitive'),
	ToPropertyDescriptor: require('./2015/ToPropertyDescriptor'),
	ToPropertyKey: require('./2015/ToPropertyKey'),
	ToString: require('./2015/ToString'),
	ToUint16: require('./2015/ToUint16'),
	ToUint32: require('./2015/ToUint32'),
	ToUint8: require('./2015/ToUint8'),
	ToUint8Clamp: require('./2015/ToUint8Clamp'),
	Type: require('./2015/Type'),
	ValidateAndApplyPropertyDescriptor: require('./2015/ValidateAndApplyPropertyDescriptor'),
	WeekDay: require('./2015/WeekDay'),
	YearFromTime: require('./2015/YearFromTime')
};

module.exports = ES6;
'use strict';

/* eslint global-require: 0 */
// https://www.ecma-international.org/ecma-262/7.0/#sec-abstract-operations
var ES2016 = {
	'Abstract Equality Comparison': require('./2016/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./2016/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./2016/StrictEqualityComparison'),
	AdvanceStringIndex: require('./2016/AdvanceStringIndex'),
	ArrayCreate: require('./2016/ArrayCreate'),
	ArraySetLength: require('./2016/ArraySetLength'),
	ArraySpeciesCreate: require('./2016/ArraySpeciesCreate'),
	Call: require('./2016/Call'),
	CanonicalNumericIndexString: require('./2016/CanonicalNumericIndexString'),
	CompletePropertyDescriptor: require('./2016/CompletePropertyDescriptor'),
	CreateDataProperty: require('./2016/CreateDataProperty'),
	CreateDataPropertyOrThrow: require('./2016/CreateDataPropertyOrThrow'),
	CreateHTML: require('./2016/CreateHTML'),
	CreateIterResultObject: require('./2016/CreateIterResultObject'),
	CreateListFromArrayLike: require('./2016/CreateListFromArrayLike'),
	CreateMethodProperty: require('./2016/CreateMethodProperty'),
	DateFromTime: require('./2016/DateFromTime'),
	Day: require('./2016/Day'),
	DayFromYear: require('./2016/DayFromYear'),
	DaysInYear: require('./2016/DaysInYear'),
	DayWithinYear: require('./2016/DayWithinYear'),
	DefinePropertyOrThrow: require('./2016/DefinePropertyOrThrow'),
	DeletePropertyOrThrow: require('./2016/DeletePropertyOrThrow'),
	EnumerableOwnNames: require('./2016/EnumerableOwnNames'),
	FromPropertyDescriptor: require('./2016/FromPropertyDescriptor'),
	Get: require('./2016/Get'),
	GetIterator: require('./2016/GetIterator'),
	GetMethod: require('./2016/GetMethod'),
	GetOwnPropertyKeys: require('./2016/GetOwnPropertyKeys'),
	GetPrototypeFromConstructor: require('./2016/GetPrototypeFromConstructor'),
	GetSubstitution: require('./2016/GetSubstitution'),
	GetV: require('./2016/GetV'),
	HasOwnProperty: require('./2016/HasOwnProperty'),
	HasProperty: require('./2016/HasProperty'),
	HourFromTime: require('./2016/HourFromTime'),
	InLeapYear: require('./2016/InLeapYear'),
	InstanceofOperator: require('./2016/InstanceofOperator'),
	Invoke: require('./2016/Invoke'),
	IsAccessorDescriptor: require('./2016/IsAccessorDescriptor'),
	IsArray: require('./2016/IsArray'),
	IsCallable: require('./2016/IsCallable'),
	IsConcatSpreadable: require('./2016/IsConcatSpreadable'),
	IsConstructor: require('./2016/IsConstructor'),
	IsDataDescriptor: require('./2016/IsDataDescriptor'),
	IsExtensible: require('./2016/IsExtensible'),
	IsGenericDescriptor: require('./2016/IsGenericDescriptor'),
	IsInteger: require('./2016/IsInteger'),
	IsPromise: require('./2016/IsPromise'),
	IsPropertyDescriptor: require('./2016/IsPropertyDescriptor'),
	IsPropertyKey: require('./2016/IsPropertyKey'),
	IsRegExp: require('./2016/IsRegExp'),
	IterableToArrayLike: require('./2016/IterableToArrayLike'),
	IteratorClose: require('./2016/IteratorClose'),
	IteratorComplete: require('./2016/IteratorComplete'),
	IteratorNext: require('./2016/IteratorNext'),
	IteratorStep: require('./2016/IteratorStep'),
	IteratorValue: require('./2016/IteratorValue'),
	MakeDate: require('./2016/MakeDate'),
	MakeDay: require('./2016/MakeDay'),
	MakeTime: require('./2016/MakeTime'),
	MinFromTime: require('./2016/MinFromTime'),
	modulo: require('./2016/modulo'),
	MonthFromTime: require('./2016/MonthFromTime'),
	msFromTime: require('./2016/msFromTime'),
	ObjectCreate: require('./2016/ObjectCreate'),
	OrdinaryDefineOwnProperty: require('./2016/OrdinaryDefineOwnProperty'),
	OrdinaryGetOwnProperty: require('./2016/OrdinaryGetOwnProperty'),
	OrdinaryGetPrototypeOf: require('./2016/OrdinaryGetPrototypeOf'),
	OrdinarySetPrototypeOf: require('./2016/OrdinarySetPrototypeOf'),
	OrdinaryHasInstance: require('./2016/OrdinaryHasInstance'),
	OrdinaryHasProperty: require('./2016/OrdinaryHasProperty'),
	RegExpExec: require('./2016/RegExpExec'),
	RequireObjectCoercible: require('./2016/RequireObjectCoercible'),
	SameValue: require('./2016/SameValue'),
	SameValueNonNumber: require('./2016/SameValueNonNumber'),
	SameValueZero: require('./2016/SameValueZero'),
	SecFromTime: require('./2016/SecFromTime'),
	Set: require('./2016/Set'),
	SetFunctionName: require('./2016/SetFunctionName'),
	SetIntegrityLevel: require('./2016/SetIntegrityLevel'),
	SpeciesConstructor: require('./2016/SpeciesConstructor'),
	SymbolDescriptiveString: require('./2016/SymbolDescriptiveString'),
	TestIntegrityLevel: require('./2016/TestIntegrityLevel'),
	thisBooleanValue: require('./2016/thisBooleanValue'),
	thisNumberValue: require('./2016/thisNumberValue'),
	thisStringValue: require('./2016/thisStringValue'),
	thisTimeValue: require('./2016/thisTimeValue'),
	TimeClip: require('./2016/TimeClip'),
	TimeFromYear: require('./2016/TimeFromYear'),
	TimeWithinDay: require('./2016/TimeWithinDay'),
	ToBoolean: require('./2016/ToBoolean'),
	ToDateString: require('./2016/ToDateString'),
	ToInt16: require('./2016/ToInt16'),
	ToInt32: require('./2016/ToInt32'),
	ToInt8: require('./2016/ToInt8'),
	ToInteger: require('./2016/ToInteger'),
	ToLength: require('./2016/ToLength'),
	ToNumber: require('./2016/ToNumber'),
	ToObject: require('./2016/ToObject'),
	ToPrimitive: require('./2016/ToPrimitive'),
	ToPropertyDescriptor: require('./2016/ToPropertyDescriptor'),
	ToPropertyKey: require('./2016/ToPropertyKey'),
	ToString: require('./2016/ToString'),
	ToUint16: require('./2016/ToUint16'),
	ToUint32: require('./2016/ToUint32'),
	ToUint8: require('./2016/ToUint8'),
	ToUint8Clamp: require('./2016/ToUint8Clamp'),
	Type: require('./2016/Type'),
	ValidateAndApplyPropertyDescriptor: require('./2016/ValidateAndApplyPropertyDescriptor'),
	WeekDay: require('./2016/WeekDay'),
	YearFromTime: require('./2016/YearFromTime')
};

module.exports = ES2016;
'use strict';

/* eslint global-require: 0 */
// https://www.ecma-international.org/ecma-262/8.0/#sec-abstract-operations
var ES2017 = {
	'Abstract Equality Comparison': require('./2017/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./2017/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./2017/StrictEqualityComparison'),
	AdvanceStringIndex: require('./2017/AdvanceStringIndex'),
	ArrayCreate: require('./2017/ArrayCreate'),
	ArraySetLength: require('./2017/ArraySetLength'),
	ArraySpeciesCreate: require('./2017/ArraySpeciesCreate'),
	Call: require('./2017/Call'),
	CanonicalNumericIndexString: require('./2017/CanonicalNumericIndexString'),
	CompletePropertyDescriptor: require('./2017/CompletePropertyDescriptor'),
	CreateDataProperty: require('./2017/CreateDataProperty'),
	CreateDataPropertyOrThrow: require('./2017/CreateDataPropertyOrThrow'),
	CreateHTML: require('./2017/CreateHTML'),
	CreateIterResultObject: require('./2017/CreateIterResultObject'),
	CreateListFromArrayLike: require('./2017/CreateListFromArrayLike'),
	CreateMethodProperty: require('./2017/CreateMethodProperty'),
	DateFromTime: require('./2017/DateFromTime'),
	Day: require('./2017/Day'),
	DayFromYear: require('./2017/DayFromYear'),
	DaysInYear: require('./2017/DaysInYear'),
	DayWithinYear: require('./2017/DayWithinYear'),
	DefinePropertyOrThrow: require('./2017/DefinePropertyOrThrow'),
	DeletePropertyOrThrow: require('./2017/DeletePropertyOrThrow'),
	EnumerableOwnProperties: require('./2017/EnumerableOwnProperties'),
	FromPropertyDescriptor: require('./2017/FromPropertyDescriptor'),
	Get: require('./2017/Get'),
	GetIterator: require('./2017/GetIterator'),
	GetMethod: require('./2017/GetMethod'),
	GetOwnPropertyKeys: require('./2017/GetOwnPropertyKeys'),
	GetPrototypeFromConstructor: require('./2017/GetPrototypeFromConstructor'),
	GetSubstitution: require('./2017/GetSubstitution'),
	GetV: require('./2017/GetV'),
	HasOwnProperty: require('./2017/HasOwnProperty'),
	HasProperty: require('./2017/HasProperty'),
	HourFromTime: require('./2017/HourFromTime'),
	InLeapYear: require('./2017/InLeapYear'),
	InstanceofOperator: require('./2017/InstanceofOperator'),
	Invoke: require('./2017/Invoke'),
	IsAccessorDescriptor: require('./2017/IsAccessorDescriptor'),
	IsArray: require('./2017/IsArray'),
	IsCallable: require('./2017/IsCallable'),
	IsConcatSpreadable: require('./2017/IsConcatSpreadable'),
	IsConstructor: require('./2017/IsConstructor'),
	IsDataDescriptor: require('./2017/IsDataDescriptor'),
	IsExtensible: require('./2017/IsExtensible'),
	IsGenericDescriptor: require('./2017/IsGenericDescriptor'),
	IsInteger: require('./2017/IsInteger'),
	IsPromise: require('./2017/IsPromise'),
	IsPropertyDescriptor: require('./2017/IsPropertyDescriptor'),
	IsPropertyKey: require('./2017/IsPropertyKey'),
	IsRegExp: require('./2017/IsRegExp'),
	IterableToList: require('./2017/IterableToList'),
	IteratorClose: require('./2017/IteratorClose'),
	IteratorComplete: require('./2017/IteratorComplete'),
	IteratorNext: require('./2017/IteratorNext'),
	IteratorStep: require('./2017/IteratorStep'),
	IteratorValue: require('./2017/IteratorValue'),
	MakeDate: require('./2017/MakeDate'),
	MakeDay: require('./2017/MakeDay'),
	MakeTime: require('./2017/MakeTime'),
	MinFromTime: require('./2017/MinFromTime'),
	modulo: require('./2017/modulo'),
	MonthFromTime: require('./2017/MonthFromTime'),
	msFromTime: require('./2017/msFromTime'),
	ObjectCreate: require('./2017/ObjectCreate'),
	OrdinaryDefineOwnProperty: require('./2017/OrdinaryDefineOwnProperty'),
	OrdinaryGetOwnProperty: require('./2017/OrdinaryGetOwnProperty'),
	OrdinarySetPrototypeOf: require('./2017/OrdinarySetPrototypeOf'),
	OrdinaryGetPrototypeOf: require('./2017/OrdinaryGetPrototypeOf'),
	OrdinaryHasInstance: require('./2017/OrdinaryHasInstance'),
	OrdinaryHasProperty: require('./2017/OrdinaryHasProperty'),
	RegExpExec: require('./2017/RegExpExec'),
	RequireObjectCoercible: require('./2017/RequireObjectCoercible'),
	SameValue: require('./2017/SameValue'),
	SameValueNonNumber: require('./2017/SameValueNonNumber'),
	SameValueZero: require('./2017/SameValueZero'),
	SecFromTime: require('./2017/SecFromTime'),
	Set: require('./2017/Set'),
	SetFunctionName: require('./2017/SetFunctionName'),
	SetIntegrityLevel: require('./2017/SetIntegrityLevel'),
	SpeciesConstructor: require('./2017/SpeciesConstructor'),
	SymbolDescriptiveString: require('./2017/SymbolDescriptiveString'),
	TestIntegrityLevel: require('./2017/TestIntegrityLevel'),
	thisBooleanValue: require('./2017/thisBooleanValue'),
	thisNumberValue: require('./2017/thisNumberValue'),
	thisStringValue: require('./2017/thisStringValue'),
	thisTimeValue: require('./2017/thisTimeValue'),
	TimeClip: require('./2017/TimeClip'),
	TimeFromYear: require('./2017/TimeFromYear'),
	TimeWithinDay: require('./2017/TimeWithinDay'),
	ToBoolean: require('./2017/ToBoolean'),
	ToDateString: require('./2017/ToDateString'),
	ToIndex: require('./2017/ToIndex'),
	ToInt16: require('./2017/ToInt16'),
	ToInt32: require('./2017/ToInt32'),
	ToInt8: require('./2017/ToInt8'),
	ToInteger: require('./2017/ToInteger'),
	ToLength: require('./2017/ToLength'),
	ToNumber: require('./2017/ToNumber'),
	ToObject: require('./2017/ToObject'),
	ToPrimitive: require('./2017/ToPrimitive'),
	ToPropertyDescriptor: require('./2017/ToPropertyDescriptor'),
	ToPropertyKey: require('./2017/ToPropertyKey'),
	ToString: require('./2017/ToString'),
	ToUint16: require('./2017/ToUint16'),
	ToUint32: require('./2017/ToUint32'),
	ToUint8: require('./2017/ToUint8'),
	ToUint8Clamp: require('./2017/ToUint8Clamp'),
	Type: require('./2017/Type'),
	ValidateAndApplyPropertyDescriptor: require('./2017/ValidateAndApplyPropertyDescriptor'),
	WeekDay: require('./2017/WeekDay'),
	YearFromTime: require('./2017/YearFromTime')
};

module.exports = ES2017;
'use strict';

/* eslint global-require: 0 */
// https://www.ecma-international.org/ecma-262/9.0/#sec-abstract-operations
var ES2018 = {
	'Abstract Equality Comparison': require('./2018/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./2018/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./2018/StrictEqualityComparison'),
	AdvanceStringIndex: require('./2018/AdvanceStringIndex'),
	ArrayCreate: require('./2018/ArrayCreate'),
	ArraySetLength: require('./2018/ArraySetLength'),
	ArraySpeciesCreate: require('./2018/ArraySpeciesCreate'),
	Call: require('./2018/Call'),
	CanonicalNumericIndexString: require('./2018/CanonicalNumericIndexString'),
	CompletePropertyDescriptor: require('./2018/CompletePropertyDescriptor'),
	CopyDataProperties: require('./2018/CopyDataProperties'),
	CreateDataProperty: require('./2018/CreateDataProperty'),
	CreateDataPropertyOrThrow: require('./2018/CreateDataPropertyOrThrow'),
	CreateHTML: require('./2018/CreateHTML'),
	CreateIterResultObject: require('./2018/CreateIterResultObject'),
	CreateListFromArrayLike: require('./2018/CreateListFromArrayLike'),
	CreateMethodProperty: require('./2018/CreateMethodProperty'),
	DateFromTime: require('./2018/DateFromTime'),
	DateString: require('./2018/DateString'),
	Day: require('./2018/Day'),
	DayFromYear: require('./2018/DayFromYear'),
	DaysInYear: require('./2018/DaysInYear'),
	DayWithinYear: require('./2018/DayWithinYear'),
	DefinePropertyOrThrow: require('./2018/DefinePropertyOrThrow'),
	DeletePropertyOrThrow: require('./2018/DeletePropertyOrThrow'),
	EnumerableOwnPropertyNames: require('./2018/EnumerableOwnPropertyNames'),
	FromPropertyDescriptor: require('./2018/FromPropertyDescriptor'),
	Get: require('./2018/Get'),
	GetIterator: require('./2018/GetIterator'),
	GetMethod: require('./2018/GetMethod'),
	GetOwnPropertyKeys: require('./2018/GetOwnPropertyKeys'),
	GetPrototypeFromConstructor: require('./2018/GetPrototypeFromConstructor'),
	GetSubstitution: require('./2018/GetSubstitution'),
	GetV: require('./2018/GetV'),
	HasOwnProperty: require('./2018/HasOwnProperty'),
	HasProperty: require('./2018/HasProperty'),
	HourFromTime: require('./2018/HourFromTime'),
	InLeapYear: require('./2018/InLeapYear'),
	InstanceofOperator: require('./2018/InstanceofOperator'),
	Invoke: require('./2018/Invoke'),
	IsAccessorDescriptor: require('./2018/IsAccessorDescriptor'),
	IsArray: require('./2018/IsArray'),
	IsCallable: require('./2018/IsCallable'),
	IsConcatSpreadable: require('./2018/IsConcatSpreadable'),
	IsConstructor: require('./2018/IsConstructor'),
	IsDataDescriptor: require('./2018/IsDataDescriptor'),
	IsExtensible: require('./2018/IsExtensible'),
	IsGenericDescriptor: require('./2018/IsGenericDescriptor'),
	IsInteger: require('./2018/IsInteger'),
	IsPromise: require('./2018/IsPromise'),
	IsPropertyKey: require('./2018/IsPropertyKey'),
	IsRegExp: require('./2018/IsRegExp'),
	IsStringPrefix: require('./2018/IsStringPrefix'),
	IterableToList: require('./2018/IterableToList'),
	IteratorClose: require('./2018/IteratorClose'),
	IteratorComplete: require('./2018/IteratorComplete'),
	IteratorNext: require('./2018/IteratorNext'),
	IteratorStep: require('./2018/IteratorStep'),
	IteratorValue: require('./2018/IteratorValue'),
	MakeDate: require('./2018/MakeDate'),
	MakeDay: require('./2018/MakeDay'),
	MakeTime: require('./2018/MakeTime'),
	MinFromTime: require('./2018/MinFromTime'),
	modulo: require('./2018/modulo'),
	MonthFromTime: require('./2018/MonthFromTime'),
	msFromTime: require('./2018/msFromTime'),
	NumberToString: require('./2018/NumberToString'),
	ObjectCreate: require('./2018/ObjectCreate'),
	OrdinaryDefineOwnProperty: require('./2018/OrdinaryDefineOwnProperty'),
	OrdinaryGetOwnProperty: require('./2018/OrdinaryGetOwnProperty'),
	OrdinaryGetPrototypeOf: require('./2018/OrdinaryGetPrototypeOf'),
	OrdinarySetPrototypeOf: require('./2018/OrdinarySetPrototypeOf'),
	OrdinaryHasInstance: require('./2018/OrdinaryHasInstance'),
	OrdinaryHasProperty: require('./2018/OrdinaryHasProperty'),
	PromiseResolve: require('./2018/PromiseResolve'),
	RegExpExec: require('./2018/RegExpExec'),
	RequireObjectCoercible: require('./2018/RequireObjectCoercible'),
	SameValue: require('./2018/SameValue'),
	SameValueNonNumber: require('./2018/SameValueNonNumber'),
	SameValueZero: require('./2018/SameValueZero'),
	SecFromTime: require('./2018/SecFromTime'),
	Set: require('./2018/Set'),
	SetFunctionName: require('./2018/SetFunctionName'),
	SetIntegrityLevel: require('./2018/SetIntegrityLevel'),
	SpeciesConstructor: require('./2018/SpeciesConstructor'),
	SymbolDescriptiveString: require('./2018/SymbolDescriptiveString'),
	TestIntegrityLevel: require('./2018/TestIntegrityLevel'),
	thisBooleanValue: require('./2018/thisBooleanValue'),
	thisNumberValue: require('./2018/thisNumberValue'),
	thisStringValue: require('./2018/thisStringValue'),
	thisSymbolValue: require('./2018/thisSymbolValue'),
	thisTimeValue: require('./2018/thisTimeValue'),
	TimeClip: require('./2018/TimeClip'),
	TimeFromYear: require('./2018/TimeFromYear'),
	TimeString: require('./2018/TimeString'),
	TimeWithinDay: require('./2018/TimeWithinDay'),
	ToBoolean: require('./2018/ToBoolean'),
	ToDateString: require('./2018/ToDateString'),
	ToIndex: require('./2018/ToIndex'),
	ToInt16: require('./2018/ToInt16'),
	ToInt32: require('./2018/ToInt32'),
	ToInt8: require('./2018/ToInt8'),
	ToInteger: require('./2018/ToInteger'),
	ToLength: require('./2018/ToLength'),
	ToNumber: require('./2018/ToNumber'),
	ToObject: require('./2018/ToObject'),
	ToPrimitive: require('./2018/ToPrimitive'),
	ToPropertyDescriptor: require('./2018/ToPropertyDescriptor'),
	ToPropertyKey: require('./2018/ToPropertyKey'),
	ToString: require('./2018/ToString'),
	ToUint16: require('./2018/ToUint16'),
	ToUint32: require('./2018/ToUint32'),
	ToUint8: require('./2018/ToUint8'),
	ToUint8Clamp: require('./2018/ToUint8Clamp'),
	Type: require('./2018/Type'),
	ValidateAndApplyPropertyDescriptor: require('./2018/ValidateAndApplyPropertyDescriptor'),
	WeekDay: require('./2018/WeekDay'),
	YearFromTime: require('./2018/YearFromTime')
};

module.exports = ES2018;
'use strict';

/* eslint global-require: 0 */
// https://www.ecma-international.org/ecma-262/10.0/#sec-abstract-operations
var ES2019 = {
	'Abstract Equality Comparison': require('./2019/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./2019/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./2019/StrictEqualityComparison'),
	AddEntriesFromIterable: require('./2019/AddEntriesFromIterable'),
	AdvanceStringIndex: require('./2019/AdvanceStringIndex'),
	ArrayCreate: require('./2019/ArrayCreate'),
	ArraySetLength: require('./2019/ArraySetLength'),
	ArraySpeciesCreate: require('./2019/ArraySpeciesCreate'),
	Call: require('./2019/Call'),
	CanonicalNumericIndexString: require('./2019/CanonicalNumericIndexString'),
	CompletePropertyDescriptor: require('./2019/CompletePropertyDescriptor'),
	CopyDataProperties: require('./2019/CopyDataProperties'),
	CreateDataProperty: require('./2019/CreateDataProperty'),
	CreateDataPropertyOrThrow: require('./2019/CreateDataPropertyOrThrow'),
	CreateHTML: require('./2019/CreateHTML'),
	CreateIterResultObject: require('./2019/CreateIterResultObject'),
	CreateListFromArrayLike: require('./2019/CreateListFromArrayLike'),
	CreateMethodProperty: require('./2019/CreateMethodProperty'),
	DateFromTime: require('./2019/DateFromTime'),
	DateString: require('./2019/DateString'),
	Day: require('./2019/Day'),
	DayFromYear: require('./2019/DayFromYear'),
	DaysInYear: require('./2019/DaysInYear'),
	DayWithinYear: require('./2019/DayWithinYear'),
	DefinePropertyOrThrow: require('./2019/DefinePropertyOrThrow'),
	DeletePropertyOrThrow: require('./2019/DeletePropertyOrThrow'),
	EnumerableOwnPropertyNames: require('./2019/EnumerableOwnPropertyNames'),
	FlattenIntoArray: require('./2019/FlattenIntoArray'),
	FromPropertyDescriptor: require('./2019/FromPropertyDescriptor'),
	Get: require('./2019/Get'),
	GetIterator: require('./2019/GetIterator'),
	GetMethod: require('./2019/GetMethod'),
	GetOwnPropertyKeys: require('./2019/GetOwnPropertyKeys'),
	GetPrototypeFromConstructor: require('./2019/GetPrototypeFromConstructor'),
	GetSubstitution: require('./2019/GetSubstitution'),
	GetV: require('./2019/GetV'),
	HasOwnProperty: require('./2019/HasOwnProperty'),
	HasProperty: require('./2019/HasProperty'),
	HourFromTime: require('./2019/HourFromTime'),
	InLeapYear: require('./2019/InLeapYear'),
	InstanceofOperator: require('./2019/InstanceofOperator'),
	Invoke: require('./2019/Invoke'),
	IsAccessorDescriptor: require('./2019/IsAccessorDescriptor'),
	IsArray: require('./2019/IsArray'),
	IsCallable: require('./2019/IsCallable'),
	IsConcatSpreadable: require('./2019/IsConcatSpreadable'),
	IsConstructor: require('./2019/IsConstructor'),
	IsDataDescriptor: require('./2019/IsDataDescriptor'),
	IsExtensible: require('./2019/IsExtensible'),
	IsGenericDescriptor: require('./2019/IsGenericDescriptor'),
	IsInteger: require('./2019/IsInteger'),
	IsPromise: require('./2019/IsPromise'),
	IsPropertyKey: require('./2019/IsPropertyKey'),
	IsRegExp: require('./2019/IsRegExp'),
	IsStringPrefix: require('./2019/IsStringPrefix'),
	IterableToList: require('./2019/IterableToList'),
	IteratorClose: require('./2019/IteratorClose'),
	IteratorComplete: require('./2019/IteratorComplete'),
	IteratorNext: require('./2019/IteratorNext'),
	IteratorStep: require('./2019/IteratorStep'),
	IteratorValue: require('./2019/IteratorValue'),
	MakeDate: require('./2019/MakeDate'),
	MakeDay: require('./2019/MakeDay'),
	MakeTime: require('./2019/MakeTime'),
	MinFromTime: require('./2019/MinFromTime'),
	modulo: require('./2019/modulo'),
	MonthFromTime: require('./2019/MonthFromTime'),
	msFromTime: require('./2019/msFromTime'),
	NumberToString: require('./2019/NumberToString'),
	ObjectCreate: require('./2019/ObjectCreate'),
	OrdinaryDefineOwnProperty: require('./2019/OrdinaryDefineOwnProperty'),
	OrdinaryGetOwnProperty: require('./2019/OrdinaryGetOwnProperty'),
	OrdinaryGetPrototypeOf: require('./2019/OrdinaryGetPrototypeOf'),
	OrdinarySetPrototypeOf: require('./2019/OrdinarySetPrototypeOf'),
	OrdinaryHasInstance: require('./2019/OrdinaryHasInstance'),
	OrdinaryHasProperty: require('./2019/OrdinaryHasProperty'),
	PromiseResolve: require('./2019/PromiseResolve'),
	RegExpExec: require('./2019/RegExpExec'),
	RequireObjectCoercible: require('./2019/RequireObjectCoercible'),
	SameValue: require('./2019/SameValue'),
	SameValueNonNumber: require('./2019/SameValueNonNumber'),
	SameValueZero: require('./2019/SameValueZero'),
	SecFromTime: require('./2019/SecFromTime'),
	Set: require('./2019/Set'),
	SetFunctionName: require('./2019/SetFunctionName'),
	SetIntegrityLevel: require('./2019/SetIntegrityLevel'),
	SpeciesConstructor: require('./2019/SpeciesConstructor'),
	SymbolDescriptiveString: require('./2019/SymbolDescriptiveString'),
	TestIntegrityLevel: require('./2019/TestIntegrityLevel'),
	thisBooleanValue: require('./2019/thisBooleanValue'),
	thisNumberValue: require('./2019/thisNumberValue'),
	thisStringValue: require('./2019/thisStringValue'),
	thisSymbolValue: require('./2019/thisSymbolValue'),
	thisTimeValue: require('./2019/thisTimeValue'),
	TimeClip: require('./2019/TimeClip'),
	TimeFromYear: require('./2019/TimeFromYear'),
	TimeString: require('./2019/TimeString'),
	TimeWithinDay: require('./2019/TimeWithinDay'),
	ToBoolean: require('./2019/ToBoolean'),
	ToDateString: require('./2019/ToDateString'),
	ToIndex: require('./2019/ToIndex'),
	ToInt16: require('./2019/ToInt16'),
	ToInt32: require('./2019/ToInt32'),
	ToInt8: require('./2019/ToInt8'),
	ToInteger: require('./2019/ToInteger'),
	ToLength: require('./2019/ToLength'),
	ToNumber: require('./2019/ToNumber'),
	ToObject: require('./2019/ToObject'),
	ToPrimitive: require('./2019/ToPrimitive'),
	ToPropertyDescriptor: require('./2019/ToPropertyDescriptor'),
	ToPropertyKey: require('./2019/ToPropertyKey'),
	ToString: require('./2019/ToString'),
	ToUint16: require('./2019/ToUint16'),
	ToUint32: require('./2019/ToUint32'),
	ToUint8: require('./2019/ToUint8'),
	ToUint8Clamp: require('./2019/ToUint8Clamp'),
	TrimString: require('./2019/TrimString'),
	Type: require('./2019/Type'),
	ValidateAndApplyPropertyDescriptor: require('./2019/ValidateAndApplyPropertyDescriptor'),
	WeekDay: require('./2019/WeekDay'),
	YearFromTime: require('./2019/YearFromTime')
};

module.exports = ES2019;
'use strict';

/* eslint global-require: 0 */

// https://es5.github.io/#x9
module.exports = {
	'Abstract Equality Comparison': require('./5/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./5/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./5/StrictEqualityComparison'),
	CheckObjectCoercible: require('./5/CheckObjectCoercible'),
	DateFromTime: require('./5/DateFromTime'),
	Day: require('./5/Day'),
	DayFromYear: require('./5/DayFromYear'),
	DaysInYear: require('./5/DaysInYear'),
	DayWithinYear: require('./5/DayWithinYear'),
	FromPropertyDescriptor: require('./5/FromPropertyDescriptor'),
	HourFromTime: require('./5/HourFromTime'),
	InLeapYear: require('./5/InLeapYear'),
	IsAccessorDescriptor: require('./5/IsAccessorDescriptor'),
	IsCallable: require('./5/IsCallable'),
	IsDataDescriptor: require('./5/IsDataDescriptor'),
	IsGenericDescriptor: require('./5/IsGenericDescriptor'),
	IsPropertyDescriptor: require('./5/IsPropertyDescriptor'),
	MakeDate: require('./5/MakeDate'),
	MakeDay: require('./5/MakeDay'),
	MakeTime: require('./5/MakeTime'),
	MinFromTime: require('./5/MinFromTime'),
	modulo: require('./5/modulo'),
	MonthFromTime: require('./5/MonthFromTime'),
	msFromTime: require('./5/msFromTime'),
	SameValue: require('./5/SameValue'),
	SecFromTime: require('./5/SecFromTime'),
	TimeClip: require('./5/TimeClip'),
	TimeFromYear: require('./5/TimeFromYear'),
	TimeWithinDay: require('./5/TimeWithinDay'),
	ToBoolean: require('./5/ToBoolean'),
	ToInt32: require('./5/ToInt32'),
	ToInteger: require('./5/ToInteger'),
	ToNumber: require('./5/ToNumber'),
	ToObject: require('./5/ToObject'),
	ToPrimitive: require('./5/ToPrimitive'),
	ToPropertyDescriptor: require('./5/ToPropertyDescriptor'),
	ToString: require('./5/ToString'),
	ToUint16: require('./5/ToUint16'),
	ToUint32: require('./5/ToUint32'),
	Type: require('./5/Type'),
	WeekDay: require('./5/WeekDay'),
	YearFromTime: require('./5/YearFromTime')
};
'use strict';

module.exports = require('./es2015');
'use strict';

module.exports = require('./es2016');
'use strict';

var assign = require('./helpers/assign');

var ES5 = require('./es5');
var ES2015 = require('./es2015');
var ES2016 = require('./es2016');
var ES2017 = require('./es2017');
var ES2018 = require('./es2018');
var ES2019 = require('./es2019');

var ES = {
	ES5: ES5,
	ES6: ES2015,
	ES2015: ES2015,
	ES7: ES2016,
	ES2016: ES2016,
	ES2017: ES2017,
	ES2018: ES2018,
	ES2019: ES2019
};
assign(ES, ES5);
delete ES.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible
assign(ES, ES2015);

module.exports = ES;
{
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com",
    "url": "http://ljharb.codes"
  },
  "dependencies": {
    "es-to-primitive": "^1.2.1",
    "function-bind": "^1.1.1",
    "has": "^1.0.3",
    "has-symbols": "^1.0.1",
    "is-callable": "^1.1.5",
    "is-regex": "^1.0.5",
    "object-inspect": "^1.7.0",
    "object-keys": "^1.1.1",
    "object.assign": "^4.1.0",
    "string.prototype.trimleft": "^2.1.1",
    "string.prototype.trimright": "^2.1.1"
  },
  "deprecated": false,
  "description": "ECMAScript spec abstract operations.",
  "devDependencies": {
    "@ljharb/eslint-config": "^15.1.0",
    "array.prototype.indexof": "^1.0.0",
    "cheerio": "^1.0.0-rc.3",
    "diff": "^4.0.2",
    "eclint": "^2.8.1",
    "eslint": "^6.8.0",
    "foreach": "^2.0.5",
    "functions-have-names": "^1.2.1",
    "has-strict-mode": "^1.0.0",
    "in-publish": "^2.0.0",
    "make-arrow-function": "^1.1.0",
    "nyc": "^10.3.2",
    "object-is": "^1.0.2",
    "object.fromentries": "^2.0.2",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.0.0-next.4"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "greenkeeper": {
    "//": "nyc is ignored because it requires node 4+, and we support older than that",
    "ignore": [
      "nyc"
    ]
  },
  "homepage": "https://github.com/ljharb/es-abstract#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "es-abstract",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/es-abstract.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "1.17.4"
}'use strict';

module.exports = {
	IsPropertyDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type', // not actually an abstract op

	'Abstract Equality Comparison': 'https://ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison',
	'Abstract Relational Comparison': 'https://ecma-international.org/ecma-262/6.0/#sec-abstract-relational-comparison',
	'Strict Equality Comparison': 'https://ecma-international.org/ecma-262/6.0/#sec-strict-equality-comparison',
	AdvanceStringIndex: 'https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex',
	ArrayCreate: 'https://ecma-international.org/ecma-262/6.0/#sec-arraycreate',
	ArraySetLength: 'https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength',
	ArraySpeciesCreate: 'https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate',
	Call: 'https://ecma-international.org/ecma-262/6.0/#sec-call',
	CanonicalNumericIndexString: 'https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring',
	CompletePropertyDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor',
	Construct: 'https://ecma-international.org/ecma-262/6.0/#sec-construct',
	CreateArrayFromList: 'https://ecma-international.org/ecma-262/6.0/#sec-createarrayfromlist',
	CreateDataProperty: 'https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty',
	CreateDataPropertyOrThrow: 'https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow',
	CreateHTML: 'https://ecma-international.org/ecma-262/6.0/#sec-createhtml',
	CreateIterResultObject: 'https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject',
	CreateListFromArrayLike: 'https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike',
	CreateListIterator: 'https://ecma-international.org/ecma-262/6.0/#sec-createlistiterator',
	CreateMethodProperty: 'https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty',
	DateFromTime: 'https://ecma-international.org/ecma-262/6.0/#sec-date-number',
	Day: 'https://ecma-international.org/ecma-262/6.0/#sec-day-number-and-time-within-day',
	DayFromYear: 'https://ecma-international.org/ecma-262/6.0/#sec-year-number',
	DaysInYear: 'https://ecma-international.org/ecma-262/6.0/#sec-year-number',
	DayWithinYear: 'https://ecma-international.org/ecma-262/6.0/#sec-month-number',
	DefinePropertyOrThrow: 'https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow',
	DeletePropertyOrThrow: 'https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow',
	EnumerableOwnNames: 'https://ecma-international.org/ecma-262/6.0/#sec-enumerableownnames',
	FromPropertyDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor',
	Get: 'https://ecma-international.org/ecma-262/6.0/#sec-get-o-p',
	GetIterator: 'https://ecma-international.org/ecma-262/6.0/#sec-getiterator',
	GetMethod: 'https://ecma-international.org/ecma-262/6.0/#sec-getmethod',
	GetOwnPropertyKeys: 'https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys',
	GetPrototypeFromConstructor: 'https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor',
	GetSubstitution: 'https://ecma-international.org/ecma-262/6.0/#sec-getsubstitution',
	GetV: 'https://ecma-international.org/ecma-262/6.0/#sec-getv',
	HasOwnProperty: 'https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty',
	HasProperty: 'https://ecma-international.org/ecma-262/6.0/#sec-hasproperty',
	HourFromTime: 'https://ecma-international.org/ecma-262/6.0/#sec-hours-minutes-second-and-milliseconds',
	InLeapYear: 'https://ecma-international.org/ecma-262/6.0/#sec-year-number',
	InstanceofOperator: 'https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator',
	Invoke: 'https://ecma-international.org/ecma-262/6.0/#sec-invoke',
	IsAccessorDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor',
	IsArray: 'https://ecma-international.org/ecma-262/6.0/#sec-isarray',
	IsCallable: 'https://ecma-international.org/ecma-262/6.0/#sec-iscallable',
	IsConcatSpreadable: 'https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable',
	IsConstructor: 'https://ecma-international.org/ecma-262/6.0/#sec-isconstructor',
	IsDataDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor',
	IsExtensible: 'https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o',
	IsGenericDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor',
	IsInteger: 'https://ecma-international.org/ecma-262/6.0/#sec-isinteger',
	IsPromise: 'https://ecma-international.org/ecma-262/6.0/#sec-ispromise',
	IsPropertyKey: 'https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey',
	IsRegExp: 'https://ecma-international.org/ecma-262/6.0/#sec-isregexp',
	IteratorClose: 'https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose',
	IteratorComplete: 'https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete',
	IteratorNext: 'https://ecma-international.org/ecma-262/6.0/#sec-iteratornext',
	IteratorStep: 'https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep',
	IteratorValue: 'https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue',
	MakeDate: 'https://ecma-international.org/ecma-262/6.0/#sec-makedate',
	MakeDay: 'https://ecma-international.org/ecma-262/6.0/#sec-makeday',
	MakeTime: 'https://ecma-international.org/ecma-262/6.0/#sec-maketime',
	MinFromTime: 'https://ecma-international.org/ecma-262/6.0/#sec-hours-minutes-second-and-milliseconds',
	modulo: 'https://ecma-international.org/ecma-262/6.0/#sec-algorithm-conventions',
	MonthFromTime: 'https://ecma-international.org/ecma-262/6.0/#sec-month-number',
	msFromTime: 'https://ecma-international.org/ecma-262/6.0/#sec-hours-minutes-second-and-milliseconds',
	NormalCompletion: 'https://ecma-international.org/ecma-262/6.0/#sec-normalcompletion',
	ObjectCreate: 'https://ecma-international.org/ecma-262/6.0/#sec-objectcreate',
	OrdinaryDefineOwnProperty: 'https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty',
	OrdinaryGetOwnProperty: 'https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty',
	OrdinaryHasInstance: 'https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance',
	OrdinaryHasProperty: 'https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty',
	RegExpBuiltinExec: 'https://ecma-international.org/ecma-262/6.0/#sec-regexpbuiltinexec',
	RegExpExec: 'https://ecma-international.org/ecma-262/6.0/#sec-regexpexec',
	RequireObjectCoercible: 'https://ecma-international.org/ecma-262/6.0/#sec-requireobjectcoercible',
	SameValue: 'https://ecma-international.org/ecma-262/6.0/#sec-samevalue',
	SameValueZero: 'https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero',
	SecFromTime: 'https://ecma-international.org/ecma-262/6.0/#sec-hours-minutes-second-and-milliseconds',
	Set: 'https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw',
	SetFunctionName: 'https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname',
	SetIntegrityLevel: 'https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel',
	SpeciesConstructor: 'https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor',
	SymbolDescriptiveString: 'https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring',
	TestIntegrityLevel: 'https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel',
	thisBooleanValue: 'https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object',
	thisNumberValue: 'https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object',
	thisStringValue: 'https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object',
	thisTimeValue: 'https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object',
	TimeClip: 'https://ecma-international.org/ecma-262/6.0/#sec-timeclip',
	TimeFromYear: 'https://ecma-international.org/ecma-262/6.0/#sec-year-number',
	TimeWithinDay: 'https://ecma-international.org/ecma-262/6.0/#sec-day-number-and-time-within-day',
	ToBoolean: 'https://ecma-international.org/ecma-262/6.0/#sec-toboolean',
	ToDateString: 'https://ecma-international.org/ecma-262/6.0/#sec-todatestring',
	ToInt16: 'https://ecma-international.org/ecma-262/6.0/#sec-toint16',
	ToInt32: 'https://ecma-international.org/ecma-262/6.0/#sec-toint32',
	ToInt8: 'https://ecma-international.org/ecma-262/6.0/#sec-toint8',
	ToInteger: 'https://ecma-international.org/ecma-262/6.0/#sec-tointeger',
	ToLength: 'https://ecma-international.org/ecma-262/6.0/#sec-tolength',
	ToNumber: 'https://ecma-international.org/ecma-262/6.0/#sec-tonumber',
	ToObject: 'https://ecma-international.org/ecma-262/6.0/#sec-toobject',
	ToPrimitive: 'https://ecma-international.org/ecma-262/6.0/#sec-toprimitive',
	ToPropertyDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-topropertydescriptor',
	ToPropertyKey: 'https://ecma-international.org/ecma-262/6.0/#sec-topropertykey',
	ToString: 'https://ecma-international.org/ecma-262/6.0/#sec-tostring',
	ToUint16: 'https://ecma-international.org/ecma-262/6.0/#sec-touint16',
	ToUint32: 'https://ecma-international.org/ecma-262/6.0/#sec-touint32',
	ToUint8: 'https://ecma-international.org/ecma-262/6.0/#sec-touint8',
	ToUint8Clamp: 'https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp',
	Type: 'https://ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types',
	ValidateAndApplyPropertyDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor',
	WeekDay: 'https://ecma-international.org/ecma-262/6.0/#sec-week-day',
	YearFromTime: 'https://ecma-international.org/ecma-262/6.0/#sec-year-number'
};
'use strict';

module.exports = {
	IsPropertyDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type', // not actually an abstract op

	abs: 'https://ecma-international.org/ecma-262/7.0/#sec-algorithm-conventions',
	'Abstract Equality Comparison': 'https://ecma-international.org/ecma-262/7.0/#sec-abstract-equality-comparison',
	'Abstract Relational Comparison': 'https://ecma-international.org/ecma-262/7.0/#sec-abstract-relational-comparison',
	AddRestrictedFunctionProperties: 'https://ecma-international.org/ecma-262/7.0/#sec-addrestrictedfunctionproperties',
	AdvanceStringIndex: 'https://ecma-international.org/ecma-262/7.0/#sec-advancestringindex',
	AllocateArrayBuffer: 'https://ecma-international.org/ecma-262/7.0/#sec-allocatearraybuffer',
	AllocateTypedArray: 'https://ecma-international.org/ecma-262/7.0/#sec-allocatetypedarray',
	AllocateTypedArrayBuffer: 'https://ecma-international.org/ecma-262/7.0/#sec-allocatetypedarraybuffer',
	ArrayCreate: 'https://ecma-international.org/ecma-262/7.0/#sec-arraycreate',
	ArraySetLength: 'https://ecma-international.org/ecma-262/7.0/#sec-arraysetlength',
	ArraySpeciesCreate: 'https://ecma-international.org/ecma-262/7.0/#sec-arrayspeciescreate',
	BlockDeclarationInstantiation: 'https://ecma-international.org/ecma-262/7.0/#sec-blockdeclarationinstantiation',
	BoundFunctionCreate: 'https://ecma-international.org/ecma-262/7.0/#sec-boundfunctioncreate',
	Call: 'https://ecma-international.org/ecma-262/7.0/#sec-call',
	Canonicalize: 'https://ecma-international.org/ecma-262/7.0/#sec-runtime-semantics-canonicalize-ch',
	CanonicalNumericIndexString: 'https://ecma-international.org/ecma-262/7.0/#sec-canonicalnumericindexstring',
	CharacterRange: 'https://ecma-international.org/ecma-262/7.0/#sec-runtime-semantics-characterrange-abstract-operation',
	CharacterRangeOrUnion: 'https://ecma-international.org/ecma-262/7.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation',
	CharacterSetMatcher: 'https://ecma-international.org/ecma-262/7.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation',
	CloneArrayBuffer: 'https://ecma-international.org/ecma-262/7.0/#sec-clonearraybuffer',
	CompletePropertyDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-completepropertydescriptor',
	Completion: 'https://ecma-international.org/ecma-262/7.0/#sec-completion-record-specification-type',
	Construct: 'https://ecma-international.org/ecma-262/7.0/#sec-construct',
	CopyDataBlockBytes: 'https://ecma-international.org/ecma-262/7.0/#sec-copydatablockbytes',
	CreateArrayFromList: 'https://ecma-international.org/ecma-262/7.0/#sec-createarrayfromlist',
	CreateArrayIterator: 'https://ecma-international.org/ecma-262/7.0/#sec-createarrayiterator',
	CreateBuiltinFunction: 'https://ecma-international.org/ecma-262/7.0/#sec-createbuiltinfunction',
	CreateByteDataBlock: 'https://ecma-international.org/ecma-262/7.0/#sec-createbytedatablock',
	CreateDataProperty: 'https://ecma-international.org/ecma-262/7.0/#sec-createdataproperty',
	CreateDataPropertyOrThrow: 'https://ecma-international.org/ecma-262/7.0/#sec-createdatapropertyorthrow',
	CreateDynamicFunction: 'https://ecma-international.org/ecma-262/7.0/#sec-createdynamicfunction',
	CreateHTML: 'https://ecma-international.org/ecma-262/7.0/#sec-createhtml',
	CreateIntrinsics: 'https://ecma-international.org/ecma-262/7.0/#sec-createintrinsics',
	CreateIterResultObject: 'https://ecma-international.org/ecma-262/7.0/#sec-createiterresultobject',
	CreateListFromArrayLike: 'https://ecma-international.org/ecma-262/7.0/#sec-createlistfromarraylike',
	CreateListIterator: 'https://ecma-international.org/ecma-262/7.0/#sec-createlistiterator',
	CreateMapIterator: 'https://ecma-international.org/ecma-262/7.0/#sec-createmapiterator',
	CreateMappedArgumentsObject: 'https://ecma-international.org/ecma-262/7.0/#sec-createmappedargumentsobject',
	CreateMethodProperty: 'https://ecma-international.org/ecma-262/7.0/#sec-createmethodproperty',
	CreatePerIterationEnvironment: 'https://ecma-international.org/ecma-262/7.0/#sec-createperiterationenvironment',
	CreateRealm: 'https://ecma-international.org/ecma-262/7.0/#sec-createrealm',
	CreateResolvingFunctions: 'https://ecma-international.org/ecma-262/7.0/#sec-createresolvingfunctions',
	CreateSetIterator: 'https://ecma-international.org/ecma-262/7.0/#sec-createsetiterator',
	CreateStringIterator: 'https://ecma-international.org/ecma-262/7.0/#sec-createstringiterator',
	CreateUnmappedArgumentsObject: 'https://ecma-international.org/ecma-262/7.0/#sec-createunmappedargumentsobject',
	DateFromTime: 'https://ecma-international.org/ecma-262/7.0/#sec-date-number',
	Day: 'https://ecma-international.org/ecma-262/7.0/#sec-day-number-and-time-within-day',
	DayFromYear: 'https://ecma-international.org/ecma-262/7.0/#sec-year-number',
	DaysInYear: 'https://ecma-international.org/ecma-262/7.0/#sec-year-number',
	DayWithinYear: 'https://ecma-international.org/ecma-262/7.0/#sec-month-number',
	Decode: 'https://ecma-international.org/ecma-262/7.0/#sec-decode',
	DefinePropertyOrThrow: 'https://ecma-international.org/ecma-262/7.0/#sec-definepropertyorthrow',
	DeletePropertyOrThrow: 'https://ecma-international.org/ecma-262/7.0/#sec-deletepropertyorthrow',
	DetachArrayBuffer: 'https://ecma-international.org/ecma-262/7.0/#sec-detacharraybuffer',
	Encode: 'https://ecma-international.org/ecma-262/7.0/#sec-encode',
	EnqueueJob: 'https://ecma-international.org/ecma-262/7.0/#sec-enqueuejob',
	EnumerableOwnNames: 'https://ecma-international.org/ecma-262/7.0/#sec-enumerableownnames',
	EnumerateObjectProperties: 'https://ecma-international.org/ecma-262/7.0/#sec-enumerate-object-properties',
	EscapeRegExpPattern: 'https://ecma-international.org/ecma-262/7.0/#sec-escaperegexppattern',
	EvalDeclarationInstantiation: 'https://ecma-international.org/ecma-262/7.0/#sec-evaldeclarationinstantiation',
	EvaluateCall: 'https://ecma-international.org/ecma-262/7.0/#sec-evaluatecall',
	EvaluateDirectCall: 'https://ecma-international.org/ecma-262/7.0/#sec-evaluatedirectcall',
	EvaluateNew: 'https://ecma-international.org/ecma-262/7.0/#sec-evaluatenew',
	floor: 'https://ecma-international.org/ecma-262/7.0/#sec-algorithm-conventions',
	ForBodyEvaluation: 'https://ecma-international.org/ecma-262/7.0/#sec-forbodyevaluation',
	'ForIn/OfBodyEvaluation': 'https://ecma-international.org/ecma-262/7.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset',
	'ForIn/OfHeadEvaluation': 'https://ecma-international.org/ecma-262/7.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind',
	FromPropertyDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-frompropertydescriptor',
	FulfillPromise: 'https://ecma-international.org/ecma-262/7.0/#sec-fulfillpromise',
	FunctionAllocate: 'https://ecma-international.org/ecma-262/7.0/#sec-functionallocate',
	FunctionCreate: 'https://ecma-international.org/ecma-262/7.0/#sec-functioncreate',
	FunctionDeclarationInstantiation: 'https://ecma-international.org/ecma-262/7.0/#sec-functiondeclarationinstantiation',
	FunctionInitialize: 'https://ecma-international.org/ecma-262/7.0/#sec-functioninitialize',
	GeneratorFunctionCreate: 'https://ecma-international.org/ecma-262/7.0/#sec-generatorfunctioncreate',
	GeneratorResume: 'https://ecma-international.org/ecma-262/7.0/#sec-generatorresume',
	GeneratorResumeAbrupt: 'https://ecma-international.org/ecma-262/7.0/#sec-generatorresumeabrupt',
	GeneratorStart: 'https://ecma-international.org/ecma-262/7.0/#sec-generatorstart',
	GeneratorValidate: 'https://ecma-international.org/ecma-262/7.0/#sec-generatorvalidate',
	GeneratorYield: 'https://ecma-international.org/ecma-262/7.0/#sec-generatoryield',
	Get: 'https://ecma-international.org/ecma-262/7.0/#sec-get-o-p',
	GetActiveScriptOrModule: 'https://ecma-international.org/ecma-262/7.0/#sec-getactivescriptormodule',
	GetFunctionRealm: 'https://ecma-international.org/ecma-262/7.0/#sec-getfunctionrealm',
	GetGlobalObject: 'https://ecma-international.org/ecma-262/7.0/#sec-getglobalobject',
	GetIdentifierReference: 'https://ecma-international.org/ecma-262/7.0/#sec-getidentifierreference',
	GetIterator: 'https://ecma-international.org/ecma-262/7.0/#sec-getiterator',
	GetMethod: 'https://ecma-international.org/ecma-262/7.0/#sec-getmethod',
	GetModuleNamespace: 'https://ecma-international.org/ecma-262/7.0/#sec-getmodulenamespace',
	GetNewTarget: 'https://ecma-international.org/ecma-262/7.0/#sec-getnewtarget',
	GetOwnPropertyKeys: 'https://ecma-international.org/ecma-262/7.0/#sec-getownpropertykeys',
	GetPrototypeFromConstructor: 'https://ecma-international.org/ecma-262/7.0/#sec-getprototypefromconstructor',
	GetSubstitution: 'https://ecma-international.org/ecma-262/7.0/#sec-getsubstitution',
	GetSuperConstructor: 'https://ecma-international.org/ecma-262/7.0/#sec-getsuperconstructor',
	GetTemplateObject: 'https://ecma-international.org/ecma-262/7.0/#sec-gettemplateobject',
	GetThisEnvironment: 'https://ecma-international.org/ecma-262/7.0/#sec-getthisenvironment',
	GetThisValue: 'https://ecma-international.org/ecma-262/7.0/#sec-getthisvalue',
	GetV: 'https://ecma-international.org/ecma-262/7.0/#sec-getv',
	GetValue: 'https://ecma-international.org/ecma-262/7.0/#sec-getvalue',
	GetValueFromBuffer: 'https://ecma-international.org/ecma-262/7.0/#sec-getvaluefrombuffer',
	GetViewValue: 'https://ecma-international.org/ecma-262/7.0/#sec-getviewvalue',
	GlobalDeclarationInstantiation: 'https://ecma-international.org/ecma-262/7.0/#sec-globaldeclarationinstantiation',
	HasOwnProperty: 'https://ecma-international.org/ecma-262/7.0/#sec-hasownproperty',
	HasProperty: 'https://ecma-international.org/ecma-262/7.0/#sec-hasproperty',
	HostPromiseRejectionTracker: 'https://ecma-international.org/ecma-262/7.0/#sec-host-promise-rejection-tracker',
	HostReportErrors: 'https://ecma-international.org/ecma-262/7.0/#sec-host-report-errors',
	HostResolveImportedModule: 'https://ecma-international.org/ecma-262/7.0/#sec-hostresolveimportedmodule',
	HourFromTime: 'https://ecma-international.org/ecma-262/7.0/#sec-hours-minutes-second-and-milliseconds',
	IfAbruptRejectPromise: 'https://ecma-international.org/ecma-262/7.0/#sec-ifabruptrejectpromise',
	ImportedLocalNames: 'https://ecma-international.org/ecma-262/7.0/#sec-importedlocalnames',
	InitializeBoundName: 'https://ecma-international.org/ecma-262/7.0/#sec-initializeboundname',
	InitializeHostDefinedRealm: 'https://ecma-international.org/ecma-262/7.0/#sec-initializehostdefinedrealm',
	InitializeReferencedBinding: 'https://ecma-international.org/ecma-262/7.0/#sec-initializereferencedbinding',
	InLeapYear: 'https://ecma-international.org/ecma-262/7.0/#sec-year-number',
	InstanceofOperator: 'https://ecma-international.org/ecma-262/7.0/#sec-instanceofoperator',
	IntegerIndexedElementGet: 'https://ecma-international.org/ecma-262/7.0/#sec-integerindexedelementget',
	IntegerIndexedElementSet: 'https://ecma-international.org/ecma-262/7.0/#sec-integerindexedelementset',
	IntegerIndexedObjectCreate: 'https://ecma-international.org/ecma-262/7.0/#sec-integerindexedobjectcreate',
	InternalizeJSONProperty: 'https://ecma-international.org/ecma-262/7.0/#sec-internalizejsonproperty',
	Invoke: 'https://ecma-international.org/ecma-262/7.0/#sec-invoke',
	IsAccessorDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-isaccessordescriptor',
	IsAnonymousFunctionDefinition: 'https://ecma-international.org/ecma-262/7.0/#sec-isanonymousfunctiondefinition',
	IsArray: 'https://ecma-international.org/ecma-262/7.0/#sec-isarray',
	IsCallable: 'https://ecma-international.org/ecma-262/7.0/#sec-iscallable',
	IsCompatiblePropertyDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-iscompatiblepropertydescriptor',
	IsConcatSpreadable: 'https://ecma-international.org/ecma-262/7.0/#sec-isconcatspreadable',
	IsConstructor: 'https://ecma-international.org/ecma-262/7.0/#sec-isconstructor',
	IsDataDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-isdatadescriptor',
	IsDetachedBuffer: 'https://ecma-international.org/ecma-262/7.0/#sec-isdetachedbuffer',
	IsExtensible: 'https://ecma-international.org/ecma-262/7.0/#sec-isextensible-o',
	IsGenericDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-isgenericdescriptor',
	IsInTailPosition: 'https://ecma-international.org/ecma-262/7.0/#sec-isintailposition',
	IsInteger: 'https://ecma-international.org/ecma-262/7.0/#sec-isinteger',
	IsLabelledFunction: 'https://ecma-international.org/ecma-262/7.0/#sec-islabelledfunction',
	IsPromise: 'https://ecma-international.org/ecma-262/7.0/#sec-ispromise',
	IsPropertyKey: 'https://ecma-international.org/ecma-262/7.0/#sec-ispropertykey',
	IsRegExp: 'https://ecma-international.org/ecma-262/7.0/#sec-isregexp',
	IsWordChar: 'https://ecma-international.org/ecma-262/7.0/#sec-runtime-semantics-iswordchar-abstract-operation',
	IterableToArrayLike: 'https://ecma-international.org/ecma-262/7.0/#sec-iterabletoarraylike',
	IteratorClose: 'https://ecma-international.org/ecma-262/7.0/#sec-iteratorclose',
	IteratorComplete: 'https://ecma-international.org/ecma-262/7.0/#sec-iteratorcomplete',
	IteratorNext: 'https://ecma-international.org/ecma-262/7.0/#sec-iteratornext',
	IteratorStep: 'https://ecma-international.org/ecma-262/7.0/#sec-iteratorstep',
	IteratorValue: 'https://ecma-international.org/ecma-262/7.0/#sec-iteratorvalue',
	LocalTime: 'https://ecma-international.org/ecma-262/7.0/#sec-localtime',
	LoopContinues: 'https://ecma-international.org/ecma-262/7.0/#sec-loopcontinues',
	MakeArgGetter: 'https://ecma-international.org/ecma-262/7.0/#sec-makearggetter',
	MakeArgSetter: 'https://ecma-international.org/ecma-262/7.0/#sec-makeargsetter',
	MakeClassConstructor: 'https://ecma-international.org/ecma-262/7.0/#sec-makeclassconstructor',
	MakeConstructor: 'https://ecma-international.org/ecma-262/7.0/#sec-makeconstructor',
	MakeDate: 'https://ecma-international.org/ecma-262/7.0/#sec-makedate',
	MakeDay: 'https://ecma-international.org/ecma-262/7.0/#sec-makeday',
	MakeMethod: 'https://ecma-international.org/ecma-262/7.0/#sec-makemethod',
	MakeSuperPropertyReference: 'https://ecma-international.org/ecma-262/7.0/#sec-makesuperpropertyreference',
	MakeTime: 'https://ecma-international.org/ecma-262/7.0/#sec-maketime',
	max: 'https://ecma-international.org/ecma-262/7.0/#sec-algorithm-conventions',
	min: 'https://ecma-international.org/ecma-262/7.0/#sec-algorithm-conventions',
	MinFromTime: 'https://ecma-international.org/ecma-262/7.0/#sec-hours-minutes-second-and-milliseconds',
	ModuleNamespaceCreate: 'https://ecma-international.org/ecma-262/7.0/#sec-modulenamespacecreate',
	modulo: 'https://ecma-international.org/ecma-262/7.0/#sec-algorithm-conventions',
	MonthFromTime: 'https://ecma-international.org/ecma-262/7.0/#sec-month-number',
	msFromTime: 'https://ecma-international.org/ecma-262/7.0/#sec-hours-minutes-second-and-milliseconds',
	NewDeclarativeEnvironment: 'https://ecma-international.org/ecma-262/7.0/#sec-newdeclarativeenvironment',
	NewFunctionEnvironment: 'https://ecma-international.org/ecma-262/7.0/#sec-newfunctionenvironment',
	NewGlobalEnvironment: 'https://ecma-international.org/ecma-262/7.0/#sec-newglobalenvironment',
	NewModuleEnvironment: 'https://ecma-international.org/ecma-262/7.0/#sec-newmoduleenvironment',
	NewObjectEnvironment: 'https://ecma-international.org/ecma-262/7.0/#sec-newobjectenvironment',
	NewPromiseCapability: 'https://ecma-international.org/ecma-262/7.0/#sec-newpromisecapability',
	NextJob: 'https://ecma-international.org/ecma-262/7.0/#sec-nextjob-result',
	NormalCompletion: 'https://ecma-international.org/ecma-262/7.0/#sec-normalcompletion',
	ObjectCreate: 'https://ecma-international.org/ecma-262/7.0/#sec-objectcreate',
	ObjectDefineProperties: 'https://ecma-international.org/ecma-262/7.0/#sec-objectdefineproperties',
	OrdinaryCallBindThis: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinarycallbindthis',
	OrdinaryCallEvaluateBody: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinarycallevaluatebody',
	OrdinaryCreateFromConstructor: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinarycreatefromconstructor',
	OrdinaryDefineOwnProperty: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinarydefineownproperty',
	OrdinaryDelete: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinarydelete',
	OrdinaryGet: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinaryget',
	OrdinaryGetOwnProperty: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinarygetownproperty',
	OrdinaryGetPrototypeOf: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinarygetprototypeof',
	OrdinaryHasInstance: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinaryhasinstance',
	OrdinaryHasProperty: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinaryhasproperty',
	OrdinaryIsExtensible: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinaryisextensible',
	OrdinaryOwnPropertyKeys: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinaryownpropertykeys',
	OrdinaryPreventExtensions: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinarypreventextensions',
	OrdinarySet: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinaryset',
	OrdinarySetPrototypeOf: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinarysetprototypeof',
	ParseModule: 'https://ecma-international.org/ecma-262/7.0/#sec-parsemodule',
	ParseScript: 'https://ecma-international.org/ecma-262/7.0/#sec-parse-script',
	PerformEval: 'https://ecma-international.org/ecma-262/7.0/#sec-performeval',
	PerformPromiseAll: 'https://ecma-international.org/ecma-262/7.0/#sec-performpromiseall',
	PerformPromiseRace: 'https://ecma-international.org/ecma-262/7.0/#sec-performpromiserace',
	PerformPromiseThen: 'https://ecma-international.org/ecma-262/7.0/#sec-performpromisethen',
	PrepareForOrdinaryCall: 'https://ecma-international.org/ecma-262/7.0/#sec-prepareforordinarycall',
	PrepareForTailCall: 'https://ecma-international.org/ecma-262/7.0/#sec-preparefortailcall',
	PromiseReactionJob: 'https://ecma-international.org/ecma-262/7.0/#sec-promisereactionjob',
	PromiseResolveThenableJob: 'https://ecma-international.org/ecma-262/7.0/#sec-promiseresolvethenablejob',
	ProxyCreate: 'https://ecma-international.org/ecma-262/7.0/#sec-proxycreate',
	PutValue: 'https://ecma-international.org/ecma-262/7.0/#sec-putvalue',
	QuoteJSONString: 'https://ecma-international.org/ecma-262/7.0/#sec-quotejsonstring',
	RegExpAlloc: 'https://ecma-international.org/ecma-262/7.0/#sec-regexpalloc',
	RegExpBuiltinExec: 'https://ecma-international.org/ecma-262/7.0/#sec-regexpbuiltinexec',
	RegExpCreate: 'https://ecma-international.org/ecma-262/7.0/#sec-regexpcreate',
	RegExpExec: 'https://ecma-international.org/ecma-262/7.0/#sec-regexpexec',
	RegExpInitialize: 'https://ecma-international.org/ecma-262/7.0/#sec-regexpinitialize',
	RejectPromise: 'https://ecma-international.org/ecma-262/7.0/#sec-rejectpromise',
	RepeatMatcher: 'https://ecma-international.org/ecma-262/7.0/#sec-runtime-semantics-repeatmatcher-abstract-operation',
	RequireObjectCoercible: 'https://ecma-international.org/ecma-262/7.0/#sec-requireobjectcoercible',
	ResolveBinding: 'https://ecma-international.org/ecma-262/7.0/#sec-resolvebinding',
	ResolveThisBinding: 'https://ecma-international.org/ecma-262/7.0/#sec-resolvethisbinding',
	ReturnIfAbrupt: 'https://ecma-international.org/ecma-262/7.0/#sec-returnifabrupt',
	SameValue: 'https://ecma-international.org/ecma-262/7.0/#sec-samevalue',
	SameValueNonNumber: 'https://ecma-international.org/ecma-262/7.0/#sec-samevaluenonnumber',
	SameValueZero: 'https://ecma-international.org/ecma-262/7.0/#sec-samevaluezero',
	ScriptEvaluation: 'https://ecma-international.org/ecma-262/7.0/#sec-runtime-semantics-scriptevaluation',
	ScriptEvaluationJob: 'https://ecma-international.org/ecma-262/7.0/#sec-scriptevaluationjob',
	SecFromTime: 'https://ecma-international.org/ecma-262/7.0/#sec-hours-minutes-second-and-milliseconds',
	SerializeJSONArray: 'https://ecma-international.org/ecma-262/7.0/#sec-serializejsonarray',
	SerializeJSONObject: 'https://ecma-international.org/ecma-262/7.0/#sec-serializejsonobject',
	SerializeJSONProperty: 'https://ecma-international.org/ecma-262/7.0/#sec-serializejsonproperty',
	Set: 'https://ecma-international.org/ecma-262/7.0/#sec-set-o-p-v-throw',
	SetDefaultGlobalBindings: 'https://ecma-international.org/ecma-262/7.0/#sec-setdefaultglobalbindings',
	SetFunctionName: 'https://ecma-international.org/ecma-262/7.0/#sec-setfunctionname',
	SetIntegrityLevel: 'https://ecma-international.org/ecma-262/7.0/#sec-setintegritylevel',
	SetRealmGlobalObject: 'https://ecma-international.org/ecma-262/7.0/#sec-setrealmglobalobject',
	SetValueInBuffer: 'https://ecma-international.org/ecma-262/7.0/#sec-setvalueinbuffer',
	SetViewValue: 'https://ecma-international.org/ecma-262/7.0/#sec-setviewvalue',
	SortCompare: 'https://ecma-international.org/ecma-262/7.0/#sec-sortcompare',
	SpeciesConstructor: 'https://ecma-international.org/ecma-262/7.0/#sec-speciesconstructor',
	SplitMatch: 'https://ecma-international.org/ecma-262/7.0/#sec-splitmatch',
	'Strict Equality Comparison': 'https://ecma-international.org/ecma-262/7.0/#sec-strict-equality-comparison',
	StringCreate: 'https://ecma-international.org/ecma-262/7.0/#sec-stringcreate',
	SymbolDescriptiveString: 'https://ecma-international.org/ecma-262/7.0/#sec-symboldescriptivestring',
	TestIntegrityLevel: 'https://ecma-international.org/ecma-262/7.0/#sec-testintegritylevel',
	thisBooleanValue: 'https://ecma-international.org/ecma-262/7.0/#sec-thisbooleanvalue',
	thisNumberValue: 'https://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-number-prototype-object',
	thisStringValue: 'https://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-string-prototype-object',
	thisTimeValue: 'https://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-date-prototype-object',
	TimeClip: 'https://ecma-international.org/ecma-262/7.0/#sec-timeclip',
	TimeFromYear: 'https://ecma-international.org/ecma-262/7.0/#sec-year-number',
	TimeWithinDay: 'https://ecma-international.org/ecma-262/7.0/#sec-day-number-and-time-within-day',
	ToBoolean: 'https://ecma-international.org/ecma-262/7.0/#sec-toboolean',
	ToDateString: 'https://ecma-international.org/ecma-262/7.0/#sec-todatestring',
	ToInt16: 'https://ecma-international.org/ecma-262/7.0/#sec-toint16',
	ToInt32: 'https://ecma-international.org/ecma-262/7.0/#sec-toint32',
	ToInt8: 'https://ecma-international.org/ecma-262/7.0/#sec-toint8',
	ToInteger: 'https://ecma-international.org/ecma-262/7.0/#sec-tointeger',
	ToLength: 'https://ecma-international.org/ecma-262/7.0/#sec-tolength',
	ToNumber: 'https://ecma-international.org/ecma-262/7.0/#sec-tonumber',
	ToObject: 'https://ecma-international.org/ecma-262/7.0/#sec-toobject',
	TopLevelModuleEvaluationJob: 'https://ecma-international.org/ecma-262/7.0/#sec-toplevelmoduleevaluationjob',
	ToPrimitive: 'https://ecma-international.org/ecma-262/7.0/#sec-toprimitive',
	ToPropertyDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-topropertydescriptor',
	ToPropertyKey: 'https://ecma-international.org/ecma-262/7.0/#sec-topropertykey',
	ToString: 'https://ecma-international.org/ecma-262/7.0/#sec-tostring',
	'ToString Applied to the Number Type': 'https://ecma-international.org/ecma-262/7.0/#sec-tostring-applied-to-the-number-type',
	ToUint16: 'https://ecma-international.org/ecma-262/7.0/#sec-touint16',
	ToUint32: 'https://ecma-international.org/ecma-262/7.0/#sec-touint32',
	ToUint8: 'https://ecma-international.org/ecma-262/7.0/#sec-touint8',
	ToUint8Clamp: 'https://ecma-international.org/ecma-262/7.0/#sec-touint8clamp',
	TriggerPromiseReactions: 'https://ecma-international.org/ecma-262/7.0/#sec-triggerpromisereactions',
	Type: 'https://ecma-international.org/ecma-262/7.0/#sec-ecmascript-data-types-and-values',
	TypedArrayCreate: 'https://ecma-international.org/ecma-262/7.0/#typedarray-create',
	TypedArraySpeciesCreate: 'https://ecma-international.org/ecma-262/7.0/#typedarray-species-create',
	UpdateEmpty: 'https://ecma-international.org/ecma-262/7.0/#sec-updateempty',
	UTC: 'https://ecma-international.org/ecma-262/7.0/#sec-utc-t',
	UTF16Decode: 'https://ecma-international.org/ecma-262/7.0/#sec-utf16decode',
	UTF16Encoding: 'https://ecma-international.org/ecma-262/7.0/#sec-utf16encoding',
	ValidateAndApplyPropertyDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-validateandapplypropertydescriptor',
	ValidateTypedArray: 'https://ecma-international.org/ecma-262/7.0/#sec-validatetypedarray',
	WeekDay: 'https://ecma-international.org/ecma-262/7.0/#sec-week-day',
	YearFromTime: 'https://ecma-international.org/ecma-262/7.0/#sec-year-number'
};
'use strict';

module.exports = {
	IsPropertyDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type', // not actually an abstract op

	abs: 'https://ecma-international.org/ecma-262/8.0/#eqn-abs',
	'Abstract Equality Comparison': 'https://ecma-international.org/ecma-262/8.0/#sec-abstract-equality-comparison',
	'Abstract Relational Comparison': 'https://ecma-international.org/ecma-262/8.0/#sec-abstract-relational-comparison',
	AddRestrictedFunctionProperties: 'https://ecma-international.org/ecma-262/8.0/#sec-addrestrictedfunctionproperties',
	AddWaiter: 'https://ecma-international.org/ecma-262/8.0/#sec-addwaiter',
	AdvanceStringIndex: 'https://ecma-international.org/ecma-262/8.0/#sec-advancestringindex',
	'agent-order': 'https://ecma-international.org/ecma-262/8.0/#sec-agent-order',
	AgentCanSuspend: 'https://ecma-international.org/ecma-262/8.0/#sec-agentcansuspend',
	AgentSignifier: 'https://ecma-international.org/ecma-262/8.0/#sec-agentsignifier',
	AllocateArrayBuffer: 'https://ecma-international.org/ecma-262/8.0/#sec-allocatearraybuffer',
	AllocateSharedArrayBuffer: 'https://ecma-international.org/ecma-262/8.0/#sec-allocatesharedarraybuffer',
	AllocateTypedArray: 'https://ecma-international.org/ecma-262/8.0/#sec-allocatetypedarray',
	AllocateTypedArrayBuffer: 'https://ecma-international.org/ecma-262/8.0/#sec-allocatetypedarraybuffer',
	ArrayCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-arraycreate',
	ArraySetLength: 'https://ecma-international.org/ecma-262/8.0/#sec-arraysetlength',
	ArraySpeciesCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-arrayspeciescreate',
	AsyncFunctionAwait: 'https://ecma-international.org/ecma-262/8.0/#sec-async-functions-abstract-operations-async-function-await',
	AsyncFunctionCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-async-functions-abstract-operations-async-function-create',
	AsyncFunctionStart: 'https://ecma-international.org/ecma-262/8.0/#sec-async-functions-abstract-operations-async-function-start',
	AtomicLoad: 'https://ecma-international.org/ecma-262/8.0/#sec-atomicload',
	AtomicReadModifyWrite: 'https://ecma-international.org/ecma-262/8.0/#sec-atomicreadmodifywrite',
	BlockDeclarationInstantiation: 'https://ecma-international.org/ecma-262/8.0/#sec-blockdeclarationinstantiation',
	BoundFunctionCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-boundfunctioncreate',
	Call: 'https://ecma-international.org/ecma-262/8.0/#sec-call',
	Canonicalize: 'https://ecma-international.org/ecma-262/8.0/#sec-runtime-semantics-canonicalize-ch',
	CanonicalNumericIndexString: 'https://ecma-international.org/ecma-262/8.0/#sec-canonicalnumericindexstring',
	CharacterRange: 'https://ecma-international.org/ecma-262/8.0/#sec-runtime-semantics-characterrange-abstract-operation',
	CharacterRangeOrUnion: 'https://ecma-international.org/ecma-262/8.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation',
	CharacterSetMatcher: 'https://ecma-international.org/ecma-262/8.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation',
	CloneArrayBuffer: 'https://ecma-international.org/ecma-262/8.0/#sec-clonearraybuffer',
	CompletePropertyDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-completepropertydescriptor',
	Completion: 'https://ecma-international.org/ecma-262/8.0/#sec-completion-record-specification-type',
	ComposeWriteEventBytes: 'https://ecma-international.org/ecma-262/8.0/#sec-composewriteeventbytes',
	Construct: 'https://ecma-international.org/ecma-262/8.0/#sec-construct',
	CopyDataBlockBytes: 'https://ecma-international.org/ecma-262/8.0/#sec-copydatablockbytes',
	CreateArrayFromList: 'https://ecma-international.org/ecma-262/8.0/#sec-createarrayfromlist',
	CreateArrayIterator: 'https://ecma-international.org/ecma-262/8.0/#sec-createarrayiterator',
	CreateBuiltinFunction: 'https://ecma-international.org/ecma-262/8.0/#sec-createbuiltinfunction',
	CreateByteDataBlock: 'https://ecma-international.org/ecma-262/8.0/#sec-createbytedatablock',
	CreateDataProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-createdataproperty',
	CreateDataPropertyOrThrow: 'https://ecma-international.org/ecma-262/8.0/#sec-createdatapropertyorthrow',
	CreateDynamicFunction: 'https://ecma-international.org/ecma-262/8.0/#sec-createdynamicfunction',
	CreateHTML: 'https://ecma-international.org/ecma-262/8.0/#sec-createhtml',
	CreateIntrinsics: 'https://ecma-international.org/ecma-262/8.0/#sec-createintrinsics',
	CreateIterResultObject: 'https://ecma-international.org/ecma-262/8.0/#sec-createiterresultobject',
	CreateListFromArrayLike: 'https://ecma-international.org/ecma-262/8.0/#sec-createlistfromarraylike',
	CreateListIterator: 'https://ecma-international.org/ecma-262/8.0/#sec-createlistiterator',
	CreateMapIterator: 'https://ecma-international.org/ecma-262/8.0/#sec-createmapiterator',
	CreateMappedArgumentsObject: 'https://ecma-international.org/ecma-262/8.0/#sec-createmappedargumentsobject',
	CreateMethodProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-createmethodproperty',
	CreatePerIterationEnvironment: 'https://ecma-international.org/ecma-262/8.0/#sec-createperiterationenvironment',
	CreateRealm: 'https://ecma-international.org/ecma-262/8.0/#sec-createrealm',
	CreateResolvingFunctions: 'https://ecma-international.org/ecma-262/8.0/#sec-createresolvingfunctions',
	CreateSetIterator: 'https://ecma-international.org/ecma-262/8.0/#sec-createsetiterator',
	CreateSharedByteDataBlock: 'https://ecma-international.org/ecma-262/8.0/#sec-createsharedbytedatablock',
	CreateStringIterator: 'https://ecma-international.org/ecma-262/8.0/#sec-createstringiterator',
	CreateUnmappedArgumentsObject: 'https://ecma-international.org/ecma-262/8.0/#sec-createunmappedargumentsobject',
	DateFromTime: 'https://ecma-international.org/ecma-262/8.0/#sec-date-number',
	Day: 'https://ecma-international.org/ecma-262/8.0/#eqn-Day',
	DayFromYear: 'https://ecma-international.org/ecma-262/8.0/#eqn-DaysFromYear',
	DaysInYear: 'https://ecma-international.org/ecma-262/8.0/#eqn-DaysInYear',
	DayWithinYear: 'https://ecma-international.org/ecma-262/8.0/#eqn-DayWithinYear',
	Decode: 'https://ecma-international.org/ecma-262/8.0/#sec-decode',
	DefinePropertyOrThrow: 'https://ecma-international.org/ecma-262/8.0/#sec-definepropertyorthrow',
	DeletePropertyOrThrow: 'https://ecma-international.org/ecma-262/8.0/#sec-deletepropertyorthrow',
	DetachArrayBuffer: 'https://ecma-international.org/ecma-262/8.0/#sec-detacharraybuffer',
	Encode: 'https://ecma-international.org/ecma-262/8.0/#sec-encode',
	EnqueueJob: 'https://ecma-international.org/ecma-262/8.0/#sec-enqueuejob',
	EnterCriticalSection: 'https://ecma-international.org/ecma-262/8.0/#sec-entercriticalsection',
	EnumerableOwnProperties: 'https://ecma-international.org/ecma-262/8.0/#sec-enumerableownproperties',
	EnumerateObjectProperties: 'https://ecma-international.org/ecma-262/8.0/#sec-enumerate-object-properties',
	EscapeRegExpPattern: 'https://ecma-international.org/ecma-262/8.0/#sec-escaperegexppattern',
	EvalDeclarationInstantiation: 'https://ecma-international.org/ecma-262/8.0/#sec-evaldeclarationinstantiation',
	EvaluateCall: 'https://ecma-international.org/ecma-262/8.0/#sec-evaluatecall',
	EvaluateDirectCall: 'https://ecma-international.org/ecma-262/8.0/#sec-evaluatedirectcall',
	EvaluateNew: 'https://ecma-international.org/ecma-262/8.0/#sec-evaluatenew',
	EventSet: 'https://ecma-international.org/ecma-262/8.0/#sec-event-set',
	floor: 'https://ecma-international.org/ecma-262/8.0/#eqn-floor',
	ForBodyEvaluation: 'https://ecma-international.org/ecma-262/8.0/#sec-forbodyevaluation',
	'ForIn/OfBodyEvaluation': 'https://ecma-international.org/ecma-262/8.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset',
	'ForIn/OfHeadEvaluation': 'https://ecma-international.org/ecma-262/8.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind',
	FromPropertyDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-frompropertydescriptor',
	FulfillPromise: 'https://ecma-international.org/ecma-262/8.0/#sec-fulfillpromise',
	FunctionAllocate: 'https://ecma-international.org/ecma-262/8.0/#sec-functionallocate',
	FunctionCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-functioncreate',
	FunctionDeclarationInstantiation: 'https://ecma-international.org/ecma-262/8.0/#sec-functiondeclarationinstantiation',
	FunctionInitialize: 'https://ecma-international.org/ecma-262/8.0/#sec-functioninitialize',
	GeneratorFunctionCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-generatorfunctioncreate',
	GeneratorResume: 'https://ecma-international.org/ecma-262/8.0/#sec-generatorresume',
	GeneratorResumeAbrupt: 'https://ecma-international.org/ecma-262/8.0/#sec-generatorresumeabrupt',
	GeneratorStart: 'https://ecma-international.org/ecma-262/8.0/#sec-generatorstart',
	GeneratorValidate: 'https://ecma-international.org/ecma-262/8.0/#sec-generatorvalidate',
	GeneratorYield: 'https://ecma-international.org/ecma-262/8.0/#sec-generatoryield',
	Get: 'https://ecma-international.org/ecma-262/8.0/#sec-get-o-p',
	GetActiveScriptOrModule: 'https://ecma-international.org/ecma-262/8.0/#sec-getactivescriptormodule',
	GetBase: 'https://ecma-international.org/ecma-262/8.0/#ao-getbase',
	GetFunctionRealm: 'https://ecma-international.org/ecma-262/8.0/#sec-getfunctionrealm',
	GetGlobalObject: 'https://ecma-international.org/ecma-262/8.0/#sec-getglobalobject',
	GetIdentifierReference: 'https://ecma-international.org/ecma-262/8.0/#sec-getidentifierreference',
	GetIterator: 'https://ecma-international.org/ecma-262/8.0/#sec-getiterator',
	GetMethod: 'https://ecma-international.org/ecma-262/8.0/#sec-getmethod',
	GetModifySetValueInBuffer: 'https://ecma-international.org/ecma-262/8.0/#sec-getmodifysetvalueinbuffer',
	GetModuleNamespace: 'https://ecma-international.org/ecma-262/8.0/#sec-getmodulenamespace',
	GetNewTarget: 'https://ecma-international.org/ecma-262/8.0/#sec-getnewtarget',
	GetOwnPropertyKeys: 'https://ecma-international.org/ecma-262/8.0/#sec-getownpropertykeys',
	GetPrototypeFromConstructor: 'https://ecma-international.org/ecma-262/8.0/#sec-getprototypefromconstructor',
	GetReferencedName: 'https://ecma-international.org/ecma-262/8.0/#ao-getreferencedname',
	GetSubstitution: 'https://ecma-international.org/ecma-262/8.0/#sec-getsubstitution',
	GetSuperConstructor: 'https://ecma-international.org/ecma-262/8.0/#sec-getsuperconstructor',
	GetTemplateObject: 'https://ecma-international.org/ecma-262/8.0/#sec-gettemplateobject',
	GetThisEnvironment: 'https://ecma-international.org/ecma-262/8.0/#sec-getthisenvironment',
	GetThisValue: 'https://ecma-international.org/ecma-262/8.0/#sec-getthisvalue',
	GetV: 'https://ecma-international.org/ecma-262/8.0/#sec-getv',
	GetValue: 'https://ecma-international.org/ecma-262/8.0/#sec-getvalue',
	GetValueFromBuffer: 'https://ecma-international.org/ecma-262/8.0/#sec-getvaluefrombuffer',
	GetViewValue: 'https://ecma-international.org/ecma-262/8.0/#sec-getviewvalue',
	GetWaiterList: 'https://ecma-international.org/ecma-262/8.0/#sec-getwaiterlist',
	GlobalDeclarationInstantiation: 'https://ecma-international.org/ecma-262/8.0/#sec-globaldeclarationinstantiation',
	'happens-before': 'https://ecma-international.org/ecma-262/8.0/#sec-happens-before',
	HasOwnProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-hasownproperty',
	HasPrimitiveBase: 'https://ecma-international.org/ecma-262/8.0/#ao-hasprimitivebase',
	HasProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-hasproperty',
	'host-synchronizes-with': 'https://ecma-international.org/ecma-262/8.0/#sec-host-synchronizes-with',
	HostEnsureCanCompileStrings: 'https://ecma-international.org/ecma-262/8.0/#sec-hostensurecancompilestrings',
	HostEventSet: 'https://ecma-international.org/ecma-262/8.0/#sec-hosteventset',
	HostPromiseRejectionTracker: 'https://ecma-international.org/ecma-262/8.0/#sec-host-promise-rejection-tracker',
	HostReportErrors: 'https://ecma-international.org/ecma-262/8.0/#sec-host-report-errors',
	HostResolveImportedModule: 'https://ecma-international.org/ecma-262/8.0/#sec-hostresolveimportedmodule',
	HourFromTime: 'https://ecma-international.org/ecma-262/8.0/#eqn-HourFromTime',
	IfAbruptRejectPromise: 'https://ecma-international.org/ecma-262/8.0/#sec-ifabruptrejectpromise',
	ImportedLocalNames: 'https://ecma-international.org/ecma-262/8.0/#sec-importedlocalnames',
	InitializeBoundName: 'https://ecma-international.org/ecma-262/8.0/#sec-initializeboundname',
	InitializeHostDefinedRealm: 'https://ecma-international.org/ecma-262/8.0/#sec-initializehostdefinedrealm',
	InitializeReferencedBinding: 'https://ecma-international.org/ecma-262/8.0/#sec-initializereferencedbinding',
	InLeapYear: 'https://ecma-international.org/ecma-262/8.0/#eqn-InLeapYear',
	InstanceofOperator: 'https://ecma-international.org/ecma-262/8.0/#sec-instanceofoperator',
	IntegerIndexedElementGet: 'https://ecma-international.org/ecma-262/8.0/#sec-integerindexedelementget',
	IntegerIndexedElementSet: 'https://ecma-international.org/ecma-262/8.0/#sec-integerindexedelementset',
	IntegerIndexedObjectCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-integerindexedobjectcreate',
	InternalizeJSONProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-internalizejsonproperty',
	Invoke: 'https://ecma-international.org/ecma-262/8.0/#sec-invoke',
	IsAccessorDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-isaccessordescriptor',
	IsAnonymousFunctionDefinition: 'https://ecma-international.org/ecma-262/8.0/#sec-isanonymousfunctiondefinition',
	IsArray: 'https://ecma-international.org/ecma-262/8.0/#sec-isarray',
	IsCallable: 'https://ecma-international.org/ecma-262/8.0/#sec-iscallable',
	IsCompatiblePropertyDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-iscompatiblepropertydescriptor',
	IsConcatSpreadable: 'https://ecma-international.org/ecma-262/8.0/#sec-isconcatspreadable',
	IsConstructor: 'https://ecma-international.org/ecma-262/8.0/#sec-isconstructor',
	IsDataDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-isdatadescriptor',
	IsDetachedBuffer: 'https://ecma-international.org/ecma-262/8.0/#sec-isdetachedbuffer',
	IsExtensible: 'https://ecma-international.org/ecma-262/8.0/#sec-isextensible-o',
	IsGenericDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-isgenericdescriptor',
	IsInTailPosition: 'https://ecma-international.org/ecma-262/8.0/#sec-isintailposition',
	IsInteger: 'https://ecma-international.org/ecma-262/8.0/#sec-isinteger',
	IsLabelledFunction: 'https://ecma-international.org/ecma-262/8.0/#sec-islabelledfunction',
	IsPromise: 'https://ecma-international.org/ecma-262/8.0/#sec-ispromise',
	IsPropertyKey: 'https://ecma-international.org/ecma-262/8.0/#sec-ispropertykey',
	IsPropertyReference: 'https://ecma-international.org/ecma-262/8.0/#ao-ispropertyreference',
	IsRegExp: 'https://ecma-international.org/ecma-262/8.0/#sec-isregexp',
	IsSharedArrayBuffer: 'https://ecma-international.org/ecma-262/8.0/#sec-issharedarraybuffer',
	IsStrictReference: 'https://ecma-international.org/ecma-262/8.0/#ao-isstrictreference',
	IsSuperReference: 'https://ecma-international.org/ecma-262/8.0/#ao-issuperreference',
	IsUnresolvableReference: 'https://ecma-international.org/ecma-262/8.0/#ao-isunresolvablereference',
	IsWordChar: 'https://ecma-international.org/ecma-262/8.0/#sec-runtime-semantics-iswordchar-abstract-operation',
	IterableToList: 'https://ecma-international.org/ecma-262/8.0/#sec-iterabletolist',
	IteratorClose: 'https://ecma-international.org/ecma-262/8.0/#sec-iteratorclose',
	IteratorComplete: 'https://ecma-international.org/ecma-262/8.0/#sec-iteratorcomplete',
	IteratorNext: 'https://ecma-international.org/ecma-262/8.0/#sec-iteratornext',
	IteratorStep: 'https://ecma-international.org/ecma-262/8.0/#sec-iteratorstep',
	IteratorValue: 'https://ecma-international.org/ecma-262/8.0/#sec-iteratorvalue',
	LeaveCriticalSection: 'https://ecma-international.org/ecma-262/8.0/#sec-leavecriticalsection',
	LocalTime: 'https://ecma-international.org/ecma-262/8.0/#sec-localtime',
	LoopContinues: 'https://ecma-international.org/ecma-262/8.0/#sec-loopcontinues',
	MakeArgGetter: 'https://ecma-international.org/ecma-262/8.0/#sec-makearggetter',
	MakeArgSetter: 'https://ecma-international.org/ecma-262/8.0/#sec-makeargsetter',
	MakeClassConstructor: 'https://ecma-international.org/ecma-262/8.0/#sec-makeclassconstructor',
	MakeConstructor: 'https://ecma-international.org/ecma-262/8.0/#sec-makeconstructor',
	MakeDate: 'https://ecma-international.org/ecma-262/8.0/#sec-makedate',
	MakeDay: 'https://ecma-international.org/ecma-262/8.0/#sec-makeday',
	MakeMethod: 'https://ecma-international.org/ecma-262/8.0/#sec-makemethod',
	MakeSuperPropertyReference: 'https://ecma-international.org/ecma-262/8.0/#sec-makesuperpropertyreference',
	MakeTime: 'https://ecma-international.org/ecma-262/8.0/#sec-maketime',
	max: 'https://ecma-international.org/ecma-262/8.0/#eqn-max',
	'memory-order': 'https://ecma-international.org/ecma-262/8.0/#sec-memory-order',
	min: 'https://ecma-international.org/ecma-262/8.0/#eqn-min',
	MinFromTime: 'https://ecma-international.org/ecma-262/8.0/#eqn-MinFromTime',
	ModuleNamespaceCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-modulenamespacecreate',
	modulo: 'https://ecma-international.org/ecma-262/8.0/#eqn-modulo',
	MonthFromTime: 'https://ecma-international.org/ecma-262/8.0/#eqn-MonthFromTime',
	msFromTime: 'https://ecma-international.org/ecma-262/8.0/#eqn-msFromTime',
	NewDeclarativeEnvironment: 'https://ecma-international.org/ecma-262/8.0/#sec-newdeclarativeenvironment',
	NewFunctionEnvironment: 'https://ecma-international.org/ecma-262/8.0/#sec-newfunctionenvironment',
	NewGlobalEnvironment: 'https://ecma-international.org/ecma-262/8.0/#sec-newglobalenvironment',
	NewModuleEnvironment: 'https://ecma-international.org/ecma-262/8.0/#sec-newmoduleenvironment',
	NewObjectEnvironment: 'https://ecma-international.org/ecma-262/8.0/#sec-newobjectenvironment',
	NewPromiseCapability: 'https://ecma-international.org/ecma-262/8.0/#sec-newpromisecapability',
	NormalCompletion: 'https://ecma-international.org/ecma-262/8.0/#sec-normalcompletion',
	NumberToRawBytes: 'https://ecma-international.org/ecma-262/8.0/#sec-numbertorawbytes',
	ObjectCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-objectcreate',
	ObjectDefineProperties: 'https://ecma-international.org/ecma-262/8.0/#sec-objectdefineproperties',
	OrdinaryCallBindThis: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinarycallbindthis',
	OrdinaryCallEvaluateBody: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinarycallevaluatebody',
	OrdinaryCreateFromConstructor: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinarycreatefromconstructor',
	OrdinaryDefineOwnProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinarydefineownproperty',
	OrdinaryDelete: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinarydelete',
	OrdinaryGet: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinaryget',
	OrdinaryGetOwnProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinarygetownproperty',
	OrdinaryGetPrototypeOf: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinarygetprototypeof',
	OrdinaryHasInstance: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinaryhasinstance',
	OrdinaryHasProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinaryhasproperty',
	OrdinaryIsExtensible: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinaryisextensible',
	OrdinaryOwnPropertyKeys: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinaryownpropertykeys',
	OrdinaryPreventExtensions: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinarypreventextensions',
	OrdinarySet: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinaryset',
	OrdinarySetPrototypeOf: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinarysetprototypeof',
	OrdinaryToPrimitive: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinarytoprimitive',
	ParseModule: 'https://ecma-international.org/ecma-262/8.0/#sec-parsemodule',
	ParseScript: 'https://ecma-international.org/ecma-262/8.0/#sec-parse-script',
	PerformEval: 'https://ecma-international.org/ecma-262/8.0/#sec-performeval',
	PerformPromiseAll: 'https://ecma-international.org/ecma-262/8.0/#sec-performpromiseall',
	PerformPromiseRace: 'https://ecma-international.org/ecma-262/8.0/#sec-performpromiserace',
	PerformPromiseThen: 'https://ecma-international.org/ecma-262/8.0/#sec-performpromisethen',
	PrepareForOrdinaryCall: 'https://ecma-international.org/ecma-262/8.0/#sec-prepareforordinarycall',
	PrepareForTailCall: 'https://ecma-international.org/ecma-262/8.0/#sec-preparefortailcall',
	PromiseReactionJob: 'https://ecma-international.org/ecma-262/8.0/#sec-promisereactionjob',
	PromiseResolveThenableJob: 'https://ecma-international.org/ecma-262/8.0/#sec-promiseresolvethenablejob',
	ProxyCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-proxycreate',
	PutValue: 'https://ecma-international.org/ecma-262/8.0/#sec-putvalue',
	QuoteJSONString: 'https://ecma-international.org/ecma-262/8.0/#sec-quotejsonstring',
	RawBytesToNumber: 'https://ecma-international.org/ecma-262/8.0/#sec-rawbytestonumber',
	'reads-bytes-from': 'https://ecma-international.org/ecma-262/8.0/#sec-reads-bytes-from',
	'reads-from': 'https://ecma-international.org/ecma-262/8.0/#sec-reads-from',
	RegExpAlloc: 'https://ecma-international.org/ecma-262/8.0/#sec-regexpalloc',
	RegExpBuiltinExec: 'https://ecma-international.org/ecma-262/8.0/#sec-regexpbuiltinexec',
	RegExpCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-regexpcreate',
	RegExpExec: 'https://ecma-international.org/ecma-262/8.0/#sec-regexpexec',
	RegExpInitialize: 'https://ecma-international.org/ecma-262/8.0/#sec-regexpinitialize',
	RejectPromise: 'https://ecma-international.org/ecma-262/8.0/#sec-rejectpromise',
	RemoveWaiter: 'https://ecma-international.org/ecma-262/8.0/#sec-removewaiter',
	RemoveWaiters: 'https://ecma-international.org/ecma-262/8.0/#sec-removewaiters',
	RepeatMatcher: 'https://ecma-international.org/ecma-262/8.0/#sec-runtime-semantics-repeatmatcher-abstract-operation',
	RequireObjectCoercible: 'https://ecma-international.org/ecma-262/8.0/#sec-requireobjectcoercible',
	ResolveBinding: 'https://ecma-international.org/ecma-262/8.0/#sec-resolvebinding',
	ResolveThisBinding: 'https://ecma-international.org/ecma-262/8.0/#sec-resolvethisbinding',
	ReturnIfAbrupt: 'https://ecma-international.org/ecma-262/8.0/#sec-returnifabrupt',
	RunJobs: 'https://ecma-international.org/ecma-262/8.0/#sec-runjobs',
	SameValue: 'https://ecma-international.org/ecma-262/8.0/#sec-samevalue',
	SameValueNonNumber: 'https://ecma-international.org/ecma-262/8.0/#sec-samevaluenonnumber',
	SameValueZero: 'https://ecma-international.org/ecma-262/8.0/#sec-samevaluezero',
	ScriptEvaluation: 'https://ecma-international.org/ecma-262/8.0/#sec-runtime-semantics-scriptevaluation',
	ScriptEvaluationJob: 'https://ecma-international.org/ecma-262/8.0/#sec-scriptevaluationjob',
	SecFromTime: 'https://ecma-international.org/ecma-262/8.0/#eqn-SecFromTime',
	SerializeJSONArray: 'https://ecma-international.org/ecma-262/8.0/#sec-serializejsonarray',
	SerializeJSONObject: 'https://ecma-international.org/ecma-262/8.0/#sec-serializejsonobject',
	SerializeJSONProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-serializejsonproperty',
	Set: 'https://ecma-international.org/ecma-262/8.0/#sec-set-o-p-v-throw',
	SetDefaultGlobalBindings: 'https://ecma-international.org/ecma-262/8.0/#sec-setdefaultglobalbindings',
	SetFunctionName: 'https://ecma-international.org/ecma-262/8.0/#sec-setfunctionname',
	SetImmutablePrototype: 'https://ecma-international.org/ecma-262/8.0/#sec-set-immutable-prototype',
	SetIntegrityLevel: 'https://ecma-international.org/ecma-262/8.0/#sec-setintegritylevel',
	SetRealmGlobalObject: 'https://ecma-international.org/ecma-262/8.0/#sec-setrealmglobalobject',
	SetValueInBuffer: 'https://ecma-international.org/ecma-262/8.0/#sec-setvalueinbuffer',
	SetViewValue: 'https://ecma-international.org/ecma-262/8.0/#sec-setviewvalue',
	SharedDataBlockEventSet: 'https://ecma-international.org/ecma-262/8.0/#sec-sharedatablockeventset',
	SortCompare: 'https://ecma-international.org/ecma-262/8.0/#sec-sortcompare',
	SpeciesConstructor: 'https://ecma-international.org/ecma-262/8.0/#sec-speciesconstructor',
	SplitMatch: 'https://ecma-international.org/ecma-262/8.0/#sec-splitmatch',
	'Strict Equality Comparison': 'https://ecma-international.org/ecma-262/8.0/#sec-strict-equality-comparison',
	StringCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-stringcreate',
	StringGetOwnProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-stringgetownproperty',
	Suspend: 'https://ecma-international.org/ecma-262/8.0/#sec-suspend',
	SymbolDescriptiveString: 'https://ecma-international.org/ecma-262/8.0/#sec-symboldescriptivestring',
	'synchronizes-with': 'https://ecma-international.org/ecma-262/8.0/#sec-synchronizes-with',
	TestIntegrityLevel: 'https://ecma-international.org/ecma-262/8.0/#sec-testintegritylevel',
	thisBooleanValue: 'https://ecma-international.org/ecma-262/8.0/#sec-thisbooleanvalue',
	thisNumberValue: 'https://ecma-international.org/ecma-262/8.0/#sec-thisnumbervalue',
	thisStringValue: 'https://ecma-international.org/ecma-262/8.0/#sec-thisstringvalue',
	thisTimeValue: 'https://ecma-international.org/ecma-262/8.0/#sec-thistimevalue',
	TimeClip: 'https://ecma-international.org/ecma-262/8.0/#sec-timeclip',
	TimeFromYear: 'https://ecma-international.org/ecma-262/8.0/#eqn-TimeFromYear',
	TimeWithinDay: 'https://ecma-international.org/ecma-262/8.0/#eqn-TimeWithinDay',
	ToBoolean: 'https://ecma-international.org/ecma-262/8.0/#sec-toboolean',
	ToDateString: 'https://ecma-international.org/ecma-262/8.0/#sec-todatestring',
	ToIndex: 'https://ecma-international.org/ecma-262/8.0/#sec-toindex',
	ToInt16: 'https://ecma-international.org/ecma-262/8.0/#sec-toint16',
	ToInt32: 'https://ecma-international.org/ecma-262/8.0/#sec-toint32',
	ToInt8: 'https://ecma-international.org/ecma-262/8.0/#sec-toint8',
	ToInteger: 'https://ecma-international.org/ecma-262/8.0/#sec-tointeger',
	ToLength: 'https://ecma-international.org/ecma-262/8.0/#sec-tolength',
	ToNumber: 'https://ecma-international.org/ecma-262/8.0/#sec-tonumber',
	ToObject: 'https://ecma-international.org/ecma-262/8.0/#sec-toobject',
	TopLevelModuleEvaluationJob: 'https://ecma-international.org/ecma-262/8.0/#sec-toplevelmoduleevaluationjob',
	ToPrimitive: 'https://ecma-international.org/ecma-262/8.0/#sec-toprimitive',
	ToPropertyDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-topropertydescriptor',
	ToPropertyKey: 'https://ecma-international.org/ecma-262/8.0/#sec-topropertykey',
	ToString: 'https://ecma-international.org/ecma-262/8.0/#sec-tostring',
	'ToString Applied to the Number Type': 'https://ecma-international.org/ecma-262/8.0/#sec-tostring-applied-to-the-number-type',
	ToUint16: 'https://ecma-international.org/ecma-262/8.0/#sec-touint16',
	ToUint32: 'https://ecma-international.org/ecma-262/8.0/#sec-touint32',
	ToUint8: 'https://ecma-international.org/ecma-262/8.0/#sec-touint8',
	ToUint8Clamp: 'https://ecma-international.org/ecma-262/8.0/#sec-touint8clamp',
	TriggerPromiseReactions: 'https://ecma-international.org/ecma-262/8.0/#sec-triggerpromisereactions',
	Type: 'https://ecma-international.org/ecma-262/8.0/#sec-ecmascript-data-types-and-values',
	TypedArrayCreate: 'https://ecma-international.org/ecma-262/8.0/#typedarray-create',
	TypedArraySpeciesCreate: 'https://ecma-international.org/ecma-262/8.0/#typedarray-species-create',
	UpdateEmpty: 'https://ecma-international.org/ecma-262/8.0/#sec-updateempty',
	UTC: 'https://ecma-international.org/ecma-262/8.0/#sec-utc-t',
	UTF16Decode: 'https://ecma-international.org/ecma-262/8.0/#sec-utf16decode',
	UTF16Encoding: 'https://ecma-international.org/ecma-262/8.0/#sec-utf16encoding',
	ValidateAndApplyPropertyDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor',
	ValidateAtomicAccess: 'https://ecma-international.org/ecma-262/8.0/#sec-validateatomicaccess',
	ValidateSharedIntegerTypedArray: 'https://ecma-international.org/ecma-262/8.0/#sec-validatesharedintegertypedarray',
	ValidateTypedArray: 'https://ecma-international.org/ecma-262/8.0/#sec-validatetypedarray',
	ValueOfReadEvent: 'https://ecma-international.org/ecma-262/8.0/#sec-valueofreadevent',
	WakeWaiter: 'https://ecma-international.org/ecma-262/8.0/#sec-wakewaiter',
	WeekDay: 'https://ecma-international.org/ecma-262/8.0/#sec-week-day',
	WordCharacters: 'https://ecma-international.org/ecma-262/8.0/#sec-runtime-semantics-wordcharacters-abstract-operation',
	YearFromTime: 'https://ecma-international.org/ecma-262/8.0/#eqn-YearFromTime'
};
'use strict';

module.exports = {
	abs: 'https://ecma-international.org/ecma-262/9.0/#eqn-abs',
	'Abstract Equality Comparison': 'https://ecma-international.org/ecma-262/9.0/#sec-abstract-equality-comparison',
	'Abstract Relational Comparison': 'https://ecma-international.org/ecma-262/9.0/#sec-abstract-relational-comparison',
	AddRestrictedFunctionProperties: 'https://ecma-international.org/ecma-262/9.0/#sec-addrestrictedfunctionproperties',
	AddWaiter: 'https://ecma-international.org/ecma-262/9.0/#sec-addwaiter',
	AdvanceStringIndex: 'https://ecma-international.org/ecma-262/9.0/#sec-advancestringindex',
	'agent-order': 'https://ecma-international.org/ecma-262/9.0/#sec-agent-order',
	AgentCanSuspend: 'https://ecma-international.org/ecma-262/9.0/#sec-agentcansuspend',
	AgentSignifier: 'https://ecma-international.org/ecma-262/9.0/#sec-agentsignifier',
	AllocateArrayBuffer: 'https://ecma-international.org/ecma-262/9.0/#sec-allocatearraybuffer',
	AllocateSharedArrayBuffer: 'https://ecma-international.org/ecma-262/9.0/#sec-allocatesharedarraybuffer',
	AllocateTypedArray: 'https://ecma-international.org/ecma-262/9.0/#sec-allocatetypedarray',
	AllocateTypedArrayBuffer: 'https://ecma-international.org/ecma-262/9.0/#sec-allocatetypedarraybuffer',
	ArrayCreate: 'https://ecma-international.org/ecma-262/9.0/#sec-arraycreate',
	ArraySetLength: 'https://ecma-international.org/ecma-262/9.0/#sec-arraysetlength',
	ArraySpeciesCreate: 'https://ecma-international.org/ecma-262/9.0/#sec-arrayspeciescreate',
	AsyncFunctionCreate: 'https://ecma-international.org/ecma-262/9.0/#sec-async-functions-abstract-operations-async-function-create',
	AsyncFunctionStart: 'https://ecma-international.org/ecma-262/9.0/#sec-async-functions-abstract-operations-async-function-start',
	AsyncGeneratorEnqueue: 'https://ecma-international.org/ecma-262/9.0/#sec-asyncgeneratorenqueue',
	AsyncGeneratorFunctionCreate: 'https://ecma-international.org/ecma-262/9.0/#sec-asyncgeneratorfunctioncreate',
	AsyncGeneratorReject: 'https://ecma-international.org/ecma-262/9.0/#sec-asyncgeneratorreject',
	AsyncGeneratorResolve: 'https://ecma-international.org/ecma-262/9.0/#sec-asyncgeneratorresolve',
	AsyncGeneratorResumeNext: 'https://ecma-international.org/ecma-262/9.0/#sec-asyncgeneratorresumenext',
	AsyncGeneratorStart: 'https://ecma-international.org/ecma-262/9.0/#sec-asyncgeneratorstart',
	AsyncGeneratorYield: 'https://ecma-international.org/ecma-262/9.0/#sec-asyncgeneratoryield',
	AsyncIteratorClose: 'https://ecma-international.org/ecma-262/9.0/#sec-asynciteratorclose',
	AtomicLoad: 'https://ecma-international.org/ecma-262/9.0/#sec-atomicload',
	AtomicReadModifyWrite: 'https://ecma-international.org/ecma-262/9.0/#sec-atomicreadmodifywrite',
	Await: 'https://ecma-international.org/ecma-262/9.0/#await',
	BackreferenceMatcher: 'https://ecma-international.org/ecma-262/9.0/#sec-backreference-matcher',
	BlockDeclarationInstantiation: 'https://ecma-international.org/ecma-262/9.0/#sec-blockdeclarationinstantiation',
	BoundFunctionCreate: 'https://ecma-international.org/ecma-262/9.0/#sec-boundfunctioncreate',
	Call: 'https://ecma-international.org/ecma-262/9.0/#sec-call',
	Canonicalize: 'https://ecma-international.org/ecma-262/9.0/#sec-runtime-semantics-canonicalize-ch',
	CanonicalNumericIndexString: 'https://ecma-international.org/ecma-262/9.0/#sec-canonicalnumericindexstring',
	CaseClauseIsSelected: 'https://ecma-international.org/ecma-262/9.0/#sec-runtime-semantics-caseclauseisselected',
	CharacterRange: 'https://ecma-international.org/ecma-262/9.0/#sec-runtime-semantics-characterrange-abstract-operation',
	CharacterRangeOrUnion: 'https://ecma-international.org/ecma-262/9.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation',
	CharacterSetMatcher: 'https://ecma-international.org/ecma-262/9.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation',
	CloneArrayBuffer: 'https://ecma-international.org/ecma-262/9.0/#sec-clonearraybuffer',
	CompletePropertyDescriptor: 'https://ecma-international.org/ecma-262/9.0/#sec-completepropertydescriptor',
	Completion: 'https://ecma-international.org/ecma-262/9.0/#sec-completion-record-specification-type',
	ComposeWriteEventBytes: 'https://ecma-international.org/ecma-262/9.0/#sec-composewriteeventbytes',
	Construct: 'https://ecma-international.org/ecma-262/9.0/#sec-construct',
	CopyDataBlockBytes: 'https://ecma-international.org/ecma-262/9.0/#sec-copydatablockbytes',
	CopyDataProperties: 'https://ecma-international.org/ecma-262/9.0/#sec-copydataproperties',
	CreateArrayFromList: 'https://ecma-international.org/ecma-262/9.0/#sec-createarrayfromlist',
	CreateArrayIterator: 'https://ecma-international.org/ecma-262/9.0/#sec-createarrayiterator',
	CreateAsyncFromSyncIterator: 'https://ecma-international.org/ecma-262/9.0/#sec-createasyncfromsynciterator',
	CreateBuiltinFunction: 'https://ecma-international.org/ecma-262/9.0/#sec-createbuiltinfunction',
	CreateByteDataBlock: 'https://ecma-international.org/ecma-262/9.0/#sec-createbytedatablock',
	CreateDataProperty: 'https://ecma-international.org/ecma-262/9.0/#sec-createdataproperty',
	CreateDataPropertyOrThrow: 'https://ecma-international.org/ecma-262/9.0/#sec-createdatapropertyorthrow',
	CreateDynamicFunction: 'https://ecma-international.org/ecma-262/9.0/#sec-createdynamicfunction',
	CreateHTML: 'https://ecma-international.org/ecma-262/9.0/#sec-createhtml',
	CreateIntrinsics: 'https://ecma-international.org/ecma-262/9.0/#sec-createintrinsics',
	CreateIterResultObject: 'https://ecma-international.org/ecma-262/9.0/#sec-createiterresultobject',
	CreateListFromArrayLike: 'https://ecma-international.org/ecma-262/9.0/#sec-createlistfromarraylike',
	CreateListIteratorRecord: 'https://ecma-international.org/ecma-262/9.0/#sec-createlistiteratorRecord',
	CreateMapIterator: 'https://ecma-international.org/ecma-262/9.0/#sec-createmapiterator',
	CreateMappedArgumentsObject: 'https://ecma-international.org/ecma-262/9.0/#sec-createmappedargumentsobject',
	CreateMethodProperty: 'https://ecma-international.org/ecma-262/9.0/#sec-createmethodproperty',
	CreatePerIterationEnvironment: 'https://ecma-international.org/ecma-262/9.0/#sec-createperiterationenvironment',
	CreateRealm: 'https://ecma-international.org/ecma-262/9.0/#sec-createrealm',
	CreateResolvingFunctions: 'https://ecma-international.org/ecma-262/9.0/#sec-createresolvingfunctions',
	CreateSetIterator: 'https://ecma-international.org/ecma-262/9.0/#sec-createsetiterator',
	CreateSharedByteDataBlock: 'https://ecma-international.org/ecma-262/9.0/#sec-createsharedbytedatablock',
	CreateStringIterator: 'https://ecma-international.org/ecma-262/9.0/#sec-createstringiterator',
	CreateUnmappedArgumentsObject: 'https://ecma-international.org/ecma-262/9.0/#sec-createunmappedargumentsobject',
	DateFromTime: 'https://ecma-international.org/ecma-262/9.0/#sec-date-number',
	DateString: 'https://ecma-international.org/ecma-262/9.0/#sec-datestring',
	Day: 'https://ecma-international.org/ecma-262/9.0/#eqn-Day',
	DayFromYear: 'https://ecma-international.org/ecma-262/9.0/#eqn-DaysFromYear',
	DaysInYear: 'https://ecma-international.org/ecma-262/9.0/#eqn-DaysInYear',
	DayWithinYear: 'https://ecma-international.org/ecma-262/9.0/#eqn-DayWithinYear',
	Decode: 'https://ecma-international.org/ecma-262/9.0/#sec-decode',
	DefinePropertyOrThrow: 'https://ecma-international.org/ecma-262/9.0/#sec-definepropertyorthrow',
	DeletePropertyOrThrow: 'https://ecma-international.org/ecma-262/9.0/#sec-deletepropertyorthrow',
	DetachArrayBuffer: 'https://ecma-international.org/ecma-262/9.0/#sec-detacharraybuffer',
	Encode: 'https://ecma-international.org/ecma-262/9.0/#sec-encode',
	EnqueueJob: 'https://ecma-international.org/ecma-262/9.0/#sec-enqueuejob',
	EnterCriticalSection: 'https://ecma-international.org/ecma-262/9.0/#sec-entercriticalsection',
	EnumerableOwnPropertyNames: 'https://ecma-international.org/ecma-262/9.0/#sec-enumerableownpropertynames',
	EnumerateObjectProperties: 'https://ecma-international.org/ecma-262/9.0/#sec-enumerate-object-properties',
	EscapeRegExpPattern: 'https://ecma-international.org/ecma-262/9.0/#sec-escaperegexppattern',
	EvalDeclarationInstantiation: 'https://ecma-international.org/ecma-262/9.0/#sec-evaldeclarationinstantiation',
	EvaluateCall: 'https://ecma-international.org/ecma-262/9.0/#sec-evaluatecall',
	EvaluateNew: 'https://ecma-international.org/ecma-262/9.0/#sec-evaluatenew',
	EventSet: 'https://ecma-international.org/ecma-262/9.0/#sec-event-set',
	floor: 'https://ecma-international.org/ecma-262/9.0/#eqn-floor',
	ForBodyEvaluation: 'https://ecma-international.org/ecma-262/9.0/#sec-forbodyevaluation',
	'ForIn/OfBodyEvaluation': 'https://ecma-international.org/ecma-262/9.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset',
	'ForIn/OfHeadEvaluation': 'https://ecma-international.org/ecma-262/9.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind',
	FromPropertyDescriptor: 'https://ecma-international.org/ecma-262/9.0/#sec-frompropertydescriptor',
	FulfillPromise: 'https://ecma-international.org/ecma-262/9.0/#sec-fulfillpromise',
	FunctionAllocate: 'https://ecma-international.org/ecma-262/9.0/#sec-functionallocate',
	FunctionCreate: 'https://ecma-international.org/ecma-262/9.0/#sec-functioncreate',
	FunctionDeclarationInstantiation: 'https://ecma-international.org/ecma-262/9.0/#sec-functiondeclarationinstantiation',
	FunctionInitialize: 'https://ecma-international.org/ecma-262/9.0/#sec-functioninitialize',
	GeneratorFunctionCreate: 'https://ecma-international.org/ecma-262/9.0/#sec-generatorfunctioncreate',
	GeneratorResume: 'https://ecma-international.org/ecma-262/9.0/#sec-generatorresume',
	GeneratorResumeAbrupt: 'https://ecma-international.org/ecma-262/9.0/#sec-generatorresumeabrupt',
	GeneratorStart: 'https://ecma-international.org/ecma-262/9.0/#sec-generatorstart',
	GeneratorValidate: 'https://ecma-international.org/ecma-262/9.0/#sec-generatorvalidate',
	GeneratorYield: 'https://ecma-international.org/ecma-262/9.0/#sec-generatoryield',
	Get: 'https://ecma-international.org/ecma-262/9.0/#sec-get-o-p',
	GetActiveScriptOrModule: 'https://ecma-international.org/ecma-262/9.0/#sec-getactivescriptormodule',
	GetBase: 'https://ecma-international.org/ecma-262/9.0/#sec-getbase',
	GetFunctionRealm: 'https://ecma-international.org/ecma-262/9.0/#sec-getfunctionrealm',
	GetGeneratorKind: 'https://ecma-international.org/ecma-262/9.0/#sec-getgeneratorkind',
	GetGlobalObject: 'https://ecma-international.org/ecma-262/9.0/#sec-getglobalobject',
	GetIdentifierReference: 'https://ecma-international.org/ecma-262/9.0/#sec-getidentifierreference',
	GetIterator: 'https://ecma-international.org/ecma-262/9.0/#sec-getiterator',
	GetMethod: 'https://ecma-international.org/ecma-262/9.0/#sec-getmethod',
	GetModifySetValueInBuffer: 'https://ecma-international.org/ecma-262/9.0/#sec-getmodifysetvalueinbuffer',
	GetModuleNamespace: 'https://ecma-international.org/ecma-262/9.0/#sec-getmodulenamespace',
	GetNewTarget: 'https://ecma-international.org/ecma-262/9.0/#sec-getnewtarget',
	GetOwnPropertyKeys: 'https://ecma-international.org/ecma-262/9.0/#sec-getownpropertykeys',
	GetPrototypeFromConstructor: 'https://ecma-international.org/ecma-262/9.0/#sec-getprototypefromconstructor',
	GetReferencedName: 'https://ecma-international.org/ecma-262/9.0/#sec-getreferencedname',
	GetSubstitution: 'https://ecma-international.org/ecma-262/9.0/#sec-getsubstitution',
	GetSuperConstructor: 'https://ecma-international.org/ecma-262/9.0/#sec-getsuperconstructor',
	GetTemplateObject: 'https://ecma-international.org/ecma-262/9.0/#sec-gettemplateobject',
	GetThisEnvironment: 'https://ecma-international.org/ecma-262/9.0/#sec-getthisenvironment',
	GetThisValue: 'https://ecma-international.org/ecma-262/9.0/#sec-getthisvalue',
	GetV: 'https://ecma-international.org/ecma-262/9.0/#sec-getv',
	GetValue: 'https://ecma-international.org/ecma-262/9.0/#sec-getvalue',
	GetValueFromBuffer: 'https://ecma-international.org/ecma-262/9.0/#sec-getvaluefrombuffer',
	GetViewValue: 'https://ecma-international.org/ecma-262/9.0/#sec-getviewvalue',
	GetWaiterList: 'https://ecma-international.org/ecma-262/9.0/#sec-getwaiterlist',
	GlobalDeclarationInstantiation: 'https://ecma-international.org/ecma-262/9.0/#sec-globaldeclarationinstantiation',
	'happens-before': 'https://ecma-international.org/ecma-262/9.0/#sec-happens-before',
	HasOwnProperty: 'https://ecma-international.org/ecma-262/9.0/#sec-hasownproperty',
	HasPrimitiveBase: 'https://ecma-international.org/ecma-262/9.0/#sec-hasprimitivebase',
	HasProperty: 'https://ecma-international.org/ecma-262/9.0/#sec-hasproperty',
	'host-synchronizes-with': 'https://ecma-international.org/ecma-262/9.0/#sec-host-synchronizes-with',
	HostEnsureCanCompileStrings: 'https://ecma-international.org/ecma-262/9.0/#sec-hostensurecancompilestrings',
	HostEventSet: 'https://ecma-international.org/ecma-262/9.0/#sec-hosteventset',
	HostPromiseRejectionTracker: 'https://ecma-international.org/ecma-262/9.0/#sec-host-promise-rejection-tracker',
	HostReportErrors: 'https://ecma-international.org/ecma-262/9.0/#sec-host-report-errors',
	HostResolveImportedModule: 'https://ecma-international.org/ecma-262/9.0/#sec-hostresolveimportedmodule',
	HourFromTime: 'https://ecma-international.org/ecma-262/9.0/#eqn-HourFromTime',
	IfAbruptRejectPromise: 'https://ecma-international.org/ecma-262/9.0/#sec-ifabruptrejectpromise',
	ImportedLocalNames: 'https://ecma-international.org/ecma-262/9.0/#sec-importedlocalnames',
	InitializeBoundName: 'https://ecma-international.org/ecma-262/9.0/#sec-initializeboundname',
	InitializeHostDefinedRealm: 'https://ecma-international.org/ecma-262/9.0/#sec-initializehostdefinedrealm',
	InitializeReferencedBinding: 'https://ecma-international.org/ecma-262/9.0/#sec-initializereferencedbinding',
	InLeapYear: 'https://ecma-international.org/ecma-262/9.0/#eqn-InLeapYear',
	InnerModuleEvaluation: 'https://ecma-international.org/ecma-262/9.0/#sec-innermoduleevaluation',
	InnerModuleInstantiation: 'https://ecma-international.org/ecma-262/9.0/#sec-innermoduleinstantiation',
	InstanceofOperator: 'https://ecma-international.org/ecma-262/9.0/#sec-instanceofoperator',
	IntegerIndexedElementGet: 'https://ecma-international.org/ecma-262/9.0/#sec-integerindexedelementget',
	IntegerIndexedElementSet: 'https://ecma-international.org/ecma-262/9.0/#sec-integerindexedelementset',
	IntegerIndexedObjectCreate: 'https://ecma-international.org/ecma-262/9.0/#sec-integerindexedobjectcreate',
	InternalizeJSONProperty: 'https://ecma-international.org/ecma-262/9.0/#sec-internalizejsonproperty',
	Invoke: 'https://ecma-international.org/ecma-262/9.0/#sec-invoke',
	IsAccessorDescriptor: 'https://ecma-international.org/ecma-262/9.0/#sec-isaccessordescriptor',
	IsAnonymousFunctionDefinition: 'https://ecma-international.org/ecma-262/9.0/#sec-isanonymousfunctiondefinition',
	IsArray: 'https://ecma-international.org/ecma-262/9.0/#sec-isarray',
	IsCallable: 'https://ecma-international.org/ecma-262/9.0/#sec-iscallable',
	IsCompatiblePropertyDescriptor: 'https://ecma-international.org/ecma-262/9.0/#sec-iscompatiblepropertydescriptor',
	IsConcatSpreadable: 'https://ecma-international.org/ecma-262/9.0/#sec-isconcatspreadable',
	IsConstructor: 'https://ecma-international.org/ecma-262/9.0/#sec-isconstructor',
	IsDataDescriptor: 'https://ecma-international.org/ecma-262/9.0/#sec-isdatadescriptor',
	IsDetachedBuffer: 'https://ecma-international.org/ecma-262/9.0/#sec-isdetachedbuffer',
	IsExtensible: 'https://ecma-international.org/ecma-262/9.0/#sec-isextensible-o',
	IsGenericDescriptor: 'https://ecma-international.org/ecma-262/9.0/#sec-isgenericdescriptor',
	IsInTailPosition: 'https://ecma-international.org/ecma-262/9.0/#sec-isintailposition',
	IsInteger: 'https://ecma-international.org/ecma-262/9.0/#sec-isinteger',
	IsLabelledFunction: 'https://ecma-international.org/ecma-262/9.0/#sec-islabelledfunction',
	IsPromise: 'https://ecma-international.org/ecma-262/9.0/#sec-ispromise',
	IsPropertyKey: 'https://ecma-international.org/ecma-262/9.0/#sec-ispropertykey',
	IsPropertyReference: 'https://ecma-international.org/ecma-262/9.0/#sec-ispropertyreference',
	IsRegExp: 'https://ecma-international.org/ecma-262/9.0/#sec-isregexp',
	IsSharedArrayBuffer: 'https://ecma-international.org/ecma-262/9.0/#sec-issharedarraybuffer',
	IsStrictReference: 'https://ecma-international.org/ecma-262/9.0/#sec-isstrictreference',
	IsStringPrefix: 'https://ecma-international.org/ecma-262/9.0/#sec-isstringprefix',
	IsSuperReference: 'https://ecma-international.org/ecma-262/9.0/#sec-issuperreference',
	IsUnresolvableReference: 'https://ecma-international.org/ecma-262/9.0/#sec-isunresolvablereference',
	IsWordChar: 'https://ecma-international.org/ecma-262/9.0/#sec-runtime-semantics-iswordchar-abstract-operation',
	IterableToList: 'https://ecma-international.org/ecma-262/9.0/#sec-iterabletolist',
	IteratorClose: 'https://ecma-international.org/ecma-262/9.0/#sec-iteratorclose',
	IteratorComplete: 'https://ecma-international.org/ecma-262/9.0/#sec-iteratorcomplete',
	IteratorNext: 'https://ecma-international.org/ecma-262/9.0/#sec-iteratornext',
	IteratorStep: 'https://ecma-international.org/ecma-262/9.0/#sec-iteratorstep',
	IteratorValue: 'https://ecma-international.org/ecma-262/9.0/#sec-iteratorvalue',
	LeaveCriticalSection: 'https://ecma-international.org/ecma-262/9.0/#sec-leavecriticalsection',
	LocalTime: 'https://ecma-international.org/ecma-262/9.0/#sec-localtime',
	LoopContinues: 'https://ecma-international.org/ecma-262/9.0/#sec-loopcontinues',
	MakeArgGetter: 'https://ecma-international.org/ecma-262/9.0/#sec-makearggetter',
	MakeArgSetter: 'https://ecma-international.org/ecma-262/9.0/#sec-makeargsetter',
	MakeClassConstructor: 'https://ecma-international.org/ecma-262/9.0/#sec-makeclassconstructor',
	MakeConstructor: 'https://ecma-international.org/ecma-262/9.0/#sec-makeconstructor',
	MakeDate: 'https://ecma-international.org/ecma-262/9.0/#sec-makedate',
	MakeDay: 'https://ecma-international.org/ecma-262/9.0/#sec-makeday',
	MakeMethod: 'https://ecma-international.org/ecma-262/9.0/#sec-makemethod',
	MakeSuperPropertyReference: 'https://ecma-international.org/ecma-262/9.0/#sec-makesuperpropertyreference',
	MakeTime: 'https://ecma-international.org/ecma-262/9.0/#sec-maketime',
	max: 'https://ecma-international.org/ecma-262/9.0/#eqn-max',
	'memory-order': 'https://ecma-international.org/ecma-262/9.0/#sec-memory-order',
	min: 'https://ecma-international.org/ecma-262/9.0/#eqn-min',
	MinFromTime: 'https://ecma-international.org/ecma-262/9.0/#eqn-MinFromTime',
	ModuleDeclarationEnvironmentSetup: 'https://ecma-international.org/ecma-262/9.0/#sec-moduledeclarationenvironmentsetup',
	ModuleExecution: 'https://ecma-international.org/ecma-262/9.0/#sec-moduleexecution',
	ModuleNamespaceCreate: 'https://ecma-international.org/ecma-262/9.0/#sec-modulenamespacecreate',
	modulo: 'https://ecma-international.org/ecma-262/9.0/#eqn-modulo',
	MonthFromTime: 'https://ecma-international.org/ecma-262/9.0/#eqn-MonthFromTime',
	msFromTime: 'https://ecma-international.org/ecma-262/9.0/#eqn-msFromTime',
	NewDeclarativeEnvironment: 'https://ecma-international.org/ecma-262/9.0/#sec-newdeclarativeenvironment',
	NewFunctionEnvironment: 'https://ecma-international.org/ecma-262/9.0/#sec-newfunctionenvironment',
	NewGlobalEnvironment: 'https://ecma-international.org/ecma-262/9.0/#sec-newglobalenvironment',
	NewModuleEnvironment: 'https://ecma-international.org/ecma-262/9.0/#sec-newmoduleenvironment',
	NewObjectEnvironment: 'https://ecma-international.org/ecma-262/9.0/#sec-newobjectenvironment',
	NewPromiseCapability: 'https://ecma-international.org/ecma-262/9.0/#sec-newpromisecapability',
	NormalCompletion: 'https://ecma-international.org/ecma-262/9.0/#sec-normalcompletion',
	NumberToRawBytes: 'https://ecma-international.org/ecma-262/9.0/#sec-numbertorawbytes',
	NumberToString: 'https://ecma-international.org/ecma-262/9.0/#sec-tostring-applied-to-the-number-type',
	ObjectCreate: 'https://ecma-international.org/ecma-262/9.0/#sec-objectcreate',
	ObjectDefineProperties: 'https://ecma-international.org/ecma-262/9.0/#sec-objectdefineproperties',
	OrdinaryCallBindThis: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinarycallbindthis',
	OrdinaryCallEvaluateBody: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinarycallevaluatebody',
	OrdinaryCreateFromConstructor: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinarycreatefromconstructor',
	OrdinaryDefineOwnProperty: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinarydefineownproperty',
	OrdinaryDelete: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinarydelete',
	OrdinaryGet: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinaryget',
	OrdinaryGetOwnProperty: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinarygetownproperty',
	OrdinaryGetPrototypeOf: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinarygetprototypeof',
	OrdinaryHasInstance: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinaryhasinstance',
	OrdinaryHasProperty: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinaryhasproperty',
	OrdinaryIsExtensible: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinaryisextensible',
	OrdinaryOwnPropertyKeys: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinaryownpropertykeys',
	OrdinaryPreventExtensions: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinarypreventextensions',
	OrdinarySet: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinaryset',
	OrdinarySetPrototypeOf: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinarysetprototypeof',
	OrdinarySetWithOwnDescriptor: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinarysetwithowndescriptor',
	OrdinaryToPrimitive: 'https://ecma-international.org/ecma-262/9.0/#sec-ordinarytoprimitive',
	ParseModule: 'https://ecma-international.org/ecma-262/9.0/#sec-parsemodule',
	ParseScript: 'https://ecma-international.org/ecma-262/9.0/#sec-parse-script',
	PerformEval: 'https://ecma-international.org/ecma-262/9.0/#sec-performeval',
	PerformPromiseAll: 'https://ecma-international.org/ecma-262/9.0/#sec-performpromiseall',
	PerformPromiseRace: 'https://ecma-international.org/ecma-262/9.0/#sec-performpromiserace',
	PerformPromiseThen: 'https://ecma-international.org/ecma-262/9.0/#sec-performpromisethen',
	PrepareForOrdinaryCall: 'https://ecma-international.org/ecma-262/9.0/#sec-prepareforordinarycall',
	PrepareForTailCall: 'https://ecma-international.org/ecma-262/9.0/#sec-preparefortailcall',
	PromiseReactionJob: 'https://ecma-international.org/ecma-262/9.0/#sec-promisereactionjob',
	PromiseResolve: 'https://ecma-international.org/ecma-262/9.0/#sec-promise-resolve',
	PromiseResolveThenableJob: 'https://ecma-international.org/ecma-262/9.0/#sec-promiseresolvethenablejob',
	ProxyCreate: 'https://ecma-international.org/ecma-262/9.0/#sec-proxycreate',
	PutValue: 'https://ecma-international.org/ecma-262/9.0/#sec-putvalue',
	QuoteJSONString: 'https://ecma-international.org/ecma-262/9.0/#sec-quotejsonstring',
	RawBytesToNumber: 'https://ecma-international.org/ecma-262/9.0/#sec-rawbytestonumber',
	'reads-bytes-from': 'https://ecma-international.org/ecma-262/9.0/#sec-reads-bytes-from',
	'reads-from': 'https://ecma-international.org/ecma-262/9.0/#sec-reads-from',
	RegExpAlloc: 'https://ecma-international.org/ecma-262/9.0/#sec-regexpalloc',
	RegExpBuiltinExec: 'https://ecma-international.org/ecma-262/9.0/#sec-regexpbuiltinexec',
	RegExpCreate: 'https://ecma-international.org/ecma-262/9.0/#sec-regexpcreate',
	RegExpExec: 'https://ecma-international.org/ecma-262/9.0/#sec-regexpexec',
	RegExpInitialize: 'https://ecma-international.org/ecma-262/9.0/#sec-regexpinitialize',
	RejectPromise: 'https://ecma-international.org/ecma-262/9.0/#sec-rejectpromise',
	RemoveWaiter: 'https://ecma-international.org/ecma-262/9.0/#sec-removewaiter',
	RemoveWaiters: 'https://ecma-international.org/ecma-262/9.0/#sec-removewaiters',
	RepeatMatcher: 'https://ecma-international.org/ecma-262/9.0/#sec-runtime-semantics-repeatmatcher-abstract-operation',
	RequireObjectCoercible: 'https://ecma-international.org/ecma-262/9.0/#sec-requireobjectcoercible',
	ResolveBinding: 'https://ecma-international.org/ecma-262/9.0/#sec-resolvebinding',
	ResolveThisBinding: 'https://ecma-international.org/ecma-262/9.0/#sec-resolvethisbinding',
	ReturnIfAbrupt: 'https://ecma-international.org/ecma-262/9.0/#sec-returnifabrupt',
	RunJobs: 'https://ecma-international.org/ecma-262/9.0/#sec-runjobs',
	SameValue: 'https://ecma-international.org/ecma-262/9.0/#sec-samevalue',
	SameValueNonNumber: 'https://ecma-international.org/ecma-262/9.0/#sec-samevaluenonnumber',
	SameValueZero: 'https://ecma-international.org/ecma-262/9.0/#sec-samevaluezero',
	ScriptEvaluation: 'https://ecma-international.org/ecma-262/9.0/#sec-runtime-semantics-scriptevaluation',
	ScriptEvaluationJob: 'https://ecma-international.org/ecma-262/9.0/#sec-scriptevaluationjob',
	SecFromTime: 'https://ecma-international.org/ecma-262/9.0/#eqn-SecFromTime',
	SerializeJSONArray: 'https://ecma-international.org/ecma-262/9.0/#sec-serializejsonarray',
	SerializeJSONObject: 'https://ecma-international.org/ecma-262/9.0/#sec-serializejsonobject',
	SerializeJSONProperty: 'https://ecma-international.org/ecma-262/9.0/#sec-serializejsonproperty',
	Set: 'https://ecma-international.org/ecma-262/9.0/#sec-set-o-p-v-throw',
	SetDefaultGlobalBindings: 'https://ecma-international.org/ecma-262/9.0/#sec-setdefaultglobalbindings',
	SetFunctionLength: 'https://ecma-international.org/ecma-262/9.0/#sec-setfunctionlength',
	SetFunctionName: 'https://ecma-international.org/ecma-262/9.0/#sec-setfunctionname',
	SetImmutablePrototype: 'https://ecma-international.org/ecma-262/9.0/#sec-set-immutable-prototype',
	SetIntegrityLevel: 'https://ecma-international.org/ecma-262/9.0/#sec-setintegritylevel',
	SetRealmGlobalObject: 'https://ecma-international.org/ecma-262/9.0/#sec-setrealmglobalobject',
	SetValueInBuffer: 'https://ecma-international.org/ecma-262/9.0/#sec-setvalueinbuffer',
	SetViewValue: 'https://ecma-international.org/ecma-262/9.0/#sec-setviewvalue',
	SharedDataBlockEventSet: 'https://ecma-international.org/ecma-262/9.0/#sec-sharedatablockeventset',
	SortCompare: 'https://ecma-international.org/ecma-262/9.0/#sec-sortcompare',
	SpeciesConstructor: 'https://ecma-international.org/ecma-262/9.0/#sec-speciesconstructor',
	SplitMatch: 'https://ecma-international.org/ecma-262/9.0/#sec-splitmatch',
	'Strict Equality Comparison': 'https://ecma-international.org/ecma-262/9.0/#sec-strict-equality-comparison',
	StringCreate: 'https://ecma-international.org/ecma-262/9.0/#sec-stringcreate',
	StringGetOwnProperty: 'https://ecma-international.org/ecma-262/9.0/#sec-stringgetownproperty',
	Suspend: 'https://ecma-international.org/ecma-262/9.0/#sec-suspend',
	SymbolDescriptiveString: 'https://ecma-international.org/ecma-262/9.0/#sec-symboldescriptivestring',
	'synchronizes-with': 'https://ecma-international.org/ecma-262/9.0/#sec-synchronizes-with',
	TestIntegrityLevel: 'https://ecma-international.org/ecma-262/9.0/#sec-testintegritylevel',
	thisBooleanValue: 'https://ecma-international.org/ecma-262/9.0/#sec-thisbooleanvalue',
	thisNumberValue: 'https://ecma-international.org/ecma-262/9.0/#sec-thisnumbervalue',
	thisStringValue: 'https://ecma-international.org/ecma-262/9.0/#sec-thisstringvalue',
	thisSymbolValue: 'https://ecma-international.org/ecma-262/9.0/#sec-thissymbolvalue',
	thisTimeValue: 'https://ecma-international.org/ecma-262/9.0/#sec-thistimevalue',
	ThrowCompletion: 'https://ecma-international.org/ecma-262/9.0/#sec-throwcompletion',
	TimeClip: 'https://ecma-international.org/ecma-262/9.0/#sec-timeclip',
	TimeFromYear: 'https://ecma-international.org/ecma-262/9.0/#eqn-TimeFromYear',
	TimeString: 'https://ecma-international.org/ecma-262/9.0/#sec-timestring',
	TimeWithinDay: 'https://ecma-international.org/ecma-262/9.0/#eqn-TimeWithinDay',
	TimeZoneString: 'https://ecma-international.org/ecma-262/9.0/#sec-timezoneestring',
	ToBoolean: 'https://ecma-international.org/ecma-262/9.0/#sec-toboolean',
	ToDateString: 'https://ecma-international.org/ecma-262/9.0/#sec-todatestring',
	ToIndex: 'https://ecma-international.org/ecma-262/9.0/#sec-toindex',
	ToInt16: 'https://ecma-international.org/ecma-262/9.0/#sec-toint16',
	ToInt32: 'https://ecma-international.org/ecma-262/9.0/#sec-toint32',
	ToInt8: 'https://ecma-international.org/ecma-262/9.0/#sec-toint8',
	ToInteger: 'https://ecma-international.org/ecma-262/9.0/#sec-tointeger',
	ToLength: 'https://ecma-international.org/ecma-262/9.0/#sec-tolength',
	ToNumber: 'https://ecma-international.org/ecma-262/9.0/#sec-tonumber',
	ToObject: 'https://ecma-international.org/ecma-262/9.0/#sec-toobject',
	TopLevelModuleEvaluationJob: 'https://ecma-international.org/ecma-262/9.0/#sec-toplevelmoduleevaluationjob',
	ToPrimitive: 'https://ecma-international.org/ecma-262/9.0/#sec-toprimitive',
	ToPropertyDescriptor: 'https://ecma-international.org/ecma-262/9.0/#sec-topropertydescriptor',
	ToPropertyKey: 'https://ecma-international.org/ecma-262/9.0/#sec-topropertykey',
	ToString: 'https://ecma-international.org/ecma-262/9.0/#sec-tostring',
	ToUint16: 'https://ecma-international.org/ecma-262/9.0/#sec-touint16',
	ToUint32: 'https://ecma-international.org/ecma-262/9.0/#sec-touint32',
	ToUint8: 'https://ecma-international.org/ecma-262/9.0/#sec-touint8',
	ToUint8Clamp: 'https://ecma-international.org/ecma-262/9.0/#sec-touint8clamp',
	TriggerPromiseReactions: 'https://ecma-international.org/ecma-262/9.0/#sec-triggerpromisereactions',
	Type: 'https://ecma-international.org/ecma-262/9.0/#sec-ecmascript-data-types-and-values',
	TypedArrayCreate: 'https://ecma-international.org/ecma-262/9.0/#typedarray-create',
	TypedArraySpeciesCreate: 'https://ecma-international.org/ecma-262/9.0/#typedarray-species-create',
	UnicodeEscape: 'https://ecma-international.org/ecma-262/9.0/#sec-unicodeescape',
	UnicodeMatchProperty: 'https://ecma-international.org/ecma-262/9.0/#sec-runtime-semantics-unicodematchproperty-p',
	UnicodeMatchPropertyValue: 'https://ecma-international.org/ecma-262/9.0/#sec-runtime-semantics-unicodematchpropertyvalue-p-v',
	UpdateEmpty: 'https://ecma-international.org/ecma-262/9.0/#sec-updateempty',
	UTC: 'https://ecma-international.org/ecma-262/9.0/#sec-utc-t',
	UTF16Decode: 'https://ecma-international.org/ecma-262/9.0/#sec-utf16decode',
	UTF16Encoding: 'https://ecma-international.org/ecma-262/9.0/#sec-utf16encoding',
	ValidateAndApplyPropertyDescriptor: 'https://ecma-international.org/ecma-262/9.0/#sec-validateandapplypropertydescriptor',
	ValidateAtomicAccess: 'https://ecma-international.org/ecma-262/9.0/#sec-validateatomicaccess',
	ValidateSharedIntegerTypedArray: 'https://ecma-international.org/ecma-262/9.0/#sec-validatesharedintegertypedarray',
	ValidateTypedArray: 'https://ecma-international.org/ecma-262/9.0/#sec-validatetypedarray',
	ValueOfReadEvent: 'https://ecma-international.org/ecma-262/9.0/#sec-valueofreadevent',
	WakeWaiter: 'https://ecma-international.org/ecma-262/9.0/#sec-wakewaiter',
	WeekDay: 'https://ecma-international.org/ecma-262/9.0/#sec-week-day',
	WordCharacters: 'https://ecma-international.org/ecma-262/9.0/#sec-runtime-semantics-wordcharacters-abstract-operation',
	YearFromTime: 'https://ecma-international.org/ecma-262/9.0/#eqn-YearFromTime'
};
'use strict';

module.exports = {
	abs: 'https://ecma-international.org/ecma-262/10.0/#eqn-abs',
	'Abstract Equality Comparison': 'https://ecma-international.org/ecma-262/10.0/#sec-abstract-equality-comparison',
	'Abstract Relational Comparison': 'https://ecma-international.org/ecma-262/10.0/#sec-abstract-relational-comparison',
	AddEntriesFromIterable: 'https://ecma-international.org/ecma-262/10.0/#sec-add-entries-from-iterable',
	AddRestrictedFunctionProperties: 'https://ecma-international.org/ecma-262/10.0/#sec-addrestrictedfunctionproperties',
	AddWaiter: 'https://ecma-international.org/ecma-262/10.0/#sec-addwaiter',
	AdvanceStringIndex: 'https://ecma-international.org/ecma-262/10.0/#sec-advancestringindex',
	'agent-order': 'https://ecma-international.org/ecma-262/10.0/#sec-agent-order',
	AgentCanSuspend: 'https://ecma-international.org/ecma-262/10.0/#sec-agentcansuspend',
	AgentSignifier: 'https://ecma-international.org/ecma-262/10.0/#sec-agentsignifier',
	AllocateArrayBuffer: 'https://ecma-international.org/ecma-262/10.0/#sec-allocatearraybuffer',
	AllocateSharedArrayBuffer: 'https://ecma-international.org/ecma-262/10.0/#sec-allocatesharedarraybuffer',
	AllocateTypedArray: 'https://ecma-international.org/ecma-262/10.0/#sec-allocatetypedarray',
	AllocateTypedArrayBuffer: 'https://ecma-international.org/ecma-262/10.0/#sec-allocatetypedarraybuffer',
	ArrayCreate: 'https://ecma-international.org/ecma-262/10.0/#sec-arraycreate',
	ArraySetLength: 'https://ecma-international.org/ecma-262/10.0/#sec-arraysetlength',
	ArraySpeciesCreate: 'https://ecma-international.org/ecma-262/10.0/#sec-arrayspeciescreate',
	AsyncFromSyncIteratorContinuation: 'https://ecma-international.org/ecma-262/10.0/#sec-asyncfromsynciteratorcontinuation',
	AsyncFunctionCreate: 'https://ecma-international.org/ecma-262/10.0/#sec-async-functions-abstract-operations-async-function-create',
	AsyncFunctionStart: 'https://ecma-international.org/ecma-262/10.0/#sec-async-functions-abstract-operations-async-function-start',
	AsyncGeneratorEnqueue: 'https://ecma-international.org/ecma-262/10.0/#sec-asyncgeneratorenqueue',
	AsyncGeneratorFunctionCreate: 'https://ecma-international.org/ecma-262/10.0/#sec-asyncgeneratorfunctioncreate',
	AsyncGeneratorReject: 'https://ecma-international.org/ecma-262/10.0/#sec-asyncgeneratorreject',
	AsyncGeneratorResolve: 'https://ecma-international.org/ecma-262/10.0/#sec-asyncgeneratorresolve',
	AsyncGeneratorResumeNext: 'https://ecma-international.org/ecma-262/10.0/#sec-asyncgeneratorresumenext',
	AsyncGeneratorStart: 'https://ecma-international.org/ecma-262/10.0/#sec-asyncgeneratorstart',
	AsyncGeneratorYield: 'https://ecma-international.org/ecma-262/10.0/#sec-asyncgeneratoryield',
	AsyncIteratorClose: 'https://ecma-international.org/ecma-262/10.0/#sec-asynciteratorclose',
	AtomicLoad: 'https://ecma-international.org/ecma-262/10.0/#sec-atomicload',
	AtomicReadModifyWrite: 'https://ecma-international.org/ecma-262/10.0/#sec-atomicreadmodifywrite',
	Await: 'https://ecma-international.org/ecma-262/10.0/#await',
	BackreferenceMatcher: 'https://ecma-international.org/ecma-262/10.0/#sec-backreference-matcher',
	BlockDeclarationInstantiation: 'https://ecma-international.org/ecma-262/10.0/#sec-blockdeclarationinstantiation',
	BoundFunctionCreate: 'https://ecma-international.org/ecma-262/10.0/#sec-boundfunctioncreate',
	Call: 'https://ecma-international.org/ecma-262/10.0/#sec-call',
	Canonicalize: 'https://ecma-international.org/ecma-262/10.0/#sec-runtime-semantics-canonicalize-ch',
	CanonicalNumericIndexString: 'https://ecma-international.org/ecma-262/10.0/#sec-canonicalnumericindexstring',
	CaseClauseIsSelected: 'https://ecma-international.org/ecma-262/10.0/#sec-runtime-semantics-caseclauseisselected',
	CharacterRange: 'https://ecma-international.org/ecma-262/10.0/#sec-runtime-semantics-characterrange-abstract-operation',
	CharacterRangeOrUnion: 'https://ecma-international.org/ecma-262/10.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation',
	CharacterSetMatcher: 'https://ecma-international.org/ecma-262/10.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation',
	CloneArrayBuffer: 'https://ecma-international.org/ecma-262/10.0/#sec-clonearraybuffer',
	CompletePropertyDescriptor: 'https://ecma-international.org/ecma-262/10.0/#sec-completepropertydescriptor',
	Completion: 'https://ecma-international.org/ecma-262/10.0/#sec-completion-record-specification-type',
	ComposeWriteEventBytes: 'https://ecma-international.org/ecma-262/10.0/#sec-composewriteeventbytes',
	Construct: 'https://ecma-international.org/ecma-262/10.0/#sec-construct',
	CopyDataBlockBytes: 'https://ecma-international.org/ecma-262/10.0/#sec-copydatablockbytes',
	CopyDataProperties: 'https://ecma-international.org/ecma-262/10.0/#sec-copydataproperties',
	CreateArrayFromList: 'https://ecma-international.org/ecma-262/10.0/#sec-createarrayfromlist',
	CreateArrayIterator: 'https://ecma-international.org/ecma-262/10.0/#sec-createarrayiterator',
	CreateAsyncFromSyncIterator: 'https://ecma-international.org/ecma-262/10.0/#sec-createasyncfromsynciterator',
	CreateBuiltinFunction: 'https://ecma-international.org/ecma-262/10.0/#sec-createbuiltinfunction',
	CreateByteDataBlock: 'https://ecma-international.org/ecma-262/10.0/#sec-createbytedatablock',
	CreateDataProperty: 'https://ecma-international.org/ecma-262/10.0/#sec-createdataproperty',
	CreateDataPropertyOrThrow: 'https://ecma-international.org/ecma-262/10.0/#sec-createdatapropertyorthrow',
	CreateDynamicFunction: 'https://ecma-international.org/ecma-262/10.0/#sec-createdynamicfunction',
	CreateHTML: 'https://ecma-international.org/ecma-262/10.0/#sec-createhtml',
	CreateIntrinsics: 'https://ecma-international.org/ecma-262/10.0/#sec-createintrinsics',
	CreateIterResultObject: 'https://ecma-international.org/ecma-262/10.0/#sec-createiterresultobject',
	CreateListFromArrayLike: 'https://ecma-international.org/ecma-262/10.0/#sec-createlistfromarraylike',
	CreateListIteratorRecord: 'https://ecma-international.org/ecma-262/10.0/#sec-createlistiteratorRecord',
	CreateMapIterator: 'https://ecma-international.org/ecma-262/10.0/#sec-createmapiterator',
	CreateMappedArgumentsObject: 'https://ecma-international.org/ecma-262/10.0/#sec-createmappedargumentsobject',
	CreateMethodProperty: 'https://ecma-international.org/ecma-262/10.0/#sec-createmethodproperty',
	CreatePerIterationEnvironment: 'https://ecma-international.org/ecma-262/10.0/#sec-createperiterationenvironment',
	CreateRealm: 'https://ecma-international.org/ecma-262/10.0/#sec-createrealm',
	CreateResolvingFunctions: 'https://ecma-international.org/ecma-262/10.0/#sec-createresolvingfunctions',
	CreateSetIterator: 'https://ecma-international.org/ecma-262/10.0/#sec-createsetiterator',
	CreateSharedByteDataBlock: 'https://ecma-international.org/ecma-262/10.0/#sec-createsharedbytedatablock',
	CreateStringIterator: 'https://ecma-international.org/ecma-262/10.0/#sec-createstringiterator',
	CreateUnmappedArgumentsObject: 'https://ecma-international.org/ecma-262/10.0/#sec-createunmappedargumentsobject',
	DateFromTime: 'https://ecma-international.org/ecma-262/10.0/#sec-date-number',
	DateString: 'https://ecma-international.org/ecma-262/10.0/#sec-datestring',
	Day: 'https://ecma-international.org/ecma-262/10.0/#eqn-Day',
	DayFromYear: 'https://ecma-international.org/ecma-262/10.0/#eqn-DaysFromYear',
	DaysInYear: 'https://ecma-international.org/ecma-262/10.0/#eqn-DaysInYear',
	DayWithinYear: 'https://ecma-international.org/ecma-262/10.0/#eqn-DayWithinYear',
	Decode: 'https://ecma-international.org/ecma-262/10.0/#sec-decode',
	DefinePropertyOrThrow: 'https://ecma-international.org/ecma-262/10.0/#sec-definepropertyorthrow',
	DeletePropertyOrThrow: 'https://ecma-international.org/ecma-262/10.0/#sec-deletepropertyorthrow',
	DetachArrayBuffer: 'https://ecma-international.org/ecma-262/10.0/#sec-detacharraybuffer',
	Encode: 'https://ecma-international.org/ecma-262/10.0/#sec-encode',
	EnqueueJob: 'https://ecma-international.org/ecma-262/10.0/#sec-enqueuejob',
	EnterCriticalSection: 'https://ecma-international.org/ecma-262/10.0/#sec-entercriticalsection',
	EnumerableOwnPropertyNames: 'https://ecma-international.org/ecma-262/10.0/#sec-enumerableownpropertynames',
	EnumerateObjectProperties: 'https://ecma-international.org/ecma-262/10.0/#sec-enumerate-object-properties',
	EscapeRegExpPattern: 'https://ecma-international.org/ecma-262/10.0/#sec-escaperegexppattern',
	EvalDeclarationInstantiation: 'https://ecma-international.org/ecma-262/10.0/#sec-evaldeclarationinstantiation',
	EvaluateCall: 'https://ecma-international.org/ecma-262/10.0/#sec-evaluatecall',
	EvaluateNew: 'https://ecma-international.org/ecma-262/10.0/#sec-evaluatenew',
	EventSet: 'https://ecma-international.org/ecma-262/10.0/#sec-event-set',
	ExecuteModule: 'https://ecma-international.org/ecma-262/10.0/#sec-source-text-module-record-execute-module',
	FlattenIntoArray: 'https://ecma-international.org/ecma-262/10.0/#sec-flattenintoarray',
	floor: 'https://ecma-international.org/ecma-262/10.0/#eqn-floor',
	ForBodyEvaluation: 'https://ecma-international.org/ecma-262/10.0/#sec-forbodyevaluation',
	'ForIn/OfBodyEvaluation': 'https://ecma-international.org/ecma-262/10.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset',
	'ForIn/OfHeadEvaluation': 'https://ecma-international.org/ecma-262/10.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind',
	FromPropertyDescriptor: 'https://ecma-international.org/ecma-262/10.0/#sec-frompropertydescriptor',
	FulfillPromise: 'https://ecma-international.org/ecma-262/10.0/#sec-fulfillpromise',
	FunctionAllocate: 'https://ecma-international.org/ecma-262/10.0/#sec-functionallocate',
	FunctionCreate: 'https://ecma-international.org/ecma-262/10.0/#sec-functioncreate',
	FunctionDeclarationInstantiation: 'https://ecma-international.org/ecma-262/10.0/#sec-functiondeclarationinstantiation',
	FunctionInitialize: 'https://ecma-international.org/ecma-262/10.0/#sec-functioninitialize',
	GeneratorFunctionCreate: 'https://ecma-international.org/ecma-262/10.0/#sec-generatorfunctioncreate',
	GeneratorResume: 'https://ecma-international.org/ecma-262/10.0/#sec-generatorresume',
	GeneratorResumeAbrupt: 'https://ecma-international.org/ecma-262/10.0/#sec-generatorresumeabrupt',
	GeneratorStart: 'https://ecma-international.org/ecma-262/10.0/#sec-generatorstart',
	GeneratorValidate: 'https://ecma-international.org/ecma-262/10.0/#sec-generatorvalidate',
	GeneratorYield: 'https://ecma-international.org/ecma-262/10.0/#sec-generatoryield',
	Get: 'https://ecma-international.org/ecma-262/10.0/#sec-get-o-p',
	GetActiveScriptOrModule: 'https://ecma-international.org/ecma-262/10.0/#sec-getactivescriptormodule',
	GetBase: 'https://ecma-international.org/ecma-262/10.0/#sec-getbase',
	GetFunctionRealm: 'https://ecma-international.org/ecma-262/10.0/#sec-getfunctionrealm',
	GetGeneratorKind: 'https://ecma-international.org/ecma-262/10.0/#sec-getgeneratorkind',
	GetGlobalObject: 'https://ecma-international.org/ecma-262/10.0/#sec-getglobalobject',
	GetIdentifierReference: 'https://ecma-international.org/ecma-262/10.0/#sec-getidentifierreference',
	GetIterator: 'https://ecma-international.org/ecma-262/10.0/#sec-getiterator',
	GetMethod: 'https://ecma-international.org/ecma-262/10.0/#sec-getmethod',
	GetModifySetValueInBuffer: 'https://ecma-international.org/ecma-262/10.0/#sec-getmodifysetvalueinbuffer',
	GetModuleNamespace: 'https://ecma-international.org/ecma-262/10.0/#sec-getmodulenamespace',
	GetNewTarget: 'https://ecma-international.org/ecma-262/10.0/#sec-getnewtarget',
	GetOwnPropertyKeys: 'https://ecma-international.org/ecma-262/10.0/#sec-getownpropertykeys',
	GetPrototypeFromConstructor: 'https://ecma-international.org/ecma-262/10.0/#sec-getprototypefromconstructor',
	GetReferencedName: 'https://ecma-international.org/ecma-262/10.0/#sec-getreferencedname',
	GetSubstitution: 'https://ecma-international.org/ecma-262/10.0/#sec-getsubstitution',
	GetSuperConstructor: 'https://ecma-international.org/ecma-262/10.0/#sec-getsuperconstructor',
	GetTemplateObject: 'https://ecma-international.org/ecma-262/10.0/#sec-gettemplateobject',
	GetThisEnvironment: 'https://ecma-international.org/ecma-262/10.0/#sec-getthisenvironment',
	GetThisValue: 'https://ecma-international.org/ecma-262/10.0/#sec-getthisvalue',
	GetV: 'https://ecma-international.org/ecma-262/10.0/#sec-getv',
	GetValue: 'https://ecma-international.org/ecma-262/10.0/#sec-getvalue',
	GetValueFromBuffer: 'https://ecma-international.org/ecma-262/10.0/#sec-getvaluefrombuffer',
	GetViewValue: 'https://ecma-international.org/ecma-262/10.0/#sec-getviewvalue',
	GetWaiterList: 'https://ecma-international.org/ecma-262/10.0/#sec-getwaiterlist',
	GlobalDeclarationInstantiation: 'https://ecma-international.org/ecma-262/10.0/#sec-globaldeclarationinstantiation',
	'happens-before': 'https://ecma-international.org/ecma-262/10.0/#sec-happens-before',
	HasOwnProperty: 'https://ecma-international.org/ecma-262/10.0/#sec-hasownproperty',
	HasPrimitiveBase: 'https://ecma-international.org/ecma-262/10.0/#sec-hasprimitivebase',
	HasProperty: 'https://ecma-international.org/ecma-262/10.0/#sec-hasproperty',
	'host-synchronizes-with': 'https://ecma-international.org/ecma-262/10.0/#sec-host-synchronizes-with',
	HostEnsureCanCompileStrings: 'https://ecma-international.org/ecma-262/10.0/#sec-hostensurecancompilestrings',
	HostEventSet: 'https://ecma-international.org/ecma-262/10.0/#sec-hosteventset',
	HostPromiseRejectionTracker: 'https://ecma-international.org/ecma-262/10.0/#sec-host-promise-rejection-tracker',
	HostReportErrors: 'https://ecma-international.org/ecma-262/10.0/#sec-host-report-errors',
	HostResolveImportedModule: 'https://ecma-international.org/ecma-262/10.0/#sec-hostresolveimportedmodule',
	HourFromTime: 'https://ecma-international.org/ecma-262/10.0/#eqn-HourFromTime',
	IfAbruptRejectPromise: 'https://ecma-international.org/ecma-262/10.0/#sec-ifabruptrejectpromise',
	ImportedLocalNames: 'https://ecma-international.org/ecma-262/10.0/#sec-importedlocalnames',
	InitializeBoundName: 'https://ecma-international.org/ecma-262/10.0/#sec-initializeboundname',
	InitializeEnvironment: 'https://ecma-international.org/ecma-262/10.0/#sec-source-text-module-record-initialize-environment',
	InitializeHostDefinedRealm: 'https://ecma-international.org/ecma-262/10.0/#sec-initializehostdefinedrealm',
	InitializeReferencedBinding: 'https://ecma-international.org/ecma-262/10.0/#sec-initializereferencedbinding',
	InLeapYear: 'https://ecma-international.org/ecma-262/10.0/#eqn-InLeapYear',
	InnerModuleEvaluation: 'https://ecma-international.org/ecma-262/10.0/#sec-innermoduleevaluation',
	InnerModuleInstantiation: 'https://ecma-international.org/ecma-262/10.0/#sec-innermoduleinstantiation',
	InstanceofOperator: 'https://ecma-international.org/ecma-262/10.0/#sec-instanceofoperator',
	IntegerIndexedElementGet: 'https://ecma-international.org/ecma-262/10.0/#sec-integerindexedelementget',
	IntegerIndexedElementSet: 'https://ecma-international.org/ecma-262/10.0/#sec-integerindexedelementset',
	IntegerIndexedObjectCreate: 'https://ecma-international.org/ecma-262/10.0/#sec-integerindexedobjectcreate',
	InternalizeJSONProperty: 'https://ecma-international.org/ecma-262/10.0/#sec-internalizejsonproperty',
	Invoke: 'https://ecma-international.org/ecma-262/10.0/#sec-invoke',
	IsAccessorDescriptor: 'https://ecma-international.org/ecma-262/10.0/#sec-isaccessordescriptor',
	IsAnonymousFunctionDefinition: 'https://ecma-international.org/ecma-262/10.0/#sec-isanonymousfunctiondefinition',
	IsArray: 'https://ecma-international.org/ecma-262/10.0/#sec-isarray',
	IsCallable: 'https://ecma-international.org/ecma-262/10.0/#sec-iscallable',
	IsCompatiblePropertyDescriptor: 'https://ecma-international.org/ecma-262/10.0/#sec-iscompatiblepropertydescriptor',
	IsConcatSpreadable: 'https://ecma-international.org/ecma-262/10.0/#sec-isconcatspreadable',
	IsConstructor: 'https://ecma-international.org/ecma-262/10.0/#sec-isconstructor',
	IsDataDescriptor: 'https://ecma-international.org/ecma-262/10.0/#sec-isdatadescriptor',
	IsDetachedBuffer: 'https://ecma-international.org/ecma-262/10.0/#sec-isdetachedbuffer',
	IsExtensible: 'https://ecma-international.org/ecma-262/10.0/#sec-isextensible-o',
	IsGenericDescriptor: 'https://ecma-international.org/ecma-262/10.0/#sec-isgenericdescriptor',
	IsInTailPosition: 'https://ecma-international.org/ecma-262/10.0/#sec-isintailposition',
	IsInteger: 'https://ecma-international.org/ecma-262/10.0/#sec-isinteger',
	IsLabelledFunction: 'https://ecma-international.org/ecma-262/10.0/#sec-islabelledfunction',
	IsPromise: 'https://ecma-international.org/ecma-262/10.0/#sec-ispromise',
	IsPropertyKey: 'https://ecma-international.org/ecma-262/10.0/#sec-ispropertykey',
	IsPropertyReference: 'https://ecma-international.org/ecma-262/10.0/#sec-ispropertyreference',
	IsRegExp: 'https://ecma-international.org/ecma-262/10.0/#sec-isregexp',
	IsSharedArrayBuffer: 'https://ecma-international.org/ecma-262/10.0/#sec-issharedarraybuffer',
	IsStrictReference: 'https://ecma-international.org/ecma-262/10.0/#sec-isstrictreference',
	IsStringPrefix: 'https://ecma-international.org/ecma-262/10.0/#sec-isstringprefix',
	IsSuperReference: 'https://ecma-international.org/ecma-262/10.0/#sec-issuperreference',
	IsUnresolvableReference: 'https://ecma-international.org/ecma-262/10.0/#sec-isunresolvablereference',
	IsWordChar: 'https://ecma-international.org/ecma-262/10.0/#sec-runtime-semantics-iswordchar-abstract-operation',
	IterableToList: 'https://ecma-international.org/ecma-262/10.0/#sec-iterabletolist',
	IteratorClose: 'https://ecma-international.org/ecma-262/10.0/#sec-iteratorclose',
	IteratorComplete: 'https://ecma-international.org/ecma-262/10.0/#sec-iteratorcomplete',
	IteratorNext: 'https://ecma-international.org/ecma-262/10.0/#sec-iteratornext',
	IteratorStep: 'https://ecma-international.org/ecma-262/10.0/#sec-iteratorstep',
	IteratorValue: 'https://ecma-international.org/ecma-262/10.0/#sec-iteratorvalue',
	LeaveCriticalSection: 'https://ecma-international.org/ecma-262/10.0/#sec-leavecriticalsection',
	LocalTime: 'https://ecma-international.org/ecma-262/10.0/#sec-localtime',
	LoopContinues: 'https://ecma-international.org/ecma-262/10.0/#sec-loopcontinues',
	MakeArgGetter: 'https://ecma-international.org/ecma-262/10.0/#sec-makearggetter',
	MakeArgSetter: 'https://ecma-international.org/ecma-262/10.0/#sec-makeargsetter',
	MakeClassConstructor: 'https://ecma-international.org/ecma-262/10.0/#sec-makeclassconstructor',
	MakeConstructor: 'https://ecma-international.org/ecma-262/10.0/#sec-makeconstructor',
	MakeDate: 'https://ecma-international.org/ecma-262/10.0/#sec-makedate',
	MakeDay: 'https://ecma-international.org/ecma-262/10.0/#sec-makeday',
	MakeMethod: 'https://ecma-international.org/ecma-262/10.0/#sec-makemethod',
	MakeSuperPropertyReference: 'https://ecma-international.org/ecma-262/10.0/#sec-makesuperpropertyreference',
	MakeTime: 'https://ecma-international.org/ecma-262/10.0/#sec-maketime',
	max: 'https://ecma-international.org/ecma-262/10.0/#eqn-max',
	'memory-order': 'https://ecma-international.org/ecma-262/10.0/#sec-memory-order',
	min: 'https://ecma-international.org/ecma-262/10.0/#eqn-min',
	MinFromTime: 'https://ecma-international.org/ecma-262/10.0/#eqn-MinFromTime',
	ModuleNamespaceCreate: 'https://ecma-international.org/ecma-262/10.0/#sec-modulenamespacecreate',
	modulo: 'https://ecma-international.org/ecma-262/10.0/#eqn-modulo',
	MonthFromTime: 'https://ecma-international.org/ecma-262/10.0/#eqn-MonthFromTime',
	msFromTime: 'https://ecma-international.org/ecma-262/10.0/#eqn-msFromTime',
	NewDeclarativeEnvironment: 'https://ecma-international.org/ecma-262/10.0/#sec-newdeclarativeenvironment',
	NewFunctionEnvironment: 'https://ecma-international.org/ecma-262/10.0/#sec-newfunctionenvironment',
	NewGlobalEnvironment: 'https://ecma-international.org/ecma-262/10.0/#sec-newglobalenvironment',
	NewModuleEnvironment: 'https://ecma-international.org/ecma-262/10.0/#sec-newmoduleenvironment',
	NewObjectEnvironment: 'https://ecma-international.org/ecma-262/10.0/#sec-newobjectenvironment',
	NewPromiseCapability: 'https://ecma-international.org/ecma-262/10.0/#sec-newpromisecapability',
	NormalCompletion: 'https://ecma-international.org/ecma-262/10.0/#sec-normalcompletion',
	NotifyWaiter: 'https://ecma-international.org/ecma-262/10.0/#sec-notifywaiter',
	NumberToRawBytes: 'https://ecma-international.org/ecma-262/10.0/#sec-numbertorawbytes',
	NumberToString: 'https://ecma-international.org/ecma-262/10.0/#sec-tostring-applied-to-the-number-type',
	ObjectCreate: 'https://ecma-international.org/ecma-262/10.0/#sec-objectcreate',
	ObjectDefineProperties: 'https://ecma-international.org/ecma-262/10.0/#sec-objectdefineproperties',
	OrdinaryCallBindThis: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinarycallbindthis',
	OrdinaryCallEvaluateBody: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinarycallevaluatebody',
	OrdinaryCreateFromConstructor: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinarycreatefromconstructor',
	OrdinaryDefineOwnProperty: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinarydefineownproperty',
	OrdinaryDelete: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinarydelete',
	OrdinaryGet: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinaryget',
	OrdinaryGetOwnProperty: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinarygetownproperty',
	OrdinaryGetPrototypeOf: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinarygetprototypeof',
	OrdinaryHasInstance: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinaryhasinstance',
	OrdinaryHasProperty: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinaryhasproperty',
	OrdinaryIsExtensible: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinaryisextensible',
	OrdinaryOwnPropertyKeys: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinaryownpropertykeys',
	OrdinaryPreventExtensions: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinarypreventextensions',
	OrdinarySet: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinaryset',
	OrdinarySetPrototypeOf: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinarysetprototypeof',
	OrdinarySetWithOwnDescriptor: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinarysetwithowndescriptor',
	OrdinaryToPrimitive: 'https://ecma-international.org/ecma-262/10.0/#sec-ordinarytoprimitive',
	ParseModule: 'https://ecma-international.org/ecma-262/10.0/#sec-parsemodule',
	ParseScript: 'https://ecma-international.org/ecma-262/10.0/#sec-parse-script',
	PerformEval: 'https://ecma-international.org/ecma-262/10.0/#sec-performeval',
	PerformPromiseAll: 'https://ecma-international.org/ecma-262/10.0/#sec-performpromiseall',
	PerformPromiseRace: 'https://ecma-international.org/ecma-262/10.0/#sec-performpromiserace',
	PerformPromiseThen: 'https://ecma-international.org/ecma-262/10.0/#sec-performpromisethen',
	PrepareForOrdinaryCall: 'https://ecma-international.org/ecma-262/10.0/#sec-prepareforordinarycall',
	PrepareForTailCall: 'https://ecma-international.org/ecma-262/10.0/#sec-preparefortailcall',
	PromiseReactionJob: 'https://ecma-international.org/ecma-262/10.0/#sec-promisereactionjob',
	PromiseResolve: 'https://ecma-international.org/ecma-262/10.0/#sec-promise-resolve',
	PromiseResolveThenableJob: 'https://ecma-international.org/ecma-262/10.0/#sec-promiseresolvethenablejob',
	ProxyCreate: 'https://ecma-international.org/ecma-262/10.0/#sec-proxycreate',
	PutValue: 'https://ecma-international.org/ecma-262/10.0/#sec-putvalue',
	QuoteJSONString: 'https://ecma-international.org/ecma-262/10.0/#sec-quotejsonstring',
	RawBytesToNumber: 'https://ecma-international.org/ecma-262/10.0/#sec-rawbytestonumber',
	'reads-bytes-from': 'https://ecma-international.org/ecma-262/10.0/#sec-reads-bytes-from',
	'reads-from': 'https://ecma-international.org/ecma-262/10.0/#sec-reads-from',
	RegExpAlloc: 'https://ecma-international.org/ecma-262/10.0/#sec-regexpalloc',
	RegExpBuiltinExec: 'https://ecma-international.org/ecma-262/10.0/#sec-regexpbuiltinexec',
	RegExpCreate: 'https://ecma-international.org/ecma-262/10.0/#sec-regexpcreate',
	RegExpExec: 'https://ecma-international.org/ecma-262/10.0/#sec-regexpexec',
	RegExpInitialize: 'https://ecma-international.org/ecma-262/10.0/#sec-regexpinitialize',
	RejectPromise: 'https://ecma-international.org/ecma-262/10.0/#sec-rejectpromise',
	RemoveWaiter: 'https://ecma-international.org/ecma-262/10.0/#sec-removewaiter',
	RemoveWaiters: 'https://ecma-international.org/ecma-262/10.0/#sec-removewaiters',
	RepeatMatcher: 'https://ecma-international.org/ecma-262/10.0/#sec-runtime-semantics-repeatmatcher-abstract-operation',
	RequireObjectCoercible: 'https://ecma-international.org/ecma-262/10.0/#sec-requireobjectcoercible',
	ResolveBinding: 'https://ecma-international.org/ecma-262/10.0/#sec-resolvebinding',
	ResolveThisBinding: 'https://ecma-international.org/ecma-262/10.0/#sec-resolvethisbinding',
	ReturnIfAbrupt: 'https://ecma-international.org/ecma-262/10.0/#sec-returnifabrupt',
	RunJobs: 'https://ecma-international.org/ecma-262/10.0/#sec-runjobs',
	SameValue: 'https://ecma-international.org/ecma-262/10.0/#sec-samevalue',
	SameValueNonNumber: 'https://ecma-international.org/ecma-262/10.0/#sec-samevaluenonnumber',
	SameValueZero: 'https://ecma-international.org/ecma-262/10.0/#sec-samevaluezero',
	ScriptEvaluation: 'https://ecma-international.org/ecma-262/10.0/#sec-runtime-semantics-scriptevaluation',
	ScriptEvaluationJob: 'https://ecma-international.org/ecma-262/10.0/#sec-scriptevaluationjob',
	SecFromTime: 'https://ecma-international.org/ecma-262/10.0/#eqn-SecFromTime',
	SerializeJSONArray: 'https://ecma-international.org/ecma-262/10.0/#sec-serializejsonarray',
	SerializeJSONObject: 'https://ecma-international.org/ecma-262/10.0/#sec-serializejsonobject',
	SerializeJSONProperty: 'https://ecma-international.org/ecma-262/10.0/#sec-serializejsonproperty',
	Set: 'https://ecma-international.org/ecma-262/10.0/#sec-set-o-p-v-throw',
	SetDefaultGlobalBindings: 'https://ecma-international.org/ecma-262/10.0/#sec-setdefaultglobalbindings',
	SetFunctionLength: 'https://ecma-international.org/ecma-262/10.0/#sec-setfunctionlength',
	SetFunctionName: 'https://ecma-international.org/ecma-262/10.0/#sec-setfunctionname',
	SetImmutablePrototype: 'https://ecma-international.org/ecma-262/10.0/#sec-set-immutable-prototype',
	SetIntegrityLevel: 'https://ecma-international.org/ecma-262/10.0/#sec-setintegritylevel',
	SetRealmGlobalObject: 'https://ecma-international.org/ecma-262/10.0/#sec-setrealmglobalobject',
	SetValueInBuffer: 'https://ecma-international.org/ecma-262/10.0/#sec-setvalueinbuffer',
	SetViewValue: 'https://ecma-international.org/ecma-262/10.0/#sec-setviewvalue',
	SharedDataBlockEventSet: 'https://ecma-international.org/ecma-262/10.0/#sec-sharedatablockeventset',
	SortCompare: 'https://ecma-international.org/ecma-262/10.0/#sec-sortcompare',
	SpeciesConstructor: 'https://ecma-international.org/ecma-262/10.0/#sec-speciesconstructor',
	SplitMatch: 'https://ecma-international.org/ecma-262/10.0/#sec-splitmatch',
	'Strict Equality Comparison': 'https://ecma-international.org/ecma-262/10.0/#sec-strict-equality-comparison',
	StringCreate: 'https://ecma-international.org/ecma-262/10.0/#sec-stringcreate',
	StringGetOwnProperty: 'https://ecma-international.org/ecma-262/10.0/#sec-stringgetownproperty',
	Suspend: 'https://ecma-international.org/ecma-262/10.0/#sec-suspend',
	SymbolDescriptiveString: 'https://ecma-international.org/ecma-262/10.0/#sec-symboldescriptivestring',
	SynchronizeEventSet: 'https://ecma-international.org/ecma-262/10.0/#sec-synchronizeeventset',
	'synchronizes-with': 'https://ecma-international.org/ecma-262/10.0/#sec-synchronizes-with',
	TestIntegrityLevel: 'https://ecma-international.org/ecma-262/10.0/#sec-testintegritylevel',
	thisBooleanValue: 'https://ecma-international.org/ecma-262/10.0/#sec-thisbooleanvalue',
	thisNumberValue: 'https://ecma-international.org/ecma-262/10.0/#sec-thisnumbervalue',
	thisStringValue: 'https://ecma-international.org/ecma-262/10.0/#sec-thisstringvalue',
	thisSymbolValue: 'https://ecma-international.org/ecma-262/10.0/#sec-thissymbolvalue',
	thisTimeValue: 'https://ecma-international.org/ecma-262/10.0/#sec-thistimevalue',
	ThrowCompletion: 'https://ecma-international.org/ecma-262/10.0/#sec-throwcompletion',
	TimeClip: 'https://ecma-international.org/ecma-262/10.0/#sec-timeclip',
	TimeFromYear: 'https://ecma-international.org/ecma-262/10.0/#eqn-TimeFromYear',
	TimeString: 'https://ecma-international.org/ecma-262/10.0/#sec-timestring',
	TimeWithinDay: 'https://ecma-international.org/ecma-262/10.0/#eqn-TimeWithinDay',
	TimeZoneString: 'https://ecma-international.org/ecma-262/10.0/#sec-timezoneestring',
	ToBoolean: 'https://ecma-international.org/ecma-262/10.0/#sec-toboolean',
	ToDateString: 'https://ecma-international.org/ecma-262/10.0/#sec-todatestring',
	ToIndex: 'https://ecma-international.org/ecma-262/10.0/#sec-toindex',
	ToInt16: 'https://ecma-international.org/ecma-262/10.0/#sec-toint16',
	ToInt32: 'https://ecma-international.org/ecma-262/10.0/#sec-toint32',
	ToInt8: 'https://ecma-international.org/ecma-262/10.0/#sec-toint8',
	ToInteger: 'https://ecma-international.org/ecma-262/10.0/#sec-tointeger',
	ToLength: 'https://ecma-international.org/ecma-262/10.0/#sec-tolength',
	ToNumber: 'https://ecma-international.org/ecma-262/10.0/#sec-tonumber',
	ToObject: 'https://ecma-international.org/ecma-262/10.0/#sec-toobject',
	TopLevelModuleEvaluationJob: 'https://ecma-international.org/ecma-262/10.0/#sec-toplevelmoduleevaluationjob',
	ToPrimitive: 'https://ecma-international.org/ecma-262/10.0/#sec-toprimitive',
	ToPropertyDescriptor: 'https://ecma-international.org/ecma-262/10.0/#sec-topropertydescriptor',
	ToPropertyKey: 'https://ecma-international.org/ecma-262/10.0/#sec-topropertykey',
	ToString: 'https://ecma-international.org/ecma-262/10.0/#sec-tostring',
	ToUint16: 'https://ecma-international.org/ecma-262/10.0/#sec-touint16',
	ToUint32: 'https://ecma-international.org/ecma-262/10.0/#sec-touint32',
	ToUint8: 'https://ecma-international.org/ecma-262/10.0/#sec-touint8',
	ToUint8Clamp: 'https://ecma-international.org/ecma-262/10.0/#sec-touint8clamp',
	TriggerPromiseReactions: 'https://ecma-international.org/ecma-262/10.0/#sec-triggerpromisereactions',
	TrimString: 'https://ecma-international.org/ecma-262/10.0/#sec-trimstring',
	Type: 'https://ecma-international.org/ecma-262/10.0/#sec-ecmascript-data-types-and-values',
	TypedArrayCreate: 'https://ecma-international.org/ecma-262/10.0/#typedarray-create',
	TypedArraySpeciesCreate: 'https://ecma-international.org/ecma-262/10.0/#typedarray-species-create',
	UnicodeEscape: 'https://ecma-international.org/ecma-262/10.0/#sec-unicodeescape',
	UnicodeMatchProperty: 'https://ecma-international.org/ecma-262/10.0/#sec-runtime-semantics-unicodematchproperty-p',
	UnicodeMatchPropertyValue: 'https://ecma-international.org/ecma-262/10.0/#sec-runtime-semantics-unicodematchpropertyvalue-p-v',
	UpdateEmpty: 'https://ecma-international.org/ecma-262/10.0/#sec-updateempty',
	UTC: 'https://ecma-international.org/ecma-262/10.0/#sec-utc-t',
	UTF16Decode: 'https://ecma-international.org/ecma-262/10.0/#sec-utf16decode',
	UTF16Encoding: 'https://ecma-international.org/ecma-262/10.0/#sec-utf16encoding',
	ValidateAndApplyPropertyDescriptor: 'https://ecma-international.org/ecma-262/10.0/#sec-validateandapplypropertydescriptor',
	ValidateAtomicAccess: 'https://ecma-international.org/ecma-262/10.0/#sec-validateatomicaccess',
	ValidateSharedIntegerTypedArray: 'https://ecma-international.org/ecma-262/10.0/#sec-validatesharedintegertypedarray',
	ValidateTypedArray: 'https://ecma-international.org/ecma-262/10.0/#sec-validatetypedarray',
	ValueOfReadEvent: 'https://ecma-international.org/ecma-262/10.0/#sec-valueofreadevent',
	WeekDay: 'https://ecma-international.org/ecma-262/10.0/#sec-week-day',
	WordCharacters: 'https://ecma-international.org/ecma-262/10.0/#sec-runtime-semantics-wordcharacters-abstract-operation',
	YearFromTime: 'https://ecma-international.org/ecma-262/10.0/#eqn-YearFromTime'
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);

if ($defineProperty) {
	try {
		$defineProperty({}, 'a', { value: 1 });
	} catch (e) {
		// IE 8 has a broken defineProperty
		$defineProperty = null;
	}
}

var callBound = require('../helpers/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

// eslint-disable-next-line max-params
module.exports = function DefineOwnProperty(IsDataDescriptor, SameValue, FromPropertyDescriptor, O, P, desc) {
	if (!$defineProperty) {
		if (!IsDataDescriptor(desc)) {
			// ES3 does not support getters/setters
			return false;
		}
		if (!desc['[[Configurable]]'] || !desc['[[Writable]]']) {
			return false;
		}

		// fallback for ES3
		if (P in O && $isEnumerable(O, P) !== !!desc['[[Enumerable]]']) {
			// a non-enumerable existing property
			return false;
		}

		// property does not exist at all, or exists but is enumerable
		var V = desc['[[Value]]'];
		// eslint-disable-next-line no-param-reassign
		O[P] = V; // will use [[Define]]
		return SameValue(O[P], V);
	}
	$defineProperty(O, P, FromPropertyDescriptor(desc));
	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var callBind = require('./callBind');
var callBound = require('./callBound');

var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));
var $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);
var $gOPS = $SymbolValueOf ? GetIntrinsic('%Object.getOwnPropertySymbols%') : null;

var keys = require('object-keys');

module.exports = function OwnPropertyKeys(source) {
	var ownKeys = ($gOPN || keys)(source);
	if ($gOPS) {
		$pushApply(ownKeys, $gOPS(source));
	}
	return ownKeys;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var has = require('has');

var predicates = {
	// https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type
	'Property Descriptor': function isPropertyDescriptor(Type, Desc) {
		if (Type(Desc) !== 'Object') {
			return false;
		}
		var allowed = {
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Get]]': true,
			'[[Set]]': true,
			'[[Value]]': true,
			'[[Writable]]': true
		};

		for (var key in Desc) { // eslint-disable-line
			if (has(Desc, key) && !allowed[key]) {
				return false;
			}
		}

		var isData = has(Desc, '[[Value]]');
		var IsAccessor = has(Desc, '[[Get]]') || has(Desc, '[[Set]]');
		if (isData && IsAccessor) {
			throw new $TypeError('Property Descriptors may not be both accessor and data descriptors');
		}
		return true;
	}
};

module.exports = function assertRecord(Type, recordType, argumentName, value) {
	var predicate = predicates[recordType];
	if (typeof predicate !== 'function') {
		throw new $SyntaxError('unknown record type: ' + recordType);
	}
	if (!predicate(Type, value)) {
		throw new $TypeError(argumentName + ' must be a ' + recordType);
	}
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var has = require('has');

var $assign = GetIntrinsic('%Object%').assign;

module.exports = function assign(target, source) {
	if ($assign) {
		return $assign(target, source);
	}

	// eslint-disable-next-line no-restricted-syntax
	for (var key in source) {
		if (has(source, key)) {
			// eslint-disable-next-line no-param-reassign
			target[key] = source[key];
		}
	}
	return target;
};
'use strict';

var bind = require('function-bind');

var GetIntrinsic = require('../GetIntrinsic');

var $Function = GetIntrinsic('%Function%');
var $apply = $Function.apply;
var $call = $Function.call;

module.exports = function callBind() {
	return bind.apply($call, arguments);
};

module.exports.apply = function applyBind() {
	return bind.apply($apply, arguments);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var callBind = require('./callBind');

var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));

module.exports = function callBoundIntrinsic(name, allowMissing) {
	var intrinsic = GetIntrinsic(name, !!allowMissing);
	if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.')) {
		return callBind(intrinsic);
	}
	return intrinsic;
};
'use strict';

module.exports = function every(array, predicate) {
	for (var i = 0; i < array.length; i += 1) {
		if (!predicate(array[i], i, array)) {
			return false;
		}
	}
	return true;
};
'use strict';

module.exports = function forEach(array, callback) {
	for (var i = 0; i < array.length; i += 1) {
		callback(array[i], i, array); // eslint-disable-line callback-return
	}
};
'use strict';

var getInferredName;
try {
	// eslint-disable-next-line no-new-func
	getInferredName = Function('s', 'return { [s]() {} }[s].name;');
} catch (e) {}

var inferred = function () {};
module.exports = getInferredName && inferred.name === 'inferred' ? getInferredName : null;
'use strict';

var hasSymbols = require('has-symbols')();
var GetIntrinsic = require('../GetIntrinsic');
var callBound = require('./callBound');

var $iterator = GetIntrinsic('%Symbol.iterator%', true);
var $stringSlice = callBound('String.prototype.slice');

module.exports = function getIteratorMethod(ES, iterable) {
	var usingIterator;
	if (hasSymbols) {
		usingIterator = ES.GetMethod(iterable, $iterator);
	} else if (ES.IsArray(iterable)) {
		usingIterator = function () {
			var i = -1;
			var arr = this; // eslint-disable-line no-invalid-this
			return {
				next: function () {
					i += 1;
					return {
						done: i >= arr.length,
						value: arr[i]
					};
				}
			};
		};
	} else if (ES.Type(iterable) === 'String') {
		usingIterator = function () {
			var i = 0;
			return {
				next: function () {
					var nextIndex = ES.AdvanceStringIndex(iterable, i, true);
					var value = $stringSlice(iterable, i, nextIndex);
					i = nextIndex;
					return {
						done: nextIndex > iterable.length,
						value: value
					};
				}
			};
		};
	}
	return usingIterator;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%');
if ($gOPD) {
	try {
		$gOPD([], 'length');
	} catch (e) {
		// IE 8 has a broken gOPD
		$gOPD = null;
	}
}

module.exports = $gOPD;
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var originalGetProto = GetIntrinsic('%Object.getPrototypeOf%', true);
var $ArrayProto = GetIntrinsic('%Array.prototype%');

module.exports = originalGetProto || (
	// eslint-disable-next-line no-proto
	[].__proto__ === $ArrayProto
		? function (O) {
			return O.__proto__; // eslint-disable-line no-proto
		}
		: null
);
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var callBound = require('./callBound');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var symToStr = callBound('Symbol.prototype.toString', true);

var getInferredName = require('./getInferredName');

module.exports = function getSymbolDescription(symbol) {
	if (!symToStr) {
		throw new $SyntaxError('Symbols are not supported in this environment');
	}
	var str = symToStr(symbol); // will throw if not a symbol

	if (getInferredName) {
		var name = getInferredName(symbol);
		if (name === '') { return; }
		// eslint-disable-next-line consistent-return
		return name.slice(1, -1); // name.slice('['.length, -']'.length);
	}

	var desc = str.slice(7, -1); // str.slice('Symbol('.length, -')'.length);
	if (desc) {
		// eslint-disable-next-line consistent-return
		return desc;
	}
};
'use strict';

var $isNaN = Number.isNaN || function (a) { return a !== a; };

module.exports = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; };
'use strict';

module.exports = Number.isNaN || function isNaN(a) {
	return a !== a;
};
'use strict';

var $strSlice = require('../helpers/callBound')('String.prototype.slice');

module.exports = function isPrefixOf(prefix, string) {
	if (prefix === string) {
		return true;
	}
	if (prefix.length > string.length) {
		return false;
	}
	return $strSlice(string, 0, prefix.length) === prefix;
};
'use strict';

module.exports = function isPrimitive(value) {
	return value === null || (typeof value !== 'function' && typeof value !== 'object');
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var has = require('has');
var $TypeError = GetIntrinsic('%TypeError%');

module.exports = function IsPropertyDescriptor(ES, Desc) {
	if (ES.Type(Desc) !== 'Object') {
		return false;
	}
	var allowed = {
		'[[Configurable]]': true,
		'[[Enumerable]]': true,
		'[[Get]]': true,
		'[[Set]]': true,
		'[[Value]]': true,
		'[[Writable]]': true
	};

    for (var key in Desc) { // eslint-disable-line
		if (has(Desc, key) && !allowed[key]) {
			return false;
		}
	}

	if (ES.IsDataDescriptor(Desc) && ES.IsAccessorDescriptor(Desc)) {
		throw new $TypeError('Property Descriptors may not be both accessor and data descriptors');
	}
	return true;
};
'use strict';

var every = require('./every');

module.exports = function isSamePropertyDescriptor(ES, D1, D2) {
	var fields = [
		'[[Configurable]]',
		'[[Enumerable]]',
		'[[Get]]',
		'[[Set]]',
		'[[Value]]',
		'[[Writable]]'
	];
	return every(fields, function (field) {
		if ((field in D1) !== (field in D2)) {
			return false;
		}
		return ES.SameValue(D1[field], D2[field]);
	});
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');
var $Number = GetIntrinsic('%Number%');

module.exports = $Number.MAX_SAFE_INTEGER || $Math.pow(2, 53) - 1;
'use strict';

module.exports = function mod(number, modulo) {
	var remain = number % modulo;
	return Math.floor(remain >= 0 ? remain : remain + modulo);
};
'use strict';

var callBound = require('../helpers/callBound');

var $strSlice = callBound('String.prototype.slice');

module.exports = function padTimeComponent(c, count) {
	return $strSlice('00' + c, -(count || 2));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $test = GetIntrinsic('RegExp.prototype.test');

var callBind = require('./callBind');

module.exports = function regexTester(regex) {
	return callBind($test, regex);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var originalSetProto = GetIntrinsic('%Object.setPrototypeOf%', true);
var $ArrayProto = GetIntrinsic('%Array.prototype%');

module.exports = originalSetProto || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayProto
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);
'use strict';

module.exports = function sign(number) {
	return number >= 0 ? 1 : -1;
};
'use strict';

var HoursPerDay = 24;
var MinutesPerHour = 60;
var SecondsPerMinute = 60;
var msPerSecond = 1e3;
var msPerMinute = msPerSecond * SecondsPerMinute;
var msPerHour = msPerMinute * MinutesPerHour;
var msPerDay = 86400000;

module.exports = {
	HoursPerDay: HoursPerDay,
	MinutesPerHour: MinutesPerHour,
	SecondsPerMinute: SecondsPerMinute,
	msPerSecond: msPerSecond,
	msPerMinute: msPerMinute,
	msPerHour: msPerHour,
	msPerDay: msPerDay
};
'use strict';

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return x === y; // ES6+ specified this shortcut anyways.
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	return false;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var isPrefixOf = require('../helpers/isPrefixOf');

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5

// eslint-disable-next-line max-statements
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
	if (!bothStrings) {
		var nx = ToNumber(px);
		var ny = ToNumber(py);
		if ($isNaN(nx) || $isNaN(ny)) {
			return undefined;
		}
		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
			return false;
		}
		if (nx === 0 && ny === 0) {
			return false;
		}
		if (nx === Infinity) {
			return false;
		}
		if (ny === Infinity) {
			return true;
		}
		if (ny === -Infinity) {
			return false;
		}
		if (nx === -Infinity) {
			return true;
		}
		return nx < ny; // by now, these are both nonzero, finite, and not equal
	}
	if (isPrefixOf(py, px)) {
		return false;
	}
	if (isPrefixOf(px, py)) {
		return true;
	}
	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.10

module.exports = function CheckObjectCoercible(value, optMessage) {
	if (value == null) {
		throw new $TypeError(optMessage || ('Cannot call method on ' + value));
	}
	return value;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return $floor(t / msPerDay);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + $floor((y - 1969) / 4) - $floor((y - 1901) / 100) + $floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var mod = require('../helpers/mod');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (mod(y, 4) !== 0) {
		return 365;
	}
	if (mod(y, 100) !== 0) {
		return 366;
	}
	if (mod(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');

var assertRecord = require('../helpers/assertRecord');

// https://ecma-international.org/ecma-262/5.1/#sec-8.10.4

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return Desc;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsDataDescriptor(Desc)) {
		return {
			value: Desc['[[Value]]'],
			writable: !!Desc['[[Writable]]'],
			enumerable: !!Desc['[[Enumerable]]'],
			configurable: !!Desc['[[Configurable]]']
		};
	} else if (IsAccessorDescriptor(Desc)) {
		return {
			get: Desc['[[Get]]'],
			set: Desc['[[Set]]'],
			enumerable: !!Desc['[[Enumerable]]'],
			configurable: !!Desc['[[Configurable]]']
		};
	} else {
		throw new $TypeError('FromPropertyDescriptor must be called with a fully populated Property Descriptor');
	}
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return mod($floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var has = require('has');

var Type = require('./Type');

var assertRecord = require('../helpers/assertRecord');

// https://ecma-international.org/ecma-262/5.1/#sec-8.10.1

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var has = require('has');

var Type = require('./Type');

var assertRecord = require('../helpers/assertRecord');

// https://ecma-international.org/ecma-262/5.1/#sec-8.10.2

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

var assertRecord = require('../helpers/assertRecord');

// https://ecma-international.org/ecma-262/5.1/#sec-8.10.3

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var Type = require('./Type');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');

// https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type

module.exports = function IsPropertyDescriptor(Desc) {
	return isPropertyDescriptor({
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor,
		Type: Type
	}, Desc);
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');
var $DateUTC = GetIntrinsic('%Date.UTC%');

var mod = require('../helpers/mod');
var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var MonthFromTime = require('./MonthFromTime');
var ToInteger = require('./ToInteger');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToInteger(year);
	var m = ToInteger(month);
	var dt = ToInteger(date);
	var ym = y + $floor(m / 12);
	var mn = mod(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToInteger = require('./ToInteger');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToInteger(hour);
	var m = ToInteger(min);
	var s = ToInteger(sec);
	var milli = ToInteger(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return mod($floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return mod($floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');
var $abs = GetIntrinsic('%Math.abs%');

var $isFinite = require('../helpers/isFinite');

var ToNumber = require('./ToNumber');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || $abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var mod = require('../helpers/mod');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return mod(t, msPerDay);
};

'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var ToNumber = require('./ToNumber');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');
var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

var $floor = $Math.floor;
var $abs = $Math.abs;

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.4

module.exports = function ToInteger(value) {
	var number = ToNumber(value);
	if ($isNaN(number)) { return 0; }
	if (number === 0 || !$isFinite(number)) { return number; }
	return $sign(number) * $floor($abs(number));
};
'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.3

module.exports = function ToNumber(value) {
	return +value; // eslint-disable-line no-implicit-coercion
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Object = GetIntrinsic('%Object%');

var CheckObjectCoercible = require('./CheckObjectCoercible');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.9

module.exports = function ToObject(value) {
	CheckObjectCoercible(value);
	return $Object(value);
};
'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.1

module.exports = require('es-to-primitive/es5');
'use strict';

var has = require('has');

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://ecma-international.org/ecma-262/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $String = GetIntrinsic('%String%');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.8

module.exports = function ToString(value) {
	return $String(value);
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');
var $mod = require('../helpers/mod');

var $floor = $Math.floor;
var $abs = $Math.abs;

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * $floor($abs(number));
	return $mod(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

// https://www.ecma-international.org/ecma-262/5.1/#sec-8

module.exports = function Type(x) {
	if (x === null) {
		return 'Null';
	}
	if (typeof x === 'undefined') {
		return 'Undefined';
	}
	if (typeof x === 'function' || typeof x === 'object') {
		return 'Object';
	}
	if (typeof x === 'number') {
		return 'Number';
	}
	if (typeof x === 'boolean') {
		return 'Boolean';
	}
	if (typeof x === 'string') {
		return 'String';
	}
};
'use strict';

var mod = require('../helpers/mod');

var Day = require('./Day');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return mod(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('../helpers/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var mod = require('../helpers/mod');

// https://ecma-international.org/ecma-262/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var mod = require('../helpers/mod');
var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return mod(t, msPerSecond);
};
'use strict';

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return x === y; // ES6+ specified this shortcut anyways.
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	return false;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var isPrefixOf = require('../helpers/isPrefixOf');

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5

// eslint-disable-next-line max-statements
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
	if (!bothStrings) {
		var nx = ToNumber(px);
		var ny = ToNumber(py);
		if ($isNaN(nx) || $isNaN(ny)) {
			return undefined;
		}
		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
			return false;
		}
		if (nx === 0 && ny === 0) {
			return false;
		}
		if (nx === Infinity) {
			return false;
		}
		if (ny === Infinity) {
			return true;
		}
		if (ny === -Infinity) {
			return false;
		}
		if (nx === -Infinity) {
			return true;
		}
		return nx < ny; // by now, these are both nonzero, finite, and not equal
	}
	if (isPrefixOf(py, px)) {
		return false;
	}
	if (isPrefixOf(px, py)) {
		return true;
	}
	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
};
'use strict';

var inspect = require('object-inspect');

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var Get = require('./Get');
var GetIterator = require('./GetIterator');
var IsCallable = require('./IsCallable');
var IteratorClose = require('./IteratorClose');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');
var Type = require('./Type');

// https://tc39.es/ecma262/#sec-add-entries-from-iterable

module.exports = function AddEntriesFromIterable(target, iterable, adder) {
	if (!IsCallable(adder)) {
		throw new $TypeError('Assertion failed: `adder` is not callable');
	}
	if (iterable == null) {
		throw new $TypeError('Assertion failed: `iterable` is present, and not nullish');
	}
	var iteratorRecord = GetIterator(iterable);
	while (true) { // eslint-disable-line no-constant-condition
		var next = IteratorStep(iteratorRecord);
		if (!next) {
			return target;
		}
		var nextItem = IteratorValue(next);
		if (Type(nextItem) !== 'Object') {
			var error = new $TypeError('iterator next must return an Object, got ' + inspect(nextItem));
			return IteratorClose(
				iteratorRecord,
				function () { throw error; } // eslint-disable-line no-loop-func
			);
		}
		try {
			var k = Get(nextItem, '0');
			var v = Get(nextItem, '1');
			Call(adder, target, [k, v]);
		} catch (e) {
			return IteratorClose(
				iteratorRecord,
				function () { throw e; }
			);
		}
	}
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var $TypeError = GetIntrinsic('%TypeError%');

var $charCodeAt = require('../helpers/callBound')('String.prototype.charCodeAt');

// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex

module.exports = function AdvanceStringIndex(S, index, unicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
	}
	if (Type(unicode) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
	}
	if (!unicode) {
		return index + 1;
	}
	var length = S.length;
	if ((index + 1) >= length) {
		return index + 1;
	}

	var first = $charCodeAt(S, index);
	if (first < 0xD800 || first > 0xDBFF) {
		return index + 1;
	}

	var second = $charCodeAt(S, index + 1);
	if (second < 0xDC00 || second > 0xDFFF) {
		return index + 1;
	}

	return index + 2;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayPrototype
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);

// https://www.ecma-international.org/ecma-262/6.0/#sec-arraycreate

module.exports = function ArrayCreate(length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
	}
	if (length > MAX_ARRAY_LENGTH) {
		throw new $RangeError('length is greater than (2**32 - 1)');
	}
	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
	var A = []; // steps 5 - 7, and 9
	if (proto !== $ArrayPrototype) { // step 8
		if (!$setProto) {
			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
		$setProto(A, proto);
	}
	if (length !== 0) { // bypasses the need for step 2
		A.length = length;
	}
	/* step 10, the above as a shortcut for the below
    OrdinaryDefineOwnProperty(A, 'length', {
        '[[Configurable]]': false,
        '[[Enumerable]]': false,
        '[[Value]]': length,
        '[[Writable]]': true
    });
    */
	return A;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var assign = require('object.assign');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsArray = require('./IsArray');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-arraysetlength

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function ArraySetLength(A, Desc) {
	if (!IsArray(A)) {
		throw new $TypeError('Assertion failed: A must be an Array');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!('[[Value]]' in Desc)) {
		return OrdinaryDefineOwnProperty(A, 'length', Desc);
	}
	var newLenDesc = assign({}, Desc);
	var newLen = ToUint32(Desc['[[Value]]']);
	var numberLen = ToNumber(Desc['[[Value]]']);
	if (newLen !== numberLen) {
		throw new $RangeError('Invalid array length');
	}
	newLenDesc['[[Value]]'] = newLen;
	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
	if (!IsDataDescriptor(oldLenDesc)) {
		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
	}
	var oldLen = oldLenDesc['[[Value]]'];
	if (newLen >= oldLen) {
		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	}
	if (!oldLenDesc['[[Writable]]']) {
		return false;
	}
	var newWritable;
	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
		newWritable = true;
	} else {
		newWritable = false;
		newLenDesc['[[Writable]]'] = true;
	}
	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	if (!succeeded) {
		return false;
	}
	while (newLen < oldLen) {
		oldLen -= 1;
		// eslint-disable-next-line no-param-reassign
		var deleteSucceeded = delete A[ToString(oldLen)];
		if (!deleteSucceeded) {
			newLenDesc['[[Value]]'] = oldLen + 1;
			if (!newWritable) {
				newLenDesc['[[Writable]]'] = false;
				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
				return false;
			}
		}
	}
	if (!newWritable) {
		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
	}
	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Array = GetIntrinsic('%Array%');
var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsConstructor = require('./IsConstructor');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate

module.exports = function ArraySpeciesCreate(originalArray, length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: length must be an integer >= 0');
	}
	var len = length === 0 ? 0 : length;
	var C;
	var isArray = IsArray(originalArray);
	if (isArray) {
		C = Get(originalArray, 'constructor');
		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
		// if (IsConstructor(C)) {
		// 	if C is another realm's Array, C = undefined
		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
		// }
		if ($species && Type(C) === 'Object') {
			C = Get(C, $species);
			if (C === null) {
				C = void 0;
			}
		}
	}
	if (typeof C === 'undefined') {
		return $Array(len);
	}
	if (!IsConstructor(C)) {
		throw new $TypeError('C must be a constructor');
	}
	return new C(len); // Construct(C, len);
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsCallable = require('./IsCallable');

// https://www.ecma-international.org/ecma-262/6.0/#sec-call

module.exports = function Call(F, V) {
	var args = arguments.length > 2 ? arguments[2] : [];
	if (!IsCallable(F)) {
		throw new $TypeError(inspect(F) + ' is not a function');
	}
	return F.apply(V, args);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring

module.exports = function CanonicalNumericIndexString(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Assertion failed: `argument` must be a String');
	}
	if (argument === '-0') { return -0; }
	var n = ToNumber(argument);
	if (SameValue(ToString(n), argument)) { return n; }
	return void 0;
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor

module.exports = function CompletePropertyDescriptor(Desc) {
	/* eslint no-param-reassign: 0 */
	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
		if (!has(Desc, '[[Value]]')) {
			Desc['[[Value]]'] = void 0;
		}
		if (!has(Desc, '[[Writable]]')) {
			Desc['[[Writable]]'] = false;
		}
	} else {
		if (!has(Desc, '[[Get]]')) {
			Desc['[[Get]]'] = void 0;
		}
		if (!has(Desc, '[[Set]]')) {
			Desc['[[Set]]'] = void 0;
		}
	}
	if (!has(Desc, '[[Enumerable]]')) {
		Desc['[[Enumerable]]'] = false;
	}
	if (!has(Desc, '[[Configurable]]')) {
		Desc['[[Configurable]]'] = false;
	}
	return Desc;
};
'use strict';

var callBound = require('../helpers/callBound');
var forEach = require('../helpers/forEach');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/9.0/#sec-copydataproperties

module.exports = function CopyDataProperties(target, source, excludedItems) {
	if (Type(target) !== 'Object') {
		throw new TypeError('Assertion failed: "target" must be an Object');
	}

	if (!IsArray(excludedItems)) {
		throw new TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
	}
	for (var i = 0; i < excludedItems.length; i += 1) {
		if (!IsPropertyKey(excludedItems[i])) {
			throw new TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
		}
	}

	if (typeof source === 'undefined' || source === null) {
		return target;
	}

	var ES = this;

	var fromObj = ES.ToObject(source);

	var sourceKeys = OwnPropertyKeys(fromObj);
	forEach(sourceKeys, function (nextKey) {
		var excluded = false;

		forEach(excludedItems, function (e) {
			if (ES.SameValue(e, nextKey) === true) {
				excluded = true;
			}
		});

		var enumerable = $isEnumerable(fromObj, nextKey) || (
		// this is to handle string keys being non-enumerable in older engines
			typeof source === 'string'
            && nextKey >= 0
            && ES.IsInteger(ES.ToNumber(nextKey))
		);
		if (excluded === false && enumerable) {
			var propValue = ES.Get(fromObj, nextKey);
			ES.CreateDataProperty(target, nextKey, propValue);
		}
	});

	return target;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createdataproperty

module.exports = function CreateDataProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var oldDesc = OrdinaryGetOwnProperty(O, P);
	var extensible = oldDesc || IsExtensible(O);
	var immutable = oldDesc && (!oldDesc.writable || !oldDesc.configurable);
	if (immutable || !extensible) {
		return false;
	}
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		{
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Value]]': V,
			'[[Writable]]': true
		}
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateDataProperty = require('./CreateDataProperty');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow

module.exports = function CreateDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var success = CreateDataProperty(O, P, V);
	if (!success) {
		throw new $TypeError('unable to create data property');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $replace = callBound('String.prototype.replace');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createhtml

module.exports = function CreateHTML(string, tag, attribute, value) {
	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
	}
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var p1 = '<' + tag;
	if (attribute !== '') {
		var V = ToString(value);
		var escapedV = $replace(V, /\x22/g, '&quot;');
		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
	}
	return p1 + '>' + S + '</' + tag + '>';
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject

module.exports = function CreateIterResultObject(value, done) {
	if (Type(done) !== 'Boolean') {
		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
	}
	return {
		value: value,
		done: done
	};
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var callBound = require('../helpers/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
var $push = callBound('Array.prototype.push');

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToLength = require('./ToLength');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
module.exports = function CreateListFromArrayLike(obj) {
	var elementTypes = arguments.length > 1
		? arguments[1]
		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];

	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	if (!IsArray(elementTypes)) {
		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
	}
	var len = ToLength(Get(obj, 'length'));
	var list = [];
	var index = 0;
	while (index < len) {
		var indexName = ToString(index);
		var next = Get(obj, indexName);
		var nextType = Type(next);
		if ($indexOf(elementTypes, nextType) < 0) {
			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
		}
		$push(list, next);
		index += 1;
	}
	return list;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createmethodproperty

module.exports = function CreateMethodProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		newDesc
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var Type = require('./Type');
var WeekDay = require('./WeekDay');
var MonthFromTime = require('./MonthFromTime');
var YearFromTime = require('./YearFromTime');
var DateFromTime = require('./DateFromTime');

// https://www.ecma-international.org/ecma-262/9.0/#sec-datestring

module.exports = function DateString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var weekday = weekdays[WeekDay(tv)];
	var month = months[MonthFromTime(tv)];
	var day = padTimeComponent(DateFromTime(tv));
	var year = padTimeComponent(YearFromTime(tv), 4);
	return weekday + '\x20' + month + '\x20' + day + '\x20' + year;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return $floor(t / msPerDay);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + $floor((y - 1969) / 4) - $floor((y - 1901) / 100) + $floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var mod = require('../helpers/mod');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (mod(y, 4) !== 0) {
		return 365;
	}
	if (mod(y, 100) !== 0) {
		return 366;
	}
	if (mod(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow

module.exports = function DefinePropertyOrThrow(O, P, desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var Desc = isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, desc) ? desc : ToPropertyDescriptor(desc);
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
	}

	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		Desc
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow

module.exports = function DeletePropertyOrThrow(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// eslint-disable-next-line no-param-reassign
	var success = delete O[P];
	if (!success) {
		throw new $TypeError('Attempt to delete property failed.');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var objectKeys = require('object-keys');

var callBound = require('../helpers/callBound');

var callBind = require('../helpers/callBind');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));

var forEach = require('../helpers/forEach');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/8.0/#sec-enumerableownproperties

module.exports = function EnumerableOwnProperties(O, kind) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	var keys = objectKeys(O);
	if (kind === 'key') {
		return keys;
	}
	if (kind === 'value' || kind === 'key+value') {
		var results = [];
		forEach(keys, function (key) {
			if ($isEnumerable(O, key)) {
				$pushApply(results, [
					kind === 'value' ? O[key] : [key, O[key]]
				]);
			}
		});
		return results;
	}
	throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var Call = require('./Call');
var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');
var Get = require('./Get');
var HasProperty = require('./HasProperty');
var IsArray = require('./IsArray');
var ToLength = require('./ToLength');
var ToString = require('./ToString');

// https://ecma-international.org/ecma-262/10.0/#sec-flattenintoarray

// eslint-disable-next-line max-params, max-statements
module.exports = function FlattenIntoArray(target, source, sourceLen, start, depth) {
	var mapperFunction;
	if (arguments.length > 5) {
		mapperFunction = arguments[5];
	}

	var targetIndex = start;
	var sourceIndex = 0;
	while (sourceIndex < sourceLen) {
		var P = ToString(sourceIndex);
		var exists = HasProperty(source, P);
		if (exists === true) {
			var element = Get(source, P);
			if (typeof mapperFunction !== 'undefined') {
				if (arguments.length <= 6) {
					throw new $TypeError('Assertion failed: thisArg is required when mapperFunction is provided');
				}
				element = Call(mapperFunction, arguments[6], [element, sourceIndex, source]);
			}
			var shouldFlatten = false;
			if (depth > 0) {
				shouldFlatten = IsArray(element);
			}
			if (shouldFlatten) {
				var elementLen = ToLength(Get(element, 'length'));
				targetIndex = FlattenIntoArray(target, element, elementLen, targetIndex, depth - 1);
			} else {
				if (targetIndex >= MAX_SAFE_INTEGER) {
					throw new $TypeError('index too large');
				}
				CreateDataPropertyOrThrow(target, ToString(targetIndex), element);
				targetIndex += 1;
			}
		}
		sourceIndex += 1;
	}

	return targetIndex;
};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return Desc;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	var obj = {};
	if ('[[Value]]' in Desc) {
		obj.value = Desc['[[Value]]'];
	}
	if ('[[Writable]]' in Desc) {
		obj.writable = Desc['[[Writable]]'];
	}
	if ('[[Get]]' in Desc) {
		obj.get = Desc['[[Get]]'];
	}
	if ('[[Set]]' in Desc) {
		obj.set = Desc['[[Set]]'];
	}
	if ('[[Enumerable]]' in Desc) {
		obj.enumerable = Desc['[[Enumerable]]'];
	}
	if ('[[Configurable]]' in Desc) {
		obj.configurable = Desc['[[Configurable]]'];
	}
	return obj;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

/**
 * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
 * 1. Assert: Type(O) is Object.
 * 2. Assert: IsPropertyKey(P) is true.
 * 3. Return O.[[Get]](P, O).
 */

module.exports = function Get(O, P) {
	// 7.3.1.1
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	// 7.3.1.2
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
	}
	// 7.3.1.3
	return O[P];
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getiterator

module.exports = function GetIterator(obj, method) {
	var actualMethod = method;
	if (arguments.length < 2) {
		actualMethod = getIteratorMethod(
			{
				AdvanceStringIndex: AdvanceStringIndex,
				GetMethod: GetMethod,
				IsArray: IsArray,
				Type: Type
			},
			obj
		);
	}
	var iterator = Call(actualMethod, obj);
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('iterator must return an object');
	}

	return iterator;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var GetV = require('./GetV');
var IsCallable = require('./IsCallable');
var IsPropertyKey = require('./IsPropertyKey');

/**
 * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
 * 1. Assert: IsPropertyKey(P) is true.
 * 2. Let func be GetV(O, P).
 * 3. ReturnIfAbrupt(func).
 * 4. If func is either undefined or null, return undefined.
 * 5. If IsCallable(func) is false, throw a TypeError exception.
 * 6. Return func.
 */

module.exports = function GetMethod(O, P) {
	// 7.3.9.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.9.2
	var func = GetV(O, P);

	// 7.3.9.4
	if (func == null) {
		return void 0;
	}

	// 7.3.9.5
	if (!IsCallable(func)) {
		throw new $TypeError(P + 'is not a function');
	}

	// 7.3.9.6
	return func;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');

var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%');
var keys = require('object-keys');

var esType = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys

module.exports = function GetOwnPropertyKeys(O, Type) {
	if (esType(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (Type === 'Symbol') {
		return $gOPS ? $gOPS(O) : [];
	}
	if (Type === 'String') {
		if (!$gOPN) {
			return keys(O);
		}
		return $gOPN(O);
	}
	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Function = GetIntrinsic('%Function%');
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor

module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	if (!IsConstructor(constructor)) {
		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
	}
	var proto = Get(constructor, 'prototype');
	if (Type(proto) !== 'Object') {
		if (!(constructor instanceof $Function)) {
			// ignore other realms, for now
			throw new $TypeError('cross-realm constructors not currently supported');
		}
		proto = intrinsic;
	}
	return proto;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');
var regexTester = require('../helpers/regexTester');
var every = require('../helpers/every');

var $charAt = callBound('String.prototype.charAt');
var $strSlice = callBound('String.prototype.slice');
var $indexOf = callBound('String.prototype.indexOf');
var $parseInt = parseInt;

var isDigit = regexTester(/^[0-9]$/);

var inspect = require('object-inspect');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var ToObject = require('./ToObject');
var ToString = require('./ToString');
var Type = require('./Type');

var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false

var isStringOrHole = function (capture, index, arr) {
	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
};

// http://www.ecma-international.org/ecma-262/9.0/#sec-getsubstitution

// eslint-disable-next-line max-statements, max-params, max-lines-per-function
module.exports = function GetSubstitution(matched, str, position, captures, namedCaptures, replacement) {
	if (Type(matched) !== 'String') {
		throw new $TypeError('Assertion failed: `matched` must be a String');
	}
	var matchLength = matched.length;

	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `str` must be a String');
	}
	var stringLength = str.length;

	if (!IsInteger(position) || position < 0 || position > stringLength) {
		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
	}

	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
	}

	if (Type(replacement) !== 'String') {
		throw new $TypeError('Assertion failed: `replacement` must be a String');
	}

	var tailPos = position + matchLength;
	var m = captures.length;
	if (Type(namedCaptures) !== 'Undefined') {
		namedCaptures = ToObject(namedCaptures); // eslint-disable-line no-param-reassign
	}

	var result = '';
	for (var i = 0; i < replacement.length; i += 1) {
		// if this is a $, and it's not the end of the replacement
		var current = $charAt(replacement, i);
		var isLast = (i + 1) >= replacement.length;
		var nextIsLast = (i + 2) >= replacement.length;
		if (current === '$' && !isLast) {
			var next = $charAt(replacement, i + 1);
			if (next === '$') {
				result += '$';
				i += 1;
			} else if (next === '&') {
				result += matched;
				i += 1;
			} else if (next === '`') {
				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
				i += 1;
			} else if (next === "'") {
				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
				i += 1;
			} else {
				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
					// $1 through $9, and not followed by a digit
					var n = $parseInt(next, 10);
					// if (n > m, impl-defined)
					result += (n <= m && Type(captures[n - 1]) === 'Undefined') ? '' : captures[n - 1];
					i += 1;
				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
					// $00 through $99
					var nn = next + nextNext;
					var nnI = $parseInt(nn, 10) - 1;
					// if nn === '00' or nn > m, impl-defined
					result += (nn <= m && Type(captures[nnI]) === 'Undefined') ? '' : captures[nnI];
					i += 2;
				} else if (next === '<') {
					// eslint-disable-next-line max-depth
					if (Type(namedCaptures) === 'Undefined') {
						result += '$<';
						i += 2;
					} else {
						var endIndex = $indexOf(replacement, '>', i);
						// eslint-disable-next-line max-depth
						if (endIndex > -1) {
							var groupName = $strSlice(replacement, i, endIndex);
							var capture = Get(namedCaptures, groupName);
							// eslint-disable-next-line max-depth
							if (Type(capture) !== 'Undefined') {
								result += ToString(capture);
							}
							i += '$<' + groupName + '>'.length;
						}
					}
				} else {
					result += '$';
				}
			}
		} else {
			// the final $, or else not a $
			result += $charAt(replacement, i);
		}
	}
	return result;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var ToObject = require('./ToObject');

/**
 * 7.3.2 GetV (V, P)
 * 1. Assert: IsPropertyKey(P) is true.
 * 2. Let O be ToObject(V).
 * 3. ReturnIfAbrupt(O).
 * 4. Return O.[[Get]](P, V).
 */

module.exports = function GetV(V, P) {
	// 7.3.2.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.2.2-3
	var O = ToObject(V);

	// 7.3.2.4
	return O[P];
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var has = require('has');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty

module.exports = function HasOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return has(O, P);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty

module.exports = function HasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return mod($floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-instanceofoperator

module.exports = function InstanceofOperator(O, C) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
	if (typeof instOfHandler !== 'undefined') {
		return ToBoolean(Call(instOfHandler, C, [O]));
	}
	if (!IsCallable(C)) {
		throw new $TypeError('`C` is not Callable');
	}
	return OrdinaryHasInstance(C, O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $arraySlice = require('../helpers/callBound')('Array.prototype.slice');

var Call = require('./Call');
var GetV = require('./GetV');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-invoke

module.exports = function Invoke(O, P) {
	if (!IsPropertyKey(P)) {
		throw new $TypeError('P must be a Property Key');
	}
	var argumentsList = $arraySlice(arguments, 2);
	var func = GetV(O, P);
	return Call(func, O, argumentsList);
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Array = GetIntrinsic('%Array%');

// eslint-disable-next-line global-require
var toStr = !$Array.isArray && require('../helpers/callBound')('Object.prototype.toString');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isarray

module.exports = $Array.isArray || function IsArray(argument) {
	return toStr(argument) === '[object Array]';
};
'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable

module.exports = function IsConcatSpreadable(O) {
	if (Type(O) !== 'Object') {
		return false;
	}
	if ($isConcatSpreadable) {
		var spreadable = Get(O, $isConcatSpreadable);
		if (typeof spreadable !== 'undefined') {
			return ToBoolean(spreadable);
		}
	}
	return IsArray(O);
};
'use strict';

// https://www.ecma-international.org/ecma-262/6.0/#sec-isconstructor

module.exports = function IsConstructor(argument) {
	return typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument`
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Object = GetIntrinsic('%Object%');

var isPrimitive = require('../helpers/isPrimitive');

var $preventExtensions = $Object.preventExtensions;
var $isExtensible = $Object.isExtensible;

// https://www.ecma-international.org/ecma-262/6.0/#sec-isextensible-o

module.exports = $preventExtensions
	? function IsExtensible(obj) {
		return !isPrimitive(obj) && $isExtensible(obj);
	}
	: function IsExtensible(obj) {
		return !isPrimitive(obj);
	};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var $floor = $Math.floor;
var $abs = $Math.abs;

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isinteger

module.exports = function IsInteger(argument) {
	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
		return false;
	}
	var abs = $abs(argument);
	return $floor(abs) === abs;
};
'use strict';

var callBound = require('../helpers/callBound');

var $PromiseThen = callBound('Promise.prototype.then', true);

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ispromise

module.exports = function IsPromise(x) {
	if (Type(x) !== 'Object') {
		return false;
	}
	if (!$PromiseThen) { // Promises are not supported
		return false;
	}
	try {
		$PromiseThen(x); // throws if not a promise
	} catch (e) {
		return false;
	}
	return true;
};
'use strict';

// https://www.ecma-international.org/ecma-262/6.0/#sec-ispropertykey

module.exports = function IsPropertyKey(argument) {
	return typeof argument === 'string' || typeof argument === 'symbol';
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $match = GetIntrinsic('%Symbol.match%', true);

var hasRegExpMatcher = require('is-regex');

var ToBoolean = require('./ToBoolean');

// https://ecma-international.org/ecma-262/6.0/#sec-isregexp

module.exports = function IsRegExp(argument) {
	if (!argument || typeof argument !== 'object') {
		return false;
	}
	if ($match) {
		var isRegExp = argument[$match];
		if (typeof isRegExp !== 'undefined') {
			return ToBoolean(isRegExp);
		}
	}
	return hasRegExpMatcher(argument);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPrefixOf = require('../helpers/isPrefixOf');

// var callBound = require('../helpers/callBound');

// var $charAt = callBound('String.prototype.charAt');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/9.0/#sec-isstringprefix

module.exports = function IsStringPrefix(p, q) {
	if (Type(p) !== 'String') {
		throw new $TypeError('Assertion failed: "p" must be a String');
	}

	if (Type(q) !== 'String') {
		throw new $TypeError('Assertion failed: "q" must be a String');
	}

	return isPrefixOf(p, q);
	/*
	if (p === q || p === '') {
		return true;
	}

	var pLength = p.length;
	var qLength = q.length;
	if (pLength >= qLength) {
		return false;
	}

	// assert: pLength < qLength

	for (var i = 0; i < pLength; i += 1) {
		if ($charAt(p, i) !== $charAt(q, i)) {
			return false;
		}
	}
	return true;
	*/
};
'use strict';

var callBound = require('../helpers/callBound');
var $arrayPush = callBound('Array.prototype.push');

var GetIterator = require('./GetIterator');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');

// https://www.ecma-international.org/ecma-262/8.0/#sec-iterabletolist

module.exports = function IterableToList(items, method) {
	var iterator = GetIterator(items, method);
	var values = [];
	var next = true;
	while (next) {
		next = IteratorStep(iterator);
		if (next) {
			var nextValue = IteratorValue(next);
			$arrayPush(values, nextValue);
		}
	}
	return values;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose

module.exports = function IteratorClose(iterator, completion) {
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
	}
	if (!IsCallable(completion)) {
		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
	}
	var completionThunk = completion;

	var iteratorReturn = GetMethod(iterator, 'return');

	if (typeof iteratorReturn === 'undefined') {
		return completionThunk();
	}

	var completionRecord;
	try {
		var innerResult = Call(iteratorReturn, iterator, []);
	} catch (e) {
		// if we hit here, then "e" is the innerResult completion that needs re-throwing

		// if the completion is of type "throw", this will throw.
		completionThunk();
		completionThunk = null; // ensure it's not called twice.

		// if not, then return the innerResult completion
		throw e;
	}
	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
	completionThunk = null; // ensure it's not called twice.

	if (Type(innerResult) !== 'Object') {
		throw new $TypeError('iterator .return must return an object');
	}

	return completionRecord;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete

module.exports = function IteratorComplete(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return ToBoolean(Get(iterResult, 'done'));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Invoke = require('./Invoke');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext

module.exports = function IteratorNext(iterator, value) {
	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
	if (Type(result) !== 'Object') {
		throw new $TypeError('iterator next must return an object');
	}
	return result;
};
'use strict';

var IteratorComplete = require('./IteratorComplete');
var IteratorNext = require('./IteratorNext');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep

module.exports = function IteratorStep(iterator) {
	var result = IteratorNext(iterator);
	var done = IteratorComplete(result);
	return done === true ? false : result;
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue

module.exports = function IteratorValue(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return Get(iterResult, 'value');
};

'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');
var $DateUTC = GetIntrinsic('%Date.UTC%');

var mod = require('../helpers/mod');
var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var MonthFromTime = require('./MonthFromTime');
var ToInteger = require('./ToInteger');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToInteger(year);
	var m = ToInteger(month);
	var dt = ToInteger(date);
	var ym = y + $floor(m / 12);
	var mn = mod(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToInteger = require('./ToInteger');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToInteger(hour);
	var m = ToInteger(min);
	var s = ToInteger(sec);
	var milli = ToInteger(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return mod($floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $String = GetIntrinsic('%String%');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/9.0/#sec-tostring-applied-to-the-number-type

module.exports = function NumberToString(m) {
	if (Type(m) !== 'Number') {
		throw new TypeError('Assertion failed: "m" must be a String');
	}

	return $String(m);
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $ObjectCreate = GetIntrinsic('%Object.create%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var Type = require('./Type');

var hasProto = !({ __proto__: null } instanceof Object);

// https://www.ecma-international.org/ecma-262/6.0/#sec-objectcreate

module.exports = function ObjectCreate(proto, internalSlotsList) {
	if (proto !== null && Type(proto) !== 'Object') {
		throw new $TypeError('Assertion failed: `proto` must be null or an object');
	}
	var slots = arguments.length < 2 ? [] : internalSlotsList;
	if (slots.length > 0) {
		throw new $SyntaxError('es-abstract does not yet support internal slots');
	}

	if ($ObjectCreate) {
		return $ObjectCreate(proto);
	}
	if (hasProto) {
		return { __proto__: proto };
	}

	if (proto === null) {
		throw new $SyntaxError('native Object.create support is required to create null objects');
	}
	var T = function T() {};
	T.prototype = proto;
	return new T();
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var SameValue = require('./SameValue');
var Type = require('./Type');
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty

module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!$gOPD) {
		// ES3/IE 8 fallback
		if (IsAccessorDescriptor(Desc)) {
			throw new $SyntaxError('This environment does not support accessor property descriptors.');
		}
		var creatingNormalDataProperty = !(P in O)
			&& Desc['[[Writable]]']
			&& Desc['[[Enumerable]]']
			&& Desc['[[Configurable]]']
			&& '[[Value]]' in Desc;
		var settingExistingDataProperty = (P in O)
			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
			&& '[[Value]]' in Desc;
		if (creatingNormalDataProperty || settingExistingDataProperty) {
			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
			return SameValue(O[P], Desc['[[Value]]']);
		}
		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
	}
	var desc = $gOPD(O, P);
	var current = desc && ToPropertyDescriptor(desc);
	var extensible = IsExtensible(O);
	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var has = require('has');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var IsRegExp = require('./IsRegExp');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty

module.exports = function OrdinaryGetOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!has(O, P)) {
		return void 0;
	}
	if (!$gOPD) {
		// ES3 / IE 8 fallback
		var arrayLength = IsArray(O) && P === 'length';
		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
		return {
			'[[Configurable]]': !(arrayLength || regexLastIndex),
			'[[Enumerable]]': $isEnumerable(O, P),
			'[[Value]]': O[P],
			'[[Writable]]': true
		};
	}
	return ToPropertyDescriptor($gOPD(O, P));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $getProto = require('../helpers/getProto');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/7.0/#sec-ordinarygetprototypeof

module.exports = function OrdinaryGetPrototypeOf(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!$getProto) {
		throw new $TypeError('This environment does not support fetching prototypes.');
	}
	return $getProto(O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance

module.exports = function OrdinaryHasInstance(C, O) {
	if (IsCallable(C) === false) {
		return false;
	}
	if (Type(O) !== 'Object') {
		return false;
	}
	var P = Get(C, 'prototype');
	if (Type(P) !== 'Object') {
		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
	}
	return O instanceof C;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty

module.exports = function OrdinaryHasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $setProto = require('../helpers/setProto');

var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/7.0/#sec-ordinarysetprototypeof

module.exports = function OrdinarySetPrototypeOf(O, V) {
	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
		throw new $TypeError('Assertion failed: V must be Object or Null');
	}
	/*
    var extensible = IsExtensible(O);
    var current = OrdinaryGetPrototypeOf(O);
    if (SameValue(V, current)) {
        return true;
    }
    if (!extensible) {
        return false;
    }
    */
	try {
		$setProto(O, V);
	} catch (e) {
		return false;
	}
	return OrdinaryGetPrototypeOf(O) === V;
	/*
    var p = V;
    var done = false;
    while (!done) {
        if (p === null) {
            done = true;
        } else if (SameValue(p, O)) {
            return false;
        } else {
            if (wat) {
                done = true;
            } else {
                p = p.[[Prototype]];
            }
        }
     }
     O.[[Prototype]] = V;
     return true;
     */
};
'use strict';

var callBound = require('../helpers/callBound');

var $PromiseResolve = callBound('Promise.resolve', true);

// https://ecma-international.org/ecma-262/9.0/#sec-promise-resolve

module.exports = function PromiseResolve(C, x) {
	if (!$PromiseResolve) {
		throw new SyntaxError('This environment does not support Promises.');
	}
	return $PromiseResolve(C, x);
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var regexExec = require('../helpers/callBound')('RegExp.prototype.exec');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec

module.exports = function RegExpExec(R, S) {
	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: `R` must be an Object');
	}
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	var exec = Get(R, 'exec');
	if (IsCallable(exec)) {
		var result = Call(exec, R, [S]);
		if (result === null || Type(result) === 'Object') {
			return result;
		}
		throw new $TypeError('"exec" method must return `null` or an Object');
	}
	return regexExec(R, S);
};
'use strict';

module.exports = require('../5/CheckObjectCoercible');
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');

// https://www.ecma-international.org/ecma-262/7.0/#sec-samevaluenonnumber

module.exports = function SameValueNonNumber(x, y) {
	if (typeof x === 'number' || typeof x !== typeof y) {
		throw new $TypeError('SameValueNonNumber requires two non-number values of the same type.');
	}
	return SameValue(x, y);
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// https://www.ecma-international.org/ecma-262/6.0/#sec-samevaluezero

module.exports = function SameValueZero(x, y) {
	return (x === y) || ($isNaN(x) && $isNaN(y));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return mod($floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw

module.exports = function Set(O, P, V, Throw) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	if (Type(Throw) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
	}
	if (Throw) {
		O[P] = V; // eslint-disable-line no-param-reassign
		return true;
	} else {
		try {
			O[P] = V; // eslint-disable-line no-param-reassign
		} catch (e) {
			return false;
		}
	}
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var has = require('has');

var $TypeError = GetIntrinsic('%TypeError%');

var getSymbolDescription = require('../helpers/getSymbolDescription');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsExtensible = require('./IsExtensible');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname

module.exports = function SetFunctionName(F, name) {
	if (typeof F !== 'function') {
		throw new $TypeError('Assertion failed: `F` must be a function');
	}
	if (!IsExtensible(F) || has(F, 'name')) {
		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
	}
	var nameType = Type(name);
	if (nameType !== 'Symbol' && nameType !== 'String') {
		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
	}
	if (nameType === 'Symbol') {
		var description = getSymbolDescription(name);
		// eslint-disable-next-line no-param-reassign
		name = typeof description === 'undefined' ? '' : '[' + description + ']';
	}
	if (arguments.length > 2) {
		var prefix = arguments[2];
		// eslint-disable-next-line no-param-reassign
		name = prefix + ' ' + name;
	}
	return DefinePropertyOrThrow(F, 'name', {
		'[[Value]]': name,
		'[[Writable]]': false,
		'[[Enumerable]]': false,
		'[[Configurable]]': true
	});
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');
var $preventExtensions = GetIntrinsic('%Object.preventExtensions%');
var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');

var forEach = require('../helpers/forEach');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-setintegritylevel

module.exports = function SetIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	if (!$preventExtensions) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
	}
	var status = $preventExtensions(O);
	if (!status) {
		return false;
	}
	if (!$gOPN) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
	}
	var theKeys = $gOPN(O);
	if (level === 'sealed') {
		forEach(theKeys, function (k) {
			DefinePropertyOrThrow(O, k, { configurable: false });
		});
	} else if (level === 'frozen') {
		forEach(theKeys, function (k) {
			var currentDesc = $gOPD(O, k);
			if (typeof currentDesc !== 'undefined') {
				var desc;
				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
					desc = { configurable: false };
				} else {
					desc = { configurable: false, writable: false };
				}
				DefinePropertyOrThrow(O, k, desc);
			}
		});
	}
	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor

module.exports = function SpeciesConstructor(O, defaultConstructor) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var C = O.constructor;
	if (typeof C === 'undefined') {
		return defaultConstructor;
	}
	if (Type(C) !== 'Object') {
		throw new $TypeError('O.constructor is not an Object');
	}
	var S = $species ? C[$species] : void 0;
	if (S == null) {
		return defaultConstructor;
	}
	if (IsConstructor(S)) {
		return S;
	}
	throw new $TypeError('no constructor found');
};
'use strict';

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $SymbolToString = callBound('Symbol.prototype.toString', true);

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring

module.exports = function SymbolDescriptiveString(sym) {
	if (Type(sym) !== 'Symbol') {
		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
	}
	return $SymbolToString(sym);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
var $TypeError = GetIntrinsic('%TypeError%');

var every = require('../helpers/every');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-testintegritylevel

module.exports = function TestIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	var status = IsExtensible(O);
	if (status) {
		return false;
	}
	var theKeys = $gOPN(O);
	return theKeys.length === 0 || every(theKeys, function (k) {
		var currentDesc = $gOPD(O, k);
		if (typeof currentDesc !== 'undefined') {
			if (currentDesc.configurable) {
				return false;
			}
			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
				return false;
			}
		}
		return true;
	});
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');
var $abs = GetIntrinsic('%Math.abs%');

var $isFinite = require('../helpers/isFinite');

var ToNumber = require('./ToNumber');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || $abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var HourFromTime = require('./HourFromTime');
var MinFromTime = require('./MinFromTime');
var SecFromTime = require('./SecFromTime');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/9.0/#sec-timestring

module.exports = function TimeString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var hour = HourFromTime(tv);
	var minute = MinFromTime(tv);
	var second = SecFromTime(tv);
	return padTimeComponent(hour) + ':' + padTimeComponent(minute) + ':' + padTimeComponent(second) + '\x20GMT';
};
'use strict';

var mod = require('../helpers/mod');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return mod(t, msPerDay);
};

'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Date = GetIntrinsic('%Date%');

var $isNaN = require('../helpers/isNaN');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-todatestring

module.exports = function ToDateString(tv) {
	if (Type(tv) !== 'Number') {
		throw new $TypeError('Assertion failed: `tv` must be a Number');
	}
	if ($isNaN(tv)) {
		return 'Invalid Date';
	}
	return $Date(tv);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $RangeError = GetIntrinsic('%RangeError%');

var ToInteger = require('./ToInteger');
var ToLength = require('./ToLength');
var SameValueZero = require('./SameValueZero');

// https://www.ecma-international.org/ecma-262/8.0/#sec-toindex

module.exports = function ToIndex(value) {
	if (typeof value === 'undefined') {
		return 0;
	}
	var integerIndex = ToInteger(value);
	if (integerIndex < 0) {
		throw new $RangeError('index must be >= 0');
	}
	var index = ToLength(integerIndex);
	if (!SameValueZero(integerIndex, index)) {
		throw new $RangeError('index must be >= 0 and < 2 ** 53 - 1');
	}
	return index;
};
'use strict';

var ToUint16 = require('./ToUint16');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toint16

module.exports = function ToInt16(argument) {
	var int16bit = ToUint16(argument);
	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
};
'use strict';

var ToNumber = require('./ToNumber');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var ToUint8 = require('./ToUint8');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toint8

module.exports = function ToInt8(argument) {
	var int8bit = ToUint8(argument);
	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
};
'use strict';

var ES5ToInteger = require('../5/ToInteger');

var ToNumber = require('./ToNumber');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tointeger

module.exports = function ToInteger(value) {
	var number = ToNumber(value);
	return ES5ToInteger(number);
};
'use strict';

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var ToInteger = require('./ToInteger');

module.exports = function ToLength(argument) {
	var len = ToInteger(argument);
	if (len <= 0) { return 0; } // includes converting -0 to +0
	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
	return len;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Number = GetIntrinsic('%Number%');
var $RegExp = GetIntrinsic('%RegExp%');
var $parseInteger = GetIntrinsic('%parseInt%');

var callBound = require('../helpers/callBound');
var regexTester = require('../helpers/regexTester');
var isPrimitive = require('../helpers/isPrimitive');

var $strSlice = callBound('String.prototype.slice');
var isBinary = regexTester(/^0b[01]+$/i);
var isOctal = regexTester(/^0o[0-7]+$/i);
var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
var hasNonWS = regexTester(nonWSregex);

// whitespace from: https://es5.github.io/#x15.5.4.20
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
var ws = [
	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
	'\u2029\uFEFF'
].join('');
var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
var $replace = callBound('String.prototype.replace');
var $trim = function (value) {
	return $replace(value, trimRegex, '');
};

var ToPrimitive = require('./ToPrimitive');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tonumber

module.exports = function ToNumber(argument) {
	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (typeof value === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a number');
	}
	if (typeof value === 'string') {
		if (isBinary(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 2));
		} else if (isOctal(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 8));
		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
			return NaN;
		} else {
			var trimmed = $trim(value);
			if (trimmed !== value) {
				return ToNumber(trimmed);
			}
		}
	}
	return $Number(value);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Object = GetIntrinsic('%Object%');

var RequireObjectCoercible = require('./RequireObjectCoercible');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toobject

module.exports = function ToObject(value) {
	RequireObjectCoercible(value);
	return $Object(value);
};
'use strict';

var toPrimitive = require('es-to-primitive/es2015');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive

module.exports = function ToPrimitive(input) {
	if (arguments.length > 1) {
		return toPrimitive(input, arguments[1]);
	}
	return toPrimitive(input);
};
'use strict';

var has = require('has');

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://ecma-international.org/ecma-262/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $String = GetIntrinsic('%String%');

var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');

// https://www.ecma-international.org/ecma-262/6.0/#sec-topropertykey

module.exports = function ToPropertyKey(argument) {
	var key = ToPrimitive(argument, $String);
	return typeof key === 'symbol' ? key : ToString(key);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function ToString(argument) {
	if (typeof argument === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a string');
	}
	return $String(argument);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');
var $mod = require('../helpers/mod');

var $floor = $Math.floor;
var $abs = $Math.abs;

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * $floor($abs(number));
	return $mod(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');
var $mod = require('../helpers/mod');

var $floor = $Math.floor;
var $abs = $Math.abs;

module.exports = function ToUint8(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * $floor($abs(number));
	return $mod(posInt, 0x100);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');

var $floor = $Math.floor;

// https://www.ecma-international.org/ecma-262/6.0/#sec-touint8clamp

module.exports = function ToUint8Clamp(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number <= 0) { return 0; }
	if (number >= 0xFF) { return 0xFF; }
	var f = $floor(argument);
	if (f + 0.5 < number) { return f + 1; }
	if (number < f + 0.5) { return f; }
	if (f % 2 !== 0) { return f + 1; }
	return f;
};
'use strict';

var trimStart = require('string.prototype.trimleft');
var trimEnd = require('string.prototype.trimright');

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');

// https://ecma-international.org/ecma-262/10.0/#sec-trimstring

module.exports = function TrimString(string, where) {
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var T;
	if (where === 'start') {
		T = trimStart(S);
	} else if (where === 'end') {
		T = trimEnd(S);
	} else if (where === 'start+end') {
		T = trimStart(trimEnd(S));
	} else {
		throw new $TypeError('Assertion failed: invalid `where` value; must be "start", "end", or "start+end"');
	}
	return T;
};
'use strict';

var ES5Type = require('../5/Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function Type(x) {
	if (typeof x === 'symbol') {
		return 'Symbol';
	}
	return ES5Type(x);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');
var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
// https://www.ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor

// eslint-disable-next-line max-lines-per-function, max-statements, max-params
module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
	var oType = Type(O);
	if (oType !== 'Undefined' && oType !== 'Object') {
		throw new $TypeError('Assertion failed: O must be undefined or an Object');
	}
	if (Type(extensible) !== 'Boolean') {
		throw new $TypeError('Assertion failed: extensible must be a Boolean');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, current)) {
		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
	}
	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
	}
	if (Type(current) === 'Undefined') {
		if (!extensible) {
			return false;
		}
		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': Desc['[[Configurable]]'],
						'[[Enumerable]]': Desc['[[Enumerable]]'],
						'[[Value]]': Desc['[[Value]]'],
						'[[Writable]]': Desc['[[Writable]]']
					}
				);
			}
		} else {
			if (!IsAccessorDescriptor(Desc)) {
				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
			}
			if (oType !== 'Undefined') {
				return DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					Desc
				);
			}
		}
		return true;
	}
	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
		return true;
	}
	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
		return true; // removed by ES2017, but should still be correct
	}
	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
	if (!current['[[Configurable]]']) {
		if (Desc['[[Configurable]]']) {
			return false;
		}
		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
			return false;
		}
	}
	if (IsGenericDescriptor(Desc)) {
		// no further validation is required.
	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			return false;
		}
		if (IsDataDescriptor(current)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': current['[[Configurable]]'],
						'[[Enumerable]]': current['[[Enumerable]]'],
						'[[Get]]': undefined
					}
				);
			}
		} else if (oType !== 'Undefined') {
			DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': current['[[Configurable]]'],
					'[[Enumerable]]': current['[[Enumerable]]'],
					'[[Value]]': undefined
				}
			);
		}
	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
				return false;
			}
			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
				return false;
			}
			return true;
		}
	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
				return false;
			}
			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
				return false;
			}
			return true;
		}
	} else {
		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
	}
	if (oType !== 'Undefined') {
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			Desc
		);
	}
	return true;
};
'use strict';

var mod = require('../helpers/mod');

var Day = require('./Day');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return mod(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('../helpers/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var mod = require('../helpers/mod');

// https://ecma-international.org/ecma-262/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var mod = require('../helpers/mod');
var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return mod(t, msPerSecond);
};
'use strict';

var $BooleanValueOf = require('../helpers/callBound')('Boolean.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object

module.exports = function thisBooleanValue(value) {
	if (Type(value) === 'Boolean') {
		return value;
	}

	return $BooleanValueOf(value);
};
'use strict';

var callBound = require('../helpers/callBound');

var Type = require('./Type');

var $NumberValueOf = callBound('Number.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object

module.exports = function thisNumberValue(value) {
	if (Type(value) === 'Number') {
		return value;
	}

	return $NumberValueOf(value);
};

'use strict';

var $StringValueOf = require('../helpers/callBound')('String.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object

module.exports = function thisStringValue(value) {
	if (Type(value) === 'String') {
		return value;
	}

	return $StringValueOf(value);
};
'use strict';

var callBound = require('../helpers/callBound');

var $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/9.0/#sec-thissymbolvalue

module.exports = function thisSymbolValue(value) {
	if (!$SymbolValueOf) {
		throw new SyntaxError('Symbols are not supported; thisSymbolValue requires that `value` be a Symbol or a Symbol object');
	}
	if (Type(value) === 'Symbol') {
		return value;
	}
	return $SymbolValueOf(value);
};
'use strict';

module.exports = require('../2018/thisTimeValue');
'use strict';

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return x === y; // ES6+ specified this shortcut anyways.
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	return false;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var isPrefixOf = require('../helpers/isPrefixOf');

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5

// eslint-disable-next-line max-statements
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
	if (!bothStrings) {
		var nx = ToNumber(px);
		var ny = ToNumber(py);
		if ($isNaN(nx) || $isNaN(ny)) {
			return undefined;
		}
		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
			return false;
		}
		if (nx === 0 && ny === 0) {
			return false;
		}
		if (nx === Infinity) {
			return false;
		}
		if (ny === Infinity) {
			return true;
		}
		if (ny === -Infinity) {
			return false;
		}
		if (nx === -Infinity) {
			return true;
		}
		return nx < ny; // by now, these are both nonzero, finite, and not equal
	}
	if (isPrefixOf(py, px)) {
		return false;
	}
	if (isPrefixOf(px, py)) {
		return true;
	}
	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var $TypeError = GetIntrinsic('%TypeError%');

var $charCodeAt = require('../helpers/callBound')('String.prototype.charCodeAt');

// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex

module.exports = function AdvanceStringIndex(S, index, unicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
	}
	if (Type(unicode) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
	}
	if (!unicode) {
		return index + 1;
	}
	var length = S.length;
	if ((index + 1) >= length) {
		return index + 1;
	}

	var first = $charCodeAt(S, index);
	if (first < 0xD800 || first > 0xDBFF) {
		return index + 1;
	}

	var second = $charCodeAt(S, index + 1);
	if (second < 0xDC00 || second > 0xDFFF) {
		return index + 1;
	}

	return index + 2;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayPrototype
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);

// https://www.ecma-international.org/ecma-262/6.0/#sec-arraycreate

module.exports = function ArrayCreate(length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
	}
	if (length > MAX_ARRAY_LENGTH) {
		throw new $RangeError('length is greater than (2**32 - 1)');
	}
	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
	var A = []; // steps 5 - 7, and 9
	if (proto !== $ArrayPrototype) { // step 8
		if (!$setProto) {
			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
		$setProto(A, proto);
	}
	if (length !== 0) { // bypasses the need for step 2
		A.length = length;
	}
	/* step 10, the above as a shortcut for the below
    OrdinaryDefineOwnProperty(A, 'length', {
        '[[Configurable]]': false,
        '[[Enumerable]]': false,
        '[[Value]]': length,
        '[[Writable]]': true
    });
    */
	return A;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var assign = require('object.assign');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsArray = require('./IsArray');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-arraysetlength

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function ArraySetLength(A, Desc) {
	if (!IsArray(A)) {
		throw new $TypeError('Assertion failed: A must be an Array');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!('[[Value]]' in Desc)) {
		return OrdinaryDefineOwnProperty(A, 'length', Desc);
	}
	var newLenDesc = assign({}, Desc);
	var newLen = ToUint32(Desc['[[Value]]']);
	var numberLen = ToNumber(Desc['[[Value]]']);
	if (newLen !== numberLen) {
		throw new $RangeError('Invalid array length');
	}
	newLenDesc['[[Value]]'] = newLen;
	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
	if (!IsDataDescriptor(oldLenDesc)) {
		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
	}
	var oldLen = oldLenDesc['[[Value]]'];
	if (newLen >= oldLen) {
		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	}
	if (!oldLenDesc['[[Writable]]']) {
		return false;
	}
	var newWritable;
	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
		newWritable = true;
	} else {
		newWritable = false;
		newLenDesc['[[Writable]]'] = true;
	}
	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	if (!succeeded) {
		return false;
	}
	while (newLen < oldLen) {
		oldLen -= 1;
		// eslint-disable-next-line no-param-reassign
		var deleteSucceeded = delete A[ToString(oldLen)];
		if (!deleteSucceeded) {
			newLenDesc['[[Value]]'] = oldLen + 1;
			if (!newWritable) {
				newLenDesc['[[Writable]]'] = false;
				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
				return false;
			}
		}
	}
	if (!newWritable) {
		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
	}
	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Array = GetIntrinsic('%Array%');
var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsConstructor = require('./IsConstructor');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate

module.exports = function ArraySpeciesCreate(originalArray, length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: length must be an integer >= 0');
	}
	var len = length === 0 ? 0 : length;
	var C;
	var isArray = IsArray(originalArray);
	if (isArray) {
		C = Get(originalArray, 'constructor');
		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
		// if (IsConstructor(C)) {
		// 	if C is another realm's Array, C = undefined
		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
		// }
		if ($species && Type(C) === 'Object') {
			C = Get(C, $species);
			if (C === null) {
				C = void 0;
			}
		}
	}
	if (typeof C === 'undefined') {
		return $Array(len);
	}
	if (!IsConstructor(C)) {
		throw new $TypeError('C must be a constructor');
	}
	return new C(len); // Construct(C, len);
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsCallable = require('./IsCallable');

// https://www.ecma-international.org/ecma-262/6.0/#sec-call

module.exports = function Call(F, V) {
	var args = arguments.length > 2 ? arguments[2] : [];
	if (!IsCallable(F)) {
		throw new $TypeError(inspect(F) + ' is not a function');
	}
	return F.apply(V, args);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring

module.exports = function CanonicalNumericIndexString(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Assertion failed: `argument` must be a String');
	}
	if (argument === '-0') { return -0; }
	var n = ToNumber(argument);
	if (SameValue(ToString(n), argument)) { return n; }
	return void 0;
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor

module.exports = function CompletePropertyDescriptor(Desc) {
	/* eslint no-param-reassign: 0 */
	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
		if (!has(Desc, '[[Value]]')) {
			Desc['[[Value]]'] = void 0;
		}
		if (!has(Desc, '[[Writable]]')) {
			Desc['[[Writable]]'] = false;
		}
	} else {
		if (!has(Desc, '[[Get]]')) {
			Desc['[[Get]]'] = void 0;
		}
		if (!has(Desc, '[[Set]]')) {
			Desc['[[Set]]'] = void 0;
		}
	}
	if (!has(Desc, '[[Enumerable]]')) {
		Desc['[[Enumerable]]'] = false;
	}
	if (!has(Desc, '[[Configurable]]')) {
		Desc['[[Configurable]]'] = false;
	}
	return Desc;
};
'use strict';

var callBound = require('../helpers/callBound');
var forEach = require('../helpers/forEach');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/9.0/#sec-copydataproperties

module.exports = function CopyDataProperties(target, source, excludedItems) {
	if (Type(target) !== 'Object') {
		throw new TypeError('Assertion failed: "target" must be an Object');
	}

	if (!IsArray(excludedItems)) {
		throw new TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
	}
	for (var i = 0; i < excludedItems.length; i += 1) {
		if (!IsPropertyKey(excludedItems[i])) {
			throw new TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
		}
	}

	if (typeof source === 'undefined' || source === null) {
		return target;
	}

	var ES = this;

	var fromObj = ES.ToObject(source);

	var sourceKeys = OwnPropertyKeys(fromObj);
	forEach(sourceKeys, function (nextKey) {
		var excluded = false;

		forEach(excludedItems, function (e) {
			if (ES.SameValue(e, nextKey) === true) {
				excluded = true;
			}
		});

		var enumerable = $isEnumerable(fromObj, nextKey) || (
		// this is to handle string keys being non-enumerable in older engines
			typeof source === 'string'
            && nextKey >= 0
            && ES.IsInteger(ES.ToNumber(nextKey))
		);
		if (excluded === false && enumerable) {
			var propValue = ES.Get(fromObj, nextKey);
			ES.CreateDataProperty(target, nextKey, propValue);
		}
	});

	return target;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createdataproperty

module.exports = function CreateDataProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var oldDesc = OrdinaryGetOwnProperty(O, P);
	var extensible = oldDesc || IsExtensible(O);
	var immutable = oldDesc && (!oldDesc.writable || !oldDesc.configurable);
	if (immutable || !extensible) {
		return false;
	}
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		{
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Value]]': V,
			'[[Writable]]': true
		}
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateDataProperty = require('./CreateDataProperty');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow

module.exports = function CreateDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var success = CreateDataProperty(O, P, V);
	if (!success) {
		throw new $TypeError('unable to create data property');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $replace = callBound('String.prototype.replace');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createhtml

module.exports = function CreateHTML(string, tag, attribute, value) {
	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
	}
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var p1 = '<' + tag;
	if (attribute !== '') {
		var V = ToString(value);
		var escapedV = $replace(V, /\x22/g, '&quot;');
		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
	}
	return p1 + '>' + S + '</' + tag + '>';
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject

module.exports = function CreateIterResultObject(value, done) {
	if (Type(done) !== 'Boolean') {
		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
	}
	return {
		value: value,
		done: done
	};
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var callBound = require('../helpers/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
var $push = callBound('Array.prototype.push');

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToLength = require('./ToLength');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
module.exports = function CreateListFromArrayLike(obj) {
	var elementTypes = arguments.length > 1
		? arguments[1]
		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];

	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	if (!IsArray(elementTypes)) {
		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
	}
	var len = ToLength(Get(obj, 'length'));
	var list = [];
	var index = 0;
	while (index < len) {
		var indexName = ToString(index);
		var next = Get(obj, indexName);
		var nextType = Type(next);
		if ($indexOf(elementTypes, nextType) < 0) {
			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
		}
		$push(list, next);
		index += 1;
	}
	return list;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createmethodproperty

module.exports = function CreateMethodProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		newDesc
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var Type = require('./Type');
var WeekDay = require('./WeekDay');
var MonthFromTime = require('./MonthFromTime');
var YearFromTime = require('./YearFromTime');
var DateFromTime = require('./DateFromTime');

// https://www.ecma-international.org/ecma-262/9.0/#sec-datestring

module.exports = function DateString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var weekday = weekdays[WeekDay(tv)];
	var month = months[MonthFromTime(tv)];
	var day = padTimeComponent(DateFromTime(tv));
	var year = padTimeComponent(YearFromTime(tv), 4);
	return weekday + '\x20' + month + '\x20' + day + '\x20' + year;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return $floor(t / msPerDay);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + $floor((y - 1969) / 4) - $floor((y - 1901) / 100) + $floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var mod = require('../helpers/mod');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (mod(y, 4) !== 0) {
		return 365;
	}
	if (mod(y, 100) !== 0) {
		return 366;
	}
	if (mod(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow

module.exports = function DefinePropertyOrThrow(O, P, desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var Desc = isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, desc) ? desc : ToPropertyDescriptor(desc);
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
	}

	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		Desc
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow

module.exports = function DeletePropertyOrThrow(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// eslint-disable-next-line no-param-reassign
	var success = delete O[P];
	if (!success) {
		throw new $TypeError('Attempt to delete property failed.');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var objectKeys = require('object-keys');

var callBound = require('../helpers/callBound');

var callBind = require('../helpers/callBind');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));

var forEach = require('../helpers/forEach');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/8.0/#sec-enumerableownproperties

module.exports = function EnumerableOwnProperties(O, kind) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	var keys = objectKeys(O);
	if (kind === 'key') {
		return keys;
	}
	if (kind === 'value' || kind === 'key+value') {
		var results = [];
		forEach(keys, function (key) {
			if ($isEnumerable(O, key)) {
				$pushApply(results, [
					kind === 'value' ? O[key] : [key, O[key]]
				]);
			}
		});
		return results;
	}
	throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return Desc;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	var obj = {};
	if ('[[Value]]' in Desc) {
		obj.value = Desc['[[Value]]'];
	}
	if ('[[Writable]]' in Desc) {
		obj.writable = Desc['[[Writable]]'];
	}
	if ('[[Get]]' in Desc) {
		obj.get = Desc['[[Get]]'];
	}
	if ('[[Set]]' in Desc) {
		obj.set = Desc['[[Set]]'];
	}
	if ('[[Enumerable]]' in Desc) {
		obj.enumerable = Desc['[[Enumerable]]'];
	}
	if ('[[Configurable]]' in Desc) {
		obj.configurable = Desc['[[Configurable]]'];
	}
	return obj;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

/**
 * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
 * 1. Assert: Type(O) is Object.
 * 2. Assert: IsPropertyKey(P) is true.
 * 3. Return O.[[Get]](P, O).
 */

module.exports = function Get(O, P) {
	// 7.3.1.1
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	// 7.3.1.2
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
	}
	// 7.3.1.3
	return O[P];
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getiterator

module.exports = function GetIterator(obj, method) {
	var actualMethod = method;
	if (arguments.length < 2) {
		actualMethod = getIteratorMethod(
			{
				AdvanceStringIndex: AdvanceStringIndex,
				GetMethod: GetMethod,
				IsArray: IsArray,
				Type: Type
			},
			obj
		);
	}
	var iterator = Call(actualMethod, obj);
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('iterator must return an object');
	}

	return iterator;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var GetV = require('./GetV');
var IsCallable = require('./IsCallable');
var IsPropertyKey = require('./IsPropertyKey');

/**
 * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
 * 1. Assert: IsPropertyKey(P) is true.
 * 2. Let func be GetV(O, P).
 * 3. ReturnIfAbrupt(func).
 * 4. If func is either undefined or null, return undefined.
 * 5. If IsCallable(func) is false, throw a TypeError exception.
 * 6. Return func.
 */

module.exports = function GetMethod(O, P) {
	// 7.3.9.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.9.2
	var func = GetV(O, P);

	// 7.3.9.4
	if (func == null) {
		return void 0;
	}

	// 7.3.9.5
	if (!IsCallable(func)) {
		throw new $TypeError(P + 'is not a function');
	}

	// 7.3.9.6
	return func;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');

var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%');
var keys = require('object-keys');

var esType = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys

module.exports = function GetOwnPropertyKeys(O, Type) {
	if (esType(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (Type === 'Symbol') {
		return $gOPS ? $gOPS(O) : [];
	}
	if (Type === 'String') {
		if (!$gOPN) {
			return keys(O);
		}
		return $gOPN(O);
	}
	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Function = GetIntrinsic('%Function%');
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor

module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	if (!IsConstructor(constructor)) {
		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
	}
	var proto = Get(constructor, 'prototype');
	if (Type(proto) !== 'Object') {
		if (!(constructor instanceof $Function)) {
			// ignore other realms, for now
			throw new $TypeError('cross-realm constructors not currently supported');
		}
		proto = intrinsic;
	}
	return proto;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');
var regexTester = require('../helpers/regexTester');
var every = require('../helpers/every');

var $charAt = callBound('String.prototype.charAt');
var $strSlice = callBound('String.prototype.slice');
var $indexOf = callBound('String.prototype.indexOf');
var $parseInt = parseInt;

var isDigit = regexTester(/^[0-9]$/);

var inspect = require('object-inspect');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var ToObject = require('./ToObject');
var ToString = require('./ToString');
var Type = require('./Type');

var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false

var isStringOrHole = function (capture, index, arr) {
	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
};

// http://www.ecma-international.org/ecma-262/9.0/#sec-getsubstitution

// eslint-disable-next-line max-statements, max-params, max-lines-per-function
module.exports = function GetSubstitution(matched, str, position, captures, namedCaptures, replacement) {
	if (Type(matched) !== 'String') {
		throw new $TypeError('Assertion failed: `matched` must be a String');
	}
	var matchLength = matched.length;

	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `str` must be a String');
	}
	var stringLength = str.length;

	if (!IsInteger(position) || position < 0 || position > stringLength) {
		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
	}

	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
	}

	if (Type(replacement) !== 'String') {
		throw new $TypeError('Assertion failed: `replacement` must be a String');
	}

	var tailPos = position + matchLength;
	var m = captures.length;
	if (Type(namedCaptures) !== 'Undefined') {
		namedCaptures = ToObject(namedCaptures); // eslint-disable-line no-param-reassign
	}

	var result = '';
	for (var i = 0; i < replacement.length; i += 1) {
		// if this is a $, and it's not the end of the replacement
		var current = $charAt(replacement, i);
		var isLast = (i + 1) >= replacement.length;
		var nextIsLast = (i + 2) >= replacement.length;
		if (current === '$' && !isLast) {
			var next = $charAt(replacement, i + 1);
			if (next === '$') {
				result += '$';
				i += 1;
			} else if (next === '&') {
				result += matched;
				i += 1;
			} else if (next === '`') {
				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
				i += 1;
			} else if (next === "'") {
				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
				i += 1;
			} else {
				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
					// $1 through $9, and not followed by a digit
					var n = $parseInt(next, 10);
					// if (n > m, impl-defined)
					result += (n <= m && Type(captures[n - 1]) === 'Undefined') ? '' : captures[n - 1];
					i += 1;
				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
					// $00 through $99
					var nn = next + nextNext;
					var nnI = $parseInt(nn, 10) - 1;
					// if nn === '00' or nn > m, impl-defined
					result += (nn <= m && Type(captures[nnI]) === 'Undefined') ? '' : captures[nnI];
					i += 2;
				} else if (next === '<') {
					// eslint-disable-next-line max-depth
					if (Type(namedCaptures) === 'Undefined') {
						result += '$<';
						i += 2;
					} else {
						var endIndex = $indexOf(replacement, '>', i);
						// eslint-disable-next-line max-depth
						if (endIndex > -1) {
							var groupName = $strSlice(replacement, i, endIndex);
							var capture = Get(namedCaptures, groupName);
							// eslint-disable-next-line max-depth
							if (Type(capture) !== 'Undefined') {
								result += ToString(capture);
							}
							i += '$<' + groupName + '>'.length;
						}
					}
				} else {
					result += '$';
				}
			}
		} else {
			// the final $, or else not a $
			result += $charAt(replacement, i);
		}
	}
	return result;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var ToObject = require('./ToObject');

/**
 * 7.3.2 GetV (V, P)
 * 1. Assert: IsPropertyKey(P) is true.
 * 2. Let O be ToObject(V).
 * 3. ReturnIfAbrupt(O).
 * 4. Return O.[[Get]](P, V).
 */

module.exports = function GetV(V, P) {
	// 7.3.2.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.2.2-3
	var O = ToObject(V);

	// 7.3.2.4
	return O[P];
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var has = require('has');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty

module.exports = function HasOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return has(O, P);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty

module.exports = function HasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return mod($floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-instanceofoperator

module.exports = function InstanceofOperator(O, C) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
	if (typeof instOfHandler !== 'undefined') {
		return ToBoolean(Call(instOfHandler, C, [O]));
	}
	if (!IsCallable(C)) {
		throw new $TypeError('`C` is not Callable');
	}
	return OrdinaryHasInstance(C, O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $arraySlice = require('../helpers/callBound')('Array.prototype.slice');

var Call = require('./Call');
var GetV = require('./GetV');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-invoke

module.exports = function Invoke(O, P) {
	if (!IsPropertyKey(P)) {
		throw new $TypeError('P must be a Property Key');
	}
	var argumentsList = $arraySlice(arguments, 2);
	var func = GetV(O, P);
	return Call(func, O, argumentsList);
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Array = GetIntrinsic('%Array%');

// eslint-disable-next-line global-require
var toStr = !$Array.isArray && require('../helpers/callBound')('Object.prototype.toString');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isarray

module.exports = $Array.isArray || function IsArray(argument) {
	return toStr(argument) === '[object Array]';
};
'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable

module.exports = function IsConcatSpreadable(O) {
	if (Type(O) !== 'Object') {
		return false;
	}
	if ($isConcatSpreadable) {
		var spreadable = Get(O, $isConcatSpreadable);
		if (typeof spreadable !== 'undefined') {
			return ToBoolean(spreadable);
		}
	}
	return IsArray(O);
};
'use strict';

// https://www.ecma-international.org/ecma-262/6.0/#sec-isconstructor

module.exports = function IsConstructor(argument) {
	return typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument`
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Object = GetIntrinsic('%Object%');

var isPrimitive = require('../helpers/isPrimitive');

var $preventExtensions = $Object.preventExtensions;
var $isExtensible = $Object.isExtensible;

// https://www.ecma-international.org/ecma-262/6.0/#sec-isextensible-o

module.exports = $preventExtensions
	? function IsExtensible(obj) {
		return !isPrimitive(obj) && $isExtensible(obj);
	}
	: function IsExtensible(obj) {
		return !isPrimitive(obj);
	};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var $floor = $Math.floor;
var $abs = $Math.abs;

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isinteger

module.exports = function IsInteger(argument) {
	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
		return false;
	}
	var abs = $abs(argument);
	return $floor(abs) === abs;
};
'use strict';

var callBound = require('../helpers/callBound');

var $PromiseThen = callBound('Promise.prototype.then', true);

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ispromise

module.exports = function IsPromise(x) {
	if (Type(x) !== 'Object') {
		return false;
	}
	if (!$PromiseThen) { // Promises are not supported
		return false;
	}
	try {
		$PromiseThen(x); // throws if not a promise
	} catch (e) {
		return false;
	}
	return true;
};
'use strict';

// https://www.ecma-international.org/ecma-262/6.0/#sec-ispropertykey

module.exports = function IsPropertyKey(argument) {
	return typeof argument === 'string' || typeof argument === 'symbol';
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $match = GetIntrinsic('%Symbol.match%', true);

var hasRegExpMatcher = require('is-regex');

var ToBoolean = require('./ToBoolean');

// https://ecma-international.org/ecma-262/6.0/#sec-isregexp

module.exports = function IsRegExp(argument) {
	if (!argument || typeof argument !== 'object') {
		return false;
	}
	if ($match) {
		var isRegExp = argument[$match];
		if (typeof isRegExp !== 'undefined') {
			return ToBoolean(isRegExp);
		}
	}
	return hasRegExpMatcher(argument);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPrefixOf = require('../helpers/isPrefixOf');

// var callBound = require('../helpers/callBound');

// var $charAt = callBound('String.prototype.charAt');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/9.0/#sec-isstringprefix

module.exports = function IsStringPrefix(p, q) {
	if (Type(p) !== 'String') {
		throw new $TypeError('Assertion failed: "p" must be a String');
	}

	if (Type(q) !== 'String') {
		throw new $TypeError('Assertion failed: "q" must be a String');
	}

	return isPrefixOf(p, q);
	/*
	if (p === q || p === '') {
		return true;
	}

	var pLength = p.length;
	var qLength = q.length;
	if (pLength >= qLength) {
		return false;
	}

	// assert: pLength < qLength

	for (var i = 0; i < pLength; i += 1) {
		if ($charAt(p, i) !== $charAt(q, i)) {
			return false;
		}
	}
	return true;
	*/
};
'use strict';

var callBound = require('../helpers/callBound');
var $arrayPush = callBound('Array.prototype.push');

var GetIterator = require('./GetIterator');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');

// https://www.ecma-international.org/ecma-262/8.0/#sec-iterabletolist

module.exports = function IterableToList(items, method) {
	var iterator = GetIterator(items, method);
	var values = [];
	var next = true;
	while (next) {
		next = IteratorStep(iterator);
		if (next) {
			var nextValue = IteratorValue(next);
			$arrayPush(values, nextValue);
		}
	}
	return values;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose

module.exports = function IteratorClose(iterator, completion) {
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
	}
	if (!IsCallable(completion)) {
		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
	}
	var completionThunk = completion;

	var iteratorReturn = GetMethod(iterator, 'return');

	if (typeof iteratorReturn === 'undefined') {
		return completionThunk();
	}

	var completionRecord;
	try {
		var innerResult = Call(iteratorReturn, iterator, []);
	} catch (e) {
		// if we hit here, then "e" is the innerResult completion that needs re-throwing

		// if the completion is of type "throw", this will throw.
		completionThunk();
		completionThunk = null; // ensure it's not called twice.

		// if not, then return the innerResult completion
		throw e;
	}
	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
	completionThunk = null; // ensure it's not called twice.

	if (Type(innerResult) !== 'Object') {
		throw new $TypeError('iterator .return must return an object');
	}

	return completionRecord;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete

module.exports = function IteratorComplete(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return ToBoolean(Get(iterResult, 'done'));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Invoke = require('./Invoke');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext

module.exports = function IteratorNext(iterator, value) {
	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
	if (Type(result) !== 'Object') {
		throw new $TypeError('iterator next must return an object');
	}
	return result;
};
'use strict';

var IteratorComplete = require('./IteratorComplete');
var IteratorNext = require('./IteratorNext');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep

module.exports = function IteratorStep(iterator) {
	var result = IteratorNext(iterator);
	var done = IteratorComplete(result);
	return done === true ? false : result;
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue

module.exports = function IteratorValue(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return Get(iterResult, 'value');
};

'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');
var $DateUTC = GetIntrinsic('%Date.UTC%');

var mod = require('../helpers/mod');
var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var MonthFromTime = require('./MonthFromTime');
var ToInteger = require('./ToInteger');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToInteger(year);
	var m = ToInteger(month);
	var dt = ToInteger(date);
	var ym = y + $floor(m / 12);
	var mn = mod(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToInteger = require('./ToInteger');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToInteger(hour);
	var m = ToInteger(min);
	var s = ToInteger(sec);
	var milli = ToInteger(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return mod($floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $String = GetIntrinsic('%String%');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/9.0/#sec-tostring-applied-to-the-number-type

module.exports = function NumberToString(m) {
	if (Type(m) !== 'Number') {
		throw new TypeError('Assertion failed: "m" must be a String');
	}

	return $String(m);
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $ObjectCreate = GetIntrinsic('%Object.create%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var Type = require('./Type');

var hasProto = !({ __proto__: null } instanceof Object);

// https://www.ecma-international.org/ecma-262/6.0/#sec-objectcreate

module.exports = function ObjectCreate(proto, internalSlotsList) {
	if (proto !== null && Type(proto) !== 'Object') {
		throw new $TypeError('Assertion failed: `proto` must be null or an object');
	}
	var slots = arguments.length < 2 ? [] : internalSlotsList;
	if (slots.length > 0) {
		throw new $SyntaxError('es-abstract does not yet support internal slots');
	}

	if ($ObjectCreate) {
		return $ObjectCreate(proto);
	}
	if (hasProto) {
		return { __proto__: proto };
	}

	if (proto === null) {
		throw new $SyntaxError('native Object.create support is required to create null objects');
	}
	var T = function T() {};
	T.prototype = proto;
	return new T();
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var SameValue = require('./SameValue');
var Type = require('./Type');
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty

module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!$gOPD) {
		// ES3/IE 8 fallback
		if (IsAccessorDescriptor(Desc)) {
			throw new $SyntaxError('This environment does not support accessor property descriptors.');
		}
		var creatingNormalDataProperty = !(P in O)
			&& Desc['[[Writable]]']
			&& Desc['[[Enumerable]]']
			&& Desc['[[Configurable]]']
			&& '[[Value]]' in Desc;
		var settingExistingDataProperty = (P in O)
			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
			&& '[[Value]]' in Desc;
		if (creatingNormalDataProperty || settingExistingDataProperty) {
			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
			return SameValue(O[P], Desc['[[Value]]']);
		}
		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
	}
	var desc = $gOPD(O, P);
	var current = desc && ToPropertyDescriptor(desc);
	var extensible = IsExtensible(O);
	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var has = require('has');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var IsRegExp = require('./IsRegExp');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty

module.exports = function OrdinaryGetOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!has(O, P)) {
		return void 0;
	}
	if (!$gOPD) {
		// ES3 / IE 8 fallback
		var arrayLength = IsArray(O) && P === 'length';
		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
		return {
			'[[Configurable]]': !(arrayLength || regexLastIndex),
			'[[Enumerable]]': $isEnumerable(O, P),
			'[[Value]]': O[P],
			'[[Writable]]': true
		};
	}
	return ToPropertyDescriptor($gOPD(O, P));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $getProto = require('../helpers/getProto');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/7.0/#sec-ordinarygetprototypeof

module.exports = function OrdinaryGetPrototypeOf(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!$getProto) {
		throw new $TypeError('This environment does not support fetching prototypes.');
	}
	return $getProto(O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance

module.exports = function OrdinaryHasInstance(C, O) {
	if (IsCallable(C) === false) {
		return false;
	}
	if (Type(O) !== 'Object') {
		return false;
	}
	var P = Get(C, 'prototype');
	if (Type(P) !== 'Object') {
		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
	}
	return O instanceof C;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty

module.exports = function OrdinaryHasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $setProto = require('../helpers/setProto');

var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/7.0/#sec-ordinarysetprototypeof

module.exports = function OrdinarySetPrototypeOf(O, V) {
	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
		throw new $TypeError('Assertion failed: V must be Object or Null');
	}
	/*
    var extensible = IsExtensible(O);
    var current = OrdinaryGetPrototypeOf(O);
    if (SameValue(V, current)) {
        return true;
    }
    if (!extensible) {
        return false;
    }
    */
	try {
		$setProto(O, V);
	} catch (e) {
		return false;
	}
	return OrdinaryGetPrototypeOf(O) === V;
	/*
    var p = V;
    var done = false;
    while (!done) {
        if (p === null) {
            done = true;
        } else if (SameValue(p, O)) {
            return false;
        } else {
            if (wat) {
                done = true;
            } else {
                p = p.[[Prototype]];
            }
        }
     }
     O.[[Prototype]] = V;
     return true;
     */
};
'use strict';

var callBound = require('../helpers/callBound');

var $PromiseResolve = callBound('Promise.resolve', true);

// https://ecma-international.org/ecma-262/9.0/#sec-promise-resolve

module.exports = function PromiseResolve(C, x) {
	if (!$PromiseResolve) {
		throw new SyntaxError('This environment does not support Promises.');
	}
	return $PromiseResolve(C, x);
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var regexExec = require('../helpers/callBound')('RegExp.prototype.exec');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec

module.exports = function RegExpExec(R, S) {
	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: `R` must be an Object');
	}
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	var exec = Get(R, 'exec');
	if (IsCallable(exec)) {
		var result = Call(exec, R, [S]);
		if (result === null || Type(result) === 'Object') {
			return result;
		}
		throw new $TypeError('"exec" method must return `null` or an Object');
	}
	return regexExec(R, S);
};
'use strict';

module.exports = require('../5/CheckObjectCoercible');
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');

// https://www.ecma-international.org/ecma-262/7.0/#sec-samevaluenonnumber

module.exports = function SameValueNonNumber(x, y) {
	if (typeof x === 'number' || typeof x !== typeof y) {
		throw new $TypeError('SameValueNonNumber requires two non-number values of the same type.');
	}
	return SameValue(x, y);
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// https://www.ecma-international.org/ecma-262/6.0/#sec-samevaluezero

module.exports = function SameValueZero(x, y) {
	return (x === y) || ($isNaN(x) && $isNaN(y));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return mod($floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw

module.exports = function Set(O, P, V, Throw) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	if (Type(Throw) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
	}
	if (Throw) {
		O[P] = V; // eslint-disable-line no-param-reassign
		return true;
	} else {
		try {
			O[P] = V; // eslint-disable-line no-param-reassign
		} catch (e) {
			return false;
		}
	}
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var has = require('has');

var $TypeError = GetIntrinsic('%TypeError%');

var getSymbolDescription = require('../helpers/getSymbolDescription');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsExtensible = require('./IsExtensible');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname

module.exports = function SetFunctionName(F, name) {
	if (typeof F !== 'function') {
		throw new $TypeError('Assertion failed: `F` must be a function');
	}
	if (!IsExtensible(F) || has(F, 'name')) {
		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
	}
	var nameType = Type(name);
	if (nameType !== 'Symbol' && nameType !== 'String') {
		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
	}
	if (nameType === 'Symbol') {
		var description = getSymbolDescription(name);
		// eslint-disable-next-line no-param-reassign
		name = typeof description === 'undefined' ? '' : '[' + description + ']';
	}
	if (arguments.length > 2) {
		var prefix = arguments[2];
		// eslint-disable-next-line no-param-reassign
		name = prefix + ' ' + name;
	}
	return DefinePropertyOrThrow(F, 'name', {
		'[[Value]]': name,
		'[[Writable]]': false,
		'[[Enumerable]]': false,
		'[[Configurable]]': true
	});
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');
var $preventExtensions = GetIntrinsic('%Object.preventExtensions%');
var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');

var forEach = require('../helpers/forEach');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-setintegritylevel

module.exports = function SetIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	if (!$preventExtensions) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
	}
	var status = $preventExtensions(O);
	if (!status) {
		return false;
	}
	if (!$gOPN) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
	}
	var theKeys = $gOPN(O);
	if (level === 'sealed') {
		forEach(theKeys, function (k) {
			DefinePropertyOrThrow(O, k, { configurable: false });
		});
	} else if (level === 'frozen') {
		forEach(theKeys, function (k) {
			var currentDesc = $gOPD(O, k);
			if (typeof currentDesc !== 'undefined') {
				var desc;
				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
					desc = { configurable: false };
				} else {
					desc = { configurable: false, writable: false };
				}
				DefinePropertyOrThrow(O, k, desc);
			}
		});
	}
	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor

module.exports = function SpeciesConstructor(O, defaultConstructor) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var C = O.constructor;
	if (typeof C === 'undefined') {
		return defaultConstructor;
	}
	if (Type(C) !== 'Object') {
		throw new $TypeError('O.constructor is not an Object');
	}
	var S = $species ? C[$species] : void 0;
	if (S == null) {
		return defaultConstructor;
	}
	if (IsConstructor(S)) {
		return S;
	}
	throw new $TypeError('no constructor found');
};
'use strict';

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $SymbolToString = callBound('Symbol.prototype.toString', true);

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring

module.exports = function SymbolDescriptiveString(sym) {
	if (Type(sym) !== 'Symbol') {
		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
	}
	return $SymbolToString(sym);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
var $TypeError = GetIntrinsic('%TypeError%');

var every = require('../helpers/every');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-testintegritylevel

module.exports = function TestIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	var status = IsExtensible(O);
	if (status) {
		return false;
	}
	var theKeys = $gOPN(O);
	return theKeys.length === 0 || every(theKeys, function (k) {
		var currentDesc = $gOPD(O, k);
		if (typeof currentDesc !== 'undefined') {
			if (currentDesc.configurable) {
				return false;
			}
			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
				return false;
			}
		}
		return true;
	});
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');
var $abs = GetIntrinsic('%Math.abs%');

var $isFinite = require('../helpers/isFinite');

var ToNumber = require('./ToNumber');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || $abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var HourFromTime = require('./HourFromTime');
var MinFromTime = require('./MinFromTime');
var SecFromTime = require('./SecFromTime');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/9.0/#sec-timestring

module.exports = function TimeString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var hour = HourFromTime(tv);
	var minute = MinFromTime(tv);
	var second = SecFromTime(tv);
	return padTimeComponent(hour) + ':' + padTimeComponent(minute) + ':' + padTimeComponent(second) + '\x20GMT';
};
'use strict';

var mod = require('../helpers/mod');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return mod(t, msPerDay);
};

'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Date = GetIntrinsic('%Date%');

var $isNaN = require('../helpers/isNaN');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-todatestring

module.exports = function ToDateString(tv) {
	if (Type(tv) !== 'Number') {
		throw new $TypeError('Assertion failed: `tv` must be a Number');
	}
	if ($isNaN(tv)) {
		return 'Invalid Date';
	}
	return $Date(tv);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $RangeError = GetIntrinsic('%RangeError%');

var ToInteger = require('./ToInteger');
var ToLength = require('./ToLength');
var SameValueZero = require('./SameValueZero');

// https://www.ecma-international.org/ecma-262/8.0/#sec-toindex

module.exports = function ToIndex(value) {
	if (typeof value === 'undefined') {
		return 0;
	}
	var integerIndex = ToInteger(value);
	if (integerIndex < 0) {
		throw new $RangeError('index must be >= 0');
	}
	var index = ToLength(integerIndex);
	if (!SameValueZero(integerIndex, index)) {
		throw new $RangeError('index must be >= 0 and < 2 ** 53 - 1');
	}
	return index;
};
'use strict';

var ToUint16 = require('./ToUint16');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toint16

module.exports = function ToInt16(argument) {
	var int16bit = ToUint16(argument);
	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
};
'use strict';

var ToNumber = require('./ToNumber');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var ToUint8 = require('./ToUint8');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toint8

module.exports = function ToInt8(argument) {
	var int8bit = ToUint8(argument);
	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
};
'use strict';

var ES5ToInteger = require('../5/ToInteger');

var ToNumber = require('./ToNumber');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tointeger

module.exports = function ToInteger(value) {
	var number = ToNumber(value);
	return ES5ToInteger(number);
};
'use strict';

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var ToInteger = require('./ToInteger');

module.exports = function ToLength(argument) {
	var len = ToInteger(argument);
	if (len <= 0) { return 0; } // includes converting -0 to +0
	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
	return len;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Number = GetIntrinsic('%Number%');
var $RegExp = GetIntrinsic('%RegExp%');
var $parseInteger = GetIntrinsic('%parseInt%');

var callBound = require('../helpers/callBound');
var regexTester = require('../helpers/regexTester');
var isPrimitive = require('../helpers/isPrimitive');

var $strSlice = callBound('String.prototype.slice');
var isBinary = regexTester(/^0b[01]+$/i);
var isOctal = regexTester(/^0o[0-7]+$/i);
var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
var hasNonWS = regexTester(nonWSregex);

// whitespace from: https://es5.github.io/#x15.5.4.20
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
var ws = [
	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
	'\u2029\uFEFF'
].join('');
var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
var $replace = callBound('String.prototype.replace');
var $trim = function (value) {
	return $replace(value, trimRegex, '');
};

var ToPrimitive = require('./ToPrimitive');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tonumber

module.exports = function ToNumber(argument) {
	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (typeof value === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a number');
	}
	if (typeof value === 'string') {
		if (isBinary(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 2));
		} else if (isOctal(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 8));
		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
			return NaN;
		} else {
			var trimmed = $trim(value);
			if (trimmed !== value) {
				return ToNumber(trimmed);
			}
		}
	}
	return $Number(value);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Object = GetIntrinsic('%Object%');

var RequireObjectCoercible = require('./RequireObjectCoercible');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toobject

module.exports = function ToObject(value) {
	RequireObjectCoercible(value);
	return $Object(value);
};
'use strict';

var toPrimitive = require('es-to-primitive/es2015');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive

module.exports = function ToPrimitive(input) {
	if (arguments.length > 1) {
		return toPrimitive(input, arguments[1]);
	}
	return toPrimitive(input);
};
'use strict';

var has = require('has');

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://ecma-international.org/ecma-262/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $String = GetIntrinsic('%String%');

var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');

// https://www.ecma-international.org/ecma-262/6.0/#sec-topropertykey

module.exports = function ToPropertyKey(argument) {
	var key = ToPrimitive(argument, $String);
	return typeof key === 'symbol' ? key : ToString(key);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function ToString(argument) {
	if (typeof argument === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a string');
	}
	return $String(argument);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');
var $mod = require('../helpers/mod');

var $floor = $Math.floor;
var $abs = $Math.abs;

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * $floor($abs(number));
	return $mod(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');
var $mod = require('../helpers/mod');

var $floor = $Math.floor;
var $abs = $Math.abs;

module.exports = function ToUint8(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * $floor($abs(number));
	return $mod(posInt, 0x100);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');

var $floor = $Math.floor;

// https://www.ecma-international.org/ecma-262/6.0/#sec-touint8clamp

module.exports = function ToUint8Clamp(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number <= 0) { return 0; }
	if (number >= 0xFF) { return 0xFF; }
	var f = $floor(argument);
	if (f + 0.5 < number) { return f + 1; }
	if (number < f + 0.5) { return f; }
	if (f % 2 !== 0) { return f + 1; }
	return f;
};
'use strict';

var ES5Type = require('../5/Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function Type(x) {
	if (typeof x === 'symbol') {
		return 'Symbol';
	}
	return ES5Type(x);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');
var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
// https://www.ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor

// eslint-disable-next-line max-lines-per-function, max-statements, max-params
module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
	var oType = Type(O);
	if (oType !== 'Undefined' && oType !== 'Object') {
		throw new $TypeError('Assertion failed: O must be undefined or an Object');
	}
	if (Type(extensible) !== 'Boolean') {
		throw new $TypeError('Assertion failed: extensible must be a Boolean');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, current)) {
		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
	}
	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
	}
	if (Type(current) === 'Undefined') {
		if (!extensible) {
			return false;
		}
		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': Desc['[[Configurable]]'],
						'[[Enumerable]]': Desc['[[Enumerable]]'],
						'[[Value]]': Desc['[[Value]]'],
						'[[Writable]]': Desc['[[Writable]]']
					}
				);
			}
		} else {
			if (!IsAccessorDescriptor(Desc)) {
				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
			}
			if (oType !== 'Undefined') {
				return DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					Desc
				);
			}
		}
		return true;
	}
	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
		return true;
	}
	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
		return true; // removed by ES2017, but should still be correct
	}
	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
	if (!current['[[Configurable]]']) {
		if (Desc['[[Configurable]]']) {
			return false;
		}
		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
			return false;
		}
	}
	if (IsGenericDescriptor(Desc)) {
		// no further validation is required.
	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			return false;
		}
		if (IsDataDescriptor(current)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': current['[[Configurable]]'],
						'[[Enumerable]]': current['[[Enumerable]]'],
						'[[Get]]': undefined
					}
				);
			}
		} else if (oType !== 'Undefined') {
			DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': current['[[Configurable]]'],
					'[[Enumerable]]': current['[[Enumerable]]'],
					'[[Value]]': undefined
				}
			);
		}
	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
				return false;
			}
			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
				return false;
			}
			return true;
		}
	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
				return false;
			}
			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
				return false;
			}
			return true;
		}
	} else {
		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
	}
	if (oType !== 'Undefined') {
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			Desc
		);
	}
	return true;
};
'use strict';

var mod = require('../helpers/mod');

var Day = require('./Day');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return mod(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('../helpers/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var mod = require('../helpers/mod');

// https://ecma-international.org/ecma-262/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var mod = require('../helpers/mod');
var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return mod(t, msPerSecond);
};
'use strict';

var $BooleanValueOf = require('../helpers/callBound')('Boolean.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object

module.exports = function thisBooleanValue(value) {
	if (Type(value) === 'Boolean') {
		return value;
	}

	return $BooleanValueOf(value);
};
'use strict';

var callBound = require('../helpers/callBound');

var Type = require('./Type');

var $NumberValueOf = callBound('Number.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object

module.exports = function thisNumberValue(value) {
	if (Type(value) === 'Number') {
		return value;
	}

	return $NumberValueOf(value);
};

'use strict';

var $StringValueOf = require('../helpers/callBound')('String.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object

module.exports = function thisStringValue(value) {
	if (Type(value) === 'String') {
		return value;
	}

	return $StringValueOf(value);
};
'use strict';

var callBound = require('../helpers/callBound');

var $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/9.0/#sec-thissymbolvalue

module.exports = function thisSymbolValue(value) {
	if (!$SymbolValueOf) {
		throw new SyntaxError('Symbols are not supported; thisSymbolValue requires that `value` be a Symbol or a Symbol object');
	}
	if (Type(value) === 'Symbol') {
		return value;
	}
	return $SymbolValueOf(value);
};
'use strict';

var $DateValueOf = require('../helpers/callBound')('Date.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object

module.exports = function thisTimeValue(value) {
	return $DateValueOf(value);
};
'use strict';

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return x === y; // ES6+ specified this shortcut anyways.
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	return false;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var isPrefixOf = require('../helpers/isPrefixOf');

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5

// eslint-disable-next-line max-statements
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
	if (!bothStrings) {
		var nx = ToNumber(px);
		var ny = ToNumber(py);
		if ($isNaN(nx) || $isNaN(ny)) {
			return undefined;
		}
		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
			return false;
		}
		if (nx === 0 && ny === 0) {
			return false;
		}
		if (nx === Infinity) {
			return false;
		}
		if (ny === Infinity) {
			return true;
		}
		if (ny === -Infinity) {
			return false;
		}
		if (nx === -Infinity) {
			return true;
		}
		return nx < ny; // by now, these are both nonzero, finite, and not equal
	}
	if (isPrefixOf(py, px)) {
		return false;
	}
	if (isPrefixOf(px, py)) {
		return true;
	}
	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var $TypeError = GetIntrinsic('%TypeError%');

var $charCodeAt = require('../helpers/callBound')('String.prototype.charCodeAt');

// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex

module.exports = function AdvanceStringIndex(S, index, unicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
	}
	if (Type(unicode) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
	}
	if (!unicode) {
		return index + 1;
	}
	var length = S.length;
	if ((index + 1) >= length) {
		return index + 1;
	}

	var first = $charCodeAt(S, index);
	if (first < 0xD800 || first > 0xDBFF) {
		return index + 1;
	}

	var second = $charCodeAt(S, index + 1);
	if (second < 0xDC00 || second > 0xDFFF) {
		return index + 1;
	}

	return index + 2;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayPrototype
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);

// https://www.ecma-international.org/ecma-262/6.0/#sec-arraycreate

module.exports = function ArrayCreate(length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
	}
	if (length > MAX_ARRAY_LENGTH) {
		throw new $RangeError('length is greater than (2**32 - 1)');
	}
	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
	var A = []; // steps 5 - 7, and 9
	if (proto !== $ArrayPrototype) { // step 8
		if (!$setProto) {
			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
		$setProto(A, proto);
	}
	if (length !== 0) { // bypasses the need for step 2
		A.length = length;
	}
	/* step 10, the above as a shortcut for the below
    OrdinaryDefineOwnProperty(A, 'length', {
        '[[Configurable]]': false,
        '[[Enumerable]]': false,
        '[[Value]]': length,
        '[[Writable]]': true
    });
    */
	return A;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var assign = require('object.assign');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsArray = require('./IsArray');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-arraysetlength

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function ArraySetLength(A, Desc) {
	if (!IsArray(A)) {
		throw new $TypeError('Assertion failed: A must be an Array');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!('[[Value]]' in Desc)) {
		return OrdinaryDefineOwnProperty(A, 'length', Desc);
	}
	var newLenDesc = assign({}, Desc);
	var newLen = ToUint32(Desc['[[Value]]']);
	var numberLen = ToNumber(Desc['[[Value]]']);
	if (newLen !== numberLen) {
		throw new $RangeError('Invalid array length');
	}
	newLenDesc['[[Value]]'] = newLen;
	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
	if (!IsDataDescriptor(oldLenDesc)) {
		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
	}
	var oldLen = oldLenDesc['[[Value]]'];
	if (newLen >= oldLen) {
		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	}
	if (!oldLenDesc['[[Writable]]']) {
		return false;
	}
	var newWritable;
	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
		newWritable = true;
	} else {
		newWritable = false;
		newLenDesc['[[Writable]]'] = true;
	}
	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	if (!succeeded) {
		return false;
	}
	while (newLen < oldLen) {
		oldLen -= 1;
		// eslint-disable-next-line no-param-reassign
		var deleteSucceeded = delete A[ToString(oldLen)];
		if (!deleteSucceeded) {
			newLenDesc['[[Value]]'] = oldLen + 1;
			if (!newWritable) {
				newLenDesc['[[Writable]]'] = false;
				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
				return false;
			}
		}
	}
	if (!newWritable) {
		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
	}
	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Array = GetIntrinsic('%Array%');
var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsConstructor = require('./IsConstructor');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate

module.exports = function ArraySpeciesCreate(originalArray, length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: length must be an integer >= 0');
	}
	var len = length === 0 ? 0 : length;
	var C;
	var isArray = IsArray(originalArray);
	if (isArray) {
		C = Get(originalArray, 'constructor');
		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
		// if (IsConstructor(C)) {
		// 	if C is another realm's Array, C = undefined
		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
		// }
		if ($species && Type(C) === 'Object') {
			C = Get(C, $species);
			if (C === null) {
				C = void 0;
			}
		}
	}
	if (typeof C === 'undefined') {
		return $Array(len);
	}
	if (!IsConstructor(C)) {
		throw new $TypeError('C must be a constructor');
	}
	return new C(len); // Construct(C, len);
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsCallable = require('./IsCallable');

// https://www.ecma-international.org/ecma-262/6.0/#sec-call

module.exports = function Call(F, V) {
	var args = arguments.length > 2 ? arguments[2] : [];
	if (!IsCallable(F)) {
		throw new $TypeError(inspect(F) + ' is not a function');
	}
	return F.apply(V, args);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring

module.exports = function CanonicalNumericIndexString(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Assertion failed: `argument` must be a String');
	}
	if (argument === '-0') { return -0; }
	var n = ToNumber(argument);
	if (SameValue(ToString(n), argument)) { return n; }
	return void 0;
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor

module.exports = function CompletePropertyDescriptor(Desc) {
	/* eslint no-param-reassign: 0 */
	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
		if (!has(Desc, '[[Value]]')) {
			Desc['[[Value]]'] = void 0;
		}
		if (!has(Desc, '[[Writable]]')) {
			Desc['[[Writable]]'] = false;
		}
	} else {
		if (!has(Desc, '[[Get]]')) {
			Desc['[[Get]]'] = void 0;
		}
		if (!has(Desc, '[[Set]]')) {
			Desc['[[Set]]'] = void 0;
		}
	}
	if (!has(Desc, '[[Enumerable]]')) {
		Desc['[[Enumerable]]'] = false;
	}
	if (!has(Desc, '[[Configurable]]')) {
		Desc['[[Configurable]]'] = false;
	}
	return Desc;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createdataproperty

module.exports = function CreateDataProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var oldDesc = OrdinaryGetOwnProperty(O, P);
	var extensible = oldDesc || IsExtensible(O);
	var immutable = oldDesc && (!oldDesc.writable || !oldDesc.configurable);
	if (immutable || !extensible) {
		return false;
	}
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		{
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Value]]': V,
			'[[Writable]]': true
		}
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateDataProperty = require('./CreateDataProperty');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow

module.exports = function CreateDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var success = CreateDataProperty(O, P, V);
	if (!success) {
		throw new $TypeError('unable to create data property');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $replace = callBound('String.prototype.replace');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createhtml

module.exports = function CreateHTML(string, tag, attribute, value) {
	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
	}
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var p1 = '<' + tag;
	if (attribute !== '') {
		var V = ToString(value);
		var escapedV = $replace(V, /\x22/g, '&quot;');
		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
	}
	return p1 + '>' + S + '</' + tag + '>';
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject

module.exports = function CreateIterResultObject(value, done) {
	if (Type(done) !== 'Boolean') {
		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
	}
	return {
		value: value,
		done: done
	};
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var callBound = require('../helpers/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
var $push = callBound('Array.prototype.push');

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToLength = require('./ToLength');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
module.exports = function CreateListFromArrayLike(obj) {
	var elementTypes = arguments.length > 1
		? arguments[1]
		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];

	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	if (!IsArray(elementTypes)) {
		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
	}
	var len = ToLength(Get(obj, 'length'));
	var list = [];
	var index = 0;
	while (index < len) {
		var indexName = ToString(index);
		var next = Get(obj, indexName);
		var nextType = Type(next);
		if ($indexOf(elementTypes, nextType) < 0) {
			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
		}
		$push(list, next);
		index += 1;
	}
	return list;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createmethodproperty

module.exports = function CreateMethodProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		newDesc
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return $floor(t / msPerDay);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + $floor((y - 1969) / 4) - $floor((y - 1901) / 100) + $floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var mod = require('../helpers/mod');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (mod(y, 4) !== 0) {
		return 365;
	}
	if (mod(y, 100) !== 0) {
		return 366;
	}
	if (mod(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow

module.exports = function DefinePropertyOrThrow(O, P, desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var Desc = isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, desc) ? desc : ToPropertyDescriptor(desc);
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
	}

	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		Desc
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow

module.exports = function DeletePropertyOrThrow(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// eslint-disable-next-line no-param-reassign
	var success = delete O[P];
	if (!success) {
		throw new $TypeError('Attempt to delete property failed.');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var objectKeys = require('object-keys');

var callBound = require('../helpers/callBound');

var callBind = require('../helpers/callBind');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));

var forEach = require('../helpers/forEach');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/8.0/#sec-enumerableownproperties

module.exports = function EnumerableOwnProperties(O, kind) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	var keys = objectKeys(O);
	if (kind === 'key') {
		return keys;
	}
	if (kind === 'value' || kind === 'key+value') {
		var results = [];
		forEach(keys, function (key) {
			if ($isEnumerable(O, key)) {
				$pushApply(results, [
					kind === 'value' ? O[key] : [key, O[key]]
				]);
			}
		});
		return results;
	}
	throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return Desc;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	var obj = {};
	if ('[[Value]]' in Desc) {
		obj.value = Desc['[[Value]]'];
	}
	if ('[[Writable]]' in Desc) {
		obj.writable = Desc['[[Writable]]'];
	}
	if ('[[Get]]' in Desc) {
		obj.get = Desc['[[Get]]'];
	}
	if ('[[Set]]' in Desc) {
		obj.set = Desc['[[Set]]'];
	}
	if ('[[Enumerable]]' in Desc) {
		obj.enumerable = Desc['[[Enumerable]]'];
	}
	if ('[[Configurable]]' in Desc) {
		obj.configurable = Desc['[[Configurable]]'];
	}
	return obj;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

/**
 * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
 * 1. Assert: Type(O) is Object.
 * 2. Assert: IsPropertyKey(P) is true.
 * 3. Return O.[[Get]](P, O).
 */

module.exports = function Get(O, P) {
	// 7.3.1.1
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	// 7.3.1.2
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
	}
	// 7.3.1.3
	return O[P];
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getiterator

module.exports = function GetIterator(obj, method) {
	var actualMethod = method;
	if (arguments.length < 2) {
		actualMethod = getIteratorMethod(
			{
				AdvanceStringIndex: AdvanceStringIndex,
				GetMethod: GetMethod,
				IsArray: IsArray,
				Type: Type
			},
			obj
		);
	}
	var iterator = Call(actualMethod, obj);
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('iterator must return an object');
	}

	return iterator;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var GetV = require('./GetV');
var IsCallable = require('./IsCallable');
var IsPropertyKey = require('./IsPropertyKey');

/**
 * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
 * 1. Assert: IsPropertyKey(P) is true.
 * 2. Let func be GetV(O, P).
 * 3. ReturnIfAbrupt(func).
 * 4. If func is either undefined or null, return undefined.
 * 5. If IsCallable(func) is false, throw a TypeError exception.
 * 6. Return func.
 */

module.exports = function GetMethod(O, P) {
	// 7.3.9.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.9.2
	var func = GetV(O, P);

	// 7.3.9.4
	if (func == null) {
		return void 0;
	}

	// 7.3.9.5
	if (!IsCallable(func)) {
		throw new $TypeError(P + 'is not a function');
	}

	// 7.3.9.6
	return func;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');

var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%');
var keys = require('object-keys');

var esType = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys

module.exports = function GetOwnPropertyKeys(O, Type) {
	if (esType(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (Type === 'Symbol') {
		return $gOPS ? $gOPS(O) : [];
	}
	if (Type === 'String') {
		if (!$gOPN) {
			return keys(O);
		}
		return $gOPN(O);
	}
	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Function = GetIntrinsic('%Function%');
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor

module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	if (!IsConstructor(constructor)) {
		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
	}
	var proto = Get(constructor, 'prototype');
	if (Type(proto) !== 'Object') {
		if (!(constructor instanceof $Function)) {
			// ignore other realms, for now
			throw new $TypeError('cross-realm constructors not currently supported');
		}
		proto = intrinsic;
	}
	return proto;
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $parseInt = GetIntrinsic('%parseInt%');

var inspect = require('object-inspect');

var regexTester = require('../helpers/regexTester');
var callBound = require('../helpers/callBound');
var every = require('../helpers/every');

var isDigit = regexTester(/^[0-9]$/);

var $charAt = callBound('String.prototype.charAt');
var $strSlice = callBound('String.prototype.slice');

var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false

var isStringOrHole = function (capture, index, arr) {
	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
};

// https://www.ecma-international.org/ecma-262/6.0/#sec-getsubstitution

// eslint-disable-next-line max-statements, max-params, max-lines-per-function
module.exports = function GetSubstitution(matched, str, position, captures, replacement) {
	if (Type(matched) !== 'String') {
		throw new $TypeError('Assertion failed: `matched` must be a String');
	}
	var matchLength = matched.length;

	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `str` must be a String');
	}
	var stringLength = str.length;

	if (!IsInteger(position) || position < 0 || position > stringLength) {
		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
	}

	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
	}

	if (Type(replacement) !== 'String') {
		throw new $TypeError('Assertion failed: `replacement` must be a String');
	}

	var tailPos = position + matchLength;
	var m = captures.length;

	var result = '';
	for (var i = 0; i < replacement.length; i += 1) {
		// if this is a $, and it's not the end of the replacement
		var current = $charAt(replacement, i);
		var isLast = (i + 1) >= replacement.length;
		var nextIsLast = (i + 2) >= replacement.length;
		if (current === '$' && !isLast) {
			var next = $charAt(replacement, i + 1);
			if (next === '$') {
				result += '$';
				i += 1;
			} else if (next === '&') {
				result += matched;
				i += 1;
			} else if (next === '`') {
				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
				i += 1;
			} else if (next === "'") {
				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
				i += 1;
			} else {
				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
					// $1 through $9, and not followed by a digit
					var n = $parseInt(next, 10);
					// if (n > m, impl-defined)
					result += (n <= m && Type(captures[n - 1]) === 'Undefined') ? '' : captures[n - 1];
					i += 1;
				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
					// $00 through $99
					var nn = next + nextNext;
					var nnI = $parseInt(nn, 10) - 1;
					// if nn === '00' or nn > m, impl-defined
					result += (nn <= m && Type(captures[nnI]) === 'Undefined') ? '' : captures[nnI];
					i += 2;
				} else {
					result += '$';
				}
			}
		} else {
			// the final $, or else not a $
			result += $charAt(replacement, i);
		}
	}
	return result;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var ToObject = require('./ToObject');

/**
 * 7.3.2 GetV (V, P)
 * 1. Assert: IsPropertyKey(P) is true.
 * 2. Let O be ToObject(V).
 * 3. ReturnIfAbrupt(O).
 * 4. Return O.[[Get]](P, V).
 */

module.exports = function GetV(V, P) {
	// 7.3.2.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.2.2-3
	var O = ToObject(V);

	// 7.3.2.4
	return O[P];
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var has = require('has');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty

module.exports = function HasOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return has(O, P);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty

module.exports = function HasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return mod($floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-instanceofoperator

module.exports = function InstanceofOperator(O, C) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
	if (typeof instOfHandler !== 'undefined') {
		return ToBoolean(Call(instOfHandler, C, [O]));
	}
	if (!IsCallable(C)) {
		throw new $TypeError('`C` is not Callable');
	}
	return OrdinaryHasInstance(C, O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $arraySlice = require('../helpers/callBound')('Array.prototype.slice');

var Call = require('./Call');
var GetV = require('./GetV');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-invoke

module.exports = function Invoke(O, P) {
	if (!IsPropertyKey(P)) {
		throw new $TypeError('P must be a Property Key');
	}
	var argumentsList = $arraySlice(arguments, 2);
	var func = GetV(O, P);
	return Call(func, O, argumentsList);
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Array = GetIntrinsic('%Array%');

// eslint-disable-next-line global-require
var toStr = !$Array.isArray && require('../helpers/callBound')('Object.prototype.toString');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isarray

module.exports = $Array.isArray || function IsArray(argument) {
	return toStr(argument) === '[object Array]';
};
'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable

module.exports = function IsConcatSpreadable(O) {
	if (Type(O) !== 'Object') {
		return false;
	}
	if ($isConcatSpreadable) {
		var spreadable = Get(O, $isConcatSpreadable);
		if (typeof spreadable !== 'undefined') {
			return ToBoolean(spreadable);
		}
	}
	return IsArray(O);
};
'use strict';

// https://www.ecma-international.org/ecma-262/6.0/#sec-isconstructor

module.exports = function IsConstructor(argument) {
	return typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument`
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Object = GetIntrinsic('%Object%');

var isPrimitive = require('../helpers/isPrimitive');

var $preventExtensions = $Object.preventExtensions;
var $isExtensible = $Object.isExtensible;

// https://www.ecma-international.org/ecma-262/6.0/#sec-isextensible-o

module.exports = $preventExtensions
	? function IsExtensible(obj) {
		return !isPrimitive(obj) && $isExtensible(obj);
	}
	: function IsExtensible(obj) {
		return !isPrimitive(obj);
	};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var $floor = $Math.floor;
var $abs = $Math.abs;

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isinteger

module.exports = function IsInteger(argument) {
	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
		return false;
	}
	var abs = $abs(argument);
	return $floor(abs) === abs;
};
'use strict';

var callBound = require('../helpers/callBound');

var $PromiseThen = callBound('Promise.prototype.then', true);

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ispromise

module.exports = function IsPromise(x) {
	if (Type(x) !== 'Object') {
		return false;
	}
	if (!$PromiseThen) { // Promises are not supported
		return false;
	}
	try {
		$PromiseThen(x); // throws if not a promise
	} catch (e) {
		return false;
	}
	return true;
};
'use strict';

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var Type = require('./Type');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');

// https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type

module.exports = function IsPropertyDescriptor(Desc) {
	return isPropertyDescriptor({
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor,
		Type: Type
	}, Desc);
};
'use strict';

// https://www.ecma-international.org/ecma-262/6.0/#sec-ispropertykey

module.exports = function IsPropertyKey(argument) {
	return typeof argument === 'string' || typeof argument === 'symbol';
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $match = GetIntrinsic('%Symbol.match%', true);

var hasRegExpMatcher = require('is-regex');

var ToBoolean = require('./ToBoolean');

// https://ecma-international.org/ecma-262/6.0/#sec-isregexp

module.exports = function IsRegExp(argument) {
	if (!argument || typeof argument !== 'object') {
		return false;
	}
	if ($match) {
		var isRegExp = argument[$match];
		if (typeof isRegExp !== 'undefined') {
			return ToBoolean(isRegExp);
		}
	}
	return hasRegExpMatcher(argument);
};
'use strict';

var callBound = require('../helpers/callBound');
var $arrayPush = callBound('Array.prototype.push');

var GetIterator = require('./GetIterator');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');

// https://www.ecma-international.org/ecma-262/8.0/#sec-iterabletolist

module.exports = function IterableToList(items, method) {
	var iterator = GetIterator(items, method);
	var values = [];
	var next = true;
	while (next) {
		next = IteratorStep(iterator);
		if (next) {
			var nextValue = IteratorValue(next);
			$arrayPush(values, nextValue);
		}
	}
	return values;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose

module.exports = function IteratorClose(iterator, completion) {
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
	}
	if (!IsCallable(completion)) {
		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
	}
	var completionThunk = completion;

	var iteratorReturn = GetMethod(iterator, 'return');

	if (typeof iteratorReturn === 'undefined') {
		return completionThunk();
	}

	var completionRecord;
	try {
		var innerResult = Call(iteratorReturn, iterator, []);
	} catch (e) {
		// if we hit here, then "e" is the innerResult completion that needs re-throwing

		// if the completion is of type "throw", this will throw.
		completionThunk();
		completionThunk = null; // ensure it's not called twice.

		// if not, then return the innerResult completion
		throw e;
	}
	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
	completionThunk = null; // ensure it's not called twice.

	if (Type(innerResult) !== 'Object') {
		throw new $TypeError('iterator .return must return an object');
	}

	return completionRecord;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete

module.exports = function IteratorComplete(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return ToBoolean(Get(iterResult, 'done'));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Invoke = require('./Invoke');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext

module.exports = function IteratorNext(iterator, value) {
	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
	if (Type(result) !== 'Object') {
		throw new $TypeError('iterator next must return an object');
	}
	return result;
};
'use strict';

var IteratorComplete = require('./IteratorComplete');
var IteratorNext = require('./IteratorNext');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep

module.exports = function IteratorStep(iterator) {
	var result = IteratorNext(iterator);
	var done = IteratorComplete(result);
	return done === true ? false : result;
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue

module.exports = function IteratorValue(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return Get(iterResult, 'value');
};

'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');
var $DateUTC = GetIntrinsic('%Date.UTC%');

var mod = require('../helpers/mod');
var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var MonthFromTime = require('./MonthFromTime');
var ToInteger = require('./ToInteger');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToInteger(year);
	var m = ToInteger(month);
	var dt = ToInteger(date);
	var ym = y + $floor(m / 12);
	var mn = mod(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToInteger = require('./ToInteger');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToInteger(hour);
	var m = ToInteger(min);
	var s = ToInteger(sec);
	var milli = ToInteger(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return mod($floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $ObjectCreate = GetIntrinsic('%Object.create%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var Type = require('./Type');

var hasProto = !({ __proto__: null } instanceof Object);

// https://www.ecma-international.org/ecma-262/6.0/#sec-objectcreate

module.exports = function ObjectCreate(proto, internalSlotsList) {
	if (proto !== null && Type(proto) !== 'Object') {
		throw new $TypeError('Assertion failed: `proto` must be null or an object');
	}
	var slots = arguments.length < 2 ? [] : internalSlotsList;
	if (slots.length > 0) {
		throw new $SyntaxError('es-abstract does not yet support internal slots');
	}

	if ($ObjectCreate) {
		return $ObjectCreate(proto);
	}
	if (hasProto) {
		return { __proto__: proto };
	}

	if (proto === null) {
		throw new $SyntaxError('native Object.create support is required to create null objects');
	}
	var T = function T() {};
	T.prototype = proto;
	return new T();
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var SameValue = require('./SameValue');
var Type = require('./Type');
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty

module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!$gOPD) {
		// ES3/IE 8 fallback
		if (IsAccessorDescriptor(Desc)) {
			throw new $SyntaxError('This environment does not support accessor property descriptors.');
		}
		var creatingNormalDataProperty = !(P in O)
			&& Desc['[[Writable]]']
			&& Desc['[[Enumerable]]']
			&& Desc['[[Configurable]]']
			&& '[[Value]]' in Desc;
		var settingExistingDataProperty = (P in O)
			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
			&& '[[Value]]' in Desc;
		if (creatingNormalDataProperty || settingExistingDataProperty) {
			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
			return SameValue(O[P], Desc['[[Value]]']);
		}
		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
	}
	var desc = $gOPD(O, P);
	var current = desc && ToPropertyDescriptor(desc);
	var extensible = IsExtensible(O);
	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var has = require('has');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var IsRegExp = require('./IsRegExp');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty

module.exports = function OrdinaryGetOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!has(O, P)) {
		return void 0;
	}
	if (!$gOPD) {
		// ES3 / IE 8 fallback
		var arrayLength = IsArray(O) && P === 'length';
		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
		return {
			'[[Configurable]]': !(arrayLength || regexLastIndex),
			'[[Enumerable]]': $isEnumerable(O, P),
			'[[Value]]': O[P],
			'[[Writable]]': true
		};
	}
	return ToPropertyDescriptor($gOPD(O, P));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $getProto = require('../helpers/getProto');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/7.0/#sec-ordinarygetprototypeof

module.exports = function OrdinaryGetPrototypeOf(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!$getProto) {
		throw new $TypeError('This environment does not support fetching prototypes.');
	}
	return $getProto(O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance

module.exports = function OrdinaryHasInstance(C, O) {
	if (IsCallable(C) === false) {
		return false;
	}
	if (Type(O) !== 'Object') {
		return false;
	}
	var P = Get(C, 'prototype');
	if (Type(P) !== 'Object') {
		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
	}
	return O instanceof C;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty

module.exports = function OrdinaryHasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $setProto = require('../helpers/setProto');

var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/7.0/#sec-ordinarysetprototypeof

module.exports = function OrdinarySetPrototypeOf(O, V) {
	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
		throw new $TypeError('Assertion failed: V must be Object or Null');
	}
	/*
    var extensible = IsExtensible(O);
    var current = OrdinaryGetPrototypeOf(O);
    if (SameValue(V, current)) {
        return true;
    }
    if (!extensible) {
        return false;
    }
    */
	try {
		$setProto(O, V);
	} catch (e) {
		return false;
	}
	return OrdinaryGetPrototypeOf(O) === V;
	/*
    var p = V;
    var done = false;
    while (!done) {
        if (p === null) {
            done = true;
        } else if (SameValue(p, O)) {
            return false;
        } else {
            if (wat) {
                done = true;
            } else {
                p = p.[[Prototype]];
            }
        }
     }
     O.[[Prototype]] = V;
     return true;
     */
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var regexExec = require('../helpers/callBound')('RegExp.prototype.exec');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec

module.exports = function RegExpExec(R, S) {
	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: `R` must be an Object');
	}
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	var exec = Get(R, 'exec');
	if (IsCallable(exec)) {
		var result = Call(exec, R, [S]);
		if (result === null || Type(result) === 'Object') {
			return result;
		}
		throw new $TypeError('"exec" method must return `null` or an Object');
	}
	return regexExec(R, S);
};
'use strict';

module.exports = require('../5/CheckObjectCoercible');
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');

// https://www.ecma-international.org/ecma-262/7.0/#sec-samevaluenonnumber

module.exports = function SameValueNonNumber(x, y) {
	if (typeof x === 'number' || typeof x !== typeof y) {
		throw new $TypeError('SameValueNonNumber requires two non-number values of the same type.');
	}
	return SameValue(x, y);
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// https://www.ecma-international.org/ecma-262/6.0/#sec-samevaluezero

module.exports = function SameValueZero(x, y) {
	return (x === y) || ($isNaN(x) && $isNaN(y));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return mod($floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw

module.exports = function Set(O, P, V, Throw) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	if (Type(Throw) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
	}
	if (Throw) {
		O[P] = V; // eslint-disable-line no-param-reassign
		return true;
	} else {
		try {
			O[P] = V; // eslint-disable-line no-param-reassign
		} catch (e) {
			return false;
		}
	}
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var has = require('has');

var $TypeError = GetIntrinsic('%TypeError%');

var getSymbolDescription = require('../helpers/getSymbolDescription');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsExtensible = require('./IsExtensible');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname

module.exports = function SetFunctionName(F, name) {
	if (typeof F !== 'function') {
		throw new $TypeError('Assertion failed: `F` must be a function');
	}
	if (!IsExtensible(F) || has(F, 'name')) {
		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
	}
	var nameType = Type(name);
	if (nameType !== 'Symbol' && nameType !== 'String') {
		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
	}
	if (nameType === 'Symbol') {
		var description = getSymbolDescription(name);
		// eslint-disable-next-line no-param-reassign
		name = typeof description === 'undefined' ? '' : '[' + description + ']';
	}
	if (arguments.length > 2) {
		var prefix = arguments[2];
		// eslint-disable-next-line no-param-reassign
		name = prefix + ' ' + name;
	}
	return DefinePropertyOrThrow(F, 'name', {
		'[[Value]]': name,
		'[[Writable]]': false,
		'[[Enumerable]]': false,
		'[[Configurable]]': true
	});
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');
var $preventExtensions = GetIntrinsic('%Object.preventExtensions%');
var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');

var forEach = require('../helpers/forEach');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-setintegritylevel

module.exports = function SetIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	if (!$preventExtensions) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
	}
	var status = $preventExtensions(O);
	if (!status) {
		return false;
	}
	if (!$gOPN) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
	}
	var theKeys = $gOPN(O);
	if (level === 'sealed') {
		forEach(theKeys, function (k) {
			DefinePropertyOrThrow(O, k, { configurable: false });
		});
	} else if (level === 'frozen') {
		forEach(theKeys, function (k) {
			var currentDesc = $gOPD(O, k);
			if (typeof currentDesc !== 'undefined') {
				var desc;
				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
					desc = { configurable: false };
				} else {
					desc = { configurable: false, writable: false };
				}
				DefinePropertyOrThrow(O, k, desc);
			}
		});
	}
	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor

module.exports = function SpeciesConstructor(O, defaultConstructor) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var C = O.constructor;
	if (typeof C === 'undefined') {
		return defaultConstructor;
	}
	if (Type(C) !== 'Object') {
		throw new $TypeError('O.constructor is not an Object');
	}
	var S = $species ? C[$species] : void 0;
	if (S == null) {
		return defaultConstructor;
	}
	if (IsConstructor(S)) {
		return S;
	}
	throw new $TypeError('no constructor found');
};
'use strict';

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $SymbolToString = callBound('Symbol.prototype.toString', true);

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring

module.exports = function SymbolDescriptiveString(sym) {
	if (Type(sym) !== 'Symbol') {
		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
	}
	return $SymbolToString(sym);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
var $TypeError = GetIntrinsic('%TypeError%');

var every = require('../helpers/every');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-testintegritylevel

module.exports = function TestIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	var status = IsExtensible(O);
	if (status) {
		return false;
	}
	var theKeys = $gOPN(O);
	return theKeys.length === 0 || every(theKeys, function (k) {
		var currentDesc = $gOPD(O, k);
		if (typeof currentDesc !== 'undefined') {
			if (currentDesc.configurable) {
				return false;
			}
			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
				return false;
			}
		}
		return true;
	});
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');
var $abs = GetIntrinsic('%Math.abs%');

var $isFinite = require('../helpers/isFinite');

var ToNumber = require('./ToNumber');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || $abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var mod = require('../helpers/mod');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return mod(t, msPerDay);
};

'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Date = GetIntrinsic('%Date%');

var $isNaN = require('../helpers/isNaN');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-todatestring

module.exports = function ToDateString(tv) {
	if (Type(tv) !== 'Number') {
		throw new $TypeError('Assertion failed: `tv` must be a Number');
	}
	if ($isNaN(tv)) {
		return 'Invalid Date';
	}
	return $Date(tv);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $RangeError = GetIntrinsic('%RangeError%');

var ToInteger = require('./ToInteger');
var ToLength = require('./ToLength');
var SameValueZero = require('./SameValueZero');

// https://www.ecma-international.org/ecma-262/8.0/#sec-toindex

module.exports = function ToIndex(value) {
	if (typeof value === 'undefined') {
		return 0;
	}
	var integerIndex = ToInteger(value);
	if (integerIndex < 0) {
		throw new $RangeError('index must be >= 0');
	}
	var index = ToLength(integerIndex);
	if (!SameValueZero(integerIndex, index)) {
		throw new $RangeError('index must be >= 0 and < 2 ** 53 - 1');
	}
	return index;
};
'use strict';

var ToUint16 = require('./ToUint16');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toint16

module.exports = function ToInt16(argument) {
	var int16bit = ToUint16(argument);
	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
};
'use strict';

var ToNumber = require('./ToNumber');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var ToUint8 = require('./ToUint8');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toint8

module.exports = function ToInt8(argument) {
	var int8bit = ToUint8(argument);
	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
};
'use strict';

var ES5ToInteger = require('../5/ToInteger');

var ToNumber = require('./ToNumber');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tointeger

module.exports = function ToInteger(value) {
	var number = ToNumber(value);
	return ES5ToInteger(number);
};
'use strict';

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var ToInteger = require('./ToInteger');

module.exports = function ToLength(argument) {
	var len = ToInteger(argument);
	if (len <= 0) { return 0; } // includes converting -0 to +0
	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
	return len;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Number = GetIntrinsic('%Number%');
var $RegExp = GetIntrinsic('%RegExp%');
var $parseInteger = GetIntrinsic('%parseInt%');

var callBound = require('../helpers/callBound');
var regexTester = require('../helpers/regexTester');
var isPrimitive = require('../helpers/isPrimitive');

var $strSlice = callBound('String.prototype.slice');
var isBinary = regexTester(/^0b[01]+$/i);
var isOctal = regexTester(/^0o[0-7]+$/i);
var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
var hasNonWS = regexTester(nonWSregex);

// whitespace from: https://es5.github.io/#x15.5.4.20
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
var ws = [
	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
	'\u2029\uFEFF'
].join('');
var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
var $replace = callBound('String.prototype.replace');
var $trim = function (value) {
	return $replace(value, trimRegex, '');
};

var ToPrimitive = require('./ToPrimitive');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tonumber

module.exports = function ToNumber(argument) {
	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (typeof value === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a number');
	}
	if (typeof value === 'string') {
		if (isBinary(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 2));
		} else if (isOctal(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 8));
		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
			return NaN;
		} else {
			var trimmed = $trim(value);
			if (trimmed !== value) {
				return ToNumber(trimmed);
			}
		}
	}
	return $Number(value);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Object = GetIntrinsic('%Object%');

var RequireObjectCoercible = require('./RequireObjectCoercible');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toobject

module.exports = function ToObject(value) {
	RequireObjectCoercible(value);
	return $Object(value);
};
'use strict';

var toPrimitive = require('es-to-primitive/es2015');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive

module.exports = function ToPrimitive(input) {
	if (arguments.length > 1) {
		return toPrimitive(input, arguments[1]);
	}
	return toPrimitive(input);
};
'use strict';

var has = require('has');

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://ecma-international.org/ecma-262/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $String = GetIntrinsic('%String%');

var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');

// https://www.ecma-international.org/ecma-262/6.0/#sec-topropertykey

module.exports = function ToPropertyKey(argument) {
	var key = ToPrimitive(argument, $String);
	return typeof key === 'symbol' ? key : ToString(key);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function ToString(argument) {
	if (typeof argument === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a string');
	}
	return $String(argument);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');
var $mod = require('../helpers/mod');

var $floor = $Math.floor;
var $abs = $Math.abs;

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * $floor($abs(number));
	return $mod(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');
var $mod = require('../helpers/mod');

var $floor = $Math.floor;
var $abs = $Math.abs;

module.exports = function ToUint8(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * $floor($abs(number));
	return $mod(posInt, 0x100);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');

var $floor = $Math.floor;

// https://www.ecma-international.org/ecma-262/6.0/#sec-touint8clamp

module.exports = function ToUint8Clamp(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number <= 0) { return 0; }
	if (number >= 0xFF) { return 0xFF; }
	var f = $floor(argument);
	if (f + 0.5 < number) { return f + 1; }
	if (number < f + 0.5) { return f; }
	if (f % 2 !== 0) { return f + 1; }
	return f;
};
'use strict';

var ES5Type = require('../5/Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function Type(x) {
	if (typeof x === 'symbol') {
		return 'Symbol';
	}
	return ES5Type(x);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');
var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
// https://www.ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor

// eslint-disable-next-line max-lines-per-function, max-statements, max-params
module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
	var oType = Type(O);
	if (oType !== 'Undefined' && oType !== 'Object') {
		throw new $TypeError('Assertion failed: O must be undefined or an Object');
	}
	if (Type(extensible) !== 'Boolean') {
		throw new $TypeError('Assertion failed: extensible must be a Boolean');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, current)) {
		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
	}
	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
	}
	if (Type(current) === 'Undefined') {
		if (!extensible) {
			return false;
		}
		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': Desc['[[Configurable]]'],
						'[[Enumerable]]': Desc['[[Enumerable]]'],
						'[[Value]]': Desc['[[Value]]'],
						'[[Writable]]': Desc['[[Writable]]']
					}
				);
			}
		} else {
			if (!IsAccessorDescriptor(Desc)) {
				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
			}
			if (oType !== 'Undefined') {
				return DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					Desc
				);
			}
		}
		return true;
	}
	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
		return true;
	}
	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
		return true; // removed by ES2017, but should still be correct
	}
	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
	if (!current['[[Configurable]]']) {
		if (Desc['[[Configurable]]']) {
			return false;
		}
		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
			return false;
		}
	}
	if (IsGenericDescriptor(Desc)) {
		// no further validation is required.
	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			return false;
		}
		if (IsDataDescriptor(current)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': current['[[Configurable]]'],
						'[[Enumerable]]': current['[[Enumerable]]'],
						'[[Get]]': undefined
					}
				);
			}
		} else if (oType !== 'Undefined') {
			DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': current['[[Configurable]]'],
					'[[Enumerable]]': current['[[Enumerable]]'],
					'[[Value]]': undefined
				}
			);
		}
	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
				return false;
			}
			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
				return false;
			}
			return true;
		}
	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
				return false;
			}
			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
				return false;
			}
			return true;
		}
	} else {
		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
	}
	if (oType !== 'Undefined') {
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			Desc
		);
	}
	return true;
};
'use strict';

var mod = require('../helpers/mod');

var Day = require('./Day');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return mod(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('../helpers/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var mod = require('../helpers/mod');

// https://ecma-international.org/ecma-262/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var mod = require('../helpers/mod');
var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return mod(t, msPerSecond);
};
'use strict';

var $BooleanValueOf = require('../helpers/callBound')('Boolean.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object

module.exports = function thisBooleanValue(value) {
	if (Type(value) === 'Boolean') {
		return value;
	}

	return $BooleanValueOf(value);
};
'use strict';

var callBound = require('../helpers/callBound');

var Type = require('./Type');

var $NumberValueOf = callBound('Number.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object

module.exports = function thisNumberValue(value) {
	if (Type(value) === 'Number') {
		return value;
	}

	return $NumberValueOf(value);
};

'use strict';

var $StringValueOf = require('../helpers/callBound')('String.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object

module.exports = function thisStringValue(value) {
	if (Type(value) === 'String') {
		return value;
	}

	return $StringValueOf(value);
};
'use strict';

var $DateValueOf = require('../helpers/callBound')('Date.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object

module.exports = function thisTimeValue(value) {
	return $DateValueOf(value);
};
'use strict';

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return x === y; // ES6+ specified this shortcut anyways.
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	return false;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var isPrefixOf = require('../helpers/isPrefixOf');

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5

// eslint-disable-next-line max-statements
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
	if (!bothStrings) {
		var nx = ToNumber(px);
		var ny = ToNumber(py);
		if ($isNaN(nx) || $isNaN(ny)) {
			return undefined;
		}
		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
			return false;
		}
		if (nx === 0 && ny === 0) {
			return false;
		}
		if (nx === Infinity) {
			return false;
		}
		if (ny === Infinity) {
			return true;
		}
		if (ny === -Infinity) {
			return false;
		}
		if (nx === -Infinity) {
			return true;
		}
		return nx < ny; // by now, these are both nonzero, finite, and not equal
	}
	if (isPrefixOf(py, px)) {
		return false;
	}
	if (isPrefixOf(px, py)) {
		return true;
	}
	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var $TypeError = GetIntrinsic('%TypeError%');

var $charCodeAt = require('../helpers/callBound')('String.prototype.charCodeAt');

// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex

module.exports = function AdvanceStringIndex(S, index, unicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
	}
	if (Type(unicode) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
	}
	if (!unicode) {
		return index + 1;
	}
	var length = S.length;
	if ((index + 1) >= length) {
		return index + 1;
	}

	var first = $charCodeAt(S, index);
	if (first < 0xD800 || first > 0xDBFF) {
		return index + 1;
	}

	var second = $charCodeAt(S, index + 1);
	if (second < 0xDC00 || second > 0xDFFF) {
		return index + 1;
	}

	return index + 2;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayPrototype
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);

// https://www.ecma-international.org/ecma-262/6.0/#sec-arraycreate

module.exports = function ArrayCreate(length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
	}
	if (length > MAX_ARRAY_LENGTH) {
		throw new $RangeError('length is greater than (2**32 - 1)');
	}
	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
	var A = []; // steps 5 - 7, and 9
	if (proto !== $ArrayPrototype) { // step 8
		if (!$setProto) {
			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
		$setProto(A, proto);
	}
	if (length !== 0) { // bypasses the need for step 2
		A.length = length;
	}
	/* step 10, the above as a shortcut for the below
    OrdinaryDefineOwnProperty(A, 'length', {
        '[[Configurable]]': false,
        '[[Enumerable]]': false,
        '[[Value]]': length,
        '[[Writable]]': true
    });
    */
	return A;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var assign = require('object.assign');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsArray = require('./IsArray');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-arraysetlength

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function ArraySetLength(A, Desc) {
	if (!IsArray(A)) {
		throw new $TypeError('Assertion failed: A must be an Array');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!('[[Value]]' in Desc)) {
		return OrdinaryDefineOwnProperty(A, 'length', Desc);
	}
	var newLenDesc = assign({}, Desc);
	var newLen = ToUint32(Desc['[[Value]]']);
	var numberLen = ToNumber(Desc['[[Value]]']);
	if (newLen !== numberLen) {
		throw new $RangeError('Invalid array length');
	}
	newLenDesc['[[Value]]'] = newLen;
	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
	if (!IsDataDescriptor(oldLenDesc)) {
		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
	}
	var oldLen = oldLenDesc['[[Value]]'];
	if (newLen >= oldLen) {
		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	}
	if (!oldLenDesc['[[Writable]]']) {
		return false;
	}
	var newWritable;
	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
		newWritable = true;
	} else {
		newWritable = false;
		newLenDesc['[[Writable]]'] = true;
	}
	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	if (!succeeded) {
		return false;
	}
	while (newLen < oldLen) {
		oldLen -= 1;
		// eslint-disable-next-line no-param-reassign
		var deleteSucceeded = delete A[ToString(oldLen)];
		if (!deleteSucceeded) {
			newLenDesc['[[Value]]'] = oldLen + 1;
			if (!newWritable) {
				newLenDesc['[[Writable]]'] = false;
				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
				return false;
			}
		}
	}
	if (!newWritable) {
		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
	}
	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Array = GetIntrinsic('%Array%');
var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsConstructor = require('./IsConstructor');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate

module.exports = function ArraySpeciesCreate(originalArray, length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: length must be an integer >= 0');
	}
	var len = length === 0 ? 0 : length;
	var C;
	var isArray = IsArray(originalArray);
	if (isArray) {
		C = Get(originalArray, 'constructor');
		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
		// if (IsConstructor(C)) {
		// 	if C is another realm's Array, C = undefined
		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
		// }
		if ($species && Type(C) === 'Object') {
			C = Get(C, $species);
			if (C === null) {
				C = void 0;
			}
		}
	}
	if (typeof C === 'undefined') {
		return $Array(len);
	}
	if (!IsConstructor(C)) {
		throw new $TypeError('C must be a constructor');
	}
	return new C(len); // Construct(C, len);
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsCallable = require('./IsCallable');

// https://www.ecma-international.org/ecma-262/6.0/#sec-call

module.exports = function Call(F, V) {
	var args = arguments.length > 2 ? arguments[2] : [];
	if (!IsCallable(F)) {
		throw new $TypeError(inspect(F) + ' is not a function');
	}
	return F.apply(V, args);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring

module.exports = function CanonicalNumericIndexString(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Assertion failed: `argument` must be a String');
	}
	if (argument === '-0') { return -0; }
	var n = ToNumber(argument);
	if (SameValue(ToString(n), argument)) { return n; }
	return void 0;
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor

module.exports = function CompletePropertyDescriptor(Desc) {
	/* eslint no-param-reassign: 0 */
	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
		if (!has(Desc, '[[Value]]')) {
			Desc['[[Value]]'] = void 0;
		}
		if (!has(Desc, '[[Writable]]')) {
			Desc['[[Writable]]'] = false;
		}
	} else {
		if (!has(Desc, '[[Get]]')) {
			Desc['[[Get]]'] = void 0;
		}
		if (!has(Desc, '[[Set]]')) {
			Desc['[[Set]]'] = void 0;
		}
	}
	if (!has(Desc, '[[Enumerable]]')) {
		Desc['[[Enumerable]]'] = false;
	}
	if (!has(Desc, '[[Configurable]]')) {
		Desc['[[Configurable]]'] = false;
	}
	return Desc;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createdataproperty

module.exports = function CreateDataProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var oldDesc = OrdinaryGetOwnProperty(O, P);
	var extensible = oldDesc || IsExtensible(O);
	var immutable = oldDesc && (!oldDesc.writable || !oldDesc.configurable);
	if (immutable || !extensible) {
		return false;
	}
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		{
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Value]]': V,
			'[[Writable]]': true
		}
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateDataProperty = require('./CreateDataProperty');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow

module.exports = function CreateDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var success = CreateDataProperty(O, P, V);
	if (!success) {
		throw new $TypeError('unable to create data property');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $replace = callBound('String.prototype.replace');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createhtml

module.exports = function CreateHTML(string, tag, attribute, value) {
	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
	}
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var p1 = '<' + tag;
	if (attribute !== '') {
		var V = ToString(value);
		var escapedV = $replace(V, /\x22/g, '&quot;');
		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
	}
	return p1 + '>' + S + '</' + tag + '>';
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject

module.exports = function CreateIterResultObject(value, done) {
	if (Type(done) !== 'Boolean') {
		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
	}
	return {
		value: value,
		done: done
	};
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var callBound = require('../helpers/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
var $push = callBound('Array.prototype.push');

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToLength = require('./ToLength');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
module.exports = function CreateListFromArrayLike(obj) {
	var elementTypes = arguments.length > 1
		? arguments[1]
		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];

	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	if (!IsArray(elementTypes)) {
		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
	}
	var len = ToLength(Get(obj, 'length'));
	var list = [];
	var index = 0;
	while (index < len) {
		var indexName = ToString(index);
		var next = Get(obj, indexName);
		var nextType = Type(next);
		if ($indexOf(elementTypes, nextType) < 0) {
			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
		}
		$push(list, next);
		index += 1;
	}
	return list;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createmethodproperty

module.exports = function CreateMethodProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		newDesc
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return $floor(t / msPerDay);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + $floor((y - 1969) / 4) - $floor((y - 1901) / 100) + $floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var mod = require('../helpers/mod');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (mod(y, 4) !== 0) {
		return 365;
	}
	if (mod(y, 100) !== 0) {
		return 366;
	}
	if (mod(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow

module.exports = function DefinePropertyOrThrow(O, P, desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var Desc = isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, desc) ? desc : ToPropertyDescriptor(desc);
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
	}

	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		Desc
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow

module.exports = function DeletePropertyOrThrow(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// eslint-disable-next-line no-param-reassign
	var success = delete O[P];
	if (!success) {
		throw new $TypeError('Attempt to delete property failed.');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var keys = require('object-keys');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-enumerableownnames

module.exports = function EnumerableOwnNames(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	return keys(O);
};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return Desc;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	var obj = {};
	if ('[[Value]]' in Desc) {
		obj.value = Desc['[[Value]]'];
	}
	if ('[[Writable]]' in Desc) {
		obj.writable = Desc['[[Writable]]'];
	}
	if ('[[Get]]' in Desc) {
		obj.get = Desc['[[Get]]'];
	}
	if ('[[Set]]' in Desc) {
		obj.set = Desc['[[Set]]'];
	}
	if ('[[Enumerable]]' in Desc) {
		obj.enumerable = Desc['[[Enumerable]]'];
	}
	if ('[[Configurable]]' in Desc) {
		obj.configurable = Desc['[[Configurable]]'];
	}
	return obj;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

/**
 * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
 * 1. Assert: Type(O) is Object.
 * 2. Assert: IsPropertyKey(P) is true.
 * 3. Return O.[[Get]](P, O).
 */

module.exports = function Get(O, P) {
	// 7.3.1.1
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	// 7.3.1.2
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
	}
	// 7.3.1.3
	return O[P];
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getiterator

module.exports = function GetIterator(obj, method) {
	var actualMethod = method;
	if (arguments.length < 2) {
		actualMethod = getIteratorMethod(
			{
				AdvanceStringIndex: AdvanceStringIndex,
				GetMethod: GetMethod,
				IsArray: IsArray,
				Type: Type
			},
			obj
		);
	}
	var iterator = Call(actualMethod, obj);
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('iterator must return an object');
	}

	return iterator;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var GetV = require('./GetV');
var IsCallable = require('./IsCallable');
var IsPropertyKey = require('./IsPropertyKey');

/**
 * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
 * 1. Assert: IsPropertyKey(P) is true.
 * 2. Let func be GetV(O, P).
 * 3. ReturnIfAbrupt(func).
 * 4. If func is either undefined or null, return undefined.
 * 5. If IsCallable(func) is false, throw a TypeError exception.
 * 6. Return func.
 */

module.exports = function GetMethod(O, P) {
	// 7.3.9.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.9.2
	var func = GetV(O, P);

	// 7.3.9.4
	if (func == null) {
		return void 0;
	}

	// 7.3.9.5
	if (!IsCallable(func)) {
		throw new $TypeError(P + 'is not a function');
	}

	// 7.3.9.6
	return func;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');

var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%');
var keys = require('object-keys');

var esType = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys

module.exports = function GetOwnPropertyKeys(O, Type) {
	if (esType(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (Type === 'Symbol') {
		return $gOPS ? $gOPS(O) : [];
	}
	if (Type === 'String') {
		if (!$gOPN) {
			return keys(O);
		}
		return $gOPN(O);
	}
	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Function = GetIntrinsic('%Function%');
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor

module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	if (!IsConstructor(constructor)) {
		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
	}
	var proto = Get(constructor, 'prototype');
	if (Type(proto) !== 'Object') {
		if (!(constructor instanceof $Function)) {
			// ignore other realms, for now
			throw new $TypeError('cross-realm constructors not currently supported');
		}
		proto = intrinsic;
	}
	return proto;
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $parseInt = GetIntrinsic('%parseInt%');

var inspect = require('object-inspect');

var regexTester = require('../helpers/regexTester');
var callBound = require('../helpers/callBound');
var every = require('../helpers/every');

var isDigit = regexTester(/^[0-9]$/);

var $charAt = callBound('String.prototype.charAt');
var $strSlice = callBound('String.prototype.slice');

var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false

var isStringOrHole = function (capture, index, arr) {
	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
};

// https://www.ecma-international.org/ecma-262/6.0/#sec-getsubstitution

// eslint-disable-next-line max-statements, max-params, max-lines-per-function
module.exports = function GetSubstitution(matched, str, position, captures, replacement) {
	if (Type(matched) !== 'String') {
		throw new $TypeError('Assertion failed: `matched` must be a String');
	}
	var matchLength = matched.length;

	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `str` must be a String');
	}
	var stringLength = str.length;

	if (!IsInteger(position) || position < 0 || position > stringLength) {
		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
	}

	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
	}

	if (Type(replacement) !== 'String') {
		throw new $TypeError('Assertion failed: `replacement` must be a String');
	}

	var tailPos = position + matchLength;
	var m = captures.length;

	var result = '';
	for (var i = 0; i < replacement.length; i += 1) {
		// if this is a $, and it's not the end of the replacement
		var current = $charAt(replacement, i);
		var isLast = (i + 1) >= replacement.length;
		var nextIsLast = (i + 2) >= replacement.length;
		if (current === '$' && !isLast) {
			var next = $charAt(replacement, i + 1);
			if (next === '$') {
				result += '$';
				i += 1;
			} else if (next === '&') {
				result += matched;
				i += 1;
			} else if (next === '`') {
				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
				i += 1;
			} else if (next === "'") {
				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
				i += 1;
			} else {
				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
					// $1 through $9, and not followed by a digit
					var n = $parseInt(next, 10);
					// if (n > m, impl-defined)
					result += (n <= m && Type(captures[n - 1]) === 'Undefined') ? '' : captures[n - 1];
					i += 1;
				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
					// $00 through $99
					var nn = next + nextNext;
					var nnI = $parseInt(nn, 10) - 1;
					// if nn === '00' or nn > m, impl-defined
					result += (nn <= m && Type(captures[nnI]) === 'Undefined') ? '' : captures[nnI];
					i += 2;
				} else {
					result += '$';
				}
			}
		} else {
			// the final $, or else not a $
			result += $charAt(replacement, i);
		}
	}
	return result;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var ToObject = require('./ToObject');

/**
 * 7.3.2 GetV (V, P)
 * 1. Assert: IsPropertyKey(P) is true.
 * 2. Let O be ToObject(V).
 * 3. ReturnIfAbrupt(O).
 * 4. Return O.[[Get]](P, V).
 */

module.exports = function GetV(V, P) {
	// 7.3.2.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.2.2-3
	var O = ToObject(V);

	// 7.3.2.4
	return O[P];
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var has = require('has');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty

module.exports = function HasOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return has(O, P);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty

module.exports = function HasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return mod($floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-instanceofoperator

module.exports = function InstanceofOperator(O, C) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
	if (typeof instOfHandler !== 'undefined') {
		return ToBoolean(Call(instOfHandler, C, [O]));
	}
	if (!IsCallable(C)) {
		throw new $TypeError('`C` is not Callable');
	}
	return OrdinaryHasInstance(C, O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $arraySlice = require('../helpers/callBound')('Array.prototype.slice');

var Call = require('./Call');
var GetV = require('./GetV');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-invoke

module.exports = function Invoke(O, P) {
	if (!IsPropertyKey(P)) {
		throw new $TypeError('P must be a Property Key');
	}
	var argumentsList = $arraySlice(arguments, 2);
	var func = GetV(O, P);
	return Call(func, O, argumentsList);
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Array = GetIntrinsic('%Array%');

// eslint-disable-next-line global-require
var toStr = !$Array.isArray && require('../helpers/callBound')('Object.prototype.toString');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isarray

module.exports = $Array.isArray || function IsArray(argument) {
	return toStr(argument) === '[object Array]';
};
'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable

module.exports = function IsConcatSpreadable(O) {
	if (Type(O) !== 'Object') {
		return false;
	}
	if ($isConcatSpreadable) {
		var spreadable = Get(O, $isConcatSpreadable);
		if (typeof spreadable !== 'undefined') {
			return ToBoolean(spreadable);
		}
	}
	return IsArray(O);
};
'use strict';

// https://www.ecma-international.org/ecma-262/6.0/#sec-isconstructor

module.exports = function IsConstructor(argument) {
	return typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument`
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Object = GetIntrinsic('%Object%');

var isPrimitive = require('../helpers/isPrimitive');

var $preventExtensions = $Object.preventExtensions;
var $isExtensible = $Object.isExtensible;

// https://www.ecma-international.org/ecma-262/6.0/#sec-isextensible-o

module.exports = $preventExtensions
	? function IsExtensible(obj) {
		return !isPrimitive(obj) && $isExtensible(obj);
	}
	: function IsExtensible(obj) {
		return !isPrimitive(obj);
	};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var $floor = $Math.floor;
var $abs = $Math.abs;

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isinteger

module.exports = function IsInteger(argument) {
	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
		return false;
	}
	var abs = $abs(argument);
	return $floor(abs) === abs;
};
'use strict';

var callBound = require('../helpers/callBound');

var $PromiseThen = callBound('Promise.prototype.then', true);

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ispromise

module.exports = function IsPromise(x) {
	if (Type(x) !== 'Object') {
		return false;
	}
	if (!$PromiseThen) { // Promises are not supported
		return false;
	}
	try {
		$PromiseThen(x); // throws if not a promise
	} catch (e) {
		return false;
	}
	return true;
};
'use strict';

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var Type = require('./Type');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');

// https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type

module.exports = function IsPropertyDescriptor(Desc) {
	return isPropertyDescriptor({
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor,
		Type: Type
	}, Desc);
};
'use strict';

// https://www.ecma-international.org/ecma-262/6.0/#sec-ispropertykey

module.exports = function IsPropertyKey(argument) {
	return typeof argument === 'string' || typeof argument === 'symbol';
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $match = GetIntrinsic('%Symbol.match%', true);

var hasRegExpMatcher = require('is-regex');

var ToBoolean = require('./ToBoolean');

// https://ecma-international.org/ecma-262/6.0/#sec-isregexp

module.exports = function IsRegExp(argument) {
	if (!argument || typeof argument !== 'object') {
		return false;
	}
	if ($match) {
		var isRegExp = argument[$match];
		if (typeof isRegExp !== 'undefined') {
			return ToBoolean(isRegExp);
		}
	}
	return hasRegExpMatcher(argument);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $iterator = GetIntrinsic('%Symbol.iterator%', true);

var callBound = require('../helpers/callBound');

var $arrayJoin = callBound('Array.prototype.join');
var $arrayPush = callBound('Array.prototype.push');
var $stringSlice = callBound('String.prototype.slice');
var $stringSplit = callBound('String.prototype.split');

var AdvanceStringIndex = require('./AdvanceStringIndex');
var GetIterator = require('./GetIterator');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');
var ToObject = require('./ToObject');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/7.0/#sec-iterabletoarraylike

module.exports = function IterableToArrayLike(items) {
	var usingIterator;
	if ($iterator) {
		usingIterator = GetMethod(items, $iterator);
	} else if (IsArray(items)) {
		usingIterator = function () {
			var i = -1;
			var arr = this; // eslint-disable-line no-invalid-this
			return {
				next: function () {
					i += 1;
					return {
						done: i >= arr.length,
						value: arr[i]
					};
				}
			};
		};
	} else if (Type(items) === 'String') {
		usingIterator = function () {
			var i = 0;
			return {
				next: function () {
					var nextIndex = AdvanceStringIndex(items, i, true);
					var value = $arrayJoin($stringSplit($stringSlice(items, i, nextIndex), ''), '');
					i = nextIndex;
					return {
						done: nextIndex > items.length,
						value: value
					};
				}
			};
		};
	}
	if (typeof usingIterator !== 'undefined') {
		var iterator = GetIterator(items, usingIterator);
		var values = [];
		var next = true;
		while (next) {
			next = IteratorStep(iterator);
			if (next) {
				var nextValue = IteratorValue(next);
				$arrayPush(values, nextValue);
			}
		}
		return values;
	}

	return ToObject(items);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose

module.exports = function IteratorClose(iterator, completion) {
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
	}
	if (!IsCallable(completion)) {
		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
	}
	var completionThunk = completion;

	var iteratorReturn = GetMethod(iterator, 'return');

	if (typeof iteratorReturn === 'undefined') {
		return completionThunk();
	}

	var completionRecord;
	try {
		var innerResult = Call(iteratorReturn, iterator, []);
	} catch (e) {
		// if we hit here, then "e" is the innerResult completion that needs re-throwing

		// if the completion is of type "throw", this will throw.
		completionThunk();
		completionThunk = null; // ensure it's not called twice.

		// if not, then return the innerResult completion
		throw e;
	}
	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
	completionThunk = null; // ensure it's not called twice.

	if (Type(innerResult) !== 'Object') {
		throw new $TypeError('iterator .return must return an object');
	}

	return completionRecord;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete

module.exports = function IteratorComplete(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return ToBoolean(Get(iterResult, 'done'));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Invoke = require('./Invoke');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext

module.exports = function IteratorNext(iterator, value) {
	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
	if (Type(result) !== 'Object') {
		throw new $TypeError('iterator next must return an object');
	}
	return result;
};
'use strict';

var IteratorComplete = require('./IteratorComplete');
var IteratorNext = require('./IteratorNext');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep

module.exports = function IteratorStep(iterator) {
	var result = IteratorNext(iterator);
	var done = IteratorComplete(result);
	return done === true ? false : result;
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue

module.exports = function IteratorValue(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return Get(iterResult, 'value');
};

'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');
var $DateUTC = GetIntrinsic('%Date.UTC%');

var mod = require('../helpers/mod');
var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var MonthFromTime = require('./MonthFromTime');
var ToInteger = require('./ToInteger');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToInteger(year);
	var m = ToInteger(month);
	var dt = ToInteger(date);
	var ym = y + $floor(m / 12);
	var mn = mod(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToInteger = require('./ToInteger');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToInteger(hour);
	var m = ToInteger(min);
	var s = ToInteger(sec);
	var milli = ToInteger(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return mod($floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $ObjectCreate = GetIntrinsic('%Object.create%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var Type = require('./Type');

var hasProto = !({ __proto__: null } instanceof Object);

// https://www.ecma-international.org/ecma-262/6.0/#sec-objectcreate

module.exports = function ObjectCreate(proto, internalSlotsList) {
	if (proto !== null && Type(proto) !== 'Object') {
		throw new $TypeError('Assertion failed: `proto` must be null or an object');
	}
	var slots = arguments.length < 2 ? [] : internalSlotsList;
	if (slots.length > 0) {
		throw new $SyntaxError('es-abstract does not yet support internal slots');
	}

	if ($ObjectCreate) {
		return $ObjectCreate(proto);
	}
	if (hasProto) {
		return { __proto__: proto };
	}

	if (proto === null) {
		throw new $SyntaxError('native Object.create support is required to create null objects');
	}
	var T = function T() {};
	T.prototype = proto;
	return new T();
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var SameValue = require('./SameValue');
var Type = require('./Type');
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty

module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!$gOPD) {
		// ES3/IE 8 fallback
		if (IsAccessorDescriptor(Desc)) {
			throw new $SyntaxError('This environment does not support accessor property descriptors.');
		}
		var creatingNormalDataProperty = !(P in O)
			&& Desc['[[Writable]]']
			&& Desc['[[Enumerable]]']
			&& Desc['[[Configurable]]']
			&& '[[Value]]' in Desc;
		var settingExistingDataProperty = (P in O)
			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
			&& '[[Value]]' in Desc;
		if (creatingNormalDataProperty || settingExistingDataProperty) {
			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
			return SameValue(O[P], Desc['[[Value]]']);
		}
		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
	}
	var desc = $gOPD(O, P);
	var current = desc && ToPropertyDescriptor(desc);
	var extensible = IsExtensible(O);
	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var has = require('has');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var IsRegExp = require('./IsRegExp');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty

module.exports = function OrdinaryGetOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!has(O, P)) {
		return void 0;
	}
	if (!$gOPD) {
		// ES3 / IE 8 fallback
		var arrayLength = IsArray(O) && P === 'length';
		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
		return {
			'[[Configurable]]': !(arrayLength || regexLastIndex),
			'[[Enumerable]]': $isEnumerable(O, P),
			'[[Value]]': O[P],
			'[[Writable]]': true
		};
	}
	return ToPropertyDescriptor($gOPD(O, P));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $getProto = require('../helpers/getProto');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/7.0/#sec-ordinarygetprototypeof

module.exports = function OrdinaryGetPrototypeOf(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!$getProto) {
		throw new $TypeError('This environment does not support fetching prototypes.');
	}
	return $getProto(O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance

module.exports = function OrdinaryHasInstance(C, O) {
	if (IsCallable(C) === false) {
		return false;
	}
	if (Type(O) !== 'Object') {
		return false;
	}
	var P = Get(C, 'prototype');
	if (Type(P) !== 'Object') {
		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
	}
	return O instanceof C;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty

module.exports = function OrdinaryHasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $setProto = require('../helpers/setProto');

var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/7.0/#sec-ordinarysetprototypeof

module.exports = function OrdinarySetPrototypeOf(O, V) {
	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
		throw new $TypeError('Assertion failed: V must be Object or Null');
	}
	/*
    var extensible = IsExtensible(O);
    var current = OrdinaryGetPrototypeOf(O);
    if (SameValue(V, current)) {
        return true;
    }
    if (!extensible) {
        return false;
    }
    */
	try {
		$setProto(O, V);
	} catch (e) {
		return false;
	}
	return OrdinaryGetPrototypeOf(O) === V;
	/*
    var p = V;
    var done = false;
    while (!done) {
        if (p === null) {
            done = true;
        } else if (SameValue(p, O)) {
            return false;
        } else {
            if (wat) {
                done = true;
            } else {
                p = p.[[Prototype]];
            }
        }
     }
     O.[[Prototype]] = V;
     return true;
     */
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var regexExec = require('../helpers/callBound')('RegExp.prototype.exec');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec

module.exports = function RegExpExec(R, S) {
	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: `R` must be an Object');
	}
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	var exec = Get(R, 'exec');
	if (IsCallable(exec)) {
		var result = Call(exec, R, [S]);
		if (result === null || Type(result) === 'Object') {
			return result;
		}
		throw new $TypeError('"exec" method must return `null` or an Object');
	}
	return regexExec(R, S);
};
'use strict';

module.exports = require('../5/CheckObjectCoercible');
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');

// https://www.ecma-international.org/ecma-262/7.0/#sec-samevaluenonnumber

module.exports = function SameValueNonNumber(x, y) {
	if (typeof x === 'number' || typeof x !== typeof y) {
		throw new $TypeError('SameValueNonNumber requires two non-number values of the same type.');
	}
	return SameValue(x, y);
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// https://www.ecma-international.org/ecma-262/6.0/#sec-samevaluezero

module.exports = function SameValueZero(x, y) {
	return (x === y) || ($isNaN(x) && $isNaN(y));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return mod($floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw

module.exports = function Set(O, P, V, Throw) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	if (Type(Throw) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
	}
	if (Throw) {
		O[P] = V; // eslint-disable-line no-param-reassign
		return true;
	} else {
		try {
			O[P] = V; // eslint-disable-line no-param-reassign
		} catch (e) {
			return false;
		}
	}
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var has = require('has');

var $TypeError = GetIntrinsic('%TypeError%');

var getSymbolDescription = require('../helpers/getSymbolDescription');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsExtensible = require('./IsExtensible');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname

module.exports = function SetFunctionName(F, name) {
	if (typeof F !== 'function') {
		throw new $TypeError('Assertion failed: `F` must be a function');
	}
	if (!IsExtensible(F) || has(F, 'name')) {
		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
	}
	var nameType = Type(name);
	if (nameType !== 'Symbol' && nameType !== 'String') {
		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
	}
	if (nameType === 'Symbol') {
		var description = getSymbolDescription(name);
		// eslint-disable-next-line no-param-reassign
		name = typeof description === 'undefined' ? '' : '[' + description + ']';
	}
	if (arguments.length > 2) {
		var prefix = arguments[2];
		// eslint-disable-next-line no-param-reassign
		name = prefix + ' ' + name;
	}
	return DefinePropertyOrThrow(F, 'name', {
		'[[Value]]': name,
		'[[Writable]]': false,
		'[[Enumerable]]': false,
		'[[Configurable]]': true
	});
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');
var $preventExtensions = GetIntrinsic('%Object.preventExtensions%');
var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');

var forEach = require('../helpers/forEach');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-setintegritylevel

module.exports = function SetIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	if (!$preventExtensions) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
	}
	var status = $preventExtensions(O);
	if (!status) {
		return false;
	}
	if (!$gOPN) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
	}
	var theKeys = $gOPN(O);
	if (level === 'sealed') {
		forEach(theKeys, function (k) {
			DefinePropertyOrThrow(O, k, { configurable: false });
		});
	} else if (level === 'frozen') {
		forEach(theKeys, function (k) {
			var currentDesc = $gOPD(O, k);
			if (typeof currentDesc !== 'undefined') {
				var desc;
				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
					desc = { configurable: false };
				} else {
					desc = { configurable: false, writable: false };
				}
				DefinePropertyOrThrow(O, k, desc);
			}
		});
	}
	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor

module.exports = function SpeciesConstructor(O, defaultConstructor) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var C = O.constructor;
	if (typeof C === 'undefined') {
		return defaultConstructor;
	}
	if (Type(C) !== 'Object') {
		throw new $TypeError('O.constructor is not an Object');
	}
	var S = $species ? C[$species] : void 0;
	if (S == null) {
		return defaultConstructor;
	}
	if (IsConstructor(S)) {
		return S;
	}
	throw new $TypeError('no constructor found');
};
'use strict';

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $SymbolToString = callBound('Symbol.prototype.toString', true);

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring

module.exports = function SymbolDescriptiveString(sym) {
	if (Type(sym) !== 'Symbol') {
		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
	}
	return $SymbolToString(sym);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
var $TypeError = GetIntrinsic('%TypeError%');

var every = require('../helpers/every');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-testintegritylevel

module.exports = function TestIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	var status = IsExtensible(O);
	if (status) {
		return false;
	}
	var theKeys = $gOPN(O);
	return theKeys.length === 0 || every(theKeys, function (k) {
		var currentDesc = $gOPD(O, k);
		if (typeof currentDesc !== 'undefined') {
			if (currentDesc.configurable) {
				return false;
			}
			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
				return false;
			}
		}
		return true;
	});
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');
var $abs = GetIntrinsic('%Math.abs%');

var $isFinite = require('../helpers/isFinite');

var ToNumber = require('./ToNumber');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || $abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var mod = require('../helpers/mod');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return mod(t, msPerDay);
};

'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Date = GetIntrinsic('%Date%');

var $isNaN = require('../helpers/isNaN');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-todatestring

module.exports = function ToDateString(tv) {
	if (Type(tv) !== 'Number') {
		throw new $TypeError('Assertion failed: `tv` must be a Number');
	}
	if ($isNaN(tv)) {
		return 'Invalid Date';
	}
	return $Date(tv);
};
'use strict';

var ToUint16 = require('./ToUint16');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toint16

module.exports = function ToInt16(argument) {
	var int16bit = ToUint16(argument);
	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
};
'use strict';

var ToNumber = require('./ToNumber');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var ToUint8 = require('./ToUint8');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toint8

module.exports = function ToInt8(argument) {
	var int8bit = ToUint8(argument);
	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
};
'use strict';

var ES5ToInteger = require('../5/ToInteger');

var ToNumber = require('./ToNumber');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tointeger

module.exports = function ToInteger(value) {
	var number = ToNumber(value);
	return ES5ToInteger(number);
};
'use strict';

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var ToInteger = require('./ToInteger');

module.exports = function ToLength(argument) {
	var len = ToInteger(argument);
	if (len <= 0) { return 0; } // includes converting -0 to +0
	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
	return len;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Number = GetIntrinsic('%Number%');
var $RegExp = GetIntrinsic('%RegExp%');
var $parseInteger = GetIntrinsic('%parseInt%');

var callBound = require('../helpers/callBound');
var regexTester = require('../helpers/regexTester');
var isPrimitive = require('../helpers/isPrimitive');

var $strSlice = callBound('String.prototype.slice');
var isBinary = regexTester(/^0b[01]+$/i);
var isOctal = regexTester(/^0o[0-7]+$/i);
var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
var hasNonWS = regexTester(nonWSregex);

// whitespace from: https://es5.github.io/#x15.5.4.20
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
var ws = [
	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
	'\u2029\uFEFF'
].join('');
var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
var $replace = callBound('String.prototype.replace');
var $trim = function (value) {
	return $replace(value, trimRegex, '');
};

var ToPrimitive = require('./ToPrimitive');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tonumber

module.exports = function ToNumber(argument) {
	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (typeof value === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a number');
	}
	if (typeof value === 'string') {
		if (isBinary(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 2));
		} else if (isOctal(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 8));
		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
			return NaN;
		} else {
			var trimmed = $trim(value);
			if (trimmed !== value) {
				return ToNumber(trimmed);
			}
		}
	}
	return $Number(value);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Object = GetIntrinsic('%Object%');

var RequireObjectCoercible = require('./RequireObjectCoercible');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toobject

module.exports = function ToObject(value) {
	RequireObjectCoercible(value);
	return $Object(value);
};
'use strict';

var toPrimitive = require('es-to-primitive/es2015');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive

module.exports = function ToPrimitive(input) {
	if (arguments.length > 1) {
		return toPrimitive(input, arguments[1]);
	}
	return toPrimitive(input);
};
'use strict';

var has = require('has');

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://ecma-international.org/ecma-262/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $String = GetIntrinsic('%String%');

var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');

// https://www.ecma-international.org/ecma-262/6.0/#sec-topropertykey

module.exports = function ToPropertyKey(argument) {
	var key = ToPrimitive(argument, $String);
	return typeof key === 'symbol' ? key : ToString(key);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function ToString(argument) {
	if (typeof argument === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a string');
	}
	return $String(argument);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');
var $mod = require('../helpers/mod');

var $floor = $Math.floor;
var $abs = $Math.abs;

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * $floor($abs(number));
	return $mod(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');
var $mod = require('../helpers/mod');

var $floor = $Math.floor;
var $abs = $Math.abs;

module.exports = function ToUint8(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * $floor($abs(number));
	return $mod(posInt, 0x100);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');

var $floor = $Math.floor;

// https://www.ecma-international.org/ecma-262/6.0/#sec-touint8clamp

module.exports = function ToUint8Clamp(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number <= 0) { return 0; }
	if (number >= 0xFF) { return 0xFF; }
	var f = $floor(argument);
	if (f + 0.5 < number) { return f + 1; }
	if (number < f + 0.5) { return f; }
	if (f % 2 !== 0) { return f + 1; }
	return f;
};
'use strict';

var ES5Type = require('../5/Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function Type(x) {
	if (typeof x === 'symbol') {
		return 'Symbol';
	}
	return ES5Type(x);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');
var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
// https://www.ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor

// eslint-disable-next-line max-lines-per-function, max-statements, max-params
module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
	var oType = Type(O);
	if (oType !== 'Undefined' && oType !== 'Object') {
		throw new $TypeError('Assertion failed: O must be undefined or an Object');
	}
	if (Type(extensible) !== 'Boolean') {
		throw new $TypeError('Assertion failed: extensible must be a Boolean');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, current)) {
		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
	}
	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
	}
	if (Type(current) === 'Undefined') {
		if (!extensible) {
			return false;
		}
		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': Desc['[[Configurable]]'],
						'[[Enumerable]]': Desc['[[Enumerable]]'],
						'[[Value]]': Desc['[[Value]]'],
						'[[Writable]]': Desc['[[Writable]]']
					}
				);
			}
		} else {
			if (!IsAccessorDescriptor(Desc)) {
				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
			}
			if (oType !== 'Undefined') {
				return DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					Desc
				);
			}
		}
		return true;
	}
	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
		return true;
	}
	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
		return true; // removed by ES2017, but should still be correct
	}
	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
	if (!current['[[Configurable]]']) {
		if (Desc['[[Configurable]]']) {
			return false;
		}
		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
			return false;
		}
	}
	if (IsGenericDescriptor(Desc)) {
		// no further validation is required.
	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			return false;
		}
		if (IsDataDescriptor(current)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': current['[[Configurable]]'],
						'[[Enumerable]]': current['[[Enumerable]]'],
						'[[Get]]': undefined
					}
				);
			}
		} else if (oType !== 'Undefined') {
			DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': current['[[Configurable]]'],
					'[[Enumerable]]': current['[[Enumerable]]'],
					'[[Value]]': undefined
				}
			);
		}
	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
				return false;
			}
			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
				return false;
			}
			return true;
		}
	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
				return false;
			}
			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
				return false;
			}
			return true;
		}
	} else {
		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
	}
	if (oType !== 'Undefined') {
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			Desc
		);
	}
	return true;
};
'use strict';

var mod = require('../helpers/mod');

var Day = require('./Day');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return mod(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('../helpers/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var mod = require('../helpers/mod');

// https://ecma-international.org/ecma-262/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var mod = require('../helpers/mod');
var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return mod(t, msPerSecond);
};
'use strict';

var $BooleanValueOf = require('../helpers/callBound')('Boolean.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object

module.exports = function thisBooleanValue(value) {
	if (Type(value) === 'Boolean') {
		return value;
	}

	return $BooleanValueOf(value);
};
'use strict';

var callBound = require('../helpers/callBound');

var Type = require('./Type');

var $NumberValueOf = callBound('Number.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object

module.exports = function thisNumberValue(value) {
	if (Type(value) === 'Number') {
		return value;
	}

	return $NumberValueOf(value);
};

'use strict';

var $StringValueOf = require('../helpers/callBound')('String.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object

module.exports = function thisStringValue(value) {
	if (Type(value) === 'String') {
		return value;
	}

	return $StringValueOf(value);
};
'use strict';

var $DateValueOf = require('../helpers/callBound')('Date.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object

module.exports = function thisTimeValue(value) {
	return $DateValueOf(value);
};
'use strict';

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return x === y; // ES6+ specified this shortcut anyways.
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	return false;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var isPrefixOf = require('../helpers/isPrefixOf');

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5

// eslint-disable-next-line max-statements
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
	if (!bothStrings) {
		var nx = ToNumber(px);
		var ny = ToNumber(py);
		if ($isNaN(nx) || $isNaN(ny)) {
			return undefined;
		}
		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
			return false;
		}
		if (nx === 0 && ny === 0) {
			return false;
		}
		if (nx === Infinity) {
			return false;
		}
		if (ny === Infinity) {
			return true;
		}
		if (ny === -Infinity) {
			return false;
		}
		if (nx === -Infinity) {
			return true;
		}
		return nx < ny; // by now, these are both nonzero, finite, and not equal
	}
	if (isPrefixOf(py, px)) {
		return false;
	}
	if (isPrefixOf(px, py)) {
		return true;
	}
	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var $TypeError = GetIntrinsic('%TypeError%');

var $charCodeAt = require('../helpers/callBound')('String.prototype.charCodeAt');

// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex

module.exports = function AdvanceStringIndex(S, index, unicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
	}
	if (Type(unicode) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
	}
	if (!unicode) {
		return index + 1;
	}
	var length = S.length;
	if ((index + 1) >= length) {
		return index + 1;
	}

	var first = $charCodeAt(S, index);
	if (first < 0xD800 || first > 0xDBFF) {
		return index + 1;
	}

	var second = $charCodeAt(S, index + 1);
	if (second < 0xDC00 || second > 0xDFFF) {
		return index + 1;
	}

	return index + 2;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayPrototype
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);

// https://www.ecma-international.org/ecma-262/6.0/#sec-arraycreate

module.exports = function ArrayCreate(length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
	}
	if (length > MAX_ARRAY_LENGTH) {
		throw new $RangeError('length is greater than (2**32 - 1)');
	}
	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
	var A = []; // steps 5 - 7, and 9
	if (proto !== $ArrayPrototype) { // step 8
		if (!$setProto) {
			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
		$setProto(A, proto);
	}
	if (length !== 0) { // bypasses the need for step 2
		A.length = length;
	}
	/* step 10, the above as a shortcut for the below
    OrdinaryDefineOwnProperty(A, 'length', {
        '[[Configurable]]': false,
        '[[Enumerable]]': false,
        '[[Value]]': length,
        '[[Writable]]': true
    });
    */
	return A;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var assign = require('object.assign');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsArray = require('./IsArray');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-arraysetlength

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function ArraySetLength(A, Desc) {
	if (!IsArray(A)) {
		throw new $TypeError('Assertion failed: A must be an Array');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!('[[Value]]' in Desc)) {
		return OrdinaryDefineOwnProperty(A, 'length', Desc);
	}
	var newLenDesc = assign({}, Desc);
	var newLen = ToUint32(Desc['[[Value]]']);
	var numberLen = ToNumber(Desc['[[Value]]']);
	if (newLen !== numberLen) {
		throw new $RangeError('Invalid array length');
	}
	newLenDesc['[[Value]]'] = newLen;
	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
	if (!IsDataDescriptor(oldLenDesc)) {
		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
	}
	var oldLen = oldLenDesc['[[Value]]'];
	if (newLen >= oldLen) {
		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	}
	if (!oldLenDesc['[[Writable]]']) {
		return false;
	}
	var newWritable;
	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
		newWritable = true;
	} else {
		newWritable = false;
		newLenDesc['[[Writable]]'] = true;
	}
	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	if (!succeeded) {
		return false;
	}
	while (newLen < oldLen) {
		oldLen -= 1;
		// eslint-disable-next-line no-param-reassign
		var deleteSucceeded = delete A[ToString(oldLen)];
		if (!deleteSucceeded) {
			newLenDesc['[[Value]]'] = oldLen + 1;
			if (!newWritable) {
				newLenDesc['[[Writable]]'] = false;
				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
				return false;
			}
		}
	}
	if (!newWritable) {
		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
	}
	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Array = GetIntrinsic('%Array%');
var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsConstructor = require('./IsConstructor');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate

module.exports = function ArraySpeciesCreate(originalArray, length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: length must be an integer >= 0');
	}
	var len = length === 0 ? 0 : length;
	var C;
	var isArray = IsArray(originalArray);
	if (isArray) {
		C = Get(originalArray, 'constructor');
		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
		// if (IsConstructor(C)) {
		// 	if C is another realm's Array, C = undefined
		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
		// }
		if ($species && Type(C) === 'Object') {
			C = Get(C, $species);
			if (C === null) {
				C = void 0;
			}
		}
	}
	if (typeof C === 'undefined') {
		return $Array(len);
	}
	if (!IsConstructor(C)) {
		throw new $TypeError('C must be a constructor');
	}
	return new C(len); // Construct(C, len);
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsCallable = require('./IsCallable');

// https://www.ecma-international.org/ecma-262/6.0/#sec-call

module.exports = function Call(F, V) {
	var args = arguments.length > 2 ? arguments[2] : [];
	if (!IsCallable(F)) {
		throw new $TypeError(inspect(F) + ' is not a function');
	}
	return F.apply(V, args);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring

module.exports = function CanonicalNumericIndexString(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Assertion failed: `argument` must be a String');
	}
	if (argument === '-0') { return -0; }
	var n = ToNumber(argument);
	if (SameValue(ToString(n), argument)) { return n; }
	return void 0;
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor

module.exports = function CompletePropertyDescriptor(Desc) {
	/* eslint no-param-reassign: 0 */
	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
		if (!has(Desc, '[[Value]]')) {
			Desc['[[Value]]'] = void 0;
		}
		if (!has(Desc, '[[Writable]]')) {
			Desc['[[Writable]]'] = false;
		}
	} else {
		if (!has(Desc, '[[Get]]')) {
			Desc['[[Get]]'] = void 0;
		}
		if (!has(Desc, '[[Set]]')) {
			Desc['[[Set]]'] = void 0;
		}
	}
	if (!has(Desc, '[[Enumerable]]')) {
		Desc['[[Enumerable]]'] = false;
	}
	if (!has(Desc, '[[Configurable]]')) {
		Desc['[[Configurable]]'] = false;
	}
	return Desc;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createdataproperty

module.exports = function CreateDataProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var oldDesc = OrdinaryGetOwnProperty(O, P);
	var extensible = oldDesc || IsExtensible(O);
	var immutable = oldDesc && (!oldDesc.writable || !oldDesc.configurable);
	if (immutable || !extensible) {
		return false;
	}
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		{
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Value]]': V,
			'[[Writable]]': true
		}
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateDataProperty = require('./CreateDataProperty');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow

module.exports = function CreateDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var success = CreateDataProperty(O, P, V);
	if (!success) {
		throw new $TypeError('unable to create data property');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $replace = callBound('String.prototype.replace');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createhtml

module.exports = function CreateHTML(string, tag, attribute, value) {
	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
	}
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var p1 = '<' + tag;
	if (attribute !== '') {
		var V = ToString(value);
		var escapedV = $replace(V, /\x22/g, '&quot;');
		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
	}
	return p1 + '>' + S + '</' + tag + '>';
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject

module.exports = function CreateIterResultObject(value, done) {
	if (Type(done) !== 'Boolean') {
		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
	}
	return {
		value: value,
		done: done
	};
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var callBound = require('../helpers/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
var $push = callBound('Array.prototype.push');

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToLength = require('./ToLength');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
module.exports = function CreateListFromArrayLike(obj) {
	var elementTypes = arguments.length > 1
		? arguments[1]
		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];

	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	if (!IsArray(elementTypes)) {
		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
	}
	var len = ToLength(Get(obj, 'length'));
	var list = [];
	var index = 0;
	while (index < len) {
		var indexName = ToString(index);
		var next = Get(obj, indexName);
		var nextType = Type(next);
		if ($indexOf(elementTypes, nextType) < 0) {
			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
		}
		$push(list, next);
		index += 1;
	}
	return list;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-createmethodproperty

module.exports = function CreateMethodProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		newDesc
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return $floor(t / msPerDay);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + $floor((y - 1969) / 4) - $floor((y - 1901) / 100) + $floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var mod = require('../helpers/mod');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (mod(y, 4) !== 0) {
		return 365;
	}
	if (mod(y, 100) !== 0) {
		return 366;
	}
	if (mod(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow

module.exports = function DefinePropertyOrThrow(O, P, desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var Desc = isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, desc) ? desc : ToPropertyDescriptor(desc);
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
	}

	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		Desc
	);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow

module.exports = function DeletePropertyOrThrow(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// eslint-disable-next-line no-param-reassign
	var success = delete O[P];
	if (!success) {
		throw new $TypeError('Attempt to delete property failed.');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var keys = require('object-keys');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-enumerableownnames

module.exports = function EnumerableOwnNames(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	return keys(O);
};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return Desc;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	var obj = {};
	if ('[[Value]]' in Desc) {
		obj.value = Desc['[[Value]]'];
	}
	if ('[[Writable]]' in Desc) {
		obj.writable = Desc['[[Writable]]'];
	}
	if ('[[Get]]' in Desc) {
		obj.get = Desc['[[Get]]'];
	}
	if ('[[Set]]' in Desc) {
		obj.set = Desc['[[Set]]'];
	}
	if ('[[Enumerable]]' in Desc) {
		obj.enumerable = Desc['[[Enumerable]]'];
	}
	if ('[[Configurable]]' in Desc) {
		obj.configurable = Desc['[[Configurable]]'];
	}
	return obj;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

/**
 * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
 * 1. Assert: Type(O) is Object.
 * 2. Assert: IsPropertyKey(P) is true.
 * 3. Return O.[[Get]](P, O).
 */

module.exports = function Get(O, P) {
	// 7.3.1.1
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	// 7.3.1.2
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
	}
	// 7.3.1.3
	return O[P];
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getiterator

module.exports = function GetIterator(obj, method) {
	var actualMethod = method;
	if (arguments.length < 2) {
		actualMethod = getIteratorMethod(
			{
				AdvanceStringIndex: AdvanceStringIndex,
				GetMethod: GetMethod,
				IsArray: IsArray,
				Type: Type
			},
			obj
		);
	}
	var iterator = Call(actualMethod, obj);
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('iterator must return an object');
	}

	return iterator;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var GetV = require('./GetV');
var IsCallable = require('./IsCallable');
var IsPropertyKey = require('./IsPropertyKey');

/**
 * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
 * 1. Assert: IsPropertyKey(P) is true.
 * 2. Let func be GetV(O, P).
 * 3. ReturnIfAbrupt(func).
 * 4. If func is either undefined or null, return undefined.
 * 5. If IsCallable(func) is false, throw a TypeError exception.
 * 6. Return func.
 */

module.exports = function GetMethod(O, P) {
	// 7.3.9.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.9.2
	var func = GetV(O, P);

	// 7.3.9.4
	if (func == null) {
		return void 0;
	}

	// 7.3.9.5
	if (!IsCallable(func)) {
		throw new $TypeError(P + 'is not a function');
	}

	// 7.3.9.6
	return func;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');

var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%');
var keys = require('object-keys');

var esType = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys

module.exports = function GetOwnPropertyKeys(O, Type) {
	if (esType(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (Type === 'Symbol') {
		return $gOPS ? $gOPS(O) : [];
	}
	if (Type === 'String') {
		if (!$gOPN) {
			return keys(O);
		}
		return $gOPN(O);
	}
	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Function = GetIntrinsic('%Function%');
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor

module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	if (!IsConstructor(constructor)) {
		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
	}
	var proto = Get(constructor, 'prototype');
	if (Type(proto) !== 'Object') {
		if (!(constructor instanceof $Function)) {
			// ignore other realms, for now
			throw new $TypeError('cross-realm constructors not currently supported');
		}
		proto = intrinsic;
	}
	return proto;
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $parseInt = GetIntrinsic('%parseInt%');

var inspect = require('object-inspect');

var regexTester = require('../helpers/regexTester');
var callBound = require('../helpers/callBound');
var every = require('../helpers/every');

var isDigit = regexTester(/^[0-9]$/);

var $charAt = callBound('String.prototype.charAt');
var $strSlice = callBound('String.prototype.slice');

var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false

var isStringOrHole = function (capture, index, arr) {
	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
};

// https://www.ecma-international.org/ecma-262/6.0/#sec-getsubstitution

// eslint-disable-next-line max-statements, max-params, max-lines-per-function
module.exports = function GetSubstitution(matched, str, position, captures, replacement) {
	if (Type(matched) !== 'String') {
		throw new $TypeError('Assertion failed: `matched` must be a String');
	}
	var matchLength = matched.length;

	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `str` must be a String');
	}
	var stringLength = str.length;

	if (!IsInteger(position) || position < 0 || position > stringLength) {
		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
	}

	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
	}

	if (Type(replacement) !== 'String') {
		throw new $TypeError('Assertion failed: `replacement` must be a String');
	}

	var tailPos = position + matchLength;
	var m = captures.length;

	var result = '';
	for (var i = 0; i < replacement.length; i += 1) {
		// if this is a $, and it's not the end of the replacement
		var current = $charAt(replacement, i);
		var isLast = (i + 1) >= replacement.length;
		var nextIsLast = (i + 2) >= replacement.length;
		if (current === '$' && !isLast) {
			var next = $charAt(replacement, i + 1);
			if (next === '$') {
				result += '$';
				i += 1;
			} else if (next === '&') {
				result += matched;
				i += 1;
			} else if (next === '`') {
				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
				i += 1;
			} else if (next === "'") {
				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
				i += 1;
			} else {
				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
					// $1 through $9, and not followed by a digit
					var n = $parseInt(next, 10);
					// if (n > m, impl-defined)
					result += (n <= m && Type(captures[n - 1]) === 'Undefined') ? '' : captures[n - 1];
					i += 1;
				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
					// $00 through $99
					var nn = next + nextNext;
					var nnI = $parseInt(nn, 10) - 1;
					// if nn === '00' or nn > m, impl-defined
					result += (nn <= m && Type(captures[nnI]) === 'Undefined') ? '' : captures[nnI];
					i += 2;
				} else {
					result += '$';
				}
			}
		} else {
			// the final $, or else not a $
			result += $charAt(replacement, i);
		}
	}
	return result;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var ToObject = require('./ToObject');

/**
 * 7.3.2 GetV (V, P)
 * 1. Assert: IsPropertyKey(P) is true.
 * 2. Let O be ToObject(V).
 * 3. ReturnIfAbrupt(O).
 * 4. Return O.[[Get]](P, V).
 */

module.exports = function GetV(V, P) {
	// 7.3.2.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.2.2-3
	var O = ToObject(V);

	// 7.3.2.4
	return O[P];
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var has = require('has');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty

module.exports = function HasOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return has(O, P);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty

module.exports = function HasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return mod($floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-instanceofoperator

module.exports = function InstanceofOperator(O, C) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
	if (typeof instOfHandler !== 'undefined') {
		return ToBoolean(Call(instOfHandler, C, [O]));
	}
	if (!IsCallable(C)) {
		throw new $TypeError('`C` is not Callable');
	}
	return OrdinaryHasInstance(C, O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $arraySlice = require('../helpers/callBound')('Array.prototype.slice');

var Call = require('./Call');
var GetV = require('./GetV');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-invoke

module.exports = function Invoke(O, P) {
	if (!IsPropertyKey(P)) {
		throw new $TypeError('P must be a Property Key');
	}
	var argumentsList = $arraySlice(arguments, 2);
	var func = GetV(O, P);
	return Call(func, O, argumentsList);
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Array = GetIntrinsic('%Array%');

// eslint-disable-next-line global-require
var toStr = !$Array.isArray && require('../helpers/callBound')('Object.prototype.toString');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isarray

module.exports = $Array.isArray || function IsArray(argument) {
	return toStr(argument) === '[object Array]';
};
'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable

module.exports = function IsConcatSpreadable(O) {
	if (Type(O) !== 'Object') {
		return false;
	}
	if ($isConcatSpreadable) {
		var spreadable = Get(O, $isConcatSpreadable);
		if (typeof spreadable !== 'undefined') {
			return ToBoolean(spreadable);
		}
	}
	return IsArray(O);
};
'use strict';

// https://www.ecma-international.org/ecma-262/6.0/#sec-isconstructor

module.exports = function IsConstructor(argument) {
	return typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument`
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Object = GetIntrinsic('%Object%');

var isPrimitive = require('../helpers/isPrimitive');

var $preventExtensions = $Object.preventExtensions;
var $isExtensible = $Object.isExtensible;

// https://www.ecma-international.org/ecma-262/6.0/#sec-isextensible-o

module.exports = $preventExtensions
	? function IsExtensible(obj) {
		return !isPrimitive(obj) && $isExtensible(obj);
	}
	: function IsExtensible(obj) {
		return !isPrimitive(obj);
	};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var $floor = $Math.floor;
var $abs = $Math.abs;

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

// https://www.ecma-international.org/ecma-262/6.0/#sec-isinteger

module.exports = function IsInteger(argument) {
	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
		return false;
	}
	var abs = $abs(argument);
	return $floor(abs) === abs;
};
'use strict';

var callBound = require('../helpers/callBound');

var $PromiseThen = callBound('Promise.prototype.then', true);

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ispromise

module.exports = function IsPromise(x) {
	if (Type(x) !== 'Object') {
		return false;
	}
	if (!$PromiseThen) { // Promises are not supported
		return false;
	}
	try {
		$PromiseThen(x); // throws if not a promise
	} catch (e) {
		return false;
	}
	return true;
};
'use strict';

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var Type = require('./Type');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');

// https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type

module.exports = function IsPropertyDescriptor(Desc) {
	return isPropertyDescriptor({
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor,
		Type: Type
	}, Desc);
};
'use strict';

// https://www.ecma-international.org/ecma-262/6.0/#sec-ispropertykey

module.exports = function IsPropertyKey(argument) {
	return typeof argument === 'string' || typeof argument === 'symbol';
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $match = GetIntrinsic('%Symbol.match%', true);

var hasRegExpMatcher = require('is-regex');

var ToBoolean = require('./ToBoolean');

// https://ecma-international.org/ecma-262/6.0/#sec-isregexp

module.exports = function IsRegExp(argument) {
	if (!argument || typeof argument !== 'object') {
		return false;
	}
	if ($match) {
		var isRegExp = argument[$match];
		if (typeof isRegExp !== 'undefined') {
			return ToBoolean(isRegExp);
		}
	}
	return hasRegExpMatcher(argument);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose

module.exports = function IteratorClose(iterator, completion) {
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
	}
	if (!IsCallable(completion)) {
		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
	}
	var completionThunk = completion;

	var iteratorReturn = GetMethod(iterator, 'return');

	if (typeof iteratorReturn === 'undefined') {
		return completionThunk();
	}

	var completionRecord;
	try {
		var innerResult = Call(iteratorReturn, iterator, []);
	} catch (e) {
		// if we hit here, then "e" is the innerResult completion that needs re-throwing

		// if the completion is of type "throw", this will throw.
		completionThunk();
		completionThunk = null; // ensure it's not called twice.

		// if not, then return the innerResult completion
		throw e;
	}
	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
	completionThunk = null; // ensure it's not called twice.

	if (Type(innerResult) !== 'Object') {
		throw new $TypeError('iterator .return must return an object');
	}

	return completionRecord;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete

module.exports = function IteratorComplete(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return ToBoolean(Get(iterResult, 'done'));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Invoke = require('./Invoke');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext

module.exports = function IteratorNext(iterator, value) {
	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
	if (Type(result) !== 'Object') {
		throw new $TypeError('iterator next must return an object');
	}
	return result;
};
'use strict';

var IteratorComplete = require('./IteratorComplete');
var IteratorNext = require('./IteratorNext');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep

module.exports = function IteratorStep(iterator) {
	var result = IteratorNext(iterator);
	var done = IteratorComplete(result);
	return done === true ? false : result;
};

'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue

module.exports = function IteratorValue(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return Get(iterResult, 'value');
};

'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');
var $DateUTC = GetIntrinsic('%Date.UTC%');

var mod = require('../helpers/mod');
var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var MonthFromTime = require('./MonthFromTime');
var ToInteger = require('./ToInteger');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToInteger(year);
	var m = ToInteger(month);
	var dt = ToInteger(date);
	var ym = y + $floor(m / 12);
	var mn = mod(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToInteger = require('./ToInteger');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToInteger(hour);
	var m = ToInteger(min);
	var s = ToInteger(sec);
	var milli = ToInteger(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return mod($floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $ObjectCreate = GetIntrinsic('%Object.create%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var Type = require('./Type');

var hasProto = !({ __proto__: null } instanceof Object);

// https://www.ecma-international.org/ecma-262/6.0/#sec-objectcreate

module.exports = function ObjectCreate(proto, internalSlotsList) {
	if (proto !== null && Type(proto) !== 'Object') {
		throw new $TypeError('Assertion failed: `proto` must be null or an object');
	}
	var slots = arguments.length < 2 ? [] : internalSlotsList;
	if (slots.length > 0) {
		throw new $SyntaxError('es-abstract does not yet support internal slots');
	}

	if ($ObjectCreate) {
		return $ObjectCreate(proto);
	}
	if (hasProto) {
		return { __proto__: proto };
	}

	if (proto === null) {
		throw new $SyntaxError('native Object.create support is required to create null objects');
	}
	var T = function T() {};
	T.prototype = proto;
	return new T();
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var SameValue = require('./SameValue');
var Type = require('./Type');
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty

module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!$gOPD) {
		// ES3/IE 8 fallback
		if (IsAccessorDescriptor(Desc)) {
			throw new $SyntaxError('This environment does not support accessor property descriptors.');
		}
		var creatingNormalDataProperty = !(P in O)
			&& Desc['[[Writable]]']
			&& Desc['[[Enumerable]]']
			&& Desc['[[Configurable]]']
			&& '[[Value]]' in Desc;
		var settingExistingDataProperty = (P in O)
			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
			&& '[[Value]]' in Desc;
		if (creatingNormalDataProperty || settingExistingDataProperty) {
			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
			return SameValue(O[P], Desc['[[Value]]']);
		}
		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
	}
	var desc = $gOPD(O, P);
	var current = desc && ToPropertyDescriptor(desc);
	var extensible = IsExtensible(O);
	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var has = require('has');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var IsRegExp = require('./IsRegExp');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty

module.exports = function OrdinaryGetOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!has(O, P)) {
		return void 0;
	}
	if (!$gOPD) {
		// ES3 / IE 8 fallback
		var arrayLength = IsArray(O) && P === 'length';
		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
		return {
			'[[Configurable]]': !(arrayLength || regexLastIndex),
			'[[Enumerable]]': $isEnumerable(O, P),
			'[[Value]]': O[P],
			'[[Writable]]': true
		};
	}
	return ToPropertyDescriptor($gOPD(O, P));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance

module.exports = function OrdinaryHasInstance(C, O) {
	if (IsCallable(C) === false) {
		return false;
	}
	if (Type(O) !== 'Object') {
		return false;
	}
	var P = Get(C, 'prototype');
	if (Type(P) !== 'Object') {
		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
	}
	return O instanceof C;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty

module.exports = function OrdinaryHasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var regexExec = require('../helpers/callBound')('RegExp.prototype.exec');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec

module.exports = function RegExpExec(R, S) {
	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: `R` must be an Object');
	}
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	var exec = Get(R, 'exec');
	if (IsCallable(exec)) {
		var result = Call(exec, R, [S]);
		if (result === null || Type(result) === 'Object') {
			return result;
		}
		throw new $TypeError('"exec" method must return `null` or an Object');
	}
	return regexExec(R, S);
};
'use strict';

module.exports = require('../5/CheckObjectCoercible');
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// https://www.ecma-international.org/ecma-262/6.0/#sec-samevaluezero

module.exports = function SameValueZero(x, y) {
	return (x === y) || ($isNaN(x) && $isNaN(y));
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $floor = GetIntrinsic('%Math.floor%');

var mod = require('../helpers/mod');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return mod($floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw

module.exports = function Set(O, P, V, Throw) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	if (Type(Throw) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
	}
	if (Throw) {
		O[P] = V; // eslint-disable-line no-param-reassign
		return true;
	} else {
		try {
			O[P] = V; // eslint-disable-line no-param-reassign
		} catch (e) {
			return false;
		}
	}
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var has = require('has');

var $TypeError = GetIntrinsic('%TypeError%');

var getSymbolDescription = require('../helpers/getSymbolDescription');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsExtensible = require('./IsExtensible');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname

module.exports = function SetFunctionName(F, name) {
	if (typeof F !== 'function') {
		throw new $TypeError('Assertion failed: `F` must be a function');
	}
	if (!IsExtensible(F) || has(F, 'name')) {
		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
	}
	var nameType = Type(name);
	if (nameType !== 'Symbol' && nameType !== 'String') {
		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
	}
	if (nameType === 'Symbol') {
		var description = getSymbolDescription(name);
		// eslint-disable-next-line no-param-reassign
		name = typeof description === 'undefined' ? '' : '[' + description + ']';
	}
	if (arguments.length > 2) {
		var prefix = arguments[2];
		// eslint-disable-next-line no-param-reassign
		name = prefix + ' ' + name;
	}
	return DefinePropertyOrThrow(F, 'name', {
		'[[Value]]': name,
		'[[Writable]]': false,
		'[[Enumerable]]': false,
		'[[Configurable]]': true
	});
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');
var $preventExtensions = GetIntrinsic('%Object.preventExtensions%');
var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');

var forEach = require('../helpers/forEach');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-setintegritylevel

module.exports = function SetIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	if (!$preventExtensions) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
	}
	var status = $preventExtensions(O);
	if (!status) {
		return false;
	}
	if (!$gOPN) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
	}
	var theKeys = $gOPN(O);
	if (level === 'sealed') {
		forEach(theKeys, function (k) {
			DefinePropertyOrThrow(O, k, { configurable: false });
		});
	} else if (level === 'frozen') {
		forEach(theKeys, function (k) {
			var currentDesc = $gOPD(O, k);
			if (typeof currentDesc !== 'undefined') {
				var desc;
				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
					desc = { configurable: false };
				} else {
					desc = { configurable: false, writable: false };
				}
				DefinePropertyOrThrow(O, k, desc);
			}
		});
	}
	return true;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor

module.exports = function SpeciesConstructor(O, defaultConstructor) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var C = O.constructor;
	if (typeof C === 'undefined') {
		return defaultConstructor;
	}
	if (Type(C) !== 'Object') {
		throw new $TypeError('O.constructor is not an Object');
	}
	var S = $species ? C[$species] : void 0;
	if (S == null) {
		return defaultConstructor;
	}
	if (IsConstructor(S)) {
		return S;
	}
	throw new $TypeError('no constructor found');
};
'use strict';

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('../helpers/callBound');

var $SymbolToString = callBound('Symbol.prototype.toString', true);

var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring

module.exports = function SymbolDescriptiveString(sym) {
	if (Type(sym) !== 'Symbol') {
		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
	}
	return $SymbolToString(sym);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%');
var $TypeError = GetIntrinsic('%TypeError%');

var every = require('../helpers/every');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-testintegritylevel

module.exports = function TestIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	var status = IsExtensible(O);
	if (status) {
		return false;
	}
	var theKeys = $gOPN(O);
	return theKeys.length === 0 || every(theKeys, function (k) {
		var currentDesc = $gOPD(O, k);
		if (typeof currentDesc !== 'undefined') {
			if (currentDesc.configurable) {
				return false;
			}
			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
				return false;
			}
		}
		return true;
	});
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');
var $abs = GetIntrinsic('%Math.abs%');

var $isFinite = require('../helpers/isFinite');

var ToNumber = require('./ToNumber');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || $abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var mod = require('../helpers/mod');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return mod(t, msPerDay);
};

'use strict';

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Date = GetIntrinsic('%Date%');

var $isNaN = require('../helpers/isNaN');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-todatestring

module.exports = function ToDateString(tv) {
	if (Type(tv) !== 'Number') {
		throw new $TypeError('Assertion failed: `tv` must be a Number');
	}
	if ($isNaN(tv)) {
		return 'Invalid Date';
	}
	return $Date(tv);
};
'use strict';

var ToUint16 = require('./ToUint16');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toint16

module.exports = function ToInt16(argument) {
	var int16bit = ToUint16(argument);
	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
};
'use strict';

var ToNumber = require('./ToNumber');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var ToUint8 = require('./ToUint8');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toint8

module.exports = function ToInt8(argument) {
	var int8bit = ToUint8(argument);
	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
};
'use strict';

var ES5ToInteger = require('../5/ToInteger');

var ToNumber = require('./ToNumber');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tointeger

module.exports = function ToInteger(value) {
	var number = ToNumber(value);
	return ES5ToInteger(number);
};
'use strict';

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var ToInteger = require('./ToInteger');

module.exports = function ToLength(argument) {
	var len = ToInteger(argument);
	if (len <= 0) { return 0; } // includes converting -0 to +0
	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
	return len;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Number = GetIntrinsic('%Number%');
var $RegExp = GetIntrinsic('%RegExp%');
var $parseInteger = GetIntrinsic('%parseInt%');

var callBound = require('../helpers/callBound');
var regexTester = require('../helpers/regexTester');
var isPrimitive = require('../helpers/isPrimitive');

var $strSlice = callBound('String.prototype.slice');
var isBinary = regexTester(/^0b[01]+$/i);
var isOctal = regexTester(/^0o[0-7]+$/i);
var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
var hasNonWS = regexTester(nonWSregex);

// whitespace from: https://es5.github.io/#x15.5.4.20
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
var ws = [
	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
	'\u2029\uFEFF'
].join('');
var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
var $replace = callBound('String.prototype.replace');
var $trim = function (value) {
	return $replace(value, trimRegex, '');
};

var ToPrimitive = require('./ToPrimitive');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tonumber

module.exports = function ToNumber(argument) {
	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (typeof value === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a number');
	}
	if (typeof value === 'string') {
		if (isBinary(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 2));
		} else if (isOctal(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 8));
		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
			return NaN;
		} else {
			var trimmed = $trim(value);
			if (trimmed !== value) {
				return ToNumber(trimmed);
			}
		}
	}
	return $Number(value);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Object = GetIntrinsic('%Object%');

var RequireObjectCoercible = require('./RequireObjectCoercible');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toobject

module.exports = function ToObject(value) {
	RequireObjectCoercible(value);
	return $Object(value);
};
'use strict';

var toPrimitive = require('es-to-primitive/es2015');

// https://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive

module.exports = function ToPrimitive(input) {
	if (arguments.length > 1) {
		return toPrimitive(input, arguments[1]);
	}
	return toPrimitive(input);
};
'use strict';

var has = require('has');

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://ecma-international.org/ecma-262/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $String = GetIntrinsic('%String%');

var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');

// https://www.ecma-international.org/ecma-262/6.0/#sec-topropertykey

module.exports = function ToPropertyKey(argument) {
	var key = ToPrimitive(argument, $String);
	return typeof key === 'symbol' ? key : ToString(key);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function ToString(argument) {
	if (typeof argument === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a string');
	}
	return $String(argument);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');
var $mod = require('../helpers/mod');

var $floor = $Math.floor;
var $abs = $Math.abs;

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * $floor($abs(number));
	return $mod(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://www.ecma-international.org/ecma-262/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');
var $mod = require('../helpers/mod');

var $floor = $Math.floor;
var $abs = $Math.abs;

module.exports = function ToUint8(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * $floor($abs(number));
	return $mod(posInt, 0x100);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Math = GetIntrinsic('%Math%');

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');

var $floor = $Math.floor;

// https://www.ecma-international.org/ecma-262/6.0/#sec-touint8clamp

module.exports = function ToUint8Clamp(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number <= 0) { return 0; }
	if (number >= 0xFF) { return 0xFF; }
	var f = $floor(argument);
	if (f + 0.5 < number) { return f + 1; }
	if (number < f + 0.5) { return f; }
	if (f % 2 !== 0) { return f + 1; }
	return f;
};
'use strict';

var ES5Type = require('../5/Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function Type(x) {
	if (typeof x === 'symbol') {
		return 'Symbol';
	}
	return ES5Type(x);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');
var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
// https://www.ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor

// eslint-disable-next-line max-lines-per-function, max-statements, max-params
module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
	var oType = Type(O);
	if (oType !== 'Undefined' && oType !== 'Object') {
		throw new $TypeError('Assertion failed: O must be undefined or an Object');
	}
	if (Type(extensible) !== 'Boolean') {
		throw new $TypeError('Assertion failed: extensible must be a Boolean');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, current)) {
		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
	}
	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
	}
	if (Type(current) === 'Undefined') {
		if (!extensible) {
			return false;
		}
		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': Desc['[[Configurable]]'],
						'[[Enumerable]]': Desc['[[Enumerable]]'],
						'[[Value]]': Desc['[[Value]]'],
						'[[Writable]]': Desc['[[Writable]]']
					}
				);
			}
		} else {
			if (!IsAccessorDescriptor(Desc)) {
				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
			}
			if (oType !== 'Undefined') {
				return DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					Desc
				);
			}
		}
		return true;
	}
	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
		return true;
	}
	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
		return true; // removed by ES2017, but should still be correct
	}
	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
	if (!current['[[Configurable]]']) {
		if (Desc['[[Configurable]]']) {
			return false;
		}
		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
			return false;
		}
	}
	if (IsGenericDescriptor(Desc)) {
		// no further validation is required.
	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			return false;
		}
		if (IsDataDescriptor(current)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': current['[[Configurable]]'],
						'[[Enumerable]]': current['[[Enumerable]]'],
						'[[Get]]': undefined
					}
				);
			}
		} else if (oType !== 'Undefined') {
			DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': current['[[Configurable]]'],
					'[[Enumerable]]': current['[[Enumerable]]'],
					'[[Value]]': undefined
				}
			);
		}
	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
				return false;
			}
			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
				return false;
			}
			return true;
		}
	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
				return false;
			}
			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
				return false;
			}
			return true;
		}
	} else {
		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
	}
	if (oType !== 'Undefined') {
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			Desc
		);
	}
	return true;
};
'use strict';

var mod = require('../helpers/mod');

var Day = require('./Day');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return mod(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('../helpers/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var mod = require('../helpers/mod');

// https://ecma-international.org/ecma-262/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var mod = require('../helpers/mod');
var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return mod(t, msPerSecond);
};
'use strict';

var $BooleanValueOf = require('../helpers/callBound')('Boolean.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object

module.exports = function thisBooleanValue(value) {
	if (Type(value) === 'Boolean') {
		return value;
	}

	return $BooleanValueOf(value);
};
'use strict';

var callBound = require('../helpers/callBound');

var Type = require('./Type');

var $NumberValueOf = callBound('Number.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object

module.exports = function thisNumberValue(value) {
	if (Type(value) === 'Number') {
		return value;
	}

	return $NumberValueOf(value);
};

'use strict';

var $StringValueOf = require('../helpers/callBound')('String.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object

module.exports = function thisStringValue(value) {
	if (Type(value) === 'String') {
		return value;
	}

	return $StringValueOf(value);
};
'use strict';

var $DateValueOf = require('../helpers/callBound')('Date.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object

module.exports = function thisTimeValue(value) {
	return $DateValueOf(value);
};
# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/es-abstract
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with a single custom sponsorship URL
name: Automatic Rebase

on: [pull_request]

jobs:
  _:
    name: "Automatic Rebase"

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - uses: ljharb/rebase@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

# Since we rely on paths relative to the makefile location, abort if make isn't being run from there.
$(if $(findstring /,$(MAKEFILE_LIST)),$(error Please only invoke this makefile from the directory it resides in))

	# The files that need updating when incrementing the version number.
VERSIONED_FILES := *.js *.json README*


# Add the local npm packages' bin folder to the PATH, so that `make` can find them, when invoked directly.
# Note that rather than using `$(npm bin)` the 'node_modules/.bin' path component is hard-coded, so that invocation works even from an environment
# where npm is (temporarily) unavailable due to having deactivated an nvm instance loaded into the calling shell in order to avoid interference with tests.
export PATH := $(shell printf '%s' "$$PWD/node_modules/.bin:$$PATH")
UTILS := semver
# Make sure that all required utilities can be located.
UTIL_CHECK := $(or $(shell PATH="$(PATH)" which $(UTILS) >/dev/null && echo 'ok'),$(error Did you forget to run `npm install` after cloning the repo? At least one of the required supporting utilities not found: $(UTILS)))

# Default target (by virtue of being the first non '.'-prefixed in the file).
.PHONY: _no-target-specified
_no-target-specified:
	$(error Please specify the target to make - `make list` shows targets. Alternatively, use `npm test` to run the default tests; `npm run` shows all tests)

# Lists all targets defined in this makefile.
.PHONY: list
list:
	@$(MAKE) -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | command grep -v -e '^[^[:alnum:]]' -e '^$@$$command ' | sort

# All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS).
.PHONY: test
test:
	@npm test

.PHONY: _ensure-tag
_ensure-tag:
ifndef TAG
	$(error Please invoke with `make TAG=<new-version> release`, where <new-version> is either an increment specifier (patch, minor, major, prepatch, preminor, premajor, prerelease), or an explicit major.minor.patch version number)
endif

CHANGELOG_ERROR = $(error No CHANGELOG specified)
.PHONY: _ensure-changelog
_ensure-changelog:
	@ (git status -sb --porcelain | command grep -E '^( M|[MA] ) CHANGELOG.md' > /dev/null) || (echo no CHANGELOG.md specified && exit 2)

# Ensures that the git workspace is clean.
.PHONY: _ensure-clean
_ensure-clean:
	@[ -z "$$((git status --porcelain --untracked-files=no || echo err) | command grep -v 'CHANGELOG.md')" ] || { echo "Workspace is not clean; please commit changes first." >&2; exit 2; }

# Makes a release; invoke with `make TAG=<versionOrIncrementSpec> release`.
.PHONY: release
release: _ensure-tag _ensure-changelog _ensure-clean
	@old_ver=`git describe --abbrev=0 --tags --match 'v[0-9]*.[0-9]*.[0-9]*'` || { echo "Failed to determine current version." >&2; exit 1; }; old_ver=$${old_ver#v}; \
	 new_ver=`echo "$(TAG)" | sed 's/^v//'`; new_ver=$${new_ver:-patch}; \
	 if printf "$$new_ver" | command grep -q '^[0-9]'; then \
	   semver "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be major.minor.patch' >&2; exit 2; }; \
	   semver -r "> $$old_ver" "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be HIGHER than current one.' >&2; exit 2; } \
	 else \
	   new_ver=`semver -i "$$new_ver" "$$old_ver"` || { echo 'Invalid version-increment specifier: $(TAG)' >&2; exit 2; } \
	 fi; \
	 printf "=== Bumping version **$$old_ver** to **$$new_ver** before committing and tagging:\n=== TYPE 'proceed' TO PROCEED, anything else to abort: " && read response && [ "$$response" = 'proceed' ] || { echo 'Aborted.' >&2; exit 2; };  \
	 replace "$$old_ver" "$$new_ver" -- $(VERSIONED_FILES) && \
	 git commit -m "v$$new_ver" $(VERSIONED_FILES) CHANGELOG.md && \
	 git tag -a -m "v$$new_ver" "v$$new_ver"
'use strict';

var hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';

var isPrimitive = require('./helpers/isPrimitive');
var isCallable = require('is-callable');
var isDate = require('is-date-object');
var isSymbol = require('is-symbol');

var ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {
	if (typeof O === 'undefined' || O === null) {
		throw new TypeError('Cannot call method on ' + O);
	}
	if (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {
		throw new TypeError('hint must be "string" or "number"');
	}
	var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
	var method, result, i;
	for (i = 0; i < methodNames.length; ++i) {
		method = O[methodNames[i]];
		if (isCallable(method)) {
			result = method.call(O);
			if (isPrimitive(result)) {
				return result;
			}
		}
	}
	throw new TypeError('No default value');
};

var GetMethod = function GetMethod(O, P) {
	var func = O[P];
	if (func !== null && typeof func !== 'undefined') {
		if (!isCallable(func)) {
			throw new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');
		}
		return func;
	}
	return void 0;
};

// http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive
module.exports = function ToPrimitive(input) {
	if (isPrimitive(input)) {
		return input;
	}
	var hint = 'default';
	if (arguments.length > 1) {
		if (arguments[1] === String) {
			hint = 'string';
		} else if (arguments[1] === Number) {
			hint = 'number';
		}
	}

	var exoticToPrim;
	if (hasSymbols) {
		if (Symbol.toPrimitive) {
			exoticToPrim = GetMethod(input, Symbol.toPrimitive);
		} else if (isSymbol(input)) {
			exoticToPrim = Symbol.prototype.valueOf;
		}
	}
	if (typeof exoticToPrim !== 'undefined') {
		var result = exoticToPrim.call(input, hint);
		if (isPrimitive(result)) {
			return result;
		}
		throw new TypeError('unable to convert exotic object to primitive');
	}
	if (hint === 'default' && (isDate(input) || isSymbol(input))) {
		hint = 'string';
	}
	return ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);
};
'use strict';

var toStr = Object.prototype.toString;

var isPrimitive = require('./helpers/isPrimitive');

var isCallable = require('is-callable');

// http://ecma-international.org/ecma-262/5.1/#sec-8.12.8
var ES5internalSlots = {
	'[[DefaultValue]]': function (O) {
		var actualHint;
		if (arguments.length > 1) {
			actualHint = arguments[1];
		} else {
			actualHint = toStr.call(O) === '[object Date]' ? String : Number;
		}

		if (actualHint === String || actualHint === Number) {
			var methods = actualHint === String ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
			var value, i;
			for (i = 0; i < methods.length; ++i) {
				if (isCallable(O[methods[i]])) {
					value = O[methods[i]]();
					if (isPrimitive(value)) {
						return value;
					}
				}
			}
			throw new TypeError('No default value');
		}
		throw new TypeError('invalid [[DefaultValue]] hint supplied');
	}
};

// http://ecma-international.org/ecma-262/5.1/#sec-9.1
module.exports = function ToPrimitive(input) {
	if (isPrimitive(input)) {
		return input;
	}
	if (arguments.length > 1) {
		return ES5internalSlots['[[DefaultValue]]'](input, arguments[1]);
	}
	return ES5internalSlots['[[DefaultValue]]'](input);
};
'use strict';

module.exports = require('./es2015');
'use strict';

var ES5 = require('./es5');
var ES6 = require('./es6');
var ES2015 = require('./es2015');

if (Object.defineProperty) {
	Object.defineProperty(ES2015, 'ES5', { enumerable: false, value: ES5 });
	Object.defineProperty(ES2015, 'ES6', { enumerable: false, value: ES6 });
	Object.defineProperty(ES2015, 'ES2015', { enumerable: false, value: ES2015 });
} else {
	ES6.ES5 = ES5;
	ES6.ES6 = ES6;
	ES6.ES2015 = ES2015;
}

module.exports = ES2015;
{
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com"
  },
  "dependencies": {
    "is-callable": "^1.1.4",
    "is-date-object": "^1.0.1",
    "is-symbol": "^1.0.2"
  },
  "deprecated": false,
  "description": "ECMAScript â€œToPrimitiveâ€� algorithm. Provides ES5 and ES2015 versions.",
  "devDependencies": {
    "@ljharb/eslint-config": "^15.0.0",
    "covert": "^1.1.1",
    "eslint": "^6.6.0",
    "foreach": "^2.0.5",
    "function.prototype.name": "^1.1.1",
    "has-symbols": "^1.0.0",
    "object-inspect": "^1.6.0",
    "object-is": "^1.0.1",
    "replace": "^1.1.1",
    "semver": "^6.3.0",
    "tape": "^4.11.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/ljharb/es-to-primitive#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "es-to-primitive",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/es-to-primitive.git"
  },
  "testling": {
    "files": "test",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "1.2.1"
}'use strict';

module.exports = function isPrimitive(value) {
	return value === null || (typeof value !== 'function' && typeof value !== 'object');
};
# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/es-to-primitive
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
'use strict';

var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;

module.exports = function (str) {
	if (typeof str !== 'string') {
		throw new TypeError('Expected a string');
	}

	return str.replace(matchOperatorsRe, '\\$&');
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Escape RegExp special characters",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.8.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/escape-string-regexp#readme",
  "license": "MIT",
  "maintainers": [
    {
      "name": "Sindre Sorhus",
      "email": "sindresorhus@gmail.com",
      "url": "sindresorhus.com"
    },
    {
      "name": "Joshua Boy Nicolai Appelman",
      "email": "joshua@jbna.nl",
      "url": "jbna.nl"
    }
  ],
  "name": "escape-string-regexp",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/escape-string-regexp.git"
  },
  "version": "1.0.5"
}Copyright JS Foundation and other contributors, https://js.foundation/

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

  * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
  * Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
  "author": {
    "name": "Ariya Hidayat",
    "email": "ariya.hidayat@gmail.com"
  },
  "bin": {
    "esparse": "bin/esparse.js",
    "esvalidate": "bin/esvalidate.js"
  },
  "deprecated": false,
  "description": "ECMAScript parsing infrastructure for multipurpose analysis",
  "devDependencies": {
    "codecov.io": "~0.1.6",
    "escomplex-js": "1.2.0",
    "everything.js": "~1.0.3",
    "glob": "~7.1.0",
    "istanbul": "~0.4.0",
    "json-diff": "~0.3.1",
    "karma": "~1.3.0",
    "karma-chrome-launcher": "~2.0.0",
    "karma-detect-browsers": "~2.2.3",
    "karma-edge-launcher": "~0.2.0",
    "karma-firefox-launcher": "~1.0.0",
    "karma-ie-launcher": "~1.0.0",
    "karma-mocha": "~1.3.0",
    "karma-safari-launcher": "~1.0.0",
    "karma-safaritechpreview-launcher": "~0.0.4",
    "karma-sauce-launcher": "~1.1.0",
    "lodash": "~3.10.1",
    "mocha": "~3.2.0",
    "node-tick-processor": "~0.0.2",
    "regenerate": "~1.3.2",
    "temp": "~0.8.3",
    "tslint": "~5.1.0",
    "typescript": "~2.3.2",
    "typescript-formatter": "~5.1.3",
    "unicode-8.0.0": "~0.7.0",
    "webpack": "~1.14.0"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "bin",
    "dist/esprima.js"
  ],
  "homepage": "http://esprima.org",
  "license": "BSD-2-Clause",
  "main": "dist/esprima.js",
  "maintainers": [
    {
      "name": "Ariya Hidayat",
      "email": "ariya.hidayat@gmail.com",
      "url": "http://ariya.ofilabs.com"
    }
  ],
  "name": "esprima",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jquery/esprima.git"
  },
  "version": "4.0.1"
}(function webpackUniversalModuleDefinition(root, factory) {
/* istanbul ignore next */
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define([], factory);
/* istanbul ignore next */
	else if(typeof exports === 'object')
		exports["esprima"] = factory();
	else
		root["esprima"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};

/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {

/******/ 		// Check if module is in cache
/* istanbul ignore if */
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;

/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};

/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;

/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}


/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;

/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;

/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";

/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	/*
	  Copyright JS Foundation and other contributors, https://js.foundation/

	  Redistribution and use in source and binary forms, with or without
	  modification, are permitted provided that the following conditions are met:

	    * Redistributions of source code must retain the above copyright
	      notice, this list of conditions and the following disclaimer.
	    * Redistributions in binary form must reproduce the above copyright
	      notice, this list of conditions and the following disclaimer in the
	      documentation and/or other materials provided with the distribution.

	  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
	  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
	  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
	  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
	  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
	  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
	  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
	  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
	  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
	  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
	*/
	Object.defineProperty(exports, "__esModule", { value: true });
	var comment_handler_1 = __webpack_require__(1);
	var jsx_parser_1 = __webpack_require__(3);
	var parser_1 = __webpack_require__(8);
	var tokenizer_1 = __webpack_require__(15);
	function parse(code, options, delegate) {
	    var commentHandler = null;
	    var proxyDelegate = function (node, metadata) {
	        if (delegate) {
	            delegate(node, metadata);
	        }
	        if (commentHandler) {
	            commentHandler.visit(node, metadata);
	        }
	    };
	    var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null;
	    var collectComment = false;
	    if (options) {
	        collectComment = (typeof options.comment === 'boolean' && options.comment);
	        var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment);
	        if (collectComment || attachComment) {
	            commentHandler = new comment_handler_1.CommentHandler();
	            commentHandler.attach = attachComment;
	            options.comment = true;
	            parserDelegate = proxyDelegate;
	        }
	    }
	    var isModule = false;
	    if (options && typeof options.sourceType === 'string') {
	        isModule = (options.sourceType === 'module');
	    }
	    var parser;
	    if (options && typeof options.jsx === 'boolean' && options.jsx) {
	        parser = new jsx_parser_1.JSXParser(code, options, parserDelegate);
	    }
	    else {
	        parser = new parser_1.Parser(code, options, parserDelegate);
	    }
	    var program = isModule ? parser.parseModule() : parser.parseScript();
	    var ast = program;
	    if (collectComment && commentHandler) {
	        ast.comments = commentHandler.comments;
	    }
	    if (parser.config.tokens) {
	        ast.tokens = parser.tokens;
	    }
	    if (parser.config.tolerant) {
	        ast.errors = parser.errorHandler.errors;
	    }
	    return ast;
	}
	exports.parse = parse;
	function parseModule(code, options, delegate) {
	    var parsingOptions = options || {};
	    parsingOptions.sourceType = 'module';
	    return parse(code, parsingOptions, delegate);
	}
	exports.parseModule = parseModule;
	function parseScript(code, options, delegate) {
	    var parsingOptions = options || {};
	    parsingOptions.sourceType = 'script';
	    return parse(code, parsingOptions, delegate);
	}
	exports.parseScript = parseScript;
	function tokenize(code, options, delegate) {
	    var tokenizer = new tokenizer_1.Tokenizer(code, options);
	    var tokens;
	    tokens = [];
	    try {
	        while (true) {
	            var token = tokenizer.getNextToken();
	            if (!token) {
	                break;
	            }
	            if (delegate) {
	                token = delegate(token);
	            }
	            tokens.push(token);
	        }
	    }
	    catch (e) {
	        tokenizer.errorHandler.tolerate(e);
	    }
	    if (tokenizer.errorHandler.tolerant) {
	        tokens.errors = tokenizer.errors();
	    }
	    return tokens;
	}
	exports.tokenize = tokenize;
	var syntax_1 = __webpack_require__(2);
	exports.Syntax = syntax_1.Syntax;
	// Sync with *.json manifests.
	exports.version = '4.0.1';


/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	var syntax_1 = __webpack_require__(2);
	var CommentHandler = (function () {
	    function CommentHandler() {
	        this.attach = false;
	        this.comments = [];
	        this.stack = [];
	        this.leading = [];
	        this.trailing = [];
	    }
	    CommentHandler.prototype.insertInnerComments = function (node, metadata) {
	        //  innnerComments for properties empty block
	        //  `function a() {/** comments **\/}`
	        if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) {
	            var innerComments = [];
	            for (var i = this.leading.length - 1; i >= 0; --i) {
	                var entry = this.leading[i];
	                if (metadata.end.offset >= entry.start) {
	                    innerComments.unshift(entry.comment);
	                    this.leading.splice(i, 1);
	                    this.trailing.splice(i, 1);
	                }
	            }
	            if (innerComments.length) {
	                node.innerComments = innerComments;
	            }
	        }
	    };
	    CommentHandler.prototype.findTrailingComments = function (metadata) {
	        var trailingComments = [];
	        if (this.trailing.length > 0) {
	            for (var i = this.trailing.length - 1; i >= 0; --i) {
	                var entry_1 = this.trailing[i];
	                if (entry_1.start >= metadata.end.offset) {
	                    trailingComments.unshift(entry_1.comment);
	                }
	            }
	            this.trailing.length = 0;
	            return trailingComments;
	        }
	        var entry = this.stack[this.stack.length - 1];
	        if (entry && entry.node.trailingComments) {
	            var firstComment = entry.node.trailingComments[0];
	            if (firstComment && firstComment.range[0] >= metadata.end.offset) {
	                trailingComments = entry.node.trailingComments;
	                delete entry.node.trailingComments;
	            }
	        }
	        return trailingComments;
	    };
	    CommentHandler.prototype.findLeadingComments = function (metadata) {
	        var leadingComments = [];
	        var target;
	        while (this.stack.length > 0) {
	            var entry = this.stack[this.stack.length - 1];
	            if (entry && entry.start >= metadata.start.offset) {
	                target = entry.node;
	                this.stack.pop();
	            }
	            else {
	                break;
	            }
	        }
	        if (target) {
	            var count = target.leadingComments ? target.leadingComments.length : 0;
	            for (var i = count - 1; i >= 0; --i) {
	                var comment = target.leadingComments[i];
	                if (comment.range[1] <= metadata.start.offset) {
	                    leadingComments.unshift(comment);
	                    target.leadingComments.splice(i, 1);
	                }
	            }
	            if (target.leadingComments && target.leadingComments.length === 0) {
	                delete target.leadingComments;
	            }
	            return leadingComments;
	        }
	        for (var i = this.leading.length - 1; i >= 0; --i) {
	            var entry = this.leading[i];
	            if (entry.start <= metadata.start.offset) {
	                leadingComments.unshift(entry.comment);
	                this.leading.splice(i, 1);
	            }
	        }
	        return leadingComments;
	    };
	    CommentHandler.prototype.visitNode = function (node, metadata) {
	        if (node.type === syntax_1.Syntax.Program && node.body.length > 0) {
	            return;
	        }
	        this.insertInnerComments(node, metadata);
	        var trailingComments = this.findTrailingComments(metadata);
	        var leadingComments = this.findLeadingComments(metadata);
	        if (leadingComments.length > 0) {
	            node.leadingComments = leadingComments;
	        }
	        if (trailingComments.length > 0) {
	            node.trailingComments = trailingComments;
	        }
	        this.stack.push({
	            node: node,
	            start: metadata.start.offset
	        });
	    };
	    CommentHandler.prototype.visitComment = function (node, metadata) {
	        var type = (node.type[0] === 'L') ? 'Line' : 'Block';
	        var comment = {
	            type: type,
	            value: node.value
	        };
	        if (node.range) {
	            comment.range = node.range;
	        }
	        if (node.loc) {
	            comment.loc = node.loc;
	        }
	        this.comments.push(comment);
	        if (this.attach) {
	            var entry = {
	                comment: {
	                    type: type,
	                    value: node.value,
	                    range: [metadata.start.offset, metadata.end.offset]
	                },
	                start: metadata.start.offset
	            };
	            if (node.loc) {
	                entry.comment.loc = node.loc;
	            }
	            node.type = type;
	            this.leading.push(entry);
	            this.trailing.push(entry);
	        }
	    };
	    CommentHandler.prototype.visit = function (node, metadata) {
	        if (node.type === 'LineComment') {
	            this.visitComment(node, metadata);
	        }
	        else if (node.type === 'BlockComment') {
	            this.visitComment(node, metadata);
	        }
	        else if (this.attach) {
	            this.visitNode(node, metadata);
	        }
	    };
	    return CommentHandler;
	}());
	exports.CommentHandler = CommentHandler;


/***/ },
/* 2 */
/***/ function(module, exports) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	exports.Syntax = {
	    AssignmentExpression: 'AssignmentExpression',
	    AssignmentPattern: 'AssignmentPattern',
	    ArrayExpression: 'ArrayExpression',
	    ArrayPattern: 'ArrayPattern',
	    ArrowFunctionExpression: 'ArrowFunctionExpression',
	    AwaitExpression: 'AwaitExpression',
	    BlockStatement: 'BlockStatement',
	    BinaryExpression: 'BinaryExpression',
	    BreakStatement: 'BreakStatement',
	    CallExpression: 'CallExpression',
	    CatchClause: 'CatchClause',
	    ClassBody: 'ClassBody',
	    ClassDeclaration: 'ClassDeclaration',
	    ClassExpression: 'ClassExpression',
	    ConditionalExpression: 'ConditionalExpression',
	    ContinueStatement: 'ContinueStatement',
	    DoWhileStatement: 'DoWhileStatement',
	    DebuggerStatement: 'DebuggerStatement',
	    EmptyStatement: 'EmptyStatement',
	    ExportAllDeclaration: 'ExportAllDeclaration',
	    ExportDefaultDeclaration: 'ExportDefaultDeclaration',
	    ExportNamedDeclaration: 'ExportNamedDeclaration',
	    ExportSpecifier: 'ExportSpecifier',
	    ExpressionStatement: 'ExpressionStatement',
	    ForStatement: 'ForStatement',
	    ForOfStatement: 'ForOfStatement',
	    ForInStatement: 'ForInStatement',
	    FunctionDeclaration: 'FunctionDeclaration',
	    FunctionExpression: 'FunctionExpression',
	    Identifier: 'Identifier',
	    IfStatement: 'IfStatement',
	    ImportDeclaration: 'ImportDeclaration',
	    ImportDefaultSpecifier: 'ImportDefaultSpecifier',
	    ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
	    ImportSpecifier: 'ImportSpecifier',
	    Literal: 'Literal',
	    LabeledStatement: 'LabeledStatement',
	    LogicalExpression: 'LogicalExpression',
	    MemberExpression: 'MemberExpression',
	    MetaProperty: 'MetaProperty',
	    MethodDefinition: 'MethodDefinition',
	    NewExpression: 'NewExpression',
	    ObjectExpression: 'ObjectExpression',
	    ObjectPattern: 'ObjectPattern',
	    Program: 'Program',
	    Property: 'Property',
	    RestElement: 'RestElement',
	    ReturnStatement: 'ReturnStatement',
	    SequenceExpression: 'SequenceExpression',
	    SpreadElement: 'SpreadElement',
	    Super: 'Super',
	    SwitchCase: 'SwitchCase',
	    SwitchStatement: 'SwitchStatement',
	    TaggedTemplateExpression: 'TaggedTemplateExpression',
	    TemplateElement: 'TemplateElement',
	    TemplateLiteral: 'TemplateLiteral',
	    ThisExpression: 'ThisExpression',
	    ThrowStatement: 'ThrowStatement',
	    TryStatement: 'TryStatement',
	    UnaryExpression: 'UnaryExpression',
	    UpdateExpression: 'UpdateExpression',
	    VariableDeclaration: 'VariableDeclaration',
	    VariableDeclarator: 'VariableDeclarator',
	    WhileStatement: 'WhileStatement',
	    WithStatement: 'WithStatement',
	    YieldExpression: 'YieldExpression'
	};


/***/ },
/* 3 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
/* istanbul ignore next */
	var __extends = (this && this.__extends) || (function () {
	    var extendStatics = Object.setPrototypeOf ||
	        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
	        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
	    return function (d, b) {
	        extendStatics(d, b);
	        function __() { this.constructor = d; }
	        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
	    };
	})();
	Object.defineProperty(exports, "__esModule", { value: true });
	var character_1 = __webpack_require__(4);
	var JSXNode = __webpack_require__(5);
	var jsx_syntax_1 = __webpack_require__(6);
	var Node = __webpack_require__(7);
	var parser_1 = __webpack_require__(8);
	var token_1 = __webpack_require__(13);
	var xhtml_entities_1 = __webpack_require__(14);
	token_1.TokenName[100 /* Identifier */] = 'JSXIdentifier';
	token_1.TokenName[101 /* Text */] = 'JSXText';
	// Fully qualified element name, e.g. <svg:path> returns "svg:path"
	function getQualifiedElementName(elementName) {
	    var qualifiedName;
	    switch (elementName.type) {
	        case jsx_syntax_1.JSXSyntax.JSXIdentifier:
	            var id = elementName;
	            qualifiedName = id.name;
	            break;
	        case jsx_syntax_1.JSXSyntax.JSXNamespacedName:
	            var ns = elementName;
	            qualifiedName = getQualifiedElementName(ns.namespace) + ':' +
	                getQualifiedElementName(ns.name);
	            break;
	        case jsx_syntax_1.JSXSyntax.JSXMemberExpression:
	            var expr = elementName;
	            qualifiedName = getQualifiedElementName(expr.object) + '.' +
	                getQualifiedElementName(expr.property);
	            break;
	        /* istanbul ignore next */
	        default:
	            break;
	    }
	    return qualifiedName;
	}
	var JSXParser = (function (_super) {
	    __extends(JSXParser, _super);
	    function JSXParser(code, options, delegate) {
	        return _super.call(this, code, options, delegate) || this;
	    }
	    JSXParser.prototype.parsePrimaryExpression = function () {
	        return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this);
	    };
	    JSXParser.prototype.startJSX = function () {
	        // Unwind the scanner before the lookahead token.
	        this.scanner.index = this.startMarker.index;
	        this.scanner.lineNumber = this.startMarker.line;
	        this.scanner.lineStart = this.startMarker.index - this.startMarker.column;
	    };
	    JSXParser.prototype.finishJSX = function () {
	        // Prime the next lookahead.
	        this.nextToken();
	    };
	    JSXParser.prototype.reenterJSX = function () {
	        this.startJSX();
	        this.expectJSX('}');
	        // Pop the closing '}' added from the lookahead.
	        if (this.config.tokens) {
	            this.tokens.pop();
	        }
	    };
	    JSXParser.prototype.createJSXNode = function () {
	        this.collectComments();
	        return {
	            index: this.scanner.index,
	            line: this.scanner.lineNumber,
	            column: this.scanner.index - this.scanner.lineStart
	        };
	    };
	    JSXParser.prototype.createJSXChildNode = function () {
	        return {
	            index: this.scanner.index,
	            line: this.scanner.lineNumber,
	            column: this.scanner.index - this.scanner.lineStart
	        };
	    };
	    JSXParser.prototype.scanXHTMLEntity = function (quote) {
	        var result = '&';
	        var valid = true;
	        var terminated = false;
	        var numeric = false;
	        var hex = false;
	        while (!this.scanner.eof() && valid && !terminated) {
	            var ch = this.scanner.source[this.scanner.index];
	            if (ch === quote) {
	                break;
	            }
	            terminated = (ch === ';');
	            result += ch;
	            ++this.scanner.index;
	            if (!terminated) {
	                switch (result.length) {
	                    case 2:
	                        // e.g. '&#123;'
	                        numeric = (ch === '#');
	                        break;
	                    case 3:
	                        if (numeric) {
	                            // e.g. '&#x41;'
	                            hex = (ch === 'x');
	                            valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0));
	                            numeric = numeric && !hex;
	                        }
	                        break;
	                    default:
	                        valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0)));
	                        valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0)));
	                        break;
	                }
	            }
	        }
	        if (valid && terminated && result.length > 2) {
	            // e.g. '&#x41;' becomes just '#x41'
	            var str = result.substr(1, result.length - 2);
	            if (numeric && str.length > 1) {
	                result = String.fromCharCode(parseInt(str.substr(1), 10));
	            }
	            else if (hex && str.length > 2) {
	                result = String.fromCharCode(parseInt('0' + str.substr(1), 16));
	            }
	            else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) {
	                result = xhtml_entities_1.XHTMLEntities[str];
	            }
	        }
	        return result;
	    };
	    // Scan the next JSX token. This replaces Scanner#lex when in JSX mode.
	    JSXParser.prototype.lexJSX = function () {
	        var cp = this.scanner.source.charCodeAt(this.scanner.index);
	        // < > / : = { }
	        if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) {
	            var value = this.scanner.source[this.scanner.index++];
	            return {
	                type: 7 /* Punctuator */,
	                value: value,
	                lineNumber: this.scanner.lineNumber,
	                lineStart: this.scanner.lineStart,
	                start: this.scanner.index - 1,
	                end: this.scanner.index
	            };
	        }
	        // " '
	        if (cp === 34 || cp === 39) {
	            var start = this.scanner.index;
	            var quote = this.scanner.source[this.scanner.index++];
	            var str = '';
	            while (!this.scanner.eof()) {
	                var ch = this.scanner.source[this.scanner.index++];
	                if (ch === quote) {
	                    break;
	                }
	                else if (ch === '&') {
	                    str += this.scanXHTMLEntity(quote);
	                }
	                else {
	                    str += ch;
	                }
	            }
	            return {
	                type: 8 /* StringLiteral */,
	                value: str,
	                lineNumber: this.scanner.lineNumber,
	                lineStart: this.scanner.lineStart,
	                start: start,
	                end: this.scanner.index
	            };
	        }
	        // ... or .
	        if (cp === 46) {
	            var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1);
	            var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2);
	            var value = (n1 === 46 && n2 === 46) ? '...' : '.';
	            var start = this.scanner.index;
	            this.scanner.index += value.length;
	            return {
	                type: 7 /* Punctuator */,
	                value: value,
	                lineNumber: this.scanner.lineNumber,
	                lineStart: this.scanner.lineStart,
	                start: start,
	                end: this.scanner.index
	            };
	        }
	        // `
	        if (cp === 96) {
	            // Only placeholder, since it will be rescanned as a real assignment expression.
	            return {
	                type: 10 /* Template */,
	                value: '',
	                lineNumber: this.scanner.lineNumber,
	                lineStart: this.scanner.lineStart,
	                start: this.scanner.index,
	                end: this.scanner.index
	            };
	        }
	        // Identifer can not contain backslash (char code 92).
	        if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) {
	            var start = this.scanner.index;
	            ++this.scanner.index;
	            while (!this.scanner.eof()) {
	                var ch = this.scanner.source.charCodeAt(this.scanner.index);
	                if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) {
	                    ++this.scanner.index;
	                }
	                else if (ch === 45) {
	                    // Hyphen (char code 45) can be part of an identifier.
	                    ++this.scanner.index;
	                }
	                else {
	                    break;
	                }
	            }
	            var id = this.scanner.source.slice(start, this.scanner.index);
	            return {
	                type: 100 /* Identifier */,
	                value: id,
	                lineNumber: this.scanner.lineNumber,
	                lineStart: this.scanner.lineStart,
	                start: start,
	                end: this.scanner.index
	            };
	        }
	        return this.scanner.lex();
	    };
	    JSXParser.prototype.nextJSXToken = function () {
	        this.collectComments();
	        this.startMarker.index = this.scanner.index;
	        this.startMarker.line = this.scanner.lineNumber;
	        this.startMarker.column = this.scanner.index - this.scanner.lineStart;
	        var token = this.lexJSX();
	        this.lastMarker.index = this.scanner.index;
	        this.lastMarker.line = this.scanner.lineNumber;
	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
	        if (this.config.tokens) {
	            this.tokens.push(this.convertToken(token));
	        }
	        return token;
	    };
	    JSXParser.prototype.nextJSXText = function () {
	        this.startMarker.index = this.scanner.index;
	        this.startMarker.line = this.scanner.lineNumber;
	        this.startMarker.column = this.scanner.index - this.scanner.lineStart;
	        var start = this.scanner.index;
	        var text = '';
	        while (!this.scanner.eof()) {
	            var ch = this.scanner.source[this.scanner.index];
	            if (ch === '{' || ch === '<') {
	                break;
	            }
	            ++this.scanner.index;
	            text += ch;
	            if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                ++this.scanner.lineNumber;
	                if (ch === '\r' && this.scanner.source[this.scanner.index] === '\n') {
	                    ++this.scanner.index;
	                }
	                this.scanner.lineStart = this.scanner.index;
	            }
	        }
	        this.lastMarker.index = this.scanner.index;
	        this.lastMarker.line = this.scanner.lineNumber;
	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
	        var token = {
	            type: 101 /* Text */,
	            value: text,
	            lineNumber: this.scanner.lineNumber,
	            lineStart: this.scanner.lineStart,
	            start: start,
	            end: this.scanner.index
	        };
	        if ((text.length > 0) && this.config.tokens) {
	            this.tokens.push(this.convertToken(token));
	        }
	        return token;
	    };
	    JSXParser.prototype.peekJSXToken = function () {
	        var state = this.scanner.saveState();
	        this.scanner.scanComments();
	        var next = this.lexJSX();
	        this.scanner.restoreState(state);
	        return next;
	    };
	    // Expect the next JSX token to match the specified punctuator.
	    // If not, an exception will be thrown.
	    JSXParser.prototype.expectJSX = function (value) {
	        var token = this.nextJSXToken();
	        if (token.type !== 7 /* Punctuator */ || token.value !== value) {
	            this.throwUnexpectedToken(token);
	        }
	    };
	    // Return true if the next JSX token matches the specified punctuator.
	    JSXParser.prototype.matchJSX = function (value) {
	        var next = this.peekJSXToken();
	        return next.type === 7 /* Punctuator */ && next.value === value;
	    };
	    JSXParser.prototype.parseJSXIdentifier = function () {
	        var node = this.createJSXNode();
	        var token = this.nextJSXToken();
	        if (token.type !== 100 /* Identifier */) {
	            this.throwUnexpectedToken(token);
	        }
	        return this.finalize(node, new JSXNode.JSXIdentifier(token.value));
	    };
	    JSXParser.prototype.parseJSXElementName = function () {
	        var node = this.createJSXNode();
	        var elementName = this.parseJSXIdentifier();
	        if (this.matchJSX(':')) {
	            var namespace = elementName;
	            this.expectJSX(':');
	            var name_1 = this.parseJSXIdentifier();
	            elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1));
	        }
	        else if (this.matchJSX('.')) {
	            while (this.matchJSX('.')) {
	                var object = elementName;
	                this.expectJSX('.');
	                var property = this.parseJSXIdentifier();
	                elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property));
	            }
	        }
	        return elementName;
	    };
	    JSXParser.prototype.parseJSXAttributeName = function () {
	        var node = this.createJSXNode();
	        var attributeName;
	        var identifier = this.parseJSXIdentifier();
	        if (this.matchJSX(':')) {
	            var namespace = identifier;
	            this.expectJSX(':');
	            var name_2 = this.parseJSXIdentifier();
	            attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2));
	        }
	        else {
	            attributeName = identifier;
	        }
	        return attributeName;
	    };
	    JSXParser.prototype.parseJSXStringLiteralAttribute = function () {
	        var node = this.createJSXNode();
	        var token = this.nextJSXToken();
	        if (token.type !== 8 /* StringLiteral */) {
	            this.throwUnexpectedToken(token);
	        }
	        var raw = this.getTokenRaw(token);
	        return this.finalize(node, new Node.Literal(token.value, raw));
	    };
	    JSXParser.prototype.parseJSXExpressionAttribute = function () {
	        var node = this.createJSXNode();
	        this.expectJSX('{');
	        this.finishJSX();
	        if (this.match('}')) {
	            this.tolerateError('JSX attributes must only be assigned a non-empty expression');
	        }
	        var expression = this.parseAssignmentExpression();
	        this.reenterJSX();
	        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
	    };
	    JSXParser.prototype.parseJSXAttributeValue = function () {
	        return this.matchJSX('{') ? this.parseJSXExpressionAttribute() :
	            this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute();
	    };
	    JSXParser.prototype.parseJSXNameValueAttribute = function () {
	        var node = this.createJSXNode();
	        var name = this.parseJSXAttributeName();
	        var value = null;
	        if (this.matchJSX('=')) {
	            this.expectJSX('=');
	            value = this.parseJSXAttributeValue();
	        }
	        return this.finalize(node, new JSXNode.JSXAttribute(name, value));
	    };
	    JSXParser.prototype.parseJSXSpreadAttribute = function () {
	        var node = this.createJSXNode();
	        this.expectJSX('{');
	        this.expectJSX('...');
	        this.finishJSX();
	        var argument = this.parseAssignmentExpression();
	        this.reenterJSX();
	        return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument));
	    };
	    JSXParser.prototype.parseJSXAttributes = function () {
	        var attributes = [];
	        while (!this.matchJSX('/') && !this.matchJSX('>')) {
	            var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() :
	                this.parseJSXNameValueAttribute();
	            attributes.push(attribute);
	        }
	        return attributes;
	    };
	    JSXParser.prototype.parseJSXOpeningElement = function () {
	        var node = this.createJSXNode();
	        this.expectJSX('<');
	        var name = this.parseJSXElementName();
	        var attributes = this.parseJSXAttributes();
	        var selfClosing = this.matchJSX('/');
	        if (selfClosing) {
	            this.expectJSX('/');
	        }
	        this.expectJSX('>');
	        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
	    };
	    JSXParser.prototype.parseJSXBoundaryElement = function () {
	        var node = this.createJSXNode();
	        this.expectJSX('<');
	        if (this.matchJSX('/')) {
	            this.expectJSX('/');
	            var name_3 = this.parseJSXElementName();
	            this.expectJSX('>');
	            return this.finalize(node, new JSXNode.JSXClosingElement(name_3));
	        }
	        var name = this.parseJSXElementName();
	        var attributes = this.parseJSXAttributes();
	        var selfClosing = this.matchJSX('/');
	        if (selfClosing) {
	            this.expectJSX('/');
	        }
	        this.expectJSX('>');
	        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
	    };
	    JSXParser.prototype.parseJSXEmptyExpression = function () {
	        var node = this.createJSXChildNode();
	        this.collectComments();
	        this.lastMarker.index = this.scanner.index;
	        this.lastMarker.line = this.scanner.lineNumber;
	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
	        return this.finalize(node, new JSXNode.JSXEmptyExpression());
	    };
	    JSXParser.prototype.parseJSXExpressionContainer = function () {
	        var node = this.createJSXNode();
	        this.expectJSX('{');
	        var expression;
	        if (this.matchJSX('}')) {
	            expression = this.parseJSXEmptyExpression();
	            this.expectJSX('}');
	        }
	        else {
	            this.finishJSX();
	            expression = this.parseAssignmentExpression();
	            this.reenterJSX();
	        }
	        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
	    };
	    JSXParser.prototype.parseJSXChildren = function () {
	        var children = [];
	        while (!this.scanner.eof()) {
	            var node = this.createJSXChildNode();
	            var token = this.nextJSXText();
	            if (token.start < token.end) {
	                var raw = this.getTokenRaw(token);
	                var child = this.finalize(node, new JSXNode.JSXText(token.value, raw));
	                children.push(child);
	            }
	            if (this.scanner.source[this.scanner.index] === '{') {
	                var container = this.parseJSXExpressionContainer();
	                children.push(container);
	            }
	            else {
	                break;
	            }
	        }
	        return children;
	    };
	    JSXParser.prototype.parseComplexJSXElement = function (el) {
	        var stack = [];
	        while (!this.scanner.eof()) {
	            el.children = el.children.concat(this.parseJSXChildren());
	            var node = this.createJSXChildNode();
	            var element = this.parseJSXBoundaryElement();
	            if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) {
	                var opening = element;
	                if (opening.selfClosing) {
	                    var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null));
	                    el.children.push(child);
	                }
	                else {
	                    stack.push(el);
	                    el = { node: node, opening: opening, closing: null, children: [] };
	                }
	            }
	            if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) {
	                el.closing = element;
	                var open_1 = getQualifiedElementName(el.opening.name);
	                var close_1 = getQualifiedElementName(el.closing.name);
	                if (open_1 !== close_1) {
	                    this.tolerateError('Expected corresponding JSX closing tag for %0', open_1);
	                }
	                if (stack.length > 0) {
	                    var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing));
	                    el = stack[stack.length - 1];
	                    el.children.push(child);
	                    stack.pop();
	                }
	                else {
	                    break;
	                }
	            }
	        }
	        return el;
	    };
	    JSXParser.prototype.parseJSXElement = function () {
	        var node = this.createJSXNode();
	        var opening = this.parseJSXOpeningElement();
	        var children = [];
	        var closing = null;
	        if (!opening.selfClosing) {
	            var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children });
	            children = el.children;
	            closing = el.closing;
	        }
	        return this.finalize(node, new JSXNode.JSXElement(opening, children, closing));
	    };
	    JSXParser.prototype.parseJSXRoot = function () {
	        // Pop the opening '<' added from the lookahead.
	        if (this.config.tokens) {
	            this.tokens.pop();
	        }
	        this.startJSX();
	        var element = this.parseJSXElement();
	        this.finishJSX();
	        return element;
	    };
	    JSXParser.prototype.isStartOfExpression = function () {
	        return _super.prototype.isStartOfExpression.call(this) || this.match('<');
	    };
	    return JSXParser;
	}(parser_1.Parser));
	exports.JSXParser = JSXParser;


/***/ },
/* 4 */
/***/ function(module, exports) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	// See also tools/generate-unicode-regex.js.
	var Regex = {
	    // Unicode v8.0.0 NonAsciiIdentifierStart:
	    NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
	    // Unicode v8.0.0 NonAsciiIdentifierPart:
	    NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
	};
	exports.Character = {
	    /* tslint:disable:no-bitwise */
	    fromCodePoint: function (cp) {
	        return (cp < 0x10000) ? String.fromCharCode(cp) :
	            String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) +
	                String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023));
	    },
	    // https://tc39.github.io/ecma262/#sec-white-space
	    isWhiteSpace: function (cp) {
	        return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) ||
	            (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0);
	    },
	    // https://tc39.github.io/ecma262/#sec-line-terminators
	    isLineTerminator: function (cp) {
	        return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029);
	    },
	    // https://tc39.github.io/ecma262/#sec-names-and-keywords
	    isIdentifierStart: function (cp) {
	        return (cp === 0x24) || (cp === 0x5F) ||
	            (cp >= 0x41 && cp <= 0x5A) ||
	            (cp >= 0x61 && cp <= 0x7A) ||
	            (cp === 0x5C) ||
	            ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp)));
	    },
	    isIdentifierPart: function (cp) {
	        return (cp === 0x24) || (cp === 0x5F) ||
	            (cp >= 0x41 && cp <= 0x5A) ||
	            (cp >= 0x61 && cp <= 0x7A) ||
	            (cp >= 0x30 && cp <= 0x39) ||
	            (cp === 0x5C) ||
	            ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp)));
	    },
	    // https://tc39.github.io/ecma262/#sec-literals-numeric-literals
	    isDecimalDigit: function (cp) {
	        return (cp >= 0x30 && cp <= 0x39); // 0..9
	    },
	    isHexDigit: function (cp) {
	        return (cp >= 0x30 && cp <= 0x39) ||
	            (cp >= 0x41 && cp <= 0x46) ||
	            (cp >= 0x61 && cp <= 0x66); // a..f
	    },
	    isOctalDigit: function (cp) {
	        return (cp >= 0x30 && cp <= 0x37); // 0..7
	    }
	};


/***/ },
/* 5 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	var jsx_syntax_1 = __webpack_require__(6);
	/* tslint:disable:max-classes-per-file */
	var JSXClosingElement = (function () {
	    function JSXClosingElement(name) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement;
	        this.name = name;
	    }
	    return JSXClosingElement;
	}());
	exports.JSXClosingElement = JSXClosingElement;
	var JSXElement = (function () {
	    function JSXElement(openingElement, children, closingElement) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXElement;
	        this.openingElement = openingElement;
	        this.children = children;
	        this.closingElement = closingElement;
	    }
	    return JSXElement;
	}());
	exports.JSXElement = JSXElement;
	var JSXEmptyExpression = (function () {
	    function JSXEmptyExpression() {
	        this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression;
	    }
	    return JSXEmptyExpression;
	}());
	exports.JSXEmptyExpression = JSXEmptyExpression;
	var JSXExpressionContainer = (function () {
	    function JSXExpressionContainer(expression) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer;
	        this.expression = expression;
	    }
	    return JSXExpressionContainer;
	}());
	exports.JSXExpressionContainer = JSXExpressionContainer;
	var JSXIdentifier = (function () {
	    function JSXIdentifier(name) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier;
	        this.name = name;
	    }
	    return JSXIdentifier;
	}());
	exports.JSXIdentifier = JSXIdentifier;
	var JSXMemberExpression = (function () {
	    function JSXMemberExpression(object, property) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression;
	        this.object = object;
	        this.property = property;
	    }
	    return JSXMemberExpression;
	}());
	exports.JSXMemberExpression = JSXMemberExpression;
	var JSXAttribute = (function () {
	    function JSXAttribute(name, value) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXAttribute;
	        this.name = name;
	        this.value = value;
	    }
	    return JSXAttribute;
	}());
	exports.JSXAttribute = JSXAttribute;
	var JSXNamespacedName = (function () {
	    function JSXNamespacedName(namespace, name) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName;
	        this.namespace = namespace;
	        this.name = name;
	    }
	    return JSXNamespacedName;
	}());
	exports.JSXNamespacedName = JSXNamespacedName;
	var JSXOpeningElement = (function () {
	    function JSXOpeningElement(name, selfClosing, attributes) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement;
	        this.name = name;
	        this.selfClosing = selfClosing;
	        this.attributes = attributes;
	    }
	    return JSXOpeningElement;
	}());
	exports.JSXOpeningElement = JSXOpeningElement;
	var JSXSpreadAttribute = (function () {
	    function JSXSpreadAttribute(argument) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute;
	        this.argument = argument;
	    }
	    return JSXSpreadAttribute;
	}());
	exports.JSXSpreadAttribute = JSXSpreadAttribute;
	var JSXText = (function () {
	    function JSXText(value, raw) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXText;
	        this.value = value;
	        this.raw = raw;
	    }
	    return JSXText;
	}());
	exports.JSXText = JSXText;


/***/ },
/* 6 */
/***/ function(module, exports) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	exports.JSXSyntax = {
	    JSXAttribute: 'JSXAttribute',
	    JSXClosingElement: 'JSXClosingElement',
	    JSXElement: 'JSXElement',
	    JSXEmptyExpression: 'JSXEmptyExpression',
	    JSXExpressionContainer: 'JSXExpressionContainer',
	    JSXIdentifier: 'JSXIdentifier',
	    JSXMemberExpression: 'JSXMemberExpression',
	    JSXNamespacedName: 'JSXNamespacedName',
	    JSXOpeningElement: 'JSXOpeningElement',
	    JSXSpreadAttribute: 'JSXSpreadAttribute',
	    JSXText: 'JSXText'
	};


/***/ },
/* 7 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	var syntax_1 = __webpack_require__(2);
	/* tslint:disable:max-classes-per-file */
	var ArrayExpression = (function () {
	    function ArrayExpression(elements) {
	        this.type = syntax_1.Syntax.ArrayExpression;
	        this.elements = elements;
	    }
	    return ArrayExpression;
	}());
	exports.ArrayExpression = ArrayExpression;
	var ArrayPattern = (function () {
	    function ArrayPattern(elements) {
	        this.type = syntax_1.Syntax.ArrayPattern;
	        this.elements = elements;
	    }
	    return ArrayPattern;
	}());
	exports.ArrayPattern = ArrayPattern;
	var ArrowFunctionExpression = (function () {
	    function ArrowFunctionExpression(params, body, expression) {
	        this.type = syntax_1.Syntax.ArrowFunctionExpression;
	        this.id = null;
	        this.params = params;
	        this.body = body;
	        this.generator = false;
	        this.expression = expression;
	        this.async = false;
	    }
	    return ArrowFunctionExpression;
	}());
	exports.ArrowFunctionExpression = ArrowFunctionExpression;
	var AssignmentExpression = (function () {
	    function AssignmentExpression(operator, left, right) {
	        this.type = syntax_1.Syntax.AssignmentExpression;
	        this.operator = operator;
	        this.left = left;
	        this.right = right;
	    }
	    return AssignmentExpression;
	}());
	exports.AssignmentExpression = AssignmentExpression;
	var AssignmentPattern = (function () {
	    function AssignmentPattern(left, right) {
	        this.type = syntax_1.Syntax.AssignmentPattern;
	        this.left = left;
	        this.right = right;
	    }
	    return AssignmentPattern;
	}());
	exports.AssignmentPattern = AssignmentPattern;
	var AsyncArrowFunctionExpression = (function () {
	    function AsyncArrowFunctionExpression(params, body, expression) {
	        this.type = syntax_1.Syntax.ArrowFunctionExpression;
	        this.id = null;
	        this.params = params;
	        this.body = body;
	        this.generator = false;
	        this.expression = expression;
	        this.async = true;
	    }
	    return AsyncArrowFunctionExpression;
	}());
	exports.AsyncArrowFunctionExpression = AsyncArrowFunctionExpression;
	var AsyncFunctionDeclaration = (function () {
	    function AsyncFunctionDeclaration(id, params, body) {
	        this.type = syntax_1.Syntax.FunctionDeclaration;
	        this.id = id;
	        this.params = params;
	        this.body = body;
	        this.generator = false;
	        this.expression = false;
	        this.async = true;
	    }
	    return AsyncFunctionDeclaration;
	}());
	exports.AsyncFunctionDeclaration = AsyncFunctionDeclaration;
	var AsyncFunctionExpression = (function () {
	    function AsyncFunctionExpression(id, params, body) {
	        this.type = syntax_1.Syntax.FunctionExpression;
	        this.id = id;
	        this.params = params;
	        this.body = body;
	        this.generator = false;
	        this.expression = false;
	        this.async = true;
	    }
	    return AsyncFunctionExpression;
	}());
	exports.AsyncFunctionExpression = AsyncFunctionExpression;
	var AwaitExpression = (function () {
	    function AwaitExpression(argument) {
	        this.type = syntax_1.Syntax.AwaitExpression;
	        this.argument = argument;
	    }
	    return AwaitExpression;
	}());
	exports.AwaitExpression = AwaitExpression;
	var BinaryExpression = (function () {
	    function BinaryExpression(operator, left, right) {
	        var logical = (operator === '||' || operator === '&&');
	        this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression;
	        this.operator = operator;
	        this.left = left;
	        this.right = right;
	    }
	    return BinaryExpression;
	}());
	exports.BinaryExpression = BinaryExpression;
	var BlockStatement = (function () {
	    function BlockStatement(body) {
	        this.type = syntax_1.Syntax.BlockStatement;
	        this.body = body;
	    }
	    return BlockStatement;
	}());
	exports.BlockStatement = BlockStatement;
	var BreakStatement = (function () {
	    function BreakStatement(label) {
	        this.type = syntax_1.Syntax.BreakStatement;
	        this.label = label;
	    }
	    return BreakStatement;
	}());
	exports.BreakStatement = BreakStatement;
	var CallExpression = (function () {
	    function CallExpression(callee, args) {
	        this.type = syntax_1.Syntax.CallExpression;
	        this.callee = callee;
	        this.arguments = args;
	    }
	    return CallExpression;
	}());
	exports.CallExpression = CallExpression;
	var CatchClause = (function () {
	    function CatchClause(param, body) {
	        this.type = syntax_1.Syntax.CatchClause;
	        this.param = param;
	        this.body = body;
	    }
	    return CatchClause;
	}());
	exports.CatchClause = CatchClause;
	var ClassBody = (function () {
	    function ClassBody(body) {
	        this.type = syntax_1.Syntax.ClassBody;
	        this.body = body;
	    }
	    return ClassBody;
	}());
	exports.ClassBody = ClassBody;
	var ClassDeclaration = (function () {
	    function ClassDeclaration(id, superClass, body) {
	        this.type = syntax_1.Syntax.ClassDeclaration;
	        this.id = id;
	        this.superClass = superClass;
	        this.body = body;
	    }
	    return ClassDeclaration;
	}());
	exports.ClassDeclaration = ClassDeclaration;
	var ClassExpression = (function () {
	    function ClassExpression(id, superClass, body) {
	        this.type = syntax_1.Syntax.ClassExpression;
	        this.id = id;
	        this.superClass = superClass;
	        this.body = body;
	    }
	    return ClassExpression;
	}());
	exports.ClassExpression = ClassExpression;
	var ComputedMemberExpression = (function () {
	    function ComputedMemberExpression(object, property) {
	        this.type = syntax_1.Syntax.MemberExpression;
	        this.computed = true;
	        this.object = object;
	        this.property = property;
	    }
	    return ComputedMemberExpression;
	}());
	exports.ComputedMemberExpression = ComputedMemberExpression;
	var ConditionalExpression = (function () {
	    function ConditionalExpression(test, consequent, alternate) {
	        this.type = syntax_1.Syntax.ConditionalExpression;
	        this.test = test;
	        this.consequent = consequent;
	        this.alternate = alternate;
	    }
	    return ConditionalExpression;
	}());
	exports.ConditionalExpression = ConditionalExpression;
	var ContinueStatement = (function () {
	    function ContinueStatement(label) {
	        this.type = syntax_1.Syntax.ContinueStatement;
	        this.label = label;
	    }
	    return ContinueStatement;
	}());
	exports.ContinueStatement = ContinueStatement;
	var DebuggerStatement = (function () {
	    function DebuggerStatement() {
	        this.type = syntax_1.Syntax.DebuggerStatement;
	    }
	    return DebuggerStatement;
	}());
	exports.DebuggerStatement = DebuggerStatement;
	var Directive = (function () {
	    function Directive(expression, directive) {
	        this.type = syntax_1.Syntax.ExpressionStatement;
	        this.expression = expression;
	        this.directive = directive;
	    }
	    return Directive;
	}());
	exports.Directive = Directive;
	var DoWhileStatement = (function () {
	    function DoWhileStatement(body, test) {
	        this.type = syntax_1.Syntax.DoWhileStatement;
	        this.body = body;
	        this.test = test;
	    }
	    return DoWhileStatement;
	}());
	exports.DoWhileStatement = DoWhileStatement;
	var EmptyStatement = (function () {
	    function EmptyStatement() {
	        this.type = syntax_1.Syntax.EmptyStatement;
	    }
	    return EmptyStatement;
	}());
	exports.EmptyStatement = EmptyStatement;
	var ExportAllDeclaration = (function () {
	    function ExportAllDeclaration(source) {
	        this.type = syntax_1.Syntax.ExportAllDeclaration;
	        this.source = source;
	    }
	    return ExportAllDeclaration;
	}());
	exports.ExportAllDeclaration = ExportAllDeclaration;
	var ExportDefaultDeclaration = (function () {
	    function ExportDefaultDeclaration(declaration) {
	        this.type = syntax_1.Syntax.ExportDefaultDeclaration;
	        this.declaration = declaration;
	    }
	    return ExportDefaultDeclaration;
	}());
	exports.ExportDefaultDeclaration = ExportDefaultDeclaration;
	var ExportNamedDeclaration = (function () {
	    function ExportNamedDeclaration(declaration, specifiers, source) {
	        this.type = syntax_1.Syntax.ExportNamedDeclaration;
	        this.declaration = declaration;
	        this.specifiers = specifiers;
	        this.source = source;
	    }
	    return ExportNamedDeclaration;
	}());
	exports.ExportNamedDeclaration = ExportNamedDeclaration;
	var ExportSpecifier = (function () {
	    function ExportSpecifier(local, exported) {
	        this.type = syntax_1.Syntax.ExportSpecifier;
	        this.exported = exported;
	        this.local = local;
	    }
	    return ExportSpecifier;
	}());
	exports.ExportSpecifier = ExportSpecifier;
	var ExpressionStatement = (function () {
	    function ExpressionStatement(expression) {
	        this.type = syntax_1.Syntax.ExpressionStatement;
	        this.expression = expression;
	    }
	    return ExpressionStatement;
	}());
	exports.ExpressionStatement = ExpressionStatement;
	var ForInStatement = (function () {
	    function ForInStatement(left, right, body) {
	        this.type = syntax_1.Syntax.ForInStatement;
	        this.left = left;
	        this.right = right;
	        this.body = body;
	        this.each = false;
	    }
	    return ForInStatement;
	}());
	exports.ForInStatement = ForInStatement;
	var ForOfStatement = (function () {
	    function ForOfStatement(left, right, body) {
	        this.type = syntax_1.Syntax.ForOfStatement;
	        this.left = left;
	        this.right = right;
	        this.body = body;
	    }
	    return ForOfStatement;
	}());
	exports.ForOfStatement = ForOfStatement;
	var ForStatement = (function () {
	    function ForStatement(init, test, update, body) {
	        this.type = syntax_1.Syntax.ForStatement;
	        this.init = init;
	        this.test = test;
	        this.update = update;
	        this.body = body;
	    }
	    return ForStatement;
	}());
	exports.ForStatement = ForStatement;
	var FunctionDeclaration = (function () {
	    function FunctionDeclaration(id, params, body, generator) {
	        this.type = syntax_1.Syntax.FunctionDeclaration;
	        this.id = id;
	        this.params = params;
	        this.body = body;
	        this.generator = generator;
	        this.expression = false;
	        this.async = false;
	    }
	    return FunctionDeclaration;
	}());
	exports.FunctionDeclaration = FunctionDeclaration;
	var FunctionExpression = (function () {
	    function FunctionExpression(id, params, body, generator) {
	        this.type = syntax_1.Syntax.FunctionExpression;
	        this.id = id;
	        this.params = params;
	        this.body = body;
	        this.generator = generator;
	        this.expression = false;
	        this.async = false;
	    }
	    return FunctionExpression;
	}());
	exports.FunctionExpression = FunctionExpression;
	var Identifier = (function () {
	    function Identifier(name) {
	        this.type = syntax_1.Syntax.Identifier;
	        this.name = name;
	    }
	    return Identifier;
	}());
	exports.Identifier = Identifier;
	var IfStatement = (function () {
	    function IfStatement(test, consequent, alternate) {
	        this.type = syntax_1.Syntax.IfStatement;
	        this.test = test;
	        this.consequent = consequent;
	        this.alternate = alternate;
	    }
	    return IfStatement;
	}());
	exports.IfStatement = IfStatement;
	var ImportDeclaration = (function () {
	    function ImportDeclaration(specifiers, source) {
	        this.type = syntax_1.Syntax.ImportDeclaration;
	        this.specifiers = specifiers;
	        this.source = source;
	    }
	    return ImportDeclaration;
	}());
	exports.ImportDeclaration = ImportDeclaration;
	var ImportDefaultSpecifier = (function () {
	    function ImportDefaultSpecifier(local) {
	        this.type = syntax_1.Syntax.ImportDefaultSpecifier;
	        this.local = local;
	    }
	    return ImportDefaultSpecifier;
	}());
	exports.ImportDefaultSpecifier = ImportDefaultSpecifier;
	var ImportNamespaceSpecifier = (function () {
	    function ImportNamespaceSpecifier(local) {
	        this.type = syntax_1.Syntax.ImportNamespaceSpecifier;
	        this.local = local;
	    }
	    return ImportNamespaceSpecifier;
	}());
	exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier;
	var ImportSpecifier = (function () {
	    function ImportSpecifier(local, imported) {
	        this.type = syntax_1.Syntax.ImportSpecifier;
	        this.local = local;
	        this.imported = imported;
	    }
	    return ImportSpecifier;
	}());
	exports.ImportSpecifier = ImportSpecifier;
	var LabeledStatement = (function () {
	    function LabeledStatement(label, body) {
	        this.type = syntax_1.Syntax.LabeledStatement;
	        this.label = label;
	        this.body = body;
	    }
	    return LabeledStatement;
	}());
	exports.LabeledStatement = LabeledStatement;
	var Literal = (function () {
	    function Literal(value, raw) {
	        this.type = syntax_1.Syntax.Literal;
	        this.value = value;
	        this.raw = raw;
	    }
	    return Literal;
	}());
	exports.Literal = Literal;
	var MetaProperty = (function () {
	    function MetaProperty(meta, property) {
	        this.type = syntax_1.Syntax.MetaProperty;
	        this.meta = meta;
	        this.property = property;
	    }
	    return MetaProperty;
	}());
	exports.MetaProperty = MetaProperty;
	var MethodDefinition = (function () {
	    function MethodDefinition(key, computed, value, kind, isStatic) {
	        this.type = syntax_1.Syntax.MethodDefinition;
	        this.key = key;
	        this.computed = computed;
	        this.value = value;
	        this.kind = kind;
	        this.static = isStatic;
	    }
	    return MethodDefinition;
	}());
	exports.MethodDefinition = MethodDefinition;
	var Module = (function () {
	    function Module(body) {
	        this.type = syntax_1.Syntax.Program;
	        this.body = body;
	        this.sourceType = 'module';
	    }
	    return Module;
	}());
	exports.Module = Module;
	var NewExpression = (function () {
	    function NewExpression(callee, args) {
	        this.type = syntax_1.Syntax.NewExpression;
	        this.callee = callee;
	        this.arguments = args;
	    }
	    return NewExpression;
	}());
	exports.NewExpression = NewExpression;
	var ObjectExpression = (function () {
	    function ObjectExpression(properties) {
	        this.type = syntax_1.Syntax.ObjectExpression;
	        this.properties = properties;
	    }
	    return ObjectExpression;
	}());
	exports.ObjectExpression = ObjectExpression;
	var ObjectPattern = (function () {
	    function ObjectPattern(properties) {
	        this.type = syntax_1.Syntax.ObjectPattern;
	        this.properties = properties;
	    }
	    return ObjectPattern;
	}());
	exports.ObjectPattern = ObjectPattern;
	var Property = (function () {
	    function Property(kind, key, computed, value, method, shorthand) {
	        this.type = syntax_1.Syntax.Property;
	        this.key = key;
	        this.computed = computed;
	        this.value = value;
	        this.kind = kind;
	        this.method = method;
	        this.shorthand = shorthand;
	    }
	    return Property;
	}());
	exports.Property = Property;
	var RegexLiteral = (function () {
	    function RegexLiteral(value, raw, pattern, flags) {
	        this.type = syntax_1.Syntax.Literal;
	        this.value = value;
	        this.raw = raw;
	        this.regex = { pattern: pattern, flags: flags };
	    }
	    return RegexLiteral;
	}());
	exports.RegexLiteral = RegexLiteral;
	var RestElement = (function () {
	    function RestElement(argument) {
	        this.type = syntax_1.Syntax.RestElement;
	        this.argument = argument;
	    }
	    return RestElement;
	}());
	exports.RestElement = RestElement;
	var ReturnStatement = (function () {
	    function ReturnStatement(argument) {
	        this.type = syntax_1.Syntax.ReturnStatement;
	        this.argument = argument;
	    }
	    return ReturnStatement;
	}());
	exports.ReturnStatement = ReturnStatement;
	var Script = (function () {
	    function Script(body) {
	        this.type = syntax_1.Syntax.Program;
	        this.body = body;
	        this.sourceType = 'script';
	    }
	    return Script;
	}());
	exports.Script = Script;
	var SequenceExpression = (function () {
	    function SequenceExpression(expressions) {
	        this.type = syntax_1.Syntax.SequenceExpression;
	        this.expressions = expressions;
	    }
	    return SequenceExpression;
	}());
	exports.SequenceExpression = SequenceExpression;
	var SpreadElement = (function () {
	    function SpreadElement(argument) {
	        this.type = syntax_1.Syntax.SpreadElement;
	        this.argument = argument;
	    }
	    return SpreadElement;
	}());
	exports.SpreadElement = SpreadElement;
	var StaticMemberExpression = (function () {
	    function StaticMemberExpression(object, property) {
	        this.type = syntax_1.Syntax.MemberExpression;
	        this.computed = false;
	        this.object = object;
	        this.property = property;
	    }
	    return StaticMemberExpression;
	}());
	exports.StaticMemberExpression = StaticMemberExpression;
	var Super = (function () {
	    function Super() {
	        this.type = syntax_1.Syntax.Super;
	    }
	    return Super;
	}());
	exports.Super = Super;
	var SwitchCase = (function () {
	    function SwitchCase(test, consequent) {
	        this.type = syntax_1.Syntax.SwitchCase;
	        this.test = test;
	        this.consequent = consequent;
	    }
	    return SwitchCase;
	}());
	exports.SwitchCase = SwitchCase;
	var SwitchStatement = (function () {
	    function SwitchStatement(discriminant, cases) {
	        this.type = syntax_1.Syntax.SwitchStatement;
	        this.discriminant = discriminant;
	        this.cases = cases;
	    }
	    return SwitchStatement;
	}());
	exports.SwitchStatement = SwitchStatement;
	var TaggedTemplateExpression = (function () {
	    function TaggedTemplateExpression(tag, quasi) {
	        this.type = syntax_1.Syntax.TaggedTemplateExpression;
	        this.tag = tag;
	        this.quasi = quasi;
	    }
	    return TaggedTemplateExpression;
	}());
	exports.TaggedTemplateExpression = TaggedTemplateExpression;
	var TemplateElement = (function () {
	    function TemplateElement(value, tail) {
	        this.type = syntax_1.Syntax.TemplateElement;
	        this.value = value;
	        this.tail = tail;
	    }
	    return TemplateElement;
	}());
	exports.TemplateElement = TemplateElement;
	var TemplateLiteral = (function () {
	    function TemplateLiteral(quasis, expressions) {
	        this.type = syntax_1.Syntax.TemplateLiteral;
	        this.quasis = quasis;
	        this.expressions = expressions;
	    }
	    return TemplateLiteral;
	}());
	exports.TemplateLiteral = TemplateLiteral;
	var ThisExpression = (function () {
	    function ThisExpression() {
	        this.type = syntax_1.Syntax.ThisExpression;
	    }
	    return ThisExpression;
	}());
	exports.ThisExpression = ThisExpression;
	var ThrowStatement = (function () {
	    function ThrowStatement(argument) {
	        this.type = syntax_1.Syntax.ThrowStatement;
	        this.argument = argument;
	    }
	    return ThrowStatement;
	}());
	exports.ThrowStatement = ThrowStatement;
	var TryStatement = (function () {
	    function TryStatement(block, handler, finalizer) {
	        this.type = syntax_1.Syntax.TryStatement;
	        this.block = block;
	        this.handler = handler;
	        this.finalizer = finalizer;
	    }
	    return TryStatement;
	}());
	exports.TryStatement = TryStatement;
	var UnaryExpression = (function () {
	    function UnaryExpression(operator, argument) {
	        this.type = syntax_1.Syntax.UnaryExpression;
	        this.operator = operator;
	        this.argument = argument;
	        this.prefix = true;
	    }
	    return UnaryExpression;
	}());
	exports.UnaryExpression = UnaryExpression;
	var UpdateExpression = (function () {
	    function UpdateExpression(operator, argument, prefix) {
	        this.type = syntax_1.Syntax.UpdateExpression;
	        this.operator = operator;
	        this.argument = argument;
	        this.prefix = prefix;
	    }
	    return UpdateExpression;
	}());
	exports.UpdateExpression = UpdateExpression;
	var VariableDeclaration = (function () {
	    function VariableDeclaration(declarations, kind) {
	        this.type = syntax_1.Syntax.VariableDeclaration;
	        this.declarations = declarations;
	        this.kind = kind;
	    }
	    return VariableDeclaration;
	}());
	exports.VariableDeclaration = VariableDeclaration;
	var VariableDeclarator = (function () {
	    function VariableDeclarator(id, init) {
	        this.type = syntax_1.Syntax.VariableDeclarator;
	        this.id = id;
	        this.init = init;
	    }
	    return VariableDeclarator;
	}());
	exports.VariableDeclarator = VariableDeclarator;
	var WhileStatement = (function () {
	    function WhileStatement(test, body) {
	        this.type = syntax_1.Syntax.WhileStatement;
	        this.test = test;
	        this.body = body;
	    }
	    return WhileStatement;
	}());
	exports.WhileStatement = WhileStatement;
	var WithStatement = (function () {
	    function WithStatement(object, body) {
	        this.type = syntax_1.Syntax.WithStatement;
	        this.object = object;
	        this.body = body;
	    }
	    return WithStatement;
	}());
	exports.WithStatement = WithStatement;
	var YieldExpression = (function () {
	    function YieldExpression(argument, delegate) {
	        this.type = syntax_1.Syntax.YieldExpression;
	        this.argument = argument;
	        this.delegate = delegate;
	    }
	    return YieldExpression;
	}());
	exports.YieldExpression = YieldExpression;


/***/ },
/* 8 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	var assert_1 = __webpack_require__(9);
	var error_handler_1 = __webpack_require__(10);
	var messages_1 = __webpack_require__(11);
	var Node = __webpack_require__(7);
	var scanner_1 = __webpack_require__(12);
	var syntax_1 = __webpack_require__(2);
	var token_1 = __webpack_require__(13);
	var ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder';
	var Parser = (function () {
	    function Parser(code, options, delegate) {
	        if (options === void 0) { options = {}; }
	        this.config = {
	            range: (typeof options.range === 'boolean') && options.range,
	            loc: (typeof options.loc === 'boolean') && options.loc,
	            source: null,
	            tokens: (typeof options.tokens === 'boolean') && options.tokens,
	            comment: (typeof options.comment === 'boolean') && options.comment,
	            tolerant: (typeof options.tolerant === 'boolean') && options.tolerant
	        };
	        if (this.config.loc && options.source && options.source !== null) {
	            this.config.source = String(options.source);
	        }
	        this.delegate = delegate;
	        this.errorHandler = new error_handler_1.ErrorHandler();
	        this.errorHandler.tolerant = this.config.tolerant;
	        this.scanner = new scanner_1.Scanner(code, this.errorHandler);
	        this.scanner.trackComment = this.config.comment;
	        this.operatorPrecedence = {
	            ')': 0,
	            ';': 0,
	            ',': 0,
	            '=': 0,
	            ']': 0,
	            '||': 1,
	            '&&': 2,
	            '|': 3,
	            '^': 4,
	            '&': 5,
	            '==': 6,
	            '!=': 6,
	            '===': 6,
	            '!==': 6,
	            '<': 7,
	            '>': 7,
	            '<=': 7,
	            '>=': 7,
	            '<<': 8,
	            '>>': 8,
	            '>>>': 8,
	            '+': 9,
	            '-': 9,
	            '*': 11,
	            '/': 11,
	            '%': 11
	        };
	        this.lookahead = {
	            type: 2 /* EOF */,
	            value: '',
	            lineNumber: this.scanner.lineNumber,
	            lineStart: 0,
	            start: 0,
	            end: 0
	        };
	        this.hasLineTerminator = false;
	        this.context = {
	            isModule: false,
	            await: false,
	            allowIn: true,
	            allowStrictDirective: true,
	            allowYield: true,
	            firstCoverInitializedNameError: null,
	            isAssignmentTarget: false,
	            isBindingElement: false,
	            inFunctionBody: false,
	            inIteration: false,
	            inSwitch: false,
	            labelSet: {},
	            strict: false
	        };
	        this.tokens = [];
	        this.startMarker = {
	            index: 0,
	            line: this.scanner.lineNumber,
	            column: 0
	        };
	        this.lastMarker = {
	            index: 0,
	            line: this.scanner.lineNumber,
	            column: 0
	        };
	        this.nextToken();
	        this.lastMarker = {
	            index: this.scanner.index,
	            line: this.scanner.lineNumber,
	            column: this.scanner.index - this.scanner.lineStart
	        };
	    }
	    Parser.prototype.throwError = function (messageFormat) {
	        var values = [];
	        for (var _i = 1; _i < arguments.length; _i++) {
	            values[_i - 1] = arguments[_i];
	        }
	        var args = Array.prototype.slice.call(arguments, 1);
	        var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
	            assert_1.assert(idx < args.length, 'Message reference must be in range');
	            return args[idx];
	        });
	        var index = this.lastMarker.index;
	        var line = this.lastMarker.line;
	        var column = this.lastMarker.column + 1;
	        throw this.errorHandler.createError(index, line, column, msg);
	    };
	    Parser.prototype.tolerateError = function (messageFormat) {
	        var values = [];
	        for (var _i = 1; _i < arguments.length; _i++) {
	            values[_i - 1] = arguments[_i];
	        }
	        var args = Array.prototype.slice.call(arguments, 1);
	        var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
	            assert_1.assert(idx < args.length, 'Message reference must be in range');
	            return args[idx];
	        });
	        var index = this.lastMarker.index;
	        var line = this.scanner.lineNumber;
	        var column = this.lastMarker.column + 1;
	        this.errorHandler.tolerateError(index, line, column, msg);
	    };
	    // Throw an exception because of the token.
	    Parser.prototype.unexpectedTokenError = function (token, message) {
	        var msg = message || messages_1.Messages.UnexpectedToken;
	        var value;
	        if (token) {
	            if (!message) {
	                msg = (token.type === 2 /* EOF */) ? messages_1.Messages.UnexpectedEOS :
	                    (token.type === 3 /* Identifier */) ? messages_1.Messages.UnexpectedIdentifier :
	                        (token.type === 6 /* NumericLiteral */) ? messages_1.Messages.UnexpectedNumber :
	                            (token.type === 8 /* StringLiteral */) ? messages_1.Messages.UnexpectedString :
	                                (token.type === 10 /* Template */) ? messages_1.Messages.UnexpectedTemplate :
	                                    messages_1.Messages.UnexpectedToken;
	                if (token.type === 4 /* Keyword */) {
	                    if (this.scanner.isFutureReservedWord(token.value)) {
	                        msg = messages_1.Messages.UnexpectedReserved;
	                    }
	                    else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) {
	                        msg = messages_1.Messages.StrictReservedWord;
	                    }
	                }
	            }
	            value = token.value;
	        }
	        else {
	            value = 'ILLEGAL';
	        }
	        msg = msg.replace('%0', value);
	        if (token && typeof token.lineNumber === 'number') {
	            var index = token.start;
	            var line = token.lineNumber;
	            var lastMarkerLineStart = this.lastMarker.index - this.lastMarker.column;
	            var column = token.start - lastMarkerLineStart + 1;
	            return this.errorHandler.createError(index, line, column, msg);
	        }
	        else {
	            var index = this.lastMarker.index;
	            var line = this.lastMarker.line;
	            var column = this.lastMarker.column + 1;
	            return this.errorHandler.createError(index, line, column, msg);
	        }
	    };
	    Parser.prototype.throwUnexpectedToken = function (token, message) {
	        throw this.unexpectedTokenError(token, message);
	    };
	    Parser.prototype.tolerateUnexpectedToken = function (token, message) {
	        this.errorHandler.tolerate(this.unexpectedTokenError(token, message));
	    };
	    Parser.prototype.collectComments = function () {
	        if (!this.config.comment) {
	            this.scanner.scanComments();
	        }
	        else {
	            var comments = this.scanner.scanComments();
	            if (comments.length > 0 && this.delegate) {
	                for (var i = 0; i < comments.length; ++i) {
	                    var e = comments[i];
	                    var node = void 0;
	                    node = {
	                        type: e.multiLine ? 'BlockComment' : 'LineComment',
	                        value: this.scanner.source.slice(e.slice[0], e.slice[1])
	                    };
	                    if (this.config.range) {
	                        node.range = e.range;
	                    }
	                    if (this.config.loc) {
	                        node.loc = e.loc;
	                    }
	                    var metadata = {
	                        start: {
	                            line: e.loc.start.line,
	                            column: e.loc.start.column,
	                            offset: e.range[0]
	                        },
	                        end: {
	                            line: e.loc.end.line,
	                            column: e.loc.end.column,
	                            offset: e.range[1]
	                        }
	                    };
	                    this.delegate(node, metadata);
	                }
	            }
	        }
	    };
	    // From internal representation to an external structure
	    Parser.prototype.getTokenRaw = function (token) {
	        return this.scanner.source.slice(token.start, token.end);
	    };
	    Parser.prototype.convertToken = function (token) {
	        var t = {
	            type: token_1.TokenName[token.type],
	            value: this.getTokenRaw(token)
	        };
	        if (this.config.range) {
	            t.range = [token.start, token.end];
	        }
	        if (this.config.loc) {
	            t.loc = {
	                start: {
	                    line: this.startMarker.line,
	                    column: this.startMarker.column
	                },
	                end: {
	                    line: this.scanner.lineNumber,
	                    column: this.scanner.index - this.scanner.lineStart
	                }
	            };
	        }
	        if (token.type === 9 /* RegularExpression */) {
	            var pattern = token.pattern;
	            var flags = token.flags;
	            t.regex = { pattern: pattern, flags: flags };
	        }
	        return t;
	    };
	    Parser.prototype.nextToken = function () {
	        var token = this.lookahead;
	        this.lastMarker.index = this.scanner.index;
	        this.lastMarker.line = this.scanner.lineNumber;
	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
	        this.collectComments();
	        if (this.scanner.index !== this.startMarker.index) {
	            this.startMarker.index = this.scanner.index;
	            this.startMarker.line = this.scanner.lineNumber;
	            this.startMarker.column = this.scanner.index - this.scanner.lineStart;
	        }
	        var next = this.scanner.lex();
	        this.hasLineTerminator = (token.lineNumber !== next.lineNumber);
	        if (next && this.context.strict && next.type === 3 /* Identifier */) {
	            if (this.scanner.isStrictModeReservedWord(next.value)) {
	                next.type = 4 /* Keyword */;
	            }
	        }
	        this.lookahead = next;
	        if (this.config.tokens && next.type !== 2 /* EOF */) {
	            this.tokens.push(this.convertToken(next));
	        }
	        return token;
	    };
	    Parser.prototype.nextRegexToken = function () {
	        this.collectComments();
	        var token = this.scanner.scanRegExp();
	        if (this.config.tokens) {
	            // Pop the previous token, '/' or '/='
	            // This is added from the lookahead token.
	            this.tokens.pop();
	            this.tokens.push(this.convertToken(token));
	        }
	        // Prime the next lookahead.
	        this.lookahead = token;
	        this.nextToken();
	        return token;
	    };
	    Parser.prototype.createNode = function () {
	        return {
	            index: this.startMarker.index,
	            line: this.startMarker.line,
	            column: this.startMarker.column
	        };
	    };
	    Parser.prototype.startNode = function (token, lastLineStart) {
	        if (lastLineStart === void 0) { lastLineStart = 0; }
	        var column = token.start - token.lineStart;
	        var line = token.lineNumber;
	        if (column < 0) {
	            column += lastLineStart;
	            line--;
	        }
	        return {
	            index: token.start,
	            line: line,
	            column: column
	        };
	    };
	    Parser.prototype.finalize = function (marker, node) {
	        if (this.config.range) {
	            node.range = [marker.index, this.lastMarker.index];
	        }
	        if (this.config.loc) {
	            node.loc = {
	                start: {
	                    line: marker.line,
	                    column: marker.column,
	                },
	                end: {
	                    line: this.lastMarker.line,
	                    column: this.lastMarker.column
	                }
	            };
	            if (this.config.source) {
	                node.loc.source = this.config.source;
	            }
	        }
	        if (this.delegate) {
	            var metadata = {
	                start: {
	                    line: marker.line,
	                    column: marker.column,
	                    offset: marker.index
	                },
	                end: {
	                    line: this.lastMarker.line,
	                    column: this.lastMarker.column,
	                    offset: this.lastMarker.index
	                }
	            };
	            this.delegate(node, metadata);
	        }
	        return node;
	    };
	    // Expect the next token to match the specified punctuator.
	    // If not, an exception will be thrown.
	    Parser.prototype.expect = function (value) {
	        var token = this.nextToken();
	        if (token.type !== 7 /* Punctuator */ || token.value !== value) {
	            this.throwUnexpectedToken(token);
	        }
	    };
	    // Quietly expect a comma when in tolerant mode, otherwise delegates to expect().
	    Parser.prototype.expectCommaSeparator = function () {
	        if (this.config.tolerant) {
	            var token = this.lookahead;
	            if (token.type === 7 /* Punctuator */ && token.value === ',') {
	                this.nextToken();
	            }
	            else if (token.type === 7 /* Punctuator */ && token.value === ';') {
	                this.nextToken();
	                this.tolerateUnexpectedToken(token);
	            }
	            else {
	                this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken);
	            }
	        }
	        else {
	            this.expect(',');
	        }
	    };
	    // Expect the next token to match the specified keyword.
	    // If not, an exception will be thrown.
	    Parser.prototype.expectKeyword = function (keyword) {
	        var token = this.nextToken();
	        if (token.type !== 4 /* Keyword */ || token.value !== keyword) {
	            this.throwUnexpectedToken(token);
	        }
	    };
	    // Return true if the next token matches the specified punctuator.
	    Parser.prototype.match = function (value) {
	        return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value;
	    };
	    // Return true if the next token matches the specified keyword
	    Parser.prototype.matchKeyword = function (keyword) {
	        return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword;
	    };
	    // Return true if the next token matches the specified contextual keyword
	    // (where an identifier is sometimes a keyword depending on the context)
	    Parser.prototype.matchContextualKeyword = function (keyword) {
	        return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword;
	    };
	    // Return true if the next token is an assignment operator
	    Parser.prototype.matchAssign = function () {
	        if (this.lookahead.type !== 7 /* Punctuator */) {
	            return false;
	        }
	        var op = this.lookahead.value;
	        return op === '=' ||
	            op === '*=' ||
	            op === '**=' ||
	            op === '/=' ||
	            op === '%=' ||
	            op === '+=' ||
	            op === '-=' ||
	            op === '<<=' ||
	            op === '>>=' ||
	            op === '>>>=' ||
	            op === '&=' ||
	            op === '^=' ||
	            op === '|=';
	    };
	    // Cover grammar support.
	    //
	    // When an assignment expression position starts with an left parenthesis, the determination of the type
	    // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead)
	    // or the first comma. This situation also defers the determination of all the expressions nested in the pair.
	    //
	    // There are three productions that can be parsed in a parentheses pair that needs to be determined
	    // after the outermost pair is closed. They are:
	    //
	    //   1. AssignmentExpression
	    //   2. BindingElements
	    //   3. AssignmentTargets
	    //
	    // In order to avoid exponential backtracking, we use two flags to denote if the production can be
	    // binding element or assignment target.
	    //
	    // The three productions have the relationship:
	    //
	    //   BindingElements âŠ† AssignmentTargets âŠ† AssignmentExpression
	    //
	    // with a single exception that CoverInitializedName when used directly in an Expression, generates
	    // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the
	    // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair.
	    //
	    // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not
	    // effect the current flags. This means the production the parser parses is only used as an expression. Therefore
	    // the CoverInitializedName check is conducted.
	    //
	    // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates
	    // the flags outside of the parser. This means the production the parser parses is used as a part of a potential
	    // pattern. The CoverInitializedName check is deferred.
	    Parser.prototype.isolateCoverGrammar = function (parseFunction) {
	        var previousIsBindingElement = this.context.isBindingElement;
	        var previousIsAssignmentTarget = this.context.isAssignmentTarget;
	        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
	        this.context.isBindingElement = true;
	        this.context.isAssignmentTarget = true;
	        this.context.firstCoverInitializedNameError = null;
	        var result = parseFunction.call(this);
	        if (this.context.firstCoverInitializedNameError !== null) {
	            this.throwUnexpectedToken(this.context.firstCoverInitializedNameError);
	        }
	        this.context.isBindingElement = previousIsBindingElement;
	        this.context.isAssignmentTarget = previousIsAssignmentTarget;
	        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError;
	        return result;
	    };
	    Parser.prototype.inheritCoverGrammar = function (parseFunction) {
	        var previousIsBindingElement = this.context.isBindingElement;
	        var previousIsAssignmentTarget = this.context.isAssignmentTarget;
	        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
	        this.context.isBindingElement = true;
	        this.context.isAssignmentTarget = true;
	        this.context.firstCoverInitializedNameError = null;
	        var result = parseFunction.call(this);
	        this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement;
	        this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget;
	        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError;
	        return result;
	    };
	    Parser.prototype.consumeSemicolon = function () {
	        if (this.match(';')) {
	            this.nextToken();
	        }
	        else if (!this.hasLineTerminator) {
	            if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) {
	                this.throwUnexpectedToken(this.lookahead);
	            }
	            this.lastMarker.index = this.startMarker.index;
	            this.lastMarker.line = this.startMarker.line;
	            this.lastMarker.column = this.startMarker.column;
	        }
	    };
	    // https://tc39.github.io/ecma262/#sec-primary-expression
	    Parser.prototype.parsePrimaryExpression = function () {
	        var node = this.createNode();
	        var expr;
	        var token, raw;
	        switch (this.lookahead.type) {
	            case 3 /* Identifier */:
	                if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') {
	                    this.tolerateUnexpectedToken(this.lookahead);
	                }
	                expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value));
	                break;
	            case 6 /* NumericLiteral */:
	            case 8 /* StringLiteral */:
	                if (this.context.strict && this.lookahead.octal) {
	                    this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral);
	                }
	                this.context.isAssignmentTarget = false;
	                this.context.isBindingElement = false;
	                token = this.nextToken();
	                raw = this.getTokenRaw(token);
	                expr = this.finalize(node, new Node.Literal(token.value, raw));
	                break;
	            case 1 /* BooleanLiteral */:
	                this.context.isAssignmentTarget = false;
	                this.context.isBindingElement = false;
	                token = this.nextToken();
	                raw = this.getTokenRaw(token);
	                expr = this.finalize(node, new Node.Literal(token.value === 'true', raw));
	                break;
	            case 5 /* NullLiteral */:
	                this.context.isAssignmentTarget = false;
	                this.context.isBindingElement = false;
	                token = this.nextToken();
	                raw = this.getTokenRaw(token);
	                expr = this.finalize(node, new Node.Literal(null, raw));
	                break;
	            case 10 /* Template */:
	                expr = this.parseTemplateLiteral();
	                break;
	            case 7 /* Punctuator */:
	                switch (this.lookahead.value) {
	                    case '(':
	                        this.context.isBindingElement = false;
	                        expr = this.inheritCoverGrammar(this.parseGroupExpression);
	                        break;
	                    case '[':
	                        expr = this.inheritCoverGrammar(this.parseArrayInitializer);
	                        break;
	                    case '{':
	                        expr = this.inheritCoverGrammar(this.parseObjectInitializer);
	                        break;
	                    case '/':
	                    case '/=':
	                        this.context.isAssignmentTarget = false;
	                        this.context.isBindingElement = false;
	                        this.scanner.index = this.startMarker.index;
	                        token = this.nextRegexToken();
	                        raw = this.getTokenRaw(token);
	                        expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags));
	                        break;
	                    default:
	                        expr = this.throwUnexpectedToken(this.nextToken());
	                }
	                break;
	            case 4 /* Keyword */:
	                if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) {
	                    expr = this.parseIdentifierName();
	                }
	                else if (!this.context.strict && this.matchKeyword('let')) {
	                    expr = this.finalize(node, new Node.Identifier(this.nextToken().value));
	                }
	                else {
	                    this.context.isAssignmentTarget = false;
	                    this.context.isBindingElement = false;
	                    if (this.matchKeyword('function')) {
	                        expr = this.parseFunctionExpression();
	                    }
	                    else if (this.matchKeyword('this')) {
	                        this.nextToken();
	                        expr = this.finalize(node, new Node.ThisExpression());
	                    }
	                    else if (this.matchKeyword('class')) {
	                        expr = this.parseClassExpression();
	                    }
	                    else {
	                        expr = this.throwUnexpectedToken(this.nextToken());
	                    }
	                }
	                break;
	            default:
	                expr = this.throwUnexpectedToken(this.nextToken());
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-array-initializer
	    Parser.prototype.parseSpreadElement = function () {
	        var node = this.createNode();
	        this.expect('...');
	        var arg = this.inheritCoverGrammar(this.parseAssignmentExpression);
	        return this.finalize(node, new Node.SpreadElement(arg));
	    };
	    Parser.prototype.parseArrayInitializer = function () {
	        var node = this.createNode();
	        var elements = [];
	        this.expect('[');
	        while (!this.match(']')) {
	            if (this.match(',')) {
	                this.nextToken();
	                elements.push(null);
	            }
	            else if (this.match('...')) {
	                var element = this.parseSpreadElement();
	                if (!this.match(']')) {
	                    this.context.isAssignmentTarget = false;
	                    this.context.isBindingElement = false;
	                    this.expect(',');
	                }
	                elements.push(element);
	            }
	            else {
	                elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
	                if (!this.match(']')) {
	                    this.expect(',');
	                }
	            }
	        }
	        this.expect(']');
	        return this.finalize(node, new Node.ArrayExpression(elements));
	    };
	    // https://tc39.github.io/ecma262/#sec-object-initializer
	    Parser.prototype.parsePropertyMethod = function (params) {
	        this.context.isAssignmentTarget = false;
	        this.context.isBindingElement = false;
	        var previousStrict = this.context.strict;
	        var previousAllowStrictDirective = this.context.allowStrictDirective;
	        this.context.allowStrictDirective = params.simple;
	        var body = this.isolateCoverGrammar(this.parseFunctionSourceElements);
	        if (this.context.strict && params.firstRestricted) {
	            this.tolerateUnexpectedToken(params.firstRestricted, params.message);
	        }
	        if (this.context.strict && params.stricted) {
	            this.tolerateUnexpectedToken(params.stricted, params.message);
	        }
	        this.context.strict = previousStrict;
	        this.context.allowStrictDirective = previousAllowStrictDirective;
	        return body;
	    };
	    Parser.prototype.parsePropertyMethodFunction = function () {
	        var isGenerator = false;
	        var node = this.createNode();
	        var previousAllowYield = this.context.allowYield;
	        this.context.allowYield = true;
	        var params = this.parseFormalParameters();
	        var method = this.parsePropertyMethod(params);
	        this.context.allowYield = previousAllowYield;
	        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
	    };
	    Parser.prototype.parsePropertyMethodAsyncFunction = function () {
	        var node = this.createNode();
	        var previousAllowYield = this.context.allowYield;
	        var previousAwait = this.context.await;
	        this.context.allowYield = false;
	        this.context.await = true;
	        var params = this.parseFormalParameters();
	        var method = this.parsePropertyMethod(params);
	        this.context.allowYield = previousAllowYield;
	        this.context.await = previousAwait;
	        return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method));
	    };
	    Parser.prototype.parseObjectPropertyKey = function () {
	        var node = this.createNode();
	        var token = this.nextToken();
	        var key;
	        switch (token.type) {
	            case 8 /* StringLiteral */:
	            case 6 /* NumericLiteral */:
	                if (this.context.strict && token.octal) {
	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral);
	                }
	                var raw = this.getTokenRaw(token);
	                key = this.finalize(node, new Node.Literal(token.value, raw));
	                break;
	            case 3 /* Identifier */:
	            case 1 /* BooleanLiteral */:
	            case 5 /* NullLiteral */:
	            case 4 /* Keyword */:
	                key = this.finalize(node, new Node.Identifier(token.value));
	                break;
	            case 7 /* Punctuator */:
	                if (token.value === '[') {
	                    key = this.isolateCoverGrammar(this.parseAssignmentExpression);
	                    this.expect(']');
	                }
	                else {
	                    key = this.throwUnexpectedToken(token);
	                }
	                break;
	            default:
	                key = this.throwUnexpectedToken(token);
	        }
	        return key;
	    };
	    Parser.prototype.isPropertyKey = function (key, value) {
	        return (key.type === syntax_1.Syntax.Identifier && key.name === value) ||
	            (key.type === syntax_1.Syntax.Literal && key.value === value);
	    };
	    Parser.prototype.parseObjectProperty = function (hasProto) {
	        var node = this.createNode();
	        var token = this.lookahead;
	        var kind;
	        var key = null;
	        var value = null;
	        var computed = false;
	        var method = false;
	        var shorthand = false;
	        var isAsync = false;
	        if (token.type === 3 /* Identifier */) {
	            var id = token.value;
	            this.nextToken();
	            computed = this.match('[');
	            isAsync = !this.hasLineTerminator && (id === 'async') &&
	                !this.match(':') && !this.match('(') && !this.match('*') && !this.match(',');
	            key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id));
	        }
	        else if (this.match('*')) {
	            this.nextToken();
	        }
	        else {
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	        }
	        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
	        if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) {
	            kind = 'get';
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	            this.context.allowYield = false;
	            value = this.parseGetterMethod();
	        }
	        else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) {
	            kind = 'set';
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	            value = this.parseSetterMethod();
	        }
	        else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
	            kind = 'init';
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	            value = this.parseGeneratorMethod();
	            method = true;
	        }
	        else {
	            if (!key) {
	                this.throwUnexpectedToken(this.lookahead);
	            }
	            kind = 'init';
	            if (this.match(':') && !isAsync) {
	                if (!computed && this.isPropertyKey(key, '__proto__')) {
	                    if (hasProto.value) {
	                        this.tolerateError(messages_1.Messages.DuplicateProtoProperty);
	                    }
	                    hasProto.value = true;
	                }
	                this.nextToken();
	                value = this.inheritCoverGrammar(this.parseAssignmentExpression);
	            }
	            else if (this.match('(')) {
	                value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
	                method = true;
	            }
	            else if (token.type === 3 /* Identifier */) {
	                var id = this.finalize(node, new Node.Identifier(token.value));
	                if (this.match('=')) {
	                    this.context.firstCoverInitializedNameError = this.lookahead;
	                    this.nextToken();
	                    shorthand = true;
	                    var init = this.isolateCoverGrammar(this.parseAssignmentExpression);
	                    value = this.finalize(node, new Node.AssignmentPattern(id, init));
	                }
	                else {
	                    shorthand = true;
	                    value = id;
	                }
	            }
	            else {
	                this.throwUnexpectedToken(this.nextToken());
	            }
	        }
	        return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand));
	    };
	    Parser.prototype.parseObjectInitializer = function () {
	        var node = this.createNode();
	        this.expect('{');
	        var properties = [];
	        var hasProto = { value: false };
	        while (!this.match('}')) {
	            properties.push(this.parseObjectProperty(hasProto));
	            if (!this.match('}')) {
	                this.expectCommaSeparator();
	            }
	        }
	        this.expect('}');
	        return this.finalize(node, new Node.ObjectExpression(properties));
	    };
	    // https://tc39.github.io/ecma262/#sec-template-literals
	    Parser.prototype.parseTemplateHead = function () {
	        assert_1.assert(this.lookahead.head, 'Template literal must start with a template head');
	        var node = this.createNode();
	        var token = this.nextToken();
	        var raw = token.value;
	        var cooked = token.cooked;
	        return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
	    };
	    Parser.prototype.parseTemplateElement = function () {
	        if (this.lookahead.type !== 10 /* Template */) {
	            this.throwUnexpectedToken();
	        }
	        var node = this.createNode();
	        var token = this.nextToken();
	        var raw = token.value;
	        var cooked = token.cooked;
	        return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
	    };
	    Parser.prototype.parseTemplateLiteral = function () {
	        var node = this.createNode();
	        var expressions = [];
	        var quasis = [];
	        var quasi = this.parseTemplateHead();
	        quasis.push(quasi);
	        while (!quasi.tail) {
	            expressions.push(this.parseExpression());
	            quasi = this.parseTemplateElement();
	            quasis.push(quasi);
	        }
	        return this.finalize(node, new Node.TemplateLiteral(quasis, expressions));
	    };
	    // https://tc39.github.io/ecma262/#sec-grouping-operator
	    Parser.prototype.reinterpretExpressionAsPattern = function (expr) {
	        switch (expr.type) {
	            case syntax_1.Syntax.Identifier:
	            case syntax_1.Syntax.MemberExpression:
	            case syntax_1.Syntax.RestElement:
	            case syntax_1.Syntax.AssignmentPattern:
	                break;
	            case syntax_1.Syntax.SpreadElement:
	                expr.type = syntax_1.Syntax.RestElement;
	                this.reinterpretExpressionAsPattern(expr.argument);
	                break;
	            case syntax_1.Syntax.ArrayExpression:
	                expr.type = syntax_1.Syntax.ArrayPattern;
	                for (var i = 0; i < expr.elements.length; i++) {
	                    if (expr.elements[i] !== null) {
	                        this.reinterpretExpressionAsPattern(expr.elements[i]);
	                    }
	                }
	                break;
	            case syntax_1.Syntax.ObjectExpression:
	                expr.type = syntax_1.Syntax.ObjectPattern;
	                for (var i = 0; i < expr.properties.length; i++) {
	                    this.reinterpretExpressionAsPattern(expr.properties[i].value);
	                }
	                break;
	            case syntax_1.Syntax.AssignmentExpression:
	                expr.type = syntax_1.Syntax.AssignmentPattern;
	                delete expr.operator;
	                this.reinterpretExpressionAsPattern(expr.left);
	                break;
	            default:
	                // Allow other node type for tolerant parsing.
	                break;
	        }
	    };
	    Parser.prototype.parseGroupExpression = function () {
	        var expr;
	        this.expect('(');
	        if (this.match(')')) {
	            this.nextToken();
	            if (!this.match('=>')) {
	                this.expect('=>');
	            }
	            expr = {
	                type: ArrowParameterPlaceHolder,
	                params: [],
	                async: false
	            };
	        }
	        else {
	            var startToken = this.lookahead;
	            var params = [];
	            if (this.match('...')) {
	                expr = this.parseRestElement(params);
	                this.expect(')');
	                if (!this.match('=>')) {
	                    this.expect('=>');
	                }
	                expr = {
	                    type: ArrowParameterPlaceHolder,
	                    params: [expr],
	                    async: false
	                };
	            }
	            else {
	                var arrow = false;
	                this.context.isBindingElement = true;
	                expr = this.inheritCoverGrammar(this.parseAssignmentExpression);
	                if (this.match(',')) {
	                    var expressions = [];
	                    this.context.isAssignmentTarget = false;
	                    expressions.push(expr);
	                    while (this.lookahead.type !== 2 /* EOF */) {
	                        if (!this.match(',')) {
	                            break;
	                        }
	                        this.nextToken();
	                        if (this.match(')')) {
	                            this.nextToken();
	                            for (var i = 0; i < expressions.length; i++) {
	                                this.reinterpretExpressionAsPattern(expressions[i]);
	                            }
	                            arrow = true;
	                            expr = {
	                                type: ArrowParameterPlaceHolder,
	                                params: expressions,
	                                async: false
	                            };
	                        }
	                        else if (this.match('...')) {
	                            if (!this.context.isBindingElement) {
	                                this.throwUnexpectedToken(this.lookahead);
	                            }
	                            expressions.push(this.parseRestElement(params));
	                            this.expect(')');
	                            if (!this.match('=>')) {
	                                this.expect('=>');
	                            }
	                            this.context.isBindingElement = false;
	                            for (var i = 0; i < expressions.length; i++) {
	                                this.reinterpretExpressionAsPattern(expressions[i]);
	                            }
	                            arrow = true;
	                            expr = {
	                                type: ArrowParameterPlaceHolder,
	                                params: expressions,
	                                async: false
	                            };
	                        }
	                        else {
	                            expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
	                        }
	                        if (arrow) {
	                            break;
	                        }
	                    }
	                    if (!arrow) {
	                        expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
	                    }
	                }
	                if (!arrow) {
	                    this.expect(')');
	                    if (this.match('=>')) {
	                        if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') {
	                            arrow = true;
	                            expr = {
	                                type: ArrowParameterPlaceHolder,
	                                params: [expr],
	                                async: false
	                            };
	                        }
	                        if (!arrow) {
	                            if (!this.context.isBindingElement) {
	                                this.throwUnexpectedToken(this.lookahead);
	                            }
	                            if (expr.type === syntax_1.Syntax.SequenceExpression) {
	                                for (var i = 0; i < expr.expressions.length; i++) {
	                                    this.reinterpretExpressionAsPattern(expr.expressions[i]);
	                                }
	                            }
	                            else {
	                                this.reinterpretExpressionAsPattern(expr);
	                            }
	                            var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]);
	                            expr = {
	                                type: ArrowParameterPlaceHolder,
	                                params: parameters,
	                                async: false
	                            };
	                        }
	                    }
	                    this.context.isBindingElement = false;
	                }
	            }
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions
	    Parser.prototype.parseArguments = function () {
	        this.expect('(');
	        var args = [];
	        if (!this.match(')')) {
	            while (true) {
	                var expr = this.match('...') ? this.parseSpreadElement() :
	                    this.isolateCoverGrammar(this.parseAssignmentExpression);
	                args.push(expr);
	                if (this.match(')')) {
	                    break;
	                }
	                this.expectCommaSeparator();
	                if (this.match(')')) {
	                    break;
	                }
	            }
	        }
	        this.expect(')');
	        return args;
	    };
	    Parser.prototype.isIdentifierName = function (token) {
	        return token.type === 3 /* Identifier */ ||
	            token.type === 4 /* Keyword */ ||
	            token.type === 1 /* BooleanLiteral */ ||
	            token.type === 5 /* NullLiteral */;
	    };
	    Parser.prototype.parseIdentifierName = function () {
	        var node = this.createNode();
	        var token = this.nextToken();
	        if (!this.isIdentifierName(token)) {
	            this.throwUnexpectedToken(token);
	        }
	        return this.finalize(node, new Node.Identifier(token.value));
	    };
	    Parser.prototype.parseNewExpression = function () {
	        var node = this.createNode();
	        var id = this.parseIdentifierName();
	        assert_1.assert(id.name === 'new', 'New expression must start with `new`');
	        var expr;
	        if (this.match('.')) {
	            this.nextToken();
	            if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') {
	                var property = this.parseIdentifierName();
	                expr = new Node.MetaProperty(id, property);
	            }
	            else {
	                this.throwUnexpectedToken(this.lookahead);
	            }
	        }
	        else {
	            var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression);
	            var args = this.match('(') ? this.parseArguments() : [];
	            expr = new Node.NewExpression(callee, args);
	            this.context.isAssignmentTarget = false;
	            this.context.isBindingElement = false;
	        }
	        return this.finalize(node, expr);
	    };
	    Parser.prototype.parseAsyncArgument = function () {
	        var arg = this.parseAssignmentExpression();
	        this.context.firstCoverInitializedNameError = null;
	        return arg;
	    };
	    Parser.prototype.parseAsyncArguments = function () {
	        this.expect('(');
	        var args = [];
	        if (!this.match(')')) {
	            while (true) {
	                var expr = this.match('...') ? this.parseSpreadElement() :
	                    this.isolateCoverGrammar(this.parseAsyncArgument);
	                args.push(expr);
	                if (this.match(')')) {
	                    break;
	                }
	                this.expectCommaSeparator();
	                if (this.match(')')) {
	                    break;
	                }
	            }
	        }
	        this.expect(')');
	        return args;
	    };
	    Parser.prototype.parseLeftHandSideExpressionAllowCall = function () {
	        var startToken = this.lookahead;
	        var maybeAsync = this.matchContextualKeyword('async');
	        var previousAllowIn = this.context.allowIn;
	        this.context.allowIn = true;
	        var expr;
	        if (this.matchKeyword('super') && this.context.inFunctionBody) {
	            expr = this.createNode();
	            this.nextToken();
	            expr = this.finalize(expr, new Node.Super());
	            if (!this.match('(') && !this.match('.') && !this.match('[')) {
	                this.throwUnexpectedToken(this.lookahead);
	            }
	        }
	        else {
	            expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
	        }
	        while (true) {
	            if (this.match('.')) {
	                this.context.isBindingElement = false;
	                this.context.isAssignmentTarget = true;
	                this.expect('.');
	                var property = this.parseIdentifierName();
	                expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property));
	            }
	            else if (this.match('(')) {
	                var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber);
	                this.context.isBindingElement = false;
	                this.context.isAssignmentTarget = false;
	                var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments();
	                expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args));
	                if (asyncArrow && this.match('=>')) {
	                    for (var i = 0; i < args.length; ++i) {
	                        this.reinterpretExpressionAsPattern(args[i]);
	                    }
	                    expr = {
	                        type: ArrowParameterPlaceHolder,
	                        params: args,
	                        async: true
	                    };
	                }
	            }
	            else if (this.match('[')) {
	                this.context.isBindingElement = false;
	                this.context.isAssignmentTarget = true;
	                this.expect('[');
	                var property = this.isolateCoverGrammar(this.parseExpression);
	                this.expect(']');
	                expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property));
	            }
	            else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
	                var quasi = this.parseTemplateLiteral();
	                expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi));
	            }
	            else {
	                break;
	            }
	        }
	        this.context.allowIn = previousAllowIn;
	        return expr;
	    };
	    Parser.prototype.parseSuper = function () {
	        var node = this.createNode();
	        this.expectKeyword('super');
	        if (!this.match('[') && !this.match('.')) {
	            this.throwUnexpectedToken(this.lookahead);
	        }
	        return this.finalize(node, new Node.Super());
	    };
	    Parser.prototype.parseLeftHandSideExpression = function () {
	        assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.');
	        var node = this.startNode(this.lookahead);
	        var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() :
	            this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
	        while (true) {
	            if (this.match('[')) {
	                this.context.isBindingElement = false;
	                this.context.isAssignmentTarget = true;
	                this.expect('[');
	                var property = this.isolateCoverGrammar(this.parseExpression);
	                this.expect(']');
	                expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property));
	            }
	            else if (this.match('.')) {
	                this.context.isBindingElement = false;
	                this.context.isAssignmentTarget = true;
	                this.expect('.');
	                var property = this.parseIdentifierName();
	                expr = this.finalize(node, new Node.StaticMemberExpression(expr, property));
	            }
	            else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
	                var quasi = this.parseTemplateLiteral();
	                expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi));
	            }
	            else {
	                break;
	            }
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-update-expressions
	    Parser.prototype.parseUpdateExpression = function () {
	        var expr;
	        var startToken = this.lookahead;
	        if (this.match('++') || this.match('--')) {
	            var node = this.startNode(startToken);
	            var token = this.nextToken();
	            expr = this.inheritCoverGrammar(this.parseUnaryExpression);
	            if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
	                this.tolerateError(messages_1.Messages.StrictLHSPrefix);
	            }
	            if (!this.context.isAssignmentTarget) {
	                this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
	            }
	            var prefix = true;
	            expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix));
	            this.context.isAssignmentTarget = false;
	            this.context.isBindingElement = false;
	        }
	        else {
	            expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
	            if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) {
	                if (this.match('++') || this.match('--')) {
	                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
	                        this.tolerateError(messages_1.Messages.StrictLHSPostfix);
	                    }
	                    if (!this.context.isAssignmentTarget) {
	                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
	                    }
	                    this.context.isAssignmentTarget = false;
	                    this.context.isBindingElement = false;
	                    var operator = this.nextToken().value;
	                    var prefix = false;
	                    expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix));
	                }
	            }
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-unary-operators
	    Parser.prototype.parseAwaitExpression = function () {
	        var node = this.createNode();
	        this.nextToken();
	        var argument = this.parseUnaryExpression();
	        return this.finalize(node, new Node.AwaitExpression(argument));
	    };
	    Parser.prototype.parseUnaryExpression = function () {
	        var expr;
	        if (this.match('+') || this.match('-') || this.match('~') || this.match('!') ||
	            this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) {
	            var node = this.startNode(this.lookahead);
	            var token = this.nextToken();
	            expr = this.inheritCoverGrammar(this.parseUnaryExpression);
	            expr = this.finalize(node, new Node.UnaryExpression(token.value, expr));
	            if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) {
	                this.tolerateError(messages_1.Messages.StrictDelete);
	            }
	            this.context.isAssignmentTarget = false;
	            this.context.isBindingElement = false;
	        }
	        else if (this.context.await && this.matchContextualKeyword('await')) {
	            expr = this.parseAwaitExpression();
	        }
	        else {
	            expr = this.parseUpdateExpression();
	        }
	        return expr;
	    };
	    Parser.prototype.parseExponentiationExpression = function () {
	        var startToken = this.lookahead;
	        var expr = this.inheritCoverGrammar(this.parseUnaryExpression);
	        if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) {
	            this.nextToken();
	            this.context.isAssignmentTarget = false;
	            this.context.isBindingElement = false;
	            var left = expr;
	            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
	            expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right));
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-exp-operator
	    // https://tc39.github.io/ecma262/#sec-multiplicative-operators
	    // https://tc39.github.io/ecma262/#sec-additive-operators
	    // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators
	    // https://tc39.github.io/ecma262/#sec-relational-operators
	    // https://tc39.github.io/ecma262/#sec-equality-operators
	    // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators
	    // https://tc39.github.io/ecma262/#sec-binary-logical-operators
	    Parser.prototype.binaryPrecedence = function (token) {
	        var op = token.value;
	        var precedence;
	        if (token.type === 7 /* Punctuator */) {
	            precedence = this.operatorPrecedence[op] || 0;
	        }
	        else if (token.type === 4 /* Keyword */) {
	            precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0;
	        }
	        else {
	            precedence = 0;
	        }
	        return precedence;
	    };
	    Parser.prototype.parseBinaryExpression = function () {
	        var startToken = this.lookahead;
	        var expr = this.inheritCoverGrammar(this.parseExponentiationExpression);
	        var token = this.lookahead;
	        var prec = this.binaryPrecedence(token);
	        if (prec > 0) {
	            this.nextToken();
	            this.context.isAssignmentTarget = false;
	            this.context.isBindingElement = false;
	            var markers = [startToken, this.lookahead];
	            var left = expr;
	            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
	            var stack = [left, token.value, right];
	            var precedences = [prec];
	            while (true) {
	                prec = this.binaryPrecedence(this.lookahead);
	                if (prec <= 0) {
	                    break;
	                }
	                // Reduce: make a binary expression from the three topmost entries.
	                while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) {
	                    right = stack.pop();
	                    var operator = stack.pop();
	                    precedences.pop();
	                    left = stack.pop();
	                    markers.pop();
	                    var node = this.startNode(markers[markers.length - 1]);
	                    stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right)));
	                }
	                // Shift.
	                stack.push(this.nextToken().value);
	                precedences.push(prec);
	                markers.push(this.lookahead);
	                stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression));
	            }
	            // Final reduce to clean-up the stack.
	            var i = stack.length - 1;
	            expr = stack[i];
	            var lastMarker = markers.pop();
	            while (i > 1) {
	                var marker = markers.pop();
	                var lastLineStart = lastMarker && lastMarker.lineStart;
	                var node = this.startNode(marker, lastLineStart);
	                var operator = stack[i - 1];
	                expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr));
	                i -= 2;
	                lastMarker = marker;
	            }
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-conditional-operator
	    Parser.prototype.parseConditionalExpression = function () {
	        var startToken = this.lookahead;
	        var expr = this.inheritCoverGrammar(this.parseBinaryExpression);
	        if (this.match('?')) {
	            this.nextToken();
	            var previousAllowIn = this.context.allowIn;
	            this.context.allowIn = true;
	            var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression);
	            this.context.allowIn = previousAllowIn;
	            this.expect(':');
	            var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression);
	            expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate));
	            this.context.isAssignmentTarget = false;
	            this.context.isBindingElement = false;
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-assignment-operators
	    Parser.prototype.checkPatternParam = function (options, param) {
	        switch (param.type) {
	            case syntax_1.Syntax.Identifier:
	                this.validateParam(options, param, param.name);
	                break;
	            case syntax_1.Syntax.RestElement:
	                this.checkPatternParam(options, param.argument);
	                break;
	            case syntax_1.Syntax.AssignmentPattern:
	                this.checkPatternParam(options, param.left);
	                break;
	            case syntax_1.Syntax.ArrayPattern:
	                for (var i = 0; i < param.elements.length; i++) {
	                    if (param.elements[i] !== null) {
	                        this.checkPatternParam(options, param.elements[i]);
	                    }
	                }
	                break;
	            case syntax_1.Syntax.ObjectPattern:
	                for (var i = 0; i < param.properties.length; i++) {
	                    this.checkPatternParam(options, param.properties[i].value);
	                }
	                break;
	            default:
	                break;
	        }
	        options.simple = options.simple && (param instanceof Node.Identifier);
	    };
	    Parser.prototype.reinterpretAsCoverFormalsList = function (expr) {
	        var params = [expr];
	        var options;
	        var asyncArrow = false;
	        switch (expr.type) {
	            case syntax_1.Syntax.Identifier:
	                break;
	            case ArrowParameterPlaceHolder:
	                params = expr.params;
	                asyncArrow = expr.async;
	                break;
	            default:
	                return null;
	        }
	        options = {
	            simple: true,
	            paramSet: {}
	        };
	        for (var i = 0; i < params.length; ++i) {
	            var param = params[i];
	            if (param.type === syntax_1.Syntax.AssignmentPattern) {
	                if (param.right.type === syntax_1.Syntax.YieldExpression) {
	                    if (param.right.argument) {
	                        this.throwUnexpectedToken(this.lookahead);
	                    }
	                    param.right.type = syntax_1.Syntax.Identifier;
	                    param.right.name = 'yield';
	                    delete param.right.argument;
	                    delete param.right.delegate;
	                }
	            }
	            else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') {
	                this.throwUnexpectedToken(this.lookahead);
	            }
	            this.checkPatternParam(options, param);
	            params[i] = param;
	        }
	        if (this.context.strict || !this.context.allowYield) {
	            for (var i = 0; i < params.length; ++i) {
	                var param = params[i];
	                if (param.type === syntax_1.Syntax.YieldExpression) {
	                    this.throwUnexpectedToken(this.lookahead);
	                }
	            }
	        }
	        if (options.message === messages_1.Messages.StrictParamDupe) {
	            var token = this.context.strict ? options.stricted : options.firstRestricted;
	            this.throwUnexpectedToken(token, options.message);
	        }
	        return {
	            simple: options.simple,
	            params: params,
	            stricted: options.stricted,
	            firstRestricted: options.firstRestricted,
	            message: options.message
	        };
	    };
	    Parser.prototype.parseAssignmentExpression = function () {
	        var expr;
	        if (!this.context.allowYield && this.matchKeyword('yield')) {
	            expr = this.parseYieldExpression();
	        }
	        else {
	            var startToken = this.lookahead;
	            var token = startToken;
	            expr = this.parseConditionalExpression();
	            if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') {
	                if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) {
	                    var arg = this.parsePrimaryExpression();
	                    this.reinterpretExpressionAsPattern(arg);
	                    expr = {
	                        type: ArrowParameterPlaceHolder,
	                        params: [arg],
	                        async: true
	                    };
	                }
	            }
	            if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) {
	                // https://tc39.github.io/ecma262/#sec-arrow-function-definitions
	                this.context.isAssignmentTarget = false;
	                this.context.isBindingElement = false;
	                var isAsync = expr.async;
	                var list = this.reinterpretAsCoverFormalsList(expr);
	                if (list) {
	                    if (this.hasLineTerminator) {
	                        this.tolerateUnexpectedToken(this.lookahead);
	                    }
	                    this.context.firstCoverInitializedNameError = null;
	                    var previousStrict = this.context.strict;
	                    var previousAllowStrictDirective = this.context.allowStrictDirective;
	                    this.context.allowStrictDirective = list.simple;
	                    var previousAllowYield = this.context.allowYield;
	                    var previousAwait = this.context.await;
	                    this.context.allowYield = true;
	                    this.context.await = isAsync;
	                    var node = this.startNode(startToken);
	                    this.expect('=>');
	                    var body = void 0;
	                    if (this.match('{')) {
	                        var previousAllowIn = this.context.allowIn;
	                        this.context.allowIn = true;
	                        body = this.parseFunctionSourceElements();
	                        this.context.allowIn = previousAllowIn;
	                    }
	                    else {
	                        body = this.isolateCoverGrammar(this.parseAssignmentExpression);
	                    }
	                    var expression = body.type !== syntax_1.Syntax.BlockStatement;
	                    if (this.context.strict && list.firstRestricted) {
	                        this.throwUnexpectedToken(list.firstRestricted, list.message);
	                    }
	                    if (this.context.strict && list.stricted) {
	                        this.tolerateUnexpectedToken(list.stricted, list.message);
	                    }
	                    expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) :
	                        this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression));
	                    this.context.strict = previousStrict;
	                    this.context.allowStrictDirective = previousAllowStrictDirective;
	                    this.context.allowYield = previousAllowYield;
	                    this.context.await = previousAwait;
	                }
	            }
	            else {
	                if (this.matchAssign()) {
	                    if (!this.context.isAssignmentTarget) {
	                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
	                    }
	                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) {
	                        var id = expr;
	                        if (this.scanner.isRestrictedWord(id.name)) {
	                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment);
	                        }
	                        if (this.scanner.isStrictModeReservedWord(id.name)) {
	                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
	                        }
	                    }
	                    if (!this.match('=')) {
	                        this.context.isAssignmentTarget = false;
	                        this.context.isBindingElement = false;
	                    }
	                    else {
	                        this.reinterpretExpressionAsPattern(expr);
	                    }
	                    token = this.nextToken();
	                    var operator = token.value;
	                    var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
	                    expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right));
	                    this.context.firstCoverInitializedNameError = null;
	                }
	            }
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-comma-operator
	    Parser.prototype.parseExpression = function () {
	        var startToken = this.lookahead;
	        var expr = this.isolateCoverGrammar(this.parseAssignmentExpression);
	        if (this.match(',')) {
	            var expressions = [];
	            expressions.push(expr);
	            while (this.lookahead.type !== 2 /* EOF */) {
	                if (!this.match(',')) {
	                    break;
	                }
	                this.nextToken();
	                expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
	            }
	            expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-block
	    Parser.prototype.parseStatementListItem = function () {
	        var statement;
	        this.context.isAssignmentTarget = true;
	        this.context.isBindingElement = true;
	        if (this.lookahead.type === 4 /* Keyword */) {
	            switch (this.lookahead.value) {
	                case 'export':
	                    if (!this.context.isModule) {
	                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration);
	                    }
	                    statement = this.parseExportDeclaration();
	                    break;
	                case 'import':
	                    if (!this.context.isModule) {
	                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration);
	                    }
	                    statement = this.parseImportDeclaration();
	                    break;
	                case 'const':
	                    statement = this.parseLexicalDeclaration({ inFor: false });
	                    break;
	                case 'function':
	                    statement = this.parseFunctionDeclaration();
	                    break;
	                case 'class':
	                    statement = this.parseClassDeclaration();
	                    break;
	                case 'let':
	                    statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement();
	                    break;
	                default:
	                    statement = this.parseStatement();
	                    break;
	            }
	        }
	        else {
	            statement = this.parseStatement();
	        }
	        return statement;
	    };
	    Parser.prototype.parseBlock = function () {
	        var node = this.createNode();
	        this.expect('{');
	        var block = [];
	        while (true) {
	            if (this.match('}')) {
	                break;
	            }
	            block.push(this.parseStatementListItem());
	        }
	        this.expect('}');
	        return this.finalize(node, new Node.BlockStatement(block));
	    };
	    // https://tc39.github.io/ecma262/#sec-let-and-const-declarations
	    Parser.prototype.parseLexicalBinding = function (kind, options) {
	        var node = this.createNode();
	        var params = [];
	        var id = this.parsePattern(params, kind);
	        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
	            if (this.scanner.isRestrictedWord(id.name)) {
	                this.tolerateError(messages_1.Messages.StrictVarName);
	            }
	        }
	        var init = null;
	        if (kind === 'const') {
	            if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) {
	                if (this.match('=')) {
	                    this.nextToken();
	                    init = this.isolateCoverGrammar(this.parseAssignmentExpression);
	                }
	                else {
	                    this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const');
	                }
	            }
	        }
	        else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) {
	            this.expect('=');
	            init = this.isolateCoverGrammar(this.parseAssignmentExpression);
	        }
	        return this.finalize(node, new Node.VariableDeclarator(id, init));
	    };
	    Parser.prototype.parseBindingList = function (kind, options) {
	        var list = [this.parseLexicalBinding(kind, options)];
	        while (this.match(',')) {
	            this.nextToken();
	            list.push(this.parseLexicalBinding(kind, options));
	        }
	        return list;
	    };
	    Parser.prototype.isLexicalDeclaration = function () {
	        var state = this.scanner.saveState();
	        this.scanner.scanComments();
	        var next = this.scanner.lex();
	        this.scanner.restoreState(state);
	        return (next.type === 3 /* Identifier */) ||
	            (next.type === 7 /* Punctuator */ && next.value === '[') ||
	            (next.type === 7 /* Punctuator */ && next.value === '{') ||
	            (next.type === 4 /* Keyword */ && next.value === 'let') ||
	            (next.type === 4 /* Keyword */ && next.value === 'yield');
	    };
	    Parser.prototype.parseLexicalDeclaration = function (options) {
	        var node = this.createNode();
	        var kind = this.nextToken().value;
	        assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const');
	        var declarations = this.parseBindingList(kind, options);
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.VariableDeclaration(declarations, kind));
	    };
	    // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns
	    Parser.prototype.parseBindingRestElement = function (params, kind) {
	        var node = this.createNode();
	        this.expect('...');
	        var arg = this.parsePattern(params, kind);
	        return this.finalize(node, new Node.RestElement(arg));
	    };
	    Parser.prototype.parseArrayPattern = function (params, kind) {
	        var node = this.createNode();
	        this.expect('[');
	        var elements = [];
	        while (!this.match(']')) {
	            if (this.match(',')) {
	                this.nextToken();
	                elements.push(null);
	            }
	            else {
	                if (this.match('...')) {
	                    elements.push(this.parseBindingRestElement(params, kind));
	                    break;
	                }
	                else {
	                    elements.push(this.parsePatternWithDefault(params, kind));
	                }
	                if (!this.match(']')) {
	                    this.expect(',');
	                }
	            }
	        }
	        this.expect(']');
	        return this.finalize(node, new Node.ArrayPattern(elements));
	    };
	    Parser.prototype.parsePropertyPattern = function (params, kind) {
	        var node = this.createNode();
	        var computed = false;
	        var shorthand = false;
	        var method = false;
	        var key;
	        var value;
	        if (this.lookahead.type === 3 /* Identifier */) {
	            var keyToken = this.lookahead;
	            key = this.parseVariableIdentifier();
	            var init = this.finalize(node, new Node.Identifier(keyToken.value));
	            if (this.match('=')) {
	                params.push(keyToken);
	                shorthand = true;
	                this.nextToken();
	                var expr = this.parseAssignmentExpression();
	                value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr));
	            }
	            else if (!this.match(':')) {
	                params.push(keyToken);
	                shorthand = true;
	                value = init;
	            }
	            else {
	                this.expect(':');
	                value = this.parsePatternWithDefault(params, kind);
	            }
	        }
	        else {
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	            this.expect(':');
	            value = this.parsePatternWithDefault(params, kind);
	        }
	        return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand));
	    };
	    Parser.prototype.parseObjectPattern = function (params, kind) {
	        var node = this.createNode();
	        var properties = [];
	        this.expect('{');
	        while (!this.match('}')) {
	            properties.push(this.parsePropertyPattern(params, kind));
	            if (!this.match('}')) {
	                this.expect(',');
	            }
	        }
	        this.expect('}');
	        return this.finalize(node, new Node.ObjectPattern(properties));
	    };
	    Parser.prototype.parsePattern = function (params, kind) {
	        var pattern;
	        if (this.match('[')) {
	            pattern = this.parseArrayPattern(params, kind);
	        }
	        else if (this.match('{')) {
	            pattern = this.parseObjectPattern(params, kind);
	        }
	        else {
	            if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) {
	                this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding);
	            }
	            params.push(this.lookahead);
	            pattern = this.parseVariableIdentifier(kind);
	        }
	        return pattern;
	    };
	    Parser.prototype.parsePatternWithDefault = function (params, kind) {
	        var startToken = this.lookahead;
	        var pattern = this.parsePattern(params, kind);
	        if (this.match('=')) {
	            this.nextToken();
	            var previousAllowYield = this.context.allowYield;
	            this.context.allowYield = true;
	            var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
	            this.context.allowYield = previousAllowYield;
	            pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right));
	        }
	        return pattern;
	    };
	    // https://tc39.github.io/ecma262/#sec-variable-statement
	    Parser.prototype.parseVariableIdentifier = function (kind) {
	        var node = this.createNode();
	        var token = this.nextToken();
	        if (token.type === 4 /* Keyword */ && token.value === 'yield') {
	            if (this.context.strict) {
	                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
	            }
	            else if (!this.context.allowYield) {
	                this.throwUnexpectedToken(token);
	            }
	        }
	        else if (token.type !== 3 /* Identifier */) {
	            if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) {
	                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
	            }
	            else {
	                if (this.context.strict || token.value !== 'let' || kind !== 'var') {
	                    this.throwUnexpectedToken(token);
	                }
	            }
	        }
	        else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') {
	            this.tolerateUnexpectedToken(token);
	        }
	        return this.finalize(node, new Node.Identifier(token.value));
	    };
	    Parser.prototype.parseVariableDeclaration = function (options) {
	        var node = this.createNode();
	        var params = [];
	        var id = this.parsePattern(params, 'var');
	        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
	            if (this.scanner.isRestrictedWord(id.name)) {
	                this.tolerateError(messages_1.Messages.StrictVarName);
	            }
	        }
	        var init = null;
	        if (this.match('=')) {
	            this.nextToken();
	            init = this.isolateCoverGrammar(this.parseAssignmentExpression);
	        }
	        else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) {
	            this.expect('=');
	        }
	        return this.finalize(node, new Node.VariableDeclarator(id, init));
	    };
	    Parser.prototype.parseVariableDeclarationList = function (options) {
	        var opt = { inFor: options.inFor };
	        var list = [];
	        list.push(this.parseVariableDeclaration(opt));
	        while (this.match(',')) {
	            this.nextToken();
	            list.push(this.parseVariableDeclaration(opt));
	        }
	        return list;
	    };
	    Parser.prototype.parseVariableStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('var');
	        var declarations = this.parseVariableDeclarationList({ inFor: false });
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.VariableDeclaration(declarations, 'var'));
	    };
	    // https://tc39.github.io/ecma262/#sec-empty-statement
	    Parser.prototype.parseEmptyStatement = function () {
	        var node = this.createNode();
	        this.expect(';');
	        return this.finalize(node, new Node.EmptyStatement());
	    };
	    // https://tc39.github.io/ecma262/#sec-expression-statement
	    Parser.prototype.parseExpressionStatement = function () {
	        var node = this.createNode();
	        var expr = this.parseExpression();
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.ExpressionStatement(expr));
	    };
	    // https://tc39.github.io/ecma262/#sec-if-statement
	    Parser.prototype.parseIfClause = function () {
	        if (this.context.strict && this.matchKeyword('function')) {
	            this.tolerateError(messages_1.Messages.StrictFunction);
	        }
	        return this.parseStatement();
	    };
	    Parser.prototype.parseIfStatement = function () {
	        var node = this.createNode();
	        var consequent;
	        var alternate = null;
	        this.expectKeyword('if');
	        this.expect('(');
	        var test = this.parseExpression();
	        if (!this.match(')') && this.config.tolerant) {
	            this.tolerateUnexpectedToken(this.nextToken());
	            consequent = this.finalize(this.createNode(), new Node.EmptyStatement());
	        }
	        else {
	            this.expect(')');
	            consequent = this.parseIfClause();
	            if (this.matchKeyword('else')) {
	                this.nextToken();
	                alternate = this.parseIfClause();
	            }
	        }
	        return this.finalize(node, new Node.IfStatement(test, consequent, alternate));
	    };
	    // https://tc39.github.io/ecma262/#sec-do-while-statement
	    Parser.prototype.parseDoWhileStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('do');
	        var previousInIteration = this.context.inIteration;
	        this.context.inIteration = true;
	        var body = this.parseStatement();
	        this.context.inIteration = previousInIteration;
	        this.expectKeyword('while');
	        this.expect('(');
	        var test = this.parseExpression();
	        if (!this.match(')') && this.config.tolerant) {
	            this.tolerateUnexpectedToken(this.nextToken());
	        }
	        else {
	            this.expect(')');
	            if (this.match(';')) {
	                this.nextToken();
	            }
	        }
	        return this.finalize(node, new Node.DoWhileStatement(body, test));
	    };
	    // https://tc39.github.io/ecma262/#sec-while-statement
	    Parser.prototype.parseWhileStatement = function () {
	        var node = this.createNode();
	        var body;
	        this.expectKeyword('while');
	        this.expect('(');
	        var test = this.parseExpression();
	        if (!this.match(')') && this.config.tolerant) {
	            this.tolerateUnexpectedToken(this.nextToken());
	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
	        }
	        else {
	            this.expect(')');
	            var previousInIteration = this.context.inIteration;
	            this.context.inIteration = true;
	            body = this.parseStatement();
	            this.context.inIteration = previousInIteration;
	        }
	        return this.finalize(node, new Node.WhileStatement(test, body));
	    };
	    // https://tc39.github.io/ecma262/#sec-for-statement
	    // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements
	    Parser.prototype.parseForStatement = function () {
	        var init = null;
	        var test = null;
	        var update = null;
	        var forIn = true;
	        var left, right;
	        var node = this.createNode();
	        this.expectKeyword('for');
	        this.expect('(');
	        if (this.match(';')) {
	            this.nextToken();
	        }
	        else {
	            if (this.matchKeyword('var')) {
	                init = this.createNode();
	                this.nextToken();
	                var previousAllowIn = this.context.allowIn;
	                this.context.allowIn = false;
	                var declarations = this.parseVariableDeclarationList({ inFor: true });
	                this.context.allowIn = previousAllowIn;
	                if (declarations.length === 1 && this.matchKeyword('in')) {
	                    var decl = declarations[0];
	                    if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) {
	                        this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in');
	                    }
	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
	                    this.nextToken();
	                    left = init;
	                    right = this.parseExpression();
	                    init = null;
	                }
	                else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
	                    this.nextToken();
	                    left = init;
	                    right = this.parseAssignmentExpression();
	                    init = null;
	                    forIn = false;
	                }
	                else {
	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
	                    this.expect(';');
	                }
	            }
	            else if (this.matchKeyword('const') || this.matchKeyword('let')) {
	                init = this.createNode();
	                var kind = this.nextToken().value;
	                if (!this.context.strict && this.lookahead.value === 'in') {
	                    init = this.finalize(init, new Node.Identifier(kind));
	                    this.nextToken();
	                    left = init;
	                    right = this.parseExpression();
	                    init = null;
	                }
	                else {
	                    var previousAllowIn = this.context.allowIn;
	                    this.context.allowIn = false;
	                    var declarations = this.parseBindingList(kind, { inFor: true });
	                    this.context.allowIn = previousAllowIn;
	                    if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) {
	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
	                        this.nextToken();
	                        left = init;
	                        right = this.parseExpression();
	                        init = null;
	                    }
	                    else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
	                        this.nextToken();
	                        left = init;
	                        right = this.parseAssignmentExpression();
	                        init = null;
	                        forIn = false;
	                    }
	                    else {
	                        this.consumeSemicolon();
	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
	                    }
	                }
	            }
	            else {
	                var initStartToken = this.lookahead;
	                var previousAllowIn = this.context.allowIn;
	                this.context.allowIn = false;
	                init = this.inheritCoverGrammar(this.parseAssignmentExpression);
	                this.context.allowIn = previousAllowIn;
	                if (this.matchKeyword('in')) {
	                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
	                        this.tolerateError(messages_1.Messages.InvalidLHSInForIn);
	                    }
	                    this.nextToken();
	                    this.reinterpretExpressionAsPattern(init);
	                    left = init;
	                    right = this.parseExpression();
	                    init = null;
	                }
	                else if (this.matchContextualKeyword('of')) {
	                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
	                        this.tolerateError(messages_1.Messages.InvalidLHSInForLoop);
	                    }
	                    this.nextToken();
	                    this.reinterpretExpressionAsPattern(init);
	                    left = init;
	                    right = this.parseAssignmentExpression();
	                    init = null;
	                    forIn = false;
	                }
	                else {
	                    if (this.match(',')) {
	                        var initSeq = [init];
	                        while (this.match(',')) {
	                            this.nextToken();
	                            initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
	                        }
	                        init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq));
	                    }
	                    this.expect(';');
	                }
	            }
	        }
	        if (typeof left === 'undefined') {
	            if (!this.match(';')) {
	                test = this.parseExpression();
	            }
	            this.expect(';');
	            if (!this.match(')')) {
	                update = this.parseExpression();
	            }
	        }
	        var body;
	        if (!this.match(')') && this.config.tolerant) {
	            this.tolerateUnexpectedToken(this.nextToken());
	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
	        }
	        else {
	            this.expect(')');
	            var previousInIteration = this.context.inIteration;
	            this.context.inIteration = true;
	            body = this.isolateCoverGrammar(this.parseStatement);
	            this.context.inIteration = previousInIteration;
	        }
	        return (typeof left === 'undefined') ?
	            this.finalize(node, new Node.ForStatement(init, test, update, body)) :
	            forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) :
	                this.finalize(node, new Node.ForOfStatement(left, right, body));
	    };
	    // https://tc39.github.io/ecma262/#sec-continue-statement
	    Parser.prototype.parseContinueStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('continue');
	        var label = null;
	        if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
	            var id = this.parseVariableIdentifier();
	            label = id;
	            var key = '$' + id.name;
	            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
	                this.throwError(messages_1.Messages.UnknownLabel, id.name);
	            }
	        }
	        this.consumeSemicolon();
	        if (label === null && !this.context.inIteration) {
	            this.throwError(messages_1.Messages.IllegalContinue);
	        }
	        return this.finalize(node, new Node.ContinueStatement(label));
	    };
	    // https://tc39.github.io/ecma262/#sec-break-statement
	    Parser.prototype.parseBreakStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('break');
	        var label = null;
	        if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
	            var id = this.parseVariableIdentifier();
	            var key = '$' + id.name;
	            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
	                this.throwError(messages_1.Messages.UnknownLabel, id.name);
	            }
	            label = id;
	        }
	        this.consumeSemicolon();
	        if (label === null && !this.context.inIteration && !this.context.inSwitch) {
	            this.throwError(messages_1.Messages.IllegalBreak);
	        }
	        return this.finalize(node, new Node.BreakStatement(label));
	    };
	    // https://tc39.github.io/ecma262/#sec-return-statement
	    Parser.prototype.parseReturnStatement = function () {
	        if (!this.context.inFunctionBody) {
	            this.tolerateError(messages_1.Messages.IllegalReturn);
	        }
	        var node = this.createNode();
	        this.expectKeyword('return');
	        var hasArgument = (!this.match(';') && !this.match('}') &&
	            !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */) ||
	            this.lookahead.type === 8 /* StringLiteral */ ||
	            this.lookahead.type === 10 /* Template */;
	        var argument = hasArgument ? this.parseExpression() : null;
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.ReturnStatement(argument));
	    };
	    // https://tc39.github.io/ecma262/#sec-with-statement
	    Parser.prototype.parseWithStatement = function () {
	        if (this.context.strict) {
	            this.tolerateError(messages_1.Messages.StrictModeWith);
	        }
	        var node = this.createNode();
	        var body;
	        this.expectKeyword('with');
	        this.expect('(');
	        var object = this.parseExpression();
	        if (!this.match(')') && this.config.tolerant) {
	            this.tolerateUnexpectedToken(this.nextToken());
	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
	        }
	        else {
	            this.expect(')');
	            body = this.parseStatement();
	        }
	        return this.finalize(node, new Node.WithStatement(object, body));
	    };
	    // https://tc39.github.io/ecma262/#sec-switch-statement
	    Parser.prototype.parseSwitchCase = function () {
	        var node = this.createNode();
	        var test;
	        if (this.matchKeyword('default')) {
	            this.nextToken();
	            test = null;
	        }
	        else {
	            this.expectKeyword('case');
	            test = this.parseExpression();
	        }
	        this.expect(':');
	        var consequent = [];
	        while (true) {
	            if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) {
	                break;
	            }
	            consequent.push(this.parseStatementListItem());
	        }
	        return this.finalize(node, new Node.SwitchCase(test, consequent));
	    };
	    Parser.prototype.parseSwitchStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('switch');
	        this.expect('(');
	        var discriminant = this.parseExpression();
	        this.expect(')');
	        var previousInSwitch = this.context.inSwitch;
	        this.context.inSwitch = true;
	        var cases = [];
	        var defaultFound = false;
	        this.expect('{');
	        while (true) {
	            if (this.match('}')) {
	                break;
	            }
	            var clause = this.parseSwitchCase();
	            if (clause.test === null) {
	                if (defaultFound) {
	                    this.throwError(messages_1.Messages.MultipleDefaultsInSwitch);
	                }
	                defaultFound = true;
	            }
	            cases.push(clause);
	        }
	        this.expect('}');
	        this.context.inSwitch = previousInSwitch;
	        return this.finalize(node, new Node.SwitchStatement(discriminant, cases));
	    };
	    // https://tc39.github.io/ecma262/#sec-labelled-statements
	    Parser.prototype.parseLabelledStatement = function () {
	        var node = this.createNode();
	        var expr = this.parseExpression();
	        var statement;
	        if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) {
	            this.nextToken();
	            var id = expr;
	            var key = '$' + id.name;
	            if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
	                this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name);
	            }
	            this.context.labelSet[key] = true;
	            var body = void 0;
	            if (this.matchKeyword('class')) {
	                this.tolerateUnexpectedToken(this.lookahead);
	                body = this.parseClassDeclaration();
	            }
	            else if (this.matchKeyword('function')) {
	                var token = this.lookahead;
	                var declaration = this.parseFunctionDeclaration();
	                if (this.context.strict) {
	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction);
	                }
	                else if (declaration.generator) {
	                    this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext);
	                }
	                body = declaration;
	            }
	            else {
	                body = this.parseStatement();
	            }
	            delete this.context.labelSet[key];
	            statement = new Node.LabeledStatement(id, body);
	        }
	        else {
	            this.consumeSemicolon();
	            statement = new Node.ExpressionStatement(expr);
	        }
	        return this.finalize(node, statement);
	    };
	    // https://tc39.github.io/ecma262/#sec-throw-statement
	    Parser.prototype.parseThrowStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('throw');
	        if (this.hasLineTerminator) {
	            this.throwError(messages_1.Messages.NewlineAfterThrow);
	        }
	        var argument = this.parseExpression();
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.ThrowStatement(argument));
	    };
	    // https://tc39.github.io/ecma262/#sec-try-statement
	    Parser.prototype.parseCatchClause = function () {
	        var node = this.createNode();
	        this.expectKeyword('catch');
	        this.expect('(');
	        if (this.match(')')) {
	            this.throwUnexpectedToken(this.lookahead);
	        }
	        var params = [];
	        var param = this.parsePattern(params);
	        var paramMap = {};
	        for (var i = 0; i < params.length; i++) {
	            var key = '$' + params[i].value;
	            if (Object.prototype.hasOwnProperty.call(paramMap, key)) {
	                this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value);
	            }
	            paramMap[key] = true;
	        }
	        if (this.context.strict && param.type === syntax_1.Syntax.Identifier) {
	            if (this.scanner.isRestrictedWord(param.name)) {
	                this.tolerateError(messages_1.Messages.StrictCatchVariable);
	            }
	        }
	        this.expect(')');
	        var body = this.parseBlock();
	        return this.finalize(node, new Node.CatchClause(param, body));
	    };
	    Parser.prototype.parseFinallyClause = function () {
	        this.expectKeyword('finally');
	        return this.parseBlock();
	    };
	    Parser.prototype.parseTryStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('try');
	        var block = this.parseBlock();
	        var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null;
	        var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null;
	        if (!handler && !finalizer) {
	            this.throwError(messages_1.Messages.NoCatchOrFinally);
	        }
	        return this.finalize(node, new Node.TryStatement(block, handler, finalizer));
	    };
	    // https://tc39.github.io/ecma262/#sec-debugger-statement
	    Parser.prototype.parseDebuggerStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('debugger');
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.DebuggerStatement());
	    };
	    // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations
	    Parser.prototype.parseStatement = function () {
	        var statement;
	        switch (this.lookahead.type) {
	            case 1 /* BooleanLiteral */:
	            case 5 /* NullLiteral */:
	            case 6 /* NumericLiteral */:
	            case 8 /* StringLiteral */:
	            case 10 /* Template */:
	            case 9 /* RegularExpression */:
	                statement = this.parseExpressionStatement();
	                break;
	            case 7 /* Punctuator */:
	                var value = this.lookahead.value;
	                if (value === '{') {
	                    statement = this.parseBlock();
	                }
	                else if (value === '(') {
	                    statement = this.parseExpressionStatement();
	                }
	                else if (value === ';') {
	                    statement = this.parseEmptyStatement();
	                }
	                else {
	                    statement = this.parseExpressionStatement();
	                }
	                break;
	            case 3 /* Identifier */:
	                statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement();
	                break;
	            case 4 /* Keyword */:
	                switch (this.lookahead.value) {
	                    case 'break':
	                        statement = this.parseBreakStatement();
	                        break;
	                    case 'continue':
	                        statement = this.parseContinueStatement();
	                        break;
	                    case 'debugger':
	                        statement = this.parseDebuggerStatement();
	                        break;
	                    case 'do':
	                        statement = this.parseDoWhileStatement();
	                        break;
	                    case 'for':
	                        statement = this.parseForStatement();
	                        break;
	                    case 'function':
	                        statement = this.parseFunctionDeclaration();
	                        break;
	                    case 'if':
	                        statement = this.parseIfStatement();
	                        break;
	                    case 'return':
	                        statement = this.parseReturnStatement();
	                        break;
	                    case 'switch':
	                        statement = this.parseSwitchStatement();
	                        break;
	                    case 'throw':
	                        statement = this.parseThrowStatement();
	                        break;
	                    case 'try':
	                        statement = this.parseTryStatement();
	                        break;
	                    case 'var':
	                        statement = this.parseVariableStatement();
	                        break;
	                    case 'while':
	                        statement = this.parseWhileStatement();
	                        break;
	                    case 'with':
	                        statement = this.parseWithStatement();
	                        break;
	                    default:
	                        statement = this.parseExpressionStatement();
	                        break;
	                }
	                break;
	            default:
	                statement = this.throwUnexpectedToken(this.lookahead);
	        }
	        return statement;
	    };
	    // https://tc39.github.io/ecma262/#sec-function-definitions
	    Parser.prototype.parseFunctionSourceElements = function () {
	        var node = this.createNode();
	        this.expect('{');
	        var body = this.parseDirectivePrologues();
	        var previousLabelSet = this.context.labelSet;
	        var previousInIteration = this.context.inIteration;
	        var previousInSwitch = this.context.inSwitch;
	        var previousInFunctionBody = this.context.inFunctionBody;
	        this.context.labelSet = {};
	        this.context.inIteration = false;
	        this.context.inSwitch = false;
	        this.context.inFunctionBody = true;
	        while (this.lookahead.type !== 2 /* EOF */) {
	            if (this.match('}')) {
	                break;
	            }
	            body.push(this.parseStatementListItem());
	        }
	        this.expect('}');
	        this.context.labelSet = previousLabelSet;
	        this.context.inIteration = previousInIteration;
	        this.context.inSwitch = previousInSwitch;
	        this.context.inFunctionBody = previousInFunctionBody;
	        return this.finalize(node, new Node.BlockStatement(body));
	    };
	    Parser.prototype.validateParam = function (options, param, name) {
	        var key = '$' + name;
	        if (this.context.strict) {
	            if (this.scanner.isRestrictedWord(name)) {
	                options.stricted = param;
	                options.message = messages_1.Messages.StrictParamName;
	            }
	            if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
	                options.stricted = param;
	                options.message = messages_1.Messages.StrictParamDupe;
	            }
	        }
	        else if (!options.firstRestricted) {
	            if (this.scanner.isRestrictedWord(name)) {
	                options.firstRestricted = param;
	                options.message = messages_1.Messages.StrictParamName;
	            }
	            else if (this.scanner.isStrictModeReservedWord(name)) {
	                options.firstRestricted = param;
	                options.message = messages_1.Messages.StrictReservedWord;
	            }
	            else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
	                options.stricted = param;
	                options.message = messages_1.Messages.StrictParamDupe;
	            }
	        }
	        /* istanbul ignore next */
	        if (typeof Object.defineProperty === 'function') {
	            Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true });
	        }
	        else {
	            options.paramSet[key] = true;
	        }
	    };
	    Parser.prototype.parseRestElement = function (params) {
	        var node = this.createNode();
	        this.expect('...');
	        var arg = this.parsePattern(params);
	        if (this.match('=')) {
	            this.throwError(messages_1.Messages.DefaultRestParameter);
	        }
	        if (!this.match(')')) {
	            this.throwError(messages_1.Messages.ParameterAfterRestParameter);
	        }
	        return this.finalize(node, new Node.RestElement(arg));
	    };
	    Parser.prototype.parseFormalParameter = function (options) {
	        var params = [];
	        var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params);
	        for (var i = 0; i < params.length; i++) {
	            this.validateParam(options, params[i], params[i].value);
	        }
	        options.simple = options.simple && (param instanceof Node.Identifier);
	        options.params.push(param);
	    };
	    Parser.prototype.parseFormalParameters = function (firstRestricted) {
	        var options;
	        options = {
	            simple: true,
	            params: [],
	            firstRestricted: firstRestricted
	        };
	        this.expect('(');
	        if (!this.match(')')) {
	            options.paramSet = {};
	            while (this.lookahead.type !== 2 /* EOF */) {
	                this.parseFormalParameter(options);
	                if (this.match(')')) {
	                    break;
	                }
	                this.expect(',');
	                if (this.match(')')) {
	                    break;
	                }
	            }
	        }
	        this.expect(')');
	        return {
	            simple: options.simple,
	            params: options.params,
	            stricted: options.stricted,
	            firstRestricted: options.firstRestricted,
	            message: options.message
	        };
	    };
	    Parser.prototype.matchAsyncFunction = function () {
	        var match = this.matchContextualKeyword('async');
	        if (match) {
	            var state = this.scanner.saveState();
	            this.scanner.scanComments();
	            var next = this.scanner.lex();
	            this.scanner.restoreState(state);
	            match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function');
	        }
	        return match;
	    };
	    Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) {
	        var node = this.createNode();
	        var isAsync = this.matchContextualKeyword('async');
	        if (isAsync) {
	            this.nextToken();
	        }
	        this.expectKeyword('function');
	        var isGenerator = isAsync ? false : this.match('*');
	        if (isGenerator) {
	            this.nextToken();
	        }
	        var message;
	        var id = null;
	        var firstRestricted = null;
	        if (!identifierIsOptional || !this.match('(')) {
	            var token = this.lookahead;
	            id = this.parseVariableIdentifier();
	            if (this.context.strict) {
	                if (this.scanner.isRestrictedWord(token.value)) {
	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
	                }
	            }
	            else {
	                if (this.scanner.isRestrictedWord(token.value)) {
	                    firstRestricted = token;
	                    message = messages_1.Messages.StrictFunctionName;
	                }
	                else if (this.scanner.isStrictModeReservedWord(token.value)) {
	                    firstRestricted = token;
	                    message = messages_1.Messages.StrictReservedWord;
	                }
	            }
	        }
	        var previousAllowAwait = this.context.await;
	        var previousAllowYield = this.context.allowYield;
	        this.context.await = isAsync;
	        this.context.allowYield = !isGenerator;
	        var formalParameters = this.parseFormalParameters(firstRestricted);
	        var params = formalParameters.params;
	        var stricted = formalParameters.stricted;
	        firstRestricted = formalParameters.firstRestricted;
	        if (formalParameters.message) {
	            message = formalParameters.message;
	        }
	        var previousStrict = this.context.strict;
	        var previousAllowStrictDirective = this.context.allowStrictDirective;
	        this.context.allowStrictDirective = formalParameters.simple;
	        var body = this.parseFunctionSourceElements();
	        if (this.context.strict && firstRestricted) {
	            this.throwUnexpectedToken(firstRestricted, message);
	        }
	        if (this.context.strict && stricted) {
	            this.tolerateUnexpectedToken(stricted, message);
	        }
	        this.context.strict = previousStrict;
	        this.context.allowStrictDirective = previousAllowStrictDirective;
	        this.context.await = previousAllowAwait;
	        this.context.allowYield = previousAllowYield;
	        return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) :
	            this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator));
	    };
	    Parser.prototype.parseFunctionExpression = function () {
	        var node = this.createNode();
	        var isAsync = this.matchContextualKeyword('async');
	        if (isAsync) {
	            this.nextToken();
	        }
	        this.expectKeyword('function');
	        var isGenerator = isAsync ? false : this.match('*');
	        if (isGenerator) {
	            this.nextToken();
	        }
	        var message;
	        var id = null;
	        var firstRestricted;
	        var previousAllowAwait = this.context.await;
	        var previousAllowYield = this.context.allowYield;
	        this.context.await = isAsync;
	        this.context.allowYield = !isGenerator;
	        if (!this.match('(')) {
	            var token = this.lookahead;
	            id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier();
	            if (this.context.strict) {
	                if (this.scanner.isRestrictedWord(token.value)) {
	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
	                }
	            }
	            else {
	                if (this.scanner.isRestrictedWord(token.value)) {
	                    firstRestricted = token;
	                    message = messages_1.Messages.StrictFunctionName;
	                }
	                else if (this.scanner.isStrictModeReservedWord(token.value)) {
	                    firstRestricted = token;
	                    message = messages_1.Messages.StrictReservedWord;
	                }
	            }
	        }
	        var formalParameters = this.parseFormalParameters(firstRestricted);
	        var params = formalParameters.params;
	        var stricted = formalParameters.stricted;
	        firstRestricted = formalParameters.firstRestricted;
	        if (formalParameters.message) {
	            message = formalParameters.message;
	        }
	        var previousStrict = this.context.strict;
	        var previousAllowStrictDirective = this.context.allowStrictDirective;
	        this.context.allowStrictDirective = formalParameters.simple;
	        var body = this.parseFunctionSourceElements();
	        if (this.context.strict && firstRestricted) {
	            this.throwUnexpectedToken(firstRestricted, message);
	        }
	        if (this.context.strict && stricted) {
	            this.tolerateUnexpectedToken(stricted, message);
	        }
	        this.context.strict = previousStrict;
	        this.context.allowStrictDirective = previousAllowStrictDirective;
	        this.context.await = previousAllowAwait;
	        this.context.allowYield = previousAllowYield;
	        return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) :
	            this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator));
	    };
	    // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive
	    Parser.prototype.parseDirective = function () {
	        var token = this.lookahead;
	        var node = this.createNode();
	        var expr = this.parseExpression();
	        var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null;
	        this.consumeSemicolon();
	        return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr));
	    };
	    Parser.prototype.parseDirectivePrologues = function () {
	        var firstRestricted = null;
	        var body = [];
	        while (true) {
	            var token = this.lookahead;
	            if (token.type !== 8 /* StringLiteral */) {
	                break;
	            }
	            var statement = this.parseDirective();
	            body.push(statement);
	            var directive = statement.directive;
	            if (typeof directive !== 'string') {
	                break;
	            }
	            if (directive === 'use strict') {
	                this.context.strict = true;
	                if (firstRestricted) {
	                    this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral);
	                }
	                if (!this.context.allowStrictDirective) {
	                    this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective);
	                }
	            }
	            else {
	                if (!firstRestricted && token.octal) {
	                    firstRestricted = token;
	                }
	            }
	        }
	        return body;
	    };
	    // https://tc39.github.io/ecma262/#sec-method-definitions
	    Parser.prototype.qualifiedPropertyName = function (token) {
	        switch (token.type) {
	            case 3 /* Identifier */:
	            case 8 /* StringLiteral */:
	            case 1 /* BooleanLiteral */:
	            case 5 /* NullLiteral */:
	            case 6 /* NumericLiteral */:
	            case 4 /* Keyword */:
	                return true;
	            case 7 /* Punctuator */:
	                return token.value === '[';
	            default:
	                break;
	        }
	        return false;
	    };
	    Parser.prototype.parseGetterMethod = function () {
	        var node = this.createNode();
	        var isGenerator = false;
	        var previousAllowYield = this.context.allowYield;
	        this.context.allowYield = !isGenerator;
	        var formalParameters = this.parseFormalParameters();
	        if (formalParameters.params.length > 0) {
	            this.tolerateError(messages_1.Messages.BadGetterArity);
	        }
	        var method = this.parsePropertyMethod(formalParameters);
	        this.context.allowYield = previousAllowYield;
	        return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
	    };
	    Parser.prototype.parseSetterMethod = function () {
	        var node = this.createNode();
	        var isGenerator = false;
	        var previousAllowYield = this.context.allowYield;
	        this.context.allowYield = !isGenerator;
	        var formalParameters = this.parseFormalParameters();
	        if (formalParameters.params.length !== 1) {
	            this.tolerateError(messages_1.Messages.BadSetterArity);
	        }
	        else if (formalParameters.params[0] instanceof Node.RestElement) {
	            this.tolerateError(messages_1.Messages.BadSetterRestParameter);
	        }
	        var method = this.parsePropertyMethod(formalParameters);
	        this.context.allowYield = previousAllowYield;
	        return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
	    };
	    Parser.prototype.parseGeneratorMethod = function () {
	        var node = this.createNode();
	        var isGenerator = true;
	        var previousAllowYield = this.context.allowYield;
	        this.context.allowYield = true;
	        var params = this.parseFormalParameters();
	        this.context.allowYield = false;
	        var method = this.parsePropertyMethod(params);
	        this.context.allowYield = previousAllowYield;
	        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
	    };
	    // https://tc39.github.io/ecma262/#sec-generator-function-definitions
	    Parser.prototype.isStartOfExpression = function () {
	        var start = true;
	        var value = this.lookahead.value;
	        switch (this.lookahead.type) {
	            case 7 /* Punctuator */:
	                start = (value === '[') || (value === '(') || (value === '{') ||
	                    (value === '+') || (value === '-') ||
	                    (value === '!') || (value === '~') ||
	                    (value === '++') || (value === '--') ||
	                    (value === '/') || (value === '/='); // regular expression literal
	                break;
	            case 4 /* Keyword */:
	                start = (value === 'class') || (value === 'delete') ||
	                    (value === 'function') || (value === 'let') || (value === 'new') ||
	                    (value === 'super') || (value === 'this') || (value === 'typeof') ||
	                    (value === 'void') || (value === 'yield');
	                break;
	            default:
	                break;
	        }
	        return start;
	    };
	    Parser.prototype.parseYieldExpression = function () {
	        var node = this.createNode();
	        this.expectKeyword('yield');
	        var argument = null;
	        var delegate = false;
	        if (!this.hasLineTerminator) {
	            var previousAllowYield = this.context.allowYield;
	            this.context.allowYield = false;
	            delegate = this.match('*');
	            if (delegate) {
	                this.nextToken();
	                argument = this.parseAssignmentExpression();
	            }
	            else if (this.isStartOfExpression()) {
	                argument = this.parseAssignmentExpression();
	            }
	            this.context.allowYield = previousAllowYield;
	        }
	        return this.finalize(node, new Node.YieldExpression(argument, delegate));
	    };
	    // https://tc39.github.io/ecma262/#sec-class-definitions
	    Parser.prototype.parseClassElement = function (hasConstructor) {
	        var token = this.lookahead;
	        var node = this.createNode();
	        var kind = '';
	        var key = null;
	        var value = null;
	        var computed = false;
	        var method = false;
	        var isStatic = false;
	        var isAsync = false;
	        if (this.match('*')) {
	            this.nextToken();
	        }
	        else {
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	            var id = key;
	            if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) {
	                token = this.lookahead;
	                isStatic = true;
	                computed = this.match('[');
	                if (this.match('*')) {
	                    this.nextToken();
	                }
	                else {
	                    key = this.parseObjectPropertyKey();
	                }
	            }
	            if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) {
	                var punctuator = this.lookahead.value;
	                if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') {
	                    isAsync = true;
	                    token = this.lookahead;
	                    key = this.parseObjectPropertyKey();
	                    if (token.type === 3 /* Identifier */ && token.value === 'constructor') {
	                        this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync);
	                    }
	                }
	            }
	        }
	        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
	        if (token.type === 3 /* Identifier */) {
	            if (token.value === 'get' && lookaheadPropertyKey) {
	                kind = 'get';
	                computed = this.match('[');
	                key = this.parseObjectPropertyKey();
	                this.context.allowYield = false;
	                value = this.parseGetterMethod();
	            }
	            else if (token.value === 'set' && lookaheadPropertyKey) {
	                kind = 'set';
	                computed = this.match('[');
	                key = this.parseObjectPropertyKey();
	                value = this.parseSetterMethod();
	            }
	        }
	        else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
	            kind = 'init';
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	            value = this.parseGeneratorMethod();
	            method = true;
	        }
	        if (!kind && key && this.match('(')) {
	            kind = 'init';
	            value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
	            method = true;
	        }
	        if (!kind) {
	            this.throwUnexpectedToken(this.lookahead);
	        }
	        if (kind === 'init') {
	            kind = 'method';
	        }
	        if (!computed) {
	            if (isStatic && this.isPropertyKey(key, 'prototype')) {
	                this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype);
	            }
	            if (!isStatic && this.isPropertyKey(key, 'constructor')) {
	                if (kind !== 'method' || !method || (value && value.generator)) {
	                    this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod);
	                }
	                if (hasConstructor.value) {
	                    this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor);
	                }
	                else {
	                    hasConstructor.value = true;
	                }
	                kind = 'constructor';
	            }
	        }
	        return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic));
	    };
	    Parser.prototype.parseClassElementList = function () {
	        var body = [];
	        var hasConstructor = { value: false };
	        this.expect('{');
	        while (!this.match('}')) {
	            if (this.match(';')) {
	                this.nextToken();
	            }
	            else {
	                body.push(this.parseClassElement(hasConstructor));
	            }
	        }
	        this.expect('}');
	        return body;
	    };
	    Parser.prototype.parseClassBody = function () {
	        var node = this.createNode();
	        var elementList = this.parseClassElementList();
	        return this.finalize(node, new Node.ClassBody(elementList));
	    };
	    Parser.prototype.parseClassDeclaration = function (identifierIsOptional) {
	        var node = this.createNode();
	        var previousStrict = this.context.strict;
	        this.context.strict = true;
	        this.expectKeyword('class');
	        var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier();
	        var superClass = null;
	        if (this.matchKeyword('extends')) {
	            this.nextToken();
	            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
	        }
	        var classBody = this.parseClassBody();
	        this.context.strict = previousStrict;
	        return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody));
	    };
	    Parser.prototype.parseClassExpression = function () {
	        var node = this.createNode();
	        var previousStrict = this.context.strict;
	        this.context.strict = true;
	        this.expectKeyword('class');
	        var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null;
	        var superClass = null;
	        if (this.matchKeyword('extends')) {
	            this.nextToken();
	            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
	        }
	        var classBody = this.parseClassBody();
	        this.context.strict = previousStrict;
	        return this.finalize(node, new Node.ClassExpression(id, superClass, classBody));
	    };
	    // https://tc39.github.io/ecma262/#sec-scripts
	    // https://tc39.github.io/ecma262/#sec-modules
	    Parser.prototype.parseModule = function () {
	        this.context.strict = true;
	        this.context.isModule = true;
	        this.scanner.isModule = true;
	        var node = this.createNode();
	        var body = this.parseDirectivePrologues();
	        while (this.lookahead.type !== 2 /* EOF */) {
	            body.push(this.parseStatementListItem());
	        }
	        return this.finalize(node, new Node.Module(body));
	    };
	    Parser.prototype.parseScript = function () {
	        var node = this.createNode();
	        var body = this.parseDirectivePrologues();
	        while (this.lookahead.type !== 2 /* EOF */) {
	            body.push(this.parseStatementListItem());
	        }
	        return this.finalize(node, new Node.Script(body));
	    };
	    // https://tc39.github.io/ecma262/#sec-imports
	    Parser.prototype.parseModuleSpecifier = function () {
	        var node = this.createNode();
	        if (this.lookahead.type !== 8 /* StringLiteral */) {
	            this.throwError(messages_1.Messages.InvalidModuleSpecifier);
	        }
	        var token = this.nextToken();
	        var raw = this.getTokenRaw(token);
	        return this.finalize(node, new Node.Literal(token.value, raw));
	    };
	    // import {<foo as bar>} ...;
	    Parser.prototype.parseImportSpecifier = function () {
	        var node = this.createNode();
	        var imported;
	        var local;
	        if (this.lookahead.type === 3 /* Identifier */) {
	            imported = this.parseVariableIdentifier();
	            local = imported;
	            if (this.matchContextualKeyword('as')) {
	                this.nextToken();
	                local = this.parseVariableIdentifier();
	            }
	        }
	        else {
	            imported = this.parseIdentifierName();
	            local = imported;
	            if (this.matchContextualKeyword('as')) {
	                this.nextToken();
	                local = this.parseVariableIdentifier();
	            }
	            else {
	                this.throwUnexpectedToken(this.nextToken());
	            }
	        }
	        return this.finalize(node, new Node.ImportSpecifier(local, imported));
	    };
	    // {foo, bar as bas}
	    Parser.prototype.parseNamedImports = function () {
	        this.expect('{');
	        var specifiers = [];
	        while (!this.match('}')) {
	            specifiers.push(this.parseImportSpecifier());
	            if (!this.match('}')) {
	                this.expect(',');
	            }
	        }
	        this.expect('}');
	        return specifiers;
	    };
	    // import <foo> ...;
	    Parser.prototype.parseImportDefaultSpecifier = function () {
	        var node = this.createNode();
	        var local = this.parseIdentifierName();
	        return this.finalize(node, new Node.ImportDefaultSpecifier(local));
	    };
	    // import <* as foo> ...;
	    Parser.prototype.parseImportNamespaceSpecifier = function () {
	        var node = this.createNode();
	        this.expect('*');
	        if (!this.matchContextualKeyword('as')) {
	            this.throwError(messages_1.Messages.NoAsAfterImportNamespace);
	        }
	        this.nextToken();
	        var local = this.parseIdentifierName();
	        return this.finalize(node, new Node.ImportNamespaceSpecifier(local));
	    };
	    Parser.prototype.parseImportDeclaration = function () {
	        if (this.context.inFunctionBody) {
	            this.throwError(messages_1.Messages.IllegalImportDeclaration);
	        }
	        var node = this.createNode();
	        this.expectKeyword('import');
	        var src;
	        var specifiers = [];
	        if (this.lookahead.type === 8 /* StringLiteral */) {
	            // import 'foo';
	            src = this.parseModuleSpecifier();
	        }
	        else {
	            if (this.match('{')) {
	                // import {bar}
	                specifiers = specifiers.concat(this.parseNamedImports());
	            }
	            else if (this.match('*')) {
	                // import * as foo
	                specifiers.push(this.parseImportNamespaceSpecifier());
	            }
	            else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) {
	                // import foo
	                specifiers.push(this.parseImportDefaultSpecifier());
	                if (this.match(',')) {
	                    this.nextToken();
	                    if (this.match('*')) {
	                        // import foo, * as foo
	                        specifiers.push(this.parseImportNamespaceSpecifier());
	                    }
	                    else if (this.match('{')) {
	                        // import foo, {bar}
	                        specifiers = specifiers.concat(this.parseNamedImports());
	                    }
	                    else {
	                        this.throwUnexpectedToken(this.lookahead);
	                    }
	                }
	            }
	            else {
	                this.throwUnexpectedToken(this.nextToken());
	            }
	            if (!this.matchContextualKeyword('from')) {
	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
	                this.throwError(message, this.lookahead.value);
	            }
	            this.nextToken();
	            src = this.parseModuleSpecifier();
	        }
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.ImportDeclaration(specifiers, src));
	    };
	    // https://tc39.github.io/ecma262/#sec-exports
	    Parser.prototype.parseExportSpecifier = function () {
	        var node = this.createNode();
	        var local = this.parseIdentifierName();
	        var exported = local;
	        if (this.matchContextualKeyword('as')) {
	            this.nextToken();
	            exported = this.parseIdentifierName();
	        }
	        return this.finalize(node, new Node.ExportSpecifier(local, exported));
	    };
	    Parser.prototype.parseExportDeclaration = function () {
	        if (this.context.inFunctionBody) {
	            this.throwError(messages_1.Messages.IllegalExportDeclaration);
	        }
	        var node = this.createNode();
	        this.expectKeyword('export');
	        var exportDeclaration;
	        if (this.matchKeyword('default')) {
	            // export default ...
	            this.nextToken();
	            if (this.matchKeyword('function')) {
	                // export default function foo () {}
	                // export default function () {}
	                var declaration = this.parseFunctionDeclaration(true);
	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
	            }
	            else if (this.matchKeyword('class')) {
	                // export default class foo {}
	                var declaration = this.parseClassDeclaration(true);
	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
	            }
	            else if (this.matchContextualKeyword('async')) {
	                // export default async function f () {}
	                // export default async function () {}
	                // export default async x => x
	                var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression();
	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
	            }
	            else {
	                if (this.matchContextualKeyword('from')) {
	                    this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value);
	                }
	                // export default {};
	                // export default [];
	                // export default (1 + 2);
	                var declaration = this.match('{') ? this.parseObjectInitializer() :
	                    this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression();
	                this.consumeSemicolon();
	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
	            }
	        }
	        else if (this.match('*')) {
	            // export * from 'foo';
	            this.nextToken();
	            if (!this.matchContextualKeyword('from')) {
	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
	                this.throwError(message, this.lookahead.value);
	            }
	            this.nextToken();
	            var src = this.parseModuleSpecifier();
	            this.consumeSemicolon();
	            exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src));
	        }
	        else if (this.lookahead.type === 4 /* Keyword */) {
	            // export var f = 1;
	            var declaration = void 0;
	            switch (this.lookahead.value) {
	                case 'let':
	                case 'const':
	                    declaration = this.parseLexicalDeclaration({ inFor: false });
	                    break;
	                case 'var':
	                case 'class':
	                case 'function':
	                    declaration = this.parseStatementListItem();
	                    break;
	                default:
	                    this.throwUnexpectedToken(this.lookahead);
	            }
	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
	        }
	        else if (this.matchAsyncFunction()) {
	            var declaration = this.parseFunctionDeclaration();
	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
	        }
	        else {
	            var specifiers = [];
	            var source = null;
	            var isExportFromIdentifier = false;
	            this.expect('{');
	            while (!this.match('}')) {
	                isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default');
	                specifiers.push(this.parseExportSpecifier());
	                if (!this.match('}')) {
	                    this.expect(',');
	                }
	            }
	            this.expect('}');
	            if (this.matchContextualKeyword('from')) {
	                // export {default} from 'foo';
	                // export {foo} from 'foo';
	                this.nextToken();
	                source = this.parseModuleSpecifier();
	                this.consumeSemicolon();
	            }
	            else if (isExportFromIdentifier) {
	                // export {default}; // missing fromClause
	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
	                this.throwError(message, this.lookahead.value);
	            }
	            else {
	                // export {foo};
	                this.consumeSemicolon();
	            }
	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source));
	        }
	        return exportDeclaration;
	    };
	    return Parser;
	}());
	exports.Parser = Parser;


/***/ },
/* 9 */
/***/ function(module, exports) {

	"use strict";
	// Ensure the condition is true, otherwise throw an error.
	// This is only to have a better contract semantic, i.e. another safety net
	// to catch a logic error. The condition shall be fulfilled in normal case.
	// Do NOT use this to enforce a certain condition on any user input.
	Object.defineProperty(exports, "__esModule", { value: true });
	function assert(condition, message) {
	    /* istanbul ignore if */
	    if (!condition) {
	        throw new Error('ASSERT: ' + message);
	    }
	}
	exports.assert = assert;


/***/ },
/* 10 */
/***/ function(module, exports) {

	"use strict";
	/* tslint:disable:max-classes-per-file */
	Object.defineProperty(exports, "__esModule", { value: true });
	var ErrorHandler = (function () {
	    function ErrorHandler() {
	        this.errors = [];
	        this.tolerant = false;
	    }
	    ErrorHandler.prototype.recordError = function (error) {
	        this.errors.push(error);
	    };
	    ErrorHandler.prototype.tolerate = function (error) {
	        if (this.tolerant) {
	            this.recordError(error);
	        }
	        else {
	            throw error;
	        }
	    };
	    ErrorHandler.prototype.constructError = function (msg, column) {
	        var error = new Error(msg);
	        try {
	            throw error;
	        }
	        catch (base) {
	            /* istanbul ignore else */
	            if (Object.create && Object.defineProperty) {
	                error = Object.create(base);
	                Object.defineProperty(error, 'column', { value: column });
	            }
	        }
	        /* istanbul ignore next */
	        return error;
	    };
	    ErrorHandler.prototype.createError = function (index, line, col, description) {
	        var msg = 'Line ' + line + ': ' + description;
	        var error = this.constructError(msg, col);
	        error.index = index;
	        error.lineNumber = line;
	        error.description = description;
	        return error;
	    };
	    ErrorHandler.prototype.throwError = function (index, line, col, description) {
	        throw this.createError(index, line, col, description);
	    };
	    ErrorHandler.prototype.tolerateError = function (index, line, col, description) {
	        var error = this.createError(index, line, col, description);
	        if (this.tolerant) {
	            this.recordError(error);
	        }
	        else {
	            throw error;
	        }
	    };
	    return ErrorHandler;
	}());
	exports.ErrorHandler = ErrorHandler;


/***/ },
/* 11 */
/***/ function(module, exports) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	// Error messages should be identical to V8.
	exports.Messages = {
	    BadGetterArity: 'Getter must not have any formal parameters',
	    BadSetterArity: 'Setter must have exactly one formal parameter',
	    BadSetterRestParameter: 'Setter function argument must not be a rest parameter',
	    ConstructorIsAsync: 'Class constructor may not be an async method',
	    ConstructorSpecialMethod: 'Class constructor may not be an accessor',
	    DeclarationMissingInitializer: 'Missing initializer in %0 declaration',
	    DefaultRestParameter: 'Unexpected token =',
	    DuplicateBinding: 'Duplicate binding %0',
	    DuplicateConstructor: 'A class may only have one constructor',
	    DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',
	    ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer',
	    GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts',
	    IllegalBreak: 'Illegal break statement',
	    IllegalContinue: 'Illegal continue statement',
	    IllegalExportDeclaration: 'Unexpected token',
	    IllegalImportDeclaration: 'Unexpected token',
	    IllegalLanguageModeDirective: 'Illegal \'use strict\' directive in function with non-simple parameter list',
	    IllegalReturn: 'Illegal return statement',
	    InvalidEscapedReservedWord: 'Keyword must not contain escaped characters',
	    InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence',
	    InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
	    InvalidLHSInForIn: 'Invalid left-hand side in for-in',
	    InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',
	    InvalidModuleSpecifier: 'Unexpected token',
	    InvalidRegExp: 'Invalid regular expression',
	    LetInLexicalBinding: 'let is disallowed as a lexically bound name',
	    MissingFromClause: 'Unexpected token',
	    MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
	    NewlineAfterThrow: 'Illegal newline after throw',
	    NoAsAfterImportNamespace: 'Unexpected token',
	    NoCatchOrFinally: 'Missing catch or finally after try',
	    ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',
	    Redeclaration: '%0 \'%1\' has already been declared',
	    StaticPrototype: 'Classes may not have static property named prototype',
	    StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
	    StrictDelete: 'Delete of an unqualified identifier in strict mode.',
	    StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block',
	    StrictFunctionName: 'Function name may not be eval or arguments in strict mode',
	    StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',
	    StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
	    StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
	    StrictModeWith: 'Strict mode code may not include a with statement',
	    StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',
	    StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
	    StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',
	    StrictReservedWord: 'Use of future reserved word in strict mode',
	    StrictVarName: 'Variable name may not be eval or arguments in strict mode',
	    TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',
	    UnexpectedEOS: 'Unexpected end of input',
	    UnexpectedIdentifier: 'Unexpected identifier',
	    UnexpectedNumber: 'Unexpected number',
	    UnexpectedReserved: 'Unexpected reserved word',
	    UnexpectedString: 'Unexpected string',
	    UnexpectedTemplate: 'Unexpected quasi %0',
	    UnexpectedToken: 'Unexpected token %0',
	    UnexpectedTokenIllegal: 'Unexpected token ILLEGAL',
	    UnknownLabel: 'Undefined label \'%0\'',
	    UnterminatedRegExp: 'Invalid regular expression: missing /'
	};


/***/ },
/* 12 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	var assert_1 = __webpack_require__(9);
	var character_1 = __webpack_require__(4);
	var messages_1 = __webpack_require__(11);
	function hexValue(ch) {
	    return '0123456789abcdef'.indexOf(ch.toLowerCase());
	}
	function octalValue(ch) {
	    return '01234567'.indexOf(ch);
	}
	var Scanner = (function () {
	    function Scanner(code, handler) {
	        this.source = code;
	        this.errorHandler = handler;
	        this.trackComment = false;
	        this.isModule = false;
	        this.length = code.length;
	        this.index = 0;
	        this.lineNumber = (code.length > 0) ? 1 : 0;
	        this.lineStart = 0;
	        this.curlyStack = [];
	    }
	    Scanner.prototype.saveState = function () {
	        return {
	            index: this.index,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart
	        };
	    };
	    Scanner.prototype.restoreState = function (state) {
	        this.index = state.index;
	        this.lineNumber = state.lineNumber;
	        this.lineStart = state.lineStart;
	    };
	    Scanner.prototype.eof = function () {
	        return this.index >= this.length;
	    };
	    Scanner.prototype.throwUnexpectedToken = function (message) {
	        if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
	        return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
	    };
	    Scanner.prototype.tolerateUnexpectedToken = function (message) {
	        if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
	        this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
	    };
	    // https://tc39.github.io/ecma262/#sec-comments
	    Scanner.prototype.skipSingleLineComment = function (offset) {
	        var comments = [];
	        var start, loc;
	        if (this.trackComment) {
	            comments = [];
	            start = this.index - offset;
	            loc = {
	                start: {
	                    line: this.lineNumber,
	                    column: this.index - this.lineStart - offset
	                },
	                end: {}
	            };
	        }
	        while (!this.eof()) {
	            var ch = this.source.charCodeAt(this.index);
	            ++this.index;
	            if (character_1.Character.isLineTerminator(ch)) {
	                if (this.trackComment) {
	                    loc.end = {
	                        line: this.lineNumber,
	                        column: this.index - this.lineStart - 1
	                    };
	                    var entry = {
	                        multiLine: false,
	                        slice: [start + offset, this.index - 1],
	                        range: [start, this.index - 1],
	                        loc: loc
	                    };
	                    comments.push(entry);
	                }
	                if (ch === 13 && this.source.charCodeAt(this.index) === 10) {
	                    ++this.index;
	                }
	                ++this.lineNumber;
	                this.lineStart = this.index;
	                return comments;
	            }
	        }
	        if (this.trackComment) {
	            loc.end = {
	                line: this.lineNumber,
	                column: this.index - this.lineStart
	            };
	            var entry = {
	                multiLine: false,
	                slice: [start + offset, this.index],
	                range: [start, this.index],
	                loc: loc
	            };
	            comments.push(entry);
	        }
	        return comments;
	    };
	    Scanner.prototype.skipMultiLineComment = function () {
	        var comments = [];
	        var start, loc;
	        if (this.trackComment) {
	            comments = [];
	            start = this.index - 2;
	            loc = {
	                start: {
	                    line: this.lineNumber,
	                    column: this.index - this.lineStart - 2
	                },
	                end: {}
	            };
	        }
	        while (!this.eof()) {
	            var ch = this.source.charCodeAt(this.index);
	            if (character_1.Character.isLineTerminator(ch)) {
	                if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) {
	                    ++this.index;
	                }
	                ++this.lineNumber;
	                ++this.index;
	                this.lineStart = this.index;
	            }
	            else if (ch === 0x2A) {
	                // Block comment ends with '*/'.
	                if (this.source.charCodeAt(this.index + 1) === 0x2F) {
	                    this.index += 2;
	                    if (this.trackComment) {
	                        loc.end = {
	                            line: this.lineNumber,
	                            column: this.index - this.lineStart
	                        };
	                        var entry = {
	                            multiLine: true,
	                            slice: [start + 2, this.index - 2],
	                            range: [start, this.index],
	                            loc: loc
	                        };
	                        comments.push(entry);
	                    }
	                    return comments;
	                }
	                ++this.index;
	            }
	            else {
	                ++this.index;
	            }
	        }
	        // Ran off the end of the file - the whole thing is a comment
	        if (this.trackComment) {
	            loc.end = {
	                line: this.lineNumber,
	                column: this.index - this.lineStart
	            };
	            var entry = {
	                multiLine: true,
	                slice: [start + 2, this.index],
	                range: [start, this.index],
	                loc: loc
	            };
	            comments.push(entry);
	        }
	        this.tolerateUnexpectedToken();
	        return comments;
	    };
	    Scanner.prototype.scanComments = function () {
	        var comments;
	        if (this.trackComment) {
	            comments = [];
	        }
	        var start = (this.index === 0);
	        while (!this.eof()) {
	            var ch = this.source.charCodeAt(this.index);
	            if (character_1.Character.isWhiteSpace(ch)) {
	                ++this.index;
	            }
	            else if (character_1.Character.isLineTerminator(ch)) {
	                ++this.index;
	                if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) {
	                    ++this.index;
	                }
	                ++this.lineNumber;
	                this.lineStart = this.index;
	                start = true;
	            }
	            else if (ch === 0x2F) {
	                ch = this.source.charCodeAt(this.index + 1);
	                if (ch === 0x2F) {
	                    this.index += 2;
	                    var comment = this.skipSingleLineComment(2);
	                    if (this.trackComment) {
	                        comments = comments.concat(comment);
	                    }
	                    start = true;
	                }
	                else if (ch === 0x2A) {
	                    this.index += 2;
	                    var comment = this.skipMultiLineComment();
	                    if (this.trackComment) {
	                        comments = comments.concat(comment);
	                    }
	                }
	                else {
	                    break;
	                }
	            }
	            else if (start && ch === 0x2D) {
	                // U+003E is '>'
	                if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) {
	                    // '-->' is a single-line comment
	                    this.index += 3;
	                    var comment = this.skipSingleLineComment(3);
	                    if (this.trackComment) {
	                        comments = comments.concat(comment);
	                    }
	                }
	                else {
	                    break;
	                }
	            }
	            else if (ch === 0x3C && !this.isModule) {
	                if (this.source.slice(this.index + 1, this.index + 4) === '!--') {
	                    this.index += 4; // `<!--`
	                    var comment = this.skipSingleLineComment(4);
	                    if (this.trackComment) {
	                        comments = comments.concat(comment);
	                    }
	                }
	                else {
	                    break;
	                }
	            }
	            else {
	                break;
	            }
	        }
	        return comments;
	    };
	    // https://tc39.github.io/ecma262/#sec-future-reserved-words
	    Scanner.prototype.isFutureReservedWord = function (id) {
	        switch (id) {
	            case 'enum':
	            case 'export':
	            case 'import':
	            case 'super':
	                return true;
	            default:
	                return false;
	        }
	    };
	    Scanner.prototype.isStrictModeReservedWord = function (id) {
	        switch (id) {
	            case 'implements':
	            case 'interface':
	            case 'package':
	            case 'private':
	            case 'protected':
	            case 'public':
	            case 'static':
	            case 'yield':
	            case 'let':
	                return true;
	            default:
	                return false;
	        }
	    };
	    Scanner.prototype.isRestrictedWord = function (id) {
	        return id === 'eval' || id === 'arguments';
	    };
	    // https://tc39.github.io/ecma262/#sec-keywords
	    Scanner.prototype.isKeyword = function (id) {
	        switch (id.length) {
	            case 2:
	                return (id === 'if') || (id === 'in') || (id === 'do');
	            case 3:
	                return (id === 'var') || (id === 'for') || (id === 'new') ||
	                    (id === 'try') || (id === 'let');
	            case 4:
	                return (id === 'this') || (id === 'else') || (id === 'case') ||
	                    (id === 'void') || (id === 'with') || (id === 'enum');
	            case 5:
	                return (id === 'while') || (id === 'break') || (id === 'catch') ||
	                    (id === 'throw') || (id === 'const') || (id === 'yield') ||
	                    (id === 'class') || (id === 'super');
	            case 6:
	                return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
	                    (id === 'switch') || (id === 'export') || (id === 'import');
	            case 7:
	                return (id === 'default') || (id === 'finally') || (id === 'extends');
	            case 8:
	                return (id === 'function') || (id === 'continue') || (id === 'debugger');
	            case 10:
	                return (id === 'instanceof');
	            default:
	                return false;
	        }
	    };
	    Scanner.prototype.codePointAt = function (i) {
	        var cp = this.source.charCodeAt(i);
	        if (cp >= 0xD800 && cp <= 0xDBFF) {
	            var second = this.source.charCodeAt(i + 1);
	            if (second >= 0xDC00 && second <= 0xDFFF) {
	                var first = cp;
	                cp = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
	            }
	        }
	        return cp;
	    };
	    Scanner.prototype.scanHexEscape = function (prefix) {
	        var len = (prefix === 'u') ? 4 : 2;
	        var code = 0;
	        for (var i = 0; i < len; ++i) {
	            if (!this.eof() && character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {
	                code = code * 16 + hexValue(this.source[this.index++]);
	            }
	            else {
	                return null;
	            }
	        }
	        return String.fromCharCode(code);
	    };
	    Scanner.prototype.scanUnicodeCodePointEscape = function () {
	        var ch = this.source[this.index];
	        var code = 0;
	        // At least, one hex digit is required.
	        if (ch === '}') {
	            this.throwUnexpectedToken();
	        }
	        while (!this.eof()) {
	            ch = this.source[this.index++];
	            if (!character_1.Character.isHexDigit(ch.charCodeAt(0))) {
	                break;
	            }
	            code = code * 16 + hexValue(ch);
	        }
	        if (code > 0x10FFFF || ch !== '}') {
	            this.throwUnexpectedToken();
	        }
	        return character_1.Character.fromCodePoint(code);
	    };
	    Scanner.prototype.getIdentifier = function () {
	        var start = this.index++;
	        while (!this.eof()) {
	            var ch = this.source.charCodeAt(this.index);
	            if (ch === 0x5C) {
	                // Blackslash (U+005C) marks Unicode escape sequence.
	                this.index = start;
	                return this.getComplexIdentifier();
	            }
	            else if (ch >= 0xD800 && ch < 0xDFFF) {
	                // Need to handle surrogate pairs.
	                this.index = start;
	                return this.getComplexIdentifier();
	            }
	            if (character_1.Character.isIdentifierPart(ch)) {
	                ++this.index;
	            }
	            else {
	                break;
	            }
	        }
	        return this.source.slice(start, this.index);
	    };
	    Scanner.prototype.getComplexIdentifier = function () {
	        var cp = this.codePointAt(this.index);
	        var id = character_1.Character.fromCodePoint(cp);
	        this.index += id.length;
	        // '\u' (U+005C, U+0075) denotes an escaped character.
	        var ch;
	        if (cp === 0x5C) {
	            if (this.source.charCodeAt(this.index) !== 0x75) {
	                this.throwUnexpectedToken();
	            }
	            ++this.index;
	            if (this.source[this.index] === '{') {
	                ++this.index;
	                ch = this.scanUnicodeCodePointEscape();
	            }
	            else {
	                ch = this.scanHexEscape('u');
	                if (ch === null || ch === '\\' || !character_1.Character.isIdentifierStart(ch.charCodeAt(0))) {
	                    this.throwUnexpectedToken();
	                }
	            }
	            id = ch;
	        }
	        while (!this.eof()) {
	            cp = this.codePointAt(this.index);
	            if (!character_1.Character.isIdentifierPart(cp)) {
	                break;
	            }
	            ch = character_1.Character.fromCodePoint(cp);
	            id += ch;
	            this.index += ch.length;
	            // '\u' (U+005C, U+0075) denotes an escaped character.
	            if (cp === 0x5C) {
	                id = id.substr(0, id.length - 1);
	                if (this.source.charCodeAt(this.index) !== 0x75) {
	                    this.throwUnexpectedToken();
	                }
	                ++this.index;
	                if (this.source[this.index] === '{') {
	                    ++this.index;
	                    ch = this.scanUnicodeCodePointEscape();
	                }
	                else {
	                    ch = this.scanHexEscape('u');
	                    if (ch === null || ch === '\\' || !character_1.Character.isIdentifierPart(ch.charCodeAt(0))) {
	                        this.throwUnexpectedToken();
	                    }
	                }
	                id += ch;
	            }
	        }
	        return id;
	    };
	    Scanner.prototype.octalToDecimal = function (ch) {
	        // \0 is not octal escape sequence
	        var octal = (ch !== '0');
	        var code = octalValue(ch);
	        if (!this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
	            octal = true;
	            code = code * 8 + octalValue(this.source[this.index++]);
	            // 3 digits are only allowed when string starts
	            // with 0, 1, 2, 3
	            if ('0123'.indexOf(ch) >= 0 && !this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
	                code = code * 8 + octalValue(this.source[this.index++]);
	            }
	        }
	        return {
	            code: code,
	            octal: octal
	        };
	    };
	    // https://tc39.github.io/ecma262/#sec-names-and-keywords
	    Scanner.prototype.scanIdentifier = function () {
	        var type;
	        var start = this.index;
	        // Backslash (U+005C) starts an escaped character.
	        var id = (this.source.charCodeAt(start) === 0x5C) ? this.getComplexIdentifier() : this.getIdentifier();
	        // There is no keyword or literal with only one character.
	        // Thus, it must be an identifier.
	        if (id.length === 1) {
	            type = 3 /* Identifier */;
	        }
	        else if (this.isKeyword(id)) {
	            type = 4 /* Keyword */;
	        }
	        else if (id === 'null') {
	            type = 5 /* NullLiteral */;
	        }
	        else if (id === 'true' || id === 'false') {
	            type = 1 /* BooleanLiteral */;
	        }
	        else {
	            type = 3 /* Identifier */;
	        }
	        if (type !== 3 /* Identifier */ && (start + id.length !== this.index)) {
	            var restore = this.index;
	            this.index = start;
	            this.tolerateUnexpectedToken(messages_1.Messages.InvalidEscapedReservedWord);
	            this.index = restore;
	        }
	        return {
	            type: type,
	            value: id,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    // https://tc39.github.io/ecma262/#sec-punctuators
	    Scanner.prototype.scanPunctuator = function () {
	        var start = this.index;
	        // Check for most common single-character punctuators.
	        var str = this.source[this.index];
	        switch (str) {
	            case '(':
	            case '{':
	                if (str === '{') {
	                    this.curlyStack.push('{');
	                }
	                ++this.index;
	                break;
	            case '.':
	                ++this.index;
	                if (this.source[this.index] === '.' && this.source[this.index + 1] === '.') {
	                    // Spread operator: ...
	                    this.index += 2;
	                    str = '...';
	                }
	                break;
	            case '}':
	                ++this.index;
	                this.curlyStack.pop();
	                break;
	            case ')':
	            case ';':
	            case ',':
	            case '[':
	            case ']':
	            case ':':
	            case '?':
	            case '~':
	                ++this.index;
	                break;
	            default:
	                // 4-character punctuator.
	                str = this.source.substr(this.index, 4);
	                if (str === '>>>=') {
	                    this.index += 4;
	                }
	                else {
	                    // 3-character punctuators.
	                    str = str.substr(0, 3);
	                    if (str === '===' || str === '!==' || str === '>>>' ||
	                        str === '<<=' || str === '>>=' || str === '**=') {
	                        this.index += 3;
	                    }
	                    else {
	                        // 2-character punctuators.
	                        str = str.substr(0, 2);
	                        if (str === '&&' || str === '||' || str === '==' || str === '!=' ||
	                            str === '+=' || str === '-=' || str === '*=' || str === '/=' ||
	                            str === '++' || str === '--' || str === '<<' || str === '>>' ||
	                            str === '&=' || str === '|=' || str === '^=' || str === '%=' ||
	                            str === '<=' || str === '>=' || str === '=>' || str === '**') {
	                            this.index += 2;
	                        }
	                        else {
	                            // 1-character punctuators.
	                            str = this.source[this.index];
	                            if ('<>=!+-*%&|^/'.indexOf(str) >= 0) {
	                                ++this.index;
	                            }
	                        }
	                    }
	                }
	        }
	        if (this.index === start) {
	            this.throwUnexpectedToken();
	        }
	        return {
	            type: 7 /* Punctuator */,
	            value: str,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    // https://tc39.github.io/ecma262/#sec-literals-numeric-literals
	    Scanner.prototype.scanHexLiteral = function (start) {
	        var num = '';
	        while (!this.eof()) {
	            if (!character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {
	                break;
	            }
	            num += this.source[this.index++];
	        }
	        if (num.length === 0) {
	            this.throwUnexpectedToken();
	        }
	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {
	            this.throwUnexpectedToken();
	        }
	        return {
	            type: 6 /* NumericLiteral */,
	            value: parseInt('0x' + num, 16),
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    Scanner.prototype.scanBinaryLiteral = function (start) {
	        var num = '';
	        var ch;
	        while (!this.eof()) {
	            ch = this.source[this.index];
	            if (ch !== '0' && ch !== '1') {
	                break;
	            }
	            num += this.source[this.index++];
	        }
	        if (num.length === 0) {
	            // only 0b or 0B
	            this.throwUnexpectedToken();
	        }
	        if (!this.eof()) {
	            ch = this.source.charCodeAt(this.index);
	            /* istanbul ignore else */
	            if (character_1.Character.isIdentifierStart(ch) || character_1.Character.isDecimalDigit(ch)) {
	                this.throwUnexpectedToken();
	            }
	        }
	        return {
	            type: 6 /* NumericLiteral */,
	            value: parseInt(num, 2),
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    Scanner.prototype.scanOctalLiteral = function (prefix, start) {
	        var num = '';
	        var octal = false;
	        if (character_1.Character.isOctalDigit(prefix.charCodeAt(0))) {
	            octal = true;
	            num = '0' + this.source[this.index++];
	        }
	        else {
	            ++this.index;
	        }
	        while (!this.eof()) {
	            if (!character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
	                break;
	            }
	            num += this.source[this.index++];
	        }
	        if (!octal && num.length === 0) {
	            // only 0o or 0O
	            this.throwUnexpectedToken();
	        }
	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index)) || character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
	            this.throwUnexpectedToken();
	        }
	        return {
	            type: 6 /* NumericLiteral */,
	            value: parseInt(num, 8),
	            octal: octal,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    Scanner.prototype.isImplicitOctalLiteral = function () {
	        // Implicit octal, unless there is a non-octal digit.
	        // (Annex B.1.1 on Numeric Literals)
	        for (var i = this.index + 1; i < this.length; ++i) {
	            var ch = this.source[i];
	            if (ch === '8' || ch === '9') {
	                return false;
	            }
	            if (!character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
	                return true;
	            }
	        }
	        return true;
	    };
	    Scanner.prototype.scanNumericLiteral = function () {
	        var start = this.index;
	        var ch = this.source[start];
	        assert_1.assert(character_1.Character.isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'), 'Numeric literal must start with a decimal digit or a decimal point');
	        var num = '';
	        if (ch !== '.') {
	            num = this.source[this.index++];
	            ch = this.source[this.index];
	            // Hex number starts with '0x'.
	            // Octal number starts with '0'.
	            // Octal number in ES6 starts with '0o'.
	            // Binary number in ES6 starts with '0b'.
	            if (num === '0') {
	                if (ch === 'x' || ch === 'X') {
	                    ++this.index;
	                    return this.scanHexLiteral(start);
	                }
	                if (ch === 'b' || ch === 'B') {
	                    ++this.index;
	                    return this.scanBinaryLiteral(start);
	                }
	                if (ch === 'o' || ch === 'O') {
	                    return this.scanOctalLiteral(ch, start);
	                }
	                if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
	                    if (this.isImplicitOctalLiteral()) {
	                        return this.scanOctalLiteral(ch, start);
	                    }
	                }
	            }
	            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
	                num += this.source[this.index++];
	            }
	            ch = this.source[this.index];
	        }
	        if (ch === '.') {
	            num += this.source[this.index++];
	            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
	                num += this.source[this.index++];
	            }
	            ch = this.source[this.index];
	        }
	        if (ch === 'e' || ch === 'E') {
	            num += this.source[this.index++];
	            ch = this.source[this.index];
	            if (ch === '+' || ch === '-') {
	                num += this.source[this.index++];
	            }
	            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
	                while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
	                    num += this.source[this.index++];
	                }
	            }
	            else {
	                this.throwUnexpectedToken();
	            }
	        }
	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {
	            this.throwUnexpectedToken();
	        }
	        return {
	            type: 6 /* NumericLiteral */,
	            value: parseFloat(num),
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    // https://tc39.github.io/ecma262/#sec-literals-string-literals
	    Scanner.prototype.scanStringLiteral = function () {
	        var start = this.index;
	        var quote = this.source[start];
	        assert_1.assert((quote === '\'' || quote === '"'), 'String literal must starts with a quote');
	        ++this.index;
	        var octal = false;
	        var str = '';
	        while (!this.eof()) {
	            var ch = this.source[this.index++];
	            if (ch === quote) {
	                quote = '';
	                break;
	            }
	            else if (ch === '\\') {
	                ch = this.source[this.index++];
	                if (!ch || !character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                    switch (ch) {
	                        case 'u':
	                            if (this.source[this.index] === '{') {
	                                ++this.index;
	                                str += this.scanUnicodeCodePointEscape();
	                            }
	                            else {
	                                var unescaped_1 = this.scanHexEscape(ch);
	                                if (unescaped_1 === null) {
	                                    this.throwUnexpectedToken();
	                                }
	                                str += unescaped_1;
	                            }
	                            break;
	                        case 'x':
	                            var unescaped = this.scanHexEscape(ch);
	                            if (unescaped === null) {
	                                this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence);
	                            }
	                            str += unescaped;
	                            break;
	                        case 'n':
	                            str += '\n';
	                            break;
	                        case 'r':
	                            str += '\r';
	                            break;
	                        case 't':
	                            str += '\t';
	                            break;
	                        case 'b':
	                            str += '\b';
	                            break;
	                        case 'f':
	                            str += '\f';
	                            break;
	                        case 'v':
	                            str += '\x0B';
	                            break;
	                        case '8':
	                        case '9':
	                            str += ch;
	                            this.tolerateUnexpectedToken();
	                            break;
	                        default:
	                            if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
	                                var octToDec = this.octalToDecimal(ch);
	                                octal = octToDec.octal || octal;
	                                str += String.fromCharCode(octToDec.code);
	                            }
	                            else {
	                                str += ch;
	                            }
	                            break;
	                    }
	                }
	                else {
	                    ++this.lineNumber;
	                    if (ch === '\r' && this.source[this.index] === '\n') {
	                        ++this.index;
	                    }
	                    this.lineStart = this.index;
	                }
	            }
	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                break;
	            }
	            else {
	                str += ch;
	            }
	        }
	        if (quote !== '') {
	            this.index = start;
	            this.throwUnexpectedToken();
	        }
	        return {
	            type: 8 /* StringLiteral */,
	            value: str,
	            octal: octal,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    // https://tc39.github.io/ecma262/#sec-template-literal-lexical-components
	    Scanner.prototype.scanTemplate = function () {
	        var cooked = '';
	        var terminated = false;
	        var start = this.index;
	        var head = (this.source[start] === '`');
	        var tail = false;
	        var rawOffset = 2;
	        ++this.index;
	        while (!this.eof()) {
	            var ch = this.source[this.index++];
	            if (ch === '`') {
	                rawOffset = 1;
	                tail = true;
	                terminated = true;
	                break;
	            }
	            else if (ch === '$') {
	                if (this.source[this.index] === '{') {
	                    this.curlyStack.push('${');
	                    ++this.index;
	                    terminated = true;
	                    break;
	                }
	                cooked += ch;
	            }
	            else if (ch === '\\') {
	                ch = this.source[this.index++];
	                if (!character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                    switch (ch) {
	                        case 'n':
	                            cooked += '\n';
	                            break;
	                        case 'r':
	                            cooked += '\r';
	                            break;
	                        case 't':
	                            cooked += '\t';
	                            break;
	                        case 'u':
	                            if (this.source[this.index] === '{') {
	                                ++this.index;
	                                cooked += this.scanUnicodeCodePointEscape();
	                            }
	                            else {
	                                var restore = this.index;
	                                var unescaped_2 = this.scanHexEscape(ch);
	                                if (unescaped_2 !== null) {
	                                    cooked += unescaped_2;
	                                }
	                                else {
	                                    this.index = restore;
	                                    cooked += ch;
	                                }
	                            }
	                            break;
	                        case 'x':
	                            var unescaped = this.scanHexEscape(ch);
	                            if (unescaped === null) {
	                                this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence);
	                            }
	                            cooked += unescaped;
	                            break;
	                        case 'b':
	                            cooked += '\b';
	                            break;
	                        case 'f':
	                            cooked += '\f';
	                            break;
	                        case 'v':
	                            cooked += '\v';
	                            break;
	                        default:
	                            if (ch === '0') {
	                                if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
	                                    // Illegal: \01 \02 and so on
	                                    this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);
	                                }
	                                cooked += '\0';
	                            }
	                            else if (character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
	                                // Illegal: \1 \2
	                                this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);
	                            }
	                            else {
	                                cooked += ch;
	                            }
	                            break;
	                    }
	                }
	                else {
	                    ++this.lineNumber;
	                    if (ch === '\r' && this.source[this.index] === '\n') {
	                        ++this.index;
	                    }
	                    this.lineStart = this.index;
	                }
	            }
	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                ++this.lineNumber;
	                if (ch === '\r' && this.source[this.index] === '\n') {
	                    ++this.index;
	                }
	                this.lineStart = this.index;
	                cooked += '\n';
	            }
	            else {
	                cooked += ch;
	            }
	        }
	        if (!terminated) {
	            this.throwUnexpectedToken();
	        }
	        if (!head) {
	            this.curlyStack.pop();
	        }
	        return {
	            type: 10 /* Template */,
	            value: this.source.slice(start + 1, this.index - rawOffset),
	            cooked: cooked,
	            head: head,
	            tail: tail,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals
	    Scanner.prototype.testRegExp = function (pattern, flags) {
	        // The BMP character to use as a replacement for astral symbols when
	        // translating an ES6 "u"-flagged pattern to an ES5-compatible
	        // approximation.
	        // Note: replacing with '\uFFFF' enables false positives in unlikely
	        // scenarios. For example, `[\u{1044f}-\u{10440}]` is an invalid
	        // pattern that would not be detected by this substitution.
	        var astralSubstitute = '\uFFFF';
	        var tmp = pattern;
	        var self = this;
	        if (flags.indexOf('u') >= 0) {
	            tmp = tmp
	                .replace(/\\u\{([0-9a-fA-F]+)\}|\\u([a-fA-F0-9]{4})/g, function ($0, $1, $2) {
	                var codePoint = parseInt($1 || $2, 16);
	                if (codePoint > 0x10FFFF) {
	                    self.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);
	                }
	                if (codePoint <= 0xFFFF) {
	                    return String.fromCharCode(codePoint);
	                }
	                return astralSubstitute;
	            })
	                .replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, astralSubstitute);
	        }
	        // First, detect invalid regular expressions.
	        try {
	            RegExp(tmp);
	        }
	        catch (e) {
	            this.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);
	        }
	        // Return a regular expression object for this pattern-flag pair, or
	        // `null` in case the current environment doesn't support the flags it
	        // uses.
	        try {
	            return new RegExp(pattern, flags);
	        }
	        catch (exception) {
	            /* istanbul ignore next */
	            return null;
	        }
	    };
	    Scanner.prototype.scanRegExpBody = function () {
	        var ch = this.source[this.index];
	        assert_1.assert(ch === '/', 'Regular expression literal must start with a slash');
	        var str = this.source[this.index++];
	        var classMarker = false;
	        var terminated = false;
	        while (!this.eof()) {
	            ch = this.source[this.index++];
	            str += ch;
	            if (ch === '\\') {
	                ch = this.source[this.index++];
	                // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals
	                if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                    this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
	                }
	                str += ch;
	            }
	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
	            }
	            else if (classMarker) {
	                if (ch === ']') {
	                    classMarker = false;
	                }
	            }
	            else {
	                if (ch === '/') {
	                    terminated = true;
	                    break;
	                }
	                else if (ch === '[') {
	                    classMarker = true;
	                }
	            }
	        }
	        if (!terminated) {
	            this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
	        }
	        // Exclude leading and trailing slash.
	        return str.substr(1, str.length - 2);
	    };
	    Scanner.prototype.scanRegExpFlags = function () {
	        var str = '';
	        var flags = '';
	        while (!this.eof()) {
	            var ch = this.source[this.index];
	            if (!character_1.Character.isIdentifierPart(ch.charCodeAt(0))) {
	                break;
	            }
	            ++this.index;
	            if (ch === '\\' && !this.eof()) {
	                ch = this.source[this.index];
	                if (ch === 'u') {
	                    ++this.index;
	                    var restore = this.index;
	                    var char = this.scanHexEscape('u');
	                    if (char !== null) {
	                        flags += char;
	                        for (str += '\\u'; restore < this.index; ++restore) {
	                            str += this.source[restore];
	                        }
	                    }
	                    else {
	                        this.index = restore;
	                        flags += 'u';
	                        str += '\\u';
	                    }
	                    this.tolerateUnexpectedToken();
	                }
	                else {
	                    str += '\\';
	                    this.tolerateUnexpectedToken();
	                }
	            }
	            else {
	                flags += ch;
	                str += ch;
	            }
	        }
	        return flags;
	    };
	    Scanner.prototype.scanRegExp = function () {
	        var start = this.index;
	        var pattern = this.scanRegExpBody();
	        var flags = this.scanRegExpFlags();
	        var value = this.testRegExp(pattern, flags);
	        return {
	            type: 9 /* RegularExpression */,
	            value: '',
	            pattern: pattern,
	            flags: flags,
	            regex: value,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    Scanner.prototype.lex = function () {
	        if (this.eof()) {
	            return {
	                type: 2 /* EOF */,
	                value: '',
	                lineNumber: this.lineNumber,
	                lineStart: this.lineStart,
	                start: this.index,
	                end: this.index
	            };
	        }
	        var cp = this.source.charCodeAt(this.index);
	        if (character_1.Character.isIdentifierStart(cp)) {
	            return this.scanIdentifier();
	        }
	        // Very common: ( and ) and ;
	        if (cp === 0x28 || cp === 0x29 || cp === 0x3B) {
	            return this.scanPunctuator();
	        }
	        // String literal starts with single quote (U+0027) or double quote (U+0022).
	        if (cp === 0x27 || cp === 0x22) {
	            return this.scanStringLiteral();
	        }
	        // Dot (.) U+002E can also start a floating-point number, hence the need
	        // to check the next character.
	        if (cp === 0x2E) {
	            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index + 1))) {
	                return this.scanNumericLiteral();
	            }
	            return this.scanPunctuator();
	        }
	        if (character_1.Character.isDecimalDigit(cp)) {
	            return this.scanNumericLiteral();
	        }
	        // Template literals start with ` (U+0060) for template head
	        // or } (U+007D) for template middle or template tail.
	        if (cp === 0x60 || (cp === 0x7D && this.curlyStack[this.curlyStack.length - 1] === '${')) {
	            return this.scanTemplate();
	        }
	        // Possible identifier start in a surrogate pair.
	        if (cp >= 0xD800 && cp < 0xDFFF) {
	            if (character_1.Character.isIdentifierStart(this.codePointAt(this.index))) {
	                return this.scanIdentifier();
	            }
	        }
	        return this.scanPunctuator();
	    };
	    return Scanner;
	}());
	exports.Scanner = Scanner;


/***/ },
/* 13 */
/***/ function(module, exports) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	exports.TokenName = {};
	exports.TokenName[1 /* BooleanLiteral */] = 'Boolean';
	exports.TokenName[2 /* EOF */] = '<end>';
	exports.TokenName[3 /* Identifier */] = 'Identifier';
	exports.TokenName[4 /* Keyword */] = 'Keyword';
	exports.TokenName[5 /* NullLiteral */] = 'Null';
	exports.TokenName[6 /* NumericLiteral */] = 'Numeric';
	exports.TokenName[7 /* Punctuator */] = 'Punctuator';
	exports.TokenName[8 /* StringLiteral */] = 'String';
	exports.TokenName[9 /* RegularExpression */] = 'RegularExpression';
	exports.TokenName[10 /* Template */] = 'Template';


/***/ },
/* 14 */
/***/ function(module, exports) {

	"use strict";
	// Generated by generate-xhtml-entities.js. DO NOT MODIFY!
	Object.defineProperty(exports, "__esModule", { value: true });
	exports.XHTMLEntities = {
	    quot: '\u0022',
	    amp: '\u0026',
	    apos: '\u0027',
	    gt: '\u003E',
	    nbsp: '\u00A0',
	    iexcl: '\u00A1',
	    cent: '\u00A2',
	    pound: '\u00A3',
	    curren: '\u00A4',
	    yen: '\u00A5',
	    brvbar: '\u00A6',
	    sect: '\u00A7',
	    uml: '\u00A8',
	    copy: '\u00A9',
	    ordf: '\u00AA',
	    laquo: '\u00AB',
	    not: '\u00AC',
	    shy: '\u00AD',
	    reg: '\u00AE',
	    macr: '\u00AF',
	    deg: '\u00B0',
	    plusmn: '\u00B1',
	    sup2: '\u00B2',
	    sup3: '\u00B3',
	    acute: '\u00B4',
	    micro: '\u00B5',
	    para: '\u00B6',
	    middot: '\u00B7',
	    cedil: '\u00B8',
	    sup1: '\u00B9',
	    ordm: '\u00BA',
	    raquo: '\u00BB',
	    frac14: '\u00BC',
	    frac12: '\u00BD',
	    frac34: '\u00BE',
	    iquest: '\u00BF',
	    Agrave: '\u00C0',
	    Aacute: '\u00C1',
	    Acirc: '\u00C2',
	    Atilde: '\u00C3',
	    Auml: '\u00C4',
	    Aring: '\u00C5',
	    AElig: '\u00C6',
	    Ccedil: '\u00C7',
	    Egrave: '\u00C8',
	    Eacute: '\u00C9',
	    Ecirc: '\u00CA',
	    Euml: '\u00CB',
	    Igrave: '\u00CC',
	    Iacute: '\u00CD',
	    Icirc: '\u00CE',
	    Iuml: '\u00CF',
	    ETH: '\u00D0',
	    Ntilde: '\u00D1',
	    Ograve: '\u00D2',
	    Oacute: '\u00D3',
	    Ocirc: '\u00D4',
	    Otilde: '\u00D5',
	    Ouml: '\u00D6',
	    times: '\u00D7',
	    Oslash: '\u00D8',
	    Ugrave: '\u00D9',
	    Uacute: '\u00DA',
	    Ucirc: '\u00DB',
	    Uuml: '\u00DC',
	    Yacute: '\u00DD',
	    THORN: '\u00DE',
	    szlig: '\u00DF',
	    agrave: '\u00E0',
	    aacute: '\u00E1',
	    acirc: '\u00E2',
	    atilde: '\u00E3',
	    auml: '\u00E4',
	    aring: '\u00E5',
	    aelig: '\u00E6',
	    ccedil: '\u00E7',
	    egrave: '\u00E8',
	    eacute: '\u00E9',
	    ecirc: '\u00EA',
	    euml: '\u00EB',
	    igrave: '\u00EC',
	    iacute: '\u00ED',
	    icirc: '\u00EE',
	    iuml: '\u00EF',
	    eth: '\u00F0',
	    ntilde: '\u00F1',
	    ograve: '\u00F2',
	    oacute: '\u00F3',
	    ocirc: '\u00F4',
	    otilde: '\u00F5',
	    ouml: '\u00F6',
	    divide: '\u00F7',
	    oslash: '\u00F8',
	    ugrave: '\u00F9',
	    uacute: '\u00FA',
	    ucirc: '\u00FB',
	    uuml: '\u00FC',
	    yacute: '\u00FD',
	    thorn: '\u00FE',
	    yuml: '\u00FF',
	    OElig: '\u0152',
	    oelig: '\u0153',
	    Scaron: '\u0160',
	    scaron: '\u0161',
	    Yuml: '\u0178',
	    fnof: '\u0192',
	    circ: '\u02C6',
	    tilde: '\u02DC',
	    Alpha: '\u0391',
	    Beta: '\u0392',
	    Gamma: '\u0393',
	    Delta: '\u0394',
	    Epsilon: '\u0395',
	    Zeta: '\u0396',
	    Eta: '\u0397',
	    Theta: '\u0398',
	    Iota: '\u0399',
	    Kappa: '\u039A',
	    Lambda: '\u039B',
	    Mu: '\u039C',
	    Nu: '\u039D',
	    Xi: '\u039E',
	    Omicron: '\u039F',
	    Pi: '\u03A0',
	    Rho: '\u03A1',
	    Sigma: '\u03A3',
	    Tau: '\u03A4',
	    Upsilon: '\u03A5',
	    Phi: '\u03A6',
	    Chi: '\u03A7',
	    Psi: '\u03A8',
	    Omega: '\u03A9',
	    alpha: '\u03B1',
	    beta: '\u03B2',
	    gamma: '\u03B3',
	    delta: '\u03B4',
	    epsilon: '\u03B5',
	    zeta: '\u03B6',
	    eta: '\u03B7',
	    theta: '\u03B8',
	    iota: '\u03B9',
	    kappa: '\u03BA',
	    lambda: '\u03BB',
	    mu: '\u03BC',
	    nu: '\u03BD',
	    xi: '\u03BE',
	    omicron: '\u03BF',
	    pi: '\u03C0',
	    rho: '\u03C1',
	    sigmaf: '\u03C2',
	    sigma: '\u03C3',
	    tau: '\u03C4',
	    upsilon: '\u03C5',
	    phi: '\u03C6',
	    chi: '\u03C7',
	    psi: '\u03C8',
	    omega: '\u03C9',
	    thetasym: '\u03D1',
	    upsih: '\u03D2',
	    piv: '\u03D6',
	    ensp: '\u2002',
	    emsp: '\u2003',
	    thinsp: '\u2009',
	    zwnj: '\u200C',
	    zwj: '\u200D',
	    lrm: '\u200E',
	    rlm: '\u200F',
	    ndash: '\u2013',
	    mdash: '\u2014',
	    lsquo: '\u2018',
	    rsquo: '\u2019',
	    sbquo: '\u201A',
	    ldquo: '\u201C',
	    rdquo: '\u201D',
	    bdquo: '\u201E',
	    dagger: '\u2020',
	    Dagger: '\u2021',
	    bull: '\u2022',
	    hellip: '\u2026',
	    permil: '\u2030',
	    prime: '\u2032',
	    Prime: '\u2033',
	    lsaquo: '\u2039',
	    rsaquo: '\u203A',
	    oline: '\u203E',
	    frasl: '\u2044',
	    euro: '\u20AC',
	    image: '\u2111',
	    weierp: '\u2118',
	    real: '\u211C',
	    trade: '\u2122',
	    alefsym: '\u2135',
	    larr: '\u2190',
	    uarr: '\u2191',
	    rarr: '\u2192',
	    darr: '\u2193',
	    harr: '\u2194',
	    crarr: '\u21B5',
	    lArr: '\u21D0',
	    uArr: '\u21D1',
	    rArr: '\u21D2',
	    dArr: '\u21D3',
	    hArr: '\u21D4',
	    forall: '\u2200',
	    part: '\u2202',
	    exist: '\u2203',
	    empty: '\u2205',
	    nabla: '\u2207',
	    isin: '\u2208',
	    notin: '\u2209',
	    ni: '\u220B',
	    prod: '\u220F',
	    sum: '\u2211',
	    minus: '\u2212',
	    lowast: '\u2217',
	    radic: '\u221A',
	    prop: '\u221D',
	    infin: '\u221E',
	    ang: '\u2220',
	    and: '\u2227',
	    or: '\u2228',
	    cap: '\u2229',
	    cup: '\u222A',
	    int: '\u222B',
	    there4: '\u2234',
	    sim: '\u223C',
	    cong: '\u2245',
	    asymp: '\u2248',
	    ne: '\u2260',
	    equiv: '\u2261',
	    le: '\u2264',
	    ge: '\u2265',
	    sub: '\u2282',
	    sup: '\u2283',
	    nsub: '\u2284',
	    sube: '\u2286',
	    supe: '\u2287',
	    oplus: '\u2295',
	    otimes: '\u2297',
	    perp: '\u22A5',
	    sdot: '\u22C5',
	    lceil: '\u2308',
	    rceil: '\u2309',
	    lfloor: '\u230A',
	    rfloor: '\u230B',
	    loz: '\u25CA',
	    spades: '\u2660',
	    clubs: '\u2663',
	    hearts: '\u2665',
	    diams: '\u2666',
	    lang: '\u27E8',
	    rang: '\u27E9'
	};


/***/ },
/* 15 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	var error_handler_1 = __webpack_require__(10);
	var scanner_1 = __webpack_require__(12);
	var token_1 = __webpack_require__(13);
	var Reader = (function () {
	    function Reader() {
	        this.values = [];
	        this.curly = this.paren = -1;
	    }
	    // A function following one of those tokens is an expression.
	    Reader.prototype.beforeFunctionExpression = function (t) {
	        return ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',
	            'return', 'case', 'delete', 'throw', 'void',
	            // assignment operators
	            '=', '+=', '-=', '*=', '**=', '/=', '%=', '<<=', '>>=', '>>>=',
	            '&=', '|=', '^=', ',',
	            // binary/unary operators
	            '+', '-', '*', '**', '/', '%', '++', '--', '<<', '>>', '>>>', '&',
	            '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',
	            '<=', '<', '>', '!=', '!=='].indexOf(t) >= 0;
	    };
	    // Determine if forward slash (/) is an operator or part of a regular expression
	    // https://github.com/mozilla/sweet.js/wiki/design
	    Reader.prototype.isRegexStart = function () {
	        var previous = this.values[this.values.length - 1];
	        var regex = (previous !== null);
	        switch (previous) {
	            case 'this':
	            case ']':
	                regex = false;
	                break;
	            case ')':
	                var keyword = this.values[this.paren - 1];
	                regex = (keyword === 'if' || keyword === 'while' || keyword === 'for' || keyword === 'with');
	                break;
	            case '}':
	                // Dividing a function by anything makes little sense,
	                // but we have to check for that.
	                regex = false;
	                if (this.values[this.curly - 3] === 'function') {
	                    // Anonymous function, e.g. function(){} /42
	                    var check = this.values[this.curly - 4];
	                    regex = check ? !this.beforeFunctionExpression(check) : false;
	                }
	                else if (this.values[this.curly - 4] === 'function') {
	                    // Named function, e.g. function f(){} /42/
	                    var check = this.values[this.curly - 5];
	                    regex = check ? !this.beforeFunctionExpression(check) : true;
	                }
	                break;
	            default:
	                break;
	        }
	        return regex;
	    };
	    Reader.prototype.push = function (token) {
	        if (token.type === 7 /* Punctuator */ || token.type === 4 /* Keyword */) {
	            if (token.value === '{') {
	                this.curly = this.values.length;
	            }
	            else if (token.value === '(') {
	                this.paren = this.values.length;
	            }
	            this.values.push(token.value);
	        }
	        else {
	            this.values.push(null);
	        }
	    };
	    return Reader;
	}());
	var Tokenizer = (function () {
	    function Tokenizer(code, config) {
	        this.errorHandler = new error_handler_1.ErrorHandler();
	        this.errorHandler.tolerant = config ? (typeof config.tolerant === 'boolean' && config.tolerant) : false;
	        this.scanner = new scanner_1.Scanner(code, this.errorHandler);
	        this.scanner.trackComment = config ? (typeof config.comment === 'boolean' && config.comment) : false;
	        this.trackRange = config ? (typeof config.range === 'boolean' && config.range) : false;
	        this.trackLoc = config ? (typeof config.loc === 'boolean' && config.loc) : false;
	        this.buffer = [];
	        this.reader = new Reader();
	    }
	    Tokenizer.prototype.errors = function () {
	        return this.errorHandler.errors;
	    };
	    Tokenizer.prototype.getNextToken = function () {
	        if (this.buffer.length === 0) {
	            var comments = this.scanner.scanComments();
	            if (this.scanner.trackComment) {
	                for (var i = 0; i < comments.length; ++i) {
	                    var e = comments[i];
	                    var value = this.scanner.source.slice(e.slice[0], e.slice[1]);
	                    var comment = {
	                        type: e.multiLine ? 'BlockComment' : 'LineComment',
	                        value: value
	                    };
	                    if (this.trackRange) {
	                        comment.range = e.range;
	                    }
	                    if (this.trackLoc) {
	                        comment.loc = e.loc;
	                    }
	                    this.buffer.push(comment);
	                }
	            }
	            if (!this.scanner.eof()) {
	                var loc = void 0;
	                if (this.trackLoc) {
	                    loc = {
	                        start: {
	                            line: this.scanner.lineNumber,
	                            column: this.scanner.index - this.scanner.lineStart
	                        },
	                        end: {}
	                    };
	                }
	                var startRegex = (this.scanner.source[this.scanner.index] === '/') && this.reader.isRegexStart();
	                var token = startRegex ? this.scanner.scanRegExp() : this.scanner.lex();
	                this.reader.push(token);
	                var entry = {
	                    type: token_1.TokenName[token.type],
	                    value: this.scanner.source.slice(token.start, token.end)
	                };
	                if (this.trackRange) {
	                    entry.range = [token.start, token.end];
	                }
	                if (this.trackLoc) {
	                    loc.end = {
	                        line: this.scanner.lineNumber,
	                        column: this.scanner.index - this.scanner.lineStart
	                    };
	                    entry.loc = loc;
	                }
	                if (token.type === 9 /* RegularExpression */) {
	                    var pattern = token.pattern;
	                    var flags = token.flags;
	                    entry.regex = { pattern: pattern, flags: flags };
	                }
	                this.buffer.push(entry);
	            }
	        }
	        return this.buffer.shift();
	    };
	    return Tokenizer;
	}());
	exports.Tokenizer = Tokenizer;


/***/ }
/******/ ])
});
;#!/usr/bin/env node
/*
  Copyright JS Foundation and other contributors, https://js.foundation/

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*jslint sloppy:true node:true rhino:true */

var fs, esprima, fname, forceFile, content, options, syntax;

if (typeof require === 'function') {
    fs = require('fs');
    try {
        esprima = require('esprima');
    } catch (e) {
        esprima = require('../');
    }
} else if (typeof load === 'function') {
    try {
        load('esprima.js');
    } catch (e) {
        load('../esprima.js');
    }
}

// Shims to Node.js objects when running under Rhino.
if (typeof console === 'undefined' && typeof process === 'undefined') {
    console = { log: print };
    fs = { readFileSync: readFile };
    process = { argv: arguments, exit: quit };
    process.argv.unshift('esparse.js');
    process.argv.unshift('rhino');
}

function showUsage() {
    console.log('Usage:');
    console.log('   esparse [options] [file.js]');
    console.log();
    console.log('Available options:');
    console.log();
    console.log('  --comment      Gather all line and block comments in an array');
    console.log('  --loc          Include line-column location info for each syntax node');
    console.log('  --range        Include index-based range for each syntax node');
    console.log('  --raw          Display the raw value of literals');
    console.log('  --tokens       List all tokens in an array');
    console.log('  --tolerant     Tolerate errors on a best-effort basis (experimental)');
    console.log('  -v, --version  Shows program version');
    console.log();
    process.exit(1);
}

options = {};

process.argv.splice(2).forEach(function (entry) {

    if (forceFile || entry === '-' || entry.slice(0, 1) !== '-') {
        if (typeof fname === 'string') {
            console.log('Error: more than one input file.');
            process.exit(1);
        } else {
            fname = entry;
        }
    } else if (entry === '-h' || entry === '--help') {
        showUsage();
    } else if (entry === '-v' || entry === '--version') {
        console.log('ECMAScript Parser (using Esprima version', esprima.version, ')');
        console.log();
        process.exit(0);
    } else if (entry === '--comment') {
        options.comment = true;
    } else if (entry === '--loc') {
        options.loc = true;
    } else if (entry === '--range') {
        options.range = true;
    } else if (entry === '--raw') {
        options.raw = true;
    } else if (entry === '--tokens') {
        options.tokens = true;
    } else if (entry === '--tolerant') {
        options.tolerant = true;
    } else if (entry === '--') {
        forceFile = true;
    } else {
        console.log('Error: unknown option ' + entry + '.');
        process.exit(1);
    }
});

// Special handling for regular expression literal since we need to
// convert it to a string literal, otherwise it will be decoded
// as object "{}" and the regular expression would be lost.
function adjustRegexLiteral(key, value) {
    if (key === 'value' && value instanceof RegExp) {
        value = value.toString();
    }
    return value;
}

function run(content) {
    syntax = esprima.parse(content, options);
    console.log(JSON.stringify(syntax, adjustRegexLiteral, 4));
}

try {
    if (fname && (fname !== '-' || forceFile)) {
        run(fs.readFileSync(fname, 'utf-8'));
    } else {
        var content = '';
        process.stdin.resume();
        process.stdin.on('data', function(chunk) {
            content += chunk;
        });
        process.stdin.on('end', function() {
            run(content);
        });
    }
} catch (e) {
    console.log('Error: ' + e.message);
    process.exit(1);
}
#!/usr/bin/env node
/*
  Copyright JS Foundation and other contributors, https://js.foundation/

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*jslint sloppy:true plusplus:true node:true rhino:true */
/*global phantom:true */

var fs, system, esprima, options, fnames, forceFile, count;

if (typeof esprima === 'undefined') {
    // PhantomJS can only require() relative files
    if (typeof phantom === 'object') {
        fs = require('fs');
        system = require('system');
        esprima = require('./esprima');
    } else if (typeof require === 'function') {
        fs = require('fs');
        try {
            esprima = require('esprima');
        } catch (e) {
            esprima = require('../');
        }
    } else if (typeof load === 'function') {
        try {
            load('esprima.js');
        } catch (e) {
            load('../esprima.js');
        }
    }
}

// Shims to Node.js objects when running under PhantomJS 1.7+.
if (typeof phantom === 'object') {
    fs.readFileSync = fs.read;
    process = {
        argv: [].slice.call(system.args),
        exit: phantom.exit,
        on: function (evt, callback) {
            callback();
        }
    };
    process.argv.unshift('phantomjs');
}

// Shims to Node.js objects when running under Rhino.
if (typeof console === 'undefined' && typeof process === 'undefined') {
    console = { log: print };
    fs = { readFileSync: readFile };
    process = {
        argv: arguments,
        exit: quit,
        on: function (evt, callback) {
            callback();
        }
    };
    process.argv.unshift('esvalidate.js');
    process.argv.unshift('rhino');
}

function showUsage() {
    console.log('Usage:');
    console.log('   esvalidate [options] [file.js...]');
    console.log();
    console.log('Available options:');
    console.log();
    console.log('  --format=type  Set the report format, plain (default) or junit');
    console.log('  -v, --version  Print program version');
    console.log();
    process.exit(1);
}

options = {
    format: 'plain'
};

fnames = [];

process.argv.splice(2).forEach(function (entry) {

    if (forceFile || entry === '-' || entry.slice(0, 1) !== '-') {
        fnames.push(entry);
    } else if (entry === '-h' || entry === '--help') {
        showUsage();
    } else if (entry === '-v' || entry === '--version') {
        console.log('ECMAScript Validator (using Esprima version', esprima.version, ')');
        console.log();
        process.exit(0);
    } else if (entry.slice(0, 9) === '--format=') {
        options.format = entry.slice(9);
        if (options.format !== 'plain' && options.format !== 'junit') {
            console.log('Error: unknown report format ' + options.format + '.');
            process.exit(1);
        }
    } else if (entry === '--') {
        forceFile = true;
    } else {
        console.log('Error: unknown option ' + entry + '.');
        process.exit(1);
    }
});

if (fnames.length === 0) {
    fnames.push('');
}

if (options.format === 'junit') {
    console.log('<?xml version="1.0" encoding="UTF-8"?>');
    console.log('<testsuites>');
}

count = 0;

function run(fname, content) {
    var timestamp, syntax, name;
    try {
        if (typeof content !== 'string') {
            throw content;
        }

        if (content[0] === '#' && content[1] === '!') {
            content = '//' + content.substr(2, content.length);
        }

        timestamp = Date.now();
        syntax = esprima.parse(content, { tolerant: true });

        if (options.format === 'junit') {

            name = fname;
            if (name.lastIndexOf('/') >= 0) {
                name = name.slice(name.lastIndexOf('/') + 1);
            }

            console.log('<testsuite name="' + fname + '" errors="0" ' +
                ' failures="' + syntax.errors.length + '" ' +
                ' tests="' + syntax.errors.length + '" ' +
                ' time="' + Math.round((Date.now() - timestamp) / 1000) +
                '">');

            syntax.errors.forEach(function (error) {
                var msg = error.message;
                msg = msg.replace(/^Line\ [0-9]*\:\ /, '');
                console.log('  <testcase name="Line ' + error.lineNumber + ': ' + msg + '" ' +
                    ' time="0">');
                console.log('    <error type="SyntaxError" message="' + error.message + '">' +
                    error.message + '(' + name + ':' + error.lineNumber + ')' +
                    '</error>');
                console.log('  </testcase>');
            });

            console.log('</testsuite>');

        } else if (options.format === 'plain') {

            syntax.errors.forEach(function (error) {
                var msg = error.message;
                msg = msg.replace(/^Line\ [0-9]*\:\ /, '');
                msg = fname + ':' + error.lineNumber + ': ' + msg;
                console.log(msg);
                ++count;
            });

        }
    } catch (e) {
        ++count;
        if (options.format === 'junit') {
            console.log('<testsuite name="' + fname + '" errors="1" failures="0" tests="1" ' +
                ' time="' + Math.round((Date.now() - timestamp) / 1000) + '">');
            console.log(' <testcase name="' + e.message + '" ' + ' time="0">');
            console.log(' <error type="ParseError" message="' + e.message + '">' +
                e.message + '(' + fname + ((e.lineNumber) ? ':' + e.lineNumber : '') +
                ')</error>');
            console.log(' </testcase>');
            console.log('</testsuite>');
        } else {
            console.log(fname + ':' + e.lineNumber + ': ' + e.message.replace(/^Line\ [0-9]*\:\ /, ''));
        }
    }
}

fnames.forEach(function (fname) {
    var content = '';
    try {
        if (fname && (fname !== '-' || forceFile)) {
            content = fs.readFileSync(fname, 'utf-8');
        } else {
            fname = '';
            process.stdin.resume();
            process.stdin.on('data', function(chunk) {
                content += chunk;
            });
            process.stdin.on('end', function() {
                run(fname, content);
            });
            return;
        }
    } catch (e) {
        content = e;
    }
    run(fname, content);
});

process.on('exit', function () {
    if (options.format === 'junit') {
        console.log('</testsuites>');
    }

    if (count > 0) {
        process.exit(1);
    }

    if (count === 0 && typeof phantom === 'object') {
        process.exit(0);
    }
});
Copyright (c) 2012, Joyent, Inc. All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE
#
# Copyright (c) 2012, Joyent, Inc. All rights reserved.
#
# Makefile: top-level Makefile
#
# This Makefile contains only repo-specific logic and uses included makefiles
# to supply common targets (javascriptlint, jsstyle, restdown, etc.), which are
# used by other repos as well.
#

#
# Files
#
JSL		 = jsl
JSSTYLE		 = jsstyle
JS_FILES	:= $(shell find examples lib -name '*.js')
JSL_FILES_NODE   = $(JS_FILES)
JSSTYLE_FILES	 = $(JS_FILES)
JSL_CONF_NODE	 = jsl.node.conf

# Default target is "check"
check:

include ./Makefile.targ
# -*- mode: makefile -*-
#
# Copyright (c) 2012, Joyent, Inc. All rights reserved.
#
# Makefile.targ: common targets.
#
# NOTE: This makefile comes from the "eng" repo. It's designed to be dropped
# into other repos as-is without requiring any modifications. If you find
# yourself changing this file, you should instead update the original copy in
# eng.git and then update your repo to use the new version.
#
# This Makefile defines several useful targets and rules. You can use it by
# including it from a Makefile that specifies some of the variables below.
#
# Targets defined in this Makefile:
#
#	check	Checks JavaScript files for lint and style
#		Checks bash scripts for syntax
#		Checks SMF manifests for validity against the SMF DTD
#
#	clean	Removes built files
#
#	docs	Builds restdown documentation in docs/
#
#	prepush	Depends on "check" and "test"
#
#	test	Does nothing (you should override this)
#
#	xref	Generates cscope (source cross-reference index)
#
# For details on what these targets are supposed to do, see the Joyent
# Engineering Guide.
#
# To make use of these targets, you'll need to set some of these variables. Any
# variables left unset will simply not be used.
#
#	BASH_FILES	Bash scripts to check for syntax
#			(paths relative to top-level Makefile)
#
#	CLEAN_FILES	Files to remove as part of the "clean" target.  Note
#			that files generated by targets in this Makefile are
#			automatically included in CLEAN_FILES.  These include
#			restdown-generated HTML and JSON files.
#
#	DOC_FILES	Restdown (documentation source) files. These are
#			assumed to be contained in "docs/", and must NOT
#			contain the "docs/" prefix.
#
#	JSL_CONF_NODE	Specify JavaScriptLint configuration files
#	JSL_CONF_WEB	(paths relative to top-level Makefile)
#
#			Node.js and Web configuration files are separate
#			because you'll usually want different global variable
#			configurations.  If no file is specified, none is given
#			to jsl, which causes it to use a default configuration,
#			which probably isn't what you want.
#
#	JSL_FILES_NODE	JavaScript files to check with Node config file.
#	JSL_FILES_WEB	JavaScript files to check with Web config file.
#
# You can also override these variables:
#
#	BASH		Path to bash (default: bash)
#
#	CSCOPE_DIRS	Directories to search for source files for the cscope
#			index. (default: ".")
#
#	JSL		Path to JavaScriptLint (default: "jsl")
#
#	JSL_FLAGS_NODE	Additional flags to pass through to JSL
#	JSL_FLAGS_WEB
#	JSL_FLAGS
#
#	JSSTYLE		Path to jsstyle (default: jsstyle)
#
#	JSSTYLE_FLAGS	Additional flags to pass through to jsstyle
#

#
# Defaults for the various tools we use.
#
BASH		?= bash
BASHSTYLE	?= tools/bashstyle
CP		?= cp
CSCOPE		?= cscope
CSCOPE_DIRS	?= .
JSL		?= jsl
JSSTYLE		?= jsstyle
MKDIR		?= mkdir -p
MV		?= mv
RESTDOWN_FLAGS	?=
RMTREE		?= rm -rf
JSL_FLAGS  	?= --nologo --nosummary

ifeq ($(shell uname -s),SunOS)
	TAR	?= gtar
else
	TAR	?= tar
endif


#
# Defaults for other fixed values.
#
BUILD		= build
DISTCLEAN_FILES += $(BUILD)
DOC_BUILD	= $(BUILD)/docs/public

#
# Configure JSL_FLAGS_{NODE,WEB} based on JSL_CONF_{NODE,WEB}.
#
ifneq ($(origin JSL_CONF_NODE), undefined)
	JSL_FLAGS_NODE += --conf=$(JSL_CONF_NODE)
endif

ifneq ($(origin JSL_CONF_WEB), undefined)
	JSL_FLAGS_WEB += --conf=$(JSL_CONF_WEB)
endif

#
# Targets. For descriptions on what these are supposed to do, see the
# Joyent Engineering Guide.
#

#
# Instruct make to keep around temporary files. We have rules below that
# automatically update git submodules as needed, but they employ a deps/*/.git
# temporary file. Without this directive, make tries to remove these .git
# directories after the build has completed.
#
.SECONDARY: $($(wildcard deps/*):%=%/.git)

#
# This rule enables other rules that use files from a git submodule to have
# those files depend on deps/module/.git and have "make" automatically check
# out the submodule as needed.
#
deps/%/.git:
	git submodule update --init deps/$*

#
# These recipes make heavy use of dynamically-created phony targets. The parent
# Makefile defines a list of input files like BASH_FILES. We then say that each
# of these files depends on a fake target called filename.bashchk, and then we
# define a pattern rule for those targets that runs bash in check-syntax-only
# mode. This mechanism has the nice properties that if you specify zero files,
# the rule becomes a noop (unlike a single rule to check all bash files, which
# would invoke bash with zero files), and you can check individual files from
# the command line with "make filename.bashchk".
#
.PHONY: check-bash
check-bash: $(BASH_FILES:%=%.bashchk) $(BASH_FILES:%=%.bashstyle)

%.bashchk: %
	$(BASH) -n $^

%.bashstyle: %
	$(BASHSTYLE) $^

.PHONY: check-jsl check-jsl-node check-jsl-web
check-jsl: check-jsl-node check-jsl-web

check-jsl-node: $(JSL_FILES_NODE:%=%.jslnodechk)

check-jsl-web: $(JSL_FILES_WEB:%=%.jslwebchk)

%.jslnodechk: % $(JSL_EXEC)
	$(JSL) $(JSL_FLAGS) $(JSL_FLAGS_NODE) $<

%.jslwebchk: % $(JSL_EXEC)
	$(JSL) $(JSL_FLAGS) $(JSL_FLAGS_WEB) $<

.PHONY: check-jsstyle
check-jsstyle: $(JSSTYLE_FILES:%=%.jsstylechk)

%.jsstylechk: % $(JSSTYLE_EXEC)
	$(JSSTYLE) $(JSSTYLE_FLAGS) $<

.PHONY: check
check: check-jsl check-jsstyle check-bash
	@echo check ok

.PHONY: clean
clean::
	-$(RMTREE) $(CLEAN_FILES)

.PHONY: distclean
distclean:: clean
	-$(RMTREE) $(DISTCLEAN_FILES)

CSCOPE_FILES = cscope.in.out cscope.out cscope.po.out
CLEAN_FILES += $(CSCOPE_FILES)

.PHONY: xref
xref: cscope.files
	$(CSCOPE) -bqR

.PHONY: cscope.files
cscope.files:
	find $(CSCOPE_DIRS) -name '*.c' -o -name '*.h' -o -name '*.cc' \
	    -o -name '*.js' -o -name '*.s' -o -name '*.cpp' > $@

#
# The "docs" target is complicated because we do several things here:
#
#    (1) Use restdown to build HTML and JSON files from each of DOC_FILES.
#
#    (2) Copy these files into $(DOC_BUILD) (build/docs/public), which
#        functions as a complete copy of the documentation that could be
#        mirrored or served over HTTP.
#
#    (3) Then copy any directories and media from docs/media into
#        $(DOC_BUILD)/media. This allows projects to include their own media,
#        including files that will override same-named files provided by
#        restdown.
#
# Step (3) is the surprisingly complex part: in order to do this, we need to
# identify the subdirectories in docs/media, recreate them in
# $(DOC_BUILD)/media, then do the same with the files.
#
DOC_MEDIA_DIRS := $(shell find docs/media -type d 2>/dev/null | grep -v "^docs/media$$")
DOC_MEDIA_DIRS := $(DOC_MEDIA_DIRS:docs/media/%=%)
DOC_MEDIA_DIRS_BUILD := $(DOC_MEDIA_DIRS:%=$(DOC_BUILD)/media/%)

DOC_MEDIA_FILES := $(shell find docs/media -type f 2>/dev/null)
DOC_MEDIA_FILES := $(DOC_MEDIA_FILES:docs/media/%=%)
DOC_MEDIA_FILES_BUILD := $(DOC_MEDIA_FILES:%=$(DOC_BUILD)/media/%)

#
# Like the other targets, "docs" just depends on the final files we want to
# create in $(DOC_BUILD), leveraging other targets and recipes to define how
# to get there.
#
.PHONY: docs
docs:							\
    $(DOC_FILES:%.restdown=$(DOC_BUILD)/%.html)		\
    $(DOC_FILES:%.restdown=$(DOC_BUILD)/%.json)		\
    $(DOC_MEDIA_FILES_BUILD)

#
# We keep the intermediate files so that the next build can see whether the
# files in DOC_BUILD are up to date.
#
.PRECIOUS:					\
    $(DOC_FILES:%.restdown=docs/%.html)		\
    $(DOC_FILES:%.restdown=docs/%json)

#
# We do clean those intermediate files, as well as all of DOC_BUILD.
#
CLEAN_FILES +=					\
    $(DOC_BUILD)				\
    $(DOC_FILES:%.restdown=docs/%.html)		\
    $(DOC_FILES:%.restdown=docs/%.json)

#
# Before installing the files, we must make sure the directories exist. The |
# syntax tells make that the dependency need only exist, not be up to date.
# Otherwise, it might try to rebuild spuriously because the directory itself
# appears out of date.
#
$(DOC_MEDIA_FILES_BUILD): | $(DOC_MEDIA_DIRS_BUILD)

$(DOC_BUILD)/%: docs/% | $(DOC_BUILD)
	$(CP) $< $@

docs/%.json docs/%.html: docs/%.restdown | $(DOC_BUILD) $(RESTDOWN_EXEC)
	$(RESTDOWN) $(RESTDOWN_FLAGS) -m $(DOC_BUILD) $<

$(DOC_BUILD):
	$(MKDIR) $@

$(DOC_MEDIA_DIRS_BUILD):
	$(MKDIR) $@

#
# The default "test" target does nothing. This should usually be overridden by
# the parent Makefile. It's included here so we can define "prepush" without
# requiring the repo to define "test".
#
.PHONY: test
test:

.PHONY: prepush
prepush: check test
#
# Configuration File for JavaScript Lint 
#
# This configuration file can be used to lint a collection of scripts, or to enable
# or disable warnings for scripts that are linted via the command line.
#

### Warnings
# Enable or disable warnings based on requirements.
# Use "+WarningName" to display or "-WarningName" to suppress.
#
+ambiguous_else_stmt          # the else statement could be matched with one of multiple if statements (use curly braces to indicate intent
+ambiguous_nested_stmt        # block statements containing block statements should use curly braces to resolve ambiguity
+ambiguous_newline            # unexpected end of line; it is ambiguous whether these lines are part of the same statement
+anon_no_return_value         # anonymous function does not always return value
+assign_to_function_call      # assignment to a function call
-block_without_braces         # block statement without curly braces
+comma_separated_stmts        # multiple statements separated by commas (use semicolons?)
+comparison_type_conv         # comparisons against null, 0, true, false, or an empty string allowing implicit type conversion (use === or !==)
+default_not_at_end           # the default case is not at the end of the switch statement
+dup_option_explicit          # duplicate "option explicit" control comment
+duplicate_case_in_switch     # duplicate case in switch statement
+duplicate_formal             # duplicate formal argument {name}
+empty_statement              # empty statement or extra semicolon
+identifier_hides_another     # identifer {name} hides an identifier in a parent scope
-inc_dec_within_stmt          # increment (++) and decrement (--) operators used as part of greater statement
+incorrect_version            # Expected /*jsl:content-type*/ control comment. The script was parsed with the wrong version.
+invalid_fallthru             # unexpected "fallthru" control comment
+invalid_pass                 # unexpected "pass" control comment
+jsl_cc_not_understood        # couldn't understand control comment using /*jsl:keyword*/ syntax
+leading_decimal_point        # leading decimal point may indicate a number or an object member
+legacy_cc_not_understood     # couldn't understand control comment using /*@keyword@*/ syntax
+meaningless_block            # meaningless block; curly braces have no impact
+mismatch_ctrl_comments       # mismatched control comment; "ignore" and "end" control comments must have a one-to-one correspondence
+misplaced_regex              # regular expressions should be preceded by a left parenthesis, assignment, colon, or comma
+missing_break                # missing break statement
+missing_break_for_last_case  # missing break statement for last case in switch
+missing_default_case         # missing default case in switch statement
+missing_option_explicit      # the "option explicit" control comment is missing
+missing_semicolon            # missing semicolon
+missing_semicolon_for_lambda # missing semicolon for lambda assignment
+multiple_plus_minus          # unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs
+nested_comment               # nested comment
+no_return_value              # function {name} does not always return a value
+octal_number                 # leading zeros make an octal number
+parseint_missing_radix       # parseInt missing radix parameter
+partial_option_explicit      # the "option explicit" control comment, if used, must be in the first script tag
+redeclared_var               # redeclaration of {name}
+trailing_comma_in_array      # extra comma is not recommended in array initializers
+trailing_decimal_point       # trailing decimal point may indicate a number or an object member
+undeclared_identifier        # undeclared identifier: {name}
+unreachable_code             # unreachable code
-unreferenced_argument        # argument declared but never referenced: {name}
-unreferenced_function        # function is declared but never referenced: {name}
+unreferenced_variable        # variable is declared but never referenced: {name}
+unsupported_version          # JavaScript {version} is not supported
+use_of_label                 # use of label
+useless_assign               # useless assignment
+useless_comparison           # useless comparison; comparing identical expressions
-useless_quotes               # the quotation marks are unnecessary
+useless_void                 # use of the void type may be unnecessary (void is always undefined)
+var_hides_arg                # variable {name} hides argument
+want_assign_or_call          # expected an assignment or function call
+with_statement               # with statement hides undeclared variables; use temporary variable instead


### Output format
# Customize the format of the error message.
#    __FILE__ indicates current file path
#    __FILENAME__ indicates current file name
#    __LINE__ indicates current line
#    __COL__ indicates current column
#    __ERROR__ indicates error message (__ERROR_PREFIX__: __ERROR_MSG__)
#    __ERROR_NAME__ indicates error name (used in configuration file)
#    __ERROR_PREFIX__ indicates error prefix
#    __ERROR_MSG__ indicates error message
#
# For machine-friendly output, the output format can be prefixed with
# "encode:". If specified, all items will be encoded with C-slashes.
#
# Visual Studio syntax (default):
+output-format __FILE__(__LINE__): __ERROR__
# Alternative syntax:
#+output-format __FILE__:__LINE__: __ERROR__


### Context
# Show the in-line position of the error.
# Use "+context" to display or "-context" to suppress.
#
+context


### Control Comments
# Both JavaScript Lint and the JScript interpreter confuse each other with the syntax for
# the /*@keyword@*/ control comments and JScript conditional comments. (The latter is
# enabled in JScript with @cc_on@). The /*jsl:keyword*/ syntax is preferred for this reason,
# although legacy control comments are enabled by default for backward compatibility.
#
-legacy_control_comments


### Defining identifiers
# By default, "option explicit" is enabled on a per-file basis.
# To enable this for all files, use "+always_use_option_explicit"
-always_use_option_explicit

# Define certain identifiers of which the lint is not aware.
# (Use this in conjunction with the "undeclared identifier" warning.)
#
# Common uses for webpages might be:
+define __dirname
+define clearInterval
+define clearTimeout
+define console
+define exports
+define global
+define process
+define require
+define setInterval
+define setTimeout
+define Buffer
+define JSON
+define Math

### JavaScript Version
# To change the default JavaScript version:
#+default-type text/javascript;version=1.5
#+default-type text/javascript;e4x=1

### Files
# Specify which files to lint
# Use "+recurse" to enable recursion (disabled by default).
# To add a set of files, use "+process FileName", "+process Folder\Path\*.js",
# or "+process Folder\Path\*.htm".
#

{
  "deprecated": false,
  "description": "extended POSIX-style sprintf",
  "engines": [
    "node >=0.6.0"
  ],
  "homepage": "https://github.com/davepacheco/node-extsprintf#readme",
  "license": "MIT",
  "main": "./lib/extsprintf.js",
  "name": "extsprintf",
  "repository": {
    "type": "git",
    "url": "git://github.com/davepacheco/node-extsprintf.git"
  },
  "version": "1.3.0"
}/*
 * extsprintf.js: extended POSIX-style sprintf
 */

var mod_assert = require('assert');
var mod_util = require('util');

/*
 * Public interface
 */
exports.sprintf = jsSprintf;
exports.printf = jsPrintf;
exports.fprintf = jsFprintf;

/*
 * Stripped down version of s[n]printf(3c).  We make a best effort to throw an
 * exception when given a format string we don't understand, rather than
 * ignoring it, so that we won't break existing programs if/when we go implement
 * the rest of this.
 *
 * This implementation currently supports specifying
 *	- field alignment ('-' flag),
 * 	- zero-pad ('0' flag)
 *	- always show numeric sign ('+' flag),
 *	- field width
 *	- conversions for strings, decimal integers, and floats (numbers).
 *	- argument size specifiers.  These are all accepted but ignored, since
 *	  Javascript has no notion of the physical size of an argument.
 *
 * Everything else is currently unsupported, most notably precision, unsigned
 * numbers, non-decimal numbers, and characters.
 */
function jsSprintf(fmt)
{
	var regex = [
	    '([^%]*)',				/* normal text */
	    '%',				/* start of format */
	    '([\'\\-+ #0]*?)',			/* flags (optional) */
	    '([1-9]\\d*)?',			/* width (optional) */
	    '(\\.([1-9]\\d*))?',		/* precision (optional) */
	    '[lhjztL]*?',			/* length mods (ignored) */
	    '([diouxXfFeEgGaAcCsSp%jr])'	/* conversion */
	].join('');

	var re = new RegExp(regex);
	var args = Array.prototype.slice.call(arguments, 1);
	var flags, width, precision, conversion;
	var left, pad, sign, arg, match;
	var ret = '';
	var argn = 1;

	mod_assert.equal('string', typeof (fmt));

	while ((match = re.exec(fmt)) !== null) {
		ret += match[1];
		fmt = fmt.substring(match[0].length);

		flags = match[2] || '';
		width = match[3] || 0;
		precision = match[4] || '';
		conversion = match[6];
		left = false;
		sign = false;
		pad = ' ';

		if (conversion == '%') {
			ret += '%';
			continue;
		}

		if (args.length === 0)
			throw (new Error('too few args to sprintf'));

		arg = args.shift();
		argn++;

		if (flags.match(/[\' #]/))
			throw (new Error(
			    'unsupported flags: ' + flags));

		if (precision.length > 0)
			throw (new Error(
			    'non-zero precision not supported'));

		if (flags.match(/-/))
			left = true;

		if (flags.match(/0/))
			pad = '0';

		if (flags.match(/\+/))
			sign = true;

		switch (conversion) {
		case 's':
			if (arg === undefined || arg === null)
				throw (new Error('argument ' + argn +
				    ': attempted to print undefined or null ' +
				    'as a string'));
			ret += doPad(pad, width, left, arg.toString());
			break;

		case 'd':
			arg = Math.floor(arg);
			/*jsl:fallthru*/
		case 'f':
			sign = sign && arg > 0 ? '+' : '';
			ret += sign + doPad(pad, width, left,
			    arg.toString());
			break;

		case 'x':
			ret += doPad(pad, width, left, arg.toString(16));
			break;

		case 'j': /* non-standard */
			if (width === 0)
				width = 10;
			ret += mod_util.inspect(arg, false, width);
			break;

		case 'r': /* non-standard */
			ret += dumpException(arg);
			break;

		default:
			throw (new Error('unsupported conversion: ' +
			    conversion));
		}
	}

	ret += fmt;
	return (ret);
}

function jsPrintf() {
	var args = Array.prototype.slice.call(arguments);
	args.unshift(process.stdout);
	jsFprintf.apply(null, args);
}

function jsFprintf(stream) {
	var args = Array.prototype.slice.call(arguments, 1);
	return (stream.write(jsSprintf.apply(this, args)));
}

function doPad(chr, width, left, str)
{
	var ret = str;

	while (ret.length < width) {
		if (left)
			ret += chr;
		else
			ret = chr + ret;
	}

	return (ret);
}

/*
 * This function dumps long stack traces for exceptions having a cause() method.
 * See node-verror for an example.
 */
function dumpException(ex)
{
	var ret;

	if (!(ex instanceof Error))
		throw (new Error(jsSprintf('invalid type for %%r: %j', ex)));

	/* Note that V8 prepends "ex.stack" with ex.toString(). */
	ret = 'EXCEPTION: ' + ex.constructor.name + ': ' + ex.stack;

	if (ex.cause && typeof (ex.cause) === 'function') {
		var cex = ex.cause();
		if (cex) {
			ret += '\nCaused by: ' + dumpException(cex);
		}
	}

	return (ret);
}
MIT License

Copyright (c) 2017 Evgeny Poberezkin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';

// do not edit .js files directly - edit src/index.jst



module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }



    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};
{
  "author": {
    "name": "Evgeny Poberezkin"
  },
  "deprecated": false,
  "description": "Fast deep equal",
  "devDependencies": {
    "coveralls": "^3.1.0",
    "dot": "^1.1.2",
    "eslint": "^7.2.0",
    "mocha": "^7.2.0",
    "nyc": "^15.1.0",
    "pre-commit": "^1.2.2",
    "react": "^16.12.0",
    "react-test-renderer": "^16.12.0",
    "sinon": "^9.0.2",
    "typescript": "^3.9.5"
  },
  "files": [
    "index.js",
    "index.d.ts",
    "react.js",
    "react.d.ts",
    "es6/"
  ],
  "homepage": "https://github.com/epoberezkin/fast-deep-equal#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "fast-deep-equal",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/epoberezkin/fast-deep-equal.git"
  },
  "types": "index.d.ts",
  "version": "3.1.3"
}'use strict';

// do not edit .js files directly - edit src/index.jst



module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }



    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (key === '_owner' && a.$$typeof) {
        // React-specific: avoid traversing React elements' _owner.
        //  _owner contains circular references
        // and is not needed when comparing the actual elements (and not their owners)
        continue;
      }

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};
'use strict';

// do not edit .js files directly - edit src/index.jst


  var envHasBigInt64Array = typeof BigInt64Array !== 'undefined';


module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }


    if ((a instanceof Map) && (b instanceof Map)) {
      if (a.size !== b.size) return false;
      for (i of a.entries())
        if (!b.has(i[0])) return false;
      for (i of a.entries())
        if (!equal(i[1], b.get(i[0]))) return false;
      return true;
    }

    if ((a instanceof Set) && (b instanceof Set)) {
      if (a.size !== b.size) return false;
      for (i of a.entries())
        if (!b.has(i[0])) return false;
      return true;
    }

    if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (a[i] !== b[i]) return false;
      return true;
    }


    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};
'use strict';

// do not edit .js files directly - edit src/index.jst


  var envHasBigInt64Array = typeof BigInt64Array !== 'undefined';


module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }


    if ((a instanceof Map) && (b instanceof Map)) {
      if (a.size !== b.size) return false;
      for (i of a.entries())
        if (!b.has(i[0])) return false;
      for (i of a.entries())
        if (!equal(i[1], b.get(i[0]))) return false;
      return true;
    }

    if ((a instanceof Set) && (b instanceof Set)) {
      if (a.size !== b.size) return false;
      for (i of a.entries())
        if (!b.has(i[0])) return false;
      return true;
    }

    if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (a[i] !== b[i]) return false;
      return true;
    }


    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (key === '_owner' && a.$$typeof) {
        // React-specific: avoid traversing React elements' _owner.
        //  _owner contains circular references
        // and is not needed when comparing the actual elements (and not their owners)
        continue;
      }

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};
The MIT License (MIT)

Copyright (c) 2016 Matteo Collina

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict'

var benchmark = require('benchmark')
var suite = new benchmark.Suite()
var fs = require('fs')
var myData = fs.readFileSync('./package.json')
var Parse = require('./')
var safe = require('json-parse-safe')
var max = 100

suite.add('Parse class', function parseBench () {
  var parsed = new Parse(myData)
  if (parsed.err) {
    return
  }

  // add a loop to simulate some activity here
  for (var i = 0; i < max; i++) {
    var count = 0
    var keys = Object.keys(parsed.value)
    for (var k = 0; k < keys.length; k++) {
      count++
    }
  }
})

suite.add('Parse wrapped', function parseBench () {
  var parsed = Parse(myData)
  if (parsed.err) {
    return
  }

  // add a loop to simulate some activity here
  for (var i = 0; i < max; i++) {
    var count = 0
    var keys = Object.keys(parsed.value)
    for (var k = 0; k < keys.length; k++) {
      count++
    }
  }
})

suite.add('json-parse-safe', function parseBench () {
  var parsed = safe(myData)
  if (parsed.error) {
    return
  }

  // add a loop to simulate some activity here
  for (var i = 0; i < max; i++) {
    var count = 0
    var keys = Object.keys(parsed.value)
    for (var k = 0; k < keys.length; k++) {
      count++
    }
  }
})

suite.add('try catch here', function tryCatchBench () {
  var data = null
  try {
    data = JSON.parse(myData)
  } catch (err) {
    return
  }

  // add a loop to simulate some activity here
  for (var i = 0; i < max; i++) {
    var count = 0
    var keys = Object.keys(data)
    for (var k = 0; k < keys.length; k++) {
      count++
    }
  }
})

suite.on('complete', function print () {
  for (var i = 0; i < this.length; i++) {
    console.log(this[i].toString())
  }

  console.log('Fastest is', this.filter('fastest').map('name')[0])
})

suite.run()
{
  "author": {
    "name": "Matteo Collina",
    "email": "hello@matteocollina.com"
  },
  "deprecated": false,
  "description": "Parse json safely and at max speed",
  "devDependencies": {
    "benchmark": "^2.1.0",
    "json-parse-safe": "^1.0.3",
    "pre-commit": "^1.1.2",
    "standard": "^6.0.5",
    "tap": "^5.5.0"
  },
  "homepage": "https://github.com/mcollina/fast-json-parse#readme",
  "license": "MIT",
  "main": "parse.js",
  "name": "fast-json-parse",
  "pre-commit": "test",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/mcollina/fast-json-parse.git"
  },
  "version": "1.0.3"
}'use strict'

function Parse (data) {
  if (!(this instanceof Parse)) {
    return new Parse(data)
  }
  this.err = null
  this.value = null
  try {
    this.value = JSON.parse(data)
  } catch (err) {
    this.err = err
  }
}

module.exports = Parse
extends: eslint:recommended
env:
  node: true
  browser: true
rules:
  block-scoped-var: 2
  callback-return: 2
  dot-notation: 2
  indent: 2
  linebreak-style: [2, unix]
  new-cap: 2
  no-console: [2, allow: [warn, error]]
  no-else-return: 2
  no-eq-null: 2
  no-fallthrough: 2
  no-invalid-this: 2
  no-return-assign: 2
  no-shadow: 1
  no-trailing-spaces: 2
  no-use-before-define: [2, nofunc]
  quotes: [2, single, avoid-escape]
  semi: [2, always]
  strict: [2, global]
  valid-jsdoc: [2, requireReturn: false]
  no-control-regex: 0
  no-useless-escape: 2
This software is released under the MIT license:

Copyright (c) 2017 Evgeny Poberezkin
Copyright (c) 2013 James Halliday

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict';

module.exports = function (data, opts) {
    if (!opts) opts = {};
    if (typeof opts === 'function') opts = { cmp: opts };
    var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;

    var cmp = opts.cmp && (function (f) {
        return function (node) {
            return function (a, b) {
                var aobj = { key: a, value: node[a] };
                var bobj = { key: b, value: node[b] };
                return f(aobj, bobj);
            };
        };
    })(opts.cmp);

    var seen = [];
    return (function stringify (node) {
        if (node && node.toJSON && typeof node.toJSON === 'function') {
            node = node.toJSON();
        }

        if (node === undefined) return;
        if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
        if (typeof node !== 'object') return JSON.stringify(node);

        var i, out;
        if (Array.isArray(node)) {
            out = '[';
            for (i = 0; i < node.length; i++) {
                if (i) out += ',';
                out += stringify(node[i]) || 'null';
            }
            return out + ']';
        }

        if (node === null) return 'null';

        if (seen.indexOf(node) !== -1) {
            if (cycles) return JSON.stringify('__cycle__');
            throw new TypeError('Converting circular structure to JSON');
        }

        var seenIndex = seen.push(node) - 1;
        var keys = Object.keys(node).sort(cmp && cmp(node));
        out = '';
        for (i = 0; i < keys.length; i++) {
            var key = keys[i];
            var value = stringify(node[key]);

            if (!value) continue;
            if (out) out += ',';
            out += JSON.stringify(key) + ':' + value;
        }
        seen.splice(seenIndex, 1);
        return '{' + out + '}';
    })(data);
};
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "deterministic `JSON.stringify()` - a faster version of substack's json-stable-strigify without jsonify",
  "devDependencies": {
    "benchmark": "^2.1.4",
    "coveralls": "^3.0.0",
    "eslint": "^6.7.0",
    "fast-stable-stringify": "latest",
    "faster-stable-stringify": "latest",
    "json-stable-stringify": "latest",
    "nyc": "^14.1.0",
    "pre-commit": "^1.2.2",
    "tape": "^4.11.0"
  },
  "homepage": "https://github.com/epoberezkin/fast-json-stable-stringify",
  "license": "MIT",
  "main": "index.js",
  "name": "fast-json-stable-stringify",
  "repository": {
    "type": "git",
    "url": "git://github.com/epoberezkin/fast-json-stable-stringify.git"
  },
  "types": "index.d.ts",
  "version": "2.1.0"
}'use strict';

const Benchmark = require('benchmark');
const suite = new Benchmark.Suite;
const testData = require('./test.json');


const stringifyPackages = {
  // 'JSON.stringify': JSON.stringify,
  'fast-json-stable-stringify': require('../index'),
  'json-stable-stringify': true,
  'fast-stable-stringify': true,
  'faster-stable-stringify': true
};


for (const name in stringifyPackages) {
  let func = stringifyPackages[name];
  if (func === true) func = require(name);

  suite.add(name, function() {
    func(testData);
  });
}

suite
  .on('cycle', (event) => console.log(String(event.target)))
  .on('complete', function () {
    console.log('The fastest is ' + this.filter('fastest').map('name'));
  })
  .run({async: true});
[
  {
    "_id": "59ef4a83ee8364808d761beb",
    "index": 0,
    "guid": "e50ffae9-7128-4148-9ee5-40c3fc523c5d",
    "isActive": false,
    "balance": "$2,341.81",
    "picture": "http://placehold.it/32x32",
    "age": 28,
    "eyeColor": "brown",
    "name": "Carey Savage",
    "gender": "female",
    "company": "VERAQ",
    "email": "careysavage@veraq.com",
    "phone": "+1 (897) 574-3014",
    "address": "458 Willow Street, Henrietta, California, 7234",
    "about": "Nisi reprehenderit nulla ad officia pariatur non dolore laboris irure cupidatat laborum. Minim eu ex Lorem adipisicing exercitation irure minim sunt est enim mollit incididunt voluptate nulla. Ut mollit anim reprehenderit et aliqua ex esse aliquip. Aute sit duis deserunt do incididunt consequat minim qui dolor commodo deserunt et voluptate.\r\n",
    "registered": "2014-05-21T01:56:51 -01:00",
    "latitude": 63.89502,
    "longitude": 62.369807,
    "tags": [
      "nostrud",
      "nisi",
      "consectetur",
      "ullamco",
      "cupidatat",
      "culpa",
      "commodo"
    ],
    "friends": [
      {
        "id": 0,
        "name": "Henry Walls"
      },
      {
        "id": 1,
        "name": "Janice Baker"
      },
      {
        "id": 2,
        "name": "Russell Bush"
      }
    ],
    "greeting": "Hello, Carey Savage! You have 4 unread messages.",
    "favoriteFruit": "banana"
  },
  {
    "_id": "59ef4a83ff5774a691454e89",
    "index": 1,
    "guid": "2bee9efc-4095-4c2e-87ef-d08c8054c89d",
    "isActive": true,
    "balance": "$1,618.15",
    "picture": "http://placehold.it/32x32",
    "age": 35,
    "eyeColor": "blue",
    "name": "Elinor Pearson",
    "gender": "female",
    "company": "FLEXIGEN",
    "email": "elinorpearson@flexigen.com",
    "phone": "+1 (923) 548-3751",
    "address": "600 Bayview Avenue, Draper, Montana, 3088",
    "about": "Mollit commodo ea sit Lorem velit. Irure anim esse Lorem sint quis officia ut. Aliqua nisi dolore in aute deserunt mollit ex ea in mollit.\r\n",
    "registered": "2017-04-22T07:58:41 -01:00",
    "latitude": -87.824919,
    "longitude": 69.538927,
    "tags": [
      "fugiat",
      "labore",
      "proident",
      "quis",
      "eiusmod",
      "qui",
      "est"
    ],
    "friends": [
      {
        "id": 0,
        "name": "Massey Wagner"
      },
      {
        "id": 1,
        "name": "Marcella Ferrell"
      },
      {
        "id": 2,
        "name": "Evans Mckee"
      }
    ],
    "greeting": "Hello, Elinor Pearson! You have 3 unread messages.",
    "favoriteFruit": "strawberry"
  },
  {
    "_id": "59ef4a839ec8a4be4430b36b",
    "index": 2,
    "guid": "ddd6e8c0-95bd-416d-8b46-a768d6363809",
    "isActive": false,
    "balance": "$2,046.95",
    "picture": "http://placehold.it/32x32",
    "age": 40,
    "eyeColor": "green",
    "name": "Irwin Davidson",
    "gender": "male",
    "company": "DANJA",
    "email": "irwindavidson@danja.com",
    "phone": "+1 (883) 537-2041",
    "address": "439 Cook Street, Chapin, Kentucky, 7398",
    "about": "Irure velit non commodo aliqua exercitation ut nostrud minim magna. Dolor ad ad ut irure eu. Non pariatur dolor eiusmod ipsum do et exercitation cillum. Et amet laboris minim eiusmod ullamco magna ea reprehenderit proident sunt.\r\n",
    "registered": "2016-09-01T07:49:08 -01:00",
    "latitude": -49.803812,
    "longitude": 104.93279,
    "tags": [
      "consequat",
      "enim",
      "quis",
      "magna",
      "est",
      "culpa",
      "tempor"
    ],
    "friends": [
      {
        "id": 0,
        "name": "Ruth Hansen"
      },
      {
        "id": 1,
        "name": "Kathrine Austin"
      },
      {
        "id": 2,
        "name": "Rivera Munoz"
      }
    ],
    "greeting": "Hello, Irwin Davidson! You have 2 unread messages.",
    "favoriteFruit": "banana"
  }
]
tidelift: "npm/fast-json-stable-stringify"
root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 120

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
The MIT License (MIT)

Copyright (c) 2012 Raynos.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

'use strict';

var isCallable = require('is-callable');

var toStr = Object.prototype.toString;
var hasOwnProperty = Object.prototype.hasOwnProperty;

var forEachArray = function forEachArray(array, iterator, receiver) {
    for (var i = 0, len = array.length; i < len; i++) {
        if (hasOwnProperty.call(array, i)) {
            if (receiver == null) {
                iterator(array[i], i, array);
            } else {
                iterator.call(receiver, array[i], i, array);
            }
        }
    }
};

var forEachString = function forEachString(string, iterator, receiver) {
    for (var i = 0, len = string.length; i < len; i++) {
        // no such thing as a sparse string.
        if (receiver == null) {
            iterator(string.charAt(i), i, string);
        } else {
            iterator.call(receiver, string.charAt(i), i, string);
        }
    }
};

var forEachObject = function forEachObject(object, iterator, receiver) {
    for (var k in object) {
        if (hasOwnProperty.call(object, k)) {
            if (receiver == null) {
                iterator(object[k], k, object);
            } else {
                iterator.call(receiver, object[k], k, object);
            }
        }
    }
};

var forEach = function forEach(list, iterator, thisArg) {
    if (!isCallable(iterator)) {
        throw new TypeError('iterator must be a function');
    }

    var receiver;
    if (arguments.length >= 3) {
        receiver = thisArg;
    }

    if (toStr.call(list) === '[object Array]') {
        forEachArray(list, iterator, receiver);
    } else if (typeof list === 'string') {
        forEachString(list, iterator, receiver);
    } else {
        forEachObject(list, iterator, receiver);
    }
};

module.exports = forEach;
{
  "author": {
    "name": "Raynos",
    "email": "raynos2@gmail.com"
  },
  "dependencies": {
    "is-callable": "^1.1.3"
  },
  "deprecated": false,
  "description": "A better forEach",
  "devDependencies": {
    "@ljharb/eslint-config": "^12.2.1",
    "eslint": "^4.19.1",
    "nsp": "^3.2.1",
    "tape": "^4.9.0"
  },
  "homepage": "https://github.com/Raynos/for-each",
  "license": "MIT",
  "licenses": [
    {
      "type": "MIT",
      "url": "http://github.com/Raynos/for-each/raw/master/LICENSE"
    }
  ],
  "main": "index",
  "name": "for-each",
  "repository": {
    "type": "git",
    "url": "git://github.com/Raynos/for-each.git"
  },
  "testling": {
    "files": "test/test.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "0.3.3"
}(The MIT License)

Copyright (c) 2011-2017 JP Richardson

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
 merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "JP Richardson",
    "email": "jprichardson@gmail.com"
  },
  "dependencies": {
    "graceful-fs": "^4.2.0",
    "jsonfile": "^4.0.0",
    "universalify": "^0.1.0"
  },
  "deprecated": false,
  "description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as mkdir -p, cp -r, and rm -rf.",
  "devDependencies": {
    "coveralls": "^3.0.0",
    "istanbul": "^0.4.5",
    "klaw": "^2.1.1",
    "klaw-sync": "^3.0.2",
    "minimist": "^1.1.1",
    "mocha": "^5.0.5",
    "proxyquire": "^2.0.1",
    "read-dir-files": "^0.1.1",
    "semver": "^5.3.0",
    "standard": "^12.0.1"
  },
  "engines": {
    "node": ">=6 <7 || >=8"
  },
  "files": [
    "lib/",
    "!lib/**/__tests__/"
  ],
  "homepage": "https://github.com/jprichardson/node-fs-extra",
  "license": "MIT",
  "main": "./lib/index.js",
  "name": "fs-extra",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jprichardson/node-fs-extra.git"
  },
  "version": "8.1.0"
}'use strict'

module.exports = Object.assign(
  {},
  // Export promiseified graceful-fs:
  require('./fs'),
  // Export extra methods:
  require('./copy-sync'),
  require('./copy'),
  require('./empty'),
  require('./ensure'),
  require('./json'),
  require('./mkdirs'),
  require('./move-sync'),
  require('./move'),
  require('./output'),
  require('./path-exists'),
  require('./remove')
)

// Export fs.promises as a getter property so that we don't trigger
// ExperimentalWarning before fs.promises is actually accessed.
const fs = require('fs')
if (Object.getOwnPropertyDescriptor(fs, 'promises')) {
  Object.defineProperty(module.exports, 'promises', {
    get () { return fs.promises }
  })
}
'use strict'
/* eslint-disable node/no-deprecated-api */
module.exports = function (size) {
  if (typeof Buffer.allocUnsafe === 'function') {
    try {
      return Buffer.allocUnsafe(size)
    } catch (e) {
      return new Buffer(size)
    }
  }
  return new Buffer(size)
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')

const NODE_VERSION_MAJOR_WITH_BIGINT = 10
const NODE_VERSION_MINOR_WITH_BIGINT = 5
const NODE_VERSION_PATCH_WITH_BIGINT = 0
const nodeVersion = process.versions.node.split('.')
const nodeVersionMajor = Number.parseInt(nodeVersion[0], 10)
const nodeVersionMinor = Number.parseInt(nodeVersion[1], 10)
const nodeVersionPatch = Number.parseInt(nodeVersion[2], 10)

function nodeSupportsBigInt () {
  if (nodeVersionMajor > NODE_VERSION_MAJOR_WITH_BIGINT) {
    return true
  } else if (nodeVersionMajor === NODE_VERSION_MAJOR_WITH_BIGINT) {
    if (nodeVersionMinor > NODE_VERSION_MINOR_WITH_BIGINT) {
      return true
    } else if (nodeVersionMinor === NODE_VERSION_MINOR_WITH_BIGINT) {
      if (nodeVersionPatch >= NODE_VERSION_PATCH_WITH_BIGINT) {
        return true
      }
    }
  }
  return false
}

function getStats (src, dest, cb) {
  if (nodeSupportsBigInt()) {
    fs.stat(src, { bigint: true }, (err, srcStat) => {
      if (err) return cb(err)
      fs.stat(dest, { bigint: true }, (err, destStat) => {
        if (err) {
          if (err.code === 'ENOENT') return cb(null, { srcStat, destStat: null })
          return cb(err)
        }
        return cb(null, { srcStat, destStat })
      })
    })
  } else {
    fs.stat(src, (err, srcStat) => {
      if (err) return cb(err)
      fs.stat(dest, (err, destStat) => {
        if (err) {
          if (err.code === 'ENOENT') return cb(null, { srcStat, destStat: null })
          return cb(err)
        }
        return cb(null, { srcStat, destStat })
      })
    })
  }
}

function getStatsSync (src, dest) {
  let srcStat, destStat
  if (nodeSupportsBigInt()) {
    srcStat = fs.statSync(src, { bigint: true })
  } else {
    srcStat = fs.statSync(src)
  }
  try {
    if (nodeSupportsBigInt()) {
      destStat = fs.statSync(dest, { bigint: true })
    } else {
      destStat = fs.statSync(dest)
    }
  } catch (err) {
    if (err.code === 'ENOENT') return { srcStat, destStat: null }
    throw err
  }
  return { srcStat, destStat }
}

function checkPaths (src, dest, funcName, cb) {
  getStats(src, dest, (err, stats) => {
    if (err) return cb(err)
    const { srcStat, destStat } = stats
    if (destStat && destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
      return cb(new Error('Source and destination must not be the same.'))
    }
    if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
      return cb(new Error(errMsg(src, dest, funcName)))
    }
    return cb(null, { srcStat, destStat })
  })
}

function checkPathsSync (src, dest, funcName) {
  const { srcStat, destStat } = getStatsSync(src, dest)
  if (destStat && destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
    throw new Error('Source and destination must not be the same.')
  }
  if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
    throw new Error(errMsg(src, dest, funcName))
  }
  return { srcStat, destStat }
}

// recursively check if dest parent is a subdirectory of src.
// It works for all file types including symlinks since it
// checks the src and dest inodes. It starts from the deepest
// parent and stops once it reaches the src parent or the root path.
function checkParentPaths (src, srcStat, dest, funcName, cb) {
  const srcParent = path.resolve(path.dirname(src))
  const destParent = path.resolve(path.dirname(dest))
  if (destParent === srcParent || destParent === path.parse(destParent).root) return cb()
  if (nodeSupportsBigInt()) {
    fs.stat(destParent, { bigint: true }, (err, destStat) => {
      if (err) {
        if (err.code === 'ENOENT') return cb()
        return cb(err)
      }
      if (destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
        return cb(new Error(errMsg(src, dest, funcName)))
      }
      return checkParentPaths(src, srcStat, destParent, funcName, cb)
    })
  } else {
    fs.stat(destParent, (err, destStat) => {
      if (err) {
        if (err.code === 'ENOENT') return cb()
        return cb(err)
      }
      if (destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
        return cb(new Error(errMsg(src, dest, funcName)))
      }
      return checkParentPaths(src, srcStat, destParent, funcName, cb)
    })
  }
}

function checkParentPathsSync (src, srcStat, dest, funcName) {
  const srcParent = path.resolve(path.dirname(src))
  const destParent = path.resolve(path.dirname(dest))
  if (destParent === srcParent || destParent === path.parse(destParent).root) return
  let destStat
  try {
    if (nodeSupportsBigInt()) {
      destStat = fs.statSync(destParent, { bigint: true })
    } else {
      destStat = fs.statSync(destParent)
    }
  } catch (err) {
    if (err.code === 'ENOENT') return
    throw err
  }
  if (destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
    throw new Error(errMsg(src, dest, funcName))
  }
  return checkParentPathsSync(src, srcStat, destParent, funcName)
}

// return true if dest is a subdir of src, otherwise false.
// It only checks the path strings.
function isSrcSubdir (src, dest) {
  const srcArr = path.resolve(src).split(path.sep).filter(i => i)
  const destArr = path.resolve(dest).split(path.sep).filter(i => i)
  return srcArr.reduce((acc, cur, i) => acc && destArr[i] === cur, true)
}

function errMsg (src, dest, funcName) {
  return `Cannot ${funcName} '${src}' to a subdirectory of itself, '${dest}'.`
}

module.exports = {
  checkPaths,
  checkPathsSync,
  checkParentPaths,
  checkParentPathsSync,
  isSrcSubdir
}
'use strict'

const fs = require('graceful-fs')
const os = require('os')
const path = require('path')

// HFS, ext{2,3}, FAT do not, Node.js v0.10 does not
function hasMillisResSync () {
  let tmpfile = path.join('millis-test-sync' + Date.now().toString() + Math.random().toString().slice(2))
  tmpfile = path.join(os.tmpdir(), tmpfile)

  // 550 millis past UNIX epoch
  const d = new Date(1435410243862)
  fs.writeFileSync(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141')
  const fd = fs.openSync(tmpfile, 'r+')
  fs.futimesSync(fd, d, d)
  fs.closeSync(fd)
  return fs.statSync(tmpfile).mtime > 1435410243000
}

function hasMillisRes (callback) {
  let tmpfile = path.join('millis-test' + Date.now().toString() + Math.random().toString().slice(2))
  tmpfile = path.join(os.tmpdir(), tmpfile)

  // 550 millis past UNIX epoch
  const d = new Date(1435410243862)
  fs.writeFile(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141', err => {
    if (err) return callback(err)
    fs.open(tmpfile, 'r+', (err, fd) => {
      if (err) return callback(err)
      fs.futimes(fd, d, d, err => {
        if (err) return callback(err)
        fs.close(fd, err => {
          if (err) return callback(err)
          fs.stat(tmpfile, (err, stats) => {
            if (err) return callback(err)
            callback(null, stats.mtime > 1435410243000)
          })
        })
      })
    })
  })
}

function timeRemoveMillis (timestamp) {
  if (typeof timestamp === 'number') {
    return Math.floor(timestamp / 1000) * 1000
  } else if (timestamp instanceof Date) {
    return new Date(Math.floor(timestamp.getTime() / 1000) * 1000)
  } else {
    throw new Error('fs-extra: timeRemoveMillis() unknown parameter type')
  }
}

function utimesMillis (path, atime, mtime, callback) {
  // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)
  fs.open(path, 'r+', (err, fd) => {
    if (err) return callback(err)
    fs.futimes(fd, atime, mtime, futimesErr => {
      fs.close(fd, closeErr => {
        if (callback) callback(futimesErr || closeErr)
      })
    })
  })
}

function utimesMillisSync (path, atime, mtime) {
  const fd = fs.openSync(path, 'r+')
  fs.futimesSync(fd, atime, mtime)
  return fs.closeSync(fd)
}

module.exports = {
  hasMillisRes,
  hasMillisResSync,
  timeRemoveMillis,
  utimesMillis,
  utimesMillisSync
}
'use strict'

const u = require('universalify').fromCallback
const rimraf = require('./rimraf')

module.exports = {
  remove: u(rimraf),
  removeSync: rimraf.sync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const assert = require('assert')

const isWindows = (process.platform === 'win32')

function defaults (options) {
  const methods = [
    'unlink',
    'chmod',
    'stat',
    'lstat',
    'rmdir',
    'readdir'
  ]
  methods.forEach(m => {
    options[m] = options[m] || fs[m]
    m = m + 'Sync'
    options[m] = options[m] || fs[m]
  })

  options.maxBusyTries = options.maxBusyTries || 3
}

function rimraf (p, options, cb) {
  let busyTries = 0

  if (typeof options === 'function') {
    cb = options
    options = {}
  }

  assert(p, 'rimraf: missing path')
  assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
  assert.strictEqual(typeof cb, 'function', 'rimraf: callback function required')
  assert(options, 'rimraf: invalid options argument provided')
  assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')

  defaults(options)

  rimraf_(p, options, function CB (er) {
    if (er) {
      if ((er.code === 'EBUSY' || er.code === 'ENOTEMPTY' || er.code === 'EPERM') &&
          busyTries < options.maxBusyTries) {
        busyTries++
        const time = busyTries * 100
        // try again, with the same exact callback as this one.
        return setTimeout(() => rimraf_(p, options, CB), time)
      }

      // already gone
      if (er.code === 'ENOENT') er = null
    }

    cb(er)
  })
}

// Two possible strategies.
// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
//
// Both result in an extra syscall when you guess wrong.  However, there
// are likely far more normal files in the world than directories.  This
// is based on the assumption that a the average number of files per
// directory is >= 1.
//
// If anyone ever complains about this, then I guess the strategy could
// be made configurable somehow.  But until then, YAGNI.
function rimraf_ (p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  // sunos lets the root user unlink directories, which is... weird.
  // so we have to lstat here and make sure it's not a dir.
  options.lstat(p, (er, st) => {
    if (er && er.code === 'ENOENT') {
      return cb(null)
    }

    // Windows can EPERM on stat.  Life is suffering.
    if (er && er.code === 'EPERM' && isWindows) {
      return fixWinEPERM(p, options, er, cb)
    }

    if (st && st.isDirectory()) {
      return rmdir(p, options, er, cb)
    }

    options.unlink(p, er => {
      if (er) {
        if (er.code === 'ENOENT') {
          return cb(null)
        }
        if (er.code === 'EPERM') {
          return (isWindows)
            ? fixWinEPERM(p, options, er, cb)
            : rmdir(p, options, er, cb)
        }
        if (er.code === 'EISDIR') {
          return rmdir(p, options, er, cb)
        }
      }
      return cb(er)
    })
  })
}

function fixWinEPERM (p, options, er, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')
  if (er) {
    assert(er instanceof Error)
  }

  options.chmod(p, 0o666, er2 => {
    if (er2) {
      cb(er2.code === 'ENOENT' ? null : er)
    } else {
      options.stat(p, (er3, stats) => {
        if (er3) {
          cb(er3.code === 'ENOENT' ? null : er)
        } else if (stats.isDirectory()) {
          rmdir(p, options, er, cb)
        } else {
          options.unlink(p, cb)
        }
      })
    }
  })
}

function fixWinEPERMSync (p, options, er) {
  let stats

  assert(p)
  assert(options)
  if (er) {
    assert(er instanceof Error)
  }

  try {
    options.chmodSync(p, 0o666)
  } catch (er2) {
    if (er2.code === 'ENOENT') {
      return
    } else {
      throw er
    }
  }

  try {
    stats = options.statSync(p)
  } catch (er3) {
    if (er3.code === 'ENOENT') {
      return
    } else {
      throw er
    }
  }

  if (stats.isDirectory()) {
    rmdirSync(p, options, er)
  } else {
    options.unlinkSync(p)
  }
}

function rmdir (p, options, originalEr, cb) {
  assert(p)
  assert(options)
  if (originalEr) {
    assert(originalEr instanceof Error)
  }
  assert(typeof cb === 'function')

  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
  // if we guessed wrong, and it's not a directory, then
  // raise the original error.
  options.rmdir(p, er => {
    if (er && (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM')) {
      rmkids(p, options, cb)
    } else if (er && er.code === 'ENOTDIR') {
      cb(originalEr)
    } else {
      cb(er)
    }
  })
}

function rmkids (p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  options.readdir(p, (er, files) => {
    if (er) return cb(er)

    let n = files.length
    let errState

    if (n === 0) return options.rmdir(p, cb)

    files.forEach(f => {
      rimraf(path.join(p, f), options, er => {
        if (errState) {
          return
        }
        if (er) return cb(errState = er)
        if (--n === 0) {
          options.rmdir(p, cb)
        }
      })
    })
  })
}

// this looks simpler, and is strictly *faster*, but will
// tie up the JavaScript thread and fail on excessively
// deep directory trees.
function rimrafSync (p, options) {
  let st

  options = options || {}
  defaults(options)

  assert(p, 'rimraf: missing path')
  assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
  assert(options, 'rimraf: missing options')
  assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')

  try {
    st = options.lstatSync(p)
  } catch (er) {
    if (er.code === 'ENOENT') {
      return
    }

    // Windows can EPERM on stat.  Life is suffering.
    if (er.code === 'EPERM' && isWindows) {
      fixWinEPERMSync(p, options, er)
    }
  }

  try {
    // sunos lets the root user unlink directories, which is... weird.
    if (st && st.isDirectory()) {
      rmdirSync(p, options, null)
    } else {
      options.unlinkSync(p)
    }
  } catch (er) {
    if (er.code === 'ENOENT') {
      return
    } else if (er.code === 'EPERM') {
      return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
    } else if (er.code !== 'EISDIR') {
      throw er
    }
    rmdirSync(p, options, er)
  }
}

function rmdirSync (p, options, originalEr) {
  assert(p)
  assert(options)
  if (originalEr) {
    assert(originalEr instanceof Error)
  }

  try {
    options.rmdirSync(p)
  } catch (er) {
    if (er.code === 'ENOTDIR') {
      throw originalEr
    } else if (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM') {
      rmkidsSync(p, options)
    } else if (er.code !== 'ENOENT') {
      throw er
    }
  }
}

function rmkidsSync (p, options) {
  assert(p)
  assert(options)
  options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))

  if (isWindows) {
    // We only end up here once we got ENOTEMPTY at least once, and
    // at this point, we are guaranteed to have removed all the kids.
    // So, we know that it won't be ENOENT or ENOTDIR or anything else.
    // try really hard to delete stuff on windows, because it has a
    // PROFOUNDLY annoying habit of not closing handles promptly when
    // files are deleted, resulting in spurious ENOTEMPTY errors.
    const startTime = Date.now()
    do {
      try {
        const ret = options.rmdirSync(p, options)
        return ret
      } catch (er) { }
    } while (Date.now() - startTime < 500) // give up after 500ms
  } else {
    const ret = options.rmdirSync(p, options)
    return ret
  }
}

module.exports = rimraf
rimraf.sync = rimrafSync
'use strict'
const u = require('universalify').fromPromise
const fs = require('../fs')

function pathExists (path) {
  return fs.access(path).then(() => true).catch(() => false)
}

module.exports = {
  pathExists: u(pathExists),
  pathExistsSync: fs.existsSync
}
'use strict'

const u = require('universalify').fromCallback
const fs = require('graceful-fs')
const path = require('path')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function outputFile (file, data, encoding, callback) {
  if (typeof encoding === 'function') {
    callback = encoding
    encoding = 'utf8'
  }

  const dir = path.dirname(file)
  pathExists(dir, (err, itDoes) => {
    if (err) return callback(err)
    if (itDoes) return fs.writeFile(file, data, encoding, callback)

    mkdir.mkdirs(dir, err => {
      if (err) return callback(err)

      fs.writeFile(file, data, encoding, callback)
    })
  })
}

function outputFileSync (file, ...args) {
  const dir = path.dirname(file)
  if (fs.existsSync(dir)) {
    return fs.writeFileSync(file, ...args)
  }
  mkdir.mkdirsSync(dir)
  fs.writeFileSync(file, ...args)
}

module.exports = {
  outputFile: u(outputFile),
  outputFileSync
}
'use strict'

module.exports = {
  moveSync: require('./move-sync')
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const copySync = require('../copy-sync').copySync
const removeSync = require('../remove').removeSync
const mkdirpSync = require('../mkdirs').mkdirpSync
const stat = require('../util/stat')

function moveSync (src, dest, opts) {
  opts = opts || {}
  const overwrite = opts.overwrite || opts.clobber || false

  const { srcStat } = stat.checkPathsSync(src, dest, 'move')
  stat.checkParentPathsSync(src, srcStat, dest, 'move')
  mkdirpSync(path.dirname(dest))
  return doRename(src, dest, overwrite)
}

function doRename (src, dest, overwrite) {
  if (overwrite) {
    removeSync(dest)
    return rename(src, dest, overwrite)
  }
  if (fs.existsSync(dest)) throw new Error('dest already exists.')
  return rename(src, dest, overwrite)
}

function rename (src, dest, overwrite) {
  try {
    fs.renameSync(src, dest)
  } catch (err) {
    if (err.code !== 'EXDEV') throw err
    return moveAcrossDevice(src, dest, overwrite)
  }
}

function moveAcrossDevice (src, dest, overwrite) {
  const opts = {
    overwrite,
    errorOnExist: true
  }
  copySync(src, dest, opts)
  return removeSync(src)
}

module.exports = moveSync
'use strict'

const u = require('universalify').fromCallback
module.exports = {
  move: u(require('./move'))
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const copy = require('../copy').copy
const remove = require('../remove').remove
const mkdirp = require('../mkdirs').mkdirp
const pathExists = require('../path-exists').pathExists
const stat = require('../util/stat')

function move (src, dest, opts, cb) {
  if (typeof opts === 'function') {
    cb = opts
    opts = {}
  }

  const overwrite = opts.overwrite || opts.clobber || false

  stat.checkPaths(src, dest, 'move', (err, stats) => {
    if (err) return cb(err)
    const { srcStat } = stats
    stat.checkParentPaths(src, srcStat, dest, 'move', err => {
      if (err) return cb(err)
      mkdirp(path.dirname(dest), err => {
        if (err) return cb(err)
        return doRename(src, dest, overwrite, cb)
      })
    })
  })
}

function doRename (src, dest, overwrite, cb) {
  if (overwrite) {
    return remove(dest, err => {
      if (err) return cb(err)
      return rename(src, dest, overwrite, cb)
    })
  }
  pathExists(dest, (err, destExists) => {
    if (err) return cb(err)
    if (destExists) return cb(new Error('dest already exists.'))
    return rename(src, dest, overwrite, cb)
  })
}

function rename (src, dest, overwrite, cb) {
  fs.rename(src, dest, err => {
    if (!err) return cb()
    if (err.code !== 'EXDEV') return cb(err)
    return moveAcrossDevice(src, dest, overwrite, cb)
  })
}

function moveAcrossDevice (src, dest, overwrite, cb) {
  const opts = {
    overwrite,
    errorOnExist: true
  }
  copy(src, dest, opts, err => {
    if (err) return cb(err)
    return remove(src, cb)
  })
}

module.exports = move
'use strict'
const u = require('universalify').fromCallback
const mkdirs = u(require('./mkdirs'))
const mkdirsSync = require('./mkdirs-sync')

module.exports = {
  mkdirs,
  mkdirsSync,
  // alias
  mkdirp: mkdirs,
  mkdirpSync: mkdirsSync,
  ensureDir: mkdirs,
  ensureDirSync: mkdirsSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const invalidWin32Path = require('./win32').invalidWin32Path

const o777 = parseInt('0777', 8)

function mkdirsSync (p, opts, made) {
  if (!opts || typeof opts !== 'object') {
    opts = { mode: opts }
  }

  let mode = opts.mode
  const xfs = opts.fs || fs

  if (process.platform === 'win32' && invalidWin32Path(p)) {
    const errInval = new Error(p + ' contains invalid WIN32 path characters.')
    errInval.code = 'EINVAL'
    throw errInval
  }

  if (mode === undefined) {
    mode = o777 & (~process.umask())
  }
  if (!made) made = null

  p = path.resolve(p)

  try {
    xfs.mkdirSync(p, mode)
    made = made || p
  } catch (err0) {
    if (err0.code === 'ENOENT') {
      if (path.dirname(p) === p) throw err0
      made = mkdirsSync(path.dirname(p), opts, made)
      mkdirsSync(p, opts, made)
    } else {
      // In the case of any other error, just see if there's a dir there
      // already. If so, then hooray!  If not, then something is borked.
      let stat
      try {
        stat = xfs.statSync(p)
      } catch (err1) {
        throw err0
      }
      if (!stat.isDirectory()) throw err0
    }
  }

  return made
}

module.exports = mkdirsSync
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const invalidWin32Path = require('./win32').invalidWin32Path

const o777 = parseInt('0777', 8)

function mkdirs (p, opts, callback, made) {
  if (typeof opts === 'function') {
    callback = opts
    opts = {}
  } else if (!opts || typeof opts !== 'object') {
    opts = { mode: opts }
  }

  if (process.platform === 'win32' && invalidWin32Path(p)) {
    const errInval = new Error(p + ' contains invalid WIN32 path characters.')
    errInval.code = 'EINVAL'
    return callback(errInval)
  }

  let mode = opts.mode
  const xfs = opts.fs || fs

  if (mode === undefined) {
    mode = o777 & (~process.umask())
  }
  if (!made) made = null

  callback = callback || function () {}
  p = path.resolve(p)

  xfs.mkdir(p, mode, er => {
    if (!er) {
      made = made || p
      return callback(null, made)
    }
    switch (er.code) {
      case 'ENOENT':
        if (path.dirname(p) === p) return callback(er)
        mkdirs(path.dirname(p), opts, (er, made) => {
          if (er) callback(er, made)
          else mkdirs(p, opts, callback, made)
        })
        break

      // In the case of any other error, just see if there's a dir
      // there already.  If so, then hooray!  If not, then something
      // is borked.
      default:
        xfs.stat(p, (er2, stat) => {
          // if the stat fails, then that's super weird.
          // let the original error be the failure reason.
          if (er2 || !stat.isDirectory()) callback(er, made)
          else callback(null, made)
        })
        break
    }
  })
}

module.exports = mkdirs
'use strict'

const path = require('path')

// get drive on windows
function getRootPath (p) {
  p = path.normalize(path.resolve(p)).split(path.sep)
  if (p.length > 0) return p[0]
  return null
}

// http://stackoverflow.com/a/62888/10333 contains more accurate
// TODO: expand to include the rest
const INVALID_PATH_CHARS = /[<>:"|?*]/

function invalidWin32Path (p) {
  const rp = getRootPath(p)
  p = p.replace(rp, '')
  return INVALID_PATH_CHARS.test(p)
}

module.exports = {
  getRootPath,
  invalidWin32Path
}
'use strict'

const u = require('universalify').fromCallback
const jsonFile = require('./jsonfile')

jsonFile.outputJson = u(require('./output-json'))
jsonFile.outputJsonSync = require('./output-json-sync')
// aliases
jsonFile.outputJSON = jsonFile.outputJson
jsonFile.outputJSONSync = jsonFile.outputJsonSync
jsonFile.writeJSON = jsonFile.writeJson
jsonFile.writeJSONSync = jsonFile.writeJsonSync
jsonFile.readJSON = jsonFile.readJson
jsonFile.readJSONSync = jsonFile.readJsonSync

module.exports = jsonFile
'use strict'

const u = require('universalify').fromCallback
const jsonFile = require('jsonfile')

module.exports = {
  // jsonfile exports
  readJson: u(jsonFile.readFile),
  readJsonSync: jsonFile.readFileSync,
  writeJson: u(jsonFile.writeFile),
  writeJsonSync: jsonFile.writeFileSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdir = require('../mkdirs')
const jsonFile = require('./jsonfile')

function outputJsonSync (file, data, options) {
  const dir = path.dirname(file)

  if (!fs.existsSync(dir)) {
    mkdir.mkdirsSync(dir)
  }

  jsonFile.writeJsonSync(file, data, options)
}

module.exports = outputJsonSync
'use strict'

const path = require('path')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists
const jsonFile = require('./jsonfile')

function outputJson (file, data, options, callback) {
  if (typeof options === 'function') {
    callback = options
    options = {}
  }

  const dir = path.dirname(file)

  pathExists(dir, (err, itDoes) => {
    if (err) return callback(err)
    if (itDoes) return jsonFile.writeJson(file, data, options, callback)

    mkdir.mkdirs(dir, err => {
      if (err) return callback(err)
      jsonFile.writeJson(file, data, options, callback)
    })
  })
}

module.exports = outputJson
'use strict'
// This is adapted from https://github.com/normalize/mz
// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
const u = require('universalify').fromCallback
const fs = require('graceful-fs')

const api = [
  'access',
  'appendFile',
  'chmod',
  'chown',
  'close',
  'copyFile',
  'fchmod',
  'fchown',
  'fdatasync',
  'fstat',
  'fsync',
  'ftruncate',
  'futimes',
  'lchown',
  'lchmod',
  'link',
  'lstat',
  'mkdir',
  'mkdtemp',
  'open',
  'readFile',
  'readdir',
  'readlink',
  'realpath',
  'rename',
  'rmdir',
  'stat',
  'symlink',
  'truncate',
  'unlink',
  'utimes',
  'writeFile'
].filter(key => {
  // Some commands are not available on some systems. Ex:
  // fs.copyFile was added in Node.js v8.5.0
  // fs.mkdtemp was added in Node.js v5.10.0
  // fs.lchown is not available on at least some Linux
  return typeof fs[key] === 'function'
})

// Export all keys:
Object.keys(fs).forEach(key => {
  if (key === 'promises') {
    // fs.promises is a getter property that triggers ExperimentalWarning
    // Don't re-export it here, the getter is defined in "lib/index.js"
    return
  }
  exports[key] = fs[key]
})

// Universalify async methods:
api.forEach(method => {
  exports[method] = u(fs[method])
})

// We differ from mz/fs in that we still ship the old, broken, fs.exists()
// since we are a drop-in replacement for the native module
exports.exists = function (filename, callback) {
  if (typeof callback === 'function') {
    return fs.exists(filename, callback)
  }
  return new Promise(resolve => {
    return fs.exists(filename, resolve)
  })
}

// fs.read() & fs.write need special treatment due to multiple callback args

exports.read = function (fd, buffer, offset, length, position, callback) {
  if (typeof callback === 'function') {
    return fs.read(fd, buffer, offset, length, position, callback)
  }
  return new Promise((resolve, reject) => {
    fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
      if (err) return reject(err)
      resolve({ bytesRead, buffer })
    })
  })
}

// Function signature can be
// fs.write(fd, buffer[, offset[, length[, position]]], callback)
// OR
// fs.write(fd, string[, position[, encoding]], callback)
// We need to handle both cases, so we use ...args
exports.write = function (fd, buffer, ...args) {
  if (typeof args[args.length - 1] === 'function') {
    return fs.write(fd, buffer, ...args)
  }

  return new Promise((resolve, reject) => {
    fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {
      if (err) return reject(err)
      resolve({ bytesWritten, buffer })
    })
  })
}

// fs.realpath.native only available in Node v9.2+
if (typeof fs.realpath.native === 'function') {
  exports.realpath.native = u(fs.realpath.native)
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function createFile (file, callback) {
  function makeFile () {
    fs.writeFile(file, '', err => {
      if (err) return callback(err)
      callback()
    })
  }

  fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err
    if (!err && stats.isFile()) return callback()
    const dir = path.dirname(file)
    pathExists(dir, (err, dirExists) => {
      if (err) return callback(err)
      if (dirExists) return makeFile()
      mkdir.mkdirs(dir, err => {
        if (err) return callback(err)
        makeFile()
      })
    })
  })
}

function createFileSync (file) {
  let stats
  try {
    stats = fs.statSync(file)
  } catch (e) {}
  if (stats && stats.isFile()) return

  const dir = path.dirname(file)
  if (!fs.existsSync(dir)) {
    mkdir.mkdirsSync(dir)
  }

  fs.writeFileSync(file, '')
}

module.exports = {
  createFile: u(createFile),
  createFileSync
}
'use strict'

const file = require('./file')
const link = require('./link')
const symlink = require('./symlink')

module.exports = {
  // file
  createFile: file.createFile,
  createFileSync: file.createFileSync,
  ensureFile: file.createFile,
  ensureFileSync: file.createFileSync,
  // link
  createLink: link.createLink,
  createLinkSync: link.createLinkSync,
  ensureLink: link.createLink,
  ensureLinkSync: link.createLinkSync,
  // symlink
  createSymlink: symlink.createSymlink,
  createSymlinkSync: symlink.createSymlinkSync,
  ensureSymlink: symlink.createSymlink,
  ensureSymlinkSync: symlink.createSymlinkSync
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function createLink (srcpath, dstpath, callback) {
  function makeLink (srcpath, dstpath) {
    fs.link(srcpath, dstpath, err => {
      if (err) return callback(err)
      callback(null)
    })
  }

  pathExists(dstpath, (err, destinationExists) => {
    if (err) return callback(err)
    if (destinationExists) return callback(null)
    fs.lstat(srcpath, (err) => {
      if (err) {
        err.message = err.message.replace('lstat', 'ensureLink')
        return callback(err)
      }

      const dir = path.dirname(dstpath)
      pathExists(dir, (err, dirExists) => {
        if (err) return callback(err)
        if (dirExists) return makeLink(srcpath, dstpath)
        mkdir.mkdirs(dir, err => {
          if (err) return callback(err)
          makeLink(srcpath, dstpath)
        })
      })
    })
  })
}

function createLinkSync (srcpath, dstpath) {
  const destinationExists = fs.existsSync(dstpath)
  if (destinationExists) return undefined

  try {
    fs.lstatSync(srcpath)
  } catch (err) {
    err.message = err.message.replace('lstat', 'ensureLink')
    throw err
  }

  const dir = path.dirname(dstpath)
  const dirExists = fs.existsSync(dir)
  if (dirExists) return fs.linkSync(srcpath, dstpath)
  mkdir.mkdirsSync(dir)

  return fs.linkSync(srcpath, dstpath)
}

module.exports = {
  createLink: u(createLink),
  createLinkSync
}
'use strict'

const path = require('path')
const fs = require('graceful-fs')
const pathExists = require('../path-exists').pathExists

/**
 * Function that returns two types of paths, one relative to symlink, and one
 * relative to the current working directory. Checks if path is absolute or
 * relative. If the path is relative, this function checks if the path is
 * relative to symlink or relative to current working directory. This is an
 * initiative to find a smarter `srcpath` to supply when building symlinks.
 * This allows you to determine which path to use out of one of three possible
 * types of source paths. The first is an absolute path. This is detected by
 * `path.isAbsolute()`. When an absolute path is provided, it is checked to
 * see if it exists. If it does it's used, if not an error is returned
 * (callback)/ thrown (sync). The other two options for `srcpath` are a
 * relative url. By default Node's `fs.symlink` works by creating a symlink
 * using `dstpath` and expects the `srcpath` to be relative to the newly
 * created symlink. If you provide a `srcpath` that does not exist on the file
 * system it results in a broken symlink. To minimize this, the function
 * checks to see if the 'relative to symlink' source file exists, and if it
 * does it will use it. If it does not, it checks if there's a file that
 * exists that is relative to the current working directory, if does its used.
 * This preserves the expectations of the original fs.symlink spec and adds
 * the ability to pass in `relative to current working direcotry` paths.
 */

function symlinkPaths (srcpath, dstpath, callback) {
  if (path.isAbsolute(srcpath)) {
    return fs.lstat(srcpath, (err) => {
      if (err) {
        err.message = err.message.replace('lstat', 'ensureSymlink')
        return callback(err)
      }
      return callback(null, {
        'toCwd': srcpath,
        'toDst': srcpath
      })
    })
  } else {
    const dstdir = path.dirname(dstpath)
    const relativeToDst = path.join(dstdir, srcpath)
    return pathExists(relativeToDst, (err, exists) => {
      if (err) return callback(err)
      if (exists) {
        return callback(null, {
          'toCwd': relativeToDst,
          'toDst': srcpath
        })
      } else {
        return fs.lstat(srcpath, (err) => {
          if (err) {
            err.message = err.message.replace('lstat', 'ensureSymlink')
            return callback(err)
          }
          return callback(null, {
            'toCwd': srcpath,
            'toDst': path.relative(dstdir, srcpath)
          })
        })
      }
    })
  }
}

function symlinkPathsSync (srcpath, dstpath) {
  let exists
  if (path.isAbsolute(srcpath)) {
    exists = fs.existsSync(srcpath)
    if (!exists) throw new Error('absolute srcpath does not exist')
    return {
      'toCwd': srcpath,
      'toDst': srcpath
    }
  } else {
    const dstdir = path.dirname(dstpath)
    const relativeToDst = path.join(dstdir, srcpath)
    exists = fs.existsSync(relativeToDst)
    if (exists) {
      return {
        'toCwd': relativeToDst,
        'toDst': srcpath
      }
    } else {
      exists = fs.existsSync(srcpath)
      if (!exists) throw new Error('relative srcpath does not exist')
      return {
        'toCwd': srcpath,
        'toDst': path.relative(dstdir, srcpath)
      }
    }
  }
}

module.exports = {
  symlinkPaths,
  symlinkPathsSync
}
'use strict'

const fs = require('graceful-fs')

function symlinkType (srcpath, type, callback) {
  callback = (typeof type === 'function') ? type : callback
  type = (typeof type === 'function') ? false : type
  if (type) return callback(null, type)
  fs.lstat(srcpath, (err, stats) => {
    if (err) return callback(null, 'file')
    type = (stats && stats.isDirectory()) ? 'dir' : 'file'
    callback(null, type)
  })
}

function symlinkTypeSync (srcpath, type) {
  let stats

  if (type) return type
  try {
    stats = fs.lstatSync(srcpath)
  } catch (e) {
    return 'file'
  }
  return (stats && stats.isDirectory()) ? 'dir' : 'file'
}

module.exports = {
  symlinkType,
  symlinkTypeSync
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const _mkdirs = require('../mkdirs')
const mkdirs = _mkdirs.mkdirs
const mkdirsSync = _mkdirs.mkdirsSync

const _symlinkPaths = require('./symlink-paths')
const symlinkPaths = _symlinkPaths.symlinkPaths
const symlinkPathsSync = _symlinkPaths.symlinkPathsSync

const _symlinkType = require('./symlink-type')
const symlinkType = _symlinkType.symlinkType
const symlinkTypeSync = _symlinkType.symlinkTypeSync

const pathExists = require('../path-exists').pathExists

function createSymlink (srcpath, dstpath, type, callback) {
  callback = (typeof type === 'function') ? type : callback
  type = (typeof type === 'function') ? false : type

  pathExists(dstpath, (err, destinationExists) => {
    if (err) return callback(err)
    if (destinationExists) return callback(null)
    symlinkPaths(srcpath, dstpath, (err, relative) => {
      if (err) return callback(err)
      srcpath = relative.toDst
      symlinkType(relative.toCwd, type, (err, type) => {
        if (err) return callback(err)
        const dir = path.dirname(dstpath)
        pathExists(dir, (err, dirExists) => {
          if (err) return callback(err)
          if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
          mkdirs(dir, err => {
            if (err) return callback(err)
            fs.symlink(srcpath, dstpath, type, callback)
          })
        })
      })
    })
  })
}

function createSymlinkSync (srcpath, dstpath, type) {
  const destinationExists = fs.existsSync(dstpath)
  if (destinationExists) return undefined

  const relative = symlinkPathsSync(srcpath, dstpath)
  srcpath = relative.toDst
  type = symlinkTypeSync(relative.toCwd, type)
  const dir = path.dirname(dstpath)
  const exists = fs.existsSync(dir)
  if (exists) return fs.symlinkSync(srcpath, dstpath, type)
  mkdirsSync(dir)
  return fs.symlinkSync(srcpath, dstpath, type)
}

module.exports = {
  createSymlink: u(createSymlink),
  createSymlinkSync
}
'use strict'

const u = require('universalify').fromCallback
const fs = require('graceful-fs')
const path = require('path')
const mkdir = require('../mkdirs')
const remove = require('../remove')

const emptyDir = u(function emptyDir (dir, callback) {
  callback = callback || function () {}
  fs.readdir(dir, (err, items) => {
    if (err) return mkdir.mkdirs(dir, callback)

    items = items.map(item => path.join(dir, item))

    deleteItem()

    function deleteItem () {
      const item = items.pop()
      if (!item) return callback()
      remove.remove(item, err => {
        if (err) return callback(err)
        deleteItem()
      })
    }
  })
})

function emptyDirSync (dir) {
  let items
  try {
    items = fs.readdirSync(dir)
  } catch (err) {
    return mkdir.mkdirsSync(dir)
  }

  items.forEach(item => {
    item = path.join(dir, item)
    remove.removeSync(item)
  })
}

module.exports = {
  emptyDirSync,
  emptydirSync: emptyDirSync,
  emptyDir,
  emptydir: emptyDir
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdirpSync = require('../mkdirs').mkdirsSync
const utimesSync = require('../util/utimes.js').utimesMillisSync
const stat = require('../util/stat')

function copySync (src, dest, opts) {
  if (typeof opts === 'function') {
    opts = { filter: opts }
  }

  opts = opts || {}
  opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
  opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber

  // Warn about using preserveTimestamps on 32-bit node
  if (opts.preserveTimestamps && process.arch === 'ia32') {
    console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
    see https://github.com/jprichardson/node-fs-extra/issues/269`)
  }

  const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy')
  stat.checkParentPathsSync(src, srcStat, dest, 'copy')
  return handleFilterAndCopy(destStat, src, dest, opts)
}

function handleFilterAndCopy (destStat, src, dest, opts) {
  if (opts.filter && !opts.filter(src, dest)) return
  const destParent = path.dirname(dest)
  if (!fs.existsSync(destParent)) mkdirpSync(destParent)
  return startCopy(destStat, src, dest, opts)
}

function startCopy (destStat, src, dest, opts) {
  if (opts.filter && !opts.filter(src, dest)) return
  return getStats(destStat, src, dest, opts)
}

function getStats (destStat, src, dest, opts) {
  const statSync = opts.dereference ? fs.statSync : fs.lstatSync
  const srcStat = statSync(src)

  if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts)
  else if (srcStat.isFile() ||
           srcStat.isCharacterDevice() ||
           srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts)
  else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts)
}

function onFile (srcStat, destStat, src, dest, opts) {
  if (!destStat) return copyFile(srcStat, src, dest, opts)
  return mayCopyFile(srcStat, src, dest, opts)
}

function mayCopyFile (srcStat, src, dest, opts) {
  if (opts.overwrite) {
    fs.unlinkSync(dest)
    return copyFile(srcStat, src, dest, opts)
  } else if (opts.errorOnExist) {
    throw new Error(`'${dest}' already exists`)
  }
}

function copyFile (srcStat, src, dest, opts) {
  if (typeof fs.copyFileSync === 'function') {
    fs.copyFileSync(src, dest)
    fs.chmodSync(dest, srcStat.mode)
    if (opts.preserveTimestamps) {
      return utimesSync(dest, srcStat.atime, srcStat.mtime)
    }
    return
  }
  return copyFileFallback(srcStat, src, dest, opts)
}

function copyFileFallback (srcStat, src, dest, opts) {
  const BUF_LENGTH = 64 * 1024
  const _buff = require('../util/buffer')(BUF_LENGTH)

  const fdr = fs.openSync(src, 'r')
  const fdw = fs.openSync(dest, 'w', srcStat.mode)
  let pos = 0

  while (pos < srcStat.size) {
    const bytesRead = fs.readSync(fdr, _buff, 0, BUF_LENGTH, pos)
    fs.writeSync(fdw, _buff, 0, bytesRead)
    pos += bytesRead
  }

  if (opts.preserveTimestamps) fs.futimesSync(fdw, srcStat.atime, srcStat.mtime)

  fs.closeSync(fdr)
  fs.closeSync(fdw)
}

function onDir (srcStat, destStat, src, dest, opts) {
  if (!destStat) return mkDirAndCopy(srcStat, src, dest, opts)
  if (destStat && !destStat.isDirectory()) {
    throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`)
  }
  return copyDir(src, dest, opts)
}

function mkDirAndCopy (srcStat, src, dest, opts) {
  fs.mkdirSync(dest)
  copyDir(src, dest, opts)
  return fs.chmodSync(dest, srcStat.mode)
}

function copyDir (src, dest, opts) {
  fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts))
}

function copyDirItem (item, src, dest, opts) {
  const srcItem = path.join(src, item)
  const destItem = path.join(dest, item)
  const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy')
  return startCopy(destStat, srcItem, destItem, opts)
}

function onLink (destStat, src, dest, opts) {
  let resolvedSrc = fs.readlinkSync(src)
  if (opts.dereference) {
    resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
  }

  if (!destStat) {
    return fs.symlinkSync(resolvedSrc, dest)
  } else {
    let resolvedDest
    try {
      resolvedDest = fs.readlinkSync(dest)
    } catch (err) {
      // dest exists and is a regular file or directory,
      // Windows may throw UNKNOWN error. If dest already exists,
      // fs throws error anyway, so no need to guard against it here.
      if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest)
      throw err
    }
    if (opts.dereference) {
      resolvedDest = path.resolve(process.cwd(), resolvedDest)
    }
    if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
      throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`)
    }

    // prevent copy if src is a subdir of dest since unlinking
    // dest in this case would result in removing src contents
    // and therefore a broken symlink would be created.
    if (fs.statSync(dest).isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
      throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)
    }
    return copyLink(resolvedSrc, dest)
  }
}

function copyLink (resolvedSrc, dest) {
  fs.unlinkSync(dest)
  return fs.symlinkSync(resolvedSrc, dest)
}

module.exports = copySync
'use strict'

module.exports = {
  copySync: require('./copy-sync')
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdirp = require('../mkdirs').mkdirs
const pathExists = require('../path-exists').pathExists
const utimes = require('../util/utimes').utimesMillis
const stat = require('../util/stat')

function copy (src, dest, opts, cb) {
  if (typeof opts === 'function' && !cb) {
    cb = opts
    opts = {}
  } else if (typeof opts === 'function') {
    opts = { filter: opts }
  }

  cb = cb || function () {}
  opts = opts || {}

  opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
  opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber

  // Warn about using preserveTimestamps on 32-bit node
  if (opts.preserveTimestamps && process.arch === 'ia32') {
    console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
    see https://github.com/jprichardson/node-fs-extra/issues/269`)
  }

  stat.checkPaths(src, dest, 'copy', (err, stats) => {
    if (err) return cb(err)
    const { srcStat, destStat } = stats
    stat.checkParentPaths(src, srcStat, dest, 'copy', err => {
      if (err) return cb(err)
      if (opts.filter) return handleFilter(checkParentDir, destStat, src, dest, opts, cb)
      return checkParentDir(destStat, src, dest, opts, cb)
    })
  })
}

function checkParentDir (destStat, src, dest, opts, cb) {
  const destParent = path.dirname(dest)
  pathExists(destParent, (err, dirExists) => {
    if (err) return cb(err)
    if (dirExists) return startCopy(destStat, src, dest, opts, cb)
    mkdirp(destParent, err => {
      if (err) return cb(err)
      return startCopy(destStat, src, dest, opts, cb)
    })
  })
}

function handleFilter (onInclude, destStat, src, dest, opts, cb) {
  Promise.resolve(opts.filter(src, dest)).then(include => {
    if (include) return onInclude(destStat, src, dest, opts, cb)
    return cb()
  }, error => cb(error))
}

function startCopy (destStat, src, dest, opts, cb) {
  if (opts.filter) return handleFilter(getStats, destStat, src, dest, opts, cb)
  return getStats(destStat, src, dest, opts, cb)
}

function getStats (destStat, src, dest, opts, cb) {
  const stat = opts.dereference ? fs.stat : fs.lstat
  stat(src, (err, srcStat) => {
    if (err) return cb(err)

    if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts, cb)
    else if (srcStat.isFile() ||
             srcStat.isCharacterDevice() ||
             srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts, cb)
    else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts, cb)
  })
}

function onFile (srcStat, destStat, src, dest, opts, cb) {
  if (!destStat) return copyFile(srcStat, src, dest, opts, cb)
  return mayCopyFile(srcStat, src, dest, opts, cb)
}

function mayCopyFile (srcStat, src, dest, opts, cb) {
  if (opts.overwrite) {
    fs.unlink(dest, err => {
      if (err) return cb(err)
      return copyFile(srcStat, src, dest, opts, cb)
    })
  } else if (opts.errorOnExist) {
    return cb(new Error(`'${dest}' already exists`))
  } else return cb()
}

function copyFile (srcStat, src, dest, opts, cb) {
  if (typeof fs.copyFile === 'function') {
    return fs.copyFile(src, dest, err => {
      if (err) return cb(err)
      return setDestModeAndTimestamps(srcStat, dest, opts, cb)
    })
  }
  return copyFileFallback(srcStat, src, dest, opts, cb)
}

function copyFileFallback (srcStat, src, dest, opts, cb) {
  const rs = fs.createReadStream(src)
  rs.on('error', err => cb(err)).once('open', () => {
    const ws = fs.createWriteStream(dest, { mode: srcStat.mode })
    ws.on('error', err => cb(err))
      .on('open', () => rs.pipe(ws))
      .once('close', () => setDestModeAndTimestamps(srcStat, dest, opts, cb))
  })
}

function setDestModeAndTimestamps (srcStat, dest, opts, cb) {
  fs.chmod(dest, srcStat.mode, err => {
    if (err) return cb(err)
    if (opts.preserveTimestamps) {
      return utimes(dest, srcStat.atime, srcStat.mtime, cb)
    }
    return cb()
  })
}

function onDir (srcStat, destStat, src, dest, opts, cb) {
  if (!destStat) return mkDirAndCopy(srcStat, src, dest, opts, cb)
  if (destStat && !destStat.isDirectory()) {
    return cb(new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`))
  }
  return copyDir(src, dest, opts, cb)
}

function mkDirAndCopy (srcStat, src, dest, opts, cb) {
  fs.mkdir(dest, err => {
    if (err) return cb(err)
    copyDir(src, dest, opts, err => {
      if (err) return cb(err)
      return fs.chmod(dest, srcStat.mode, cb)
    })
  })
}

function copyDir (src, dest, opts, cb) {
  fs.readdir(src, (err, items) => {
    if (err) return cb(err)
    return copyDirItems(items, src, dest, opts, cb)
  })
}

function copyDirItems (items, src, dest, opts, cb) {
  const item = items.pop()
  if (!item) return cb()
  return copyDirItem(items, item, src, dest, opts, cb)
}

function copyDirItem (items, item, src, dest, opts, cb) {
  const srcItem = path.join(src, item)
  const destItem = path.join(dest, item)
  stat.checkPaths(srcItem, destItem, 'copy', (err, stats) => {
    if (err) return cb(err)
    const { destStat } = stats
    startCopy(destStat, srcItem, destItem, opts, err => {
      if (err) return cb(err)
      return copyDirItems(items, src, dest, opts, cb)
    })
  })
}

function onLink (destStat, src, dest, opts, cb) {
  fs.readlink(src, (err, resolvedSrc) => {
    if (err) return cb(err)
    if (opts.dereference) {
      resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
    }

    if (!destStat) {
      return fs.symlink(resolvedSrc, dest, cb)
    } else {
      fs.readlink(dest, (err, resolvedDest) => {
        if (err) {
          // dest exists and is a regular file or directory,
          // Windows may throw UNKNOWN error. If dest already exists,
          // fs throws error anyway, so no need to guard against it here.
          if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest, cb)
          return cb(err)
        }
        if (opts.dereference) {
          resolvedDest = path.resolve(process.cwd(), resolvedDest)
        }
        if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
          return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))
        }

        // do not copy if src is a subdir of dest since unlinking
        // dest in this case would result in removing src contents
        // and therefore a broken symlink would be created.
        if (destStat.isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
          return cb(new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`))
        }
        return copyLink(resolvedSrc, dest, cb)
      })
    }
  })
}

function copyLink (resolvedSrc, dest, cb) {
  fs.unlink(dest, err => {
    if (err) return cb(err)
    return fs.symlink(resolvedSrc, dest, cb)
  })
}

module.exports = copy
'use strict'

const u = require('universalify').fromCallback
module.exports = {
  copy: u(require('./copy'))
}
The MIT License (MIT)

Copyright (c) 2017 Vladimir Krivosheev

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
"use strict"

const path = require("path")
const nodeFs = require("fs")
const fsExtra = require("fs-extra")
const Promise = require('bluebird-lst')

function makeFs(Promise) {
  const fs = Object.create(null)

  for (const methodName of Object.keys(fsExtra)) {
    const method = fsExtra[methodName]
    if (methodName === "createFile" || methodName === "mkdirp") {
      continue
    }

    if (typeof method !== "function" ||
        methodName.endsWith("Sync") ||
        methodName.endsWith("Stream") ||
        methodName.match(/^[A-Z]/) ||
        methodName === "exists" ||
        methodName === "watch" ||
        methodName === "watchFile" ||
        methodName === "unwatchFile") {
      fs[methodName] = method
    }
    else {
      fs[methodName] = Promise.promisify(method)
    }
  }

  fs.createFile = fs.ensureFile
  fs.mkdirp = fs.mkdirs
  return fs
}

const newFs = makeFs(Promise)

newFs.emptyDir = function (dir) {
  return new Promise((resolve, reject) => {
    nodeFs.readdir(dir, (error, files) => {
      if (error == null) {
        Promise.map(files, it => newFs.remove(path.join(dir, it)))
          .then(resolve)
          .catch(reject)
      }
      else {
        newFs.mkdirs(dir)
          .then(resolve)
          .catch(reject)
      }
    })
  })
}

module.exports = newFs{
  "dependencies": {
    "bluebird-lst": "^1.0.9",
    "fs-extra": "^8.1.0"
  },
  "deprecated": false,
  "description": "fs-extra module promisified with bluebird",
  "engines": {
    "node": ">=8.6"
  },
  "files": [
    "index.*"
  ],
  "homepage": "https://github.com/develar/fs-extra-p#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "fs-extra-p",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/develar/fs-extra-p.git"
  },
  "version": "8.1.0"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

----

This library bundles a version of the `fs.realpath` and `fs.realpathSync`
methods from Node.js v0.10 under the terms of the Node.js MIT license.

Node's license follows, also included at the header of `old.js` which contains
the licensed code:

  Copyright Joyent, Inc. and other Node contributors.

  Permission is hereby granted, free of charge, to any person obtaining a
  copy of this software and associated documentation files (the "Software"),
  to deal in the Software without restriction, including without limitation
  the rights to use, copy, modify, merge, publish, distribute, sublicense,
  and/or sell copies of the Software, and to permit persons to whom the
  Software is furnished to do so, subject to the following conditions:

  The above copyright notice and this permission notice shall be included in
  all copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  DEALINGS IN THE SOFTWARE.
module.exports = realpath
realpath.realpath = realpath
realpath.sync = realpathSync
realpath.realpathSync = realpathSync
realpath.monkeypatch = monkeypatch
realpath.unmonkeypatch = unmonkeypatch

var fs = require('fs')
var origRealpath = fs.realpath
var origRealpathSync = fs.realpathSync

var version = process.version
var ok = /^v[0-5]\./.test(version)
var old = require('./old.js')

function newError (er) {
  return er && er.syscall === 'realpath' && (
    er.code === 'ELOOP' ||
    er.code === 'ENOMEM' ||
    er.code === 'ENAMETOOLONG'
  )
}

function realpath (p, cache, cb) {
  if (ok) {
    return origRealpath(p, cache, cb)
  }

  if (typeof cache === 'function') {
    cb = cache
    cache = null
  }
  origRealpath(p, cache, function (er, result) {
    if (newError(er)) {
      old.realpath(p, cache, cb)
    } else {
      cb(er, result)
    }
  })
}

function realpathSync (p, cache) {
  if (ok) {
    return origRealpathSync(p, cache)
  }

  try {
    return origRealpathSync(p, cache)
  } catch (er) {
    if (newError(er)) {
      return old.realpathSync(p, cache)
    } else {
      throw er
    }
  }
}

function monkeypatch () {
  fs.realpath = realpath
  fs.realpathSync = realpathSync
}

function unmonkeypatch () {
  fs.realpath = origRealpath
  fs.realpathSync = origRealpathSync
}
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

var pathModule = require('path');
var isWindows = process.platform === 'win32';
var fs = require('fs');

// JavaScript implementation of realpath, ported from node pre-v6

var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);

function rethrow() {
  // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and
  // is fairly slow to generate.
  var callback;
  if (DEBUG) {
    var backtrace = new Error;
    callback = debugCallback;
  } else
    callback = missingCallback;

  return callback;

  function debugCallback(err) {
    if (err) {
      backtrace.message = err.message;
      err = backtrace;
      missingCallback(err);
    }
  }

  function missingCallback(err) {
    if (err) {
      if (process.throwDeprecation)
        throw err;  // Forgot a callback but don't know where? Use NODE_DEBUG=fs
      else if (!process.noDeprecation) {
        var msg = 'fs: missing callback ' + (err.stack || err.message);
        if (process.traceDeprecation)
          console.trace(msg);
        else
          console.error(msg);
      }
    }
  }
}

function maybeCallback(cb) {
  return typeof cb === 'function' ? cb : rethrow();
}

var normalize = pathModule.normalize;

// Regexp that finds the next partion of a (partial) path
// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']
if (isWindows) {
  var nextPartRe = /(.*?)(?:[\/\\]+|$)/g;
} else {
  var nextPartRe = /(.*?)(?:[\/]+|$)/g;
}

// Regex to find the device root, including trailing slash. E.g. 'c:\\'.
if (isWindows) {
  var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/;
} else {
  var splitRootRe = /^[\/]*/;
}

exports.realpathSync = function realpathSync(p, cache) {
  // make p is absolute
  p = pathModule.resolve(p);

  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
    return cache[p];
  }

  var original = p,
      seenLinks = {},
      knownHard = {};

  // current character position in p
  var pos;
  // the partial path so far, including a trailing slash if any
  var current;
  // the partial path without a trailing slash (except when pointing at a root)
  var base;
  // the partial path scanned in the previous round, with slash
  var previous;

  start();

  function start() {
    // Skip over roots
    var m = splitRootRe.exec(p);
    pos = m[0].length;
    current = m[0];
    base = m[0];
    previous = '';

    // On windows, check that the root exists. On unix there is no need.
    if (isWindows && !knownHard[base]) {
      fs.lstatSync(base);
      knownHard[base] = true;
    }
  }

  // walk down the path, swapping out linked pathparts for their real
  // values
  // NB: p.length changes.
  while (pos < p.length) {
    // find the next part
    nextPartRe.lastIndex = pos;
    var result = nextPartRe.exec(p);
    previous = current;
    current += result[0];
    base = previous + result[1];
    pos = nextPartRe.lastIndex;

    // continue if not a symlink
    if (knownHard[base] || (cache && cache[base] === base)) {
      continue;
    }

    var resolvedLink;
    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
      // some known symbolic link.  no need to stat again.
      resolvedLink = cache[base];
    } else {
      var stat = fs.lstatSync(base);
      if (!stat.isSymbolicLink()) {
        knownHard[base] = true;
        if (cache) cache[base] = base;
        continue;
      }

      // read the link if it wasn't read before
      // dev/ino always return 0 on windows, so skip the check.
      var linkTarget = null;
      if (!isWindows) {
        var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
        if (seenLinks.hasOwnProperty(id)) {
          linkTarget = seenLinks[id];
        }
      }
      if (linkTarget === null) {
        fs.statSync(base);
        linkTarget = fs.readlinkSync(base);
      }
      resolvedLink = pathModule.resolve(previous, linkTarget);
      // track this, if given a cache.
      if (cache) cache[base] = resolvedLink;
      if (!isWindows) seenLinks[id] = linkTarget;
    }

    // resolve the link, then start over
    p = pathModule.resolve(resolvedLink, p.slice(pos));
    start();
  }

  if (cache) cache[original] = p;

  return p;
};


exports.realpath = function realpath(p, cache, cb) {
  if (typeof cb !== 'function') {
    cb = maybeCallback(cache);
    cache = null;
  }

  // make p is absolute
  p = pathModule.resolve(p);

  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
    return process.nextTick(cb.bind(null, null, cache[p]));
  }

  var original = p,
      seenLinks = {},
      knownHard = {};

  // current character position in p
  var pos;
  // the partial path so far, including a trailing slash if any
  var current;
  // the partial path without a trailing slash (except when pointing at a root)
  var base;
  // the partial path scanned in the previous round, with slash
  var previous;

  start();

  function start() {
    // Skip over roots
    var m = splitRootRe.exec(p);
    pos = m[0].length;
    current = m[0];
    base = m[0];
    previous = '';

    // On windows, check that the root exists. On unix there is no need.
    if (isWindows && !knownHard[base]) {
      fs.lstat(base, function(err) {
        if (err) return cb(err);
        knownHard[base] = true;
        LOOP();
      });
    } else {
      process.nextTick(LOOP);
    }
  }

  // walk down the path, swapping out linked pathparts for their real
  // values
  function LOOP() {
    // stop if scanned past end of path
    if (pos >= p.length) {
      if (cache) cache[original] = p;
      return cb(null, p);
    }

    // find the next part
    nextPartRe.lastIndex = pos;
    var result = nextPartRe.exec(p);
    previous = current;
    current += result[0];
    base = previous + result[1];
    pos = nextPartRe.lastIndex;

    // continue if not a symlink
    if (knownHard[base] || (cache && cache[base] === base)) {
      return process.nextTick(LOOP);
    }

    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
      // known symbolic link.  no need to stat again.
      return gotResolvedLink(cache[base]);
    }

    return fs.lstat(base, gotStat);
  }

  function gotStat(err, stat) {
    if (err) return cb(err);

    // if not a symlink, skip to the next path part
    if (!stat.isSymbolicLink()) {
      knownHard[base] = true;
      if (cache) cache[base] = base;
      return process.nextTick(LOOP);
    }

    // stat & read the link if not read before
    // call gotTarget as soon as the link target is known
    // dev/ino always return 0 on windows, so skip the check.
    if (!isWindows) {
      var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
      if (seenLinks.hasOwnProperty(id)) {
        return gotTarget(null, seenLinks[id], base);
      }
    }
    fs.stat(base, function(err) {
      if (err) return cb(err);

      fs.readlink(base, function(err, target) {
        if (!isWindows) seenLinks[id] = target;
        gotTarget(err, target);
      });
    });
  }

  function gotTarget(err, target, base) {
    if (err) return cb(err);

    var resolvedLink = pathModule.resolve(previous, target);
    if (cache) cache[base] = resolvedLink;
    gotResolvedLink(resolvedLink);
  }

  function gotResolvedLink(resolvedLink) {
    // resolve the link, then start over
    p = pathModule.resolve(resolvedLink, p.slice(pos));
    start();
  }
};
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Use node's fs.realpath, but fall back to the JS implementation if the native one fails",
  "devDependencies": {},
  "files": [
    "old.js",
    "index.js"
  ],
  "homepage": "https://github.com/isaacs/fs.realpath#readme",
  "license": "ISC",
  "main": "index.js",
  "name": "fs.realpath",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/fs.realpath.git"
  },
  "version": "1.0.0"
}root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 120

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
{
	"es3": true,

	"additionalRules": [],

	"requireSemicolons": true,

	"disallowMultipleSpaces": true,

	"disallowIdentifierNames": [],

	"requireCurlyBraces": {
		"allExcept": [],
		"keywords": ["if", "else", "for", "while", "do", "try", "catch"]
	},

	"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],

	"disallowSpaceAfterKeywords": [],

	"disallowSpaceBeforeComma": true,
	"disallowSpaceAfterComma": false,
	"disallowSpaceBeforeSemicolon": true,

	"disallowNodeTypes": [
		"DebuggerStatement",
		"ForInStatement",
		"LabeledStatement",
		"SwitchCase",
		"SwitchStatement",
		"WithStatement"
	],

	"requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },

	"requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
	"requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
	"disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
	"requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
	"disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },

	"requireSpaceBetweenArguments": true,

	"disallowSpacesInsideParentheses": true,

	"disallowSpacesInsideArrayBrackets": true,

	"disallowQuotedKeysInObjects": { "allExcept": ["reserved"] },

	"disallowSpaceAfterObjectKeys": true,

	"requireCommaBeforeLineBreak": true,

	"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
	"requireSpaceAfterPrefixUnaryOperators": [],

	"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
	"requireSpaceBeforePostfixUnaryOperators": [],

	"disallowSpaceBeforeBinaryOperators": [],
	"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],

	"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
	"disallowSpaceAfterBinaryOperators": [],

	"disallowImplicitTypeConversion": ["binary", "string"],

	"disallowKeywords": ["with", "eval"],

	"requireKeywordsOnNewLine": [],
	"disallowKeywordsOnNewLine": ["else"],

	"requireLineFeedAtFileEnd": true,

	"disallowTrailingWhitespace": true,

	"disallowTrailingComma": true,

	"excludeFiles": ["node_modules/**", "vendor/**"],

	"disallowMultipleLineStrings": true,

	"requireDotNotation": { "allExcept": ["keywords"] },

	"requireParenthesesAroundIIFE": true,

	"validateLineBreaks": "LF",

	"validateQuoteMarks": {
		"escape": true,
		"mark": "'"
	},

	"disallowOperatorBeforeLineBreak": [],

	"requireSpaceBeforeKeywords": [
		"do",
		"for",
		"if",
		"else",
		"switch",
		"case",
		"try",
		"catch",
		"finally",
		"while",
		"with",
		"return"
	],

	"validateAlignedFunctionParameters": {
		"lineBreakAfterOpeningBraces": true,
		"lineBreakBeforeClosingBraces": true
	},

	"requirePaddingNewLinesBeforeExport": true,

	"validateNewlineAfterArrayElements": {
		"maximum": 8
	},

	"requirePaddingNewLinesAfterUseStrict": true,

	"disallowArrowFunctions": true,

	"disallowMultiLineTernary": true,

	"validateOrderInObjectKeys": "asc-insensitive",

	"disallowIdenticalDestructuringNames": true,

	"disallowNestedTernaries": { "maxLevel": 1 },

	"requireSpaceAfterComma": { "allExcept": ["trailing"] },
	"requireAlignedMultilineParams": false,

	"requireSpacesInGenerator": {
		"afterStar": true
	},

	"disallowSpacesInGenerator": {
		"beforeStar": true
	},

	"disallowVar": false,

	"requireArrayDestructuring": false,

	"requireEnhancedObjectLiterals": false,

	"requireObjectDestructuring": false,

	"requireEarlyReturn": false,

	"requireCapitalizedConstructorsNew": {
		"allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
	},

	"requireImportAlphabetized": false,

    "requireSpaceBeforeObjectValues": true,
    "requireSpaceBeforeDestructuredValues": true,

	"disallowSpacesInsideTemplateStringPlaceholders": true,

    "disallowArrayDestructuringReturn": false,

    "requireNewlineBeforeSingleStatementsInIf": false,

	"disallowUnusedVariables": true,

	"requireSpacesInsideImportedObjectBraces": true,

	"requireUseStrict": true
}

Copyright (c) 2013 Raynos.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

'use strict';

/* eslint no-invalid-this: 1 */

var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var slice = Array.prototype.slice;
var toStr = Object.prototype.toString;
var funcType = '[object Function]';

module.exports = function bind(that) {
    var target = this;
    if (typeof target !== 'function' || toStr.call(target) !== funcType) {
        throw new TypeError(ERROR_MESSAGE + target);
    }
    var args = slice.call(arguments, 1);

    var bound;
    var binder = function () {
        if (this instanceof bound) {
            var result = target.apply(
                this,
                args.concat(slice.call(arguments))
            );
            if (Object(result) === result) {
                return result;
            }
            return this;
        } else {
            return target.apply(
                that,
                args.concat(slice.call(arguments))
            );
        }
    };

    var boundLength = Math.max(0, target.length - args.length);
    var boundArgs = [];
    for (var i = 0; i < boundLength; i++) {
        boundArgs.push('$' + i);
    }

    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);

    if (target.prototype) {
        var Empty = function Empty() {};
        Empty.prototype = target.prototype;
        bound.prototype = new Empty();
        Empty.prototype = null;
    }

    return bound;
};
'use strict';

var implementation = require('./implementation');

module.exports = Function.prototype.bind || implementation;
{
  "author": {
    "name": "Raynos",
    "email": "raynos2@gmail.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Implementation of Function.prototype.bind",
  "devDependencies": {
    "@ljharb/eslint-config": "^12.2.1",
    "covert": "^1.1.0",
    "eslint": "^4.5.0",
    "jscs": "^3.0.7",
    "tape": "^4.8.0"
  },
  "homepage": "https://github.com/Raynos/function-bind",
  "license": "MIT",
  "main": "index",
  "name": "function-bind",
  "repository": {
    "type": "git",
    "url": "git://github.com/Raynos/function-bind.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "ie/8..latest",
      "firefox/16..latest",
      "firefox/nightly",
      "chrome/22..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  },
  "version": "1.1.1"
}'use strict';

module.exports = function (cb) {
	var stdin = process.stdin;
	var ret = '';

	if (stdin.isTTY) {
		setImmediate(cb, '');
		return;
	}

	stdin.setEncoding('utf8');

	stdin.on('readable', function () {
		var chunk;

		while (chunk = stdin.read()) {
			ret += chunk;
		}
	});

	stdin.on('end', function () {
		cb(ret);
	});
};

module.exports.buffer = function (cb) {
	var stdin = process.stdin;
	var ret = [];
	var len = 0;

	if (stdin.isTTY) {
		setImmediate(cb, new Buffer(''));
		return;
	}

	stdin.on('readable', function () {
		var chunk;

		while (chunk = stdin.read()) {
			ret.push(chunk);
			len += chunk.length;
		}
	});

	stdin.on('end', function () {
		cb(Buffer.concat(ret, len));
	});
};
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "http://sindresorhus.com"
  },
  "deprecated": false,
  "description": "Easier stdin",
  "devDependencies": {
    "ava": "0.0.4",
    "buffer-equal": "0.0.1"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/get-stdin#readme",
  "license": "MIT",
  "name": "get-stdin",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/get-stdin.git"
  },
  "version": "4.0.1"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

## Glob Logo

Glob's logo created by Tanya Brassie <http://tanyabrassie.com/>, licensed
under a Creative Commons Attribution-ShareAlike 4.0 International License
https://creativecommons.org/licenses/by-sa/4.0/
exports.alphasort = alphasort
exports.alphasorti = alphasorti
exports.setopts = setopts
exports.ownProp = ownProp
exports.makeAbs = makeAbs
exports.finish = finish
exports.mark = mark
exports.isIgnored = isIgnored
exports.childrenIgnored = childrenIgnored

function ownProp (obj, field) {
  return Object.prototype.hasOwnProperty.call(obj, field)
}

var path = require("path")
var minimatch = require("minimatch")
var isAbsolute = require("path-is-absolute")
var Minimatch = minimatch.Minimatch

function alphasorti (a, b) {
  return a.toLowerCase().localeCompare(b.toLowerCase())
}

function alphasort (a, b) {
  return a.localeCompare(b)
}

function setupIgnores (self, options) {
  self.ignore = options.ignore || []

  if (!Array.isArray(self.ignore))
    self.ignore = [self.ignore]

  if (self.ignore.length) {
    self.ignore = self.ignore.map(ignoreMap)
  }
}

// ignore patterns are always in dot:true mode.
function ignoreMap (pattern) {
  var gmatcher = null
  if (pattern.slice(-3) === '/**') {
    var gpattern = pattern.replace(/(\/\*\*)+$/, '')
    gmatcher = new Minimatch(gpattern, { dot: true })
  }

  return {
    matcher: new Minimatch(pattern, { dot: true }),
    gmatcher: gmatcher
  }
}

function setopts (self, pattern, options) {
  if (!options)
    options = {}

  // base-matching: just use globstar for that.
  if (options.matchBase && -1 === pattern.indexOf("/")) {
    if (options.noglobstar) {
      throw new Error("base matching requires globstar")
    }
    pattern = "**/" + pattern
  }

  self.silent = !!options.silent
  self.pattern = pattern
  self.strict = options.strict !== false
  self.realpath = !!options.realpath
  self.realpathCache = options.realpathCache || Object.create(null)
  self.follow = !!options.follow
  self.dot = !!options.dot
  self.mark = !!options.mark
  self.nodir = !!options.nodir
  if (self.nodir)
    self.mark = true
  self.sync = !!options.sync
  self.nounique = !!options.nounique
  self.nonull = !!options.nonull
  self.nosort = !!options.nosort
  self.nocase = !!options.nocase
  self.stat = !!options.stat
  self.noprocess = !!options.noprocess
  self.absolute = !!options.absolute

  self.maxLength = options.maxLength || Infinity
  self.cache = options.cache || Object.create(null)
  self.statCache = options.statCache || Object.create(null)
  self.symlinks = options.symlinks || Object.create(null)

  setupIgnores(self, options)

  self.changedCwd = false
  var cwd = process.cwd()
  if (!ownProp(options, "cwd"))
    self.cwd = cwd
  else {
    self.cwd = path.resolve(options.cwd)
    self.changedCwd = self.cwd !== cwd
  }

  self.root = options.root || path.resolve(self.cwd, "/")
  self.root = path.resolve(self.root)
  if (process.platform === "win32")
    self.root = self.root.replace(/\\/g, "/")

  // TODO: is an absolute `cwd` supposed to be resolved against `root`?
  // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')
  self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)
  if (process.platform === "win32")
    self.cwdAbs = self.cwdAbs.replace(/\\/g, "/")
  self.nomount = !!options.nomount

  // disable comments and negation in Minimatch.
  // Note that they are not supported in Glob itself anyway.
  options.nonegate = true
  options.nocomment = true

  self.minimatch = new Minimatch(pattern, options)
  self.options = self.minimatch.options
}

function finish (self) {
  var nou = self.nounique
  var all = nou ? [] : Object.create(null)

  for (var i = 0, l = self.matches.length; i < l; i ++) {
    var matches = self.matches[i]
    if (!matches || Object.keys(matches).length === 0) {
      if (self.nonull) {
        // do like the shell, and spit out the literal glob
        var literal = self.minimatch.globSet[i]
        if (nou)
          all.push(literal)
        else
          all[literal] = true
      }
    } else {
      // had matches
      var m = Object.keys(matches)
      if (nou)
        all.push.apply(all, m)
      else
        m.forEach(function (m) {
          all[m] = true
        })
    }
  }

  if (!nou)
    all = Object.keys(all)

  if (!self.nosort)
    all = all.sort(self.nocase ? alphasorti : alphasort)

  // at *some* point we statted all of these
  if (self.mark) {
    for (var i = 0; i < all.length; i++) {
      all[i] = self._mark(all[i])
    }
    if (self.nodir) {
      all = all.filter(function (e) {
        var notDir = !(/\/$/.test(e))
        var c = self.cache[e] || self.cache[makeAbs(self, e)]
        if (notDir && c)
          notDir = c !== 'DIR' && !Array.isArray(c)
        return notDir
      })
    }
  }

  if (self.ignore.length)
    all = all.filter(function(m) {
      return !isIgnored(self, m)
    })

  self.found = all
}

function mark (self, p) {
  var abs = makeAbs(self, p)
  var c = self.cache[abs]
  var m = p
  if (c) {
    var isDir = c === 'DIR' || Array.isArray(c)
    var slash = p.slice(-1) === '/'

    if (isDir && !slash)
      m += '/'
    else if (!isDir && slash)
      m = m.slice(0, -1)

    if (m !== p) {
      var mabs = makeAbs(self, m)
      self.statCache[mabs] = self.statCache[abs]
      self.cache[mabs] = self.cache[abs]
    }
  }

  return m
}

// lotta situps...
function makeAbs (self, f) {
  var abs = f
  if (f.charAt(0) === '/') {
    abs = path.join(self.root, f)
  } else if (isAbsolute(f) || f === '') {
    abs = f
  } else if (self.changedCwd) {
    abs = path.resolve(self.cwd, f)
  } else {
    abs = path.resolve(f)
  }

  if (process.platform === 'win32')
    abs = abs.replace(/\\/g, '/')

  return abs
}


// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
function isIgnored (self, path) {
  if (!self.ignore.length)
    return false

  return self.ignore.some(function(item) {
    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
  })
}

function childrenIgnored (self, path) {
  if (!self.ignore.length)
    return false

  return self.ignore.some(function(item) {
    return !!(item.gmatcher && item.gmatcher.match(path))
  })
}
// Approach:
//
// 1. Get the minimatch set
// 2. For each pattern in the set, PROCESS(pattern, false)
// 3. Store matches per-set, then uniq them
//
// PROCESS(pattern, inGlobStar)
// Get the first [n] items from pattern that are all strings
// Join these together.  This is PREFIX.
//   If there is no more remaining, then stat(PREFIX) and
//   add to matches if it succeeds.  END.
//
// If inGlobStar and PREFIX is symlink and points to dir
//   set ENTRIES = []
// else readdir(PREFIX) as ENTRIES
//   If fail, END
//
// with ENTRIES
//   If pattern[n] is GLOBSTAR
//     // handle the case where the globstar match is empty
//     // by pruning it out, and testing the resulting pattern
//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
//     // handle other cases.
//     for ENTRY in ENTRIES (not dotfiles)
//       // attach globstar + tail onto the entry
//       // Mark that this entry is a globstar match
//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
//
//   else // not globstar
//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
//       Test ENTRY against pattern[n]
//       If fails, continue
//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
//
// Caveat:
//   Cache all stats and readdirs results to minimize syscall.  Since all
//   we ever care about is existence and directory-ness, we can just keep
//   `true` for files, and [children,...] for directories, or `false` for
//   things that don't exist.

module.exports = glob

var fs = require('fs')
var rp = require('fs.realpath')
var minimatch = require('minimatch')
var Minimatch = minimatch.Minimatch
var inherits = require('inherits')
var EE = require('events').EventEmitter
var path = require('path')
var assert = require('assert')
var isAbsolute = require('path-is-absolute')
var globSync = require('./sync.js')
var common = require('./common.js')
var alphasort = common.alphasort
var alphasorti = common.alphasorti
var setopts = common.setopts
var ownProp = common.ownProp
var inflight = require('inflight')
var util = require('util')
var childrenIgnored = common.childrenIgnored
var isIgnored = common.isIgnored

var once = require('once')

function glob (pattern, options, cb) {
  if (typeof options === 'function') cb = options, options = {}
  if (!options) options = {}

  if (options.sync) {
    if (cb)
      throw new TypeError('callback provided to sync glob')
    return globSync(pattern, options)
  }

  return new Glob(pattern, options, cb)
}

glob.sync = globSync
var GlobSync = glob.GlobSync = globSync.GlobSync

// old api surface
glob.glob = glob

function extend (origin, add) {
  if (add === null || typeof add !== 'object') {
    return origin
  }

  var keys = Object.keys(add)
  var i = keys.length
  while (i--) {
    origin[keys[i]] = add[keys[i]]
  }
  return origin
}

glob.hasMagic = function (pattern, options_) {
  var options = extend({}, options_)
  options.noprocess = true

  var g = new Glob(pattern, options)
  var set = g.minimatch.set

  if (!pattern)
    return false

  if (set.length > 1)
    return true

  for (var j = 0; j < set[0].length; j++) {
    if (typeof set[0][j] !== 'string')
      return true
  }

  return false
}

glob.Glob = Glob
inherits(Glob, EE)
function Glob (pattern, options, cb) {
  if (typeof options === 'function') {
    cb = options
    options = null
  }

  if (options && options.sync) {
    if (cb)
      throw new TypeError('callback provided to sync glob')
    return new GlobSync(pattern, options)
  }

  if (!(this instanceof Glob))
    return new Glob(pattern, options, cb)

  setopts(this, pattern, options)
  this._didRealPath = false

  // process each pattern in the minimatch set
  var n = this.minimatch.set.length

  // The matches are stored as {<filename>: true,...} so that
  // duplicates are automagically pruned.
  // Later, we do an Object.keys() on these.
  // Keep them as a list so we can fill in when nonull is set.
  this.matches = new Array(n)

  if (typeof cb === 'function') {
    cb = once(cb)
    this.on('error', cb)
    this.on('end', function (matches) {
      cb(null, matches)
    })
  }

  var self = this
  this._processing = 0

  this._emitQueue = []
  this._processQueue = []
  this.paused = false

  if (this.noprocess)
    return this

  if (n === 0)
    return done()

  var sync = true
  for (var i = 0; i < n; i ++) {
    this._process(this.minimatch.set[i], i, false, done)
  }
  sync = false

  function done () {
    --self._processing
    if (self._processing <= 0) {
      if (sync) {
        process.nextTick(function () {
          self._finish()
        })
      } else {
        self._finish()
      }
    }
  }
}

Glob.prototype._finish = function () {
  assert(this instanceof Glob)
  if (this.aborted)
    return

  if (this.realpath && !this._didRealpath)
    return this._realpath()

  common.finish(this)
  this.emit('end', this.found)
}

Glob.prototype._realpath = function () {
  if (this._didRealpath)
    return

  this._didRealpath = true

  var n = this.matches.length
  if (n === 0)
    return this._finish()

  var self = this
  for (var i = 0; i < this.matches.length; i++)
    this._realpathSet(i, next)

  function next () {
    if (--n === 0)
      self._finish()
  }
}

Glob.prototype._realpathSet = function (index, cb) {
  var matchset = this.matches[index]
  if (!matchset)
    return cb()

  var found = Object.keys(matchset)
  var self = this
  var n = found.length

  if (n === 0)
    return cb()

  var set = this.matches[index] = Object.create(null)
  found.forEach(function (p, i) {
    // If there's a problem with the stat, then it means that
    // one or more of the links in the realpath couldn't be
    // resolved.  just return the abs value in that case.
    p = self._makeAbs(p)
    rp.realpath(p, self.realpathCache, function (er, real) {
      if (!er)
        set[real] = true
      else if (er.syscall === 'stat')
        set[p] = true
      else
        self.emit('error', er) // srsly wtf right here

      if (--n === 0) {
        self.matches[index] = set
        cb()
      }
    })
  })
}

Glob.prototype._mark = function (p) {
  return common.mark(this, p)
}

Glob.prototype._makeAbs = function (f) {
  return common.makeAbs(this, f)
}

Glob.prototype.abort = function () {
  this.aborted = true
  this.emit('abort')
}

Glob.prototype.pause = function () {
  if (!this.paused) {
    this.paused = true
    this.emit('pause')
  }
}

Glob.prototype.resume = function () {
  if (this.paused) {
    this.emit('resume')
    this.paused = false
    if (this._emitQueue.length) {
      var eq = this._emitQueue.slice(0)
      this._emitQueue.length = 0
      for (var i = 0; i < eq.length; i ++) {
        var e = eq[i]
        this._emitMatch(e[0], e[1])
      }
    }
    if (this._processQueue.length) {
      var pq = this._processQueue.slice(0)
      this._processQueue.length = 0
      for (var i = 0; i < pq.length; i ++) {
        var p = pq[i]
        this._processing--
        this._process(p[0], p[1], p[2], p[3])
      }
    }
  }
}

Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
  assert(this instanceof Glob)
  assert(typeof cb === 'function')

  if (this.aborted)
    return

  this._processing++
  if (this.paused) {
    this._processQueue.push([pattern, index, inGlobStar, cb])
    return
  }

  //console.error('PROCESS %d', this._processing, pattern)

  // Get the first [n] parts of pattern that are all strings.
  var n = 0
  while (typeof pattern[n] === 'string') {
    n ++
  }
  // now n is the index of the first one that is *not* a string.

  // see if there's anything else
  var prefix
  switch (n) {
    // if not, then this is rather simple
    case pattern.length:
      this._processSimple(pattern.join('/'), index, cb)
      return

    case 0:
      // pattern *starts* with some non-trivial item.
      // going to readdir(cwd), but not include the prefix in matches.
      prefix = null
      break

    default:
      // pattern has some string bits in the front.
      // whatever it starts with, whether that's 'absolute' like /foo/bar,
      // or 'relative' like '../baz'
      prefix = pattern.slice(0, n).join('/')
      break
  }

  var remain = pattern.slice(n)

  // get the list of entries.
  var read
  if (prefix === null)
    read = '.'
  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
    if (!prefix || !isAbsolute(prefix))
      prefix = '/' + prefix
    read = prefix
  } else
    read = prefix

  var abs = this._makeAbs(read)

  //if ignored, skip _processing
  if (childrenIgnored(this, read))
    return cb()

  var isGlobStar = remain[0] === minimatch.GLOBSTAR
  if (isGlobStar)
    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
  else
    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
}

Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
  var self = this
  this._readdir(abs, inGlobStar, function (er, entries) {
    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
  })
}

Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {

  // if the abs isn't a dir, then nothing can match!
  if (!entries)
    return cb()

  // It will only match dot entries if it starts with a dot, or if
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
  var pn = remain[0]
  var negate = !!this.minimatch.negate
  var rawGlob = pn._glob
  var dotOk = this.dot || rawGlob.charAt(0) === '.'

  var matchedEntries = []
  for (var i = 0; i < entries.length; i++) {
    var e = entries[i]
    if (e.charAt(0) !== '.' || dotOk) {
      var m
      if (negate && !prefix) {
        m = !e.match(pn)
      } else {
        m = e.match(pn)
      }
      if (m)
        matchedEntries.push(e)
    }
  }

  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)

  var len = matchedEntries.length
  // If there are no matched entries, then nothing matches.
  if (len === 0)
    return cb()

  // if this is the last remaining pattern bit, then no need for
  // an additional stat *unless* the user has specified mark or
  // stat explicitly.  We know they exist, since readdir returned
  // them.

  if (remain.length === 1 && !this.mark && !this.stat) {
    if (!this.matches[index])
      this.matches[index] = Object.create(null)

    for (var i = 0; i < len; i ++) {
      var e = matchedEntries[i]
      if (prefix) {
        if (prefix !== '/')
          e = prefix + '/' + e
        else
          e = prefix + e
      }

      if (e.charAt(0) === '/' && !this.nomount) {
        e = path.join(this.root, e)
      }
      this._emitMatch(index, e)
    }
    // This was the last one, and no stats were needed
    return cb()
  }

  // now test all matched entries as stand-ins for that part
  // of the pattern.
  remain.shift()
  for (var i = 0; i < len; i ++) {
    var e = matchedEntries[i]
    var newPattern
    if (prefix) {
      if (prefix !== '/')
        e = prefix + '/' + e
      else
        e = prefix + e
    }
    this._process([e].concat(remain), index, inGlobStar, cb)
  }
  cb()
}

Glob.prototype._emitMatch = function (index, e) {
  if (this.aborted)
    return

  if (isIgnored(this, e))
    return

  if (this.paused) {
    this._emitQueue.push([index, e])
    return
  }

  var abs = isAbsolute(e) ? e : this._makeAbs(e)

  if (this.mark)
    e = this._mark(e)

  if (this.absolute)
    e = abs

  if (this.matches[index][e])
    return

  if (this.nodir) {
    var c = this.cache[abs]
    if (c === 'DIR' || Array.isArray(c))
      return
  }

  this.matches[index][e] = true

  var st = this.statCache[abs]
  if (st)
    this.emit('stat', e, st)

  this.emit('match', e)
}

Glob.prototype._readdirInGlobStar = function (abs, cb) {
  if (this.aborted)
    return

  // follow all symlinked directories forever
  // just proceed as if this is a non-globstar situation
  if (this.follow)
    return this._readdir(abs, false, cb)

  var lstatkey = 'lstat\0' + abs
  var self = this
  var lstatcb = inflight(lstatkey, lstatcb_)

  if (lstatcb)
    fs.lstat(abs, lstatcb)

  function lstatcb_ (er, lstat) {
    if (er && er.code === 'ENOENT')
      return cb()

    var isSym = lstat && lstat.isSymbolicLink()
    self.symlinks[abs] = isSym

    // If it's not a symlink or a dir, then it's definitely a regular file.
    // don't bother doing a readdir in that case.
    if (!isSym && lstat && !lstat.isDirectory()) {
      self.cache[abs] = 'FILE'
      cb()
    } else
      self._readdir(abs, false, cb)
  }
}

Glob.prototype._readdir = function (abs, inGlobStar, cb) {
  if (this.aborted)
    return

  cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
  if (!cb)
    return

  //console.error('RD %j %j', +inGlobStar, abs)
  if (inGlobStar && !ownProp(this.symlinks, abs))
    return this._readdirInGlobStar(abs, cb)

  if (ownProp(this.cache, abs)) {
    var c = this.cache[abs]
    if (!c || c === 'FILE')
      return cb()

    if (Array.isArray(c))
      return cb(null, c)
  }

  var self = this
  fs.readdir(abs, readdirCb(this, abs, cb))
}

function readdirCb (self, abs, cb) {
  return function (er, entries) {
    if (er)
      self._readdirError(abs, er, cb)
    else
      self._readdirEntries(abs, entries, cb)
  }
}

Glob.prototype._readdirEntries = function (abs, entries, cb) {
  if (this.aborted)
    return

  // if we haven't asked to stat everything, then just
  // assume that everything in there exists, so we can avoid
  // having to stat it a second time.
  if (!this.mark && !this.stat) {
    for (var i = 0; i < entries.length; i ++) {
      var e = entries[i]
      if (abs === '/')
        e = abs + e
      else
        e = abs + '/' + e
      this.cache[e] = true
    }
  }

  this.cache[abs] = entries
  return cb(null, entries)
}

Glob.prototype._readdirError = function (f, er, cb) {
  if (this.aborted)
    return

  // handle errors, and cache the information
  switch (er.code) {
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    case 'ENOTDIR': // totally normal. means it *does* exist.
      var abs = this._makeAbs(f)
      this.cache[abs] = 'FILE'
      if (abs === this.cwdAbs) {
        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
        error.path = this.cwd
        error.code = er.code
        this.emit('error', error)
        this.abort()
      }
      break

    case 'ENOENT': // not terribly unusual
    case 'ELOOP':
    case 'ENAMETOOLONG':
    case 'UNKNOWN':
      this.cache[this._makeAbs(f)] = false
      break

    default: // some unusual error.  Treat as failure.
      this.cache[this._makeAbs(f)] = false
      if (this.strict) {
        this.emit('error', er)
        // If the error is handled, then we abort
        // if not, we threw out of here
        this.abort()
      }
      if (!this.silent)
        console.error('glob error', er)
      break
  }

  return cb()
}

Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
  var self = this
  this._readdir(abs, inGlobStar, function (er, entries) {
    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
  })
}


Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
  //console.error('pgs2', prefix, remain[0], entries)

  // no entries means not a dir, so it can never have matches
  // foo.txt/** doesn't match foo.txt
  if (!entries)
    return cb()

  // test without the globstar, and with every child both below
  // and replacing the globstar.
  var remainWithoutGlobStar = remain.slice(1)
  var gspref = prefix ? [ prefix ] : []
  var noGlobStar = gspref.concat(remainWithoutGlobStar)

  // the noGlobStar pattern exits the inGlobStar state
  this._process(noGlobStar, index, false, cb)

  var isSym = this.symlinks[abs]
  var len = entries.length

  // If it's a symlink, and we're in a globstar, then stop
  if (isSym && inGlobStar)
    return cb()

  for (var i = 0; i < len; i++) {
    var e = entries[i]
    if (e.charAt(0) === '.' && !this.dot)
      continue

    // these two cases enter the inGlobStar state
    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    this._process(instead, index, true, cb)

    var below = gspref.concat(entries[i], remain)
    this._process(below, index, true, cb)
  }

  cb()
}

Glob.prototype._processSimple = function (prefix, index, cb) {
  // XXX review this.  Shouldn't it be doing the mounting etc
  // before doing stat?  kinda weird?
  var self = this
  this._stat(prefix, function (er, exists) {
    self._processSimple2(prefix, index, er, exists, cb)
  })
}
Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {

  //console.error('ps2', prefix, exists)

  if (!this.matches[index])
    this.matches[index] = Object.create(null)

  // If it doesn't exist, then just mark the lack of results
  if (!exists)
    return cb()

  if (prefix && isAbsolute(prefix) && !this.nomount) {
    var trail = /[\/\\]$/.test(prefix)
    if (prefix.charAt(0) === '/') {
      prefix = path.join(this.root, prefix)
    } else {
      prefix = path.resolve(this.root, prefix)
      if (trail)
        prefix += '/'
    }
  }

  if (process.platform === 'win32')
    prefix = prefix.replace(/\\/g, '/')

  // Mark this as a match
  this._emitMatch(index, prefix)
  cb()
}

// Returns either 'DIR', 'FILE', or false
Glob.prototype._stat = function (f, cb) {
  var abs = this._makeAbs(f)
  var needDir = f.slice(-1) === '/'

  if (f.length > this.maxLength)
    return cb()

  if (!this.stat && ownProp(this.cache, abs)) {
    var c = this.cache[abs]

    if (Array.isArray(c))
      c = 'DIR'

    // It exists, but maybe not how we need it
    if (!needDir || c === 'DIR')
      return cb(null, c)

    if (needDir && c === 'FILE')
      return cb()

    // otherwise we have to stat, because maybe c=true
    // if we know it exists, but not what it is.
  }

  var exists
  var stat = this.statCache[abs]
  if (stat !== undefined) {
    if (stat === false)
      return cb(null, stat)
    else {
      var type = stat.isDirectory() ? 'DIR' : 'FILE'
      if (needDir && type === 'FILE')
        return cb()
      else
        return cb(null, type, stat)
    }
  }

  var self = this
  var statcb = inflight('stat\0' + abs, lstatcb_)
  if (statcb)
    fs.lstat(abs, statcb)

  function lstatcb_ (er, lstat) {
    if (lstat && lstat.isSymbolicLink()) {
      // If it's a symlink, then treat it as the target, unless
      // the target does not exist, then treat it as a file.
      return fs.stat(abs, function (er, stat) {
        if (er)
          self._stat2(f, abs, null, lstat, cb)
        else
          self._stat2(f, abs, er, stat, cb)
      })
    } else {
      self._stat2(f, abs, er, lstat, cb)
    }
  }
}

Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
  if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
    this.statCache[abs] = false
    return cb()
  }

  var needDir = f.slice(-1) === '/'
  this.statCache[abs] = stat

  if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
    return cb(null, false, stat)

  var c = true
  if (stat)
    c = stat.isDirectory() ? 'DIR' : 'FILE'
  this.cache[abs] = this.cache[abs] || c

  if (needDir && c === 'FILE')
    return cb()

  return cb(null, c, stat)
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {
    "fs.realpath": "^1.0.0",
    "inflight": "^1.0.4",
    "inherits": "2",
    "minimatch": "^3.0.4",
    "once": "^1.3.0",
    "path-is-absolute": "^1.0.0"
  },
  "deprecated": false,
  "description": "a little globber",
  "devDependencies": {
    "mkdirp": "0",
    "rimraf": "^2.2.8",
    "tap": "^12.0.1",
    "tick": "0.0.6"
  },
  "engines": {
    "node": "*"
  },
  "files": [
    "glob.js",
    "sync.js",
    "common.js"
  ],
  "funding": {
    "url": "https://github.com/sponsors/isaacs"
  },
  "homepage": "https://github.com/isaacs/node-glob#readme",
  "license": "ISC",
  "main": "glob.js",
  "name": "glob",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/node-glob.git"
  },
  "version": "7.1.6"
}module.exports = globSync
globSync.GlobSync = GlobSync

var fs = require('fs')
var rp = require('fs.realpath')
var minimatch = require('minimatch')
var Minimatch = minimatch.Minimatch
var Glob = require('./glob.js').Glob
var util = require('util')
var path = require('path')
var assert = require('assert')
var isAbsolute = require('path-is-absolute')
var common = require('./common.js')
var alphasort = common.alphasort
var alphasorti = common.alphasorti
var setopts = common.setopts
var ownProp = common.ownProp
var childrenIgnored = common.childrenIgnored
var isIgnored = common.isIgnored

function globSync (pattern, options) {
  if (typeof options === 'function' || arguments.length === 3)
    throw new TypeError('callback provided to sync glob\n'+
                        'See: https://github.com/isaacs/node-glob/issues/167')

  return new GlobSync(pattern, options).found
}

function GlobSync (pattern, options) {
  if (!pattern)
    throw new Error('must provide pattern')

  if (typeof options === 'function' || arguments.length === 3)
    throw new TypeError('callback provided to sync glob\n'+
                        'See: https://github.com/isaacs/node-glob/issues/167')

  if (!(this instanceof GlobSync))
    return new GlobSync(pattern, options)

  setopts(this, pattern, options)

  if (this.noprocess)
    return this

  var n = this.minimatch.set.length
  this.matches = new Array(n)
  for (var i = 0; i < n; i ++) {
    this._process(this.minimatch.set[i], i, false)
  }
  this._finish()
}

GlobSync.prototype._finish = function () {
  assert(this instanceof GlobSync)
  if (this.realpath) {
    var self = this
    this.matches.forEach(function (matchset, index) {
      var set = self.matches[index] = Object.create(null)
      for (var p in matchset) {
        try {
          p = self._makeAbs(p)
          var real = rp.realpathSync(p, self.realpathCache)
          set[real] = true
        } catch (er) {
          if (er.syscall === 'stat')
            set[self._makeAbs(p)] = true
          else
            throw er
        }
      }
    })
  }
  common.finish(this)
}


GlobSync.prototype._process = function (pattern, index, inGlobStar) {
  assert(this instanceof GlobSync)

  // Get the first [n] parts of pattern that are all strings.
  var n = 0
  while (typeof pattern[n] === 'string') {
    n ++
  }
  // now n is the index of the first one that is *not* a string.

  // See if there's anything else
  var prefix
  switch (n) {
    // if not, then this is rather simple
    case pattern.length:
      this._processSimple(pattern.join('/'), index)
      return

    case 0:
      // pattern *starts* with some non-trivial item.
      // going to readdir(cwd), but not include the prefix in matches.
      prefix = null
      break

    default:
      // pattern has some string bits in the front.
      // whatever it starts with, whether that's 'absolute' like /foo/bar,
      // or 'relative' like '../baz'
      prefix = pattern.slice(0, n).join('/')
      break
  }

  var remain = pattern.slice(n)

  // get the list of entries.
  var read
  if (prefix === null)
    read = '.'
  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
    if (!prefix || !isAbsolute(prefix))
      prefix = '/' + prefix
    read = prefix
  } else
    read = prefix

  var abs = this._makeAbs(read)

  //if ignored, skip processing
  if (childrenIgnored(this, read))
    return

  var isGlobStar = remain[0] === minimatch.GLOBSTAR
  if (isGlobStar)
    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
  else
    this._processReaddir(prefix, read, abs, remain, index, inGlobStar)
}


GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
  var entries = this._readdir(abs, inGlobStar)

  // if the abs isn't a dir, then nothing can match!
  if (!entries)
    return

  // It will only match dot entries if it starts with a dot, or if
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
  var pn = remain[0]
  var negate = !!this.minimatch.negate
  var rawGlob = pn._glob
  var dotOk = this.dot || rawGlob.charAt(0) === '.'

  var matchedEntries = []
  for (var i = 0; i < entries.length; i++) {
    var e = entries[i]
    if (e.charAt(0) !== '.' || dotOk) {
      var m
      if (negate && !prefix) {
        m = !e.match(pn)
      } else {
        m = e.match(pn)
      }
      if (m)
        matchedEntries.push(e)
    }
  }

  var len = matchedEntries.length
  // If there are no matched entries, then nothing matches.
  if (len === 0)
    return

  // if this is the last remaining pattern bit, then no need for
  // an additional stat *unless* the user has specified mark or
  // stat explicitly.  We know they exist, since readdir returned
  // them.

  if (remain.length === 1 && !this.mark && !this.stat) {
    if (!this.matches[index])
      this.matches[index] = Object.create(null)

    for (var i = 0; i < len; i ++) {
      var e = matchedEntries[i]
      if (prefix) {
        if (prefix.slice(-1) !== '/')
          e = prefix + '/' + e
        else
          e = prefix + e
      }

      if (e.charAt(0) === '/' && !this.nomount) {
        e = path.join(this.root, e)
      }
      this._emitMatch(index, e)
    }
    // This was the last one, and no stats were needed
    return
  }

  // now test all matched entries as stand-ins for that part
  // of the pattern.
  remain.shift()
  for (var i = 0; i < len; i ++) {
    var e = matchedEntries[i]
    var newPattern
    if (prefix)
      newPattern = [prefix, e]
    else
      newPattern = [e]
    this._process(newPattern.concat(remain), index, inGlobStar)
  }
}


GlobSync.prototype._emitMatch = function (index, e) {
  if (isIgnored(this, e))
    return

  var abs = this._makeAbs(e)

  if (this.mark)
    e = this._mark(e)

  if (this.absolute) {
    e = abs
  }

  if (this.matches[index][e])
    return

  if (this.nodir) {
    var c = this.cache[abs]
    if (c === 'DIR' || Array.isArray(c))
      return
  }

  this.matches[index][e] = true

  if (this.stat)
    this._stat(e)
}


GlobSync.prototype._readdirInGlobStar = function (abs) {
  // follow all symlinked directories forever
  // just proceed as if this is a non-globstar situation
  if (this.follow)
    return this._readdir(abs, false)

  var entries
  var lstat
  var stat
  try {
    lstat = fs.lstatSync(abs)
  } catch (er) {
    if (er.code === 'ENOENT') {
      // lstat failed, doesn't exist
      return null
    }
  }

  var isSym = lstat && lstat.isSymbolicLink()
  this.symlinks[abs] = isSym

  // If it's not a symlink or a dir, then it's definitely a regular file.
  // don't bother doing a readdir in that case.
  if (!isSym && lstat && !lstat.isDirectory())
    this.cache[abs] = 'FILE'
  else
    entries = this._readdir(abs, false)

  return entries
}

GlobSync.prototype._readdir = function (abs, inGlobStar) {
  var entries

  if (inGlobStar && !ownProp(this.symlinks, abs))
    return this._readdirInGlobStar(abs)

  if (ownProp(this.cache, abs)) {
    var c = this.cache[abs]
    if (!c || c === 'FILE')
      return null

    if (Array.isArray(c))
      return c
  }

  try {
    return this._readdirEntries(abs, fs.readdirSync(abs))
  } catch (er) {
    this._readdirError(abs, er)
    return null
  }
}

GlobSync.prototype._readdirEntries = function (abs, entries) {
  // if we haven't asked to stat everything, then just
  // assume that everything in there exists, so we can avoid
  // having to stat it a second time.
  if (!this.mark && !this.stat) {
    for (var i = 0; i < entries.length; i ++) {
      var e = entries[i]
      if (abs === '/')
        e = abs + e
      else
        e = abs + '/' + e
      this.cache[e] = true
    }
  }

  this.cache[abs] = entries

  // mark and cache dir-ness
  return entries
}

GlobSync.prototype._readdirError = function (f, er) {
  // handle errors, and cache the information
  switch (er.code) {
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    case 'ENOTDIR': // totally normal. means it *does* exist.
      var abs = this._makeAbs(f)
      this.cache[abs] = 'FILE'
      if (abs === this.cwdAbs) {
        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
        error.path = this.cwd
        error.code = er.code
        throw error
      }
      break

    case 'ENOENT': // not terribly unusual
    case 'ELOOP':
    case 'ENAMETOOLONG':
    case 'UNKNOWN':
      this.cache[this._makeAbs(f)] = false
      break

    default: // some unusual error.  Treat as failure.
      this.cache[this._makeAbs(f)] = false
      if (this.strict)
        throw er
      if (!this.silent)
        console.error('glob error', er)
      break
  }
}

GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {

  var entries = this._readdir(abs, inGlobStar)

  // no entries means not a dir, so it can never have matches
  // foo.txt/** doesn't match foo.txt
  if (!entries)
    return

  // test without the globstar, and with every child both below
  // and replacing the globstar.
  var remainWithoutGlobStar = remain.slice(1)
  var gspref = prefix ? [ prefix ] : []
  var noGlobStar = gspref.concat(remainWithoutGlobStar)

  // the noGlobStar pattern exits the inGlobStar state
  this._process(noGlobStar, index, false)

  var len = entries.length
  var isSym = this.symlinks[abs]

  // If it's a symlink, and we're in a globstar, then stop
  if (isSym && inGlobStar)
    return

  for (var i = 0; i < len; i++) {
    var e = entries[i]
    if (e.charAt(0) === '.' && !this.dot)
      continue

    // these two cases enter the inGlobStar state
    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    this._process(instead, index, true)

    var below = gspref.concat(entries[i], remain)
    this._process(below, index, true)
  }
}

GlobSync.prototype._processSimple = function (prefix, index) {
  // XXX review this.  Shouldn't it be doing the mounting etc
  // before doing stat?  kinda weird?
  var exists = this._stat(prefix)

  if (!this.matches[index])
    this.matches[index] = Object.create(null)

  // If it doesn't exist, then just mark the lack of results
  if (!exists)
    return

  if (prefix && isAbsolute(prefix) && !this.nomount) {
    var trail = /[\/\\]$/.test(prefix)
    if (prefix.charAt(0) === '/') {
      prefix = path.join(this.root, prefix)
    } else {
      prefix = path.resolve(this.root, prefix)
      if (trail)
        prefix += '/'
    }
  }

  if (process.platform === 'win32')
    prefix = prefix.replace(/\\/g, '/')

  // Mark this as a match
  this._emitMatch(index, prefix)
}

// Returns either 'DIR', 'FILE', or false
GlobSync.prototype._stat = function (f) {
  var abs = this._makeAbs(f)
  var needDir = f.slice(-1) === '/'

  if (f.length > this.maxLength)
    return false

  if (!this.stat && ownProp(this.cache, abs)) {
    var c = this.cache[abs]

    if (Array.isArray(c))
      c = 'DIR'

    // It exists, but maybe not how we need it
    if (!needDir || c === 'DIR')
      return c

    if (needDir && c === 'FILE')
      return false

    // otherwise we have to stat, because maybe c=true
    // if we know it exists, but not what it is.
  }

  var exists
  var stat = this.statCache[abs]
  if (!stat) {
    var lstat
    try {
      lstat = fs.lstatSync(abs)
    } catch (er) {
      if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
        this.statCache[abs] = false
        return false
      }
    }

    if (lstat && lstat.isSymbolicLink()) {
      try {
        stat = fs.statSync(abs)
      } catch (er) {
        stat = lstat
      }
    } else {
      stat = lstat
    }
  }

  this.statCache[abs] = stat

  var c = true
  if (stat)
    c = stat.isDirectory() ? 'DIR' : 'FILE'

  this.cache[abs] = this.cache[abs] || c

  if (needDir && c === 'FILE')
    return false

  return c
}

GlobSync.prototype._mark = function (p) {
  return common.mark(this, p)
}

GlobSync.prototype._makeAbs = function (f) {
  return common.makeAbs(this, f)
}
The ISC License

Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
'use strict'

module.exports = clone

function clone (obj) {
  if (obj === null || typeof obj !== 'object')
    return obj

  if (obj instanceof Object)
    var copy = { __proto__: obj.__proto__ }
  else
    var copy = Object.create(null)

  Object.getOwnPropertyNames(obj).forEach(function (key) {
    Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key))
  })

  return copy
}
var fs = require('fs')
var polyfills = require('./polyfills.js')
var legacy = require('./legacy-streams.js')
var clone = require('./clone.js')

var util = require('util')

/* istanbul ignore next - node 0.x polyfill */
var gracefulQueue
var previousSymbol

/* istanbul ignore else - node 0.x polyfill */
if (typeof Symbol === 'function' && typeof Symbol.for === 'function') {
  gracefulQueue = Symbol.for('graceful-fs.queue')
  // This is used in testing by future versions
  previousSymbol = Symbol.for('graceful-fs.previous')
} else {
  gracefulQueue = '___graceful-fs.queue'
  previousSymbol = '___graceful-fs.previous'
}

function noop () {}

var debug = noop
if (util.debuglog)
  debug = util.debuglog('gfs4')
else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || ''))
  debug = function() {
    var m = util.format.apply(util, arguments)
    m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ')
    console.error(m)
  }

// Once time initialization
if (!global[gracefulQueue]) {
  // This queue can be shared by multiple loaded instances
  var queue = []
  Object.defineProperty(global, gracefulQueue, {
    get: function() {
      return queue
    }
  })

  // Patch fs.close/closeSync to shared queue version, because we need
  // to retry() whenever a close happens *anywhere* in the program.
  // This is essential when multiple graceful-fs instances are
  // in play at the same time.
  fs.close = (function (fs$close) {
    function close (fd, cb) {
      return fs$close.call(fs, fd, function (err) {
        // This function uses the graceful-fs shared queue
        if (!err) {
          retry()
        }

        if (typeof cb === 'function')
          cb.apply(this, arguments)
      })
    }

    Object.defineProperty(close, previousSymbol, {
      value: fs$close
    })
    return close
  })(fs.close)

  fs.closeSync = (function (fs$closeSync) {
    function closeSync (fd) {
      // This function uses the graceful-fs shared queue
      fs$closeSync.apply(fs, arguments)
      retry()
    }

    Object.defineProperty(closeSync, previousSymbol, {
      value: fs$closeSync
    })
    return closeSync
  })(fs.closeSync)

  if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) {
    process.on('exit', function() {
      debug(global[gracefulQueue])
      require('assert').equal(global[gracefulQueue].length, 0)
    })
  }
}

module.exports = patch(clone(fs))
if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) {
    module.exports = patch(fs)
    fs.__patched = true;
}

function patch (fs) {
  // Everything that references the open() function needs to be in here
  polyfills(fs)
  fs.gracefulify = patch

  fs.createReadStream = createReadStream
  fs.createWriteStream = createWriteStream
  var fs$readFile = fs.readFile
  fs.readFile = readFile
  function readFile (path, options, cb) {
    if (typeof options === 'function')
      cb = options, options = null

    return go$readFile(path, options, cb)

    function go$readFile (path, options, cb) {
      return fs$readFile(path, options, function (err) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([go$readFile, [path, options, cb]])
        else {
          if (typeof cb === 'function')
            cb.apply(this, arguments)
          retry()
        }
      })
    }
  }

  var fs$writeFile = fs.writeFile
  fs.writeFile = writeFile
  function writeFile (path, data, options, cb) {
    if (typeof options === 'function')
      cb = options, options = null

    return go$writeFile(path, data, options, cb)

    function go$writeFile (path, data, options, cb) {
      return fs$writeFile(path, data, options, function (err) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([go$writeFile, [path, data, options, cb]])
        else {
          if (typeof cb === 'function')
            cb.apply(this, arguments)
          retry()
        }
      })
    }
  }

  var fs$appendFile = fs.appendFile
  if (fs$appendFile)
    fs.appendFile = appendFile
  function appendFile (path, data, options, cb) {
    if (typeof options === 'function')
      cb = options, options = null

    return go$appendFile(path, data, options, cb)

    function go$appendFile (path, data, options, cb) {
      return fs$appendFile(path, data, options, function (err) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([go$appendFile, [path, data, options, cb]])
        else {
          if (typeof cb === 'function')
            cb.apply(this, arguments)
          retry()
        }
      })
    }
  }

  var fs$readdir = fs.readdir
  fs.readdir = readdir
  function readdir (path, options, cb) {
    var args = [path]
    if (typeof options !== 'function') {
      args.push(options)
    } else {
      cb = options
    }
    args.push(go$readdir$cb)

    return go$readdir(args)

    function go$readdir$cb (err, files) {
      if (files && files.sort)
        files.sort()

      if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
        enqueue([go$readdir, [args]])

      else {
        if (typeof cb === 'function')
          cb.apply(this, arguments)
        retry()
      }
    }
  }

  function go$readdir (args) {
    return fs$readdir.apply(fs, args)
  }

  if (process.version.substr(0, 4) === 'v0.8') {
    var legStreams = legacy(fs)
    ReadStream = legStreams.ReadStream
    WriteStream = legStreams.WriteStream
  }

  var fs$ReadStream = fs.ReadStream
  if (fs$ReadStream) {
    ReadStream.prototype = Object.create(fs$ReadStream.prototype)
    ReadStream.prototype.open = ReadStream$open
  }

  var fs$WriteStream = fs.WriteStream
  if (fs$WriteStream) {
    WriteStream.prototype = Object.create(fs$WriteStream.prototype)
    WriteStream.prototype.open = WriteStream$open
  }

  Object.defineProperty(fs, 'ReadStream', {
    get: function () {
      return ReadStream
    },
    set: function (val) {
      ReadStream = val
    },
    enumerable: true,
    configurable: true
  })
  Object.defineProperty(fs, 'WriteStream', {
    get: function () {
      return WriteStream
    },
    set: function (val) {
      WriteStream = val
    },
    enumerable: true,
    configurable: true
  })

  // legacy names
  var FileReadStream = ReadStream
  Object.defineProperty(fs, 'FileReadStream', {
    get: function () {
      return FileReadStream
    },
    set: function (val) {
      FileReadStream = val
    },
    enumerable: true,
    configurable: true
  })
  var FileWriteStream = WriteStream
  Object.defineProperty(fs, 'FileWriteStream', {
    get: function () {
      return FileWriteStream
    },
    set: function (val) {
      FileWriteStream = val
    },
    enumerable: true,
    configurable: true
  })

  function ReadStream (path, options) {
    if (this instanceof ReadStream)
      return fs$ReadStream.apply(this, arguments), this
    else
      return ReadStream.apply(Object.create(ReadStream.prototype), arguments)
  }

  function ReadStream$open () {
    var that = this
    open(that.path, that.flags, that.mode, function (err, fd) {
      if (err) {
        if (that.autoClose)
          that.destroy()

        that.emit('error', err)
      } else {
        that.fd = fd
        that.emit('open', fd)
        that.read()
      }
    })
  }

  function WriteStream (path, options) {
    if (this instanceof WriteStream)
      return fs$WriteStream.apply(this, arguments), this
    else
      return WriteStream.apply(Object.create(WriteStream.prototype), arguments)
  }

  function WriteStream$open () {
    var that = this
    open(that.path, that.flags, that.mode, function (err, fd) {
      if (err) {
        that.destroy()
        that.emit('error', err)
      } else {
        that.fd = fd
        that.emit('open', fd)
      }
    })
  }

  function createReadStream (path, options) {
    return new fs.ReadStream(path, options)
  }

  function createWriteStream (path, options) {
    return new fs.WriteStream(path, options)
  }

  var fs$open = fs.open
  fs.open = open
  function open (path, flags, mode, cb) {
    if (typeof mode === 'function')
      cb = mode, mode = null

    return go$open(path, flags, mode, cb)

    function go$open (path, flags, mode, cb) {
      return fs$open(path, flags, mode, function (err, fd) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([go$open, [path, flags, mode, cb]])
        else {
          if (typeof cb === 'function')
            cb.apply(this, arguments)
          retry()
        }
      })
    }
  }

  return fs
}

function enqueue (elem) {
  debug('ENQUEUE', elem[0].name, elem[1])
  global[gracefulQueue].push(elem)
}

function retry () {
  var elem = global[gracefulQueue].shift()
  if (elem) {
    debug('RETRY', elem[0].name, elem[1])
    elem[0].apply(null, elem[1])
  }
}
var Stream = require('stream').Stream

module.exports = legacy

function legacy (fs) {
  return {
    ReadStream: ReadStream,
    WriteStream: WriteStream
  }

  function ReadStream (path, options) {
    if (!(this instanceof ReadStream)) return new ReadStream(path, options);

    Stream.call(this);

    var self = this;

    this.path = path;
    this.fd = null;
    this.readable = true;
    this.paused = false;

    this.flags = 'r';
    this.mode = 438; /*=0666*/
    this.bufferSize = 64 * 1024;

    options = options || {};

    // Mixin options into this
    var keys = Object.keys(options);
    for (var index = 0, length = keys.length; index < length; index++) {
      var key = keys[index];
      this[key] = options[key];
    }

    if (this.encoding) this.setEncoding(this.encoding);

    if (this.start !== undefined) {
      if ('number' !== typeof this.start) {
        throw TypeError('start must be a Number');
      }
      if (this.end === undefined) {
        this.end = Infinity;
      } else if ('number' !== typeof this.end) {
        throw TypeError('end must be a Number');
      }

      if (this.start > this.end) {
        throw new Error('start must be <= end');
      }

      this.pos = this.start;
    }

    if (this.fd !== null) {
      process.nextTick(function() {
        self._read();
      });
      return;
    }

    fs.open(this.path, this.flags, this.mode, function (err, fd) {
      if (err) {
        self.emit('error', err);
        self.readable = false;
        return;
      }

      self.fd = fd;
      self.emit('open', fd);
      self._read();
    })
  }

  function WriteStream (path, options) {
    if (!(this instanceof WriteStream)) return new WriteStream(path, options);

    Stream.call(this);

    this.path = path;
    this.fd = null;
    this.writable = true;

    this.flags = 'w';
    this.encoding = 'binary';
    this.mode = 438; /*=0666*/
    this.bytesWritten = 0;

    options = options || {};

    // Mixin options into this
    var keys = Object.keys(options);
    for (var index = 0, length = keys.length; index < length; index++) {
      var key = keys[index];
      this[key] = options[key];
    }

    if (this.start !== undefined) {
      if ('number' !== typeof this.start) {
        throw TypeError('start must be a Number');
      }
      if (this.start < 0) {
        throw new Error('start must be >= zero');
      }

      this.pos = this.start;
    }

    this.busy = false;
    this._queue = [];

    if (this.fd === null) {
      this._open = fs.open;
      this._queue.push([this._open, this.path, this.flags, this.mode, undefined]);
      this.flush();
    }
  }
}
{
  "dependencies": {},
  "deprecated": false,
  "description": "A drop-in replacement for fs, making various improvements.",
  "devDependencies": {
    "import-fresh": "^2.0.0",
    "mkdirp": "^0.5.0",
    "rimraf": "^2.2.8",
    "tap": "^12.7.0"
  },
  "directories": {
    "test": "test"
  },
  "files": [
    "fs.js",
    "graceful-fs.js",
    "legacy-streams.js",
    "polyfills.js",
    "clone.js"
  ],
  "homepage": "https://github.com/isaacs/node-graceful-fs#readme",
  "license": "ISC",
  "main": "graceful-fs.js",
  "name": "graceful-fs",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/node-graceful-fs.git"
  },
  "version": "4.2.3"
}var constants = require('constants')

var origCwd = process.cwd
var cwd = null

var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform

process.cwd = function() {
  if (!cwd)
    cwd = origCwd.call(process)
  return cwd
}
try {
  process.cwd()
} catch (er) {}

var chdir = process.chdir
process.chdir = function(d) {
  cwd = null
  chdir.call(process, d)
}

module.exports = patch

function patch (fs) {
  // (re-)implement some things that are known busted or missing.

  // lchmod, broken prior to 0.6.2
  // back-port the fix here.
  if (constants.hasOwnProperty('O_SYMLINK') &&
      process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) {
    patchLchmod(fs)
  }

  // lutimes implementation, or no-op
  if (!fs.lutimes) {
    patchLutimes(fs)
  }

  // https://github.com/isaacs/node-graceful-fs/issues/4
  // Chown should not fail on einval or eperm if non-root.
  // It should not fail on enosys ever, as this just indicates
  // that a fs doesn't support the intended operation.

  fs.chown = chownFix(fs.chown)
  fs.fchown = chownFix(fs.fchown)
  fs.lchown = chownFix(fs.lchown)

  fs.chmod = chmodFix(fs.chmod)
  fs.fchmod = chmodFix(fs.fchmod)
  fs.lchmod = chmodFix(fs.lchmod)

  fs.chownSync = chownFixSync(fs.chownSync)
  fs.fchownSync = chownFixSync(fs.fchownSync)
  fs.lchownSync = chownFixSync(fs.lchownSync)

  fs.chmodSync = chmodFixSync(fs.chmodSync)
  fs.fchmodSync = chmodFixSync(fs.fchmodSync)
  fs.lchmodSync = chmodFixSync(fs.lchmodSync)

  fs.stat = statFix(fs.stat)
  fs.fstat = statFix(fs.fstat)
  fs.lstat = statFix(fs.lstat)

  fs.statSync = statFixSync(fs.statSync)
  fs.fstatSync = statFixSync(fs.fstatSync)
  fs.lstatSync = statFixSync(fs.lstatSync)

  // if lchmod/lchown do not exist, then make them no-ops
  if (!fs.lchmod) {
    fs.lchmod = function (path, mode, cb) {
      if (cb) process.nextTick(cb)
    }
    fs.lchmodSync = function () {}
  }
  if (!fs.lchown) {
    fs.lchown = function (path, uid, gid, cb) {
      if (cb) process.nextTick(cb)
    }
    fs.lchownSync = function () {}
  }

  // on Windows, A/V software can lock the directory, causing this
  // to fail with an EACCES or EPERM if the directory contains newly
  // created files.  Try again on failure, for up to 60 seconds.

  // Set the timeout this long because some Windows Anti-Virus, such as Parity
  // bit9, may lock files for up to a minute, causing npm package install
  // failures. Also, take care to yield the scheduler. Windows scheduling gives
  // CPU to a busy looping process, which can cause the program causing the lock
  // contention to be starved of CPU by node, so the contention doesn't resolve.
  if (platform === "win32") {
    fs.rename = (function (fs$rename) { return function (from, to, cb) {
      var start = Date.now()
      var backoff = 0;
      fs$rename(from, to, function CB (er) {
        if (er
            && (er.code === "EACCES" || er.code === "EPERM")
            && Date.now() - start < 60000) {
          setTimeout(function() {
            fs.stat(to, function (stater, st) {
              if (stater && stater.code === "ENOENT")
                fs$rename(from, to, CB);
              else
                cb(er)
            })
          }, backoff)
          if (backoff < 100)
            backoff += 10;
          return;
        }
        if (cb) cb(er)
      })
    }})(fs.rename)
  }

  // if read() returns EAGAIN, then just try it again.
  fs.read = (function (fs$read) {
    function read (fd, buffer, offset, length, position, callback_) {
      var callback
      if (callback_ && typeof callback_ === 'function') {
        var eagCounter = 0
        callback = function (er, _, __) {
          if (er && er.code === 'EAGAIN' && eagCounter < 10) {
            eagCounter ++
            return fs$read.call(fs, fd, buffer, offset, length, position, callback)
          }
          callback_.apply(this, arguments)
        }
      }
      return fs$read.call(fs, fd, buffer, offset, length, position, callback)
    }

    // This ensures `util.promisify` works as it does for native `fs.read`.
    read.__proto__ = fs$read
    return read
  })(fs.read)

  fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) {
    var eagCounter = 0
    while (true) {
      try {
        return fs$readSync.call(fs, fd, buffer, offset, length, position)
      } catch (er) {
        if (er.code === 'EAGAIN' && eagCounter < 10) {
          eagCounter ++
          continue
        }
        throw er
      }
    }
  }})(fs.readSync)

  function patchLchmod (fs) {
    fs.lchmod = function (path, mode, callback) {
      fs.open( path
             , constants.O_WRONLY | constants.O_SYMLINK
             , mode
             , function (err, fd) {
        if (err) {
          if (callback) callback(err)
          return
        }
        // prefer to return the chmod error, if one occurs,
        // but still try to close, and report closing errors if they occur.
        fs.fchmod(fd, mode, function (err) {
          fs.close(fd, function(err2) {
            if (callback) callback(err || err2)
          })
        })
      })
    }

    fs.lchmodSync = function (path, mode) {
      var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode)

      // prefer to return the chmod error, if one occurs,
      // but still try to close, and report closing errors if they occur.
      var threw = true
      var ret
      try {
        ret = fs.fchmodSync(fd, mode)
        threw = false
      } finally {
        if (threw) {
          try {
            fs.closeSync(fd)
          } catch (er) {}
        } else {
          fs.closeSync(fd)
        }
      }
      return ret
    }
  }

  function patchLutimes (fs) {
    if (constants.hasOwnProperty("O_SYMLINK")) {
      fs.lutimes = function (path, at, mt, cb) {
        fs.open(path, constants.O_SYMLINK, function (er, fd) {
          if (er) {
            if (cb) cb(er)
            return
          }
          fs.futimes(fd, at, mt, function (er) {
            fs.close(fd, function (er2) {
              if (cb) cb(er || er2)
            })
          })
        })
      }

      fs.lutimesSync = function (path, at, mt) {
        var fd = fs.openSync(path, constants.O_SYMLINK)
        var ret
        var threw = true
        try {
          ret = fs.futimesSync(fd, at, mt)
          threw = false
        } finally {
          if (threw) {
            try {
              fs.closeSync(fd)
            } catch (er) {}
          } else {
            fs.closeSync(fd)
          }
        }
        return ret
      }

    } else {
      fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) }
      fs.lutimesSync = function () {}
    }
  }

  function chmodFix (orig) {
    if (!orig) return orig
    return function (target, mode, cb) {
      return orig.call(fs, target, mode, function (er) {
        if (chownErOk(er)) er = null
        if (cb) cb.apply(this, arguments)
      })
    }
  }

  function chmodFixSync (orig) {
    if (!orig) return orig
    return function (target, mode) {
      try {
        return orig.call(fs, target, mode)
      } catch (er) {
        if (!chownErOk(er)) throw er
      }
    }
  }


  function chownFix (orig) {
    if (!orig) return orig
    return function (target, uid, gid, cb) {
      return orig.call(fs, target, uid, gid, function (er) {
        if (chownErOk(er)) er = null
        if (cb) cb.apply(this, arguments)
      })
    }
  }

  function chownFixSync (orig) {
    if (!orig) return orig
    return function (target, uid, gid) {
      try {
        return orig.call(fs, target, uid, gid)
      } catch (er) {
        if (!chownErOk(er)) throw er
      }
    }
  }

  function statFix (orig) {
    if (!orig) return orig
    // Older versions of Node erroneously returned signed integers for
    // uid + gid.
    return function (target, options, cb) {
      if (typeof options === 'function') {
        cb = options
        options = null
      }
      function callback (er, stats) {
        if (stats) {
          if (stats.uid < 0) stats.uid += 0x100000000
          if (stats.gid < 0) stats.gid += 0x100000000
        }
        if (cb) cb.apply(this, arguments)
      }
      return options ? orig.call(fs, target, options, callback)
        : orig.call(fs, target, callback)
    }
  }

  function statFixSync (orig) {
    if (!orig) return orig
    // Older versions of Node erroneously returned signed integers for
    // uid + gid.
    return function (target, options) {
      var stats = options ? orig.call(fs, target, options)
        : orig.call(fs, target)
      if (stats.uid < 0) stats.uid += 0x100000000
      if (stats.gid < 0) stats.gid += 0x100000000
      return stats;
    }
  }

  // ENOSYS means that the fs doesn't support the op. Just ignore
  // that, because it doesn't matter.
  //
  // if there's no getuid, or if getuid() is something other
  // than 0, and the error is EINVAL or EPERM, then just ignore
  // it.
  //
  // This specific case is a silent failure in cp, install, tar,
  // and most other unix tools that manage permissions.
  //
  // When running as root, or if other types of errors are
  // encountered, then it's strict.
  function chownErOk (er) {
    if (!er)
      return true

    if (er.code === "ENOSYS")
      return true

    var nonroot = !process.getuid || process.getuid() !== 0
    if (nonroot) {
      if (er.code === "EINVAL" || er.code === "EPERM")
        return true
    }

    return false
  }
}
Copyright (c) 2013 Thiago de Arruda

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Thiago de Arruda",
    "email": "tpadilha84@gmail.com"
  },
  "dependencies": {
    "function-bind": "^1.1.1"
  },
  "deprecated": false,
  "description": "Object.prototype.hasOwnProperty.call shortcut",
  "devDependencies": {
    "@ljharb/eslint-config": "^12.2.1",
    "eslint": "^4.19.1",
    "tape": "^4.9.0"
  },
  "engines": {
    "node": ">= 0.4.0"
  },
  "homepage": "https://github.com/tarruda/has",
  "license": "MIT",
  "licenses": [
    {
      "type": "MIT",
      "url": "https://github.com/tarruda/has/blob/master/LICENSE-MIT"
    }
  ],
  "main": "./src",
  "name": "has",
  "repository": {
    "type": "git",
    "url": "git://github.com/tarruda/has.git"
  },
  "version": "1.0.3"
}'use strict';

var bind = require('function-bind');

module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);
'use strict';
module.exports = (flag, argv) => {
	argv = argv || process.argv;
	const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');
	const pos = argv.indexOf(prefix + flag);
	const terminatorPos = argv.indexOf('--');
	return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if argv has a specific flag",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/has-flag#readme",
  "license": "MIT",
  "name": "has-flag",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/has-flag.git"
  },
  "version": "3.0.0"
}MIT License

Copyright (c) 2016 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';

var origSymbol = global.Symbol;
var hasSymbolSham = require('./shams');

module.exports = function hasNativeSymbols() {
	if (typeof origSymbol !== 'function') { return false; }
	if (typeof Symbol !== 'function') { return false; }
	if (typeof origSymbol('foo') !== 'symbol') { return false; }
	if (typeof Symbol('bar') !== 'symbol') { return false; }

	return hasSymbolSham();
};
{
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com",
    "url": "http://ljharb.codes"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Determine if the JS environment has Symbol support. Supports spec, or shams.",
  "devDependencies": {
    "@ljharb/eslint-config": "^15.0.1",
    "auto-changelog": "^1.16.2",
    "core-js": "^2.6.10",
    "eslint": "^6.6.0",
    "get-own-property-symbols": "^0.9.4",
    "safe-publish-latest": "^1.1.4",
    "tape": "^4.11.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/ljharb/has-symbols#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "has-symbols",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/has-symbols.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "1.0.1"
}'use strict';

/* eslint complexity: [2, 18], max-statements: [2, 33] */
module.exports = function hasSymbols() {
	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
	if (typeof Symbol.iterator === 'symbol') { return true; }

	var obj = {};
	var sym = Symbol('test');
	var symObj = Object(sym);
	if (typeof sym === 'string') { return false; }

	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }

	// temp disabled per https://github.com/ljharb/object.assign/issues/17
	// if (sym instanceof Symbol) { return false; }
	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
	// if (!(symObj instanceof Symbol)) { return false; }

	// if (typeof Symbol.prototype.toString !== 'function') { return false; }
	// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }

	var symVal = 42;
	obj[sym] = symVal;
	for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax
	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }

	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }

	var syms = Object.getOwnPropertySymbols(obj);
	if (syms.length !== 1 || syms[0] !== sym) { return false; }

	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }

	if (typeof Object.getOwnPropertyDescriptor === 'function') {
		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
	}

	return true;
};
# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/has-symbols
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
name: Automatic Rebase

on: [pull_request]

jobs:
  _:
    name: "Automatic Rebase"

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - uses: ljharb/rebase@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Copyright (c) 2015, Rebecca Turner

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
'use strict'

var gitHosts = module.exports = {
  github: {
    // First two are insecure and generally shouldn't be used any more, but
    // they are still supported.
    'protocols': [ 'git', 'http', 'git+ssh', 'git+https', 'ssh', 'https' ],
    'domain': 'github.com',
    'treepath': 'tree',
    'filetemplate': 'https://{auth@}raw.githubusercontent.com/{user}/{project}/{committish}/{path}',
    'bugstemplate': 'https://{domain}/{user}/{project}/issues',
    'gittemplate': 'git://{auth@}{domain}/{user}/{project}.git{#committish}',
    'tarballtemplate': 'https://codeload.{domain}/{user}/{project}/tar.gz/{committish}'
  },
  bitbucket: {
    'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ],
    'domain': 'bitbucket.org',
    'treepath': 'src',
    'tarballtemplate': 'https://{domain}/{user}/{project}/get/{committish}.tar.gz'
  },
  gitlab: {
    'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ],
    'domain': 'gitlab.com',
    'treepath': 'tree',
    'bugstemplate': 'https://{domain}/{user}/{project}/issues',
    'httpstemplate': 'git+https://{auth@}{domain}/{user}/{projectPath}.git{#committish}',
    'tarballtemplate': 'https://{domain}/{user}/{project}/repository/archive.tar.gz?ref={committish}',
    'pathmatch': /^[/]([^/]+)[/]((?!.*(\/-\/|\/repository\/archive\.tar\.gz\?=.*|\/repository\/[^/]+\/archive.tar.gz$)).*?)(?:[.]git|[/])?$/
  },
  gist: {
    'protocols': [ 'git', 'git+ssh', 'git+https', 'ssh', 'https' ],
    'domain': 'gist.github.com',
    'pathmatch': /^[/](?:([^/]+)[/])?([a-z0-9]{32,})(?:[.]git)?$/,
    'filetemplate': 'https://gist.githubusercontent.com/{user}/{project}/raw{/committish}/{path}',
    'bugstemplate': 'https://{domain}/{project}',
    'gittemplate': 'git://{domain}/{project}.git{#committish}',
    'sshtemplate': 'git@{domain}:/{project}.git{#committish}',
    'sshurltemplate': 'git+ssh://git@{domain}/{project}.git{#committish}',
    'browsetemplate': 'https://{domain}/{project}{/committish}',
    'browsefiletemplate': 'https://{domain}/{project}{/committish}{#path}',
    'docstemplate': 'https://{domain}/{project}{/committish}',
    'httpstemplate': 'git+https://{domain}/{project}.git{#committish}',
    'shortcuttemplate': '{type}:{project}{#committish}',
    'pathtemplate': '{project}{#committish}',
    'tarballtemplate': 'https://codeload.github.com/gist/{project}/tar.gz/{committish}',
    'hashformat': function (fragment) {
      return 'file-' + formatHashFragment(fragment)
    }
  }
}

var gitHostDefaults = {
  'sshtemplate': 'git@{domain}:{user}/{project}.git{#committish}',
  'sshurltemplate': 'git+ssh://git@{domain}/{user}/{project}.git{#committish}',
  'browsetemplate': 'https://{domain}/{user}/{project}{/tree/committish}',
  'browsefiletemplate': 'https://{domain}/{user}/{project}/{treepath}/{committish}/{path}{#fragment}',
  'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#readme',
  'httpstemplate': 'git+https://{auth@}{domain}/{user}/{project}.git{#committish}',
  'filetemplate': 'https://{domain}/{user}/{project}/raw/{committish}/{path}',
  'shortcuttemplate': '{type}:{user}/{project}{#committish}',
  'pathtemplate': '{user}/{project}{#committish}',
  'pathmatch': /^[/]([^/]+)[/]([^/]+?)(?:[.]git|[/])?$/,
  'hashformat': formatHashFragment
}

Object.keys(gitHosts).forEach(function (name) {
  Object.keys(gitHostDefaults).forEach(function (key) {
    if (gitHosts[name][key]) return
    gitHosts[name][key] = gitHostDefaults[key]
  })
  gitHosts[name].protocols_re = RegExp('^(' +
    gitHosts[name].protocols.map(function (protocol) {
      return protocol.replace(/([\\+*{}()[\]$^|])/g, '\\$1')
    }).join('|') + '):$')
})

function formatHashFragment (fragment) {
  return fragment.toLowerCase().replace(/^\W+|\/|\W+$/g, '').replace(/\W+/g, '-')
}
'use strict'
var gitHosts = require('./git-host-info.js')
/* eslint-disable node/no-deprecated-api */

// copy-pasta util._extend from node's source, to avoid pulling
// the whole util module into peoples' webpack bundles.
/* istanbul ignore next */
var extend = Object.assign || function _extend (target, source) {
  // Don't do anything if source isn't an object
  if (source === null || typeof source !== 'object') return target

  var keys = Object.keys(source)
  var i = keys.length
  while (i--) {
    target[keys[i]] = source[keys[i]]
  }
  return target
}

module.exports = GitHost
function GitHost (type, user, auth, project, committish, defaultRepresentation, opts) {
  var gitHostInfo = this
  gitHostInfo.type = type
  Object.keys(gitHosts[type]).forEach(function (key) {
    gitHostInfo[key] = gitHosts[type][key]
  })
  gitHostInfo.user = user
  gitHostInfo.auth = auth
  gitHostInfo.project = project
  gitHostInfo.committish = committish
  gitHostInfo.default = defaultRepresentation
  gitHostInfo.opts = opts || {}
}

GitHost.prototype.hash = function () {
  return this.committish ? '#' + this.committish : ''
}

GitHost.prototype._fill = function (template, opts) {
  if (!template) return
  var vars = extend({}, opts)
  vars.path = vars.path ? vars.path.replace(/^[/]+/g, '') : ''
  opts = extend(extend({}, this.opts), opts)
  var self = this
  Object.keys(this).forEach(function (key) {
    if (self[key] != null && vars[key] == null) vars[key] = self[key]
  })
  var rawAuth = vars.auth
  var rawcommittish = vars.committish
  var rawFragment = vars.fragment
  var rawPath = vars.path
  var rawProject = vars.project
  Object.keys(vars).forEach(function (key) {
    var value = vars[key]
    if ((key === 'path' || key === 'project') && typeof value === 'string') {
      vars[key] = value.split('/').map(function (pathComponent) {
        return encodeURIComponent(pathComponent)
      }).join('/')
    } else {
      vars[key] = encodeURIComponent(value)
    }
  })
  vars['auth@'] = rawAuth ? rawAuth + '@' : ''
  vars['#fragment'] = rawFragment ? '#' + this.hashformat(rawFragment) : ''
  vars.fragment = vars.fragment ? vars.fragment : ''
  vars['#path'] = rawPath ? '#' + this.hashformat(rawPath) : ''
  vars['/path'] = vars.path ? '/' + vars.path : ''
  vars.projectPath = rawProject.split('/').map(encodeURIComponent).join('/')
  if (opts.noCommittish) {
    vars['#committish'] = ''
    vars['/tree/committish'] = ''
    vars['/committish'] = ''
    vars.committish = ''
  } else {
    vars['#committish'] = rawcommittish ? '#' + rawcommittish : ''
    vars['/tree/committish'] = vars.committish
      ? '/' + vars.treepath + '/' + vars.committish
      : ''
    vars['/committish'] = vars.committish ? '/' + vars.committish : ''
    vars.committish = vars.committish || 'master'
  }
  var res = template
  Object.keys(vars).forEach(function (key) {
    res = res.replace(new RegExp('[{]' + key + '[}]', 'g'), vars[key])
  })
  if (opts.noGitPlus) {
    return res.replace(/^git[+]/, '')
  } else {
    return res
  }
}

GitHost.prototype.ssh = function (opts) {
  return this._fill(this.sshtemplate, opts)
}

GitHost.prototype.sshurl = function (opts) {
  return this._fill(this.sshurltemplate, opts)
}

GitHost.prototype.browse = function (P, F, opts) {
  if (typeof P === 'string') {
    if (typeof F !== 'string') {
      opts = F
      F = null
    }
    return this._fill(this.browsefiletemplate, extend({
      fragment: F,
      path: P
    }, opts))
  } else {
    return this._fill(this.browsetemplate, P)
  }
}

GitHost.prototype.docs = function (opts) {
  return this._fill(this.docstemplate, opts)
}

GitHost.prototype.bugs = function (opts) {
  return this._fill(this.bugstemplate, opts)
}

GitHost.prototype.https = function (opts) {
  return this._fill(this.httpstemplate, opts)
}

GitHost.prototype.git = function (opts) {
  return this._fill(this.gittemplate, opts)
}

GitHost.prototype.shortcut = function (opts) {
  return this._fill(this.shortcuttemplate, opts)
}

GitHost.prototype.path = function (opts) {
  return this._fill(this.pathtemplate, opts)
}

GitHost.prototype.tarball = function (opts_) {
  var opts = extend({}, opts_, { noCommittish: false })
  return this._fill(this.tarballtemplate, opts)
}

GitHost.prototype.file = function (P, opts) {
  return this._fill(this.filetemplate, extend({ path: P }, opts))
}

GitHost.prototype.getDefaultRepresentation = function () {
  return this.default
}

GitHost.prototype.toString = function (opts) {
  if (this.default && typeof this[this.default] === 'function') return this[this.default](opts)
  return this.sshurl(opts)
}
'use strict'
var url = require('url')
var gitHosts = require('./git-host-info.js')
var GitHost = module.exports = require('./git-host.js')

var protocolToRepresentationMap = {
  'git+ssh:': 'sshurl',
  'git+https:': 'https',
  'ssh:': 'sshurl',
  'git:': 'git'
}

function protocolToRepresentation (protocol) {
  return protocolToRepresentationMap[protocol] || protocol.slice(0, -1)
}

var authProtocols = {
  'git:': true,
  'https:': true,
  'git+https:': true,
  'http:': true,
  'git+http:': true
}

var cache = {}

module.exports.fromUrl = function (giturl, opts) {
  if (typeof giturl !== 'string') return
  var key = giturl + JSON.stringify(opts || {})

  if (!(key in cache)) {
    cache[key] = fromUrl(giturl, opts)
  }

  return cache[key]
}

function fromUrl (giturl, opts) {
  if (giturl == null || giturl === '') return
  var url = fixupUnqualifiedGist(
    isGitHubShorthand(giturl) ? 'github:' + giturl : giturl
  )
  var parsed = parseGitUrl(url)
  var shortcutMatch = url.match(new RegExp('^([^:]+):(?:(?:[^@:]+(?:[^@]+)?@)?([^/]*))[/](.+?)(?:[.]git)?($|#)'))
  var matches = Object.keys(gitHosts).map(function (gitHostName) {
    try {
      var gitHostInfo = gitHosts[gitHostName]
      var auth = null
      if (parsed.auth && authProtocols[parsed.protocol]) {
        auth = parsed.auth
      }
      var committish = parsed.hash ? decodeURIComponent(parsed.hash.substr(1)) : null
      var user = null
      var project = null
      var defaultRepresentation = null
      if (shortcutMatch && shortcutMatch[1] === gitHostName) {
        user = shortcutMatch[2] && decodeURIComponent(shortcutMatch[2])
        project = decodeURIComponent(shortcutMatch[3])
        defaultRepresentation = 'shortcut'
      } else {
        if (parsed.host && parsed.host !== gitHostInfo.domain && parsed.host.replace(/^www[.]/, '') !== gitHostInfo.domain) return
        if (!gitHostInfo.protocols_re.test(parsed.protocol)) return
        if (!parsed.path) return
        var pathmatch = gitHostInfo.pathmatch
        var matched = parsed.path.match(pathmatch)
        if (!matched) return
        /* istanbul ignore else */
        if (matched[1] !== null && matched[1] !== undefined) {
          user = decodeURIComponent(matched[1].replace(/^:/, ''))
        }
        project = decodeURIComponent(matched[2])
        defaultRepresentation = protocolToRepresentation(parsed.protocol)
      }
      return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts)
    } catch (ex) {
      /* istanbul ignore else */
      if (ex instanceof URIError) {
      } else throw ex
    }
  }).filter(function (gitHostInfo) { return gitHostInfo })
  if (matches.length !== 1) return
  return matches[0]
}

function isGitHubShorthand (arg) {
  // Note: This does not fully test the git ref format.
  // See https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html
  //
  // The only way to do this properly would be to shell out to
  // git-check-ref-format, and as this is a fast sync function,
  // we don't want to do that.  Just let git fail if it turns
  // out that the commit-ish is invalid.
  // GH usernames cannot start with . or -
  return /^[^:@%/\s.-][^:@%/\s]*[/][^:@\s/%]+(?:#.*)?$/.test(arg)
}

function fixupUnqualifiedGist (giturl) {
  // necessary for round-tripping gists
  var parsed = url.parse(giturl)
  if (parsed.protocol === 'gist:' && parsed.host && !parsed.path) {
    return parsed.protocol + '/' + parsed.host
  } else {
    return giturl
  }
}

function parseGitUrl (giturl) {
  var matched = giturl.match(/^([^@]+)@([^:/]+):[/]?((?:[^/]+[/])?[^/]+?)(?:[.]git)?(#.*)?$/)
  if (!matched) {
    var legacy = url.parse(giturl)
    // If we don't have url.URL, then sorry, this is just not fixable.
    // This affects Node <= 6.12.
    if (legacy.auth && typeof url.URL === 'function') {
      // git urls can be in the form of scp-style/ssh-connect strings, like
      // git+ssh://user@host.com:some/path, which the legacy url parser
      // supports, but WhatWG url.URL class does not.  However, the legacy
      // parser de-urlencodes the username and password, so something like
      // https://user%3An%40me:p%40ss%3Aword@x.com/ becomes
      // https://user:n@me:p@ss:word@x.com/ which is all kinds of wrong.
      // Pull off just the auth and host, so we dont' get the confusing
      // scp-style URL, then pass that to the WhatWG parser to get the
      // auth properly escaped.
      var authmatch = giturl.match(/[^@]+@[^:/]+/)
      /* istanbul ignore else - this should be impossible */
      if (authmatch) {
        var whatwg = new url.URL(authmatch[0])
        legacy.auth = whatwg.username || ''
        if (whatwg.password) legacy.auth += ':' + whatwg.password
      }
    }
    return legacy
  }
  return {
    protocol: 'git+ssh:',
    slashes: true,
    auth: matched[1],
    host: matched[2],
    port: null,
    hostname: matched[2],
    hash: matched[4],
    search: null,
    query: null,
    pathname: '/' + matched[3],
    path: '/' + matched[3],
    href: 'git+ssh://' + matched[1] + '@' + matched[2] +
          '/' + matched[3] + (matched[4] || '')
  }
}
{
  "author": {
    "name": "Rebecca Turner",
    "email": "me@re-becca.org",
    "url": "http://re-becca.org"
  },
  "deprecated": false,
  "description": "Provides metadata and conversions from repository urls for Github, Bitbucket and Gitlab",
  "devDependencies": {
    "standard": "^11.0.1",
    "standard-version": "^4.4.0",
    "tap": "^12.7.0"
  },
  "files": [
    "index.js",
    "git-host.js",
    "git-host-info.js"
  ],
  "homepage": "https://github.com/npm/hosted-git-info",
  "license": "ISC",
  "main": "index.js",
  "name": "hosted-git-info",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/hosted-git-info.git"
  },
  "version": "2.8.8"
}The ISC License

Copyright (c) Isaac Z. Schlueter

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
var wrappy = require('wrappy')
var reqs = Object.create(null)
var once = require('once')

module.exports = wrappy(inflight)

function inflight (key, cb) {
  if (reqs[key]) {
    reqs[key].push(cb)
    return null
  } else {
    reqs[key] = [cb]
    return makeres(key)
  }
}

function makeres (key) {
  return once(function RES () {
    var cbs = reqs[key]
    var len = cbs.length
    var args = slice(arguments)

    // XXX It's somewhat ambiguous whether a new callback added in this
    // pass should be queued for later execution if something in the
    // list of callbacks throws, or if it should just be discarded.
    // However, it's such an edge case that it hardly matters, and either
    // choice is likely as surprising as the other.
    // As it happens, we do go ahead and schedule it for later execution.
    try {
      for (var i = 0; i < len; i++) {
        cbs[i].apply(null, args)
      }
    } finally {
      if (cbs.length > len) {
        // added more in the interim.
        // de-zalgo, just in case, but don't call again.
        cbs.splice(0, len)
        process.nextTick(function () {
          RES.apply(null, args)
        })
      } else {
        delete reqs[key]
      }
    }
  })
}

function slice (args) {
  var length = args.length
  var array = []

  for (var i = 0; i < length; i++) array[i] = args[i]
  return array
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {
    "once": "^1.3.0",
    "wrappy": "1"
  },
  "deprecated": false,
  "description": "Add callbacks to requests in flight to avoid async duplication",
  "devDependencies": {
    "tap": "^7.1.2"
  },
  "files": [
    "inflight.js"
  ],
  "homepage": "https://github.com/isaacs/inflight",
  "license": "ISC",
  "main": "inflight.js",
  "name": "inflight",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/inflight.git"
  },
  "version": "1.0.6"
}The ISC License

Copyright (c) Isaac Z. Schlueter

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

try {
  var util = require('util');
  /* istanbul ignore next */
  if (typeof util.inherits !== 'function') throw '';
  module.exports = util.inherits;
} catch (e) {
  /* istanbul ignore next */
  module.exports = require('./inherits_browser.js');
}
if (typeof Object.create === 'function') {
  // implementation from standard node.js 'util' module
  module.exports = function inherits(ctor, superCtor) {
    if (superCtor) {
      ctor.super_ = superCtor
      ctor.prototype = Object.create(superCtor.prototype, {
        constructor: {
          value: ctor,
          enumerable: false,
          writable: true,
          configurable: true
        }
      })
    }
  };
} else {
  // old school shim for old browsers
  module.exports = function inherits(ctor, superCtor) {
    if (superCtor) {
      ctor.super_ = superCtor
      var TempCtor = function () {}
      TempCtor.prototype = superCtor.prototype
      ctor.prototype = new TempCtor()
      ctor.prototype.constructor = ctor
    }
  }
}
{
  "browser": "./inherits_browser.js",
  "deprecated": false,
  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
  "devDependencies": {
    "tap": "^14.2.4"
  },
  "files": [
    "inherits.js",
    "inherits_browser.js"
  ],
  "homepage": "https://github.com/isaacs/inherits#readme",
  "license": "ISC",
  "main": "./inherits.js",
  "name": "inherits",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/inherits.git"
  },
  "version": "2.0.4"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
exports.parse = exports.decode = decode

exports.stringify = exports.encode = encode

exports.safe = safe
exports.unsafe = unsafe

var eol = typeof process !== 'undefined' &&
  process.platform === 'win32' ? '\r\n' : '\n'

function encode (obj, opt) {
  var children = []
  var out = ''

  if (typeof opt === 'string') {
    opt = {
      section: opt,
      whitespace: false
    }
  } else {
    opt = opt || {}
    opt.whitespace = opt.whitespace === true
  }

  var separator = opt.whitespace ? ' = ' : '='

  Object.keys(obj).forEach(function (k, _, __) {
    var val = obj[k]
    if (val && Array.isArray(val)) {
      val.forEach(function (item) {
        out += safe(k + '[]') + separator + safe(item) + '\n'
      })
    } else if (val && typeof val === 'object') {
      children.push(k)
    } else {
      out += safe(k) + separator + safe(val) + eol
    }
  })

  if (opt.section && out.length) {
    out = '[' + safe(opt.section) + ']' + eol + out
  }

  children.forEach(function (k, _, __) {
    var nk = dotSplit(k).join('\\.')
    var section = (opt.section ? opt.section + '.' : '') + nk
    var child = encode(obj[k], {
      section: section,
      whitespace: opt.whitespace
    })
    if (out.length && child.length) {
      out += eol
    }
    out += child
  })

  return out
}

function dotSplit (str) {
  return str.replace(/\1/g, '\u0002LITERAL\\1LITERAL\u0002')
    .replace(/\\\./g, '\u0001')
    .split(/\./).map(function (part) {
      return part.replace(/\1/g, '\\.')
      .replace(/\2LITERAL\\1LITERAL\2/g, '\u0001')
    })
}

function decode (str) {
  var out = {}
  var p = out
  var section = null
  //          section     |key      = value
  var re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i
  var lines = str.split(/[\r\n]+/g)

  lines.forEach(function (line, _, __) {
    if (!line || line.match(/^\s*[;#]/)) return
    var match = line.match(re)
    if (!match) return
    if (match[1] !== undefined) {
      section = unsafe(match[1])
      p = out[section] = out[section] || {}
      return
    }
    var key = unsafe(match[2])
    var value = match[3] ? unsafe(match[4]) : true
    switch (value) {
      case 'true':
      case 'false':
      case 'null': value = JSON.parse(value)
    }

    // Convert keys with '[]' suffix to an array
    if (key.length > 2 && key.slice(-2) === '[]') {
      key = key.substring(0, key.length - 2)
      if (!p[key]) {
        p[key] = []
      } else if (!Array.isArray(p[key])) {
        p[key] = [p[key]]
      }
    }

    // safeguard against resetting a previously defined
    // array by accidentally forgetting the brackets
    if (Array.isArray(p[key])) {
      p[key].push(value)
    } else {
      p[key] = value
    }
  })

  // {a:{y:1},"a.b":{x:2}} --> {a:{y:1,b:{x:2}}}
  // use a filter to return the keys that have to be deleted.
  Object.keys(out).filter(function (k, _, __) {
    if (!out[k] ||
      typeof out[k] !== 'object' ||
      Array.isArray(out[k])) {
      return false
    }
    // see if the parent section is also an object.
    // if so, add it to that, and mark this one for deletion
    var parts = dotSplit(k)
    var p = out
    var l = parts.pop()
    var nl = l.replace(/\\\./g, '.')
    parts.forEach(function (part, _, __) {
      if (!p[part] || typeof p[part] !== 'object') p[part] = {}
      p = p[part]
    })
    if (p === out && nl === l) {
      return false
    }
    p[nl] = out[k]
    return true
  }).forEach(function (del, _, __) {
    delete out[del]
  })

  return out
}

function isQuoted (val) {
  return (val.charAt(0) === '"' && val.slice(-1) === '"') ||
    (val.charAt(0) === "'" && val.slice(-1) === "'")
}

function safe (val) {
  return (typeof val !== 'string' ||
    val.match(/[=\r\n]/) ||
    val.match(/^\[/) ||
    (val.length > 1 &&
     isQuoted(val)) ||
    val !== val.trim())
      ? JSON.stringify(val)
      : val.replace(/;/g, '\\;').replace(/#/g, '\\#')
}

function unsafe (val, doUnesc) {
  val = (val || '').trim()
  if (isQuoted(val)) {
    // remove the single quotes before calling JSON.parse
    if (val.charAt(0) === "'") {
      val = val.substr(1, val.length - 2)
    }
    try { val = JSON.parse(val) } catch (_) {}
  } else {
    // walk the val to find the first not-escaped ; character
    var esc = false
    var unesc = ''
    for (var i = 0, l = val.length; i < l; i++) {
      var c = val.charAt(i)
      if (esc) {
        if ('\\;#'.indexOf(c) !== -1) {
          unesc += c
        } else {
          unesc += '\\' + c
        }
        esc = false
      } else if (';#'.indexOf(c) !== -1) {
        break
      } else if (c === '\\') {
        esc = true
      } else {
        unesc += c
      }
    }
    if (esc) {
      unesc += '\\'
    }
    return unesc.trim()
  }
  return val
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "An ini encoder/decoder for node",
  "devDependencies": {
    "standard": "^10.0.3",
    "tap": "^10.7.3 || 11"
  },
  "engines": {
    "node": "*"
  },
  "files": [
    "ini.js"
  ],
  "homepage": "https://github.com/isaacs/ini#readme",
  "license": "ISC",
  "main": "ini.js",
  "name": "ini",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/ini.git"
  },
  "version": "1.3.5"
}root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
{
	"es3": true,

	"additionalRules": [],

	"requireSemicolons": true,

	"disallowMultipleSpaces": true,

	"disallowIdentifierNames": [],

	"requireCurlyBraces": {
		"allExcept": [],
		"keywords": ["if", "else", "for", "while", "do", "try", "catch"]
	},

	"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],

	"disallowSpaceAfterKeywords": [],

	"disallowSpaceBeforeComma": true,
	"disallowSpaceAfterComma": false,
	"disallowSpaceBeforeSemicolon": true,

	"disallowNodeTypes": [
		"DebuggerStatement",
		"ForInStatement",
		"LabeledStatement",
		"SwitchCase",
		"SwitchStatement",
		"WithStatement"
	],

	"requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },

	"requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
	"requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
	"disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
	"requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
	"disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },

	"requireSpaceBetweenArguments": true,

	"disallowSpacesInsideParentheses": true,

	"disallowSpacesInsideArrayBrackets": true,

	"disallowQuotedKeysInObjects": { "allExcept": ["reserved"] },

	"disallowSpaceAfterObjectKeys": true,

	"requireCommaBeforeLineBreak": true,

	"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
	"requireSpaceAfterPrefixUnaryOperators": [],

	"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
	"requireSpaceBeforePostfixUnaryOperators": [],

	"disallowSpaceBeforeBinaryOperators": [],
	"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],

	"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
	"disallowSpaceAfterBinaryOperators": [],

	"disallowImplicitTypeConversion": ["binary", "string"],

	"disallowKeywords": ["with", "eval"],

	"requireKeywordsOnNewLine": [],
	"disallowKeywordsOnNewLine": ["else"],

	"requireLineFeedAtFileEnd": true,

	"disallowTrailingWhitespace": true,

	"disallowTrailingComma": true,

	"excludeFiles": ["node_modules/**", "vendor/**"],

	"disallowMultipleLineStrings": true,

	"requireDotNotation": { "allExcept": ["keywords"] },

	"requireParenthesesAroundIIFE": true,

	"validateLineBreaks": "LF",

	"validateQuoteMarks": {
		"escape": true,
		"mark": "'"
	},

	"disallowOperatorBeforeLineBreak": [],

	"requireSpaceBeforeKeywords": [
		"do",
		"for",
		"if",
		"else",
		"switch",
		"case",
		"try",
		"catch",
		"finally",
		"while",
		"with",
		"return"
	],

	"validateAlignedFunctionParameters": {
		"lineBreakAfterOpeningBraces": true,
		"lineBreakBeforeClosingBraces": true
	},

	"requirePaddingNewLinesBeforeExport": true,

	"validateNewlineAfterArrayElements": {
		"maximum": 1
	},

	"requirePaddingNewLinesAfterUseStrict": true,

	"disallowArrowFunctions": true,

	"disallowMultiLineTernary": true,

	"validateOrderInObjectKeys": "asc-insensitive",

	"disallowIdenticalDestructuringNames": true,

	"disallowNestedTernaries": { "maxLevel": 1 },

	"requireSpaceAfterComma": { "allExcept": ["trailing"] },
	"requireAlignedMultilineParams": false,

	"requireSpacesInGenerator": {
		"afterStar": true
	},

	"disallowSpacesInGenerator": {
		"beforeStar": true
	},

	"disallowVar": false,

	"requireArrayDestructuring": false,

	"requireEnhancedObjectLiterals": false,

	"requireObjectDestructuring": false,

	"requireEarlyReturn": false,

	"requireCapitalizedConstructorsNew": {
		"allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
	},

	"requireImportAlphabetized": false,

	"requireSpaceBeforeObjectValues": true,
	"requireSpaceBeforeDestructuredValues": true,

	"disallowSpacesInsideTemplateStringPlaceholders": true,

	"disallowArrayDestructuringReturn": false,

	"requireNewlineBeforeSingleStatementsInIf": false,

	"disallowUnusedVariables": true,

	"requireSpacesInsideImportedObjectBraces": true,

	"requireUseStrict": true
}

The MIT License (MIT)

Copyright (c) 2014 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict';

var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
var toStr = Object.prototype.toString;

var isStandardArguments = function isArguments(value) {
	if (hasToStringTag && value && typeof value === 'object' && Symbol.toStringTag in value) {
		return false;
	}
	return toStr.call(value) === '[object Arguments]';
};

var isLegacyArguments = function isArguments(value) {
	if (isStandardArguments(value)) {
		return true;
	}
	return value !== null &&
		typeof value === 'object' &&
		typeof value.length === 'number' &&
		value.length >= 0 &&
		toStr.call(value) !== '[object Array]' &&
		toStr.call(value.callee) === '[object Function]';
};

var supportsStandardArguments = (function () {
	return isStandardArguments(arguments);
}());

isStandardArguments.isLegacyArguments = isLegacyArguments; // for tests

module.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;
{
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com",
    "url": "http://ljharb.codes"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Is this an arguments object? It's a harder question than you think.",
  "devDependencies": {
    "@ljharb/eslint-config": "^13.0.0",
    "covert": "^1.1.0",
    "eslint": "^5.8.0",
    "jscs": "^3.0.7",
    "nsp": "^3.2.1",
    "tape": "^4.9.1"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "homepage": "https://github.com/ljharb/is-arguments",
  "license": "MIT",
  "main": "index.js",
  "name": "is-arguments",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/is-arguments.git"
  },
  "testling": {
    "files": "test.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "1.0.4"
}root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
verbose: false
instrumentation:
    root: .
    extensions:
        - .js
        - .jsx
    default-excludes: true
    excludes: []
    variable: __coverage__
    compact: true
    preserve-comments: false
    complete-copy: false
    save-baseline: false
    baseline-file: ./coverage/coverage-baseline.raw.json
    include-all-sources: false
    include-pid: false
    es-modules: false
    auto-wrap: false
reporting:
    print: summary
    reports:
        - html
    dir: ./coverage
    summarizer: pkg
    report-config: {}
    watermarks:
        statements: [50, 80]
        functions: [50, 80]
        branches: [50, 80]
        lines: [50, 80]
hooks:
    hook-run-in-context: false
    post-require-hook: null
    handle-sigint: false
check:
    global:
        statements: 100
        lines: 100
        branches: 100
        functions: 100
        excludes: []
    each:
        statements: 100
        lines: 100
        branches: 100
        functions: 100
        excludes: []
The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

'use strict';

var fnToStr = Function.prototype.toString;

var constructorRegex = /^\s*class\b/;
var isES6ClassFn = function isES6ClassFunction(value) {
	try {
		var fnStr = fnToStr.call(value);
		return constructorRegex.test(fnStr);
	} catch (e) {
		return false; // not a function
	}
};

var tryFunctionObject = function tryFunctionToStr(value) {
	try {
		if (isES6ClassFn(value)) { return false; }
		fnToStr.call(value);
		return true;
	} catch (e) {
		return false;
	}
};
var toStr = Object.prototype.toString;
var fnClass = '[object Function]';
var genClass = '[object GeneratorFunction]';
var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';

module.exports = function isCallable(value) {
	if (!value) { return false; }
	if (typeof value !== 'function' && typeof value !== 'object') { return false; }
	if (typeof value === 'function' && !value.prototype) { return true; }
	if (hasToStringTag) { return tryFunctionObject(value); }
	if (isES6ClassFn(value)) { return false; }
	var strClass = toStr.call(value);
	return strClass === fnClass || strClass === genClass;
};
{
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com",
    "url": "http://ljharb.codes"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Is this JS value callable? Works with Functions and GeneratorFunctions, despite ES6 @@toStringTag.",
  "devDependencies": {
    "@ljharb/eslint-config": "^15.0.2",
    "covert": "^1.1.1",
    "eclint": "^2.8.1",
    "eslint": "^6.7.2",
    "foreach": "^2.0.5",
    "istanbul": "1.1.0-alpha.1",
    "istanbul-merge": "^1.1.1",
    "make-arrow-function": "^1.1.0",
    "make-generator-function": "^1.1.0",
    "rimraf": "^2.7.1",
    "tape": "^4.12.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/ljharb/is-callable#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "is-callable",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/is-callable.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "1.1.5"
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/is-callable
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
workflow "Autorebase branch on merge commits" {
	on = "push"
	resolves = ["rebase"]
}

workflow "Autorebase PR on merge commits" {
	on = "pull_request"
	resolves = ["rebase"]
}

 action "rebase" {
	uses = "ljharb/rebase@latest"
	secrets = ["GITHUB_TOKEN"]
}
name: Automatic Rebase

on: [pull_request]

jobs:
  _:
    name: "Automatic Rebase"

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - uses: ljharb/rebase@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
The MIT License (MIT)

Copyright (c) 2016-2018 Thomas Watson Steen

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
#!/usr/bin/env node
'use strict'

process.exit(require('./') ? 0 : 1)
'use strict'

module.exports = require('ci-info').isCI
{
  "author": {
    "name": "Thomas Watson Steen",
    "email": "w@tson.dk",
    "url": "https://twitter.com/wa7son"
  },
  "bin": {
    "is-ci": "bin.js"
  },
  "coordinates": [
    55.778272,
    12.593116
  ],
  "dependencies": {
    "ci-info": "^2.0.0"
  },
  "deprecated": false,
  "description": "Detect if the current environment is a CI server",
  "devDependencies": {
    "clear-module": "^3.0.0",
    "standard": "^12.0.1"
  },
  "homepage": "https://github.com/watson/is-ci",
  "license": "MIT",
  "main": "index.js",
  "name": "is-ci",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/watson/is-ci.git"
  },
  "version": "2.0.0"
}{
	"es3": true,

	"additionalRules": [],

	"requireSemicolons": true,

	"disallowMultipleSpaces": true,

	"disallowIdentifierNames": [],

	"requireCurlyBraces": {
		"allExcept": [],
		"keywords": ["if", "else", "for", "while", "do", "try", "catch"]
	},

	"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],

	"disallowSpaceAfterKeywords": [],

	"disallowSpaceBeforeComma": true,
	"disallowSpaceAfterComma": false,
	"disallowSpaceBeforeSemicolon": true,

	"disallowNodeTypes": [
		"DebuggerStatement",
		"ForInStatement",
		"LabeledStatement",
		"SwitchCase",
		"SwitchStatement",
		"WithStatement"
	],

	"requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },

	"requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
	"requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
	"disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
	"requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
	"disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },

	"requireSpaceBetweenArguments": true,

	"disallowSpacesInsideParentheses": true,

	"disallowSpacesInsideArrayBrackets": true,

	"disallowQuotedKeysInObjects": { "allExcept": ["reserved"] },

	"disallowSpaceAfterObjectKeys": true,

	"requireCommaBeforeLineBreak": true,

	"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
	"requireSpaceAfterPrefixUnaryOperators": [],

	"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
	"requireSpaceBeforePostfixUnaryOperators": [],

	"disallowSpaceBeforeBinaryOperators": [],
	"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],

	"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
	"disallowSpaceAfterBinaryOperators": [],

	"disallowImplicitTypeConversion": ["binary", "string"],

	"disallowKeywords": ["with", "eval"],

	"requireKeywordsOnNewLine": [],
	"disallowKeywordsOnNewLine": ["else"],

	"requireLineFeedAtFileEnd": true,

	"disallowTrailingWhitespace": true,

	"disallowTrailingComma": true,

	"excludeFiles": ["node_modules/**", "vendor/**"],

	"disallowMultipleLineStrings": true,

	"requireDotNotation": { "allExcept": ["keywords"] },

	"requireParenthesesAroundIIFE": true,

	"validateLineBreaks": "LF",

	"validateQuoteMarks": {
		"escape": true,
		"mark": "'"
	},

	"disallowOperatorBeforeLineBreak": [],

	"requireSpaceBeforeKeywords": [
		"do",
		"for",
		"if",
		"else",
		"switch",
		"case",
		"try",
		"catch",
		"finally",
		"while",
		"with",
		"return"
	],

	"validateAlignedFunctionParameters": {
		"lineBreakAfterOpeningBraces": true,
		"lineBreakBeforeClosingBraces": true
	},

	"requirePaddingNewLinesBeforeExport": true,

	"validateNewlineAfterArrayElements": {
		"maximum": 1
	},

	"requirePaddingNewLinesAfterUseStrict": true,

	"disallowArrowFunctions": true,

	"disallowMultiLineTernary": true,

	"validateOrderInObjectKeys": "asc-insensitive",

	"disallowIdenticalDestructuringNames": true,

	"disallowNestedTernaries": { "maxLevel": 1 },

	"requireSpaceAfterComma": { "allExcept": ["trailing"] },
	"requireAlignedMultilineParams": false,

	"requireSpacesInGenerator": {
		"afterStar": true
	},

	"disallowSpacesInGenerator": {
		"beforeStar": true
	},

	"disallowVar": false,

	"requireArrayDestructuring": false,

	"requireEnhancedObjectLiterals": false,

	"requireObjectDestructuring": false,

	"requireEarlyReturn": false,

	"requireCapitalizedConstructorsNew": {
		"allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
	},

	"requireImportAlphabetized": false,

	"requireSpaceBeforeObjectValues": true,
	"requireSpaceBeforeDestructuredValues": true,

	"disallowSpacesInsideTemplateStringPlaceholders": true,

	"disallowArrayDestructuringReturn": false,

	"requireNewlineBeforeSingleStatementsInIf": false,

	"disallowUnusedVariables": true,

	"requireSpacesInsideImportedObjectBraces": true,

	"requireUseStrict": true
}

The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

'use strict';

var getDay = Date.prototype.getDay;
var tryDateObject = function tryDateGetDayCall(value) {
	try {
		getDay.call(value);
		return true;
	} catch (e) {
		return false;
	}
};

var toStr = Object.prototype.toString;
var dateClass = '[object Date]';
var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';

module.exports = function isDateObject(value) {
	if (typeof value !== 'object' || value === null) {
		return false;
	}
	return hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;
};
{
  "author": {
    "name": "Jordan Harband"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Is this value a JS Date object? This module works cross-realm/iframe, and despite ES6 @@toStringTag.",
  "devDependencies": {
    "@ljharb/eslint-config": "^15.0.2",
    "auto-changelog": "^1.16.2",
    "covert": "^1.1.1",
    "eslint": "^6.7.2",
    "foreach": "^2.0.5",
    "indexof": "^0.0.1",
    "is": "^3.3.0",
    "safe-publish-latest": "^1.1.4",
    "tape": "^4.12.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/ljharb/is-date-object#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "is-date-object",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/is-date-object.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "1.0.2"
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/is-date-object
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
name: Automatic Rebase

on: [pull_request]

jobs:
  _:
    name: "Automatic Rebase"

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - uses: ljharb/rebase@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
'use strict';
module.exports = function (x) {
	var type = typeof x;
	return x !== null && (type === 'object' || type === 'function');
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if a value is an object",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/is-obj#readme",
  "license": "MIT",
  "name": "is-obj",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-obj.git"
  },
  "version": "1.0.1"
}The MIT License (MIT)

Copyright (c) 2014 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict';

var has = require('has');
var regexExec = RegExp.prototype.exec;
var gOPD = Object.getOwnPropertyDescriptor;

var tryRegexExecCall = function tryRegexExec(value) {
	try {
		var lastIndex = value.lastIndex;
		value.lastIndex = 0; // eslint-disable-line no-param-reassign

		regexExec.call(value);
		return true;
	} catch (e) {
		return false;
	} finally {
		value.lastIndex = lastIndex; // eslint-disable-line no-param-reassign
	}
};
var toStr = Object.prototype.toString;
var regexClass = '[object RegExp]';
var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';

module.exports = function isRegex(value) {
	if (!value || typeof value !== 'object') {
		return false;
	}
	if (!hasToStringTag) {
		return toStr.call(value) === regexClass;
	}

	var descriptor = gOPD(value, 'lastIndex');
	var hasLastIndexDataProperty = descriptor && has(descriptor, 'value');
	if (!hasLastIndexDataProperty) {
		return false;
	}

	return tryRegexExecCall(value);
};
{
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false
  },
  "dependencies": {
    "has": "^1.0.3"
  },
  "deprecated": false,
  "description": "Is this value a JS regex? Works cross-realm/iframe, and despite ES6 @@toStringTag",
  "devDependencies": {
    "@ljharb/eslint-config": "^15.0.2",
    "auto-changelog": "^1.16.2",
    "covert": "^1.1.1",
    "eclint": "^2.8.1",
    "eslint": "^6.7.2",
    "tape": "^4.11.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/ljharb/is-regex",
  "license": "MIT",
  "main": "index.js",
  "name": "is-regex",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/is-regex.git"
  },
  "testling": {
    "files": "test.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..12.0",
      "opera/15.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "1.0.5"
}name: Automatic Rebase

on: [pull_request]

jobs:
  _:
    name: "Automatic Rebase"

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - uses: ljharb/rebase@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
root = true

[*]
indent_style = tab;
insert_final_newline = true;
quote_type = auto;
space_after_anonymous_functions = true;
space_after_control_statements = true;
spaces_around_operators = true;
trim_trailing_whitespace = true;
spaces_in_brackets = false;
end_of_line = lf;

node
The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

# Since we rely on paths relative to the makefile location, abort if make isn't being run from there.
$(if $(findstring /,$(MAKEFILE_LIST)),$(error Please only invoke this makefile from the directory it resides in))

	# The files that need updating when incrementing the version number.
VERSIONED_FILES := *.js *.json README*


# Add the local npm packages' bin folder to the PATH, so that `make` can find them, when invoked directly.
# Note that rather than using `$(npm bin)` the 'node_modules/.bin' path component is hard-coded, so that invocation works even from an environment
# where npm is (temporarily) unavailable due to having deactivated an nvm instance loaded into the calling shell in order to avoid interference with tests.
export PATH := $(shell printf '%s' "$$PWD/node_modules/.bin:$$PATH")
UTILS := semver
# Make sure that all required utilities can be located.
UTIL_CHECK := $(or $(shell PATH="$(PATH)" which $(UTILS) >/dev/null && echo 'ok'),$(error Did you forget to run `npm install` after cloning the repo? At least one of the required supporting utilities not found: $(UTILS)))

# Default target (by virtue of being the first non '.'-prefixed in the file).
.PHONY: _no-target-specified
_no-target-specified:
	$(error Please specify the target to make - `make list` shows targets. Alternatively, use `npm test` to run the default tests; `npm run` shows all tests)

# Lists all targets defined in this makefile.
.PHONY: list
list:
	@$(MAKE) -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | command grep -v -e '^[^[:alnum:]]' -e '^$@$$command ' | sort

# All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS).
.PHONY: test
test:
	@npm test

.PHONY: _ensure-tag
_ensure-tag:
ifndef TAG
	$(error Please invoke with `make TAG=<new-version> release`, where <new-version> is either an increment specifier (patch, minor, major, prepatch, preminor, premajor, prerelease), or an explicit major.minor.patch version number)
endif

CHANGELOG_ERROR = $(error No CHANGELOG specified)
.PHONY: _ensure-changelog
_ensure-changelog:
	@ (git status -sb --porcelain | command grep -E '^( M|[MA] ) CHANGELOG.md' > /dev/null) || (echo no CHANGELOG.md specified && exit 2)

# Ensures that the git workspace is clean.
.PHONY: _ensure-clean
_ensure-clean:
	@[ -z "$$((git status --porcelain --untracked-files=no || echo err) | command grep -v 'CHANGELOG.md')" ] || { echo "Workspace is not clean; please commit changes first." >&2; exit 2; }

# Makes a release; invoke with `make TAG=<versionOrIncrementSpec> release`.
.PHONY: release
release: _ensure-tag _ensure-changelog _ensure-clean
	@old_ver=`git describe --abbrev=0 --tags --match 'v[0-9]*.[0-9]*.[0-9]*'` || { echo "Failed to determine current version." >&2; exit 1; }; old_ver=$${old_ver#v}; \
	 new_ver=`echo "$(TAG)" | sed 's/^v//'`; new_ver=$${new_ver:-patch}; \
	 if printf "$$new_ver" | command grep -q '^[0-9]'; then \
	   semver "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be major.minor.patch' >&2; exit 2; }; \
	   semver -r "> $$old_ver" "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be HIGHER than current one.' >&2; exit 2; } \
	 else \
	   new_ver=`semver -i "$$new_ver" "$$old_ver"` || { echo 'Invalid version-increment specifier: $(TAG)' >&2; exit 2; } \
	 fi; \
	 printf "=== Bumping version **$$old_ver** to **$$new_ver** before committing and tagging:\n=== TYPE 'proceed' TO PROCEED, anything else to abort: " && read response && [ "$$response" = 'proceed' ] || { echo 'Aborted.' >&2; exit 2; };  \
	 replace "$$old_ver" "$$new_ver" -- $(VERSIONED_FILES) && \
	 git commit -m "v$$new_ver" $(VERSIONED_FILES) CHANGELOG.md && \
	 git tag -a -m "v$$new_ver" "v$$new_ver"
'use strict';

var toStr = Object.prototype.toString;
var hasSymbols = require('has-symbols')();

if (hasSymbols) {
	var symToStr = Symbol.prototype.toString;
	var symStringRegex = /^Symbol\(.*\)$/;
	var isSymbolObject = function isRealSymbolObject(value) {
		if (typeof value.valueOf() !== 'symbol') {
			return false;
		}
		return symStringRegex.test(symToStr.call(value));
	};

	module.exports = function isSymbol(value) {
		if (typeof value === 'symbol') {
			return true;
		}
		if (toStr.call(value) !== '[object Symbol]') {
			return false;
		}
		try {
			return isSymbolObject(value);
		} catch (e) {
			return false;
		}
	};
} else {

	module.exports = function isSymbol(value) {
		// this environment does not support Symbols.
		return false && value;
	};
}
{
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false
  },
  "dependencies": {
    "has-symbols": "^1.0.1"
  },
  "deprecated": false,
  "description": "Determine if a value is an ES6 Symbol or not.",
  "devDependencies": {
    "@ljharb/eslint-config": "^15.0.2",
    "auto-changelog": "^1.16.2",
    "covert": "^1.1.1",
    "eslint": "^6.6.0",
    "object-inspect": "^1.7.0",
    "safe-publish-latest": "^1.1.4",
    "semver": "^6.3.0",
    "tape": "^4.11.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/inspect-js/is-symbol#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "is-symbol",
  "repository": {
    "type": "git",
    "url": "git://github.com/inspect-js/is-symbol.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "1.0.3"
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/is-symbol
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
name: Automatic Rebase

on: [pull_request]

jobs:
  _:
    name: "Automatic Rebase"

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - uses: ljharb/rebase@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Copyright (c) 2019 Garen J. Torikian

MIT License

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "dependencies": {},
  "deprecated": false,
  "description": "Detects if a file is binary in Node.js. Similar to Perl's -B.",
  "devDependencies": {
    "@types/jest": "^23.3.14",
    "@types/node": "^10.17.17",
    "jest": "^25.1.0",
    "prettier": "^1.19.1",
    "release-it": "^12.6.3",
    "ts-jest": "^23.10.5",
    "tslint": "^5.20.1",
    "tslint-config-prettier": "^1.18.0",
    "typescript": "^3.8.3"
  },
  "engines": {
    "node": ">= 8.0.0"
  },
  "files": [
    "lib/**/*"
  ],
  "funding": "https://github.com/sponsors/gjtorikian/",
  "homepage": "https://github.com/gjtorikian/isBinaryFile#readme",
  "license": "MIT",
  "main": "lib/index.js",
  "maintainers": [
    {
      "name": "Garen J. Torikian",
      "email": "gjtorikian@gmail.com"
    }
  ],
  "name": "isbinaryfile",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/gjtorikian/isBinaryFile.git"
  },
  "types": "lib/index.d.ts",
  "version": "4.0.6"
}"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const util_1 = require("util");
const statAsync = util_1.promisify(fs.stat);
const openAsync = util_1.promisify(fs.open);
const closeAsync = util_1.promisify(fs.close);
const MAX_BYTES = 512;
function isBinaryFile(file, size) {
    return __awaiter(this, void 0, void 0, function* () {
        if (isString(file)) {
            const stat = yield statAsync(file);
            isStatFile(stat);
            const fileDescriptor = yield openAsync(file, 'r');
            const allocBuffer = Buffer.alloc(MAX_BYTES);
            // Read the file with no encoding for raw buffer access.
            // NB: something is severely wrong with promisify, had to construct my own Promise
            return new Promise((fulfill, reject) => {
                fs.read(fileDescriptor, allocBuffer, 0, MAX_BYTES, 0, (err, bytesRead, _) => {
                    closeAsync(fileDescriptor);
                    if (err) {
                        reject(err);
                    }
                    else {
                        fulfill(isBinaryCheck(allocBuffer, bytesRead));
                    }
                });
            });
        }
        else {
            if (size === undefined) {
                size = file.length;
            }
            return isBinaryCheck(file, size);
        }
    });
}
exports.isBinaryFile = isBinaryFile;
function isBinaryFileSync(file, size) {
    if (isString(file)) {
        const stat = fs.statSync(file);
        isStatFile(stat);
        const fileDescriptor = fs.openSync(file, 'r');
        const allocBuffer = Buffer.alloc(MAX_BYTES);
        const bytesRead = fs.readSync(fileDescriptor, allocBuffer, 0, MAX_BYTES, 0);
        fs.closeSync(fileDescriptor);
        return isBinaryCheck(allocBuffer, bytesRead);
    }
    else {
        if (size === undefined) {
            size = file.length;
        }
        return isBinaryCheck(file, size);
    }
}
exports.isBinaryFileSync = isBinaryFileSync;
function isBinaryCheck(fileBuffer, bytesRead) {
    // empty file. no clue what it is.
    if (bytesRead === 0) {
        return false;
    }
    let suspiciousBytes = 0;
    const totalBytes = Math.min(bytesRead, MAX_BYTES);
    // UTF-8 BOM
    if (bytesRead >= 3 && fileBuffer[0] === 0xef && fileBuffer[1] === 0xbb && fileBuffer[2] === 0xbf) {
        return false;
    }
    // UTF-32 BOM
    if (bytesRead >= 4 &&
        fileBuffer[0] === 0x00 &&
        fileBuffer[1] === 0x00 &&
        fileBuffer[2] === 0xfe &&
        fileBuffer[3] === 0xff) {
        return false;
    }
    // UTF-32 LE BOM
    if (bytesRead >= 4 &&
        fileBuffer[0] === 0xff &&
        fileBuffer[1] === 0xfe &&
        fileBuffer[2] === 0x00 &&
        fileBuffer[3] === 0x00) {
        return false;
    }
    // GB BOM
    if (bytesRead >= 4 &&
        fileBuffer[0] === 0x84 &&
        fileBuffer[1] === 0x31 &&
        fileBuffer[2] === 0x95 &&
        fileBuffer[3] === 0x33) {
        return false;
    }
    if (totalBytes >= 5 && fileBuffer.slice(0, 5).toString() === '%PDF-') {
        /* PDF. This is binary. */
        return true;
    }
    // UTF-16 BE BOM
    if (bytesRead >= 2 && fileBuffer[0] === 0xfe && fileBuffer[1] === 0xff) {
        return false;
    }
    // UTF-16 LE BOM
    if (bytesRead >= 2 && fileBuffer[0] === 0xff && fileBuffer[1] === 0xfe) {
        return false;
    }
    for (let i = 0; i < totalBytes; i++) {
        if (fileBuffer[i] === 0) {
            // NULL byte--it's binary!
            return true;
        }
        else if ((fileBuffer[i] < 7 || fileBuffer[i] > 14) && (fileBuffer[i] < 32 || fileBuffer[i] > 127)) {
            // UTF-8 detection
            if (fileBuffer[i] > 193 && fileBuffer[i] < 224 && i + 1 < totalBytes) {
                i++;
                if (fileBuffer[i] > 127 && fileBuffer[i] < 192) {
                    continue;
                }
            }
            else if (fileBuffer[i] > 223 && fileBuffer[i] < 240 && i + 2 < totalBytes) {
                i++;
                if (fileBuffer[i] > 127 && fileBuffer[i] < 192 && fileBuffer[i + 1] > 127 && fileBuffer[i + 1] < 192) {
                    i++;
                    continue;
                }
            }
            suspiciousBytes++;
            // Read at least 32 fileBuffer before making a decision
            if (i > 32 && (suspiciousBytes * 100) / totalBytes > 10) {
                return true;
            }
        }
    }
    if ((suspiciousBytes * 100) / totalBytes > 10) {
        return true;
    }
    return false;
}
function isString(x) {
    return typeof x === 'string';
}
function isStatFile(stat) {
    if (!stat.isFile()) {
        throw new Error(`Path provided was not a file!`);
    }
}
The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
var fs = require('fs')
var core
if (process.platform === 'win32' || global.TESTING_WINDOWS) {
  core = require('./windows.js')
} else {
  core = require('./mode.js')
}

module.exports = isexe
isexe.sync = sync

function isexe (path, options, cb) {
  if (typeof options === 'function') {
    cb = options
    options = {}
  }

  if (!cb) {
    if (typeof Promise !== 'function') {
      throw new TypeError('callback not provided')
    }

    return new Promise(function (resolve, reject) {
      isexe(path, options || {}, function (er, is) {
        if (er) {
          reject(er)
        } else {
          resolve(is)
        }
      })
    })
  }

  core(path, options || {}, function (er, is) {
    // ignore EACCES because that just means we aren't allowed to run it
    if (er) {
      if (er.code === 'EACCES' || options && options.ignoreErrors) {
        er = null
        is = false
      }
    }
    cb(er, is)
  })
}

function sync (path, options) {
  // my kingdom for a filtered catch
  try {
    return core.sync(path, options || {})
  } catch (er) {
    if (options && options.ignoreErrors || er.code === 'EACCES') {
      return false
    } else {
      throw er
    }
  }
}
module.exports = isexe
isexe.sync = sync

var fs = require('fs')

function isexe (path, options, cb) {
  fs.stat(path, function (er, stat) {
    cb(er, er ? false : checkStat(stat, options))
  })
}

function sync (path, options) {
  return checkStat(fs.statSync(path), options)
}

function checkStat (stat, options) {
  return stat.isFile() && checkMode(stat, options)
}

function checkMode (stat, options) {
  var mod = stat.mode
  var uid = stat.uid
  var gid = stat.gid

  var myUid = options.uid !== undefined ?
    options.uid : process.getuid && process.getuid()
  var myGid = options.gid !== undefined ?
    options.gid : process.getgid && process.getgid()

  var u = parseInt('100', 8)
  var g = parseInt('010', 8)
  var o = parseInt('001', 8)
  var ug = u | g

  var ret = (mod & o) ||
    (mod & g) && gid === myGid ||
    (mod & u) && uid === myUid ||
    (mod & ug) && myUid === 0

  return ret
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "deprecated": false,
  "description": "Minimal module to check if a file is executable.",
  "devDependencies": {
    "mkdirp": "^0.5.1",
    "rimraf": "^2.5.0",
    "tap": "^10.3.0"
  },
  "directories": {
    "test": "test"
  },
  "homepage": "https://github.com/isaacs/isexe#readme",
  "license": "ISC",
  "main": "index.js",
  "name": "isexe",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/isexe.git"
  },
  "version": "2.0.0"
}module.exports = isexe
isexe.sync = sync

var fs = require('fs')

function checkPathExt (path, options) {
  var pathext = options.pathExt !== undefined ?
    options.pathExt : process.env.PATHEXT

  if (!pathext) {
    return true
  }

  pathext = pathext.split(';')
  if (pathext.indexOf('') !== -1) {
    return true
  }
  for (var i = 0; i < pathext.length; i++) {
    var p = pathext[i].toLowerCase()
    if (p && path.substr(-p.length).toLowerCase() === p) {
      return true
    }
  }
  return false
}

function checkStat (stat, path, options) {
  if (!stat.isSymbolicLink() && !stat.isFile()) {
    return false
  }
  return checkPathExt(path, options)
}

function isexe (path, options, cb) {
  fs.stat(path, function (er, stat) {
    cb(er, er ? false : checkStat(stat, path, options))
  })
}

function sync (path, options) {
  return checkStat(fs.statSync(path), path, options)
}
(The MIT License)

Copyright (C) 2011-2015 by Vitaly Puzrin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'use strict';


var yaml = require('./lib/js-yaml.js');


module.exports = yaml;
{
  "author": {
    "name": "Vladimir Zapparov",
    "email": "dervus.grim@gmail.com"
  },
  "bin": {
    "js-yaml": "bin/js-yaml.js"
  },
  "dependencies": {
    "argparse": "^1.0.7",
    "esprima": "^4.0.0"
  },
  "deprecated": false,
  "description": "YAML 1.2 parser and serializer",
  "devDependencies": {
    "ansi": "^0.3.1",
    "benchmark": "^2.1.4",
    "browserify": "^16.2.2",
    "codemirror": "^5.13.4",
    "eslint": "^7.0.0",
    "fast-check": "^1.24.2",
    "istanbul": "^0.4.5",
    "mocha": "^7.1.2",
    "uglify-js": "^3.0.1"
  },
  "files": [
    "index.js",
    "lib/",
    "bin/",
    "dist/"
  ],
  "homepage": "https://github.com/nodeca/js-yaml",
  "jsdelivr": "dist/js-yaml.min.js",
  "license": "MIT",
  "name": "js-yaml",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/nodeca/js-yaml.git"
  },
  "unpkg": "dist/js-yaml.min.js",
  "version": "3.14.0"
}'use strict';


var loader = require('./js-yaml/loader');
var dumper = require('./js-yaml/dumper');


function deprecated(name) {
  return function () {
    throw new Error('Function ' + name + ' is deprecated and cannot be used.');
  };
}


module.exports.Type                = require('./js-yaml/type');
module.exports.Schema              = require('./js-yaml/schema');
module.exports.FAILSAFE_SCHEMA     = require('./js-yaml/schema/failsafe');
module.exports.JSON_SCHEMA         = require('./js-yaml/schema/json');
module.exports.CORE_SCHEMA         = require('./js-yaml/schema/core');
module.exports.DEFAULT_SAFE_SCHEMA = require('./js-yaml/schema/default_safe');
module.exports.DEFAULT_FULL_SCHEMA = require('./js-yaml/schema/default_full');
module.exports.load                = loader.load;
module.exports.loadAll             = loader.loadAll;
module.exports.safeLoad            = loader.safeLoad;
module.exports.safeLoadAll         = loader.safeLoadAll;
module.exports.dump                = dumper.dump;
module.exports.safeDump            = dumper.safeDump;
module.exports.YAMLException       = require('./js-yaml/exception');

// Deprecated schema names from JS-YAML 2.0.x
module.exports.MINIMAL_SCHEMA = require('./js-yaml/schema/failsafe');
module.exports.SAFE_SCHEMA    = require('./js-yaml/schema/default_safe');
module.exports.DEFAULT_SCHEMA = require('./js-yaml/schema/default_full');

// Deprecated functions from JS-YAML 1.x.x
module.exports.scan           = deprecated('scan');
module.exports.parse          = deprecated('parse');
module.exports.compose        = deprecated('compose');
module.exports.addConstructor = deprecated('addConstructor');
'use strict';


function isNothing(subject) {
  return (typeof subject === 'undefined') || (subject === null);
}


function isObject(subject) {
  return (typeof subject === 'object') && (subject !== null);
}


function toArray(sequence) {
  if (Array.isArray(sequence)) return sequence;
  else if (isNothing(sequence)) return [];

  return [ sequence ];
}


function extend(target, source) {
  var index, length, key, sourceKeys;

  if (source) {
    sourceKeys = Object.keys(source);

    for (index = 0, length = sourceKeys.length; index < length; index += 1) {
      key = sourceKeys[index];
      target[key] = source[key];
    }
  }

  return target;
}


function repeat(string, count) {
  var result = '', cycle;

  for (cycle = 0; cycle < count; cycle += 1) {
    result += string;
  }

  return result;
}


function isNegativeZero(number) {
  return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);
}


module.exports.isNothing      = isNothing;
module.exports.isObject       = isObject;
module.exports.toArray        = toArray;
module.exports.repeat         = repeat;
module.exports.isNegativeZero = isNegativeZero;
module.exports.extend         = extend;
'use strict';

/*eslint-disable no-use-before-define*/

var common              = require('./common');
var YAMLException       = require('./exception');
var DEFAULT_FULL_SCHEMA = require('./schema/default_full');
var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe');

var _toString       = Object.prototype.toString;
var _hasOwnProperty = Object.prototype.hasOwnProperty;

var CHAR_TAB                  = 0x09; /* Tab */
var CHAR_LINE_FEED            = 0x0A; /* LF */
var CHAR_CARRIAGE_RETURN      = 0x0D; /* CR */
var CHAR_SPACE                = 0x20; /* Space */
var CHAR_EXCLAMATION          = 0x21; /* ! */
var CHAR_DOUBLE_QUOTE         = 0x22; /* " */
var CHAR_SHARP                = 0x23; /* # */
var CHAR_PERCENT              = 0x25; /* % */
var CHAR_AMPERSAND            = 0x26; /* & */
var CHAR_SINGLE_QUOTE         = 0x27; /* ' */
var CHAR_ASTERISK             = 0x2A; /* * */
var CHAR_COMMA                = 0x2C; /* , */
var CHAR_MINUS                = 0x2D; /* - */
var CHAR_COLON                = 0x3A; /* : */
var CHAR_EQUALS               = 0x3D; /* = */
var CHAR_GREATER_THAN         = 0x3E; /* > */
var CHAR_QUESTION             = 0x3F; /* ? */
var CHAR_COMMERCIAL_AT        = 0x40; /* @ */
var CHAR_LEFT_SQUARE_BRACKET  = 0x5B; /* [ */
var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */
var CHAR_GRAVE_ACCENT         = 0x60; /* ` */
var CHAR_LEFT_CURLY_BRACKET   = 0x7B; /* { */
var CHAR_VERTICAL_LINE        = 0x7C; /* | */
var CHAR_RIGHT_CURLY_BRACKET  = 0x7D; /* } */

var ESCAPE_SEQUENCES = {};

ESCAPE_SEQUENCES[0x00]   = '\\0';
ESCAPE_SEQUENCES[0x07]   = '\\a';
ESCAPE_SEQUENCES[0x08]   = '\\b';
ESCAPE_SEQUENCES[0x09]   = '\\t';
ESCAPE_SEQUENCES[0x0A]   = '\\n';
ESCAPE_SEQUENCES[0x0B]   = '\\v';
ESCAPE_SEQUENCES[0x0C]   = '\\f';
ESCAPE_SEQUENCES[0x0D]   = '\\r';
ESCAPE_SEQUENCES[0x1B]   = '\\e';
ESCAPE_SEQUENCES[0x22]   = '\\"';
ESCAPE_SEQUENCES[0x5C]   = '\\\\';
ESCAPE_SEQUENCES[0x85]   = '\\N';
ESCAPE_SEQUENCES[0xA0]   = '\\_';
ESCAPE_SEQUENCES[0x2028] = '\\L';
ESCAPE_SEQUENCES[0x2029] = '\\P';

var DEPRECATED_BOOLEANS_SYNTAX = [
  'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',
  'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'
];

function compileStyleMap(schema, map) {
  var result, keys, index, length, tag, style, type;

  if (map === null) return {};

  result = {};
  keys = Object.keys(map);

  for (index = 0, length = keys.length; index < length; index += 1) {
    tag = keys[index];
    style = String(map[tag]);

    if (tag.slice(0, 2) === '!!') {
      tag = 'tag:yaml.org,2002:' + tag.slice(2);
    }
    type = schema.compiledTypeMap['fallback'][tag];

    if (type && _hasOwnProperty.call(type.styleAliases, style)) {
      style = type.styleAliases[style];
    }

    result[tag] = style;
  }

  return result;
}

function encodeHex(character) {
  var string, handle, length;

  string = character.toString(16).toUpperCase();

  if (character <= 0xFF) {
    handle = 'x';
    length = 2;
  } else if (character <= 0xFFFF) {
    handle = 'u';
    length = 4;
  } else if (character <= 0xFFFFFFFF) {
    handle = 'U';
    length = 8;
  } else {
    throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF');
  }

  return '\\' + handle + common.repeat('0', length - string.length) + string;
}

function State(options) {
  this.schema        = options['schema'] || DEFAULT_FULL_SCHEMA;
  this.indent        = Math.max(1, (options['indent'] || 2));
  this.noArrayIndent = options['noArrayIndent'] || false;
  this.skipInvalid   = options['skipInvalid'] || false;
  this.flowLevel     = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);
  this.styleMap      = compileStyleMap(this.schema, options['styles'] || null);
  this.sortKeys      = options['sortKeys'] || false;
  this.lineWidth     = options['lineWidth'] || 80;
  this.noRefs        = options['noRefs'] || false;
  this.noCompatMode  = options['noCompatMode'] || false;
  this.condenseFlow  = options['condenseFlow'] || false;

  this.implicitTypes = this.schema.compiledImplicit;
  this.explicitTypes = this.schema.compiledExplicit;

  this.tag = null;
  this.result = '';

  this.duplicates = [];
  this.usedDuplicates = null;
}

// Indents every line in a string. Empty lines (\n only) are not indented.
function indentString(string, spaces) {
  var ind = common.repeat(' ', spaces),
      position = 0,
      next = -1,
      result = '',
      line,
      length = string.length;

  while (position < length) {
    next = string.indexOf('\n', position);
    if (next === -1) {
      line = string.slice(position);
      position = length;
    } else {
      line = string.slice(position, next + 1);
      position = next + 1;
    }

    if (line.length && line !== '\n') result += ind;

    result += line;
  }

  return result;
}

function generateNextLine(state, level) {
  return '\n' + common.repeat(' ', state.indent * level);
}

function testImplicitResolving(state, str) {
  var index, length, type;

  for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {
    type = state.implicitTypes[index];

    if (type.resolve(str)) {
      return true;
    }
  }

  return false;
}

// [33] s-white ::= s-space | s-tab
function isWhitespace(c) {
  return c === CHAR_SPACE || c === CHAR_TAB;
}

// Returns true if the character can be printed without escaping.
// From YAML 1.2: "any allowed characters known to be non-printable
// should also be escaped. [However,] This isnâ€™t mandatory"
// Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029.
function isPrintable(c) {
  return  (0x00020 <= c && c <= 0x00007E)
      || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)
      || ((0x0E000 <= c && c <= 0x00FFFD) && c !== 0xFEFF /* BOM */)
      ||  (0x10000 <= c && c <= 0x10FFFF);
}

// [34] ns-char ::= nb-char - s-white
// [27] nb-char ::= c-printable - b-char - c-byte-order-mark
// [26] b-char  ::= b-line-feed | b-carriage-return
// [24] b-line-feed       ::=     #xA    /* LF */
// [25] b-carriage-return ::=     #xD    /* CR */
// [3]  c-byte-order-mark ::=     #xFEFF
function isNsChar(c) {
  return isPrintable(c) && !isWhitespace(c)
    // byte-order-mark
    && c !== 0xFEFF
    // b-char
    && c !== CHAR_CARRIAGE_RETURN
    && c !== CHAR_LINE_FEED;
}

// Simplified test for values allowed after the first character in plain style.
function isPlainSafe(c, prev) {
  // Uses a subset of nb-char - c-flow-indicator - ":" - "#"
  // where nb-char ::= c-printable - b-char - c-byte-order-mark.
  return isPrintable(c) && c !== 0xFEFF
    // - c-flow-indicator
    && c !== CHAR_COMMA
    && c !== CHAR_LEFT_SQUARE_BRACKET
    && c !== CHAR_RIGHT_SQUARE_BRACKET
    && c !== CHAR_LEFT_CURLY_BRACKET
    && c !== CHAR_RIGHT_CURLY_BRACKET
    // - ":" - "#"
    // /* An ns-char preceding */ "#"
    && c !== CHAR_COLON
    && ((c !== CHAR_SHARP) || (prev && isNsChar(prev)));
}

// Simplified test for values allowed as the first character in plain style.
function isPlainSafeFirst(c) {
  // Uses a subset of ns-char - c-indicator
  // where ns-char = nb-char - s-white.
  return isPrintable(c) && c !== 0xFEFF
    && !isWhitespace(c) // - s-white
    // - (c-indicator ::=
    // â€œ-â€� | â€œ?â€� | â€œ:â€� | â€œ,â€� | â€œ[â€� | â€œ]â€� | â€œ{â€� | â€œ}â€�
    && c !== CHAR_MINUS
    && c !== CHAR_QUESTION
    && c !== CHAR_COLON
    && c !== CHAR_COMMA
    && c !== CHAR_LEFT_SQUARE_BRACKET
    && c !== CHAR_RIGHT_SQUARE_BRACKET
    && c !== CHAR_LEFT_CURLY_BRACKET
    && c !== CHAR_RIGHT_CURLY_BRACKET
    // | â€œ#â€� | â€œ&â€� | â€œ*â€� | â€œ!â€� | â€œ|â€� | â€œ=â€� | â€œ>â€� | â€œ'â€� | â€œ"â€�
    && c !== CHAR_SHARP
    && c !== CHAR_AMPERSAND
    && c !== CHAR_ASTERISK
    && c !== CHAR_EXCLAMATION
    && c !== CHAR_VERTICAL_LINE
    && c !== CHAR_EQUALS
    && c !== CHAR_GREATER_THAN
    && c !== CHAR_SINGLE_QUOTE
    && c !== CHAR_DOUBLE_QUOTE
    // | â€œ%â€� | â€œ@â€� | â€œ`â€�)
    && c !== CHAR_PERCENT
    && c !== CHAR_COMMERCIAL_AT
    && c !== CHAR_GRAVE_ACCENT;
}

// Determines whether block indentation indicator is required.
function needIndentIndicator(string) {
  var leadingSpaceRe = /^\n* /;
  return leadingSpaceRe.test(string);
}

var STYLE_PLAIN   = 1,
    STYLE_SINGLE  = 2,
    STYLE_LITERAL = 3,
    STYLE_FOLDED  = 4,
    STYLE_DOUBLE  = 5;

// Determines which scalar styles are possible and returns the preferred style.
// lineWidth = -1 => no limit.
// Pre-conditions: str.length > 0.
// Post-conditions:
//    STYLE_PLAIN or STYLE_SINGLE => no \n are in the string.
//    STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).
//    STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).
function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) {
  var i;
  var char, prev_char;
  var hasLineBreak = false;
  var hasFoldableLine = false; // only checked if shouldTrackWidth
  var shouldTrackWidth = lineWidth !== -1;
  var previousLineBreak = -1; // count the first line correctly
  var plain = isPlainSafeFirst(string.charCodeAt(0))
          && !isWhitespace(string.charCodeAt(string.length - 1));

  if (singleLineOnly) {
    // Case: no block styles.
    // Check for disallowed characters to rule out plain and single.
    for (i = 0; i < string.length; i++) {
      char = string.charCodeAt(i);
      if (!isPrintable(char)) {
        return STYLE_DOUBLE;
      }
      prev_char = i > 0 ? string.charCodeAt(i - 1) : null;
      plain = plain && isPlainSafe(char, prev_char);
    }
  } else {
    // Case: block styles permitted.
    for (i = 0; i < string.length; i++) {
      char = string.charCodeAt(i);
      if (char === CHAR_LINE_FEED) {
        hasLineBreak = true;
        // Check if any line can be folded.
        if (shouldTrackWidth) {
          hasFoldableLine = hasFoldableLine ||
            // Foldable line = too long, and not more-indented.
            (i - previousLineBreak - 1 > lineWidth &&
             string[previousLineBreak + 1] !== ' ');
          previousLineBreak = i;
        }
      } else if (!isPrintable(char)) {
        return STYLE_DOUBLE;
      }
      prev_char = i > 0 ? string.charCodeAt(i - 1) : null;
      plain = plain && isPlainSafe(char, prev_char);
    }
    // in case the end is missing a \n
    hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&
      (i - previousLineBreak - 1 > lineWidth &&
       string[previousLineBreak + 1] !== ' '));
  }
  // Although every style can represent \n without escaping, prefer block styles
  // for multiline, since they're more readable and they don't add empty lines.
  // Also prefer folding a super-long line.
  if (!hasLineBreak && !hasFoldableLine) {
    // Strings interpretable as another type have to be quoted;
    // e.g. the string 'true' vs. the boolean true.
    return plain && !testAmbiguousType(string)
      ? STYLE_PLAIN : STYLE_SINGLE;
  }
  // Edge case: block indentation indicator can only have one digit.
  if (indentPerLevel > 9 && needIndentIndicator(string)) {
    return STYLE_DOUBLE;
  }
  // At this point we know block styles are valid.
  // Prefer literal style unless we want to fold.
  return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;
}

// Note: line breaking/folding is implemented for only the folded style.
// NB. We drop the last trailing newline (if any) of a returned block scalar
//  since the dumper adds its own newline. This always works:
//    â€¢ No ending newline => unaffected; already using strip "-" chomping.
//    â€¢ Ending newline    => removed then restored.
//  Importantly, this keeps the "+" chomp indicator from gaining an extra line.
function writeScalar(state, string, level, iskey) {
  state.dump = (function () {
    if (string.length === 0) {
      return "''";
    }
    if (!state.noCompatMode &&
        DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) {
      return "'" + string + "'";
    }

    var indent = state.indent * Math.max(1, level); // no 0-indent scalars
    // As indentation gets deeper, let the width decrease monotonically
    // to the lower bound min(state.lineWidth, 40).
    // Note that this implies
    //  state.lineWidth â‰¤ 40 + state.indent: width is fixed at the lower bound.
    //  state.lineWidth > 40 + state.indent: width decreases until the lower bound.
    // This behaves better than a constant minimum width which disallows narrower options,
    // or an indent threshold which causes the width to suddenly increase.
    var lineWidth = state.lineWidth === -1
      ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);

    // Without knowing if keys are implicit/explicit, assume implicit for safety.
    var singleLineOnly = iskey
      // No block styles in flow mode.
      || (state.flowLevel > -1 && level >= state.flowLevel);
    function testAmbiguity(string) {
      return testImplicitResolving(state, string);
    }

    switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) {
      case STYLE_PLAIN:
        return string;
      case STYLE_SINGLE:
        return "'" + string.replace(/'/g, "''") + "'";
      case STYLE_LITERAL:
        return '|' + blockHeader(string, state.indent)
          + dropEndingNewline(indentString(string, indent));
      case STYLE_FOLDED:
        return '>' + blockHeader(string, state.indent)
          + dropEndingNewline(indentString(foldString(string, lineWidth), indent));
      case STYLE_DOUBLE:
        return '"' + escapeString(string, lineWidth) + '"';
      default:
        throw new YAMLException('impossible error: invalid scalar style');
    }
  }());
}

// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.
function blockHeader(string, indentPerLevel) {
  var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';

  // note the special case: the string '\n' counts as a "trailing" empty line.
  var clip =          string[string.length - 1] === '\n';
  var keep = clip && (string[string.length - 2] === '\n' || string === '\n');
  var chomp = keep ? '+' : (clip ? '' : '-');

  return indentIndicator + chomp + '\n';
}

// (See the note for writeScalar.)
function dropEndingNewline(string) {
  return string[string.length - 1] === '\n' ? string.slice(0, -1) : string;
}

// Note: a long line without a suitable break point will exceed the width limit.
// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.
function foldString(string, width) {
  // In folded style, $k$ consecutive newlines output as $k+1$ newlinesâ€”
  // unless they're before or after a more-indented line, or at the very
  // beginning or end, in which case $k$ maps to $k$.
  // Therefore, parse each chunk as newline(s) followed by a content line.
  var lineRe = /(\n+)([^\n]*)/g;

  // first line (possibly an empty line)
  var result = (function () {
    var nextLF = string.indexOf('\n');
    nextLF = nextLF !== -1 ? nextLF : string.length;
    lineRe.lastIndex = nextLF;
    return foldLine(string.slice(0, nextLF), width);
  }());
  // If we haven't reached the first content line yet, don't add an extra \n.
  var prevMoreIndented = string[0] === '\n' || string[0] === ' ';
  var moreIndented;

  // rest of the lines
  var match;
  while ((match = lineRe.exec(string))) {
    var prefix = match[1], line = match[2];
    moreIndented = (line[0] === ' ');
    result += prefix
      + (!prevMoreIndented && !moreIndented && line !== ''
        ? '\n' : '')
      + foldLine(line, width);
    prevMoreIndented = moreIndented;
  }

  return result;
}

// Greedy line breaking.
// Picks the longest line under the limit each time,
// otherwise settles for the shortest line over the limit.
// NB. More-indented lines *cannot* be folded, as that would add an extra \n.
function foldLine(line, width) {
  if (line === '' || line[0] === ' ') return line;

  // Since a more-indented line adds a \n, breaks can't be followed by a space.
  var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.
  var match;
  // start is an inclusive index. end, curr, and next are exclusive.
  var start = 0, end, curr = 0, next = 0;
  var result = '';

  // Invariants: 0 <= start <= length-1.
  //   0 <= curr <= next <= max(0, length-2). curr - start <= width.
  // Inside the loop:
  //   A match implies length >= 2, so curr and next are <= length-2.
  while ((match = breakRe.exec(line))) {
    next = match.index;
    // maintain invariant: curr - start <= width
    if (next - start > width) {
      end = (curr > start) ? curr : next; // derive end <= length-2
      result += '\n' + line.slice(start, end);
      // skip the space that was output as \n
      start = end + 1;                    // derive start <= length-1
    }
    curr = next;
  }

  // By the invariants, start <= length-1, so there is something left over.
  // It is either the whole string or a part starting from non-whitespace.
  result += '\n';
  // Insert a break if the remainder is too long and there is a break available.
  if (line.length - start > width && curr > start) {
    result += line.slice(start, curr) + '\n' + line.slice(curr + 1);
  } else {
    result += line.slice(start);
  }

  return result.slice(1); // drop extra \n joiner
}

// Escapes a double-quoted string.
function escapeString(string) {
  var result = '';
  var char, nextChar;
  var escapeSeq;

  for (var i = 0; i < string.length; i++) {
    char = string.charCodeAt(i);
    // Check for surrogate pairs (reference Unicode 3.0 section "3.7 Surrogates").
    if (char >= 0xD800 && char <= 0xDBFF/* high surrogate */) {
      nextChar = string.charCodeAt(i + 1);
      if (nextChar >= 0xDC00 && nextChar <= 0xDFFF/* low surrogate */) {
        // Combine the surrogate pair and store it escaped.
        result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000);
        // Advance index one extra since we already used that char here.
        i++; continue;
      }
    }
    escapeSeq = ESCAPE_SEQUENCES[char];
    result += !escapeSeq && isPrintable(char)
      ? string[i]
      : escapeSeq || encodeHex(char);
  }

  return result;
}

function writeFlowSequence(state, level, object) {
  var _result = '',
      _tag    = state.tag,
      index,
      length;

  for (index = 0, length = object.length; index < length; index += 1) {
    // Write only valid elements.
    if (writeNode(state, level, object[index], false, false)) {
      if (index !== 0) _result += ',' + (!state.condenseFlow ? ' ' : '');
      _result += state.dump;
    }
  }

  state.tag = _tag;
  state.dump = '[' + _result + ']';
}

function writeBlockSequence(state, level, object, compact) {
  var _result = '',
      _tag    = state.tag,
      index,
      length;

  for (index = 0, length = object.length; index < length; index += 1) {
    // Write only valid elements.
    if (writeNode(state, level + 1, object[index], true, true)) {
      if (!compact || index !== 0) {
        _result += generateNextLine(state, level);
      }

      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
        _result += '-';
      } else {
        _result += '- ';
      }

      _result += state.dump;
    }
  }

  state.tag = _tag;
  state.dump = _result || '[]'; // Empty sequence if no valid values.
}

function writeFlowMapping(state, level, object) {
  var _result       = '',
      _tag          = state.tag,
      objectKeyList = Object.keys(object),
      index,
      length,
      objectKey,
      objectValue,
      pairBuffer;

  for (index = 0, length = objectKeyList.length; index < length; index += 1) {

    pairBuffer = '';
    if (index !== 0) pairBuffer += ', ';

    if (state.condenseFlow) pairBuffer += '"';

    objectKey = objectKeyList[index];
    objectValue = object[objectKey];

    if (!writeNode(state, level, objectKey, false, false)) {
      continue; // Skip this pair because of invalid key;
    }

    if (state.dump.length > 1024) pairBuffer += '? ';

    pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' ');

    if (!writeNode(state, level, objectValue, false, false)) {
      continue; // Skip this pair because of invalid value.
    }

    pairBuffer += state.dump;

    // Both key and value are valid.
    _result += pairBuffer;
  }

  state.tag = _tag;
  state.dump = '{' + _result + '}';
}

function writeBlockMapping(state, level, object, compact) {
  var _result       = '',
      _tag          = state.tag,
      objectKeyList = Object.keys(object),
      index,
      length,
      objectKey,
      objectValue,
      explicitPair,
      pairBuffer;

  // Allow sorting keys so that the output file is deterministic
  if (state.sortKeys === true) {
    // Default sorting
    objectKeyList.sort();
  } else if (typeof state.sortKeys === 'function') {
    // Custom sort function
    objectKeyList.sort(state.sortKeys);
  } else if (state.sortKeys) {
    // Something is wrong
    throw new YAMLException('sortKeys must be a boolean or a function');
  }

  for (index = 0, length = objectKeyList.length; index < length; index += 1) {
    pairBuffer = '';

    if (!compact || index !== 0) {
      pairBuffer += generateNextLine(state, level);
    }

    objectKey = objectKeyList[index];
    objectValue = object[objectKey];

    if (!writeNode(state, level + 1, objectKey, true, true, true)) {
      continue; // Skip this pair because of invalid key.
    }

    explicitPair = (state.tag !== null && state.tag !== '?') ||
                   (state.dump && state.dump.length > 1024);

    if (explicitPair) {
      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
        pairBuffer += '?';
      } else {
        pairBuffer += '? ';
      }
    }

    pairBuffer += state.dump;

    if (explicitPair) {
      pairBuffer += generateNextLine(state, level);
    }

    if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {
      continue; // Skip this pair because of invalid value.
    }

    if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
      pairBuffer += ':';
    } else {
      pairBuffer += ': ';
    }

    pairBuffer += state.dump;

    // Both key and value are valid.
    _result += pairBuffer;
  }

  state.tag = _tag;
  state.dump = _result || '{}'; // Empty mapping if no valid pairs.
}

function detectType(state, object, explicit) {
  var _result, typeList, index, length, type, style;

  typeList = explicit ? state.explicitTypes : state.implicitTypes;

  for (index = 0, length = typeList.length; index < length; index += 1) {
    type = typeList[index];

    if ((type.instanceOf  || type.predicate) &&
        (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&
        (!type.predicate  || type.predicate(object))) {

      state.tag = explicit ? type.tag : '?';

      if (type.represent) {
        style = state.styleMap[type.tag] || type.defaultStyle;

        if (_toString.call(type.represent) === '[object Function]') {
          _result = type.represent(object, style);
        } else if (_hasOwnProperty.call(type.represent, style)) {
          _result = type.represent[style](object, style);
        } else {
          throw new YAMLException('!<' + type.tag + '> tag resolver accepts not "' + style + '" style');
        }

        state.dump = _result;
      }

      return true;
    }
  }

  return false;
}

// Serializes `object` and writes it to global `result`.
// Returns true on success, or false on invalid object.
//
function writeNode(state, level, object, block, compact, iskey) {
  state.tag = null;
  state.dump = object;

  if (!detectType(state, object, false)) {
    detectType(state, object, true);
  }

  var type = _toString.call(state.dump);

  if (block) {
    block = (state.flowLevel < 0 || state.flowLevel > level);
  }

  var objectOrArray = type === '[object Object]' || type === '[object Array]',
      duplicateIndex,
      duplicate;

  if (objectOrArray) {
    duplicateIndex = state.duplicates.indexOf(object);
    duplicate = duplicateIndex !== -1;
  }

  if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {
    compact = false;
  }

  if (duplicate && state.usedDuplicates[duplicateIndex]) {
    state.dump = '*ref_' + duplicateIndex;
  } else {
    if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {
      state.usedDuplicates[duplicateIndex] = true;
    }
    if (type === '[object Object]') {
      if (block && (Object.keys(state.dump).length !== 0)) {
        writeBlockMapping(state, level, state.dump, compact);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + state.dump;
        }
      } else {
        writeFlowMapping(state, level, state.dump);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
        }
      }
    } else if (type === '[object Array]') {
      var arrayLevel = (state.noArrayIndent && (level > 0)) ? level - 1 : level;
      if (block && (state.dump.length !== 0)) {
        writeBlockSequence(state, arrayLevel, state.dump, compact);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + state.dump;
        }
      } else {
        writeFlowSequence(state, arrayLevel, state.dump);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
        }
      }
    } else if (type === '[object String]') {
      if (state.tag !== '?') {
        writeScalar(state, state.dump, level, iskey);
      }
    } else {
      if (state.skipInvalid) return false;
      throw new YAMLException('unacceptable kind of an object to dump ' + type);
    }

    if (state.tag !== null && state.tag !== '?') {
      state.dump = '!<' + state.tag + '> ' + state.dump;
    }
  }

  return true;
}

function getDuplicateReferences(object, state) {
  var objects = [],
      duplicatesIndexes = [],
      index,
      length;

  inspectNode(object, objects, duplicatesIndexes);

  for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {
    state.duplicates.push(objects[duplicatesIndexes[index]]);
  }
  state.usedDuplicates = new Array(length);
}

function inspectNode(object, objects, duplicatesIndexes) {
  var objectKeyList,
      index,
      length;

  if (object !== null && typeof object === 'object') {
    index = objects.indexOf(object);
    if (index !== -1) {
      if (duplicatesIndexes.indexOf(index) === -1) {
        duplicatesIndexes.push(index);
      }
    } else {
      objects.push(object);

      if (Array.isArray(object)) {
        for (index = 0, length = object.length; index < length; index += 1) {
          inspectNode(object[index], objects, duplicatesIndexes);
        }
      } else {
        objectKeyList = Object.keys(object);

        for (index = 0, length = objectKeyList.length; index < length; index += 1) {
          inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);
        }
      }
    }
  }
}

function dump(input, options) {
  options = options || {};

  var state = new State(options);

  if (!state.noRefs) getDuplicateReferences(input, state);

  if (writeNode(state, 0, input, true, true)) return state.dump + '\n';

  return '';
}

function safeDump(input, options) {
  return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
}

module.exports.dump     = dump;
module.exports.safeDump = safeDump;
// YAML error class. http://stackoverflow.com/questions/8458984
//
'use strict';

function YAMLException(reason, mark) {
  // Super constructor
  Error.call(this);

  this.name = 'YAMLException';
  this.reason = reason;
  this.mark = mark;
  this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : '');

  // Include stack trace in error object
  if (Error.captureStackTrace) {
    // Chrome and NodeJS
    Error.captureStackTrace(this, this.constructor);
  } else {
    // FF, IE 10+ and Safari 6+. Fallback for others
    this.stack = (new Error()).stack || '';
  }
}


// Inherit from Error
YAMLException.prototype = Object.create(Error.prototype);
YAMLException.prototype.constructor = YAMLException;


YAMLException.prototype.toString = function toString(compact) {
  var result = this.name + ': ';

  result += this.reason || '(unknown reason)';

  if (!compact && this.mark) {
    result += ' ' + this.mark.toString();
  }

  return result;
};


module.exports = YAMLException;
'use strict';

/*eslint-disable max-len,no-use-before-define*/

var common              = require('./common');
var YAMLException       = require('./exception');
var Mark                = require('./mark');
var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe');
var DEFAULT_FULL_SCHEMA = require('./schema/default_full');


var _hasOwnProperty = Object.prototype.hasOwnProperty;


var CONTEXT_FLOW_IN   = 1;
var CONTEXT_FLOW_OUT  = 2;
var CONTEXT_BLOCK_IN  = 3;
var CONTEXT_BLOCK_OUT = 4;


var CHOMPING_CLIP  = 1;
var CHOMPING_STRIP = 2;
var CHOMPING_KEEP  = 3;


var PATTERN_NON_PRINTABLE         = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/;
var PATTERN_FLOW_INDICATORS       = /[,\[\]\{\}]/;
var PATTERN_TAG_HANDLE            = /^(?:!|!!|![a-z\-]+!)$/i;
var PATTERN_TAG_URI               = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;


function _class(obj) { return Object.prototype.toString.call(obj); }

function is_EOL(c) {
  return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);
}

function is_WHITE_SPACE(c) {
  return (c === 0x09/* Tab */) || (c === 0x20/* Space */);
}

function is_WS_OR_EOL(c) {
  return (c === 0x09/* Tab */) ||
         (c === 0x20/* Space */) ||
         (c === 0x0A/* LF */) ||
         (c === 0x0D/* CR */);
}

function is_FLOW_INDICATOR(c) {
  return c === 0x2C/* , */ ||
         c === 0x5B/* [ */ ||
         c === 0x5D/* ] */ ||
         c === 0x7B/* { */ ||
         c === 0x7D/* } */;
}

function fromHexCode(c) {
  var lc;

  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
    return c - 0x30;
  }

  /*eslint-disable no-bitwise*/
  lc = c | 0x20;

  if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {
    return lc - 0x61 + 10;
  }

  return -1;
}

function escapedHexLen(c) {
  if (c === 0x78/* x */) { return 2; }
  if (c === 0x75/* u */) { return 4; }
  if (c === 0x55/* U */) { return 8; }
  return 0;
}

function fromDecimalCode(c) {
  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
    return c - 0x30;
  }

  return -1;
}

function simpleEscapeSequence(c) {
  /* eslint-disable indent */
  return (c === 0x30/* 0 */) ? '\x00' :
        (c === 0x61/* a */) ? '\x07' :
        (c === 0x62/* b */) ? '\x08' :
        (c === 0x74/* t */) ? '\x09' :
        (c === 0x09/* Tab */) ? '\x09' :
        (c === 0x6E/* n */) ? '\x0A' :
        (c === 0x76/* v */) ? '\x0B' :
        (c === 0x66/* f */) ? '\x0C' :
        (c === 0x72/* r */) ? '\x0D' :
        (c === 0x65/* e */) ? '\x1B' :
        (c === 0x20/* Space */) ? ' ' :
        (c === 0x22/* " */) ? '\x22' :
        (c === 0x2F/* / */) ? '/' :
        (c === 0x5C/* \ */) ? '\x5C' :
        (c === 0x4E/* N */) ? '\x85' :
        (c === 0x5F/* _ */) ? '\xA0' :
        (c === 0x4C/* L */) ? '\u2028' :
        (c === 0x50/* P */) ? '\u2029' : '';
}

function charFromCodepoint(c) {
  if (c <= 0xFFFF) {
    return String.fromCharCode(c);
  }
  // Encode UTF-16 surrogate pair
  // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF
  return String.fromCharCode(
    ((c - 0x010000) >> 10) + 0xD800,
    ((c - 0x010000) & 0x03FF) + 0xDC00
  );
}

var simpleEscapeCheck = new Array(256); // integer, for fast access
var simpleEscapeMap = new Array(256);
for (var i = 0; i < 256; i++) {
  simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;
  simpleEscapeMap[i] = simpleEscapeSequence(i);
}


function State(input, options) {
  this.input = input;

  this.filename  = options['filename']  || null;
  this.schema    = options['schema']    || DEFAULT_FULL_SCHEMA;
  this.onWarning = options['onWarning'] || null;
  this.legacy    = options['legacy']    || false;
  this.json      = options['json']      || false;
  this.listener  = options['listener']  || null;

  this.implicitTypes = this.schema.compiledImplicit;
  this.typeMap       = this.schema.compiledTypeMap;

  this.length     = input.length;
  this.position   = 0;
  this.line       = 0;
  this.lineStart  = 0;
  this.lineIndent = 0;

  this.documents = [];

  /*
  this.version;
  this.checkLineBreaks;
  this.tagMap;
  this.anchorMap;
  this.tag;
  this.anchor;
  this.kind;
  this.result;*/

}


function generateError(state, message) {
  return new YAMLException(
    message,
    new Mark(state.filename, state.input, state.position, state.line, (state.position - state.lineStart)));
}

function throwError(state, message) {
  throw generateError(state, message);
}

function throwWarning(state, message) {
  if (state.onWarning) {
    state.onWarning.call(null, generateError(state, message));
  }
}


var directiveHandlers = {

  YAML: function handleYamlDirective(state, name, args) {

    var match, major, minor;

    if (state.version !== null) {
      throwError(state, 'duplication of %YAML directive');
    }

    if (args.length !== 1) {
      throwError(state, 'YAML directive accepts exactly one argument');
    }

    match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]);

    if (match === null) {
      throwError(state, 'ill-formed argument of the YAML directive');
    }

    major = parseInt(match[1], 10);
    minor = parseInt(match[2], 10);

    if (major !== 1) {
      throwError(state, 'unacceptable YAML version of the document');
    }

    state.version = args[0];
    state.checkLineBreaks = (minor < 2);

    if (minor !== 1 && minor !== 2) {
      throwWarning(state, 'unsupported YAML version of the document');
    }
  },

  TAG: function handleTagDirective(state, name, args) {

    var handle, prefix;

    if (args.length !== 2) {
      throwError(state, 'TAG directive accepts exactly two arguments');
    }

    handle = args[0];
    prefix = args[1];

    if (!PATTERN_TAG_HANDLE.test(handle)) {
      throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');
    }

    if (_hasOwnProperty.call(state.tagMap, handle)) {
      throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle');
    }

    if (!PATTERN_TAG_URI.test(prefix)) {
      throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');
    }

    state.tagMap[handle] = prefix;
  }
};


function captureSegment(state, start, end, checkJson) {
  var _position, _length, _character, _result;

  if (start < end) {
    _result = state.input.slice(start, end);

    if (checkJson) {
      for (_position = 0, _length = _result.length; _position < _length; _position += 1) {
        _character = _result.charCodeAt(_position);
        if (!(_character === 0x09 ||
              (0x20 <= _character && _character <= 0x10FFFF))) {
          throwError(state, 'expected valid JSON character');
        }
      }
    } else if (PATTERN_NON_PRINTABLE.test(_result)) {
      throwError(state, 'the stream contains non-printable characters');
    }

    state.result += _result;
  }
}

function mergeMappings(state, destination, source, overridableKeys) {
  var sourceKeys, key, index, quantity;

  if (!common.isObject(source)) {
    throwError(state, 'cannot merge mappings; the provided source object is unacceptable');
  }

  sourceKeys = Object.keys(source);

  for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {
    key = sourceKeys[index];

    if (!_hasOwnProperty.call(destination, key)) {
      destination[key] = source[key];
      overridableKeys[key] = true;
    }
  }
}

function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) {
  var index, quantity;

  // The output is a plain object here, so keys can only be strings.
  // We need to convert keyNode to a string, but doing so can hang the process
  // (deeply nested arrays that explode exponentially using aliases).
  if (Array.isArray(keyNode)) {
    keyNode = Array.prototype.slice.call(keyNode);

    for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {
      if (Array.isArray(keyNode[index])) {
        throwError(state, 'nested arrays are not supported inside keys');
      }

      if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {
        keyNode[index] = '[object Object]';
      }
    }
  }

  // Avoid code execution in load() via toString property
  // (still use its own toString for arrays, timestamps,
  // and whatever user schema extensions happen to have @@toStringTag)
  if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {
    keyNode = '[object Object]';
  }


  keyNode = String(keyNode);

  if (_result === null) {
    _result = {};
  }

  if (keyTag === 'tag:yaml.org,2002:merge') {
    if (Array.isArray(valueNode)) {
      for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {
        mergeMappings(state, _result, valueNode[index], overridableKeys);
      }
    } else {
      mergeMappings(state, _result, valueNode, overridableKeys);
    }
  } else {
    if (!state.json &&
        !_hasOwnProperty.call(overridableKeys, keyNode) &&
        _hasOwnProperty.call(_result, keyNode)) {
      state.line = startLine || state.line;
      state.position = startPos || state.position;
      throwError(state, 'duplicated mapping key');
    }
    _result[keyNode] = valueNode;
    delete overridableKeys[keyNode];
  }

  return _result;
}

function readLineBreak(state) {
  var ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x0A/* LF */) {
    state.position++;
  } else if (ch === 0x0D/* CR */) {
    state.position++;
    if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {
      state.position++;
    }
  } else {
    throwError(state, 'a line break is expected');
  }

  state.line += 1;
  state.lineStart = state.position;
}

function skipSeparationSpace(state, allowComments, checkIndent) {
  var lineBreaks = 0,
      ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    while (is_WHITE_SPACE(ch)) {
      ch = state.input.charCodeAt(++state.position);
    }

    if (allowComments && ch === 0x23/* # */) {
      do {
        ch = state.input.charCodeAt(++state.position);
      } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);
    }

    if (is_EOL(ch)) {
      readLineBreak(state);

      ch = state.input.charCodeAt(state.position);
      lineBreaks++;
      state.lineIndent = 0;

      while (ch === 0x20/* Space */) {
        state.lineIndent++;
        ch = state.input.charCodeAt(++state.position);
      }
    } else {
      break;
    }
  }

  if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {
    throwWarning(state, 'deficient indentation');
  }

  return lineBreaks;
}

function testDocumentSeparator(state) {
  var _position = state.position,
      ch;

  ch = state.input.charCodeAt(_position);

  // Condition state.position === state.lineStart is tested
  // in parent on each call, for efficiency. No needs to test here again.
  if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&
      ch === state.input.charCodeAt(_position + 1) &&
      ch === state.input.charCodeAt(_position + 2)) {

    _position += 3;

    ch = state.input.charCodeAt(_position);

    if (ch === 0 || is_WS_OR_EOL(ch)) {
      return true;
    }
  }

  return false;
}

function writeFoldedLines(state, count) {
  if (count === 1) {
    state.result += ' ';
  } else if (count > 1) {
    state.result += common.repeat('\n', count - 1);
  }
}


function readPlainScalar(state, nodeIndent, withinFlowCollection) {
  var preceding,
      following,
      captureStart,
      captureEnd,
      hasPendingContent,
      _line,
      _lineStart,
      _lineIndent,
      _kind = state.kind,
      _result = state.result,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (is_WS_OR_EOL(ch)      ||
      is_FLOW_INDICATOR(ch) ||
      ch === 0x23/* # */    ||
      ch === 0x26/* & */    ||
      ch === 0x2A/* * */    ||
      ch === 0x21/* ! */    ||
      ch === 0x7C/* | */    ||
      ch === 0x3E/* > */    ||
      ch === 0x27/* ' */    ||
      ch === 0x22/* " */    ||
      ch === 0x25/* % */    ||
      ch === 0x40/* @ */    ||
      ch === 0x60/* ` */) {
    return false;
  }

  if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {
    following = state.input.charCodeAt(state.position + 1);

    if (is_WS_OR_EOL(following) ||
        withinFlowCollection && is_FLOW_INDICATOR(following)) {
      return false;
    }
  }

  state.kind = 'scalar';
  state.result = '';
  captureStart = captureEnd = state.position;
  hasPendingContent = false;

  while (ch !== 0) {
    if (ch === 0x3A/* : */) {
      following = state.input.charCodeAt(state.position + 1);

      if (is_WS_OR_EOL(following) ||
          withinFlowCollection && is_FLOW_INDICATOR(following)) {
        break;
      }

    } else if (ch === 0x23/* # */) {
      preceding = state.input.charCodeAt(state.position - 1);

      if (is_WS_OR_EOL(preceding)) {
        break;
      }

    } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||
               withinFlowCollection && is_FLOW_INDICATOR(ch)) {
      break;

    } else if (is_EOL(ch)) {
      _line = state.line;
      _lineStart = state.lineStart;
      _lineIndent = state.lineIndent;
      skipSeparationSpace(state, false, -1);

      if (state.lineIndent >= nodeIndent) {
        hasPendingContent = true;
        ch = state.input.charCodeAt(state.position);
        continue;
      } else {
        state.position = captureEnd;
        state.line = _line;
        state.lineStart = _lineStart;
        state.lineIndent = _lineIndent;
        break;
      }
    }

    if (hasPendingContent) {
      captureSegment(state, captureStart, captureEnd, false);
      writeFoldedLines(state, state.line - _line);
      captureStart = captureEnd = state.position;
      hasPendingContent = false;
    }

    if (!is_WHITE_SPACE(ch)) {
      captureEnd = state.position + 1;
    }

    ch = state.input.charCodeAt(++state.position);
  }

  captureSegment(state, captureStart, captureEnd, false);

  if (state.result) {
    return true;
  }

  state.kind = _kind;
  state.result = _result;
  return false;
}

function readSingleQuotedScalar(state, nodeIndent) {
  var ch,
      captureStart, captureEnd;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x27/* ' */) {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';
  state.position++;
  captureStart = captureEnd = state.position;

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    if (ch === 0x27/* ' */) {
      captureSegment(state, captureStart, state.position, true);
      ch = state.input.charCodeAt(++state.position);

      if (ch === 0x27/* ' */) {
        captureStart = state.position;
        state.position++;
        captureEnd = state.position;
      } else {
        return true;
      }

    } else if (is_EOL(ch)) {
      captureSegment(state, captureStart, captureEnd, true);
      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
      captureStart = captureEnd = state.position;

    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
      throwError(state, 'unexpected end of the document within a single quoted scalar');

    } else {
      state.position++;
      captureEnd = state.position;
    }
  }

  throwError(state, 'unexpected end of the stream within a single quoted scalar');
}

function readDoubleQuotedScalar(state, nodeIndent) {
  var captureStart,
      captureEnd,
      hexLength,
      hexResult,
      tmp,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x22/* " */) {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';
  state.position++;
  captureStart = captureEnd = state.position;

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    if (ch === 0x22/* " */) {
      captureSegment(state, captureStart, state.position, true);
      state.position++;
      return true;

    } else if (ch === 0x5C/* \ */) {
      captureSegment(state, captureStart, state.position, true);
      ch = state.input.charCodeAt(++state.position);

      if (is_EOL(ch)) {
        skipSeparationSpace(state, false, nodeIndent);

        // TODO: rework to inline fn with no type cast?
      } else if (ch < 256 && simpleEscapeCheck[ch]) {
        state.result += simpleEscapeMap[ch];
        state.position++;

      } else if ((tmp = escapedHexLen(ch)) > 0) {
        hexLength = tmp;
        hexResult = 0;

        for (; hexLength > 0; hexLength--) {
          ch = state.input.charCodeAt(++state.position);

          if ((tmp = fromHexCode(ch)) >= 0) {
            hexResult = (hexResult << 4) + tmp;

          } else {
            throwError(state, 'expected hexadecimal character');
          }
        }

        state.result += charFromCodepoint(hexResult);

        state.position++;

      } else {
        throwError(state, 'unknown escape sequence');
      }

      captureStart = captureEnd = state.position;

    } else if (is_EOL(ch)) {
      captureSegment(state, captureStart, captureEnd, true);
      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
      captureStart = captureEnd = state.position;

    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
      throwError(state, 'unexpected end of the document within a double quoted scalar');

    } else {
      state.position++;
      captureEnd = state.position;
    }
  }

  throwError(state, 'unexpected end of the stream within a double quoted scalar');
}

function readFlowCollection(state, nodeIndent) {
  var readNext = true,
      _line,
      _tag     = state.tag,
      _result,
      _anchor  = state.anchor,
      following,
      terminator,
      isPair,
      isExplicitPair,
      isMapping,
      overridableKeys = {},
      keyNode,
      keyTag,
      valueNode,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x5B/* [ */) {
    terminator = 0x5D;/* ] */
    isMapping = false;
    _result = [];
  } else if (ch === 0x7B/* { */) {
    terminator = 0x7D;/* } */
    isMapping = true;
    _result = {};
  } else {
    return false;
  }

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(++state.position);

  while (ch !== 0) {
    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if (ch === terminator) {
      state.position++;
      state.tag = _tag;
      state.anchor = _anchor;
      state.kind = isMapping ? 'mapping' : 'sequence';
      state.result = _result;
      return true;
    } else if (!readNext) {
      throwError(state, 'missed comma between flow collection entries');
    }

    keyTag = keyNode = valueNode = null;
    isPair = isExplicitPair = false;

    if (ch === 0x3F/* ? */) {
      following = state.input.charCodeAt(state.position + 1);

      if (is_WS_OR_EOL(following)) {
        isPair = isExplicitPair = true;
        state.position++;
        skipSeparationSpace(state, true, nodeIndent);
      }
    }

    _line = state.line;
    composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
    keyTag = state.tag;
    keyNode = state.result;
    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {
      isPair = true;
      ch = state.input.charCodeAt(++state.position);
      skipSeparationSpace(state, true, nodeIndent);
      composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
      valueNode = state.result;
    }

    if (isMapping) {
      storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode);
    } else if (isPair) {
      _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode));
    } else {
      _result.push(keyNode);
    }

    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if (ch === 0x2C/* , */) {
      readNext = true;
      ch = state.input.charCodeAt(++state.position);
    } else {
      readNext = false;
    }
  }

  throwError(state, 'unexpected end of the stream within a flow collection');
}

function readBlockScalar(state, nodeIndent) {
  var captureStart,
      folding,
      chomping       = CHOMPING_CLIP,
      didReadContent = false,
      detectedIndent = false,
      textIndent     = nodeIndent,
      emptyLines     = 0,
      atMoreIndented = false,
      tmp,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x7C/* | */) {
    folding = false;
  } else if (ch === 0x3E/* > */) {
    folding = true;
  } else {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';

  while (ch !== 0) {
    ch = state.input.charCodeAt(++state.position);

    if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {
      if (CHOMPING_CLIP === chomping) {
        chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;
      } else {
        throwError(state, 'repeat of a chomping mode identifier');
      }

    } else if ((tmp = fromDecimalCode(ch)) >= 0) {
      if (tmp === 0) {
        throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');
      } else if (!detectedIndent) {
        textIndent = nodeIndent + tmp - 1;
        detectedIndent = true;
      } else {
        throwError(state, 'repeat of an indentation width identifier');
      }

    } else {
      break;
    }
  }

  if (is_WHITE_SPACE(ch)) {
    do { ch = state.input.charCodeAt(++state.position); }
    while (is_WHITE_SPACE(ch));

    if (ch === 0x23/* # */) {
      do { ch = state.input.charCodeAt(++state.position); }
      while (!is_EOL(ch) && (ch !== 0));
    }
  }

  while (ch !== 0) {
    readLineBreak(state);
    state.lineIndent = 0;

    ch = state.input.charCodeAt(state.position);

    while ((!detectedIndent || state.lineIndent < textIndent) &&
           (ch === 0x20/* Space */)) {
      state.lineIndent++;
      ch = state.input.charCodeAt(++state.position);
    }

    if (!detectedIndent && state.lineIndent > textIndent) {
      textIndent = state.lineIndent;
    }

    if (is_EOL(ch)) {
      emptyLines++;
      continue;
    }

    // End of the scalar.
    if (state.lineIndent < textIndent) {

      // Perform the chomping.
      if (chomping === CHOMPING_KEEP) {
        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
      } else if (chomping === CHOMPING_CLIP) {
        if (didReadContent) { // i.e. only if the scalar is not empty.
          state.result += '\n';
        }
      }

      // Break this `while` cycle and go to the funciton's epilogue.
      break;
    }

    // Folded style: use fancy rules to handle line breaks.
    if (folding) {

      // Lines starting with white space characters (more-indented lines) are not folded.
      if (is_WHITE_SPACE(ch)) {
        atMoreIndented = true;
        // except for the first content line (cf. Example 8.1)
        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);

      // End of more-indented block.
      } else if (atMoreIndented) {
        atMoreIndented = false;
        state.result += common.repeat('\n', emptyLines + 1);

      // Just one line break - perceive as the same line.
      } else if (emptyLines === 0) {
        if (didReadContent) { // i.e. only if we have already read some scalar content.
          state.result += ' ';
        }

      // Several line breaks - perceive as different lines.
      } else {
        state.result += common.repeat('\n', emptyLines);
      }

    // Literal style: just add exact number of line breaks between content lines.
    } else {
      // Keep all line breaks except the header line break.
      state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
    }

    didReadContent = true;
    detectedIndent = true;
    emptyLines = 0;
    captureStart = state.position;

    while (!is_EOL(ch) && (ch !== 0)) {
      ch = state.input.charCodeAt(++state.position);
    }

    captureSegment(state, captureStart, state.position, false);
  }

  return true;
}

function readBlockSequence(state, nodeIndent) {
  var _line,
      _tag      = state.tag,
      _anchor   = state.anchor,
      _result   = [],
      following,
      detected  = false,
      ch;

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {

    if (ch !== 0x2D/* - */) {
      break;
    }

    following = state.input.charCodeAt(state.position + 1);

    if (!is_WS_OR_EOL(following)) {
      break;
    }

    detected = true;
    state.position++;

    if (skipSeparationSpace(state, true, -1)) {
      if (state.lineIndent <= nodeIndent) {
        _result.push(null);
        ch = state.input.charCodeAt(state.position);
        continue;
      }
    }

    _line = state.line;
    composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);
    _result.push(state.result);
    skipSeparationSpace(state, true, -1);

    ch = state.input.charCodeAt(state.position);

    if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {
      throwError(state, 'bad indentation of a sequence entry');
    } else if (state.lineIndent < nodeIndent) {
      break;
    }
  }

  if (detected) {
    state.tag = _tag;
    state.anchor = _anchor;
    state.kind = 'sequence';
    state.result = _result;
    return true;
  }
  return false;
}

function readBlockMapping(state, nodeIndent, flowIndent) {
  var following,
      allowCompact,
      _line,
      _pos,
      _tag          = state.tag,
      _anchor       = state.anchor,
      _result       = {},
      overridableKeys = {},
      keyTag        = null,
      keyNode       = null,
      valueNode     = null,
      atExplicitKey = false,
      detected      = false,
      ch;

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    following = state.input.charCodeAt(state.position + 1);
    _line = state.line; // Save the current line.
    _pos = state.position;

    //
    // Explicit notation case. There are two separate blocks:
    // first for the key (denoted by "?") and second for the value (denoted by ":")
    //
    if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {

      if (ch === 0x3F/* ? */) {
        if (atExplicitKey) {
          storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
          keyTag = keyNode = valueNode = null;
        }

        detected = true;
        atExplicitKey = true;
        allowCompact = true;

      } else if (atExplicitKey) {
        // i.e. 0x3A/* : */ === character after the explicit key.
        atExplicitKey = false;
        allowCompact = true;

      } else {
        throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');
      }

      state.position += 1;
      ch = following;

    //
    // Implicit notation case. Flow-style node as the key first, then ":", and the value.
    //
    } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {

      if (state.line === _line) {
        ch = state.input.charCodeAt(state.position);

        while (is_WHITE_SPACE(ch)) {
          ch = state.input.charCodeAt(++state.position);
        }

        if (ch === 0x3A/* : */) {
          ch = state.input.charCodeAt(++state.position);

          if (!is_WS_OR_EOL(ch)) {
            throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');
          }

          if (atExplicitKey) {
            storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
            keyTag = keyNode = valueNode = null;
          }

          detected = true;
          atExplicitKey = false;
          allowCompact = false;
          keyTag = state.tag;
          keyNode = state.result;

        } else if (detected) {
          throwError(state, 'can not read an implicit mapping pair; a colon is missed');

        } else {
          state.tag = _tag;
          state.anchor = _anchor;
          return true; // Keep the result of `composeNode`.
        }

      } else if (detected) {
        throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');

      } else {
        state.tag = _tag;
        state.anchor = _anchor;
        return true; // Keep the result of `composeNode`.
      }

    } else {
      break; // Reading is done. Go to the epilogue.
    }

    //
    // Common reading code for both explicit and implicit notations.
    //
    if (state.line === _line || state.lineIndent > nodeIndent) {
      if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {
        if (atExplicitKey) {
          keyNode = state.result;
        } else {
          valueNode = state.result;
        }
      }

      if (!atExplicitKey) {
        storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos);
        keyTag = keyNode = valueNode = null;
      }

      skipSeparationSpace(state, true, -1);
      ch = state.input.charCodeAt(state.position);
    }

    if (state.lineIndent > nodeIndent && (ch !== 0)) {
      throwError(state, 'bad indentation of a mapping entry');
    } else if (state.lineIndent < nodeIndent) {
      break;
    }
  }

  //
  // Epilogue.
  //

  // Special case: last mapping's node contains only the key in explicit notation.
  if (atExplicitKey) {
    storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
  }

  // Expose the resulting mapping.
  if (detected) {
    state.tag = _tag;
    state.anchor = _anchor;
    state.kind = 'mapping';
    state.result = _result;
  }

  return detected;
}

function readTagProperty(state) {
  var _position,
      isVerbatim = false,
      isNamed    = false,
      tagHandle,
      tagName,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x21/* ! */) return false;

  if (state.tag !== null) {
    throwError(state, 'duplication of a tag property');
  }

  ch = state.input.charCodeAt(++state.position);

  if (ch === 0x3C/* < */) {
    isVerbatim = true;
    ch = state.input.charCodeAt(++state.position);

  } else if (ch === 0x21/* ! */) {
    isNamed = true;
    tagHandle = '!!';
    ch = state.input.charCodeAt(++state.position);

  } else {
    tagHandle = '!';
  }

  _position = state.position;

  if (isVerbatim) {
    do { ch = state.input.charCodeAt(++state.position); }
    while (ch !== 0 && ch !== 0x3E/* > */);

    if (state.position < state.length) {
      tagName = state.input.slice(_position, state.position);
      ch = state.input.charCodeAt(++state.position);
    } else {
      throwError(state, 'unexpected end of the stream within a verbatim tag');
    }
  } else {
    while (ch !== 0 && !is_WS_OR_EOL(ch)) {

      if (ch === 0x21/* ! */) {
        if (!isNamed) {
          tagHandle = state.input.slice(_position - 1, state.position + 1);

          if (!PATTERN_TAG_HANDLE.test(tagHandle)) {
            throwError(state, 'named tag handle cannot contain such characters');
          }

          isNamed = true;
          _position = state.position + 1;
        } else {
          throwError(state, 'tag suffix cannot contain exclamation marks');
        }
      }

      ch = state.input.charCodeAt(++state.position);
    }

    tagName = state.input.slice(_position, state.position);

    if (PATTERN_FLOW_INDICATORS.test(tagName)) {
      throwError(state, 'tag suffix cannot contain flow indicator characters');
    }
  }

  if (tagName && !PATTERN_TAG_URI.test(tagName)) {
    throwError(state, 'tag name cannot contain such characters: ' + tagName);
  }

  if (isVerbatim) {
    state.tag = tagName;

  } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) {
    state.tag = state.tagMap[tagHandle] + tagName;

  } else if (tagHandle === '!') {
    state.tag = '!' + tagName;

  } else if (tagHandle === '!!') {
    state.tag = 'tag:yaml.org,2002:' + tagName;

  } else {
    throwError(state, 'undeclared tag handle "' + tagHandle + '"');
  }

  return true;
}

function readAnchorProperty(state) {
  var _position,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x26/* & */) return false;

  if (state.anchor !== null) {
    throwError(state, 'duplication of an anchor property');
  }

  ch = state.input.charCodeAt(++state.position);
  _position = state.position;

  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
    ch = state.input.charCodeAt(++state.position);
  }

  if (state.position === _position) {
    throwError(state, 'name of an anchor node must contain at least one character');
  }

  state.anchor = state.input.slice(_position, state.position);
  return true;
}

function readAlias(state) {
  var _position, alias,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x2A/* * */) return false;

  ch = state.input.charCodeAt(++state.position);
  _position = state.position;

  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
    ch = state.input.charCodeAt(++state.position);
  }

  if (state.position === _position) {
    throwError(state, 'name of an alias node must contain at least one character');
  }

  alias = state.input.slice(_position, state.position);

  if (!state.anchorMap.hasOwnProperty(alias)) {
    throwError(state, 'unidentified alias "' + alias + '"');
  }

  state.result = state.anchorMap[alias];
  skipSeparationSpace(state, true, -1);
  return true;
}

function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {
  var allowBlockStyles,
      allowBlockScalars,
      allowBlockCollections,
      indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent
      atNewLine  = false,
      hasContent = false,
      typeIndex,
      typeQuantity,
      type,
      flowIndent,
      blockIndent;

  if (state.listener !== null) {
    state.listener('open', state);
  }

  state.tag    = null;
  state.anchor = null;
  state.kind   = null;
  state.result = null;

  allowBlockStyles = allowBlockScalars = allowBlockCollections =
    CONTEXT_BLOCK_OUT === nodeContext ||
    CONTEXT_BLOCK_IN  === nodeContext;

  if (allowToSeek) {
    if (skipSeparationSpace(state, true, -1)) {
      atNewLine = true;

      if (state.lineIndent > parentIndent) {
        indentStatus = 1;
      } else if (state.lineIndent === parentIndent) {
        indentStatus = 0;
      } else if (state.lineIndent < parentIndent) {
        indentStatus = -1;
      }
    }
  }

  if (indentStatus === 1) {
    while (readTagProperty(state) || readAnchorProperty(state)) {
      if (skipSeparationSpace(state, true, -1)) {
        atNewLine = true;
        allowBlockCollections = allowBlockStyles;

        if (state.lineIndent > parentIndent) {
          indentStatus = 1;
        } else if (state.lineIndent === parentIndent) {
          indentStatus = 0;
        } else if (state.lineIndent < parentIndent) {
          indentStatus = -1;
        }
      } else {
        allowBlockCollections = false;
      }
    }
  }

  if (allowBlockCollections) {
    allowBlockCollections = atNewLine || allowCompact;
  }

  if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {
    if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {
      flowIndent = parentIndent;
    } else {
      flowIndent = parentIndent + 1;
    }

    blockIndent = state.position - state.lineStart;

    if (indentStatus === 1) {
      if (allowBlockCollections &&
          (readBlockSequence(state, blockIndent) ||
           readBlockMapping(state, blockIndent, flowIndent)) ||
          readFlowCollection(state, flowIndent)) {
        hasContent = true;
      } else {
        if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||
            readSingleQuotedScalar(state, flowIndent) ||
            readDoubleQuotedScalar(state, flowIndent)) {
          hasContent = true;

        } else if (readAlias(state)) {
          hasContent = true;

          if (state.tag !== null || state.anchor !== null) {
            throwError(state, 'alias node should not have any properties');
          }

        } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {
          hasContent = true;

          if (state.tag === null) {
            state.tag = '?';
          }
        }

        if (state.anchor !== null) {
          state.anchorMap[state.anchor] = state.result;
        }
      }
    } else if (indentStatus === 0) {
      // Special case: block sequences are allowed to have same indentation level as the parent.
      // http://www.yaml.org/spec/1.2/spec.html#id2799784
      hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);
    }
  }

  if (state.tag !== null && state.tag !== '!') {
    if (state.tag === '?') {
      // Implicit resolving is not allowed for non-scalar types, and '?'
      // non-specific tag is only automatically assigned to plain scalars.
      //
      // We only need to check kind conformity in case user explicitly assigns '?'
      // tag, for example like this: "!<?> [0]"
      //
      if (state.result !== null && state.kind !== 'scalar') {
        throwError(state, 'unacceptable node kind for !<?> tag; it should be "scalar", not "' + state.kind + '"');
      }

      for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {
        type = state.implicitTypes[typeIndex];

        if (type.resolve(state.result)) { // `state.result` updated in resolver if matched
          state.result = type.construct(state.result);
          state.tag = type.tag;
          if (state.anchor !== null) {
            state.anchorMap[state.anchor] = state.result;
          }
          break;
        }
      }
    } else if (_hasOwnProperty.call(state.typeMap[state.kind || 'fallback'], state.tag)) {
      type = state.typeMap[state.kind || 'fallback'][state.tag];

      if (state.result !== null && type.kind !== state.kind) {
        throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"');
      }

      if (!type.resolve(state.result)) { // `state.result` updated in resolver if matched
        throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');
      } else {
        state.result = type.construct(state.result);
        if (state.anchor !== null) {
          state.anchorMap[state.anchor] = state.result;
        }
      }
    } else {
      throwError(state, 'unknown tag !<' + state.tag + '>');
    }
  }

  if (state.listener !== null) {
    state.listener('close', state);
  }
  return state.tag !== null ||  state.anchor !== null || hasContent;
}

function readDocument(state) {
  var documentStart = state.position,
      _position,
      directiveName,
      directiveArgs,
      hasDirectives = false,
      ch;

  state.version = null;
  state.checkLineBreaks = state.legacy;
  state.tagMap = {};
  state.anchorMap = {};

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    skipSeparationSpace(state, true, -1);

    ch = state.input.charCodeAt(state.position);

    if (state.lineIndent > 0 || ch !== 0x25/* % */) {
      break;
    }

    hasDirectives = true;
    ch = state.input.charCodeAt(++state.position);
    _position = state.position;

    while (ch !== 0 && !is_WS_OR_EOL(ch)) {
      ch = state.input.charCodeAt(++state.position);
    }

    directiveName = state.input.slice(_position, state.position);
    directiveArgs = [];

    if (directiveName.length < 1) {
      throwError(state, 'directive name must not be less than one character in length');
    }

    while (ch !== 0) {
      while (is_WHITE_SPACE(ch)) {
        ch = state.input.charCodeAt(++state.position);
      }

      if (ch === 0x23/* # */) {
        do { ch = state.input.charCodeAt(++state.position); }
        while (ch !== 0 && !is_EOL(ch));
        break;
      }

      if (is_EOL(ch)) break;

      _position = state.position;

      while (ch !== 0 && !is_WS_OR_EOL(ch)) {
        ch = state.input.charCodeAt(++state.position);
      }

      directiveArgs.push(state.input.slice(_position, state.position));
    }

    if (ch !== 0) readLineBreak(state);

    if (_hasOwnProperty.call(directiveHandlers, directiveName)) {
      directiveHandlers[directiveName](state, directiveName, directiveArgs);
    } else {
      throwWarning(state, 'unknown document directive "' + directiveName + '"');
    }
  }

  skipSeparationSpace(state, true, -1);

  if (state.lineIndent === 0 &&
      state.input.charCodeAt(state.position)     === 0x2D/* - */ &&
      state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&
      state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {
    state.position += 3;
    skipSeparationSpace(state, true, -1);

  } else if (hasDirectives) {
    throwError(state, 'directives end mark is expected');
  }

  composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);
  skipSeparationSpace(state, true, -1);

  if (state.checkLineBreaks &&
      PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {
    throwWarning(state, 'non-ASCII line breaks are interpreted as content');
  }

  state.documents.push(state.result);

  if (state.position === state.lineStart && testDocumentSeparator(state)) {

    if (state.input.charCodeAt(state.position) === 0x2E/* . */) {
      state.position += 3;
      skipSeparationSpace(state, true, -1);
    }
    return;
  }

  if (state.position < (state.length - 1)) {
    throwError(state, 'end of the stream or a document separator is expected');
  } else {
    return;
  }
}


function loadDocuments(input, options) {
  input = String(input);
  options = options || {};

  if (input.length !== 0) {

    // Add tailing `\n` if not exists
    if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&
        input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {
      input += '\n';
    }

    // Strip BOM
    if (input.charCodeAt(0) === 0xFEFF) {
      input = input.slice(1);
    }
  }

  var state = new State(input, options);

  var nullpos = input.indexOf('\0');

  if (nullpos !== -1) {
    state.position = nullpos;
    throwError(state, 'null byte is not allowed in input');
  }

  // Use 0 as string terminator. That significantly simplifies bounds check.
  state.input += '\0';

  while (state.input.charCodeAt(state.position) === 0x20/* Space */) {
    state.lineIndent += 1;
    state.position += 1;
  }

  while (state.position < (state.length - 1)) {
    readDocument(state);
  }

  return state.documents;
}


function loadAll(input, iterator, options) {
  if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {
    options = iterator;
    iterator = null;
  }

  var documents = loadDocuments(input, options);

  if (typeof iterator !== 'function') {
    return documents;
  }

  for (var index = 0, length = documents.length; index < length; index += 1) {
    iterator(documents[index]);
  }
}


function load(input, options) {
  var documents = loadDocuments(input, options);

  if (documents.length === 0) {
    /*eslint-disable no-undefined*/
    return undefined;
  } else if (documents.length === 1) {
    return documents[0];
  }
  throw new YAMLException('expected a single document in the stream, but found more');
}


function safeLoadAll(input, iterator, options) {
  if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') {
    options = iterator;
    iterator = null;
  }

  return loadAll(input, iterator, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
}


function safeLoad(input, options) {
  return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
}


module.exports.loadAll     = loadAll;
module.exports.load        = load;
module.exports.safeLoadAll = safeLoadAll;
module.exports.safeLoad    = safeLoad;
'use strict';


var common = require('./common');


function Mark(name, buffer, position, line, column) {
  this.name     = name;
  this.buffer   = buffer;
  this.position = position;
  this.line     = line;
  this.column   = column;
}


Mark.prototype.getSnippet = function getSnippet(indent, maxLength) {
  var head, start, tail, end, snippet;

  if (!this.buffer) return null;

  indent = indent || 4;
  maxLength = maxLength || 75;

  head = '';
  start = this.position;

  while (start > 0 && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(start - 1)) === -1) {
    start -= 1;
    if (this.position - start > (maxLength / 2 - 1)) {
      head = ' ... ';
      start += 5;
      break;
    }
  }

  tail = '';
  end = this.position;

  while (end < this.buffer.length && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(end)) === -1) {
    end += 1;
    if (end - this.position > (maxLength / 2 - 1)) {
      tail = ' ... ';
      end -= 5;
      break;
    }
  }

  snippet = this.buffer.slice(start, end);

  return common.repeat(' ', indent) + head + snippet + tail + '\n' +
         common.repeat(' ', indent + this.position - start + head.length) + '^';
};


Mark.prototype.toString = function toString(compact) {
  var snippet, where = '';

  if (this.name) {
    where += 'in "' + this.name + '" ';
  }

  where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1);

  if (!compact) {
    snippet = this.getSnippet();

    if (snippet) {
      where += ':\n' + snippet;
    }
  }

  return where;
};


module.exports = Mark;
'use strict';

/*eslint-disable max-len*/

var common        = require('./common');
var YAMLException = require('./exception');
var Type          = require('./type');


function compileList(schema, name, result) {
  var exclude = [];

  schema.include.forEach(function (includedSchema) {
    result = compileList(includedSchema, name, result);
  });

  schema[name].forEach(function (currentType) {
    result.forEach(function (previousType, previousIndex) {
      if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) {
        exclude.push(previousIndex);
      }
    });

    result.push(currentType);
  });

  return result.filter(function (type, index) {
    return exclude.indexOf(index) === -1;
  });
}


function compileMap(/* lists... */) {
  var result = {
        scalar: {},
        sequence: {},
        mapping: {},
        fallback: {}
      }, index, length;

  function collectType(type) {
    result[type.kind][type.tag] = result['fallback'][type.tag] = type;
  }

  for (index = 0, length = arguments.length; index < length; index += 1) {
    arguments[index].forEach(collectType);
  }
  return result;
}


function Schema(definition) {
  this.include  = definition.include  || [];
  this.implicit = definition.implicit || [];
  this.explicit = definition.explicit || [];

  this.implicit.forEach(function (type) {
    if (type.loadKind && type.loadKind !== 'scalar') {
      throw new YAMLException('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');
    }
  });

  this.compiledImplicit = compileList(this, 'implicit', []);
  this.compiledExplicit = compileList(this, 'explicit', []);
  this.compiledTypeMap  = compileMap(this.compiledImplicit, this.compiledExplicit);
}


Schema.DEFAULT = null;


Schema.create = function createSchema() {
  var schemas, types;

  switch (arguments.length) {
    case 1:
      schemas = Schema.DEFAULT;
      types = arguments[0];
      break;

    case 2:
      schemas = arguments[0];
      types = arguments[1];
      break;

    default:
      throw new YAMLException('Wrong number of arguments for Schema.create function');
  }

  schemas = common.toArray(schemas);
  types = common.toArray(types);

  if (!schemas.every(function (schema) { return schema instanceof Schema; })) {
    throw new YAMLException('Specified list of super schemas (or a single Schema object) contains a non-Schema object.');
  }

  if (!types.every(function (type) { return type instanceof Type; })) {
    throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.');
  }

  return new Schema({
    include: schemas,
    explicit: types
  });
};


module.exports = Schema;
'use strict';

var YAMLException = require('./exception');

var TYPE_CONSTRUCTOR_OPTIONS = [
  'kind',
  'resolve',
  'construct',
  'instanceOf',
  'predicate',
  'represent',
  'defaultStyle',
  'styleAliases'
];

var YAML_NODE_KINDS = [
  'scalar',
  'sequence',
  'mapping'
];

function compileStyleAliases(map) {
  var result = {};

  if (map !== null) {
    Object.keys(map).forEach(function (style) {
      map[style].forEach(function (alias) {
        result[String(alias)] = style;
      });
    });
  }

  return result;
}

function Type(tag, options) {
  options = options || {};

  Object.keys(options).forEach(function (name) {
    if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {
      throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.');
    }
  });

  // TODO: Add tag format check.
  this.tag          = tag;
  this.kind         = options['kind']         || null;
  this.resolve      = options['resolve']      || function () { return true; };
  this.construct    = options['construct']    || function (data) { return data; };
  this.instanceOf   = options['instanceOf']   || null;
  this.predicate    = options['predicate']    || null;
  this.represent    = options['represent']    || null;
  this.defaultStyle = options['defaultStyle'] || null;
  this.styleAliases = compileStyleAliases(options['styleAliases'] || null);

  if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {
    throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
  }
}

module.exports = Type;
'use strict';

/*eslint-disable no-bitwise*/

var NodeBuffer;

try {
  // A trick for browserified version, to not include `Buffer` shim
  var _require = require;
  NodeBuffer = _require('buffer').Buffer;
} catch (__) {}

var Type       = require('../type');


// [ 64, 65, 66 ] -> [ padding, CR, LF ]
var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r';


function resolveYamlBinary(data) {
  if (data === null) return false;

  var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;

  // Convert one by one.
  for (idx = 0; idx < max; idx++) {
    code = map.indexOf(data.charAt(idx));

    // Skip CR/LF
    if (code > 64) continue;

    // Fail on illegal characters
    if (code < 0) return false;

    bitlen += 6;
  }

  // If there are any bits left, source was corrupted
  return (bitlen % 8) === 0;
}

function constructYamlBinary(data) {
  var idx, tailbits,
      input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan
      max = input.length,
      map = BASE64_MAP,
      bits = 0,
      result = [];

  // Collect by 6*4 bits (3 bytes)

  for (idx = 0; idx < max; idx++) {
    if ((idx % 4 === 0) && idx) {
      result.push((bits >> 16) & 0xFF);
      result.push((bits >> 8) & 0xFF);
      result.push(bits & 0xFF);
    }

    bits = (bits << 6) | map.indexOf(input.charAt(idx));
  }

  // Dump tail

  tailbits = (max % 4) * 6;

  if (tailbits === 0) {
    result.push((bits >> 16) & 0xFF);
    result.push((bits >> 8) & 0xFF);
    result.push(bits & 0xFF);
  } else if (tailbits === 18) {
    result.push((bits >> 10) & 0xFF);
    result.push((bits >> 2) & 0xFF);
  } else if (tailbits === 12) {
    result.push((bits >> 4) & 0xFF);
  }

  // Wrap into Buffer for NodeJS and leave Array for browser
  if (NodeBuffer) {
    // Support node 6.+ Buffer API when available
    return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result);
  }

  return result;
}

function representYamlBinary(object /*, style*/) {
  var result = '', bits = 0, idx, tail,
      max = object.length,
      map = BASE64_MAP;

  // Convert every three bytes to 4 ASCII characters.

  for (idx = 0; idx < max; idx++) {
    if ((idx % 3 === 0) && idx) {
      result += map[(bits >> 18) & 0x3F];
      result += map[(bits >> 12) & 0x3F];
      result += map[(bits >> 6) & 0x3F];
      result += map[bits & 0x3F];
    }

    bits = (bits << 8) + object[idx];
  }

  // Dump tail

  tail = max % 3;

  if (tail === 0) {
    result += map[(bits >> 18) & 0x3F];
    result += map[(bits >> 12) & 0x3F];
    result += map[(bits >> 6) & 0x3F];
    result += map[bits & 0x3F];
  } else if (tail === 2) {
    result += map[(bits >> 10) & 0x3F];
    result += map[(bits >> 4) & 0x3F];
    result += map[(bits << 2) & 0x3F];
    result += map[64];
  } else if (tail === 1) {
    result += map[(bits >> 2) & 0x3F];
    result += map[(bits << 4) & 0x3F];
    result += map[64];
    result += map[64];
  }

  return result;
}

function isBinary(object) {
  return NodeBuffer && NodeBuffer.isBuffer(object);
}

module.exports = new Type('tag:yaml.org,2002:binary', {
  kind: 'scalar',
  resolve: resolveYamlBinary,
  construct: constructYamlBinary,
  predicate: isBinary,
  represent: representYamlBinary
});
'use strict';

var Type = require('../type');

function resolveYamlBoolean(data) {
  if (data === null) return false;

  var max = data.length;

  return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||
         (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));
}

function constructYamlBoolean(data) {
  return data === 'true' ||
         data === 'True' ||
         data === 'TRUE';
}

function isBoolean(object) {
  return Object.prototype.toString.call(object) === '[object Boolean]';
}

module.exports = new Type('tag:yaml.org,2002:bool', {
  kind: 'scalar',
  resolve: resolveYamlBoolean,
  construct: constructYamlBoolean,
  predicate: isBoolean,
  represent: {
    lowercase: function (object) { return object ? 'true' : 'false'; },
    uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },
    camelcase: function (object) { return object ? 'True' : 'False'; }
  },
  defaultStyle: 'lowercase'
});
'use strict';

var common = require('../common');
var Type   = require('../type');

var YAML_FLOAT_PATTERN = new RegExp(
  // 2.5e4, 2.5 and integers
  '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +
  // .2e4, .2
  // special case, seems not from spec
  '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +
  // 20:59
  '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' +
  // .inf
  '|[-+]?\\.(?:inf|Inf|INF)' +
  // .nan
  '|\\.(?:nan|NaN|NAN))$');

function resolveYamlFloat(data) {
  if (data === null) return false;

  if (!YAML_FLOAT_PATTERN.test(data) ||
      // Quick hack to not allow integers end with `_`
      // Probably should update regexp & check speed
      data[data.length - 1] === '_') {
    return false;
  }

  return true;
}

function constructYamlFloat(data) {
  var value, sign, base, digits;

  value  = data.replace(/_/g, '').toLowerCase();
  sign   = value[0] === '-' ? -1 : 1;
  digits = [];

  if ('+-'.indexOf(value[0]) >= 0) {
    value = value.slice(1);
  }

  if (value === '.inf') {
    return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;

  } else if (value === '.nan') {
    return NaN;

  } else if (value.indexOf(':') >= 0) {
    value.split(':').forEach(function (v) {
      digits.unshift(parseFloat(v, 10));
    });

    value = 0.0;
    base = 1;

    digits.forEach(function (d) {
      value += d * base;
      base *= 60;
    });

    return sign * value;

  }
  return sign * parseFloat(value, 10);
}


var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;

function representYamlFloat(object, style) {
  var res;

  if (isNaN(object)) {
    switch (style) {
      case 'lowercase': return '.nan';
      case 'uppercase': return '.NAN';
      case 'camelcase': return '.NaN';
    }
  } else if (Number.POSITIVE_INFINITY === object) {
    switch (style) {
      case 'lowercase': return '.inf';
      case 'uppercase': return '.INF';
      case 'camelcase': return '.Inf';
    }
  } else if (Number.NEGATIVE_INFINITY === object) {
    switch (style) {
      case 'lowercase': return '-.inf';
      case 'uppercase': return '-.INF';
      case 'camelcase': return '-.Inf';
    }
  } else if (common.isNegativeZero(object)) {
    return '-0.0';
  }

  res = object.toString(10);

  // JS stringifier can build scientific format without dots: 5e-100,
  // while YAML requres dot: 5.e-100. Fix it with simple hack

  return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;
}

function isFloat(object) {
  return (Object.prototype.toString.call(object) === '[object Number]') &&
         (object % 1 !== 0 || common.isNegativeZero(object));
}

module.exports = new Type('tag:yaml.org,2002:float', {
  kind: 'scalar',
  resolve: resolveYamlFloat,
  construct: constructYamlFloat,
  predicate: isFloat,
  represent: representYamlFloat,
  defaultStyle: 'lowercase'
});
'use strict';

var common = require('../common');
var Type   = require('../type');

function isHexCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||
         ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||
         ((0x61/* a */ <= c) && (c <= 0x66/* f */));
}

function isOctCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));
}

function isDecCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));
}

function resolveYamlInteger(data) {
  if (data === null) return false;

  var max = data.length,
      index = 0,
      hasDigits = false,
      ch;

  if (!max) return false;

  ch = data[index];

  // sign
  if (ch === '-' || ch === '+') {
    ch = data[++index];
  }

  if (ch === '0') {
    // 0
    if (index + 1 === max) return true;
    ch = data[++index];

    // base 2, base 8, base 16

    if (ch === 'b') {
      // base 2
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (ch !== '0' && ch !== '1') return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }


    if (ch === 'x') {
      // base 16
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (!isHexCode(data.charCodeAt(index))) return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }

    // base 8
    for (; index < max; index++) {
      ch = data[index];
      if (ch === '_') continue;
      if (!isOctCode(data.charCodeAt(index))) return false;
      hasDigits = true;
    }
    return hasDigits && ch !== '_';
  }

  // base 10 (except 0) or base 60

  // value should not start with `_`;
  if (ch === '_') return false;

  for (; index < max; index++) {
    ch = data[index];
    if (ch === '_') continue;
    if (ch === ':') break;
    if (!isDecCode(data.charCodeAt(index))) {
      return false;
    }
    hasDigits = true;
  }

  // Should have digits and should not end with `_`
  if (!hasDigits || ch === '_') return false;

  // if !base60 - done;
  if (ch !== ':') return true;

  // base60 almost not used, no needs to optimize
  return /^(:[0-5]?[0-9])+$/.test(data.slice(index));
}

function constructYamlInteger(data) {
  var value = data, sign = 1, ch, base, digits = [];

  if (value.indexOf('_') !== -1) {
    value = value.replace(/_/g, '');
  }

  ch = value[0];

  if (ch === '-' || ch === '+') {
    if (ch === '-') sign = -1;
    value = value.slice(1);
    ch = value[0];
  }

  if (value === '0') return 0;

  if (ch === '0') {
    if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);
    if (value[1] === 'x') return sign * parseInt(value, 16);
    return sign * parseInt(value, 8);
  }

  if (value.indexOf(':') !== -1) {
    value.split(':').forEach(function (v) {
      digits.unshift(parseInt(v, 10));
    });

    value = 0;
    base = 1;

    digits.forEach(function (d) {
      value += (d * base);
      base *= 60;
    });

    return sign * value;

  }

  return sign * parseInt(value, 10);
}

function isInteger(object) {
  return (Object.prototype.toString.call(object)) === '[object Number]' &&
         (object % 1 === 0 && !common.isNegativeZero(object));
}

module.exports = new Type('tag:yaml.org,2002:int', {
  kind: 'scalar',
  resolve: resolveYamlInteger,
  construct: constructYamlInteger,
  predicate: isInteger,
  represent: {
    binary:      function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },
    octal:       function (obj) { return obj >= 0 ? '0'  + obj.toString(8) : '-0'  + obj.toString(8).slice(1); },
    decimal:     function (obj) { return obj.toString(10); },
    /* eslint-disable max-len */
    hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() :  '-0x' + obj.toString(16).toUpperCase().slice(1); }
  },
  defaultStyle: 'decimal',
  styleAliases: {
    binary:      [ 2,  'bin' ],
    octal:       [ 8,  'oct' ],
    decimal:     [ 10, 'dec' ],
    hexadecimal: [ 16, 'hex' ]
  }
});
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:map', {
  kind: 'mapping',
  construct: function (data) { return data !== null ? data : {}; }
});
'use strict';

var Type = require('../type');

function resolveYamlMerge(data) {
  return data === '<<' || data === null;
}

module.exports = new Type('tag:yaml.org,2002:merge', {
  kind: 'scalar',
  resolve: resolveYamlMerge
});
'use strict';

var Type = require('../type');

function resolveYamlNull(data) {
  if (data === null) return true;

  var max = data.length;

  return (max === 1 && data === '~') ||
         (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));
}

function constructYamlNull() {
  return null;
}

function isNull(object) {
  return object === null;
}

module.exports = new Type('tag:yaml.org,2002:null', {
  kind: 'scalar',
  resolve: resolveYamlNull,
  construct: constructYamlNull,
  predicate: isNull,
  represent: {
    canonical: function () { return '~';    },
    lowercase: function () { return 'null'; },
    uppercase: function () { return 'NULL'; },
    camelcase: function () { return 'Null'; }
  },
  defaultStyle: 'lowercase'
});
'use strict';

var Type = require('../type');

var _hasOwnProperty = Object.prototype.hasOwnProperty;
var _toString       = Object.prototype.toString;

function resolveYamlOmap(data) {
  if (data === null) return true;

  var objectKeys = [], index, length, pair, pairKey, pairHasKey,
      object = data;

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];
    pairHasKey = false;

    if (_toString.call(pair) !== '[object Object]') return false;

    for (pairKey in pair) {
      if (_hasOwnProperty.call(pair, pairKey)) {
        if (!pairHasKey) pairHasKey = true;
        else return false;
      }
    }

    if (!pairHasKey) return false;

    if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);
    else return false;
  }

  return true;
}

function constructYamlOmap(data) {
  return data !== null ? data : [];
}

module.exports = new Type('tag:yaml.org,2002:omap', {
  kind: 'sequence',
  resolve: resolveYamlOmap,
  construct: constructYamlOmap
});
'use strict';

var Type = require('../type');

var _toString = Object.prototype.toString;

function resolveYamlPairs(data) {
  if (data === null) return true;

  var index, length, pair, keys, result,
      object = data;

  result = new Array(object.length);

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];

    if (_toString.call(pair) !== '[object Object]') return false;

    keys = Object.keys(pair);

    if (keys.length !== 1) return false;

    result[index] = [ keys[0], pair[keys[0]] ];
  }

  return true;
}

function constructYamlPairs(data) {
  if (data === null) return [];

  var index, length, pair, keys, result,
      object = data;

  result = new Array(object.length);

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];

    keys = Object.keys(pair);

    result[index] = [ keys[0], pair[keys[0]] ];
  }

  return result;
}

module.exports = new Type('tag:yaml.org,2002:pairs', {
  kind: 'sequence',
  resolve: resolveYamlPairs,
  construct: constructYamlPairs
});
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:seq', {
  kind: 'sequence',
  construct: function (data) { return data !== null ? data : []; }
});
'use strict';

var Type = require('../type');

var _hasOwnProperty = Object.prototype.hasOwnProperty;

function resolveYamlSet(data) {
  if (data === null) return true;

  var key, object = data;

  for (key in object) {
    if (_hasOwnProperty.call(object, key)) {
      if (object[key] !== null) return false;
    }
  }

  return true;
}

function constructYamlSet(data) {
  return data !== null ? data : {};
}

module.exports = new Type('tag:yaml.org,2002:set', {
  kind: 'mapping',
  resolve: resolveYamlSet,
  construct: constructYamlSet
});
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:str', {
  kind: 'scalar',
  construct: function (data) { return data !== null ? data : ''; }
});
'use strict';

var Type = require('../type');

var YAML_DATE_REGEXP = new RegExp(
  '^([0-9][0-9][0-9][0-9])'          + // [1] year
  '-([0-9][0-9])'                    + // [2] month
  '-([0-9][0-9])$');                   // [3] day

var YAML_TIMESTAMP_REGEXP = new RegExp(
  '^([0-9][0-9][0-9][0-9])'          + // [1] year
  '-([0-9][0-9]?)'                   + // [2] month
  '-([0-9][0-9]?)'                   + // [3] day
  '(?:[Tt]|[ \\t]+)'                 + // ...
  '([0-9][0-9]?)'                    + // [4] hour
  ':([0-9][0-9])'                    + // [5] minute
  ':([0-9][0-9])'                    + // [6] second
  '(?:\\.([0-9]*))?'                 + // [7] fraction
  '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour
  '(?::([0-9][0-9]))?))?$');           // [11] tz_minute

function resolveYamlTimestamp(data) {
  if (data === null) return false;
  if (YAML_DATE_REGEXP.exec(data) !== null) return true;
  if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;
  return false;
}

function constructYamlTimestamp(data) {
  var match, year, month, day, hour, minute, second, fraction = 0,
      delta = null, tz_hour, tz_minute, date;

  match = YAML_DATE_REGEXP.exec(data);
  if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);

  if (match === null) throw new Error('Date resolve error');

  // match: [1] year [2] month [3] day

  year = +(match[1]);
  month = +(match[2]) - 1; // JS month starts with 0
  day = +(match[3]);

  if (!match[4]) { // no hour
    return new Date(Date.UTC(year, month, day));
  }

  // match: [4] hour [5] minute [6] second [7] fraction

  hour = +(match[4]);
  minute = +(match[5]);
  second = +(match[6]);

  if (match[7]) {
    fraction = match[7].slice(0, 3);
    while (fraction.length < 3) { // milli-seconds
      fraction += '0';
    }
    fraction = +fraction;
  }

  // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute

  if (match[9]) {
    tz_hour = +(match[10]);
    tz_minute = +(match[11] || 0);
    delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds
    if (match[9] === '-') delta = -delta;
  }

  date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));

  if (delta) date.setTime(date.getTime() - delta);

  return date;
}

function representYamlTimestamp(object /*, style*/) {
  return object.toISOString();
}

module.exports = new Type('tag:yaml.org,2002:timestamp', {
  kind: 'scalar',
  resolve: resolveYamlTimestamp,
  construct: constructYamlTimestamp,
  instanceOf: Date,
  represent: representYamlTimestamp
});
'use strict';

var esprima;

// Browserified version does not have esprima
//
// 1. For node.js just require module as deps
// 2. For browser try to require mudule via external AMD system.
//    If not found - try to fallback to window.esprima. If not
//    found too - then fail to parse.
//
try {
  // workaround to exclude package from browserify list.
  var _require = require;
  esprima = _require('esprima');
} catch (_) {
  /* eslint-disable no-redeclare */
  /* global window */
  if (typeof window !== 'undefined') esprima = window.esprima;
}

var Type = require('../../type');

function resolveJavascriptFunction(data) {
  if (data === null) return false;

  try {
    var source = '(' + data + ')',
        ast    = esprima.parse(source, { range: true });

    if (ast.type                    !== 'Program'             ||
        ast.body.length             !== 1                     ||
        ast.body[0].type            !== 'ExpressionStatement' ||
        (ast.body[0].expression.type !== 'ArrowFunctionExpression' &&
          ast.body[0].expression.type !== 'FunctionExpression')) {
      return false;
    }

    return true;
  } catch (err) {
    return false;
  }
}

function constructJavascriptFunction(data) {
  /*jslint evil:true*/

  var source = '(' + data + ')',
      ast    = esprima.parse(source, { range: true }),
      params = [],
      body;

  if (ast.type                    !== 'Program'             ||
      ast.body.length             !== 1                     ||
      ast.body[0].type            !== 'ExpressionStatement' ||
      (ast.body[0].expression.type !== 'ArrowFunctionExpression' &&
        ast.body[0].expression.type !== 'FunctionExpression')) {
    throw new Error('Failed to resolve function');
  }

  ast.body[0].expression.params.forEach(function (param) {
    params.push(param.name);
  });

  body = ast.body[0].expression.body.range;

  // Esprima's ranges include the first '{' and the last '}' characters on
  // function expressions. So cut them out.
  if (ast.body[0].expression.body.type === 'BlockStatement') {
    /*eslint-disable no-new-func*/
    return new Function(params, source.slice(body[0] + 1, body[1] - 1));
  }
  // ES6 arrow functions can omit the BlockStatement. In that case, just return
  // the body.
  /*eslint-disable no-new-func*/
  return new Function(params, 'return ' + source.slice(body[0], body[1]));
}

function representJavascriptFunction(object /*, style*/) {
  return object.toString();
}

function isFunction(object) {
  return Object.prototype.toString.call(object) === '[object Function]';
}

module.exports = new Type('tag:yaml.org,2002:js/function', {
  kind: 'scalar',
  resolve: resolveJavascriptFunction,
  construct: constructJavascriptFunction,
  predicate: isFunction,
  represent: representJavascriptFunction
});
'use strict';

var Type = require('../../type');

function resolveJavascriptRegExp(data) {
  if (data === null) return false;
  if (data.length === 0) return false;

  var regexp = data,
      tail   = /\/([gim]*)$/.exec(data),
      modifiers = '';

  // if regexp starts with '/' it can have modifiers and must be properly closed
  // `/foo/gim` - modifiers tail can be maximum 3 chars
  if (regexp[0] === '/') {
    if (tail) modifiers = tail[1];

    if (modifiers.length > 3) return false;
    // if expression starts with /, is should be properly terminated
    if (regexp[regexp.length - modifiers.length - 1] !== '/') return false;
  }

  return true;
}

function constructJavascriptRegExp(data) {
  var regexp = data,
      tail   = /\/([gim]*)$/.exec(data),
      modifiers = '';

  // `/foo/gim` - tail can be maximum 4 chars
  if (regexp[0] === '/') {
    if (tail) modifiers = tail[1];
    regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
  }

  return new RegExp(regexp, modifiers);
}

function representJavascriptRegExp(object /*, style*/) {
  var result = '/' + object.source + '/';

  if (object.global) result += 'g';
  if (object.multiline) result += 'm';
  if (object.ignoreCase) result += 'i';

  return result;
}

function isRegExp(object) {
  return Object.prototype.toString.call(object) === '[object RegExp]';
}

module.exports = new Type('tag:yaml.org,2002:js/regexp', {
  kind: 'scalar',
  resolve: resolveJavascriptRegExp,
  construct: constructJavascriptRegExp,
  predicate: isRegExp,
  represent: representJavascriptRegExp
});
'use strict';

var Type = require('../../type');

function resolveJavascriptUndefined() {
  return true;
}

function constructJavascriptUndefined() {
  /*eslint-disable no-undefined*/
  return undefined;
}

function representJavascriptUndefined() {
  return '';
}

function isUndefined(object) {
  return typeof object === 'undefined';
}

module.exports = new Type('tag:yaml.org,2002:js/undefined', {
  kind: 'scalar',
  resolve: resolveJavascriptUndefined,
  construct: constructJavascriptUndefined,
  predicate: isUndefined,
  represent: representJavascriptUndefined
});
// Standard YAML's Core schema.
// http://www.yaml.org/spec/1.2/spec.html#id2804923
//
// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.
// So, Core schema has no distinctions from JSON schema is JS-YAML.


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  include: [
    require('./json')
  ]
});
// JS-YAML's default schema for `load` function.
// It is not described in the YAML specification.
//
// This schema is based on JS-YAML's default safe schema and includes
// JavaScript-specific types: !!js/undefined, !!js/regexp and !!js/function.
//
// Also this schema is used as default base schema at `Schema.create` function.


'use strict';


var Schema = require('../schema');


module.exports = Schema.DEFAULT = new Schema({
  include: [
    require('./default_safe')
  ],
  explicit: [
    require('../type/js/undefined'),
    require('../type/js/regexp'),
    require('../type/js/function')
  ]
});
// JS-YAML's default schema for `safeLoad` function.
// It is not described in the YAML specification.
//
// This schema is based on standard YAML's Core schema and includes most of
// extra types described at YAML tag repository. (http://yaml.org/type/)


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  include: [
    require('./core')
  ],
  implicit: [
    require('../type/timestamp'),
    require('../type/merge')
  ],
  explicit: [
    require('../type/binary'),
    require('../type/omap'),
    require('../type/pairs'),
    require('../type/set')
  ]
});
// Standard YAML's Failsafe schema.
// http://www.yaml.org/spec/1.2/spec.html#id2802346


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  explicit: [
    require('../type/str'),
    require('../type/seq'),
    require('../type/map')
  ]
});
// Standard YAML's JSON schema.
// http://www.yaml.org/spec/1.2/spec.html#id2803231
//
// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.
// So, this schema is not such strict as defined in the YAML specification.
// It allows numbers in binary notaion, use `Null` and `NULL` as `null`, etc.


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  include: [
    require('./failsafe')
  ],
  implicit: [
    require('../type/null'),
    require('../type/bool'),
    require('../type/int'),
    require('../type/float')
  ]
});
/* js-yaml 3.14.0 https://github.com/nodeca/js-yaml */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.jsyaml = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
'use strict';


var loader = require('./js-yaml/loader');
var dumper = require('./js-yaml/dumper');


function deprecated(name) {
  return function () {
    throw new Error('Function ' + name + ' is deprecated and cannot be used.');
  };
}


module.exports.Type                = require('./js-yaml/type');
module.exports.Schema              = require('./js-yaml/schema');
module.exports.FAILSAFE_SCHEMA     = require('./js-yaml/schema/failsafe');
module.exports.JSON_SCHEMA         = require('./js-yaml/schema/json');
module.exports.CORE_SCHEMA         = require('./js-yaml/schema/core');
module.exports.DEFAULT_SAFE_SCHEMA = require('./js-yaml/schema/default_safe');
module.exports.DEFAULT_FULL_SCHEMA = require('./js-yaml/schema/default_full');
module.exports.load                = loader.load;
module.exports.loadAll             = loader.loadAll;
module.exports.safeLoad            = loader.safeLoad;
module.exports.safeLoadAll         = loader.safeLoadAll;
module.exports.dump                = dumper.dump;
module.exports.safeDump            = dumper.safeDump;
module.exports.YAMLException       = require('./js-yaml/exception');

// Deprecated schema names from JS-YAML 2.0.x
module.exports.MINIMAL_SCHEMA = require('./js-yaml/schema/failsafe');
module.exports.SAFE_SCHEMA    = require('./js-yaml/schema/default_safe');
module.exports.DEFAULT_SCHEMA = require('./js-yaml/schema/default_full');

// Deprecated functions from JS-YAML 1.x.x
module.exports.scan           = deprecated('scan');
module.exports.parse          = deprecated('parse');
module.exports.compose        = deprecated('compose');
module.exports.addConstructor = deprecated('addConstructor');

},{"./js-yaml/dumper":3,"./js-yaml/exception":4,"./js-yaml/loader":5,"./js-yaml/schema":7,"./js-yaml/schema/core":8,"./js-yaml/schema/default_full":9,"./js-yaml/schema/default_safe":10,"./js-yaml/schema/failsafe":11,"./js-yaml/schema/json":12,"./js-yaml/type":13}],2:[function(require,module,exports){
'use strict';


function isNothing(subject) {
  return (typeof subject === 'undefined') || (subject === null);
}


function isObject(subject) {
  return (typeof subject === 'object') && (subject !== null);
}


function toArray(sequence) {
  if (Array.isArray(sequence)) return sequence;
  else if (isNothing(sequence)) return [];

  return [ sequence ];
}


function extend(target, source) {
  var index, length, key, sourceKeys;

  if (source) {
    sourceKeys = Object.keys(source);

    for (index = 0, length = sourceKeys.length; index < length; index += 1) {
      key = sourceKeys[index];
      target[key] = source[key];
    }
  }

  return target;
}


function repeat(string, count) {
  var result = '', cycle;

  for (cycle = 0; cycle < count; cycle += 1) {
    result += string;
  }

  return result;
}


function isNegativeZero(number) {
  return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);
}


module.exports.isNothing      = isNothing;
module.exports.isObject       = isObject;
module.exports.toArray        = toArray;
module.exports.repeat         = repeat;
module.exports.isNegativeZero = isNegativeZero;
module.exports.extend         = extend;

},{}],3:[function(require,module,exports){
'use strict';

/*eslint-disable no-use-before-define*/

var common              = require('./common');
var YAMLException       = require('./exception');
var DEFAULT_FULL_SCHEMA = require('./schema/default_full');
var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe');

var _toString       = Object.prototype.toString;
var _hasOwnProperty = Object.prototype.hasOwnProperty;

var CHAR_TAB                  = 0x09; /* Tab */
var CHAR_LINE_FEED            = 0x0A; /* LF */
var CHAR_CARRIAGE_RETURN      = 0x0D; /* CR */
var CHAR_SPACE                = 0x20; /* Space */
var CHAR_EXCLAMATION          = 0x21; /* ! */
var CHAR_DOUBLE_QUOTE         = 0x22; /* " */
var CHAR_SHARP                = 0x23; /* # */
var CHAR_PERCENT              = 0x25; /* % */
var CHAR_AMPERSAND            = 0x26; /* & */
var CHAR_SINGLE_QUOTE         = 0x27; /* ' */
var CHAR_ASTERISK             = 0x2A; /* * */
var CHAR_COMMA                = 0x2C; /* , */
var CHAR_MINUS                = 0x2D; /* - */
var CHAR_COLON                = 0x3A; /* : */
var CHAR_EQUALS               = 0x3D; /* = */
var CHAR_GREATER_THAN         = 0x3E; /* > */
var CHAR_QUESTION             = 0x3F; /* ? */
var CHAR_COMMERCIAL_AT        = 0x40; /* @ */
var CHAR_LEFT_SQUARE_BRACKET  = 0x5B; /* [ */
var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */
var CHAR_GRAVE_ACCENT         = 0x60; /* ` */
var CHAR_LEFT_CURLY_BRACKET   = 0x7B; /* { */
var CHAR_VERTICAL_LINE        = 0x7C; /* | */
var CHAR_RIGHT_CURLY_BRACKET  = 0x7D; /* } */

var ESCAPE_SEQUENCES = {};

ESCAPE_SEQUENCES[0x00]   = '\\0';
ESCAPE_SEQUENCES[0x07]   = '\\a';
ESCAPE_SEQUENCES[0x08]   = '\\b';
ESCAPE_SEQUENCES[0x09]   = '\\t';
ESCAPE_SEQUENCES[0x0A]   = '\\n';
ESCAPE_SEQUENCES[0x0B]   = '\\v';
ESCAPE_SEQUENCES[0x0C]   = '\\f';
ESCAPE_SEQUENCES[0x0D]   = '\\r';
ESCAPE_SEQUENCES[0x1B]   = '\\e';
ESCAPE_SEQUENCES[0x22]   = '\\"';
ESCAPE_SEQUENCES[0x5C]   = '\\\\';
ESCAPE_SEQUENCES[0x85]   = '\\N';
ESCAPE_SEQUENCES[0xA0]   = '\\_';
ESCAPE_SEQUENCES[0x2028] = '\\L';
ESCAPE_SEQUENCES[0x2029] = '\\P';

var DEPRECATED_BOOLEANS_SYNTAX = [
  'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',
  'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'
];

function compileStyleMap(schema, map) {
  var result, keys, index, length, tag, style, type;

  if (map === null) return {};

  result = {};
  keys = Object.keys(map);

  for (index = 0, length = keys.length; index < length; index += 1) {
    tag = keys[index];
    style = String(map[tag]);

    if (tag.slice(0, 2) === '!!') {
      tag = 'tag:yaml.org,2002:' + tag.slice(2);
    }
    type = schema.compiledTypeMap['fallback'][tag];

    if (type && _hasOwnProperty.call(type.styleAliases, style)) {
      style = type.styleAliases[style];
    }

    result[tag] = style;
  }

  return result;
}

function encodeHex(character) {
  var string, handle, length;

  string = character.toString(16).toUpperCase();

  if (character <= 0xFF) {
    handle = 'x';
    length = 2;
  } else if (character <= 0xFFFF) {
    handle = 'u';
    length = 4;
  } else if (character <= 0xFFFFFFFF) {
    handle = 'U';
    length = 8;
  } else {
    throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF');
  }

  return '\\' + handle + common.repeat('0', length - string.length) + string;
}

function State(options) {
  this.schema        = options['schema'] || DEFAULT_FULL_SCHEMA;
  this.indent        = Math.max(1, (options['indent'] || 2));
  this.noArrayIndent = options['noArrayIndent'] || false;
  this.skipInvalid   = options['skipInvalid'] || false;
  this.flowLevel     = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);
  this.styleMap      = compileStyleMap(this.schema, options['styles'] || null);
  this.sortKeys      = options['sortKeys'] || false;
  this.lineWidth     = options['lineWidth'] || 80;
  this.noRefs        = options['noRefs'] || false;
  this.noCompatMode  = options['noCompatMode'] || false;
  this.condenseFlow  = options['condenseFlow'] || false;

  this.implicitTypes = this.schema.compiledImplicit;
  this.explicitTypes = this.schema.compiledExplicit;

  this.tag = null;
  this.result = '';

  this.duplicates = [];
  this.usedDuplicates = null;
}

// Indents every line in a string. Empty lines (\n only) are not indented.
function indentString(string, spaces) {
  var ind = common.repeat(' ', spaces),
      position = 0,
      next = -1,
      result = '',
      line,
      length = string.length;

  while (position < length) {
    next = string.indexOf('\n', position);
    if (next === -1) {
      line = string.slice(position);
      position = length;
    } else {
      line = string.slice(position, next + 1);
      position = next + 1;
    }

    if (line.length && line !== '\n') result += ind;

    result += line;
  }

  return result;
}

function generateNextLine(state, level) {
  return '\n' + common.repeat(' ', state.indent * level);
}

function testImplicitResolving(state, str) {
  var index, length, type;

  for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {
    type = state.implicitTypes[index];

    if (type.resolve(str)) {
      return true;
    }
  }

  return false;
}

// [33] s-white ::= s-space | s-tab
function isWhitespace(c) {
  return c === CHAR_SPACE || c === CHAR_TAB;
}

// Returns true if the character can be printed without escaping.
// From YAML 1.2: "any allowed characters known to be non-printable
// should also be escaped. [However,] This isnâ€™t mandatory"
// Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029.
function isPrintable(c) {
  return  (0x00020 <= c && c <= 0x00007E)
      || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)
      || ((0x0E000 <= c && c <= 0x00FFFD) && c !== 0xFEFF /* BOM */)
      ||  (0x10000 <= c && c <= 0x10FFFF);
}

// [34] ns-char ::= nb-char - s-white
// [27] nb-char ::= c-printable - b-char - c-byte-order-mark
// [26] b-char  ::= b-line-feed | b-carriage-return
// [24] b-line-feed       ::=     #xA    /* LF */
// [25] b-carriage-return ::=     #xD    /* CR */
// [3]  c-byte-order-mark ::=     #xFEFF
function isNsChar(c) {
  return isPrintable(c) && !isWhitespace(c)
    // byte-order-mark
    && c !== 0xFEFF
    // b-char
    && c !== CHAR_CARRIAGE_RETURN
    && c !== CHAR_LINE_FEED;
}

// Simplified test for values allowed after the first character in plain style.
function isPlainSafe(c, prev) {
  // Uses a subset of nb-char - c-flow-indicator - ":" - "#"
  // where nb-char ::= c-printable - b-char - c-byte-order-mark.
  return isPrintable(c) && c !== 0xFEFF
    // - c-flow-indicator
    && c !== CHAR_COMMA
    && c !== CHAR_LEFT_SQUARE_BRACKET
    && c !== CHAR_RIGHT_SQUARE_BRACKET
    && c !== CHAR_LEFT_CURLY_BRACKET
    && c !== CHAR_RIGHT_CURLY_BRACKET
    // - ":" - "#"
    // /* An ns-char preceding */ "#"
    && c !== CHAR_COLON
    && ((c !== CHAR_SHARP) || (prev && isNsChar(prev)));
}

// Simplified test for values allowed as the first character in plain style.
function isPlainSafeFirst(c) {
  // Uses a subset of ns-char - c-indicator
  // where ns-char = nb-char - s-white.
  return isPrintable(c) && c !== 0xFEFF
    && !isWhitespace(c) // - s-white
    // - (c-indicator ::=
    // â€œ-â€� | â€œ?â€� | â€œ:â€� | â€œ,â€� | â€œ[â€� | â€œ]â€� | â€œ{â€� | â€œ}â€�
    && c !== CHAR_MINUS
    && c !== CHAR_QUESTION
    && c !== CHAR_COLON
    && c !== CHAR_COMMA
    && c !== CHAR_LEFT_SQUARE_BRACKET
    && c !== CHAR_RIGHT_SQUARE_BRACKET
    && c !== CHAR_LEFT_CURLY_BRACKET
    && c !== CHAR_RIGHT_CURLY_BRACKET
    // | â€œ#â€� | â€œ&â€� | â€œ*â€� | â€œ!â€� | â€œ|â€� | â€œ=â€� | â€œ>â€� | â€œ'â€� | â€œ"â€�
    && c !== CHAR_SHARP
    && c !== CHAR_AMPERSAND
    && c !== CHAR_ASTERISK
    && c !== CHAR_EXCLAMATION
    && c !== CHAR_VERTICAL_LINE
    && c !== CHAR_EQUALS
    && c !== CHAR_GREATER_THAN
    && c !== CHAR_SINGLE_QUOTE
    && c !== CHAR_DOUBLE_QUOTE
    // | â€œ%â€� | â€œ@â€� | â€œ`â€�)
    && c !== CHAR_PERCENT
    && c !== CHAR_COMMERCIAL_AT
    && c !== CHAR_GRAVE_ACCENT;
}

// Determines whether block indentation indicator is required.
function needIndentIndicator(string) {
  var leadingSpaceRe = /^\n* /;
  return leadingSpaceRe.test(string);
}

var STYLE_PLAIN   = 1,
    STYLE_SINGLE  = 2,
    STYLE_LITERAL = 3,
    STYLE_FOLDED  = 4,
    STYLE_DOUBLE  = 5;

// Determines which scalar styles are possible and returns the preferred style.
// lineWidth = -1 => no limit.
// Pre-conditions: str.length > 0.
// Post-conditions:
//    STYLE_PLAIN or STYLE_SINGLE => no \n are in the string.
//    STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).
//    STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).
function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) {
  var i;
  var char, prev_char;
  var hasLineBreak = false;
  var hasFoldableLine = false; // only checked if shouldTrackWidth
  var shouldTrackWidth = lineWidth !== -1;
  var previousLineBreak = -1; // count the first line correctly
  var plain = isPlainSafeFirst(string.charCodeAt(0))
          && !isWhitespace(string.charCodeAt(string.length - 1));

  if (singleLineOnly) {
    // Case: no block styles.
    // Check for disallowed characters to rule out plain and single.
    for (i = 0; i < string.length; i++) {
      char = string.charCodeAt(i);
      if (!isPrintable(char)) {
        return STYLE_DOUBLE;
      }
      prev_char = i > 0 ? string.charCodeAt(i - 1) : null;
      plain = plain && isPlainSafe(char, prev_char);
    }
  } else {
    // Case: block styles permitted.
    for (i = 0; i < string.length; i++) {
      char = string.charCodeAt(i);
      if (char === CHAR_LINE_FEED) {
        hasLineBreak = true;
        // Check if any line can be folded.
        if (shouldTrackWidth) {
          hasFoldableLine = hasFoldableLine ||
            // Foldable line = too long, and not more-indented.
            (i - previousLineBreak - 1 > lineWidth &&
             string[previousLineBreak + 1] !== ' ');
          previousLineBreak = i;
        }
      } else if (!isPrintable(char)) {
        return STYLE_DOUBLE;
      }
      prev_char = i > 0 ? string.charCodeAt(i - 1) : null;
      plain = plain && isPlainSafe(char, prev_char);
    }
    // in case the end is missing a \n
    hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&
      (i - previousLineBreak - 1 > lineWidth &&
       string[previousLineBreak + 1] !== ' '));
  }
  // Although every style can represent \n without escaping, prefer block styles
  // for multiline, since they're more readable and they don't add empty lines.
  // Also prefer folding a super-long line.
  if (!hasLineBreak && !hasFoldableLine) {
    // Strings interpretable as another type have to be quoted;
    // e.g. the string 'true' vs. the boolean true.
    return plain && !testAmbiguousType(string)
      ? STYLE_PLAIN : STYLE_SINGLE;
  }
  // Edge case: block indentation indicator can only have one digit.
  if (indentPerLevel > 9 && needIndentIndicator(string)) {
    return STYLE_DOUBLE;
  }
  // At this point we know block styles are valid.
  // Prefer literal style unless we want to fold.
  return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;
}

// Note: line breaking/folding is implemented for only the folded style.
// NB. We drop the last trailing newline (if any) of a returned block scalar
//  since the dumper adds its own newline. This always works:
//    â€¢ No ending newline => unaffected; already using strip "-" chomping.
//    â€¢ Ending newline    => removed then restored.
//  Importantly, this keeps the "+" chomp indicator from gaining an extra line.
function writeScalar(state, string, level, iskey) {
  state.dump = (function () {
    if (string.length === 0) {
      return "''";
    }
    if (!state.noCompatMode &&
        DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) {
      return "'" + string + "'";
    }

    var indent = state.indent * Math.max(1, level); // no 0-indent scalars
    // As indentation gets deeper, let the width decrease monotonically
    // to the lower bound min(state.lineWidth, 40).
    // Note that this implies
    //  state.lineWidth â‰¤ 40 + state.indent: width is fixed at the lower bound.
    //  state.lineWidth > 40 + state.indent: width decreases until the lower bound.
    // This behaves better than a constant minimum width which disallows narrower options,
    // or an indent threshold which causes the width to suddenly increase.
    var lineWidth = state.lineWidth === -1
      ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);

    // Without knowing if keys are implicit/explicit, assume implicit for safety.
    var singleLineOnly = iskey
      // No block styles in flow mode.
      || (state.flowLevel > -1 && level >= state.flowLevel);
    function testAmbiguity(string) {
      return testImplicitResolving(state, string);
    }

    switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) {
      case STYLE_PLAIN:
        return string;
      case STYLE_SINGLE:
        return "'" + string.replace(/'/g, "''") + "'";
      case STYLE_LITERAL:
        return '|' + blockHeader(string, state.indent)
          + dropEndingNewline(indentString(string, indent));
      case STYLE_FOLDED:
        return '>' + blockHeader(string, state.indent)
          + dropEndingNewline(indentString(foldString(string, lineWidth), indent));
      case STYLE_DOUBLE:
        return '"' + escapeString(string, lineWidth) + '"';
      default:
        throw new YAMLException('impossible error: invalid scalar style');
    }
  }());
}

// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.
function blockHeader(string, indentPerLevel) {
  var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';

  // note the special case: the string '\n' counts as a "trailing" empty line.
  var clip =          string[string.length - 1] === '\n';
  var keep = clip && (string[string.length - 2] === '\n' || string === '\n');
  var chomp = keep ? '+' : (clip ? '' : '-');

  return indentIndicator + chomp + '\n';
}

// (See the note for writeScalar.)
function dropEndingNewline(string) {
  return string[string.length - 1] === '\n' ? string.slice(0, -1) : string;
}

// Note: a long line without a suitable break point will exceed the width limit.
// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.
function foldString(string, width) {
  // In folded style, $k$ consecutive newlines output as $k+1$ newlinesâ€”
  // unless they're before or after a more-indented line, or at the very
  // beginning or end, in which case $k$ maps to $k$.
  // Therefore, parse each chunk as newline(s) followed by a content line.
  var lineRe = /(\n+)([^\n]*)/g;

  // first line (possibly an empty line)
  var result = (function () {
    var nextLF = string.indexOf('\n');
    nextLF = nextLF !== -1 ? nextLF : string.length;
    lineRe.lastIndex = nextLF;
    return foldLine(string.slice(0, nextLF), width);
  }());
  // If we haven't reached the first content line yet, don't add an extra \n.
  var prevMoreIndented = string[0] === '\n' || string[0] === ' ';
  var moreIndented;

  // rest of the lines
  var match;
  while ((match = lineRe.exec(string))) {
    var prefix = match[1], line = match[2];
    moreIndented = (line[0] === ' ');
    result += prefix
      + (!prevMoreIndented && !moreIndented && line !== ''
        ? '\n' : '')
      + foldLine(line, width);
    prevMoreIndented = moreIndented;
  }

  return result;
}

// Greedy line breaking.
// Picks the longest line under the limit each time,
// otherwise settles for the shortest line over the limit.
// NB. More-indented lines *cannot* be folded, as that would add an extra \n.
function foldLine(line, width) {
  if (line === '' || line[0] === ' ') return line;

  // Since a more-indented line adds a \n, breaks can't be followed by a space.
  var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.
  var match;
  // start is an inclusive index. end, curr, and next are exclusive.
  var start = 0, end, curr = 0, next = 0;
  var result = '';

  // Invariants: 0 <= start <= length-1.
  //   0 <= curr <= next <= max(0, length-2). curr - start <= width.
  // Inside the loop:
  //   A match implies length >= 2, so curr and next are <= length-2.
  while ((match = breakRe.exec(line))) {
    next = match.index;
    // maintain invariant: curr - start <= width
    if (next - start > width) {
      end = (curr > start) ? curr : next; // derive end <= length-2
      result += '\n' + line.slice(start, end);
      // skip the space that was output as \n
      start = end + 1;                    // derive start <= length-1
    }
    curr = next;
  }

  // By the invariants, start <= length-1, so there is something left over.
  // It is either the whole string or a part starting from non-whitespace.
  result += '\n';
  // Insert a break if the remainder is too long and there is a break available.
  if (line.length - start > width && curr > start) {
    result += line.slice(start, curr) + '\n' + line.slice(curr + 1);
  } else {
    result += line.slice(start);
  }

  return result.slice(1); // drop extra \n joiner
}

// Escapes a double-quoted string.
function escapeString(string) {
  var result = '';
  var char, nextChar;
  var escapeSeq;

  for (var i = 0; i < string.length; i++) {
    char = string.charCodeAt(i);
    // Check for surrogate pairs (reference Unicode 3.0 section "3.7 Surrogates").
    if (char >= 0xD800 && char <= 0xDBFF/* high surrogate */) {
      nextChar = string.charCodeAt(i + 1);
      if (nextChar >= 0xDC00 && nextChar <= 0xDFFF/* low surrogate */) {
        // Combine the surrogate pair and store it escaped.
        result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000);
        // Advance index one extra since we already used that char here.
        i++; continue;
      }
    }
    escapeSeq = ESCAPE_SEQUENCES[char];
    result += !escapeSeq && isPrintable(char)
      ? string[i]
      : escapeSeq || encodeHex(char);
  }

  return result;
}

function writeFlowSequence(state, level, object) {
  var _result = '',
      _tag    = state.tag,
      index,
      length;

  for (index = 0, length = object.length; index < length; index += 1) {
    // Write only valid elements.
    if (writeNode(state, level, object[index], false, false)) {
      if (index !== 0) _result += ',' + (!state.condenseFlow ? ' ' : '');
      _result += state.dump;
    }
  }

  state.tag = _tag;
  state.dump = '[' + _result + ']';
}

function writeBlockSequence(state, level, object, compact) {
  var _result = '',
      _tag    = state.tag,
      index,
      length;

  for (index = 0, length = object.length; index < length; index += 1) {
    // Write only valid elements.
    if (writeNode(state, level + 1, object[index], true, true)) {
      if (!compact || index !== 0) {
        _result += generateNextLine(state, level);
      }

      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
        _result += '-';
      } else {
        _result += '- ';
      }

      _result += state.dump;
    }
  }

  state.tag = _tag;
  state.dump = _result || '[]'; // Empty sequence if no valid values.
}

function writeFlowMapping(state, level, object) {
  var _result       = '',
      _tag          = state.tag,
      objectKeyList = Object.keys(object),
      index,
      length,
      objectKey,
      objectValue,
      pairBuffer;

  for (index = 0, length = objectKeyList.length; index < length; index += 1) {

    pairBuffer = '';
    if (index !== 0) pairBuffer += ', ';

    if (state.condenseFlow) pairBuffer += '"';

    objectKey = objectKeyList[index];
    objectValue = object[objectKey];

    if (!writeNode(state, level, objectKey, false, false)) {
      continue; // Skip this pair because of invalid key;
    }

    if (state.dump.length > 1024) pairBuffer += '? ';

    pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' ');

    if (!writeNode(state, level, objectValue, false, false)) {
      continue; // Skip this pair because of invalid value.
    }

    pairBuffer += state.dump;

    // Both key and value are valid.
    _result += pairBuffer;
  }

  state.tag = _tag;
  state.dump = '{' + _result + '}';
}

function writeBlockMapping(state, level, object, compact) {
  var _result       = '',
      _tag          = state.tag,
      objectKeyList = Object.keys(object),
      index,
      length,
      objectKey,
      objectValue,
      explicitPair,
      pairBuffer;

  // Allow sorting keys so that the output file is deterministic
  if (state.sortKeys === true) {
    // Default sorting
    objectKeyList.sort();
  } else if (typeof state.sortKeys === 'function') {
    // Custom sort function
    objectKeyList.sort(state.sortKeys);
  } else if (state.sortKeys) {
    // Something is wrong
    throw new YAMLException('sortKeys must be a boolean or a function');
  }

  for (index = 0, length = objectKeyList.length; index < length; index += 1) {
    pairBuffer = '';

    if (!compact || index !== 0) {
      pairBuffer += generateNextLine(state, level);
    }

    objectKey = objectKeyList[index];
    objectValue = object[objectKey];

    if (!writeNode(state, level + 1, objectKey, true, true, true)) {
      continue; // Skip this pair because of invalid key.
    }

    explicitPair = (state.tag !== null && state.tag !== '?') ||
                   (state.dump && state.dump.length > 1024);

    if (explicitPair) {
      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
        pairBuffer += '?';
      } else {
        pairBuffer += '? ';
      }
    }

    pairBuffer += state.dump;

    if (explicitPair) {
      pairBuffer += generateNextLine(state, level);
    }

    if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {
      continue; // Skip this pair because of invalid value.
    }

    if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
      pairBuffer += ':';
    } else {
      pairBuffer += ': ';
    }

    pairBuffer += state.dump;

    // Both key and value are valid.
    _result += pairBuffer;
  }

  state.tag = _tag;
  state.dump = _result || '{}'; // Empty mapping if no valid pairs.
}

function detectType(state, object, explicit) {
  var _result, typeList, index, length, type, style;

  typeList = explicit ? state.explicitTypes : state.implicitTypes;

  for (index = 0, length = typeList.length; index < length; index += 1) {
    type = typeList[index];

    if ((type.instanceOf  || type.predicate) &&
        (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&
        (!type.predicate  || type.predicate(object))) {

      state.tag = explicit ? type.tag : '?';

      if (type.represent) {
        style = state.styleMap[type.tag] || type.defaultStyle;

        if (_toString.call(type.represent) === '[object Function]') {
          _result = type.represent(object, style);
        } else if (_hasOwnProperty.call(type.represent, style)) {
          _result = type.represent[style](object, style);
        } else {
          throw new YAMLException('!<' + type.tag + '> tag resolver accepts not "' + style + '" style');
        }

        state.dump = _result;
      }

      return true;
    }
  }

  return false;
}

// Serializes `object` and writes it to global `result`.
// Returns true on success, or false on invalid object.
//
function writeNode(state, level, object, block, compact, iskey) {
  state.tag = null;
  state.dump = object;

  if (!detectType(state, object, false)) {
    detectType(state, object, true);
  }

  var type = _toString.call(state.dump);

  if (block) {
    block = (state.flowLevel < 0 || state.flowLevel > level);
  }

  var objectOrArray = type === '[object Object]' || type === '[object Array]',
      duplicateIndex,
      duplicate;

  if (objectOrArray) {
    duplicateIndex = state.duplicates.indexOf(object);
    duplicate = duplicateIndex !== -1;
  }

  if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {
    compact = false;
  }

  if (duplicate && state.usedDuplicates[duplicateIndex]) {
    state.dump = '*ref_' + duplicateIndex;
  } else {
    if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {
      state.usedDuplicates[duplicateIndex] = true;
    }
    if (type === '[object Object]') {
      if (block && (Object.keys(state.dump).length !== 0)) {
        writeBlockMapping(state, level, state.dump, compact);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + state.dump;
        }
      } else {
        writeFlowMapping(state, level, state.dump);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
        }
      }
    } else if (type === '[object Array]') {
      var arrayLevel = (state.noArrayIndent && (level > 0)) ? level - 1 : level;
      if (block && (state.dump.length !== 0)) {
        writeBlockSequence(state, arrayLevel, state.dump, compact);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + state.dump;
        }
      } else {
        writeFlowSequence(state, arrayLevel, state.dump);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
        }
      }
    } else if (type === '[object String]') {
      if (state.tag !== '?') {
        writeScalar(state, state.dump, level, iskey);
      }
    } else {
      if (state.skipInvalid) return false;
      throw new YAMLException('unacceptable kind of an object to dump ' + type);
    }

    if (state.tag !== null && state.tag !== '?') {
      state.dump = '!<' + state.tag + '> ' + state.dump;
    }
  }

  return true;
}

function getDuplicateReferences(object, state) {
  var objects = [],
      duplicatesIndexes = [],
      index,
      length;

  inspectNode(object, objects, duplicatesIndexes);

  for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {
    state.duplicates.push(objects[duplicatesIndexes[index]]);
  }
  state.usedDuplicates = new Array(length);
}

function inspectNode(object, objects, duplicatesIndexes) {
  var objectKeyList,
      index,
      length;

  if (object !== null && typeof object === 'object') {
    index = objects.indexOf(object);
    if (index !== -1) {
      if (duplicatesIndexes.indexOf(index) === -1) {
        duplicatesIndexes.push(index);
      }
    } else {
      objects.push(object);

      if (Array.isArray(object)) {
        for (index = 0, length = object.length; index < length; index += 1) {
          inspectNode(object[index], objects, duplicatesIndexes);
        }
      } else {
        objectKeyList = Object.keys(object);

        for (index = 0, length = objectKeyList.length; index < length; index += 1) {
          inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);
        }
      }
    }
  }
}

function dump(input, options) {
  options = options || {};

  var state = new State(options);

  if (!state.noRefs) getDuplicateReferences(input, state);

  if (writeNode(state, 0, input, true, true)) return state.dump + '\n';

  return '';
}

function safeDump(input, options) {
  return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
}

module.exports.dump     = dump;
module.exports.safeDump = safeDump;

},{"./common":2,"./exception":4,"./schema/default_full":9,"./schema/default_safe":10}],4:[function(require,module,exports){
// YAML error class. http://stackoverflow.com/questions/8458984
//
'use strict';

function YAMLException(reason, mark) {
  // Super constructor
  Error.call(this);

  this.name = 'YAMLException';
  this.reason = reason;
  this.mark = mark;
  this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : '');

  // Include stack trace in error object
  if (Error.captureStackTrace) {
    // Chrome and NodeJS
    Error.captureStackTrace(this, this.constructor);
  } else {
    // FF, IE 10+ and Safari 6+. Fallback for others
    this.stack = (new Error()).stack || '';
  }
}


// Inherit from Error
YAMLException.prototype = Object.create(Error.prototype);
YAMLException.prototype.constructor = YAMLException;


YAMLException.prototype.toString = function toString(compact) {
  var result = this.name + ': ';

  result += this.reason || '(unknown reason)';

  if (!compact && this.mark) {
    result += ' ' + this.mark.toString();
  }

  return result;
};


module.exports = YAMLException;

},{}],5:[function(require,module,exports){
'use strict';

/*eslint-disable max-len,no-use-before-define*/

var common              = require('./common');
var YAMLException       = require('./exception');
var Mark                = require('./mark');
var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe');
var DEFAULT_FULL_SCHEMA = require('./schema/default_full');


var _hasOwnProperty = Object.prototype.hasOwnProperty;


var CONTEXT_FLOW_IN   = 1;
var CONTEXT_FLOW_OUT  = 2;
var CONTEXT_BLOCK_IN  = 3;
var CONTEXT_BLOCK_OUT = 4;


var CHOMPING_CLIP  = 1;
var CHOMPING_STRIP = 2;
var CHOMPING_KEEP  = 3;


var PATTERN_NON_PRINTABLE         = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/;
var PATTERN_FLOW_INDICATORS       = /[,\[\]\{\}]/;
var PATTERN_TAG_HANDLE            = /^(?:!|!!|![a-z\-]+!)$/i;
var PATTERN_TAG_URI               = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;


function _class(obj) { return Object.prototype.toString.call(obj); }

function is_EOL(c) {
  return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);
}

function is_WHITE_SPACE(c) {
  return (c === 0x09/* Tab */) || (c === 0x20/* Space */);
}

function is_WS_OR_EOL(c) {
  return (c === 0x09/* Tab */) ||
         (c === 0x20/* Space */) ||
         (c === 0x0A/* LF */) ||
         (c === 0x0D/* CR */);
}

function is_FLOW_INDICATOR(c) {
  return c === 0x2C/* , */ ||
         c === 0x5B/* [ */ ||
         c === 0x5D/* ] */ ||
         c === 0x7B/* { */ ||
         c === 0x7D/* } */;
}

function fromHexCode(c) {
  var lc;

  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
    return c - 0x30;
  }

  /*eslint-disable no-bitwise*/
  lc = c | 0x20;

  if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {
    return lc - 0x61 + 10;
  }

  return -1;
}

function escapedHexLen(c) {
  if (c === 0x78/* x */) { return 2; }
  if (c === 0x75/* u */) { return 4; }
  if (c === 0x55/* U */) { return 8; }
  return 0;
}

function fromDecimalCode(c) {
  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
    return c - 0x30;
  }

  return -1;
}

function simpleEscapeSequence(c) {
  /* eslint-disable indent */
  return (c === 0x30/* 0 */) ? '\x00' :
        (c === 0x61/* a */) ? '\x07' :
        (c === 0x62/* b */) ? '\x08' :
        (c === 0x74/* t */) ? '\x09' :
        (c === 0x09/* Tab */) ? '\x09' :
        (c === 0x6E/* n */) ? '\x0A' :
        (c === 0x76/* v */) ? '\x0B' :
        (c === 0x66/* f */) ? '\x0C' :
        (c === 0x72/* r */) ? '\x0D' :
        (c === 0x65/* e */) ? '\x1B' :
        (c === 0x20/* Space */) ? ' ' :
        (c === 0x22/* " */) ? '\x22' :
        (c === 0x2F/* / */) ? '/' :
        (c === 0x5C/* \ */) ? '\x5C' :
        (c === 0x4E/* N */) ? '\x85' :
        (c === 0x5F/* _ */) ? '\xA0' :
        (c === 0x4C/* L */) ? '\u2028' :
        (c === 0x50/* P */) ? '\u2029' : '';
}

function charFromCodepoint(c) {
  if (c <= 0xFFFF) {
    return String.fromCharCode(c);
  }
  // Encode UTF-16 surrogate pair
  // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF
  return String.fromCharCode(
    ((c - 0x010000) >> 10) + 0xD800,
    ((c - 0x010000) & 0x03FF) + 0xDC00
  );
}

var simpleEscapeCheck = new Array(256); // integer, for fast access
var simpleEscapeMap = new Array(256);
for (var i = 0; i < 256; i++) {
  simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;
  simpleEscapeMap[i] = simpleEscapeSequence(i);
}


function State(input, options) {
  this.input = input;

  this.filename  = options['filename']  || null;
  this.schema    = options['schema']    || DEFAULT_FULL_SCHEMA;
  this.onWarning = options['onWarning'] || null;
  this.legacy    = options['legacy']    || false;
  this.json      = options['json']      || false;
  this.listener  = options['listener']  || null;

  this.implicitTypes = this.schema.compiledImplicit;
  this.typeMap       = this.schema.compiledTypeMap;

  this.length     = input.length;
  this.position   = 0;
  this.line       = 0;
  this.lineStart  = 0;
  this.lineIndent = 0;

  this.documents = [];

  /*
  this.version;
  this.checkLineBreaks;
  this.tagMap;
  this.anchorMap;
  this.tag;
  this.anchor;
  this.kind;
  this.result;*/

}


function generateError(state, message) {
  return new YAMLException(
    message,
    new Mark(state.filename, state.input, state.position, state.line, (state.position - state.lineStart)));
}

function throwError(state, message) {
  throw generateError(state, message);
}

function throwWarning(state, message) {
  if (state.onWarning) {
    state.onWarning.call(null, generateError(state, message));
  }
}


var directiveHandlers = {

  YAML: function handleYamlDirective(state, name, args) {

    var match, major, minor;

    if (state.version !== null) {
      throwError(state, 'duplication of %YAML directive');
    }

    if (args.length !== 1) {
      throwError(state, 'YAML directive accepts exactly one argument');
    }

    match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]);

    if (match === null) {
      throwError(state, 'ill-formed argument of the YAML directive');
    }

    major = parseInt(match[1], 10);
    minor = parseInt(match[2], 10);

    if (major !== 1) {
      throwError(state, 'unacceptable YAML version of the document');
    }

    state.version = args[0];
    state.checkLineBreaks = (minor < 2);

    if (minor !== 1 && minor !== 2) {
      throwWarning(state, 'unsupported YAML version of the document');
    }
  },

  TAG: function handleTagDirective(state, name, args) {

    var handle, prefix;

    if (args.length !== 2) {
      throwError(state, 'TAG directive accepts exactly two arguments');
    }

    handle = args[0];
    prefix = args[1];

    if (!PATTERN_TAG_HANDLE.test(handle)) {
      throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');
    }

    if (_hasOwnProperty.call(state.tagMap, handle)) {
      throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle');
    }

    if (!PATTERN_TAG_URI.test(prefix)) {
      throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');
    }

    state.tagMap[handle] = prefix;
  }
};


function captureSegment(state, start, end, checkJson) {
  var _position, _length, _character, _result;

  if (start < end) {
    _result = state.input.slice(start, end);

    if (checkJson) {
      for (_position = 0, _length = _result.length; _position < _length; _position += 1) {
        _character = _result.charCodeAt(_position);
        if (!(_character === 0x09 ||
              (0x20 <= _character && _character <= 0x10FFFF))) {
          throwError(state, 'expected valid JSON character');
        }
      }
    } else if (PATTERN_NON_PRINTABLE.test(_result)) {
      throwError(state, 'the stream contains non-printable characters');
    }

    state.result += _result;
  }
}

function mergeMappings(state, destination, source, overridableKeys) {
  var sourceKeys, key, index, quantity;

  if (!common.isObject(source)) {
    throwError(state, 'cannot merge mappings; the provided source object is unacceptable');
  }

  sourceKeys = Object.keys(source);

  for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {
    key = sourceKeys[index];

    if (!_hasOwnProperty.call(destination, key)) {
      destination[key] = source[key];
      overridableKeys[key] = true;
    }
  }
}

function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) {
  var index, quantity;

  // The output is a plain object here, so keys can only be strings.
  // We need to convert keyNode to a string, but doing so can hang the process
  // (deeply nested arrays that explode exponentially using aliases).
  if (Array.isArray(keyNode)) {
    keyNode = Array.prototype.slice.call(keyNode);

    for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {
      if (Array.isArray(keyNode[index])) {
        throwError(state, 'nested arrays are not supported inside keys');
      }

      if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {
        keyNode[index] = '[object Object]';
      }
    }
  }

  // Avoid code execution in load() via toString property
  // (still use its own toString for arrays, timestamps,
  // and whatever user schema extensions happen to have @@toStringTag)
  if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {
    keyNode = '[object Object]';
  }


  keyNode = String(keyNode);

  if (_result === null) {
    _result = {};
  }

  if (keyTag === 'tag:yaml.org,2002:merge') {
    if (Array.isArray(valueNode)) {
      for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {
        mergeMappings(state, _result, valueNode[index], overridableKeys);
      }
    } else {
      mergeMappings(state, _result, valueNode, overridableKeys);
    }
  } else {
    if (!state.json &&
        !_hasOwnProperty.call(overridableKeys, keyNode) &&
        _hasOwnProperty.call(_result, keyNode)) {
      state.line = startLine || state.line;
      state.position = startPos || state.position;
      throwError(state, 'duplicated mapping key');
    }
    _result[keyNode] = valueNode;
    delete overridableKeys[keyNode];
  }

  return _result;
}

function readLineBreak(state) {
  var ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x0A/* LF */) {
    state.position++;
  } else if (ch === 0x0D/* CR */) {
    state.position++;
    if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {
      state.position++;
    }
  } else {
    throwError(state, 'a line break is expected');
  }

  state.line += 1;
  state.lineStart = state.position;
}

function skipSeparationSpace(state, allowComments, checkIndent) {
  var lineBreaks = 0,
      ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    while (is_WHITE_SPACE(ch)) {
      ch = state.input.charCodeAt(++state.position);
    }

    if (allowComments && ch === 0x23/* # */) {
      do {
        ch = state.input.charCodeAt(++state.position);
      } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);
    }

    if (is_EOL(ch)) {
      readLineBreak(state);

      ch = state.input.charCodeAt(state.position);
      lineBreaks++;
      state.lineIndent = 0;

      while (ch === 0x20/* Space */) {
        state.lineIndent++;
        ch = state.input.charCodeAt(++state.position);
      }
    } else {
      break;
    }
  }

  if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {
    throwWarning(state, 'deficient indentation');
  }

  return lineBreaks;
}

function testDocumentSeparator(state) {
  var _position = state.position,
      ch;

  ch = state.input.charCodeAt(_position);

  // Condition state.position === state.lineStart is tested
  // in parent on each call, for efficiency. No needs to test here again.
  if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&
      ch === state.input.charCodeAt(_position + 1) &&
      ch === state.input.charCodeAt(_position + 2)) {

    _position += 3;

    ch = state.input.charCodeAt(_position);

    if (ch === 0 || is_WS_OR_EOL(ch)) {
      return true;
    }
  }

  return false;
}

function writeFoldedLines(state, count) {
  if (count === 1) {
    state.result += ' ';
  } else if (count > 1) {
    state.result += common.repeat('\n', count - 1);
  }
}


function readPlainScalar(state, nodeIndent, withinFlowCollection) {
  var preceding,
      following,
      captureStart,
      captureEnd,
      hasPendingContent,
      _line,
      _lineStart,
      _lineIndent,
      _kind = state.kind,
      _result = state.result,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (is_WS_OR_EOL(ch)      ||
      is_FLOW_INDICATOR(ch) ||
      ch === 0x23/* # */    ||
      ch === 0x26/* & */    ||
      ch === 0x2A/* * */    ||
      ch === 0x21/* ! */    ||
      ch === 0x7C/* | */    ||
      ch === 0x3E/* > */    ||
      ch === 0x27/* ' */    ||
      ch === 0x22/* " */    ||
      ch === 0x25/* % */    ||
      ch === 0x40/* @ */    ||
      ch === 0x60/* ` */) {
    return false;
  }

  if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {
    following = state.input.charCodeAt(state.position + 1);

    if (is_WS_OR_EOL(following) ||
        withinFlowCollection && is_FLOW_INDICATOR(following)) {
      return false;
    }
  }

  state.kind = 'scalar';
  state.result = '';
  captureStart = captureEnd = state.position;
  hasPendingContent = false;

  while (ch !== 0) {
    if (ch === 0x3A/* : */) {
      following = state.input.charCodeAt(state.position + 1);

      if (is_WS_OR_EOL(following) ||
          withinFlowCollection && is_FLOW_INDICATOR(following)) {
        break;
      }

    } else if (ch === 0x23/* # */) {
      preceding = state.input.charCodeAt(state.position - 1);

      if (is_WS_OR_EOL(preceding)) {
        break;
      }

    } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||
               withinFlowCollection && is_FLOW_INDICATOR(ch)) {
      break;

    } else if (is_EOL(ch)) {
      _line = state.line;
      _lineStart = state.lineStart;
      _lineIndent = state.lineIndent;
      skipSeparationSpace(state, false, -1);

      if (state.lineIndent >= nodeIndent) {
        hasPendingContent = true;
        ch = state.input.charCodeAt(state.position);
        continue;
      } else {
        state.position = captureEnd;
        state.line = _line;
        state.lineStart = _lineStart;
        state.lineIndent = _lineIndent;
        break;
      }
    }

    if (hasPendingContent) {
      captureSegment(state, captureStart, captureEnd, false);
      writeFoldedLines(state, state.line - _line);
      captureStart = captureEnd = state.position;
      hasPendingContent = false;
    }

    if (!is_WHITE_SPACE(ch)) {
      captureEnd = state.position + 1;
    }

    ch = state.input.charCodeAt(++state.position);
  }

  captureSegment(state, captureStart, captureEnd, false);

  if (state.result) {
    return true;
  }

  state.kind = _kind;
  state.result = _result;
  return false;
}

function readSingleQuotedScalar(state, nodeIndent) {
  var ch,
      captureStart, captureEnd;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x27/* ' */) {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';
  state.position++;
  captureStart = captureEnd = state.position;

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    if (ch === 0x27/* ' */) {
      captureSegment(state, captureStart, state.position, true);
      ch = state.input.charCodeAt(++state.position);

      if (ch === 0x27/* ' */) {
        captureStart = state.position;
        state.position++;
        captureEnd = state.position;
      } else {
        return true;
      }

    } else if (is_EOL(ch)) {
      captureSegment(state, captureStart, captureEnd, true);
      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
      captureStart = captureEnd = state.position;

    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
      throwError(state, 'unexpected end of the document within a single quoted scalar');

    } else {
      state.position++;
      captureEnd = state.position;
    }
  }

  throwError(state, 'unexpected end of the stream within a single quoted scalar');
}

function readDoubleQuotedScalar(state, nodeIndent) {
  var captureStart,
      captureEnd,
      hexLength,
      hexResult,
      tmp,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x22/* " */) {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';
  state.position++;
  captureStart = captureEnd = state.position;

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    if (ch === 0x22/* " */) {
      captureSegment(state, captureStart, state.position, true);
      state.position++;
      return true;

    } else if (ch === 0x5C/* \ */) {
      captureSegment(state, captureStart, state.position, true);
      ch = state.input.charCodeAt(++state.position);

      if (is_EOL(ch)) {
        skipSeparationSpace(state, false, nodeIndent);

        // TODO: rework to inline fn with no type cast?
      } else if (ch < 256 && simpleEscapeCheck[ch]) {
        state.result += simpleEscapeMap[ch];
        state.position++;

      } else if ((tmp = escapedHexLen(ch)) > 0) {
        hexLength = tmp;
        hexResult = 0;

        for (; hexLength > 0; hexLength--) {
          ch = state.input.charCodeAt(++state.position);

          if ((tmp = fromHexCode(ch)) >= 0) {
            hexResult = (hexResult << 4) + tmp;

          } else {
            throwError(state, 'expected hexadecimal character');
          }
        }

        state.result += charFromCodepoint(hexResult);

        state.position++;

      } else {
        throwError(state, 'unknown escape sequence');
      }

      captureStart = captureEnd = state.position;

    } else if (is_EOL(ch)) {
      captureSegment(state, captureStart, captureEnd, true);
      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
      captureStart = captureEnd = state.position;

    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
      throwError(state, 'unexpected end of the document within a double quoted scalar');

    } else {
      state.position++;
      captureEnd = state.position;
    }
  }

  throwError(state, 'unexpected end of the stream within a double quoted scalar');
}

function readFlowCollection(state, nodeIndent) {
  var readNext = true,
      _line,
      _tag     = state.tag,
      _result,
      _anchor  = state.anchor,
      following,
      terminator,
      isPair,
      isExplicitPair,
      isMapping,
      overridableKeys = {},
      keyNode,
      keyTag,
      valueNode,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x5B/* [ */) {
    terminator = 0x5D;/* ] */
    isMapping = false;
    _result = [];
  } else if (ch === 0x7B/* { */) {
    terminator = 0x7D;/* } */
    isMapping = true;
    _result = {};
  } else {
    return false;
  }

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(++state.position);

  while (ch !== 0) {
    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if (ch === terminator) {
      state.position++;
      state.tag = _tag;
      state.anchor = _anchor;
      state.kind = isMapping ? 'mapping' : 'sequence';
      state.result = _result;
      return true;
    } else if (!readNext) {
      throwError(state, 'missed comma between flow collection entries');
    }

    keyTag = keyNode = valueNode = null;
    isPair = isExplicitPair = false;

    if (ch === 0x3F/* ? */) {
      following = state.input.charCodeAt(state.position + 1);

      if (is_WS_OR_EOL(following)) {
        isPair = isExplicitPair = true;
        state.position++;
        skipSeparationSpace(state, true, nodeIndent);
      }
    }

    _line = state.line;
    composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
    keyTag = state.tag;
    keyNode = state.result;
    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {
      isPair = true;
      ch = state.input.charCodeAt(++state.position);
      skipSeparationSpace(state, true, nodeIndent);
      composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
      valueNode = state.result;
    }

    if (isMapping) {
      storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode);
    } else if (isPair) {
      _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode));
    } else {
      _result.push(keyNode);
    }

    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if (ch === 0x2C/* , */) {
      readNext = true;
      ch = state.input.charCodeAt(++state.position);
    } else {
      readNext = false;
    }
  }

  throwError(state, 'unexpected end of the stream within a flow collection');
}

function readBlockScalar(state, nodeIndent) {
  var captureStart,
      folding,
      chomping       = CHOMPING_CLIP,
      didReadContent = false,
      detectedIndent = false,
      textIndent     = nodeIndent,
      emptyLines     = 0,
      atMoreIndented = false,
      tmp,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x7C/* | */) {
    folding = false;
  } else if (ch === 0x3E/* > */) {
    folding = true;
  } else {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';

  while (ch !== 0) {
    ch = state.input.charCodeAt(++state.position);

    if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {
      if (CHOMPING_CLIP === chomping) {
        chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;
      } else {
        throwError(state, 'repeat of a chomping mode identifier');
      }

    } else if ((tmp = fromDecimalCode(ch)) >= 0) {
      if (tmp === 0) {
        throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');
      } else if (!detectedIndent) {
        textIndent = nodeIndent + tmp - 1;
        detectedIndent = true;
      } else {
        throwError(state, 'repeat of an indentation width identifier');
      }

    } else {
      break;
    }
  }

  if (is_WHITE_SPACE(ch)) {
    do { ch = state.input.charCodeAt(++state.position); }
    while (is_WHITE_SPACE(ch));

    if (ch === 0x23/* # */) {
      do { ch = state.input.charCodeAt(++state.position); }
      while (!is_EOL(ch) && (ch !== 0));
    }
  }

  while (ch !== 0) {
    readLineBreak(state);
    state.lineIndent = 0;

    ch = state.input.charCodeAt(state.position);

    while ((!detectedIndent || state.lineIndent < textIndent) &&
           (ch === 0x20/* Space */)) {
      state.lineIndent++;
      ch = state.input.charCodeAt(++state.position);
    }

    if (!detectedIndent && state.lineIndent > textIndent) {
      textIndent = state.lineIndent;
    }

    if (is_EOL(ch)) {
      emptyLines++;
      continue;
    }

    // End of the scalar.
    if (state.lineIndent < textIndent) {

      // Perform the chomping.
      if (chomping === CHOMPING_KEEP) {
        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
      } else if (chomping === CHOMPING_CLIP) {
        if (didReadContent) { // i.e. only if the scalar is not empty.
          state.result += '\n';
        }
      }

      // Break this `while` cycle and go to the funciton's epilogue.
      break;
    }

    // Folded style: use fancy rules to handle line breaks.
    if (folding) {

      // Lines starting with white space characters (more-indented lines) are not folded.
      if (is_WHITE_SPACE(ch)) {
        atMoreIndented = true;
        // except for the first content line (cf. Example 8.1)
        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);

      // End of more-indented block.
      } else if (atMoreIndented) {
        atMoreIndented = false;
        state.result += common.repeat('\n', emptyLines + 1);

      // Just one line break - perceive as the same line.
      } else if (emptyLines === 0) {
        if (didReadContent) { // i.e. only if we have already read some scalar content.
          state.result += ' ';
        }

      // Several line breaks - perceive as different lines.
      } else {
        state.result += common.repeat('\n', emptyLines);
      }

    // Literal style: just add exact number of line breaks between content lines.
    } else {
      // Keep all line breaks except the header line break.
      state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
    }

    didReadContent = true;
    detectedIndent = true;
    emptyLines = 0;
    captureStart = state.position;

    while (!is_EOL(ch) && (ch !== 0)) {
      ch = state.input.charCodeAt(++state.position);
    }

    captureSegment(state, captureStart, state.position, false);
  }

  return true;
}

function readBlockSequence(state, nodeIndent) {
  var _line,
      _tag      = state.tag,
      _anchor   = state.anchor,
      _result   = [],
      following,
      detected  = false,
      ch;

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {

    if (ch !== 0x2D/* - */) {
      break;
    }

    following = state.input.charCodeAt(state.position + 1);

    if (!is_WS_OR_EOL(following)) {
      break;
    }

    detected = true;
    state.position++;

    if (skipSeparationSpace(state, true, -1)) {
      if (state.lineIndent <= nodeIndent) {
        _result.push(null);
        ch = state.input.charCodeAt(state.position);
        continue;
      }
    }

    _line = state.line;
    composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);
    _result.push(state.result);
    skipSeparationSpace(state, true, -1);

    ch = state.input.charCodeAt(state.position);

    if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {
      throwError(state, 'bad indentation of a sequence entry');
    } else if (state.lineIndent < nodeIndent) {
      break;
    }
  }

  if (detected) {
    state.tag = _tag;
    state.anchor = _anchor;
    state.kind = 'sequence';
    state.result = _result;
    return true;
  }
  return false;
}

function readBlockMapping(state, nodeIndent, flowIndent) {
  var following,
      allowCompact,
      _line,
      _pos,
      _tag          = state.tag,
      _anchor       = state.anchor,
      _result       = {},
      overridableKeys = {},
      keyTag        = null,
      keyNode       = null,
      valueNode     = null,
      atExplicitKey = false,
      detected      = false,
      ch;

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    following = state.input.charCodeAt(state.position + 1);
    _line = state.line; // Save the current line.
    _pos = state.position;

    //
    // Explicit notation case. There are two separate blocks:
    // first for the key (denoted by "?") and second for the value (denoted by ":")
    //
    if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {

      if (ch === 0x3F/* ? */) {
        if (atExplicitKey) {
          storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
          keyTag = keyNode = valueNode = null;
        }

        detected = true;
        atExplicitKey = true;
        allowCompact = true;

      } else if (atExplicitKey) {
        // i.e. 0x3A/* : */ === character after the explicit key.
        atExplicitKey = false;
        allowCompact = true;

      } else {
        throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');
      }

      state.position += 1;
      ch = following;

    //
    // Implicit notation case. Flow-style node as the key first, then ":", and the value.
    //
    } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {

      if (state.line === _line) {
        ch = state.input.charCodeAt(state.position);

        while (is_WHITE_SPACE(ch)) {
          ch = state.input.charCodeAt(++state.position);
        }

        if (ch === 0x3A/* : */) {
          ch = state.input.charCodeAt(++state.position);

          if (!is_WS_OR_EOL(ch)) {
            throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');
          }

          if (atExplicitKey) {
            storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
            keyTag = keyNode = valueNode = null;
          }

          detected = true;
          atExplicitKey = false;
          allowCompact = false;
          keyTag = state.tag;
          keyNode = state.result;

        } else if (detected) {
          throwError(state, 'can not read an implicit mapping pair; a colon is missed');

        } else {
          state.tag = _tag;
          state.anchor = _anchor;
          return true; // Keep the result of `composeNode`.
        }

      } else if (detected) {
        throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');

      } else {
        state.tag = _tag;
        state.anchor = _anchor;
        return true; // Keep the result of `composeNode`.
      }

    } else {
      break; // Reading is done. Go to the epilogue.
    }

    //
    // Common reading code for both explicit and implicit notations.
    //
    if (state.line === _line || state.lineIndent > nodeIndent) {
      if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {
        if (atExplicitKey) {
          keyNode = state.result;
        } else {
          valueNode = state.result;
        }
      }

      if (!atExplicitKey) {
        storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos);
        keyTag = keyNode = valueNode = null;
      }

      skipSeparationSpace(state, true, -1);
      ch = state.input.charCodeAt(state.position);
    }

    if (state.lineIndent > nodeIndent && (ch !== 0)) {
      throwError(state, 'bad indentation of a mapping entry');
    } else if (state.lineIndent < nodeIndent) {
      break;
    }
  }

  //
  // Epilogue.
  //

  // Special case: last mapping's node contains only the key in explicit notation.
  if (atExplicitKey) {
    storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
  }

  // Expose the resulting mapping.
  if (detected) {
    state.tag = _tag;
    state.anchor = _anchor;
    state.kind = 'mapping';
    state.result = _result;
  }

  return detected;
}

function readTagProperty(state) {
  var _position,
      isVerbatim = false,
      isNamed    = false,
      tagHandle,
      tagName,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x21/* ! */) return false;

  if (state.tag !== null) {
    throwError(state, 'duplication of a tag property');
  }

  ch = state.input.charCodeAt(++state.position);

  if (ch === 0x3C/* < */) {
    isVerbatim = true;
    ch = state.input.charCodeAt(++state.position);

  } else if (ch === 0x21/* ! */) {
    isNamed = true;
    tagHandle = '!!';
    ch = state.input.charCodeAt(++state.position);

  } else {
    tagHandle = '!';
  }

  _position = state.position;

  if (isVerbatim) {
    do { ch = state.input.charCodeAt(++state.position); }
    while (ch !== 0 && ch !== 0x3E/* > */);

    if (state.position < state.length) {
      tagName = state.input.slice(_position, state.position);
      ch = state.input.charCodeAt(++state.position);
    } else {
      throwError(state, 'unexpected end of the stream within a verbatim tag');
    }
  } else {
    while (ch !== 0 && !is_WS_OR_EOL(ch)) {

      if (ch === 0x21/* ! */) {
        if (!isNamed) {
          tagHandle = state.input.slice(_position - 1, state.position + 1);

          if (!PATTERN_TAG_HANDLE.test(tagHandle)) {
            throwError(state, 'named tag handle cannot contain such characters');
          }

          isNamed = true;
          _position = state.position + 1;
        } else {
          throwError(state, 'tag suffix cannot contain exclamation marks');
        }
      }

      ch = state.input.charCodeAt(++state.position);
    }

    tagName = state.input.slice(_position, state.position);

    if (PATTERN_FLOW_INDICATORS.test(tagName)) {
      throwError(state, 'tag suffix cannot contain flow indicator characters');
    }
  }

  if (tagName && !PATTERN_TAG_URI.test(tagName)) {
    throwError(state, 'tag name cannot contain such characters: ' + tagName);
  }

  if (isVerbatim) {
    state.tag = tagName;

  } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) {
    state.tag = state.tagMap[tagHandle] + tagName;

  } else if (tagHandle === '!') {
    state.tag = '!' + tagName;

  } else if (tagHandle === '!!') {
    state.tag = 'tag:yaml.org,2002:' + tagName;

  } else {
    throwError(state, 'undeclared tag handle "' + tagHandle + '"');
  }

  return true;
}

function readAnchorProperty(state) {
  var _position,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x26/* & */) return false;

  if (state.anchor !== null) {
    throwError(state, 'duplication of an anchor property');
  }

  ch = state.input.charCodeAt(++state.position);
  _position = state.position;

  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
    ch = state.input.charCodeAt(++state.position);
  }

  if (state.position === _position) {
    throwError(state, 'name of an anchor node must contain at least one character');
  }

  state.anchor = state.input.slice(_position, state.position);
  return true;
}

function readAlias(state) {
  var _position, alias,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x2A/* * */) return false;

  ch = state.input.charCodeAt(++state.position);
  _position = state.position;

  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
    ch = state.input.charCodeAt(++state.position);
  }

  if (state.position === _position) {
    throwError(state, 'name of an alias node must contain at least one character');
  }

  alias = state.input.slice(_position, state.position);

  if (!state.anchorMap.hasOwnProperty(alias)) {
    throwError(state, 'unidentified alias "' + alias + '"');
  }

  state.result = state.anchorMap[alias];
  skipSeparationSpace(state, true, -1);
  return true;
}

function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {
  var allowBlockStyles,
      allowBlockScalars,
      allowBlockCollections,
      indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent
      atNewLine  = false,
      hasContent = false,
      typeIndex,
      typeQuantity,
      type,
      flowIndent,
      blockIndent;

  if (state.listener !== null) {
    state.listener('open', state);
  }

  state.tag    = null;
  state.anchor = null;
  state.kind   = null;
  state.result = null;

  allowBlockStyles = allowBlockScalars = allowBlockCollections =
    CONTEXT_BLOCK_OUT === nodeContext ||
    CONTEXT_BLOCK_IN  === nodeContext;

  if (allowToSeek) {
    if (skipSeparationSpace(state, true, -1)) {
      atNewLine = true;

      if (state.lineIndent > parentIndent) {
        indentStatus = 1;
      } else if (state.lineIndent === parentIndent) {
        indentStatus = 0;
      } else if (state.lineIndent < parentIndent) {
        indentStatus = -1;
      }
    }
  }

  if (indentStatus === 1) {
    while (readTagProperty(state) || readAnchorProperty(state)) {
      if (skipSeparationSpace(state, true, -1)) {
        atNewLine = true;
        allowBlockCollections = allowBlockStyles;

        if (state.lineIndent > parentIndent) {
          indentStatus = 1;
        } else if (state.lineIndent === parentIndent) {
          indentStatus = 0;
        } else if (state.lineIndent < parentIndent) {
          indentStatus = -1;
        }
      } else {
        allowBlockCollections = false;
      }
    }
  }

  if (allowBlockCollections) {
    allowBlockCollections = atNewLine || allowCompact;
  }

  if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {
    if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {
      flowIndent = parentIndent;
    } else {
      flowIndent = parentIndent + 1;
    }

    blockIndent = state.position - state.lineStart;

    if (indentStatus === 1) {
      if (allowBlockCollections &&
          (readBlockSequence(state, blockIndent) ||
           readBlockMapping(state, blockIndent, flowIndent)) ||
          readFlowCollection(state, flowIndent)) {
        hasContent = true;
      } else {
        if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||
            readSingleQuotedScalar(state, flowIndent) ||
            readDoubleQuotedScalar(state, flowIndent)) {
          hasContent = true;

        } else if (readAlias(state)) {
          hasContent = true;

          if (state.tag !== null || state.anchor !== null) {
            throwError(state, 'alias node should not have any properties');
          }

        } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {
          hasContent = true;

          if (state.tag === null) {
            state.tag = '?';
          }
        }

        if (state.anchor !== null) {
          state.anchorMap[state.anchor] = state.result;
        }
      }
    } else if (indentStatus === 0) {
      // Special case: block sequences are allowed to have same indentation level as the parent.
      // http://www.yaml.org/spec/1.2/spec.html#id2799784
      hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);
    }
  }

  if (state.tag !== null && state.tag !== '!') {
    if (state.tag === '?') {
      // Implicit resolving is not allowed for non-scalar types, and '?'
      // non-specific tag is only automatically assigned to plain scalars.
      //
      // We only need to check kind conformity in case user explicitly assigns '?'
      // tag, for example like this: "!<?> [0]"
      //
      if (state.result !== null && state.kind !== 'scalar') {
        throwError(state, 'unacceptable node kind for !<?> tag; it should be "scalar", not "' + state.kind + '"');
      }

      for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {
        type = state.implicitTypes[typeIndex];

        if (type.resolve(state.result)) { // `state.result` updated in resolver if matched
          state.result = type.construct(state.result);
          state.tag = type.tag;
          if (state.anchor !== null) {
            state.anchorMap[state.anchor] = state.result;
          }
          break;
        }
      }
    } else if (_hasOwnProperty.call(state.typeMap[state.kind || 'fallback'], state.tag)) {
      type = state.typeMap[state.kind || 'fallback'][state.tag];

      if (state.result !== null && type.kind !== state.kind) {
        throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"');
      }

      if (!type.resolve(state.result)) { // `state.result` updated in resolver if matched
        throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');
      } else {
        state.result = type.construct(state.result);
        if (state.anchor !== null) {
          state.anchorMap[state.anchor] = state.result;
        }
      }
    } else {
      throwError(state, 'unknown tag !<' + state.tag + '>');
    }
  }

  if (state.listener !== null) {
    state.listener('close', state);
  }
  return state.tag !== null ||  state.anchor !== null || hasContent;
}

function readDocument(state) {
  var documentStart = state.position,
      _position,
      directiveName,
      directiveArgs,
      hasDirectives = false,
      ch;

  state.version = null;
  state.checkLineBreaks = state.legacy;
  state.tagMap = {};
  state.anchorMap = {};

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    skipSeparationSpace(state, true, -1);

    ch = state.input.charCodeAt(state.position);

    if (state.lineIndent > 0 || ch !== 0x25/* % */) {
      break;
    }

    hasDirectives = true;
    ch = state.input.charCodeAt(++state.position);
    _position = state.position;

    while (ch !== 0 && !is_WS_OR_EOL(ch)) {
      ch = state.input.charCodeAt(++state.position);
    }

    directiveName = state.input.slice(_position, state.position);
    directiveArgs = [];

    if (directiveName.length < 1) {
      throwError(state, 'directive name must not be less than one character in length');
    }

    while (ch !== 0) {
      while (is_WHITE_SPACE(ch)) {
        ch = state.input.charCodeAt(++state.position);
      }

      if (ch === 0x23/* # */) {
        do { ch = state.input.charCodeAt(++state.position); }
        while (ch !== 0 && !is_EOL(ch));
        break;
      }

      if (is_EOL(ch)) break;

      _position = state.position;

      while (ch !== 0 && !is_WS_OR_EOL(ch)) {
        ch = state.input.charCodeAt(++state.position);
      }

      directiveArgs.push(state.input.slice(_position, state.position));
    }

    if (ch !== 0) readLineBreak(state);

    if (_hasOwnProperty.call(directiveHandlers, directiveName)) {
      directiveHandlers[directiveName](state, directiveName, directiveArgs);
    } else {
      throwWarning(state, 'unknown document directive "' + directiveName + '"');
    }
  }

  skipSeparationSpace(state, true, -1);

  if (state.lineIndent === 0 &&
      state.input.charCodeAt(state.position)     === 0x2D/* - */ &&
      state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&
      state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {
    state.position += 3;
    skipSeparationSpace(state, true, -1);

  } else if (hasDirectives) {
    throwError(state, 'directives end mark is expected');
  }

  composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);
  skipSeparationSpace(state, true, -1);

  if (state.checkLineBreaks &&
      PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {
    throwWarning(state, 'non-ASCII line breaks are interpreted as content');
  }

  state.documents.push(state.result);

  if (state.position === state.lineStart && testDocumentSeparator(state)) {

    if (state.input.charCodeAt(state.position) === 0x2E/* . */) {
      state.position += 3;
      skipSeparationSpace(state, true, -1);
    }
    return;
  }

  if (state.position < (state.length - 1)) {
    throwError(state, 'end of the stream or a document separator is expected');
  } else {
    return;
  }
}


function loadDocuments(input, options) {
  input = String(input);
  options = options || {};

  if (input.length !== 0) {

    // Add tailing `\n` if not exists
    if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&
        input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {
      input += '\n';
    }

    // Strip BOM
    if (input.charCodeAt(0) === 0xFEFF) {
      input = input.slice(1);
    }
  }

  var state = new State(input, options);

  var nullpos = input.indexOf('\0');

  if (nullpos !== -1) {
    state.position = nullpos;
    throwError(state, 'null byte is not allowed in input');
  }

  // Use 0 as string terminator. That significantly simplifies bounds check.
  state.input += '\0';

  while (state.input.charCodeAt(state.position) === 0x20/* Space */) {
    state.lineIndent += 1;
    state.position += 1;
  }

  while (state.position < (state.length - 1)) {
    readDocument(state);
  }

  return state.documents;
}


function loadAll(input, iterator, options) {
  if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {
    options = iterator;
    iterator = null;
  }

  var documents = loadDocuments(input, options);

  if (typeof iterator !== 'function') {
    return documents;
  }

  for (var index = 0, length = documents.length; index < length; index += 1) {
    iterator(documents[index]);
  }
}


function load(input, options) {
  var documents = loadDocuments(input, options);

  if (documents.length === 0) {
    /*eslint-disable no-undefined*/
    return undefined;
  } else if (documents.length === 1) {
    return documents[0];
  }
  throw new YAMLException('expected a single document in the stream, but found more');
}


function safeLoadAll(input, iterator, options) {
  if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') {
    options = iterator;
    iterator = null;
  }

  return loadAll(input, iterator, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
}


function safeLoad(input, options) {
  return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
}


module.exports.loadAll     = loadAll;
module.exports.load        = load;
module.exports.safeLoadAll = safeLoadAll;
module.exports.safeLoad    = safeLoad;

},{"./common":2,"./exception":4,"./mark":6,"./schema/default_full":9,"./schema/default_safe":10}],6:[function(require,module,exports){
'use strict';


var common = require('./common');


function Mark(name, buffer, position, line, column) {
  this.name     = name;
  this.buffer   = buffer;
  this.position = position;
  this.line     = line;
  this.column   = column;
}


Mark.prototype.getSnippet = function getSnippet(indent, maxLength) {
  var head, start, tail, end, snippet;

  if (!this.buffer) return null;

  indent = indent || 4;
  maxLength = maxLength || 75;

  head = '';
  start = this.position;

  while (start > 0 && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(start - 1)) === -1) {
    start -= 1;
    if (this.position - start > (maxLength / 2 - 1)) {
      head = ' ... ';
      start += 5;
      break;
    }
  }

  tail = '';
  end = this.position;

  while (end < this.buffer.length && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(end)) === -1) {
    end += 1;
    if (end - this.position > (maxLength / 2 - 1)) {
      tail = ' ... ';
      end -= 5;
      break;
    }
  }

  snippet = this.buffer.slice(start, end);

  return common.repeat(' ', indent) + head + snippet + tail + '\n' +
         common.repeat(' ', indent + this.position - start + head.length) + '^';
};


Mark.prototype.toString = function toString(compact) {
  var snippet, where = '';

  if (this.name) {
    where += 'in "' + this.name + '" ';
  }

  where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1);

  if (!compact) {
    snippet = this.getSnippet();

    if (snippet) {
      where += ':\n' + snippet;
    }
  }

  return where;
};


module.exports = Mark;

},{"./common":2}],7:[function(require,module,exports){
'use strict';

/*eslint-disable max-len*/

var common        = require('./common');
var YAMLException = require('./exception');
var Type          = require('./type');


function compileList(schema, name, result) {
  var exclude = [];

  schema.include.forEach(function (includedSchema) {
    result = compileList(includedSchema, name, result);
  });

  schema[name].forEach(function (currentType) {
    result.forEach(function (previousType, previousIndex) {
      if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) {
        exclude.push(previousIndex);
      }
    });

    result.push(currentType);
  });

  return result.filter(function (type, index) {
    return exclude.indexOf(index) === -1;
  });
}


function compileMap(/* lists... */) {
  var result = {
        scalar: {},
        sequence: {},
        mapping: {},
        fallback: {}
      }, index, length;

  function collectType(type) {
    result[type.kind][type.tag] = result['fallback'][type.tag] = type;
  }

  for (index = 0, length = arguments.length; index < length; index += 1) {
    arguments[index].forEach(collectType);
  }
  return result;
}


function Schema(definition) {
  this.include  = definition.include  || [];
  this.implicit = definition.implicit || [];
  this.explicit = definition.explicit || [];

  this.implicit.forEach(function (type) {
    if (type.loadKind && type.loadKind !== 'scalar') {
      throw new YAMLException('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');
    }
  });

  this.compiledImplicit = compileList(this, 'implicit', []);
  this.compiledExplicit = compileList(this, 'explicit', []);
  this.compiledTypeMap  = compileMap(this.compiledImplicit, this.compiledExplicit);
}


Schema.DEFAULT = null;


Schema.create = function createSchema() {
  var schemas, types;

  switch (arguments.length) {
    case 1:
      schemas = Schema.DEFAULT;
      types = arguments[0];
      break;

    case 2:
      schemas = arguments[0];
      types = arguments[1];
      break;

    default:
      throw new YAMLException('Wrong number of arguments for Schema.create function');
  }

  schemas = common.toArray(schemas);
  types = common.toArray(types);

  if (!schemas.every(function (schema) { return schema instanceof Schema; })) {
    throw new YAMLException('Specified list of super schemas (or a single Schema object) contains a non-Schema object.');
  }

  if (!types.every(function (type) { return type instanceof Type; })) {
    throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.');
  }

  return new Schema({
    include: schemas,
    explicit: types
  });
};


module.exports = Schema;

},{"./common":2,"./exception":4,"./type":13}],8:[function(require,module,exports){
// Standard YAML's Core schema.
// http://www.yaml.org/spec/1.2/spec.html#id2804923
//
// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.
// So, Core schema has no distinctions from JSON schema is JS-YAML.


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  include: [
    require('./json')
  ]
});

},{"../schema":7,"./json":12}],9:[function(require,module,exports){
// JS-YAML's default schema for `load` function.
// It is not described in the YAML specification.
//
// This schema is based on JS-YAML's default safe schema and includes
// JavaScript-specific types: !!js/undefined, !!js/regexp and !!js/function.
//
// Also this schema is used as default base schema at `Schema.create` function.


'use strict';


var Schema = require('../schema');


module.exports = Schema.DEFAULT = new Schema({
  include: [
    require('./default_safe')
  ],
  explicit: [
    require('../type/js/undefined'),
    require('../type/js/regexp'),
    require('../type/js/function')
  ]
});

},{"../schema":7,"../type/js/function":18,"../type/js/regexp":19,"../type/js/undefined":20,"./default_safe":10}],10:[function(require,module,exports){
// JS-YAML's default schema for `safeLoad` function.
// It is not described in the YAML specification.
//
// This schema is based on standard YAML's Core schema and includes most of
// extra types described at YAML tag repository. (http://yaml.org/type/)


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  include: [
    require('./core')
  ],
  implicit: [
    require('../type/timestamp'),
    require('../type/merge')
  ],
  explicit: [
    require('../type/binary'),
    require('../type/omap'),
    require('../type/pairs'),
    require('../type/set')
  ]
});

},{"../schema":7,"../type/binary":14,"../type/merge":22,"../type/omap":24,"../type/pairs":25,"../type/set":27,"../type/timestamp":29,"./core":8}],11:[function(require,module,exports){
// Standard YAML's Failsafe schema.
// http://www.yaml.org/spec/1.2/spec.html#id2802346


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  explicit: [
    require('../type/str'),
    require('../type/seq'),
    require('../type/map')
  ]
});

},{"../schema":7,"../type/map":21,"../type/seq":26,"../type/str":28}],12:[function(require,module,exports){
// Standard YAML's JSON schema.
// http://www.yaml.org/spec/1.2/spec.html#id2803231
//
// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.
// So, this schema is not such strict as defined in the YAML specification.
// It allows numbers in binary notaion, use `Null` and `NULL` as `null`, etc.


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  include: [
    require('./failsafe')
  ],
  implicit: [
    require('../type/null'),
    require('../type/bool'),
    require('../type/int'),
    require('../type/float')
  ]
});

},{"../schema":7,"../type/bool":15,"../type/float":16,"../type/int":17,"../type/null":23,"./failsafe":11}],13:[function(require,module,exports){
'use strict';

var YAMLException = require('./exception');

var TYPE_CONSTRUCTOR_OPTIONS = [
  'kind',
  'resolve',
  'construct',
  'instanceOf',
  'predicate',
  'represent',
  'defaultStyle',
  'styleAliases'
];

var YAML_NODE_KINDS = [
  'scalar',
  'sequence',
  'mapping'
];

function compileStyleAliases(map) {
  var result = {};

  if (map !== null) {
    Object.keys(map).forEach(function (style) {
      map[style].forEach(function (alias) {
        result[String(alias)] = style;
      });
    });
  }

  return result;
}

function Type(tag, options) {
  options = options || {};

  Object.keys(options).forEach(function (name) {
    if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {
      throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.');
    }
  });

  // TODO: Add tag format check.
  this.tag          = tag;
  this.kind         = options['kind']         || null;
  this.resolve      = options['resolve']      || function () { return true; };
  this.construct    = options['construct']    || function (data) { return data; };
  this.instanceOf   = options['instanceOf']   || null;
  this.predicate    = options['predicate']    || null;
  this.represent    = options['represent']    || null;
  this.defaultStyle = options['defaultStyle'] || null;
  this.styleAliases = compileStyleAliases(options['styleAliases'] || null);

  if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {
    throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
  }
}

module.exports = Type;

},{"./exception":4}],14:[function(require,module,exports){
'use strict';

/*eslint-disable no-bitwise*/

var NodeBuffer;

try {
  // A trick for browserified version, to not include `Buffer` shim
  var _require = require;
  NodeBuffer = _require('buffer').Buffer;
} catch (__) {}

var Type       = require('../type');


// [ 64, 65, 66 ] -> [ padding, CR, LF ]
var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r';


function resolveYamlBinary(data) {
  if (data === null) return false;

  var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;

  // Convert one by one.
  for (idx = 0; idx < max; idx++) {
    code = map.indexOf(data.charAt(idx));

    // Skip CR/LF
    if (code > 64) continue;

    // Fail on illegal characters
    if (code < 0) return false;

    bitlen += 6;
  }

  // If there are any bits left, source was corrupted
  return (bitlen % 8) === 0;
}

function constructYamlBinary(data) {
  var idx, tailbits,
      input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan
      max = input.length,
      map = BASE64_MAP,
      bits = 0,
      result = [];

  // Collect by 6*4 bits (3 bytes)

  for (idx = 0; idx < max; idx++) {
    if ((idx % 4 === 0) && idx) {
      result.push((bits >> 16) & 0xFF);
      result.push((bits >> 8) & 0xFF);
      result.push(bits & 0xFF);
    }

    bits = (bits << 6) | map.indexOf(input.charAt(idx));
  }

  // Dump tail

  tailbits = (max % 4) * 6;

  if (tailbits === 0) {
    result.push((bits >> 16) & 0xFF);
    result.push((bits >> 8) & 0xFF);
    result.push(bits & 0xFF);
  } else if (tailbits === 18) {
    result.push((bits >> 10) & 0xFF);
    result.push((bits >> 2) & 0xFF);
  } else if (tailbits === 12) {
    result.push((bits >> 4) & 0xFF);
  }

  // Wrap into Buffer for NodeJS and leave Array for browser
  if (NodeBuffer) {
    // Support node 6.+ Buffer API when available
    return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result);
  }

  return result;
}

function representYamlBinary(object /*, style*/) {
  var result = '', bits = 0, idx, tail,
      max = object.length,
      map = BASE64_MAP;

  // Convert every three bytes to 4 ASCII characters.

  for (idx = 0; idx < max; idx++) {
    if ((idx % 3 === 0) && idx) {
      result += map[(bits >> 18) & 0x3F];
      result += map[(bits >> 12) & 0x3F];
      result += map[(bits >> 6) & 0x3F];
      result += map[bits & 0x3F];
    }

    bits = (bits << 8) + object[idx];
  }

  // Dump tail

  tail = max % 3;

  if (tail === 0) {
    result += map[(bits >> 18) & 0x3F];
    result += map[(bits >> 12) & 0x3F];
    result += map[(bits >> 6) & 0x3F];
    result += map[bits & 0x3F];
  } else if (tail === 2) {
    result += map[(bits >> 10) & 0x3F];
    result += map[(bits >> 4) & 0x3F];
    result += map[(bits << 2) & 0x3F];
    result += map[64];
  } else if (tail === 1) {
    result += map[(bits >> 2) & 0x3F];
    result += map[(bits << 4) & 0x3F];
    result += map[64];
    result += map[64];
  }

  return result;
}

function isBinary(object) {
  return NodeBuffer && NodeBuffer.isBuffer(object);
}

module.exports = new Type('tag:yaml.org,2002:binary', {
  kind: 'scalar',
  resolve: resolveYamlBinary,
  construct: constructYamlBinary,
  predicate: isBinary,
  represent: representYamlBinary
});

},{"../type":13}],15:[function(require,module,exports){
'use strict';

var Type = require('../type');

function resolveYamlBoolean(data) {
  if (data === null) return false;

  var max = data.length;

  return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||
         (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));
}

function constructYamlBoolean(data) {
  return data === 'true' ||
         data === 'True' ||
         data === 'TRUE';
}

function isBoolean(object) {
  return Object.prototype.toString.call(object) === '[object Boolean]';
}

module.exports = new Type('tag:yaml.org,2002:bool', {
  kind: 'scalar',
  resolve: resolveYamlBoolean,
  construct: constructYamlBoolean,
  predicate: isBoolean,
  represent: {
    lowercase: function (object) { return object ? 'true' : 'false'; },
    uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },
    camelcase: function (object) { return object ? 'True' : 'False'; }
  },
  defaultStyle: 'lowercase'
});

},{"../type":13}],16:[function(require,module,exports){
'use strict';

var common = require('../common');
var Type   = require('../type');

var YAML_FLOAT_PATTERN = new RegExp(
  // 2.5e4, 2.5 and integers
  '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +
  // .2e4, .2
  // special case, seems not from spec
  '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +
  // 20:59
  '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' +
  // .inf
  '|[-+]?\\.(?:inf|Inf|INF)' +
  // .nan
  '|\\.(?:nan|NaN|NAN))$');

function resolveYamlFloat(data) {
  if (data === null) return false;

  if (!YAML_FLOAT_PATTERN.test(data) ||
      // Quick hack to not allow integers end with `_`
      // Probably should update regexp & check speed
      data[data.length - 1] === '_') {
    return false;
  }

  return true;
}

function constructYamlFloat(data) {
  var value, sign, base, digits;

  value  = data.replace(/_/g, '').toLowerCase();
  sign   = value[0] === '-' ? -1 : 1;
  digits = [];

  if ('+-'.indexOf(value[0]) >= 0) {
    value = value.slice(1);
  }

  if (value === '.inf') {
    return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;

  } else if (value === '.nan') {
    return NaN;

  } else if (value.indexOf(':') >= 0) {
    value.split(':').forEach(function (v) {
      digits.unshift(parseFloat(v, 10));
    });

    value = 0.0;
    base = 1;

    digits.forEach(function (d) {
      value += d * base;
      base *= 60;
    });

    return sign * value;

  }
  return sign * parseFloat(value, 10);
}


var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;

function representYamlFloat(object, style) {
  var res;

  if (isNaN(object)) {
    switch (style) {
      case 'lowercase': return '.nan';
      case 'uppercase': return '.NAN';
      case 'camelcase': return '.NaN';
    }
  } else if (Number.POSITIVE_INFINITY === object) {
    switch (style) {
      case 'lowercase': return '.inf';
      case 'uppercase': return '.INF';
      case 'camelcase': return '.Inf';
    }
  } else if (Number.NEGATIVE_INFINITY === object) {
    switch (style) {
      case 'lowercase': return '-.inf';
      case 'uppercase': return '-.INF';
      case 'camelcase': return '-.Inf';
    }
  } else if (common.isNegativeZero(object)) {
    return '-0.0';
  }

  res = object.toString(10);

  // JS stringifier can build scientific format without dots: 5e-100,
  // while YAML requres dot: 5.e-100. Fix it with simple hack

  return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;
}

function isFloat(object) {
  return (Object.prototype.toString.call(object) === '[object Number]') &&
         (object % 1 !== 0 || common.isNegativeZero(object));
}

module.exports = new Type('tag:yaml.org,2002:float', {
  kind: 'scalar',
  resolve: resolveYamlFloat,
  construct: constructYamlFloat,
  predicate: isFloat,
  represent: representYamlFloat,
  defaultStyle: 'lowercase'
});

},{"../common":2,"../type":13}],17:[function(require,module,exports){
'use strict';

var common = require('../common');
var Type   = require('../type');

function isHexCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||
         ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||
         ((0x61/* a */ <= c) && (c <= 0x66/* f */));
}

function isOctCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));
}

function isDecCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));
}

function resolveYamlInteger(data) {
  if (data === null) return false;

  var max = data.length,
      index = 0,
      hasDigits = false,
      ch;

  if (!max) return false;

  ch = data[index];

  // sign
  if (ch === '-' || ch === '+') {
    ch = data[++index];
  }

  if (ch === '0') {
    // 0
    if (index + 1 === max) return true;
    ch = data[++index];

    // base 2, base 8, base 16

    if (ch === 'b') {
      // base 2
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (ch !== '0' && ch !== '1') return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }


    if (ch === 'x') {
      // base 16
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (!isHexCode(data.charCodeAt(index))) return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }

    // base 8
    for (; index < max; index++) {
      ch = data[index];
      if (ch === '_') continue;
      if (!isOctCode(data.charCodeAt(index))) return false;
      hasDigits = true;
    }
    return hasDigits && ch !== '_';
  }

  // base 10 (except 0) or base 60

  // value should not start with `_`;
  if (ch === '_') return false;

  for (; index < max; index++) {
    ch = data[index];
    if (ch === '_') continue;
    if (ch === ':') break;
    if (!isDecCode(data.charCodeAt(index))) {
      return false;
    }
    hasDigits = true;
  }

  // Should have digits and should not end with `_`
  if (!hasDigits || ch === '_') return false;

  // if !base60 - done;
  if (ch !== ':') return true;

  // base60 almost not used, no needs to optimize
  return /^(:[0-5]?[0-9])+$/.test(data.slice(index));
}

function constructYamlInteger(data) {
  var value = data, sign = 1, ch, base, digits = [];

  if (value.indexOf('_') !== -1) {
    value = value.replace(/_/g, '');
  }

  ch = value[0];

  if (ch === '-' || ch === '+') {
    if (ch === '-') sign = -1;
    value = value.slice(1);
    ch = value[0];
  }

  if (value === '0') return 0;

  if (ch === '0') {
    if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);
    if (value[1] === 'x') return sign * parseInt(value, 16);
    return sign * parseInt(value, 8);
  }

  if (value.indexOf(':') !== -1) {
    value.split(':').forEach(function (v) {
      digits.unshift(parseInt(v, 10));
    });

    value = 0;
    base = 1;

    digits.forEach(function (d) {
      value += (d * base);
      base *= 60;
    });

    return sign * value;

  }

  return sign * parseInt(value, 10);
}

function isInteger(object) {
  return (Object.prototype.toString.call(object)) === '[object Number]' &&
         (object % 1 === 0 && !common.isNegativeZero(object));
}

module.exports = new Type('tag:yaml.org,2002:int', {
  kind: 'scalar',
  resolve: resolveYamlInteger,
  construct: constructYamlInteger,
  predicate: isInteger,
  represent: {
    binary:      function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },
    octal:       function (obj) { return obj >= 0 ? '0'  + obj.toString(8) : '-0'  + obj.toString(8).slice(1); },
    decimal:     function (obj) { return obj.toString(10); },
    /* eslint-disable max-len */
    hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() :  '-0x' + obj.toString(16).toUpperCase().slice(1); }
  },
  defaultStyle: 'decimal',
  styleAliases: {
    binary:      [ 2,  'bin' ],
    octal:       [ 8,  'oct' ],
    decimal:     [ 10, 'dec' ],
    hexadecimal: [ 16, 'hex' ]
  }
});

},{"../common":2,"../type":13}],18:[function(require,module,exports){
'use strict';

var esprima;

// Browserified version does not have esprima
//
// 1. For node.js just require module as deps
// 2. For browser try to require mudule via external AMD system.
//    If not found - try to fallback to window.esprima. If not
//    found too - then fail to parse.
//
try {
  // workaround to exclude package from browserify list.
  var _require = require;
  esprima = _require('esprima');
} catch (_) {
  /* eslint-disable no-redeclare */
  /* global window */
  if (typeof window !== 'undefined') esprima = window.esprima;
}

var Type = require('../../type');

function resolveJavascriptFunction(data) {
  if (data === null) return false;

  try {
    var source = '(' + data + ')',
        ast    = esprima.parse(source, { range: true });

    if (ast.type                    !== 'Program'             ||
        ast.body.length             !== 1                     ||
        ast.body[0].type            !== 'ExpressionStatement' ||
        (ast.body[0].expression.type !== 'ArrowFunctionExpression' &&
          ast.body[0].expression.type !== 'FunctionExpression')) {
      return false;
    }

    return true;
  } catch (err) {
    return false;
  }
}

function constructJavascriptFunction(data) {
  /*jslint evil:true*/

  var source = '(' + data + ')',
      ast    = esprima.parse(source, { range: true }),
      params = [],
      body;

  if (ast.type                    !== 'Program'             ||
      ast.body.length             !== 1                     ||
      ast.body[0].type            !== 'ExpressionStatement' ||
      (ast.body[0].expression.type !== 'ArrowFunctionExpression' &&
        ast.body[0].expression.type !== 'FunctionExpression')) {
    throw new Error('Failed to resolve function');
  }

  ast.body[0].expression.params.forEach(function (param) {
    params.push(param.name);
  });

  body = ast.body[0].expression.body.range;

  // Esprima's ranges include the first '{' and the last '}' characters on
  // function expressions. So cut them out.
  if (ast.body[0].expression.body.type === 'BlockStatement') {
    /*eslint-disable no-new-func*/
    return new Function(params, source.slice(body[0] + 1, body[1] - 1));
  }
  // ES6 arrow functions can omit the BlockStatement. In that case, just return
  // the body.
  /*eslint-disable no-new-func*/
  return new Function(params, 'return ' + source.slice(body[0], body[1]));
}

function representJavascriptFunction(object /*, style*/) {
  return object.toString();
}

function isFunction(object) {
  return Object.prototype.toString.call(object) === '[object Function]';
}

module.exports = new Type('tag:yaml.org,2002:js/function', {
  kind: 'scalar',
  resolve: resolveJavascriptFunction,
  construct: constructJavascriptFunction,
  predicate: isFunction,
  represent: representJavascriptFunction
});

},{"../../type":13}],19:[function(require,module,exports){
'use strict';

var Type = require('../../type');

function resolveJavascriptRegExp(data) {
  if (data === null) return false;
  if (data.length === 0) return false;

  var regexp = data,
      tail   = /\/([gim]*)$/.exec(data),
      modifiers = '';

  // if regexp starts with '/' it can have modifiers and must be properly closed
  // `/foo/gim` - modifiers tail can be maximum 3 chars
  if (regexp[0] === '/') {
    if (tail) modifiers = tail[1];

    if (modifiers.length > 3) return false;
    // if expression starts with /, is should be properly terminated
    if (regexp[regexp.length - modifiers.length - 1] !== '/') return false;
  }

  return true;
}

function constructJavascriptRegExp(data) {
  var regexp = data,
      tail   = /\/([gim]*)$/.exec(data),
      modifiers = '';

  // `/foo/gim` - tail can be maximum 4 chars
  if (regexp[0] === '/') {
    if (tail) modifiers = tail[1];
    regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
  }

  return new RegExp(regexp, modifiers);
}

function representJavascriptRegExp(object /*, style*/) {
  var result = '/' + object.source + '/';

  if (object.global) result += 'g';
  if (object.multiline) result += 'm';
  if (object.ignoreCase) result += 'i';

  return result;
}

function isRegExp(object) {
  return Object.prototype.toString.call(object) === '[object RegExp]';
}

module.exports = new Type('tag:yaml.org,2002:js/regexp', {
  kind: 'scalar',
  resolve: resolveJavascriptRegExp,
  construct: constructJavascriptRegExp,
  predicate: isRegExp,
  represent: representJavascriptRegExp
});

},{"../../type":13}],20:[function(require,module,exports){
'use strict';

var Type = require('../../type');

function resolveJavascriptUndefined() {
  return true;
}

function constructJavascriptUndefined() {
  /*eslint-disable no-undefined*/
  return undefined;
}

function representJavascriptUndefined() {
  return '';
}

function isUndefined(object) {
  return typeof object === 'undefined';
}

module.exports = new Type('tag:yaml.org,2002:js/undefined', {
  kind: 'scalar',
  resolve: resolveJavascriptUndefined,
  construct: constructJavascriptUndefined,
  predicate: isUndefined,
  represent: representJavascriptUndefined
});

},{"../../type":13}],21:[function(require,module,exports){
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:map', {
  kind: 'mapping',
  construct: function (data) { return data !== null ? data : {}; }
});

},{"../type":13}],22:[function(require,module,exports){
'use strict';

var Type = require('../type');

function resolveYamlMerge(data) {
  return data === '<<' || data === null;
}

module.exports = new Type('tag:yaml.org,2002:merge', {
  kind: 'scalar',
  resolve: resolveYamlMerge
});

},{"../type":13}],23:[function(require,module,exports){
'use strict';

var Type = require('../type');

function resolveYamlNull(data) {
  if (data === null) return true;

  var max = data.length;

  return (max === 1 && data === '~') ||
         (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));
}

function constructYamlNull() {
  return null;
}

function isNull(object) {
  return object === null;
}

module.exports = new Type('tag:yaml.org,2002:null', {
  kind: 'scalar',
  resolve: resolveYamlNull,
  construct: constructYamlNull,
  predicate: isNull,
  represent: {
    canonical: function () { return '~';    },
    lowercase: function () { return 'null'; },
    uppercase: function () { return 'NULL'; },
    camelcase: function () { return 'Null'; }
  },
  defaultStyle: 'lowercase'
});

},{"../type":13}],24:[function(require,module,exports){
'use strict';

var Type = require('../type');

var _hasOwnProperty = Object.prototype.hasOwnProperty;
var _toString       = Object.prototype.toString;

function resolveYamlOmap(data) {
  if (data === null) return true;

  var objectKeys = [], index, length, pair, pairKey, pairHasKey,
      object = data;

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];
    pairHasKey = false;

    if (_toString.call(pair) !== '[object Object]') return false;

    for (pairKey in pair) {
      if (_hasOwnProperty.call(pair, pairKey)) {
        if (!pairHasKey) pairHasKey = true;
        else return false;
      }
    }

    if (!pairHasKey) return false;

    if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);
    else return false;
  }

  return true;
}

function constructYamlOmap(data) {
  return data !== null ? data : [];
}

module.exports = new Type('tag:yaml.org,2002:omap', {
  kind: 'sequence',
  resolve: resolveYamlOmap,
  construct: constructYamlOmap
});

},{"../type":13}],25:[function(require,module,exports){
'use strict';

var Type = require('../type');

var _toString = Object.prototype.toString;

function resolveYamlPairs(data) {
  if (data === null) return true;

  var index, length, pair, keys, result,
      object = data;

  result = new Array(object.length);

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];

    if (_toString.call(pair) !== '[object Object]') return false;

    keys = Object.keys(pair);

    if (keys.length !== 1) return false;

    result[index] = [ keys[0], pair[keys[0]] ];
  }

  return true;
}

function constructYamlPairs(data) {
  if (data === null) return [];

  var index, length, pair, keys, result,
      object = data;

  result = new Array(object.length);

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];

    keys = Object.keys(pair);

    result[index] = [ keys[0], pair[keys[0]] ];
  }

  return result;
}

module.exports = new Type('tag:yaml.org,2002:pairs', {
  kind: 'sequence',
  resolve: resolveYamlPairs,
  construct: constructYamlPairs
});

},{"../type":13}],26:[function(require,module,exports){
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:seq', {
  kind: 'sequence',
  construct: function (data) { return data !== null ? data : []; }
});

},{"../type":13}],27:[function(require,module,exports){
'use strict';

var Type = require('../type');

var _hasOwnProperty = Object.prototype.hasOwnProperty;

function resolveYamlSet(data) {
  if (data === null) return true;

  var key, object = data;

  for (key in object) {
    if (_hasOwnProperty.call(object, key)) {
      if (object[key] !== null) return false;
    }
  }

  return true;
}

function constructYamlSet(data) {
  return data !== null ? data : {};
}

module.exports = new Type('tag:yaml.org,2002:set', {
  kind: 'mapping',
  resolve: resolveYamlSet,
  construct: constructYamlSet
});

},{"../type":13}],28:[function(require,module,exports){
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:str', {
  kind: 'scalar',
  construct: function (data) { return data !== null ? data : ''; }
});

},{"../type":13}],29:[function(require,module,exports){
'use strict';

var Type = require('../type');

var YAML_DATE_REGEXP = new RegExp(
  '^([0-9][0-9][0-9][0-9])'          + // [1] year
  '-([0-9][0-9])'                    + // [2] month
  '-([0-9][0-9])$');                   // [3] day

var YAML_TIMESTAMP_REGEXP = new RegExp(
  '^([0-9][0-9][0-9][0-9])'          + // [1] year
  '-([0-9][0-9]?)'                   + // [2] month
  '-([0-9][0-9]?)'                   + // [3] day
  '(?:[Tt]|[ \\t]+)'                 + // ...
  '([0-9][0-9]?)'                    + // [4] hour
  ':([0-9][0-9])'                    + // [5] minute
  ':([0-9][0-9])'                    + // [6] second
  '(?:\\.([0-9]*))?'                 + // [7] fraction
  '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour
  '(?::([0-9][0-9]))?))?$');           // [11] tz_minute

function resolveYamlTimestamp(data) {
  if (data === null) return false;
  if (YAML_DATE_REGEXP.exec(data) !== null) return true;
  if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;
  return false;
}

function constructYamlTimestamp(data) {
  var match, year, month, day, hour, minute, second, fraction = 0,
      delta = null, tz_hour, tz_minute, date;

  match = YAML_DATE_REGEXP.exec(data);
  if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);

  if (match === null) throw new Error('Date resolve error');

  // match: [1] year [2] month [3] day

  year = +(match[1]);
  month = +(match[2]) - 1; // JS month starts with 0
  day = +(match[3]);

  if (!match[4]) { // no hour
    return new Date(Date.UTC(year, month, day));
  }

  // match: [4] hour [5] minute [6] second [7] fraction

  hour = +(match[4]);
  minute = +(match[5]);
  second = +(match[6]);

  if (match[7]) {
    fraction = match[7].slice(0, 3);
    while (fraction.length < 3) { // milli-seconds
      fraction += '0';
    }
    fraction = +fraction;
  }

  // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute

  if (match[9]) {
    tz_hour = +(match[10]);
    tz_minute = +(match[11] || 0);
    delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds
    if (match[9] === '-') delta = -delta;
  }

  date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));

  if (delta) date.setTime(date.getTime() - delta);

  return date;
}

function representYamlTimestamp(object /*, style*/) {
  return object.toISOString();
}

module.exports = new Type('tag:yaml.org,2002:timestamp', {
  kind: 'scalar',
  resolve: resolveYamlTimestamp,
  construct: constructYamlTimestamp,
  instanceOf: Date,
  represent: representYamlTimestamp
});

},{"../type":13}],"/":[function(require,module,exports){
'use strict';


var yaml = require('./lib/js-yaml.js');


module.exports = yaml;

},{"./lib/js-yaml.js":1}]},{},[])("/")
});
!function(e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).jsyaml=e()}(function(){return function o(a,s,c){function u(t,e){if(!s[t]){if(!a[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(l)return l(t,!0);var i=new Error("Cannot find module '"+t+"'");throw i.code="MODULE_NOT_FOUND",i}var r=s[t]={exports:{}};a[t][0].call(r.exports,function(e){return u(a[t][1][e]||e)},r,r.exports,o,a,s,c)}return s[t].exports}for(var l="function"==typeof require&&require,e=0;e<c.length;e++)u(c[e]);return u}({1:[function(e,t,n){"use strict";var i=e("./js-yaml/loader"),r=e("./js-yaml/dumper");function o(e){return function(){throw new Error("Function "+e+" is deprecated and cannot be used.")}}t.exports.Type=e("./js-yaml/type"),t.exports.Schema=e("./js-yaml/schema"),t.exports.FAILSAFE_SCHEMA=e("./js-yaml/schema/failsafe"),t.exports.JSON_SCHEMA=e("./js-yaml/schema/json"),t.exports.CORE_SCHEMA=e("./js-yaml/schema/core"),t.exports.DEFAULT_SAFE_SCHEMA=e("./js-yaml/schema/default_safe"),t.exports.DEFAULT_FULL_SCHEMA=e("./js-yaml/schema/default_full"),t.exports.load=i.load,t.exports.loadAll=i.loadAll,t.exports.safeLoad=i.safeLoad,t.exports.safeLoadAll=i.safeLoadAll,t.exports.dump=r.dump,t.exports.safeDump=r.safeDump,t.exports.YAMLException=e("./js-yaml/exception"),t.exports.MINIMAL_SCHEMA=e("./js-yaml/schema/failsafe"),t.exports.SAFE_SCHEMA=e("./js-yaml/schema/default_safe"),t.exports.DEFAULT_SCHEMA=e("./js-yaml/schema/default_full"),t.exports.scan=o("scan"),t.exports.parse=o("parse"),t.exports.compose=o("compose"),t.exports.addConstructor=o("addConstructor")},{"./js-yaml/dumper":3,"./js-yaml/exception":4,"./js-yaml/loader":5,"./js-yaml/schema":7,"./js-yaml/schema/core":8,"./js-yaml/schema/default_full":9,"./js-yaml/schema/default_safe":10,"./js-yaml/schema/failsafe":11,"./js-yaml/schema/json":12,"./js-yaml/type":13}],2:[function(e,t,n){"use strict";function i(e){return null==e}t.exports.isNothing=i,t.exports.isObject=function(e){return"object"==typeof e&&null!==e},t.exports.toArray=function(e){return Array.isArray(e)?e:i(e)?[]:[e]},t.exports.repeat=function(e,t){for(var n="",i=0;i<t;i+=1)n+=e;return n},t.exports.isNegativeZero=function(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e},t.exports.extend=function(e,t){var n,i,r,o;if(t)for(n=0,i=(o=Object.keys(t)).length;n<i;n+=1)e[r=o[n]]=t[r];return e}},{}],3:[function(e,t,n){"use strict";var c=e("./common"),d=e("./exception"),i=e("./schema/default_full"),r=e("./schema/default_safe"),p=Object.prototype.toString,u=Object.prototype.hasOwnProperty,o=9,h=10,a=13,s=32,m=33,g=34,y=35,x=37,v=38,A=39,b=42,w=44,C=45,k=58,j=61,S=62,I=63,O=64,E=91,F=93,_=96,N=123,M=124,T=125,l={0:"\\0",7:"\\a",8:"\\b",9:"\\t",10:"\\n",11:"\\v",12:"\\f",13:"\\r",27:"\\e",34:'\\"',92:"\\\\",133:"\\N",160:"\\_",8232:"\\L",8233:"\\P"},f=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function L(e){var t,n,i=e.toString(16).toUpperCase();if(e<=255)t="x",n=2;else if(e<=65535)t="u",n=4;else{if(!(e<=4294967295))throw new d("code point within a string may not be greater than 0xFFFFFFFF");t="U",n=8}return"\\"+t+c.repeat("0",n-i.length)+i}function D(e){this.schema=e.schema||i,this.indent=Math.max(1,e.indent||2),this.noArrayIndent=e.noArrayIndent||!1,this.skipInvalid=e.skipInvalid||!1,this.flowLevel=c.isNothing(e.flowLevel)?-1:e.flowLevel,this.styleMap=function(e,t){var n,i,r,o,a,s,c;if(null===t)return{};for(n={},r=0,o=(i=Object.keys(t)).length;r<o;r+=1)a=i[r],s=String(t[a]),"!!"===a.slice(0,2)&&(a="tag:yaml.org,2002:"+a.slice(2)),(c=e.compiledTypeMap.fallback[a])&&u.call(c.styleAliases,s)&&(s=c.styleAliases[s]),n[a]=s;return n}(this.schema,e.styles||null),this.sortKeys=e.sortKeys||!1,this.lineWidth=e.lineWidth||80,this.noRefs=e.noRefs||!1,this.noCompatMode=e.noCompatMode||!1,this.condenseFlow=e.condenseFlow||!1,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function U(e,t){for(var n,i=c.repeat(" ",t),r=0,o=-1,a="",s=e.length;r<s;)r=-1===(o=e.indexOf("\n",r))?(n=e.slice(r),s):(n=e.slice(r,o+1),o+1),n.length&&"\n"!==n&&(a+=i),a+=n;return a}function q(e,t){return"\n"+c.repeat(" ",e.indent*t)}function Y(e){return e===s||e===o}function R(e){return 32<=e&&e<=126||161<=e&&e<=55295&&8232!==e&&8233!==e||57344<=e&&e<=65533&&65279!==e||65536<=e&&e<=1114111}function B(e,t){return R(e)&&65279!==e&&e!==w&&e!==E&&e!==F&&e!==N&&e!==T&&e!==k&&(e!==y||t&&(R(n=t)&&!Y(n)&&65279!==n&&n!==a&&n!==h));var n}function P(e){return/^\n* /.test(e)}var W=1,K=2,$=3,H=4,G=5;function V(e,t,n,i,r){var o,a,s,c,u=!1,l=!1,p=-1!==i,f=-1,d=R(c=e.charCodeAt(0))&&65279!==c&&!Y(c)&&c!==C&&c!==I&&c!==k&&c!==w&&c!==E&&c!==F&&c!==N&&c!==T&&c!==y&&c!==v&&c!==b&&c!==m&&c!==M&&c!==j&&c!==S&&c!==A&&c!==g&&c!==x&&c!==O&&c!==_&&!Y(e.charCodeAt(e.length-1));if(t)for(o=0;o<e.length;o++){if(!R(a=e.charCodeAt(o)))return G;s=0<o?e.charCodeAt(o-1):null,d=d&&B(a,s)}else{for(o=0;o<e.length;o++){if((a=e.charCodeAt(o))===h)u=!0,p&&(l=l||i<o-f-1&&" "!==e[f+1],f=o);else if(!R(a))return G;s=0<o?e.charCodeAt(o-1):null,d=d&&B(a,s)}l=l||p&&i<o-f-1&&" "!==e[f+1]}return u||l?9<n&&P(e)?G:l?H:$:d&&!r(e)?W:K}function Z(i,r,o,a){i.dump=function(){if(0===r.length)return"''";if(!i.noCompatMode&&-1!==f.indexOf(r))return"'"+r+"'";var e=i.indent*Math.max(1,o),t=-1===i.lineWidth?-1:Math.max(Math.min(i.lineWidth,40),i.lineWidth-e),n=a||-1<i.flowLevel&&o>=i.flowLevel;switch(V(r,n,i.indent,t,function(e){return function(e,t){for(var n=0,i=e.implicitTypes.length;n<i;n+=1)if(e.implicitTypes[n].resolve(t))return!0;return!1}(i,e)})){case W:return r;case K:return"'"+r.replace(/'/g,"''")+"'";case $:return"|"+z(r,i.indent)+J(U(r,e));case H:return">"+z(r,i.indent)+J(U(function(t,n){var e,i,r=/(\n+)([^\n]*)/g,o=function(){var e=-1!==(e=t.indexOf("\n"))?e:t.length;return r.lastIndex=e,Q(t.slice(0,e),n)}(),a="\n"===t[0]||" "===t[0];for(;i=r.exec(t);){var s=i[1],c=i[2];e=" "===c[0],o+=s+(a||e||""===c?"":"\n")+Q(c,n),a=e}return o}(r,t),e));case G:return'"'+function(e){for(var t,n,i,r="",o=0;o<e.length;o++)55296<=(t=e.charCodeAt(o))&&t<=56319&&56320<=(n=e.charCodeAt(o+1))&&n<=57343?(r+=L(1024*(t-55296)+n-56320+65536),o++):(i=l[t],r+=!i&&R(t)?e[o]:i||L(t));return r}(r)+'"';default:throw new d("impossible error: invalid scalar style")}}()}function z(e,t){var n=P(e)?String(t):"",i="\n"===e[e.length-1];return n+(i&&("\n"===e[e.length-2]||"\n"===e)?"+":i?"":"-")+"\n"}function J(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function Q(e,t){if(""===e||" "===e[0])return e;for(var n,i,r=/ [^ ]/g,o=0,a=0,s=0,c="";n=r.exec(e);)t<(s=n.index)-o&&(i=o<a?a:s,c+="\n"+e.slice(o,i),o=i+1),a=s;return c+="\n",e.length-o>t&&o<a?c+=e.slice(o,a)+"\n"+e.slice(a+1):c+=e.slice(o),c.slice(1)}function X(e,t,n){for(var i,r,o,a=n?e.explicitTypes:e.implicitTypes,s=0,c=a.length;s<c;s+=1)if(((r=a[s]).instanceOf||r.predicate)&&(!r.instanceOf||"object"==typeof t&&t instanceof r.instanceOf)&&(!r.predicate||r.predicate(t))){if(e.tag=n?r.tag:"?",r.represent){if(o=e.styleMap[r.tag]||r.defaultStyle,"[object Function]"===p.call(r.represent))i=r.represent(t,o);else{if(!u.call(r.represent,o))throw new d("!<"+r.tag+'> tag resolver accepts not "'+o+'" style');i=r.represent[o](t,o)}e.dump=i}return 1}}function ee(e,t,n,i,r,o){e.tag=null,e.dump=n,X(e,n,!1)||X(e,n,!0);var a=p.call(e.dump);i=i&&(e.flowLevel<0||e.flowLevel>t);var s,c,u="[object Object]"===a||"[object Array]"===a;if(u&&(c=-1!==(s=e.duplicates.indexOf(n))),(null!==e.tag&&"?"!==e.tag||c||2!==e.indent&&0<t)&&(r=!1),c&&e.usedDuplicates[s])e.dump="*ref_"+s;else{if(u&&c&&!e.usedDuplicates[s]&&(e.usedDuplicates[s]=!0),"[object Object]"===a)i&&0!==Object.keys(e.dump).length?(function(e,t,n,i){var r,o,a,s,c,u,l="",p=e.tag,f=Object.keys(n);if(!0===e.sortKeys)f.sort();else if("function"==typeof e.sortKeys)f.sort(e.sortKeys);else if(e.sortKeys)throw new d("sortKeys must be a boolean or a function");for(r=0,o=f.length;r<o;r+=1)u="",i&&0===r||(u+=q(e,t)),s=n[a=f[r]],ee(e,t+1,a,!0,!0,!0)&&((c=null!==e.tag&&"?"!==e.tag||e.dump&&1024<e.dump.length)&&(e.dump&&h===e.dump.charCodeAt(0)?u+="?":u+="? "),u+=e.dump,c&&(u+=q(e,t)),ee(e,t+1,s,!0,c)&&(e.dump&&h===e.dump.charCodeAt(0)?u+=":":u+=": ",l+=u+=e.dump));e.tag=p,e.dump=l||"{}"}(e,t,e.dump,r),c&&(e.dump="&ref_"+s+e.dump)):(function(e,t,n){for(var i,r,o,a="",s=e.tag,c=Object.keys(n),u=0,l=c.length;u<l;u+=1)o="",0!==u&&(o+=", "),e.condenseFlow&&(o+='"'),r=n[i=c[u]],ee(e,t,i,!1,!1)&&(1024<e.dump.length&&(o+="? "),o+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),ee(e,t,r,!1,!1)&&(a+=o+=e.dump));e.tag=s,e.dump="{"+a+"}"}(e,t,e.dump),c&&(e.dump="&ref_"+s+" "+e.dump));else if("[object Array]"===a){var l=e.noArrayIndent&&0<t?t-1:t;i&&0!==e.dump.length?(function(e,t,n,i){for(var r="",o=e.tag,a=0,s=n.length;a<s;a+=1)ee(e,t+1,n[a],!0,!0)&&(i&&0===a||(r+=q(e,t)),e.dump&&h===e.dump.charCodeAt(0)?r+="-":r+="- ",r+=e.dump);e.tag=o,e.dump=r||"[]"}(e,l,e.dump,r),c&&(e.dump="&ref_"+s+e.dump)):(function(e,t,n){for(var i="",r=e.tag,o=0,a=n.length;o<a;o+=1)ee(e,t,n[o],!1,!1)&&(0!==o&&(i+=","+(e.condenseFlow?"":" ")),i+=e.dump);e.tag=r,e.dump="["+i+"]"}(e,l,e.dump),c&&(e.dump="&ref_"+s+" "+e.dump))}else{if("[object String]"!==a){if(e.skipInvalid)return;throw new d("unacceptable kind of an object to dump "+a)}"?"!==e.tag&&Z(e,e.dump,t,o)}null!==e.tag&&"?"!==e.tag&&(e.dump="!<"+e.tag+"> "+e.dump)}return 1}function te(e,t){var n,i,r=[],o=[];for(!function e(t,n,i){var r,o,a;if(null!==t&&"object"==typeof t)if(-1!==(o=n.indexOf(t)))-1===i.indexOf(o)&&i.push(o);else if(n.push(t),Array.isArray(t))for(o=0,a=t.length;o<a;o+=1)e(t[o],n,i);else for(r=Object.keys(t),o=0,a=r.length;o<a;o+=1)e(t[r[o]],n,i)}(e,r,o),n=0,i=o.length;n<i;n+=1)t.duplicates.push(r[o[n]]);t.usedDuplicates=new Array(i)}function ne(e,t){var n=new D(t=t||{});return n.noRefs||te(e,n),ee(n,0,e,!0,!0)?n.dump+"\n":""}t.exports.dump=ne,t.exports.safeDump=function(e,t){return ne(e,c.extend({schema:r},t))}},{"./common":2,"./exception":4,"./schema/default_full":9,"./schema/default_safe":10}],4:[function(e,t,n){"use strict";function i(e,t){Error.call(this),this.name="YAMLException",this.reason=e,this.mark=t,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||""}((i.prototype=Object.create(Error.prototype)).constructor=i).prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t},t.exports=i},{}],5:[function(e,t,n){"use strict";var g=e("./common"),i=e("./exception"),r=e("./mark"),o=e("./schema/default_safe"),a=e("./schema/default_full"),y=Object.prototype.hasOwnProperty,x=1,v=2,A=3,b=4,w=1,C=2,k=3,c=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,s=/[\x85\u2028\u2029]/,j=/[,\[\]\{\}]/,S=/^(?:!|!!|![a-z\-]+!)$/i,I=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function l(e){return Object.prototype.toString.call(e)}function O(e){return 10===e||13===e}function E(e){return 9===e||32===e}function F(e){return 9===e||32===e||10===e||13===e}function _(e){return 44===e||91===e||93===e||123===e||125===e}function u(e){return 48===e?"\0":97===e?"":98===e?"\b":116===e||9===e?"\t":110===e?"\n":118===e?"\v":102===e?"\f":114===e?"\r":101===e?"":32===e?" ":34===e?'"':47===e?"/":92===e?"\\":78===e?"Â…":95===e?"Â ":76===e?"\u2028":80===e?"\u2029":""}for(var f=new Array(256),d=new Array(256),p=0;p<256;p++)f[p]=u(p)?1:0,d[p]=u(p);function h(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||a,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function m(e,t){return new i(t,new r(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function N(e,t){throw m(e,t)}function M(e,t){e.onWarning&&e.onWarning.call(null,m(e,t))}var T={YAML:function(e,t,n){var i,r,o;null!==e.version&&N(e,"duplication of %YAML directive"),1!==n.length&&N(e,"YAML directive accepts exactly one argument"),null===(i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&N(e,"ill-formed argument of the YAML directive"),r=parseInt(i[1],10),o=parseInt(i[2],10),1!==r&&N(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=o<2,1!==o&&2!==o&&M(e,"unsupported YAML version of the document")},TAG:function(e,t,n){var i,r;2!==n.length&&N(e,"TAG directive accepts exactly two arguments"),i=n[0],r=n[1],S.test(i)||N(e,"ill-formed tag handle (first argument) of the TAG directive"),y.call(e.tagMap,i)&&N(e,'there is a previously declared suffix for "'+i+'" tag handle'),I.test(r)||N(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[i]=r}};function L(e,t,n,i){var r,o,a,s;if(t<n){if(s=e.input.slice(t,n),i)for(r=0,o=s.length;r<o;r+=1)9===(a=s.charCodeAt(r))||32<=a&&a<=1114111||N(e,"expected valid JSON character");else c.test(s)&&N(e,"the stream contains non-printable characters");e.result+=s}}function D(e,t,n,i){var r,o,a,s;for(g.isObject(n)||N(e,"cannot merge mappings; the provided source object is unacceptable"),a=0,s=(r=Object.keys(n)).length;a<s;a+=1)o=r[a],y.call(t,o)||(t[o]=n[o],i[o]=!0)}function U(e,t,n,i,r,o,a,s){var c,u;if(Array.isArray(r))for(c=0,u=(r=Array.prototype.slice.call(r)).length;c<u;c+=1)Array.isArray(r[c])&&N(e,"nested arrays are not supported inside keys"),"object"==typeof r&&"[object Object]"===l(r[c])&&(r[c]="[object Object]");if("object"==typeof r&&"[object Object]"===l(r)&&(r="[object Object]"),r=String(r),null===t&&(t={}),"tag:yaml.org,2002:merge"===i)if(Array.isArray(o))for(c=0,u=o.length;c<u;c+=1)D(e,t,o[c],n);else D(e,t,o,n);else e.json||y.call(n,r)||!y.call(t,r)||(e.line=a||e.line,e.position=s||e.position,N(e,"duplicated mapping key")),t[r]=o,delete n[r];return t}function q(e){var t=e.input.charCodeAt(e.position);10===t?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):N(e,"a line break is expected"),e.line+=1,e.lineStart=e.position}function Y(e,t,n){for(var i=0,r=e.input.charCodeAt(e.position);0!==r;){for(;E(r);)r=e.input.charCodeAt(++e.position);if(t&&35===r)for(;10!==(r=e.input.charCodeAt(++e.position))&&13!==r&&0!==r;);if(!O(r))break;for(q(e),r=e.input.charCodeAt(e.position),i++,e.lineIndent=0;32===r;)e.lineIndent++,r=e.input.charCodeAt(++e.position)}return-1!==n&&0!==i&&e.lineIndent<n&&M(e,"deficient indentation"),i}function R(e){var t=e.position,n=e.input.charCodeAt(t);return 45!==n&&46!==n||n!==e.input.charCodeAt(t+1)||n!==e.input.charCodeAt(t+2)||(t+=3,0!==(n=e.input.charCodeAt(t))&&!F(n))?void 0:1}function B(e,t){1===t?e.result+=" ":1<t&&(e.result+=g.repeat("\n",t-1))}function P(e,t){var n,i,r,o,a,s,c,u,l,p=e.input.charCodeAt(e.position);if(34===p){for(e.kind="scalar",e.result="",e.position++,n=i=e.position;0!==(p=e.input.charCodeAt(e.position));){if(34===p)return L(e,n,e.position,!0),e.position++,1;if(92===p){if(L(e,n,e.position,!0),O(p=e.input.charCodeAt(++e.position)))Y(e,!1,t);else if(p<256&&f[p])e.result+=d[p],e.position++;else if(0<(a=120===(l=p)?2:117===l?4:85===l?8:0)){for(r=a,o=0;0<r;r--)p=e.input.charCodeAt(++e.position),u=void 0,0<=(a=48<=(c=p)&&c<=57?c-48:97<=(u=32|c)&&u<=102?u-97+10:-1)?o=(o<<4)+a:N(e,"expected hexadecimal character");e.result+=(s=o)<=65535?String.fromCharCode(s):String.fromCharCode(55296+(s-65536>>10),56320+(s-65536&1023)),e.position++}else N(e,"unknown escape sequence");n=i=e.position}else O(p)?(L(e,n,i,!0),B(e,Y(e,!1,t)),n=i=e.position):e.position===e.lineStart&&R(e)?N(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}N(e,"unexpected end of the stream within a double quoted scalar")}}function W(e,t){var n,i,r=e.tag,o=e.anchor,a=[],s=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=a),i=e.input.charCodeAt(e.position);0!==i&&45===i&&F(e.input.charCodeAt(e.position+1));)if(s=!0,e.position++,Y(e,!0,-1)&&e.lineIndent<=t)a.push(null),i=e.input.charCodeAt(e.position);else if(n=e.line,K(e,t,A,!1,!0),a.push(e.result),Y(e,!0,-1),i=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==i)N(e,"bad indentation of a sequence entry");else if(e.lineIndent<t)break;return!!s&&(e.tag=r,e.anchor=o,e.kind="sequence",e.result=a,!0)}function K(e,t,n,i,r){var o,a,s,c,u,l,p,f,d=1,h=!1,m=!1;if(null!==e.listener&&e.listener("open",e),e.tag=null,e.anchor=null,e.kind=null,e.result=null,o=a=s=b===n||A===n,i&&Y(e,!0,-1)&&(h=!0,e.lineIndent>t?d=1:e.lineIndent===t?d=0:e.lineIndent<t&&(d=-1)),1===d)for(;function(e){var t,n,i,r=!1,o=!1,a=e.input.charCodeAt(e.position);if(33===a){if(null!==e.tag&&N(e,"duplication of a tag property"),60===(a=e.input.charCodeAt(++e.position))?(r=!0,a=e.input.charCodeAt(++e.position)):33===a?(o=!0,n="!!",a=e.input.charCodeAt(++e.position)):n="!",t=e.position,r){for(;0!==(a=e.input.charCodeAt(++e.position))&&62!==a;);e.position<e.length?(i=e.input.slice(t,e.position),a=e.input.charCodeAt(++e.position)):N(e,"unexpected end of the stream within a verbatim tag")}else{for(;0!==a&&!F(a);)33===a&&(o?N(e,"tag suffix cannot contain exclamation marks"):(n=e.input.slice(t-1,e.position+1),S.test(n)||N(e,"named tag handle cannot contain such characters"),o=!0,t=e.position+1)),a=e.input.charCodeAt(++e.position);i=e.input.slice(t,e.position),j.test(i)&&N(e,"tag suffix cannot contain flow indicator characters")}return i&&!I.test(i)&&N(e,"tag name cannot contain such characters: "+i),r?e.tag=i:y.call(e.tagMap,n)?e.tag=e.tagMap[n]+i:"!"===n?e.tag="!"+i:"!!"===n?e.tag="tag:yaml.org,2002:"+i:N(e,'undeclared tag handle "'+n+'"'),1}}(e)||function(e){var t,n=e.input.charCodeAt(e.position);if(38===n){for(null!==e.anchor&&N(e,"duplication of an anchor property"),n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!F(n)&&!_(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&N(e,"name of an anchor node must contain at least one character"),e.anchor=e.input.slice(t,e.position),1}}(e);)Y(e,!0,-1)?(h=!0,s=o,e.lineIndent>t?d=1:e.lineIndent===t?d=0:e.lineIndent<t&&(d=-1)):s=!1;if(s=s&&(h||r),1!==d&&b!==n||(p=x===n||v===n?t:t+1,f=e.position-e.lineStart,1===d?s&&(W(e,f)||function(e,t,n){var i,r,o,a,s,c=e.tag,u=e.anchor,l={},p={},f=null,d=null,h=null,m=!1,g=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=l),s=e.input.charCodeAt(e.position);0!==s;){if(i=e.input.charCodeAt(e.position+1),o=e.line,a=e.position,63!==s&&58!==s||!F(i)){if(!K(e,n,v,!1,!0))break;if(e.line===o){for(s=e.input.charCodeAt(e.position);E(s);)s=e.input.charCodeAt(++e.position);if(58===s)F(s=e.input.charCodeAt(++e.position))||N(e,"a whitespace character is expected after the key-value separator within a block mapping"),m&&(U(e,l,p,f,d,null),f=d=h=null),r=m=!(g=!0),f=e.tag,d=e.result;else{if(!g)return e.tag=c,e.anchor=u,1;N(e,"can not read an implicit mapping pair; a colon is missed")}}else{if(!g)return e.tag=c,e.anchor=u,1;N(e,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===s?(m&&(U(e,l,p,f,d,null),f=d=h=null),r=m=g=!0):m?r=!(m=!1):N(e,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),e.position+=1,s=i;if((e.line===o||e.lineIndent>t)&&(K(e,t,b,!0,r)&&(m?d=e.result:h=e.result),m||(U(e,l,p,f,d,h,o,a),f=d=h=null),Y(e,!0,-1),s=e.input.charCodeAt(e.position)),e.lineIndent>t&&0!==s)N(e,"bad indentation of a mapping entry");else if(e.lineIndent<t)break}return m&&U(e,l,p,f,d,null),g&&(e.tag=c,e.anchor=u,e.kind="mapping",e.result=l),g}(e,f,p))||function(e,t){var n,i,r,o,a,s,c,u,l,p=!0,f=e.tag,d=e.anchor,h={},m=e.input.charCodeAt(e.position);if(91===m)s=!(r=93),i=[];else{if(123!==m)return;r=125,s=!0,i={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=i),m=e.input.charCodeAt(++e.position);0!==m;){if(Y(e,!0,t),(m=e.input.charCodeAt(e.position))===r)return e.position++,e.tag=f,e.anchor=d,e.kind=s?"mapping":"sequence",e.result=i,1;p||N(e,"missed comma between flow collection entries"),l=null,o=a=!1,63===m&&F(e.input.charCodeAt(e.position+1))&&(o=a=!0,e.position++,Y(e,!0,t)),n=e.line,K(e,t,x,!1,!0),u=e.tag,c=e.result,Y(e,!0,t),m=e.input.charCodeAt(e.position),!a&&e.line!==n||58!==m||(o=!0,m=e.input.charCodeAt(++e.position),Y(e,!0,t),K(e,t,x,!1,!0),l=e.result),s?U(e,i,h,u,c,l):o?i.push(U(e,null,h,u,c,l)):i.push(c),Y(e,!0,t),44===(m=e.input.charCodeAt(e.position))?(p=!0,m=e.input.charCodeAt(++e.position)):p=!1}N(e,"unexpected end of the stream within a flow collection")}(e,p)?m=!0:(a&&function(e,t){var n,i,r,o,a=w,s=!1,c=!1,u=t,l=0,p=!1,f=e.input.charCodeAt(e.position);if(124===f)i=!1;else{if(62!==f)return;i=!0}for(e.kind="scalar",e.result="";0!==f;)if(43===(f=e.input.charCodeAt(++e.position))||45===f)w===a?a=43===f?k:C:N(e,"repeat of a chomping mode identifier");else{if(!(0<=(r=48<=(o=f)&&o<=57?o-48:-1)))break;0==r?N(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?N(e,"repeat of an indentation width identifier"):(u=t+r-1,c=!0)}if(E(f)){for(;E(f=e.input.charCodeAt(++e.position)););if(35===f)for(;!O(f=e.input.charCodeAt(++e.position))&&0!==f;);}for(;0!==f;){for(q(e),e.lineIndent=0,f=e.input.charCodeAt(e.position);(!c||e.lineIndent<u)&&32===f;)e.lineIndent++,f=e.input.charCodeAt(++e.position);if(!c&&e.lineIndent>u&&(u=e.lineIndent),O(f))l++;else{if(e.lineIndent<u){a===k?e.result+=g.repeat("\n",s?1+l:l):a===w&&s&&(e.result+="\n");break}for(i?E(f)?(p=!0,e.result+=g.repeat("\n",s?1+l:l)):p?(p=!1,e.result+=g.repeat("\n",l+1)):0===l?s&&(e.result+=" "):e.result+=g.repeat("\n",l):e.result+=g.repeat("\n",s?1+l:l),c=s=!0,l=0,n=e.position;!O(f)&&0!==f;)f=e.input.charCodeAt(++e.position);L(e,n,e.position,!1)}}return 1}(e,p)||function(e,t){var n,i,r=e.input.charCodeAt(e.position);if(39===r){for(e.kind="scalar",e.result="",e.position++,n=i=e.position;0!==(r=e.input.charCodeAt(e.position));)if(39===r){if(L(e,n,e.position,!0),39!==(r=e.input.charCodeAt(++e.position)))return 1;n=e.position,e.position++,i=e.position}else O(r)?(L(e,n,i,!0),B(e,Y(e,!1,t)),n=i=e.position):e.position===e.lineStart&&R(e)?N(e,"unexpected end of the document within a single quoted scalar"):(e.position++,i=e.position);N(e,"unexpected end of the stream within a single quoted scalar")}}(e,p)||P(e,p)?m=!0:!function(e){var t,n,i=e.input.charCodeAt(e.position);if(42===i){for(i=e.input.charCodeAt(++e.position),t=e.position;0!==i&&!F(i)&&!_(i);)i=e.input.charCodeAt(++e.position);return e.position===t&&N(e,"name of an alias node must contain at least one character"),n=e.input.slice(t,e.position),e.anchorMap.hasOwnProperty(n)||N(e,'unidentified alias "'+n+'"'),e.result=e.anchorMap[n],Y(e,!0,-1),1}}(e)?function(e,t,n){var i,r,o,a,s,c,u,l=e.kind,p=e.result,f=e.input.charCodeAt(e.position);if(!F(f)&&!_(f)&&35!==f&&38!==f&&42!==f&&33!==f&&124!==f&&62!==f&&39!==f&&34!==f&&37!==f&&64!==f&&96!==f&&(63!==f&&45!==f||!(F(i=e.input.charCodeAt(e.position+1))||n&&_(i)))){for(e.kind="scalar",e.result="",r=o=e.position,a=!1;0!==f;){if(58===f){if(F(i=e.input.charCodeAt(e.position+1))||n&&_(i))break}else if(35===f){if(F(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&R(e)||n&&_(f))break;if(O(f)){if(s=e.line,c=e.lineStart,u=e.lineIndent,Y(e,!1,-1),e.lineIndent>=t){a=!0,f=e.input.charCodeAt(e.position);continue}e.position=o,e.line=s,e.lineStart=c,e.lineIndent=u;break}}a&&(L(e,r,o,!1),B(e,e.line-s),r=o=e.position,a=!1),E(f)||(o=e.position+1),f=e.input.charCodeAt(++e.position)}if(L(e,r,o,!1),e.result)return 1;e.kind=l,e.result=p}}(e,p,x===n)&&(m=!0,null===e.tag&&(e.tag="?")):(m=!0,null===e.tag&&null===e.anchor||N(e,"alias node should not have any properties")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===d&&(m=s&&W(e,f))),null!==e.tag&&"!"!==e.tag)if("?"===e.tag){for(null!==e.result&&"scalar"!==e.kind&&N(e,'unacceptable node kind for !<?> tag; it should be "scalar", not "'+e.kind+'"'),c=0,u=e.implicitTypes.length;c<u;c+=1)if((l=e.implicitTypes[c]).resolve(e.result)){e.result=l.construct(e.result),e.tag=l.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else y.call(e.typeMap[e.kind||"fallback"],e.tag)?(l=e.typeMap[e.kind||"fallback"][e.tag],null!==e.result&&l.kind!==e.kind&&N(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+l.kind+'", not "'+e.kind+'"'),l.resolve(e.result)?(e.result=l.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):N(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")):N(e,"unknown tag !<"+e.tag+">");return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||m}function $(e,t){t=t||{},0!==(e=String(e)).length&&(10!==e.charCodeAt(e.length-1)&&13!==e.charCodeAt(e.length-1)&&(e+="\n"),65279===e.charCodeAt(0)&&(e=e.slice(1)));var n=new h(e,t),i=e.indexOf("\0");for(-1!==i&&(n.position=i,N(n,"null byte is not allowed in input")),n.input+="\0";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)!function(e){var t,n,i,r,o=e.position,a=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};0!==(r=e.input.charCodeAt(e.position))&&(Y(e,!0,-1),r=e.input.charCodeAt(e.position),!(0<e.lineIndent||37!==r));){for(a=!0,r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!F(r);)r=e.input.charCodeAt(++e.position);for(i=[],(n=e.input.slice(t,e.position)).length<1&&N(e,"directive name must not be less than one character in length");0!==r;){for(;E(r);)r=e.input.charCodeAt(++e.position);if(35===r){for(;0!==(r=e.input.charCodeAt(++e.position))&&!O(r););break}if(O(r))break;for(t=e.position;0!==r&&!F(r);)r=e.input.charCodeAt(++e.position);i.push(e.input.slice(t,e.position))}0!==r&&q(e),y.call(T,n)?T[n](e,n,i):M(e,'unknown document directive "'+n+'"')}Y(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,Y(e,!0,-1)):a&&N(e,"directives end mark is expected"),K(e,e.lineIndent-1,b,!1,!0),Y(e,!0,-1),e.checkLineBreaks&&s.test(e.input.slice(o,e.position))&&M(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&R(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,Y(e,!0,-1)):e.position<e.length-1&&N(e,"end of the stream or a document separator is expected")}(n);return n.documents}function H(e,t,n){null!==t&&"object"==typeof t&&void 0===n&&(n=t,t=null);var i=$(e,n);if("function"!=typeof t)return i;for(var r=0,o=i.length;r<o;r+=1)t(i[r])}function G(e,t){var n=$(e,t);if(0!==n.length){if(1===n.length)return n[0];throw new i("expected a single document in the stream, but found more")}}t.exports.loadAll=H,t.exports.load=G,t.exports.safeLoadAll=function(e,t,n){return"object"==typeof t&&null!==t&&void 0===n&&(n=t,t=null),H(e,t,g.extend({schema:o},n))},t.exports.safeLoad=function(e,t){return G(e,g.extend({schema:o},t))}},{"./common":2,"./exception":4,"./mark":6,"./schema/default_full":9,"./schema/default_safe":10}],6:[function(e,t,n){"use strict";var s=e("./common");function i(e,t,n,i,r){this.name=e,this.buffer=t,this.position=n,this.line=i,this.column=r}i.prototype.getSnippet=function(e,t){var n,i,r,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,n="",i=this.position;0<i&&-1==="\0\r\nÂ…\u2028\u2029".indexOf(this.buffer.charAt(i-1));)if(--i,this.position-i>t/2-1){n=" ... ",i+=5;break}for(r="",o=this.position;o<this.buffer.length&&-1==="\0\r\nÂ…\u2028\u2029".indexOf(this.buffer.charAt(o));)if((o+=1)-this.position>t/2-1){r=" ... ",o-=5;break}return a=this.buffer.slice(i,o),s.repeat(" ",e)+n+a+r+"\n"+s.repeat(" ",e+this.position-i+n.length)+"^"},i.prototype.toString=function(e){var t,n="";return this.name&&(n+='in "'+this.name+'" '),n+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet())&&(n+=":\n"+t),n},t.exports=i},{"./common":2}],7:[function(e,t,n){"use strict";var r=e("./common"),o=e("./exception"),a=e("./type");function s(e,t,i){var r=[];return e.include.forEach(function(e){i=s(e,t,i)}),e[t].forEach(function(n){i.forEach(function(e,t){e.tag===n.tag&&e.kind===n.kind&&r.push(t)}),i.push(n)}),i.filter(function(e,t){return-1===r.indexOf(t)})}function c(e){this.include=e.include||[],this.implicit=e.implicit||[],this.explicit=e.explicit||[],this.implicit.forEach(function(e){if(e.loadKind&&"scalar"!==e.loadKind)throw new o("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")}),this.compiledImplicit=s(this,"implicit",[]),this.compiledExplicit=s(this,"explicit",[]),this.compiledTypeMap=function(){var e,t,n={scalar:{},sequence:{},mapping:{},fallback:{}};function i(e){n[e.kind][e.tag]=n.fallback[e.tag]=e}for(e=0,t=arguments.length;e<t;e+=1)arguments[e].forEach(i);return n}(this.compiledImplicit,this.compiledExplicit)}c.DEFAULT=null,c.create=function(e,t){var n,i;switch(arguments.length){case 1:n=c.DEFAULT,i=e;break;case 2:n=e,i=t;break;default:throw new o("Wrong number of arguments for Schema.create function")}if(n=r.toArray(n),i=r.toArray(i),!n.every(function(e){return e instanceof c}))throw new o("Specified list of super schemas (or a single Schema object) contains a non-Schema object.");if(!i.every(function(e){return e instanceof a}))throw new o("Specified list of YAML types (or a single Type object) contains a non-Type object.");return new c({include:n,explicit:i})},t.exports=c},{"./common":2,"./exception":4,"./type":13}],8:[function(e,t,n){"use strict";var i=e("../schema");t.exports=new i({include:[e("./json")]})},{"../schema":7,"./json":12}],9:[function(e,t,n){"use strict";var i=e("../schema");t.exports=i.DEFAULT=new i({include:[e("./default_safe")],explicit:[e("../type/js/undefined"),e("../type/js/regexp"),e("../type/js/function")]})},{"../schema":7,"../type/js/function":18,"../type/js/regexp":19,"../type/js/undefined":20,"./default_safe":10}],10:[function(e,t,n){"use strict";var i=e("../schema");t.exports=new i({include:[e("./core")],implicit:[e("../type/timestamp"),e("../type/merge")],explicit:[e("../type/binary"),e("../type/omap"),e("../type/pairs"),e("../type/set")]})},{"../schema":7,"../type/binary":14,"../type/merge":22,"../type/omap":24,"../type/pairs":25,"../type/set":27,"../type/timestamp":29,"./core":8}],11:[function(e,t,n){"use strict";var i=e("../schema");t.exports=new i({explicit:[e("../type/str"),e("../type/seq"),e("../type/map")]})},{"../schema":7,"../type/map":21,"../type/seq":26,"../type/str":28}],12:[function(e,t,n){"use strict";var i=e("../schema");t.exports=new i({include:[e("./failsafe")],implicit:[e("../type/null"),e("../type/bool"),e("../type/int"),e("../type/float")]})},{"../schema":7,"../type/bool":15,"../type/float":16,"../type/int":17,"../type/null":23,"./failsafe":11}],13:[function(e,t,n){"use strict";var r=e("./exception"),o=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],a=["scalar","sequence","mapping"];t.exports=function(t,e){var n,i;if(e=e||{},Object.keys(e).forEach(function(e){if(-1===o.indexOf(e))throw new r('Unknown option "'+e+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(e){return e},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=(n=e.styleAliases||null,i={},null!==n&&Object.keys(n).forEach(function(t){n[t].forEach(function(e){i[String(e)]=t})}),i),-1===a.indexOf(this.kind))throw new r('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}},{"./exception":4}],14:[function(e,t,n){"use strict";try{var c=e("buffer").Buffer}catch(e){}var i=e("../type"),u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";t.exports=new i("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(e){if(null===e)return!1;for(var t,n=0,i=e.length,r=u,o=0;o<i;o++)if(!(64<(t=r.indexOf(e.charAt(o))))){if(t<0)return!1;n+=6}return n%8==0},construct:function(e){for(var t,n=e.replace(/[\r\n=]/g,""),i=n.length,r=u,o=0,a=[],s=0;s<i;s++)s%4==0&&s&&(a.push(o>>16&255),a.push(o>>8&255),a.push(255&o)),o=o<<6|r.indexOf(n.charAt(s));return 0==(t=i%4*6)?(a.push(o>>16&255),a.push(o>>8&255),a.push(255&o)):18==t?(a.push(o>>10&255),a.push(o>>2&255)):12==t&&a.push(o>>4&255),c?c.from?c.from(a):new c(a):a},predicate:function(e){return c&&c.isBuffer(e)},represent:function(e){for(var t,n="",i=0,r=e.length,o=u,a=0;a<r;a++)a%3==0&&a&&(n+=o[i>>18&63],n+=o[i>>12&63],n+=o[i>>6&63],n+=o[63&i]),i=(i<<8)+e[a];return 0==(t=r%3)?(n+=o[i>>18&63],n+=o[i>>12&63],n+=o[i>>6&63],n+=o[63&i]):2==t?(n+=o[i>>10&63],n+=o[i>>4&63],n+=o[i<<2&63],n+=o[64]):1==t&&(n+=o[i>>2&63],n+=o[i<<4&63],n+=o[64],n+=o[64]),n}})},{"../type":13}],15:[function(e,t,n){"use strict";var i=e("../type");t.exports=new i("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t=e.length;return 4===t&&("true"===e||"True"===e||"TRUE"===e)||5===t&&("false"===e||"False"===e||"FALSE"===e)},construct:function(e){return"true"===e||"True"===e||"TRUE"===e},predicate:function(e){return"[object Boolean]"===Object.prototype.toString.call(e)},represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"})},{"../type":13}],16:[function(e,t,n){"use strict";var i=e("../common"),r=e("../type"),o=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var a=/^[-+]?[0-9]+e/;t.exports=new r("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!o.test(e)||"_"===e[e.length-1])},construct:function(e){var t,n=e.replace(/_/g,"").toLowerCase(),i="-"===n[0]?-1:1,r=[];return 0<="+-".indexOf(n[0])&&(n=n.slice(1)),".inf"===n?1==i?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===n?NaN:0<=n.indexOf(":")?(n.split(":").forEach(function(e){r.unshift(parseFloat(e,10))}),n=0,t=1,r.forEach(function(e){n+=e*t,t*=60}),i*n):i*parseFloat(n,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||i.isNegativeZero(e))},represent:function(e,t){var n;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(i.isNegativeZero(e))return"-0.0";return n=e.toString(10),a.test(n)?n.replace("e",".e"):n},defaultStyle:"lowercase"})},{"../common":2,"../type":13}],17:[function(e,t,n){"use strict";var i=e("../common"),r=e("../type");t.exports=new r("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,i,r,o=e.length,a=0,s=!1;if(!o)return!1;if("-"!==(t=e[a])&&"+"!==t||(t=e[++a]),"0"===t){if(a+1===o)return!0;if("b"===(t=e[++a])){for(a++;a<o;a++)if("_"!==(t=e[a])){if("0"!==t&&"1"!==t)return!1;s=!0}return s&&"_"!==t}if("x"===t){for(a++;a<o;a++)if("_"!==(t=e[a])){if(!(48<=(i=e.charCodeAt(a))&&i<=57||65<=i&&i<=70||97<=i&&i<=102))return!1;s=!0}return s&&"_"!==t}for(;a<o;a++)if("_"!==(t=e[a])){if(!(48<=(n=e.charCodeAt(a))&&n<=55))return!1;s=!0}return s&&"_"!==t}if("_"===t)return!1;for(;a<o;a++)if("_"!==(t=e[a])){if(":"===t)break;if(!(48<=(r=e.charCodeAt(a))&&r<=57))return!1;s=!0}return!(!s||"_"===t)&&(":"!==t||/^(:[0-5]?[0-9])+$/.test(e.slice(a)))},construct:function(e){var t,n,i=e,r=1,o=[];return-1!==i.indexOf("_")&&(i=i.replace(/_/g,"")),"-"!==(t=i[0])&&"+"!==t||("-"===t&&(r=-1),t=(i=i.slice(1))[0]),"0"===i?0:"0"===t?"b"===i[1]?r*parseInt(i.slice(2),2):"x"===i[1]?r*parseInt(i,16):r*parseInt(i,8):-1!==i.indexOf(":")?(i.split(":").forEach(function(e){o.unshift(parseInt(e,10))}),i=0,n=1,o.forEach(function(e){i+=e*n,n*=60}),r*i):r*parseInt(i,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&e%1==0&&!i.isNegativeZero(e)},represent:{binary:function(e){return 0<=e?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return 0<=e?"0"+e.toString(8):"-0"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return 0<=e?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})},{"../common":2,"../type":13}],18:[function(e,t,n){"use strict";try{var o=e("esprima")}catch(e){"undefined"!=typeof window&&(o=window.esprima)}var i=e("../../type");t.exports=new i("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:function(e){if(null===e)return!1;try{var t="("+e+")",n=o.parse(t,{range:!0});return"Program"!==n.type||1!==n.body.length||"ExpressionStatement"!==n.body[0].type||"ArrowFunctionExpression"!==n.body[0].expression.type&&"FunctionExpression"!==n.body[0].expression.type?!1:!0}catch(e){return!1}},construct:function(e){var t,n="("+e+")",i=o.parse(n,{range:!0}),r=[];if("Program"!==i.type||1!==i.body.length||"ExpressionStatement"!==i.body[0].type||"ArrowFunctionExpression"!==i.body[0].expression.type&&"FunctionExpression"!==i.body[0].expression.type)throw new Error("Failed to resolve function");return i.body[0].expression.params.forEach(function(e){r.push(e.name)}),t=i.body[0].expression.body.range,"BlockStatement"===i.body[0].expression.body.type?new Function(r,n.slice(t[0]+1,t[1]-1)):new Function(r,"return "+n.slice(t[0],t[1]))},predicate:function(e){return"[object Function]"===Object.prototype.toString.call(e)},represent:function(e){return e.toString()}})},{"../../type":13}],19:[function(e,t,n){"use strict";var i=e("../../type");t.exports=new i("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:function(e){if(null===e)return!1;if(0===e.length)return!1;var t=e,n=/\/([gim]*)$/.exec(e),i="";if("/"===t[0]){if(n&&(i=n[1]),3<i.length)return!1;if("/"!==t[t.length-i.length-1])return!1}return!0},construct:function(e){var t=e,n=/\/([gim]*)$/.exec(e),i="";return"/"===t[0]&&(n&&(i=n[1]),t=t.slice(1,t.length-i.length-1)),new RegExp(t,i)},predicate:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},represent:function(e){var t="/"+e.source+"/";return e.global&&(t+="g"),e.multiline&&(t+="m"),e.ignoreCase&&(t+="i"),t}})},{"../../type":13}],20:[function(e,t,n){"use strict";var i=e("../../type");t.exports=new i("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:function(){return!0},construct:function(){},predicate:function(e){return void 0===e},represent:function(){return""}})},{"../../type":13}],21:[function(e,t,n){"use strict";var i=e("../type");t.exports=new i("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return null!==e?e:{}}})},{"../type":13}],22:[function(e,t,n){"use strict";var i=e("../type");t.exports=new i("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}})},{"../type":13}],23:[function(e,t,n){"use strict";var i=e("../type");t.exports=new i("tag:yaml.org,2002:null",{kind:"scalar",resolve:function(e){if(null===e)return!0;var t=e.length;return 1===t&&"~"===e||4===t&&("null"===e||"Null"===e||"NULL"===e)},construct:function(){return null},predicate:function(e){return null===e},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})},{"../type":13}],24:[function(e,t,n){"use strict";var i=e("../type"),c=Object.prototype.hasOwnProperty,u=Object.prototype.toString;t.exports=new i("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(e){if(null===e)return!0;for(var t,n,i,r=[],o=e,a=0,s=o.length;a<s;a+=1){if(t=o[a],i=!1,"[object Object]"!==u.call(t))return!1;for(n in t)if(c.call(t,n)){if(i)return!1;i=!0}if(!i)return!1;if(-1!==r.indexOf(n))return!1;r.push(n)}return!0},construct:function(e){return null!==e?e:[]}})},{"../type":13}],25:[function(e,t,n){"use strict";var i=e("../type"),s=Object.prototype.toString;t.exports=new i("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:function(e){if(null===e)return!0;for(var t,n,i=e,r=new Array(i.length),o=0,a=i.length;o<a;o+=1){if(t=i[o],"[object Object]"!==s.call(t))return!1;if(1!==(n=Object.keys(t)).length)return!1;r[o]=[n[0],t[n[0]]]}return!0},construct:function(e){if(null===e)return[];for(var t,n,i=e,r=new Array(i.length),o=0,a=i.length;o<a;o+=1)t=i[o],n=Object.keys(t),r[o]=[n[0],t[n[0]]];return r}})},{"../type":13}],26:[function(e,t,n){"use strict";var i=e("../type");t.exports=new i("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return null!==e?e:[]}})},{"../type":13}],27:[function(e,t,n){"use strict";var i=e("../type"),r=Object.prototype.hasOwnProperty;t.exports=new i("tag:yaml.org,2002:set",{kind:"mapping",resolve:function(e){if(null===e)return!0;var t,n=e;for(t in n)if(r.call(n,t)&&null!==n[t])return!1;return!0},construct:function(e){return null!==e?e:{}}})},{"../type":13}],28:[function(e,t,n){"use strict";var i=e("../type");t.exports=new i("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return null!==e?e:""}})},{"../type":13}],29:[function(e,t,n){"use strict";var i=e("../type"),p=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),f=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");t.exports=new i("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(e){return null!==e&&(null!==p.exec(e)||null!==f.exec(e))},construct:function(e){var t,n,i,r,o,a,s,c=0,u=null,l=p.exec(e);if(null===l&&(l=f.exec(e)),null===l)throw new Error("Date resolve error");if(t=+l[1],n=l[2]-1,i=+l[3],!l[4])return new Date(Date.UTC(t,n,i));if(r=+l[4],o=+l[5],a=+l[6],l[7]){for(c=l[7].slice(0,3);c.length<3;)c+="0";c=+c}return l[9]&&(u=6e4*(60*+l[10]+ +(l[11]||0)),"-"===l[9]&&(u=-u)),s=new Date(Date.UTC(t,n,i,r,o,a,c)),u&&s.setTime(s.getTime()-u),s},instanceOf:Date,represent:function(e){return e.toISOString()}})},{"../type":13}],"/":[function(e,t,n){"use strict";var i=e("./lib/js-yaml.js");t.exports=i},{"./lib/js-yaml.js":1}]},{},[])("/")});
#!/usr/bin/env node


'use strict';

/*eslint-disable no-console*/


// stdlib
var fs    = require('fs');


// 3rd-party
var argparse = require('argparse');


// internal
var yaml = require('..');


////////////////////////////////////////////////////////////////////////////////


var cli = new argparse.ArgumentParser({
  prog:     'js-yaml',
  version:  require('../package.json').version,
  addHelp:  true
});


cli.addArgument([ '-c', '--compact' ], {
  help:   'Display errors in compact mode',
  action: 'storeTrue'
});


// deprecated (not needed after we removed output colors)
// option suppressed, but not completely removed for compatibility
cli.addArgument([ '-j', '--to-json' ], {
  help:   argparse.Const.SUPPRESS,
  dest:   'json',
  action: 'storeTrue'
});


cli.addArgument([ '-t', '--trace' ], {
  help:   'Show stack trace on error',
  action: 'storeTrue'
});

cli.addArgument([ 'file' ], {
  help:   'File to read, utf-8 encoded without BOM',
  nargs:  '?',
  defaultValue: '-'
});


////////////////////////////////////////////////////////////////////////////////


var options = cli.parseArgs();


////////////////////////////////////////////////////////////////////////////////

function readFile(filename, encoding, callback) {
  if (options.file === '-') {
    // read from stdin

    var chunks = [];

    process.stdin.on('data', function (chunk) {
      chunks.push(chunk);
    });

    process.stdin.on('end', function () {
      return callback(null, Buffer.concat(chunks).toString(encoding));
    });
  } else {
    fs.readFile(filename, encoding, callback);
  }
}

readFile(options.file, 'utf8', function (error, input) {
  var output, isYaml;

  if (error) {
    if (error.code === 'ENOENT') {
      console.error('File not found: ' + options.file);
      process.exit(2);
    }

    console.error(
      options.trace && error.stack ||
      error.message ||
      String(error));

    process.exit(1);
  }

  try {
    output = JSON.parse(input);
    isYaml = false;
  } catch (err) {
    if (err instanceof SyntaxError) {
      try {
        output = [];
        yaml.loadAll(input, function (doc) { output.push(doc); }, {});
        isYaml = true;

        if (output.length === 0) output = null;
        else if (output.length === 1) output = output[0];

      } catch (e) {
        if (options.trace && err.stack) console.error(e.stack);
        else console.error(e.toString(options.compact));

        process.exit(1);
      }
    } else {
      console.error(
        options.trace && err.stack ||
        err.message ||
        String(err));

      process.exit(1);
    }
  }

  if (isYaml) console.log(JSON.stringify(output, null, '  '));
  else console.log(yaml.dump(output));
});
Licensing
---------

This software is covered under the following copyright:

/*
 * Copyright (c) 2003-2005  Tom Wu
 * All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
 *
 * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
 * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
 * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
 * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * In addition, the following condition applies:
 *
 * All redistributions must retain an intact copy of this copyright notice
 * and disclaimer.
 */

Address all questions regarding this license to:

  Tom Wu
  tjw@cs.Stanford.EDU<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        
        
        <script src="index.js"></script>
    </body>
</html>var BigInteger = require('./');
var a = new BigInteger('91823918239182398123');
console.log(a.bitLength());(function(){

    // Copyright (c) 2005  Tom Wu
    // All Rights Reserved.
    // See "LICENSE" for details.

    // Basic JavaScript BN library - subset useful for RSA encryption.

    // Bits per digit
    var dbits;

    // JavaScript engine analysis
    var canary = 0xdeadbeefcafe;
    var j_lm = ((canary&0xffffff)==0xefcafe);

    // (public) Constructor
    function BigInteger(a,b,c) {
      if(a != null)
        if("number" == typeof a) this.fromNumber(a,b,c);
        else if(b == null && "string" != typeof a) this.fromString(a,256);
        else this.fromString(a,b);
    }

    // return new, unset BigInteger
    function nbi() { return new BigInteger(null); }

    // am: Compute w_j += (x*this_i), propagate carries,
    // c is initial carry, returns final carry.
    // c < 3*dvalue, x < 2*dvalue, this_i < dvalue
    // We need to select the fastest one that works in this environment.

    // am1: use a single mult and divide to get the high bits,
    // max digit bits should be 26 because
    // max internal value = 2*dvalue^2-2*dvalue (< 2^53)
    function am1(i,x,w,j,c,n) {
      while(--n >= 0) {
        var v = x*this[i++]+w[j]+c;
        c = Math.floor(v/0x4000000);
        w[j++] = v&0x3ffffff;
      }
      return c;
    }
    // am2 avoids a big mult-and-extract completely.
    // Max digit bits should be <= 30 because we do bitwise ops
    // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
    function am2(i,x,w,j,c,n) {
      var xl = x&0x7fff, xh = x>>15;
      while(--n >= 0) {
        var l = this[i]&0x7fff;
        var h = this[i++]>>15;
        var m = xh*l+h*xl;
        l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);
        c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);
        w[j++] = l&0x3fffffff;
      }
      return c;
    }
    // Alternately, set max digit bits to 28 since some
    // browsers slow down when dealing with 32-bit numbers.
    function am3(i,x,w,j,c,n) {
      var xl = x&0x3fff, xh = x>>14;
      while(--n >= 0) {
        var l = this[i]&0x3fff;
        var h = this[i++]>>14;
        var m = xh*l+h*xl;
        l = xl*l+((m&0x3fff)<<14)+w[j]+c;
        c = (l>>28)+(m>>14)+xh*h;
        w[j++] = l&0xfffffff;
      }
      return c;
    }
    var inBrowser = typeof navigator !== "undefined";
    if(inBrowser && j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
      BigInteger.prototype.am = am2;
      dbits = 30;
    }
    else if(inBrowser && j_lm && (navigator.appName != "Netscape")) {
      BigInteger.prototype.am = am1;
      dbits = 26;
    }
    else { // Mozilla/Netscape seems to prefer am3
      BigInteger.prototype.am = am3;
      dbits = 28;
    }

    BigInteger.prototype.DB = dbits;
    BigInteger.prototype.DM = ((1<<dbits)-1);
    BigInteger.prototype.DV = (1<<dbits);

    var BI_FP = 52;
    BigInteger.prototype.FV = Math.pow(2,BI_FP);
    BigInteger.prototype.F1 = BI_FP-dbits;
    BigInteger.prototype.F2 = 2*dbits-BI_FP;

    // Digit conversions
    var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
    var BI_RC = new Array();
    var rr,vv;
    rr = "0".charCodeAt(0);
    for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;
    rr = "a".charCodeAt(0);
    for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
    rr = "A".charCodeAt(0);
    for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;

    function int2char(n) { return BI_RM.charAt(n); }
    function intAt(s,i) {
      var c = BI_RC[s.charCodeAt(i)];
      return (c==null)?-1:c;
    }

    // (protected) copy this to r
    function bnpCopyTo(r) {
      for(var i = this.t-1; i >= 0; --i) r[i] = this[i];
      r.t = this.t;
      r.s = this.s;
    }

    // (protected) set from integer value x, -DV <= x < DV
    function bnpFromInt(x) {
      this.t = 1;
      this.s = (x<0)?-1:0;
      if(x > 0) this[0] = x;
      else if(x < -1) this[0] = x+this.DV;
      else this.t = 0;
    }

    // return bigint initialized to value
    function nbv(i) { var r = nbi(); r.fromInt(i); return r; }

    // (protected) set from string and radix
    function bnpFromString(s,b) {
      var k;
      if(b == 16) k = 4;
      else if(b == 8) k = 3;
      else if(b == 256) k = 8; // byte array
      else if(b == 2) k = 1;
      else if(b == 32) k = 5;
      else if(b == 4) k = 2;
      else { this.fromRadix(s,b); return; }
      this.t = 0;
      this.s = 0;
      var i = s.length, mi = false, sh = 0;
      while(--i >= 0) {
        var x = (k==8)?s[i]&0xff:intAt(s,i);
        if(x < 0) {
          if(s.charAt(i) == "-") mi = true;
          continue;
        }
        mi = false;
        if(sh == 0)
          this[this.t++] = x;
        else if(sh+k > this.DB) {
          this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;
          this[this.t++] = (x>>(this.DB-sh));
        }
        else
          this[this.t-1] |= x<<sh;
        sh += k;
        if(sh >= this.DB) sh -= this.DB;
      }
      if(k == 8 && (s[0]&0x80) != 0) {
        this.s = -1;
        if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;
      }
      this.clamp();
      if(mi) BigInteger.ZERO.subTo(this,this);
    }

    // (protected) clamp off excess high words
    function bnpClamp() {
      var c = this.s&this.DM;
      while(this.t > 0 && this[this.t-1] == c) --this.t;
    }

    // (public) return string representation in given radix
    function bnToString(b) {
      if(this.s < 0) return "-"+this.negate().toString(b);
      var k;
      if(b == 16) k = 4;
      else if(b == 8) k = 3;
      else if(b == 2) k = 1;
      else if(b == 32) k = 5;
      else if(b == 4) k = 2;
      else return this.toRadix(b);
      var km = (1<<k)-1, d, m = false, r = "", i = this.t;
      var p = this.DB-(i*this.DB)%k;
      if(i-- > 0) {
        if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }
        while(i >= 0) {
          if(p < k) {
            d = (this[i]&((1<<p)-1))<<(k-p);
            d |= this[--i]>>(p+=this.DB-k);
          }
          else {
            d = (this[i]>>(p-=k))&km;
            if(p <= 0) { p += this.DB; --i; }
          }
          if(d > 0) m = true;
          if(m) r += int2char(d);
        }
      }
      return m?r:"0";
    }

    // (public) -this
    function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }

    // (public) |this|
    function bnAbs() { return (this.s<0)?this.negate():this; }

    // (public) return + if this > a, - if this < a, 0 if equal
    function bnCompareTo(a) {
      var r = this.s-a.s;
      if(r != 0) return r;
      var i = this.t;
      r = i-a.t;
      if(r != 0) return (this.s<0)?-r:r;
      while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;
      return 0;
    }

    // returns bit length of the integer x
    function nbits(x) {
      var r = 1, t;
      if((t=x>>>16) != 0) { x = t; r += 16; }
      if((t=x>>8) != 0) { x = t; r += 8; }
      if((t=x>>4) != 0) { x = t; r += 4; }
      if((t=x>>2) != 0) { x = t; r += 2; }
      if((t=x>>1) != 0) { x = t; r += 1; }
      return r;
    }

    // (public) return the number of bits in "this"
    function bnBitLength() {
      if(this.t <= 0) return 0;
      return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));
    }

    // (protected) r = this << n*DB
    function bnpDLShiftTo(n,r) {
      var i;
      for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];
      for(i = n-1; i >= 0; --i) r[i] = 0;
      r.t = this.t+n;
      r.s = this.s;
    }

    // (protected) r = this >> n*DB
    function bnpDRShiftTo(n,r) {
      for(var i = n; i < this.t; ++i) r[i-n] = this[i];
      r.t = Math.max(this.t-n,0);
      r.s = this.s;
    }

    // (protected) r = this << n
    function bnpLShiftTo(n,r) {
      var bs = n%this.DB;
      var cbs = this.DB-bs;
      var bm = (1<<cbs)-1;
      var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;
      for(i = this.t-1; i >= 0; --i) {
        r[i+ds+1] = (this[i]>>cbs)|c;
        c = (this[i]&bm)<<bs;
      }
      for(i = ds-1; i >= 0; --i) r[i] = 0;
      r[ds] = c;
      r.t = this.t+ds+1;
      r.s = this.s;
      r.clamp();
    }

    // (protected) r = this >> n
    function bnpRShiftTo(n,r) {
      r.s = this.s;
      var ds = Math.floor(n/this.DB);
      if(ds >= this.t) { r.t = 0; return; }
      var bs = n%this.DB;
      var cbs = this.DB-bs;
      var bm = (1<<bs)-1;
      r[0] = this[ds]>>bs;
      for(var i = ds+1; i < this.t; ++i) {
        r[i-ds-1] |= (this[i]&bm)<<cbs;
        r[i-ds] = this[i]>>bs;
      }
      if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;
      r.t = this.t-ds;
      r.clamp();
    }

    // (protected) r = this - a
    function bnpSubTo(a,r) {
      var i = 0, c = 0, m = Math.min(a.t,this.t);
      while(i < m) {
        c += this[i]-a[i];
        r[i++] = c&this.DM;
        c >>= this.DB;
      }
      if(a.t < this.t) {
        c -= a.s;
        while(i < this.t) {
          c += this[i];
          r[i++] = c&this.DM;
          c >>= this.DB;
        }
        c += this.s;
      }
      else {
        c += this.s;
        while(i < a.t) {
          c -= a[i];
          r[i++] = c&this.DM;
          c >>= this.DB;
        }
        c -= a.s;
      }
      r.s = (c<0)?-1:0;
      if(c < -1) r[i++] = this.DV+c;
      else if(c > 0) r[i++] = c;
      r.t = i;
      r.clamp();
    }

    // (protected) r = this * a, r != this,a (HAC 14.12)
    // "this" should be the larger one if appropriate.
    function bnpMultiplyTo(a,r) {
      var x = this.abs(), y = a.abs();
      var i = x.t;
      r.t = i+y.t;
      while(--i >= 0) r[i] = 0;
      for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);
      r.s = 0;
      r.clamp();
      if(this.s != a.s) BigInteger.ZERO.subTo(r,r);
    }

    // (protected) r = this^2, r != this (HAC 14.16)
    function bnpSquareTo(r) {
      var x = this.abs();
      var i = r.t = 2*x.t;
      while(--i >= 0) r[i] = 0;
      for(i = 0; i < x.t-1; ++i) {
        var c = x.am(i,x[i],r,2*i,0,1);
        if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {
          r[i+x.t] -= x.DV;
          r[i+x.t+1] = 1;
        }
      }
      if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);
      r.s = 0;
      r.clamp();
    }

    // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
    // r != q, this != m.  q or r may be null.
    function bnpDivRemTo(m,q,r) {
      var pm = m.abs();
      if(pm.t <= 0) return;
      var pt = this.abs();
      if(pt.t < pm.t) {
        if(q != null) q.fromInt(0);
        if(r != null) this.copyTo(r);
        return;
      }
      if(r == null) r = nbi();
      var y = nbi(), ts = this.s, ms = m.s;
      var nsh = this.DB-nbits(pm[pm.t-1]);   // normalize modulus
      if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }
      else { pm.copyTo(y); pt.copyTo(r); }
      var ys = y.t;
      var y0 = y[ys-1];
      if(y0 == 0) return;
      var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);
      var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;
      var i = r.t, j = i-ys, t = (q==null)?nbi():q;
      y.dlShiftTo(j,t);
      if(r.compareTo(t) >= 0) {
        r[r.t++] = 1;
        r.subTo(t,r);
      }
      BigInteger.ONE.dlShiftTo(ys,t);
      t.subTo(y,y);  // "negative" y so we can replace sub with am later
      while(y.t < ys) y[y.t++] = 0;
      while(--j >= 0) {
        // Estimate quotient digit
        var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);
        if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) {   // Try it out
          y.dlShiftTo(j,t);
          r.subTo(t,r);
          while(r[i] < --qd) r.subTo(t,r);
        }
      }
      if(q != null) {
        r.drShiftTo(ys,q);
        if(ts != ms) BigInteger.ZERO.subTo(q,q);
      }
      r.t = ys;
      r.clamp();
      if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder
      if(ts < 0) BigInteger.ZERO.subTo(r,r);
    }

    // (public) this mod a
    function bnMod(a) {
      var r = nbi();
      this.abs().divRemTo(a,null,r);
      if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);
      return r;
    }

    // Modular reduction using "classic" algorithm
    function Classic(m) { this.m = m; }
    function cConvert(x) {
      if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);
      else return x;
    }
    function cRevert(x) { return x; }
    function cReduce(x) { x.divRemTo(this.m,null,x); }
    function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
    function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }

    Classic.prototype.convert = cConvert;
    Classic.prototype.revert = cRevert;
    Classic.prototype.reduce = cReduce;
    Classic.prototype.mulTo = cMulTo;
    Classic.prototype.sqrTo = cSqrTo;

    // (protected) return "-1/this % 2^DB"; useful for Mont. reduction
    // justification:
    //         xy == 1 (mod m)
    //         xy =  1+km
    //   xy(2-xy) = (1+km)(1-km)
    // x[y(2-xy)] = 1-k^2m^2
    // x[y(2-xy)] == 1 (mod m^2)
    // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
    // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
    // JS multiply "overflows" differently from C/C++, so care is needed here.
    function bnpInvDigit() {
      if(this.t < 1) return 0;
      var x = this[0];
      if((x&1) == 0) return 0;
      var y = x&3;       // y == 1/x mod 2^2
      y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4
      y = (y*(2-(x&0xff)*y))&0xff;   // y == 1/x mod 2^8
      y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;    // y == 1/x mod 2^16
      // last step - calculate inverse mod DV directly;
      // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
      y = (y*(2-x*y%this.DV))%this.DV;       // y == 1/x mod 2^dbits
      // we really want the negative inverse, and -DV < y < DV
      return (y>0)?this.DV-y:-y;
    }

    // Montgomery reduction
    function Montgomery(m) {
      this.m = m;
      this.mp = m.invDigit();
      this.mpl = this.mp&0x7fff;
      this.mph = this.mp>>15;
      this.um = (1<<(m.DB-15))-1;
      this.mt2 = 2*m.t;
    }

    // xR mod m
    function montConvert(x) {
      var r = nbi();
      x.abs().dlShiftTo(this.m.t,r);
      r.divRemTo(this.m,null,r);
      if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);
      return r;
    }

    // x/R mod m
    function montRevert(x) {
      var r = nbi();
      x.copyTo(r);
      this.reduce(r);
      return r;
    }

    // x = x/R mod m (HAC 14.32)
    function montReduce(x) {
      while(x.t <= this.mt2) // pad x so am has enough room later
        x[x.t++] = 0;
      for(var i = 0; i < this.m.t; ++i) {
        // faster way of calculating u0 = x[i]*mp mod DV
        var j = x[i]&0x7fff;
        var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;
        // use am to combine the multiply-shift-add into one call
        j = i+this.m.t;
        x[j] += this.m.am(0,u0,x,i,0,this.m.t);
        // propagate carry
        while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }
      }
      x.clamp();
      x.drShiftTo(this.m.t,x);
      if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
    }

    // r = "x^2/R mod m"; x != r
    function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }

    // r = "xy/R mod m"; x,y != r
    function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }

    Montgomery.prototype.convert = montConvert;
    Montgomery.prototype.revert = montRevert;
    Montgomery.prototype.reduce = montReduce;
    Montgomery.prototype.mulTo = montMulTo;
    Montgomery.prototype.sqrTo = montSqrTo;

    // (protected) true iff this is even
    function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }

    // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
    function bnpExp(e,z) {
      if(e > 0xffffffff || e < 1) return BigInteger.ONE;
      var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;
      g.copyTo(r);
      while(--i >= 0) {
        z.sqrTo(r,r2);
        if((e&(1<<i)) > 0) z.mulTo(r2,g,r);
        else { var t = r; r = r2; r2 = t; }
      }
      return z.revert(r);
    }

    // (public) this^e % m, 0 <= e < 2^32
    function bnModPowInt(e,m) {
      var z;
      if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
      return this.exp(e,z);
    }

    // protected
    BigInteger.prototype.copyTo = bnpCopyTo;
    BigInteger.prototype.fromInt = bnpFromInt;
    BigInteger.prototype.fromString = bnpFromString;
    BigInteger.prototype.clamp = bnpClamp;
    BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
    BigInteger.prototype.drShiftTo = bnpDRShiftTo;
    BigInteger.prototype.lShiftTo = bnpLShiftTo;
    BigInteger.prototype.rShiftTo = bnpRShiftTo;
    BigInteger.prototype.subTo = bnpSubTo;
    BigInteger.prototype.multiplyTo = bnpMultiplyTo;
    BigInteger.prototype.squareTo = bnpSquareTo;
    BigInteger.prototype.divRemTo = bnpDivRemTo;
    BigInteger.prototype.invDigit = bnpInvDigit;
    BigInteger.prototype.isEven = bnpIsEven;
    BigInteger.prototype.exp = bnpExp;

    // public
    BigInteger.prototype.toString = bnToString;
    BigInteger.prototype.negate = bnNegate;
    BigInteger.prototype.abs = bnAbs;
    BigInteger.prototype.compareTo = bnCompareTo;
    BigInteger.prototype.bitLength = bnBitLength;
    BigInteger.prototype.mod = bnMod;
    BigInteger.prototype.modPowInt = bnModPowInt;

    // "constants"
    BigInteger.ZERO = nbv(0);
    BigInteger.ONE = nbv(1);

    // Copyright (c) 2005-2009  Tom Wu
    // All Rights Reserved.
    // See "LICENSE" for details.

    // Extended JavaScript BN functions, required for RSA private ops.

    // Version 1.1: new BigInteger("0", 10) returns "proper" zero
    // Version 1.2: square() API, isProbablePrime fix

    // (public)
    function bnClone() { var r = nbi(); this.copyTo(r); return r; }

    // (public) return value as integer
    function bnIntValue() {
      if(this.s < 0) {
        if(this.t == 1) return this[0]-this.DV;
        else if(this.t == 0) return -1;
      }
      else if(this.t == 1) return this[0];
      else if(this.t == 0) return 0;
      // assumes 16 < DB < 32
      return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];
    }

    // (public) return value as byte
    function bnByteValue() { return (this.t==0)?this.s:(this[0]<<24)>>24; }

    // (public) return value as short (assumes DB>=16)
    function bnShortValue() { return (this.t==0)?this.s:(this[0]<<16)>>16; }

    // (protected) return x s.t. r^x < DV
    function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }

    // (public) 0 if this == 0, 1 if this > 0
    function bnSigNum() {
      if(this.s < 0) return -1;
      else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;
      else return 1;
    }

    // (protected) convert to radix string
    function bnpToRadix(b) {
      if(b == null) b = 10;
      if(this.signum() == 0 || b < 2 || b > 36) return "0";
      var cs = this.chunkSize(b);
      var a = Math.pow(b,cs);
      var d = nbv(a), y = nbi(), z = nbi(), r = "";
      this.divRemTo(d,y,z);
      while(y.signum() > 0) {
        r = (a+z.intValue()).toString(b).substr(1) + r;
        y.divRemTo(d,y,z);
      }
      return z.intValue().toString(b) + r;
    }

    // (protected) convert from radix string
    function bnpFromRadix(s,b) {
      this.fromInt(0);
      if(b == null) b = 10;
      var cs = this.chunkSize(b);
      var d = Math.pow(b,cs), mi = false, j = 0, w = 0;
      for(var i = 0; i < s.length; ++i) {
        var x = intAt(s,i);
        if(x < 0) {
          if(s.charAt(i) == "-" && this.signum() == 0) mi = true;
          continue;
        }
        w = b*w+x;
        if(++j >= cs) {
          this.dMultiply(d);
          this.dAddOffset(w,0);
          j = 0;
          w = 0;
        }
      }
      if(j > 0) {
        this.dMultiply(Math.pow(b,j));
        this.dAddOffset(w,0);
      }
      if(mi) BigInteger.ZERO.subTo(this,this);
    }

    // (protected) alternate constructor
    function bnpFromNumber(a,b,c) {
      if("number" == typeof b) {
        // new BigInteger(int,int,RNG)
        if(a < 2) this.fromInt(1);
        else {
          this.fromNumber(a,c);
          if(!this.testBit(a-1))	// force MSB set
            this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);
          if(this.isEven()) this.dAddOffset(1,0); // force odd
          while(!this.isProbablePrime(b)) {
            this.dAddOffset(2,0);
            if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);
          }
        }
      }
      else {
        // new BigInteger(int,RNG)
        var x = new Array(), t = a&7;
        x.length = (a>>3)+1;
        b.nextBytes(x);
        if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;
        this.fromString(x,256);
      }
    }

    // (public) convert to bigendian byte array
    function bnToByteArray() {
      var i = this.t, r = new Array();
      r[0] = this.s;
      var p = this.DB-(i*this.DB)%8, d, k = 0;
      if(i-- > 0) {
        if(p < this.DB && (d = this[i]>>p) != (this.s&this.DM)>>p)
          r[k++] = d|(this.s<<(this.DB-p));
        while(i >= 0) {
          if(p < 8) {
            d = (this[i]&((1<<p)-1))<<(8-p);
            d |= this[--i]>>(p+=this.DB-8);
          }
          else {
            d = (this[i]>>(p-=8))&0xff;
            if(p <= 0) { p += this.DB; --i; }
          }
          if((d&0x80) != 0) d |= -256;
          if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;
          if(k > 0 || d != this.s) r[k++] = d;
        }
      }
      return r;
    }

    function bnEquals(a) { return(this.compareTo(a)==0); }
    function bnMin(a) { return(this.compareTo(a)<0)?this:a; }
    function bnMax(a) { return(this.compareTo(a)>0)?this:a; }

    // (protected) r = this op a (bitwise)
    function bnpBitwiseTo(a,op,r) {
      var i, f, m = Math.min(a.t,this.t);
      for(i = 0; i < m; ++i) r[i] = op(this[i],a[i]);
      if(a.t < this.t) {
        f = a.s&this.DM;
        for(i = m; i < this.t; ++i) r[i] = op(this[i],f);
        r.t = this.t;
      }
      else {
        f = this.s&this.DM;
        for(i = m; i < a.t; ++i) r[i] = op(f,a[i]);
        r.t = a.t;
      }
      r.s = op(this.s,a.s);
      r.clamp();
    }

    // (public) this & a
    function op_and(x,y) { return x&y; }
    function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }

    // (public) this | a
    function op_or(x,y) { return x|y; }
    function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }

    // (public) this ^ a
    function op_xor(x,y) { return x^y; }
    function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }

    // (public) this & ~a
    function op_andnot(x,y) { return x&~y; }
    function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }

    // (public) ~this
    function bnNot() {
      var r = nbi();
      for(var i = 0; i < this.t; ++i) r[i] = this.DM&~this[i];
      r.t = this.t;
      r.s = ~this.s;
      return r;
    }

    // (public) this << n
    function bnShiftLeft(n) {
      var r = nbi();
      if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);
      return r;
    }

    // (public) this >> n
    function bnShiftRight(n) {
      var r = nbi();
      if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);
      return r;
    }

    // return index of lowest 1-bit in x, x < 2^31
    function lbit(x) {
      if(x == 0) return -1;
      var r = 0;
      if((x&0xffff) == 0) { x >>= 16; r += 16; }
      if((x&0xff) == 0) { x >>= 8; r += 8; }
      if((x&0xf) == 0) { x >>= 4; r += 4; }
      if((x&3) == 0) { x >>= 2; r += 2; }
      if((x&1) == 0) ++r;
      return r;
    }

    // (public) returns index of lowest 1-bit (or -1 if none)
    function bnGetLowestSetBit() {
      for(var i = 0; i < this.t; ++i)
        if(this[i] != 0) return i*this.DB+lbit(this[i]);
      if(this.s < 0) return this.t*this.DB;
      return -1;
    }

    // return number of 1 bits in x
    function cbit(x) {
      var r = 0;
      while(x != 0) { x &= x-1; ++r; }
      return r;
    }

    // (public) return number of set bits
    function bnBitCount() {
      var r = 0, x = this.s&this.DM;
      for(var i = 0; i < this.t; ++i) r += cbit(this[i]^x);
      return r;
    }

    // (public) true iff nth bit is set
    function bnTestBit(n) {
      var j = Math.floor(n/this.DB);
      if(j >= this.t) return(this.s!=0);
      return((this[j]&(1<<(n%this.DB)))!=0);
    }

    // (protected) this op (1<<n)
    function bnpChangeBit(n,op) {
      var r = BigInteger.ONE.shiftLeft(n);
      this.bitwiseTo(r,op,r);
      return r;
    }

    // (public) this | (1<<n)
    function bnSetBit(n) { return this.changeBit(n,op_or); }

    // (public) this & ~(1<<n)
    function bnClearBit(n) { return this.changeBit(n,op_andnot); }

    // (public) this ^ (1<<n)
    function bnFlipBit(n) { return this.changeBit(n,op_xor); }

    // (protected) r = this + a
    function bnpAddTo(a,r) {
      var i = 0, c = 0, m = Math.min(a.t,this.t);
      while(i < m) {
        c += this[i]+a[i];
        r[i++] = c&this.DM;
        c >>= this.DB;
      }
      if(a.t < this.t) {
        c += a.s;
        while(i < this.t) {
          c += this[i];
          r[i++] = c&this.DM;
          c >>= this.DB;
        }
        c += this.s;
      }
      else {
        c += this.s;
        while(i < a.t) {
          c += a[i];
          r[i++] = c&this.DM;
          c >>= this.DB;
        }
        c += a.s;
      }
      r.s = (c<0)?-1:0;
      if(c > 0) r[i++] = c;
      else if(c < -1) r[i++] = this.DV+c;
      r.t = i;
      r.clamp();
    }

    // (public) this + a
    function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }

    // (public) this - a
    function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }

    // (public) this * a
    function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }

    // (public) this^2
    function bnSquare() { var r = nbi(); this.squareTo(r); return r; }

    // (public) this / a
    function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }

    // (public) this % a
    function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }

    // (public) [this/a,this%a]
    function bnDivideAndRemainder(a) {
      var q = nbi(), r = nbi();
      this.divRemTo(a,q,r);
      return new Array(q,r);
    }

    // (protected) this *= n, this >= 0, 1 < n < DV
    function bnpDMultiply(n) {
      this[this.t] = this.am(0,n-1,this,0,0,this.t);
      ++this.t;
      this.clamp();
    }

    // (protected) this += n << w words, this >= 0
    function bnpDAddOffset(n,w) {
      if(n == 0) return;
      while(this.t <= w) this[this.t++] = 0;
      this[w] += n;
      while(this[w] >= this.DV) {
        this[w] -= this.DV;
        if(++w >= this.t) this[this.t++] = 0;
        ++this[w];
      }
    }

    // A "null" reducer
    function NullExp() {}
    function nNop(x) { return x; }
    function nMulTo(x,y,r) { x.multiplyTo(y,r); }
    function nSqrTo(x,r) { x.squareTo(r); }

    NullExp.prototype.convert = nNop;
    NullExp.prototype.revert = nNop;
    NullExp.prototype.mulTo = nMulTo;
    NullExp.prototype.sqrTo = nSqrTo;

    // (public) this^e
    function bnPow(e) { return this.exp(e,new NullExp()); }

    // (protected) r = lower n words of "this * a", a.t <= n
    // "this" should be the larger one if appropriate.
    function bnpMultiplyLowerTo(a,n,r) {
      var i = Math.min(this.t+a.t,n);
      r.s = 0; // assumes a,this >= 0
      r.t = i;
      while(i > 0) r[--i] = 0;
      var j;
      for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(0,a[i],r,i,0,this.t);
      for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a[i],r,i,0,n-i);
      r.clamp();
    }

    // (protected) r = "this * a" without lower n words, n > 0
    // "this" should be the larger one if appropriate.
    function bnpMultiplyUpperTo(a,n,r) {
      --n;
      var i = r.t = this.t+a.t-n;
      r.s = 0; // assumes a,this >= 0
      while(--i >= 0) r[i] = 0;
      for(i = Math.max(n-this.t,0); i < a.t; ++i)
        r[this.t+i-n] = this.am(n-i,a[i],r,0,0,this.t+i-n);
      r.clamp();
      r.drShiftTo(1,r);
    }

    // Barrett modular reduction
    function Barrett(m) {
      // setup Barrett
      this.r2 = nbi();
      this.q3 = nbi();
      BigInteger.ONE.dlShiftTo(2*m.t,this.r2);
      this.mu = this.r2.divide(m);
      this.m = m;
    }

    function barrettConvert(x) {
      if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);
      else if(x.compareTo(this.m) < 0) return x;
      else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
    }

    function barrettRevert(x) { return x; }

    // x = x mod m (HAC 14.42)
    function barrettReduce(x) {
      x.drShiftTo(this.m.t-1,this.r2);
      if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }
      this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);
      this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);
      while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);
      x.subTo(this.r2,x);
      while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
    }

    // r = x^2 mod m; x != r
    function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }

    // r = x*y mod m; x,y != r
    function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }

    Barrett.prototype.convert = barrettConvert;
    Barrett.prototype.revert = barrettRevert;
    Barrett.prototype.reduce = barrettReduce;
    Barrett.prototype.mulTo = barrettMulTo;
    Barrett.prototype.sqrTo = barrettSqrTo;

    // (public) this^e % m (HAC 14.85)
    function bnModPow(e,m) {
      var i = e.bitLength(), k, r = nbv(1), z;
      if(i <= 0) return r;
      else if(i < 18) k = 1;
      else if(i < 48) k = 3;
      else if(i < 144) k = 4;
      else if(i < 768) k = 5;
      else k = 6;
      if(i < 8)
        z = new Classic(m);
      else if(m.isEven())
        z = new Barrett(m);
      else
        z = new Montgomery(m);

      // precomputation
      var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;
      g[1] = z.convert(this);
      if(k > 1) {
        var g2 = nbi();
        z.sqrTo(g[1],g2);
        while(n <= km) {
          g[n] = nbi();
          z.mulTo(g2,g[n-2],g[n]);
          n += 2;
        }
      }

      var j = e.t-1, w, is1 = true, r2 = nbi(), t;
      i = nbits(e[j])-1;
      while(j >= 0) {
        if(i >= k1) w = (e[j]>>(i-k1))&km;
        else {
          w = (e[j]&((1<<(i+1))-1))<<(k1-i);
          if(j > 0) w |= e[j-1]>>(this.DB+i-k1);
        }

        n = k;
        while((w&1) == 0) { w >>= 1; --n; }
        if((i -= n) < 0) { i += this.DB; --j; }
        if(is1) {	// ret == 1, don't bother squaring or multiplying it
          g[w].copyTo(r);
          is1 = false;
        }
        else {
          while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }
          if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }
          z.mulTo(r2,g[w],r);
        }

        while(j >= 0 && (e[j]&(1<<i)) == 0) {
          z.sqrTo(r,r2); t = r; r = r2; r2 = t;
          if(--i < 0) { i = this.DB-1; --j; }
        }
      }
      return z.revert(r);
    }

    // (public) gcd(this,a) (HAC 14.54)
    function bnGCD(a) {
      var x = (this.s<0)?this.negate():this.clone();
      var y = (a.s<0)?a.negate():a.clone();
      if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }
      var i = x.getLowestSetBit(), g = y.getLowestSetBit();
      if(g < 0) return x;
      if(i < g) g = i;
      if(g > 0) {
        x.rShiftTo(g,x);
        y.rShiftTo(g,y);
      }
      while(x.signum() > 0) {
        if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);
        if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);
        if(x.compareTo(y) >= 0) {
          x.subTo(y,x);
          x.rShiftTo(1,x);
        }
        else {
          y.subTo(x,y);
          y.rShiftTo(1,y);
        }
      }
      if(g > 0) y.lShiftTo(g,y);
      return y;
    }

    // (protected) this % n, n < 2^26
    function bnpModInt(n) {
      if(n <= 0) return 0;
      var d = this.DV%n, r = (this.s<0)?n-1:0;
      if(this.t > 0)
        if(d == 0) r = this[0]%n;
        else for(var i = this.t-1; i >= 0; --i) r = (d*r+this[i])%n;
      return r;
    }

    // (public) 1/this % m (HAC 14.61)
    function bnModInverse(m) {
      var ac = m.isEven();
      if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;
      var u = m.clone(), v = this.clone();
      var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);
      while(u.signum() != 0) {
        while(u.isEven()) {
          u.rShiftTo(1,u);
          if(ac) {
            if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }
            a.rShiftTo(1,a);
          }
          else if(!b.isEven()) b.subTo(m,b);
          b.rShiftTo(1,b);
        }
        while(v.isEven()) {
          v.rShiftTo(1,v);
          if(ac) {
            if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }
            c.rShiftTo(1,c);
          }
          else if(!d.isEven()) d.subTo(m,d);
          d.rShiftTo(1,d);
        }
        if(u.compareTo(v) >= 0) {
          u.subTo(v,u);
          if(ac) a.subTo(c,a);
          b.subTo(d,b);
        }
        else {
          v.subTo(u,v);
          if(ac) c.subTo(a,c);
          d.subTo(b,d);
        }
      }
      if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;
      if(d.compareTo(m) >= 0) return d.subtract(m);
      if(d.signum() < 0) d.addTo(m,d); else return d;
      if(d.signum() < 0) return d.add(m); else return d;
    }

    var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];
    var lplim = (1<<26)/lowprimes[lowprimes.length-1];

    // (public) test primality with certainty >= 1-.5^t
    function bnIsProbablePrime(t) {
      var i, x = this.abs();
      if(x.t == 1 && x[0] <= lowprimes[lowprimes.length-1]) {
        for(i = 0; i < lowprimes.length; ++i)
          if(x[0] == lowprimes[i]) return true;
        return false;
      }
      if(x.isEven()) return false;
      i = 1;
      while(i < lowprimes.length) {
        var m = lowprimes[i], j = i+1;
        while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];
        m = x.modInt(m);
        while(i < j) if(m%lowprimes[i++] == 0) return false;
      }
      return x.millerRabin(t);
    }

    // (protected) true if probably prime (HAC 4.24, Miller-Rabin)
    function bnpMillerRabin(t) {
      var n1 = this.subtract(BigInteger.ONE);
      var k = n1.getLowestSetBit();
      if(k <= 0) return false;
      var r = n1.shiftRight(k);
      t = (t+1)>>1;
      if(t > lowprimes.length) t = lowprimes.length;
      var a = nbi();
      for(var i = 0; i < t; ++i) {
        //Pick bases at random, instead of starting at 2
        a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);
        var y = a.modPow(r,this);
        if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
          var j = 1;
          while(j++ < k && y.compareTo(n1) != 0) {
            y = y.modPowInt(2,this);
            if(y.compareTo(BigInteger.ONE) == 0) return false;
          }
          if(y.compareTo(n1) != 0) return false;
        }
      }
      return true;
    }

    // protected
    BigInteger.prototype.chunkSize = bnpChunkSize;
    BigInteger.prototype.toRadix = bnpToRadix;
    BigInteger.prototype.fromRadix = bnpFromRadix;
    BigInteger.prototype.fromNumber = bnpFromNumber;
    BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
    BigInteger.prototype.changeBit = bnpChangeBit;
    BigInteger.prototype.addTo = bnpAddTo;
    BigInteger.prototype.dMultiply = bnpDMultiply;
    BigInteger.prototype.dAddOffset = bnpDAddOffset;
    BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
    BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
    BigInteger.prototype.modInt = bnpModInt;
    BigInteger.prototype.millerRabin = bnpMillerRabin;

    // public
    BigInteger.prototype.clone = bnClone;
    BigInteger.prototype.intValue = bnIntValue;
    BigInteger.prototype.byteValue = bnByteValue;
    BigInteger.prototype.shortValue = bnShortValue;
    BigInteger.prototype.signum = bnSigNum;
    BigInteger.prototype.toByteArray = bnToByteArray;
    BigInteger.prototype.equals = bnEquals;
    BigInteger.prototype.min = bnMin;
    BigInteger.prototype.max = bnMax;
    BigInteger.prototype.and = bnAnd;
    BigInteger.prototype.or = bnOr;
    BigInteger.prototype.xor = bnXor;
    BigInteger.prototype.andNot = bnAndNot;
    BigInteger.prototype.not = bnNot;
    BigInteger.prototype.shiftLeft = bnShiftLeft;
    BigInteger.prototype.shiftRight = bnShiftRight;
    BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
    BigInteger.prototype.bitCount = bnBitCount;
    BigInteger.prototype.testBit = bnTestBit;
    BigInteger.prototype.setBit = bnSetBit;
    BigInteger.prototype.clearBit = bnClearBit;
    BigInteger.prototype.flipBit = bnFlipBit;
    BigInteger.prototype.add = bnAdd;
    BigInteger.prototype.subtract = bnSubtract;
    BigInteger.prototype.multiply = bnMultiply;
    BigInteger.prototype.divide = bnDivide;
    BigInteger.prototype.remainder = bnRemainder;
    BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
    BigInteger.prototype.modPow = bnModPow;
    BigInteger.prototype.modInverse = bnModInverse;
    BigInteger.prototype.pow = bnPow;
    BigInteger.prototype.gcd = bnGCD;
    BigInteger.prototype.isProbablePrime = bnIsProbablePrime;

    // JSBN-specific extension
    BigInteger.prototype.square = bnSquare;

    // Expose the Barrett function
    BigInteger.prototype.Barrett = Barrett

    // BigInteger interfaces not implemented in jsbn:

    // BigInteger(int signum, byte[] magnitude)
    // double doubleValue()
    // float floatValue()
    // int hashCode()
    // long longValue()
    // static BigInteger valueOf(long val)

	// Random number generator - requires a PRNG backend, e.g. prng4.js

	// For best results, put code like
	// <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>
	// in your main HTML document.

	var rng_state;
	var rng_pool;
	var rng_pptr;

	// Mix in a 32-bit integer into the pool
	function rng_seed_int(x) {
	  rng_pool[rng_pptr++] ^= x & 255;
	  rng_pool[rng_pptr++] ^= (x >> 8) & 255;
	  rng_pool[rng_pptr++] ^= (x >> 16) & 255;
	  rng_pool[rng_pptr++] ^= (x >> 24) & 255;
	  if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;
	}

	// Mix in the current time (w/milliseconds) into the pool
	function rng_seed_time() {
	  rng_seed_int(new Date().getTime());
	}

	// Initialize the pool with junk if needed.
	if(rng_pool == null) {
	  rng_pool = new Array();
	  rng_pptr = 0;
	  var t;
	  if(typeof window !== "undefined" && window.crypto) {
		if (window.crypto.getRandomValues) {
		  // Use webcrypto if available
		  var ua = new Uint8Array(32);
		  window.crypto.getRandomValues(ua);
		  for(t = 0; t < 32; ++t)
			rng_pool[rng_pptr++] = ua[t];
		}
		else if(navigator.appName == "Netscape" && navigator.appVersion < "5") {
		  // Extract entropy (256 bits) from NS4 RNG if available
		  var z = window.crypto.random(32);
		  for(t = 0; t < z.length; ++t)
			rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;
		}
	  }
	  while(rng_pptr < rng_psize) {  // extract some randomness from Math.random()
		t = Math.floor(65536 * Math.random());
		rng_pool[rng_pptr++] = t >>> 8;
		rng_pool[rng_pptr++] = t & 255;
	  }
	  rng_pptr = 0;
	  rng_seed_time();
	  //rng_seed_int(window.screenX);
	  //rng_seed_int(window.screenY);
	}

	function rng_get_byte() {
	  if(rng_state == null) {
		rng_seed_time();
		rng_state = prng_newstate();
		rng_state.init(rng_pool);
		for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)
		  rng_pool[rng_pptr] = 0;
		rng_pptr = 0;
		//rng_pool = null;
	  }
	  // TODO: allow reseeding after first request
	  return rng_state.next();
	}

	function rng_get_bytes(ba) {
	  var i;
	  for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();
	}

	function SecureRandom() {}

	SecureRandom.prototype.nextBytes = rng_get_bytes;

	// prng4.js - uses Arcfour as a PRNG

	function Arcfour() {
	  this.i = 0;
	  this.j = 0;
	  this.S = new Array();
	}

	// Initialize arcfour context from key, an array of ints, each from [0..255]
	function ARC4init(key) {
	  var i, j, t;
	  for(i = 0; i < 256; ++i)
		this.S[i] = i;
	  j = 0;
	  for(i = 0; i < 256; ++i) {
		j = (j + this.S[i] + key[i % key.length]) & 255;
		t = this.S[i];
		this.S[i] = this.S[j];
		this.S[j] = t;
	  }
	  this.i = 0;
	  this.j = 0;
	}

	function ARC4next() {
	  var t;
	  this.i = (this.i + 1) & 255;
	  this.j = (this.j + this.S[this.i]) & 255;
	  t = this.S[this.i];
	  this.S[this.i] = this.S[this.j];
	  this.S[this.j] = t;
	  return this.S[(t + this.S[this.i]) & 255];
	}

	Arcfour.prototype.init = ARC4init;
	Arcfour.prototype.next = ARC4next;

	// Plug in your RNG constructor here
	function prng_newstate() {
	  return new Arcfour();
	}

	// Pool size must be a multiple of 4 and greater than 32.
	// An array of bytes the size of the pool will be passed to init()
	var rng_psize = 256;

  BigInteger.SecureRandom = SecureRandom;
  BigInteger.BigInteger = BigInteger;
  if (typeof exports !== 'undefined') {
    exports = module.exports = BigInteger;
  } else {
    this.BigInteger = BigInteger;
    this.SecureRandom = SecureRandom;
  }

}).call(this);
{
  "author": {
    "name": "Tom Wu"
  },
  "deprecated": false,
  "description": "The jsbn library is a fast, portable implementation of large-number math in pure JavaScript, enabling public-key crypto and other applications on desktop and mobile browsers.",
  "homepage": "https://github.com/andyperlitch/jsbn#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "jsbn",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/andyperlitch/jsbn.git"
  },
  "version": "0.1.1"
}extends: eslint:recommended
env:
  node: true
  browser: true
rules:
  block-scoped-var: 2
  complexity: [2, 13]
  curly: [2, multi-or-nest, consistent]
  dot-location: [2, property]
  dot-notation: 2
  indent: [2, 2, SwitchCase: 1]
  linebreak-style: [2, unix]
  new-cap: 2
  no-console: [2, allow: [warn, error]]
  no-else-return: 2
  no-eq-null: 2
  no-fallthrough: 2
  no-invalid-this: 2
  no-return-assign: 2
  no-shadow: 1
  no-trailing-spaces: 2
  no-use-before-define: [2, nofunc]
  quotes: [2, single, avoid-escape]
  semi: [2, always]
  strict: [2, global]
  valid-jsdoc: [2, requireReturn: false]
  no-control-regex: 0
MIT License

Copyright (c) 2017 Evgeny Poberezkin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';

var traverse = module.exports = function (schema, opts, cb) {
  // Legacy support for v0.3.1 and earlier.
  if (typeof opts == 'function') {
    cb = opts;
    opts = {};
  }

  cb = opts.cb || cb;
  var pre = (typeof cb == 'function') ? cb : cb.pre || function() {};
  var post = cb.post || function() {};

  _traverse(opts, pre, post, schema, '', schema);
};


traverse.keywords = {
  additionalItems: true,
  items: true,
  contains: true,
  additionalProperties: true,
  propertyNames: true,
  not: true
};

traverse.arrayKeywords = {
  items: true,
  allOf: true,
  anyOf: true,
  oneOf: true
};

traverse.propsKeywords = {
  definitions: true,
  properties: true,
  patternProperties: true,
  dependencies: true
};

traverse.skipKeywords = {
  default: true,
  enum: true,
  const: true,
  required: true,
  maximum: true,
  minimum: true,
  exclusiveMaximum: true,
  exclusiveMinimum: true,
  multipleOf: true,
  maxLength: true,
  minLength: true,
  pattern: true,
  format: true,
  maxItems: true,
  minItems: true,
  uniqueItems: true,
  maxProperties: true,
  minProperties: true
};


function _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {
  if (schema && typeof schema == 'object' && !Array.isArray(schema)) {
    pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
    for (var key in schema) {
      var sch = schema[key];
      if (Array.isArray(sch)) {
        if (key in traverse.arrayKeywords) {
          for (var i=0; i<sch.length; i++)
            _traverse(opts, pre, post, sch[i], jsonPtr + '/' + key + '/' + i, rootSchema, jsonPtr, key, schema, i);
        }
      } else if (key in traverse.propsKeywords) {
        if (sch && typeof sch == 'object') {
          for (var prop in sch)
            _traverse(opts, pre, post, sch[prop], jsonPtr + '/' + key + '/' + escapeJsonPtr(prop), rootSchema, jsonPtr, key, schema, prop);
        }
      } else if (key in traverse.keywords || (opts.allKeys && !(key in traverse.skipKeywords))) {
        _traverse(opts, pre, post, sch, jsonPtr + '/' + key, rootSchema, jsonPtr, key, schema);
      }
    }
    post(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
  }
}


function escapeJsonPtr(str) {
  return str.replace(/~/g, '~0').replace(/\//g, '~1');
}
{
  "author": {
    "name": "Evgeny Poberezkin"
  },
  "deprecated": false,
  "description": "Traverse JSON Schema passing each schema object to callback",
  "devDependencies": {
    "coveralls": "^2.13.1",
    "eslint": "^3.19.0",
    "mocha": "^3.4.2",
    "nyc": "^11.0.2",
    "pre-commit": "^1.2.2"
  },
  "homepage": "https://github.com/epoberezkin/json-schema-traverse#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "json-schema-traverse",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/epoberezkin/json-schema-traverse.git"
  },
  "version": "0.4.1"
}parserOptions:
  ecmaVersion: 6
globals:
  beforeEach: false
  describe: false
  it: false
'use strict';

var traverse = require('../index');
var assert = require('assert');

describe('json-schema-traverse', function() {
  var calls;

  beforeEach(function() {
    calls = [];
  });

  it('should traverse all keywords containing schemas recursively', function() {
    var schema = require('./fixtures/schema').schema;
    var expectedCalls = require('./fixtures/schema').expectedCalls;

    traverse(schema, {cb: callback});
    assert.deepStrictEqual(calls, expectedCalls);
  });

  describe('Legacy v0.3.1 API', function() {
    it('should traverse all keywords containing schemas recursively', function() {
      var schema = require('./fixtures/schema').schema;
      var expectedCalls = require('./fixtures/schema').expectedCalls;

      traverse(schema, callback);
      assert.deepStrictEqual(calls, expectedCalls);
    });

    it('should work when an options object is provided', function() {
      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var schema = require('./fixtures/schema').schema;
      var expectedCalls = require('./fixtures/schema').expectedCalls;

      traverse(schema, {}, callback);
      assert.deepStrictEqual(calls, expectedCalls);
    });
  });


  describe('allKeys option', function() {
    var schema = {
      someObject: {
        minimum: 1,
        maximum: 2
      }
    };

    it('should traverse objects with allKeys: true option', function() {
      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var expectedCalls = [
        [schema, '', schema, undefined, undefined, undefined, undefined],
        [schema.someObject, '/someObject', schema, '', 'someObject', schema, undefined]
      ];

      traverse(schema, {allKeys: true, cb: callback});
      assert.deepStrictEqual(calls, expectedCalls);
    });


    it('should NOT traverse objects with allKeys: false option', function() {
      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var expectedCalls = [
        [schema, '', schema, undefined, undefined, undefined, undefined]
      ];

      traverse(schema, {allKeys: false, cb: callback});
      assert.deepStrictEqual(calls, expectedCalls);
    });


    it('should NOT traverse objects without allKeys option', function() {
      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var expectedCalls = [
        [schema, '', schema, undefined, undefined, undefined, undefined]
      ];

      traverse(schema, {cb: callback});
      assert.deepStrictEqual(calls, expectedCalls);
    });


    it('should NOT travers objects in standard keywords which value is not a schema', function() {
      var schema2 = {
        const: {foo: 'bar'},
        enum: ['a', 'b'],
        required: ['foo'],
        another: {

        },
        patternProperties: {}, // will not traverse - no properties
        dependencies: true, // will not traverse - invalid
        properties: {
          smaller: {
            type: 'number'
          },
          larger: {
            type: 'number',
            minimum: {$data: '1/smaller'}
          }
        }
      };

      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var expectedCalls = [
        [schema2, '', schema2, undefined, undefined, undefined, undefined],
        [schema2.another, '/another', schema2, '', 'another', schema2, undefined],
        [schema2.properties.smaller, '/properties/smaller', schema2, '', 'properties', schema2, 'smaller'],
        [schema2.properties.larger, '/properties/larger', schema2, '', 'properties', schema2, 'larger'],
      ];

      traverse(schema2, {allKeys: true, cb: callback});
      assert.deepStrictEqual(calls, expectedCalls);
    });
  });

  describe('pre and post', function() {
    var schema = {
      type: 'object',
      properties: {
        name: {type: 'string'},
        age: {type: 'number'}
      }
    };

    it('should traverse schema in pre-order', function() {
      traverse(schema, {cb: {pre}});
      var expectedCalls = [
        ['pre', schema, '', schema, undefined, undefined, undefined, undefined],
        ['pre', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'],
        ['pre', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'],
      ];
      assert.deepStrictEqual(calls, expectedCalls);
    });

    it('should traverse schema in post-order', function() {
      traverse(schema, {cb: {post}});
      var expectedCalls = [
        ['post', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'],
        ['post', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'],
        ['post', schema, '', schema, undefined, undefined, undefined, undefined],
      ];
      assert.deepStrictEqual(calls, expectedCalls);
    });

    it('should traverse schema in pre- and post-order at the same time', function() {
      traverse(schema, {cb: {pre, post}});
      var expectedCalls = [
        ['pre', schema, '', schema, undefined, undefined, undefined, undefined],
        ['pre', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'],
        ['post', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'],
        ['pre', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'],
        ['post', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'],
        ['post', schema, '', schema, undefined, undefined, undefined, undefined],
      ];
      assert.deepStrictEqual(calls, expectedCalls);
    });
  });

  function callback() {
    calls.push(Array.prototype.slice.call(arguments));
  }

  function pre() {
    calls.push(['pre'].concat(Array.prototype.slice.call(arguments)));
  }

  function post() {
    calls.push(['post'].concat(Array.prototype.slice.call(arguments)));
  }
});
'use strict';

var schema = {
  additionalItems: subschema('additionalItems'),
  items: subschema('items'),
  contains: subschema('contains'),
  additionalProperties: subschema('additionalProperties'),
  propertyNames: subschema('propertyNames'),
  not: subschema('not'),
  allOf: [
    subschema('allOf_0'),
    subschema('allOf_1'),
    {
      items: [
        subschema('items_0'),
        subschema('items_1'),
      ]
    }
  ],
  anyOf: [
    subschema('anyOf_0'),
    subschema('anyOf_1'),
  ],
  oneOf: [
    subschema('oneOf_0'),
    subschema('oneOf_1'),
  ],
  definitions: {
    foo: subschema('definitions_foo'),
    bar: subschema('definitions_bar'),
  },
  properties: {
    foo: subschema('properties_foo'),
    bar: subschema('properties_bar'),
  },
  patternProperties: {
    foo: subschema('patternProperties_foo'),
    bar: subschema('patternProperties_bar'),
  },
  dependencies: {
    foo: subschema('dependencies_foo'),
    bar: subschema('dependencies_bar'),
  },
  required: ['foo', 'bar']
};


function subschema(keyword) {
  var sch = {
    properties: {},
    additionalProperties: false,
    additionalItems: false,
    anyOf: [
      {format: 'email'},
      {format: 'hostname'}
    ]
  };
  sch.properties['foo_' + keyword] = {title: 'foo'};
  sch.properties['bar_' + keyword] = {title: 'bar'};
  return sch;
}


module.exports = {
  schema: schema,

  // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
  expectedCalls: [[schema, '', schema, undefined, undefined, undefined, undefined]]
    .concat(expectedCalls('additionalItems'))
    .concat(expectedCalls('items'))
    .concat(expectedCalls('contains'))
    .concat(expectedCalls('additionalProperties'))
    .concat(expectedCalls('propertyNames'))
    .concat(expectedCalls('not'))
    .concat(expectedCallsChild('allOf', 0))
    .concat(expectedCallsChild('allOf', 1))
    .concat([
      [schema.allOf[2], '/allOf/2', schema, '', 'allOf', schema, 2],
      [schema.allOf[2].items[0], '/allOf/2/items/0', schema, '/allOf/2', 'items', schema.allOf[2], 0],
      [schema.allOf[2].items[0].properties.foo_items_0, '/allOf/2/items/0/properties/foo_items_0', schema, '/allOf/2/items/0', 'properties', schema.allOf[2].items[0], 'foo_items_0'],
      [schema.allOf[2].items[0].properties.bar_items_0, '/allOf/2/items/0/properties/bar_items_0', schema, '/allOf/2/items/0', 'properties', schema.allOf[2].items[0], 'bar_items_0'],
      [schema.allOf[2].items[0].anyOf[0], '/allOf/2/items/0/anyOf/0', schema, '/allOf/2/items/0', 'anyOf', schema.allOf[2].items[0], 0],
      [schema.allOf[2].items[0].anyOf[1], '/allOf/2/items/0/anyOf/1', schema, '/allOf/2/items/0', 'anyOf', schema.allOf[2].items[0], 1],

      [schema.allOf[2].items[1], '/allOf/2/items/1', schema, '/allOf/2', 'items', schema.allOf[2], 1],
      [schema.allOf[2].items[1].properties.foo_items_1, '/allOf/2/items/1/properties/foo_items_1', schema, '/allOf/2/items/1', 'properties', schema.allOf[2].items[1], 'foo_items_1'],
      [schema.allOf[2].items[1].properties.bar_items_1, '/allOf/2/items/1/properties/bar_items_1', schema, '/allOf/2/items/1', 'properties', schema.allOf[2].items[1], 'bar_items_1'],
      [schema.allOf[2].items[1].anyOf[0], '/allOf/2/items/1/anyOf/0', schema, '/allOf/2/items/1', 'anyOf', schema.allOf[2].items[1], 0],
      [schema.allOf[2].items[1].anyOf[1], '/allOf/2/items/1/anyOf/1', schema, '/allOf/2/items/1', 'anyOf', schema.allOf[2].items[1], 1]
    ])
    .concat(expectedCallsChild('anyOf', 0))
    .concat(expectedCallsChild('anyOf', 1))
    .concat(expectedCallsChild('oneOf', 0))
    .concat(expectedCallsChild('oneOf', 1))
    .concat(expectedCallsChild('definitions', 'foo'))
    .concat(expectedCallsChild('definitions', 'bar'))
    .concat(expectedCallsChild('properties', 'foo'))
    .concat(expectedCallsChild('properties', 'bar'))
    .concat(expectedCallsChild('patternProperties', 'foo'))
    .concat(expectedCallsChild('patternProperties', 'bar'))
    .concat(expectedCallsChild('dependencies', 'foo'))
    .concat(expectedCallsChild('dependencies', 'bar'))
};


function expectedCalls(keyword) {
  return [
    [schema[keyword], `/${keyword}`, schema, '', keyword, schema, undefined],
    [schema[keyword].properties[`foo_${keyword}`], `/${keyword}/properties/foo_${keyword}`, schema, `/${keyword}`, 'properties', schema[keyword], `foo_${keyword}`],
    [schema[keyword].properties[`bar_${keyword}`], `/${keyword}/properties/bar_${keyword}`, schema, `/${keyword}`, 'properties', schema[keyword], `bar_${keyword}`],
    [schema[keyword].anyOf[0], `/${keyword}/anyOf/0`, schema, `/${keyword}`, 'anyOf', schema[keyword], 0],
    [schema[keyword].anyOf[1], `/${keyword}/anyOf/1`, schema, `/${keyword}`, 'anyOf', schema[keyword], 1]
  ];
}


function expectedCallsChild(keyword, i) {
  return [
    [schema[keyword][i], `/${keyword}/${i}`, schema, '', keyword, schema, i],
    [schema[keyword][i].properties[`foo_${keyword}_${i}`], `/${keyword}/${i}/properties/foo_${keyword}_${i}`, schema, `/${keyword}/${i}`, 'properties', schema[keyword][i], `foo_${keyword}_${i}`],
    [schema[keyword][i].properties[`bar_${keyword}_${i}`], `/${keyword}/${i}/properties/bar_${keyword}_${i}`, schema, `/${keyword}/${i}`, 'properties', schema[keyword][i], `bar_${keyword}_${i}`],
    [schema[keyword][i].anyOf[0], `/${keyword}/${i}/anyOf/0`, schema, `/${keyword}/${i}`, 'anyOf', schema[keyword][i], 0],
    [schema[keyword][i].anyOf[1], `/${keyword}/${i}/anyOf/1`, schema, `/${keyword}/${i}`, 'anyOf', schema[keyword][i], 1]
  ];
}
MIT License

Copyright (c) 2012-2018 Aseem Kishore, and [others].

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

[others]: https://github.com/json5/json5/contributors
{
  "author": {
    "name": "Aseem Kishore",
    "email": "aseem.kishore@gmail.com"
  },
  "bin": {
    "json5": "lib/cli.js"
  },
  "browser": "dist/index.js",
  "dependencies": {
    "minimist": "^1.2.5"
  },
  "deprecated": false,
  "description": "JSON for humans.",
  "devDependencies": {
    "core-js": "^2.6.5",
    "eslint": "^5.15.3",
    "eslint-config-standard": "^12.0.0",
    "eslint-plugin-import": "^2.16.0",
    "eslint-plugin-node": "^8.0.1",
    "eslint-plugin-promise": "^4.0.1",
    "eslint-plugin-standard": "^4.0.0",
    "regenerate": "^1.4.0",
    "rollup": "^0.64.1",
    "rollup-plugin-buble": "^0.19.6",
    "rollup-plugin-commonjs": "^9.2.1",
    "rollup-plugin-node-resolve": "^3.4.0",
    "rollup-plugin-terser": "^1.0.1",
    "sinon": "^6.3.5",
    "tap": "^12.6.0",
    "unicode-10.0.0": "^0.7.5"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "lib/",
    "dist/"
  ],
  "homepage": "http://json5.org/",
  "license": "MIT",
  "main": "lib/index.js",
  "module": "dist/index.mjs",
  "name": "json5",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/json5/json5.git"
  },
  "version": "2.1.3"
}#!/usr/bin/env node

const fs = require('fs')
const path = require('path')
const minimist = require('minimist')
const pkg = require('../package.json')
const JSON5 = require('./')

const argv = minimist(process.argv.slice(2), {
    alias: {
        'convert': 'c',
        'space': 's',
        'validate': 'v',
        'out-file': 'o',
        'version': 'V',
        'help': 'h',
    },
    boolean: [
        'convert',
        'validate',
        'version',
        'help',
    ],
    string: [
        'space',
        'out-file',
    ],
})

if (argv.version) {
    version()
} else if (argv.help) {
    usage()
} else {
    const inFilename = argv._[0]

    let readStream
    if (inFilename) {
        readStream = fs.createReadStream(inFilename)
    } else {
        readStream = process.stdin
    }

    let json5 = ''
    readStream.on('data', data => {
        json5 += data
    })

    readStream.on('end', () => {
        let space
        if (argv.space === 't' || argv.space === 'tab') {
            space = '\t'
        } else {
            space = Number(argv.space)
        }

        let value
        try {
            value = JSON5.parse(json5)
            if (!argv.validate) {
                const json = JSON.stringify(value, null, space)

                let writeStream

                // --convert is for backward compatibility with v0.5.1. If
                // specified with <file> and not --out-file, then a file with
                // the same name but with a .json extension will be written.
                if (argv.convert && inFilename && !argv.o) {
                    const parsedFilename = path.parse(inFilename)
                    const outFilename = path.format(
                        Object.assign(
                            parsedFilename,
                            {base: path.basename(parsedFilename.base, parsedFilename.ext) + '.json'}
                        )
                    )

                    writeStream = fs.createWriteStream(outFilename)
                } else if (argv.o) {
                    writeStream = fs.createWriteStream(argv.o)
                } else {
                    writeStream = process.stdout
                }

                writeStream.write(json)
            }
        } catch (err) {
            console.error(err.message)
            process.exit(1)
        }
    })
}

function version () {
    console.log(pkg.version)
}

function usage () {
    console.log(
        `
  Usage: json5 [options] <file>

  If <file> is not provided, then STDIN is used.

  Options:

    -s, --space              The number of spaces to indent or 't' for tabs
    -o, --out-file [file]    Output to the specified file, otherwise STDOUT
    -v, --validate           Validate JSON5 but do not output JSON
    -V, --version            Output the version number
    -h, --help               Output usage information`
    )
}
const parse = require('./parse')
const stringify = require('./stringify')

const JSON5 = {
    parse,
    stringify,
}

module.exports = JSON5
const util = require('./util')

let source
let parseState
let stack
let pos
let line
let column
let token
let key
let root

module.exports = function parse (text, reviver) {
    source = String(text)
    parseState = 'start'
    stack = []
    pos = 0
    line = 1
    column = 0
    token = undefined
    key = undefined
    root = undefined

    do {
        token = lex()

        // This code is unreachable.
        // if (!parseStates[parseState]) {
        //     throw invalidParseState()
        // }

        parseStates[parseState]()
    } while (token.type !== 'eof')

    if (typeof reviver === 'function') {
        return internalize({'': root}, '', reviver)
    }

    return root
}

function internalize (holder, name, reviver) {
    const value = holder[name]
    if (value != null && typeof value === 'object') {
        for (const key in value) {
            const replacement = internalize(value, key, reviver)
            if (replacement === undefined) {
                delete value[key]
            } else {
                value[key] = replacement
            }
        }
    }

    return reviver.call(holder, name, value)
}

let lexState
let buffer
let doubleQuote
let sign
let c

function lex () {
    lexState = 'default'
    buffer = ''
    doubleQuote = false
    sign = 1

    for (;;) {
        c = peek()

        // This code is unreachable.
        // if (!lexStates[lexState]) {
        //     throw invalidLexState(lexState)
        // }

        const token = lexStates[lexState]()
        if (token) {
            return token
        }
    }
}

function peek () {
    if (source[pos]) {
        return String.fromCodePoint(source.codePointAt(pos))
    }
}

function read () {
    const c = peek()

    if (c === '\n') {
        line++
        column = 0
    } else if (c) {
        column += c.length
    } else {
        column++
    }

    if (c) {
        pos += c.length
    }

    return c
}

const lexStates = {
    default () {
        switch (c) {
        case '\t':
        case '\v':
        case '\f':
        case ' ':
        case '\u00A0':
        case '\uFEFF':
        case '\n':
        case '\r':
        case '\u2028':
        case '\u2029':
            read()
            return

        case '/':
            read()
            lexState = 'comment'
            return

        case undefined:
            read()
            return newToken('eof')
        }

        if (util.isSpaceSeparator(c)) {
            read()
            return
        }

        // This code is unreachable.
        // if (!lexStates[parseState]) {
        //     throw invalidLexState(parseState)
        // }

        return lexStates[parseState]()
    },

    comment () {
        switch (c) {
        case '*':
            read()
            lexState = 'multiLineComment'
            return

        case '/':
            read()
            lexState = 'singleLineComment'
            return
        }

        throw invalidChar(read())
    },

    multiLineComment () {
        switch (c) {
        case '*':
            read()
            lexState = 'multiLineCommentAsterisk'
            return

        case undefined:
            throw invalidChar(read())
        }

        read()
    },

    multiLineCommentAsterisk () {
        switch (c) {
        case '*':
            read()
            return

        case '/':
            read()
            lexState = 'default'
            return

        case undefined:
            throw invalidChar(read())
        }

        read()
        lexState = 'multiLineComment'
    },

    singleLineComment () {
        switch (c) {
        case '\n':
        case '\r':
        case '\u2028':
        case '\u2029':
            read()
            lexState = 'default'
            return

        case undefined:
            read()
            return newToken('eof')
        }

        read()
    },

    value () {
        switch (c) {
        case '{':
        case '[':
            return newToken('punctuator', read())

        case 'n':
            read()
            literal('ull')
            return newToken('null', null)

        case 't':
            read()
            literal('rue')
            return newToken('boolean', true)

        case 'f':
            read()
            literal('alse')
            return newToken('boolean', false)

        case '-':
        case '+':
            if (read() === '-') {
                sign = -1
            }

            lexState = 'sign'
            return

        case '.':
            buffer = read()
            lexState = 'decimalPointLeading'
            return

        case '0':
            buffer = read()
            lexState = 'zero'
            return

        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            buffer = read()
            lexState = 'decimalInteger'
            return

        case 'I':
            read()
            literal('nfinity')
            return newToken('numeric', Infinity)

        case 'N':
            read()
            literal('aN')
            return newToken('numeric', NaN)

        case '"':
        case "'":
            doubleQuote = (read() === '"')
            buffer = ''
            lexState = 'string'
            return
        }

        throw invalidChar(read())
    },

    identifierNameStartEscape () {
        if (c !== 'u') {
            throw invalidChar(read())
        }

        read()
        const u = unicodeEscape()
        switch (u) {
        case '$':
        case '_':
            break

        default:
            if (!util.isIdStartChar(u)) {
                throw invalidIdentifier()
            }

            break
        }

        buffer += u
        lexState = 'identifierName'
    },

    identifierName () {
        switch (c) {
        case '$':
        case '_':
        case '\u200C':
        case '\u200D':
            buffer += read()
            return

        case '\\':
            read()
            lexState = 'identifierNameEscape'
            return
        }

        if (util.isIdContinueChar(c)) {
            buffer += read()
            return
        }

        return newToken('identifier', buffer)
    },

    identifierNameEscape () {
        if (c !== 'u') {
            throw invalidChar(read())
        }

        read()
        const u = unicodeEscape()
        switch (u) {
        case '$':
        case '_':
        case '\u200C':
        case '\u200D':
            break

        default:
            if (!util.isIdContinueChar(u)) {
                throw invalidIdentifier()
            }

            break
        }

        buffer += u
        lexState = 'identifierName'
    },

    sign () {
        switch (c) {
        case '.':
            buffer = read()
            lexState = 'decimalPointLeading'
            return

        case '0':
            buffer = read()
            lexState = 'zero'
            return

        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            buffer = read()
            lexState = 'decimalInteger'
            return

        case 'I':
            read()
            literal('nfinity')
            return newToken('numeric', sign * Infinity)

        case 'N':
            read()
            literal('aN')
            return newToken('numeric', NaN)
        }

        throw invalidChar(read())
    },

    zero () {
        switch (c) {
        case '.':
            buffer += read()
            lexState = 'decimalPoint'
            return

        case 'e':
        case 'E':
            buffer += read()
            lexState = 'decimalExponent'
            return

        case 'x':
        case 'X':
            buffer += read()
            lexState = 'hexadecimal'
            return
        }

        return newToken('numeric', sign * 0)
    },

    decimalInteger () {
        switch (c) {
        case '.':
            buffer += read()
            lexState = 'decimalPoint'
            return

        case 'e':
        case 'E':
            buffer += read()
            lexState = 'decimalExponent'
            return
        }

        if (util.isDigit(c)) {
            buffer += read()
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    decimalPointLeading () {
        if (util.isDigit(c)) {
            buffer += read()
            lexState = 'decimalFraction'
            return
        }

        throw invalidChar(read())
    },

    decimalPoint () {
        switch (c) {
        case 'e':
        case 'E':
            buffer += read()
            lexState = 'decimalExponent'
            return
        }

        if (util.isDigit(c)) {
            buffer += read()
            lexState = 'decimalFraction'
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    decimalFraction () {
        switch (c) {
        case 'e':
        case 'E':
            buffer += read()
            lexState = 'decimalExponent'
            return
        }

        if (util.isDigit(c)) {
            buffer += read()
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    decimalExponent () {
        switch (c) {
        case '+':
        case '-':
            buffer += read()
            lexState = 'decimalExponentSign'
            return
        }

        if (util.isDigit(c)) {
            buffer += read()
            lexState = 'decimalExponentInteger'
            return
        }

        throw invalidChar(read())
    },

    decimalExponentSign () {
        if (util.isDigit(c)) {
            buffer += read()
            lexState = 'decimalExponentInteger'
            return
        }

        throw invalidChar(read())
    },

    decimalExponentInteger () {
        if (util.isDigit(c)) {
            buffer += read()
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    hexadecimal () {
        if (util.isHexDigit(c)) {
            buffer += read()
            lexState = 'hexadecimalInteger'
            return
        }

        throw invalidChar(read())
    },

    hexadecimalInteger () {
        if (util.isHexDigit(c)) {
            buffer += read()
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    string () {
        switch (c) {
        case '\\':
            read()
            buffer += escape()
            return

        case '"':
            if (doubleQuote) {
                read()
                return newToken('string', buffer)
            }

            buffer += read()
            return

        case "'":
            if (!doubleQuote) {
                read()
                return newToken('string', buffer)
            }

            buffer += read()
            return

        case '\n':
        case '\r':
            throw invalidChar(read())

        case '\u2028':
        case '\u2029':
            separatorChar(c)
            break

        case undefined:
            throw invalidChar(read())
        }

        buffer += read()
    },

    start () {
        switch (c) {
        case '{':
        case '[':
            return newToken('punctuator', read())

        // This code is unreachable since the default lexState handles eof.
        // case undefined:
        //     return newToken('eof')
        }

        lexState = 'value'
    },

    beforePropertyName () {
        switch (c) {
        case '$':
        case '_':
            buffer = read()
            lexState = 'identifierName'
            return

        case '\\':
            read()
            lexState = 'identifierNameStartEscape'
            return

        case '}':
            return newToken('punctuator', read())

        case '"':
        case "'":
            doubleQuote = (read() === '"')
            lexState = 'string'
            return
        }

        if (util.isIdStartChar(c)) {
            buffer += read()
            lexState = 'identifierName'
            return
        }

        throw invalidChar(read())
    },

    afterPropertyName () {
        if (c === ':') {
            return newToken('punctuator', read())
        }

        throw invalidChar(read())
    },

    beforePropertyValue () {
        lexState = 'value'
    },

    afterPropertyValue () {
        switch (c) {
        case ',':
        case '}':
            return newToken('punctuator', read())
        }

        throw invalidChar(read())
    },

    beforeArrayValue () {
        if (c === ']') {
            return newToken('punctuator', read())
        }

        lexState = 'value'
    },

    afterArrayValue () {
        switch (c) {
        case ',':
        case ']':
            return newToken('punctuator', read())
        }

        throw invalidChar(read())
    },

    end () {
        // This code is unreachable since it's handled by the default lexState.
        // if (c === undefined) {
        //     read()
        //     return newToken('eof')
        // }

        throw invalidChar(read())
    },
}

function newToken (type, value) {
    return {
        type,
        value,
        line,
        column,
    }
}

function literal (s) {
    for (const c of s) {
        const p = peek()

        if (p !== c) {
            throw invalidChar(read())
        }

        read()
    }
}

function escape () {
    const c = peek()
    switch (c) {
    case 'b':
        read()
        return '\b'

    case 'f':
        read()
        return '\f'

    case 'n':
        read()
        return '\n'

    case 'r':
        read()
        return '\r'

    case 't':
        read()
        return '\t'

    case 'v':
        read()
        return '\v'

    case '0':
        read()
        if (util.isDigit(peek())) {
            throw invalidChar(read())
        }

        return '\0'

    case 'x':
        read()
        return hexEscape()

    case 'u':
        read()
        return unicodeEscape()

    case '\n':
    case '\u2028':
    case '\u2029':
        read()
        return ''

    case '\r':
        read()
        if (peek() === '\n') {
            read()
        }

        return ''

    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
        throw invalidChar(read())

    case undefined:
        throw invalidChar(read())
    }

    return read()
}

function hexEscape () {
    let buffer = ''
    let c = peek()

    if (!util.isHexDigit(c)) {
        throw invalidChar(read())
    }

    buffer += read()

    c = peek()
    if (!util.isHexDigit(c)) {
        throw invalidChar(read())
    }

    buffer += read()

    return String.fromCodePoint(parseInt(buffer, 16))
}

function unicodeEscape () {
    let buffer = ''
    let count = 4

    while (count-- > 0) {
        const c = peek()
        if (!util.isHexDigit(c)) {
            throw invalidChar(read())
        }

        buffer += read()
    }

    return String.fromCodePoint(parseInt(buffer, 16))
}

const parseStates = {
    start () {
        if (token.type === 'eof') {
            throw invalidEOF()
        }

        push()
    },

    beforePropertyName () {
        switch (token.type) {
        case 'identifier':
        case 'string':
            key = token.value
            parseState = 'afterPropertyName'
            return

        case 'punctuator':
            // This code is unreachable since it's handled by the lexState.
            // if (token.value !== '}') {
            //     throw invalidToken()
            // }

            pop()
            return

        case 'eof':
            throw invalidEOF()
        }

        // This code is unreachable since it's handled by the lexState.
        // throw invalidToken()
    },

    afterPropertyName () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'punctuator' || token.value !== ':') {
        //     throw invalidToken()
        // }

        if (token.type === 'eof') {
            throw invalidEOF()
        }

        parseState = 'beforePropertyValue'
    },

    beforePropertyValue () {
        if (token.type === 'eof') {
            throw invalidEOF()
        }

        push()
    },

    beforeArrayValue () {
        if (token.type === 'eof') {
            throw invalidEOF()
        }

        if (token.type === 'punctuator' && token.value === ']') {
            pop()
            return
        }

        push()
    },

    afterPropertyValue () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'punctuator') {
        //     throw invalidToken()
        // }

        if (token.type === 'eof') {
            throw invalidEOF()
        }

        switch (token.value) {
        case ',':
            parseState = 'beforePropertyName'
            return

        case '}':
            pop()
        }

        // This code is unreachable since it's handled by the lexState.
        // throw invalidToken()
    },

    afterArrayValue () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'punctuator') {
        //     throw invalidToken()
        // }

        if (token.type === 'eof') {
            throw invalidEOF()
        }

        switch (token.value) {
        case ',':
            parseState = 'beforeArrayValue'
            return

        case ']':
            pop()
        }

        // This code is unreachable since it's handled by the lexState.
        // throw invalidToken()
    },

    end () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'eof') {
        //     throw invalidToken()
        // }
    },
}

function push () {
    let value

    switch (token.type) {
    case 'punctuator':
        switch (token.value) {
        case '{':
            value = {}
            break

        case '[':
            value = []
            break
        }

        break

    case 'null':
    case 'boolean':
    case 'numeric':
    case 'string':
        value = token.value
        break

    // This code is unreachable.
    // default:
    //     throw invalidToken()
    }

    if (root === undefined) {
        root = value
    } else {
        const parent = stack[stack.length - 1]
        if (Array.isArray(parent)) {
            parent.push(value)
        } else {
            parent[key] = value
        }
    }

    if (value !== null && typeof value === 'object') {
        stack.push(value)

        if (Array.isArray(value)) {
            parseState = 'beforeArrayValue'
        } else {
            parseState = 'beforePropertyName'
        }
    } else {
        const current = stack[stack.length - 1]
        if (current == null) {
            parseState = 'end'
        } else if (Array.isArray(current)) {
            parseState = 'afterArrayValue'
        } else {
            parseState = 'afterPropertyValue'
        }
    }
}

function pop () {
    stack.pop()

    const current = stack[stack.length - 1]
    if (current == null) {
        parseState = 'end'
    } else if (Array.isArray(current)) {
        parseState = 'afterArrayValue'
    } else {
        parseState = 'afterPropertyValue'
    }
}

// This code is unreachable.
// function invalidParseState () {
//     return new Error(`JSON5: invalid parse state '${parseState}'`)
// }

// This code is unreachable.
// function invalidLexState (state) {
//     return new Error(`JSON5: invalid lex state '${state}'`)
// }

function invalidChar (c) {
    if (c === undefined) {
        return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
    }

    return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
}

function invalidEOF () {
    return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
}

// This code is unreachable.
// function invalidToken () {
//     if (token.type === 'eof') {
//         return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
//     }

//     const c = String.fromCodePoint(token.value.codePointAt(0))
//     return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
// }

function invalidIdentifier () {
    column -= 5
    return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`)
}

function separatorChar (c) {
    console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`)
}

function formatChar (c) {
    const replacements = {
        "'": "\\'",
        '"': '\\"',
        '\\': '\\\\',
        '\b': '\\b',
        '\f': '\\f',
        '\n': '\\n',
        '\r': '\\r',
        '\t': '\\t',
        '\v': '\\v',
        '\0': '\\0',
        '\u2028': '\\u2028',
        '\u2029': '\\u2029',
    }

    if (replacements[c]) {
        return replacements[c]
    }

    if (c < ' ') {
        const hexString = c.charCodeAt(0).toString(16)
        return '\\x' + ('00' + hexString).substring(hexString.length)
    }

    return c
}

function syntaxError (message) {
    const err = new SyntaxError(message)
    err.lineNumber = line
    err.columnNumber = column
    return err
}
const fs = require('fs')
const JSON5 = require('./')

// eslint-disable-next-line node/no-deprecated-api
require.extensions['.json5'] = function (module, filename) {
    const content = fs.readFileSync(filename, 'utf8')
    try {
        module.exports = JSON5.parse(content)
    } catch (err) {
        err.message = filename + ': ' + err.message
        throw err
    }
}
// This file is for backward compatibility with v0.5.1.
require('./register')

console.warn("'json5/require' is deprecated. Please use 'json5/register' instead.")
const util = require('./util')

module.exports = function stringify (value, replacer, space) {
    const stack = []
    let indent = ''
    let propertyList
    let replacerFunc
    let gap = ''
    let quote

    if (
        replacer != null &&
        typeof replacer === 'object' &&
        !Array.isArray(replacer)
    ) {
        space = replacer.space
        quote = replacer.quote
        replacer = replacer.replacer
    }

    if (typeof replacer === 'function') {
        replacerFunc = replacer
    } else if (Array.isArray(replacer)) {
        propertyList = []
        for (const v of replacer) {
            let item

            if (typeof v === 'string') {
                item = v
            } else if (
                typeof v === 'number' ||
                v instanceof String ||
                v instanceof Number
            ) {
                item = String(v)
            }

            if (item !== undefined && propertyList.indexOf(item) < 0) {
                propertyList.push(item)
            }
        }
    }

    if (space instanceof Number) {
        space = Number(space)
    } else if (space instanceof String) {
        space = String(space)
    }

    if (typeof space === 'number') {
        if (space > 0) {
            space = Math.min(10, Math.floor(space))
            gap = '          '.substr(0, space)
        }
    } else if (typeof space === 'string') {
        gap = space.substr(0, 10)
    }

    return serializeProperty('', {'': value})

    function serializeProperty (key, holder) {
        let value = holder[key]
        if (value != null) {
            if (typeof value.toJSON5 === 'function') {
                value = value.toJSON5(key)
            } else if (typeof value.toJSON === 'function') {
                value = value.toJSON(key)
            }
        }

        if (replacerFunc) {
            value = replacerFunc.call(holder, key, value)
        }

        if (value instanceof Number) {
            value = Number(value)
        } else if (value instanceof String) {
            value = String(value)
        } else if (value instanceof Boolean) {
            value = value.valueOf()
        }

        switch (value) {
        case null: return 'null'
        case true: return 'true'
        case false: return 'false'
        }

        if (typeof value === 'string') {
            return quoteString(value, false)
        }

        if (typeof value === 'number') {
            return String(value)
        }

        if (typeof value === 'object') {
            return Array.isArray(value) ? serializeArray(value) : serializeObject(value)
        }

        return undefined
    }

    function quoteString (value) {
        const quotes = {
            "'": 0.1,
            '"': 0.2,
        }

        const replacements = {
            "'": "\\'",
            '"': '\\"',
            '\\': '\\\\',
            '\b': '\\b',
            '\f': '\\f',
            '\n': '\\n',
            '\r': '\\r',
            '\t': '\\t',
            '\v': '\\v',
            '\0': '\\0',
            '\u2028': '\\u2028',
            '\u2029': '\\u2029',
        }

        let product = ''

        for (let i = 0; i < value.length; i++) {
            const c = value[i]
            switch (c) {
            case "'":
            case '"':
                quotes[c]++
                product += c
                continue

            case '\0':
                if (util.isDigit(value[i + 1])) {
                    product += '\\x00'
                    continue
                }
            }

            if (replacements[c]) {
                product += replacements[c]
                continue
            }

            if (c < ' ') {
                let hexString = c.charCodeAt(0).toString(16)
                product += '\\x' + ('00' + hexString).substring(hexString.length)
                continue
            }

            product += c
        }

        const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b)

        product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar])

        return quoteChar + product + quoteChar
    }

    function serializeObject (value) {
        if (stack.indexOf(value) >= 0) {
            throw TypeError('Converting circular structure to JSON5')
        }

        stack.push(value)

        let stepback = indent
        indent = indent + gap

        let keys = propertyList || Object.keys(value)
        let partial = []
        for (const key of keys) {
            const propertyString = serializeProperty(key, value)
            if (propertyString !== undefined) {
                let member = serializeKey(key) + ':'
                if (gap !== '') {
                    member += ' '
                }
                member += propertyString
                partial.push(member)
            }
        }

        let final
        if (partial.length === 0) {
            final = '{}'
        } else {
            let properties
            if (gap === '') {
                properties = partial.join(',')
                final = '{' + properties + '}'
            } else {
                let separator = ',\n' + indent
                properties = partial.join(separator)
                final = '{\n' + indent + properties + ',\n' + stepback + '}'
            }
        }

        stack.pop()
        indent = stepback
        return final
    }

    function serializeKey (key) {
        if (key.length === 0) {
            return quoteString(key, true)
        }

        const firstChar = String.fromCodePoint(key.codePointAt(0))
        if (!util.isIdStartChar(firstChar)) {
            return quoteString(key, true)
        }

        for (let i = firstChar.length; i < key.length; i++) {
            if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {
                return quoteString(key, true)
            }
        }

        return key
    }

    function serializeArray (value) {
        if (stack.indexOf(value) >= 0) {
            throw TypeError('Converting circular structure to JSON5')
        }

        stack.push(value)

        let stepback = indent
        indent = indent + gap

        let partial = []
        for (let i = 0; i < value.length; i++) {
            const propertyString = serializeProperty(String(i), value)
            partial.push((propertyString !== undefined) ? propertyString : 'null')
        }

        let final
        if (partial.length === 0) {
            final = '[]'
        } else {
            if (gap === '') {
                let properties = partial.join(',')
                final = '[' + properties + ']'
            } else {
                let separator = ',\n' + indent
                let properties = partial.join(separator)
                final = '[\n' + indent + properties + ',\n' + stepback + ']'
            }
        }

        stack.pop()
        indent = stepback
        return final
    }
}
// This is a generated file. Do not edit.
module.exports.Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/
module.exports.ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/
module.exports.ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
const unicode = require('../lib/unicode')

module.exports = {
    isSpaceSeparator (c) {
        return typeof c === 'string' && unicode.Space_Separator.test(c)
    },

    isIdStartChar (c) {
        return typeof c === 'string' && (
            (c >= 'a' && c <= 'z') ||
        (c >= 'A' && c <= 'Z') ||
        (c === '$') || (c === '_') ||
        unicode.ID_Start.test(c)
        )
    },

    isIdContinueChar (c) {
        return typeof c === 'string' && (
            (c >= 'a' && c <= 'z') ||
        (c >= 'A' && c <= 'Z') ||
        (c >= '0' && c <= '9') ||
        (c === '$') || (c === '_') ||
        (c === '\u200C') || (c === '\u200D') ||
        unicode.ID_Continue.test(c)
        )
    },

    isDigit (c) {
        return typeof c === 'string' && /[0-9]/.test(c)
    },

    isHexDigit (c) {
        return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)
    },
}
(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
	typeof define === 'function' && define.amd ? define(factory) :
	(global.JSON5 = factory());
}(this, (function () { 'use strict';

	function createCommonjsModule(fn, module) {
		return module = { exports: {} }, fn(module, module.exports), module.exports;
	}

	var _global = createCommonjsModule(function (module) {
	// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
	var global = module.exports = typeof window != 'undefined' && window.Math == Math
	  ? window : typeof self != 'undefined' && self.Math == Math ? self
	  // eslint-disable-next-line no-new-func
	  : Function('return this')();
	if (typeof __g == 'number') { __g = global; } // eslint-disable-line no-undef
	});

	var _core = createCommonjsModule(function (module) {
	var core = module.exports = { version: '2.6.5' };
	if (typeof __e == 'number') { __e = core; } // eslint-disable-line no-undef
	});
	var _core_1 = _core.version;

	var _isObject = function (it) {
	  return typeof it === 'object' ? it !== null : typeof it === 'function';
	};

	var _anObject = function (it) {
	  if (!_isObject(it)) { throw TypeError(it + ' is not an object!'); }
	  return it;
	};

	var _fails = function (exec) {
	  try {
	    return !!exec();
	  } catch (e) {
	    return true;
	  }
	};

	// Thank's IE8 for his funny defineProperty
	var _descriptors = !_fails(function () {
	  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
	});

	var document = _global.document;
	// typeof document.createElement is 'object' in old IE
	var is = _isObject(document) && _isObject(document.createElement);
	var _domCreate = function (it) {
	  return is ? document.createElement(it) : {};
	};

	var _ie8DomDefine = !_descriptors && !_fails(function () {
	  return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;
	});

	// 7.1.1 ToPrimitive(input [, PreferredType])

	// instead of the ES6 spec version, we didn't implement @@toPrimitive case
	// and the second argument - flag - preferred type is a string
	var _toPrimitive = function (it, S) {
	  if (!_isObject(it)) { return it; }
	  var fn, val;
	  if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) { return val; }
	  if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) { return val; }
	  if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) { return val; }
	  throw TypeError("Can't convert object to primitive value");
	};

	var dP = Object.defineProperty;

	var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
	  _anObject(O);
	  P = _toPrimitive(P, true);
	  _anObject(Attributes);
	  if (_ie8DomDefine) { try {
	    return dP(O, P, Attributes);
	  } catch (e) { /* empty */ } }
	  if ('get' in Attributes || 'set' in Attributes) { throw TypeError('Accessors not supported!'); }
	  if ('value' in Attributes) { O[P] = Attributes.value; }
	  return O;
	};

	var _objectDp = {
		f: f
	};

	var _propertyDesc = function (bitmap, value) {
	  return {
	    enumerable: !(bitmap & 1),
	    configurable: !(bitmap & 2),
	    writable: !(bitmap & 4),
	    value: value
	  };
	};

	var _hide = _descriptors ? function (object, key, value) {
	  return _objectDp.f(object, key, _propertyDesc(1, value));
	} : function (object, key, value) {
	  object[key] = value;
	  return object;
	};

	var hasOwnProperty = {}.hasOwnProperty;
	var _has = function (it, key) {
	  return hasOwnProperty.call(it, key);
	};

	var id = 0;
	var px = Math.random();
	var _uid = function (key) {
	  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
	};

	var _library = false;

	var _shared = createCommonjsModule(function (module) {
	var SHARED = '__core-js_shared__';
	var store = _global[SHARED] || (_global[SHARED] = {});

	(module.exports = function (key, value) {
	  return store[key] || (store[key] = value !== undefined ? value : {});
	})('versions', []).push({
	  version: _core.version,
	  mode: _library ? 'pure' : 'global',
	  copyright: 'Â© 2019 Denis Pushkarev (zloirock.ru)'
	});
	});

	var _functionToString = _shared('native-function-to-string', Function.toString);

	var _redefine = createCommonjsModule(function (module) {
	var SRC = _uid('src');

	var TO_STRING = 'toString';
	var TPL = ('' + _functionToString).split(TO_STRING);

	_core.inspectSource = function (it) {
	  return _functionToString.call(it);
	};

	(module.exports = function (O, key, val, safe) {
	  var isFunction = typeof val == 'function';
	  if (isFunction) { _has(val, 'name') || _hide(val, 'name', key); }
	  if (O[key] === val) { return; }
	  if (isFunction) { _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); }
	  if (O === _global) {
	    O[key] = val;
	  } else if (!safe) {
	    delete O[key];
	    _hide(O, key, val);
	  } else if (O[key]) {
	    O[key] = val;
	  } else {
	    _hide(O, key, val);
	  }
	// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
	})(Function.prototype, TO_STRING, function toString() {
	  return typeof this == 'function' && this[SRC] || _functionToString.call(this);
	});
	});

	var _aFunction = function (it) {
	  if (typeof it != 'function') { throw TypeError(it + ' is not a function!'); }
	  return it;
	};

	// optional / simple context binding

	var _ctx = function (fn, that, length) {
	  _aFunction(fn);
	  if (that === undefined) { return fn; }
	  switch (length) {
	    case 1: return function (a) {
	      return fn.call(that, a);
	    };
	    case 2: return function (a, b) {
	      return fn.call(that, a, b);
	    };
	    case 3: return function (a, b, c) {
	      return fn.call(that, a, b, c);
	    };
	  }
	  return function (/* ...args */) {
	    return fn.apply(that, arguments);
	  };
	};

	var PROTOTYPE = 'prototype';

	var $export = function (type, name, source) {
	  var IS_FORCED = type & $export.F;
	  var IS_GLOBAL = type & $export.G;
	  var IS_STATIC = type & $export.S;
	  var IS_PROTO = type & $export.P;
	  var IS_BIND = type & $export.B;
	  var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE];
	  var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});
	  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
	  var key, own, out, exp;
	  if (IS_GLOBAL) { source = name; }
	  for (key in source) {
	    // contains in native
	    own = !IS_FORCED && target && target[key] !== undefined;
	    // export native or passed
	    out = (own ? target : source)[key];
	    // bind timers to global for call from export context
	    exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;
	    // extend global
	    if (target) { _redefine(target, key, out, type & $export.U); }
	    // export
	    if (exports[key] != out) { _hide(exports, key, exp); }
	    if (IS_PROTO && expProto[key] != out) { expProto[key] = out; }
	  }
	};
	_global.core = _core;
	// type bitmap
	$export.F = 1;   // forced
	$export.G = 2;   // global
	$export.S = 4;   // static
	$export.P = 8;   // proto
	$export.B = 16;  // bind
	$export.W = 32;  // wrap
	$export.U = 64;  // safe
	$export.R = 128; // real proto method for `library`
	var _export = $export;

	// 7.1.4 ToInteger
	var ceil = Math.ceil;
	var floor = Math.floor;
	var _toInteger = function (it) {
	  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
	};

	// 7.2.1 RequireObjectCoercible(argument)
	var _defined = function (it) {
	  if (it == undefined) { throw TypeError("Can't call method on  " + it); }
	  return it;
	};

	// true  -> String#at
	// false -> String#codePointAt
	var _stringAt = function (TO_STRING) {
	  return function (that, pos) {
	    var s = String(_defined(that));
	    var i = _toInteger(pos);
	    var l = s.length;
	    var a, b;
	    if (i < 0 || i >= l) { return TO_STRING ? '' : undefined; }
	    a = s.charCodeAt(i);
	    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
	      ? TO_STRING ? s.charAt(i) : a
	      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
	  };
	};

	var $at = _stringAt(false);
	_export(_export.P, 'String', {
	  // 21.1.3.3 String.prototype.codePointAt(pos)
	  codePointAt: function codePointAt(pos) {
	    return $at(this, pos);
	  }
	});

	var codePointAt = _core.String.codePointAt;

	var max = Math.max;
	var min = Math.min;
	var _toAbsoluteIndex = function (index, length) {
	  index = _toInteger(index);
	  return index < 0 ? max(index + length, 0) : min(index, length);
	};

	var fromCharCode = String.fromCharCode;
	var $fromCodePoint = String.fromCodePoint;

	// length should be 1, old FF problem
	_export(_export.S + _export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
	  // 21.1.2.2 String.fromCodePoint(...codePoints)
	  fromCodePoint: function fromCodePoint(x) {
	    var arguments$1 = arguments;
	 // eslint-disable-line no-unused-vars
	    var res = [];
	    var aLen = arguments.length;
	    var i = 0;
	    var code;
	    while (aLen > i) {
	      code = +arguments$1[i++];
	      if (_toAbsoluteIndex(code, 0x10ffff) !== code) { throw RangeError(code + ' is not a valid code point'); }
	      res.push(code < 0x10000
	        ? fromCharCode(code)
	        : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)
	      );
	    } return res.join('');
	  }
	});

	var fromCodePoint = _core.String.fromCodePoint;

	// This is a generated file. Do not edit.
	var Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/;
	var ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/;
	var ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/;

	var unicode = {
		Space_Separator: Space_Separator,
		ID_Start: ID_Start,
		ID_Continue: ID_Continue
	};

	var util = {
	    isSpaceSeparator: function isSpaceSeparator (c) {
	        return typeof c === 'string' && unicode.Space_Separator.test(c)
	    },

	    isIdStartChar: function isIdStartChar (c) {
	        return typeof c === 'string' && (
	            (c >= 'a' && c <= 'z') ||
	        (c >= 'A' && c <= 'Z') ||
	        (c === '$') || (c === '_') ||
	        unicode.ID_Start.test(c)
	        )
	    },

	    isIdContinueChar: function isIdContinueChar (c) {
	        return typeof c === 'string' && (
	            (c >= 'a' && c <= 'z') ||
	        (c >= 'A' && c <= 'Z') ||
	        (c >= '0' && c <= '9') ||
	        (c === '$') || (c === '_') ||
	        (c === '\u200C') || (c === '\u200D') ||
	        unicode.ID_Continue.test(c)
	        )
	    },

	    isDigit: function isDigit (c) {
	        return typeof c === 'string' && /[0-9]/.test(c)
	    },

	    isHexDigit: function isHexDigit (c) {
	        return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)
	    },
	};

	var source;
	var parseState;
	var stack;
	var pos;
	var line;
	var column;
	var token;
	var key;
	var root;

	var parse = function parse (text, reviver) {
	    source = String(text);
	    parseState = 'start';
	    stack = [];
	    pos = 0;
	    line = 1;
	    column = 0;
	    token = undefined;
	    key = undefined;
	    root = undefined;

	    do {
	        token = lex();

	        // This code is unreachable.
	        // if (!parseStates[parseState]) {
	        //     throw invalidParseState()
	        // }

	        parseStates[parseState]();
	    } while (token.type !== 'eof')

	    if (typeof reviver === 'function') {
	        return internalize({'': root}, '', reviver)
	    }

	    return root
	};

	function internalize (holder, name, reviver) {
	    var value = holder[name];
	    if (value != null && typeof value === 'object') {
	        for (var key in value) {
	            var replacement = internalize(value, key, reviver);
	            if (replacement === undefined) {
	                delete value[key];
	            } else {
	                value[key] = replacement;
	            }
	        }
	    }

	    return reviver.call(holder, name, value)
	}

	var lexState;
	var buffer;
	var doubleQuote;
	var sign;
	var c;

	function lex () {
	    lexState = 'default';
	    buffer = '';
	    doubleQuote = false;
	    sign = 1;

	    for (;;) {
	        c = peek();

	        // This code is unreachable.
	        // if (!lexStates[lexState]) {
	        //     throw invalidLexState(lexState)
	        // }

	        var token = lexStates[lexState]();
	        if (token) {
	            return token
	        }
	    }
	}

	function peek () {
	    if (source[pos]) {
	        return String.fromCodePoint(source.codePointAt(pos))
	    }
	}

	function read () {
	    var c = peek();

	    if (c === '\n') {
	        line++;
	        column = 0;
	    } else if (c) {
	        column += c.length;
	    } else {
	        column++;
	    }

	    if (c) {
	        pos += c.length;
	    }

	    return c
	}

	var lexStates = {
	    default: function default$1 () {
	        switch (c) {
	        case '\t':
	        case '\v':
	        case '\f':
	        case ' ':
	        case '\u00A0':
	        case '\uFEFF':
	        case '\n':
	        case '\r':
	        case '\u2028':
	        case '\u2029':
	            read();
	            return

	        case '/':
	            read();
	            lexState = 'comment';
	            return

	        case undefined:
	            read();
	            return newToken('eof')
	        }

	        if (util.isSpaceSeparator(c)) {
	            read();
	            return
	        }

	        // This code is unreachable.
	        // if (!lexStates[parseState]) {
	        //     throw invalidLexState(parseState)
	        // }

	        return lexStates[parseState]()
	    },

	    comment: function comment () {
	        switch (c) {
	        case '*':
	            read();
	            lexState = 'multiLineComment';
	            return

	        case '/':
	            read();
	            lexState = 'singleLineComment';
	            return
	        }

	        throw invalidChar(read())
	    },

	    multiLineComment: function multiLineComment () {
	        switch (c) {
	        case '*':
	            read();
	            lexState = 'multiLineCommentAsterisk';
	            return

	        case undefined:
	            throw invalidChar(read())
	        }

	        read();
	    },

	    multiLineCommentAsterisk: function multiLineCommentAsterisk () {
	        switch (c) {
	        case '*':
	            read();
	            return

	        case '/':
	            read();
	            lexState = 'default';
	            return

	        case undefined:
	            throw invalidChar(read())
	        }

	        read();
	        lexState = 'multiLineComment';
	    },

	    singleLineComment: function singleLineComment () {
	        switch (c) {
	        case '\n':
	        case '\r':
	        case '\u2028':
	        case '\u2029':
	            read();
	            lexState = 'default';
	            return

	        case undefined:
	            read();
	            return newToken('eof')
	        }

	        read();
	    },

	    value: function value () {
	        switch (c) {
	        case '{':
	        case '[':
	            return newToken('punctuator', read())

	        case 'n':
	            read();
	            literal('ull');
	            return newToken('null', null)

	        case 't':
	            read();
	            literal('rue');
	            return newToken('boolean', true)

	        case 'f':
	            read();
	            literal('alse');
	            return newToken('boolean', false)

	        case '-':
	        case '+':
	            if (read() === '-') {
	                sign = -1;
	            }

	            lexState = 'sign';
	            return

	        case '.':
	            buffer = read();
	            lexState = 'decimalPointLeading';
	            return

	        case '0':
	            buffer = read();
	            lexState = 'zero';
	            return

	        case '1':
	        case '2':
	        case '3':
	        case '4':
	        case '5':
	        case '6':
	        case '7':
	        case '8':
	        case '9':
	            buffer = read();
	            lexState = 'decimalInteger';
	            return

	        case 'I':
	            read();
	            literal('nfinity');
	            return newToken('numeric', Infinity)

	        case 'N':
	            read();
	            literal('aN');
	            return newToken('numeric', NaN)

	        case '"':
	        case "'":
	            doubleQuote = (read() === '"');
	            buffer = '';
	            lexState = 'string';
	            return
	        }

	        throw invalidChar(read())
	    },

	    identifierNameStartEscape: function identifierNameStartEscape () {
	        if (c !== 'u') {
	            throw invalidChar(read())
	        }

	        read();
	        var u = unicodeEscape();
	        switch (u) {
	        case '$':
	        case '_':
	            break

	        default:
	            if (!util.isIdStartChar(u)) {
	                throw invalidIdentifier()
	            }

	            break
	        }

	        buffer += u;
	        lexState = 'identifierName';
	    },

	    identifierName: function identifierName () {
	        switch (c) {
	        case '$':
	        case '_':
	        case '\u200C':
	        case '\u200D':
	            buffer += read();
	            return

	        case '\\':
	            read();
	            lexState = 'identifierNameEscape';
	            return
	        }

	        if (util.isIdContinueChar(c)) {
	            buffer += read();
	            return
	        }

	        return newToken('identifier', buffer)
	    },

	    identifierNameEscape: function identifierNameEscape () {
	        if (c !== 'u') {
	            throw invalidChar(read())
	        }

	        read();
	        var u = unicodeEscape();
	        switch (u) {
	        case '$':
	        case '_':
	        case '\u200C':
	        case '\u200D':
	            break

	        default:
	            if (!util.isIdContinueChar(u)) {
	                throw invalidIdentifier()
	            }

	            break
	        }

	        buffer += u;
	        lexState = 'identifierName';
	    },

	    sign: function sign$1 () {
	        switch (c) {
	        case '.':
	            buffer = read();
	            lexState = 'decimalPointLeading';
	            return

	        case '0':
	            buffer = read();
	            lexState = 'zero';
	            return

	        case '1':
	        case '2':
	        case '3':
	        case '4':
	        case '5':
	        case '6':
	        case '7':
	        case '8':
	        case '9':
	            buffer = read();
	            lexState = 'decimalInteger';
	            return

	        case 'I':
	            read();
	            literal('nfinity');
	            return newToken('numeric', sign * Infinity)

	        case 'N':
	            read();
	            literal('aN');
	            return newToken('numeric', NaN)
	        }

	        throw invalidChar(read())
	    },

	    zero: function zero () {
	        switch (c) {
	        case '.':
	            buffer += read();
	            lexState = 'decimalPoint';
	            return

	        case 'e':
	        case 'E':
	            buffer += read();
	            lexState = 'decimalExponent';
	            return

	        case 'x':
	        case 'X':
	            buffer += read();
	            lexState = 'hexadecimal';
	            return
	        }

	        return newToken('numeric', sign * 0)
	    },

	    decimalInteger: function decimalInteger () {
	        switch (c) {
	        case '.':
	            buffer += read();
	            lexState = 'decimalPoint';
	            return

	        case 'e':
	        case 'E':
	            buffer += read();
	            lexState = 'decimalExponent';
	            return
	        }

	        if (util.isDigit(c)) {
	            buffer += read();
	            return
	        }

	        return newToken('numeric', sign * Number(buffer))
	    },

	    decimalPointLeading: function decimalPointLeading () {
	        if (util.isDigit(c)) {
	            buffer += read();
	            lexState = 'decimalFraction';
	            return
	        }

	        throw invalidChar(read())
	    },

	    decimalPoint: function decimalPoint () {
	        switch (c) {
	        case 'e':
	        case 'E':
	            buffer += read();
	            lexState = 'decimalExponent';
	            return
	        }

	        if (util.isDigit(c)) {
	            buffer += read();
	            lexState = 'decimalFraction';
	            return
	        }

	        return newToken('numeric', sign * Number(buffer))
	    },

	    decimalFraction: function decimalFraction () {
	        switch (c) {
	        case 'e':
	        case 'E':
	            buffer += read();
	            lexState = 'decimalExponent';
	            return
	        }

	        if (util.isDigit(c)) {
	            buffer += read();
	            return
	        }

	        return newToken('numeric', sign * Number(buffer))
	    },

	    decimalExponent: function decimalExponent () {
	        switch (c) {
	        case '+':
	        case '-':
	            buffer += read();
	            lexState = 'decimalExponentSign';
	            return
	        }

	        if (util.isDigit(c)) {
	            buffer += read();
	            lexState = 'decimalExponentInteger';
	            return
	        }

	        throw invalidChar(read())
	    },

	    decimalExponentSign: function decimalExponentSign () {
	        if (util.isDigit(c)) {
	            buffer += read();
	            lexState = 'decimalExponentInteger';
	            return
	        }

	        throw invalidChar(read())
	    },

	    decimalExponentInteger: function decimalExponentInteger () {
	        if (util.isDigit(c)) {
	            buffer += read();
	            return
	        }

	        return newToken('numeric', sign * Number(buffer))
	    },

	    hexadecimal: function hexadecimal () {
	        if (util.isHexDigit(c)) {
	            buffer += read();
	            lexState = 'hexadecimalInteger';
	            return
	        }

	        throw invalidChar(read())
	    },

	    hexadecimalInteger: function hexadecimalInteger () {
	        if (util.isHexDigit(c)) {
	            buffer += read();
	            return
	        }

	        return newToken('numeric', sign * Number(buffer))
	    },

	    string: function string () {
	        switch (c) {
	        case '\\':
	            read();
	            buffer += escape();
	            return

	        case '"':
	            if (doubleQuote) {
	                read();
	                return newToken('string', buffer)
	            }

	            buffer += read();
	            return

	        case "'":
	            if (!doubleQuote) {
	                read();
	                return newToken('string', buffer)
	            }

	            buffer += read();
	            return

	        case '\n':
	        case '\r':
	            throw invalidChar(read())

	        case '\u2028':
	        case '\u2029':
	            separatorChar(c);
	            break

	        case undefined:
	            throw invalidChar(read())
	        }

	        buffer += read();
	    },

	    start: function start () {
	        switch (c) {
	        case '{':
	        case '[':
	            return newToken('punctuator', read())

	        // This code is unreachable since the default lexState handles eof.
	        // case undefined:
	        //     return newToken('eof')
	        }

	        lexState = 'value';
	    },

	    beforePropertyName: function beforePropertyName () {
	        switch (c) {
	        case '$':
	        case '_':
	            buffer = read();
	            lexState = 'identifierName';
	            return

	        case '\\':
	            read();
	            lexState = 'identifierNameStartEscape';
	            return

	        case '}':
	            return newToken('punctuator', read())

	        case '"':
	        case "'":
	            doubleQuote = (read() === '"');
	            lexState = 'string';
	            return
	        }

	        if (util.isIdStartChar(c)) {
	            buffer += read();
	            lexState = 'identifierName';
	            return
	        }

	        throw invalidChar(read())
	    },

	    afterPropertyName: function afterPropertyName () {
	        if (c === ':') {
	            return newToken('punctuator', read())
	        }

	        throw invalidChar(read())
	    },

	    beforePropertyValue: function beforePropertyValue () {
	        lexState = 'value';
	    },

	    afterPropertyValue: function afterPropertyValue () {
	        switch (c) {
	        case ',':
	        case '}':
	            return newToken('punctuator', read())
	        }

	        throw invalidChar(read())
	    },

	    beforeArrayValue: function beforeArrayValue () {
	        if (c === ']') {
	            return newToken('punctuator', read())
	        }

	        lexState = 'value';
	    },

	    afterArrayValue: function afterArrayValue () {
	        switch (c) {
	        case ',':
	        case ']':
	            return newToken('punctuator', read())
	        }

	        throw invalidChar(read())
	    },

	    end: function end () {
	        // This code is unreachable since it's handled by the default lexState.
	        // if (c === undefined) {
	        //     read()
	        //     return newToken('eof')
	        // }

	        throw invalidChar(read())
	    },
	};

	function newToken (type, value) {
	    return {
	        type: type,
	        value: value,
	        line: line,
	        column: column,
	    }
	}

	function literal (s) {
	    for (var i = 0, list = s; i < list.length; i += 1) {
	        var c = list[i];

	        var p = peek();

	        if (p !== c) {
	            throw invalidChar(read())
	        }

	        read();
	    }
	}

	function escape () {
	    var c = peek();
	    switch (c) {
	    case 'b':
	        read();
	        return '\b'

	    case 'f':
	        read();
	        return '\f'

	    case 'n':
	        read();
	        return '\n'

	    case 'r':
	        read();
	        return '\r'

	    case 't':
	        read();
	        return '\t'

	    case 'v':
	        read();
	        return '\v'

	    case '0':
	        read();
	        if (util.isDigit(peek())) {
	            throw invalidChar(read())
	        }

	        return '\0'

	    case 'x':
	        read();
	        return hexEscape()

	    case 'u':
	        read();
	        return unicodeEscape()

	    case '\n':
	    case '\u2028':
	    case '\u2029':
	        read();
	        return ''

	    case '\r':
	        read();
	        if (peek() === '\n') {
	            read();
	        }

	        return ''

	    case '1':
	    case '2':
	    case '3':
	    case '4':
	    case '5':
	    case '6':
	    case '7':
	    case '8':
	    case '9':
	        throw invalidChar(read())

	    case undefined:
	        throw invalidChar(read())
	    }

	    return read()
	}

	function hexEscape () {
	    var buffer = '';
	    var c = peek();

	    if (!util.isHexDigit(c)) {
	        throw invalidChar(read())
	    }

	    buffer += read();

	    c = peek();
	    if (!util.isHexDigit(c)) {
	        throw invalidChar(read())
	    }

	    buffer += read();

	    return String.fromCodePoint(parseInt(buffer, 16))
	}

	function unicodeEscape () {
	    var buffer = '';
	    var count = 4;

	    while (count-- > 0) {
	        var c = peek();
	        if (!util.isHexDigit(c)) {
	            throw invalidChar(read())
	        }

	        buffer += read();
	    }

	    return String.fromCodePoint(parseInt(buffer, 16))
	}

	var parseStates = {
	    start: function start () {
	        if (token.type === 'eof') {
	            throw invalidEOF()
	        }

	        push();
	    },

	    beforePropertyName: function beforePropertyName () {
	        switch (token.type) {
	        case 'identifier':
	        case 'string':
	            key = token.value;
	            parseState = 'afterPropertyName';
	            return

	        case 'punctuator':
	            // This code is unreachable since it's handled by the lexState.
	            // if (token.value !== '}') {
	            //     throw invalidToken()
	            // }

	            pop();
	            return

	        case 'eof':
	            throw invalidEOF()
	        }

	        // This code is unreachable since it's handled by the lexState.
	        // throw invalidToken()
	    },

	    afterPropertyName: function afterPropertyName () {
	        // This code is unreachable since it's handled by the lexState.
	        // if (token.type !== 'punctuator' || token.value !== ':') {
	        //     throw invalidToken()
	        // }

	        if (token.type === 'eof') {
	            throw invalidEOF()
	        }

	        parseState = 'beforePropertyValue';
	    },

	    beforePropertyValue: function beforePropertyValue () {
	        if (token.type === 'eof') {
	            throw invalidEOF()
	        }

	        push();
	    },

	    beforeArrayValue: function beforeArrayValue () {
	        if (token.type === 'eof') {
	            throw invalidEOF()
	        }

	        if (token.type === 'punctuator' && token.value === ']') {
	            pop();
	            return
	        }

	        push();
	    },

	    afterPropertyValue: function afterPropertyValue () {
	        // This code is unreachable since it's handled by the lexState.
	        // if (token.type !== 'punctuator') {
	        //     throw invalidToken()
	        // }

	        if (token.type === 'eof') {
	            throw invalidEOF()
	        }

	        switch (token.value) {
	        case ',':
	            parseState = 'beforePropertyName';
	            return

	        case '}':
	            pop();
	        }

	        // This code is unreachable since it's handled by the lexState.
	        // throw invalidToken()
	    },

	    afterArrayValue: function afterArrayValue () {
	        // This code is unreachable since it's handled by the lexState.
	        // if (token.type !== 'punctuator') {
	        //     throw invalidToken()
	        // }

	        if (token.type === 'eof') {
	            throw invalidEOF()
	        }

	        switch (token.value) {
	        case ',':
	            parseState = 'beforeArrayValue';
	            return

	        case ']':
	            pop();
	        }

	        // This code is unreachable since it's handled by the lexState.
	        // throw invalidToken()
	    },

	    end: function end () {
	        // This code is unreachable since it's handled by the lexState.
	        // if (token.type !== 'eof') {
	        //     throw invalidToken()
	        // }
	    },
	};

	function push () {
	    var value;

	    switch (token.type) {
	    case 'punctuator':
	        switch (token.value) {
	        case '{':
	            value = {};
	            break

	        case '[':
	            value = [];
	            break
	        }

	        break

	    case 'null':
	    case 'boolean':
	    case 'numeric':
	    case 'string':
	        value = token.value;
	        break

	    // This code is unreachable.
	    // default:
	    //     throw invalidToken()
	    }

	    if (root === undefined) {
	        root = value;
	    } else {
	        var parent = stack[stack.length - 1];
	        if (Array.isArray(parent)) {
	            parent.push(value);
	        } else {
	            parent[key] = value;
	        }
	    }

	    if (value !== null && typeof value === 'object') {
	        stack.push(value);

	        if (Array.isArray(value)) {
	            parseState = 'beforeArrayValue';
	        } else {
	            parseState = 'beforePropertyName';
	        }
	    } else {
	        var current = stack[stack.length - 1];
	        if (current == null) {
	            parseState = 'end';
	        } else if (Array.isArray(current)) {
	            parseState = 'afterArrayValue';
	        } else {
	            parseState = 'afterPropertyValue';
	        }
	    }
	}

	function pop () {
	    stack.pop();

	    var current = stack[stack.length - 1];
	    if (current == null) {
	        parseState = 'end';
	    } else if (Array.isArray(current)) {
	        parseState = 'afterArrayValue';
	    } else {
	        parseState = 'afterPropertyValue';
	    }
	}

	// This code is unreachable.
	// function invalidParseState () {
	//     return new Error(`JSON5: invalid parse state '${parseState}'`)
	// }

	// This code is unreachable.
	// function invalidLexState (state) {
	//     return new Error(`JSON5: invalid lex state '${state}'`)
	// }

	function invalidChar (c) {
	    if (c === undefined) {
	        return syntaxError(("JSON5: invalid end of input at " + line + ":" + column))
	    }

	    return syntaxError(("JSON5: invalid character '" + (formatChar(c)) + "' at " + line + ":" + column))
	}

	function invalidEOF () {
	    return syntaxError(("JSON5: invalid end of input at " + line + ":" + column))
	}

	// This code is unreachable.
	// function invalidToken () {
	//     if (token.type === 'eof') {
	//         return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
	//     }

	//     const c = String.fromCodePoint(token.value.codePointAt(0))
	//     return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
	// }

	function invalidIdentifier () {
	    column -= 5;
	    return syntaxError(("JSON5: invalid identifier character at " + line + ":" + column))
	}

	function separatorChar (c) {
	    console.warn(("JSON5: '" + (formatChar(c)) + "' in strings is not valid ECMAScript; consider escaping"));
	}

	function formatChar (c) {
	    var replacements = {
	        "'": "\\'",
	        '"': '\\"',
	        '\\': '\\\\',
	        '\b': '\\b',
	        '\f': '\\f',
	        '\n': '\\n',
	        '\r': '\\r',
	        '\t': '\\t',
	        '\v': '\\v',
	        '\0': '\\0',
	        '\u2028': '\\u2028',
	        '\u2029': '\\u2029',
	    };

	    if (replacements[c]) {
	        return replacements[c]
	    }

	    if (c < ' ') {
	        var hexString = c.charCodeAt(0).toString(16);
	        return '\\x' + ('00' + hexString).substring(hexString.length)
	    }

	    return c
	}

	function syntaxError (message) {
	    var err = new SyntaxError(message);
	    err.lineNumber = line;
	    err.columnNumber = column;
	    return err
	}

	var stringify = function stringify (value, replacer, space) {
	    var stack = [];
	    var indent = '';
	    var propertyList;
	    var replacerFunc;
	    var gap = '';
	    var quote;

	    if (
	        replacer != null &&
	        typeof replacer === 'object' &&
	        !Array.isArray(replacer)
	    ) {
	        space = replacer.space;
	        quote = replacer.quote;
	        replacer = replacer.replacer;
	    }

	    if (typeof replacer === 'function') {
	        replacerFunc = replacer;
	    } else if (Array.isArray(replacer)) {
	        propertyList = [];
	        for (var i = 0, list = replacer; i < list.length; i += 1) {
	            var v = list[i];

	            var item = (void 0);

	            if (typeof v === 'string') {
	                item = v;
	            } else if (
	                typeof v === 'number' ||
	                v instanceof String ||
	                v instanceof Number
	            ) {
	                item = String(v);
	            }

	            if (item !== undefined && propertyList.indexOf(item) < 0) {
	                propertyList.push(item);
	            }
	        }
	    }

	    if (space instanceof Number) {
	        space = Number(space);
	    } else if (space instanceof String) {
	        space = String(space);
	    }

	    if (typeof space === 'number') {
	        if (space > 0) {
	            space = Math.min(10, Math.floor(space));
	            gap = '          '.substr(0, space);
	        }
	    } else if (typeof space === 'string') {
	        gap = space.substr(0, 10);
	    }

	    return serializeProperty('', {'': value})

	    function serializeProperty (key, holder) {
	        var value = holder[key];
	        if (value != null) {
	            if (typeof value.toJSON5 === 'function') {
	                value = value.toJSON5(key);
	            } else if (typeof value.toJSON === 'function') {
	                value = value.toJSON(key);
	            }
	        }

	        if (replacerFunc) {
	            value = replacerFunc.call(holder, key, value);
	        }

	        if (value instanceof Number) {
	            value = Number(value);
	        } else if (value instanceof String) {
	            value = String(value);
	        } else if (value instanceof Boolean) {
	            value = value.valueOf();
	        }

	        switch (value) {
	        case null: return 'null'
	        case true: return 'true'
	        case false: return 'false'
	        }

	        if (typeof value === 'string') {
	            return quoteString(value, false)
	        }

	        if (typeof value === 'number') {
	            return String(value)
	        }

	        if (typeof value === 'object') {
	            return Array.isArray(value) ? serializeArray(value) : serializeObject(value)
	        }

	        return undefined
	    }

	    function quoteString (value) {
	        var quotes = {
	            "'": 0.1,
	            '"': 0.2,
	        };

	        var replacements = {
	            "'": "\\'",
	            '"': '\\"',
	            '\\': '\\\\',
	            '\b': '\\b',
	            '\f': '\\f',
	            '\n': '\\n',
	            '\r': '\\r',
	            '\t': '\\t',
	            '\v': '\\v',
	            '\0': '\\0',
	            '\u2028': '\\u2028',
	            '\u2029': '\\u2029',
	        };

	        var product = '';

	        for (var i = 0; i < value.length; i++) {
	            var c = value[i];
	            switch (c) {
	            case "'":
	            case '"':
	                quotes[c]++;
	                product += c;
	                continue

	            case '\0':
	                if (util.isDigit(value[i + 1])) {
	                    product += '\\x00';
	                    continue
	                }
	            }

	            if (replacements[c]) {
	                product += replacements[c];
	                continue
	            }

	            if (c < ' ') {
	                var hexString = c.charCodeAt(0).toString(16);
	                product += '\\x' + ('00' + hexString).substring(hexString.length);
	                continue
	            }

	            product += c;
	        }

	        var quoteChar = quote || Object.keys(quotes).reduce(function (a, b) { return (quotes[a] < quotes[b]) ? a : b; });

	        product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]);

	        return quoteChar + product + quoteChar
	    }

	    function serializeObject (value) {
	        if (stack.indexOf(value) >= 0) {
	            throw TypeError('Converting circular structure to JSON5')
	        }

	        stack.push(value);

	        var stepback = indent;
	        indent = indent + gap;

	        var keys = propertyList || Object.keys(value);
	        var partial = [];
	        for (var i = 0, list = keys; i < list.length; i += 1) {
	            var key = list[i];

	            var propertyString = serializeProperty(key, value);
	            if (propertyString !== undefined) {
	                var member = serializeKey(key) + ':';
	                if (gap !== '') {
	                    member += ' ';
	                }
	                member += propertyString;
	                partial.push(member);
	            }
	        }

	        var final;
	        if (partial.length === 0) {
	            final = '{}';
	        } else {
	            var properties;
	            if (gap === '') {
	                properties = partial.join(',');
	                final = '{' + properties + '}';
	            } else {
	                var separator = ',\n' + indent;
	                properties = partial.join(separator);
	                final = '{\n' + indent + properties + ',\n' + stepback + '}';
	            }
	        }

	        stack.pop();
	        indent = stepback;
	        return final
	    }

	    function serializeKey (key) {
	        if (key.length === 0) {
	            return quoteString(key, true)
	        }

	        var firstChar = String.fromCodePoint(key.codePointAt(0));
	        if (!util.isIdStartChar(firstChar)) {
	            return quoteString(key, true)
	        }

	        for (var i = firstChar.length; i < key.length; i++) {
	            if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {
	                return quoteString(key, true)
	            }
	        }

	        return key
	    }

	    function serializeArray (value) {
	        if (stack.indexOf(value) >= 0) {
	            throw TypeError('Converting circular structure to JSON5')
	        }

	        stack.push(value);

	        var stepback = indent;
	        indent = indent + gap;

	        var partial = [];
	        for (var i = 0; i < value.length; i++) {
	            var propertyString = serializeProperty(String(i), value);
	            partial.push((propertyString !== undefined) ? propertyString : 'null');
	        }

	        var final;
	        if (partial.length === 0) {
	            final = '[]';
	        } else {
	            if (gap === '') {
	                var properties = partial.join(',');
	                final = '[' + properties + ']';
	            } else {
	                var separator = ',\n' + indent;
	                var properties$1 = partial.join(separator);
	                final = '[\n' + indent + properties$1 + ',\n' + stepback + ']';
	            }
	        }

	        stack.pop();
	        indent = stepback;
	        return final
	    }
	};

	var JSON5 = {
	    parse: parse,
	    stringify: stringify,
	};

	var lib = JSON5;

	var es5 = lib;

	return es5;

})));
!function(u,D){"object"==typeof exports&&"undefined"!=typeof module?module.exports=D():"function"==typeof define&&define.amd?define(D):u.JSON5=D()}(this,function(){"use strict";function u(u,D){return u(D={exports:{}},D.exports),D.exports}var D=u(function(u){var D=u.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=D)}),e=u(function(u){var D=u.exports={version:"2.6.5"};"number"==typeof __e&&(__e=D)}),t=(e.version,function(u){return"object"==typeof u?null!==u:"function"==typeof u}),r=function(u){if(!t(u))throw TypeError(u+" is not an object!");return u},F=function(u){try{return!!u()}catch(u){return!0}},n=!F(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),C=D.document,A=t(C)&&t(C.createElement),i=!n&&!F(function(){return 7!=Object.defineProperty((u="div",A?C.createElement(u):{}),"a",{get:function(){return 7}}).a;var u}),E=Object.defineProperty,o={f:n?Object.defineProperty:function(u,D,e){if(r(u),D=function(u,D){if(!t(u))return u;var e,r;if(D&&"function"==typeof(e=u.toString)&&!t(r=e.call(u)))return r;if("function"==typeof(e=u.valueOf)&&!t(r=e.call(u)))return r;if(!D&&"function"==typeof(e=u.toString)&&!t(r=e.call(u)))return r;throw TypeError("Can't convert object to primitive value")}(D,!0),r(e),i)try{return E(u,D,e)}catch(u){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(u[D]=e.value),u}},a=n?function(u,D,e){return o.f(u,D,function(u,D){return{enumerable:!(1&u),configurable:!(2&u),writable:!(4&u),value:D}}(1,e))}:function(u,D,e){return u[D]=e,u},c={}.hasOwnProperty,B=function(u,D){return c.call(u,D)},s=0,f=Math.random(),l=u(function(u){var t=D["__core-js_shared__"]||(D["__core-js_shared__"]={});(u.exports=function(u,D){return t[u]||(t[u]=void 0!==D?D:{})})("versions",[]).push({version:e.version,mode:"global",copyright:"Â© 2019 Denis Pushkarev (zloirock.ru)"})})("native-function-to-string",Function.toString),d=u(function(u){var t,r="Symbol(".concat(void 0===(t="src")?"":t,")_",(++s+f).toString(36)),F=(""+l).split("toString");e.inspectSource=function(u){return l.call(u)},(u.exports=function(u,e,t,n){var C="function"==typeof t;C&&(B(t,"name")||a(t,"name",e)),u[e]!==t&&(C&&(B(t,r)||a(t,r,u[e]?""+u[e]:F.join(String(e)))),u===D?u[e]=t:n?u[e]?u[e]=t:a(u,e,t):(delete u[e],a(u,e,t)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[r]||l.call(this)})}),v=function(u,D,e){if(function(u){if("function"!=typeof u)throw TypeError(u+" is not a function!")}(u),void 0===D)return u;switch(e){case 1:return function(e){return u.call(D,e)};case 2:return function(e,t){return u.call(D,e,t)};case 3:return function(e,t,r){return u.call(D,e,t,r)}}return function(){return u.apply(D,arguments)}},p=function(u,t,r){var F,n,C,A,i=u&p.F,E=u&p.G,o=u&p.S,c=u&p.P,B=u&p.B,s=E?D:o?D[t]||(D[t]={}):(D[t]||{}).prototype,f=E?e:e[t]||(e[t]={}),l=f.prototype||(f.prototype={});for(F in E&&(r=t),r)C=((n=!i&&s&&void 0!==s[F])?s:r)[F],A=B&&n?v(C,D):c&&"function"==typeof C?v(Function.call,C):C,s&&d(s,F,C,u&p.U),f[F]!=C&&a(f,F,A),c&&l[F]!=C&&(l[F]=C)};D.core=e,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,p.U=64,p.R=128;var h,m=p,g=Math.ceil,y=Math.floor,w=function(u){return isNaN(u=+u)?0:(u>0?y:g)(u)},S=(h=!1,function(u,D){var e,t,r=String(function(u){if(null==u)throw TypeError("Can't call method on  "+u);return u}(u)),F=w(D),n=r.length;return F<0||F>=n?h?"":void 0:(e=r.charCodeAt(F))<55296||e>56319||F+1===n||(t=r.charCodeAt(F+1))<56320||t>57343?h?r.charAt(F):e:h?r.slice(F,F+2):t-56320+(e-55296<<10)+65536});m(m.P,"String",{codePointAt:function(u){return S(this,u)}});e.String.codePointAt;var b=Math.max,x=Math.min,N=String.fromCharCode,P=String.fromCodePoint;m(m.S+m.F*(!!P&&1!=P.length),"String",{fromCodePoint:function(u){for(var D,e,t,r=arguments,F=[],n=arguments.length,C=0;n>C;){if(D=+r[C++],t=1114111,((e=w(e=D))<0?b(e+t,0):x(e,t))!==D)throw RangeError(D+" is not a valid code point");F.push(D<65536?N(D):N(55296+((D-=65536)>>10),D%1024+56320))}return F.join("")}});e.String.fromCodePoint;var _,I,O,j,V,J,M,k,L,T,z,H,$,R,G={Space_Separator:/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/},U={isSpaceSeparator:function(u){return"string"==typeof u&&G.Space_Separator.test(u)},isIdStartChar:function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||G.ID_Start.test(u))},isIdContinueChar:function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"â€Œ"===u||"â€�"===u||G.ID_Continue.test(u))},isDigit:function(u){return"string"==typeof u&&/[0-9]/.test(u)},isHexDigit:function(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)}};function Z(){for(T="default",z="",H=!1,$=1;;){R=q();var u=X[T]();if(u)return u}}function q(){if(_[j])return String.fromCodePoint(_.codePointAt(j))}function W(){var u=q();return"\n"===u?(V++,J=0):u?J+=u.length:J++,u&&(j+=u.length),u}var X={default:function(){switch(R){case"\t":case"\v":case"\f":case" ":case"Â ":case"\ufeff":case"\n":case"\r":case"\u2028":case"\u2029":return void W();case"/":return W(),void(T="comment");case void 0:return W(),K("eof")}if(!U.isSpaceSeparator(R))return X[I]();W()},comment:function(){switch(R){case"*":return W(),void(T="multiLineComment");case"/":return W(),void(T="singleLineComment")}throw tu(W())},multiLineComment:function(){switch(R){case"*":return W(),void(T="multiLineCommentAsterisk");case void 0:throw tu(W())}W()},multiLineCommentAsterisk:function(){switch(R){case"*":return void W();case"/":return W(),void(T="default");case void 0:throw tu(W())}W(),T="multiLineComment"},singleLineComment:function(){switch(R){case"\n":case"\r":case"\u2028":case"\u2029":return W(),void(T="default");case void 0:return W(),K("eof")}W()},value:function(){switch(R){case"{":case"[":return K("punctuator",W());case"n":return W(),Q("ull"),K("null",null);case"t":return W(),Q("rue"),K("boolean",!0);case"f":return W(),Q("alse"),K("boolean",!1);case"-":case"+":return"-"===W()&&($=-1),void(T="sign");case".":return z=W(),void(T="decimalPointLeading");case"0":return z=W(),void(T="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return z=W(),void(T="decimalInteger");case"I":return W(),Q("nfinity"),K("numeric",1/0);case"N":return W(),Q("aN"),K("numeric",NaN);case'"':case"'":return H='"'===W(),z="",void(T="string")}throw tu(W())},identifierNameStartEscape:function(){if("u"!==R)throw tu(W());W();var u=Y();switch(u){case"$":case"_":break;default:if(!U.isIdStartChar(u))throw Fu()}z+=u,T="identifierName"},identifierName:function(){switch(R){case"$":case"_":case"â€Œ":case"â€�":return void(z+=W());case"\\":return W(),void(T="identifierNameEscape")}if(!U.isIdContinueChar(R))return K("identifier",z);z+=W()},identifierNameEscape:function(){if("u"!==R)throw tu(W());W();var u=Y();switch(u){case"$":case"_":case"â€Œ":case"â€�":break;default:if(!U.isIdContinueChar(u))throw Fu()}z+=u,T="identifierName"},sign:function(){switch(R){case".":return z=W(),void(T="decimalPointLeading");case"0":return z=W(),void(T="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return z=W(),void(T="decimalInteger");case"I":return W(),Q("nfinity"),K("numeric",$*(1/0));case"N":return W(),Q("aN"),K("numeric",NaN)}throw tu(W())},zero:function(){switch(R){case".":return z+=W(),void(T="decimalPoint");case"e":case"E":return z+=W(),void(T="decimalExponent");case"x":case"X":return z+=W(),void(T="hexadecimal")}return K("numeric",0*$)},decimalInteger:function(){switch(R){case".":return z+=W(),void(T="decimalPoint");case"e":case"E":return z+=W(),void(T="decimalExponent")}if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},decimalPointLeading:function(){if(U.isDigit(R))return z+=W(),void(T="decimalFraction");throw tu(W())},decimalPoint:function(){switch(R){case"e":case"E":return z+=W(),void(T="decimalExponent")}return U.isDigit(R)?(z+=W(),void(T="decimalFraction")):K("numeric",$*Number(z))},decimalFraction:function(){switch(R){case"e":case"E":return z+=W(),void(T="decimalExponent")}if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},decimalExponent:function(){switch(R){case"+":case"-":return z+=W(),void(T="decimalExponentSign")}if(U.isDigit(R))return z+=W(),void(T="decimalExponentInteger");throw tu(W())},decimalExponentSign:function(){if(U.isDigit(R))return z+=W(),void(T="decimalExponentInteger");throw tu(W())},decimalExponentInteger:function(){if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},hexadecimal:function(){if(U.isHexDigit(R))return z+=W(),void(T="hexadecimalInteger");throw tu(W())},hexadecimalInteger:function(){if(!U.isHexDigit(R))return K("numeric",$*Number(z));z+=W()},string:function(){switch(R){case"\\":return W(),void(z+=function(){switch(q()){case"b":return W(),"\b";case"f":return W(),"\f";case"n":return W(),"\n";case"r":return W(),"\r";case"t":return W(),"\t";case"v":return W(),"\v";case"0":if(W(),U.isDigit(q()))throw tu(W());return"\0";case"x":return W(),function(){var u="",D=q();if(!U.isHexDigit(D))throw tu(W());if(u+=W(),D=q(),!U.isHexDigit(D))throw tu(W());return u+=W(),String.fromCodePoint(parseInt(u,16))}();case"u":return W(),Y();case"\n":case"\u2028":case"\u2029":return W(),"";case"\r":return W(),"\n"===q()&&W(),"";case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case void 0:throw tu(W())}return W()}());case'"':return H?(W(),K("string",z)):void(z+=W());case"'":return H?void(z+=W()):(W(),K("string",z));case"\n":case"\r":throw tu(W());case"\u2028":case"\u2029":!function(u){console.warn("JSON5: '"+nu(u)+"' in strings is not valid ECMAScript; consider escaping")}(R);break;case void 0:throw tu(W())}z+=W()},start:function(){switch(R){case"{":case"[":return K("punctuator",W())}T="value"},beforePropertyName:function(){switch(R){case"$":case"_":return z=W(),void(T="identifierName");case"\\":return W(),void(T="identifierNameStartEscape");case"}":return K("punctuator",W());case'"':case"'":return H='"'===W(),void(T="string")}if(U.isIdStartChar(R))return z+=W(),void(T="identifierName");throw tu(W())},afterPropertyName:function(){if(":"===R)return K("punctuator",W());throw tu(W())},beforePropertyValue:function(){T="value"},afterPropertyValue:function(){switch(R){case",":case"}":return K("punctuator",W())}throw tu(W())},beforeArrayValue:function(){if("]"===R)return K("punctuator",W());T="value"},afterArrayValue:function(){switch(R){case",":case"]":return K("punctuator",W())}throw tu(W())},end:function(){throw tu(W())}};function K(u,D){return{type:u,value:D,line:V,column:J}}function Q(u){for(var D=0,e=u;D<e.length;D+=1){var t=e[D];if(q()!==t)throw tu(W());W()}}function Y(){for(var u="",D=4;D-- >0;){var e=q();if(!U.isHexDigit(e))throw tu(W());u+=W()}return String.fromCodePoint(parseInt(u,16))}var uu={start:function(){if("eof"===M.type)throw ru();Du()},beforePropertyName:function(){switch(M.type){case"identifier":case"string":return k=M.value,void(I="afterPropertyName");case"punctuator":return void eu();case"eof":throw ru()}},afterPropertyName:function(){if("eof"===M.type)throw ru();I="beforePropertyValue"},beforePropertyValue:function(){if("eof"===M.type)throw ru();Du()},beforeArrayValue:function(){if("eof"===M.type)throw ru();"punctuator"!==M.type||"]"!==M.value?Du():eu()},afterPropertyValue:function(){if("eof"===M.type)throw ru();switch(M.value){case",":return void(I="beforePropertyName");case"}":eu()}},afterArrayValue:function(){if("eof"===M.type)throw ru();switch(M.value){case",":return void(I="beforeArrayValue");case"]":eu()}},end:function(){}};function Du(){var u;switch(M.type){case"punctuator":switch(M.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=M.value}if(void 0===L)L=u;else{var D=O[O.length-1];Array.isArray(D)?D.push(u):D[k]=u}if(null!==u&&"object"==typeof u)O.push(u),I=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{var e=O[O.length-1];I=null==e?"end":Array.isArray(e)?"afterArrayValue":"afterPropertyValue"}}function eu(){O.pop();var u=O[O.length-1];I=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}function tu(u){return Cu(void 0===u?"JSON5: invalid end of input at "+V+":"+J:"JSON5: invalid character '"+nu(u)+"' at "+V+":"+J)}function ru(){return Cu("JSON5: invalid end of input at "+V+":"+J)}function Fu(){return Cu("JSON5: invalid identifier character at "+V+":"+(J-=5))}function nu(u){var D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){var e=u.charCodeAt(0).toString(16);return"\\x"+("00"+e).substring(e.length)}return u}function Cu(u){var D=new SyntaxError(u);return D.lineNumber=V,D.columnNumber=J,D}return{parse:function(u,D){_=String(u),I="start",O=[],j=0,V=1,J=0,M=void 0,k=void 0,L=void 0;do{M=Z(),uu[I]()}while("eof"!==M.type);return"function"==typeof D?function u(D,e,t){var r=D[e];if(null!=r&&"object"==typeof r)for(var F in r){var n=u(r,F,t);void 0===n?delete r[F]:r[F]=n}return t.call(D,e,r)}({"":L},"",D):L},stringify:function(u,D,e){var t,r,F,n=[],C="",A="";if(null==D||"object"!=typeof D||Array.isArray(D)||(e=D.space,F=D.quote,D=D.replacer),"function"==typeof D)r=D;else if(Array.isArray(D)){t=[];for(var i=0,E=D;i<E.length;i+=1){var o=E[i],a=void 0;"string"==typeof o?a=o:("number"==typeof o||o instanceof String||o instanceof Number)&&(a=String(o)),void 0!==a&&t.indexOf(a)<0&&t.push(a)}}return e instanceof Number?e=Number(e):e instanceof String&&(e=String(e)),"number"==typeof e?e>0&&(e=Math.min(10,Math.floor(e)),A="          ".substr(0,e)):"string"==typeof e&&(A=e.substr(0,10)),c("",{"":u});function c(u,D){var e=D[u];switch(null!=e&&("function"==typeof e.toJSON5?e=e.toJSON5(u):"function"==typeof e.toJSON&&(e=e.toJSON(u))),r&&(e=r.call(D,u,e)),e instanceof Number?e=Number(e):e instanceof String?e=String(e):e instanceof Boolean&&(e=e.valueOf()),e){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof e?B(e):"number"==typeof e?String(e):"object"==typeof e?Array.isArray(e)?function(u){if(n.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");n.push(u);var D=C;C+=A;for(var e,t=[],r=0;r<u.length;r++){var F=c(String(r),u);t.push(void 0!==F?F:"null")}if(0===t.length)e="[]";else if(""===A){var i=t.join(",");e="["+i+"]"}else{var E=",\n"+C,o=t.join(E);e="[\n"+C+o+",\n"+D+"]"}return n.pop(),C=D,e}(e):function(u){if(n.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");n.push(u);var D=C;C+=A;for(var e,r,F=t||Object.keys(u),i=[],E=0,o=F;E<o.length;E+=1){var a=o[E],B=c(a,u);if(void 0!==B){var f=s(a)+":";""!==A&&(f+=" "),f+=B,i.push(f)}}if(0===i.length)e="{}";else if(""===A)r=i.join(","),e="{"+r+"}";else{var l=",\n"+C;r=i.join(l),e="{\n"+C+r+",\n"+D+"}"}return n.pop(),C=D,e}(e):void 0}function B(u){for(var D={"'":.1,'"':.2},e={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"},t="",r=0;r<u.length;r++){var n=u[r];switch(n){case"'":case'"':D[n]++,t+=n;continue;case"\0":if(U.isDigit(u[r+1])){t+="\\x00";continue}}if(e[n])t+=e[n];else if(n<" "){var C=n.charCodeAt(0).toString(16);t+="\\x"+("00"+C).substring(C.length)}else t+=n}var A=F||Object.keys(D).reduce(function(u,e){return D[u]<D[e]?u:e});return A+(t=t.replace(new RegExp(A,"g"),e[A]))+A}function s(u){if(0===u.length)return B(u);var D=String.fromCodePoint(u.codePointAt(0));if(!U.isIdStartChar(D))return B(u);for(var e=D.length;e<u.length;e++)if(!U.isIdContinueChar(String.fromCodePoint(u.codePointAt(e))))return B(u);return u}}}});
var Space_Separator=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/,unicode={Space_Separator:Space_Separator,ID_Start:ID_Start,ID_Continue:ID_Continue},util={isSpaceSeparator:u=>"string"==typeof u&&unicode.Space_Separator.test(u),isIdStartChar:u=>"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||unicode.ID_Start.test(u)),isIdContinueChar:u=>"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"â€Œ"===u||"â€�"===u||unicode.ID_Continue.test(u)),isDigit:u=>"string"==typeof u&&/[0-9]/.test(u),isHexDigit:u=>"string"==typeof u&&/[0-9A-Fa-f]/.test(u)};let source,parseState,stack,pos,line,column,token,key,root;var parse=function(u,D){source=String(u),parseState="start",stack=[],pos=0,line=1,column=0,token=void 0,key=void 0,root=void 0;do{token=lex(),parseStates[parseState]()}while("eof"!==token.type);return"function"==typeof D?internalize({"":root},"",D):root};function internalize(u,D,e){const r=u[D];if(null!=r&&"object"==typeof r)for(const u in r){const D=internalize(r,u,e);void 0===D?delete r[u]:r[u]=D}return e.call(u,D,r)}let lexState,buffer,doubleQuote,sign,c;function lex(){for(lexState="default",buffer="",doubleQuote=!1,sign=1;;){c=peek();const u=lexStates[lexState]();if(u)return u}}function peek(){if(source[pos])return String.fromCodePoint(source.codePointAt(pos))}function read(){const u=peek();return"\n"===u?(line++,column=0):u?column+=u.length:column++,u&&(pos+=u.length),u}const lexStates={default(){switch(c){case"\t":case"\v":case"\f":case" ":case"Â ":case"\ufeff":case"\n":case"\r":case"\u2028":case"\u2029":return void read();case"/":return read(),void(lexState="comment");case void 0:return read(),newToken("eof")}if(!util.isSpaceSeparator(c))return lexStates[parseState]();read()},comment(){switch(c){case"*":return read(),void(lexState="multiLineComment");case"/":return read(),void(lexState="singleLineComment")}throw invalidChar(read())},multiLineComment(){switch(c){case"*":return read(),void(lexState="multiLineCommentAsterisk");case void 0:throw invalidChar(read())}read()},multiLineCommentAsterisk(){switch(c){case"*":return void read();case"/":return read(),void(lexState="default");case void 0:throw invalidChar(read())}read(),lexState="multiLineComment"},singleLineComment(){switch(c){case"\n":case"\r":case"\u2028":case"\u2029":return read(),void(lexState="default");case void 0:return read(),newToken("eof")}read()},value(){switch(c){case"{":case"[":return newToken("punctuator",read());case"n":return read(),literal("ull"),newToken("null",null);case"t":return read(),literal("rue"),newToken("boolean",!0);case"f":return read(),literal("alse"),newToken("boolean",!1);case"-":case"+":return"-"===read()&&(sign=-1),void(lexState="sign");case".":return buffer=read(),void(lexState="decimalPointLeading");case"0":return buffer=read(),void(lexState="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return buffer=read(),void(lexState="decimalInteger");case"I":return read(),literal("nfinity"),newToken("numeric",1/0);case"N":return read(),literal("aN"),newToken("numeric",NaN);case'"':case"'":return doubleQuote='"'===read(),buffer="",void(lexState="string")}throw invalidChar(read())},identifierNameStartEscape(){if("u"!==c)throw invalidChar(read());read();const u=unicodeEscape();switch(u){case"$":case"_":break;default:if(!util.isIdStartChar(u))throw invalidIdentifier()}buffer+=u,lexState="identifierName"},identifierName(){switch(c){case"$":case"_":case"â€Œ":case"â€�":return void(buffer+=read());case"\\":return read(),void(lexState="identifierNameEscape")}if(!util.isIdContinueChar(c))return newToken("identifier",buffer);buffer+=read()},identifierNameEscape(){if("u"!==c)throw invalidChar(read());read();const u=unicodeEscape();switch(u){case"$":case"_":case"â€Œ":case"â€�":break;default:if(!util.isIdContinueChar(u))throw invalidIdentifier()}buffer+=u,lexState="identifierName"},sign(){switch(c){case".":return buffer=read(),void(lexState="decimalPointLeading");case"0":return buffer=read(),void(lexState="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return buffer=read(),void(lexState="decimalInteger");case"I":return read(),literal("nfinity"),newToken("numeric",sign*(1/0));case"N":return read(),literal("aN"),newToken("numeric",NaN)}throw invalidChar(read())},zero(){switch(c){case".":return buffer+=read(),void(lexState="decimalPoint");case"e":case"E":return buffer+=read(),void(lexState="decimalExponent");case"x":case"X":return buffer+=read(),void(lexState="hexadecimal")}return newToken("numeric",0*sign)},decimalInteger(){switch(c){case".":return buffer+=read(),void(lexState="decimalPoint");case"e":case"E":return buffer+=read(),void(lexState="decimalExponent")}if(!util.isDigit(c))return newToken("numeric",sign*Number(buffer));buffer+=read()},decimalPointLeading(){if(util.isDigit(c))return buffer+=read(),void(lexState="decimalFraction");throw invalidChar(read())},decimalPoint(){switch(c){case"e":case"E":return buffer+=read(),void(lexState="decimalExponent")}return util.isDigit(c)?(buffer+=read(),void(lexState="decimalFraction")):newToken("numeric",sign*Number(buffer))},decimalFraction(){switch(c){case"e":case"E":return buffer+=read(),void(lexState="decimalExponent")}if(!util.isDigit(c))return newToken("numeric",sign*Number(buffer));buffer+=read()},decimalExponent(){switch(c){case"+":case"-":return buffer+=read(),void(lexState="decimalExponentSign")}if(util.isDigit(c))return buffer+=read(),void(lexState="decimalExponentInteger");throw invalidChar(read())},decimalExponentSign(){if(util.isDigit(c))return buffer+=read(),void(lexState="decimalExponentInteger");throw invalidChar(read())},decimalExponentInteger(){if(!util.isDigit(c))return newToken("numeric",sign*Number(buffer));buffer+=read()},hexadecimal(){if(util.isHexDigit(c))return buffer+=read(),void(lexState="hexadecimalInteger");throw invalidChar(read())},hexadecimalInteger(){if(!util.isHexDigit(c))return newToken("numeric",sign*Number(buffer));buffer+=read()},string(){switch(c){case"\\":return read(),void(buffer+=escape());case'"':return doubleQuote?(read(),newToken("string",buffer)):void(buffer+=read());case"'":return doubleQuote?void(buffer+=read()):(read(),newToken("string",buffer));case"\n":case"\r":throw invalidChar(read());case"\u2028":case"\u2029":separatorChar(c);break;case void 0:throw invalidChar(read())}buffer+=read()},start(){switch(c){case"{":case"[":return newToken("punctuator",read())}lexState="value"},beforePropertyName(){switch(c){case"$":case"_":return buffer=read(),void(lexState="identifierName");case"\\":return read(),void(lexState="identifierNameStartEscape");case"}":return newToken("punctuator",read());case'"':case"'":return doubleQuote='"'===read(),void(lexState="string")}if(util.isIdStartChar(c))return buffer+=read(),void(lexState="identifierName");throw invalidChar(read())},afterPropertyName(){if(":"===c)return newToken("punctuator",read());throw invalidChar(read())},beforePropertyValue(){lexState="value"},afterPropertyValue(){switch(c){case",":case"}":return newToken("punctuator",read())}throw invalidChar(read())},beforeArrayValue(){if("]"===c)return newToken("punctuator",read());lexState="value"},afterArrayValue(){switch(c){case",":case"]":return newToken("punctuator",read())}throw invalidChar(read())},end(){throw invalidChar(read())}};function newToken(u,D){return{type:u,value:D,line:line,column:column}}function literal(u){for(const D of u){if(peek()!==D)throw invalidChar(read());read()}}function escape(){switch(peek()){case"b":return read(),"\b";case"f":return read(),"\f";case"n":return read(),"\n";case"r":return read(),"\r";case"t":return read(),"\t";case"v":return read(),"\v";case"0":if(read(),util.isDigit(peek()))throw invalidChar(read());return"\0";case"x":return read(),hexEscape();case"u":return read(),unicodeEscape();case"\n":case"\u2028":case"\u2029":return read(),"";case"\r":return read(),"\n"===peek()&&read(),"";case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case void 0:throw invalidChar(read())}return read()}function hexEscape(){let u="",D=peek();if(!util.isHexDigit(D))throw invalidChar(read());if(u+=read(),D=peek(),!util.isHexDigit(D))throw invalidChar(read());return u+=read(),String.fromCodePoint(parseInt(u,16))}function unicodeEscape(){let u="",D=4;for(;D-- >0;){const D=peek();if(!util.isHexDigit(D))throw invalidChar(read());u+=read()}return String.fromCodePoint(parseInt(u,16))}const parseStates={start(){if("eof"===token.type)throw invalidEOF();push()},beforePropertyName(){switch(token.type){case"identifier":case"string":return key=token.value,void(parseState="afterPropertyName");case"punctuator":return void pop();case"eof":throw invalidEOF()}},afterPropertyName(){if("eof"===token.type)throw invalidEOF();parseState="beforePropertyValue"},beforePropertyValue(){if("eof"===token.type)throw invalidEOF();push()},beforeArrayValue(){if("eof"===token.type)throw invalidEOF();"punctuator"!==token.type||"]"!==token.value?push():pop()},afterPropertyValue(){if("eof"===token.type)throw invalidEOF();switch(token.value){case",":return void(parseState="beforePropertyName");case"}":pop()}},afterArrayValue(){if("eof"===token.type)throw invalidEOF();switch(token.value){case",":return void(parseState="beforeArrayValue");case"]":pop()}},end(){}};function push(){let u;switch(token.type){case"punctuator":switch(token.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=token.value}if(void 0===root)root=u;else{const D=stack[stack.length-1];Array.isArray(D)?D.push(u):D[key]=u}if(null!==u&&"object"==typeof u)stack.push(u),parseState=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{const u=stack[stack.length-1];parseState=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}}function pop(){stack.pop();const u=stack[stack.length-1];parseState=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}function invalidChar(u){return syntaxError(void 0===u?`JSON5: invalid end of input at ${line}:${column}`:`JSON5: invalid character '${formatChar(u)}' at ${line}:${column}`)}function invalidEOF(){return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)}function invalidIdentifier(){return syntaxError(`JSON5: invalid identifier character at ${line}:${column-=5}`)}function separatorChar(u){console.warn(`JSON5: '${formatChar(u)}' in strings is not valid ECMAScript; consider escaping`)}function formatChar(u){const D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){const D=u.charCodeAt(0).toString(16);return"\\x"+("00"+D).substring(D.length)}return u}function syntaxError(u){const D=new SyntaxError(u);return D.lineNumber=line,D.columnNumber=column,D}var stringify=function(u,D,e){const r=[];let t,F,C,a="",A="";if(null==D||"object"!=typeof D||Array.isArray(D)||(e=D.space,C=D.quote,D=D.replacer),"function"==typeof D)F=D;else if(Array.isArray(D)){t=[];for(const u of D){let D;"string"==typeof u?D=u:("number"==typeof u||u instanceof String||u instanceof Number)&&(D=String(u)),void 0!==D&&t.indexOf(D)<0&&t.push(D)}}return e instanceof Number?e=Number(e):e instanceof String&&(e=String(e)),"number"==typeof e?e>0&&(e=Math.min(10,Math.floor(e)),A="          ".substr(0,e)):"string"==typeof e&&(A=e.substr(0,10)),E("",{"":u});function E(u,D){let e=D[u];switch(null!=e&&("function"==typeof e.toJSON5?e=e.toJSON5(u):"function"==typeof e.toJSON&&(e=e.toJSON(u))),F&&(e=F.call(D,u,e)),e instanceof Number?e=Number(e):e instanceof String?e=String(e):e instanceof Boolean&&(e=e.valueOf()),e){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof e?n(e):"number"==typeof e?String(e):"object"==typeof e?Array.isArray(e)?function(u){if(r.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");r.push(u);let D=a;a+=A;let e,t=[];for(let D=0;D<u.length;D++){const e=E(String(D),u);t.push(void 0!==e?e:"null")}if(0===t.length)e="[]";else if(""===A){let u=t.join(",");e="["+u+"]"}else{let u=",\n"+a,r=t.join(u);e="[\n"+a+r+",\n"+D+"]"}return r.pop(),a=D,e}(e):function(u){if(r.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");r.push(u);let D=a;a+=A;let e,F=t||Object.keys(u),C=[];for(const D of F){const e=E(D,u);if(void 0!==e){let u=i(D)+":";""!==A&&(u+=" "),u+=e,C.push(u)}}if(0===C.length)e="{}";else{let u;if(""===A)u=C.join(","),e="{"+u+"}";else{let r=",\n"+a;u=C.join(r),e="{\n"+a+u+",\n"+D+"}"}}return r.pop(),a=D,e}(e):void 0}function n(u){const D={"'":.1,'"':.2},e={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};let r="";for(let t=0;t<u.length;t++){const F=u[t];switch(F){case"'":case'"':D[F]++,r+=F;continue;case"\0":if(util.isDigit(u[t+1])){r+="\\x00";continue}}if(e[F])r+=e[F];else if(F<" "){let u=F.charCodeAt(0).toString(16);r+="\\x"+("00"+u).substring(u.length)}else r+=F}const t=C||Object.keys(D).reduce((u,e)=>D[u]<D[e]?u:e);return t+(r=r.replace(new RegExp(t,"g"),e[t]))+t}function i(u){if(0===u.length)return n(u);const D=String.fromCodePoint(u.codePointAt(0));if(!util.isIdStartChar(D))return n(u);for(let e=D.length;e<u.length;e++)if(!util.isIdContinueChar(String.fromCodePoint(u.codePointAt(e))))return n(u);return u}};const JSON5={parse:parse,stringify:stringify};var lib=JSON5;export default lib;
// This is a generated file. Do not edit.
var Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/;
var ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/;
var ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/;

var unicode = {
	Space_Separator: Space_Separator,
	ID_Start: ID_Start,
	ID_Continue: ID_Continue
};

var util = {
    isSpaceSeparator (c) {
        return typeof c === 'string' && unicode.Space_Separator.test(c)
    },

    isIdStartChar (c) {
        return typeof c === 'string' && (
            (c >= 'a' && c <= 'z') ||
        (c >= 'A' && c <= 'Z') ||
        (c === '$') || (c === '_') ||
        unicode.ID_Start.test(c)
        )
    },

    isIdContinueChar (c) {
        return typeof c === 'string' && (
            (c >= 'a' && c <= 'z') ||
        (c >= 'A' && c <= 'Z') ||
        (c >= '0' && c <= '9') ||
        (c === '$') || (c === '_') ||
        (c === '\u200C') || (c === '\u200D') ||
        unicode.ID_Continue.test(c)
        )
    },

    isDigit (c) {
        return typeof c === 'string' && /[0-9]/.test(c)
    },

    isHexDigit (c) {
        return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)
    },
};

let source;
let parseState;
let stack;
let pos;
let line;
let column;
let token;
let key;
let root;

var parse = function parse (text, reviver) {
    source = String(text);
    parseState = 'start';
    stack = [];
    pos = 0;
    line = 1;
    column = 0;
    token = undefined;
    key = undefined;
    root = undefined;

    do {
        token = lex();

        // This code is unreachable.
        // if (!parseStates[parseState]) {
        //     throw invalidParseState()
        // }

        parseStates[parseState]();
    } while (token.type !== 'eof')

    if (typeof reviver === 'function') {
        return internalize({'': root}, '', reviver)
    }

    return root
};

function internalize (holder, name, reviver) {
    const value = holder[name];
    if (value != null && typeof value === 'object') {
        for (const key in value) {
            const replacement = internalize(value, key, reviver);
            if (replacement === undefined) {
                delete value[key];
            } else {
                value[key] = replacement;
            }
        }
    }

    return reviver.call(holder, name, value)
}

let lexState;
let buffer;
let doubleQuote;
let sign;
let c;

function lex () {
    lexState = 'default';
    buffer = '';
    doubleQuote = false;
    sign = 1;

    for (;;) {
        c = peek();

        // This code is unreachable.
        // if (!lexStates[lexState]) {
        //     throw invalidLexState(lexState)
        // }

        const token = lexStates[lexState]();
        if (token) {
            return token
        }
    }
}

function peek () {
    if (source[pos]) {
        return String.fromCodePoint(source.codePointAt(pos))
    }
}

function read () {
    const c = peek();

    if (c === '\n') {
        line++;
        column = 0;
    } else if (c) {
        column += c.length;
    } else {
        column++;
    }

    if (c) {
        pos += c.length;
    }

    return c
}

const lexStates = {
    default () {
        switch (c) {
        case '\t':
        case '\v':
        case '\f':
        case ' ':
        case '\u00A0':
        case '\uFEFF':
        case '\n':
        case '\r':
        case '\u2028':
        case '\u2029':
            read();
            return

        case '/':
            read();
            lexState = 'comment';
            return

        case undefined:
            read();
            return newToken('eof')
        }

        if (util.isSpaceSeparator(c)) {
            read();
            return
        }

        // This code is unreachable.
        // if (!lexStates[parseState]) {
        //     throw invalidLexState(parseState)
        // }

        return lexStates[parseState]()
    },

    comment () {
        switch (c) {
        case '*':
            read();
            lexState = 'multiLineComment';
            return

        case '/':
            read();
            lexState = 'singleLineComment';
            return
        }

        throw invalidChar(read())
    },

    multiLineComment () {
        switch (c) {
        case '*':
            read();
            lexState = 'multiLineCommentAsterisk';
            return

        case undefined:
            throw invalidChar(read())
        }

        read();
    },

    multiLineCommentAsterisk () {
        switch (c) {
        case '*':
            read();
            return

        case '/':
            read();
            lexState = 'default';
            return

        case undefined:
            throw invalidChar(read())
        }

        read();
        lexState = 'multiLineComment';
    },

    singleLineComment () {
        switch (c) {
        case '\n':
        case '\r':
        case '\u2028':
        case '\u2029':
            read();
            lexState = 'default';
            return

        case undefined:
            read();
            return newToken('eof')
        }

        read();
    },

    value () {
        switch (c) {
        case '{':
        case '[':
            return newToken('punctuator', read())

        case 'n':
            read();
            literal('ull');
            return newToken('null', null)

        case 't':
            read();
            literal('rue');
            return newToken('boolean', true)

        case 'f':
            read();
            literal('alse');
            return newToken('boolean', false)

        case '-':
        case '+':
            if (read() === '-') {
                sign = -1;
            }

            lexState = 'sign';
            return

        case '.':
            buffer = read();
            lexState = 'decimalPointLeading';
            return

        case '0':
            buffer = read();
            lexState = 'zero';
            return

        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            buffer = read();
            lexState = 'decimalInteger';
            return

        case 'I':
            read();
            literal('nfinity');
            return newToken('numeric', Infinity)

        case 'N':
            read();
            literal('aN');
            return newToken('numeric', NaN)

        case '"':
        case "'":
            doubleQuote = (read() === '"');
            buffer = '';
            lexState = 'string';
            return
        }

        throw invalidChar(read())
    },

    identifierNameStartEscape () {
        if (c !== 'u') {
            throw invalidChar(read())
        }

        read();
        const u = unicodeEscape();
        switch (u) {
        case '$':
        case '_':
            break

        default:
            if (!util.isIdStartChar(u)) {
                throw invalidIdentifier()
            }

            break
        }

        buffer += u;
        lexState = 'identifierName';
    },

    identifierName () {
        switch (c) {
        case '$':
        case '_':
        case '\u200C':
        case '\u200D':
            buffer += read();
            return

        case '\\':
            read();
            lexState = 'identifierNameEscape';
            return
        }

        if (util.isIdContinueChar(c)) {
            buffer += read();
            return
        }

        return newToken('identifier', buffer)
    },

    identifierNameEscape () {
        if (c !== 'u') {
            throw invalidChar(read())
        }

        read();
        const u = unicodeEscape();
        switch (u) {
        case '$':
        case '_':
        case '\u200C':
        case '\u200D':
            break

        default:
            if (!util.isIdContinueChar(u)) {
                throw invalidIdentifier()
            }

            break
        }

        buffer += u;
        lexState = 'identifierName';
    },

    sign () {
        switch (c) {
        case '.':
            buffer = read();
            lexState = 'decimalPointLeading';
            return

        case '0':
            buffer = read();
            lexState = 'zero';
            return

        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            buffer = read();
            lexState = 'decimalInteger';
            return

        case 'I':
            read();
            literal('nfinity');
            return newToken('numeric', sign * Infinity)

        case 'N':
            read();
            literal('aN');
            return newToken('numeric', NaN)
        }

        throw invalidChar(read())
    },

    zero () {
        switch (c) {
        case '.':
            buffer += read();
            lexState = 'decimalPoint';
            return

        case 'e':
        case 'E':
            buffer += read();
            lexState = 'decimalExponent';
            return

        case 'x':
        case 'X':
            buffer += read();
            lexState = 'hexadecimal';
            return
        }

        return newToken('numeric', sign * 0)
    },

    decimalInteger () {
        switch (c) {
        case '.':
            buffer += read();
            lexState = 'decimalPoint';
            return

        case 'e':
        case 'E':
            buffer += read();
            lexState = 'decimalExponent';
            return
        }

        if (util.isDigit(c)) {
            buffer += read();
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    decimalPointLeading () {
        if (util.isDigit(c)) {
            buffer += read();
            lexState = 'decimalFraction';
            return
        }

        throw invalidChar(read())
    },

    decimalPoint () {
        switch (c) {
        case 'e':
        case 'E':
            buffer += read();
            lexState = 'decimalExponent';
            return
        }

        if (util.isDigit(c)) {
            buffer += read();
            lexState = 'decimalFraction';
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    decimalFraction () {
        switch (c) {
        case 'e':
        case 'E':
            buffer += read();
            lexState = 'decimalExponent';
            return
        }

        if (util.isDigit(c)) {
            buffer += read();
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    decimalExponent () {
        switch (c) {
        case '+':
        case '-':
            buffer += read();
            lexState = 'decimalExponentSign';
            return
        }

        if (util.isDigit(c)) {
            buffer += read();
            lexState = 'decimalExponentInteger';
            return
        }

        throw invalidChar(read())
    },

    decimalExponentSign () {
        if (util.isDigit(c)) {
            buffer += read();
            lexState = 'decimalExponentInteger';
            return
        }

        throw invalidChar(read())
    },

    decimalExponentInteger () {
        if (util.isDigit(c)) {
            buffer += read();
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    hexadecimal () {
        if (util.isHexDigit(c)) {
            buffer += read();
            lexState = 'hexadecimalInteger';
            return
        }

        throw invalidChar(read())
    },

    hexadecimalInteger () {
        if (util.isHexDigit(c)) {
            buffer += read();
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    string () {
        switch (c) {
        case '\\':
            read();
            buffer += escape();
            return

        case '"':
            if (doubleQuote) {
                read();
                return newToken('string', buffer)
            }

            buffer += read();
            return

        case "'":
            if (!doubleQuote) {
                read();
                return newToken('string', buffer)
            }

            buffer += read();
            return

        case '\n':
        case '\r':
            throw invalidChar(read())

        case '\u2028':
        case '\u2029':
            separatorChar(c);
            break

        case undefined:
            throw invalidChar(read())
        }

        buffer += read();
    },

    start () {
        switch (c) {
        case '{':
        case '[':
            return newToken('punctuator', read())

        // This code is unreachable since the default lexState handles eof.
        // case undefined:
        //     return newToken('eof')
        }

        lexState = 'value';
    },

    beforePropertyName () {
        switch (c) {
        case '$':
        case '_':
            buffer = read();
            lexState = 'identifierName';
            return

        case '\\':
            read();
            lexState = 'identifierNameStartEscape';
            return

        case '}':
            return newToken('punctuator', read())

        case '"':
        case "'":
            doubleQuote = (read() === '"');
            lexState = 'string';
            return
        }

        if (util.isIdStartChar(c)) {
            buffer += read();
            lexState = 'identifierName';
            return
        }

        throw invalidChar(read())
    },

    afterPropertyName () {
        if (c === ':') {
            return newToken('punctuator', read())
        }

        throw invalidChar(read())
    },

    beforePropertyValue () {
        lexState = 'value';
    },

    afterPropertyValue () {
        switch (c) {
        case ',':
        case '}':
            return newToken('punctuator', read())
        }

        throw invalidChar(read())
    },

    beforeArrayValue () {
        if (c === ']') {
            return newToken('punctuator', read())
        }

        lexState = 'value';
    },

    afterArrayValue () {
        switch (c) {
        case ',':
        case ']':
            return newToken('punctuator', read())
        }

        throw invalidChar(read())
    },

    end () {
        // This code is unreachable since it's handled by the default lexState.
        // if (c === undefined) {
        //     read()
        //     return newToken('eof')
        // }

        throw invalidChar(read())
    },
};

function newToken (type, value) {
    return {
        type,
        value,
        line,
        column,
    }
}

function literal (s) {
    for (const c of s) {
        const p = peek();

        if (p !== c) {
            throw invalidChar(read())
        }

        read();
    }
}

function escape () {
    const c = peek();
    switch (c) {
    case 'b':
        read();
        return '\b'

    case 'f':
        read();
        return '\f'

    case 'n':
        read();
        return '\n'

    case 'r':
        read();
        return '\r'

    case 't':
        read();
        return '\t'

    case 'v':
        read();
        return '\v'

    case '0':
        read();
        if (util.isDigit(peek())) {
            throw invalidChar(read())
        }

        return '\0'

    case 'x':
        read();
        return hexEscape()

    case 'u':
        read();
        return unicodeEscape()

    case '\n':
    case '\u2028':
    case '\u2029':
        read();
        return ''

    case '\r':
        read();
        if (peek() === '\n') {
            read();
        }

        return ''

    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
        throw invalidChar(read())

    case undefined:
        throw invalidChar(read())
    }

    return read()
}

function hexEscape () {
    let buffer = '';
    let c = peek();

    if (!util.isHexDigit(c)) {
        throw invalidChar(read())
    }

    buffer += read();

    c = peek();
    if (!util.isHexDigit(c)) {
        throw invalidChar(read())
    }

    buffer += read();

    return String.fromCodePoint(parseInt(buffer, 16))
}

function unicodeEscape () {
    let buffer = '';
    let count = 4;

    while (count-- > 0) {
        const c = peek();
        if (!util.isHexDigit(c)) {
            throw invalidChar(read())
        }

        buffer += read();
    }

    return String.fromCodePoint(parseInt(buffer, 16))
}

const parseStates = {
    start () {
        if (token.type === 'eof') {
            throw invalidEOF()
        }

        push();
    },

    beforePropertyName () {
        switch (token.type) {
        case 'identifier':
        case 'string':
            key = token.value;
            parseState = 'afterPropertyName';
            return

        case 'punctuator':
            // This code is unreachable since it's handled by the lexState.
            // if (token.value !== '}') {
            //     throw invalidToken()
            // }

            pop();
            return

        case 'eof':
            throw invalidEOF()
        }

        // This code is unreachable since it's handled by the lexState.
        // throw invalidToken()
    },

    afterPropertyName () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'punctuator' || token.value !== ':') {
        //     throw invalidToken()
        // }

        if (token.type === 'eof') {
            throw invalidEOF()
        }

        parseState = 'beforePropertyValue';
    },

    beforePropertyValue () {
        if (token.type === 'eof') {
            throw invalidEOF()
        }

        push();
    },

    beforeArrayValue () {
        if (token.type === 'eof') {
            throw invalidEOF()
        }

        if (token.type === 'punctuator' && token.value === ']') {
            pop();
            return
        }

        push();
    },

    afterPropertyValue () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'punctuator') {
        //     throw invalidToken()
        // }

        if (token.type === 'eof') {
            throw invalidEOF()
        }

        switch (token.value) {
        case ',':
            parseState = 'beforePropertyName';
            return

        case '}':
            pop();
        }

        // This code is unreachable since it's handled by the lexState.
        // throw invalidToken()
    },

    afterArrayValue () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'punctuator') {
        //     throw invalidToken()
        // }

        if (token.type === 'eof') {
            throw invalidEOF()
        }

        switch (token.value) {
        case ',':
            parseState = 'beforeArrayValue';
            return

        case ']':
            pop();
        }

        // This code is unreachable since it's handled by the lexState.
        // throw invalidToken()
    },

    end () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'eof') {
        //     throw invalidToken()
        // }
    },
};

function push () {
    let value;

    switch (token.type) {
    case 'punctuator':
        switch (token.value) {
        case '{':
            value = {};
            break

        case '[':
            value = [];
            break
        }

        break

    case 'null':
    case 'boolean':
    case 'numeric':
    case 'string':
        value = token.value;
        break

    // This code is unreachable.
    // default:
    //     throw invalidToken()
    }

    if (root === undefined) {
        root = value;
    } else {
        const parent = stack[stack.length - 1];
        if (Array.isArray(parent)) {
            parent.push(value);
        } else {
            parent[key] = value;
        }
    }

    if (value !== null && typeof value === 'object') {
        stack.push(value);

        if (Array.isArray(value)) {
            parseState = 'beforeArrayValue';
        } else {
            parseState = 'beforePropertyName';
        }
    } else {
        const current = stack[stack.length - 1];
        if (current == null) {
            parseState = 'end';
        } else if (Array.isArray(current)) {
            parseState = 'afterArrayValue';
        } else {
            parseState = 'afterPropertyValue';
        }
    }
}

function pop () {
    stack.pop();

    const current = stack[stack.length - 1];
    if (current == null) {
        parseState = 'end';
    } else if (Array.isArray(current)) {
        parseState = 'afterArrayValue';
    } else {
        parseState = 'afterPropertyValue';
    }
}

// This code is unreachable.
// function invalidParseState () {
//     return new Error(`JSON5: invalid parse state '${parseState}'`)
// }

// This code is unreachable.
// function invalidLexState (state) {
//     return new Error(`JSON5: invalid lex state '${state}'`)
// }

function invalidChar (c) {
    if (c === undefined) {
        return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
    }

    return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
}

function invalidEOF () {
    return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
}

// This code is unreachable.
// function invalidToken () {
//     if (token.type === 'eof') {
//         return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
//     }

//     const c = String.fromCodePoint(token.value.codePointAt(0))
//     return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
// }

function invalidIdentifier () {
    column -= 5;
    return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`)
}

function separatorChar (c) {
    console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`);
}

function formatChar (c) {
    const replacements = {
        "'": "\\'",
        '"': '\\"',
        '\\': '\\\\',
        '\b': '\\b',
        '\f': '\\f',
        '\n': '\\n',
        '\r': '\\r',
        '\t': '\\t',
        '\v': '\\v',
        '\0': '\\0',
        '\u2028': '\\u2028',
        '\u2029': '\\u2029',
    };

    if (replacements[c]) {
        return replacements[c]
    }

    if (c < ' ') {
        const hexString = c.charCodeAt(0).toString(16);
        return '\\x' + ('00' + hexString).substring(hexString.length)
    }

    return c
}

function syntaxError (message) {
    const err = new SyntaxError(message);
    err.lineNumber = line;
    err.columnNumber = column;
    return err
}

var stringify = function stringify (value, replacer, space) {
    const stack = [];
    let indent = '';
    let propertyList;
    let replacerFunc;
    let gap = '';
    let quote;

    if (
        replacer != null &&
        typeof replacer === 'object' &&
        !Array.isArray(replacer)
    ) {
        space = replacer.space;
        quote = replacer.quote;
        replacer = replacer.replacer;
    }

    if (typeof replacer === 'function') {
        replacerFunc = replacer;
    } else if (Array.isArray(replacer)) {
        propertyList = [];
        for (const v of replacer) {
            let item;

            if (typeof v === 'string') {
                item = v;
            } else if (
                typeof v === 'number' ||
                v instanceof String ||
                v instanceof Number
            ) {
                item = String(v);
            }

            if (item !== undefined && propertyList.indexOf(item) < 0) {
                propertyList.push(item);
            }
        }
    }

    if (space instanceof Number) {
        space = Number(space);
    } else if (space instanceof String) {
        space = String(space);
    }

    if (typeof space === 'number') {
        if (space > 0) {
            space = Math.min(10, Math.floor(space));
            gap = '          '.substr(0, space);
        }
    } else if (typeof space === 'string') {
        gap = space.substr(0, 10);
    }

    return serializeProperty('', {'': value})

    function serializeProperty (key, holder) {
        let value = holder[key];
        if (value != null) {
            if (typeof value.toJSON5 === 'function') {
                value = value.toJSON5(key);
            } else if (typeof value.toJSON === 'function') {
                value = value.toJSON(key);
            }
        }

        if (replacerFunc) {
            value = replacerFunc.call(holder, key, value);
        }

        if (value instanceof Number) {
            value = Number(value);
        } else if (value instanceof String) {
            value = String(value);
        } else if (value instanceof Boolean) {
            value = value.valueOf();
        }

        switch (value) {
        case null: return 'null'
        case true: return 'true'
        case false: return 'false'
        }

        if (typeof value === 'string') {
            return quoteString(value, false)
        }

        if (typeof value === 'number') {
            return String(value)
        }

        if (typeof value === 'object') {
            return Array.isArray(value) ? serializeArray(value) : serializeObject(value)
        }

        return undefined
    }

    function quoteString (value) {
        const quotes = {
            "'": 0.1,
            '"': 0.2,
        };

        const replacements = {
            "'": "\\'",
            '"': '\\"',
            '\\': '\\\\',
            '\b': '\\b',
            '\f': '\\f',
            '\n': '\\n',
            '\r': '\\r',
            '\t': '\\t',
            '\v': '\\v',
            '\0': '\\0',
            '\u2028': '\\u2028',
            '\u2029': '\\u2029',
        };

        let product = '';

        for (let i = 0; i < value.length; i++) {
            const c = value[i];
            switch (c) {
            case "'":
            case '"':
                quotes[c]++;
                product += c;
                continue

            case '\0':
                if (util.isDigit(value[i + 1])) {
                    product += '\\x00';
                    continue
                }
            }

            if (replacements[c]) {
                product += replacements[c];
                continue
            }

            if (c < ' ') {
                let hexString = c.charCodeAt(0).toString(16);
                product += '\\x' + ('00' + hexString).substring(hexString.length);
                continue
            }

            product += c;
        }

        const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b);

        product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]);

        return quoteChar + product + quoteChar
    }

    function serializeObject (value) {
        if (stack.indexOf(value) >= 0) {
            throw TypeError('Converting circular structure to JSON5')
        }

        stack.push(value);

        let stepback = indent;
        indent = indent + gap;

        let keys = propertyList || Object.keys(value);
        let partial = [];
        for (const key of keys) {
            const propertyString = serializeProperty(key, value);
            if (propertyString !== undefined) {
                let member = serializeKey(key) + ':';
                if (gap !== '') {
                    member += ' ';
                }
                member += propertyString;
                partial.push(member);
            }
        }

        let final;
        if (partial.length === 0) {
            final = '{}';
        } else {
            let properties;
            if (gap === '') {
                properties = partial.join(',');
                final = '{' + properties + '}';
            } else {
                let separator = ',\n' + indent;
                properties = partial.join(separator);
                final = '{\n' + indent + properties + ',\n' + stepback + '}';
            }
        }

        stack.pop();
        indent = stepback;
        return final
    }

    function serializeKey (key) {
        if (key.length === 0) {
            return quoteString(key, true)
        }

        const firstChar = String.fromCodePoint(key.codePointAt(0));
        if (!util.isIdStartChar(firstChar)) {
            return quoteString(key, true)
        }

        for (let i = firstChar.length; i < key.length; i++) {
            if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {
                return quoteString(key, true)
            }
        }

        return key
    }

    function serializeArray (value) {
        if (stack.indexOf(value) >= 0) {
            throw TypeError('Converting circular structure to JSON5')
        }

        stack.push(value);

        let stepback = indent;
        indent = indent + gap;

        let partial = [];
        for (let i = 0; i < value.length; i++) {
            const propertyString = serializeProperty(String(i), value);
            partial.push((propertyString !== undefined) ? propertyString : 'null');
        }

        let final;
        if (partial.length === 0) {
            final = '[]';
        } else {
            if (gap === '') {
                let properties = partial.join(',');
                final = '[' + properties + ']';
            } else {
                let separator = ',\n' + indent;
                let properties = partial.join(separator);
                final = '[\n' + indent + properties + ',\n' + stepback + ']';
            }
        }

        stack.pop();
        indent = stepback;
        return final
    }
};

const JSON5 = {
    parse,
    stringify,
};

var lib = JSON5;

export default lib;
(The MIT License)

Copyright (c) 2012-2015, JP Richardson <jprichardson@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
 merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
var _fs
try {
  _fs = require('graceful-fs')
} catch (_) {
  _fs = require('fs')
}

function readFile (file, options, callback) {
  if (callback == null) {
    callback = options
    options = {}
  }

  if (typeof options === 'string') {
    options = {encoding: options}
  }

  options = options || {}
  var fs = options.fs || _fs

  var shouldThrow = true
  if ('throws' in options) {
    shouldThrow = options.throws
  }

  fs.readFile(file, options, function (err, data) {
    if (err) return callback(err)

    data = stripBom(data)

    var obj
    try {
      obj = JSON.parse(data, options ? options.reviver : null)
    } catch (err2) {
      if (shouldThrow) {
        err2.message = file + ': ' + err2.message
        return callback(err2)
      } else {
        return callback(null, null)
      }
    }

    callback(null, obj)
  })
}

function readFileSync (file, options) {
  options = options || {}
  if (typeof options === 'string') {
    options = {encoding: options}
  }

  var fs = options.fs || _fs

  var shouldThrow = true
  if ('throws' in options) {
    shouldThrow = options.throws
  }

  try {
    var content = fs.readFileSync(file, options)
    content = stripBom(content)
    return JSON.parse(content, options.reviver)
  } catch (err) {
    if (shouldThrow) {
      err.message = file + ': ' + err.message
      throw err
    } else {
      return null
    }
  }
}

function stringify (obj, options) {
  var spaces
  var EOL = '\n'
  if (typeof options === 'object' && options !== null) {
    if (options.spaces) {
      spaces = options.spaces
    }
    if (options.EOL) {
      EOL = options.EOL
    }
  }

  var str = JSON.stringify(obj, options ? options.replacer : null, spaces)

  return str.replace(/\n/g, EOL) + EOL
}

function writeFile (file, obj, options, callback) {
  if (callback == null) {
    callback = options
    options = {}
  }
  options = options || {}
  var fs = options.fs || _fs

  var str = ''
  try {
    str = stringify(obj, options)
  } catch (err) {
    // Need to return whether a callback was passed or not
    if (callback) callback(err, null)
    return
  }

  fs.writeFile(file, str, options, callback)
}

function writeFileSync (file, obj, options) {
  options = options || {}
  var fs = options.fs || _fs

  var str = stringify(obj, options)
  // not sure if fs.writeFileSync returns anything, but just in case
  return fs.writeFileSync(file, str, options)
}

function stripBom (content) {
  // we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified
  if (Buffer.isBuffer(content)) content = content.toString('utf8')
  content = content.replace(/^\uFEFF/, '')
  return content
}

var jsonfile = {
  readFile: readFile,
  readFileSync: readFileSync,
  writeFile: writeFile,
  writeFileSync: writeFileSync
}

module.exports = jsonfile
{
  "author": {
    "name": "JP Richardson",
    "email": "jprichardson@gmail.com"
  },
  "dependencies": {
    "graceful-fs": "^4.1.6"
  },
  "deprecated": false,
  "description": "Easily read/write JSON files.",
  "devDependencies": {
    "mocha": "2.x",
    "rimraf": "^2.4.0",
    "standard": "^10.0.3"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/jprichardson/node-jsonfile#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "jsonfile",
  "optionalDependencies": {
    "graceful-fs": "^4.1.6"
  },
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/jprichardson/node-jsonfile.git"
  },
  "version": "4.0.0"
}{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "babel": {
    "presets": [
      "babel-preset-ts-node6-bluebird"
    ]
  },
  "deprecated": false,
  "description": "Lazy value.",
  "devDependencies": {
    "babel-preset-ts-node6-bluebird": "^3.0.1",
    "ts-babel": "^6.1.2",
    "typescript": "^3.3.3333"
  },
  "files": [
    "out"
  ],
  "homepage": "https://github.com/develar/lazy-val",
  "license": "MIT",
  "main": "out/main.js",
  "name": "lazy-val",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/develar/lazy-val.git"
  },
  "typings": "./out/main.d.ts",
  "version": "1.0.4"
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Lazy = void 0;

class Lazy {
  constructor(creator) {
    this._value = null;
    this.creator = creator;
  }

  get hasValue() {
    return this.creator == null;
  }

  get value() {
    if (this.creator == null) {
      return this._value;
    }

    const result = this.creator();
    this.value = result;
    return result;
  }

  set value(value) {
    this._value = value;
    this.creator = null;
  }

} exports.Lazy = Lazy;
// __ts-babel@6.0.4
//# sourceMappingURL=main.js.map{"version":3,"sources":["../src/main.ts"],"names":[],"mappings":";;;;;;;AAAM,MAAO,IAAP,CAAW;AAIf,EAAA,WAAA,CAAY,OAAZ,EAAqC;AAH7B,SAAA,MAAA,GAA4B,IAA5B;AAIN,SAAK,OAAL,GAAe,OAAf;AACD;;AAED,MAAI,QAAJ,GAAY;AACV,WAAO,KAAK,OAAL,IAAgB,IAAvB;AACD;;AAED,MAAI,KAAJ,GAAS;AACP,QAAI,KAAK,OAAL,IAAgB,IAApB,EAA0B;AACxB,aAAO,KAAK,MAAZ;AACD;;AAED,UAAM,MAAM,GAAG,KAAK,OAAL,EAAf;AACA,SAAK,KAAL,GAAa,MAAb;AACA,WAAO,MAAP;AACD;;AAED,MAAI,KAAJ,CAAU,KAAV,EAA2B;AACzB,SAAK,MAAL,GAAc,KAAd;AACA,SAAK,OAAL,GAAe,IAAf;AACD;;AAzBc,C","sourcesContent":["export class Lazy<T> {\n  private _value: Promise<T> | null = null\n  private creator: (() => Promise<T>) | null\n\n  constructor(creator: () => Promise<T>) {\n    this.creator = creator\n  }\n\n  get hasValue() {\n    return this.creator == null\n  }\n\n  get value(): Promise<T> {\n    if (this.creator == null) {\n      return this._value!!\n    }\n\n    const result = this.creator()\n    this.value = result\n    return result\n  }\n\n  set value(value: Promise<T>) {\n    this._value = value\n    this.creator = null\n  }\n}"],"sourceRoot":""}
'use strict';
module.exports = function (obj) {
	var ret = {};
	var keys = Object.keys(Object(obj));

	for (var i = 0; i < keys.length; i++) {
		ret[keys[i].toLowerCase()] = obj[keys[i]];
	}

	return ret;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Lowercase the keys of an object",
  "devDependencies": {
    "ava": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/lowercase-keys#readme",
  "license": "MIT",
  "name": "lowercase-keys",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/lowercase-keys.git"
  },
  "version": "1.0.1"
}'use strict';
module.exports = function (obj, cb) {
	var ret = {};
	var keys = Object.keys(obj);

	for (var i = 0; i < keys.length; i++) {
		var key = keys[i];
		var res = cb(key, obj[key], obj);
		ret[res[0]] = res[1];
	}

	return ret;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Map object keys and values into a new object",
  "devDependencies": {
    "ava": "0.0.4"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/map-obj#readme",
  "license": "MIT",
  "name": "map-obj",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/map-obj.git"
  },
  "version": "1.0.1"
}The MIT License (MIT)

Copyright (c) 2010 Benjamin Thomas, Robert Kieffer

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'use strict';

/**
 * @param typeMap [Object] Map of MIME type -> Array[extensions]
 * @param ...
 */
function Mime() {
  this._types = Object.create(null);
  this._extensions = Object.create(null);

  for (var i = 0; i < arguments.length; i++) {
    this.define(arguments[i]);
  }

  this.define = this.define.bind(this);
  this.getType = this.getType.bind(this);
  this.getExtension = this.getExtension.bind(this);
}

/**
 * Define mimetype -> extension mappings.  Each key is a mime-type that maps
 * to an array of extensions associated with the type.  The first extension is
 * used as the default extension for the type.
 *
 * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']});
 *
 * If a type declares an extension that has already been defined, an error will
 * be thrown.  To suppress this error and force the extension to be associated
 * with the new type, pass `force`=true.  Alternatively, you may prefix the
 * extension with "*" to map the type to extension, without mapping the
 * extension to the type.
 *
 * e.g. mime.define({'audio/wav', ['wav']}, {'audio/x-wav', ['*wav']});
 *
 *
 * @param map (Object) type definitions
 * @param force (Boolean) if true, force overriding of existing definitions
 */
Mime.prototype.define = function(typeMap, force) {
  for (var type in typeMap) {
    var extensions = typeMap[type].map(function(t) {return t.toLowerCase()});
    type = type.toLowerCase();

    for (var i = 0; i < extensions.length; i++) {
      var ext = extensions[i];

      // '*' prefix = not the preferred type for this extension.  So fixup the
      // extension, and skip it.
      if (ext[0] == '*') {
        continue;
      }

      if (!force && (ext in this._types)) {
        throw new Error(
          'Attempt to change mapping for "' + ext +
          '" extension from "' + this._types[ext] + '" to "' + type +
          '". Pass `force=true` to allow this, otherwise remove "' + ext +
          '" from the list of extensions for "' + type + '".'
        );
      }

      this._types[ext] = type;
    }

    // Use first extension as default
    if (force || !this._extensions[type]) {
      var ext = extensions[0];
      this._extensions[type] = (ext[0] != '*') ? ext : ext.substr(1)
    }
  }
};

/**
 * Lookup a mime type based on extension
 */
Mime.prototype.getType = function(path) {
  path = String(path);
  var last = path.replace(/^.*[/\\]/, '').toLowerCase();
  var ext = last.replace(/^.*\./, '').toLowerCase();

  var hasPath = last.length < path.length;
  var hasDot = ext.length < last.length - 1;

  return (hasDot || !hasPath) && this._types[ext] || null;
};

/**
 * Return file extension associated with a mime type
 */
Mime.prototype.getExtension = function(type) {
  type = /^\s*([^;\s]*)/.test(type) && RegExp.$1;
  return type && this._extensions[type.toLowerCase()] || null;
};

module.exports = Mime;
#!/usr/bin/env node

'use strict';

var mime = require('.');
var file = process.argv[2];
var type = mime.getType(file);

process.stdout.write(type + '\n');

'use strict';

var Mime = require('./Mime');
module.exports = new Mime(require('./types/standard'), require('./types/other'));
'use strict';

var Mime = require('./Mime');
module.exports = new Mime(require('./types/standard'));
{
  "author": {
    "name": "Robert Kieffer",
    "email": "robert@broofa.com",
    "url": "http://github.com/broofa"
  },
  "bin": {
    "mime": "cli.js"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "A comprehensive library for mime-type mapping",
  "devDependencies": {
    "benchmark": "*",
    "chalk": "*",
    "eslint": "*",
    "mime-db": "1.44.0",
    "mime-score": "1.2.0",
    "mime-types": "2.1.27",
    "mocha": "7.1.2",
    "runmd": "*",
    "standard-version": "7.1.0"
  },
  "engines": {
    "node": ">=4.0.0"
  },
  "files": [
    "index.js",
    "lite.js",
    "Mime.js",
    "cli.js",
    "/types"
  ],
  "homepage": "https://github.com/broofa/mime#readme",
  "license": "MIT",
  "name": "mime",
  "repository": {
    "url": "git+https://github.com/broofa/mime.git",
    "type": "git"
  },
  "version": "2.4.6"
}module.exports = {"application/prs.cww":["cww"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["keynote"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["*iso"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]};module.exports = {"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma","es"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/mrb-consumer+xml":["*xdf"],"application/mrb-publish+xml":["*xdf"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["*xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/ttml+xml":["ttml"],"application/urc-ressheet+xml":["rsheet"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-error+xml":["xer"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/adpcm":["adp"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/stl":["stl"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]};1.44.0 / 2020-04-22
===================

  * Add charsets from IANA
  * Add extension `.cjs` to `application/node`
  * Add new upstream MIME types

1.43.0 / 2020-01-05
===================

  * Add `application/x-keepass2` with extension `.kdbx`
  * Add extension `.mxmf` to `audio/mobile-xmf`
  * Add extensions from IANA for `application/*+xml` types
  * Add new upstream MIME types

1.42.0 / 2019-09-25
===================

  * Add `image/vnd.ms-dds` with extension `.dds`
  * Add new upstream MIME types
  * Remove compressible from `multipart/mixed`

1.41.0 / 2019-08-30
===================

  * Add new upstream MIME types
  * Add `application/toml` with extension `.toml`
  * Mark `font/ttf` as compressible

1.40.0 / 2019-04-20
===================

  * Add extensions from IANA for `model/*` types
  * Add `text/mdx` with extension `.mdx`

1.39.0 / 2019-04-04
===================

  * Add extensions `.siv` and `.sieve` to `application/sieve`
  * Add new upstream MIME types

1.38.0 / 2019-02-04
===================

  * Add extension `.nq` to `application/n-quads`
  * Add extension `.nt` to `application/n-triples`
  * Add new upstream MIME types
  * Mark `text/less` as compressible

1.37.0 / 2018-10-19
===================

  * Add extensions to HEIC image types
  * Add new upstream MIME types

1.36.0 / 2018-08-20
===================

  * Add Apple file extensions from IANA
  * Add extensions from IANA for `image/*` types
  * Add new upstream MIME types

1.35.0 / 2018-07-15
===================

  * Add extension `.owl` to `application/rdf+xml`
  * Add new upstream MIME types
    - Removes extension `.woff` from `application/font-woff`

1.34.0 / 2018-06-03
===================

  * Add extension `.csl` to `application/vnd.citationstyles.style+xml`
  * Add extension `.es` to `application/ecmascript`
  * Add new upstream MIME types
  * Add `UTF-8` as default charset for `text/turtle`
  * Mark all XML-derived types as compressible

1.33.0 / 2018-02-15
===================

  * Add extensions from IANA for `message/*` types
  * Add new upstream MIME types
  * Fix some incorrect OOXML types
  * Remove `application/font-woff2`

1.32.0 / 2017-11-29
===================

  * Add new upstream MIME types
  * Update `text/hjson` to registered `application/hjson`
  * Add `text/shex` with extension `.shex`

1.31.0 / 2017-10-25
===================

  * Add `application/raml+yaml` with extension `.raml`
  * Add `application/wasm` with extension `.wasm`
  * Add new `font` type from IANA
  * Add new upstream font extensions
  * Add new upstream MIME types
  * Add extensions for JPEG-2000 images

1.30.0 / 2017-08-27
===================

  * Add `application/vnd.ms-outlook`
  * Add `application/x-arj`
  * Add extension `.mjs` to `application/javascript`
  * Add glTF types and extensions
  * Add new upstream MIME types
  * Add `text/x-org`
  * Add VirtualBox MIME types
  * Fix `source` records for `video/*` types that are IANA
  * Update `font/opentype` to registered `font/otf`

1.29.0 / 2017-07-10
===================

  * Add `application/fido.trusted-apps+json`
  * Add extension `.wadl` to `application/vnd.sun.wadl+xml`
  * Add new upstream MIME types
  * Add `UTF-8` as default charset for `text/css`

1.28.0 / 2017-05-14
===================

  * Add new upstream MIME types
  * Add extension `.gz` to `application/gzip`
  * Update extensions `.md` and `.markdown` to be `text/markdown`

1.27.0 / 2017-03-16
===================

  * Add new upstream MIME types
  * Add `image/apng` with extension `.apng`

1.26.0 / 2017-01-14
===================

  * Add new upstream MIME types
  * Add extension `.geojson` to `application/geo+json`

1.25.0 / 2016-11-11
===================

  * Add new upstream MIME types

1.24.0 / 2016-09-18
===================

  * Add `audio/mp3`
  * Add new upstream MIME types

1.23.0 / 2016-05-01
===================

  * Add new upstream MIME types
  * Add extension `.3gpp` to `audio/3gpp`

1.22.0 / 2016-02-15
===================

  * Add `text/slim`
  * Add extension `.rng` to `application/xml`
  * Add new upstream MIME types
  * Fix extension of `application/dash+xml` to be `.mpd`
  * Update primary extension to `.m4a` for `audio/mp4`

1.21.0 / 2016-01-06
===================

  * Add Google document types
  * Add new upstream MIME types

1.20.0 / 2015-11-10
===================

  * Add `text/x-suse-ymp`
  * Add new upstream MIME types

1.19.0 / 2015-09-17
===================

  * Add `application/vnd.apple.pkpass`
  * Add new upstream MIME types

1.18.0 / 2015-09-03
===================

  * Add new upstream MIME types

1.17.0 / 2015-08-13
===================

  * Add `application/x-msdos-program`
  * Add `audio/g711-0`
  * Add `image/vnd.mozilla.apng`
  * Add extension `.exe` to `application/x-msdos-program`

1.16.0 / 2015-07-29
===================

  * Add `application/vnd.uri-map`

1.15.0 / 2015-07-13
===================

  * Add `application/x-httpd-php`

1.14.0 / 2015-06-25
===================

  * Add `application/scim+json`
  * Add `application/vnd.3gpp.ussd+xml`
  * Add `application/vnd.biopax.rdf+xml`
  * Add `text/x-processing`

1.13.0 / 2015-06-07
===================

  * Add nginx as a source
  * Add `application/x-cocoa`
  * Add `application/x-java-archive-diff`
  * Add `application/x-makeself`
  * Add `application/x-perl`
  * Add `application/x-pilot`
  * Add `application/x-redhat-package-manager`
  * Add `application/x-sea`
  * Add `audio/x-m4a`
  * Add `audio/x-realaudio`
  * Add `image/x-jng`
  * Add `text/mathml`

1.12.0 / 2015-06-05
===================

  * Add `application/bdoc`
  * Add `application/vnd.hyperdrive+json`
  * Add `application/x-bdoc`
  * Add extension `.rtf` to `text/rtf`

1.11.0 / 2015-05-31
===================

  * Add `audio/wav`
  * Add `audio/wave`
  * Add extension `.litcoffee` to `text/coffeescript`
  * Add extension `.sfd-hdstx` to `application/vnd.hydrostatix.sof-data`
  * Add extension `.n-gage` to `application/vnd.nokia.n-gage.symbian.install`

1.10.0 / 2015-05-19
===================

  * Add `application/vnd.balsamiq.bmpr`
  * Add `application/vnd.microsoft.portable-executable`
  * Add `application/x-ns-proxy-autoconfig`

1.9.1 / 2015-04-19
==================

  * Remove `.json` extension from `application/manifest+json`
    - This is causing bugs downstream

1.9.0 / 2015-04-19
==================

  * Add `application/manifest+json`
  * Add `application/vnd.micro+json`
  * Add `image/vnd.zbrush.pcx`
  * Add `image/x-ms-bmp`

1.8.0 / 2015-03-13
==================

  * Add `application/vnd.citationstyles.style+xml`
  * Add `application/vnd.fastcopy-disk-image`
  * Add `application/vnd.gov.sk.xmldatacontainer+xml`
  * Add extension `.jsonld` to `application/ld+json`

1.7.0 / 2015-02-08
==================

  * Add `application/vnd.gerber`
  * Add `application/vnd.msa-disk-image`

1.6.1 / 2015-02-05
==================

  * Community extensions ownership transferred from `node-mime`

1.6.0 / 2015-01-29
==================

  * Add `application/jose`
  * Add `application/jose+json`
  * Add `application/json-seq`
  * Add `application/jwk+json`
  * Add `application/jwk-set+json`
  * Add `application/jwt`
  * Add `application/rdap+json`
  * Add `application/vnd.gov.sk.e-form+xml`
  * Add `application/vnd.ims.imsccv1p3`

1.5.0 / 2014-12-30
==================

  * Add `application/vnd.oracle.resource+json`
  * Fix various invalid MIME type entries
    - `application/mbox+xml`
    - `application/oscp-response`
    - `application/vwg-multiplexed`
    - `audio/g721`

1.4.0 / 2014-12-21
==================

  * Add `application/vnd.ims.imsccv1p2`
  * Fix various invalid MIME type entries
    - `application/vnd-acucobol`
    - `application/vnd-curl`
    - `application/vnd-dart`
    - `application/vnd-dxr`
    - `application/vnd-fdf`
    - `application/vnd-mif`
    - `application/vnd-sema`
    - `application/vnd-wap-wmlc`
    - `application/vnd.adobe.flash-movie`
    - `application/vnd.dece-zip`
    - `application/vnd.dvb_service`
    - `application/vnd.micrografx-igx`
    - `application/vnd.sealed-doc`
    - `application/vnd.sealed-eml`
    - `application/vnd.sealed-mht`
    - `application/vnd.sealed-ppt`
    - `application/vnd.sealed-tiff`
    - `application/vnd.sealed-xls`
    - `application/vnd.sealedmedia.softseal-html`
    - `application/vnd.sealedmedia.softseal-pdf`
    - `application/vnd.wap-slc`
    - `application/vnd.wap-wbxml`
    - `audio/vnd.sealedmedia.softseal-mpeg`
    - `image/vnd-djvu`
    - `image/vnd-svf`
    - `image/vnd-wap-wbmp`
    - `image/vnd.sealed-png`
    - `image/vnd.sealedmedia.softseal-gif`
    - `image/vnd.sealedmedia.softseal-jpg`
    - `model/vnd-dwf`
    - `model/vnd.parasolid.transmit-binary`
    - `model/vnd.parasolid.transmit-text`
    - `text/vnd-a`
    - `text/vnd-curl`
    - `text/vnd.wap-wml`
  * Remove example template MIME types
    - `application/example`
    - `audio/example`
    - `image/example`
    - `message/example`
    - `model/example`
    - `multipart/example`
    - `text/example`
    - `video/example`

1.3.1 / 2014-12-16
==================

  * Fix missing extensions
    - `application/json5`
    - `text/hjson`

1.3.0 / 2014-12-07
==================

  * Add `application/a2l`
  * Add `application/aml`
  * Add `application/atfx`
  * Add `application/atxml`
  * Add `application/cdfx+xml`
  * Add `application/dii`
  * Add `application/json5`
  * Add `application/lxf`
  * Add `application/mf4`
  * Add `application/vnd.apache.thrift.compact`
  * Add `application/vnd.apache.thrift.json`
  * Add `application/vnd.coffeescript`
  * Add `application/vnd.enphase.envoy`
  * Add `application/vnd.ims.imsccv1p1`
  * Add `text/csv-schema`
  * Add `text/hjson`
  * Add `text/markdown`
  * Add `text/yaml`

1.2.0 / 2014-11-09
==================

  * Add `application/cea`
  * Add `application/dit`
  * Add `application/vnd.gov.sk.e-form+zip`
  * Add `application/vnd.tmd.mediaflex.api+xml`
  * Type `application/epub+zip` is now IANA-registered

1.1.2 / 2014-10-23
==================

  * Rebuild database for `application/x-www-form-urlencoded` change

1.1.1 / 2014-10-20
==================

  * Mark `application/x-www-form-urlencoded` as compressible.

1.1.0 / 2014-09-28
==================

  * Add `application/font-woff2`

1.0.3 / 2014-09-25
==================

  * Fix engine requirement in package

1.0.2 / 2014-09-25
==================

  * Add `application/coap-group+json`
  * Add `application/dcd`
  * Add `application/vnd.apache.thrift.binary`
  * Add `image/vnd.tencent.tap`
  * Mark all JSON-derived types as compressible
  * Update `text/vtt` data

1.0.1 / 2014-08-30
==================

  * Fix extension ordering

1.0.0 / 2014-08-30
==================

  * Add `application/atf`
  * Add `application/merge-patch+json`
  * Add `multipart/x-mixed-replace`
  * Add `source: 'apache'` metadata
  * Add `source: 'iana'` metadata
  * Remove badly-assumed charset data

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong me@jongleberry.com

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "application/1d-interleaved-parityfec": {
    "source": "iana"
  },
  "application/3gpdash-qoe-report+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/3gpp-ims+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/a2l": {
    "source": "iana"
  },
  "application/activemessage": {
    "source": "iana"
  },
  "application/activity+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-costmap+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-costmapfilter+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-directory+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-endpointcost+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-endpointcostparams+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-endpointprop+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-endpointpropparams+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-error+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-networkmap+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-networkmapfilter+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-updatestreamcontrol+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-updatestreamparams+json": {
    "source": "iana",
    "compressible": true
  },
  "application/aml": {
    "source": "iana"
  },
  "application/andrew-inset": {
    "source": "iana",
    "extensions": ["ez"]
  },
  "application/applefile": {
    "source": "iana"
  },
  "application/applixware": {
    "source": "apache",
    "extensions": ["aw"]
  },
  "application/atf": {
    "source": "iana"
  },
  "application/atfx": {
    "source": "iana"
  },
  "application/atom+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["atom"]
  },
  "application/atomcat+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["atomcat"]
  },
  "application/atomdeleted+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["atomdeleted"]
  },
  "application/atomicmail": {
    "source": "iana"
  },
  "application/atomsvc+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["atomsvc"]
  },
  "application/atsc-dwd+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dwd"]
  },
  "application/atsc-dynamic-event-message": {
    "source": "iana"
  },
  "application/atsc-held+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["held"]
  },
  "application/atsc-rdt+json": {
    "source": "iana",
    "compressible": true
  },
  "application/atsc-rsat+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rsat"]
  },
  "application/atxml": {
    "source": "iana"
  },
  "application/auth-policy+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/bacnet-xdd+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/batch-smtp": {
    "source": "iana"
  },
  "application/bdoc": {
    "compressible": false,
    "extensions": ["bdoc"]
  },
  "application/beep+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/calendar+json": {
    "source": "iana",
    "compressible": true
  },
  "application/calendar+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xcs"]
  },
  "application/call-completion": {
    "source": "iana"
  },
  "application/cals-1840": {
    "source": "iana"
  },
  "application/cap+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/cbor": {
    "source": "iana"
  },
  "application/cbor-seq": {
    "source": "iana"
  },
  "application/cccex": {
    "source": "iana"
  },
  "application/ccmp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/ccxml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ccxml"]
  },
  "application/cdfx+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["cdfx"]
  },
  "application/cdmi-capability": {
    "source": "iana",
    "extensions": ["cdmia"]
  },
  "application/cdmi-container": {
    "source": "iana",
    "extensions": ["cdmic"]
  },
  "application/cdmi-domain": {
    "source": "iana",
    "extensions": ["cdmid"]
  },
  "application/cdmi-object": {
    "source": "iana",
    "extensions": ["cdmio"]
  },
  "application/cdmi-queue": {
    "source": "iana",
    "extensions": ["cdmiq"]
  },
  "application/cdni": {
    "source": "iana"
  },
  "application/cea": {
    "source": "iana"
  },
  "application/cea-2018+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cellml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cfw": {
    "source": "iana"
  },
  "application/clue+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/clue_info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cms": {
    "source": "iana"
  },
  "application/cnrp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/coap-group+json": {
    "source": "iana",
    "compressible": true
  },
  "application/coap-payload": {
    "source": "iana"
  },
  "application/commonground": {
    "source": "iana"
  },
  "application/conference-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cose": {
    "source": "iana"
  },
  "application/cose-key": {
    "source": "iana"
  },
  "application/cose-key-set": {
    "source": "iana"
  },
  "application/cpl+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/csrattrs": {
    "source": "iana"
  },
  "application/csta+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cstadata+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/csvm+json": {
    "source": "iana",
    "compressible": true
  },
  "application/cu-seeme": {
    "source": "apache",
    "extensions": ["cu"]
  },
  "application/cwt": {
    "source": "iana"
  },
  "application/cybercash": {
    "source": "iana"
  },
  "application/dart": {
    "compressible": true
  },
  "application/dash+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mpd"]
  },
  "application/dashdelta": {
    "source": "iana"
  },
  "application/davmount+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["davmount"]
  },
  "application/dca-rft": {
    "source": "iana"
  },
  "application/dcd": {
    "source": "iana"
  },
  "application/dec-dx": {
    "source": "iana"
  },
  "application/dialog-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/dicom": {
    "source": "iana"
  },
  "application/dicom+json": {
    "source": "iana",
    "compressible": true
  },
  "application/dicom+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/dii": {
    "source": "iana"
  },
  "application/dit": {
    "source": "iana"
  },
  "application/dns": {
    "source": "iana"
  },
  "application/dns+json": {
    "source": "iana",
    "compressible": true
  },
  "application/dns-message": {
    "source": "iana"
  },
  "application/docbook+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["dbk"]
  },
  "application/dots+cbor": {
    "source": "iana"
  },
  "application/dskpp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/dssc+der": {
    "source": "iana",
    "extensions": ["dssc"]
  },
  "application/dssc+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xdssc"]
  },
  "application/dvcs": {
    "source": "iana"
  },
  "application/ecmascript": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ecma","es"]
  },
  "application/edi-consent": {
    "source": "iana"
  },
  "application/edi-x12": {
    "source": "iana",
    "compressible": false
  },
  "application/edifact": {
    "source": "iana",
    "compressible": false
  },
  "application/efi": {
    "source": "iana"
  },
  "application/emergencycalldata.comment+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.control+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.deviceinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.ecall.msd": {
    "source": "iana"
  },
  "application/emergencycalldata.providerinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.serviceinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.subscriberinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.veds+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emma+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["emma"]
  },
  "application/emotionml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["emotionml"]
  },
  "application/encaprtp": {
    "source": "iana"
  },
  "application/epp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/epub+zip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["epub"]
  },
  "application/eshop": {
    "source": "iana"
  },
  "application/exi": {
    "source": "iana",
    "extensions": ["exi"]
  },
  "application/expect-ct-report+json": {
    "source": "iana",
    "compressible": true
  },
  "application/fastinfoset": {
    "source": "iana"
  },
  "application/fastsoap": {
    "source": "iana"
  },
  "application/fdt+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["fdt"]
  },
  "application/fhir+json": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/fhir+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/fido.trusted-apps+json": {
    "compressible": true
  },
  "application/fits": {
    "source": "iana"
  },
  "application/flexfec": {
    "source": "iana"
  },
  "application/font-sfnt": {
    "source": "iana"
  },
  "application/font-tdpfr": {
    "source": "iana",
    "extensions": ["pfr"]
  },
  "application/font-woff": {
    "source": "iana",
    "compressible": false
  },
  "application/framework-attributes+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/geo+json": {
    "source": "iana",
    "compressible": true,
    "extensions": ["geojson"]
  },
  "application/geo+json-seq": {
    "source": "iana"
  },
  "application/geopackage+sqlite3": {
    "source": "iana"
  },
  "application/geoxacml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/gltf-buffer": {
    "source": "iana"
  },
  "application/gml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["gml"]
  },
  "application/gpx+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["gpx"]
  },
  "application/gxf": {
    "source": "apache",
    "extensions": ["gxf"]
  },
  "application/gzip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["gz"]
  },
  "application/h224": {
    "source": "iana"
  },
  "application/held+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/hjson": {
    "extensions": ["hjson"]
  },
  "application/http": {
    "source": "iana"
  },
  "application/hyperstudio": {
    "source": "iana",
    "extensions": ["stk"]
  },
  "application/ibe-key-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/ibe-pkg-reply+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/ibe-pp-data": {
    "source": "iana"
  },
  "application/iges": {
    "source": "iana"
  },
  "application/im-iscomposing+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/index": {
    "source": "iana"
  },
  "application/index.cmd": {
    "source": "iana"
  },
  "application/index.obj": {
    "source": "iana"
  },
  "application/index.response": {
    "source": "iana"
  },
  "application/index.vnd": {
    "source": "iana"
  },
  "application/inkml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ink","inkml"]
  },
  "application/iotp": {
    "source": "iana"
  },
  "application/ipfix": {
    "source": "iana",
    "extensions": ["ipfix"]
  },
  "application/ipp": {
    "source": "iana"
  },
  "application/isup": {
    "source": "iana"
  },
  "application/its+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["its"]
  },
  "application/java-archive": {
    "source": "apache",
    "compressible": false,
    "extensions": ["jar","war","ear"]
  },
  "application/java-serialized-object": {
    "source": "apache",
    "compressible": false,
    "extensions": ["ser"]
  },
  "application/java-vm": {
    "source": "apache",
    "compressible": false,
    "extensions": ["class"]
  },
  "application/javascript": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["js","mjs"]
  },
  "application/jf2feed+json": {
    "source": "iana",
    "compressible": true
  },
  "application/jose": {
    "source": "iana"
  },
  "application/jose+json": {
    "source": "iana",
    "compressible": true
  },
  "application/jrd+json": {
    "source": "iana",
    "compressible": true
  },
  "application/json": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["json","map"]
  },
  "application/json-patch+json": {
    "source": "iana",
    "compressible": true
  },
  "application/json-seq": {
    "source": "iana"
  },
  "application/json5": {
    "extensions": ["json5"]
  },
  "application/jsonml+json": {
    "source": "apache",
    "compressible": true,
    "extensions": ["jsonml"]
  },
  "application/jwk+json": {
    "source": "iana",
    "compressible": true
  },
  "application/jwk-set+json": {
    "source": "iana",
    "compressible": true
  },
  "application/jwt": {
    "source": "iana"
  },
  "application/kpml-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/kpml-response+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/ld+json": {
    "source": "iana",
    "compressible": true,
    "extensions": ["jsonld"]
  },
  "application/lgr+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["lgr"]
  },
  "application/link-format": {
    "source": "iana"
  },
  "application/load-control+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/lost+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["lostxml"]
  },
  "application/lostsync+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/lpf+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/lxf": {
    "source": "iana"
  },
  "application/mac-binhex40": {
    "source": "iana",
    "extensions": ["hqx"]
  },
  "application/mac-compactpro": {
    "source": "apache",
    "extensions": ["cpt"]
  },
  "application/macwriteii": {
    "source": "iana"
  },
  "application/mads+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mads"]
  },
  "application/manifest+json": {
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["webmanifest"]
  },
  "application/marc": {
    "source": "iana",
    "extensions": ["mrc"]
  },
  "application/marcxml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mrcx"]
  },
  "application/mathematica": {
    "source": "iana",
    "extensions": ["ma","nb","mb"]
  },
  "application/mathml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mathml"]
  },
  "application/mathml-content+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mathml-presentation+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-associated-procedure-description+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-deregister+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-envelope+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-msk+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-msk-response+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-protection-description+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-reception-report+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-register+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-register-response+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-schedule+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-user-service-description+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbox": {
    "source": "iana",
    "extensions": ["mbox"]
  },
  "application/media-policy-dataset+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/media_control+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mediaservercontrol+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mscml"]
  },
  "application/merge-patch+json": {
    "source": "iana",
    "compressible": true
  },
  "application/metalink+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["metalink"]
  },
  "application/metalink4+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["meta4"]
  },
  "application/mets+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mets"]
  },
  "application/mf4": {
    "source": "iana"
  },
  "application/mikey": {
    "source": "iana"
  },
  "application/mipc": {
    "source": "iana"
  },
  "application/mmt-aei+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["maei"]
  },
  "application/mmt-usd+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["musd"]
  },
  "application/mods+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mods"]
  },
  "application/moss-keys": {
    "source": "iana"
  },
  "application/moss-signature": {
    "source": "iana"
  },
  "application/mosskey-data": {
    "source": "iana"
  },
  "application/mosskey-request": {
    "source": "iana"
  },
  "application/mp21": {
    "source": "iana",
    "extensions": ["m21","mp21"]
  },
  "application/mp4": {
    "source": "iana",
    "extensions": ["mp4s","m4p"]
  },
  "application/mpeg4-generic": {
    "source": "iana"
  },
  "application/mpeg4-iod": {
    "source": "iana"
  },
  "application/mpeg4-iod-xmt": {
    "source": "iana"
  },
  "application/mrb-consumer+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xdf"]
  },
  "application/mrb-publish+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xdf"]
  },
  "application/msc-ivr+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/msc-mixer+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/msword": {
    "source": "iana",
    "compressible": false,
    "extensions": ["doc","dot"]
  },
  "application/mud+json": {
    "source": "iana",
    "compressible": true
  },
  "application/multipart-core": {
    "source": "iana"
  },
  "application/mxf": {
    "source": "iana",
    "extensions": ["mxf"]
  },
  "application/n-quads": {
    "source": "iana",
    "extensions": ["nq"]
  },
  "application/n-triples": {
    "source": "iana",
    "extensions": ["nt"]
  },
  "application/nasdata": {
    "source": "iana"
  },
  "application/news-checkgroups": {
    "source": "iana",
    "charset": "US-ASCII"
  },
  "application/news-groupinfo": {
    "source": "iana",
    "charset": "US-ASCII"
  },
  "application/news-transmission": {
    "source": "iana"
  },
  "application/nlsml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/node": {
    "source": "iana",
    "extensions": ["cjs"]
  },
  "application/nss": {
    "source": "iana"
  },
  "application/ocsp-request": {
    "source": "iana"
  },
  "application/ocsp-response": {
    "source": "iana"
  },
  "application/octet-stream": {
    "source": "iana",
    "compressible": false,
    "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]
  },
  "application/oda": {
    "source": "iana",
    "extensions": ["oda"]
  },
  "application/odm+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/odx": {
    "source": "iana"
  },
  "application/oebps-package+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["opf"]
  },
  "application/ogg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["ogx"]
  },
  "application/omdoc+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["omdoc"]
  },
  "application/onenote": {
    "source": "apache",
    "extensions": ["onetoc","onetoc2","onetmp","onepkg"]
  },
  "application/oscore": {
    "source": "iana"
  },
  "application/oxps": {
    "source": "iana",
    "extensions": ["oxps"]
  },
  "application/p2p-overlay+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["relo"]
  },
  "application/parityfec": {
    "source": "iana"
  },
  "application/passport": {
    "source": "iana"
  },
  "application/patch-ops-error+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xer"]
  },
  "application/pdf": {
    "source": "iana",
    "compressible": false,
    "extensions": ["pdf"]
  },
  "application/pdx": {
    "source": "iana"
  },
  "application/pem-certificate-chain": {
    "source": "iana"
  },
  "application/pgp-encrypted": {
    "source": "iana",
    "compressible": false,
    "extensions": ["pgp"]
  },
  "application/pgp-keys": {
    "source": "iana"
  },
  "application/pgp-signature": {
    "source": "iana",
    "extensions": ["asc","sig"]
  },
  "application/pics-rules": {
    "source": "apache",
    "extensions": ["prf"]
  },
  "application/pidf+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/pidf-diff+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/pkcs10": {
    "source": "iana",
    "extensions": ["p10"]
  },
  "application/pkcs12": {
    "source": "iana"
  },
  "application/pkcs7-mime": {
    "source": "iana",
    "extensions": ["p7m","p7c"]
  },
  "application/pkcs7-signature": {
    "source": "iana",
    "extensions": ["p7s"]
  },
  "application/pkcs8": {
    "source": "iana",
    "extensions": ["p8"]
  },
  "application/pkcs8-encrypted": {
    "source": "iana"
  },
  "application/pkix-attr-cert": {
    "source": "iana",
    "extensions": ["ac"]
  },
  "application/pkix-cert": {
    "source": "iana",
    "extensions": ["cer"]
  },
  "application/pkix-crl": {
    "source": "iana",
    "extensions": ["crl"]
  },
  "application/pkix-pkipath": {
    "source": "iana",
    "extensions": ["pkipath"]
  },
  "application/pkixcmp": {
    "source": "iana",
    "extensions": ["pki"]
  },
  "application/pls+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["pls"]
  },
  "application/poc-settings+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/postscript": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ai","eps","ps"]
  },
  "application/ppsp-tracker+json": {
    "source": "iana",
    "compressible": true
  },
  "application/problem+json": {
    "source": "iana",
    "compressible": true
  },
  "application/problem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/provenance+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["provx"]
  },
  "application/prs.alvestrand.titrax-sheet": {
    "source": "iana"
  },
  "application/prs.cww": {
    "source": "iana",
    "extensions": ["cww"]
  },
  "application/prs.hpub+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/prs.nprend": {
    "source": "iana"
  },
  "application/prs.plucker": {
    "source": "iana"
  },
  "application/prs.rdf-xml-crypt": {
    "source": "iana"
  },
  "application/prs.xsf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/pskc+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["pskcxml"]
  },
  "application/pvd+json": {
    "source": "iana",
    "compressible": true
  },
  "application/qsig": {
    "source": "iana"
  },
  "application/raml+yaml": {
    "compressible": true,
    "extensions": ["raml"]
  },
  "application/raptorfec": {
    "source": "iana"
  },
  "application/rdap+json": {
    "source": "iana",
    "compressible": true
  },
  "application/rdf+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rdf","owl"]
  },
  "application/reginfo+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rif"]
  },
  "application/relax-ng-compact-syntax": {
    "source": "iana",
    "extensions": ["rnc"]
  },
  "application/remote-printing": {
    "source": "iana"
  },
  "application/reputon+json": {
    "source": "iana",
    "compressible": true
  },
  "application/resource-lists+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rl"]
  },
  "application/resource-lists-diff+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rld"]
  },
  "application/rfc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/riscos": {
    "source": "iana"
  },
  "application/rlmi+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/rls-services+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rs"]
  },
  "application/route-apd+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rapd"]
  },
  "application/route-s-tsid+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sls"]
  },
  "application/route-usd+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rusd"]
  },
  "application/rpki-ghostbusters": {
    "source": "iana",
    "extensions": ["gbr"]
  },
  "application/rpki-manifest": {
    "source": "iana",
    "extensions": ["mft"]
  },
  "application/rpki-publication": {
    "source": "iana"
  },
  "application/rpki-roa": {
    "source": "iana",
    "extensions": ["roa"]
  },
  "application/rpki-updown": {
    "source": "iana"
  },
  "application/rsd+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["rsd"]
  },
  "application/rss+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["rss"]
  },
  "application/rtf": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rtf"]
  },
  "application/rtploopback": {
    "source": "iana"
  },
  "application/rtx": {
    "source": "iana"
  },
  "application/samlassertion+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/samlmetadata+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/sbe": {
    "source": "iana"
  },
  "application/sbml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sbml"]
  },
  "application/scaip+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/scim+json": {
    "source": "iana",
    "compressible": true
  },
  "application/scvp-cv-request": {
    "source": "iana",
    "extensions": ["scq"]
  },
  "application/scvp-cv-response": {
    "source": "iana",
    "extensions": ["scs"]
  },
  "application/scvp-vp-request": {
    "source": "iana",
    "extensions": ["spq"]
  },
  "application/scvp-vp-response": {
    "source": "iana",
    "extensions": ["spp"]
  },
  "application/sdp": {
    "source": "iana",
    "extensions": ["sdp"]
  },
  "application/secevent+jwt": {
    "source": "iana"
  },
  "application/senml+cbor": {
    "source": "iana"
  },
  "application/senml+json": {
    "source": "iana",
    "compressible": true
  },
  "application/senml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["senmlx"]
  },
  "application/senml-etch+cbor": {
    "source": "iana"
  },
  "application/senml-etch+json": {
    "source": "iana",
    "compressible": true
  },
  "application/senml-exi": {
    "source": "iana"
  },
  "application/sensml+cbor": {
    "source": "iana"
  },
  "application/sensml+json": {
    "source": "iana",
    "compressible": true
  },
  "application/sensml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sensmlx"]
  },
  "application/sensml-exi": {
    "source": "iana"
  },
  "application/sep+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/sep-exi": {
    "source": "iana"
  },
  "application/session-info": {
    "source": "iana"
  },
  "application/set-payment": {
    "source": "iana"
  },
  "application/set-payment-initiation": {
    "source": "iana",
    "extensions": ["setpay"]
  },
  "application/set-registration": {
    "source": "iana"
  },
  "application/set-registration-initiation": {
    "source": "iana",
    "extensions": ["setreg"]
  },
  "application/sgml": {
    "source": "iana"
  },
  "application/sgml-open-catalog": {
    "source": "iana"
  },
  "application/shf+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["shf"]
  },
  "application/sieve": {
    "source": "iana",
    "extensions": ["siv","sieve"]
  },
  "application/simple-filter+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/simple-message-summary": {
    "source": "iana"
  },
  "application/simplesymbolcontainer": {
    "source": "iana"
  },
  "application/sipc": {
    "source": "iana"
  },
  "application/slate": {
    "source": "iana"
  },
  "application/smil": {
    "source": "iana"
  },
  "application/smil+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["smi","smil"]
  },
  "application/smpte336m": {
    "source": "iana"
  },
  "application/soap+fastinfoset": {
    "source": "iana"
  },
  "application/soap+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/sparql-query": {
    "source": "iana",
    "extensions": ["rq"]
  },
  "application/sparql-results+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["srx"]
  },
  "application/spirits-event+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/sql": {
    "source": "iana"
  },
  "application/srgs": {
    "source": "iana",
    "extensions": ["gram"]
  },
  "application/srgs+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["grxml"]
  },
  "application/sru+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sru"]
  },
  "application/ssdl+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["ssdl"]
  },
  "application/ssml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ssml"]
  },
  "application/stix+json": {
    "source": "iana",
    "compressible": true
  },
  "application/swid+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["swidtag"]
  },
  "application/tamp-apex-update": {
    "source": "iana"
  },
  "application/tamp-apex-update-confirm": {
    "source": "iana"
  },
  "application/tamp-community-update": {
    "source": "iana"
  },
  "application/tamp-community-update-confirm": {
    "source": "iana"
  },
  "application/tamp-error": {
    "source": "iana"
  },
  "application/tamp-sequence-adjust": {
    "source": "iana"
  },
  "application/tamp-sequence-adjust-confirm": {
    "source": "iana"
  },
  "application/tamp-status-query": {
    "source": "iana"
  },
  "application/tamp-status-response": {
    "source": "iana"
  },
  "application/tamp-update": {
    "source": "iana"
  },
  "application/tamp-update-confirm": {
    "source": "iana"
  },
  "application/tar": {
    "compressible": true
  },
  "application/taxii+json": {
    "source": "iana",
    "compressible": true
  },
  "application/td+json": {
    "source": "iana",
    "compressible": true
  },
  "application/tei+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["tei","teicorpus"]
  },
  "application/tetra_isi": {
    "source": "iana"
  },
  "application/thraud+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["tfi"]
  },
  "application/timestamp-query": {
    "source": "iana"
  },
  "application/timestamp-reply": {
    "source": "iana"
  },
  "application/timestamped-data": {
    "source": "iana",
    "extensions": ["tsd"]
  },
  "application/tlsrpt+gzip": {
    "source": "iana"
  },
  "application/tlsrpt+json": {
    "source": "iana",
    "compressible": true
  },
  "application/tnauthlist": {
    "source": "iana"
  },
  "application/toml": {
    "compressible": true,
    "extensions": ["toml"]
  },
  "application/trickle-ice-sdpfrag": {
    "source": "iana"
  },
  "application/trig": {
    "source": "iana"
  },
  "application/ttml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ttml"]
  },
  "application/tve-trigger": {
    "source": "iana"
  },
  "application/tzif": {
    "source": "iana"
  },
  "application/tzif-leap": {
    "source": "iana"
  },
  "application/ulpfec": {
    "source": "iana"
  },
  "application/urc-grpsheet+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/urc-ressheet+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rsheet"]
  },
  "application/urc-targetdesc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/urc-uisocketdesc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vcard+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vcard+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vemmi": {
    "source": "iana"
  },
  "application/vividence.scriptfile": {
    "source": "apache"
  },
  "application/vnd.1000minds.decision-model+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["1km"]
  },
  "application/vnd.3gpp-prose+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp-prose-pc3ch+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp-v2x-local-service-information": {
    "source": "iana"
  },
  "application/vnd.3gpp.access-transfer-events+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.bsf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.gmop+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mc-signalling-ear": {
    "source": "iana"
  },
  "application/vnd.3gpp.mcdata-affiliation-command+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcdata-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcdata-payload": {
    "source": "iana"
  },
  "application/vnd.3gpp.mcdata-service-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcdata-signalling": {
    "source": "iana"
  },
  "application/vnd.3gpp.mcdata-ue-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcdata-user-profile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-affiliation-command+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-floor-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-location-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-mbms-usage-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-service-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-signed+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-ue-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-ue-init-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-user-profile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-affiliation-command+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-affiliation-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-location-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-mbms-usage-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-service-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-transmission-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-ue-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-user-profile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mid-call+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.pic-bw-large": {
    "source": "iana",
    "extensions": ["plb"]
  },
  "application/vnd.3gpp.pic-bw-small": {
    "source": "iana",
    "extensions": ["psb"]
  },
  "application/vnd.3gpp.pic-bw-var": {
    "source": "iana",
    "extensions": ["pvb"]
  },
  "application/vnd.3gpp.sms": {
    "source": "iana"
  },
  "application/vnd.3gpp.sms+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.srvcc-ext+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.srvcc-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.state-and-event-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.ussd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp2.bcmcsinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp2.sms": {
    "source": "iana"
  },
  "application/vnd.3gpp2.tcap": {
    "source": "iana",
    "extensions": ["tcap"]
  },
  "application/vnd.3lightssoftware.imagescal": {
    "source": "iana"
  },
  "application/vnd.3m.post-it-notes": {
    "source": "iana",
    "extensions": ["pwn"]
  },
  "application/vnd.accpac.simply.aso": {
    "source": "iana",
    "extensions": ["aso"]
  },
  "application/vnd.accpac.simply.imp": {
    "source": "iana",
    "extensions": ["imp"]
  },
  "application/vnd.acucobol": {
    "source": "iana",
    "extensions": ["acu"]
  },
  "application/vnd.acucorp": {
    "source": "iana",
    "extensions": ["atc","acutc"]
  },
  "application/vnd.adobe.air-application-installer-package+zip": {
    "source": "apache",
    "compressible": false,
    "extensions": ["air"]
  },
  "application/vnd.adobe.flash.movie": {
    "source": "iana"
  },
  "application/vnd.adobe.formscentral.fcdt": {
    "source": "iana",
    "extensions": ["fcdt"]
  },
  "application/vnd.adobe.fxp": {
    "source": "iana",
    "extensions": ["fxp","fxpl"]
  },
  "application/vnd.adobe.partial-upload": {
    "source": "iana"
  },
  "application/vnd.adobe.xdp+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xdp"]
  },
  "application/vnd.adobe.xfdf": {
    "source": "iana",
    "extensions": ["xfdf"]
  },
  "application/vnd.aether.imp": {
    "source": "iana"
  },
  "application/vnd.afpc.afplinedata": {
    "source": "iana"
  },
  "application/vnd.afpc.afplinedata-pagedef": {
    "source": "iana"
  },
  "application/vnd.afpc.foca-charset": {
    "source": "iana"
  },
  "application/vnd.afpc.foca-codedfont": {
    "source": "iana"
  },
  "application/vnd.afpc.foca-codepage": {
    "source": "iana"
  },
  "application/vnd.afpc.modca": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-formdef": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-mediummap": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-objectcontainer": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-overlay": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-pagesegment": {
    "source": "iana"
  },
  "application/vnd.ah-barcode": {
    "source": "iana"
  },
  "application/vnd.ahead.space": {
    "source": "iana",
    "extensions": ["ahead"]
  },
  "application/vnd.airzip.filesecure.azf": {
    "source": "iana",
    "extensions": ["azf"]
  },
  "application/vnd.airzip.filesecure.azs": {
    "source": "iana",
    "extensions": ["azs"]
  },
  "application/vnd.amadeus+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.amazon.ebook": {
    "source": "apache",
    "extensions": ["azw"]
  },
  "application/vnd.amazon.mobi8-ebook": {
    "source": "iana"
  },
  "application/vnd.americandynamics.acc": {
    "source": "iana",
    "extensions": ["acc"]
  },
  "application/vnd.amiga.ami": {
    "source": "iana",
    "extensions": ["ami"]
  },
  "application/vnd.amundsen.maze+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.android.ota": {
    "source": "iana"
  },
  "application/vnd.android.package-archive": {
    "source": "apache",
    "compressible": false,
    "extensions": ["apk"]
  },
  "application/vnd.anki": {
    "source": "iana"
  },
  "application/vnd.anser-web-certificate-issue-initiation": {
    "source": "iana",
    "extensions": ["cii"]
  },
  "application/vnd.anser-web-funds-transfer-initiation": {
    "source": "apache",
    "extensions": ["fti"]
  },
  "application/vnd.antix.game-component": {
    "source": "iana",
    "extensions": ["atx"]
  },
  "application/vnd.apache.thrift.binary": {
    "source": "iana"
  },
  "application/vnd.apache.thrift.compact": {
    "source": "iana"
  },
  "application/vnd.apache.thrift.json": {
    "source": "iana"
  },
  "application/vnd.api+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.aplextor.warrp+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.apothekende.reservation+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.apple.installer+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mpkg"]
  },
  "application/vnd.apple.keynote": {
    "source": "iana",
    "extensions": ["keynote"]
  },
  "application/vnd.apple.mpegurl": {
    "source": "iana",
    "extensions": ["m3u8"]
  },
  "application/vnd.apple.numbers": {
    "source": "iana",
    "extensions": ["numbers"]
  },
  "application/vnd.apple.pages": {
    "source": "iana",
    "extensions": ["pages"]
  },
  "application/vnd.apple.pkpass": {
    "compressible": false,
    "extensions": ["pkpass"]
  },
  "application/vnd.arastra.swi": {
    "source": "iana"
  },
  "application/vnd.aristanetworks.swi": {
    "source": "iana",
    "extensions": ["swi"]
  },
  "application/vnd.artisan+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.artsquare": {
    "source": "iana"
  },
  "application/vnd.astraea-software.iota": {
    "source": "iana",
    "extensions": ["iota"]
  },
  "application/vnd.audiograph": {
    "source": "iana",
    "extensions": ["aep"]
  },
  "application/vnd.autopackage": {
    "source": "iana"
  },
  "application/vnd.avalon+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.avistar+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.balsamiq.bmml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["bmml"]
  },
  "application/vnd.balsamiq.bmpr": {
    "source": "iana"
  },
  "application/vnd.banana-accounting": {
    "source": "iana"
  },
  "application/vnd.bbf.usp.error": {
    "source": "iana"
  },
  "application/vnd.bbf.usp.msg": {
    "source": "iana"
  },
  "application/vnd.bbf.usp.msg+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.bekitzur-stech+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.bint.med-content": {
    "source": "iana"
  },
  "application/vnd.biopax.rdf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.blink-idb-value-wrapper": {
    "source": "iana"
  },
  "application/vnd.blueice.multipass": {
    "source": "iana",
    "extensions": ["mpm"]
  },
  "application/vnd.bluetooth.ep.oob": {
    "source": "iana"
  },
  "application/vnd.bluetooth.le.oob": {
    "source": "iana"
  },
  "application/vnd.bmi": {
    "source": "iana",
    "extensions": ["bmi"]
  },
  "application/vnd.bpf": {
    "source": "iana"
  },
  "application/vnd.bpf3": {
    "source": "iana"
  },
  "application/vnd.businessobjects": {
    "source": "iana",
    "extensions": ["rep"]
  },
  "application/vnd.byu.uapi+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cab-jscript": {
    "source": "iana"
  },
  "application/vnd.canon-cpdl": {
    "source": "iana"
  },
  "application/vnd.canon-lips": {
    "source": "iana"
  },
  "application/vnd.capasystems-pg+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cendio.thinlinc.clientconf": {
    "source": "iana"
  },
  "application/vnd.century-systems.tcp_stream": {
    "source": "iana"
  },
  "application/vnd.chemdraw+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["cdxml"]
  },
  "application/vnd.chess-pgn": {
    "source": "iana"
  },
  "application/vnd.chipnuts.karaoke-mmd": {
    "source": "iana",
    "extensions": ["mmd"]
  },
  "application/vnd.ciedi": {
    "source": "iana"
  },
  "application/vnd.cinderella": {
    "source": "iana",
    "extensions": ["cdy"]
  },
  "application/vnd.cirpack.isdn-ext": {
    "source": "iana"
  },
  "application/vnd.citationstyles.style+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["csl"]
  },
  "application/vnd.claymore": {
    "source": "iana",
    "extensions": ["cla"]
  },
  "application/vnd.cloanto.rp9": {
    "source": "iana",
    "extensions": ["rp9"]
  },
  "application/vnd.clonk.c4group": {
    "source": "iana",
    "extensions": ["c4g","c4d","c4f","c4p","c4u"]
  },
  "application/vnd.cluetrust.cartomobile-config": {
    "source": "iana",
    "extensions": ["c11amc"]
  },
  "application/vnd.cluetrust.cartomobile-config-pkg": {
    "source": "iana",
    "extensions": ["c11amz"]
  },
  "application/vnd.coffeescript": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.document": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.document-template": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.presentation": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.presentation-template": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.spreadsheet": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.spreadsheet-template": {
    "source": "iana"
  },
  "application/vnd.collection+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.collection.doc+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.collection.next+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.comicbook+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.comicbook-rar": {
    "source": "iana"
  },
  "application/vnd.commerce-battelle": {
    "source": "iana"
  },
  "application/vnd.commonspace": {
    "source": "iana",
    "extensions": ["csp"]
  },
  "application/vnd.contact.cmsg": {
    "source": "iana",
    "extensions": ["cdbcmsg"]
  },
  "application/vnd.coreos.ignition+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cosmocaller": {
    "source": "iana",
    "extensions": ["cmc"]
  },
  "application/vnd.crick.clicker": {
    "source": "iana",
    "extensions": ["clkx"]
  },
  "application/vnd.crick.clicker.keyboard": {
    "source": "iana",
    "extensions": ["clkk"]
  },
  "application/vnd.crick.clicker.palette": {
    "source": "iana",
    "extensions": ["clkp"]
  },
  "application/vnd.crick.clicker.template": {
    "source": "iana",
    "extensions": ["clkt"]
  },
  "application/vnd.crick.clicker.wordbank": {
    "source": "iana",
    "extensions": ["clkw"]
  },
  "application/vnd.criticaltools.wbs+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wbs"]
  },
  "application/vnd.cryptii.pipe+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.crypto-shade-file": {
    "source": "iana"
  },
  "application/vnd.ctc-posml": {
    "source": "iana",
    "extensions": ["pml"]
  },
  "application/vnd.ctct.ws+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cups-pdf": {
    "source": "iana"
  },
  "application/vnd.cups-postscript": {
    "source": "iana"
  },
  "application/vnd.cups-ppd": {
    "source": "iana",
    "extensions": ["ppd"]
  },
  "application/vnd.cups-raster": {
    "source": "iana"
  },
  "application/vnd.cups-raw": {
    "source": "iana"
  },
  "application/vnd.curl": {
    "source": "iana"
  },
  "application/vnd.curl.car": {
    "source": "apache",
    "extensions": ["car"]
  },
  "application/vnd.curl.pcurl": {
    "source": "apache",
    "extensions": ["pcurl"]
  },
  "application/vnd.cyan.dean.root+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cybank": {
    "source": "iana"
  },
  "application/vnd.d2l.coursepackage1p0+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.dart": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dart"]
  },
  "application/vnd.data-vision.rdz": {
    "source": "iana",
    "extensions": ["rdz"]
  },
  "application/vnd.datapackage+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dataresource+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dbf": {
    "source": "iana"
  },
  "application/vnd.debian.binary-package": {
    "source": "iana"
  },
  "application/vnd.dece.data": {
    "source": "iana",
    "extensions": ["uvf","uvvf","uvd","uvvd"]
  },
  "application/vnd.dece.ttml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["uvt","uvvt"]
  },
  "application/vnd.dece.unspecified": {
    "source": "iana",
    "extensions": ["uvx","uvvx"]
  },
  "application/vnd.dece.zip": {
    "source": "iana",
    "extensions": ["uvz","uvvz"]
  },
  "application/vnd.denovo.fcselayout-link": {
    "source": "iana",
    "extensions": ["fe_launch"]
  },
  "application/vnd.desmume.movie": {
    "source": "iana"
  },
  "application/vnd.dir-bi.plate-dl-nosuffix": {
    "source": "iana"
  },
  "application/vnd.dm.delegation+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dna": {
    "source": "iana",
    "extensions": ["dna"]
  },
  "application/vnd.document+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dolby.mlp": {
    "source": "apache",
    "extensions": ["mlp"]
  },
  "application/vnd.dolby.mobile.1": {
    "source": "iana"
  },
  "application/vnd.dolby.mobile.2": {
    "source": "iana"
  },
  "application/vnd.doremir.scorecloud-binary-document": {
    "source": "iana"
  },
  "application/vnd.dpgraph": {
    "source": "iana",
    "extensions": ["dpg"]
  },
  "application/vnd.dreamfactory": {
    "source": "iana",
    "extensions": ["dfac"]
  },
  "application/vnd.drive+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ds-keypoint": {
    "source": "apache",
    "extensions": ["kpxx"]
  },
  "application/vnd.dtg.local": {
    "source": "iana"
  },
  "application/vnd.dtg.local.flash": {
    "source": "iana"
  },
  "application/vnd.dtg.local.html": {
    "source": "iana"
  },
  "application/vnd.dvb.ait": {
    "source": "iana",
    "extensions": ["ait"]
  },
  "application/vnd.dvb.dvbisl+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.dvbj": {
    "source": "iana"
  },
  "application/vnd.dvb.esgcontainer": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcdftnotifaccess": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcesgaccess": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcesgaccess2": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcesgpdd": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcroaming": {
    "source": "iana"
  },
  "application/vnd.dvb.iptv.alfec-base": {
    "source": "iana"
  },
  "application/vnd.dvb.iptv.alfec-enhancement": {
    "source": "iana"
  },
  "application/vnd.dvb.notif-aggregate-root+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-container+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-generic+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-ia-msglist+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-ia-registration-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-ia-registration-response+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-init+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.pfr": {
    "source": "iana"
  },
  "application/vnd.dvb.service": {
    "source": "iana",
    "extensions": ["svc"]
  },
  "application/vnd.dxr": {
    "source": "iana"
  },
  "application/vnd.dynageo": {
    "source": "iana",
    "extensions": ["geo"]
  },
  "application/vnd.dzr": {
    "source": "iana"
  },
  "application/vnd.easykaraoke.cdgdownload": {
    "source": "iana"
  },
  "application/vnd.ecdis-update": {
    "source": "iana"
  },
  "application/vnd.ecip.rlp": {
    "source": "iana"
  },
  "application/vnd.ecowin.chart": {
    "source": "iana",
    "extensions": ["mag"]
  },
  "application/vnd.ecowin.filerequest": {
    "source": "iana"
  },
  "application/vnd.ecowin.fileupdate": {
    "source": "iana"
  },
  "application/vnd.ecowin.series": {
    "source": "iana"
  },
  "application/vnd.ecowin.seriesrequest": {
    "source": "iana"
  },
  "application/vnd.ecowin.seriesupdate": {
    "source": "iana"
  },
  "application/vnd.efi.img": {
    "source": "iana"
  },
  "application/vnd.efi.iso": {
    "source": "iana"
  },
  "application/vnd.emclient.accessrequest+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.enliven": {
    "source": "iana",
    "extensions": ["nml"]
  },
  "application/vnd.enphase.envoy": {
    "source": "iana"
  },
  "application/vnd.eprints.data+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.epson.esf": {
    "source": "iana",
    "extensions": ["esf"]
  },
  "application/vnd.epson.msf": {
    "source": "iana",
    "extensions": ["msf"]
  },
  "application/vnd.epson.quickanime": {
    "source": "iana",
    "extensions": ["qam"]
  },
  "application/vnd.epson.salt": {
    "source": "iana",
    "extensions": ["slt"]
  },
  "application/vnd.epson.ssf": {
    "source": "iana",
    "extensions": ["ssf"]
  },
  "application/vnd.ericsson.quickcall": {
    "source": "iana"
  },
  "application/vnd.espass-espass+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.eszigno3+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["es3","et3"]
  },
  "application/vnd.etsi.aoc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.asic-e+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.etsi.asic-s+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.etsi.cug+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvcommand+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvdiscovery+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvprofile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvsad-bc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvsad-cod+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvsad-npvr+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvservice+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvsync+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvueprofile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.mcid+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.mheg5": {
    "source": "iana"
  },
  "application/vnd.etsi.overload-control-policy-dataset+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.pstn+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.sci+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.simservs+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.timestamp-token": {
    "source": "iana"
  },
  "application/vnd.etsi.tsl+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.tsl.der": {
    "source": "iana"
  },
  "application/vnd.eudora.data": {
    "source": "iana"
  },
  "application/vnd.evolv.ecig.profile": {
    "source": "iana"
  },
  "application/vnd.evolv.ecig.settings": {
    "source": "iana"
  },
  "application/vnd.evolv.ecig.theme": {
    "source": "iana"
  },
  "application/vnd.exstream-empower+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.exstream-package": {
    "source": "iana"
  },
  "application/vnd.ezpix-album": {
    "source": "iana",
    "extensions": ["ez2"]
  },
  "application/vnd.ezpix-package": {
    "source": "iana",
    "extensions": ["ez3"]
  },
  "application/vnd.f-secure.mobile": {
    "source": "iana"
  },
  "application/vnd.fastcopy-disk-image": {
    "source": "iana"
  },
  "application/vnd.fdf": {
    "source": "iana",
    "extensions": ["fdf"]
  },
  "application/vnd.fdsn.mseed": {
    "source": "iana",
    "extensions": ["mseed"]
  },
  "application/vnd.fdsn.seed": {
    "source": "iana",
    "extensions": ["seed","dataless"]
  },
  "application/vnd.ffsns": {
    "source": "iana"
  },
  "application/vnd.ficlab.flb+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.filmit.zfc": {
    "source": "iana"
  },
  "application/vnd.fints": {
    "source": "iana"
  },
  "application/vnd.firemonkeys.cloudcell": {
    "source": "iana"
  },
  "application/vnd.flographit": {
    "source": "iana",
    "extensions": ["gph"]
  },
  "application/vnd.fluxtime.clip": {
    "source": "iana",
    "extensions": ["ftc"]
  },
  "application/vnd.font-fontforge-sfd": {
    "source": "iana"
  },
  "application/vnd.framemaker": {
    "source": "iana",
    "extensions": ["fm","frame","maker","book"]
  },
  "application/vnd.frogans.fnc": {
    "source": "iana",
    "extensions": ["fnc"]
  },
  "application/vnd.frogans.ltf": {
    "source": "iana",
    "extensions": ["ltf"]
  },
  "application/vnd.fsc.weblaunch": {
    "source": "iana",
    "extensions": ["fsc"]
  },
  "application/vnd.fujitsu.oasys": {
    "source": "iana",
    "extensions": ["oas"]
  },
  "application/vnd.fujitsu.oasys2": {
    "source": "iana",
    "extensions": ["oa2"]
  },
  "application/vnd.fujitsu.oasys3": {
    "source": "iana",
    "extensions": ["oa3"]
  },
  "application/vnd.fujitsu.oasysgp": {
    "source": "iana",
    "extensions": ["fg5"]
  },
  "application/vnd.fujitsu.oasysprs": {
    "source": "iana",
    "extensions": ["bh2"]
  },
  "application/vnd.fujixerox.art-ex": {
    "source": "iana"
  },
  "application/vnd.fujixerox.art4": {
    "source": "iana"
  },
  "application/vnd.fujixerox.ddd": {
    "source": "iana",
    "extensions": ["ddd"]
  },
  "application/vnd.fujixerox.docuworks": {
    "source": "iana",
    "extensions": ["xdw"]
  },
  "application/vnd.fujixerox.docuworks.binder": {
    "source": "iana",
    "extensions": ["xbd"]
  },
  "application/vnd.fujixerox.docuworks.container": {
    "source": "iana"
  },
  "application/vnd.fujixerox.hbpl": {
    "source": "iana"
  },
  "application/vnd.fut-misnet": {
    "source": "iana"
  },
  "application/vnd.futoin+cbor": {
    "source": "iana"
  },
  "application/vnd.futoin+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.fuzzysheet": {
    "source": "iana",
    "extensions": ["fzs"]
  },
  "application/vnd.genomatix.tuxedo": {
    "source": "iana",
    "extensions": ["txd"]
  },
  "application/vnd.gentics.grd+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.geo+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.geocube+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.geogebra.file": {
    "source": "iana",
    "extensions": ["ggb"]
  },
  "application/vnd.geogebra.tool": {
    "source": "iana",
    "extensions": ["ggt"]
  },
  "application/vnd.geometry-explorer": {
    "source": "iana",
    "extensions": ["gex","gre"]
  },
  "application/vnd.geonext": {
    "source": "iana",
    "extensions": ["gxt"]
  },
  "application/vnd.geoplan": {
    "source": "iana",
    "extensions": ["g2w"]
  },
  "application/vnd.geospace": {
    "source": "iana",
    "extensions": ["g3w"]
  },
  "application/vnd.gerber": {
    "source": "iana"
  },
  "application/vnd.globalplatform.card-content-mgt": {
    "source": "iana"
  },
  "application/vnd.globalplatform.card-content-mgt-response": {
    "source": "iana"
  },
  "application/vnd.gmx": {
    "source": "iana",
    "extensions": ["gmx"]
  },
  "application/vnd.google-apps.document": {
    "compressible": false,
    "extensions": ["gdoc"]
  },
  "application/vnd.google-apps.presentation": {
    "compressible": false,
    "extensions": ["gslides"]
  },
  "application/vnd.google-apps.spreadsheet": {
    "compressible": false,
    "extensions": ["gsheet"]
  },
  "application/vnd.google-earth.kml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["kml"]
  },
  "application/vnd.google-earth.kmz": {
    "source": "iana",
    "compressible": false,
    "extensions": ["kmz"]
  },
  "application/vnd.gov.sk.e-form+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.gov.sk.e-form+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.gov.sk.xmldatacontainer+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.grafeq": {
    "source": "iana",
    "extensions": ["gqf","gqs"]
  },
  "application/vnd.gridmp": {
    "source": "iana"
  },
  "application/vnd.groove-account": {
    "source": "iana",
    "extensions": ["gac"]
  },
  "application/vnd.groove-help": {
    "source": "iana",
    "extensions": ["ghf"]
  },
  "application/vnd.groove-identity-message": {
    "source": "iana",
    "extensions": ["gim"]
  },
  "application/vnd.groove-injector": {
    "source": "iana",
    "extensions": ["grv"]
  },
  "application/vnd.groove-tool-message": {
    "source": "iana",
    "extensions": ["gtm"]
  },
  "application/vnd.groove-tool-template": {
    "source": "iana",
    "extensions": ["tpl"]
  },
  "application/vnd.groove-vcard": {
    "source": "iana",
    "extensions": ["vcg"]
  },
  "application/vnd.hal+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hal+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["hal"]
  },
  "application/vnd.handheld-entertainment+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["zmm"]
  },
  "application/vnd.hbci": {
    "source": "iana",
    "extensions": ["hbci"]
  },
  "application/vnd.hc+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hcl-bireports": {
    "source": "iana"
  },
  "application/vnd.hdt": {
    "source": "iana"
  },
  "application/vnd.heroku+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hhe.lesson-player": {
    "source": "iana",
    "extensions": ["les"]
  },
  "application/vnd.hp-hpgl": {
    "source": "iana",
    "extensions": ["hpgl"]
  },
  "application/vnd.hp-hpid": {
    "source": "iana",
    "extensions": ["hpid"]
  },
  "application/vnd.hp-hps": {
    "source": "iana",
    "extensions": ["hps"]
  },
  "application/vnd.hp-jlyt": {
    "source": "iana",
    "extensions": ["jlt"]
  },
  "application/vnd.hp-pcl": {
    "source": "iana",
    "extensions": ["pcl"]
  },
  "application/vnd.hp-pclxl": {
    "source": "iana",
    "extensions": ["pclxl"]
  },
  "application/vnd.httphone": {
    "source": "iana"
  },
  "application/vnd.hydrostatix.sof-data": {
    "source": "iana",
    "extensions": ["sfd-hdstx"]
  },
  "application/vnd.hyper+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hyper-item+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hyperdrive+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hzn-3d-crossword": {
    "source": "iana"
  },
  "application/vnd.ibm.afplinedata": {
    "source": "iana"
  },
  "application/vnd.ibm.electronic-media": {
    "source": "iana"
  },
  "application/vnd.ibm.minipay": {
    "source": "iana",
    "extensions": ["mpy"]
  },
  "application/vnd.ibm.modcap": {
    "source": "iana",
    "extensions": ["afp","listafp","list3820"]
  },
  "application/vnd.ibm.rights-management": {
    "source": "iana",
    "extensions": ["irm"]
  },
  "application/vnd.ibm.secure-container": {
    "source": "iana",
    "extensions": ["sc"]
  },
  "application/vnd.iccprofile": {
    "source": "iana",
    "extensions": ["icc","icm"]
  },
  "application/vnd.ieee.1905": {
    "source": "iana"
  },
  "application/vnd.igloader": {
    "source": "iana",
    "extensions": ["igl"]
  },
  "application/vnd.imagemeter.folder+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.imagemeter.image+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.immervision-ivp": {
    "source": "iana",
    "extensions": ["ivp"]
  },
  "application/vnd.immervision-ivu": {
    "source": "iana",
    "extensions": ["ivu"]
  },
  "application/vnd.ims.imsccv1p1": {
    "source": "iana"
  },
  "application/vnd.ims.imsccv1p2": {
    "source": "iana"
  },
  "application/vnd.ims.imsccv1p3": {
    "source": "iana"
  },
  "application/vnd.ims.lis.v2.result+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolconsumerprofile+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolproxy+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolproxy.id+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolsettings+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolsettings.simple+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.informedcontrol.rms+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.informix-visionary": {
    "source": "iana"
  },
  "application/vnd.infotech.project": {
    "source": "iana"
  },
  "application/vnd.infotech.project+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.innopath.wamp.notification": {
    "source": "iana"
  },
  "application/vnd.insors.igm": {
    "source": "iana",
    "extensions": ["igm"]
  },
  "application/vnd.intercon.formnet": {
    "source": "iana",
    "extensions": ["xpw","xpx"]
  },
  "application/vnd.intergeo": {
    "source": "iana",
    "extensions": ["i2g"]
  },
  "application/vnd.intertrust.digibox": {
    "source": "iana"
  },
  "application/vnd.intertrust.nncp": {
    "source": "iana"
  },
  "application/vnd.intu.qbo": {
    "source": "iana",
    "extensions": ["qbo"]
  },
  "application/vnd.intu.qfx": {
    "source": "iana",
    "extensions": ["qfx"]
  },
  "application/vnd.iptc.g2.catalogitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.conceptitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.knowledgeitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.newsitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.newsmessage+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.packageitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.planningitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ipunplugged.rcprofile": {
    "source": "iana",
    "extensions": ["rcprofile"]
  },
  "application/vnd.irepository.package+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["irp"]
  },
  "application/vnd.is-xpr": {
    "source": "iana",
    "extensions": ["xpr"]
  },
  "application/vnd.isac.fcs": {
    "source": "iana",
    "extensions": ["fcs"]
  },
  "application/vnd.iso11783-10+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.jam": {
    "source": "iana",
    "extensions": ["jam"]
  },
  "application/vnd.japannet-directory-service": {
    "source": "iana"
  },
  "application/vnd.japannet-jpnstore-wakeup": {
    "source": "iana"
  },
  "application/vnd.japannet-payment-wakeup": {
    "source": "iana"
  },
  "application/vnd.japannet-registration": {
    "source": "iana"
  },
  "application/vnd.japannet-registration-wakeup": {
    "source": "iana"
  },
  "application/vnd.japannet-setstore-wakeup": {
    "source": "iana"
  },
  "application/vnd.japannet-verification": {
    "source": "iana"
  },
  "application/vnd.japannet-verification-wakeup": {
    "source": "iana"
  },
  "application/vnd.jcp.javame.midlet-rms": {
    "source": "iana",
    "extensions": ["rms"]
  },
  "application/vnd.jisp": {
    "source": "iana",
    "extensions": ["jisp"]
  },
  "application/vnd.joost.joda-archive": {
    "source": "iana",
    "extensions": ["joda"]
  },
  "application/vnd.jsk.isdn-ngn": {
    "source": "iana"
  },
  "application/vnd.kahootz": {
    "source": "iana",
    "extensions": ["ktz","ktr"]
  },
  "application/vnd.kde.karbon": {
    "source": "iana",
    "extensions": ["karbon"]
  },
  "application/vnd.kde.kchart": {
    "source": "iana",
    "extensions": ["chrt"]
  },
  "application/vnd.kde.kformula": {
    "source": "iana",
    "extensions": ["kfo"]
  },
  "application/vnd.kde.kivio": {
    "source": "iana",
    "extensions": ["flw"]
  },
  "application/vnd.kde.kontour": {
    "source": "iana",
    "extensions": ["kon"]
  },
  "application/vnd.kde.kpresenter": {
    "source": "iana",
    "extensions": ["kpr","kpt"]
  },
  "application/vnd.kde.kspread": {
    "source": "iana",
    "extensions": ["ksp"]
  },
  "application/vnd.kde.kword": {
    "source": "iana",
    "extensions": ["kwd","kwt"]
  },
  "application/vnd.kenameaapp": {
    "source": "iana",
    "extensions": ["htke"]
  },
  "application/vnd.kidspiration": {
    "source": "iana",
    "extensions": ["kia"]
  },
  "application/vnd.kinar": {
    "source": "iana",
    "extensions": ["kne","knp"]
  },
  "application/vnd.koan": {
    "source": "iana",
    "extensions": ["skp","skd","skt","skm"]
  },
  "application/vnd.kodak-descriptor": {
    "source": "iana",
    "extensions": ["sse"]
  },
  "application/vnd.las": {
    "source": "iana"
  },
  "application/vnd.las.las+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.las.las+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["lasxml"]
  },
  "application/vnd.laszip": {
    "source": "iana"
  },
  "application/vnd.leap+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.liberty-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.llamagraphics.life-balance.desktop": {
    "source": "iana",
    "extensions": ["lbd"]
  },
  "application/vnd.llamagraphics.life-balance.exchange+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["lbe"]
  },
  "application/vnd.logipipe.circuit+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.loom": {
    "source": "iana"
  },
  "application/vnd.lotus-1-2-3": {
    "source": "iana",
    "extensions": ["123"]
  },
  "application/vnd.lotus-approach": {
    "source": "iana",
    "extensions": ["apr"]
  },
  "application/vnd.lotus-freelance": {
    "source": "iana",
    "extensions": ["pre"]
  },
  "application/vnd.lotus-notes": {
    "source": "iana",
    "extensions": ["nsf"]
  },
  "application/vnd.lotus-organizer": {
    "source": "iana",
    "extensions": ["org"]
  },
  "application/vnd.lotus-screencam": {
    "source": "iana",
    "extensions": ["scm"]
  },
  "application/vnd.lotus-wordpro": {
    "source": "iana",
    "extensions": ["lwp"]
  },
  "application/vnd.macports.portpkg": {
    "source": "iana",
    "extensions": ["portpkg"]
  },
  "application/vnd.mapbox-vector-tile": {
    "source": "iana"
  },
  "application/vnd.marlin.drm.actiontoken+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.marlin.drm.conftoken+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.marlin.drm.license+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.marlin.drm.mdcf": {
    "source": "iana"
  },
  "application/vnd.mason+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.maxmind.maxmind-db": {
    "source": "iana"
  },
  "application/vnd.mcd": {
    "source": "iana",
    "extensions": ["mcd"]
  },
  "application/vnd.medcalcdata": {
    "source": "iana",
    "extensions": ["mc1"]
  },
  "application/vnd.mediastation.cdkey": {
    "source": "iana",
    "extensions": ["cdkey"]
  },
  "application/vnd.meridian-slingshot": {
    "source": "iana"
  },
  "application/vnd.mfer": {
    "source": "iana",
    "extensions": ["mwf"]
  },
  "application/vnd.mfmp": {
    "source": "iana",
    "extensions": ["mfm"]
  },
  "application/vnd.micro+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.micrografx.flo": {
    "source": "iana",
    "extensions": ["flo"]
  },
  "application/vnd.micrografx.igx": {
    "source": "iana",
    "extensions": ["igx"]
  },
  "application/vnd.microsoft.portable-executable": {
    "source": "iana"
  },
  "application/vnd.microsoft.windows.thumbnail-cache": {
    "source": "iana"
  },
  "application/vnd.miele+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.mif": {
    "source": "iana",
    "extensions": ["mif"]
  },
  "application/vnd.minisoft-hp3000-save": {
    "source": "iana"
  },
  "application/vnd.mitsubishi.misty-guard.trustweb": {
    "source": "iana"
  },
  "application/vnd.mobius.daf": {
    "source": "iana",
    "extensions": ["daf"]
  },
  "application/vnd.mobius.dis": {
    "source": "iana",
    "extensions": ["dis"]
  },
  "application/vnd.mobius.mbk": {
    "source": "iana",
    "extensions": ["mbk"]
  },
  "application/vnd.mobius.mqy": {
    "source": "iana",
    "extensions": ["mqy"]
  },
  "application/vnd.mobius.msl": {
    "source": "iana",
    "extensions": ["msl"]
  },
  "application/vnd.mobius.plc": {
    "source": "iana",
    "extensions": ["plc"]
  },
  "application/vnd.mobius.txf": {
    "source": "iana",
    "extensions": ["txf"]
  },
  "application/vnd.mophun.application": {
    "source": "iana",
    "extensions": ["mpn"]
  },
  "application/vnd.mophun.certificate": {
    "source": "iana",
    "extensions": ["mpc"]
  },
  "application/vnd.motorola.flexsuite": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.adsi": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.fis": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.gotap": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.kmr": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.ttc": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.wem": {
    "source": "iana"
  },
  "application/vnd.motorola.iprm": {
    "source": "iana"
  },
  "application/vnd.mozilla.xul+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xul"]
  },
  "application/vnd.ms-3mfdocument": {
    "source": "iana"
  },
  "application/vnd.ms-artgalry": {
    "source": "iana",
    "extensions": ["cil"]
  },
  "application/vnd.ms-asf": {
    "source": "iana"
  },
  "application/vnd.ms-cab-compressed": {
    "source": "iana",
    "extensions": ["cab"]
  },
  "application/vnd.ms-color.iccprofile": {
    "source": "apache"
  },
  "application/vnd.ms-excel": {
    "source": "iana",
    "compressible": false,
    "extensions": ["xls","xlm","xla","xlc","xlt","xlw"]
  },
  "application/vnd.ms-excel.addin.macroenabled.12": {
    "source": "iana",
    "extensions": ["xlam"]
  },
  "application/vnd.ms-excel.sheet.binary.macroenabled.12": {
    "source": "iana",
    "extensions": ["xlsb"]
  },
  "application/vnd.ms-excel.sheet.macroenabled.12": {
    "source": "iana",
    "extensions": ["xlsm"]
  },
  "application/vnd.ms-excel.template.macroenabled.12": {
    "source": "iana",
    "extensions": ["xltm"]
  },
  "application/vnd.ms-fontobject": {
    "source": "iana",
    "compressible": true,
    "extensions": ["eot"]
  },
  "application/vnd.ms-htmlhelp": {
    "source": "iana",
    "extensions": ["chm"]
  },
  "application/vnd.ms-ims": {
    "source": "iana",
    "extensions": ["ims"]
  },
  "application/vnd.ms-lrm": {
    "source": "iana",
    "extensions": ["lrm"]
  },
  "application/vnd.ms-office.activex+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ms-officetheme": {
    "source": "iana",
    "extensions": ["thmx"]
  },
  "application/vnd.ms-opentype": {
    "source": "apache",
    "compressible": true
  },
  "application/vnd.ms-outlook": {
    "compressible": false,
    "extensions": ["msg"]
  },
  "application/vnd.ms-package.obfuscated-opentype": {
    "source": "apache"
  },
  "application/vnd.ms-pki.seccat": {
    "source": "apache",
    "extensions": ["cat"]
  },
  "application/vnd.ms-pki.stl": {
    "source": "apache",
    "extensions": ["stl"]
  },
  "application/vnd.ms-playready.initiator+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ms-powerpoint": {
    "source": "iana",
    "compressible": false,
    "extensions": ["ppt","pps","pot"]
  },
  "application/vnd.ms-powerpoint.addin.macroenabled.12": {
    "source": "iana",
    "extensions": ["ppam"]
  },
  "application/vnd.ms-powerpoint.presentation.macroenabled.12": {
    "source": "iana",
    "extensions": ["pptm"]
  },
  "application/vnd.ms-powerpoint.slide.macroenabled.12": {
    "source": "iana",
    "extensions": ["sldm"]
  },
  "application/vnd.ms-powerpoint.slideshow.macroenabled.12": {
    "source": "iana",
    "extensions": ["ppsm"]
  },
  "application/vnd.ms-powerpoint.template.macroenabled.12": {
    "source": "iana",
    "extensions": ["potm"]
  },
  "application/vnd.ms-printdevicecapabilities+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ms-printing.printticket+xml": {
    "source": "apache",
    "compressible": true
  },
  "application/vnd.ms-printschematicket+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ms-project": {
    "source": "iana",
    "extensions": ["mpp","mpt"]
  },
  "application/vnd.ms-tnef": {
    "source": "iana"
  },
  "application/vnd.ms-windows.devicepairing": {
    "source": "iana"
  },
  "application/vnd.ms-windows.nwprinting.oob": {
    "source": "iana"
  },
  "application/vnd.ms-windows.printerpairing": {
    "source": "iana"
  },
  "application/vnd.ms-windows.wsd.oob": {
    "source": "iana"
  },
  "application/vnd.ms-wmdrm.lic-chlg-req": {
    "source": "iana"
  },
  "application/vnd.ms-wmdrm.lic-resp": {
    "source": "iana"
  },
  "application/vnd.ms-wmdrm.meter-chlg-req": {
    "source": "iana"
  },
  "application/vnd.ms-wmdrm.meter-resp": {
    "source": "iana"
  },
  "application/vnd.ms-word.document.macroenabled.12": {
    "source": "iana",
    "extensions": ["docm"]
  },
  "application/vnd.ms-word.template.macroenabled.12": {
    "source": "iana",
    "extensions": ["dotm"]
  },
  "application/vnd.ms-works": {
    "source": "iana",
    "extensions": ["wps","wks","wcm","wdb"]
  },
  "application/vnd.ms-wpl": {
    "source": "iana",
    "extensions": ["wpl"]
  },
  "application/vnd.ms-xpsdocument": {
    "source": "iana",
    "compressible": false,
    "extensions": ["xps"]
  },
  "application/vnd.msa-disk-image": {
    "source": "iana"
  },
  "application/vnd.mseq": {
    "source": "iana",
    "extensions": ["mseq"]
  },
  "application/vnd.msign": {
    "source": "iana"
  },
  "application/vnd.multiad.creator": {
    "source": "iana"
  },
  "application/vnd.multiad.creator.cif": {
    "source": "iana"
  },
  "application/vnd.music-niff": {
    "source": "iana"
  },
  "application/vnd.musician": {
    "source": "iana",
    "extensions": ["mus"]
  },
  "application/vnd.muvee.style": {
    "source": "iana",
    "extensions": ["msty"]
  },
  "application/vnd.mynfc": {
    "source": "iana",
    "extensions": ["taglet"]
  },
  "application/vnd.ncd.control": {
    "source": "iana"
  },
  "application/vnd.ncd.reference": {
    "source": "iana"
  },
  "application/vnd.nearst.inv+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nervana": {
    "source": "iana"
  },
  "application/vnd.netfpx": {
    "source": "iana"
  },
  "application/vnd.neurolanguage.nlu": {
    "source": "iana",
    "extensions": ["nlu"]
  },
  "application/vnd.nimn": {
    "source": "iana"
  },
  "application/vnd.nintendo.nitro.rom": {
    "source": "iana"
  },
  "application/vnd.nintendo.snes.rom": {
    "source": "iana"
  },
  "application/vnd.nitf": {
    "source": "iana",
    "extensions": ["ntf","nitf"]
  },
  "application/vnd.noblenet-directory": {
    "source": "iana",
    "extensions": ["nnd"]
  },
  "application/vnd.noblenet-sealer": {
    "source": "iana",
    "extensions": ["nns"]
  },
  "application/vnd.noblenet-web": {
    "source": "iana",
    "extensions": ["nnw"]
  },
  "application/vnd.nokia.catalogs": {
    "source": "iana"
  },
  "application/vnd.nokia.conml+wbxml": {
    "source": "iana"
  },
  "application/vnd.nokia.conml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.iptv.config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.isds-radio-presets": {
    "source": "iana"
  },
  "application/vnd.nokia.landmark+wbxml": {
    "source": "iana"
  },
  "application/vnd.nokia.landmark+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.landmarkcollection+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.n-gage.ac+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ac"]
  },
  "application/vnd.nokia.n-gage.data": {
    "source": "iana",
    "extensions": ["ngdat"]
  },
  "application/vnd.nokia.n-gage.symbian.install": {
    "source": "iana",
    "extensions": ["n-gage"]
  },
  "application/vnd.nokia.ncd": {
    "source": "iana"
  },
  "application/vnd.nokia.pcd+wbxml": {
    "source": "iana"
  },
  "application/vnd.nokia.pcd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.radio-preset": {
    "source": "iana",
    "extensions": ["rpst"]
  },
  "application/vnd.nokia.radio-presets": {
    "source": "iana",
    "extensions": ["rpss"]
  },
  "application/vnd.novadigm.edm": {
    "source": "iana",
    "extensions": ["edm"]
  },
  "application/vnd.novadigm.edx": {
    "source": "iana",
    "extensions": ["edx"]
  },
  "application/vnd.novadigm.ext": {
    "source": "iana",
    "extensions": ["ext"]
  },
  "application/vnd.ntt-local.content-share": {
    "source": "iana"
  },
  "application/vnd.ntt-local.file-transfer": {
    "source": "iana"
  },
  "application/vnd.ntt-local.ogw_remote-access": {
    "source": "iana"
  },
  "application/vnd.ntt-local.sip-ta_remote": {
    "source": "iana"
  },
  "application/vnd.ntt-local.sip-ta_tcp_stream": {
    "source": "iana"
  },
  "application/vnd.oasis.opendocument.chart": {
    "source": "iana",
    "extensions": ["odc"]
  },
  "application/vnd.oasis.opendocument.chart-template": {
    "source": "iana",
    "extensions": ["otc"]
  },
  "application/vnd.oasis.opendocument.database": {
    "source": "iana",
    "extensions": ["odb"]
  },
  "application/vnd.oasis.opendocument.formula": {
    "source": "iana",
    "extensions": ["odf"]
  },
  "application/vnd.oasis.opendocument.formula-template": {
    "source": "iana",
    "extensions": ["odft"]
  },
  "application/vnd.oasis.opendocument.graphics": {
    "source": "iana",
    "compressible": false,
    "extensions": ["odg"]
  },
  "application/vnd.oasis.opendocument.graphics-template": {
    "source": "iana",
    "extensions": ["otg"]
  },
  "application/vnd.oasis.opendocument.image": {
    "source": "iana",
    "extensions": ["odi"]
  },
  "application/vnd.oasis.opendocument.image-template": {
    "source": "iana",
    "extensions": ["oti"]
  },
  "application/vnd.oasis.opendocument.presentation": {
    "source": "iana",
    "compressible": false,
    "extensions": ["odp"]
  },
  "application/vnd.oasis.opendocument.presentation-template": {
    "source": "iana",
    "extensions": ["otp"]
  },
  "application/vnd.oasis.opendocument.spreadsheet": {
    "source": "iana",
    "compressible": false,
    "extensions": ["ods"]
  },
  "application/vnd.oasis.opendocument.spreadsheet-template": {
    "source": "iana",
    "extensions": ["ots"]
  },
  "application/vnd.oasis.opendocument.text": {
    "source": "iana",
    "compressible": false,
    "extensions": ["odt"]
  },
  "application/vnd.oasis.opendocument.text-master": {
    "source": "iana",
    "extensions": ["odm"]
  },
  "application/vnd.oasis.opendocument.text-template": {
    "source": "iana",
    "extensions": ["ott"]
  },
  "application/vnd.oasis.opendocument.text-web": {
    "source": "iana",
    "extensions": ["oth"]
  },
  "application/vnd.obn": {
    "source": "iana"
  },
  "application/vnd.ocf+cbor": {
    "source": "iana"
  },
  "application/vnd.oci.image.manifest.v1+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oftn.l10n+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.contentaccessdownload+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.contentaccessstreaming+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.cspg-hexbinary": {
    "source": "iana"
  },
  "application/vnd.oipf.dae.svg+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.dae.xhtml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.mippvcontrolmessage+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.pae.gem": {
    "source": "iana"
  },
  "application/vnd.oipf.spdiscovery+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.spdlist+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.ueprofile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.userprofile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.olpc-sugar": {
    "source": "iana",
    "extensions": ["xo"]
  },
  "application/vnd.oma-scws-config": {
    "source": "iana"
  },
  "application/vnd.oma-scws-http-request": {
    "source": "iana"
  },
  "application/vnd.oma-scws-http-response": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.associated-procedure-parameter+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.drm-trigger+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.imd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.ltkm": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.notification+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.provisioningtrigger": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.sgboot": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.sgdd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.sgdu": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.simple-symbol-container": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.smartcard-trigger+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.sprov+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.stkm": {
    "source": "iana"
  },
  "application/vnd.oma.cab-address-book+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.cab-feature-handler+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.cab-pcc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.cab-subs-invite+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.cab-user-prefs+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.dcd": {
    "source": "iana"
  },
  "application/vnd.oma.dcdc": {
    "source": "iana"
  },
  "application/vnd.oma.dd2+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dd2"]
  },
  "application/vnd.oma.drm.risd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.group-usage-list+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.lwm2m+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.lwm2m+tlv": {
    "source": "iana"
  },
  "application/vnd.oma.pal+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.detailed-progress-report+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.final-report+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.groups+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.invocation-descriptor+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.optimized-progress-report+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.push": {
    "source": "iana"
  },
  "application/vnd.oma.scidm.messages+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.xcap-directory+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.omads-email+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.omads-file+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.omads-folder+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.omaloc-supl-init": {
    "source": "iana"
  },
  "application/vnd.onepager": {
    "source": "iana"
  },
  "application/vnd.onepagertamp": {
    "source": "iana"
  },
  "application/vnd.onepagertamx": {
    "source": "iana"
  },
  "application/vnd.onepagertat": {
    "source": "iana"
  },
  "application/vnd.onepagertatp": {
    "source": "iana"
  },
  "application/vnd.onepagertatx": {
    "source": "iana"
  },
  "application/vnd.openblox.game+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["obgx"]
  },
  "application/vnd.openblox.game-binary": {
    "source": "iana"
  },
  "application/vnd.openeye.oeb": {
    "source": "iana"
  },
  "application/vnd.openofficeorg.extension": {
    "source": "apache",
    "extensions": ["oxt"]
  },
  "application/vnd.openstreetmap.data+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["osm"]
  },
  "application/vnd.openxmlformats-officedocument.custom-properties+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawing+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.extended-properties+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.presentation": {
    "source": "iana",
    "compressible": false,
    "extensions": ["pptx"]
  },
  "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slide": {
    "source": "iana",
    "extensions": ["sldx"]
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slideshow": {
    "source": "iana",
    "extensions": ["ppsx"]
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.template": {
    "source": "iana",
    "extensions": ["potx"]
  },
  "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
    "source": "iana",
    "compressible": false,
    "extensions": ["xlsx"]
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.template": {
    "source": "iana",
    "extensions": ["xltx"]
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.theme+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.themeoverride+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.vmldrawing": {
    "source": "iana"
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.document": {
    "source": "iana",
    "compressible": false,
    "extensions": ["docx"]
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.template": {
    "source": "iana",
    "extensions": ["dotx"]
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-package.core-properties+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-package.relationships+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oracle.resource+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.orange.indata": {
    "source": "iana"
  },
  "application/vnd.osa.netdeploy": {
    "source": "iana"
  },
  "application/vnd.osgeo.mapguide.package": {
    "source": "iana",
    "extensions": ["mgp"]
  },
  "application/vnd.osgi.bundle": {
    "source": "iana"
  },
  "application/vnd.osgi.dp": {
    "source": "iana",
    "extensions": ["dp"]
  },
  "application/vnd.osgi.subsystem": {
    "source": "iana",
    "extensions": ["esa"]
  },
  "application/vnd.otps.ct-kip+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oxli.countgraph": {
    "source": "iana"
  },
  "application/vnd.pagerduty+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.palm": {
    "source": "iana",
    "extensions": ["pdb","pqa","oprc"]
  },
  "application/vnd.panoply": {
    "source": "iana"
  },
  "application/vnd.paos.xml": {
    "source": "iana"
  },
  "application/vnd.patentdive": {
    "source": "iana"
  },
  "application/vnd.patientecommsdoc": {
    "source": "iana"
  },
  "application/vnd.pawaafile": {
    "source": "iana",
    "extensions": ["paw"]
  },
  "application/vnd.pcos": {
    "source": "iana"
  },
  "application/vnd.pg.format": {
    "source": "iana",
    "extensions": ["str"]
  },
  "application/vnd.pg.osasli": {
    "source": "iana",
    "extensions": ["ei6"]
  },
  "application/vnd.piaccess.application-licence": {
    "source": "iana"
  },
  "application/vnd.picsel": {
    "source": "iana",
    "extensions": ["efif"]
  },
  "application/vnd.pmi.widget": {
    "source": "iana",
    "extensions": ["wg"]
  },
  "application/vnd.poc.group-advertisement+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.pocketlearn": {
    "source": "iana",
    "extensions": ["plf"]
  },
  "application/vnd.powerbuilder6": {
    "source": "iana",
    "extensions": ["pbd"]
  },
  "application/vnd.powerbuilder6-s": {
    "source": "iana"
  },
  "application/vnd.powerbuilder7": {
    "source": "iana"
  },
  "application/vnd.powerbuilder7-s": {
    "source": "iana"
  },
  "application/vnd.powerbuilder75": {
    "source": "iana"
  },
  "application/vnd.powerbuilder75-s": {
    "source": "iana"
  },
  "application/vnd.preminet": {
    "source": "iana"
  },
  "application/vnd.previewsystems.box": {
    "source": "iana",
    "extensions": ["box"]
  },
  "application/vnd.proteus.magazine": {
    "source": "iana",
    "extensions": ["mgz"]
  },
  "application/vnd.psfs": {
    "source": "iana"
  },
  "application/vnd.publishare-delta-tree": {
    "source": "iana",
    "extensions": ["qps"]
  },
  "application/vnd.pvi.ptid1": {
    "source": "iana",
    "extensions": ["ptid"]
  },
  "application/vnd.pwg-multiplexed": {
    "source": "iana"
  },
  "application/vnd.pwg-xhtml-print+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.qualcomm.brew-app-res": {
    "source": "iana"
  },
  "application/vnd.quarantainenet": {
    "source": "iana"
  },
  "application/vnd.quark.quarkxpress": {
    "source": "iana",
    "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"]
  },
  "application/vnd.quobject-quoxdocument": {
    "source": "iana"
  },
  "application/vnd.radisys.moml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit-conf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit-conn+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit-dialog+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit-stream+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-conf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-base+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-fax-detect+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-group+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-speech+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-transform+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.rainstor.data": {
    "source": "iana"
  },
  "application/vnd.rapid": {
    "source": "iana"
  },
  "application/vnd.rar": {
    "source": "iana"
  },
  "application/vnd.realvnc.bed": {
    "source": "iana",
    "extensions": ["bed"]
  },
  "application/vnd.recordare.musicxml": {
    "source": "iana",
    "extensions": ["mxl"]
  },
  "application/vnd.recordare.musicxml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["musicxml"]
  },
  "application/vnd.renlearn.rlprint": {
    "source": "iana"
  },
  "application/vnd.restful+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.rig.cryptonote": {
    "source": "iana",
    "extensions": ["cryptonote"]
  },
  "application/vnd.rim.cod": {
    "source": "apache",
    "extensions": ["cod"]
  },
  "application/vnd.rn-realmedia": {
    "source": "apache",
    "extensions": ["rm"]
  },
  "application/vnd.rn-realmedia-vbr": {
    "source": "apache",
    "extensions": ["rmvb"]
  },
  "application/vnd.route66.link66+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["link66"]
  },
  "application/vnd.rs-274x": {
    "source": "iana"
  },
  "application/vnd.ruckus.download": {
    "source": "iana"
  },
  "application/vnd.s3sms": {
    "source": "iana"
  },
  "application/vnd.sailingtracker.track": {
    "source": "iana",
    "extensions": ["st"]
  },
  "application/vnd.sar": {
    "source": "iana"
  },
  "application/vnd.sbm.cid": {
    "source": "iana"
  },
  "application/vnd.sbm.mid2": {
    "source": "iana"
  },
  "application/vnd.scribus": {
    "source": "iana"
  },
  "application/vnd.sealed.3df": {
    "source": "iana"
  },
  "application/vnd.sealed.csf": {
    "source": "iana"
  },
  "application/vnd.sealed.doc": {
    "source": "iana"
  },
  "application/vnd.sealed.eml": {
    "source": "iana"
  },
  "application/vnd.sealed.mht": {
    "source": "iana"
  },
  "application/vnd.sealed.net": {
    "source": "iana"
  },
  "application/vnd.sealed.ppt": {
    "source": "iana"
  },
  "application/vnd.sealed.tiff": {
    "source": "iana"
  },
  "application/vnd.sealed.xls": {
    "source": "iana"
  },
  "application/vnd.sealedmedia.softseal.html": {
    "source": "iana"
  },
  "application/vnd.sealedmedia.softseal.pdf": {
    "source": "iana"
  },
  "application/vnd.seemail": {
    "source": "iana",
    "extensions": ["see"]
  },
  "application/vnd.sema": {
    "source": "iana",
    "extensions": ["sema"]
  },
  "application/vnd.semd": {
    "source": "iana",
    "extensions": ["semd"]
  },
  "application/vnd.semf": {
    "source": "iana",
    "extensions": ["semf"]
  },
  "application/vnd.shade-save-file": {
    "source": "iana"
  },
  "application/vnd.shana.informed.formdata": {
    "source": "iana",
    "extensions": ["ifm"]
  },
  "application/vnd.shana.informed.formtemplate": {
    "source": "iana",
    "extensions": ["itp"]
  },
  "application/vnd.shana.informed.interchange": {
    "source": "iana",
    "extensions": ["iif"]
  },
  "application/vnd.shana.informed.package": {
    "source": "iana",
    "extensions": ["ipk"]
  },
  "application/vnd.shootproof+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.shopkick+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.shp": {
    "source": "iana"
  },
  "application/vnd.shx": {
    "source": "iana"
  },
  "application/vnd.sigrok.session": {
    "source": "iana"
  },
  "application/vnd.simtech-mindmapper": {
    "source": "iana",
    "extensions": ["twd","twds"]
  },
  "application/vnd.siren+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.smaf": {
    "source": "iana",
    "extensions": ["mmf"]
  },
  "application/vnd.smart.notebook": {
    "source": "iana"
  },
  "application/vnd.smart.teacher": {
    "source": "iana",
    "extensions": ["teacher"]
  },
  "application/vnd.snesdev-page-table": {
    "source": "iana"
  },
  "application/vnd.software602.filler.form+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["fo"]
  },
  "application/vnd.software602.filler.form-xml-zip": {
    "source": "iana"
  },
  "application/vnd.solent.sdkm+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sdkm","sdkd"]
  },
  "application/vnd.spotfire.dxp": {
    "source": "iana",
    "extensions": ["dxp"]
  },
  "application/vnd.spotfire.sfs": {
    "source": "iana",
    "extensions": ["sfs"]
  },
  "application/vnd.sqlite3": {
    "source": "iana"
  },
  "application/vnd.sss-cod": {
    "source": "iana"
  },
  "application/vnd.sss-dtf": {
    "source": "iana"
  },
  "application/vnd.sss-ntf": {
    "source": "iana"
  },
  "application/vnd.stardivision.calc": {
    "source": "apache",
    "extensions": ["sdc"]
  },
  "application/vnd.stardivision.draw": {
    "source": "apache",
    "extensions": ["sda"]
  },
  "application/vnd.stardivision.impress": {
    "source": "apache",
    "extensions": ["sdd"]
  },
  "application/vnd.stardivision.math": {
    "source": "apache",
    "extensions": ["smf"]
  },
  "application/vnd.stardivision.writer": {
    "source": "apache",
    "extensions": ["sdw","vor"]
  },
  "application/vnd.stardivision.writer-global": {
    "source": "apache",
    "extensions": ["sgl"]
  },
  "application/vnd.stepmania.package": {
    "source": "iana",
    "extensions": ["smzip"]
  },
  "application/vnd.stepmania.stepchart": {
    "source": "iana",
    "extensions": ["sm"]
  },
  "application/vnd.street-stream": {
    "source": "iana"
  },
  "application/vnd.sun.wadl+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wadl"]
  },
  "application/vnd.sun.xml.calc": {
    "source": "apache",
    "extensions": ["sxc"]
  },
  "application/vnd.sun.xml.calc.template": {
    "source": "apache",
    "extensions": ["stc"]
  },
  "application/vnd.sun.xml.draw": {
    "source": "apache",
    "extensions": ["sxd"]
  },
  "application/vnd.sun.xml.draw.template": {
    "source": "apache",
    "extensions": ["std"]
  },
  "application/vnd.sun.xml.impress": {
    "source": "apache",
    "extensions": ["sxi"]
  },
  "application/vnd.sun.xml.impress.template": {
    "source": "apache",
    "extensions": ["sti"]
  },
  "application/vnd.sun.xml.math": {
    "source": "apache",
    "extensions": ["sxm"]
  },
  "application/vnd.sun.xml.writer": {
    "source": "apache",
    "extensions": ["sxw"]
  },
  "application/vnd.sun.xml.writer.global": {
    "source": "apache",
    "extensions": ["sxg"]
  },
  "application/vnd.sun.xml.writer.template": {
    "source": "apache",
    "extensions": ["stw"]
  },
  "application/vnd.sus-calendar": {
    "source": "iana",
    "extensions": ["sus","susp"]
  },
  "application/vnd.svd": {
    "source": "iana",
    "extensions": ["svd"]
  },
  "application/vnd.swiftview-ics": {
    "source": "iana"
  },
  "application/vnd.symbian.install": {
    "source": "apache",
    "extensions": ["sis","sisx"]
  },
  "application/vnd.syncml+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["xsm"]
  },
  "application/vnd.syncml.dm+wbxml": {
    "source": "iana",
    "charset": "UTF-8",
    "extensions": ["bdm"]
  },
  "application/vnd.syncml.dm+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["xdm"]
  },
  "application/vnd.syncml.dm.notification": {
    "source": "iana"
  },
  "application/vnd.syncml.dmddf+wbxml": {
    "source": "iana"
  },
  "application/vnd.syncml.dmddf+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["ddf"]
  },
  "application/vnd.syncml.dmtnds+wbxml": {
    "source": "iana"
  },
  "application/vnd.syncml.dmtnds+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.syncml.ds.notification": {
    "source": "iana"
  },
  "application/vnd.tableschema+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.tao.intent-module-archive": {
    "source": "iana",
    "extensions": ["tao"]
  },
  "application/vnd.tcpdump.pcap": {
    "source": "iana",
    "extensions": ["pcap","cap","dmp"]
  },
  "application/vnd.think-cell.ppttc+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.tmd.mediaflex.api+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.tml": {
    "source": "iana"
  },
  "application/vnd.tmobile-livetv": {
    "source": "iana",
    "extensions": ["tmo"]
  },
  "application/vnd.tri.onesource": {
    "source": "iana"
  },
  "application/vnd.trid.tpt": {
    "source": "iana",
    "extensions": ["tpt"]
  },
  "application/vnd.triscape.mxs": {
    "source": "iana",
    "extensions": ["mxs"]
  },
  "application/vnd.trueapp": {
    "source": "iana",
    "extensions": ["tra"]
  },
  "application/vnd.truedoc": {
    "source": "iana"
  },
  "application/vnd.ubisoft.webplayer": {
    "source": "iana"
  },
  "application/vnd.ufdl": {
    "source": "iana",
    "extensions": ["ufd","ufdl"]
  },
  "application/vnd.uiq.theme": {
    "source": "iana",
    "extensions": ["utz"]
  },
  "application/vnd.umajin": {
    "source": "iana",
    "extensions": ["umj"]
  },
  "application/vnd.unity": {
    "source": "iana",
    "extensions": ["unityweb"]
  },
  "application/vnd.uoml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["uoml"]
  },
  "application/vnd.uplanet.alert": {
    "source": "iana"
  },
  "application/vnd.uplanet.alert-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.bearer-choice": {
    "source": "iana"
  },
  "application/vnd.uplanet.bearer-choice-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.cacheop": {
    "source": "iana"
  },
  "application/vnd.uplanet.cacheop-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.channel": {
    "source": "iana"
  },
  "application/vnd.uplanet.channel-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.list": {
    "source": "iana"
  },
  "application/vnd.uplanet.list-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.listcmd": {
    "source": "iana"
  },
  "application/vnd.uplanet.listcmd-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.signal": {
    "source": "iana"
  },
  "application/vnd.uri-map": {
    "source": "iana"
  },
  "application/vnd.valve.source.material": {
    "source": "iana"
  },
  "application/vnd.vcx": {
    "source": "iana",
    "extensions": ["vcx"]
  },
  "application/vnd.vd-study": {
    "source": "iana"
  },
  "application/vnd.vectorworks": {
    "source": "iana"
  },
  "application/vnd.vel+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.verimatrix.vcas": {
    "source": "iana"
  },
  "application/vnd.veryant.thin": {
    "source": "iana"
  },
  "application/vnd.ves.encrypted": {
    "source": "iana"
  },
  "application/vnd.vidsoft.vidconference": {
    "source": "iana"
  },
  "application/vnd.visio": {
    "source": "iana",
    "extensions": ["vsd","vst","vss","vsw"]
  },
  "application/vnd.visionary": {
    "source": "iana",
    "extensions": ["vis"]
  },
  "application/vnd.vividence.scriptfile": {
    "source": "iana"
  },
  "application/vnd.vsf": {
    "source": "iana",
    "extensions": ["vsf"]
  },
  "application/vnd.wap.sic": {
    "source": "iana"
  },
  "application/vnd.wap.slc": {
    "source": "iana"
  },
  "application/vnd.wap.wbxml": {
    "source": "iana",
    "charset": "UTF-8",
    "extensions": ["wbxml"]
  },
  "application/vnd.wap.wmlc": {
    "source": "iana",
    "extensions": ["wmlc"]
  },
  "application/vnd.wap.wmlscriptc": {
    "source": "iana",
    "extensions": ["wmlsc"]
  },
  "application/vnd.webturbo": {
    "source": "iana",
    "extensions": ["wtb"]
  },
  "application/vnd.wfa.p2p": {
    "source": "iana"
  },
  "application/vnd.wfa.wsc": {
    "source": "iana"
  },
  "application/vnd.windows.devicepairing": {
    "source": "iana"
  },
  "application/vnd.wmc": {
    "source": "iana"
  },
  "application/vnd.wmf.bootstrap": {
    "source": "iana"
  },
  "application/vnd.wolfram.mathematica": {
    "source": "iana"
  },
  "application/vnd.wolfram.mathematica.package": {
    "source": "iana"
  },
  "application/vnd.wolfram.player": {
    "source": "iana",
    "extensions": ["nbp"]
  },
  "application/vnd.wordperfect": {
    "source": "iana",
    "extensions": ["wpd"]
  },
  "application/vnd.wqd": {
    "source": "iana",
    "extensions": ["wqd"]
  },
  "application/vnd.wrq-hp3000-labelled": {
    "source": "iana"
  },
  "application/vnd.wt.stf": {
    "source": "iana",
    "extensions": ["stf"]
  },
  "application/vnd.wv.csp+wbxml": {
    "source": "iana"
  },
  "application/vnd.wv.csp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.wv.ssp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.xacml+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.xara": {
    "source": "iana",
    "extensions": ["xar"]
  },
  "application/vnd.xfdl": {
    "source": "iana",
    "extensions": ["xfdl"]
  },
  "application/vnd.xfdl.webform": {
    "source": "iana"
  },
  "application/vnd.xmi+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.xmpie.cpkg": {
    "source": "iana"
  },
  "application/vnd.xmpie.dpkg": {
    "source": "iana"
  },
  "application/vnd.xmpie.plan": {
    "source": "iana"
  },
  "application/vnd.xmpie.ppkg": {
    "source": "iana"
  },
  "application/vnd.xmpie.xlim": {
    "source": "iana"
  },
  "application/vnd.yamaha.hv-dic": {
    "source": "iana",
    "extensions": ["hvd"]
  },
  "application/vnd.yamaha.hv-script": {
    "source": "iana",
    "extensions": ["hvs"]
  },
  "application/vnd.yamaha.hv-voice": {
    "source": "iana",
    "extensions": ["hvp"]
  },
  "application/vnd.yamaha.openscoreformat": {
    "source": "iana",
    "extensions": ["osf"]
  },
  "application/vnd.yamaha.openscoreformat.osfpvg+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["osfpvg"]
  },
  "application/vnd.yamaha.remote-setup": {
    "source": "iana"
  },
  "application/vnd.yamaha.smaf-audio": {
    "source": "iana",
    "extensions": ["saf"]
  },
  "application/vnd.yamaha.smaf-phrase": {
    "source": "iana",
    "extensions": ["spf"]
  },
  "application/vnd.yamaha.through-ngn": {
    "source": "iana"
  },
  "application/vnd.yamaha.tunnel-udpencap": {
    "source": "iana"
  },
  "application/vnd.yaoweme": {
    "source": "iana"
  },
  "application/vnd.yellowriver-custom-menu": {
    "source": "iana",
    "extensions": ["cmp"]
  },
  "application/vnd.youtube.yt": {
    "source": "iana"
  },
  "application/vnd.zul": {
    "source": "iana",
    "extensions": ["zir","zirz"]
  },
  "application/vnd.zzazz.deck+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["zaz"]
  },
  "application/voicexml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["vxml"]
  },
  "application/voucher-cms+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vq-rtcpxr": {
    "source": "iana"
  },
  "application/wasm": {
    "compressible": true,
    "extensions": ["wasm"]
  },
  "application/watcherinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/webpush-options+json": {
    "source": "iana",
    "compressible": true
  },
  "application/whoispp-query": {
    "source": "iana"
  },
  "application/whoispp-response": {
    "source": "iana"
  },
  "application/widget": {
    "source": "iana",
    "extensions": ["wgt"]
  },
  "application/winhlp": {
    "source": "apache",
    "extensions": ["hlp"]
  },
  "application/wita": {
    "source": "iana"
  },
  "application/wordperfect5.1": {
    "source": "iana"
  },
  "application/wsdl+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wsdl"]
  },
  "application/wspolicy+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wspolicy"]
  },
  "application/x-7z-compressed": {
    "source": "apache",
    "compressible": false,
    "extensions": ["7z"]
  },
  "application/x-abiword": {
    "source": "apache",
    "extensions": ["abw"]
  },
  "application/x-ace-compressed": {
    "source": "apache",
    "extensions": ["ace"]
  },
  "application/x-amf": {
    "source": "apache"
  },
  "application/x-apple-diskimage": {
    "source": "apache",
    "extensions": ["dmg"]
  },
  "application/x-arj": {
    "compressible": false,
    "extensions": ["arj"]
  },
  "application/x-authorware-bin": {
    "source": "apache",
    "extensions": ["aab","x32","u32","vox"]
  },
  "application/x-authorware-map": {
    "source": "apache",
    "extensions": ["aam"]
  },
  "application/x-authorware-seg": {
    "source": "apache",
    "extensions": ["aas"]
  },
  "application/x-bcpio": {
    "source": "apache",
    "extensions": ["bcpio"]
  },
  "application/x-bdoc": {
    "compressible": false,
    "extensions": ["bdoc"]
  },
  "application/x-bittorrent": {
    "source": "apache",
    "extensions": ["torrent"]
  },
  "application/x-blorb": {
    "source": "apache",
    "extensions": ["blb","blorb"]
  },
  "application/x-bzip": {
    "source": "apache",
    "compressible": false,
    "extensions": ["bz"]
  },
  "application/x-bzip2": {
    "source": "apache",
    "compressible": false,
    "extensions": ["bz2","boz"]
  },
  "application/x-cbr": {
    "source": "apache",
    "extensions": ["cbr","cba","cbt","cbz","cb7"]
  },
  "application/x-cdlink": {
    "source": "apache",
    "extensions": ["vcd"]
  },
  "application/x-cfs-compressed": {
    "source": "apache",
    "extensions": ["cfs"]
  },
  "application/x-chat": {
    "source": "apache",
    "extensions": ["chat"]
  },
  "application/x-chess-pgn": {
    "source": "apache",
    "extensions": ["pgn"]
  },
  "application/x-chrome-extension": {
    "extensions": ["crx"]
  },
  "application/x-cocoa": {
    "source": "nginx",
    "extensions": ["cco"]
  },
  "application/x-compress": {
    "source": "apache"
  },
  "application/x-conference": {
    "source": "apache",
    "extensions": ["nsc"]
  },
  "application/x-cpio": {
    "source": "apache",
    "extensions": ["cpio"]
  },
  "application/x-csh": {
    "source": "apache",
    "extensions": ["csh"]
  },
  "application/x-deb": {
    "compressible": false
  },
  "application/x-debian-package": {
    "source": "apache",
    "extensions": ["deb","udeb"]
  },
  "application/x-dgc-compressed": {
    "source": "apache",
    "extensions": ["dgc"]
  },
  "application/x-director": {
    "source": "apache",
    "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]
  },
  "application/x-doom": {
    "source": "apache",
    "extensions": ["wad"]
  },
  "application/x-dtbncx+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["ncx"]
  },
  "application/x-dtbook+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["dtb"]
  },
  "application/x-dtbresource+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["res"]
  },
  "application/x-dvi": {
    "source": "apache",
    "compressible": false,
    "extensions": ["dvi"]
  },
  "application/x-envoy": {
    "source": "apache",
    "extensions": ["evy"]
  },
  "application/x-eva": {
    "source": "apache",
    "extensions": ["eva"]
  },
  "application/x-font-bdf": {
    "source": "apache",
    "extensions": ["bdf"]
  },
  "application/x-font-dos": {
    "source": "apache"
  },
  "application/x-font-framemaker": {
    "source": "apache"
  },
  "application/x-font-ghostscript": {
    "source": "apache",
    "extensions": ["gsf"]
  },
  "application/x-font-libgrx": {
    "source": "apache"
  },
  "application/x-font-linux-psf": {
    "source": "apache",
    "extensions": ["psf"]
  },
  "application/x-font-pcf": {
    "source": "apache",
    "extensions": ["pcf"]
  },
  "application/x-font-snf": {
    "source": "apache",
    "extensions": ["snf"]
  },
  "application/x-font-speedo": {
    "source": "apache"
  },
  "application/x-font-sunos-news": {
    "source": "apache"
  },
  "application/x-font-type1": {
    "source": "apache",
    "extensions": ["pfa","pfb","pfm","afm"]
  },
  "application/x-font-vfont": {
    "source": "apache"
  },
  "application/x-freearc": {
    "source": "apache",
    "extensions": ["arc"]
  },
  "application/x-futuresplash": {
    "source": "apache",
    "extensions": ["spl"]
  },
  "application/x-gca-compressed": {
    "source": "apache",
    "extensions": ["gca"]
  },
  "application/x-glulx": {
    "source": "apache",
    "extensions": ["ulx"]
  },
  "application/x-gnumeric": {
    "source": "apache",
    "extensions": ["gnumeric"]
  },
  "application/x-gramps-xml": {
    "source": "apache",
    "extensions": ["gramps"]
  },
  "application/x-gtar": {
    "source": "apache",
    "extensions": ["gtar"]
  },
  "application/x-gzip": {
    "source": "apache"
  },
  "application/x-hdf": {
    "source": "apache",
    "extensions": ["hdf"]
  },
  "application/x-httpd-php": {
    "compressible": true,
    "extensions": ["php"]
  },
  "application/x-install-instructions": {
    "source": "apache",
    "extensions": ["install"]
  },
  "application/x-iso9660-image": {
    "source": "apache",
    "extensions": ["iso"]
  },
  "application/x-java-archive-diff": {
    "source": "nginx",
    "extensions": ["jardiff"]
  },
  "application/x-java-jnlp-file": {
    "source": "apache",
    "compressible": false,
    "extensions": ["jnlp"]
  },
  "application/x-javascript": {
    "compressible": true
  },
  "application/x-keepass2": {
    "extensions": ["kdbx"]
  },
  "application/x-latex": {
    "source": "apache",
    "compressible": false,
    "extensions": ["latex"]
  },
  "application/x-lua-bytecode": {
    "extensions": ["luac"]
  },
  "application/x-lzh-compressed": {
    "source": "apache",
    "extensions": ["lzh","lha"]
  },
  "application/x-makeself": {
    "source": "nginx",
    "extensions": ["run"]
  },
  "application/x-mie": {
    "source": "apache",
    "extensions": ["mie"]
  },
  "application/x-mobipocket-ebook": {
    "source": "apache",
    "extensions": ["prc","mobi"]
  },
  "application/x-mpegurl": {
    "compressible": false
  },
  "application/x-ms-application": {
    "source": "apache",
    "extensions": ["application"]
  },
  "application/x-ms-shortcut": {
    "source": "apache",
    "extensions": ["lnk"]
  },
  "application/x-ms-wmd": {
    "source": "apache",
    "extensions": ["wmd"]
  },
  "application/x-ms-wmz": {
    "source": "apache",
    "extensions": ["wmz"]
  },
  "application/x-ms-xbap": {
    "source": "apache",
    "extensions": ["xbap"]
  },
  "application/x-msaccess": {
    "source": "apache",
    "extensions": ["mdb"]
  },
  "application/x-msbinder": {
    "source": "apache",
    "extensions": ["obd"]
  },
  "application/x-mscardfile": {
    "source": "apache",
    "extensions": ["crd"]
  },
  "application/x-msclip": {
    "source": "apache",
    "extensions": ["clp"]
  },
  "application/x-msdos-program": {
    "extensions": ["exe"]
  },
  "application/x-msdownload": {
    "source": "apache",
    "extensions": ["exe","dll","com","bat","msi"]
  },
  "application/x-msmediaview": {
    "source": "apache",
    "extensions": ["mvb","m13","m14"]
  },
  "application/x-msmetafile": {
    "source": "apache",
    "extensions": ["wmf","wmz","emf","emz"]
  },
  "application/x-msmoney": {
    "source": "apache",
    "extensions": ["mny"]
  },
  "application/x-mspublisher": {
    "source": "apache",
    "extensions": ["pub"]
  },
  "application/x-msschedule": {
    "source": "apache",
    "extensions": ["scd"]
  },
  "application/x-msterminal": {
    "source": "apache",
    "extensions": ["trm"]
  },
  "application/x-mswrite": {
    "source": "apache",
    "extensions": ["wri"]
  },
  "application/x-netcdf": {
    "source": "apache",
    "extensions": ["nc","cdf"]
  },
  "application/x-ns-proxy-autoconfig": {
    "compressible": true,
    "extensions": ["pac"]
  },
  "application/x-nzb": {
    "source": "apache",
    "extensions": ["nzb"]
  },
  "application/x-perl": {
    "source": "nginx",
    "extensions": ["pl","pm"]
  },
  "application/x-pilot": {
    "source": "nginx",
    "extensions": ["prc","pdb"]
  },
  "application/x-pkcs12": {
    "source": "apache",
    "compressible": false,
    "extensions": ["p12","pfx"]
  },
  "application/x-pkcs7-certificates": {
    "source": "apache",
    "extensions": ["p7b","spc"]
  },
  "application/x-pkcs7-certreqresp": {
    "source": "apache",
    "extensions": ["p7r"]
  },
  "application/x-pki-message": {
    "source": "iana"
  },
  "application/x-rar-compressed": {
    "source": "apache",
    "compressible": false,
    "extensions": ["rar"]
  },
  "application/x-redhat-package-manager": {
    "source": "nginx",
    "extensions": ["rpm"]
  },
  "application/x-research-info-systems": {
    "source": "apache",
    "extensions": ["ris"]
  },
  "application/x-sea": {
    "source": "nginx",
    "extensions": ["sea"]
  },
  "application/x-sh": {
    "source": "apache",
    "compressible": true,
    "extensions": ["sh"]
  },
  "application/x-shar": {
    "source": "apache",
    "extensions": ["shar"]
  },
  "application/x-shockwave-flash": {
    "source": "apache",
    "compressible": false,
    "extensions": ["swf"]
  },
  "application/x-silverlight-app": {
    "source": "apache",
    "extensions": ["xap"]
  },
  "application/x-sql": {
    "source": "apache",
    "extensions": ["sql"]
  },
  "application/x-stuffit": {
    "source": "apache",
    "compressible": false,
    "extensions": ["sit"]
  },
  "application/x-stuffitx": {
    "source": "apache",
    "extensions": ["sitx"]
  },
  "application/x-subrip": {
    "source": "apache",
    "extensions": ["srt"]
  },
  "application/x-sv4cpio": {
    "source": "apache",
    "extensions": ["sv4cpio"]
  },
  "application/x-sv4crc": {
    "source": "apache",
    "extensions": ["sv4crc"]
  },
  "application/x-t3vm-image": {
    "source": "apache",
    "extensions": ["t3"]
  },
  "application/x-tads": {
    "source": "apache",
    "extensions": ["gam"]
  },
  "application/x-tar": {
    "source": "apache",
    "compressible": true,
    "extensions": ["tar"]
  },
  "application/x-tcl": {
    "source": "apache",
    "extensions": ["tcl","tk"]
  },
  "application/x-tex": {
    "source": "apache",
    "extensions": ["tex"]
  },
  "application/x-tex-tfm": {
    "source": "apache",
    "extensions": ["tfm"]
  },
  "application/x-texinfo": {
    "source": "apache",
    "extensions": ["texinfo","texi"]
  },
  "application/x-tgif": {
    "source": "apache",
    "extensions": ["obj"]
  },
  "application/x-ustar": {
    "source": "apache",
    "extensions": ["ustar"]
  },
  "application/x-virtualbox-hdd": {
    "compressible": true,
    "extensions": ["hdd"]
  },
  "application/x-virtualbox-ova": {
    "compressible": true,
    "extensions": ["ova"]
  },
  "application/x-virtualbox-ovf": {
    "compressible": true,
    "extensions": ["ovf"]
  },
  "application/x-virtualbox-vbox": {
    "compressible": true,
    "extensions": ["vbox"]
  },
  "application/x-virtualbox-vbox-extpack": {
    "compressible": false,
    "extensions": ["vbox-extpack"]
  },
  "application/x-virtualbox-vdi": {
    "compressible": true,
    "extensions": ["vdi"]
  },
  "application/x-virtualbox-vhd": {
    "compressible": true,
    "extensions": ["vhd"]
  },
  "application/x-virtualbox-vmdk": {
    "compressible": true,
    "extensions": ["vmdk"]
  },
  "application/x-wais-source": {
    "source": "apache",
    "extensions": ["src"]
  },
  "application/x-web-app-manifest+json": {
    "compressible": true,
    "extensions": ["webapp"]
  },
  "application/x-www-form-urlencoded": {
    "source": "iana",
    "compressible": true
  },
  "application/x-x509-ca-cert": {
    "source": "iana",
    "extensions": ["der","crt","pem"]
  },
  "application/x-x509-ca-ra-cert": {
    "source": "iana"
  },
  "application/x-x509-next-ca-cert": {
    "source": "iana"
  },
  "application/x-xfig": {
    "source": "apache",
    "extensions": ["fig"]
  },
  "application/x-xliff+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["xlf"]
  },
  "application/x-xpinstall": {
    "source": "apache",
    "compressible": false,
    "extensions": ["xpi"]
  },
  "application/x-xz": {
    "source": "apache",
    "extensions": ["xz"]
  },
  "application/x-zmachine": {
    "source": "apache",
    "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"]
  },
  "application/x400-bp": {
    "source": "iana"
  },
  "application/xacml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xaml+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["xaml"]
  },
  "application/xcap-att+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xav"]
  },
  "application/xcap-caps+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xca"]
  },
  "application/xcap-diff+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xdf"]
  },
  "application/xcap-el+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xel"]
  },
  "application/xcap-error+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xer"]
  },
  "application/xcap-ns+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xns"]
  },
  "application/xcon-conference-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xcon-conference-info-diff+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xenc+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xenc"]
  },
  "application/xhtml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xhtml","xht"]
  },
  "application/xhtml-voice+xml": {
    "source": "apache",
    "compressible": true
  },
  "application/xliff+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xlf"]
  },
  "application/xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xml","xsl","xsd","rng"]
  },
  "application/xml-dtd": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dtd"]
  },
  "application/xml-external-parsed-entity": {
    "source": "iana"
  },
  "application/xml-patch+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xmpp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xop+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xop"]
  },
  "application/xproc+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["xpl"]
  },
  "application/xslt+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xslt"]
  },
  "application/xspf+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["xspf"]
  },
  "application/xv+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mxml","xhvml","xvml","xvm"]
  },
  "application/yang": {
    "source": "iana",
    "extensions": ["yang"]
  },
  "application/yang-data+json": {
    "source": "iana",
    "compressible": true
  },
  "application/yang-data+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/yang-patch+json": {
    "source": "iana",
    "compressible": true
  },
  "application/yang-patch+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/yin+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["yin"]
  },
  "application/zip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["zip"]
  },
  "application/zlib": {
    "source": "iana"
  },
  "application/zstd": {
    "source": "iana"
  },
  "audio/1d-interleaved-parityfec": {
    "source": "iana"
  },
  "audio/32kadpcm": {
    "source": "iana"
  },
  "audio/3gpp": {
    "source": "iana",
    "compressible": false,
    "extensions": ["3gpp"]
  },
  "audio/3gpp2": {
    "source": "iana"
  },
  "audio/aac": {
    "source": "iana"
  },
  "audio/ac3": {
    "source": "iana"
  },
  "audio/adpcm": {
    "source": "apache",
    "extensions": ["adp"]
  },
  "audio/amr": {
    "source": "iana"
  },
  "audio/amr-wb": {
    "source": "iana"
  },
  "audio/amr-wb+": {
    "source": "iana"
  },
  "audio/aptx": {
    "source": "iana"
  },
  "audio/asc": {
    "source": "iana"
  },
  "audio/atrac-advanced-lossless": {
    "source": "iana"
  },
  "audio/atrac-x": {
    "source": "iana"
  },
  "audio/atrac3": {
    "source": "iana"
  },
  "audio/basic": {
    "source": "iana",
    "compressible": false,
    "extensions": ["au","snd"]
  },
  "audio/bv16": {
    "source": "iana"
  },
  "audio/bv32": {
    "source": "iana"
  },
  "audio/clearmode": {
    "source": "iana"
  },
  "audio/cn": {
    "source": "iana"
  },
  "audio/dat12": {
    "source": "iana"
  },
  "audio/dls": {
    "source": "iana"
  },
  "audio/dsr-es201108": {
    "source": "iana"
  },
  "audio/dsr-es202050": {
    "source": "iana"
  },
  "audio/dsr-es202211": {
    "source": "iana"
  },
  "audio/dsr-es202212": {
    "source": "iana"
  },
  "audio/dv": {
    "source": "iana"
  },
  "audio/dvi4": {
    "source": "iana"
  },
  "audio/eac3": {
    "source": "iana"
  },
  "audio/encaprtp": {
    "source": "iana"
  },
  "audio/evrc": {
    "source": "iana"
  },
  "audio/evrc-qcp": {
    "source": "iana"
  },
  "audio/evrc0": {
    "source": "iana"
  },
  "audio/evrc1": {
    "source": "iana"
  },
  "audio/evrcb": {
    "source": "iana"
  },
  "audio/evrcb0": {
    "source": "iana"
  },
  "audio/evrcb1": {
    "source": "iana"
  },
  "audio/evrcnw": {
    "source": "iana"
  },
  "audio/evrcnw0": {
    "source": "iana"
  },
  "audio/evrcnw1": {
    "source": "iana"
  },
  "audio/evrcwb": {
    "source": "iana"
  },
  "audio/evrcwb0": {
    "source": "iana"
  },
  "audio/evrcwb1": {
    "source": "iana"
  },
  "audio/evs": {
    "source": "iana"
  },
  "audio/flexfec": {
    "source": "iana"
  },
  "audio/fwdred": {
    "source": "iana"
  },
  "audio/g711-0": {
    "source": "iana"
  },
  "audio/g719": {
    "source": "iana"
  },
  "audio/g722": {
    "source": "iana"
  },
  "audio/g7221": {
    "source": "iana"
  },
  "audio/g723": {
    "source": "iana"
  },
  "audio/g726-16": {
    "source": "iana"
  },
  "audio/g726-24": {
    "source": "iana"
  },
  "audio/g726-32": {
    "source": "iana"
  },
  "audio/g726-40": {
    "source": "iana"
  },
  "audio/g728": {
    "source": "iana"
  },
  "audio/g729": {
    "source": "iana"
  },
  "audio/g7291": {
    "source": "iana"
  },
  "audio/g729d": {
    "source": "iana"
  },
  "audio/g729e": {
    "source": "iana"
  },
  "audio/gsm": {
    "source": "iana"
  },
  "audio/gsm-efr": {
    "source": "iana"
  },
  "audio/gsm-hr-08": {
    "source": "iana"
  },
  "audio/ilbc": {
    "source": "iana"
  },
  "audio/ip-mr_v2.5": {
    "source": "iana"
  },
  "audio/isac": {
    "source": "apache"
  },
  "audio/l16": {
    "source": "iana"
  },
  "audio/l20": {
    "source": "iana"
  },
  "audio/l24": {
    "source": "iana",
    "compressible": false
  },
  "audio/l8": {
    "source": "iana"
  },
  "audio/lpc": {
    "source": "iana"
  },
  "audio/melp": {
    "source": "iana"
  },
  "audio/melp1200": {
    "source": "iana"
  },
  "audio/melp2400": {
    "source": "iana"
  },
  "audio/melp600": {
    "source": "iana"
  },
  "audio/mhas": {
    "source": "iana"
  },
  "audio/midi": {
    "source": "apache",
    "extensions": ["mid","midi","kar","rmi"]
  },
  "audio/mobile-xmf": {
    "source": "iana",
    "extensions": ["mxmf"]
  },
  "audio/mp3": {
    "compressible": false,
    "extensions": ["mp3"]
  },
  "audio/mp4": {
    "source": "iana",
    "compressible": false,
    "extensions": ["m4a","mp4a"]
  },
  "audio/mp4a-latm": {
    "source": "iana"
  },
  "audio/mpa": {
    "source": "iana"
  },
  "audio/mpa-robust": {
    "source": "iana"
  },
  "audio/mpeg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"]
  },
  "audio/mpeg4-generic": {
    "source": "iana"
  },
  "audio/musepack": {
    "source": "apache"
  },
  "audio/ogg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["oga","ogg","spx"]
  },
  "audio/opus": {
    "source": "iana"
  },
  "audio/parityfec": {
    "source": "iana"
  },
  "audio/pcma": {
    "source": "iana"
  },
  "audio/pcma-wb": {
    "source": "iana"
  },
  "audio/pcmu": {
    "source": "iana"
  },
  "audio/pcmu-wb": {
    "source": "iana"
  },
  "audio/prs.sid": {
    "source": "iana"
  },
  "audio/qcelp": {
    "source": "iana"
  },
  "audio/raptorfec": {
    "source": "iana"
  },
  "audio/red": {
    "source": "iana"
  },
  "audio/rtp-enc-aescm128": {
    "source": "iana"
  },
  "audio/rtp-midi": {
    "source": "iana"
  },
  "audio/rtploopback": {
    "source": "iana"
  },
  "audio/rtx": {
    "source": "iana"
  },
  "audio/s3m": {
    "source": "apache",
    "extensions": ["s3m"]
  },
  "audio/silk": {
    "source": "apache",
    "extensions": ["sil"]
  },
  "audio/smv": {
    "source": "iana"
  },
  "audio/smv-qcp": {
    "source": "iana"
  },
  "audio/smv0": {
    "source": "iana"
  },
  "audio/sp-midi": {
    "source": "iana"
  },
  "audio/speex": {
    "source": "iana"
  },
  "audio/t140c": {
    "source": "iana"
  },
  "audio/t38": {
    "source": "iana"
  },
  "audio/telephone-event": {
    "source": "iana"
  },
  "audio/tetra_acelp": {
    "source": "iana"
  },
  "audio/tetra_acelp_bb": {
    "source": "iana"
  },
  "audio/tone": {
    "source": "iana"
  },
  "audio/uemclip": {
    "source": "iana"
  },
  "audio/ulpfec": {
    "source": "iana"
  },
  "audio/usac": {
    "source": "iana"
  },
  "audio/vdvi": {
    "source": "iana"
  },
  "audio/vmr-wb": {
    "source": "iana"
  },
  "audio/vnd.3gpp.iufp": {
    "source": "iana"
  },
  "audio/vnd.4sb": {
    "source": "iana"
  },
  "audio/vnd.audiokoz": {
    "source": "iana"
  },
  "audio/vnd.celp": {
    "source": "iana"
  },
  "audio/vnd.cisco.nse": {
    "source": "iana"
  },
  "audio/vnd.cmles.radio-events": {
    "source": "iana"
  },
  "audio/vnd.cns.anp1": {
    "source": "iana"
  },
  "audio/vnd.cns.inf1": {
    "source": "iana"
  },
  "audio/vnd.dece.audio": {
    "source": "iana",
    "extensions": ["uva","uvva"]
  },
  "audio/vnd.digital-winds": {
    "source": "iana",
    "extensions": ["eol"]
  },
  "audio/vnd.dlna.adts": {
    "source": "iana"
  },
  "audio/vnd.dolby.heaac.1": {
    "source": "iana"
  },
  "audio/vnd.dolby.heaac.2": {
    "source": "iana"
  },
  "audio/vnd.dolby.mlp": {
    "source": "iana"
  },
  "audio/vnd.dolby.mps": {
    "source": "iana"
  },
  "audio/vnd.dolby.pl2": {
    "source": "iana"
  },
  "audio/vnd.dolby.pl2x": {
    "source": "iana"
  },
  "audio/vnd.dolby.pl2z": {
    "source": "iana"
  },
  "audio/vnd.dolby.pulse.1": {
    "source": "iana"
  },
  "audio/vnd.dra": {
    "source": "iana",
    "extensions": ["dra"]
  },
  "audio/vnd.dts": {
    "source": "iana",
    "extensions": ["dts"]
  },
  "audio/vnd.dts.hd": {
    "source": "iana",
    "extensions": ["dtshd"]
  },
  "audio/vnd.dts.uhd": {
    "source": "iana"
  },
  "audio/vnd.dvb.file": {
    "source": "iana"
  },
  "audio/vnd.everad.plj": {
    "source": "iana"
  },
  "audio/vnd.hns.audio": {
    "source": "iana"
  },
  "audio/vnd.lucent.voice": {
    "source": "iana",
    "extensions": ["lvp"]
  },
  "audio/vnd.ms-playready.media.pya": {
    "source": "iana",
    "extensions": ["pya"]
  },
  "audio/vnd.nokia.mobile-xmf": {
    "source": "iana"
  },
  "audio/vnd.nortel.vbk": {
    "source": "iana"
  },
  "audio/vnd.nuera.ecelp4800": {
    "source": "iana",
    "extensions": ["ecelp4800"]
  },
  "audio/vnd.nuera.ecelp7470": {
    "source": "iana",
    "extensions": ["ecelp7470"]
  },
  "audio/vnd.nuera.ecelp9600": {
    "source": "iana",
    "extensions": ["ecelp9600"]
  },
  "audio/vnd.octel.sbc": {
    "source": "iana"
  },
  "audio/vnd.presonus.multitrack": {
    "source": "iana"
  },
  "audio/vnd.qcelp": {
    "source": "iana"
  },
  "audio/vnd.rhetorex.32kadpcm": {
    "source": "iana"
  },
  "audio/vnd.rip": {
    "source": "iana",
    "extensions": ["rip"]
  },
  "audio/vnd.rn-realaudio": {
    "compressible": false
  },
  "audio/vnd.sealedmedia.softseal.mpeg": {
    "source": "iana"
  },
  "audio/vnd.vmx.cvsd": {
    "source": "iana"
  },
  "audio/vnd.wave": {
    "compressible": false
  },
  "audio/vorbis": {
    "source": "iana",
    "compressible": false
  },
  "audio/vorbis-config": {
    "source": "iana"
  },
  "audio/wav": {
    "compressible": false,
    "extensions": ["wav"]
  },
  "audio/wave": {
    "compressible": false,
    "extensions": ["wav"]
  },
  "audio/webm": {
    "source": "apache",
    "compressible": false,
    "extensions": ["weba"]
  },
  "audio/x-aac": {
    "source": "apache",
    "compressible": false,
    "extensions": ["aac"]
  },
  "audio/x-aiff": {
    "source": "apache",
    "extensions": ["aif","aiff","aifc"]
  },
  "audio/x-caf": {
    "source": "apache",
    "compressible": false,
    "extensions": ["caf"]
  },
  "audio/x-flac": {
    "source": "apache",
    "extensions": ["flac"]
  },
  "audio/x-m4a": {
    "source": "nginx",
    "extensions": ["m4a"]
  },
  "audio/x-matroska": {
    "source": "apache",
    "extensions": ["mka"]
  },
  "audio/x-mpegurl": {
    "source": "apache",
    "extensions": ["m3u"]
  },
  "audio/x-ms-wax": {
    "source": "apache",
    "extensions": ["wax"]
  },
  "audio/x-ms-wma": {
    "source": "apache",
    "extensions": ["wma"]
  },
  "audio/x-pn-realaudio": {
    "source": "apache",
    "extensions": ["ram","ra"]
  },
  "audio/x-pn-realaudio-plugin": {
    "source": "apache",
    "extensions": ["rmp"]
  },
  "audio/x-realaudio": {
    "source": "nginx",
    "extensions": ["ra"]
  },
  "audio/x-tta": {
    "source": "apache"
  },
  "audio/x-wav": {
    "source": "apache",
    "extensions": ["wav"]
  },
  "audio/xm": {
    "source": "apache",
    "extensions": ["xm"]
  },
  "chemical/x-cdx": {
    "source": "apache",
    "extensions": ["cdx"]
  },
  "chemical/x-cif": {
    "source": "apache",
    "extensions": ["cif"]
  },
  "chemical/x-cmdf": {
    "source": "apache",
    "extensions": ["cmdf"]
  },
  "chemical/x-cml": {
    "source": "apache",
    "extensions": ["cml"]
  },
  "chemical/x-csml": {
    "source": "apache",
    "extensions": ["csml"]
  },
  "chemical/x-pdb": {
    "source": "apache"
  },
  "chemical/x-xyz": {
    "source": "apache",
    "extensions": ["xyz"]
  },
  "font/collection": {
    "source": "iana",
    "extensions": ["ttc"]
  },
  "font/otf": {
    "source": "iana",
    "compressible": true,
    "extensions": ["otf"]
  },
  "font/sfnt": {
    "source": "iana"
  },
  "font/ttf": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ttf"]
  },
  "font/woff": {
    "source": "iana",
    "extensions": ["woff"]
  },
  "font/woff2": {
    "source": "iana",
    "extensions": ["woff2"]
  },
  "image/aces": {
    "source": "iana",
    "extensions": ["exr"]
  },
  "image/apng": {
    "compressible": false,
    "extensions": ["apng"]
  },
  "image/avci": {
    "source": "iana"
  },
  "image/avcs": {
    "source": "iana"
  },
  "image/bmp": {
    "source": "iana",
    "compressible": true,
    "extensions": ["bmp"]
  },
  "image/cgm": {
    "source": "iana",
    "extensions": ["cgm"]
  },
  "image/dicom-rle": {
    "source": "iana",
    "extensions": ["drle"]
  },
  "image/emf": {
    "source": "iana",
    "extensions": ["emf"]
  },
  "image/fits": {
    "source": "iana",
    "extensions": ["fits"]
  },
  "image/g3fax": {
    "source": "iana",
    "extensions": ["g3"]
  },
  "image/gif": {
    "source": "iana",
    "compressible": false,
    "extensions": ["gif"]
  },
  "image/heic": {
    "source": "iana",
    "extensions": ["heic"]
  },
  "image/heic-sequence": {
    "source": "iana",
    "extensions": ["heics"]
  },
  "image/heif": {
    "source": "iana",
    "extensions": ["heif"]
  },
  "image/heif-sequence": {
    "source": "iana",
    "extensions": ["heifs"]
  },
  "image/hej2k": {
    "source": "iana",
    "extensions": ["hej2"]
  },
  "image/hsj2": {
    "source": "iana",
    "extensions": ["hsj2"]
  },
  "image/ief": {
    "source": "iana",
    "extensions": ["ief"]
  },
  "image/jls": {
    "source": "iana",
    "extensions": ["jls"]
  },
  "image/jp2": {
    "source": "iana",
    "compressible": false,
    "extensions": ["jp2","jpg2"]
  },
  "image/jpeg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["jpeg","jpg","jpe"]
  },
  "image/jph": {
    "source": "iana",
    "extensions": ["jph"]
  },
  "image/jphc": {
    "source": "iana",
    "extensions": ["jhc"]
  },
  "image/jpm": {
    "source": "iana",
    "compressible": false,
    "extensions": ["jpm"]
  },
  "image/jpx": {
    "source": "iana",
    "compressible": false,
    "extensions": ["jpx","jpf"]
  },
  "image/jxr": {
    "source": "iana",
    "extensions": ["jxr"]
  },
  "image/jxra": {
    "source": "iana",
    "extensions": ["jxra"]
  },
  "image/jxrs": {
    "source": "iana",
    "extensions": ["jxrs"]
  },
  "image/jxs": {
    "source": "iana",
    "extensions": ["jxs"]
  },
  "image/jxsc": {
    "source": "iana",
    "extensions": ["jxsc"]
  },
  "image/jxsi": {
    "source": "iana",
    "extensions": ["jxsi"]
  },
  "image/jxss": {
    "source": "iana",
    "extensions": ["jxss"]
  },
  "image/ktx": {
    "source": "iana",
    "extensions": ["ktx"]
  },
  "image/naplps": {
    "source": "iana"
  },
  "image/pjpeg": {
    "compressible": false
  },
  "image/png": {
    "source": "iana",
    "compressible": false,
    "extensions": ["png"]
  },
  "image/prs.btif": {
    "source": "iana",
    "extensions": ["btif"]
  },
  "image/prs.pti": {
    "source": "iana",
    "extensions": ["pti"]
  },
  "image/pwg-raster": {
    "source": "iana"
  },
  "image/sgi": {
    "source": "apache",
    "extensions": ["sgi"]
  },
  "image/svg+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["svg","svgz"]
  },
  "image/t38": {
    "source": "iana",
    "extensions": ["t38"]
  },
  "image/tiff": {
    "source": "iana",
    "compressible": false,
    "extensions": ["tif","tiff"]
  },
  "image/tiff-fx": {
    "source": "iana",
    "extensions": ["tfx"]
  },
  "image/vnd.adobe.photoshop": {
    "source": "iana",
    "compressible": true,
    "extensions": ["psd"]
  },
  "image/vnd.airzip.accelerator.azv": {
    "source": "iana",
    "extensions": ["azv"]
  },
  "image/vnd.cns.inf2": {
    "source": "iana"
  },
  "image/vnd.dece.graphic": {
    "source": "iana",
    "extensions": ["uvi","uvvi","uvg","uvvg"]
  },
  "image/vnd.djvu": {
    "source": "iana",
    "extensions": ["djvu","djv"]
  },
  "image/vnd.dvb.subtitle": {
    "source": "iana",
    "extensions": ["sub"]
  },
  "image/vnd.dwg": {
    "source": "iana",
    "extensions": ["dwg"]
  },
  "image/vnd.dxf": {
    "source": "iana",
    "extensions": ["dxf"]
  },
  "image/vnd.fastbidsheet": {
    "source": "iana",
    "extensions": ["fbs"]
  },
  "image/vnd.fpx": {
    "source": "iana",
    "extensions": ["fpx"]
  },
  "image/vnd.fst": {
    "source": "iana",
    "extensions": ["fst"]
  },
  "image/vnd.fujixerox.edmics-mmr": {
    "source": "iana",
    "extensions": ["mmr"]
  },
  "image/vnd.fujixerox.edmics-rlc": {
    "source": "iana",
    "extensions": ["rlc"]
  },
  "image/vnd.globalgraphics.pgb": {
    "source": "iana"
  },
  "image/vnd.microsoft.icon": {
    "source": "iana",
    "extensions": ["ico"]
  },
  "image/vnd.mix": {
    "source": "iana"
  },
  "image/vnd.mozilla.apng": {
    "source": "iana"
  },
  "image/vnd.ms-dds": {
    "extensions": ["dds"]
  },
  "image/vnd.ms-modi": {
    "source": "iana",
    "extensions": ["mdi"]
  },
  "image/vnd.ms-photo": {
    "source": "apache",
    "extensions": ["wdp"]
  },
  "image/vnd.net-fpx": {
    "source": "iana",
    "extensions": ["npx"]
  },
  "image/vnd.radiance": {
    "source": "iana"
  },
  "image/vnd.sealed.png": {
    "source": "iana"
  },
  "image/vnd.sealedmedia.softseal.gif": {
    "source": "iana"
  },
  "image/vnd.sealedmedia.softseal.jpg": {
    "source": "iana"
  },
  "image/vnd.svf": {
    "source": "iana"
  },
  "image/vnd.tencent.tap": {
    "source": "iana",
    "extensions": ["tap"]
  },
  "image/vnd.valve.source.texture": {
    "source": "iana",
    "extensions": ["vtf"]
  },
  "image/vnd.wap.wbmp": {
    "source": "iana",
    "extensions": ["wbmp"]
  },
  "image/vnd.xiff": {
    "source": "iana",
    "extensions": ["xif"]
  },
  "image/vnd.zbrush.pcx": {
    "source": "iana",
    "extensions": ["pcx"]
  },
  "image/webp": {
    "source": "apache",
    "extensions": ["webp"]
  },
  "image/wmf": {
    "source": "iana",
    "extensions": ["wmf"]
  },
  "image/x-3ds": {
    "source": "apache",
    "extensions": ["3ds"]
  },
  "image/x-cmu-raster": {
    "source": "apache",
    "extensions": ["ras"]
  },
  "image/x-cmx": {
    "source": "apache",
    "extensions": ["cmx"]
  },
  "image/x-freehand": {
    "source": "apache",
    "extensions": ["fh","fhc","fh4","fh5","fh7"]
  },
  "image/x-icon": {
    "source": "apache",
    "compressible": true,
    "extensions": ["ico"]
  },
  "image/x-jng": {
    "source": "nginx",
    "extensions": ["jng"]
  },
  "image/x-mrsid-image": {
    "source": "apache",
    "extensions": ["sid"]
  },
  "image/x-ms-bmp": {
    "source": "nginx",
    "compressible": true,
    "extensions": ["bmp"]
  },
  "image/x-pcx": {
    "source": "apache",
    "extensions": ["pcx"]
  },
  "image/x-pict": {
    "source": "apache",
    "extensions": ["pic","pct"]
  },
  "image/x-portable-anymap": {
    "source": "apache",
    "extensions": ["pnm"]
  },
  "image/x-portable-bitmap": {
    "source": "apache",
    "extensions": ["pbm"]
  },
  "image/x-portable-graymap": {
    "source": "apache",
    "extensions": ["pgm"]
  },
  "image/x-portable-pixmap": {
    "source": "apache",
    "extensions": ["ppm"]
  },
  "image/x-rgb": {
    "source": "apache",
    "extensions": ["rgb"]
  },
  "image/x-tga": {
    "source": "apache",
    "extensions": ["tga"]
  },
  "image/x-xbitmap": {
    "source": "apache",
    "extensions": ["xbm"]
  },
  "image/x-xcf": {
    "compressible": false
  },
  "image/x-xpixmap": {
    "source": "apache",
    "extensions": ["xpm"]
  },
  "image/x-xwindowdump": {
    "source": "apache",
    "extensions": ["xwd"]
  },
  "message/cpim": {
    "source": "iana"
  },
  "message/delivery-status": {
    "source": "iana"
  },
  "message/disposition-notification": {
    "source": "iana",
    "extensions": [
      "disposition-notification"
    ]
  },
  "message/external-body": {
    "source": "iana"
  },
  "message/feedback-report": {
    "source": "iana"
  },
  "message/global": {
    "source": "iana",
    "extensions": ["u8msg"]
  },
  "message/global-delivery-status": {
    "source": "iana",
    "extensions": ["u8dsn"]
  },
  "message/global-disposition-notification": {
    "source": "iana",
    "extensions": ["u8mdn"]
  },
  "message/global-headers": {
    "source": "iana",
    "extensions": ["u8hdr"]
  },
  "message/http": {
    "source": "iana",
    "compressible": false
  },
  "message/imdn+xml": {
    "source": "iana",
    "compressible": true
  },
  "message/news": {
    "source": "iana"
  },
  "message/partial": {
    "source": "iana",
    "compressible": false
  },
  "message/rfc822": {
    "source": "iana",
    "compressible": true,
    "extensions": ["eml","mime"]
  },
  "message/s-http": {
    "source": "iana"
  },
  "message/sip": {
    "source": "iana"
  },
  "message/sipfrag": {
    "source": "iana"
  },
  "message/tracking-status": {
    "source": "iana"
  },
  "message/vnd.si.simp": {
    "source": "iana"
  },
  "message/vnd.wfa.wsc": {
    "source": "iana",
    "extensions": ["wsc"]
  },
  "model/3mf": {
    "source": "iana",
    "extensions": ["3mf"]
  },
  "model/gltf+json": {
    "source": "iana",
    "compressible": true,
    "extensions": ["gltf"]
  },
  "model/gltf-binary": {
    "source": "iana",
    "compressible": true,
    "extensions": ["glb"]
  },
  "model/iges": {
    "source": "iana",
    "compressible": false,
    "extensions": ["igs","iges"]
  },
  "model/mesh": {
    "source": "iana",
    "compressible": false,
    "extensions": ["msh","mesh","silo"]
  },
  "model/mtl": {
    "source": "iana",
    "extensions": ["mtl"]
  },
  "model/obj": {
    "source": "iana",
    "extensions": ["obj"]
  },
  "model/stl": {
    "source": "iana",
    "extensions": ["stl"]
  },
  "model/vnd.collada+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dae"]
  },
  "model/vnd.dwf": {
    "source": "iana",
    "extensions": ["dwf"]
  },
  "model/vnd.flatland.3dml": {
    "source": "iana"
  },
  "model/vnd.gdl": {
    "source": "iana",
    "extensions": ["gdl"]
  },
  "model/vnd.gs-gdl": {
    "source": "apache"
  },
  "model/vnd.gs.gdl": {
    "source": "iana"
  },
  "model/vnd.gtw": {
    "source": "iana",
    "extensions": ["gtw"]
  },
  "model/vnd.moml+xml": {
    "source": "iana",
    "compressible": true
  },
  "model/vnd.mts": {
    "source": "iana",
    "extensions": ["mts"]
  },
  "model/vnd.opengex": {
    "source": "iana",
    "extensions": ["ogex"]
  },
  "model/vnd.parasolid.transmit.binary": {
    "source": "iana",
    "extensions": ["x_b"]
  },
  "model/vnd.parasolid.transmit.text": {
    "source": "iana",
    "extensions": ["x_t"]
  },
  "model/vnd.rosette.annotated-data-model": {
    "source": "iana"
  },
  "model/vnd.usdz+zip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["usdz"]
  },
  "model/vnd.valve.source.compiled-map": {
    "source": "iana",
    "extensions": ["bsp"]
  },
  "model/vnd.vtu": {
    "source": "iana",
    "extensions": ["vtu"]
  },
  "model/vrml": {
    "source": "iana",
    "compressible": false,
    "extensions": ["wrl","vrml"]
  },
  "model/x3d+binary": {
    "source": "apache",
    "compressible": false,
    "extensions": ["x3db","x3dbz"]
  },
  "model/x3d+fastinfoset": {
    "source": "iana",
    "extensions": ["x3db"]
  },
  "model/x3d+vrml": {
    "source": "apache",
    "compressible": false,
    "extensions": ["x3dv","x3dvz"]
  },
  "model/x3d+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["x3d","x3dz"]
  },
  "model/x3d-vrml": {
    "source": "iana",
    "extensions": ["x3dv"]
  },
  "multipart/alternative": {
    "source": "iana",
    "compressible": false
  },
  "multipart/appledouble": {
    "source": "iana"
  },
  "multipart/byteranges": {
    "source": "iana"
  },
  "multipart/digest": {
    "source": "iana"
  },
  "multipart/encrypted": {
    "source": "iana",
    "compressible": false
  },
  "multipart/form-data": {
    "source": "iana",
    "compressible": false
  },
  "multipart/header-set": {
    "source": "iana"
  },
  "multipart/mixed": {
    "source": "iana"
  },
  "multipart/multilingual": {
    "source": "iana"
  },
  "multipart/parallel": {
    "source": "iana"
  },
  "multipart/related": {
    "source": "iana",
    "compressible": false
  },
  "multipart/report": {
    "source": "iana"
  },
  "multipart/signed": {
    "source": "iana",
    "compressible": false
  },
  "multipart/vnd.bint.med-plus": {
    "source": "iana"
  },
  "multipart/voice-message": {
    "source": "iana"
  },
  "multipart/x-mixed-replace": {
    "source": "iana"
  },
  "text/1d-interleaved-parityfec": {
    "source": "iana"
  },
  "text/cache-manifest": {
    "source": "iana",
    "compressible": true,
    "extensions": ["appcache","manifest"]
  },
  "text/calendar": {
    "source": "iana",
    "extensions": ["ics","ifb"]
  },
  "text/calender": {
    "compressible": true
  },
  "text/cmd": {
    "compressible": true
  },
  "text/coffeescript": {
    "extensions": ["coffee","litcoffee"]
  },
  "text/css": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["css"]
  },
  "text/csv": {
    "source": "iana",
    "compressible": true,
    "extensions": ["csv"]
  },
  "text/csv-schema": {
    "source": "iana"
  },
  "text/directory": {
    "source": "iana"
  },
  "text/dns": {
    "source": "iana"
  },
  "text/ecmascript": {
    "source": "iana"
  },
  "text/encaprtp": {
    "source": "iana"
  },
  "text/enriched": {
    "source": "iana"
  },
  "text/flexfec": {
    "source": "iana"
  },
  "text/fwdred": {
    "source": "iana"
  },
  "text/grammar-ref-list": {
    "source": "iana"
  },
  "text/html": {
    "source": "iana",
    "compressible": true,
    "extensions": ["html","htm","shtml"]
  },
  "text/jade": {
    "extensions": ["jade"]
  },
  "text/javascript": {
    "source": "iana",
    "compressible": true
  },
  "text/jcr-cnd": {
    "source": "iana"
  },
  "text/jsx": {
    "compressible": true,
    "extensions": ["jsx"]
  },
  "text/less": {
    "compressible": true,
    "extensions": ["less"]
  },
  "text/markdown": {
    "source": "iana",
    "compressible": true,
    "extensions": ["markdown","md"]
  },
  "text/mathml": {
    "source": "nginx",
    "extensions": ["mml"]
  },
  "text/mdx": {
    "compressible": true,
    "extensions": ["mdx"]
  },
  "text/mizar": {
    "source": "iana"
  },
  "text/n3": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["n3"]
  },
  "text/parameters": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/parityfec": {
    "source": "iana"
  },
  "text/plain": {
    "source": "iana",
    "compressible": true,
    "extensions": ["txt","text","conf","def","list","log","in","ini"]
  },
  "text/provenance-notation": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/prs.fallenstein.rst": {
    "source": "iana"
  },
  "text/prs.lines.tag": {
    "source": "iana",
    "extensions": ["dsc"]
  },
  "text/prs.prop.logic": {
    "source": "iana"
  },
  "text/raptorfec": {
    "source": "iana"
  },
  "text/red": {
    "source": "iana"
  },
  "text/rfc822-headers": {
    "source": "iana"
  },
  "text/richtext": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rtx"]
  },
  "text/rtf": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rtf"]
  },
  "text/rtp-enc-aescm128": {
    "source": "iana"
  },
  "text/rtploopback": {
    "source": "iana"
  },
  "text/rtx": {
    "source": "iana"
  },
  "text/sgml": {
    "source": "iana",
    "extensions": ["sgml","sgm"]
  },
  "text/shex": {
    "extensions": ["shex"]
  },
  "text/slim": {
    "extensions": ["slim","slm"]
  },
  "text/strings": {
    "source": "iana"
  },
  "text/stylus": {
    "extensions": ["stylus","styl"]
  },
  "text/t140": {
    "source": "iana"
  },
  "text/tab-separated-values": {
    "source": "iana",
    "compressible": true,
    "extensions": ["tsv"]
  },
  "text/troff": {
    "source": "iana",
    "extensions": ["t","tr","roff","man","me","ms"]
  },
  "text/turtle": {
    "source": "iana",
    "charset": "UTF-8",
    "extensions": ["ttl"]
  },
  "text/ulpfec": {
    "source": "iana"
  },
  "text/uri-list": {
    "source": "iana",
    "compressible": true,
    "extensions": ["uri","uris","urls"]
  },
  "text/vcard": {
    "source": "iana",
    "compressible": true,
    "extensions": ["vcard"]
  },
  "text/vnd.a": {
    "source": "iana"
  },
  "text/vnd.abc": {
    "source": "iana"
  },
  "text/vnd.ascii-art": {
    "source": "iana"
  },
  "text/vnd.curl": {
    "source": "iana",
    "extensions": ["curl"]
  },
  "text/vnd.curl.dcurl": {
    "source": "apache",
    "extensions": ["dcurl"]
  },
  "text/vnd.curl.mcurl": {
    "source": "apache",
    "extensions": ["mcurl"]
  },
  "text/vnd.curl.scurl": {
    "source": "apache",
    "extensions": ["scurl"]
  },
  "text/vnd.debian.copyright": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/vnd.dmclientscript": {
    "source": "iana"
  },
  "text/vnd.dvb.subtitle": {
    "source": "iana",
    "extensions": ["sub"]
  },
  "text/vnd.esmertec.theme-descriptor": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/vnd.ficlab.flt": {
    "source": "iana"
  },
  "text/vnd.fly": {
    "source": "iana",
    "extensions": ["fly"]
  },
  "text/vnd.fmi.flexstor": {
    "source": "iana",
    "extensions": ["flx"]
  },
  "text/vnd.gml": {
    "source": "iana"
  },
  "text/vnd.graphviz": {
    "source": "iana",
    "extensions": ["gv"]
  },
  "text/vnd.hgl": {
    "source": "iana"
  },
  "text/vnd.in3d.3dml": {
    "source": "iana",
    "extensions": ["3dml"]
  },
  "text/vnd.in3d.spot": {
    "source": "iana",
    "extensions": ["spot"]
  },
  "text/vnd.iptc.newsml": {
    "source": "iana"
  },
  "text/vnd.iptc.nitf": {
    "source": "iana"
  },
  "text/vnd.latex-z": {
    "source": "iana"
  },
  "text/vnd.motorola.reflex": {
    "source": "iana"
  },
  "text/vnd.ms-mediapackage": {
    "source": "iana"
  },
  "text/vnd.net2phone.commcenter.command": {
    "source": "iana"
  },
  "text/vnd.radisys.msml-basic-layout": {
    "source": "iana"
  },
  "text/vnd.senx.warpscript": {
    "source": "iana"
  },
  "text/vnd.si.uricatalogue": {
    "source": "iana"
  },
  "text/vnd.sosi": {
    "source": "iana"
  },
  "text/vnd.sun.j2me.app-descriptor": {
    "source": "iana",
    "charset": "UTF-8",
    "extensions": ["jad"]
  },
  "text/vnd.trolltech.linguist": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/vnd.wap.si": {
    "source": "iana"
  },
  "text/vnd.wap.sl": {
    "source": "iana"
  },
  "text/vnd.wap.wml": {
    "source": "iana",
    "extensions": ["wml"]
  },
  "text/vnd.wap.wmlscript": {
    "source": "iana",
    "extensions": ["wmls"]
  },
  "text/vtt": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["vtt"]
  },
  "text/x-asm": {
    "source": "apache",
    "extensions": ["s","asm"]
  },
  "text/x-c": {
    "source": "apache",
    "extensions": ["c","cc","cxx","cpp","h","hh","dic"]
  },
  "text/x-component": {
    "source": "nginx",
    "extensions": ["htc"]
  },
  "text/x-fortran": {
    "source": "apache",
    "extensions": ["f","for","f77","f90"]
  },
  "text/x-gwt-rpc": {
    "compressible": true
  },
  "text/x-handlebars-template": {
    "extensions": ["hbs"]
  },
  "text/x-java-source": {
    "source": "apache",
    "extensions": ["java"]
  },
  "text/x-jquery-tmpl": {
    "compressible": true
  },
  "text/x-lua": {
    "extensions": ["lua"]
  },
  "text/x-markdown": {
    "compressible": true,
    "extensions": ["mkd"]
  },
  "text/x-nfo": {
    "source": "apache",
    "extensions": ["nfo"]
  },
  "text/x-opml": {
    "source": "apache",
    "extensions": ["opml"]
  },
  "text/x-org": {
    "compressible": true,
    "extensions": ["org"]
  },
  "text/x-pascal": {
    "source": "apache",
    "extensions": ["p","pas"]
  },
  "text/x-processing": {
    "compressible": true,
    "extensions": ["pde"]
  },
  "text/x-sass": {
    "extensions": ["sass"]
  },
  "text/x-scss": {
    "extensions": ["scss"]
  },
  "text/x-setext": {
    "source": "apache",
    "extensions": ["etx"]
  },
  "text/x-sfv": {
    "source": "apache",
    "extensions": ["sfv"]
  },
  "text/x-suse-ymp": {
    "compressible": true,
    "extensions": ["ymp"]
  },
  "text/x-uuencode": {
    "source": "apache",
    "extensions": ["uu"]
  },
  "text/x-vcalendar": {
    "source": "apache",
    "extensions": ["vcs"]
  },
  "text/x-vcard": {
    "source": "apache",
    "extensions": ["vcf"]
  },
  "text/xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xml"]
  },
  "text/xml-external-parsed-entity": {
    "source": "iana"
  },
  "text/yaml": {
    "extensions": ["yaml","yml"]
  },
  "video/1d-interleaved-parityfec": {
    "source": "iana"
  },
  "video/3gpp": {
    "source": "iana",
    "extensions": ["3gp","3gpp"]
  },
  "video/3gpp-tt": {
    "source": "iana"
  },
  "video/3gpp2": {
    "source": "iana",
    "extensions": ["3g2"]
  },
  "video/bmpeg": {
    "source": "iana"
  },
  "video/bt656": {
    "source": "iana"
  },
  "video/celb": {
    "source": "iana"
  },
  "video/dv": {
    "source": "iana"
  },
  "video/encaprtp": {
    "source": "iana"
  },
  "video/flexfec": {
    "source": "iana"
  },
  "video/h261": {
    "source": "iana",
    "extensions": ["h261"]
  },
  "video/h263": {
    "source": "iana",
    "extensions": ["h263"]
  },
  "video/h263-1998": {
    "source": "iana"
  },
  "video/h263-2000": {
    "source": "iana"
  },
  "video/h264": {
    "source": "iana",
    "extensions": ["h264"]
  },
  "video/h264-rcdo": {
    "source": "iana"
  },
  "video/h264-svc": {
    "source": "iana"
  },
  "video/h265": {
    "source": "iana"
  },
  "video/iso.segment": {
    "source": "iana"
  },
  "video/jpeg": {
    "source": "iana",
    "extensions": ["jpgv"]
  },
  "video/jpeg2000": {
    "source": "iana"
  },
  "video/jpm": {
    "source": "apache",
    "extensions": ["jpm","jpgm"]
  },
  "video/mj2": {
    "source": "iana",
    "extensions": ["mj2","mjp2"]
  },
  "video/mp1s": {
    "source": "iana"
  },
  "video/mp2p": {
    "source": "iana"
  },
  "video/mp2t": {
    "source": "iana",
    "extensions": ["ts"]
  },
  "video/mp4": {
    "source": "iana",
    "compressible": false,
    "extensions": ["mp4","mp4v","mpg4"]
  },
  "video/mp4v-es": {
    "source": "iana"
  },
  "video/mpeg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["mpeg","mpg","mpe","m1v","m2v"]
  },
  "video/mpeg4-generic": {
    "source": "iana"
  },
  "video/mpv": {
    "source": "iana"
  },
  "video/nv": {
    "source": "iana"
  },
  "video/ogg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["ogv"]
  },
  "video/parityfec": {
    "source": "iana"
  },
  "video/pointer": {
    "source": "iana"
  },
  "video/quicktime": {
    "source": "iana",
    "compressible": false,
    "extensions": ["qt","mov"]
  },
  "video/raptorfec": {
    "source": "iana"
  },
  "video/raw": {
    "source": "iana"
  },
  "video/rtp-enc-aescm128": {
    "source": "iana"
  },
  "video/rtploopback": {
    "source": "iana"
  },
  "video/rtx": {
    "source": "iana"
  },
  "video/smpte291": {
    "source": "iana"
  },
  "video/smpte292m": {
    "source": "iana"
  },
  "video/ulpfec": {
    "source": "iana"
  },
  "video/vc1": {
    "source": "iana"
  },
  "video/vc2": {
    "source": "iana"
  },
  "video/vnd.cctv": {
    "source": "iana"
  },
  "video/vnd.dece.hd": {
    "source": "iana",
    "extensions": ["uvh","uvvh"]
  },
  "video/vnd.dece.mobile": {
    "source": "iana",
    "extensions": ["uvm","uvvm"]
  },
  "video/vnd.dece.mp4": {
    "source": "iana"
  },
  "video/vnd.dece.pd": {
    "source": "iana",
    "extensions": ["uvp","uvvp"]
  },
  "video/vnd.dece.sd": {
    "source": "iana",
    "extensions": ["uvs","uvvs"]
  },
  "video/vnd.dece.video": {
    "source": "iana",
    "extensions": ["uvv","uvvv"]
  },
  "video/vnd.directv.mpeg": {
    "source": "iana"
  },
  "video/vnd.directv.mpeg-tts": {
    "source": "iana"
  },
  "video/vnd.dlna.mpeg-tts": {
    "source": "iana"
  },
  "video/vnd.dvb.file": {
    "source": "iana",
    "extensions": ["dvb"]
  },
  "video/vnd.fvt": {
    "source": "iana",
    "extensions": ["fvt"]
  },
  "video/vnd.hns.video": {
    "source": "iana"
  },
  "video/vnd.iptvforum.1dparityfec-1010": {
    "source": "iana"
  },
  "video/vnd.iptvforum.1dparityfec-2005": {
    "source": "iana"
  },
  "video/vnd.iptvforum.2dparityfec-1010": {
    "source": "iana"
  },
  "video/vnd.iptvforum.2dparityfec-2005": {
    "source": "iana"
  },
  "video/vnd.iptvforum.ttsavc": {
    "source": "iana"
  },
  "video/vnd.iptvforum.ttsmpeg2": {
    "source": "iana"
  },
  "video/vnd.motorola.video": {
    "source": "iana"
  },
  "video/vnd.motorola.videop": {
    "source": "iana"
  },
  "video/vnd.mpegurl": {
    "source": "iana",
    "extensions": ["mxu","m4u"]
  },
  "video/vnd.ms-playready.media.pyv": {
    "source": "iana",
    "extensions": ["pyv"]
  },
  "video/vnd.nokia.interleaved-multimedia": {
    "source": "iana"
  },
  "video/vnd.nokia.mp4vr": {
    "source": "iana"
  },
  "video/vnd.nokia.videovoip": {
    "source": "iana"
  },
  "video/vnd.objectvideo": {
    "source": "iana"
  },
  "video/vnd.radgamettools.bink": {
    "source": "iana"
  },
  "video/vnd.radgamettools.smacker": {
    "source": "iana"
  },
  "video/vnd.sealed.mpeg1": {
    "source": "iana"
  },
  "video/vnd.sealed.mpeg4": {
    "source": "iana"
  },
  "video/vnd.sealed.swf": {
    "source": "iana"
  },
  "video/vnd.sealedmedia.softseal.mov": {
    "source": "iana"
  },
  "video/vnd.uvvu.mp4": {
    "source": "iana",
    "extensions": ["uvu","uvvu"]
  },
  "video/vnd.vivo": {
    "source": "iana",
    "extensions": ["viv"]
  },
  "video/vnd.youtube.yt": {
    "source": "iana"
  },
  "video/vp8": {
    "source": "iana"
  },
  "video/webm": {
    "source": "apache",
    "compressible": false,
    "extensions": ["webm"]
  },
  "video/x-f4v": {
    "source": "apache",
    "extensions": ["f4v"]
  },
  "video/x-fli": {
    "source": "apache",
    "extensions": ["fli"]
  },
  "video/x-flv": {
    "source": "apache",
    "compressible": false,
    "extensions": ["flv"]
  },
  "video/x-m4v": {
    "source": "apache",
    "extensions": ["m4v"]
  },
  "video/x-matroska": {
    "source": "apache",
    "compressible": false,
    "extensions": ["mkv","mk3d","mks"]
  },
  "video/x-mng": {
    "source": "apache",
    "extensions": ["mng"]
  },
  "video/x-ms-asf": {
    "source": "apache",
    "extensions": ["asf","asx"]
  },
  "video/x-ms-vob": {
    "source": "apache",
    "extensions": ["vob"]
  },
  "video/x-ms-wm": {
    "source": "apache",
    "extensions": ["wm"]
  },
  "video/x-ms-wmv": {
    "source": "apache",
    "compressible": false,
    "extensions": ["wmv"]
  },
  "video/x-ms-wmx": {
    "source": "apache",
    "extensions": ["wmx"]
  },
  "video/x-ms-wvx": {
    "source": "apache",
    "extensions": ["wvx"]
  },
  "video/x-msvideo": {
    "source": "apache",
    "extensions": ["avi"]
  },
  "video/x-sgi-movie": {
    "source": "apache",
    "extensions": ["movie"]
  },
  "video/x-smv": {
    "source": "apache",
    "extensions": ["smv"]
  },
  "x-conference/x-cooltalk": {
    "source": "apache",
    "extensions": ["ice"]
  },
  "x-shader/x-fragment": {
    "compressible": true
  },
  "x-shader/x-vertex": {
    "compressible": true
  }
}
/*!
 * mime-db
 * Copyright(c) 2014 Jonathan Ong
 * MIT Licensed
 */

/**
 * Module exports.
 */

module.exports = require('./db.json')
{
  "deprecated": false,
  "description": "Media Type Database",
  "devDependencies": {
    "bluebird": "3.7.2",
    "co": "4.6.0",
    "cogent": "1.0.1",
    "csv-parse": "4.8.9",
    "eslint": "6.8.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.20.2",
    "eslint-plugin-markdown": "1.0.2",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "4.2.1",
    "eslint-plugin-standard": "4.0.1",
    "gnode": "0.1.2",
    "mocha": "7.1.1",
    "nyc": "15.0.1",
    "raw-body": "2.4.1",
    "stream-to-array": "2.3.0"
  },
  "engines": {
    "node": ">= 0.6"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "README.md",
    "db.json",
    "index.js"
  ],
  "homepage": "https://github.com/jshttp/mime-db#readme",
  "license": "MIT",
  "name": "mime-db",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jshttp/mime-db.git"
  },
  "version": "1.44.0"
}2.1.27 / 2020-04-23
===================

  * deps: mime-db@1.44.0
    - Add charsets from IANA
    - Add extension `.cjs` to `application/node`
    - Add new upstream MIME types

2.1.26 / 2020-01-05
===================

  * deps: mime-db@1.43.0
    - Add `application/x-keepass2` with extension `.kdbx`
    - Add extension `.mxmf` to `audio/mobile-xmf`
    - Add extensions from IANA for `application/*+xml` types
    - Add new upstream MIME types

2.1.25 / 2019-11-12
===================

  * deps: mime-db@1.42.0
    - Add new upstream MIME types
    - Add `application/toml` with extension `.toml`
    - Add `image/vnd.ms-dds` with extension `.dds`

2.1.24 / 2019-04-20
===================

  * deps: mime-db@1.40.0
    - Add extensions from IANA for `model/*` types
    - Add `text/mdx` with extension `.mdx`

2.1.23 / 2019-04-17
===================

  * deps: mime-db@~1.39.0
    - Add extensions `.siv` and `.sieve` to `application/sieve`
    - Add new upstream MIME types

2.1.22 / 2019-02-14
===================

  * deps: mime-db@~1.38.0
    - Add extension `.nq` to `application/n-quads`
    - Add extension `.nt` to `application/n-triples`
    - Add new upstream MIME types
    - Mark `text/less` as compressible

2.1.21 / 2018-10-19
===================

  * deps: mime-db@~1.37.0
    - Add extensions to HEIC image types
    - Add new upstream MIME types

2.1.20 / 2018-08-26
===================

  * deps: mime-db@~1.36.0
    - Add Apple file extensions from IANA
    - Add extensions from IANA for `image/*` types
    - Add new upstream MIME types

2.1.19 / 2018-07-17
===================

  * deps: mime-db@~1.35.0
    - Add extension `.csl` to `application/vnd.citationstyles.style+xml`
    - Add extension `.es` to `application/ecmascript`
    - Add extension `.owl` to `application/rdf+xml`
    - Add new upstream MIME types
    - Add UTF-8 as default charset for `text/turtle`

2.1.18 / 2018-02-16
===================

  * deps: mime-db@~1.33.0
    - Add `application/raml+yaml` with extension `.raml`
    - Add `application/wasm` with extension `.wasm`
    - Add `text/shex` with extension `.shex`
    - Add extensions for JPEG-2000 images
    - Add extensions from IANA for `message/*` types
    - Add new upstream MIME types
    - Update font MIME types
    - Update `text/hjson` to registered `application/hjson`

2.1.17 / 2017-09-01
===================

  * deps: mime-db@~1.30.0
    - Add `application/vnd.ms-outlook`
    - Add `application/x-arj`
    - Add extension `.mjs` to `application/javascript`
    - Add glTF types and extensions
    - Add new upstream MIME types
    - Add `text/x-org`
    - Add VirtualBox MIME types
    - Fix `source` records for `video/*` types that are IANA
    - Update `font/opentype` to registered `font/otf`

2.1.16 / 2017-07-24
===================

  * deps: mime-db@~1.29.0
    - Add `application/fido.trusted-apps+json`
    - Add extension `.wadl` to `application/vnd.sun.wadl+xml`
    - Add extension `.gz` to `application/gzip`
    - Add new upstream MIME types
    - Update extensions `.md` and `.markdown` to be `text/markdown`

2.1.15 / 2017-03-23
===================

  * deps: mime-db@~1.27.0
    - Add new mime types
    - Add `image/apng`

2.1.14 / 2017-01-14
===================

  * deps: mime-db@~1.26.0
    - Add new mime types

2.1.13 / 2016-11-18
===================

  * deps: mime-db@~1.25.0
    - Add new mime types

2.1.12 / 2016-09-18
===================

  * deps: mime-db@~1.24.0
    - Add new mime types
    - Add `audio/mp3`

2.1.11 / 2016-05-01
===================

  * deps: mime-db@~1.23.0
    - Add new mime types

2.1.10 / 2016-02-15
===================

  * deps: mime-db@~1.22.0
    - Add new mime types
    - Fix extension of `application/dash+xml`
    - Update primary extension for `audio/mp4`

2.1.9 / 2016-01-06
==================

  * deps: mime-db@~1.21.0
    - Add new mime types

2.1.8 / 2015-11-30
==================

  * deps: mime-db@~1.20.0
    - Add new mime types

2.1.7 / 2015-09-20
==================

  * deps: mime-db@~1.19.0
    - Add new mime types

2.1.6 / 2015-09-03
==================

  * deps: mime-db@~1.18.0
    - Add new mime types

2.1.5 / 2015-08-20
==================

  * deps: mime-db@~1.17.0
    - Add new mime types

2.1.4 / 2015-07-30
==================

  * deps: mime-db@~1.16.0
    - Add new mime types

2.1.3 / 2015-07-13
==================

  * deps: mime-db@~1.15.0
    - Add new mime types

2.1.2 / 2015-06-25
==================

  * deps: mime-db@~1.14.0
    - Add new mime types

2.1.1 / 2015-06-08
==================

  * perf: fix deopt during mapping

2.1.0 / 2015-06-07
==================

  * Fix incorrectly treating extension-less file name as extension
    - i.e. `'path/to/json'` will no longer return `application/json`
  * Fix `.charset(type)` to accept parameters
  * Fix `.charset(type)` to match case-insensitive
  * Improve generation of extension to MIME mapping
  * Refactor internals for readability and no argument reassignment
  * Prefer `application/*` MIME types from the same source
  * Prefer any type over `application/octet-stream`
  * deps: mime-db@~1.13.0
    - Add nginx as a source
    - Add new mime types

2.0.14 / 2015-06-06
===================

  * deps: mime-db@~1.12.0
    - Add new mime types

2.0.13 / 2015-05-31
===================

  * deps: mime-db@~1.11.0
    - Add new mime types

2.0.12 / 2015-05-19
===================

  * deps: mime-db@~1.10.0
    - Add new mime types

2.0.11 / 2015-05-05
===================

  * deps: mime-db@~1.9.1
    - Add new mime types

2.0.10 / 2015-03-13
===================

  * deps: mime-db@~1.8.0
    - Add new mime types

2.0.9 / 2015-02-09
==================

  * deps: mime-db@~1.7.0
    - Add new mime types
    - Community extensions ownership transferred from `node-mime`

2.0.8 / 2015-01-29
==================

  * deps: mime-db@~1.6.0
    - Add new mime types

2.0.7 / 2014-12-30
==================

  * deps: mime-db@~1.5.0
    - Add new mime types
    - Fix various invalid MIME type entries

2.0.6 / 2014-12-30
==================

  * deps: mime-db@~1.4.0
    - Add new mime types
    - Fix various invalid MIME type entries
    - Remove example template MIME types

2.0.5 / 2014-12-29
==================

  * deps: mime-db@~1.3.1
    - Fix missing extensions

2.0.4 / 2014-12-10
==================

  * deps: mime-db@~1.3.0
    - Add new mime types

2.0.3 / 2014-11-09
==================

  * deps: mime-db@~1.2.0
    - Add new mime types

2.0.2 / 2014-09-28
==================

  * deps: mime-db@~1.1.0
    - Add new mime types
    - Add additional compressible
    - Update charsets

2.0.1 / 2014-09-07
==================

  * Support Node.js 0.6

2.0.0 / 2014-09-02
==================

  * Use `mime-db`
  * Remove `.define()`

1.0.2 / 2014-08-04
==================

  * Set charset=utf-8 for `text/javascript`

1.0.1 / 2014-06-24
==================

  * Add `text/jsx` type

1.0.0 / 2014-05-12
==================

  * Return `false` for unknown types
  * Set charset=utf-8 for `application/json`

0.1.0 / 2014-05-02
==================

  * Initial release
(The MIT License)

Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
/*!
 * mime-types
 * Copyright(c) 2014 Jonathan Ong
 * Copyright(c) 2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var db = require('mime-db')
var extname = require('path').extname

/**
 * Module variables.
 * @private
 */

var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/
var TEXT_TYPE_REGEXP = /^text\//i

/**
 * Module exports.
 * @public
 */

exports.charset = charset
exports.charsets = { lookup: charset }
exports.contentType = contentType
exports.extension = extension
exports.extensions = Object.create(null)
exports.lookup = lookup
exports.types = Object.create(null)

// Populate the extensions/types maps
populateMaps(exports.extensions, exports.types)

/**
 * Get the default charset for a MIME type.
 *
 * @param {string} type
 * @return {boolean|string}
 */

function charset (type) {
  if (!type || typeof type !== 'string') {
    return false
  }

  // TODO: use media-typer
  var match = EXTRACT_TYPE_REGEXP.exec(type)
  var mime = match && db[match[1].toLowerCase()]

  if (mime && mime.charset) {
    return mime.charset
  }

  // default text/* to utf-8
  if (match && TEXT_TYPE_REGEXP.test(match[1])) {
    return 'UTF-8'
  }

  return false
}

/**
 * Create a full Content-Type header given a MIME type or extension.
 *
 * @param {string} str
 * @return {boolean|string}
 */

function contentType (str) {
  // TODO: should this even be in this module?
  if (!str || typeof str !== 'string') {
    return false
  }

  var mime = str.indexOf('/') === -1
    ? exports.lookup(str)
    : str

  if (!mime) {
    return false
  }

  // TODO: use content-type or other module
  if (mime.indexOf('charset') === -1) {
    var charset = exports.charset(mime)
    if (charset) mime += '; charset=' + charset.toLowerCase()
  }

  return mime
}

/**
 * Get the default extension for a MIME type.
 *
 * @param {string} type
 * @return {boolean|string}
 */

function extension (type) {
  if (!type || typeof type !== 'string') {
    return false
  }

  // TODO: use media-typer
  var match = EXTRACT_TYPE_REGEXP.exec(type)

  // get extensions
  var exts = match && exports.extensions[match[1].toLowerCase()]

  if (!exts || !exts.length) {
    return false
  }

  return exts[0]
}

/**
 * Lookup the MIME type for a file path/extension.
 *
 * @param {string} path
 * @return {boolean|string}
 */

function lookup (path) {
  if (!path || typeof path !== 'string') {
    return false
  }

  // get the extension ("ext" or ".ext" or full path)
  var extension = extname('x.' + path)
    .toLowerCase()
    .substr(1)

  if (!extension) {
    return false
  }

  return exports.types[extension] || false
}

/**
 * Populate the extensions and types maps.
 * @private
 */

function populateMaps (extensions, types) {
  // source preference (least -> most)
  var preference = ['nginx', 'apache', undefined, 'iana']

  Object.keys(db).forEach(function forEachMimeType (type) {
    var mime = db[type]
    var exts = mime.extensions

    if (!exts || !exts.length) {
      return
    }

    // mime -> extensions
    extensions[type] = exts

    // extension -> mime
    for (var i = 0; i < exts.length; i++) {
      var extension = exts[i]

      if (types[extension]) {
        var from = preference.indexOf(db[types[extension]].source)
        var to = preference.indexOf(mime.source)

        if (types[extension] !== 'application/octet-stream' &&
          (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) {
          // skip the remapping
          continue
        }
      }

      // set the extension -> mime
      types[extension] = type
    }
  })
}
{
  "dependencies": {
    "mime-db": "1.44.0"
  },
  "deprecated": false,
  "description": "The ultimate javascript content-type utility.",
  "devDependencies": {
    "eslint": "6.8.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.20.2",
    "eslint-plugin-markdown": "1.0.2",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "4.2.1",
    "eslint-plugin-standard": "4.0.1",
    "mocha": "7.1.1",
    "nyc": "15.0.1"
  },
  "engines": {
    "node": ">= 0.6"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "index.js"
  ],
  "homepage": "https://github.com/jshttp/mime-types#readme",
  "license": "MIT",
  "name": "mime-types",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jshttp/mime-types.git"
  },
  "version": "2.1.27"
}'use strict';

// We define these manually to ensure they're always copied
// even if they would move up the prototype chain
// https://nodejs.org/api/http.html#http_class_http_incomingmessage
const knownProps = [
	'destroy',
	'setTimeout',
	'socket',
	'headers',
	'trailers',
	'rawHeaders',
	'statusCode',
	'httpVersion',
	'httpVersionMinor',
	'httpVersionMajor',
	'rawTrailers',
	'statusMessage'
];

module.exports = (fromStream, toStream) => {
	const fromProps = new Set(Object.keys(fromStream).concat(knownProps));

	for (const prop of fromProps) {
		// Don't overwrite existing properties
		if (prop in toStream) {
			continue;
		}

		toStream[prop] = typeof fromStream[prop] === 'function' ? fromStream[prop].bind(fromStream) : fromStream[prop];
	}
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Mimic a Node.js HTTP response stream",
  "devDependencies": {
    "ava": "*",
    "create-test-server": "^0.1.0",
    "pify": "^3.0.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/mimic-response#readme",
  "license": "MIT",
  "name": "mimic-response",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/mimic-response.git"
  },
  "version": "1.0.1"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
module.exports = minimatch
minimatch.Minimatch = Minimatch

var path = { sep: '/' }
try {
  path = require('path')
} catch (er) {}

var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
var expand = require('brace-expansion')

var plTypes = {
  '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
  '?': { open: '(?:', close: ')?' },
  '+': { open: '(?:', close: ')+' },
  '*': { open: '(?:', close: ')*' },
  '@': { open: '(?:', close: ')' }
}

// any single thing other than /
// don't need to escape / when using new RegExp()
var qmark = '[^/]'

// * => any number of characters
var star = qmark + '*?'

// ** when dots are allowed.  Anything goes, except .. and .
// not (^ or / followed by one or two dots followed by $ or /),
// followed by anything, any number of times.
var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'

// not a ^ or / followed by a dot,
// followed by anything, any number of times.
var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'

// characters that need to be escaped in RegExp.
var reSpecials = charSet('().*{}+?[]^$\\!')

// "abc" -> { a:true, b:true, c:true }
function charSet (s) {
  return s.split('').reduce(function (set, c) {
    set[c] = true
    return set
  }, {})
}

// normalizes slashes.
var slashSplit = /\/+/

minimatch.filter = filter
function filter (pattern, options) {
  options = options || {}
  return function (p, i, list) {
    return minimatch(p, pattern, options)
  }
}

function ext (a, b) {
  a = a || {}
  b = b || {}
  var t = {}
  Object.keys(b).forEach(function (k) {
    t[k] = b[k]
  })
  Object.keys(a).forEach(function (k) {
    t[k] = a[k]
  })
  return t
}

minimatch.defaults = function (def) {
  if (!def || !Object.keys(def).length) return minimatch

  var orig = minimatch

  var m = function minimatch (p, pattern, options) {
    return orig.minimatch(p, pattern, ext(def, options))
  }

  m.Minimatch = function Minimatch (pattern, options) {
    return new orig.Minimatch(pattern, ext(def, options))
  }

  return m
}

Minimatch.defaults = function (def) {
  if (!def || !Object.keys(def).length) return Minimatch
  return minimatch.defaults(def).Minimatch
}

function minimatch (p, pattern, options) {
  if (typeof pattern !== 'string') {
    throw new TypeError('glob pattern string required')
  }

  if (!options) options = {}

  // shortcut: comments match nothing.
  if (!options.nocomment && pattern.charAt(0) === '#') {
    return false
  }

  // "" only matches ""
  if (pattern.trim() === '') return p === ''

  return new Minimatch(pattern, options).match(p)
}

function Minimatch (pattern, options) {
  if (!(this instanceof Minimatch)) {
    return new Minimatch(pattern, options)
  }

  if (typeof pattern !== 'string') {
    throw new TypeError('glob pattern string required')
  }

  if (!options) options = {}
  pattern = pattern.trim()

  // windows support: need to use /, not \
  if (path.sep !== '/') {
    pattern = pattern.split(path.sep).join('/')
  }

  this.options = options
  this.set = []
  this.pattern = pattern
  this.regexp = null
  this.negate = false
  this.comment = false
  this.empty = false

  // make the set of regexps etc.
  this.make()
}

Minimatch.prototype.debug = function () {}

Minimatch.prototype.make = make
function make () {
  // don't do it more than once.
  if (this._made) return

  var pattern = this.pattern
  var options = this.options

  // empty patterns and comments match nothing.
  if (!options.nocomment && pattern.charAt(0) === '#') {
    this.comment = true
    return
  }
  if (!pattern) {
    this.empty = true
    return
  }

  // step 1: figure out negation, etc.
  this.parseNegate()

  // step 2: expand braces
  var set = this.globSet = this.braceExpand()

  if (options.debug) this.debug = console.error

  this.debug(this.pattern, set)

  // step 3: now we have a set, so turn each one into a series of path-portion
  // matching patterns.
  // These will be regexps, except in the case of "**", which is
  // set to the GLOBSTAR object for globstar behavior,
  // and will not contain any / characters
  set = this.globParts = set.map(function (s) {
    return s.split(slashSplit)
  })

  this.debug(this.pattern, set)

  // glob --> regexps
  set = set.map(function (s, si, set) {
    return s.map(this.parse, this)
  }, this)

  this.debug(this.pattern, set)

  // filter out everything that didn't compile properly.
  set = set.filter(function (s) {
    return s.indexOf(false) === -1
  })

  this.debug(this.pattern, set)

  this.set = set
}

Minimatch.prototype.parseNegate = parseNegate
function parseNegate () {
  var pattern = this.pattern
  var negate = false
  var options = this.options
  var negateOffset = 0

  if (options.nonegate) return

  for (var i = 0, l = pattern.length
    ; i < l && pattern.charAt(i) === '!'
    ; i++) {
    negate = !negate
    negateOffset++
  }

  if (negateOffset) this.pattern = pattern.substr(negateOffset)
  this.negate = negate
}

// Brace expansion:
// a{b,c}d -> abd acd
// a{b,}c -> abc ac
// a{0..3}d -> a0d a1d a2d a3d
// a{b,c{d,e}f}g -> abg acdfg acefg
// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
//
// Invalid sets are not expanded.
// a{2..}b -> a{2..}b
// a{b}c -> a{b}c
minimatch.braceExpand = function (pattern, options) {
  return braceExpand(pattern, options)
}

Minimatch.prototype.braceExpand = braceExpand

function braceExpand (pattern, options) {
  if (!options) {
    if (this instanceof Minimatch) {
      options = this.options
    } else {
      options = {}
    }
  }

  pattern = typeof pattern === 'undefined'
    ? this.pattern : pattern

  if (typeof pattern === 'undefined') {
    throw new TypeError('undefined pattern')
  }

  if (options.nobrace ||
    !pattern.match(/\{.*\}/)) {
    // shortcut. no need to expand.
    return [pattern]
  }

  return expand(pattern)
}

// parse a component of the expanded set.
// At this point, no pattern may contain "/" in it
// so we're going to return a 2d array, where each entry is the full
// pattern, split on '/', and then turned into a regular expression.
// A regexp is made at the end which joins each array with an
// escaped /, and another full one which joins each regexp with |.
//
// Following the lead of Bash 4.1, note that "**" only has special meaning
// when it is the *only* thing in a path portion.  Otherwise, any series
// of * is equivalent to a single *.  Globstar behavior is enabled by
// default, and can be disabled by setting options.noglobstar.
Minimatch.prototype.parse = parse
var SUBPARSE = {}
function parse (pattern, isSub) {
  if (pattern.length > 1024 * 64) {
    throw new TypeError('pattern is too long')
  }

  var options = this.options

  // shortcuts
  if (!options.noglobstar && pattern === '**') return GLOBSTAR
  if (pattern === '') return ''

  var re = ''
  var hasMagic = !!options.nocase
  var escaping = false
  // ? => one single character
  var patternListStack = []
  var negativeLists = []
  var stateChar
  var inClass = false
  var reClassStart = -1
  var classStart = -1
  // . and .. never match anything that doesn't start with .,
  // even when options.dot is set.
  var patternStart = pattern.charAt(0) === '.' ? '' // anything
  // not (start or / followed by . or .. followed by / or end)
  : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
  : '(?!\\.)'
  var self = this

  function clearStateChar () {
    if (stateChar) {
      // we had some state-tracking character
      // that wasn't consumed by this pass.
      switch (stateChar) {
        case '*':
          re += star
          hasMagic = true
        break
        case '?':
          re += qmark
          hasMagic = true
        break
        default:
          re += '\\' + stateChar
        break
      }
      self.debug('clearStateChar %j %j', stateChar, re)
      stateChar = false
    }
  }

  for (var i = 0, len = pattern.length, c
    ; (i < len) && (c = pattern.charAt(i))
    ; i++) {
    this.debug('%s\t%s %s %j', pattern, i, re, c)

    // skip over any that are escaped.
    if (escaping && reSpecials[c]) {
      re += '\\' + c
      escaping = false
      continue
    }

    switch (c) {
      case '/':
        // completely not allowed, even escaped.
        // Should already be path-split by now.
        return false

      case '\\':
        clearStateChar()
        escaping = true
      continue

      // the various stateChar values
      // for the "extglob" stuff.
      case '?':
      case '*':
      case '+':
      case '@':
      case '!':
        this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)

        // all of those are literals inside a class, except that
        // the glob [!a] means [^a] in regexp
        if (inClass) {
          this.debug('  in class')
          if (c === '!' && i === classStart + 1) c = '^'
          re += c
          continue
        }

        // if we already have a stateChar, then it means
        // that there was something like ** or +? in there.
        // Handle the stateChar, then proceed with this one.
        self.debug('call clearStateChar %j', stateChar)
        clearStateChar()
        stateChar = c
        // if extglob is disabled, then +(asdf|foo) isn't a thing.
        // just clear the statechar *now*, rather than even diving into
        // the patternList stuff.
        if (options.noext) clearStateChar()
      continue

      case '(':
        if (inClass) {
          re += '('
          continue
        }

        if (!stateChar) {
          re += '\\('
          continue
        }

        patternListStack.push({
          type: stateChar,
          start: i - 1,
          reStart: re.length,
          open: plTypes[stateChar].open,
          close: plTypes[stateChar].close
        })
        // negation is (?:(?!js)[^/]*)
        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
        this.debug('plType %j %j', stateChar, re)
        stateChar = false
      continue

      case ')':
        if (inClass || !patternListStack.length) {
          re += '\\)'
          continue
        }

        clearStateChar()
        hasMagic = true
        var pl = patternListStack.pop()
        // negation is (?:(?!js)[^/]*)
        // The others are (?:<pattern>)<type>
        re += pl.close
        if (pl.type === '!') {
          negativeLists.push(pl)
        }
        pl.reEnd = re.length
      continue

      case '|':
        if (inClass || !patternListStack.length || escaping) {
          re += '\\|'
          escaping = false
          continue
        }

        clearStateChar()
        re += '|'
      continue

      // these are mostly the same in regexp and glob
      case '[':
        // swallow any state-tracking char before the [
        clearStateChar()

        if (inClass) {
          re += '\\' + c
          continue
        }

        inClass = true
        classStart = i
        reClassStart = re.length
        re += c
      continue

      case ']':
        //  a right bracket shall lose its special
        //  meaning and represent itself in
        //  a bracket expression if it occurs
        //  first in the list.  -- POSIX.2 2.8.3.2
        if (i === classStart + 1 || !inClass) {
          re += '\\' + c
          escaping = false
          continue
        }

        // handle the case where we left a class open.
        // "[z-a]" is valid, equivalent to "\[z-a\]"
        if (inClass) {
          // split where the last [ was, make sure we don't have
          // an invalid re. if so, re-walk the contents of the
          // would-be class to re-translate any characters that
          // were passed through as-is
          // TODO: It would probably be faster to determine this
          // without a try/catch and a new RegExp, but it's tricky
          // to do safely.  For now, this is safe and works.
          var cs = pattern.substring(classStart + 1, i)
          try {
            RegExp('[' + cs + ']')
          } catch (er) {
            // not a valid class!
            var sp = this.parse(cs, SUBPARSE)
            re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
            hasMagic = hasMagic || sp[1]
            inClass = false
            continue
          }
        }

        // finish up the class.
        hasMagic = true
        inClass = false
        re += c
      continue

      default:
        // swallow any state char that wasn't consumed
        clearStateChar()

        if (escaping) {
          // no need
          escaping = false
        } else if (reSpecials[c]
          && !(c === '^' && inClass)) {
          re += '\\'
        }

        re += c

    } // switch
  } // for

  // handle the case where we left a class open.
  // "[abc" is valid, equivalent to "\[abc"
  if (inClass) {
    // split where the last [ was, and escape it
    // this is a huge pita.  We now have to re-walk
    // the contents of the would-be class to re-translate
    // any characters that were passed through as-is
    cs = pattern.substr(classStart + 1)
    sp = this.parse(cs, SUBPARSE)
    re = re.substr(0, reClassStart) + '\\[' + sp[0]
    hasMagic = hasMagic || sp[1]
  }

  // handle the case where we had a +( thing at the *end*
  // of the pattern.
  // each pattern list stack adds 3 chars, and we need to go through
  // and escape any | chars that were passed through as-is for the regexp.
  // Go through and escape them, taking care not to double-escape any
  // | chars that were already escaped.
  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
    var tail = re.slice(pl.reStart + pl.open.length)
    this.debug('setting tail', re, pl)
    // maybe some even number of \, then maybe 1 \, followed by a |
    tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
      if (!$2) {
        // the | isn't already escaped, so escape it.
        $2 = '\\'
      }

      // need to escape all those slashes *again*, without escaping the
      // one that we need for escaping the | character.  As it works out,
      // escaping an even number of slashes can be done by simply repeating
      // it exactly after itself.  That's why this trick works.
      //
      // I am sorry that you have to see this.
      return $1 + $1 + $2 + '|'
    })

    this.debug('tail=%j\n   %s', tail, tail, pl, re)
    var t = pl.type === '*' ? star
      : pl.type === '?' ? qmark
      : '\\' + pl.type

    hasMagic = true
    re = re.slice(0, pl.reStart) + t + '\\(' + tail
  }

  // handle trailing things that only matter at the very end.
  clearStateChar()
  if (escaping) {
    // trailing \\
    re += '\\\\'
  }

  // only need to apply the nodot start if the re starts with
  // something that could conceivably capture a dot
  var addPatternStart = false
  switch (re.charAt(0)) {
    case '.':
    case '[':
    case '(': addPatternStart = true
  }

  // Hack to work around lack of negative lookbehind in JS
  // A pattern like: *.!(x).!(y|z) needs to ensure that a name
  // like 'a.xyz.yz' doesn't match.  So, the first negative
  // lookahead, has to look ALL the way ahead, to the end of
  // the pattern.
  for (var n = negativeLists.length - 1; n > -1; n--) {
    var nl = negativeLists[n]

    var nlBefore = re.slice(0, nl.reStart)
    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
    var nlAfter = re.slice(nl.reEnd)

    nlLast += nlAfter

    // Handle nested stuff like *(*.js|!(*.json)), where open parens
    // mean that we should *not* include the ) in the bit that is considered
    // "after" the negated section.
    var openParensBefore = nlBefore.split('(').length - 1
    var cleanAfter = nlAfter
    for (i = 0; i < openParensBefore; i++) {
      cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
    }
    nlAfter = cleanAfter

    var dollar = ''
    if (nlAfter === '' && isSub !== SUBPARSE) {
      dollar = '$'
    }
    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
    re = newRe
  }

  // if the re is not "" at this point, then we need to make sure
  // it doesn't match against an empty path part.
  // Otherwise a/* will match a/, which it should not.
  if (re !== '' && hasMagic) {
    re = '(?=.)' + re
  }

  if (addPatternStart) {
    re = patternStart + re
  }

  // parsing just a piece of a larger pattern.
  if (isSub === SUBPARSE) {
    return [re, hasMagic]
  }

  // skip the regexp for non-magical patterns
  // unescape anything in it, though, so that it'll be
  // an exact match against a file etc.
  if (!hasMagic) {
    return globUnescape(pattern)
  }

  var flags = options.nocase ? 'i' : ''
  try {
    var regExp = new RegExp('^' + re + '$', flags)
  } catch (er) {
    // If it was an invalid regular expression, then it can't match
    // anything.  This trick looks for a character after the end of
    // the string, which is of course impossible, except in multi-line
    // mode, but it's not a /m regex.
    return new RegExp('$.')
  }

  regExp._glob = pattern
  regExp._src = re

  return regExp
}

minimatch.makeRe = function (pattern, options) {
  return new Minimatch(pattern, options || {}).makeRe()
}

Minimatch.prototype.makeRe = makeRe
function makeRe () {
  if (this.regexp || this.regexp === false) return this.regexp

  // at this point, this.set is a 2d array of partial
  // pattern strings, or "**".
  //
  // It's better to use .match().  This function shouldn't
  // be used, really, but it's pretty convenient sometimes,
  // when you just want to work with a regex.
  var set = this.set

  if (!set.length) {
    this.regexp = false
    return this.regexp
  }
  var options = this.options

  var twoStar = options.noglobstar ? star
    : options.dot ? twoStarDot
    : twoStarNoDot
  var flags = options.nocase ? 'i' : ''

  var re = set.map(function (pattern) {
    return pattern.map(function (p) {
      return (p === GLOBSTAR) ? twoStar
      : (typeof p === 'string') ? regExpEscape(p)
      : p._src
    }).join('\\\/')
  }).join('|')

  // must match entire pattern
  // ending in a * or ** will make it less strict.
  re = '^(?:' + re + ')$'

  // can match anything, as long as it's not this.
  if (this.negate) re = '^(?!' + re + ').*$'

  try {
    this.regexp = new RegExp(re, flags)
  } catch (ex) {
    this.regexp = false
  }
  return this.regexp
}

minimatch.match = function (list, pattern, options) {
  options = options || {}
  var mm = new Minimatch(pattern, options)
  list = list.filter(function (f) {
    return mm.match(f)
  })
  if (mm.options.nonull && !list.length) {
    list.push(pattern)
  }
  return list
}

Minimatch.prototype.match = match
function match (f, partial) {
  this.debug('match', f, this.pattern)
  // short-circuit in the case of busted things.
  // comments, etc.
  if (this.comment) return false
  if (this.empty) return f === ''

  if (f === '/' && partial) return true

  var options = this.options

  // windows: need to use /, not \
  if (path.sep !== '/') {
    f = f.split(path.sep).join('/')
  }

  // treat the test path as a set of pathparts.
  f = f.split(slashSplit)
  this.debug(this.pattern, 'split', f)

  // just ONE of the pattern sets in this.set needs to match
  // in order for it to be valid.  If negating, then just one
  // match means that we have failed.
  // Either way, return on the first hit.

  var set = this.set
  this.debug(this.pattern, 'set', set)

  // Find the basename of the path by looking for the last non-empty segment
  var filename
  var i
  for (i = f.length - 1; i >= 0; i--) {
    filename = f[i]
    if (filename) break
  }

  for (i = 0; i < set.length; i++) {
    var pattern = set[i]
    var file = f
    if (options.matchBase && pattern.length === 1) {
      file = [filename]
    }
    var hit = this.matchOne(file, pattern, partial)
    if (hit) {
      if (options.flipNegate) return true
      return !this.negate
    }
  }

  // didn't get any hits.  this is success if it's a negative
  // pattern, failure otherwise.
  if (options.flipNegate) return false
  return this.negate
}

// set partial to true to test if, for example,
// "/a/b" matches the start of "/*/b/*/d"
// Partial means, if you run out of file before you run
// out of pattern, then that's fine, as long as all
// the parts match.
Minimatch.prototype.matchOne = function (file, pattern, partial) {
  var options = this.options

  this.debug('matchOne',
    { 'this': this, file: file, pattern: pattern })

  this.debug('matchOne', file.length, pattern.length)

  for (var fi = 0,
      pi = 0,
      fl = file.length,
      pl = pattern.length
      ; (fi < fl) && (pi < pl)
      ; fi++, pi++) {
    this.debug('matchOne loop')
    var p = pattern[pi]
    var f = file[fi]

    this.debug(pattern, p, f)

    // should be impossible.
    // some invalid regexp stuff in the set.
    if (p === false) return false

    if (p === GLOBSTAR) {
      this.debug('GLOBSTAR', [pattern, p, f])

      // "**"
      // a/**/b/**/c would match the following:
      // a/b/x/y/z/c
      // a/x/y/z/b/c
      // a/b/x/b/x/c
      // a/b/c
      // To do this, take the rest of the pattern after
      // the **, and see if it would match the file remainder.
      // If so, return success.
      // If not, the ** "swallows" a segment, and try again.
      // This is recursively awful.
      //
      // a/**/b/**/c matching a/b/x/y/z/c
      // - a matches a
      // - doublestar
      //   - matchOne(b/x/y/z/c, b/**/c)
      //     - b matches b
      //     - doublestar
      //       - matchOne(x/y/z/c, c) -> no
      //       - matchOne(y/z/c, c) -> no
      //       - matchOne(z/c, c) -> no
      //       - matchOne(c, c) yes, hit
      var fr = fi
      var pr = pi + 1
      if (pr === pl) {
        this.debug('** at the end')
        // a ** at the end will just swallow the rest.
        // We have found a match.
        // however, it will not swallow /.x, unless
        // options.dot is set.
        // . and .. are *never* matched by **, for explosively
        // exponential reasons.
        for (; fi < fl; fi++) {
          if (file[fi] === '.' || file[fi] === '..' ||
            (!options.dot && file[fi].charAt(0) === '.')) return false
        }
        return true
      }

      // ok, let's see if we can swallow whatever we can.
      while (fr < fl) {
        var swallowee = file[fr]

        this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)

        // XXX remove this slice.  Just pass the start index.
        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
          this.debug('globstar found match!', fr, fl, swallowee)
          // found a match.
          return true
        } else {
          // can't swallow "." or ".." ever.
          // can only swallow ".foo" when explicitly asked.
          if (swallowee === '.' || swallowee === '..' ||
            (!options.dot && swallowee.charAt(0) === '.')) {
            this.debug('dot detected!', file, fr, pattern, pr)
            break
          }

          // ** swallows a segment, and continue.
          this.debug('globstar swallow a segment, and continue')
          fr++
        }
      }

      // no match was found.
      // However, in partial mode, we can't say this is necessarily over.
      // If there's more *pattern* left, then
      if (partial) {
        // ran out of file
        this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
        if (fr === fl) return true
      }
      return false
    }

    // something other than **
    // non-magic patterns just have to match exactly
    // patterns with magic have been turned into regexps.
    var hit
    if (typeof p === 'string') {
      if (options.nocase) {
        hit = f.toLowerCase() === p.toLowerCase()
      } else {
        hit = f === p
      }
      this.debug('string match', p, f, hit)
    } else {
      hit = f.match(p)
      this.debug('pattern match', p, f, hit)
    }

    if (!hit) return false
  }

  // Note: ending in / means that we'll get a final ""
  // at the end of the pattern.  This can only match a
  // corresponding "" at the end of the file.
  // If the file ends in /, then it can only match a
  // a pattern that ends in /, unless the pattern just
  // doesn't have any more for it. But, a/b/ should *not*
  // match "a/b/*", even though "" matches against the
  // [^/]*? pattern, except in partial mode, where it might
  // simply not be reached yet.
  // However, a/b/ should still satisfy a/*

  // now either we fell off the end of the pattern, or we're done.
  if (fi === fl && pi === pl) {
    // ran out of pattern and filename at the same time.
    // an exact hit!
    return true
  } else if (fi === fl) {
    // ran out of file, but still had pattern left.
    // this is ok if we're doing the match as part of
    // a glob fs traversal.
    return partial
  } else if (pi === pl) {
    // ran out of pattern, still have file left.
    // this is only acceptable if we're on the very last
    // empty segment of a file with a trailing slash.
    // a/* should match a/b/
    var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')
    return emptyFileEnd
  }

  // should be unreachable.
  throw new Error('wtf?')
}

// replace stuff like \* with *
function globUnescape (s) {
  return s.replace(/\\(.)/g, '$1')
}

function regExpEscape (s) {
  return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me"
  },
  "dependencies": {
    "brace-expansion": "^1.1.7"
  },
  "deprecated": false,
  "description": "a glob matcher in javascript",
  "devDependencies": {
    "tap": "^10.3.2"
  },
  "engines": {
    "node": "*"
  },
  "files": [
    "minimatch.js"
  ],
  "homepage": "https://github.com/isaacs/minimatch#readme",
  "license": "ISC",
  "main": "minimatch.js",
  "name": "minimatch",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/minimatch.git"
  },
  "version": "3.0.4"
}This software is released under the MIT license:

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
module.exports = function (args, opts) {
    if (!opts) opts = {};
    
    var flags = { bools : {}, strings : {}, unknownFn: null };

    if (typeof opts['unknown'] === 'function') {
        flags.unknownFn = opts['unknown'];
    }

    if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {
      flags.allBools = true;
    } else {
      [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
          flags.bools[key] = true;
      });
    }
    
    var aliases = {};
    Object.keys(opts.alias || {}).forEach(function (key) {
        aliases[key] = [].concat(opts.alias[key]);
        aliases[key].forEach(function (x) {
            aliases[x] = [key].concat(aliases[key].filter(function (y) {
                return x !== y;
            }));
        });
    });

    [].concat(opts.string).filter(Boolean).forEach(function (key) {
        flags.strings[key] = true;
        if (aliases[key]) {
            flags.strings[aliases[key]] = true;
        }
     });

    var defaults = opts['default'] || {};
    
    var argv = { _ : [] };
    Object.keys(flags.bools).forEach(function (key) {
        setArg(key, defaults[key] === undefined ? false : defaults[key]);
    });
    
    var notFlags = [];

    if (args.indexOf('--') !== -1) {
        notFlags = args.slice(args.indexOf('--')+1);
        args = args.slice(0, args.indexOf('--'));
    }

    function argDefined(key, arg) {
        return (flags.allBools && /^--[^=]+$/.test(arg)) ||
            flags.strings[key] || flags.bools[key] || aliases[key];
    }

    function setArg (key, val, arg) {
        if (arg && flags.unknownFn && !argDefined(key, arg)) {
            if (flags.unknownFn(arg) === false) return;
        }

        var value = !flags.strings[key] && isNumber(val)
            ? Number(val) : val
        ;
        setKey(argv, key.split('.'), value);
        
        (aliases[key] || []).forEach(function (x) {
            setKey(argv, x.split('.'), value);
        });
    }

    function setKey (obj, keys, value) {
        var o = obj;
        keys.slice(0,-1).forEach(function (key) {
            if (o[key] === undefined) o[key] = {};
            o = o[key];
        });

        var key = keys[keys.length - 1];
        if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') {
            o[key] = value;
        }
        else if (Array.isArray(o[key])) {
            o[key].push(value);
        }
        else {
            o[key] = [ o[key], value ];
        }
    }
    
    function aliasIsBoolean(key) {
      return aliases[key].some(function (x) {
          return flags.bools[x];
      });
    }

    for (var i = 0; i < args.length; i++) {
        var arg = args[i];
        
        if (/^--.+=/.test(arg)) {
            // Using [\s\S] instead of . because js doesn't support the
            // 'dotall' regex modifier. See:
            // http://stackoverflow.com/a/1068308/13216
            var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
            var key = m[1];
            var value = m[2];
            if (flags.bools[key]) {
                value = value !== 'false';
            }
            setArg(key, value, arg);
        }
        else if (/^--no-.+/.test(arg)) {
            var key = arg.match(/^--no-(.+)/)[1];
            setArg(key, false, arg);
        }
        else if (/^--.+/.test(arg)) {
            var key = arg.match(/^--(.+)/)[1];
            var next = args[i + 1];
            if (next !== undefined && !/^-/.test(next)
            && !flags.bools[key]
            && !flags.allBools
            && (aliases[key] ? !aliasIsBoolean(key) : true)) {
                setArg(key, next, arg);
                i++;
            }
            else if (/^(true|false)$/.test(next)) {
                setArg(key, next === 'true', arg);
                i++;
            }
            else {
                setArg(key, flags.strings[key] ? '' : true, arg);
            }
        }
        else if (/^-[^-]+/.test(arg)) {
            var letters = arg.slice(1,-1).split('');
            
            var broken = false;
            for (var j = 0; j < letters.length; j++) {
                var next = arg.slice(j+2);
                
                if (next === '-') {
                    setArg(letters[j], next, arg)
                    continue;
                }
                
                if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) {
                    setArg(letters[j], next.split('=')[1], arg);
                    broken = true;
                    break;
                }
                
                if (/[A-Za-z]/.test(letters[j])
                && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
                    setArg(letters[j], next, arg);
                    broken = true;
                    break;
                }
                
                if (letters[j+1] && letters[j+1].match(/\W/)) {
                    setArg(letters[j], arg.slice(j+2), arg);
                    broken = true;
                    break;
                }
                else {
                    setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
                }
            }
            
            var key = arg.slice(-1)[0];
            if (!broken && key !== '-') {
                if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
                && !flags.bools[key]
                && (aliases[key] ? !aliasIsBoolean(key) : true)) {
                    setArg(key, args[i+1], arg);
                    i++;
                }
                else if (args[i+1] && /true|false/.test(args[i+1])) {
                    setArg(key, args[i+1] === 'true', arg);
                    i++;
                }
                else {
                    setArg(key, flags.strings[key] ? '' : true, arg);
                }
            }
        }
        else {
            if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
                argv._.push(
                    flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
                );
            }
            if (opts.stopEarly) {
                argv._.push.apply(argv._, args.slice(i + 1));
                break;
            }
        }
    }
    
    Object.keys(defaults).forEach(function (key) {
        if (!hasKey(argv, key.split('.'))) {
            setKey(argv, key.split('.'), defaults[key]);
            
            (aliases[key] || []).forEach(function (x) {
                setKey(argv, x.split('.'), defaults[key]);
            });
        }
    });
    
    if (opts['--']) {
        argv['--'] = new Array();
        notFlags.forEach(function(key) {
            argv['--'].push(key);
        });
    }
    else {
        notFlags.forEach(function(key) {
            argv._.push(key);
        });
    }

    return argv;
};

function hasKey (obj, keys) {
    var o = obj;
    keys.slice(0,-1).forEach(function (key) {
        o = (o[key] || {});
    });

    var key = keys[keys.length - 1];
    return key in o;
}

function isNumber (x) {
    if (typeof x === 'number') return true;
    if (/^0x[0-9a-f]+$/i.test(x)) return true;
    return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
}

{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "deprecated": false,
  "description": "parse argument options",
  "devDependencies": {
    "covert": "^1.0.0",
    "tap": "~0.4.0",
    "tape": "^3.5.0"
  },
  "homepage": "https://github.com/substack/minimist",
  "license": "MIT",
  "main": "index.js",
  "name": "minimist",
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/minimist.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/6..latest",
      "ff/5",
      "firefox/latest",
      "chrome/10",
      "chrome/latest",
      "safari/5.1",
      "safari/latest",
      "opera/12"
    ]
  },
  "version": "1.2.0"
}/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var w = d * 7;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function(val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isFinite(val)) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'weeks':
    case 'week':
    case 'w':
      return n * w;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  var msAbs = Math.abs(ms);
  if (msAbs >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (msAbs >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (msAbs >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (msAbs >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  var msAbs = Math.abs(ms);
  if (msAbs >= d) {
    return plural(ms, msAbs, d, 'day');
  }
  if (msAbs >= h) {
    return plural(ms, msAbs, h, 'hour');
  }
  if (msAbs >= m) {
    return plural(ms, msAbs, m, 'minute');
  }
  if (msAbs >= s) {
    return plural(ms, msAbs, s, 'second');
  }
  return ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, msAbs, n, name) {
  var isPlural = msAbs >= n * 1.5;
  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
}
The MIT License (MIT)

Copyright (c) 2016 Zeit, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "deprecated": false,
  "description": "Tiny millisecond conversion utility",
  "devDependencies": {
    "eslint": "4.12.1",
    "expect.js": "0.3.1",
    "husky": "0.14.3",
    "lint-staged": "5.0.0",
    "mocha": "4.0.1"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/zeit/ms#readme",
  "license": "MIT",
  "lint-staged": {
    "*.js": [
      "npm run lint",
      "prettier --single-quote --write",
      "git add"
    ]
  },
  "main": "./index",
  "name": "ms",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/zeit/ms.git"
  },
  "version": "2.1.2"
}The MIT License (MIT)

Copyright (c) 2018 Tobias Reich

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "authors": [
    "Tobias Reich <tobias@electerious.com>"
  ],
  "deprecated": false,
  "description": "Tries to execute a function and discards any error that occurs",
  "devDependencies": {
    "chai": "^4.1.2",
    "coveralls": "^3.0.0",
    "mocha": "^5.1.1",
    "nyc": "^12.0.1"
  },
  "files": [
    "src"
  ],
  "homepage": "https://github.com/electerious/nice-try",
  "license": "MIT",
  "main": "src/index.js",
  "name": "nice-try",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electerious/nice-try.git"
  },
  "version": "1.0.5"
}'use strict'

/**
 * Tries to execute a function and discards any error that occurs.
 * @param {Function} fn - Function that might or might not throw an error.
 * @returns {?*} Return-value of the function when no error occurred.
 */
module.exports = function(fn) {

	try { return fn() } catch (e) {}

}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "bin": {
    "nopt": "./bin/nopt.js"
  },
  "dependencies": {
    "abbrev": "1",
    "osenv": "^0.1.4"
  },
  "deprecated": false,
  "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.",
  "devDependencies": {
    "tap": "^8.0.1"
  },
  "homepage": "https://github.com/npm/nopt#readme",
  "license": "ISC",
  "main": "lib/nopt.js",
  "name": "nopt",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/nopt.git"
  },
  "version": "4.0.1"
}// info about each config option.

var debug = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG
  ? function () { console.error.apply(console, arguments) }
  : function () {}

var url = require("url")
  , path = require("path")
  , Stream = require("stream").Stream
  , abbrev = require("abbrev")
  , osenv = require("osenv")

module.exports = exports = nopt
exports.clean = clean

exports.typeDefs =
  { String  : { type: String,  validate: validateString  }
  , Boolean : { type: Boolean, validate: validateBoolean }
  , url     : { type: url,     validate: validateUrl     }
  , Number  : { type: Number,  validate: validateNumber  }
  , path    : { type: path,    validate: validatePath    }
  , Stream  : { type: Stream,  validate: validateStream  }
  , Date    : { type: Date,    validate: validateDate    }
  }

function nopt (types, shorthands, args, slice) {
  args = args || process.argv
  types = types || {}
  shorthands = shorthands || {}
  if (typeof slice !== "number") slice = 2

  debug(types, shorthands, args, slice)

  args = args.slice(slice)
  var data = {}
    , key
    , argv = {
        remain: [],
        cooked: args,
        original: args.slice(0)
      }

  parse(args, data, argv.remain, types, shorthands)
  // now data is full
  clean(data, types, exports.typeDefs)
  data.argv = argv
  Object.defineProperty(data.argv, 'toString', { value: function () {
    return this.original.map(JSON.stringify).join(" ")
  }, enumerable: false })
  return data
}

function clean (data, types, typeDefs) {
  typeDefs = typeDefs || exports.typeDefs
  var remove = {}
    , typeDefault = [false, true, null, String, Array]

  Object.keys(data).forEach(function (k) {
    if (k === "argv") return
    var val = data[k]
      , isArray = Array.isArray(val)
      , type = types[k]
    if (!isArray) val = [val]
    if (!type) type = typeDefault
    if (type === Array) type = typeDefault.concat(Array)
    if (!Array.isArray(type)) type = [type]

    debug("val=%j", val)
    debug("types=", type)
    val = val.map(function (val) {
      // if it's an unknown value, then parse false/true/null/numbers/dates
      if (typeof val === "string") {
        debug("string %j", val)
        val = val.trim()
        if ((val === "null" && ~type.indexOf(null))
            || (val === "true" &&
               (~type.indexOf(true) || ~type.indexOf(Boolean)))
            || (val === "false" &&
               (~type.indexOf(false) || ~type.indexOf(Boolean)))) {
          val = JSON.parse(val)
          debug("jsonable %j", val)
        } else if (~type.indexOf(Number) && !isNaN(val)) {
          debug("convert to number", val)
          val = +val
        } else if (~type.indexOf(Date) && !isNaN(Date.parse(val))) {
          debug("convert to date", val)
          val = new Date(val)
        }
      }

      if (!types.hasOwnProperty(k)) {
        return val
      }

      // allow `--no-blah` to set 'blah' to null if null is allowed
      if (val === false && ~type.indexOf(null) &&
          !(~type.indexOf(false) || ~type.indexOf(Boolean))) {
        val = null
      }

      var d = {}
      d[k] = val
      debug("prevalidated val", d, val, types[k])
      if (!validate(d, k, val, types[k], typeDefs)) {
        if (exports.invalidHandler) {
          exports.invalidHandler(k, val, types[k], data)
        } else if (exports.invalidHandler !== false) {
          debug("invalid: "+k+"="+val, types[k])
        }
        return remove
      }
      debug("validated val", d, val, types[k])
      return d[k]
    }).filter(function (val) { return val !== remove })

    if (!val.length) delete data[k]
    else if (isArray) {
      debug(isArray, data[k], val)
      data[k] = val
    } else data[k] = val[0]

    debug("k=%s val=%j", k, val, data[k])
  })
}

function validateString (data, k, val) {
  data[k] = String(val)
}

function validatePath (data, k, val) {
  if (val === true) return false
  if (val === null) return true

  val = String(val)

  var isWin       = process.platform === 'win32'
    , homePattern = isWin ? /^~(\/|\\)/ : /^~\//
    , home        = osenv.home()

  if (home && val.match(homePattern)) {
    data[k] = path.resolve(home, val.substr(2))
  } else {
    data[k] = path.resolve(val)
  }
  return true
}

function validateNumber (data, k, val) {
  debug("validate Number %j %j %j", k, val, isNaN(val))
  if (isNaN(val)) return false
  data[k] = +val
}

function validateDate (data, k, val) {
  var s = Date.parse(val)
  debug("validate Date %j %j %j", k, val, s)
  if (isNaN(s)) return false
  data[k] = new Date(val)
}

function validateBoolean (data, k, val) {
  if (val instanceof Boolean) val = val.valueOf()
  else if (typeof val === "string") {
    if (!isNaN(val)) val = !!(+val)
    else if (val === "null" || val === "false") val = false
    else val = true
  } else val = !!val
  data[k] = val
}

function validateUrl (data, k, val) {
  val = url.parse(String(val))
  if (!val.host) return false
  data[k] = val.href
}

function validateStream (data, k, val) {
  if (!(val instanceof Stream)) return false
  data[k] = val
}

function validate (data, k, val, type, typeDefs) {
  // arrays are lists of types.
  if (Array.isArray(type)) {
    for (var i = 0, l = type.length; i < l; i ++) {
      if (type[i] === Array) continue
      if (validate(data, k, val, type[i], typeDefs)) return true
    }
    delete data[k]
    return false
  }

  // an array of anything?
  if (type === Array) return true

  // NaN is poisonous.  Means that something is not allowed.
  if (type !== type) {
    debug("Poison NaN", k, val, type)
    delete data[k]
    return false
  }

  // explicit list of values
  if (val === type) {
    debug("Explicitly allowed %j", val)
    // if (isArray) (data[k] = data[k] || []).push(val)
    // else data[k] = val
    data[k] = val
    return true
  }

  // now go through the list of typeDefs, validate against each one.
  var ok = false
    , types = Object.keys(typeDefs)
  for (var i = 0, l = types.length; i < l; i ++) {
    debug("test type %j %j %j", k, val, types[i])
    var t = typeDefs[types[i]]
    if (t &&
      ((type && type.name && t.type && t.type.name) ? (type.name === t.type.name) : (type === t.type))) {
      var d = {}
      ok = false !== t.validate(d, k, val)
      val = d[k]
      if (ok) {
        // if (isArray) (data[k] = data[k] || []).push(val)
        // else data[k] = val
        data[k] = val
        break
      }
    }
  }
  debug("OK? %j (%j %j %j)", ok, k, val, types[i])

  if (!ok) delete data[k]
  return ok
}

function parse (args, data, remain, types, shorthands) {
  debug("parse", args, data, remain)

  var key = null
    , abbrevs = abbrev(Object.keys(types))
    , shortAbbr = abbrev(Object.keys(shorthands))

  for (var i = 0; i < args.length; i ++) {
    var arg = args[i]
    debug("arg", arg)

    if (arg.match(/^-{2,}$/)) {
      // done with keys.
      // the rest are args.
      remain.push.apply(remain, args.slice(i + 1))
      args[i] = "--"
      break
    }
    var hadEq = false
    if (arg.charAt(0) === "-" && arg.length > 1) {
      var at = arg.indexOf('=')
      if (at > -1) {
        hadEq = true
        var v = arg.substr(at + 1)
        arg = arg.substr(0, at)
        args.splice(i, 1, arg, v)
      }

      // see if it's a shorthand
      // if so, splice and back up to re-parse it.
      var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs)
      debug("arg=%j shRes=%j", arg, shRes)
      if (shRes) {
        debug(arg, shRes)
        args.splice.apply(args, [i, 1].concat(shRes))
        if (arg !== shRes[0]) {
          i --
          continue
        }
      }
      arg = arg.replace(/^-+/, "")
      var no = null
      while (arg.toLowerCase().indexOf("no-") === 0) {
        no = !no
        arg = arg.substr(3)
      }

      if (abbrevs[arg]) arg = abbrevs[arg]

      var argType = types[arg]
      var isTypeArray = Array.isArray(argType)
      if (isTypeArray && argType.length === 1) {
        isTypeArray = false
        argType = argType[0]
      }

      var isArray = argType === Array ||
        isTypeArray && argType.indexOf(Array) !== -1

      // allow unknown things to be arrays if specified multiple times.
      if (!types.hasOwnProperty(arg) && data.hasOwnProperty(arg)) {
        if (!Array.isArray(data[arg]))
          data[arg] = [data[arg]]
        isArray = true
      }

      var val
        , la = args[i + 1]

      var isBool = typeof no === 'boolean' ||
        argType === Boolean ||
        isTypeArray && argType.indexOf(Boolean) !== -1 ||
        (typeof argType === 'undefined' && !hadEq) ||
        (la === "false" &&
         (argType === null ||
          isTypeArray && ~argType.indexOf(null)))

      if (isBool) {
        // just set and move along
        val = !no
        // however, also support --bool true or --bool false
        if (la === "true" || la === "false") {
          val = JSON.parse(la)
          la = null
          if (no) val = !val
          i ++
        }

        // also support "foo":[Boolean, "bar"] and "--foo bar"
        if (isTypeArray && la) {
          if (~argType.indexOf(la)) {
            // an explicit type
            val = la
            i ++
          } else if ( la === "null" && ~argType.indexOf(null) ) {
            // null allowed
            val = null
            i ++
          } else if ( !la.match(/^-{2,}[^-]/) &&
                      !isNaN(la) &&
                      ~argType.indexOf(Number) ) {
            // number
            val = +la
            i ++
          } else if ( !la.match(/^-[^-]/) && ~argType.indexOf(String) ) {
            // string
            val = la
            i ++
          }
        }

        if (isArray) (data[arg] = data[arg] || []).push(val)
        else data[arg] = val

        continue
      }

      if (argType === String) {
        if (la === undefined) {
          la = ""
        } else if (la.match(/^-{1,2}[^-]+/)) {
          la = ""
          i --
        }
      }

      if (la && la.match(/^-{2,}$/)) {
        la = undefined
        i --
      }

      val = la === undefined ? true : la
      if (isArray) (data[arg] = data[arg] || []).push(val)
      else data[arg] = val

      i ++
      continue
    }
    remain.push(arg)
  }
}

function resolveShort (arg, shorthands, shortAbbr, abbrevs) {
  // handle single-char shorthands glommed together, like
  // npm ls -glp, but only if there is one dash, and only if
  // all of the chars are single-char shorthands, and it's
  // not a match to some other abbrev.
  arg = arg.replace(/^-+/, '')

  // if it's an exact known option, then don't go any further
  if (abbrevs[arg] === arg)
    return null

  // if it's an exact known shortopt, same deal
  if (shorthands[arg]) {
    // make it an array, if it's a list of words
    if (shorthands[arg] && !Array.isArray(shorthands[arg]))
      shorthands[arg] = shorthands[arg].split(/\s+/)

    return shorthands[arg]
  }

  // first check to see if this arg is a set of single-char shorthands
  var singles = shorthands.___singles
  if (!singles) {
    singles = Object.keys(shorthands).filter(function (s) {
      return s.length === 1
    }).reduce(function (l,r) {
      l[r] = true
      return l
    }, {})
    shorthands.___singles = singles
    debug('shorthand singles', singles)
  }

  var chrs = arg.split("").filter(function (c) {
    return singles[c]
  })

  if (chrs.join("") === arg) return chrs.map(function (c) {
    return shorthands[c]
  }).reduce(function (l, r) {
    return l.concat(r)
  }, [])


  // if it's an arg abbrev, and not a literal shorthand, then prefer the arg
  if (abbrevs[arg] && !shorthands[arg])
    return null

  // if it's an abbr for a shorthand, then use that
  if (shortAbbr[arg])
    arg = shortAbbr[arg]

  // make it an array, if it's a list of words
  if (shorthands[arg] && !Array.isArray(shorthands[arg]))
    shorthands[arg] = shorthands[arg].split(/\s+/)

  return shorthands[arg]
}
#!/usr/bin/env node
var nopt = require("../lib/nopt")
  , path = require("path")
  , types = { num: Number
            , bool: Boolean
            , help: Boolean
            , list: Array
            , "num-list": [Number, Array]
            , "str-list": [String, Array]
            , "bool-list": [Boolean, Array]
            , str: String
            , clear: Boolean
            , config: Boolean
            , length: Number
            , file: path
            }
  , shorthands = { s: [ "--str", "astring" ]
                 , b: [ "--bool" ]
                 , nb: [ "--no-bool" ]
                 , tft: [ "--bool-list", "--no-bool-list", "--bool-list", "true" ]
                 , "?": ["--help"]
                 , h: ["--help"]
                 , H: ["--help"]
                 , n: [ "--num", "125" ]
                 , c: ["--config"]
                 , l: ["--length"]
                 , f: ["--file"]
                 }
  , parsed = nopt( types
                 , shorthands
                 , process.argv
                 , 2 )

console.log("parsed", parsed)

if (parsed.help) {
  console.log("")
  console.log("nopt cli tester")
  console.log("")
  console.log("types")
  console.log(Object.keys(types).map(function M (t) {
    var type = types[t]
    if (Array.isArray(type)) {
      return [t, type.map(function (type) { return type.name })]
    }
    return [t, type && type.name]
  }).reduce(function (s, i) {
    s[i[0]] = i[1]
    return s
  }, {}))
  console.log("")
  console.log("shorthands")
  console.log(shorthands)
}
# Names sorted by how much code was originally theirs.
Isaac Z. Schlueter <i@izs.me>
Meryn Stol <merynstol@gmail.com>
Robert Kowalski <rok@kowalski.gd>
This package contains code originally written by Isaac Z. Schlueter.
Used with permission.

Copyright (c) Meryn Stol ("Author")
All rights reserved.

The BSD License

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
  "author": {
    "name": "Meryn Stol",
    "email": "merynstol@gmail.com"
  },
  "dependencies": {
    "hosted-git-info": "^2.1.4",
    "resolve": "^1.10.0",
    "semver": "2 || 3 || 4 || 5",
    "validate-npm-package-license": "^3.0.1"
  },
  "deprecated": false,
  "description": "Normalizes data that can be found in package.json files.",
  "devDependencies": {
    "async": "^2.6.1",
    "tap": "^12.4.0",
    "underscore": "^1.8.3"
  },
  "files": [
    "lib/*.js",
    "lib/*.json",
    "AUTHORS"
  ],
  "homepage": "https://github.com/npm/normalize-package-data#readme",
  "license": "BSD-2-Clause",
  "main": "lib/normalize.js",
  "name": "normalize-package-data",
  "repository": {
    "type": "git",
    "url": "git://github.com/npm/normalize-package-data.git"
  },
  "version": "2.5.0"
}module.exports = extractDescription

// Extracts description from contents of a readme file in markdown format
function extractDescription (d) {
  if (!d) return;
  if (d === "ERROR: No README data found!") return;
  // the first block of text before the first heading
  // that isn't the first line heading
  d = d.trim().split('\n')
  for (var s = 0; d[s] && d[s].trim().match(/^(#|$)/); s ++);
  var l = d.length
  for (var e = s + 1; e < l && d[e].trim(); e ++);
  return d.slice(s, e).join(' ').trim()
}
var semver = require("semver")
var validateLicense = require('validate-npm-package-license');
var hostedGitInfo = require("hosted-git-info")
var isBuiltinModule = require("resolve").isCore
var depTypes = ["dependencies","devDependencies","optionalDependencies"]
var extractDescription = require("./extract_description")
var url = require("url")
var typos = require("./typos.json")

var fixer = module.exports = {
  // default warning function
  warn: function() {},

  fixRepositoryField: function(data) {
    if (data.repositories) {
      this.warn("repositories");
      data.repository = data.repositories[0]
    }
    if (!data.repository) return this.warn("missingRepository")
    if (typeof data.repository === "string") {
      data.repository = {
        type: "git",
        url: data.repository
      }
    }
    var r = data.repository.url || ""
    if (r) {
      var hosted = hostedGitInfo.fromUrl(r)
      if (hosted) {
        r = data.repository.url
          = hosted.getDefaultRepresentation() == "shortcut" ? hosted.https() : hosted.toString()
      }
    }

    if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) {
      this.warn("brokenGitUrl", r)
    }
  }

, fixTypos: function(data) {
    Object.keys(typos.topLevel).forEach(function (d) {
      if (data.hasOwnProperty(d)) {
        this.warn("typo", d, typos.topLevel[d])
      }
    }, this)
  }

, fixScriptsField: function(data) {
    if (!data.scripts) return
    if (typeof data.scripts !== "object") {
      this.warn("nonObjectScripts")
      delete data.scripts
      return
    }
    Object.keys(data.scripts).forEach(function (k) {
      if (typeof data.scripts[k] !== "string") {
        this.warn("nonStringScript")
        delete data.scripts[k]
      } else if (typos.script[k] && !data.scripts[typos.script[k]]) {
        this.warn("typo", k, typos.script[k], "scripts")
      }
    }, this)
  }

, fixFilesField: function(data) {
    var files = data.files
    if (files && !Array.isArray(files)) {
      this.warn("nonArrayFiles")
      delete data.files
    } else if (data.files) {
      data.files = data.files.filter(function(file) {
        if (!file || typeof file !== "string") {
          this.warn("invalidFilename", file)
          return false
        } else {
          return true
        }
      }, this)
    }
  }

, fixBinField: function(data) {
    if (!data.bin) return;
    if (typeof data.bin === "string") {
      var b = {}
      var match
      if (match = data.name.match(/^@[^/]+[/](.*)$/)) {
        b[match[1]] = data.bin
      } else {
        b[data.name] = data.bin
      }
      data.bin = b
    }
  }

, fixManField: function(data) {
    if (!data.man) return;
    if (typeof data.man === "string") {
      data.man = [ data.man ]
    }
  }
, fixBundleDependenciesField: function(data) {
    var bdd = "bundledDependencies"
    var bd = "bundleDependencies"
    if (data[bdd] && !data[bd]) {
      data[bd] = data[bdd]
      delete data[bdd]
    }
    if (data[bd] && !Array.isArray(data[bd])) {
      this.warn("nonArrayBundleDependencies")
      delete data[bd]
    } else if (data[bd]) {
      data[bd] = data[bd].filter(function(bd) {
        if (!bd || typeof bd !== 'string') {
          this.warn("nonStringBundleDependency", bd)
          return false
        } else {
          if (!data.dependencies) {
            data.dependencies = {}
          }
          if (!data.dependencies.hasOwnProperty(bd)) {
            this.warn("nonDependencyBundleDependency", bd)
            data.dependencies[bd] = "*"
          }
          return true
        }
      }, this)
    }
  }

, fixDependencies: function(data, strict) {
    var loose = !strict
    objectifyDeps(data, this.warn)
    addOptionalDepsToDeps(data, this.warn)
    this.fixBundleDependenciesField(data)

    ;['dependencies','devDependencies'].forEach(function(deps) {
      if (!(deps in data)) return
      if (!data[deps] || typeof data[deps] !== "object") {
        this.warn("nonObjectDependencies", deps)
        delete data[deps]
        return
      }
      Object.keys(data[deps]).forEach(function (d) {
        var r = data[deps][d]
        if (typeof r !== 'string') {
          this.warn("nonStringDependency", d, JSON.stringify(r))
          delete data[deps][d]
        }
        var hosted = hostedGitInfo.fromUrl(data[deps][d])
        if (hosted) data[deps][d] = hosted.toString()
      }, this)
    }, this)
  }

, fixModulesField: function (data) {
    if (data.modules) {
      this.warn("deprecatedModules")
      delete data.modules
    }
  }

, fixKeywordsField: function (data) {
    if (typeof data.keywords === "string") {
      data.keywords = data.keywords.split(/,\s+/)
    }
    if (data.keywords && !Array.isArray(data.keywords)) {
      delete data.keywords
      this.warn("nonArrayKeywords")
    } else if (data.keywords) {
      data.keywords = data.keywords.filter(function(kw) {
        if (typeof kw !== "string" || !kw) {
          this.warn("nonStringKeyword");
          return false
        } else {
          return true
        }
      }, this)
    }
  }

, fixVersionField: function(data, strict) {
    // allow "loose" semver 1.0 versions in non-strict mode
    // enforce strict semver 2.0 compliance in strict mode
    var loose = !strict
    if (!data.version) {
      data.version = ""
      return true
    }
    if (!semver.valid(data.version, loose)) {
      throw new Error('Invalid version: "'+ data.version + '"')
    }
    data.version = semver.clean(data.version, loose)
    return true
  }

, fixPeople: function(data) {
    modifyPeople(data, unParsePerson)
    modifyPeople(data, parsePerson)
  }

, fixNameField: function(data, options) {
    if (typeof options === "boolean") options = {strict: options}
    else if (typeof options === "undefined") options = {}
    var strict = options.strict
    if (!data.name && !strict) {
      data.name = ""
      return
    }
    if (typeof data.name !== "string") {
      throw new Error("name field must be a string.")
    }
    if (!strict)
      data.name = data.name.trim()
    ensureValidName(data.name, strict, options.allowLegacyCase)
    if (isBuiltinModule(data.name))
      this.warn("conflictingName", data.name)
  }


, fixDescriptionField: function (data) {
    if (data.description && typeof data.description !== 'string') {
      this.warn("nonStringDescription")
      delete data.description
    }
    if (data.readme && !data.description)
      data.description = extractDescription(data.readme)
      if(data.description === undefined) delete data.description;
    if (!data.description) this.warn("missingDescription")
  }

, fixReadmeField: function (data) {
    if (!data.readme) {
      this.warn("missingReadme")
      data.readme = "ERROR: No README data found!"
    }
  }

, fixBugsField: function(data) {
    if (!data.bugs && data.repository && data.repository.url) {
      var hosted = hostedGitInfo.fromUrl(data.repository.url)
      if(hosted && hosted.bugs()) {
        data.bugs = {url: hosted.bugs()}
      }
    }
    else if(data.bugs) {
      var emailRe = /^.+@.*\..+$/
      if(typeof data.bugs == "string") {
        if(emailRe.test(data.bugs))
          data.bugs = {email:data.bugs}
        else if(url.parse(data.bugs).protocol)
          data.bugs = {url: data.bugs}
        else
          this.warn("nonEmailUrlBugsString")
      }
      else {
        bugsTypos(data.bugs, this.warn)
        var oldBugs = data.bugs
        data.bugs = {}
        if(oldBugs.url) {
          if(typeof(oldBugs.url) == "string" && url.parse(oldBugs.url).protocol)
            data.bugs.url = oldBugs.url
          else
            this.warn("nonUrlBugsUrlField")
        }
        if(oldBugs.email) {
          if(typeof(oldBugs.email) == "string" && emailRe.test(oldBugs.email))
            data.bugs.email = oldBugs.email
          else
            this.warn("nonEmailBugsEmailField")
        }
      }
      if(!data.bugs.email && !data.bugs.url) {
        delete data.bugs
        this.warn("emptyNormalizedBugs")
      }
    }
  }

, fixHomepageField: function(data) {
    if (!data.homepage && data.repository && data.repository.url) {
      var hosted = hostedGitInfo.fromUrl(data.repository.url)
      if (hosted && hosted.docs()) data.homepage = hosted.docs()
    }
    if (!data.homepage) return

    if(typeof data.homepage !== "string") {
      this.warn("nonUrlHomepage")
      return delete data.homepage
    }
    if(!url.parse(data.homepage).protocol) {
      data.homepage = "http://" + data.homepage
    }
  }

, fixLicenseField: function(data) {
    if (!data.license) {
      return this.warn("missingLicense")
    } else{
      if (
        typeof(data.license) !== 'string' ||
        data.license.length < 1 ||
        data.license.trim() === ''
      ) {
        this.warn("invalidLicense")
      } else {
        if (!validateLicense(data.license).validForNewPackages)
          this.warn("invalidLicense")
      }
    }
  }
}

function isValidScopedPackageName(spec) {
  if (spec.charAt(0) !== '@') return false

  var rest = spec.slice(1).split('/')
  if (rest.length !== 2) return false

  return rest[0] && rest[1] &&
    rest[0] === encodeURIComponent(rest[0]) &&
    rest[1] === encodeURIComponent(rest[1])
}

function isCorrectlyEncodedName(spec) {
  return !spec.match(/[\/@\s\+%:]/) &&
    spec === encodeURIComponent(spec)
}

function ensureValidName (name, strict, allowLegacyCase) {
  if (name.charAt(0) === "." ||
      !(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) ||
      (strict && (!allowLegacyCase) && name !== name.toLowerCase()) ||
      name.toLowerCase() === "node_modules" ||
      name.toLowerCase() === "favicon.ico") {
        throw new Error("Invalid name: " + JSON.stringify(name))
  }
}

function modifyPeople (data, fn) {
  if (data.author) data.author = fn(data.author)
  ;["maintainers", "contributors"].forEach(function (set) {
    if (!Array.isArray(data[set])) return;
    data[set] = data[set].map(fn)
  })
  return data
}

function unParsePerson (person) {
  if (typeof person === "string") return person
  var name = person.name || ""
  var u = person.url || person.web
  var url = u ? (" ("+u+")") : ""
  var e = person.email || person.mail
  var email = e ? (" <"+e+">") : ""
  return name+email+url
}

function parsePerson (person) {
  if (typeof person !== "string") return person
  var name = person.match(/^([^\(<]+)/)
  var url = person.match(/\(([^\)]+)\)/)
  var email = person.match(/<([^>]+)>/)
  var obj = {}
  if (name && name[0].trim()) obj.name = name[0].trim()
  if (email) obj.email = email[1];
  if (url) obj.url = url[1];
  return obj
}

function addOptionalDepsToDeps (data, warn) {
  var o = data.optionalDependencies
  if (!o) return;
  var d = data.dependencies || {}
  Object.keys(o).forEach(function (k) {
    d[k] = o[k]
  })
  data.dependencies = d
}

function depObjectify (deps, type, warn) {
  if (!deps) return {}
  if (typeof deps === "string") {
    deps = deps.trim().split(/[\n\r\s\t ,]+/)
  }
  if (!Array.isArray(deps)) return deps
  warn("deprecatedArrayDependencies", type)
  var o = {}
  deps.filter(function (d) {
    return typeof d === "string"
  }).forEach(function(d) {
    d = d.trim().split(/(:?[@\s><=])/)
    var dn = d.shift()
    var dv = d.join("")
    dv = dv.trim()
    dv = dv.replace(/^@/, "")
    o[dn] = dv
  })
  return o
}

function objectifyDeps (data, warn) {
  depTypes.forEach(function (type) {
    if (!data[type]) return;
    data[type] = depObjectify(data[type], type, warn)
  })
}

function bugsTypos(bugs, warn) {
  if (!bugs) return
  Object.keys(bugs).forEach(function (k) {
    if (typos.bugs[k]) {
      warn("typo", k, typos.bugs[k], "bugs")
      bugs[typos.bugs[k]] = bugs[k]
      delete bugs[k]
    }
  })
}
var util = require("util")
var messages = require("./warning_messages.json")

module.exports = function() {
  var args = Array.prototype.slice.call(arguments, 0)
  var warningName = args.shift()
  if (warningName == "typo") {
    return makeTypoWarning.apply(null,args)
  }
  else {
    var msgTemplate = messages[warningName] ? messages[warningName] : warningName + ": '%s'"
    args.unshift(msgTemplate)
    return util.format.apply(null, args)
  }
}

function makeTypoWarning (providedName, probableName, field) {
  if (field) {
    providedName = field + "['" + providedName + "']"
    probableName = field + "['" + probableName + "']"
  }
  return util.format(messages.typo, providedName, probableName)
}
module.exports = normalize

var fixer = require("./fixer")
normalize.fixer = fixer

var makeWarning = require("./make_warning")

var fieldsToFix = ['name','version','description','repository','modules','scripts'
                  ,'files','bin','man','bugs','keywords','readme','homepage','license']
var otherThingsToFix = ['dependencies','people', 'typos']

var thingsToFix = fieldsToFix.map(function(fieldName) {
  return ucFirst(fieldName) + "Field"
})
// two ways to do this in CoffeeScript on only one line, sub-70 chars:
// thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field"
// thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix)
thingsToFix = thingsToFix.concat(otherThingsToFix)

function normalize (data, warn, strict) {
  if(warn === true) warn = null, strict = true
  if(!strict) strict = false
  if(!warn || data.private) warn = function(msg) { /* noop */ }

  if (data.scripts &&
      data.scripts.install === "node-gyp rebuild" &&
      !data.scripts.preinstall) {
    data.gypfile = true
  }
  fixer.warn = function() { warn(makeWarning.apply(null, arguments)) }
  thingsToFix.forEach(function(thingName) {
    fixer["fix" + ucFirst(thingName)](data, strict)
  })
  data._id = data.name + "@" + data.version
}

function ucFirst (string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}
var util = require('util')

module.exports = function() {
  var args = Array.prototype.slice.call(arguments, 0)
  args.forEach(function(arg) {
    if (!arg) throw new TypeError('Bad arguments.')
  })
  return util.format.apply(null, arguments)
}
{
  "topLevel": {
    "dependancies": "dependencies"
   ,"dependecies": "dependencies"
   ,"depdenencies": "dependencies"
   ,"devEependencies": "devDependencies"
   ,"depends": "dependencies"
   ,"dev-dependencies": "devDependencies"
   ,"devDependences": "devDependencies"
   ,"devDepenencies": "devDependencies"
   ,"devdependencies": "devDependencies"
   ,"repostitory": "repository"
   ,"repo": "repository"
   ,"prefereGlobal": "preferGlobal"
   ,"hompage": "homepage"
   ,"hampage": "homepage"
   ,"autohr": "author"
   ,"autor": "author"
   ,"contributers": "contributors"
   ,"publicationConfig": "publishConfig"
   ,"script": "scripts"
  },
  "bugs": { "web": "url", "name": "url" },
  "script": { "server": "start", "tests": "test" }
}
{
  "repositories": "'repositories' (plural) Not supported. Please pick one as the 'repository' field"
  ,"missingRepository": "No repository field."
  ,"brokenGitUrl": "Probably broken git url: %s"
  ,"nonObjectScripts": "scripts must be an object"
  ,"nonStringScript": "script values must be string commands"
  ,"nonArrayFiles": "Invalid 'files' member"
  ,"invalidFilename": "Invalid filename in 'files' list: %s"
  ,"nonArrayBundleDependencies": "Invalid 'bundleDependencies' list. Must be array of package names"
  ,"nonStringBundleDependency": "Invalid bundleDependencies member: %s"
  ,"nonDependencyBundleDependency": "Non-dependency in bundleDependencies: %s"
  ,"nonObjectDependencies": "%s field must be an object"
  ,"nonStringDependency": "Invalid dependency: %s %s"
  ,"deprecatedArrayDependencies": "specifying %s as array is deprecated"
  ,"deprecatedModules": "modules field is deprecated"
  ,"nonArrayKeywords": "keywords should be an array of strings"
  ,"nonStringKeyword": "keywords should be an array of strings"
  ,"conflictingName": "%s is also the name of a node core module."
  ,"nonStringDescription": "'description' field should be a string"
  ,"missingDescription": "No description"
  ,"missingReadme": "No README data"
  ,"missingLicense": "No license field."
  ,"nonEmailUrlBugsString": "Bug string field must be url, email, or {email,url}"
  ,"nonUrlBugsUrlField": "bugs.url field must be a string url. Deleted."
  ,"nonEmailBugsEmailField": "bugs.email field must be a string email. Deleted."
  ,"emptyNormalizedBugs": "Normalized value of bugs field is an empty object. Deleted."
  ,"nonUrlHomepage": "homepage field must be a string url. Deleted."
  ,"invalidLicense": "license should be a valid SPDX license expression"
  ,"typo": "%s should probably be %s."
}
coverage/
{
  "all": true,
  "check-coverage": true,
  "instrumentation": false,
  "sourceMap": false,
  "reporter": ["html", "text-summary"],
  "lines": 93,
  "statements": 93,
  "functions": 96,
  "branches": 89,
  "exclude": [
    "coverage",
    "example",
    "test",
    "test-core-js.js"
  ]
}
MIT License

Copyright (c) 2013 James Halliday

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var hasMap = typeof Map === 'function' && Map.prototype;
var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;
var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;
var mapForEach = hasMap && Map.prototype.forEach;
var hasSet = typeof Set === 'function' && Set.prototype;
var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;
var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;
var setForEach = hasSet && Set.prototype.forEach;
var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;
var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;
var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;
var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;
var booleanValueOf = Boolean.prototype.valueOf;
var objectToString = Object.prototype.toString;
var match = String.prototype.match;
var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;

var inspectCustom = require('./util.inspect').custom;
var inspectSymbol = inspectCustom && isSymbol(inspectCustom) ? inspectCustom : null;

module.exports = function inspect_(obj, options, depth, seen) {
    var opts = options || {};

    if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) {
        throw new TypeError('option "quoteStyle" must be "single" or "double"');
    }

    if (typeof obj === 'undefined') {
        return 'undefined';
    }
    if (obj === null) {
        return 'null';
    }
    if (typeof obj === 'boolean') {
        return obj ? 'true' : 'false';
    }

    if (typeof obj === 'string') {
        return inspectString(obj, opts);
    }
    if (typeof obj === 'number') {
        if (obj === 0) {
            return Infinity / obj > 0 ? '0' : '-0';
        }
        return String(obj);
    }
    if (typeof obj === 'bigint') { // eslint-disable-line valid-typeof
        return String(obj) + 'n';
    }

    var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;
    if (typeof depth === 'undefined') { depth = 0; }
    if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {
        return '[Object]';
    }

    if (typeof seen === 'undefined') {
        seen = [];
    } else if (indexOf(seen, obj) >= 0) {
        return '[Circular]';
    }

    function inspect(value, from) {
        if (from) {
            seen = seen.slice();
            seen.push(from);
        }
        return inspect_(value, opts, depth + 1, seen);
    }

    if (typeof obj === 'function') {
        var name = nameOf(obj);
        return '[Function' + (name ? ': ' + name : '') + ']';
    }
    if (isSymbol(obj)) {
        var symString = Symbol.prototype.toString.call(obj);
        return typeof obj === 'object' ? markBoxed(symString) : symString;
    }
    if (isElement(obj)) {
        var s = '<' + String(obj.nodeName).toLowerCase();
        var attrs = obj.attributes || [];
        for (var i = 0; i < attrs.length; i++) {
            s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);
        }
        s += '>';
        if (obj.childNodes && obj.childNodes.length) { s += '...'; }
        s += '</' + String(obj.nodeName).toLowerCase() + '>';
        return s;
    }
    if (isArray(obj)) {
        if (obj.length === 0) { return '[]'; }
        return '[ ' + arrObjKeys(obj, inspect).join(', ') + ' ]';
    }
    if (isError(obj)) {
        var parts = arrObjKeys(obj, inspect);
        if (parts.length === 0) { return '[' + String(obj) + ']'; }
        return '{ [' + String(obj) + '] ' + parts.join(', ') + ' }';
    }
    if (typeof obj === 'object') {
        if (inspectSymbol && typeof obj[inspectSymbol] === 'function') {
            return obj[inspectSymbol]();
        } else if (typeof obj.inspect === 'function') {
            return obj.inspect();
        }
    }
    if (isMap(obj)) {
        var mapParts = [];
        mapForEach.call(obj, function (value, key) {
            mapParts.push(inspect(key, obj) + ' => ' + inspect(value, obj));
        });
        return collectionOf('Map', mapSize.call(obj), mapParts);
    }
    if (isSet(obj)) {
        var setParts = [];
        setForEach.call(obj, function (value) {
            setParts.push(inspect(value, obj));
        });
        return collectionOf('Set', setSize.call(obj), setParts);
    }
    if (isWeakMap(obj)) {
        return weakCollectionOf('WeakMap');
    }
    if (isWeakSet(obj)) {
        return weakCollectionOf('WeakSet');
    }
    if (isNumber(obj)) {
        return markBoxed(inspect(Number(obj)));
    }
    if (isBigInt(obj)) {
        return markBoxed(inspect(bigIntValueOf.call(obj)));
    }
    if (isBoolean(obj)) {
        return markBoxed(booleanValueOf.call(obj));
    }
    if (isString(obj)) {
        return markBoxed(inspect(String(obj)));
    }
    if (!isDate(obj) && !isRegExp(obj)) {
        var xs = arrObjKeys(obj, inspect);
        if (xs.length === 0) { return '{}'; }
        return '{ ' + xs.join(', ') + ' }';
    }
    return String(obj);
};

function wrapQuotes(s, defaultStyle, opts) {
    var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'";
    return quoteChar + s + quoteChar;
}

function quote(s) {
    return String(s).replace(/"/g, '&quot;');
}

function isArray(obj) { return toStr(obj) === '[object Array]'; }
function isDate(obj) { return toStr(obj) === '[object Date]'; }
function isRegExp(obj) { return toStr(obj) === '[object RegExp]'; }
function isError(obj) { return toStr(obj) === '[object Error]'; }
function isSymbol(obj) { return toStr(obj) === '[object Symbol]'; }
function isString(obj) { return toStr(obj) === '[object String]'; }
function isNumber(obj) { return toStr(obj) === '[object Number]'; }
function isBigInt(obj) { return toStr(obj) === '[object BigInt]'; }
function isBoolean(obj) { return toStr(obj) === '[object Boolean]'; }

var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };
function has(obj, key) {
    return hasOwn.call(obj, key);
}

function toStr(obj) {
    return objectToString.call(obj);
}

function nameOf(f) {
    if (f.name) { return f.name; }
    var m = match.call(f, /^function\s*([\w$]+)/);
    if (m) { return m[1]; }
    return null;
}

function indexOf(xs, x) {
    if (xs.indexOf) { return xs.indexOf(x); }
    for (var i = 0, l = xs.length; i < l; i++) {
        if (xs[i] === x) { return i; }
    }
    return -1;
}

function isMap(x) {
    if (!mapSize || !x || typeof x !== 'object') {
        return false;
    }
    try {
        mapSize.call(x);
        try {
            setSize.call(x);
        } catch (s) {
            return true;
        }
        return x instanceof Map; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakMap(x) {
    if (!weakMapHas || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakMapHas.call(x, weakMapHas);
        try {
            weakSetHas.call(x, weakSetHas);
        } catch (s) {
            return true;
        }
        return x instanceof WeakMap; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isSet(x) {
    if (!setSize || !x || typeof x !== 'object') {
        return false;
    }
    try {
        setSize.call(x);
        try {
            mapSize.call(x);
        } catch (m) {
            return true;
        }
        return x instanceof Set; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakSet(x) {
    if (!weakSetHas || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakSetHas.call(x, weakSetHas);
        try {
            weakMapHas.call(x, weakMapHas);
        } catch (s) {
            return true;
        }
        return x instanceof WeakSet; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isElement(x) {
    if (!x || typeof x !== 'object') { return false; }
    if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {
        return true;
    }
    return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';
}

function inspectString(str, opts) {
    // eslint-disable-next-line no-control-regex
    var s = str.replace(/(['\\])/g, '\\$1').replace(/[\x00-\x1f]/g, lowbyte);
    return wrapQuotes(s, 'single', opts);
}

function lowbyte(c) {
    var n = c.charCodeAt(0);
    var x = {
        8: 'b', 9: 't', 10: 'n', 12: 'f', 13: 'r'
    }[n];
    if (x) { return '\\' + x; }
    return '\\x' + (n < 0x10 ? '0' : '') + n.toString(16);
}

function markBoxed(str) {
    return 'Object(' + str + ')';
}

function weakCollectionOf(type) {
    return type + ' { ? }';
}

function collectionOf(type, size, entries) {
    return type + ' (' + size + ') {' + entries.join(', ') + '}';
}

function arrObjKeys(obj, inspect) {
    var isArr = isArray(obj);
    var xs = [];
    if (isArr) {
        xs.length = obj.length;
        for (var i = 0; i < obj.length; i++) {
            xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';
        }
    }
    for (var key in obj) { // eslint-disable-line no-restricted-syntax
        if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
        if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
        if ((/[^\w$]/).test(key)) {
            xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));
        } else {
            xs.push(key + ': ' + inspect(obj[key], obj));
        }
    }
    return xs;
}
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "browser": {
    "./util.inspect.js": false
  },
  "deprecated": false,
  "description": "string representations of objects in node and the browser",
  "devDependencies": {
    "@ljharb/eslint-config": "^15.0.1",
    "core-js": "^2.6.10",
    "eslint": "^6.6.0",
    "nyc": "^10.3.2",
    "tape": "^4.11.0"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "greenkeeper": {
    "ignore": [
      "nyc",
      "core-js"
    ]
  },
  "homepage": "https://github.com/substack/object-inspect",
  "license": "MIT",
  "main": "index.js",
  "name": "object-inspect",
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/object-inspect.git"
  },
  "testling": {
    "files": [
      "test/*.js",
      "test/browser/*.js"
    ],
    "browsers": [
      "ie/6..latest",
      "chrome/latest",
      "firefox/latest",
      "safari/latest",
      "opera/latest",
      "iphone/latest",
      "ipad/latest",
      "android/latest"
    ]
  },
  "version": "1.7.0"
}'use strict';

require('core-js');

var inspect = require('./');
var test = require('tape');

test('Maps', function (t) {
    t.equal(inspect(new Map([[1, 2]])), 'Map (1) {1 => 2}');
    t.end();
});

test('Sets', function (t) {
    t.equal(inspect(new Set([[1, 2]])), 'Set (1) {[ 1, 2 ]}');
    t.end();
});
module.exports = require('util').inspect;
The MIT License (MIT)

Copyright (c) 2014 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict';

// http://www.ecma-international.org/ecma-262/6.0/#sec-object.is

var numberIsNaN = function (value) {
	return value !== value;
};

module.exports = function is(a, b) {
	if (a === 0 && b === 0) {
		return 1 / a === 1 / b;
	}
	if (a === b) {
		return true;
	}
	if (numberIsNaN(a) && numberIsNaN(b)) {
		return true;
	}
	return false;
};

{
  "author": {
    "name": "Jordan Harband"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false
  },
  "dependencies": {},
  "deprecated": false,
  "description": "ES2015-compliant shim for Object.is - differentiates between -0 and +0",
  "devDependencies": {
    "@ljharb/eslint-config": "^15.0.2",
    "auto-changelog": "^1.16.2",
    "covert": "^1.1.1",
    "eslint": "^6.7.2",
    "has-symbols": "^1.0.1",
    "tape": "^4.11.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/es-shims/object-is",
  "license": "MIT",
  "main": "index.js",
  "name": "object-is",
  "repository": {
    "type": "git",
    "url": "git://github.com/es-shims/object-is.git"
  },
  "testling": {
    "files": "test.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..12.0",
      "opera/15.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "1.0.2"
}name: Automatic Rebase

on: [pull_request]

jobs:
  _:
    name: "Automatic Rebase"

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - uses: ljharb/rebase@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
root = true

[*]
indent_style = tab;
insert_final_newline = true;
quote_type = auto;
space_after_anonymous_functions = true;
space_after_control_statements = true;
spaces_around_operators = true;
trim_trailing_whitespace = true;
spaces_in_brackets = false;
end_of_line = lf;

The MIT License (MIT)

Copyright (C) 2013 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.'use strict';

var keysShim;
if (!Object.keys) {
	// modified from https://github.com/es-shims/es5-shim
	var has = Object.prototype.hasOwnProperty;
	var toStr = Object.prototype.toString;
	var isArgs = require('./isArguments'); // eslint-disable-line global-require
	var isEnumerable = Object.prototype.propertyIsEnumerable;
	var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
	var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
	var dontEnums = [
		'toString',
		'toLocaleString',
		'valueOf',
		'hasOwnProperty',
		'isPrototypeOf',
		'propertyIsEnumerable',
		'constructor'
	];
	var equalsConstructorPrototype = function (o) {
		var ctor = o.constructor;
		return ctor && ctor.prototype === o;
	};
	var excludedKeys = {
		$applicationCache: true,
		$console: true,
		$external: true,
		$frame: true,
		$frameElement: true,
		$frames: true,
		$innerHeight: true,
		$innerWidth: true,
		$onmozfullscreenchange: true,
		$onmozfullscreenerror: true,
		$outerHeight: true,
		$outerWidth: true,
		$pageXOffset: true,
		$pageYOffset: true,
		$parent: true,
		$scrollLeft: true,
		$scrollTop: true,
		$scrollX: true,
		$scrollY: true,
		$self: true,
		$webkitIndexedDB: true,
		$webkitStorageInfo: true,
		$window: true
	};
	var hasAutomationEqualityBug = (function () {
		/* global window */
		if (typeof window === 'undefined') { return false; }
		for (var k in window) {
			try {
				if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
					try {
						equalsConstructorPrototype(window[k]);
					} catch (e) {
						return true;
					}
				}
			} catch (e) {
				return true;
			}
		}
		return false;
	}());
	var equalsConstructorPrototypeIfNotBuggy = function (o) {
		/* global window */
		if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
			return equalsConstructorPrototype(o);
		}
		try {
			return equalsConstructorPrototype(o);
		} catch (e) {
			return false;
		}
	};

	keysShim = function keys(object) {
		var isObject = object !== null && typeof object === 'object';
		var isFunction = toStr.call(object) === '[object Function]';
		var isArguments = isArgs(object);
		var isString = isObject && toStr.call(object) === '[object String]';
		var theKeys = [];

		if (!isObject && !isFunction && !isArguments) {
			throw new TypeError('Object.keys called on a non-object');
		}

		var skipProto = hasProtoEnumBug && isFunction;
		if (isString && object.length > 0 && !has.call(object, 0)) {
			for (var i = 0; i < object.length; ++i) {
				theKeys.push(String(i));
			}
		}

		if (isArguments && object.length > 0) {
			for (var j = 0; j < object.length; ++j) {
				theKeys.push(String(j));
			}
		} else {
			for (var name in object) {
				if (!(skipProto && name === 'prototype') && has.call(object, name)) {
					theKeys.push(String(name));
				}
			}
		}

		if (hasDontEnumBug) {
			var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);

			for (var k = 0; k < dontEnums.length; ++k) {
				if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
					theKeys.push(dontEnums[k]);
				}
			}
		}
		return theKeys;
	};
}
module.exports = keysShim;
'use strict';

var slice = Array.prototype.slice;
var isArgs = require('./isArguments');

var origKeys = Object.keys;
var keysShim = origKeys ? function keys(o) { return origKeys(o); } : require('./implementation');

var originalKeys = Object.keys;

keysShim.shim = function shimObjectKeys() {
	if (Object.keys) {
		var keysWorksWithArguments = (function () {
			// Safari 5.0 bug
			var args = Object.keys(arguments);
			return args && args.length === arguments.length;
		}(1, 2));
		if (!keysWorksWithArguments) {
			Object.keys = function keys(object) { // eslint-disable-line func-name-matching
				if (isArgs(object)) {
					return originalKeys(slice.call(object));
				}
				return originalKeys(object);
			};
		}
	} else {
		Object.keys = keysShim;
	}
	return Object.keys || keysShim;
};

module.exports = keysShim;
'use strict';

var toStr = Object.prototype.toString;

module.exports = function isArguments(value) {
	var str = toStr.call(value);
	var isArgs = str === '[object Arguments]';
	if (!isArgs) {
		isArgs = str !== '[object Array]' &&
			value !== null &&
			typeof value === 'object' &&
			typeof value.length === 'number' &&
			value.length >= 0 &&
			toStr.call(value.callee) === '[object Function]';
	}
	return isArgs;
};
{
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com",
    "url": "http://ljharb.codes"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "An Object.keys replacement, in case Object.keys is not available. From https://github.com/es-shims/es5-shim",
  "devDependencies": {
    "@ljharb/eslint-config": "^13.1.1",
    "covert": "^1.1.1",
    "eslint": "^5.13.0",
    "foreach": "^2.0.5",
    "indexof": "^0.0.1",
    "is": "^3.3.0",
    "tape": "^4.9.2"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "homepage": "https://github.com/ljharb/object-keys#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "object-keys",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/object-keys.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "1.1.1"
}root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 120

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
The MIT License (MIT)

Copyright (c) 2014 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.'use strict';

require('./shim')();
'use strict';

var keys = require('object-keys');

module.exports = function hasSymbols() {
	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
	if (typeof Symbol.iterator === 'symbol') { return true; }

	var obj = {};
	var sym = Symbol('test');
	var symObj = Object(sym);
	if (typeof sym === 'string') { return false; }

	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }

	// temp disabled per https://github.com/ljharb/object.assign/issues/17
	// if (sym instanceof Symbol) { return false; }
	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
	// if (!(symObj instanceof Symbol)) { return false; }

	var symVal = 42;
	obj[sym] = symVal;
	for (sym in obj) { return false; }
	if (keys(obj).length !== 0) { return false; }
	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }

	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }

	var syms = Object.getOwnPropertySymbols(obj);
	if (syms.length !== 1 || syms[0] !== sym) { return false; }

	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }

	if (typeof Object.getOwnPropertyDescriptor === 'function') {
		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
	}

	return true;
};
'use strict';

// modified from https://github.com/es-shims/es6-shim
var keys = require('object-keys');
var bind = require('function-bind');
var canBeObject = function (obj) {
	return typeof obj !== 'undefined' && obj !== null;
};
var hasSymbols = require('has-symbols/shams')();
var toObject = Object;
var push = bind.call(Function.call, Array.prototype.push);
var propIsEnumerable = bind.call(Function.call, Object.prototype.propertyIsEnumerable);
var originalGetSymbols = hasSymbols ? Object.getOwnPropertySymbols : null;

module.exports = function assign(target, source1) {
	if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
	var objTarget = toObject(target);
	var s, source, i, props, syms, value, key;
	for (s = 1; s < arguments.length; ++s) {
		source = toObject(arguments[s]);
		props = keys(source);
		var getSymbols = hasSymbols && (Object.getOwnPropertySymbols || originalGetSymbols);
		if (getSymbols) {
			syms = getSymbols(source);
			for (i = 0; i < syms.length; ++i) {
				key = syms[i];
				if (propIsEnumerable(source, key)) {
					push(props, key);
				}
			}
		}
		for (i = 0; i < props.length; ++i) {
			key = props[i];
			value = source[key];
			if (propIsEnumerable(source, key)) {
				objTarget[key] = value;
			}
		}
	}
	return objTarget;
};
'use strict';

var defineProperties = require('define-properties');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var polyfill = getPolyfill();

defineProperties(polyfill, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = polyfill;
{
  "author": {
    "name": "Jordan Harband"
  },
  "dependencies": {
    "define-properties": "^1.1.2",
    "function-bind": "^1.1.1",
    "has-symbols": "^1.0.0",
    "object-keys": "^1.0.11"
  },
  "deprecated": false,
  "description": "ES6 spec-compliant Object.assign shim. From https://github.com/es-shims/es6-shim",
  "devDependencies": {
    "@es-shims/api": "^2.1.1",
    "@ljharb/eslint-config": "^12.2.1",
    "browserify": "^14.5.0",
    "covert": "^1.1.0",
    "eslint": "^4.13.1",
    "for-each": "^0.3.2",
    "is": "^3.2.1",
    "jscs": "^3.0.7",
    "nsp": "^3.1.0",
    "tape": "^4.8.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "homepage": "https://github.com/ljharb/object.assign#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "object.assign",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/object.assign.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "4.1.0"
}'use strict';

var implementation = require('./implementation');

var lacksProperEnumerationOrder = function () {
	if (!Object.assign) {
		return false;
	}
	// v8, specifically in node 4.x, has a bug with incorrect property enumeration order
	// note: this does not detect the bug unless there's 20 characters
	var str = 'abcdefghijklmnopqrst';
	var letters = str.split('');
	var map = {};
	for (var i = 0; i < letters.length; ++i) {
		map[letters[i]] = letters[i];
	}
	var obj = Object.assign({}, map);
	var actual = '';
	for (var k in obj) {
		actual += k;
	}
	return str !== actual;
};

var assignHasPendingExceptions = function () {
	if (!Object.assign || !Object.preventExtensions) {
		return false;
	}
	// Firefox 37 still has "pending exception" logic in its Object.assign implementation,
	// which is 72% slower than our shim, and Firefox 40's native implementation.
	var thrower = Object.preventExtensions({ 1: 2 });
	try {
		Object.assign(thrower, 'xy');
	} catch (e) {
		return thrower[1] === 'y';
	}
	return false;
};

module.exports = function getPolyfill() {
	if (!Object.assign) {
		return implementation;
	}
	if (lacksProperEnumerationOrder()) {
		return implementation;
	}
	if (assignHasPendingExceptions()) {
		return implementation;
	}
	return Object.assign;
};
'use strict';

var define = require('define-properties');
var getPolyfill = require('./polyfill');

module.exports = function shimAssign() {
	var polyfill = getPolyfill();
	define(
		Object,
		{ assign: polyfill },
		{ assign: function () { return Object.assign !== polyfill; } }
	);
	return polyfill;
};
###-begin-npm-completion-###
#
# npm command completion script
#
# Installation: npm completion >> ~/.bashrc  (or ~/.zshrc)
# Or, maybe: npm completion > /usr/local/etc/bash_completion.d/npm
#

COMP_WORDBREAKS=${COMP_WORDBREAKS/=/}
COMP_WORDBREAKS=${COMP_WORDBREAKS/@/}
export COMP_WORDBREAKS

if type complete &>/dev/null; then
  _npm_completion () {
    local si="$IFS"
    IFS=$'\n' COMPREPLY=($(COMP_CWORD="$COMP_CWORD" \
                           COMP_LINE="$COMP_LINE" \
                           COMP_POINT="$COMP_POINT" \
                           npm completion -- "${COMP_WORDS[@]}" \
                           2>/dev/null)) || return $?
    IFS="$si"
  }
  complete -F _npm_completion npm
elif type compdef &>/dev/null; then
  _npm_completion() {
    si=$IFS
    compadd -- $(COMP_CWORD=$((CURRENT-1)) \
                 COMP_LINE=$BUFFER \
                 COMP_POINT=0 \
                 npm completion -- "${words[@]}" \
                 2>/dev/null)
    IFS=$si
  }
  compdef _npm_completion npm
elif type compctl &>/dev/null; then
  _npm_completion () {
    local cword line point words si
    read -Ac words
    read -cn cword
    let cword-=1
    read -l line
    read -ln point
    si="$IFS"
    IFS=$'\n' reply=($(COMP_CWORD="$cword" \
                       COMP_LINE="$line" \
                       COMP_POINT="$point" \
                       npm completion -- "${words[@]}" \
                       2>/dev/null)) || return $?
    IFS="$si"
  }
  compctl -K _npm_completion npm
fi
###-end-npm-completion-###
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
'use strict';

var keys = require('object-keys').shim();
delete keys.shim;

var assign = require('./');

module.exports = assign.shim();

delete assign.shim;

},{"./":3,"object-keys":9}],2:[function(require,module,exports){
'use strict';

// modified from https://github.com/es-shims/es6-shim
var keys = require('object-keys');
var bind = require('function-bind');
var canBeObject = function (obj) {
	return typeof obj !== 'undefined' && obj !== null;
};
var hasSymbols = require('has-symbols/shams')();
var toObject = Object;
var push = bind.call(Function.call, Array.prototype.push);
var propIsEnumerable = bind.call(Function.call, Object.prototype.propertyIsEnumerable);
var originalGetSymbols = hasSymbols ? Object.getOwnPropertySymbols : null;

module.exports = function assign(target, source1) {
	if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
	var objTarget = toObject(target);
	var s, source, i, props, syms, value, key;
	for (s = 1; s < arguments.length; ++s) {
		source = toObject(arguments[s]);
		props = keys(source);
		var getSymbols = hasSymbols && (Object.getOwnPropertySymbols || originalGetSymbols);
		if (getSymbols) {
			syms = getSymbols(source);
			for (i = 0; i < syms.length; ++i) {
				key = syms[i];
				if (propIsEnumerable(source, key)) {
					push(props, key);
				}
			}
		}
		for (i = 0; i < props.length; ++i) {
			key = props[i];
			value = source[key];
			if (propIsEnumerable(source, key)) {
				objTarget[key] = value;
			}
		}
	}
	return objTarget;
};

},{"function-bind":7,"has-symbols/shams":8,"object-keys":9}],3:[function(require,module,exports){
'use strict';

var defineProperties = require('define-properties');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var polyfill = getPolyfill();

defineProperties(polyfill, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = polyfill;

},{"./implementation":2,"./polyfill":11,"./shim":12,"define-properties":4}],4:[function(require,module,exports){
'use strict';

var keys = require('object-keys');
var foreach = require('foreach');
var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';

var toStr = Object.prototype.toString;

var isFunction = function (fn) {
	return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
};

var arePropertyDescriptorsSupported = function () {
	var obj = {};
	try {
		Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
        /* eslint-disable no-unused-vars, no-restricted-syntax */
        for (var _ in obj) { return false; }
        /* eslint-enable no-unused-vars, no-restricted-syntax */
		return obj.x === obj;
	} catch (e) { /* this is IE 8. */
		return false;
	}
};
var supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported();

var defineProperty = function (object, name, value, predicate) {
	if (name in object && (!isFunction(predicate) || !predicate())) {
		return;
	}
	if (supportsDescriptors) {
		Object.defineProperty(object, name, {
			configurable: true,
			enumerable: false,
			value: value,
			writable: true
		});
	} else {
		object[name] = value;
	}
};

var defineProperties = function (object, map) {
	var predicates = arguments.length > 2 ? arguments[2] : {};
	var props = keys(map);
	if (hasSymbols) {
		props = props.concat(Object.getOwnPropertySymbols(map));
	}
	foreach(props, function (name) {
		defineProperty(object, name, map[name], predicates[name]);
	});
};

defineProperties.supportsDescriptors = !!supportsDescriptors;

module.exports = defineProperties;

},{"foreach":5,"object-keys":9}],5:[function(require,module,exports){

var hasOwn = Object.prototype.hasOwnProperty;
var toString = Object.prototype.toString;

module.exports = function forEach (obj, fn, ctx) {
    if (toString.call(fn) !== '[object Function]') {
        throw new TypeError('iterator must be a function');
    }
    var l = obj.length;
    if (l === +l) {
        for (var i = 0; i < l; i++) {
            fn.call(ctx, obj[i], i, obj);
        }
    } else {
        for (var k in obj) {
            if (hasOwn.call(obj, k)) {
                fn.call(ctx, obj[k], k, obj);
            }
        }
    }
};


},{}],6:[function(require,module,exports){
'use strict';

/* eslint no-invalid-this: 1 */

var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var slice = Array.prototype.slice;
var toStr = Object.prototype.toString;
var funcType = '[object Function]';

module.exports = function bind(that) {
    var target = this;
    if (typeof target !== 'function' || toStr.call(target) !== funcType) {
        throw new TypeError(ERROR_MESSAGE + target);
    }
    var args = slice.call(arguments, 1);

    var bound;
    var binder = function () {
        if (this instanceof bound) {
            var result = target.apply(
                this,
                args.concat(slice.call(arguments))
            );
            if (Object(result) === result) {
                return result;
            }
            return this;
        } else {
            return target.apply(
                that,
                args.concat(slice.call(arguments))
            );
        }
    };

    var boundLength = Math.max(0, target.length - args.length);
    var boundArgs = [];
    for (var i = 0; i < boundLength; i++) {
        boundArgs.push('$' + i);
    }

    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);

    if (target.prototype) {
        var Empty = function Empty() {};
        Empty.prototype = target.prototype;
        bound.prototype = new Empty();
        Empty.prototype = null;
    }

    return bound;
};

},{}],7:[function(require,module,exports){
'use strict';

var implementation = require('./implementation');

module.exports = Function.prototype.bind || implementation;

},{"./implementation":6}],8:[function(require,module,exports){
'use strict';

/* eslint complexity: [2, 17], max-statements: [2, 33] */
module.exports = function hasSymbols() {
	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
	if (typeof Symbol.iterator === 'symbol') { return true; }

	var obj = {};
	var sym = Symbol('test');
	var symObj = Object(sym);
	if (typeof sym === 'string') { return false; }

	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }

	// temp disabled per https://github.com/ljharb/object.assign/issues/17
	// if (sym instanceof Symbol) { return false; }
	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
	// if (!(symObj instanceof Symbol)) { return false; }

	// if (typeof Symbol.prototype.toString !== 'function') { return false; }
	// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }

	var symVal = 42;
	obj[sym] = symVal;
	for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax
	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }

	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }

	var syms = Object.getOwnPropertySymbols(obj);
	if (syms.length !== 1 || syms[0] !== sym) { return false; }

	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }

	if (typeof Object.getOwnPropertyDescriptor === 'function') {
		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
	}

	return true;
};

},{}],9:[function(require,module,exports){
'use strict';

// modified from https://github.com/es-shims/es5-shim
var has = Object.prototype.hasOwnProperty;
var toStr = Object.prototype.toString;
var slice = Array.prototype.slice;
var isArgs = require('./isArguments');
var isEnumerable = Object.prototype.propertyIsEnumerable;
var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
var dontEnums = [
	'toString',
	'toLocaleString',
	'valueOf',
	'hasOwnProperty',
	'isPrototypeOf',
	'propertyIsEnumerable',
	'constructor'
];
var equalsConstructorPrototype = function (o) {
	var ctor = o.constructor;
	return ctor && ctor.prototype === o;
};
var excludedKeys = {
	$console: true,
	$external: true,
	$frame: true,
	$frameElement: true,
	$frames: true,
	$innerHeight: true,
	$innerWidth: true,
	$outerHeight: true,
	$outerWidth: true,
	$pageXOffset: true,
	$pageYOffset: true,
	$parent: true,
	$scrollLeft: true,
	$scrollTop: true,
	$scrollX: true,
	$scrollY: true,
	$self: true,
	$webkitIndexedDB: true,
	$webkitStorageInfo: true,
	$window: true
};
var hasAutomationEqualityBug = (function () {
	/* global window */
	if (typeof window === 'undefined') { return false; }
	for (var k in window) {
		try {
			if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
				try {
					equalsConstructorPrototype(window[k]);
				} catch (e) {
					return true;
				}
			}
		} catch (e) {
			return true;
		}
	}
	return false;
}());
var equalsConstructorPrototypeIfNotBuggy = function (o) {
	/* global window */
	if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
		return equalsConstructorPrototype(o);
	}
	try {
		return equalsConstructorPrototype(o);
	} catch (e) {
		return false;
	}
};

var keysShim = function keys(object) {
	var isObject = object !== null && typeof object === 'object';
	var isFunction = toStr.call(object) === '[object Function]';
	var isArguments = isArgs(object);
	var isString = isObject && toStr.call(object) === '[object String]';
	var theKeys = [];

	if (!isObject && !isFunction && !isArguments) {
		throw new TypeError('Object.keys called on a non-object');
	}

	var skipProto = hasProtoEnumBug && isFunction;
	if (isString && object.length > 0 && !has.call(object, 0)) {
		for (var i = 0; i < object.length; ++i) {
			theKeys.push(String(i));
		}
	}

	if (isArguments && object.length > 0) {
		for (var j = 0; j < object.length; ++j) {
			theKeys.push(String(j));
		}
	} else {
		for (var name in object) {
			if (!(skipProto && name === 'prototype') && has.call(object, name)) {
				theKeys.push(String(name));
			}
		}
	}

	if (hasDontEnumBug) {
		var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);

		for (var k = 0; k < dontEnums.length; ++k) {
			if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
				theKeys.push(dontEnums[k]);
			}
		}
	}
	return theKeys;
};

keysShim.shim = function shimObjectKeys() {
	if (Object.keys) {
		var keysWorksWithArguments = (function () {
			// Safari 5.0 bug
			return (Object.keys(arguments) || '').length === 2;
		}(1, 2));
		if (!keysWorksWithArguments) {
			var originalKeys = Object.keys;
			Object.keys = function keys(object) {
				if (isArgs(object)) {
					return originalKeys(slice.call(object));
				} else {
					return originalKeys(object);
				}
			};
		}
	} else {
		Object.keys = keysShim;
	}
	return Object.keys || keysShim;
};

module.exports = keysShim;

},{"./isArguments":10}],10:[function(require,module,exports){
'use strict';

var toStr = Object.prototype.toString;

module.exports = function isArguments(value) {
	var str = toStr.call(value);
	var isArgs = str === '[object Arguments]';
	if (!isArgs) {
		isArgs = str !== '[object Array]' &&
			value !== null &&
			typeof value === 'object' &&
			typeof value.length === 'number' &&
			value.length >= 0 &&
			toStr.call(value.callee) === '[object Function]';
	}
	return isArgs;
};

},{}],11:[function(require,module,exports){
'use strict';

var implementation = require('./implementation');

var lacksProperEnumerationOrder = function () {
	if (!Object.assign) {
		return false;
	}
	// v8, specifically in node 4.x, has a bug with incorrect property enumeration order
	// note: this does not detect the bug unless there's 20 characters
	var str = 'abcdefghijklmnopqrst';
	var letters = str.split('');
	var map = {};
	for (var i = 0; i < letters.length; ++i) {
		map[letters[i]] = letters[i];
	}
	var obj = Object.assign({}, map);
	var actual = '';
	for (var k in obj) {
		actual += k;
	}
	return str !== actual;
};

var assignHasPendingExceptions = function () {
	if (!Object.assign || !Object.preventExtensions) {
		return false;
	}
	// Firefox 37 still has "pending exception" logic in its Object.assign implementation,
	// which is 72% slower than our shim, and Firefox 40's native implementation.
	var thrower = Object.preventExtensions({ 1: 2 });
	try {
		Object.assign(thrower, 'xy');
	} catch (e) {
		return thrower[1] === 'y';
	}
	return false;
};

module.exports = function getPolyfill() {
	if (!Object.assign) {
		return implementation;
	}
	if (lacksProperEnumerationOrder()) {
		return implementation;
	}
	if (assignHasPendingExceptions()) {
		return implementation;
	}
	return Object.assign;
};

},{"./implementation":2}],12:[function(require,module,exports){
'use strict';

var define = require('define-properties');
var getPolyfill = require('./polyfill');

module.exports = function shimAssign() {
	var polyfill = getPolyfill();
	define(
		Object,
		{ assign: polyfill },
		{ assign: function () { return Object.assign !== polyfill; } }
	);
	return polyfill;
};

},{"./polyfill":11,"define-properties":4}]},{},[1]);
The MIT License (MIT)

Copyright (c) 2017 Zhou Hancheng (z308114274@gmail.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
module.exports = (val) => {
  return val != null && typeof val === 'object' && val.constructor !== RegExp
}
{
  "author": {
    "name": "zhouhancheng",
    "email": "z308114274@gmail.com"
  },
  "dependencies": {
    "tape": "^4.8.0"
  },
  "deprecated": false,
  "description": "Is the value an object or an array but not null?",
  "homepage": "https://github.com/ZhouHansen/objectnotnull#readme",
  "license": "ISC",
  "main": "dist/index.js",
  "name": "objectorarray",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ZhouHansen/objectnotnull.git"
  },
  "version": "1.0.3"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
var wrappy = require('wrappy')
module.exports = wrappy(once)
module.exports.strict = wrappy(onceStrict)

once.proto = once(function () {
  Object.defineProperty(Function.prototype, 'once', {
    value: function () {
      return once(this)
    },
    configurable: true
  })

  Object.defineProperty(Function.prototype, 'onceStrict', {
    value: function () {
      return onceStrict(this)
    },
    configurable: true
  })
})

function once (fn) {
  var f = function () {
    if (f.called) return f.value
    f.called = true
    return f.value = fn.apply(this, arguments)
  }
  f.called = false
  return f
}

function onceStrict (fn) {
  var f = function () {
    if (f.called)
      throw new Error(f.onceError)
    f.called = true
    return f.value = fn.apply(this, arguments)
  }
  var name = fn.name || 'Function wrapped with `once`'
  f.onceError = name + " shouldn't be called more than once"
  f.called = false
  return f
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {
    "wrappy": "1"
  },
  "deprecated": false,
  "description": "Run a function exactly one time",
  "devDependencies": {
    "tap": "^7.0.1"
  },
  "directories": {
    "test": "test"
  },
  "files": [
    "once.js"
  ],
  "homepage": "https://github.com/isaacs/once#readme",
  "license": "ISC",
  "main": "once.js",
  "name": "once",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/once.git"
  },
  "version": "1.4.0"
}'use strict';
var os = require('os');

function homedir() {
	var env = process.env;
	var home = env.HOME;
	var user = env.LOGNAME || env.USER || env.LNAME || env.USERNAME;

	if (process.platform === 'win32') {
		return env.USERPROFILE || env.HOMEDRIVE + env.HOMEPATH || home || null;
	}

	if (process.platform === 'darwin') {
		return home || (user ? '/Users/' + user : null);
	}

	if (process.platform === 'linux') {
		return home || (process.getuid() === 0 ? '/root' : (user ? '/home/' + user : null));
	}

	return home || null;
}

module.exports = typeof os.homedir === 'function' ? os.homedir : homedir;
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Node.js 4 `os.homedir()` ponyfill",
  "devDependencies": {
    "ava": "*",
    "path-exists": "^2.0.0",
    "xo": "^0.16.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/os-homedir#readme",
  "license": "MIT",
  "name": "os-homedir",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/os-homedir.git"
  },
  "version": "1.0.2"
}'use strict';
var isWindows = process.platform === 'win32';
var trailingSlashRe = isWindows ? /[^:]\\$/ : /.\/$/;

// https://github.com/nodejs/node/blob/3e7a14381497a3b73dda68d05b5130563cdab420/lib/os.js#L25-L43
module.exports = function () {
	var path;

	if (isWindows) {
		path = process.env.TEMP ||
			process.env.TMP ||
			(process.env.SystemRoot || process.env.windir) + '\\temp';
	} else {
		path = process.env.TMPDIR ||
			process.env.TMP ||
			process.env.TEMP ||
			'/tmp';
	}

	if (trailingSlashRe.test(path)) {
		path = path.slice(0, -1);
	}

	return path;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Node.js os.tmpdir() ponyfill",
  "devDependencies": {
    "ava": "*",
    "xo": "^0.16.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/os-tmpdir#readme",
  "license": "MIT",
  "name": "os-tmpdir",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/os-tmpdir.git"
  },
  "version": "1.0.2"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
var isWindows = process.platform === 'win32'
var path = require('path')
var exec = require('child_process').exec
var osTmpdir = require('os-tmpdir')
var osHomedir = require('os-homedir')

// looking up envs is a bit costly.
// Also, sometimes we want to have a fallback
// Pass in a callback to wait for the fallback on failures
// After the first lookup, always returns the same thing.
function memo (key, lookup, fallback) {
  var fell = false
  var falling = false
  exports[key] = function (cb) {
    var val = lookup()
    if (!val && !fell && !falling && fallback) {
      fell = true
      falling = true
      exec(fallback, function (er, output, stderr) {
        falling = false
        if (er) return // oh well, we tried
        val = output.trim()
      })
    }
    exports[key] = function (cb) {
      if (cb) process.nextTick(cb.bind(null, null, val))
      return val
    }
    if (cb && !falling) process.nextTick(cb.bind(null, null, val))
    return val
  }
}

memo('user', function () {
  return ( isWindows
         ? process.env.USERDOMAIN + '\\' + process.env.USERNAME
         : process.env.USER
         )
}, 'whoami')

memo('prompt', function () {
  return isWindows ? process.env.PROMPT : process.env.PS1
})

memo('hostname', function () {
  return isWindows ? process.env.COMPUTERNAME : process.env.HOSTNAME
}, 'hostname')

memo('tmpdir', function () {
  return osTmpdir()
})

memo('home', function () {
  return osHomedir()
})

memo('path', function () {
  return (process.env.PATH ||
          process.env.Path ||
          process.env.path).split(isWindows ? ';' : ':')
})

memo('editor', function () {
  return process.env.EDITOR ||
         process.env.VISUAL ||
         (isWindows ? 'notepad.exe' : 'vi')
})

memo('shell', function () {
  return isWindows ? process.env.ComSpec || 'cmd'
         : process.env.SHELL || 'bash'
})
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {
    "os-homedir": "^1.0.0",
    "os-tmpdir": "^1.0.0"
  },
  "deprecated": false,
  "description": "Look up environment settings specific to different operating systems",
  "devDependencies": {
    "tap": "^11.1.0"
  },
  "directories": {
    "test": "test"
  },
  "files": [
    "osenv.js"
  ],
  "homepage": "https://github.com/npm/osenv#readme",
  "license": "ISC",
  "main": "osenv.js",
  "name": "osenv",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/osenv.git"
  },
  "version": "0.1.5"
}'use strict';
const fs = require('fs');

module.exports = fp => new Promise(resolve => {
	fs.access(fp, err => {
		resolve(!err);
	});
});

module.exports.sync = fp => {
	try {
		fs.accessSync(fp);
		return true;
	} catch (err) {
		return false;
	}
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if a path exists",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/path-exists#readme",
  "license": "MIT",
  "name": "path-exists",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/path-exists.git"
  },
  "version": "3.0.0"
}'use strict';

function posix(path) {
	return path.charAt(0) === '/';
}

function win32(path) {
	// https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56
	var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;
	var result = splitDeviceRe.exec(path);
	var device = result[1] || '';
	var isUnc = Boolean(device && device.charAt(1) !== ':');

	// UNC paths are always absolute
	return Boolean(result[2] || isUnc);
}

module.exports = process.platform === 'win32' ? win32 : posix;
module.exports.posix = posix;
module.exports.win32 = win32;
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Node.js 0.12 path.isAbsolute() ponyfill",
  "devDependencies": {
    "xo": "^0.16.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/path-is-absolute#readme",
  "license": "MIT",
  "name": "path-is-absolute",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/path-is-absolute.git"
  },
  "version": "1.0.1"
}'use strict';
module.exports = opts => {
	opts = opts || {};

	const env = opts.env || process.env;
	const platform = opts.platform || process.platform;

	if (platform !== 'win32') {
		return 'PATH';
	}

	return Object.keys(env).find(x => x.toUpperCase() === 'PATH') || 'Path';
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Get the PATH environment variable key cross-platform",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/path-key#readme",
  "license": "MIT",
  "name": "path-key",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/path-key.git"
  },
  "version": "2.0.1"
}The MIT License (MIT)

Copyright (c) 2015 Javier Blanco

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';

var isWindows = process.platform === 'win32';

// Regex to split a windows path into three parts: [*, device, slash,
// tail] windows-only
var splitDeviceRe =
    /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;

// Regex to split the tail part of the above into [*, dir, basename, ext]
var splitTailRe =
    /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/;

var win32 = {};

// Function to split a filename into [root, dir, basename, ext]
function win32SplitPath(filename) {
  // Separate device+slash from tail
  var result = splitDeviceRe.exec(filename),
      device = (result[1] || '') + (result[2] || ''),
      tail = result[3] || '';
  // Split the tail into dir, basename and extension
  var result2 = splitTailRe.exec(tail),
      dir = result2[1],
      basename = result2[2],
      ext = result2[3];
  return [device, dir, basename, ext];
}

win32.parse = function(pathString) {
  if (typeof pathString !== 'string') {
    throw new TypeError(
        "Parameter 'pathString' must be a string, not " + typeof pathString
    );
  }
  var allParts = win32SplitPath(pathString);
  if (!allParts || allParts.length !== 4) {
    throw new TypeError("Invalid path '" + pathString + "'");
  }
  return {
    root: allParts[0],
    dir: allParts[0] + allParts[1].slice(0, -1),
    base: allParts[2],
    ext: allParts[3],
    name: allParts[2].slice(0, allParts[2].length - allParts[3].length)
  };
};



// Split a filename into [root, dir, basename, ext], unix version
// 'root' is just a slash, or nothing.
var splitPathRe =
    /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
var posix = {};


function posixSplitPath(filename) {
  return splitPathRe.exec(filename).slice(1);
}


posix.parse = function(pathString) {
  if (typeof pathString !== 'string') {
    throw new TypeError(
        "Parameter 'pathString' must be a string, not " + typeof pathString
    );
  }
  var allParts = posixSplitPath(pathString);
  if (!allParts || allParts.length !== 4) {
    throw new TypeError("Invalid path '" + pathString + "'");
  }
  allParts[1] = allParts[1] || '';
  allParts[2] = allParts[2] || '';
  allParts[3] = allParts[3] || '';

  return {
    root: allParts[0],
    dir: allParts[0] + allParts[1].slice(0, -1),
    base: allParts[2],
    ext: allParts[3],
    name: allParts[2].slice(0, allParts[2].length - allParts[3].length)
  };
};


if (isWindows)
  module.exports = win32.parse;
else /* posix */
  module.exports = posix.parse;

module.exports.posix = posix.parse;
module.exports.win32 = win32.parse;
{
  "author": {
    "name": "Javier Blanco",
    "email": "http://jbgutierrez.info"
  },
  "deprecated": false,
  "description": "Node.js path.parse() ponyfill",
  "homepage": "https://github.com/jbgutierrez/path-parse#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "path-parse",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jbgutierrez/path-parse.git"
  },
  "version": "1.0.6"
}'use strict';

var processFn = function (fn, P, opts) {
	return function () {
		var that = this;
		var args = new Array(arguments.length);

		for (var i = 0; i < arguments.length; i++) {
			args[i] = arguments[i];
		}

		return new P(function (resolve, reject) {
			args.push(function (err, result) {
				if (err) {
					reject(err);
				} else if (opts.multiArgs) {
					var results = new Array(arguments.length - 1);

					for (var i = 1; i < arguments.length; i++) {
						results[i - 1] = arguments[i];
					}

					resolve(results);
				} else {
					resolve(result);
				}
			});

			fn.apply(that, args);
		});
	};
};

var pify = module.exports = function (obj, P, opts) {
	if (typeof P !== 'function') {
		opts = P;
		P = Promise;
	}

	opts = opts || {};
	opts.exclude = opts.exclude || [/.+Sync$/];

	var filter = function (key) {
		var match = function (pattern) {
			return typeof pattern === 'string' ? key === pattern : pattern.test(key);
		};

		return opts.include ? opts.include.some(match) : !opts.exclude.some(match);
	};

	var ret = typeof obj === 'function' ? function () {
		if (opts.excludeMain) {
			return obj.apply(this, arguments);
		}

		return processFn(obj, P, opts).apply(this, arguments);
	} : {};

	return Object.keys(obj).reduce(function (ret, key) {
		var x = obj[key];

		ret[key] = typeof x === 'function' && filter(key) ? processFn(x, P, opts) : x;

		return ret;
	}, ret);
};

pify.all = pify;
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Promisify a callback-style function",
  "devDependencies": {
    "ava": "*",
    "pinkie-promise": "^1.0.0",
    "v8-natives": "0.0.2",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/pify#readme",
  "license": "MIT",
  "name": "pify",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/pify.git"
  },
  "version": "2.3.0"
}'use strict';

var PENDING = 'pending';
var SETTLED = 'settled';
var FULFILLED = 'fulfilled';
var REJECTED = 'rejected';
var NOOP = function () {};
var isNode = typeof global !== 'undefined' && typeof global.process !== 'undefined' && typeof global.process.emit === 'function';

var asyncSetTimer = typeof setImmediate === 'undefined' ? setTimeout : setImmediate;
var asyncQueue = [];
var asyncTimer;

function asyncFlush() {
	// run promise callbacks
	for (var i = 0; i < asyncQueue.length; i++) {
		asyncQueue[i][0](asyncQueue[i][1]);
	}

	// reset async asyncQueue
	asyncQueue = [];
	asyncTimer = false;
}

function asyncCall(callback, arg) {
	asyncQueue.push([callback, arg]);

	if (!asyncTimer) {
		asyncTimer = true;
		asyncSetTimer(asyncFlush, 0);
	}
}

function invokeResolver(resolver, promise) {
	function resolvePromise(value) {
		resolve(promise, value);
	}

	function rejectPromise(reason) {
		reject(promise, reason);
	}

	try {
		resolver(resolvePromise, rejectPromise);
	} catch (e) {
		rejectPromise(e);
	}
}

function invokeCallback(subscriber) {
	var owner = subscriber.owner;
	var settled = owner._state;
	var value = owner._data;
	var callback = subscriber[settled];
	var promise = subscriber.then;

	if (typeof callback === 'function') {
		settled = FULFILLED;
		try {
			value = callback(value);
		} catch (e) {
			reject(promise, e);
		}
	}

	if (!handleThenable(promise, value)) {
		if (settled === FULFILLED) {
			resolve(promise, value);
		}

		if (settled === REJECTED) {
			reject(promise, value);
		}
	}
}

function handleThenable(promise, value) {
	var resolved;

	try {
		if (promise === value) {
			throw new TypeError('A promises callback cannot return that same promise.');
		}

		if (value && (typeof value === 'function' || typeof value === 'object')) {
			// then should be retrieved only once
			var then = value.then;

			if (typeof then === 'function') {
				then.call(value, function (val) {
					if (!resolved) {
						resolved = true;

						if (value === val) {
							fulfill(promise, val);
						} else {
							resolve(promise, val);
						}
					}
				}, function (reason) {
					if (!resolved) {
						resolved = true;

						reject(promise, reason);
					}
				});

				return true;
			}
		}
	} catch (e) {
		if (!resolved) {
			reject(promise, e);
		}

		return true;
	}

	return false;
}

function resolve(promise, value) {
	if (promise === value || !handleThenable(promise, value)) {
		fulfill(promise, value);
	}
}

function fulfill(promise, value) {
	if (promise._state === PENDING) {
		promise._state = SETTLED;
		promise._data = value;

		asyncCall(publishFulfillment, promise);
	}
}

function reject(promise, reason) {
	if (promise._state === PENDING) {
		promise._state = SETTLED;
		promise._data = reason;

		asyncCall(publishRejection, promise);
	}
}

function publish(promise) {
	promise._then = promise._then.forEach(invokeCallback);
}

function publishFulfillment(promise) {
	promise._state = FULFILLED;
	publish(promise);
}

function publishRejection(promise) {
	promise._state = REJECTED;
	publish(promise);
	if (!promise._handled && isNode) {
		global.process.emit('unhandledRejection', promise._data, promise);
	}
}

function notifyRejectionHandled(promise) {
	global.process.emit('rejectionHandled', promise);
}

/**
 * @class
 */
function Promise(resolver) {
	if (typeof resolver !== 'function') {
		throw new TypeError('Promise resolver ' + resolver + ' is not a function');
	}

	if (this instanceof Promise === false) {
		throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.');
	}

	this._then = [];

	invokeResolver(resolver, this);
}

Promise.prototype = {
	constructor: Promise,

	_state: PENDING,
	_then: null,
	_data: undefined,
	_handled: false,

	then: function (onFulfillment, onRejection) {
		var subscriber = {
			owner: this,
			then: new this.constructor(NOOP),
			fulfilled: onFulfillment,
			rejected: onRejection
		};

		if ((onRejection || onFulfillment) && !this._handled) {
			this._handled = true;
			if (this._state === REJECTED && isNode) {
				asyncCall(notifyRejectionHandled, this);
			}
		}

		if (this._state === FULFILLED || this._state === REJECTED) {
			// already resolved, call callback async
			asyncCall(invokeCallback, subscriber);
		} else {
			// subscribe
			this._then.push(subscriber);
		}

		return subscriber.then;
	},

	catch: function (onRejection) {
		return this.then(null, onRejection);
	}
};

Promise.all = function (promises) {
	if (!Array.isArray(promises)) {
		throw new TypeError('You must pass an array to Promise.all().');
	}

	return new Promise(function (resolve, reject) {
		var results = [];
		var remaining = 0;

		function resolver(index) {
			remaining++;
			return function (value) {
				results[index] = value;
				if (!--remaining) {
					resolve(results);
				}
			};
		}

		for (var i = 0, promise; i < promises.length; i++) {
			promise = promises[i];

			if (promise && typeof promise.then === 'function') {
				promise.then(resolver(i), reject);
			} else {
				results[i] = promise;
			}
		}

		if (!remaining) {
			resolve(results);
		}
	});
};

Promise.race = function (promises) {
	if (!Array.isArray(promises)) {
		throw new TypeError('You must pass an array to Promise.race().');
	}

	return new Promise(function (resolve, reject) {
		for (var i = 0, promise; i < promises.length; i++) {
			promise = promises[i];

			if (promise && typeof promise.then === 'function') {
				promise.then(resolve, reject);
			} else {
				resolve(promise);
			}
		}
	});
};

Promise.resolve = function (value) {
	if (value && typeof value === 'object' && value.constructor === Promise) {
		return value;
	}

	return new Promise(function (resolve) {
		resolve(value);
	});
};

Promise.reject = function (reason) {
	return new Promise(function (resolve, reject) {
		reject(reason);
	});
};

module.exports = Promise;
The MIT License (MIT)

Copyright (c) Vsevolod Strukchinsky <floatdrop@gmail.com> (github.com/floatdrop)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Vsevolod Strukchinsky",
    "email": "floatdrop@gmail.com",
    "url": "github.com/floatdrop"
  },
  "deprecated": false,
  "description": "Itty bitty little widdle twinkie pinkie ES2015 Promise implementation",
  "devDependencies": {
    "core-assert": "^0.1.1",
    "coveralls": "^2.11.4",
    "mocha": "*",
    "nyc": "^3.2.2",
    "promises-aplus-tests": "*",
    "xo": "^0.10.1"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/floatdrop/pinkie#readme",
  "license": "MIT",
  "name": "pinkie",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/floatdrop/pinkie.git"
  },
  "version": "2.0.4"
}'use strict';

module.exports = typeof Promise === 'function' ? Promise : require('pinkie');
The MIT License (MIT)

Copyright (c) Vsevolod Strukchinsky <floatdrop@gmail.com> (github.com/floatdrop)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Vsevolod Strukchinsky",
    "email": "floatdrop@gmail.com",
    "url": "github.com/floatdrop"
  },
  "dependencies": {
    "pinkie": "^2.0.0"
  },
  "deprecated": false,
  "description": "ES2015 Promise ponyfill",
  "devDependencies": {
    "mocha": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/floatdrop/pinkie-promise#readme",
  "license": "MIT",
  "name": "pinkie-promise",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/floatdrop/pinkie-promise.git"
  },
  "version": "2.0.1"
}3.0.0 / 2018-03-18
==================
* [[`cb0d8f1bc6`]](https://github.com/TooTallNate/plist.js/commit/cb0d8f1bc60dee423f8fc2cfcac427452dfaddb0) update Makefile, rebuild dist/ (Mike Reinstein)
* [[`9dfeffe73f`]](https://github.com/TooTallNate/plist.js/commit/9dfeffe73fdb447ac5a87ee364a1472975f12adf) remove unsupported browser versions from travis (Mike Reinstein)
* [[`c962bfe1ea`]](https://github.com/TooTallNate/plist.js/commit/c962bfe1ea04dd87966250253d33738bceecab61) update module deps, remove support for node < 6 (Mike Reinstein)


2.1.0 / 2017-05-04
==================

* [[`e4f06669bb`]](https://github.com/TooTallNate/plist.js/commit/e4f06669bb51d2e65654df7c39aab52bc3bf4e8a) - update license (extend copyright term) (Mike Reinstein)
* [[`edc6e41035`]](https://github.com/TooTallNate/plist.js/commit/edc6e4103546b1d7518a577e7c202c305a8abec0) - update module deps (Mike Reinstein)
* [[`85d11c48ef`](https://github.com/TooTallNate/plist.js/commit/85d11c48eff02312cbdd67f46fd8e74b0d372ca1)] - Harden test-cases and implementation to align with other implementations (BjÃ¶rn Brauer)
* [[`7619537eaa`]](https://github.com/TooTallNate/plist.js/commit/7619537eaa9e3e5a80829e759c004d2e017a07d2) review feedback: early returns and constants for nodeTypes (BjÃ¶rn Brauer)


2.0.1 / 2016-08-16
==================

* [[`de136c8388`](https://github.com/TooTallNate/plist/commit/de136c8388)] - bad npm releaseâ€¦ (Nathan Rajlich)


2.0.0 / 2016-08-16
==================

* [[`90deef5d43`](https://github.com/TooTallNate/plist/commit/90deef5d43)] - remove deprecated functions (Nathan Rajlich)
* [[`d475cd8ce9`](https://github.com/TooTallNate/plist/commit/d475cd8ce9)] - Added travis ci support for node 6 (Amila Welihinda)
* [[`04c8ee7646`](https://github.com/TooTallNate/plist/commit/04c8ee7646)] - update dependencies (Mitchell Hentges)
* [[`97c02b3f05`](https://github.com/TooTallNate/plist/commit/97c02b3f05)] - **travis**: add `sudo: false` and test more node versions (Nathan Rajlich)
* [[`54c821ec29`](https://github.com/TooTallNate/plist/commit/54c821ec29)] - #71 - fixed and added test (Andrew Goldis)
* [[`4afb7c5079`](https://github.com/TooTallNate/plist/commit/4afb7c5079)] - fix `Cannot read property 'nodeValue' of undefined exception` that is thrown when a `<key></key>` construct appears in plist (Chris Kinsman)
* [[`f360d7d685`](https://github.com/TooTallNate/plist/commit/f360d7d685)] - #66 - fixed empty keys and added tests (Andrew Goldis)
* [[`421c7f26e9`](https://github.com/TooTallNate/plist/commit/421c7f26e9)] - #66 - fixed empty key (Andrew Goldis)
* [[`a88aa4dca7`](https://github.com/TooTallNate/plist/commit/a88aa4dca7)] - add verbose examples (mrzmyr)


1.2.0 / 2015-11-10
==================

  * package: update "browserify" to v12.0.1
  * package: update "zuul" to v3.7.2
  * package: update "xmlbuilder" to v4.0.0
  * package: update "util-deprecate" to v1.0.2
  * package: update "mocha" to v2.3.3
  * package: update "base64-js" to v0.0.8
  * build: omit undefined values
  * travis: add node 4.0 and 4.1 to test matrix


1.1.0 / 2014-08-27
==================

  * package: update "browserify" to v5.10.1
  * package: update "zuul" to v1.10.2
  * README: add "Sauce Test Status" build badge
  * travis: use new "plistjs" sauce credentials
  * travis: set up zuul saucelabs automated testing


1.0.1 / 2014-06-25
==================

  * add .zuul.yml file for browser testing
  * remove Testling stuff
  * build: fix global variable `val` leak
  * package: use --check-leaks when running mocha tests
  * README: update examples to use preferred API
  * package: add "browser" keyword


1.0.0 / 2014-05-20
==================

  * package: remove "android-browser"
  * test: add <dict> build() test
  * test: re-add the empty string build() test
  * test: remove "fixtures" and legacy "tests" dir
  * test: add some more build() tests
  * test: add a parse() CDATA test
  * test: starting on build() tests
  * test: more parse() tests
  * package: attempt to fix "android-browser" testling
  * parse: better <data> with newline handling
  * README: add Testling badge
  * test: add <data> node tests
  * test: add a <date> parse() test
  * travis: don't test node v0.6 or v0.8
  * test: some more parse() tests
  * test: add simple <string> parsing test
  * build: add support for an optional "opts" object
  * package: test mobile devices
  * test: use multiline to inline the XML
  * package: beautify
  * package: fix "mocha" harness
  * package: more testling browsers
  * build: add the "version=1.0" attribute
  * beginnings of "mocha" tests
  * build: more JSDocs
  * tests: add test that ensures that empty string conversion works
  * build: update "xmlbuilder" to v2.2.1
  * parse: ignore comment and cdata nodes
  * tests: make the "Newlines" test actually contain a newline
  * parse: lint
  * test travis
  * README: add Travis CI badge
  * add .travis.yml file
  * build: updated DTD to reflect name change
  * parse: return falsey values in an Array plist
  * build: fix encoding a typed array in the browser
  * build: add support for Typed Arrays and ArrayBuffers
  * build: more lint
  * build: slight cleanup and optimizations
  * build: use .txt() for the "date" value
  * parse: always return a Buffer for <data> nodes
  * build: don't interpret Strings as base64
  * dist: commit prebuilt plist*.js files
  * parse: fix typo in deprecate message
  * parse: fix parse() return value
  * parse: add jsdoc comments for the deprecated APIs
  * parse: add `parse()` function
  * node, parse: use `util-deprecate` module
  * re-implemented parseFile to be asynchronous
  * node: fix jsdoc comment
  * Makefile: fix "node" require stubbing
  * examples: add "browser" example
  * package: tweak "main"
  * package: remove "engines" field
  * Makefile: fix --exclude command for browserify
  * package: update "description"
  * lib: more styling
  * Makefile: add -build.js and -parse.js dist files
  * lib: separate out the parse and build logic into their own files
  * Makefile: add makefile with browserify build rules
  * package: add "browserify" as a dev dependency
  * plist: tabs to spaces (again)
  * add a .jshintrc file
  * LICENSE: update
  * node-webkit support
  * Ignore tests/ in .npmignore file
  * Remove duplicate devDependencies key
  * Remove trailing whitespace
  * adding recent contributors. Bumping npm package number (patch release)
  * Fixed node.js string handling
  * bumping version number
  * Fixed global variable plist leak
  * patch release 0.4.1
  * removed temporary debug output file
  * flipping the cases for writing data and string elements in build(). removed the 125 length check. Added validation of base64 encoding for data fields when parsing. added unit tests.
  * fixed syntax errors in README examples (issue #20)
  * added Sync versions of calls. added deprecation warnings for old method calls. updated documentation. If the resulting object from parseStringSync is an array with 1 element, return just the element. If a plist string or file doesnt have a <plist> tag as the document root element, fail noisily (issue #15)
  * incrementing package version
  * added cross platform base64 encode/decode for data elements (issue #17.) Comments and hygiene.
  * refactored the code to use a DOM parser instead of SAX. closes issues #5 and #16
  * rolling up package version
  * updated base64 detection regexp. updated README. hygiene.
  * refactored the build function. Fixes issue #14
  * refactored tests. Modified tests from issue #9. thanks @sylvinus
  * upgrade xmlbuilder package version. this is why .end() was needed in last commit; breaking change to xmlbuilder lib. :/
  * bug fix in build function, forgot to call .end() Refactored tests to use nodeunit
  * Implemented support for real, identity tests
  * Refactored base64 detection - still sloppy, fixed date building. Passing tests OK.
  * Implemented basic plist builder that turns an existing JS object into plist XML. date, real and data types still need to be implemented.
(The MIT License)

Copyright (c) 2010-2017 Nathan Rajlich <nathan@tootallnate.net>

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)

# BIN directory
BIN := $(THIS_DIR)/node_modules/.bin

# applications
NODE ?= node
NPM ?= $(NODE) $(shell which npm)
BROWSERIFY ?= $(NODE) $(BIN)/browserify
MOCHA ?= $(NODE) $(BIN)/mocha
ZUUL ?= $(NODE) $(BIN)/zuul

REPORTER ?= spec

all: dist/plist.js dist/plist-build.js dist/plist-parse.js

install: node_modules

clean:
	@rm -rf node_modules dist

dist:
	@mkdir -p $@

dist/plist-build.js: node_modules lib/build.js dist
	@$(BROWSERIFY) \
		--standalone plist \
		lib/build.js > $@

dist/plist-parse.js: node_modules lib/parse.js dist
	@$(BROWSERIFY) \
		--standalone plist \
		lib/parse.js > $@

dist/plist.js: node_modules lib/*.js dist
	@$(BROWSERIFY) \
		--standalone plist \
		index.js > $@

node_modules: package.json
	@NODE_ENV= $(NPM) install
	@touch node_modules

test:
	@if [ "x$(BROWSER_NAME)" = "x" ]; then \
		$(MAKE) test-node; \
		else \
		$(MAKE) test-zuul; \
	fi

test-node:
	@$(MOCHA) \
		--reporter $(REPORTER) \
		test/*.js

test-zuul:
	@if [ "x$(BROWSER_PLATFORM)" = "x" ]; then \
		$(ZUUL) \
		--ui mocha-bdd \
		--browser-name $(BROWSER_NAME) \
		--browser-version $(BROWSER_VERSION) \
		test/*.js; \
		else \
		$(ZUUL) \
		--ui mocha-bdd \
		--browser-name $(BROWSER_NAME) \
		--browser-version $(BROWSER_VERSION) \
		--browser-platform "$(BROWSER_PLATFORM)" \
		test/*.js; \
	fi

.PHONY: all install clean test test-node test-zuul
/**
 * Parser functions.
 */

var parserFunctions = require('./lib/parse');
Object.keys(parserFunctions).forEach(function (k) { exports[k] = parserFunctions[k]; });

/**
 * Builder functions.
 */

var builderFunctions = require('./lib/build');
Object.keys(builderFunctions).forEach(function (k) { exports[k] = builderFunctions[k]; });
{
  "author": {
    "name": "Nathan Rajlich",
    "email": "nathan@tootallnate.net"
  },
  "dependencies": {
    "base64-js": "^1.2.3",
    "xmlbuilder": "^9.0.7",
    "xmldom": "0.1.x"
  },
  "deprecated": false,
  "description": "Mac OS X Plist parser/builder for Node.js and browsers",
  "devDependencies": {
    "browserify": "^16.1.1",
    "mocha": "^5.0.4",
    "multiline": "^1.0.2",
    "zuul": "^3.10.1"
  },
  "engines": {
    "node": ">=6"
  },
  "homepage": "https://github.com/TooTallNate/node-plist#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "plist",
  "repository": {
    "type": "git",
    "url": "git://github.com/TooTallNate/node-plist.git"
  },
  "version": "3.0.1"
}/**
 * Module dependencies.
 */

var base64 = require('base64-js');
var xmlbuilder = require('xmlbuilder');

/**
 * Module exports.
 */

exports.build = build;

/**
 * Accepts a `Date` instance and returns an ISO date string.
 *
 * @param {Date} d - Date instance to serialize
 * @returns {String} ISO date string representation of `d`
 * @api private
 */

function ISODateString(d){
  function pad(n){
    return n < 10 ? '0' + n : n;
  }
  return d.getUTCFullYear()+'-'
    + pad(d.getUTCMonth()+1)+'-'
    + pad(d.getUTCDate())+'T'
    + pad(d.getUTCHours())+':'
    + pad(d.getUTCMinutes())+':'
    + pad(d.getUTCSeconds())+'Z';
}

/**
 * Returns the internal "type" of `obj` via the
 * `Object.prototype.toString()` trick.
 *
 * @param {Mixed} obj - any value
 * @returns {String} the internal "type" name
 * @api private
 */

var toString = Object.prototype.toString;
function type (obj) {
  var m = toString.call(obj).match(/\[object (.*)\]/);
  return m ? m[1] : m;
}

/**
 * Generate an XML plist string from the input object `obj`.
 *
 * @param {Object} obj - the object to convert
 * @param {Object} [opts] - optional options object
 * @returns {String} converted plist XML string
 * @api public
 */

function build (obj, opts) {
  var XMLHDR = {
    version: '1.0',
    encoding: 'UTF-8'
  };

  var XMLDTD = {
    pubid: '-//Apple//DTD PLIST 1.0//EN',
    sysid: 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'
  };

  var doc = xmlbuilder.create('plist');

  doc.dec(XMLHDR.version, XMLHDR.encoding, XMLHDR.standalone);
  doc.dtd(XMLDTD.pubid, XMLDTD.sysid);
  doc.att('version', '1.0');

  walk_obj(obj, doc);

  if (!opts) opts = {};
  // default `pretty` to `true`
  opts.pretty = opts.pretty !== false;
  return doc.end(opts);
}

/**
 * depth first, recursive traversal of a javascript object. when complete,
 * next_child contains a reference to the build XML object.
 *
 * @api private
 */

function walk_obj(next, next_child) {
  var tag_type, i, prop;
  var name = type(next);

  if ('Undefined' == name) {
    return;
  } else if (Array.isArray(next)) {
    next_child = next_child.ele('array');
    for (i = 0; i < next.length; i++) {
      walk_obj(next[i], next_child);
    }

  } else if (Buffer.isBuffer(next)) {
    next_child.ele('data').raw(next.toString('base64'));

  } else if ('Object' == name) {
    next_child = next_child.ele('dict');
    for (prop in next) {
      if (next.hasOwnProperty(prop)) {
        next_child.ele('key').txt(prop);
        walk_obj(next[prop], next_child);
      }
    }

  } else if ('Number' == name) {
    // detect if this is an integer or real
    // TODO: add an ability to force one way or another via a "cast"
    tag_type = (next % 1 === 0) ? 'integer' : 'real';
    next_child.ele(tag_type).txt(next.toString());

  } else if ('Date' == name) {
    next_child.ele('date').txt(ISODateString(new Date(next)));

  } else if ('Boolean' == name) {
    next_child.ele(next ? 'true' : 'false');

  } else if ('String' == name) {
    next_child.ele('string').txt(next);

  } else if ('ArrayBuffer' == name) {
    next_child.ele('data').raw(base64.fromByteArray(next));

  } else if (next && next.buffer && 'ArrayBuffer' == type(next.buffer)) {
    // a typed array
    next_child.ele('data').raw(base64.fromByteArray(new Uint8Array(next.buffer), next_child));

  }
}
/**
 * Module dependencies.
 */

var DOMParser = require('xmldom').DOMParser;

/**
 * Module exports.
 */

exports.parse = parse;

var TEXT_NODE = 3;
var CDATA_NODE = 4;
var COMMENT_NODE = 8;


/**
 * We ignore raw text (usually whitespace), <!-- xml comments -->,
 * and raw CDATA nodes.
 *
 * @param {Element} node
 * @returns {Boolean}
 * @api private
 */

function shouldIgnoreNode (node) {
  return node.nodeType === TEXT_NODE
    || node.nodeType === COMMENT_NODE
    || node.nodeType === CDATA_NODE;
}

/**
 * Check if the node is empty. Some plist file has such node:
 * <key />
 * this node shoud be ignored.
 *
 * @see https://github.com/TooTallNate/plist.js/issues/66
 * @param {Element} node
 * @returns {Boolean}
 * @api private
 */
function isEmptyNode(node){
  if(!node.childNodes || node.childNodes.length === 0) {
    return true;
  } else {
    return false;
  }
}

function invariant(test, message) {
  if (!test) {
    throw new Error(message);
  }
}

/**
 * Parses a Plist XML string. Returns an Object.
 *
 * @param {String} xml - the XML String to decode
 * @returns {Mixed} the decoded value from the Plist XML
 * @api public
 */

function parse (xml) {
  var doc = new DOMParser().parseFromString(xml);
  invariant(
    doc.documentElement.nodeName === 'plist',
    'malformed document. First element should be <plist>'
  );
  var plist = parsePlistXML(doc.documentElement);

  // the root <plist> node gets interpreted as an Array,
  // so pull out the inner data first
  if (plist.length == 1) plist = plist[0];

  return plist;
}

/**
 * Convert an XML based plist document into a JSON representation.
 *
 * @param {Object} xml_node - current XML node in the plist
 * @returns {Mixed} built up JSON object
 * @api private
 */

function parsePlistXML (node) {
  var i, new_obj, key, val, new_arr, res, counter, type;

  if (!node)
    return null;

  if (node.nodeName === 'plist') {
    new_arr = [];
    if (isEmptyNode(node)) {
      return new_arr;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (!shouldIgnoreNode(node.childNodes[i])) {
        new_arr.push( parsePlistXML(node.childNodes[i]));
      }
    }
    return new_arr;
  } else if (node.nodeName === 'dict') {
    new_obj = {};
    key = null;
    counter = 0;
    if (isEmptyNode(node)) {
      return new_obj;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (shouldIgnoreNode(node.childNodes[i])) continue;
      if (counter % 2 === 0) {
        invariant(
          node.childNodes[i].nodeName === 'key',
          'Missing key while parsing <dict/>.'
        );
        key = parsePlistXML(node.childNodes[i]);
      } else {
        invariant(
          node.childNodes[i].nodeName !== 'key',
          'Unexpected key "'
            + parsePlistXML(node.childNodes[i])
            + '" while parsing <dict/>.'
        );
        new_obj[key] = parsePlistXML(node.childNodes[i]);
      }
      counter += 1;
    }
    if (counter % 2 === 1) {
      throw new Error('Missing value for "' + key + '" while parsing <dict/>');
    }
    return new_obj;

  } else if (node.nodeName === 'array') {
    new_arr = [];
    if (isEmptyNode(node)) {
      return new_arr;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (!shouldIgnoreNode(node.childNodes[i])) {
        res = parsePlistXML(node.childNodes[i]);
        if (null != res) new_arr.push(res);
      }
    }
    return new_arr;

  } else if (node.nodeName === '#text') {
    // TODO: what should we do with text types? (CDATA sections)

  } else if (node.nodeName === 'key') {
    if (isEmptyNode(node)) {
      return '';
    }
    return node.childNodes[0].nodeValue;
  } else if (node.nodeName === 'string') {
    res = '';
    if (isEmptyNode(node)) {
      return res;
    }
    for (i=0; i < node.childNodes.length; i++) {
      var type = node.childNodes[i].nodeType;
      if (type === TEXT_NODE || type === CDATA_NODE) {
        res += node.childNodes[i].nodeValue;
      }
    }
    return res;

  } else if (node.nodeName === 'integer') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as integer.'
    );
    return parseInt(node.childNodes[0].nodeValue, 10);

  } else if (node.nodeName === 'real') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as real.'
    );
    res = '';
    for (i=0; i < node.childNodes.length; i++) {
      if (node.childNodes[i].nodeType === TEXT_NODE) {
        res += node.childNodes[i].nodeValue;
      }
    }
    return parseFloat(res);

  } else if (node.nodeName === 'data') {
    res = '';
    if (isEmptyNode(node)) {
      return Buffer.from(res, 'base64');
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (node.childNodes[i].nodeType === TEXT_NODE) {
        res += node.childNodes[i].nodeValue.replace(/\s+/g, '');
      }
    }
    return Buffer.from(res, 'base64');

  } else if (node.nodeName === 'date') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as Date.'
    )
    return new Date(node.childNodes[0].nodeValue);

  } else if (node.nodeName === 'true') {
    return true;

  } else if (node.nodeName === 'false') {
    return false;
  }
}
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.plist = f()}})(function(){var define,module,exports;return (function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(require,module,exports){
(function (Buffer){
/**
 * Module dependencies.
 */

var base64 = require('base64-js');
var xmlbuilder = require('xmlbuilder');

/**
 * Module exports.
 */

exports.build = build;

/**
 * Accepts a `Date` instance and returns an ISO date string.
 *
 * @param {Date} d - Date instance to serialize
 * @returns {String} ISO date string representation of `d`
 * @api private
 */

function ISODateString(d){
  function pad(n){
    return n < 10 ? '0' + n : n;
  }
  return d.getUTCFullYear()+'-'
    + pad(d.getUTCMonth()+1)+'-'
    + pad(d.getUTCDate())+'T'
    + pad(d.getUTCHours())+':'
    + pad(d.getUTCMinutes())+':'
    + pad(d.getUTCSeconds())+'Z';
}

/**
 * Returns the internal "type" of `obj` via the
 * `Object.prototype.toString()` trick.
 *
 * @param {Mixed} obj - any value
 * @returns {String} the internal "type" name
 * @api private
 */

var toString = Object.prototype.toString;
function type (obj) {
  var m = toString.call(obj).match(/\[object (.*)\]/);
  return m ? m[1] : m;
}

/**
 * Generate an XML plist string from the input object `obj`.
 *
 * @param {Object} obj - the object to convert
 * @param {Object} [opts] - optional options object
 * @returns {String} converted plist XML string
 * @api public
 */

function build (obj, opts) {
  var XMLHDR = {
    version: '1.0',
    encoding: 'UTF-8'
  };

  var XMLDTD = {
    pubid: '-//Apple//DTD PLIST 1.0//EN',
    sysid: 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'
  };

  var doc = xmlbuilder.create('plist');

  doc.dec(XMLHDR.version, XMLHDR.encoding, XMLHDR.standalone);
  doc.dtd(XMLDTD.pubid, XMLDTD.sysid);
  doc.att('version', '1.0');

  walk_obj(obj, doc);

  if (!opts) opts = {};
  // default `pretty` to `true`
  opts.pretty = opts.pretty !== false;
  return doc.end(opts);
}

/**
 * depth first, recursive traversal of a javascript object. when complete,
 * next_child contains a reference to the build XML object.
 *
 * @api private
 */

function walk_obj(next, next_child) {
  var tag_type, i, prop;
  var name = type(next);

  if ('Undefined' == name) {
    return;
  } else if (Array.isArray(next)) {
    next_child = next_child.ele('array');
    for (i = 0; i < next.length; i++) {
      walk_obj(next[i], next_child);
    }

  } else if (Buffer.isBuffer(next)) {
    next_child.ele('data').raw(next.toString('base64'));

  } else if ('Object' == name) {
    next_child = next_child.ele('dict');
    for (prop in next) {
      if (next.hasOwnProperty(prop)) {
        next_child.ele('key').txt(prop);
        walk_obj(next[prop], next_child);
      }
    }

  } else if ('Number' == name) {
    // detect if this is an integer or real
    // TODO: add an ability to force one way or another via a "cast"
    tag_type = (next % 1 === 0) ? 'integer' : 'real';
    next_child.ele(tag_type).txt(next.toString());

  } else if ('Date' == name) {
    next_child.ele('date').txt(ISODateString(new Date(next)));

  } else if ('Boolean' == name) {
    next_child.ele(next ? 'true' : 'false');

  } else if ('String' == name) {
    next_child.ele('string').txt(next);

  } else if ('ArrayBuffer' == name) {
    next_child.ele('data').raw(base64.fromByteArray(next));

  } else if (next && next.buffer && 'ArrayBuffer' == type(next.buffer)) {
    // a typed array
    next_child.ele('data').raw(base64.fromByteArray(new Uint8Array(next.buffer), next_child));

  }
}

}).call(this,{"isBuffer":require("../node_modules/is-buffer/index.js")})
},{"../node_modules/is-buffer/index.js":3,"base64-js":2,"xmlbuilder":25}],2:[function(require,module,exports){
'use strict'

exports.byteLength = byteLength
exports.toByteArray = toByteArray
exports.fromByteArray = fromByteArray

var lookup = []
var revLookup = []
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array

var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, len = code.length; i < len; ++i) {
  lookup[i] = code[i]
  revLookup[code.charCodeAt(i)] = i
}

// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
revLookup['-'.charCodeAt(0)] = 62
revLookup['_'.charCodeAt(0)] = 63

function placeHoldersCount (b64) {
  var len = b64.length
  if (len % 4 > 0) {
    throw new Error('Invalid string. Length must be a multiple of 4')
  }

  // the number of equal signs (place holders)
  // if there are two placeholders, than the two characters before it
  // represent one byte
  // if there is only one, then the three characters before it represent 2 bytes
  // this is just a cheap hack to not do indexOf twice
  return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
}

function byteLength (b64) {
  // base64 is 4/3 + up to two characters of the original data
  return (b64.length * 3 / 4) - placeHoldersCount(b64)
}

function toByteArray (b64) {
  var i, l, tmp, placeHolders, arr
  var len = b64.length
  placeHolders = placeHoldersCount(b64)

  arr = new Arr((len * 3 / 4) - placeHolders)

  // if there are placeholders, only get up to the last complete 4 chars
  l = placeHolders > 0 ? len - 4 : len

  var L = 0

  for (i = 0; i < l; i += 4) {
    tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
    arr[L++] = (tmp >> 16) & 0xFF
    arr[L++] = (tmp >> 8) & 0xFF
    arr[L++] = tmp & 0xFF
  }

  if (placeHolders === 2) {
    tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
    arr[L++] = tmp & 0xFF
  } else if (placeHolders === 1) {
    tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
    arr[L++] = (tmp >> 8) & 0xFF
    arr[L++] = tmp & 0xFF
  }

  return arr
}

function tripletToBase64 (num) {
  return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
}

function encodeChunk (uint8, start, end) {
  var tmp
  var output = []
  for (var i = start; i < end; i += 3) {
    tmp = ((uint8[i] << 16) & 0xFF0000) + ((uint8[i + 1] << 8) & 0xFF00) + (uint8[i + 2] & 0xFF)
    output.push(tripletToBase64(tmp))
  }
  return output.join('')
}

function fromByteArray (uint8) {
  var tmp
  var len = uint8.length
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  var output = ''
  var parts = []
  var maxChunkLength = 16383 // must be multiple of 3

  // go through the array every three bytes, we'll deal with trailing stuff later
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
  }

  // pad the end with zeros, but make sure to not forget the extra bytes
  if (extraBytes === 1) {
    tmp = uint8[len - 1]
    output += lookup[tmp >> 2]
    output += lookup[(tmp << 4) & 0x3F]
    output += '=='
  } else if (extraBytes === 2) {
    tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
    output += lookup[tmp >> 10]
    output += lookup[(tmp >> 4) & 0x3F]
    output += lookup[(tmp << 2) & 0x3F]
    output += '='
  }

  parts.push(output)

  return parts.join('')
}

},{}],3:[function(require,module,exports){
/*!
 * Determine if an object is a Buffer
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */

// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
module.exports = function (obj) {
  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
}

function isBuffer (obj) {
  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
}

// For Node v0.10 support. Remove this eventually.
function isSlowBuffer (obj) {
  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
}

},{}],4:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var assign, isArray, isEmpty, isFunction, isObject, isPlainObject,
    slice = [].slice,
    hasProp = {}.hasOwnProperty;

  assign = function() {
    var i, key, len, source, sources, target;
    target = arguments[0], sources = 2 <= arguments.length ? slice.call(arguments, 1) : [];
    if (isFunction(Object.assign)) {
      Object.assign.apply(null, arguments);
    } else {
      for (i = 0, len = sources.length; i < len; i++) {
        source = sources[i];
        if (source != null) {
          for (key in source) {
            if (!hasProp.call(source, key)) continue;
            target[key] = source[key];
          }
        }
      }
    }
    return target;
  };

  isFunction = function(val) {
    return !!val && Object.prototype.toString.call(val) === '[object Function]';
  };

  isObject = function(val) {
    var ref;
    return !!val && ((ref = typeof val) === 'function' || ref === 'object');
  };

  isArray = function(val) {
    if (isFunction(Array.isArray)) {
      return Array.isArray(val);
    } else {
      return Object.prototype.toString.call(val) === '[object Array]';
    }
  };

  isEmpty = function(val) {
    var key;
    if (isArray(val)) {
      return !val.length;
    } else {
      for (key in val) {
        if (!hasProp.call(val, key)) continue;
        return false;
      }
      return true;
    }
  };

  isPlainObject = function(val) {
    var ctor, proto;
    return isObject(val) && (proto = Object.getPrototypeOf(val)) && (ctor = proto.constructor) && (typeof ctor === 'function') && (ctor instanceof ctor) && (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object));
  };

  module.exports.assign = assign;

  module.exports.isFunction = isFunction;

  module.exports.isObject = isObject;

  module.exports.isArray = isArray;

  module.exports.isEmpty = isEmpty;

  module.exports.isPlainObject = isPlainObject;

}).call(this);

},{}],5:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute;

  module.exports = XMLAttribute = (function() {
    function XMLAttribute(parent, name, value) {
      this.options = parent.options;
      this.stringify = parent.stringify;
      if (name == null) {
        throw new Error("Missing attribute name of element " + parent.name);
      }
      if (value == null) {
        throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name);
      }
      this.name = this.stringify.attName(name);
      this.value = this.stringify.attValue(value);
    }

    XMLAttribute.prototype.clone = function() {
      return Object.create(this);
    };

    XMLAttribute.prototype.toString = function(options) {
      return this.options.writer.set(options).attribute(this);
    };

    return XMLAttribute;

  })();

}).call(this);

},{}],6:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLCData = (function(superClass) {
    extend(XMLCData, superClass);

    function XMLCData(parent, text) {
      XMLCData.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing CDATA text");
      }
      this.text = this.stringify.cdata(text);
    }

    XMLCData.prototype.clone = function() {
      return Object.create(this);
    };

    XMLCData.prototype.toString = function(options) {
      return this.options.writer.set(options).cdata(this);
    };

    return XMLCData;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],7:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLComment, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLComment = (function(superClass) {
    extend(XMLComment, superClass);

    function XMLComment(parent, text) {
      XMLComment.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing comment text");
      }
      this.text = this.stringify.comment(text);
    }

    XMLComment.prototype.clone = function() {
      return Object.create(this);
    };

    XMLComment.prototype.toString = function(options) {
      return this.options.writer.set(options).comment(this);
    };

    return XMLComment;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],8:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDAttList, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDAttList = (function(superClass) {
    extend(XMLDTDAttList, superClass);

    function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      XMLDTDAttList.__super__.constructor.call(this, parent);
      if (elementName == null) {
        throw new Error("Missing DTD element name");
      }
      if (attributeName == null) {
        throw new Error("Missing DTD attribute name");
      }
      if (!attributeType) {
        throw new Error("Missing DTD attribute type");
      }
      if (!defaultValueType) {
        throw new Error("Missing DTD attribute default");
      }
      if (defaultValueType.indexOf('#') !== 0) {
        defaultValueType = '#' + defaultValueType;
      }
      if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {
        throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT");
      }
      if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {
        throw new Error("Default value only applies to #FIXED or #DEFAULT");
      }
      this.elementName = this.stringify.eleName(elementName);
      this.attributeName = this.stringify.attName(attributeName);
      this.attributeType = this.stringify.dtdAttType(attributeType);
      this.defaultValue = this.stringify.dtdAttDefault(defaultValue);
      this.defaultValueType = defaultValueType;
    }

    XMLDTDAttList.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdAttList(this);
    };

    return XMLDTDAttList;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],9:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDElement, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDElement = (function(superClass) {
    extend(XMLDTDElement, superClass);

    function XMLDTDElement(parent, name, value) {
      XMLDTDElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing DTD element name");
      }
      if (!value) {
        value = '(#PCDATA)';
      }
      if (Array.isArray(value)) {
        value = '(' + value.join(',') + ')';
      }
      this.name = this.stringify.eleName(name);
      this.value = this.stringify.dtdElementValue(value);
    }

    XMLDTDElement.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdElement(this);
    };

    return XMLDTDElement;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],10:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDEntity, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDEntity = (function(superClass) {
    extend(XMLDTDEntity, superClass);

    function XMLDTDEntity(parent, pe, name, value) {
      XMLDTDEntity.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing entity name");
      }
      if (value == null) {
        throw new Error("Missing entity value");
      }
      this.pe = !!pe;
      this.name = this.stringify.eleName(name);
      if (!isObject(value)) {
        this.value = this.stringify.dtdEntityValue(value);
      } else {
        if (!value.pubID && !value.sysID) {
          throw new Error("Public and/or system identifiers are required for an external entity");
        }
        if (value.pubID && !value.sysID) {
          throw new Error("System identifier is required for a public external entity");
        }
        if (value.pubID != null) {
          this.pubID = this.stringify.dtdPubID(value.pubID);
        }
        if (value.sysID != null) {
          this.sysID = this.stringify.dtdSysID(value.sysID);
        }
        if (value.nData != null) {
          this.nData = this.stringify.dtdNData(value.nData);
        }
        if (this.pe && this.nData) {
          throw new Error("Notation declaration is not allowed in a parameter entity");
        }
      }
    }

    XMLDTDEntity.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdEntity(this);
    };

    return XMLDTDEntity;

  })(XMLNode);

}).call(this);

},{"./Utility":4,"./XMLNode":17}],11:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDNotation, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDNotation = (function(superClass) {
    extend(XMLDTDNotation, superClass);

    function XMLDTDNotation(parent, name, value) {
      XMLDTDNotation.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing notation name");
      }
      if (!value.pubID && !value.sysID) {
        throw new Error("Public or system identifiers are required for an external entity");
      }
      this.name = this.stringify.eleName(name);
      if (value.pubID != null) {
        this.pubID = this.stringify.dtdPubID(value.pubID);
      }
      if (value.sysID != null) {
        this.sysID = this.stringify.dtdSysID(value.sysID);
      }
    }

    XMLDTDNotation.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdNotation(this);
    };

    return XMLDTDNotation;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],12:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDeclaration, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  module.exports = XMLDeclaration = (function(superClass) {
    extend(XMLDeclaration, superClass);

    function XMLDeclaration(parent, version, encoding, standalone) {
      var ref;
      XMLDeclaration.__super__.constructor.call(this, parent);
      if (isObject(version)) {
        ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;
      }
      if (!version) {
        version = '1.0';
      }
      this.version = this.stringify.xmlVersion(version);
      if (encoding != null) {
        this.encoding = this.stringify.xmlEncoding(encoding);
      }
      if (standalone != null) {
        this.standalone = this.stringify.xmlStandalone(standalone);
      }
    }

    XMLDeclaration.prototype.toString = function(options) {
      return this.options.writer.set(options).declaration(this);
    };

    return XMLDeclaration;

  })(XMLNode);

}).call(this);

},{"./Utility":4,"./XMLNode":17}],13:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  module.exports = XMLDocType = (function(superClass) {
    extend(XMLDocType, superClass);

    function XMLDocType(parent, pubID, sysID) {
      var ref, ref1;
      XMLDocType.__super__.constructor.call(this, parent);
      this.documentObject = parent;
      if (isObject(pubID)) {
        ref = pubID, pubID = ref.pubID, sysID = ref.sysID;
      }
      if (sysID == null) {
        ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1];
      }
      if (pubID != null) {
        this.pubID = this.stringify.dtdPubID(pubID);
      }
      if (sysID != null) {
        this.sysID = this.stringify.dtdSysID(sysID);
      }
    }

    XMLDocType.prototype.element = function(name, value) {
      var child;
      child = new XMLDTDElement(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var child;
      child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.entity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, false, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.pEntity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, true, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.notation = function(name, value) {
      var child;
      child = new XMLDTDNotation(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.toString = function(options) {
      return this.options.writer.set(options).docType(this);
    };

    XMLDocType.prototype.ele = function(name, value) {
      return this.element(name, value);
    };

    XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);
    };

    XMLDocType.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocType.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocType.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    XMLDocType.prototype.up = function() {
      return this.root() || this.documentObject;
    };

    return XMLDocType;

  })(XMLNode);

}).call(this);

},{"./Utility":4,"./XMLDTDAttList":8,"./XMLDTDElement":9,"./XMLDTDEntity":10,"./XMLDTDNotation":11,"./XMLNode":17}],14:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDocument, XMLNode, XMLStringWriter, XMLStringifier, isPlainObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isPlainObject = require('./Utility').isPlainObject;

  XMLNode = require('./XMLNode');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  module.exports = XMLDocument = (function(superClass) {
    extend(XMLDocument, superClass);

    function XMLDocument(options) {
      XMLDocument.__super__.constructor.call(this, null);
      options || (options = {});
      if (!options.writer) {
        options.writer = new XMLStringWriter();
      }
      this.options = options;
      this.stringify = new XMLStringifier(options);
      this.isDocument = true;
    }

    XMLDocument.prototype.end = function(writer) {
      var writerOptions;
      if (!writer) {
        writer = this.options.writer;
      } else if (isPlainObject(writer)) {
        writerOptions = writer;
        writer = this.options.writer.set(writerOptions);
      }
      return writer.document(this);
    };

    XMLDocument.prototype.toString = function(options) {
      return this.options.writer.set(options).document(this);
    };

    return XMLDocument;

  })(XMLNode);

}).call(this);

},{"./Utility":4,"./XMLNode":17,"./XMLStringWriter":21,"./XMLStringifier":22}],15:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute, XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLDocumentCB, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLStringifier, XMLText, isFunction, isObject, isPlainObject, ref,
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isPlainObject = ref.isPlainObject;

  XMLElement = require('./XMLElement');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLAttribute = require('./XMLAttribute');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  module.exports = XMLDocumentCB = (function() {
    function XMLDocumentCB(options, onData, onEnd) {
      var writerOptions;
      options || (options = {});
      if (!options.writer) {
        options.writer = new XMLStringWriter(options);
      } else if (isPlainObject(options.writer)) {
        writerOptions = options.writer;
        options.writer = new XMLStringWriter(writerOptions);
      }
      this.options = options;
      this.writer = options.writer;
      this.stringify = new XMLStringifier(options);
      this.onDataCallback = onData || function() {};
      this.onEndCallback = onEnd || function() {};
      this.currentNode = null;
      this.currentLevel = -1;
      this.openTags = {};
      this.documentStarted = false;
      this.documentCompleted = false;
      this.root = null;
    }

    XMLDocumentCB.prototype.node = function(name, attributes, text) {
      var ref1;
      if (name == null) {
        throw new Error("Missing node name");
      }
      if (this.root && this.currentLevel === -1) {
        throw new Error("Document can only have one root node");
      }
      this.openCurrent();
      name = name.valueOf();
      if (attributes == null) {
        attributes = {};
      }
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      this.currentNode = new XMLElement(this, name, attributes);
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      if (text != null) {
        this.text(text);
      }
      return this;
    };

    XMLDocumentCB.prototype.element = function(name, attributes, text) {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.dtdElement.apply(this, arguments);
      } else {
        return this.node(name, attributes, text);
      }
    };

    XMLDocumentCB.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (!this.currentNode || this.currentNode.children) {
        throw new Error("att() can only be used immediately after an ele() call in callback mode");
      }
      if (name != null) {
        name = name.valueOf();
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (!this.options.skipNullAttributes || (value != null)) {
          this.currentNode.attributes[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLDocumentCB.prototype.text = function(value) {
      var node;
      this.openCurrent();
      node = new XMLText(this, value);
      this.onData(this.writer.text(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.cdata = function(value) {
      var node;
      this.openCurrent();
      node = new XMLCData(this, value);
      this.onData(this.writer.cdata(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.comment = function(value) {
      var node;
      this.openCurrent();
      node = new XMLComment(this, value);
      this.onData(this.writer.comment(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.raw = function(value) {
      var node;
      this.openCurrent();
      node = new XMLRaw(this, value);
      this.onData(this.writer.raw(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.instruction = function(target, value) {
      var i, insTarget, insValue, len, node;
      this.openCurrent();
      if (target != null) {
        target = target.valueOf();
      }
      if (value != null) {
        value = value.valueOf();
      }
      if (Array.isArray(target)) {
        for (i = 0, len = target.length; i < len; i++) {
          insTarget = target[i];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        node = new XMLProcessingInstruction(this, target, value);
        this.onData(this.writer.processingInstruction(node, this.currentLevel + 1));
      }
      return this;
    };

    XMLDocumentCB.prototype.declaration = function(version, encoding, standalone) {
      var node;
      this.openCurrent();
      if (this.documentStarted) {
        throw new Error("declaration() must be the first node");
      }
      node = new XMLDeclaration(this, version, encoding, standalone);
      this.onData(this.writer.declaration(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.doctype = function(root, pubID, sysID) {
      this.openCurrent();
      if (root == null) {
        throw new Error("Missing root node name");
      }
      if (this.root) {
        throw new Error("dtd() must come before the root node");
      }
      this.currentNode = new XMLDocType(this, pubID, sysID);
      this.currentNode.rootNodeName = root;
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      return this;
    };

    XMLDocumentCB.prototype.dtdElement = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDElement(this, name, value);
      this.onData(this.writer.dtdElement(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var node;
      this.openCurrent();
      node = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.onData(this.writer.dtdAttList(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.entity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, false, name, value);
      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.pEntity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, true, name, value);
      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.notation = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDNotation(this, name, value);
      this.onData(this.writer.dtdNotation(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.up = function() {
      if (this.currentLevel < 0) {
        throw new Error("The document node has no parent");
      }
      if (this.currentNode) {
        if (this.currentNode.children) {
          this.closeNode(this.currentNode);
        } else {
          this.openNode(this.currentNode);
        }
        this.currentNode = null;
      } else {
        this.closeNode(this.openTags[this.currentLevel]);
      }
      delete this.openTags[this.currentLevel];
      this.currentLevel--;
      return this;
    };

    XMLDocumentCB.prototype.end = function() {
      while (this.currentLevel >= 0) {
        this.up();
      }
      return this.onEnd();
    };

    XMLDocumentCB.prototype.openCurrent = function() {
      if (this.currentNode) {
        this.currentNode.children = true;
        return this.openNode(this.currentNode);
      }
    };

    XMLDocumentCB.prototype.openNode = function(node) {
      if (!node.isOpen) {
        if (!this.root && this.currentLevel === 0 && node instanceof XMLElement) {
          this.root = node;
        }
        this.onData(this.writer.openNode(node, this.currentLevel));
        return node.isOpen = true;
      }
    };

    XMLDocumentCB.prototype.closeNode = function(node) {
      if (!node.isClosed) {
        this.onData(this.writer.closeNode(node, this.currentLevel));
        return node.isClosed = true;
      }
    };

    XMLDocumentCB.prototype.onData = function(chunk) {
      this.documentStarted = true;
      return this.onDataCallback(chunk);
    };

    XMLDocumentCB.prototype.onEnd = function() {
      this.documentCompleted = true;
      return this.onEndCallback();
    };

    XMLDocumentCB.prototype.ele = function() {
      return this.element.apply(this, arguments);
    };

    XMLDocumentCB.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLDocumentCB.prototype.dtd = function(root, pubID, sysID) {
      return this.doctype(root, pubID, sysID);
    };

    XMLDocumentCB.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLDocumentCB.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.t = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLDocumentCB.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.att = function() {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.a = function() {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocumentCB.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocumentCB.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    return XMLDocumentCB;

  })();

}).call(this);

},{"./Utility":4,"./XMLAttribute":5,"./XMLCData":6,"./XMLComment":7,"./XMLDTDAttList":8,"./XMLDTDElement":9,"./XMLDTDEntity":10,"./XMLDTDNotation":11,"./XMLDeclaration":12,"./XMLDocType":13,"./XMLElement":16,"./XMLProcessingInstruction":18,"./XMLRaw":19,"./XMLStringWriter":21,"./XMLStringifier":22,"./XMLText":23}],16:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute, XMLElement, XMLNode, isFunction, isObject, ref,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction;

  XMLNode = require('./XMLNode');

  XMLAttribute = require('./XMLAttribute');

  module.exports = XMLElement = (function(superClass) {
    extend(XMLElement, superClass);

    function XMLElement(parent, name, attributes) {
      XMLElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing element name");
      }
      this.name = this.stringify.eleName(name);
      this.attributes = {};
      if (attributes != null) {
        this.attribute(attributes);
      }
      if (parent.isDocument) {
        this.isRoot = true;
        this.documentObject = parent;
        parent.rootObject = this;
      }
    }

    XMLElement.prototype.clone = function() {
      var att, attName, clonedSelf, ref1;
      clonedSelf = Object.create(this);
      if (clonedSelf.isRoot) {
        clonedSelf.documentObject = null;
      }
      clonedSelf.attributes = {};
      ref1 = this.attributes;
      for (attName in ref1) {
        if (!hasProp.call(ref1, attName)) continue;
        att = ref1[attName];
        clonedSelf.attributes[attName] = att.clone();
      }
      clonedSelf.children = [];
      this.children.forEach(function(child) {
        var clonedChild;
        clonedChild = child.clone();
        clonedChild.parent = clonedSelf;
        return clonedSelf.children.push(clonedChild);
      });
      return clonedSelf;
    };

    XMLElement.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (name != null) {
        name = name.valueOf();
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (!this.options.skipNullAttributes || (value != null)) {
          this.attributes[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLElement.prototype.removeAttribute = function(name) {
      var attName, i, len;
      if (name == null) {
        throw new Error("Missing attribute name");
      }
      name = name.valueOf();
      if (Array.isArray(name)) {
        for (i = 0, len = name.length; i < len; i++) {
          attName = name[i];
          delete this.attributes[attName];
        }
      } else {
        delete this.attributes[name];
      }
      return this;
    };

    XMLElement.prototype.toString = function(options) {
      return this.options.writer.set(options).element(this);
    };

    XMLElement.prototype.att = function(name, value) {
      return this.attribute(name, value);
    };

    XMLElement.prototype.a = function(name, value) {
      return this.attribute(name, value);
    };

    return XMLElement;

  })(XMLNode);

}).call(this);

},{"./Utility":4,"./XMLAttribute":5,"./XMLNode":17}],17:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLProcessingInstruction, XMLRaw, XMLText, isEmpty, isFunction, isObject, ref,
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isEmpty = ref.isEmpty;

  XMLElement = null;

  XMLCData = null;

  XMLComment = null;

  XMLDeclaration = null;

  XMLDocType = null;

  XMLRaw = null;

  XMLText = null;

  XMLProcessingInstruction = null;

  module.exports = XMLNode = (function() {
    function XMLNode(parent) {
      this.parent = parent;
      if (this.parent) {
        this.options = this.parent.options;
        this.stringify = this.parent.stringify;
      }
      this.children = [];
      if (!XMLElement) {
        XMLElement = require('./XMLElement');
        XMLCData = require('./XMLCData');
        XMLComment = require('./XMLComment');
        XMLDeclaration = require('./XMLDeclaration');
        XMLDocType = require('./XMLDocType');
        XMLRaw = require('./XMLRaw');
        XMLText = require('./XMLText');
        XMLProcessingInstruction = require('./XMLProcessingInstruction');
      }
    }

    XMLNode.prototype.element = function(name, attributes, text) {
      var childNode, item, j, k, key, lastChild, len, len1, ref1, val;
      lastChild = null;
      if (attributes == null) {
        attributes = {};
      }
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      if (name != null) {
        name = name.valueOf();
      }
      if (Array.isArray(name)) {
        for (j = 0, len = name.length; j < len; j++) {
          item = name[j];
          lastChild = this.element(item);
        }
      } else if (isFunction(name)) {
        lastChild = this.element(name.apply());
      } else if (isObject(name)) {
        for (key in name) {
          if (!hasProp.call(name, key)) continue;
          val = name[key];
          if (isFunction(val)) {
            val = val.apply();
          }
          if ((isObject(val)) && (isEmpty(val))) {
            val = null;
          }
          if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {
            lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);
          } else if (!this.options.separateArrayItems && Array.isArray(val)) {
            for (k = 0, len1 = val.length; k < len1; k++) {
              item = val[k];
              childNode = {};
              childNode[key] = item;
              lastChild = this.element(childNode);
            }
          } else if (isObject(val)) {
            lastChild = this.element(key);
            lastChild.element(val);
          } else {
            lastChild = this.element(key, val);
          }
        }
      } else {
        if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {
          lastChild = this.text(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {
          lastChild = this.cdata(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {
          lastChild = this.comment(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {
          lastChild = this.raw(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) {
          lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text);
        } else {
          lastChild = this.node(name, attributes, text);
        }
      }
      if (lastChild == null) {
        throw new Error("Could not create any elements with: " + name);
      }
      return lastChild;
    };

    XMLNode.prototype.insertBefore = function(name, attributes, text) {
      var child, i, removed;
      if (this.isRoot) {
        throw new Error("Cannot insert elements at root level");
      }
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.element(name, attributes, text);
      Array.prototype.push.apply(this.parent.children, removed);
      return child;
    };

    XMLNode.prototype.insertAfter = function(name, attributes, text) {
      var child, i, removed;
      if (this.isRoot) {
        throw new Error("Cannot insert elements at root level");
      }
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.element(name, attributes, text);
      Array.prototype.push.apply(this.parent.children, removed);
      return child;
    };

    XMLNode.prototype.remove = function() {
      var i, ref1;
      if (this.isRoot) {
        throw new Error("Cannot remove the root element");
      }
      i = this.parent.children.indexOf(this);
      [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref1 = [])), ref1;
      return this.parent;
    };

    XMLNode.prototype.node = function(name, attributes, text) {
      var child, ref1;
      if (name != null) {
        name = name.valueOf();
      }
      attributes || (attributes = {});
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      child = new XMLElement(this, name, attributes);
      if (text != null) {
        child.text(text);
      }
      this.children.push(child);
      return child;
    };

    XMLNode.prototype.text = function(value) {
      var child;
      child = new XMLText(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.cdata = function(value) {
      var child;
      child = new XMLCData(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.comment = function(value) {
      var child;
      child = new XMLComment(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.commentBefore = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.commentAfter = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.raw = function(value) {
      var child;
      child = new XMLRaw(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.instruction = function(target, value) {
      var insTarget, insValue, instruction, j, len;
      if (target != null) {
        target = target.valueOf();
      }
      if (value != null) {
        value = value.valueOf();
      }
      if (Array.isArray(target)) {
        for (j = 0, len = target.length; j < len; j++) {
          insTarget = target[j];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        instruction = new XMLProcessingInstruction(this, target, value);
        this.children.push(instruction);
      }
      return this;
    };

    XMLNode.prototype.instructionBefore = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.instructionAfter = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.declaration = function(version, encoding, standalone) {
      var doc, xmldec;
      doc = this.document();
      xmldec = new XMLDeclaration(doc, version, encoding, standalone);
      if (doc.children[0] instanceof XMLDeclaration) {
        doc.children[0] = xmldec;
      } else {
        doc.children.unshift(xmldec);
      }
      return doc.root() || doc;
    };

    XMLNode.prototype.doctype = function(pubID, sysID) {
      var child, doc, doctype, i, j, k, len, len1, ref1, ref2;
      doc = this.document();
      doctype = new XMLDocType(doc, pubID, sysID);
      ref1 = doc.children;
      for (i = j = 0, len = ref1.length; j < len; i = ++j) {
        child = ref1[i];
        if (child instanceof XMLDocType) {
          doc.children[i] = doctype;
          return doctype;
        }
      }
      ref2 = doc.children;
      for (i = k = 0, len1 = ref2.length; k < len1; i = ++k) {
        child = ref2[i];
        if (child.isRoot) {
          doc.children.splice(i, 0, doctype);
          return doctype;
        }
      }
      doc.children.push(doctype);
      return doctype;
    };

    XMLNode.prototype.up = function() {
      if (this.isRoot) {
        throw new Error("The root node has no parent. Use doc() if you need to get the document object.");
      }
      return this.parent;
    };

    XMLNode.prototype.root = function() {
      var node;
      node = this;
      while (node) {
        if (node.isDocument) {
          return node.rootObject;
        } else if (node.isRoot) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.document = function() {
      var node;
      node = this;
      while (node) {
        if (node.isDocument) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.end = function(options) {
      return this.document().end(options);
    };

    XMLNode.prototype.prev = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i < 1) {
        throw new Error("Already at the first node");
      }
      return this.parent.children[i - 1];
    };

    XMLNode.prototype.next = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i === -1 || i === this.parent.children.length - 1) {
        throw new Error("Already at the last node");
      }
      return this.parent.children[i + 1];
    };

    XMLNode.prototype.importDocument = function(doc) {
      var clonedRoot;
      clonedRoot = doc.root().clone();
      clonedRoot.parent = this;
      clonedRoot.isRoot = false;
      this.children.push(clonedRoot);
      return this;
    };

    XMLNode.prototype.ele = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.doc = function() {
      return this.document();
    };

    XMLNode.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLNode.prototype.dtd = function(pubID, sysID) {
      return this.doctype(pubID, sysID);
    };

    XMLNode.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.t = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLNode.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.u = function() {
      return this.up();
    };

    XMLNode.prototype.importXMLBuilder = function(doc) {
      return this.importDocument(doc);
    };

    return XMLNode;

  })();

}).call(this);

},{"./Utility":4,"./XMLCData":6,"./XMLComment":7,"./XMLDeclaration":12,"./XMLDocType":13,"./XMLElement":16,"./XMLProcessingInstruction":18,"./XMLRaw":19,"./XMLText":23}],18:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLProcessingInstruction,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLProcessingInstruction = (function(superClass) {
    extend(XMLProcessingInstruction, superClass);

    function XMLProcessingInstruction(parent, target, value) {
      XMLProcessingInstruction.__super__.constructor.call(this, parent);
      if (target == null) {
        throw new Error("Missing instruction target");
      }
      this.target = this.stringify.insTarget(target);
      if (value) {
        this.value = this.stringify.insValue(value);
      }
    }

    XMLProcessingInstruction.prototype.clone = function() {
      return Object.create(this);
    };

    XMLProcessingInstruction.prototype.toString = function(options) {
      return this.options.writer.set(options).processingInstruction(this);
    };

    return XMLProcessingInstruction;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],19:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLRaw,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLRaw = (function(superClass) {
    extend(XMLRaw, superClass);

    function XMLRaw(parent, text) {
      XMLRaw.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing raw text");
      }
      this.value = this.stringify.raw(text);
    }

    XMLRaw.prototype.clone = function() {
      return Object.create(this);
    };

    XMLRaw.prototype.toString = function(options) {
      return this.options.writer.set(options).raw(this);
    };

    return XMLRaw;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],20:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStreamWriter, XMLText, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLElement = require('./XMLElement');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLWriterBase = require('./XMLWriterBase');

  module.exports = XMLStreamWriter = (function(superClass) {
    extend(XMLStreamWriter, superClass);

    function XMLStreamWriter(stream, options) {
      XMLStreamWriter.__super__.constructor.call(this, options);
      this.stream = stream;
    }

    XMLStreamWriter.prototype.document = function(doc) {
      var child, i, j, len, len1, ref, ref1, results;
      ref = doc.children;
      for (i = 0, len = ref.length; i < len; i++) {
        child = ref[i];
        child.isLastRootNode = false;
      }
      doc.children[doc.children.length - 1].isLastRootNode = true;
      ref1 = doc.children;
      results = [];
      for (j = 0, len1 = ref1.length; j < len1; j++) {
        child = ref1[j];
        switch (false) {
          case !(child instanceof XMLDeclaration):
            results.push(this.declaration(child));
            break;
          case !(child instanceof XMLDocType):
            results.push(this.docType(child));
            break;
          case !(child instanceof XMLComment):
            results.push(this.comment(child));
            break;
          case !(child instanceof XMLProcessingInstruction):
            results.push(this.processingInstruction(child));
            break;
          default:
            results.push(this.element(child));
        }
      }
      return results;
    };

    XMLStreamWriter.prototype.attribute = function(att) {
      return this.stream.write(' ' + att.name + '="' + att.value + '"');
    };

    XMLStreamWriter.prototype.cdata = function(node, level) {
      return this.stream.write(this.space(level) + '<![CDATA[' + node.text + ']]>' + this.endline(node));
    };

    XMLStreamWriter.prototype.comment = function(node, level) {
      return this.stream.write(this.space(level) + '<!-- ' + node.text + ' -->' + this.endline(node));
    };

    XMLStreamWriter.prototype.declaration = function(node, level) {
      this.stream.write(this.space(level));
      this.stream.write('<?xml version="' + node.version + '"');
      if (node.encoding != null) {
        this.stream.write(' encoding="' + node.encoding + '"');
      }
      if (node.standalone != null) {
        this.stream.write(' standalone="' + node.standalone + '"');
      }
      this.stream.write(this.spacebeforeslash + '?>');
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.docType = function(node, level) {
      var child, i, len, ref;
      level || (level = 0);
      this.stream.write(this.space(level));
      this.stream.write('<!DOCTYPE ' + node.root().name);
      if (node.pubID && node.sysID) {
        this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
      } else if (node.sysID) {
        this.stream.write(' SYSTEM "' + node.sysID + '"');
      }
      if (node.children.length > 0) {
        this.stream.write(' [');
        this.stream.write(this.endline(node));
        ref = node.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          switch (false) {
            case !(child instanceof XMLDTDAttList):
              this.dtdAttList(child, level + 1);
              break;
            case !(child instanceof XMLDTDElement):
              this.dtdElement(child, level + 1);
              break;
            case !(child instanceof XMLDTDEntity):
              this.dtdEntity(child, level + 1);
              break;
            case !(child instanceof XMLDTDNotation):
              this.dtdNotation(child, level + 1);
              break;
            case !(child instanceof XMLCData):
              this.cdata(child, level + 1);
              break;
            case !(child instanceof XMLComment):
              this.comment(child, level + 1);
              break;
            case !(child instanceof XMLProcessingInstruction):
              this.processingInstruction(child, level + 1);
              break;
            default:
              throw new Error("Unknown DTD node type: " + child.constructor.name);
          }
        }
        this.stream.write(']');
      }
      this.stream.write(this.spacebeforeslash + '>');
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.element = function(node, level) {
      var att, child, i, len, name, ref, ref1, space;
      level || (level = 0);
      space = this.space(level);
      this.stream.write(space + '<' + node.name);
      ref = node.attributes;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        this.attribute(att);
      }
      if (node.children.length === 0 || node.children.every(function(e) {
        return e.value === '';
      })) {
        if (this.allowEmpty) {
          this.stream.write('></' + node.name + '>');
        } else {
          this.stream.write(this.spacebeforeslash + '/>');
        }
      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {
        this.stream.write('>');
        this.stream.write(node.children[0].value);
        this.stream.write('</' + node.name + '>');
      } else {
        this.stream.write('>' + this.newline);
        ref1 = node.children;
        for (i = 0, len = ref1.length; i < len; i++) {
          child = ref1[i];
          switch (false) {
            case !(child instanceof XMLCData):
              this.cdata(child, level + 1);
              break;
            case !(child instanceof XMLComment):
              this.comment(child, level + 1);
              break;
            case !(child instanceof XMLElement):
              this.element(child, level + 1);
              break;
            case !(child instanceof XMLRaw):
              this.raw(child, level + 1);
              break;
            case !(child instanceof XMLText):
              this.text(child, level + 1);
              break;
            case !(child instanceof XMLProcessingInstruction):
              this.processingInstruction(child, level + 1);
              break;
            default:
              throw new Error("Unknown XML node type: " + child.constructor.name);
          }
        }
        this.stream.write(space + '</' + node.name + '>');
      }
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.processingInstruction = function(node, level) {
      this.stream.write(this.space(level) + '<?' + node.target);
      if (node.value) {
        this.stream.write(' ' + node.value);
      }
      return this.stream.write(this.spacebeforeslash + '?>' + this.endline(node));
    };

    XMLStreamWriter.prototype.raw = function(node, level) {
      return this.stream.write(this.space(level) + node.value + this.endline(node));
    };

    XMLStreamWriter.prototype.text = function(node, level) {
      return this.stream.write(this.space(level) + node.value + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdAttList = function(node, level) {
      this.stream.write(this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType);
      if (node.defaultValueType !== '#DEFAULT') {
        this.stream.write(' ' + node.defaultValueType);
      }
      if (node.defaultValue) {
        this.stream.write(' "' + node.defaultValue + '"');
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdElement = function(node, level) {
      this.stream.write(this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value);
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdEntity = function(node, level) {
      this.stream.write(this.space(level) + '<!ENTITY');
      if (node.pe) {
        this.stream.write(' %');
      }
      this.stream.write(' ' + node.name);
      if (node.value) {
        this.stream.write(' "' + node.value + '"');
      } else {
        if (node.pubID && node.sysID) {
          this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
        } else if (node.sysID) {
          this.stream.write(' SYSTEM "' + node.sysID + '"');
        }
        if (node.nData) {
          this.stream.write(' NDATA ' + node.nData);
        }
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdNotation = function(node, level) {
      this.stream.write(this.space(level) + '<!NOTATION ' + node.name);
      if (node.pubID && node.sysID) {
        this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
      } else if (node.pubID) {
        this.stream.write(' PUBLIC "' + node.pubID + '"');
      } else if (node.sysID) {
        this.stream.write(' SYSTEM "' + node.sysID + '"');
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.endline = function(node) {
      if (!node.isLastRootNode) {
        return this.newline;
      } else {
        return '';
      }
    };

    return XMLStreamWriter;

  })(XMLWriterBase);

}).call(this);

},{"./XMLCData":6,"./XMLComment":7,"./XMLDTDAttList":8,"./XMLDTDElement":9,"./XMLDTDEntity":10,"./XMLDTDNotation":11,"./XMLDeclaration":12,"./XMLDocType":13,"./XMLElement":16,"./XMLProcessingInstruction":18,"./XMLRaw":19,"./XMLText":23,"./XMLWriterBase":24}],21:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLText, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLElement = require('./XMLElement');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLWriterBase = require('./XMLWriterBase');

  module.exports = XMLStringWriter = (function(superClass) {
    extend(XMLStringWriter, superClass);

    function XMLStringWriter(options) {
      XMLStringWriter.__super__.constructor.call(this, options);
    }

    XMLStringWriter.prototype.document = function(doc) {
      var child, i, len, r, ref;
      this.textispresent = false;
      r = '';
      ref = doc.children;
      for (i = 0, len = ref.length; i < len; i++) {
        child = ref[i];
        r += (function() {
          switch (false) {
            case !(child instanceof XMLDeclaration):
              return this.declaration(child);
            case !(child instanceof XMLDocType):
              return this.docType(child);
            case !(child instanceof XMLComment):
              return this.comment(child);
            case !(child instanceof XMLProcessingInstruction):
              return this.processingInstruction(child);
            default:
              return this.element(child, 0);
          }
        }).call(this);
      }
      if (this.pretty && r.slice(-this.newline.length) === this.newline) {
        r = r.slice(0, -this.newline.length);
      }
      return r;
    };

    XMLStringWriter.prototype.attribute = function(att) {
      return ' ' + att.name + '="' + att.value + '"';
    };

    XMLStringWriter.prototype.cdata = function(node, level) {
      return this.space(level) + '<![CDATA[' + node.text + ']]>' + this.newline;
    };

    XMLStringWriter.prototype.comment = function(node, level) {
      return this.space(level) + '<!-- ' + node.text + ' -->' + this.newline;
    };

    XMLStringWriter.prototype.declaration = function(node, level) {
      var r;
      r = this.space(level);
      r += '<?xml version="' + node.version + '"';
      if (node.encoding != null) {
        r += ' encoding="' + node.encoding + '"';
      }
      if (node.standalone != null) {
        r += ' standalone="' + node.standalone + '"';
      }
      r += this.spacebeforeslash + '?>';
      r += this.newline;
      return r;
    };

    XMLStringWriter.prototype.docType = function(node, level) {
      var child, i, len, r, ref;
      level || (level = 0);
      r = this.space(level);
      r += '<!DOCTYPE ' + node.root().name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      if (node.children.length > 0) {
        r += ' [';
        r += this.newline;
        ref = node.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          r += (function() {
            switch (false) {
              case !(child instanceof XMLDTDAttList):
                return this.dtdAttList(child, level + 1);
              case !(child instanceof XMLDTDElement):
                return this.dtdElement(child, level + 1);
              case !(child instanceof XMLDTDEntity):
                return this.dtdEntity(child, level + 1);
              case !(child instanceof XMLDTDNotation):
                return this.dtdNotation(child, level + 1);
              case !(child instanceof XMLCData):
                return this.cdata(child, level + 1);
              case !(child instanceof XMLComment):
                return this.comment(child, level + 1);
              case !(child instanceof XMLProcessingInstruction):
                return this.processingInstruction(child, level + 1);
              default:
                throw new Error("Unknown DTD node type: " + child.constructor.name);
            }
          }).call(this);
        }
        r += ']';
      }
      r += this.spacebeforeslash + '>';
      r += this.newline;
      return r;
    };

    XMLStringWriter.prototype.element = function(node, level) {
      var att, child, i, j, len, len1, name, r, ref, ref1, ref2, space, textispresentwasset;
      level || (level = 0);
      textispresentwasset = false;
      if (this.textispresent) {
        this.newline = '';
        this.pretty = false;
      } else {
        this.newline = this.newlinedefault;
        this.pretty = this.prettydefault;
      }
      space = this.space(level);
      r = '';
      r += space + '<' + node.name;
      ref = node.attributes;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        r += this.attribute(att);
      }
      if (node.children.length === 0 || node.children.every(function(e) {
        return e.value === '';
      })) {
        if (this.allowEmpty) {
          r += '></' + node.name + '>' + this.newline;
        } else {
          r += this.spacebeforeslash + '/>' + this.newline;
        }
      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {
        r += '>';
        r += node.children[0].value;
        r += '</' + node.name + '>' + this.newline;
      } else {
        if (this.dontprettytextnodes) {
          ref1 = node.children;
          for (i = 0, len = ref1.length; i < len; i++) {
            child = ref1[i];
            if (child.value != null) {
              this.textispresent++;
              textispresentwasset = true;
              break;
            }
          }
        }
        if (this.textispresent) {
          this.newline = '';
          this.pretty = false;
          space = this.space(level);
        }
        r += '>' + this.newline;
        ref2 = node.children;
        for (j = 0, len1 = ref2.length; j < len1; j++) {
          child = ref2[j];
          r += (function() {
            switch (false) {
              case !(child instanceof XMLCData):
                return this.cdata(child, level + 1);
              case !(child instanceof XMLComment):
                return this.comment(child, level + 1);
              case !(child instanceof XMLElement):
                return this.element(child, level + 1);
              case !(child instanceof XMLRaw):
                return this.raw(child, level + 1);
              case !(child instanceof XMLText):
                return this.text(child, level + 1);
              case !(child instanceof XMLProcessingInstruction):
                return this.processingInstruction(child, level + 1);
              default:
                throw new Error("Unknown XML node type: " + child.constructor.name);
            }
          }).call(this);
        }
        if (textispresentwasset) {
          this.textispresent--;
        }
        if (!this.textispresent) {
          this.newline = this.newlinedefault;
          this.pretty = this.prettydefault;
        }
        r += space + '</' + node.name + '>' + this.newline;
      }
      return r;
    };

    XMLStringWriter.prototype.processingInstruction = function(node, level) {
      var r;
      r = this.space(level) + '<?' + node.target;
      if (node.value) {
        r += ' ' + node.value;
      }
      r += this.spacebeforeslash + '?>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.raw = function(node, level) {
      return this.space(level) + node.value + this.newline;
    };

    XMLStringWriter.prototype.text = function(node, level) {
      return this.space(level) + node.value + this.newline;
    };

    XMLStringWriter.prototype.dtdAttList = function(node, level) {
      var r;
      r = this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType;
      if (node.defaultValueType !== '#DEFAULT') {
        r += ' ' + node.defaultValueType;
      }
      if (node.defaultValue) {
        r += ' "' + node.defaultValue + '"';
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.dtdElement = function(node, level) {
      return this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value + this.spacebeforeslash + '>' + this.newline;
    };

    XMLStringWriter.prototype.dtdEntity = function(node, level) {
      var r;
      r = this.space(level) + '<!ENTITY';
      if (node.pe) {
        r += ' %';
      }
      r += ' ' + node.name;
      if (node.value) {
        r += ' "' + node.value + '"';
      } else {
        if (node.pubID && node.sysID) {
          r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
        } else if (node.sysID) {
          r += ' SYSTEM "' + node.sysID + '"';
        }
        if (node.nData) {
          r += ' NDATA ' + node.nData;
        }
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.dtdNotation = function(node, level) {
      var r;
      r = this.space(level) + '<!NOTATION ' + node.name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.pubID) {
        r += ' PUBLIC "' + node.pubID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.openNode = function(node, level) {
      var att, name, r, ref;
      level || (level = 0);
      if (node instanceof XMLElement) {
        r = this.space(level) + '<' + node.name;
        ref = node.attributes;
        for (name in ref) {
          if (!hasProp.call(ref, name)) continue;
          att = ref[name];
          r += this.attribute(att);
        }
        r += (node.children ? '>' : '/>') + this.newline;
        return r;
      } else {
        r = this.space(level) + '<!DOCTYPE ' + node.rootNodeName;
        if (node.pubID && node.sysID) {
          r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
        } else if (node.sysID) {
          r += ' SYSTEM "' + node.sysID + '"';
        }
        r += (node.children ? ' [' : '>') + this.newline;
        return r;
      }
    };

    XMLStringWriter.prototype.closeNode = function(node, level) {
      level || (level = 0);
      switch (false) {
        case !(node instanceof XMLElement):
          return this.space(level) + '</' + node.name + '>' + this.newline;
        case !(node instanceof XMLDocType):
          return this.space(level) + ']>' + this.newline;
      }
    };

    return XMLStringWriter;

  })(XMLWriterBase);

}).call(this);

},{"./XMLCData":6,"./XMLComment":7,"./XMLDTDAttList":8,"./XMLDTDElement":9,"./XMLDTDEntity":10,"./XMLDTDNotation":11,"./XMLDeclaration":12,"./XMLDocType":13,"./XMLElement":16,"./XMLProcessingInstruction":18,"./XMLRaw":19,"./XMLText":23,"./XMLWriterBase":24}],22:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLStringifier,
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    hasProp = {}.hasOwnProperty;

  module.exports = XMLStringifier = (function() {
    function XMLStringifier(options) {
      this.assertLegalChar = bind(this.assertLegalChar, this);
      var key, ref, value;
      options || (options = {});
      this.noDoubleEncoding = options.noDoubleEncoding;
      ref = options.stringify || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this[key] = value;
      }
    }

    XMLStringifier.prototype.eleName = function(val) {
      val = '' + val || '';
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.eleText = function(val) {
      val = '' + val || '';
      return this.assertLegalChar(this.elEscape(val));
    };

    XMLStringifier.prototype.cdata = function(val) {
      val = '' + val || '';
      val = val.replace(']]>', ']]]]><![CDATA[>');
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.comment = function(val) {
      val = '' + val || '';
      if (val.match(/--/)) {
        throw new Error("Comment text cannot contain double-hypen: " + val);
      }
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.raw = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.attName = function(val) {
      return val = '' + val || '';
    };

    XMLStringifier.prototype.attValue = function(val) {
      val = '' + val || '';
      return this.attEscape(val);
    };

    XMLStringifier.prototype.insTarget = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.insValue = function(val) {
      val = '' + val || '';
      if (val.match(/\?>/)) {
        throw new Error("Invalid processing instruction value: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlVersion = function(val) {
      val = '' + val || '';
      if (!val.match(/1\.[0-9]+/)) {
        throw new Error("Invalid version number: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlEncoding = function(val) {
      val = '' + val || '';
      if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/)) {
        throw new Error("Invalid encoding: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlStandalone = function(val) {
      if (val) {
        return "yes";
      } else {
        return "no";
      }
    };

    XMLStringifier.prototype.dtdPubID = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdSysID = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdElementValue = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdAttType = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdAttDefault = function(val) {
      if (val != null) {
        return '' + val || '';
      } else {
        return val;
      }
    };

    XMLStringifier.prototype.dtdEntityValue = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdNData = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.convertAttKey = '@';

    XMLStringifier.prototype.convertPIKey = '?';

    XMLStringifier.prototype.convertTextKey = '#text';

    XMLStringifier.prototype.convertCDataKey = '#cdata';

    XMLStringifier.prototype.convertCommentKey = '#comment';

    XMLStringifier.prototype.convertRawKey = '#raw';

    XMLStringifier.prototype.assertLegalChar = function(str) {
      var res;
      res = str.match(/[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/);
      if (res) {
        throw new Error("Invalid character in string: " + str + " at index " + res.index);
      }
      return str;
    };

    XMLStringifier.prototype.elEscape = function(str) {
      var ampregex;
      ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\r/g, '&#xD;');
    };

    XMLStringifier.prototype.attEscape = function(str) {
      var ampregex;
      ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/\t/g, '&#x9;').replace(/\n/g, '&#xA;').replace(/\r/g, '&#xD;');
    };

    return XMLStringifier;

  })();

}).call(this);

},{}],23:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLText,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLText = (function(superClass) {
    extend(XMLText, superClass);

    function XMLText(parent, text) {
      XMLText.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing element text");
      }
      this.value = this.stringify.eleText(text);
    }

    XMLText.prototype.clone = function() {
      return Object.create(this);
    };

    XMLText.prototype.toString = function(options) {
      return this.options.writer.set(options).text(this);
    };

    return XMLText;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],24:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLWriterBase,
    hasProp = {}.hasOwnProperty;

  module.exports = XMLWriterBase = (function() {
    function XMLWriterBase(options) {
      var key, ref, ref1, ref2, ref3, ref4, ref5, ref6, value;
      options || (options = {});
      this.pretty = options.pretty || false;
      this.allowEmpty = (ref = options.allowEmpty) != null ? ref : false;
      if (this.pretty) {
        this.indent = (ref1 = options.indent) != null ? ref1 : '  ';
        this.newline = (ref2 = options.newline) != null ? ref2 : '\n';
        this.offset = (ref3 = options.offset) != null ? ref3 : 0;
        this.dontprettytextnodes = (ref4 = options.dontprettytextnodes) != null ? ref4 : 0;
      } else {
        this.indent = '';
        this.newline = '';
        this.offset = 0;
        this.dontprettytextnodes = 0;
      }
      this.spacebeforeslash = (ref5 = options.spacebeforeslash) != null ? ref5 : '';
      if (this.spacebeforeslash === true) {
        this.spacebeforeslash = ' ';
      }
      this.newlinedefault = this.newline;
      this.prettydefault = this.pretty;
      ref6 = options.writer || {};
      for (key in ref6) {
        if (!hasProp.call(ref6, key)) continue;
        value = ref6[key];
        this[key] = value;
      }
    }

    XMLWriterBase.prototype.set = function(options) {
      var key, ref, value;
      options || (options = {});
      if ("pretty" in options) {
        this.pretty = options.pretty;
      }
      if ("allowEmpty" in options) {
        this.allowEmpty = options.allowEmpty;
      }
      if (this.pretty) {
        this.indent = "indent" in options ? options.indent : '  ';
        this.newline = "newline" in options ? options.newline : '\n';
        this.offset = "offset" in options ? options.offset : 0;
        this.dontprettytextnodes = "dontprettytextnodes" in options ? options.dontprettytextnodes : 0;
      } else {
        this.indent = '';
        this.newline = '';
        this.offset = 0;
        this.dontprettytextnodes = 0;
      }
      this.spacebeforeslash = "spacebeforeslash" in options ? options.spacebeforeslash : '';
      if (this.spacebeforeslash === true) {
        this.spacebeforeslash = ' ';
      }
      this.newlinedefault = this.newline;
      this.prettydefault = this.pretty;
      ref = options.writer || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this[key] = value;
      }
      return this;
    };

    XMLWriterBase.prototype.space = function(level) {
      var indent;
      if (this.pretty) {
        indent = (level || 0) + this.offset + 1;
        if (indent > 0) {
          return new Array(indent).join(this.indent);
        } else {
          return '';
        }
      } else {
        return '';
      }
    };

    return XMLWriterBase;

  })();

}).call(this);

},{}],25:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDocument, XMLDocumentCB, XMLStreamWriter, XMLStringWriter, assign, isFunction, ref;

  ref = require('./Utility'), assign = ref.assign, isFunction = ref.isFunction;

  XMLDocument = require('./XMLDocument');

  XMLDocumentCB = require('./XMLDocumentCB');

  XMLStringWriter = require('./XMLStringWriter');

  XMLStreamWriter = require('./XMLStreamWriter');

  module.exports.create = function(name, xmldec, doctype, options) {
    var doc, root;
    if (name == null) {
      throw new Error("Root element needs a name");
    }
    options = assign({}, xmldec, doctype, options);
    doc = new XMLDocument(options);
    root = doc.element(name);
    if (!options.headless) {
      doc.declaration(options);
      if ((options.pubID != null) || (options.sysID != null)) {
        doc.doctype(options);
      }
    }
    return root;
  };

  module.exports.begin = function(options, onData, onEnd) {
    var ref1;
    if (isFunction(options)) {
      ref1 = [options, onData], onData = ref1[0], onEnd = ref1[1];
      options = {};
    }
    if (onData) {
      return new XMLDocumentCB(options, onData, onEnd);
    } else {
      return new XMLDocument(options);
    }
  };

  module.exports.stringWriter = function(options) {
    return new XMLStringWriter(options);
  };

  module.exports.streamWriter = function(stream, options) {
    return new XMLStreamWriter(stream, options);
  };

}).call(this);

},{"./Utility":4,"./XMLDocument":14,"./XMLDocumentCB":15,"./XMLStreamWriter":20,"./XMLStringWriter":21}]},{},[1])(1)
});
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.plist = f()}})(function(){var define,module,exports;return (function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(require,module,exports){
(function (Buffer){
/**
 * Module dependencies.
 */

var DOMParser = require('xmldom').DOMParser;

/**
 * Module exports.
 */

exports.parse = parse;

var TEXT_NODE = 3;
var CDATA_NODE = 4;
var COMMENT_NODE = 8;


/**
 * We ignore raw text (usually whitespace), <!-- xml comments -->,
 * and raw CDATA nodes.
 *
 * @param {Element} node
 * @returns {Boolean}
 * @api private
 */

function shouldIgnoreNode (node) {
  return node.nodeType === TEXT_NODE
    || node.nodeType === COMMENT_NODE
    || node.nodeType === CDATA_NODE;
}

/**
 * Check if the node is empty. Some plist file has such node:
 * <key />
 * this node shoud be ignored.
 *
 * @see https://github.com/TooTallNate/plist.js/issues/66
 * @param {Element} node
 * @returns {Boolean}
 * @api private
 */
function isEmptyNode(node){
  if(!node.childNodes || node.childNodes.length === 0) {
    return true;
  } else {
    return false;
  }
}

function invariant(test, message) {
  if (!test) {
    throw new Error(message);
  }
}

/**
 * Parses a Plist XML string. Returns an Object.
 *
 * @param {String} xml - the XML String to decode
 * @returns {Mixed} the decoded value from the Plist XML
 * @api public
 */

function parse (xml) {
  var doc = new DOMParser().parseFromString(xml);
  invariant(
    doc.documentElement.nodeName === 'plist',
    'malformed document. First element should be <plist>'
  );
  var plist = parsePlistXML(doc.documentElement);

  // the root <plist> node gets interpreted as an Array,
  // so pull out the inner data first
  if (plist.length == 1) plist = plist[0];

  return plist;
}

/**
 * Convert an XML based plist document into a JSON representation.
 *
 * @param {Object} xml_node - current XML node in the plist
 * @returns {Mixed} built up JSON object
 * @api private
 */

function parsePlistXML (node) {
  var i, new_obj, key, val, new_arr, res, counter, type;

  if (!node)
    return null;

  if (node.nodeName === 'plist') {
    new_arr = [];
    if (isEmptyNode(node)) {
      return new_arr;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (!shouldIgnoreNode(node.childNodes[i])) {
        new_arr.push( parsePlistXML(node.childNodes[i]));
      }
    }
    return new_arr;
  } else if (node.nodeName === 'dict') {
    new_obj = {};
    key = null;
    counter = 0;
    if (isEmptyNode(node)) {
      return new_obj;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (shouldIgnoreNode(node.childNodes[i])) continue;
      if (counter % 2 === 0) {
        invariant(
          node.childNodes[i].nodeName === 'key',
          'Missing key while parsing <dict/>.'
        );
        key = parsePlistXML(node.childNodes[i]);
      } else {
        invariant(
          node.childNodes[i].nodeName !== 'key',
          'Unexpected key "'
            + parsePlistXML(node.childNodes[i])
            + '" while parsing <dict/>.'
        );
        new_obj[key] = parsePlistXML(node.childNodes[i]);
      }
      counter += 1;
    }
    if (counter % 2 === 1) {
      throw new Error('Missing value for "' + key + '" while parsing <dict/>');
    }
    return new_obj;

  } else if (node.nodeName === 'array') {
    new_arr = [];
    if (isEmptyNode(node)) {
      return new_arr;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (!shouldIgnoreNode(node.childNodes[i])) {
        res = parsePlistXML(node.childNodes[i]);
        if (null != res) new_arr.push(res);
      }
    }
    return new_arr;

  } else if (node.nodeName === '#text') {
    // TODO: what should we do with text types? (CDATA sections)

  } else if (node.nodeName === 'key') {
    if (isEmptyNode(node)) {
      return '';
    }
    return node.childNodes[0].nodeValue;
  } else if (node.nodeName === 'string') {
    res = '';
    if (isEmptyNode(node)) {
      return res;
    }
    for (i=0; i < node.childNodes.length; i++) {
      var type = node.childNodes[i].nodeType;
      if (type === TEXT_NODE || type === CDATA_NODE) {
        res += node.childNodes[i].nodeValue;
      }
    }
    return res;

  } else if (node.nodeName === 'integer') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as integer.'
    );
    return parseInt(node.childNodes[0].nodeValue, 10);

  } else if (node.nodeName === 'real') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as real.'
    );
    res = '';
    for (i=0; i < node.childNodes.length; i++) {
      if (node.childNodes[i].nodeType === TEXT_NODE) {
        res += node.childNodes[i].nodeValue;
      }
    }
    return parseFloat(res);

  } else if (node.nodeName === 'data') {
    res = '';
    if (isEmptyNode(node)) {
      return Buffer.from(res, 'base64');
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (node.childNodes[i].nodeType === TEXT_NODE) {
        res += node.childNodes[i].nodeValue.replace(/\s+/g, '');
      }
    }
    return Buffer.from(res, 'base64');

  } else if (node.nodeName === 'date') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as Date.'
    )
    return new Date(node.childNodes[0].nodeValue);

  } else if (node.nodeName === 'true') {
    return true;

  } else if (node.nodeName === 'false') {
    return false;
  }
}

}).call(this,require("buffer").Buffer)
},{"buffer":3,"xmldom":5}],2:[function(require,module,exports){
'use strict'

exports.byteLength = byteLength
exports.toByteArray = toByteArray
exports.fromByteArray = fromByteArray

var lookup = []
var revLookup = []
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array

var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, len = code.length; i < len; ++i) {
  lookup[i] = code[i]
  revLookup[code.charCodeAt(i)] = i
}

// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
revLookup['-'.charCodeAt(0)] = 62
revLookup['_'.charCodeAt(0)] = 63

function placeHoldersCount (b64) {
  var len = b64.length
  if (len % 4 > 0) {
    throw new Error('Invalid string. Length must be a multiple of 4')
  }

  // the number of equal signs (place holders)
  // if there are two placeholders, than the two characters before it
  // represent one byte
  // if there is only one, then the three characters before it represent 2 bytes
  // this is just a cheap hack to not do indexOf twice
  return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
}

function byteLength (b64) {
  // base64 is 4/3 + up to two characters of the original data
  return (b64.length * 3 / 4) - placeHoldersCount(b64)
}

function toByteArray (b64) {
  var i, l, tmp, placeHolders, arr
  var len = b64.length
  placeHolders = placeHoldersCount(b64)

  arr = new Arr((len * 3 / 4) - placeHolders)

  // if there are placeholders, only get up to the last complete 4 chars
  l = placeHolders > 0 ? len - 4 : len

  var L = 0

  for (i = 0; i < l; i += 4) {
    tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
    arr[L++] = (tmp >> 16) & 0xFF
    arr[L++] = (tmp >> 8) & 0xFF
    arr[L++] = tmp & 0xFF
  }

  if (placeHolders === 2) {
    tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
    arr[L++] = tmp & 0xFF
  } else if (placeHolders === 1) {
    tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
    arr[L++] = (tmp >> 8) & 0xFF
    arr[L++] = tmp & 0xFF
  }

  return arr
}

function tripletToBase64 (num) {
  return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
}

function encodeChunk (uint8, start, end) {
  var tmp
  var output = []
  for (var i = start; i < end; i += 3) {
    tmp = ((uint8[i] << 16) & 0xFF0000) + ((uint8[i + 1] << 8) & 0xFF00) + (uint8[i + 2] & 0xFF)
    output.push(tripletToBase64(tmp))
  }
  return output.join('')
}

function fromByteArray (uint8) {
  var tmp
  var len = uint8.length
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  var output = ''
  var parts = []
  var maxChunkLength = 16383 // must be multiple of 3

  // go through the array every three bytes, we'll deal with trailing stuff later
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
  }

  // pad the end with zeros, but make sure to not forget the extra bytes
  if (extraBytes === 1) {
    tmp = uint8[len - 1]
    output += lookup[tmp >> 2]
    output += lookup[(tmp << 4) & 0x3F]
    output += '=='
  } else if (extraBytes === 2) {
    tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
    output += lookup[tmp >> 10]
    output += lookup[(tmp >> 4) & 0x3F]
    output += lookup[(tmp << 2) & 0x3F]
    output += '='
  }

  parts.push(output)

  return parts.join('')
}

},{}],3:[function(require,module,exports){
/*!
 * The buffer module from node.js, for the browser.
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */
/* eslint-disable no-proto */

'use strict'

var base64 = require('base64-js')
var ieee754 = require('ieee754')

exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50

var K_MAX_LENGTH = 0x7fffffff
exports.kMaxLength = K_MAX_LENGTH

/**
 * If `Buffer.TYPED_ARRAY_SUPPORT`:
 *   === true    Use Uint8Array implementation (fastest)
 *   === false   Print warning and recommend using `buffer` v4.x which has an Object
 *               implementation (most compatible, even IE6)
 *
 * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
 * Opera 11.6+, iOS 4.2+.
 *
 * We report that the browser does not support typed arrays if the are not subclassable
 * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
 * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
 * for __proto__ and has a buggy typed array implementation.
 */
Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()

if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
    typeof console.error === 'function') {
  console.error(
    'This browser lacks typed array (Uint8Array) support which is required by ' +
    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
  )
}

function typedArraySupport () {
  // Can typed array instances can be augmented?
  try {
    var arr = new Uint8Array(1)
    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
    return arr.foo() === 42
  } catch (e) {
    return false
  }
}

Object.defineProperty(Buffer.prototype, 'parent', {
  get: function () {
    if (!(this instanceof Buffer)) {
      return undefined
    }
    return this.buffer
  }
})

Object.defineProperty(Buffer.prototype, 'offset', {
  get: function () {
    if (!(this instanceof Buffer)) {
      return undefined
    }
    return this.byteOffset
  }
})

function createBuffer (length) {
  if (length > K_MAX_LENGTH) {
    throw new RangeError('Invalid typed array length')
  }
  // Return an augmented `Uint8Array` instance
  var buf = new Uint8Array(length)
  buf.__proto__ = Buffer.prototype
  return buf
}

/**
 * The Buffer constructor returns instances of `Uint8Array` that have their
 * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
 * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
 * and the `Uint8Array` methods. Square bracket notation works as expected -- it
 * returns a single octet.
 *
 * The `Uint8Array` prototype remains unmodified.
 */

function Buffer (arg, encodingOrOffset, length) {
  // Common case.
  if (typeof arg === 'number') {
    if (typeof encodingOrOffset === 'string') {
      throw new Error(
        'If encoding is specified then the first argument must be a string'
      )
    }
    return allocUnsafe(arg)
  }
  return from(arg, encodingOrOffset, length)
}

// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
if (typeof Symbol !== 'undefined' && Symbol.species &&
    Buffer[Symbol.species] === Buffer) {
  Object.defineProperty(Buffer, Symbol.species, {
    value: null,
    configurable: true,
    enumerable: false,
    writable: false
  })
}

Buffer.poolSize = 8192 // not used by this implementation

function from (value, encodingOrOffset, length) {
  if (typeof value === 'number') {
    throw new TypeError('"value" argument must not be a number')
  }

  if (isArrayBuffer(value) || (value && isArrayBuffer(value.buffer))) {
    return fromArrayBuffer(value, encodingOrOffset, length)
  }

  if (typeof value === 'string') {
    return fromString(value, encodingOrOffset)
  }

  return fromObject(value)
}

/**
 * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
 * if value is a number.
 * Buffer.from(str[, encoding])
 * Buffer.from(array)
 * Buffer.from(buffer)
 * Buffer.from(arrayBuffer[, byteOffset[, length]])
 **/
Buffer.from = function (value, encodingOrOffset, length) {
  return from(value, encodingOrOffset, length)
}

// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
// https://github.com/feross/buffer/pull/148
Buffer.prototype.__proto__ = Uint8Array.prototype
Buffer.__proto__ = Uint8Array

function assertSize (size) {
  if (typeof size !== 'number') {
    throw new TypeError('"size" argument must be of type number')
  } else if (size < 0) {
    throw new RangeError('"size" argument must not be negative')
  }
}

function alloc (size, fill, encoding) {
  assertSize(size)
  if (size <= 0) {
    return createBuffer(size)
  }
  if (fill !== undefined) {
    // Only pay attention to encoding if it's a string. This
    // prevents accidentally sending in a number that would
    // be interpretted as a start offset.
    return typeof encoding === 'string'
      ? createBuffer(size).fill(fill, encoding)
      : createBuffer(size).fill(fill)
  }
  return createBuffer(size)
}

/**
 * Creates a new filled Buffer instance.
 * alloc(size[, fill[, encoding]])
 **/
Buffer.alloc = function (size, fill, encoding) {
  return alloc(size, fill, encoding)
}

function allocUnsafe (size) {
  assertSize(size)
  return createBuffer(size < 0 ? 0 : checked(size) | 0)
}

/**
 * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
 * */
Buffer.allocUnsafe = function (size) {
  return allocUnsafe(size)
}
/**
 * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
 */
Buffer.allocUnsafeSlow = function (size) {
  return allocUnsafe(size)
}

function fromString (string, encoding) {
  if (typeof encoding !== 'string' || encoding === '') {
    encoding = 'utf8'
  }

  if (!Buffer.isEncoding(encoding)) {
    throw new TypeError('Unknown encoding: ' + encoding)
  }

  var length = byteLength(string, encoding) | 0
  var buf = createBuffer(length)

  var actual = buf.write(string, encoding)

  if (actual !== length) {
    // Writing a hex string, for example, that contains invalid characters will
    // cause everything after the first invalid character to be ignored. (e.g.
    // 'abxxcd' will be treated as 'ab')
    buf = buf.slice(0, actual)
  }

  return buf
}

function fromArrayLike (array) {
  var length = array.length < 0 ? 0 : checked(array.length) | 0
  var buf = createBuffer(length)
  for (var i = 0; i < length; i += 1) {
    buf[i] = array[i] & 255
  }
  return buf
}

function fromArrayBuffer (array, byteOffset, length) {
  if (byteOffset < 0 || array.byteLength < byteOffset) {
    throw new RangeError('"offset" is outside of buffer bounds')
  }

  if (array.byteLength < byteOffset + (length || 0)) {
    throw new RangeError('"length" is outside of buffer bounds')
  }

  var buf
  if (byteOffset === undefined && length === undefined) {
    buf = new Uint8Array(array)
  } else if (length === undefined) {
    buf = new Uint8Array(array, byteOffset)
  } else {
    buf = new Uint8Array(array, byteOffset, length)
  }

  // Return an augmented `Uint8Array` instance
  buf.__proto__ = Buffer.prototype
  return buf
}

function fromObject (obj) {
  if (Buffer.isBuffer(obj)) {
    var len = checked(obj.length) | 0
    var buf = createBuffer(len)

    if (buf.length === 0) {
      return buf
    }

    obj.copy(buf, 0, 0, len)
    return buf
  }

  if (obj) {
    if (ArrayBuffer.isView(obj) || 'length' in obj) {
      if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
        return createBuffer(0)
      }
      return fromArrayLike(obj)
    }

    if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
      return fromArrayLike(obj.data)
    }
  }

  throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object.')
}

function checked (length) {
  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
  // length is NaN (which is otherwise coerced to zero.)
  if (length >= K_MAX_LENGTH) {
    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
  }
  return length | 0
}

function SlowBuffer (length) {
  if (+length != length) { // eslint-disable-line eqeqeq
    length = 0
  }
  return Buffer.alloc(+length)
}

Buffer.isBuffer = function isBuffer (b) {
  return b != null && b._isBuffer === true
}

Buffer.compare = function compare (a, b) {
  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
    throw new TypeError('Arguments must be Buffers')
  }

  if (a === b) return 0

  var x = a.length
  var y = b.length

  for (var i = 0, len = Math.min(x, y); i < len; ++i) {
    if (a[i] !== b[i]) {
      x = a[i]
      y = b[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

Buffer.isEncoding = function isEncoding (encoding) {
  switch (String(encoding).toLowerCase()) {
    case 'hex':
    case 'utf8':
    case 'utf-8':
    case 'ascii':
    case 'latin1':
    case 'binary':
    case 'base64':
    case 'ucs2':
    case 'ucs-2':
    case 'utf16le':
    case 'utf-16le':
      return true
    default:
      return false
  }
}

Buffer.concat = function concat (list, length) {
  if (!Array.isArray(list)) {
    throw new TypeError('"list" argument must be an Array of Buffers')
  }

  if (list.length === 0) {
    return Buffer.alloc(0)
  }

  var i
  if (length === undefined) {
    length = 0
    for (i = 0; i < list.length; ++i) {
      length += list[i].length
    }
  }

  var buffer = Buffer.allocUnsafe(length)
  var pos = 0
  for (i = 0; i < list.length; ++i) {
    var buf = list[i]
    if (ArrayBuffer.isView(buf)) {
      buf = Buffer.from(buf)
    }
    if (!Buffer.isBuffer(buf)) {
      throw new TypeError('"list" argument must be an Array of Buffers')
    }
    buf.copy(buffer, pos)
    pos += buf.length
  }
  return buffer
}

function byteLength (string, encoding) {
  if (Buffer.isBuffer(string)) {
    return string.length
  }
  if (ArrayBuffer.isView(string) || isArrayBuffer(string)) {
    return string.byteLength
  }
  if (typeof string !== 'string') {
    string = '' + string
  }

  var len = string.length
  if (len === 0) return 0

  // Use a for loop to avoid recursion
  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'ascii':
      case 'latin1':
      case 'binary':
        return len
      case 'utf8':
      case 'utf-8':
      case undefined:
        return utf8ToBytes(string).length
      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return len * 2
      case 'hex':
        return len >>> 1
      case 'base64':
        return base64ToBytes(string).length
      default:
        if (loweredCase) return utf8ToBytes(string).length // assume utf8
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}
Buffer.byteLength = byteLength

function slowToString (encoding, start, end) {
  var loweredCase = false

  // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
  // property of a typed array.

  // This behaves neither like String nor Uint8Array in that we set start/end
  // to their upper/lower bounds if the value passed is out of range.
  // undefined is handled specially as per ECMA-262 6th Edition,
  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
  if (start === undefined || start < 0) {
    start = 0
  }
  // Return early if start > this.length. Done here to prevent potential uint32
  // coercion fail below.
  if (start > this.length) {
    return ''
  }

  if (end === undefined || end > this.length) {
    end = this.length
  }

  if (end <= 0) {
    return ''
  }

  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
  end >>>= 0
  start >>>= 0

  if (end <= start) {
    return ''
  }

  if (!encoding) encoding = 'utf8'

  while (true) {
    switch (encoding) {
      case 'hex':
        return hexSlice(this, start, end)

      case 'utf8':
      case 'utf-8':
        return utf8Slice(this, start, end)

      case 'ascii':
        return asciiSlice(this, start, end)

      case 'latin1':
      case 'binary':
        return latin1Slice(this, start, end)

      case 'base64':
        return base64Slice(this, start, end)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return utf16leSlice(this, start, end)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = (encoding + '').toLowerCase()
        loweredCase = true
    }
  }
}

// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
// reliably in a browserify context because there could be multiple different
// copies of the 'buffer' package in use. This method works even for Buffer
// instances that were created from another copy of the `buffer` package.
// See: https://github.com/feross/buffer/issues/154
Buffer.prototype._isBuffer = true

function swap (b, n, m) {
  var i = b[n]
  b[n] = b[m]
  b[m] = i
}

Buffer.prototype.swap16 = function swap16 () {
  var len = this.length
  if (len % 2 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 16-bits')
  }
  for (var i = 0; i < len; i += 2) {
    swap(this, i, i + 1)
  }
  return this
}

Buffer.prototype.swap32 = function swap32 () {
  var len = this.length
  if (len % 4 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 32-bits')
  }
  for (var i = 0; i < len; i += 4) {
    swap(this, i, i + 3)
    swap(this, i + 1, i + 2)
  }
  return this
}

Buffer.prototype.swap64 = function swap64 () {
  var len = this.length
  if (len % 8 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 64-bits')
  }
  for (var i = 0; i < len; i += 8) {
    swap(this, i, i + 7)
    swap(this, i + 1, i + 6)
    swap(this, i + 2, i + 5)
    swap(this, i + 3, i + 4)
  }
  return this
}

Buffer.prototype.toString = function toString () {
  var length = this.length
  if (length === 0) return ''
  if (arguments.length === 0) return utf8Slice(this, 0, length)
  return slowToString.apply(this, arguments)
}

Buffer.prototype.toLocaleString = Buffer.prototype.toString

Buffer.prototype.equals = function equals (b) {
  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
  if (this === b) return true
  return Buffer.compare(this, b) === 0
}

Buffer.prototype.inspect = function inspect () {
  var str = ''
  var max = exports.INSPECT_MAX_BYTES
  if (this.length > 0) {
    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
    if (this.length > max) str += ' ... '
  }
  return '<Buffer ' + str + '>'
}

Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
  if (!Buffer.isBuffer(target)) {
    throw new TypeError('Argument must be a Buffer')
  }

  if (start === undefined) {
    start = 0
  }
  if (end === undefined) {
    end = target ? target.length : 0
  }
  if (thisStart === undefined) {
    thisStart = 0
  }
  if (thisEnd === undefined) {
    thisEnd = this.length
  }

  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
    throw new RangeError('out of range index')
  }

  if (thisStart >= thisEnd && start >= end) {
    return 0
  }
  if (thisStart >= thisEnd) {
    return -1
  }
  if (start >= end) {
    return 1
  }

  start >>>= 0
  end >>>= 0
  thisStart >>>= 0
  thisEnd >>>= 0

  if (this === target) return 0

  var x = thisEnd - thisStart
  var y = end - start
  var len = Math.min(x, y)

  var thisCopy = this.slice(thisStart, thisEnd)
  var targetCopy = target.slice(start, end)

  for (var i = 0; i < len; ++i) {
    if (thisCopy[i] !== targetCopy[i]) {
      x = thisCopy[i]
      y = targetCopy[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
//
// Arguments:
// - buffer - a Buffer to search
// - val - a string, Buffer, or number
// - byteOffset - an index into `buffer`; will be clamped to an int32
// - encoding - an optional encoding, relevant is val is a string
// - dir - true for indexOf, false for lastIndexOf
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  // Empty buffer means no match
  if (buffer.length === 0) return -1

  // Normalize byteOffset
  if (typeof byteOffset === 'string') {
    encoding = byteOffset
    byteOffset = 0
  } else if (byteOffset > 0x7fffffff) {
    byteOffset = 0x7fffffff
  } else if (byteOffset < -0x80000000) {
    byteOffset = -0x80000000
  }
  byteOffset = +byteOffset  // Coerce to Number.
  if (numberIsNaN(byteOffset)) {
    // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
    byteOffset = dir ? 0 : (buffer.length - 1)
  }

  // Normalize byteOffset: negative offsets start from the end of the buffer
  if (byteOffset < 0) byteOffset = buffer.length + byteOffset
  if (byteOffset >= buffer.length) {
    if (dir) return -1
    else byteOffset = buffer.length - 1
  } else if (byteOffset < 0) {
    if (dir) byteOffset = 0
    else return -1
  }

  // Normalize val
  if (typeof val === 'string') {
    val = Buffer.from(val, encoding)
  }

  // Finally, search either indexOf (if dir is true) or lastIndexOf
  if (Buffer.isBuffer(val)) {
    // Special case: looking for empty string/buffer always fails
    if (val.length === 0) {
      return -1
    }
    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
  } else if (typeof val === 'number') {
    val = val & 0xFF // Search for a byte value [0-255]
    if (typeof Uint8Array.prototype.indexOf === 'function') {
      if (dir) {
        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
      } else {
        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
      }
    }
    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
  }

  throw new TypeError('val must be string, number or Buffer')
}

function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  var indexSize = 1
  var arrLength = arr.length
  var valLength = val.length

  if (encoding !== undefined) {
    encoding = String(encoding).toLowerCase()
    if (encoding === 'ucs2' || encoding === 'ucs-2' ||
        encoding === 'utf16le' || encoding === 'utf-16le') {
      if (arr.length < 2 || val.length < 2) {
        return -1
      }
      indexSize = 2
      arrLength /= 2
      valLength /= 2
      byteOffset /= 2
    }
  }

  function read (buf, i) {
    if (indexSize === 1) {
      return buf[i]
    } else {
      return buf.readUInt16BE(i * indexSize)
    }
  }

  var i
  if (dir) {
    var foundIndex = -1
    for (i = byteOffset; i < arrLength; i++) {
      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
        if (foundIndex === -1) foundIndex = i
        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
      } else {
        if (foundIndex !== -1) i -= i - foundIndex
        foundIndex = -1
      }
    }
  } else {
    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
    for (i = byteOffset; i >= 0; i--) {
      var found = true
      for (var j = 0; j < valLength; j++) {
        if (read(arr, i + j) !== read(val, j)) {
          found = false
          break
        }
      }
      if (found) return i
    }
  }

  return -1
}

Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
  return this.indexOf(val, byteOffset, encoding) !== -1
}

Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
}

Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
}

function hexWrite (buf, string, offset, length) {
  offset = Number(offset) || 0
  var remaining = buf.length - offset
  if (!length) {
    length = remaining
  } else {
    length = Number(length)
    if (length > remaining) {
      length = remaining
    }
  }

  var strLen = string.length

  if (length > strLen / 2) {
    length = strLen / 2
  }
  for (var i = 0; i < length; ++i) {
    var parsed = parseInt(string.substr(i * 2, 2), 16)
    if (numberIsNaN(parsed)) return i
    buf[offset + i] = parsed
  }
  return i
}

function utf8Write (buf, string, offset, length) {
  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}

function asciiWrite (buf, string, offset, length) {
  return blitBuffer(asciiToBytes(string), buf, offset, length)
}

function latin1Write (buf, string, offset, length) {
  return asciiWrite(buf, string, offset, length)
}

function base64Write (buf, string, offset, length) {
  return blitBuffer(base64ToBytes(string), buf, offset, length)
}

function ucs2Write (buf, string, offset, length) {
  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}

Buffer.prototype.write = function write (string, offset, length, encoding) {
  // Buffer#write(string)
  if (offset === undefined) {
    encoding = 'utf8'
    length = this.length
    offset = 0
  // Buffer#write(string, encoding)
  } else if (length === undefined && typeof offset === 'string') {
    encoding = offset
    length = this.length
    offset = 0
  // Buffer#write(string, offset[, length][, encoding])
  } else if (isFinite(offset)) {
    offset = offset >>> 0
    if (isFinite(length)) {
      length = length >>> 0
      if (encoding === undefined) encoding = 'utf8'
    } else {
      encoding = length
      length = undefined
    }
  } else {
    throw new Error(
      'Buffer.write(string, encoding, offset[, length]) is no longer supported'
    )
  }

  var remaining = this.length - offset
  if (length === undefined || length > remaining) length = remaining

  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
    throw new RangeError('Attempt to write outside buffer bounds')
  }

  if (!encoding) encoding = 'utf8'

  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'hex':
        return hexWrite(this, string, offset, length)

      case 'utf8':
      case 'utf-8':
        return utf8Write(this, string, offset, length)

      case 'ascii':
        return asciiWrite(this, string, offset, length)

      case 'latin1':
      case 'binary':
        return latin1Write(this, string, offset, length)

      case 'base64':
        // Warning: maxLength not taken into account in base64Write
        return base64Write(this, string, offset, length)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return ucs2Write(this, string, offset, length)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}

Buffer.prototype.toJSON = function toJSON () {
  return {
    type: 'Buffer',
    data: Array.prototype.slice.call(this._arr || this, 0)
  }
}

function base64Slice (buf, start, end) {
  if (start === 0 && end === buf.length) {
    return base64.fromByteArray(buf)
  } else {
    return base64.fromByteArray(buf.slice(start, end))
  }
}

function utf8Slice (buf, start, end) {
  end = Math.min(buf.length, end)
  var res = []

  var i = start
  while (i < end) {
    var firstByte = buf[i]
    var codePoint = null
    var bytesPerSequence = (firstByte > 0xEF) ? 4
      : (firstByte > 0xDF) ? 3
      : (firstByte > 0xBF) ? 2
      : 1

    if (i + bytesPerSequence <= end) {
      var secondByte, thirdByte, fourthByte, tempCodePoint

      switch (bytesPerSequence) {
        case 1:
          if (firstByte < 0x80) {
            codePoint = firstByte
          }
          break
        case 2:
          secondByte = buf[i + 1]
          if ((secondByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
            if (tempCodePoint > 0x7F) {
              codePoint = tempCodePoint
            }
          }
          break
        case 3:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
              codePoint = tempCodePoint
            }
          }
          break
        case 4:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          fourthByte = buf[i + 3]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
              codePoint = tempCodePoint
            }
          }
      }
    }

    if (codePoint === null) {
      // we did not generate a valid codePoint so insert a
      // replacement char (U+FFFD) and advance only 1 byte
      codePoint = 0xFFFD
      bytesPerSequence = 1
    } else if (codePoint > 0xFFFF) {
      // encode to utf16 (surrogate pair dance)
      codePoint -= 0x10000
      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
      codePoint = 0xDC00 | codePoint & 0x3FF
    }

    res.push(codePoint)
    i += bytesPerSequence
  }

  return decodeCodePointsArray(res)
}

// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000

function decodeCodePointsArray (codePoints) {
  var len = codePoints.length
  if (len <= MAX_ARGUMENTS_LENGTH) {
    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
  }

  // Decode in chunks to avoid "call stack size exceeded".
  var res = ''
  var i = 0
  while (i < len) {
    res += String.fromCharCode.apply(
      String,
      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
    )
  }
  return res
}

function asciiSlice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i] & 0x7F)
  }
  return ret
}

function latin1Slice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i])
  }
  return ret
}

function hexSlice (buf, start, end) {
  var len = buf.length

  if (!start || start < 0) start = 0
  if (!end || end < 0 || end > len) end = len

  var out = ''
  for (var i = start; i < end; ++i) {
    out += toHex(buf[i])
  }
  return out
}

function utf16leSlice (buf, start, end) {
  var bytes = buf.slice(start, end)
  var res = ''
  for (var i = 0; i < bytes.length; i += 2) {
    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
  }
  return res
}

Buffer.prototype.slice = function slice (start, end) {
  var len = this.length
  start = ~~start
  end = end === undefined ? len : ~~end

  if (start < 0) {
    start += len
    if (start < 0) start = 0
  } else if (start > len) {
    start = len
  }

  if (end < 0) {
    end += len
    if (end < 0) end = 0
  } else if (end > len) {
    end = len
  }

  if (end < start) end = start

  var newBuf = this.subarray(start, end)
  // Return an augmented `Uint8Array` instance
  newBuf.__proto__ = Buffer.prototype
  return newBuf
}

/*
 * Need to make sure that buffer isn't trying to write out of bounds.
 */
function checkOffset (offset, ext, length) {
  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}

Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }

  return val
}

Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    checkOffset(offset, byteLength, this.length)
  }

  var val = this[offset + --byteLength]
  var mul = 1
  while (byteLength > 0 && (mul *= 0x100)) {
    val += this[offset + --byteLength] * mul
  }

  return val
}

Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  return this[offset]
}

Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return this[offset] | (this[offset + 1] << 8)
}

Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return (this[offset] << 8) | this[offset + 1]
}

Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return ((this[offset]) |
      (this[offset + 1] << 8) |
      (this[offset + 2] << 16)) +
      (this[offset + 3] * 0x1000000)
}

Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] * 0x1000000) +
    ((this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    this[offset + 3])
}

Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var i = byteLength
  var mul = 1
  var val = this[offset + --i]
  while (i > 0 && (mul *= 0x100)) {
    val += this[offset + --i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  if (!(this[offset] & 0x80)) return (this[offset])
  return ((0xff - this[offset] + 1) * -1)
}

Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset] | (this[offset + 1] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset + 1] | (this[offset] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset]) |
    (this[offset + 1] << 8) |
    (this[offset + 2] << 16) |
    (this[offset + 3] << 24)
}

Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] << 24) |
    (this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    (this[offset + 3])
}

Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, true, 23, 4)
}

Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, false, 23, 4)
}

Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, true, 52, 8)
}

Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, false, 52, 8)
}

function checkInt (buf, value, offset, ext, max, min) {
  if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
  if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
}

Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var mul = 1
  var i = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var i = byteLength - 1
  var mul = 1
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset + 3] = (value >>> 24)
  this[offset + 2] = (value >>> 16)
  this[offset + 1] = (value >>> 8)
  this[offset] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = 0
  var mul = 1
  var sub = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = byteLength - 1
  var mul = 1
  var sub = 0
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
  if (value < 0) value = 0xff + value + 1
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  this[offset + 2] = (value >>> 16)
  this[offset + 3] = (value >>> 24)
  return offset + 4
}

Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  if (value < 0) value = 0xffffffff + value + 1
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

function checkIEEE754 (buf, value, offset, ext, max, min) {
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
  if (offset < 0) throw new RangeError('Index out of range')
}

function writeFloat (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
  }
  ieee754.write(buf, value, offset, littleEndian, 23, 4)
  return offset + 4
}

Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
  return writeFloat(this, value, offset, true, noAssert)
}

Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
  return writeFloat(this, value, offset, false, noAssert)
}

function writeDouble (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
  }
  ieee754.write(buf, value, offset, littleEndian, 52, 8)
  return offset + 8
}

Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
  return writeDouble(this, value, offset, true, noAssert)
}

Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
  return writeDouble(this, value, offset, false, noAssert)
}

// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
  if (!start) start = 0
  if (!end && end !== 0) end = this.length
  if (targetStart >= target.length) targetStart = target.length
  if (!targetStart) targetStart = 0
  if (end > 0 && end < start) end = start

  // Copy 0 bytes; we're done
  if (end === start) return 0
  if (target.length === 0 || this.length === 0) return 0

  // Fatal error conditions
  if (targetStart < 0) {
    throw new RangeError('targetStart out of bounds')
  }
  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
  if (end < 0) throw new RangeError('sourceEnd out of bounds')

  // Are we oob?
  if (end > this.length) end = this.length
  if (target.length - targetStart < end - start) {
    end = target.length - targetStart + start
  }

  var len = end - start

  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
    // Use built-in when available, missing from IE11
    this.copyWithin(targetStart, start, end)
  } else if (this === target && start < targetStart && targetStart < end) {
    // descending copy from end
    for (var i = len - 1; i >= 0; --i) {
      target[i + targetStart] = this[i + start]
    }
  } else {
    Uint8Array.prototype.set.call(
      target,
      this.subarray(start, end),
      targetStart
    )
  }

  return len
}

// Usage:
//    buffer.fill(number[, offset[, end]])
//    buffer.fill(buffer[, offset[, end]])
//    buffer.fill(string[, offset[, end]][, encoding])
Buffer.prototype.fill = function fill (val, start, end, encoding) {
  // Handle string cases:
  if (typeof val === 'string') {
    if (typeof start === 'string') {
      encoding = start
      start = 0
      end = this.length
    } else if (typeof end === 'string') {
      encoding = end
      end = this.length
    }
    if (encoding !== undefined && typeof encoding !== 'string') {
      throw new TypeError('encoding must be a string')
    }
    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
      throw new TypeError('Unknown encoding: ' + encoding)
    }
    if (val.length === 1) {
      var code = val.charCodeAt(0)
      if ((encoding === 'utf8' && code < 128) ||
          encoding === 'latin1') {
        // Fast path: If `val` fits into a single byte, use that numeric value.
        val = code
      }
    }
  } else if (typeof val === 'number') {
    val = val & 255
  }

  // Invalid ranges are not set to a default, so can range check early.
  if (start < 0 || this.length < start || this.length < end) {
    throw new RangeError('Out of range index')
  }

  if (end <= start) {
    return this
  }

  start = start >>> 0
  end = end === undefined ? this.length : end >>> 0

  if (!val) val = 0

  var i
  if (typeof val === 'number') {
    for (i = start; i < end; ++i) {
      this[i] = val
    }
  } else {
    var bytes = Buffer.isBuffer(val)
      ? val
      : new Buffer(val, encoding)
    var len = bytes.length
    if (len === 0) {
      throw new TypeError('The value "' + val +
        '" is invalid for argument "value"')
    }
    for (i = 0; i < end - start; ++i) {
      this[i + start] = bytes[i % len]
    }
  }

  return this
}

// HELPER FUNCTIONS
// ================

var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g

function base64clean (str) {
  // Node takes equal signs as end of the Base64 encoding
  str = str.split('=')[0]
  // Node strips out invalid characters like \n and \t from the string, base64-js does not
  str = str.trim().replace(INVALID_BASE64_RE, '')
  // Node converts strings with length < 2 to ''
  if (str.length < 2) return ''
  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
  while (str.length % 4 !== 0) {
    str = str + '='
  }
  return str
}

function toHex (n) {
  if (n < 16) return '0' + n.toString(16)
  return n.toString(16)
}

function utf8ToBytes (string, units) {
  units = units || Infinity
  var codePoint
  var length = string.length
  var leadSurrogate = null
  var bytes = []

  for (var i = 0; i < length; ++i) {
    codePoint = string.charCodeAt(i)

    // is surrogate component
    if (codePoint > 0xD7FF && codePoint < 0xE000) {
      // last char was a lead
      if (!leadSurrogate) {
        // no lead yet
        if (codePoint > 0xDBFF) {
          // unexpected trail
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        } else if (i + 1 === length) {
          // unpaired lead
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        }

        // valid lead
        leadSurrogate = codePoint

        continue
      }

      // 2 leads in a row
      if (codePoint < 0xDC00) {
        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
        leadSurrogate = codePoint
        continue
      }

      // valid surrogate pair
      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
    } else if (leadSurrogate) {
      // valid bmp char, but last char was a lead
      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
    }

    leadSurrogate = null

    // encode utf8
    if (codePoint < 0x80) {
      if ((units -= 1) < 0) break
      bytes.push(codePoint)
    } else if (codePoint < 0x800) {
      if ((units -= 2) < 0) break
      bytes.push(
        codePoint >> 0x6 | 0xC0,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x10000) {
      if ((units -= 3) < 0) break
      bytes.push(
        codePoint >> 0xC | 0xE0,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x110000) {
      if ((units -= 4) < 0) break
      bytes.push(
        codePoint >> 0x12 | 0xF0,
        codePoint >> 0xC & 0x3F | 0x80,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else {
      throw new Error('Invalid code point')
    }
  }

  return bytes
}

function asciiToBytes (str) {
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    // Node's code seems to be doing this and not & 0x7F..
    byteArray.push(str.charCodeAt(i) & 0xFF)
  }
  return byteArray
}

function utf16leToBytes (str, units) {
  var c, hi, lo
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    if ((units -= 2) < 0) break

    c = str.charCodeAt(i)
    hi = c >> 8
    lo = c % 256
    byteArray.push(lo)
    byteArray.push(hi)
  }

  return byteArray
}

function base64ToBytes (str) {
  return base64.toByteArray(base64clean(str))
}

function blitBuffer (src, dst, offset, length) {
  for (var i = 0; i < length; ++i) {
    if ((i + offset >= dst.length) || (i >= src.length)) break
    dst[i + offset] = src[i]
  }
  return i
}

// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check
// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166
function isArrayBuffer (obj) {
  return obj instanceof ArrayBuffer ||
    (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' &&
      typeof obj.byteLength === 'number')
}

function numberIsNaN (obj) {
  return obj !== obj // eslint-disable-line no-self-compare
}

},{"base64-js":2,"ieee754":4}],4:[function(require,module,exports){
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
  var e, m
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var nBits = -7
  var i = isLE ? (nBytes - 1) : 0
  var d = isLE ? -1 : 1
  var s = buffer[offset + i]

  i += d

  e = s & ((1 << (-nBits)) - 1)
  s >>= (-nBits)
  nBits += eLen
  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  m = e & ((1 << (-nBits)) - 1)
  e >>= (-nBits)
  nBits += mLen
  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  if (e === 0) {
    e = 1 - eBias
  } else if (e === eMax) {
    return m ? NaN : ((s ? -1 : 1) * Infinity)
  } else {
    m = m + Math.pow(2, mLen)
    e = e - eBias
  }
  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
}

exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
  var e, m, c
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
  var i = isLE ? 0 : (nBytes - 1)
  var d = isLE ? 1 : -1
  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0

  value = Math.abs(value)

  if (isNaN(value) || value === Infinity) {
    m = isNaN(value) ? 1 : 0
    e = eMax
  } else {
    e = Math.floor(Math.log(value) / Math.LN2)
    if (value * (c = Math.pow(2, -e)) < 1) {
      e--
      c *= 2
    }
    if (e + eBias >= 1) {
      value += rt / c
    } else {
      value += rt * Math.pow(2, 1 - eBias)
    }
    if (value * c >= 2) {
      e++
      c /= 2
    }

    if (e + eBias >= eMax) {
      m = 0
      e = eMax
    } else if (e + eBias >= 1) {
      m = ((value * c) - 1) * Math.pow(2, mLen)
      e = e + eBias
    } else {
      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
      e = 0
    }
  }

  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}

  e = (e << mLen) | m
  eLen += mLen
  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}

  buffer[offset + i - d] |= s * 128
}

},{}],5:[function(require,module,exports){
function DOMParser(options){
	this.options = options ||{locator:{}};
	
}
DOMParser.prototype.parseFromString = function(source,mimeType){
	var options = this.options;
	var sax =  new XMLReader();
	var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
	var errorHandler = options.errorHandler;
	var locator = options.locator;
	var defaultNSMap = options.xmlns||{};
	var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
	if(locator){
		domBuilder.setDocumentLocator(locator)
	}
	
	sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
	sax.domBuilder = options.domBuilder || domBuilder;
	if(/\/x?html?$/.test(mimeType)){
		entityMap.nbsp = '\xa0';
		entityMap.copy = '\xa9';
		defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
	}
	defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
	if(source){
		sax.parse(source,defaultNSMap,entityMap);
	}else{
		sax.errorHandler.error("invalid doc source");
	}
	return domBuilder.doc;
}
function buildErrorHandler(errorImpl,domBuilder,locator){
	if(!errorImpl){
		if(domBuilder instanceof DOMHandler){
			return domBuilder;
		}
		errorImpl = domBuilder ;
	}
	var errorHandler = {}
	var isCallback = errorImpl instanceof Function;
	locator = locator||{}
	function build(key){
		var fn = errorImpl[key];
		if(!fn && isCallback){
			fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
		}
		errorHandler[key] = fn && function(msg){
			fn('[xmldom '+key+']\t'+msg+_locator(locator));
		}||function(){};
	}
	build('warning');
	build('error');
	build('fatalError');
	return errorHandler;
}

//console.log('#\n\n\n\n\n\n\n####')
/**
 * +ContentHandler+ErrorHandler
 * +LexicalHandler+EntityResolver2
 * -DeclHandler-DTDHandler 
 * 
 * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
 * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
 * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
 */
function DOMHandler() {
    this.cdata = false;
}
function position(locator,node){
	node.lineNumber = locator.lineNumber;
	node.columnNumber = locator.columnNumber;
}
/**
 * @see org.xml.sax.ContentHandler#startDocument
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
 */ 
DOMHandler.prototype = {
	startDocument : function() {
    	this.doc = new DOMImplementation().createDocument(null, null, null);
    	if (this.locator) {
        	this.doc.documentURI = this.locator.systemId;
    	}
	},
	startElement:function(namespaceURI, localName, qName, attrs) {
		var doc = this.doc;
	    var el = doc.createElementNS(namespaceURI, qName||localName);
	    var len = attrs.length;
	    appendElement(this, el);
	    this.currentElement = el;
	    
		this.locator && position(this.locator,el)
	    for (var i = 0 ; i < len; i++) {
	        var namespaceURI = attrs.getURI(i);
	        var value = attrs.getValue(i);
	        var qName = attrs.getQName(i);
			var attr = doc.createAttributeNS(namespaceURI, qName);
			this.locator &&position(attrs.getLocator(i),attr);
			attr.value = attr.nodeValue = value;
			el.setAttributeNode(attr)
	    }
	},
	endElement:function(namespaceURI, localName, qName) {
		var current = this.currentElement
		var tagName = current.tagName;
		this.currentElement = current.parentNode;
	},
	startPrefixMapping:function(prefix, uri) {
	},
	endPrefixMapping:function(prefix) {
	},
	processingInstruction:function(target, data) {
	    var ins = this.doc.createProcessingInstruction(target, data);
	    this.locator && position(this.locator,ins)
	    appendElement(this, ins);
	},
	ignorableWhitespace:function(ch, start, length) {
	},
	characters:function(chars, start, length) {
		chars = _toString.apply(this,arguments)
		//console.log(chars)
		if(chars){
			if (this.cdata) {
				var charNode = this.doc.createCDATASection(chars);
			} else {
				var charNode = this.doc.createTextNode(chars);
			}
			if(this.currentElement){
				this.currentElement.appendChild(charNode);
			}else if(/^\s*$/.test(chars)){
				this.doc.appendChild(charNode);
				//process xml
			}
			this.locator && position(this.locator,charNode)
		}
	},
	skippedEntity:function(name) {
	},
	endDocument:function() {
		this.doc.normalize();
	},
	setDocumentLocator:function (locator) {
	    if(this.locator = locator){// && !('lineNumber' in locator)){
	    	locator.lineNumber = 0;
	    }
	},
	//LexicalHandler
	comment:function(chars, start, length) {
		chars = _toString.apply(this,arguments)
	    var comm = this.doc.createComment(chars);
	    this.locator && position(this.locator,comm)
	    appendElement(this, comm);
	},
	
	startCDATA:function() {
	    //used in characters() methods
	    this.cdata = true;
	},
	endCDATA:function() {
	    this.cdata = false;
	},
	
	startDTD:function(name, publicId, systemId) {
		var impl = this.doc.implementation;
	    if (impl && impl.createDocumentType) {
	        var dt = impl.createDocumentType(name, publicId, systemId);
	        this.locator && position(this.locator,dt)
	        appendElement(this, dt);
	    }
	},
	/**
	 * @see org.xml.sax.ErrorHandler
	 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
	 */
	warning:function(error) {
		console.warn('[xmldom warning]\t'+error,_locator(this.locator));
	},
	error:function(error) {
		console.error('[xmldom error]\t'+error,_locator(this.locator));
	},
	fatalError:function(error) {
		console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
	    throw error;
	}
}
function _locator(l){
	if(l){
		return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
	}
}
function _toString(chars,start,length){
	if(typeof chars == 'string'){
		return chars.substr(start,length)
	}else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
		if(chars.length >= start+length || start){
			return new java.lang.String(chars,start,length)+'';
		}
		return chars;
	}
}

/*
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
 * used method of org.xml.sax.ext.LexicalHandler:
 *  #comment(chars, start, length)
 *  #startCDATA()
 *  #endCDATA()
 *  #startDTD(name, publicId, systemId)
 *
 *
 * IGNORED method of org.xml.sax.ext.LexicalHandler:
 *  #endDTD()
 *  #startEntity(name)
 *  #endEntity(name)
 *
 *
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
 * IGNORED method of org.xml.sax.ext.DeclHandler
 * 	#attributeDecl(eName, aName, type, mode, value)
 *  #elementDecl(name, model)
 *  #externalEntityDecl(name, publicId, systemId)
 *  #internalEntityDecl(name, value)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
 * IGNORED method of org.xml.sax.EntityResolver2
 *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
 *  #resolveEntity(publicId, systemId)
 *  #getExternalSubset(name, baseURI)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
 * IGNORED method of org.xml.sax.DTDHandler
 *  #notationDecl(name, publicId, systemId) {};
 *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
 */
"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
	DOMHandler.prototype[key] = function(){return null}
})

/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
function appendElement (hander,node) {
    if (!hander.currentElement) {
        hander.doc.appendChild(node);
    } else {
        hander.currentElement.appendChild(node);
    }
}//appendChild and setAttributeNS are preformance key

//if(typeof require == 'function'){
	var XMLReader = require('./sax').XMLReader;
	var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;
	exports.XMLSerializer = require('./dom').XMLSerializer ;
	exports.DOMParser = DOMParser;
//}

},{"./dom":6,"./sax":7}],6:[function(require,module,exports){
/*
 * DOM Level 2
 * Object DOMException
 * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
 */

function copy(src,dest){
	for(var p in src){
		dest[p] = src[p];
	}
}
/**
^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
 */
function _extends(Class,Super){
	var pt = Class.prototype;
	if(Object.create){
		var ppt = Object.create(Super.prototype)
		pt.__proto__ = ppt;
	}
	if(!(pt instanceof Super)){
		function t(){};
		t.prototype = Super.prototype;
		t = new t();
		copy(pt,t);
		Class.prototype = pt = t;
	}
	if(pt.constructor != Class){
		if(typeof Class != 'function'){
			console.error("unknow Class:"+Class)
		}
		pt.constructor = Class
	}
}
var htmlns = 'http://www.w3.org/1999/xhtml' ;
// Node Types
var NodeType = {}
var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;

// ExceptionCode
var ExceptionCode = {}
var ExceptionMessage = {};
var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
//level2
var INVALID_STATE_ERR        	= ExceptionCode.INVALID_STATE_ERR        	= ((ExceptionMessage[11]="Invalid state"),11);
var SYNTAX_ERR               	= ExceptionCode.SYNTAX_ERR               	= ((ExceptionMessage[12]="Syntax error"),12);
var INVALID_MODIFICATION_ERR 	= ExceptionCode.INVALID_MODIFICATION_ERR 	= ((ExceptionMessage[13]="Invalid modification"),13);
var NAMESPACE_ERR            	= ExceptionCode.NAMESPACE_ERR           	= ((ExceptionMessage[14]="Invalid namespace"),14);
var INVALID_ACCESS_ERR       	= ExceptionCode.INVALID_ACCESS_ERR      	= ((ExceptionMessage[15]="Invalid access"),15);


function DOMException(code, message) {
	if(message instanceof Error){
		var error = message;
	}else{
		error = this;
		Error.call(this, ExceptionMessage[code]);
		this.message = ExceptionMessage[code];
		if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
	}
	error.code = code;
	if(message) this.message = this.message + ": " + message;
	return error;
};
DOMException.prototype = Error.prototype;
copy(ExceptionCode,DOMException)
/**
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
 * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
 * The items in the NodeList are accessible via an integral index, starting from 0.
 */
function NodeList() {
};
NodeList.prototype = {
	/**
	 * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
	 * @standard level1
	 */
	length:0, 
	/**
	 * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
	 * @standard level1
	 * @param index  unsigned long 
	 *   Index into the collection.
	 * @return Node
	 * 	The node at the indexth position in the NodeList, or null if that is not a valid index. 
	 */
	item: function(index) {
		return this[index] || null;
	},
	toString:function(isHTML,nodeFilter){
		for(var buf = [], i = 0;i<this.length;i++){
			serializeToString(this[i],buf,isHTML,nodeFilter);
		}
		return buf.join('');
	}
};
function LiveNodeList(node,refresh){
	this._node = node;
	this._refresh = refresh
	_updateLiveList(this);
}
function _updateLiveList(list){
	var inc = list._node._inc || list._node.ownerDocument._inc;
	if(list._inc != inc){
		var ls = list._refresh(list._node);
		//console.log(ls.length)
		__set__(list,'length',ls.length);
		copy(ls,list);
		list._inc = inc;
	}
}
LiveNodeList.prototype.item = function(i){
	_updateLiveList(this);
	return this[i];
}

_extends(LiveNodeList,NodeList);
/**
 * 
 * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
 * NamedNodeMap objects in the DOM are live.
 * used for attributes or DocumentType entities 
 */
function NamedNodeMap() {
};

function _findNodeIndex(list,node){
	var i = list.length;
	while(i--){
		if(list[i] === node){return i}
	}
}

function _addNamedNode(el,list,newAttr,oldAttr){
	if(oldAttr){
		list[_findNodeIndex(list,oldAttr)] = newAttr;
	}else{
		list[list.length++] = newAttr;
	}
	if(el){
		newAttr.ownerElement = el;
		var doc = el.ownerDocument;
		if(doc){
			oldAttr && _onRemoveAttribute(doc,el,oldAttr);
			_onAddAttribute(doc,el,newAttr);
		}
	}
}
function _removeNamedNode(el,list,attr){
	//console.log('remove attr:'+attr)
	var i = _findNodeIndex(list,attr);
	if(i>=0){
		var lastIndex = list.length-1
		while(i<lastIndex){
			list[i] = list[++i]
		}
		list.length = lastIndex;
		if(el){
			var doc = el.ownerDocument;
			if(doc){
				_onRemoveAttribute(doc,el,attr);
				attr.ownerElement = null;
			}
		}
	}else{
		throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
	}
}
NamedNodeMap.prototype = {
	length:0,
	item:NodeList.prototype.item,
	getNamedItem: function(key) {
//		if(key.indexOf(':')>0 || key == 'xmlns'){
//			return null;
//		}
		//console.log()
		var i = this.length;
		while(i--){
			var attr = this[i];
			//console.log(attr.nodeName,key)
			if(attr.nodeName == key){
				return attr;
			}
		}
	},
	setNamedItem: function(attr) {
		var el = attr.ownerElement;
		if(el && el!=this._ownerElement){
			throw new DOMException(INUSE_ATTRIBUTE_ERR);
		}
		var oldAttr = this.getNamedItem(attr.nodeName);
		_addNamedNode(this._ownerElement,this,attr,oldAttr);
		return oldAttr;
	},
	/* returns Node */
	setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
		var el = attr.ownerElement, oldAttr;
		if(el && el!=this._ownerElement){
			throw new DOMException(INUSE_ATTRIBUTE_ERR);
		}
		oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
		_addNamedNode(this._ownerElement,this,attr,oldAttr);
		return oldAttr;
	},

	/* returns Node */
	removeNamedItem: function(key) {
		var attr = this.getNamedItem(key);
		_removeNamedNode(this._ownerElement,this,attr);
		return attr;
		
		
	},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
	
	//for level2
	removeNamedItemNS:function(namespaceURI,localName){
		var attr = this.getNamedItemNS(namespaceURI,localName);
		_removeNamedNode(this._ownerElement,this,attr);
		return attr;
	},
	getNamedItemNS: function(namespaceURI, localName) {
		var i = this.length;
		while(i--){
			var node = this[i];
			if(node.localName == localName && node.namespaceURI == namespaceURI){
				return node;
			}
		}
		return null;
	}
};
/**
 * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
 */
function DOMImplementation(/* Object */ features) {
	this._features = {};
	if (features) {
		for (var feature in features) {
			 this._features = features[feature];
		}
	}
};

DOMImplementation.prototype = {
	hasFeature: function(/* string */ feature, /* string */ version) {
		var versions = this._features[feature.toLowerCase()];
		if (versions && (!version || version in versions)) {
			return true;
		} else {
			return false;
		}
	},
	// Introduced in DOM Level 2:
	createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
		var doc = new Document();
		doc.implementation = this;
		doc.childNodes = new NodeList();
		doc.doctype = doctype;
		if(doctype){
			doc.appendChild(doctype);
		}
		if(qualifiedName){
			var root = doc.createElementNS(namespaceURI,qualifiedName);
			doc.appendChild(root);
		}
		return doc;
	},
	// Introduced in DOM Level 2:
	createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
		var node = new DocumentType();
		node.name = qualifiedName;
		node.nodeName = qualifiedName;
		node.publicId = publicId;
		node.systemId = systemId;
		// Introduced in DOM Level 2:
		//readonly attribute DOMString        internalSubset;
		
		//TODO:..
		//  readonly attribute NamedNodeMap     entities;
		//  readonly attribute NamedNodeMap     notations;
		return node;
	}
};


/**
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
 */

function Node() {
};

Node.prototype = {
	firstChild : null,
	lastChild : null,
	previousSibling : null,
	nextSibling : null,
	attributes : null,
	parentNode : null,
	childNodes : null,
	ownerDocument : null,
	nodeValue : null,
	namespaceURI : null,
	prefix : null,
	localName : null,
	// Modified in DOM Level 2:
	insertBefore:function(newChild, refChild){//raises 
		return _insertBefore(this,newChild,refChild);
	},
	replaceChild:function(newChild, oldChild){//raises 
		this.insertBefore(newChild,oldChild);
		if(oldChild){
			this.removeChild(oldChild);
		}
	},
	removeChild:function(oldChild){
		return _removeChild(this,oldChild);
	},
	appendChild:function(newChild){
		return this.insertBefore(newChild,null);
	},
	hasChildNodes:function(){
		return this.firstChild != null;
	},
	cloneNode:function(deep){
		return cloneNode(this.ownerDocument||this,this,deep);
	},
	// Modified in DOM Level 2:
	normalize:function(){
		var child = this.firstChild;
		while(child){
			var next = child.nextSibling;
			if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
				this.removeChild(next);
				child.appendData(next.data);
			}else{
				child.normalize();
				child = next;
			}
		}
	},
  	// Introduced in DOM Level 2:
	isSupported:function(feature, version){
		return this.ownerDocument.implementation.hasFeature(feature,version);
	},
    // Introduced in DOM Level 2:
    hasAttributes:function(){
    	return this.attributes.length>0;
    },
    lookupPrefix:function(namespaceURI){
    	var el = this;
    	while(el){
    		var map = el._nsMap;
    		//console.dir(map)
    		if(map){
    			for(var n in map){
    				if(map[n] == namespaceURI){
    					return n;
    				}
    			}
    		}
    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
    	}
    	return null;
    },
    // Introduced in DOM Level 3:
    lookupNamespaceURI:function(prefix){
    	var el = this;
    	while(el){
    		var map = el._nsMap;
    		//console.dir(map)
    		if(map){
    			if(prefix in map){
    				return map[prefix] ;
    			}
    		}
    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
    	}
    	return null;
    },
    // Introduced in DOM Level 3:
    isDefaultNamespace:function(namespaceURI){
    	var prefix = this.lookupPrefix(namespaceURI);
    	return prefix == null;
    }
};


function _xmlEncoder(c){
	return c == '<' && '&lt;' ||
         c == '>' && '&gt;' ||
         c == '&' && '&amp;' ||
         c == '"' && '&quot;' ||
         '&#'+c.charCodeAt()+';'
}


copy(NodeType,Node);
copy(NodeType,Node.prototype);

/**
 * @param callback return true for continue,false for break
 * @return boolean true: break visit;
 */
function _visitNode(node,callback){
	if(callback(node)){
		return true;
	}
	if(node = node.firstChild){
		do{
			if(_visitNode(node,callback)){return true}
        }while(node=node.nextSibling)
    }
}



function Document(){
}
function _onAddAttribute(doc,el,newAttr){
	doc && doc._inc++;
	var ns = newAttr.namespaceURI ;
	if(ns == 'http://www.w3.org/2000/xmlns/'){
		//update namespace
		el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value
	}
}
function _onRemoveAttribute(doc,el,newAttr,remove){
	doc && doc._inc++;
	var ns = newAttr.namespaceURI ;
	if(ns == 'http://www.w3.org/2000/xmlns/'){
		//update namespace
		delete el._nsMap[newAttr.prefix?newAttr.localName:'']
	}
}
function _onUpdateChild(doc,el,newChild){
	if(doc && doc._inc){
		doc._inc++;
		//update childNodes
		var cs = el.childNodes;
		if(newChild){
			cs[cs.length++] = newChild;
		}else{
			//console.log(1)
			var child = el.firstChild;
			var i = 0;
			while(child){
				cs[i++] = child;
				child =child.nextSibling;
			}
			cs.length = i;
		}
	}
}

/**
 * attributes;
 * children;
 * 
 * writeable properties:
 * nodeValue,Attr:value,CharacterData:data
 * prefix
 */
function _removeChild(parentNode,child){
	var previous = child.previousSibling;
	var next = child.nextSibling;
	if(previous){
		previous.nextSibling = next;
	}else{
		parentNode.firstChild = next
	}
	if(next){
		next.previousSibling = previous;
	}else{
		parentNode.lastChild = previous;
	}
	_onUpdateChild(parentNode.ownerDocument,parentNode);
	return child;
}
/**
 * preformance key(refChild == null)
 */
function _insertBefore(parentNode,newChild,nextChild){
	var cp = newChild.parentNode;
	if(cp){
		cp.removeChild(newChild);//remove and update
	}
	if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
		var newFirst = newChild.firstChild;
		if (newFirst == null) {
			return newChild;
		}
		var newLast = newChild.lastChild;
	}else{
		newFirst = newLast = newChild;
	}
	var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;

	newFirst.previousSibling = pre;
	newLast.nextSibling = nextChild;
	
	
	if(pre){
		pre.nextSibling = newFirst;
	}else{
		parentNode.firstChild = newFirst;
	}
	if(nextChild == null){
		parentNode.lastChild = newLast;
	}else{
		nextChild.previousSibling = newLast;
	}
	do{
		newFirst.parentNode = parentNode;
	}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
	_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
	//console.log(parentNode.lastChild.nextSibling == null)
	if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
		newChild.firstChild = newChild.lastChild = null;
	}
	return newChild;
}
function _appendSingleChild(parentNode,newChild){
	var cp = newChild.parentNode;
	if(cp){
		var pre = parentNode.lastChild;
		cp.removeChild(newChild);//remove and update
		var pre = parentNode.lastChild;
	}
	var pre = parentNode.lastChild;
	newChild.parentNode = parentNode;
	newChild.previousSibling = pre;
	newChild.nextSibling = null;
	if(pre){
		pre.nextSibling = newChild;
	}else{
		parentNode.firstChild = newChild;
	}
	parentNode.lastChild = newChild;
	_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
	return newChild;
	//console.log("__aa",parentNode.lastChild.nextSibling == null)
}
Document.prototype = {
	//implementation : null,
	nodeName :  '#document',
	nodeType :  DOCUMENT_NODE,
	doctype :  null,
	documentElement :  null,
	_inc : 1,
	
	insertBefore :  function(newChild, refChild){//raises 
		if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
			var child = newChild.firstChild;
			while(child){
				var next = child.nextSibling;
				this.insertBefore(child,refChild);
				child = next;
			}
			return newChild;
		}
		if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
			this.documentElement = newChild;
		}
		
		return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
	},
	removeChild :  function(oldChild){
		if(this.documentElement == oldChild){
			this.documentElement = null;
		}
		return _removeChild(this,oldChild);
	},
	// Introduced in DOM Level 2:
	importNode : function(importedNode,deep){
		return importNode(this,importedNode,deep);
	},
	// Introduced in DOM Level 2:
	getElementById :	function(id){
		var rtv = null;
		_visitNode(this.documentElement,function(node){
			if(node.nodeType == ELEMENT_NODE){
				if(node.getAttribute('id') == id){
					rtv = node;
					return true;
				}
			}
		})
		return rtv;
	},
	
	//document factory method:
	createElement :	function(tagName){
		var node = new Element();
		node.ownerDocument = this;
		node.nodeName = tagName;
		node.tagName = tagName;
		node.childNodes = new NodeList();
		var attrs	= node.attributes = new NamedNodeMap();
		attrs._ownerElement = node;
		return node;
	},
	createDocumentFragment :	function(){
		var node = new DocumentFragment();
		node.ownerDocument = this;
		node.childNodes = new NodeList();
		return node;
	},
	createTextNode :	function(data){
		var node = new Text();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createComment :	function(data){
		var node = new Comment();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createCDATASection :	function(data){
		var node = new CDATASection();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createProcessingInstruction :	function(target,data){
		var node = new ProcessingInstruction();
		node.ownerDocument = this;
		node.tagName = node.target = target;
		node.nodeValue= node.data = data;
		return node;
	},
	createAttribute :	function(name){
		var node = new Attr();
		node.ownerDocument	= this;
		node.name = name;
		node.nodeName	= name;
		node.localName = name;
		node.specified = true;
		return node;
	},
	createEntityReference :	function(name){
		var node = new EntityReference();
		node.ownerDocument	= this;
		node.nodeName	= name;
		return node;
	},
	// Introduced in DOM Level 2:
	createElementNS :	function(namespaceURI,qualifiedName){
		var node = new Element();
		var pl = qualifiedName.split(':');
		var attrs	= node.attributes = new NamedNodeMap();
		node.childNodes = new NodeList();
		node.ownerDocument = this;
		node.nodeName = qualifiedName;
		node.tagName = qualifiedName;
		node.namespaceURI = namespaceURI;
		if(pl.length == 2){
			node.prefix = pl[0];
			node.localName = pl[1];
		}else{
			//el.prefix = null;
			node.localName = qualifiedName;
		}
		attrs._ownerElement = node;
		return node;
	},
	// Introduced in DOM Level 2:
	createAttributeNS :	function(namespaceURI,qualifiedName){
		var node = new Attr();
		var pl = qualifiedName.split(':');
		node.ownerDocument = this;
		node.nodeName = qualifiedName;
		node.name = qualifiedName;
		node.namespaceURI = namespaceURI;
		node.specified = true;
		if(pl.length == 2){
			node.prefix = pl[0];
			node.localName = pl[1];
		}else{
			//el.prefix = null;
			node.localName = qualifiedName;
		}
		return node;
	}
};
_extends(Document,Node);


function Element() {
	this._nsMap = {};
};
Element.prototype = {
	nodeType : ELEMENT_NODE,
	hasAttribute : function(name){
		return this.getAttributeNode(name)!=null;
	},
	getAttribute : function(name){
		var attr = this.getAttributeNode(name);
		return attr && attr.value || '';
	},
	getAttributeNode : function(name){
		return this.attributes.getNamedItem(name);
	},
	setAttribute : function(name, value){
		var attr = this.ownerDocument.createAttribute(name);
		attr.value = attr.nodeValue = "" + value;
		this.setAttributeNode(attr)
	},
	removeAttribute : function(name){
		var attr = this.getAttributeNode(name)
		attr && this.removeAttributeNode(attr);
	},
	
	//four real opeartion method
	appendChild:function(newChild){
		if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
			return this.insertBefore(newChild,null);
		}else{
			return _appendSingleChild(this,newChild);
		}
	},
	setAttributeNode : function(newAttr){
		return this.attributes.setNamedItem(newAttr);
	},
	setAttributeNodeNS : function(newAttr){
		return this.attributes.setNamedItemNS(newAttr);
	},
	removeAttributeNode : function(oldAttr){
		//console.log(this == oldAttr.ownerElement)
		return this.attributes.removeNamedItem(oldAttr.nodeName);
	},
	//get real attribute name,and remove it by removeAttributeNode
	removeAttributeNS : function(namespaceURI, localName){
		var old = this.getAttributeNodeNS(namespaceURI, localName);
		old && this.removeAttributeNode(old);
	},
	
	hasAttributeNS : function(namespaceURI, localName){
		return this.getAttributeNodeNS(namespaceURI, localName)!=null;
	},
	getAttributeNS : function(namespaceURI, localName){
		var attr = this.getAttributeNodeNS(namespaceURI, localName);
		return attr && attr.value || '';
	},
	setAttributeNS : function(namespaceURI, qualifiedName, value){
		var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
		attr.value = attr.nodeValue = "" + value;
		this.setAttributeNode(attr)
	},
	getAttributeNodeNS : function(namespaceURI, localName){
		return this.attributes.getNamedItemNS(namespaceURI, localName);
	},
	
	getElementsByTagName : function(tagName){
		return new LiveNodeList(this,function(base){
			var ls = [];
			_visitNode(base,function(node){
				if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
					ls.push(node);
				}
			});
			return ls;
		});
	},
	getElementsByTagNameNS : function(namespaceURI, localName){
		return new LiveNodeList(this,function(base){
			var ls = [];
			_visitNode(base,function(node){
				if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
					ls.push(node);
				}
			});
			return ls;
			
		});
	}
};
Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;


_extends(Element,Node);
function Attr() {
};
Attr.prototype.nodeType = ATTRIBUTE_NODE;
_extends(Attr,Node);


function CharacterData() {
};
CharacterData.prototype = {
	data : '',
	substringData : function(offset, count) {
		return this.data.substring(offset, offset+count);
	},
	appendData: function(text) {
		text = this.data+text;
		this.nodeValue = this.data = text;
		this.length = text.length;
	},
	insertData: function(offset,text) {
		this.replaceData(offset,0,text);
	
	},
	appendChild:function(newChild){
		throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
	},
	deleteData: function(offset, count) {
		this.replaceData(offset,count,"");
	},
	replaceData: function(offset, count, text) {
		var start = this.data.substring(0,offset);
		var end = this.data.substring(offset+count);
		text = start + text + end;
		this.nodeValue = this.data = text;
		this.length = text.length;
	}
}
_extends(CharacterData,Node);
function Text() {
};
Text.prototype = {
	nodeName : "#text",
	nodeType : TEXT_NODE,
	splitText : function(offset) {
		var text = this.data;
		var newText = text.substring(offset);
		text = text.substring(0, offset);
		this.data = this.nodeValue = text;
		this.length = text.length;
		var newNode = this.ownerDocument.createTextNode(newText);
		if(this.parentNode){
			this.parentNode.insertBefore(newNode, this.nextSibling);
		}
		return newNode;
	}
}
_extends(Text,CharacterData);
function Comment() {
};
Comment.prototype = {
	nodeName : "#comment",
	nodeType : COMMENT_NODE
}
_extends(Comment,CharacterData);

function CDATASection() {
};
CDATASection.prototype = {
	nodeName : "#cdata-section",
	nodeType : CDATA_SECTION_NODE
}
_extends(CDATASection,CharacterData);


function DocumentType() {
};
DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
_extends(DocumentType,Node);

function Notation() {
};
Notation.prototype.nodeType = NOTATION_NODE;
_extends(Notation,Node);

function Entity() {
};
Entity.prototype.nodeType = ENTITY_NODE;
_extends(Entity,Node);

function EntityReference() {
};
EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
_extends(EntityReference,Node);

function DocumentFragment() {
};
DocumentFragment.prototype.nodeName =	"#document-fragment";
DocumentFragment.prototype.nodeType =	DOCUMENT_FRAGMENT_NODE;
_extends(DocumentFragment,Node);


function ProcessingInstruction() {
}
ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
_extends(ProcessingInstruction,Node);
function XMLSerializer(){}
XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){
	return nodeSerializeToString.call(node,isHtml,nodeFilter);
}
Node.prototype.toString = nodeSerializeToString;
function nodeSerializeToString(isHtml,nodeFilter){
	var buf = [];
	var refNode = this.nodeType == 9?this.documentElement:this;
	var prefix = refNode.prefix;
	var uri = refNode.namespaceURI;
	
	if(uri && prefix == null){
		//console.log(prefix)
		var prefix = refNode.lookupPrefix(uri);
		if(prefix == null){
			//isHTML = true;
			var visibleNamespaces=[
			{namespace:uri,prefix:null}
			//{namespace:uri,prefix:''}
			]
		}
	}
	serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
	//console.log('###',this.nodeType,uri,prefix,buf.join(''))
	return buf.join('');
}
function needNamespaceDefine(node,isHTML, visibleNamespaces) {
	var prefix = node.prefix||'';
	var uri = node.namespaceURI;
	if (!prefix && !uri){
		return false;
	}
	if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
		|| uri == 'http://www.w3.org/2000/xmlns/'){
		return false;
	}
	
	var i = visibleNamespaces.length 
	//console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
	while (i--) {
		var ns = visibleNamespaces[i];
		// get namespace prefix
		//console.log(node.nodeType,node.tagName,ns.prefix,prefix)
		if (ns.prefix == prefix){
			return ns.namespace != uri;
		}
	}
	//console.log(isHTML,uri,prefix=='')
	//if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
	//	return false;
	//}
	//node.flag = '11111'
	//console.error(3,true,node.flag,node.prefix,node.namespaceURI)
	return true;
}
function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
	if(nodeFilter){
		node = nodeFilter(node);
		if(node){
			if(typeof node == 'string'){
				buf.push(node);
				return;
			}
		}else{
			return;
		}
		//buf.sort.apply(attrs, attributeSorter);
	}
	switch(node.nodeType){
	case ELEMENT_NODE:
		if (!visibleNamespaces) visibleNamespaces = [];
		var startVisibleNamespaces = visibleNamespaces.length;
		var attrs = node.attributes;
		var len = attrs.length;
		var child = node.firstChild;
		var nodeName = node.tagName;
		
		isHTML =  (htmlns === node.namespaceURI) ||isHTML 
		buf.push('<',nodeName);
		
		
		
		for(var i=0;i<len;i++){
			// add namespaces for attributes
			var attr = attrs.item(i);
			if (attr.prefix == 'xmlns') {
				visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
			}else if(attr.nodeName == 'xmlns'){
				visibleNamespaces.push({ prefix: '', namespace: attr.value });
			}
		}
		for(var i=0;i<len;i++){
			var attr = attrs.item(i);
			if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
				var prefix = attr.prefix||'';
				var uri = attr.namespaceURI;
				var ns = prefix ? ' xmlns:' + prefix : " xmlns";
				buf.push(ns, '="' , uri , '"');
				visibleNamespaces.push({ prefix: prefix, namespace:uri });
			}
			serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
		}
		// add namespace for current node		
		if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
			var prefix = node.prefix||'';
			var uri = node.namespaceURI;
			var ns = prefix ? ' xmlns:' + prefix : " xmlns";
			buf.push(ns, '="' , uri , '"');
			visibleNamespaces.push({ prefix: prefix, namespace:uri });
		}
		
		if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
			buf.push('>');
			//if is cdata child node
			if(isHTML && /^script$/i.test(nodeName)){
				while(child){
					if(child.data){
						buf.push(child.data);
					}else{
						serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
					}
					child = child.nextSibling;
				}
			}else
			{
				while(child){
					serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
					child = child.nextSibling;
				}
			}
			buf.push('</',nodeName,'>');
		}else{
			buf.push('/>');
		}
		// remove added visible namespaces
		//visibleNamespaces.length = startVisibleNamespaces;
		return;
	case DOCUMENT_NODE:
	case DOCUMENT_FRAGMENT_NODE:
		var child = node.firstChild;
		while(child){
			serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
			child = child.nextSibling;
		}
		return;
	case ATTRIBUTE_NODE:
		return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
	case TEXT_NODE:
		return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
	case CDATA_SECTION_NODE:
		return buf.push( '<![CDATA[',node.data,']]>');
	case COMMENT_NODE:
		return buf.push( "<!--",node.data,"-->");
	case DOCUMENT_TYPE_NODE:
		var pubid = node.publicId;
		var sysid = node.systemId;
		buf.push('<!DOCTYPE ',node.name);
		if(pubid){
			buf.push(' PUBLIC "',pubid);
			if (sysid && sysid!='.') {
				buf.push( '" "',sysid);
			}
			buf.push('">');
		}else if(sysid && sysid!='.'){
			buf.push(' SYSTEM "',sysid,'">');
		}else{
			var sub = node.internalSubset;
			if(sub){
				buf.push(" [",sub,"]");
			}
			buf.push(">");
		}
		return;
	case PROCESSING_INSTRUCTION_NODE:
		return buf.push( "<?",node.target," ",node.data,"?>");
	case ENTITY_REFERENCE_NODE:
		return buf.push( '&',node.nodeName,';');
	//case ENTITY_NODE:
	//case NOTATION_NODE:
	default:
		buf.push('??',node.nodeName);
	}
}
function importNode(doc,node,deep){
	var node2;
	switch (node.nodeType) {
	case ELEMENT_NODE:
		node2 = node.cloneNode(false);
		node2.ownerDocument = doc;
		//var attrs = node2.attributes;
		//var len = attrs.length;
		//for(var i=0;i<len;i++){
			//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
		//}
	case DOCUMENT_FRAGMENT_NODE:
		break;
	case ATTRIBUTE_NODE:
		deep = true;
		break;
	//case ENTITY_REFERENCE_NODE:
	//case PROCESSING_INSTRUCTION_NODE:
	////case TEXT_NODE:
	//case CDATA_SECTION_NODE:
	//case COMMENT_NODE:
	//	deep = false;
	//	break;
	//case DOCUMENT_NODE:
	//case DOCUMENT_TYPE_NODE:
	//cannot be imported.
	//case ENTITY_NODE:
	//case NOTATION_NODEï¼š
	//can not hit in level3
	//default:throw e;
	}
	if(!node2){
		node2 = node.cloneNode(false);//false
	}
	node2.ownerDocument = doc;
	node2.parentNode = null;
	if(deep){
		var child = node.firstChild;
		while(child){
			node2.appendChild(importNode(doc,child,deep));
			child = child.nextSibling;
		}
	}
	return node2;
}
//
//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
//					attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
function cloneNode(doc,node,deep){
	var node2 = new node.constructor();
	for(var n in node){
		var v = node[n];
		if(typeof v != 'object' ){
			if(v != node2[n]){
				node2[n] = v;
			}
		}
	}
	if(node.childNodes){
		node2.childNodes = new NodeList();
	}
	node2.ownerDocument = doc;
	switch (node2.nodeType) {
	case ELEMENT_NODE:
		var attrs	= node.attributes;
		var attrs2	= node2.attributes = new NamedNodeMap();
		var len = attrs.length
		attrs2._ownerElement = node2;
		for(var i=0;i<len;i++){
			node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
		}
		break;;
	case ATTRIBUTE_NODE:
		deep = true;
	}
	if(deep){
		var child = node.firstChild;
		while(child){
			node2.appendChild(cloneNode(doc,child,deep));
			child = child.nextSibling;
		}
	}
	return node2;
}

function __set__(object,key,value){
	object[key] = value
}
//do dynamic
try{
	if(Object.defineProperty){
		Object.defineProperty(LiveNodeList.prototype,'length',{
			get:function(){
				_updateLiveList(this);
				return this.$$length;
			}
		});
		Object.defineProperty(Node.prototype,'textContent',{
			get:function(){
				return getTextContent(this);
			},
			set:function(data){
				switch(this.nodeType){
				case ELEMENT_NODE:
				case DOCUMENT_FRAGMENT_NODE:
					while(this.firstChild){
						this.removeChild(this.firstChild);
					}
					if(data || String(data)){
						this.appendChild(this.ownerDocument.createTextNode(data));
					}
					break;
				default:
					//TODO:
					this.data = data;
					this.value = data;
					this.nodeValue = data;
				}
			}
		})
		
		function getTextContent(node){
			switch(node.nodeType){
			case ELEMENT_NODE:
			case DOCUMENT_FRAGMENT_NODE:
				var buf = [];
				node = node.firstChild;
				while(node){
					if(node.nodeType!==7 && node.nodeType !==8){
						buf.push(getTextContent(node));
					}
					node = node.nextSibling;
				}
				return buf.join('');
			default:
				return node.nodeValue;
			}
		}
		__set__ = function(object,key,value){
			//console.log(value)
			object['$$'+key] = value
		}
	}
}catch(e){//ie8
}

//if(typeof require == 'function'){
	exports.DOMImplementation = DOMImplementation;
	exports.XMLSerializer = XMLSerializer;
//}

},{}],7:[function(require,module,exports){
//[4]   	NameStartChar	   ::=   	":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
//[4a]   	NameChar	   ::=   	NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
//[5]   	Name	   ::=   	NameStartChar (NameChar)*
var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF
var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')

//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
var S_TAG = 0;//tag name offerring
var S_ATTR = 1;//attr name offerring 
var S_ATTR_SPACE=2;//attr name end and space offer
var S_EQ = 3;//=space?
var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
var S_ATTR_END = 5;//attr value end and no space(quot end)
var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
var S_TAG_CLOSE = 7;//closed el<el />

function XMLReader(){
	
}

XMLReader.prototype = {
	parse:function(source,defaultNSMap,entityMap){
		var domBuilder = this.domBuilder;
		domBuilder.startDocument();
		_copy(defaultNSMap ,defaultNSMap = {})
		parse(source,defaultNSMap,entityMap,
				domBuilder,this.errorHandler);
		domBuilder.endDocument();
	}
}
function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
	function fixedFromCharCode(code) {
		// String.prototype.fromCharCode does not supports
		// > 2 bytes unicode chars directly
		if (code > 0xffff) {
			code -= 0x10000;
			var surrogate1 = 0xd800 + (code >> 10)
				, surrogate2 = 0xdc00 + (code & 0x3ff);

			return String.fromCharCode(surrogate1, surrogate2);
		} else {
			return String.fromCharCode(code);
		}
	}
	function entityReplacer(a){
		var k = a.slice(1,-1);
		if(k in entityMap){
			return entityMap[k]; 
		}else if(k.charAt(0) === '#'){
			return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
		}else{
			errorHandler.error('entity not found:'+a);
			return a;
		}
	}
	function appendText(end){//has some bugs
		if(end>start){
			var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
			locator&&position(start);
			domBuilder.characters(xt,0,end-start);
			start = end
		}
	}
	function position(p,m){
		while(p>=lineEnd && (m = linePattern.exec(source))){
			lineStart = m.index;
			lineEnd = lineStart + m[0].length;
			locator.lineNumber++;
			//console.log('line++:',locator,startPos,endPos)
		}
		locator.columnNumber = p-lineStart+1;
	}
	var lineStart = 0;
	var lineEnd = 0;
	var linePattern = /.*(?:\r\n?|\n)|.*$/g
	var locator = domBuilder.locator;
	
	var parseStack = [{currentNSMap:defaultNSMapCopy}]
	var closeMap = {};
	var start = 0;
	while(true){
		try{
			var tagStart = source.indexOf('<',start);
			if(tagStart<0){
				if(!source.substr(start).match(/^\s*$/)){
					var doc = domBuilder.doc;
	    			var text = doc.createTextNode(source.substr(start));
	    			doc.appendChild(text);
	    			domBuilder.currentElement = text;
				}
				return;
			}
			if(tagStart>start){
				appendText(tagStart);
			}
			switch(source.charAt(tagStart+1)){
			case '/':
				var end = source.indexOf('>',tagStart+3);
				var tagName = source.substring(tagStart+2,end);
				var config = parseStack.pop();
				if(end<0){
					
	        		tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
	        		//console.error('#@@@@@@'+tagName)
	        		errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
	        		end = tagStart+1+tagName.length;
	        	}else if(tagName.match(/\s</)){
	        		tagName = tagName.replace(/[\s<].*/,'');
	        		errorHandler.error("end tag name: "+tagName+' maybe not complete');
	        		end = tagStart+1+tagName.length;
				}
				//console.error(parseStack.length,parseStack)
				//console.error(config);
				var localNSMap = config.localNSMap;
				var endMatch = config.tagName == tagName;
				var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()
		        if(endIgnoreCaseMach){
		        	domBuilder.endElement(config.uri,config.localName,tagName);
					if(localNSMap){
						for(var prefix in localNSMap){
							domBuilder.endPrefixMapping(prefix) ;
						}
					}
					if(!endMatch){
		            	errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
					}
		        }else{
		        	parseStack.push(config)
		        }
				
				end++;
				break;
				// end elment
			case '?':// <?...?>
				locator&&position(tagStart);
				end = parseInstruction(source,tagStart,domBuilder);
				break;
			case '!':// <!doctype,<![CDATA,<!--
				locator&&position(tagStart);
				end = parseDCC(source,tagStart,domBuilder,errorHandler);
				break;
			default:
				locator&&position(tagStart);
				var el = new ElementAttributes();
				var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
				//elStartEnd
				var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
				var len = el.length;
				
				
				if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
					el.closed = true;
					if(!entityMap.nbsp){
						errorHandler.warning('unclosed xml attribute');
					}
				}
				if(locator && len){
					var locator2 = copyLocator(locator,{});
					//try{//attribute position fixed
					for(var i = 0;i<len;i++){
						var a = el[i];
						position(a.offset);
						a.locator = copyLocator(locator,{});
					}
					//}catch(e){console.error('@@@@@'+e)}
					domBuilder.locator = locator2
					if(appendElement(el,domBuilder,currentNSMap)){
						parseStack.push(el)
					}
					domBuilder.locator = locator;
				}else{
					if(appendElement(el,domBuilder,currentNSMap)){
						parseStack.push(el)
					}
				}
				
				
				
				if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
					end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)
				}else{
					end++;
				}
			}
		}catch(e){
			errorHandler.error('element parse error: '+e)
			//errorHandler.error('element parse error: '+e);
			end = -1;
			//throw e;
		}
		if(end>start){
			start = end;
		}else{
			//TODO: è¿™é‡Œæœ‰å�¯èƒ½saxå›žé€€ï¼Œæœ‰ä½�ç½®é”™è¯¯é£Žé™©
			appendText(Math.max(tagStart,start)+1);
		}
	}
}
function copyLocator(f,t){
	t.lineNumber = f.lineNumber;
	t.columnNumber = f.columnNumber;
	return t;
}

/**
 * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
 * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
 */
function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
	var attrName;
	var value;
	var p = ++start;
	var s = S_TAG;//status
	while(true){
		var c = source.charAt(p);
		switch(c){
		case '=':
			if(s === S_ATTR){//attrName
				attrName = source.slice(start,p);
				s = S_EQ;
			}else if(s === S_ATTR_SPACE){
				s = S_EQ;
			}else{
				//fatalError: equal must after attrName or space after attrName
				throw new Error('attribute equal must after attrName');
			}
			break;
		case '\'':
		case '"':
			if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
				){//equal
				if(s === S_ATTR){
					errorHandler.warning('attribute value must after "="')
					attrName = source.slice(start,p)
				}
				start = p+1;
				p = source.indexOf(c,start)
				if(p>0){
					value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
					el.add(attrName,value,start-1);
					s = S_ATTR_END;
				}else{
					//fatalError: no end quot match
					throw new Error('attribute value no end \''+c+'\' match');
				}
			}else if(s == S_ATTR_NOQUOT_VALUE){
				value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
				//console.log(attrName,value,start,p)
				el.add(attrName,value,start);
				//console.dir(el)
				errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
				start = p+1;
				s = S_ATTR_END
			}else{
				//fatalError: no equal before
				throw new Error('attribute value must after "="');
			}
			break;
		case '/':
			switch(s){
			case S_TAG:
				el.setTagName(source.slice(start,p));
			case S_ATTR_END:
			case S_TAG_SPACE:
			case S_TAG_CLOSE:
				s =S_TAG_CLOSE;
				el.closed = true;
			case S_ATTR_NOQUOT_VALUE:
			case S_ATTR:
			case S_ATTR_SPACE:
				break;
			//case S_EQ:
			default:
				throw new Error("attribute invalid close char('/')")
			}
			break;
		case ''://end document
			//throw new Error('unexpected end of input')
			errorHandler.error('unexpected end of input');
			if(s == S_TAG){
				el.setTagName(source.slice(start,p));
			}
			return p;
		case '>':
			switch(s){
			case S_TAG:
				el.setTagName(source.slice(start,p));
			case S_ATTR_END:
			case S_TAG_SPACE:
			case S_TAG_CLOSE:
				break;//normal
			case S_ATTR_NOQUOT_VALUE://Compatible state
			case S_ATTR:
				value = source.slice(start,p);
				if(value.slice(-1) === '/'){
					el.closed  = true;
					value = value.slice(0,-1)
				}
			case S_ATTR_SPACE:
				if(s === S_ATTR_SPACE){
					value = attrName;
				}
				if(s == S_ATTR_NOQUOT_VALUE){
					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
					el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start)
				}else{
					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
						errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
					}
					el.add(value,value,start)
				}
				break;
			case S_EQ:
				throw new Error('attribute value missed!!');
			}
//			console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
			return p;
		/*xml space '\x20' | #x9 | #xD | #xA; */
		case '\u0080':
			c = ' ';
		default:
			if(c<= ' '){//space
				switch(s){
				case S_TAG:
					el.setTagName(source.slice(start,p));//tagName
					s = S_TAG_SPACE;
					break;
				case S_ATTR:
					attrName = source.slice(start,p)
					s = S_ATTR_SPACE;
					break;
				case S_ATTR_NOQUOT_VALUE:
					var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
					el.add(attrName,value,start)
				case S_ATTR_END:
					s = S_TAG_SPACE;
					break;
				//case S_TAG_SPACE:
				//case S_EQ:
				//case S_ATTR_SPACE:
				//	void();break;
				//case S_TAG_CLOSE:
					//ignore warning
				}
			}else{//not space
//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
				switch(s){
				//case S_TAG:void();break;
				//case S_ATTR:void();break;
				//case S_ATTR_NOQUOT_VALUE:void();break;
				case S_ATTR_SPACE:
					var tagName =  el.tagName;
					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
						errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!')
					}
					el.add(attrName,attrName,start);
					start = p;
					s = S_ATTR;
					break;
				case S_ATTR_END:
					errorHandler.warning('attribute space is required"'+attrName+'"!!')
				case S_TAG_SPACE:
					s = S_ATTR;
					start = p;
					break;
				case S_EQ:
					s = S_ATTR_NOQUOT_VALUE;
					start = p;
					break;
				case S_TAG_CLOSE:
					throw new Error("elements closed character '/' and '>' must be connected to");
				}
			}
		}//end outer switch
		//console.log('p++',p)
		p++;
	}
}
/**
 * @return true if has new namespace define
 */
function appendElement(el,domBuilder,currentNSMap){
	var tagName = el.tagName;
	var localNSMap = null;
	//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
	var i = el.length;
	while(i--){
		var a = el[i];
		var qName = a.qName;
		var value = a.value;
		var nsp = qName.indexOf(':');
		if(nsp>0){
			var prefix = a.prefix = qName.slice(0,nsp);
			var localName = qName.slice(nsp+1);
			var nsPrefix = prefix === 'xmlns' && localName
		}else{
			localName = qName;
			prefix = null
			nsPrefix = qName === 'xmlns' && ''
		}
		//can not set prefix,because prefix !== ''
		a.localName = localName ;
		//prefix == null for no ns prefix attribute 
		if(nsPrefix !== false){//hack!!
			if(localNSMap == null){
				localNSMap = {}
				//console.log(currentNSMap,0)
				_copy(currentNSMap,currentNSMap={})
				//console.log(currentNSMap,1)
			}
			currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
			a.uri = 'http://www.w3.org/2000/xmlns/'
			domBuilder.startPrefixMapping(nsPrefix, value) 
		}
	}
	var i = el.length;
	while(i--){
		a = el[i];
		var prefix = a.prefix;
		if(prefix){//no prefix attribute has no namespace
			if(prefix === 'xml'){
				a.uri = 'http://www.w3.org/XML/1998/namespace';
			}if(prefix !== 'xmlns'){
				a.uri = currentNSMap[prefix || '']
				
				//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
			}
		}
	}
	var nsp = tagName.indexOf(':');
	if(nsp>0){
		prefix = el.prefix = tagName.slice(0,nsp);
		localName = el.localName = tagName.slice(nsp+1);
	}else{
		prefix = null;//important!!
		localName = el.localName = tagName;
	}
	//no prefix element has default namespace
	var ns = el.uri = currentNSMap[prefix || ''];
	domBuilder.startElement(ns,localName,tagName,el);
	//endPrefixMapping and startPrefixMapping have not any help for dom builder
	//localNSMap = null
	if(el.closed){
		domBuilder.endElement(ns,localName,tagName);
		if(localNSMap){
			for(prefix in localNSMap){
				domBuilder.endPrefixMapping(prefix) 
			}
		}
	}else{
		el.currentNSMap = currentNSMap;
		el.localNSMap = localNSMap;
		//parseStack.push(el);
		return true;
	}
}
function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
	if(/^(?:script|textarea)$/i.test(tagName)){
		var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
		var text = source.substring(elStartEnd+1,elEndStart);
		if(/[&<]/.test(text)){
			if(/^script$/i.test(tagName)){
				//if(!/\]\]>/.test(text)){
					//lexHandler.startCDATA();
					domBuilder.characters(text,0,text.length);
					//lexHandler.endCDATA();
					return elEndStart;
				//}
			}//}else{//text area
				text = text.replace(/&#?\w+;/g,entityReplacer);
				domBuilder.characters(text,0,text.length);
				return elEndStart;
			//}
			
		}
	}
	return elStartEnd+1;
}
function fixSelfClosed(source,elStartEnd,tagName,closeMap){
	//if(tagName in closeMap){
	var pos = closeMap[tagName];
	if(pos == null){
		//console.log(tagName)
		pos =  source.lastIndexOf('</'+tagName+'>')
		if(pos<elStartEnd){//å¿˜è®°é—­å�ˆ
			pos = source.lastIndexOf('</'+tagName)
		}
		closeMap[tagName] =pos
	}
	return pos<elStartEnd;
	//} 
}
function _copy(source,target){
	for(var n in source){target[n] = source[n]}
}
function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
	var next= source.charAt(start+2)
	switch(next){
	case '-':
		if(source.charAt(start + 3) === '-'){
			var end = source.indexOf('-->',start+4);
			//append comment source.substring(4,end)//<!--
			if(end>start){
				domBuilder.comment(source,start+4,end-start-4);
				return end+3;
			}else{
				errorHandler.error("Unclosed comment");
				return -1;
			}
		}else{
			//error
			return -1;
		}
	default:
		if(source.substr(start+3,6) == 'CDATA['){
			var end = source.indexOf(']]>',start+9);
			domBuilder.startCDATA();
			domBuilder.characters(source,start+9,end-start-9);
			domBuilder.endCDATA() 
			return end+3;
		}
		//<!DOCTYPE
		//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
		var matchs = split(source,start);
		var len = matchs.length;
		if(len>1 && /!doctype/i.test(matchs[0][0])){
			var name = matchs[1][0];
			var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0]
			var sysid = len>4 && matchs[4][0];
			var lastMatch = matchs[len-1]
			domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
					sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
			domBuilder.endDTD();
			
			return lastMatch.index+lastMatch[0].length
		}
	}
	return -1;
}



function parseInstruction(source,start,domBuilder){
	var end = source.indexOf('?>',start);
	if(end){
		var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
		if(match){
			var len = match[0].length;
			domBuilder.processingInstruction(match[1], match[2]) ;
			return end+2;
		}else{//error
			return -1;
		}
	}
	return -1;
}

/**
 * @param source
 */
function ElementAttributes(source){
	
}
ElementAttributes.prototype = {
	setTagName:function(tagName){
		if(!tagNamePattern.test(tagName)){
			throw new Error('invalid tagName:'+tagName)
		}
		this.tagName = tagName
	},
	add:function(qName,value,offset){
		if(!tagNamePattern.test(qName)){
			throw new Error('invalid attribute:'+qName)
		}
		this[this.length++] = {qName:qName,value:value,offset:offset}
	},
	length:0,
	getLocalName:function(i){return this[i].localName},
	getLocator:function(i){return this[i].locator},
	getQName:function(i){return this[i].qName},
	getURI:function(i){return this[i].uri},
	getValue:function(i){return this[i].value}
//	,getIndex:function(uri, localName)){
//		if(localName){
//			
//		}else{
//			var qName = uri
//		}
//	},
//	getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
//	getType:function(uri,localName){}
//	getType:function(i){},
}




function _set_proto_(thiz,parent){
	thiz.__proto__ = parent;
	return thiz;
}
if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
	_set_proto_ = function(thiz,parent){
		function p(){};
		p.prototype = parent;
		p = new p();
		for(parent in thiz){
			p[parent] = thiz[parent];
		}
		return p;
	}
}

function split(source,start){
	var match;
	var buf = [];
	var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
	reg.lastIndex = start;
	reg.exec(source);//skip <
	while(match = reg.exec(source)){
		buf.push(match);
		if(match[1])return buf;
	}
}

exports.XMLReader = XMLReader;


},{}]},{},[1])(1)
});
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.plist = f()}})(function(){var define,module,exports;return (function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(require,module,exports){
/**
 * Parser functions.
 */

var parserFunctions = require('./lib/parse');
Object.keys(parserFunctions).forEach(function (k) { exports[k] = parserFunctions[k]; });

/**
 * Builder functions.
 */

var builderFunctions = require('./lib/build');
Object.keys(builderFunctions).forEach(function (k) { exports[k] = builderFunctions[k]; });

},{"./lib/build":2,"./lib/parse":3}],2:[function(require,module,exports){
(function (Buffer){
/**
 * Module dependencies.
 */

var base64 = require('base64-js');
var xmlbuilder = require('xmlbuilder');

/**
 * Module exports.
 */

exports.build = build;

/**
 * Accepts a `Date` instance and returns an ISO date string.
 *
 * @param {Date} d - Date instance to serialize
 * @returns {String} ISO date string representation of `d`
 * @api private
 */

function ISODateString(d){
  function pad(n){
    return n < 10 ? '0' + n : n;
  }
  return d.getUTCFullYear()+'-'
    + pad(d.getUTCMonth()+1)+'-'
    + pad(d.getUTCDate())+'T'
    + pad(d.getUTCHours())+':'
    + pad(d.getUTCMinutes())+':'
    + pad(d.getUTCSeconds())+'Z';
}

/**
 * Returns the internal "type" of `obj` via the
 * `Object.prototype.toString()` trick.
 *
 * @param {Mixed} obj - any value
 * @returns {String} the internal "type" name
 * @api private
 */

var toString = Object.prototype.toString;
function type (obj) {
  var m = toString.call(obj).match(/\[object (.*)\]/);
  return m ? m[1] : m;
}

/**
 * Generate an XML plist string from the input object `obj`.
 *
 * @param {Object} obj - the object to convert
 * @param {Object} [opts] - optional options object
 * @returns {String} converted plist XML string
 * @api public
 */

function build (obj, opts) {
  var XMLHDR = {
    version: '1.0',
    encoding: 'UTF-8'
  };

  var XMLDTD = {
    pubid: '-//Apple//DTD PLIST 1.0//EN',
    sysid: 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'
  };

  var doc = xmlbuilder.create('plist');

  doc.dec(XMLHDR.version, XMLHDR.encoding, XMLHDR.standalone);
  doc.dtd(XMLDTD.pubid, XMLDTD.sysid);
  doc.att('version', '1.0');

  walk_obj(obj, doc);

  if (!opts) opts = {};
  // default `pretty` to `true`
  opts.pretty = opts.pretty !== false;
  return doc.end(opts);
}

/**
 * depth first, recursive traversal of a javascript object. when complete,
 * next_child contains a reference to the build XML object.
 *
 * @api private
 */

function walk_obj(next, next_child) {
  var tag_type, i, prop;
  var name = type(next);

  if ('Undefined' == name) {
    return;
  } else if (Array.isArray(next)) {
    next_child = next_child.ele('array');
    for (i = 0; i < next.length; i++) {
      walk_obj(next[i], next_child);
    }

  } else if (Buffer.isBuffer(next)) {
    next_child.ele('data').raw(next.toString('base64'));

  } else if ('Object' == name) {
    next_child = next_child.ele('dict');
    for (prop in next) {
      if (next.hasOwnProperty(prop)) {
        next_child.ele('key').txt(prop);
        walk_obj(next[prop], next_child);
      }
    }

  } else if ('Number' == name) {
    // detect if this is an integer or real
    // TODO: add an ability to force one way or another via a "cast"
    tag_type = (next % 1 === 0) ? 'integer' : 'real';
    next_child.ele(tag_type).txt(next.toString());

  } else if ('Date' == name) {
    next_child.ele('date').txt(ISODateString(new Date(next)));

  } else if ('Boolean' == name) {
    next_child.ele(next ? 'true' : 'false');

  } else if ('String' == name) {
    next_child.ele('string').txt(next);

  } else if ('ArrayBuffer' == name) {
    next_child.ele('data').raw(base64.fromByteArray(next));

  } else if (next && next.buffer && 'ArrayBuffer' == type(next.buffer)) {
    // a typed array
    next_child.ele('data').raw(base64.fromByteArray(new Uint8Array(next.buffer), next_child));

  }
}

}).call(this,{"isBuffer":require("../node_modules/is-buffer/index.js")})
},{"../node_modules/is-buffer/index.js":7,"base64-js":4,"xmlbuilder":29}],3:[function(require,module,exports){
(function (Buffer){
/**
 * Module dependencies.
 */

var DOMParser = require('xmldom').DOMParser;

/**
 * Module exports.
 */

exports.parse = parse;

var TEXT_NODE = 3;
var CDATA_NODE = 4;
var COMMENT_NODE = 8;


/**
 * We ignore raw text (usually whitespace), <!-- xml comments -->,
 * and raw CDATA nodes.
 *
 * @param {Element} node
 * @returns {Boolean}
 * @api private
 */

function shouldIgnoreNode (node) {
  return node.nodeType === TEXT_NODE
    || node.nodeType === COMMENT_NODE
    || node.nodeType === CDATA_NODE;
}

/**
 * Check if the node is empty. Some plist file has such node:
 * <key />
 * this node shoud be ignored.
 *
 * @see https://github.com/TooTallNate/plist.js/issues/66
 * @param {Element} node
 * @returns {Boolean}
 * @api private
 */
function isEmptyNode(node){
  if(!node.childNodes || node.childNodes.length === 0) {
    return true;
  } else {
    return false;
  }
}

function invariant(test, message) {
  if (!test) {
    throw new Error(message);
  }
}

/**
 * Parses a Plist XML string. Returns an Object.
 *
 * @param {String} xml - the XML String to decode
 * @returns {Mixed} the decoded value from the Plist XML
 * @api public
 */

function parse (xml) {
  var doc = new DOMParser().parseFromString(xml);
  invariant(
    doc.documentElement.nodeName === 'plist',
    'malformed document. First element should be <plist>'
  );
  var plist = parsePlistXML(doc.documentElement);

  // the root <plist> node gets interpreted as an Array,
  // so pull out the inner data first
  if (plist.length == 1) plist = plist[0];

  return plist;
}

/**
 * Convert an XML based plist document into a JSON representation.
 *
 * @param {Object} xml_node - current XML node in the plist
 * @returns {Mixed} built up JSON object
 * @api private
 */

function parsePlistXML (node) {
  var i, new_obj, key, val, new_arr, res, counter, type;

  if (!node)
    return null;

  if (node.nodeName === 'plist') {
    new_arr = [];
    if (isEmptyNode(node)) {
      return new_arr;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (!shouldIgnoreNode(node.childNodes[i])) {
        new_arr.push( parsePlistXML(node.childNodes[i]));
      }
    }
    return new_arr;
  } else if (node.nodeName === 'dict') {
    new_obj = {};
    key = null;
    counter = 0;
    if (isEmptyNode(node)) {
      return new_obj;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (shouldIgnoreNode(node.childNodes[i])) continue;
      if (counter % 2 === 0) {
        invariant(
          node.childNodes[i].nodeName === 'key',
          'Missing key while parsing <dict/>.'
        );
        key = parsePlistXML(node.childNodes[i]);
      } else {
        invariant(
          node.childNodes[i].nodeName !== 'key',
          'Unexpected key "'
            + parsePlistXML(node.childNodes[i])
            + '" while parsing <dict/>.'
        );
        new_obj[key] = parsePlistXML(node.childNodes[i]);
      }
      counter += 1;
    }
    if (counter % 2 === 1) {
      throw new Error('Missing value for "' + key + '" while parsing <dict/>');
    }
    return new_obj;

  } else if (node.nodeName === 'array') {
    new_arr = [];
    if (isEmptyNode(node)) {
      return new_arr;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (!shouldIgnoreNode(node.childNodes[i])) {
        res = parsePlistXML(node.childNodes[i]);
        if (null != res) new_arr.push(res);
      }
    }
    return new_arr;

  } else if (node.nodeName === '#text') {
    // TODO: what should we do with text types? (CDATA sections)

  } else if (node.nodeName === 'key') {
    if (isEmptyNode(node)) {
      return '';
    }
    return node.childNodes[0].nodeValue;
  } else if (node.nodeName === 'string') {
    res = '';
    if (isEmptyNode(node)) {
      return res;
    }
    for (i=0; i < node.childNodes.length; i++) {
      var type = node.childNodes[i].nodeType;
      if (type === TEXT_NODE || type === CDATA_NODE) {
        res += node.childNodes[i].nodeValue;
      }
    }
    return res;

  } else if (node.nodeName === 'integer') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as integer.'
    );
    return parseInt(node.childNodes[0].nodeValue, 10);

  } else if (node.nodeName === 'real') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as real.'
    );
    res = '';
    for (i=0; i < node.childNodes.length; i++) {
      if (node.childNodes[i].nodeType === TEXT_NODE) {
        res += node.childNodes[i].nodeValue;
      }
    }
    return parseFloat(res);

  } else if (node.nodeName === 'data') {
    res = '';
    if (isEmptyNode(node)) {
      return Buffer.from(res, 'base64');
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (node.childNodes[i].nodeType === TEXT_NODE) {
        res += node.childNodes[i].nodeValue.replace(/\s+/g, '');
      }
    }
    return Buffer.from(res, 'base64');

  } else if (node.nodeName === 'date') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as Date.'
    )
    return new Date(node.childNodes[0].nodeValue);

  } else if (node.nodeName === 'true') {
    return true;

  } else if (node.nodeName === 'false') {
    return false;
  }
}

}).call(this,require("buffer").Buffer)
},{"buffer":5,"xmldom":30}],4:[function(require,module,exports){
'use strict'

exports.byteLength = byteLength
exports.toByteArray = toByteArray
exports.fromByteArray = fromByteArray

var lookup = []
var revLookup = []
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array

var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, len = code.length; i < len; ++i) {
  lookup[i] = code[i]
  revLookup[code.charCodeAt(i)] = i
}

// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
revLookup['-'.charCodeAt(0)] = 62
revLookup['_'.charCodeAt(0)] = 63

function placeHoldersCount (b64) {
  var len = b64.length
  if (len % 4 > 0) {
    throw new Error('Invalid string. Length must be a multiple of 4')
  }

  // the number of equal signs (place holders)
  // if there are two placeholders, than the two characters before it
  // represent one byte
  // if there is only one, then the three characters before it represent 2 bytes
  // this is just a cheap hack to not do indexOf twice
  return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
}

function byteLength (b64) {
  // base64 is 4/3 + up to two characters of the original data
  return (b64.length * 3 / 4) - placeHoldersCount(b64)
}

function toByteArray (b64) {
  var i, l, tmp, placeHolders, arr
  var len = b64.length
  placeHolders = placeHoldersCount(b64)

  arr = new Arr((len * 3 / 4) - placeHolders)

  // if there are placeholders, only get up to the last complete 4 chars
  l = placeHolders > 0 ? len - 4 : len

  var L = 0

  for (i = 0; i < l; i += 4) {
    tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
    arr[L++] = (tmp >> 16) & 0xFF
    arr[L++] = (tmp >> 8) & 0xFF
    arr[L++] = tmp & 0xFF
  }

  if (placeHolders === 2) {
    tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
    arr[L++] = tmp & 0xFF
  } else if (placeHolders === 1) {
    tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
    arr[L++] = (tmp >> 8) & 0xFF
    arr[L++] = tmp & 0xFF
  }

  return arr
}

function tripletToBase64 (num) {
  return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
}

function encodeChunk (uint8, start, end) {
  var tmp
  var output = []
  for (var i = start; i < end; i += 3) {
    tmp = ((uint8[i] << 16) & 0xFF0000) + ((uint8[i + 1] << 8) & 0xFF00) + (uint8[i + 2] & 0xFF)
    output.push(tripletToBase64(tmp))
  }
  return output.join('')
}

function fromByteArray (uint8) {
  var tmp
  var len = uint8.length
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  var output = ''
  var parts = []
  var maxChunkLength = 16383 // must be multiple of 3

  // go through the array every three bytes, we'll deal with trailing stuff later
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
  }

  // pad the end with zeros, but make sure to not forget the extra bytes
  if (extraBytes === 1) {
    tmp = uint8[len - 1]
    output += lookup[tmp >> 2]
    output += lookup[(tmp << 4) & 0x3F]
    output += '=='
  } else if (extraBytes === 2) {
    tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
    output += lookup[tmp >> 10]
    output += lookup[(tmp >> 4) & 0x3F]
    output += lookup[(tmp << 2) & 0x3F]
    output += '='
  }

  parts.push(output)

  return parts.join('')
}

},{}],5:[function(require,module,exports){
/*!
 * The buffer module from node.js, for the browser.
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */
/* eslint-disable no-proto */

'use strict'

var base64 = require('base64-js')
var ieee754 = require('ieee754')

exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50

var K_MAX_LENGTH = 0x7fffffff
exports.kMaxLength = K_MAX_LENGTH

/**
 * If `Buffer.TYPED_ARRAY_SUPPORT`:
 *   === true    Use Uint8Array implementation (fastest)
 *   === false   Print warning and recommend using `buffer` v4.x which has an Object
 *               implementation (most compatible, even IE6)
 *
 * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
 * Opera 11.6+, iOS 4.2+.
 *
 * We report that the browser does not support typed arrays if the are not subclassable
 * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
 * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
 * for __proto__ and has a buggy typed array implementation.
 */
Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()

if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
    typeof console.error === 'function') {
  console.error(
    'This browser lacks typed array (Uint8Array) support which is required by ' +
    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
  )
}

function typedArraySupport () {
  // Can typed array instances can be augmented?
  try {
    var arr = new Uint8Array(1)
    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
    return arr.foo() === 42
  } catch (e) {
    return false
  }
}

Object.defineProperty(Buffer.prototype, 'parent', {
  get: function () {
    if (!(this instanceof Buffer)) {
      return undefined
    }
    return this.buffer
  }
})

Object.defineProperty(Buffer.prototype, 'offset', {
  get: function () {
    if (!(this instanceof Buffer)) {
      return undefined
    }
    return this.byteOffset
  }
})

function createBuffer (length) {
  if (length > K_MAX_LENGTH) {
    throw new RangeError('Invalid typed array length')
  }
  // Return an augmented `Uint8Array` instance
  var buf = new Uint8Array(length)
  buf.__proto__ = Buffer.prototype
  return buf
}

/**
 * The Buffer constructor returns instances of `Uint8Array` that have their
 * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
 * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
 * and the `Uint8Array` methods. Square bracket notation works as expected -- it
 * returns a single octet.
 *
 * The `Uint8Array` prototype remains unmodified.
 */

function Buffer (arg, encodingOrOffset, length) {
  // Common case.
  if (typeof arg === 'number') {
    if (typeof encodingOrOffset === 'string') {
      throw new Error(
        'If encoding is specified then the first argument must be a string'
      )
    }
    return allocUnsafe(arg)
  }
  return from(arg, encodingOrOffset, length)
}

// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
if (typeof Symbol !== 'undefined' && Symbol.species &&
    Buffer[Symbol.species] === Buffer) {
  Object.defineProperty(Buffer, Symbol.species, {
    value: null,
    configurable: true,
    enumerable: false,
    writable: false
  })
}

Buffer.poolSize = 8192 // not used by this implementation

function from (value, encodingOrOffset, length) {
  if (typeof value === 'number') {
    throw new TypeError('"value" argument must not be a number')
  }

  if (isArrayBuffer(value) || (value && isArrayBuffer(value.buffer))) {
    return fromArrayBuffer(value, encodingOrOffset, length)
  }

  if (typeof value === 'string') {
    return fromString(value, encodingOrOffset)
  }

  return fromObject(value)
}

/**
 * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
 * if value is a number.
 * Buffer.from(str[, encoding])
 * Buffer.from(array)
 * Buffer.from(buffer)
 * Buffer.from(arrayBuffer[, byteOffset[, length]])
 **/
Buffer.from = function (value, encodingOrOffset, length) {
  return from(value, encodingOrOffset, length)
}

// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
// https://github.com/feross/buffer/pull/148
Buffer.prototype.__proto__ = Uint8Array.prototype
Buffer.__proto__ = Uint8Array

function assertSize (size) {
  if (typeof size !== 'number') {
    throw new TypeError('"size" argument must be of type number')
  } else if (size < 0) {
    throw new RangeError('"size" argument must not be negative')
  }
}

function alloc (size, fill, encoding) {
  assertSize(size)
  if (size <= 0) {
    return createBuffer(size)
  }
  if (fill !== undefined) {
    // Only pay attention to encoding if it's a string. This
    // prevents accidentally sending in a number that would
    // be interpretted as a start offset.
    return typeof encoding === 'string'
      ? createBuffer(size).fill(fill, encoding)
      : createBuffer(size).fill(fill)
  }
  return createBuffer(size)
}

/**
 * Creates a new filled Buffer instance.
 * alloc(size[, fill[, encoding]])
 **/
Buffer.alloc = function (size, fill, encoding) {
  return alloc(size, fill, encoding)
}

function allocUnsafe (size) {
  assertSize(size)
  return createBuffer(size < 0 ? 0 : checked(size) | 0)
}

/**
 * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
 * */
Buffer.allocUnsafe = function (size) {
  return allocUnsafe(size)
}
/**
 * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
 */
Buffer.allocUnsafeSlow = function (size) {
  return allocUnsafe(size)
}

function fromString (string, encoding) {
  if (typeof encoding !== 'string' || encoding === '') {
    encoding = 'utf8'
  }

  if (!Buffer.isEncoding(encoding)) {
    throw new TypeError('Unknown encoding: ' + encoding)
  }

  var length = byteLength(string, encoding) | 0
  var buf = createBuffer(length)

  var actual = buf.write(string, encoding)

  if (actual !== length) {
    // Writing a hex string, for example, that contains invalid characters will
    // cause everything after the first invalid character to be ignored. (e.g.
    // 'abxxcd' will be treated as 'ab')
    buf = buf.slice(0, actual)
  }

  return buf
}

function fromArrayLike (array) {
  var length = array.length < 0 ? 0 : checked(array.length) | 0
  var buf = createBuffer(length)
  for (var i = 0; i < length; i += 1) {
    buf[i] = array[i] & 255
  }
  return buf
}

function fromArrayBuffer (array, byteOffset, length) {
  if (byteOffset < 0 || array.byteLength < byteOffset) {
    throw new RangeError('"offset" is outside of buffer bounds')
  }

  if (array.byteLength < byteOffset + (length || 0)) {
    throw new RangeError('"length" is outside of buffer bounds')
  }

  var buf
  if (byteOffset === undefined && length === undefined) {
    buf = new Uint8Array(array)
  } else if (length === undefined) {
    buf = new Uint8Array(array, byteOffset)
  } else {
    buf = new Uint8Array(array, byteOffset, length)
  }

  // Return an augmented `Uint8Array` instance
  buf.__proto__ = Buffer.prototype
  return buf
}

function fromObject (obj) {
  if (Buffer.isBuffer(obj)) {
    var len = checked(obj.length) | 0
    var buf = createBuffer(len)

    if (buf.length === 0) {
      return buf
    }

    obj.copy(buf, 0, 0, len)
    return buf
  }

  if (obj) {
    if (ArrayBuffer.isView(obj) || 'length' in obj) {
      if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
        return createBuffer(0)
      }
      return fromArrayLike(obj)
    }

    if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
      return fromArrayLike(obj.data)
    }
  }

  throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object.')
}

function checked (length) {
  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
  // length is NaN (which is otherwise coerced to zero.)
  if (length >= K_MAX_LENGTH) {
    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
  }
  return length | 0
}

function SlowBuffer (length) {
  if (+length != length) { // eslint-disable-line eqeqeq
    length = 0
  }
  return Buffer.alloc(+length)
}

Buffer.isBuffer = function isBuffer (b) {
  return b != null && b._isBuffer === true
}

Buffer.compare = function compare (a, b) {
  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
    throw new TypeError('Arguments must be Buffers')
  }

  if (a === b) return 0

  var x = a.length
  var y = b.length

  for (var i = 0, len = Math.min(x, y); i < len; ++i) {
    if (a[i] !== b[i]) {
      x = a[i]
      y = b[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

Buffer.isEncoding = function isEncoding (encoding) {
  switch (String(encoding).toLowerCase()) {
    case 'hex':
    case 'utf8':
    case 'utf-8':
    case 'ascii':
    case 'latin1':
    case 'binary':
    case 'base64':
    case 'ucs2':
    case 'ucs-2':
    case 'utf16le':
    case 'utf-16le':
      return true
    default:
      return false
  }
}

Buffer.concat = function concat (list, length) {
  if (!Array.isArray(list)) {
    throw new TypeError('"list" argument must be an Array of Buffers')
  }

  if (list.length === 0) {
    return Buffer.alloc(0)
  }

  var i
  if (length === undefined) {
    length = 0
    for (i = 0; i < list.length; ++i) {
      length += list[i].length
    }
  }

  var buffer = Buffer.allocUnsafe(length)
  var pos = 0
  for (i = 0; i < list.length; ++i) {
    var buf = list[i]
    if (ArrayBuffer.isView(buf)) {
      buf = Buffer.from(buf)
    }
    if (!Buffer.isBuffer(buf)) {
      throw new TypeError('"list" argument must be an Array of Buffers')
    }
    buf.copy(buffer, pos)
    pos += buf.length
  }
  return buffer
}

function byteLength (string, encoding) {
  if (Buffer.isBuffer(string)) {
    return string.length
  }
  if (ArrayBuffer.isView(string) || isArrayBuffer(string)) {
    return string.byteLength
  }
  if (typeof string !== 'string') {
    string = '' + string
  }

  var len = string.length
  if (len === 0) return 0

  // Use a for loop to avoid recursion
  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'ascii':
      case 'latin1':
      case 'binary':
        return len
      case 'utf8':
      case 'utf-8':
      case undefined:
        return utf8ToBytes(string).length
      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return len * 2
      case 'hex':
        return len >>> 1
      case 'base64':
        return base64ToBytes(string).length
      default:
        if (loweredCase) return utf8ToBytes(string).length // assume utf8
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}
Buffer.byteLength = byteLength

function slowToString (encoding, start, end) {
  var loweredCase = false

  // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
  // property of a typed array.

  // This behaves neither like String nor Uint8Array in that we set start/end
  // to their upper/lower bounds if the value passed is out of range.
  // undefined is handled specially as per ECMA-262 6th Edition,
  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
  if (start === undefined || start < 0) {
    start = 0
  }
  // Return early if start > this.length. Done here to prevent potential uint32
  // coercion fail below.
  if (start > this.length) {
    return ''
  }

  if (end === undefined || end > this.length) {
    end = this.length
  }

  if (end <= 0) {
    return ''
  }

  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
  end >>>= 0
  start >>>= 0

  if (end <= start) {
    return ''
  }

  if (!encoding) encoding = 'utf8'

  while (true) {
    switch (encoding) {
      case 'hex':
        return hexSlice(this, start, end)

      case 'utf8':
      case 'utf-8':
        return utf8Slice(this, start, end)

      case 'ascii':
        return asciiSlice(this, start, end)

      case 'latin1':
      case 'binary':
        return latin1Slice(this, start, end)

      case 'base64':
        return base64Slice(this, start, end)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return utf16leSlice(this, start, end)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = (encoding + '').toLowerCase()
        loweredCase = true
    }
  }
}

// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
// reliably in a browserify context because there could be multiple different
// copies of the 'buffer' package in use. This method works even for Buffer
// instances that were created from another copy of the `buffer` package.
// See: https://github.com/feross/buffer/issues/154
Buffer.prototype._isBuffer = true

function swap (b, n, m) {
  var i = b[n]
  b[n] = b[m]
  b[m] = i
}

Buffer.prototype.swap16 = function swap16 () {
  var len = this.length
  if (len % 2 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 16-bits')
  }
  for (var i = 0; i < len; i += 2) {
    swap(this, i, i + 1)
  }
  return this
}

Buffer.prototype.swap32 = function swap32 () {
  var len = this.length
  if (len % 4 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 32-bits')
  }
  for (var i = 0; i < len; i += 4) {
    swap(this, i, i + 3)
    swap(this, i + 1, i + 2)
  }
  return this
}

Buffer.prototype.swap64 = function swap64 () {
  var len = this.length
  if (len % 8 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 64-bits')
  }
  for (var i = 0; i < len; i += 8) {
    swap(this, i, i + 7)
    swap(this, i + 1, i + 6)
    swap(this, i + 2, i + 5)
    swap(this, i + 3, i + 4)
  }
  return this
}

Buffer.prototype.toString = function toString () {
  var length = this.length
  if (length === 0) return ''
  if (arguments.length === 0) return utf8Slice(this, 0, length)
  return slowToString.apply(this, arguments)
}

Buffer.prototype.toLocaleString = Buffer.prototype.toString

Buffer.prototype.equals = function equals (b) {
  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
  if (this === b) return true
  return Buffer.compare(this, b) === 0
}

Buffer.prototype.inspect = function inspect () {
  var str = ''
  var max = exports.INSPECT_MAX_BYTES
  if (this.length > 0) {
    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
    if (this.length > max) str += ' ... '
  }
  return '<Buffer ' + str + '>'
}

Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
  if (!Buffer.isBuffer(target)) {
    throw new TypeError('Argument must be a Buffer')
  }

  if (start === undefined) {
    start = 0
  }
  if (end === undefined) {
    end = target ? target.length : 0
  }
  if (thisStart === undefined) {
    thisStart = 0
  }
  if (thisEnd === undefined) {
    thisEnd = this.length
  }

  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
    throw new RangeError('out of range index')
  }

  if (thisStart >= thisEnd && start >= end) {
    return 0
  }
  if (thisStart >= thisEnd) {
    return -1
  }
  if (start >= end) {
    return 1
  }

  start >>>= 0
  end >>>= 0
  thisStart >>>= 0
  thisEnd >>>= 0

  if (this === target) return 0

  var x = thisEnd - thisStart
  var y = end - start
  var len = Math.min(x, y)

  var thisCopy = this.slice(thisStart, thisEnd)
  var targetCopy = target.slice(start, end)

  for (var i = 0; i < len; ++i) {
    if (thisCopy[i] !== targetCopy[i]) {
      x = thisCopy[i]
      y = targetCopy[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
//
// Arguments:
// - buffer - a Buffer to search
// - val - a string, Buffer, or number
// - byteOffset - an index into `buffer`; will be clamped to an int32
// - encoding - an optional encoding, relevant is val is a string
// - dir - true for indexOf, false for lastIndexOf
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  // Empty buffer means no match
  if (buffer.length === 0) return -1

  // Normalize byteOffset
  if (typeof byteOffset === 'string') {
    encoding = byteOffset
    byteOffset = 0
  } else if (byteOffset > 0x7fffffff) {
    byteOffset = 0x7fffffff
  } else if (byteOffset < -0x80000000) {
    byteOffset = -0x80000000
  }
  byteOffset = +byteOffset  // Coerce to Number.
  if (numberIsNaN(byteOffset)) {
    // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
    byteOffset = dir ? 0 : (buffer.length - 1)
  }

  // Normalize byteOffset: negative offsets start from the end of the buffer
  if (byteOffset < 0) byteOffset = buffer.length + byteOffset
  if (byteOffset >= buffer.length) {
    if (dir) return -1
    else byteOffset = buffer.length - 1
  } else if (byteOffset < 0) {
    if (dir) byteOffset = 0
    else return -1
  }

  // Normalize val
  if (typeof val === 'string') {
    val = Buffer.from(val, encoding)
  }

  // Finally, search either indexOf (if dir is true) or lastIndexOf
  if (Buffer.isBuffer(val)) {
    // Special case: looking for empty string/buffer always fails
    if (val.length === 0) {
      return -1
    }
    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
  } else if (typeof val === 'number') {
    val = val & 0xFF // Search for a byte value [0-255]
    if (typeof Uint8Array.prototype.indexOf === 'function') {
      if (dir) {
        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
      } else {
        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
      }
    }
    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
  }

  throw new TypeError('val must be string, number or Buffer')
}

function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  var indexSize = 1
  var arrLength = arr.length
  var valLength = val.length

  if (encoding !== undefined) {
    encoding = String(encoding).toLowerCase()
    if (encoding === 'ucs2' || encoding === 'ucs-2' ||
        encoding === 'utf16le' || encoding === 'utf-16le') {
      if (arr.length < 2 || val.length < 2) {
        return -1
      }
      indexSize = 2
      arrLength /= 2
      valLength /= 2
      byteOffset /= 2
    }
  }

  function read (buf, i) {
    if (indexSize === 1) {
      return buf[i]
    } else {
      return buf.readUInt16BE(i * indexSize)
    }
  }

  var i
  if (dir) {
    var foundIndex = -1
    for (i = byteOffset; i < arrLength; i++) {
      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
        if (foundIndex === -1) foundIndex = i
        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
      } else {
        if (foundIndex !== -1) i -= i - foundIndex
        foundIndex = -1
      }
    }
  } else {
    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
    for (i = byteOffset; i >= 0; i--) {
      var found = true
      for (var j = 0; j < valLength; j++) {
        if (read(arr, i + j) !== read(val, j)) {
          found = false
          break
        }
      }
      if (found) return i
    }
  }

  return -1
}

Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
  return this.indexOf(val, byteOffset, encoding) !== -1
}

Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
}

Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
}

function hexWrite (buf, string, offset, length) {
  offset = Number(offset) || 0
  var remaining = buf.length - offset
  if (!length) {
    length = remaining
  } else {
    length = Number(length)
    if (length > remaining) {
      length = remaining
    }
  }

  var strLen = string.length

  if (length > strLen / 2) {
    length = strLen / 2
  }
  for (var i = 0; i < length; ++i) {
    var parsed = parseInt(string.substr(i * 2, 2), 16)
    if (numberIsNaN(parsed)) return i
    buf[offset + i] = parsed
  }
  return i
}

function utf8Write (buf, string, offset, length) {
  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}

function asciiWrite (buf, string, offset, length) {
  return blitBuffer(asciiToBytes(string), buf, offset, length)
}

function latin1Write (buf, string, offset, length) {
  return asciiWrite(buf, string, offset, length)
}

function base64Write (buf, string, offset, length) {
  return blitBuffer(base64ToBytes(string), buf, offset, length)
}

function ucs2Write (buf, string, offset, length) {
  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}

Buffer.prototype.write = function write (string, offset, length, encoding) {
  // Buffer#write(string)
  if (offset === undefined) {
    encoding = 'utf8'
    length = this.length
    offset = 0
  // Buffer#write(string, encoding)
  } else if (length === undefined && typeof offset === 'string') {
    encoding = offset
    length = this.length
    offset = 0
  // Buffer#write(string, offset[, length][, encoding])
  } else if (isFinite(offset)) {
    offset = offset >>> 0
    if (isFinite(length)) {
      length = length >>> 0
      if (encoding === undefined) encoding = 'utf8'
    } else {
      encoding = length
      length = undefined
    }
  } else {
    throw new Error(
      'Buffer.write(string, encoding, offset[, length]) is no longer supported'
    )
  }

  var remaining = this.length - offset
  if (length === undefined || length > remaining) length = remaining

  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
    throw new RangeError('Attempt to write outside buffer bounds')
  }

  if (!encoding) encoding = 'utf8'

  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'hex':
        return hexWrite(this, string, offset, length)

      case 'utf8':
      case 'utf-8':
        return utf8Write(this, string, offset, length)

      case 'ascii':
        return asciiWrite(this, string, offset, length)

      case 'latin1':
      case 'binary':
        return latin1Write(this, string, offset, length)

      case 'base64':
        // Warning: maxLength not taken into account in base64Write
        return base64Write(this, string, offset, length)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return ucs2Write(this, string, offset, length)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}

Buffer.prototype.toJSON = function toJSON () {
  return {
    type: 'Buffer',
    data: Array.prototype.slice.call(this._arr || this, 0)
  }
}

function base64Slice (buf, start, end) {
  if (start === 0 && end === buf.length) {
    return base64.fromByteArray(buf)
  } else {
    return base64.fromByteArray(buf.slice(start, end))
  }
}

function utf8Slice (buf, start, end) {
  end = Math.min(buf.length, end)
  var res = []

  var i = start
  while (i < end) {
    var firstByte = buf[i]
    var codePoint = null
    var bytesPerSequence = (firstByte > 0xEF) ? 4
      : (firstByte > 0xDF) ? 3
      : (firstByte > 0xBF) ? 2
      : 1

    if (i + bytesPerSequence <= end) {
      var secondByte, thirdByte, fourthByte, tempCodePoint

      switch (bytesPerSequence) {
        case 1:
          if (firstByte < 0x80) {
            codePoint = firstByte
          }
          break
        case 2:
          secondByte = buf[i + 1]
          if ((secondByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
            if (tempCodePoint > 0x7F) {
              codePoint = tempCodePoint
            }
          }
          break
        case 3:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
              codePoint = tempCodePoint
            }
          }
          break
        case 4:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          fourthByte = buf[i + 3]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
              codePoint = tempCodePoint
            }
          }
      }
    }

    if (codePoint === null) {
      // we did not generate a valid codePoint so insert a
      // replacement char (U+FFFD) and advance only 1 byte
      codePoint = 0xFFFD
      bytesPerSequence = 1
    } else if (codePoint > 0xFFFF) {
      // encode to utf16 (surrogate pair dance)
      codePoint -= 0x10000
      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
      codePoint = 0xDC00 | codePoint & 0x3FF
    }

    res.push(codePoint)
    i += bytesPerSequence
  }

  return decodeCodePointsArray(res)
}

// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000

function decodeCodePointsArray (codePoints) {
  var len = codePoints.length
  if (len <= MAX_ARGUMENTS_LENGTH) {
    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
  }

  // Decode in chunks to avoid "call stack size exceeded".
  var res = ''
  var i = 0
  while (i < len) {
    res += String.fromCharCode.apply(
      String,
      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
    )
  }
  return res
}

function asciiSlice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i] & 0x7F)
  }
  return ret
}

function latin1Slice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i])
  }
  return ret
}

function hexSlice (buf, start, end) {
  var len = buf.length

  if (!start || start < 0) start = 0
  if (!end || end < 0 || end > len) end = len

  var out = ''
  for (var i = start; i < end; ++i) {
    out += toHex(buf[i])
  }
  return out
}

function utf16leSlice (buf, start, end) {
  var bytes = buf.slice(start, end)
  var res = ''
  for (var i = 0; i < bytes.length; i += 2) {
    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
  }
  return res
}

Buffer.prototype.slice = function slice (start, end) {
  var len = this.length
  start = ~~start
  end = end === undefined ? len : ~~end

  if (start < 0) {
    start += len
    if (start < 0) start = 0
  } else if (start > len) {
    start = len
  }

  if (end < 0) {
    end += len
    if (end < 0) end = 0
  } else if (end > len) {
    end = len
  }

  if (end < start) end = start

  var newBuf = this.subarray(start, end)
  // Return an augmented `Uint8Array` instance
  newBuf.__proto__ = Buffer.prototype
  return newBuf
}

/*
 * Need to make sure that buffer isn't trying to write out of bounds.
 */
function checkOffset (offset, ext, length) {
  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}

Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }

  return val
}

Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    checkOffset(offset, byteLength, this.length)
  }

  var val = this[offset + --byteLength]
  var mul = 1
  while (byteLength > 0 && (mul *= 0x100)) {
    val += this[offset + --byteLength] * mul
  }

  return val
}

Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  return this[offset]
}

Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return this[offset] | (this[offset + 1] << 8)
}

Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return (this[offset] << 8) | this[offset + 1]
}

Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return ((this[offset]) |
      (this[offset + 1] << 8) |
      (this[offset + 2] << 16)) +
      (this[offset + 3] * 0x1000000)
}

Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] * 0x1000000) +
    ((this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    this[offset + 3])
}

Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var i = byteLength
  var mul = 1
  var val = this[offset + --i]
  while (i > 0 && (mul *= 0x100)) {
    val += this[offset + --i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  if (!(this[offset] & 0x80)) return (this[offset])
  return ((0xff - this[offset] + 1) * -1)
}

Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset] | (this[offset + 1] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset + 1] | (this[offset] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset]) |
    (this[offset + 1] << 8) |
    (this[offset + 2] << 16) |
    (this[offset + 3] << 24)
}

Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] << 24) |
    (this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    (this[offset + 3])
}

Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, true, 23, 4)
}

Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, false, 23, 4)
}

Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, true, 52, 8)
}

Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, false, 52, 8)
}

function checkInt (buf, value, offset, ext, max, min) {
  if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
  if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
}

Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var mul = 1
  var i = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var i = byteLength - 1
  var mul = 1
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset + 3] = (value >>> 24)
  this[offset + 2] = (value >>> 16)
  this[offset + 1] = (value >>> 8)
  this[offset] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = 0
  var mul = 1
  var sub = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = byteLength - 1
  var mul = 1
  var sub = 0
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
  if (value < 0) value = 0xff + value + 1
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  this[offset + 2] = (value >>> 16)
  this[offset + 3] = (value >>> 24)
  return offset + 4
}

Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  if (value < 0) value = 0xffffffff + value + 1
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

function checkIEEE754 (buf, value, offset, ext, max, min) {
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
  if (offset < 0) throw new RangeError('Index out of range')
}

function writeFloat (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
  }
  ieee754.write(buf, value, offset, littleEndian, 23, 4)
  return offset + 4
}

Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
  return writeFloat(this, value, offset, true, noAssert)
}

Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
  return writeFloat(this, value, offset, false, noAssert)
}

function writeDouble (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
  }
  ieee754.write(buf, value, offset, littleEndian, 52, 8)
  return offset + 8
}

Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
  return writeDouble(this, value, offset, true, noAssert)
}

Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
  return writeDouble(this, value, offset, false, noAssert)
}

// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
  if (!start) start = 0
  if (!end && end !== 0) end = this.length
  if (targetStart >= target.length) targetStart = target.length
  if (!targetStart) targetStart = 0
  if (end > 0 && end < start) end = start

  // Copy 0 bytes; we're done
  if (end === start) return 0
  if (target.length === 0 || this.length === 0) return 0

  // Fatal error conditions
  if (targetStart < 0) {
    throw new RangeError('targetStart out of bounds')
  }
  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
  if (end < 0) throw new RangeError('sourceEnd out of bounds')

  // Are we oob?
  if (end > this.length) end = this.length
  if (target.length - targetStart < end - start) {
    end = target.length - targetStart + start
  }

  var len = end - start

  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
    // Use built-in when available, missing from IE11
    this.copyWithin(targetStart, start, end)
  } else if (this === target && start < targetStart && targetStart < end) {
    // descending copy from end
    for (var i = len - 1; i >= 0; --i) {
      target[i + targetStart] = this[i + start]
    }
  } else {
    Uint8Array.prototype.set.call(
      target,
      this.subarray(start, end),
      targetStart
    )
  }

  return len
}

// Usage:
//    buffer.fill(number[, offset[, end]])
//    buffer.fill(buffer[, offset[, end]])
//    buffer.fill(string[, offset[, end]][, encoding])
Buffer.prototype.fill = function fill (val, start, end, encoding) {
  // Handle string cases:
  if (typeof val === 'string') {
    if (typeof start === 'string') {
      encoding = start
      start = 0
      end = this.length
    } else if (typeof end === 'string') {
      encoding = end
      end = this.length
    }
    if (encoding !== undefined && typeof encoding !== 'string') {
      throw new TypeError('encoding must be a string')
    }
    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
      throw new TypeError('Unknown encoding: ' + encoding)
    }
    if (val.length === 1) {
      var code = val.charCodeAt(0)
      if ((encoding === 'utf8' && code < 128) ||
          encoding === 'latin1') {
        // Fast path: If `val` fits into a single byte, use that numeric value.
        val = code
      }
    }
  } else if (typeof val === 'number') {
    val = val & 255
  }

  // Invalid ranges are not set to a default, so can range check early.
  if (start < 0 || this.length < start || this.length < end) {
    throw new RangeError('Out of range index')
  }

  if (end <= start) {
    return this
  }

  start = start >>> 0
  end = end === undefined ? this.length : end >>> 0

  if (!val) val = 0

  var i
  if (typeof val === 'number') {
    for (i = start; i < end; ++i) {
      this[i] = val
    }
  } else {
    var bytes = Buffer.isBuffer(val)
      ? val
      : new Buffer(val, encoding)
    var len = bytes.length
    if (len === 0) {
      throw new TypeError('The value "' + val +
        '" is invalid for argument "value"')
    }
    for (i = 0; i < end - start; ++i) {
      this[i + start] = bytes[i % len]
    }
  }

  return this
}

// HELPER FUNCTIONS
// ================

var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g

function base64clean (str) {
  // Node takes equal signs as end of the Base64 encoding
  str = str.split('=')[0]
  // Node strips out invalid characters like \n and \t from the string, base64-js does not
  str = str.trim().replace(INVALID_BASE64_RE, '')
  // Node converts strings with length < 2 to ''
  if (str.length < 2) return ''
  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
  while (str.length % 4 !== 0) {
    str = str + '='
  }
  return str
}

function toHex (n) {
  if (n < 16) return '0' + n.toString(16)
  return n.toString(16)
}

function utf8ToBytes (string, units) {
  units = units || Infinity
  var codePoint
  var length = string.length
  var leadSurrogate = null
  var bytes = []

  for (var i = 0; i < length; ++i) {
    codePoint = string.charCodeAt(i)

    // is surrogate component
    if (codePoint > 0xD7FF && codePoint < 0xE000) {
      // last char was a lead
      if (!leadSurrogate) {
        // no lead yet
        if (codePoint > 0xDBFF) {
          // unexpected trail
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        } else if (i + 1 === length) {
          // unpaired lead
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        }

        // valid lead
        leadSurrogate = codePoint

        continue
      }

      // 2 leads in a row
      if (codePoint < 0xDC00) {
        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
        leadSurrogate = codePoint
        continue
      }

      // valid surrogate pair
      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
    } else if (leadSurrogate) {
      // valid bmp char, but last char was a lead
      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
    }

    leadSurrogate = null

    // encode utf8
    if (codePoint < 0x80) {
      if ((units -= 1) < 0) break
      bytes.push(codePoint)
    } else if (codePoint < 0x800) {
      if ((units -= 2) < 0) break
      bytes.push(
        codePoint >> 0x6 | 0xC0,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x10000) {
      if ((units -= 3) < 0) break
      bytes.push(
        codePoint >> 0xC | 0xE0,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x110000) {
      if ((units -= 4) < 0) break
      bytes.push(
        codePoint >> 0x12 | 0xF0,
        codePoint >> 0xC & 0x3F | 0x80,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else {
      throw new Error('Invalid code point')
    }
  }

  return bytes
}

function asciiToBytes (str) {
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    // Node's code seems to be doing this and not & 0x7F..
    byteArray.push(str.charCodeAt(i) & 0xFF)
  }
  return byteArray
}

function utf16leToBytes (str, units) {
  var c, hi, lo
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    if ((units -= 2) < 0) break

    c = str.charCodeAt(i)
    hi = c >> 8
    lo = c % 256
    byteArray.push(lo)
    byteArray.push(hi)
  }

  return byteArray
}

function base64ToBytes (str) {
  return base64.toByteArray(base64clean(str))
}

function blitBuffer (src, dst, offset, length) {
  for (var i = 0; i < length; ++i) {
    if ((i + offset >= dst.length) || (i >= src.length)) break
    dst[i + offset] = src[i]
  }
  return i
}

// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check
// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166
function isArrayBuffer (obj) {
  return obj instanceof ArrayBuffer ||
    (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' &&
      typeof obj.byteLength === 'number')
}

function numberIsNaN (obj) {
  return obj !== obj // eslint-disable-line no-self-compare
}

},{"base64-js":4,"ieee754":6}],6:[function(require,module,exports){
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
  var e, m
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var nBits = -7
  var i = isLE ? (nBytes - 1) : 0
  var d = isLE ? -1 : 1
  var s = buffer[offset + i]

  i += d

  e = s & ((1 << (-nBits)) - 1)
  s >>= (-nBits)
  nBits += eLen
  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  m = e & ((1 << (-nBits)) - 1)
  e >>= (-nBits)
  nBits += mLen
  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  if (e === 0) {
    e = 1 - eBias
  } else if (e === eMax) {
    return m ? NaN : ((s ? -1 : 1) * Infinity)
  } else {
    m = m + Math.pow(2, mLen)
    e = e - eBias
  }
  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
}

exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
  var e, m, c
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
  var i = isLE ? 0 : (nBytes - 1)
  var d = isLE ? 1 : -1
  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0

  value = Math.abs(value)

  if (isNaN(value) || value === Infinity) {
    m = isNaN(value) ? 1 : 0
    e = eMax
  } else {
    e = Math.floor(Math.log(value) / Math.LN2)
    if (value * (c = Math.pow(2, -e)) < 1) {
      e--
      c *= 2
    }
    if (e + eBias >= 1) {
      value += rt / c
    } else {
      value += rt * Math.pow(2, 1 - eBias)
    }
    if (value * c >= 2) {
      e++
      c /= 2
    }

    if (e + eBias >= eMax) {
      m = 0
      e = eMax
    } else if (e + eBias >= 1) {
      m = ((value * c) - 1) * Math.pow(2, mLen)
      e = e + eBias
    } else {
      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
      e = 0
    }
  }

  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}

  e = (e << mLen) | m
  eLen += mLen
  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}

  buffer[offset + i - d] |= s * 128
}

},{}],7:[function(require,module,exports){
/*!
 * Determine if an object is a Buffer
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */

// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
module.exports = function (obj) {
  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
}

function isBuffer (obj) {
  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
}

// For Node v0.10 support. Remove this eventually.
function isSlowBuffer (obj) {
  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
}

},{}],8:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var assign, isArray, isEmpty, isFunction, isObject, isPlainObject,
    slice = [].slice,
    hasProp = {}.hasOwnProperty;

  assign = function() {
    var i, key, len, source, sources, target;
    target = arguments[0], sources = 2 <= arguments.length ? slice.call(arguments, 1) : [];
    if (isFunction(Object.assign)) {
      Object.assign.apply(null, arguments);
    } else {
      for (i = 0, len = sources.length; i < len; i++) {
        source = sources[i];
        if (source != null) {
          for (key in source) {
            if (!hasProp.call(source, key)) continue;
            target[key] = source[key];
          }
        }
      }
    }
    return target;
  };

  isFunction = function(val) {
    return !!val && Object.prototype.toString.call(val) === '[object Function]';
  };

  isObject = function(val) {
    var ref;
    return !!val && ((ref = typeof val) === 'function' || ref === 'object');
  };

  isArray = function(val) {
    if (isFunction(Array.isArray)) {
      return Array.isArray(val);
    } else {
      return Object.prototype.toString.call(val) === '[object Array]';
    }
  };

  isEmpty = function(val) {
    var key;
    if (isArray(val)) {
      return !val.length;
    } else {
      for (key in val) {
        if (!hasProp.call(val, key)) continue;
        return false;
      }
      return true;
    }
  };

  isPlainObject = function(val) {
    var ctor, proto;
    return isObject(val) && (proto = Object.getPrototypeOf(val)) && (ctor = proto.constructor) && (typeof ctor === 'function') && (ctor instanceof ctor) && (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object));
  };

  module.exports.assign = assign;

  module.exports.isFunction = isFunction;

  module.exports.isObject = isObject;

  module.exports.isArray = isArray;

  module.exports.isEmpty = isEmpty;

  module.exports.isPlainObject = isPlainObject;

}).call(this);

},{}],9:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute;

  module.exports = XMLAttribute = (function() {
    function XMLAttribute(parent, name, value) {
      this.options = parent.options;
      this.stringify = parent.stringify;
      if (name == null) {
        throw new Error("Missing attribute name of element " + parent.name);
      }
      if (value == null) {
        throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name);
      }
      this.name = this.stringify.attName(name);
      this.value = this.stringify.attValue(value);
    }

    XMLAttribute.prototype.clone = function() {
      return Object.create(this);
    };

    XMLAttribute.prototype.toString = function(options) {
      return this.options.writer.set(options).attribute(this);
    };

    return XMLAttribute;

  })();

}).call(this);

},{}],10:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLCData = (function(superClass) {
    extend(XMLCData, superClass);

    function XMLCData(parent, text) {
      XMLCData.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing CDATA text");
      }
      this.text = this.stringify.cdata(text);
    }

    XMLCData.prototype.clone = function() {
      return Object.create(this);
    };

    XMLCData.prototype.toString = function(options) {
      return this.options.writer.set(options).cdata(this);
    };

    return XMLCData;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],11:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLComment, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLComment = (function(superClass) {
    extend(XMLComment, superClass);

    function XMLComment(parent, text) {
      XMLComment.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing comment text");
      }
      this.text = this.stringify.comment(text);
    }

    XMLComment.prototype.clone = function() {
      return Object.create(this);
    };

    XMLComment.prototype.toString = function(options) {
      return this.options.writer.set(options).comment(this);
    };

    return XMLComment;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],12:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDAttList, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDAttList = (function(superClass) {
    extend(XMLDTDAttList, superClass);

    function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      XMLDTDAttList.__super__.constructor.call(this, parent);
      if (elementName == null) {
        throw new Error("Missing DTD element name");
      }
      if (attributeName == null) {
        throw new Error("Missing DTD attribute name");
      }
      if (!attributeType) {
        throw new Error("Missing DTD attribute type");
      }
      if (!defaultValueType) {
        throw new Error("Missing DTD attribute default");
      }
      if (defaultValueType.indexOf('#') !== 0) {
        defaultValueType = '#' + defaultValueType;
      }
      if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {
        throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT");
      }
      if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {
        throw new Error("Default value only applies to #FIXED or #DEFAULT");
      }
      this.elementName = this.stringify.eleName(elementName);
      this.attributeName = this.stringify.attName(attributeName);
      this.attributeType = this.stringify.dtdAttType(attributeType);
      this.defaultValue = this.stringify.dtdAttDefault(defaultValue);
      this.defaultValueType = defaultValueType;
    }

    XMLDTDAttList.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdAttList(this);
    };

    return XMLDTDAttList;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],13:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDElement, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDElement = (function(superClass) {
    extend(XMLDTDElement, superClass);

    function XMLDTDElement(parent, name, value) {
      XMLDTDElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing DTD element name");
      }
      if (!value) {
        value = '(#PCDATA)';
      }
      if (Array.isArray(value)) {
        value = '(' + value.join(',') + ')';
      }
      this.name = this.stringify.eleName(name);
      this.value = this.stringify.dtdElementValue(value);
    }

    XMLDTDElement.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdElement(this);
    };

    return XMLDTDElement;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],14:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDEntity, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDEntity = (function(superClass) {
    extend(XMLDTDEntity, superClass);

    function XMLDTDEntity(parent, pe, name, value) {
      XMLDTDEntity.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing entity name");
      }
      if (value == null) {
        throw new Error("Missing entity value");
      }
      this.pe = !!pe;
      this.name = this.stringify.eleName(name);
      if (!isObject(value)) {
        this.value = this.stringify.dtdEntityValue(value);
      } else {
        if (!value.pubID && !value.sysID) {
          throw new Error("Public and/or system identifiers are required for an external entity");
        }
        if (value.pubID && !value.sysID) {
          throw new Error("System identifier is required for a public external entity");
        }
        if (value.pubID != null) {
          this.pubID = this.stringify.dtdPubID(value.pubID);
        }
        if (value.sysID != null) {
          this.sysID = this.stringify.dtdSysID(value.sysID);
        }
        if (value.nData != null) {
          this.nData = this.stringify.dtdNData(value.nData);
        }
        if (this.pe && this.nData) {
          throw new Error("Notation declaration is not allowed in a parameter entity");
        }
      }
    }

    XMLDTDEntity.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdEntity(this);
    };

    return XMLDTDEntity;

  })(XMLNode);

}).call(this);

},{"./Utility":8,"./XMLNode":21}],15:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDNotation, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDNotation = (function(superClass) {
    extend(XMLDTDNotation, superClass);

    function XMLDTDNotation(parent, name, value) {
      XMLDTDNotation.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing notation name");
      }
      if (!value.pubID && !value.sysID) {
        throw new Error("Public or system identifiers are required for an external entity");
      }
      this.name = this.stringify.eleName(name);
      if (value.pubID != null) {
        this.pubID = this.stringify.dtdPubID(value.pubID);
      }
      if (value.sysID != null) {
        this.sysID = this.stringify.dtdSysID(value.sysID);
      }
    }

    XMLDTDNotation.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdNotation(this);
    };

    return XMLDTDNotation;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],16:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDeclaration, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  module.exports = XMLDeclaration = (function(superClass) {
    extend(XMLDeclaration, superClass);

    function XMLDeclaration(parent, version, encoding, standalone) {
      var ref;
      XMLDeclaration.__super__.constructor.call(this, parent);
      if (isObject(version)) {
        ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;
      }
      if (!version) {
        version = '1.0';
      }
      this.version = this.stringify.xmlVersion(version);
      if (encoding != null) {
        this.encoding = this.stringify.xmlEncoding(encoding);
      }
      if (standalone != null) {
        this.standalone = this.stringify.xmlStandalone(standalone);
      }
    }

    XMLDeclaration.prototype.toString = function(options) {
      return this.options.writer.set(options).declaration(this);
    };

    return XMLDeclaration;

  })(XMLNode);

}).call(this);

},{"./Utility":8,"./XMLNode":21}],17:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  module.exports = XMLDocType = (function(superClass) {
    extend(XMLDocType, superClass);

    function XMLDocType(parent, pubID, sysID) {
      var ref, ref1;
      XMLDocType.__super__.constructor.call(this, parent);
      this.documentObject = parent;
      if (isObject(pubID)) {
        ref = pubID, pubID = ref.pubID, sysID = ref.sysID;
      }
      if (sysID == null) {
        ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1];
      }
      if (pubID != null) {
        this.pubID = this.stringify.dtdPubID(pubID);
      }
      if (sysID != null) {
        this.sysID = this.stringify.dtdSysID(sysID);
      }
    }

    XMLDocType.prototype.element = function(name, value) {
      var child;
      child = new XMLDTDElement(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var child;
      child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.entity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, false, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.pEntity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, true, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.notation = function(name, value) {
      var child;
      child = new XMLDTDNotation(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.toString = function(options) {
      return this.options.writer.set(options).docType(this);
    };

    XMLDocType.prototype.ele = function(name, value) {
      return this.element(name, value);
    };

    XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);
    };

    XMLDocType.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocType.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocType.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    XMLDocType.prototype.up = function() {
      return this.root() || this.documentObject;
    };

    return XMLDocType;

  })(XMLNode);

}).call(this);

},{"./Utility":8,"./XMLDTDAttList":12,"./XMLDTDElement":13,"./XMLDTDEntity":14,"./XMLDTDNotation":15,"./XMLNode":21}],18:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDocument, XMLNode, XMLStringWriter, XMLStringifier, isPlainObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isPlainObject = require('./Utility').isPlainObject;

  XMLNode = require('./XMLNode');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  module.exports = XMLDocument = (function(superClass) {
    extend(XMLDocument, superClass);

    function XMLDocument(options) {
      XMLDocument.__super__.constructor.call(this, null);
      options || (options = {});
      if (!options.writer) {
        options.writer = new XMLStringWriter();
      }
      this.options = options;
      this.stringify = new XMLStringifier(options);
      this.isDocument = true;
    }

    XMLDocument.prototype.end = function(writer) {
      var writerOptions;
      if (!writer) {
        writer = this.options.writer;
      } else if (isPlainObject(writer)) {
        writerOptions = writer;
        writer = this.options.writer.set(writerOptions);
      }
      return writer.document(this);
    };

    XMLDocument.prototype.toString = function(options) {
      return this.options.writer.set(options).document(this);
    };

    return XMLDocument;

  })(XMLNode);

}).call(this);

},{"./Utility":8,"./XMLNode":21,"./XMLStringWriter":25,"./XMLStringifier":26}],19:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute, XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLDocumentCB, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLStringifier, XMLText, isFunction, isObject, isPlainObject, ref,
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isPlainObject = ref.isPlainObject;

  XMLElement = require('./XMLElement');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLAttribute = require('./XMLAttribute');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  module.exports = XMLDocumentCB = (function() {
    function XMLDocumentCB(options, onData, onEnd) {
      var writerOptions;
      options || (options = {});
      if (!options.writer) {
        options.writer = new XMLStringWriter(options);
      } else if (isPlainObject(options.writer)) {
        writerOptions = options.writer;
        options.writer = new XMLStringWriter(writerOptions);
      }
      this.options = options;
      this.writer = options.writer;
      this.stringify = new XMLStringifier(options);
      this.onDataCallback = onData || function() {};
      this.onEndCallback = onEnd || function() {};
      this.currentNode = null;
      this.currentLevel = -1;
      this.openTags = {};
      this.documentStarted = false;
      this.documentCompleted = false;
      this.root = null;
    }

    XMLDocumentCB.prototype.node = function(name, attributes, text) {
      var ref1;
      if (name == null) {
        throw new Error("Missing node name");
      }
      if (this.root && this.currentLevel === -1) {
        throw new Error("Document can only have one root node");
      }
      this.openCurrent();
      name = name.valueOf();
      if (attributes == null) {
        attributes = {};
      }
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      this.currentNode = new XMLElement(this, name, attributes);
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      if (text != null) {
        this.text(text);
      }
      return this;
    };

    XMLDocumentCB.prototype.element = function(name, attributes, text) {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.dtdElement.apply(this, arguments);
      } else {
        return this.node(name, attributes, text);
      }
    };

    XMLDocumentCB.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (!this.currentNode || this.currentNode.children) {
        throw new Error("att() can only be used immediately after an ele() call in callback mode");
      }
      if (name != null) {
        name = name.valueOf();
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (!this.options.skipNullAttributes || (value != null)) {
          this.currentNode.attributes[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLDocumentCB.prototype.text = function(value) {
      var node;
      this.openCurrent();
      node = new XMLText(this, value);
      this.onData(this.writer.text(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.cdata = function(value) {
      var node;
      this.openCurrent();
      node = new XMLCData(this, value);
      this.onData(this.writer.cdata(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.comment = function(value) {
      var node;
      this.openCurrent();
      node = new XMLComment(this, value);
      this.onData(this.writer.comment(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.raw = function(value) {
      var node;
      this.openCurrent();
      node = new XMLRaw(this, value);
      this.onData(this.writer.raw(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.instruction = function(target, value) {
      var i, insTarget, insValue, len, node;
      this.openCurrent();
      if (target != null) {
        target = target.valueOf();
      }
      if (value != null) {
        value = value.valueOf();
      }
      if (Array.isArray(target)) {
        for (i = 0, len = target.length; i < len; i++) {
          insTarget = target[i];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        node = new XMLProcessingInstruction(this, target, value);
        this.onData(this.writer.processingInstruction(node, this.currentLevel + 1));
      }
      return this;
    };

    XMLDocumentCB.prototype.declaration = function(version, encoding, standalone) {
      var node;
      this.openCurrent();
      if (this.documentStarted) {
        throw new Error("declaration() must be the first node");
      }
      node = new XMLDeclaration(this, version, encoding, standalone);
      this.onData(this.writer.declaration(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.doctype = function(root, pubID, sysID) {
      this.openCurrent();
      if (root == null) {
        throw new Error("Missing root node name");
      }
      if (this.root) {
        throw new Error("dtd() must come before the root node");
      }
      this.currentNode = new XMLDocType(this, pubID, sysID);
      this.currentNode.rootNodeName = root;
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      return this;
    };

    XMLDocumentCB.prototype.dtdElement = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDElement(this, name, value);
      this.onData(this.writer.dtdElement(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var node;
      this.openCurrent();
      node = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.onData(this.writer.dtdAttList(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.entity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, false, name, value);
      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.pEntity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, true, name, value);
      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.notation = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDNotation(this, name, value);
      this.onData(this.writer.dtdNotation(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.up = function() {
      if (this.currentLevel < 0) {
        throw new Error("The document node has no parent");
      }
      if (this.currentNode) {
        if (this.currentNode.children) {
          this.closeNode(this.currentNode);
        } else {
          this.openNode(this.currentNode);
        }
        this.currentNode = null;
      } else {
        this.closeNode(this.openTags[this.currentLevel]);
      }
      delete this.openTags[this.currentLevel];
      this.currentLevel--;
      return this;
    };

    XMLDocumentCB.prototype.end = function() {
      while (this.currentLevel >= 0) {
        this.up();
      }
      return this.onEnd();
    };

    XMLDocumentCB.prototype.openCurrent = function() {
      if (this.currentNode) {
        this.currentNode.children = true;
        return this.openNode(this.currentNode);
      }
    };

    XMLDocumentCB.prototype.openNode = function(node) {
      if (!node.isOpen) {
        if (!this.root && this.currentLevel === 0 && node instanceof XMLElement) {
          this.root = node;
        }
        this.onData(this.writer.openNode(node, this.currentLevel));
        return node.isOpen = true;
      }
    };

    XMLDocumentCB.prototype.closeNode = function(node) {
      if (!node.isClosed) {
        this.onData(this.writer.closeNode(node, this.currentLevel));
        return node.isClosed = true;
      }
    };

    XMLDocumentCB.prototype.onData = function(chunk) {
      this.documentStarted = true;
      return this.onDataCallback(chunk);
    };

    XMLDocumentCB.prototype.onEnd = function() {
      this.documentCompleted = true;
      return this.onEndCallback();
    };

    XMLDocumentCB.prototype.ele = function() {
      return this.element.apply(this, arguments);
    };

    XMLDocumentCB.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLDocumentCB.prototype.dtd = function(root, pubID, sysID) {
      return this.doctype(root, pubID, sysID);
    };

    XMLDocumentCB.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLDocumentCB.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.t = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLDocumentCB.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.att = function() {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.a = function() {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocumentCB.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocumentCB.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    return XMLDocumentCB;

  })();

}).call(this);

},{"./Utility":8,"./XMLAttribute":9,"./XMLCData":10,"./XMLComment":11,"./XMLDTDAttList":12,"./XMLDTDElement":13,"./XMLDTDEntity":14,"./XMLDTDNotation":15,"./XMLDeclaration":16,"./XMLDocType":17,"./XMLElement":20,"./XMLProcessingInstruction":22,"./XMLRaw":23,"./XMLStringWriter":25,"./XMLStringifier":26,"./XMLText":27}],20:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute, XMLElement, XMLNode, isFunction, isObject, ref,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction;

  XMLNode = require('./XMLNode');

  XMLAttribute = require('./XMLAttribute');

  module.exports = XMLElement = (function(superClass) {
    extend(XMLElement, superClass);

    function XMLElement(parent, name, attributes) {
      XMLElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing element name");
      }
      this.name = this.stringify.eleName(name);
      this.attributes = {};
      if (attributes != null) {
        this.attribute(attributes);
      }
      if (parent.isDocument) {
        this.isRoot = true;
        this.documentObject = parent;
        parent.rootObject = this;
      }
    }

    XMLElement.prototype.clone = function() {
      var att, attName, clonedSelf, ref1;
      clonedSelf = Object.create(this);
      if (clonedSelf.isRoot) {
        clonedSelf.documentObject = null;
      }
      clonedSelf.attributes = {};
      ref1 = this.attributes;
      for (attName in ref1) {
        if (!hasProp.call(ref1, attName)) continue;
        att = ref1[attName];
        clonedSelf.attributes[attName] = att.clone();
      }
      clonedSelf.children = [];
      this.children.forEach(function(child) {
        var clonedChild;
        clonedChild = child.clone();
        clonedChild.parent = clonedSelf;
        return clonedSelf.children.push(clonedChild);
      });
      return clonedSelf;
    };

    XMLElement.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (name != null) {
        name = name.valueOf();
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (!this.options.skipNullAttributes || (value != null)) {
          this.attributes[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLElement.prototype.removeAttribute = function(name) {
      var attName, i, len;
      if (name == null) {
        throw new Error("Missing attribute name");
      }
      name = name.valueOf();
      if (Array.isArray(name)) {
        for (i = 0, len = name.length; i < len; i++) {
          attName = name[i];
          delete this.attributes[attName];
        }
      } else {
        delete this.attributes[name];
      }
      return this;
    };

    XMLElement.prototype.toString = function(options) {
      return this.options.writer.set(options).element(this);
    };

    XMLElement.prototype.att = function(name, value) {
      return this.attribute(name, value);
    };

    XMLElement.prototype.a = function(name, value) {
      return this.attribute(name, value);
    };

    return XMLElement;

  })(XMLNode);

}).call(this);

},{"./Utility":8,"./XMLAttribute":9,"./XMLNode":21}],21:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLProcessingInstruction, XMLRaw, XMLText, isEmpty, isFunction, isObject, ref,
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isEmpty = ref.isEmpty;

  XMLElement = null;

  XMLCData = null;

  XMLComment = null;

  XMLDeclaration = null;

  XMLDocType = null;

  XMLRaw = null;

  XMLText = null;

  XMLProcessingInstruction = null;

  module.exports = XMLNode = (function() {
    function XMLNode(parent) {
      this.parent = parent;
      if (this.parent) {
        this.options = this.parent.options;
        this.stringify = this.parent.stringify;
      }
      this.children = [];
      if (!XMLElement) {
        XMLElement = require('./XMLElement');
        XMLCData = require('./XMLCData');
        XMLComment = require('./XMLComment');
        XMLDeclaration = require('./XMLDeclaration');
        XMLDocType = require('./XMLDocType');
        XMLRaw = require('./XMLRaw');
        XMLText = require('./XMLText');
        XMLProcessingInstruction = require('./XMLProcessingInstruction');
      }
    }

    XMLNode.prototype.element = function(name, attributes, text) {
      var childNode, item, j, k, key, lastChild, len, len1, ref1, val;
      lastChild = null;
      if (attributes == null) {
        attributes = {};
      }
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      if (name != null) {
        name = name.valueOf();
      }
      if (Array.isArray(name)) {
        for (j = 0, len = name.length; j < len; j++) {
          item = name[j];
          lastChild = this.element(item);
        }
      } else if (isFunction(name)) {
        lastChild = this.element(name.apply());
      } else if (isObject(name)) {
        for (key in name) {
          if (!hasProp.call(name, key)) continue;
          val = name[key];
          if (isFunction(val)) {
            val = val.apply();
          }
          if ((isObject(val)) && (isEmpty(val))) {
            val = null;
          }
          if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {
            lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);
          } else if (!this.options.separateArrayItems && Array.isArray(val)) {
            for (k = 0, len1 = val.length; k < len1; k++) {
              item = val[k];
              childNode = {};
              childNode[key] = item;
              lastChild = this.element(childNode);
            }
          } else if (isObject(val)) {
            lastChild = this.element(key);
            lastChild.element(val);
          } else {
            lastChild = this.element(key, val);
          }
        }
      } else {
        if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {
          lastChild = this.text(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {
          lastChild = this.cdata(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {
          lastChild = this.comment(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {
          lastChild = this.raw(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) {
          lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text);
        } else {
          lastChild = this.node(name, attributes, text);
        }
      }
      if (lastChild == null) {
        throw new Error("Could not create any elements with: " + name);
      }
      return lastChild;
    };

    XMLNode.prototype.insertBefore = function(name, attributes, text) {
      var child, i, removed;
      if (this.isRoot) {
        throw new Error("Cannot insert elements at root level");
      }
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.element(name, attributes, text);
      Array.prototype.push.apply(this.parent.children, removed);
      return child;
    };

    XMLNode.prototype.insertAfter = function(name, attributes, text) {
      var child, i, removed;
      if (this.isRoot) {
        throw new Error("Cannot insert elements at root level");
      }
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.element(name, attributes, text);
      Array.prototype.push.apply(this.parent.children, removed);
      return child;
    };

    XMLNode.prototype.remove = function() {
      var i, ref1;
      if (this.isRoot) {
        throw new Error("Cannot remove the root element");
      }
      i = this.parent.children.indexOf(this);
      [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref1 = [])), ref1;
      return this.parent;
    };

    XMLNode.prototype.node = function(name, attributes, text) {
      var child, ref1;
      if (name != null) {
        name = name.valueOf();
      }
      attributes || (attributes = {});
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      child = new XMLElement(this, name, attributes);
      if (text != null) {
        child.text(text);
      }
      this.children.push(child);
      return child;
    };

    XMLNode.prototype.text = function(value) {
      var child;
      child = new XMLText(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.cdata = function(value) {
      var child;
      child = new XMLCData(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.comment = function(value) {
      var child;
      child = new XMLComment(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.commentBefore = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.commentAfter = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.raw = function(value) {
      var child;
      child = new XMLRaw(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.instruction = function(target, value) {
      var insTarget, insValue, instruction, j, len;
      if (target != null) {
        target = target.valueOf();
      }
      if (value != null) {
        value = value.valueOf();
      }
      if (Array.isArray(target)) {
        for (j = 0, len = target.length; j < len; j++) {
          insTarget = target[j];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        instruction = new XMLProcessingInstruction(this, target, value);
        this.children.push(instruction);
      }
      return this;
    };

    XMLNode.prototype.instructionBefore = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.instructionAfter = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.declaration = function(version, encoding, standalone) {
      var doc, xmldec;
      doc = this.document();
      xmldec = new XMLDeclaration(doc, version, encoding, standalone);
      if (doc.children[0] instanceof XMLDeclaration) {
        doc.children[0] = xmldec;
      } else {
        doc.children.unshift(xmldec);
      }
      return doc.root() || doc;
    };

    XMLNode.prototype.doctype = function(pubID, sysID) {
      var child, doc, doctype, i, j, k, len, len1, ref1, ref2;
      doc = this.document();
      doctype = new XMLDocType(doc, pubID, sysID);
      ref1 = doc.children;
      for (i = j = 0, len = ref1.length; j < len; i = ++j) {
        child = ref1[i];
        if (child instanceof XMLDocType) {
          doc.children[i] = doctype;
          return doctype;
        }
      }
      ref2 = doc.children;
      for (i = k = 0, len1 = ref2.length; k < len1; i = ++k) {
        child = ref2[i];
        if (child.isRoot) {
          doc.children.splice(i, 0, doctype);
          return doctype;
        }
      }
      doc.children.push(doctype);
      return doctype;
    };

    XMLNode.prototype.up = function() {
      if (this.isRoot) {
        throw new Error("The root node has no parent. Use doc() if you need to get the document object.");
      }
      return this.parent;
    };

    XMLNode.prototype.root = function() {
      var node;
      node = this;
      while (node) {
        if (node.isDocument) {
          return node.rootObject;
        } else if (node.isRoot) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.document = function() {
      var node;
      node = this;
      while (node) {
        if (node.isDocument) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.end = function(options) {
      return this.document().end(options);
    };

    XMLNode.prototype.prev = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i < 1) {
        throw new Error("Already at the first node");
      }
      return this.parent.children[i - 1];
    };

    XMLNode.prototype.next = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i === -1 || i === this.parent.children.length - 1) {
        throw new Error("Already at the last node");
      }
      return this.parent.children[i + 1];
    };

    XMLNode.prototype.importDocument = function(doc) {
      var clonedRoot;
      clonedRoot = doc.root().clone();
      clonedRoot.parent = this;
      clonedRoot.isRoot = false;
      this.children.push(clonedRoot);
      return this;
    };

    XMLNode.prototype.ele = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.doc = function() {
      return this.document();
    };

    XMLNode.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLNode.prototype.dtd = function(pubID, sysID) {
      return this.doctype(pubID, sysID);
    };

    XMLNode.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.t = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLNode.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.u = function() {
      return this.up();
    };

    XMLNode.prototype.importXMLBuilder = function(doc) {
      return this.importDocument(doc);
    };

    return XMLNode;

  })();

}).call(this);

},{"./Utility":8,"./XMLCData":10,"./XMLComment":11,"./XMLDeclaration":16,"./XMLDocType":17,"./XMLElement":20,"./XMLProcessingInstruction":22,"./XMLRaw":23,"./XMLText":27}],22:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLProcessingInstruction,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLProcessingInstruction = (function(superClass) {
    extend(XMLProcessingInstruction, superClass);

    function XMLProcessingInstruction(parent, target, value) {
      XMLProcessingInstruction.__super__.constructor.call(this, parent);
      if (target == null) {
        throw new Error("Missing instruction target");
      }
      this.target = this.stringify.insTarget(target);
      if (value) {
        this.value = this.stringify.insValue(value);
      }
    }

    XMLProcessingInstruction.prototype.clone = function() {
      return Object.create(this);
    };

    XMLProcessingInstruction.prototype.toString = function(options) {
      return this.options.writer.set(options).processingInstruction(this);
    };

    return XMLProcessingInstruction;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],23:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLRaw,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLRaw = (function(superClass) {
    extend(XMLRaw, superClass);

    function XMLRaw(parent, text) {
      XMLRaw.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing raw text");
      }
      this.value = this.stringify.raw(text);
    }

    XMLRaw.prototype.clone = function() {
      return Object.create(this);
    };

    XMLRaw.prototype.toString = function(options) {
      return this.options.writer.set(options).raw(this);
    };

    return XMLRaw;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],24:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStreamWriter, XMLText, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLElement = require('./XMLElement');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLWriterBase = require('./XMLWriterBase');

  module.exports = XMLStreamWriter = (function(superClass) {
    extend(XMLStreamWriter, superClass);

    function XMLStreamWriter(stream, options) {
      XMLStreamWriter.__super__.constructor.call(this, options);
      this.stream = stream;
    }

    XMLStreamWriter.prototype.document = function(doc) {
      var child, i, j, len, len1, ref, ref1, results;
      ref = doc.children;
      for (i = 0, len = ref.length; i < len; i++) {
        child = ref[i];
        child.isLastRootNode = false;
      }
      doc.children[doc.children.length - 1].isLastRootNode = true;
      ref1 = doc.children;
      results = [];
      for (j = 0, len1 = ref1.length; j < len1; j++) {
        child = ref1[j];
        switch (false) {
          case !(child instanceof XMLDeclaration):
            results.push(this.declaration(child));
            break;
          case !(child instanceof XMLDocType):
            results.push(this.docType(child));
            break;
          case !(child instanceof XMLComment):
            results.push(this.comment(child));
            break;
          case !(child instanceof XMLProcessingInstruction):
            results.push(this.processingInstruction(child));
            break;
          default:
            results.push(this.element(child));
        }
      }
      return results;
    };

    XMLStreamWriter.prototype.attribute = function(att) {
      return this.stream.write(' ' + att.name + '="' + att.value + '"');
    };

    XMLStreamWriter.prototype.cdata = function(node, level) {
      return this.stream.write(this.space(level) + '<![CDATA[' + node.text + ']]>' + this.endline(node));
    };

    XMLStreamWriter.prototype.comment = function(node, level) {
      return this.stream.write(this.space(level) + '<!-- ' + node.text + ' -->' + this.endline(node));
    };

    XMLStreamWriter.prototype.declaration = function(node, level) {
      this.stream.write(this.space(level));
      this.stream.write('<?xml version="' + node.version + '"');
      if (node.encoding != null) {
        this.stream.write(' encoding="' + node.encoding + '"');
      }
      if (node.standalone != null) {
        this.stream.write(' standalone="' + node.standalone + '"');
      }
      this.stream.write(this.spacebeforeslash + '?>');
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.docType = function(node, level) {
      var child, i, len, ref;
      level || (level = 0);
      this.stream.write(this.space(level));
      this.stream.write('<!DOCTYPE ' + node.root().name);
      if (node.pubID && node.sysID) {
        this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
      } else if (node.sysID) {
        this.stream.write(' SYSTEM "' + node.sysID + '"');
      }
      if (node.children.length > 0) {
        this.stream.write(' [');
        this.stream.write(this.endline(node));
        ref = node.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          switch (false) {
            case !(child instanceof XMLDTDAttList):
              this.dtdAttList(child, level + 1);
              break;
            case !(child instanceof XMLDTDElement):
              this.dtdElement(child, level + 1);
              break;
            case !(child instanceof XMLDTDEntity):
              this.dtdEntity(child, level + 1);
              break;
            case !(child instanceof XMLDTDNotation):
              this.dtdNotation(child, level + 1);
              break;
            case !(child instanceof XMLCData):
              this.cdata(child, level + 1);
              break;
            case !(child instanceof XMLComment):
              this.comment(child, level + 1);
              break;
            case !(child instanceof XMLProcessingInstruction):
              this.processingInstruction(child, level + 1);
              break;
            default:
              throw new Error("Unknown DTD node type: " + child.constructor.name);
          }
        }
        this.stream.write(']');
      }
      this.stream.write(this.spacebeforeslash + '>');
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.element = function(node, level) {
      var att, child, i, len, name, ref, ref1, space;
      level || (level = 0);
      space = this.space(level);
      this.stream.write(space + '<' + node.name);
      ref = node.attributes;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        this.attribute(att);
      }
      if (node.children.length === 0 || node.children.every(function(e) {
        return e.value === '';
      })) {
        if (this.allowEmpty) {
          this.stream.write('></' + node.name + '>');
        } else {
          this.stream.write(this.spacebeforeslash + '/>');
        }
      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {
        this.stream.write('>');
        this.stream.write(node.children[0].value);
        this.stream.write('</' + node.name + '>');
      } else {
        this.stream.write('>' + this.newline);
        ref1 = node.children;
        for (i = 0, len = ref1.length; i < len; i++) {
          child = ref1[i];
          switch (false) {
            case !(child instanceof XMLCData):
              this.cdata(child, level + 1);
              break;
            case !(child instanceof XMLComment):
              this.comment(child, level + 1);
              break;
            case !(child instanceof XMLElement):
              this.element(child, level + 1);
              break;
            case !(child instanceof XMLRaw):
              this.raw(child, level + 1);
              break;
            case !(child instanceof XMLText):
              this.text(child, level + 1);
              break;
            case !(child instanceof XMLProcessingInstruction):
              this.processingInstruction(child, level + 1);
              break;
            default:
              throw new Error("Unknown XML node type: " + child.constructor.name);
          }
        }
        this.stream.write(space + '</' + node.name + '>');
      }
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.processingInstruction = function(node, level) {
      this.stream.write(this.space(level) + '<?' + node.target);
      if (node.value) {
        this.stream.write(' ' + node.value);
      }
      return this.stream.write(this.spacebeforeslash + '?>' + this.endline(node));
    };

    XMLStreamWriter.prototype.raw = function(node, level) {
      return this.stream.write(this.space(level) + node.value + this.endline(node));
    };

    XMLStreamWriter.prototype.text = function(node, level) {
      return this.stream.write(this.space(level) + node.value + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdAttList = function(node, level) {
      this.stream.write(this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType);
      if (node.defaultValueType !== '#DEFAULT') {
        this.stream.write(' ' + node.defaultValueType);
      }
      if (node.defaultValue) {
        this.stream.write(' "' + node.defaultValue + '"');
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdElement = function(node, level) {
      this.stream.write(this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value);
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdEntity = function(node, level) {
      this.stream.write(this.space(level) + '<!ENTITY');
      if (node.pe) {
        this.stream.write(' %');
      }
      this.stream.write(' ' + node.name);
      if (node.value) {
        this.stream.write(' "' + node.value + '"');
      } else {
        if (node.pubID && node.sysID) {
          this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
        } else if (node.sysID) {
          this.stream.write(' SYSTEM "' + node.sysID + '"');
        }
        if (node.nData) {
          this.stream.write(' NDATA ' + node.nData);
        }
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdNotation = function(node, level) {
      this.stream.write(this.space(level) + '<!NOTATION ' + node.name);
      if (node.pubID && node.sysID) {
        this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
      } else if (node.pubID) {
        this.stream.write(' PUBLIC "' + node.pubID + '"');
      } else if (node.sysID) {
        this.stream.write(' SYSTEM "' + node.sysID + '"');
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.endline = function(node) {
      if (!node.isLastRootNode) {
        return this.newline;
      } else {
        return '';
      }
    };

    return XMLStreamWriter;

  })(XMLWriterBase);

}).call(this);

},{"./XMLCData":10,"./XMLComment":11,"./XMLDTDAttList":12,"./XMLDTDElement":13,"./XMLDTDEntity":14,"./XMLDTDNotation":15,"./XMLDeclaration":16,"./XMLDocType":17,"./XMLElement":20,"./XMLProcessingInstruction":22,"./XMLRaw":23,"./XMLText":27,"./XMLWriterBase":28}],25:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLText, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLElement = require('./XMLElement');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLWriterBase = require('./XMLWriterBase');

  module.exports = XMLStringWriter = (function(superClass) {
    extend(XMLStringWriter, superClass);

    function XMLStringWriter(options) {
      XMLStringWriter.__super__.constructor.call(this, options);
    }

    XMLStringWriter.prototype.document = function(doc) {
      var child, i, len, r, ref;
      this.textispresent = false;
      r = '';
      ref = doc.children;
      for (i = 0, len = ref.length; i < len; i++) {
        child = ref[i];
        r += (function() {
          switch (false) {
            case !(child instanceof XMLDeclaration):
              return this.declaration(child);
            case !(child instanceof XMLDocType):
              return this.docType(child);
            case !(child instanceof XMLComment):
              return this.comment(child);
            case !(child instanceof XMLProcessingInstruction):
              return this.processingInstruction(child);
            default:
              return this.element(child, 0);
          }
        }).call(this);
      }
      if (this.pretty && r.slice(-this.newline.length) === this.newline) {
        r = r.slice(0, -this.newline.length);
      }
      return r;
    };

    XMLStringWriter.prototype.attribute = function(att) {
      return ' ' + att.name + '="' + att.value + '"';
    };

    XMLStringWriter.prototype.cdata = function(node, level) {
      return this.space(level) + '<![CDATA[' + node.text + ']]>' + this.newline;
    };

    XMLStringWriter.prototype.comment = function(node, level) {
      return this.space(level) + '<!-- ' + node.text + ' -->' + this.newline;
    };

    XMLStringWriter.prototype.declaration = function(node, level) {
      var r;
      r = this.space(level);
      r += '<?xml version="' + node.version + '"';
      if (node.encoding != null) {
        r += ' encoding="' + node.encoding + '"';
      }
      if (node.standalone != null) {
        r += ' standalone="' + node.standalone + '"';
      }
      r += this.spacebeforeslash + '?>';
      r += this.newline;
      return r;
    };

    XMLStringWriter.prototype.docType = function(node, level) {
      var child, i, len, r, ref;
      level || (level = 0);
      r = this.space(level);
      r += '<!DOCTYPE ' + node.root().name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      if (node.children.length > 0) {
        r += ' [';
        r += this.newline;
        ref = node.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          r += (function() {
            switch (false) {
              case !(child instanceof XMLDTDAttList):
                return this.dtdAttList(child, level + 1);
              case !(child instanceof XMLDTDElement):
                return this.dtdElement(child, level + 1);
              case !(child instanceof XMLDTDEntity):
                return this.dtdEntity(child, level + 1);
              case !(child instanceof XMLDTDNotation):
                return this.dtdNotation(child, level + 1);
              case !(child instanceof XMLCData):
                return this.cdata(child, level + 1);
              case !(child instanceof XMLComment):
                return this.comment(child, level + 1);
              case !(child instanceof XMLProcessingInstruction):
                return this.processingInstruction(child, level + 1);
              default:
                throw new Error("Unknown DTD node type: " + child.constructor.name);
            }
          }).call(this);
        }
        r += ']';
      }
      r += this.spacebeforeslash + '>';
      r += this.newline;
      return r;
    };

    XMLStringWriter.prototype.element = function(node, level) {
      var att, child, i, j, len, len1, name, r, ref, ref1, ref2, space, textispresentwasset;
      level || (level = 0);
      textispresentwasset = false;
      if (this.textispresent) {
        this.newline = '';
        this.pretty = false;
      } else {
        this.newline = this.newlinedefault;
        this.pretty = this.prettydefault;
      }
      space = this.space(level);
      r = '';
      r += space + '<' + node.name;
      ref = node.attributes;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        r += this.attribute(att);
      }
      if (node.children.length === 0 || node.children.every(function(e) {
        return e.value === '';
      })) {
        if (this.allowEmpty) {
          r += '></' + node.name + '>' + this.newline;
        } else {
          r += this.spacebeforeslash + '/>' + this.newline;
        }
      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {
        r += '>';
        r += node.children[0].value;
        r += '</' + node.name + '>' + this.newline;
      } else {
        if (this.dontprettytextnodes) {
          ref1 = node.children;
          for (i = 0, len = ref1.length; i < len; i++) {
            child = ref1[i];
            if (child.value != null) {
              this.textispresent++;
              textispresentwasset = true;
              break;
            }
          }
        }
        if (this.textispresent) {
          this.newline = '';
          this.pretty = false;
          space = this.space(level);
        }
        r += '>' + this.newline;
        ref2 = node.children;
        for (j = 0, len1 = ref2.length; j < len1; j++) {
          child = ref2[j];
          r += (function() {
            switch (false) {
              case !(child instanceof XMLCData):
                return this.cdata(child, level + 1);
              case !(child instanceof XMLComment):
                return this.comment(child, level + 1);
              case !(child instanceof XMLElement):
                return this.element(child, level + 1);
              case !(child instanceof XMLRaw):
                return this.raw(child, level + 1);
              case !(child instanceof XMLText):
                return this.text(child, level + 1);
              case !(child instanceof XMLProcessingInstruction):
                return this.processingInstruction(child, level + 1);
              default:
                throw new Error("Unknown XML node type: " + child.constructor.name);
            }
          }).call(this);
        }
        if (textispresentwasset) {
          this.textispresent--;
        }
        if (!this.textispresent) {
          this.newline = this.newlinedefault;
          this.pretty = this.prettydefault;
        }
        r += space + '</' + node.name + '>' + this.newline;
      }
      return r;
    };

    XMLStringWriter.prototype.processingInstruction = function(node, level) {
      var r;
      r = this.space(level) + '<?' + node.target;
      if (node.value) {
        r += ' ' + node.value;
      }
      r += this.spacebeforeslash + '?>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.raw = function(node, level) {
      return this.space(level) + node.value + this.newline;
    };

    XMLStringWriter.prototype.text = function(node, level) {
      return this.space(level) + node.value + this.newline;
    };

    XMLStringWriter.prototype.dtdAttList = function(node, level) {
      var r;
      r = this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType;
      if (node.defaultValueType !== '#DEFAULT') {
        r += ' ' + node.defaultValueType;
      }
      if (node.defaultValue) {
        r += ' "' + node.defaultValue + '"';
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.dtdElement = function(node, level) {
      return this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value + this.spacebeforeslash + '>' + this.newline;
    };

    XMLStringWriter.prototype.dtdEntity = function(node, level) {
      var r;
      r = this.space(level) + '<!ENTITY';
      if (node.pe) {
        r += ' %';
      }
      r += ' ' + node.name;
      if (node.value) {
        r += ' "' + node.value + '"';
      } else {
        if (node.pubID && node.sysID) {
          r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
        } else if (node.sysID) {
          r += ' SYSTEM "' + node.sysID + '"';
        }
        if (node.nData) {
          r += ' NDATA ' + node.nData;
        }
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.dtdNotation = function(node, level) {
      var r;
      r = this.space(level) + '<!NOTATION ' + node.name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.pubID) {
        r += ' PUBLIC "' + node.pubID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.openNode = function(node, level) {
      var att, name, r, ref;
      level || (level = 0);
      if (node instanceof XMLElement) {
        r = this.space(level) + '<' + node.name;
        ref = node.attributes;
        for (name in ref) {
          if (!hasProp.call(ref, name)) continue;
          att = ref[name];
          r += this.attribute(att);
        }
        r += (node.children ? '>' : '/>') + this.newline;
        return r;
      } else {
        r = this.space(level) + '<!DOCTYPE ' + node.rootNodeName;
        if (node.pubID && node.sysID) {
          r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
        } else if (node.sysID) {
          r += ' SYSTEM "' + node.sysID + '"';
        }
        r += (node.children ? ' [' : '>') + this.newline;
        return r;
      }
    };

    XMLStringWriter.prototype.closeNode = function(node, level) {
      level || (level = 0);
      switch (false) {
        case !(node instanceof XMLElement):
          return this.space(level) + '</' + node.name + '>' + this.newline;
        case !(node instanceof XMLDocType):
          return this.space(level) + ']>' + this.newline;
      }
    };

    return XMLStringWriter;

  })(XMLWriterBase);

}).call(this);

},{"./XMLCData":10,"./XMLComment":11,"./XMLDTDAttList":12,"./XMLDTDElement":13,"./XMLDTDEntity":14,"./XMLDTDNotation":15,"./XMLDeclaration":16,"./XMLDocType":17,"./XMLElement":20,"./XMLProcessingInstruction":22,"./XMLRaw":23,"./XMLText":27,"./XMLWriterBase":28}],26:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLStringifier,
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    hasProp = {}.hasOwnProperty;

  module.exports = XMLStringifier = (function() {
    function XMLStringifier(options) {
      this.assertLegalChar = bind(this.assertLegalChar, this);
      var key, ref, value;
      options || (options = {});
      this.noDoubleEncoding = options.noDoubleEncoding;
      ref = options.stringify || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this[key] = value;
      }
    }

    XMLStringifier.prototype.eleName = function(val) {
      val = '' + val || '';
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.eleText = function(val) {
      val = '' + val || '';
      return this.assertLegalChar(this.elEscape(val));
    };

    XMLStringifier.prototype.cdata = function(val) {
      val = '' + val || '';
      val = val.replace(']]>', ']]]]><![CDATA[>');
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.comment = function(val) {
      val = '' + val || '';
      if (val.match(/--/)) {
        throw new Error("Comment text cannot contain double-hypen: " + val);
      }
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.raw = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.attName = function(val) {
      return val = '' + val || '';
    };

    XMLStringifier.prototype.attValue = function(val) {
      val = '' + val || '';
      return this.attEscape(val);
    };

    XMLStringifier.prototype.insTarget = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.insValue = function(val) {
      val = '' + val || '';
      if (val.match(/\?>/)) {
        throw new Error("Invalid processing instruction value: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlVersion = function(val) {
      val = '' + val || '';
      if (!val.match(/1\.[0-9]+/)) {
        throw new Error("Invalid version number: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlEncoding = function(val) {
      val = '' + val || '';
      if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/)) {
        throw new Error("Invalid encoding: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlStandalone = function(val) {
      if (val) {
        return "yes";
      } else {
        return "no";
      }
    };

    XMLStringifier.prototype.dtdPubID = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdSysID = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdElementValue = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdAttType = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdAttDefault = function(val) {
      if (val != null) {
        return '' + val || '';
      } else {
        return val;
      }
    };

    XMLStringifier.prototype.dtdEntityValue = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdNData = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.convertAttKey = '@';

    XMLStringifier.prototype.convertPIKey = '?';

    XMLStringifier.prototype.convertTextKey = '#text';

    XMLStringifier.prototype.convertCDataKey = '#cdata';

    XMLStringifier.prototype.convertCommentKey = '#comment';

    XMLStringifier.prototype.convertRawKey = '#raw';

    XMLStringifier.prototype.assertLegalChar = function(str) {
      var res;
      res = str.match(/[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/);
      if (res) {
        throw new Error("Invalid character in string: " + str + " at index " + res.index);
      }
      return str;
    };

    XMLStringifier.prototype.elEscape = function(str) {
      var ampregex;
      ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\r/g, '&#xD;');
    };

    XMLStringifier.prototype.attEscape = function(str) {
      var ampregex;
      ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/\t/g, '&#x9;').replace(/\n/g, '&#xA;').replace(/\r/g, '&#xD;');
    };

    return XMLStringifier;

  })();

}).call(this);

},{}],27:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLText,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLText = (function(superClass) {
    extend(XMLText, superClass);

    function XMLText(parent, text) {
      XMLText.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing element text");
      }
      this.value = this.stringify.eleText(text);
    }

    XMLText.prototype.clone = function() {
      return Object.create(this);
    };

    XMLText.prototype.toString = function(options) {
      return this.options.writer.set(options).text(this);
    };

    return XMLText;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],28:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLWriterBase,
    hasProp = {}.hasOwnProperty;

  module.exports = XMLWriterBase = (function() {
    function XMLWriterBase(options) {
      var key, ref, ref1, ref2, ref3, ref4, ref5, ref6, value;
      options || (options = {});
      this.pretty = options.pretty || false;
      this.allowEmpty = (ref = options.allowEmpty) != null ? ref : false;
      if (this.pretty) {
        this.indent = (ref1 = options.indent) != null ? ref1 : '  ';
        this.newline = (ref2 = options.newline) != null ? ref2 : '\n';
        this.offset = (ref3 = options.offset) != null ? ref3 : 0;
        this.dontprettytextnodes = (ref4 = options.dontprettytextnodes) != null ? ref4 : 0;
      } else {
        this.indent = '';
        this.newline = '';
        this.offset = 0;
        this.dontprettytextnodes = 0;
      }
      this.spacebeforeslash = (ref5 = options.spacebeforeslash) != null ? ref5 : '';
      if (this.spacebeforeslash === true) {
        this.spacebeforeslash = ' ';
      }
      this.newlinedefault = this.newline;
      this.prettydefault = this.pretty;
      ref6 = options.writer || {};
      for (key in ref6) {
        if (!hasProp.call(ref6, key)) continue;
        value = ref6[key];
        this[key] = value;
      }
    }

    XMLWriterBase.prototype.set = function(options) {
      var key, ref, value;
      options || (options = {});
      if ("pretty" in options) {
        this.pretty = options.pretty;
      }
      if ("allowEmpty" in options) {
        this.allowEmpty = options.allowEmpty;
      }
      if (this.pretty) {
        this.indent = "indent" in options ? options.indent : '  ';
        this.newline = "newline" in options ? options.newline : '\n';
        this.offset = "offset" in options ? options.offset : 0;
        this.dontprettytextnodes = "dontprettytextnodes" in options ? options.dontprettytextnodes : 0;
      } else {
        this.indent = '';
        this.newline = '';
        this.offset = 0;
        this.dontprettytextnodes = 0;
      }
      this.spacebeforeslash = "spacebeforeslash" in options ? options.spacebeforeslash : '';
      if (this.spacebeforeslash === true) {
        this.spacebeforeslash = ' ';
      }
      this.newlinedefault = this.newline;
      this.prettydefault = this.pretty;
      ref = options.writer || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this[key] = value;
      }
      return this;
    };

    XMLWriterBase.prototype.space = function(level) {
      var indent;
      if (this.pretty) {
        indent = (level || 0) + this.offset + 1;
        if (indent > 0) {
          return new Array(indent).join(this.indent);
        } else {
          return '';
        }
      } else {
        return '';
      }
    };

    return XMLWriterBase;

  })();

}).call(this);

},{}],29:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDocument, XMLDocumentCB, XMLStreamWriter, XMLStringWriter, assign, isFunction, ref;

  ref = require('./Utility'), assign = ref.assign, isFunction = ref.isFunction;

  XMLDocument = require('./XMLDocument');

  XMLDocumentCB = require('./XMLDocumentCB');

  XMLStringWriter = require('./XMLStringWriter');

  XMLStreamWriter = require('./XMLStreamWriter');

  module.exports.create = function(name, xmldec, doctype, options) {
    var doc, root;
    if (name == null) {
      throw new Error("Root element needs a name");
    }
    options = assign({}, xmldec, doctype, options);
    doc = new XMLDocument(options);
    root = doc.element(name);
    if (!options.headless) {
      doc.declaration(options);
      if ((options.pubID != null) || (options.sysID != null)) {
        doc.doctype(options);
      }
    }
    return root;
  };

  module.exports.begin = function(options, onData, onEnd) {
    var ref1;
    if (isFunction(options)) {
      ref1 = [options, onData], onData = ref1[0], onEnd = ref1[1];
      options = {};
    }
    if (onData) {
      return new XMLDocumentCB(options, onData, onEnd);
    } else {
      return new XMLDocument(options);
    }
  };

  module.exports.stringWriter = function(options) {
    return new XMLStringWriter(options);
  };

  module.exports.streamWriter = function(stream, options) {
    return new XMLStreamWriter(stream, options);
  };

}).call(this);

},{"./Utility":8,"./XMLDocument":18,"./XMLDocumentCB":19,"./XMLStreamWriter":24,"./XMLStringWriter":25}],30:[function(require,module,exports){
function DOMParser(options){
	this.options = options ||{locator:{}};
	
}
DOMParser.prototype.parseFromString = function(source,mimeType){
	var options = this.options;
	var sax =  new XMLReader();
	var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
	var errorHandler = options.errorHandler;
	var locator = options.locator;
	var defaultNSMap = options.xmlns||{};
	var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
	if(locator){
		domBuilder.setDocumentLocator(locator)
	}
	
	sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
	sax.domBuilder = options.domBuilder || domBuilder;
	if(/\/x?html?$/.test(mimeType)){
		entityMap.nbsp = '\xa0';
		entityMap.copy = '\xa9';
		defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
	}
	defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
	if(source){
		sax.parse(source,defaultNSMap,entityMap);
	}else{
		sax.errorHandler.error("invalid doc source");
	}
	return domBuilder.doc;
}
function buildErrorHandler(errorImpl,domBuilder,locator){
	if(!errorImpl){
		if(domBuilder instanceof DOMHandler){
			return domBuilder;
		}
		errorImpl = domBuilder ;
	}
	var errorHandler = {}
	var isCallback = errorImpl instanceof Function;
	locator = locator||{}
	function build(key){
		var fn = errorImpl[key];
		if(!fn && isCallback){
			fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
		}
		errorHandler[key] = fn && function(msg){
			fn('[xmldom '+key+']\t'+msg+_locator(locator));
		}||function(){};
	}
	build('warning');
	build('error');
	build('fatalError');
	return errorHandler;
}

//console.log('#\n\n\n\n\n\n\n####')
/**
 * +ContentHandler+ErrorHandler
 * +LexicalHandler+EntityResolver2
 * -DeclHandler-DTDHandler 
 * 
 * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
 * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
 * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
 */
function DOMHandler() {
    this.cdata = false;
}
function position(locator,node){
	node.lineNumber = locator.lineNumber;
	node.columnNumber = locator.columnNumber;
}
/**
 * @see org.xml.sax.ContentHandler#startDocument
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
 */ 
DOMHandler.prototype = {
	startDocument : function() {
    	this.doc = new DOMImplementation().createDocument(null, null, null);
    	if (this.locator) {
        	this.doc.documentURI = this.locator.systemId;
    	}
	},
	startElement:function(namespaceURI, localName, qName, attrs) {
		var doc = this.doc;
	    var el = doc.createElementNS(namespaceURI, qName||localName);
	    var len = attrs.length;
	    appendElement(this, el);
	    this.currentElement = el;
	    
		this.locator && position(this.locator,el)
	    for (var i = 0 ; i < len; i++) {
	        var namespaceURI = attrs.getURI(i);
	        var value = attrs.getValue(i);
	        var qName = attrs.getQName(i);
			var attr = doc.createAttributeNS(namespaceURI, qName);
			this.locator &&position(attrs.getLocator(i),attr);
			attr.value = attr.nodeValue = value;
			el.setAttributeNode(attr)
	    }
	},
	endElement:function(namespaceURI, localName, qName) {
		var current = this.currentElement
		var tagName = current.tagName;
		this.currentElement = current.parentNode;
	},
	startPrefixMapping:function(prefix, uri) {
	},
	endPrefixMapping:function(prefix) {
	},
	processingInstruction:function(target, data) {
	    var ins = this.doc.createProcessingInstruction(target, data);
	    this.locator && position(this.locator,ins)
	    appendElement(this, ins);
	},
	ignorableWhitespace:function(ch, start, length) {
	},
	characters:function(chars, start, length) {
		chars = _toString.apply(this,arguments)
		//console.log(chars)
		if(chars){
			if (this.cdata) {
				var charNode = this.doc.createCDATASection(chars);
			} else {
				var charNode = this.doc.createTextNode(chars);
			}
			if(this.currentElement){
				this.currentElement.appendChild(charNode);
			}else if(/^\s*$/.test(chars)){
				this.doc.appendChild(charNode);
				//process xml
			}
			this.locator && position(this.locator,charNode)
		}
	},
	skippedEntity:function(name) {
	},
	endDocument:function() {
		this.doc.normalize();
	},
	setDocumentLocator:function (locator) {
	    if(this.locator = locator){// && !('lineNumber' in locator)){
	    	locator.lineNumber = 0;
	    }
	},
	//LexicalHandler
	comment:function(chars, start, length) {
		chars = _toString.apply(this,arguments)
	    var comm = this.doc.createComment(chars);
	    this.locator && position(this.locator,comm)
	    appendElement(this, comm);
	},
	
	startCDATA:function() {
	    //used in characters() methods
	    this.cdata = true;
	},
	endCDATA:function() {
	    this.cdata = false;
	},
	
	startDTD:function(name, publicId, systemId) {
		var impl = this.doc.implementation;
	    if (impl && impl.createDocumentType) {
	        var dt = impl.createDocumentType(name, publicId, systemId);
	        this.locator && position(this.locator,dt)
	        appendElement(this, dt);
	    }
	},
	/**
	 * @see org.xml.sax.ErrorHandler
	 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
	 */
	warning:function(error) {
		console.warn('[xmldom warning]\t'+error,_locator(this.locator));
	},
	error:function(error) {
		console.error('[xmldom error]\t'+error,_locator(this.locator));
	},
	fatalError:function(error) {
		console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
	    throw error;
	}
}
function _locator(l){
	if(l){
		return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
	}
}
function _toString(chars,start,length){
	if(typeof chars == 'string'){
		return chars.substr(start,length)
	}else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
		if(chars.length >= start+length || start){
			return new java.lang.String(chars,start,length)+'';
		}
		return chars;
	}
}

/*
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
 * used method of org.xml.sax.ext.LexicalHandler:
 *  #comment(chars, start, length)
 *  #startCDATA()
 *  #endCDATA()
 *  #startDTD(name, publicId, systemId)
 *
 *
 * IGNORED method of org.xml.sax.ext.LexicalHandler:
 *  #endDTD()
 *  #startEntity(name)
 *  #endEntity(name)
 *
 *
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
 * IGNORED method of org.xml.sax.ext.DeclHandler
 * 	#attributeDecl(eName, aName, type, mode, value)
 *  #elementDecl(name, model)
 *  #externalEntityDecl(name, publicId, systemId)
 *  #internalEntityDecl(name, value)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
 * IGNORED method of org.xml.sax.EntityResolver2
 *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
 *  #resolveEntity(publicId, systemId)
 *  #getExternalSubset(name, baseURI)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
 * IGNORED method of org.xml.sax.DTDHandler
 *  #notationDecl(name, publicId, systemId) {};
 *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
 */
"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
	DOMHandler.prototype[key] = function(){return null}
})

/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
function appendElement (hander,node) {
    if (!hander.currentElement) {
        hander.doc.appendChild(node);
    } else {
        hander.currentElement.appendChild(node);
    }
}//appendChild and setAttributeNS are preformance key

//if(typeof require == 'function'){
	var XMLReader = require('./sax').XMLReader;
	var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;
	exports.XMLSerializer = require('./dom').XMLSerializer ;
	exports.DOMParser = DOMParser;
//}

},{"./dom":31,"./sax":32}],31:[function(require,module,exports){
/*
 * DOM Level 2
 * Object DOMException
 * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
 */

function copy(src,dest){
	for(var p in src){
		dest[p] = src[p];
	}
}
/**
^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
 */
function _extends(Class,Super){
	var pt = Class.prototype;
	if(Object.create){
		var ppt = Object.create(Super.prototype)
		pt.__proto__ = ppt;
	}
	if(!(pt instanceof Super)){
		function t(){};
		t.prototype = Super.prototype;
		t = new t();
		copy(pt,t);
		Class.prototype = pt = t;
	}
	if(pt.constructor != Class){
		if(typeof Class != 'function'){
			console.error("unknow Class:"+Class)
		}
		pt.constructor = Class
	}
}
var htmlns = 'http://www.w3.org/1999/xhtml' ;
// Node Types
var NodeType = {}
var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;

// ExceptionCode
var ExceptionCode = {}
var ExceptionMessage = {};
var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
//level2
var INVALID_STATE_ERR        	= ExceptionCode.INVALID_STATE_ERR        	= ((ExceptionMessage[11]="Invalid state"),11);
var SYNTAX_ERR               	= ExceptionCode.SYNTAX_ERR               	= ((ExceptionMessage[12]="Syntax error"),12);
var INVALID_MODIFICATION_ERR 	= ExceptionCode.INVALID_MODIFICATION_ERR 	= ((ExceptionMessage[13]="Invalid modification"),13);
var NAMESPACE_ERR            	= ExceptionCode.NAMESPACE_ERR           	= ((ExceptionMessage[14]="Invalid namespace"),14);
var INVALID_ACCESS_ERR       	= ExceptionCode.INVALID_ACCESS_ERR      	= ((ExceptionMessage[15]="Invalid access"),15);


function DOMException(code, message) {
	if(message instanceof Error){
		var error = message;
	}else{
		error = this;
		Error.call(this, ExceptionMessage[code]);
		this.message = ExceptionMessage[code];
		if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
	}
	error.code = code;
	if(message) this.message = this.message + ": " + message;
	return error;
};
DOMException.prototype = Error.prototype;
copy(ExceptionCode,DOMException)
/**
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
 * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
 * The items in the NodeList are accessible via an integral index, starting from 0.
 */
function NodeList() {
};
NodeList.prototype = {
	/**
	 * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
	 * @standard level1
	 */
	length:0, 
	/**
	 * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
	 * @standard level1
	 * @param index  unsigned long 
	 *   Index into the collection.
	 * @return Node
	 * 	The node at the indexth position in the NodeList, or null if that is not a valid index. 
	 */
	item: function(index) {
		return this[index] || null;
	},
	toString:function(isHTML,nodeFilter){
		for(var buf = [], i = 0;i<this.length;i++){
			serializeToString(this[i],buf,isHTML,nodeFilter);
		}
		return buf.join('');
	}
};
function LiveNodeList(node,refresh){
	this._node = node;
	this._refresh = refresh
	_updateLiveList(this);
}
function _updateLiveList(list){
	var inc = list._node._inc || list._node.ownerDocument._inc;
	if(list._inc != inc){
		var ls = list._refresh(list._node);
		//console.log(ls.length)
		__set__(list,'length',ls.length);
		copy(ls,list);
		list._inc = inc;
	}
}
LiveNodeList.prototype.item = function(i){
	_updateLiveList(this);
	return this[i];
}

_extends(LiveNodeList,NodeList);
/**
 * 
 * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
 * NamedNodeMap objects in the DOM are live.
 * used for attributes or DocumentType entities 
 */
function NamedNodeMap() {
};

function _findNodeIndex(list,node){
	var i = list.length;
	while(i--){
		if(list[i] === node){return i}
	}
}

function _addNamedNode(el,list,newAttr,oldAttr){
	if(oldAttr){
		list[_findNodeIndex(list,oldAttr)] = newAttr;
	}else{
		list[list.length++] = newAttr;
	}
	if(el){
		newAttr.ownerElement = el;
		var doc = el.ownerDocument;
		if(doc){
			oldAttr && _onRemoveAttribute(doc,el,oldAttr);
			_onAddAttribute(doc,el,newAttr);
		}
	}
}
function _removeNamedNode(el,list,attr){
	//console.log('remove attr:'+attr)
	var i = _findNodeIndex(list,attr);
	if(i>=0){
		var lastIndex = list.length-1
		while(i<lastIndex){
			list[i] = list[++i]
		}
		list.length = lastIndex;
		if(el){
			var doc = el.ownerDocument;
			if(doc){
				_onRemoveAttribute(doc,el,attr);
				attr.ownerElement = null;
			}
		}
	}else{
		throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
	}
}
NamedNodeMap.prototype = {
	length:0,
	item:NodeList.prototype.item,
	getNamedItem: function(key) {
//		if(key.indexOf(':')>0 || key == 'xmlns'){
//			return null;
//		}
		//console.log()
		var i = this.length;
		while(i--){
			var attr = this[i];
			//console.log(attr.nodeName,key)
			if(attr.nodeName == key){
				return attr;
			}
		}
	},
	setNamedItem: function(attr) {
		var el = attr.ownerElement;
		if(el && el!=this._ownerElement){
			throw new DOMException(INUSE_ATTRIBUTE_ERR);
		}
		var oldAttr = this.getNamedItem(attr.nodeName);
		_addNamedNode(this._ownerElement,this,attr,oldAttr);
		return oldAttr;
	},
	/* returns Node */
	setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
		var el = attr.ownerElement, oldAttr;
		if(el && el!=this._ownerElement){
			throw new DOMException(INUSE_ATTRIBUTE_ERR);
		}
		oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
		_addNamedNode(this._ownerElement,this,attr,oldAttr);
		return oldAttr;
	},

	/* returns Node */
	removeNamedItem: function(key) {
		var attr = this.getNamedItem(key);
		_removeNamedNode(this._ownerElement,this,attr);
		return attr;
		
		
	},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
	
	//for level2
	removeNamedItemNS:function(namespaceURI,localName){
		var attr = this.getNamedItemNS(namespaceURI,localName);
		_removeNamedNode(this._ownerElement,this,attr);
		return attr;
	},
	getNamedItemNS: function(namespaceURI, localName) {
		var i = this.length;
		while(i--){
			var node = this[i];
			if(node.localName == localName && node.namespaceURI == namespaceURI){
				return node;
			}
		}
		return null;
	}
};
/**
 * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
 */
function DOMImplementation(/* Object */ features) {
	this._features = {};
	if (features) {
		for (var feature in features) {
			 this._features = features[feature];
		}
	}
};

DOMImplementation.prototype = {
	hasFeature: function(/* string */ feature, /* string */ version) {
		var versions = this._features[feature.toLowerCase()];
		if (versions && (!version || version in versions)) {
			return true;
		} else {
			return false;
		}
	},
	// Introduced in DOM Level 2:
	createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
		var doc = new Document();
		doc.implementation = this;
		doc.childNodes = new NodeList();
		doc.doctype = doctype;
		if(doctype){
			doc.appendChild(doctype);
		}
		if(qualifiedName){
			var root = doc.createElementNS(namespaceURI,qualifiedName);
			doc.appendChild(root);
		}
		return doc;
	},
	// Introduced in DOM Level 2:
	createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
		var node = new DocumentType();
		node.name = qualifiedName;
		node.nodeName = qualifiedName;
		node.publicId = publicId;
		node.systemId = systemId;
		// Introduced in DOM Level 2:
		//readonly attribute DOMString        internalSubset;
		
		//TODO:..
		//  readonly attribute NamedNodeMap     entities;
		//  readonly attribute NamedNodeMap     notations;
		return node;
	}
};


/**
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
 */

function Node() {
};

Node.prototype = {
	firstChild : null,
	lastChild : null,
	previousSibling : null,
	nextSibling : null,
	attributes : null,
	parentNode : null,
	childNodes : null,
	ownerDocument : null,
	nodeValue : null,
	namespaceURI : null,
	prefix : null,
	localName : null,
	// Modified in DOM Level 2:
	insertBefore:function(newChild, refChild){//raises 
		return _insertBefore(this,newChild,refChild);
	},
	replaceChild:function(newChild, oldChild){//raises 
		this.insertBefore(newChild,oldChild);
		if(oldChild){
			this.removeChild(oldChild);
		}
	},
	removeChild:function(oldChild){
		return _removeChild(this,oldChild);
	},
	appendChild:function(newChild){
		return this.insertBefore(newChild,null);
	},
	hasChildNodes:function(){
		return this.firstChild != null;
	},
	cloneNode:function(deep){
		return cloneNode(this.ownerDocument||this,this,deep);
	},
	// Modified in DOM Level 2:
	normalize:function(){
		var child = this.firstChild;
		while(child){
			var next = child.nextSibling;
			if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
				this.removeChild(next);
				child.appendData(next.data);
			}else{
				child.normalize();
				child = next;
			}
		}
	},
  	// Introduced in DOM Level 2:
	isSupported:function(feature, version){
		return this.ownerDocument.implementation.hasFeature(feature,version);
	},
    // Introduced in DOM Level 2:
    hasAttributes:function(){
    	return this.attributes.length>0;
    },
    lookupPrefix:function(namespaceURI){
    	var el = this;
    	while(el){
    		var map = el._nsMap;
    		//console.dir(map)
    		if(map){
    			for(var n in map){
    				if(map[n] == namespaceURI){
    					return n;
    				}
    			}
    		}
    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
    	}
    	return null;
    },
    // Introduced in DOM Level 3:
    lookupNamespaceURI:function(prefix){
    	var el = this;
    	while(el){
    		var map = el._nsMap;
    		//console.dir(map)
    		if(map){
    			if(prefix in map){
    				return map[prefix] ;
    			}
    		}
    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
    	}
    	return null;
    },
    // Introduced in DOM Level 3:
    isDefaultNamespace:function(namespaceURI){
    	var prefix = this.lookupPrefix(namespaceURI);
    	return prefix == null;
    }
};


function _xmlEncoder(c){
	return c == '<' && '&lt;' ||
         c == '>' && '&gt;' ||
         c == '&' && '&amp;' ||
         c == '"' && '&quot;' ||
         '&#'+c.charCodeAt()+';'
}


copy(NodeType,Node);
copy(NodeType,Node.prototype);

/**
 * @param callback return true for continue,false for break
 * @return boolean true: break visit;
 */
function _visitNode(node,callback){
	if(callback(node)){
		return true;
	}
	if(node = node.firstChild){
		do{
			if(_visitNode(node,callback)){return true}
        }while(node=node.nextSibling)
    }
}



function Document(){
}
function _onAddAttribute(doc,el,newAttr){
	doc && doc._inc++;
	var ns = newAttr.namespaceURI ;
	if(ns == 'http://www.w3.org/2000/xmlns/'){
		//update namespace
		el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value
	}
}
function _onRemoveAttribute(doc,el,newAttr,remove){
	doc && doc._inc++;
	var ns = newAttr.namespaceURI ;
	if(ns == 'http://www.w3.org/2000/xmlns/'){
		//update namespace
		delete el._nsMap[newAttr.prefix?newAttr.localName:'']
	}
}
function _onUpdateChild(doc,el,newChild){
	if(doc && doc._inc){
		doc._inc++;
		//update childNodes
		var cs = el.childNodes;
		if(newChild){
			cs[cs.length++] = newChild;
		}else{
			//console.log(1)
			var child = el.firstChild;
			var i = 0;
			while(child){
				cs[i++] = child;
				child =child.nextSibling;
			}
			cs.length = i;
		}
	}
}

/**
 * attributes;
 * children;
 * 
 * writeable properties:
 * nodeValue,Attr:value,CharacterData:data
 * prefix
 */
function _removeChild(parentNode,child){
	var previous = child.previousSibling;
	var next = child.nextSibling;
	if(previous){
		previous.nextSibling = next;
	}else{
		parentNode.firstChild = next
	}
	if(next){
		next.previousSibling = previous;
	}else{
		parentNode.lastChild = previous;
	}
	_onUpdateChild(parentNode.ownerDocument,parentNode);
	return child;
}
/**
 * preformance key(refChild == null)
 */
function _insertBefore(parentNode,newChild,nextChild){
	var cp = newChild.parentNode;
	if(cp){
		cp.removeChild(newChild);//remove and update
	}
	if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
		var newFirst = newChild.firstChild;
		if (newFirst == null) {
			return newChild;
		}
		var newLast = newChild.lastChild;
	}else{
		newFirst = newLast = newChild;
	}
	var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;

	newFirst.previousSibling = pre;
	newLast.nextSibling = nextChild;
	
	
	if(pre){
		pre.nextSibling = newFirst;
	}else{
		parentNode.firstChild = newFirst;
	}
	if(nextChild == null){
		parentNode.lastChild = newLast;
	}else{
		nextChild.previousSibling = newLast;
	}
	do{
		newFirst.parentNode = parentNode;
	}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
	_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
	//console.log(parentNode.lastChild.nextSibling == null)
	if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
		newChild.firstChild = newChild.lastChild = null;
	}
	return newChild;
}
function _appendSingleChild(parentNode,newChild){
	var cp = newChild.parentNode;
	if(cp){
		var pre = parentNode.lastChild;
		cp.removeChild(newChild);//remove and update
		var pre = parentNode.lastChild;
	}
	var pre = parentNode.lastChild;
	newChild.parentNode = parentNode;
	newChild.previousSibling = pre;
	newChild.nextSibling = null;
	if(pre){
		pre.nextSibling = newChild;
	}else{
		parentNode.firstChild = newChild;
	}
	parentNode.lastChild = newChild;
	_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
	return newChild;
	//console.log("__aa",parentNode.lastChild.nextSibling == null)
}
Document.prototype = {
	//implementation : null,
	nodeName :  '#document',
	nodeType :  DOCUMENT_NODE,
	doctype :  null,
	documentElement :  null,
	_inc : 1,
	
	insertBefore :  function(newChild, refChild){//raises 
		if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
			var child = newChild.firstChild;
			while(child){
				var next = child.nextSibling;
				this.insertBefore(child,refChild);
				child = next;
			}
			return newChild;
		}
		if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
			this.documentElement = newChild;
		}
		
		return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
	},
	removeChild :  function(oldChild){
		if(this.documentElement == oldChild){
			this.documentElement = null;
		}
		return _removeChild(this,oldChild);
	},
	// Introduced in DOM Level 2:
	importNode : function(importedNode,deep){
		return importNode(this,importedNode,deep);
	},
	// Introduced in DOM Level 2:
	getElementById :	function(id){
		var rtv = null;
		_visitNode(this.documentElement,function(node){
			if(node.nodeType == ELEMENT_NODE){
				if(node.getAttribute('id') == id){
					rtv = node;
					return true;
				}
			}
		})
		return rtv;
	},
	
	//document factory method:
	createElement :	function(tagName){
		var node = new Element();
		node.ownerDocument = this;
		node.nodeName = tagName;
		node.tagName = tagName;
		node.childNodes = new NodeList();
		var attrs	= node.attributes = new NamedNodeMap();
		attrs._ownerElement = node;
		return node;
	},
	createDocumentFragment :	function(){
		var node = new DocumentFragment();
		node.ownerDocument = this;
		node.childNodes = new NodeList();
		return node;
	},
	createTextNode :	function(data){
		var node = new Text();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createComment :	function(data){
		var node = new Comment();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createCDATASection :	function(data){
		var node = new CDATASection();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createProcessingInstruction :	function(target,data){
		var node = new ProcessingInstruction();
		node.ownerDocument = this;
		node.tagName = node.target = target;
		node.nodeValue= node.data = data;
		return node;
	},
	createAttribute :	function(name){
		var node = new Attr();
		node.ownerDocument	= this;
		node.name = name;
		node.nodeName	= name;
		node.localName = name;
		node.specified = true;
		return node;
	},
	createEntityReference :	function(name){
		var node = new EntityReference();
		node.ownerDocument	= this;
		node.nodeName	= name;
		return node;
	},
	// Introduced in DOM Level 2:
	createElementNS :	function(namespaceURI,qualifiedName){
		var node = new Element();
		var pl = qualifiedName.split(':');
		var attrs	= node.attributes = new NamedNodeMap();
		node.childNodes = new NodeList();
		node.ownerDocument = this;
		node.nodeName = qualifiedName;
		node.tagName = qualifiedName;
		node.namespaceURI = namespaceURI;
		if(pl.length == 2){
			node.prefix = pl[0];
			node.localName = pl[1];
		}else{
			//el.prefix = null;
			node.localName = qualifiedName;
		}
		attrs._ownerElement = node;
		return node;
	},
	// Introduced in DOM Level 2:
	createAttributeNS :	function(namespaceURI,qualifiedName){
		var node = new Attr();
		var pl = qualifiedName.split(':');
		node.ownerDocument = this;
		node.nodeName = qualifiedName;
		node.name = qualifiedName;
		node.namespaceURI = namespaceURI;
		node.specified = true;
		if(pl.length == 2){
			node.prefix = pl[0];
			node.localName = pl[1];
		}else{
			//el.prefix = null;
			node.localName = qualifiedName;
		}
		return node;
	}
};
_extends(Document,Node);


function Element() {
	this._nsMap = {};
};
Element.prototype = {
	nodeType : ELEMENT_NODE,
	hasAttribute : function(name){
		return this.getAttributeNode(name)!=null;
	},
	getAttribute : function(name){
		var attr = this.getAttributeNode(name);
		return attr && attr.value || '';
	},
	getAttributeNode : function(name){
		return this.attributes.getNamedItem(name);
	},
	setAttribute : function(name, value){
		var attr = this.ownerDocument.createAttribute(name);
		attr.value = attr.nodeValue = "" + value;
		this.setAttributeNode(attr)
	},
	removeAttribute : function(name){
		var attr = this.getAttributeNode(name)
		attr && this.removeAttributeNode(attr);
	},
	
	//four real opeartion method
	appendChild:function(newChild){
		if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
			return this.insertBefore(newChild,null);
		}else{
			return _appendSingleChild(this,newChild);
		}
	},
	setAttributeNode : function(newAttr){
		return this.attributes.setNamedItem(newAttr);
	},
	setAttributeNodeNS : function(newAttr){
		return this.attributes.setNamedItemNS(newAttr);
	},
	removeAttributeNode : function(oldAttr){
		//console.log(this == oldAttr.ownerElement)
		return this.attributes.removeNamedItem(oldAttr.nodeName);
	},
	//get real attribute name,and remove it by removeAttributeNode
	removeAttributeNS : function(namespaceURI, localName){
		var old = this.getAttributeNodeNS(namespaceURI, localName);
		old && this.removeAttributeNode(old);
	},
	
	hasAttributeNS : function(namespaceURI, localName){
		return this.getAttributeNodeNS(namespaceURI, localName)!=null;
	},
	getAttributeNS : function(namespaceURI, localName){
		var attr = this.getAttributeNodeNS(namespaceURI, localName);
		return attr && attr.value || '';
	},
	setAttributeNS : function(namespaceURI, qualifiedName, value){
		var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
		attr.value = attr.nodeValue = "" + value;
		this.setAttributeNode(attr)
	},
	getAttributeNodeNS : function(namespaceURI, localName){
		return this.attributes.getNamedItemNS(namespaceURI, localName);
	},
	
	getElementsByTagName : function(tagName){
		return new LiveNodeList(this,function(base){
			var ls = [];
			_visitNode(base,function(node){
				if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
					ls.push(node);
				}
			});
			return ls;
		});
	},
	getElementsByTagNameNS : function(namespaceURI, localName){
		return new LiveNodeList(this,function(base){
			var ls = [];
			_visitNode(base,function(node){
				if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
					ls.push(node);
				}
			});
			return ls;
			
		});
	}
};
Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;


_extends(Element,Node);
function Attr() {
};
Attr.prototype.nodeType = ATTRIBUTE_NODE;
_extends(Attr,Node);


function CharacterData() {
};
CharacterData.prototype = {
	data : '',
	substringData : function(offset, count) {
		return this.data.substring(offset, offset+count);
	},
	appendData: function(text) {
		text = this.data+text;
		this.nodeValue = this.data = text;
		this.length = text.length;
	},
	insertData: function(offset,text) {
		this.replaceData(offset,0,text);
	
	},
	appendChild:function(newChild){
		throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
	},
	deleteData: function(offset, count) {
		this.replaceData(offset,count,"");
	},
	replaceData: function(offset, count, text) {
		var start = this.data.substring(0,offset);
		var end = this.data.substring(offset+count);
		text = start + text + end;
		this.nodeValue = this.data = text;
		this.length = text.length;
	}
}
_extends(CharacterData,Node);
function Text() {
};
Text.prototype = {
	nodeName : "#text",
	nodeType : TEXT_NODE,
	splitText : function(offset) {
		var text = this.data;
		var newText = text.substring(offset);
		text = text.substring(0, offset);
		this.data = this.nodeValue = text;
		this.length = text.length;
		var newNode = this.ownerDocument.createTextNode(newText);
		if(this.parentNode){
			this.parentNode.insertBefore(newNode, this.nextSibling);
		}
		return newNode;
	}
}
_extends(Text,CharacterData);
function Comment() {
};
Comment.prototype = {
	nodeName : "#comment",
	nodeType : COMMENT_NODE
}
_extends(Comment,CharacterData);

function CDATASection() {
};
CDATASection.prototype = {
	nodeName : "#cdata-section",
	nodeType : CDATA_SECTION_NODE
}
_extends(CDATASection,CharacterData);


function DocumentType() {
};
DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
_extends(DocumentType,Node);

function Notation() {
};
Notation.prototype.nodeType = NOTATION_NODE;
_extends(Notation,Node);

function Entity() {
};
Entity.prototype.nodeType = ENTITY_NODE;
_extends(Entity,Node);

function EntityReference() {
};
EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
_extends(EntityReference,Node);

function DocumentFragment() {
};
DocumentFragment.prototype.nodeName =	"#document-fragment";
DocumentFragment.prototype.nodeType =	DOCUMENT_FRAGMENT_NODE;
_extends(DocumentFragment,Node);


function ProcessingInstruction() {
}
ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
_extends(ProcessingInstruction,Node);
function XMLSerializer(){}
XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){
	return nodeSerializeToString.call(node,isHtml,nodeFilter);
}
Node.prototype.toString = nodeSerializeToString;
function nodeSerializeToString(isHtml,nodeFilter){
	var buf = [];
	var refNode = this.nodeType == 9?this.documentElement:this;
	var prefix = refNode.prefix;
	var uri = refNode.namespaceURI;
	
	if(uri && prefix == null){
		//console.log(prefix)
		var prefix = refNode.lookupPrefix(uri);
		if(prefix == null){
			//isHTML = true;
			var visibleNamespaces=[
			{namespace:uri,prefix:null}
			//{namespace:uri,prefix:''}
			]
		}
	}
	serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
	//console.log('###',this.nodeType,uri,prefix,buf.join(''))
	return buf.join('');
}
function needNamespaceDefine(node,isHTML, visibleNamespaces) {
	var prefix = node.prefix||'';
	var uri = node.namespaceURI;
	if (!prefix && !uri){
		return false;
	}
	if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
		|| uri == 'http://www.w3.org/2000/xmlns/'){
		return false;
	}
	
	var i = visibleNamespaces.length 
	//console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
	while (i--) {
		var ns = visibleNamespaces[i];
		// get namespace prefix
		//console.log(node.nodeType,node.tagName,ns.prefix,prefix)
		if (ns.prefix == prefix){
			return ns.namespace != uri;
		}
	}
	//console.log(isHTML,uri,prefix=='')
	//if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
	//	return false;
	//}
	//node.flag = '11111'
	//console.error(3,true,node.flag,node.prefix,node.namespaceURI)
	return true;
}
function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
	if(nodeFilter){
		node = nodeFilter(node);
		if(node){
			if(typeof node == 'string'){
				buf.push(node);
				return;
			}
		}else{
			return;
		}
		//buf.sort.apply(attrs, attributeSorter);
	}
	switch(node.nodeType){
	case ELEMENT_NODE:
		if (!visibleNamespaces) visibleNamespaces = [];
		var startVisibleNamespaces = visibleNamespaces.length;
		var attrs = node.attributes;
		var len = attrs.length;
		var child = node.firstChild;
		var nodeName = node.tagName;
		
		isHTML =  (htmlns === node.namespaceURI) ||isHTML 
		buf.push('<',nodeName);
		
		
		
		for(var i=0;i<len;i++){
			// add namespaces for attributes
			var attr = attrs.item(i);
			if (attr.prefix == 'xmlns') {
				visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
			}else if(attr.nodeName == 'xmlns'){
				visibleNamespaces.push({ prefix: '', namespace: attr.value });
			}
		}
		for(var i=0;i<len;i++){
			var attr = attrs.item(i);
			if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
				var prefix = attr.prefix||'';
				var uri = attr.namespaceURI;
				var ns = prefix ? ' xmlns:' + prefix : " xmlns";
				buf.push(ns, '="' , uri , '"');
				visibleNamespaces.push({ prefix: prefix, namespace:uri });
			}
			serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
		}
		// add namespace for current node		
		if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
			var prefix = node.prefix||'';
			var uri = node.namespaceURI;
			var ns = prefix ? ' xmlns:' + prefix : " xmlns";
			buf.push(ns, '="' , uri , '"');
			visibleNamespaces.push({ prefix: prefix, namespace:uri });
		}
		
		if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
			buf.push('>');
			//if is cdata child node
			if(isHTML && /^script$/i.test(nodeName)){
				while(child){
					if(child.data){
						buf.push(child.data);
					}else{
						serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
					}
					child = child.nextSibling;
				}
			}else
			{
				while(child){
					serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
					child = child.nextSibling;
				}
			}
			buf.push('</',nodeName,'>');
		}else{
			buf.push('/>');
		}
		// remove added visible namespaces
		//visibleNamespaces.length = startVisibleNamespaces;
		return;
	case DOCUMENT_NODE:
	case DOCUMENT_FRAGMENT_NODE:
		var child = node.firstChild;
		while(child){
			serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
			child = child.nextSibling;
		}
		return;
	case ATTRIBUTE_NODE:
		return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
	case TEXT_NODE:
		return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
	case CDATA_SECTION_NODE:
		return buf.push( '<![CDATA[',node.data,']]>');
	case COMMENT_NODE:
		return buf.push( "<!--",node.data,"-->");
	case DOCUMENT_TYPE_NODE:
		var pubid = node.publicId;
		var sysid = node.systemId;
		buf.push('<!DOCTYPE ',node.name);
		if(pubid){
			buf.push(' PUBLIC "',pubid);
			if (sysid && sysid!='.') {
				buf.push( '" "',sysid);
			}
			buf.push('">');
		}else if(sysid && sysid!='.'){
			buf.push(' SYSTEM "',sysid,'">');
		}else{
			var sub = node.internalSubset;
			if(sub){
				buf.push(" [",sub,"]");
			}
			buf.push(">");
		}
		return;
	case PROCESSING_INSTRUCTION_NODE:
		return buf.push( "<?",node.target," ",node.data,"?>");
	case ENTITY_REFERENCE_NODE:
		return buf.push( '&',node.nodeName,';');
	//case ENTITY_NODE:
	//case NOTATION_NODE:
	default:
		buf.push('??',node.nodeName);
	}
}
function importNode(doc,node,deep){
	var node2;
	switch (node.nodeType) {
	case ELEMENT_NODE:
		node2 = node.cloneNode(false);
		node2.ownerDocument = doc;
		//var attrs = node2.attributes;
		//var len = attrs.length;
		//for(var i=0;i<len;i++){
			//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
		//}
	case DOCUMENT_FRAGMENT_NODE:
		break;
	case ATTRIBUTE_NODE:
		deep = true;
		break;
	//case ENTITY_REFERENCE_NODE:
	//case PROCESSING_INSTRUCTION_NODE:
	////case TEXT_NODE:
	//case CDATA_SECTION_NODE:
	//case COMMENT_NODE:
	//	deep = false;
	//	break;
	//case DOCUMENT_NODE:
	//case DOCUMENT_TYPE_NODE:
	//cannot be imported.
	//case ENTITY_NODE:
	//case NOTATION_NODEï¼š
	//can not hit in level3
	//default:throw e;
	}
	if(!node2){
		node2 = node.cloneNode(false);//false
	}
	node2.ownerDocument = doc;
	node2.parentNode = null;
	if(deep){
		var child = node.firstChild;
		while(child){
			node2.appendChild(importNode(doc,child,deep));
			child = child.nextSibling;
		}
	}
	return node2;
}
//
//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
//					attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
function cloneNode(doc,node,deep){
	var node2 = new node.constructor();
	for(var n in node){
		var v = node[n];
		if(typeof v != 'object' ){
			if(v != node2[n]){
				node2[n] = v;
			}
		}
	}
	if(node.childNodes){
		node2.childNodes = new NodeList();
	}
	node2.ownerDocument = doc;
	switch (node2.nodeType) {
	case ELEMENT_NODE:
		var attrs	= node.attributes;
		var attrs2	= node2.attributes = new NamedNodeMap();
		var len = attrs.length
		attrs2._ownerElement = node2;
		for(var i=0;i<len;i++){
			node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
		}
		break;;
	case ATTRIBUTE_NODE:
		deep = true;
	}
	if(deep){
		var child = node.firstChild;
		while(child){
			node2.appendChild(cloneNode(doc,child,deep));
			child = child.nextSibling;
		}
	}
	return node2;
}

function __set__(object,key,value){
	object[key] = value
}
//do dynamic
try{
	if(Object.defineProperty){
		Object.defineProperty(LiveNodeList.prototype,'length',{
			get:function(){
				_updateLiveList(this);
				return this.$$length;
			}
		});
		Object.defineProperty(Node.prototype,'textContent',{
			get:function(){
				return getTextContent(this);
			},
			set:function(data){
				switch(this.nodeType){
				case ELEMENT_NODE:
				case DOCUMENT_FRAGMENT_NODE:
					while(this.firstChild){
						this.removeChild(this.firstChild);
					}
					if(data || String(data)){
						this.appendChild(this.ownerDocument.createTextNode(data));
					}
					break;
				default:
					//TODO:
					this.data = data;
					this.value = data;
					this.nodeValue = data;
				}
			}
		})
		
		function getTextContent(node){
			switch(node.nodeType){
			case ELEMENT_NODE:
			case DOCUMENT_FRAGMENT_NODE:
				var buf = [];
				node = node.firstChild;
				while(node){
					if(node.nodeType!==7 && node.nodeType !==8){
						buf.push(getTextContent(node));
					}
					node = node.nextSibling;
				}
				return buf.join('');
			default:
				return node.nodeValue;
			}
		}
		__set__ = function(object,key,value){
			//console.log(value)
			object['$$'+key] = value
		}
	}
}catch(e){//ie8
}

//if(typeof require == 'function'){
	exports.DOMImplementation = DOMImplementation;
	exports.XMLSerializer = XMLSerializer;
//}

},{}],32:[function(require,module,exports){
//[4]   	NameStartChar	   ::=   	":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
//[4a]   	NameChar	   ::=   	NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
//[5]   	Name	   ::=   	NameStartChar (NameChar)*
var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF
var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')

//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
var S_TAG = 0;//tag name offerring
var S_ATTR = 1;//attr name offerring 
var S_ATTR_SPACE=2;//attr name end and space offer
var S_EQ = 3;//=space?
var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
var S_ATTR_END = 5;//attr value end and no space(quot end)
var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
var S_TAG_CLOSE = 7;//closed el<el />

function XMLReader(){
	
}

XMLReader.prototype = {
	parse:function(source,defaultNSMap,entityMap){
		var domBuilder = this.domBuilder;
		domBuilder.startDocument();
		_copy(defaultNSMap ,defaultNSMap = {})
		parse(source,defaultNSMap,entityMap,
				domBuilder,this.errorHandler);
		domBuilder.endDocument();
	}
}
function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
	function fixedFromCharCode(code) {
		// String.prototype.fromCharCode does not supports
		// > 2 bytes unicode chars directly
		if (code > 0xffff) {
			code -= 0x10000;
			var surrogate1 = 0xd800 + (code >> 10)
				, surrogate2 = 0xdc00 + (code & 0x3ff);

			return String.fromCharCode(surrogate1, surrogate2);
		} else {
			return String.fromCharCode(code);
		}
	}
	function entityReplacer(a){
		var k = a.slice(1,-1);
		if(k in entityMap){
			return entityMap[k]; 
		}else if(k.charAt(0) === '#'){
			return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
		}else{
			errorHandler.error('entity not found:'+a);
			return a;
		}
	}
	function appendText(end){//has some bugs
		if(end>start){
			var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
			locator&&position(start);
			domBuilder.characters(xt,0,end-start);
			start = end
		}
	}
	function position(p,m){
		while(p>=lineEnd && (m = linePattern.exec(source))){
			lineStart = m.index;
			lineEnd = lineStart + m[0].length;
			locator.lineNumber++;
			//console.log('line++:',locator,startPos,endPos)
		}
		locator.columnNumber = p-lineStart+1;
	}
	var lineStart = 0;
	var lineEnd = 0;
	var linePattern = /.*(?:\r\n?|\n)|.*$/g
	var locator = domBuilder.locator;
	
	var parseStack = [{currentNSMap:defaultNSMapCopy}]
	var closeMap = {};
	var start = 0;
	while(true){
		try{
			var tagStart = source.indexOf('<',start);
			if(tagStart<0){
				if(!source.substr(start).match(/^\s*$/)){
					var doc = domBuilder.doc;
	    			var text = doc.createTextNode(source.substr(start));
	    			doc.appendChild(text);
	    			domBuilder.currentElement = text;
				}
				return;
			}
			if(tagStart>start){
				appendText(tagStart);
			}
			switch(source.charAt(tagStart+1)){
			case '/':
				var end = source.indexOf('>',tagStart+3);
				var tagName = source.substring(tagStart+2,end);
				var config = parseStack.pop();
				if(end<0){
					
	        		tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
	        		//console.error('#@@@@@@'+tagName)
	        		errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
	        		end = tagStart+1+tagName.length;
	        	}else if(tagName.match(/\s</)){
	        		tagName = tagName.replace(/[\s<].*/,'');
	        		errorHandler.error("end tag name: "+tagName+' maybe not complete');
	        		end = tagStart+1+tagName.length;
				}
				//console.error(parseStack.length,parseStack)
				//console.error(config);
				var localNSMap = config.localNSMap;
				var endMatch = config.tagName == tagName;
				var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()
		        if(endIgnoreCaseMach){
		        	domBuilder.endElement(config.uri,config.localName,tagName);
					if(localNSMap){
						for(var prefix in localNSMap){
							domBuilder.endPrefixMapping(prefix) ;
						}
					}
					if(!endMatch){
		            	errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
					}
		        }else{
		        	parseStack.push(config)
		        }
				
				end++;
				break;
				// end elment
			case '?':// <?...?>
				locator&&position(tagStart);
				end = parseInstruction(source,tagStart,domBuilder);
				break;
			case '!':// <!doctype,<![CDATA,<!--
				locator&&position(tagStart);
				end = parseDCC(source,tagStart,domBuilder,errorHandler);
				break;
			default:
				locator&&position(tagStart);
				var el = new ElementAttributes();
				var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
				//elStartEnd
				var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
				var len = el.length;
				
				
				if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
					el.closed = true;
					if(!entityMap.nbsp){
						errorHandler.warning('unclosed xml attribute');
					}
				}
				if(locator && len){
					var locator2 = copyLocator(locator,{});
					//try{//attribute position fixed
					for(var i = 0;i<len;i++){
						var a = el[i];
						position(a.offset);
						a.locator = copyLocator(locator,{});
					}
					//}catch(e){console.error('@@@@@'+e)}
					domBuilder.locator = locator2
					if(appendElement(el,domBuilder,currentNSMap)){
						parseStack.push(el)
					}
					domBuilder.locator = locator;
				}else{
					if(appendElement(el,domBuilder,currentNSMap)){
						parseStack.push(el)
					}
				}
				
				
				
				if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
					end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)
				}else{
					end++;
				}
			}
		}catch(e){
			errorHandler.error('element parse error: '+e)
			//errorHandler.error('element parse error: '+e);
			end = -1;
			//throw e;
		}
		if(end>start){
			start = end;
		}else{
			//TODO: è¿™é‡Œæœ‰å�¯èƒ½saxå›žé€€ï¼Œæœ‰ä½�ç½®é”™è¯¯é£Žé™©
			appendText(Math.max(tagStart,start)+1);
		}
	}
}
function copyLocator(f,t){
	t.lineNumber = f.lineNumber;
	t.columnNumber = f.columnNumber;
	return t;
}

/**
 * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
 * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
 */
function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
	var attrName;
	var value;
	var p = ++start;
	var s = S_TAG;//status
	while(true){
		var c = source.charAt(p);
		switch(c){
		case '=':
			if(s === S_ATTR){//attrName
				attrName = source.slice(start,p);
				s = S_EQ;
			}else if(s === S_ATTR_SPACE){
				s = S_EQ;
			}else{
				//fatalError: equal must after attrName or space after attrName
				throw new Error('attribute equal must after attrName');
			}
			break;
		case '\'':
		case '"':
			if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
				){//equal
				if(s === S_ATTR){
					errorHandler.warning('attribute value must after "="')
					attrName = source.slice(start,p)
				}
				start = p+1;
				p = source.indexOf(c,start)
				if(p>0){
					value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
					el.add(attrName,value,start-1);
					s = S_ATTR_END;
				}else{
					//fatalError: no end quot match
					throw new Error('attribute value no end \''+c+'\' match');
				}
			}else if(s == S_ATTR_NOQUOT_VALUE){
				value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
				//console.log(attrName,value,start,p)
				el.add(attrName,value,start);
				//console.dir(el)
				errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
				start = p+1;
				s = S_ATTR_END
			}else{
				//fatalError: no equal before
				throw new Error('attribute value must after "="');
			}
			break;
		case '/':
			switch(s){
			case S_TAG:
				el.setTagName(source.slice(start,p));
			case S_ATTR_END:
			case S_TAG_SPACE:
			case S_TAG_CLOSE:
				s =S_TAG_CLOSE;
				el.closed = true;
			case S_ATTR_NOQUOT_VALUE:
			case S_ATTR:
			case S_ATTR_SPACE:
				break;
			//case S_EQ:
			default:
				throw new Error("attribute invalid close char('/')")
			}
			break;
		case ''://end document
			//throw new Error('unexpected end of input')
			errorHandler.error('unexpected end of input');
			if(s == S_TAG){
				el.setTagName(source.slice(start,p));
			}
			return p;
		case '>':
			switch(s){
			case S_TAG:
				el.setTagName(source.slice(start,p));
			case S_ATTR_END:
			case S_TAG_SPACE:
			case S_TAG_CLOSE:
				break;//normal
			case S_ATTR_NOQUOT_VALUE://Compatible state
			case S_ATTR:
				value = source.slice(start,p);
				if(value.slice(-1) === '/'){
					el.closed  = true;
					value = value.slice(0,-1)
				}
			case S_ATTR_SPACE:
				if(s === S_ATTR_SPACE){
					value = attrName;
				}
				if(s == S_ATTR_NOQUOT_VALUE){
					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
					el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start)
				}else{
					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
						errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
					}
					el.add(value,value,start)
				}
				break;
			case S_EQ:
				throw new Error('attribute value missed!!');
			}
//			console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
			return p;
		/*xml space '\x20' | #x9 | #xD | #xA; */
		case '\u0080':
			c = ' ';
		default:
			if(c<= ' '){//space
				switch(s){
				case S_TAG:
					el.setTagName(source.slice(start,p));//tagName
					s = S_TAG_SPACE;
					break;
				case S_ATTR:
					attrName = source.slice(start,p)
					s = S_ATTR_SPACE;
					break;
				case S_ATTR_NOQUOT_VALUE:
					var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
					el.add(attrName,value,start)
				case S_ATTR_END:
					s = S_TAG_SPACE;
					break;
				//case S_TAG_SPACE:
				//case S_EQ:
				//case S_ATTR_SPACE:
				//	void();break;
				//case S_TAG_CLOSE:
					//ignore warning
				}
			}else{//not space
//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
				switch(s){
				//case S_TAG:void();break;
				//case S_ATTR:void();break;
				//case S_ATTR_NOQUOT_VALUE:void();break;
				case S_ATTR_SPACE:
					var tagName =  el.tagName;
					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
						errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!')
					}
					el.add(attrName,attrName,start);
					start = p;
					s = S_ATTR;
					break;
				case S_ATTR_END:
					errorHandler.warning('attribute space is required"'+attrName+'"!!')
				case S_TAG_SPACE:
					s = S_ATTR;
					start = p;
					break;
				case S_EQ:
					s = S_ATTR_NOQUOT_VALUE;
					start = p;
					break;
				case S_TAG_CLOSE:
					throw new Error("elements closed character '/' and '>' must be connected to");
				}
			}
		}//end outer switch
		//console.log('p++',p)
		p++;
	}
}
/**
 * @return true if has new namespace define
 */
function appendElement(el,domBuilder,currentNSMap){
	var tagName = el.tagName;
	var localNSMap = null;
	//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
	var i = el.length;
	while(i--){
		var a = el[i];
		var qName = a.qName;
		var value = a.value;
		var nsp = qName.indexOf(':');
		if(nsp>0){
			var prefix = a.prefix = qName.slice(0,nsp);
			var localName = qName.slice(nsp+1);
			var nsPrefix = prefix === 'xmlns' && localName
		}else{
			localName = qName;
			prefix = null
			nsPrefix = qName === 'xmlns' && ''
		}
		//can not set prefix,because prefix !== ''
		a.localName = localName ;
		//prefix == null for no ns prefix attribute 
		if(nsPrefix !== false){//hack!!
			if(localNSMap == null){
				localNSMap = {}
				//console.log(currentNSMap,0)
				_copy(currentNSMap,currentNSMap={})
				//console.log(currentNSMap,1)
			}
			currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
			a.uri = 'http://www.w3.org/2000/xmlns/'
			domBuilder.startPrefixMapping(nsPrefix, value) 
		}
	}
	var i = el.length;
	while(i--){
		a = el[i];
		var prefix = a.prefix;
		if(prefix){//no prefix attribute has no namespace
			if(prefix === 'xml'){
				a.uri = 'http://www.w3.org/XML/1998/namespace';
			}if(prefix !== 'xmlns'){
				a.uri = currentNSMap[prefix || '']
				
				//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
			}
		}
	}
	var nsp = tagName.indexOf(':');
	if(nsp>0){
		prefix = el.prefix = tagName.slice(0,nsp);
		localName = el.localName = tagName.slice(nsp+1);
	}else{
		prefix = null;//important!!
		localName = el.localName = tagName;
	}
	//no prefix element has default namespace
	var ns = el.uri = currentNSMap[prefix || ''];
	domBuilder.startElement(ns,localName,tagName,el);
	//endPrefixMapping and startPrefixMapping have not any help for dom builder
	//localNSMap = null
	if(el.closed){
		domBuilder.endElement(ns,localName,tagName);
		if(localNSMap){
			for(prefix in localNSMap){
				domBuilder.endPrefixMapping(prefix) 
			}
		}
	}else{
		el.currentNSMap = currentNSMap;
		el.localNSMap = localNSMap;
		//parseStack.push(el);
		return true;
	}
}
function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
	if(/^(?:script|textarea)$/i.test(tagName)){
		var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
		var text = source.substring(elStartEnd+1,elEndStart);
		if(/[&<]/.test(text)){
			if(/^script$/i.test(tagName)){
				//if(!/\]\]>/.test(text)){
					//lexHandler.startCDATA();
					domBuilder.characters(text,0,text.length);
					//lexHandler.endCDATA();
					return elEndStart;
				//}
			}//}else{//text area
				text = text.replace(/&#?\w+;/g,entityReplacer);
				domBuilder.characters(text,0,text.length);
				return elEndStart;
			//}
			
		}
	}
	return elStartEnd+1;
}
function fixSelfClosed(source,elStartEnd,tagName,closeMap){
	//if(tagName in closeMap){
	var pos = closeMap[tagName];
	if(pos == null){
		//console.log(tagName)
		pos =  source.lastIndexOf('</'+tagName+'>')
		if(pos<elStartEnd){//å¿˜è®°é—­å�ˆ
			pos = source.lastIndexOf('</'+tagName)
		}
		closeMap[tagName] =pos
	}
	return pos<elStartEnd;
	//} 
}
function _copy(source,target){
	for(var n in source){target[n] = source[n]}
}
function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
	var next= source.charAt(start+2)
	switch(next){
	case '-':
		if(source.charAt(start + 3) === '-'){
			var end = source.indexOf('-->',start+4);
			//append comment source.substring(4,end)//<!--
			if(end>start){
				domBuilder.comment(source,start+4,end-start-4);
				return end+3;
			}else{
				errorHandler.error("Unclosed comment");
				return -1;
			}
		}else{
			//error
			return -1;
		}
	default:
		if(source.substr(start+3,6) == 'CDATA['){
			var end = source.indexOf(']]>',start+9);
			domBuilder.startCDATA();
			domBuilder.characters(source,start+9,end-start-9);
			domBuilder.endCDATA() 
			return end+3;
		}
		//<!DOCTYPE
		//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
		var matchs = split(source,start);
		var len = matchs.length;
		if(len>1 && /!doctype/i.test(matchs[0][0])){
			var name = matchs[1][0];
			var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0]
			var sysid = len>4 && matchs[4][0];
			var lastMatch = matchs[len-1]
			domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
					sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
			domBuilder.endDTD();
			
			return lastMatch.index+lastMatch[0].length
		}
	}
	return -1;
}



function parseInstruction(source,start,domBuilder){
	var end = source.indexOf('?>',start);
	if(end){
		var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
		if(match){
			var len = match[0].length;
			domBuilder.processingInstruction(match[1], match[2]) ;
			return end+2;
		}else{//error
			return -1;
		}
	}
	return -1;
}

/**
 * @param source
 */
function ElementAttributes(source){
	
}
ElementAttributes.prototype = {
	setTagName:function(tagName){
		if(!tagNamePattern.test(tagName)){
			throw new Error('invalid tagName:'+tagName)
		}
		this.tagName = tagName
	},
	add:function(qName,value,offset){
		if(!tagNamePattern.test(qName)){
			throw new Error('invalid attribute:'+qName)
		}
		this[this.length++] = {qName:qName,value:value,offset:offset}
	},
	length:0,
	getLocalName:function(i){return this[i].localName},
	getLocator:function(i){return this[i].locator},
	getQName:function(i){return this[i].qName},
	getURI:function(i){return this[i].uri},
	getValue:function(i){return this[i].value}
//	,getIndex:function(uri, localName)){
//		if(localName){
//			
//		}else{
//			var qName = uri
//		}
//	},
//	getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
//	getType:function(uri,localName){}
//	getType:function(i){},
}




function _set_proto_(thiz,parent){
	thiz.__proto__ = parent;
	return thiz;
}
if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
	_set_proto_ = function(thiz,parent){
		function p(){};
		p.prototype = parent;
		p = new p();
		for(parent in thiz){
			p[parent] = thiz[parent];
		}
		return p;
	}
}

function split(source,start){
	var match;
	var buf = [];
	var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
	reg.lastIndex = start;
	reg.exec(source);//skip <
	while(match = reg.exec(source)){
		buf.push(match);
		if(match[1])return buf;
	}
}

exports.XMLReader = XMLReader;


},{}]},{},[1])(1)
});
The MIT License (MIT)

Copyright (c) 2014 Mathias Buus

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.var once = require('once')
var eos = require('end-of-stream')
var fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes

var noop = function () {}
var ancient = /^v?\.0/.test(process.version)

var isFn = function (fn) {
  return typeof fn === 'function'
}

var isFS = function (stream) {
  if (!ancient) return false // newer node version do not need to care about fs is a special way
  if (!fs) return false // browser
  return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close)
}

var isRequest = function (stream) {
  return stream.setHeader && isFn(stream.abort)
}

var destroyer = function (stream, reading, writing, callback) {
  callback = once(callback)

  var closed = false
  stream.on('close', function () {
    closed = true
  })

  eos(stream, {readable: reading, writable: writing}, function (err) {
    if (err) return callback(err)
    closed = true
    callback()
  })

  var destroyed = false
  return function (err) {
    if (closed) return
    if (destroyed) return
    destroyed = true

    if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks
    if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want

    if (isFn(stream.destroy)) return stream.destroy()

    callback(err || new Error('stream was destroyed'))
  }
}

var call = function (fn) {
  fn()
}

var pipe = function (from, to) {
  return from.pipe(to)
}

var pump = function () {
  var streams = Array.prototype.slice.call(arguments)
  var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop

  if (Array.isArray(streams[0])) streams = streams[0]
  if (streams.length < 2) throw new Error('pump requires two streams per minimum')

  var error
  var destroys = streams.map(function (stream, i) {
    var reading = i < streams.length - 1
    var writing = i > 0
    return destroyer(stream, reading, writing, function (err) {
      if (!error) error = err
      if (err) destroys.forEach(call)
      if (reading) return
      destroys.forEach(call)
      callback(error)
    })
  })

  return streams.reduce(pipe)
}

module.exports = pump
{
  "author": {
    "name": "Mathias Buus Madsen",
    "email": "mathiasbuus@gmail.com"
  },
  "browser": {
    "fs": false
  },
  "dependencies": {
    "end-of-stream": "^1.1.0",
    "once": "^1.3.1"
  },
  "deprecated": false,
  "description": "pipe streams together and close all of them if one of them closes",
  "homepage": "https://github.com/mafintosh/pump#readme",
  "license": "MIT",
  "name": "pump",
  "repository": {
    "type": "git",
    "url": "git://github.com/mafintosh/pump.git"
  },
  "version": "3.0.0"
}var stream = require('stream')
var pump = require('./index')

var rs = new stream.Readable()
var ws = new stream.Writable()

rs._read = function (size) {
  this.push(Buffer(size).fill('abc'))
}

ws._write = function (chunk, encoding, cb) {
  setTimeout(function () {
    cb()
  }, 100)
}

var toHex = function () {
  var reverse = new (require('stream').Transform)()

  reverse._transform = function (chunk, enc, callback) {
    reverse.push(chunk.toString('hex'))
    callback()
  }

  return reverse
}

var wsClosed = false
var rsClosed = false
var callbackCalled = false

var check = function () {
  if (wsClosed && rsClosed && callbackCalled) {
    console.log('test-browser.js passes')
    clearTimeout(timeout)
  }
}

ws.on('finish', function () {
  wsClosed = true
  check()
})

rs.on('end', function () {
  rsClosed = true
  check()
})

var res = pump(rs, toHex(), toHex(), toHex(), ws, function () {
  callbackCalled = true
  check()
})

if (res !== ws) {
  throw new Error('should return last stream')
}

setTimeout(function () {
  rs.push(null)
  rs.emit('close')
}, 1000)

var timeout = setTimeout(function () {
  check()
  throw new Error('timeout')
}, 5000)
var pump = require('./index')

var rs = require('fs').createReadStream('/dev/random')
var ws = require('fs').createWriteStream('/dev/null')

var toHex = function () {
  var reverse = new (require('stream').Transform)()

  reverse._transform = function (chunk, enc, callback) {
    reverse.push(chunk.toString('hex'))
    callback()
  }

  return reverse
}

var wsClosed = false
var rsClosed = false
var callbackCalled = false

var check = function () {
  if (wsClosed && rsClosed && callbackCalled) {
    console.log('test-node.js passes')
    clearTimeout(timeout)
  }
}

ws.on('close', function () {
  wsClosed = true
  check()
})

rs.on('close', function () {
  rsClosed = true
  check()
})

var res = pump(rs, toHex(), toHex(), toHex(), ws, function () {
  callbackCalled = true
  check()
})

if (res !== ws) {
  throw new Error('should return last stream')
}

setTimeout(function () {
  rs.destroy()
}, 1000)

var timeout = setTimeout(function () {
  throw new Error('timeout')
}, 5000)
Copyright Mathias Bynens <https://mathiasbynens.be/>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Mathias Bynens",
    "url": "https://mathiasbynens.be/"
  },
  "deprecated": false,
  "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.",
  "devDependencies": {
    "codecov": "^1.0.1",
    "istanbul": "^0.4.1",
    "mocha": "^2.5.3"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "LICENSE-MIT.txt",
    "punycode.js",
    "punycode.es6.js"
  ],
  "homepage": "https://mths.be/punycode",
  "jsnext:main": "punycode.es6.js",
  "license": "MIT",
  "main": "punycode.js",
  "module": "punycode.es6.js",
  "name": "punycode",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/bestiejs/punycode.js.git"
  },
  "version": "2.1.1"
}'use strict';

/** Highest positive signed 32-bit float value */
const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1

/** Bootstring parameters */
const base = 36;
const tMin = 1;
const tMax = 26;
const skew = 38;
const damp = 700;
const initialBias = 72;
const initialN = 128; // 0x80
const delimiter = '-'; // '\x2D'

/** Regular expressions */
const regexPunycode = /^xn--/;
const regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars
const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators

/** Error messages */
const errors = {
	'overflow': 'Overflow: input needs wider integers to process',
	'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
	'invalid-input': 'Invalid input'
};

/** Convenience shortcuts */
const baseMinusTMin = base - tMin;
const floor = Math.floor;
const stringFromCharCode = String.fromCharCode;

/*--------------------------------------------------------------------------*/

/**
 * A generic error utility function.
 * @private
 * @param {String} type The error type.
 * @returns {Error} Throws a `RangeError` with the applicable error message.
 */
function error(type) {
	throw new RangeError(errors[type]);
}

/**
 * A generic `Array#map` utility function.
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} callback The function that gets called for every array
 * item.
 * @returns {Array} A new array of values returned by the callback function.
 */
function map(array, fn) {
	const result = [];
	let length = array.length;
	while (length--) {
		result[length] = fn(array[length]);
	}
	return result;
}

/**
 * A simple `Array#map`-like wrapper to work with domain name strings or email
 * addresses.
 * @private
 * @param {String} domain The domain name or email address.
 * @param {Function} callback The function that gets called for every
 * character.
 * @returns {Array} A new string of characters returned by the callback
 * function.
 */
function mapDomain(string, fn) {
	const parts = string.split('@');
	let result = '';
	if (parts.length > 1) {
		// In email addresses, only the domain name should be punycoded. Leave
		// the local part (i.e. everything up to `@`) intact.
		result = parts[0] + '@';
		string = parts[1];
	}
	// Avoid `split(regex)` for IE8 compatibility. See #17.
	string = string.replace(regexSeparators, '\x2E');
	const labels = string.split('.');
	const encoded = map(labels, fn).join('.');
	return result + encoded;
}

/**
 * Creates an array containing the numeric code points of each Unicode
 * character in the string. While JavaScript uses UCS-2 internally,
 * this function will convert a pair of surrogate halves (each of which
 * UCS-2 exposes as separate characters) into a single code point,
 * matching UTF-16.
 * @see `punycode.ucs2.encode`
 * @see <https://mathiasbynens.be/notes/javascript-encoding>
 * @memberOf punycode.ucs2
 * @name decode
 * @param {String} string The Unicode input string (UCS-2).
 * @returns {Array} The new array of code points.
 */
function ucs2decode(string) {
	const output = [];
	let counter = 0;
	const length = string.length;
	while (counter < length) {
		const value = string.charCodeAt(counter++);
		if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
			// It's a high surrogate, and there is a next character.
			const extra = string.charCodeAt(counter++);
			if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.
				output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
			} else {
				// It's an unmatched surrogate; only append this code unit, in case the
				// next code unit is the high surrogate of a surrogate pair.
				output.push(value);
				counter--;
			}
		} else {
			output.push(value);
		}
	}
	return output;
}

/**
 * Creates a string based on an array of numeric code points.
 * @see `punycode.ucs2.decode`
 * @memberOf punycode.ucs2
 * @name encode
 * @param {Array} codePoints The array of numeric code points.
 * @returns {String} The new Unicode string (UCS-2).
 */
const ucs2encode = array => String.fromCodePoint(...array);

/**
 * Converts a basic code point into a digit/integer.
 * @see `digitToBasic()`
 * @private
 * @param {Number} codePoint The basic numeric code point value.
 * @returns {Number} The numeric value of a basic code point (for use in
 * representing integers) in the range `0` to `base - 1`, or `base` if
 * the code point does not represent a value.
 */
const basicToDigit = function(codePoint) {
	if (codePoint - 0x30 < 0x0A) {
		return codePoint - 0x16;
	}
	if (codePoint - 0x41 < 0x1A) {
		return codePoint - 0x41;
	}
	if (codePoint - 0x61 < 0x1A) {
		return codePoint - 0x61;
	}
	return base;
};

/**
 * Converts a digit/integer into a basic code point.
 * @see `basicToDigit()`
 * @private
 * @param {Number} digit The numeric value of a basic code point.
 * @returns {Number} The basic code point whose value (when used for
 * representing integers) is `digit`, which needs to be in the range
 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
 * used; else, the lowercase form is used. The behavior is undefined
 * if `flag` is non-zero and `digit` has no uppercase form.
 */
const digitToBasic = function(digit, flag) {
	//  0..25 map to ASCII a..z or A..Z
	// 26..35 map to ASCII 0..9
	return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
};

/**
 * Bias adaptation function as per section 3.4 of RFC 3492.
 * https://tools.ietf.org/html/rfc3492#section-3.4
 * @private
 */
const adapt = function(delta, numPoints, firstTime) {
	let k = 0;
	delta = firstTime ? floor(delta / damp) : delta >> 1;
	delta += floor(delta / numPoints);
	for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
		delta = floor(delta / baseMinusTMin);
	}
	return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
};

/**
 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
 * symbols.
 * @memberOf punycode
 * @param {String} input The Punycode string of ASCII-only symbols.
 * @returns {String} The resulting string of Unicode symbols.
 */
const decode = function(input) {
	// Don't use UCS-2.
	const output = [];
	const inputLength = input.length;
	let i = 0;
	let n = initialN;
	let bias = initialBias;

	// Handle the basic code points: let `basic` be the number of input code
	// points before the last delimiter, or `0` if there is none, then copy
	// the first basic code points to the output.

	let basic = input.lastIndexOf(delimiter);
	if (basic < 0) {
		basic = 0;
	}

	for (let j = 0; j < basic; ++j) {
		// if it's not a basic code point
		if (input.charCodeAt(j) >= 0x80) {
			error('not-basic');
		}
		output.push(input.charCodeAt(j));
	}

	// Main decoding loop: start just after the last delimiter if any basic code
	// points were copied; start at the beginning otherwise.

	for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {

		// `index` is the index of the next character to be consumed.
		// Decode a generalized variable-length integer into `delta`,
		// which gets added to `i`. The overflow checking is easier
		// if we increase `i` as we go, then subtract off its starting
		// value at the end to obtain `delta`.
		let oldi = i;
		for (let w = 1, k = base; /* no condition */; k += base) {

			if (index >= inputLength) {
				error('invalid-input');
			}

			const digit = basicToDigit(input.charCodeAt(index++));

			if (digit >= base || digit > floor((maxInt - i) / w)) {
				error('overflow');
			}

			i += digit * w;
			const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);

			if (digit < t) {
				break;
			}

			const baseMinusT = base - t;
			if (w > floor(maxInt / baseMinusT)) {
				error('overflow');
			}

			w *= baseMinusT;

		}

		const out = output.length + 1;
		bias = adapt(i - oldi, out, oldi == 0);

		// `i` was supposed to wrap around from `out` to `0`,
		// incrementing `n` each time, so we'll fix that now:
		if (floor(i / out) > maxInt - n) {
			error('overflow');
		}

		n += floor(i / out);
		i %= out;

		// Insert `n` at position `i` of the output.
		output.splice(i++, 0, n);

	}

	return String.fromCodePoint(...output);
};

/**
 * Converts a string of Unicode symbols (e.g. a domain name label) to a
 * Punycode string of ASCII-only symbols.
 * @memberOf punycode
 * @param {String} input The string of Unicode symbols.
 * @returns {String} The resulting Punycode string of ASCII-only symbols.
 */
const encode = function(input) {
	const output = [];

	// Convert the input in UCS-2 to an array of Unicode code points.
	input = ucs2decode(input);

	// Cache the length.
	let inputLength = input.length;

	// Initialize the state.
	let n = initialN;
	let delta = 0;
	let bias = initialBias;

	// Handle the basic code points.
	for (const currentValue of input) {
		if (currentValue < 0x80) {
			output.push(stringFromCharCode(currentValue));
		}
	}

	let basicLength = output.length;
	let handledCPCount = basicLength;

	// `handledCPCount` is the number of code points that have been handled;
	// `basicLength` is the number of basic code points.

	// Finish the basic string with a delimiter unless it's empty.
	if (basicLength) {
		output.push(delimiter);
	}

	// Main encoding loop:
	while (handledCPCount < inputLength) {

		// All non-basic code points < n have been handled already. Find the next
		// larger one:
		let m = maxInt;
		for (const currentValue of input) {
			if (currentValue >= n && currentValue < m) {
				m = currentValue;
			}
		}

		// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
		// but guard against overflow.
		const handledCPCountPlusOne = handledCPCount + 1;
		if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
			error('overflow');
		}

		delta += (m - n) * handledCPCountPlusOne;
		n = m;

		for (const currentValue of input) {
			if (currentValue < n && ++delta > maxInt) {
				error('overflow');
			}
			if (currentValue == n) {
				// Represent delta as a generalized variable-length integer.
				let q = delta;
				for (let k = base; /* no condition */; k += base) {
					const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
					if (q < t) {
						break;
					}
					const qMinusT = q - t;
					const baseMinusT = base - t;
					output.push(
						stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
					);
					q = floor(qMinusT / baseMinusT);
				}

				output.push(stringFromCharCode(digitToBasic(q, 0)));
				bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
				delta = 0;
				++handledCPCount;
			}
		}

		++delta;
		++n;

	}
	return output.join('');
};

/**
 * Converts a Punycode string representing a domain name or an email address
 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
 * it doesn't matter if you call it on a string that has already been
 * converted to Unicode.
 * @memberOf punycode
 * @param {String} input The Punycoded domain name or email address to
 * convert to Unicode.
 * @returns {String} The Unicode representation of the given Punycode
 * string.
 */
const toUnicode = function(input) {
	return mapDomain(input, function(string) {
		return regexPunycode.test(string)
			? decode(string.slice(4).toLowerCase())
			: string;
	});
};

/**
 * Converts a Unicode string representing a domain name or an email address to
 * Punycode. Only the non-ASCII parts of the domain name will be converted,
 * i.e. it doesn't matter if you call it with a domain that's already in
 * ASCII.
 * @memberOf punycode
 * @param {String} input The domain name or email address to convert, as a
 * Unicode string.
 * @returns {String} The Punycode representation of the given domain name or
 * email address.
 */
const toASCII = function(input) {
	return mapDomain(input, function(string) {
		return regexNonASCII.test(string)
			? 'xn--' + encode(string)
			: string;
	});
};

/*--------------------------------------------------------------------------*/

/** Define the public API */
const punycode = {
	/**
	 * A string representing the current Punycode.js version number.
	 * @memberOf punycode
	 * @type String
	 */
	'version': '2.1.0',
	/**
	 * An object of methods to convert from JavaScript's internal character
	 * representation (UCS-2) to Unicode code points, and back.
	 * @see <https://mathiasbynens.be/notes/javascript-encoding>
	 * @memberOf punycode
	 * @type Object
	 */
	'ucs2': {
		'decode': ucs2decode,
		'encode': ucs2encode
	},
	'decode': decode,
	'encode': encode,
	'toASCII': toASCII,
	'toUnicode': toUnicode
};

export { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode };
export default punycode;
'use strict';

/** Highest positive signed 32-bit float value */
const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1

/** Bootstring parameters */
const base = 36;
const tMin = 1;
const tMax = 26;
const skew = 38;
const damp = 700;
const initialBias = 72;
const initialN = 128; // 0x80
const delimiter = '-'; // '\x2D'

/** Regular expressions */
const regexPunycode = /^xn--/;
const regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars
const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators

/** Error messages */
const errors = {
	'overflow': 'Overflow: input needs wider integers to process',
	'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
	'invalid-input': 'Invalid input'
};

/** Convenience shortcuts */
const baseMinusTMin = base - tMin;
const floor = Math.floor;
const stringFromCharCode = String.fromCharCode;

/*--------------------------------------------------------------------------*/

/**
 * A generic error utility function.
 * @private
 * @param {String} type The error type.
 * @returns {Error} Throws a `RangeError` with the applicable error message.
 */
function error(type) {
	throw new RangeError(errors[type]);
}

/**
 * A generic `Array#map` utility function.
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} callback The function that gets called for every array
 * item.
 * @returns {Array} A new array of values returned by the callback function.
 */
function map(array, fn) {
	const result = [];
	let length = array.length;
	while (length--) {
		result[length] = fn(array[length]);
	}
	return result;
}

/**
 * A simple `Array#map`-like wrapper to work with domain name strings or email
 * addresses.
 * @private
 * @param {String} domain The domain name or email address.
 * @param {Function} callback The function that gets called for every
 * character.
 * @returns {Array} A new string of characters returned by the callback
 * function.
 */
function mapDomain(string, fn) {
	const parts = string.split('@');
	let result = '';
	if (parts.length > 1) {
		// In email addresses, only the domain name should be punycoded. Leave
		// the local part (i.e. everything up to `@`) intact.
		result = parts[0] + '@';
		string = parts[1];
	}
	// Avoid `split(regex)` for IE8 compatibility. See #17.
	string = string.replace(regexSeparators, '\x2E');
	const labels = string.split('.');
	const encoded = map(labels, fn).join('.');
	return result + encoded;
}

/**
 * Creates an array containing the numeric code points of each Unicode
 * character in the string. While JavaScript uses UCS-2 internally,
 * this function will convert a pair of surrogate halves (each of which
 * UCS-2 exposes as separate characters) into a single code point,
 * matching UTF-16.
 * @see `punycode.ucs2.encode`
 * @see <https://mathiasbynens.be/notes/javascript-encoding>
 * @memberOf punycode.ucs2
 * @name decode
 * @param {String} string The Unicode input string (UCS-2).
 * @returns {Array} The new array of code points.
 */
function ucs2decode(string) {
	const output = [];
	let counter = 0;
	const length = string.length;
	while (counter < length) {
		const value = string.charCodeAt(counter++);
		if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
			// It's a high surrogate, and there is a next character.
			const extra = string.charCodeAt(counter++);
			if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.
				output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
			} else {
				// It's an unmatched surrogate; only append this code unit, in case the
				// next code unit is the high surrogate of a surrogate pair.
				output.push(value);
				counter--;
			}
		} else {
			output.push(value);
		}
	}
	return output;
}

/**
 * Creates a string based on an array of numeric code points.
 * @see `punycode.ucs2.decode`
 * @memberOf punycode.ucs2
 * @name encode
 * @param {Array} codePoints The array of numeric code points.
 * @returns {String} The new Unicode string (UCS-2).
 */
const ucs2encode = array => String.fromCodePoint(...array);

/**
 * Converts a basic code point into a digit/integer.
 * @see `digitToBasic()`
 * @private
 * @param {Number} codePoint The basic numeric code point value.
 * @returns {Number} The numeric value of a basic code point (for use in
 * representing integers) in the range `0` to `base - 1`, or `base` if
 * the code point does not represent a value.
 */
const basicToDigit = function(codePoint) {
	if (codePoint - 0x30 < 0x0A) {
		return codePoint - 0x16;
	}
	if (codePoint - 0x41 < 0x1A) {
		return codePoint - 0x41;
	}
	if (codePoint - 0x61 < 0x1A) {
		return codePoint - 0x61;
	}
	return base;
};

/**
 * Converts a digit/integer into a basic code point.
 * @see `basicToDigit()`
 * @private
 * @param {Number} digit The numeric value of a basic code point.
 * @returns {Number} The basic code point whose value (when used for
 * representing integers) is `digit`, which needs to be in the range
 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
 * used; else, the lowercase form is used. The behavior is undefined
 * if `flag` is non-zero and `digit` has no uppercase form.
 */
const digitToBasic = function(digit, flag) {
	//  0..25 map to ASCII a..z or A..Z
	// 26..35 map to ASCII 0..9
	return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
};

/**
 * Bias adaptation function as per section 3.4 of RFC 3492.
 * https://tools.ietf.org/html/rfc3492#section-3.4
 * @private
 */
const adapt = function(delta, numPoints, firstTime) {
	let k = 0;
	delta = firstTime ? floor(delta / damp) : delta >> 1;
	delta += floor(delta / numPoints);
	for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
		delta = floor(delta / baseMinusTMin);
	}
	return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
};

/**
 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
 * symbols.
 * @memberOf punycode
 * @param {String} input The Punycode string of ASCII-only symbols.
 * @returns {String} The resulting string of Unicode symbols.
 */
const decode = function(input) {
	// Don't use UCS-2.
	const output = [];
	const inputLength = input.length;
	let i = 0;
	let n = initialN;
	let bias = initialBias;

	// Handle the basic code points: let `basic` be the number of input code
	// points before the last delimiter, or `0` if there is none, then copy
	// the first basic code points to the output.

	let basic = input.lastIndexOf(delimiter);
	if (basic < 0) {
		basic = 0;
	}

	for (let j = 0; j < basic; ++j) {
		// if it's not a basic code point
		if (input.charCodeAt(j) >= 0x80) {
			error('not-basic');
		}
		output.push(input.charCodeAt(j));
	}

	// Main decoding loop: start just after the last delimiter if any basic code
	// points were copied; start at the beginning otherwise.

	for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {

		// `index` is the index of the next character to be consumed.
		// Decode a generalized variable-length integer into `delta`,
		// which gets added to `i`. The overflow checking is easier
		// if we increase `i` as we go, then subtract off its starting
		// value at the end to obtain `delta`.
		let oldi = i;
		for (let w = 1, k = base; /* no condition */; k += base) {

			if (index >= inputLength) {
				error('invalid-input');
			}

			const digit = basicToDigit(input.charCodeAt(index++));

			if (digit >= base || digit > floor((maxInt - i) / w)) {
				error('overflow');
			}

			i += digit * w;
			const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);

			if (digit < t) {
				break;
			}

			const baseMinusT = base - t;
			if (w > floor(maxInt / baseMinusT)) {
				error('overflow');
			}

			w *= baseMinusT;

		}

		const out = output.length + 1;
		bias = adapt(i - oldi, out, oldi == 0);

		// `i` was supposed to wrap around from `out` to `0`,
		// incrementing `n` each time, so we'll fix that now:
		if (floor(i / out) > maxInt - n) {
			error('overflow');
		}

		n += floor(i / out);
		i %= out;

		// Insert `n` at position `i` of the output.
		output.splice(i++, 0, n);

	}

	return String.fromCodePoint(...output);
};

/**
 * Converts a string of Unicode symbols (e.g. a domain name label) to a
 * Punycode string of ASCII-only symbols.
 * @memberOf punycode
 * @param {String} input The string of Unicode symbols.
 * @returns {String} The resulting Punycode string of ASCII-only symbols.
 */
const encode = function(input) {
	const output = [];

	// Convert the input in UCS-2 to an array of Unicode code points.
	input = ucs2decode(input);

	// Cache the length.
	let inputLength = input.length;

	// Initialize the state.
	let n = initialN;
	let delta = 0;
	let bias = initialBias;

	// Handle the basic code points.
	for (const currentValue of input) {
		if (currentValue < 0x80) {
			output.push(stringFromCharCode(currentValue));
		}
	}

	let basicLength = output.length;
	let handledCPCount = basicLength;

	// `handledCPCount` is the number of code points that have been handled;
	// `basicLength` is the number of basic code points.

	// Finish the basic string with a delimiter unless it's empty.
	if (basicLength) {
		output.push(delimiter);
	}

	// Main encoding loop:
	while (handledCPCount < inputLength) {

		// All non-basic code points < n have been handled already. Find the next
		// larger one:
		let m = maxInt;
		for (const currentValue of input) {
			if (currentValue >= n && currentValue < m) {
				m = currentValue;
			}
		}

		// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
		// but guard against overflow.
		const handledCPCountPlusOne = handledCPCount + 1;
		if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
			error('overflow');
		}

		delta += (m - n) * handledCPCountPlusOne;
		n = m;

		for (const currentValue of input) {
			if (currentValue < n && ++delta > maxInt) {
				error('overflow');
			}
			if (currentValue == n) {
				// Represent delta as a generalized variable-length integer.
				let q = delta;
				for (let k = base; /* no condition */; k += base) {
					const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
					if (q < t) {
						break;
					}
					const qMinusT = q - t;
					const baseMinusT = base - t;
					output.push(
						stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
					);
					q = floor(qMinusT / baseMinusT);
				}

				output.push(stringFromCharCode(digitToBasic(q, 0)));
				bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
				delta = 0;
				++handledCPCount;
			}
		}

		++delta;
		++n;

	}
	return output.join('');
};

/**
 * Converts a Punycode string representing a domain name or an email address
 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
 * it doesn't matter if you call it on a string that has already been
 * converted to Unicode.
 * @memberOf punycode
 * @param {String} input The Punycoded domain name or email address to
 * convert to Unicode.
 * @returns {String} The Unicode representation of the given Punycode
 * string.
 */
const toUnicode = function(input) {
	return mapDomain(input, function(string) {
		return regexPunycode.test(string)
			? decode(string.slice(4).toLowerCase())
			: string;
	});
};

/**
 * Converts a Unicode string representing a domain name or an email address to
 * Punycode. Only the non-ASCII parts of the domain name will be converted,
 * i.e. it doesn't matter if you call it with a domain that's already in
 * ASCII.
 * @memberOf punycode
 * @param {String} input The domain name or email address to convert, as a
 * Unicode string.
 * @returns {String} The Punycode representation of the given domain name or
 * email address.
 */
const toASCII = function(input) {
	return mapDomain(input, function(string) {
		return regexNonASCII.test(string)
			? 'xn--' + encode(string)
			: string;
	});
};

/*--------------------------------------------------------------------------*/

/** Define the public API */
const punycode = {
	/**
	 * A string representing the current Punycode.js version number.
	 * @memberOf punycode
	 * @type String
	 */
	'version': '2.1.0',
	/**
	 * An object of methods to convert from JavaScript's internal character
	 * representation (UCS-2) to Unicode code points, and back.
	 * @see <https://mathiasbynens.be/notes/javascript-encoding>
	 * @memberOf punycode
	 * @type Object
	 */
	'ucs2': {
		'decode': ucs2decode,
		'encode': ucs2encode
	},
	'decode': decode,
	'encode': encode,
	'toASCII': toASCII,
	'toUnicode': toUnicode
};

module.exports = punycode;

## 1.5.1

 - Q.any now annotates its error message to clarify that Q.any was involved and
   includes only the last error emitted. (Ivan Etchart)
 - Avoid domain.dispose during tests in preparation for Node.js 9. (Anna
   Henningsen)

## 1.5.0

 - Q.any gives an error message from the last rejected promise
 - Throw if callback supplied to "finally" is invalid (@grahamrhay)
 - Long stack trace improvements, can now construct long stack traces
   across rethrows.

## 1.4.1

 - Address an issue that prevented Q from being used as a `<script>` for
   Firefox add-ons. Q can now be used in any environment that provides `window`
   or `self` globals, favoring `window` since add-ons have an an immutable
   `self` that is distinct from `window`.

## 1.4.0

 - Add `noConflict` support for use in `<script>` (@jahnjw).

## 1.3.0

 - Add tracking for unhandled and handled rejections in Node.js (@benjamingr).

## 1.2.1

 - Fix Node.js environment detection for modern Browserify (@kahnjw).

## 1.2.0

 - Added Q.any(promisesArray) method (@vergara).
   Returns a promise fulfilled with the value of the first resolved promise in
   promisesArray. If all promises in promisesArray are rejected, it returns
   a rejected promise.

## 1.1.2

 - Removed extraneous files from the npm package by using the "files"
   whitelist in package.json instead of the .npmignore blacklist.
   (@anton-rudeshko)

## 1.1.1

 - Fix a pair of regressions in bootstrapping, one which precluded
   WebWorker support, and another that precluded support in
   ``<script>`` usage outright. #607

## 1.1.0

 - Adds support for enabling long stack traces in node.js by setting
   environment variable `Q_DEBUG=1`.
 - Introduces the `tap` method to promises, which will see a value
   pass through without alteration.
 - Use instanceof to recognize own promise instances as opposed to
   thenables.
 - Construct timeout errors with `code === ETIMEDOUT` (Kornel LesiÅ„ski)
 - More descriminant CommonJS module environment detection.
 - Dropped continuous integration for Node.js 0.6 and 0.8 because of
   changes to npm that preclude the use of new `^` version predicate
   operator in any transitive dependency.
 - Users can now override `Q.nextTick`.

## 1.0.1

 - Adds support for `Q.Promise`, which implements common usage of the
   ES6 `Promise` constructor and its methods. `Promise` does not have
   a valid promise constructor and a proper implementation awaits
   version 2 of Q.
 - Removes the console stopgap for a promise inspector. This no longer
   works with any degree of reliability.
 - Fixes support for content security policies that forbid eval. Now
   using the `StopIteration` global to distinguish SpiderMonkey
   generators from ES6 generators, assuming that they will never
   coexist.

## 1.0.0

:cake: This is all but a re-release of version 0.9, which has settled
into a gentle maintenance mode and rightly deserves an official 1.0.
An ambitious 2.0 release is already around the corner, but 0.9/1.0
have been distributed far and wide and demand long term support.

 - Q will now attempt to post a debug message in browsers regardless
   of whether window.Touch is defined. Chrome at least now has this
   property regardless of whether touch is supported by the underlying
   hardware.
 - Remove deprecation warning from `promise.valueOf`. The function is
   called by the browser in various ways so there is no way to
   distinguish usage that should be migrated from usage that cannot be
   altered.

## 0.9.7

 - :warning: `q.min.js` is no longer checked-in.  It is however still
   created by Grunt and NPM.
 - Fixes a bug that inhibited `Q.async` with implementations of the new
   ES6 generators.
 - Fixes a bug with `nextTick` affecting Safari 6.0.5 the first time a
   page loads when an `iframe` is involved.
 - Introduces `passByCopy`, `join`, and `race`.
 - Shows stack traces or error messages on the console, instead of
   `Error` objects.
 - Elimintates wrapper methods for improved performance.
 - `Q.all` now propagates progress notifications of the form you might
   expect of ES6 iterations, `{value, index}` where the `value` is the
   progress notification from the promise at `index`.

## 0.9.6

 - Fixes a bug in recognizing the difference between compatible Q
   promises, and Q promises from before the implementation of "inspect".
   The latter are now coerced.
 - Fixes an infinite asynchronous coercion cycle introduced by former
   solution, in two independently sufficient ways.  1.) All promises
   returned by makePromise now implement "inspect", albeit a default
   that reports that the promise has an "unknown" state.  2.) The
   implementation of "then/when" is now in "then" instead of "when", so
   that the responsibility to "coerce" the given promise rests solely in
   the "when" method and the "then" method may assume that "this" is a
   promise of the right type.
 - Refactors `nextTick` to use an unrolled microtask within Q regardless
   of how new ticks a requested. #316 @rkatic

## 0.9.5

 - Introduces `inspect` for getting the state of a promise as
   `{state: "fulfilled" | "rejected" | "pending", value | reason}`.
 - Introduces `allSettled` which produces an array of promises states
   for the input promises once they have all "settled".  This is in
   accordance with a discussion on Promises/A+ that "settled" refers to
   a promise that is "fulfilled" or "rejected".  "resolved" refers to a
   deferred promise that has been "resolved" to another promise,
   "sealing its fate" to the fate of the successor promise.
 - Long stack traces are now off by default.  Set `Q.longStackSupport`
   to true to enable long stack traces.
 - Long stack traces can now follow the entire asynchronous history of a
   promise, not just a single jump.
 - Introduces `spawn` for an immediately invoked asychronous generator.
   @jlongster
 - Support for *experimental* synonyms `mapply`, `mcall`, `nmapply`,
   `nmcall` for method invocation.

## 0.9.4

 - `isPromise` and `isPromiseAlike` now always returns a boolean
   (even for falsy values). #284 @lfac-pt
 - Support for ES6 Generators in `async` #288 @andywingo
 - Clear duplicate promise rejections from dispatch methods #238 @SLaks
 - Unhandled rejection API #296 @domenic
   `stopUnhandledRejectionTracking`, `getUnhandledReasons`,
   `resetUnhandledRejections`.

## 0.9.3

 - Add the ability to give `Q.timeout`'s errors a custom error message. #270
   @jgrenon
 - Fix Q's call-stack busting behavior in Node.js 0.10, by switching from
   `process.nextTick` to `setImmediate`. #254 #259
 - Fix Q's behavior when used with the Mocha test runner in the browser, since
   Mocha introduces a fake `process` global without a `nextTick` property. #267
 - Fix some, but not all, cases wherein Q would give false positives in its
   unhandled rejection detection (#252). A fix for other cases (#238) is
   hopefully coming soon.
 - Made `Q.promise` throw early if given a non-function.

## 0.9.2

 - Pass through progress notifications when using `timeout`. #229 @omares
 - Pass through progress notifications when using `delay`.
 - Fix `nbind` to actually bind the `thisArg`. #232 @davidpadbury

## 0.9.1

 - Made the AMD detection compatible with the RequireJS optimizer's `namespace`
   option. #225 @terinjokes
 - Fix side effects from `valueOf`, and thus from `isFulfilled`, `isRejected`,
   and `isPending`. #226 @benjamn

## 0.9.0

This release removes many layers of deprecated methods and brings Q closer to
alignment with Mark Millerâ€™s TC39 [strawman][] for concurrency. At the same
time, it fixes many bugs and adds a few features around error handling. Finally,
it comes with an updated and comprehensive [API Reference][].

[strawman]: http://wiki.ecmascript.org/doku.php?id=strawman:concurrency
[API Reference]: https://github.com/kriskowal/q/wiki/API-Reference

### API Cleanup

The following deprecated or undocumented methods have been removed.
Their replacements are listed here:

<table>
   <thead>
      <tr>
         <th>0.8.x method</th>
         <th>0.9 replacement</th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td><code>Q.ref</code></td>
         <td><code>Q</code></td>
      </tr>
      <tr>
         <td><code>call</code>, <code>apply</code>, <code>bind</code> (*)</td>
         <td><code>fcall</code>/<code>invoke</code>, <code>fapply</code>/<code>post</code>, <code>fbind</code></td>
      </tr>
      <tr>
         <td><code>ncall</code>, <code>napply</code> (*)</td>
         <td><code>nfcall</code>/<code>ninvoke</code>, <code>nfapply</code>/<code>npost</code></td>
      </tr>
      <tr>
         <td><code>end</code></td>
         <td><code>done</code></td>
      </tr>
      <tr>
         <td><code>put</code></td>
         <td><code>set</code></td>
      </tr>
      <tr>
         <td><code>node</code></td>
         <td><code>nbind</code></td>
      </tr>
      <tr>
         <td><code>nend</code></td>
         <td><code>nodeify</code></td>
      </tr>
      <tr>
         <td><code>isResolved</code></td>
         <td><code>isPending</code></td>
      </tr>
      <tr>
         <td><code>deferred.node</code></td>
         <td><code>deferred.makeNodeResolver</code></td>
      </tr>
      <tr>
         <td><code>Method</code>, <code>sender</code></td>
         <td><code>dispatcher</code></td>
      </tr>
      <tr>
         <td><code>send</code></td>
         <td><code>dispatch</code></td>
      </tr>
      <tr>
         <td><code>view</code>, <code>viewInfo</code></td>
         <td>(none)</td>
      </tr>
   </tbody>
</table>


(*) Use of ``thisp`` is discouraged. For calling methods, use ``post`` or
``invoke``.

### Alignment with the Concurrency Strawman

-   Q now exports a `Q(value)` function, an alias for `resolve`.
    `Q.call`, `Q.apply`, and `Q.bind` were removed to make room for the
    same methods on the function prototype.
-   `invoke` has been aliased to `send` in all its forms.
-   `post` with no method name acts like `fapply`.

### Error Handling

-   Long stack traces can be turned off by setting `Q.stackJumpLimit` to zero.
    In the future, this property will be used to fine tune how many stack jumps
    are retained in long stack traces; for now, anything nonzero is treated as
    one (since Q only tracks one stack jump at the moment, see #144). #168
-   In Node.js, if there are unhandled rejections when the process exits, they
    are output to the console. #115

### Other

-   `delete` and `set` (nÃ©e `put`) no longer have a fulfillment value.
-   Q promises are no longer frozen, which
    [helps with performance](http://code.google.com/p/v8/issues/detail?id=1858).
-   `thenReject` is now included, as a counterpart to `thenResolve`.
-   The included browser `nextTick` shim is now faster. #195 @rkatic.

### Bug Fixes

-   Q now works in Internet Explorer 10. #186 @ForbesLindesay
-   `fbind` no longer hard-binds the returned function's `this` to `undefined`.
    #202
-   `Q.reject` no longer leaks memory. #148
-   `npost` with no arguments now works. #207
-   `allResolved` now works with non-Q promises ("thenables"). #179
-   `keys` behavior is now correct even in browsers without native
    `Object.keys`. #192 @rkatic
-   `isRejected` and the `exception` property now work correctly if the
    rejection reason is falsy. #198

### Internals and Advanced

-   The internal interface for a promise now uses
    `dispatchPromise(resolve, op, operands)` instead of `sendPromise(op,
    resolve, ...operands)`, which reduces the cases where Q needs to do
    argument slicing.
-   The internal protocol uses different operands. "put" is now "set".
    "del" is now "delete". "view" and "viewInfo" have been removed.
-   `Q.fulfill` has been added. It is distinct from `Q.resolve` in that
    it does not pass promises through, nor coerces promises from other
    systems. The promise becomes the fulfillment value. This is only
    recommended for use when trying to fulfill a promise with an object that has
    a `then` function that is at the same time not a promise.

## 0.8.12
- Treat foreign promises as unresolved in `Q.isFulfilled`; this lets `Q.all`
  work on arrays containing foreign promises. #154
- Fix minor incompliances with the [Promises/A+ spec][] and [test suite][]. #157
  #158

[Promises/A+ spec]: http://promises-aplus.github.com/promises-spec/
[test suite]: https://github.com/promises-aplus/promises-tests

## 0.8.11

 - Added ``nfcall``, ``nfapply``, and ``nfbind`` as ``thisp``-less versions of
   ``ncall``, ``napply``, and ``nbind``. The latter are now deprecated. #142
 - Long stack traces no longer cause linearly-growing memory usage when chaining
   promises together. #111
 - Inspecting ``error.stack`` in a rejection handler will now give a long stack
   trace. #103
 - Fixed ``Q.timeout`` to clear its timeout handle when the promise is rejected;
   previously, it kept the event loop alive until the timeout period expired.
   #145 @dfilatov
 - Added `q/queue` module, which exports an infinite promise queue
   constructor.

## 0.8.10

 - Added ``done`` as a replacement for ``end``, taking the usual fulfillment,
   rejection, and progress handlers. It's essentially equivalent to
   ``then(f, r, p).end()``.
 - Added ``Q.onerror``, a settable error trap that you can use to get full stack
   traces for uncaught errors. #94
 - Added ``thenResolve`` as a shortcut for returning a constant value once a
   promise is fulfilled. #108 @ForbesLindesay
 - Various tweaks to progress notification, including propagation and
   transformation of progress values and only forwarding a single progress
   object.
 - Renamed ``nend`` to ``nodeify``. It no longer returns an always-fulfilled
   promise when a Node callback is passed.
 - ``deferred.resolve`` and ``deferred.reject`` no longer (sometimes) return
   ``deferred.promise``.
 - Fixed stack traces getting mangled if they hit ``end`` twice. #116 #121 @ef4
 - Fixed ``ninvoke`` and ``npost`` to work on promises for objects with Node
   methods. #134
 - Fixed accidental coercion of objects with nontrivial ``valueOf`` methods,
   like ``Date``s, by the promise's ``valueOf`` method. #135
 - Fixed ``spread`` not calling the passed rejection handler if given a rejected
   promise.

## 0.8.9

 - Added ``nend``
 - Added preliminary progress notification support, via
   ``promise.then(onFulfilled, onRejected, onProgress)``,
   ``promise.progress(onProgress)``, and ``deferred.notify(...progressData)``.
 - Made ``put`` and ``del`` return the object acted upon for easier chaining.
   #84
 - Fixed coercion cycles with cooperating promises. #106

## 0.8.7

 - Support [Montage Require](http://github.com/kriskowal/mr)

## 0.8.6

 - Fixed ``npost`` and ``ninvoke`` to pass the correct ``thisp``. #74
 - Fixed various cases involving unorthodox rejection reasons. #73 #90
   @ef4
 - Fixed double-resolving of misbehaved custom promises. #75
 - Sped up ``Q.all`` for arrays contain already-resolved promises or scalar
   values. @ForbesLindesay
 - Made stack trace filtering work when concatenating assets. #93 @ef4
 - Added warnings for deprecated methods. @ForbesLindesay
 - Added ``.npmignore`` file so that dependent packages get a slimmer
   ``node_modules`` directory.

## 0.8.5

 - Added preliminary support for long traces (@domenic)
 - Added ``fapply``, ``fcall``, ``fbind`` for non-thisp
   promised function calls.
 - Added ``return`` for async generators, where generators
   are implemented.
 - Rejected promises now have an "exception" property.  If an object
   isRejected(object), then object.valueOf().exception will
   be the wrapped error.
 - Added Jasmine specifications
 - Support Internet Explorers 7â€“9 (with multiple bug fixes @domenic)
 - Support Firefox 12
 - Support Safari 5.1.5
 - Support Chrome 18

## 0.8.4

 - WARNING: ``promise.timeout`` is now rejected with an ``Error`` object
   and the message now includes the duration of the timeout in
   miliseconds.  This doesn't constitute (in my opinion) a
   backward-incompatibility since it is a change of an undocumented and
   unspecified public behavior, but if you happened to depend on the
   exception being a string, you will need to revise your code.
 - Added ``deferred.makeNodeResolver()`` to replace the more cryptic
   ``deferred.node()`` method.
 - Added experimental ``Q.promise(maker(resolve, reject))`` to make a
   promise inside a callback, such that thrown exceptions in the
   callback are converted and the resolver and rejecter are arguments.
   This is a shorthand for making a deferred directly and inspired by
   @gozalaâ€™s stream constructor pattern and the Microsoft Windows Metro
   Promise constructor interface.
 - Added experimental ``Q.begin()`` that is intended to kick off chains
   of ``.then`` so that each of these can be reordered without having to
   edit the new and former first step.

## 0.8.3

 - Added ``isFulfilled``, ``isRejected``, and ``isResolved``
   to the promise prototype.
 - Added ``allResolved`` for waiting for every promise to either be
   fulfilled or rejected, without propagating an error. @utvara #53
 - Added ``Q.bind`` as a method to transform functions that
   return and throw into promise-returning functions. See
   [an example](https://gist.github.com/1782808). @domenic
 - Renamed ``node`` export to ``nbind``, and added ``napply`` to
   complete the set. ``node`` remains as deprecated. @domenic #58
 - Renamed ``Method`` export to ``sender``.  ``Method``
   remains as deprecated and will be removed in the next
   major version since I expect it has very little usage.
 - Added browser console message indicating a live list of
   unhandled errors.
 - Added support for ``msSetImmediate`` (IE10) or ``setImmediate``
   (available via [polyfill](https://github.com/NobleJS/setImmediate))
   as a browser-side ``nextTick`` implementation. #44 #50 #59
 - Stopped using the event-queue dependency, which was in place for
   Narwhal support: now directly using ``process.nextTick``.
 - WARNING: EXPERIMENTAL: added ``finally`` alias for ``fin``, ``catch``
   alias for ``fail``, ``try`` alias for ``call``, and ``delete`` alias
   for ``del``.  These properties are enquoted in the library for
   cross-browser compatibility, but may be used as property names in
   modern engines.

## 0.8.2

 - Deprecated ``ref`` in favor of ``resolve`` as recommended by
   @domenic.
 - Update event-queue dependency.

## 0.8.1

 - Fixed Opera bug. #35 @cadorn
 - Fixed ``Q.all([])`` #32 @domenic

## 0.8.0

 - WARNING: ``enqueue`` removed.  Use ``nextTick`` instead.
   This is more consistent with NodeJS and (subjectively)
   more explicit and intuitive.
 - WARNING: ``def`` removed.  Use ``master`` instead.  The
   term ``def`` was too confusing to new users.
 - WARNING: ``spy`` removed in favor of ``fin``.
 - WARNING: ``wait`` removed. Do ``all(args).get(0)`` instead.
 - WARNING: ``join`` removed. Do ``all(args).spread(callback)`` instead.
 - WARNING: Removed the ``Q`` function module.exports alias
   for ``Q.ref``. It conflicts with ``Q.apply`` in weird
   ways, making it uncallable.
 - Revised ``delay`` so that it accepts both ``(value,
   timeout)`` and ``(timeout)`` variations based on
   arguments length.
 - Added ``ref().spread(cb(...args))``, a variant of
   ``then`` that spreads an array across multiple arguments.
   Useful with ``all()``.
 - Added ``defer().node()`` Node callback generator.  The
   callback accepts ``(error, value)`` or ``(error,
   ...values)``.  For multiple value arguments, the
   fulfillment value is an array, useful in conjunction with
   ``spread``.
 - Added ``node`` and ``ncall``, both with the signature
   ``(fun, thisp_opt, ...args)``.  The former is a decorator
   and the latter calls immediately.  ``node`` optional
   binds and partially applies.  ``ncall`` can bind and pass
   arguments.

## 0.7.2

 - Fixed thenable promise assimilation.

## 0.7.1

 - Stopped shimming ``Array.prototype.reduce``. The
   enumerable property has bad side-effects.  Libraries that
   depend on this (for example, QQ) will need to be revised.

## 0.7.0 - BACKWARD INCOMPATIBILITY

 - WARNING: Removed ``report`` and ``asap``
 - WARNING: The ``callback`` argument of the ``fin``
   function no longer receives any arguments. Thus, it can
   be used to call functions that should not receive
   arguments on resolution.  Use ``when``, ``then``, or
   ``fail`` if you need a value.
 - IMPORTANT: Fixed a bug in the use of ``MessageChannel``
   for ``nextTick``.
 - Renamed ``enqueue`` to ``nextTick``.
 - Added experimental ``view`` and ``viewInfo`` for creating
   views of promises either when or before they're
   fulfilled.
 - Shims are now externally applied so subsequent scripts or
   dependees can use them.
 - Improved minification results.
 - Improved readability.

## 0.6.0 - BACKWARD INCOMPATIBILITY

 - WARNING: In practice, the implementation of ``spy`` and
   the name ``fin`` were useful.  I've removed the old
   ``fin`` implementation and renamed/aliased ``spy``.
 - The "q" module now exports its ``ref`` function as a "Q"
   constructor, with module systems that support exports
   assignment including NodeJS, RequireJS, and when used as
   a ``<script>`` tag. Notably, strictly compliant CommonJS
   does not support this, but UncommonJS does.
 - Added ``async`` decorator for generators that use yield
   to "trampoline" promises. In engines that support
   generators (SpiderMonkey), this will greatly reduce the
   need for nested callbacks.
 - Made ``when`` chainable.
 - Made ``all`` chainable.

## 0.5.3

 - Added ``all`` and refactored ``join`` and ``wait`` to use
   it.  All of these will now reject at the earliest
   rejection.

## 0.5.2

 - Minor improvement to ``spy``; now waits for resolution of
   callback promise.

## 0.5.1

 - Made most Q API methods chainable on promise objects, and
   turned the previous promise-methods of ``join``,
   ``wait``, and ``report`` into Q API methods.
 - Added ``apply`` and ``call`` to the Q API, and ``apply``
   as a promise handler.
 - Added ``fail``, ``fin``, and ``spy`` to Q and the promise
   prototype for convenience when observing rejection,
   fulfillment and rejection, or just observing without
   affecting the resolution.
 - Renamed ``def`` (although ``def`` remains shimmed until
   the next major release) to ``master``.
 - Switched to using ``MessageChannel`` for next tick task
   enqueue in browsers that support it.

## 0.5.0 - MINOR BACKWARD INCOMPATIBILITY

 - Exceptions are no longer reported when consumed.
 - Removed ``error`` from the API.  Since exceptions are
   getting consumed, throwing them in an errback causes the
   exception to silently disappear.  Use ``end``.
 - Added ``end`` as both an API method and a promise-chain
   ending method.  It causes propagated rejections to be
   thrown, which allows Node to write stack traces and
   emit ``uncaughtException`` events, and browsers to
   likewise emit ``onerror`` and log to the console.
 - Added ``join`` and ``wait`` as promise chain functions,
   so you can wait for variadic promises, returning your own
   promise back, or join variadic promises, resolving with a
   callback that receives variadic fulfillment values.

## 0.4.4

 - ``end`` no longer returns a promise. It is the end of the
   promise chain.
 - Stopped reporting thrown exceptions in ``when`` callbacks
   and errbacks.  These must be explicitly reported through
   ``.end()``, ``.then(null, Q.error)``, or some other
   mechanism.
 - Added ``report`` as an API method, which can be used as
   an errback to report and propagate an error.
 - Added ``report`` as a promise-chain method, so an error
   can be reported if it passes such a gate.

## 0.4.3

 - Fixed ``<script>`` support that regressed with 0.4.2
   because of "use strict" in the module system
   multi-plexer.

## 0.4.2

 - Added support for RequireJS (jburke)

## 0.4.1

 - Added an "end" method to the promise prototype,
   as a shorthand for waiting for the promise to
   be resolved gracefully, and failing to do so,
   to dump an error message.

## 0.4.0 - BACKWARD INCOMPATIBLE*

 - *Removed the utility modules. NPM and Node no longer
   expose any module except the main module.  These have
   been moved and merged into the "qq" package.
 - *In a non-CommonJS browser, q.js can be used as a script.
   It now creates a Q global variable.
 - Fixed thenable assimilation.
 - Fixed some issues with asap, when it resolves to
   undefined, or throws an exception.

## 0.3.0 - BACKWARD-INCOMPATIBLE

 - The `post` method has been reverted to its original
   signature, as provided in Tyler Close's `ref_send` API.
   That is, `post` accepts two arguments, the second of
   which is an arbitrary object, but usually invocation
   arguments as an `Array`.  To provide variadic arguments
   to `post`, there is a new `invoke` function that posts
   the variadic arguments to the value given in the first
   argument.
 - The `defined` method has been moved from `q` to `q/util`
   since it gets no use in practice but is still
   theoretically useful.
 - The `Promise` constructor has been renamed to
   `makePromise` to be consistent with the convention that
   functions that do not require the `new` keyword to be
   used as constructors have camelCase names.
 - The `isResolved` function has been renamed to
   `isFulfilled`.  There is a new `isResolved` function that
   indicates whether a value is not a promise or, if it is a
   promise, whether it has been either fulfilled or
   rejected.  The code has been revised to reflect this
   nuance in terminology.

## 0.2.10

 - Added `join` to `"q/util"` for variadically joining
   multiple promises.

## 0.2.9

 - The future-compatible `invoke` method has been added,
   to replace `post`, since `post` will become backward-
   incompatible in the next major release.
 - Exceptions thrown in the callbacks of a `when` call are
   now emitted to Node's `"uncaughtException"` `process`
   event in addition to being returned as a rejection reason.

## 0.2.8

 - Exceptions thrown in the callbacks of a `when` call
   are now consumed, warned, and transformed into
   rejections of the promise returned by `when`.

## 0.2.7

 - Fixed a minor bug in thenable assimilation, regressed
   because of the change in the forwarding protocol.
 - Fixed behavior of "q/util" `deep` method on dates and
   other primitives. Github issue #11.

## 0.2.6

 - Thenables (objects with a "then" method) are accepted
   and provided, bringing this implementation of Q
   into conformance with Promises/A, B, and D.
 - Added `makePromise`, to replace the `Promise` function
   eventually.
 - Rejections are now also duck-typed. A rejection is a
   promise with a valueOf method that returns a rejection
   descriptor. A rejection descriptor has a
   "promiseRejected" property equal to "true" and a
   "reason" property corresponding to the rejection reason.
 - Altered the `makePromise` API such that the `fallback`
   method no longer receives a superfluous `resolved` method
   after the `operator`.  The fallback method is responsible
   only for returning a resolution.  This breaks an
   undocumented API, so third-party API's depending on the
   previous undocumented behavior may break.

## 0.2.5

 - Changed promises into a duck-type such that multiple
   instances of the Q module can exchange promise objects.
   A promise is now defined as "an object that implements the
   `promiseSend(op, resolved, ...)` method and `valueOf`".
 - Exceptions in promises are now captured and returned
   as rejections.

## 0.2.4

 - Fixed bug in `ref` that prevented `del` messages from
   being received (gozala)
 - Fixed a conflict with FireFox 4; constructor property
   is now read-only.

## 0.2.3

 - Added `keys` message to promises and to the promise API.

## 0.2.2

 - Added boilerplate to `q/queue` and `q/util`.
 - Fixed missing dependency to `q/queue`.

## 0.2.1

 - The `resolve` and `reject` methods of `defer` objects now
   return the resolution promise for convenience.
 - Added `q/util`, which provides `step`, `delay`, `shallow`,
   `deep`, and three reduction orders.
 - Added `q/queue` module for a promise `Queue`.
 - Added `q-comm` to the list of compatible libraries.
 - Deprecated `defined` from `q`, with intent to move it to
   `q/util`.

## 0.2.0 - BACKWARD INCOMPATIBLE

 - Changed post(ref, name, args) to variadic
   post(ref, name, ...args). BACKWARD INCOMPATIBLE
 - Added a def(value) method to annotate an object as being
   necessarily a local value that cannot be serialized, such
   that inter-process/worker/vat promise communication
   libraries will send messages to it, but never send it
   back.
 - Added a send(value, op, ...args) method to the public API, for
   forwarding messages to a value or promise in a future turn.

## 0.1.9

 - Added isRejected() for testing whether a value is a rejected
   promise.  isResolved() retains the behavior of stating
   that rejected promises are not resolved.

## 0.1.8

 - Fixed isResolved(null) and isResolved(undefined) [issue #9]
 - Fixed a problem with the Object.create shim

## 0.1.7

 - shimmed ES5 Object.create in addition to Object.freeze
   for compatibility on non-ES5 engines (gozala)

## 0.1.6

 - Q.isResolved added
 - promise.valueOf() now returns the value of resolved
   and near values
 - asap retried
 - promises are frozen when possible

## 0.1.5

 - fixed dependency list for Teleport (gozala)
 - all unit tests now pass (gozala)

## 0.1.4

 - added support for Teleport as an engine (gozala)
 - simplified and updated methods for getting internal
   print and enqueue functions universally (gozala)

## 0.1.3

 - fixed erroneous link to the q module in package.json

## 0.1.2

 - restructured for overlay style package compatibility

## 0.1.0

 - removed asap because it was broken, probably down to the
   philosophy.

## 0.0.3

 - removed q-util
 - fixed asap so it returns a value if completed

## 0.0.2

 - added q-util

## 0.0.1

 - initial version
Copyright 2009â€“2017 Kristopher Michael Kowal. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
{
  "author": {
    "name": "Kris Kowal",
    "email": "kris@cixar.com",
    "url": "https://github.com/kriskowal"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "A library for promises (CommonJS/Promises/A,B,D)",
  "devDependencies": {
    "cover": "*",
    "grunt": "~0.4.1",
    "grunt-cli": "~0.1.9",
    "grunt-contrib-uglify": "~0.9.1",
    "jasmine-node": "1.11.0",
    "jshint": "~2.1.9",
    "matcha": "~0.2.0",
    "opener": "*",
    "promises-aplus-tests": "1.x"
  },
  "directories": {
    "test": "./spec"
  },
  "engines": {
    "node": ">=0.6.0",
    "teleport": ">=0.2.0"
  },
  "files": [
    "LICENSE",
    "q.js",
    "queue.js"
  ],
  "homepage": "https://github.com/kriskowal/q",
  "license": "MIT",
  "main": "q.js",
  "name": "q",
  "overlay": {
    "teleport": {
      "dependencies": {
        "system": ">=0.0.4"
      }
    }
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/kriskowal/q.git"
  },
  "version": "1.5.1"
}// vim:ts=4:sts=4:sw=4:
/*!
 *
 * Copyright 2009-2017 Kris Kowal under the terms of the MIT
 * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
 *
 * With parts by Tyler Close
 * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
 * at http://www.opensource.org/licenses/mit-license.html
 * Forked at ref_send.js version: 2009-05-11
 *
 * With parts by Mark Miller
 * Copyright (C) 2011 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

(function (definition) {
    "use strict";

    // This file will function properly as a <script> tag, or a module
    // using CommonJS and NodeJS or RequireJS module formats.  In
    // Common/Node/RequireJS, the module exports the Q API and when
    // executed as a simple <script>, it creates a Q global instead.

    // Montage Require
    if (typeof bootstrap === "function") {
        bootstrap("promise", definition);

    // CommonJS
    } else if (typeof exports === "object" && typeof module === "object") {
        module.exports = definition();

    // RequireJS
    } else if (typeof define === "function" && define.amd) {
        define(definition);

    // SES (Secure EcmaScript)
    } else if (typeof ses !== "undefined") {
        if (!ses.ok()) {
            return;
        } else {
            ses.makeQ = definition;
        }

    // <script>
    } else if (typeof window !== "undefined" || typeof self !== "undefined") {
        // Prefer window over self for add-on scripts. Use self for
        // non-windowed contexts.
        var global = typeof window !== "undefined" ? window : self;

        // Get the `window` object, save the previous Q global
        // and initialize Q as a global.
        var previousQ = global.Q;
        global.Q = definition();

        // Add a noConflict function so Q can be removed from the
        // global namespace.
        global.Q.noConflict = function () {
            global.Q = previousQ;
            return this;
        };

    } else {
        throw new Error("This environment was not anticipated by Q. Please file a bug.");
    }

})(function () {
"use strict";

var hasStacks = false;
try {
    throw new Error();
} catch (e) {
    hasStacks = !!e.stack;
}

// All code after this point will be filtered from stack traces reported
// by Q.
var qStartingLine = captureLine();
var qFileName;

// shims

// used for fallback in "allResolved"
var noop = function () {};

// Use the fastest possible means to execute a task in a future turn
// of the event loop.
var nextTick =(function () {
    // linked list of tasks (single, with head node)
    var head = {task: void 0, next: null};
    var tail = head;
    var flushing = false;
    var requestTick = void 0;
    var isNodeJS = false;
    // queue for late tasks, used by unhandled rejection tracking
    var laterQueue = [];

    function flush() {
        /* jshint loopfunc: true */
        var task, domain;

        while (head.next) {
            head = head.next;
            task = head.task;
            head.task = void 0;
            domain = head.domain;

            if (domain) {
                head.domain = void 0;
                domain.enter();
            }
            runSingle(task, domain);

        }
        while (laterQueue.length) {
            task = laterQueue.pop();
            runSingle(task);
        }
        flushing = false;
    }
    // runs a single function in the async queue
    function runSingle(task, domain) {
        try {
            task();

        } catch (e) {
            if (isNodeJS) {
                // In node, uncaught exceptions are considered fatal errors.
                // Re-throw them synchronously to interrupt flushing!

                // Ensure continuation if the uncaught exception is suppressed
                // listening "uncaughtException" events (as domains does).
                // Continue in next event to avoid tick recursion.
                if (domain) {
                    domain.exit();
                }
                setTimeout(flush, 0);
                if (domain) {
                    domain.enter();
                }

                throw e;

            } else {
                // In browsers, uncaught exceptions are not fatal.
                // Re-throw them asynchronously to avoid slow-downs.
                setTimeout(function () {
                    throw e;
                }, 0);
            }
        }

        if (domain) {
            domain.exit();
        }
    }

    nextTick = function (task) {
        tail = tail.next = {
            task: task,
            domain: isNodeJS && process.domain,
            next: null
        };

        if (!flushing) {
            flushing = true;
            requestTick();
        }
    };

    if (typeof process === "object" &&
        process.toString() === "[object process]" && process.nextTick) {
        // Ensure Q is in a real Node environment, with a `process.nextTick`.
        // To see through fake Node environments:
        // * Mocha test runner - exposes a `process` global without a `nextTick`
        // * Browserify - exposes a `process.nexTick` function that uses
        //   `setTimeout`. In this case `setImmediate` is preferred because
        //    it is faster. Browserify's `process.toString()` yields
        //   "[object Object]", while in a real Node environment
        //   `process.toString()` yields "[object process]".
        isNodeJS = true;

        requestTick = function () {
            process.nextTick(flush);
        };

    } else if (typeof setImmediate === "function") {
        // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
        if (typeof window !== "undefined") {
            requestTick = setImmediate.bind(window, flush);
        } else {
            requestTick = function () {
                setImmediate(flush);
            };
        }

    } else if (typeof MessageChannel !== "undefined") {
        // modern browsers
        // http://www.nonblocking.io/2011/06/windownexttick.html
        var channel = new MessageChannel();
        // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
        // working message ports the first time a page loads.
        channel.port1.onmessage = function () {
            requestTick = requestPortTick;
            channel.port1.onmessage = flush;
            flush();
        };
        var requestPortTick = function () {
            // Opera requires us to provide a message payload, regardless of
            // whether we use it.
            channel.port2.postMessage(0);
        };
        requestTick = function () {
            setTimeout(flush, 0);
            requestPortTick();
        };

    } else {
        // old browsers
        requestTick = function () {
            setTimeout(flush, 0);
        };
    }
    // runs a task after all other tasks have been run
    // this is useful for unhandled rejection tracking that needs to happen
    // after all `then`d tasks have been run.
    nextTick.runAfter = function (task) {
        laterQueue.push(task);
        if (!flushing) {
            flushing = true;
            requestTick();
        }
    };
    return nextTick;
})();

// Attempt to make generics safe in the face of downstream
// modifications.
// There is no situation where this is necessary.
// If you need a security guarantee, these primordials need to be
// deeply frozen anyway, and if you donâ€™t need a security guarantee,
// this is just plain paranoid.
// However, this **might** have the nice side-effect of reducing the size of
// the minified code by reducing x.call() to merely x()
// See Mark Millerâ€™s explanation of what this does.
// http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
var call = Function.call;
function uncurryThis(f) {
    return function () {
        return call.apply(f, arguments);
    };
}
// This is equivalent, but slower:
// uncurryThis = Function_bind.bind(Function_bind.call);
// http://jsperf.com/uncurrythis

var array_slice = uncurryThis(Array.prototype.slice);

var array_reduce = uncurryThis(
    Array.prototype.reduce || function (callback, basis) {
        var index = 0,
            length = this.length;
        // concerning the initial value, if one is not provided
        if (arguments.length === 1) {
            // seek to the first value in the array, accounting
            // for the possibility that is is a sparse array
            do {
                if (index in this) {
                    basis = this[index++];
                    break;
                }
                if (++index >= length) {
                    throw new TypeError();
                }
            } while (1);
        }
        // reduce
        for (; index < length; index++) {
            // account for the possibility that the array is sparse
            if (index in this) {
                basis = callback(basis, this[index], index);
            }
        }
        return basis;
    }
);

var array_indexOf = uncurryThis(
    Array.prototype.indexOf || function (value) {
        // not a very good shim, but good enough for our one use of it
        for (var i = 0; i < this.length; i++) {
            if (this[i] === value) {
                return i;
            }
        }
        return -1;
    }
);

var array_map = uncurryThis(
    Array.prototype.map || function (callback, thisp) {
        var self = this;
        var collect = [];
        array_reduce(self, function (undefined, value, index) {
            collect.push(callback.call(thisp, value, index, self));
        }, void 0);
        return collect;
    }
);

var object_create = Object.create || function (prototype) {
    function Type() { }
    Type.prototype = prototype;
    return new Type();
};

var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
    obj[prop] = descriptor.value;
    return obj;
};

var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);

var object_keys = Object.keys || function (object) {
    var keys = [];
    for (var key in object) {
        if (object_hasOwnProperty(object, key)) {
            keys.push(key);
        }
    }
    return keys;
};

var object_toString = uncurryThis(Object.prototype.toString);

function isObject(value) {
    return value === Object(value);
}

// generator related shims

// FIXME: Remove this function once ES6 generators are in SpiderMonkey.
function isStopIteration(exception) {
    return (
        object_toString(exception) === "[object StopIteration]" ||
        exception instanceof QReturnValue
    );
}

// FIXME: Remove this helper and Q.return once ES6 generators are in
// SpiderMonkey.
var QReturnValue;
if (typeof ReturnValue !== "undefined") {
    QReturnValue = ReturnValue;
} else {
    QReturnValue = function (value) {
        this.value = value;
    };
}

// long stack traces

var STACK_JUMP_SEPARATOR = "From previous event:";

function makeStackTraceLong(error, promise) {
    // If possible, transform the error stack trace by removing Node and Q
    // cruft, then concatenating with the stack trace of `promise`. See #57.
    if (hasStacks &&
        promise.stack &&
        typeof error === "object" &&
        error !== null &&
        error.stack
    ) {
        var stacks = [];
        for (var p = promise; !!p; p = p.source) {
            if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
                object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
                stacks.unshift(p.stack);
            }
        }
        stacks.unshift(error.stack);

        var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
        var stack = filterStackString(concatedStacks);
        object_defineProperty(error, "stack", {value: stack, configurable: true});
    }
}

function filterStackString(stackString) {
    var lines = stackString.split("\n");
    var desiredLines = [];
    for (var i = 0; i < lines.length; ++i) {
        var line = lines[i];

        if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
            desiredLines.push(line);
        }
    }
    return desiredLines.join("\n");
}

function isNodeFrame(stackLine) {
    return stackLine.indexOf("(module.js:") !== -1 ||
           stackLine.indexOf("(node.js:") !== -1;
}

function getFileNameAndLineNumber(stackLine) {
    // Named functions: "at functionName (filename:lineNumber:columnNumber)"
    // In IE10 function name can have spaces ("Anonymous function") O_o
    var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
    if (attempt1) {
        return [attempt1[1], Number(attempt1[2])];
    }

    // Anonymous functions: "at filename:lineNumber:columnNumber"
    var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
    if (attempt2) {
        return [attempt2[1], Number(attempt2[2])];
    }

    // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
    var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
    if (attempt3) {
        return [attempt3[1], Number(attempt3[2])];
    }
}

function isInternalFrame(stackLine) {
    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);

    if (!fileNameAndLineNumber) {
        return false;
    }

    var fileName = fileNameAndLineNumber[0];
    var lineNumber = fileNameAndLineNumber[1];

    return fileName === qFileName &&
        lineNumber >= qStartingLine &&
        lineNumber <= qEndingLine;
}

// discover own file name and line number range for filtering stack
// traces
function captureLine() {
    if (!hasStacks) {
        return;
    }

    try {
        throw new Error();
    } catch (e) {
        var lines = e.stack.split("\n");
        var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
        var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
        if (!fileNameAndLineNumber) {
            return;
        }

        qFileName = fileNameAndLineNumber[0];
        return fileNameAndLineNumber[1];
    }
}

function deprecate(callback, name, alternative) {
    return function () {
        if (typeof console !== "undefined" &&
            typeof console.warn === "function") {
            console.warn(name + " is deprecated, use " + alternative +
                         " instead.", new Error("").stack);
        }
        return callback.apply(callback, arguments);
    };
}

// end of shims
// beginning of real work

/**
 * Constructs a promise for an immediate reference, passes promises through, or
 * coerces promises from different systems.
 * @param value immediate reference or promise
 */
function Q(value) {
    // If the object is already a Promise, return it directly.  This enables
    // the resolve function to both be used to created references from objects,
    // but to tolerably coerce non-promises to promises.
    if (value instanceof Promise) {
        return value;
    }

    // assimilate thenables
    if (isPromiseAlike(value)) {
        return coerce(value);
    } else {
        return fulfill(value);
    }
}
Q.resolve = Q;

/**
 * Performs a task in a future turn of the event loop.
 * @param {Function} task
 */
Q.nextTick = nextTick;

/**
 * Controls whether or not long stack traces will be on
 */
Q.longStackSupport = false;

/**
 * The counter is used to determine the stopping point for building
 * long stack traces. In makeStackTraceLong we walk backwards through
 * the linked list of promises, only stacks which were created before
 * the rejection are concatenated.
 */
var longStackCounter = 1;

// enable long stacks if Q_DEBUG is set
if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
    Q.longStackSupport = true;
}

/**
 * Constructs a {promise, resolve, reject} object.
 *
 * `resolve` is a callback to invoke with a more resolved value for the
 * promise. To fulfill the promise, invoke `resolve` with any value that is
 * not a thenable. To reject the promise, invoke `resolve` with a rejected
 * thenable, or invoke `reject` with the reason directly. To resolve the
 * promise to another thenable, thus putting it in the same state, invoke
 * `resolve` with that other thenable.
 */
Q.defer = defer;
function defer() {
    // if "messages" is an "Array", that indicates that the promise has not yet
    // been resolved.  If it is "undefined", it has been resolved.  Each
    // element of the messages array is itself an array of complete arguments to
    // forward to the resolved promise.  We coerce the resolution value to a
    // promise using the `resolve` function because it handles both fully
    // non-thenable values and other thenables gracefully.
    var messages = [], progressListeners = [], resolvedPromise;

    var deferred = object_create(defer.prototype);
    var promise = object_create(Promise.prototype);

    promise.promiseDispatch = function (resolve, op, operands) {
        var args = array_slice(arguments);
        if (messages) {
            messages.push(args);
            if (op === "when" && operands[1]) { // progress operand
                progressListeners.push(operands[1]);
            }
        } else {
            Q.nextTick(function () {
                resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
            });
        }
    };

    // XXX deprecated
    promise.valueOf = function () {
        if (messages) {
            return promise;
        }
        var nearerValue = nearer(resolvedPromise);
        if (isPromise(nearerValue)) {
            resolvedPromise = nearerValue; // shorten chain
        }
        return nearerValue;
    };

    promise.inspect = function () {
        if (!resolvedPromise) {
            return { state: "pending" };
        }
        return resolvedPromise.inspect();
    };

    if (Q.longStackSupport && hasStacks) {
        try {
            throw new Error();
        } catch (e) {
            // NOTE: don't try to use `Error.captureStackTrace` or transfer the
            // accessor around; that causes memory leaks as per GH-111. Just
            // reify the stack trace as a string ASAP.
            //
            // At the same time, cut off the first line; it's always just
            // "[object Promise]\n", as per the `toString`.
            promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
            promise.stackCounter = longStackCounter++;
        }
    }

    // NOTE: we do the checks for `resolvedPromise` in each method, instead of
    // consolidating them into `become`, since otherwise we'd create new
    // promises with the lines `become(whatever(value))`. See e.g. GH-252.

    function become(newPromise) {
        resolvedPromise = newPromise;

        if (Q.longStackSupport && hasStacks) {
            // Only hold a reference to the new promise if long stacks
            // are enabled to reduce memory usage
            promise.source = newPromise;
        }

        array_reduce(messages, function (undefined, message) {
            Q.nextTick(function () {
                newPromise.promiseDispatch.apply(newPromise, message);
            });
        }, void 0);

        messages = void 0;
        progressListeners = void 0;
    }

    deferred.promise = promise;
    deferred.resolve = function (value) {
        if (resolvedPromise) {
            return;
        }

        become(Q(value));
    };

    deferred.fulfill = function (value) {
        if (resolvedPromise) {
            return;
        }

        become(fulfill(value));
    };
    deferred.reject = function (reason) {
        if (resolvedPromise) {
            return;
        }

        become(reject(reason));
    };
    deferred.notify = function (progress) {
        if (resolvedPromise) {
            return;
        }

        array_reduce(progressListeners, function (undefined, progressListener) {
            Q.nextTick(function () {
                progressListener(progress);
            });
        }, void 0);
    };

    return deferred;
}

/**
 * Creates a Node-style callback that will resolve or reject the deferred
 * promise.
 * @returns a nodeback
 */
defer.prototype.makeNodeResolver = function () {
    var self = this;
    return function (error, value) {
        if (error) {
            self.reject(error);
        } else if (arguments.length > 2) {
            self.resolve(array_slice(arguments, 1));
        } else {
            self.resolve(value);
        }
    };
};

/**
 * @param resolver {Function} a function that returns nothing and accepts
 * the resolve, reject, and notify functions for a deferred.
 * @returns a promise that may be resolved with the given resolve and reject
 * functions, or rejected by a thrown exception in resolver
 */
Q.Promise = promise; // ES6
Q.promise = promise;
function promise(resolver) {
    if (typeof resolver !== "function") {
        throw new TypeError("resolver must be a function.");
    }
    var deferred = defer();
    try {
        resolver(deferred.resolve, deferred.reject, deferred.notify);
    } catch (reason) {
        deferred.reject(reason);
    }
    return deferred.promise;
}

promise.race = race; // ES6
promise.all = all; // ES6
promise.reject = reject; // ES6
promise.resolve = Q; // ES6

// XXX experimental.  This method is a way to denote that a local value is
// serializable and should be immediately dispatched to a remote upon request,
// instead of passing a reference.
Q.passByCopy = function (object) {
    //freeze(object);
    //passByCopies.set(object, true);
    return object;
};

Promise.prototype.passByCopy = function () {
    //freeze(object);
    //passByCopies.set(object, true);
    return this;
};

/**
 * If two promises eventually fulfill to the same value, promises that value,
 * but otherwise rejects.
 * @param x {Any*}
 * @param y {Any*}
 * @returns {Any*} a promise for x and y if they are the same, but a rejection
 * otherwise.
 *
 */
Q.join = function (x, y) {
    return Q(x).join(y);
};

Promise.prototype.join = function (that) {
    return Q([this, that]).spread(function (x, y) {
        if (x === y) {
            // TODO: "===" should be Object.is or equiv
            return x;
        } else {
            throw new Error("Q can't join: not the same: " + x + " " + y);
        }
    });
};

/**
 * Returns a promise for the first of an array of promises to become settled.
 * @param answers {Array[Any*]} promises to race
 * @returns {Any*} the first promise to be settled
 */
Q.race = race;
function race(answerPs) {
    return promise(function (resolve, reject) {
        // Switch to this once we can assume at least ES5
        // answerPs.forEach(function (answerP) {
        //     Q(answerP).then(resolve, reject);
        // });
        // Use this in the meantime
        for (var i = 0, len = answerPs.length; i < len; i++) {
            Q(answerPs[i]).then(resolve, reject);
        }
    });
}

Promise.prototype.race = function () {
    return this.then(Q.race);
};

/**
 * Constructs a Promise with a promise descriptor object and optional fallback
 * function.  The descriptor contains methods like when(rejected), get(name),
 * set(name, value), post(name, args), and delete(name), which all
 * return either a value, a promise for a value, or a rejection.  The fallback
 * accepts the operation name, a resolver, and any further arguments that would
 * have been forwarded to the appropriate method above had a method been
 * provided with the proper name.  The API makes no guarantees about the nature
 * of the returned object, apart from that it is usable whereever promises are
 * bought and sold.
 */
Q.makePromise = Promise;
function Promise(descriptor, fallback, inspect) {
    if (fallback === void 0) {
        fallback = function (op) {
            return reject(new Error(
                "Promise does not support operation: " + op
            ));
        };
    }
    if (inspect === void 0) {
        inspect = function () {
            return {state: "unknown"};
        };
    }

    var promise = object_create(Promise.prototype);

    promise.promiseDispatch = function (resolve, op, args) {
        var result;
        try {
            if (descriptor[op]) {
                result = descriptor[op].apply(promise, args);
            } else {
                result = fallback.call(promise, op, args);
            }
        } catch (exception) {
            result = reject(exception);
        }
        if (resolve) {
            resolve(result);
        }
    };

    promise.inspect = inspect;

    // XXX deprecated `valueOf` and `exception` support
    if (inspect) {
        var inspected = inspect();
        if (inspected.state === "rejected") {
            promise.exception = inspected.reason;
        }

        promise.valueOf = function () {
            var inspected = inspect();
            if (inspected.state === "pending" ||
                inspected.state === "rejected") {
                return promise;
            }
            return inspected.value;
        };
    }

    return promise;
}

Promise.prototype.toString = function () {
    return "[object Promise]";
};

Promise.prototype.then = function (fulfilled, rejected, progressed) {
    var self = this;
    var deferred = defer();
    var done = false;   // ensure the untrusted promise makes at most a
                        // single call to one of the callbacks

    function _fulfilled(value) {
        try {
            return typeof fulfilled === "function" ? fulfilled(value) : value;
        } catch (exception) {
            return reject(exception);
        }
    }

    function _rejected(exception) {
        if (typeof rejected === "function") {
            makeStackTraceLong(exception, self);
            try {
                return rejected(exception);
            } catch (newException) {
                return reject(newException);
            }
        }
        return reject(exception);
    }

    function _progressed(value) {
        return typeof progressed === "function" ? progressed(value) : value;
    }

    Q.nextTick(function () {
        self.promiseDispatch(function (value) {
            if (done) {
                return;
            }
            done = true;

            deferred.resolve(_fulfilled(value));
        }, "when", [function (exception) {
            if (done) {
                return;
            }
            done = true;

            deferred.resolve(_rejected(exception));
        }]);
    });

    // Progress propagator need to be attached in the current tick.
    self.promiseDispatch(void 0, "when", [void 0, function (value) {
        var newValue;
        var threw = false;
        try {
            newValue = _progressed(value);
        } catch (e) {
            threw = true;
            if (Q.onerror) {
                Q.onerror(e);
            } else {
                throw e;
            }
        }

        if (!threw) {
            deferred.notify(newValue);
        }
    }]);

    return deferred.promise;
};

Q.tap = function (promise, callback) {
    return Q(promise).tap(callback);
};

/**
 * Works almost like "finally", but not called for rejections.
 * Original resolution value is passed through callback unaffected.
 * Callback may return a promise that will be awaited for.
 * @param {Function} callback
 * @returns {Q.Promise}
 * @example
 * doSomething()
 *   .then(...)
 *   .tap(console.log)
 *   .then(...);
 */
Promise.prototype.tap = function (callback) {
    callback = Q(callback);

    return this.then(function (value) {
        return callback.fcall(value).thenResolve(value);
    });
};

/**
 * Registers an observer on a promise.
 *
 * Guarantees:
 *
 * 1. that fulfilled and rejected will be called only once.
 * 2. that either the fulfilled callback or the rejected callback will be
 *    called, but not both.
 * 3. that fulfilled and rejected will not be called in this turn.
 *
 * @param value      promise or immediate reference to observe
 * @param fulfilled  function to be called with the fulfilled value
 * @param rejected   function to be called with the rejection exception
 * @param progressed function to be called on any progress notifications
 * @return promise for the return value from the invoked callback
 */
Q.when = when;
function when(value, fulfilled, rejected, progressed) {
    return Q(value).then(fulfilled, rejected, progressed);
}

Promise.prototype.thenResolve = function (value) {
    return this.then(function () { return value; });
};

Q.thenResolve = function (promise, value) {
    return Q(promise).thenResolve(value);
};

Promise.prototype.thenReject = function (reason) {
    return this.then(function () { throw reason; });
};

Q.thenReject = function (promise, reason) {
    return Q(promise).thenReject(reason);
};

/**
 * If an object is not a promise, it is as "near" as possible.
 * If a promise is rejected, it is as "near" as possible too.
 * If itâ€™s a fulfilled promise, the fulfillment value is nearer.
 * If itâ€™s a deferred promise and the deferred has been resolved, the
 * resolution is "nearer".
 * @param object
 * @returns most resolved (nearest) form of the object
 */

// XXX should we re-do this?
Q.nearer = nearer;
function nearer(value) {
    if (isPromise(value)) {
        var inspected = value.inspect();
        if (inspected.state === "fulfilled") {
            return inspected.value;
        }
    }
    return value;
}

/**
 * @returns whether the given object is a promise.
 * Otherwise it is a fulfilled value.
 */
Q.isPromise = isPromise;
function isPromise(object) {
    return object instanceof Promise;
}

Q.isPromiseAlike = isPromiseAlike;
function isPromiseAlike(object) {
    return isObject(object) && typeof object.then === "function";
}

/**
 * @returns whether the given object is a pending promise, meaning not
 * fulfilled or rejected.
 */
Q.isPending = isPending;
function isPending(object) {
    return isPromise(object) && object.inspect().state === "pending";
}

Promise.prototype.isPending = function () {
    return this.inspect().state === "pending";
};

/**
 * @returns whether the given object is a value or fulfilled
 * promise.
 */
Q.isFulfilled = isFulfilled;
function isFulfilled(object) {
    return !isPromise(object) || object.inspect().state === "fulfilled";
}

Promise.prototype.isFulfilled = function () {
    return this.inspect().state === "fulfilled";
};

/**
 * @returns whether the given object is a rejected promise.
 */
Q.isRejected = isRejected;
function isRejected(object) {
    return isPromise(object) && object.inspect().state === "rejected";
}

Promise.prototype.isRejected = function () {
    return this.inspect().state === "rejected";
};

//// BEGIN UNHANDLED REJECTION TRACKING

// This promise library consumes exceptions thrown in handlers so they can be
// handled by a subsequent promise.  The exceptions get added to this array when
// they are created, and removed when they are handled.  Note that in ES6 or
// shimmed environments, this would naturally be a `Set`.
var unhandledReasons = [];
var unhandledRejections = [];
var reportedUnhandledRejections = [];
var trackUnhandledRejections = true;

function resetUnhandledRejections() {
    unhandledReasons.length = 0;
    unhandledRejections.length = 0;

    if (!trackUnhandledRejections) {
        trackUnhandledRejections = true;
    }
}

function trackRejection(promise, reason) {
    if (!trackUnhandledRejections) {
        return;
    }
    if (typeof process === "object" && typeof process.emit === "function") {
        Q.nextTick.runAfter(function () {
            if (array_indexOf(unhandledRejections, promise) !== -1) {
                process.emit("unhandledRejection", reason, promise);
                reportedUnhandledRejections.push(promise);
            }
        });
    }

    unhandledRejections.push(promise);
    if (reason && typeof reason.stack !== "undefined") {
        unhandledReasons.push(reason.stack);
    } else {
        unhandledReasons.push("(no stack) " + reason);
    }
}

function untrackRejection(promise) {
    if (!trackUnhandledRejections) {
        return;
    }

    var at = array_indexOf(unhandledRejections, promise);
    if (at !== -1) {
        if (typeof process === "object" && typeof process.emit === "function") {
            Q.nextTick.runAfter(function () {
                var atReport = array_indexOf(reportedUnhandledRejections, promise);
                if (atReport !== -1) {
                    process.emit("rejectionHandled", unhandledReasons[at], promise);
                    reportedUnhandledRejections.splice(atReport, 1);
                }
            });
        }
        unhandledRejections.splice(at, 1);
        unhandledReasons.splice(at, 1);
    }
}

Q.resetUnhandledRejections = resetUnhandledRejections;

Q.getUnhandledReasons = function () {
    // Make a copy so that consumers can't interfere with our internal state.
    return unhandledReasons.slice();
};

Q.stopUnhandledRejectionTracking = function () {
    resetUnhandledRejections();
    trackUnhandledRejections = false;
};

resetUnhandledRejections();

//// END UNHANDLED REJECTION TRACKING

/**
 * Constructs a rejected promise.
 * @param reason value describing the failure
 */
Q.reject = reject;
function reject(reason) {
    var rejection = Promise({
        "when": function (rejected) {
            // note that the error has been handled
            if (rejected) {
                untrackRejection(this);
            }
            return rejected ? rejected(reason) : this;
        }
    }, function fallback() {
        return this;
    }, function inspect() {
        return { state: "rejected", reason: reason };
    });

    // Note that the reason has not been handled.
    trackRejection(rejection, reason);

    return rejection;
}

/**
 * Constructs a fulfilled promise for an immediate reference.
 * @param value immediate reference
 */
Q.fulfill = fulfill;
function fulfill(value) {
    return Promise({
        "when": function () {
            return value;
        },
        "get": function (name) {
            return value[name];
        },
        "set": function (name, rhs) {
            value[name] = rhs;
        },
        "delete": function (name) {
            delete value[name];
        },
        "post": function (name, args) {
            // Mark Miller proposes that post with no name should apply a
            // promised function.
            if (name === null || name === void 0) {
                return value.apply(void 0, args);
            } else {
                return value[name].apply(value, args);
            }
        },
        "apply": function (thisp, args) {
            return value.apply(thisp, args);
        },
        "keys": function () {
            return object_keys(value);
        }
    }, void 0, function inspect() {
        return { state: "fulfilled", value: value };
    });
}

/**
 * Converts thenables to Q promises.
 * @param promise thenable promise
 * @returns a Q promise
 */
function coerce(promise) {
    var deferred = defer();
    Q.nextTick(function () {
        try {
            promise.then(deferred.resolve, deferred.reject, deferred.notify);
        } catch (exception) {
            deferred.reject(exception);
        }
    });
    return deferred.promise;
}

/**
 * Annotates an object such that it will never be
 * transferred away from this process over any promise
 * communication channel.
 * @param object
 * @returns promise a wrapping of that object that
 * additionally responds to the "isDef" message
 * without a rejection.
 */
Q.master = master;
function master(object) {
    return Promise({
        "isDef": function () {}
    }, function fallback(op, args) {
        return dispatch(object, op, args);
    }, function () {
        return Q(object).inspect();
    });
}

/**
 * Spreads the values of a promised array of arguments into the
 * fulfillment callback.
 * @param fulfilled callback that receives variadic arguments from the
 * promised array
 * @param rejected callback that receives the exception if the promise
 * is rejected.
 * @returns a promise for the return value or thrown exception of
 * either callback.
 */
Q.spread = spread;
function spread(value, fulfilled, rejected) {
    return Q(value).spread(fulfilled, rejected);
}

Promise.prototype.spread = function (fulfilled, rejected) {
    return this.all().then(function (array) {
        return fulfilled.apply(void 0, array);
    }, rejected);
};

/**
 * The async function is a decorator for generator functions, turning
 * them into asynchronous generators.  Although generators are only part
 * of the newest ECMAScript 6 drafts, this code does not cause syntax
 * errors in older engines.  This code should continue to work and will
 * in fact improve over time as the language improves.
 *
 * ES6 generators are currently part of V8 version 3.19 with the
 * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
 * for longer, but under an older Python-inspired form.  This function
 * works on both kinds of generators.
 *
 * Decorates a generator function such that:
 *  - it may yield promises
 *  - execution will continue when that promise is fulfilled
 *  - the value of the yield expression will be the fulfilled value
 *  - it returns a promise for the return value (when the generator
 *    stops iterating)
 *  - the decorated function returns a promise for the return value
 *    of the generator or the first rejected promise among those
 *    yielded.
 *  - if an error is thrown in the generator, it propagates through
 *    every following yield until it is caught, or until it escapes
 *    the generator function altogether, and is translated into a
 *    rejection for the promise returned by the decorated generator.
 */
Q.async = async;
function async(makeGenerator) {
    return function () {
        // when verb is "send", arg is a value
        // when verb is "throw", arg is an exception
        function continuer(verb, arg) {
            var result;

            // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
            // engine that has a deployed base of browsers that support generators.
            // However, SM's generators use the Python-inspired semantics of
            // outdated ES6 drafts.  We would like to support ES6, but we'd also
            // like to make it possible to use generators in deployed browsers, so
            // we also support Python-style generators.  At some point we can remove
            // this block.

            if (typeof StopIteration === "undefined") {
                // ES6 Generators
                try {
                    result = generator[verb](arg);
                } catch (exception) {
                    return reject(exception);
                }
                if (result.done) {
                    return Q(result.value);
                } else {
                    return when(result.value, callback, errback);
                }
            } else {
                // SpiderMonkey Generators
                // FIXME: Remove this case when SM does ES6 generators.
                try {
                    result = generator[verb](arg);
                } catch (exception) {
                    if (isStopIteration(exception)) {
                        return Q(exception.value);
                    } else {
                        return reject(exception);
                    }
                }
                return when(result, callback, errback);
            }
        }
        var generator = makeGenerator.apply(this, arguments);
        var callback = continuer.bind(continuer, "next");
        var errback = continuer.bind(continuer, "throw");
        return callback();
    };
}

/**
 * The spawn function is a small wrapper around async that immediately
 * calls the generator and also ends the promise chain, so that any
 * unhandled errors are thrown instead of forwarded to the error
 * handler. This is useful because it's extremely common to run
 * generators at the top-level to work with libraries.
 */
Q.spawn = spawn;
function spawn(makeGenerator) {
    Q.done(Q.async(makeGenerator)());
}

// FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
/**
 * Throws a ReturnValue exception to stop an asynchronous generator.
 *
 * This interface is a stop-gap measure to support generator return
 * values in older Firefox/SpiderMonkey.  In browsers that support ES6
 * generators like Chromium 29, just use "return" in your generator
 * functions.
 *
 * @param value the return value for the surrounding generator
 * @throws ReturnValue exception with the value.
 * @example
 * // ES6 style
 * Q.async(function* () {
 *      var foo = yield getFooPromise();
 *      var bar = yield getBarPromise();
 *      return foo + bar;
 * })
 * // Older SpiderMonkey style
 * Q.async(function () {
 *      var foo = yield getFooPromise();
 *      var bar = yield getBarPromise();
 *      Q.return(foo + bar);
 * })
 */
Q["return"] = _return;
function _return(value) {
    throw new QReturnValue(value);
}

/**
 * The promised function decorator ensures that any promise arguments
 * are settled and passed as values (`this` is also settled and passed
 * as a value).  It will also ensure that the result of a function is
 * always a promise.
 *
 * @example
 * var add = Q.promised(function (a, b) {
 *     return a + b;
 * });
 * add(Q(a), Q(B));
 *
 * @param {function} callback The function to decorate
 * @returns {function} a function that has been decorated.
 */
Q.promised = promised;
function promised(callback) {
    return function () {
        return spread([this, all(arguments)], function (self, args) {
            return callback.apply(self, args);
        });
    };
}

/**
 * sends a message to a value in a future turn
 * @param object* the recipient
 * @param op the name of the message operation, e.g., "when",
 * @param args further arguments to be forwarded to the operation
 * @returns result {Promise} a promise for the result of the operation
 */
Q.dispatch = dispatch;
function dispatch(object, op, args) {
    return Q(object).dispatch(op, args);
}

Promise.prototype.dispatch = function (op, args) {
    var self = this;
    var deferred = defer();
    Q.nextTick(function () {
        self.promiseDispatch(deferred.resolve, op, args);
    });
    return deferred.promise;
};

/**
 * Gets the value of a property in a future turn.
 * @param object    promise or immediate reference for target object
 * @param name      name of property to get
 * @return promise for the property value
 */
Q.get = function (object, key) {
    return Q(object).dispatch("get", [key]);
};

Promise.prototype.get = function (key) {
    return this.dispatch("get", [key]);
};

/**
 * Sets the value of a property in a future turn.
 * @param object    promise or immediate reference for object object
 * @param name      name of property to set
 * @param value     new value of property
 * @return promise for the return value
 */
Q.set = function (object, key, value) {
    return Q(object).dispatch("set", [key, value]);
};

Promise.prototype.set = function (key, value) {
    return this.dispatch("set", [key, value]);
};

/**
 * Deletes a property in a future turn.
 * @param object    promise or immediate reference for target object
 * @param name      name of property to delete
 * @return promise for the return value
 */
Q.del = // XXX legacy
Q["delete"] = function (object, key) {
    return Q(object).dispatch("delete", [key]);
};

Promise.prototype.del = // XXX legacy
Promise.prototype["delete"] = function (key) {
    return this.dispatch("delete", [key]);
};

/**
 * Invokes a method in a future turn.
 * @param object    promise or immediate reference for target object
 * @param name      name of method to invoke
 * @param value     a value to post, typically an array of
 *                  invocation arguments for promises that
 *                  are ultimately backed with `resolve` values,
 *                  as opposed to those backed with URLs
 *                  wherein the posted value can be any
 *                  JSON serializable object.
 * @return promise for the return value
 */
// bound locally because it is used by other methods
Q.mapply = // XXX As proposed by "Redsandro"
Q.post = function (object, name, args) {
    return Q(object).dispatch("post", [name, args]);
};

Promise.prototype.mapply = // XXX As proposed by "Redsandro"
Promise.prototype.post = function (name, args) {
    return this.dispatch("post", [name, args]);
};

/**
 * Invokes a method in a future turn.
 * @param object    promise or immediate reference for target object
 * @param name      name of method to invoke
 * @param ...args   array of invocation arguments
 * @return promise for the return value
 */
Q.send = // XXX Mark Miller's proposed parlance
Q.mcall = // XXX As proposed by "Redsandro"
Q.invoke = function (object, name /*...args*/) {
    return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
};

Promise.prototype.send = // XXX Mark Miller's proposed parlance
Promise.prototype.mcall = // XXX As proposed by "Redsandro"
Promise.prototype.invoke = function (name /*...args*/) {
    return this.dispatch("post", [name, array_slice(arguments, 1)]);
};

/**
 * Applies the promised function in a future turn.
 * @param object    promise or immediate reference for target function
 * @param args      array of application arguments
 */
Q.fapply = function (object, args) {
    return Q(object).dispatch("apply", [void 0, args]);
};

Promise.prototype.fapply = function (args) {
    return this.dispatch("apply", [void 0, args]);
};

/**
 * Calls the promised function in a future turn.
 * @param object    promise or immediate reference for target function
 * @param ...args   array of application arguments
 */
Q["try"] =
Q.fcall = function (object /* ...args*/) {
    return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
};

Promise.prototype.fcall = function (/*...args*/) {
    return this.dispatch("apply", [void 0, array_slice(arguments)]);
};

/**
 * Binds the promised function, transforming return values into a fulfilled
 * promise and thrown errors into a rejected one.
 * @param object    promise or immediate reference for target function
 * @param ...args   array of application arguments
 */
Q.fbind = function (object /*...args*/) {
    var promise = Q(object);
    var args = array_slice(arguments, 1);
    return function fbound() {
        return promise.dispatch("apply", [
            this,
            args.concat(array_slice(arguments))
        ]);
    };
};
Promise.prototype.fbind = function (/*...args*/) {
    var promise = this;
    var args = array_slice(arguments);
    return function fbound() {
        return promise.dispatch("apply", [
            this,
            args.concat(array_slice(arguments))
        ]);
    };
};

/**
 * Requests the names of the owned properties of a promised
 * object in a future turn.
 * @param object    promise or immediate reference for target object
 * @return promise for the keys of the eventually settled object
 */
Q.keys = function (object) {
    return Q(object).dispatch("keys", []);
};

Promise.prototype.keys = function () {
    return this.dispatch("keys", []);
};

/**
 * Turns an array of promises into a promise for an array.  If any of
 * the promises gets rejected, the whole array is rejected immediately.
 * @param {Array*} an array (or promise for an array) of values (or
 * promises for values)
 * @returns a promise for an array of the corresponding values
 */
// By Mark Miller
// http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
Q.all = all;
function all(promises) {
    return when(promises, function (promises) {
        var pendingCount = 0;
        var deferred = defer();
        array_reduce(promises, function (undefined, promise, index) {
            var snapshot;
            if (
                isPromise(promise) &&
                (snapshot = promise.inspect()).state === "fulfilled"
            ) {
                promises[index] = snapshot.value;
            } else {
                ++pendingCount;
                when(
                    promise,
                    function (value) {
                        promises[index] = value;
                        if (--pendingCount === 0) {
                            deferred.resolve(promises);
                        }
                    },
                    deferred.reject,
                    function (progress) {
                        deferred.notify({ index: index, value: progress });
                    }
                );
            }
        }, void 0);
        if (pendingCount === 0) {
            deferred.resolve(promises);
        }
        return deferred.promise;
    });
}

Promise.prototype.all = function () {
    return all(this);
};

/**
 * Returns the first resolved promise of an array. Prior rejected promises are
 * ignored.  Rejects only if all promises are rejected.
 * @param {Array*} an array containing values or promises for values
 * @returns a promise fulfilled with the value of the first resolved promise,
 * or a rejected promise if all promises are rejected.
 */
Q.any = any;

function any(promises) {
    if (promises.length === 0) {
        return Q.resolve();
    }

    var deferred = Q.defer();
    var pendingCount = 0;
    array_reduce(promises, function (prev, current, index) {
        var promise = promises[index];

        pendingCount++;

        when(promise, onFulfilled, onRejected, onProgress);
        function onFulfilled(result) {
            deferred.resolve(result);
        }
        function onRejected(err) {
            pendingCount--;
            if (pendingCount === 0) {
                var rejection = err || new Error("" + err);

                rejection.message = ("Q can't get fulfillment value from any promise, all " +
                    "promises were rejected. Last error message: " + rejection.message);

                deferred.reject(rejection);
            }
        }
        function onProgress(progress) {
            deferred.notify({
                index: index,
                value: progress
            });
        }
    }, undefined);

    return deferred.promise;
}

Promise.prototype.any = function () {
    return any(this);
};

/**
 * Waits for all promises to be settled, either fulfilled or
 * rejected.  This is distinct from `all` since that would stop
 * waiting at the first rejection.  The promise returned by
 * `allResolved` will never be rejected.
 * @param promises a promise for an array (or an array) of promises
 * (or values)
 * @return a promise for an array of promises
 */
Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
function allResolved(promises) {
    return when(promises, function (promises) {
        promises = array_map(promises, Q);
        return when(all(array_map(promises, function (promise) {
            return when(promise, noop, noop);
        })), function () {
            return promises;
        });
    });
}

Promise.prototype.allResolved = function () {
    return allResolved(this);
};

/**
 * @see Promise#allSettled
 */
Q.allSettled = allSettled;
function allSettled(promises) {
    return Q(promises).allSettled();
}

/**
 * Turns an array of promises into a promise for an array of their states (as
 * returned by `inspect`) when they have all settled.
 * @param {Array[Any*]} values an array (or promise for an array) of values (or
 * promises for values)
 * @returns {Array[State]} an array of states for the respective values.
 */
Promise.prototype.allSettled = function () {
    return this.then(function (promises) {
        return all(array_map(promises, function (promise) {
            promise = Q(promise);
            function regardless() {
                return promise.inspect();
            }
            return promise.then(regardless, regardless);
        }));
    });
};

/**
 * Captures the failure of a promise, giving an oportunity to recover
 * with a callback.  If the given promise is fulfilled, the returned
 * promise is fulfilled.
 * @param {Any*} promise for something
 * @param {Function} callback to fulfill the returned promise if the
 * given promise is rejected
 * @returns a promise for the return value of the callback
 */
Q.fail = // XXX legacy
Q["catch"] = function (object, rejected) {
    return Q(object).then(void 0, rejected);
};

Promise.prototype.fail = // XXX legacy
Promise.prototype["catch"] = function (rejected) {
    return this.then(void 0, rejected);
};

/**
 * Attaches a listener that can respond to progress notifications from a
 * promise's originating deferred. This listener receives the exact arguments
 * passed to ``deferred.notify``.
 * @param {Any*} promise for something
 * @param {Function} callback to receive any progress notifications
 * @returns the given promise, unchanged
 */
Q.progress = progress;
function progress(object, progressed) {
    return Q(object).then(void 0, void 0, progressed);
}

Promise.prototype.progress = function (progressed) {
    return this.then(void 0, void 0, progressed);
};

/**
 * Provides an opportunity to observe the settling of a promise,
 * regardless of whether the promise is fulfilled or rejected.  Forwards
 * the resolution to the returned promise when the callback is done.
 * The callback can return a promise to defer completion.
 * @param {Any*} promise
 * @param {Function} callback to observe the resolution of the given
 * promise, takes no arguments.
 * @returns a promise for the resolution of the given promise when
 * ``fin`` is done.
 */
Q.fin = // XXX legacy
Q["finally"] = function (object, callback) {
    return Q(object)["finally"](callback);
};

Promise.prototype.fin = // XXX legacy
Promise.prototype["finally"] = function (callback) {
    if (!callback || typeof callback.apply !== "function") {
        throw new Error("Q can't apply finally callback");
    }
    callback = Q(callback);
    return this.then(function (value) {
        return callback.fcall().then(function () {
            return value;
        });
    }, function (reason) {
        // TODO attempt to recycle the rejection with "this".
        return callback.fcall().then(function () {
            throw reason;
        });
    });
};

/**
 * Terminates a chain of promises, forcing rejections to be
 * thrown as exceptions.
 * @param {Any*} promise at the end of a chain of promises
 * @returns nothing
 */
Q.done = function (object, fulfilled, rejected, progress) {
    return Q(object).done(fulfilled, rejected, progress);
};

Promise.prototype.done = function (fulfilled, rejected, progress) {
    var onUnhandledError = function (error) {
        // forward to a future turn so that ``when``
        // does not catch it and turn it into a rejection.
        Q.nextTick(function () {
            makeStackTraceLong(error, promise);
            if (Q.onerror) {
                Q.onerror(error);
            } else {
                throw error;
            }
        });
    };

    // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
    var promise = fulfilled || rejected || progress ?
        this.then(fulfilled, rejected, progress) :
        this;

    if (typeof process === "object" && process && process.domain) {
        onUnhandledError = process.domain.bind(onUnhandledError);
    }

    promise.then(void 0, onUnhandledError);
};

/**
 * Causes a promise to be rejected if it does not get fulfilled before
 * some milliseconds time out.
 * @param {Any*} promise
 * @param {Number} milliseconds timeout
 * @param {Any*} custom error message or Error object (optional)
 * @returns a promise for the resolution of the given promise if it is
 * fulfilled before the timeout, otherwise rejected.
 */
Q.timeout = function (object, ms, error) {
    return Q(object).timeout(ms, error);
};

Promise.prototype.timeout = function (ms, error) {
    var deferred = defer();
    var timeoutId = setTimeout(function () {
        if (!error || "string" === typeof error) {
            error = new Error(error || "Timed out after " + ms + " ms");
            error.code = "ETIMEDOUT";
        }
        deferred.reject(error);
    }, ms);

    this.then(function (value) {
        clearTimeout(timeoutId);
        deferred.resolve(value);
    }, function (exception) {
        clearTimeout(timeoutId);
        deferred.reject(exception);
    }, deferred.notify);

    return deferred.promise;
};

/**
 * Returns a promise for the given value (or promised value), some
 * milliseconds after it resolved. Passes rejections immediately.
 * @param {Any*} promise
 * @param {Number} milliseconds
 * @returns a promise for the resolution of the given promise after milliseconds
 * time has elapsed since the resolution of the given promise.
 * If the given promise rejects, that is passed immediately.
 */
Q.delay = function (object, timeout) {
    if (timeout === void 0) {
        timeout = object;
        object = void 0;
    }
    return Q(object).delay(timeout);
};

Promise.prototype.delay = function (timeout) {
    return this.then(function (value) {
        var deferred = defer();
        setTimeout(function () {
            deferred.resolve(value);
        }, timeout);
        return deferred.promise;
    });
};

/**
 * Passes a continuation to a Node function, which is called with the given
 * arguments provided as an array, and returns a promise.
 *
 *      Q.nfapply(FS.readFile, [__filename])
 *      .then(function (content) {
 *      })
 *
 */
Q.nfapply = function (callback, args) {
    return Q(callback).nfapply(args);
};

Promise.prototype.nfapply = function (args) {
    var deferred = defer();
    var nodeArgs = array_slice(args);
    nodeArgs.push(deferred.makeNodeResolver());
    this.fapply(nodeArgs).fail(deferred.reject);
    return deferred.promise;
};

/**
 * Passes a continuation to a Node function, which is called with the given
 * arguments provided individually, and returns a promise.
 * @example
 * Q.nfcall(FS.readFile, __filename)
 * .then(function (content) {
 * })
 *
 */
Q.nfcall = function (callback /*...args*/) {
    var args = array_slice(arguments, 1);
    return Q(callback).nfapply(args);
};

Promise.prototype.nfcall = function (/*...args*/) {
    var nodeArgs = array_slice(arguments);
    var deferred = defer();
    nodeArgs.push(deferred.makeNodeResolver());
    this.fapply(nodeArgs).fail(deferred.reject);
    return deferred.promise;
};

/**
 * Wraps a NodeJS continuation passing function and returns an equivalent
 * version that returns a promise.
 * @example
 * Q.nfbind(FS.readFile, __filename)("utf-8")
 * .then(console.log)
 * .done()
 */
Q.nfbind =
Q.denodeify = function (callback /*...args*/) {
    if (callback === undefined) {
        throw new Error("Q can't wrap an undefined function");
    }
    var baseArgs = array_slice(arguments, 1);
    return function () {
        var nodeArgs = baseArgs.concat(array_slice(arguments));
        var deferred = defer();
        nodeArgs.push(deferred.makeNodeResolver());
        Q(callback).fapply(nodeArgs).fail(deferred.reject);
        return deferred.promise;
    };
};

Promise.prototype.nfbind =
Promise.prototype.denodeify = function (/*...args*/) {
    var args = array_slice(arguments);
    args.unshift(this);
    return Q.denodeify.apply(void 0, args);
};

Q.nbind = function (callback, thisp /*...args*/) {
    var baseArgs = array_slice(arguments, 2);
    return function () {
        var nodeArgs = baseArgs.concat(array_slice(arguments));
        var deferred = defer();
        nodeArgs.push(deferred.makeNodeResolver());
        function bound() {
            return callback.apply(thisp, arguments);
        }
        Q(bound).fapply(nodeArgs).fail(deferred.reject);
        return deferred.promise;
    };
};

Promise.prototype.nbind = function (/*thisp, ...args*/) {
    var args = array_slice(arguments, 0);
    args.unshift(this);
    return Q.nbind.apply(void 0, args);
};

/**
 * Calls a method of a Node-style object that accepts a Node-style
 * callback with a given array of arguments, plus a provided callback.
 * @param object an object that has the named method
 * @param {String} name name of the method of object
 * @param {Array} args arguments to pass to the method; the callback
 * will be provided by Q and appended to these arguments.
 * @returns a promise for the value or error
 */
Q.nmapply = // XXX As proposed by "Redsandro"
Q.npost = function (object, name, args) {
    return Q(object).npost(name, args);
};

Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
Promise.prototype.npost = function (name, args) {
    var nodeArgs = array_slice(args || []);
    var deferred = defer();
    nodeArgs.push(deferred.makeNodeResolver());
    this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
    return deferred.promise;
};

/**
 * Calls a method of a Node-style object that accepts a Node-style
 * callback, forwarding the given variadic arguments, plus a provided
 * callback argument.
 * @param object an object that has the named method
 * @param {String} name name of the method of object
 * @param ...args arguments to pass to the method; the callback will
 * be provided by Q and appended to these arguments.
 * @returns a promise for the value or error
 */
Q.nsend = // XXX Based on Mark Miller's proposed "send"
Q.nmcall = // XXX Based on "Redsandro's" proposal
Q.ninvoke = function (object, name /*...args*/) {
    var nodeArgs = array_slice(arguments, 2);
    var deferred = defer();
    nodeArgs.push(deferred.makeNodeResolver());
    Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
    return deferred.promise;
};

Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
Promise.prototype.ninvoke = function (name /*...args*/) {
    var nodeArgs = array_slice(arguments, 1);
    var deferred = defer();
    nodeArgs.push(deferred.makeNodeResolver());
    this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
    return deferred.promise;
};

/**
 * If a function would like to support both Node continuation-passing-style and
 * promise-returning-style, it can end its internal promise chain with
 * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
 * elects to use a nodeback, the result will be sent there.  If they do not
 * pass a nodeback, they will receive the result promise.
 * @param object a result (or a promise for a result)
 * @param {Function} nodeback a Node.js-style callback
 * @returns either the promise or nothing
 */
Q.nodeify = nodeify;
function nodeify(object, nodeback) {
    return Q(object).nodeify(nodeback);
}

Promise.prototype.nodeify = function (nodeback) {
    if (nodeback) {
        this.then(function (value) {
            Q.nextTick(function () {
                nodeback(null, value);
            });
        }, function (error) {
            Q.nextTick(function () {
                nodeback(error);
            });
        });
    } else {
        return this;
    }
};

Q.noConflict = function() {
    throw new Error("Q.noConflict only works when Q is used as a global");
};

// All code before this point will be filtered from stack traces.
var qEndingLine = captureLine();

return Q;

});

var Q = require("./q");

module.exports = Queue;
function Queue() {
    var ends = Q.defer();
    var closed = Q.defer();
    return {
        put: function (value) {
            var next = Q.defer();
            ends.resolve({
                head: value,
                tail: next.promise
            });
            ends.resolve = next.resolve;
        },
        get: function () {
            var result = ends.promise.get("head");
            ends.promise = ends.promise.get("tail");
            return result.fail(function (error) {
                closed.resolve(error);
                throw error;
            });
        },
        closed: closed.promise,
        close: function (error) {
            error = error || new Error("Can't get value from closed queue");
            var end = {head: Q.reject(error)};
            end.tail = end;
            ends.resolve(end);
            return closed.promise;
        }
    };
}

Apache License, Version 2.0

Copyright (c) 2011 Dominic Tarr

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Copyright (c) 2013, Dominic Tarr
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: 

1. Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer. 
2. Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution. 

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies, 
either expressed or implied, of the FreeBSD Project.
The MIT License

Copyright (c) 2011 Dominic Tarr

Permission is hereby granted, free of charge, 
to any person obtaining a copy of this software and 
associated documentation files (the "Software"), to 
deal in the Software without restriction, including 
without limitation the rights to use, copy, modify, 
merge, publish, distribute, sublicense, and/or sell 
copies of the Software, and to permit persons to whom 
the Software is furnished to do so, 
subject to the following conditions:

The above copyright notice and this permission notice 
shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR 
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

// when this is loaded into the browser, 
// just use the defaults...

module.exports = function (name, defaults) {
  return defaults
}
#! /usr/bin/env node
var rc = require('./index')

console.log(JSON.stringify(rc(process.argv[2]), false, 2))
var cc   = require('./lib/utils')
var join = require('path').join
var deepExtend = require('deep-extend')
var etc = '/etc'
var win = process.platform === "win32"
var home = win
           ? process.env.USERPROFILE
           : process.env.HOME

module.exports = function (name, defaults, argv, parse) {
  if('string' !== typeof name)
    throw new Error('rc(name): name *must* be string')
  if(!argv)
    argv = require('minimist')(process.argv.slice(2))
  defaults = (
      'string' === typeof defaults
    ? cc.json(defaults) : defaults
    ) || {}

  parse = parse || cc.parse

  var env = cc.env(name + '_')

  var configs = [defaults]
  var configFiles = []
  function addConfigFile (file) {
    if (configFiles.indexOf(file) >= 0) return
    var fileConfig = cc.file(file)
    if (fileConfig) {
      configs.push(parse(fileConfig))
      configFiles.push(file)
    }
  }

  // which files do we look at?
  if (!win)
   [join(etc, name, 'config'),
    join(etc, name + 'rc')].forEach(addConfigFile)
  if (home)
   [join(home, '.config', name, 'config'),
    join(home, '.config', name),
    join(home, '.' + name, 'config'),
    join(home, '.' + name + 'rc')].forEach(addConfigFile)
  addConfigFile(cc.find('.'+name+'rc'))
  if (env.config) addConfigFile(env.config)
  if (argv.config) addConfigFile(argv.config)

  return deepExtend.apply(null, configs.concat([
    env,
    argv,
    configFiles.length ? {configs: configFiles, config: configFiles[configFiles.length - 1]} : undefined,
  ]))
}
{
  "author": {
    "name": "Dominic Tarr",
    "email": "dominic.tarr@gmail.com",
    "url": "dominictarr.com"
  },
  "bin": {
    "rc": "cli.js"
  },
  "browser": "browser.js",
  "dependencies": {
    "deep-extend": "^0.6.0",
    "ini": "~1.3.0",
    "minimist": "^1.2.0",
    "strip-json-comments": "~2.0.1"
  },
  "deprecated": false,
  "description": "hardwired configuration loader",
  "homepage": "https://github.com/dominictarr/rc#readme",
  "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
  "main": "index.js",
  "name": "rc",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/dominictarr/rc.git"
  },
  "version": "1.2.8"
}'use strict';
var fs   = require('fs')
var ini  = require('ini')
var path = require('path')
var stripJsonComments = require('strip-json-comments')

var parse = exports.parse = function (content) {

  //if it ends in .json or starts with { then it must be json.
  //must be done this way, because ini accepts everything.
  //can't just try and parse it and let it throw if it's not ini.
  //everything is ini. even json with a syntax error.

  if(/^\s*{/.test(content))
    return JSON.parse(stripJsonComments(content))
  return ini.parse(content)

}

var file = exports.file = function () {
  var args = [].slice.call(arguments).filter(function (arg) { return arg != null })

  //path.join breaks if it's a not a string, so just skip this.
  for(var i in args)
    if('string' !== typeof args[i])
      return

  var file = path.join.apply(null, args)
  var content
  try {
    return fs.readFileSync(file,'utf-8')
  } catch (err) {
    return
  }
}

var json = exports.json = function () {
  var content = file.apply(null, arguments)
  return content ? parse(content) : null
}

var env = exports.env = function (prefix, env) {
  env = env || process.env
  var obj = {}
  var l = prefix.length
  for(var k in env) {
    if(k.toLowerCase().indexOf(prefix.toLowerCase()) === 0) {

      var keypath = k.substring(l).split('__')

      // Trim empty strings from keypath array
      var _emptyStringIndex
      while ((_emptyStringIndex=keypath.indexOf('')) > -1) {
        keypath.splice(_emptyStringIndex, 1)
      }

      var cursor = obj
      keypath.forEach(function _buildSubObj(_subkey,i){

        // (check for _subkey first so we ignore empty strings)
        // (check for cursor to avoid assignment to primitive objects)
        if (!_subkey || typeof cursor !== 'object')
          return

        // If this is the last key, just stuff the value in there
        // Assigns actual value from env variable to final key
        // (unless it's just an empty string- in that case use the last valid key)
        if (i === keypath.length-1)
          cursor[_subkey] = env[k]


        // Build sub-object if nothing already exists at the keypath
        if (cursor[_subkey] === undefined)
          cursor[_subkey] = {}

        // Increment cursor used to track the object at the current depth
        cursor = cursor[_subkey]

      })

    }

  }

  return obj
}

var find = exports.find = function () {
  var rel = path.join.apply(null, [].slice.call(arguments))

  function find(start, rel) {
    var file = path.join(start, rel)
    try {
      fs.statSync(file)
      return file
    } catch (err) {
      if(path.dirname(start) !== start) // root
        return find(path.dirname(start), rel)
    }
  }
  return find(process.cwd(), rel)
}


{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "ajv": "^6.9.2",
    "ajv-keywords": "^3.4.0",
    "bluebird-lst": "^1.0.7",
    "dotenv": "^6.2.0",
    "dotenv-expand": "^4.2.0",
    "fs-extra-p": "^7.0.1",
    "js-yaml": "^3.12.1",
    "json5": "^2.1.0",
    "lazy-val": "^1.0.4"
  },
  "deprecated": false,
  "description": "Read configuration file in various formats:",
  "devDependencies": {
    "@types/dotenv": "^6.1.0",
    "@types/js-yaml": "^3.12.0",
    "@types/node": "^11.9.5",
    "babel-preset-ts-node6-bluebird": "^3.0.2",
    "ts-babel": "^6.1.4",
    "typescript": "^3.3.3333"
  },
  "files": [
    "out"
  ],
  "homepage": "https://github.com/develar/read-config-file",
  "license": "MIT",
  "main": "out/main.js",
  "name": "read-config-file",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/develar/read-config-file.git"
  },
  "typings": "./out/main.d.ts",
  "version": "3.2.2"
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.normaliseErrorMessages = normaliseErrorMessages;

function normaliseErrorMessages(errors, schemeData) {
  const printer = new SchemeErrorPrinter(schemeData);
  return "Configuration is invalid.\n" + filterErrors(errors).map(it => " - " + indent(printer.formatValidationError(it), "   ", false)).join("\n");
}

class SchemeErrorPrinter {
  constructor(schemeData) {
    this.schemeData = schemeData;
  }

  formatValidationError(error) {
    const dataPath = `configuration${error.dataPath}`;

    if (error.keyword === "additionalProperties") {
      return `${dataPath} has an unknown property '${error.params.additionalProperty}'. These properties are valid:\n${this.getSchemaPartText(error.parentSchema)}`;
    } else if (error.keyword === "oneOf" || error.keyword === "anyOf") {
      const children = error.children;

      if (children && children.length > 0) {
        // use set to remove duplicated messages like "should be an object."
        return `${dataPath} should be one of these:\n${this.getSchemaPartText(error.parentSchema)}\n` + `Details:\n${Array.from(new Set(children.map(it => " * " + indent(this.formatValidationError(it), "   ", false)))).join("\n")}`;
      }

      return `${dataPath} should be one of these:\n${this.getSchemaPartText(error.parentSchema)}`;
    } else if (error.keyword === "enum") {
      if (error.parentSchema && error.parentSchema.enum && error.parentSchema.enum.length === 1) {
        return `${dataPath} should be ${this.getSchemaPartText(error.parentSchema)}`;
      }

      return `${dataPath} should be one of these:\n${this.getSchemaPartText(error.parentSchema)}`;
    } else if (error.keyword === "allOf") {
      return `${dataPath} should be:\n${this.getSchemaPartText(error.parentSchema)}`;
    } else if (error.keyword === "type") {
      switch (error.params.type) {
        case "object":
          return `${dataPath} should be an object.`;

        case "string":
          return `${dataPath} should be a string.`;

        case "boolean":
          return `${dataPath} should be a boolean.`;

        case "number":
          return `${dataPath} should be a number.`;

        case "array":
          return `${dataPath} should be an array:\n${this.getSchemaPartText(error.parentSchema)}`;
      }

      return `${dataPath} should be ${error.params.type}:\n${this.getSchemaPartText(error.parentSchema)}`;
    } else if (error.keyword === "instanceof") {
      return `${dataPath} should be an instance of ${this.getSchemaPartText(error.parentSchema)}.`;
    } else if (error.keyword === "required") {
      const missingProperty = error.params.missingProperty.replace(/^\./, "");
      return `${dataPath} misses the property '${missingProperty}'.\n${this.getSchemaPartText(error.parentSchema, ["properties", missingProperty])}`;
    } else if (error.keyword === "minLength" || error.keyword === "minItems") {
      if (error.params.limit === 1) {
        return `${dataPath} should not be empty.`;
      } else {
        return `${dataPath} ${error.message}`;
      }
    } else if (error.keyword === "absolutePath") {
      const baseMessage = `${dataPath}: ${error.message}`;

      if (dataPath === "configuration.output.filename") {
        return `${baseMessage}\n` + "Please use output.path to specify absolute path and output.filename for the file name.";
      }

      return baseMessage;
    } else {
      // eslint-disable-line no-fallthrough
      return `${dataPath} ${error.message} (${JSON.stringify(error, null, 2)}).\n${this.getSchemaPartText(error.parentSchema)}`;
    }
  }

  getSchemaPart(path) {
    const pathList = path.split("/").slice(0, path.length);
    let schemaPart = this.schemeData;

    for (let i = 1; i < pathList.length; i++) {
      const inner = schemaPart[pathList[i]];

      if (inner) {
        schemaPart = inner;
      }
    }

    return schemaPart;
  }

  getSchemaPartText(schemaPart, additionalPath = null) {
    if (additionalPath != null) {
      for (const p of additionalPath) {
        const inner = schemaPart[p];

        if (inner) {
          schemaPart = inner;
        }
      }
    }

    while (schemaPart.$ref != null) {
      schemaPart = this.getSchemaPart(schemaPart.$ref);
    }

    let schemaText = this.formatSchema(schemaPart);
    let description = schemaPart.description;

    if (description != null) {
      description = description.trim();
      const twoLineBreakPosition = description.indexOf("\n\n");
      description = twoLineBreakPosition < 0 ? description : description.substring(0, twoLineBreakPosition);
      schemaText += `\n${description}\n`;
    }

    return schemaText;
  }

  formatSchema(schema, prevSchemas) {
    prevSchemas = prevSchemas || [];

    const formatInnerSchema = (innerSchema, isAddSelf = false) => {
      if (!isAddSelf) {
        return this.formatSchema(innerSchema, prevSchemas);
      }

      if (prevSchemas.indexOf(innerSchema) >= 0) {
        return "(recursive)";
      }

      return this.formatSchema(innerSchema, prevSchemas.concat(schema));
    };

    if (schema.type === "string") {
      if (schema.minLength === 1) {
        return "non-empty string";
      } else if (schema.minLength > 1) {
        return `string (min length ${schema.minLength})`;
      } else {
        return "string";
      }
    } else if (schema.type === "boolean") {
      return "boolean";
    } else if (schema.type === "number") {
      return "number";
    } else if (schema.type === "object") {
      if (schema.properties) {
        const required = schema.required || [];
        return `object { ${Object.keys(schema.properties).map(property => {
          if (required.indexOf(property) < 0) {
            return property + "?";
          }

          return property;
        }).concat(schema.additionalProperties ? ["..."] : []).join(", ")} }`;
      }

      if (schema.additionalProperties) {
        return `object { <key>: ${formatInnerSchema(schema.additionalProperties)} }`;
      }

      return "object";
    } else if (schema.type === "array") {
      return `[${formatInnerSchema(schema.items)}]`;
    }

    switch (schema.instanceof) {
      case "Function":
        return "function";

      case "RegExp":
        return "RegExp";
    }

    if (schema.$ref != null) {
      return formatInnerSchema(this.getSchemaPart(schema.$ref), true);
    }

    if (schema.allOf) {
      return schema.allOf.map(formatInnerSchema).join(" & ");
    }

    if (schema.oneOf) {
      return schema.oneOf.map(formatInnerSchema).join(" | ");
    }

    if (schema.anyOf) {
      return schema.anyOf.map(formatInnerSchema).join(" | ");
    }

    if (schema.enum) {
      return schema.enum.map(it => JSON.stringify(it)).join(" | ");
    }

    return JSON.stringify(schema, null, 2);
  }

}

function indent(str, prefix, isFirstLine) {
  if (isFirstLine) {
    return prefix + str.replace(/\n(?!$)/g, "\n" + prefix);
  } else {
    return str.replace(/\n(?!$)/g, `\n${prefix}`);
  }
}

function filterErrors(errors) {
  let newErrors = [];

  for (const error of errors) {
    const dataPath = error.dataPath;
    let children = [];
    newErrors = newErrors.filter(oldError => {
      if (!oldError.dataPath.includes(dataPath)) {
        return true;
      }

      if (oldError.children != null) {
        children = children.concat(oldError.children.slice(0));
      }

      oldError.children = null;
      children.push(oldError);
      return false;
    });

    if (children.length > 0) {
      error.children = children;
    }

    newErrors.push(error);
  }

  return newErrors;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=ajvErrorNormalizer.js.map{"version":3,"sources":["../src/ajvErrorNormalizer.ts"],"names":[],"mappings":"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","sourcesContent":["import { AdditionalPropertiesParams, ComparisonParams, DependenciesParams, ErrorObject, TypeParams } from \"ajv\"\n\nexport function normaliseErrorMessages(errors: Array<ErrorObject>, schemeData: object) {\n  const printer = new SchemeErrorPrinter(schemeData)\n  return \"Configuration is invalid.\\n\" +\n    filterErrors(errors)\n      .map(it => \" - \" + indent(printer.formatValidationError(it), \"   \", false))\n      .join(\"\\n\")\n}\n\n//tslint:disable-next-line:no-empty-interface\ninterface Scheme {\n  // to ensure that proper arg is passed\n}\n\nclass SchemeErrorPrinter {\n  constructor(readonly schemeData: Scheme) {\n  }\n\n  formatValidationError(error: ErrorObject) {\n    const dataPath = `configuration${error.dataPath}`\n    if (error.keyword === \"additionalProperties\") {\n      return `${dataPath} has an unknown property '${(error.params as AdditionalPropertiesParams).additionalProperty}'. These properties are valid:\\n${this.getSchemaPartText(error.parentSchema)}`\n    }\n    else if (error.keyword === \"oneOf\" || error.keyword === \"anyOf\") {\n      const children = (error as any).children\n      if (children && children.length > 0) {\n        // use set to remove duplicated messages like \"should be an object.\"\n        return `${dataPath} should be one of these:\\n${this.getSchemaPartText(error.parentSchema)}\\n` +\n          `Details:\\n${Array.from(new Set(children.map((it: ErrorObject) => \" * \" + indent(this.formatValidationError(it), \"   \", false)))).join(\"\\n\")}`\n      }\n      return `${dataPath} should be one of these:\\n${this.getSchemaPartText(error.parentSchema)}`\n\n    }\n    else if (error.keyword === \"enum\") {\n      if (error.parentSchema && (error.parentSchema as any).enum && (error.parentSchema as any).enum.length === 1) {\n        return `${dataPath} should be ${this.getSchemaPartText(error.parentSchema)}`\n      }\n      return `${dataPath} should be one of these:\\n${this.getSchemaPartText(error.parentSchema)}`\n    }\n    else if (error.keyword === \"allOf\") {\n      return `${dataPath} should be:\\n${this.getSchemaPartText(error.parentSchema)}`\n    }\n    else if (error.keyword === \"type\") {\n      switch ((error.params as TypeParams).type) {\n        case \"object\":\n          return `${dataPath} should be an object.`\n        case \"string\":\n          return `${dataPath} should be a string.`\n        case \"boolean\":\n          return `${dataPath} should be a boolean.`\n        case \"number\":\n          return `${dataPath} should be a number.`\n        case \"array\":\n          return `${dataPath} should be an array:\\n${this.getSchemaPartText(error.parentSchema)}`\n      }\n      return `${dataPath} should be ${(error.params as TypeParams).type}:\\n${this.getSchemaPartText(error.parentSchema)}`\n    }\n    else if (error.keyword === \"instanceof\") {\n      return `${dataPath} should be an instance of ${this.getSchemaPartText(error.parentSchema)}.`\n    }\n    else if (error.keyword === \"required\") {\n      const missingProperty = (error.params as DependenciesParams).missingProperty.replace(/^\\./, \"\")\n      return `${dataPath} misses the property '${missingProperty}'.\\n${this.getSchemaPartText(error.parentSchema, [\"properties\", missingProperty])}`\n    }\n    else if (error.keyword === \"minLength\" || error.keyword === \"minItems\") {\n      if ((error.params as ComparisonParams).limit === 1) {\n        return `${dataPath} should not be empty.`\n      }\n      else {\n        return `${dataPath} ${error.message}`\n      }\n    }\n    else if (error.keyword === \"absolutePath\") {\n      const baseMessage = `${dataPath}: ${error.message}`\n      if (dataPath === \"configuration.output.filename\") {\n        return `${baseMessage}\\n` +\n          \"Please use output.path to specify absolute path and output.filename for the file name.\"\n      }\n      return baseMessage\n    }\n    else {\n      // eslint-disable-line no-fallthrough\n      return `${dataPath} ${error.message} (${JSON.stringify(error, null, 2)}).\\n${this.getSchemaPartText(error.parentSchema)}`\n    }\n  }\n\n  private getSchemaPart(path: string) {\n    const pathList = path.split(\"/\").slice(0, path.length)\n    let schemaPart = this.schemeData as any\n    for (let i = 1; i < pathList.length; i++) {\n      const inner = schemaPart[pathList[i]]\n      if (inner) {\n        schemaPart = inner\n      }\n    }\n    return schemaPart\n  }\n\n  private getSchemaPartText(schemaPart: any, additionalPath: Array<string> | null = null) {\n    if (additionalPath != null) {\n      for (const p of additionalPath) {\n        const inner = schemaPart[p]\n        if (inner) {\n          schemaPart = inner\n        }\n      }\n    }\n\n    while (schemaPart.$ref != null) {\n      schemaPart = this.getSchemaPart(schemaPart.$ref)\n    }\n\n    let schemaText = this.formatSchema(schemaPart)\n    let description = schemaPart.description\n    if (description != null) {\n      description = description.trim()\n      const twoLineBreakPosition = description.indexOf(\"\\n\\n\")\n      description = twoLineBreakPosition < 0 ? description : description.substring(0, twoLineBreakPosition)\n      schemaText += `\\n${description}\\n`\n    }\n    return schemaText\n  }\n\n  private formatSchema(schema: any, prevSchemas?: any) {\n    prevSchemas = prevSchemas || []\n\n    const formatInnerSchema = (innerSchema: any, isAddSelf = false): string => {\n      if (!isAddSelf) {\n        return this.formatSchema(innerSchema, prevSchemas)\n      }\n      if (prevSchemas.indexOf(innerSchema) >= 0) {\n        return \"(recursive)\"\n      }\n      return this.formatSchema(innerSchema, prevSchemas.concat(schema))\n    }\n\n    if (schema.type === \"string\") {\n      if (schema.minLength === 1) {\n        return \"non-empty string\"\n      }\n      else if (schema.minLength > 1) {\n        return `string (min length ${schema.minLength})`\n      }\n      else {\n        return \"string\"\n      }\n    }\n    else if (schema.type === \"boolean\") {\n      return \"boolean\"\n    }\n    else if (schema.type === \"number\") {\n      return \"number\"\n    }\n    else if (schema.type === \"object\") {\n      if (schema.properties) {\n        const required = schema.required || []\n        return `object { ${Object.keys(schema.properties).map(property => {\n          if (required.indexOf(property) < 0) {\n            return property + \"?\"\n          }\n          return property\n        }).concat(schema.additionalProperties ? [\"...\"] : []).join(\", \")} }`\n      }\n      if (schema.additionalProperties) {\n        return `object { <key>: ${formatInnerSchema(schema.additionalProperties)} }`\n      }\n      return \"object\"\n    }\n    else if (schema.type === \"array\") {\n      return `[${formatInnerSchema(schema.items)}]`\n    }\n\n    switch (schema.instanceof) {\n      case \"Function\":\n        return \"function\"\n      case \"RegExp\":\n        return \"RegExp\"\n    }\n\n    if (schema.$ref != null) {\n      return formatInnerSchema(this.getSchemaPart(schema.$ref), true)\n    }\n    if (schema.allOf) {\n      return schema.allOf.map(formatInnerSchema).join(\" & \")\n    }\n    if (schema.oneOf) {\n      return schema.oneOf.map(formatInnerSchema).join(\" | \")\n    }\n    if (schema.anyOf) {\n      return schema.anyOf.map(formatInnerSchema).join(\" | \")\n    }\n    if (schema.enum) {\n      return schema.enum.map((it: object) => JSON.stringify(it)).join(\" | \")\n    }\n    return JSON.stringify(schema, null, 2)\n  }\n}\n\nfunction indent(str: string, prefix: string, isFirstLine: boolean) {\n  if (isFirstLine) {\n    return prefix + str.replace(/\\n(?!$)/g, \"\\n\" + prefix)\n  }\n  else {\n    return str.replace(/\\n(?!$)/g, `\\n${prefix}`)\n  }\n}\n\nfunction filterErrors(errors: Array<ErrorObject>) {\n  let newErrors: Array<any> = []\n  for (const error of errors) {\n    const dataPath = error.dataPath\n    let children: Array<ErrorObject> = []\n    newErrors = newErrors.filter(oldError => {\n      if (!oldError.dataPath.includes(dataPath)) {\n        return true\n      }\n\n      if (oldError.children != null) {\n        children = children.concat(oldError.children.slice(0))\n      }\n      oldError.children = null\n      children.push(oldError)\n      return false\n    })\n\n    if (children.length > 0) {\n      (error as any).children = children\n    }\n    newErrors.push(error)\n  }\n  return newErrors\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.deepAssign = deepAssign;

function isObject(x) {
  if (Array.isArray(x)) {
    return false;
  }

  const type = typeof x;
  return type === "object" || type === "function";
}

function assignKey(target, from, key) {
  const value = from[key]; // https://github.com/electron-userland/electron-builder/pull/562

  if (value === undefined) {
    return;
  }

  const prevValue = target[key];

  if (prevValue == null || value == null || !isObject(prevValue) || !isObject(value)) {
    target[key] = value;
  } else {
    target[key] = assign(prevValue, value);
  }
}

function assign(to, from) {
  if (to !== from) {
    for (const key of Object.getOwnPropertyNames(from)) {
      assignKey(to, from, key);
    }
  }

  return to;
}

function deepAssign(target, ...objects) {
  for (const o of objects) {
    if (o != null) {
      assign(target, o);
    }
  }

  return target;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=deepAssign.js.map{"version":3,"sources":["../src/deepAssign.ts"],"names":[],"mappings":";;;;;;;AAAA,SAAS,QAAT,CAAkB,CAAlB,EAAwB;AACtB,MAAI,KAAK,CAAC,OAAN,CAAc,CAAd,CAAJ,EAAsB;AACpB,WAAO,KAAP;AACD;;AAED,QAAM,IAAI,GAAG,OAAO,CAApB;AACA,SAAO,IAAI,KAAK,QAAT,IAAqB,IAAI,KAAK,UAArC;AACD;;AAED,SAAS,SAAT,CAAmB,MAAnB,EAAgC,IAAhC,EAA2C,GAA3C,EAAsD;AACpD,QAAM,KAAK,GAAG,IAAI,CAAC,GAAD,CAAlB,CADoD,CAEpD;;AACA,MAAI,KAAK,KAAK,SAAd,EAAyB;AACvB;AACD;;AAED,QAAM,SAAS,GAAG,MAAM,CAAC,GAAD,CAAxB;;AACA,MAAI,SAAS,IAAI,IAAb,IAAqB,KAAK,IAAI,IAA9B,IAAsC,CAAC,QAAQ,CAAC,SAAD,CAA/C,IAA8D,CAAC,QAAQ,CAAC,KAAD,CAA3E,EAAoF;AAClF,IAAA,MAAM,CAAC,GAAD,CAAN,GAAc,KAAd;AACD,GAFD,MAGK;AACH,IAAA,MAAM,CAAC,GAAD,CAAN,GAAc,MAAM,CAAC,SAAD,EAAY,KAAZ,CAApB;AACD;AACF;;AAED,SAAS,MAAT,CAAgB,EAAhB,EAAyB,IAAzB,EAAkC;AAChC,MAAI,EAAE,KAAK,IAAX,EAAiB;AACf,SAAK,MAAM,GAAX,IAAkB,MAAM,CAAC,mBAAP,CAA2B,IAA3B,CAAlB,EAAoD;AAClD,MAAA,SAAS,CAAC,EAAD,EAAK,IAAL,EAAW,GAAX,CAAT;AACD;AACF;;AACD,SAAO,EAAP;AACD;;AAEK,SAAU,UAAV,CAAwB,MAAxB,EAAmC,GAAG,OAAtC,EAAyD;AAC7D,OAAK,MAAM,CAAX,IAAgB,OAAhB,EAAyB;AACvB,QAAI,CAAC,IAAI,IAAT,EAAe;AACb,MAAA,MAAM,CAAC,MAAD,EAAS,CAAT,CAAN;AACD;AACF;;AACD,SAAO,MAAP;AACD,C","sourcesContent":["function isObject(x: any) {\n  if (Array.isArray(x)) {\n    return false\n  }\n\n  const type = typeof x\n  return type === \"object\" || type === \"function\"\n}\n\nfunction assignKey(target: any, from: any, key: string) {\n  const value = from[key]\n  // https://github.com/electron-userland/electron-builder/pull/562\n  if (value === undefined) {\n    return\n  }\n\n  const prevValue = target[key]\n  if (prevValue == null || value == null || !isObject(prevValue) || !isObject(value)) {\n    target[key] = value\n  }\n  else {\n    target[key] = assign(prevValue, value)\n  }\n}\n\nfunction assign(to: any, from: any) {\n  if (to !== from) {\n    for (const key of Object.getOwnPropertyNames(from)) {\n      assignKey(to, from, key)\n    }\n  }\n  return to\n}\n\nexport function deepAssign<T>(target: T, ...objects: Array<any>): T {\n  for (const o of objects) {\n    if (o != null) {\n      assign(target, o)\n    }\n  }\n  return target\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.findAndReadConfig = findAndReadConfig;
exports.orNullIfFileNotExist = orNullIfFileNotExist;
exports.orIfFileNotExist = orIfFileNotExist;
exports.loadConfig = loadConfig;
exports.getConfig = getConfig;
exports.loadParentConfig = loadParentConfig;
exports.validateConfig = validateConfig;
exports.loadEnv = loadEnv;

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _jsYaml() {
  const data = require("js-yaml");

  _jsYaml = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _ajv() {
  const data = _interopRequireDefault(require("ajv"));

  _ajv = function () {
    return data;
  };

  return data;
}

function _ajvErrorNormalizer() {
  const data = require("./ajvErrorNormalizer");

  _ajvErrorNormalizer = function () {
    return data;
  };

  return data;
}

function _dotenv() {
  const data = require("dotenv");

  _dotenv = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

async function readConfig(configFile, request) {
  const data = await (0, _fsExtraP().readFile)(configFile, "utf8");
  let result;

  if (configFile.endsWith(".json5") || configFile.endsWith(".json")) {
    result = require("json5").parse(data);
  } else if (configFile.endsWith(".js")) {
    result = require(configFile);

    if (result.default != null) {
      result = result.default;
    }

    if (typeof result === "function") {
      result = result(request);
    }

    result = await Promise.resolve(result);
  } else if (configFile.endsWith(".toml")) {
    result = require("toml").parse(data);
  } else {
    result = (0, _jsYaml().safeLoad)(data);
  }

  return {
    result,
    configFile
  };
}

async function findAndReadConfig(request) {
  const prefix = request.configFilename;

  for (const configFile of [`${prefix}.yml`, `${prefix}.yaml`, `${prefix}.json`, `${prefix}.json5`, `${prefix}.toml`, `${prefix}.js`]) {
    const data = await orNullIfFileNotExist(readConfig(path.join(request.projectDir, configFile), request));

    if (data != null) {
      return data;
    }
  }

  return null;
}

function orNullIfFileNotExist(promise) {
  return orIfFileNotExist(promise, null);
}

function orIfFileNotExist(promise, fallbackValue) {
  return promise.catch(e => {
    if (e.code === "ENOENT" || e.code === "ENOTDIR") {
      return fallbackValue;
    }

    throw e;
  });
}

async function loadConfig(request) {
  let packageMetadata = request.packageMetadata == null ? null : await request.packageMetadata.value;

  if (packageMetadata == null) {
    packageMetadata = await orNullIfFileNotExist((0, _fsExtraP().readJson)(path.join(request.projectDir, "package.json")));
  }

  const data = packageMetadata == null ? null : packageMetadata[request.packageKey];
  return data == null ? findAndReadConfig(request) : {
    result: data,
    configFile: null
  };
}

function getConfig(request, configPath) {
  if (configPath == null) {
    return loadConfig(request);
  } else {
    return readConfig(path.resolve(request.projectDir, configPath), request);
  }
}

async function loadParentConfig(request, spec) {
  let isFileSpec;

  if (spec.startsWith("file:")) {
    spec = spec.substring("file:".length);
    isFileSpec = true;
  }

  let parentConfig = await orNullIfFileNotExist(readConfig(path.resolve(request.projectDir, spec), request));

  if (parentConfig == null && isFileSpec !== true) {
    let resolved = null;

    try {
      resolved = require.resolve(spec);
    } catch (e) {// ignore
    }

    if (resolved != null) {
      parentConfig = await readConfig(resolved, request);
    }
  }

  if (parentConfig == null) {
    throw new Error(`Cannot find parent config file: ${spec}`);
  }

  return parentConfig;
}

async function validateConfig(config, scheme, errorMessage) {
  const ajv = new (_ajv().default)({
    allErrors: true,
    coerceTypes: true,
    verbose: true,
    errorDataPath: "configuration"
  });

  require("ajv-keywords")(ajv, ["typeof"]);

  const schema = await scheme.value;
  const validator = ajv.compile(schema);

  if (!validator(config)) {
    const error = new Error(errorMessage((0, _ajvErrorNormalizer().normaliseErrorMessages)(validator.errors, schema), validator.errors));
    error.code = "ERR_CONFIG_INVALID";
    throw error;
  }
}

async function loadEnv(envFile) {
  const data = await orNullIfFileNotExist((0, _fsExtraP().readFile)(envFile, "utf8"));

  if (data == null) {
    return null;
  }

  const parsed = (0, _dotenv().parse)(data);

  for (const key of Object.keys(parsed)) {
    if (!process.env.hasOwnProperty(key)) {
      process.env[key] = parsed[key];
    }
  }

  require("dotenv-expand")(parsed);

  return parsed;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=main.js.map{"version":3,"sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["import {readFile, readJson} from \"fs-extra-p\"\nimport {safeLoad} from \"js-yaml\"\nimport * as path from \"path\"\nimport {Lazy} from \"lazy-val\"\nimport Ajv, {ErrorObject} from \"ajv\"\nimport {normaliseErrorMessages} from \"./ajvErrorNormalizer\"\nimport {parse as parseEnv} from \"dotenv\"\n\nexport interface ReadConfigResult<T> {\n  readonly result: T\n  readonly configFile: string | null\n}\n\nasync function readConfig<T>(configFile: string, request: ReadConfigRequest): Promise<ReadConfigResult<T>> {\n  const data = await readFile(configFile, \"utf8\")\n  let result\n  if (configFile.endsWith(\".json5\") || configFile.endsWith(\".json\")) {\n    result = require(\"json5\").parse(data)\n  }\n  else if (configFile.endsWith(\".js\")) {\n    result = require(configFile)\n    if (result.default != null) {\n      result = result.default\n    }\n    if (typeof result === \"function\") {\n      result = result(request)\n    }\n    result = await Promise.resolve(result)\n  }\n  else if (configFile.endsWith(\".toml\")) {\n    result = require(\"toml\").parse(data)\n  }\n  else {\n    result = safeLoad(data)\n  }\n  return {result, configFile}\n}\n\nexport async function findAndReadConfig<T>(request: ReadConfigRequest): Promise<ReadConfigResult<T> | null> {\n  const prefix = request.configFilename\n  for (const configFile of [`${prefix}.yml`, `${prefix}.yaml`, `${prefix}.json`, `${prefix}.json5`, `${prefix}.toml`, `${prefix}.js`]) {\n    const data = await orNullIfFileNotExist(readConfig<T>(path.join(request.projectDir, configFile), request))\n    if (data != null) {\n      return data\n    }\n  }\n\n  return null\n}\n\nexport function orNullIfFileNotExist<T>(promise: Promise<T>): Promise<T | null> {\n  return orIfFileNotExist(promise, null)\n}\n\nexport function orIfFileNotExist<T>(promise: Promise<T>, fallbackValue: T): Promise<T> {\n  return promise\n    .catch(e => {\n      if (e.code === \"ENOENT\" || e.code === \"ENOTDIR\") {\n        return fallbackValue\n      }\n      throw e\n    })\n}\n\nexport interface ReadConfigRequest {\n  packageKey: string\n  configFilename: string\n\n  projectDir: string\n  packageMetadata: Lazy<{ [key: string]: any } | null> | null\n}\n\nexport async function loadConfig<T>(request: ReadConfigRequest): Promise<ReadConfigResult<T> | null> {\n  let packageMetadata = request.packageMetadata == null ? null : await request.packageMetadata.value\n  if (packageMetadata == null) {\n    packageMetadata = await orNullIfFileNotExist(readJson(path.join(request.projectDir, \"package.json\")))\n  }\n\n  const data: T = packageMetadata == null ? null : packageMetadata[request.packageKey]\n  return data == null ? findAndReadConfig<T>(request) : {result: data, configFile: null}\n}\n\nexport function getConfig<T>(request: ReadConfigRequest, configPath?: string | null): Promise<ReadConfigResult<T> | null> {\n  if (configPath == null) {\n    return loadConfig<T>(request)\n  }\n  else {\n    return readConfig<T>(path.resolve(request.projectDir, configPath), request)\n  }\n}\n\nexport async function loadParentConfig<T>(request: ReadConfigRequest, spec: string): Promise<ReadConfigResult<T>> {\n  let isFileSpec: boolean | undefined\n  if (spec.startsWith(\"file:\")) {\n    spec = spec.substring(\"file:\".length)\n    isFileSpec = true\n  }\n\n  let parentConfig = await orNullIfFileNotExist(readConfig<T>(path.resolve(request.projectDir, spec), request))\n  if (parentConfig == null && isFileSpec !== true) {\n    let resolved: string | null = null\n    try {\n      resolved = require.resolve(spec)\n    }\n    catch (e) {\n      // ignore\n    }\n\n    if (resolved != null) {\n      parentConfig = await readConfig<T>(resolved, request)\n    }\n  }\n\n  if (parentConfig == null) {\n    throw new Error(`Cannot find parent config file: ${spec}`)\n  }\n\n  return parentConfig\n}\n\nexport async function validateConfig(config: any, scheme: Lazy<any>, errorMessage: (error: string, errors: Array<ErrorObject>) => string) {\n  const ajv = new Ajv({\n    allErrors: true,\n    coerceTypes: true,\n    verbose: true,\n    errorDataPath: \"configuration\",\n  })\n  require(\"ajv-keywords\")(ajv, [\"typeof\"])\n  const schema = await scheme.value\n  const validator = ajv.compile(schema)\n\n  if (!validator(config)) {\n    const error = new Error(errorMessage(normaliseErrorMessages(validator.errors!, schema), validator.errors!!));\n    (error as any).code = \"ERR_CONFIG_INVALID\"\n    throw error\n  }\n}\n\nexport async function loadEnv(envFile: string) {\n  const data = await orNullIfFileNotExist(readFile(envFile, \"utf8\"))\n  if (data == null) {\n    return null\n  }\n\n  const parsed = parseEnv(data)\n  for (const key of Object.keys(parsed)) {\n    if (!process.env.hasOwnProperty(key)) {\n      process.env[key] = parsed[key]\n    }\n  }\n  require(\"dotenv-expand\")(parsed)\n  return parsed\n}"],"sourceRoot":""}
root = true

[*]
indent_style = tab;
insert_final_newline = true;
quote_type = auto;
space_after_anonymous_functions = true;
space_after_control_statements = true;
spaces_around_operators = true;
trim_trailing_whitespace = true;
spaces_in_brackets = false;
end_of_line = lf;

The MIT License (MIT)

Copyright (C) 2014 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.'use strict';

require('./shim')();
'use strict';

var $Object = Object;
var $TypeError = TypeError;

module.exports = function flags() {
	if (this != null && this !== $Object(this)) {
		throw new $TypeError('RegExp.prototype.flags getter called on non-object');
	}
	var result = '';
	if (this.global) {
		result += 'g';
	}
	if (this.ignoreCase) {
		result += 'i';
	}
	if (this.multiline) {
		result += 'm';
	}
	if (this.dotAll) {
		result += 's';
	}
	if (this.unicode) {
		result += 'u';
	}
	if (this.sticky) {
		result += 'y';
	}
	return result;
};
'use strict';

var define = require('define-properties');
var callBind = require('es-abstract/helpers/callBind');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var flagsBound = callBind(implementation);

define(flagsBound, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = flagsBound;
{
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com"
  },
  "dependencies": {
    "define-properties": "^1.1.3",
    "es-abstract": "^1.17.0-next.1"
  },
  "deprecated": false,
  "description": "ES6 spec-compliant RegExp.prototype.flags shim.",
  "devDependencies": {
    "@es-shims/api": "^2.1.2",
    "@ljharb/eslint-config": "^15.0.2",
    "covert": "^1.1.1",
    "eclint": "^2.8.1",
    "eslint": "^6.7.2",
    "has": "^1.0.3",
    "tape": "^4.11.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/es-shims/RegExp.prototype.flags#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "regexp.prototype.flags",
  "repository": {
    "type": "git",
    "url": "git://github.com/es-shims/RegExp.prototype.flags.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/9.0..latest",
      "firefox/4.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/11.6..latest",
      "opera/next",
      "safari/5.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "1.3.0"
}'use strict';

var implementation = require('./implementation');

var supportsDescriptors = require('define-properties').supportsDescriptors;
var $gOPD = Object.getOwnPropertyDescriptor;
var $TypeError = TypeError;

module.exports = function getPolyfill() {
	if (!supportsDescriptors) {
		throw new $TypeError('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');
	}
	if ((/a/mig).flags === 'gim') {
		var descriptor = $gOPD(RegExp.prototype, 'flags');
		if (descriptor && typeof descriptor.get === 'function' && typeof (/a/).dotAll === 'boolean') {
			return descriptor.get;
		}
	}
	return implementation;
};
'use strict';

var supportsDescriptors = require('define-properties').supportsDescriptors;
var getPolyfill = require('./polyfill');
var gOPD = Object.getOwnPropertyDescriptor;
var defineProperty = Object.defineProperty;
var TypeErr = TypeError;
var getProto = Object.getPrototypeOf;
var regex = /a/;

module.exports = function shimFlags() {
	if (!supportsDescriptors || !getProto) {
		throw new TypeErr('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');
	}
	var polyfill = getPolyfill();
	var proto = getProto(regex);
	var descriptor = gOPD(proto, 'flags');
	if (!descriptor || descriptor.get !== polyfill) {
		defineProperty(proto, 'flags', {
			configurable: true,
			enumerable: false,
			get: polyfill
		});
	}
	return polyfill;
};
name: Automatic Rebase

on: [pull_request]

jobs:
  _:
    name: "Automatic Rebase"

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - uses: ljharb/rebase@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
node_modules
MIT License

Copyright (c) 2012 James Halliday

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var async = require('./lib/async');
async.core = require('./lib/core');
async.isCore = require('./lib/is-core');
async.sync = require('./lib/sync');

exports = async;
module.exports = async;
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "dependencies": {
    "path-parse": "^1.0.6"
  },
  "deprecated": false,
  "description": "resolve like require.resolve() on behalf of files asynchronously and synchronously",
  "devDependencies": {
    "@ljharb/eslint-config": "^15.0.2",
    "array.prototype.map": "^1.0.2",
    "eslint": "^6.7.2",
    "object-keys": "^1.1.1",
    "safe-publish-latest": "^1.1.4",
    "tap": "0.4.13",
    "tape": "^4.12.0"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/browserify/resolve#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "resolve",
  "repository": {
    "type": "git",
    "url": "git://github.com/browserify/resolve.git"
  },
  "version": "1.14.2"
}var fs = require('fs');
var path = require('path');
var caller = require('./caller.js');
var nodeModulesPaths = require('./node-modules-paths.js');
var normalizeOptions = require('./normalize-options.js');
var isCore = require('./is-core');

var defaultIsFile = function isFile(file, cb) {
    fs.stat(file, function (err, stat) {
        if (!err) {
            return cb(null, stat.isFile() || stat.isFIFO());
        }
        if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false);
        return cb(err);
    });
};

var defaultIsDir = function isDirectory(dir, cb) {
    fs.stat(dir, function (err, stat) {
        if (!err) {
            return cb(null, stat.isDirectory());
        }
        if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false);
        return cb(err);
    });
};

var maybeUnwrapSymlink = function maybeUnwrapSymlink(x, opts, cb) {
    if (opts && opts.preserveSymlinks === false) {
        fs.realpath(x, function (realPathErr, realPath) {
            if (realPathErr && realPathErr.code !== 'ENOENT') cb(realPathErr);
            else cb(null, realPathErr ? x : realPath);
        });
    } else {
        cb(null, x);
    }
};

module.exports = function resolve(x, options, callback) {
    var cb = callback;
    var opts = options;
    if (typeof options === 'function') {
        cb = opts;
        opts = {};
    }
    if (typeof x !== 'string') {
        var err = new TypeError('Path must be a string.');
        return process.nextTick(function () {
            cb(err);
        });
    }

    opts = normalizeOptions(x, opts);

    var isFile = opts.isFile || defaultIsFile;
    var isDirectory = opts.isDirectory || defaultIsDir;
    var readFile = opts.readFile || fs.readFile;

    var extensions = opts.extensions || ['.js'];
    var basedir = opts.basedir || path.dirname(caller());
    var parent = opts.filename || basedir;

    opts.paths = opts.paths || [];

    // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory
    var absoluteStart = path.resolve(basedir);

    maybeUnwrapSymlink(
        absoluteStart,
        opts,
        function (err, realStart) {
            if (err) cb(err);
            else init(realStart);
        }
    );

    var res;
    function init(basedir) {
        if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) {
            res = path.resolve(basedir, x);
            if (x === '..' || x.slice(-1) === '/') res += '/';
            if ((/\/$/).test(x) && res === basedir) {
                loadAsDirectory(res, opts.package, onfile);
            } else loadAsFile(res, opts.package, onfile);
        } else if (isCore(x)) {
            return cb(null, x);
        } else loadNodeModules(x, basedir, function (err, n, pkg) {
            if (err) cb(err);
            else if (n) {
                return maybeUnwrapSymlink(n, opts, function (err, realN) {
                    if (err) {
                        cb(err);
                    } else {
                        cb(null, realN, pkg);
                    }
                });
            } else {
                var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'");
                moduleError.code = 'MODULE_NOT_FOUND';
                cb(moduleError);
            }
        });
    }

    function onfile(err, m, pkg) {
        if (err) cb(err);
        else if (m) cb(null, m, pkg);
        else loadAsDirectory(res, function (err, d, pkg) {
            if (err) cb(err);
            else if (d) {
                maybeUnwrapSymlink(d, opts, function (err, realD) {
                    if (err) {
                        cb(err);
                    } else {
                        cb(null, realD, pkg);
                    }
                });
            } else {
                var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'");
                moduleError.code = 'MODULE_NOT_FOUND';
                cb(moduleError);
            }
        });
    }

    function loadAsFile(x, thePackage, callback) {
        var loadAsFilePackage = thePackage;
        var cb = callback;
        if (typeof loadAsFilePackage === 'function') {
            cb = loadAsFilePackage;
            loadAsFilePackage = undefined;
        }

        var exts = [''].concat(extensions);
        load(exts, x, loadAsFilePackage);

        function load(exts, x, loadPackage) {
            if (exts.length === 0) return cb(null, undefined, loadPackage);
            var file = x + exts[0];

            var pkg = loadPackage;
            if (pkg) onpkg(null, pkg);
            else loadpkg(path.dirname(file), onpkg);

            function onpkg(err, pkg_, dir) {
                pkg = pkg_;
                if (err) return cb(err);
                if (dir && pkg && opts.pathFilter) {
                    var rfile = path.relative(dir, file);
                    var rel = rfile.slice(0, rfile.length - exts[0].length);
                    var r = opts.pathFilter(pkg, x, rel);
                    if (r) return load(
                        [''].concat(extensions.slice()),
                        path.resolve(dir, r),
                        pkg
                    );
                }
                isFile(file, onex);
            }
            function onex(err, ex) {
                if (err) return cb(err);
                if (ex) return cb(null, file, pkg);
                load(exts.slice(1), x, pkg);
            }
        }
    }

    function loadpkg(dir, cb) {
        if (dir === '' || dir === '/') return cb(null);
        if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) {
            return cb(null);
        }
        if ((/[/\\]node_modules[/\\]*$/).test(dir)) return cb(null);

        maybeUnwrapSymlink(dir, opts, function (unwrapErr, pkgdir) {
            if (unwrapErr) return loadpkg(path.dirname(dir), cb);
            var pkgfile = path.join(pkgdir, 'package.json');
            isFile(pkgfile, function (err, ex) {
                // on err, ex is false
                if (!ex) return loadpkg(path.dirname(dir), cb);

                readFile(pkgfile, function (err, body) {
                    if (err) cb(err);
                    try { var pkg = JSON.parse(body); } catch (jsonErr) {}

                    if (pkg && opts.packageFilter) {
                        pkg = opts.packageFilter(pkg, pkgfile);
                    }
                    cb(null, pkg, dir);
                });
            });
        });
    }

    function loadAsDirectory(x, loadAsDirectoryPackage, callback) {
        var cb = callback;
        var fpkg = loadAsDirectoryPackage;
        if (typeof fpkg === 'function') {
            cb = fpkg;
            fpkg = opts.package;
        }

        maybeUnwrapSymlink(x, opts, function (unwrapErr, pkgdir) {
            if (unwrapErr) return cb(unwrapErr);
            var pkgfile = path.join(pkgdir, 'package.json');
            isFile(pkgfile, function (err, ex) {
                if (err) return cb(err);
                if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb);

                readFile(pkgfile, function (err, body) {
                    if (err) return cb(err);
                    try {
                        var pkg = JSON.parse(body);
                    } catch (jsonErr) {}

                    if (pkg && opts.packageFilter) {
                        pkg = opts.packageFilter(pkg, pkgfile);
                    }

                    if (pkg && pkg.main) {
                        if (typeof pkg.main !== 'string') {
                            var mainError = new TypeError('package â€œ' + pkg.name + 'â€� `main` must be a string');
                            mainError.code = 'INVALID_PACKAGE_MAIN';
                            return cb(mainError);
                        }
                        if (pkg.main === '.' || pkg.main === './') {
                            pkg.main = 'index';
                        }
                        loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) {
                            if (err) return cb(err);
                            if (m) return cb(null, m, pkg);
                            if (!pkg) return loadAsFile(path.join(x, 'index'), pkg, cb);

                            var dir = path.resolve(x, pkg.main);
                            loadAsDirectory(dir, pkg, function (err, n, pkg) {
                                if (err) return cb(err);
                                if (n) return cb(null, n, pkg);
                                loadAsFile(path.join(x, 'index'), pkg, cb);
                            });
                        });
                        return;
                    }

                    loadAsFile(path.join(x, '/index'), pkg, cb);
                });
            });
        });
    }

    function processDirs(cb, dirs) {
        if (dirs.length === 0) return cb(null, undefined);
        var dir = dirs[0];

        isDirectory(dir, isdir);

        function isdir(err, isdir) {
            if (err) return cb(err);
            if (!isdir) return processDirs(cb, dirs.slice(1));
            var file = path.join(dir, x);
            loadAsFile(file, opts.package, onfile);
        }

        function onfile(err, m, pkg) {
            if (err) return cb(err);
            if (m) return cb(null, m, pkg);
            loadAsDirectory(path.join(dir, x), opts.package, ondir);
        }

        function ondir(err, n, pkg) {
            if (err) return cb(err);
            if (n) return cb(null, n, pkg);
            processDirs(cb, dirs.slice(1));
        }
    }
    function loadNodeModules(x, start, cb) {
        processDirs(cb, nodeModulesPaths(start, opts, x));
    }
};
module.exports = function () {
    // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
    var origPrepareStackTrace = Error.prepareStackTrace;
    Error.prepareStackTrace = function (_, stack) { return stack; };
    var stack = (new Error()).stack;
    Error.prepareStackTrace = origPrepareStackTrace;
    return stack[2].getFileName();
};
var current = (process.versions && process.versions.node && process.versions.node.split('.')) || [];

function specifierIncluded(specifier) {
    var parts = specifier.split(' ');
    var op = parts.length > 1 ? parts[0] : '=';
    var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.');

    for (var i = 0; i < 3; ++i) {
        var cur = Number(current[i] || 0);
        var ver = Number(versionParts[i] || 0);
        if (cur === ver) {
            continue; // eslint-disable-line no-restricted-syntax, no-continue
        }
        if (op === '<') {
            return cur < ver;
        } else if (op === '>=') {
            return cur >= ver;
        } else {
            return false;
        }
    }
    return op === '>=';
}

function matchesRange(range) {
    var specifiers = range.split(/ ?&& ?/);
    if (specifiers.length === 0) { return false; }
    for (var i = 0; i < specifiers.length; ++i) {
        if (!specifierIncluded(specifiers[i])) { return false; }
    }
    return true;
}

function versionIncluded(specifierValue) {
    if (typeof specifierValue === 'boolean') { return specifierValue; }
    if (specifierValue && typeof specifierValue === 'object') {
        for (var i = 0; i < specifierValue.length; ++i) {
            if (matchesRange(specifierValue[i])) { return true; }
        }
        return false;
    }
    return matchesRange(specifierValue);
}

var data = require('./core.json');

var core = {};
for (var mod in data) { // eslint-disable-line no-restricted-syntax
    if (Object.prototype.hasOwnProperty.call(data, mod)) {
        core[mod] = versionIncluded(data[mod]);
    }
}
module.exports = core;
{
    "assert": true,
    "async_hooks": ">= 8",
    "buffer_ieee754": "< 0.9.7",
    "buffer": true,
    "child_process": true,
    "cluster": true,
    "console": true,
    "constants": true,
    "crypto": true,
    "_debug_agent": ">= 1 && < 8",
    "_debugger": "< 8",
    "dgram": true,
    "dns": true,
    "domain": true,
    "events": true,
    "freelist": "< 6",
    "fs": true,
    "fs/promises": ">= 10 && < 10.1",
    "_http_agent": ">= 0.11.1",
    "_http_client": ">= 0.11.1",
    "_http_common": ">= 0.11.1",
    "_http_incoming": ">= 0.11.1",
    "_http_outgoing": ">= 0.11.1",
    "_http_server": ">= 0.11.1",
    "http": true,
    "http2": ">= 8.8",
    "https": true,
    "inspector": ">= 8.0.0",
    "_linklist": "< 8",
    "module": true,
    "net": true,
    "node-inspect/lib/_inspect": ">= 7.6.0 && < 12",
    "node-inspect/lib/internal/inspect_client": ">= 7.6.0 && < 12",
    "node-inspect/lib/internal/inspect_repl": ">= 7.6.0 && < 12",
    "os": true,
    "path": true,
    "perf_hooks": ">= 8.5",
    "process": ">= 1",
    "punycode": true,
    "querystring": true,
    "readline": true,
    "repl": true,
    "smalloc": ">= 0.11.5 && < 3",
    "_stream_duplex": ">= 0.9.4",
    "_stream_transform": ">= 0.9.4",
    "_stream_wrap": ">= 1.4.1",
    "_stream_passthrough": ">= 0.9.4",
    "_stream_readable": ">= 0.9.4",
    "_stream_writable": ">= 0.9.4",
    "stream": true,
    "string_decoder": true,
    "sys": true,
    "timers": true,
    "_tls_common": ">= 0.11.13",
    "_tls_legacy": ">= 0.11.3 && < 10",
    "_tls_wrap": ">= 0.11.3",
    "tls": true,
    "trace_events": ">= 10",
    "tty": true,
    "url": true,
    "util": true,
    "v8/tools/arguments": ">= 10 && < 12",
    "v8/tools/codemap": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
    "v8/tools/consarray": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
    "v8/tools/csvparser": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
    "v8/tools/logreader": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
    "v8/tools/profile_view": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
    "v8/tools/splaytree": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
    "v8": ">= 1",
    "vm": true,
    "wasi": ">= 13.4 && < 13.5",
    "worker_threads": ">= 11.7",
    "zlib": true
}
var core = require('./core');

module.exports = function isCore(x) {
    return Object.prototype.hasOwnProperty.call(core, x);
};
var path = require('path');
var parse = path.parse || require('path-parse');

var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) {
    var prefix = '/';
    if ((/^([A-Za-z]:)/).test(absoluteStart)) {
        prefix = '';
    } else if ((/^\\\\/).test(absoluteStart)) {
        prefix = '\\\\';
    }

    var paths = [absoluteStart];
    var parsed = parse(absoluteStart);
    while (parsed.dir !== paths[paths.length - 1]) {
        paths.push(parsed.dir);
        parsed = parse(parsed.dir);
    }

    return paths.reduce(function (dirs, aPath) {
        return dirs.concat(modules.map(function (moduleDir) {
            return path.resolve(prefix, aPath, moduleDir);
        }));
    }, []);
};

module.exports = function nodeModulesPaths(start, opts, request) {
    var modules = opts && opts.moduleDirectory
        ? [].concat(opts.moduleDirectory)
        : ['node_modules'];

    if (opts && typeof opts.paths === 'function') {
        return opts.paths(
            request,
            start,
            function () { return getNodeModulesDirs(start, modules); },
            opts
        );
    }

    var dirs = getNodeModulesDirs(start, modules);
    return opts && opts.paths ? dirs.concat(opts.paths) : dirs;
};
module.exports = function (x, opts) {
    /**
     * This file is purposefully a passthrough. It's expected that third-party
     * environments will override it at runtime in order to inject special logic
     * into `resolve` (by manipulating the options). One such example is the PnP
     * code path in Yarn.
     */

    return opts || {};
};
var isCore = require('./is-core');
var fs = require('fs');
var path = require('path');
var caller = require('./caller.js');
var nodeModulesPaths = require('./node-modules-paths.js');
var normalizeOptions = require('./normalize-options.js');

var defaultIsFile = function isFile(file) {
    try {
        var stat = fs.statSync(file);
    } catch (e) {
        if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
        throw e;
    }
    return stat.isFile() || stat.isFIFO();
};

var defaultIsDir = function isDirectory(dir) {
    try {
        var stat = fs.statSync(dir);
    } catch (e) {
        if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
        throw e;
    }
    return stat.isDirectory();
};

var maybeUnwrapSymlink = function maybeUnwrapSymlink(x, opts) {
    if (opts && opts.preserveSymlinks === false) {
        try {
            return fs.realpathSync(x);
        } catch (realPathErr) {
            if (realPathErr.code !== 'ENOENT') {
                throw realPathErr;
            }
        }
    }
    return x;
};

module.exports = function (x, options) {
    if (typeof x !== 'string') {
        throw new TypeError('Path must be a string.');
    }
    var opts = normalizeOptions(x, options);

    var isFile = opts.isFile || defaultIsFile;
    var readFileSync = opts.readFileSync || fs.readFileSync;
    var isDirectory = opts.isDirectory || defaultIsDir;

    var extensions = opts.extensions || ['.js'];
    var basedir = opts.basedir || path.dirname(caller());
    var parent = opts.filename || basedir;

    opts.paths = opts.paths || [];

    // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory
    var absoluteStart = maybeUnwrapSymlink(path.resolve(basedir), opts);

    if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) {
        var res = path.resolve(absoluteStart, x);
        if (x === '..' || x.slice(-1) === '/') res += '/';
        var m = loadAsFileSync(res) || loadAsDirectorySync(res);
        if (m) return maybeUnwrapSymlink(m, opts);
    } else if (isCore(x)) {
        return x;
    } else {
        var n = loadNodeModulesSync(x, absoluteStart);
        if (n) return maybeUnwrapSymlink(n, opts);
    }

    var err = new Error("Cannot find module '" + x + "' from '" + parent + "'");
    err.code = 'MODULE_NOT_FOUND';
    throw err;

    function loadAsFileSync(x) {
        var pkg = loadpkg(path.dirname(x));

        if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) {
            var rfile = path.relative(pkg.dir, x);
            var r = opts.pathFilter(pkg.pkg, x, rfile);
            if (r) {
                x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign
            }
        }

        if (isFile(x)) {
            return x;
        }

        for (var i = 0; i < extensions.length; i++) {
            var file = x + extensions[i];
            if (isFile(file)) {
                return file;
            }
        }
    }

    function loadpkg(dir) {
        if (dir === '' || dir === '/') return;
        if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) {
            return;
        }
        if ((/[/\\]node_modules[/\\]*$/).test(dir)) return;

        var pkgfile = path.join(maybeUnwrapSymlink(dir, opts), 'package.json');

        if (!isFile(pkgfile)) {
            return loadpkg(path.dirname(dir));
        }

        var body = readFileSync(pkgfile);

        try {
            var pkg = JSON.parse(body);
        } catch (jsonErr) {}

        if (pkg && opts.packageFilter) {
            // v2 will pass pkgfile
            pkg = opts.packageFilter(pkg, /*pkgfile,*/ dir); // eslint-disable-line spaced-comment
        }

        return { pkg: pkg, dir: dir };
    }

    function loadAsDirectorySync(x) {
        var pkgfile = path.join(maybeUnwrapSymlink(x, opts), '/package.json');
        if (isFile(pkgfile)) {
            try {
                var body = readFileSync(pkgfile, 'UTF8');
                var pkg = JSON.parse(body);
            } catch (e) {}

            if (pkg && opts.packageFilter) {
                // v2 will pass pkgfile
                pkg = opts.packageFilter(pkg, /*pkgfile,*/ x); // eslint-disable-line spaced-comment
            }

            if (pkg && pkg.main) {
                if (typeof pkg.main !== 'string') {
                    var mainError = new TypeError('package â€œ' + pkg.name + 'â€� `main` must be a string');
                    mainError.code = 'INVALID_PACKAGE_MAIN';
                    throw mainError;
                }
                if (pkg.main === '.' || pkg.main === './') {
                    pkg.main = 'index';
                }
                try {
                    var m = loadAsFileSync(path.resolve(x, pkg.main));
                    if (m) return m;
                    var n = loadAsDirectorySync(path.resolve(x, pkg.main));
                    if (n) return n;
                } catch (e) {}
            }
        }

        return loadAsFileSync(path.join(x, '/index'));
    }

    function loadNodeModulesSync(x, start) {
        var dirs = nodeModulesPaths(start, opts, x);
        for (var i = 0; i < dirs.length; i++) {
            var dir = dirs[i];
            if (isDirectory(dir)) {
                var m = loadAsFileSync(path.join(dir, '/', x));
                if (m) return m;
                var n = loadAsDirectorySync(path.join(dir, '/', x));
                if (n) return n;
            }
        }
    }
};
This software is released under the MIT license:

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
var through = require('through');
var nextTick = typeof setImmediate !== 'undefined'
    ? setImmediate
    : process.nextTick
;

module.exports = function (write, end) {
    var tr = through(write, end);
    tr.pause();
    var resume = tr.resume;
    var pause = tr.pause;
    var paused = false;
    
    tr.pause = function () {
        paused = true;
        return pause.apply(this, arguments);
    };
    
    tr.resume = function () {
        paused = false;
        return resume.apply(this, arguments);
    };
    
    nextTick(function () {
        if (!paused) tr.resume();
    });
    
    return tr;
};
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "dependencies": {
    "through": "~2.3.4"
  },
  "deprecated": false,
  "description": "a through stream that starts paused and resumes on the next tick",
  "devDependencies": {
    "concat-stream": "~0.1.1",
    "tap": "~0.4.0",
    "tape": "~1.0.2"
  },
  "homepage": "https://github.com/substack/resumer",
  "license": "MIT",
  "main": "index.js",
  "name": "resumer",
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/resumer.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/6..latest",
      "chrome/20..latest",
      "firefox/10..latest",
      "safari/latest",
      "opera/11.0..latest",
      "iphone/6",
      "ipad/6"
    ]
  },
  "version": "0.0.0"
}The MIT License (MIT)

Copyright (c) Feross Aboukhadijeh

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
/* eslint-disable node/no-deprecated-api */
var buffer = require('buffer')
var Buffer = buffer.Buffer

// alternative to using Object.keys for old browsers
function copyProps (src, dst) {
  for (var key in src) {
    dst[key] = src[key]
  }
}
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
  module.exports = buffer
} else {
  // Copy properties from require('buffer')
  copyProps(buffer, exports)
  exports.Buffer = SafeBuffer
}

function SafeBuffer (arg, encodingOrOffset, length) {
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.prototype = Object.create(Buffer.prototype)

// Copy static methods from Buffer
copyProps(Buffer, SafeBuffer)

SafeBuffer.from = function (arg, encodingOrOffset, length) {
  if (typeof arg === 'number') {
    throw new TypeError('Argument must not be a number')
  }
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.alloc = function (size, fill, encoding) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  var buf = Buffer(size)
  if (fill !== undefined) {
    if (typeof encoding === 'string') {
      buf.fill(fill, encoding)
    } else {
      buf.fill(fill)
    }
  } else {
    buf.fill(0)
  }
  return buf
}

SafeBuffer.allocUnsafe = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return Buffer(size)
}

SafeBuffer.allocUnsafeSlow = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return buffer.SlowBuffer(size)
}
{
  "author": {
    "name": "Feross Aboukhadijeh",
    "email": "feross@feross.org",
    "url": "https://feross.org"
  },
  "deprecated": false,
  "description": "Safer Node.js Buffer API",
  "devDependencies": {
    "standard": "*",
    "tape": "^5.0.0"
  },
  "funding": [
    {
      "type": "github",
      "url": "https://github.com/sponsors/feross"
    },
    {
      "type": "patreon",
      "url": "https://www.patreon.com/feross"
    },
    {
      "type": "consulting",
      "url": "https://feross.org/support"
    }
  ],
  "homepage": "https://github.com/feross/safe-buffer",
  "license": "MIT",
  "main": "index.js",
  "name": "safe-buffer",
  "repository": {
    "type": "git",
    "url": "git://github.com/feross/safe-buffer.git"
  },
  "types": "index.d.ts",
  "version": "5.2.1"
}MIT License

Copyright (c) 2018 Nikita Skovoroda <chalkerx@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
# Porting to the Buffer.from/Buffer.alloc API

<a id="overview"></a>
## Overview

- [Variant 1: Drop support for Node.js â‰¤ 4.4.x and 5.0.0 â€” 5.9.x.](#variant-1) (*recommended*)
- [Variant 2: Use a polyfill](#variant-2)
- [Variant 3: manual detection, with safeguards](#variant-3)

### Finding problematic bits of code using grep

Just run `grep -nrE '[^a-zA-Z](Slow)?Buffer\s*\(' --exclude-dir node_modules`.

It will find all the potentially unsafe places in your own code (with some considerably unlikely
exceptions).

### Finding problematic bits of code using Node.js 8

If youâ€™re using Node.js â‰¥ 8.0.0 (which is recommended), Node.js exposes multiple options that help with finding the relevant pieces of code:

- `--trace-warnings` will make Node.js show a stack trace for this warning and other warnings that are printed by Node.js.
- `--trace-deprecation` does the same thing, but only for deprecation warnings.
- `--pending-deprecation` will show more types of deprecation warnings. In particular, it will show the `Buffer()` deprecation warning, even on Node.js 8.

You can set these flags using an environment variable:

```console
$ export NODE_OPTIONS='--trace-warnings --pending-deprecation'
$ cat example.js
'use strict';
const foo = new Buffer('foo');
$ node example.js
(node:7147) [DEP0005] DeprecationWarning: The Buffer() and new Buffer() constructors are not recommended for use due to security and usability concerns. Please use the new Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() construction methods instead.
    at showFlaggedDeprecation (buffer.js:127:13)
    at new Buffer (buffer.js:148:3)
    at Object.<anonymous> (/path/to/example.js:2:13)
    [... more stack trace lines ...]
```

### Finding problematic bits of code using linters

Eslint rules [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor)
or
[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md)
also find calls to deprecated `Buffer()` API. Those rules are included in some pre-sets.

There is a drawback, though, that it doesn't always
[work correctly](https://github.com/chalker/safer-buffer#why-not-safe-buffer) when `Buffer` is
overriden e.g. with a polyfill, so recommended is a combination of this and some other method
described above.

<a id="variant-1"></a>
## Variant 1: Drop support for Node.js â‰¤ 4.4.x and 5.0.0 â€” 5.9.x.

This is the recommended solution nowadays that would imply only minimal overhead.

The Node.js 5.x release line has been unsupported since July 2016, and the Node.js 4.x release line reaches its End of Life in April 2018 (â†’ [Schedule](https://github.com/nodejs/Release#release-schedule)). This means that these versions of Node.js will *not* receive any updates, even in case of security issues, so using these release lines should be avoided, if at all possible.

What you would do in this case is to convert all `new Buffer()` or `Buffer()` calls to use `Buffer.alloc()` or `Buffer.from()`, in the following way:

- For `new Buffer(number)`, replace it with `Buffer.alloc(number)`.
- For `new Buffer(string)` (or `new Buffer(string, encoding)`), replace it with `Buffer.from(string)` (or `Buffer.from(string, encoding)`).
- For all other combinations of arguments (these are much rarer), also replace `new Buffer(...arguments)` with `Buffer.from(...arguments)`.

Note that `Buffer.alloc()` is also _faster_ on the current Node.js versions than
`new Buffer(size).fill(0)`, which is what you would otherwise need to ensure zero-filling.

Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor)
or
[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md)
is recommended to avoid accidential unsafe Buffer API usage.

There is also a [JSCodeshift codemod](https://github.com/joyeecheung/node-dep-codemod#dep005)
for automatically migrating Buffer constructors to `Buffer.alloc()` or `Buffer.from()`.
Note that it currently only works with cases where the arguments are literals or where the
constructor is invoked with two arguments.

_If you currently support those older Node.js versions and dropping them would be a semver-major change
for you, or if you support older branches of your packages, consider using [Variant 2](#variant-2)
or [Variant 3](#variant-3) on older branches, so people using those older branches will also receive
the fix. That way, you will eradicate potential issues caused by unguarded Buffer API usage and
your users will not observe a runtime deprecation warning when running your code on Node.js 10._

<a id="variant-2"></a>
## Variant 2: Use a polyfill

Utilize [safer-buffer](https://www.npmjs.com/package/safer-buffer) as a polyfill to support older
Node.js versions.

You would take exacly the same steps as in [Variant 1](#variant-1), but with a polyfill
`const Buffer = require('safer-buffer').Buffer` in all files where you use the new `Buffer` api.

Make sure that you do not use old `new Buffer` API â€” in any files where the line above is added,
using old `new Buffer()` API will _throw_. It will be easy to notice that in CI, though.

Alternatively, you could use [buffer-from](https://www.npmjs.com/package/buffer-from) and/or
[buffer-alloc](https://www.npmjs.com/package/buffer-alloc) [ponyfills](https://ponyfill.com/) â€”
those are great, the only downsides being 4 deps in the tree and slightly more code changes to
migrate off them (as you would be using e.g. `Buffer.from` under a different name). If you need only
`Buffer.from` polyfilled â€” `buffer-from` alone which comes with no extra dependencies.

_Alternatively, you could use [safe-buffer](https://www.npmjs.com/package/safe-buffer) â€” it also
provides a polyfill, but takes a different approach which has
[it's drawbacks](https://github.com/chalker/safer-buffer#why-not-safe-buffer). It will allow you
to also use the older `new Buffer()` API in your code, though â€” but that's arguably a benefit, as
it is problematic, can cause issues in your code, and will start emitting runtime deprecation
warnings starting with Node.js 10._

Note that in either case, it is important that you also remove all calls to the old Buffer
API manually â€” just throwing in `safe-buffer` doesn't fix the problem by itself, it just provides
a polyfill for the new API. I have seen people doing that mistake.

Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor)
or
[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md)
is recommended.

_Don't forget to drop the polyfill usage once you drop support for Node.js < 4.5.0._

<a id="variant-3"></a>
## Variant 3 â€” manual detection, with safeguards

This is useful if you create Buffer instances in only a few places (e.g. one), or you have your own
wrapper around them.

### Buffer(0)

This special case for creating empty buffers can be safely replaced with `Buffer.concat([])`, which
returns the same result all the way down to Node.js 0.8.x.

### Buffer(notNumber)

Before:

```js
var buf = new Buffer(notNumber, encoding);
```

After:

```js
var buf;
if (Buffer.from && Buffer.from !== Uint8Array.from) {
  buf = Buffer.from(notNumber, encoding);
} else {
  if (typeof notNumber === 'number')
    throw new Error('The "size" argument must be of type number.');
  buf = new Buffer(notNumber, encoding);
}
```

`encoding` is optional.

Note that the `typeof notNumber` before `new Buffer` is required (for cases when `notNumber` argument is not
hard-coded) and _is not caused by the deprecation of Buffer constructor_ â€” it's exactly _why_ the
Buffer constructor is deprecated. Ecosystem packages lacking this type-check caused numereous
security issues â€” situations when unsanitized user input could end up in the `Buffer(arg)` create
problems ranging from DoS to leaking sensitive information to the attacker from the process memory.

When `notNumber` argument is hardcoded (e.g. literal `"abc"` or `[0,1,2]`), the `typeof` check can
be omitted.

Also note that using TypeScript does not fix this problem for you â€” when libs written in
`TypeScript` are used from JS, or when user input ends up there â€” it behaves exactly as pure JS, as
all type checks are translation-time only and are not present in the actual JS code which TS
compiles to.

### Buffer(number)

For Node.js 0.10.x (and below) support:

```js
var buf;
if (Buffer.alloc) {
  buf = Buffer.alloc(number);
} else {
  buf = new Buffer(number);
  buf.fill(0);
}
```

Otherwise (Node.js â‰¥ 0.12.x):

```js
const buf = Buffer.alloc ? Buffer.alloc(number) : new Buffer(number).fill(0);
```

## Regarding Buffer.allocUnsafe

Be extra cautious when using `Buffer.allocUnsafe`:
 * Don't use it if you don't have a good reason to
   * e.g. you probably won't ever see a performance difference for small buffers, in fact, those
     might be even faster with `Buffer.alloc()`,
   * if your code is not in the hot code path â€” you also probably won't notice a difference,
   * keep in mind that zero-filling minimizes the potential risks.
 * If you use it, make sure that you never return the buffer in a partially-filled state,
   * if you are writing to it sequentially â€” always truncate it to the actuall written length

Errors in handling buffers allocated with `Buffer.allocUnsafe` could result in various issues,
ranged from undefined behaviour of your code to sensitive data (user input, passwords, certs)
leaking to the remote attacker.

_Note that the same applies to `new Buffer` usage without zero-filling, depending on the Node.js
version (and lacking type checks also adds DoS to the list of potential problems)._

<a id="faq"></a>
## FAQ

<a id="design-flaws"></a>
### What is wrong with the `Buffer` constructor?

The `Buffer` constructor could be used to create a buffer in many different ways:

- `new Buffer(42)` creates a `Buffer` of 42 bytes. Before Node.js 8, this buffer contained
  *arbitrary memory* for performance reasons, which could include anything ranging from
  program source code to passwords and encryption keys.
- `new Buffer('abc')` creates a `Buffer` that contains the UTF-8-encoded version of
  the string `'abc'`. A second argument could specify another encoding: For example,
  `new Buffer(string, 'base64')` could be used to convert a Base64 string into the original
  sequence of bytes that it represents.
- There are several other combinations of arguments.

This meant that, in code like `var buffer = new Buffer(foo);`, *it is not possible to tell
what exactly the contents of the generated buffer are* without knowing the type of `foo`.

Sometimes, the value of `foo` comes from an external source. For example, this function
could be exposed as a service on a web server, converting a UTF-8 string into its Base64 form:

```
function stringToBase64(req, res) {
  // The request body should have the format of `{ string: 'foobar' }`
  const rawBytes = new Buffer(req.body.string)
  const encoded = rawBytes.toString('base64')
  res.end({ encoded: encoded })
}
```

Note that this code does *not* validate the type of `req.body.string`:

- `req.body.string` is expected to be a string. If this is the case, all goes well.
- `req.body.string` is controlled by the client that sends the request.
- If `req.body.string` is the *number* `50`, the `rawBytes` would be 50 bytes:
  - Before Node.js 8, the content would be uninitialized
  - After Node.js 8, the content would be `50` bytes with the value `0`

Because of the missing type check, an attacker could intentionally send a number
as part of the request. Using this, they can either:

- Read uninitialized memory. This **will** leak passwords, encryption keys and other
  kinds of sensitive information. (Information leak)
- Force the program to allocate a large amount of memory. For example, when specifying
  `500000000` as the input value, each request will allocate 500MB of memory.
  This can be used to either exhaust the memory available of a program completely
  and make it crash, or slow it down significantly. (Denial of Service)

Both of these scenarios are considered serious security issues in a real-world
web server context.

when using `Buffer.from(req.body.string)` instead, passing a number will always
throw an exception instead, giving a controlled behaviour that can always be
handled by the program.

<a id="ecosystem-usage"></a>
### The `Buffer()` constructor has been deprecated for a while. Is this really an issue?

Surveys of code in the `npm` ecosystem have shown that the `Buffer()` constructor is still
widely used. This includes new code, and overall usage of such code has actually been
*increasing*.
# safer-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![javascript style guide][standard-image]][standard-url] [![Security Responsible Disclosure][secuirty-image]][secuirty-url]

[travis-image]: https://travis-ci.org/ChALkeR/safer-buffer.svg?branch=master
[travis-url]: https://travis-ci.org/ChALkeR/safer-buffer
[npm-image]: https://img.shields.io/npm/v/safer-buffer.svg
[npm-url]: https://npmjs.org/package/safer-buffer
[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg
[standard-url]: https://standardjs.com
[secuirty-image]: https://img.shields.io/badge/Security-Responsible%20Disclosure-green.svg
[secuirty-url]: https://github.com/nodejs/security-wg/blob/master/processes/responsible_disclosure_template.md

Modern Buffer API polyfill without footguns, working on Node.js from 0.8 to current.

## How to use?

First, port all `Buffer()` and `new Buffer()` calls to `Buffer.alloc()` and `Buffer.from()` API.

Then, to achieve compatibility with outdated Node.js versions (`<4.5.0` and 5.x `<5.9.0`), use
`const Buffer = require('safer-buffer').Buffer` in all files where you make calls to the new
Buffer API. _Use `var` instead of `const` if you need that for your Node.js version range support._

Also, see the
[porting Buffer](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md) guide.

## Do I need it?

Hopefully, not â€” dropping support for outdated Node.js versions should be fine nowdays, and that
is the recommended path forward. You _do_ need to port to the `Buffer.alloc()` and `Buffer.from()`
though.

See the [porting guide](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md)
for a better description.

## Why not [safe-buffer](https://npmjs.com/safe-buffer)?

_In short: while `safe-buffer` serves as a polyfill for the new API, it allows old API usage and
itself contains footguns._

`safe-buffer` could be used safely to get the new API while still keeping support for older
Node.js versions (like this module), but while analyzing ecosystem usage of the old Buffer API
I found out that `safe-buffer` is itself causing problems in some cases.

For example, consider the following snippet:

```console
$ cat example.unsafe.js
console.log(Buffer(20))
$ ./node-v6.13.0-linux-x64/bin/node example.unsafe.js
<Buffer 0a 00 00 00 00 00 00 00 28 13 de 02 00 00 00 00 05 00 00 00>
$ standard example.unsafe.js
standard: Use JavaScript Standard Style (https://standardjs.com)
  /home/chalker/repo/safer-buffer/example.unsafe.js:2:13: 'Buffer()' was deprecated since v6. Use 'Buffer.alloc()' or 'Buffer.from()' (use 'https://www.npmjs.com/package/safe-buffer' for '<4.5.0') instead.
```

This is allocates and writes to console an uninitialized chunk of memory.
[standard](https://www.npmjs.com/package/standard) linter (among others) catch that and warn people
to avoid using unsafe API.

Let's now throw in `safe-buffer`!

```console
$ cat example.safe-buffer.js
const Buffer = require('safe-buffer').Buffer
console.log(Buffer(20))
$ standard example.safe-buffer.js
$ ./node-v6.13.0-linux-x64/bin/node example.safe-buffer.js
<Buffer 08 00 00 00 00 00 00 00 28 58 01 82 fe 7f 00 00 00 00 00 00>
```

See the problem? Adding in `safe-buffer` _magically removes the lint warning_, but the behavior
remains identiÑ�al to what we had before, and when launched on Node.js 6.x LTS â€” this dumps out
chunks of uninitialized memory.
_And this code will still emit runtime warnings on Node.js 10.x and above._

That was done by design. I first considered changing `safe-buffer`, prohibiting old API usage or
emitting warnings on it, but that significantly diverges from `safe-buffer` design. After some
discussion, it was decided to move my approach into a separate package, and _this is that separate
package_.

This footgun is not imaginary â€” I observed top-downloaded packages doing that kind of thing,
Â«fixingÂ» the lint warning by blindly including `safe-buffer` without any actual changes.

Also in some cases, even if the API _was_ migrated to use of safe Buffer API â€” a random pull request
can bring unsafe Buffer API usage back to the codebase by adding new calls â€” and that could go
unnoticed even if you have a linter prohibiting that (becase of the reason stated above), and even
pass CI. _I also observed that being done in popular packages._

Some examples:
 * [webdriverio](https://github.com/webdriverio/webdriverio/commit/05cbd3167c12e4930f09ef7cf93b127ba4effae4#diff-124380949022817b90b622871837d56cR31)
   (a module with 548 759 downloads/month),
 * [websocket-stream](https://github.com/maxogden/websocket-stream/commit/c9312bd24d08271687d76da0fe3c83493871cf61)
   (218 288 d/m, fix in [maxogden/websocket-stream#142](https://github.com/maxogden/websocket-stream/pull/142)),
 * [node-serialport](https://github.com/node-serialport/node-serialport/commit/e8d9d2b16c664224920ce1c895199b1ce2def48c)
   (113 138 d/m, fix in [node-serialport/node-serialport#1510](https://github.com/node-serialport/node-serialport/pull/1510)),
 * [karma](https://github.com/karma-runner/karma/commit/3d94b8cf18c695104ca195334dc75ff054c74eec)
   (3 973 193 d/m, fix in [karma-runner/karma#2947](https://github.com/karma-runner/karma/pull/2947)),
 * [spdy-transport](https://github.com/spdy-http2/spdy-transport/commit/5375ac33f4a62a4f65bcfc2827447d42a5dbe8b1)
   (5 970 727 d/m, fix in [spdy-http2/spdy-transport#53](https://github.com/spdy-http2/spdy-transport/pull/53)).
 * And there are a lot more over the ecosystem.

I filed a PR at
[mysticatea/eslint-plugin-node#110](https://github.com/mysticatea/eslint-plugin-node/pull/110) to
partially fix that (for cases when that lint rule is used), but it is a semver-major change for
linter rules and presets, so it would take significant time for that to reach actual setups.
_It also hasn't been released yet (2018-03-20)._

Also, `safer-buffer` discourages the usage of `.allocUnsafe()`, which is often done by a mistake.
It still supports it with an explicit concern barier, by placing it under
`require('safer-buffer/dangereous')`.

## But isn't throwing bad?

Not really. It's an error that could be noticed and fixed early, instead of causing havoc later like
unguarded `new Buffer()` calls that end up receiving user input can do.

This package affects only the files where `var Buffer = require('safer-buffer').Buffer` was done, so
it is really simple to keep track of things and make sure that you don't mix old API usage with that.
Also, CI should hint anything that you might have missed.

New commits, if tested, won't land new usage of unsafe Buffer API this way.
_Node.js 10.x also deals with that by printing a runtime depecation warning._

### Would it affect third-party modules?

No, unless you explicitly do an awful thing like monkey-patching or overriding the built-in `Buffer`.
Don't do that.

### But I don't want throwingâ€¦

That is also fine!

Also, it could be better in some cases when you don't comprehensive enough test coverage.

In that case â€” just don't override `Buffer` and use
`var SaferBuffer = require('safer-buffer').Buffer` instead.

That way, everything using `Buffer` natively would still work, but there would be two drawbacks:

* `Buffer.from`/`Buffer.alloc` won't be polyfilled â€” use `SaferBuffer.from` and
  `SaferBuffer.alloc` instead.
* You are still open to accidentally using the insecure deprecated API â€” use a linter to catch that.

Note that using a linter to catch accidential `Buffer` constructor usage in this case is strongly
recommended. `Buffer` is not overriden in this usecase, so linters won't get confused.

## Â«Without footgunsÂ»?

Well, it is still possible to do _some_ things with `Buffer` API, e.g. accessing `.buffer` property
on older versions and duping things from there. You shouldn't do that in your code, probabably.

The intention is to remove the most significant footguns that affect lots of packages in the
ecosystem, and to do it in the proper way.

Also, this package doesn't protect against security issues affecting some Node.js versions, so for
usage in your own production code, it is still recommended to update to a Node.js version
[supported by upstream](https://github.com/nodejs/release#release-schedule).
/* eslint-disable node/no-deprecated-api */

'use strict'

var buffer = require('buffer')
var Buffer = buffer.Buffer
var safer = require('./safer.js')
var Safer = safer.Buffer

var dangerous = {}

var key

for (key in safer) {
  if (!safer.hasOwnProperty(key)) continue
  dangerous[key] = safer[key]
}

var Dangereous = dangerous.Buffer = {}

// Copy Safer API
for (key in Safer) {
  if (!Safer.hasOwnProperty(key)) continue
  Dangereous[key] = Safer[key]
}

// Copy those missing unsafe methods, if they are present
for (key in Buffer) {
  if (!Buffer.hasOwnProperty(key)) continue
  if (Dangereous.hasOwnProperty(key)) continue
  Dangereous[key] = Buffer[key]
}

if (!Dangereous.allocUnsafe) {
  Dangereous.allocUnsafe = function (size) {
    if (typeof size !== 'number') {
      throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size)
    }
    if (size < 0 || size >= 2 * (1 << 30)) {
      throw new RangeError('The value "' + size + '" is invalid for option "size"')
    }
    return Buffer(size)
  }
}

if (!Dangereous.allocUnsafeSlow) {
  Dangereous.allocUnsafeSlow = function (size) {
    if (typeof size !== 'number') {
      throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size)
    }
    if (size < 0 || size >= 2 * (1 << 30)) {
      throw new RangeError('The value "' + size + '" is invalid for option "size"')
    }
    return buffer.SlowBuffer(size)
  }
}

module.exports = dangerous
{
  "author": {
    "name": "Nikita Skovoroda",
    "email": "chalkerx@gmail.com",
    "url": "https://github.com/ChALkeR"
  },
  "deprecated": false,
  "description": "Modern Buffer API polyfill without footguns",
  "devDependencies": {
    "standard": "^11.0.1",
    "tape": "^4.9.0"
  },
  "files": [
    "Porting-Buffer.md",
    "Readme.md",
    "tests.js",
    "dangerous.js",
    "safer.js"
  ],
  "homepage": "https://github.com/ChALkeR/safer-buffer#readme",
  "license": "MIT",
  "main": "safer.js",
  "name": "safer-buffer",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ChALkeR/safer-buffer.git"
  },
  "version": "2.1.2"
}/* eslint-disable node/no-deprecated-api */

'use strict'

var buffer = require('buffer')
var Buffer = buffer.Buffer

var safer = {}

var key

for (key in buffer) {
  if (!buffer.hasOwnProperty(key)) continue
  if (key === 'SlowBuffer' || key === 'Buffer') continue
  safer[key] = buffer[key]
}

var Safer = safer.Buffer = {}
for (key in Buffer) {
  if (!Buffer.hasOwnProperty(key)) continue
  if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue
  Safer[key] = Buffer[key]
}

safer.Buffer.prototype = Buffer.prototype

if (!Safer.from || Safer.from === Uint8Array.from) {
  Safer.from = function (value, encodingOrOffset, length) {
    if (typeof value === 'number') {
      throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value)
    }
    if (value && typeof value.length === 'undefined') {
      throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value)
    }
    return Buffer(value, encodingOrOffset, length)
  }
}

if (!Safer.alloc) {
  Safer.alloc = function (size, fill, encoding) {
    if (typeof size !== 'number') {
      throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size)
    }
    if (size < 0 || size >= 2 * (1 << 30)) {
      throw new RangeError('The value "' + size + '" is invalid for option "size"')
    }
    var buf = Buffer(size)
    if (!fill || fill.length === 0) {
      buf.fill(0)
    } else if (typeof encoding === 'string') {
      buf.fill(fill, encoding)
    } else {
      buf.fill(fill)
    }
    return buf
  }
}

if (!safer.kStringMaxLength) {
  try {
    safer.kStringMaxLength = process.binding('buffer').kStringMaxLength
  } catch (e) {
    // we can't determine kStringMaxLength in environments where process.binding
    // is unsupported, so let's not set it
  }
}

if (!safer.constants) {
  safer.constants = {
    MAX_LENGTH: safer.kMaxLength
  }
  if (safer.kStringMaxLength) {
    safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength
  }
}

module.exports = safer
/* eslint-disable node/no-deprecated-api */

'use strict'

var test = require('tape')

var buffer = require('buffer')

var index = require('./')
var safer = require('./safer')
var dangerous = require('./dangerous')

/* Inheritance tests */

test('Default is Safer', function (t) {
  t.equal(index, safer)
  t.notEqual(safer, dangerous)
  t.notEqual(index, dangerous)
  t.end()
})

test('Is not a function', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(typeof impl, 'object')
    t.equal(typeof impl.Buffer, 'object')
  });
  [buffer].forEach(function (impl) {
    t.equal(typeof impl, 'object')
    t.equal(typeof impl.Buffer, 'function')
  })
  t.end()
})

test('Constructor throws', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.throws(function () { impl.Buffer() })
    t.throws(function () { impl.Buffer(0) })
    t.throws(function () { impl.Buffer('a') })
    t.throws(function () { impl.Buffer('a', 'utf-8') })
    t.throws(function () { return new impl.Buffer() })
    t.throws(function () { return new impl.Buffer(0) })
    t.throws(function () { return new impl.Buffer('a') })
    t.throws(function () { return new impl.Buffer('a', 'utf-8') })
  })
  t.end()
})

test('Safe methods exist', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(typeof impl.Buffer.alloc, 'function', 'alloc')
    t.equal(typeof impl.Buffer.from, 'function', 'from')
  })
  t.end()
})

test('Unsafe methods exist only in Dangerous', function (t) {
  [index, safer].forEach(function (impl) {
    t.equal(typeof impl.Buffer.allocUnsafe, 'undefined')
    t.equal(typeof impl.Buffer.allocUnsafeSlow, 'undefined')
  });
  [dangerous].forEach(function (impl) {
    t.equal(typeof impl.Buffer.allocUnsafe, 'function')
    t.equal(typeof impl.Buffer.allocUnsafeSlow, 'function')
  })
  t.end()
})

test('Generic methods/properties are defined and equal', function (t) {
  ['poolSize', 'isBuffer', 'concat', 'byteLength'].forEach(function (method) {
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl.Buffer[method], buffer.Buffer[method], method)
      t.notEqual(typeof impl.Buffer[method], 'undefined', method)
    })
  })
  t.end()
})

test('Built-in buffer static methods/properties are inherited', function (t) {
  Object.keys(buffer).forEach(function (method) {
    if (method === 'SlowBuffer' || method === 'Buffer') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl[method], buffer[method], method)
      t.notEqual(typeof impl[method], 'undefined', method)
    })
  })
  t.end()
})

test('Built-in Buffer static methods/properties are inherited', function (t) {
  Object.keys(buffer.Buffer).forEach(function (method) {
    if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl.Buffer[method], buffer.Buffer[method], method)
      t.notEqual(typeof impl.Buffer[method], 'undefined', method)
    })
  })
  t.end()
})

test('.prototype property of Buffer is inherited', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(impl.Buffer.prototype, buffer.Buffer.prototype, 'prototype')
    t.notEqual(typeof impl.Buffer.prototype, 'undefined', 'prototype')
  })
  t.end()
})

test('All Safer methods are present in Dangerous', function (t) {
  Object.keys(safer).forEach(function (method) {
    if (method === 'Buffer') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl[method], safer[method], method)
      if (method !== 'kStringMaxLength') {
        t.notEqual(typeof impl[method], 'undefined', method)
      }
    })
  })
  Object.keys(safer.Buffer).forEach(function (method) {
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl.Buffer[method], safer.Buffer[method], method)
      t.notEqual(typeof impl.Buffer[method], 'undefined', method)
    })
  })
  t.end()
})

test('Safe methods from Dangerous methods are present in Safer', function (t) {
  Object.keys(dangerous).forEach(function (method) {
    if (method === 'Buffer') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl[method], dangerous[method], method)
      if (method !== 'kStringMaxLength') {
        t.notEqual(typeof impl[method], 'undefined', method)
      }
    })
  })
  Object.keys(dangerous.Buffer).forEach(function (method) {
    if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl.Buffer[method], dangerous.Buffer[method], method)
      t.notEqual(typeof impl.Buffer[method], 'undefined', method)
    })
  })
  t.end()
})

/* Behaviour tests */

test('Methods return Buffers', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0)))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 10)))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 'a')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10)))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10, 'x')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(9, 'ab')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string', 'utf-8')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([0, 42, 3])))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(new Uint8Array([0, 42, 3]))))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([])))
  });
  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {
    t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](0)))
    t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](10)))
  })
  t.end()
})

test('Constructor is buffer.Buffer', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(impl.Buffer.alloc(0).constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(0, 10).constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(0, 'a').constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(10).constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(10, 'x').constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(9, 'ab').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from('').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from('string').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from('string', 'utf-8').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from([0, 42, 3]).constructor, buffer.Buffer)
    t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).constructor, buffer.Buffer)
    t.equal(impl.Buffer.from([]).constructor, buffer.Buffer)
  });
  [0, 10, 100].forEach(function (arg) {
    t.equal(dangerous.Buffer.allocUnsafe(arg).constructor, buffer.Buffer)
    t.equal(dangerous.Buffer.allocUnsafeSlow(arg).constructor, buffer.SlowBuffer(0).constructor)
  })
  t.end()
})

test('Invalid calls throw', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.throws(function () { impl.Buffer.from(0) })
    t.throws(function () { impl.Buffer.from(10) })
    t.throws(function () { impl.Buffer.from(10, 'utf-8') })
    t.throws(function () { impl.Buffer.from('string', 'invalid encoding') })
    t.throws(function () { impl.Buffer.from(-10) })
    t.throws(function () { impl.Buffer.from(1e90) })
    t.throws(function () { impl.Buffer.from(Infinity) })
    t.throws(function () { impl.Buffer.from(-Infinity) })
    t.throws(function () { impl.Buffer.from(NaN) })
    t.throws(function () { impl.Buffer.from(null) })
    t.throws(function () { impl.Buffer.from(undefined) })
    t.throws(function () { impl.Buffer.from() })
    t.throws(function () { impl.Buffer.from({}) })
    t.throws(function () { impl.Buffer.alloc('') })
    t.throws(function () { impl.Buffer.alloc('string') })
    t.throws(function () { impl.Buffer.alloc('string', 'utf-8') })
    t.throws(function () { impl.Buffer.alloc('b25ldHdvdGhyZWU=', 'base64') })
    t.throws(function () { impl.Buffer.alloc(-10) })
    t.throws(function () { impl.Buffer.alloc(1e90) })
    t.throws(function () { impl.Buffer.alloc(2 * (1 << 30)) })
    t.throws(function () { impl.Buffer.alloc(Infinity) })
    t.throws(function () { impl.Buffer.alloc(-Infinity) })
    t.throws(function () { impl.Buffer.alloc(null) })
    t.throws(function () { impl.Buffer.alloc(undefined) })
    t.throws(function () { impl.Buffer.alloc() })
    t.throws(function () { impl.Buffer.alloc([]) })
    t.throws(function () { impl.Buffer.alloc([0, 42, 3]) })
    t.throws(function () { impl.Buffer.alloc({}) })
  });
  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {
    t.throws(function () { dangerous.Buffer[method]('') })
    t.throws(function () { dangerous.Buffer[method]('string') })
    t.throws(function () { dangerous.Buffer[method]('string', 'utf-8') })
    t.throws(function () { dangerous.Buffer[method](2 * (1 << 30)) })
    t.throws(function () { dangerous.Buffer[method](Infinity) })
    if (dangerous.Buffer[method] === buffer.Buffer.allocUnsafe) {
      t.skip('Skipping, older impl of allocUnsafe coerced negative sizes to 0')
    } else {
      t.throws(function () { dangerous.Buffer[method](-10) })
      t.throws(function () { dangerous.Buffer[method](-1e90) })
      t.throws(function () { dangerous.Buffer[method](-Infinity) })
    }
    t.throws(function () { dangerous.Buffer[method](null) })
    t.throws(function () { dangerous.Buffer[method](undefined) })
    t.throws(function () { dangerous.Buffer[method]() })
    t.throws(function () { dangerous.Buffer[method]([]) })
    t.throws(function () { dangerous.Buffer[method]([0, 42, 3]) })
    t.throws(function () { dangerous.Buffer[method]({}) })
  })
  t.end()
})

test('Buffers have appropriate lengths', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(impl.Buffer.alloc(0).length, 0)
    t.equal(impl.Buffer.alloc(10).length, 10)
    t.equal(impl.Buffer.from('').length, 0)
    t.equal(impl.Buffer.from('string').length, 6)
    t.equal(impl.Buffer.from('string', 'utf-8').length, 6)
    t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').length, 11)
    t.equal(impl.Buffer.from([0, 42, 3]).length, 3)
    t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).length, 3)
    t.equal(impl.Buffer.from([]).length, 0)
  });
  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {
    t.equal(dangerous.Buffer[method](0).length, 0)
    t.equal(dangerous.Buffer[method](10).length, 10)
  })
  t.end()
})

test('Buffers have appropriate lengths (2)', function (t) {
  t.equal(index.Buffer.alloc, safer.Buffer.alloc)
  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)
  var ok = true;
  [ safer.Buffer.alloc,
    dangerous.Buffer.allocUnsafe,
    dangerous.Buffer.allocUnsafeSlow
  ].forEach(function (method) {
    for (var i = 0; i < 1e2; i++) {
      var length = Math.round(Math.random() * 1e5)
      var buf = method(length)
      if (!buffer.Buffer.isBuffer(buf)) ok = false
      if (buf.length !== length) ok = false
    }
  })
  t.ok(ok)
  t.end()
})

test('.alloc(size) is zero-filled and has correct length', function (t) {
  t.equal(index.Buffer.alloc, safer.Buffer.alloc)
  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)
  var ok = true
  for (var i = 0; i < 1e2; i++) {
    var length = Math.round(Math.random() * 2e6)
    var buf = index.Buffer.alloc(length)
    if (!buffer.Buffer.isBuffer(buf)) ok = false
    if (buf.length !== length) ok = false
    var j
    for (j = 0; j < length; j++) {
      if (buf[j] !== 0) ok = false
    }
    buf.fill(1)
    for (j = 0; j < length; j++) {
      if (buf[j] !== 1) ok = false
    }
  }
  t.ok(ok)
  t.end()
})

test('.allocUnsafe / .allocUnsafeSlow are fillable and have correct lengths', function (t) {
  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {
    var ok = true
    for (var i = 0; i < 1e2; i++) {
      var length = Math.round(Math.random() * 2e6)
      var buf = dangerous.Buffer[method](length)
      if (!buffer.Buffer.isBuffer(buf)) ok = false
      if (buf.length !== length) ok = false
      buf.fill(0, 0, length)
      var j
      for (j = 0; j < length; j++) {
        if (buf[j] !== 0) ok = false
      }
      buf.fill(1, 0, length)
      for (j = 0; j < length; j++) {
        if (buf[j] !== 1) ok = false
      }
    }
    t.ok(ok, method)
  })
  t.end()
})

test('.alloc(size, fill) is `fill`-filled', function (t) {
  t.equal(index.Buffer.alloc, safer.Buffer.alloc)
  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)
  var ok = true
  for (var i = 0; i < 1e2; i++) {
    var length = Math.round(Math.random() * 2e6)
    var fill = Math.round(Math.random() * 255)
    var buf = index.Buffer.alloc(length, fill)
    if (!buffer.Buffer.isBuffer(buf)) ok = false
    if (buf.length !== length) ok = false
    for (var j = 0; j < length; j++) {
      if (buf[j] !== fill) ok = false
    }
  }
  t.ok(ok)
  t.end()
})

test('.alloc(size, fill) is `fill`-filled', function (t) {
  t.equal(index.Buffer.alloc, safer.Buffer.alloc)
  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)
  var ok = true
  for (var i = 0; i < 1e2; i++) {
    var length = Math.round(Math.random() * 2e6)
    var fill = Math.round(Math.random() * 255)
    var buf = index.Buffer.alloc(length, fill)
    if (!buffer.Buffer.isBuffer(buf)) ok = false
    if (buf.length !== length) ok = false
    for (var j = 0; j < length; j++) {
      if (buf[j] !== fill) ok = false
    }
  }
  t.ok(ok)
  t.deepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 97))
  t.notDeepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 98))

  var tmp = new buffer.Buffer(2)
  tmp.fill('ok')
  if (tmp[1] === tmp[0]) {
    // Outdated Node.js
    t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('ooooo'))
  } else {
    t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('okoko'))
  }
  t.notDeepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('kokok'))

  t.end()
})

test('safer.Buffer.from returns results same as Buffer constructor', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.deepEqual(impl.Buffer.from(''), new buffer.Buffer(''))
    t.deepEqual(impl.Buffer.from('string'), new buffer.Buffer('string'))
    t.deepEqual(impl.Buffer.from('string', 'utf-8'), new buffer.Buffer('string', 'utf-8'))
    t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), new buffer.Buffer('b25ldHdvdGhyZWU=', 'base64'))
    t.deepEqual(impl.Buffer.from([0, 42, 3]), new buffer.Buffer([0, 42, 3]))
    t.deepEqual(impl.Buffer.from(new Uint8Array([0, 42, 3])), new buffer.Buffer(new Uint8Array([0, 42, 3])))
    t.deepEqual(impl.Buffer.from([]), new buffer.Buffer([]))
  })
  t.end()
})

test('safer.Buffer.from returns consistent results', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.deepEqual(impl.Buffer.from(''), impl.Buffer.alloc(0))
    t.deepEqual(impl.Buffer.from([]), impl.Buffer.alloc(0))
    t.deepEqual(impl.Buffer.from(new Uint8Array([])), impl.Buffer.alloc(0))
    t.deepEqual(impl.Buffer.from('string', 'utf-8'), impl.Buffer.from('string'))
    t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from([115, 116, 114, 105, 110, 103]))
    t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from(impl.Buffer.from('string')))
    t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), impl.Buffer.from('onetwothree'))
    t.notDeepEqual(impl.Buffer.from('b25ldHdvdGhyZWU='), impl.Buffer.from('onetwothree'))
  })
  t.end()
})
loopback: airtap.local
browsers:
  - name: chrome
    version: latest
  - name: firefox
    version: latest
  - name: ie
    version: latest
  - name: microsoftedge
    version: latest
  - name: safari
    version: latest
  - name: iphone
    version: latest
  - name: android
    version: latest
[submodule "big-list-of-naughty-strings"]
	path = vendor/big-list-of-naughty-strings
	url = https://github.com/minimaxir/big-list-of-naughty-strings.git
Parsha Pourkhomami <parshap@gmail.com>
Joel Mukuthu <joelmukuthu@gmail.com>
## 1.2.0

Check for reserved Windows filenames (`CON`, `PRN`, `AUX`, `NUL`,
`COM1`, `LPT1`, etc). See [1].

[1] https://github.com/parshap/node-sanitize-filename/issues/9
This project is licensed under the [WTFPL][] and [ISC][] licenses.

[WTFPL]: https://en.wikipedia.org/wiki/WTFPL
[ISC]: https://opensource.org/licenses/ISC

## WTFPL

DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004

Copyright (C) 2004 Sam Hocevar \<sam@hocevar.net>

Everyone is permitted to copy and distribute verbatim or modified copies
of this license document, and changing it is allowed as long as the name
is changed.

DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR
COPYING, DISTRIBUTION AND MODIFICATION

0. You just DO WHAT THE FUCK YOU WANT TO.

## ISC

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
/*jshint node:true*/
'use strict';

/**
 * Replaces characters in strings that are illegal/unsafe for filenames.
 * Unsafe characters are either removed or replaced by a substitute set
 * in the optional `options` object.
 *
 * Illegal Characters on Various Operating Systems
 * / ? < > \ : * | "
 * https://kb.acronis.com/content/39790
 *
 * Unicode Control codes
 * C0 0x00-0x1f & C1 (0x80-0x9f)
 * http://en.wikipedia.org/wiki/C0_and_C1_control_codes
 *
 * Reserved filenames on Unix-based systems (".", "..")
 * Reserved filenames in Windows ("CON", "PRN", "AUX", "NUL", "COM1",
 * "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9",
 * "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", and
 * "LPT9") case-insesitively and with or without filename extensions.
 *
 * Capped at 255 characters in length.
 * http://unix.stackexchange.com/questions/32795/what-is-the-maximum-allowed-filename-and-folder-size-with-ecryptfs
 *
 * @param  {String} input   Original filename
 * @param  {Object} options {replacement: String | Function }
 * @return {String}         Sanitized filename
 */

var truncate = require("truncate-utf8-bytes");

var illegalRe = /[\/\?<>\\:\*\|"]/g;
var controlRe = /[\x00-\x1f\x80-\x9f]/g;
var reservedRe = /^\.+$/;
var windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i;
var windowsTrailingRe = /[\. ]+$/;

function sanitize(input, replacement) {
  if (typeof input !== 'string') {
    throw new Error('Input must be string');
  }
  var sanitized = input
    .replace(illegalRe, replacement)
    .replace(controlRe, replacement)
    .replace(reservedRe, replacement)
    .replace(windowsReservedRe, replacement)
    .replace(windowsTrailingRe, replacement);
  return truncate(sanitized, 255);
}

module.exports = function (input, options) {
  var replacement = (options && options.replacement) || '';
  var output = sanitize(input, replacement);
  if (replacement === '') {
    return output;
  }
  return sanitize(output, '');
};
{
  "author": {
    "name": "Parsha Pourkhomami"
  },
  "dependencies": {
    "truncate-utf8-bytes": "^1.0.0"
  },
  "deprecated": false,
  "description": "Sanitize a string for use as a filename",
  "devDependencies": {
    "airtap": "^2.0.3",
    "browserify": "^14.0.0",
    "concat-stream": "^1.5.1",
    "mktemp": "^0.4.0",
    "tape": "^4.2.2"
  },
  "homepage": "https://github.com/parshap/node-sanitize-filename#readme",
  "license": "WTFPL OR ISC",
  "main": "index.js",
  "name": "sanitize-filename",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/parshap/node-sanitize-filename.git"
  },
  "types": "index.d.ts",
  "version": "1.6.3"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

====

`String.fromCodePoint` by Mathias Bynens used according to terms of MIT
License, as follows:

    Copyright Mathias Bynens <https://mathiasbynens.be/>

    Permission is hereby granted, free of charge, to any person obtaining
    a copy of this software and associated documentation files (the
    "Software"), to deal in the Software without restriction, including
    without limitation the rights to use, copy, modify, merge, publish,
    distribute, sublicense, and/or sell copies of the Software, and to
    permit persons to whom the Software is furnished to do so, subject to
    the following conditions:

    The above copyright notice and this permission notice shall be
    included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta name="generator" content="HTML Tidy for Mac OS X (vers 31 October 2006 - Apple Inc. build 13), see www.w3.org" /><title>W3C Software Notice and License</title><link rel="stylesheet" href="/2008/site/css/minimum" type="text/css" media="handheld, all" /><style type="text/css" media="print, screen and (min-width: 481px)" xml:space="preserve">
     @import url("/2008/site/css/advanced");
</style><link href="/2008/site/css/minimum" rel="stylesheet" type="text/css" media="handheld, only screen and (max-device-width: 480px)" /><meta name="viewport" content="width=device-width" /><link rel="stylesheet" href="/2008/site/css/print" type="text/css" media="print" /><link rel="shortcut icon" href="/2008/site/images/favicon.ico" type="image/x-icon" /></head><body id="www-w3-org" class="w3c_public"><div id="w3c_container">
    
    

         <div id="w3c_mast">
            <h1 class="logo">
               <a tabindex="2" accesskey="1" href="/"><img src="/2008/site/images/logo-w3c-mobile-lg" width="90" height="53" alt="W3C" /></a>
               <span class="alt-logo">W3C</span>
            </h1>

            <div id="w3c_nav">
               
               

               <form action="/Help/search" method="get" enctype="application/x-www-form-urlencoded"><div class="w3c_sec_nav"><!-- --></div><ul class="main_nav"><li class="first-item">
                        <a href="/standards/">Standards</a>
                     </li><li>
                        <a href="/participate/">Participate</a>
                     </li><li>
                        <a href="/Consortium/membership">Membership</a>
                     </li><li class="last-item">
                        <a href="/Consortium/">About W3C</a>
                     </li><li class="search-item">
                        <div id="search-form">
                           <input tabindex="3" class="text" name="q" value="" title="Search" type="text" />
                           <button id="search-submit" name="search-submit" type="submit"><img class="submit" src="/2008/site/images/search-button" alt="Search" width="21" height="17" /></button>
                        </div>
                     </li></ul></form>
            </div>
            
         </div>
         

         <div id="w3c_main">
            <div id="w3c_logo_shadow" class="w3c_leftCol">
               <img height="32" alt="" src="/2008/site/images/logo-shadow" />
            </div>
            
            <div class="w3c_leftCol"><h2 class="offscreen">Site Navigation</h2>
    <h3 class="category"><span class="ribbon"><a href="/Consortium/Legal/ipr-notice.html" title="Up to Policies and Legal Information">Policies and Legal Information <img src="/2008/site/images/header-link" alt="Header link" width="13" height="13" class="header-link" /></a></span></h3>
       <ul class="theme">
        <li><a href="/Consortium/Legal/2008/04-testsuite-copyright.html">Licenses for W3C Test Suites</a></li>
        <li><a href="/2004/10/27-testcases.html">Policies for Contribution of Test Cases to W3C</a></li>
        <li><a href="/Consortium/Legal/IPR-FAQ-20000620.html">Intellectual Rights FAQ</a></li>
        <li><a href="/Consortium/Legal/privacy-statement-20000612.html">W3C Privacy Statements</a></li>
        <li><a href="/Consortium/Legal/2002/copyright-documents-20021231.html">W3C Document License</a></li>
        <li><a href="/Consortium/Legal/2002/trademarks-20021231.html">W3C Trademarks and Generic Terms</a></li>
        <li><a href="/Consortium/Legal/2002/trademark-license-20021231.html">W3C&#xAE; Trademark and Service Mark License</a></li>
        <li><a class="current">W3C Software Notice and License</a></li>
        <li><a href="/Consortium/Legal/2002/collaborators-agreement-20021231.html">W3C Invited Expert and Collaborators Agreement</a></li>
        <li><a href="/Consortium/Persistence.html">W3C URI Persistence Policy</a></li>
        <li><a href="/1999/10/21-mirroring-policy.html">Mirroring the W3C Site</a></li>
        <li><a href="/Consortium/Legal/2006/08-copyright-translations.html">Translations of the Copyright Notice</a></li>
       </ul>
       <br /></div>
            <div class="w3c_mainCol">
               <div id="w3c_crumbs">
       <div id="w3c_crumbs_frame">
        <ul class="bct"> <!-- .bct / Breadcrumbs -->
          <li class="skip"><a tabindex="1" accesskey="2" title="Skip to content (e.g., when browsing via audio)" href="#w3c_content_body">Skip</a></li>
          <li><a href="/">W3C</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
          <li><a href="/Consortium/">About&#xA0;W3C</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
          <li><a href="/Consortium/facts.html">Facts&#xA0;About&#xA0;W3C</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
          <li><a href="/Consortium/Legal/ipr-notice.html">Policies&#xA0;and&#xA0;Legal&#xA0;Information</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
          <li class="current">W3C Software Notice and License</li>
        </ul>            
     </div>
    </div>
               <h1 class="title">W3C Software Notice and License</h1>
               <div id="w3c_content_body">
                  <div class="line">
                     <p class="intro tPadding">This work (and included software, documentation such as READMEs, or other
related items) is being provided by the copyright holders under the following
license.</p>
<h2>License</h2>
                     
                     <p class="tPadding">
By obtaining, using and/or copying this work, you (the licensee)
agree that you have read, understood, and will comply with the following
terms and conditions.</p>

                     <p>Permission to copy, modify, and distribute this software and its
documentation, with or without modification,&#xA0;for any purpose and without
fee or royalty is hereby granted, provided that you include the following on
ALL copies of the software and documentation or portions thereof, including
modifications:</p>

                     <ul class="show_items"><li>The full text of this NOTICE in a location viewable to users of the
    redistributed or derivative work.</li><li>Any pre-existing intellectual property disclaimers, notices, or terms
    and conditions. If none exist, the <a href="copyright-software-short-notice-20021231.html">W3C Software Short
    Notice</a> should be included (hypertext is preferred, text is permitted)
    within the body of any redistributed or derivative code.</li><li>Notice of any changes or modifications to the files, including the date
    changes were made. (We recommend you provide URIs to the location from
    which the code is derived.)</li></ul>

<h2>Disclaimers</h2>

                     <p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE
ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>

                     <p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
DOCUMENTATION.</p>

                     <p>The name and trademarks of copyright holders may NOT be used in
advertising or publicity pertaining to the software without specific, written
prior permission. Title to copyright in this software and any associated
documentation will at all times remain with copyright holders.</p>

                     <h2>Notes</h2>

	                    <p>This version: http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231</p>

                     <p>This formulation of W3C's notice and license became active on December 31
2002. This version removes the copyright ownership notice such that this
license can be used with materials other than those owned by the W3C,
reflects that ERCIM is now a host of the W3C, includes references to this
specific dated version of the license, and removes the ambiguous grant of
"use". Otherwise, this version is the same as the <a href="http://www.w3.org/Consortium/Legal/copyright-software-19980720">previous
version</a> and is written so as to preserve the <a href="http://www.gnu.org/philosophy/license-list.html#GPLCompatibleLicenses">Free
Software Foundation's assessment of GPL compatibility</a> and <a href="http://www.opensource.org/licenses/W3C.php">OSI's certification</a>
under the <a href="http://www.opensource.org/docs/definition.php">Open Source
Definition</a>.</p>
                  </div>
               </div>
            </div>
         </div>
         
         
         
      </div><div id="w3c_footer">
         <div id="w3c_footer-inner">
            <h2 class="offscreen">Footer Navigation</h2>
            <div class="w3c_footer-nav">
               <h3>Navigation</h3>
               <ul class="footer_top_nav"><li>
                     <a href="/">Home</a>
                  </li><li>
                     <a href="/standards/">Standards</a>
                  </li><li>
                     <a href="/participate/">Participate</a>
                  </li><li>
                     <a href="/Consortium/membership">Membership</a>
                  </li><li class="last-item">
                     <a href="/Consortium/">About W3C</a>
                  </li></ul>
            </div>
            <div class="w3c_footer-nav">
               <h3>Contact W3C</h3>
               <ul class="footer_bottom_nav"><li>
                     <a href="/Consortium/contact">Contact</a>
                  </li><li>
                     <a accesskey="0" href="/Help/">Help and FAQ</a>
                  </li><li>
                     <a href="/Consortium/sponsor/">Sponsor / Donate</a>
                  </li><li>
                     <a href="/Consortium/siteindex">Site Map</a>
                  </li><li>
                     <address id="w3c_signature">
                        <a href="http://lists.w3.org/Archives/Public/site-comments/">Feedback</a></address>
                  </li></ul>
            </div>
            <div class="w3c_footer-nav">
               <h3>W3C Updates</h3>
               <ul class="footer_follow_nav"><li>
                     <a href="http://twitter.com/W3C" title="Follow W3C on Twitter">
                        <img src="/2008/site/images/twitter-bird" alt="Twitter" width="78" height="83" class="social-icon" />
                     </a>
                     <a href="http://identi.ca/w3c" title="See W3C on Identica">
                        <img src="/2008/site/images/identica-logo" alt="Identica" width="91" height="83" class="social-icon" />
                     </a>
                  </li></ul>
            </div>
            <p class="copyright">Copyright &#xA9; 2012 W3C <sup>&#xAE;</sup> (<a href="http://www.csail.mit.edu/">
                  <acronym title="Massachusetts Institute of Technology">MIT</acronym>
               </a>, <a href="http://www.ercim.org/">
                  <acronym title="European Research Consortium for Informatics and Mathematics"> ERCIM</acronym>
               </a>, <a href="http://www.keio.ac.jp/">Keio</a>) <a href="/Consortium/Legal/ipr-notice">Usage policies apply</a>.</p>
         </div>
      </div><!-- Generated from data/scripts.php, ../../smarty/{scripts.tpl} --><!-- At the bottom for performance reasons --><div id="w3c_scripts">
         <script type="text/javascript" src="/2008/site/js/main" xml:space="preserve"><!-- --></script>
      </div></body></html>
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "deprecated": false,
  "description": "An evented streaming XML parser in JavaScript",
  "devDependencies": {
    "standard": "^5.3.1",
    "tap": "^2.1.1"
  },
  "files": [
    "lib/sax.js",
    "LICENSE",
    "LICENSE-W3C.html",
    "README.md"
  ],
  "homepage": "https://github.com/isaacs/sax-js#readme",
  "license": "ISC",
  "main": "lib/sax.js",
  "name": "sax",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/sax-js.git"
  },
  "version": "1.1.4"
};(function (sax) { // wrapper for non-node envs
  sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
  sax.SAXParser = SAXParser
  sax.SAXStream = SAXStream
  sax.createStream = createStream

  // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
  // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
  // since that's the earliest that a buffer overrun could occur.  This way, checks are
  // as rare as required, but as often as necessary to ensure never crossing this bound.
  // Furthermore, buffers are only tested at most once per write(), so passing a very
  // large string into write() might have undesirable effects, but this is manageable by
  // the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme
  // edge case, result in creating at most one complete copy of the string passed in.
  // Set to Infinity to have unlimited buffers.
  sax.MAX_BUFFER_LENGTH = 64 * 1024

  var buffers = [
    'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',
    'procInstName', 'procInstBody', 'entity', 'attribName',
    'attribValue', 'cdata', 'script'
  ]

  sax.EVENTS = [
    'text',
    'processinginstruction',
    'sgmldeclaration',
    'doctype',
    'comment',
    'attribute',
    'opentag',
    'closetag',
    'opencdata',
    'cdata',
    'closecdata',
    'error',
    'end',
    'ready',
    'script',
    'opennamespace',
    'closenamespace'
  ]

  function SAXParser (strict, opt) {
    if (!(this instanceof SAXParser)) {
      return new SAXParser(strict, opt)
    }

    var parser = this
    clearBuffers(parser)
    parser.q = parser.c = ''
    parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
    parser.opt = opt || {}
    parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
    parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'
    parser.tags = []
    parser.closed = parser.closedRoot = parser.sawRoot = false
    parser.tag = parser.error = null
    parser.strict = !!strict
    parser.noscript = !!(strict || parser.opt.noscript)
    parser.state = S.BEGIN
    parser.strictEntities = parser.opt.strictEntities
    parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)
    parser.attribList = []

    // namespaces form a prototype chain.
    // it always points at the current tag,
    // which protos to its parent tag.
    if (parser.opt.xmlns) {
      parser.ns = Object.create(rootNS)
    }

    // mostly just for error reporting
    parser.trackPosition = parser.opt.position !== false
    if (parser.trackPosition) {
      parser.position = parser.line = parser.column = 0
    }
    emit(parser, 'onready')
  }

  if (!Object.create) {
    Object.create = function (o) {
      function F () {}
      F.prototype = o
      var newf = new F()
      return newf
    }
  }

  if (!Object.keys) {
    Object.keys = function (o) {
      var a = []
      for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
      return a
    }
  }

  function checkBufferLength (parser) {
    var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
    var maxActual = 0
    for (var i = 0, l = buffers.length; i < l; i++) {
      var len = parser[buffers[i]].length
      if (len > maxAllowed) {
        // Text/cdata nodes can get big, and since they're buffered,
        // we can get here under normal conditions.
        // Avoid issues by emitting the text node now,
        // so at least it won't get any bigger.
        switch (buffers[i]) {
          case 'textNode':
            closeText(parser)
            break

          case 'cdata':
            emitNode(parser, 'oncdata', parser.cdata)
            parser.cdata = ''
            break

          case 'script':
            emitNode(parser, 'onscript', parser.script)
            parser.script = ''
            break

          default:
            error(parser, 'Max buffer length exceeded: ' + buffers[i])
        }
      }
      maxActual = Math.max(maxActual, len)
    }
    // schedule the next check for the earliest possible buffer overrun.
    var m = sax.MAX_BUFFER_LENGTH - maxActual
    parser.bufferCheckPosition = m + parser.position
  }

  function clearBuffers (parser) {
    for (var i = 0, l = buffers.length; i < l; i++) {
      parser[buffers[i]] = ''
    }
  }

  function flushBuffers (parser) {
    closeText(parser)
    if (parser.cdata !== '') {
      emitNode(parser, 'oncdata', parser.cdata)
      parser.cdata = ''
    }
    if (parser.script !== '') {
      emitNode(parser, 'onscript', parser.script)
      parser.script = ''
    }
  }

  SAXParser.prototype = {
    end: function () { end(this) },
    write: write,
    resume: function () { this.error = null; return this },
    close: function () { return this.write(null) },
    flush: function () { flushBuffers(this) }
  }

  var Stream
  try {
    Stream = require('stream').Stream
  } catch (ex) {
    Stream = function () {}
  }

  var streamWraps = sax.EVENTS.filter(function (ev) {
    return ev !== 'error' && ev !== 'end'
  })

  function createStream (strict, opt) {
    return new SAXStream(strict, opt)
  }

  function SAXStream (strict, opt) {
    if (!(this instanceof SAXStream)) {
      return new SAXStream(strict, opt)
    }

    Stream.apply(this)

    this._parser = new SAXParser(strict, opt)
    this.writable = true
    this.readable = true

    var me = this

    this._parser.onend = function () {
      me.emit('end')
    }

    this._parser.onerror = function (er) {
      me.emit('error', er)

      // if didn't throw, then means error was handled.
      // go ahead and clear error, so we can write again.
      me._parser.error = null
    }

    this._decoder = null

    streamWraps.forEach(function (ev) {
      Object.defineProperty(me, 'on' + ev, {
        get: function () {
          return me._parser['on' + ev]
        },
        set: function (h) {
          if (!h) {
            me.removeAllListeners(ev)
            me._parser['on' + ev] = h
            return h
          }
          me.on(ev, h)
        },
        enumerable: true,
        configurable: false
      })
    })
  }

  SAXStream.prototype = Object.create(Stream.prototype, {
    constructor: {
      value: SAXStream
    }
  })

  SAXStream.prototype.write = function (data) {
    if (typeof Buffer === 'function' &&
      typeof Buffer.isBuffer === 'function' &&
      Buffer.isBuffer(data)) {
      if (!this._decoder) {
        var SD = require('string_decoder').StringDecoder
        this._decoder = new SD('utf8')
      }
      data = this._decoder.write(data)
    }

    this._parser.write(data.toString())
    this.emit('data', data)
    return true
  }

  SAXStream.prototype.end = function (chunk) {
    if (chunk && chunk.length) {
      this.write(chunk)
    }
    this._parser.end()
    return true
  }

  SAXStream.prototype.on = function (ev, handler) {
    var me = this
    if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {
      me._parser['on' + ev] = function () {
        var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)
        args.splice(0, 0, ev)
        me.emit.apply(me, args)
      }
    }

    return Stream.prototype.on.call(me, ev, handler)
  }

  // character classes and tokens
  var whitespace = '\r\n\t '

  // this really needs to be replaced with character classes.
  // XML allows all manner of ridiculous numbers and digits.
  var number = '0124356789'
  var letter = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

  // (Letter | "_" | ":")
  var quote = '\'"'
  var attribEnd = whitespace + '>'
  var CDATA = '[CDATA['
  var DOCTYPE = 'DOCTYPE'
  var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'
  var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'
  var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }

  // turn all the string character sets into character class objects.
  whitespace = charClass(whitespace)
  number = charClass(number)
  letter = charClass(letter)

  // http://www.w3.org/TR/REC-xml/#NT-NameStartChar
  // This implementation works on strings, a single character at a time
  // as such, it cannot ever support astral-plane characters (10000-EFFFF)
  // without a significant breaking change to either this  parser, or the
  // JavaScript language.  Implementation of an emoji-capable xml parser
  // is left as an exercise for the reader.
  var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/

  var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/

  var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
  var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/

  quote = charClass(quote)
  attribEnd = charClass(attribEnd)

  function charClass (str) {
    return str.split('').reduce(function (s, c) {
      s[c] = true
      return s
    }, {})
  }

  function isRegExp (c) {
    return Object.prototype.toString.call(c) === '[object RegExp]'
  }

  function is (charclass, c) {
    return isRegExp(charclass) ? !!c.match(charclass) : charclass[c]
  }

  function not (charclass, c) {
    return !is(charclass, c)
  }

  var S = 0
  sax.STATE = {
    BEGIN: S++, // leading byte order mark or whitespace
    BEGIN_WHITESPACE: S++, // leading whitespace
    TEXT: S++, // general stuff
    TEXT_ENTITY: S++, // &amp and such.
    OPEN_WAKA: S++, // <
    SGML_DECL: S++, // <!BLARG
    SGML_DECL_QUOTED: S++, // <!BLARG foo "bar
    DOCTYPE: S++, // <!DOCTYPE
    DOCTYPE_QUOTED: S++, // <!DOCTYPE "//blah
    DOCTYPE_DTD: S++, // <!DOCTYPE "//blah" [ ...
    DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE "//blah" [ "foo
    COMMENT_STARTING: S++, // <!-
    COMMENT: S++, // <!--
    COMMENT_ENDING: S++, // <!-- blah -
    COMMENT_ENDED: S++, // <!-- blah --
    CDATA: S++, // <![CDATA[ something
    CDATA_ENDING: S++, // ]
    CDATA_ENDING_2: S++, // ]]
    PROC_INST: S++, // <?hi
    PROC_INST_BODY: S++, // <?hi there
    PROC_INST_ENDING: S++, // <?hi "there" ?
    OPEN_TAG: S++, // <strong
    OPEN_TAG_SLASH: S++, // <strong /
    ATTRIB: S++, // <a
    ATTRIB_NAME: S++, // <a foo
    ATTRIB_NAME_SAW_WHITE: S++, // <a foo _
    ATTRIB_VALUE: S++, // <a foo=
    ATTRIB_VALUE_QUOTED: S++, // <a foo="bar
    ATTRIB_VALUE_CLOSED: S++, // <a foo="bar"
    ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar
    ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar="&quot;"
    ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot
    CLOSE_TAG: S++, // </a
    CLOSE_TAG_SAW_WHITE: S++, // </a   >
    SCRIPT: S++, // <script> ...
    SCRIPT_ENDING: S++ // <script> ... <
  }

  sax.XML_ENTITIES = {
    'amp': '&',
    'gt': '>',
    'lt': '<',
    'quot': '"',
    'apos': "'"
  }

  sax.ENTITIES = {
    'amp': '&',
    'gt': '>',
    'lt': '<',
    'quot': '"',
    'apos': "'",
    'AElig': 198,
    'Aacute': 193,
    'Acirc': 194,
    'Agrave': 192,
    'Aring': 197,
    'Atilde': 195,
    'Auml': 196,
    'Ccedil': 199,
    'ETH': 208,
    'Eacute': 201,
    'Ecirc': 202,
    'Egrave': 200,
    'Euml': 203,
    'Iacute': 205,
    'Icirc': 206,
    'Igrave': 204,
    'Iuml': 207,
    'Ntilde': 209,
    'Oacute': 211,
    'Ocirc': 212,
    'Ograve': 210,
    'Oslash': 216,
    'Otilde': 213,
    'Ouml': 214,
    'THORN': 222,
    'Uacute': 218,
    'Ucirc': 219,
    'Ugrave': 217,
    'Uuml': 220,
    'Yacute': 221,
    'aacute': 225,
    'acirc': 226,
    'aelig': 230,
    'agrave': 224,
    'aring': 229,
    'atilde': 227,
    'auml': 228,
    'ccedil': 231,
    'eacute': 233,
    'ecirc': 234,
    'egrave': 232,
    'eth': 240,
    'euml': 235,
    'iacute': 237,
    'icirc': 238,
    'igrave': 236,
    'iuml': 239,
    'ntilde': 241,
    'oacute': 243,
    'ocirc': 244,
    'ograve': 242,
    'oslash': 248,
    'otilde': 245,
    'ouml': 246,
    'szlig': 223,
    'thorn': 254,
    'uacute': 250,
    'ucirc': 251,
    'ugrave': 249,
    'uuml': 252,
    'yacute': 253,
    'yuml': 255,
    'copy': 169,
    'reg': 174,
    'nbsp': 160,
    'iexcl': 161,
    'cent': 162,
    'pound': 163,
    'curren': 164,
    'yen': 165,
    'brvbar': 166,
    'sect': 167,
    'uml': 168,
    'ordf': 170,
    'laquo': 171,
    'not': 172,
    'shy': 173,
    'macr': 175,
    'deg': 176,
    'plusmn': 177,
    'sup1': 185,
    'sup2': 178,
    'sup3': 179,
    'acute': 180,
    'micro': 181,
    'para': 182,
    'middot': 183,
    'cedil': 184,
    'ordm': 186,
    'raquo': 187,
    'frac14': 188,
    'frac12': 189,
    'frac34': 190,
    'iquest': 191,
    'times': 215,
    'divide': 247,
    'OElig': 338,
    'oelig': 339,
    'Scaron': 352,
    'scaron': 353,
    'Yuml': 376,
    'fnof': 402,
    'circ': 710,
    'tilde': 732,
    'Alpha': 913,
    'Beta': 914,
    'Gamma': 915,
    'Delta': 916,
    'Epsilon': 917,
    'Zeta': 918,
    'Eta': 919,
    'Theta': 920,
    'Iota': 921,
    'Kappa': 922,
    'Lambda': 923,
    'Mu': 924,
    'Nu': 925,
    'Xi': 926,
    'Omicron': 927,
    'Pi': 928,
    'Rho': 929,
    'Sigma': 931,
    'Tau': 932,
    'Upsilon': 933,
    'Phi': 934,
    'Chi': 935,
    'Psi': 936,
    'Omega': 937,
    'alpha': 945,
    'beta': 946,
    'gamma': 947,
    'delta': 948,
    'epsilon': 949,
    'zeta': 950,
    'eta': 951,
    'theta': 952,
    'iota': 953,
    'kappa': 954,
    'lambda': 955,
    'mu': 956,
    'nu': 957,
    'xi': 958,
    'omicron': 959,
    'pi': 960,
    'rho': 961,
    'sigmaf': 962,
    'sigma': 963,
    'tau': 964,
    'upsilon': 965,
    'phi': 966,
    'chi': 967,
    'psi': 968,
    'omega': 969,
    'thetasym': 977,
    'upsih': 978,
    'piv': 982,
    'ensp': 8194,
    'emsp': 8195,
    'thinsp': 8201,
    'zwnj': 8204,
    'zwj': 8205,
    'lrm': 8206,
    'rlm': 8207,
    'ndash': 8211,
    'mdash': 8212,
    'lsquo': 8216,
    'rsquo': 8217,
    'sbquo': 8218,
    'ldquo': 8220,
    'rdquo': 8221,
    'bdquo': 8222,
    'dagger': 8224,
    'Dagger': 8225,
    'bull': 8226,
    'hellip': 8230,
    'permil': 8240,
    'prime': 8242,
    'Prime': 8243,
    'lsaquo': 8249,
    'rsaquo': 8250,
    'oline': 8254,
    'frasl': 8260,
    'euro': 8364,
    'image': 8465,
    'weierp': 8472,
    'real': 8476,
    'trade': 8482,
    'alefsym': 8501,
    'larr': 8592,
    'uarr': 8593,
    'rarr': 8594,
    'darr': 8595,
    'harr': 8596,
    'crarr': 8629,
    'lArr': 8656,
    'uArr': 8657,
    'rArr': 8658,
    'dArr': 8659,
    'hArr': 8660,
    'forall': 8704,
    'part': 8706,
    'exist': 8707,
    'empty': 8709,
    'nabla': 8711,
    'isin': 8712,
    'notin': 8713,
    'ni': 8715,
    'prod': 8719,
    'sum': 8721,
    'minus': 8722,
    'lowast': 8727,
    'radic': 8730,
    'prop': 8733,
    'infin': 8734,
    'ang': 8736,
    'and': 8743,
    'or': 8744,
    'cap': 8745,
    'cup': 8746,
    'int': 8747,
    'there4': 8756,
    'sim': 8764,
    'cong': 8773,
    'asymp': 8776,
    'ne': 8800,
    'equiv': 8801,
    'le': 8804,
    'ge': 8805,
    'sub': 8834,
    'sup': 8835,
    'nsub': 8836,
    'sube': 8838,
    'supe': 8839,
    'oplus': 8853,
    'otimes': 8855,
    'perp': 8869,
    'sdot': 8901,
    'lceil': 8968,
    'rceil': 8969,
    'lfloor': 8970,
    'rfloor': 8971,
    'lang': 9001,
    'rang': 9002,
    'loz': 9674,
    'spades': 9824,
    'clubs': 9827,
    'hearts': 9829,
    'diams': 9830
  }

  Object.keys(sax.ENTITIES).forEach(function (key) {
    var e = sax.ENTITIES[key]
    var s = typeof e === 'number' ? String.fromCharCode(e) : e
    sax.ENTITIES[key] = s
  })

  for (var s in sax.STATE) {
    sax.STATE[sax.STATE[s]] = s
  }

  // shorthand
  S = sax.STATE

  function emit (parser, event, data) {
    parser[event] && parser[event](data)
  }

  function emitNode (parser, nodeType, data) {
    if (parser.textNode) closeText(parser)
    emit(parser, nodeType, data)
  }

  function closeText (parser) {
    parser.textNode = textopts(parser.opt, parser.textNode)
    if (parser.textNode) emit(parser, 'ontext', parser.textNode)
    parser.textNode = ''
  }

  function textopts (opt, text) {
    if (opt.trim) text = text.trim()
    if (opt.normalize) text = text.replace(/\s+/g, ' ')
    return text
  }

  function error (parser, er) {
    closeText(parser)
    if (parser.trackPosition) {
      er += '\nLine: ' + parser.line +
        '\nColumn: ' + parser.column +
        '\nChar: ' + parser.c
    }
    er = new Error(er)
    parser.error = er
    emit(parser, 'onerror', er)
    return parser
  }

  function end (parser) {
    if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')
    if ((parser.state !== S.BEGIN) &&
      (parser.state !== S.BEGIN_WHITESPACE) &&
      (parser.state !== S.TEXT)) {
      error(parser, 'Unexpected end')
    }
    closeText(parser)
    parser.c = ''
    parser.closed = true
    emit(parser, 'onend')
    SAXParser.call(parser, parser.strict, parser.opt)
    return parser
  }

  function strictFail (parser, message) {
    if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {
      throw new Error('bad call to strictFail')
    }
    if (parser.strict) {
      error(parser, message)
    }
  }

  function newTag (parser) {
    if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()
    var parent = parser.tags[parser.tags.length - 1] || parser
    var tag = parser.tag = { name: parser.tagName, attributes: {} }

    // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
    if (parser.opt.xmlns) {
      tag.ns = parent.ns
    }
    parser.attribList.length = 0
  }

  function qname (name, attribute) {
    var i = name.indexOf(':')
    var qualName = i < 0 ? [ '', name ] : name.split(':')
    var prefix = qualName[0]
    var local = qualName[1]

    // <x "xmlns"="http://foo">
    if (attribute && name === 'xmlns') {
      prefix = 'xmlns'
      local = ''
    }

    return { prefix: prefix, local: local }
  }

  function attrib (parser) {
    if (!parser.strict) {
      parser.attribName = parser.attribName[parser.looseCase]()
    }

    if (parser.attribList.indexOf(parser.attribName) !== -1 ||
      parser.tag.attributes.hasOwnProperty(parser.attribName)) {
      parser.attribName = parser.attribValue = ''
      return
    }

    if (parser.opt.xmlns) {
      var qn = qname(parser.attribName, true)
      var prefix = qn.prefix
      var local = qn.local

      if (prefix === 'xmlns') {
        // namespace binding attribute. push the binding into scope
        if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {
          strictFail(parser,
            'xml: prefix must be bound to ' + XML_NAMESPACE + '\n' +
            'Actual: ' + parser.attribValue)
        } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {
          strictFail(parser,
            'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\n' +
            'Actual: ' + parser.attribValue)
        } else {
          var tag = parser.tag
          var parent = parser.tags[parser.tags.length - 1] || parser
          if (tag.ns === parent.ns) {
            tag.ns = Object.create(parent.ns)
          }
          tag.ns[local] = parser.attribValue
        }
      }

      // defer onattribute events until all attributes have been seen
      // so any new bindings can take effect. preserve attribute order
      // so deferred events can be emitted in document order
      parser.attribList.push([parser.attribName, parser.attribValue])
    } else {
      // in non-xmlns mode, we can emit the event right away
      parser.tag.attributes[parser.attribName] = parser.attribValue
      emitNode(parser, 'onattribute', {
        name: parser.attribName,
        value: parser.attribValue
      })
    }

    parser.attribName = parser.attribValue = ''
  }

  function openTag (parser, selfClosing) {
    if (parser.opt.xmlns) {
      // emit namespace binding events
      var tag = parser.tag

      // add namespace info to tag
      var qn = qname(parser.tagName)
      tag.prefix = qn.prefix
      tag.local = qn.local
      tag.uri = tag.ns[qn.prefix] || ''

      if (tag.prefix && !tag.uri) {
        strictFail(parser, 'Unbound namespace prefix: ' +
          JSON.stringify(parser.tagName))
        tag.uri = qn.prefix
      }

      var parent = parser.tags[parser.tags.length - 1] || parser
      if (tag.ns && parent.ns !== tag.ns) {
        Object.keys(tag.ns).forEach(function (p) {
          emitNode(parser, 'onopennamespace', {
            prefix: p,
            uri: tag.ns[p]
          })
        })
      }

      // handle deferred onattribute events
      // Note: do not apply default ns to attributes:
      //   http://www.w3.org/TR/REC-xml-names/#defaulting
      for (var i = 0, l = parser.attribList.length; i < l; i++) {
        var nv = parser.attribList[i]
        var name = nv[0]
        var value = nv[1]
        var qualName = qname(name, true)
        var prefix = qualName.prefix
        var local = qualName.local
        var uri = prefix === '' ? '' : (tag.ns[prefix] || '')
        var a = {
          name: name,
          value: value,
          prefix: prefix,
          local: local,
          uri: uri
        }

        // if there's any attributes with an undefined namespace,
        // then fail on them now.
        if (prefix && prefix !== 'xmlns' && !uri) {
          strictFail(parser, 'Unbound namespace prefix: ' +
            JSON.stringify(prefix))
          a.uri = prefix
        }
        parser.tag.attributes[name] = a
        emitNode(parser, 'onattribute', a)
      }
      parser.attribList.length = 0
    }

    parser.tag.isSelfClosing = !!selfClosing

    // process the tag
    parser.sawRoot = true
    parser.tags.push(parser.tag)
    emitNode(parser, 'onopentag', parser.tag)
    if (!selfClosing) {
      // special case for <script> in non-strict mode.
      if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {
        parser.state = S.SCRIPT
      } else {
        parser.state = S.TEXT
      }
      parser.tag = null
      parser.tagName = ''
    }
    parser.attribName = parser.attribValue = ''
    parser.attribList.length = 0
  }

  function closeTag (parser) {
    if (!parser.tagName) {
      strictFail(parser, 'Weird empty close tag.')
      parser.textNode += '</>'
      parser.state = S.TEXT
      return
    }

    if (parser.script) {
      if (parser.tagName !== 'script') {
        parser.script += '</' + parser.tagName + '>'
        parser.tagName = ''
        parser.state = S.SCRIPT
        return
      }
      emitNode(parser, 'onscript', parser.script)
      parser.script = ''
    }

    // first make sure that the closing tag actually exists.
    // <a><b></c></b></a> will close everything, otherwise.
    var t = parser.tags.length
    var tagName = parser.tagName
    if (!parser.strict) {
      tagName = tagName[parser.looseCase]()
    }
    var closeTo = tagName
    while (t--) {
      var close = parser.tags[t]
      if (close.name !== closeTo) {
        // fail the first time in strict mode
        strictFail(parser, 'Unexpected close tag')
      } else {
        break
      }
    }

    // didn't find it.  we already failed for strict, so just abort.
    if (t < 0) {
      strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)
      parser.textNode += '</' + parser.tagName + '>'
      parser.state = S.TEXT
      return
    }
    parser.tagName = tagName
    var s = parser.tags.length
    while (s-- > t) {
      var tag = parser.tag = parser.tags.pop()
      parser.tagName = parser.tag.name
      emitNode(parser, 'onclosetag', parser.tagName)

      var x = {}
      for (var i in tag.ns) {
        x[i] = tag.ns[i]
      }

      var parent = parser.tags[parser.tags.length - 1] || parser
      if (parser.opt.xmlns && tag.ns !== parent.ns) {
        // remove namespace bindings introduced by tag
        Object.keys(tag.ns).forEach(function (p) {
          var n = tag.ns[p]
          emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })
        })
      }
    }
    if (t === 0) parser.closedRoot = true
    parser.tagName = parser.attribValue = parser.attribName = ''
    parser.attribList.length = 0
    parser.state = S.TEXT
  }

  function parseEntity (parser) {
    var entity = parser.entity
    var entityLC = entity.toLowerCase()
    var num
    var numStr = ''

    if (parser.ENTITIES[entity]) {
      return parser.ENTITIES[entity]
    }
    if (parser.ENTITIES[entityLC]) {
      return parser.ENTITIES[entityLC]
    }
    entity = entityLC
    if (entity.charAt(0) === '#') {
      if (entity.charAt(1) === 'x') {
        entity = entity.slice(2)
        num = parseInt(entity, 16)
        numStr = num.toString(16)
      } else {
        entity = entity.slice(1)
        num = parseInt(entity, 10)
        numStr = num.toString(10)
      }
    }
    entity = entity.replace(/^0+/, '')
    if (numStr.toLowerCase() !== entity) {
      strictFail(parser, 'Invalid character entity')
      return '&' + parser.entity + ';'
    }

    return String.fromCodePoint(num)
  }

  function beginWhiteSpace (parser, c) {
    if (c === '<') {
      parser.state = S.OPEN_WAKA
      parser.startTagPosition = parser.position
    } else if (not(whitespace, c)) {
      // have to process this as a text node.
      // weird, but happens.
      strictFail(parser, 'Non-whitespace before first tag.')
      parser.textNode = c
      parser.state = S.TEXT
    }
  }

  function write (chunk) {
    var parser = this
    if (this.error) {
      throw this.error
    }
    if (parser.closed) {
      return error(parser,
        'Cannot write after close. Assign an onready handler.')
    }
    if (chunk === null) {
      return end(parser)
    }
    var i = 0
    var c = ''
    while (true) {
      c = chunk.charAt(i++)
      parser.c = c
      if (!c) {
        break
      }
      if (parser.trackPosition) {
        parser.position++
        if (c === '\n') {
          parser.line++
          parser.column = 0
        } else {
          parser.column++
        }
      }
      switch (parser.state) {
        case S.BEGIN:
          parser.state = S.BEGIN_WHITESPACE
          if (c === '\uFEFF') {
            continue
          }
          beginWhiteSpace(parser, c)
          continue

        case S.BEGIN_WHITESPACE:
          beginWhiteSpace(parser, c)
          continue

        case S.TEXT:
          if (parser.sawRoot && !parser.closedRoot) {
            var starti = i - 1
            while (c && c !== '<' && c !== '&') {
              c = chunk.charAt(i++)
              if (c && parser.trackPosition) {
                parser.position++
                if (c === '\n') {
                  parser.line++
                  parser.column = 0
                } else {
                  parser.column++
                }
              }
            }
            parser.textNode += chunk.substring(starti, i - 1)
          }
          if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {
            parser.state = S.OPEN_WAKA
            parser.startTagPosition = parser.position
          } else {
            if (not(whitespace, c) && (!parser.sawRoot || parser.closedRoot)) {
              strictFail(parser, 'Text data outside of root node.')
            }
            if (c === '&') {
              parser.state = S.TEXT_ENTITY
            } else {
              parser.textNode += c
            }
          }
          continue

        case S.SCRIPT:
          // only non-strict
          if (c === '<') {
            parser.state = S.SCRIPT_ENDING
          } else {
            parser.script += c
          }
          continue

        case S.SCRIPT_ENDING:
          if (c === '/') {
            parser.state = S.CLOSE_TAG
          } else {
            parser.script += '<' + c
            parser.state = S.SCRIPT
          }
          continue

        case S.OPEN_WAKA:
          // either a /, ?, !, or text is coming next.
          if (c === '!') {
            parser.state = S.SGML_DECL
            parser.sgmlDecl = ''
          } else if (is(whitespace, c)) {
            // wait for it...
          } else if (is(nameStart, c)) {
            parser.state = S.OPEN_TAG
            parser.tagName = c
          } else if (c === '/') {
            parser.state = S.CLOSE_TAG
            parser.tagName = ''
          } else if (c === '?') {
            parser.state = S.PROC_INST
            parser.procInstName = parser.procInstBody = ''
          } else {
            strictFail(parser, 'Unencoded <')
            // if there was some whitespace, then add that in.
            if (parser.startTagPosition + 1 < parser.position) {
              var pad = parser.position - parser.startTagPosition
              c = new Array(pad).join(' ') + c
            }
            parser.textNode += '<' + c
            parser.state = S.TEXT
          }
          continue

        case S.SGML_DECL:
          if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {
            emitNode(parser, 'onopencdata')
            parser.state = S.CDATA
            parser.sgmlDecl = ''
            parser.cdata = ''
          } else if (parser.sgmlDecl + c === '--') {
            parser.state = S.COMMENT
            parser.comment = ''
            parser.sgmlDecl = ''
          } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {
            parser.state = S.DOCTYPE
            if (parser.doctype || parser.sawRoot) {
              strictFail(parser,
                'Inappropriately located doctype declaration')
            }
            parser.doctype = ''
            parser.sgmlDecl = ''
          } else if (c === '>') {
            emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)
            parser.sgmlDecl = ''
            parser.state = S.TEXT
          } else if (is(quote, c)) {
            parser.state = S.SGML_DECL_QUOTED
            parser.sgmlDecl += c
          } else {
            parser.sgmlDecl += c
          }
          continue

        case S.SGML_DECL_QUOTED:
          if (c === parser.q) {
            parser.state = S.SGML_DECL
            parser.q = ''
          }
          parser.sgmlDecl += c
          continue

        case S.DOCTYPE:
          if (c === '>') {
            parser.state = S.TEXT
            emitNode(parser, 'ondoctype', parser.doctype)
            parser.doctype = true // just remember that we saw it.
          } else {
            parser.doctype += c
            if (c === '[') {
              parser.state = S.DOCTYPE_DTD
            } else if (is(quote, c)) {
              parser.state = S.DOCTYPE_QUOTED
              parser.q = c
            }
          }
          continue

        case S.DOCTYPE_QUOTED:
          parser.doctype += c
          if (c === parser.q) {
            parser.q = ''
            parser.state = S.DOCTYPE
          }
          continue

        case S.DOCTYPE_DTD:
          parser.doctype += c
          if (c === ']') {
            parser.state = S.DOCTYPE
          } else if (is(quote, c)) {
            parser.state = S.DOCTYPE_DTD_QUOTED
            parser.q = c
          }
          continue

        case S.DOCTYPE_DTD_QUOTED:
          parser.doctype += c
          if (c === parser.q) {
            parser.state = S.DOCTYPE_DTD
            parser.q = ''
          }
          continue

        case S.COMMENT:
          if (c === '-') {
            parser.state = S.COMMENT_ENDING
          } else {
            parser.comment += c
          }
          continue

        case S.COMMENT_ENDING:
          if (c === '-') {
            parser.state = S.COMMENT_ENDED
            parser.comment = textopts(parser.opt, parser.comment)
            if (parser.comment) {
              emitNode(parser, 'oncomment', parser.comment)
            }
            parser.comment = ''
          } else {
            parser.comment += '-' + c
            parser.state = S.COMMENT
          }
          continue

        case S.COMMENT_ENDED:
          if (c !== '>') {
            strictFail(parser, 'Malformed comment')
            // allow <!-- blah -- bloo --> in non-strict mode,
            // which is a comment of " blah -- bloo "
            parser.comment += '--' + c
            parser.state = S.COMMENT
          } else {
            parser.state = S.TEXT
          }
          continue

        case S.CDATA:
          if (c === ']') {
            parser.state = S.CDATA_ENDING
          } else {
            parser.cdata += c
          }
          continue

        case S.CDATA_ENDING:
          if (c === ']') {
            parser.state = S.CDATA_ENDING_2
          } else {
            parser.cdata += ']' + c
            parser.state = S.CDATA
          }
          continue

        case S.CDATA_ENDING_2:
          if (c === '>') {
            if (parser.cdata) {
              emitNode(parser, 'oncdata', parser.cdata)
            }
            emitNode(parser, 'onclosecdata')
            parser.cdata = ''
            parser.state = S.TEXT
          } else if (c === ']') {
            parser.cdata += ']'
          } else {
            parser.cdata += ']]' + c
            parser.state = S.CDATA
          }
          continue

        case S.PROC_INST:
          if (c === '?') {
            parser.state = S.PROC_INST_ENDING
          } else if (is(whitespace, c)) {
            parser.state = S.PROC_INST_BODY
          } else {
            parser.procInstName += c
          }
          continue

        case S.PROC_INST_BODY:
          if (!parser.procInstBody && is(whitespace, c)) {
            continue
          } else if (c === '?') {
            parser.state = S.PROC_INST_ENDING
          } else {
            parser.procInstBody += c
          }
          continue

        case S.PROC_INST_ENDING:
          if (c === '>') {
            emitNode(parser, 'onprocessinginstruction', {
              name: parser.procInstName,
              body: parser.procInstBody
            })
            parser.procInstName = parser.procInstBody = ''
            parser.state = S.TEXT
          } else {
            parser.procInstBody += '?' + c
            parser.state = S.PROC_INST_BODY
          }
          continue

        case S.OPEN_TAG:
          if (is(nameBody, c)) {
            parser.tagName += c
          } else {
            newTag(parser)
            if (c === '>') {
              openTag(parser)
            } else if (c === '/') {
              parser.state = S.OPEN_TAG_SLASH
            } else {
              if (not(whitespace, c)) {
                strictFail(parser, 'Invalid character in tag name')
              }
              parser.state = S.ATTRIB
            }
          }
          continue

        case S.OPEN_TAG_SLASH:
          if (c === '>') {
            openTag(parser, true)
            closeTag(parser)
          } else {
            strictFail(parser, 'Forward-slash in opening tag not followed by >')
            parser.state = S.ATTRIB
          }
          continue

        case S.ATTRIB:
          // haven't read the attribute name yet.
          if (is(whitespace, c)) {
            continue
          } else if (c === '>') {
            openTag(parser)
          } else if (c === '/') {
            parser.state = S.OPEN_TAG_SLASH
          } else if (is(nameStart, c)) {
            parser.attribName = c
            parser.attribValue = ''
            parser.state = S.ATTRIB_NAME
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_NAME:
          if (c === '=') {
            parser.state = S.ATTRIB_VALUE
          } else if (c === '>') {
            strictFail(parser, 'Attribute without value')
            parser.attribValue = parser.attribName
            attrib(parser)
            openTag(parser)
          } else if (is(whitespace, c)) {
            parser.state = S.ATTRIB_NAME_SAW_WHITE
          } else if (is(nameBody, c)) {
            parser.attribName += c
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_NAME_SAW_WHITE:
          if (c === '=') {
            parser.state = S.ATTRIB_VALUE
          } else if (is(whitespace, c)) {
            continue
          } else {
            strictFail(parser, 'Attribute without value')
            parser.tag.attributes[parser.attribName] = ''
            parser.attribValue = ''
            emitNode(parser, 'onattribute', {
              name: parser.attribName,
              value: ''
            })
            parser.attribName = ''
            if (c === '>') {
              openTag(parser)
            } else if (is(nameStart, c)) {
              parser.attribName = c
              parser.state = S.ATTRIB_NAME
            } else {
              strictFail(parser, 'Invalid attribute name')
              parser.state = S.ATTRIB
            }
          }
          continue

        case S.ATTRIB_VALUE:
          if (is(whitespace, c)) {
            continue
          } else if (is(quote, c)) {
            parser.q = c
            parser.state = S.ATTRIB_VALUE_QUOTED
          } else {
            strictFail(parser, 'Unquoted attribute value')
            parser.state = S.ATTRIB_VALUE_UNQUOTED
            parser.attribValue = c
          }
          continue

        case S.ATTRIB_VALUE_QUOTED:
          if (c !== parser.q) {
            if (c === '&') {
              parser.state = S.ATTRIB_VALUE_ENTITY_Q
            } else {
              parser.attribValue += c
            }
            continue
          }
          attrib(parser)
          parser.q = ''
          parser.state = S.ATTRIB_VALUE_CLOSED
          continue

        case S.ATTRIB_VALUE_CLOSED:
          if (is(whitespace, c)) {
            parser.state = S.ATTRIB
          } else if (c === '>') {
            openTag(parser)
          } else if (c === '/') {
            parser.state = S.OPEN_TAG_SLASH
          } else if (is(nameStart, c)) {
            strictFail(parser, 'No whitespace between attributes')
            parser.attribName = c
            parser.attribValue = ''
            parser.state = S.ATTRIB_NAME
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_VALUE_UNQUOTED:
          if (not(attribEnd, c)) {
            if (c === '&') {
              parser.state = S.ATTRIB_VALUE_ENTITY_U
            } else {
              parser.attribValue += c
            }
            continue
          }
          attrib(parser)
          if (c === '>') {
            openTag(parser)
          } else {
            parser.state = S.ATTRIB
          }
          continue

        case S.CLOSE_TAG:
          if (!parser.tagName) {
            if (is(whitespace, c)) {
              continue
            } else if (not(nameStart, c)) {
              if (parser.script) {
                parser.script += '</' + c
                parser.state = S.SCRIPT
              } else {
                strictFail(parser, 'Invalid tagname in closing tag.')
              }
            } else {
              parser.tagName = c
            }
          } else if (c === '>') {
            closeTag(parser)
          } else if (is(nameBody, c)) {
            parser.tagName += c
          } else if (parser.script) {
            parser.script += '</' + parser.tagName
            parser.tagName = ''
            parser.state = S.SCRIPT
          } else {
            if (not(whitespace, c)) {
              strictFail(parser, 'Invalid tagname in closing tag')
            }
            parser.state = S.CLOSE_TAG_SAW_WHITE
          }
          continue

        case S.CLOSE_TAG_SAW_WHITE:
          if (is(whitespace, c)) {
            continue
          }
          if (c === '>') {
            closeTag(parser)
          } else {
            strictFail(parser, 'Invalid characters in closing tag')
          }
          continue

        case S.TEXT_ENTITY:
        case S.ATTRIB_VALUE_ENTITY_Q:
        case S.ATTRIB_VALUE_ENTITY_U:
          var returnState
          var buffer
          switch (parser.state) {
            case S.TEXT_ENTITY:
              returnState = S.TEXT
              buffer = 'textNode'
              break

            case S.ATTRIB_VALUE_ENTITY_Q:
              returnState = S.ATTRIB_VALUE_QUOTED
              buffer = 'attribValue'
              break

            case S.ATTRIB_VALUE_ENTITY_U:
              returnState = S.ATTRIB_VALUE_UNQUOTED
              buffer = 'attribValue'
              break
          }

          if (c === ';') {
            parser[buffer] += parseEntity(parser)
            parser.entity = ''
            parser.state = returnState
          } else if (is(parser.entity.length ? entityBody : entityStart, c)) {
            parser.entity += c
          } else {
            strictFail(parser, 'Invalid character in entity name')
            parser[buffer] += '&' + parser.entity + c
            parser.entity = ''
            parser.state = returnState
          }

          continue

        default:
          throw new Error(parser, 'Unknown state: ' + parser.state)
      }
    } // while

    if (parser.position >= parser.bufferCheckPosition) {
      checkBufferLength(parser)
    }
    return parser
  }

  /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
  if (!String.fromCodePoint) {
    (function () {
      var stringFromCharCode = String.fromCharCode
      var floor = Math.floor
      var fromCodePoint = function () {
        var MAX_SIZE = 0x4000
        var codeUnits = []
        var highSurrogate
        var lowSurrogate
        var index = -1
        var length = arguments.length
        if (!length) {
          return ''
        }
        var result = ''
        while (++index < length) {
          var codePoint = Number(arguments[index])
          if (
            !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`
            codePoint < 0 || // not a valid Unicode code point
            codePoint > 0x10FFFF || // not a valid Unicode code point
            floor(codePoint) !== codePoint // not an integer
          ) {
            throw RangeError('Invalid code point: ' + codePoint)
          }
          if (codePoint <= 0xFFFF) { // BMP code point
            codeUnits.push(codePoint)
          } else { // Astral code point; split in surrogate halves
            // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
            codePoint -= 0x10000
            highSurrogate = (codePoint >> 10) + 0xD800
            lowSurrogate = (codePoint % 0x400) + 0xDC00
            codeUnits.push(highSurrogate, lowSurrogate)
          }
          if (index + 1 === length || codeUnits.length > MAX_SIZE) {
            result += stringFromCharCode.apply(null, codeUnits)
            codeUnits.length = 0
          }
        }
        return result
      }
      if (Object.defineProperty) {
        Object.defineProperty(String, 'fromCodePoint', {
          value: fromCodePoint,
          configurable: true,
          writable: true
        })
      } else {
        String.fromCodePoint = fromCodePoint
      }
    }())
  }
})(typeof exports === 'undefined' ? this.sax = {} : exports)
The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
{
  "bin": {
    "semver": "./bin/semver"
  },
  "deprecated": false,
  "description": "The semantic version parser used by npm.",
  "devDependencies": {
    "tap": "^13.0.0-rc.18"
  },
  "files": [
    "bin",
    "range.bnf",
    "semver.js"
  ],
  "homepage": "https://github.com/npm/node-semver#readme",
  "license": "ISC",
  "main": "semver.js",
  "name": "semver",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/node-semver.git"
  },
  "tap": {
    "check-coverage": true
  },
  "version": "5.7.1"
}range-set  ::= range ( logical-or range ) *
logical-or ::= ( ' ' ) * '||' ( ' ' ) *
range      ::= hyphen | simple ( ' ' simple ) * | ''
hyphen     ::= partial ' - ' partial
simple     ::= primitive | partial | tilde | caret
primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
xr         ::= 'x' | 'X' | '*' | nr
nr         ::= '0' | [1-9] ( [0-9] ) *
tilde      ::= '~' partial
caret      ::= '^' partial
qualifier  ::= ( '-' pre )? ( '+' build )?
pre        ::= parts
build      ::= parts
parts      ::= part ( '.' part ) *
part       ::= nr | [-0-9A-Za-z]+
exports = module.exports = SemVer

var debug
/* istanbul ignore next */
if (typeof process === 'object' &&
    process.env &&
    process.env.NODE_DEBUG &&
    /\bsemver\b/i.test(process.env.NODE_DEBUG)) {
  debug = function () {
    var args = Array.prototype.slice.call(arguments, 0)
    args.unshift('SEMVER')
    console.log.apply(console, args)
  }
} else {
  debug = function () {}
}

// Note: this is the semver.org version of the spec that it implements
// Not necessarily the package version of this code.
exports.SEMVER_SPEC_VERSION = '2.0.0'

var MAX_LENGTH = 256
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
  /* istanbul ignore next */ 9007199254740991

// Max safe segment length for coercion.
var MAX_SAFE_COMPONENT_LENGTH = 16

// The actual regexps go on exports.re
var re = exports.re = []
var src = exports.src = []
var R = 0

// The following Regular Expressions can be used for tokenizing,
// validating, and parsing SemVer version strings.

// ## Numeric Identifier
// A single `0`, or a non-zero digit followed by zero or more digits.

var NUMERICIDENTIFIER = R++
src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'
var NUMERICIDENTIFIERLOOSE = R++
src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'

// ## Non-numeric Identifier
// Zero or more digits, followed by a letter or hyphen, and then zero or
// more letters, digits, or hyphens.

var NONNUMERICIDENTIFIER = R++
src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'

// ## Main Version
// Three dot-separated numeric identifiers.

var MAINVERSION = R++
src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[NUMERICIDENTIFIER] + ')'

var MAINVERSIONLOOSE = R++
src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')'

// ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier.

var PRERELEASEIDENTIFIER = R++
src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
                            '|' + src[NONNUMERICIDENTIFIER] + ')'

var PRERELEASEIDENTIFIERLOOSE = R++
src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
                                 '|' + src[NONNUMERICIDENTIFIER] + ')'

// ## Pre-release Version
// Hyphen, followed by one or more dot-separated pre-release version
// identifiers.

var PRERELEASE = R++
src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
                  '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'

var PRERELEASELOOSE = R++
src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
                       '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'

// ## Build Metadata Identifier
// Any combination of digits, letters, or hyphens.

var BUILDIDENTIFIER = R++
src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'

// ## Build Metadata
// Plus sign, followed by one or more period-separated build metadata
// identifiers.

var BUILD = R++
src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
             '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'

// ## Full Version String
// A main version, followed optionally by a pre-release version and
// build metadata.

// Note that the only major, minor, patch, and pre-release sections of
// the version string are capturing groups.  The build metadata is not a
// capturing group, because it should not ever be used in version
// comparison.

var FULL = R++
var FULLPLAIN = 'v?' + src[MAINVERSION] +
                src[PRERELEASE] + '?' +
                src[BUILD] + '?'

src[FULL] = '^' + FULLPLAIN + '$'

// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
// common in the npm registry.
var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
                 src[PRERELEASELOOSE] + '?' +
                 src[BUILD] + '?'

var LOOSE = R++
src[LOOSE] = '^' + LOOSEPLAIN + '$'

var GTLT = R++
src[GTLT] = '((?:<|>)?=?)'

// Something like "2.*" or "1.2.x".
// Note that "x.x" is a valid xRange identifer, meaning "any version"
// Only the first item is strictly required.
var XRANGEIDENTIFIERLOOSE = R++
src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'
var XRANGEIDENTIFIER = R++
src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'

var XRANGEPLAIN = R++
src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
                   '(?:' + src[PRERELEASE] + ')?' +
                   src[BUILD] + '?' +
                   ')?)?'

var XRANGEPLAINLOOSE = R++
src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:' + src[PRERELEASELOOSE] + ')?' +
                        src[BUILD] + '?' +
                        ')?)?'

var XRANGE = R++
src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'
var XRANGELOOSE = R++
src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'

// Coercion.
// Extract anything that could conceivably be a part of a valid semver
var COERCE = R++
src[COERCE] = '(?:^|[^\\d])' +
              '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:$|[^\\d])'

// Tilde ranges.
// Meaning is "reasonably at or greater than"
var LONETILDE = R++
src[LONETILDE] = '(?:~>?)'

var TILDETRIM = R++
src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'
re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g')
var tildeTrimReplace = '$1~'

var TILDE = R++
src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'
var TILDELOOSE = R++
src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'

// Caret ranges.
// Meaning is "at least and backwards compatible with"
var LONECARET = R++
src[LONECARET] = '(?:\\^)'

var CARETTRIM = R++
src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'
re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g')
var caretTrimReplace = '$1^'

var CARET = R++
src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'
var CARETLOOSE = R++
src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'

// A simple gt/lt/eq thing, or just "" to indicate "any version"
var COMPARATORLOOSE = R++
src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'
var COMPARATOR = R++
src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'

// An expression to strip any whitespace between the gtlt and the thing
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
var COMPARATORTRIM = R++
src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
                      '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'

// this one has to use the /g flag
re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g')
var comparatorTrimReplace = '$1$2$3'

// Something like `1.2.3 - 1.2.4`
// Note that these all use the loose form, because they'll be
// checked against either the strict or loose comparator form
// later.
var HYPHENRANGE = R++
src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
                   '\\s+-\\s+' +
                   '(' + src[XRANGEPLAIN] + ')' +
                   '\\s*$'

var HYPHENRANGELOOSE = R++
src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
                        '\\s+-\\s+' +
                        '(' + src[XRANGEPLAINLOOSE] + ')' +
                        '\\s*$'

// Star ranges basically just allow anything at all.
var STAR = R++
src[STAR] = '(<|>)?=?\\s*\\*'

// Compile to actual regexp objects.
// All are flag-free, unless they were created above with a flag.
for (var i = 0; i < R; i++) {
  debug(i, src[i])
  if (!re[i]) {
    re[i] = new RegExp(src[i])
  }
}

exports.parse = parse
function parse (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (version instanceof SemVer) {
    return version
  }

  if (typeof version !== 'string') {
    return null
  }

  if (version.length > MAX_LENGTH) {
    return null
  }

  var r = options.loose ? re[LOOSE] : re[FULL]
  if (!r.test(version)) {
    return null
  }

  try {
    return new SemVer(version, options)
  } catch (er) {
    return null
  }
}

exports.valid = valid
function valid (version, options) {
  var v = parse(version, options)
  return v ? v.version : null
}

exports.clean = clean
function clean (version, options) {
  var s = parse(version.trim().replace(/^[=v]+/, ''), options)
  return s ? s.version : null
}

exports.SemVer = SemVer

function SemVer (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }
  if (version instanceof SemVer) {
    if (version.loose === options.loose) {
      return version
    } else {
      version = version.version
    }
  } else if (typeof version !== 'string') {
    throw new TypeError('Invalid Version: ' + version)
  }

  if (version.length > MAX_LENGTH) {
    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
  }

  if (!(this instanceof SemVer)) {
    return new SemVer(version, options)
  }

  debug('SemVer', version, options)
  this.options = options
  this.loose = !!options.loose

  var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL])

  if (!m) {
    throw new TypeError('Invalid Version: ' + version)
  }

  this.raw = version

  // these are actually numbers
  this.major = +m[1]
  this.minor = +m[2]
  this.patch = +m[3]

  if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
    throw new TypeError('Invalid major version')
  }

  if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
    throw new TypeError('Invalid minor version')
  }

  if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
    throw new TypeError('Invalid patch version')
  }

  // numberify any prerelease numeric ids
  if (!m[4]) {
    this.prerelease = []
  } else {
    this.prerelease = m[4].split('.').map(function (id) {
      if (/^[0-9]+$/.test(id)) {
        var num = +id
        if (num >= 0 && num < MAX_SAFE_INTEGER) {
          return num
        }
      }
      return id
    })
  }

  this.build = m[5] ? m[5].split('.') : []
  this.format()
}

SemVer.prototype.format = function () {
  this.version = this.major + '.' + this.minor + '.' + this.patch
  if (this.prerelease.length) {
    this.version += '-' + this.prerelease.join('.')
  }
  return this.version
}

SemVer.prototype.toString = function () {
  return this.version
}

SemVer.prototype.compare = function (other) {
  debug('SemVer.compare', this.version, this.options, other)
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  return this.compareMain(other) || this.comparePre(other)
}

SemVer.prototype.compareMain = function (other) {
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  return compareIdentifiers(this.major, other.major) ||
         compareIdentifiers(this.minor, other.minor) ||
         compareIdentifiers(this.patch, other.patch)
}

SemVer.prototype.comparePre = function (other) {
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  // NOT having a prerelease is > having one
  if (this.prerelease.length && !other.prerelease.length) {
    return -1
  } else if (!this.prerelease.length && other.prerelease.length) {
    return 1
  } else if (!this.prerelease.length && !other.prerelease.length) {
    return 0
  }

  var i = 0
  do {
    var a = this.prerelease[i]
    var b = other.prerelease[i]
    debug('prerelease compare', i, a, b)
    if (a === undefined && b === undefined) {
      return 0
    } else if (b === undefined) {
      return 1
    } else if (a === undefined) {
      return -1
    } else if (a === b) {
      continue
    } else {
      return compareIdentifiers(a, b)
    }
  } while (++i)
}

// preminor will bump the version up to the next minor release, and immediately
// down to pre-release. premajor and prepatch work the same way.
SemVer.prototype.inc = function (release, identifier) {
  switch (release) {
    case 'premajor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor = 0
      this.major++
      this.inc('pre', identifier)
      break
    case 'preminor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor++
      this.inc('pre', identifier)
      break
    case 'prepatch':
      // If this is already a prerelease, it will bump to the next version
      // drop any prereleases that might already exist, since they are not
      // relevant at this point.
      this.prerelease.length = 0
      this.inc('patch', identifier)
      this.inc('pre', identifier)
      break
    // If the input is a non-prerelease version, this acts the same as
    // prepatch.
    case 'prerelease':
      if (this.prerelease.length === 0) {
        this.inc('patch', identifier)
      }
      this.inc('pre', identifier)
      break

    case 'major':
      // If this is a pre-major version, bump up to the same major version.
      // Otherwise increment major.
      // 1.0.0-5 bumps to 1.0.0
      // 1.1.0 bumps to 2.0.0
      if (this.minor !== 0 ||
          this.patch !== 0 ||
          this.prerelease.length === 0) {
        this.major++
      }
      this.minor = 0
      this.patch = 0
      this.prerelease = []
      break
    case 'minor':
      // If this is a pre-minor version, bump up to the same minor version.
      // Otherwise increment minor.
      // 1.2.0-5 bumps to 1.2.0
      // 1.2.1 bumps to 1.3.0
      if (this.patch !== 0 || this.prerelease.length === 0) {
        this.minor++
      }
      this.patch = 0
      this.prerelease = []
      break
    case 'patch':
      // If this is not a pre-release version, it will increment the patch.
      // If it is a pre-release it will bump up to the same patch version.
      // 1.2.0-5 patches to 1.2.0
      // 1.2.0 patches to 1.2.1
      if (this.prerelease.length === 0) {
        this.patch++
      }
      this.prerelease = []
      break
    // This probably shouldn't be used publicly.
    // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
    case 'pre':
      if (this.prerelease.length === 0) {
        this.prerelease = [0]
      } else {
        var i = this.prerelease.length
        while (--i >= 0) {
          if (typeof this.prerelease[i] === 'number') {
            this.prerelease[i]++
            i = -2
          }
        }
        if (i === -1) {
          // didn't increment anything
          this.prerelease.push(0)
        }
      }
      if (identifier) {
        // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
        // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
        if (this.prerelease[0] === identifier) {
          if (isNaN(this.prerelease[1])) {
            this.prerelease = [identifier, 0]
          }
        } else {
          this.prerelease = [identifier, 0]
        }
      }
      break

    default:
      throw new Error('invalid increment argument: ' + release)
  }
  this.format()
  this.raw = this.version
  return this
}

exports.inc = inc
function inc (version, release, loose, identifier) {
  if (typeof (loose) === 'string') {
    identifier = loose
    loose = undefined
  }

  try {
    return new SemVer(version, loose).inc(release, identifier).version
  } catch (er) {
    return null
  }
}

exports.diff = diff
function diff (version1, version2) {
  if (eq(version1, version2)) {
    return null
  } else {
    var v1 = parse(version1)
    var v2 = parse(version2)
    var prefix = ''
    if (v1.prerelease.length || v2.prerelease.length) {
      prefix = 'pre'
      var defaultResult = 'prerelease'
    }
    for (var key in v1) {
      if (key === 'major' || key === 'minor' || key === 'patch') {
        if (v1[key] !== v2[key]) {
          return prefix + key
        }
      }
    }
    return defaultResult // may be undefined
  }
}

exports.compareIdentifiers = compareIdentifiers

var numeric = /^[0-9]+$/
function compareIdentifiers (a, b) {
  var anum = numeric.test(a)
  var bnum = numeric.test(b)

  if (anum && bnum) {
    a = +a
    b = +b
  }

  return a === b ? 0
    : (anum && !bnum) ? -1
    : (bnum && !anum) ? 1
    : a < b ? -1
    : 1
}

exports.rcompareIdentifiers = rcompareIdentifiers
function rcompareIdentifiers (a, b) {
  return compareIdentifiers(b, a)
}

exports.major = major
function major (a, loose) {
  return new SemVer(a, loose).major
}

exports.minor = minor
function minor (a, loose) {
  return new SemVer(a, loose).minor
}

exports.patch = patch
function patch (a, loose) {
  return new SemVer(a, loose).patch
}

exports.compare = compare
function compare (a, b, loose) {
  return new SemVer(a, loose).compare(new SemVer(b, loose))
}

exports.compareLoose = compareLoose
function compareLoose (a, b) {
  return compare(a, b, true)
}

exports.rcompare = rcompare
function rcompare (a, b, loose) {
  return compare(b, a, loose)
}

exports.sort = sort
function sort (list, loose) {
  return list.sort(function (a, b) {
    return exports.compare(a, b, loose)
  })
}

exports.rsort = rsort
function rsort (list, loose) {
  return list.sort(function (a, b) {
    return exports.rcompare(a, b, loose)
  })
}

exports.gt = gt
function gt (a, b, loose) {
  return compare(a, b, loose) > 0
}

exports.lt = lt
function lt (a, b, loose) {
  return compare(a, b, loose) < 0
}

exports.eq = eq
function eq (a, b, loose) {
  return compare(a, b, loose) === 0
}

exports.neq = neq
function neq (a, b, loose) {
  return compare(a, b, loose) !== 0
}

exports.gte = gte
function gte (a, b, loose) {
  return compare(a, b, loose) >= 0
}

exports.lte = lte
function lte (a, b, loose) {
  return compare(a, b, loose) <= 0
}

exports.cmp = cmp
function cmp (a, op, b, loose) {
  switch (op) {
    case '===':
      if (typeof a === 'object')
        a = a.version
      if (typeof b === 'object')
        b = b.version
      return a === b

    case '!==':
      if (typeof a === 'object')
        a = a.version
      if (typeof b === 'object')
        b = b.version
      return a !== b

    case '':
    case '=':
    case '==':
      return eq(a, b, loose)

    case '!=':
      return neq(a, b, loose)

    case '>':
      return gt(a, b, loose)

    case '>=':
      return gte(a, b, loose)

    case '<':
      return lt(a, b, loose)

    case '<=':
      return lte(a, b, loose)

    default:
      throw new TypeError('Invalid operator: ' + op)
  }
}

exports.Comparator = Comparator
function Comparator (comp, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (comp instanceof Comparator) {
    if (comp.loose === !!options.loose) {
      return comp
    } else {
      comp = comp.value
    }
  }

  if (!(this instanceof Comparator)) {
    return new Comparator(comp, options)
  }

  debug('comparator', comp, options)
  this.options = options
  this.loose = !!options.loose
  this.parse(comp)

  if (this.semver === ANY) {
    this.value = ''
  } else {
    this.value = this.operator + this.semver.version
  }

  debug('comp', this)
}

var ANY = {}
Comparator.prototype.parse = function (comp) {
  var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]
  var m = comp.match(r)

  if (!m) {
    throw new TypeError('Invalid comparator: ' + comp)
  }

  this.operator = m[1]
  if (this.operator === '=') {
    this.operator = ''
  }

  // if it literally is just '>' or '' then allow anything.
  if (!m[2]) {
    this.semver = ANY
  } else {
    this.semver = new SemVer(m[2], this.options.loose)
  }
}

Comparator.prototype.toString = function () {
  return this.value
}

Comparator.prototype.test = function (version) {
  debug('Comparator.test', version, this.options.loose)

  if (this.semver === ANY) {
    return true
  }

  if (typeof version === 'string') {
    version = new SemVer(version, this.options)
  }

  return cmp(version, this.operator, this.semver, this.options)
}

Comparator.prototype.intersects = function (comp, options) {
  if (!(comp instanceof Comparator)) {
    throw new TypeError('a Comparator is required')
  }

  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  var rangeTmp

  if (this.operator === '') {
    rangeTmp = new Range(comp.value, options)
    return satisfies(this.value, rangeTmp, options)
  } else if (comp.operator === '') {
    rangeTmp = new Range(this.value, options)
    return satisfies(comp.semver, rangeTmp, options)
  }

  var sameDirectionIncreasing =
    (this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '>=' || comp.operator === '>')
  var sameDirectionDecreasing =
    (this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '<=' || comp.operator === '<')
  var sameSemVer = this.semver.version === comp.semver.version
  var differentDirectionsInclusive =
    (this.operator === '>=' || this.operator === '<=') &&
    (comp.operator === '>=' || comp.operator === '<=')
  var oppositeDirectionsLessThan =
    cmp(this.semver, '<', comp.semver, options) &&
    ((this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '<=' || comp.operator === '<'))
  var oppositeDirectionsGreaterThan =
    cmp(this.semver, '>', comp.semver, options) &&
    ((this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '>=' || comp.operator === '>'))

  return sameDirectionIncreasing || sameDirectionDecreasing ||
    (sameSemVer && differentDirectionsInclusive) ||
    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan
}

exports.Range = Range
function Range (range, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (range instanceof Range) {
    if (range.loose === !!options.loose &&
        range.includePrerelease === !!options.includePrerelease) {
      return range
    } else {
      return new Range(range.raw, options)
    }
  }

  if (range instanceof Comparator) {
    return new Range(range.value, options)
  }

  if (!(this instanceof Range)) {
    return new Range(range, options)
  }

  this.options = options
  this.loose = !!options.loose
  this.includePrerelease = !!options.includePrerelease

  // First, split based on boolean or ||
  this.raw = range
  this.set = range.split(/\s*\|\|\s*/).map(function (range) {
    return this.parseRange(range.trim())
  }, this).filter(function (c) {
    // throw out any that are not relevant for whatever reason
    return c.length
  })

  if (!this.set.length) {
    throw new TypeError('Invalid SemVer Range: ' + range)
  }

  this.format()
}

Range.prototype.format = function () {
  this.range = this.set.map(function (comps) {
    return comps.join(' ').trim()
  }).join('||').trim()
  return this.range
}

Range.prototype.toString = function () {
  return this.range
}

Range.prototype.parseRange = function (range) {
  var loose = this.options.loose
  range = range.trim()
  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
  var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]
  range = range.replace(hr, hyphenReplace)
  debug('hyphen replace', range)
  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
  range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace)
  debug('comparator trim', range, re[COMPARATORTRIM])

  // `~ 1.2.3` => `~1.2.3`
  range = range.replace(re[TILDETRIM], tildeTrimReplace)

  // `^ 1.2.3` => `^1.2.3`
  range = range.replace(re[CARETTRIM], caretTrimReplace)

  // normalize spaces
  range = range.split(/\s+/).join(' ')

  // At this point, the range is completely trimmed and
  // ready to be split into comparators.

  var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]
  var set = range.split(' ').map(function (comp) {
    return parseComparator(comp, this.options)
  }, this).join(' ').split(/\s+/)
  if (this.options.loose) {
    // in loose mode, throw out any that are not valid comparators
    set = set.filter(function (comp) {
      return !!comp.match(compRe)
    })
  }
  set = set.map(function (comp) {
    return new Comparator(comp, this.options)
  }, this)

  return set
}

Range.prototype.intersects = function (range, options) {
  if (!(range instanceof Range)) {
    throw new TypeError('a Range is required')
  }

  return this.set.some(function (thisComparators) {
    return thisComparators.every(function (thisComparator) {
      return range.set.some(function (rangeComparators) {
        return rangeComparators.every(function (rangeComparator) {
          return thisComparator.intersects(rangeComparator, options)
        })
      })
    })
  })
}

// Mostly just for testing and legacy API reasons
exports.toComparators = toComparators
function toComparators (range, options) {
  return new Range(range, options).set.map(function (comp) {
    return comp.map(function (c) {
      return c.value
    }).join(' ').trim().split(' ')
  })
}

// comprised of xranges, tildes, stars, and gtlt's at this point.
// already replaced the hyphen ranges
// turn into a set of JUST comparators.
function parseComparator (comp, options) {
  debug('comp', comp, options)
  comp = replaceCarets(comp, options)
  debug('caret', comp)
  comp = replaceTildes(comp, options)
  debug('tildes', comp)
  comp = replaceXRanges(comp, options)
  debug('xrange', comp)
  comp = replaceStars(comp, options)
  debug('stars', comp)
  return comp
}

function isX (id) {
  return !id || id.toLowerCase() === 'x' || id === '*'
}

// ~, ~> --> * (any, kinda silly)
// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
function replaceTildes (comp, options) {
  return comp.trim().split(/\s+/).map(function (comp) {
    return replaceTilde(comp, options)
  }).join(' ')
}

function replaceTilde (comp, options) {
  var r = options.loose ? re[TILDELOOSE] : re[TILDE]
  return comp.replace(r, function (_, M, m, p, pr) {
    debug('tilde', comp, _, M, m, p, pr)
    var ret

    if (isX(M)) {
      ret = ''
    } else if (isX(m)) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
    } else if (isX(p)) {
      // ~1.2 == >=1.2.0 <1.3.0
      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
    } else if (pr) {
      debug('replaceTilde pr', pr)
      ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
            ' <' + M + '.' + (+m + 1) + '.0'
    } else {
      // ~1.2.3 == >=1.2.3 <1.3.0
      ret = '>=' + M + '.' + m + '.' + p +
            ' <' + M + '.' + (+m + 1) + '.0'
    }

    debug('tilde return', ret)
    return ret
  })
}

// ^ --> * (any, kinda silly)
// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
// ^1.2.3 --> >=1.2.3 <2.0.0
// ^1.2.0 --> >=1.2.0 <2.0.0
function replaceCarets (comp, options) {
  return comp.trim().split(/\s+/).map(function (comp) {
    return replaceCaret(comp, options)
  }).join(' ')
}

function replaceCaret (comp, options) {
  debug('caret', comp, options)
  var r = options.loose ? re[CARETLOOSE] : re[CARET]
  return comp.replace(r, function (_, M, m, p, pr) {
    debug('caret', comp, _, M, m, p, pr)
    var ret

    if (isX(M)) {
      ret = ''
    } else if (isX(m)) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
    } else if (isX(p)) {
      if (M === '0') {
        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
      } else {
        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'
      }
    } else if (pr) {
      debug('replaceCaret pr', pr)
      if (M === '0') {
        if (m === '0') {
          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
                ' <' + M + '.' + m + '.' + (+p + 1)
        } else {
          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
                ' <' + M + '.' + (+m + 1) + '.0'
        }
      } else {
        ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
              ' <' + (+M + 1) + '.0.0'
      }
    } else {
      debug('no pr')
      if (M === '0') {
        if (m === '0') {
          ret = '>=' + M + '.' + m + '.' + p +
                ' <' + M + '.' + m + '.' + (+p + 1)
        } else {
          ret = '>=' + M + '.' + m + '.' + p +
                ' <' + M + '.' + (+m + 1) + '.0'
        }
      } else {
        ret = '>=' + M + '.' + m + '.' + p +
              ' <' + (+M + 1) + '.0.0'
      }
    }

    debug('caret return', ret)
    return ret
  })
}

function replaceXRanges (comp, options) {
  debug('replaceXRanges', comp, options)
  return comp.split(/\s+/).map(function (comp) {
    return replaceXRange(comp, options)
  }).join(' ')
}

function replaceXRange (comp, options) {
  comp = comp.trim()
  var r = options.loose ? re[XRANGELOOSE] : re[XRANGE]
  return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
    debug('xRange', comp, ret, gtlt, M, m, p, pr)
    var xM = isX(M)
    var xm = xM || isX(m)
    var xp = xm || isX(p)
    var anyX = xp

    if (gtlt === '=' && anyX) {
      gtlt = ''
    }

    if (xM) {
      if (gtlt === '>' || gtlt === '<') {
        // nothing is allowed
        ret = '<0.0.0'
      } else {
        // nothing is forbidden
        ret = '*'
      }
    } else if (gtlt && anyX) {
      // we know patch is an x, because we have any x at all.
      // replace X with 0
      if (xm) {
        m = 0
      }
      p = 0

      if (gtlt === '>') {
        // >1 => >=2.0.0
        // >1.2 => >=1.3.0
        // >1.2.3 => >= 1.2.4
        gtlt = '>='
        if (xm) {
          M = +M + 1
          m = 0
          p = 0
        } else {
          m = +m + 1
          p = 0
        }
      } else if (gtlt === '<=') {
        // <=0.7.x is actually <0.8.0, since any 0.7.x should
        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
        gtlt = '<'
        if (xm) {
          M = +M + 1
        } else {
          m = +m + 1
        }
      }

      ret = gtlt + M + '.' + m + '.' + p
    } else if (xm) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
    } else if (xp) {
      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
    }

    debug('xRange return', ret)

    return ret
  })
}

// Because * is AND-ed with everything else in the comparator,
// and '' means "any version", just remove the *s entirely.
function replaceStars (comp, options) {
  debug('replaceStars', comp, options)
  // Looseness is ignored here.  star is always as loose as it gets!
  return comp.trim().replace(re[STAR], '')
}

// This function is passed to string.replace(re[HYPHENRANGE])
// M, m, patch, prerelease, build
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
// 1.2 - 3.4 => >=1.2.0 <3.5.0
function hyphenReplace ($0,
  from, fM, fm, fp, fpr, fb,
  to, tM, tm, tp, tpr, tb) {
  if (isX(fM)) {
    from = ''
  } else if (isX(fm)) {
    from = '>=' + fM + '.0.0'
  } else if (isX(fp)) {
    from = '>=' + fM + '.' + fm + '.0'
  } else {
    from = '>=' + from
  }

  if (isX(tM)) {
    to = ''
  } else if (isX(tm)) {
    to = '<' + (+tM + 1) + '.0.0'
  } else if (isX(tp)) {
    to = '<' + tM + '.' + (+tm + 1) + '.0'
  } else if (tpr) {
    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr
  } else {
    to = '<=' + to
  }

  return (from + ' ' + to).trim()
}

// if ANY of the sets match ALL of its comparators, then pass
Range.prototype.test = function (version) {
  if (!version) {
    return false
  }

  if (typeof version === 'string') {
    version = new SemVer(version, this.options)
  }

  for (var i = 0; i < this.set.length; i++) {
    if (testSet(this.set[i], version, this.options)) {
      return true
    }
  }
  return false
}

function testSet (set, version, options) {
  for (var i = 0; i < set.length; i++) {
    if (!set[i].test(version)) {
      return false
    }
  }

  if (version.prerelease.length && !options.includePrerelease) {
    // Find the set of versions that are allowed to have prereleases
    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
    // That should allow `1.2.3-pr.2` to pass.
    // However, `1.2.4-alpha.notready` should NOT be allowed,
    // even though it's within the range set by the comparators.
    for (i = 0; i < set.length; i++) {
      debug(set[i].semver)
      if (set[i].semver === ANY) {
        continue
      }

      if (set[i].semver.prerelease.length > 0) {
        var allowed = set[i].semver
        if (allowed.major === version.major &&
            allowed.minor === version.minor &&
            allowed.patch === version.patch) {
          return true
        }
      }
    }

    // Version has a -pre, but it's not one of the ones we like.
    return false
  }

  return true
}

exports.satisfies = satisfies
function satisfies (version, range, options) {
  try {
    range = new Range(range, options)
  } catch (er) {
    return false
  }
  return range.test(version)
}

exports.maxSatisfying = maxSatisfying
function maxSatisfying (versions, range, options) {
  var max = null
  var maxSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (v) {
    if (rangeObj.test(v)) {
      // satisfies(v, range, options)
      if (!max || maxSV.compare(v) === -1) {
        // compare(max, v, true)
        max = v
        maxSV = new SemVer(max, options)
      }
    }
  })
  return max
}

exports.minSatisfying = minSatisfying
function minSatisfying (versions, range, options) {
  var min = null
  var minSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (v) {
    if (rangeObj.test(v)) {
      // satisfies(v, range, options)
      if (!min || minSV.compare(v) === 1) {
        // compare(min, v, true)
        min = v
        minSV = new SemVer(min, options)
      }
    }
  })
  return min
}

exports.minVersion = minVersion
function minVersion (range, loose) {
  range = new Range(range, loose)

  var minver = new SemVer('0.0.0')
  if (range.test(minver)) {
    return minver
  }

  minver = new SemVer('0.0.0-0')
  if (range.test(minver)) {
    return minver
  }

  minver = null
  for (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    comparators.forEach(function (comparator) {
      // Clone to avoid manipulating the comparator's semver object.
      var compver = new SemVer(comparator.semver.version)
      switch (comparator.operator) {
        case '>':
          if (compver.prerelease.length === 0) {
            compver.patch++
          } else {
            compver.prerelease.push(0)
          }
          compver.raw = compver.format()
          /* fallthrough */
        case '':
        case '>=':
          if (!minver || gt(minver, compver)) {
            minver = compver
          }
          break
        case '<':
        case '<=':
          /* Ignore maximum versions */
          break
        /* istanbul ignore next */
        default:
          throw new Error('Unexpected operation: ' + comparator.operator)
      }
    })
  }

  if (minver && range.test(minver)) {
    return minver
  }

  return null
}

exports.validRange = validRange
function validRange (range, options) {
  try {
    // Return '*' instead of '' so that truthiness works.
    // This will throw if it's invalid anyway
    return new Range(range, options).range || '*'
  } catch (er) {
    return null
  }
}

// Determine if version is less than all the versions possible in the range
exports.ltr = ltr
function ltr (version, range, options) {
  return outside(version, range, '<', options)
}

// Determine if version is greater than all the versions possible in the range.
exports.gtr = gtr
function gtr (version, range, options) {
  return outside(version, range, '>', options)
}

exports.outside = outside
function outside (version, range, hilo, options) {
  version = new SemVer(version, options)
  range = new Range(range, options)

  var gtfn, ltefn, ltfn, comp, ecomp
  switch (hilo) {
    case '>':
      gtfn = gt
      ltefn = lte
      ltfn = lt
      comp = '>'
      ecomp = '>='
      break
    case '<':
      gtfn = lt
      ltefn = gte
      ltfn = gt
      comp = '<'
      ecomp = '<='
      break
    default:
      throw new TypeError('Must provide a hilo val of "<" or ">"')
  }

  // If it satisifes the range it is not outside
  if (satisfies(version, range, options)) {
    return false
  }

  // From now on, variable terms are as if we're in "gtr" mode.
  // but note that everything is flipped for the "ltr" function.

  for (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    var high = null
    var low = null

    comparators.forEach(function (comparator) {
      if (comparator.semver === ANY) {
        comparator = new Comparator('>=0.0.0')
      }
      high = high || comparator
      low = low || comparator
      if (gtfn(comparator.semver, high.semver, options)) {
        high = comparator
      } else if (ltfn(comparator.semver, low.semver, options)) {
        low = comparator
      }
    })

    // If the edge version comparator has a operator then our version
    // isn't outside it
    if (high.operator === comp || high.operator === ecomp) {
      return false
    }

    // If the lowest version comparator has an operator and our version
    // is less than it then it isn't higher than the range
    if ((!low.operator || low.operator === comp) &&
        ltefn(version, low.semver)) {
      return false
    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
      return false
    }
  }
  return true
}

exports.prerelease = prerelease
function prerelease (version, options) {
  var parsed = parse(version, options)
  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
}

exports.intersects = intersects
function intersects (r1, r2, options) {
  r1 = new Range(r1, options)
  r2 = new Range(r2, options)
  return r1.intersects(r2)
}

exports.coerce = coerce
function coerce (version) {
  if (version instanceof SemVer) {
    return version
  }

  if (typeof version !== 'string') {
    return null
  }

  var match = version.match(re[COERCE])

  if (match == null) {
    return null
  }

  return parse(match[1] +
    '.' + (match[2] || '0') +
    '.' + (match[3] || '0'))
}
#!/usr/bin/env node
// Standalone semver comparison program.
// Exits successfully and prints matching version(s) if
// any supplied version is valid and passes all tests.

var argv = process.argv.slice(2)

var versions = []

var range = []

var inc = null

var version = require('../package.json').version

var loose = false

var includePrerelease = false

var coerce = false

var identifier

var semver = require('../semver')

var reverse = false

var options = {}

main()

function main () {
  if (!argv.length) return help()
  while (argv.length) {
    var a = argv.shift()
    var indexOfEqualSign = a.indexOf('=')
    if (indexOfEqualSign !== -1) {
      a = a.slice(0, indexOfEqualSign)
      argv.unshift(a.slice(indexOfEqualSign + 1))
    }
    switch (a) {
      case '-rv': case '-rev': case '--rev': case '--reverse':
        reverse = true
        break
      case '-l': case '--loose':
        loose = true
        break
      case '-p': case '--include-prerelease':
        includePrerelease = true
        break
      case '-v': case '--version':
        versions.push(argv.shift())
        break
      case '-i': case '--inc': case '--increment':
        switch (argv[0]) {
          case 'major': case 'minor': case 'patch': case 'prerelease':
          case 'premajor': case 'preminor': case 'prepatch':
            inc = argv.shift()
            break
          default:
            inc = 'patch'
            break
        }
        break
      case '--preid':
        identifier = argv.shift()
        break
      case '-r': case '--range':
        range.push(argv.shift())
        break
      case '-c': case '--coerce':
        coerce = true
        break
      case '-h': case '--help': case '-?':
        return help()
      default:
        versions.push(a)
        break
    }
  }

  var options = { loose: loose, includePrerelease: includePrerelease }

  versions = versions.map(function (v) {
    return coerce ? (semver.coerce(v) || { version: v }).version : v
  }).filter(function (v) {
    return semver.valid(v)
  })
  if (!versions.length) return fail()
  if (inc && (versions.length !== 1 || range.length)) { return failInc() }

  for (var i = 0, l = range.length; i < l; i++) {
    versions = versions.filter(function (v) {
      return semver.satisfies(v, range[i], options)
    })
    if (!versions.length) return fail()
  }
  return success(versions)
}

function failInc () {
  console.error('--inc can only be used on a single version with no range')
  fail()
}

function fail () { process.exit(1) }

function success () {
  var compare = reverse ? 'rcompare' : 'compare'
  versions.sort(function (a, b) {
    return semver[compare](a, b, options)
  }).map(function (v) {
    return semver.clean(v, options)
  }).map(function (v) {
    return inc ? semver.inc(v, inc, options, identifier) : v
  }).forEach(function (v, i, _) { console.log(v) })
}

function help () {
  console.log(['SemVer ' + version,
    '',
    'A JavaScript implementation of the https://semver.org/ specification',
    'Copyright Isaac Z. Schlueter',
    '',
    'Usage: semver [options] <version> [<version> [...]]',
    'Prints valid versions sorted by SemVer precedence',
    '',
    'Options:',
    '-r --range <range>',
    '        Print versions that match the specified range.',
    '',
    '-i --increment [<level>]',
    '        Increment a version by the specified level.  Level can',
    '        be one of: major, minor, patch, premajor, preminor,',
    "        prepatch, or prerelease.  Default level is 'patch'.",
    '        Only one version may be specified.',
    '',
    '--preid <identifier>',
    '        Identifier to be used to prefix premajor, preminor,',
    '        prepatch or prerelease version increments.',
    '',
    '-l --loose',
    '        Interpret versions and ranges loosely',
    '',
    '-p --include-prerelease',
    '        Always include prerelease versions in range matching',
    '',
    '-c --coerce',
    '        Coerce a string into SemVer if possible',
    '        (does not imply --loose)',
    '',
    'Program exits successfully if any valid version satisfies',
    'all supplied ranges, and prints all satisfying versions.',
    '',
    'If no satisfying versions are found, then exits failure.',
    '',
    'Versions are printed in ascending order, so supplying',
    'multiple versions to the utility will just sort them.'
  ].join('\n'))
}
'use strict';
var shebangRegex = require('shebang-regex');

module.exports = function (str) {
	var match = str.match(shebangRegex);

	if (!match) {
		return null;
	}

	var arr = match[0].replace(/#! ?/, '').split(' ');
	var bin = arr[0].split('/').pop();
	var arg = arr[1];

	return (bin === 'env' ?
		arg :
		bin + (arg ? ' ' + arg : '')
	);
};
The MIT License (MIT)

Copyright (c) Kevin Martensson <kevinmartensson@gmail.com> (github.com/kevva)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Kevin Martensson",
    "email": "kevinmartensson@gmail.com",
    "url": "github.com/kevva"
  },
  "dependencies": {
    "shebang-regex": "^1.0.0"
  },
  "deprecated": false,
  "description": "Get the command from a shebang",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/kevva/shebang-command#readme",
  "license": "MIT",
  "name": "shebang-command",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/kevva/shebang-command.git"
  },
  "version": "1.2.0"
}'use strict';
module.exports = /^#!.*/;
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Regular expression for matching a shebang",
  "devDependencies": {
    "ava": "0.0.4"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/shebang-regex#readme",
  "license": "MIT",
  "name": "shebang-regex",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/shebang-regex.git"
  },
  "version": "1.0.0"
}{
  "name": "ShellJS",
  "twitter": [
    "r2r"
  ]
}
Copyright (c) 2012, Artur Adib <aadib@mozilla.com>
All rights reserved.

You may use this project under the terms of the New BSD license as follows:

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
    * Neither the name of Artur Adib nor the
      names of the contributors may be used to endorse or promote products
      derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Release steps

* Ensure master passes CI tests
* Bump version in package.json. Any breaking change or new feature should bump minor (or even major). Non-breaking changes or fixes can just bump patch.
* Update README manually if the changes are not documented in-code. If so, run `scripts/generate-docs.js`
* Commit
* `$ git tag <version>` (see `git tag -l` for latest)
* `$ git push origin master --tags`
* `$ npm publish .`
var shell = require('./shell.js');
for (var cmd in shell)
  global[cmd] = shell[cmd];
require('./global');

global.config.fatal = true;
global.target = {};

var args = process.argv.slice(2),
  targetArgs,
  dashesLoc = args.indexOf('--');

// split args, everything after -- if only for targets
if (dashesLoc > -1) {
  targetArgs = args.slice(dashesLoc + 1, args.length);
  args = args.slice(0, dashesLoc);
}

// This ensures we only execute the script targets after the entire script has
// been evaluated
setTimeout(function() {
  var t;

  if (args.length === 1 && args[0] === '--help') {
    console.log('Available targets:');
    for (t in global.target)
      console.log('  ' + t);
    return;
  }

  // Wrap targets to prevent duplicate execution
  for (t in global.target) {
    (function(t, oldTarget){

      // Wrap it
      global.target[t] = function() {
        if (oldTarget.done)
          return;
        oldTarget.done = true;
        return oldTarget.apply(oldTarget, arguments);
      };

    })(t, global.target[t]);
  }

  // Execute desired targets
  if (args.length > 0) {
    args.forEach(function(arg) {
      if (arg in global.target)
        global.target[arg](targetArgs);
      else {
        console.log('no such target: ' + arg);
      }
    });
  } else if ('all' in global.target) {
    global.target.all(targetArgs);
  }

}, 0);
{
  "author": {
    "name": "Artur Adib",
    "email": "arturadib@gmail.com"
  },
  "bin": {
    "shjs": "./bin/shjs"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Portable Unix shell commands for Node.js",
  "devDependencies": {
    "jshint": "~2.1.11"
  },
  "engines": {
    "node": ">=0.8.0"
  },
  "homepage": "http://github.com/arturadib/shelljs",
  "license": "BSD*",
  "main": "./shell.js",
  "name": "shelljs",
  "optionalDependencies": {},
  "repository": {
    "type": "git",
    "url": "git://github.com/arturadib/shelljs.git"
  },
  "version": "0.5.3"
}//
// ShellJS
// Unix shell commands on top of Node's API
//
// Copyright (c) 2012 Artur Adib
// http://github.com/arturadib/shelljs
//

var common = require('./src/common');


//@
//@ All commands run synchronously, unless otherwise stated.
//@

//@include ./src/cd
var _cd = require('./src/cd');
exports.cd = common.wrap('cd', _cd);

//@include ./src/pwd
var _pwd = require('./src/pwd');
exports.pwd = common.wrap('pwd', _pwd);

//@include ./src/ls
var _ls = require('./src/ls');
exports.ls = common.wrap('ls', _ls);

//@include ./src/find
var _find = require('./src/find');
exports.find = common.wrap('find', _find);

//@include ./src/cp
var _cp = require('./src/cp');
exports.cp = common.wrap('cp', _cp);

//@include ./src/rm
var _rm = require('./src/rm');
exports.rm = common.wrap('rm', _rm);

//@include ./src/mv
var _mv = require('./src/mv');
exports.mv = common.wrap('mv', _mv);

//@include ./src/mkdir
var _mkdir = require('./src/mkdir');
exports.mkdir = common.wrap('mkdir', _mkdir);

//@include ./src/test
var _test = require('./src/test');
exports.test = common.wrap('test', _test);

//@include ./src/cat
var _cat = require('./src/cat');
exports.cat = common.wrap('cat', _cat);

//@include ./src/to
var _to = require('./src/to');
String.prototype.to = common.wrap('to', _to);

//@include ./src/toEnd
var _toEnd = require('./src/toEnd');
String.prototype.toEnd = common.wrap('toEnd', _toEnd);

//@include ./src/sed
var _sed = require('./src/sed');
exports.sed = common.wrap('sed', _sed);

//@include ./src/grep
var _grep = require('./src/grep');
exports.grep = common.wrap('grep', _grep);

//@include ./src/which
var _which = require('./src/which');
exports.which = common.wrap('which', _which);

//@include ./src/echo
var _echo = require('./src/echo');
exports.echo = _echo; // don't common.wrap() as it could parse '-options'

//@include ./src/dirs
var _dirs = require('./src/dirs').dirs;
exports.dirs = common.wrap("dirs", _dirs);
var _pushd = require('./src/dirs').pushd;
exports.pushd = common.wrap('pushd', _pushd);
var _popd = require('./src/dirs').popd;
exports.popd = common.wrap("popd", _popd);

//@include ./src/ln
var _ln = require('./src/ln');
exports.ln = common.wrap('ln', _ln);

//@
//@ ### exit(code)
//@ Exits the current process with the given exit code.
exports.exit = process.exit;

//@
//@ ### env['VAR_NAME']
//@ Object containing environment variables (both getter and setter). Shortcut to process.env.
exports.env = process.env;

//@include ./src/exec
var _exec = require('./src/exec');
exports.exec = common.wrap('exec', _exec, {notUnix:true});

//@include ./src/chmod
var _chmod = require('./src/chmod');
exports.chmod = common.wrap('chmod', _chmod);



//@
//@ ## Non-Unix commands
//@

//@include ./src/tempdir
var _tempDir = require('./src/tempdir');
exports.tempdir = common.wrap('tempdir', _tempDir);


//@include ./src/error
var _error = require('./src/error');
exports.error = _error;



//@
//@ ## Configuration
//@

exports.config = common.config;

//@
//@ ### config.silent
//@ Example:
//@
//@ ```javascript
//@ var sh = require('shelljs');
//@ var silentState = sh.config.silent; // save old silent state
//@ sh.config.silent = true;
//@ /* ... */
//@ sh.config.silent = silentState; // restore old silent state
//@ ```
//@
//@ Suppresses all command output if `true`, except for `echo()` calls.
//@ Default is `false`.

//@
//@ ### config.fatal
//@ Example:
//@
//@ ```javascript
//@ require('shelljs/global');
//@ config.fatal = true;
//@ cp('this_file_does_not_exist', '/dev/null'); // dies here
//@ /* more commands... */
//@ ```
//@
//@ If `true` the script will die on errors. Default is `false`.
var common = require('./common');
var fs = require('fs');

//@
//@ ### cat(file [, file ...])
//@ ### cat(file_array)
//@
//@ Examples:
//@
//@ ```javascript
//@ var str = cat('file*.txt');
//@ var str = cat('file1', 'file2');
//@ var str = cat(['file1', 'file2']); // same as above
//@ ```
//@
//@ Returns a string containing the given file, or a concatenated string
//@ containing the files if more than one file is given (a new line character is
//@ introduced between each file). Wildcard `*` accepted.
function _cat(options, files) {
  var cat = '';

  if (!files)
    common.error('no paths given');

  if (typeof files === 'string')
    files = [].slice.call(arguments, 1);
  // if it's array leave it as it is

  files = common.expand(files);

  files.forEach(function(file) {
    if (!fs.existsSync(file))
      common.error('no such file or directory: ' + file);

    cat += fs.readFileSync(file, 'utf8') + '\n';
  });

  if (cat[cat.length-1] === '\n')
    cat = cat.substring(0, cat.length-1);

  return common.ShellString(cat);
}
module.exports = _cat;
var fs = require('fs');
var common = require('./common');

//@
//@ ### cd('dir')
//@ Changes to directory `dir` for the duration of the script
function _cd(options, dir) {
  if (!dir)
    common.error('directory not specified');

  if (!fs.existsSync(dir))
    common.error('no such file or directory: ' + dir);

  if (!fs.statSync(dir).isDirectory())
    common.error('not a directory: ' + dir);

  process.chdir(dir);
}
module.exports = _cd;
var common = require('./common');
var fs = require('fs');
var path = require('path');

var PERMS = (function (base) {
  return {
    OTHER_EXEC  : base.EXEC,
    OTHER_WRITE : base.WRITE,
    OTHER_READ  : base.READ,

    GROUP_EXEC  : base.EXEC  << 3,
    GROUP_WRITE : base.WRITE << 3,
    GROUP_READ  : base.READ << 3,

    OWNER_EXEC  : base.EXEC << 6,
    OWNER_WRITE : base.WRITE << 6,
    OWNER_READ  : base.READ << 6,

    // Literal octal numbers are apparently not allowed in "strict" javascript.  Using parseInt is
    // the preferred way, else a jshint warning is thrown.
    STICKY      : parseInt('01000', 8),
    SETGID      : parseInt('02000', 8),
    SETUID      : parseInt('04000', 8),

    TYPE_MASK   : parseInt('0770000', 8)
  };
})({
  EXEC  : 1,
  WRITE : 2,
  READ  : 4
});

//@
//@ ### chmod(octal_mode || octal_string, file)
//@ ### chmod(symbolic_mode, file)
//@
//@ Available options:
//@
//@ + `-v`: output a diagnostic for every file processed//@
//@ + `-c`: like verbose but report only when a change is made//@
//@ + `-R`: change files and directories recursively//@
//@
//@ Examples:
//@
//@ ```javascript
//@ chmod(755, '/Users/brandon');
//@ chmod('755', '/Users/brandon'); // same as above
//@ chmod('u+x', '/Users/brandon');
//@ ```
//@
//@ Alters the permissions of a file or directory by either specifying the
//@ absolute permissions in octal form or expressing the changes in symbols.
//@ This command tries to mimic the POSIX behavior as much as possible.
//@ Notable exceptions:
//@
//@ + In symbolic modes, 'a-r' and '-r' are identical.  No consideration is
//@   given to the umask.
//@ + There is no "quiet" option since default behavior is to run silent.
function _chmod(options, mode, filePattern) {
  if (!filePattern) {
    if (options.length > 0 && options.charAt(0) === '-') {
      // Special case where the specified file permissions started with - to subtract perms, which
      // get picked up by the option parser as command flags.
      // If we are down by one argument and options starts with -, shift everything over.
      filePattern = mode;
      mode = options;
      options = '';
    }
    else {
      common.error('You must specify a file.');
    }
  }

  options = common.parseOptions(options, {
    'R': 'recursive',
    'c': 'changes',
    'v': 'verbose'
  });

  if (typeof filePattern === 'string') {
    filePattern = [ filePattern ];
  }

  var files;

  if (options.recursive) {
    files = [];
    common.expand(filePattern).forEach(function addFile(expandedFile) {
      var stat = fs.lstatSync(expandedFile);

      if (!stat.isSymbolicLink()) {
        files.push(expandedFile);

        if (stat.isDirectory()) {  // intentionally does not follow symlinks.
          fs.readdirSync(expandedFile).forEach(function (child) {
            addFile(expandedFile + '/' + child);
          });
        }
      }
    });
  }
  else {
    files = common.expand(filePattern);
  }

  files.forEach(function innerChmod(file) {
    file = path.resolve(file);
    if (!fs.existsSync(file)) {
      common.error('File not found: ' + file);
    }

    // When recursing, don't follow symlinks.
    if (options.recursive && fs.lstatSync(file).isSymbolicLink()) {
      return;
    }

    var perms = fs.statSync(file).mode;
    var type = perms & PERMS.TYPE_MASK;

    var newPerms = perms;

    if (isNaN(parseInt(mode, 8))) {
      // parse options
      mode.split(',').forEach(function (symbolicMode) {
        /*jshint regexdash:true */
        var pattern = /([ugoa]*)([=\+-])([rwxXst]*)/i;
        var matches = pattern.exec(symbolicMode);

        if (matches) {
          var applyTo = matches[1];
          var operator = matches[2];
          var change = matches[3];

          var changeOwner = applyTo.indexOf('u') != -1 || applyTo === 'a' || applyTo === '';
          var changeGroup = applyTo.indexOf('g') != -1 || applyTo === 'a' || applyTo === '';
          var changeOther = applyTo.indexOf('o') != -1 || applyTo === 'a' || applyTo === '';

          var changeRead   = change.indexOf('r') != -1;
          var changeWrite  = change.indexOf('w') != -1;
          var changeExec   = change.indexOf('x') != -1;
          var changeSticky = change.indexOf('t') != -1;
          var changeSetuid = change.indexOf('s') != -1;

          var mask = 0;
          if (changeOwner) {
            mask |= (changeRead ? PERMS.OWNER_READ : 0) + (changeWrite ? PERMS.OWNER_WRITE : 0) + (changeExec ? PERMS.OWNER_EXEC : 0) + (changeSetuid ? PERMS.SETUID : 0);
          }
          if (changeGroup) {
            mask |= (changeRead ? PERMS.GROUP_READ : 0) + (changeWrite ? PERMS.GROUP_WRITE : 0) + (changeExec ? PERMS.GROUP_EXEC : 0) + (changeSetuid ? PERMS.SETGID : 0);
          }
          if (changeOther) {
            mask |= (changeRead ? PERMS.OTHER_READ : 0) + (changeWrite ? PERMS.OTHER_WRITE : 0) + (changeExec ? PERMS.OTHER_EXEC : 0);
          }

          // Sticky bit is special - it's not tied to user, group or other.
          if (changeSticky) {
            mask |= PERMS.STICKY;
          }

          switch (operator) {
            case '+':
              newPerms |= mask;
              break;

            case '-':
              newPerms &= ~mask;
              break;

            case '=':
              newPerms = type + mask;

              // According to POSIX, when using = to explicitly set the permissions, setuid and setgid can never be cleared.
              if (fs.statSync(file).isDirectory()) {
                newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms;
              }
              break;
          }

          if (options.verbose) {
            log(file + ' -> ' + newPerms.toString(8));
          }

          if (perms != newPerms) {
            if (!options.verbose && options.changes) {
              log(file + ' -> ' + newPerms.toString(8));
            }
            fs.chmodSync(file, newPerms);
          }
        }
        else {
          common.error('Invalid symbolic mode change: ' + symbolicMode);
        }
      });
    }
    else {
      // they gave us a full number
      newPerms = type + parseInt(mode, 8);

      // POSIX rules are that setuid and setgid can only be added using numeric form, but not cleared.
      if (fs.statSync(file).isDirectory()) {
        newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms;
      }

      fs.chmodSync(file, newPerms);
    }
  });
}
module.exports = _chmod;
var os = require('os');
var fs = require('fs');
var _ls = require('./ls');

// Module globals
var config = {
  silent: false,
  fatal: false
};
exports.config = config;

var state = {
  error: null,
  currentCmd: 'shell.js',
  tempDir: null
};
exports.state = state;

var platform = os.type().match(/^Win/) ? 'win' : 'unix';
exports.platform = platform;

function log() {
  if (!config.silent)
    console.log.apply(this, arguments);
}
exports.log = log;

// Shows error message. Throws unless _continue or config.fatal are true
function error(msg, _continue) {
  if (state.error === null)
    state.error = '';
  state.error += state.currentCmd + ': ' + msg + '\n';

  if (msg.length > 0)
    log(state.error);

  if (config.fatal)
    process.exit(1);

  if (!_continue)
    throw '';
}
exports.error = error;

// In the future, when Proxies are default, we can add methods like `.to()` to primitive strings.
// For now, this is a dummy function to bookmark places we need such strings
function ShellString(str) {
  return str;
}
exports.ShellString = ShellString;

// Returns {'alice': true, 'bob': false} when passed a dictionary, e.g.:
//   parseOptions('-a', {'a':'alice', 'b':'bob'});
function parseOptions(str, map) {
  if (!map)
    error('parseOptions() internal error: no map given');

  // All options are false by default
  var options = {};
  for (var letter in map)
    options[map[letter]] = false;

  if (!str)
    return options; // defaults

  if (typeof str !== 'string')
    error('parseOptions() internal error: wrong str');

  // e.g. match[1] = 'Rf' for str = '-Rf'
  var match = str.match(/^\-(.+)/);
  if (!match)
    return options;

  // e.g. chars = ['R', 'f']
  var chars = match[1].split('');

  chars.forEach(function(c) {
    if (c in map)
      options[map[c]] = true;
    else
      error('option not recognized: '+c);
  });

  return options;
}
exports.parseOptions = parseOptions;

// Expands wildcards with matching (ie. existing) file names.
// For example:
//   expand(['file*.js']) = ['file1.js', 'file2.js', ...]
//   (if the files 'file1.js', 'file2.js', etc, exist in the current dir)
function expand(list) {
  var expanded = [];
  list.forEach(function(listEl) {
    // Wildcard present on directory names ?
    if(listEl.search(/\*[^\/]*\//) > -1 || listEl.search(/\*\*[^\/]*\//) > -1) {
      var match = listEl.match(/^([^*]+\/|)(.*)/);
      var root = match[1];
      var rest = match[2];
      var restRegex = rest.replace(/\*\*/g, ".*").replace(/\*/g, "[^\\/]*");
      restRegex = new RegExp(restRegex);
      
      _ls('-R', root).filter(function (e) {
        return restRegex.test(e);
      }).forEach(function(file) {
        expanded.push(file);
      });
    }
    // Wildcard present on file names ?
    else if (listEl.search(/\*/) > -1) {
      _ls('', listEl).forEach(function(file) {
        expanded.push(file);
      });
    } else {
      expanded.push(listEl);
    }
  });
  return expanded;
}
exports.expand = expand;

// Normalizes _unlinkSync() across platforms to match Unix behavior, i.e.
// file can be unlinked even if it's read-only, see https://github.com/joyent/node/issues/3006
function unlinkSync(file) {
  try {
    fs.unlinkSync(file);
  } catch(e) {
    // Try to override file permission
    if (e.code === 'EPERM') {
      fs.chmodSync(file, '0666');
      fs.unlinkSync(file);
    } else {
      throw e;
    }
  }
}
exports.unlinkSync = unlinkSync;

// e.g. 'shelljs_a5f185d0443ca...'
function randomFileName() {
  function randomHash(count) {
    if (count === 1)
      return parseInt(16*Math.random(), 10).toString(16);
    else {
      var hash = '';
      for (var i=0; i<count; i++)
        hash += randomHash(1);
      return hash;
    }
  }

  return 'shelljs_'+randomHash(20);
}
exports.randomFileName = randomFileName;

// extend(target_obj, source_obj1 [, source_obj2 ...])
// Shallow extend, e.g.:
//    extend({A:1}, {b:2}, {c:3}) returns {A:1, b:2, c:3}
function extend(target) {
  var sources = [].slice.call(arguments, 1);
  sources.forEach(function(source) {
    for (var key in source)
      target[key] = source[key];
  });

  return target;
}
exports.extend = extend;

// Common wrapper for all Unix-like commands
function wrap(cmd, fn, options) {
  return function() {
    var retValue = null;

    state.currentCmd = cmd;
    state.error = null;

    try {
      var args = [].slice.call(arguments, 0);

      if (options && options.notUnix) {
        retValue = fn.apply(this, args);
      } else {
        if (args.length === 0 || typeof args[0] !== 'string' || args[0][0] !== '-')
          args.unshift(''); // only add dummy option if '-option' not already present
        retValue = fn.apply(this, args);
      }
    } catch (e) {
      if (!state.error) {
        // If state.error hasn't been set it's an error thrown by Node, not us - probably a bug...
        console.log('shell.js: internal error');
        console.log(e.stack || e);
        process.exit(1);
      }
      if (config.fatal)
        throw e;
    }

    state.currentCmd = 'shell.js';
    return retValue;
  };
} // wrap
exports.wrap = wrap;
var fs = require('fs');
var path = require('path');
var common = require('./common');
var os = require('os');

// Buffered file copy, synchronous
// (Using readFileSync() + writeFileSync() could easily cause a memory overflow
//  with large files)
function copyFileSync(srcFile, destFile) {
  if (!fs.existsSync(srcFile))
    common.error('copyFileSync: no such file or directory: ' + srcFile);

  var BUF_LENGTH = 64*1024,
      buf = new Buffer(BUF_LENGTH),
      bytesRead = BUF_LENGTH,
      pos = 0,
      fdr = null,
      fdw = null;

  try {
    fdr = fs.openSync(srcFile, 'r');
  } catch(e) {
    common.error('copyFileSync: could not read src file ('+srcFile+')');
  }

  try {
    fdw = fs.openSync(destFile, 'w');
  } catch(e) {
    common.error('copyFileSync: could not write to dest file (code='+e.code+'):'+destFile);
  }

  while (bytesRead === BUF_LENGTH) {
    bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos);
    fs.writeSync(fdw, buf, 0, bytesRead);
    pos += bytesRead;
  }

  fs.closeSync(fdr);
  fs.closeSync(fdw);

  fs.chmodSync(destFile, fs.statSync(srcFile).mode);
}

// Recursively copies 'sourceDir' into 'destDir'
// Adapted from https://github.com/ryanmcgrath/wrench-js
//
// Copyright (c) 2010 Ryan McGrath
// Copyright (c) 2012 Artur Adib
//
// Licensed under the MIT License
// http://www.opensource.org/licenses/mit-license.php
function cpdirSyncRecursive(sourceDir, destDir, opts) {
  if (!opts) opts = {};

  /* Create the directory where all our junk is moving to; read the mode of the source directory and mirror it */
  var checkDir = fs.statSync(sourceDir);
  try {
    fs.mkdirSync(destDir, checkDir.mode);
  } catch (e) {
    //if the directory already exists, that's okay
    if (e.code !== 'EEXIST') throw e;
  }

  var files = fs.readdirSync(sourceDir);

  for (var i = 0; i < files.length; i++) {
    var srcFile = sourceDir + "/" + files[i];
    var destFile = destDir + "/" + files[i];
    var srcFileStat = fs.lstatSync(srcFile);

    if (srcFileStat.isDirectory()) {
      /* recursion this thing right on back. */
      cpdirSyncRecursive(srcFile, destFile, opts);
    } else if (srcFileStat.isSymbolicLink()) {
      var symlinkFull = fs.readlinkSync(srcFile);
      fs.symlinkSync(symlinkFull, destFile, os.platform() === "win32" ? "junction" : null);
    } else {
      /* At this point, we've hit a file actually worth copying... so copy it on over. */
      if (fs.existsSync(destFile) && !opts.force) {
        common.log('skipping existing file: ' + files[i]);
      } else {
        copyFileSync(srcFile, destFile);
      }
    }

  } // for files
} // cpdirSyncRecursive


//@
//@ ### cp([options ,] source [,source ...], dest)
//@ ### cp([options ,] source_array, dest)
//@ Available options:
//@
//@ + `-f`: force
//@ + `-r, -R`: recursive
//@
//@ Examples:
//@
//@ ```javascript
//@ cp('file1', 'dir1');
//@ cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp');
//@ cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above
//@ ```
//@
//@ Copies files. The wildcard `*` is accepted.
function _cp(options, sources, dest) {
  options = common.parseOptions(options, {
    'f': 'force',
    'R': 'recursive',
    'r': 'recursive'
  });

  // Get sources, dest
  if (arguments.length < 3) {
    common.error('missing <source> and/or <dest>');
  } else if (arguments.length > 3) {
    sources = [].slice.call(arguments, 1, arguments.length - 1);
    dest = arguments[arguments.length - 1];
  } else if (typeof sources === 'string') {
    sources = [sources];
  } else if ('length' in sources) {
    sources = sources; // no-op for array
  } else {
    common.error('invalid arguments');
  }

  var exists = fs.existsSync(dest),
      stats = exists && fs.statSync(dest);

  // Dest is not existing dir, but multiple sources given
  if ((!exists || !stats.isDirectory()) && sources.length > 1)
    common.error('dest is not a directory (too many sources)');

  // Dest is an existing file, but no -f given
  if (exists && stats.isFile() && !options.force)
    common.error('dest file already exists: ' + dest);

  if (options.recursive) {
    // Recursive allows the shortcut syntax "sourcedir/" for "sourcedir/*"
    // (see Github issue #15)
    sources.forEach(function(src, i) {
      if (src[src.length - 1] === '/')
        sources[i] += '*';
    });

    // Create dest
    try {
      fs.mkdirSync(dest, parseInt('0777', 8));
    } catch (e) {
      // like Unix's cp, keep going even if we can't create dest dir
    }
  }

  sources = common.expand(sources);

  sources.forEach(function(src) {
    if (!fs.existsSync(src)) {
      common.error('no such file or directory: '+src, true);
      return; // skip file
    }

    // If here, src exists
    if (fs.statSync(src).isDirectory()) {
      if (!options.recursive) {
        // Non-Recursive
        common.log(src + ' is a directory (not copied)');
      } else {
        // Recursive
        // 'cp /a/source dest' should create 'source' in 'dest'
        var newDest = path.join(dest, path.basename(src)),
            checkDir = fs.statSync(src);
        try {
          fs.mkdirSync(newDest, checkDir.mode);
        } catch (e) {
          //if the directory already exists, that's okay
          if (e.code !== 'EEXIST') {
            common.error('dest file no such file or directory: ' + newDest, true);
            throw e;
          }
        }

        cpdirSyncRecursive(src, newDest, {force: options.force});
      }
      return; // done with dir
    }

    // If here, src is a file

    // When copying to '/path/dir':
    //    thisDest = '/path/dir/file1'
    var thisDest = dest;
    if (fs.existsSync(dest) && fs.statSync(dest).isDirectory())
      thisDest = path.normalize(dest + '/' + path.basename(src));

    if (fs.existsSync(thisDest) && !options.force) {
      common.error('dest file already exists: ' + thisDest, true);
      return; // skip file
    }

    copyFileSync(src, thisDest);
  }); // forEach(src)
}
module.exports = _cp;
var common = require('./common');
var _cd = require('./cd');
var path = require('path');

// Pushd/popd/dirs internals
var _dirStack = [];

function _isStackIndex(index) {
  return (/^[\-+]\d+$/).test(index);
}

function _parseStackIndex(index) {
  if (_isStackIndex(index)) {
    if (Math.abs(index) < _dirStack.length + 1) { // +1 for pwd
      return (/^-/).test(index) ? Number(index) - 1 : Number(index);
    } else {
      common.error(index + ': directory stack index out of range');
    }
  } else {
    common.error(index + ': invalid number');
  }
}

function _actualDirStack() {
  return [process.cwd()].concat(_dirStack);
}

//@
//@ ### pushd([options,] [dir | '-N' | '+N'])
//@
//@ Available options:
//@
//@ + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated.
//@
//@ Arguments:
//@
//@ + `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`.
//@ + `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.
//@ + `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.
//@
//@ Examples:
//@
//@ ```javascript
//@ // process.cwd() === '/usr'
//@ pushd('/etc'); // Returns /etc /usr
//@ pushd('+1');   // Returns /usr /etc
//@ ```
//@
//@ Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack.
function _pushd(options, dir) {
  if (_isStackIndex(options)) {
    dir = options;
    options = '';
  }

  options = common.parseOptions(options, {
    'n' : 'no-cd'
  });

  var dirs = _actualDirStack();

  if (dir === '+0') {
    return dirs; // +0 is a noop
  } else if (!dir) {
    if (dirs.length > 1) {
      dirs = dirs.splice(1, 1).concat(dirs);
    } else {
      return common.error('no other directory');
    }
  } else if (_isStackIndex(dir)) {
    var n = _parseStackIndex(dir);
    dirs = dirs.slice(n).concat(dirs.slice(0, n));
  } else {
    if (options['no-cd']) {
      dirs.splice(1, 0, dir);
    } else {
      dirs.unshift(dir);
    }
  }

  if (options['no-cd']) {
    dirs = dirs.slice(1);
  } else {
    dir = path.resolve(dirs.shift());
    _cd('', dir);
  }

  _dirStack = dirs;
  return _dirs('');
}
exports.pushd = _pushd;

//@
//@ ### popd([options,] ['-N' | '+N'])
//@
//@ Available options:
//@
//@ + `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated.
//@
//@ Arguments:
//@
//@ + `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero.
//@ + `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero.
//@
//@ Examples:
//@
//@ ```javascript
//@ echo(process.cwd()); // '/usr'
//@ pushd('/etc');       // '/etc /usr'
//@ echo(process.cwd()); // '/etc'
//@ popd();              // '/usr'
//@ echo(process.cwd()); // '/usr'
//@ ```
//@
//@ When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack.
function _popd(options, index) {
  if (_isStackIndex(options)) {
    index = options;
    options = '';
  }

  options = common.parseOptions(options, {
    'n' : 'no-cd'
  });

  if (!_dirStack.length) {
    return common.error('directory stack empty');
  }

  index = _parseStackIndex(index || '+0');

  if (options['no-cd'] || index > 0 || _dirStack.length + index === 0) {
    index = index > 0 ? index - 1 : index;
    _dirStack.splice(index, 1);
  } else {
    var dir = path.resolve(_dirStack.shift());
    _cd('', dir);
  }

  return _dirs('');
}
exports.popd = _popd;

//@
//@ ### dirs([options | '+N' | '-N'])
//@
//@ Available options:
//@
//@ + `-c`: Clears the directory stack by deleting all of the elements.
//@
//@ Arguments:
//@
//@ + `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero.
//@ + `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero.
//@
//@ Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified.
//@
//@ See also: pushd, popd
function _dirs(options, index) {
  if (_isStackIndex(options)) {
    index = options;
    options = '';
  }

  options = common.parseOptions(options, {
    'c' : 'clear'
  });

  if (options['clear']) {
    _dirStack = [];
    return _dirStack;
  }

  var stack = _actualDirStack();

  if (index) {
    index = _parseStackIndex(index);

    if (index < 0) {
      index = stack.length + index;
    }

    common.log(stack[index]);
    return stack[index];
  }

  common.log(stack.join(' '));

  return stack;
}
exports.dirs = _dirs;
var common = require('./common');

//@
//@ ### echo(string [,string ...])
//@
//@ Examples:
//@
//@ ```javascript
//@ echo('hello world');
//@ var str = echo('hello world');
//@ ```
//@
//@ Prints string to stdout, and returns string with additional utility methods
//@ like `.to()`.
function _echo() {
  var messages = [].slice.call(arguments, 0);
  console.log.apply(this, messages);
  return common.ShellString(messages.join(' '));
}
module.exports = _echo;
var common = require('./common');

//@
//@ ### error()
//@ Tests if error occurred in the last command. Returns `null` if no error occurred,
//@ otherwise returns string explaining the error
function error() {
  return common.state.error;
};
module.exports = error;
var common = require('./common');
var _tempDir = require('./tempdir');
var _pwd = require('./pwd');
var path = require('path');
var fs = require('fs');
var child = require('child_process');

// Hack to run child_process.exec() synchronously (sync avoids callback hell)
// Uses a custom wait loop that checks for a flag file, created when the child process is done.
// (Can't do a wait loop that checks for internal Node variables/messages as
// Node is single-threaded; callbacks and other internal state changes are done in the
// event loop).
function execSync(cmd, opts) {
  var tempDir = _tempDir();
  var stdoutFile = path.resolve(tempDir+'/'+common.randomFileName()),
      codeFile = path.resolve(tempDir+'/'+common.randomFileName()),
      scriptFile = path.resolve(tempDir+'/'+common.randomFileName()),
      sleepFile = path.resolve(tempDir+'/'+common.randomFileName());

  var options = common.extend({
    silent: common.config.silent
  }, opts);

  var previousStdoutContent = '';
  // Echoes stdout changes from running process, if not silent
  function updateStdout() {
    if (options.silent || !fs.existsSync(stdoutFile))
      return;

    var stdoutContent = fs.readFileSync(stdoutFile, 'utf8');
    // No changes since last time?
    if (stdoutContent.length <= previousStdoutContent.length)
      return;

    process.stdout.write(stdoutContent.substr(previousStdoutContent.length));
    previousStdoutContent = stdoutContent;
  }

  function escape(str) {
    return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0");
  }

  if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile);
  if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile);
  if (fs.existsSync(codeFile)) common.unlinkSync(codeFile);

  var execCommand = '"'+process.execPath+'" '+scriptFile;
  var execOptions = {
    env: process.env,
    cwd: _pwd(),
    maxBuffer: 20*1024*1024
  };

  if (typeof child.execSync === 'function') {
    var script = [
      "var child = require('child_process')",
      "  , fs = require('fs');",
      "var childProcess = child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {",
      "  fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');",
      "});",
      "var stdoutStream = fs.createWriteStream('"+escape(stdoutFile)+"');",
      "childProcess.stdout.pipe(stdoutStream, {end: false});",
      "childProcess.stderr.pipe(stdoutStream, {end: false});",
      "childProcess.stdout.pipe(process.stdout);",
      "childProcess.stderr.pipe(process.stderr);",
      "var stdoutEnded = false, stderrEnded = false;",
      "function tryClosing(){ if(stdoutEnded && stderrEnded){ stdoutStream.end(); } }",
      "childProcess.stdout.on('end', function(){ stdoutEnded = true; tryClosing(); });",
      "childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosing(); });"
    ].join('\n');

    fs.writeFileSync(scriptFile, script);

    if (options.silent) {
      execOptions.stdio = 'ignore';
    } else {
      execOptions.stdio = [0, 1, 2];
    }

    // Welcome to the future
    child.execSync(execCommand, execOptions);
  } else {
    cmd += ' > '+stdoutFile+' 2>&1'; // works on both win/unix

    var script = [
      "var child = require('child_process')",
      "  , fs = require('fs');",
      "var childProcess = child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {",
      "  fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');",
      "});"
    ].join('\n');

    fs.writeFileSync(scriptFile, script);

    child.exec(execCommand, execOptions);

    // The wait loop
    // sleepFile is used as a dummy I/O op to mitigate unnecessary CPU usage
    // (tried many I/O sync ops, writeFileSync() seems to be only one that is effective in reducing
    // CPU usage, though apparently not so much on Windows)
    while (!fs.existsSync(codeFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); }
    while (!fs.existsSync(stdoutFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); }
  }

  // At this point codeFile exists, but it's not necessarily flushed yet.
  // Keep reading it until it is.
  var code = parseInt('', 10);
  while (isNaN(code)) {
    code = parseInt(fs.readFileSync(codeFile, 'utf8'), 10);
  }

  var stdout = fs.readFileSync(stdoutFile, 'utf8');

  // No biggie if we can't erase the files now -- they're in a temp dir anyway
  try { common.unlinkSync(scriptFile); } catch(e) {}
  try { common.unlinkSync(stdoutFile); } catch(e) {}
  try { common.unlinkSync(codeFile); } catch(e) {}
  try { common.unlinkSync(sleepFile); } catch(e) {}

  // some shell return codes are defined as errors, per http://tldp.org/LDP/abs/html/exitcodes.html
  if (code === 1 || code === 2 || code >= 126)  {
      common.error('', true); // unix/shell doesn't really give an error message after non-zero exit codes
  }
  // True if successful, false if not
  var obj = {
    code: code,
    output: stdout
  };
  return obj;
} // execSync()

// Wrapper around exec() to enable echoing output to console in real time
function execAsync(cmd, opts, callback) {
  var output = '';

  var options = common.extend({
    silent: common.config.silent
  }, opts);

  var c = child.exec(cmd, {env: process.env, maxBuffer: 20*1024*1024}, function(err) {
    if (callback)
      callback(err ? err.code : 0, output);
  });

  c.stdout.on('data', function(data) {
    output += data;
    if (!options.silent)
      process.stdout.write(data);
  });

  c.stderr.on('data', function(data) {
    output += data;
    if (!options.silent)
      process.stdout.write(data);
  });

  return c;
}

//@
//@ ### exec(command [, options] [, callback])
//@ Available options (all `false` by default):
//@
//@ + `async`: Asynchronous execution. Defaults to true if a callback is provided.
//@ + `silent`: Do not echo program output to console.
//@
//@ Examples:
//@
//@ ```javascript
//@ var version = exec('node --version', {silent:true}).output;
//@
//@ var child = exec('some_long_running_process', {async:true});
//@ child.stdout.on('data', function(data) {
//@   /* ... do something with data ... */
//@ });
//@
//@ exec('some_long_running_process', function(code, output) {
//@   console.log('Exit code:', code);
//@   console.log('Program output:', output);
//@ });
//@ ```
//@
//@ Executes the given `command` _synchronously_, unless otherwise specified.
//@ When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's
//@ `output` (stdout + stderr)  and its exit `code`. Otherwise returns the child process object, and
//@ the `callback` gets the arguments `(code, output)`.
//@
//@ **Note:** For long-lived processes, it's best to run `exec()` asynchronously as
//@ the current synchronous implementation uses a lot of CPU. This should be getting
//@ fixed soon.
function _exec(command, options, callback) {
  if (!command)
    common.error('must specify command');

  // Callback is defined instead of options.
  if (typeof options === 'function') {
    callback = options;
    options = { async: true };
  }

  // Callback is defined with options.
  if (typeof options === 'object' && typeof callback === 'function') {
    options.async = true;
  }

  options = common.extend({
    silent: common.config.silent,
    async: false
  }, options);

  if (options.async)
    return execAsync(command, options, callback);
  else
    return execSync(command, options);
}
module.exports = _exec;
var fs = require('fs');
var common = require('./common');
var _ls = require('./ls');

//@
//@ ### find(path [,path ...])
//@ ### find(path_array)
//@ Examples:
//@
//@ ```javascript
//@ find('src', 'lib');
//@ find(['src', 'lib']); // same as above
//@ find('.').filter(function(file) { return file.match(/\.js$/); });
//@ ```
//@
//@ Returns array of all files (however deep) in the given paths.
//@
//@ The main difference from `ls('-R', path)` is that the resulting file names
//@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`.
function _find(options, paths) {
  if (!paths)
    common.error('no path specified');
  else if (typeof paths === 'object')
    paths = paths; // assume array
  else if (typeof paths === 'string')
    paths = [].slice.call(arguments, 1);

  var list = [];

  function pushFile(file) {
    if (common.platform === 'win')
      file = file.replace(/\\/g, '/');
    list.push(file);
  }

  // why not simply do ls('-R', paths)? because the output wouldn't give the base dirs
  // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory

  paths.forEach(function(file) {
    pushFile(file);

    if (fs.statSync(file).isDirectory()) {
      _ls('-RA', file+'/*').forEach(function(subfile) {
        pushFile(subfile);
      });
    }
  });

  return list;
}
module.exports = _find;
var common = require('./common');
var fs = require('fs');

//@
//@ ### grep([options ,] regex_filter, file [, file ...])
//@ ### grep([options ,] regex_filter, file_array)
//@ Available options:
//@
//@ + `-v`: Inverse the sense of the regex and print the lines not matching the criteria.
//@
//@ Examples:
//@
//@ ```javascript
//@ grep('-v', 'GLOBAL_VARIABLE', '*.js');
//@ grep('GLOBAL_VARIABLE', '*.js');
//@ ```
//@
//@ Reads input string from given files and returns a string containing all lines of the
//@ file that match the given `regex_filter`. Wildcard `*` accepted.
function _grep(options, regex, files) {
  options = common.parseOptions(options, {
    'v': 'inverse'
  });

  if (!files)
    common.error('no paths given');

  if (typeof files === 'string')
    files = [].slice.call(arguments, 2);
  // if it's array leave it as it is

  files = common.expand(files);

  var grep = '';
  files.forEach(function(file) {
    if (!fs.existsSync(file)) {
      common.error('no such file or directory: ' + file, true);
      return;
    }

    var contents = fs.readFileSync(file, 'utf8'),
        lines = contents.split(/\r*\n/);
    lines.forEach(function(line) {
      var matched = line.match(regex);
      if ((options.inverse && !matched) || (!options.inverse && matched))
        grep += line + '\n';
    });
  });

  return common.ShellString(grep);
}
module.exports = _grep;
var fs = require('fs');
var path = require('path');
var common = require('./common');
var os = require('os');

//@
//@ ### ln(options, source, dest)
//@ ### ln(source, dest)
//@ Available options:
//@
//@ + `s`: symlink
//@ + `f`: force
//@
//@ Examples:
//@
//@ ```javascript
//@ ln('file', 'newlink');
//@ ln('-sf', 'file', 'existing');
//@ ```
//@
//@ Links source to dest. Use -f to force the link, should dest already exist.
function _ln(options, source, dest) {
  options = common.parseOptions(options, {
    's': 'symlink',
    'f': 'force'
  });

  if (!source || !dest) {
    common.error('Missing <source> and/or <dest>');
  }

  source = path.resolve(process.cwd(), String(source));
  dest = path.resolve(process.cwd(), String(dest));

  if (!fs.existsSync(source)) {
    common.error('Source file does not exist', true);
  }

  if (fs.existsSync(dest)) {
    if (!options.force) {
      common.error('Destination file exists', true);
    }

    fs.unlinkSync(dest);
  }

  if (options.symlink) {
    fs.symlinkSync(source, dest, os.platform() === "win32" ? "junction" : null);
  } else {
    fs.linkSync(source, dest, os.platform() === "win32" ? "junction" : null);
  }
}
module.exports = _ln;
var path = require('path');
var fs = require('fs');
var common = require('./common');
var _cd = require('./cd');
var _pwd = require('./pwd');

//@
//@ ### ls([options ,] path [,path ...])
//@ ### ls([options ,] path_array)
//@ Available options:
//@
//@ + `-R`: recursive
//@ + `-A`: all files (include files beginning with `.`, except for `.` and `..`)
//@
//@ Examples:
//@
//@ ```javascript
//@ ls('projs/*.js');
//@ ls('-R', '/users/me', '/tmp');
//@ ls('-R', ['/users/me', '/tmp']); // same as above
//@ ```
//@
//@ Returns array of files in the given path, or in current directory if no path provided.
function _ls(options, paths) {
  options = common.parseOptions(options, {
    'R': 'recursive',
    'A': 'all',
    'a': 'all_deprecated'
  });

  if (options.all_deprecated) {
    // We won't support the -a option as it's hard to image why it's useful
    // (it includes '.' and '..' in addition to '.*' files)
    // For backwards compatibility we'll dump a deprecated message and proceed as before
    common.log('ls: Option -a is deprecated. Use -A instead');
    options.all = true;
  }

  if (!paths)
    paths = ['.'];
  else if (typeof paths === 'object')
    paths = paths; // assume array
  else if (typeof paths === 'string')
    paths = [].slice.call(arguments, 1);

  var list = [];

  // Conditionally pushes file to list - returns true if pushed, false otherwise
  // (e.g. prevents hidden files to be included unless explicitly told so)
  function pushFile(file, query) {
    // hidden file?
    if (path.basename(file)[0] === '.') {
      // not explicitly asking for hidden files?
      if (!options.all && !(path.basename(query)[0] === '.' && path.basename(query).length > 1))
        return false;
    }

    if (common.platform === 'win')
      file = file.replace(/\\/g, '/');

    list.push(file);
    return true;
  }

  paths.forEach(function(p) {
    if (fs.existsSync(p)) {
      var stats = fs.statSync(p);
      // Simple file?
      if (stats.isFile()) {
        pushFile(p, p);
        return; // continue
      }

      // Simple dir?
      if (stats.isDirectory()) {
        // Iterate over p contents
        fs.readdirSync(p).forEach(function(file) {
          if (!pushFile(file, p))
            return;

          // Recursive?
          if (options.recursive) {
            var oldDir = _pwd();
            _cd('', p);
            if (fs.statSync(file).isDirectory())
              list = list.concat(_ls('-R'+(options.all?'A':''), file+'/*'));
            _cd('', oldDir);
          }
        });
        return; // continue
      }
    }

    // p does not exist - possible wildcard present

    var basename = path.basename(p);
    var dirname = path.dirname(p);
    // Wildcard present on an existing dir? (e.g. '/tmp/*.js')
    if (basename.search(/\*/) > -1 && fs.existsSync(dirname) && fs.statSync(dirname).isDirectory) {
      // Escape special regular expression chars
      var regexp = basename.replace(/(\^|\$|\(|\)|<|>|\[|\]|\{|\}|\.|\+|\?)/g, '\\$1');
      // Translates wildcard into regex
      regexp = '^' + regexp.replace(/\*/g, '.*') + '$';
      // Iterate over directory contents
      fs.readdirSync(dirname).forEach(function(file) {
        if (file.match(new RegExp(regexp))) {
          if (!pushFile(path.normalize(dirname+'/'+file), basename))
            return;

          // Recursive?
          if (options.recursive) {
            var pp = dirname + '/' + file;
            if (fs.lstatSync(pp).isDirectory())
              list = list.concat(_ls('-R'+(options.all?'A':''), pp+'/*'));
          } // recursive
        } // if file matches
      }); // forEach
      return;
    }

    common.error('no such file or directory: ' + p, true);
  });

  return list;
}
module.exports = _ls;
var common = require('./common');
var fs = require('fs');
var path = require('path');

// Recursively creates 'dir'
function mkdirSyncRecursive(dir) {
  var baseDir = path.dirname(dir);

  // Base dir exists, no recursion necessary
  if (fs.existsSync(baseDir)) {
    fs.mkdirSync(dir, parseInt('0777', 8));
    return;
  }

  // Base dir does not exist, go recursive
  mkdirSyncRecursive(baseDir);

  // Base dir created, can create dir
  fs.mkdirSync(dir, parseInt('0777', 8));
}

//@
//@ ### mkdir([options ,] dir [, dir ...])
//@ ### mkdir([options ,] dir_array)
//@ Available options:
//@
//@ + `p`: full path (will create intermediate dirs if necessary)
//@
//@ Examples:
//@
//@ ```javascript
//@ mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g');
//@ mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above
//@ ```
//@
//@ Creates directories.
function _mkdir(options, dirs) {
  options = common.parseOptions(options, {
    'p': 'fullpath'
  });
  if (!dirs)
    common.error('no paths given');

  if (typeof dirs === 'string')
    dirs = [].slice.call(arguments, 1);
  // if it's array leave it as it is

  dirs.forEach(function(dir) {
    if (fs.existsSync(dir)) {
      if (!options.fullpath)
          common.error('path already exists: ' + dir, true);
      return; // skip dir
    }

    // Base dir does not exist, and no -p option given
    var baseDir = path.dirname(dir);
    if (!fs.existsSync(baseDir) && !options.fullpath) {
      common.error('no such file or directory: ' + baseDir, true);
      return; // skip dir
    }

    if (options.fullpath)
      mkdirSyncRecursive(dir);
    else
      fs.mkdirSync(dir, parseInt('0777', 8));
  });
} // mkdir
module.exports = _mkdir;
var fs = require('fs');
var path = require('path');
var common = require('./common');

//@
//@ ### mv(source [, source ...], dest')
//@ ### mv(source_array, dest')
//@ Available options:
//@
//@ + `f`: force
//@
//@ Examples:
//@
//@ ```javascript
//@ mv('-f', 'file', 'dir/');
//@ mv('file1', 'file2', 'dir/');
//@ mv(['file1', 'file2'], 'dir/'); // same as above
//@ ```
//@
//@ Moves files. The wildcard `*` is accepted.
function _mv(options, sources, dest) {
  options = common.parseOptions(options, {
    'f': 'force'
  });

  // Get sources, dest
  if (arguments.length < 3) {
    common.error('missing <source> and/or <dest>');
  } else if (arguments.length > 3) {
    sources = [].slice.call(arguments, 1, arguments.length - 1);
    dest = arguments[arguments.length - 1];
  } else if (typeof sources === 'string') {
    sources = [sources];
  } else if ('length' in sources) {
    sources = sources; // no-op for array
  } else {
    common.error('invalid arguments');
  }

  sources = common.expand(sources);

  var exists = fs.existsSync(dest),
      stats = exists && fs.statSync(dest);

  // Dest is not existing dir, but multiple sources given
  if ((!exists || !stats.isDirectory()) && sources.length > 1)
    common.error('dest is not a directory (too many sources)');

  // Dest is an existing file, but no -f given
  if (exists && stats.isFile() && !options.force)
    common.error('dest file already exists: ' + dest);

  sources.forEach(function(src) {
    if (!fs.existsSync(src)) {
      common.error('no such file or directory: '+src, true);
      return; // skip file
    }

    // If here, src exists

    // When copying to '/path/dir':
    //    thisDest = '/path/dir/file1'
    var thisDest = dest;
    if (fs.existsSync(dest) && fs.statSync(dest).isDirectory())
      thisDest = path.normalize(dest + '/' + path.basename(src));

    if (fs.existsSync(thisDest) && !options.force) {
      common.error('dest file already exists: ' + thisDest, true);
      return; // skip file
    }

    if (path.resolve(src) === path.dirname(path.resolve(thisDest))) {
      common.error('cannot move to self: '+src, true);
      return; // skip file
    }

    fs.renameSync(src, thisDest);
  }); // forEach(src)
} // mv
module.exports = _mv;
// see dirs.js// see dirs.jsvar path = require('path');
var common = require('./common');

//@
//@ ### pwd()
//@ Returns the current directory.
function _pwd(options) {
  var pwd = path.resolve(process.cwd());
  return common.ShellString(pwd);
}
module.exports = _pwd;
var common = require('./common');
var fs = require('fs');

// Recursively removes 'dir'
// Adapted from https://github.com/ryanmcgrath/wrench-js
//
// Copyright (c) 2010 Ryan McGrath
// Copyright (c) 2012 Artur Adib
//
// Licensed under the MIT License
// http://www.opensource.org/licenses/mit-license.php
function rmdirSyncRecursive(dir, force) {
  var files;

  files = fs.readdirSync(dir);

  // Loop through and delete everything in the sub-tree after checking it
  for(var i = 0; i < files.length; i++) {
    var file = dir + "/" + files[i],
        currFile = fs.lstatSync(file);

    if(currFile.isDirectory()) { // Recursive function back to the beginning
      rmdirSyncRecursive(file, force);
    }

    else if(currFile.isSymbolicLink()) { // Unlink symlinks
      if (force || isWriteable(file)) {
        try {
          common.unlinkSync(file);
        } catch (e) {
          common.error('could not remove file (code '+e.code+'): ' + file, true);
        }
      }
    }

    else // Assume it's a file - perhaps a try/catch belongs here?
      if (force || isWriteable(file)) {
        try {
          common.unlinkSync(file);
        } catch (e) {
          common.error('could not remove file (code '+e.code+'): ' + file, true);
        }
      }
  }

  // Now that we know everything in the sub-tree has been deleted, we can delete the main directory.
  // Huzzah for the shopkeep.

  var result;
  try {
    // Retry on windows, sometimes it takes a little time before all the files in the directory are gone
    var start = Date.now();
    while (true) {
      try {
        result = fs.rmdirSync(dir);
        if (fs.existsSync(dir)) throw { code: "EAGAIN" }
        break;
      } catch(er) {
        // In addition to error codes, also check if the directory still exists and loop again if true
        if (process.platform === "win32" && (er.code === "ENOTEMPTY" || er.code === "EBUSY" || er.code === "EPERM" || er.code === "EAGAIN")) {
          if (Date.now() - start > 1000) throw er;
        } else if (er.code === "ENOENT") {
          // Directory did not exist, deletion was successful
          break;
        } else {
          throw er;
        }
      }
    }
  } catch(e) {
    common.error('could not remove directory (code '+e.code+'): ' + dir, true);
  }

  return result;
} // rmdirSyncRecursive

// Hack to determine if file has write permissions for current user
// Avoids having to check user, group, etc, but it's probably slow
function isWriteable(file) {
  var writePermission = true;
  try {
    var __fd = fs.openSync(file, 'a');
    fs.closeSync(__fd);
  } catch(e) {
    writePermission = false;
  }

  return writePermission;
}

//@
//@ ### rm([options ,] file [, file ...])
//@ ### rm([options ,] file_array)
//@ Available options:
//@
//@ + `-f`: force
//@ + `-r, -R`: recursive
//@
//@ Examples:
//@
//@ ```javascript
//@ rm('-rf', '/tmp/*');
//@ rm('some_file.txt', 'another_file.txt');
//@ rm(['some_file.txt', 'another_file.txt']); // same as above
//@ ```
//@
//@ Removes files. The wildcard `*` is accepted.
function _rm(options, files) {
  options = common.parseOptions(options, {
    'f': 'force',
    'r': 'recursive',
    'R': 'recursive'
  });
  if (!files)
    common.error('no paths given');

  if (typeof files === 'string')
    files = [].slice.call(arguments, 1);
  // if it's array leave it as it is

  files = common.expand(files);

  files.forEach(function(file) {
    if (!fs.existsSync(file)) {
      // Path does not exist, no force flag given
      if (!options.force)
        common.error('no such file or directory: '+file, true);

      return; // skip file
    }

    // If here, path exists

    var stats = fs.lstatSync(file);
    if (stats.isFile() || stats.isSymbolicLink()) {

      // Do not check for file writing permissions
      if (options.force) {
        common.unlinkSync(file);
        return;
      }

      if (isWriteable(file))
        common.unlinkSync(file);
      else
        common.error('permission denied: '+file, true);

      return;
    } // simple file

    // Path is an existing directory, but no -r flag given
    if (stats.isDirectory() && !options.recursive) {
      common.error('path is a directory', true);
      return; // skip path
    }

    // Recursively remove existing directory
    if (stats.isDirectory() && options.recursive) {
      rmdirSyncRecursive(file, options.force);
    }
  }); // forEach(file)
} // rm
module.exports = _rm;
var common = require('./common');
var fs = require('fs');

//@
//@ ### sed([options ,] search_regex, replacement, file)
//@ Available options:
//@
//@ + `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_
//@
//@ Examples:
//@
//@ ```javascript
//@ sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js');
//@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js');
//@ ```
//@
//@ Reads an input string from `file` and performs a JavaScript `replace()` on the input
//@ using the given search regex and replacement string or function. Returns the new string after replacement.
function _sed(options, regex, replacement, file) {
  options = common.parseOptions(options, {
    'i': 'inplace'
  });

  if (typeof replacement === 'string' || typeof replacement === 'function')
    replacement = replacement; // no-op
  else if (typeof replacement === 'number')
    replacement = replacement.toString(); // fallback
  else
    common.error('invalid replacement string');

  if (!file)
    common.error('no file given');

  if (!fs.existsSync(file))
    common.error('no such file or directory: ' + file);

  var result = fs.readFileSync(file, 'utf8').replace(regex, replacement);
  if (options.inplace)
    fs.writeFileSync(file, result, 'utf8');

  return common.ShellString(result);
}
module.exports = _sed;
var common = require('./common');
var os = require('os');
var fs = require('fs');

// Returns false if 'dir' is not a writeable directory, 'dir' otherwise
function writeableDir(dir) {
  if (!dir || !fs.existsSync(dir))
    return false;

  if (!fs.statSync(dir).isDirectory())
    return false;

  var testFile = dir+'/'+common.randomFileName();
  try {
    fs.writeFileSync(testFile, ' ');
    common.unlinkSync(testFile);
    return dir;
  } catch (e) {
    return false;
  }
}


//@
//@ ### tempdir()
//@
//@ Examples:
//@
//@ ```javascript
//@ var tmp = tempdir(); // "/tmp" for most *nix platforms
//@ ```
//@
//@ Searches and returns string containing a writeable, platform-dependent temporary directory.
//@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir).
function _tempDir() {
  var state = common.state;
  if (state.tempDir)
    return state.tempDir; // from cache

  state.tempDir = writeableDir(os.tempDir && os.tempDir()) || // node 0.8+
                  writeableDir(process.env['TMPDIR']) ||
                  writeableDir(process.env['TEMP']) ||
                  writeableDir(process.env['TMP']) ||
                  writeableDir(process.env['Wimp$ScrapDir']) || // RiscOS
                  writeableDir('C:\\TEMP') || // Windows
                  writeableDir('C:\\TMP') || // Windows
                  writeableDir('\\TEMP') || // Windows
                  writeableDir('\\TMP') || // Windows
                  writeableDir('/tmp') ||
                  writeableDir('/var/tmp') ||
                  writeableDir('/usr/tmp') ||
                  writeableDir('.'); // last resort

  return state.tempDir;
}
module.exports = _tempDir;
var common = require('./common');
var fs = require('fs');

//@
//@ ### test(expression)
//@ Available expression primaries:
//@
//@ + `'-b', 'path'`: true if path is a block device
//@ + `'-c', 'path'`: true if path is a character device
//@ + `'-d', 'path'`: true if path is a directory
//@ + `'-e', 'path'`: true if path exists
//@ + `'-f', 'path'`: true if path is a regular file
//@ + `'-L', 'path'`: true if path is a symboilc link
//@ + `'-p', 'path'`: true if path is a pipe (FIFO)
//@ + `'-S', 'path'`: true if path is a socket
//@
//@ Examples:
//@
//@ ```javascript
//@ if (test('-d', path)) { /* do something with dir */ };
//@ if (!test('-f', path)) continue; // skip if it's a regular file
//@ ```
//@
//@ Evaluates expression using the available primaries and returns corresponding value.
function _test(options, path) {
  if (!path)
    common.error('no path given');

  // hack - only works with unary primaries
  options = common.parseOptions(options, {
    'b': 'block',
    'c': 'character',
    'd': 'directory',
    'e': 'exists',
    'f': 'file',
    'L': 'link',
    'p': 'pipe',
    'S': 'socket'
  });

  var canInterpret = false;
  for (var key in options)
    if (options[key] === true) {
      canInterpret = true;
      break;
    }

  if (!canInterpret)
    common.error('could not interpret expression');

  if (options.link) {
    try {
      return fs.lstatSync(path).isSymbolicLink();
    } catch(e) {
      return false;
    }
  }

  if (!fs.existsSync(path))
    return false;

  if (options.exists)
    return true;

  var stats = fs.statSync(path);

  if (options.block)
    return stats.isBlockDevice();

  if (options.character)
    return stats.isCharacterDevice();

  if (options.directory)
    return stats.isDirectory();

  if (options.file)
    return stats.isFile();

  if (options.pipe)
    return stats.isFIFO();

  if (options.socket)
    return stats.isSocket();
} // test
module.exports = _test;
var common = require('./common');
var fs = require('fs');
var path = require('path');

//@
//@ ### 'string'.to(file)
//@
//@ Examples:
//@
//@ ```javascript
//@ cat('input.txt').to('output.txt');
//@ ```
//@
//@ Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as
//@ those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_
function _to(options, file) {
  if (!file)
    common.error('wrong arguments');

  if (!fs.existsSync( path.dirname(file) ))
      common.error('no such file or directory: ' + path.dirname(file));

  try {
    fs.writeFileSync(file, this.toString(), 'utf8');
  } catch(e) {
    common.error('could not write to file (code '+e.code+'): '+file, true);
  }
}
module.exports = _to;
var common = require('./common');
var fs = require('fs');
var path = require('path');

//@
//@ ### 'string'.toEnd(file)
//@
//@ Examples:
//@
//@ ```javascript
//@ cat('input.txt').toEnd('output.txt');
//@ ```
//@
//@ Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as
//@ those returned by `cat`, `grep`, etc).
function _toEnd(options, file) {
  if (!file)
    common.error('wrong arguments');

  if (!fs.existsSync( path.dirname(file) ))
      common.error('no such file or directory: ' + path.dirname(file));

  try {
    fs.appendFileSync(file, this.toString(), 'utf8');
  } catch(e) {
    common.error('could not append to file (code '+e.code+'): '+file, true);
  }
}
module.exports = _toEnd;
var common = require('./common');
var fs = require('fs');
var path = require('path');

// Cross-platform method for splitting environment PATH variables
function splitPath(p) {
  for (i=1;i<2;i++) {}

  if (!p)
    return [];

  if (common.platform === 'win')
    return p.split(';');
  else
    return p.split(':');
}

function checkPath(path) {
  return fs.existsSync(path) && fs.statSync(path).isDirectory() == false;
}

//@
//@ ### which(command)
//@
//@ Examples:
//@
//@ ```javascript
//@ var nodeExec = which('node');
//@ ```
//@
//@ Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions.
//@ Returns string containing the absolute path to the command.
function _which(options, cmd) {
  if (!cmd)
    common.error('must specify command');

  var pathEnv = process.env.path || process.env.Path || process.env.PATH,
      pathArray = splitPath(pathEnv),
      where = null;

  // No relative/absolute paths provided?
  if (cmd.search(/\//) === -1) {
    // Search for command in PATH
    pathArray.forEach(function(dir) {
      if (where)
        return; // already found it

      var attempt = path.resolve(dir + '/' + cmd);
      if (checkPath(attempt)) {
        where = attempt;
        return;
      }

      if (common.platform === 'win') {
        var baseAttempt = attempt;
        attempt = baseAttempt + '.exe';
        if (checkPath(attempt)) {
          where = attempt;
          return;
        }
        attempt = baseAttempt + '.cmd';
        if (checkPath(attempt)) {
          where = attempt;
          return;
        }
        attempt = baseAttempt + '.bat';
        if (checkPath(attempt)) {
          where = attempt;
          return;
        }
      } // if 'win'
    });
  }

  // Command not found anywhere?
  if (!checkPath(cmd) && !where)
    return null;

  where = where || path.resolve(cmd);

  return common.ShellString(where);
}
module.exports = _which;
#!/usr/bin/env node
require('../global');

echo('Appending docs to README.md');

cd(__dirname + '/..');

// Extract docs from shell.js
var docs = grep('//@', 'shell.js');

docs = docs.replace(/\/\/\@include (.+)/g, function(match, path) {
  var file = path.match('.js$') ? path : path+'.js';
  return grep('//@', file);
});

// Remove '//@'
docs = docs.replace(/\/\/\@ ?/g, '');
// Append docs to README
sed('-i', /## Command reference(.|\n)*/, '## Command reference\n\n' + docs, 'README.md');

echo('All done.');
#!/usr/bin/env node
require('../global');

var path = require('path');

var failed = false;

//
// Lint
//
JSHINT_BIN = './node_modules/jshint/bin/jshint';
cd(__dirname + '/..');

if (!test('-f', JSHINT_BIN)) {
  echo('JSHint not found. Run `npm install` in the root dir first.');
  exit(1);
}

if (exec(JSHINT_BIN + ' *.js test/*.js').code !== 0) {
  failed = true;
  echo('*** JSHINT FAILED! (return code != 0)');
  echo();
} else {
  echo('All JSHint tests passed');
  echo();
}

//
// Unit tests
//
cd(__dirname + '/../test');
ls('*.js').forEach(function(file) {
  echo('Running test:', file);
  if (exec('node ' + file).code !== 123) { // 123 avoids false positives (e.g. premature exit)
    failed = true;
    echo('*** TEST FAILED! (missing exit code "123")');
    echo();
  }
});

if (failed) {
  echo();
  echo('*******************************************************');
  echo('WARNING: Some tests did not pass!');
  echo('*******************************************************');
  exit(1);
} else {
  echo();
  echo('All tests passed.');
}
#!/usr/bin/env node
require('../global');

if (process.argv.length < 3) {
  console.log('ShellJS: missing argument (script name)');
  console.log();
  process.exit(1);
}

var args,
  scriptName = process.argv[2];
env['NODE_PATH'] = __dirname + '/../..';

if (!scriptName.match(/\.js/) && !scriptName.match(/\.coffee/)) {
  if (test('-f', scriptName + '.js'))
    scriptName += '.js';
  if (test('-f', scriptName + '.coffee'))
    scriptName += '.coffee';
}

if (!test('-f', scriptName)) {
  console.log('ShellJS: script not found ('+scriptName+')');
  console.log();
  process.exit(1);
}

args = process.argv.slice(3);

for (var i = 0, l = args.length; i < l; i++) {
  if (args[i][0] !== "-"){
    args[i] = '"' + args[i] + '"'; // fixes arguments with multiple words
  }
}

if (scriptName.match(/\.coffee$/)) {
  //
  // CoffeeScript
  //
  if (which('coffee')) {
    exec('coffee ' + scriptName + ' ' + args.join(' '), { async: true });
  } else {
    console.log('ShellJS: CoffeeScript interpreter not found');
    console.log();
    process.exit(1);
  }
} else {
  //
  // JavaScript
  //
  exec('node ' + scriptName + ' ' + args.join(' '), { async: true });
}
The ISC License

Copyright (c) 2015, Contributors

Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice
appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
// Note: since nyc uses this module to output coverage, any lines
// that are in the direct sync flow of nyc's outputCoverage are
// ignored, since we can never get coverage for them.
var assert = require('assert')
var signals = require('./signals.js')
var isWin = /^win/i.test(process.platform)

var EE = require('events')
/* istanbul ignore if */
if (typeof EE !== 'function') {
  EE = EE.EventEmitter
}

var emitter
if (process.__signal_exit_emitter__) {
  emitter = process.__signal_exit_emitter__
} else {
  emitter = process.__signal_exit_emitter__ = new EE()
  emitter.count = 0
  emitter.emitted = {}
}

// Because this emitter is a global, we have to check to see if a
// previous version of this library failed to enable infinite listeners.
// I know what you're about to say.  But literally everything about
// signal-exit is a compromise with evil.  Get used to it.
if (!emitter.infinite) {
  emitter.setMaxListeners(Infinity)
  emitter.infinite = true
}

module.exports = function (cb, opts) {
  assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler')

  if (loaded === false) {
    load()
  }

  var ev = 'exit'
  if (opts && opts.alwaysLast) {
    ev = 'afterexit'
  }

  var remove = function () {
    emitter.removeListener(ev, cb)
    if (emitter.listeners('exit').length === 0 &&
        emitter.listeners('afterexit').length === 0) {
      unload()
    }
  }
  emitter.on(ev, cb)

  return remove
}

module.exports.unload = unload
function unload () {
  if (!loaded) {
    return
  }
  loaded = false

  signals.forEach(function (sig) {
    try {
      process.removeListener(sig, sigListeners[sig])
    } catch (er) {}
  })
  process.emit = originalProcessEmit
  process.reallyExit = originalProcessReallyExit
  emitter.count -= 1
}

function emit (event, code, signal) {
  if (emitter.emitted[event]) {
    return
  }
  emitter.emitted[event] = true
  emitter.emit(event, code, signal)
}

// { <signal>: <listener fn>, ... }
var sigListeners = {}
signals.forEach(function (sig) {
  sigListeners[sig] = function listener () {
    // If there are no other listeners, an exit is coming!
    // Simplest way: remove us and then re-send the signal.
    // We know that this will kill the process, so we can
    // safely emit now.
    var listeners = process.listeners(sig)
    if (listeners.length === emitter.count) {
      unload()
      emit('exit', null, sig)
      /* istanbul ignore next */
      emit('afterexit', null, sig)
      /* istanbul ignore next */
      if (isWin && sig === 'SIGHUP') {
        // "SIGHUP" throws an `ENOSYS` error on Windows,
        // so use a supported signal instead
        sig = 'SIGINT'
      }
      process.kill(process.pid, sig)
    }
  }
})

module.exports.signals = function () {
  return signals
}

module.exports.load = load

var loaded = false

function load () {
  if (loaded) {
    return
  }
  loaded = true

  // This is the number of onSignalExit's that are in play.
  // It's important so that we can count the correct number of
  // listeners on signals, and don't wait for the other one to
  // handle it instead of us.
  emitter.count += 1

  signals = signals.filter(function (sig) {
    try {
      process.on(sig, sigListeners[sig])
      return true
    } catch (er) {
      return false
    }
  })

  process.emit = processEmit
  process.reallyExit = processReallyExit
}

var originalProcessReallyExit = process.reallyExit
function processReallyExit (code) {
  process.exitCode = code || 0
  emit('exit', process.exitCode, null)
  /* istanbul ignore next */
  emit('afterexit', process.exitCode, null)
  /* istanbul ignore next */
  originalProcessReallyExit.call(process, process.exitCode)
}

var originalProcessEmit = process.emit
function processEmit (ev, arg) {
  if (ev === 'exit') {
    if (arg !== undefined) {
      process.exitCode = arg
    }
    var ret = originalProcessEmit.apply(this, arguments)
    emit('exit', process.exitCode, null)
    /* istanbul ignore next */
    emit('afterexit', process.exitCode, null)
    return ret
  } else {
    return originalProcessEmit.apply(this, arguments)
  }
}
{
  "author": {
    "name": "Ben Coe",
    "email": "ben@npmjs.com"
  },
  "deprecated": false,
  "description": "when you want to fire an event no matter how a process exits.",
  "devDependencies": {
    "chai": "^3.5.0",
    "coveralls": "^2.11.10",
    "nyc": "^8.1.0",
    "standard": "^8.1.0",
    "standard-version": "^2.3.0",
    "tap": "^8.0.1"
  },
  "files": [
    "index.js",
    "signals.js"
  ],
  "homepage": "https://github.com/tapjs/signal-exit",
  "license": "ISC",
  "main": "index.js",
  "name": "signal-exit",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/tapjs/signal-exit.git"
  },
  "version": "3.0.3"
}// This is not the set of all possible signals.
//
// It IS, however, the set of all signals that trigger
// an exit on either Linux or BSD systems.  Linux is a
// superset of the signal names supported on BSD, and
// the unknown signals just fail to register, so we can
// catch that easily enough.
//
// Don't bother with SIGKILL.  It's uncatchable, which
// means that we can't fire any callbacks anyway.
//
// If a user does happen to register a handler on a non-
// fatal signal like SIGWINCH or something, and then
// exit, it'll end up firing `process.emit('exit')`, so
// the handler will be fired anyway.
//
// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised
// artificially, inherently leave the process in a
// state from which it is not safe to try and enter JS
// listeners.
module.exports = [
  'SIGABRT',
  'SIGALRM',
  'SIGHUP',
  'SIGINT',
  'SIGTERM'
]

if (process.platform !== 'win32') {
  module.exports.push(
    'SIGVTALRM',
    'SIGXCPU',
    'SIGXFSZ',
    'SIGUSR2',
    'SIGTRAP',
    'SIGSYS',
    'SIGQUIT',
    'SIGIOT'
    // should detect profiler and enable/disable accordingly.
    // see #21
    // 'SIGPROF'
  )
}

if (process.platform === 'linux') {
  module.exports.push(
    'SIGIO',
    'SIGPOLL',
    'SIGPWR',
    'SIGSTKFLT',
    'SIGUNUSED'
  )
}

Copyright (c) 2009-2011, Mozilla Foundation and contributors
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the names of the Mozilla Foundation nor the names of project
  contributors may be used to endorse or promote products derived from this
  software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
  "author": {
    "name": "Nick Fitzgerald",
    "email": "nfitzgerald@mozilla.com"
  },
  "deprecated": false,
  "description": "Generates and consumes source maps",
  "devDependencies": {
    "doctoc": "^0.15.0",
    "webpack": "^1.12.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "source-map.js",
    "source-map.d.ts",
    "lib/",
    "dist/source-map.debug.js",
    "dist/source-map.js",
    "dist/source-map.min.js",
    "dist/source-map.min.js.map"
  ],
  "homepage": "https://github.com/mozilla/source-map",
  "license": "BSD-3-Clause",
  "main": "./source-map.js",
  "name": "source-map",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/mozilla/source-map.git"
  },
  "typings": "source-map",
  "version": "0.6.1"
}/*
 * Copyright 2009-2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE.txt or:
 * http://opensource.org/licenses/BSD-3-Clause
 */
exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;
exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;
exports.SourceNode = require('./lib/source-node').SourceNode;
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var util = require('./util');
var has = Object.prototype.hasOwnProperty;
var hasNativeMap = typeof Map !== "undefined";

/**
 * A data structure which is a combination of an array and a set. Adding a new
 * member is O(1), testing for membership is O(1), and finding the index of an
 * element is O(1). Removing elements from the set is not supported. Only
 * strings are supported for membership.
 */
function ArraySet() {
  this._array = [];
  this._set = hasNativeMap ? new Map() : Object.create(null);
}

/**
 * Static method for creating ArraySet instances from an existing array.
 */
ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
  var set = new ArraySet();
  for (var i = 0, len = aArray.length; i < len; i++) {
    set.add(aArray[i], aAllowDuplicates);
  }
  return set;
};

/**
 * Return how many unique items are in this ArraySet. If duplicates have been
 * added, than those do not count towards the size.
 *
 * @returns Number
 */
ArraySet.prototype.size = function ArraySet_size() {
  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
};

/**
 * Add the given string to this set.
 *
 * @param String aStr
 */
ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
  var idx = this._array.length;
  if (!isDuplicate || aAllowDuplicates) {
    this._array.push(aStr);
  }
  if (!isDuplicate) {
    if (hasNativeMap) {
      this._set.set(aStr, idx);
    } else {
      this._set[sStr] = idx;
    }
  }
};

/**
 * Is the given string a member of this set?
 *
 * @param String aStr
 */
ArraySet.prototype.has = function ArraySet_has(aStr) {
  if (hasNativeMap) {
    return this._set.has(aStr);
  } else {
    var sStr = util.toSetString(aStr);
    return has.call(this._set, sStr);
  }
};

/**
 * What is the index of the given string in the array?
 *
 * @param String aStr
 */
ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
  if (hasNativeMap) {
    var idx = this._set.get(aStr);
    if (idx >= 0) {
        return idx;
    }
  } else {
    var sStr = util.toSetString(aStr);
    if (has.call(this._set, sStr)) {
      return this._set[sStr];
    }
  }

  throw new Error('"' + aStr + '" is not in the set.');
};

/**
 * What is the element at the given index?
 *
 * @param Number aIdx
 */
ArraySet.prototype.at = function ArraySet_at(aIdx) {
  if (aIdx >= 0 && aIdx < this._array.length) {
    return this._array[aIdx];
  }
  throw new Error('No element indexed by ' + aIdx);
};

/**
 * Returns the array representation of this set (which has the proper indices
 * indicated by indexOf). Note that this is a copy of the internal array used
 * for storing the members so that no one can mess with internal state.
 */
ArraySet.prototype.toArray = function ArraySet_toArray() {
  return this._array.slice();
};

exports.ArraySet = ArraySet;
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 *
 * Based on the Base 64 VLQ implementation in Closure Compiler:
 * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
 *
 * Copyright 2011 The Closure Compiler Authors. All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following
 *    disclaimer in the documentation and/or other materials provided
 *    with the distribution.
 *  * Neither the name of Google Inc. nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

var base64 = require('./base64');

// A single base 64 digit can contain 6 bits of data. For the base 64 variable
// length quantities we use in the source map spec, the first bit is the sign,
// the next four bits are the actual value, and the 6th bit is the
// continuation bit. The continuation bit tells us whether there are more
// digits in this value following this digit.
//
//   Continuation
//   |    Sign
//   |    |
//   V    V
//   101011

var VLQ_BASE_SHIFT = 5;

// binary: 100000
var VLQ_BASE = 1 << VLQ_BASE_SHIFT;

// binary: 011111
var VLQ_BASE_MASK = VLQ_BASE - 1;

// binary: 100000
var VLQ_CONTINUATION_BIT = VLQ_BASE;

/**
 * Converts from a two-complement value to a value where the sign bit is
 * placed in the least significant bit.  For example, as decimals:
 *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
 *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
 */
function toVLQSigned(aValue) {
  return aValue < 0
    ? ((-aValue) << 1) + 1
    : (aValue << 1) + 0;
}

/**
 * Converts to a two-complement value from a value where the sign bit is
 * placed in the least significant bit.  For example, as decimals:
 *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1
 *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2
 */
function fromVLQSigned(aValue) {
  var isNegative = (aValue & 1) === 1;
  var shifted = aValue >> 1;
  return isNegative
    ? -shifted
    : shifted;
}

/**
 * Returns the base 64 VLQ encoded value.
 */
exports.encode = function base64VLQ_encode(aValue) {
  var encoded = "";
  var digit;

  var vlq = toVLQSigned(aValue);

  do {
    digit = vlq & VLQ_BASE_MASK;
    vlq >>>= VLQ_BASE_SHIFT;
    if (vlq > 0) {
      // There are still more digits in this value, so we must make sure the
      // continuation bit is marked.
      digit |= VLQ_CONTINUATION_BIT;
    }
    encoded += base64.encode(digit);
  } while (vlq > 0);

  return encoded;
};

/**
 * Decodes the next base 64 VLQ value from the given string and returns the
 * value and the rest of the string via the out parameter.
 */
exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
  var strLen = aStr.length;
  var result = 0;
  var shift = 0;
  var continuation, digit;

  do {
    if (aIndex >= strLen) {
      throw new Error("Expected more digits in base 64 VLQ value.");
    }

    digit = base64.decode(aStr.charCodeAt(aIndex++));
    if (digit === -1) {
      throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
    }

    continuation = !!(digit & VLQ_CONTINUATION_BIT);
    digit &= VLQ_BASE_MASK;
    result = result + (digit << shift);
    shift += VLQ_BASE_SHIFT;
  } while (continuation);

  aOutParam.value = fromVLQSigned(result);
  aOutParam.rest = aIndex;
};
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');

/**
 * Encode an integer in the range of 0 to 63 to a single base 64 digit.
 */
exports.encode = function (number) {
  if (0 <= number && number < intToCharMap.length) {
    return intToCharMap[number];
  }
  throw new TypeError("Must be between 0 and 63: " + number);
};

/**
 * Decode a single base 64 character code digit to an integer. Returns -1 on
 * failure.
 */
exports.decode = function (charCode) {
  var bigA = 65;     // 'A'
  var bigZ = 90;     // 'Z'

  var littleA = 97;  // 'a'
  var littleZ = 122; // 'z'

  var zero = 48;     // '0'
  var nine = 57;     // '9'

  var plus = 43;     // '+'
  var slash = 47;    // '/'

  var littleOffset = 26;
  var numberOffset = 52;

  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
  if (bigA <= charCode && charCode <= bigZ) {
    return (charCode - bigA);
  }

  // 26 - 51: abcdefghijklmnopqrstuvwxyz
  if (littleA <= charCode && charCode <= littleZ) {
    return (charCode - littleA + littleOffset);
  }

  // 52 - 61: 0123456789
  if (zero <= charCode && charCode <= nine) {
    return (charCode - zero + numberOffset);
  }

  // 62: +
  if (charCode == plus) {
    return 62;
  }

  // 63: /
  if (charCode == slash) {
    return 63;
  }

  // Invalid base64 digit.
  return -1;
};
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

exports.GREATEST_LOWER_BOUND = 1;
exports.LEAST_UPPER_BOUND = 2;

/**
 * Recursive implementation of binary search.
 *
 * @param aLow Indices here and lower do not contain the needle.
 * @param aHigh Indices here and higher do not contain the needle.
 * @param aNeedle The element being searched for.
 * @param aHaystack The non-empty array being searched.
 * @param aCompare Function which takes two elements and returns -1, 0, or 1.
 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
 *     closest element that is smaller than or greater than the one we are
 *     searching for, respectively, if the exact element cannot be found.
 */
function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
  // This function terminates when one of the following is true:
  //
  //   1. We find the exact element we are looking for.
  //
  //   2. We did not find the exact element, but we can return the index of
  //      the next-closest element.
  //
  //   3. We did not find the exact element, and there is no next-closest
  //      element than the one we are searching for, so we return -1.
  var mid = Math.floor((aHigh - aLow) / 2) + aLow;
  var cmp = aCompare(aNeedle, aHaystack[mid], true);
  if (cmp === 0) {
    // Found the element we are looking for.
    return mid;
  }
  else if (cmp > 0) {
    // Our needle is greater than aHaystack[mid].
    if (aHigh - mid > 1) {
      // The element is in the upper half.
      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
    }

    // The exact needle element was not found in this haystack. Determine if
    // we are in termination case (3) or (2) and return the appropriate thing.
    if (aBias == exports.LEAST_UPPER_BOUND) {
      return aHigh < aHaystack.length ? aHigh : -1;
    } else {
      return mid;
    }
  }
  else {
    // Our needle is less than aHaystack[mid].
    if (mid - aLow > 1) {
      // The element is in the lower half.
      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
    }

    // we are in termination case (3) or (2) and return the appropriate thing.
    if (aBias == exports.LEAST_UPPER_BOUND) {
      return mid;
    } else {
      return aLow < 0 ? -1 : aLow;
    }
  }
}

/**
 * This is an implementation of binary search which will always try and return
 * the index of the closest element if there is no exact hit. This is because
 * mappings between original and generated line/col pairs are single points,
 * and there is an implicit region between each of them, so a miss just means
 * that you aren't on the very start of a region.
 *
 * @param aNeedle The element you are looking for.
 * @param aHaystack The array that is being searched.
 * @param aCompare A function which takes the needle and an element in the
 *     array and returns -1, 0, or 1 depending on whether the needle is less
 *     than, equal to, or greater than the element, respectively.
 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
 *     closest element that is smaller than or greater than the one we are
 *     searching for, respectively, if the exact element cannot be found.
 *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
 */
exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
  if (aHaystack.length === 0) {
    return -1;
  }

  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);
  if (index < 0) {
    return -1;
  }

  // We have found either the exact element, or the next-closest element than
  // the one we are searching for. However, there may be more than one such
  // element. Make sure we always return the smallest of these.
  while (index - 1 >= 0) {
    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
      break;
    }
    --index;
  }

  return index;
};
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2014 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var util = require('./util');

/**
 * Determine whether mappingB is after mappingA with respect to generated
 * position.
 */
function generatedPositionAfter(mappingA, mappingB) {
  // Optimized for most common case
  var lineA = mappingA.generatedLine;
  var lineB = mappingB.generatedLine;
  var columnA = mappingA.generatedColumn;
  var columnB = mappingB.generatedColumn;
  return lineB > lineA || lineB == lineA && columnB >= columnA ||
         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
}

/**
 * A data structure to provide a sorted view of accumulated mappings in a
 * performance conscious manner. It trades a neglibable overhead in general
 * case for a large speedup in case of mappings being added in order.
 */
function MappingList() {
  this._array = [];
  this._sorted = true;
  // Serves as infimum
  this._last = {generatedLine: -1, generatedColumn: 0};
}

/**
 * Iterate through internal items. This method takes the same arguments that
 * `Array.prototype.forEach` takes.
 *
 * NOTE: The order of the mappings is NOT guaranteed.
 */
MappingList.prototype.unsortedForEach =
  function MappingList_forEach(aCallback, aThisArg) {
    this._array.forEach(aCallback, aThisArg);
  };

/**
 * Add the given source mapping.
 *
 * @param Object aMapping
 */
MappingList.prototype.add = function MappingList_add(aMapping) {
  if (generatedPositionAfter(this._last, aMapping)) {
    this._last = aMapping;
    this._array.push(aMapping);
  } else {
    this._sorted = false;
    this._array.push(aMapping);
  }
};

/**
 * Returns the flat, sorted array of mappings. The mappings are sorted by
 * generated position.
 *
 * WARNING: This method returns internal data without copying, for
 * performance. The return value must NOT be mutated, and should be treated as
 * an immutable borrow. If you want to take ownership, you must make your own
 * copy.
 */
MappingList.prototype.toArray = function MappingList_toArray() {
  if (!this._sorted) {
    this._array.sort(util.compareByGeneratedPositionsInflated);
    this._sorted = true;
  }
  return this._array;
};

exports.MappingList = MappingList;
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

// It turns out that some (most?) JavaScript engines don't self-host
// `Array.prototype.sort`. This makes sense because C++ will likely remain
// faster than JS when doing raw CPU-intensive sorting. However, when using a
// custom comparator function, calling back and forth between the VM's C++ and
// JIT'd JS is rather slow *and* loses JIT type information, resulting in
// worse generated code for the comparator function than would be optimal. In
// fact, when sorting with a comparator, these costs outweigh the benefits of
// sorting in C++. By using our own JS-implemented Quick Sort (below), we get
// a ~3500ms mean speed-up in `bench/bench.html`.

/**
 * Swap the elements indexed by `x` and `y` in the array `ary`.
 *
 * @param {Array} ary
 *        The array.
 * @param {Number} x
 *        The index of the first item.
 * @param {Number} y
 *        The index of the second item.
 */
function swap(ary, x, y) {
  var temp = ary[x];
  ary[x] = ary[y];
  ary[y] = temp;
}

/**
 * Returns a random integer within the range `low .. high` inclusive.
 *
 * @param {Number} low
 *        The lower bound on the range.
 * @param {Number} high
 *        The upper bound on the range.
 */
function randomIntInRange(low, high) {
  return Math.round(low + (Math.random() * (high - low)));
}

/**
 * The Quick Sort algorithm.
 *
 * @param {Array} ary
 *        An array to sort.
 * @param {function} comparator
 *        Function to use to compare two items.
 * @param {Number} p
 *        Start index of the array
 * @param {Number} r
 *        End index of the array
 */
function doQuickSort(ary, comparator, p, r) {
  // If our lower bound is less than our upper bound, we (1) partition the
  // array into two pieces and (2) recurse on each half. If it is not, this is
  // the empty array and our base case.

  if (p < r) {
    // (1) Partitioning.
    //
    // The partitioning chooses a pivot between `p` and `r` and moves all
    // elements that are less than or equal to the pivot to the before it, and
    // all the elements that are greater than it after it. The effect is that
    // once partition is done, the pivot is in the exact place it will be when
    // the array is put in sorted order, and it will not need to be moved
    // again. This runs in O(n) time.

    // Always choose a random pivot so that an input array which is reverse
    // sorted does not cause O(n^2) running time.
    var pivotIndex = randomIntInRange(p, r);
    var i = p - 1;

    swap(ary, pivotIndex, r);
    var pivot = ary[r];

    // Immediately after `j` is incremented in this loop, the following hold
    // true:
    //
    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.
    //
    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
    for (var j = p; j < r; j++) {
      if (comparator(ary[j], pivot) <= 0) {
        i += 1;
        swap(ary, i, j);
      }
    }

    swap(ary, i + 1, j);
    var q = i + 1;

    // (2) Recurse on each half.

    doQuickSort(ary, comparator, p, q - 1);
    doQuickSort(ary, comparator, q + 1, r);
  }
}

/**
 * Sort the given array in-place with the given comparator function.
 *
 * @param {Array} ary
 *        An array to sort.
 * @param {function} comparator
 *        Function to use to compare two items.
 */
exports.quickSort = function (ary, comparator) {
  doQuickSort(ary, comparator, 0, ary.length - 1);
};
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var util = require('./util');
var binarySearch = require('./binary-search');
var ArraySet = require('./array-set').ArraySet;
var base64VLQ = require('./base64-vlq');
var quickSort = require('./quick-sort').quickSort;

function SourceMapConsumer(aSourceMap, aSourceMapURL) {
  var sourceMap = aSourceMap;
  if (typeof aSourceMap === 'string') {
    sourceMap = util.parseSourceMapInput(aSourceMap);
  }

  return sourceMap.sections != null
    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
}

SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
}

/**
 * The version of the source mapping spec that we are consuming.
 */
SourceMapConsumer.prototype._version = 3;

// `__generatedMappings` and `__originalMappings` are arrays that hold the
// parsed mapping coordinates from the source map's "mappings" attribute. They
// are lazily instantiated, accessed via the `_generatedMappings` and
// `_originalMappings` getters respectively, and we only parse the mappings
// and create these arrays once queried for a source location. We jump through
// these hoops because there can be many thousands of mappings, and parsing
// them is expensive, so we only want to do it if we must.
//
// Each object in the arrays is of the form:
//
//     {
//       generatedLine: The line number in the generated code,
//       generatedColumn: The column number in the generated code,
//       source: The path to the original source file that generated this
//               chunk of code,
//       originalLine: The line number in the original source that
//                     corresponds to this chunk of generated code,
//       originalColumn: The column number in the original source that
//                       corresponds to this chunk of generated code,
//       name: The name of the original symbol which generated this chunk of
//             code.
//     }
//
// All properties except for `generatedLine` and `generatedColumn` can be
// `null`.
//
// `_generatedMappings` is ordered by the generated positions.
//
// `_originalMappings` is ordered by the original positions.

SourceMapConsumer.prototype.__generatedMappings = null;
Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
  configurable: true,
  enumerable: true,
  get: function () {
    if (!this.__generatedMappings) {
      this._parseMappings(this._mappings, this.sourceRoot);
    }

    return this.__generatedMappings;
  }
});

SourceMapConsumer.prototype.__originalMappings = null;
Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
  configurable: true,
  enumerable: true,
  get: function () {
    if (!this.__originalMappings) {
      this._parseMappings(this._mappings, this.sourceRoot);
    }

    return this.__originalMappings;
  }
});

SourceMapConsumer.prototype._charIsMappingSeparator =
  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
    var c = aStr.charAt(index);
    return c === ";" || c === ",";
  };

/**
 * Parse the mappings in a string in to a data structure which we can easily
 * query (the ordered arrays in the `this.__generatedMappings` and
 * `this.__originalMappings` properties).
 */
SourceMapConsumer.prototype._parseMappings =
  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
    throw new Error("Subclasses must implement _parseMappings");
  };

SourceMapConsumer.GENERATED_ORDER = 1;
SourceMapConsumer.ORIGINAL_ORDER = 2;

SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
SourceMapConsumer.LEAST_UPPER_BOUND = 2;

/**
 * Iterate over each mapping between an original source/line/column and a
 * generated line/column in this source map.
 *
 * @param Function aCallback
 *        The function that is called with each mapping.
 * @param Object aContext
 *        Optional. If specified, this object will be the value of `this` every
 *        time that `aCallback` is called.
 * @param aOrder
 *        Either `SourceMapConsumer.GENERATED_ORDER` or
 *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
 *        iterate over the mappings sorted by the generated file's line/column
 *        order or the original's source/line/column order, respectively. Defaults to
 *        `SourceMapConsumer.GENERATED_ORDER`.
 */
SourceMapConsumer.prototype.eachMapping =
  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
    var context = aContext || null;
    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;

    var mappings;
    switch (order) {
    case SourceMapConsumer.GENERATED_ORDER:
      mappings = this._generatedMappings;
      break;
    case SourceMapConsumer.ORIGINAL_ORDER:
      mappings = this._originalMappings;
      break;
    default:
      throw new Error("Unknown order of iteration.");
    }

    var sourceRoot = this.sourceRoot;
    mappings.map(function (mapping) {
      var source = mapping.source === null ? null : this._sources.at(mapping.source);
      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
      return {
        source: source,
        generatedLine: mapping.generatedLine,
        generatedColumn: mapping.generatedColumn,
        originalLine: mapping.originalLine,
        originalColumn: mapping.originalColumn,
        name: mapping.name === null ? null : this._names.at(mapping.name)
      };
    }, this).forEach(aCallback, context);
  };

/**
 * Returns all generated line and column information for the original source,
 * line, and column provided. If no column is provided, returns all mappings
 * corresponding to a either the line we are searching for or the next
 * closest line that has any mappings. Otherwise, returns all mappings
 * corresponding to the given line and either the column we are searching for
 * or the next closest column that has any offsets.
 *
 * The only argument is an object with the following properties:
 *
 *   - source: The filename of the original source.
 *   - line: The line number in the original source.  The line number is 1-based.
 *   - column: Optional. the column number in the original source.
 *    The column number is 0-based.
 *
 * and an array of objects is returned, each with the following properties:
 *
 *   - line: The line number in the generated source, or null.  The
 *    line number is 1-based.
 *   - column: The column number in the generated source, or null.
 *    The column number is 0-based.
 */
SourceMapConsumer.prototype.allGeneratedPositionsFor =
  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
    var line = util.getArg(aArgs, 'line');

    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
    // returns the index of the closest mapping less than the needle. By
    // setting needle.originalColumn to 0, we thus find the last mapping for
    // the given line, provided such a mapping exists.
    var needle = {
      source: util.getArg(aArgs, 'source'),
      originalLine: line,
      originalColumn: util.getArg(aArgs, 'column', 0)
    };

    needle.source = this._findSourceIndex(needle.source);
    if (needle.source < 0) {
      return [];
    }

    var mappings = [];

    var index = this._findMapping(needle,
                                  this._originalMappings,
                                  "originalLine",
                                  "originalColumn",
                                  util.compareByOriginalPositions,
                                  binarySearch.LEAST_UPPER_BOUND);
    if (index >= 0) {
      var mapping = this._originalMappings[index];

      if (aArgs.column === undefined) {
        var originalLine = mapping.originalLine;

        // Iterate until either we run out of mappings, or we run into
        // a mapping for a different line than the one we found. Since
        // mappings are sorted, this is guaranteed to find all mappings for
        // the line we found.
        while (mapping && mapping.originalLine === originalLine) {
          mappings.push({
            line: util.getArg(mapping, 'generatedLine', null),
            column: util.getArg(mapping, 'generatedColumn', null),
            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
          });

          mapping = this._originalMappings[++index];
        }
      } else {
        var originalColumn = mapping.originalColumn;

        // Iterate until either we run out of mappings, or we run into
        // a mapping for a different line than the one we were searching for.
        // Since mappings are sorted, this is guaranteed to find all mappings for
        // the line we are searching for.
        while (mapping &&
               mapping.originalLine === line &&
               mapping.originalColumn == originalColumn) {
          mappings.push({
            line: util.getArg(mapping, 'generatedLine', null),
            column: util.getArg(mapping, 'generatedColumn', null),
            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
          });

          mapping = this._originalMappings[++index];
        }
      }
    }

    return mappings;
  };

exports.SourceMapConsumer = SourceMapConsumer;

/**
 * A BasicSourceMapConsumer instance represents a parsed source map which we can
 * query for information about the original file positions by giving it a file
 * position in the generated source.
 *
 * The first parameter is the raw source map (either as a JSON string, or
 * already parsed to an object). According to the spec, source maps have the
 * following attributes:
 *
 *   - version: Which version of the source map spec this map is following.
 *   - sources: An array of URLs to the original source files.
 *   - names: An array of identifiers which can be referrenced by individual mappings.
 *   - sourceRoot: Optional. The URL root from which all sources are relative.
 *   - sourcesContent: Optional. An array of contents of the original source files.
 *   - mappings: A string of base64 VLQs which contain the actual mappings.
 *   - file: Optional. The generated file this source map is associated with.
 *
 * Here is an example source map, taken from the source map spec[0]:
 *
 *     {
 *       version : 3,
 *       file: "out.js",
 *       sourceRoot : "",
 *       sources: ["foo.js", "bar.js"],
 *       names: ["src", "maps", "are", "fun"],
 *       mappings: "AA,AB;;ABCDE;"
 *     }
 *
 * The second parameter, if given, is a string whose value is the URL
 * at which the source map was found.  This URL is used to compute the
 * sources array.
 *
 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
 */
function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
  var sourceMap = aSourceMap;
  if (typeof aSourceMap === 'string') {
    sourceMap = util.parseSourceMapInput(aSourceMap);
  }

  var version = util.getArg(sourceMap, 'version');
  var sources = util.getArg(sourceMap, 'sources');
  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
  // requires the array) to play nice here.
  var names = util.getArg(sourceMap, 'names', []);
  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
  var mappings = util.getArg(sourceMap, 'mappings');
  var file = util.getArg(sourceMap, 'file', null);

  // Once again, Sass deviates from the spec and supplies the version as a
  // string rather than a number, so we use loose equality checking here.
  if (version != this._version) {
    throw new Error('Unsupported version: ' + version);
  }

  if (sourceRoot) {
    sourceRoot = util.normalize(sourceRoot);
  }

  sources = sources
    .map(String)
    // Some source maps produce relative source paths like "./foo.js" instead of
    // "foo.js".  Normalize these first so that future comparisons will succeed.
    // See bugzil.la/1090768.
    .map(util.normalize)
    // Always ensure that absolute sources are internally stored relative to
    // the source root, if the source root is absolute. Not doing this would
    // be particularly problematic when the source root is a prefix of the
    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
    .map(function (source) {
      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
        ? util.relative(sourceRoot, source)
        : source;
    });

  // Pass `true` below to allow duplicate names and sources. While source maps
  // are intended to be compressed and deduplicated, the TypeScript compiler
  // sometimes generates source maps with duplicates in them. See Github issue
  // #72 and bugzil.la/889492.
  this._names = ArraySet.fromArray(names.map(String), true);
  this._sources = ArraySet.fromArray(sources, true);

  this._absoluteSources = this._sources.toArray().map(function (s) {
    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
  });

  this.sourceRoot = sourceRoot;
  this.sourcesContent = sourcesContent;
  this._mappings = mappings;
  this._sourceMapURL = aSourceMapURL;
  this.file = file;
}

BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;

/**
 * Utility function to find the index of a source.  Returns -1 if not
 * found.
 */
BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
  var relativeSource = aSource;
  if (this.sourceRoot != null) {
    relativeSource = util.relative(this.sourceRoot, relativeSource);
  }

  if (this._sources.has(relativeSource)) {
    return this._sources.indexOf(relativeSource);
  }

  // Maybe aSource is an absolute URL as returned by |sources|.  In
  // this case we can't simply undo the transform.
  var i;
  for (i = 0; i < this._absoluteSources.length; ++i) {
    if (this._absoluteSources[i] == aSource) {
      return i;
    }
  }

  return -1;
};

/**
 * Create a BasicSourceMapConsumer from a SourceMapGenerator.
 *
 * @param SourceMapGenerator aSourceMap
 *        The source map that will be consumed.
 * @param String aSourceMapURL
 *        The URL at which the source map can be found (optional)
 * @returns BasicSourceMapConsumer
 */
BasicSourceMapConsumer.fromSourceMap =
  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
    var smc = Object.create(BasicSourceMapConsumer.prototype);

    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
    smc.sourceRoot = aSourceMap._sourceRoot;
    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
                                                            smc.sourceRoot);
    smc.file = aSourceMap._file;
    smc._sourceMapURL = aSourceMapURL;
    smc._absoluteSources = smc._sources.toArray().map(function (s) {
      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
    });

    // Because we are modifying the entries (by converting string sources and
    // names to indices into the sources and names ArraySets), we have to make
    // a copy of the entry or else bad things happen. Shared mutable state
    // strikes again! See github issue #191.

    var generatedMappings = aSourceMap._mappings.toArray().slice();
    var destGeneratedMappings = smc.__generatedMappings = [];
    var destOriginalMappings = smc.__originalMappings = [];

    for (var i = 0, length = generatedMappings.length; i < length; i++) {
      var srcMapping = generatedMappings[i];
      var destMapping = new Mapping;
      destMapping.generatedLine = srcMapping.generatedLine;
      destMapping.generatedColumn = srcMapping.generatedColumn;

      if (srcMapping.source) {
        destMapping.source = sources.indexOf(srcMapping.source);
        destMapping.originalLine = srcMapping.originalLine;
        destMapping.originalColumn = srcMapping.originalColumn;

        if (srcMapping.name) {
          destMapping.name = names.indexOf(srcMapping.name);
        }

        destOriginalMappings.push(destMapping);
      }

      destGeneratedMappings.push(destMapping);
    }

    quickSort(smc.__originalMappings, util.compareByOriginalPositions);

    return smc;
  };

/**
 * The version of the source mapping spec that we are consuming.
 */
BasicSourceMapConsumer.prototype._version = 3;

/**
 * The list of original sources.
 */
Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
  get: function () {
    return this._absoluteSources.slice();
  }
});

/**
 * Provide the JIT with a nice shape / hidden class.
 */
function Mapping() {
  this.generatedLine = 0;
  this.generatedColumn = 0;
  this.source = null;
  this.originalLine = null;
  this.originalColumn = null;
  this.name = null;
}

/**
 * Parse the mappings in a string in to a data structure which we can easily
 * query (the ordered arrays in the `this.__generatedMappings` and
 * `this.__originalMappings` properties).
 */
BasicSourceMapConsumer.prototype._parseMappings =
  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
    var generatedLine = 1;
    var previousGeneratedColumn = 0;
    var previousOriginalLine = 0;
    var previousOriginalColumn = 0;
    var previousSource = 0;
    var previousName = 0;
    var length = aStr.length;
    var index = 0;
    var cachedSegments = {};
    var temp = {};
    var originalMappings = [];
    var generatedMappings = [];
    var mapping, str, segment, end, value;

    while (index < length) {
      if (aStr.charAt(index) === ';') {
        generatedLine++;
        index++;
        previousGeneratedColumn = 0;
      }
      else if (aStr.charAt(index) === ',') {
        index++;
      }
      else {
        mapping = new Mapping();
        mapping.generatedLine = generatedLine;

        // Because each offset is encoded relative to the previous one,
        // many segments often have the same encoding. We can exploit this
        // fact by caching the parsed variable length fields of each segment,
        // allowing us to avoid a second parse if we encounter the same
        // segment again.
        for (end = index; end < length; end++) {
          if (this._charIsMappingSeparator(aStr, end)) {
            break;
          }
        }
        str = aStr.slice(index, end);

        segment = cachedSegments[str];
        if (segment) {
          index += str.length;
        } else {
          segment = [];
          while (index < end) {
            base64VLQ.decode(aStr, index, temp);
            value = temp.value;
            index = temp.rest;
            segment.push(value);
          }

          if (segment.length === 2) {
            throw new Error('Found a source, but no line and column');
          }

          if (segment.length === 3) {
            throw new Error('Found a source and line, but no column');
          }

          cachedSegments[str] = segment;
        }

        // Generated column.
        mapping.generatedColumn = previousGeneratedColumn + segment[0];
        previousGeneratedColumn = mapping.generatedColumn;

        if (segment.length > 1) {
          // Original source.
          mapping.source = previousSource + segment[1];
          previousSource += segment[1];

          // Original line.
          mapping.originalLine = previousOriginalLine + segment[2];
          previousOriginalLine = mapping.originalLine;
          // Lines are stored 0-based
          mapping.originalLine += 1;

          // Original column.
          mapping.originalColumn = previousOriginalColumn + segment[3];
          previousOriginalColumn = mapping.originalColumn;

          if (segment.length > 4) {
            // Original name.
            mapping.name = previousName + segment[4];
            previousName += segment[4];
          }
        }

        generatedMappings.push(mapping);
        if (typeof mapping.originalLine === 'number') {
          originalMappings.push(mapping);
        }
      }
    }

    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
    this.__generatedMappings = generatedMappings;

    quickSort(originalMappings, util.compareByOriginalPositions);
    this.__originalMappings = originalMappings;
  };

/**
 * Find the mapping that best matches the hypothetical "needle" mapping that
 * we are searching for in the given "haystack" of mappings.
 */
BasicSourceMapConsumer.prototype._findMapping =
  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
                                         aColumnName, aComparator, aBias) {
    // To return the position we are searching for, we must first find the
    // mapping for the given position and then return the opposite position it
    // points to. Because the mappings are sorted, we can use binary search to
    // find the best mapping.

    if (aNeedle[aLineName] <= 0) {
      throw new TypeError('Line must be greater than or equal to 1, got '
                          + aNeedle[aLineName]);
    }
    if (aNeedle[aColumnName] < 0) {
      throw new TypeError('Column must be greater than or equal to 0, got '
                          + aNeedle[aColumnName]);
    }

    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
  };

/**
 * Compute the last column for each generated mapping. The last column is
 * inclusive.
 */
BasicSourceMapConsumer.prototype.computeColumnSpans =
  function SourceMapConsumer_computeColumnSpans() {
    for (var index = 0; index < this._generatedMappings.length; ++index) {
      var mapping = this._generatedMappings[index];

      // Mappings do not contain a field for the last generated columnt. We
      // can come up with an optimistic estimate, however, by assuming that
      // mappings are contiguous (i.e. given two consecutive mappings, the
      // first mapping ends where the second one starts).
      if (index + 1 < this._generatedMappings.length) {
        var nextMapping = this._generatedMappings[index + 1];

        if (mapping.generatedLine === nextMapping.generatedLine) {
          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
          continue;
        }
      }

      // The last mapping for each line spans the entire line.
      mapping.lastGeneratedColumn = Infinity;
    }
  };

/**
 * Returns the original source, line, and column information for the generated
 * source's line and column positions provided. The only argument is an object
 * with the following properties:
 *
 *   - line: The line number in the generated source.  The line number
 *     is 1-based.
 *   - column: The column number in the generated source.  The column
 *     number is 0-based.
 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
 *     closest element that is smaller than or greater than the one we are
 *     searching for, respectively, if the exact element cannot be found.
 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
 *
 * and an object is returned with the following properties:
 *
 *   - source: The original source file, or null.
 *   - line: The line number in the original source, or null.  The
 *     line number is 1-based.
 *   - column: The column number in the original source, or null.  The
 *     column number is 0-based.
 *   - name: The original identifier, or null.
 */
BasicSourceMapConsumer.prototype.originalPositionFor =
  function SourceMapConsumer_originalPositionFor(aArgs) {
    var needle = {
      generatedLine: util.getArg(aArgs, 'line'),
      generatedColumn: util.getArg(aArgs, 'column')
    };

    var index = this._findMapping(
      needle,
      this._generatedMappings,
      "generatedLine",
      "generatedColumn",
      util.compareByGeneratedPositionsDeflated,
      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
    );

    if (index >= 0) {
      var mapping = this._generatedMappings[index];

      if (mapping.generatedLine === needle.generatedLine) {
        var source = util.getArg(mapping, 'source', null);
        if (source !== null) {
          source = this._sources.at(source);
          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
        }
        var name = util.getArg(mapping, 'name', null);
        if (name !== null) {
          name = this._names.at(name);
        }
        return {
          source: source,
          line: util.getArg(mapping, 'originalLine', null),
          column: util.getArg(mapping, 'originalColumn', null),
          name: name
        };
      }
    }

    return {
      source: null,
      line: null,
      column: null,
      name: null
    };
  };

/**
 * Return true if we have the source content for every source in the source
 * map, false otherwise.
 */
BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
  function BasicSourceMapConsumer_hasContentsOfAllSources() {
    if (!this.sourcesContent) {
      return false;
    }
    return this.sourcesContent.length >= this._sources.size() &&
      !this.sourcesContent.some(function (sc) { return sc == null; });
  };

/**
 * Returns the original source content. The only argument is the url of the
 * original source file. Returns null if no original source content is
 * available.
 */
BasicSourceMapConsumer.prototype.sourceContentFor =
  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
    if (!this.sourcesContent) {
      return null;
    }

    var index = this._findSourceIndex(aSource);
    if (index >= 0) {
      return this.sourcesContent[index];
    }

    var relativeSource = aSource;
    if (this.sourceRoot != null) {
      relativeSource = util.relative(this.sourceRoot, relativeSource);
    }

    var url;
    if (this.sourceRoot != null
        && (url = util.urlParse(this.sourceRoot))) {
      // XXX: file:// URIs and absolute paths lead to unexpected behavior for
      // many users. We can help them out when they expect file:// URIs to
      // behave like it would if they were running a local HTTP server. See
      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
      var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
      if (url.scheme == "file"
          && this._sources.has(fileUriAbsPath)) {
        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
      }

      if ((!url.path || url.path == "/")
          && this._sources.has("/" + relativeSource)) {
        return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
      }
    }

    // This function is used recursively from
    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
    // don't want to throw if we can't find the source - we just want to
    // return null, so we provide a flag to exit gracefully.
    if (nullOnMissing) {
      return null;
    }
    else {
      throw new Error('"' + relativeSource + '" is not in the SourceMap.');
    }
  };

/**
 * Returns the generated line and column information for the original source,
 * line, and column positions provided. The only argument is an object with
 * the following properties:
 *
 *   - source: The filename of the original source.
 *   - line: The line number in the original source.  The line number
 *     is 1-based.
 *   - column: The column number in the original source.  The column
 *     number is 0-based.
 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
 *     closest element that is smaller than or greater than the one we are
 *     searching for, respectively, if the exact element cannot be found.
 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
 *
 * and an object is returned with the following properties:
 *
 *   - line: The line number in the generated source, or null.  The
 *     line number is 1-based.
 *   - column: The column number in the generated source, or null.
 *     The column number is 0-based.
 */
BasicSourceMapConsumer.prototype.generatedPositionFor =
  function SourceMapConsumer_generatedPositionFor(aArgs) {
    var source = util.getArg(aArgs, 'source');
    source = this._findSourceIndex(source);
    if (source < 0) {
      return {
        line: null,
        column: null,
        lastColumn: null
      };
    }

    var needle = {
      source: source,
      originalLine: util.getArg(aArgs, 'line'),
      originalColumn: util.getArg(aArgs, 'column')
    };

    var index = this._findMapping(
      needle,
      this._originalMappings,
      "originalLine",
      "originalColumn",
      util.compareByOriginalPositions,
      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
    );

    if (index >= 0) {
      var mapping = this._originalMappings[index];

      if (mapping.source === needle.source) {
        return {
          line: util.getArg(mapping, 'generatedLine', null),
          column: util.getArg(mapping, 'generatedColumn', null),
          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
        };
      }
    }

    return {
      line: null,
      column: null,
      lastColumn: null
    };
  };

exports.BasicSourceMapConsumer = BasicSourceMapConsumer;

/**
 * An IndexedSourceMapConsumer instance represents a parsed source map which
 * we can query for information. It differs from BasicSourceMapConsumer in
 * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
 * input.
 *
 * The first parameter is a raw source map (either as a JSON string, or already
 * parsed to an object). According to the spec for indexed source maps, they
 * have the following attributes:
 *
 *   - version: Which version of the source map spec this map is following.
 *   - file: Optional. The generated file this source map is associated with.
 *   - sections: A list of section definitions.
 *
 * Each value under the "sections" field has two fields:
 *   - offset: The offset into the original specified at which this section
 *       begins to apply, defined as an object with a "line" and "column"
 *       field.
 *   - map: A source map definition. This source map could also be indexed,
 *       but doesn't have to be.
 *
 * Instead of the "map" field, it's also possible to have a "url" field
 * specifying a URL to retrieve a source map from, but that's currently
 * unsupported.
 *
 * Here's an example source map, taken from the source map spec[0], but
 * modified to omit a section which uses the "url" field.
 *
 *  {
 *    version : 3,
 *    file: "app.js",
 *    sections: [{
 *      offset: {line:100, column:10},
 *      map: {
 *        version : 3,
 *        file: "section.js",
 *        sources: ["foo.js", "bar.js"],
 *        names: ["src", "maps", "are", "fun"],
 *        mappings: "AAAA,E;;ABCDE;"
 *      }
 *    }],
 *  }
 *
 * The second parameter, if given, is a string whose value is the URL
 * at which the source map was found.  This URL is used to compute the
 * sources array.
 *
 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
 */
function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
  var sourceMap = aSourceMap;
  if (typeof aSourceMap === 'string') {
    sourceMap = util.parseSourceMapInput(aSourceMap);
  }

  var version = util.getArg(sourceMap, 'version');
  var sections = util.getArg(sourceMap, 'sections');

  if (version != this._version) {
    throw new Error('Unsupported version: ' + version);
  }

  this._sources = new ArraySet();
  this._names = new ArraySet();

  var lastOffset = {
    line: -1,
    column: 0
  };
  this._sections = sections.map(function (s) {
    if (s.url) {
      // The url field will require support for asynchronicity.
      // See https://github.com/mozilla/source-map/issues/16
      throw new Error('Support for url field in sections not implemented.');
    }
    var offset = util.getArg(s, 'offset');
    var offsetLine = util.getArg(offset, 'line');
    var offsetColumn = util.getArg(offset, 'column');

    if (offsetLine < lastOffset.line ||
        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
      throw new Error('Section offsets must be ordered and non-overlapping.');
    }
    lastOffset = offset;

    return {
      generatedOffset: {
        // The offset fields are 0-based, but we use 1-based indices when
        // encoding/decoding from VLQ.
        generatedLine: offsetLine + 1,
        generatedColumn: offsetColumn + 1
      },
      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)
    }
  });
}

IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;

/**
 * The version of the source mapping spec that we are consuming.
 */
IndexedSourceMapConsumer.prototype._version = 3;

/**
 * The list of original sources.
 */
Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
  get: function () {
    var sources = [];
    for (var i = 0; i < this._sections.length; i++) {
      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
        sources.push(this._sections[i].consumer.sources[j]);
      }
    }
    return sources;
  }
});

/**
 * Returns the original source, line, and column information for the generated
 * source's line and column positions provided. The only argument is an object
 * with the following properties:
 *
 *   - line: The line number in the generated source.  The line number
 *     is 1-based.
 *   - column: The column number in the generated source.  The column
 *     number is 0-based.
 *
 * and an object is returned with the following properties:
 *
 *   - source: The original source file, or null.
 *   - line: The line number in the original source, or null.  The
 *     line number is 1-based.
 *   - column: The column number in the original source, or null.  The
 *     column number is 0-based.
 *   - name: The original identifier, or null.
 */
IndexedSourceMapConsumer.prototype.originalPositionFor =
  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
    var needle = {
      generatedLine: util.getArg(aArgs, 'line'),
      generatedColumn: util.getArg(aArgs, 'column')
    };

    // Find the section containing the generated position we're trying to map
    // to an original position.
    var sectionIndex = binarySearch.search(needle, this._sections,
      function(needle, section) {
        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
        if (cmp) {
          return cmp;
        }

        return (needle.generatedColumn -
                section.generatedOffset.generatedColumn);
      });
    var section = this._sections[sectionIndex];

    if (!section) {
      return {
        source: null,
        line: null,
        column: null,
        name: null
      };
    }

    return section.consumer.originalPositionFor({
      line: needle.generatedLine -
        (section.generatedOffset.generatedLine - 1),
      column: needle.generatedColumn -
        (section.generatedOffset.generatedLine === needle.generatedLine
         ? section.generatedOffset.generatedColumn - 1
         : 0),
      bias: aArgs.bias
    });
  };

/**
 * Return true if we have the source content for every source in the source
 * map, false otherwise.
 */
IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
  function IndexedSourceMapConsumer_hasContentsOfAllSources() {
    return this._sections.every(function (s) {
      return s.consumer.hasContentsOfAllSources();
    });
  };

/**
 * Returns the original source content. The only argument is the url of the
 * original source file. Returns null if no original source content is
 * available.
 */
IndexedSourceMapConsumer.prototype.sourceContentFor =
  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
    for (var i = 0; i < this._sections.length; i++) {
      var section = this._sections[i];

      var content = section.consumer.sourceContentFor(aSource, true);
      if (content) {
        return content;
      }
    }
    if (nullOnMissing) {
      return null;
    }
    else {
      throw new Error('"' + aSource + '" is not in the SourceMap.');
    }
  };

/**
 * Returns the generated line and column information for the original source,
 * line, and column positions provided. The only argument is an object with
 * the following properties:
 *
 *   - source: The filename of the original source.
 *   - line: The line number in the original source.  The line number
 *     is 1-based.
 *   - column: The column number in the original source.  The column
 *     number is 0-based.
 *
 * and an object is returned with the following properties:
 *
 *   - line: The line number in the generated source, or null.  The
 *     line number is 1-based. 
 *   - column: The column number in the generated source, or null.
 *     The column number is 0-based.
 */
IndexedSourceMapConsumer.prototype.generatedPositionFor =
  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
    for (var i = 0; i < this._sections.length; i++) {
      var section = this._sections[i];

      // Only consider this section if the requested source is in the list of
      // sources of the consumer.
      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
        continue;
      }
      var generatedPosition = section.consumer.generatedPositionFor(aArgs);
      if (generatedPosition) {
        var ret = {
          line: generatedPosition.line +
            (section.generatedOffset.generatedLine - 1),
          column: generatedPosition.column +
            (section.generatedOffset.generatedLine === generatedPosition.line
             ? section.generatedOffset.generatedColumn - 1
             : 0)
        };
        return ret;
      }
    }

    return {
      line: null,
      column: null
    };
  };

/**
 * Parse the mappings in a string in to a data structure which we can easily
 * query (the ordered arrays in the `this.__generatedMappings` and
 * `this.__originalMappings` properties).
 */
IndexedSourceMapConsumer.prototype._parseMappings =
  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
    this.__generatedMappings = [];
    this.__originalMappings = [];
    for (var i = 0; i < this._sections.length; i++) {
      var section = this._sections[i];
      var sectionMappings = section.consumer._generatedMappings;
      for (var j = 0; j < sectionMappings.length; j++) {
        var mapping = sectionMappings[j];

        var source = section.consumer._sources.at(mapping.source);
        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
        this._sources.add(source);
        source = this._sources.indexOf(source);

        var name = null;
        if (mapping.name) {
          name = section.consumer._names.at(mapping.name);
          this._names.add(name);
          name = this._names.indexOf(name);
        }

        // The mappings coming from the consumer for the section have
        // generated positions relative to the start of the section, so we
        // need to offset them to be relative to the start of the concatenated
        // generated file.
        var adjustedMapping = {
          source: source,
          generatedLine: mapping.generatedLine +
            (section.generatedOffset.generatedLine - 1),
          generatedColumn: mapping.generatedColumn +
            (section.generatedOffset.generatedLine === mapping.generatedLine
            ? section.generatedOffset.generatedColumn - 1
            : 0),
          originalLine: mapping.originalLine,
          originalColumn: mapping.originalColumn,
          name: name
        };

        this.__generatedMappings.push(adjustedMapping);
        if (typeof adjustedMapping.originalLine === 'number') {
          this.__originalMappings.push(adjustedMapping);
        }
      }
    }

    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
    quickSort(this.__originalMappings, util.compareByOriginalPositions);
  };

exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var base64VLQ = require('./base64-vlq');
var util = require('./util');
var ArraySet = require('./array-set').ArraySet;
var MappingList = require('./mapping-list').MappingList;

/**
 * An instance of the SourceMapGenerator represents a source map which is
 * being built incrementally. You may pass an object with the following
 * properties:
 *
 *   - file: The filename of the generated source.
 *   - sourceRoot: A root for all relative URLs in this source map.
 */
function SourceMapGenerator(aArgs) {
  if (!aArgs) {
    aArgs = {};
  }
  this._file = util.getArg(aArgs, 'file', null);
  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
  this._sources = new ArraySet();
  this._names = new ArraySet();
  this._mappings = new MappingList();
  this._sourcesContents = null;
}

SourceMapGenerator.prototype._version = 3;

/**
 * Creates a new SourceMapGenerator based on a SourceMapConsumer
 *
 * @param aSourceMapConsumer The SourceMap.
 */
SourceMapGenerator.fromSourceMap =
  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
    var sourceRoot = aSourceMapConsumer.sourceRoot;
    var generator = new SourceMapGenerator({
      file: aSourceMapConsumer.file,
      sourceRoot: sourceRoot
    });
    aSourceMapConsumer.eachMapping(function (mapping) {
      var newMapping = {
        generated: {
          line: mapping.generatedLine,
          column: mapping.generatedColumn
        }
      };

      if (mapping.source != null) {
        newMapping.source = mapping.source;
        if (sourceRoot != null) {
          newMapping.source = util.relative(sourceRoot, newMapping.source);
        }

        newMapping.original = {
          line: mapping.originalLine,
          column: mapping.originalColumn
        };

        if (mapping.name != null) {
          newMapping.name = mapping.name;
        }
      }

      generator.addMapping(newMapping);
    });
    aSourceMapConsumer.sources.forEach(function (sourceFile) {
      var sourceRelative = sourceFile;
      if (sourceRoot !== null) {
        sourceRelative = util.relative(sourceRoot, sourceFile);
      }

      if (!generator._sources.has(sourceRelative)) {
        generator._sources.add(sourceRelative);
      }

      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
      if (content != null) {
        generator.setSourceContent(sourceFile, content);
      }
    });
    return generator;
  };

/**
 * Add a single mapping from original source line and column to the generated
 * source's line and column for this source map being created. The mapping
 * object should have the following properties:
 *
 *   - generated: An object with the generated line and column positions.
 *   - original: An object with the original line and column positions.
 *   - source: The original source file (relative to the sourceRoot).
 *   - name: An optional original token name for this mapping.
 */
SourceMapGenerator.prototype.addMapping =
  function SourceMapGenerator_addMapping(aArgs) {
    var generated = util.getArg(aArgs, 'generated');
    var original = util.getArg(aArgs, 'original', null);
    var source = util.getArg(aArgs, 'source', null);
    var name = util.getArg(aArgs, 'name', null);

    if (!this._skipValidation) {
      this._validateMapping(generated, original, source, name);
    }

    if (source != null) {
      source = String(source);
      if (!this._sources.has(source)) {
        this._sources.add(source);
      }
    }

    if (name != null) {
      name = String(name);
      if (!this._names.has(name)) {
        this._names.add(name);
      }
    }

    this._mappings.add({
      generatedLine: generated.line,
      generatedColumn: generated.column,
      originalLine: original != null && original.line,
      originalColumn: original != null && original.column,
      source: source,
      name: name
    });
  };

/**
 * Set the source content for a source file.
 */
SourceMapGenerator.prototype.setSourceContent =
  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
    var source = aSourceFile;
    if (this._sourceRoot != null) {
      source = util.relative(this._sourceRoot, source);
    }

    if (aSourceContent != null) {
      // Add the source content to the _sourcesContents map.
      // Create a new _sourcesContents map if the property is null.
      if (!this._sourcesContents) {
        this._sourcesContents = Object.create(null);
      }
      this._sourcesContents[util.toSetString(source)] = aSourceContent;
    } else if (this._sourcesContents) {
      // Remove the source file from the _sourcesContents map.
      // If the _sourcesContents map is empty, set the property to null.
      delete this._sourcesContents[util.toSetString(source)];
      if (Object.keys(this._sourcesContents).length === 0) {
        this._sourcesContents = null;
      }
    }
  };

/**
 * Applies the mappings of a sub-source-map for a specific source file to the
 * source map being generated. Each mapping to the supplied source file is
 * rewritten using the supplied source map. Note: The resolution for the
 * resulting mappings is the minimium of this map and the supplied map.
 *
 * @param aSourceMapConsumer The source map to be applied.
 * @param aSourceFile Optional. The filename of the source file.
 *        If omitted, SourceMapConsumer's file property will be used.
 * @param aSourceMapPath Optional. The dirname of the path to the source map
 *        to be applied. If relative, it is relative to the SourceMapConsumer.
 *        This parameter is needed when the two source maps aren't in the same
 *        directory, and the source map to be applied contains relative source
 *        paths. If so, those relative source paths need to be rewritten
 *        relative to the SourceMapGenerator.
 */
SourceMapGenerator.prototype.applySourceMap =
  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
    var sourceFile = aSourceFile;
    // If aSourceFile is omitted, we will use the file property of the SourceMap
    if (aSourceFile == null) {
      if (aSourceMapConsumer.file == null) {
        throw new Error(
          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
          'or the source map\'s "file" property. Both were omitted.'
        );
      }
      sourceFile = aSourceMapConsumer.file;
    }
    var sourceRoot = this._sourceRoot;
    // Make "sourceFile" relative if an absolute Url is passed.
    if (sourceRoot != null) {
      sourceFile = util.relative(sourceRoot, sourceFile);
    }
    // Applying the SourceMap can add and remove items from the sources and
    // the names array.
    var newSources = new ArraySet();
    var newNames = new ArraySet();

    // Find mappings for the "sourceFile"
    this._mappings.unsortedForEach(function (mapping) {
      if (mapping.source === sourceFile && mapping.originalLine != null) {
        // Check if it can be mapped by the source map, then update the mapping.
        var original = aSourceMapConsumer.originalPositionFor({
          line: mapping.originalLine,
          column: mapping.originalColumn
        });
        if (original.source != null) {
          // Copy mapping
          mapping.source = original.source;
          if (aSourceMapPath != null) {
            mapping.source = util.join(aSourceMapPath, mapping.source)
          }
          if (sourceRoot != null) {
            mapping.source = util.relative(sourceRoot, mapping.source);
          }
          mapping.originalLine = original.line;
          mapping.originalColumn = original.column;
          if (original.name != null) {
            mapping.name = original.name;
          }
        }
      }

      var source = mapping.source;
      if (source != null && !newSources.has(source)) {
        newSources.add(source);
      }

      var name = mapping.name;
      if (name != null && !newNames.has(name)) {
        newNames.add(name);
      }

    }, this);
    this._sources = newSources;
    this._names = newNames;

    // Copy sourcesContents of applied map.
    aSourceMapConsumer.sources.forEach(function (sourceFile) {
      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
      if (content != null) {
        if (aSourceMapPath != null) {
          sourceFile = util.join(aSourceMapPath, sourceFile);
        }
        if (sourceRoot != null) {
          sourceFile = util.relative(sourceRoot, sourceFile);
        }
        this.setSourceContent(sourceFile, content);
      }
    }, this);
  };

/**
 * A mapping can have one of the three levels of data:
 *
 *   1. Just the generated position.
 *   2. The Generated position, original position, and original source.
 *   3. Generated and original position, original source, as well as a name
 *      token.
 *
 * To maintain consistency, we validate that any new mapping being added falls
 * in to one of these categories.
 */
SourceMapGenerator.prototype._validateMapping =
  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
                                              aName) {
    // When aOriginal is truthy but has empty values for .line and .column,
    // it is most likely a programmer error. In this case we throw a very
    // specific error message to try to guide them the right way.
    // For example: https://github.com/Polymer/polymer-bundler/pull/519
    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
        throw new Error(
            'original.line and original.column are not numbers -- you probably meant to omit ' +
            'the original mapping entirely and only map the generated position. If so, pass ' +
            'null for the original mapping instead of an object with empty or null values.'
        );
    }

    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
        && aGenerated.line > 0 && aGenerated.column >= 0
        && !aOriginal && !aSource && !aName) {
      // Case 1.
      return;
    }
    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
             && aOriginal && 'line' in aOriginal && 'column' in aOriginal
             && aGenerated.line > 0 && aGenerated.column >= 0
             && aOriginal.line > 0 && aOriginal.column >= 0
             && aSource) {
      // Cases 2 and 3.
      return;
    }
    else {
      throw new Error('Invalid mapping: ' + JSON.stringify({
        generated: aGenerated,
        source: aSource,
        original: aOriginal,
        name: aName
      }));
    }
  };

/**
 * Serialize the accumulated mappings in to the stream of base 64 VLQs
 * specified by the source map format.
 */
SourceMapGenerator.prototype._serializeMappings =
  function SourceMapGenerator_serializeMappings() {
    var previousGeneratedColumn = 0;
    var previousGeneratedLine = 1;
    var previousOriginalColumn = 0;
    var previousOriginalLine = 0;
    var previousName = 0;
    var previousSource = 0;
    var result = '';
    var next;
    var mapping;
    var nameIdx;
    var sourceIdx;

    var mappings = this._mappings.toArray();
    for (var i = 0, len = mappings.length; i < len; i++) {
      mapping = mappings[i];
      next = ''

      if (mapping.generatedLine !== previousGeneratedLine) {
        previousGeneratedColumn = 0;
        while (mapping.generatedLine !== previousGeneratedLine) {
          next += ';';
          previousGeneratedLine++;
        }
      }
      else {
        if (i > 0) {
          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
            continue;
          }
          next += ',';
        }
      }

      next += base64VLQ.encode(mapping.generatedColumn
                                 - previousGeneratedColumn);
      previousGeneratedColumn = mapping.generatedColumn;

      if (mapping.source != null) {
        sourceIdx = this._sources.indexOf(mapping.source);
        next += base64VLQ.encode(sourceIdx - previousSource);
        previousSource = sourceIdx;

        // lines are stored 0-based in SourceMap spec version 3
        next += base64VLQ.encode(mapping.originalLine - 1
                                   - previousOriginalLine);
        previousOriginalLine = mapping.originalLine - 1;

        next += base64VLQ.encode(mapping.originalColumn
                                   - previousOriginalColumn);
        previousOriginalColumn = mapping.originalColumn;

        if (mapping.name != null) {
          nameIdx = this._names.indexOf(mapping.name);
          next += base64VLQ.encode(nameIdx - previousName);
          previousName = nameIdx;
        }
      }

      result += next;
    }

    return result;
  };

SourceMapGenerator.prototype._generateSourcesContent =
  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
    return aSources.map(function (source) {
      if (!this._sourcesContents) {
        return null;
      }
      if (aSourceRoot != null) {
        source = util.relative(aSourceRoot, source);
      }
      var key = util.toSetString(source);
      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
        ? this._sourcesContents[key]
        : null;
    }, this);
  };

/**
 * Externalize the source map.
 */
SourceMapGenerator.prototype.toJSON =
  function SourceMapGenerator_toJSON() {
    var map = {
      version: this._version,
      sources: this._sources.toArray(),
      names: this._names.toArray(),
      mappings: this._serializeMappings()
    };
    if (this._file != null) {
      map.file = this._file;
    }
    if (this._sourceRoot != null) {
      map.sourceRoot = this._sourceRoot;
    }
    if (this._sourcesContents) {
      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
    }

    return map;
  };

/**
 * Render the source map being generated to a string.
 */
SourceMapGenerator.prototype.toString =
  function SourceMapGenerator_toString() {
    return JSON.stringify(this.toJSON());
  };

exports.SourceMapGenerator = SourceMapGenerator;
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;
var util = require('./util');

// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
// operating systems these days (capturing the result).
var REGEX_NEWLINE = /(\r?\n)/;

// Newline character code for charCodeAt() comparisons
var NEWLINE_CODE = 10;

// Private symbol for identifying `SourceNode`s when multiple versions of
// the source-map library are loaded. This MUST NOT CHANGE across
// versions!
var isSourceNode = "$$$isSourceNode$$$";

/**
 * SourceNodes provide a way to abstract over interpolating/concatenating
 * snippets of generated JavaScript source code while maintaining the line and
 * column information associated with the original source code.
 *
 * @param aLine The original line number.
 * @param aColumn The original column number.
 * @param aSource The original source's filename.
 * @param aChunks Optional. An array of strings which are snippets of
 *        generated JS, or other SourceNodes.
 * @param aName The original identifier.
 */
function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
  this.children = [];
  this.sourceContents = {};
  this.line = aLine == null ? null : aLine;
  this.column = aColumn == null ? null : aColumn;
  this.source = aSource == null ? null : aSource;
  this.name = aName == null ? null : aName;
  this[isSourceNode] = true;
  if (aChunks != null) this.add(aChunks);
}

/**
 * Creates a SourceNode from generated code and a SourceMapConsumer.
 *
 * @param aGeneratedCode The generated code
 * @param aSourceMapConsumer The SourceMap for the generated code
 * @param aRelativePath Optional. The path that relative sources in the
 *        SourceMapConsumer should be relative to.
 */
SourceNode.fromStringWithSourceMap =
  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
    // The SourceNode we want to fill with the generated code
    // and the SourceMap
    var node = new SourceNode();

    // All even indices of this array are one line of the generated code,
    // while all odd indices are the newlines between two adjacent lines
    // (since `REGEX_NEWLINE` captures its match).
    // Processed fragments are accessed by calling `shiftNextLine`.
    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
    var remainingLinesIndex = 0;
    var shiftNextLine = function() {
      var lineContents = getNextLine();
      // The last line of a file might not have a newline.
      var newLine = getNextLine() || "";
      return lineContents + newLine;

      function getNextLine() {
        return remainingLinesIndex < remainingLines.length ?
            remainingLines[remainingLinesIndex++] : undefined;
      }
    };

    // We need to remember the position of "remainingLines"
    var lastGeneratedLine = 1, lastGeneratedColumn = 0;

    // The generate SourceNodes we need a code range.
    // To extract it current and last mapping is used.
    // Here we store the last mapping.
    var lastMapping = null;

    aSourceMapConsumer.eachMapping(function (mapping) {
      if (lastMapping !== null) {
        // We add the code from "lastMapping" to "mapping":
        // First check if there is a new line in between.
        if (lastGeneratedLine < mapping.generatedLine) {
          // Associate first line with "lastMapping"
          addMappingWithCode(lastMapping, shiftNextLine());
          lastGeneratedLine++;
          lastGeneratedColumn = 0;
          // The remaining code is added without mapping
        } else {
          // There is no new line in between.
          // Associate the code between "lastGeneratedColumn" and
          // "mapping.generatedColumn" with "lastMapping"
          var nextLine = remainingLines[remainingLinesIndex] || '';
          var code = nextLine.substr(0, mapping.generatedColumn -
                                        lastGeneratedColumn);
          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
                                              lastGeneratedColumn);
          lastGeneratedColumn = mapping.generatedColumn;
          addMappingWithCode(lastMapping, code);
          // No more remaining code, continue
          lastMapping = mapping;
          return;
        }
      }
      // We add the generated code until the first mapping
      // to the SourceNode without any mapping.
      // Each line is added as separate string.
      while (lastGeneratedLine < mapping.generatedLine) {
        node.add(shiftNextLine());
        lastGeneratedLine++;
      }
      if (lastGeneratedColumn < mapping.generatedColumn) {
        var nextLine = remainingLines[remainingLinesIndex] || '';
        node.add(nextLine.substr(0, mapping.generatedColumn));
        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
        lastGeneratedColumn = mapping.generatedColumn;
      }
      lastMapping = mapping;
    }, this);
    // We have processed all mappings.
    if (remainingLinesIndex < remainingLines.length) {
      if (lastMapping) {
        // Associate the remaining code in the current line with "lastMapping"
        addMappingWithCode(lastMapping, shiftNextLine());
      }
      // and add the remaining lines without any mapping
      node.add(remainingLines.splice(remainingLinesIndex).join(""));
    }

    // Copy sourcesContent into SourceNode
    aSourceMapConsumer.sources.forEach(function (sourceFile) {
      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
      if (content != null) {
        if (aRelativePath != null) {
          sourceFile = util.join(aRelativePath, sourceFile);
        }
        node.setSourceContent(sourceFile, content);
      }
    });

    return node;

    function addMappingWithCode(mapping, code) {
      if (mapping === null || mapping.source === undefined) {
        node.add(code);
      } else {
        var source = aRelativePath
          ? util.join(aRelativePath, mapping.source)
          : mapping.source;
        node.add(new SourceNode(mapping.originalLine,
                                mapping.originalColumn,
                                source,
                                code,
                                mapping.name));
      }
    }
  };

/**
 * Add a chunk of generated JS to this source node.
 *
 * @param aChunk A string snippet of generated JS code, another instance of
 *        SourceNode, or an array where each member is one of those things.
 */
SourceNode.prototype.add = function SourceNode_add(aChunk) {
  if (Array.isArray(aChunk)) {
    aChunk.forEach(function (chunk) {
      this.add(chunk);
    }, this);
  }
  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
    if (aChunk) {
      this.children.push(aChunk);
    }
  }
  else {
    throw new TypeError(
      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
    );
  }
  return this;
};

/**
 * Add a chunk of generated JS to the beginning of this source node.
 *
 * @param aChunk A string snippet of generated JS code, another instance of
 *        SourceNode, or an array where each member is one of those things.
 */
SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
  if (Array.isArray(aChunk)) {
    for (var i = aChunk.length-1; i >= 0; i--) {
      this.prepend(aChunk[i]);
    }
  }
  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
    this.children.unshift(aChunk);
  }
  else {
    throw new TypeError(
      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
    );
  }
  return this;
};

/**
 * Walk over the tree of JS snippets in this node and its children. The
 * walking function is called once for each snippet of JS and is passed that
 * snippet and the its original associated source's line/column location.
 *
 * @param aFn The traversal function.
 */
SourceNode.prototype.walk = function SourceNode_walk(aFn) {
  var chunk;
  for (var i = 0, len = this.children.length; i < len; i++) {
    chunk = this.children[i];
    if (chunk[isSourceNode]) {
      chunk.walk(aFn);
    }
    else {
      if (chunk !== '') {
        aFn(chunk, { source: this.source,
                     line: this.line,
                     column: this.column,
                     name: this.name });
      }
    }
  }
};

/**
 * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
 * each of `this.children`.
 *
 * @param aSep The separator.
 */
SourceNode.prototype.join = function SourceNode_join(aSep) {
  var newChildren;
  var i;
  var len = this.children.length;
  if (len > 0) {
    newChildren = [];
    for (i = 0; i < len-1; i++) {
      newChildren.push(this.children[i]);
      newChildren.push(aSep);
    }
    newChildren.push(this.children[i]);
    this.children = newChildren;
  }
  return this;
};

/**
 * Call String.prototype.replace on the very right-most source snippet. Useful
 * for trimming whitespace from the end of a source node, etc.
 *
 * @param aPattern The pattern to replace.
 * @param aReplacement The thing to replace the pattern with.
 */
SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
  var lastChild = this.children[this.children.length - 1];
  if (lastChild[isSourceNode]) {
    lastChild.replaceRight(aPattern, aReplacement);
  }
  else if (typeof lastChild === 'string') {
    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
  }
  else {
    this.children.push(''.replace(aPattern, aReplacement));
  }
  return this;
};

/**
 * Set the source content for a source file. This will be added to the SourceMapGenerator
 * in the sourcesContent field.
 *
 * @param aSourceFile The filename of the source file
 * @param aSourceContent The content of the source file
 */
SourceNode.prototype.setSourceContent =
  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
  };

/**
 * Walk over the tree of SourceNodes. The walking function is called for each
 * source file content and is passed the filename and source content.
 *
 * @param aFn The traversal function.
 */
SourceNode.prototype.walkSourceContents =
  function SourceNode_walkSourceContents(aFn) {
    for (var i = 0, len = this.children.length; i < len; i++) {
      if (this.children[i][isSourceNode]) {
        this.children[i].walkSourceContents(aFn);
      }
    }

    var sources = Object.keys(this.sourceContents);
    for (var i = 0, len = sources.length; i < len; i++) {
      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
    }
  };

/**
 * Return the string representation of this source node. Walks over the tree
 * and concatenates all the various snippets together to one string.
 */
SourceNode.prototype.toString = function SourceNode_toString() {
  var str = "";
  this.walk(function (chunk) {
    str += chunk;
  });
  return str;
};

/**
 * Returns the string representation of this source node along with a source
 * map.
 */
SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
  var generated = {
    code: "",
    line: 1,
    column: 0
  };
  var map = new SourceMapGenerator(aArgs);
  var sourceMappingActive = false;
  var lastOriginalSource = null;
  var lastOriginalLine = null;
  var lastOriginalColumn = null;
  var lastOriginalName = null;
  this.walk(function (chunk, original) {
    generated.code += chunk;
    if (original.source !== null
        && original.line !== null
        && original.column !== null) {
      if(lastOriginalSource !== original.source
         || lastOriginalLine !== original.line
         || lastOriginalColumn !== original.column
         || lastOriginalName !== original.name) {
        map.addMapping({
          source: original.source,
          original: {
            line: original.line,
            column: original.column
          },
          generated: {
            line: generated.line,
            column: generated.column
          },
          name: original.name
        });
      }
      lastOriginalSource = original.source;
      lastOriginalLine = original.line;
      lastOriginalColumn = original.column;
      lastOriginalName = original.name;
      sourceMappingActive = true;
    } else if (sourceMappingActive) {
      map.addMapping({
        generated: {
          line: generated.line,
          column: generated.column
        }
      });
      lastOriginalSource = null;
      sourceMappingActive = false;
    }
    for (var idx = 0, length = chunk.length; idx < length; idx++) {
      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
        generated.line++;
        generated.column = 0;
        // Mappings end at eol
        if (idx + 1 === length) {
          lastOriginalSource = null;
          sourceMappingActive = false;
        } else if (sourceMappingActive) {
          map.addMapping({
            source: original.source,
            original: {
              line: original.line,
              column: original.column
            },
            generated: {
              line: generated.line,
              column: generated.column
            },
            name: original.name
          });
        }
      } else {
        generated.column++;
      }
    }
  });
  this.walkSourceContents(function (sourceFile, sourceContent) {
    map.setSourceContent(sourceFile, sourceContent);
  });

  return { code: generated.code, map: map };
};

exports.SourceNode = SourceNode;
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

/**
 * This is a helper function for getting values from parameter/options
 * objects.
 *
 * @param args The object we are extracting values from
 * @param name The name of the property we are getting.
 * @param defaultValue An optional value to return if the property is missing
 * from the object. If this is not specified and the property is missing, an
 * error will be thrown.
 */
function getArg(aArgs, aName, aDefaultValue) {
  if (aName in aArgs) {
    return aArgs[aName];
  } else if (arguments.length === 3) {
    return aDefaultValue;
  } else {
    throw new Error('"' + aName + '" is a required argument.');
  }
}
exports.getArg = getArg;

var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
var dataUrlRegexp = /^data:.+\,.+$/;

function urlParse(aUrl) {
  var match = aUrl.match(urlRegexp);
  if (!match) {
    return null;
  }
  return {
    scheme: match[1],
    auth: match[2],
    host: match[3],
    port: match[4],
    path: match[5]
  };
}
exports.urlParse = urlParse;

function urlGenerate(aParsedUrl) {
  var url = '';
  if (aParsedUrl.scheme) {
    url += aParsedUrl.scheme + ':';
  }
  url += '//';
  if (aParsedUrl.auth) {
    url += aParsedUrl.auth + '@';
  }
  if (aParsedUrl.host) {
    url += aParsedUrl.host;
  }
  if (aParsedUrl.port) {
    url += ":" + aParsedUrl.port
  }
  if (aParsedUrl.path) {
    url += aParsedUrl.path;
  }
  return url;
}
exports.urlGenerate = urlGenerate;

/**
 * Normalizes a path, or the path portion of a URL:
 *
 * - Replaces consecutive slashes with one slash.
 * - Removes unnecessary '.' parts.
 * - Removes unnecessary '<dir>/..' parts.
 *
 * Based on code in the Node.js 'path' core module.
 *
 * @param aPath The path or url to normalize.
 */
function normalize(aPath) {
  var path = aPath;
  var url = urlParse(aPath);
  if (url) {
    if (!url.path) {
      return aPath;
    }
    path = url.path;
  }
  var isAbsolute = exports.isAbsolute(path);

  var parts = path.split(/\/+/);
  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
    part = parts[i];
    if (part === '.') {
      parts.splice(i, 1);
    } else if (part === '..') {
      up++;
    } else if (up > 0) {
      if (part === '') {
        // The first part is blank if the path is absolute. Trying to go
        // above the root is a no-op. Therefore we can remove all '..' parts
        // directly after the root.
        parts.splice(i + 1, up);
        up = 0;
      } else {
        parts.splice(i, 2);
        up--;
      }
    }
  }
  path = parts.join('/');

  if (path === '') {
    path = isAbsolute ? '/' : '.';
  }

  if (url) {
    url.path = path;
    return urlGenerate(url);
  }
  return path;
}
exports.normalize = normalize;

/**
 * Joins two paths/URLs.
 *
 * @param aRoot The root path or URL.
 * @param aPath The path or URL to be joined with the root.
 *
 * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
 *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended
 *   first.
 * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
 *   is updated with the result and aRoot is returned. Otherwise the result
 *   is returned.
 *   - If aPath is absolute, the result is aPath.
 *   - Otherwise the two paths are joined with a slash.
 * - Joining for example 'http://' and 'www.example.com' is also supported.
 */
function join(aRoot, aPath) {
  if (aRoot === "") {
    aRoot = ".";
  }
  if (aPath === "") {
    aPath = ".";
  }
  var aPathUrl = urlParse(aPath);
  var aRootUrl = urlParse(aRoot);
  if (aRootUrl) {
    aRoot = aRootUrl.path || '/';
  }

  // `join(foo, '//www.example.org')`
  if (aPathUrl && !aPathUrl.scheme) {
    if (aRootUrl) {
      aPathUrl.scheme = aRootUrl.scheme;
    }
    return urlGenerate(aPathUrl);
  }

  if (aPathUrl || aPath.match(dataUrlRegexp)) {
    return aPath;
  }

  // `join('http://', 'www.example.com')`
  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
    aRootUrl.host = aPath;
    return urlGenerate(aRootUrl);
  }

  var joined = aPath.charAt(0) === '/'
    ? aPath
    : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);

  if (aRootUrl) {
    aRootUrl.path = joined;
    return urlGenerate(aRootUrl);
  }
  return joined;
}
exports.join = join;

exports.isAbsolute = function (aPath) {
  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
};

/**
 * Make a path relative to a URL or another path.
 *
 * @param aRoot The root path or URL.
 * @param aPath The path or URL to be made relative to aRoot.
 */
function relative(aRoot, aPath) {
  if (aRoot === "") {
    aRoot = ".";
  }

  aRoot = aRoot.replace(/\/$/, '');

  // It is possible for the path to be above the root. In this case, simply
  // checking whether the root is a prefix of the path won't work. Instead, we
  // need to remove components from the root one by one, until either we find
  // a prefix that fits, or we run out of components to remove.
  var level = 0;
  while (aPath.indexOf(aRoot + '/') !== 0) {
    var index = aRoot.lastIndexOf("/");
    if (index < 0) {
      return aPath;
    }

    // If the only part of the root that is left is the scheme (i.e. http://,
    // file:///, etc.), one or more slashes (/), or simply nothing at all, we
    // have exhausted all components, so the path is not relative to the root.
    aRoot = aRoot.slice(0, index);
    if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
      return aPath;
    }

    ++level;
  }

  // Make sure we add a "../" for each component we removed from the root.
  return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
}
exports.relative = relative;

var supportsNullProto = (function () {
  var obj = Object.create(null);
  return !('__proto__' in obj);
}());

function identity (s) {
  return s;
}

/**
 * Because behavior goes wacky when you set `__proto__` on objects, we
 * have to prefix all the strings in our set with an arbitrary character.
 *
 * See https://github.com/mozilla/source-map/pull/31 and
 * https://github.com/mozilla/source-map/issues/30
 *
 * @param String aStr
 */
function toSetString(aStr) {
  if (isProtoString(aStr)) {
    return '$' + aStr;
  }

  return aStr;
}
exports.toSetString = supportsNullProto ? identity : toSetString;

function fromSetString(aStr) {
  if (isProtoString(aStr)) {
    return aStr.slice(1);
  }

  return aStr;
}
exports.fromSetString = supportsNullProto ? identity : fromSetString;

function isProtoString(s) {
  if (!s) {
    return false;
  }

  var length = s.length;

  if (length < 9 /* "__proto__".length */) {
    return false;
  }

  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||
      s.charCodeAt(length - 2) !== 95  /* '_' */ ||
      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
      s.charCodeAt(length - 4) !== 116 /* 't' */ ||
      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
      s.charCodeAt(length - 8) !== 95  /* '_' */ ||
      s.charCodeAt(length - 9) !== 95  /* '_' */) {
    return false;
  }

  for (var i = length - 10; i >= 0; i--) {
    if (s.charCodeAt(i) !== 36 /* '$' */) {
      return false;
    }
  }

  return true;
}

/**
 * Comparator between two mappings where the original positions are compared.
 *
 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
 * mappings with the same original source/line/column, but different generated
 * line and column the same. Useful when searching for a mapping with a
 * stubbed out mapping.
 */
function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
  var cmp = strcmp(mappingA.source, mappingB.source);
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalLine - mappingB.originalLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalColumn - mappingB.originalColumn;
  if (cmp !== 0 || onlyCompareOriginal) {
    return cmp;
  }

  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.generatedLine - mappingB.generatedLine;
  if (cmp !== 0) {
    return cmp;
  }

  return strcmp(mappingA.name, mappingB.name);
}
exports.compareByOriginalPositions = compareByOriginalPositions;

/**
 * Comparator between two mappings with deflated source and name indices where
 * the generated positions are compared.
 *
 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
 * mappings with the same generated line and column, but different
 * source/name/original line and column the same. Useful when searching for a
 * mapping with a stubbed out mapping.
 */
function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
  var cmp = mappingA.generatedLine - mappingB.generatedLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
  if (cmp !== 0 || onlyCompareGenerated) {
    return cmp;
  }

  cmp = strcmp(mappingA.source, mappingB.source);
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalLine - mappingB.originalLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalColumn - mappingB.originalColumn;
  if (cmp !== 0) {
    return cmp;
  }

  return strcmp(mappingA.name, mappingB.name);
}
exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;

function strcmp(aStr1, aStr2) {
  if (aStr1 === aStr2) {
    return 0;
  }

  if (aStr1 === null) {
    return 1; // aStr2 !== null
  }

  if (aStr2 === null) {
    return -1; // aStr1 !== null
  }

  if (aStr1 > aStr2) {
    return 1;
  }

  return -1;
}

/**
 * Comparator between two mappings with inflated source and name strings where
 * the generated positions are compared.
 */
function compareByGeneratedPositionsInflated(mappingA, mappingB) {
  var cmp = mappingA.generatedLine - mappingB.generatedLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = strcmp(mappingA.source, mappingB.source);
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalLine - mappingB.originalLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalColumn - mappingB.originalColumn;
  if (cmp !== 0) {
    return cmp;
  }

  return strcmp(mappingA.name, mappingB.name);
}
exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;

/**
 * Strip any JSON XSSI avoidance prefix from the string (as documented
 * in the source maps specification), and then parse the string as
 * JSON.
 */
function parseSourceMapInput(str) {
  return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
}
exports.parseSourceMapInput = parseSourceMapInput;

/**
 * Compute the URL of a source given the the source root, the source's
 * URL, and the source map's URL.
 */
function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
  sourceURL = sourceURL || '';

  if (sourceRoot) {
    // This follows what Chrome does.
    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
      sourceRoot += '/';
    }
    // The spec says:
    //   Line 4: An optional source root, useful for relocating source
    //   files on a server or removing repeated values in the
    //   â€œsourcesâ€� entry.  This value is prepended to the individual
    //   entries in the â€œsourceâ€� field.
    sourceURL = sourceRoot + sourceURL;
  }

  // Historically, SourceMapConsumer did not take the sourceMapURL as
  // a parameter.  This mode is still somewhat supported, which is why
  // this code block is conditional.  However, it's preferable to pass
  // the source map URL to SourceMapConsumer, so that this function
  // can implement the source URL resolution algorithm as outlined in
  // the spec.  This block is basically the equivalent of:
  //    new URL(sourceURL, sourceMapURL).toString()
  // ... except it avoids using URL, which wasn't available in the
  // older releases of node still supported by this library.
  //
  // The spec says:
  //   If the sources are not absolute URLs after prepending of the
  //   â€œsourceRootâ€�, the sources are resolved relative to the
  //   SourceMap (like resolving script src in a html document).
  if (sourceMapURL) {
    var parsed = urlParse(sourceMapURL);
    if (!parsed) {
      throw new Error("sourceMapURL could not be parsed");
    }
    if (parsed.path) {
      // Strip the last path component, but keep the "/".
      var index = parsed.path.lastIndexOf('/');
      if (index >= 0) {
        parsed.path = parsed.path.substring(0, index + 1);
      }
    }
    sourceURL = join(urlGenerate(parsed), sourceURL);
  }

  return normalize(sourceURL);
}
exports.computeSourceURL = computeSourceURL;
(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define([], factory);
	else if(typeof exports === 'object')
		exports["sourceMap"] = factory();
	else
		root["sourceMap"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;
/******/
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

	/*
	 * Copyright 2009-2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE.txt or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
	exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;
	exports.SourceNode = __webpack_require__(10).SourceNode;


/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	var base64VLQ = __webpack_require__(2);
	var util = __webpack_require__(4);
	var ArraySet = __webpack_require__(5).ArraySet;
	var MappingList = __webpack_require__(6).MappingList;
	
	/**
	 * An instance of the SourceMapGenerator represents a source map which is
	 * being built incrementally. You may pass an object with the following
	 * properties:
	 *
	 *   - file: The filename of the generated source.
	 *   - sourceRoot: A root for all relative URLs in this source map.
	 */
	function SourceMapGenerator(aArgs) {
	  if (!aArgs) {
	    aArgs = {};
	  }
	  this._file = util.getArg(aArgs, 'file', null);
	  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
	  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
	  this._sources = new ArraySet();
	  this._names = new ArraySet();
	  this._mappings = new MappingList();
	  this._sourcesContents = null;
	}
	
	SourceMapGenerator.prototype._version = 3;
	
	/**
	 * Creates a new SourceMapGenerator based on a SourceMapConsumer
	 *
	 * @param aSourceMapConsumer The SourceMap.
	 */
	SourceMapGenerator.fromSourceMap =
	  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
	    var sourceRoot = aSourceMapConsumer.sourceRoot;
	    var generator = new SourceMapGenerator({
	      file: aSourceMapConsumer.file,
	      sourceRoot: sourceRoot
	    });
	    aSourceMapConsumer.eachMapping(function (mapping) {
	      var newMapping = {
	        generated: {
	          line: mapping.generatedLine,
	          column: mapping.generatedColumn
	        }
	      };
	
	      if (mapping.source != null) {
	        newMapping.source = mapping.source;
	        if (sourceRoot != null) {
	          newMapping.source = util.relative(sourceRoot, newMapping.source);
	        }
	
	        newMapping.original = {
	          line: mapping.originalLine,
	          column: mapping.originalColumn
	        };
	
	        if (mapping.name != null) {
	          newMapping.name = mapping.name;
	        }
	      }
	
	      generator.addMapping(newMapping);
	    });
	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
	      var sourceRelative = sourceFile;
	      if (sourceRoot !== null) {
	        sourceRelative = util.relative(sourceRoot, sourceFile);
	      }
	
	      if (!generator._sources.has(sourceRelative)) {
	        generator._sources.add(sourceRelative);
	      }
	
	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
	      if (content != null) {
	        generator.setSourceContent(sourceFile, content);
	      }
	    });
	    return generator;
	  };
	
	/**
	 * Add a single mapping from original source line and column to the generated
	 * source's line and column for this source map being created. The mapping
	 * object should have the following properties:
	 *
	 *   - generated: An object with the generated line and column positions.
	 *   - original: An object with the original line and column positions.
	 *   - source: The original source file (relative to the sourceRoot).
	 *   - name: An optional original token name for this mapping.
	 */
	SourceMapGenerator.prototype.addMapping =
	  function SourceMapGenerator_addMapping(aArgs) {
	    var generated = util.getArg(aArgs, 'generated');
	    var original = util.getArg(aArgs, 'original', null);
	    var source = util.getArg(aArgs, 'source', null);
	    var name = util.getArg(aArgs, 'name', null);
	
	    if (!this._skipValidation) {
	      this._validateMapping(generated, original, source, name);
	    }
	
	    if (source != null) {
	      source = String(source);
	      if (!this._sources.has(source)) {
	        this._sources.add(source);
	      }
	    }
	
	    if (name != null) {
	      name = String(name);
	      if (!this._names.has(name)) {
	        this._names.add(name);
	      }
	    }
	
	    this._mappings.add({
	      generatedLine: generated.line,
	      generatedColumn: generated.column,
	      originalLine: original != null && original.line,
	      originalColumn: original != null && original.column,
	      source: source,
	      name: name
	    });
	  };
	
	/**
	 * Set the source content for a source file.
	 */
	SourceMapGenerator.prototype.setSourceContent =
	  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
	    var source = aSourceFile;
	    if (this._sourceRoot != null) {
	      source = util.relative(this._sourceRoot, source);
	    }
	
	    if (aSourceContent != null) {
	      // Add the source content to the _sourcesContents map.
	      // Create a new _sourcesContents map if the property is null.
	      if (!this._sourcesContents) {
	        this._sourcesContents = Object.create(null);
	      }
	      this._sourcesContents[util.toSetString(source)] = aSourceContent;
	    } else if (this._sourcesContents) {
	      // Remove the source file from the _sourcesContents map.
	      // If the _sourcesContents map is empty, set the property to null.
	      delete this._sourcesContents[util.toSetString(source)];
	      if (Object.keys(this._sourcesContents).length === 0) {
	        this._sourcesContents = null;
	      }
	    }
	  };
	
	/**
	 * Applies the mappings of a sub-source-map for a specific source file to the
	 * source map being generated. Each mapping to the supplied source file is
	 * rewritten using the supplied source map. Note: The resolution for the
	 * resulting mappings is the minimium of this map and the supplied map.
	 *
	 * @param aSourceMapConsumer The source map to be applied.
	 * @param aSourceFile Optional. The filename of the source file.
	 *        If omitted, SourceMapConsumer's file property will be used.
	 * @param aSourceMapPath Optional. The dirname of the path to the source map
	 *        to be applied. If relative, it is relative to the SourceMapConsumer.
	 *        This parameter is needed when the two source maps aren't in the same
	 *        directory, and the source map to be applied contains relative source
	 *        paths. If so, those relative source paths need to be rewritten
	 *        relative to the SourceMapGenerator.
	 */
	SourceMapGenerator.prototype.applySourceMap =
	  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
	    var sourceFile = aSourceFile;
	    // If aSourceFile is omitted, we will use the file property of the SourceMap
	    if (aSourceFile == null) {
	      if (aSourceMapConsumer.file == null) {
	        throw new Error(
	          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
	          'or the source map\'s "file" property. Both were omitted.'
	        );
	      }
	      sourceFile = aSourceMapConsumer.file;
	    }
	    var sourceRoot = this._sourceRoot;
	    // Make "sourceFile" relative if an absolute Url is passed.
	    if (sourceRoot != null) {
	      sourceFile = util.relative(sourceRoot, sourceFile);
	    }
	    // Applying the SourceMap can add and remove items from the sources and
	    // the names array.
	    var newSources = new ArraySet();
	    var newNames = new ArraySet();
	
	    // Find mappings for the "sourceFile"
	    this._mappings.unsortedForEach(function (mapping) {
	      if (mapping.source === sourceFile && mapping.originalLine != null) {
	        // Check if it can be mapped by the source map, then update the mapping.
	        var original = aSourceMapConsumer.originalPositionFor({
	          line: mapping.originalLine,
	          column: mapping.originalColumn
	        });
	        if (original.source != null) {
	          // Copy mapping
	          mapping.source = original.source;
	          if (aSourceMapPath != null) {
	            mapping.source = util.join(aSourceMapPath, mapping.source)
	          }
	          if (sourceRoot != null) {
	            mapping.source = util.relative(sourceRoot, mapping.source);
	          }
	          mapping.originalLine = original.line;
	          mapping.originalColumn = original.column;
	          if (original.name != null) {
	            mapping.name = original.name;
	          }
	        }
	      }
	
	      var source = mapping.source;
	      if (source != null && !newSources.has(source)) {
	        newSources.add(source);
	      }
	
	      var name = mapping.name;
	      if (name != null && !newNames.has(name)) {
	        newNames.add(name);
	      }
	
	    }, this);
	    this._sources = newSources;
	    this._names = newNames;
	
	    // Copy sourcesContents of applied map.
	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
	      if (content != null) {
	        if (aSourceMapPath != null) {
	          sourceFile = util.join(aSourceMapPath, sourceFile);
	        }
	        if (sourceRoot != null) {
	          sourceFile = util.relative(sourceRoot, sourceFile);
	        }
	        this.setSourceContent(sourceFile, content);
	      }
	    }, this);
	  };
	
	/**
	 * A mapping can have one of the three levels of data:
	 *
	 *   1. Just the generated position.
	 *   2. The Generated position, original position, and original source.
	 *   3. Generated and original position, original source, as well as a name
	 *      token.
	 *
	 * To maintain consistency, we validate that any new mapping being added falls
	 * in to one of these categories.
	 */
	SourceMapGenerator.prototype._validateMapping =
	  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
	                                              aName) {
	    // When aOriginal is truthy but has empty values for .line and .column,
	    // it is most likely a programmer error. In this case we throw a very
	    // specific error message to try to guide them the right way.
	    // For example: https://github.com/Polymer/polymer-bundler/pull/519
	    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
	        throw new Error(
	            'original.line and original.column are not numbers -- you probably meant to omit ' +
	            'the original mapping entirely and only map the generated position. If so, pass ' +
	            'null for the original mapping instead of an object with empty or null values.'
	        );
	    }
	
	    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
	        && aGenerated.line > 0 && aGenerated.column >= 0
	        && !aOriginal && !aSource && !aName) {
	      // Case 1.
	      return;
	    }
	    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
	             && aOriginal && 'line' in aOriginal && 'column' in aOriginal
	             && aGenerated.line > 0 && aGenerated.column >= 0
	             && aOriginal.line > 0 && aOriginal.column >= 0
	             && aSource) {
	      // Cases 2 and 3.
	      return;
	    }
	    else {
	      throw new Error('Invalid mapping: ' + JSON.stringify({
	        generated: aGenerated,
	        source: aSource,
	        original: aOriginal,
	        name: aName
	      }));
	    }
	  };
	
	/**
	 * Serialize the accumulated mappings in to the stream of base 64 VLQs
	 * specified by the source map format.
	 */
	SourceMapGenerator.prototype._serializeMappings =
	  function SourceMapGenerator_serializeMappings() {
	    var previousGeneratedColumn = 0;
	    var previousGeneratedLine = 1;
	    var previousOriginalColumn = 0;
	    var previousOriginalLine = 0;
	    var previousName = 0;
	    var previousSource = 0;
	    var result = '';
	    var next;
	    var mapping;
	    var nameIdx;
	    var sourceIdx;
	
	    var mappings = this._mappings.toArray();
	    for (var i = 0, len = mappings.length; i < len; i++) {
	      mapping = mappings[i];
	      next = ''
	
	      if (mapping.generatedLine !== previousGeneratedLine) {
	        previousGeneratedColumn = 0;
	        while (mapping.generatedLine !== previousGeneratedLine) {
	          next += ';';
	          previousGeneratedLine++;
	        }
	      }
	      else {
	        if (i > 0) {
	          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
	            continue;
	          }
	          next += ',';
	        }
	      }
	
	      next += base64VLQ.encode(mapping.generatedColumn
	                                 - previousGeneratedColumn);
	      previousGeneratedColumn = mapping.generatedColumn;
	
	      if (mapping.source != null) {
	        sourceIdx = this._sources.indexOf(mapping.source);
	        next += base64VLQ.encode(sourceIdx - previousSource);
	        previousSource = sourceIdx;
	
	        // lines are stored 0-based in SourceMap spec version 3
	        next += base64VLQ.encode(mapping.originalLine - 1
	                                   - previousOriginalLine);
	        previousOriginalLine = mapping.originalLine - 1;
	
	        next += base64VLQ.encode(mapping.originalColumn
	                                   - previousOriginalColumn);
	        previousOriginalColumn = mapping.originalColumn;
	
	        if (mapping.name != null) {
	          nameIdx = this._names.indexOf(mapping.name);
	          next += base64VLQ.encode(nameIdx - previousName);
	          previousName = nameIdx;
	        }
	      }
	
	      result += next;
	    }
	
	    return result;
	  };
	
	SourceMapGenerator.prototype._generateSourcesContent =
	  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
	    return aSources.map(function (source) {
	      if (!this._sourcesContents) {
	        return null;
	      }
	      if (aSourceRoot != null) {
	        source = util.relative(aSourceRoot, source);
	      }
	      var key = util.toSetString(source);
	      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
	        ? this._sourcesContents[key]
	        : null;
	    }, this);
	  };
	
	/**
	 * Externalize the source map.
	 */
	SourceMapGenerator.prototype.toJSON =
	  function SourceMapGenerator_toJSON() {
	    var map = {
	      version: this._version,
	      sources: this._sources.toArray(),
	      names: this._names.toArray(),
	      mappings: this._serializeMappings()
	    };
	    if (this._file != null) {
	      map.file = this._file;
	    }
	    if (this._sourceRoot != null) {
	      map.sourceRoot = this._sourceRoot;
	    }
	    if (this._sourcesContents) {
	      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
	    }
	
	    return map;
	  };
	
	/**
	 * Render the source map being generated to a string.
	 */
	SourceMapGenerator.prototype.toString =
	  function SourceMapGenerator_toString() {
	    return JSON.stringify(this.toJSON());
	  };
	
	exports.SourceMapGenerator = SourceMapGenerator;


/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 *
	 * Based on the Base 64 VLQ implementation in Closure Compiler:
	 * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
	 *
	 * Copyright 2011 The Closure Compiler Authors. All rights reserved.
	 * Redistribution and use in source and binary forms, with or without
	 * modification, are permitted provided that the following conditions are
	 * met:
	 *
	 *  * Redistributions of source code must retain the above copyright
	 *    notice, this list of conditions and the following disclaimer.
	 *  * Redistributions in binary form must reproduce the above
	 *    copyright notice, this list of conditions and the following
	 *    disclaimer in the documentation and/or other materials provided
	 *    with the distribution.
	 *  * Neither the name of Google Inc. nor the names of its
	 *    contributors may be used to endorse or promote products derived
	 *    from this software without specific prior written permission.
	 *
	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
	 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
	 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
	 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
	 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
	 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
	 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
	 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
	 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
	 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
	 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
	 */
	
	var base64 = __webpack_require__(3);
	
	// A single base 64 digit can contain 6 bits of data. For the base 64 variable
	// length quantities we use in the source map spec, the first bit is the sign,
	// the next four bits are the actual value, and the 6th bit is the
	// continuation bit. The continuation bit tells us whether there are more
	// digits in this value following this digit.
	//
	//   Continuation
	//   |    Sign
	//   |    |
	//   V    V
	//   101011
	
	var VLQ_BASE_SHIFT = 5;
	
	// binary: 100000
	var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
	
	// binary: 011111
	var VLQ_BASE_MASK = VLQ_BASE - 1;
	
	// binary: 100000
	var VLQ_CONTINUATION_BIT = VLQ_BASE;
	
	/**
	 * Converts from a two-complement value to a value where the sign bit is
	 * placed in the least significant bit.  For example, as decimals:
	 *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
	 *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
	 */
	function toVLQSigned(aValue) {
	  return aValue < 0
	    ? ((-aValue) << 1) + 1
	    : (aValue << 1) + 0;
	}
	
	/**
	 * Converts to a two-complement value from a value where the sign bit is
	 * placed in the least significant bit.  For example, as decimals:
	 *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1
	 *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2
	 */
	function fromVLQSigned(aValue) {
	  var isNegative = (aValue & 1) === 1;
	  var shifted = aValue >> 1;
	  return isNegative
	    ? -shifted
	    : shifted;
	}
	
	/**
	 * Returns the base 64 VLQ encoded value.
	 */
	exports.encode = function base64VLQ_encode(aValue) {
	  var encoded = "";
	  var digit;
	
	  var vlq = toVLQSigned(aValue);
	
	  do {
	    digit = vlq & VLQ_BASE_MASK;
	    vlq >>>= VLQ_BASE_SHIFT;
	    if (vlq > 0) {
	      // There are still more digits in this value, so we must make sure the
	      // continuation bit is marked.
	      digit |= VLQ_CONTINUATION_BIT;
	    }
	    encoded += base64.encode(digit);
	  } while (vlq > 0);
	
	  return encoded;
	};
	
	/**
	 * Decodes the next base 64 VLQ value from the given string and returns the
	 * value and the rest of the string via the out parameter.
	 */
	exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
	  var strLen = aStr.length;
	  var result = 0;
	  var shift = 0;
	  var continuation, digit;
	
	  do {
	    if (aIndex >= strLen) {
	      throw new Error("Expected more digits in base 64 VLQ value.");
	    }
	
	    digit = base64.decode(aStr.charCodeAt(aIndex++));
	    if (digit === -1) {
	      throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
	    }
	
	    continuation = !!(digit & VLQ_CONTINUATION_BIT);
	    digit &= VLQ_BASE_MASK;
	    result = result + (digit << shift);
	    shift += VLQ_BASE_SHIFT;
	  } while (continuation);
	
	  aOutParam.value = fromVLQSigned(result);
	  aOutParam.rest = aIndex;
	};


/***/ }),
/* 3 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
	
	/**
	 * Encode an integer in the range of 0 to 63 to a single base 64 digit.
	 */
	exports.encode = function (number) {
	  if (0 <= number && number < intToCharMap.length) {
	    return intToCharMap[number];
	  }
	  throw new TypeError("Must be between 0 and 63: " + number);
	};
	
	/**
	 * Decode a single base 64 character code digit to an integer. Returns -1 on
	 * failure.
	 */
	exports.decode = function (charCode) {
	  var bigA = 65;     // 'A'
	  var bigZ = 90;     // 'Z'
	
	  var littleA = 97;  // 'a'
	  var littleZ = 122; // 'z'
	
	  var zero = 48;     // '0'
	  var nine = 57;     // '9'
	
	  var plus = 43;     // '+'
	  var slash = 47;    // '/'
	
	  var littleOffset = 26;
	  var numberOffset = 52;
	
	  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
	  if (bigA <= charCode && charCode <= bigZ) {
	    return (charCode - bigA);
	  }
	
	  // 26 - 51: abcdefghijklmnopqrstuvwxyz
	  if (littleA <= charCode && charCode <= littleZ) {
	    return (charCode - littleA + littleOffset);
	  }
	
	  // 52 - 61: 0123456789
	  if (zero <= charCode && charCode <= nine) {
	    return (charCode - zero + numberOffset);
	  }
	
	  // 62: +
	  if (charCode == plus) {
	    return 62;
	  }
	
	  // 63: /
	  if (charCode == slash) {
	    return 63;
	  }
	
	  // Invalid base64 digit.
	  return -1;
	};


/***/ }),
/* 4 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	/**
	 * This is a helper function for getting values from parameter/options
	 * objects.
	 *
	 * @param args The object we are extracting values from
	 * @param name The name of the property we are getting.
	 * @param defaultValue An optional value to return if the property is missing
	 * from the object. If this is not specified and the property is missing, an
	 * error will be thrown.
	 */
	function getArg(aArgs, aName, aDefaultValue) {
	  if (aName in aArgs) {
	    return aArgs[aName];
	  } else if (arguments.length === 3) {
	    return aDefaultValue;
	  } else {
	    throw new Error('"' + aName + '" is a required argument.');
	  }
	}
	exports.getArg = getArg;
	
	var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
	var dataUrlRegexp = /^data:.+\,.+$/;
	
	function urlParse(aUrl) {
	  var match = aUrl.match(urlRegexp);
	  if (!match) {
	    return null;
	  }
	  return {
	    scheme: match[1],
	    auth: match[2],
	    host: match[3],
	    port: match[4],
	    path: match[5]
	  };
	}
	exports.urlParse = urlParse;
	
	function urlGenerate(aParsedUrl) {
	  var url = '';
	  if (aParsedUrl.scheme) {
	    url += aParsedUrl.scheme + ':';
	  }
	  url += '//';
	  if (aParsedUrl.auth) {
	    url += aParsedUrl.auth + '@';
	  }
	  if (aParsedUrl.host) {
	    url += aParsedUrl.host;
	  }
	  if (aParsedUrl.port) {
	    url += ":" + aParsedUrl.port
	  }
	  if (aParsedUrl.path) {
	    url += aParsedUrl.path;
	  }
	  return url;
	}
	exports.urlGenerate = urlGenerate;
	
	/**
	 * Normalizes a path, or the path portion of a URL:
	 *
	 * - Replaces consecutive slashes with one slash.
	 * - Removes unnecessary '.' parts.
	 * - Removes unnecessary '<dir>/..' parts.
	 *
	 * Based on code in the Node.js 'path' core module.
	 *
	 * @param aPath The path or url to normalize.
	 */
	function normalize(aPath) {
	  var path = aPath;
	  var url = urlParse(aPath);
	  if (url) {
	    if (!url.path) {
	      return aPath;
	    }
	    path = url.path;
	  }
	  var isAbsolute = exports.isAbsolute(path);
	
	  var parts = path.split(/\/+/);
	  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
	    part = parts[i];
	    if (part === '.') {
	      parts.splice(i, 1);
	    } else if (part === '..') {
	      up++;
	    } else if (up > 0) {
	      if (part === '') {
	        // The first part is blank if the path is absolute. Trying to go
	        // above the root is a no-op. Therefore we can remove all '..' parts
	        // directly after the root.
	        parts.splice(i + 1, up);
	        up = 0;
	      } else {
	        parts.splice(i, 2);
	        up--;
	      }
	    }
	  }
	  path = parts.join('/');
	
	  if (path === '') {
	    path = isAbsolute ? '/' : '.';
	  }
	
	  if (url) {
	    url.path = path;
	    return urlGenerate(url);
	  }
	  return path;
	}
	exports.normalize = normalize;
	
	/**
	 * Joins two paths/URLs.
	 *
	 * @param aRoot The root path or URL.
	 * @param aPath The path or URL to be joined with the root.
	 *
	 * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
	 *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended
	 *   first.
	 * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
	 *   is updated with the result and aRoot is returned. Otherwise the result
	 *   is returned.
	 *   - If aPath is absolute, the result is aPath.
	 *   - Otherwise the two paths are joined with a slash.
	 * - Joining for example 'http://' and 'www.example.com' is also supported.
	 */
	function join(aRoot, aPath) {
	  if (aRoot === "") {
	    aRoot = ".";
	  }
	  if (aPath === "") {
	    aPath = ".";
	  }
	  var aPathUrl = urlParse(aPath);
	  var aRootUrl = urlParse(aRoot);
	  if (aRootUrl) {
	    aRoot = aRootUrl.path || '/';
	  }
	
	  // `join(foo, '//www.example.org')`
	  if (aPathUrl && !aPathUrl.scheme) {
	    if (aRootUrl) {
	      aPathUrl.scheme = aRootUrl.scheme;
	    }
	    return urlGenerate(aPathUrl);
	  }
	
	  if (aPathUrl || aPath.match(dataUrlRegexp)) {
	    return aPath;
	  }
	
	  // `join('http://', 'www.example.com')`
	  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
	    aRootUrl.host = aPath;
	    return urlGenerate(aRootUrl);
	  }
	
	  var joined = aPath.charAt(0) === '/'
	    ? aPath
	    : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
	
	  if (aRootUrl) {
	    aRootUrl.path = joined;
	    return urlGenerate(aRootUrl);
	  }
	  return joined;
	}
	exports.join = join;
	
	exports.isAbsolute = function (aPath) {
	  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
	};
	
	/**
	 * Make a path relative to a URL or another path.
	 *
	 * @param aRoot The root path or URL.
	 * @param aPath The path or URL to be made relative to aRoot.
	 */
	function relative(aRoot, aPath) {
	  if (aRoot === "") {
	    aRoot = ".";
	  }
	
	  aRoot = aRoot.replace(/\/$/, '');
	
	  // It is possible for the path to be above the root. In this case, simply
	  // checking whether the root is a prefix of the path won't work. Instead, we
	  // need to remove components from the root one by one, until either we find
	  // a prefix that fits, or we run out of components to remove.
	  var level = 0;
	  while (aPath.indexOf(aRoot + '/') !== 0) {
	    var index = aRoot.lastIndexOf("/");
	    if (index < 0) {
	      return aPath;
	    }
	
	    // If the only part of the root that is left is the scheme (i.e. http://,
	    // file:///, etc.), one or more slashes (/), or simply nothing at all, we
	    // have exhausted all components, so the path is not relative to the root.
	    aRoot = aRoot.slice(0, index);
	    if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
	      return aPath;
	    }
	
	    ++level;
	  }
	
	  // Make sure we add a "../" for each component we removed from the root.
	  return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
	}
	exports.relative = relative;
	
	var supportsNullProto = (function () {
	  var obj = Object.create(null);
	  return !('__proto__' in obj);
	}());
	
	function identity (s) {
	  return s;
	}
	
	/**
	 * Because behavior goes wacky when you set `__proto__` on objects, we
	 * have to prefix all the strings in our set with an arbitrary character.
	 *
	 * See https://github.com/mozilla/source-map/pull/31 and
	 * https://github.com/mozilla/source-map/issues/30
	 *
	 * @param String aStr
	 */
	function toSetString(aStr) {
	  if (isProtoString(aStr)) {
	    return '$' + aStr;
	  }
	
	  return aStr;
	}
	exports.toSetString = supportsNullProto ? identity : toSetString;
	
	function fromSetString(aStr) {
	  if (isProtoString(aStr)) {
	    return aStr.slice(1);
	  }
	
	  return aStr;
	}
	exports.fromSetString = supportsNullProto ? identity : fromSetString;
	
	function isProtoString(s) {
	  if (!s) {
	    return false;
	  }
	
	  var length = s.length;
	
	  if (length < 9 /* "__proto__".length */) {
	    return false;
	  }
	
	  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||
	      s.charCodeAt(length - 2) !== 95  /* '_' */ ||
	      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
	      s.charCodeAt(length - 4) !== 116 /* 't' */ ||
	      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
	      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
	      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
	      s.charCodeAt(length - 8) !== 95  /* '_' */ ||
	      s.charCodeAt(length - 9) !== 95  /* '_' */) {
	    return false;
	  }
	
	  for (var i = length - 10; i >= 0; i--) {
	    if (s.charCodeAt(i) !== 36 /* '$' */) {
	      return false;
	    }
	  }
	
	  return true;
	}
	
	/**
	 * Comparator between two mappings where the original positions are compared.
	 *
	 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
	 * mappings with the same original source/line/column, but different generated
	 * line and column the same. Useful when searching for a mapping with a
	 * stubbed out mapping.
	 */
	function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
	  var cmp = strcmp(mappingA.source, mappingB.source);
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.originalLine - mappingB.originalLine;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.originalColumn - mappingB.originalColumn;
	  if (cmp !== 0 || onlyCompareOriginal) {
	    return cmp;
	  }
	
	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.generatedLine - mappingB.generatedLine;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  return strcmp(mappingA.name, mappingB.name);
	}
	exports.compareByOriginalPositions = compareByOriginalPositions;
	
	/**
	 * Comparator between two mappings with deflated source and name indices where
	 * the generated positions are compared.
	 *
	 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
	 * mappings with the same generated line and column, but different
	 * source/name/original line and column the same. Useful when searching for a
	 * mapping with a stubbed out mapping.
	 */
	function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
	  var cmp = mappingA.generatedLine - mappingB.generatedLine;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
	  if (cmp !== 0 || onlyCompareGenerated) {
	    return cmp;
	  }
	
	  cmp = strcmp(mappingA.source, mappingB.source);
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.originalLine - mappingB.originalLine;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.originalColumn - mappingB.originalColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  return strcmp(mappingA.name, mappingB.name);
	}
	exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
	
	function strcmp(aStr1, aStr2) {
	  if (aStr1 === aStr2) {
	    return 0;
	  }
	
	  if (aStr1 === null) {
	    return 1; // aStr2 !== null
	  }
	
	  if (aStr2 === null) {
	    return -1; // aStr1 !== null
	  }
	
	  if (aStr1 > aStr2) {
	    return 1;
	  }
	
	  return -1;
	}
	
	/**
	 * Comparator between two mappings with inflated source and name strings where
	 * the generated positions are compared.
	 */
	function compareByGeneratedPositionsInflated(mappingA, mappingB) {
	  var cmp = mappingA.generatedLine - mappingB.generatedLine;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = strcmp(mappingA.source, mappingB.source);
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.originalLine - mappingB.originalLine;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.originalColumn - mappingB.originalColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  return strcmp(mappingA.name, mappingB.name);
	}
	exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
	
	/**
	 * Strip any JSON XSSI avoidance prefix from the string (as documented
	 * in the source maps specification), and then parse the string as
	 * JSON.
	 */
	function parseSourceMapInput(str) {
	  return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
	}
	exports.parseSourceMapInput = parseSourceMapInput;
	
	/**
	 * Compute the URL of a source given the the source root, the source's
	 * URL, and the source map's URL.
	 */
	function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
	  sourceURL = sourceURL || '';
	
	  if (sourceRoot) {
	    // This follows what Chrome does.
	    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
	      sourceRoot += '/';
	    }
	    // The spec says:
	    //   Line 4: An optional source root, useful for relocating source
	    //   files on a server or removing repeated values in the
	    //   â€œsourcesâ€� entry.  This value is prepended to the individual
	    //   entries in the â€œsourceâ€� field.
	    sourceURL = sourceRoot + sourceURL;
	  }
	
	  // Historically, SourceMapConsumer did not take the sourceMapURL as
	  // a parameter.  This mode is still somewhat supported, which is why
	  // this code block is conditional.  However, it's preferable to pass
	  // the source map URL to SourceMapConsumer, so that this function
	  // can implement the source URL resolution algorithm as outlined in
	  // the spec.  This block is basically the equivalent of:
	  //    new URL(sourceURL, sourceMapURL).toString()
	  // ... except it avoids using URL, which wasn't available in the
	  // older releases of node still supported by this library.
	  //
	  // The spec says:
	  //   If the sources are not absolute URLs after prepending of the
	  //   â€œsourceRootâ€�, the sources are resolved relative to the
	  //   SourceMap (like resolving script src in a html document).
	  if (sourceMapURL) {
	    var parsed = urlParse(sourceMapURL);
	    if (!parsed) {
	      throw new Error("sourceMapURL could not be parsed");
	    }
	    if (parsed.path) {
	      // Strip the last path component, but keep the "/".
	      var index = parsed.path.lastIndexOf('/');
	      if (index >= 0) {
	        parsed.path = parsed.path.substring(0, index + 1);
	      }
	    }
	    sourceURL = join(urlGenerate(parsed), sourceURL);
	  }
	
	  return normalize(sourceURL);
	}
	exports.computeSourceURL = computeSourceURL;


/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	var util = __webpack_require__(4);
	var has = Object.prototype.hasOwnProperty;
	var hasNativeMap = typeof Map !== "undefined";
	
	/**
	 * A data structure which is a combination of an array and a set. Adding a new
	 * member is O(1), testing for membership is O(1), and finding the index of an
	 * element is O(1). Removing elements from the set is not supported. Only
	 * strings are supported for membership.
	 */
	function ArraySet() {
	  this._array = [];
	  this._set = hasNativeMap ? new Map() : Object.create(null);
	}
	
	/**
	 * Static method for creating ArraySet instances from an existing array.
	 */
	ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
	  var set = new ArraySet();
	  for (var i = 0, len = aArray.length; i < len; i++) {
	    set.add(aArray[i], aAllowDuplicates);
	  }
	  return set;
	};
	
	/**
	 * Return how many unique items are in this ArraySet. If duplicates have been
	 * added, than those do not count towards the size.
	 *
	 * @returns Number
	 */
	ArraySet.prototype.size = function ArraySet_size() {
	  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
	};
	
	/**
	 * Add the given string to this set.
	 *
	 * @param String aStr
	 */
	ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
	  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
	  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
	  var idx = this._array.length;
	  if (!isDuplicate || aAllowDuplicates) {
	    this._array.push(aStr);
	  }
	  if (!isDuplicate) {
	    if (hasNativeMap) {
	      this._set.set(aStr, idx);
	    } else {
	      this._set[sStr] = idx;
	    }
	  }
	};
	
	/**
	 * Is the given string a member of this set?
	 *
	 * @param String aStr
	 */
	ArraySet.prototype.has = function ArraySet_has(aStr) {
	  if (hasNativeMap) {
	    return this._set.has(aStr);
	  } else {
	    var sStr = util.toSetString(aStr);
	    return has.call(this._set, sStr);
	  }
	};
	
	/**
	 * What is the index of the given string in the array?
	 *
	 * @param String aStr
	 */
	ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
	  if (hasNativeMap) {
	    var idx = this._set.get(aStr);
	    if (idx >= 0) {
	        return idx;
	    }
	  } else {
	    var sStr = util.toSetString(aStr);
	    if (has.call(this._set, sStr)) {
	      return this._set[sStr];
	    }
	  }
	
	  throw new Error('"' + aStr + '" is not in the set.');
	};
	
	/**
	 * What is the element at the given index?
	 *
	 * @param Number aIdx
	 */
	ArraySet.prototype.at = function ArraySet_at(aIdx) {
	  if (aIdx >= 0 && aIdx < this._array.length) {
	    return this._array[aIdx];
	  }
	  throw new Error('No element indexed by ' + aIdx);
	};
	
	/**
	 * Returns the array representation of this set (which has the proper indices
	 * indicated by indexOf). Note that this is a copy of the internal array used
	 * for storing the members so that no one can mess with internal state.
	 */
	ArraySet.prototype.toArray = function ArraySet_toArray() {
	  return this._array.slice();
	};
	
	exports.ArraySet = ArraySet;


/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2014 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	var util = __webpack_require__(4);
	
	/**
	 * Determine whether mappingB is after mappingA with respect to generated
	 * position.
	 */
	function generatedPositionAfter(mappingA, mappingB) {
	  // Optimized for most common case
	  var lineA = mappingA.generatedLine;
	  var lineB = mappingB.generatedLine;
	  var columnA = mappingA.generatedColumn;
	  var columnB = mappingB.generatedColumn;
	  return lineB > lineA || lineB == lineA && columnB >= columnA ||
	         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
	}
	
	/**
	 * A data structure to provide a sorted view of accumulated mappings in a
	 * performance conscious manner. It trades a neglibable overhead in general
	 * case for a large speedup in case of mappings being added in order.
	 */
	function MappingList() {
	  this._array = [];
	  this._sorted = true;
	  // Serves as infimum
	  this._last = {generatedLine: -1, generatedColumn: 0};
	}
	
	/**
	 * Iterate through internal items. This method takes the same arguments that
	 * `Array.prototype.forEach` takes.
	 *
	 * NOTE: The order of the mappings is NOT guaranteed.
	 */
	MappingList.prototype.unsortedForEach =
	  function MappingList_forEach(aCallback, aThisArg) {
	    this._array.forEach(aCallback, aThisArg);
	  };
	
	/**
	 * Add the given source mapping.
	 *
	 * @param Object aMapping
	 */
	MappingList.prototype.add = function MappingList_add(aMapping) {
	  if (generatedPositionAfter(this._last, aMapping)) {
	    this._last = aMapping;
	    this._array.push(aMapping);
	  } else {
	    this._sorted = false;
	    this._array.push(aMapping);
	  }
	};
	
	/**
	 * Returns the flat, sorted array of mappings. The mappings are sorted by
	 * generated position.
	 *
	 * WARNING: This method returns internal data without copying, for
	 * performance. The return value must NOT be mutated, and should be treated as
	 * an immutable borrow. If you want to take ownership, you must make your own
	 * copy.
	 */
	MappingList.prototype.toArray = function MappingList_toArray() {
	  if (!this._sorted) {
	    this._array.sort(util.compareByGeneratedPositionsInflated);
	    this._sorted = true;
	  }
	  return this._array;
	};
	
	exports.MappingList = MappingList;


/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	var util = __webpack_require__(4);
	var binarySearch = __webpack_require__(8);
	var ArraySet = __webpack_require__(5).ArraySet;
	var base64VLQ = __webpack_require__(2);
	var quickSort = __webpack_require__(9).quickSort;
	
	function SourceMapConsumer(aSourceMap, aSourceMapURL) {
	  var sourceMap = aSourceMap;
	  if (typeof aSourceMap === 'string') {
	    sourceMap = util.parseSourceMapInput(aSourceMap);
	  }
	
	  return sourceMap.sections != null
	    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
	    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
	}
	
	SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
	  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
	}
	
	/**
	 * The version of the source mapping spec that we are consuming.
	 */
	SourceMapConsumer.prototype._version = 3;
	
	// `__generatedMappings` and `__originalMappings` are arrays that hold the
	// parsed mapping coordinates from the source map's "mappings" attribute. They
	// are lazily instantiated, accessed via the `_generatedMappings` and
	// `_originalMappings` getters respectively, and we only parse the mappings
	// and create these arrays once queried for a source location. We jump through
	// these hoops because there can be many thousands of mappings, and parsing
	// them is expensive, so we only want to do it if we must.
	//
	// Each object in the arrays is of the form:
	//
	//     {
	//       generatedLine: The line number in the generated code,
	//       generatedColumn: The column number in the generated code,
	//       source: The path to the original source file that generated this
	//               chunk of code,
	//       originalLine: The line number in the original source that
	//                     corresponds to this chunk of generated code,
	//       originalColumn: The column number in the original source that
	//                       corresponds to this chunk of generated code,
	//       name: The name of the original symbol which generated this chunk of
	//             code.
	//     }
	//
	// All properties except for `generatedLine` and `generatedColumn` can be
	// `null`.
	//
	// `_generatedMappings` is ordered by the generated positions.
	//
	// `_originalMappings` is ordered by the original positions.
	
	SourceMapConsumer.prototype.__generatedMappings = null;
	Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
	  configurable: true,
	  enumerable: true,
	  get: function () {
	    if (!this.__generatedMappings) {
	      this._parseMappings(this._mappings, this.sourceRoot);
	    }
	
	    return this.__generatedMappings;
	  }
	});
	
	SourceMapConsumer.prototype.__originalMappings = null;
	Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
	  configurable: true,
	  enumerable: true,
	  get: function () {
	    if (!this.__originalMappings) {
	      this._parseMappings(this._mappings, this.sourceRoot);
	    }
	
	    return this.__originalMappings;
	  }
	});
	
	SourceMapConsumer.prototype._charIsMappingSeparator =
	  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
	    var c = aStr.charAt(index);
	    return c === ";" || c === ",";
	  };
	
	/**
	 * Parse the mappings in a string in to a data structure which we can easily
	 * query (the ordered arrays in the `this.__generatedMappings` and
	 * `this.__originalMappings` properties).
	 */
	SourceMapConsumer.prototype._parseMappings =
	  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
	    throw new Error("Subclasses must implement _parseMappings");
	  };
	
	SourceMapConsumer.GENERATED_ORDER = 1;
	SourceMapConsumer.ORIGINAL_ORDER = 2;
	
	SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
	SourceMapConsumer.LEAST_UPPER_BOUND = 2;
	
	/**
	 * Iterate over each mapping between an original source/line/column and a
	 * generated line/column in this source map.
	 *
	 * @param Function aCallback
	 *        The function that is called with each mapping.
	 * @param Object aContext
	 *        Optional. If specified, this object will be the value of `this` every
	 *        time that `aCallback` is called.
	 * @param aOrder
	 *        Either `SourceMapConsumer.GENERATED_ORDER` or
	 *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
	 *        iterate over the mappings sorted by the generated file's line/column
	 *        order or the original's source/line/column order, respectively. Defaults to
	 *        `SourceMapConsumer.GENERATED_ORDER`.
	 */
	SourceMapConsumer.prototype.eachMapping =
	  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
	    var context = aContext || null;
	    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;
	
	    var mappings;
	    switch (order) {
	    case SourceMapConsumer.GENERATED_ORDER:
	      mappings = this._generatedMappings;
	      break;
	    case SourceMapConsumer.ORIGINAL_ORDER:
	      mappings = this._originalMappings;
	      break;
	    default:
	      throw new Error("Unknown order of iteration.");
	    }
	
	    var sourceRoot = this.sourceRoot;
	    mappings.map(function (mapping) {
	      var source = mapping.source === null ? null : this._sources.at(mapping.source);
	      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
	      return {
	        source: source,
	        generatedLine: mapping.generatedLine,
	        generatedColumn: mapping.generatedColumn,
	        originalLine: mapping.originalLine,
	        originalColumn: mapping.originalColumn,
	        name: mapping.name === null ? null : this._names.at(mapping.name)
	      };
	    }, this).forEach(aCallback, context);
	  };
	
	/**
	 * Returns all generated line and column information for the original source,
	 * line, and column provided. If no column is provided, returns all mappings
	 * corresponding to a either the line we are searching for or the next
	 * closest line that has any mappings. Otherwise, returns all mappings
	 * corresponding to the given line and either the column we are searching for
	 * or the next closest column that has any offsets.
	 *
	 * The only argument is an object with the following properties:
	 *
	 *   - source: The filename of the original source.
	 *   - line: The line number in the original source.  The line number is 1-based.
	 *   - column: Optional. the column number in the original source.
	 *    The column number is 0-based.
	 *
	 * and an array of objects is returned, each with the following properties:
	 *
	 *   - line: The line number in the generated source, or null.  The
	 *    line number is 1-based.
	 *   - column: The column number in the generated source, or null.
	 *    The column number is 0-based.
	 */
	SourceMapConsumer.prototype.allGeneratedPositionsFor =
	  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
	    var line = util.getArg(aArgs, 'line');
	
	    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
	    // returns the index of the closest mapping less than the needle. By
	    // setting needle.originalColumn to 0, we thus find the last mapping for
	    // the given line, provided such a mapping exists.
	    var needle = {
	      source: util.getArg(aArgs, 'source'),
	      originalLine: line,
	      originalColumn: util.getArg(aArgs, 'column', 0)
	    };
	
	    needle.source = this._findSourceIndex(needle.source);
	    if (needle.source < 0) {
	      return [];
	    }
	
	    var mappings = [];
	
	    var index = this._findMapping(needle,
	                                  this._originalMappings,
	                                  "originalLine",
	                                  "originalColumn",
	                                  util.compareByOriginalPositions,
	                                  binarySearch.LEAST_UPPER_BOUND);
	    if (index >= 0) {
	      var mapping = this._originalMappings[index];
	
	      if (aArgs.column === undefined) {
	        var originalLine = mapping.originalLine;
	
	        // Iterate until either we run out of mappings, or we run into
	        // a mapping for a different line than the one we found. Since
	        // mappings are sorted, this is guaranteed to find all mappings for
	        // the line we found.
	        while (mapping && mapping.originalLine === originalLine) {
	          mappings.push({
	            line: util.getArg(mapping, 'generatedLine', null),
	            column: util.getArg(mapping, 'generatedColumn', null),
	            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
	          });
	
	          mapping = this._originalMappings[++index];
	        }
	      } else {
	        var originalColumn = mapping.originalColumn;
	
	        // Iterate until either we run out of mappings, or we run into
	        // a mapping for a different line than the one we were searching for.
	        // Since mappings are sorted, this is guaranteed to find all mappings for
	        // the line we are searching for.
	        while (mapping &&
	               mapping.originalLine === line &&
	               mapping.originalColumn == originalColumn) {
	          mappings.push({
	            line: util.getArg(mapping, 'generatedLine', null),
	            column: util.getArg(mapping, 'generatedColumn', null),
	            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
	          });
	
	          mapping = this._originalMappings[++index];
	        }
	      }
	    }
	
	    return mappings;
	  };
	
	exports.SourceMapConsumer = SourceMapConsumer;
	
	/**
	 * A BasicSourceMapConsumer instance represents a parsed source map which we can
	 * query for information about the original file positions by giving it a file
	 * position in the generated source.
	 *
	 * The first parameter is the raw source map (either as a JSON string, or
	 * already parsed to an object). According to the spec, source maps have the
	 * following attributes:
	 *
	 *   - version: Which version of the source map spec this map is following.
	 *   - sources: An array of URLs to the original source files.
	 *   - names: An array of identifiers which can be referrenced by individual mappings.
	 *   - sourceRoot: Optional. The URL root from which all sources are relative.
	 *   - sourcesContent: Optional. An array of contents of the original source files.
	 *   - mappings: A string of base64 VLQs which contain the actual mappings.
	 *   - file: Optional. The generated file this source map is associated with.
	 *
	 * Here is an example source map, taken from the source map spec[0]:
	 *
	 *     {
	 *       version : 3,
	 *       file: "out.js",
	 *       sourceRoot : "",
	 *       sources: ["foo.js", "bar.js"],
	 *       names: ["src", "maps", "are", "fun"],
	 *       mappings: "AA,AB;;ABCDE;"
	 *     }
	 *
	 * The second parameter, if given, is a string whose value is the URL
	 * at which the source map was found.  This URL is used to compute the
	 * sources array.
	 *
	 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
	 */
	function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
	  var sourceMap = aSourceMap;
	  if (typeof aSourceMap === 'string') {
	    sourceMap = util.parseSourceMapInput(aSourceMap);
	  }
	
	  var version = util.getArg(sourceMap, 'version');
	  var sources = util.getArg(sourceMap, 'sources');
	  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
	  // requires the array) to play nice here.
	  var names = util.getArg(sourceMap, 'names', []);
	  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
	  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
	  var mappings = util.getArg(sourceMap, 'mappings');
	  var file = util.getArg(sourceMap, 'file', null);
	
	  // Once again, Sass deviates from the spec and supplies the version as a
	  // string rather than a number, so we use loose equality checking here.
	  if (version != this._version) {
	    throw new Error('Unsupported version: ' + version);
	  }
	
	  if (sourceRoot) {
	    sourceRoot = util.normalize(sourceRoot);
	  }
	
	  sources = sources
	    .map(String)
	    // Some source maps produce relative source paths like "./foo.js" instead of
	    // "foo.js".  Normalize these first so that future comparisons will succeed.
	    // See bugzil.la/1090768.
	    .map(util.normalize)
	    // Always ensure that absolute sources are internally stored relative to
	    // the source root, if the source root is absolute. Not doing this would
	    // be particularly problematic when the source root is a prefix of the
	    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
	    .map(function (source) {
	      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
	        ? util.relative(sourceRoot, source)
	        : source;
	    });
	
	  // Pass `true` below to allow duplicate names and sources. While source maps
	  // are intended to be compressed and deduplicated, the TypeScript compiler
	  // sometimes generates source maps with duplicates in them. See Github issue
	  // #72 and bugzil.la/889492.
	  this._names = ArraySet.fromArray(names.map(String), true);
	  this._sources = ArraySet.fromArray(sources, true);
	
	  this._absoluteSources = this._sources.toArray().map(function (s) {
	    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
	  });
	
	  this.sourceRoot = sourceRoot;
	  this.sourcesContent = sourcesContent;
	  this._mappings = mappings;
	  this._sourceMapURL = aSourceMapURL;
	  this.file = file;
	}
	
	BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
	BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
	
	/**
	 * Utility function to find the index of a source.  Returns -1 if not
	 * found.
	 */
	BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
	  var relativeSource = aSource;
	  if (this.sourceRoot != null) {
	    relativeSource = util.relative(this.sourceRoot, relativeSource);
	  }
	
	  if (this._sources.has(relativeSource)) {
	    return this._sources.indexOf(relativeSource);
	  }
	
	  // Maybe aSource is an absolute URL as returned by |sources|.  In
	  // this case we can't simply undo the transform.
	  var i;
	  for (i = 0; i < this._absoluteSources.length; ++i) {
	    if (this._absoluteSources[i] == aSource) {
	      return i;
	    }
	  }
	
	  return -1;
	};
	
	/**
	 * Create a BasicSourceMapConsumer from a SourceMapGenerator.
	 *
	 * @param SourceMapGenerator aSourceMap
	 *        The source map that will be consumed.
	 * @param String aSourceMapURL
	 *        The URL at which the source map can be found (optional)
	 * @returns BasicSourceMapConsumer
	 */
	BasicSourceMapConsumer.fromSourceMap =
	  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
	    var smc = Object.create(BasicSourceMapConsumer.prototype);
	
	    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
	    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
	    smc.sourceRoot = aSourceMap._sourceRoot;
	    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
	                                                            smc.sourceRoot);
	    smc.file = aSourceMap._file;
	    smc._sourceMapURL = aSourceMapURL;
	    smc._absoluteSources = smc._sources.toArray().map(function (s) {
	      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
	    });
	
	    // Because we are modifying the entries (by converting string sources and
	    // names to indices into the sources and names ArraySets), we have to make
	    // a copy of the entry or else bad things happen. Shared mutable state
	    // strikes again! See github issue #191.
	
	    var generatedMappings = aSourceMap._mappings.toArray().slice();
	    var destGeneratedMappings = smc.__generatedMappings = [];
	    var destOriginalMappings = smc.__originalMappings = [];
	
	    for (var i = 0, length = generatedMappings.length; i < length; i++) {
	      var srcMapping = generatedMappings[i];
	      var destMapping = new Mapping;
	      destMapping.generatedLine = srcMapping.generatedLine;
	      destMapping.generatedColumn = srcMapping.generatedColumn;
	
	      if (srcMapping.source) {
	        destMapping.source = sources.indexOf(srcMapping.source);
	        destMapping.originalLine = srcMapping.originalLine;
	        destMapping.originalColumn = srcMapping.originalColumn;
	
	        if (srcMapping.name) {
	          destMapping.name = names.indexOf(srcMapping.name);
	        }
	
	        destOriginalMappings.push(destMapping);
	      }
	
	      destGeneratedMappings.push(destMapping);
	    }
	
	    quickSort(smc.__originalMappings, util.compareByOriginalPositions);
	
	    return smc;
	  };
	
	/**
	 * The version of the source mapping spec that we are consuming.
	 */
	BasicSourceMapConsumer.prototype._version = 3;
	
	/**
	 * The list of original sources.
	 */
	Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
	  get: function () {
	    return this._absoluteSources.slice();
	  }
	});
	
	/**
	 * Provide the JIT with a nice shape / hidden class.
	 */
	function Mapping() {
	  this.generatedLine = 0;
	  this.generatedColumn = 0;
	  this.source = null;
	  this.originalLine = null;
	  this.originalColumn = null;
	  this.name = null;
	}
	
	/**
	 * Parse the mappings in a string in to a data structure which we can easily
	 * query (the ordered arrays in the `this.__generatedMappings` and
	 * `this.__originalMappings` properties).
	 */
	BasicSourceMapConsumer.prototype._parseMappings =
	  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
	    var generatedLine = 1;
	    var previousGeneratedColumn = 0;
	    var previousOriginalLine = 0;
	    var previousOriginalColumn = 0;
	    var previousSource = 0;
	    var previousName = 0;
	    var length = aStr.length;
	    var index = 0;
	    var cachedSegments = {};
	    var temp = {};
	    var originalMappings = [];
	    var generatedMappings = [];
	    var mapping, str, segment, end, value;
	
	    while (index < length) {
	      if (aStr.charAt(index) === ';') {
	        generatedLine++;
	        index++;
	        previousGeneratedColumn = 0;
	      }
	      else if (aStr.charAt(index) === ',') {
	        index++;
	      }
	      else {
	        mapping = new Mapping();
	        mapping.generatedLine = generatedLine;
	
	        // Because each offset is encoded relative to the previous one,
	        // many segments often have the same encoding. We can exploit this
	        // fact by caching the parsed variable length fields of each segment,
	        // allowing us to avoid a second parse if we encounter the same
	        // segment again.
	        for (end = index; end < length; end++) {
	          if (this._charIsMappingSeparator(aStr, end)) {
	            break;
	          }
	        }
	        str = aStr.slice(index, end);
	
	        segment = cachedSegments[str];
	        if (segment) {
	          index += str.length;
	        } else {
	          segment = [];
	          while (index < end) {
	            base64VLQ.decode(aStr, index, temp);
	            value = temp.value;
	            index = temp.rest;
	            segment.push(value);
	          }
	
	          if (segment.length === 2) {
	            throw new Error('Found a source, but no line and column');
	          }
	
	          if (segment.length === 3) {
	            throw new Error('Found a source and line, but no column');
	          }
	
	          cachedSegments[str] = segment;
	        }
	
	        // Generated column.
	        mapping.generatedColumn = previousGeneratedColumn + segment[0];
	        previousGeneratedColumn = mapping.generatedColumn;
	
	        if (segment.length > 1) {
	          // Original source.
	          mapping.source = previousSource + segment[1];
	          previousSource += segment[1];
	
	          // Original line.
	          mapping.originalLine = previousOriginalLine + segment[2];
	          previousOriginalLine = mapping.originalLine;
	          // Lines are stored 0-based
	          mapping.originalLine += 1;
	
	          // Original column.
	          mapping.originalColumn = previousOriginalColumn + segment[3];
	          previousOriginalColumn = mapping.originalColumn;
	
	          if (segment.length > 4) {
	            // Original name.
	            mapping.name = previousName + segment[4];
	            previousName += segment[4];
	          }
	        }
	
	        generatedMappings.push(mapping);
	        if (typeof mapping.originalLine === 'number') {
	          originalMappings.push(mapping);
	        }
	      }
	    }
	
	    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
	    this.__generatedMappings = generatedMappings;
	
	    quickSort(originalMappings, util.compareByOriginalPositions);
	    this.__originalMappings = originalMappings;
	  };
	
	/**
	 * Find the mapping that best matches the hypothetical "needle" mapping that
	 * we are searching for in the given "haystack" of mappings.
	 */
	BasicSourceMapConsumer.prototype._findMapping =
	  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
	                                         aColumnName, aComparator, aBias) {
	    // To return the position we are searching for, we must first find the
	    // mapping for the given position and then return the opposite position it
	    // points to. Because the mappings are sorted, we can use binary search to
	    // find the best mapping.
	
	    if (aNeedle[aLineName] <= 0) {
	      throw new TypeError('Line must be greater than or equal to 1, got '
	                          + aNeedle[aLineName]);
	    }
	    if (aNeedle[aColumnName] < 0) {
	      throw new TypeError('Column must be greater than or equal to 0, got '
	                          + aNeedle[aColumnName]);
	    }
	
	    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
	  };
	
	/**
	 * Compute the last column for each generated mapping. The last column is
	 * inclusive.
	 */
	BasicSourceMapConsumer.prototype.computeColumnSpans =
	  function SourceMapConsumer_computeColumnSpans() {
	    for (var index = 0; index < this._generatedMappings.length; ++index) {
	      var mapping = this._generatedMappings[index];
	
	      // Mappings do not contain a field for the last generated columnt. We
	      // can come up with an optimistic estimate, however, by assuming that
	      // mappings are contiguous (i.e. given two consecutive mappings, the
	      // first mapping ends where the second one starts).
	      if (index + 1 < this._generatedMappings.length) {
	        var nextMapping = this._generatedMappings[index + 1];
	
	        if (mapping.generatedLine === nextMapping.generatedLine) {
	          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
	          continue;
	        }
	      }
	
	      // The last mapping for each line spans the entire line.
	      mapping.lastGeneratedColumn = Infinity;
	    }
	  };
	
	/**
	 * Returns the original source, line, and column information for the generated
	 * source's line and column positions provided. The only argument is an object
	 * with the following properties:
	 *
	 *   - line: The line number in the generated source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the generated source.  The column
	 *     number is 0-based.
	 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
	 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - source: The original source file, or null.
	 *   - line: The line number in the original source, or null.  The
	 *     line number is 1-based.
	 *   - column: The column number in the original source, or null.  The
	 *     column number is 0-based.
	 *   - name: The original identifier, or null.
	 */
	BasicSourceMapConsumer.prototype.originalPositionFor =
	  function SourceMapConsumer_originalPositionFor(aArgs) {
	    var needle = {
	      generatedLine: util.getArg(aArgs, 'line'),
	      generatedColumn: util.getArg(aArgs, 'column')
	    };
	
	    var index = this._findMapping(
	      needle,
	      this._generatedMappings,
	      "generatedLine",
	      "generatedColumn",
	      util.compareByGeneratedPositionsDeflated,
	      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
	    );
	
	    if (index >= 0) {
	      var mapping = this._generatedMappings[index];
	
	      if (mapping.generatedLine === needle.generatedLine) {
	        var source = util.getArg(mapping, 'source', null);
	        if (source !== null) {
	          source = this._sources.at(source);
	          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
	        }
	        var name = util.getArg(mapping, 'name', null);
	        if (name !== null) {
	          name = this._names.at(name);
	        }
	        return {
	          source: source,
	          line: util.getArg(mapping, 'originalLine', null),
	          column: util.getArg(mapping, 'originalColumn', null),
	          name: name
	        };
	      }
	    }
	
	    return {
	      source: null,
	      line: null,
	      column: null,
	      name: null
	    };
	  };
	
	/**
	 * Return true if we have the source content for every source in the source
	 * map, false otherwise.
	 */
	BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
	  function BasicSourceMapConsumer_hasContentsOfAllSources() {
	    if (!this.sourcesContent) {
	      return false;
	    }
	    return this.sourcesContent.length >= this._sources.size() &&
	      !this.sourcesContent.some(function (sc) { return sc == null; });
	  };
	
	/**
	 * Returns the original source content. The only argument is the url of the
	 * original source file. Returns null if no original source content is
	 * available.
	 */
	BasicSourceMapConsumer.prototype.sourceContentFor =
	  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
	    if (!this.sourcesContent) {
	      return null;
	    }
	
	    var index = this._findSourceIndex(aSource);
	    if (index >= 0) {
	      return this.sourcesContent[index];
	    }
	
	    var relativeSource = aSource;
	    if (this.sourceRoot != null) {
	      relativeSource = util.relative(this.sourceRoot, relativeSource);
	    }
	
	    var url;
	    if (this.sourceRoot != null
	        && (url = util.urlParse(this.sourceRoot))) {
	      // XXX: file:// URIs and absolute paths lead to unexpected behavior for
	      // many users. We can help them out when they expect file:// URIs to
	      // behave like it would if they were running a local HTTP server. See
	      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
	      var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
	      if (url.scheme == "file"
	          && this._sources.has(fileUriAbsPath)) {
	        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
	      }
	
	      if ((!url.path || url.path == "/")
	          && this._sources.has("/" + relativeSource)) {
	        return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
	      }
	    }
	
	    // This function is used recursively from
	    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
	    // don't want to throw if we can't find the source - we just want to
	    // return null, so we provide a flag to exit gracefully.
	    if (nullOnMissing) {
	      return null;
	    }
	    else {
	      throw new Error('"' + relativeSource + '" is not in the SourceMap.');
	    }
	  };
	
	/**
	 * Returns the generated line and column information for the original source,
	 * line, and column positions provided. The only argument is an object with
	 * the following properties:
	 *
	 *   - source: The filename of the original source.
	 *   - line: The line number in the original source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the original source.  The column
	 *     number is 0-based.
	 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
	 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - line: The line number in the generated source, or null.  The
	 *     line number is 1-based.
	 *   - column: The column number in the generated source, or null.
	 *     The column number is 0-based.
	 */
	BasicSourceMapConsumer.prototype.generatedPositionFor =
	  function SourceMapConsumer_generatedPositionFor(aArgs) {
	    var source = util.getArg(aArgs, 'source');
	    source = this._findSourceIndex(source);
	    if (source < 0) {
	      return {
	        line: null,
	        column: null,
	        lastColumn: null
	      };
	    }
	
	    var needle = {
	      source: source,
	      originalLine: util.getArg(aArgs, 'line'),
	      originalColumn: util.getArg(aArgs, 'column')
	    };
	
	    var index = this._findMapping(
	      needle,
	      this._originalMappings,
	      "originalLine",
	      "originalColumn",
	      util.compareByOriginalPositions,
	      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
	    );
	
	    if (index >= 0) {
	      var mapping = this._originalMappings[index];
	
	      if (mapping.source === needle.source) {
	        return {
	          line: util.getArg(mapping, 'generatedLine', null),
	          column: util.getArg(mapping, 'generatedColumn', null),
	          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
	        };
	      }
	    }
	
	    return {
	      line: null,
	      column: null,
	      lastColumn: null
	    };
	  };
	
	exports.BasicSourceMapConsumer = BasicSourceMapConsumer;
	
	/**
	 * An IndexedSourceMapConsumer instance represents a parsed source map which
	 * we can query for information. It differs from BasicSourceMapConsumer in
	 * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
	 * input.
	 *
	 * The first parameter is a raw source map (either as a JSON string, or already
	 * parsed to an object). According to the spec for indexed source maps, they
	 * have the following attributes:
	 *
	 *   - version: Which version of the source map spec this map is following.
	 *   - file: Optional. The generated file this source map is associated with.
	 *   - sections: A list of section definitions.
	 *
	 * Each value under the "sections" field has two fields:
	 *   - offset: The offset into the original specified at which this section
	 *       begins to apply, defined as an object with a "line" and "column"
	 *       field.
	 *   - map: A source map definition. This source map could also be indexed,
	 *       but doesn't have to be.
	 *
	 * Instead of the "map" field, it's also possible to have a "url" field
	 * specifying a URL to retrieve a source map from, but that's currently
	 * unsupported.
	 *
	 * Here's an example source map, taken from the source map spec[0], but
	 * modified to omit a section which uses the "url" field.
	 *
	 *  {
	 *    version : 3,
	 *    file: "app.js",
	 *    sections: [{
	 *      offset: {line:100, column:10},
	 *      map: {
	 *        version : 3,
	 *        file: "section.js",
	 *        sources: ["foo.js", "bar.js"],
	 *        names: ["src", "maps", "are", "fun"],
	 *        mappings: "AAAA,E;;ABCDE;"
	 *      }
	 *    }],
	 *  }
	 *
	 * The second parameter, if given, is a string whose value is the URL
	 * at which the source map was found.  This URL is used to compute the
	 * sources array.
	 *
	 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
	 */
	function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
	  var sourceMap = aSourceMap;
	  if (typeof aSourceMap === 'string') {
	    sourceMap = util.parseSourceMapInput(aSourceMap);
	  }
	
	  var version = util.getArg(sourceMap, 'version');
	  var sections = util.getArg(sourceMap, 'sections');
	
	  if (version != this._version) {
	    throw new Error('Unsupported version: ' + version);
	  }
	
	  this._sources = new ArraySet();
	  this._names = new ArraySet();
	
	  var lastOffset = {
	    line: -1,
	    column: 0
	  };
	  this._sections = sections.map(function (s) {
	    if (s.url) {
	      // The url field will require support for asynchronicity.
	      // See https://github.com/mozilla/source-map/issues/16
	      throw new Error('Support for url field in sections not implemented.');
	    }
	    var offset = util.getArg(s, 'offset');
	    var offsetLine = util.getArg(offset, 'line');
	    var offsetColumn = util.getArg(offset, 'column');
	
	    if (offsetLine < lastOffset.line ||
	        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
	      throw new Error('Section offsets must be ordered and non-overlapping.');
	    }
	    lastOffset = offset;
	
	    return {
	      generatedOffset: {
	        // The offset fields are 0-based, but we use 1-based indices when
	        // encoding/decoding from VLQ.
	        generatedLine: offsetLine + 1,
	        generatedColumn: offsetColumn + 1
	      },
	      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)
	    }
	  });
	}
	
	IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
	IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;
	
	/**
	 * The version of the source mapping spec that we are consuming.
	 */
	IndexedSourceMapConsumer.prototype._version = 3;
	
	/**
	 * The list of original sources.
	 */
	Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
	  get: function () {
	    var sources = [];
	    for (var i = 0; i < this._sections.length; i++) {
	      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
	        sources.push(this._sections[i].consumer.sources[j]);
	      }
	    }
	    return sources;
	  }
	});
	
	/**
	 * Returns the original source, line, and column information for the generated
	 * source's line and column positions provided. The only argument is an object
	 * with the following properties:
	 *
	 *   - line: The line number in the generated source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the generated source.  The column
	 *     number is 0-based.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - source: The original source file, or null.
	 *   - line: The line number in the original source, or null.  The
	 *     line number is 1-based.
	 *   - column: The column number in the original source, or null.  The
	 *     column number is 0-based.
	 *   - name: The original identifier, or null.
	 */
	IndexedSourceMapConsumer.prototype.originalPositionFor =
	  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
	    var needle = {
	      generatedLine: util.getArg(aArgs, 'line'),
	      generatedColumn: util.getArg(aArgs, 'column')
	    };
	
	    // Find the section containing the generated position we're trying to map
	    // to an original position.
	    var sectionIndex = binarySearch.search(needle, this._sections,
	      function(needle, section) {
	        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
	        if (cmp) {
	          return cmp;
	        }
	
	        return (needle.generatedColumn -
	                section.generatedOffset.generatedColumn);
	      });
	    var section = this._sections[sectionIndex];
	
	    if (!section) {
	      return {
	        source: null,
	        line: null,
	        column: null,
	        name: null
	      };
	    }
	
	    return section.consumer.originalPositionFor({
	      line: needle.generatedLine -
	        (section.generatedOffset.generatedLine - 1),
	      column: needle.generatedColumn -
	        (section.generatedOffset.generatedLine === needle.generatedLine
	         ? section.generatedOffset.generatedColumn - 1
	         : 0),
	      bias: aArgs.bias
	    });
	  };
	
	/**
	 * Return true if we have the source content for every source in the source
	 * map, false otherwise.
	 */
	IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
	  function IndexedSourceMapConsumer_hasContentsOfAllSources() {
	    return this._sections.every(function (s) {
	      return s.consumer.hasContentsOfAllSources();
	    });
	  };
	
	/**
	 * Returns the original source content. The only argument is the url of the
	 * original source file. Returns null if no original source content is
	 * available.
	 */
	IndexedSourceMapConsumer.prototype.sourceContentFor =
	  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
	    for (var i = 0; i < this._sections.length; i++) {
	      var section = this._sections[i];
	
	      var content = section.consumer.sourceContentFor(aSource, true);
	      if (content) {
	        return content;
	      }
	    }
	    if (nullOnMissing) {
	      return null;
	    }
	    else {
	      throw new Error('"' + aSource + '" is not in the SourceMap.');
	    }
	  };
	
	/**
	 * Returns the generated line and column information for the original source,
	 * line, and column positions provided. The only argument is an object with
	 * the following properties:
	 *
	 *   - source: The filename of the original source.
	 *   - line: The line number in the original source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the original source.  The column
	 *     number is 0-based.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - line: The line number in the generated source, or null.  The
	 *     line number is 1-based. 
	 *   - column: The column number in the generated source, or null.
	 *     The column number is 0-based.
	 */
	IndexedSourceMapConsumer.prototype.generatedPositionFor =
	  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
	    for (var i = 0; i < this._sections.length; i++) {
	      var section = this._sections[i];
	
	      // Only consider this section if the requested source is in the list of
	      // sources of the consumer.
	      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
	        continue;
	      }
	      var generatedPosition = section.consumer.generatedPositionFor(aArgs);
	      if (generatedPosition) {
	        var ret = {
	          line: generatedPosition.line +
	            (section.generatedOffset.generatedLine - 1),
	          column: generatedPosition.column +
	            (section.generatedOffset.generatedLine === generatedPosition.line
	             ? section.generatedOffset.generatedColumn - 1
	             : 0)
	        };
	        return ret;
	      }
	    }
	
	    return {
	      line: null,
	      column: null
	    };
	  };
	
	/**
	 * Parse the mappings in a string in to a data structure which we can easily
	 * query (the ordered arrays in the `this.__generatedMappings` and
	 * `this.__originalMappings` properties).
	 */
	IndexedSourceMapConsumer.prototype._parseMappings =
	  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
	    this.__generatedMappings = [];
	    this.__originalMappings = [];
	    for (var i = 0; i < this._sections.length; i++) {
	      var section = this._sections[i];
	      var sectionMappings = section.consumer._generatedMappings;
	      for (var j = 0; j < sectionMappings.length; j++) {
	        var mapping = sectionMappings[j];
	
	        var source = section.consumer._sources.at(mapping.source);
	        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
	        this._sources.add(source);
	        source = this._sources.indexOf(source);
	
	        var name = null;
	        if (mapping.name) {
	          name = section.consumer._names.at(mapping.name);
	          this._names.add(name);
	          name = this._names.indexOf(name);
	        }
	
	        // The mappings coming from the consumer for the section have
	        // generated positions relative to the start of the section, so we
	        // need to offset them to be relative to the start of the concatenated
	        // generated file.
	        var adjustedMapping = {
	          source: source,
	          generatedLine: mapping.generatedLine +
	            (section.generatedOffset.generatedLine - 1),
	          generatedColumn: mapping.generatedColumn +
	            (section.generatedOffset.generatedLine === mapping.generatedLine
	            ? section.generatedOffset.generatedColumn - 1
	            : 0),
	          originalLine: mapping.originalLine,
	          originalColumn: mapping.originalColumn,
	          name: name
	        };
	
	        this.__generatedMappings.push(adjustedMapping);
	        if (typeof adjustedMapping.originalLine === 'number') {
	          this.__originalMappings.push(adjustedMapping);
	        }
	      }
	    }
	
	    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
	    quickSort(this.__originalMappings, util.compareByOriginalPositions);
	  };
	
	exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;


/***/ }),
/* 8 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	exports.GREATEST_LOWER_BOUND = 1;
	exports.LEAST_UPPER_BOUND = 2;
	
	/**
	 * Recursive implementation of binary search.
	 *
	 * @param aLow Indices here and lower do not contain the needle.
	 * @param aHigh Indices here and higher do not contain the needle.
	 * @param aNeedle The element being searched for.
	 * @param aHaystack The non-empty array being searched.
	 * @param aCompare Function which takes two elements and returns -1, 0, or 1.
	 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
	 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 */
	function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
	  // This function terminates when one of the following is true:
	  //
	  //   1. We find the exact element we are looking for.
	  //
	  //   2. We did not find the exact element, but we can return the index of
	  //      the next-closest element.
	  //
	  //   3. We did not find the exact element, and there is no next-closest
	  //      element than the one we are searching for, so we return -1.
	  var mid = Math.floor((aHigh - aLow) / 2) + aLow;
	  var cmp = aCompare(aNeedle, aHaystack[mid], true);
	  if (cmp === 0) {
	    // Found the element we are looking for.
	    return mid;
	  }
	  else if (cmp > 0) {
	    // Our needle is greater than aHaystack[mid].
	    if (aHigh - mid > 1) {
	      // The element is in the upper half.
	      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
	    }
	
	    // The exact needle element was not found in this haystack. Determine if
	    // we are in termination case (3) or (2) and return the appropriate thing.
	    if (aBias == exports.LEAST_UPPER_BOUND) {
	      return aHigh < aHaystack.length ? aHigh : -1;
	    } else {
	      return mid;
	    }
	  }
	  else {
	    // Our needle is less than aHaystack[mid].
	    if (mid - aLow > 1) {
	      // The element is in the lower half.
	      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
	    }
	
	    // we are in termination case (3) or (2) and return the appropriate thing.
	    if (aBias == exports.LEAST_UPPER_BOUND) {
	      return mid;
	    } else {
	      return aLow < 0 ? -1 : aLow;
	    }
	  }
	}
	
	/**
	 * This is an implementation of binary search which will always try and return
	 * the index of the closest element if there is no exact hit. This is because
	 * mappings between original and generated line/col pairs are single points,
	 * and there is an implicit region between each of them, so a miss just means
	 * that you aren't on the very start of a region.
	 *
	 * @param aNeedle The element you are looking for.
	 * @param aHaystack The array that is being searched.
	 * @param aCompare A function which takes the needle and an element in the
	 *     array and returns -1, 0, or 1 depending on whether the needle is less
	 *     than, equal to, or greater than the element, respectively.
	 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
	 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
	 */
	exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
	  if (aHaystack.length === 0) {
	    return -1;
	  }
	
	  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
	                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);
	  if (index < 0) {
	    return -1;
	  }
	
	  // We have found either the exact element, or the next-closest element than
	  // the one we are searching for. However, there may be more than one such
	  // element. Make sure we always return the smallest of these.
	  while (index - 1 >= 0) {
	    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
	      break;
	    }
	    --index;
	  }
	
	  return index;
	};


/***/ }),
/* 9 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	// It turns out that some (most?) JavaScript engines don't self-host
	// `Array.prototype.sort`. This makes sense because C++ will likely remain
	// faster than JS when doing raw CPU-intensive sorting. However, when using a
	// custom comparator function, calling back and forth between the VM's C++ and
	// JIT'd JS is rather slow *and* loses JIT type information, resulting in
	// worse generated code for the comparator function than would be optimal. In
	// fact, when sorting with a comparator, these costs outweigh the benefits of
	// sorting in C++. By using our own JS-implemented Quick Sort (below), we get
	// a ~3500ms mean speed-up in `bench/bench.html`.
	
	/**
	 * Swap the elements indexed by `x` and `y` in the array `ary`.
	 *
	 * @param {Array} ary
	 *        The array.
	 * @param {Number} x
	 *        The index of the first item.
	 * @param {Number} y
	 *        The index of the second item.
	 */
	function swap(ary, x, y) {
	  var temp = ary[x];
	  ary[x] = ary[y];
	  ary[y] = temp;
	}
	
	/**
	 * Returns a random integer within the range `low .. high` inclusive.
	 *
	 * @param {Number} low
	 *        The lower bound on the range.
	 * @param {Number} high
	 *        The upper bound on the range.
	 */
	function randomIntInRange(low, high) {
	  return Math.round(low + (Math.random() * (high - low)));
	}
	
	/**
	 * The Quick Sort algorithm.
	 *
	 * @param {Array} ary
	 *        An array to sort.
	 * @param {function} comparator
	 *        Function to use to compare two items.
	 * @param {Number} p
	 *        Start index of the array
	 * @param {Number} r
	 *        End index of the array
	 */
	function doQuickSort(ary, comparator, p, r) {
	  // If our lower bound is less than our upper bound, we (1) partition the
	  // array into two pieces and (2) recurse on each half. If it is not, this is
	  // the empty array and our base case.
	
	  if (p < r) {
	    // (1) Partitioning.
	    //
	    // The partitioning chooses a pivot between `p` and `r` and moves all
	    // elements that are less than or equal to the pivot to the before it, and
	    // all the elements that are greater than it after it. The effect is that
	    // once partition is done, the pivot is in the exact place it will be when
	    // the array is put in sorted order, and it will not need to be moved
	    // again. This runs in O(n) time.
	
	    // Always choose a random pivot so that an input array which is reverse
	    // sorted does not cause O(n^2) running time.
	    var pivotIndex = randomIntInRange(p, r);
	    var i = p - 1;
	
	    swap(ary, pivotIndex, r);
	    var pivot = ary[r];
	
	    // Immediately after `j` is incremented in this loop, the following hold
	    // true:
	    //
	    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.
	    //
	    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
	    for (var j = p; j < r; j++) {
	      if (comparator(ary[j], pivot) <= 0) {
	        i += 1;
	        swap(ary, i, j);
	      }
	    }
	
	    swap(ary, i + 1, j);
	    var q = i + 1;
	
	    // (2) Recurse on each half.
	
	    doQuickSort(ary, comparator, p, q - 1);
	    doQuickSort(ary, comparator, q + 1, r);
	  }
	}
	
	/**
	 * Sort the given array in-place with the given comparator function.
	 *
	 * @param {Array} ary
	 *        An array to sort.
	 * @param {function} comparator
	 *        Function to use to compare two items.
	 */
	exports.quickSort = function (ary, comparator) {
	  doQuickSort(ary, comparator, 0, ary.length - 1);
	};


/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
	var util = __webpack_require__(4);
	
	// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
	// operating systems these days (capturing the result).
	var REGEX_NEWLINE = /(\r?\n)/;
	
	// Newline character code for charCodeAt() comparisons
	var NEWLINE_CODE = 10;
	
	// Private symbol for identifying `SourceNode`s when multiple versions of
	// the source-map library are loaded. This MUST NOT CHANGE across
	// versions!
	var isSourceNode = "$$$isSourceNode$$$";
	
	/**
	 * SourceNodes provide a way to abstract over interpolating/concatenating
	 * snippets of generated JavaScript source code while maintaining the line and
	 * column information associated with the original source code.
	 *
	 * @param aLine The original line number.
	 * @param aColumn The original column number.
	 * @param aSource The original source's filename.
	 * @param aChunks Optional. An array of strings which are snippets of
	 *        generated JS, or other SourceNodes.
	 * @param aName The original identifier.
	 */
	function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
	  this.children = [];
	  this.sourceContents = {};
	  this.line = aLine == null ? null : aLine;
	  this.column = aColumn == null ? null : aColumn;
	  this.source = aSource == null ? null : aSource;
	  this.name = aName == null ? null : aName;
	  this[isSourceNode] = true;
	  if (aChunks != null) this.add(aChunks);
	}
	
	/**
	 * Creates a SourceNode from generated code and a SourceMapConsumer.
	 *
	 * @param aGeneratedCode The generated code
	 * @param aSourceMapConsumer The SourceMap for the generated code
	 * @param aRelativePath Optional. The path that relative sources in the
	 *        SourceMapConsumer should be relative to.
	 */
	SourceNode.fromStringWithSourceMap =
	  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
	    // The SourceNode we want to fill with the generated code
	    // and the SourceMap
	    var node = new SourceNode();
	
	    // All even indices of this array are one line of the generated code,
	    // while all odd indices are the newlines between two adjacent lines
	    // (since `REGEX_NEWLINE` captures its match).
	    // Processed fragments are accessed by calling `shiftNextLine`.
	    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
	    var remainingLinesIndex = 0;
	    var shiftNextLine = function() {
	      var lineContents = getNextLine();
	      // The last line of a file might not have a newline.
	      var newLine = getNextLine() || "";
	      return lineContents + newLine;
	
	      function getNextLine() {
	        return remainingLinesIndex < remainingLines.length ?
	            remainingLines[remainingLinesIndex++] : undefined;
	      }
	    };
	
	    // We need to remember the position of "remainingLines"
	    var lastGeneratedLine = 1, lastGeneratedColumn = 0;
	
	    // The generate SourceNodes we need a code range.
	    // To extract it current and last mapping is used.
	    // Here we store the last mapping.
	    var lastMapping = null;
	
	    aSourceMapConsumer.eachMapping(function (mapping) {
	      if (lastMapping !== null) {
	        // We add the code from "lastMapping" to "mapping":
	        // First check if there is a new line in between.
	        if (lastGeneratedLine < mapping.generatedLine) {
	          // Associate first line with "lastMapping"
	          addMappingWithCode(lastMapping, shiftNextLine());
	          lastGeneratedLine++;
	          lastGeneratedColumn = 0;
	          // The remaining code is added without mapping
	        } else {
	          // There is no new line in between.
	          // Associate the code between "lastGeneratedColumn" and
	          // "mapping.generatedColumn" with "lastMapping"
	          var nextLine = remainingLines[remainingLinesIndex] || '';
	          var code = nextLine.substr(0, mapping.generatedColumn -
	                                        lastGeneratedColumn);
	          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
	                                              lastGeneratedColumn);
	          lastGeneratedColumn = mapping.generatedColumn;
	          addMappingWithCode(lastMapping, code);
	          // No more remaining code, continue
	          lastMapping = mapping;
	          return;
	        }
	      }
	      // We add the generated code until the first mapping
	      // to the SourceNode without any mapping.
	      // Each line is added as separate string.
	      while (lastGeneratedLine < mapping.generatedLine) {
	        node.add(shiftNextLine());
	        lastGeneratedLine++;
	      }
	      if (lastGeneratedColumn < mapping.generatedColumn) {
	        var nextLine = remainingLines[remainingLinesIndex] || '';
	        node.add(nextLine.substr(0, mapping.generatedColumn));
	        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
	        lastGeneratedColumn = mapping.generatedColumn;
	      }
	      lastMapping = mapping;
	    }, this);
	    // We have processed all mappings.
	    if (remainingLinesIndex < remainingLines.length) {
	      if (lastMapping) {
	        // Associate the remaining code in the current line with "lastMapping"
	        addMappingWithCode(lastMapping, shiftNextLine());
	      }
	      // and add the remaining lines without any mapping
	      node.add(remainingLines.splice(remainingLinesIndex).join(""));
	    }
	
	    // Copy sourcesContent into SourceNode
	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
	      if (content != null) {
	        if (aRelativePath != null) {
	          sourceFile = util.join(aRelativePath, sourceFile);
	        }
	        node.setSourceContent(sourceFile, content);
	      }
	    });
	
	    return node;
	
	    function addMappingWithCode(mapping, code) {
	      if (mapping === null || mapping.source === undefined) {
	        node.add(code);
	      } else {
	        var source = aRelativePath
	          ? util.join(aRelativePath, mapping.source)
	          : mapping.source;
	        node.add(new SourceNode(mapping.originalLine,
	                                mapping.originalColumn,
	                                source,
	                                code,
	                                mapping.name));
	      }
	    }
	  };
	
	/**
	 * Add a chunk of generated JS to this source node.
	 *
	 * @param aChunk A string snippet of generated JS code, another instance of
	 *        SourceNode, or an array where each member is one of those things.
	 */
	SourceNode.prototype.add = function SourceNode_add(aChunk) {
	  if (Array.isArray(aChunk)) {
	    aChunk.forEach(function (chunk) {
	      this.add(chunk);
	    }, this);
	  }
	  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
	    if (aChunk) {
	      this.children.push(aChunk);
	    }
	  }
	  else {
	    throw new TypeError(
	      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
	    );
	  }
	  return this;
	};
	
	/**
	 * Add a chunk of generated JS to the beginning of this source node.
	 *
	 * @param aChunk A string snippet of generated JS code, another instance of
	 *        SourceNode, or an array where each member is one of those things.
	 */
	SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
	  if (Array.isArray(aChunk)) {
	    for (var i = aChunk.length-1; i >= 0; i--) {
	      this.prepend(aChunk[i]);
	    }
	  }
	  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
	    this.children.unshift(aChunk);
	  }
	  else {
	    throw new TypeError(
	      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
	    );
	  }
	  return this;
	};
	
	/**
	 * Walk over the tree of JS snippets in this node and its children. The
	 * walking function is called once for each snippet of JS and is passed that
	 * snippet and the its original associated source's line/column location.
	 *
	 * @param aFn The traversal function.
	 */
	SourceNode.prototype.walk = function SourceNode_walk(aFn) {
	  var chunk;
	  for (var i = 0, len = this.children.length; i < len; i++) {
	    chunk = this.children[i];
	    if (chunk[isSourceNode]) {
	      chunk.walk(aFn);
	    }
	    else {
	      if (chunk !== '') {
	        aFn(chunk, { source: this.source,
	                     line: this.line,
	                     column: this.column,
	                     name: this.name });
	      }
	    }
	  }
	};
	
	/**
	 * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
	 * each of `this.children`.
	 *
	 * @param aSep The separator.
	 */
	SourceNode.prototype.join = function SourceNode_join(aSep) {
	  var newChildren;
	  var i;
	  var len = this.children.length;
	  if (len > 0) {
	    newChildren = [];
	    for (i = 0; i < len-1; i++) {
	      newChildren.push(this.children[i]);
	      newChildren.push(aSep);
	    }
	    newChildren.push(this.children[i]);
	    this.children = newChildren;
	  }
	  return this;
	};
	
	/**
	 * Call String.prototype.replace on the very right-most source snippet. Useful
	 * for trimming whitespace from the end of a source node, etc.
	 *
	 * @param aPattern The pattern to replace.
	 * @param aReplacement The thing to replace the pattern with.
	 */
	SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
	  var lastChild = this.children[this.children.length - 1];
	  if (lastChild[isSourceNode]) {
	    lastChild.replaceRight(aPattern, aReplacement);
	  }
	  else if (typeof lastChild === 'string') {
	    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
	  }
	  else {
	    this.children.push(''.replace(aPattern, aReplacement));
	  }
	  return this;
	};
	
	/**
	 * Set the source content for a source file. This will be added to the SourceMapGenerator
	 * in the sourcesContent field.
	 *
	 * @param aSourceFile The filename of the source file
	 * @param aSourceContent The content of the source file
	 */
	SourceNode.prototype.setSourceContent =
	  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
	    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
	  };
	
	/**
	 * Walk over the tree of SourceNodes. The walking function is called for each
	 * source file content and is passed the filename and source content.
	 *
	 * @param aFn The traversal function.
	 */
	SourceNode.prototype.walkSourceContents =
	  function SourceNode_walkSourceContents(aFn) {
	    for (var i = 0, len = this.children.length; i < len; i++) {
	      if (this.children[i][isSourceNode]) {
	        this.children[i].walkSourceContents(aFn);
	      }
	    }
	
	    var sources = Object.keys(this.sourceContents);
	    for (var i = 0, len = sources.length; i < len; i++) {
	      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
	    }
	  };
	
	/**
	 * Return the string representation of this source node. Walks over the tree
	 * and concatenates all the various snippets together to one string.
	 */
	SourceNode.prototype.toString = function SourceNode_toString() {
	  var str = "";
	  this.walk(function (chunk) {
	    str += chunk;
	  });
	  return str;
	};
	
	/**
	 * Returns the string representation of this source node along with a source
	 * map.
	 */
	SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
	  var generated = {
	    code: "",
	    line: 1,
	    column: 0
	  };
	  var map = new SourceMapGenerator(aArgs);
	  var sourceMappingActive = false;
	  var lastOriginalSource = null;
	  var lastOriginalLine = null;
	  var lastOriginalColumn = null;
	  var lastOriginalName = null;
	  this.walk(function (chunk, original) {
	    generated.code += chunk;
	    if (original.source !== null
	        && original.line !== null
	        && original.column !== null) {
	      if(lastOriginalSource !== original.source
	         || lastOriginalLine !== original.line
	         || lastOriginalColumn !== original.column
	         || lastOriginalName !== original.name) {
	        map.addMapping({
	          source: original.source,
	          original: {
	            line: original.line,
	            column: original.column
	          },
	          generated: {
	            line: generated.line,
	            column: generated.column
	          },
	          name: original.name
	        });
	      }
	      lastOriginalSource = original.source;
	      lastOriginalLine = original.line;
	      lastOriginalColumn = original.column;
	      lastOriginalName = original.name;
	      sourceMappingActive = true;
	    } else if (sourceMappingActive) {
	      map.addMapping({
	        generated: {
	          line: generated.line,
	          column: generated.column
	        }
	      });
	      lastOriginalSource = null;
	      sourceMappingActive = false;
	    }
	    for (var idx = 0, length = chunk.length; idx < length; idx++) {
	      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
	        generated.line++;
	        generated.column = 0;
	        // Mappings end at eol
	        if (idx + 1 === length) {
	          lastOriginalSource = null;
	          sourceMappingActive = false;
	        } else if (sourceMappingActive) {
	          map.addMapping({
	            source: original.source,
	            original: {
	              line: original.line,
	              column: original.column
	            },
	            generated: {
	              line: generated.line,
	              column: generated.column
	            },
	            name: original.name
	          });
	        }
	      } else {
	        generated.column++;
	      }
	    }
	  });
	  this.walkSourceContents(function (sourceFile, sourceContent) {
	    map.setSourceContent(sourceFile, sourceContent);
	  });
	
	  return { code: generated.code, map: map };
	};
	
	exports.SourceNode = SourceNode;


/***/ })
/******/ ])
});
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIndlYnBhY2s6Ly8vLi9zb3VyY2UtbWFwLmpzIiwid2VicGFjazovLy8uL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LXZscS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LmpzIiwid2VicGFjazovLy8uL2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21hcHBpbmctbGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcXVpY2stc29ydC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW5vZGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNQQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEwQyxTQUFTO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3hhQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBMkQ7QUFDM0QscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBOzs7Ozs7O0FDM0lBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLG9CQUFtQjtBQUNuQixxQkFBb0I7O0FBRXBCLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLGlCQUFnQjtBQUNoQixrQkFBaUI7O0FBRWpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDbEVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBMkIsUUFBUTtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWE7QUFDYjs7QUFFQTtBQUNBLGVBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDdmVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQyxTQUFTO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUN4SEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUM5RUEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7O0FBRVg7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWEsa0NBQWtDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUFzRCxZQUFZO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBeUIsY0FBYztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLHdDQUF3QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUErQyxtQkFBbUIsRUFBRTtBQUNwRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsb0JBQW9CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBNkIsTUFBTTtBQUNuQztBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsMkJBQTJC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Q0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNqSEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWlDLFFBQVE7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLFNBQVM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQSx1Q0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQStDLFNBQVM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBeUMsU0FBUztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsNkNBQTRDLGNBQWM7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxjQUFhO0FBQ2I7QUFDQSxZQUFXO0FBQ1g7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQSxJQUFHOztBQUVILFdBQVU7QUFDVjs7QUFFQSIsImZpbGUiOiJzb3VyY2UtbWFwLmRlYnVnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic291cmNlTWFwXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInNvdXJjZU1hcFwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1jb25zdW1lcicpLlNvdXJjZU1hcENvbnN1bWVyO1xuZXhwb3J0cy5Tb3VyY2VOb2RlID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW5vZGUnKS5Tb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zb3VyY2UtbWFwLmpzXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gc291cmNlUm9vdDogQSByb290IGZvciBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICBpZiAoIWFBcmdzKSB7XG4gICAgYUFyZ3MgPSB7fTtcbiAgfVxuICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdmaWxlJywgbnVsbCk7XG4gIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG59XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7XG4gICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICBmaWxlOiBhU291cmNlTWFwQ29uc3VtZXIuZmlsZSxcbiAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICB9KTtcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld01hcHBpbmcub3JpZ2luYWwgPSB7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBzb3VyY2VSZWxhdGl2ZSA9IHNvdXJjZUZpbGU7XG4gICAgICBpZiAoc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VSZWxhdGl2ZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdG9yLl9zb3VyY2VzLmhhcyhzb3VyY2VSZWxhdGl2ZSkpIHtcbiAgICAgICAgZ2VuZXJhdG9yLl9zb3VyY2VzLmFkZChzb3VyY2VSZWxhdGl2ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH07XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZ2VuZXJhdGVkJyk7XG4gICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICduYW1lJywgbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IFN0cmluZyhzb3VyY2UpO1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICAgIGlmICghdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9tYXBwaW5ncy5hZGQoe1xuICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAqIHJld3JpdHRlbiB1c2luZyB0aGUgc3VwcGxpZWQgc291cmNlIG1hcC4gTm90ZTogVGhlIHJlc29sdXRpb24gZm9yIHRoZVxuICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAqIEBwYXJhbSBhU291cmNlTWFwUGF0aCBPcHRpb25hbC4gVGhlIGRpcm5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBtYXBcbiAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gKiAgICAgICAgZGlyZWN0b3J5LCBhbmQgdGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZCBjb250YWlucyByZWxhdGl2ZSBzb3VyY2VcbiAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICB2YXIgc291cmNlRmlsZSA9IGFTb3VyY2VGaWxlO1xuICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgJ29yIHRoZSBzb3VyY2UgbWFwXFwncyBcImZpbGVcIiBwcm9wZXJ0eS4gQm90aCB3ZXJlIG9taXR0ZWQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc291cmNlRmlsZSA9IGFTb3VyY2VNYXBDb25zdW1lci5maWxlO1xuICAgIH1cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgLy8gTWFrZSBcInNvdXJjZUZpbGVcIiByZWxhdGl2ZSBpZiBhbiBhYnNvbHV0ZSBVcmwgaXMgcGFzc2VkLlxuICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgIH1cbiAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICB2YXIgbmV3U291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgdGhpcy5fbWFwcGluZ3MudW5zb3J0ZWRGb3JFYWNoKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgdmFyIG9yaWdpbmFsID0gYVNvdXJjZU1hcENvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFuZXdTb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH07XG5cbi8qKlxuICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gKlxuICogICAxLiBKdXN0IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gKiAgICAgIHRva2VuLlxuICpcbiAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICogaW4gdG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl92YWxpZGF0ZU1hcHBpbmcoYUdlbmVyYXRlZCwgYU9yaWdpbmFsLCBhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgLy8gV2hlbiBhT3JpZ2luYWwgaXMgdHJ1dGh5IGJ1dCBoYXMgZW1wdHkgdmFsdWVzIGZvciAubGluZSBhbmQgLmNvbHVtbixcbiAgICAvLyBpdCBpcyBtb3N0IGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IuIEluIHRoaXMgY2FzZSB3ZSB0aHJvdyBhIHZlcnlcbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIHRvIHRyeSB0byBndWlkZSB0aGVtIHRoZSByaWdodCB3YXkuXG4gICAgLy8gRm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyL3BvbHltZXItYnVuZGxlci9wdWxsLzUxOVxuICAgIGlmIChhT3JpZ2luYWwgJiYgdHlwZW9mIGFPcmlnaW5hbC5saW5lICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYU9yaWdpbmFsLmNvbHVtbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ29yaWdpbmFsLmxpbmUgYW5kIG9yaWdpbmFsLmNvbHVtbiBhcmUgbm90IG51bWJlcnMgLS0geW91IHByb2JhYmx5IG1lYW50IHRvIG9taXQgJyArXG4gICAgICAgICAgICAndGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50aXJlbHkgYW5kIG9ubHkgbWFwIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uIElmIHNvLCBwYXNzICcgK1xuICAgICAgICAgICAgJ251bGwgZm9yIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGluc3RlYWQgb2YgYW4gb2JqZWN0IHdpdGggZW1wdHkgb3IgbnVsbCB2YWx1ZXMuJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAvLyBDYXNlIDEuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbC5saW5lID4gMCAmJiBhT3JpZ2luYWwuY29sdW1uID49IDBcbiAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtYXBwaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCxcbiAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiB0byB0aGUgc3RyZWFtIG9mIGJhc2UgNjQgVkxRc1xuICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgIHZhciByZXN1bHQgPSAnJztcbiAgICB2YXIgbmV4dDtcbiAgICB2YXIgbWFwcGluZztcbiAgICB2YXIgbmFtZUlkeDtcbiAgICB2YXIgc291cmNlSWR4O1xuXG4gICAgdmFyIG1hcHBpbmdzID0gdGhpcy5fbWFwcGluZ3MudG9BcnJheSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgbWFwcGluZyA9IG1hcHBpbmdzW2ldO1xuICAgICAgbmV4dCA9ICcnXG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5leHQgKz0gJzsnO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgaWYgKCF1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmcsIG1hcHBpbmdzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0ICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlSWR4ID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKHNvdXJjZUlkeCAtIHByZXZpb3VzU291cmNlKTtcbiAgICAgICAgcHJldmlvdXNTb3VyY2UgPSBzb3VyY2VJZHg7XG5cbiAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTtcblxuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4pO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuYW1lSWR4ID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShuYW1lSWR4IC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICBwcmV2aW91c05hbWUgPSBuYW1lSWR4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCArPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFTb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cywga2V5KVxuICAgICAgICA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgIHZhciBtYXAgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICBuYW1lczogdGhpcy5fbmFtZXMudG9BcnJheSgpLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLl9maWxlICE9IG51bGwpIHtcbiAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvU3RyaW5nKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKTtcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qc1xuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICpcbiAqIEJhc2VkIG9uIHRoZSBCYXNlIDY0IFZMUSBpbXBsZW1lbnRhdGlvbiBpbiBDbG9zdXJlIENvbXBpbGVyOlxuICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jbG9zdXJlLWNvbXBpbGVyL3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL2NvbS9nb29nbGUvZGVidWdnaW5nL3NvdXJjZW1hcC9CYXNlNjRWTFEuamF2YVxuICpcbiAqIENvcHlyaWdodCAyMDExIFRoZSBDbG9zdXJlIENvbXBpbGVyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZFxuICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xuXG4vLyBBIHNpbmdsZSBiYXNlIDY0IGRpZ2l0IGNhbiBjb250YWluIDYgYml0cyBvZiBkYXRhLiBGb3IgdGhlIGJhc2UgNjQgdmFyaWFibGVcbi8vIGxlbmd0aCBxdWFudGl0aWVzIHdlIHVzZSBpbiB0aGUgc291cmNlIG1hcCBzcGVjLCB0aGUgZmlyc3QgYml0IGlzIHRoZSBzaWduLFxuLy8gdGhlIG5leHQgZm91ciBiaXRzIGFyZSB0aGUgYWN0dWFsIHZhbHVlLCBhbmQgdGhlIDZ0aCBiaXQgaXMgdGhlXG4vLyBjb250aW51YXRpb24gYml0LiBUaGUgY29udGludWF0aW9uIGJpdCB0ZWxscyB1cyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlXG4vLyBkaWdpdHMgaW4gdGhpcyB2YWx1ZSBmb2xsb3dpbmcgdGhpcyBkaWdpdC5cbi8vXG4vLyAgIENvbnRpbnVhdGlvblxuLy8gICB8ICAgIFNpZ25cbi8vICAgfCAgICB8XG4vLyAgIFYgICAgVlxuLy8gICAxMDEwMTFcblxudmFyIFZMUV9CQVNFX1NISUZUID0gNTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQkFTRSA9IDEgPDwgVkxRX0JBU0VfU0hJRlQ7XG5cbi8vIGJpbmFyeTogMDExMTExXG52YXIgVkxRX0JBU0VfTUFTSyA9IFZMUV9CQVNFIC0gMTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQ09OVElOVUFUSU9OX0JJVCA9IFZMUV9CQVNFO1xuXG4vKipcbiAqIENvbnZlcnRzIGZyb20gYSB0d28tY29tcGxlbWVudCB2YWx1ZSB0byBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDEgYmVjb21lcyAyICgxMCBiaW5hcnkpLCAtMSBiZWNvbWVzIDMgKDExIGJpbmFyeSlcbiAqICAgMiBiZWNvbWVzIDQgKDEwMCBiaW5hcnkpLCAtMiBiZWNvbWVzIDUgKDEwMSBiaW5hcnkpXG4gKi9cbmZ1bmN0aW9uIHRvVkxRU2lnbmVkKGFWYWx1ZSkge1xuICByZXR1cm4gYVZhbHVlIDwgMFxuICAgID8gKCgtYVZhbHVlKSA8PCAxKSArIDFcbiAgICA6IChhVmFsdWUgPDwgMSkgKyAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRvIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgZnJvbSBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDIgKDEwIGJpbmFyeSkgYmVjb21lcyAxLCAzICgxMSBiaW5hcnkpIGJlY29tZXMgLTFcbiAqICAgNCAoMTAwIGJpbmFyeSkgYmVjb21lcyAyLCA1ICgxMDEgYmluYXJ5KSBiZWNvbWVzIC0yXG4gKi9cbmZ1bmN0aW9uIGZyb21WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHZhciBpc05lZ2F0aXZlID0gKGFWYWx1ZSAmIDEpID09PSAxO1xuICB2YXIgc2hpZnRlZCA9IGFWYWx1ZSA+PiAxO1xuICByZXR1cm4gaXNOZWdhdGl2ZVxuICAgID8gLXNoaWZ0ZWRcbiAgICA6IHNoaWZ0ZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmFzZSA2NCBWTFEgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZW5jb2RlKGFWYWx1ZSkge1xuICB2YXIgZW5jb2RlZCA9IFwiXCI7XG4gIHZhciBkaWdpdDtcblxuICB2YXIgdmxxID0gdG9WTFFTaWduZWQoYVZhbHVlKTtcblxuICBkbyB7XG4gICAgZGlnaXQgPSB2bHEgJiBWTFFfQkFTRV9NQVNLO1xuICAgIHZscSA+Pj49IFZMUV9CQVNFX1NISUZUO1xuICAgIGlmICh2bHEgPiAwKSB7XG4gICAgICAvLyBUaGVyZSBhcmUgc3RpbGwgbW9yZSBkaWdpdHMgaW4gdGhpcyB2YWx1ZSwgc28gd2UgbXVzdCBtYWtlIHN1cmUgdGhlXG4gICAgICAvLyBjb250aW51YXRpb24gYml0IGlzIG1hcmtlZC5cbiAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUO1xuICAgIH1cbiAgICBlbmNvZGVkICs9IGJhc2U2NC5lbmNvZGUoZGlnaXQpO1xuICB9IHdoaWxlICh2bHEgPiAwKTtcblxuICByZXR1cm4gZW5jb2RlZDtcbn07XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgbmV4dCBiYXNlIDY0IFZMUSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgdGhlXG4gKiB2YWx1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB2aWEgdGhlIG91dCBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2RlY29kZShhU3RyLCBhSW5kZXgsIGFPdXRQYXJhbSkge1xuICB2YXIgc3RyTGVuID0gYVN0ci5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSAwO1xuICB2YXIgc2hpZnQgPSAwO1xuICB2YXIgY29udGludWF0aW9uLCBkaWdpdDtcblxuICBkbyB7XG4gICAgaWYgKGFJbmRleCA+PSBzdHJMZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG1vcmUgZGlnaXRzIGluIGJhc2UgNjQgVkxRIHZhbHVlLlwiKTtcbiAgICB9XG5cbiAgICBkaWdpdCA9IGJhc2U2NC5kZWNvZGUoYVN0ci5jaGFyQ29kZUF0KGFJbmRleCsrKSk7XG4gICAgaWYgKGRpZ2l0ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYXNlNjQgZGlnaXQ6IFwiICsgYVN0ci5jaGFyQXQoYUluZGV4IC0gMSkpO1xuICAgIH1cblxuICAgIGNvbnRpbnVhdGlvbiA9ICEhKGRpZ2l0ICYgVkxRX0NPTlRJTlVBVElPTl9CSVQpO1xuICAgIGRpZ2l0ICY9IFZMUV9CQVNFX01BU0s7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICsgKGRpZ2l0IDw8IHNoaWZ0KTtcbiAgICBzaGlmdCArPSBWTFFfQkFTRV9TSElGVDtcbiAgfSB3aGlsZSAoY29udGludWF0aW9uKTtcblxuICBhT3V0UGFyYW0udmFsdWUgPSBmcm9tVkxRU2lnbmVkKHJlc3VsdCk7XG4gIGFPdXRQYXJhbS5yZXN0ID0gYUluZGV4O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC12bHEuanNcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgaW50VG9DaGFyTWFwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLnNwbGl0KCcnKTtcblxuLyoqXG4gKiBFbmNvZGUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2Ugb2YgMCB0byA2MyB0byBhIHNpbmdsZSBiYXNlIDY0IGRpZ2l0LlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgaWYgKDAgPD0gbnVtYmVyICYmIG51bWJlciA8IGludFRvQ2hhck1hcC5sZW5ndGgpIHtcbiAgICByZXR1cm4gaW50VG9DaGFyTWFwW251bWJlcl07XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk11c3QgYmUgYmV0d2VlbiAwIGFuZCA2MzogXCIgKyBudW1iZXIpO1xufTtcblxuLyoqXG4gKiBEZWNvZGUgYSBzaW5nbGUgYmFzZSA2NCBjaGFyYWN0ZXIgY29kZSBkaWdpdCB0byBhbiBpbnRlZ2VyLiBSZXR1cm5zIC0xIG9uXG4gKiBmYWlsdXJlLlxuICovXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICB2YXIgYmlnQSA9IDY1OyAgICAgLy8gJ0EnXG4gIHZhciBiaWdaID0gOTA7ICAgICAvLyAnWidcblxuICB2YXIgbGl0dGxlQSA9IDk3OyAgLy8gJ2EnXG4gIHZhciBsaXR0bGVaID0gMTIyOyAvLyAneidcblxuICB2YXIgemVybyA9IDQ4OyAgICAgLy8gJzAnXG4gIHZhciBuaW5lID0gNTc7ICAgICAvLyAnOSdcblxuICB2YXIgcGx1cyA9IDQzOyAgICAgLy8gJysnXG4gIHZhciBzbGFzaCA9IDQ3OyAgICAvLyAnLydcblxuICB2YXIgbGl0dGxlT2Zmc2V0ID0gMjY7XG4gIHZhciBudW1iZXJPZmZzZXQgPSA1MjtcblxuICAvLyAwIC0gMjU6IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXG4gIGlmIChiaWdBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGJpZ1opIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gYmlnQSk7XG4gIH1cblxuICAvLyAyNiAtIDUxOiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxuICBpZiAobGl0dGxlQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBsaXR0bGVaKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIGxpdHRsZUEgKyBsaXR0bGVPZmZzZXQpO1xuICB9XG5cbiAgLy8gNTIgLSA2MTogMDEyMzQ1Njc4OVxuICBpZiAoemVybyA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBuaW5lKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIHplcm8gKyBudW1iZXJPZmZzZXQpO1xuICB9XG5cbiAgLy8gNjI6ICtcbiAgaWYgKGNoYXJDb2RlID09IHBsdXMpIHtcbiAgICByZXR1cm4gNjI7XG4gIH1cblxuICAvLyA2MzogL1xuICBpZiAoY2hhckNvZGUgPT0gc2xhc2gpIHtcbiAgICByZXR1cm4gNjM7XG4gIH1cblxuICAvLyBJbnZhbGlkIGJhc2U2NCBkaWdpdC5cbiAgcmV0dXJuIC0xO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC5qc1xuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXIvb3B0aW9uc1xuICogb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gYXJncyBUaGUgb2JqZWN0IHdlIGFyZSBleHRyYWN0aW5nIHZhbHVlcyBmcm9tXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2UgYXJlIGdldHRpbmcuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIEFuIG9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZ1xuICogZnJvbSB0aGUgb2JqZWN0LiBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nLCBhblxuICogZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIGdldEFyZyhhQXJncywgYU5hbWUsIGFEZWZhdWx0VmFsdWUpIHtcbiAgaWYgKGFOYW1lIGluIGFBcmdzKSB7XG4gICAgcmV0dXJuIGFBcmdzW2FOYW1lXTtcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgcmV0dXJuIGFEZWZhdWx0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhTmFtZSArICdcIiBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LicpO1xuICB9XG59XG5leHBvcnRzLmdldEFyZyA9IGdldEFyZztcblxudmFyIHVybFJlZ2V4cCA9IC9eKD86KFtcXHcrXFwtLl0rKTopP1xcL1xcLyg/OihcXHcrOlxcdyspQCk/KFtcXHcuLV0qKSg/OjooXFxkKykpPyguKikkLztcbnZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXFwsLiskLztcblxuZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICB2YXIgbWF0Y2ggPSBhVXJsLm1hdGNoKHVybFJlZ2V4cCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgYXV0aDogbWF0Y2hbMl0sXG4gICAgaG9zdDogbWF0Y2hbM10sXG4gICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV1cbiAgfTtcbn1cbmV4cG9ydHMudXJsUGFyc2UgPSB1cmxQYXJzZTtcblxuZnVuY3Rpb24gdXJsR2VuZXJhdGUoYVBhcnNlZFVybCkge1xuICB2YXIgdXJsID0gJyc7XG4gIGlmIChhUGFyc2VkVXJsLnNjaGVtZSkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnNjaGVtZSArICc6JztcbiAgfVxuICB1cmwgKz0gJy8vJztcbiAgaWYgKGFQYXJzZWRVcmwuYXV0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwuaG9zdCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucG9ydCkge1xuICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBhdGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5leHBvcnRzLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gKlxuICogLSBSZXBsYWNlcyBjb25zZWN1dGl2ZSBzbGFzaGVzIHdpdGggb25lIHNsYXNoLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnPGRpcj4vLi4nIHBhcnRzLlxuICpcbiAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciB1cmwgdG8gbm9ybWFsaXplLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemUoYVBhdGgpIHtcbiAgdmFyIHBhdGggPSBhUGF0aDtcbiAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgaWYgKHVybCkge1xuICAgIGlmICghdXJsLnBhdGgpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG4gICAgcGF0aCA9IHVybC5wYXRoO1xuICB9XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpO1xuXG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoL1xcLysvKTtcbiAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgaWYgKHBhcnQgPT09ICcnKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJsYW5rIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLiBUcnlpbmcgdG8gZ29cbiAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHJvb3QuXG4gICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApO1xuICAgICAgICB1cCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7XG4gICAgICAgIHVwLS07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gIH1cblxuICBpZiAodXJsKSB7XG4gICAgdXJsLnBhdGggPSBwYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZSh1cmwpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbi8qKlxuICogSm9pbnMgdHdvIHBhdGhzL1VSTHMuXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBqb2luZWQgd2l0aCB0aGUgcm9vdC5cbiAqXG4gKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICogICBzY2hlbWUtcmVsYXRpdmUgVVJMOiBUaGVuIHRoZSBzY2hlbWUgb2YgYVJvb3QsIGlmIGFueSwgaXMgcHJlcGVuZGVkXG4gKiAgIGZpcnN0LlxuICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gKiAgIGlzIHVwZGF0ZWQgd2l0aCB0aGUgcmVzdWx0IGFuZCBhUm9vdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXN1bHRcbiAqICAgaXMgcmV0dXJuZWQuXG4gKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gKiAgIC0gT3RoZXJ3aXNlIHRoZSB0d28gcGF0aHMgYXJlIGpvaW5lZCB3aXRoIGEgc2xhc2guXG4gKiAtIEpvaW5pbmcgZm9yIGV4YW1wbGUgJ2h0dHA6Ly8nIGFuZCAnd3d3LmV4YW1wbGUuY29tJyBpcyBhbHNvIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gam9pbihhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuICBpZiAoYVBhdGggPT09IFwiXCIpIHtcbiAgICBhUGF0aCA9IFwiLlwiO1xuICB9XG4gIHZhciBhUGF0aFVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdCA9IGFSb290VXJsLnBhdGggfHwgJy8nO1xuICB9XG5cbiAgLy8gYGpvaW4oZm9vLCAnLy93d3cuZXhhbXBsZS5vcmcnKWBcbiAgaWYgKGFQYXRoVXJsICYmICFhUGF0aFVybC5zY2hlbWUpIHtcbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFQYXRoVXJsLnNjaGVtZSA9IGFSb290VXJsLnNjaGVtZTtcbiAgICB9XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgfVxuXG4gIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkge1xuICAgIHJldHVybiBhUGF0aDtcbiAgfVxuXG4gIC8vIGBqb2luKCdodHRwOi8vJywgJ3d3dy5leGFtcGxlLmNvbScpYFxuICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuXG4gIHZhciBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgID8gYVBhdGhcbiAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdFVybC5wYXRoID0gam9pbmVkO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uIChhUGF0aCkge1xuICByZXR1cm4gYVBhdGguY2hhckF0KDApID09PSAnLycgfHwgdXJsUmVnZXhwLnRlc3QoYVBhdGgpO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICovXG5mdW5jdGlvbiByZWxhdGl2ZShhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuXG4gIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHBhdGggdG8gYmUgYWJvdmUgdGhlIHJvb3QuIEluIHRoaXMgY2FzZSwgc2ltcGx5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgdGhlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlIHBhdGggd29uJ3Qgd29yay4gSW5zdGVhZCwgd2VcbiAgLy8gbmVlZCB0byByZW1vdmUgY29tcG9uZW50cyBmcm9tIHRoZSByb290IG9uZSBieSBvbmUsIHVudGlsIGVpdGhlciB3ZSBmaW5kXG4gIC8vIGEgcHJlZml4IHRoYXQgZml0cywgb3Igd2UgcnVuIG91dCBvZiBjb21wb25lbnRzIHRvIHJlbW92ZS5cbiAgdmFyIGxldmVsID0gMDtcbiAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpICE9PSAwKSB7XG4gICAgdmFyIGluZGV4ID0gYVJvb3QubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb25seSBwYXJ0IG9mIHRoZSByb290IHRoYXQgaXMgbGVmdCBpcyB0aGUgc2NoZW1lIChpLmUuIGh0dHA6Ly8sXG4gICAgLy8gZmlsZTovLy8sIGV0Yy4pLCBvbmUgb3IgbW9yZSBzbGFzaGVzICgvKSwgb3Igc2ltcGx5IG5vdGhpbmcgYXQgYWxsLCB3ZVxuICAgIC8vIGhhdmUgZXhoYXVzdGVkIGFsbCBjb21wb25lbnRzLCBzbyB0aGUgcGF0aCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHJvb3QuXG4gICAgYVJvb3QgPSBhUm9vdC5zbGljZSgwLCBpbmRleCk7XG4gICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXFwvXSs6XFwvKT9cXC8qJC8pKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgKytsZXZlbDtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBhZGQgYSBcIi4uL1wiIGZvciBlYWNoIGNvbXBvbmVudCB3ZSByZW1vdmVkIGZyb20gdGhlIHJvb3QuXG4gIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4oXCIuLi9cIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7XG59XG5leHBvcnRzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG5cbnZhciBzdXBwb3J0c051bGxQcm90byA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gISgnX19wcm90b19fJyBpbiBvYmopO1xufSgpKTtcblxuZnVuY3Rpb24gaWRlbnRpdHkgKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogQmVjYXVzZSBiZWhhdmlvciBnb2VzIHdhY2t5IHdoZW4geW91IHNldCBgX19wcm90b19fYCBvbiBvYmplY3RzLCB3ZVxuICogaGF2ZSB0byBwcmVmaXggYWxsIHRoZSBzdHJpbmdzIGluIG91ciBzZXQgd2l0aCBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL3B1bGwvMzEgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8zMFxuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5mdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMudG9TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogdG9TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiBhU3RyLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLmZyb21TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogZnJvbVNldFN0cmluZztcblxuZnVuY3Rpb24gaXNQcm90b1N0cmluZyhzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBzLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOSAvKiBcIl9fcHJvdG9fX1wiLmxlbmd0aCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMSkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAyKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDMpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNCkgIT09IDExNiAvKiAndCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA1KSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDYpICE9PSAxMTQgLyogJ3InICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNykgIT09IDExMiAvKiAncCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA4KSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDkpICE9PSA5NSAgLyogJ18nICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IGxlbmd0aCAtIDEwOyBpID49IDA7IGktLSkge1xuICAgIGlmIChzLmNoYXJDb2RlQXQoaSkgIT09IDM2IC8qICckJyAqLykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4sIGJ1dCBkaWZmZXJlbnQgZ2VuZXJhdGVkXG4gKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICogc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gIHZhciBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zID0gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnM7XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGRlZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBpbmRpY2VzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uLCBidXQgZGlmZmVyZW50XG4gKiBzb3VyY2UvbmFtZS9vcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYVxuICogbWFwcGluZyB3aXRoIGEgc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZDtcblxuZnVuY3Rpb24gc3RyY21wKGFTdHIxLCBhU3RyMikge1xuICBpZiAoYVN0cjEgPT09IGFTdHIyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAoYVN0cjEgPT09IG51bGwpIHtcbiAgICByZXR1cm4gMTsgLy8gYVN0cjIgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMiA9PT0gbnVsbCkge1xuICAgIHJldHVybiAtMTsgLy8gYVN0cjEgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMSA+IGFTdHIyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGluZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBzdHJpbmdzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZDtcblxuLyoqXG4gKiBTdHJpcCBhbnkgSlNPTiBYU1NJIGF2b2lkYW5jZSBwcmVmaXggZnJvbSB0aGUgc3RyaW5nIChhcyBkb2N1bWVudGVkXG4gKiBpbiB0aGUgc291cmNlIG1hcHMgc3BlY2lmaWNhdGlvbiksIGFuZCB0aGVuIHBhcnNlIHRoZSBzdHJpbmcgYXNcbiAqIEpTT04uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU291cmNlTWFwSW5wdXQoc3RyKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKHN0ci5yZXBsYWNlKC9eXFwpXX0nW15cXG5dKlxcbi8sICcnKSk7XG59XG5leHBvcnRzLnBhcnNlU291cmNlTWFwSW5wdXQgPSBwYXJzZVNvdXJjZU1hcElucHV0O1xuXG4vKipcbiAqIENvbXB1dGUgdGhlIFVSTCBvZiBhIHNvdXJjZSBnaXZlbiB0aGUgdGhlIHNvdXJjZSByb290LCB0aGUgc291cmNlJ3NcbiAqIFVSTCwgYW5kIHRoZSBzb3VyY2UgbWFwJ3MgVVJMLlxuICovXG5mdW5jdGlvbiBjb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKSB7XG4gIHNvdXJjZVVSTCA9IHNvdXJjZVVSTCB8fCAnJztcblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIC8vIFRoaXMgZm9sbG93cyB3aGF0IENocm9tZSBkb2VzLlxuICAgIGlmIChzb3VyY2VSb290W3NvdXJjZVJvb3QubGVuZ3RoIC0gMV0gIT09ICcvJyAmJiBzb3VyY2VVUkxbMF0gIT09ICcvJykge1xuICAgICAgc291cmNlUm9vdCArPSAnLyc7XG4gICAgfVxuICAgIC8vIFRoZSBzcGVjIHNheXM6XG4gICAgLy8gICBMaW5lIDQ6IEFuIG9wdGlvbmFsIHNvdXJjZSByb290LCB1c2VmdWwgZm9yIHJlbG9jYXRpbmcgc291cmNlXG4gICAgLy8gICBmaWxlcyBvbiBhIHNlcnZlciBvciByZW1vdmluZyByZXBlYXRlZCB2YWx1ZXMgaW4gdGhlXG4gICAgLy8gICDigJxzb3VyY2Vz4oCdIGVudHJ5LiAgVGhpcyB2YWx1ZSBpcyBwcmVwZW5kZWQgdG8gdGhlIGluZGl2aWR1YWxcbiAgICAvLyAgIGVudHJpZXMgaW4gdGhlIOKAnHNvdXJjZeKAnSBmaWVsZC5cbiAgICBzb3VyY2VVUkwgPSBzb3VyY2VSb290ICsgc291cmNlVVJMO1xuICB9XG5cbiAgLy8gSGlzdG9yaWNhbGx5LCBTb3VyY2VNYXBDb25zdW1lciBkaWQgbm90IHRha2UgdGhlIHNvdXJjZU1hcFVSTCBhc1xuICAvLyBhIHBhcmFtZXRlci4gIFRoaXMgbW9kZSBpcyBzdGlsbCBzb21ld2hhdCBzdXBwb3J0ZWQsIHdoaWNoIGlzIHdoeVxuICAvLyB0aGlzIGNvZGUgYmxvY2sgaXMgY29uZGl0aW9uYWwuICBIb3dldmVyLCBpdCdzIHByZWZlcmFibGUgdG8gcGFzc1xuICAvLyB0aGUgc291cmNlIG1hcCBVUkwgdG8gU291cmNlTWFwQ29uc3VtZXIsIHNvIHRoYXQgdGhpcyBmdW5jdGlvblxuICAvLyBjYW4gaW1wbGVtZW50IHRoZSBzb3VyY2UgVVJMIHJlc29sdXRpb24gYWxnb3JpdGhtIGFzIG91dGxpbmVkIGluXG4gIC8vIHRoZSBzcGVjLiAgVGhpcyBibG9jayBpcyBiYXNpY2FsbHkgdGhlIGVxdWl2YWxlbnQgb2Y6XG4gIC8vICAgIG5ldyBVUkwoc291cmNlVVJMLCBzb3VyY2VNYXBVUkwpLnRvU3RyaW5nKClcbiAgLy8gLi4uIGV4Y2VwdCBpdCBhdm9pZHMgdXNpbmcgVVJMLCB3aGljaCB3YXNuJ3QgYXZhaWxhYmxlIGluIHRoZVxuICAvLyBvbGRlciByZWxlYXNlcyBvZiBub2RlIHN0aWxsIHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnkuXG4gIC8vXG4gIC8vIFRoZSBzcGVjIHNheXM6XG4gIC8vICAgSWYgdGhlIHNvdXJjZXMgYXJlIG5vdCBhYnNvbHV0ZSBVUkxzIGFmdGVyIHByZXBlbmRpbmcgb2YgdGhlXG4gIC8vICAg4oCcc291cmNlUm9vdOKAnSwgdGhlIHNvdXJjZXMgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZVxuICAvLyAgIFNvdXJjZU1hcCAobGlrZSByZXNvbHZpbmcgc2NyaXB0IHNyYyBpbiBhIGh0bWwgZG9jdW1lbnQpLlxuICBpZiAoc291cmNlTWFwVVJMKSB7XG4gICAgdmFyIHBhcnNlZCA9IHVybFBhcnNlKHNvdXJjZU1hcFVSTCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNvdXJjZU1hcFVSTCBjb3VsZCBub3QgYmUgcGFyc2VkXCIpO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLnBhdGgpIHtcbiAgICAgIC8vIFN0cmlwIHRoZSBsYXN0IHBhdGggY29tcG9uZW50LCBidXQga2VlcCB0aGUgXCIvXCIuXG4gICAgICB2YXIgaW5kZXggPSBwYXJzZWQucGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgcGFyc2VkLnBhdGggPSBwYXJzZWQucGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlVVJMID0gam9pbih1cmxHZW5lcmF0ZShwYXJzZWQpLCBzb3VyY2VVUkwpO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZShzb3VyY2VVUkwpO1xufVxuZXhwb3J0cy5jb21wdXRlU291cmNlVVJMID0gY29tcHV0ZVNvdXJjZVVSTDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL3V0aWwuanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2FycmF5LXNldC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICogcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG59XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG59XG5cbi8qKlxuICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAqXG4gKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgfTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICogY29weS5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCk7XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyYXk7XG59O1xuXG5leHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9tYXBwaW5nLWxpc3QuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICByZXR1cm4gc291cmNlTWFwLnNlY3Rpb25zICE9IG51bGxcbiAgICA/IG5ldyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKVxuICAgIDogbmV3IEJhc2ljU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcCA9IGZ1bmN0aW9uKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgcmV0dXJuIEJhc2ljU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8vIGBfX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmQgYF9fb3JpZ2luYWxNYXBwaW5nc2AgYXJlIGFycmF5cyB0aGF0IGhvbGQgdGhlXG4vLyBwYXJzZWQgbWFwcGluZyBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgbWFwJ3MgXCJtYXBwaW5nc1wiIGF0dHJpYnV0ZS4gVGhleVxuLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGdldHRlcnMgcmVzcGVjdGl2ZWx5LCBhbmQgd2Ugb25seSBwYXJzZSB0aGUgbWFwcGluZ3Ncbi8vIGFuZCBjcmVhdGUgdGhlc2UgYXJyYXlzIG9uY2UgcXVlcmllZCBmb3IgYSBzb3VyY2UgbG9jYXRpb24uIFdlIGp1bXAgdGhyb3VnaFxuLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nXG4vLyB0aGVtIGlzIGV4cGVuc2l2ZSwgc28gd2Ugb25seSB3YW50IHRvIGRvIGl0IGlmIHdlIG11c3QuXG4vL1xuLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybTpcbi8vXG4vLyAgICAge1xuLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIGdlbmVyYXRlZENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgc291cmNlOiBUaGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhpc1xuLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxMaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhpcyBjaHVuayBvZiBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBzeW1ib2wgd2hpY2ggZ2VuZXJhdGVkIHRoaXMgY2h1bmsgb2Zcbi8vICAgICAgICAgICAgIGNvZGUuXG4vLyAgICAgfVxuLy9cbi8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmVcbi8vIGBudWxsYC5cbi8vXG4vLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLlxuLy9cbi8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zLlxuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX2dlbmVyYXRlZE1hcHBpbmdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19vcmlnaW5hbE1hcHBpbmdzID0gbnVsbDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfb3JpZ2luYWxNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZSwgdGhpcy5fc291cmNlTWFwVVJMKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IE9wdGlvbmFsLiB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yKGFBcmdzKSB7XG4gICAgdmFyIGxpbmUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKTtcblxuICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gZXhhY3QgbWF0Y2gsIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kTWFwcGluZ1xuICAgIC8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hcHBpbmcgbGVzcyB0aGFuIHRoZSBuZWVkbGUuIEJ5XG4gICAgLy8gc2V0dGluZyBuZWVkbGUub3JpZ2luYWxDb2x1bW4gdG8gMCwgd2UgdGh1cyBmaW5kIHRoZSBsYXN0IG1hcHBpbmcgZm9yXG4gICAgLy8gdGhlIGdpdmVuIGxpbmUsIHByb3ZpZGVkIHN1Y2ggYSBtYXBwaW5nIGV4aXN0cy5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpLFxuICAgICAgb3JpZ2luYWxMaW5lOiBsaW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJywgMClcbiAgICB9O1xuXG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChuZWVkbGUuc291cmNlKTtcbiAgICBpZiAobmVlZGxlLnNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgbWFwcGluZ3MgPSBbXTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKGFBcmdzLmNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZTtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIGZvdW5kLiBTaW5jZVxuICAgICAgICAvLyBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGZvdW5kLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gb3JpZ2luYWxMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIHdlcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgLy8gU2luY2UgbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBsaW5lICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID09IG9yaWdpbmFsQ29sdW1uKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXBwaW5ncztcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2ggd2UgY2FuXG4gKiBxdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGZpbGUgcG9zaXRpb25zIGJ5IGdpdmluZyBpdCBhIGZpbGVcbiAqIHBvc2l0aW9uIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3JcbiAqIGFscmVhZHkgcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYywgc291cmNlIG1hcHMgaGF2ZSB0aGVcbiAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIHNvdXJjZXM6IEFuIGFycmF5IG9mIFVSTHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAqICAgLSBuYW1lczogQW4gYXJyYXkgb2YgaWRlbnRpZmllcnMgd2hpY2ggY2FuIGJlIHJlZmVycmVuY2VkIGJ5IGluZGl2aWR1YWwgbWFwcGluZ3MuXG4gKiAgIC0gc291cmNlUm9vdDogT3B0aW9uYWwuIFRoZSBVUkwgcm9vdCBmcm9tIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSByZWxhdGl2ZS5cbiAqICAgLSBzb3VyY2VzQ29udGVudDogT3B0aW9uYWwuIEFuIGFycmF5IG9mIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbWFwcGluZ3M6IEEgc3RyaW5nIG9mIGJhc2U2NCBWTFFzIHdoaWNoIGNvbnRhaW4gdGhlIGFjdHVhbCBtYXBwaW5ncy5cbiAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKlxuICogSGVyZSBpcyBhbiBleGFtcGxlIHNvdXJjZSBtYXAsIHRha2VuIGZyb20gdGhlIHNvdXJjZSBtYXAgc3BlY1swXTpcbiAqXG4gKiAgICAge1xuICogICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICBmaWxlOiBcIm91dC5qc1wiLFxuICogICAgICAgc291cmNlUm9vdCA6IFwiXCIsXG4gKiAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAqICAgICAgIG1hcHBpbmdzOiBcIkFBLEFCOztBQkNERTtcIlxuICogICAgIH1cbiAqXG4gKiBUaGUgc2Vjb25kIHBhcmFtZXRlciwgaWYgZ2l2ZW4sIGlzIGEgc3RyaW5nIHdob3NlIHZhbHVlIGlzIHRoZSBVUkxcbiAqIGF0IHdoaWNoIHRoZSBzb3VyY2UgbWFwIHdhcyBmb3VuZC4gIFRoaXMgVVJMIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGVcbiAqIHNvdXJjZXMgYXJyYXkuXG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IHV0aWwucGFyc2VTb3VyY2VNYXBJbnB1dChhU291cmNlTWFwKTtcbiAgfVxuXG4gIHZhciB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAndmVyc2lvbicpO1xuICB2YXIgc291cmNlcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXMnKTtcbiAgLy8gU2FzcyAzLjMgbGVhdmVzIG91dCB0aGUgJ25hbWVzJyBhcnJheSwgc28gd2UgZGV2aWF0ZSBmcm9tIHRoZSBzcGVjICh3aGljaFxuICAvLyByZXF1aXJlcyB0aGUgYXJyYXkpIHRvIHBsYXkgbmljZSBoZXJlLlxuICB2YXIgbmFtZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICduYW1lcycsIFtdKTtcbiAgdmFyIHNvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VSb290JywgbnVsbCk7XG4gIHZhciBzb3VyY2VzQ29udGVudCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXNDb250ZW50JywgbnVsbCk7XG4gIHZhciBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ21hcHBpbmdzJyk7XG4gIHZhciBmaWxlID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnZmlsZScsIG51bGwpO1xuXG4gIC8vIE9uY2UgYWdhaW4sIFNhc3MgZGV2aWF0ZXMgZnJvbSB0aGUgc3BlYyBhbmQgc3VwcGxpZXMgdGhlIHZlcnNpb24gYXMgYVxuICAvLyBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIsIHNvIHdlIHVzZSBsb29zZSBlcXVhbGl0eSBjaGVja2luZyBoZXJlLlxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIHNvdXJjZVJvb3QgPSB1dGlsLm5vcm1hbGl6ZShzb3VyY2VSb290KTtcbiAgfVxuXG4gIHNvdXJjZXMgPSBzb3VyY2VzXG4gICAgLm1hcChTdHJpbmcpXG4gICAgLy8gU29tZSBzb3VyY2UgbWFwcyBwcm9kdWNlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBsaWtlIFwiLi9mb28uanNcIiBpbnN0ZWFkIG9mXG4gICAgLy8gXCJmb28uanNcIi4gIE5vcm1hbGl6ZSB0aGVzZSBmaXJzdCBzbyB0aGF0IGZ1dHVyZSBjb21wYXJpc29ucyB3aWxsIHN1Y2NlZWQuXG4gICAgLy8gU2VlIGJ1Z3ppbC5sYS8xMDkwNzY4LlxuICAgIC5tYXAodXRpbC5ub3JtYWxpemUpXG4gICAgLy8gQWx3YXlzIGVuc3VyZSB0aGF0IGFic29sdXRlIHNvdXJjZXMgYXJlIGludGVybmFsbHkgc3RvcmVkIHJlbGF0aXZlIHRvXG4gICAgLy8gdGhlIHNvdXJjZSByb290LCBpZiB0aGUgc291cmNlIHJvb3QgaXMgYWJzb2x1dGUuIE5vdCBkb2luZyB0aGlzIHdvdWxkXG4gICAgLy8gYmUgcGFydGljdWxhcmx5IHByb2JsZW1hdGljIHdoZW4gdGhlIHNvdXJjZSByb290IGlzIGEgcHJlZml4IG9mIHRoZVxuICAgIC8vIHNvdXJjZSAodmFsaWQsIGJ1dCB3aHk/PykuIFNlZSBnaXRodWIgaXNzdWUgIzE5OSBhbmQgYnVnemlsLmxhLzExODg5ODIuXG4gICAgLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlUm9vdCAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlUm9vdCkgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZSlcbiAgICAgICAgPyB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZSlcbiAgICAgICAgOiBzb3VyY2U7XG4gICAgfSk7XG5cbiAgLy8gUGFzcyBgdHJ1ZWAgYmVsb3cgdG8gYWxsb3cgZHVwbGljYXRlIG5hbWVzIGFuZCBzb3VyY2VzLiBXaGlsZSBzb3VyY2UgbWFwc1xuICAvLyBhcmUgaW50ZW5kZWQgdG8gYmUgY29tcHJlc3NlZCBhbmQgZGVkdXBsaWNhdGVkLCB0aGUgVHlwZVNjcmlwdCBjb21waWxlclxuICAvLyBzb21ldGltZXMgZ2VuZXJhdGVzIHNvdXJjZSBtYXBzIHdpdGggZHVwbGljYXRlcyBpbiB0aGVtLiBTZWUgR2l0aHViIGlzc3VlXG4gIC8vICM3MiBhbmQgYnVnemlsLmxhLzg4OTQ5Mi5cbiAgdGhpcy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkobmFtZXMubWFwKFN0cmluZyksIHRydWUpO1xuICB0aGlzLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KHNvdXJjZXMsIHRydWUpO1xuXG4gIHRoaXMuX2Fic29sdXRlU291cmNlcyA9IHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gIH0pO1xuXG4gIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7XG4gIHRoaXMuc291cmNlc0NvbnRlbnQgPSBzb3VyY2VzQ29udGVudDtcbiAgdGhpcy5fbWFwcGluZ3MgPSBtYXBwaW5ncztcbiAgdGhpcy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgdGhpcy5maWxlID0gZmlsZTtcbn1cblxuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB0aGUgaW5kZXggb2YgYSBzb3VyY2UuICBSZXR1cm5zIC0xIGlmIG5vdFxuICogZm91bmQuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kU291cmNlSW5kZXggPSBmdW5jdGlvbihhU291cmNlKSB7XG4gIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgIHJlbGF0aXZlU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhyZWxhdGl2ZVNvdXJjZSkpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlcy5pbmRleE9mKHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIC8vIE1heWJlIGFTb3VyY2UgaXMgYW4gYWJzb2x1dGUgVVJMIGFzIHJldHVybmVkIGJ5IHxzb3VyY2VzfC4gIEluXG4gIC8vIHRoaXMgY2FzZSB3ZSBjYW4ndCBzaW1wbHkgdW5kbyB0aGUgdHJhbnNmb3JtLlxuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2Fic29sdXRlU291cmNlcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0aGlzLl9hYnNvbHV0ZVNvdXJjZXNbaV0gPT0gYVNvdXJjZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGZyb20gYSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKlxuICogQHBhcmFtIFNvdXJjZU1hcEdlbmVyYXRvciBhU291cmNlTWFwXG4gKiAgICAgICAgVGhlIHNvdXJjZSBtYXAgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLlxuICogQHBhcmFtIFN0cmluZyBhU291cmNlTWFwVVJMXG4gKiAgICAgICAgVGhlIFVSTCBhdCB3aGljaCB0aGUgc291cmNlIG1hcCBjYW4gYmUgZm91bmQgKG9wdGlvbmFsKVxuICogQHJldHVybnMgQmFzaWNTb3VyY2VNYXBDb25zdW1lclxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgICB2YXIgc21jID0gT2JqZWN0LmNyZWF0ZShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5cbiAgICB2YXIgbmFtZXMgPSBzbWMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX25hbWVzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgdmFyIHNvdXJjZXMgPSBzbWMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fc291cmNlcy50b0FycmF5KCksIHRydWUpO1xuICAgIHNtYy5zb3VyY2VSb290ID0gYVNvdXJjZU1hcC5fc291cmNlUm9vdDtcbiAgICBzbWMuc291cmNlc0NvbnRlbnQgPSBhU291cmNlTWFwLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KHNtYy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWMuc291cmNlUm9vdCk7XG4gICAgc21jLmZpbGUgPSBhU291cmNlTWFwLl9maWxlO1xuICAgIHNtYy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgICBzbWMuX2Fic29sdXRlU291cmNlcyA9IHNtYy5fc291cmNlcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNtYy5zb3VyY2VSb290LCBzLCBhU291cmNlTWFwVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fic29sdXRlU291cmNlcy5zbGljZSgpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyXG4gKiAgICAgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9vcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIGdlbmVyYXRlZExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgZ2VuZXJhdGVkQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MsXG4gICAgICBcImdlbmVyYXRlZExpbmVcIixcbiAgICAgIFwiZ2VuZXJhdGVkQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdzb3VyY2UnLCBudWxsKTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuYXQoc291cmNlKTtcbiAgICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwodGhpcy5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbmFtZScsIG51bGwpO1xuICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5hdChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbExpbmUnLCBudWxsKSxcbiAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIG5hbWU6IG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlOiBudWxsLFxuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIG5hbWU6IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgdGhlIHNvdXJjZSBjb250ZW50IGZvciBldmVyeSBzb3VyY2UgaW4gdGhlIHNvdXJjZVxuICogbWFwLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnQubGVuZ3RoID49IHRoaXMuX3NvdXJjZXMuc2l6ZSgpICYmXG4gICAgICAhdGhpcy5zb3VyY2VzQ29udGVudC5zb21lKGZ1bmN0aW9uIChzYykgeyByZXR1cm4gc2MgPT0gbnVsbDsgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChhU291cmNlKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbaW5kZXhdO1xuICAgIH1cblxuICAgIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIHVybDtcbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGxcbiAgICAgICAgJiYgKHVybCA9IHV0aWwudXJsUGFyc2UodGhpcy5zb3VyY2VSb290KSkpIHtcbiAgICAgIC8vIFhYWDogZmlsZTovLyBVUklzIGFuZCBhYnNvbHV0ZSBwYXRocyBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZm9yXG4gICAgICAvLyBtYW55IHVzZXJzLiBXZSBjYW4gaGVscCB0aGVtIG91dCB3aGVuIHRoZXkgZXhwZWN0IGZpbGU6Ly8gVVJJcyB0b1xuICAgICAgLy8gYmVoYXZlIGxpa2UgaXQgd291bGQgaWYgdGhleSB3ZXJlIHJ1bm5pbmcgYSBsb2NhbCBIVFRQIHNlcnZlci4gU2VlXG4gICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODU1OTcuXG4gICAgICB2YXIgZmlsZVVyaUFic1BhdGggPSByZWxhdGl2ZVNvdXJjZS5yZXBsYWNlKC9eZmlsZTpcXC9cXC8vLCBcIlwiKTtcbiAgICAgIGlmICh1cmwuc2NoZW1lID09IFwiZmlsZVwiXG4gICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoZmlsZVVyaUFic1BhdGgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihmaWxlVXJpQWJzUGF0aCldXG4gICAgICB9XG5cbiAgICAgIGlmICgoIXVybC5wYXRoIHx8IHVybC5wYXRoID09IFwiL1wiKVxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKFwiL1wiICsgcmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIHJlbGF0aXZlU291cmNlKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHJlY3Vyc2l2ZWx5IGZyb21cbiAgICAvLyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IuIEluIHRoYXQgY2FzZSwgd2VcbiAgICAvLyBkb24ndCB3YW50IHRvIHRocm93IGlmIHdlIGNhbid0IGZpbmQgdGhlIHNvdXJjZSAtIHdlIGp1c3Qgd2FudCB0b1xuICAgIC8vIHJldHVybiBudWxsLCBzbyB3ZSBwcm92aWRlIGEgZmxhZyB0byBleGl0IGdyYWNlZnVsbHkuXG4gICAgaWYgKG51bGxPbk1pc3NpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgcmVsYXRpdmVTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgc291cmNlID0gdGhpcy5fZmluZFNvdXJjZUluZGV4KHNvdXJjZSk7XG4gICAgaWYgKHNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoXG4gICAgICBuZWVkbGUsXG4gICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICB1dGlsLmdldEFyZyhhQXJncywgJ2JpYXMnLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORClcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gbmVlZGxlLnNvdXJjZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgIH07XG4gIH07XG5cbmV4cG9ydHMuQmFzaWNTb3VyY2VNYXBDb25zdW1lciA9IEJhc2ljU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQW4gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaFxuICogd2UgY2FuIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbi4gSXQgZGlmZmVycyBmcm9tIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5cbiAqIHRoYXQgaXQgdGFrZXMgXCJpbmRleGVkXCIgc291cmNlIG1hcHMgKGkuZS4gb25lcyB3aXRoIGEgXCJzZWN0aW9uc1wiIGZpZWxkKSBhc1xuICogaW5wdXQuXG4gKlxuICogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0I2hlYWRpbmc9aC41MzVlczN4ZXByZ3RcbiAqL1xuZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSwgYVNvdXJjZU1hcFVSTClcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICAvLyBGaW5kIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbiB3ZSdyZSB0cnlpbmcgdG8gbWFwXG4gICAgLy8gdG8gYW4gb3JpZ2luYWwgcG9zaXRpb24uXG4gICAgdmFyIHNlY3Rpb25JbmRleCA9IGJpbmFyeVNlYXJjaC5zZWFyY2gobmVlZGxlLCB0aGlzLl9zZWN0aW9ucyxcbiAgICAgIGZ1bmN0aW9uKG5lZWRsZSwgc2VjdGlvbikge1xuICAgICAgICB2YXIgY21wID0gbmVlZGxlLmdlbmVyYXRlZExpbmUgLSBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lO1xuICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgcmV0dXJuIGNtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAobmVlZGxlLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgIH0pO1xuICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcblxuICAgIGlmICghc2VjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIG5hbWU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlY3Rpb24uY29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICBsaW5lOiBuZWVkbGUuZ2VuZXJhdGVkTGluZSAtXG4gICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICBjb2x1bW46IG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmVcbiAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgOiAwKSxcbiAgICAgIGJpYXM6IGFBcmdzLmJpYXNcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWN0aW9ucy5ldmVyeShmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHMuY29uc3VtZXIuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKTtcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIHZhciBjb250ZW50ID0gc2VjdGlvbi5jb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIHRydWUpO1xuICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuIFxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIC8vIE9ubHkgY29uc2lkZXIgdGhpcyBzZWN0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgc291cmNlIGlzIGluIHRoZSBsaXN0IG9mXG4gICAgICAvLyBzb3VyY2VzIG9mIHRoZSBjb25zdW1lci5cbiAgICAgIGlmIChzZWN0aW9uLmNvbnN1bWVyLl9maW5kU291cmNlSW5kZXgodXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSkgPT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGdlbmVyYXRlZFBvc2l0aW9uID0gc2VjdGlvbi5jb25zdW1lci5nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncyk7XG4gICAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb24pIHtcbiAgICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWRQb3NpdGlvbi5jb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IGdlbmVyYXRlZFBvc2l0aW9uLmxpbmVcbiAgICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgICA6IDApXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fcGFyc2VNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuICAgICAgdmFyIHNlY3Rpb25NYXBwaW5ncyA9IHNlY3Rpb24uY29uc3VtZXIuX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWN0aW9uTWFwcGluZ3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSBzZWN0aW9uTWFwcGluZ3Nbal07XG5cbiAgICAgICAgdmFyIHNvdXJjZSA9IHNlY3Rpb24uY29uc3VtZXIuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc2VjdGlvbi5jb25zdW1lci5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgICAgIHZhciBuYW1lID0gbnVsbDtcbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmluYXJ5LXNlYXJjaC5qc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvcXVpY2stc29ydC5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdIHx8ICcnO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGFDaHVuaykge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgdmFyIGNodW5rO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICpcbiAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICB2YXIgbmV3Q2hpbGRyZW47XG4gIHZhciBpO1xuICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgfVxuICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gKlxuICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gIH07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gXCJcIjtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHN0ciArPSBjaHVuaztcbiAgfSk7XG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAqIG1hcC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICBjb2RlOiBcIlwiLFxuICAgIGxpbmU6IDEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG59O1xuXG5leHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW5vZGUuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define([], factory);
	else if(typeof exports === 'object')
		exports["sourceMap"] = factory();
	else
		root["sourceMap"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};

/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {

/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;

/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};

/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;

/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}


/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;

/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;

/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";

/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

	/*
	 * Copyright 2009-2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE.txt or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
	exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;
	exports.SourceNode = __webpack_require__(10).SourceNode;


/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	var base64VLQ = __webpack_require__(2);
	var util = __webpack_require__(4);
	var ArraySet = __webpack_require__(5).ArraySet;
	var MappingList = __webpack_require__(6).MappingList;

	/**
	 * An instance of the SourceMapGenerator represents a source map which is
	 * being built incrementally. You may pass an object with the following
	 * properties:
	 *
	 *   - file: The filename of the generated source.
	 *   - sourceRoot: A root for all relative URLs in this source map.
	 */
	function SourceMapGenerator(aArgs) {
	  if (!aArgs) {
	    aArgs = {};
	  }
	  this._file = util.getArg(aArgs, 'file', null);
	  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
	  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
	  this._sources = new ArraySet();
	  this._names = new ArraySet();
	  this._mappings = new MappingList();
	  this._sourcesContents = null;
	}

	SourceMapGenerator.prototype._version = 3;

	/**
	 * Creates a new SourceMapGenerator based on a SourceMapConsumer
	 *
	 * @param aSourceMapConsumer The SourceMap.
	 */
	SourceMapGenerator.fromSourceMap =
	  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
	    var sourceRoot = aSourceMapConsumer.sourceRoot;
	    var generator = new SourceMapGenerator({
	      file: aSourceMapConsumer.file,
	      sourceRoot: sourceRoot
	    });
	    aSourceMapConsumer.eachMapping(function (mapping) {
	      var newMapping = {
	        generated: {
	          line: mapping.generatedLine,
	          column: mapping.generatedColumn
	        }
	      };

	      if (mapping.source != null) {
	        newMapping.source = mapping.source;
	        if (sourceRoot != null) {
	          newMapping.source = util.relative(sourceRoot, newMapping.source);
	        }

	        newMapping.original = {
	          line: mapping.originalLine,
	          column: mapping.originalColumn
	        };

	        if (mapping.name != null) {
	          newMapping.name = mapping.name;
	        }
	      }

	      generator.addMapping(newMapping);
	    });
	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
	      var sourceRelative = sourceFile;
	      if (sourceRoot !== null) {
	        sourceRelative = util.relative(sourceRoot, sourceFile);
	      }

	      if (!generator._sources.has(sourceRelative)) {
	        generator._sources.add(sourceRelative);
	      }

	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
	      if (content != null) {
	        generator.setSourceContent(sourceFile, content);
	      }
	    });
	    return generator;
	  };

	/**
	 * Add a single mapping from original source line and column to the generated
	 * source's line and column for this source map being created. The mapping
	 * object should have the following properties:
	 *
	 *   - generated: An object with the generated line and column positions.
	 *   - original: An object with the original line and column positions.
	 *   - source: The original source file (relative to the sourceRoot).
	 *   - name: An optional original token name for this mapping.
	 */
	SourceMapGenerator.prototype.addMapping =
	  function SourceMapGenerator_addMapping(aArgs) {
	    var generated = util.getArg(aArgs, 'generated');
	    var original = util.getArg(aArgs, 'original', null);
	    var source = util.getArg(aArgs, 'source', null);
	    var name = util.getArg(aArgs, 'name', null);

	    if (!this._skipValidation) {
	      this._validateMapping(generated, original, source, name);
	    }

	    if (source != null) {
	      source = String(source);
	      if (!this._sources.has(source)) {
	        this._sources.add(source);
	      }
	    }

	    if (name != null) {
	      name = String(name);
	      if (!this._names.has(name)) {
	        this._names.add(name);
	      }
	    }

	    this._mappings.add({
	      generatedLine: generated.line,
	      generatedColumn: generated.column,
	      originalLine: original != null && original.line,
	      originalColumn: original != null && original.column,
	      source: source,
	      name: name
	    });
	  };

	/**
	 * Set the source content for a source file.
	 */
	SourceMapGenerator.prototype.setSourceContent =
	  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
	    var source = aSourceFile;
	    if (this._sourceRoot != null) {
	      source = util.relative(this._sourceRoot, source);
	    }

	    if (aSourceContent != null) {
	      // Add the source content to the _sourcesContents map.
	      // Create a new _sourcesContents map if the property is null.
	      if (!this._sourcesContents) {
	        this._sourcesContents = Object.create(null);
	      }
	      this._sourcesContents[util.toSetString(source)] = aSourceContent;
	    } else if (this._sourcesContents) {
	      // Remove the source file from the _sourcesContents map.
	      // If the _sourcesContents map is empty, set the property to null.
	      delete this._sourcesContents[util.toSetString(source)];
	      if (Object.keys(this._sourcesContents).length === 0) {
	        this._sourcesContents = null;
	      }
	    }
	  };

	/**
	 * Applies the mappings of a sub-source-map for a specific source file to the
	 * source map being generated. Each mapping to the supplied source file is
	 * rewritten using the supplied source map. Note: The resolution for the
	 * resulting mappings is the minimium of this map and the supplied map.
	 *
	 * @param aSourceMapConsumer The source map to be applied.
	 * @param aSourceFile Optional. The filename of the source file.
	 *        If omitted, SourceMapConsumer's file property will be used.
	 * @param aSourceMapPath Optional. The dirname of the path to the source map
	 *        to be applied. If relative, it is relative to the SourceMapConsumer.
	 *        This parameter is needed when the two source maps aren't in the same
	 *        directory, and the source map to be applied contains relative source
	 *        paths. If so, those relative source paths need to be rewritten
	 *        relative to the SourceMapGenerator.
	 */
	SourceMapGenerator.prototype.applySourceMap =
	  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
	    var sourceFile = aSourceFile;
	    // If aSourceFile is omitted, we will use the file property of the SourceMap
	    if (aSourceFile == null) {
	      if (aSourceMapConsumer.file == null) {
	        throw new Error(
	          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
	          'or the source map\'s "file" property. Both were omitted.'
	        );
	      }
	      sourceFile = aSourceMapConsumer.file;
	    }
	    var sourceRoot = this._sourceRoot;
	    // Make "sourceFile" relative if an absolute Url is passed.
	    if (sourceRoot != null) {
	      sourceFile = util.relative(sourceRoot, sourceFile);
	    }
	    // Applying the SourceMap can add and remove items from the sources and
	    // the names array.
	    var newSources = new ArraySet();
	    var newNames = new ArraySet();

	    // Find mappings for the "sourceFile"
	    this._mappings.unsortedForEach(function (mapping) {
	      if (mapping.source === sourceFile && mapping.originalLine != null) {
	        // Check if it can be mapped by the source map, then update the mapping.
	        var original = aSourceMapConsumer.originalPositionFor({
	          line: mapping.originalLine,
	          column: mapping.originalColumn
	        });
	        if (original.source != null) {
	          // Copy mapping
	          mapping.source = original.source;
	          if (aSourceMapPath != null) {
	            mapping.source = util.join(aSourceMapPath, mapping.source)
	          }
	          if (sourceRoot != null) {
	            mapping.source = util.relative(sourceRoot, mapping.source);
	          }
	          mapping.originalLine = original.line;
	          mapping.originalColumn = original.column;
	          if (original.name != null) {
	            mapping.name = original.name;
	          }
	        }
	      }

	      var source = mapping.source;
	      if (source != null && !newSources.has(source)) {
	        newSources.add(source);
	      }

	      var name = mapping.name;
	      if (name != null && !newNames.has(name)) {
	        newNames.add(name);
	      }

	    }, this);
	    this._sources = newSources;
	    this._names = newNames;

	    // Copy sourcesContents of applied map.
	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
	      if (content != null) {
	        if (aSourceMapPath != null) {
	          sourceFile = util.join(aSourceMapPath, sourceFile);
	        }
	        if (sourceRoot != null) {
	          sourceFile = util.relative(sourceRoot, sourceFile);
	        }
	        this.setSourceContent(sourceFile, content);
	      }
	    }, this);
	  };

	/**
	 * A mapping can have one of the three levels of data:
	 *
	 *   1. Just the generated position.
	 *   2. The Generated position, original position, and original source.
	 *   3. Generated and original position, original source, as well as a name
	 *      token.
	 *
	 * To maintain consistency, we validate that any new mapping being added falls
	 * in to one of these categories.
	 */
	SourceMapGenerator.prototype._validateMapping =
	  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
	                                              aName) {
	    // When aOriginal is truthy but has empty values for .line and .column,
	    // it is most likely a programmer error. In this case we throw a very
	    // specific error message to try to guide them the right way.
	    // For example: https://github.com/Polymer/polymer-bundler/pull/519
	    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
	        throw new Error(
	            'original.line and original.column are not numbers -- you probably meant to omit ' +
	            'the original mapping entirely and only map the generated position. If so, pass ' +
	            'null for the original mapping instead of an object with empty or null values.'
	        );
	    }

	    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
	        && aGenerated.line > 0 && aGenerated.column >= 0
	        && !aOriginal && !aSource && !aName) {
	      // Case 1.
	      return;
	    }
	    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
	             && aOriginal && 'line' in aOriginal && 'column' in aOriginal
	             && aGenerated.line > 0 && aGenerated.column >= 0
	             && aOriginal.line > 0 && aOriginal.column >= 0
	             && aSource) {
	      // Cases 2 and 3.
	      return;
	    }
	    else {
	      throw new Error('Invalid mapping: ' + JSON.stringify({
	        generated: aGenerated,
	        source: aSource,
	        original: aOriginal,
	        name: aName
	      }));
	    }
	  };

	/**
	 * Serialize the accumulated mappings in to the stream of base 64 VLQs
	 * specified by the source map format.
	 */
	SourceMapGenerator.prototype._serializeMappings =
	  function SourceMapGenerator_serializeMappings() {
	    var previousGeneratedColumn = 0;
	    var previousGeneratedLine = 1;
	    var previousOriginalColumn = 0;
	    var previousOriginalLine = 0;
	    var previousName = 0;
	    var previousSource = 0;
	    var result = '';
	    var next;
	    var mapping;
	    var nameIdx;
	    var sourceIdx;

	    var mappings = this._mappings.toArray();
	    for (var i = 0, len = mappings.length; i < len; i++) {
	      mapping = mappings[i];
	      next = ''

	      if (mapping.generatedLine !== previousGeneratedLine) {
	        previousGeneratedColumn = 0;
	        while (mapping.generatedLine !== previousGeneratedLine) {
	          next += ';';
	          previousGeneratedLine++;
	        }
	      }
	      else {
	        if (i > 0) {
	          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
	            continue;
	          }
	          next += ',';
	        }
	      }

	      next += base64VLQ.encode(mapping.generatedColumn
	                                 - previousGeneratedColumn);
	      previousGeneratedColumn = mapping.generatedColumn;

	      if (mapping.source != null) {
	        sourceIdx = this._sources.indexOf(mapping.source);
	        next += base64VLQ.encode(sourceIdx - previousSource);
	        previousSource = sourceIdx;

	        // lines are stored 0-based in SourceMap spec version 3
	        next += base64VLQ.encode(mapping.originalLine - 1
	                                   - previousOriginalLine);
	        previousOriginalLine = mapping.originalLine - 1;

	        next += base64VLQ.encode(mapping.originalColumn
	                                   - previousOriginalColumn);
	        previousOriginalColumn = mapping.originalColumn;

	        if (mapping.name != null) {
	          nameIdx = this._names.indexOf(mapping.name);
	          next += base64VLQ.encode(nameIdx - previousName);
	          previousName = nameIdx;
	        }
	      }

	      result += next;
	    }

	    return result;
	  };

	SourceMapGenerator.prototype._generateSourcesContent =
	  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
	    return aSources.map(function (source) {
	      if (!this._sourcesContents) {
	        return null;
	      }
	      if (aSourceRoot != null) {
	        source = util.relative(aSourceRoot, source);
	      }
	      var key = util.toSetString(source);
	      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
	        ? this._sourcesContents[key]
	        : null;
	    }, this);
	  };

	/**
	 * Externalize the source map.
	 */
	SourceMapGenerator.prototype.toJSON =
	  function SourceMapGenerator_toJSON() {
	    var map = {
	      version: this._version,
	      sources: this._sources.toArray(),
	      names: this._names.toArray(),
	      mappings: this._serializeMappings()
	    };
	    if (this._file != null) {
	      map.file = this._file;
	    }
	    if (this._sourceRoot != null) {
	      map.sourceRoot = this._sourceRoot;
	    }
	    if (this._sourcesContents) {
	      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
	    }

	    return map;
	  };

	/**
	 * Render the source map being generated to a string.
	 */
	SourceMapGenerator.prototype.toString =
	  function SourceMapGenerator_toString() {
	    return JSON.stringify(this.toJSON());
	  };

	exports.SourceMapGenerator = SourceMapGenerator;


/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 *
	 * Based on the Base 64 VLQ implementation in Closure Compiler:
	 * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
	 *
	 * Copyright 2011 The Closure Compiler Authors. All rights reserved.
	 * Redistribution and use in source and binary forms, with or without
	 * modification, are permitted provided that the following conditions are
	 * met:
	 *
	 *  * Redistributions of source code must retain the above copyright
	 *    notice, this list of conditions and the following disclaimer.
	 *  * Redistributions in binary form must reproduce the above
	 *    copyright notice, this list of conditions and the following
	 *    disclaimer in the documentation and/or other materials provided
	 *    with the distribution.
	 *  * Neither the name of Google Inc. nor the names of its
	 *    contributors may be used to endorse or promote products derived
	 *    from this software without specific prior written permission.
	 *
	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
	 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
	 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
	 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
	 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
	 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
	 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
	 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
	 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
	 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
	 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
	 */

	var base64 = __webpack_require__(3);

	// A single base 64 digit can contain 6 bits of data. For the base 64 variable
	// length quantities we use in the source map spec, the first bit is the sign,
	// the next four bits are the actual value, and the 6th bit is the
	// continuation bit. The continuation bit tells us whether there are more
	// digits in this value following this digit.
	//
	//   Continuation
	//   |    Sign
	//   |    |
	//   V    V
	//   101011

	var VLQ_BASE_SHIFT = 5;

	// binary: 100000
	var VLQ_BASE = 1 << VLQ_BASE_SHIFT;

	// binary: 011111
	var VLQ_BASE_MASK = VLQ_BASE - 1;

	// binary: 100000
	var VLQ_CONTINUATION_BIT = VLQ_BASE;

	/**
	 * Converts from a two-complement value to a value where the sign bit is
	 * placed in the least significant bit.  For example, as decimals:
	 *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
	 *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
	 */
	function toVLQSigned(aValue) {
	  return aValue < 0
	    ? ((-aValue) << 1) + 1
	    : (aValue << 1) + 0;
	}

	/**
	 * Converts to a two-complement value from a value where the sign bit is
	 * placed in the least significant bit.  For example, as decimals:
	 *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1
	 *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2
	 */
	function fromVLQSigned(aValue) {
	  var isNegative = (aValue & 1) === 1;
	  var shifted = aValue >> 1;
	  return isNegative
	    ? -shifted
	    : shifted;
	}

	/**
	 * Returns the base 64 VLQ encoded value.
	 */
	exports.encode = function base64VLQ_encode(aValue) {
	  var encoded = "";
	  var digit;

	  var vlq = toVLQSigned(aValue);

	  do {
	    digit = vlq & VLQ_BASE_MASK;
	    vlq >>>= VLQ_BASE_SHIFT;
	    if (vlq > 0) {
	      // There are still more digits in this value, so we must make sure the
	      // continuation bit is marked.
	      digit |= VLQ_CONTINUATION_BIT;
	    }
	    encoded += base64.encode(digit);
	  } while (vlq > 0);

	  return encoded;
	};

	/**
	 * Decodes the next base 64 VLQ value from the given string and returns the
	 * value and the rest of the string via the out parameter.
	 */
	exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
	  var strLen = aStr.length;
	  var result = 0;
	  var shift = 0;
	  var continuation, digit;

	  do {
	    if (aIndex >= strLen) {
	      throw new Error("Expected more digits in base 64 VLQ value.");
	    }

	    digit = base64.decode(aStr.charCodeAt(aIndex++));
	    if (digit === -1) {
	      throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
	    }

	    continuation = !!(digit & VLQ_CONTINUATION_BIT);
	    digit &= VLQ_BASE_MASK;
	    result = result + (digit << shift);
	    shift += VLQ_BASE_SHIFT;
	  } while (continuation);

	  aOutParam.value = fromVLQSigned(result);
	  aOutParam.rest = aIndex;
	};


/***/ }),
/* 3 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');

	/**
	 * Encode an integer in the range of 0 to 63 to a single base 64 digit.
	 */
	exports.encode = function (number) {
	  if (0 <= number && number < intToCharMap.length) {
	    return intToCharMap[number];
	  }
	  throw new TypeError("Must be between 0 and 63: " + number);
	};

	/**
	 * Decode a single base 64 character code digit to an integer. Returns -1 on
	 * failure.
	 */
	exports.decode = function (charCode) {
	  var bigA = 65;     // 'A'
	  var bigZ = 90;     // 'Z'

	  var littleA = 97;  // 'a'
	  var littleZ = 122; // 'z'

	  var zero = 48;     // '0'
	  var nine = 57;     // '9'

	  var plus = 43;     // '+'
	  var slash = 47;    // '/'

	  var littleOffset = 26;
	  var numberOffset = 52;

	  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
	  if (bigA <= charCode && charCode <= bigZ) {
	    return (charCode - bigA);
	  }

	  // 26 - 51: abcdefghijklmnopqrstuvwxyz
	  if (littleA <= charCode && charCode <= littleZ) {
	    return (charCode - littleA + littleOffset);
	  }

	  // 52 - 61: 0123456789
	  if (zero <= charCode && charCode <= nine) {
	    return (charCode - zero + numberOffset);
	  }

	  // 62: +
	  if (charCode == plus) {
	    return 62;
	  }

	  // 63: /
	  if (charCode == slash) {
	    return 63;
	  }

	  // Invalid base64 digit.
	  return -1;
	};


/***/ }),
/* 4 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	/**
	 * This is a helper function for getting values from parameter/options
	 * objects.
	 *
	 * @param args The object we are extracting values from
	 * @param name The name of the property we are getting.
	 * @param defaultValue An optional value to return if the property is missing
	 * from the object. If this is not specified and the property is missing, an
	 * error will be thrown.
	 */
	function getArg(aArgs, aName, aDefaultValue) {
	  if (aName in aArgs) {
	    return aArgs[aName];
	  } else if (arguments.length === 3) {
	    return aDefaultValue;
	  } else {
	    throw new Error('"' + aName + '" is a required argument.');
	  }
	}
	exports.getArg = getArg;

	var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
	var dataUrlRegexp = /^data:.+\,.+$/;

	function urlParse(aUrl) {
	  var match = aUrl.match(urlRegexp);
	  if (!match) {
	    return null;
	  }
	  return {
	    scheme: match[1],
	    auth: match[2],
	    host: match[3],
	    port: match[4],
	    path: match[5]
	  };
	}
	exports.urlParse = urlParse;

	function urlGenerate(aParsedUrl) {
	  var url = '';
	  if (aParsedUrl.scheme) {
	    url += aParsedUrl.scheme + ':';
	  }
	  url += '//';
	  if (aParsedUrl.auth) {
	    url += aParsedUrl.auth + '@';
	  }
	  if (aParsedUrl.host) {
	    url += aParsedUrl.host;
	  }
	  if (aParsedUrl.port) {
	    url += ":" + aParsedUrl.port
	  }
	  if (aParsedUrl.path) {
	    url += aParsedUrl.path;
	  }
	  return url;
	}
	exports.urlGenerate = urlGenerate;

	/**
	 * Normalizes a path, or the path portion of a URL:
	 *
	 * - Replaces consecutive slashes with one slash.
	 * - Removes unnecessary '.' parts.
	 * - Removes unnecessary '<dir>/..' parts.
	 *
	 * Based on code in the Node.js 'path' core module.
	 *
	 * @param aPath The path or url to normalize.
	 */
	function normalize(aPath) {
	  var path = aPath;
	  var url = urlParse(aPath);
	  if (url) {
	    if (!url.path) {
	      return aPath;
	    }
	    path = url.path;
	  }
	  var isAbsolute = exports.isAbsolute(path);

	  var parts = path.split(/\/+/);
	  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
	    part = parts[i];
	    if (part === '.') {
	      parts.splice(i, 1);
	    } else if (part === '..') {
	      up++;
	    } else if (up > 0) {
	      if (part === '') {
	        // The first part is blank if the path is absolute. Trying to go
	        // above the root is a no-op. Therefore we can remove all '..' parts
	        // directly after the root.
	        parts.splice(i + 1, up);
	        up = 0;
	      } else {
	        parts.splice(i, 2);
	        up--;
	      }
	    }
	  }
	  path = parts.join('/');

	  if (path === '') {
	    path = isAbsolute ? '/' : '.';
	  }

	  if (url) {
	    url.path = path;
	    return urlGenerate(url);
	  }
	  return path;
	}
	exports.normalize = normalize;

	/**
	 * Joins two paths/URLs.
	 *
	 * @param aRoot The root path or URL.
	 * @param aPath The path or URL to be joined with the root.
	 *
	 * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
	 *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended
	 *   first.
	 * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
	 *   is updated with the result and aRoot is returned. Otherwise the result
	 *   is returned.
	 *   - If aPath is absolute, the result is aPath.
	 *   - Otherwise the two paths are joined with a slash.
	 * - Joining for example 'http://' and 'www.example.com' is also supported.
	 */
	function join(aRoot, aPath) {
	  if (aRoot === "") {
	    aRoot = ".";
	  }
	  if (aPath === "") {
	    aPath = ".";
	  }
	  var aPathUrl = urlParse(aPath);
	  var aRootUrl = urlParse(aRoot);
	  if (aRootUrl) {
	    aRoot = aRootUrl.path || '/';
	  }

	  // `join(foo, '//www.example.org')`
	  if (aPathUrl && !aPathUrl.scheme) {
	    if (aRootUrl) {
	      aPathUrl.scheme = aRootUrl.scheme;
	    }
	    return urlGenerate(aPathUrl);
	  }

	  if (aPathUrl || aPath.match(dataUrlRegexp)) {
	    return aPath;
	  }

	  // `join('http://', 'www.example.com')`
	  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
	    aRootUrl.host = aPath;
	    return urlGenerate(aRootUrl);
	  }

	  var joined = aPath.charAt(0) === '/'
	    ? aPath
	    : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);

	  if (aRootUrl) {
	    aRootUrl.path = joined;
	    return urlGenerate(aRootUrl);
	  }
	  return joined;
	}
	exports.join = join;

	exports.isAbsolute = function (aPath) {
	  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
	};

	/**
	 * Make a path relative to a URL or another path.
	 *
	 * @param aRoot The root path or URL.
	 * @param aPath The path or URL to be made relative to aRoot.
	 */
	function relative(aRoot, aPath) {
	  if (aRoot === "") {
	    aRoot = ".";
	  }

	  aRoot = aRoot.replace(/\/$/, '');

	  // It is possible for the path to be above the root. In this case, simply
	  // checking whether the root is a prefix of the path won't work. Instead, we
	  // need to remove components from the root one by one, until either we find
	  // a prefix that fits, or we run out of components to remove.
	  var level = 0;
	  while (aPath.indexOf(aRoot + '/') !== 0) {
	    var index = aRoot.lastIndexOf("/");
	    if (index < 0) {
	      return aPath;
	    }

	    // If the only part of the root that is left is the scheme (i.e. http://,
	    // file:///, etc.), one or more slashes (/), or simply nothing at all, we
	    // have exhausted all components, so the path is not relative to the root.
	    aRoot = aRoot.slice(0, index);
	    if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
	      return aPath;
	    }

	    ++level;
	  }

	  // Make sure we add a "../" for each component we removed from the root.
	  return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
	}
	exports.relative = relative;

	var supportsNullProto = (function () {
	  var obj = Object.create(null);
	  return !('__proto__' in obj);
	}());

	function identity (s) {
	  return s;
	}

	/**
	 * Because behavior goes wacky when you set `__proto__` on objects, we
	 * have to prefix all the strings in our set with an arbitrary character.
	 *
	 * See https://github.com/mozilla/source-map/pull/31 and
	 * https://github.com/mozilla/source-map/issues/30
	 *
	 * @param String aStr
	 */
	function toSetString(aStr) {
	  if (isProtoString(aStr)) {
	    return '$' + aStr;
	  }

	  return aStr;
	}
	exports.toSetString = supportsNullProto ? identity : toSetString;

	function fromSetString(aStr) {
	  if (isProtoString(aStr)) {
	    return aStr.slice(1);
	  }

	  return aStr;
	}
	exports.fromSetString = supportsNullProto ? identity : fromSetString;

	function isProtoString(s) {
	  if (!s) {
	    return false;
	  }

	  var length = s.length;

	  if (length < 9 /* "__proto__".length */) {
	    return false;
	  }

	  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||
	      s.charCodeAt(length - 2) !== 95  /* '_' */ ||
	      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
	      s.charCodeAt(length - 4) !== 116 /* 't' */ ||
	      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
	      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
	      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
	      s.charCodeAt(length - 8) !== 95  /* '_' */ ||
	      s.charCodeAt(length - 9) !== 95  /* '_' */) {
	    return false;
	  }

	  for (var i = length - 10; i >= 0; i--) {
	    if (s.charCodeAt(i) !== 36 /* '$' */) {
	      return false;
	    }
	  }

	  return true;
	}

	/**
	 * Comparator between two mappings where the original positions are compared.
	 *
	 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
	 * mappings with the same original source/line/column, but different generated
	 * line and column the same. Useful when searching for a mapping with a
	 * stubbed out mapping.
	 */
	function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
	  var cmp = strcmp(mappingA.source, mappingB.source);
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.originalLine - mappingB.originalLine;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.originalColumn - mappingB.originalColumn;
	  if (cmp !== 0 || onlyCompareOriginal) {
	    return cmp;
	  }

	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.generatedLine - mappingB.generatedLine;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  return strcmp(mappingA.name, mappingB.name);
	}
	exports.compareByOriginalPositions = compareByOriginalPositions;

	/**
	 * Comparator between two mappings with deflated source and name indices where
	 * the generated positions are compared.
	 *
	 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
	 * mappings with the same generated line and column, but different
	 * source/name/original line and column the same. Useful when searching for a
	 * mapping with a stubbed out mapping.
	 */
	function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
	  var cmp = mappingA.generatedLine - mappingB.generatedLine;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
	  if (cmp !== 0 || onlyCompareGenerated) {
	    return cmp;
	  }

	  cmp = strcmp(mappingA.source, mappingB.source);
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.originalLine - mappingB.originalLine;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.originalColumn - mappingB.originalColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  return strcmp(mappingA.name, mappingB.name);
	}
	exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;

	function strcmp(aStr1, aStr2) {
	  if (aStr1 === aStr2) {
	    return 0;
	  }

	  if (aStr1 === null) {
	    return 1; // aStr2 !== null
	  }

	  if (aStr2 === null) {
	    return -1; // aStr1 !== null
	  }

	  if (aStr1 > aStr2) {
	    return 1;
	  }

	  return -1;
	}

	/**
	 * Comparator between two mappings with inflated source and name strings where
	 * the generated positions are compared.
	 */
	function compareByGeneratedPositionsInflated(mappingA, mappingB) {
	  var cmp = mappingA.generatedLine - mappingB.generatedLine;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = strcmp(mappingA.source, mappingB.source);
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.originalLine - mappingB.originalLine;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.originalColumn - mappingB.originalColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  return strcmp(mappingA.name, mappingB.name);
	}
	exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;

	/**
	 * Strip any JSON XSSI avoidance prefix from the string (as documented
	 * in the source maps specification), and then parse the string as
	 * JSON.
	 */
	function parseSourceMapInput(str) {
	  return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
	}
	exports.parseSourceMapInput = parseSourceMapInput;

	/**
	 * Compute the URL of a source given the the source root, the source's
	 * URL, and the source map's URL.
	 */
	function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
	  sourceURL = sourceURL || '';

	  if (sourceRoot) {
	    // This follows what Chrome does.
	    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
	      sourceRoot += '/';
	    }
	    // The spec says:
	    //   Line 4: An optional source root, useful for relocating source
	    //   files on a server or removing repeated values in the
	    //   â€œsourcesâ€� entry.  This value is prepended to the individual
	    //   entries in the â€œsourceâ€� field.
	    sourceURL = sourceRoot + sourceURL;
	  }

	  // Historically, SourceMapConsumer did not take the sourceMapURL as
	  // a parameter.  This mode is still somewhat supported, which is why
	  // this code block is conditional.  However, it's preferable to pass
	  // the source map URL to SourceMapConsumer, so that this function
	  // can implement the source URL resolution algorithm as outlined in
	  // the spec.  This block is basically the equivalent of:
	  //    new URL(sourceURL, sourceMapURL).toString()
	  // ... except it avoids using URL, which wasn't available in the
	  // older releases of node still supported by this library.
	  //
	  // The spec says:
	  //   If the sources are not absolute URLs after prepending of the
	  //   â€œsourceRootâ€�, the sources are resolved relative to the
	  //   SourceMap (like resolving script src in a html document).
	  if (sourceMapURL) {
	    var parsed = urlParse(sourceMapURL);
	    if (!parsed) {
	      throw new Error("sourceMapURL could not be parsed");
	    }
	    if (parsed.path) {
	      // Strip the last path component, but keep the "/".
	      var index = parsed.path.lastIndexOf('/');
	      if (index >= 0) {
	        parsed.path = parsed.path.substring(0, index + 1);
	      }
	    }
	    sourceURL = join(urlGenerate(parsed), sourceURL);
	  }

	  return normalize(sourceURL);
	}
	exports.computeSourceURL = computeSourceURL;


/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	var util = __webpack_require__(4);
	var has = Object.prototype.hasOwnProperty;
	var hasNativeMap = typeof Map !== "undefined";

	/**
	 * A data structure which is a combination of an array and a set. Adding a new
	 * member is O(1), testing for membership is O(1), and finding the index of an
	 * element is O(1). Removing elements from the set is not supported. Only
	 * strings are supported for membership.
	 */
	function ArraySet() {
	  this._array = [];
	  this._set = hasNativeMap ? new Map() : Object.create(null);
	}

	/**
	 * Static method for creating ArraySet instances from an existing array.
	 */
	ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
	  var set = new ArraySet();
	  for (var i = 0, len = aArray.length; i < len; i++) {
	    set.add(aArray[i], aAllowDuplicates);
	  }
	  return set;
	};

	/**
	 * Return how many unique items are in this ArraySet. If duplicates have been
	 * added, than those do not count towards the size.
	 *
	 * @returns Number
	 */
	ArraySet.prototype.size = function ArraySet_size() {
	  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
	};

	/**
	 * Add the given string to this set.
	 *
	 * @param String aStr
	 */
	ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
	  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
	  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
	  var idx = this._array.length;
	  if (!isDuplicate || aAllowDuplicates) {
	    this._array.push(aStr);
	  }
	  if (!isDuplicate) {
	    if (hasNativeMap) {
	      this._set.set(aStr, idx);
	    } else {
	      this._set[sStr] = idx;
	    }
	  }
	};

	/**
	 * Is the given string a member of this set?
	 *
	 * @param String aStr
	 */
	ArraySet.prototype.has = function ArraySet_has(aStr) {
	  if (hasNativeMap) {
	    return this._set.has(aStr);
	  } else {
	    var sStr = util.toSetString(aStr);
	    return has.call(this._set, sStr);
	  }
	};

	/**
	 * What is the index of the given string in the array?
	 *
	 * @param String aStr
	 */
	ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
	  if (hasNativeMap) {
	    var idx = this._set.get(aStr);
	    if (idx >= 0) {
	        return idx;
	    }
	  } else {
	    var sStr = util.toSetString(aStr);
	    if (has.call(this._set, sStr)) {
	      return this._set[sStr];
	    }
	  }

	  throw new Error('"' + aStr + '" is not in the set.');
	};

	/**
	 * What is the element at the given index?
	 *
	 * @param Number aIdx
	 */
	ArraySet.prototype.at = function ArraySet_at(aIdx) {
	  if (aIdx >= 0 && aIdx < this._array.length) {
	    return this._array[aIdx];
	  }
	  throw new Error('No element indexed by ' + aIdx);
	};

	/**
	 * Returns the array representation of this set (which has the proper indices
	 * indicated by indexOf). Note that this is a copy of the internal array used
	 * for storing the members so that no one can mess with internal state.
	 */
	ArraySet.prototype.toArray = function ArraySet_toArray() {
	  return this._array.slice();
	};

	exports.ArraySet = ArraySet;


/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2014 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	var util = __webpack_require__(4);

	/**
	 * Determine whether mappingB is after mappingA with respect to generated
	 * position.
	 */
	function generatedPositionAfter(mappingA, mappingB) {
	  // Optimized for most common case
	  var lineA = mappingA.generatedLine;
	  var lineB = mappingB.generatedLine;
	  var columnA = mappingA.generatedColumn;
	  var columnB = mappingB.generatedColumn;
	  return lineB > lineA || lineB == lineA && columnB >= columnA ||
	         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
	}

	/**
	 * A data structure to provide a sorted view of accumulated mappings in a
	 * performance conscious manner. It trades a neglibable overhead in general
	 * case for a large speedup in case of mappings being added in order.
	 */
	function MappingList() {
	  this._array = [];
	  this._sorted = true;
	  // Serves as infimum
	  this._last = {generatedLine: -1, generatedColumn: 0};
	}

	/**
	 * Iterate through internal items. This method takes the same arguments that
	 * `Array.prototype.forEach` takes.
	 *
	 * NOTE: The order of the mappings is NOT guaranteed.
	 */
	MappingList.prototype.unsortedForEach =
	  function MappingList_forEach(aCallback, aThisArg) {
	    this._array.forEach(aCallback, aThisArg);
	  };

	/**
	 * Add the given source mapping.
	 *
	 * @param Object aMapping
	 */
	MappingList.prototype.add = function MappingList_add(aMapping) {
	  if (generatedPositionAfter(this._last, aMapping)) {
	    this._last = aMapping;
	    this._array.push(aMapping);
	  } else {
	    this._sorted = false;
	    this._array.push(aMapping);
	  }
	};

	/**
	 * Returns the flat, sorted array of mappings. The mappings are sorted by
	 * generated position.
	 *
	 * WARNING: This method returns internal data without copying, for
	 * performance. The return value must NOT be mutated, and should be treated as
	 * an immutable borrow. If you want to take ownership, you must make your own
	 * copy.
	 */
	MappingList.prototype.toArray = function MappingList_toArray() {
	  if (!this._sorted) {
	    this._array.sort(util.compareByGeneratedPositionsInflated);
	    this._sorted = true;
	  }
	  return this._array;
	};

	exports.MappingList = MappingList;


/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	var util = __webpack_require__(4);
	var binarySearch = __webpack_require__(8);
	var ArraySet = __webpack_require__(5).ArraySet;
	var base64VLQ = __webpack_require__(2);
	var quickSort = __webpack_require__(9).quickSort;

	function SourceMapConsumer(aSourceMap, aSourceMapURL) {
	  var sourceMap = aSourceMap;
	  if (typeof aSourceMap === 'string') {
	    sourceMap = util.parseSourceMapInput(aSourceMap);
	  }

	  return sourceMap.sections != null
	    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
	    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
	}

	SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
	  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
	}

	/**
	 * The version of the source mapping spec that we are consuming.
	 */
	SourceMapConsumer.prototype._version = 3;

	// `__generatedMappings` and `__originalMappings` are arrays that hold the
	// parsed mapping coordinates from the source map's "mappings" attribute. They
	// are lazily instantiated, accessed via the `_generatedMappings` and
	// `_originalMappings` getters respectively, and we only parse the mappings
	// and create these arrays once queried for a source location. We jump through
	// these hoops because there can be many thousands of mappings, and parsing
	// them is expensive, so we only want to do it if we must.
	//
	// Each object in the arrays is of the form:
	//
	//     {
	//       generatedLine: The line number in the generated code,
	//       generatedColumn: The column number in the generated code,
	//       source: The path to the original source file that generated this
	//               chunk of code,
	//       originalLine: The line number in the original source that
	//                     corresponds to this chunk of generated code,
	//       originalColumn: The column number in the original source that
	//                       corresponds to this chunk of generated code,
	//       name: The name of the original symbol which generated this chunk of
	//             code.
	//     }
	//
	// All properties except for `generatedLine` and `generatedColumn` can be
	// `null`.
	//
	// `_generatedMappings` is ordered by the generated positions.
	//
	// `_originalMappings` is ordered by the original positions.

	SourceMapConsumer.prototype.__generatedMappings = null;
	Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
	  configurable: true,
	  enumerable: true,
	  get: function () {
	    if (!this.__generatedMappings) {
	      this._parseMappings(this._mappings, this.sourceRoot);
	    }

	    return this.__generatedMappings;
	  }
	});

	SourceMapConsumer.prototype.__originalMappings = null;
	Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
	  configurable: true,
	  enumerable: true,
	  get: function () {
	    if (!this.__originalMappings) {
	      this._parseMappings(this._mappings, this.sourceRoot);
	    }

	    return this.__originalMappings;
	  }
	});

	SourceMapConsumer.prototype._charIsMappingSeparator =
	  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
	    var c = aStr.charAt(index);
	    return c === ";" || c === ",";
	  };

	/**
	 * Parse the mappings in a string in to a data structure which we can easily
	 * query (the ordered arrays in the `this.__generatedMappings` and
	 * `this.__originalMappings` properties).
	 */
	SourceMapConsumer.prototype._parseMappings =
	  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
	    throw new Error("Subclasses must implement _parseMappings");
	  };

	SourceMapConsumer.GENERATED_ORDER = 1;
	SourceMapConsumer.ORIGINAL_ORDER = 2;

	SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
	SourceMapConsumer.LEAST_UPPER_BOUND = 2;

	/**
	 * Iterate over each mapping between an original source/line/column and a
	 * generated line/column in this source map.
	 *
	 * @param Function aCallback
	 *        The function that is called with each mapping.
	 * @param Object aContext
	 *        Optional. If specified, this object will be the value of `this` every
	 *        time that `aCallback` is called.
	 * @param aOrder
	 *        Either `SourceMapConsumer.GENERATED_ORDER` or
	 *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
	 *        iterate over the mappings sorted by the generated file's line/column
	 *        order or the original's source/line/column order, respectively. Defaults to
	 *        `SourceMapConsumer.GENERATED_ORDER`.
	 */
	SourceMapConsumer.prototype.eachMapping =
	  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
	    var context = aContext || null;
	    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;

	    var mappings;
	    switch (order) {
	    case SourceMapConsumer.GENERATED_ORDER:
	      mappings = this._generatedMappings;
	      break;
	    case SourceMapConsumer.ORIGINAL_ORDER:
	      mappings = this._originalMappings;
	      break;
	    default:
	      throw new Error("Unknown order of iteration.");
	    }

	    var sourceRoot = this.sourceRoot;
	    mappings.map(function (mapping) {
	      var source = mapping.source === null ? null : this._sources.at(mapping.source);
	      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
	      return {
	        source: source,
	        generatedLine: mapping.generatedLine,
	        generatedColumn: mapping.generatedColumn,
	        originalLine: mapping.originalLine,
	        originalColumn: mapping.originalColumn,
	        name: mapping.name === null ? null : this._names.at(mapping.name)
	      };
	    }, this).forEach(aCallback, context);
	  };

	/**
	 * Returns all generated line and column information for the original source,
	 * line, and column provided. If no column is provided, returns all mappings
	 * corresponding to a either the line we are searching for or the next
	 * closest line that has any mappings. Otherwise, returns all mappings
	 * corresponding to the given line and either the column we are searching for
	 * or the next closest column that has any offsets.
	 *
	 * The only argument is an object with the following properties:
	 *
	 *   - source: The filename of the original source.
	 *   - line: The line number in the original source.  The line number is 1-based.
	 *   - column: Optional. the column number in the original source.
	 *    The column number is 0-based.
	 *
	 * and an array of objects is returned, each with the following properties:
	 *
	 *   - line: The line number in the generated source, or null.  The
	 *    line number is 1-based.
	 *   - column: The column number in the generated source, or null.
	 *    The column number is 0-based.
	 */
	SourceMapConsumer.prototype.allGeneratedPositionsFor =
	  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
	    var line = util.getArg(aArgs, 'line');

	    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
	    // returns the index of the closest mapping less than the needle. By
	    // setting needle.originalColumn to 0, we thus find the last mapping for
	    // the given line, provided such a mapping exists.
	    var needle = {
	      source: util.getArg(aArgs, 'source'),
	      originalLine: line,
	      originalColumn: util.getArg(aArgs, 'column', 0)
	    };

	    needle.source = this._findSourceIndex(needle.source);
	    if (needle.source < 0) {
	      return [];
	    }

	    var mappings = [];

	    var index = this._findMapping(needle,
	                                  this._originalMappings,
	                                  "originalLine",
	                                  "originalColumn",
	                                  util.compareByOriginalPositions,
	                                  binarySearch.LEAST_UPPER_BOUND);
	    if (index >= 0) {
	      var mapping = this._originalMappings[index];

	      if (aArgs.column === undefined) {
	        var originalLine = mapping.originalLine;

	        // Iterate until either we run out of mappings, or we run into
	        // a mapping for a different line than the one we found. Since
	        // mappings are sorted, this is guaranteed to find all mappings for
	        // the line we found.
	        while (mapping && mapping.originalLine === originalLine) {
	          mappings.push({
	            line: util.getArg(mapping, 'generatedLine', null),
	            column: util.getArg(mapping, 'generatedColumn', null),
	            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
	          });

	          mapping = this._originalMappings[++index];
	        }
	      } else {
	        var originalColumn = mapping.originalColumn;

	        // Iterate until either we run out of mappings, or we run into
	        // a mapping for a different line than the one we were searching for.
	        // Since mappings are sorted, this is guaranteed to find all mappings for
	        // the line we are searching for.
	        while (mapping &&
	               mapping.originalLine === line &&
	               mapping.originalColumn == originalColumn) {
	          mappings.push({
	            line: util.getArg(mapping, 'generatedLine', null),
	            column: util.getArg(mapping, 'generatedColumn', null),
	            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
	          });

	          mapping = this._originalMappings[++index];
	        }
	      }
	    }

	    return mappings;
	  };

	exports.SourceMapConsumer = SourceMapConsumer;

	/**
	 * A BasicSourceMapConsumer instance represents a parsed source map which we can
	 * query for information about the original file positions by giving it a file
	 * position in the generated source.
	 *
	 * The first parameter is the raw source map (either as a JSON string, or
	 * already parsed to an object). According to the spec, source maps have the
	 * following attributes:
	 *
	 *   - version: Which version of the source map spec this map is following.
	 *   - sources: An array of URLs to the original source files.
	 *   - names: An array of identifiers which can be referrenced by individual mappings.
	 *   - sourceRoot: Optional. The URL root from which all sources are relative.
	 *   - sourcesContent: Optional. An array of contents of the original source files.
	 *   - mappings: A string of base64 VLQs which contain the actual mappings.
	 *   - file: Optional. The generated file this source map is associated with.
	 *
	 * Here is an example source map, taken from the source map spec[0]:
	 *
	 *     {
	 *       version : 3,
	 *       file: "out.js",
	 *       sourceRoot : "",
	 *       sources: ["foo.js", "bar.js"],
	 *       names: ["src", "maps", "are", "fun"],
	 *       mappings: "AA,AB;;ABCDE;"
	 *     }
	 *
	 * The second parameter, if given, is a string whose value is the URL
	 * at which the source map was found.  This URL is used to compute the
	 * sources array.
	 *
	 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
	 */
	function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
	  var sourceMap = aSourceMap;
	  if (typeof aSourceMap === 'string') {
	    sourceMap = util.parseSourceMapInput(aSourceMap);
	  }

	  var version = util.getArg(sourceMap, 'version');
	  var sources = util.getArg(sourceMap, 'sources');
	  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
	  // requires the array) to play nice here.
	  var names = util.getArg(sourceMap, 'names', []);
	  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
	  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
	  var mappings = util.getArg(sourceMap, 'mappings');
	  var file = util.getArg(sourceMap, 'file', null);

	  // Once again, Sass deviates from the spec and supplies the version as a
	  // string rather than a number, so we use loose equality checking here.
	  if (version != this._version) {
	    throw new Error('Unsupported version: ' + version);
	  }

	  if (sourceRoot) {
	    sourceRoot = util.normalize(sourceRoot);
	  }

	  sources = sources
	    .map(String)
	    // Some source maps produce relative source paths like "./foo.js" instead of
	    // "foo.js".  Normalize these first so that future comparisons will succeed.
	    // See bugzil.la/1090768.
	    .map(util.normalize)
	    // Always ensure that absolute sources are internally stored relative to
	    // the source root, if the source root is absolute. Not doing this would
	    // be particularly problematic when the source root is a prefix of the
	    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
	    .map(function (source) {
	      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
	        ? util.relative(sourceRoot, source)
	        : source;
	    });

	  // Pass `true` below to allow duplicate names and sources. While source maps
	  // are intended to be compressed and deduplicated, the TypeScript compiler
	  // sometimes generates source maps with duplicates in them. See Github issue
	  // #72 and bugzil.la/889492.
	  this._names = ArraySet.fromArray(names.map(String), true);
	  this._sources = ArraySet.fromArray(sources, true);

	  this._absoluteSources = this._sources.toArray().map(function (s) {
	    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
	  });

	  this.sourceRoot = sourceRoot;
	  this.sourcesContent = sourcesContent;
	  this._mappings = mappings;
	  this._sourceMapURL = aSourceMapURL;
	  this.file = file;
	}

	BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
	BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;

	/**
	 * Utility function to find the index of a source.  Returns -1 if not
	 * found.
	 */
	BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
	  var relativeSource = aSource;
	  if (this.sourceRoot != null) {
	    relativeSource = util.relative(this.sourceRoot, relativeSource);
	  }

	  if (this._sources.has(relativeSource)) {
	    return this._sources.indexOf(relativeSource);
	  }

	  // Maybe aSource is an absolute URL as returned by |sources|.  In
	  // this case we can't simply undo the transform.
	  var i;
	  for (i = 0; i < this._absoluteSources.length; ++i) {
	    if (this._absoluteSources[i] == aSource) {
	      return i;
	    }
	  }

	  return -1;
	};

	/**
	 * Create a BasicSourceMapConsumer from a SourceMapGenerator.
	 *
	 * @param SourceMapGenerator aSourceMap
	 *        The source map that will be consumed.
	 * @param String aSourceMapURL
	 *        The URL at which the source map can be found (optional)
	 * @returns BasicSourceMapConsumer
	 */
	BasicSourceMapConsumer.fromSourceMap =
	  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
	    var smc = Object.create(BasicSourceMapConsumer.prototype);

	    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
	    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
	    smc.sourceRoot = aSourceMap._sourceRoot;
	    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
	                                                            smc.sourceRoot);
	    smc.file = aSourceMap._file;
	    smc._sourceMapURL = aSourceMapURL;
	    smc._absoluteSources = smc._sources.toArray().map(function (s) {
	      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
	    });

	    // Because we are modifying the entries (by converting string sources and
	    // names to indices into the sources and names ArraySets), we have to make
	    // a copy of the entry or else bad things happen. Shared mutable state
	    // strikes again! See github issue #191.

	    var generatedMappings = aSourceMap._mappings.toArray().slice();
	    var destGeneratedMappings = smc.__generatedMappings = [];
	    var destOriginalMappings = smc.__originalMappings = [];

	    for (var i = 0, length = generatedMappings.length; i < length; i++) {
	      var srcMapping = generatedMappings[i];
	      var destMapping = new Mapping;
	      destMapping.generatedLine = srcMapping.generatedLine;
	      destMapping.generatedColumn = srcMapping.generatedColumn;

	      if (srcMapping.source) {
	        destMapping.source = sources.indexOf(srcMapping.source);
	        destMapping.originalLine = srcMapping.originalLine;
	        destMapping.originalColumn = srcMapping.originalColumn;

	        if (srcMapping.name) {
	          destMapping.name = names.indexOf(srcMapping.name);
	        }

	        destOriginalMappings.push(destMapping);
	      }

	      destGeneratedMappings.push(destMapping);
	    }

	    quickSort(smc.__originalMappings, util.compareByOriginalPositions);

	    return smc;
	  };

	/**
	 * The version of the source mapping spec that we are consuming.
	 */
	BasicSourceMapConsumer.prototype._version = 3;

	/**
	 * The list of original sources.
	 */
	Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
	  get: function () {
	    return this._absoluteSources.slice();
	  }
	});

	/**
	 * Provide the JIT with a nice shape / hidden class.
	 */
	function Mapping() {
	  this.generatedLine = 0;
	  this.generatedColumn = 0;
	  this.source = null;
	  this.originalLine = null;
	  this.originalColumn = null;
	  this.name = null;
	}

	/**
	 * Parse the mappings in a string in to a data structure which we can easily
	 * query (the ordered arrays in the `this.__generatedMappings` and
	 * `this.__originalMappings` properties).
	 */
	BasicSourceMapConsumer.prototype._parseMappings =
	  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
	    var generatedLine = 1;
	    var previousGeneratedColumn = 0;
	    var previousOriginalLine = 0;
	    var previousOriginalColumn = 0;
	    var previousSource = 0;
	    var previousName = 0;
	    var length = aStr.length;
	    var index = 0;
	    var cachedSegments = {};
	    var temp = {};
	    var originalMappings = [];
	    var generatedMappings = [];
	    var mapping, str, segment, end, value;

	    while (index < length) {
	      if (aStr.charAt(index) === ';') {
	        generatedLine++;
	        index++;
	        previousGeneratedColumn = 0;
	      }
	      else if (aStr.charAt(index) === ',') {
	        index++;
	      }
	      else {
	        mapping = new Mapping();
	        mapping.generatedLine = generatedLine;

	        // Because each offset is encoded relative to the previous one,
	        // many segments often have the same encoding. We can exploit this
	        // fact by caching the parsed variable length fields of each segment,
	        // allowing us to avoid a second parse if we encounter the same
	        // segment again.
	        for (end = index; end < length; end++) {
	          if (this._charIsMappingSeparator(aStr, end)) {
	            break;
	          }
	        }
	        str = aStr.slice(index, end);

	        segment = cachedSegments[str];
	        if (segment) {
	          index += str.length;
	        } else {
	          segment = [];
	          while (index < end) {
	            base64VLQ.decode(aStr, index, temp);
	            value = temp.value;
	            index = temp.rest;
	            segment.push(value);
	          }

	          if (segment.length === 2) {
	            throw new Error('Found a source, but no line and column');
	          }

	          if (segment.length === 3) {
	            throw new Error('Found a source and line, but no column');
	          }

	          cachedSegments[str] = segment;
	        }

	        // Generated column.
	        mapping.generatedColumn = previousGeneratedColumn + segment[0];
	        previousGeneratedColumn = mapping.generatedColumn;

	        if (segment.length > 1) {
	          // Original source.
	          mapping.source = previousSource + segment[1];
	          previousSource += segment[1];

	          // Original line.
	          mapping.originalLine = previousOriginalLine + segment[2];
	          previousOriginalLine = mapping.originalLine;
	          // Lines are stored 0-based
	          mapping.originalLine += 1;

	          // Original column.
	          mapping.originalColumn = previousOriginalColumn + segment[3];
	          previousOriginalColumn = mapping.originalColumn;

	          if (segment.length > 4) {
	            // Original name.
	            mapping.name = previousName + segment[4];
	            previousName += segment[4];
	          }
	        }

	        generatedMappings.push(mapping);
	        if (typeof mapping.originalLine === 'number') {
	          originalMappings.push(mapping);
	        }
	      }
	    }

	    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
	    this.__generatedMappings = generatedMappings;

	    quickSort(originalMappings, util.compareByOriginalPositions);
	    this.__originalMappings = originalMappings;
	  };

	/**
	 * Find the mapping that best matches the hypothetical "needle" mapping that
	 * we are searching for in the given "haystack" of mappings.
	 */
	BasicSourceMapConsumer.prototype._findMapping =
	  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
	                                         aColumnName, aComparator, aBias) {
	    // To return the position we are searching for, we must first find the
	    // mapping for the given position and then return the opposite position it
	    // points to. Because the mappings are sorted, we can use binary search to
	    // find the best mapping.

	    if (aNeedle[aLineName] <= 0) {
	      throw new TypeError('Line must be greater than or equal to 1, got '
	                          + aNeedle[aLineName]);
	    }
	    if (aNeedle[aColumnName] < 0) {
	      throw new TypeError('Column must be greater than or equal to 0, got '
	                          + aNeedle[aColumnName]);
	    }

	    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
	  };

	/**
	 * Compute the last column for each generated mapping. The last column is
	 * inclusive.
	 */
	BasicSourceMapConsumer.prototype.computeColumnSpans =
	  function SourceMapConsumer_computeColumnSpans() {
	    for (var index = 0; index < this._generatedMappings.length; ++index) {
	      var mapping = this._generatedMappings[index];

	      // Mappings do not contain a field for the last generated columnt. We
	      // can come up with an optimistic estimate, however, by assuming that
	      // mappings are contiguous (i.e. given two consecutive mappings, the
	      // first mapping ends where the second one starts).
	      if (index + 1 < this._generatedMappings.length) {
	        var nextMapping = this._generatedMappings[index + 1];

	        if (mapping.generatedLine === nextMapping.generatedLine) {
	          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
	          continue;
	        }
	      }

	      // The last mapping for each line spans the entire line.
	      mapping.lastGeneratedColumn = Infinity;
	    }
	  };

	/**
	 * Returns the original source, line, and column information for the generated
	 * source's line and column positions provided. The only argument is an object
	 * with the following properties:
	 *
	 *   - line: The line number in the generated source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the generated source.  The column
	 *     number is 0-based.
	 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
	 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - source: The original source file, or null.
	 *   - line: The line number in the original source, or null.  The
	 *     line number is 1-based.
	 *   - column: The column number in the original source, or null.  The
	 *     column number is 0-based.
	 *   - name: The original identifier, or null.
	 */
	BasicSourceMapConsumer.prototype.originalPositionFor =
	  function SourceMapConsumer_originalPositionFor(aArgs) {
	    var needle = {
	      generatedLine: util.getArg(aArgs, 'line'),
	      generatedColumn: util.getArg(aArgs, 'column')
	    };

	    var index = this._findMapping(
	      needle,
	      this._generatedMappings,
	      "generatedLine",
	      "generatedColumn",
	      util.compareByGeneratedPositionsDeflated,
	      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
	    );

	    if (index >= 0) {
	      var mapping = this._generatedMappings[index];

	      if (mapping.generatedLine === needle.generatedLine) {
	        var source = util.getArg(mapping, 'source', null);
	        if (source !== null) {
	          source = this._sources.at(source);
	          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
	        }
	        var name = util.getArg(mapping, 'name', null);
	        if (name !== null) {
	          name = this._names.at(name);
	        }
	        return {
	          source: source,
	          line: util.getArg(mapping, 'originalLine', null),
	          column: util.getArg(mapping, 'originalColumn', null),
	          name: name
	        };
	      }
	    }

	    return {
	      source: null,
	      line: null,
	      column: null,
	      name: null
	    };
	  };

	/**
	 * Return true if we have the source content for every source in the source
	 * map, false otherwise.
	 */
	BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
	  function BasicSourceMapConsumer_hasContentsOfAllSources() {
	    if (!this.sourcesContent) {
	      return false;
	    }
	    return this.sourcesContent.length >= this._sources.size() &&
	      !this.sourcesContent.some(function (sc) { return sc == null; });
	  };

	/**
	 * Returns the original source content. The only argument is the url of the
	 * original source file. Returns null if no original source content is
	 * available.
	 */
	BasicSourceMapConsumer.prototype.sourceContentFor =
	  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
	    if (!this.sourcesContent) {
	      return null;
	    }

	    var index = this._findSourceIndex(aSource);
	    if (index >= 0) {
	      return this.sourcesContent[index];
	    }

	    var relativeSource = aSource;
	    if (this.sourceRoot != null) {
	      relativeSource = util.relative(this.sourceRoot, relativeSource);
	    }

	    var url;
	    if (this.sourceRoot != null
	        && (url = util.urlParse(this.sourceRoot))) {
	      // XXX: file:// URIs and absolute paths lead to unexpected behavior for
	      // many users. We can help them out when they expect file:// URIs to
	      // behave like it would if they were running a local HTTP server. See
	      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
	      var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
	      if (url.scheme == "file"
	          && this._sources.has(fileUriAbsPath)) {
	        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
	      }

	      if ((!url.path || url.path == "/")
	          && this._sources.has("/" + relativeSource)) {
	        return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
	      }
	    }

	    // This function is used recursively from
	    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
	    // don't want to throw if we can't find the source - we just want to
	    // return null, so we provide a flag to exit gracefully.
	    if (nullOnMissing) {
	      return null;
	    }
	    else {
	      throw new Error('"' + relativeSource + '" is not in the SourceMap.');
	    }
	  };

	/**
	 * Returns the generated line and column information for the original source,
	 * line, and column positions provided. The only argument is an object with
	 * the following properties:
	 *
	 *   - source: The filename of the original source.
	 *   - line: The line number in the original source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the original source.  The column
	 *     number is 0-based.
	 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
	 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - line: The line number in the generated source, or null.  The
	 *     line number is 1-based.
	 *   - column: The column number in the generated source, or null.
	 *     The column number is 0-based.
	 */
	BasicSourceMapConsumer.prototype.generatedPositionFor =
	  function SourceMapConsumer_generatedPositionFor(aArgs) {
	    var source = util.getArg(aArgs, 'source');
	    source = this._findSourceIndex(source);
	    if (source < 0) {
	      return {
	        line: null,
	        column: null,
	        lastColumn: null
	      };
	    }

	    var needle = {
	      source: source,
	      originalLine: util.getArg(aArgs, 'line'),
	      originalColumn: util.getArg(aArgs, 'column')
	    };

	    var index = this._findMapping(
	      needle,
	      this._originalMappings,
	      "originalLine",
	      "originalColumn",
	      util.compareByOriginalPositions,
	      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
	    );

	    if (index >= 0) {
	      var mapping = this._originalMappings[index];

	      if (mapping.source === needle.source) {
	        return {
	          line: util.getArg(mapping, 'generatedLine', null),
	          column: util.getArg(mapping, 'generatedColumn', null),
	          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
	        };
	      }
	    }

	    return {
	      line: null,
	      column: null,
	      lastColumn: null
	    };
	  };

	exports.BasicSourceMapConsumer = BasicSourceMapConsumer;

	/**
	 * An IndexedSourceMapConsumer instance represents a parsed source map which
	 * we can query for information. It differs from BasicSourceMapConsumer in
	 * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
	 * input.
	 *
	 * The first parameter is a raw source map (either as a JSON string, or already
	 * parsed to an object). According to the spec for indexed source maps, they
	 * have the following attributes:
	 *
	 *   - version: Which version of the source map spec this map is following.
	 *   - file: Optional. The generated file this source map is associated with.
	 *   - sections: A list of section definitions.
	 *
	 * Each value under the "sections" field has two fields:
	 *   - offset: The offset into the original specified at which this section
	 *       begins to apply, defined as an object with a "line" and "column"
	 *       field.
	 *   - map: A source map definition. This source map could also be indexed,
	 *       but doesn't have to be.
	 *
	 * Instead of the "map" field, it's also possible to have a "url" field
	 * specifying a URL to retrieve a source map from, but that's currently
	 * unsupported.
	 *
	 * Here's an example source map, taken from the source map spec[0], but
	 * modified to omit a section which uses the "url" field.
	 *
	 *  {
	 *    version : 3,
	 *    file: "app.js",
	 *    sections: [{
	 *      offset: {line:100, column:10},
	 *      map: {
	 *        version : 3,
	 *        file: "section.js",
	 *        sources: ["foo.js", "bar.js"],
	 *        names: ["src", "maps", "are", "fun"],
	 *        mappings: "AAAA,E;;ABCDE;"
	 *      }
	 *    }],
	 *  }
	 *
	 * The second parameter, if given, is a string whose value is the URL
	 * at which the source map was found.  This URL is used to compute the
	 * sources array.
	 *
	 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
	 */
	function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
	  var sourceMap = aSourceMap;
	  if (typeof aSourceMap === 'string') {
	    sourceMap = util.parseSourceMapInput(aSourceMap);
	  }

	  var version = util.getArg(sourceMap, 'version');
	  var sections = util.getArg(sourceMap, 'sections');

	  if (version != this._version) {
	    throw new Error('Unsupported version: ' + version);
	  }

	  this._sources = new ArraySet();
	  this._names = new ArraySet();

	  var lastOffset = {
	    line: -1,
	    column: 0
	  };
	  this._sections = sections.map(function (s) {
	    if (s.url) {
	      // The url field will require support for asynchronicity.
	      // See https://github.com/mozilla/source-map/issues/16
	      throw new Error('Support for url field in sections not implemented.');
	    }
	    var offset = util.getArg(s, 'offset');
	    var offsetLine = util.getArg(offset, 'line');
	    var offsetColumn = util.getArg(offset, 'column');

	    if (offsetLine < lastOffset.line ||
	        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
	      throw new Error('Section offsets must be ordered and non-overlapping.');
	    }
	    lastOffset = offset;

	    return {
	      generatedOffset: {
	        // The offset fields are 0-based, but we use 1-based indices when
	        // encoding/decoding from VLQ.
	        generatedLine: offsetLine + 1,
	        generatedColumn: offsetColumn + 1
	      },
	      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)
	    }
	  });
	}

	IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
	IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;

	/**
	 * The version of the source mapping spec that we are consuming.
	 */
	IndexedSourceMapConsumer.prototype._version = 3;

	/**
	 * The list of original sources.
	 */
	Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
	  get: function () {
	    var sources = [];
	    for (var i = 0; i < this._sections.length; i++) {
	      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
	        sources.push(this._sections[i].consumer.sources[j]);
	      }
	    }
	    return sources;
	  }
	});

	/**
	 * Returns the original source, line, and column information for the generated
	 * source's line and column positions provided. The only argument is an object
	 * with the following properties:
	 *
	 *   - line: The line number in the generated source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the generated source.  The column
	 *     number is 0-based.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - source: The original source file, or null.
	 *   - line: The line number in the original source, or null.  The
	 *     line number is 1-based.
	 *   - column: The column number in the original source, or null.  The
	 *     column number is 0-based.
	 *   - name: The original identifier, or null.
	 */
	IndexedSourceMapConsumer.prototype.originalPositionFor =
	  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
	    var needle = {
	      generatedLine: util.getArg(aArgs, 'line'),
	      generatedColumn: util.getArg(aArgs, 'column')
	    };

	    // Find the section containing the generated position we're trying to map
	    // to an original position.
	    var sectionIndex = binarySearch.search(needle, this._sections,
	      function(needle, section) {
	        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
	        if (cmp) {
	          return cmp;
	        }

	        return (needle.generatedColumn -
	                section.generatedOffset.generatedColumn);
	      });
	    var section = this._sections[sectionIndex];

	    if (!section) {
	      return {
	        source: null,
	        line: null,
	        column: null,
	        name: null
	      };
	    }

	    return section.consumer.originalPositionFor({
	      line: needle.generatedLine -
	        (section.generatedOffset.generatedLine - 1),
	      column: needle.generatedColumn -
	        (section.generatedOffset.generatedLine === needle.generatedLine
	         ? section.generatedOffset.generatedColumn - 1
	         : 0),
	      bias: aArgs.bias
	    });
	  };

	/**
	 * Return true if we have the source content for every source in the source
	 * map, false otherwise.
	 */
	IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
	  function IndexedSourceMapConsumer_hasContentsOfAllSources() {
	    return this._sections.every(function (s) {
	      return s.consumer.hasContentsOfAllSources();
	    });
	  };

	/**
	 * Returns the original source content. The only argument is the url of the
	 * original source file. Returns null if no original source content is
	 * available.
	 */
	IndexedSourceMapConsumer.prototype.sourceContentFor =
	  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
	    for (var i = 0; i < this._sections.length; i++) {
	      var section = this._sections[i];

	      var content = section.consumer.sourceContentFor(aSource, true);
	      if (content) {
	        return content;
	      }
	    }
	    if (nullOnMissing) {
	      return null;
	    }
	    else {
	      throw new Error('"' + aSource + '" is not in the SourceMap.');
	    }
	  };

	/**
	 * Returns the generated line and column information for the original source,
	 * line, and column positions provided. The only argument is an object with
	 * the following properties:
	 *
	 *   - source: The filename of the original source.
	 *   - line: The line number in the original source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the original source.  The column
	 *     number is 0-based.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - line: The line number in the generated source, or null.  The
	 *     line number is 1-based. 
	 *   - column: The column number in the generated source, or null.
	 *     The column number is 0-based.
	 */
	IndexedSourceMapConsumer.prototype.generatedPositionFor =
	  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
	    for (var i = 0; i < this._sections.length; i++) {
	      var section = this._sections[i];

	      // Only consider this section if the requested source is in the list of
	      // sources of the consumer.
	      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
	        continue;
	      }
	      var generatedPosition = section.consumer.generatedPositionFor(aArgs);
	      if (generatedPosition) {
	        var ret = {
	          line: generatedPosition.line +
	            (section.generatedOffset.generatedLine - 1),
	          column: generatedPosition.column +
	            (section.generatedOffset.generatedLine === generatedPosition.line
	             ? section.generatedOffset.generatedColumn - 1
	             : 0)
	        };
	        return ret;
	      }
	    }

	    return {
	      line: null,
	      column: null
	    };
	  };

	/**
	 * Parse the mappings in a string in to a data structure which we can easily
	 * query (the ordered arrays in the `this.__generatedMappings` and
	 * `this.__originalMappings` properties).
	 */
	IndexedSourceMapConsumer.prototype._parseMappings =
	  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
	    this.__generatedMappings = [];
	    this.__originalMappings = [];
	    for (var i = 0; i < this._sections.length; i++) {
	      var section = this._sections[i];
	      var sectionMappings = section.consumer._generatedMappings;
	      for (var j = 0; j < sectionMappings.length; j++) {
	        var mapping = sectionMappings[j];

	        var source = section.consumer._sources.at(mapping.source);
	        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
	        this._sources.add(source);
	        source = this._sources.indexOf(source);

	        var name = null;
	        if (mapping.name) {
	          name = section.consumer._names.at(mapping.name);
	          this._names.add(name);
	          name = this._names.indexOf(name);
	        }

	        // The mappings coming from the consumer for the section have
	        // generated positions relative to the start of the section, so we
	        // need to offset them to be relative to the start of the concatenated
	        // generated file.
	        var adjustedMapping = {
	          source: source,
	          generatedLine: mapping.generatedLine +
	            (section.generatedOffset.generatedLine - 1),
	          generatedColumn: mapping.generatedColumn +
	            (section.generatedOffset.generatedLine === mapping.generatedLine
	            ? section.generatedOffset.generatedColumn - 1
	            : 0),
	          originalLine: mapping.originalLine,
	          originalColumn: mapping.originalColumn,
	          name: name
	        };

	        this.__generatedMappings.push(adjustedMapping);
	        if (typeof adjustedMapping.originalLine === 'number') {
	          this.__originalMappings.push(adjustedMapping);
	        }
	      }
	    }

	    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
	    quickSort(this.__originalMappings, util.compareByOriginalPositions);
	  };

	exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;


/***/ }),
/* 8 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	exports.GREATEST_LOWER_BOUND = 1;
	exports.LEAST_UPPER_BOUND = 2;

	/**
	 * Recursive implementation of binary search.
	 *
	 * @param aLow Indices here and lower do not contain the needle.
	 * @param aHigh Indices here and higher do not contain the needle.
	 * @param aNeedle The element being searched for.
	 * @param aHaystack The non-empty array being searched.
	 * @param aCompare Function which takes two elements and returns -1, 0, or 1.
	 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
	 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 */
	function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
	  // This function terminates when one of the following is true:
	  //
	  //   1. We find the exact element we are looking for.
	  //
	  //   2. We did not find the exact element, but we can return the index of
	  //      the next-closest element.
	  //
	  //   3. We did not find the exact element, and there is no next-closest
	  //      element than the one we are searching for, so we return -1.
	  var mid = Math.floor((aHigh - aLow) / 2) + aLow;
	  var cmp = aCompare(aNeedle, aHaystack[mid], true);
	  if (cmp === 0) {
	    // Found the element we are looking for.
	    return mid;
	  }
	  else if (cmp > 0) {
	    // Our needle is greater than aHaystack[mid].
	    if (aHigh - mid > 1) {
	      // The element is in the upper half.
	      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
	    }

	    // The exact needle element was not found in this haystack. Determine if
	    // we are in termination case (3) or (2) and return the appropriate thing.
	    if (aBias == exports.LEAST_UPPER_BOUND) {
	      return aHigh < aHaystack.length ? aHigh : -1;
	    } else {
	      return mid;
	    }
	  }
	  else {
	    // Our needle is less than aHaystack[mid].
	    if (mid - aLow > 1) {
	      // The element is in the lower half.
	      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
	    }

	    // we are in termination case (3) or (2) and return the appropriate thing.
	    if (aBias == exports.LEAST_UPPER_BOUND) {
	      return mid;
	    } else {
	      return aLow < 0 ? -1 : aLow;
	    }
	  }
	}

	/**
	 * This is an implementation of binary search which will always try and return
	 * the index of the closest element if there is no exact hit. This is because
	 * mappings between original and generated line/col pairs are single points,
	 * and there is an implicit region between each of them, so a miss just means
	 * that you aren't on the very start of a region.
	 *
	 * @param aNeedle The element you are looking for.
	 * @param aHaystack The array that is being searched.
	 * @param aCompare A function which takes the needle and an element in the
	 *     array and returns -1, 0, or 1 depending on whether the needle is less
	 *     than, equal to, or greater than the element, respectively.
	 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
	 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
	 */
	exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
	  if (aHaystack.length === 0) {
	    return -1;
	  }

	  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
	                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);
	  if (index < 0) {
	    return -1;
	  }

	  // We have found either the exact element, or the next-closest element than
	  // the one we are searching for. However, there may be more than one such
	  // element. Make sure we always return the smallest of these.
	  while (index - 1 >= 0) {
	    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
	      break;
	    }
	    --index;
	  }

	  return index;
	};


/***/ }),
/* 9 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	// It turns out that some (most?) JavaScript engines don't self-host
	// `Array.prototype.sort`. This makes sense because C++ will likely remain
	// faster than JS when doing raw CPU-intensive sorting. However, when using a
	// custom comparator function, calling back and forth between the VM's C++ and
	// JIT'd JS is rather slow *and* loses JIT type information, resulting in
	// worse generated code for the comparator function than would be optimal. In
	// fact, when sorting with a comparator, these costs outweigh the benefits of
	// sorting in C++. By using our own JS-implemented Quick Sort (below), we get
	// a ~3500ms mean speed-up in `bench/bench.html`.

	/**
	 * Swap the elements indexed by `x` and `y` in the array `ary`.
	 *
	 * @param {Array} ary
	 *        The array.
	 * @param {Number} x
	 *        The index of the first item.
	 * @param {Number} y
	 *        The index of the second item.
	 */
	function swap(ary, x, y) {
	  var temp = ary[x];
	  ary[x] = ary[y];
	  ary[y] = temp;
	}

	/**
	 * Returns a random integer within the range `low .. high` inclusive.
	 *
	 * @param {Number} low
	 *        The lower bound on the range.
	 * @param {Number} high
	 *        The upper bound on the range.
	 */
	function randomIntInRange(low, high) {
	  return Math.round(low + (Math.random() * (high - low)));
	}

	/**
	 * The Quick Sort algorithm.
	 *
	 * @param {Array} ary
	 *        An array to sort.
	 * @param {function} comparator
	 *        Function to use to compare two items.
	 * @param {Number} p
	 *        Start index of the array
	 * @param {Number} r
	 *        End index of the array
	 */
	function doQuickSort(ary, comparator, p, r) {
	  // If our lower bound is less than our upper bound, we (1) partition the
	  // array into two pieces and (2) recurse on each half. If it is not, this is
	  // the empty array and our base case.

	  if (p < r) {
	    // (1) Partitioning.
	    //
	    // The partitioning chooses a pivot between `p` and `r` and moves all
	    // elements that are less than or equal to the pivot to the before it, and
	    // all the elements that are greater than it after it. The effect is that
	    // once partition is done, the pivot is in the exact place it will be when
	    // the array is put in sorted order, and it will not need to be moved
	    // again. This runs in O(n) time.

	    // Always choose a random pivot so that an input array which is reverse
	    // sorted does not cause O(n^2) running time.
	    var pivotIndex = randomIntInRange(p, r);
	    var i = p - 1;

	    swap(ary, pivotIndex, r);
	    var pivot = ary[r];

	    // Immediately after `j` is incremented in this loop, the following hold
	    // true:
	    //
	    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.
	    //
	    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
	    for (var j = p; j < r; j++) {
	      if (comparator(ary[j], pivot) <= 0) {
	        i += 1;
	        swap(ary, i, j);
	      }
	    }

	    swap(ary, i + 1, j);
	    var q = i + 1;

	    // (2) Recurse on each half.

	    doQuickSort(ary, comparator, p, q - 1);
	    doQuickSort(ary, comparator, q + 1, r);
	  }
	}

	/**
	 * Sort the given array in-place with the given comparator function.
	 *
	 * @param {Array} ary
	 *        An array to sort.
	 * @param {function} comparator
	 *        Function to use to compare two items.
	 */
	exports.quickSort = function (ary, comparator) {
	  doQuickSort(ary, comparator, 0, ary.length - 1);
	};


/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
	var util = __webpack_require__(4);

	// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
	// operating systems these days (capturing the result).
	var REGEX_NEWLINE = /(\r?\n)/;

	// Newline character code for charCodeAt() comparisons
	var NEWLINE_CODE = 10;

	// Private symbol for identifying `SourceNode`s when multiple versions of
	// the source-map library are loaded. This MUST NOT CHANGE across
	// versions!
	var isSourceNode = "$$$isSourceNode$$$";

	/**
	 * SourceNodes provide a way to abstract over interpolating/concatenating
	 * snippets of generated JavaScript source code while maintaining the line and
	 * column information associated with the original source code.
	 *
	 * @param aLine The original line number.
	 * @param aColumn The original column number.
	 * @param aSource The original source's filename.
	 * @param aChunks Optional. An array of strings which are snippets of
	 *        generated JS, or other SourceNodes.
	 * @param aName The original identifier.
	 */
	function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
	  this.children = [];
	  this.sourceContents = {};
	  this.line = aLine == null ? null : aLine;
	  this.column = aColumn == null ? null : aColumn;
	  this.source = aSource == null ? null : aSource;
	  this.name = aName == null ? null : aName;
	  this[isSourceNode] = true;
	  if (aChunks != null) this.add(aChunks);
	}

	/**
	 * Creates a SourceNode from generated code and a SourceMapConsumer.
	 *
	 * @param aGeneratedCode The generated code
	 * @param aSourceMapConsumer The SourceMap for the generated code
	 * @param aRelativePath Optional. The path that relative sources in the
	 *        SourceMapConsumer should be relative to.
	 */
	SourceNode.fromStringWithSourceMap =
	  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
	    // The SourceNode we want to fill with the generated code
	    // and the SourceMap
	    var node = new SourceNode();

	    // All even indices of this array are one line of the generated code,
	    // while all odd indices are the newlines between two adjacent lines
	    // (since `REGEX_NEWLINE` captures its match).
	    // Processed fragments are accessed by calling `shiftNextLine`.
	    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
	    var remainingLinesIndex = 0;
	    var shiftNextLine = function() {
	      var lineContents = getNextLine();
	      // The last line of a file might not have a newline.
	      var newLine = getNextLine() || "";
	      return lineContents + newLine;

	      function getNextLine() {
	        return remainingLinesIndex < remainingLines.length ?
	            remainingLines[remainingLinesIndex++] : undefined;
	      }
	    };

	    // We need to remember the position of "remainingLines"
	    var lastGeneratedLine = 1, lastGeneratedColumn = 0;

	    // The generate SourceNodes we need a code range.
	    // To extract it current and last mapping is used.
	    // Here we store the last mapping.
	    var lastMapping = null;

	    aSourceMapConsumer.eachMapping(function (mapping) {
	      if (lastMapping !== null) {
	        // We add the code from "lastMapping" to "mapping":
	        // First check if there is a new line in between.
	        if (lastGeneratedLine < mapping.generatedLine) {
	          // Associate first line with "lastMapping"
	          addMappingWithCode(lastMapping, shiftNextLine());
	          lastGeneratedLine++;
	          lastGeneratedColumn = 0;
	          // The remaining code is added without mapping
	        } else {
	          // There is no new line in between.
	          // Associate the code between "lastGeneratedColumn" and
	          // "mapping.generatedColumn" with "lastMapping"
	          var nextLine = remainingLines[remainingLinesIndex] || '';
	          var code = nextLine.substr(0, mapping.generatedColumn -
	                                        lastGeneratedColumn);
	          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
	                                              lastGeneratedColumn);
	          lastGeneratedColumn = mapping.generatedColumn;
	          addMappingWithCode(lastMapping, code);
	          // No more remaining code, continue
	          lastMapping = mapping;
	          return;
	        }
	      }
	      // We add the generated code until the first mapping
	      // to the SourceNode without any mapping.
	      // Each line is added as separate string.
	      while (lastGeneratedLine < mapping.generatedLine) {
	        node.add(shiftNextLine());
	        lastGeneratedLine++;
	      }
	      if (lastGeneratedColumn < mapping.generatedColumn) {
	        var nextLine = remainingLines[remainingLinesIndex] || '';
	        node.add(nextLine.substr(0, mapping.generatedColumn));
	        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
	        lastGeneratedColumn = mapping.generatedColumn;
	      }
	      lastMapping = mapping;
	    }, this);
	    // We have processed all mappings.
	    if (remainingLinesIndex < remainingLines.length) {
	      if (lastMapping) {
	        // Associate the remaining code in the current line with "lastMapping"
	        addMappingWithCode(lastMapping, shiftNextLine());
	      }
	      // and add the remaining lines without any mapping
	      node.add(remainingLines.splice(remainingLinesIndex).join(""));
	    }

	    // Copy sourcesContent into SourceNode
	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
	      if (content != null) {
	        if (aRelativePath != null) {
	          sourceFile = util.join(aRelativePath, sourceFile);
	        }
	        node.setSourceContent(sourceFile, content);
	      }
	    });

	    return node;

	    function addMappingWithCode(mapping, code) {
	      if (mapping === null || mapping.source === undefined) {
	        node.add(code);
	      } else {
	        var source = aRelativePath
	          ? util.join(aRelativePath, mapping.source)
	          : mapping.source;
	        node.add(new SourceNode(mapping.originalLine,
	                                mapping.originalColumn,
	                                source,
	                                code,
	                                mapping.name));
	      }
	    }
	  };

	/**
	 * Add a chunk of generated JS to this source node.
	 *
	 * @param aChunk A string snippet of generated JS code, another instance of
	 *        SourceNode, or an array where each member is one of those things.
	 */
	SourceNode.prototype.add = function SourceNode_add(aChunk) {
	  if (Array.isArray(aChunk)) {
	    aChunk.forEach(function (chunk) {
	      this.add(chunk);
	    }, this);
	  }
	  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
	    if (aChunk) {
	      this.children.push(aChunk);
	    }
	  }
	  else {
	    throw new TypeError(
	      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
	    );
	  }
	  return this;
	};

	/**
	 * Add a chunk of generated JS to the beginning of this source node.
	 *
	 * @param aChunk A string snippet of generated JS code, another instance of
	 *        SourceNode, or an array where each member is one of those things.
	 */
	SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
	  if (Array.isArray(aChunk)) {
	    for (var i = aChunk.length-1; i >= 0; i--) {
	      this.prepend(aChunk[i]);
	    }
	  }
	  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
	    this.children.unshift(aChunk);
	  }
	  else {
	    throw new TypeError(
	      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
	    );
	  }
	  return this;
	};

	/**
	 * Walk over the tree of JS snippets in this node and its children. The
	 * walking function is called once for each snippet of JS and is passed that
	 * snippet and the its original associated source's line/column location.
	 *
	 * @param aFn The traversal function.
	 */
	SourceNode.prototype.walk = function SourceNode_walk(aFn) {
	  var chunk;
	  for (var i = 0, len = this.children.length; i < len; i++) {
	    chunk = this.children[i];
	    if (chunk[isSourceNode]) {
	      chunk.walk(aFn);
	    }
	    else {
	      if (chunk !== '') {
	        aFn(chunk, { source: this.source,
	                     line: this.line,
	                     column: this.column,
	                     name: this.name });
	      }
	    }
	  }
	};

	/**
	 * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
	 * each of `this.children`.
	 *
	 * @param aSep The separator.
	 */
	SourceNode.prototype.join = function SourceNode_join(aSep) {
	  var newChildren;
	  var i;
	  var len = this.children.length;
	  if (len > 0) {
	    newChildren = [];
	    for (i = 0; i < len-1; i++) {
	      newChildren.push(this.children[i]);
	      newChildren.push(aSep);
	    }
	    newChildren.push(this.children[i]);
	    this.children = newChildren;
	  }
	  return this;
	};

	/**
	 * Call String.prototype.replace on the very right-most source snippet. Useful
	 * for trimming whitespace from the end of a source node, etc.
	 *
	 * @param aPattern The pattern to replace.
	 * @param aReplacement The thing to replace the pattern with.
	 */
	SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
	  var lastChild = this.children[this.children.length - 1];
	  if (lastChild[isSourceNode]) {
	    lastChild.replaceRight(aPattern, aReplacement);
	  }
	  else if (typeof lastChild === 'string') {
	    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
	  }
	  else {
	    this.children.push(''.replace(aPattern, aReplacement));
	  }
	  return this;
	};

	/**
	 * Set the source content for a source file. This will be added to the SourceMapGenerator
	 * in the sourcesContent field.
	 *
	 * @param aSourceFile The filename of the source file
	 * @param aSourceContent The content of the source file
	 */
	SourceNode.prototype.setSourceContent =
	  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
	    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
	  };

	/**
	 * Walk over the tree of SourceNodes. The walking function is called for each
	 * source file content and is passed the filename and source content.
	 *
	 * @param aFn The traversal function.
	 */
	SourceNode.prototype.walkSourceContents =
	  function SourceNode_walkSourceContents(aFn) {
	    for (var i = 0, len = this.children.length; i < len; i++) {
	      if (this.children[i][isSourceNode]) {
	        this.children[i].walkSourceContents(aFn);
	      }
	    }

	    var sources = Object.keys(this.sourceContents);
	    for (var i = 0, len = sources.length; i < len; i++) {
	      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
	    }
	  };

	/**
	 * Return the string representation of this source node. Walks over the tree
	 * and concatenates all the various snippets together to one string.
	 */
	SourceNode.prototype.toString = function SourceNode_toString() {
	  var str = "";
	  this.walk(function (chunk) {
	    str += chunk;
	  });
	  return str;
	};

	/**
	 * Returns the string representation of this source node along with a source
	 * map.
	 */
	SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
	  var generated = {
	    code: "",
	    line: 1,
	    column: 0
	  };
	  var map = new SourceMapGenerator(aArgs);
	  var sourceMappingActive = false;
	  var lastOriginalSource = null;
	  var lastOriginalLine = null;
	  var lastOriginalColumn = null;
	  var lastOriginalName = null;
	  this.walk(function (chunk, original) {
	    generated.code += chunk;
	    if (original.source !== null
	        && original.line !== null
	        && original.column !== null) {
	      if(lastOriginalSource !== original.source
	         || lastOriginalLine !== original.line
	         || lastOriginalColumn !== original.column
	         || lastOriginalName !== original.name) {
	        map.addMapping({
	          source: original.source,
	          original: {
	            line: original.line,
	            column: original.column
	          },
	          generated: {
	            line: generated.line,
	            column: generated.column
	          },
	          name: original.name
	        });
	      }
	      lastOriginalSource = original.source;
	      lastOriginalLine = original.line;
	      lastOriginalColumn = original.column;
	      lastOriginalName = original.name;
	      sourceMappingActive = true;
	    } else if (sourceMappingActive) {
	      map.addMapping({
	        generated: {
	          line: generated.line,
	          column: generated.column
	        }
	      });
	      lastOriginalSource = null;
	      sourceMappingActive = false;
	    }
	    for (var idx = 0, length = chunk.length; idx < length; idx++) {
	      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
	        generated.line++;
	        generated.column = 0;
	        // Mappings end at eol
	        if (idx + 1 === length) {
	          lastOriginalSource = null;
	          sourceMappingActive = false;
	        } else if (sourceMappingActive) {
	          map.addMapping({
	            source: original.source,
	            original: {
	              line: original.line,
	              column: original.column
	            },
	            generated: {
	              line: generated.line,
	              column: generated.column
	            },
	            name: original.name
	          });
	        }
	      } else {
	        generated.column++;
	      }
	    }
	  });
	  this.walkSourceContents(function (sourceFile, sourceContent) {
	    map.setSourceContent(sourceFile, sourceContent);
	  });

	  return { code: generated.code, map: map };
	};

	exports.SourceNode = SourceNode;


/***/ })
/******/ ])
});
;!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.sourceMap=n():e.sourceMap=n()}(this,function(){return function(e){function n(t){if(r[t])return r[t].exports;var o=r[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var r={};return n.m=e,n.c=r,n.p="",n(0)}([function(e,n,r){n.SourceMapGenerator=r(1).SourceMapGenerator,n.SourceMapConsumer=r(7).SourceMapConsumer,n.SourceNode=r(10).SourceNode},function(e,n,r){function t(e){e||(e={}),this._file=i.getArg(e,"file",null),this._sourceRoot=i.getArg(e,"sourceRoot",null),this._skipValidation=i.getArg(e,"skipValidation",!1),this._sources=new s,this._names=new s,this._mappings=new a,this._sourcesContents=null}var o=r(2),i=r(4),s=r(5).ArraySet,a=r(6).MappingList;t.prototype._version=3,t.fromSourceMap=function(e){var n=e.sourceRoot,r=new t({file:e.file,sourceRoot:n});return e.eachMapping(function(e){var t={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(t.source=e.source,null!=n&&(t.source=i.relative(n,t.source)),t.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(t.name=e.name)),r.addMapping(t)}),e.sources.forEach(function(t){var o=t;null!==n&&(o=i.relative(n,t)),r._sources.has(o)||r._sources.add(o);var s=e.sourceContentFor(t);null!=s&&r.setSourceContent(t,s)}),r},t.prototype.addMapping=function(e){var n=i.getArg(e,"generated"),r=i.getArg(e,"original",null),t=i.getArg(e,"source",null),o=i.getArg(e,"name",null);this._skipValidation||this._validateMapping(n,r,t,o),null!=t&&(t=String(t),this._sources.has(t)||this._sources.add(t)),null!=o&&(o=String(o),this._names.has(o)||this._names.add(o)),this._mappings.add({generatedLine:n.line,generatedColumn:n.column,originalLine:null!=r&&r.line,originalColumn:null!=r&&r.column,source:t,name:o})},t.prototype.setSourceContent=function(e,n){var r=e;null!=this._sourceRoot&&(r=i.relative(this._sourceRoot,r)),null!=n?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[i.toSetString(r)]=n):this._sourcesContents&&(delete this._sourcesContents[i.toSetString(r)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},t.prototype.applySourceMap=function(e,n,r){var t=n;if(null==n){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');t=e.file}var o=this._sourceRoot;null!=o&&(t=i.relative(o,t));var a=new s,u=new s;this._mappings.unsortedForEach(function(n){if(n.source===t&&null!=n.originalLine){var s=e.originalPositionFor({line:n.originalLine,column:n.originalColumn});null!=s.source&&(n.source=s.source,null!=r&&(n.source=i.join(r,n.source)),null!=o&&(n.source=i.relative(o,n.source)),n.originalLine=s.line,n.originalColumn=s.column,null!=s.name&&(n.name=s.name))}var l=n.source;null==l||a.has(l)||a.add(l);var c=n.name;null==c||u.has(c)||u.add(c)},this),this._sources=a,this._names=u,e.sources.forEach(function(n){var t=e.sourceContentFor(n);null!=t&&(null!=r&&(n=i.join(r,n)),null!=o&&(n=i.relative(o,n)),this.setSourceContent(n,t))},this)},t.prototype._validateMapping=function(e,n,r,t){if(n&&"number"!=typeof n.line&&"number"!=typeof n.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||n||r||t)&&!(e&&"line"in e&&"column"in e&&n&&"line"in n&&"column"in n&&e.line>0&&e.column>=0&&n.line>0&&n.column>=0&&r))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:r,original:n,name:t}))},t.prototype._serializeMappings=function(){for(var e,n,r,t,s=0,a=1,u=0,l=0,c=0,g=0,p="",h=this._mappings.toArray(),f=0,d=h.length;f<d;f++){if(n=h[f],e="",n.generatedLine!==a)for(s=0;n.generatedLine!==a;)e+=";",a++;else if(f>0){if(!i.compareByGeneratedPositionsInflated(n,h[f-1]))continue;e+=","}e+=o.encode(n.generatedColumn-s),s=n.generatedColumn,null!=n.source&&(t=this._sources.indexOf(n.source),e+=o.encode(t-g),g=t,e+=o.encode(n.originalLine-1-l),l=n.originalLine-1,e+=o.encode(n.originalColumn-u),u=n.originalColumn,null!=n.name&&(r=this._names.indexOf(n.name),e+=o.encode(r-c),c=r)),p+=e}return p},t.prototype._generateSourcesContent=function(e,n){return e.map(function(e){if(!this._sourcesContents)return null;null!=n&&(e=i.relative(n,e));var r=i.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,r)?this._sourcesContents[r]:null},this)},t.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},t.prototype.toString=function(){return JSON.stringify(this.toJSON())},n.SourceMapGenerator=t},function(e,n,r){function t(e){return e<0?(-e<<1)+1:(e<<1)+0}function o(e){var n=1===(1&e),r=e>>1;return n?-r:r}var i=r(3),s=5,a=1<<s,u=a-1,l=a;n.encode=function(e){var n,r="",o=t(e);do n=o&u,o>>>=s,o>0&&(n|=l),r+=i.encode(n);while(o>0);return r},n.decode=function(e,n,r){var t,a,c=e.length,g=0,p=0;do{if(n>=c)throw new Error("Expected more digits in base 64 VLQ value.");if(a=i.decode(e.charCodeAt(n++)),a===-1)throw new Error("Invalid base64 digit: "+e.charAt(n-1));t=!!(a&l),a&=u,g+=a<<p,p+=s}while(t);r.value=o(g),r.rest=n}},function(e,n){var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");n.encode=function(e){if(0<=e&&e<r.length)return r[e];throw new TypeError("Must be between 0 and 63: "+e)},n.decode=function(e){var n=65,r=90,t=97,o=122,i=48,s=57,a=43,u=47,l=26,c=52;return n<=e&&e<=r?e-n:t<=e&&e<=o?e-t+l:i<=e&&e<=s?e-i+c:e==a?62:e==u?63:-1}},function(e,n){function r(e,n,r){if(n in e)return e[n];if(3===arguments.length)return r;throw new Error('"'+n+'" is a required argument.')}function t(e){var n=e.match(v);return n?{scheme:n[1],auth:n[2],host:n[3],port:n[4],path:n[5]}:null}function o(e){var n="";return e.scheme&&(n+=e.scheme+":"),n+="//",e.auth&&(n+=e.auth+"@"),e.host&&(n+=e.host),e.port&&(n+=":"+e.port),e.path&&(n+=e.path),n}function i(e){var r=e,i=t(e);if(i){if(!i.path)return e;r=i.path}for(var s,a=n.isAbsolute(r),u=r.split(/\/+/),l=0,c=u.length-1;c>=0;c--)s=u[c],"."===s?u.splice(c,1):".."===s?l++:l>0&&(""===s?(u.splice(c+1,l),l=0):(u.splice(c,2),l--));return r=u.join("/"),""===r&&(r=a?"/":"."),i?(i.path=r,o(i)):r}function s(e,n){""===e&&(e="."),""===n&&(n=".");var r=t(n),s=t(e);if(s&&(e=s.path||"/"),r&&!r.scheme)return s&&(r.scheme=s.scheme),o(r);if(r||n.match(y))return n;if(s&&!s.host&&!s.path)return s.host=n,o(s);var a="/"===n.charAt(0)?n:i(e.replace(/\/+$/,"")+"/"+n);return s?(s.path=a,o(s)):a}function a(e,n){""===e&&(e="."),e=e.replace(/\/$/,"");for(var r=0;0!==n.indexOf(e+"/");){var t=e.lastIndexOf("/");if(t<0)return n;if(e=e.slice(0,t),e.match(/^([^\/]+:\/)?\/*$/))return n;++r}return Array(r+1).join("../")+n.substr(e.length+1)}function u(e){return e}function l(e){return g(e)?"$"+e:e}function c(e){return g(e)?e.slice(1):e}function g(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function p(e,n,r){var t=f(e.source,n.source);return 0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t||r?t:(t=e.generatedColumn-n.generatedColumn,0!==t?t:(t=e.generatedLine-n.generatedLine,0!==t?t:f(e.name,n.name)))))}function h(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:(t=e.generatedColumn-n.generatedColumn,0!==t||r?t:(t=f(e.source,n.source),0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t?t:f(e.name,n.name)))))}function f(e,n){return e===n?0:null===e?1:null===n?-1:e>n?1:-1}function d(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:(r=e.generatedColumn-n.generatedColumn,0!==r?r:(r=f(e.source,n.source),0!==r?r:(r=e.originalLine-n.originalLine,0!==r?r:(r=e.originalColumn-n.originalColumn,0!==r?r:f(e.name,n.name)))))}function m(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))}function _(e,n,r){if(n=n||"",e&&("/"!==e[e.length-1]&&"/"!==n[0]&&(e+="/"),n=e+n),r){var a=t(r);if(!a)throw new Error("sourceMapURL could not be parsed");if(a.path){var u=a.path.lastIndexOf("/");u>=0&&(a.path=a.path.substring(0,u+1))}n=s(o(a),n)}return i(n)}n.getArg=r;var v=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,y=/^data:.+\,.+$/;n.urlParse=t,n.urlGenerate=o,n.normalize=i,n.join=s,n.isAbsolute=function(e){return"/"===e.charAt(0)||v.test(e)},n.relative=a;var C=function(){var e=Object.create(null);return!("__proto__"in e)}();n.toSetString=C?u:l,n.fromSetString=C?u:c,n.compareByOriginalPositions=p,n.compareByGeneratedPositionsDeflated=h,n.compareByGeneratedPositionsInflated=d,n.parseSourceMapInput=m,n.computeSourceURL=_},function(e,n,r){function t(){this._array=[],this._set=s?new Map:Object.create(null)}var o=r(4),i=Object.prototype.hasOwnProperty,s="undefined"!=typeof Map;t.fromArray=function(e,n){for(var r=new t,o=0,i=e.length;o<i;o++)r.add(e[o],n);return r},t.prototype.size=function(){return s?this._set.size:Object.getOwnPropertyNames(this._set).length},t.prototype.add=function(e,n){var r=s?e:o.toSetString(e),t=s?this.has(e):i.call(this._set,r),a=this._array.length;t&&!n||this._array.push(e),t||(s?this._set.set(e,a):this._set[r]=a)},t.prototype.has=function(e){if(s)return this._set.has(e);var n=o.toSetString(e);return i.call(this._set,n)},t.prototype.indexOf=function(e){if(s){var n=this._set.get(e);if(n>=0)return n}else{var r=o.toSetString(e);if(i.call(this._set,r))return this._set[r]}throw new Error('"'+e+'" is not in the set.')},t.prototype.at=function(e){if(e>=0&&e<this._array.length)return this._array[e];throw new Error("No element indexed by "+e)},t.prototype.toArray=function(){return this._array.slice()},n.ArraySet=t},function(e,n,r){function t(e,n){var r=e.generatedLine,t=n.generatedLine,o=e.generatedColumn,s=n.generatedColumn;return t>r||t==r&&s>=o||i.compareByGeneratedPositionsInflated(e,n)<=0}function o(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}var i=r(4);o.prototype.unsortedForEach=function(e,n){this._array.forEach(e,n)},o.prototype.add=function(e){t(this._last,e)?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},o.prototype.toArray=function(){return this._sorted||(this._array.sort(i.compareByGeneratedPositionsInflated),this._sorted=!0),this._array},n.MappingList=o},function(e,n,r){function t(e,n){var r=e;return"string"==typeof e&&(r=a.parseSourceMapInput(e)),null!=r.sections?new s(r,n):new o(r,n)}function o(e,n){var r=e;"string"==typeof e&&(r=a.parseSourceMapInput(e));var t=a.getArg(r,"version"),o=a.getArg(r,"sources"),i=a.getArg(r,"names",[]),s=a.getArg(r,"sourceRoot",null),u=a.getArg(r,"sourcesContent",null),c=a.getArg(r,"mappings"),g=a.getArg(r,"file",null);if(t!=this._version)throw new Error("Unsupported version: "+t);s&&(s=a.normalize(s)),o=o.map(String).map(a.normalize).map(function(e){return s&&a.isAbsolute(s)&&a.isAbsolute(e)?a.relative(s,e):e}),this._names=l.fromArray(i.map(String),!0),this._sources=l.fromArray(o,!0),this._absoluteSources=this._sources.toArray().map(function(e){return a.computeSourceURL(s,e,n)}),this.sourceRoot=s,this.sourcesContent=u,this._mappings=c,this._sourceMapURL=n,this.file=g}function i(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function s(e,n){var r=e;"string"==typeof e&&(r=a.parseSourceMapInput(e));var o=a.getArg(r,"version"),i=a.getArg(r,"sections");if(o!=this._version)throw new Error("Unsupported version: "+o);this._sources=new l,this._names=new l;var s={line:-1,column:0};this._sections=i.map(function(e){if(e.url)throw new Error("Support for url field in sections not implemented.");var r=a.getArg(e,"offset"),o=a.getArg(r,"line"),i=a.getArg(r,"column");if(o<s.line||o===s.line&&i<s.column)throw new Error("Section offsets must be ordered and non-overlapping.");return s=r,{generatedOffset:{generatedLine:o+1,generatedColumn:i+1},consumer:new t(a.getArg(e,"map"),n)}})}var a=r(4),u=r(8),l=r(5).ArraySet,c=r(2),g=r(9).quickSort;t.fromSourceMap=function(e,n){return o.fromSourceMap(e,n)},t.prototype._version=3,t.prototype.__generatedMappings=null,Object.defineProperty(t.prototype,"_generatedMappings",{configurable:!0,enumerable:!0,get:function(){return this.__generatedMappings||this._parseMappings(this._mappings,this.sourceRoot),this.__generatedMappings}}),t.prototype.__originalMappings=null,Object.defineProperty(t.prototype,"_originalMappings",{configurable:!0,enumerable:!0,get:function(){return this.__originalMappings||this._parseMappings(this._mappings,this.sourceRoot),this.__originalMappings}}),t.prototype._charIsMappingSeparator=function(e,n){var r=e.charAt(n);return";"===r||","===r},t.prototype._parseMappings=function(e,n){throw new Error("Subclasses must implement _parseMappings")},t.GENERATED_ORDER=1,t.ORIGINAL_ORDER=2,t.GREATEST_LOWER_BOUND=1,t.LEAST_UPPER_BOUND=2,t.prototype.eachMapping=function(e,n,r){var o,i=n||null,s=r||t.GENERATED_ORDER;switch(s){case t.GENERATED_ORDER:o=this._generatedMappings;break;case t.ORIGINAL_ORDER:o=this._originalMappings;break;default:throw new Error("Unknown order of iteration.")}var u=this.sourceRoot;o.map(function(e){var n=null===e.source?null:this._sources.at(e.source);return n=a.computeSourceURL(u,n,this._sourceMapURL),{source:n,generatedLine:e.generatedLine,generatedColumn:e.generatedColumn,originalLine:e.originalLine,originalColumn:e.originalColumn,name:null===e.name?null:this._names.at(e.name)}},this).forEach(e,i)},t.prototype.allGeneratedPositionsFor=function(e){var n=a.getArg(e,"line"),r={source:a.getArg(e,"source"),originalLine:n,originalColumn:a.getArg(e,"column",0)};if(r.source=this._findSourceIndex(r.source),r.source<0)return[];var t=[],o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",a.compareByOriginalPositions,u.LEAST_UPPER_BOUND);if(o>=0){var i=this._originalMappings[o];if(void 0===e.column)for(var s=i.originalLine;i&&i.originalLine===s;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o];else for(var l=i.originalColumn;i&&i.originalLine===n&&i.originalColumn==l;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o]}return t},n.SourceMapConsumer=t,o.prototype=Object.create(t.prototype),o.prototype.consumer=t,o.prototype._findSourceIndex=function(e){var n=e;if(null!=this.sourceRoot&&(n=a.relative(this.sourceRoot,n)),this._sources.has(n))return this._sources.indexOf(n);var r;for(r=0;r<this._absoluteSources.length;++r)if(this._absoluteSources[r]==e)return r;return-1},o.fromSourceMap=function(e,n){var r=Object.create(o.prototype),t=r._names=l.fromArray(e._names.toArray(),!0),s=r._sources=l.fromArray(e._sources.toArray(),!0);r.sourceRoot=e._sourceRoot,r.sourcesContent=e._generateSourcesContent(r._sources.toArray(),r.sourceRoot),r.file=e._file,r._sourceMapURL=n,r._absoluteSources=r._sources.toArray().map(function(e){return a.computeSourceURL(r.sourceRoot,e,n)});for(var u=e._mappings.toArray().slice(),c=r.__generatedMappings=[],p=r.__originalMappings=[],h=0,f=u.length;h<f;h++){var d=u[h],m=new i;m.generatedLine=d.generatedLine,m.generatedColumn=d.generatedColumn,d.source&&(m.source=s.indexOf(d.source),m.originalLine=d.originalLine,m.originalColumn=d.originalColumn,d.name&&(m.name=t.indexOf(d.name)),p.push(m)),c.push(m)}return g(r.__originalMappings,a.compareByOriginalPositions),r},o.prototype._version=3,Object.defineProperty(o.prototype,"sources",{get:function(){return this._absoluteSources.slice()}}),o.prototype._parseMappings=function(e,n){for(var r,t,o,s,u,l=1,p=0,h=0,f=0,d=0,m=0,_=e.length,v=0,y={},C={},S=[],A=[];v<_;)if(";"===e.charAt(v))l++,v++,p=0;else if(","===e.charAt(v))v++;else{for(r=new i,r.generatedLine=l,s=v;s<_&&!this._charIsMappingSeparator(e,s);s++);if(t=e.slice(v,s),o=y[t])v+=t.length;else{for(o=[];v<s;)c.decode(e,v,C),u=C.value,v=C.rest,o.push(u);if(2===o.length)throw new Error("Found a source, but no line and column");if(3===o.length)throw new Error("Found a source and line, but no column");y[t]=o}r.generatedColumn=p+o[0],p=r.generatedColumn,o.length>1&&(r.source=d+o[1],d+=o[1],r.originalLine=h+o[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+o[3],f=r.originalColumn,o.length>4&&(r.name=m+o[4],m+=o[4])),A.push(r),"number"==typeof r.originalLine&&S.push(r)}g(A,a.compareByGeneratedPositionsDeflated),this.__generatedMappings=A,g(S,a.compareByOriginalPositions),this.__originalMappings=S},o.prototype._findMapping=function(e,n,r,t,o,i){if(e[r]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[r]);if(e[t]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[t]);return u.search(e,n,o,i)},o.prototype.computeColumnSpans=function(){for(var e=0;e<this._generatedMappings.length;++e){var n=this._generatedMappings[e];if(e+1<this._generatedMappings.length){var r=this._generatedMappings[e+1];if(n.generatedLine===r.generatedLine){n.lastGeneratedColumn=r.generatedColumn-1;continue}}n.lastGeneratedColumn=1/0}},o.prototype.originalPositionFor=function(e){var n={generatedLine:a.getArg(e,"line"),generatedColumn:a.getArg(e,"column")},r=this._findMapping(n,this._generatedMappings,"generatedLine","generatedColumn",a.compareByGeneratedPositionsDeflated,a.getArg(e,"bias",t.GREATEST_LOWER_BOUND));if(r>=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=a.getArg(o,"source",null);null!==i&&(i=this._sources.at(i),i=a.computeSourceURL(this.sourceRoot,i,this._sourceMapURL));var s=a.getArg(o,"name",null);return null!==s&&(s=this._names.at(s)),{source:i,line:a.getArg(o,"originalLine",null),column:a.getArg(o,"originalColumn",null),name:s}}}return{source:null,line:null,column:null,name:null}},o.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},o.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;var r=this._findSourceIndex(e);if(r>=0)return this.sourcesContent[r];var t=e;null!=this.sourceRoot&&(t=a.relative(this.sourceRoot,t));var o;if(null!=this.sourceRoot&&(o=a.urlParse(this.sourceRoot))){var i=t.replace(/^file:\/\//,"");if("file"==o.scheme&&this._sources.has(i))return this.sourcesContent[this._sources.indexOf(i)];if((!o.path||"/"==o.path)&&this._sources.has("/"+t))return this.sourcesContent[this._sources.indexOf("/"+t)]}if(n)return null;throw new Error('"'+t+'" is not in the SourceMap.')},o.prototype.generatedPositionFor=function(e){var n=a.getArg(e,"source");if(n=this._findSourceIndex(n),n<0)return{line:null,column:null,lastColumn:null};var r={source:n,originalLine:a.getArg(e,"line"),originalColumn:a.getArg(e,"column")},o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",a.compareByOriginalPositions,a.getArg(e,"bias",t.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=o,s.prototype=Object.create(t.prototype),s.prototype.constructor=t,s.prototype._version=3,Object.defineProperty(s.prototype,"sources",{get:function(){for(var e=[],n=0;n<this._sections.length;n++)for(var r=0;r<this._sections[n].consumer.sources.length;r++)e.push(this._sections[n].consumer.sources[r]);return e}}),s.prototype.originalPositionFor=function(e){var n={generatedLine:a.getArg(e,"line"),generatedColumn:a.getArg(e,"column")},r=u.search(n,this._sections,function(e,n){var r=e.generatedLine-n.generatedOffset.generatedLine;return r?r:e.generatedColumn-n.generatedOffset.generatedColumn}),t=this._sections[r];return t?t.consumer.originalPositionFor({line:n.generatedLine-(t.generatedOffset.generatedLine-1),column:n.generatedColumn-(t.generatedOffset.generatedLine===n.generatedLine?t.generatedOffset.generatedColumn-1:0),bias:e.bias}):{source:null,line:null,column:null,name:null}},s.prototype.hasContentsOfAllSources=function(){return this._sections.every(function(e){return e.consumer.hasContentsOfAllSources()})},s.prototype.sourceContentFor=function(e,n){for(var r=0;r<this._sections.length;r++){var t=this._sections[r],o=t.consumer.sourceContentFor(e,!0);if(o)return o}if(n)return null;throw new Error('"'+e+'" is not in the SourceMap.')},s.prototype.generatedPositionFor=function(e){for(var n=0;n<this._sections.length;n++){var r=this._sections[n];if(r.consumer._findSourceIndex(a.getArg(e,"source"))!==-1){var t=r.consumer.generatedPositionFor(e);if(t){var o={line:t.line+(r.generatedOffset.generatedLine-1),column:t.column+(r.generatedOffset.generatedLine===t.line?r.generatedOffset.generatedColumn-1:0)};return o}}}return{line:null,column:null}},s.prototype._parseMappings=function(e,n){this.__generatedMappings=[],this.__originalMappings=[];for(var r=0;r<this._sections.length;r++)for(var t=this._sections[r],o=t.consumer._generatedMappings,i=0;i<o.length;i++){var s=o[i],u=t.consumer._sources.at(s.source);u=a.computeSourceURL(t.consumer.sourceRoot,u,this._sourceMapURL),this._sources.add(u),u=this._sources.indexOf(u);var l=null;s.name&&(l=t.consumer._names.at(s.name),this._names.add(l),l=this._names.indexOf(l));var c={source:u,generatedLine:s.generatedLine+(t.generatedOffset.generatedLine-1),generatedColumn:s.generatedColumn+(t.generatedOffset.generatedLine===s.generatedLine?t.generatedOffset.generatedColumn-1:0),originalLine:s.originalLine,originalColumn:s.originalColumn,name:l};this.__generatedMappings.push(c),"number"==typeof c.originalLine&&this.__originalMappings.push(c)}g(this.__generatedMappings,a.compareByGeneratedPositionsDeflated),g(this.__originalMappings,a.compareByOriginalPositions)},n.IndexedSourceMapConsumer=s},function(e,n){function r(e,t,o,i,s,a){var u=Math.floor((t-e)/2)+e,l=s(o,i[u],!0);return 0===l?u:l>0?t-u>1?r(u,t,o,i,s,a):a==n.LEAST_UPPER_BOUND?t<i.length?t:-1:u:u-e>1?r(e,u,o,i,s,a):a==n.LEAST_UPPER_BOUND?u:e<0?-1:e}n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,t,o,i){if(0===t.length)return-1;var s=r(-1,t.length,e,t,o,i||n.GREATEST_LOWER_BOUND);if(s<0)return-1;for(;s-1>=0&&0===o(t[s],t[s-1],!0);)--s;return s}},function(e,n){function r(e,n,r){var t=e[n];e[n]=e[r],e[r]=t}function t(e,n){return Math.round(e+Math.random()*(n-e))}function o(e,n,i,s){if(i<s){var a=t(i,s),u=i-1;r(e,a,s);for(var l=e[s],c=i;c<s;c++)n(e[c],l)<=0&&(u+=1,r(e,u,c));r(e,u+1,c);var g=u+1;o(e,n,i,g-1),o(e,n,g+1,s)}}n.quickSort=function(e,n){o(e,n,0,e.length-1)}},function(e,n,r){function t(e,n,r,t,o){this.children=[],this.sourceContents={},this.line=null==e?null:e,this.column=null==n?null:n,this.source=null==r?null:r,this.name=null==o?null:o,this[u]=!0,null!=t&&this.add(t)}var o=r(1).SourceMapGenerator,i=r(4),s=/(\r?\n)/,a=10,u="$$$isSourceNode$$$";t.fromStringWithSourceMap=function(e,n,r){function o(e,n){if(null===e||void 0===e.source)a.add(n);else{var o=r?i.join(r,e.source):e.source;a.add(new t(e.originalLine,e.originalColumn,o,n,e.name))}}var a=new t,u=e.split(s),l=0,c=function(){function e(){return l<u.length?u[l++]:void 0}var n=e(),r=e()||"";return n+r},g=1,p=0,h=null;return n.eachMapping(function(e){if(null!==h){if(!(g<e.generatedLine)){var n=u[l]||"",r=n.substr(0,e.generatedColumn-p);return u[l]=n.substr(e.generatedColumn-p),p=e.generatedColumn,o(h,r),void(h=e)}o(h,c()),g++,p=0}for(;g<e.generatedLine;)a.add(c()),g++;if(p<e.generatedColumn){var n=u[l]||"";a.add(n.substr(0,e.generatedColumn)),u[l]=n.substr(e.generatedColumn),p=e.generatedColumn}h=e},this),l<u.length&&(h&&o(h,c()),a.add(u.splice(l).join(""))),n.sources.forEach(function(e){var t=n.sourceContentFor(e);null!=t&&(null!=r&&(e=i.join(r,e)),a.setSourceContent(e,t))}),a},t.prototype.add=function(e){if(Array.isArray(e))e.forEach(function(e){this.add(e)},this);else{if(!e[u]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);e&&this.children.push(e)}return this},t.prototype.prepend=function(e){if(Array.isArray(e))for(var n=e.length-1;n>=0;n--)this.prepend(e[n]);else{if(!e[u]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);this.children.unshift(e)}return this},t.prototype.walk=function(e){for(var n,r=0,t=this.children.length;r<t;r++)n=this.children[r],n[u]?n.walk(e):""!==n&&e(n,{source:this.source,line:this.line,column:this.column,name:this.name})},t.prototype.join=function(e){var n,r,t=this.children.length;if(t>0){for(n=[],r=0;r<t-1;r++)n.push(this.children[r]),n.push(e);n.push(this.children[r]),this.children=n}return this},t.prototype.replaceRight=function(e,n){var r=this.children[this.children.length-1];return r[u]?r.replaceRight(e,n):"string"==typeof r?this.children[this.children.length-1]=r.replace(e,n):this.children.push("".replace(e,n)),this},t.prototype.setSourceContent=function(e,n){this.sourceContents[i.toSetString(e)]=n},t.prototype.walkSourceContents=function(e){for(var n=0,r=this.children.length;n<r;n++)this.children[n][u]&&this.children[n].walkSourceContents(e);for(var t=Object.keys(this.sourceContents),n=0,r=t.length;n<r;n++)e(i.fromSetString(t[n]),this.sourceContents[t[n]])},t.prototype.toString=function(){var e="";return this.walk(function(n){e+=n}),e},t.prototype.toStringWithSourceMap=function(e){var n={code:"",line:1,column:0},r=new o(e),t=!1,i=null,s=null,u=null,l=null;return this.walk(function(e,o){n.code+=e,null!==o.source&&null!==o.line&&null!==o.column?(i===o.source&&s===o.line&&u===o.column&&l===o.name||r.addMapping({source:o.source,original:{line:o.line,column:o.column},generated:{line:n.line,column:n.column},name:o.name}),i=o.source,s=o.line,u=o.column,l=o.name,t=!0):t&&(r.addMapping({generated:{line:n.line,column:n.column}}),i=null,t=!1);for(var c=0,g=e.length;c<g;c++)e.charCodeAt(c)===a?(n.line++,n.column=0,c+1===g?(i=null,t=!1):t&&r.addMapping({source:o.source,original:{line:o.line,column:o.column},generated:{line:n.line,column:n.column},name:o.name})):n.column++}),this.walkSourceContents(function(e,n){r.setSourceContent(e,n)}),{code:n.code,map:r}},n.SourceNode=t}])});
//# sourceMappingURL=source-map.min.js.map{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///source-map.min.js","webpack:///webpack/bootstrap 0fd5815da764db5fb9fe","webpack:///./source-map.js","webpack:///./lib/source-map-generator.js","webpack:///./lib/base64-vlq.js","webpack:///./lib/base64.js","webpack:///./lib/util.js","webpack:///./lib/array-set.js","webpack:///./lib/mapping-list.js","webpack:///./lib/source-map-consumer.js","webpack:///./lib/binary-search.js","webpack:///./lib/quick-sort.js","webpack:///./lib/source-node.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","SourceMapGenerator","SourceMapConsumer","SourceNode","aArgs","_file","util","getArg","_sourceRoot","_skipValidation","_sources","ArraySet","_names","_mappings","MappingList","_sourcesContents","base64VLQ","prototype","_version","fromSourceMap","aSourceMapConsumer","sourceRoot","generator","file","eachMapping","mapping","newMapping","generated","line","generatedLine","column","generatedColumn","source","relative","original","originalLine","originalColumn","name","addMapping","sources","forEach","sourceFile","sourceRelative","has","add","content","sourceContentFor","setSourceContent","_validateMapping","String","aSourceFile","aSourceContent","Object","create","toSetString","keys","length","applySourceMap","aSourceMapPath","Error","newSources","newNames","unsortedForEach","originalPositionFor","join","aGenerated","aOriginal","aSource","aName","JSON","stringify","_serializeMappings","next","nameIdx","sourceIdx","previousGeneratedColumn","previousGeneratedLine","previousOriginalColumn","previousOriginalLine","previousName","previousSource","result","mappings","toArray","i","len","compareByGeneratedPositionsInflated","encode","indexOf","_generateSourcesContent","aSources","aSourceRoot","map","key","hasOwnProperty","toJSON","version","names","sourcesContent","toString","toVLQSigned","aValue","fromVLQSigned","isNegative","shifted","base64","VLQ_BASE_SHIFT","VLQ_BASE","VLQ_BASE_MASK","VLQ_CONTINUATION_BIT","digit","encoded","vlq","decode","aStr","aIndex","aOutParam","continuation","strLen","shift","charCodeAt","charAt","value","rest","intToCharMap","split","number","TypeError","charCode","bigA","bigZ","littleA","littleZ","zero","nine","plus","slash","littleOffset","numberOffset","aDefaultValue","arguments","urlParse","aUrl","match","urlRegexp","scheme","auth","host","port","path","urlGenerate","aParsedUrl","url","normalize","aPath","part","isAbsolute","parts","up","splice","aRoot","aPathUrl","aRootUrl","dataUrlRegexp","joined","replace","level","index","lastIndexOf","slice","Array","substr","identity","s","isProtoString","fromSetString","compareByOriginalPositions","mappingA","mappingB","onlyCompareOriginal","cmp","strcmp","compareByGeneratedPositionsDeflated","onlyCompareGenerated","aStr1","aStr2","parseSourceMapInput","str","parse","computeSourceURL","sourceURL","sourceMapURL","parsed","substring","test","supportsNullProto","obj","_array","_set","hasNativeMap","Map","fromArray","aArray","aAllowDuplicates","set","size","getOwnPropertyNames","sStr","isDuplicate","idx","push","get","at","aIdx","generatedPositionAfter","lineA","lineB","columnA","columnB","_sorted","_last","aCallback","aThisArg","aMapping","sort","aSourceMap","aSourceMapURL","sourceMap","sections","IndexedSourceMapConsumer","BasicSourceMapConsumer","_absoluteSources","_sourceMapURL","Mapping","lastOffset","_sections","offset","offsetLine","offsetColumn","generatedOffset","consumer","binarySearch","quickSort","__generatedMappings","defineProperty","configurable","enumerable","_parseMappings","__originalMappings","_charIsMappingSeparator","GENERATED_ORDER","ORIGINAL_ORDER","GREATEST_LOWER_BOUND","LEAST_UPPER_BOUND","aContext","aOrder","context","order","_generatedMappings","_originalMappings","allGeneratedPositionsFor","needle","_findSourceIndex","_findMapping","undefined","lastColumn","relativeSource","smc","generatedMappings","destGeneratedMappings","destOriginalMappings","srcMapping","destMapping","segment","end","cachedSegments","temp","originalMappings","aNeedle","aMappings","aLineName","aColumnName","aComparator","aBias","search","computeColumnSpans","nextMapping","lastGeneratedColumn","Infinity","hasContentsOfAllSources","some","sc","nullOnMissing","fileUriAbsPath","generatedPositionFor","constructor","j","sectionIndex","section","bias","every","generatedPosition","ret","sectionMappings","adjustedMapping","recursiveSearch","aLow","aHigh","aHaystack","aCompare","mid","Math","floor","swap","ary","x","y","randomIntInRange","low","high","round","random","doQuickSort","comparator","r","pivotIndex","pivot","q","aLine","aColumn","aChunks","children","sourceContents","isSourceNode","REGEX_NEWLINE","NEWLINE_CODE","fromStringWithSourceMap","aGeneratedCode","aRelativePath","addMappingWithCode","code","node","remainingLines","remainingLinesIndex","shiftNextLine","getNextLine","lineContents","newLine","lastGeneratedLine","lastMapping","nextLine","aChunk","isArray","chunk","prepend","unshift","walk","aFn","aSep","newChildren","replaceRight","aPattern","aReplacement","lastChild","walkSourceContents","toStringWithSourceMap","sourceMappingActive","lastOriginalSource","lastOriginalLine","lastOriginalColumn","lastOriginalName","sourceContent"],"mappings":"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","file":"source-map.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sourceMap\"] = factory();\n\telse\n\t\troot[\"sourceMap\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sourceMap\"] = factory();\n\telse\n\t\troot[\"sourceMap\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t * Copyright 2009-2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE.txt or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\texports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\texports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;\n\texports.SourceNode = __webpack_require__(10).SourceNode;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar base64VLQ = __webpack_require__(2);\n\tvar util = __webpack_require__(4);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar MappingList = __webpack_require__(6).MappingList;\n\t\n\t/**\n\t * An instance of the SourceMapGenerator represents a source map which is\n\t * being built incrementally. You may pass an object with the following\n\t * properties:\n\t *\n\t *   - file: The filename of the generated source.\n\t *   - sourceRoot: A root for all relative URLs in this source map.\n\t */\n\tfunction SourceMapGenerator(aArgs) {\n\t  if (!aArgs) {\n\t    aArgs = {};\n\t  }\n\t  this._file = util.getArg(aArgs, 'file', null);\n\t  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n\t  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n\t  this._sources = new ArraySet();\n\t  this._names = new ArraySet();\n\t  this._mappings = new MappingList();\n\t  this._sourcesContents = null;\n\t}\n\t\n\tSourceMapGenerator.prototype._version = 3;\n\t\n\t/**\n\t * Creates a new SourceMapGenerator based on a SourceMapConsumer\n\t *\n\t * @param aSourceMapConsumer The SourceMap.\n\t */\n\tSourceMapGenerator.fromSourceMap =\n\t  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n\t    var sourceRoot = aSourceMapConsumer.sourceRoot;\n\t    var generator = new SourceMapGenerator({\n\t      file: aSourceMapConsumer.file,\n\t      sourceRoot: sourceRoot\n\t    });\n\t    aSourceMapConsumer.eachMapping(function (mapping) {\n\t      var newMapping = {\n\t        generated: {\n\t          line: mapping.generatedLine,\n\t          column: mapping.generatedColumn\n\t        }\n\t      };\n\t\n\t      if (mapping.source != null) {\n\t        newMapping.source = mapping.source;\n\t        if (sourceRoot != null) {\n\t          newMapping.source = util.relative(sourceRoot, newMapping.source);\n\t        }\n\t\n\t        newMapping.original = {\n\t          line: mapping.originalLine,\n\t          column: mapping.originalColumn\n\t        };\n\t\n\t        if (mapping.name != null) {\n\t          newMapping.name = mapping.name;\n\t        }\n\t      }\n\t\n\t      generator.addMapping(newMapping);\n\t    });\n\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t      var sourceRelative = sourceFile;\n\t      if (sourceRoot !== null) {\n\t        sourceRelative = util.relative(sourceRoot, sourceFile);\n\t      }\n\t\n\t      if (!generator._sources.has(sourceRelative)) {\n\t        generator._sources.add(sourceRelative);\n\t      }\n\t\n\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t      if (content != null) {\n\t        generator.setSourceContent(sourceFile, content);\n\t      }\n\t    });\n\t    return generator;\n\t  };\n\t\n\t/**\n\t * Add a single mapping from original source line and column to the generated\n\t * source's line and column for this source map being created. The mapping\n\t * object should have the following properties:\n\t *\n\t *   - generated: An object with the generated line and column positions.\n\t *   - original: An object with the original line and column positions.\n\t *   - source: The original source file (relative to the sourceRoot).\n\t *   - name: An optional original token name for this mapping.\n\t */\n\tSourceMapGenerator.prototype.addMapping =\n\t  function SourceMapGenerator_addMapping(aArgs) {\n\t    var generated = util.getArg(aArgs, 'generated');\n\t    var original = util.getArg(aArgs, 'original', null);\n\t    var source = util.getArg(aArgs, 'source', null);\n\t    var name = util.getArg(aArgs, 'name', null);\n\t\n\t    if (!this._skipValidation) {\n\t      this._validateMapping(generated, original, source, name);\n\t    }\n\t\n\t    if (source != null) {\n\t      source = String(source);\n\t      if (!this._sources.has(source)) {\n\t        this._sources.add(source);\n\t      }\n\t    }\n\t\n\t    if (name != null) {\n\t      name = String(name);\n\t      if (!this._names.has(name)) {\n\t        this._names.add(name);\n\t      }\n\t    }\n\t\n\t    this._mappings.add({\n\t      generatedLine: generated.line,\n\t      generatedColumn: generated.column,\n\t      originalLine: original != null && original.line,\n\t      originalColumn: original != null && original.column,\n\t      source: source,\n\t      name: name\n\t    });\n\t  };\n\t\n\t/**\n\t * Set the source content for a source file.\n\t */\n\tSourceMapGenerator.prototype.setSourceContent =\n\t  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n\t    var source = aSourceFile;\n\t    if (this._sourceRoot != null) {\n\t      source = util.relative(this._sourceRoot, source);\n\t    }\n\t\n\t    if (aSourceContent != null) {\n\t      // Add the source content to the _sourcesContents map.\n\t      // Create a new _sourcesContents map if the property is null.\n\t      if (!this._sourcesContents) {\n\t        this._sourcesContents = Object.create(null);\n\t      }\n\t      this._sourcesContents[util.toSetString(source)] = aSourceContent;\n\t    } else if (this._sourcesContents) {\n\t      // Remove the source file from the _sourcesContents map.\n\t      // If the _sourcesContents map is empty, set the property to null.\n\t      delete this._sourcesContents[util.toSetString(source)];\n\t      if (Object.keys(this._sourcesContents).length === 0) {\n\t        this._sourcesContents = null;\n\t      }\n\t    }\n\t  };\n\t\n\t/**\n\t * Applies the mappings of a sub-source-map for a specific source file to the\n\t * source map being generated. Each mapping to the supplied source file is\n\t * rewritten using the supplied source map. Note: The resolution for the\n\t * resulting mappings is the minimium of this map and the supplied map.\n\t *\n\t * @param aSourceMapConsumer The source map to be applied.\n\t * @param aSourceFile Optional. The filename of the source file.\n\t *        If omitted, SourceMapConsumer's file property will be used.\n\t * @param aSourceMapPath Optional. The dirname of the path to the source map\n\t *        to be applied. If relative, it is relative to the SourceMapConsumer.\n\t *        This parameter is needed when the two source maps aren't in the same\n\t *        directory, and the source map to be applied contains relative source\n\t *        paths. If so, those relative source paths need to be rewritten\n\t *        relative to the SourceMapGenerator.\n\t */\n\tSourceMapGenerator.prototype.applySourceMap =\n\t  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n\t    var sourceFile = aSourceFile;\n\t    // If aSourceFile is omitted, we will use the file property of the SourceMap\n\t    if (aSourceFile == null) {\n\t      if (aSourceMapConsumer.file == null) {\n\t        throw new Error(\n\t          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n\t          'or the source map\\'s \"file\" property. Both were omitted.'\n\t        );\n\t      }\n\t      sourceFile = aSourceMapConsumer.file;\n\t    }\n\t    var sourceRoot = this._sourceRoot;\n\t    // Make \"sourceFile\" relative if an absolute Url is passed.\n\t    if (sourceRoot != null) {\n\t      sourceFile = util.relative(sourceRoot, sourceFile);\n\t    }\n\t    // Applying the SourceMap can add and remove items from the sources and\n\t    // the names array.\n\t    var newSources = new ArraySet();\n\t    var newNames = new ArraySet();\n\t\n\t    // Find mappings for the \"sourceFile\"\n\t    this._mappings.unsortedForEach(function (mapping) {\n\t      if (mapping.source === sourceFile && mapping.originalLine != null) {\n\t        // Check if it can be mapped by the source map, then update the mapping.\n\t        var original = aSourceMapConsumer.originalPositionFor({\n\t          line: mapping.originalLine,\n\t          column: mapping.originalColumn\n\t        });\n\t        if (original.source != null) {\n\t          // Copy mapping\n\t          mapping.source = original.source;\n\t          if (aSourceMapPath != null) {\n\t            mapping.source = util.join(aSourceMapPath, mapping.source)\n\t          }\n\t          if (sourceRoot != null) {\n\t            mapping.source = util.relative(sourceRoot, mapping.source);\n\t          }\n\t          mapping.originalLine = original.line;\n\t          mapping.originalColumn = original.column;\n\t          if (original.name != null) {\n\t            mapping.name = original.name;\n\t          }\n\t        }\n\t      }\n\t\n\t      var source = mapping.source;\n\t      if (source != null && !newSources.has(source)) {\n\t        newSources.add(source);\n\t      }\n\t\n\t      var name = mapping.name;\n\t      if (name != null && !newNames.has(name)) {\n\t        newNames.add(name);\n\t      }\n\t\n\t    }, this);\n\t    this._sources = newSources;\n\t    this._names = newNames;\n\t\n\t    // Copy sourcesContents of applied map.\n\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t      if (content != null) {\n\t        if (aSourceMapPath != null) {\n\t          sourceFile = util.join(aSourceMapPath, sourceFile);\n\t        }\n\t        if (sourceRoot != null) {\n\t          sourceFile = util.relative(sourceRoot, sourceFile);\n\t        }\n\t        this.setSourceContent(sourceFile, content);\n\t      }\n\t    }, this);\n\t  };\n\t\n\t/**\n\t * A mapping can have one of the three levels of data:\n\t *\n\t *   1. Just the generated position.\n\t *   2. The Generated position, original position, and original source.\n\t *   3. Generated and original position, original source, as well as a name\n\t *      token.\n\t *\n\t * To maintain consistency, we validate that any new mapping being added falls\n\t * in to one of these categories.\n\t */\n\tSourceMapGenerator.prototype._validateMapping =\n\t  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n\t                                              aName) {\n\t    // When aOriginal is truthy but has empty values for .line and .column,\n\t    // it is most likely a programmer error. In this case we throw a very\n\t    // specific error message to try to guide them the right way.\n\t    // For example: https://github.com/Polymer/polymer-bundler/pull/519\n\t    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n\t        throw new Error(\n\t            'original.line and original.column are not numbers -- you probably meant to omit ' +\n\t            'the original mapping entirely and only map the generated position. If so, pass ' +\n\t            'null for the original mapping instead of an object with empty or null values.'\n\t        );\n\t    }\n\t\n\t    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t        && aGenerated.line > 0 && aGenerated.column >= 0\n\t        && !aOriginal && !aSource && !aName) {\n\t      // Case 1.\n\t      return;\n\t    }\n\t    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t             && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n\t             && aGenerated.line > 0 && aGenerated.column >= 0\n\t             && aOriginal.line > 0 && aOriginal.column >= 0\n\t             && aSource) {\n\t      // Cases 2 and 3.\n\t      return;\n\t    }\n\t    else {\n\t      throw new Error('Invalid mapping: ' + JSON.stringify({\n\t        generated: aGenerated,\n\t        source: aSource,\n\t        original: aOriginal,\n\t        name: aName\n\t      }));\n\t    }\n\t  };\n\t\n\t/**\n\t * Serialize the accumulated mappings in to the stream of base 64 VLQs\n\t * specified by the source map format.\n\t */\n\tSourceMapGenerator.prototype._serializeMappings =\n\t  function SourceMapGenerator_serializeMappings() {\n\t    var previousGeneratedColumn = 0;\n\t    var previousGeneratedLine = 1;\n\t    var previousOriginalColumn = 0;\n\t    var previousOriginalLine = 0;\n\t    var previousName = 0;\n\t    var previousSource = 0;\n\t    var result = '';\n\t    var next;\n\t    var mapping;\n\t    var nameIdx;\n\t    var sourceIdx;\n\t\n\t    var mappings = this._mappings.toArray();\n\t    for (var i = 0, len = mappings.length; i < len; i++) {\n\t      mapping = mappings[i];\n\t      next = ''\n\t\n\t      if (mapping.generatedLine !== previousGeneratedLine) {\n\t        previousGeneratedColumn = 0;\n\t        while (mapping.generatedLine !== previousGeneratedLine) {\n\t          next += ';';\n\t          previousGeneratedLine++;\n\t        }\n\t      }\n\t      else {\n\t        if (i > 0) {\n\t          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n\t            continue;\n\t          }\n\t          next += ',';\n\t        }\n\t      }\n\t\n\t      next += base64VLQ.encode(mapping.generatedColumn\n\t                                 - previousGeneratedColumn);\n\t      previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t      if (mapping.source != null) {\n\t        sourceIdx = this._sources.indexOf(mapping.source);\n\t        next += base64VLQ.encode(sourceIdx - previousSource);\n\t        previousSource = sourceIdx;\n\t\n\t        // lines are stored 0-based in SourceMap spec version 3\n\t        next += base64VLQ.encode(mapping.originalLine - 1\n\t                                   - previousOriginalLine);\n\t        previousOriginalLine = mapping.originalLine - 1;\n\t\n\t        next += base64VLQ.encode(mapping.originalColumn\n\t                                   - previousOriginalColumn);\n\t        previousOriginalColumn = mapping.originalColumn;\n\t\n\t        if (mapping.name != null) {\n\t          nameIdx = this._names.indexOf(mapping.name);\n\t          next += base64VLQ.encode(nameIdx - previousName);\n\t          previousName = nameIdx;\n\t        }\n\t      }\n\t\n\t      result += next;\n\t    }\n\t\n\t    return result;\n\t  };\n\t\n\tSourceMapGenerator.prototype._generateSourcesContent =\n\t  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n\t    return aSources.map(function (source) {\n\t      if (!this._sourcesContents) {\n\t        return null;\n\t      }\n\t      if (aSourceRoot != null) {\n\t        source = util.relative(aSourceRoot, source);\n\t      }\n\t      var key = util.toSetString(source);\n\t      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n\t        ? this._sourcesContents[key]\n\t        : null;\n\t    }, this);\n\t  };\n\t\n\t/**\n\t * Externalize the source map.\n\t */\n\tSourceMapGenerator.prototype.toJSON =\n\t  function SourceMapGenerator_toJSON() {\n\t    var map = {\n\t      version: this._version,\n\t      sources: this._sources.toArray(),\n\t      names: this._names.toArray(),\n\t      mappings: this._serializeMappings()\n\t    };\n\t    if (this._file != null) {\n\t      map.file = this._file;\n\t    }\n\t    if (this._sourceRoot != null) {\n\t      map.sourceRoot = this._sourceRoot;\n\t    }\n\t    if (this._sourcesContents) {\n\t      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n\t    }\n\t\n\t    return map;\n\t  };\n\t\n\t/**\n\t * Render the source map being generated to a string.\n\t */\n\tSourceMapGenerator.prototype.toString =\n\t  function SourceMapGenerator_toString() {\n\t    return JSON.stringify(this.toJSON());\n\t  };\n\t\n\texports.SourceMapGenerator = SourceMapGenerator;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t *\n\t * Based on the Base 64 VLQ implementation in Closure Compiler:\n\t * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n\t *\n\t * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n\t * Redistribution and use in source and binary forms, with or without\n\t * modification, are permitted provided that the following conditions are\n\t * met:\n\t *\n\t *  * Redistributions of source code must retain the above copyright\n\t *    notice, this list of conditions and the following disclaimer.\n\t *  * Redistributions in binary form must reproduce the above\n\t *    copyright notice, this list of conditions and the following\n\t *    disclaimer in the documentation and/or other materials provided\n\t *    with the distribution.\n\t *  * Neither the name of Google Inc. nor the names of its\n\t *    contributors may be used to endorse or promote products derived\n\t *    from this software without specific prior written permission.\n\t *\n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\t * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n\t * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n\t * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n\t * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n\t * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n\t * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n\t * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n\t * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t */\n\t\n\tvar base64 = __webpack_require__(3);\n\t\n\t// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n\t// length quantities we use in the source map spec, the first bit is the sign,\n\t// the next four bits are the actual value, and the 6th bit is the\n\t// continuation bit. The continuation bit tells us whether there are more\n\t// digits in this value following this digit.\n\t//\n\t//   Continuation\n\t//   |    Sign\n\t//   |    |\n\t//   V    V\n\t//   101011\n\t\n\tvar VLQ_BASE_SHIFT = 5;\n\t\n\t// binary: 100000\n\tvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\t\n\t// binary: 011111\n\tvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\t\n\t// binary: 100000\n\tvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\t\n\t/**\n\t * Converts from a two-complement value to a value where the sign bit is\n\t * placed in the least significant bit.  For example, as decimals:\n\t *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n\t *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n\t */\n\tfunction toVLQSigned(aValue) {\n\t  return aValue < 0\n\t    ? ((-aValue) << 1) + 1\n\t    : (aValue << 1) + 0;\n\t}\n\t\n\t/**\n\t * Converts to a two-complement value from a value where the sign bit is\n\t * placed in the least significant bit.  For example, as decimals:\n\t *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n\t *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n\t */\n\tfunction fromVLQSigned(aValue) {\n\t  var isNegative = (aValue & 1) === 1;\n\t  var shifted = aValue >> 1;\n\t  return isNegative\n\t    ? -shifted\n\t    : shifted;\n\t}\n\t\n\t/**\n\t * Returns the base 64 VLQ encoded value.\n\t */\n\texports.encode = function base64VLQ_encode(aValue) {\n\t  var encoded = \"\";\n\t  var digit;\n\t\n\t  var vlq = toVLQSigned(aValue);\n\t\n\t  do {\n\t    digit = vlq & VLQ_BASE_MASK;\n\t    vlq >>>= VLQ_BASE_SHIFT;\n\t    if (vlq > 0) {\n\t      // There are still more digits in this value, so we must make sure the\n\t      // continuation bit is marked.\n\t      digit |= VLQ_CONTINUATION_BIT;\n\t    }\n\t    encoded += base64.encode(digit);\n\t  } while (vlq > 0);\n\t\n\t  return encoded;\n\t};\n\t\n\t/**\n\t * Decodes the next base 64 VLQ value from the given string and returns the\n\t * value and the rest of the string via the out parameter.\n\t */\n\texports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n\t  var strLen = aStr.length;\n\t  var result = 0;\n\t  var shift = 0;\n\t  var continuation, digit;\n\t\n\t  do {\n\t    if (aIndex >= strLen) {\n\t      throw new Error(\"Expected more digits in base 64 VLQ value.\");\n\t    }\n\t\n\t    digit = base64.decode(aStr.charCodeAt(aIndex++));\n\t    if (digit === -1) {\n\t      throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n\t    }\n\t\n\t    continuation = !!(digit & VLQ_CONTINUATION_BIT);\n\t    digit &= VLQ_BASE_MASK;\n\t    result = result + (digit << shift);\n\t    shift += VLQ_BASE_SHIFT;\n\t  } while (continuation);\n\t\n\t  aOutParam.value = fromVLQSigned(result);\n\t  aOutParam.rest = aIndex;\n\t};\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\t\n\t/**\n\t * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n\t */\n\texports.encode = function (number) {\n\t  if (0 <= number && number < intToCharMap.length) {\n\t    return intToCharMap[number];\n\t  }\n\t  throw new TypeError(\"Must be between 0 and 63: \" + number);\n\t};\n\t\n\t/**\n\t * Decode a single base 64 character code digit to an integer. Returns -1 on\n\t * failure.\n\t */\n\texports.decode = function (charCode) {\n\t  var bigA = 65;     // 'A'\n\t  var bigZ = 90;     // 'Z'\n\t\n\t  var littleA = 97;  // 'a'\n\t  var littleZ = 122; // 'z'\n\t\n\t  var zero = 48;     // '0'\n\t  var nine = 57;     // '9'\n\t\n\t  var plus = 43;     // '+'\n\t  var slash = 47;    // '/'\n\t\n\t  var littleOffset = 26;\n\t  var numberOffset = 52;\n\t\n\t  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n\t  if (bigA <= charCode && charCode <= bigZ) {\n\t    return (charCode - bigA);\n\t  }\n\t\n\t  // 26 - 51: abcdefghijklmnopqrstuvwxyz\n\t  if (littleA <= charCode && charCode <= littleZ) {\n\t    return (charCode - littleA + littleOffset);\n\t  }\n\t\n\t  // 52 - 61: 0123456789\n\t  if (zero <= charCode && charCode <= nine) {\n\t    return (charCode - zero + numberOffset);\n\t  }\n\t\n\t  // 62: +\n\t  if (charCode == plus) {\n\t    return 62;\n\t  }\n\t\n\t  // 63: /\n\t  if (charCode == slash) {\n\t    return 63;\n\t  }\n\t\n\t  // Invalid base64 digit.\n\t  return -1;\n\t};\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t/**\n\t * This is a helper function for getting values from parameter/options\n\t * objects.\n\t *\n\t * @param args The object we are extracting values from\n\t * @param name The name of the property we are getting.\n\t * @param defaultValue An optional value to return if the property is missing\n\t * from the object. If this is not specified and the property is missing, an\n\t * error will be thrown.\n\t */\n\tfunction getArg(aArgs, aName, aDefaultValue) {\n\t  if (aName in aArgs) {\n\t    return aArgs[aName];\n\t  } else if (arguments.length === 3) {\n\t    return aDefaultValue;\n\t  } else {\n\t    throw new Error('\"' + aName + '\" is a required argument.');\n\t  }\n\t}\n\texports.getArg = getArg;\n\t\n\tvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\n\tvar dataUrlRegexp = /^data:.+\\,.+$/;\n\t\n\tfunction urlParse(aUrl) {\n\t  var match = aUrl.match(urlRegexp);\n\t  if (!match) {\n\t    return null;\n\t  }\n\t  return {\n\t    scheme: match[1],\n\t    auth: match[2],\n\t    host: match[3],\n\t    port: match[4],\n\t    path: match[5]\n\t  };\n\t}\n\texports.urlParse = urlParse;\n\t\n\tfunction urlGenerate(aParsedUrl) {\n\t  var url = '';\n\t  if (aParsedUrl.scheme) {\n\t    url += aParsedUrl.scheme + ':';\n\t  }\n\t  url += '//';\n\t  if (aParsedUrl.auth) {\n\t    url += aParsedUrl.auth + '@';\n\t  }\n\t  if (aParsedUrl.host) {\n\t    url += aParsedUrl.host;\n\t  }\n\t  if (aParsedUrl.port) {\n\t    url += \":\" + aParsedUrl.port\n\t  }\n\t  if (aParsedUrl.path) {\n\t    url += aParsedUrl.path;\n\t  }\n\t  return url;\n\t}\n\texports.urlGenerate = urlGenerate;\n\t\n\t/**\n\t * Normalizes a path, or the path portion of a URL:\n\t *\n\t * - Replaces consecutive slashes with one slash.\n\t * - Removes unnecessary '.' parts.\n\t * - Removes unnecessary '<dir>/..' parts.\n\t *\n\t * Based on code in the Node.js 'path' core module.\n\t *\n\t * @param aPath The path or url to normalize.\n\t */\n\tfunction normalize(aPath) {\n\t  var path = aPath;\n\t  var url = urlParse(aPath);\n\t  if (url) {\n\t    if (!url.path) {\n\t      return aPath;\n\t    }\n\t    path = url.path;\n\t  }\n\t  var isAbsolute = exports.isAbsolute(path);\n\t\n\t  var parts = path.split(/\\/+/);\n\t  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n\t    part = parts[i];\n\t    if (part === '.') {\n\t      parts.splice(i, 1);\n\t    } else if (part === '..') {\n\t      up++;\n\t    } else if (up > 0) {\n\t      if (part === '') {\n\t        // The first part is blank if the path is absolute. Trying to go\n\t        // above the root is a no-op. Therefore we can remove all '..' parts\n\t        // directly after the root.\n\t        parts.splice(i + 1, up);\n\t        up = 0;\n\t      } else {\n\t        parts.splice(i, 2);\n\t        up--;\n\t      }\n\t    }\n\t  }\n\t  path = parts.join('/');\n\t\n\t  if (path === '') {\n\t    path = isAbsolute ? '/' : '.';\n\t  }\n\t\n\t  if (url) {\n\t    url.path = path;\n\t    return urlGenerate(url);\n\t  }\n\t  return path;\n\t}\n\texports.normalize = normalize;\n\t\n\t/**\n\t * Joins two paths/URLs.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be joined with the root.\n\t *\n\t * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n\t *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n\t *   first.\n\t * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n\t *   is updated with the result and aRoot is returned. Otherwise the result\n\t *   is returned.\n\t *   - If aPath is absolute, the result is aPath.\n\t *   - Otherwise the two paths are joined with a slash.\n\t * - Joining for example 'http://' and 'www.example.com' is also supported.\n\t */\n\tfunction join(aRoot, aPath) {\n\t  if (aRoot === \"\") {\n\t    aRoot = \".\";\n\t  }\n\t  if (aPath === \"\") {\n\t    aPath = \".\";\n\t  }\n\t  var aPathUrl = urlParse(aPath);\n\t  var aRootUrl = urlParse(aRoot);\n\t  if (aRootUrl) {\n\t    aRoot = aRootUrl.path || '/';\n\t  }\n\t\n\t  // `join(foo, '//www.example.org')`\n\t  if (aPathUrl && !aPathUrl.scheme) {\n\t    if (aRootUrl) {\n\t      aPathUrl.scheme = aRootUrl.scheme;\n\t    }\n\t    return urlGenerate(aPathUrl);\n\t  }\n\t\n\t  if (aPathUrl || aPath.match(dataUrlRegexp)) {\n\t    return aPath;\n\t  }\n\t\n\t  // `join('http://', 'www.example.com')`\n\t  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n\t    aRootUrl.host = aPath;\n\t    return urlGenerate(aRootUrl);\n\t  }\n\t\n\t  var joined = aPath.charAt(0) === '/'\n\t    ? aPath\n\t    : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\t\n\t  if (aRootUrl) {\n\t    aRootUrl.path = joined;\n\t    return urlGenerate(aRootUrl);\n\t  }\n\t  return joined;\n\t}\n\texports.join = join;\n\t\n\texports.isAbsolute = function (aPath) {\n\t  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\n\t};\n\t\n\t/**\n\t * Make a path relative to a URL or another path.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be made relative to aRoot.\n\t */\n\tfunction relative(aRoot, aPath) {\n\t  if (aRoot === \"\") {\n\t    aRoot = \".\";\n\t  }\n\t\n\t  aRoot = aRoot.replace(/\\/$/, '');\n\t\n\t  // It is possible for the path to be above the root. In this case, simply\n\t  // checking whether the root is a prefix of the path won't work. Instead, we\n\t  // need to remove components from the root one by one, until either we find\n\t  // a prefix that fits, or we run out of components to remove.\n\t  var level = 0;\n\t  while (aPath.indexOf(aRoot + '/') !== 0) {\n\t    var index = aRoot.lastIndexOf(\"/\");\n\t    if (index < 0) {\n\t      return aPath;\n\t    }\n\t\n\t    // If the only part of the root that is left is the scheme (i.e. http://,\n\t    // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n\t    // have exhausted all components, so the path is not relative to the root.\n\t    aRoot = aRoot.slice(0, index);\n\t    if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n\t      return aPath;\n\t    }\n\t\n\t    ++level;\n\t  }\n\t\n\t  // Make sure we add a \"../\" for each component we removed from the root.\n\t  return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n\t}\n\texports.relative = relative;\n\t\n\tvar supportsNullProto = (function () {\n\t  var obj = Object.create(null);\n\t  return !('__proto__' in obj);\n\t}());\n\t\n\tfunction identity (s) {\n\t  return s;\n\t}\n\t\n\t/**\n\t * Because behavior goes wacky when you set `__proto__` on objects, we\n\t * have to prefix all the strings in our set with an arbitrary character.\n\t *\n\t * See https://github.com/mozilla/source-map/pull/31 and\n\t * https://github.com/mozilla/source-map/issues/30\n\t *\n\t * @param String aStr\n\t */\n\tfunction toSetString(aStr) {\n\t  if (isProtoString(aStr)) {\n\t    return '$' + aStr;\n\t  }\n\t\n\t  return aStr;\n\t}\n\texports.toSetString = supportsNullProto ? identity : toSetString;\n\t\n\tfunction fromSetString(aStr) {\n\t  if (isProtoString(aStr)) {\n\t    return aStr.slice(1);\n\t  }\n\t\n\t  return aStr;\n\t}\n\texports.fromSetString = supportsNullProto ? identity : fromSetString;\n\t\n\tfunction isProtoString(s) {\n\t  if (!s) {\n\t    return false;\n\t  }\n\t\n\t  var length = s.length;\n\t\n\t  if (length < 9 /* \"__proto__\".length */) {\n\t    return false;\n\t  }\n\t\n\t  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||\n\t      s.charCodeAt(length - 2) !== 95  /* '_' */ ||\n\t      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n\t      s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n\t      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n\t      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n\t      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n\t      s.charCodeAt(length - 8) !== 95  /* '_' */ ||\n\t      s.charCodeAt(length - 9) !== 95  /* '_' */) {\n\t    return false;\n\t  }\n\t\n\t  for (var i = length - 10; i >= 0; i--) {\n\t    if (s.charCodeAt(i) !== 36 /* '$' */) {\n\t      return false;\n\t    }\n\t  }\n\t\n\t  return true;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings where the original positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same original source/line/column, but different generated\n\t * line and column the same. Useful when searching for a mapping with a\n\t * stubbed out mapping.\n\t */\n\tfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n\t  var cmp = strcmp(mappingA.source, mappingB.source);\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalLine - mappingB.originalLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t  if (cmp !== 0 || onlyCompareOriginal) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByOriginalPositions = compareByOriginalPositions;\n\t\n\t/**\n\t * Comparator between two mappings with deflated source and name indices where\n\t * the generated positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same generated line and column, but different\n\t * source/name/original line and column the same. Useful when searching for a\n\t * mapping with a stubbed out mapping.\n\t */\n\tfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n\t  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t  if (cmp !== 0 || onlyCompareGenerated) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = strcmp(mappingA.source, mappingB.source);\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalLine - mappingB.originalLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\t\n\tfunction strcmp(aStr1, aStr2) {\n\t  if (aStr1 === aStr2) {\n\t    return 0;\n\t  }\n\t\n\t  if (aStr1 === null) {\n\t    return 1; // aStr2 !== null\n\t  }\n\t\n\t  if (aStr2 === null) {\n\t    return -1; // aStr1 !== null\n\t  }\n\t\n\t  if (aStr1 > aStr2) {\n\t    return 1;\n\t  }\n\t\n\t  return -1;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings with inflated source and name strings where\n\t * the generated positions are compared.\n\t */\n\tfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n\t  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = strcmp(mappingA.source, mappingB.source);\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalLine - mappingB.originalLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\t\n\t/**\n\t * Strip any JSON XSSI avoidance prefix from the string (as documented\n\t * in the source maps specification), and then parse the string as\n\t * JSON.\n\t */\n\tfunction parseSourceMapInput(str) {\n\t  return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n\t}\n\texports.parseSourceMapInput = parseSourceMapInput;\n\t\n\t/**\n\t * Compute the URL of a source given the the source root, the source's\n\t * URL, and the source map's URL.\n\t */\n\tfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n\t  sourceURL = sourceURL || '';\n\t\n\t  if (sourceRoot) {\n\t    // This follows what Chrome does.\n\t    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n\t      sourceRoot += '/';\n\t    }\n\t    // The spec says:\n\t    //   Line 4: An optional source root, useful for relocating source\n\t    //   files on a server or removing repeated values in the\n\t    //   â€œsourcesâ€� entry.  This value is prepended to the individual\n\t    //   entries in the â€œsourceâ€� field.\n\t    sourceURL = sourceRoot + sourceURL;\n\t  }\n\t\n\t  // Historically, SourceMapConsumer did not take the sourceMapURL as\n\t  // a parameter.  This mode is still somewhat supported, which is why\n\t  // this code block is conditional.  However, it's preferable to pass\n\t  // the source map URL to SourceMapConsumer, so that this function\n\t  // can implement the source URL resolution algorithm as outlined in\n\t  // the spec.  This block is basically the equivalent of:\n\t  //    new URL(sourceURL, sourceMapURL).toString()\n\t  // ... except it avoids using URL, which wasn't available in the\n\t  // older releases of node still supported by this library.\n\t  //\n\t  // The spec says:\n\t  //   If the sources are not absolute URLs after prepending of the\n\t  //   â€œsourceRootâ€�, the sources are resolved relative to the\n\t  //   SourceMap (like resolving script src in a html document).\n\t  if (sourceMapURL) {\n\t    var parsed = urlParse(sourceMapURL);\n\t    if (!parsed) {\n\t      throw new Error(\"sourceMapURL could not be parsed\");\n\t    }\n\t    if (parsed.path) {\n\t      // Strip the last path component, but keep the \"/\".\n\t      var index = parsed.path.lastIndexOf('/');\n\t      if (index >= 0) {\n\t        parsed.path = parsed.path.substring(0, index + 1);\n\t      }\n\t    }\n\t    sourceURL = join(urlGenerate(parsed), sourceURL);\n\t  }\n\t\n\t  return normalize(sourceURL);\n\t}\n\texports.computeSourceURL = computeSourceURL;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar hasNativeMap = typeof Map !== \"undefined\";\n\t\n\t/**\n\t * A data structure which is a combination of an array and a set. Adding a new\n\t * member is O(1), testing for membership is O(1), and finding the index of an\n\t * element is O(1). Removing elements from the set is not supported. Only\n\t * strings are supported for membership.\n\t */\n\tfunction ArraySet() {\n\t  this._array = [];\n\t  this._set = hasNativeMap ? new Map() : Object.create(null);\n\t}\n\t\n\t/**\n\t * Static method for creating ArraySet instances from an existing array.\n\t */\n\tArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n\t  var set = new ArraySet();\n\t  for (var i = 0, len = aArray.length; i < len; i++) {\n\t    set.add(aArray[i], aAllowDuplicates);\n\t  }\n\t  return set;\n\t};\n\t\n\t/**\n\t * Return how many unique items are in this ArraySet. If duplicates have been\n\t * added, than those do not count towards the size.\n\t *\n\t * @returns Number\n\t */\n\tArraySet.prototype.size = function ArraySet_size() {\n\t  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n\t};\n\t\n\t/**\n\t * Add the given string to this set.\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n\t  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n\t  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n\t  var idx = this._array.length;\n\t  if (!isDuplicate || aAllowDuplicates) {\n\t    this._array.push(aStr);\n\t  }\n\t  if (!isDuplicate) {\n\t    if (hasNativeMap) {\n\t      this._set.set(aStr, idx);\n\t    } else {\n\t      this._set[sStr] = idx;\n\t    }\n\t  }\n\t};\n\t\n\t/**\n\t * Is the given string a member of this set?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.has = function ArraySet_has(aStr) {\n\t  if (hasNativeMap) {\n\t    return this._set.has(aStr);\n\t  } else {\n\t    var sStr = util.toSetString(aStr);\n\t    return has.call(this._set, sStr);\n\t  }\n\t};\n\t\n\t/**\n\t * What is the index of the given string in the array?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n\t  if (hasNativeMap) {\n\t    var idx = this._set.get(aStr);\n\t    if (idx >= 0) {\n\t        return idx;\n\t    }\n\t  } else {\n\t    var sStr = util.toSetString(aStr);\n\t    if (has.call(this._set, sStr)) {\n\t      return this._set[sStr];\n\t    }\n\t  }\n\t\n\t  throw new Error('\"' + aStr + '\" is not in the set.');\n\t};\n\t\n\t/**\n\t * What is the element at the given index?\n\t *\n\t * @param Number aIdx\n\t */\n\tArraySet.prototype.at = function ArraySet_at(aIdx) {\n\t  if (aIdx >= 0 && aIdx < this._array.length) {\n\t    return this._array[aIdx];\n\t  }\n\t  throw new Error('No element indexed by ' + aIdx);\n\t};\n\t\n\t/**\n\t * Returns the array representation of this set (which has the proper indices\n\t * indicated by indexOf). Note that this is a copy of the internal array used\n\t * for storing the members so that no one can mess with internal state.\n\t */\n\tArraySet.prototype.toArray = function ArraySet_toArray() {\n\t  return this._array.slice();\n\t};\n\t\n\texports.ArraySet = ArraySet;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2014 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\t\n\t/**\n\t * Determine whether mappingB is after mappingA with respect to generated\n\t * position.\n\t */\n\tfunction generatedPositionAfter(mappingA, mappingB) {\n\t  // Optimized for most common case\n\t  var lineA = mappingA.generatedLine;\n\t  var lineB = mappingB.generatedLine;\n\t  var columnA = mappingA.generatedColumn;\n\t  var columnB = mappingB.generatedColumn;\n\t  return lineB > lineA || lineB == lineA && columnB >= columnA ||\n\t         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n\t}\n\t\n\t/**\n\t * A data structure to provide a sorted view of accumulated mappings in a\n\t * performance conscious manner. It trades a neglibable overhead in general\n\t * case for a large speedup in case of mappings being added in order.\n\t */\n\tfunction MappingList() {\n\t  this._array = [];\n\t  this._sorted = true;\n\t  // Serves as infimum\n\t  this._last = {generatedLine: -1, generatedColumn: 0};\n\t}\n\t\n\t/**\n\t * Iterate through internal items. This method takes the same arguments that\n\t * `Array.prototype.forEach` takes.\n\t *\n\t * NOTE: The order of the mappings is NOT guaranteed.\n\t */\n\tMappingList.prototype.unsortedForEach =\n\t  function MappingList_forEach(aCallback, aThisArg) {\n\t    this._array.forEach(aCallback, aThisArg);\n\t  };\n\t\n\t/**\n\t * Add the given source mapping.\n\t *\n\t * @param Object aMapping\n\t */\n\tMappingList.prototype.add = function MappingList_add(aMapping) {\n\t  if (generatedPositionAfter(this._last, aMapping)) {\n\t    this._last = aMapping;\n\t    this._array.push(aMapping);\n\t  } else {\n\t    this._sorted = false;\n\t    this._array.push(aMapping);\n\t  }\n\t};\n\t\n\t/**\n\t * Returns the flat, sorted array of mappings. The mappings are sorted by\n\t * generated position.\n\t *\n\t * WARNING: This method returns internal data without copying, for\n\t * performance. The return value must NOT be mutated, and should be treated as\n\t * an immutable borrow. If you want to take ownership, you must make your own\n\t * copy.\n\t */\n\tMappingList.prototype.toArray = function MappingList_toArray() {\n\t  if (!this._sorted) {\n\t    this._array.sort(util.compareByGeneratedPositionsInflated);\n\t    this._sorted = true;\n\t  }\n\t  return this._array;\n\t};\n\t\n\texports.MappingList = MappingList;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar binarySearch = __webpack_require__(8);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar base64VLQ = __webpack_require__(2);\n\tvar quickSort = __webpack_require__(9).quickSort;\n\t\n\tfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t  var sourceMap = aSourceMap;\n\t  if (typeof aSourceMap === 'string') {\n\t    sourceMap = util.parseSourceMapInput(aSourceMap);\n\t  }\n\t\n\t  return sourceMap.sections != null\n\t    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n\t    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n\t}\n\t\n\tSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n\t  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\n\t}\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tSourceMapConsumer.prototype._version = 3;\n\t\n\t// `__generatedMappings` and `__originalMappings` are arrays that hold the\n\t// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n\t// are lazily instantiated, accessed via the `_generatedMappings` and\n\t// `_originalMappings` getters respectively, and we only parse the mappings\n\t// and create these arrays once queried for a source location. We jump through\n\t// these hoops because there can be many thousands of mappings, and parsing\n\t// them is expensive, so we only want to do it if we must.\n\t//\n\t// Each object in the arrays is of the form:\n\t//\n\t//     {\n\t//       generatedLine: The line number in the generated code,\n\t//       generatedColumn: The column number in the generated code,\n\t//       source: The path to the original source file that generated this\n\t//               chunk of code,\n\t//       originalLine: The line number in the original source that\n\t//                     corresponds to this chunk of generated code,\n\t//       originalColumn: The column number in the original source that\n\t//                       corresponds to this chunk of generated code,\n\t//       name: The name of the original symbol which generated this chunk of\n\t//             code.\n\t//     }\n\t//\n\t// All properties except for `generatedLine` and `generatedColumn` can be\n\t// `null`.\n\t//\n\t// `_generatedMappings` is ordered by the generated positions.\n\t//\n\t// `_originalMappings` is ordered by the original positions.\n\t\n\tSourceMapConsumer.prototype.__generatedMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n\t  configurable: true,\n\t  enumerable: true,\n\t  get: function () {\n\t    if (!this.__generatedMappings) {\n\t      this._parseMappings(this._mappings, this.sourceRoot);\n\t    }\n\t\n\t    return this.__generatedMappings;\n\t  }\n\t});\n\t\n\tSourceMapConsumer.prototype.__originalMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n\t  configurable: true,\n\t  enumerable: true,\n\t  get: function () {\n\t    if (!this.__originalMappings) {\n\t      this._parseMappings(this._mappings, this.sourceRoot);\n\t    }\n\t\n\t    return this.__originalMappings;\n\t  }\n\t});\n\t\n\tSourceMapConsumer.prototype._charIsMappingSeparator =\n\t  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n\t    var c = aStr.charAt(index);\n\t    return c === \";\" || c === \",\";\n\t  };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tSourceMapConsumer.prototype._parseMappings =\n\t  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t    throw new Error(\"Subclasses must implement _parseMappings\");\n\t  };\n\t\n\tSourceMapConsumer.GENERATED_ORDER = 1;\n\tSourceMapConsumer.ORIGINAL_ORDER = 2;\n\t\n\tSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\n\tSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Iterate over each mapping between an original source/line/column and a\n\t * generated line/column in this source map.\n\t *\n\t * @param Function aCallback\n\t *        The function that is called with each mapping.\n\t * @param Object aContext\n\t *        Optional. If specified, this object will be the value of `this` every\n\t *        time that `aCallback` is called.\n\t * @param aOrder\n\t *        Either `SourceMapConsumer.GENERATED_ORDER` or\n\t *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n\t *        iterate over the mappings sorted by the generated file's line/column\n\t *        order or the original's source/line/column order, respectively. Defaults to\n\t *        `SourceMapConsumer.GENERATED_ORDER`.\n\t */\n\tSourceMapConsumer.prototype.eachMapping =\n\t  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n\t    var context = aContext || null;\n\t    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\t\n\t    var mappings;\n\t    switch (order) {\n\t    case SourceMapConsumer.GENERATED_ORDER:\n\t      mappings = this._generatedMappings;\n\t      break;\n\t    case SourceMapConsumer.ORIGINAL_ORDER:\n\t      mappings = this._originalMappings;\n\t      break;\n\t    default:\n\t      throw new Error(\"Unknown order of iteration.\");\n\t    }\n\t\n\t    var sourceRoot = this.sourceRoot;\n\t    mappings.map(function (mapping) {\n\t      var source = mapping.source === null ? null : this._sources.at(mapping.source);\n\t      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\n\t      return {\n\t        source: source,\n\t        generatedLine: mapping.generatedLine,\n\t        generatedColumn: mapping.generatedColumn,\n\t        originalLine: mapping.originalLine,\n\t        originalColumn: mapping.originalColumn,\n\t        name: mapping.name === null ? null : this._names.at(mapping.name)\n\t      };\n\t    }, this).forEach(aCallback, context);\n\t  };\n\t\n\t/**\n\t * Returns all generated line and column information for the original source,\n\t * line, and column provided. If no column is provided, returns all mappings\n\t * corresponding to a either the line we are searching for or the next\n\t * closest line that has any mappings. Otherwise, returns all mappings\n\t * corresponding to the given line and either the column we are searching for\n\t * or the next closest column that has any offsets.\n\t *\n\t * The only argument is an object with the following properties:\n\t *\n\t *   - source: The filename of the original source.\n\t *   - line: The line number in the original source.  The line number is 1-based.\n\t *   - column: Optional. the column number in the original source.\n\t *    The column number is 0-based.\n\t *\n\t * and an array of objects is returned, each with the following properties:\n\t *\n\t *   - line: The line number in the generated source, or null.  The\n\t *    line number is 1-based.\n\t *   - column: The column number in the generated source, or null.\n\t *    The column number is 0-based.\n\t */\n\tSourceMapConsumer.prototype.allGeneratedPositionsFor =\n\t  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n\t    var line = util.getArg(aArgs, 'line');\n\t\n\t    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n\t    // returns the index of the closest mapping less than the needle. By\n\t    // setting needle.originalColumn to 0, we thus find the last mapping for\n\t    // the given line, provided such a mapping exists.\n\t    var needle = {\n\t      source: util.getArg(aArgs, 'source'),\n\t      originalLine: line,\n\t      originalColumn: util.getArg(aArgs, 'column', 0)\n\t    };\n\t\n\t    needle.source = this._findSourceIndex(needle.source);\n\t    if (needle.source < 0) {\n\t      return [];\n\t    }\n\t\n\t    var mappings = [];\n\t\n\t    var index = this._findMapping(needle,\n\t                                  this._originalMappings,\n\t                                  \"originalLine\",\n\t                                  \"originalColumn\",\n\t                                  util.compareByOriginalPositions,\n\t                                  binarySearch.LEAST_UPPER_BOUND);\n\t    if (index >= 0) {\n\t      var mapping = this._originalMappings[index];\n\t\n\t      if (aArgs.column === undefined) {\n\t        var originalLine = mapping.originalLine;\n\t\n\t        // Iterate until either we run out of mappings, or we run into\n\t        // a mapping for a different line than the one we found. Since\n\t        // mappings are sorted, this is guaranteed to find all mappings for\n\t        // the line we found.\n\t        while (mapping && mapping.originalLine === originalLine) {\n\t          mappings.push({\n\t            line: util.getArg(mapping, 'generatedLine', null),\n\t            column: util.getArg(mapping, 'generatedColumn', null),\n\t            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t          });\n\t\n\t          mapping = this._originalMappings[++index];\n\t        }\n\t      } else {\n\t        var originalColumn = mapping.originalColumn;\n\t\n\t        // Iterate until either we run out of mappings, or we run into\n\t        // a mapping for a different line than the one we were searching for.\n\t        // Since mappings are sorted, this is guaranteed to find all mappings for\n\t        // the line we are searching for.\n\t        while (mapping &&\n\t               mapping.originalLine === line &&\n\t               mapping.originalColumn == originalColumn) {\n\t          mappings.push({\n\t            line: util.getArg(mapping, 'generatedLine', null),\n\t            column: util.getArg(mapping, 'generatedColumn', null),\n\t            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t          });\n\t\n\t          mapping = this._originalMappings[++index];\n\t        }\n\t      }\n\t    }\n\t\n\t    return mappings;\n\t  };\n\t\n\texports.SourceMapConsumer = SourceMapConsumer;\n\t\n\t/**\n\t * A BasicSourceMapConsumer instance represents a parsed source map which we can\n\t * query for information about the original file positions by giving it a file\n\t * position in the generated source.\n\t *\n\t * The first parameter is the raw source map (either as a JSON string, or\n\t * already parsed to an object). According to the spec, source maps have the\n\t * following attributes:\n\t *\n\t *   - version: Which version of the source map spec this map is following.\n\t *   - sources: An array of URLs to the original source files.\n\t *   - names: An array of identifiers which can be referrenced by individual mappings.\n\t *   - sourceRoot: Optional. The URL root from which all sources are relative.\n\t *   - sourcesContent: Optional. An array of contents of the original source files.\n\t *   - mappings: A string of base64 VLQs which contain the actual mappings.\n\t *   - file: Optional. The generated file this source map is associated with.\n\t *\n\t * Here is an example source map, taken from the source map spec[0]:\n\t *\n\t *     {\n\t *       version : 3,\n\t *       file: \"out.js\",\n\t *       sourceRoot : \"\",\n\t *       sources: [\"foo.js\", \"bar.js\"],\n\t *       names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t *       mappings: \"AA,AB;;ABCDE;\"\n\t *     }\n\t *\n\t * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found.  This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n\t */\n\tfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t  var sourceMap = aSourceMap;\n\t  if (typeof aSourceMap === 'string') {\n\t    sourceMap = util.parseSourceMapInput(aSourceMap);\n\t  }\n\t\n\t  var version = util.getArg(sourceMap, 'version');\n\t  var sources = util.getArg(sourceMap, 'sources');\n\t  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n\t  // requires the array) to play nice here.\n\t  var names = util.getArg(sourceMap, 'names', []);\n\t  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n\t  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n\t  var mappings = util.getArg(sourceMap, 'mappings');\n\t  var file = util.getArg(sourceMap, 'file', null);\n\t\n\t  // Once again, Sass deviates from the spec and supplies the version as a\n\t  // string rather than a number, so we use loose equality checking here.\n\t  if (version != this._version) {\n\t    throw new Error('Unsupported version: ' + version);\n\t  }\n\t\n\t  if (sourceRoot) {\n\t    sourceRoot = util.normalize(sourceRoot);\n\t  }\n\t\n\t  sources = sources\n\t    .map(String)\n\t    // Some source maps produce relative source paths like \"./foo.js\" instead of\n\t    // \"foo.js\".  Normalize these first so that future comparisons will succeed.\n\t    // See bugzil.la/1090768.\n\t    .map(util.normalize)\n\t    // Always ensure that absolute sources are internally stored relative to\n\t    // the source root, if the source root is absolute. Not doing this would\n\t    // be particularly problematic when the source root is a prefix of the\n\t    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n\t    .map(function (source) {\n\t      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n\t        ? util.relative(sourceRoot, source)\n\t        : source;\n\t    });\n\t\n\t  // Pass `true` below to allow duplicate names and sources. While source maps\n\t  // are intended to be compressed and deduplicated, the TypeScript compiler\n\t  // sometimes generates source maps with duplicates in them. See Github issue\n\t  // #72 and bugzil.la/889492.\n\t  this._names = ArraySet.fromArray(names.map(String), true);\n\t  this._sources = ArraySet.fromArray(sources, true);\n\t\n\t  this._absoluteSources = this._sources.toArray().map(function (s) {\n\t    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n\t  });\n\t\n\t  this.sourceRoot = sourceRoot;\n\t  this.sourcesContent = sourcesContent;\n\t  this._mappings = mappings;\n\t  this._sourceMapURL = aSourceMapURL;\n\t  this.file = file;\n\t}\n\t\n\tBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\t\n\t/**\n\t * Utility function to find the index of a source.  Returns -1 if not\n\t * found.\n\t */\n\tBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n\t  var relativeSource = aSource;\n\t  if (this.sourceRoot != null) {\n\t    relativeSource = util.relative(this.sourceRoot, relativeSource);\n\t  }\n\t\n\t  if (this._sources.has(relativeSource)) {\n\t    return this._sources.indexOf(relativeSource);\n\t  }\n\t\n\t  // Maybe aSource is an absolute URL as returned by |sources|.  In\n\t  // this case we can't simply undo the transform.\n\t  var i;\n\t  for (i = 0; i < this._absoluteSources.length; ++i) {\n\t    if (this._absoluteSources[i] == aSource) {\n\t      return i;\n\t    }\n\t  }\n\t\n\t  return -1;\n\t};\n\t\n\t/**\n\t * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n\t *\n\t * @param SourceMapGenerator aSourceMap\n\t *        The source map that will be consumed.\n\t * @param String aSourceMapURL\n\t *        The URL at which the source map can be found (optional)\n\t * @returns BasicSourceMapConsumer\n\t */\n\tBasicSourceMapConsumer.fromSourceMap =\n\t  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\n\t    var smc = Object.create(BasicSourceMapConsumer.prototype);\n\t\n\t    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n\t    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n\t    smc.sourceRoot = aSourceMap._sourceRoot;\n\t    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n\t                                                            smc.sourceRoot);\n\t    smc.file = aSourceMap._file;\n\t    smc._sourceMapURL = aSourceMapURL;\n\t    smc._absoluteSources = smc._sources.toArray().map(function (s) {\n\t      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n\t    });\n\t\n\t    // Because we are modifying the entries (by converting string sources and\n\t    // names to indices into the sources and names ArraySets), we have to make\n\t    // a copy of the entry or else bad things happen. Shared mutable state\n\t    // strikes again! See github issue #191.\n\t\n\t    var generatedMappings = aSourceMap._mappings.toArray().slice();\n\t    var destGeneratedMappings = smc.__generatedMappings = [];\n\t    var destOriginalMappings = smc.__originalMappings = [];\n\t\n\t    for (var i = 0, length = generatedMappings.length; i < length; i++) {\n\t      var srcMapping = generatedMappings[i];\n\t      var destMapping = new Mapping;\n\t      destMapping.generatedLine = srcMapping.generatedLine;\n\t      destMapping.generatedColumn = srcMapping.generatedColumn;\n\t\n\t      if (srcMapping.source) {\n\t        destMapping.source = sources.indexOf(srcMapping.source);\n\t        destMapping.originalLine = srcMapping.originalLine;\n\t        destMapping.originalColumn = srcMapping.originalColumn;\n\t\n\t        if (srcMapping.name) {\n\t          destMapping.name = names.indexOf(srcMapping.name);\n\t        }\n\t\n\t        destOriginalMappings.push(destMapping);\n\t      }\n\t\n\t      destGeneratedMappings.push(destMapping);\n\t    }\n\t\n\t    quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\t\n\t    return smc;\n\t  };\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tBasicSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n\t  get: function () {\n\t    return this._absoluteSources.slice();\n\t  }\n\t});\n\t\n\t/**\n\t * Provide the JIT with a nice shape / hidden class.\n\t */\n\tfunction Mapping() {\n\t  this.generatedLine = 0;\n\t  this.generatedColumn = 0;\n\t  this.source = null;\n\t  this.originalLine = null;\n\t  this.originalColumn = null;\n\t  this.name = null;\n\t}\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tBasicSourceMapConsumer.prototype._parseMappings =\n\t  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t    var generatedLine = 1;\n\t    var previousGeneratedColumn = 0;\n\t    var previousOriginalLine = 0;\n\t    var previousOriginalColumn = 0;\n\t    var previousSource = 0;\n\t    var previousName = 0;\n\t    var length = aStr.length;\n\t    var index = 0;\n\t    var cachedSegments = {};\n\t    var temp = {};\n\t    var originalMappings = [];\n\t    var generatedMappings = [];\n\t    var mapping, str, segment, end, value;\n\t\n\t    while (index < length) {\n\t      if (aStr.charAt(index) === ';') {\n\t        generatedLine++;\n\t        index++;\n\t        previousGeneratedColumn = 0;\n\t      }\n\t      else if (aStr.charAt(index) === ',') {\n\t        index++;\n\t      }\n\t      else {\n\t        mapping = new Mapping();\n\t        mapping.generatedLine = generatedLine;\n\t\n\t        // Because each offset is encoded relative to the previous one,\n\t        // many segments often have the same encoding. We can exploit this\n\t        // fact by caching the parsed variable length fields of each segment,\n\t        // allowing us to avoid a second parse if we encounter the same\n\t        // segment again.\n\t        for (end = index; end < length; end++) {\n\t          if (this._charIsMappingSeparator(aStr, end)) {\n\t            break;\n\t          }\n\t        }\n\t        str = aStr.slice(index, end);\n\t\n\t        segment = cachedSegments[str];\n\t        if (segment) {\n\t          index += str.length;\n\t        } else {\n\t          segment = [];\n\t          while (index < end) {\n\t            base64VLQ.decode(aStr, index, temp);\n\t            value = temp.value;\n\t            index = temp.rest;\n\t            segment.push(value);\n\t          }\n\t\n\t          if (segment.length === 2) {\n\t            throw new Error('Found a source, but no line and column');\n\t          }\n\t\n\t          if (segment.length === 3) {\n\t            throw new Error('Found a source and line, but no column');\n\t          }\n\t\n\t          cachedSegments[str] = segment;\n\t        }\n\t\n\t        // Generated column.\n\t        mapping.generatedColumn = previousGeneratedColumn + segment[0];\n\t        previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t        if (segment.length > 1) {\n\t          // Original source.\n\t          mapping.source = previousSource + segment[1];\n\t          previousSource += segment[1];\n\t\n\t          // Original line.\n\t          mapping.originalLine = previousOriginalLine + segment[2];\n\t          previousOriginalLine = mapping.originalLine;\n\t          // Lines are stored 0-based\n\t          mapping.originalLine += 1;\n\t\n\t          // Original column.\n\t          mapping.originalColumn = previousOriginalColumn + segment[3];\n\t          previousOriginalColumn = mapping.originalColumn;\n\t\n\t          if (segment.length > 4) {\n\t            // Original name.\n\t            mapping.name = previousName + segment[4];\n\t            previousName += segment[4];\n\t          }\n\t        }\n\t\n\t        generatedMappings.push(mapping);\n\t        if (typeof mapping.originalLine === 'number') {\n\t          originalMappings.push(mapping);\n\t        }\n\t      }\n\t    }\n\t\n\t    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t    this.__generatedMappings = generatedMappings;\n\t\n\t    quickSort(originalMappings, util.compareByOriginalPositions);\n\t    this.__originalMappings = originalMappings;\n\t  };\n\t\n\t/**\n\t * Find the mapping that best matches the hypothetical \"needle\" mapping that\n\t * we are searching for in the given \"haystack\" of mappings.\n\t */\n\tBasicSourceMapConsumer.prototype._findMapping =\n\t  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n\t                                         aColumnName, aComparator, aBias) {\n\t    // To return the position we are searching for, we must first find the\n\t    // mapping for the given position and then return the opposite position it\n\t    // points to. Because the mappings are sorted, we can use binary search to\n\t    // find the best mapping.\n\t\n\t    if (aNeedle[aLineName] <= 0) {\n\t      throw new TypeError('Line must be greater than or equal to 1, got '\n\t                          + aNeedle[aLineName]);\n\t    }\n\t    if (aNeedle[aColumnName] < 0) {\n\t      throw new TypeError('Column must be greater than or equal to 0, got '\n\t                          + aNeedle[aColumnName]);\n\t    }\n\t\n\t    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n\t  };\n\t\n\t/**\n\t * Compute the last column for each generated mapping. The last column is\n\t * inclusive.\n\t */\n\tBasicSourceMapConsumer.prototype.computeColumnSpans =\n\t  function SourceMapConsumer_computeColumnSpans() {\n\t    for (var index = 0; index < this._generatedMappings.length; ++index) {\n\t      var mapping = this._generatedMappings[index];\n\t\n\t      // Mappings do not contain a field for the last generated columnt. We\n\t      // can come up with an optimistic estimate, however, by assuming that\n\t      // mappings are contiguous (i.e. given two consecutive mappings, the\n\t      // first mapping ends where the second one starts).\n\t      if (index + 1 < this._generatedMappings.length) {\n\t        var nextMapping = this._generatedMappings[index + 1];\n\t\n\t        if (mapping.generatedLine === nextMapping.generatedLine) {\n\t          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n\t          continue;\n\t        }\n\t      }\n\t\n\t      // The last mapping for each line spans the entire line.\n\t      mapping.lastGeneratedColumn = Infinity;\n\t    }\n\t  };\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t *   - line: The line number in the generated source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the generated source.  The column\n\t *     number is 0-based.\n\t *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - source: The original source file, or null.\n\t *   - line: The line number in the original source, or null.  The\n\t *     line number is 1-based.\n\t *   - column: The column number in the original source, or null.  The\n\t *     column number is 0-based.\n\t *   - name: The original identifier, or null.\n\t */\n\tBasicSourceMapConsumer.prototype.originalPositionFor =\n\t  function SourceMapConsumer_originalPositionFor(aArgs) {\n\t    var needle = {\n\t      generatedLine: util.getArg(aArgs, 'line'),\n\t      generatedColumn: util.getArg(aArgs, 'column')\n\t    };\n\t\n\t    var index = this._findMapping(\n\t      needle,\n\t      this._generatedMappings,\n\t      \"generatedLine\",\n\t      \"generatedColumn\",\n\t      util.compareByGeneratedPositionsDeflated,\n\t      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t    );\n\t\n\t    if (index >= 0) {\n\t      var mapping = this._generatedMappings[index];\n\t\n\t      if (mapping.generatedLine === needle.generatedLine) {\n\t        var source = util.getArg(mapping, 'source', null);\n\t        if (source !== null) {\n\t          source = this._sources.at(source);\n\t          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\n\t        }\n\t        var name = util.getArg(mapping, 'name', null);\n\t        if (name !== null) {\n\t          name = this._names.at(name);\n\t        }\n\t        return {\n\t          source: source,\n\t          line: util.getArg(mapping, 'originalLine', null),\n\t          column: util.getArg(mapping, 'originalColumn', null),\n\t          name: name\n\t        };\n\t      }\n\t    }\n\t\n\t    return {\n\t      source: null,\n\t      line: null,\n\t      column: null,\n\t      name: null\n\t    };\n\t  };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t  function BasicSourceMapConsumer_hasContentsOfAllSources() {\n\t    if (!this.sourcesContent) {\n\t      return false;\n\t    }\n\t    return this.sourcesContent.length >= this._sources.size() &&\n\t      !this.sourcesContent.some(function (sc) { return sc == null; });\n\t  };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tBasicSourceMapConsumer.prototype.sourceContentFor =\n\t  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t    if (!this.sourcesContent) {\n\t      return null;\n\t    }\n\t\n\t    var index = this._findSourceIndex(aSource);\n\t    if (index >= 0) {\n\t      return this.sourcesContent[index];\n\t    }\n\t\n\t    var relativeSource = aSource;\n\t    if (this.sourceRoot != null) {\n\t      relativeSource = util.relative(this.sourceRoot, relativeSource);\n\t    }\n\t\n\t    var url;\n\t    if (this.sourceRoot != null\n\t        && (url = util.urlParse(this.sourceRoot))) {\n\t      // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n\t      // many users. We can help them out when they expect file:// URIs to\n\t      // behave like it would if they were running a local HTTP server. See\n\t      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n\t      var fileUriAbsPath = relativeSource.replace(/^file:\\/\\//, \"\");\n\t      if (url.scheme == \"file\"\n\t          && this._sources.has(fileUriAbsPath)) {\n\t        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n\t      }\n\t\n\t      if ((!url.path || url.path == \"/\")\n\t          && this._sources.has(\"/\" + relativeSource)) {\n\t        return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\n\t      }\n\t    }\n\t\n\t    // This function is used recursively from\n\t    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n\t    // don't want to throw if we can't find the source - we just want to\n\t    // return null, so we provide a flag to exit gracefully.\n\t    if (nullOnMissing) {\n\t      return null;\n\t    }\n\t    else {\n\t      throw new Error('\"' + relativeSource + '\" is not in the SourceMap.');\n\t    }\n\t  };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t *   - source: The filename of the original source.\n\t *   - line: The line number in the original source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the original source.  The column\n\t *     number is 0-based.\n\t *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - line: The line number in the generated source, or null.  The\n\t *     line number is 1-based.\n\t *   - column: The column number in the generated source, or null.\n\t *     The column number is 0-based.\n\t */\n\tBasicSourceMapConsumer.prototype.generatedPositionFor =\n\t  function SourceMapConsumer_generatedPositionFor(aArgs) {\n\t    var source = util.getArg(aArgs, 'source');\n\t    source = this._findSourceIndex(source);\n\t    if (source < 0) {\n\t      return {\n\t        line: null,\n\t        column: null,\n\t        lastColumn: null\n\t      };\n\t    }\n\t\n\t    var needle = {\n\t      source: source,\n\t      originalLine: util.getArg(aArgs, 'line'),\n\t      originalColumn: util.getArg(aArgs, 'column')\n\t    };\n\t\n\t    var index = this._findMapping(\n\t      needle,\n\t      this._originalMappings,\n\t      \"originalLine\",\n\t      \"originalColumn\",\n\t      util.compareByOriginalPositions,\n\t      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t    );\n\t\n\t    if (index >= 0) {\n\t      var mapping = this._originalMappings[index];\n\t\n\t      if (mapping.source === needle.source) {\n\t        return {\n\t          line: util.getArg(mapping, 'generatedLine', null),\n\t          column: util.getArg(mapping, 'generatedColumn', null),\n\t          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t        };\n\t      }\n\t    }\n\t\n\t    return {\n\t      line: null,\n\t      column: null,\n\t      lastColumn: null\n\t    };\n\t  };\n\t\n\texports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\t\n\t/**\n\t * An IndexedSourceMapConsumer instance represents a parsed source map which\n\t * we can query for information. It differs from BasicSourceMapConsumer in\n\t * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n\t * input.\n\t *\n\t * The first parameter is a raw source map (either as a JSON string, or already\n\t * parsed to an object). According to the spec for indexed source maps, they\n\t * have the following attributes:\n\t *\n\t *   - version: Which version of the source map spec this map is following.\n\t *   - file: Optional. The generated file this source map is associated with.\n\t *   - sections: A list of section definitions.\n\t *\n\t * Each value under the \"sections\" field has two fields:\n\t *   - offset: The offset into the original specified at which this section\n\t *       begins to apply, defined as an object with a \"line\" and \"column\"\n\t *       field.\n\t *   - map: A source map definition. This source map could also be indexed,\n\t *       but doesn't have to be.\n\t *\n\t * Instead of the \"map\" field, it's also possible to have a \"url\" field\n\t * specifying a URL to retrieve a source map from, but that's currently\n\t * unsupported.\n\t *\n\t * Here's an example source map, taken from the source map spec[0], but\n\t * modified to omit a section which uses the \"url\" field.\n\t *\n\t *  {\n\t *    version : 3,\n\t *    file: \"app.js\",\n\t *    sections: [{\n\t *      offset: {line:100, column:10},\n\t *      map: {\n\t *        version : 3,\n\t *        file: \"section.js\",\n\t *        sources: [\"foo.js\", \"bar.js\"],\n\t *        names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t *        mappings: \"AAAA,E;;ABCDE;\"\n\t *      }\n\t *    }],\n\t *  }\n\t *\n\t * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found.  This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n\t */\n\tfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t  var sourceMap = aSourceMap;\n\t  if (typeof aSourceMap === 'string') {\n\t    sourceMap = util.parseSourceMapInput(aSourceMap);\n\t  }\n\t\n\t  var version = util.getArg(sourceMap, 'version');\n\t  var sections = util.getArg(sourceMap, 'sections');\n\t\n\t  if (version != this._version) {\n\t    throw new Error('Unsupported version: ' + version);\n\t  }\n\t\n\t  this._sources = new ArraySet();\n\t  this._names = new ArraySet();\n\t\n\t  var lastOffset = {\n\t    line: -1,\n\t    column: 0\n\t  };\n\t  this._sections = sections.map(function (s) {\n\t    if (s.url) {\n\t      // The url field will require support for asynchronicity.\n\t      // See https://github.com/mozilla/source-map/issues/16\n\t      throw new Error('Support for url field in sections not implemented.');\n\t    }\n\t    var offset = util.getArg(s, 'offset');\n\t    var offsetLine = util.getArg(offset, 'line');\n\t    var offsetColumn = util.getArg(offset, 'column');\n\t\n\t    if (offsetLine < lastOffset.line ||\n\t        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n\t      throw new Error('Section offsets must be ordered and non-overlapping.');\n\t    }\n\t    lastOffset = offset;\n\t\n\t    return {\n\t      generatedOffset: {\n\t        // The offset fields are 0-based, but we use 1-based indices when\n\t        // encoding/decoding from VLQ.\n\t        generatedLine: offsetLine + 1,\n\t        generatedColumn: offsetColumn + 1\n\t      },\n\t      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\n\t    }\n\t  });\n\t}\n\t\n\tIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tIndexedSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n\t  get: function () {\n\t    var sources = [];\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n\t        sources.push(this._sections[i].consumer.sources[j]);\n\t      }\n\t    }\n\t    return sources;\n\t  }\n\t});\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t *   - line: The line number in the generated source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the generated source.  The column\n\t *     number is 0-based.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - source: The original source file, or null.\n\t *   - line: The line number in the original source, or null.  The\n\t *     line number is 1-based.\n\t *   - column: The column number in the original source, or null.  The\n\t *     column number is 0-based.\n\t *   - name: The original identifier, or null.\n\t */\n\tIndexedSourceMapConsumer.prototype.originalPositionFor =\n\t  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n\t    var needle = {\n\t      generatedLine: util.getArg(aArgs, 'line'),\n\t      generatedColumn: util.getArg(aArgs, 'column')\n\t    };\n\t\n\t    // Find the section containing the generated position we're trying to map\n\t    // to an original position.\n\t    var sectionIndex = binarySearch.search(needle, this._sections,\n\t      function(needle, section) {\n\t        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n\t        if (cmp) {\n\t          return cmp;\n\t        }\n\t\n\t        return (needle.generatedColumn -\n\t                section.generatedOffset.generatedColumn);\n\t      });\n\t    var section = this._sections[sectionIndex];\n\t\n\t    if (!section) {\n\t      return {\n\t        source: null,\n\t        line: null,\n\t        column: null,\n\t        name: null\n\t      };\n\t    }\n\t\n\t    return section.consumer.originalPositionFor({\n\t      line: needle.generatedLine -\n\t        (section.generatedOffset.generatedLine - 1),\n\t      column: needle.generatedColumn -\n\t        (section.generatedOffset.generatedLine === needle.generatedLine\n\t         ? section.generatedOffset.generatedColumn - 1\n\t         : 0),\n\t      bias: aArgs.bias\n\t    });\n\t  };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t  function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n\t    return this._sections.every(function (s) {\n\t      return s.consumer.hasContentsOfAllSources();\n\t    });\n\t  };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tIndexedSourceMapConsumer.prototype.sourceContentFor =\n\t  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      var section = this._sections[i];\n\t\n\t      var content = section.consumer.sourceContentFor(aSource, true);\n\t      if (content) {\n\t        return content;\n\t      }\n\t    }\n\t    if (nullOnMissing) {\n\t      return null;\n\t    }\n\t    else {\n\t      throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t    }\n\t  };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t *   - source: The filename of the original source.\n\t *   - line: The line number in the original source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the original source.  The column\n\t *     number is 0-based.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - line: The line number in the generated source, or null.  The\n\t *     line number is 1-based. \n\t *   - column: The column number in the generated source, or null.\n\t *     The column number is 0-based.\n\t */\n\tIndexedSourceMapConsumer.prototype.generatedPositionFor =\n\t  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      var section = this._sections[i];\n\t\n\t      // Only consider this section if the requested source is in the list of\n\t      // sources of the consumer.\n\t      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\n\t        continue;\n\t      }\n\t      var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n\t      if (generatedPosition) {\n\t        var ret = {\n\t          line: generatedPosition.line +\n\t            (section.generatedOffset.generatedLine - 1),\n\t          column: generatedPosition.column +\n\t            (section.generatedOffset.generatedLine === generatedPosition.line\n\t             ? section.generatedOffset.generatedColumn - 1\n\t             : 0)\n\t        };\n\t        return ret;\n\t      }\n\t    }\n\t\n\t    return {\n\t      line: null,\n\t      column: null\n\t    };\n\t  };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tIndexedSourceMapConsumer.prototype._parseMappings =\n\t  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t    this.__generatedMappings = [];\n\t    this.__originalMappings = [];\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      var section = this._sections[i];\n\t      var sectionMappings = section.consumer._generatedMappings;\n\t      for (var j = 0; j < sectionMappings.length; j++) {\n\t        var mapping = sectionMappings[j];\n\t\n\t        var source = section.consumer._sources.at(mapping.source);\n\t        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n\t        this._sources.add(source);\n\t        source = this._sources.indexOf(source);\n\t\n\t        var name = null;\n\t        if (mapping.name) {\n\t          name = section.consumer._names.at(mapping.name);\n\t          this._names.add(name);\n\t          name = this._names.indexOf(name);\n\t        }\n\t\n\t        // The mappings coming from the consumer for the section have\n\t        // generated positions relative to the start of the section, so we\n\t        // need to offset them to be relative to the start of the concatenated\n\t        // generated file.\n\t        var adjustedMapping = {\n\t          source: source,\n\t          generatedLine: mapping.generatedLine +\n\t            (section.generatedOffset.generatedLine - 1),\n\t          generatedColumn: mapping.generatedColumn +\n\t            (section.generatedOffset.generatedLine === mapping.generatedLine\n\t            ? section.generatedOffset.generatedColumn - 1\n\t            : 0),\n\t          originalLine: mapping.originalLine,\n\t          originalColumn: mapping.originalColumn,\n\t          name: name\n\t        };\n\t\n\t        this.__generatedMappings.push(adjustedMapping);\n\t        if (typeof adjustedMapping.originalLine === 'number') {\n\t          this.__originalMappings.push(adjustedMapping);\n\t        }\n\t      }\n\t    }\n\t\n\t    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t    quickSort(this.__originalMappings, util.compareByOriginalPositions);\n\t  };\n\t\n\texports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\texports.GREATEST_LOWER_BOUND = 1;\n\texports.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Recursive implementation of binary search.\n\t *\n\t * @param aLow Indices here and lower do not contain the needle.\n\t * @param aHigh Indices here and higher do not contain the needle.\n\t * @param aNeedle The element being searched for.\n\t * @param aHaystack The non-empty array being searched.\n\t * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t */\n\tfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n\t  // This function terminates when one of the following is true:\n\t  //\n\t  //   1. We find the exact element we are looking for.\n\t  //\n\t  //   2. We did not find the exact element, but we can return the index of\n\t  //      the next-closest element.\n\t  //\n\t  //   3. We did not find the exact element, and there is no next-closest\n\t  //      element than the one we are searching for, so we return -1.\n\t  var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n\t  var cmp = aCompare(aNeedle, aHaystack[mid], true);\n\t  if (cmp === 0) {\n\t    // Found the element we are looking for.\n\t    return mid;\n\t  }\n\t  else if (cmp > 0) {\n\t    // Our needle is greater than aHaystack[mid].\n\t    if (aHigh - mid > 1) {\n\t      // The element is in the upper half.\n\t      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n\t    }\n\t\n\t    // The exact needle element was not found in this haystack. Determine if\n\t    // we are in termination case (3) or (2) and return the appropriate thing.\n\t    if (aBias == exports.LEAST_UPPER_BOUND) {\n\t      return aHigh < aHaystack.length ? aHigh : -1;\n\t    } else {\n\t      return mid;\n\t    }\n\t  }\n\t  else {\n\t    // Our needle is less than aHaystack[mid].\n\t    if (mid - aLow > 1) {\n\t      // The element is in the lower half.\n\t      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n\t    }\n\t\n\t    // we are in termination case (3) or (2) and return the appropriate thing.\n\t    if (aBias == exports.LEAST_UPPER_BOUND) {\n\t      return mid;\n\t    } else {\n\t      return aLow < 0 ? -1 : aLow;\n\t    }\n\t  }\n\t}\n\t\n\t/**\n\t * This is an implementation of binary search which will always try and return\n\t * the index of the closest element if there is no exact hit. This is because\n\t * mappings between original and generated line/col pairs are single points,\n\t * and there is an implicit region between each of them, so a miss just means\n\t * that you aren't on the very start of a region.\n\t *\n\t * @param aNeedle The element you are looking for.\n\t * @param aHaystack The array that is being searched.\n\t * @param aCompare A function which takes the needle and an element in the\n\t *     array and returns -1, 0, or 1 depending on whether the needle is less\n\t *     than, equal to, or greater than the element, respectively.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n\t */\n\texports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n\t  if (aHaystack.length === 0) {\n\t    return -1;\n\t  }\n\t\n\t  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n\t                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n\t  if (index < 0) {\n\t    return -1;\n\t  }\n\t\n\t  // We have found either the exact element, or the next-closest element than\n\t  // the one we are searching for. However, there may be more than one such\n\t  // element. Make sure we always return the smallest of these.\n\t  while (index - 1 >= 0) {\n\t    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n\t      break;\n\t    }\n\t    --index;\n\t  }\n\t\n\t  return index;\n\t};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t// It turns out that some (most?) JavaScript engines don't self-host\n\t// `Array.prototype.sort`. This makes sense because C++ will likely remain\n\t// faster than JS when doing raw CPU-intensive sorting. However, when using a\n\t// custom comparator function, calling back and forth between the VM's C++ and\n\t// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n\t// worse generated code for the comparator function than would be optimal. In\n\t// fact, when sorting with a comparator, these costs outweigh the benefits of\n\t// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n\t// a ~3500ms mean speed-up in `bench/bench.html`.\n\t\n\t/**\n\t * Swap the elements indexed by `x` and `y` in the array `ary`.\n\t *\n\t * @param {Array} ary\n\t *        The array.\n\t * @param {Number} x\n\t *        The index of the first item.\n\t * @param {Number} y\n\t *        The index of the second item.\n\t */\n\tfunction swap(ary, x, y) {\n\t  var temp = ary[x];\n\t  ary[x] = ary[y];\n\t  ary[y] = temp;\n\t}\n\t\n\t/**\n\t * Returns a random integer within the range `low .. high` inclusive.\n\t *\n\t * @param {Number} low\n\t *        The lower bound on the range.\n\t * @param {Number} high\n\t *        The upper bound on the range.\n\t */\n\tfunction randomIntInRange(low, high) {\n\t  return Math.round(low + (Math.random() * (high - low)));\n\t}\n\t\n\t/**\n\t * The Quick Sort algorithm.\n\t *\n\t * @param {Array} ary\n\t *        An array to sort.\n\t * @param {function} comparator\n\t *        Function to use to compare two items.\n\t * @param {Number} p\n\t *        Start index of the array\n\t * @param {Number} r\n\t *        End index of the array\n\t */\n\tfunction doQuickSort(ary, comparator, p, r) {\n\t  // If our lower bound is less than our upper bound, we (1) partition the\n\t  // array into two pieces and (2) recurse on each half. If it is not, this is\n\t  // the empty array and our base case.\n\t\n\t  if (p < r) {\n\t    // (1) Partitioning.\n\t    //\n\t    // The partitioning chooses a pivot between `p` and `r` and moves all\n\t    // elements that are less than or equal to the pivot to the before it, and\n\t    // all the elements that are greater than it after it. The effect is that\n\t    // once partition is done, the pivot is in the exact place it will be when\n\t    // the array is put in sorted order, and it will not need to be moved\n\t    // again. This runs in O(n) time.\n\t\n\t    // Always choose a random pivot so that an input array which is reverse\n\t    // sorted does not cause O(n^2) running time.\n\t    var pivotIndex = randomIntInRange(p, r);\n\t    var i = p - 1;\n\t\n\t    swap(ary, pivotIndex, r);\n\t    var pivot = ary[r];\n\t\n\t    // Immediately after `j` is incremented in this loop, the following hold\n\t    // true:\n\t    //\n\t    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.\n\t    //\n\t    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n\t    for (var j = p; j < r; j++) {\n\t      if (comparator(ary[j], pivot) <= 0) {\n\t        i += 1;\n\t        swap(ary, i, j);\n\t      }\n\t    }\n\t\n\t    swap(ary, i + 1, j);\n\t    var q = i + 1;\n\t\n\t    // (2) Recurse on each half.\n\t\n\t    doQuickSort(ary, comparator, p, q - 1);\n\t    doQuickSort(ary, comparator, q + 1, r);\n\t  }\n\t}\n\t\n\t/**\n\t * Sort the given array in-place with the given comparator function.\n\t *\n\t * @param {Array} ary\n\t *        An array to sort.\n\t * @param {function} comparator\n\t *        Function to use to compare two items.\n\t */\n\texports.quickSort = function (ary, comparator) {\n\t  doQuickSort(ary, comparator, 0, ary.length - 1);\n\t};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\tvar util = __webpack_require__(4);\n\t\n\t// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n\t// operating systems these days (capturing the result).\n\tvar REGEX_NEWLINE = /(\\r?\\n)/;\n\t\n\t// Newline character code for charCodeAt() comparisons\n\tvar NEWLINE_CODE = 10;\n\t\n\t// Private symbol for identifying `SourceNode`s when multiple versions of\n\t// the source-map library are loaded. This MUST NOT CHANGE across\n\t// versions!\n\tvar isSourceNode = \"$$$isSourceNode$$$\";\n\t\n\t/**\n\t * SourceNodes provide a way to abstract over interpolating/concatenating\n\t * snippets of generated JavaScript source code while maintaining the line and\n\t * column information associated with the original source code.\n\t *\n\t * @param aLine The original line number.\n\t * @param aColumn The original column number.\n\t * @param aSource The original source's filename.\n\t * @param aChunks Optional. An array of strings which are snippets of\n\t *        generated JS, or other SourceNodes.\n\t * @param aName The original identifier.\n\t */\n\tfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n\t  this.children = [];\n\t  this.sourceContents = {};\n\t  this.line = aLine == null ? null : aLine;\n\t  this.column = aColumn == null ? null : aColumn;\n\t  this.source = aSource == null ? null : aSource;\n\t  this.name = aName == null ? null : aName;\n\t  this[isSourceNode] = true;\n\t  if (aChunks != null) this.add(aChunks);\n\t}\n\t\n\t/**\n\t * Creates a SourceNode from generated code and a SourceMapConsumer.\n\t *\n\t * @param aGeneratedCode The generated code\n\t * @param aSourceMapConsumer The SourceMap for the generated code\n\t * @param aRelativePath Optional. The path that relative sources in the\n\t *        SourceMapConsumer should be relative to.\n\t */\n\tSourceNode.fromStringWithSourceMap =\n\t  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n\t    // The SourceNode we want to fill with the generated code\n\t    // and the SourceMap\n\t    var node = new SourceNode();\n\t\n\t    // All even indices of this array are one line of the generated code,\n\t    // while all odd indices are the newlines between two adjacent lines\n\t    // (since `REGEX_NEWLINE` captures its match).\n\t    // Processed fragments are accessed by calling `shiftNextLine`.\n\t    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n\t    var remainingLinesIndex = 0;\n\t    var shiftNextLine = function() {\n\t      var lineContents = getNextLine();\n\t      // The last line of a file might not have a newline.\n\t      var newLine = getNextLine() || \"\";\n\t      return lineContents + newLine;\n\t\n\t      function getNextLine() {\n\t        return remainingLinesIndex < remainingLines.length ?\n\t            remainingLines[remainingLinesIndex++] : undefined;\n\t      }\n\t    };\n\t\n\t    // We need to remember the position of \"remainingLines\"\n\t    var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\t\n\t    // The generate SourceNodes we need a code range.\n\t    // To extract it current and last mapping is used.\n\t    // Here we store the last mapping.\n\t    var lastMapping = null;\n\t\n\t    aSourceMapConsumer.eachMapping(function (mapping) {\n\t      if (lastMapping !== null) {\n\t        // We add the code from \"lastMapping\" to \"mapping\":\n\t        // First check if there is a new line in between.\n\t        if (lastGeneratedLine < mapping.generatedLine) {\n\t          // Associate first line with \"lastMapping\"\n\t          addMappingWithCode(lastMapping, shiftNextLine());\n\t          lastGeneratedLine++;\n\t          lastGeneratedColumn = 0;\n\t          // The remaining code is added without mapping\n\t        } else {\n\t          // There is no new line in between.\n\t          // Associate the code between \"lastGeneratedColumn\" and\n\t          // \"mapping.generatedColumn\" with \"lastMapping\"\n\t          var nextLine = remainingLines[remainingLinesIndex] || '';\n\t          var code = nextLine.substr(0, mapping.generatedColumn -\n\t                                        lastGeneratedColumn);\n\t          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n\t                                              lastGeneratedColumn);\n\t          lastGeneratedColumn = mapping.generatedColumn;\n\t          addMappingWithCode(lastMapping, code);\n\t          // No more remaining code, continue\n\t          lastMapping = mapping;\n\t          return;\n\t        }\n\t      }\n\t      // We add the generated code until the first mapping\n\t      // to the SourceNode without any mapping.\n\t      // Each line is added as separate string.\n\t      while (lastGeneratedLine < mapping.generatedLine) {\n\t        node.add(shiftNextLine());\n\t        lastGeneratedLine++;\n\t      }\n\t      if (lastGeneratedColumn < mapping.generatedColumn) {\n\t        var nextLine = remainingLines[remainingLinesIndex] || '';\n\t        node.add(nextLine.substr(0, mapping.generatedColumn));\n\t        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n\t        lastGeneratedColumn = mapping.generatedColumn;\n\t      }\n\t      lastMapping = mapping;\n\t    }, this);\n\t    // We have processed all mappings.\n\t    if (remainingLinesIndex < remainingLines.length) {\n\t      if (lastMapping) {\n\t        // Associate the remaining code in the current line with \"lastMapping\"\n\t        addMappingWithCode(lastMapping, shiftNextLine());\n\t      }\n\t      // and add the remaining lines without any mapping\n\t      node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n\t    }\n\t\n\t    // Copy sourcesContent into SourceNode\n\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t      if (content != null) {\n\t        if (aRelativePath != null) {\n\t          sourceFile = util.join(aRelativePath, sourceFile);\n\t        }\n\t        node.setSourceContent(sourceFile, content);\n\t      }\n\t    });\n\t\n\t    return node;\n\t\n\t    function addMappingWithCode(mapping, code) {\n\t      if (mapping === null || mapping.source === undefined) {\n\t        node.add(code);\n\t      } else {\n\t        var source = aRelativePath\n\t          ? util.join(aRelativePath, mapping.source)\n\t          : mapping.source;\n\t        node.add(new SourceNode(mapping.originalLine,\n\t                                mapping.originalColumn,\n\t                                source,\n\t                                code,\n\t                                mapping.name));\n\t      }\n\t    }\n\t  };\n\t\n\t/**\n\t * Add a chunk of generated JS to this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t *        SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.add = function SourceNode_add(aChunk) {\n\t  if (Array.isArray(aChunk)) {\n\t    aChunk.forEach(function (chunk) {\n\t      this.add(chunk);\n\t    }, this);\n\t  }\n\t  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t    if (aChunk) {\n\t      this.children.push(aChunk);\n\t    }\n\t  }\n\t  else {\n\t    throw new TypeError(\n\t      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t    );\n\t  }\n\t  return this;\n\t};\n\t\n\t/**\n\t * Add a chunk of generated JS to the beginning of this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t *        SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n\t  if (Array.isArray(aChunk)) {\n\t    for (var i = aChunk.length-1; i >= 0; i--) {\n\t      this.prepend(aChunk[i]);\n\t    }\n\t  }\n\t  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t    this.children.unshift(aChunk);\n\t  }\n\t  else {\n\t    throw new TypeError(\n\t      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t    );\n\t  }\n\t  return this;\n\t};\n\t\n\t/**\n\t * Walk over the tree of JS snippets in this node and its children. The\n\t * walking function is called once for each snippet of JS and is passed that\n\t * snippet and the its original associated source's line/column location.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n\t  var chunk;\n\t  for (var i = 0, len = this.children.length; i < len; i++) {\n\t    chunk = this.children[i];\n\t    if (chunk[isSourceNode]) {\n\t      chunk.walk(aFn);\n\t    }\n\t    else {\n\t      if (chunk !== '') {\n\t        aFn(chunk, { source: this.source,\n\t                     line: this.line,\n\t                     column: this.column,\n\t                     name: this.name });\n\t      }\n\t    }\n\t  }\n\t};\n\t\n\t/**\n\t * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n\t * each of `this.children`.\n\t *\n\t * @param aSep The separator.\n\t */\n\tSourceNode.prototype.join = function SourceNode_join(aSep) {\n\t  var newChildren;\n\t  var i;\n\t  var len = this.children.length;\n\t  if (len > 0) {\n\t    newChildren = [];\n\t    for (i = 0; i < len-1; i++) {\n\t      newChildren.push(this.children[i]);\n\t      newChildren.push(aSep);\n\t    }\n\t    newChildren.push(this.children[i]);\n\t    this.children = newChildren;\n\t  }\n\t  return this;\n\t};\n\t\n\t/**\n\t * Call String.prototype.replace on the very right-most source snippet. Useful\n\t * for trimming whitespace from the end of a source node, etc.\n\t *\n\t * @param aPattern The pattern to replace.\n\t * @param aReplacement The thing to replace the pattern with.\n\t */\n\tSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n\t  var lastChild = this.children[this.children.length - 1];\n\t  if (lastChild[isSourceNode]) {\n\t    lastChild.replaceRight(aPattern, aReplacement);\n\t  }\n\t  else if (typeof lastChild === 'string') {\n\t    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n\t  }\n\t  else {\n\t    this.children.push(''.replace(aPattern, aReplacement));\n\t  }\n\t  return this;\n\t};\n\t\n\t/**\n\t * Set the source content for a source file. This will be added to the SourceMapGenerator\n\t * in the sourcesContent field.\n\t *\n\t * @param aSourceFile The filename of the source file\n\t * @param aSourceContent The content of the source file\n\t */\n\tSourceNode.prototype.setSourceContent =\n\t  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n\t    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n\t  };\n\t\n\t/**\n\t * Walk over the tree of SourceNodes. The walking function is called for each\n\t * source file content and is passed the filename and source content.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walkSourceContents =\n\t  function SourceNode_walkSourceContents(aFn) {\n\t    for (var i = 0, len = this.children.length; i < len; i++) {\n\t      if (this.children[i][isSourceNode]) {\n\t        this.children[i].walkSourceContents(aFn);\n\t      }\n\t    }\n\t\n\t    var sources = Object.keys(this.sourceContents);\n\t    for (var i = 0, len = sources.length; i < len; i++) {\n\t      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n\t    }\n\t  };\n\t\n\t/**\n\t * Return the string representation of this source node. Walks over the tree\n\t * and concatenates all the various snippets together to one string.\n\t */\n\tSourceNode.prototype.toString = function SourceNode_toString() {\n\t  var str = \"\";\n\t  this.walk(function (chunk) {\n\t    str += chunk;\n\t  });\n\t  return str;\n\t};\n\t\n\t/**\n\t * Returns the string representation of this source node along with a source\n\t * map.\n\t */\n\tSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n\t  var generated = {\n\t    code: \"\",\n\t    line: 1,\n\t    column: 0\n\t  };\n\t  var map = new SourceMapGenerator(aArgs);\n\t  var sourceMappingActive = false;\n\t  var lastOriginalSource = null;\n\t  var lastOriginalLine = null;\n\t  var lastOriginalColumn = null;\n\t  var lastOriginalName = null;\n\t  this.walk(function (chunk, original) {\n\t    generated.code += chunk;\n\t    if (original.source !== null\n\t        && original.line !== null\n\t        && original.column !== null) {\n\t      if(lastOriginalSource !== original.source\n\t         || lastOriginalLine !== original.line\n\t         || lastOriginalColumn !== original.column\n\t         || lastOriginalName !== original.name) {\n\t        map.addMapping({\n\t          source: original.source,\n\t          original: {\n\t            line: original.line,\n\t            column: original.column\n\t          },\n\t          generated: {\n\t            line: generated.line,\n\t            column: generated.column\n\t          },\n\t          name: original.name\n\t        });\n\t      }\n\t      lastOriginalSource = original.source;\n\t      lastOriginalLine = original.line;\n\t      lastOriginalColumn = original.column;\n\t      lastOriginalName = original.name;\n\t      sourceMappingActive = true;\n\t    } else if (sourceMappingActive) {\n\t      map.addMapping({\n\t        generated: {\n\t          line: generated.line,\n\t          column: generated.column\n\t        }\n\t      });\n\t      lastOriginalSource = null;\n\t      sourceMappingActive = false;\n\t    }\n\t    for (var idx = 0, length = chunk.length; idx < length; idx++) {\n\t      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n\t        generated.line++;\n\t        generated.column = 0;\n\t        // Mappings end at eol\n\t        if (idx + 1 === length) {\n\t          lastOriginalSource = null;\n\t          sourceMappingActive = false;\n\t        } else if (sourceMappingActive) {\n\t          map.addMapping({\n\t            source: original.source,\n\t            original: {\n\t              line: original.line,\n\t              column: original.column\n\t            },\n\t            generated: {\n\t              line: generated.line,\n\t              column: generated.column\n\t            },\n\t            name: original.name\n\t          });\n\t        }\n\t      } else {\n\t        generated.column++;\n\t      }\n\t    }\n\t  });\n\t  this.walkSourceContents(function (sourceFile, sourceContent) {\n\t    map.setSourceContent(sourceFile, sourceContent);\n\t  });\n\t\n\t  return { code: generated.code, map: map };\n\t};\n\t\n\texports.SourceNode = SourceNode;\n\n\n/***/ })\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// source-map.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0fd5815da764db5fb9fe","/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./lib/source-node').SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./source-map.js\n// module id = 0\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar base64VLQ = require('./base64-vlq');\nvar util = require('./util');\nvar ArraySet = require('./array-set').ArraySet;\nvar MappingList = require('./mapping-list').MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n *   - file: The filename of the generated source.\n *   - sourceRoot: A root for all relative URLs in this source map.\n */\nfunction SourceMapGenerator(aArgs) {\n  if (!aArgs) {\n    aArgs = {};\n  }\n  this._file = util.getArg(aArgs, 'file', null);\n  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n  this._sources = new ArraySet();\n  this._names = new ArraySet();\n  this._mappings = new MappingList();\n  this._sourcesContents = null;\n}\n\nSourceMapGenerator.prototype._version = 3;\n\n/**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\nSourceMapGenerator.fromSourceMap =\n  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n    var sourceRoot = aSourceMapConsumer.sourceRoot;\n    var generator = new SourceMapGenerator({\n      file: aSourceMapConsumer.file,\n      sourceRoot: sourceRoot\n    });\n    aSourceMapConsumer.eachMapping(function (mapping) {\n      var newMapping = {\n        generated: {\n          line: mapping.generatedLine,\n          column: mapping.generatedColumn\n        }\n      };\n\n      if (mapping.source != null) {\n        newMapping.source = mapping.source;\n        if (sourceRoot != null) {\n          newMapping.source = util.relative(sourceRoot, newMapping.source);\n        }\n\n        newMapping.original = {\n          line: mapping.originalLine,\n          column: mapping.originalColumn\n        };\n\n        if (mapping.name != null) {\n          newMapping.name = mapping.name;\n        }\n      }\n\n      generator.addMapping(newMapping);\n    });\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n      var sourceRelative = sourceFile;\n      if (sourceRoot !== null) {\n        sourceRelative = util.relative(sourceRoot, sourceFile);\n      }\n\n      if (!generator._sources.has(sourceRelative)) {\n        generator._sources.add(sourceRelative);\n      }\n\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n      if (content != null) {\n        generator.setSourceContent(sourceFile, content);\n      }\n    });\n    return generator;\n  };\n\n/**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n *   - generated: An object with the generated line and column positions.\n *   - original: An object with the original line and column positions.\n *   - source: The original source file (relative to the sourceRoot).\n *   - name: An optional original token name for this mapping.\n */\nSourceMapGenerator.prototype.addMapping =\n  function SourceMapGenerator_addMapping(aArgs) {\n    var generated = util.getArg(aArgs, 'generated');\n    var original = util.getArg(aArgs, 'original', null);\n    var source = util.getArg(aArgs, 'source', null);\n    var name = util.getArg(aArgs, 'name', null);\n\n    if (!this._skipValidation) {\n      this._validateMapping(generated, original, source, name);\n    }\n\n    if (source != null) {\n      source = String(source);\n      if (!this._sources.has(source)) {\n        this._sources.add(source);\n      }\n    }\n\n    if (name != null) {\n      name = String(name);\n      if (!this._names.has(name)) {\n        this._names.add(name);\n      }\n    }\n\n    this._mappings.add({\n      generatedLine: generated.line,\n      generatedColumn: generated.column,\n      originalLine: original != null && original.line,\n      originalColumn: original != null && original.column,\n      source: source,\n      name: name\n    });\n  };\n\n/**\n * Set the source content for a source file.\n */\nSourceMapGenerator.prototype.setSourceContent =\n  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n    var source = aSourceFile;\n    if (this._sourceRoot != null) {\n      source = util.relative(this._sourceRoot, source);\n    }\n\n    if (aSourceContent != null) {\n      // Add the source content to the _sourcesContents map.\n      // Create a new _sourcesContents map if the property is null.\n      if (!this._sourcesContents) {\n        this._sourcesContents = Object.create(null);\n      }\n      this._sourcesContents[util.toSetString(source)] = aSourceContent;\n    } else if (this._sourcesContents) {\n      // Remove the source file from the _sourcesContents map.\n      // If the _sourcesContents map is empty, set the property to null.\n      delete this._sourcesContents[util.toSetString(source)];\n      if (Object.keys(this._sourcesContents).length === 0) {\n        this._sourcesContents = null;\n      }\n    }\n  };\n\n/**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n *        If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n *        to be applied. If relative, it is relative to the SourceMapConsumer.\n *        This parameter is needed when the two source maps aren't in the same\n *        directory, and the source map to be applied contains relative source\n *        paths. If so, those relative source paths need to be rewritten\n *        relative to the SourceMapGenerator.\n */\nSourceMapGenerator.prototype.applySourceMap =\n  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n    var sourceFile = aSourceFile;\n    // If aSourceFile is omitted, we will use the file property of the SourceMap\n    if (aSourceFile == null) {\n      if (aSourceMapConsumer.file == null) {\n        throw new Error(\n          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n          'or the source map\\'s \"file\" property. Both were omitted.'\n        );\n      }\n      sourceFile = aSourceMapConsumer.file;\n    }\n    var sourceRoot = this._sourceRoot;\n    // Make \"sourceFile\" relative if an absolute Url is passed.\n    if (sourceRoot != null) {\n      sourceFile = util.relative(sourceRoot, sourceFile);\n    }\n    // Applying the SourceMap can add and remove items from the sources and\n    // the names array.\n    var newSources = new ArraySet();\n    var newNames = new ArraySet();\n\n    // Find mappings for the \"sourceFile\"\n    this._mappings.unsortedForEach(function (mapping) {\n      if (mapping.source === sourceFile && mapping.originalLine != null) {\n        // Check if it can be mapped by the source map, then update the mapping.\n        var original = aSourceMapConsumer.originalPositionFor({\n          line: mapping.originalLine,\n          column: mapping.originalColumn\n        });\n        if (original.source != null) {\n          // Copy mapping\n          mapping.source = original.source;\n          if (aSourceMapPath != null) {\n            mapping.source = util.join(aSourceMapPath, mapping.source)\n          }\n          if (sourceRoot != null) {\n            mapping.source = util.relative(sourceRoot, mapping.source);\n          }\n          mapping.originalLine = original.line;\n          mapping.originalColumn = original.column;\n          if (original.name != null) {\n            mapping.name = original.name;\n          }\n        }\n      }\n\n      var source = mapping.source;\n      if (source != null && !newSources.has(source)) {\n        newSources.add(source);\n      }\n\n      var name = mapping.name;\n      if (name != null && !newNames.has(name)) {\n        newNames.add(name);\n      }\n\n    }, this);\n    this._sources = newSources;\n    this._names = newNames;\n\n    // Copy sourcesContents of applied map.\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n      if (content != null) {\n        if (aSourceMapPath != null) {\n          sourceFile = util.join(aSourceMapPath, sourceFile);\n        }\n        if (sourceRoot != null) {\n          sourceFile = util.relative(sourceRoot, sourceFile);\n        }\n        this.setSourceContent(sourceFile, content);\n      }\n    }, this);\n  };\n\n/**\n * A mapping can have one of the three levels of data:\n *\n *   1. Just the generated position.\n *   2. The Generated position, original position, and original source.\n *   3. Generated and original position, original source, as well as a name\n *      token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\nSourceMapGenerator.prototype._validateMapping =\n  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n                                              aName) {\n    // When aOriginal is truthy but has empty values for .line and .column,\n    // it is most likely a programmer error. In this case we throw a very\n    // specific error message to try to guide them the right way.\n    // For example: https://github.com/Polymer/polymer-bundler/pull/519\n    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n        throw new Error(\n            'original.line and original.column are not numbers -- you probably meant to omit ' +\n            'the original mapping entirely and only map the generated position. If so, pass ' +\n            'null for the original mapping instead of an object with empty or null values.'\n        );\n    }\n\n    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n        && aGenerated.line > 0 && aGenerated.column >= 0\n        && !aOriginal && !aSource && !aName) {\n      // Case 1.\n      return;\n    }\n    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n             && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n             && aGenerated.line > 0 && aGenerated.column >= 0\n             && aOriginal.line > 0 && aOriginal.column >= 0\n             && aSource) {\n      // Cases 2 and 3.\n      return;\n    }\n    else {\n      throw new Error('Invalid mapping: ' + JSON.stringify({\n        generated: aGenerated,\n        source: aSource,\n        original: aOriginal,\n        name: aName\n      }));\n    }\n  };\n\n/**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\nSourceMapGenerator.prototype._serializeMappings =\n  function SourceMapGenerator_serializeMappings() {\n    var previousGeneratedColumn = 0;\n    var previousGeneratedLine = 1;\n    var previousOriginalColumn = 0;\n    var previousOriginalLine = 0;\n    var previousName = 0;\n    var previousSource = 0;\n    var result = '';\n    var next;\n    var mapping;\n    var nameIdx;\n    var sourceIdx;\n\n    var mappings = this._mappings.toArray();\n    for (var i = 0, len = mappings.length; i < len; i++) {\n      mapping = mappings[i];\n      next = ''\n\n      if (mapping.generatedLine !== previousGeneratedLine) {\n        previousGeneratedColumn = 0;\n        while (mapping.generatedLine !== previousGeneratedLine) {\n          next += ';';\n          previousGeneratedLine++;\n        }\n      }\n      else {\n        if (i > 0) {\n          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n            continue;\n          }\n          next += ',';\n        }\n      }\n\n      next += base64VLQ.encode(mapping.generatedColumn\n                                 - previousGeneratedColumn);\n      previousGeneratedColumn = mapping.generatedColumn;\n\n      if (mapping.source != null) {\n        sourceIdx = this._sources.indexOf(mapping.source);\n        next += base64VLQ.encode(sourceIdx - previousSource);\n        previousSource = sourceIdx;\n\n        // lines are stored 0-based in SourceMap spec version 3\n        next += base64VLQ.encode(mapping.originalLine - 1\n                                   - previousOriginalLine);\n        previousOriginalLine = mapping.originalLine - 1;\n\n        next += base64VLQ.encode(mapping.originalColumn\n                                   - previousOriginalColumn);\n        previousOriginalColumn = mapping.originalColumn;\n\n        if (mapping.name != null) {\n          nameIdx = this._names.indexOf(mapping.name);\n          next += base64VLQ.encode(nameIdx - previousName);\n          previousName = nameIdx;\n        }\n      }\n\n      result += next;\n    }\n\n    return result;\n  };\n\nSourceMapGenerator.prototype._generateSourcesContent =\n  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n    return aSources.map(function (source) {\n      if (!this._sourcesContents) {\n        return null;\n      }\n      if (aSourceRoot != null) {\n        source = util.relative(aSourceRoot, source);\n      }\n      var key = util.toSetString(source);\n      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n        ? this._sourcesContents[key]\n        : null;\n    }, this);\n  };\n\n/**\n * Externalize the source map.\n */\nSourceMapGenerator.prototype.toJSON =\n  function SourceMapGenerator_toJSON() {\n    var map = {\n      version: this._version,\n      sources: this._sources.toArray(),\n      names: this._names.toArray(),\n      mappings: this._serializeMappings()\n    };\n    if (this._file != null) {\n      map.file = this._file;\n    }\n    if (this._sourceRoot != null) {\n      map.sourceRoot = this._sourceRoot;\n    }\n    if (this._sourcesContents) {\n      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n    }\n\n    return map;\n  };\n\n/**\n * Render the source map being generated to a string.\n */\nSourceMapGenerator.prototype.toString =\n  function SourceMapGenerator_toString() {\n    return JSON.stringify(this.toJSON());\n  };\n\nexports.SourceMapGenerator = SourceMapGenerator;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-generator.js\n// module id = 1\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *  * Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *  * Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *  * Neither the name of Google Inc. nor the names of its\n *    contributors may be used to endorse or promote products derived\n *    from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar base64 = require('./base64');\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n//   Continuation\n//   |    Sign\n//   |    |\n//   V    V\n//   101011\n\nvar VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit.  For example, as decimals:\n *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n  return aValue < 0\n    ? ((-aValue) << 1) + 1\n    : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit.  For example, as decimals:\n *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\nfunction fromVLQSigned(aValue) {\n  var isNegative = (aValue & 1) === 1;\n  var shifted = aValue >> 1;\n  return isNegative\n    ? -shifted\n    : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n  var encoded = \"\";\n  var digit;\n\n  var vlq = toVLQSigned(aValue);\n\n  do {\n    digit = vlq & VLQ_BASE_MASK;\n    vlq >>>= VLQ_BASE_SHIFT;\n    if (vlq > 0) {\n      // There are still more digits in this value, so we must make sure the\n      // continuation bit is marked.\n      digit |= VLQ_CONTINUATION_BIT;\n    }\n    encoded += base64.encode(digit);\n  } while (vlq > 0);\n\n  return encoded;\n};\n\n/**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n  var strLen = aStr.length;\n  var result = 0;\n  var shift = 0;\n  var continuation, digit;\n\n  do {\n    if (aIndex >= strLen) {\n      throw new Error(\"Expected more digits in base 64 VLQ value.\");\n    }\n\n    digit = base64.decode(aStr.charCodeAt(aIndex++));\n    if (digit === -1) {\n      throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n    }\n\n    continuation = !!(digit & VLQ_CONTINUATION_BIT);\n    digit &= VLQ_BASE_MASK;\n    result = result + (digit << shift);\n    shift += VLQ_BASE_SHIFT;\n  } while (continuation);\n\n  aOutParam.value = fromVLQSigned(result);\n  aOutParam.rest = aIndex;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64-vlq.js\n// module id = 2\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function (number) {\n  if (0 <= number && number < intToCharMap.length) {\n    return intToCharMap[number];\n  }\n  throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n\n/**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\nexports.decode = function (charCode) {\n  var bigA = 65;     // 'A'\n  var bigZ = 90;     // 'Z'\n\n  var littleA = 97;  // 'a'\n  var littleZ = 122; // 'z'\n\n  var zero = 48;     // '0'\n  var nine = 57;     // '9'\n\n  var plus = 43;     // '+'\n  var slash = 47;    // '/'\n\n  var littleOffset = 26;\n  var numberOffset = 52;\n\n  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n  if (bigA <= charCode && charCode <= bigZ) {\n    return (charCode - bigA);\n  }\n\n  // 26 - 51: abcdefghijklmnopqrstuvwxyz\n  if (littleA <= charCode && charCode <= littleZ) {\n    return (charCode - littleA + littleOffset);\n  }\n\n  // 52 - 61: 0123456789\n  if (zero <= charCode && charCode <= nine) {\n    return (charCode - zero + numberOffset);\n  }\n\n  // 62: +\n  if (charCode == plus) {\n    return 62;\n  }\n\n  // 63: /\n  if (charCode == slash) {\n    return 63;\n  }\n\n  // Invalid base64 digit.\n  return -1;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64.js\n// module id = 3\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n  if (aName in aArgs) {\n    return aArgs[aName];\n  } else if (arguments.length === 3) {\n    return aDefaultValue;\n  } else {\n    throw new Error('\"' + aName + '\" is a required argument.');\n  }\n}\nexports.getArg = getArg;\n\nvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\nvar dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n  var match = aUrl.match(urlRegexp);\n  if (!match) {\n    return null;\n  }\n  return {\n    scheme: match[1],\n    auth: match[2],\n    host: match[3],\n    port: match[4],\n    path: match[5]\n  };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n  var url = '';\n  if (aParsedUrl.scheme) {\n    url += aParsedUrl.scheme + ':';\n  }\n  url += '//';\n  if (aParsedUrl.auth) {\n    url += aParsedUrl.auth + '@';\n  }\n  if (aParsedUrl.host) {\n    url += aParsedUrl.host;\n  }\n  if (aParsedUrl.port) {\n    url += \":\" + aParsedUrl.port\n  }\n  if (aParsedUrl.path) {\n    url += aParsedUrl.path;\n  }\n  return url;\n}\nexports.urlGenerate = urlGenerate;\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '<dir>/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nfunction normalize(aPath) {\n  var path = aPath;\n  var url = urlParse(aPath);\n  if (url) {\n    if (!url.path) {\n      return aPath;\n    }\n    path = url.path;\n  }\n  var isAbsolute = exports.isAbsolute(path);\n\n  var parts = path.split(/\\/+/);\n  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n    part = parts[i];\n    if (part === '.') {\n      parts.splice(i, 1);\n    } else if (part === '..') {\n      up++;\n    } else if (up > 0) {\n      if (part === '') {\n        // The first part is blank if the path is absolute. Trying to go\n        // above the root is a no-op. Therefore we can remove all '..' parts\n        // directly after the root.\n        parts.splice(i + 1, up);\n        up = 0;\n      } else {\n        parts.splice(i, 2);\n        up--;\n      }\n    }\n  }\n  path = parts.join('/');\n\n  if (path === '') {\n    path = isAbsolute ? '/' : '.';\n  }\n\n  if (url) {\n    url.path = path;\n    return urlGenerate(url);\n  }\n  return path;\n}\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n *   first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n *   is updated with the result and aRoot is returned. Otherwise the result\n *   is returned.\n *   - If aPath is absolute, the result is aPath.\n *   - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n  if (aRoot === \"\") {\n    aRoot = \".\";\n  }\n  if (aPath === \"\") {\n    aPath = \".\";\n  }\n  var aPathUrl = urlParse(aPath);\n  var aRootUrl = urlParse(aRoot);\n  if (aRootUrl) {\n    aRoot = aRootUrl.path || '/';\n  }\n\n  // `join(foo, '//www.example.org')`\n  if (aPathUrl && !aPathUrl.scheme) {\n    if (aRootUrl) {\n      aPathUrl.scheme = aRootUrl.scheme;\n    }\n    return urlGenerate(aPathUrl);\n  }\n\n  if (aPathUrl || aPath.match(dataUrlRegexp)) {\n    return aPath;\n  }\n\n  // `join('http://', 'www.example.com')`\n  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n    aRootUrl.host = aPath;\n    return urlGenerate(aRootUrl);\n  }\n\n  var joined = aPath.charAt(0) === '/'\n    ? aPath\n    : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n  if (aRootUrl) {\n    aRootUrl.path = joined;\n    return urlGenerate(aRootUrl);\n  }\n  return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function (aPath) {\n  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n  if (aRoot === \"\") {\n    aRoot = \".\";\n  }\n\n  aRoot = aRoot.replace(/\\/$/, '');\n\n  // It is possible for the path to be above the root. In this case, simply\n  // checking whether the root is a prefix of the path won't work. Instead, we\n  // need to remove components from the root one by one, until either we find\n  // a prefix that fits, or we run out of components to remove.\n  var level = 0;\n  while (aPath.indexOf(aRoot + '/') !== 0) {\n    var index = aRoot.lastIndexOf(\"/\");\n    if (index < 0) {\n      return aPath;\n    }\n\n    // If the only part of the root that is left is the scheme (i.e. http://,\n    // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n    // have exhausted all components, so the path is not relative to the root.\n    aRoot = aRoot.slice(0, index);\n    if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n      return aPath;\n    }\n\n    ++level;\n  }\n\n  // Make sure we add a \"../\" for each component we removed from the root.\n  return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nvar supportsNullProto = (function () {\n  var obj = Object.create(null);\n  return !('__proto__' in obj);\n}());\n\nfunction identity (s) {\n  return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n  if (isProtoString(aStr)) {\n    return '$' + aStr;\n  }\n\n  return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n  if (isProtoString(aStr)) {\n    return aStr.slice(1);\n  }\n\n  return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n  if (!s) {\n    return false;\n  }\n\n  var length = s.length;\n\n  if (length < 9 /* \"__proto__\".length */) {\n    return false;\n  }\n\n  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||\n      s.charCodeAt(length - 2) !== 95  /* '_' */ ||\n      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n      s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n      s.charCodeAt(length - 8) !== 95  /* '_' */ ||\n      s.charCodeAt(length - 9) !== 95  /* '_' */) {\n    return false;\n  }\n\n  for (var i = length - 10; i >= 0; i--) {\n    if (s.charCodeAt(i) !== 36 /* '$' */) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n  var cmp = strcmp(mappingA.source, mappingB.source);\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0 || onlyCompareOriginal) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedLine - mappingB.generatedLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0 || onlyCompareGenerated) {\n    return cmp;\n  }\n\n  cmp = strcmp(mappingA.source, mappingB.source);\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction strcmp(aStr1, aStr2) {\n  if (aStr1 === aStr2) {\n    return 0;\n  }\n\n  if (aStr1 === null) {\n    return 1; // aStr2 !== null\n  }\n\n  if (aStr2 === null) {\n    return -1; // aStr1 !== null\n  }\n\n  if (aStr1 > aStr2) {\n    return 1;\n  }\n\n  return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = strcmp(mappingA.source, mappingB.source);\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n/**\n * Strip any JSON XSSI avoidance prefix from the string (as documented\n * in the source maps specification), and then parse the string as\n * JSON.\n */\nfunction parseSourceMapInput(str) {\n  return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n}\nexports.parseSourceMapInput = parseSourceMapInput;\n\n/**\n * Compute the URL of a source given the the source root, the source's\n * URL, and the source map's URL.\n */\nfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n  sourceURL = sourceURL || '';\n\n  if (sourceRoot) {\n    // This follows what Chrome does.\n    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n      sourceRoot += '/';\n    }\n    // The spec says:\n    //   Line 4: An optional source root, useful for relocating source\n    //   files on a server or removing repeated values in the\n    //   â€œsourcesâ€� entry.  This value is prepended to the individual\n    //   entries in the â€œsourceâ€� field.\n    sourceURL = sourceRoot + sourceURL;\n  }\n\n  // Historically, SourceMapConsumer did not take the sourceMapURL as\n  // a parameter.  This mode is still somewhat supported, which is why\n  // this code block is conditional.  However, it's preferable to pass\n  // the source map URL to SourceMapConsumer, so that this function\n  // can implement the source URL resolution algorithm as outlined in\n  // the spec.  This block is basically the equivalent of:\n  //    new URL(sourceURL, sourceMapURL).toString()\n  // ... except it avoids using URL, which wasn't available in the\n  // older releases of node still supported by this library.\n  //\n  // The spec says:\n  //   If the sources are not absolute URLs after prepending of the\n  //   â€œsourceRootâ€�, the sources are resolved relative to the\n  //   SourceMap (like resolving script src in a html document).\n  if (sourceMapURL) {\n    var parsed = urlParse(sourceMapURL);\n    if (!parsed) {\n      throw new Error(\"sourceMapURL could not be parsed\");\n    }\n    if (parsed.path) {\n      // Strip the last path component, but keep the \"/\".\n      var index = parsed.path.lastIndexOf('/');\n      if (index >= 0) {\n        parsed.path = parsed.path.substring(0, index + 1);\n      }\n    }\n    sourceURL = join(urlGenerate(parsed), sourceURL);\n  }\n\n  return normalize(sourceURL);\n}\nexports.computeSourceURL = computeSourceURL;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/util.js\n// module id = 4\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar has = Object.prototype.hasOwnProperty;\nvar hasNativeMap = typeof Map !== \"undefined\";\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nfunction ArraySet() {\n  this._array = [];\n  this._set = hasNativeMap ? new Map() : Object.create(null);\n}\n\n/**\n * Static method for creating ArraySet instances from an existing array.\n */\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n  var set = new ArraySet();\n  for (var i = 0, len = aArray.length; i < len; i++) {\n    set.add(aArray[i], aAllowDuplicates);\n  }\n  return set;\n};\n\n/**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\nArraySet.prototype.size = function ArraySet_size() {\n  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n};\n\n/**\n * Add the given string to this set.\n *\n * @param String aStr\n */\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n  var idx = this._array.length;\n  if (!isDuplicate || aAllowDuplicates) {\n    this._array.push(aStr);\n  }\n  if (!isDuplicate) {\n    if (hasNativeMap) {\n      this._set.set(aStr, idx);\n    } else {\n      this._set[sStr] = idx;\n    }\n  }\n};\n\n/**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\nArraySet.prototype.has = function ArraySet_has(aStr) {\n  if (hasNativeMap) {\n    return this._set.has(aStr);\n  } else {\n    var sStr = util.toSetString(aStr);\n    return has.call(this._set, sStr);\n  }\n};\n\n/**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n  if (hasNativeMap) {\n    var idx = this._set.get(aStr);\n    if (idx >= 0) {\n        return idx;\n    }\n  } else {\n    var sStr = util.toSetString(aStr);\n    if (has.call(this._set, sStr)) {\n      return this._set[sStr];\n    }\n  }\n\n  throw new Error('\"' + aStr + '\" is not in the set.');\n};\n\n/**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\nArraySet.prototype.at = function ArraySet_at(aIdx) {\n  if (aIdx >= 0 && aIdx < this._array.length) {\n    return this._array[aIdx];\n  }\n  throw new Error('No element indexed by ' + aIdx);\n};\n\n/**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\nArraySet.prototype.toArray = function ArraySet_toArray() {\n  return this._array.slice();\n};\n\nexports.ArraySet = ArraySet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/array-set.js\n// module id = 5\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n  // Optimized for most common case\n  var lineA = mappingA.generatedLine;\n  var lineB = mappingB.generatedLine;\n  var columnA = mappingA.generatedColumn;\n  var columnB = mappingB.generatedColumn;\n  return lineB > lineA || lineB == lineA && columnB >= columnA ||\n         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nfunction MappingList() {\n  this._array = [];\n  this._sorted = true;\n  // Serves as infimum\n  this._last = {generatedLine: -1, generatedColumn: 0};\n}\n\n/**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\nMappingList.prototype.unsortedForEach =\n  function MappingList_forEach(aCallback, aThisArg) {\n    this._array.forEach(aCallback, aThisArg);\n  };\n\n/**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\nMappingList.prototype.add = function MappingList_add(aMapping) {\n  if (generatedPositionAfter(this._last, aMapping)) {\n    this._last = aMapping;\n    this._array.push(aMapping);\n  } else {\n    this._sorted = false;\n    this._array.push(aMapping);\n  }\n};\n\n/**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\nMappingList.prototype.toArray = function MappingList_toArray() {\n  if (!this._sorted) {\n    this._array.sort(util.compareByGeneratedPositionsInflated);\n    this._sorted = true;\n  }\n  return this._array;\n};\n\nexports.MappingList = MappingList;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/mapping-list.js\n// module id = 6\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar binarySearch = require('./binary-search');\nvar ArraySet = require('./array-set').ArraySet;\nvar base64VLQ = require('./base64-vlq');\nvar quickSort = require('./quick-sort').quickSort;\n\nfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\n  var sourceMap = aSourceMap;\n  if (typeof aSourceMap === 'string') {\n    sourceMap = util.parseSourceMapInput(aSourceMap);\n  }\n\n  return sourceMap.sections != null\n    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n}\n\nSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\n}\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nSourceMapConsumer.prototype._version = 3;\n\n// `__generatedMappings` and `__originalMappings` are arrays that hold the\n// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n// are lazily instantiated, accessed via the `_generatedMappings` and\n// `_originalMappings` getters respectively, and we only parse the mappings\n// and create these arrays once queried for a source location. We jump through\n// these hoops because there can be many thousands of mappings, and parsing\n// them is expensive, so we only want to do it if we must.\n//\n// Each object in the arrays is of the form:\n//\n//     {\n//       generatedLine: The line number in the generated code,\n//       generatedColumn: The column number in the generated code,\n//       source: The path to the original source file that generated this\n//               chunk of code,\n//       originalLine: The line number in the original source that\n//                     corresponds to this chunk of generated code,\n//       originalColumn: The column number in the original source that\n//                       corresponds to this chunk of generated code,\n//       name: The name of the original symbol which generated this chunk of\n//             code.\n//     }\n//\n// All properties except for `generatedLine` and `generatedColumn` can be\n// `null`.\n//\n// `_generatedMappings` is ordered by the generated positions.\n//\n// `_originalMappings` is ordered by the original positions.\n\nSourceMapConsumer.prototype.__generatedMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n  configurable: true,\n  enumerable: true,\n  get: function () {\n    if (!this.__generatedMappings) {\n      this._parseMappings(this._mappings, this.sourceRoot);\n    }\n\n    return this.__generatedMappings;\n  }\n});\n\nSourceMapConsumer.prototype.__originalMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n  configurable: true,\n  enumerable: true,\n  get: function () {\n    if (!this.__originalMappings) {\n      this._parseMappings(this._mappings, this.sourceRoot);\n    }\n\n    return this.__originalMappings;\n  }\n});\n\nSourceMapConsumer.prototype._charIsMappingSeparator =\n  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n    var c = aStr.charAt(index);\n    return c === \";\" || c === \",\";\n  };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nSourceMapConsumer.prototype._parseMappings =\n  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n    throw new Error(\"Subclasses must implement _parseMappings\");\n  };\n\nSourceMapConsumer.GENERATED_ORDER = 1;\nSourceMapConsumer.ORIGINAL_ORDER = 2;\n\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n/**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n *        The function that is called with each mapping.\n * @param Object aContext\n *        Optional. If specified, this object will be the value of `this` every\n *        time that `aCallback` is called.\n * @param aOrder\n *        Either `SourceMapConsumer.GENERATED_ORDER` or\n *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n *        iterate over the mappings sorted by the generated file's line/column\n *        order or the original's source/line/column order, respectively. Defaults to\n *        `SourceMapConsumer.GENERATED_ORDER`.\n */\nSourceMapConsumer.prototype.eachMapping =\n  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n    var context = aContext || null;\n    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n    var mappings;\n    switch (order) {\n    case SourceMapConsumer.GENERATED_ORDER:\n      mappings = this._generatedMappings;\n      break;\n    case SourceMapConsumer.ORIGINAL_ORDER:\n      mappings = this._originalMappings;\n      break;\n    default:\n      throw new Error(\"Unknown order of iteration.\");\n    }\n\n    var sourceRoot = this.sourceRoot;\n    mappings.map(function (mapping) {\n      var source = mapping.source === null ? null : this._sources.at(mapping.source);\n      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\n      return {\n        source: source,\n        generatedLine: mapping.generatedLine,\n        generatedColumn: mapping.generatedColumn,\n        originalLine: mapping.originalLine,\n        originalColumn: mapping.originalColumn,\n        name: mapping.name === null ? null : this._names.at(mapping.name)\n      };\n    }, this).forEach(aCallback, context);\n  };\n\n/**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n *   - source: The filename of the original source.\n *   - line: The line number in the original source.  The line number is 1-based.\n *   - column: Optional. the column number in the original source.\n *    The column number is 0-based.\n *\n * and an array of objects is returned, each with the following properties:\n *\n *   - line: The line number in the generated source, or null.  The\n *    line number is 1-based.\n *   - column: The column number in the generated source, or null.\n *    The column number is 0-based.\n */\nSourceMapConsumer.prototype.allGeneratedPositionsFor =\n  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n    var line = util.getArg(aArgs, 'line');\n\n    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n    // returns the index of the closest mapping less than the needle. By\n    // setting needle.originalColumn to 0, we thus find the last mapping for\n    // the given line, provided such a mapping exists.\n    var needle = {\n      source: util.getArg(aArgs, 'source'),\n      originalLine: line,\n      originalColumn: util.getArg(aArgs, 'column', 0)\n    };\n\n    needle.source = this._findSourceIndex(needle.source);\n    if (needle.source < 0) {\n      return [];\n    }\n\n    var mappings = [];\n\n    var index = this._findMapping(needle,\n                                  this._originalMappings,\n                                  \"originalLine\",\n                                  \"originalColumn\",\n                                  util.compareByOriginalPositions,\n                                  binarySearch.LEAST_UPPER_BOUND);\n    if (index >= 0) {\n      var mapping = this._originalMappings[index];\n\n      if (aArgs.column === undefined) {\n        var originalLine = mapping.originalLine;\n\n        // Iterate until either we run out of mappings, or we run into\n        // a mapping for a different line than the one we found. Since\n        // mappings are sorted, this is guaranteed to find all mappings for\n        // the line we found.\n        while (mapping && mapping.originalLine === originalLine) {\n          mappings.push({\n            line: util.getArg(mapping, 'generatedLine', null),\n            column: util.getArg(mapping, 'generatedColumn', null),\n            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n          });\n\n          mapping = this._originalMappings[++index];\n        }\n      } else {\n        var originalColumn = mapping.originalColumn;\n\n        // Iterate until either we run out of mappings, or we run into\n        // a mapping for a different line than the one we were searching for.\n        // Since mappings are sorted, this is guaranteed to find all mappings for\n        // the line we are searching for.\n        while (mapping &&\n               mapping.originalLine === line &&\n               mapping.originalColumn == originalColumn) {\n          mappings.push({\n            line: util.getArg(mapping, 'generatedLine', null),\n            column: util.getArg(mapping, 'generatedColumn', null),\n            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n          });\n\n          mapping = this._originalMappings[++index];\n        }\n      }\n    }\n\n    return mappings;\n  };\n\nexports.SourceMapConsumer = SourceMapConsumer;\n\n/**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The first parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n *   - version: Which version of the source map spec this map is following.\n *   - sources: An array of URLs to the original source files.\n *   - names: An array of identifiers which can be referrenced by individual mappings.\n *   - sourceRoot: Optional. The URL root from which all sources are relative.\n *   - sourcesContent: Optional. An array of contents of the original source files.\n *   - mappings: A string of base64 VLQs which contain the actual mappings.\n *   - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n *     {\n *       version : 3,\n *       file: \"out.js\",\n *       sourceRoot : \"\",\n *       sources: [\"foo.js\", \"bar.js\"],\n *       names: [\"src\", \"maps\", \"are\", \"fun\"],\n *       mappings: \"AA,AB;;ABCDE;\"\n *     }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found.  This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n  var sourceMap = aSourceMap;\n  if (typeof aSourceMap === 'string') {\n    sourceMap = util.parseSourceMapInput(aSourceMap);\n  }\n\n  var version = util.getArg(sourceMap, 'version');\n  var sources = util.getArg(sourceMap, 'sources');\n  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n  // requires the array) to play nice here.\n  var names = util.getArg(sourceMap, 'names', []);\n  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n  var mappings = util.getArg(sourceMap, 'mappings');\n  var file = util.getArg(sourceMap, 'file', null);\n\n  // Once again, Sass deviates from the spec and supplies the version as a\n  // string rather than a number, so we use loose equality checking here.\n  if (version != this._version) {\n    throw new Error('Unsupported version: ' + version);\n  }\n\n  if (sourceRoot) {\n    sourceRoot = util.normalize(sourceRoot);\n  }\n\n  sources = sources\n    .map(String)\n    // Some source maps produce relative source paths like \"./foo.js\" instead of\n    // \"foo.js\".  Normalize these first so that future comparisons will succeed.\n    // See bugzil.la/1090768.\n    .map(util.normalize)\n    // Always ensure that absolute sources are internally stored relative to\n    // the source root, if the source root is absolute. Not doing this would\n    // be particularly problematic when the source root is a prefix of the\n    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n    .map(function (source) {\n      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n        ? util.relative(sourceRoot, source)\n        : source;\n    });\n\n  // Pass `true` below to allow duplicate names and sources. While source maps\n  // are intended to be compressed and deduplicated, the TypeScript compiler\n  // sometimes generates source maps with duplicates in them. See Github issue\n  // #72 and bugzil.la/889492.\n  this._names = ArraySet.fromArray(names.map(String), true);\n  this._sources = ArraySet.fromArray(sources, true);\n\n  this._absoluteSources = this._sources.toArray().map(function (s) {\n    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n  });\n\n  this.sourceRoot = sourceRoot;\n  this.sourcesContent = sourcesContent;\n  this._mappings = mappings;\n  this._sourceMapURL = aSourceMapURL;\n  this.file = file;\n}\n\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n/**\n * Utility function to find the index of a source.  Returns -1 if not\n * found.\n */\nBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n  var relativeSource = aSource;\n  if (this.sourceRoot != null) {\n    relativeSource = util.relative(this.sourceRoot, relativeSource);\n  }\n\n  if (this._sources.has(relativeSource)) {\n    return this._sources.indexOf(relativeSource);\n  }\n\n  // Maybe aSource is an absolute URL as returned by |sources|.  In\n  // this case we can't simply undo the transform.\n  var i;\n  for (i = 0; i < this._absoluteSources.length; ++i) {\n    if (this._absoluteSources[i] == aSource) {\n      return i;\n    }\n  }\n\n  return -1;\n};\n\n/**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n *        The source map that will be consumed.\n * @param String aSourceMapURL\n *        The URL at which the source map can be found (optional)\n * @returns BasicSourceMapConsumer\n */\nBasicSourceMapConsumer.fromSourceMap =\n  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\n    var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n    smc.sourceRoot = aSourceMap._sourceRoot;\n    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n                                                            smc.sourceRoot);\n    smc.file = aSourceMap._file;\n    smc._sourceMapURL = aSourceMapURL;\n    smc._absoluteSources = smc._sources.toArray().map(function (s) {\n      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n    });\n\n    // Because we are modifying the entries (by converting string sources and\n    // names to indices into the sources and names ArraySets), we have to make\n    // a copy of the entry or else bad things happen. Shared mutable state\n    // strikes again! See github issue #191.\n\n    var generatedMappings = aSourceMap._mappings.toArray().slice();\n    var destGeneratedMappings = smc.__generatedMappings = [];\n    var destOriginalMappings = smc.__originalMappings = [];\n\n    for (var i = 0, length = generatedMappings.length; i < length; i++) {\n      var srcMapping = generatedMappings[i];\n      var destMapping = new Mapping;\n      destMapping.generatedLine = srcMapping.generatedLine;\n      destMapping.generatedColumn = srcMapping.generatedColumn;\n\n      if (srcMapping.source) {\n        destMapping.source = sources.indexOf(srcMapping.source);\n        destMapping.originalLine = srcMapping.originalLine;\n        destMapping.originalColumn = srcMapping.originalColumn;\n\n        if (srcMapping.name) {\n          destMapping.name = names.indexOf(srcMapping.name);\n        }\n\n        destOriginalMappings.push(destMapping);\n      }\n\n      destGeneratedMappings.push(destMapping);\n    }\n\n    quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n    return smc;\n  };\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nBasicSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n  get: function () {\n    return this._absoluteSources.slice();\n  }\n});\n\n/**\n * Provide the JIT with a nice shape / hidden class.\n */\nfunction Mapping() {\n  this.generatedLine = 0;\n  this.generatedColumn = 0;\n  this.source = null;\n  this.originalLine = null;\n  this.originalColumn = null;\n  this.name = null;\n}\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nBasicSourceMapConsumer.prototype._parseMappings =\n  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n    var generatedLine = 1;\n    var previousGeneratedColumn = 0;\n    var previousOriginalLine = 0;\n    var previousOriginalColumn = 0;\n    var previousSource = 0;\n    var previousName = 0;\n    var length = aStr.length;\n    var index = 0;\n    var cachedSegments = {};\n    var temp = {};\n    var originalMappings = [];\n    var generatedMappings = [];\n    var mapping, str, segment, end, value;\n\n    while (index < length) {\n      if (aStr.charAt(index) === ';') {\n        generatedLine++;\n        index++;\n        previousGeneratedColumn = 0;\n      }\n      else if (aStr.charAt(index) === ',') {\n        index++;\n      }\n      else {\n        mapping = new Mapping();\n        mapping.generatedLine = generatedLine;\n\n        // Because each offset is encoded relative to the previous one,\n        // many segments often have the same encoding. We can exploit this\n        // fact by caching the parsed variable length fields of each segment,\n        // allowing us to avoid a second parse if we encounter the same\n        // segment again.\n        for (end = index; end < length; end++) {\n          if (this._charIsMappingSeparator(aStr, end)) {\n            break;\n          }\n        }\n        str = aStr.slice(index, end);\n\n        segment = cachedSegments[str];\n        if (segment) {\n          index += str.length;\n        } else {\n          segment = [];\n          while (index < end) {\n            base64VLQ.decode(aStr, index, temp);\n            value = temp.value;\n            index = temp.rest;\n            segment.push(value);\n          }\n\n          if (segment.length === 2) {\n            throw new Error('Found a source, but no line and column');\n          }\n\n          if (segment.length === 3) {\n            throw new Error('Found a source and line, but no column');\n          }\n\n          cachedSegments[str] = segment;\n        }\n\n        // Generated column.\n        mapping.generatedColumn = previousGeneratedColumn + segment[0];\n        previousGeneratedColumn = mapping.generatedColumn;\n\n        if (segment.length > 1) {\n          // Original source.\n          mapping.source = previousSource + segment[1];\n          previousSource += segment[1];\n\n          // Original line.\n          mapping.originalLine = previousOriginalLine + segment[2];\n          previousOriginalLine = mapping.originalLine;\n          // Lines are stored 0-based\n          mapping.originalLine += 1;\n\n          // Original column.\n          mapping.originalColumn = previousOriginalColumn + segment[3];\n          previousOriginalColumn = mapping.originalColumn;\n\n          if (segment.length > 4) {\n            // Original name.\n            mapping.name = previousName + segment[4];\n            previousName += segment[4];\n          }\n        }\n\n        generatedMappings.push(mapping);\n        if (typeof mapping.originalLine === 'number') {\n          originalMappings.push(mapping);\n        }\n      }\n    }\n\n    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n    this.__generatedMappings = generatedMappings;\n\n    quickSort(originalMappings, util.compareByOriginalPositions);\n    this.__originalMappings = originalMappings;\n  };\n\n/**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\nBasicSourceMapConsumer.prototype._findMapping =\n  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n                                         aColumnName, aComparator, aBias) {\n    // To return the position we are searching for, we must first find the\n    // mapping for the given position and then return the opposite position it\n    // points to. Because the mappings are sorted, we can use binary search to\n    // find the best mapping.\n\n    if (aNeedle[aLineName] <= 0) {\n      throw new TypeError('Line must be greater than or equal to 1, got '\n                          + aNeedle[aLineName]);\n    }\n    if (aNeedle[aColumnName] < 0) {\n      throw new TypeError('Column must be greater than or equal to 0, got '\n                          + aNeedle[aColumnName]);\n    }\n\n    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n  };\n\n/**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\nBasicSourceMapConsumer.prototype.computeColumnSpans =\n  function SourceMapConsumer_computeColumnSpans() {\n    for (var index = 0; index < this._generatedMappings.length; ++index) {\n      var mapping = this._generatedMappings[index];\n\n      // Mappings do not contain a field for the last generated columnt. We\n      // can come up with an optimistic estimate, however, by assuming that\n      // mappings are contiguous (i.e. given two consecutive mappings, the\n      // first mapping ends where the second one starts).\n      if (index + 1 < this._generatedMappings.length) {\n        var nextMapping = this._generatedMappings[index + 1];\n\n        if (mapping.generatedLine === nextMapping.generatedLine) {\n          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n          continue;\n        }\n      }\n\n      // The last mapping for each line spans the entire line.\n      mapping.lastGeneratedColumn = Infinity;\n    }\n  };\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n *   - line: The line number in the generated source.  The line number\n *     is 1-based.\n *   - column: The column number in the generated source.  The column\n *     number is 0-based.\n *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n *     closest element that is smaller than or greater than the one we are\n *     searching for, respectively, if the exact element cannot be found.\n *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n *   - source: The original source file, or null.\n *   - line: The line number in the original source, or null.  The\n *     line number is 1-based.\n *   - column: The column number in the original source, or null.  The\n *     column number is 0-based.\n *   - name: The original identifier, or null.\n */\nBasicSourceMapConsumer.prototype.originalPositionFor =\n  function SourceMapConsumer_originalPositionFor(aArgs) {\n    var needle = {\n      generatedLine: util.getArg(aArgs, 'line'),\n      generatedColumn: util.getArg(aArgs, 'column')\n    };\n\n    var index = this._findMapping(\n      needle,\n      this._generatedMappings,\n      \"generatedLine\",\n      \"generatedColumn\",\n      util.compareByGeneratedPositionsDeflated,\n      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n    );\n\n    if (index >= 0) {\n      var mapping = this._generatedMappings[index];\n\n      if (mapping.generatedLine === needle.generatedLine) {\n        var source = util.getArg(mapping, 'source', null);\n        if (source !== null) {\n          source = this._sources.at(source);\n          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\n        }\n        var name = util.getArg(mapping, 'name', null);\n        if (name !== null) {\n          name = this._names.at(name);\n        }\n        return {\n          source: source,\n          line: util.getArg(mapping, 'originalLine', null),\n          column: util.getArg(mapping, 'originalColumn', null),\n          name: name\n        };\n      }\n    }\n\n    return {\n      source: null,\n      line: null,\n      column: null,\n      name: null\n    };\n  };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n  function BasicSourceMapConsumer_hasContentsOfAllSources() {\n    if (!this.sourcesContent) {\n      return false;\n    }\n    return this.sourcesContent.length >= this._sources.size() &&\n      !this.sourcesContent.some(function (sc) { return sc == null; });\n  };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nBasicSourceMapConsumer.prototype.sourceContentFor =\n  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n    if (!this.sourcesContent) {\n      return null;\n    }\n\n    var index = this._findSourceIndex(aSource);\n    if (index >= 0) {\n      return this.sourcesContent[index];\n    }\n\n    var relativeSource = aSource;\n    if (this.sourceRoot != null) {\n      relativeSource = util.relative(this.sourceRoot, relativeSource);\n    }\n\n    var url;\n    if (this.sourceRoot != null\n        && (url = util.urlParse(this.sourceRoot))) {\n      // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n      // many users. We can help them out when they expect file:// URIs to\n      // behave like it would if they were running a local HTTP server. See\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n      var fileUriAbsPath = relativeSource.replace(/^file:\\/\\//, \"\");\n      if (url.scheme == \"file\"\n          && this._sources.has(fileUriAbsPath)) {\n        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n      }\n\n      if ((!url.path || url.path == \"/\")\n          && this._sources.has(\"/\" + relativeSource)) {\n        return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\n      }\n    }\n\n    // This function is used recursively from\n    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n    // don't want to throw if we can't find the source - we just want to\n    // return null, so we provide a flag to exit gracefully.\n    if (nullOnMissing) {\n      return null;\n    }\n    else {\n      throw new Error('\"' + relativeSource + '\" is not in the SourceMap.');\n    }\n  };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n *   - source: The filename of the original source.\n *   - line: The line number in the original source.  The line number\n *     is 1-based.\n *   - column: The column number in the original source.  The column\n *     number is 0-based.\n *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n *     closest element that is smaller than or greater than the one we are\n *     searching for, respectively, if the exact element cannot be found.\n *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n *   - line: The line number in the generated source, or null.  The\n *     line number is 1-based.\n *   - column: The column number in the generated source, or null.\n *     The column number is 0-based.\n */\nBasicSourceMapConsumer.prototype.generatedPositionFor =\n  function SourceMapConsumer_generatedPositionFor(aArgs) {\n    var source = util.getArg(aArgs, 'source');\n    source = this._findSourceIndex(source);\n    if (source < 0) {\n      return {\n        line: null,\n        column: null,\n        lastColumn: null\n      };\n    }\n\n    var needle = {\n      source: source,\n      originalLine: util.getArg(aArgs, 'line'),\n      originalColumn: util.getArg(aArgs, 'column')\n    };\n\n    var index = this._findMapping(\n      needle,\n      this._originalMappings,\n      \"originalLine\",\n      \"originalColumn\",\n      util.compareByOriginalPositions,\n      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n    );\n\n    if (index >= 0) {\n      var mapping = this._originalMappings[index];\n\n      if (mapping.source === needle.source) {\n        return {\n          line: util.getArg(mapping, 'generatedLine', null),\n          column: util.getArg(mapping, 'generatedColumn', null),\n          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n        };\n      }\n    }\n\n    return {\n      line: null,\n      column: null,\n      lastColumn: null\n    };\n  };\n\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n/**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The first parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n *   - version: Which version of the source map spec this map is following.\n *   - file: Optional. The generated file this source map is associated with.\n *   - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n *   - offset: The offset into the original specified at which this section\n *       begins to apply, defined as an object with a \"line\" and \"column\"\n *       field.\n *   - map: A source map definition. This source map could also be indexed,\n *       but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n *  {\n *    version : 3,\n *    file: \"app.js\",\n *    sections: [{\n *      offset: {line:100, column:10},\n *      map: {\n *        version : 3,\n *        file: \"section.js\",\n *        sources: [\"foo.js\", \"bar.js\"],\n *        names: [\"src\", \"maps\", \"are\", \"fun\"],\n *        mappings: \"AAAA,E;;ABCDE;\"\n *      }\n *    }],\n *  }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found.  This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n  var sourceMap = aSourceMap;\n  if (typeof aSourceMap === 'string') {\n    sourceMap = util.parseSourceMapInput(aSourceMap);\n  }\n\n  var version = util.getArg(sourceMap, 'version');\n  var sections = util.getArg(sourceMap, 'sections');\n\n  if (version != this._version) {\n    throw new Error('Unsupported version: ' + version);\n  }\n\n  this._sources = new ArraySet();\n  this._names = new ArraySet();\n\n  var lastOffset = {\n    line: -1,\n    column: 0\n  };\n  this._sections = sections.map(function (s) {\n    if (s.url) {\n      // The url field will require support for asynchronicity.\n      // See https://github.com/mozilla/source-map/issues/16\n      throw new Error('Support for url field in sections not implemented.');\n    }\n    var offset = util.getArg(s, 'offset');\n    var offsetLine = util.getArg(offset, 'line');\n    var offsetColumn = util.getArg(offset, 'column');\n\n    if (offsetLine < lastOffset.line ||\n        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n      throw new Error('Section offsets must be ordered and non-overlapping.');\n    }\n    lastOffset = offset;\n\n    return {\n      generatedOffset: {\n        // The offset fields are 0-based, but we use 1-based indices when\n        // encoding/decoding from VLQ.\n        generatedLine: offsetLine + 1,\n        generatedColumn: offsetColumn + 1\n      },\n      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\n    }\n  });\n}\n\nIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nIndexedSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n  get: function () {\n    var sources = [];\n    for (var i = 0; i < this._sections.length; i++) {\n      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n        sources.push(this._sections[i].consumer.sources[j]);\n      }\n    }\n    return sources;\n  }\n});\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n *   - line: The line number in the generated source.  The line number\n *     is 1-based.\n *   - column: The column number in the generated source.  The column\n *     number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n *   - source: The original source file, or null.\n *   - line: The line number in the original source, or null.  The\n *     line number is 1-based.\n *   - column: The column number in the original source, or null.  The\n *     column number is 0-based.\n *   - name: The original identifier, or null.\n */\nIndexedSourceMapConsumer.prototype.originalPositionFor =\n  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n    var needle = {\n      generatedLine: util.getArg(aArgs, 'line'),\n      generatedColumn: util.getArg(aArgs, 'column')\n    };\n\n    // Find the section containing the generated position we're trying to map\n    // to an original position.\n    var sectionIndex = binarySearch.search(needle, this._sections,\n      function(needle, section) {\n        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n        if (cmp) {\n          return cmp;\n        }\n\n        return (needle.generatedColumn -\n                section.generatedOffset.generatedColumn);\n      });\n    var section = this._sections[sectionIndex];\n\n    if (!section) {\n      return {\n        source: null,\n        line: null,\n        column: null,\n        name: null\n      };\n    }\n\n    return section.consumer.originalPositionFor({\n      line: needle.generatedLine -\n        (section.generatedOffset.generatedLine - 1),\n      column: needle.generatedColumn -\n        (section.generatedOffset.generatedLine === needle.generatedLine\n         ? section.generatedOffset.generatedColumn - 1\n         : 0),\n      bias: aArgs.bias\n    });\n  };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n  function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n    return this._sections.every(function (s) {\n      return s.consumer.hasContentsOfAllSources();\n    });\n  };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nIndexedSourceMapConsumer.prototype.sourceContentFor =\n  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n    for (var i = 0; i < this._sections.length; i++) {\n      var section = this._sections[i];\n\n      var content = section.consumer.sourceContentFor(aSource, true);\n      if (content) {\n        return content;\n      }\n    }\n    if (nullOnMissing) {\n      return null;\n    }\n    else {\n      throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n    }\n  };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n *   - source: The filename of the original source.\n *   - line: The line number in the original source.  The line number\n *     is 1-based.\n *   - column: The column number in the original source.  The column\n *     number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n *   - line: The line number in the generated source, or null.  The\n *     line number is 1-based. \n *   - column: The column number in the generated source, or null.\n *     The column number is 0-based.\n */\nIndexedSourceMapConsumer.prototype.generatedPositionFor =\n  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n    for (var i = 0; i < this._sections.length; i++) {\n      var section = this._sections[i];\n\n      // Only consider this section if the requested source is in the list of\n      // sources of the consumer.\n      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\n        continue;\n      }\n      var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n      if (generatedPosition) {\n        var ret = {\n          line: generatedPosition.line +\n            (section.generatedOffset.generatedLine - 1),\n          column: generatedPosition.column +\n            (section.generatedOffset.generatedLine === generatedPosition.line\n             ? section.generatedOffset.generatedColumn - 1\n             : 0)\n        };\n        return ret;\n      }\n    }\n\n    return {\n      line: null,\n      column: null\n    };\n  };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nIndexedSourceMapConsumer.prototype._parseMappings =\n  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n    this.__generatedMappings = [];\n    this.__originalMappings = [];\n    for (var i = 0; i < this._sections.length; i++) {\n      var section = this._sections[i];\n      var sectionMappings = section.consumer._generatedMappings;\n      for (var j = 0; j < sectionMappings.length; j++) {\n        var mapping = sectionMappings[j];\n\n        var source = section.consumer._sources.at(mapping.source);\n        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n        this._sources.add(source);\n        source = this._sources.indexOf(source);\n\n        var name = null;\n        if (mapping.name) {\n          name = section.consumer._names.at(mapping.name);\n          this._names.add(name);\n          name = this._names.indexOf(name);\n        }\n\n        // The mappings coming from the consumer for the section have\n        // generated positions relative to the start of the section, so we\n        // need to offset them to be relative to the start of the concatenated\n        // generated file.\n        var adjustedMapping = {\n          source: source,\n          generatedLine: mapping.generatedLine +\n            (section.generatedOffset.generatedLine - 1),\n          generatedColumn: mapping.generatedColumn +\n            (section.generatedOffset.generatedLine === mapping.generatedLine\n            ? section.generatedOffset.generatedColumn - 1\n            : 0),\n          originalLine: mapping.originalLine,\n          originalColumn: mapping.originalColumn,\n          name: name\n        };\n\n        this.__generatedMappings.push(adjustedMapping);\n        if (typeof adjustedMapping.originalLine === 'number') {\n          this.__originalMappings.push(adjustedMapping);\n        }\n      }\n    }\n\n    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n    quickSort(this.__originalMappings, util.compareByOriginalPositions);\n  };\n\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-consumer.js\n// module id = 7\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nexports.GREATEST_LOWER_BOUND = 1;\nexports.LEAST_UPPER_BOUND = 2;\n\n/**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n *     closest element that is smaller than or greater than the one we are\n *     searching for, respectively, if the exact element cannot be found.\n */\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n  // This function terminates when one of the following is true:\n  //\n  //   1. We find the exact element we are looking for.\n  //\n  //   2. We did not find the exact element, but we can return the index of\n  //      the next-closest element.\n  //\n  //   3. We did not find the exact element, and there is no next-closest\n  //      element than the one we are searching for, so we return -1.\n  var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n  var cmp = aCompare(aNeedle, aHaystack[mid], true);\n  if (cmp === 0) {\n    // Found the element we are looking for.\n    return mid;\n  }\n  else if (cmp > 0) {\n    // Our needle is greater than aHaystack[mid].\n    if (aHigh - mid > 1) {\n      // The element is in the upper half.\n      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n    }\n\n    // The exact needle element was not found in this haystack. Determine if\n    // we are in termination case (3) or (2) and return the appropriate thing.\n    if (aBias == exports.LEAST_UPPER_BOUND) {\n      return aHigh < aHaystack.length ? aHigh : -1;\n    } else {\n      return mid;\n    }\n  }\n  else {\n    // Our needle is less than aHaystack[mid].\n    if (mid - aLow > 1) {\n      // The element is in the lower half.\n      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n    }\n\n    // we are in termination case (3) or (2) and return the appropriate thing.\n    if (aBias == exports.LEAST_UPPER_BOUND) {\n      return mid;\n    } else {\n      return aLow < 0 ? -1 : aLow;\n    }\n  }\n}\n\n/**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n *     array and returns -1, 0, or 1 depending on whether the needle is less\n *     than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n *     closest element that is smaller than or greater than the one we are\n *     searching for, respectively, if the exact element cannot be found.\n *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n  if (aHaystack.length === 0) {\n    return -1;\n  }\n\n  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n  if (index < 0) {\n    return -1;\n  }\n\n  // We have found either the exact element, or the next-closest element than\n  // the one we are searching for. However, there may be more than one such\n  // element. Make sure we always return the smallest of these.\n  while (index - 1 >= 0) {\n    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n      break;\n    }\n    --index;\n  }\n\n  return index;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/binary-search.js\n// module id = 8\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n// It turns out that some (most?) JavaScript engines don't self-host\n// `Array.prototype.sort`. This makes sense because C++ will likely remain\n// faster than JS when doing raw CPU-intensive sorting. However, when using a\n// custom comparator function, calling back and forth between the VM's C++ and\n// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n// worse generated code for the comparator function than would be optimal. In\n// fact, when sorting with a comparator, these costs outweigh the benefits of\n// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n// a ~3500ms mean speed-up in `bench/bench.html`.\n\n/**\n * Swap the elements indexed by `x` and `y` in the array `ary`.\n *\n * @param {Array} ary\n *        The array.\n * @param {Number} x\n *        The index of the first item.\n * @param {Number} y\n *        The index of the second item.\n */\nfunction swap(ary, x, y) {\n  var temp = ary[x];\n  ary[x] = ary[y];\n  ary[y] = temp;\n}\n\n/**\n * Returns a random integer within the range `low .. high` inclusive.\n *\n * @param {Number} low\n *        The lower bound on the range.\n * @param {Number} high\n *        The upper bound on the range.\n */\nfunction randomIntInRange(low, high) {\n  return Math.round(low + (Math.random() * (high - low)));\n}\n\n/**\n * The Quick Sort algorithm.\n *\n * @param {Array} ary\n *        An array to sort.\n * @param {function} comparator\n *        Function to use to compare two items.\n * @param {Number} p\n *        Start index of the array\n * @param {Number} r\n *        End index of the array\n */\nfunction doQuickSort(ary, comparator, p, r) {\n  // If our lower bound is less than our upper bound, we (1) partition the\n  // array into two pieces and (2) recurse on each half. If it is not, this is\n  // the empty array and our base case.\n\n  if (p < r) {\n    // (1) Partitioning.\n    //\n    // The partitioning chooses a pivot between `p` and `r` and moves all\n    // elements that are less than or equal to the pivot to the before it, and\n    // all the elements that are greater than it after it. The effect is that\n    // once partition is done, the pivot is in the exact place it will be when\n    // the array is put in sorted order, and it will not need to be moved\n    // again. This runs in O(n) time.\n\n    // Always choose a random pivot so that an input array which is reverse\n    // sorted does not cause O(n^2) running time.\n    var pivotIndex = randomIntInRange(p, r);\n    var i = p - 1;\n\n    swap(ary, pivotIndex, r);\n    var pivot = ary[r];\n\n    // Immediately after `j` is incremented in this loop, the following hold\n    // true:\n    //\n    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.\n    //\n    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n    for (var j = p; j < r; j++) {\n      if (comparator(ary[j], pivot) <= 0) {\n        i += 1;\n        swap(ary, i, j);\n      }\n    }\n\n    swap(ary, i + 1, j);\n    var q = i + 1;\n\n    // (2) Recurse on each half.\n\n    doQuickSort(ary, comparator, p, q - 1);\n    doQuickSort(ary, comparator, q + 1, r);\n  }\n}\n\n/**\n * Sort the given array in-place with the given comparator function.\n *\n * @param {Array} ary\n *        An array to sort.\n * @param {function} comparator\n *        Function to use to compare two items.\n */\nexports.quickSort = function (ary, comparator) {\n  doQuickSort(ary, comparator, 0, ary.length - 1);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/quick-sort.js\n// module id = 9\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\nvar util = require('./util');\n\n// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n// operating systems these days (capturing the result).\nvar REGEX_NEWLINE = /(\\r?\\n)/;\n\n// Newline character code for charCodeAt() comparisons\nvar NEWLINE_CODE = 10;\n\n// Private symbol for identifying `SourceNode`s when multiple versions of\n// the source-map library are loaded. This MUST NOT CHANGE across\n// versions!\nvar isSourceNode = \"$$$isSourceNode$$$\";\n\n/**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n *        generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\nfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n  this.children = [];\n  this.sourceContents = {};\n  this.line = aLine == null ? null : aLine;\n  this.column = aColumn == null ? null : aColumn;\n  this.source = aSource == null ? null : aSource;\n  this.name = aName == null ? null : aName;\n  this[isSourceNode] = true;\n  if (aChunks != null) this.add(aChunks);\n}\n\n/**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n *        SourceMapConsumer should be relative to.\n */\nSourceNode.fromStringWithSourceMap =\n  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n    // The SourceNode we want to fill with the generated code\n    // and the SourceMap\n    var node = new SourceNode();\n\n    // All even indices of this array are one line of the generated code,\n    // while all odd indices are the newlines between two adjacent lines\n    // (since `REGEX_NEWLINE` captures its match).\n    // Processed fragments are accessed by calling `shiftNextLine`.\n    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n    var remainingLinesIndex = 0;\n    var shiftNextLine = function() {\n      var lineContents = getNextLine();\n      // The last line of a file might not have a newline.\n      var newLine = getNextLine() || \"\";\n      return lineContents + newLine;\n\n      function getNextLine() {\n        return remainingLinesIndex < remainingLines.length ?\n            remainingLines[remainingLinesIndex++] : undefined;\n      }\n    };\n\n    // We need to remember the position of \"remainingLines\"\n    var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n    // The generate SourceNodes we need a code range.\n    // To extract it current and last mapping is used.\n    // Here we store the last mapping.\n    var lastMapping = null;\n\n    aSourceMapConsumer.eachMapping(function (mapping) {\n      if (lastMapping !== null) {\n        // We add the code from \"lastMapping\" to \"mapping\":\n        // First check if there is a new line in between.\n        if (lastGeneratedLine < mapping.generatedLine) {\n          // Associate first line with \"lastMapping\"\n          addMappingWithCode(lastMapping, shiftNextLine());\n          lastGeneratedLine++;\n          lastGeneratedColumn = 0;\n          // The remaining code is added without mapping\n        } else {\n          // There is no new line in between.\n          // Associate the code between \"lastGeneratedColumn\" and\n          // \"mapping.generatedColumn\" with \"lastMapping\"\n          var nextLine = remainingLines[remainingLinesIndex] || '';\n          var code = nextLine.substr(0, mapping.generatedColumn -\n                                        lastGeneratedColumn);\n          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n                                              lastGeneratedColumn);\n          lastGeneratedColumn = mapping.generatedColumn;\n          addMappingWithCode(lastMapping, code);\n          // No more remaining code, continue\n          lastMapping = mapping;\n          return;\n        }\n      }\n      // We add the generated code until the first mapping\n      // to the SourceNode without any mapping.\n      // Each line is added as separate string.\n      while (lastGeneratedLine < mapping.generatedLine) {\n        node.add(shiftNextLine());\n        lastGeneratedLine++;\n      }\n      if (lastGeneratedColumn < mapping.generatedColumn) {\n        var nextLine = remainingLines[remainingLinesIndex] || '';\n        node.add(nextLine.substr(0, mapping.generatedColumn));\n        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n        lastGeneratedColumn = mapping.generatedColumn;\n      }\n      lastMapping = mapping;\n    }, this);\n    // We have processed all mappings.\n    if (remainingLinesIndex < remainingLines.length) {\n      if (lastMapping) {\n        // Associate the remaining code in the current line with \"lastMapping\"\n        addMappingWithCode(lastMapping, shiftNextLine());\n      }\n      // and add the remaining lines without any mapping\n      node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n    }\n\n    // Copy sourcesContent into SourceNode\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n      if (content != null) {\n        if (aRelativePath != null) {\n          sourceFile = util.join(aRelativePath, sourceFile);\n        }\n        node.setSourceContent(sourceFile, content);\n      }\n    });\n\n    return node;\n\n    function addMappingWithCode(mapping, code) {\n      if (mapping === null || mapping.source === undefined) {\n        node.add(code);\n      } else {\n        var source = aRelativePath\n          ? util.join(aRelativePath, mapping.source)\n          : mapping.source;\n        node.add(new SourceNode(mapping.originalLine,\n                                mapping.originalColumn,\n                                source,\n                                code,\n                                mapping.name));\n      }\n    }\n  };\n\n/**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n *        SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.add = function SourceNode_add(aChunk) {\n  if (Array.isArray(aChunk)) {\n    aChunk.forEach(function (chunk) {\n      this.add(chunk);\n    }, this);\n  }\n  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n    if (aChunk) {\n      this.children.push(aChunk);\n    }\n  }\n  else {\n    throw new TypeError(\n      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n    );\n  }\n  return this;\n};\n\n/**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n *        SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n  if (Array.isArray(aChunk)) {\n    for (var i = aChunk.length-1; i >= 0; i--) {\n      this.prepend(aChunk[i]);\n    }\n  }\n  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n    this.children.unshift(aChunk);\n  }\n  else {\n    throw new TypeError(\n      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n    );\n  }\n  return this;\n};\n\n/**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n  var chunk;\n  for (var i = 0, len = this.children.length; i < len; i++) {\n    chunk = this.children[i];\n    if (chunk[isSourceNode]) {\n      chunk.walk(aFn);\n    }\n    else {\n      if (chunk !== '') {\n        aFn(chunk, { source: this.source,\n                     line: this.line,\n                     column: this.column,\n                     name: this.name });\n      }\n    }\n  }\n};\n\n/**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\nSourceNode.prototype.join = function SourceNode_join(aSep) {\n  var newChildren;\n  var i;\n  var len = this.children.length;\n  if (len > 0) {\n    newChildren = [];\n    for (i = 0; i < len-1; i++) {\n      newChildren.push(this.children[i]);\n      newChildren.push(aSep);\n    }\n    newChildren.push(this.children[i]);\n    this.children = newChildren;\n  }\n  return this;\n};\n\n/**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\nSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n  var lastChild = this.children[this.children.length - 1];\n  if (lastChild[isSourceNode]) {\n    lastChild.replaceRight(aPattern, aReplacement);\n  }\n  else if (typeof lastChild === 'string') {\n    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n  }\n  else {\n    this.children.push(''.replace(aPattern, aReplacement));\n  }\n  return this;\n};\n\n/**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\nSourceNode.prototype.setSourceContent =\n  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n  };\n\n/**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walkSourceContents =\n  function SourceNode_walkSourceContents(aFn) {\n    for (var i = 0, len = this.children.length; i < len; i++) {\n      if (this.children[i][isSourceNode]) {\n        this.children[i].walkSourceContents(aFn);\n      }\n    }\n\n    var sources = Object.keys(this.sourceContents);\n    for (var i = 0, len = sources.length; i < len; i++) {\n      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n    }\n  };\n\n/**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\nSourceNode.prototype.toString = function SourceNode_toString() {\n  var str = \"\";\n  this.walk(function (chunk) {\n    str += chunk;\n  });\n  return str;\n};\n\n/**\n * Returns the string representation of this source node along with a source\n * map.\n */\nSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n  var generated = {\n    code: \"\",\n    line: 1,\n    column: 0\n  };\n  var map = new SourceMapGenerator(aArgs);\n  var sourceMappingActive = false;\n  var lastOriginalSource = null;\n  var lastOriginalLine = null;\n  var lastOriginalColumn = null;\n  var lastOriginalName = null;\n  this.walk(function (chunk, original) {\n    generated.code += chunk;\n    if (original.source !== null\n        && original.line !== null\n        && original.column !== null) {\n      if(lastOriginalSource !== original.source\n         || lastOriginalLine !== original.line\n         || lastOriginalColumn !== original.column\n         || lastOriginalName !== original.name) {\n        map.addMapping({\n          source: original.source,\n          original: {\n            line: original.line,\n            column: original.column\n          },\n          generated: {\n            line: generated.line,\n            column: generated.column\n          },\n          name: original.name\n        });\n      }\n      lastOriginalSource = original.source;\n      lastOriginalLine = original.line;\n      lastOriginalColumn = original.column;\n      lastOriginalName = original.name;\n      sourceMappingActive = true;\n    } else if (sourceMappingActive) {\n      map.addMapping({\n        generated: {\n          line: generated.line,\n          column: generated.column\n        }\n      });\n      lastOriginalSource = null;\n      sourceMappingActive = false;\n    }\n    for (var idx = 0, length = chunk.length; idx < length; idx++) {\n      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n        generated.line++;\n        generated.column = 0;\n        // Mappings end at eol\n        if (idx + 1 === length) {\n          lastOriginalSource = null;\n          sourceMappingActive = false;\n        } else if (sourceMappingActive) {\n          map.addMapping({\n            source: original.source,\n            original: {\n              line: original.line,\n              column: original.column\n            },\n            generated: {\n              line: generated.line,\n              column: generated.column\n            },\n            name: original.name\n          });\n        }\n      } else {\n        generated.column++;\n      }\n    }\n  });\n  this.walkSourceContents(function (sourceFile, sourceContent) {\n    map.setSourceContent(sourceFile, sourceContent);\n  });\n\n  return { code: generated.code, map: map };\n};\n\nexports.SourceNode = SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-node.js\n// module id = 10\n// module chunks = 0"],"sourceRoot":""}The MIT License (MIT)

Copyright (c) 2014 Evan Wallace

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
/*
 * Support for source maps in V8 stack traces
 * https://github.com/evanw/node-source-map-support
 */
/*
 The buffer module from node.js, for the browser.

 @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
 license  MIT
*/
(this.define||function(G,J){this.sourceMapSupport=J()})("browser-source-map-support",function(G){(function b(n,x,m){function e(d,a){if(!x[d]){if(!n[d]){var l="function"==typeof require&&require;if(!a&&l)return l(d,!0);if(g)return g(d,!0);throw Error("Cannot find module '"+d+"'");}l=x[d]={exports:{}};n[d][0].call(l.exports,function(a){var b=n[d][1][a];return e(b?b:a)},l,l.exports,b,n,x,m)}return x[d].exports}for(var g="function"==typeof require&&require,h=0;h<m.length;h++)e(m[h]);return e})({1:[function(n,
x,m){G=n("./source-map-support")},{"./source-map-support":21}],2:[function(n,x,m){(function(b){function e(b){b=b.charCodeAt(0);if(43===b)return 62;if(47===b)return 63;if(48>b)return-1;if(58>b)return b-48+52;if(91>b)return b-65;if(123>b)return b-97+26}var g="undefined"!==typeof Uint8Array?Uint8Array:Array;b.toByteArray=function(b){function d(a){r[v++]=a}if(0<b.length%4)throw Error("Invalid string. Length must be a multiple of 4");var a=b.length;var l="="===b.charAt(a-2)?2:"="===b.charAt(a-1)?1:0;var r=
new g(3*b.length/4-l);var q=0<l?b.length-4:b.length;var v=0;for(a=0;a<q;a+=4){var h=e(b.charAt(a))<<18|e(b.charAt(a+1))<<12|e(b.charAt(a+2))<<6|e(b.charAt(a+3));d((h&16711680)>>16);d((h&65280)>>8);d(h&255)}2===l?(h=e(b.charAt(a))<<2|e(b.charAt(a+1))>>4,d(h&255)):1===l&&(h=e(b.charAt(a))<<10|e(b.charAt(a+1))<<4|e(b.charAt(a+2))>>2,d(h>>8&255),d(h&255));return r};b.fromByteArray=function(b){var d=b.length%3,a="",l;var e=0;for(l=b.length-d;e<l;e+=3){var g=(b[e]<<16)+(b[e+1]<<8)+b[e+2];g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>
18&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>12&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>6&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g&63);a+=g}switch(d){case 1:g=b[b.length-1];a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>2);a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g<<4&63);a+="==";break;case 2:g=(b[b.length-2]<<8)+
b[b.length-1],a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>10),a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>4&63),a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g<<2&63),a+="="}return a}})("undefined"===typeof m?this.base64js={}:m)},{}],3:[function(n,x,m){},{}],4:[function(n,x,m){(function(b){var e=Object.prototype.toString,g="function"===typeof b.alloc&&"function"===typeof b.allocUnsafe&&"function"===
typeof b.from;x.exports=function(h,d,a){if("number"===typeof h)throw new TypeError('"value" argument must not be a number');if("ArrayBuffer"===e.call(h).slice(8,-1)){d>>>=0;var l=h.byteLength-d;if(0>l)throw new RangeError("'offset' is out of bounds");if(void 0===a)a=l;else if(a>>>=0,a>l)throw new RangeError("'length' is out of bounds");return g?b.from(h.slice(d,d+a)):new b(new Uint8Array(h.slice(d,d+a)))}if("string"===typeof h){a=d;if("string"!==typeof a||""===a)a="utf8";if(!b.isEncoding(a))throw new TypeError('"encoding" must be a valid string encoding');
return g?b.from(h,a):new b(h,a)}return g?b.from(h):new b(h)}}).call(this,n("buffer").Buffer)},{buffer:5}],5:[function(n,x,m){function b(f,p,a){if(!(this instanceof b))return new b(f,p,a);var c=typeof f;if("number"===c)var d=0<f?f>>>0:0;else if("string"===c){if("base64"===p)for(f=(f.trim?f.trim():f.replace(/^\s+|\s+$/g,"")).replace(H,"");0!==f.length%4;)f+="=";d=b.byteLength(f,p)}else if("object"===c&&null!==f)"Buffer"===f.type&&F(f.data)&&(f=f.data),d=0<+f.length?Math.floor(+f.length):0;else throw new TypeError("must start with number, buffer, array or string");
if(this.length>D)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+D.toString(16)+" bytes");if(b.TYPED_ARRAY_SUPPORT)var k=b._augment(new Uint8Array(d));else k=this,k.length=d,k._isBuffer=!0;if(b.TYPED_ARRAY_SUPPORT&&"number"===typeof f.byteLength)k._set(f);else{var C=f;if(F(C)||b.isBuffer(C)||C&&"object"===typeof C&&"number"===typeof C.length)if(b.isBuffer(f))for(p=0;p<d;p++)k[p]=f.readUInt8(p);else for(p=0;p<d;p++)k[p]=(f[p]%256+256)%256;else if("string"===c)k.write(f,
0,p);else if("number"===c&&!b.TYPED_ARRAY_SUPPORT&&!a)for(p=0;p<d;p++)k[p]=0}return k}function e(f,p,b){var a="";for(b=Math.min(f.length,b);p<b;p++)a+=String.fromCharCode(f[p]);return a}function g(f,p,b){if(0!==f%1||0>f)throw new RangeError("offset is not uint");if(f+p>b)throw new RangeError("Trying to access beyond buffer length");}function h(f,p,a,c,d,k){if(!b.isBuffer(f))throw new TypeError("buffer must be a Buffer instance");if(p>d||p<k)throw new TypeError("value is out of bounds");if(a+c>f.length)throw new TypeError("index out of range");
}function d(f,p,b,a){0>p&&(p=65535+p+1);for(var c=0,d=Math.min(f.length-b,2);c<d;c++)f[b+c]=(p&255<<8*(a?c:1-c))>>>8*(a?c:1-c)}function a(f,p,b,a){0>p&&(p=4294967295+p+1);for(var c=0,d=Math.min(f.length-b,4);c<d;c++)f[b+c]=p>>>8*(a?c:3-c)&255}function l(f,p,b,a,c,d){if(p>c||p<d)throw new TypeError("value is out of bounds");if(b+a>f.length)throw new TypeError("index out of range");}function r(f,p,b,a,c){c||l(f,p,b,4,3.4028234663852886E38,-3.4028234663852886E38);y.write(f,p,b,a,23,4);return b+4}function q(f,
p,b,a,c){c||l(f,p,b,8,1.7976931348623157E308,-1.7976931348623157E308);y.write(f,p,b,a,52,8);return b+8}function v(f){for(var p=[],b=0;b<f.length;b++){var a=f.charCodeAt(b);if(127>=a)p.push(a);else{var c=b;55296<=a&&57343>=a&&b++;a=encodeURIComponent(f.slice(c,b+1)).substr(1).split("%");for(c=0;c<a.length;c++)p.push(parseInt(a[c],16))}}return p}function u(f){for(var b=[],a=0;a<f.length;a++)b.push(f.charCodeAt(a)&255);return b}function c(f,b,a,c,d){d&&(c-=c%d);for(d=0;d<c&&!(d+a>=b.length||d>=f.length);d++)b[d+
a]=f[d];return d}function k(f){try{return decodeURIComponent(f)}catch(p){return String.fromCharCode(65533)}}var w=n("base64-js"),y=n("ieee754"),F=n("is-array");m.Buffer=b;m.SlowBuffer=b;m.INSPECT_MAX_BYTES=50;b.poolSize=8192;var D=1073741823;b.TYPED_ARRAY_SUPPORT=function(){try{var f=new ArrayBuffer(0),b=new Uint8Array(f);b.foo=function(){return 42};return 42===b.foo()&&"function"===typeof b.subarray&&0===(new Uint8Array(1)).subarray(1,1).byteLength}catch(C){return!1}}();b.isBuffer=function(f){return!(null==
f||!f._isBuffer)};b.compare=function(f,a){if(!b.isBuffer(f)||!b.isBuffer(a))throw new TypeError("Arguments must be Buffers");for(var c=f.length,p=a.length,d=0,k=Math.min(c,p);d<k&&f[d]===a[d];d++);d!==k&&(c=f[d],p=a[d]);return c<p?-1:p<c?1:0};b.isEncoding=function(f){switch(String(f).toLowerCase()){case "hex":case "utf8":case "utf-8":case "ascii":case "binary":case "base64":case "raw":case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return!0;default:return!1}};b.concat=function(f,a){if(!F(f))throw new TypeError("Usage: Buffer.concat(list[, length])");
if(0===f.length)return new b(0);if(1===f.length)return f[0];var c;if(void 0===a)for(c=a=0;c<f.length;c++)a+=f[c].length;var p=new b(a),d=0;for(c=0;c<f.length;c++){var k=f[c];k.copy(p,d);d+=k.length}return p};b.byteLength=function(f,a){f+="";switch(a||"utf8"){case "ascii":case "binary":case "raw":var b=f.length;break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b=2*f.length;break;case "hex":b=f.length>>>1;break;case "utf8":case "utf-8":b=v(f).length;break;case "base64":b=w.toByteArray(f).length;
break;default:b=f.length}return b};b.prototype.length=void 0;b.prototype.parent=void 0;b.prototype.toString=function(f,b,a){var c=!1;b>>>=0;a=void 0===a||Infinity===a?this.length:a>>>0;f||(f="utf8");0>b&&(b=0);a>this.length&&(a=this.length);if(a<=b)return"";for(;;)switch(f){case "hex":f=b;b=a;a=this.length;if(!f||0>f)f=0;if(!b||0>b||b>a)b=a;c="";for(a=f;a<b;a++)f=c,c=this[a],c=16>c?"0"+c.toString(16):c.toString(16),c=f+c;return c;case "utf8":case "utf-8":c=f="";for(a=Math.min(this.length,a);b<a;b++)127>=
this[b]?(f+=k(c)+String.fromCharCode(this[b]),c=""):c+="%"+this[b].toString(16);return f+k(c);case "ascii":return e(this,b,a);case "binary":return e(this,b,a);case "base64":return b=0===b&&a===this.length?w.fromByteArray(this):w.fromByteArray(this.slice(b,a)),b;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b=this.slice(b,a);a="";for(f=0;f<b.length;f+=2)a+=String.fromCharCode(b[f]+256*b[f+1]);return a;default:if(c)throw new TypeError("Unknown encoding: "+f);f=(f+"").toLowerCase();c=!0}};
b.prototype.equals=function(f){if(!b.isBuffer(f))throw new TypeError("Argument must be a Buffer");return 0===b.compare(this,f)};b.prototype.inspect=function(){var f="",b=m.INSPECT_MAX_BYTES;0<this.length&&(f=this.toString("hex",0,b).match(/.{2}/g).join(" "),this.length>b&&(f+=" ... "));return"<Buffer "+f+">"};b.prototype.compare=function(f){if(!b.isBuffer(f))throw new TypeError("Argument must be a Buffer");return b.compare(this,f)};b.prototype.get=function(f){console.log(".get() is deprecated. Access using array indexes instead.");
return this.readUInt8(f)};b.prototype.set=function(f,b){console.log(".set() is deprecated. Access using array indexes instead.");return this.writeUInt8(f,b)};b.prototype.write=function(f,b,a,d){if(isFinite(b))isFinite(a)||(d=a,a=void 0);else{var p=d;d=b;b=a;a=p}b=Number(b)||0;p=this.length-b;a?(a=Number(a),a>p&&(a=p)):a=p;d=String(d||"utf8").toLowerCase();switch(d){case "hex":b=Number(b)||0;d=this.length-b;a?(a=Number(a),a>d&&(a=d)):a=d;d=f.length;if(0!==d%2)throw Error("Invalid hex string");a>d/
2&&(a=d/2);for(d=0;d<a;d++){p=parseInt(f.substr(2*d,2),16);if(isNaN(p))throw Error("Invalid hex string");this[b+d]=p}f=d;break;case "utf8":case "utf-8":f=c(v(f),this,b,a);break;case "ascii":f=c(u(f),this,b,a);break;case "binary":f=c(u(f),this,b,a);break;case "base64":f=c(w.toByteArray(f),this,b,a);break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":p=[];for(var k=0;k<f.length;k++){var l=f.charCodeAt(k);d=l>>8;l%=256;p.push(l);p.push(d)}f=c(p,this,b,a,2);break;default:throw new TypeError("Unknown encoding: "+
d);}return f};b.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};b.prototype.slice=function(f,a){var c=this.length;f=~~f;a=void 0===a?c:~~a;0>f?(f+=c,0>f&&(f=0)):f>c&&(f=c);0>a?(a+=c,0>a&&(a=0)):a>c&&(a=c);a<f&&(a=f);if(b.TYPED_ARRAY_SUPPORT)return b._augment(this.subarray(f,a));c=a-f;for(var d=new b(c,void 0,!0),p=0;p<c;p++)d[p]=this[p+f];return d};b.prototype.readUInt8=function(f,a){a||g(f,1,this.length);return this[f]};b.prototype.readUInt16LE=
function(f,a){a||g(f,2,this.length);return this[f]|this[f+1]<<8};b.prototype.readUInt16BE=function(f,a){a||g(f,2,this.length);return this[f]<<8|this[f+1]};b.prototype.readUInt32LE=function(f,a){a||g(f,4,this.length);return(this[f]|this[f+1]<<8|this[f+2]<<16)+16777216*this[f+3]};b.prototype.readUInt32BE=function(f,a){a||g(f,4,this.length);return 16777216*this[f]+(this[f+1]<<16|this[f+2]<<8|this[f+3])};b.prototype.readInt8=function(f,a){a||g(f,1,this.length);return this[f]&128?-1*(255-this[f]+1):this[f]};
b.prototype.readInt16LE=function(f,a){a||g(f,2,this.length);var b=this[f]|this[f+1]<<8;return b&32768?b|4294901760:b};b.prototype.readInt16BE=function(f,a){a||g(f,2,this.length);var b=this[f+1]|this[f]<<8;return b&32768?b|4294901760:b};b.prototype.readInt32LE=function(f,a){a||g(f,4,this.length);return this[f]|this[f+1]<<8|this[f+2]<<16|this[f+3]<<24};b.prototype.readInt32BE=function(a,b){b||g(a,4,this.length);return this[a]<<24|this[a+1]<<16|this[a+2]<<8|this[a+3]};b.prototype.readFloatLE=function(a,
b){b||g(a,4,this.length);return y.read(this,a,!0,23,4)};b.prototype.readFloatBE=function(a,b){b||g(a,4,this.length);return y.read(this,a,!1,23,4)};b.prototype.readDoubleLE=function(a,b){b||g(a,8,this.length);return y.read(this,a,!0,52,8)};b.prototype.readDoubleBE=function(a,b){b||g(a,8,this.length);return y.read(this,a,!1,52,8)};b.prototype.writeUInt8=function(a,c,d){a=+a;c>>>=0;d||h(this,a,c,1,255,0);b.TYPED_ARRAY_SUPPORT||(a=Math.floor(a));this[c]=a;return c+1};b.prototype.writeUInt16LE=function(a,
c,k){a=+a;c>>>=0;k||h(this,a,c,2,65535,0);b.TYPED_ARRAY_SUPPORT?(this[c]=a,this[c+1]=a>>>8):d(this,a,c,!0);return c+2};b.prototype.writeUInt16BE=function(a,c,k){a=+a;c>>>=0;k||h(this,a,c,2,65535,0);b.TYPED_ARRAY_SUPPORT?(this[c]=a>>>8,this[c+1]=a):d(this,a,c,!1);return c+2};b.prototype.writeUInt32LE=function(f,c,d){f=+f;c>>>=0;d||h(this,f,c,4,4294967295,0);b.TYPED_ARRAY_SUPPORT?(this[c+3]=f>>>24,this[c+2]=f>>>16,this[c+1]=f>>>8,this[c]=f):a(this,f,c,!0);return c+4};b.prototype.writeUInt32BE=function(f,
c,d){f=+f;c>>>=0;d||h(this,f,c,4,4294967295,0);b.TYPED_ARRAY_SUPPORT?(this[c]=f>>>24,this[c+1]=f>>>16,this[c+2]=f>>>8,this[c+3]=f):a(this,f,c,!1);return c+4};b.prototype.writeInt8=function(a,c,d){a=+a;c>>>=0;d||h(this,a,c,1,127,-128);b.TYPED_ARRAY_SUPPORT||(a=Math.floor(a));0>a&&(a=255+a+1);this[c]=a;return c+1};b.prototype.writeInt16LE=function(a,c,k){a=+a;c>>>=0;k||h(this,a,c,2,32767,-32768);b.TYPED_ARRAY_SUPPORT?(this[c]=a,this[c+1]=a>>>8):d(this,a,c,!0);return c+2};b.prototype.writeInt16BE=function(a,
c,k){a=+a;c>>>=0;k||h(this,a,c,2,32767,-32768);b.TYPED_ARRAY_SUPPORT?(this[c]=a>>>8,this[c+1]=a):d(this,a,c,!1);return c+2};b.prototype.writeInt32LE=function(c,d,k){c=+c;d>>>=0;k||h(this,c,d,4,2147483647,-2147483648);b.TYPED_ARRAY_SUPPORT?(this[d]=c,this[d+1]=c>>>8,this[d+2]=c>>>16,this[d+3]=c>>>24):a(this,c,d,!0);return d+4};b.prototype.writeInt32BE=function(c,d,k){c=+c;d>>>=0;k||h(this,c,d,4,2147483647,-2147483648);0>c&&(c=4294967295+c+1);b.TYPED_ARRAY_SUPPORT?(this[d]=c>>>24,this[d+1]=c>>>16,this[d+
2]=c>>>8,this[d+3]=c):a(this,c,d,!1);return d+4};b.prototype.writeFloatLE=function(a,c,b){return r(this,a,c,!0,b)};b.prototype.writeFloatBE=function(a,c,b){return r(this,a,c,!1,b)};b.prototype.writeDoubleLE=function(a,c,b){return q(this,a,c,!0,b)};b.prototype.writeDoubleBE=function(a,c,b){return q(this,a,c,!1,b)};b.prototype.copy=function(a,c,d,k){d||(d=0);k||0===k||(k=this.length);c||(c=0);if(k!==d&&0!==a.length&&0!==this.length){if(k<d)throw new TypeError("sourceEnd < sourceStart");if(0>c||c>=a.length)throw new TypeError("targetStart out of bounds");
if(0>d||d>=this.length)throw new TypeError("sourceStart out of bounds");if(0>k||k>this.length)throw new TypeError("sourceEnd out of bounds");k>this.length&&(k=this.length);a.length-c<k-d&&(k=a.length-c+d);k-=d;if(1E3>k||!b.TYPED_ARRAY_SUPPORT)for(var f=0;f<k;f++)a[f+c]=this[f+d];else a._set(this.subarray(d,d+k),c)}};b.prototype.fill=function(a,c,b){a||(a=0);c||(c=0);b||(b=this.length);if(b<c)throw new TypeError("end < start");if(b!==c&&0!==this.length){if(0>c||c>=this.length)throw new TypeError("start out of bounds");
if(0>b||b>this.length)throw new TypeError("end out of bounds");if("number"===typeof a)for(;c<b;c++)this[c]=a;else{a=v(a.toString());for(var d=a.length;c<b;c++)this[c]=a[c%d]}return this}};b.prototype.toArrayBuffer=function(){if("undefined"!==typeof Uint8Array){if(b.TYPED_ARRAY_SUPPORT)return(new b(this)).buffer;for(var a=new Uint8Array(this.length),c=0,d=a.length;c<d;c+=1)a[c]=this[c];return a.buffer}throw new TypeError("Buffer.toArrayBuffer not supported in this browser");};var t=b.prototype;b._augment=
function(a){a.constructor=b;a._isBuffer=!0;a._get=a.get;a._set=a.set;a.get=t.get;a.set=t.set;a.write=t.write;a.toString=t.toString;a.toLocaleString=t.toString;a.toJSON=t.toJSON;a.equals=t.equals;a.compare=t.compare;a.copy=t.copy;a.slice=t.slice;a.readUInt8=t.readUInt8;a.readUInt16LE=t.readUInt16LE;a.readUInt16BE=t.readUInt16BE;a.readUInt32LE=t.readUInt32LE;a.readUInt32BE=t.readUInt32BE;a.readInt8=t.readInt8;a.readInt16LE=t.readInt16LE;a.readInt16BE=t.readInt16BE;a.readInt32LE=t.readInt32LE;a.readInt32BE=
t.readInt32BE;a.readFloatLE=t.readFloatLE;a.readFloatBE=t.readFloatBE;a.readDoubleLE=t.readDoubleLE;a.readDoubleBE=t.readDoubleBE;a.writeUInt8=t.writeUInt8;a.writeUInt16LE=t.writeUInt16LE;a.writeUInt16BE=t.writeUInt16BE;a.writeUInt32LE=t.writeUInt32LE;a.writeUInt32BE=t.writeUInt32BE;a.writeInt8=t.writeInt8;a.writeInt16LE=t.writeInt16LE;a.writeInt16BE=t.writeInt16BE;a.writeInt32LE=t.writeInt32LE;a.writeInt32BE=t.writeInt32BE;a.writeFloatLE=t.writeFloatLE;a.writeFloatBE=t.writeFloatBE;a.writeDoubleLE=
t.writeDoubleLE;a.writeDoubleBE=t.writeDoubleBE;a.fill=t.fill;a.inspect=t.inspect;a.toArrayBuffer=t.toArrayBuffer;return a};var H=/[^+\/0-9A-z]/g},{"base64-js":2,ieee754:6,"is-array":7}],6:[function(n,x,m){m.read=function(b,e,g,h,d){var a=8*d-h-1;var l=(1<<a)-1,r=l>>1,q=-7;d=g?d-1:0;var v=g?-1:1,u=b[e+d];d+=v;g=u&(1<<-q)-1;u>>=-q;for(q+=a;0<q;g=256*g+b[e+d],d+=v,q-=8);a=g&(1<<-q)-1;g>>=-q;for(q+=h;0<q;a=256*a+b[e+d],d+=v,q-=8);if(0===g)g=1-r;else{if(g===l)return a?NaN:Infinity*(u?-1:1);a+=Math.pow(2,
h);g-=r}return(u?-1:1)*a*Math.pow(2,g-h)};m.write=function(b,e,g,h,d,a){var l,r=8*a-d-1,q=(1<<r)-1,v=q>>1,u=23===d?Math.pow(2,-24)-Math.pow(2,-77):0;a=h?0:a-1;var c=h?1:-1,k=0>e||0===e&&0>1/e?1:0;e=Math.abs(e);isNaN(e)||Infinity===e?(e=isNaN(e)?1:0,h=q):(h=Math.floor(Math.log(e)/Math.LN2),1>e*(l=Math.pow(2,-h))&&(h--,l*=2),e=1<=h+v?e+u/l:e+u*Math.pow(2,1-v),2<=e*l&&(h++,l/=2),h+v>=q?(e=0,h=q):1<=h+v?(e=(e*l-1)*Math.pow(2,d),h+=v):(e=e*Math.pow(2,v-1)*Math.pow(2,d),h=0));for(;8<=d;b[g+a]=e&255,a+=
c,e/=256,d-=8);h=h<<d|e;for(r+=d;0<r;b[g+a]=h&255,a+=c,h/=256,r-=8);b[g+a-c]|=128*k}},{}],7:[function(n,x,m){var b=Object.prototype.toString;x.exports=Array.isArray||function(e){return!!e&&"[object Array]"==b.call(e)}},{}],8:[function(n,x,m){(function(b){function e(a,b){for(var d=0,l=a.length-1;0<=l;l--){var v=a[l];"."===v?a.splice(l,1):".."===v?(a.splice(l,1),d++):d&&(a.splice(l,1),d--)}if(b)for(;d--;d)a.unshift("..");return a}function g(a,b){if(a.filter)return a.filter(b);for(var d=[],l=0;l<a.length;l++)b(a[l],
l,a)&&d.push(a[l]);return d}var h=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;m.resolve=function(){for(var a="",d=!1,h=arguments.length-1;-1<=h&&!d;h--){var q=0<=h?arguments[h]:b.cwd();if("string"!==typeof q)throw new TypeError("Arguments to path.resolve must be strings");q&&(a=q+"/"+a,d="/"===q.charAt(0))}a=e(g(a.split("/"),function(a){return!!a}),!d).join("/");return(d?"/":"")+a||"."};m.normalize=function(a){var b=m.isAbsolute(a),h="/"===d(a,-1);(a=e(g(a.split("/"),function(a){return!!a}),
!b).join("/"))||b||(a=".");a&&h&&(a+="/");return(b?"/":"")+a};m.isAbsolute=function(a){return"/"===a.charAt(0)};m.join=function(){var a=Array.prototype.slice.call(arguments,0);return m.normalize(g(a,function(a,b){if("string"!==typeof a)throw new TypeError("Arguments to path.join must be strings");return a}).join("/"))};m.relative=function(a,b){function d(a){for(var c=0;c<a.length&&""===a[c];c++);for(var b=a.length-1;0<=b&&""===a[b];b--);return c>b?[]:a.slice(c,b-c+1)}a=m.resolve(a).substr(1);b=m.resolve(b).substr(1);
for(var l=d(a.split("/")),v=d(b.split("/")),e=Math.min(l.length,v.length),c=e,k=0;k<e;k++)if(l[k]!==v[k]){c=k;break}e=[];for(k=c;k<l.length;k++)e.push("..");e=e.concat(v.slice(c));return e.join("/")};m.sep="/";m.delimiter=":";m.dirname=function(a){var b=h.exec(a).slice(1);a=b[0];b=b[1];if(!a&&!b)return".";b&&(b=b.substr(0,b.length-1));return a+b};m.basename=function(a,b){var d=h.exec(a).slice(1)[2];b&&d.substr(-1*b.length)===b&&(d=d.substr(0,d.length-b.length));return d};m.extname=function(a){return h.exec(a).slice(1)[3]};
var d="b"==="ab".substr(-1)?function(a,b,d){return a.substr(b,d)}:function(a,b,d){0>b&&(b=a.length+b);return a.substr(b,d)}}).call(this,n("g5I+bs"))},{"g5I+bs":9}],9:[function(n,x,m){function b(){}n=x.exports={};n.nextTick=function(){if("undefined"!==typeof window&&window.setImmediate)return function(b){return window.setImmediate(b)};if("undefined"!==typeof window&&window.postMessage&&window.addEventListener){var b=[];window.addEventListener("message",function(e){var g=e.source;g!==window&&null!==
g||"process-tick"!==e.data||(e.stopPropagation(),0<b.length&&b.shift()())},!0);return function(e){b.push(e);window.postMessage("process-tick","*")}}return function(b){setTimeout(b,0)}}();n.title="browser";n.browser=!0;n.env={};n.argv=[];n.on=b;n.addListener=b;n.once=b;n.off=b;n.removeListener=b;n.removeAllListeners=b;n.emit=b;n.binding=function(b){throw Error("process.binding is not supported");};n.cwd=function(){return"/"};n.chdir=function(b){throw Error("process.chdir is not supported");}},{}],
10:[function(n,x,m){function b(){this._array=[];this._set=h?new Map:Object.create(null)}var e=n("./util"),g=Object.prototype.hasOwnProperty,h="undefined"!==typeof Map;b.fromArray=function(d,a){for(var e=new b,g=0,h=d.length;g<h;g++)e.add(d[g],a);return e};b.prototype.size=function(){return h?this._set.size:Object.getOwnPropertyNames(this._set).length};b.prototype.add=function(b,a){var d=h?b:e.toSetString(b),r=h?this.has(b):g.call(this._set,d),q=this._array.length;r&&!a||this._array.push(b);r||(h?
this._set.set(b,q):this._set[d]=q)};b.prototype.has=function(b){if(h)return this._set.has(b);b=e.toSetString(b);return g.call(this._set,b)};b.prototype.indexOf=function(b){if(h){var a=this._set.get(b);if(0<=a)return a}else if(a=e.toSetString(b),g.call(this._set,a))return this._set[a];throw Error('"'+b+'" is not in the set.');};b.prototype.at=function(b){if(0<=b&&b<this._array.length)return this._array[b];throw Error("No element indexed by "+b);};b.prototype.toArray=function(){return this._array.slice()};
m.ArraySet=b},{"./util":19}],11:[function(n,x,m){var b=n("./base64");m.encode=function(e){var g="",h=0>e?(-e<<1)+1:e<<1;do e=h&31,h>>>=5,0<h&&(e|=32),g+=b.encode(e);while(0<h);return g};m.decode=function(e,g,h){var d=e.length,a=0,l=0;do{if(g>=d)throw Error("Expected more digits in base 64 VLQ value.");var r=b.decode(e.charCodeAt(g++));if(-1===r)throw Error("Invalid base64 digit: "+e.charAt(g-1));var q=!!(r&32);r&=31;a+=r<<l;l+=5}while(q);e=a>>1;h.value=1===(a&1)?-e:e;h.rest=g}},{"./base64":12}],12:[function(n,
x,m){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");m.encode=function(e){if(0<=e&&e<b.length)return b[e];throw new TypeError("Must be between 0 and 63: "+e);};m.decode=function(b){return 65<=b&&90>=b?b-65:97<=b&&122>=b?b-97+26:48<=b&&57>=b?b-48+52:43==b?62:47==b?63:-1}},{}],13:[function(n,x,m){function b(e,g,h,d,a,l){var r=Math.floor((g-e)/2)+e,q=a(h,d[r],!0);return 0===q?r:0<q?1<g-r?b(r,g,h,d,a,l):l==m.LEAST_UPPER_BOUND?g<d.length?g:-1:r:1<r-e?b(e,r,h,d,a,l):l==
m.LEAST_UPPER_BOUND?r:0>e?-1:e}m.GREATEST_LOWER_BOUND=1;m.LEAST_UPPER_BOUND=2;m.search=function(e,g,h,d){if(0===g.length)return-1;e=b(-1,g.length,e,g,h,d||m.GREATEST_LOWER_BOUND);if(0>e)return-1;for(;0<=e-1&&0===h(g[e],g[e-1],!0);)--e;return e}},{}],14:[function(n,x,m){function b(){this._array=[];this._sorted=!0;this._last={generatedLine:-1,generatedColumn:0}}var e=n("./util");b.prototype.unsortedForEach=function(b,e){this._array.forEach(b,e)};b.prototype.add=function(b){var g=this._last,d=g.generatedLine,
a=b.generatedLine,l=g.generatedColumn,r=b.generatedColumn;a>d||a==d&&r>=l||0>=e.compareByGeneratedPositionsInflated(g,b)?this._last=b:this._sorted=!1;this._array.push(b)};b.prototype.toArray=function(){this._sorted||(this._array.sort(e.compareByGeneratedPositionsInflated),this._sorted=!0);return this._array};m.MappingList=b},{"./util":19}],15:[function(n,x,m){function b(b,e,d){var a=b[e];b[e]=b[d];b[d]=a}function e(g,h,d,a){if(d<a){var l=d-1;b(g,Math.round(d+Math.random()*(a-d)),a);for(var r=g[a],
q=d;q<a;q++)0>=h(g[q],r)&&(l+=1,b(g,l,q));b(g,l+1,q);l+=1;e(g,h,d,l-1);e(g,h,l+1,a)}}m.quickSort=function(b,h){e(b,h,0,b.length-1)}},{}],16:[function(n,x,m){function b(a,b){var c=a;"string"===typeof a&&(c=d.parseSourceMapInput(a));return null!=c.sections?new h(c,b):new e(c,b)}function e(a,b){var c=a;"string"===typeof a&&(c=d.parseSourceMapInput(a));var k=d.getArg(c,"version"),e=d.getArg(c,"sources"),v=d.getArg(c,"names",[]),g=d.getArg(c,"sourceRoot",null),h=d.getArg(c,"sourcesContent",null),q=d.getArg(c,
"mappings");c=d.getArg(c,"file",null);if(k!=this._version)throw Error("Unsupported version: "+k);g&&(g=d.normalize(g));e=e.map(String).map(d.normalize).map(function(a){return g&&d.isAbsolute(g)&&d.isAbsolute(a)?d.relative(g,a):a});this._names=l.fromArray(v.map(String),!0);this._sources=l.fromArray(e,!0);this.sourceRoot=g;this.sourcesContent=h;this._mappings=q;this._sourceMapURL=b;this.file=c}function g(){this.generatedColumn=this.generatedLine=0;this.name=this.originalColumn=this.originalLine=this.source=
null}function h(a,e){var c=a;"string"===typeof a&&(c=d.parseSourceMapInput(a));var k=d.getArg(c,"version");c=d.getArg(c,"sections");if(k!=this._version)throw Error("Unsupported version: "+k);this._sources=new l;this._names=new l;var v={line:-1,column:0};this._sections=c.map(function(a){if(a.url)throw Error("Support for url field in sections not implemented.");var c=d.getArg(a,"offset"),k=d.getArg(c,"line"),g=d.getArg(c,"column");if(k<v.line||k===v.line&&g<v.column)throw Error("Section offsets must be ordered and non-overlapping.");
v=c;return{generatedOffset:{generatedLine:k+1,generatedColumn:g+1},consumer:new b(d.getArg(a,"map"),e)}})}var d=n("./util"),a=n("./binary-search"),l=n("./array-set").ArraySet,r=n("./base64-vlq"),q=n("./quick-sort").quickSort;b.fromSourceMap=function(a){return e.fromSourceMap(a)};b.prototype._version=3;b.prototype.__generatedMappings=null;Object.defineProperty(b.prototype,"_generatedMappings",{configurable:!0,enumerable:!0,get:function(){this.__generatedMappings||this._parseMappings(this._mappings,
this.sourceRoot);return this.__generatedMappings}});b.prototype.__originalMappings=null;Object.defineProperty(b.prototype,"_originalMappings",{configurable:!0,enumerable:!0,get:function(){this.__originalMappings||this._parseMappings(this._mappings,this.sourceRoot);return this.__originalMappings}});b.prototype._charIsMappingSeparator=function(a,b){var c=a.charAt(b);return";"===c||","===c};b.prototype._parseMappings=function(a,b){throw Error("Subclasses must implement _parseMappings");};b.GENERATED_ORDER=
1;b.ORIGINAL_ORDER=2;b.GREATEST_LOWER_BOUND=1;b.LEAST_UPPER_BOUND=2;b.prototype.eachMapping=function(a,e,c){e=e||null;switch(c||b.GENERATED_ORDER){case b.GENERATED_ORDER:c=this._generatedMappings;break;case b.ORIGINAL_ORDER:c=this._originalMappings;break;default:throw Error("Unknown order of iteration.");}var k=this.sourceRoot;c.map(function(a){var b=null===a.source?null:this._sources.at(a.source);b=d.computeSourceURL(k,b,this._sourceMapURL);return{source:b,generatedLine:a.generatedLine,generatedColumn:a.generatedColumn,
originalLine:a.originalLine,originalColumn:a.originalColumn,name:null===a.name?null:this._names.at(a.name)}},this).forEach(a,e)};b.prototype.allGeneratedPositionsFor=function(b){var e=d.getArg(b,"line"),c={source:d.getArg(b,"source"),originalLine:e,originalColumn:d.getArg(b,"column",0)};null!=this.sourceRoot&&(c.source=d.relative(this.sourceRoot,c.source));if(!this._sources.has(c.source))return[];c.source=this._sources.indexOf(c.source);var k=[];c=this._findMapping(c,this._originalMappings,"originalLine",
"originalColumn",d.compareByOriginalPositions,a.LEAST_UPPER_BOUND);if(0<=c){var g=this._originalMappings[c];if(void 0===b.column)for(e=g.originalLine;g&&g.originalLine===e;)k.push({line:d.getArg(g,"generatedLine",null),column:d.getArg(g,"generatedColumn",null),lastColumn:d.getArg(g,"lastGeneratedColumn",null)}),g=this._originalMappings[++c];else for(b=g.originalColumn;g&&g.originalLine===e&&g.originalColumn==b;)k.push({line:d.getArg(g,"generatedLine",null),column:d.getArg(g,"generatedColumn",null),
lastColumn:d.getArg(g,"lastGeneratedColumn",null)}),g=this._originalMappings[++c]}return k};m.SourceMapConsumer=b;e.prototype=Object.create(b.prototype);e.prototype.consumer=b;e.fromSourceMap=function(a,b){var c=Object.create(e.prototype),k=c._names=l.fromArray(a._names.toArray(),!0),v=c._sources=l.fromArray(a._sources.toArray(),!0);c.sourceRoot=a._sourceRoot;c.sourcesContent=a._generateSourcesContent(c._sources.toArray(),c.sourceRoot);c.file=a._file;c._sourceMapURL=b;for(var h=a._mappings.toArray().slice(),
r=c.__generatedMappings=[],m=c.__originalMappings=[],u=0,n=h.length;u<n;u++){var f=h[u],p=new g;p.generatedLine=f.generatedLine;p.generatedColumn=f.generatedColumn;f.source&&(p.source=v.indexOf(f.source),p.originalLine=f.originalLine,p.originalColumn=f.originalColumn,f.name&&(p.name=k.indexOf(f.name)),m.push(p));r.push(p)}q(c.__originalMappings,d.compareByOriginalPositions);return c};e.prototype._version=3;Object.defineProperty(e.prototype,"sources",{get:function(){return this._sources.toArray().map(function(a){return d.computeSourceURL(this.sourceRoot,
a,this._sourceMapURL)},this)}});e.prototype._parseMappings=function(a,b){for(var c=1,k=0,e=0,l=0,v=0,h=0,m=a.length,u=0,f={},p={},n=[],x=[],z,B,A,E,I;u<m;)if(";"===a.charAt(u))c++,u++,k=0;else if(","===a.charAt(u))u++;else{z=new g;z.generatedLine=c;for(E=u;E<m&&!this._charIsMappingSeparator(a,E);E++);B=a.slice(u,E);if(A=f[B])u+=B.length;else{for(A=[];u<E;)r.decode(a,u,p),I=p.value,u=p.rest,A.push(I);if(2===A.length)throw Error("Found a source, but no line and column");if(3===A.length)throw Error("Found a source and line, but no column");
f[B]=A}z.generatedColumn=k+A[0];k=z.generatedColumn;1<A.length&&(z.source=v+A[1],v+=A[1],z.originalLine=e+A[2],e=z.originalLine,z.originalLine+=1,z.originalColumn=l+A[3],l=z.originalColumn,4<A.length&&(z.name=h+A[4],h+=A[4]));x.push(z);"number"===typeof z.originalLine&&n.push(z)}q(x,d.compareByGeneratedPositionsDeflated);this.__generatedMappings=x;q(n,d.compareByOriginalPositions);this.__originalMappings=n};e.prototype._findMapping=function(b,d,c,k,e,g){if(0>=b[c])throw new TypeError("Line must be greater than or equal to 1, got "+
b[c]);if(0>b[k])throw new TypeError("Column must be greater than or equal to 0, got "+b[k]);return a.search(b,d,e,g)};e.prototype.computeColumnSpans=function(){for(var a=0;a<this._generatedMappings.length;++a){var b=this._generatedMappings[a];if(a+1<this._generatedMappings.length){var c=this._generatedMappings[a+1];if(b.generatedLine===c.generatedLine){b.lastGeneratedColumn=c.generatedColumn-1;continue}}b.lastGeneratedColumn=Infinity}};e.prototype.originalPositionFor=function(a){var e={generatedLine:d.getArg(a,
"line"),generatedColumn:d.getArg(a,"column")};a=this._findMapping(e,this._generatedMappings,"generatedLine","generatedColumn",d.compareByGeneratedPositionsDeflated,d.getArg(a,"bias",b.GREATEST_LOWER_BOUND));if(0<=a&&(a=this._generatedMappings[a],a.generatedLine===e.generatedLine)){e=d.getArg(a,"source",null);null!==e&&(e=this._sources.at(e),e=d.computeSourceURL(this.sourceRoot,e,this._sourceMapURL));var c=d.getArg(a,"name",null);null!==c&&(c=this._names.at(c));return{source:e,line:d.getArg(a,"originalLine",
null),column:d.getArg(a,"originalColumn",null),name:c}}return{source:null,line:null,column:null,name:null}};e.prototype.hasContentsOfAllSources=function(){return this.sourcesContent?this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(a){return null==a}):!1};e.prototype.sourceContentFor=function(a,b){if(!this.sourcesContent)return null;var c=a;null!=this.sourceRoot&&(c=d.relative(this.sourceRoot,c));if(this._sources.has(c))return this.sourcesContent[this._sources.indexOf(c)];
var k=this.sources,e;for(e=0;e<k.length;++e)if(k[e]==a)return this.sourcesContent[e];var g;if(null!=this.sourceRoot&&(g=d.urlParse(this.sourceRoot))){k=c.replace(/^file:\/\//,"");if("file"==g.scheme&&this._sources.has(k))return this.sourcesContent[this._sources.indexOf(k)];if((!g.path||"/"==g.path)&&this._sources.has("/"+c))return this.sourcesContent[this._sources.indexOf("/"+c)]}if(b)return null;throw Error('"'+c+'" is not in the SourceMap.');};e.prototype.generatedPositionFor=function(a){var e=
d.getArg(a,"source");null!=this.sourceRoot&&(e=d.relative(this.sourceRoot,e));if(!this._sources.has(e))return{line:null,column:null,lastColumn:null};e=this._sources.indexOf(e);e={source:e,originalLine:d.getArg(a,"line"),originalColumn:d.getArg(a,"column")};a=this._findMapping(e,this._originalMappings,"originalLine","originalColumn",d.compareByOriginalPositions,d.getArg(a,"bias",b.GREATEST_LOWER_BOUND));return 0<=a&&(a=this._originalMappings[a],a.source===e.source)?{line:d.getArg(a,"generatedLine",
null),column:d.getArg(a,"generatedColumn",null),lastColumn:d.getArg(a,"lastGeneratedColumn",null)}:{line:null,column:null,lastColumn:null}};m.BasicSourceMapConsumer=e;h.prototype=Object.create(b.prototype);h.prototype.constructor=b;h.prototype._version=3;Object.defineProperty(h.prototype,"sources",{get:function(){for(var a=[],b=0;b<this._sections.length;b++)for(var c=0;c<this._sections[b].consumer.sources.length;c++)a.push(this._sections[b].consumer.sources[c]);return a}});h.prototype.originalPositionFor=
function(b){var e={generatedLine:d.getArg(b,"line"),generatedColumn:d.getArg(b,"column")},c=a.search(e,this._sections,function(a,b){var c=a.generatedLine-b.generatedOffset.generatedLine;return c?c:a.generatedColumn-b.generatedOffset.generatedColumn});return(c=this._sections[c])?c.consumer.originalPositionFor({line:e.generatedLine-(c.generatedOffset.generatedLine-1),column:e.generatedColumn-(c.generatedOffset.generatedLine===e.generatedLine?c.generatedOffset.generatedColumn-1:0),bias:b.bias}):{source:null,
line:null,column:null,name:null}};h.prototype.hasContentsOfAllSources=function(){return this._sections.every(function(a){return a.consumer.hasContentsOfAllSources()})};h.prototype.sourceContentFor=function(a,b){for(var c=0;c<this._sections.length;c++){var d=this._sections[c].consumer.sourceContentFor(a,!0);if(d)return d}if(b)return null;throw Error('"'+a+'" is not in the SourceMap.');};h.prototype.generatedPositionFor=function(a){for(var b=0;b<this._sections.length;b++){var c=this._sections[b];if(-1!==
c.consumer.sources.indexOf(d.getArg(a,"source"))){var k=c.consumer.generatedPositionFor(a);if(k)return{line:k.line+(c.generatedOffset.generatedLine-1),column:k.column+(c.generatedOffset.generatedLine===k.line?c.generatedOffset.generatedColumn-1:0)}}}return{line:null,column:null}};h.prototype._parseMappings=function(a,b){this.__generatedMappings=[];this.__originalMappings=[];for(var c=0;c<this._sections.length;c++)for(var k=this._sections[c],e=k.consumer._generatedMappings,g=0;g<e.length;g++){var l=
e[g],h=k.consumer._sources.at(l.source);h=d.computeSourceURL(k.consumer.sourceRoot,h,this._sourceMapURL);this._sources.add(h);h=this._sources.indexOf(h);var r=null;l.name&&(r=k.consumer._names.at(l.name),this._names.add(r),r=this._names.indexOf(r));l={source:h,generatedLine:l.generatedLine+(k.generatedOffset.generatedLine-1),generatedColumn:l.generatedColumn+(k.generatedOffset.generatedLine===l.generatedLine?k.generatedOffset.generatedColumn-1:0),originalLine:l.originalLine,originalColumn:l.originalColumn,
name:r};this.__generatedMappings.push(l);"number"===typeof l.originalLine&&this.__originalMappings.push(l)}q(this.__generatedMappings,d.compareByGeneratedPositionsDeflated);q(this.__originalMappings,d.compareByOriginalPositions)};m.IndexedSourceMapConsumer=h},{"./array-set":10,"./base64-vlq":11,"./binary-search":13,"./quick-sort":15,"./util":19}],17:[function(n,x,m){function b(a){a||(a={});this._file=g.getArg(a,"file",null);this._sourceRoot=g.getArg(a,"sourceRoot",null);this._skipValidation=g.getArg(a,
"skipValidation",!1);this._sources=new h;this._names=new h;this._mappings=new d;this._sourcesContents=null}var e=n("./base64-vlq"),g=n("./util"),h=n("./array-set").ArraySet,d=n("./mapping-list").MappingList;b.prototype._version=3;b.fromSourceMap=function(a){var d=a.sourceRoot,e=new b({file:a.file,sourceRoot:d});a.eachMapping(function(a){var b={generated:{line:a.generatedLine,column:a.generatedColumn}};null!=a.source&&(b.source=a.source,null!=d&&(b.source=g.relative(d,b.source)),b.original={line:a.originalLine,
column:a.originalColumn},null!=a.name&&(b.name=a.name));e.addMapping(b)});a.sources.forEach(function(b){var l=b;null!==d&&(l=g.relative(d,b));e._sources.has(l)||e._sources.add(l);l=a.sourceContentFor(b);null!=l&&e.setSourceContent(b,l)});return e};b.prototype.addMapping=function(a){var b=g.getArg(a,"generated"),d=g.getArg(a,"original",null),e=g.getArg(a,"source",null);a=g.getArg(a,"name",null);this._skipValidation||this._validateMapping(b,d,e,a);null!=e&&(e=String(e),this._sources.has(e)||this._sources.add(e));
null!=a&&(a=String(a),this._names.has(a)||this._names.add(a));this._mappings.add({generatedLine:b.line,generatedColumn:b.column,originalLine:null!=d&&d.line,originalColumn:null!=d&&d.column,source:e,name:a})};b.prototype.setSourceContent=function(a,b){var d=a;null!=this._sourceRoot&&(d=g.relative(this._sourceRoot,d));null!=b?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[g.toSetString(d)]=b):this._sourcesContents&&(delete this._sourcesContents[g.toSetString(d)],
0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))};b.prototype.applySourceMap=function(a,b,d){var e=b;if(null==b){if(null==a.file)throw Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');e=a.file}var l=this._sourceRoot;null!=l&&(e=g.relative(l,e));var m=new h,c=new h;this._mappings.unsortedForEach(function(b){if(b.source===e&&null!=b.originalLine){var k=a.originalPositionFor({line:b.originalLine,
column:b.originalColumn});null!=k.source&&(b.source=k.source,null!=d&&(b.source=g.join(d,b.source)),null!=l&&(b.source=g.relative(l,b.source)),b.originalLine=k.line,b.originalColumn=k.column,null!=k.name&&(b.name=k.name))}k=b.source;null==k||m.has(k)||m.add(k);b=b.name;null==b||c.has(b)||c.add(b)},this);this._sources=m;this._names=c;a.sources.forEach(function(b){var c=a.sourceContentFor(b);null!=c&&(null!=d&&(b=g.join(d,b)),null!=l&&(b=g.relative(l,b)),this.setSourceContent(b,c))},this)};b.prototype._validateMapping=
function(a,b,d,e){if(b&&"number"!==typeof b.line&&"number"!==typeof b.column)throw Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if(!(a&&"line"in a&&"column"in a&&0<a.line&&0<=a.column&&!b&&!d&&!e||a&&"line"in a&&"column"in a&&b&&"line"in b&&"column"in b&&0<a.line&&0<=a.column&&0<b.line&&0<=b.column&&
d))throw Error("Invalid mapping: "+JSON.stringify({generated:a,source:d,original:b,name:e}));};b.prototype._serializeMappings=function(){for(var a=0,b=1,d=0,h=0,m=0,n=0,c="",k,w,y,F=this._mappings.toArray(),D=0,t=F.length;D<t;D++){w=F[D];k="";if(w.generatedLine!==b)for(a=0;w.generatedLine!==b;)k+=";",b++;else if(0<D){if(!g.compareByGeneratedPositionsInflated(w,F[D-1]))continue;k+=","}k+=e.encode(w.generatedColumn-a);a=w.generatedColumn;null!=w.source&&(y=this._sources.indexOf(w.source),k+=e.encode(y-
n),n=y,k+=e.encode(w.originalLine-1-h),h=w.originalLine-1,k+=e.encode(w.originalColumn-d),d=w.originalColumn,null!=w.name&&(w=this._names.indexOf(w.name),k+=e.encode(w-m),m=w));c+=k}return c};b.prototype._generateSourcesContent=function(a,b){return a.map(function(a){if(!this._sourcesContents)return null;null!=b&&(a=g.relative(b,a));a=g.toSetString(a);return Object.prototype.hasOwnProperty.call(this._sourcesContents,a)?this._sourcesContents[a]:null},this)};b.prototype.toJSON=function(){var a={version:this._version,
sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};null!=this._file&&(a.file=this._file);null!=this._sourceRoot&&(a.sourceRoot=this._sourceRoot);this._sourcesContents&&(a.sourcesContent=this._generateSourcesContent(a.sources,a.sourceRoot));return a};b.prototype.toString=function(){return JSON.stringify(this.toJSON())};m.SourceMapGenerator=b},{"./array-set":10,"./base64-vlq":11,"./mapping-list":14,"./util":19}],18:[function(n,x,m){function b(b,a,e,g,h){this.children=
[];this.sourceContents={};this.line=null==b?null:b;this.column=null==a?null:a;this.source=null==e?null:e;this.name=null==h?null:h;this.$$$isSourceNode$$$=!0;null!=g&&this.add(g)}var e=n("./source-map-generator").SourceMapGenerator,g=n("./util"),h=/(\r?\n)/;b.fromStringWithSourceMap=function(d,a,e){function l(a,c){if(null===a||void 0===a.source)m.add(c);else{var d=e?g.join(e,a.source):a.source;m.add(new b(a.originalLine,a.originalColumn,d,c,a.name))}}var m=new b,n=d.split(h),u=0,c=function(){var a=
u<n.length?n[u++]:void 0,b=(u<n.length?n[u++]:void 0)||"";return a+b},k=1,w=0,y=null;a.eachMapping(function(a){if(null!==y)if(k<a.generatedLine)l(y,c()),k++,w=0;else{var b=n[u]||"",d=b.substr(0,a.generatedColumn-w);n[u]=b.substr(a.generatedColumn-w);w=a.generatedColumn;l(y,d);y=a;return}for(;k<a.generatedLine;)m.add(c()),k++;w<a.generatedColumn&&(b=n[u]||"",m.add(b.substr(0,a.generatedColumn)),n[u]=b.substr(a.generatedColumn),w=a.generatedColumn);y=a},this);u<n.length&&(y&&l(y,c()),m.add(n.splice(u).join("")));
a.sources.forEach(function(b){var c=a.sourceContentFor(b);null!=c&&(null!=e&&(b=g.join(e,b)),m.setSourceContent(b,c))});return m};b.prototype.add=function(b){if(Array.isArray(b))b.forEach(function(a){this.add(a)},this);else if(b.$$$isSourceNode$$$||"string"===typeof b)b&&this.children.push(b);else throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+b);return this};b.prototype.prepend=function(b){if(Array.isArray(b))for(var a=b.length-1;0<=a;a--)this.prepend(b[a]);
else if(b.$$$isSourceNode$$$||"string"===typeof b)this.children.unshift(b);else throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+b);return this};b.prototype.walk=function(b){for(var a,d=0,e=this.children.length;d<e;d++)a=this.children[d],a.$$$isSourceNode$$$?a.walk(b):""!==a&&b(a,{source:this.source,line:this.line,column:this.column,name:this.name})};b.prototype.join=function(b){var a,d=this.children.length;if(0<d){var e=[];for(a=0;a<d-1;a++)e.push(this.children[a]),
e.push(b);e.push(this.children[a]);this.children=e}return this};b.prototype.replaceRight=function(b,a){var d=this.children[this.children.length-1];d.$$$isSourceNode$$$?d.replaceRight(b,a):"string"===typeof d?this.children[this.children.length-1]=d.replace(b,a):this.children.push("".replace(b,a));return this};b.prototype.setSourceContent=function(b,a){this.sourceContents[g.toSetString(b)]=a};b.prototype.walkSourceContents=function(b){for(var a=0,d=this.children.length;a<d;a++)this.children[a].$$$isSourceNode$$$&&
this.children[a].walkSourceContents(b);var e=Object.keys(this.sourceContents);a=0;for(d=e.length;a<d;a++)b(g.fromSetString(e[a]),this.sourceContents[e[a]])};b.prototype.toString=function(){var b="";this.walk(function(a){b+=a});return b};b.prototype.toStringWithSourceMap=function(b){var a="",d=1,g=0,h=new e(b),m=!1,n=null,c=null,k=null,w=null;this.walk(function(b,e){a+=b;null!==e.source&&null!==e.line&&null!==e.column?(n===e.source&&c===e.line&&k===e.column&&w===e.name||h.addMapping({source:e.source,
original:{line:e.line,column:e.column},generated:{line:d,column:g},name:e.name}),n=e.source,c=e.line,k=e.column,w=e.name,m=!0):m&&(h.addMapping({generated:{line:d,column:g}}),n=null,m=!1);for(var l=0,y=b.length;l<y;l++)10===b.charCodeAt(l)?(d++,g=0,l+1===y?(n=null,m=!1):m&&h.addMapping({source:e.source,original:{line:e.line,column:e.column},generated:{line:d,column:g},name:e.name})):g++});this.walkSourceContents(function(a,b){h.setSourceContent(a,b)});return{code:a,map:h}};m.SourceNode=b},{"./source-map-generator":17,
"./util":19}],19:[function(n,x,m){function b(a){return(a=a.match(v))?{scheme:a[1],auth:a[2],host:a[3],port:a[4],path:a[5]}:null}function e(a){var b="";a.scheme&&(b+=a.scheme+":");b+="//";a.auth&&(b+=a.auth+"@");a.host&&(b+=a.host);a.port&&(b+=":"+a.port);a.path&&(b+=a.path);return b}function g(a){var c=a,d=b(a);if(d){if(!d.path)return a;c=d.path}a=m.isAbsolute(c);c=c.split(/\/+/);for(var g,h=0,l=c.length-1;0<=l;l--)g=c[l],"."===g?c.splice(l,1):".."===g?h++:0<h&&(""===g?(c.splice(l+1,h),h=0):(c.splice(l,
2),h--));c=c.join("/");""===c&&(c=a?"/":".");return d?(d.path=c,e(d)):c}function h(a,d){""===a&&(a=".");""===d&&(d=".");var c=b(d),k=b(a);k&&(a=k.path||"/");if(c&&!c.scheme)return k&&(c.scheme=k.scheme),e(c);if(c||d.match(u))return d;if(k&&!k.host&&!k.path)return k.host=d,e(k);c="/"===d.charAt(0)?d:g(a.replace(/\/+$/,"")+"/"+d);return k?(k.path=c,e(k)):c}function d(a){return a}function a(a){return r(a)?"$"+a:a}function l(a){return r(a)?a.slice(1):a}function r(a){if(!a)return!1;var b=a.length;if(9>
b||95!==a.charCodeAt(b-1)||95!==a.charCodeAt(b-2)||111!==a.charCodeAt(b-3)||116!==a.charCodeAt(b-4)||111!==a.charCodeAt(b-5)||114!==a.charCodeAt(b-6)||112!==a.charCodeAt(b-7)||95!==a.charCodeAt(b-8)||95!==a.charCodeAt(b-9))return!1;for(b-=10;0<=b;b--)if(36!==a.charCodeAt(b))return!1;return!0}function q(a,b){return a===b?0:null===a?1:null===b?-1:a>b?1:-1}m.getArg=function(a,b,d){if(b in a)return a[b];if(3===arguments.length)return d;throw Error('"'+b+'" is a required argument.');};var v=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,
u=/^data:.+,.+$/;m.urlParse=b;m.urlGenerate=e;m.normalize=g;m.join=h;m.isAbsolute=function(a){return"/"===a.charAt(0)||v.test(a)};m.relative=function(a,b){""===a&&(a=".");a=a.replace(/\/$/,"");for(var c=0;0!==b.indexOf(a+"/");){var d=a.lastIndexOf("/");if(0>d)return b;a=a.slice(0,d);if(a.match(/^([^\/]+:\/)?\/*$/))return b;++c}return Array(c+1).join("../")+b.substr(a.length+1)};n=!("__proto__"in Object.create(null));m.toSetString=n?d:a;m.fromSetString=n?d:l;m.compareByOriginalPositions=function(a,
b,d){var c=q(a.source,b.source);if(0!==c)return c;c=a.originalLine-b.originalLine;if(0!==c)return c;c=a.originalColumn-b.originalColumn;if(0!==c||d)return c;c=a.generatedColumn-b.generatedColumn;if(0!==c)return c;c=a.generatedLine-b.generatedLine;return 0!==c?c:q(a.name,b.name)};m.compareByGeneratedPositionsDeflated=function(a,b,d){var c=a.generatedLine-b.generatedLine;if(0!==c)return c;c=a.generatedColumn-b.generatedColumn;if(0!==c||d)return c;c=q(a.source,b.source);if(0!==c)return c;c=a.originalLine-
b.originalLine;if(0!==c)return c;c=a.originalColumn-b.originalColumn;return 0!==c?c:q(a.name,b.name)};m.compareByGeneratedPositionsInflated=function(a,b){var c=a.generatedLine-b.generatedLine;if(0!==c)return c;c=a.generatedColumn-b.generatedColumn;if(0!==c)return c;c=q(a.source,b.source);if(0!==c)return c;c=a.originalLine-b.originalLine;if(0!==c)return c;c=a.originalColumn-b.originalColumn;return 0!==c?c:q(a.name,b.name)};m.parseSourceMapInput=function(a){return JSON.parse(a.replace(/^\)]}'[^\n]*\n/,
""))};m.computeSourceURL=function(a,d,l){d=d||"";a&&("/"!==a[a.length-1]&&"/"!==d[0]&&(a+="/"),d=a+d);if(l){a=b(l);if(!a)throw Error("sourceMapURL could not be parsed");a.path&&(l=a.path.lastIndexOf("/"),0<=l&&(a.path=a.path.substring(0,l+1)));d=h(e(a),d)}return g(d)}},{}],20:[function(n,x,m){m.SourceMapGenerator=n("./lib/source-map-generator").SourceMapGenerator;m.SourceMapConsumer=n("./lib/source-map-consumer").SourceMapConsumer;m.SourceNode=n("./lib/source-node").SourceNode},{"./lib/source-map-consumer":16,
"./lib/source-map-generator":17,"./lib/source-node":18}],21:[function(n,x,m){(function(b){function e(){return"browser"===f?!0:"node"===f?!1:"undefined"!==typeof window&&"function"===typeof XMLHttpRequest&&!(window.require&&window.module&&window.process&&"renderer"===window.process.type)}function g(a){return function(b){for(var c=0;c<a.length;c++){var d=a[c](b);if(d)return d}return null}}function h(a,b){if(!a)return b;var c=w.dirname(a),d=/^\w+:\/\/[^\/]*/.exec(c);d=d?d[0]:"";var e=c.slice(d.length);
return d&&/^\/\w:/.test(e)?(d+="/",d+w.resolve(c.slice(d.length),b).replace(/\\/g,"/")):d+w.resolve(c.slice(d.length),b)}function d(a){var b=C[a.source];if(!b){var c=E(a.source);c?(b=C[a.source]={url:c.url,map:new k(c.map)},b.map.sourcesContent&&b.map.sources.forEach(function(a,c){var d=b.map.sourcesContent[c];if(d){var e=h(b.url,a);p[e]=d}})):b=C[a.source]={url:null,map:null}}return b&&b.map&&"function"===typeof b.map.originalPositionFor&&(c=b.map.originalPositionFor(a),null!==c.source)?(c.source=
h(b.url,c.source),c):a}function a(b){var c=/^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(b);return c?(b=d({source:c[2],line:+c[3],column:c[4]-1}),"eval at "+c[1]+" ("+b.source+":"+b.line+":"+(b.column+1)+")"):(c=/^eval at ([^(]+) \((.+)\)$/.exec(b))?"eval at "+c[1]+" ("+a(c[2])+")":b}function l(){var a="";if(this.isNative())a="native";else{var b=this.getScriptNameOrSourceURL();!b&&this.isEval()&&(a=this.getEvalOrigin(),a+=", ");a=b?a+b:a+"<anonymous>";b=this.getLineNumber();null!=b&&(a+=":"+b,(b=
this.getColumnNumber())&&(a+=":"+b))}b="";var c=this.getFunctionName(),d=!0,e=this.isConstructor();if(this.isToplevel()||e)e?b+="new "+(c||"<anonymous>"):c?b+=c:(b+=a,d=!1);else{e=this.getTypeName();"[object Object]"===e&&(e="null");var f=this.getMethodName();c?(e&&0!=c.indexOf(e)&&(b+=e+"."),b+=c,f&&c.indexOf("."+f)!=c.length-f.length-1&&(b+=" [as "+f+"]")):b+=e+"."+(f||"<anonymous>")}d&&(b+=" ("+a+")");return b}function r(a){var b={};Object.getOwnPropertyNames(Object.getPrototypeOf(a)).forEach(function(c){b[c]=
/^(?:is|get)/.test(c)?function(){return a[c].call(a)}:a[c]});b.toString=l;return b}function q(c,f){void 0===f&&(f={nextPosition:null,curPosition:null});if(c.isNative())return f.curPosition=null,c;var g=c.getFileName()||c.getScriptNameOrSourceURL();if(g){var h=c.getLineNumber(),k=c.getColumnNumber()-1,l=/^v(10\.1[6-9]|10\.[2-9][0-9]|10\.[0-9]{3,}|1[2-9]\d*|[2-9]\d|\d{3,}|11\.11)/.test(b.version)?0:62;1===h&&k>l&&!e()&&!c.isEval()&&(k-=l);var m=d({source:g,line:h,column:k});f.curPosition=m;c=r(c);var p=
c.getFunctionName;c.getFunctionName=function(){return null==f.nextPosition?p():f.nextPosition.name||p()};c.getFileName=function(){return m.source};c.getLineNumber=function(){return m.line};c.getColumnNumber=function(){return m.column+1};c.getScriptNameOrSourceURL=function(){return m.source};return c}var n=c.isEval()&&c.getEvalOrigin();n&&(n=a(n),c=r(c),c.getEvalOrigin=function(){return n});return c}function v(a,b){H&&(p={},C={});for(var c=(a.name||"Error")+": "+(a.message||""),d={nextPosition:null,
curPosition:null},e=[],f=b.length-1;0<=f;f--)e.push("\n    at "+q(b[f],d)),d.nextPosition=d.curPosition;d.curPosition=d.nextPosition=null;return c+e.reverse().join("")}function u(a){var b=/\n    at [^(]+ \((.*):(\d+):(\d+)\)/.exec(a.stack);if(b){a=b[1];var c=+b[2];b=+b[3];var d=p[a];if(!d&&y&&y.existsSync(a))try{d=y.readFileSync(a,"utf8")}catch(N){d=""}if(d&&(d=d.split(/(?:\r\n|\r|\n)/)[c-1]))return a+":"+c+"\n"+d+"\n"+Array(b).join(" ")+"^"}return null}function c(){var a=b.emit;b.emit=function(c){if("uncaughtException"===
c){var d=arguments[1]&&arguments[1].stack,e=0<this.listeners(c).length;if(d&&!e){d=arguments[1];e=u(d);b.stderr._handle&&b.stderr._handle.setBlocking&&b.stderr._handle.setBlocking(!0);e&&(console.error(),console.error(e));console.error(d.stack);b.exit(1);return}}return a.apply(this,arguments)}}var k=n("source-map").SourceMapConsumer,w=n("path");try{var y=n("fs");y.existsSync&&y.readFileSync||(y=null)}catch(M){}var F=n("buffer-from"),D=!1,t=!1,H=!1,f="auto",p={},C={},G=/^data:application\/json[^,]+base64,/,
z=[],B=[],A=g(z);z.push(function(a){a=a.trim();/^file:/.test(a)&&(a=a.replace(/file:\/\/\/(\w:)?/,function(a,b){return b?"":"/"}));if(a in p)return p[a];var b="";try{if(y)y.existsSync(a)&&(b=y.readFileSync(a,"utf8"));else{var c=new XMLHttpRequest;c.open("GET",a,!1);c.send(null);4===c.readyState&&200===c.status&&(b=c.responseText)}}catch(K){}return p[a]=b});var E=g(B);B.push(function(a){a:{if(e())try{var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);var c=b.getResponseHeader("SourceMap")||b.getResponseHeader("X-SourceMap");
if(c){var d=c;break a}}catch(O){}d=A(a);b=/(?:\/\/[@#][\s]*sourceMappingURL=([^\s'"]+)[\s]*$)|(?:\/\*[@#][\s]*sourceMappingURL=([^\s*'"]+)[\s]*(?:\*\/)[\s]*$)/mg;for(var f;c=b.exec(d);)f=c;d=f?f[1]:null}if(!d)return null;G.test(d)?(f=d.slice(d.indexOf(",")+1),f=F(f,"base64").toString(),d=a):(d=h(a,d),f=A(d));return f?{url:d,map:f}:null});var I=z.slice(0),L=B.slice(0);m.wrapCallSite=q;m.getErrorSource=u;m.mapSourcePosition=d;m.retrieveSourceMap=E;m.install=function(a){a=a||{};if(a.environment&&(f=
a.environment,-1===["node","browser","auto"].indexOf(f)))throw Error("environment "+f+" was unknown. Available options are {auto, browser, node}");a.retrieveFile&&(a.overrideRetrieveFile&&(z.length=0),z.unshift(a.retrieveFile));a.retrieveSourceMap&&(a.overrideRetrieveSourceMap&&(B.length=0),B.unshift(a.retrieveSourceMap));if(a.hookRequire&&!e()){var d=x.require("module"),g=d.prototype._compile;g.__sourceMapSupport||(d.prototype._compile=function(a,b){p[b]=a;C[b]=void 0;return g.call(this,a,b)},d.prototype._compile.__sourceMapSupport=
!0)}H||(H="emptyCacheBetweenOperations"in a?a.emptyCacheBetweenOperations:!1);D||(D=!0,Error.prepareStackTrace=v);if(!t){a="handleUncaughtExceptions"in a?a.handleUncaughtExceptions:!0;try{!1===x.require("worker_threads").isMainThread&&(a=!1)}catch(K){}a&&"object"===typeof b&&null!==b&&"function"===typeof b.on&&(t=!0,c())}};m.resetRetrieveHandlers=function(){z.length=0;B.length=0;z=I.slice(0);B=L.slice(0);E=g(B);A=g(z)}}).call(this,n("g5I+bs"))},{"buffer-from":4,fs:3,"g5I+bs":9,path:8,"source-map":20}]},
{},[1]);return G});
{
  "dependencies": {
    "buffer-from": "^1.0.0",
    "source-map": "^0.6.0"
  },
  "deprecated": false,
  "description": "Fixes stack traces for files with source maps",
  "devDependencies": {
    "browserify": "^4.2.3",
    "coffeescript": "^1.12.7",
    "http-server": "^0.11.1",
    "mocha": "^3.5.3",
    "webpack": "^1.15.0"
  },
  "homepage": "https://github.com/evanw/node-source-map-support#readme",
  "license": "MIT",
  "main": "./source-map-support.js",
  "name": "source-map-support",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/evanw/node-source-map-support.git"
  },
  "version": "0.5.19"
}require('./').install();
var SourceMapConsumer = require('source-map').SourceMapConsumer;
var path = require('path');

var fs;
try {
  fs = require('fs');
  if (!fs.existsSync || !fs.readFileSync) {
    // fs doesn't have all methods we need
    fs = null;
  }
} catch (err) {
  /* nop */
}

var bufferFrom = require('buffer-from');

/**
 * Requires a module which is protected against bundler minification.
 *
 * @param {NodeModule} mod
 * @param {string} request
 */
function dynamicRequire(mod, request) {
  return mod.require(request);
}

// Only install once if called multiple times
var errorFormatterInstalled = false;
var uncaughtShimInstalled = false;

// If true, the caches are reset before a stack trace formatting operation
var emptyCacheBetweenOperations = false;

// Supports {browser, node, auto}
var environment = "auto";

// Maps a file path to a string containing the file contents
var fileContentsCache = {};

// Maps a file path to a source map for that file
var sourceMapCache = {};

// Regex for detecting source maps
var reSourceMap = /^data:application\/json[^,]+base64,/;

// Priority list of retrieve handlers
var retrieveFileHandlers = [];
var retrieveMapHandlers = [];

function isInBrowser() {
  if (environment === "browser")
    return true;
  if (environment === "node")
    return false;
  return ((typeof window !== 'undefined') && (typeof XMLHttpRequest === 'function') && !(window.require && window.module && window.process && window.process.type === "renderer"));
}

function hasGlobalProcessEventEmitter() {
  return ((typeof process === 'object') && (process !== null) && (typeof process.on === 'function'));
}

function handlerExec(list) {
  return function(arg) {
    for (var i = 0; i < list.length; i++) {
      var ret = list[i](arg);
      if (ret) {
        return ret;
      }
    }
    return null;
  };
}

var retrieveFile = handlerExec(retrieveFileHandlers);

retrieveFileHandlers.push(function(path) {
  // Trim the path to make sure there is no extra whitespace.
  path = path.trim();
  if (/^file:/.test(path)) {
    // existsSync/readFileSync can't handle file protocol, but once stripped, it works
    path = path.replace(/file:\/\/\/(\w:)?/, function(protocol, drive) {
      return drive ?
        '' : // file:///C:/dir/file -> C:/dir/file
        '/'; // file:///root-dir/file -> /root-dir/file
    });
  }
  if (path in fileContentsCache) {
    return fileContentsCache[path];
  }

  var contents = '';
  try {
    if (!fs) {
      // Use SJAX if we are in the browser
      var xhr = new XMLHttpRequest();
      xhr.open('GET', path, /** async */ false);
      xhr.send(null);
      if (xhr.readyState === 4 && xhr.status === 200) {
        contents = xhr.responseText;
      }
    } else if (fs.existsSync(path)) {
      // Otherwise, use the filesystem
      contents = fs.readFileSync(path, 'utf8');
    }
  } catch (er) {
    /* ignore any errors */
  }

  return fileContentsCache[path] = contents;
});

// Support URLs relative to a directory, but be careful about a protocol prefix
// in case we are in the browser (i.e. directories may start with "http://" or "file:///")
function supportRelativeURL(file, url) {
  if (!file) return url;
  var dir = path.dirname(file);
  var match = /^\w+:\/\/[^\/]*/.exec(dir);
  var protocol = match ? match[0] : '';
  var startPath = dir.slice(protocol.length);
  if (protocol && /^\/\w\:/.test(startPath)) {
    // handle file:///C:/ paths
    protocol += '/';
    return protocol + path.resolve(dir.slice(protocol.length), url).replace(/\\/g, '/');
  }
  return protocol + path.resolve(dir.slice(protocol.length), url);
}

function retrieveSourceMapURL(source) {
  var fileData;

  if (isInBrowser()) {
     try {
       var xhr = new XMLHttpRequest();
       xhr.open('GET', source, false);
       xhr.send(null);
       fileData = xhr.readyState === 4 ? xhr.responseText : null;

       // Support providing a sourceMappingURL via the SourceMap header
       var sourceMapHeader = xhr.getResponseHeader("SourceMap") ||
                             xhr.getResponseHeader("X-SourceMap");
       if (sourceMapHeader) {
         return sourceMapHeader;
       }
     } catch (e) {
     }
  }

  // Get the URL of the source map
  fileData = retrieveFile(source);
  var re = /(?:\/\/[@#][\s]*sourceMappingURL=([^\s'"]+)[\s]*$)|(?:\/\*[@#][\s]*sourceMappingURL=([^\s*'"]+)[\s]*(?:\*\/)[\s]*$)/mg;
  // Keep executing the search to find the *last* sourceMappingURL to avoid
  // picking up sourceMappingURLs from comments, strings, etc.
  var lastMatch, match;
  while (match = re.exec(fileData)) lastMatch = match;
  if (!lastMatch) return null;
  return lastMatch[1];
};

// Can be overridden by the retrieveSourceMap option to install. Takes a
// generated source filename; returns a {map, optional url} object, or null if
// there is no source map.  The map field may be either a string or the parsed
// JSON object (ie, it must be a valid argument to the SourceMapConsumer
// constructor).
var retrieveSourceMap = handlerExec(retrieveMapHandlers);
retrieveMapHandlers.push(function(source) {
  var sourceMappingURL = retrieveSourceMapURL(source);
  if (!sourceMappingURL) return null;

  // Read the contents of the source map
  var sourceMapData;
  if (reSourceMap.test(sourceMappingURL)) {
    // Support source map URL as a data url
    var rawData = sourceMappingURL.slice(sourceMappingURL.indexOf(',') + 1);
    sourceMapData = bufferFrom(rawData, "base64").toString();
    sourceMappingURL = source;
  } else {
    // Support source map URLs relative to the source URL
    sourceMappingURL = supportRelativeURL(source, sourceMappingURL);
    sourceMapData = retrieveFile(sourceMappingURL);
  }

  if (!sourceMapData) {
    return null;
  }

  return {
    url: sourceMappingURL,
    map: sourceMapData
  };
});

function mapSourcePosition(position) {
  var sourceMap = sourceMapCache[position.source];
  if (!sourceMap) {
    // Call the (overrideable) retrieveSourceMap function to get the source map.
    var urlAndMap = retrieveSourceMap(position.source);
    if (urlAndMap) {
      sourceMap = sourceMapCache[position.source] = {
        url: urlAndMap.url,
        map: new SourceMapConsumer(urlAndMap.map)
      };

      // Load all sources stored inline with the source map into the file cache
      // to pretend like they are already loaded. They may not exist on disk.
      if (sourceMap.map.sourcesContent) {
        sourceMap.map.sources.forEach(function(source, i) {
          var contents = sourceMap.map.sourcesContent[i];
          if (contents) {
            var url = supportRelativeURL(sourceMap.url, source);
            fileContentsCache[url] = contents;
          }
        });
      }
    } else {
      sourceMap = sourceMapCache[position.source] = {
        url: null,
        map: null
      };
    }
  }

  // Resolve the source URL relative to the URL of the source map
  if (sourceMap && sourceMap.map && typeof sourceMap.map.originalPositionFor === 'function') {
    var originalPosition = sourceMap.map.originalPositionFor(position);

    // Only return the original position if a matching line was found. If no
    // matching line is found then we return position instead, which will cause
    // the stack trace to print the path and line for the compiled file. It is
    // better to give a precise location in the compiled file than a vague
    // location in the original file.
    if (originalPosition.source !== null) {
      originalPosition.source = supportRelativeURL(
        sourceMap.url, originalPosition.source);
      return originalPosition;
    }
  }

  return position;
}

// Parses code generated by FormatEvalOrigin(), a function inside V8:
// https://code.google.com/p/v8/source/browse/trunk/src/messages.js
function mapEvalOrigin(origin) {
  // Most eval() calls are in this format
  var match = /^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(origin);
  if (match) {
    var position = mapSourcePosition({
      source: match[2],
      line: +match[3],
      column: match[4] - 1
    });
    return 'eval at ' + match[1] + ' (' + position.source + ':' +
      position.line + ':' + (position.column + 1) + ')';
  }

  // Parse nested eval() calls using recursion
  match = /^eval at ([^(]+) \((.+)\)$/.exec(origin);
  if (match) {
    return 'eval at ' + match[1] + ' (' + mapEvalOrigin(match[2]) + ')';
  }

  // Make sure we still return useful information if we didn't find anything
  return origin;
}

// This is copied almost verbatim from the V8 source code at
// https://code.google.com/p/v8/source/browse/trunk/src/messages.js. The
// implementation of wrapCallSite() used to just forward to the actual source
// code of CallSite.prototype.toString but unfortunately a new release of V8
// did something to the prototype chain and broke the shim. The only fix I
// could find was copy/paste.
function CallSiteToString() {
  var fileName;
  var fileLocation = "";
  if (this.isNative()) {
    fileLocation = "native";
  } else {
    fileName = this.getScriptNameOrSourceURL();
    if (!fileName && this.isEval()) {
      fileLocation = this.getEvalOrigin();
      fileLocation += ", ";  // Expecting source position to follow.
    }

    if (fileName) {
      fileLocation += fileName;
    } else {
      // Source code does not originate from a file and is not native, but we
      // can still get the source position inside the source string, e.g. in
      // an eval string.
      fileLocation += "<anonymous>";
    }
    var lineNumber = this.getLineNumber();
    if (lineNumber != null) {
      fileLocation += ":" + lineNumber;
      var columnNumber = this.getColumnNumber();
      if (columnNumber) {
        fileLocation += ":" + columnNumber;
      }
    }
  }

  var line = "";
  var functionName = this.getFunctionName();
  var addSuffix = true;
  var isConstructor = this.isConstructor();
  var isMethodCall = !(this.isToplevel() || isConstructor);
  if (isMethodCall) {
    var typeName = this.getTypeName();
    // Fixes shim to be backward compatable with Node v0 to v4
    if (typeName === "[object Object]") {
      typeName = "null";
    }
    var methodName = this.getMethodName();
    if (functionName) {
      if (typeName && functionName.indexOf(typeName) != 0) {
        line += typeName + ".";
      }
      line += functionName;
      if (methodName && functionName.indexOf("." + methodName) != functionName.length - methodName.length - 1) {
        line += " [as " + methodName + "]";
      }
    } else {
      line += typeName + "." + (methodName || "<anonymous>");
    }
  } else if (isConstructor) {
    line += "new " + (functionName || "<anonymous>");
  } else if (functionName) {
    line += functionName;
  } else {
    line += fileLocation;
    addSuffix = false;
  }
  if (addSuffix) {
    line += " (" + fileLocation + ")";
  }
  return line;
}

function cloneCallSite(frame) {
  var object = {};
  Object.getOwnPropertyNames(Object.getPrototypeOf(frame)).forEach(function(name) {
    object[name] = /^(?:is|get)/.test(name) ? function() { return frame[name].call(frame); } : frame[name];
  });
  object.toString = CallSiteToString;
  return object;
}

function wrapCallSite(frame, state) {
  // provides interface backward compatibility
  if (state === undefined) {
    state = { nextPosition: null, curPosition: null }
  }
  if(frame.isNative()) {
    state.curPosition = null;
    return frame;
  }

  // Most call sites will return the source file from getFileName(), but code
  // passed to eval() ending in "//# sourceURL=..." will return the source file
  // from getScriptNameOrSourceURL() instead
  var source = frame.getFileName() || frame.getScriptNameOrSourceURL();
  if (source) {
    var line = frame.getLineNumber();
    var column = frame.getColumnNumber() - 1;

    // Fix position in Node where some (internal) code is prepended.
    // See https://github.com/evanw/node-source-map-support/issues/36
    // Header removed in node at ^10.16 || >=11.11.0
    // v11 is not an LTS candidate, we can just test the one version with it.
    // Test node versions for: 10.16-19, 10.20+, 12-19, 20-99, 100+, or 11.11
    var noHeader = /^v(10\.1[6-9]|10\.[2-9][0-9]|10\.[0-9]{3,}|1[2-9]\d*|[2-9]\d|\d{3,}|11\.11)/;
    var headerLength = noHeader.test(process.version) ? 0 : 62;
    if (line === 1 && column > headerLength && !isInBrowser() && !frame.isEval()) {
      column -= headerLength;
    }

    var position = mapSourcePosition({
      source: source,
      line: line,
      column: column
    });
    state.curPosition = position;
    frame = cloneCallSite(frame);
    var originalFunctionName = frame.getFunctionName;
    frame.getFunctionName = function() {
      if (state.nextPosition == null) {
        return originalFunctionName();
      }
      return state.nextPosition.name || originalFunctionName();
    };
    frame.getFileName = function() { return position.source; };
    frame.getLineNumber = function() { return position.line; };
    frame.getColumnNumber = function() { return position.column + 1; };
    frame.getScriptNameOrSourceURL = function() { return position.source; };
    return frame;
  }

  // Code called using eval() needs special handling
  var origin = frame.isEval() && frame.getEvalOrigin();
  if (origin) {
    origin = mapEvalOrigin(origin);
    frame = cloneCallSite(frame);
    frame.getEvalOrigin = function() { return origin; };
    return frame;
  }

  // If we get here then we were unable to change the source position
  return frame;
}

// This function is part of the V8 stack trace API, for more info see:
// https://v8.dev/docs/stack-trace-api
function prepareStackTrace(error, stack) {
  if (emptyCacheBetweenOperations) {
    fileContentsCache = {};
    sourceMapCache = {};
  }

  var name = error.name || 'Error';
  var message = error.message || '';
  var errorString = name + ": " + message;

  var state = { nextPosition: null, curPosition: null };
  var processedStack = [];
  for (var i = stack.length - 1; i >= 0; i--) {
    processedStack.push('\n    at ' + wrapCallSite(stack[i], state));
    state.nextPosition = state.curPosition;
  }
  state.curPosition = state.nextPosition = null;
  return errorString + processedStack.reverse().join('');
}

// Generate position and snippet of original source with pointer
function getErrorSource(error) {
  var match = /\n    at [^(]+ \((.*):(\d+):(\d+)\)/.exec(error.stack);
  if (match) {
    var source = match[1];
    var line = +match[2];
    var column = +match[3];

    // Support the inline sourceContents inside the source map
    var contents = fileContentsCache[source];

    // Support files on disk
    if (!contents && fs && fs.existsSync(source)) {
      try {
        contents = fs.readFileSync(source, 'utf8');
      } catch (er) {
        contents = '';
      }
    }

    // Format the line from the original source code like node does
    if (contents) {
      var code = contents.split(/(?:\r\n|\r|\n)/)[line - 1];
      if (code) {
        return source + ':' + line + '\n' + code + '\n' +
          new Array(column).join(' ') + '^';
      }
    }
  }
  return null;
}

function printErrorAndExit (error) {
  var source = getErrorSource(error);

  // Ensure error is printed synchronously and not truncated
  if (process.stderr._handle && process.stderr._handle.setBlocking) {
    process.stderr._handle.setBlocking(true);
  }

  if (source) {
    console.error();
    console.error(source);
  }

  console.error(error.stack);
  process.exit(1);
}

function shimEmitUncaughtException () {
  var origEmit = process.emit;

  process.emit = function (type) {
    if (type === 'uncaughtException') {
      var hasStack = (arguments[1] && arguments[1].stack);
      var hasListeners = (this.listeners(type).length > 0);

      if (hasStack && !hasListeners) {
        return printErrorAndExit(arguments[1]);
      }
    }

    return origEmit.apply(this, arguments);
  };
}

var originalRetrieveFileHandlers = retrieveFileHandlers.slice(0);
var originalRetrieveMapHandlers = retrieveMapHandlers.slice(0);

exports.wrapCallSite = wrapCallSite;
exports.getErrorSource = getErrorSource;
exports.mapSourcePosition = mapSourcePosition;
exports.retrieveSourceMap = retrieveSourceMap;

exports.install = function(options) {
  options = options || {};

  if (options.environment) {
    environment = options.environment;
    if (["node", "browser", "auto"].indexOf(environment) === -1) {
      throw new Error("environment " + environment + " was unknown. Available options are {auto, browser, node}")
    }
  }

  // Allow sources to be found by methods other than reading the files
  // directly from disk.
  if (options.retrieveFile) {
    if (options.overrideRetrieveFile) {
      retrieveFileHandlers.length = 0;
    }

    retrieveFileHandlers.unshift(options.retrieveFile);
  }

  // Allow source maps to be found by methods other than reading the files
  // directly from disk.
  if (options.retrieveSourceMap) {
    if (options.overrideRetrieveSourceMap) {
      retrieveMapHandlers.length = 0;
    }

    retrieveMapHandlers.unshift(options.retrieveSourceMap);
  }

  // Support runtime transpilers that include inline source maps
  if (options.hookRequire && !isInBrowser()) {
    // Use dynamicRequire to avoid including in browser bundles
    var Module = dynamicRequire(module, 'module');
    var $compile = Module.prototype._compile;

    if (!$compile.__sourceMapSupport) {
      Module.prototype._compile = function(content, filename) {
        fileContentsCache[filename] = content;
        sourceMapCache[filename] = undefined;
        return $compile.call(this, content, filename);
      };

      Module.prototype._compile.__sourceMapSupport = true;
    }
  }

  // Configure options
  if (!emptyCacheBetweenOperations) {
    emptyCacheBetweenOperations = 'emptyCacheBetweenOperations' in options ?
      options.emptyCacheBetweenOperations : false;
  }

  // Install the error reformatter
  if (!errorFormatterInstalled) {
    errorFormatterInstalled = true;
    Error.prepareStackTrace = prepareStackTrace;
  }

  if (!uncaughtShimInstalled) {
    var installHandler = 'handleUncaughtExceptions' in options ?
      options.handleUncaughtExceptions : true;

    // Do not override 'uncaughtException' with our own handler in Node.js
    // Worker threads. Workers pass the error to the main thread as an event,
    // rather than printing something to stderr and exiting.
    try {
      // We need to use `dynamicRequire` because `require` on it's own will be optimized by WebPack/Browserify.
      var worker_threads = dynamicRequire(module, 'worker_threads');
      if (worker_threads.isMainThread === false) {
        installHandler = false;
      }
    } catch(e) {}

    // Provide the option to not install the uncaught exception handler. This is
    // to support other uncaught exception handlers (in test frameworks, for
    // example). If this handler is not installed and there are no other uncaught
    // exception handlers, uncaught exceptions will be caught by node's built-in
    // exception handler and the process will still be terminated. However, the
    // generated JavaScript code will be shown above the stack trace instead of
    // the original source code.
    if (installHandler && hasGlobalProcessEventEmitter()) {
      uncaughtShimInstalled = true;
      shimEmitUncaughtException();
    }
  }
};

exports.resetRetrieveHandlers = function() {
  retrieveFileHandlers.length = 0;
  retrieveMapHandlers.length = 0;

  retrieveFileHandlers = originalRetrieveFileHandlers.slice(0);
  retrieveMapHandlers = originalRetrieveMapHandlers.slice(0);

  retrieveSourceMap = handlerExec(retrieveMapHandlers);
  retrieveFile = handlerExec(retrieveFileHandlers);
}

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
/*
Copyright spdx-correct.js contributors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
var parse = require('spdx-expression-parse')
var spdxLicenseIds = require('spdx-license-ids')

function valid (string) {
  try {
    parse(string)
    return true
  } catch (error) {
    return false
  }
}

// Common transpositions of license identifier acronyms
var transpositions = [
  ['APGL', 'AGPL'],
  ['Gpl', 'GPL'],
  ['GLP', 'GPL'],
  ['APL', 'Apache'],
  ['ISD', 'ISC'],
  ['GLP', 'GPL'],
  ['IST', 'ISC'],
  ['Claude', 'Clause'],
  [' or later', '+'],
  [' International', ''],
  ['GNU', 'GPL'],
  ['GUN', 'GPL'],
  ['+', ''],
  ['GNU GPL', 'GPL'],
  ['GNU/GPL', 'GPL'],
  ['GNU GLP', 'GPL'],
  ['GNU General Public License', 'GPL'],
  ['Gnu public license', 'GPL'],
  ['GNU Public License', 'GPL'],
  ['GNU GENERAL PUBLIC LICENSE', 'GPL'],
  ['MTI', 'MIT'],
  ['Mozilla Public License', 'MPL'],
  ['Universal Permissive License', 'UPL'],
  ['WTH', 'WTF'],
  ['-License', '']
]

var TRANSPOSED = 0
var CORRECT = 1

// Simple corrections to nearly valid identifiers.
var transforms = [
  // e.g. 'mit'
  function (argument) {
    return argument.toUpperCase()
  },
  // e.g. 'MIT '
  function (argument) {
    return argument.trim()
  },
  // e.g. 'M.I.T.'
  function (argument) {
    return argument.replace(/\./g, '')
  },
  // e.g. 'Apache- 2.0'
  function (argument) {
    return argument.replace(/\s+/g, '')
  },
  // e.g. 'CC BY 4.0''
  function (argument) {
    return argument.replace(/\s+/g, '-')
  },
  // e.g. 'LGPLv2.1'
  function (argument) {
    return argument.replace('v', '-')
  },
  // e.g. 'Apache 2.0'
  function (argument) {
    return argument.replace(/,?\s*(\d)/, '-$1')
  },
  // e.g. 'GPL 2'
  function (argument) {
    return argument.replace(/,?\s*(\d)/, '-$1.0')
  },
  // e.g. 'Apache Version 2.0'
  function (argument) {
    return argument
      .replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2')
  },
  // e.g. 'Apache Version 2'
  function (argument) {
    return argument
      .replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2.0')
  },
  // e.g. 'ZLIB'
  function (argument) {
    return argument[0].toUpperCase() + argument.slice(1)
  },
  // e.g. 'MPL/2.0'
  function (argument) {
    return argument.replace('/', '-')
  },
  // e.g. 'Apache 2'
  function (argument) {
    return argument
      .replace(/\s*V\s*(\d)/, '-$1')
      .replace(/(\d)$/, '$1.0')
  },
  // e.g. 'GPL-2.0', 'GPL-3.0'
  function (argument) {
    if (argument.indexOf('3.0') !== -1) {
      return argument + '-or-later'
    } else {
      return argument + '-only'
    }
  },
  // e.g. 'GPL-2.0-'
  function (argument) {
    return argument + 'only'
  },
  // e.g. 'GPL2'
  function (argument) {
    return argument.replace(/(\d)$/, '-$1.0')
  },
  // e.g. 'BSD 3'
  function (argument) {
    return argument.replace(/(-| )?(\d)$/, '-$2-Clause')
  },
  // e.g. 'BSD clause 3'
  function (argument) {
    return argument.replace(/(-| )clause(-| )(\d)/, '-$3-Clause')
  },
  // e.g. 'New BSD license'
  function (argument) {
    return argument.replace(/\b(Modified|New|Revised)(-| )?BSD((-| )License)?/i, 'BSD-3-Clause')
  },
  // e.g. 'Simplified BSD license'
  function (argument) {
    return argument.replace(/\bSimplified(-| )?BSD((-| )License)?/i, 'BSD-2-Clause')
  },
  // e.g. 'Free BSD license'
  function (argument) {
    return argument.replace(/\b(Free|Net)(-| )?BSD((-| )License)?/i, 'BSD-2-Clause-$1BSD')
  },
  // e.g. 'Clear BSD license'
  function (argument) {
    return argument.replace(/\bClear(-| )?BSD((-| )License)?/i, 'BSD-3-Clause-Clear')
  },
  // e.g. 'Old BSD License'
  function (argument) {
    return argument.replace(/\b(Old|Original)(-| )?BSD((-| )License)?/i, 'BSD-4-Clause')
  },
  // e.g. 'BY-NC-4.0'
  function (argument) {
    return 'CC-' + argument
  },
  // e.g. 'BY-NC'
  function (argument) {
    return 'CC-' + argument + '-4.0'
  },
  // e.g. 'Attribution-NonCommercial'
  function (argument) {
    return argument
      .replace('Attribution', 'BY')
      .replace('NonCommercial', 'NC')
      .replace('NoDerivatives', 'ND')
      .replace(/ (\d)/, '-$1')
      .replace(/ ?International/, '')
  },
  // e.g. 'Attribution-NonCommercial'
  function (argument) {
    return 'CC-' +
      argument
        .replace('Attribution', 'BY')
        .replace('NonCommercial', 'NC')
        .replace('NoDerivatives', 'ND')
        .replace(/ (\d)/, '-$1')
        .replace(/ ?International/, '') +
      '-4.0'
  }
]

var licensesWithVersions = spdxLicenseIds
  .map(function (id) {
    var match = /^(.*)-\d+\.\d+$/.exec(id)
    return match
      ? [match[0], match[1]]
      : [id, null]
  })
  .reduce(function (objectMap, item) {
    var key = item[1]
    objectMap[key] = objectMap[key] || []
    objectMap[key].push(item[0])
    return objectMap
  }, {})

var licensesWithOneVersion = Object.keys(licensesWithVersions)
  .map(function makeEntries (key) {
    return [key, licensesWithVersions[key]]
  })
  .filter(function identifySoleVersions (item) {
    return (
      // Licenses has just one valid version suffix.
      item[1].length === 1 &&
      item[0] !== null &&
      // APL will be considered Apache, rather than APL-1.0
      item[0] !== 'APL'
    )
  })
  .map(function createLastResorts (item) {
    return [item[0], item[1][0]]
  })

licensesWithVersions = undefined

// If all else fails, guess that strings containing certain substrings
// meant to identify certain licenses.
var lastResorts = [
  ['UNLI', 'Unlicense'],
  ['WTF', 'WTFPL'],
  ['2 CLAUSE', 'BSD-2-Clause'],
  ['2-CLAUSE', 'BSD-2-Clause'],
  ['3 CLAUSE', 'BSD-3-Clause'],
  ['3-CLAUSE', 'BSD-3-Clause'],
  ['AFFERO', 'AGPL-3.0-or-later'],
  ['AGPL', 'AGPL-3.0-or-later'],
  ['APACHE', 'Apache-2.0'],
  ['ARTISTIC', 'Artistic-2.0'],
  ['Affero', 'AGPL-3.0-or-later'],
  ['BEER', 'Beerware'],
  ['BOOST', 'BSL-1.0'],
  ['BSD', 'BSD-2-Clause'],
  ['CDDL', 'CDDL-1.1'],
  ['ECLIPSE', 'EPL-1.0'],
  ['FUCK', 'WTFPL'],
  ['GNU', 'GPL-3.0-or-later'],
  ['LGPL', 'LGPL-3.0-or-later'],
  ['GPLV1', 'GPL-1.0-only'],
  ['GPL-1', 'GPL-1.0-only'],
  ['GPLV2', 'GPL-2.0-only'],
  ['GPL-2', 'GPL-2.0-only'],
  ['GPL', 'GPL-3.0-or-later'],
  ['MIT +NO-FALSE-ATTRIBS', 'MITNFA'],
  ['MIT', 'MIT'],
  ['MPL', 'MPL-2.0'],
  ['X11', 'X11'],
  ['ZLIB', 'Zlib']
].concat(licensesWithOneVersion)

var SUBSTRING = 0
var IDENTIFIER = 1

var validTransformation = function (identifier) {
  for (var i = 0; i < transforms.length; i++) {
    var transformed = transforms[i](identifier).trim()
    if (transformed !== identifier && valid(transformed)) {
      return transformed
    }
  }
  return null
}

var validLastResort = function (identifier) {
  var upperCased = identifier.toUpperCase()
  for (var i = 0; i < lastResorts.length; i++) {
    var lastResort = lastResorts[i]
    if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) {
      return lastResort[IDENTIFIER]
    }
  }
  return null
}

var anyCorrection = function (identifier, check) {
  for (var i = 0; i < transpositions.length; i++) {
    var transposition = transpositions[i]
    var transposed = transposition[TRANSPOSED]
    if (identifier.indexOf(transposed) > -1) {
      var corrected = identifier.replace(
        transposed,
        transposition[CORRECT]
      )
      var checked = check(corrected)
      if (checked !== null) {
        return checked
      }
    }
  }
  return null
}

module.exports = function (identifier, options) {
  options = options || {}
  var upgrade = options.upgrade === undefined ? true : !!options.upgrade
  function postprocess (value) {
    return upgrade ? upgradeGPLs(value) : value
  }
  var validArugment = (
    typeof identifier === 'string' &&
    identifier.trim().length !== 0
  )
  if (!validArugment) {
    throw Error('Invalid argument. Expected non-empty string.')
  }
  identifier = identifier.trim()
  if (valid(identifier)) {
    return postprocess(identifier)
  }
  var noPlus = identifier.replace(/\+$/, '').trim()
  if (valid(noPlus)) {
    return postprocess(noPlus)
  }
  var transformed = validTransformation(identifier)
  if (transformed !== null) {
    return postprocess(transformed)
  }
  transformed = anyCorrection(identifier, function (argument) {
    if (valid(argument)) {
      return argument
    }
    return validTransformation(argument)
  })
  if (transformed !== null) {
    return postprocess(transformed)
  }
  transformed = validLastResort(identifier)
  if (transformed !== null) {
    return postprocess(transformed)
  }
  transformed = anyCorrection(identifier, validLastResort)
  if (transformed !== null) {
    return postprocess(transformed)
  }
  return null
}

function upgradeGPLs (value) {
  if ([
    'GPL-1.0', 'LGPL-1.0', 'AGPL-1.0',
    'GPL-2.0', 'LGPL-2.0', 'AGPL-2.0',
    'LGPL-2.1'
  ].indexOf(value) !== -1) {
    return value + '-only'
  } else if ([
    'GPL-1.0+', 'GPL-2.0+', 'GPL-3.0+',
    'LGPL-2.0+', 'LGPL-2.1+', 'LGPL-3.0+',
    'AGPL-1.0+', 'AGPL-3.0+'
  ].indexOf(value) !== -1) {
    return value.replace(/\+$/, '-or-later')
  } else if (['GPL-3.0', 'LGPL-3.0', 'AGPL-3.0'].indexOf(value) !== -1) {
    return value + '-or-later'
  } else {
    return value
  }
}
{
  "author": {
    "name": "Kyle E. Mitchell",
    "email": "kyle@kemitchell.com",
    "url": "https://kemitchell.com"
  },
  "dependencies": {
    "spdx-expression-parse": "^3.0.0",
    "spdx-license-ids": "^3.0.0"
  },
  "deprecated": false,
  "description": "correct invalid SPDX expressions",
  "devDependencies": {
    "defence-cli": "^2.0.1",
    "replace-require-self": "^1.0.0",
    "standard": "^11.0.0",
    "standard-markdown": "^4.0.2",
    "tape": "^4.9.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/jslicense/spdx-correct.js#readme",
  "license": "Apache-2.0",
  "name": "spdx-correct",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jslicense/spdx-correct.js.git"
  },
  "version": "3.1.1"
}[
  "389-exception",
  "Autoconf-exception-2.0",
  "Autoconf-exception-3.0",
  "Bison-exception-2.2",
  "Bootloader-exception",
  "Classpath-exception-2.0",
  "CLISP-exception-2.0",
  "DigiRule-FOSS-exception",
  "eCos-exception-2.0",
  "Fawkes-Runtime-exception",
  "FLTK-exception",
  "Font-exception-2.0",
  "freertos-exception-2.0",
  "GCC-exception-2.0",
  "GCC-exception-3.1",
  "gnu-javamail-exception",
  "GPL-3.0-linking-exception",
  "GPL-3.0-linking-source-exception",
  "GPL-CC-1.0",
  "i2p-gpl-java-exception",
  "Libtool-exception",
  "Linux-syscall-note",
  "LLVM-exception",
  "LZMA-exception",
  "mif-exception",
  "Nokia-Qt-exception-1.1",
  "OCaml-LGPL-linking-exception",
  "OCCT-exception-1.0",
  "OpenJDK-assembly-exception-1.0",
  "openvpn-openssl-exception",
  "PS-or-PDF-font-exception-20170817",
  "Qt-GPL-exception-1.0",
  "Qt-LGPL-exception-1.1",
  "Qwt-exception-1.0",
  "Swift-exception",
  "u-boot-exception-2.0",
  "Universal-FOSS-exception-1.0",
  "WxWindows-exception-3.1"
]
{
  "author": {
    "name": "The Linux Foundation"
  },
  "deprecated": false,
  "description": "list of SPDX standard license exceptions",
  "files": [
    "index.json"
  ],
  "homepage": "https://github.com/kemitchell/spdx-exceptions.json#readme",
  "license": "CC-BY-3.0",
  "name": "spdx-exceptions",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/kemitchell/spdx-exceptions.json.git"
  },
  "version": "2.3.0"
}C. Scott Ananian <cscott@cscott.net> (http://cscott.net)
Kyle E. Mitchell <kyle@kemitchell.com> (https://kemitchell.com)
Shinnosuke Watanabe <snnskwtnb@gmail.com>
Antoine Motet <antoine.motet@gmail.com>
The MIT License

Copyright (c) 2015 Kyle E. Mitchell & other authors listed in AUTHORS

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict'

var scan = require('./scan')
var parse = require('./parse')

module.exports = function (source) {
  return parse(scan(source))
}
{
  "author": {
    "name": "Kyle E. Mitchell",
    "email": "kyle@kemitchell.com",
    "url": "https://kemitchell.com"
  },
  "dependencies": {
    "spdx-exceptions": "^2.1.0",
    "spdx-license-ids": "^3.0.0"
  },
  "deprecated": false,
  "description": "parse SPDX license expressions",
  "devDependencies": {
    "defence-cli": "^3.0.1",
    "replace-require-self": "^1.0.0",
    "standard": "^14.1.0"
  },
  "files": [
    "AUTHORS",
    "index.js",
    "parse.js",
    "scan.js"
  ],
  "homepage": "https://github.com/jslicense/spdx-expression-parse.js#readme",
  "license": "MIT",
  "name": "spdx-expression-parse",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jslicense/spdx-expression-parse.js.git"
  },
  "version": "3.0.1"
}'use strict'

// The ABNF grammar in the spec is totally ambiguous.
//
// This parser follows the operator precedence defined in the
// `Order of Precedence and Parentheses` section.

module.exports = function (tokens) {
  var index = 0

  function hasMore () {
    return index < tokens.length
  }

  function token () {
    return hasMore() ? tokens[index] : null
  }

  function next () {
    if (!hasMore()) {
      throw new Error()
    }
    index++
  }

  function parseOperator (operator) {
    var t = token()
    if (t && t.type === 'OPERATOR' && operator === t.string) {
      next()
      return t.string
    }
  }

  function parseWith () {
    if (parseOperator('WITH')) {
      var t = token()
      if (t && t.type === 'EXCEPTION') {
        next()
        return t.string
      }
      throw new Error('Expected exception after `WITH`')
    }
  }

  function parseLicenseRef () {
    // TODO: Actually, everything is concatenated into one string
    // for backward-compatibility but it could be better to return
    // a nice structure.
    var begin = index
    var string = ''
    var t = token()
    if (t.type === 'DOCUMENTREF') {
      next()
      string += 'DocumentRef-' + t.string + ':'
      if (!parseOperator(':')) {
        throw new Error('Expected `:` after `DocumentRef-...`')
      }
    }
    t = token()
    if (t.type === 'LICENSEREF') {
      next()
      string += 'LicenseRef-' + t.string
      return { license: string }
    }
    index = begin
  }

  function parseLicense () {
    var t = token()
    if (t && t.type === 'LICENSE') {
      next()
      var node = { license: t.string }
      if (parseOperator('+')) {
        node.plus = true
      }
      var exception = parseWith()
      if (exception) {
        node.exception = exception
      }
      return node
    }
  }

  function parseParenthesizedExpression () {
    var left = parseOperator('(')
    if (!left) {
      return
    }

    var expr = parseExpression()

    if (!parseOperator(')')) {
      throw new Error('Expected `)`')
    }

    return expr
  }

  function parseAtom () {
    return (
      parseParenthesizedExpression() ||
      parseLicenseRef() ||
      parseLicense()
    )
  }

  function makeBinaryOpParser (operator, nextParser) {
    return function parseBinaryOp () {
      var left = nextParser()
      if (!left) {
        return
      }

      if (!parseOperator(operator)) {
        return left
      }

      var right = parseBinaryOp()
      if (!right) {
        throw new Error('Expected expression')
      }
      return {
        left: left,
        conjunction: operator.toLowerCase(),
        right: right
      }
    }
  }

  var parseAnd = makeBinaryOpParser('AND', parseAtom)
  var parseExpression = makeBinaryOpParser('OR', parseAnd)

  var node = parseExpression()
  if (!node || hasMore()) {
    throw new Error('Syntax error')
  }
  return node
}
'use strict'

var licenses = []
  .concat(require('spdx-license-ids'))
  .concat(require('spdx-license-ids/deprecated'))
var exceptions = require('spdx-exceptions')

module.exports = function (source) {
  var index = 0

  function hasMore () {
    return index < source.length
  }

  // `value` can be a regexp or a string.
  // If it is recognized, the matching source string is returned and
  // the index is incremented. Otherwise `undefined` is returned.
  function read (value) {
    if (value instanceof RegExp) {
      var chars = source.slice(index)
      var match = chars.match(value)
      if (match) {
        index += match[0].length
        return match[0]
      }
    } else {
      if (source.indexOf(value, index) === index) {
        index += value.length
        return value
      }
    }
  }

  function skipWhitespace () {
    read(/[ ]*/)
  }

  function operator () {
    var string
    var possibilities = ['WITH', 'AND', 'OR', '(', ')', ':', '+']
    for (var i = 0; i < possibilities.length; i++) {
      string = read(possibilities[i])
      if (string) {
        break
      }
    }

    if (string === '+' && index > 1 && source[index - 2] === ' ') {
      throw new Error('Space before `+`')
    }

    return string && {
      type: 'OPERATOR',
      string: string
    }
  }

  function idstring () {
    return read(/[A-Za-z0-9-.]+/)
  }

  function expectIdstring () {
    var string = idstring()
    if (!string) {
      throw new Error('Expected idstring at offset ' + index)
    }
    return string
  }

  function documentRef () {
    if (read('DocumentRef-')) {
      var string = expectIdstring()
      return { type: 'DOCUMENTREF', string: string }
    }
  }

  function licenseRef () {
    if (read('LicenseRef-')) {
      var string = expectIdstring()
      return { type: 'LICENSEREF', string: string }
    }
  }

  function identifier () {
    var begin = index
    var string = idstring()

    if (licenses.indexOf(string) !== -1) {
      return {
        type: 'LICENSE',
        string: string
      }
    } else if (exceptions.indexOf(string) !== -1) {
      return {
        type: 'EXCEPTION',
        string: string
      }
    }

    index = begin
  }

  // Tries to read the next token. Returns `undefined` if no token is
  // recognized.
  function parseToken () {
    // Ordering matters
    return (
      operator() ||
      documentRef() ||
      licenseRef() ||
      identifier()
    )
  }

  var tokens = []
  while (hasMore()) {
    skipWhitespace()
    if (!hasMore()) {
      break
    }

    var token = parseToken()
    if (!token) {
      throw new Error('Unexpected `' + source[index] +
                      '` at offset ' + index)
    }

    tokens.push(token)
  }
  return tokens
}
[
	"AGPL-1.0",
	"AGPL-3.0",
	"BSD-2-Clause-FreeBSD",
	"BSD-2-Clause-NetBSD",
	"GFDL-1.1",
	"GFDL-1.2",
	"GFDL-1.3",
	"GPL-1.0",
	"GPL-2.0",
	"GPL-2.0-with-GCC-exception",
	"GPL-2.0-with-autoconf-exception",
	"GPL-2.0-with-bison-exception",
	"GPL-2.0-with-classpath-exception",
	"GPL-2.0-with-font-exception",
	"GPL-3.0",
	"GPL-3.0-with-GCC-exception",
	"GPL-3.0-with-autoconf-exception",
	"LGPL-2.0",
	"LGPL-2.1",
	"LGPL-3.0",
	"Nunit",
	"StandardML-NJ",
	"eCos-2.0",
	"wxWindows"
]
[
	"0BSD",
	"AAL",
	"ADSL",
	"AFL-1.1",
	"AFL-1.2",
	"AFL-2.0",
	"AFL-2.1",
	"AFL-3.0",
	"AGPL-1.0-only",
	"AGPL-1.0-or-later",
	"AGPL-3.0-only",
	"AGPL-3.0-or-later",
	"AMDPLPA",
	"AML",
	"AMPAS",
	"ANTLR-PD",
	"APAFML",
	"APL-1.0",
	"APSL-1.0",
	"APSL-1.1",
	"APSL-1.2",
	"APSL-2.0",
	"Abstyles",
	"Adobe-2006",
	"Adobe-Glyph",
	"Afmparse",
	"Aladdin",
	"Apache-1.0",
	"Apache-1.1",
	"Apache-2.0",
	"Artistic-1.0",
	"Artistic-1.0-Perl",
	"Artistic-1.0-cl8",
	"Artistic-2.0",
	"BSD-1-Clause",
	"BSD-2-Clause",
	"BSD-2-Clause-Patent",
	"BSD-2-Clause-Views",
	"BSD-3-Clause",
	"BSD-3-Clause-Attribution",
	"BSD-3-Clause-Clear",
	"BSD-3-Clause-LBNL",
	"BSD-3-Clause-No-Nuclear-License",
	"BSD-3-Clause-No-Nuclear-License-2014",
	"BSD-3-Clause-No-Nuclear-Warranty",
	"BSD-3-Clause-Open-MPI",
	"BSD-4-Clause",
	"BSD-4-Clause-UC",
	"BSD-Protection",
	"BSD-Source-Code",
	"BSL-1.0",
	"Bahyph",
	"Barr",
	"Beerware",
	"BitTorrent-1.0",
	"BitTorrent-1.1",
	"BlueOak-1.0.0",
	"Borceux",
	"CAL-1.0",
	"CAL-1.0-Combined-Work-Exception",
	"CATOSL-1.1",
	"CC-BY-1.0",
	"CC-BY-2.0",
	"CC-BY-2.5",
	"CC-BY-3.0",
	"CC-BY-3.0-AT",
	"CC-BY-4.0",
	"CC-BY-NC-1.0",
	"CC-BY-NC-2.0",
	"CC-BY-NC-2.5",
	"CC-BY-NC-3.0",
	"CC-BY-NC-4.0",
	"CC-BY-NC-ND-1.0",
	"CC-BY-NC-ND-2.0",
	"CC-BY-NC-ND-2.5",
	"CC-BY-NC-ND-3.0",
	"CC-BY-NC-ND-3.0-IGO",
	"CC-BY-NC-ND-4.0",
	"CC-BY-NC-SA-1.0",
	"CC-BY-NC-SA-2.0",
	"CC-BY-NC-SA-2.5",
	"CC-BY-NC-SA-3.0",
	"CC-BY-NC-SA-4.0",
	"CC-BY-ND-1.0",
	"CC-BY-ND-2.0",
	"CC-BY-ND-2.5",
	"CC-BY-ND-3.0",
	"CC-BY-ND-4.0",
	"CC-BY-SA-1.0",
	"CC-BY-SA-2.0",
	"CC-BY-SA-2.5",
	"CC-BY-SA-3.0",
	"CC-BY-SA-3.0-AT",
	"CC-BY-SA-4.0",
	"CC-PDDC",
	"CC0-1.0",
	"CDDL-1.0",
	"CDDL-1.1",
	"CDLA-Permissive-1.0",
	"CDLA-Sharing-1.0",
	"CECILL-1.0",
	"CECILL-1.1",
	"CECILL-2.0",
	"CECILL-2.1",
	"CECILL-B",
	"CECILL-C",
	"CERN-OHL-1.1",
	"CERN-OHL-1.2",
	"CERN-OHL-P-2.0",
	"CERN-OHL-S-2.0",
	"CERN-OHL-W-2.0",
	"CNRI-Jython",
	"CNRI-Python",
	"CNRI-Python-GPL-Compatible",
	"CPAL-1.0",
	"CPL-1.0",
	"CPOL-1.02",
	"CUA-OPL-1.0",
	"Caldera",
	"ClArtistic",
	"Condor-1.1",
	"Crossword",
	"CrystalStacker",
	"Cube",
	"D-FSL-1.0",
	"DOC",
	"DSDP",
	"Dotseqn",
	"ECL-1.0",
	"ECL-2.0",
	"EFL-1.0",
	"EFL-2.0",
	"EPICS",
	"EPL-1.0",
	"EPL-2.0",
	"EUDatagrid",
	"EUPL-1.0",
	"EUPL-1.1",
	"EUPL-1.2",
	"Entessa",
	"ErlPL-1.1",
	"Eurosym",
	"FSFAP",
	"FSFUL",
	"FSFULLR",
	"FTL",
	"Fair",
	"Frameworx-1.0",
	"FreeImage",
	"GFDL-1.1-invariants-only",
	"GFDL-1.1-invariants-or-later",
	"GFDL-1.1-no-invariants-only",
	"GFDL-1.1-no-invariants-or-later",
	"GFDL-1.1-only",
	"GFDL-1.1-or-later",
	"GFDL-1.2-invariants-only",
	"GFDL-1.2-invariants-or-later",
	"GFDL-1.2-no-invariants-only",
	"GFDL-1.2-no-invariants-or-later",
	"GFDL-1.2-only",
	"GFDL-1.2-or-later",
	"GFDL-1.3-invariants-only",
	"GFDL-1.3-invariants-or-later",
	"GFDL-1.3-no-invariants-only",
	"GFDL-1.3-no-invariants-or-later",
	"GFDL-1.3-only",
	"GFDL-1.3-or-later",
	"GL2PS",
	"GLWTPL",
	"GPL-1.0-only",
	"GPL-1.0-or-later",
	"GPL-2.0-only",
	"GPL-2.0-or-later",
	"GPL-3.0-only",
	"GPL-3.0-or-later",
	"Giftware",
	"Glide",
	"Glulxe",
	"HPND",
	"HPND-sell-variant",
	"HaskellReport",
	"Hippocratic-2.1",
	"IBM-pibs",
	"ICU",
	"IJG",
	"IPA",
	"IPL-1.0",
	"ISC",
	"ImageMagick",
	"Imlib2",
	"Info-ZIP",
	"Intel",
	"Intel-ACPI",
	"Interbase-1.0",
	"JPNIC",
	"JSON",
	"JasPer-2.0",
	"LAL-1.2",
	"LAL-1.3",
	"LGPL-2.0-only",
	"LGPL-2.0-or-later",
	"LGPL-2.1-only",
	"LGPL-2.1-or-later",
	"LGPL-3.0-only",
	"LGPL-3.0-or-later",
	"LGPLLR",
	"LPL-1.0",
	"LPL-1.02",
	"LPPL-1.0",
	"LPPL-1.1",
	"LPPL-1.2",
	"LPPL-1.3a",
	"LPPL-1.3c",
	"Latex2e",
	"Leptonica",
	"LiLiQ-P-1.1",
	"LiLiQ-R-1.1",
	"LiLiQ-Rplus-1.1",
	"Libpng",
	"Linux-OpenIB",
	"MIT",
	"MIT-0",
	"MIT-CMU",
	"MIT-advertising",
	"MIT-enna",
	"MIT-feh",
	"MITNFA",
	"MPL-1.0",
	"MPL-1.1",
	"MPL-2.0",
	"MPL-2.0-no-copyleft-exception",
	"MS-PL",
	"MS-RL",
	"MTLL",
	"MakeIndex",
	"MirOS",
	"Motosoto",
	"MulanPSL-1.0",
	"MulanPSL-2.0",
	"Multics",
	"Mup",
	"NASA-1.3",
	"NBPL-1.0",
	"NCGL-UK-2.0",
	"NCSA",
	"NGPL",
	"NIST-PD",
	"NIST-PD-fallback",
	"NLOD-1.0",
	"NLPL",
	"NOSL",
	"NPL-1.0",
	"NPL-1.1",
	"NPOSL-3.0",
	"NRL",
	"NTP",
	"NTP-0",
	"Naumen",
	"Net-SNMP",
	"NetCDF",
	"Newsletr",
	"Nokia",
	"Noweb",
	"O-UDA-1.0",
	"OCCT-PL",
	"OCLC-2.0",
	"ODC-By-1.0",
	"ODbL-1.0",
	"OFL-1.0",
	"OFL-1.0-RFN",
	"OFL-1.0-no-RFN",
	"OFL-1.1",
	"OFL-1.1-RFN",
	"OFL-1.1-no-RFN",
	"OGC-1.0",
	"OGL-Canada-2.0",
	"OGL-UK-1.0",
	"OGL-UK-2.0",
	"OGL-UK-3.0",
	"OGTSL",
	"OLDAP-1.1",
	"OLDAP-1.2",
	"OLDAP-1.3",
	"OLDAP-1.4",
	"OLDAP-2.0",
	"OLDAP-2.0.1",
	"OLDAP-2.1",
	"OLDAP-2.2",
	"OLDAP-2.2.1",
	"OLDAP-2.2.2",
	"OLDAP-2.3",
	"OLDAP-2.4",
	"OLDAP-2.5",
	"OLDAP-2.6",
	"OLDAP-2.7",
	"OLDAP-2.8",
	"OML",
	"OPL-1.0",
	"OSET-PL-2.1",
	"OSL-1.0",
	"OSL-1.1",
	"OSL-2.0",
	"OSL-2.1",
	"OSL-3.0",
	"OpenSSL",
	"PDDL-1.0",
	"PHP-3.0",
	"PHP-3.01",
	"PSF-2.0",
	"Parity-6.0.0",
	"Parity-7.0.0",
	"Plexus",
	"PolyForm-Noncommercial-1.0.0",
	"PolyForm-Small-Business-1.0.0",
	"PostgreSQL",
	"Python-2.0",
	"QPL-1.0",
	"Qhull",
	"RHeCos-1.1",
	"RPL-1.1",
	"RPL-1.5",
	"RPSL-1.0",
	"RSA-MD",
	"RSCPL",
	"Rdisc",
	"Ruby",
	"SAX-PD",
	"SCEA",
	"SGI-B-1.0",
	"SGI-B-1.1",
	"SGI-B-2.0",
	"SHL-0.5",
	"SHL-0.51",
	"SISSL",
	"SISSL-1.2",
	"SMLNJ",
	"SMPPL",
	"SNIA",
	"SPL-1.0",
	"SSH-OpenSSH",
	"SSH-short",
	"SSPL-1.0",
	"SWL",
	"Saxpath",
	"Sendmail",
	"Sendmail-8.23",
	"SimPL-2.0",
	"Sleepycat",
	"Spencer-86",
	"Spencer-94",
	"Spencer-99",
	"SugarCRM-1.1.3",
	"TAPR-OHL-1.0",
	"TCL",
	"TCP-wrappers",
	"TMate",
	"TORQUE-1.1",
	"TOSL",
	"TU-Berlin-1.0",
	"TU-Berlin-2.0",
	"UCL-1.0",
	"UPL-1.0",
	"Unicode-DFS-2015",
	"Unicode-DFS-2016",
	"Unicode-TOU",
	"Unlicense",
	"VOSTROM",
	"VSL-1.0",
	"Vim",
	"W3C",
	"W3C-19980720",
	"W3C-20150513",
	"WTFPL",
	"Watcom-1.0",
	"Wsuipa",
	"X11",
	"XFree86-1.1",
	"XSkat",
	"Xerox",
	"Xnet",
	"YPL-1.0",
	"YPL-1.1",
	"ZPL-1.1",
	"ZPL-2.0",
	"ZPL-2.1",
	"Zed",
	"Zend-2.0",
	"Zimbra-1.3",
	"Zimbra-1.4",
	"Zlib",
	"blessing",
	"bzip2-1.0.5",
	"bzip2-1.0.6",
	"copyleft-next-0.3.0",
	"copyleft-next-0.3.1",
	"curl",
	"diffmark",
	"dvipdfm",
	"eGenix",
	"etalab-2.0",
	"gSOAP-1.3b",
	"gnuplot",
	"iMatix",
	"libpng-2.0",
	"libselinux-1.0",
	"libtiff",
	"mpich2",
	"psfrag",
	"psutils",
	"xinetd",
	"xpp",
	"zlib-acknowledgement"
]
{
  "author": {
    "name": "Shinnosuke Watanabe",
    "url": "https://github.com/shinnn"
  },
  "deprecated": false,
  "description": "A list of SPDX license identifiers",
  "devDependencies": {
    "@shinnn/eslint-config": "^6.8.7",
    "chalk": "^2.4.1",
    "eslint": "^5.10.0",
    "get-spdx-license-ids": "^2.1.0",
    "rmfr": "^2.0.0",
    "tape": "^4.9.1"
  },
  "files": [
    "deprecated.json",
    "index.json"
  ],
  "homepage": "https://github.com/jslicense/spdx-license-ids#readme",
  "license": "CC0-1.0",
  "name": "spdx-license-ids",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jslicense/spdx-license-ids.git"
  },
  "version": "3.0.6"
}Copyright (c) 2007-2014, Alexandru Marasteanu <hello [at) alexei (dot] ro>
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
  notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
  notice, this list of conditions and the following disclaimer in the
  documentation and/or other materials provided with the distribution.
* Neither the name of this software nor the names of its contributors may be
  used to endorse or promote products derived from this software without
  specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
  "name": "sprintf",
  "description": "JavaScript sprintf implementation",
  "version": "1.0.3",
  "main": "src/sprintf.js",
  "license": "BSD-3-Clause-Clear",
  "keywords": ["sprintf", "string", "formatting"],
  "authors": ["Alexandru Marasteanu <hello@alexei.ro> (http://alexei.ro/)"],
  "homepage": "https://github.com/alexei/sprintf.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/alexei/sprintf.js.git"
  }
}
module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON("package.json"),

        uglify: {
            options: {
                banner: "/*! <%= pkg.name %> | <%= pkg.author %> | <%= pkg.license %> */\n",
                sourceMap: true
            },
            build: {
                files: [
                    {
                        src: "src/sprintf.js",
                        dest: "dist/sprintf.min.js"
                    },
                    {
                        src: "src/angular-sprintf.js",
                        dest: "dist/angular-sprintf.min.js"
                    }
                ]
            }
        },

        watch: {
            js: {
                files: "src/*.js",
                tasks: ["uglify"]
            }
        }
    })

    grunt.loadNpmTasks("grunt-contrib-uglify")
    grunt.loadNpmTasks("grunt-contrib-watch")

    grunt.registerTask("default", ["uglify", "watch"])
}
{
  "author": {
    "name": "Alexandru Marasteanu",
    "email": "hello@alexei.ro",
    "url": "http://alexei.ro/"
  },
  "deprecated": false,
  "description": "JavaScript sprintf implementation",
  "devDependencies": {
    "grunt": "*",
    "grunt-contrib-uglify": "*",
    "grunt-contrib-watch": "*",
    "mocha": "*"
  },
  "homepage": "https://github.com/alexei/sprintf.js#readme",
  "license": "BSD-3-Clause",
  "main": "src/sprintf.js",
  "name": "sprintf-js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/alexei/sprintf.js.git"
  },
  "version": "1.0.3"
}angular.
    module("sprintf", []).
    filter("sprintf", function() {
        return function() {
            return sprintf.apply(null, arguments)
        }
    }).
    filter("fmt", ["$filter", function($filter) {
        return $filter("sprintf")
    }]).
    filter("vsprintf", function() {
        return function(format, argv) {
            return vsprintf(format, argv)
        }
    }).
    filter("vfmt", ["$filter", function($filter) {
        return $filter("vsprintf")
    }])
(function(window) {
    var re = {
        not_string: /[^s]/,
        number: /[diefg]/,
        json: /[j]/,
        not_json: /[^j]/,
        text: /^[^\x25]+/,
        modulo: /^\x25{2}/,
        placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijosuxX])/,
        key: /^([a-z_][a-z_\d]*)/i,
        key_access: /^\.([a-z_][a-z_\d]*)/i,
        index_access: /^\[(\d+)\]/,
        sign: /^[\+\-]/
    }

    function sprintf() {
        var key = arguments[0], cache = sprintf.cache
        if (!(cache[key] && cache.hasOwnProperty(key))) {
            cache[key] = sprintf.parse(key)
        }
        return sprintf.format.call(null, cache[key], arguments)
    }

    sprintf.format = function(parse_tree, argv) {
        var cursor = 1, tree_length = parse_tree.length, node_type = "", arg, output = [], i, k, match, pad, pad_character, pad_length, is_positive = true, sign = ""
        for (i = 0; i < tree_length; i++) {
            node_type = get_type(parse_tree[i])
            if (node_type === "string") {
                output[output.length] = parse_tree[i]
            }
            else if (node_type === "array") {
                match = parse_tree[i] // convenience purposes only
                if (match[2]) { // keyword argument
                    arg = argv[cursor]
                    for (k = 0; k < match[2].length; k++) {
                        if (!arg.hasOwnProperty(match[2][k])) {
                            throw new Error(sprintf("[sprintf] property '%s' does not exist", match[2][k]))
                        }
                        arg = arg[match[2][k]]
                    }
                }
                else if (match[1]) { // positional argument (explicit)
                    arg = argv[match[1]]
                }
                else { // positional argument (implicit)
                    arg = argv[cursor++]
                }

                if (get_type(arg) == "function") {
                    arg = arg()
                }

                if (re.not_string.test(match[8]) && re.not_json.test(match[8]) && (get_type(arg) != "number" && isNaN(arg))) {
                    throw new TypeError(sprintf("[sprintf] expecting number but found %s", get_type(arg)))
                }

                if (re.number.test(match[8])) {
                    is_positive = arg >= 0
                }

                switch (match[8]) {
                    case "b":
                        arg = arg.toString(2)
                    break
                    case "c":
                        arg = String.fromCharCode(arg)
                    break
                    case "d":
                    case "i":
                        arg = parseInt(arg, 10)
                    break
                    case "j":
                        arg = JSON.stringify(arg, null, match[6] ? parseInt(match[6]) : 0)
                    break
                    case "e":
                        arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential()
                    break
                    case "f":
                        arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg)
                    break
                    case "g":
                        arg = match[7] ? parseFloat(arg).toPrecision(match[7]) : parseFloat(arg)
                    break
                    case "o":
                        arg = arg.toString(8)
                    break
                    case "s":
                        arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg)
                    break
                    case "u":
                        arg = arg >>> 0
                    break
                    case "x":
                        arg = arg.toString(16)
                    break
                    case "X":
                        arg = arg.toString(16).toUpperCase()
                    break
                }
                if (re.json.test(match[8])) {
                    output[output.length] = arg
                }
                else {
                    if (re.number.test(match[8]) && (!is_positive || match[3])) {
                        sign = is_positive ? "+" : "-"
                        arg = arg.toString().replace(re.sign, "")
                    }
                    else {
                        sign = ""
                    }
                    pad_character = match[4] ? match[4] === "0" ? "0" : match[4].charAt(1) : " "
                    pad_length = match[6] - (sign + arg).length
                    pad = match[6] ? (pad_length > 0 ? str_repeat(pad_character, pad_length) : "") : ""
                    output[output.length] = match[5] ? sign + arg + pad : (pad_character === "0" ? sign + pad + arg : pad + sign + arg)
                }
            }
        }
        return output.join("")
    }

    sprintf.cache = {}

    sprintf.parse = function(fmt) {
        var _fmt = fmt, match = [], parse_tree = [], arg_names = 0
        while (_fmt) {
            if ((match = re.text.exec(_fmt)) !== null) {
                parse_tree[parse_tree.length] = match[0]
            }
            else if ((match = re.modulo.exec(_fmt)) !== null) {
                parse_tree[parse_tree.length] = "%"
            }
            else if ((match = re.placeholder.exec(_fmt)) !== null) {
                if (match[2]) {
                    arg_names |= 1
                    var field_list = [], replacement_field = match[2], field_match = []
                    if ((field_match = re.key.exec(replacement_field)) !== null) {
                        field_list[field_list.length] = field_match[1]
                        while ((replacement_field = replacement_field.substring(field_match[0].length)) !== "") {
                            if ((field_match = re.key_access.exec(replacement_field)) !== null) {
                                field_list[field_list.length] = field_match[1]
                            }
                            else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
                                field_list[field_list.length] = field_match[1]
                            }
                            else {
                                throw new SyntaxError("[sprintf] failed to parse named argument key")
                            }
                        }
                    }
                    else {
                        throw new SyntaxError("[sprintf] failed to parse named argument key")
                    }
                    match[2] = field_list
                }
                else {
                    arg_names |= 2
                }
                if (arg_names === 3) {
                    throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported")
                }
                parse_tree[parse_tree.length] = match
            }
            else {
                throw new SyntaxError("[sprintf] unexpected placeholder")
            }
            _fmt = _fmt.substring(match[0].length)
        }
        return parse_tree
    }

    var vsprintf = function(fmt, argv, _argv) {
        _argv = (argv || []).slice(0)
        _argv.splice(0, 0, fmt)
        return sprintf.apply(null, _argv)
    }

    /**
     * helpers
     */
    function get_type(variable) {
        return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase()
    }

    function str_repeat(input, multiplier) {
        return Array(multiplier + 1).join(input)
    }

    /**
     * export to either browser or node.js
     */
    if (typeof exports !== "undefined") {
        exports.sprintf = sprintf
        exports.vsprintf = vsprintf
    }
    else {
        window.sprintf = sprintf
        window.vsprintf = vsprintf

        if (typeof define === "function" && define.amd) {
            define(function() {
                return {
                    sprintf: sprintf,
                    vsprintf: vsprintf
                }
            })
        }
    }
})(typeof window === "undefined" ? this : window);
/*! sprintf-js | Alexandru Marasteanu <hello@alexei.ro> (http://alexei.ro/) | BSD-3-Clause */

angular.module("sprintf",[]).filter("sprintf",function(){return function(){return sprintf.apply(null,arguments)}}).filter("fmt",["$filter",function(a){return a("sprintf")}]).filter("vsprintf",function(){return function(a,b){return vsprintf(a,b)}}).filter("vfmt",["$filter",function(a){return a("vsprintf")}]);
//# sourceMappingURL=angular-sprintf.min.map{"version":3,"file":"angular-sprintf.min.js","sources":["../src/angular-sprintf.js"],"names":["angular","module","filter","sprintf","apply","arguments","$filter","format","argv","vsprintf"],"mappings":";;AAAAA,QACIC,OAAO,cACPC,OAAO,UAAW,WACd,MAAO,YACH,MAAOC,SAAQC,MAAM,KAAMC,cAGnCH,OAAO,OAAQ,UAAW,SAASI,GAC/B,MAAOA,GAAQ,cAEnBJ,OAAO,WAAY,WACf,MAAO,UAASK,EAAQC,GACpB,MAAOC,UAASF,EAAQC,MAGhCN,OAAO,QAAS,UAAW,SAASI,GAChC,MAAOA,GAAQ"}{"version":3,"file":"angular-sprintf.min.js","sources":["../src/angular-sprintf.js"],"names":["angular","module","filter","sprintf","apply","arguments","$filter","format","argv","vsprintf"],"mappings":";;AAAAA,QACIC,OAAO,cACPC,OAAO,UAAW,WACd,MAAO,YACH,MAAOC,SAAQC,MAAM,KAAMC,cAGnCH,OAAO,OAAQ,UAAW,SAASI,GAC/B,MAAOA,GAAQ,cAEnBJ,OAAO,WAAY,WACf,MAAO,UAASK,EAAQC,GACpB,MAAOC,UAASF,EAAQC,MAGhCN,OAAO,QAAS,UAAW,SAASI,GAChC,MAAOA,GAAQ"}/*! sprintf-js | Alexandru Marasteanu <hello@alexei.ro> (http://alexei.ro/) | BSD-3-Clause */

!function(a){function b(){var a=arguments[0],c=b.cache;return c[a]&&c.hasOwnProperty(a)||(c[a]=b.parse(a)),b.format.call(null,c[a],arguments)}function c(a){return Object.prototype.toString.call(a).slice(8,-1).toLowerCase()}function d(a,b){return Array(b+1).join(a)}var e={not_string:/[^s]/,number:/[diefg]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijosuxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[\+\-]/};b.format=function(a,f){var g,h,i,j,k,l,m,n=1,o=a.length,p="",q=[],r=!0,s="";for(h=0;o>h;h++)if(p=c(a[h]),"string"===p)q[q.length]=a[h];else if("array"===p){if(j=a[h],j[2])for(g=f[n],i=0;i<j[2].length;i++){if(!g.hasOwnProperty(j[2][i]))throw new Error(b("[sprintf] property '%s' does not exist",j[2][i]));g=g[j[2][i]]}else g=j[1]?f[j[1]]:f[n++];if("function"==c(g)&&(g=g()),e.not_string.test(j[8])&&e.not_json.test(j[8])&&"number"!=c(g)&&isNaN(g))throw new TypeError(b("[sprintf] expecting number but found %s",c(g)));switch(e.number.test(j[8])&&(r=g>=0),j[8]){case"b":g=g.toString(2);break;case"c":g=String.fromCharCode(g);break;case"d":case"i":g=parseInt(g,10);break;case"j":g=JSON.stringify(g,null,j[6]?parseInt(j[6]):0);break;case"e":g=j[7]?g.toExponential(j[7]):g.toExponential();break;case"f":g=j[7]?parseFloat(g).toFixed(j[7]):parseFloat(g);break;case"g":g=j[7]?parseFloat(g).toPrecision(j[7]):parseFloat(g);break;case"o":g=g.toString(8);break;case"s":g=(g=String(g))&&j[7]?g.substring(0,j[7]):g;break;case"u":g>>>=0;break;case"x":g=g.toString(16);break;case"X":g=g.toString(16).toUpperCase()}e.json.test(j[8])?q[q.length]=g:(!e.number.test(j[8])||r&&!j[3]?s="":(s=r?"+":"-",g=g.toString().replace(e.sign,"")),l=j[4]?"0"===j[4]?"0":j[4].charAt(1):" ",m=j[6]-(s+g).length,k=j[6]&&m>0?d(l,m):"",q[q.length]=j[5]?s+g+k:"0"===l?s+k+g:k+s+g)}return q.join("")},b.cache={},b.parse=function(a){for(var b=a,c=[],d=[],f=0;b;){if(null!==(c=e.text.exec(b)))d[d.length]=c[0];else if(null!==(c=e.modulo.exec(b)))d[d.length]="%";else{if(null===(c=e.placeholder.exec(b)))throw new SyntaxError("[sprintf] unexpected placeholder");if(c[2]){f|=1;var g=[],h=c[2],i=[];if(null===(i=e.key.exec(h)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(g[g.length]=i[1];""!==(h=h.substring(i[0].length));)if(null!==(i=e.key_access.exec(h)))g[g.length]=i[1];else{if(null===(i=e.index_access.exec(h)))throw new SyntaxError("[sprintf] failed to parse named argument key");g[g.length]=i[1]}c[2]=g}else f|=2;if(3===f)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");d[d.length]=c}b=b.substring(c[0].length)}return d};var f=function(a,c,d){return d=(c||[]).slice(0),d.splice(0,0,a),b.apply(null,d)};"undefined"!=typeof exports?(exports.sprintf=b,exports.vsprintf=f):(a.sprintf=b,a.vsprintf=f,"function"==typeof define&&define.amd&&define(function(){return{sprintf:b,vsprintf:f}}))}("undefined"==typeof window?this:window);
//# sourceMappingURL=sprintf.min.map{"version":3,"file":"sprintf.min.js","sources":["../src/sprintf.js"],"names":["window","sprintf","key","arguments","cache","hasOwnProperty","parse","format","call","get_type","variable","Object","prototype","toString","slice","toLowerCase","str_repeat","input","multiplier","Array","join","re","not_string","number","json","not_json","text","modulo","placeholder","key_access","index_access","sign","parse_tree","argv","arg","i","k","match","pad","pad_character","pad_length","cursor","tree_length","length","node_type","output","is_positive","Error","test","isNaN","TypeError","String","fromCharCode","parseInt","JSON","stringify","toExponential","parseFloat","toFixed","substring","toUpperCase","replace","charAt","fmt","_fmt","arg_names","exec","SyntaxError","field_list","replacement_field","field_match","vsprintf","_argv","splice","apply","exports","define","amd","this"],"mappings":"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"}{"version":3,"file":"sprintf.min.js","sources":["../src/sprintf.js"],"names":["window","sprintf","key","arguments","cache","hasOwnProperty","parse","format","call","get_type","variable","Object","prototype","toString","slice","toLowerCase","str_repeat","input","multiplier","Array","join","re","not_string","number","json","not_json","text","modulo","placeholder","key_access","index_access","sign","parse_tree","argv","arg","i","k","match","pad","pad_character","pad_length","cursor","tree_length","length","node_type","output","is_positive","Error","test","isNaN","TypeError","String","fromCharCode","parseInt","JSON","stringify","toExponential","parseFloat","toFixed","toPrecision","substring","toUpperCase","replace","charAt","fmt","_fmt","arg_names","exec","SyntaxError","field_list","replacement_field","field_match","vsprintf","_argv","splice","apply","exports","define","amd","this"],"mappings":"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"}<!doctype html>
<html ng-app="app">
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-rc.3/angular.min.js"></script>
    <script src="../src/sprintf.js"></script>
    <script src="../src/angular-sprintf.js"></script>
</head>
<body>
    <pre>{{ "%+010d"|sprintf:-123 }}</pre>
    <pre>{{ "%+010d"|vsprintf:[-123] }}</pre>
    <pre>{{ "%+010d"|fmt:-123 }}</pre>
    <pre>{{ "%+010d"|vfmt:[-123] }}</pre>
    <pre>{{ "I've got %2$d apples and %1$d oranges."|fmt:4:2 }}</pre>
    <pre>{{ "I've got %(apples)d apples and %(oranges)d oranges."|fmt:{apples: 2, oranges: 4} }}</pre>

    <script>
        angular.module("app", ["sprintf"])
    </script>
</body>
</html>
0.2.2 / 2016-09-05
==================

* [[`764f2420ef`](https://github.com/TooTallNate/stat-mode/commit/764f2420ef)] - Rename `define()` to `_define()` (#6) (CxRes)
* [[`ba5a88d6e4`](https://github.com/TooTallNate/stat-mode/commit/ba5a88d6e4)] - **package**: update "mocha" to v3.0.2 (Nathan Rajlich)
* [[`e8a4a487ab`](https://github.com/TooTallNate/stat-mode/commit/e8a4a487ab)] - **travis**: test lots more node versions (Nathan Rajlich)

0.2.1 / 2015-04-06
==================

  * fix #2
  * add regression test for #2
  * travis: test node v0.12 instead of v0.11
  * .travis: don't test node v0.9.x
  * add .travis.yml file
  * README: add Travis-CI badge
  * test: add FIFO test
  * test: more test cases
  * test: more inputs for tests
  * package: update "mocha" to v1.18.2
  * package: add a few more "keywords"

0.2.0 / 2014-04-02
==================

  * index: add `Mode#toOctal()` function
  * index: add `setuid`, `setgid` and `sticky` props
  * test: initial tests

0.1.0 / 2014-03-01
==================

  * package: remove the "test" script for now
  * index: add `Mode#toString()` function
  * index: add `Mode#valueOf()` function

0.0.1 / 2014-03-01
==================

  * initial commit
(The MIT License)

Copyright (c) 2016 Nathan Rajlich <n@n8.io>

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

/**
 * Module exports.
 */

module.exports = Mode;

/**
 * Constants (defined in `stat.h`).
 */

var S_IFMT = 61440;   /* 0170000 type of file */
var S_IFIFO = 4096;   /* 0010000 named pipe (fifo) */
var S_IFCHR = 8192;   /* 0020000 character special */
var S_IFDIR = 16384;  /* 0040000 directory */
var S_IFBLK = 24576;  /* 0060000 block special */
var S_IFREG = 32768;  /* 0100000 regular */
var S_IFLNK = 40960;  /* 0120000 symbolic link */
var S_IFSOCK = 49152; /* 0140000 socket */
var S_IFWHT = 57344;  /* 0160000 whiteout */
var S_ISUID = 2048;   /* 0004000 set user id on execution */
var S_ISGID = 1024;   /* 0002000 set group id on execution */
var S_ISVTX = 512;    /* 0001000 save swapped text even after use */
var S_IRUSR = 256;    /* 0000400 read permission, owner */
var S_IWUSR = 128;    /* 0000200 write permission, owner */
var S_IXUSR = 64;     /* 0000100 execute/search permission, owner */
var S_IRGRP = 32;     /* 0000040 read permission, group */
var S_IWGRP = 16;     /* 0000020 write permission, group */
var S_IXGRP = 8;      /* 0000010 execute/search permission, group */
var S_IROTH = 4;      /* 0000004 read permission, others */
var S_IWOTH = 2;      /* 0000002 write permission, others */
var S_IXOTH = 1;      /* 0000001 execute/search permission, others */

/**
 * `Mode` class.
 *
 * @param {fs.Stat} stat a "stat" object (anything with a `mode` Number property)
 * @api public
 */

function Mode (stat) {
  if (!(this instanceof Mode)) return new Mode(stat);
  if (!stat) throw new TypeError('must pass in a "stat" object');
  if ('number' != typeof stat.mode) stat.mode = 0;
  this.stat = stat;
  this.owner = new Owner(stat);
  this.group = new Group(stat);
  this.others = new Others(stat);
}

/**
 * Returns the Number value of the `mode`.
 *
 * @return {Number}
 * @api public
 */

Mode.prototype.valueOf = function () {
  return this.stat.mode;
};

/**
 * Returns a String representation of the `mode`.
 * The output resembles something similiar to what `ls -l` would output.
 *
 * http://en.wikipedia.org/wiki/Unix_file_types
 *
 * @return {String}
 * @api public
 */

Mode.prototype.toString = function () {
  var str = [];

  // file type
  if (this.isDirectory()) {
    str.push('d');
  } else if (this.isFile()) {
    str.push('-');
  } else if (this.isBlockDevice()) {
    str.push('b');
  } else if (this.isCharacterDevice()) {
    str.push('c');
  } else if (this.isSymbolicLink()) {
    str.push('l');
  } else if (this.isFIFO()) {
    str.push('p');
  } else if (this.isSocket()) {
    str.push('s');
  } else {
    const mode = this.valueOf();
    const err = new TypeError('Unexpected "file type": mode=' + mode);
    err.stat = this.stat;
    err.mode = mode;
  }

  // owner read, write, execute
  str.push(this.owner.read ? 'r' : '-');
  str.push(this.owner.write ? 'w' : '-');
  if (this.setuid) {
    str.push(this.owner.execute ? 's' : 'S');
  } else {
    str.push(this.owner.execute ? 'x' : '-');
  }

  // group read, write, execute
  str.push(this.group.read ? 'r' : '-');
  str.push(this.group.write ? 'w' : '-');
  if (this.setgid) {
    str.push(this.group.execute ? 's' : 'S');
  } else {
    str.push(this.group.execute ? 'x' : '-');
  }

  // others read, write, execute
  str.push(this.others.read ? 'r' : '-');
  str.push(this.others.write ? 'w' : '-');
  if (this.sticky) {
    str.push(this.others.execute ? 't' : 'T');
  } else {
    str.push(this.others.execute ? 'x' : '-');
  }

  return str.join('');
};

/**
 * Returns an octal representation of the `mode`, eg. "0754".
 *
 * http://en.wikipedia.org/wiki/File_system_permissions#Numeric_notation
 *
 * @return {String}
 * @api public
 */

Mode.prototype.toOctal = function () {
  var octal = this.stat.mode & 4095 /* 07777 */;
  return ('0000' + octal.toString(8)).slice(-4);
};

Mode.prototype._checkModeProperty = function (property, set) {
  var mode = this.stat.mode;
  if (set) {
    this.stat.mode = (mode | S_IFMT) & property | mode & ~S_IFMT;
  }
  return (mode & S_IFMT) === property;
};

Mode.prototype.isDirectory = function (v) {
  return this._checkModeProperty(S_IFDIR, v);
};

Mode.prototype.isFile = function (v) {
  return this._checkModeProperty(S_IFREG, v);
};

Mode.prototype.isBlockDevice = function (v) {
  return this._checkModeProperty(S_IFBLK, v);
};

Mode.prototype.isCharacterDevice = function (v) {
  return this._checkModeProperty(S_IFCHR, v);
};

Mode.prototype.isSymbolicLink = function (v) {
  return this._checkModeProperty(S_IFLNK, v);
};

Mode.prototype.isFIFO = function (v) {
  return this._checkModeProperty(S_IFIFO, v);
};

Mode.prototype.isSocket = function (v) {
  return this._checkModeProperty(S_IFSOCK, v);
};

_define(Mode.prototype, 'setuid',
  function () {
    return Boolean(this.stat.mode & S_ISUID);
  },
  function (v) {
    if (v) {
      this.stat.mode |= S_ISUID;
    } else {
      this.stat.mode &= ~S_ISUID;
    }
  }
);

_define(Mode.prototype, 'setgid',
  function () {
    return Boolean(this.stat.mode & S_ISGID);
  },
  function (v) {
    if (v) {
      this.stat.mode |= S_ISGID;
    } else {
      this.stat.mode &= ~S_ISGID;
    }
  }
);

_define(Mode.prototype, 'sticky',
  function () {
    return Boolean(this.stat.mode & S_ISVTX);
  },
  function (v) {
    if (v) {
      this.stat.mode |= S_ISVTX;
    } else {
      this.stat.mode &= ~S_ISVTX;
    }
  }
);

function Owner (stat) {
  _define(this, 'read',
    function () {
      return Boolean(stat.mode & S_IRUSR);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IRUSR;
      } else {
        stat.mode &= ~S_IRUSR;
      }
    }
  );
  _define(this, 'write',
    function () {
      return Boolean(stat.mode & S_IWUSR);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IWUSR;
      } else {
        stat.mode &= ~S_IWUSR;
      }
    }
  );
  _define(this, 'execute',
    function () {
      return Boolean(stat.mode & S_IXUSR);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IXUSR;
      } else {
        stat.mode &= ~S_IXUSR;
      }
    }
  );
}

function Group (stat) {
  _define(this, 'read',
    function () {
      return Boolean(stat.mode & S_IRGRP);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IRGRP;
      } else {
        stat.mode &= ~S_IRGRP;
      }
    }
  );
  _define(this, 'write',
    function () {
      return Boolean(stat.mode & S_IWGRP);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IWGRP;
      } else {
        stat.mode &= ~S_IWGRP;
      }
    }
  );
  _define(this, 'execute',
    function () {
      return Boolean(stat.mode & S_IXGRP);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IXGRP;
      } else {
        stat.mode &= ~S_IXGRP;
      }
    }
  );
}

function Others (stat) {
  _define(this, 'read',
    function () {
      return Boolean(stat.mode & S_IROTH);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IROTH;
      } else {
        stat.mode &= ~S_IROTH;
      }
    }
  );
  _define(this, 'write',
    function () {
      return Boolean(stat.mode & S_IWOTH);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IWOTH;
      } else {
        stat.mode &= ~S_IWOTH;
      }
    }
  );
  _define(this, 'execute',
    function () {
      return Boolean(stat.mode & S_IXOTH);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IXOTH;
      } else {
        stat.mode &= ~S_IXOTH;
      }
    }
  );
}

function _define (obj, name, get, set) {
  Object.defineProperty(obj, name, {
    enumerable: true,
    configurable: true,
    get: get,
    set: set
  });
}
{
  "author": {
    "name": "Nathan Rajlich",
    "email": "nathan@tootallnate.net",
    "url": "http://n8.io/"
  },
  "deprecated": false,
  "description": "Offers convenient getters and setters for the stat `mode`",
  "devDependencies": {
    "mocha": "^3.0.2"
  },
  "homepage": "https://github.com/TooTallNate/stat-mode",
  "license": "MIT",
  "main": "index.js",
  "name": "stat-mode",
  "repository": {
    "type": "git",
    "url": "git://github.com/TooTallNate/stat-mode.git"
  },
  "version": "0.3.0"
}root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';

require('./shim')();
'use strict';

var CheckObjectCoercible = require('es-abstract/5/CheckObjectCoercible');
var ToString = require('es-abstract/2019/ToString');
var callBound = require('es-abstract/helpers/callBound');
var $replace = callBound('String.prototype.replace');

/* eslint-disable no-control-regex */
var leftWhitespace = /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/;
var rightWhitespace = /[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/;
/* eslint-enable no-control-regex */

module.exports = function trim() {
	var S = ToString(CheckObjectCoercible(this));
	return $replace($replace(S, leftWhitespace, ''), rightWhitespace, '');
};
'use strict';

var callBind = require('es-abstract/helpers/callBind');
var define = require('define-properties');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var boundTrim = callBind(getPolyfill());

define(boundTrim, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = boundTrim;
{
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com",
    "url": "http://ljharb.codes"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false
  },
  "dependencies": {
    "define-properties": "^1.1.3",
    "es-abstract": "^1.17.0-next.1",
    "function-bind": "^1.1.1"
  },
  "deprecated": false,
  "description": "ES5 spec-compliant shim for String.prototype.trim",
  "devDependencies": {
    "@es-shims/api": "^2.1.2",
    "@ljharb/eslint-config": "^15.0.2",
    "auto-changelog": "^1.16.2",
    "covert": "^1.1.1",
    "eslint": "^6.7.2",
    "functions-have-names": "^1.2.0",
    "tape": "^4.11.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/es-shims/String.prototype.trim#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "string.prototype.trim",
  "repository": {
    "type": "git",
    "url": "git://github.com/es-shims/String.prototype.trim.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/9.0..latest",
      "firefox/4.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/11.6..latest",
      "opera/next",
      "safari/5.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "1.2.1"
}'use strict';

var implementation = require('./implementation');

var zeroWidthSpace = '\u200b';

module.exports = function getPolyfill() {
	if (String.prototype.trim && zeroWidthSpace.trim() === zeroWidthSpace) {
		return String.prototype.trim;
	}
	return implementation;
};
'use strict';

var define = require('define-properties');
var getPolyfill = require('./polyfill');

module.exports = function shimStringTrim() {
	var polyfill = getPolyfill();
	define(String.prototype, { trim: polyfill }, {
		trim: function testTrim() {
			return String.prototype.trim !== polyfill;
		}
	});
	return polyfill;
};
name: Automatic Rebase

on: [pull_request]

jobs:
  _:
    name: "Automatic Rebase"

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - uses: ljharb/rebase@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

'use strict';

require('./shim')();
'use strict';

var bind = require('function-bind');
var replace = bind.call(Function.call, String.prototype.replace);

/* eslint-disable no-control-regex */
var leftWhitespace = /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]*/;
/* eslint-enable no-control-regex */

module.exports = function trimLeft() {
	return replace(this, leftWhitespace, '');
};
'use strict';

var bind = require('function-bind');
var define = require('define-properties');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var bound = bind.call(Function.call, getPolyfill());

define(bound, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = bound;
{
  "author": {
    "name": "Jordan Harband"
  },
  "dependencies": {
    "define-properties": "^1.1.3",
    "function-bind": "^1.1.1"
  },
  "deprecated": false,
  "description": "ES7 spec-compliant String.prototype.trimLeft shim.",
  "devDependencies": {
    "@es-shims/api": "^2.1.2",
    "@ljharb/eslint-config": "^15.0.2",
    "covert": "^1.1.1",
    "eslint": "^6.7.2",
    "functions-have-names": "^1.2.0",
    "tape": "^4.12.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/es-shims/String.prototype.trimLeft#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "string.prototype.trimleft",
  "repository": {
    "type": "git",
    "url": "git://github.com/es-shims/String.prototype.trimLeft.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/9.0..latest",
      "firefox/4.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/11.6..latest",
      "opera/next",
      "safari/5.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "2.1.1"
}'use strict';

var implementation = require('./implementation');

module.exports = function getPolyfill() {
	if (!String.prototype.trimLeft) {
		return implementation;
	}
	var zeroWidthSpace = '\u200b';
	if (zeroWidthSpace.trimLeft() !== zeroWidthSpace) {
		return implementation;
	}
	return String.prototype.trimLeft;
};
'use strict';

var define = require('define-properties');
var getPolyfill = require('./polyfill');

module.exports = function shimTrimLeft() {
	var polyfill = getPolyfill();
	define(
		String.prototype,
		{ trimLeft: polyfill },
		{ trimLeft: function () { return String.prototype.trimLeft !== polyfill; } }
	);
	return polyfill;
};
name: Automatic Rebase

on: [pull_request]

jobs:
  _:
    name: "Automatic Rebase"

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - uses: ljharb/rebase@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

'use strict';

require('./shim')();
'use strict';

var bind = require('function-bind');
var replace = bind.call(Function.call, String.prototype.replace);

/* eslint-disable no-control-regex */
var rightWhitespace = /[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]*$/;
/* eslint-enable no-control-regex */

module.exports = function trimRight() {
	return replace(this, rightWhitespace, '');
};
'use strict';

var bind = require('function-bind');
var define = require('define-properties');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var bound = bind.call(Function.call, getPolyfill());

define(bound, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = bound;
{
  "author": {
    "name": "Jordan Harband"
  },
  "dependencies": {
    "define-properties": "^1.1.3",
    "function-bind": "^1.1.1"
  },
  "deprecated": false,
  "description": "ES7 spec-compliant String.prototype.trimRight shim.",
  "devDependencies": {
    "@es-shims/api": "^2.1.2",
    "@ljharb/eslint-config": "^15.0.2",
    "covert": "^1.1.1",
    "eslint": "^6.7.2",
    "functions-have-names": "^1.2.0",
    "tape": "^4.12.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/es-shims/String.prototype.trimRight#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "string.prototype.trimright",
  "repository": {
    "type": "git",
    "url": "git://github.com/es-shims/String.prototype.trimRight.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/9.0..latest",
      "firefox/4.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/11.6..latest",
      "opera/next",
      "safari/5.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "2.1.1"
}'use strict';

var implementation = require('./implementation');

module.exports = function getPolyfill() {
	if (!String.prototype.trimRight) {
		return implementation;
	}
	var zeroWidthSpace = '\u200b';
	if (zeroWidthSpace.trimRight() !== zeroWidthSpace) {
		return implementation;
	}
	return String.prototype.trimRight;
};
'use strict';

var define = require('define-properties');
var getPolyfill = require('./polyfill');

module.exports = function shimTrimRight() {
	var polyfill = getPolyfill();
	define(
		String.prototype,
		{ trimRight: polyfill },
		{ trimRight: function () { return String.prototype.trimRight !== polyfill; } }
	);
	return polyfill;
};
name: Automatic Rebase

on: [pull_request]

jobs:
  _:
    name: "Automatic Rebase"

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - uses: ljharb/rebase@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
'use strict';
var ansiRegex = require('ansi-regex')();

module.exports = function (str) {
	return typeof str === 'string' ? str.replace(ansiRegex, '') : str;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "ansi-regex": "^2.0.0"
  },
  "deprecated": false,
  "description": "Strip ANSI escape codes",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/strip-ansi#readme",
  "license": "MIT",
  "maintainers": [
    {
      "name": "Sindre Sorhus",
      "email": "sindresorhus@gmail.com",
      "url": "sindresorhus.com"
    },
    {
      "name": "Joshua Boy Nicolai Appelman",
      "email": "joshua@jbna.nl",
      "url": "jbna.nl"
    },
    {
      "name": "JD Ballard",
      "email": "i.am.qix@gmail.com",
      "url": "github.com/qix-"
    }
  ],
  "name": "strip-ansi",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/strip-ansi.git"
  },
  "version": "3.0.1"
}'use strict';
module.exports = x => {
	if (typeof x !== 'string') {
		throw new TypeError('Expected a string, got ' + typeof x);
	}

	// Catches EFBBBF (UTF-8 BOM) because the buffer-to-string
	// conversion translates it to FEFF (UTF-16 BOM)
	if (x.charCodeAt(0) === 0xFEFF) {
		return x.slice(1);
	}

	return x;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Strip UTF-8 byte order mark (BOM) from a string",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/strip-bom#readme",
  "license": "MIT",
  "name": "strip-bom",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/strip-bom.git"
  },
  "version": "3.0.0"
}'use strict';
var singleComment = 1;
var multiComment = 2;

function stripWithoutWhitespace() {
	return '';
}

function stripWithWhitespace(str, start, end) {
	return str.slice(start, end).replace(/\S/g, ' ');
}

module.exports = function (str, opts) {
	opts = opts || {};

	var currentChar;
	var nextChar;
	var insideString = false;
	var insideComment = false;
	var offset = 0;
	var ret = '';
	var strip = opts.whitespace === false ? stripWithoutWhitespace : stripWithWhitespace;

	for (var i = 0; i < str.length; i++) {
		currentChar = str[i];
		nextChar = str[i + 1];

		if (!insideComment && currentChar === '"') {
			var escaped = str[i - 1] === '\\' && str[i - 2] !== '\\';
			if (!escaped) {
				insideString = !insideString;
			}
		}

		if (insideString) {
			continue;
		}

		if (!insideComment && currentChar + nextChar === '//') {
			ret += str.slice(offset, i);
			offset = i;
			insideComment = singleComment;
			i++;
		} else if (insideComment === singleComment && currentChar + nextChar === '\r\n') {
			i++;
			insideComment = false;
			ret += strip(str, offset, i);
			offset = i;
			continue;
		} else if (insideComment === singleComment && currentChar === '\n') {
			insideComment = false;
			ret += strip(str, offset, i);
			offset = i;
		} else if (!insideComment && currentChar + nextChar === '/*') {
			ret += str.slice(offset, i);
			offset = i;
			insideComment = multiComment;
			i++;
			continue;
		} else if (insideComment === multiComment && currentChar + nextChar === '*/') {
			i++;
			insideComment = false;
			ret += strip(str, offset, i + 1);
			offset = i + 1;
			continue;
		}
	}

	return ret + (insideComment ? strip(str.substr(offset)) : str.substr(offset));
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Strip comments from JSON. Lets you use comments in your JSON files!",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/strip-json-comments#readme",
  "license": "MIT",
  "name": "strip-json-comments",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/strip-json-comments.git"
  },
  "version": "2.0.1"
}'use strict';
module.exports = {
	stdout: false,
	stderr: false
};
'use strict';
const os = require('os');
const hasFlag = require('has-flag');

const env = process.env;

let forceColor;
if (hasFlag('no-color') ||
	hasFlag('no-colors') ||
	hasFlag('color=false')) {
	forceColor = false;
} else if (hasFlag('color') ||
	hasFlag('colors') ||
	hasFlag('color=true') ||
	hasFlag('color=always')) {
	forceColor = true;
}
if ('FORCE_COLOR' in env) {
	forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0;
}

function translateLevel(level) {
	if (level === 0) {
		return false;
	}

	return {
		level,
		hasBasic: true,
		has256: level >= 2,
		has16m: level >= 3
	};
}

function supportsColor(stream) {
	if (forceColor === false) {
		return 0;
	}

	if (hasFlag('color=16m') ||
		hasFlag('color=full') ||
		hasFlag('color=truecolor')) {
		return 3;
	}

	if (hasFlag('color=256')) {
		return 2;
	}

	if (stream && !stream.isTTY && forceColor !== true) {
		return 0;
	}

	const min = forceColor ? 1 : 0;

	if (process.platform === 'win32') {
		// Node.js 7.5.0 is the first version of Node.js to include a patch to
		// libuv that enables 256 color output on Windows. Anything earlier and it
		// won't work. However, here we target Node.js 8 at minimum as it is an LTS
		// release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows
		// release that supports 256 colors. Windows 10 build 14931 is the first release
		// that supports 16m/TrueColor.
		const osRelease = os.release().split('.');
		if (
			Number(process.versions.node.split('.')[0]) >= 8 &&
			Number(osRelease[0]) >= 10 &&
			Number(osRelease[2]) >= 10586
		) {
			return Number(osRelease[2]) >= 14931 ? 3 : 2;
		}

		return 1;
	}

	if ('CI' in env) {
		if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') {
			return 1;
		}

		return min;
	}

	if ('TEAMCITY_VERSION' in env) {
		return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
	}

	if (env.COLORTERM === 'truecolor') {
		return 3;
	}

	if ('TERM_PROGRAM' in env) {
		const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);

		switch (env.TERM_PROGRAM) {
			case 'iTerm.app':
				return version >= 3 ? 3 : 2;
			case 'Apple_Terminal':
				return 2;
			// No default
		}
	}

	if (/-256(color)?$/i.test(env.TERM)) {
		return 2;
	}

	if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
		return 1;
	}

	if ('COLORTERM' in env) {
		return 1;
	}

	if (env.TERM === 'dumb') {
		return min;
	}

	return min;
}

function getSupportLevel(stream) {
	const level = supportsColor(stream);
	return translateLevel(level);
}

module.exports = {
	supportsColor: getSupportLevel,
	stdout: getSupportLevel(process.stdout),
	stderr: getSupportLevel(process.stderr)
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "browser": "browser.js",
  "dependencies": {
    "has-flag": "^3.0.0"
  },
  "deprecated": false,
  "description": "Detect whether a terminal supports color",
  "devDependencies": {
    "ava": "^0.25.0",
    "import-fresh": "^2.0.0",
    "xo": "^0.20.0"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js",
    "browser.js"
  ],
  "homepage": "https://github.com/chalk/supports-color#readme",
  "license": "MIT",
  "name": "supports-color",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/supports-color.git"
  },
  "version": "5.5.0"
}root = true

[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 180
block_comment_start = /*
block_comment =  *
block_comment_end = */

[*.md]
indent_style = space
indent_size = 4

[readme.markdown]
indent_size = off
max_line_length = off

[*.json]
max_line_length = off

[*.yml]
max_line_length = off

[Makefile]
max_line_length = off

[.travis.yml]
indent_size = 1
MIT License

Copyright (c) 2012 James Halliday

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var defined = require('defined');
var createDefaultStream = require('./lib/default_stream');
var Test = require('./lib/test');
var createResult = require('./lib/results');
var through = require('through');

var canEmitExit = typeof process !== 'undefined' && process
    && typeof process.on === 'function' && process.browser !== true
;
var canExit = typeof process !== 'undefined' && process
    && typeof process.exit === 'function'
;

var nextTick = typeof setImmediate !== 'undefined'
    ? setImmediate
    : process.nextTick
;

exports = module.exports = (function () {
    var harness;
    var lazyLoad = function () {
        return getHarness().apply(this, arguments);
    };

    lazyLoad.only = function () {
        return getHarness().only.apply(this, arguments);
    };

    lazyLoad.createStream = function (opts) {
        if (!opts) opts = {};
        if (!harness) {
            var output = through();
            getHarness({ stream: output, objectMode: opts.objectMode });
            return output;
        }
        return harness.createStream(opts);
    };

    lazyLoad.onFinish = function () {
        return getHarness().onFinish.apply(this, arguments);
    };

    lazyLoad.onFailure = function () {
        return getHarness().onFailure.apply(this, arguments);
    };

    lazyLoad.getHarness = getHarness;

    return lazyLoad;

    function getHarness(opts) {
        if (!opts) opts = {};
        opts.autoclose = !canEmitExit;
        if (!harness) harness = createExitHarness(opts);
        return harness;
    }
})();

function createExitHarness(conf) {
    if (!conf) conf = {};
    var harness = createHarness({
        autoclose: defined(conf.autoclose, false)
    });

    var stream = harness.createStream({ objectMode: conf.objectMode });
    var es = stream.pipe(conf.stream || createDefaultStream());
    if (canEmitExit) {
        es.on('error', function (err) { harness._exitCode = 1; });
    }

    var ended = false;
    stream.on('end', function () { ended = true; });

    if (conf.exit === false) return harness;
    if (!canEmitExit || !canExit) return harness;

    process.on('exit', function (code) {
        // let the process exit cleanly.
        if (code !== 0) {
            return;
        }

        if (!ended) {
            var only = harness._results._only;
            for (var i = 0; i < harness._tests.length; i++) {
                var t = harness._tests[i];
                if (only && t !== only) continue;
                t._exit();
            }
        }
        harness.close();
        process.exit(code || harness._exitCode);
    });

    return harness;
}

exports.createHarness = createHarness;
exports.Test = Test;
exports.test = exports; // tap compat
exports.test.skip = Test.skip;

var exitInterval;

function createHarness(conf_) {
    if (!conf_) conf_ = {};
    var results = createResult();
    if (conf_.autoclose !== false) {
        results.once('done', function () { results.close(); });
    }

    var test = function (name, conf, cb) {
        var t = new Test(name, conf, cb);
        test._tests.push(t);

        (function inspectCode(st) {
            st.on('test', function sub(st_) {
                inspectCode(st_);
            });
            st.on('result', function (r) {
                if (!r.todo && !r.ok && typeof r !== 'string') test._exitCode = 1;
            });
        })(t);

        results.push(t);
        return t;
    };
    test._results = results;

    test._tests = [];

    test.createStream = function (opts) {
        return results.createStream(opts);
    };

    test.onFinish = function (cb) {
        results.on('done', cb);
    };

    test.onFailure = function (cb) {
        results.on('fail', cb);
    };

    var only = false;
    test.only = function () {
        if (only) throw new Error('there can only be one only test');
        only = true;
        var t = test.apply(null, arguments);
        results.only(t);
        return t;
    };
    test._exitCode = 0;

    test.close = function () { results.close(); };

    return test;
}
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "bin": {
    "tape": "bin/tape"
  },
  "dependencies": {
    "deep-equal": "~1.1.1",
    "defined": "~1.0.0",
    "dotignore": "~0.1.2",
    "for-each": "~0.3.3",
    "function-bind": "~1.1.1",
    "glob": "~7.1.6",
    "has": "~1.0.3",
    "inherits": "~2.0.4",
    "is-regex": "~1.0.5",
    "minimist": "~1.2.0",
    "object-inspect": "~1.7.0",
    "resolve": "~1.14.2",
    "resumer": "~0.0.0",
    "string.prototype.trim": "~1.2.1",
    "through": "~2.3.8"
  },
  "deprecated": false,
  "description": "tap-producing test harness for node and browsers",
  "devDependencies": {
    "concat-stream": "^1.6.2",
    "eclint": "^2.8.1",
    "eslint": "^6.8.0",
    "falafel": "^2.1.0",
    "js-yaml": "^3.13.1",
    "tap": "^8.0.1",
    "tap-parser": "^3.0.5"
  },
  "directories": {
    "example": "example",
    "test": "test"
  },
  "homepage": "https://github.com/substack/tape",
  "license": "MIT",
  "main": "index.js",
  "name": "tape",
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/tape.git"
  },
  "testling": {
    "files": "test/browser/*.js",
    "browsers": [
      "ie/6..latest",
      "chrome/20..latest",
      "firefox/10..latest",
      "safari/latest",
      "opera/11.0..latest",
      "iphone/6",
      "ipad/6"
    ]
  },
  "version": "4.13.0"
}var through = require('through');
var fs = require('fs');

module.exports = function () {
    var line = '';
    var stream = through(write, flush);
    return stream;

    function write(buf) {
        for (var i = 0; i < buf.length; i++) {
            var c = typeof buf === 'string'
                ? buf.charAt(i)
                : String.fromCharCode(buf[i])
            ;
            if (c === '\n') flush();
            else line += c;
        }
    }

    function flush() {
        if (fs.writeSync && /^win/.test(process.platform)) {
            try { fs.writeSync(1, line + '\n'); }
            catch (e) { stream.emit('error', e); }
        } else {
            try { console.log(line); }
            catch (e) { stream.emit('error', e); }
        }
        line = '';
    }
};
var defined = require('defined');
var EventEmitter = require('events').EventEmitter;
var inherits = require('inherits');
var through = require('through');
var resumer = require('resumer');
var inspect = require('object-inspect');
var bind = require('function-bind');
var has = require('has');
var regexpTest = bind.call(Function.call, RegExp.prototype.test);
var yamlIndicators = /\:|\-|\?/;
var nextTick = typeof setImmediate !== 'undefined'
    ? setImmediate
    : process.nextTick
;

module.exports = Results;
inherits(Results, EventEmitter);

function coalesceWhiteSpaces(str) {
    return String(str).replace(/\s+/g, ' ');
}

function Results() {
    if (!(this instanceof Results)) return new Results;
    this.count = 0;
    this.fail = 0;
    this.pass = 0;
    this.todo = 0;
    this._stream = through();
    this.tests = [];
    this._only = null;
    this._isRunning = false;
}

Results.prototype.createStream = function (opts) {
    if (!opts) opts = {};
    var self = this;
    var output, testId = 0;
    if (opts.objectMode) {
        output = through();
        self.on('_push', function ontest(t, extra) {
            if (!extra) extra = {};
            var id = testId++;
            t.once('prerun', function () {
                var row = {
                    type: 'test',
                    name: t.name,
                    id: id,
                    skip: t._skip,
                    todo: t._todo
                };
                if (has(extra, 'parent')) {
                    row.parent = extra.parent;
                }
                output.queue(row);
            });
            t.on('test', function (st) {
                ontest(st, { parent: id });
            });
            t.on('result', function (res) {
                res.test = id;
                res.type = 'assert';
                output.queue(res);
            });
            t.on('end', function () {
                output.queue({ type: 'end', test: id });
            });
        });
        self.on('done', function () { output.queue(null); });
    } else {
        output = resumer();
        output.queue('TAP version 13\n');
        self._stream.pipe(output);
    }

    if (!this._isRunning) {
        this._isRunning = true;
        nextTick(function next() {
            var t;
            while (t = getNextTest(self)) {
                t.run();
                if (!t.ended) return t.once('end', function () { nextTick(next); });
            }
            self.emit('done');
        });
    }

    return output;
};

Results.prototype.push = function (t) {
    var self = this;
    self.tests.push(t);
    self._watch(t);
    self.emit('_push', t);
};

Results.prototype.only = function (t) {
    this._only = t;
};

Results.prototype._watch = function (t) {
    var self = this;
    var write = function (s) { self._stream.queue(s); };
    t.once('prerun', function () {
        var premsg = '';
        if (t._skip) premsg = 'SKIP ';
        else if (t._todo) premsg = 'TODO ';
        write('# ' + premsg + coalesceWhiteSpaces(t.name) + '\n');
    });

    t.on('result', function (res) {
        if (typeof res === 'string') {
            write('# ' + res + '\n');
            return;
        }
        write(encodeResult(res, self.count + 1));
        self.count ++;

        if (res.ok || res.todo) self.pass ++;
        else {
            self.fail ++;
            self.emit('fail');
        }
    });

    t.on('test', function (st) { self._watch(st); });
};

Results.prototype.close = function () {
    var self = this;
    if (self.closed) self._stream.emit('error', new Error('ALREADY CLOSED'));
    self.closed = true;
    var write = function (s) { self._stream.queue(s); };

    write('\n1..' + self.count + '\n');
    write('# tests ' + self.count + '\n');
    write('# pass  ' + (self.pass + self.todo) + '\n');
    if (self.todo) write('# todo  ' + self.todo + '\n');
    if (self.fail) write('# fail  ' + self.fail + '\n');
    else write('\n# ok\n');

    self._stream.queue(null);
};

function encodeResult(res, count) {
    var output = '';
    output += (res.ok ? 'ok ' : 'not ok ') + count;
    output += res.name ? ' ' + coalesceWhiteSpaces(res.name) : '';

    if (res.skip) {
        output += ' # SKIP' + ((typeof res.skip === 'string') ? ' ' + coalesceWhiteSpaces(res.skip) : '');
    } else if (res.todo) {
        output += ' # TODO' + ((typeof res.todo === 'string') ? ' ' + coalesceWhiteSpaces(res.todo) : '');
    };

    output += '\n';
    if (res.ok) return output;

    var outer = '  ';
    var inner = outer + '  ';
    output += outer + '---\n';
    output += inner + 'operator: ' + res.operator + '\n';

    if (has(res, 'expected') || has(res, 'actual')) {
        var ex = inspect(res.expected, {depth: res.objectPrintDepth});
        var ac = inspect(res.actual, {depth: res.objectPrintDepth});

        if (Math.max(ex.length, ac.length) > 65 || invalidYaml(ex) || invalidYaml(ac)) {
            output += inner + 'expected: |-\n' + inner + '  ' + ex + '\n';
            output += inner + 'actual: |-\n' + inner + '  ' + ac + '\n';
        } else {
            output += inner + 'expected: ' + ex + '\n';
            output += inner + 'actual:   ' + ac + '\n';
        }
    }
    if (res.at) {
        output += inner + 'at: ' + res.at + '\n';
    }

    var actualStack = res.actual && (typeof res.actual === 'object' || typeof res.actual === 'function') ? res.actual.stack : undefined;
    var errorStack = res.error && res.error.stack;
    var stack = defined(actualStack, errorStack);
    if (stack) {
        var lines = String(stack).split('\n');
        output += inner + 'stack: |-\n';
        for (var i = 0; i < lines.length; i++) {
            output += inner + '  ' + lines[i] + '\n';
        }
    }

    output += outer + '...\n';
    return output;
}

function getNextTest(results) {
    if (!results._only) {
        return results.tests.shift();
    }

    do {
        var t = results.tests.shift();
        if (!t) continue;
        if (results._only === t) {
            return t;
        }
    } while (results.tests.length !== 0);
}

function invalidYaml(str) {
    return regexpTest(yamlIndicators, str);
}
var deepEqual = require('deep-equal');
var defined = require('defined');
var path = require('path');
var inherits = require('inherits');
var EventEmitter = require('events').EventEmitter;
var has = require('has');
var isRegExp = require('is-regex');
var trim = require('string.prototype.trim');
var bind = require('function-bind');
var forEach = require('for-each');
var inspect = require('object-inspect');
var isEnumerable = bind.call(Function.call, Object.prototype.propertyIsEnumerable);
var toLowerCase = bind.call(Function.call, String.prototype.toLowerCase);
var $test = bind.call(Function.call, RegExp.prototype.test);

module.exports = Test;

var nextTick = typeof setImmediate !== 'undefined'
    ? setImmediate
    : process.nextTick;
var safeSetTimeout = setTimeout;
var safeClearTimeout = clearTimeout;

inherits(Test, EventEmitter);

var getTestArgs = function (name_, opts_, cb_) {
    var name = '(anonymous)';
    var opts = {};
    var cb;

    for (var i = 0; i < arguments.length; i++) {
        var arg = arguments[i];
        var t = typeof arg;
        if (t === 'string') {
            name = arg;
        } else if (t === 'object') {
            opts = arg || opts;
        } else if (t === 'function') {
            cb = arg;
        }
    }
    return { name: name, opts: opts, cb: cb };
};

function Test(name_, opts_, cb_) {
    if (! (this instanceof Test)) {
        return new Test(name_, opts_, cb_);
    }

    var args = getTestArgs(name_, opts_, cb_);

    this.readable = true;
    this.name = args.name || '(anonymous)';
    this.assertCount = 0;
    this.pendingCount = 0;
    this._skip = args.opts.skip || false;
    this._todo = args.opts.todo || false;
    this._timeout = args.opts.timeout;
    this._plan = undefined;
    this._cb = args.cb;
    this._progeny = [];
    this._ok = true;
    var depthEnvVar = process.env.NODE_TAPE_OBJECT_PRINT_DEPTH;
    if (args.opts.objectPrintDepth) {
        this._objectPrintDepth = args.opts.objectPrintDepth;
    } else if (depthEnvVar) {
        if (toLowerCase(depthEnvVar) === 'infinity') {
            this._objectPrintDepth = Infinity;
        } else {
            this._objectPrintDepth = depthEnvVar;
        }
    } else {
        this._objectPrintDepth = 5;
    }

    for (var prop in this) {
        this[prop] = (function bind(self, val) {
            if (typeof val === 'function') {
                return function bound() {
                    return val.apply(self, arguments);
                };
            }
            return val;
        })(this, this[prop]);
    }
}

Test.prototype.run = function () {
    this.emit('prerun');
    if (!this._cb || this._skip) {
        return this._end();
    }
    if (this._timeout != null) {
        this.timeoutAfter(this._timeout);
    }
    this._cb(this);
    this.emit('run');
};

Test.prototype.test = function (name, opts, cb) {
    var self = this;
    var t = new Test(name, opts, cb);
    this._progeny.push(t);
    this.pendingCount++;
    this.emit('test', t);
    t.on('prerun', function () {
        self.assertCount++;
    });

    if (!self._pendingAsserts()) {
        nextTick(function () {
            self._end();
        });
    }

    nextTick(function () {
        if (!self._plan && self.pendingCount == self._progeny.length) {
            self._end();
        }
    });
};

Test.prototype.comment = function (msg) {
    var that = this;
    forEach(trim(msg).split('\n'), function (aMsg) {
        that.emit('result', trim(aMsg).replace(/^#\s*/, ''));
    });
};

Test.prototype.plan = function (n) {
    this._plan = n;
    this.emit('plan', n);
};

Test.prototype.timeoutAfter = function (ms) {
    if (!ms) throw new Error('timeoutAfter requires a timespan');
    var self = this;
    var timeout = safeSetTimeout(function () {
        self.fail('test timed out after ' + ms + 'ms');
        self.end();
    }, ms);
    this.once('end', function () {
        safeClearTimeout(timeout);
    });
};

Test.prototype.end = function (err) {
    var self = this;
    if (arguments.length >= 1 && !!err) {
        this.ifError(err);
    }

    if (this.calledEnd) {
        this.fail('.end() called twice');
    }
    this.calledEnd = true;
    this._end();
};

Test.prototype._end = function (err) {
    var self = this;
    if (this._progeny.length) {
        var t = this._progeny.shift();
        t.on('end', function () { self._end(); });
        t.run();
        return;
    }

    if (!this.ended) this.emit('end');
    var pendingAsserts = this._pendingAsserts();
    if (!this._planError && this._plan !== undefined && pendingAsserts) {
        this._planError = true;
        this.fail('plan != count', {
            expected: this._plan,
            actual: this.assertCount
        });
    }
    this.ended = true;
};

Test.prototype._exit = function () {
    if (this._plan !== undefined &&
        !this._planError && this.assertCount !== this._plan) {
        this._planError = true;
        this.fail('plan != count', {
            expected: this._plan,
            actual: this.assertCount,
            exiting: true
        });
    } else if (!this.ended) {
        this.fail('test exited without ending', {
            exiting: true
        });
    }
};

Test.prototype._pendingAsserts = function () {
    if (this._plan === undefined) {
        return 1;
    }
    return this._plan - (this._progeny.length + this.assertCount);
};

Test.prototype._assert = function assert(ok, opts) {
    var self = this;
    var extra = opts.extra || {};

    ok = !!ok || !!extra.skip;

    var res = {
        id: self.assertCount++,
        ok: ok,
        skip: defined(extra.skip, opts.skip),
        todo: defined(extra.todo, opts.todo, self._todo),
        name: defined(extra.message, opts.message, '(unnamed assert)'),
        operator: defined(extra.operator, opts.operator),
        objectPrintDepth: self._objectPrintDepth
    };
    if (has(opts, 'actual') || has(extra, 'actual')) {
        res.actual = defined(extra.actual, opts.actual);
    }
    if (has(opts, 'expected') || has(extra, 'expected')) {
        res.expected = defined(extra.expected, opts.expected);
    }
    this._ok = !!(this._ok && ok);

    if (!ok && !res.todo) {
        res.error = defined(extra.error, opts.error, new Error(res.name));
    }

    if (!ok) {
        var e = new Error('exception');
        var err = (e.stack || '').split('\n');
        var dir = __dirname + path.sep;

        for (var i = 0; i < err.length; i++) {
            /*
                Stack trace lines may resemble one of the following. We need
                to should correctly extract a function name (if any) and
                path / line no. for each line.

                    at myFunction (/path/to/file.js:123:45)
                    at myFunction (/path/to/file.other-ext:123:45)
                    at myFunction (/path to/file.js:123:45)
                    at myFunction (C:\path\to\file.js:123:45)
                    at myFunction (/path/to/file.js:123)
                    at Test.<anonymous> (/path/to/file.js:123:45)
                    at Test.bound [as run] (/path/to/file.js:123:45)
                    at /path/to/file.js:123:45

                Regex has three parts. First is non-capturing group for 'at '
                (plus anything preceding it).

                    /^(?:[^\s]*\s*\bat\s+)/

                Second captures function call description (optional). This is
                not necessarily a valid JS function name, but just what the
                stack trace is using to represent a function call. It may look
                like `<anonymous>` or 'Test.bound [as run]'.

                For our purposes, we assume that, if there is a function
                name, it's everything leading up to the first open
                parentheses (trimmed) before our pathname.

                    /(?:(.*)\s+\()?/

                Last part captures file path plus line no (and optional
                column no).

                    /((?:\/|[a-zA-Z]:\\)[^:\)]+:(\d+)(?::(\d+))?)/
            */
            var re = /^(?:[^\s]*\s*\bat\s+)(?:(.*)\s+\()?((?:\/|[a-zA-Z]:\\)[^:\)]+:(\d+)(?::(\d+))?)\)$/;
            var lineWithTokens = err[i].replace(process.cwd(), '/\$CWD').replace(__dirname, '/\$TEST');
            var m = re.exec(lineWithTokens);

            if (!m) {
                continue;
            }

            var callDescription = m[1] || '<anonymous>';
            var filePath = m[2].replace('/$CWD', process.cwd()).replace('/$TEST', __dirname);

            if (filePath.slice(0, dir.length) === dir) {
                continue;
            }

            // Function call description may not (just) be a function name.
            // Try to extract function name by looking at first "word" only.
            res.functionName = callDescription.split(/\s+/)[0];
            res.file = filePath;
            res.line = Number(m[3]);
            if (m[4]) res.column = Number(m[4]);

            res.at = callDescription + ' (' + filePath + ')';
            break;
        }
    }

    self.emit('result', res);

    var pendingAsserts = self._pendingAsserts();
    if (!pendingAsserts) {
        if (extra.exiting) {
            self._end();
        } else {
            nextTick(function () {
                self._end();
            });
        }
    }

    if (!self._planError && pendingAsserts < 0) {
        self._planError = true;
        self.fail('plan != count', {
            expected: self._plan,
            actual: self._plan - pendingAsserts
        });
    }
};

Test.prototype.fail = function (msg, extra) {
    this._assert(false, {
        message: msg,
        operator: 'fail',
        extra: extra
    });
};

Test.prototype.pass = function (msg, extra) {
    this._assert(true, {
        message: msg,
        operator: 'pass',
        extra: extra
    });
};

Test.prototype.skip = function (msg, extra) {
    this._assert(true, {
        message: msg,
        operator: 'skip',
        skip: true,
        extra: extra
    });
};

function assert(value, msg, extra) {
    this._assert(value, {
        message: defined(msg, 'should be truthy'),
        operator: 'ok',
        expected: true,
        actual: value,
        extra: extra
    });
}
Test.prototype.ok
= Test.prototype['true']
= Test.prototype.assert
= assert;

function notOK(value, msg, extra) {
    this._assert(!value, {
        message: defined(msg, 'should be falsy'),
        operator: 'notOk',
        expected: false,
        actual: value,
        extra: extra
    });
}
Test.prototype.notOk
= Test.prototype['false']
= Test.prototype.notok
= notOK;

function error(err, msg, extra) {
    this._assert(!err, {
        message: defined(msg, String(err)),
        operator: 'error',
        actual: err,
        extra: extra
    });
}
Test.prototype.error
= Test.prototype.ifError
= Test.prototype.ifErr
= Test.prototype.iferror
= error;

function equal(a, b, msg, extra) {
    this._assert(a === b, {
        message: defined(msg, 'should be equal'),
        operator: 'equal',
        actual: a,
        expected: b,
        extra: extra
    });
}
Test.prototype.equal
= Test.prototype.equals
= Test.prototype.isEqual
= Test.prototype.is
= Test.prototype.strictEqual
= Test.prototype.strictEquals
= equal;

function notEqual(a, b, msg, extra) {
    this._assert(a !== b, {
        message: defined(msg, 'should not be equal'),
        operator: 'notEqual',
        actual: a,
        expected: b,
        extra: extra
    });
}
Test.prototype.notEqual
= Test.prototype.notEquals
= Test.prototype.notStrictEqual
= Test.prototype.notStrictEquals
= Test.prototype.isNotEqual
= Test.prototype.isNot
= Test.prototype.not
= Test.prototype.doesNotEqual
= Test.prototype.isInequal
= notEqual;

function tapeDeepEqual(a, b, msg, extra) {
    this._assert(deepEqual(a, b, { strict: true }), {
        message: defined(msg, 'should be equivalent'),
        operator: 'deepEqual',
        actual: a,
        expected: b,
        extra: extra
    });
}
Test.prototype.deepEqual
= Test.prototype.deepEquals
= Test.prototype.isEquivalent
= Test.prototype.same
= tapeDeepEqual;

function deepLooseEqual(a, b, msg, extra) {
    this._assert(deepEqual(a, b), {
        message: defined(msg, 'should be equivalent'),
        operator: 'deepLooseEqual',
        actual: a,
        expected: b,
        extra: extra
    });
}
Test.prototype.deepLooseEqual
= Test.prototype.looseEqual
= Test.prototype.looseEquals
= deepLooseEqual;

function notDeepEqual(a, b, msg, extra) {
    this._assert(!deepEqual(a, b, { strict: true }), {
        message: defined(msg, 'should not be equivalent'),
        operator: 'notDeepEqual',
        actual: a,
        expected: b,
        extra: extra
    });
}
Test.prototype.notDeepEqual
= Test.prototype.notDeepEquals
= Test.prototype.notEquivalent
= Test.prototype.notDeeply
= Test.prototype.notSame
= Test.prototype.isNotDeepEqual
= Test.prototype.isNotDeeply
= Test.prototype.isNotEquivalent
= Test.prototype.isInequivalent
= notDeepEqual;

function notDeepLooseEqual(a, b, msg, extra) {
    this._assert(!deepEqual(a, b), {
        message: defined(msg, 'should be equivalent'),
        operator: 'notDeepLooseEqual',
        actual: a,
        expected: b,
        extra: extra
    });
}
Test.prototype.notDeepLooseEqual
= Test.prototype.notLooseEqual
= Test.prototype.notLooseEquals
= notDeepLooseEqual;

Test.prototype['throws'] = function (fn, expected, msg, extra) {
    if (typeof expected === 'string') {
        msg = expected;
        expected = undefined;
    }

    var caught = undefined;

    try {
        fn();
    } catch (err) {
        caught = { error: err };
        if ((err != null) && (!isEnumerable(err, 'message') || !has(err, 'message'))) {
            var message = err.message;
            delete err.message;
            err.message = message;
        }
    }

    var passed = caught;

    if (isRegExp(expected)) {
        passed = expected.test(caught && caught.error);
        expected = String(expected);
    }

    if (typeof expected === 'function' && caught) {
        passed = caught.error instanceof expected;
    }

    this._assert(typeof fn === 'function' && passed, {
        message: defined(msg, 'should throw'),
        operator: 'throws',
        actual: caught && caught.error,
        expected: expected,
        error: !passed && caught && caught.error,
        extra: extra
    });
};

Test.prototype.doesNotThrow = function (fn, expected, msg, extra) {
    if (typeof expected === 'string') {
        msg = expected;
        expected = undefined;
    }
    var caught = undefined;
    try {
        fn();
    }
    catch (err) {
        caught = { error: err };
    }
    this._assert(!caught, {
        message: defined(msg, 'should not throw'),
        operator: 'throws',
        actual: caught && caught.error,
        expected: expected,
        error: caught && caught.error,
        extra: extra
    });
};

Test.prototype.match = function match(string, regexp, msg, extra) {
    if (!isRegExp(regexp)) {
        throw new TypeError('The "regexp" argument must be an instance of RegExp. Received type ' + typeof regexp + ' (' + inspect(regexp) + ')');
    }
    if (typeof string !== 'string') {
        throw new TypeError('The "string" argument must be of type string. Received type ' + typeof string + ' (' + inspect(string) + ')');
    }

    var matches = $test(regexp, string);
    this._assert(matches, {
        message: defined(msg, 'The input did not match the regular expression ' + inspect(regexp) + '. Input: ' + inspect(string)),
        operator: 'match',
        actual: string,
        expected: regexp,
        extra: extra
    });
};

Test.prototype.doesNotMatch = function doesNotMatch(string, regexp, msg, extra) {
    if (!isRegExp(regexp)) {
        throw new TypeError('The "regexp" argument must be an instance of RegExp. Received type ' + typeof regexp + ' (' + inspect(regexp) + ')');
    }
    if (typeof string !== 'string') {
        throw new TypeError('The "string" argument must be of type string. Received type ' + typeof string + ' (' + inspect(string) + ')');
    }
    var matches = $test(regexp, string);
    this._assert(!matches, {
        message: defined(msg, 'The input was expected to not match the regular expression ' + inspect(regexp) + '. Input: ' + inspect(string)),
        operator: 'doesNotMatch',
        actual: string,
        expected: regexp,
        extra: extra
    });
};

Test.skip = function (name_, _opts, _cb) {
    var args = getTestArgs.apply(null, arguments);
    args.opts.skip = true;
    return Test(args.name, args.opts, args.cb);
};

// vim: set softtabstop=4 shiftwidth=4:
#!/usr/bin/env node

var resolveModule = require('resolve').sync;
var resolvePath = require('path').resolve;
var readFileSync = require('fs').readFileSync;
var parseOpts = require('minimist');
var glob = require('glob');
var ignore = require('dotignore');

var opts = parseOpts(process.argv.slice(2), {
    alias: { r: 'require', i: 'ignore' },
    string: ['require', 'ignore'],
    default: { r: [], i: null }
});

var cwd = process.cwd();

if (typeof opts.require === 'string') {
    opts.require = [opts.require];
}

opts.require.forEach(function (module) {
    if (module) {
        /* This check ensures we ignore `-r ""`, trailing `-r`, or
         * other silly things the user might (inadvertently) be doing.
         */
        require(resolveModule(module, { basedir: cwd }));
    }
});

if (typeof opts.ignore === 'string') {
    try {
        var ignoreStr = readFileSync(resolvePath(cwd, opts.ignore || '.gitignore'), 'utf-8');
    } catch (e) {
        console.error(e.message);
        process.exit(2);
    }
    var matcher = ignore.createMatcher(ignoreStr);
}

opts._.forEach(function (arg) {
    // If glob does not match, `files` will be an empty array.
    // Note: `glob.sync` may throw an error and crash the node process.
    var files = glob.sync(arg);

    if (!Array.isArray(files)) {
        throw new TypeError('unknown error: glob.sync did not return an array or throw. Please report this.');
    }

    files.filter(function (file) { return !matcher || !matcher.shouldIgnore(file); }).forEach(function (file) {
        require(resolvePath(cwd, file));
    });
});

// vim: ft=javascript
{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "async-exit-hook": "^2.0.1",
    "fs-extra": "^8.1.0"
  },
  "deprecated": false,
  "description": "```typescript export function getTempName(prefix?: string | null | undefined): string;",
  "devDependencies": {
    "@types/fs-extra": "^8.1.0",
    "@types/js-yaml": "^3.12.2",
    "@types/node": "^13.7.7",
    "babel-preset-ts-node8": "^4.0.0",
    "ts-babel": "^6.1.7",
    "typescript": "^3.8.3"
  },
  "files": [
    "out"
  ],
  "homepage": "https://github.com/develar/temp-file",
  "license": "MIT",
  "main": "out/main.js",
  "name": "temp-file",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/develar/temp-file.git"
  },
  "typings": "./out/main.d.ts",
  "version": "3.3.7"
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getTempName = getTempName;
exports.TmpDir = void 0;

function _fsExtra() {
  const data = require("fs-extra");

  _fsExtra = function () {
    return data;
  };

  return data;
}

function _os() {
  const data = require("os");

  _os = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

let tmpFileCounter = 0;
const tmpDirManagers = new Set(); // add date to avoid use stale temp dir

const tempDirPrefix = `${process.pid.toString(36)}-${Date.now().toString(36)}`;

function getTempName(prefix) {
  return `${prefix == null ? "" : `${prefix}-`}${tempDirPrefix}-${(tmpFileCounter++).toString(36)}`;
}

let tempDirPromise;
let tempBaseDir;

function getBaseTempDir() {
  if (tempDirPromise != null) {
    return tempDirPromise;
  }

  if (tempBaseDir != null) {
    return Promise.resolve(tempBaseDir);
  }

  const systemTmpDir = process.env.APP_BUILDER_TMP_DIR || (0, _os().tmpdir)();
  const isEnsureRemovedOnExit = process.env.TMP_DIR_MANAGER_ENSURE_REMOVED_ON_EXIT !== "false";
  tempDirPromise = (0, _fsExtra().mkdtemp)(path.join(systemTmpDir, "t-")).then(it => (0, _fsExtra().realpath)(it)).then(dir => {
    if (isEnsureRemovedOnExit) {
      addExitHook(dir);
    }

    tempBaseDir = dir;
    return dir;
  });
  return tempDirPromise;
}

function addExitHook(dir) {
  require("async-exit-hook")(callback => {
    const managers = Array.from(tmpDirManagers);
    tmpDirManagers.clear();

    if (callback == null) {
      for (const manager of managers) {
        manager.cleanupSync();
      }

      try {
        (0, _fsExtra().removeSync)(dir);
      } catch (e) {
        handleError(e, dir);
      }

      return;
    }

    Promise.all(managers.map(it => it.cleanup())).then(() => (0, _fsExtra().remove)(dir)).then(() => callback()).catch(e => {
      try {
        handleError(e, dir);
      } finally {
        callback();
      }
    });
  });
}

function handleError(e, file) {
  if (e.code !== "EPERM" && e.code !== "ENOENT") {
    // use only console.* instead of our warn on exit (otherwise nodeEmoji can be required on request)
    console.warn(`Cannot delete temporary "${file}": ${(e.stack || e).toString()}`);
  }
}

class TmpDir {
  constructor(debugName = "") {
    this.debugName = debugName;
    this.tempFiles = [];
    this.registered = false;
  } // noinspection JSMethodCanBeStatic,JSUnusedGlobalSymbols


  get rootTempDir() {
    return getBaseTempDir();
  }

  getTempDir(options) {
    return this.getTempFile(options, true);
  }

  createTempDir(options) {
    return this.getTempFile(options, true).then(it => (0, _fsExtra().ensureDir)(it).then(() => it));
  }

  getTempFile(options, isDir = false) {
    return getBaseTempDir().then(baseTempDir => {
      if (!this.registered) {
        this.registered = true;
        tmpDirManagers.add(this);
      }

      const prefix = nullize(options == null ? null : options.prefix);
      const suffix = nullize(options == null ? null : options.suffix);
      const namePrefix = prefix == null ? "" : `${prefix}-`;
      const nameSuffix = suffix == null ? "" : suffix.startsWith(".") ? suffix : `-${suffix}`;
      const result = `${baseTempDir}${path.sep}${namePrefix}${(tmpFileCounter++).toString(36)}${nameSuffix}`;
      this.tempFiles.push({
        path: result,
        isDir,
        disposer: options == null ? null : options.disposer
      });
      return result;
    });
  }

  cleanupSync() {
    const tempFiles = this.tempFiles;
    tmpDirManagers.delete(this);
    this.registered = false;

    if (tempFiles.length === 0) {
      return;
    }

    this.tempFiles = [];

    for (const file of tempFiles) {
      if (file.disposer != null) {
        // noinspection JSIgnoredPromiseFromCall
        file.disposer(file.path);
        continue;
      }

      try {
        if (file.isDir) {
          (0, _fsExtra().removeSync)(file.path);
        } else {
          (0, _fsExtra().unlinkSync)(file.path);
        }
      } catch (e) {
        handleError(e, file.path);
      }
    }
  }

  cleanup() {
    const tempFiles = this.tempFiles;
    tmpDirManagers.delete(this);
    this.registered = false;

    if (tempFiles.length === 0) {
      return Promise.resolve();
    }

    this.tempFiles = [];

    if (tmpDirManagers.size === 0) {
      const dir = tempBaseDir;

      if (dir == null) {
        return Promise.resolve();
      }

      tempBaseDir = null;
      tempDirPromise = null;
      return (0, _fsExtra().remove)(dir);
    }

    return Promise.all(tempFiles.map(it => {
      if (it.disposer != null) {
        return it.disposer(it.path);
      }

      return (it.isDir ? (0, _fsExtra().remove)(it.path) : (0, _fsExtra().unlink)(it.path)).catch(e => {
        handleError(e, it.path);
      });
    }));
  }

  toString() {
    return this.debugName;
  }

}

exports.TmpDir = TmpDir;

function nullize(s) {
  return s == null || s.length === 0 ? null : s;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=main.js.map{"version":3,"sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["import {ensureDir, mkdtemp, realpath, remove, removeSync, unlink, unlinkSync} from \"fs-extra\"\nimport {tmpdir} from \"os\"\nimport * as path from \"path\"\n\nlet tmpFileCounter = 0\nconst tmpDirManagers = new Set<TmpDir>()\n\n// add date to avoid use stale temp dir\nconst tempDirPrefix = `${process.pid.toString(36)}-${Date.now().toString(36)}`\n\nexport function getTempName(prefix?: string | null | undefined): string {\n  return `${prefix == null ? \"\" : `${prefix}-`}${tempDirPrefix}-${(tmpFileCounter++).toString(36)}`\n}\n\nlet tempDirPromise: Promise<string> | null\nlet tempBaseDir: string | null\n\nfunction getBaseTempDir(): Promise<string> {\n  if (tempDirPromise != null) {\n    return tempDirPromise\n  }\n\n  if (tempBaseDir != null) {\n    return Promise.resolve(tempBaseDir)\n  }\n\n  const systemTmpDir = process.env.APP_BUILDER_TMP_DIR || tmpdir()\n  const isEnsureRemovedOnExit = process.env.TMP_DIR_MANAGER_ENSURE_REMOVED_ON_EXIT !== \"false\"\n  tempDirPromise = mkdtemp(path.join(systemTmpDir, \"t-\"))\n    .then(it => realpath(it))\n    .then(dir => {\n      if (isEnsureRemovedOnExit) {\n        addExitHook(dir)\n      }\n      tempBaseDir = dir\n      return dir\n    })\n  return tempDirPromise\n}\n\nfunction addExitHook(dir: string) {\n  require(\"async-exit-hook\")((callback: (() => void) | null) => {\n    const managers = Array.from(tmpDirManagers)\n    tmpDirManagers.clear()\n\n    if (callback == null) {\n      for (const manager of managers) {\n        manager.cleanupSync()\n      }\n\n      try {\n        removeSync(dir)\n      }\n      catch (e) {\n        handleError(e, dir)\n      }\n      return\n    }\n\n    Promise.all(managers.map(it => it.cleanup()))\n      .then(() => remove(dir))\n      .then(() => callback())\n      .catch(e => {\n        try {\n          handleError(e, dir)\n        }\n        finally {\n          callback()\n        }\n      })\n  })\n}\n\nfunction handleError(e: any, file: string) {\n  if (e.code !== \"EPERM\" && e.code !== \"ENOENT\") {\n    // use only console.* instead of our warn on exit (otherwise nodeEmoji can be required on request)\n    console.warn(`Cannot delete temporary \"${file}\": ${(e.stack || e).toString()}`)\n  }\n}\n\ninterface TempFileInfo {\n  isDir: boolean\n  path: string\n  disposer?: ((file: string) => Promise<void>) | null\n}\n\nexport interface GetTempFileOptions {\n  prefix?: string | null\n  suffix?: string | null\n\n  disposer?: ((file: string) => Promise<void>) | null\n}\n\nexport class TmpDir {\n  private tempFiles: Array<TempFileInfo> = []\n  private registered = false\n\n  constructor(private readonly debugName: string = \"\") {\n  }\n\n  // noinspection JSMethodCanBeStatic,JSUnusedGlobalSymbols\n  get rootTempDir(): Promise<string> {\n    return getBaseTempDir()\n  }\n\n  getTempDir(options?: GetTempFileOptions): Promise<string> {\n    return this.getTempFile(options, true)\n  }\n\n  createTempDir(options?: GetTempFileOptions): Promise<string> {\n    return this.getTempFile(options, true)\n      .then(it => ensureDir(it).then(() => it))\n  }\n\n  getTempFile(options?: GetTempFileOptions, isDir = false): Promise<string> {\n    return getBaseTempDir()\n      .then(baseTempDir => {\n        if (!this.registered) {\n          this.registered = true\n          tmpDirManagers.add(this)\n        }\n\n        const prefix = nullize(options == null ? null : options.prefix)\n        const suffix = nullize(options == null ? null : options.suffix)\n        const namePrefix = prefix == null ? \"\" : `${prefix}-`\n        const nameSuffix = suffix == null ? \"\" : (suffix.startsWith(\".\") ? suffix : `-${suffix}`)\n        const result = `${baseTempDir}${path.sep}${namePrefix}${(tmpFileCounter++).toString(36)}${nameSuffix}`\n        this.tempFiles.push({\n          path: result,\n          isDir,\n          disposer: options == null ? null : options.disposer,\n        })\n        return result\n      })\n  }\n\n  cleanupSync() {\n    const tempFiles = this.tempFiles\n    tmpDirManagers.delete(this)\n    this.registered = false\n    if (tempFiles.length === 0) {\n      return\n    }\n\n    this.tempFiles = []\n\n    for (const file of tempFiles) {\n      if (file.disposer != null) {\n        // noinspection JSIgnoredPromiseFromCall\n        file.disposer(file.path)\n        continue\n      }\n\n      try {\n        if (file.isDir) {\n          removeSync(file.path)\n        }\n        else {\n          unlinkSync(file.path)\n        }\n      }\n      catch (e) {\n        handleError(e, file.path)\n      }\n    }\n  }\n\n  cleanup(): Promise<any> {\n    const tempFiles = this.tempFiles\n    tmpDirManagers.delete(this)\n\n    this.registered = false\n    if (tempFiles.length === 0) {\n      return Promise.resolve()\n    }\n    this.tempFiles = []\n\n    if (tmpDirManagers.size === 0) {\n      const dir = tempBaseDir\n      if (dir == null) {\n        return Promise.resolve()\n      }\n\n      tempBaseDir = null\n      tempDirPromise = null\n      return remove(dir)\n    }\n\n    return Promise.all(tempFiles.map(it => {\n      if (it.disposer != null) {\n        return it.disposer(it.path)\n      }\n\n      return (it.isDir ? remove(it.path) : unlink(it.path))\n        .catch(e => {\n          handleError(e, it.path)\n        })\n    }))\n  }\n\n  toString() {\n    return this.debugName\n  }\n}\n\nfunction nullize(s?: string | null) {\n  return s == null || s.length === 0 ? null : s\n}"],"sourceRoot":""}
Apache License, Version 2.0

Copyright (c) 2011 Dominic Tarr

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
The MIT License

Copyright (c) 2011 Dominic Tarr

Permission is hereby granted, free of charge, 
to any person obtaining a copy of this software and 
associated documentation files (the "Software"), to 
deal in the Software without restriction, including 
without limitation the rights to use, copy, modify, 
merge, publish, distribute, sublicense, and/or sell 
copies of the Software, and to permit persons to whom 
the Software is furnished to do so, 
subject to the following conditions:

The above copyright notice and this permission notice 
shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR 
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
var Stream = require('stream')

// through
//
// a stream that does nothing but re-emit the input.
// useful for aggregating a series of changing but not ending streams into one stream)

exports = module.exports = through
through.through = through

//create a readable writable stream.

function through (write, end, opts) {
  write = write || function (data) { this.queue(data) }
  end = end || function () { this.queue(null) }

  var ended = false, destroyed = false, buffer = [], _ended = false
  var stream = new Stream()
  stream.readable = stream.writable = true
  stream.paused = false

//  stream.autoPause   = !(opts && opts.autoPause   === false)
  stream.autoDestroy = !(opts && opts.autoDestroy === false)

  stream.write = function (data) {
    write.call(this, data)
    return !stream.paused
  }

  function drain() {
    while(buffer.length && !stream.paused) {
      var data = buffer.shift()
      if(null === data)
        return stream.emit('end')
      else
        stream.emit('data', data)
    }
  }

  stream.queue = stream.push = function (data) {
//    console.error(ended)
    if(_ended) return stream
    if(data === null) _ended = true
    buffer.push(data)
    drain()
    return stream
  }

  //this will be registered as the first 'end' listener
  //must call destroy next tick, to make sure we're after any
  //stream piped from here.
  //this is only a problem if end is not emitted synchronously.
  //a nicer way to do this is to make sure this is the last listener for 'end'

  stream.on('end', function () {
    stream.readable = false
    if(!stream.writable && stream.autoDestroy)
      process.nextTick(function () {
        stream.destroy()
      })
  })

  function _end () {
    stream.writable = false
    end.call(stream)
    if(!stream.readable && stream.autoDestroy)
      stream.destroy()
  }

  stream.end = function (data) {
    if(ended) return
    ended = true
    if(arguments.length) stream.write(data)
    _end() // will emit or queue
    return stream
  }

  stream.destroy = function () {
    if(destroyed) return
    destroyed = true
    ended = true
    buffer.length = 0
    stream.writable = stream.readable = false
    stream.emit('close')
    return stream
  }

  stream.pause = function () {
    if(stream.paused) return
    stream.paused = true
    return stream
  }

  stream.resume = function () {
    if(stream.paused) {
      stream.paused = false
      stream.emit('resume')
    }
    drain()
    //may have become paused again,
    //as drain emits 'data'.
    if(!stream.paused)
      stream.emit('drain')
    return stream
  }
  return stream
}

{
  "author": {
    "name": "Dominic Tarr",
    "email": "dominic.tarr@gmail.com",
    "url": "dominictarr.com"
  },
  "deprecated": false,
  "description": "simplified stream construction",
  "devDependencies": {
    "from": "~0.1.3",
    "stream-spec": "~0.3.5",
    "tape": "~2.3.2"
  },
  "homepage": "https://github.com/dominictarr/through",
  "license": "MIT",
  "main": "index.js",
  "name": "through",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/dominictarr/through.git"
  },
  "testling": {
    "browsers": [
      "ie/8..latest",
      "ff/15..latest",
      "chrome/20..latest",
      "safari/5.1..latest"
    ],
    "files": "test/*.js"
  },
  "version": "2.3.8"
}[submodule "vendor/big-list-of-naughty-strings"]
	path = vendor/big-list-of-naughty-strings
	url = https://github.com/minimaxir/big-list-of-naughty-strings.git
Carl Xiong <xiongc05@gmail.com>
Parsha Pourkhomami <parshap@gmail.com>
'use strict';

var truncate = require("./lib/truncate");
var getLength = require("utf8-byte-length/browser");
module.exports = truncate.bind(null, getLength);
'use strict';

var truncate = require("./lib/truncate");
var getLength = Buffer.byteLength.bind(Buffer);
module.exports = truncate.bind(null, getLength);
{
  "author": {
    "name": "Carl Xiong",
    "email": "xiongc05@gmail.com"
  },
  "browser": "browser.js",
  "dependencies": {
    "utf8-byte-length": "^1.0.1"
  },
  "deprecated": false,
  "description": "Truncate string to given length in bytes",
  "devDependencies": {
    "tape": "^4.2.2"
  },
  "homepage": "https://github.com/parshap/truncate-utf8-bytes#readme",
  "license": "WTFPL",
  "main": "index.js",
  "name": "truncate-utf8-bytes",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/parshap/truncate-utf8-bytes.git"
  },
  "version": "1.0.2"
}'use strict';

function isHighSurrogate(codePoint) {
  return codePoint >= 0xd800 && codePoint <= 0xdbff;
}

function isLowSurrogate(codePoint) {
  return codePoint >= 0xdc00 && codePoint <= 0xdfff;
}

// Truncate string by size in bytes
module.exports = function truncate(getLength, string, byteLength) {
  if (typeof string !== "string") {
    throw new Error("Input must be string");
  }

  var charLength = string.length;
  var curByteLength = 0;
  var codePoint;
  var segment;

  for (var i = 0; i < charLength; i += 1) {
    codePoint = string.charCodeAt(i);
    segment = string[i];

    if (isHighSurrogate(codePoint) && isLowSurrogate(string.charCodeAt(i + 1))) {
      i += 1;
      segment += string[i];
    }

    curByteLength += getLength(segment);

    if (curByteLength === byteLength) {
      return string.slice(0, i + 1);
    }
    else if (curByteLength > byteLength) {
      return string.slice(0, i - segment.length + 1);
    }
  }

  return string;
};

List of TweetNaCl.js authors
============================

    Alphabetical order by first name.
    Format: Name (GitHub username or URL)

* AndSDev (@AndSDev)
* Devi Mandiri (@devi)
* Dmitry Chestnykh (@dchest)

List of authors of third-party public domain code from which TweetNaCl.js code was derived
==========================================================================================

[TweetNaCl](http://tweetnacl.cr.yp.to/)
--------------------------------------

* Bernard van Gastel
* Daniel J. Bernstein <http://cr.yp.to/djb.html>
* Peter Schwabe <http://www.cryptojedi.org/users/peter/>
* Sjaak Smetsers <http://www.cs.ru.nl/~sjakie/>
* Tanja Lange <http://hyperelliptic.org/tanja>
* Wesley Janssen


[Poly1305-donna](https://github.com/floodyberry/poly1305-donna)
--------------------------------------------------------------

* Andrew Moon (@floodyberry)
This is free and unencumbered software released into the public domain.

Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.

In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

For more information, please refer to <http://unlicense.org>
# Important!

If your contribution is not trivial (not a typo fix, etc.), we can only accept
it if you dedicate your copyright for the contribution to the public domain.
Make sure you understand what it means (see http://unlicense.org/)! If you
agree, please add yourself to AUTHORS.md file, and include the following text
to your pull request description or a comment in it:

------------------------------------------------------------------------------

    I dedicate any and all copyright interest in this software to the
    public domain. I make this dedication for the benefit of the public at
    large and to the detriment of my heirs and successors. I intend this
    dedication to be an overt act of relinquishment in perpetuity of all
    present and future rights to this software under copyright law.

    Anyone is free to copy, modify, publish, use, compile, sell, or
    distribute this software, either in source code form or as a compiled
    binary, for any purpose, commercial or non-commercial, and by any
    means.
(function(nacl) {
'use strict';

// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri.
// Public domain.
//
// Implementation derived from TweetNaCl version 20140427.
// See for details: http://tweetnacl.cr.yp.to/

var gf = function(init) {
  var i, r = new Float64Array(16);
  if (init) for (i = 0; i < init.length; i++) r[i] = init[i];
  return r;
};

//  Pluggable, initialized in high-level API below.
var randombytes = function(/* x, n */) { throw new Error('no PRNG'); };

var _0 = new Uint8Array(16);
var _9 = new Uint8Array(32); _9[0] = 9;

var gf0 = gf(),
    gf1 = gf([1]),
    _121665 = gf([0xdb41, 1]),
    D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),
    D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),
    X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),
    Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),
    I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);

function ts64(x, i, h, l) {
  x[i]   = (h >> 24) & 0xff;
  x[i+1] = (h >> 16) & 0xff;
  x[i+2] = (h >>  8) & 0xff;
  x[i+3] = h & 0xff;
  x[i+4] = (l >> 24)  & 0xff;
  x[i+5] = (l >> 16)  & 0xff;
  x[i+6] = (l >>  8)  & 0xff;
  x[i+7] = l & 0xff;
}

function vn(x, xi, y, yi, n) {
  var i,d = 0;
  for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i];
  return (1 & ((d - 1) >>> 8)) - 1;
}

function crypto_verify_16(x, xi, y, yi) {
  return vn(x,xi,y,yi,16);
}

function crypto_verify_32(x, xi, y, yi) {
  return vn(x,xi,y,yi,32);
}

function core_salsa20(o, p, k, c) {
  var j0  = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,
      j1  = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,
      j2  = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,
      j3  = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,
      j4  = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,
      j5  = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,
      j6  = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,
      j7  = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,
      j8  = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,
      j9  = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,
      j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,
      j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,
      j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,
      j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,
      j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,
      j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;

  var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,
      x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,
      x15 = j15, u;

  for (var i = 0; i < 20; i += 2) {
    u = x0 + x12 | 0;
    x4 ^= u<<7 | u>>>(32-7);
    u = x4 + x0 | 0;
    x8 ^= u<<9 | u>>>(32-9);
    u = x8 + x4 | 0;
    x12 ^= u<<13 | u>>>(32-13);
    u = x12 + x8 | 0;
    x0 ^= u<<18 | u>>>(32-18);

    u = x5 + x1 | 0;
    x9 ^= u<<7 | u>>>(32-7);
    u = x9 + x5 | 0;
    x13 ^= u<<9 | u>>>(32-9);
    u = x13 + x9 | 0;
    x1 ^= u<<13 | u>>>(32-13);
    u = x1 + x13 | 0;
    x5 ^= u<<18 | u>>>(32-18);

    u = x10 + x6 | 0;
    x14 ^= u<<7 | u>>>(32-7);
    u = x14 + x10 | 0;
    x2 ^= u<<9 | u>>>(32-9);
    u = x2 + x14 | 0;
    x6 ^= u<<13 | u>>>(32-13);
    u = x6 + x2 | 0;
    x10 ^= u<<18 | u>>>(32-18);

    u = x15 + x11 | 0;
    x3 ^= u<<7 | u>>>(32-7);
    u = x3 + x15 | 0;
    x7 ^= u<<9 | u>>>(32-9);
    u = x7 + x3 | 0;
    x11 ^= u<<13 | u>>>(32-13);
    u = x11 + x7 | 0;
    x15 ^= u<<18 | u>>>(32-18);

    u = x0 + x3 | 0;
    x1 ^= u<<7 | u>>>(32-7);
    u = x1 + x0 | 0;
    x2 ^= u<<9 | u>>>(32-9);
    u = x2 + x1 | 0;
    x3 ^= u<<13 | u>>>(32-13);
    u = x3 + x2 | 0;
    x0 ^= u<<18 | u>>>(32-18);

    u = x5 + x4 | 0;
    x6 ^= u<<7 | u>>>(32-7);
    u = x6 + x5 | 0;
    x7 ^= u<<9 | u>>>(32-9);
    u = x7 + x6 | 0;
    x4 ^= u<<13 | u>>>(32-13);
    u = x4 + x7 | 0;
    x5 ^= u<<18 | u>>>(32-18);

    u = x10 + x9 | 0;
    x11 ^= u<<7 | u>>>(32-7);
    u = x11 + x10 | 0;
    x8 ^= u<<9 | u>>>(32-9);
    u = x8 + x11 | 0;
    x9 ^= u<<13 | u>>>(32-13);
    u = x9 + x8 | 0;
    x10 ^= u<<18 | u>>>(32-18);

    u = x15 + x14 | 0;
    x12 ^= u<<7 | u>>>(32-7);
    u = x12 + x15 | 0;
    x13 ^= u<<9 | u>>>(32-9);
    u = x13 + x12 | 0;
    x14 ^= u<<13 | u>>>(32-13);
    u = x14 + x13 | 0;
    x15 ^= u<<18 | u>>>(32-18);
  }
   x0 =  x0 +  j0 | 0;
   x1 =  x1 +  j1 | 0;
   x2 =  x2 +  j2 | 0;
   x3 =  x3 +  j3 | 0;
   x4 =  x4 +  j4 | 0;
   x5 =  x5 +  j5 | 0;
   x6 =  x6 +  j6 | 0;
   x7 =  x7 +  j7 | 0;
   x8 =  x8 +  j8 | 0;
   x9 =  x9 +  j9 | 0;
  x10 = x10 + j10 | 0;
  x11 = x11 + j11 | 0;
  x12 = x12 + j12 | 0;
  x13 = x13 + j13 | 0;
  x14 = x14 + j14 | 0;
  x15 = x15 + j15 | 0;

  o[ 0] = x0 >>>  0 & 0xff;
  o[ 1] = x0 >>>  8 & 0xff;
  o[ 2] = x0 >>> 16 & 0xff;
  o[ 3] = x0 >>> 24 & 0xff;

  o[ 4] = x1 >>>  0 & 0xff;
  o[ 5] = x1 >>>  8 & 0xff;
  o[ 6] = x1 >>> 16 & 0xff;
  o[ 7] = x1 >>> 24 & 0xff;

  o[ 8] = x2 >>>  0 & 0xff;
  o[ 9] = x2 >>>  8 & 0xff;
  o[10] = x2 >>> 16 & 0xff;
  o[11] = x2 >>> 24 & 0xff;

  o[12] = x3 >>>  0 & 0xff;
  o[13] = x3 >>>  8 & 0xff;
  o[14] = x3 >>> 16 & 0xff;
  o[15] = x3 >>> 24 & 0xff;

  o[16] = x4 >>>  0 & 0xff;
  o[17] = x4 >>>  8 & 0xff;
  o[18] = x4 >>> 16 & 0xff;
  o[19] = x4 >>> 24 & 0xff;

  o[20] = x5 >>>  0 & 0xff;
  o[21] = x5 >>>  8 & 0xff;
  o[22] = x5 >>> 16 & 0xff;
  o[23] = x5 >>> 24 & 0xff;

  o[24] = x6 >>>  0 & 0xff;
  o[25] = x6 >>>  8 & 0xff;
  o[26] = x6 >>> 16 & 0xff;
  o[27] = x6 >>> 24 & 0xff;

  o[28] = x7 >>>  0 & 0xff;
  o[29] = x7 >>>  8 & 0xff;
  o[30] = x7 >>> 16 & 0xff;
  o[31] = x7 >>> 24 & 0xff;

  o[32] = x8 >>>  0 & 0xff;
  o[33] = x8 >>>  8 & 0xff;
  o[34] = x8 >>> 16 & 0xff;
  o[35] = x8 >>> 24 & 0xff;

  o[36] = x9 >>>  0 & 0xff;
  o[37] = x9 >>>  8 & 0xff;
  o[38] = x9 >>> 16 & 0xff;
  o[39] = x9 >>> 24 & 0xff;

  o[40] = x10 >>>  0 & 0xff;
  o[41] = x10 >>>  8 & 0xff;
  o[42] = x10 >>> 16 & 0xff;
  o[43] = x10 >>> 24 & 0xff;

  o[44] = x11 >>>  0 & 0xff;
  o[45] = x11 >>>  8 & 0xff;
  o[46] = x11 >>> 16 & 0xff;
  o[47] = x11 >>> 24 & 0xff;

  o[48] = x12 >>>  0 & 0xff;
  o[49] = x12 >>>  8 & 0xff;
  o[50] = x12 >>> 16 & 0xff;
  o[51] = x12 >>> 24 & 0xff;

  o[52] = x13 >>>  0 & 0xff;
  o[53] = x13 >>>  8 & 0xff;
  o[54] = x13 >>> 16 & 0xff;
  o[55] = x13 >>> 24 & 0xff;

  o[56] = x14 >>>  0 & 0xff;
  o[57] = x14 >>>  8 & 0xff;
  o[58] = x14 >>> 16 & 0xff;
  o[59] = x14 >>> 24 & 0xff;

  o[60] = x15 >>>  0 & 0xff;
  o[61] = x15 >>>  8 & 0xff;
  o[62] = x15 >>> 16 & 0xff;
  o[63] = x15 >>> 24 & 0xff;
}

function core_hsalsa20(o,p,k,c) {
  var j0  = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,
      j1  = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,
      j2  = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,
      j3  = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,
      j4  = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,
      j5  = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,
      j6  = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,
      j7  = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,
      j8  = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,
      j9  = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,
      j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,
      j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,
      j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,
      j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,
      j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,
      j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;

  var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,
      x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,
      x15 = j15, u;

  for (var i = 0; i < 20; i += 2) {
    u = x0 + x12 | 0;
    x4 ^= u<<7 | u>>>(32-7);
    u = x4 + x0 | 0;
    x8 ^= u<<9 | u>>>(32-9);
    u = x8 + x4 | 0;
    x12 ^= u<<13 | u>>>(32-13);
    u = x12 + x8 | 0;
    x0 ^= u<<18 | u>>>(32-18);

    u = x5 + x1 | 0;
    x9 ^= u<<7 | u>>>(32-7);
    u = x9 + x5 | 0;
    x13 ^= u<<9 | u>>>(32-9);
    u = x13 + x9 | 0;
    x1 ^= u<<13 | u>>>(32-13);
    u = x1 + x13 | 0;
    x5 ^= u<<18 | u>>>(32-18);

    u = x10 + x6 | 0;
    x14 ^= u<<7 | u>>>(32-7);
    u = x14 + x10 | 0;
    x2 ^= u<<9 | u>>>(32-9);
    u = x2 + x14 | 0;
    x6 ^= u<<13 | u>>>(32-13);
    u = x6 + x2 | 0;
    x10 ^= u<<18 | u>>>(32-18);

    u = x15 + x11 | 0;
    x3 ^= u<<7 | u>>>(32-7);
    u = x3 + x15 | 0;
    x7 ^= u<<9 | u>>>(32-9);
    u = x7 + x3 | 0;
    x11 ^= u<<13 | u>>>(32-13);
    u = x11 + x7 | 0;
    x15 ^= u<<18 | u>>>(32-18);

    u = x0 + x3 | 0;
    x1 ^= u<<7 | u>>>(32-7);
    u = x1 + x0 | 0;
    x2 ^= u<<9 | u>>>(32-9);
    u = x2 + x1 | 0;
    x3 ^= u<<13 | u>>>(32-13);
    u = x3 + x2 | 0;
    x0 ^= u<<18 | u>>>(32-18);

    u = x5 + x4 | 0;
    x6 ^= u<<7 | u>>>(32-7);
    u = x6 + x5 | 0;
    x7 ^= u<<9 | u>>>(32-9);
    u = x7 + x6 | 0;
    x4 ^= u<<13 | u>>>(32-13);
    u = x4 + x7 | 0;
    x5 ^= u<<18 | u>>>(32-18);

    u = x10 + x9 | 0;
    x11 ^= u<<7 | u>>>(32-7);
    u = x11 + x10 | 0;
    x8 ^= u<<9 | u>>>(32-9);
    u = x8 + x11 | 0;
    x9 ^= u<<13 | u>>>(32-13);
    u = x9 + x8 | 0;
    x10 ^= u<<18 | u>>>(32-18);

    u = x15 + x14 | 0;
    x12 ^= u<<7 | u>>>(32-7);
    u = x12 + x15 | 0;
    x13 ^= u<<9 | u>>>(32-9);
    u = x13 + x12 | 0;
    x14 ^= u<<13 | u>>>(32-13);
    u = x14 + x13 | 0;
    x15 ^= u<<18 | u>>>(32-18);
  }

  o[ 0] = x0 >>>  0 & 0xff;
  o[ 1] = x0 >>>  8 & 0xff;
  o[ 2] = x0 >>> 16 & 0xff;
  o[ 3] = x0 >>> 24 & 0xff;

  o[ 4] = x5 >>>  0 & 0xff;
  o[ 5] = x5 >>>  8 & 0xff;
  o[ 6] = x5 >>> 16 & 0xff;
  o[ 7] = x5 >>> 24 & 0xff;

  o[ 8] = x10 >>>  0 & 0xff;
  o[ 9] = x10 >>>  8 & 0xff;
  o[10] = x10 >>> 16 & 0xff;
  o[11] = x10 >>> 24 & 0xff;

  o[12] = x15 >>>  0 & 0xff;
  o[13] = x15 >>>  8 & 0xff;
  o[14] = x15 >>> 16 & 0xff;
  o[15] = x15 >>> 24 & 0xff;

  o[16] = x6 >>>  0 & 0xff;
  o[17] = x6 >>>  8 & 0xff;
  o[18] = x6 >>> 16 & 0xff;
  o[19] = x6 >>> 24 & 0xff;

  o[20] = x7 >>>  0 & 0xff;
  o[21] = x7 >>>  8 & 0xff;
  o[22] = x7 >>> 16 & 0xff;
  o[23] = x7 >>> 24 & 0xff;

  o[24] = x8 >>>  0 & 0xff;
  o[25] = x8 >>>  8 & 0xff;
  o[26] = x8 >>> 16 & 0xff;
  o[27] = x8 >>> 24 & 0xff;

  o[28] = x9 >>>  0 & 0xff;
  o[29] = x9 >>>  8 & 0xff;
  o[30] = x9 >>> 16 & 0xff;
  o[31] = x9 >>> 24 & 0xff;
}

function crypto_core_salsa20(out,inp,k,c) {
  core_salsa20(out,inp,k,c);
}

function crypto_core_hsalsa20(out,inp,k,c) {
  core_hsalsa20(out,inp,k,c);
}

var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);
            // "expand 32-byte k"

function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) {
  var z = new Uint8Array(16), x = new Uint8Array(64);
  var u, i;
  for (i = 0; i < 16; i++) z[i] = 0;
  for (i = 0; i < 8; i++) z[i] = n[i];
  while (b >= 64) {
    crypto_core_salsa20(x,z,k,sigma);
    for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i];
    u = 1;
    for (i = 8; i < 16; i++) {
      u = u + (z[i] & 0xff) | 0;
      z[i] = u & 0xff;
      u >>>= 8;
    }
    b -= 64;
    cpos += 64;
    mpos += 64;
  }
  if (b > 0) {
    crypto_core_salsa20(x,z,k,sigma);
    for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i];
  }
  return 0;
}

function crypto_stream_salsa20(c,cpos,b,n,k) {
  var z = new Uint8Array(16), x = new Uint8Array(64);
  var u, i;
  for (i = 0; i < 16; i++) z[i] = 0;
  for (i = 0; i < 8; i++) z[i] = n[i];
  while (b >= 64) {
    crypto_core_salsa20(x,z,k,sigma);
    for (i = 0; i < 64; i++) c[cpos+i] = x[i];
    u = 1;
    for (i = 8; i < 16; i++) {
      u = u + (z[i] & 0xff) | 0;
      z[i] = u & 0xff;
      u >>>= 8;
    }
    b -= 64;
    cpos += 64;
  }
  if (b > 0) {
    crypto_core_salsa20(x,z,k,sigma);
    for (i = 0; i < b; i++) c[cpos+i] = x[i];
  }
  return 0;
}

function crypto_stream(c,cpos,d,n,k) {
  var s = new Uint8Array(32);
  crypto_core_hsalsa20(s,n,k,sigma);
  var sn = new Uint8Array(8);
  for (var i = 0; i < 8; i++) sn[i] = n[i+16];
  return crypto_stream_salsa20(c,cpos,d,sn,s);
}

function crypto_stream_xor(c,cpos,m,mpos,d,n,k) {
  var s = new Uint8Array(32);
  crypto_core_hsalsa20(s,n,k,sigma);
  var sn = new Uint8Array(8);
  for (var i = 0; i < 8; i++) sn[i] = n[i+16];
  return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s);
}

/*
* Port of Andrew Moon's Poly1305-donna-16. Public domain.
* https://github.com/floodyberry/poly1305-donna
*/

var poly1305 = function(key) {
  this.buffer = new Uint8Array(16);
  this.r = new Uint16Array(10);
  this.h = new Uint16Array(10);
  this.pad = new Uint16Array(8);
  this.leftover = 0;
  this.fin = 0;

  var t0, t1, t2, t3, t4, t5, t6, t7;

  t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0                     ) & 0x1fff;
  t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 <<  3)) & 0x1fff;
  t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 <<  6)) & 0x1f03;
  t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>>  7) | (t3 <<  9)) & 0x1fff;
  t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>>  4) | (t4 << 12)) & 0x00ff;
  this.r[5] = ((t4 >>>  1)) & 0x1ffe;
  t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 <<  2)) & 0x1fff;
  t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 <<  5)) & 0x1f81;
  t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>>  8) | (t7 <<  8)) & 0x1fff;
  this.r[9] = ((t7 >>>  5)) & 0x007f;

  this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8;
  this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8;
  this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8;
  this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8;
  this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8;
  this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8;
  this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8;
  this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8;
};

poly1305.prototype.blocks = function(m, mpos, bytes) {
  var hibit = this.fin ? 0 : (1 << 11);
  var t0, t1, t2, t3, t4, t5, t6, t7, c;
  var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9;

  var h0 = this.h[0],
      h1 = this.h[1],
      h2 = this.h[2],
      h3 = this.h[3],
      h4 = this.h[4],
      h5 = this.h[5],
      h6 = this.h[6],
      h7 = this.h[7],
      h8 = this.h[8],
      h9 = this.h[9];

  var r0 = this.r[0],
      r1 = this.r[1],
      r2 = this.r[2],
      r3 = this.r[3],
      r4 = this.r[4],
      r5 = this.r[5],
      r6 = this.r[6],
      r7 = this.r[7],
      r8 = this.r[8],
      r9 = this.r[9];

  while (bytes >= 16) {
    t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0                     ) & 0x1fff;
    t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 <<  3)) & 0x1fff;
    t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 <<  6)) & 0x1fff;
    t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>>  7) | (t3 <<  9)) & 0x1fff;
    t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>>  4) | (t4 << 12)) & 0x1fff;
    h5 += ((t4 >>>  1)) & 0x1fff;
    t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 <<  2)) & 0x1fff;
    t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 <<  5)) & 0x1fff;
    t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>>  8) | (t7 <<  8)) & 0x1fff;
    h9 += ((t7 >>> 5)) | hibit;

    c = 0;

    d0 = c;
    d0 += h0 * r0;
    d0 += h1 * (5 * r9);
    d0 += h2 * (5 * r8);
    d0 += h3 * (5 * r7);
    d0 += h4 * (5 * r6);
    c = (d0 >>> 13); d0 &= 0x1fff;
    d0 += h5 * (5 * r5);
    d0 += h6 * (5 * r4);
    d0 += h7 * (5 * r3);
    d0 += h8 * (5 * r2);
    d0 += h9 * (5 * r1);
    c += (d0 >>> 13); d0 &= 0x1fff;

    d1 = c;
    d1 += h0 * r1;
    d1 += h1 * r0;
    d1 += h2 * (5 * r9);
    d1 += h3 * (5 * r8);
    d1 += h4 * (5 * r7);
    c = (d1 >>> 13); d1 &= 0x1fff;
    d1 += h5 * (5 * r6);
    d1 += h6 * (5 * r5);
    d1 += h7 * (5 * r4);
    d1 += h8 * (5 * r3);
    d1 += h9 * (5 * r2);
    c += (d1 >>> 13); d1 &= 0x1fff;

    d2 = c;
    d2 += h0 * r2;
    d2 += h1 * r1;
    d2 += h2 * r0;
    d2 += h3 * (5 * r9);
    d2 += h4 * (5 * r8);
    c = (d2 >>> 13); d2 &= 0x1fff;
    d2 += h5 * (5 * r7);
    d2 += h6 * (5 * r6);
    d2 += h7 * (5 * r5);
    d2 += h8 * (5 * r4);
    d2 += h9 * (5 * r3);
    c += (d2 >>> 13); d2 &= 0x1fff;

    d3 = c;
    d3 += h0 * r3;
    d3 += h1 * r2;
    d3 += h2 * r1;
    d3 += h3 * r0;
    d3 += h4 * (5 * r9);
    c = (d3 >>> 13); d3 &= 0x1fff;
    d3 += h5 * (5 * r8);
    d3 += h6 * (5 * r7);
    d3 += h7 * (5 * r6);
    d3 += h8 * (5 * r5);
    d3 += h9 * (5 * r4);
    c += (d3 >>> 13); d3 &= 0x1fff;

    d4 = c;
    d4 += h0 * r4;
    d4 += h1 * r3;
    d4 += h2 * r2;
    d4 += h3 * r1;
    d4 += h4 * r0;
    c = (d4 >>> 13); d4 &= 0x1fff;
    d4 += h5 * (5 * r9);
    d4 += h6 * (5 * r8);
    d4 += h7 * (5 * r7);
    d4 += h8 * (5 * r6);
    d4 += h9 * (5 * r5);
    c += (d4 >>> 13); d4 &= 0x1fff;

    d5 = c;
    d5 += h0 * r5;
    d5 += h1 * r4;
    d5 += h2 * r3;
    d5 += h3 * r2;
    d5 += h4 * r1;
    c = (d5 >>> 13); d5 &= 0x1fff;
    d5 += h5 * r0;
    d5 += h6 * (5 * r9);
    d5 += h7 * (5 * r8);
    d5 += h8 * (5 * r7);
    d5 += h9 * (5 * r6);
    c += (d5 >>> 13); d5 &= 0x1fff;

    d6 = c;
    d6 += h0 * r6;
    d6 += h1 * r5;
    d6 += h2 * r4;
    d6 += h3 * r3;
    d6 += h4 * r2;
    c = (d6 >>> 13); d6 &= 0x1fff;
    d6 += h5 * r1;
    d6 += h6 * r0;
    d6 += h7 * (5 * r9);
    d6 += h8 * (5 * r8);
    d6 += h9 * (5 * r7);
    c += (d6 >>> 13); d6 &= 0x1fff;

    d7 = c;
    d7 += h0 * r7;
    d7 += h1 * r6;
    d7 += h2 * r5;
    d7 += h3 * r4;
    d7 += h4 * r3;
    c = (d7 >>> 13); d7 &= 0x1fff;
    d7 += h5 * r2;
    d7 += h6 * r1;
    d7 += h7 * r0;
    d7 += h8 * (5 * r9);
    d7 += h9 * (5 * r8);
    c += (d7 >>> 13); d7 &= 0x1fff;

    d8 = c;
    d8 += h0 * r8;
    d8 += h1 * r7;
    d8 += h2 * r6;
    d8 += h3 * r5;
    d8 += h4 * r4;
    c = (d8 >>> 13); d8 &= 0x1fff;
    d8 += h5 * r3;
    d8 += h6 * r2;
    d8 += h7 * r1;
    d8 += h8 * r0;
    d8 += h9 * (5 * r9);
    c += (d8 >>> 13); d8 &= 0x1fff;

    d9 = c;
    d9 += h0 * r9;
    d9 += h1 * r8;
    d9 += h2 * r7;
    d9 += h3 * r6;
    d9 += h4 * r5;
    c = (d9 >>> 13); d9 &= 0x1fff;
    d9 += h5 * r4;
    d9 += h6 * r3;
    d9 += h7 * r2;
    d9 += h8 * r1;
    d9 += h9 * r0;
    c += (d9 >>> 13); d9 &= 0x1fff;

    c = (((c << 2) + c)) | 0;
    c = (c + d0) | 0;
    d0 = c & 0x1fff;
    c = (c >>> 13);
    d1 += c;

    h0 = d0;
    h1 = d1;
    h2 = d2;
    h3 = d3;
    h4 = d4;
    h5 = d5;
    h6 = d6;
    h7 = d7;
    h8 = d8;
    h9 = d9;

    mpos += 16;
    bytes -= 16;
  }
  this.h[0] = h0;
  this.h[1] = h1;
  this.h[2] = h2;
  this.h[3] = h3;
  this.h[4] = h4;
  this.h[5] = h5;
  this.h[6] = h6;
  this.h[7] = h7;
  this.h[8] = h8;
  this.h[9] = h9;
};

poly1305.prototype.finish = function(mac, macpos) {
  var g = new Uint16Array(10);
  var c, mask, f, i;

  if (this.leftover) {
    i = this.leftover;
    this.buffer[i++] = 1;
    for (; i < 16; i++) this.buffer[i] = 0;
    this.fin = 1;
    this.blocks(this.buffer, 0, 16);
  }

  c = this.h[1] >>> 13;
  this.h[1] &= 0x1fff;
  for (i = 2; i < 10; i++) {
    this.h[i] += c;
    c = this.h[i] >>> 13;
    this.h[i] &= 0x1fff;
  }
  this.h[0] += (c * 5);
  c = this.h[0] >>> 13;
  this.h[0] &= 0x1fff;
  this.h[1] += c;
  c = this.h[1] >>> 13;
  this.h[1] &= 0x1fff;
  this.h[2] += c;

  g[0] = this.h[0] + 5;
  c = g[0] >>> 13;
  g[0] &= 0x1fff;
  for (i = 1; i < 10; i++) {
    g[i] = this.h[i] + c;
    c = g[i] >>> 13;
    g[i] &= 0x1fff;
  }
  g[9] -= (1 << 13);

  mask = (c ^ 1) - 1;
  for (i = 0; i < 10; i++) g[i] &= mask;
  mask = ~mask;
  for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i];

  this.h[0] = ((this.h[0]       ) | (this.h[1] << 13)                    ) & 0xffff;
  this.h[1] = ((this.h[1] >>>  3) | (this.h[2] << 10)                    ) & 0xffff;
  this.h[2] = ((this.h[2] >>>  6) | (this.h[3] <<  7)                    ) & 0xffff;
  this.h[3] = ((this.h[3] >>>  9) | (this.h[4] <<  4)                    ) & 0xffff;
  this.h[4] = ((this.h[4] >>> 12) | (this.h[5] <<  1) | (this.h[6] << 14)) & 0xffff;
  this.h[5] = ((this.h[6] >>>  2) | (this.h[7] << 11)                    ) & 0xffff;
  this.h[6] = ((this.h[7] >>>  5) | (this.h[8] <<  8)                    ) & 0xffff;
  this.h[7] = ((this.h[8] >>>  8) | (this.h[9] <<  5)                    ) & 0xffff;

  f = this.h[0] + this.pad[0];
  this.h[0] = f & 0xffff;
  for (i = 1; i < 8; i++) {
    f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0;
    this.h[i] = f & 0xffff;
  }

  mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff;
  mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff;
  mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff;
  mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff;
  mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff;
  mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff;
  mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff;
  mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff;
  mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff;
  mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff;
  mac[macpos+10] = (this.h[5] >>> 0) & 0xff;
  mac[macpos+11] = (this.h[5] >>> 8) & 0xff;
  mac[macpos+12] = (this.h[6] >>> 0) & 0xff;
  mac[macpos+13] = (this.h[6] >>> 8) & 0xff;
  mac[macpos+14] = (this.h[7] >>> 0) & 0xff;
  mac[macpos+15] = (this.h[7] >>> 8) & 0xff;
};

poly1305.prototype.update = function(m, mpos, bytes) {
  var i, want;

  if (this.leftover) {
    want = (16 - this.leftover);
    if (want > bytes)
      want = bytes;
    for (i = 0; i < want; i++)
      this.buffer[this.leftover + i] = m[mpos+i];
    bytes -= want;
    mpos += want;
    this.leftover += want;
    if (this.leftover < 16)
      return;
    this.blocks(this.buffer, 0, 16);
    this.leftover = 0;
  }

  if (bytes >= 16) {
    want = bytes - (bytes % 16);
    this.blocks(m, mpos, want);
    mpos += want;
    bytes -= want;
  }

  if (bytes) {
    for (i = 0; i < bytes; i++)
      this.buffer[this.leftover + i] = m[mpos+i];
    this.leftover += bytes;
  }
};

function crypto_onetimeauth(out, outpos, m, mpos, n, k) {
  var s = new poly1305(k);
  s.update(m, mpos, n);
  s.finish(out, outpos);
  return 0;
}

function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {
  var x = new Uint8Array(16);
  crypto_onetimeauth(x,0,m,mpos,n,k);
  return crypto_verify_16(h,hpos,x,0);
}

function crypto_secretbox(c,m,d,n,k) {
  var i;
  if (d < 32) return -1;
  crypto_stream_xor(c,0,m,0,d,n,k);
  crypto_onetimeauth(c, 16, c, 32, d - 32, c);
  for (i = 0; i < 16; i++) c[i] = 0;
  return 0;
}

function crypto_secretbox_open(m,c,d,n,k) {
  var i;
  var x = new Uint8Array(32);
  if (d < 32) return -1;
  crypto_stream(x,0,32,n,k);
  if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1;
  crypto_stream_xor(m,0,c,0,d,n,k);
  for (i = 0; i < 32; i++) m[i] = 0;
  return 0;
}

function set25519(r, a) {
  var i;
  for (i = 0; i < 16; i++) r[i] = a[i]|0;
}

function car25519(o) {
  var i, v, c = 1;
  for (i = 0; i < 16; i++) {
    v = o[i] + c + 65535;
    c = Math.floor(v / 65536);
    o[i] = v - c * 65536;
  }
  o[0] += c-1 + 37 * (c-1);
}

function sel25519(p, q, b) {
  var t, c = ~(b-1);
  for (var i = 0; i < 16; i++) {
    t = c & (p[i] ^ q[i]);
    p[i] ^= t;
    q[i] ^= t;
  }
}

function pack25519(o, n) {
  var i, j, b;
  var m = gf(), t = gf();
  for (i = 0; i < 16; i++) t[i] = n[i];
  car25519(t);
  car25519(t);
  car25519(t);
  for (j = 0; j < 2; j++) {
    m[0] = t[0] - 0xffed;
    for (i = 1; i < 15; i++) {
      m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1);
      m[i-1] &= 0xffff;
    }
    m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1);
    b = (m[15]>>16) & 1;
    m[14] &= 0xffff;
    sel25519(t, m, 1-b);
  }
  for (i = 0; i < 16; i++) {
    o[2*i] = t[i] & 0xff;
    o[2*i+1] = t[i]>>8;
  }
}

function neq25519(a, b) {
  var c = new Uint8Array(32), d = new Uint8Array(32);
  pack25519(c, a);
  pack25519(d, b);
  return crypto_verify_32(c, 0, d, 0);
}

function par25519(a) {
  var d = new Uint8Array(32);
  pack25519(d, a);
  return d[0] & 1;
}

function unpack25519(o, n) {
  var i;
  for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8);
  o[15] &= 0x7fff;
}

function A(o, a, b) {
  for (var i = 0; i < 16; i++) o[i] = a[i] + b[i];
}

function Z(o, a, b) {
  for (var i = 0; i < 16; i++) o[i] = a[i] - b[i];
}

function M(o, a, b) {
  var v, c,
     t0 = 0,  t1 = 0,  t2 = 0,  t3 = 0,  t4 = 0,  t5 = 0,  t6 = 0,  t7 = 0,
     t8 = 0,  t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0,
    t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0,
    t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0,
    b0 = b[0],
    b1 = b[1],
    b2 = b[2],
    b3 = b[3],
    b4 = b[4],
    b5 = b[5],
    b6 = b[6],
    b7 = b[7],
    b8 = b[8],
    b9 = b[9],
    b10 = b[10],
    b11 = b[11],
    b12 = b[12],
    b13 = b[13],
    b14 = b[14],
    b15 = b[15];

  v = a[0];
  t0 += v * b0;
  t1 += v * b1;
  t2 += v * b2;
  t3 += v * b3;
  t4 += v * b4;
  t5 += v * b5;
  t6 += v * b6;
  t7 += v * b7;
  t8 += v * b8;
  t9 += v * b9;
  t10 += v * b10;
  t11 += v * b11;
  t12 += v * b12;
  t13 += v * b13;
  t14 += v * b14;
  t15 += v * b15;
  v = a[1];
  t1 += v * b0;
  t2 += v * b1;
  t3 += v * b2;
  t4 += v * b3;
  t5 += v * b4;
  t6 += v * b5;
  t7 += v * b6;
  t8 += v * b7;
  t9 += v * b8;
  t10 += v * b9;
  t11 += v * b10;
  t12 += v * b11;
  t13 += v * b12;
  t14 += v * b13;
  t15 += v * b14;
  t16 += v * b15;
  v = a[2];
  t2 += v * b0;
  t3 += v * b1;
  t4 += v * b2;
  t5 += v * b3;
  t6 += v * b4;
  t7 += v * b5;
  t8 += v * b6;
  t9 += v * b7;
  t10 += v * b8;
  t11 += v * b9;
  t12 += v * b10;
  t13 += v * b11;
  t14 += v * b12;
  t15 += v * b13;
  t16 += v * b14;
  t17 += v * b15;
  v = a[3];
  t3 += v * b0;
  t4 += v * b1;
  t5 += v * b2;
  t6 += v * b3;
  t7 += v * b4;
  t8 += v * b5;
  t9 += v * b6;
  t10 += v * b7;
  t11 += v * b8;
  t12 += v * b9;
  t13 += v * b10;
  t14 += v * b11;
  t15 += v * b12;
  t16 += v * b13;
  t17 += v * b14;
  t18 += v * b15;
  v = a[4];
  t4 += v * b0;
  t5 += v * b1;
  t6 += v * b2;
  t7 += v * b3;
  t8 += v * b4;
  t9 += v * b5;
  t10 += v * b6;
  t11 += v * b7;
  t12 += v * b8;
  t13 += v * b9;
  t14 += v * b10;
  t15 += v * b11;
  t16 += v * b12;
  t17 += v * b13;
  t18 += v * b14;
  t19 += v * b15;
  v = a[5];
  t5 += v * b0;
  t6 += v * b1;
  t7 += v * b2;
  t8 += v * b3;
  t9 += v * b4;
  t10 += v * b5;
  t11 += v * b6;
  t12 += v * b7;
  t13 += v * b8;
  t14 += v * b9;
  t15 += v * b10;
  t16 += v * b11;
  t17 += v * b12;
  t18 += v * b13;
  t19 += v * b14;
  t20 += v * b15;
  v = a[6];
  t6 += v * b0;
  t7 += v * b1;
  t8 += v * b2;
  t9 += v * b3;
  t10 += v * b4;
  t11 += v * b5;
  t12 += v * b6;
  t13 += v * b7;
  t14 += v * b8;
  t15 += v * b9;
  t16 += v * b10;
  t17 += v * b11;
  t18 += v * b12;
  t19 += v * b13;
  t20 += v * b14;
  t21 += v * b15;
  v = a[7];
  t7 += v * b0;
  t8 += v * b1;
  t9 += v * b2;
  t10 += v * b3;
  t11 += v * b4;
  t12 += v * b5;
  t13 += v * b6;
  t14 += v * b7;
  t15 += v * b8;
  t16 += v * b9;
  t17 += v * b10;
  t18 += v * b11;
  t19 += v * b12;
  t20 += v * b13;
  t21 += v * b14;
  t22 += v * b15;
  v = a[8];
  t8 += v * b0;
  t9 += v * b1;
  t10 += v * b2;
  t11 += v * b3;
  t12 += v * b4;
  t13 += v * b5;
  t14 += v * b6;
  t15 += v * b7;
  t16 += v * b8;
  t17 += v * b9;
  t18 += v * b10;
  t19 += v * b11;
  t20 += v * b12;
  t21 += v * b13;
  t22 += v * b14;
  t23 += v * b15;
  v = a[9];
  t9 += v * b0;
  t10 += v * b1;
  t11 += v * b2;
  t12 += v * b3;
  t13 += v * b4;
  t14 += v * b5;
  t15 += v * b6;
  t16 += v * b7;
  t17 += v * b8;
  t18 += v * b9;
  t19 += v * b10;
  t20 += v * b11;
  t21 += v * b12;
  t22 += v * b13;
  t23 += v * b14;
  t24 += v * b15;
  v = a[10];
  t10 += v * b0;
  t11 += v * b1;
  t12 += v * b2;
  t13 += v * b3;
  t14 += v * b4;
  t15 += v * b5;
  t16 += v * b6;
  t17 += v * b7;
  t18 += v * b8;
  t19 += v * b9;
  t20 += v * b10;
  t21 += v * b11;
  t22 += v * b12;
  t23 += v * b13;
  t24 += v * b14;
  t25 += v * b15;
  v = a[11];
  t11 += v * b0;
  t12 += v * b1;
  t13 += v * b2;
  t14 += v * b3;
  t15 += v * b4;
  t16 += v * b5;
  t17 += v * b6;
  t18 += v * b7;
  t19 += v * b8;
  t20 += v * b9;
  t21 += v * b10;
  t22 += v * b11;
  t23 += v * b12;
  t24 += v * b13;
  t25 += v * b14;
  t26 += v * b15;
  v = a[12];
  t12 += v * b0;
  t13 += v * b1;
  t14 += v * b2;
  t15 += v * b3;
  t16 += v * b4;
  t17 += v * b5;
  t18 += v * b6;
  t19 += v * b7;
  t20 += v * b8;
  t21 += v * b9;
  t22 += v * b10;
  t23 += v * b11;
  t24 += v * b12;
  t25 += v * b13;
  t26 += v * b14;
  t27 += v * b15;
  v = a[13];
  t13 += v * b0;
  t14 += v * b1;
  t15 += v * b2;
  t16 += v * b3;
  t17 += v * b4;
  t18 += v * b5;
  t19 += v * b6;
  t20 += v * b7;
  t21 += v * b8;
  t22 += v * b9;
  t23 += v * b10;
  t24 += v * b11;
  t25 += v * b12;
  t26 += v * b13;
  t27 += v * b14;
  t28 += v * b15;
  v = a[14];
  t14 += v * b0;
  t15 += v * b1;
  t16 += v * b2;
  t17 += v * b3;
  t18 += v * b4;
  t19 += v * b5;
  t20 += v * b6;
  t21 += v * b7;
  t22 += v * b8;
  t23 += v * b9;
  t24 += v * b10;
  t25 += v * b11;
  t26 += v * b12;
  t27 += v * b13;
  t28 += v * b14;
  t29 += v * b15;
  v = a[15];
  t15 += v * b0;
  t16 += v * b1;
  t17 += v * b2;
  t18 += v * b3;
  t19 += v * b4;
  t20 += v * b5;
  t21 += v * b6;
  t22 += v * b7;
  t23 += v * b8;
  t24 += v * b9;
  t25 += v * b10;
  t26 += v * b11;
  t27 += v * b12;
  t28 += v * b13;
  t29 += v * b14;
  t30 += v * b15;

  t0  += 38 * t16;
  t1  += 38 * t17;
  t2  += 38 * t18;
  t3  += 38 * t19;
  t4  += 38 * t20;
  t5  += 38 * t21;
  t6  += 38 * t22;
  t7  += 38 * t23;
  t8  += 38 * t24;
  t9  += 38 * t25;
  t10 += 38 * t26;
  t11 += 38 * t27;
  t12 += 38 * t28;
  t13 += 38 * t29;
  t14 += 38 * t30;
  // t15 left as is

  // first car
  c = 1;
  v =  t0 + c + 65535; c = Math.floor(v / 65536);  t0 = v - c * 65536;
  v =  t1 + c + 65535; c = Math.floor(v / 65536);  t1 = v - c * 65536;
  v =  t2 + c + 65535; c = Math.floor(v / 65536);  t2 = v - c * 65536;
  v =  t3 + c + 65535; c = Math.floor(v / 65536);  t3 = v - c * 65536;
  v =  t4 + c + 65535; c = Math.floor(v / 65536);  t4 = v - c * 65536;
  v =  t5 + c + 65535; c = Math.floor(v / 65536);  t5 = v - c * 65536;
  v =  t6 + c + 65535; c = Math.floor(v / 65536);  t6 = v - c * 65536;
  v =  t7 + c + 65535; c = Math.floor(v / 65536);  t7 = v - c * 65536;
  v =  t8 + c + 65535; c = Math.floor(v / 65536);  t8 = v - c * 65536;
  v =  t9 + c + 65535; c = Math.floor(v / 65536);  t9 = v - c * 65536;
  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;
  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;
  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;
  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;
  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;
  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;
  t0 += c-1 + 37 * (c-1);

  // second car
  c = 1;
  v =  t0 + c + 65535; c = Math.floor(v / 65536);  t0 = v - c * 65536;
  v =  t1 + c + 65535; c = Math.floor(v / 65536);  t1 = v - c * 65536;
  v =  t2 + c + 65535; c = Math.floor(v / 65536);  t2 = v - c * 65536;
  v =  t3 + c + 65535; c = Math.floor(v / 65536);  t3 = v - c * 65536;
  v =  t4 + c + 65535; c = Math.floor(v / 65536);  t4 = v - c * 65536;
  v =  t5 + c + 65535; c = Math.floor(v / 65536);  t5 = v - c * 65536;
  v =  t6 + c + 65535; c = Math.floor(v / 65536);  t6 = v - c * 65536;
  v =  t7 + c + 65535; c = Math.floor(v / 65536);  t7 = v - c * 65536;
  v =  t8 + c + 65535; c = Math.floor(v / 65536);  t8 = v - c * 65536;
  v =  t9 + c + 65535; c = Math.floor(v / 65536);  t9 = v - c * 65536;
  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;
  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;
  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;
  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;
  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;
  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;
  t0 += c-1 + 37 * (c-1);

  o[ 0] = t0;
  o[ 1] = t1;
  o[ 2] = t2;
  o[ 3] = t3;
  o[ 4] = t4;
  o[ 5] = t5;
  o[ 6] = t6;
  o[ 7] = t7;
  o[ 8] = t8;
  o[ 9] = t9;
  o[10] = t10;
  o[11] = t11;
  o[12] = t12;
  o[13] = t13;
  o[14] = t14;
  o[15] = t15;
}

function S(o, a) {
  M(o, a, a);
}

function inv25519(o, i) {
  var c = gf();
  var a;
  for (a = 0; a < 16; a++) c[a] = i[a];
  for (a = 253; a >= 0; a--) {
    S(c, c);
    if(a !== 2 && a !== 4) M(c, c, i);
  }
  for (a = 0; a < 16; a++) o[a] = c[a];
}

function pow2523(o, i) {
  var c = gf();
  var a;
  for (a = 0; a < 16; a++) c[a] = i[a];
  for (a = 250; a >= 0; a--) {
      S(c, c);
      if(a !== 1) M(c, c, i);
  }
  for (a = 0; a < 16; a++) o[a] = c[a];
}

function crypto_scalarmult(q, n, p) {
  var z = new Uint8Array(32);
  var x = new Float64Array(80), r, i;
  var a = gf(), b = gf(), c = gf(),
      d = gf(), e = gf(), f = gf();
  for (i = 0; i < 31; i++) z[i] = n[i];
  z[31]=(n[31]&127)|64;
  z[0]&=248;
  unpack25519(x,p);
  for (i = 0; i < 16; i++) {
    b[i]=x[i];
    d[i]=a[i]=c[i]=0;
  }
  a[0]=d[0]=1;
  for (i=254; i>=0; --i) {
    r=(z[i>>>3]>>>(i&7))&1;
    sel25519(a,b,r);
    sel25519(c,d,r);
    A(e,a,c);
    Z(a,a,c);
    A(c,b,d);
    Z(b,b,d);
    S(d,e);
    S(f,a);
    M(a,c,a);
    M(c,b,e);
    A(e,a,c);
    Z(a,a,c);
    S(b,a);
    Z(c,d,f);
    M(a,c,_121665);
    A(a,a,d);
    M(c,c,a);
    M(a,d,f);
    M(d,b,x);
    S(b,e);
    sel25519(a,b,r);
    sel25519(c,d,r);
  }
  for (i = 0; i < 16; i++) {
    x[i+16]=a[i];
    x[i+32]=c[i];
    x[i+48]=b[i];
    x[i+64]=d[i];
  }
  var x32 = x.subarray(32);
  var x16 = x.subarray(16);
  inv25519(x32,x32);
  M(x16,x16,x32);
  pack25519(q,x16);
  return 0;
}

function crypto_scalarmult_base(q, n) {
  return crypto_scalarmult(q, n, _9);
}

function crypto_box_keypair(y, x) {
  randombytes(x, 32);
  return crypto_scalarmult_base(y, x);
}

function crypto_box_beforenm(k, y, x) {
  var s = new Uint8Array(32);
  crypto_scalarmult(s, x, y);
  return crypto_core_hsalsa20(k, _0, s, sigma);
}

var crypto_box_afternm = crypto_secretbox;
var crypto_box_open_afternm = crypto_secretbox_open;

function crypto_box(c, m, d, n, y, x) {
  var k = new Uint8Array(32);
  crypto_box_beforenm(k, y, x);
  return crypto_box_afternm(c, m, d, n, k);
}

function crypto_box_open(m, c, d, n, y, x) {
  var k = new Uint8Array(32);
  crypto_box_beforenm(k, y, x);
  return crypto_box_open_afternm(m, c, d, n, k);
}

var K = [
  0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,
  0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,
  0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,
  0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,
  0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,
  0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,
  0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,
  0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,
  0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,
  0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,
  0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,
  0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,
  0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,
  0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,
  0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,
  0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,
  0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,
  0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,
  0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,
  0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,
  0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,
  0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,
  0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,
  0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,
  0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,
  0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,
  0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,
  0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,
  0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,
  0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,
  0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,
  0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,
  0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,
  0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,
  0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,
  0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,
  0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,
  0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,
  0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,
  0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817
];

function crypto_hashblocks_hl(hh, hl, m, n) {
  var wh = new Int32Array(16), wl = new Int32Array(16),
      bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7,
      bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7,
      th, tl, i, j, h, l, a, b, c, d;

  var ah0 = hh[0],
      ah1 = hh[1],
      ah2 = hh[2],
      ah3 = hh[3],
      ah4 = hh[4],
      ah5 = hh[5],
      ah6 = hh[6],
      ah7 = hh[7],

      al0 = hl[0],
      al1 = hl[1],
      al2 = hl[2],
      al3 = hl[3],
      al4 = hl[4],
      al5 = hl[5],
      al6 = hl[6],
      al7 = hl[7];

  var pos = 0;
  while (n >= 128) {
    for (i = 0; i < 16; i++) {
      j = 8 * i + pos;
      wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3];
      wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7];
    }
    for (i = 0; i < 80; i++) {
      bh0 = ah0;
      bh1 = ah1;
      bh2 = ah2;
      bh3 = ah3;
      bh4 = ah4;
      bh5 = ah5;
      bh6 = ah6;
      bh7 = ah7;

      bl0 = al0;
      bl1 = al1;
      bl2 = al2;
      bl3 = al3;
      bl4 = al4;
      bl5 = al5;
      bl6 = al6;
      bl7 = al7;

      // add
      h = ah7;
      l = al7;

      a = l & 0xffff; b = l >>> 16;
      c = h & 0xffff; d = h >>> 16;

      // Sigma1
      h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32))));
      l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32))));

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      // Ch
      h = (ah4 & ah5) ^ (~ah4 & ah6);
      l = (al4 & al5) ^ (~al4 & al6);

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      // K
      h = K[i*2];
      l = K[i*2+1];

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      // w
      h = wh[i%16];
      l = wl[i%16];

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      b += a >>> 16;
      c += b >>> 16;
      d += c >>> 16;

      th = c & 0xffff | d << 16;
      tl = a & 0xffff | b << 16;

      // add
      h = th;
      l = tl;

      a = l & 0xffff; b = l >>> 16;
      c = h & 0xffff; d = h >>> 16;

      // Sigma0
      h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32))));
      l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32))));

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      // Maj
      h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2);
      l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2);

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      b += a >>> 16;
      c += b >>> 16;
      d += c >>> 16;

      bh7 = (c & 0xffff) | (d << 16);
      bl7 = (a & 0xffff) | (b << 16);

      // add
      h = bh3;
      l = bl3;

      a = l & 0xffff; b = l >>> 16;
      c = h & 0xffff; d = h >>> 16;

      h = th;
      l = tl;

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      b += a >>> 16;
      c += b >>> 16;
      d += c >>> 16;

      bh3 = (c & 0xffff) | (d << 16);
      bl3 = (a & 0xffff) | (b << 16);

      ah1 = bh0;
      ah2 = bh1;
      ah3 = bh2;
      ah4 = bh3;
      ah5 = bh4;
      ah6 = bh5;
      ah7 = bh6;
      ah0 = bh7;

      al1 = bl0;
      al2 = bl1;
      al3 = bl2;
      al4 = bl3;
      al5 = bl4;
      al6 = bl5;
      al7 = bl6;
      al0 = bl7;

      if (i%16 === 15) {
        for (j = 0; j < 16; j++) {
          // add
          h = wh[j];
          l = wl[j];

          a = l & 0xffff; b = l >>> 16;
          c = h & 0xffff; d = h >>> 16;

          h = wh[(j+9)%16];
          l = wl[(j+9)%16];

          a += l & 0xffff; b += l >>> 16;
          c += h & 0xffff; d += h >>> 16;

          // sigma0
          th = wh[(j+1)%16];
          tl = wl[(j+1)%16];
          h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7);
          l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7)));

          a += l & 0xffff; b += l >>> 16;
          c += h & 0xffff; d += h >>> 16;

          // sigma1
          th = wh[(j+14)%16];
          tl = wl[(j+14)%16];
          h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6);
          l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6)));

          a += l & 0xffff; b += l >>> 16;
          c += h & 0xffff; d += h >>> 16;

          b += a >>> 16;
          c += b >>> 16;
          d += c >>> 16;

          wh[j] = (c & 0xffff) | (d << 16);
          wl[j] = (a & 0xffff) | (b << 16);
        }
      }
    }

    // add
    h = ah0;
    l = al0;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[0];
    l = hl[0];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[0] = ah0 = (c & 0xffff) | (d << 16);
    hl[0] = al0 = (a & 0xffff) | (b << 16);

    h = ah1;
    l = al1;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[1];
    l = hl[1];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[1] = ah1 = (c & 0xffff) | (d << 16);
    hl[1] = al1 = (a & 0xffff) | (b << 16);

    h = ah2;
    l = al2;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[2];
    l = hl[2];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[2] = ah2 = (c & 0xffff) | (d << 16);
    hl[2] = al2 = (a & 0xffff) | (b << 16);

    h = ah3;
    l = al3;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[3];
    l = hl[3];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[3] = ah3 = (c & 0xffff) | (d << 16);
    hl[3] = al3 = (a & 0xffff) | (b << 16);

    h = ah4;
    l = al4;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[4];
    l = hl[4];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[4] = ah4 = (c & 0xffff) | (d << 16);
    hl[4] = al4 = (a & 0xffff) | (b << 16);

    h = ah5;
    l = al5;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[5];
    l = hl[5];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[5] = ah5 = (c & 0xffff) | (d << 16);
    hl[5] = al5 = (a & 0xffff) | (b << 16);

    h = ah6;
    l = al6;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[6];
    l = hl[6];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[6] = ah6 = (c & 0xffff) | (d << 16);
    hl[6] = al6 = (a & 0xffff) | (b << 16);

    h = ah7;
    l = al7;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[7];
    l = hl[7];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[7] = ah7 = (c & 0xffff) | (d << 16);
    hl[7] = al7 = (a & 0xffff) | (b << 16);

    pos += 128;
    n -= 128;
  }

  return n;
}

function crypto_hash(out, m, n) {
  var hh = new Int32Array(8),
      hl = new Int32Array(8),
      x = new Uint8Array(256),
      i, b = n;

  hh[0] = 0x6a09e667;
  hh[1] = 0xbb67ae85;
  hh[2] = 0x3c6ef372;
  hh[3] = 0xa54ff53a;
  hh[4] = 0x510e527f;
  hh[5] = 0x9b05688c;
  hh[6] = 0x1f83d9ab;
  hh[7] = 0x5be0cd19;

  hl[0] = 0xf3bcc908;
  hl[1] = 0x84caa73b;
  hl[2] = 0xfe94f82b;
  hl[3] = 0x5f1d36f1;
  hl[4] = 0xade682d1;
  hl[5] = 0x2b3e6c1f;
  hl[6] = 0xfb41bd6b;
  hl[7] = 0x137e2179;

  crypto_hashblocks_hl(hh, hl, m, n);
  n %= 128;

  for (i = 0; i < n; i++) x[i] = m[b-n+i];
  x[n] = 128;

  n = 256-128*(n<112?1:0);
  x[n-9] = 0;
  ts64(x, n-8,  (b / 0x20000000) | 0, b << 3);
  crypto_hashblocks_hl(hh, hl, x, n);

  for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]);

  return 0;
}

function add(p, q) {
  var a = gf(), b = gf(), c = gf(),
      d = gf(), e = gf(), f = gf(),
      g = gf(), h = gf(), t = gf();

  Z(a, p[1], p[0]);
  Z(t, q[1], q[0]);
  M(a, a, t);
  A(b, p[0], p[1]);
  A(t, q[0], q[1]);
  M(b, b, t);
  M(c, p[3], q[3]);
  M(c, c, D2);
  M(d, p[2], q[2]);
  A(d, d, d);
  Z(e, b, a);
  Z(f, d, c);
  A(g, d, c);
  A(h, b, a);

  M(p[0], e, f);
  M(p[1], h, g);
  M(p[2], g, f);
  M(p[3], e, h);
}

function cswap(p, q, b) {
  var i;
  for (i = 0; i < 4; i++) {
    sel25519(p[i], q[i], b);
  }
}

function pack(r, p) {
  var tx = gf(), ty = gf(), zi = gf();
  inv25519(zi, p[2]);
  M(tx, p[0], zi);
  M(ty, p[1], zi);
  pack25519(r, ty);
  r[31] ^= par25519(tx) << 7;
}

function scalarmult(p, q, s) {
  var b, i;
  set25519(p[0], gf0);
  set25519(p[1], gf1);
  set25519(p[2], gf1);
  set25519(p[3], gf0);
  for (i = 255; i >= 0; --i) {
    b = (s[(i/8)|0] >> (i&7)) & 1;
    cswap(p, q, b);
    add(q, p);
    add(p, p);
    cswap(p, q, b);
  }
}

function scalarbase(p, s) {
  var q = [gf(), gf(), gf(), gf()];
  set25519(q[0], X);
  set25519(q[1], Y);
  set25519(q[2], gf1);
  M(q[3], X, Y);
  scalarmult(p, q, s);
}

function crypto_sign_keypair(pk, sk, seeded) {
  var d = new Uint8Array(64);
  var p = [gf(), gf(), gf(), gf()];
  var i;

  if (!seeded) randombytes(sk, 32);
  crypto_hash(d, sk, 32);
  d[0] &= 248;
  d[31] &= 127;
  d[31] |= 64;

  scalarbase(p, d);
  pack(pk, p);

  for (i = 0; i < 32; i++) sk[i+32] = pk[i];
  return 0;
}

var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);

function modL(r, x) {
  var carry, i, j, k;
  for (i = 63; i >= 32; --i) {
    carry = 0;
    for (j = i - 32, k = i - 12; j < k; ++j) {
      x[j] += carry - 16 * x[i] * L[j - (i - 32)];
      carry = (x[j] + 128) >> 8;
      x[j] -= carry * 256;
    }
    x[j] += carry;
    x[i] = 0;
  }
  carry = 0;
  for (j = 0; j < 32; j++) {
    x[j] += carry - (x[31] >> 4) * L[j];
    carry = x[j] >> 8;
    x[j] &= 255;
  }
  for (j = 0; j < 32; j++) x[j] -= carry * L[j];
  for (i = 0; i < 32; i++) {
    x[i+1] += x[i] >> 8;
    r[i] = x[i] & 255;
  }
}

function reduce(r) {
  var x = new Float64Array(64), i;
  for (i = 0; i < 64; i++) x[i] = r[i];
  for (i = 0; i < 64; i++) r[i] = 0;
  modL(r, x);
}

// Note: difference from C - smlen returned, not passed as argument.
function crypto_sign(sm, m, n, sk) {
  var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);
  var i, j, x = new Float64Array(64);
  var p = [gf(), gf(), gf(), gf()];

  crypto_hash(d, sk, 32);
  d[0] &= 248;
  d[31] &= 127;
  d[31] |= 64;

  var smlen = n + 64;
  for (i = 0; i < n; i++) sm[64 + i] = m[i];
  for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];

  crypto_hash(r, sm.subarray(32), n+32);
  reduce(r);
  scalarbase(p, r);
  pack(sm, p);

  for (i = 32; i < 64; i++) sm[i] = sk[i];
  crypto_hash(h, sm, n + 64);
  reduce(h);

  for (i = 0; i < 64; i++) x[i] = 0;
  for (i = 0; i < 32; i++) x[i] = r[i];
  for (i = 0; i < 32; i++) {
    for (j = 0; j < 32; j++) {
      x[i+j] += h[i] * d[j];
    }
  }

  modL(sm.subarray(32), x);
  return smlen;
}

function unpackneg(r, p) {
  var t = gf(), chk = gf(), num = gf(),
      den = gf(), den2 = gf(), den4 = gf(),
      den6 = gf();

  set25519(r[2], gf1);
  unpack25519(r[1], p);
  S(num, r[1]);
  M(den, num, D);
  Z(num, num, r[2]);
  A(den, r[2], den);

  S(den2, den);
  S(den4, den2);
  M(den6, den4, den2);
  M(t, den6, num);
  M(t, t, den);

  pow2523(t, t);
  M(t, t, num);
  M(t, t, den);
  M(t, t, den);
  M(r[0], t, den);

  S(chk, r[0]);
  M(chk, chk, den);
  if (neq25519(chk, num)) M(r[0], r[0], I);

  S(chk, r[0]);
  M(chk, chk, den);
  if (neq25519(chk, num)) return -1;

  if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]);

  M(r[3], r[0], r[1]);
  return 0;
}

function crypto_sign_open(m, sm, n, pk) {
  var i, mlen;
  var t = new Uint8Array(32), h = new Uint8Array(64);
  var p = [gf(), gf(), gf(), gf()],
      q = [gf(), gf(), gf(), gf()];

  mlen = -1;
  if (n < 64) return -1;

  if (unpackneg(q, pk)) return -1;

  for (i = 0; i < n; i++) m[i] = sm[i];
  for (i = 0; i < 32; i++) m[i+32] = pk[i];
  crypto_hash(h, m, n);
  reduce(h);
  scalarmult(p, q, h);

  scalarbase(q, sm.subarray(32));
  add(p, q);
  pack(t, p);

  n -= 64;
  if (crypto_verify_32(sm, 0, t, 0)) {
    for (i = 0; i < n; i++) m[i] = 0;
    return -1;
  }

  for (i = 0; i < n; i++) m[i] = sm[i + 64];
  mlen = n;
  return mlen;
}

var crypto_secretbox_KEYBYTES = 32,
    crypto_secretbox_NONCEBYTES = 24,
    crypto_secretbox_ZEROBYTES = 32,
    crypto_secretbox_BOXZEROBYTES = 16,
    crypto_scalarmult_BYTES = 32,
    crypto_scalarmult_SCALARBYTES = 32,
    crypto_box_PUBLICKEYBYTES = 32,
    crypto_box_SECRETKEYBYTES = 32,
    crypto_box_BEFORENMBYTES = 32,
    crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES,
    crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES,
    crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES,
    crypto_sign_BYTES = 64,
    crypto_sign_PUBLICKEYBYTES = 32,
    crypto_sign_SECRETKEYBYTES = 64,
    crypto_sign_SEEDBYTES = 32,
    crypto_hash_BYTES = 64;

nacl.lowlevel = {
  crypto_core_hsalsa20: crypto_core_hsalsa20,
  crypto_stream_xor: crypto_stream_xor,
  crypto_stream: crypto_stream,
  crypto_stream_salsa20_xor: crypto_stream_salsa20_xor,
  crypto_stream_salsa20: crypto_stream_salsa20,
  crypto_onetimeauth: crypto_onetimeauth,
  crypto_onetimeauth_verify: crypto_onetimeauth_verify,
  crypto_verify_16: crypto_verify_16,
  crypto_verify_32: crypto_verify_32,
  crypto_secretbox: crypto_secretbox,
  crypto_secretbox_open: crypto_secretbox_open,
  crypto_scalarmult: crypto_scalarmult,
  crypto_scalarmult_base: crypto_scalarmult_base,
  crypto_box_beforenm: crypto_box_beforenm,
  crypto_box_afternm: crypto_box_afternm,
  crypto_box: crypto_box,
  crypto_box_open: crypto_box_open,
  crypto_box_keypair: crypto_box_keypair,
  crypto_hash: crypto_hash,
  crypto_sign: crypto_sign,
  crypto_sign_keypair: crypto_sign_keypair,
  crypto_sign_open: crypto_sign_open,

  crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES,
  crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES,
  crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES,
  crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES,
  crypto_scalarmult_BYTES: crypto_scalarmult_BYTES,
  crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES,
  crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES,
  crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES,
  crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES,
  crypto_box_NONCEBYTES: crypto_box_NONCEBYTES,
  crypto_box_ZEROBYTES: crypto_box_ZEROBYTES,
  crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES,
  crypto_sign_BYTES: crypto_sign_BYTES,
  crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES,
  crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES,
  crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES,
  crypto_hash_BYTES: crypto_hash_BYTES
};

/* High-level API */

function checkLengths(k, n) {
  if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size');
  if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size');
}

function checkBoxLengths(pk, sk) {
  if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size');
  if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size');
}

function checkArrayTypes() {
  var t, i;
  for (i = 0; i < arguments.length; i++) {
     if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]')
       throw new TypeError('unexpected type ' + t + ', use Uint8Array');
  }
}

function cleanup(arr) {
  for (var i = 0; i < arr.length; i++) arr[i] = 0;
}

// TODO: Completely remove this in v0.15.
if (!nacl.util) {
  nacl.util = {};
  nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() {
    throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js');
  };
}

nacl.randomBytes = function(n) {
  var b = new Uint8Array(n);
  randombytes(b, n);
  return b;
};

nacl.secretbox = function(msg, nonce, key) {
  checkArrayTypes(msg, nonce, key);
  checkLengths(key, nonce);
  var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);
  var c = new Uint8Array(m.length);
  for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i];
  crypto_secretbox(c, m, m.length, nonce, key);
  return c.subarray(crypto_secretbox_BOXZEROBYTES);
};

nacl.secretbox.open = function(box, nonce, key) {
  checkArrayTypes(box, nonce, key);
  checkLengths(key, nonce);
  var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);
  var m = new Uint8Array(c.length);
  for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i];
  if (c.length < 32) return false;
  if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false;
  return m.subarray(crypto_secretbox_ZEROBYTES);
};

nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES;
nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES;
nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES;

nacl.scalarMult = function(n, p) {
  checkArrayTypes(n, p);
  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');
  if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size');
  var q = new Uint8Array(crypto_scalarmult_BYTES);
  crypto_scalarmult(q, n, p);
  return q;
};

nacl.scalarMult.base = function(n) {
  checkArrayTypes(n);
  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');
  var q = new Uint8Array(crypto_scalarmult_BYTES);
  crypto_scalarmult_base(q, n);
  return q;
};

nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES;
nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES;

nacl.box = function(msg, nonce, publicKey, secretKey) {
  var k = nacl.box.before(publicKey, secretKey);
  return nacl.secretbox(msg, nonce, k);
};

nacl.box.before = function(publicKey, secretKey) {
  checkArrayTypes(publicKey, secretKey);
  checkBoxLengths(publicKey, secretKey);
  var k = new Uint8Array(crypto_box_BEFORENMBYTES);
  crypto_box_beforenm(k, publicKey, secretKey);
  return k;
};

nacl.box.after = nacl.secretbox;

nacl.box.open = function(msg, nonce, publicKey, secretKey) {
  var k = nacl.box.before(publicKey, secretKey);
  return nacl.secretbox.open(msg, nonce, k);
};

nacl.box.open.after = nacl.secretbox.open;

nacl.box.keyPair = function() {
  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
  var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);
  crypto_box_keypair(pk, sk);
  return {publicKey: pk, secretKey: sk};
};

nacl.box.keyPair.fromSecretKey = function(secretKey) {
  checkArrayTypes(secretKey);
  if (secretKey.length !== crypto_box_SECRETKEYBYTES)
    throw new Error('bad secret key size');
  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
  crypto_scalarmult_base(pk, secretKey);
  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};
};

nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES;
nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES;
nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES;
nacl.box.nonceLength = crypto_box_NONCEBYTES;
nacl.box.overheadLength = nacl.secretbox.overheadLength;

nacl.sign = function(msg, secretKey) {
  checkArrayTypes(msg, secretKey);
  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
    throw new Error('bad secret key size');
  var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length);
  crypto_sign(signedMsg, msg, msg.length, secretKey);
  return signedMsg;
};

nacl.sign.open = function(signedMsg, publicKey) {
  if (arguments.length !== 2)
    throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?');
  checkArrayTypes(signedMsg, publicKey);
  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
    throw new Error('bad public key size');
  var tmp = new Uint8Array(signedMsg.length);
  var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);
  if (mlen < 0) return null;
  var m = new Uint8Array(mlen);
  for (var i = 0; i < m.length; i++) m[i] = tmp[i];
  return m;
};

nacl.sign.detached = function(msg, secretKey) {
  var signedMsg = nacl.sign(msg, secretKey);
  var sig = new Uint8Array(crypto_sign_BYTES);
  for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];
  return sig;
};

nacl.sign.detached.verify = function(msg, sig, publicKey) {
  checkArrayTypes(msg, sig, publicKey);
  if (sig.length !== crypto_sign_BYTES)
    throw new Error('bad signature size');
  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
    throw new Error('bad public key size');
  var sm = new Uint8Array(crypto_sign_BYTES + msg.length);
  var m = new Uint8Array(crypto_sign_BYTES + msg.length);
  var i;
  for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];
  for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i];
  return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);
};

nacl.sign.keyPair = function() {
  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
  crypto_sign_keypair(pk, sk);
  return {publicKey: pk, secretKey: sk};
};

nacl.sign.keyPair.fromSecretKey = function(secretKey) {
  checkArrayTypes(secretKey);
  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
    throw new Error('bad secret key size');
  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
  for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i];
  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};
};

nacl.sign.keyPair.fromSeed = function(seed) {
  checkArrayTypes(seed);
  if (seed.length !== crypto_sign_SEEDBYTES)
    throw new Error('bad seed size');
  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
  for (var i = 0; i < 32; i++) sk[i] = seed[i];
  crypto_sign_keypair(pk, sk, true);
  return {publicKey: pk, secretKey: sk};
};

nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES;
nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES;
nacl.sign.seedLength = crypto_sign_SEEDBYTES;
nacl.sign.signatureLength = crypto_sign_BYTES;

nacl.hash = function(msg) {
  checkArrayTypes(msg);
  var h = new Uint8Array(crypto_hash_BYTES);
  crypto_hash(h, msg, msg.length);
  return h;
};

nacl.hash.hashLength = crypto_hash_BYTES;

nacl.verify = function(x, y) {
  checkArrayTypes(x, y);
  // Zero length arguments are considered not equal.
  if (x.length === 0 || y.length === 0) return false;
  if (x.length !== y.length) return false;
  return (vn(x, 0, y, 0, x.length) === 0) ? true : false;
};

nacl.setPRNG = function(fn) {
  randombytes = fn;
};

(function() {
  // Initialize PRNG if environment provides CSPRNG.
  // If not, methods calling randombytes will throw.
  var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null;
  if (crypto && crypto.getRandomValues) {
    // Browsers.
    var QUOTA = 65536;
    nacl.setPRNG(function(x, n) {
      var i, v = new Uint8Array(n);
      for (i = 0; i < n; i += QUOTA) {
        crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));
      }
      for (i = 0; i < n; i++) x[i] = v[i];
      cleanup(v);
    });
  } else if (typeof require !== 'undefined') {
    // Node.js.
    crypto = require('crypto');
    if (crypto && crypto.randomBytes) {
      nacl.setPRNG(function(x, n) {
        var i, v = crypto.randomBytes(n);
        for (i = 0; i < n; i++) x[i] = v[i];
        cleanup(v);
      });
    }
  }
})();

})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {}));
!function(r){"use strict";function t(r,t,n,e){r[t]=n>>24&255,r[t+1]=n>>16&255,r[t+2]=n>>8&255,r[t+3]=255&n,r[t+4]=e>>24&255,r[t+5]=e>>16&255,r[t+6]=e>>8&255,r[t+7]=255&e}function n(r,t,n,e,o){var i,h=0;for(i=0;i<o;i++)h|=r[t+i]^n[e+i];return(1&h-1>>>8)-1}function e(r,t,e,o){return n(r,t,e,o,16)}function o(r,t,e,o){return n(r,t,e,o,32)}function i(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,c=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,u=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,v=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,b=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,g=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,_=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,d=i,U=h,E=a,x=f,M=s,m=c,B=u,S=y,K=l,T=w,Y=p,k=v,L=b,z=g,R=_,P=A,O=0;O<20;O+=2)o=d+L|0,M^=o<<7|o>>>25,o=M+d|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,d^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,z^=o<<9|o>>>23,o=z+T|0,U^=o<<13|o>>>19,o=U+z|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=P+k|0,x^=o<<7|o>>>25,o=x+P|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,P^=o<<18|o>>>14,o=d+x|0,U^=o<<7|o>>>25,o=U+d|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,d^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=P+R|0,L^=o<<7|o>>>25,o=L+P|0,z^=o<<9|o>>>23,o=z+L|0,R^=o<<13|o>>>19,o=R+z|0,P^=o<<18|o>>>14;d=d+i|0,U=U+h|0,E=E+a|0,x=x+f|0,M=M+s|0,m=m+c|0,B=B+u|0,S=S+y|0,K=K+l|0,T=T+w|0,Y=Y+p|0,k=k+v|0,L=L+b|0,z=z+g|0,R=R+_|0,P=P+A|0,r[0]=d>>>0&255,r[1]=d>>>8&255,r[2]=d>>>16&255,r[3]=d>>>24&255,r[4]=U>>>0&255,r[5]=U>>>8&255,r[6]=U>>>16&255,r[7]=U>>>24&255,r[8]=E>>>0&255,r[9]=E>>>8&255,r[10]=E>>>16&255,r[11]=E>>>24&255,r[12]=x>>>0&255,r[13]=x>>>8&255,r[14]=x>>>16&255,r[15]=x>>>24&255,r[16]=M>>>0&255,r[17]=M>>>8&255,r[18]=M>>>16&255,r[19]=M>>>24&255,r[20]=m>>>0&255,r[21]=m>>>8&255,r[22]=m>>>16&255,r[23]=m>>>24&255,r[24]=B>>>0&255,r[25]=B>>>8&255,r[26]=B>>>16&255,r[27]=B>>>24&255,r[28]=S>>>0&255,r[29]=S>>>8&255,r[30]=S>>>16&255,r[31]=S>>>24&255,r[32]=K>>>0&255,r[33]=K>>>8&255,r[34]=K>>>16&255,r[35]=K>>>24&255,r[36]=T>>>0&255,r[37]=T>>>8&255,r[38]=T>>>16&255,r[39]=T>>>24&255,r[40]=Y>>>0&255,r[41]=Y>>>8&255,r[42]=Y>>>16&255,r[43]=Y>>>24&255,r[44]=k>>>0&255,r[45]=k>>>8&255,r[46]=k>>>16&255,r[47]=k>>>24&255,r[48]=L>>>0&255,r[49]=L>>>8&255,r[50]=L>>>16&255,r[51]=L>>>24&255,r[52]=z>>>0&255,r[53]=z>>>8&255,r[54]=z>>>16&255,r[55]=z>>>24&255,r[56]=R>>>0&255,r[57]=R>>>8&255,r[58]=R>>>16&255,r[59]=R>>>24&255,r[60]=P>>>0&255,r[61]=P>>>8&255,r[62]=P>>>16&255,r[63]=P>>>24&255}function h(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,c=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,u=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,v=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,b=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,g=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,_=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,d=i,U=h,E=a,x=f,M=s,m=c,B=u,S=y,K=l,T=w,Y=p,k=v,L=b,z=g,R=_,P=A,O=0;O<20;O+=2)o=d+L|0,M^=o<<7|o>>>25,o=M+d|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,d^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,z^=o<<9|o>>>23,o=z+T|0,U^=o<<13|o>>>19,o=U+z|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=P+k|0,x^=o<<7|o>>>25,o=x+P|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,P^=o<<18|o>>>14,o=d+x|0,U^=o<<7|o>>>25,o=U+d|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,d^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=P+R|0,L^=o<<7|o>>>25,o=L+P|0,z^=o<<9|o>>>23,o=z+L|0,R^=o<<13|o>>>19,o=R+z|0,P^=o<<18|o>>>14;r[0]=d>>>0&255,r[1]=d>>>8&255,r[2]=d>>>16&255,r[3]=d>>>24&255,r[4]=m>>>0&255,r[5]=m>>>8&255,r[6]=m>>>16&255,r[7]=m>>>24&255,r[8]=Y>>>0&255,r[9]=Y>>>8&255,r[10]=Y>>>16&255,r[11]=Y>>>24&255,r[12]=P>>>0&255,r[13]=P>>>8&255,r[14]=P>>>16&255,r[15]=P>>>24&255,r[16]=B>>>0&255,r[17]=B>>>8&255,r[18]=B>>>16&255,r[19]=B>>>24&255,r[20]=S>>>0&255,r[21]=S>>>8&255,r[22]=S>>>16&255,r[23]=S>>>24&255,r[24]=K>>>0&255,r[25]=K>>>8&255,r[26]=K>>>16&255,r[27]=K>>>24&255,r[28]=T>>>0&255,r[29]=T>>>8&255,r[30]=T>>>16&255,r[31]=T>>>24&255}function a(r,t,n,e){i(r,t,n,e)}function f(r,t,n,e){h(r,t,n,e)}function s(r,t,n,e,o,i,h){var f,s,c=new Uint8Array(16),u=new Uint8Array(64);for(s=0;s<16;s++)c[s]=0;for(s=0;s<8;s++)c[s]=i[s];for(;o>=64;){for(a(u,c,h,ur),s=0;s<64;s++)r[t+s]=n[e+s]^u[s];for(f=1,s=8;s<16;s++)f=f+(255&c[s])|0,c[s]=255&f,f>>>=8;o-=64,t+=64,e+=64}if(o>0)for(a(u,c,h,ur),s=0;s<o;s++)r[t+s]=n[e+s]^u[s];return 0}function c(r,t,n,e,o){var i,h,f=new Uint8Array(16),s=new Uint8Array(64);for(h=0;h<16;h++)f[h]=0;for(h=0;h<8;h++)f[h]=e[h];for(;n>=64;){for(a(s,f,o,ur),h=0;h<64;h++)r[t+h]=s[h];for(i=1,h=8;h<16;h++)i=i+(255&f[h])|0,f[h]=255&i,i>>>=8;n-=64,t+=64}if(n>0)for(a(s,f,o,ur),h=0;h<n;h++)r[t+h]=s[h];return 0}function u(r,t,n,e,o){var i=new Uint8Array(32);f(i,e,o,ur);for(var h=new Uint8Array(8),a=0;a<8;a++)h[a]=e[a+16];return c(r,t,n,h,i)}function y(r,t,n,e,o,i,h){var a=new Uint8Array(32);f(a,i,h,ur);for(var c=new Uint8Array(8),u=0;u<8;u++)c[u]=i[u+16];return s(r,t,n,e,o,c,a)}function l(r,t,n,e,o,i){var h=new yr(i);return h.update(n,e,o),h.finish(r,t),0}function w(r,t,n,o,i,h){var a=new Uint8Array(16);return l(a,0,n,o,i,h),e(r,t,a,0)}function p(r,t,n,e,o){var i;if(n<32)return-1;for(y(r,0,t,0,n,e,o),l(r,16,r,32,n-32,r),i=0;i<16;i++)r[i]=0;return 0}function v(r,t,n,e,o){var i,h=new Uint8Array(32);if(n<32)return-1;if(u(h,0,32,e,o),0!==w(t,16,t,32,n-32,h))return-1;for(y(r,0,t,0,n,e,o),i=0;i<32;i++)r[i]=0;return 0}function b(r,t){var n;for(n=0;n<16;n++)r[n]=0|t[n]}function g(r){var t,n,e=1;for(t=0;t<16;t++)n=r[t]+e+65535,e=Math.floor(n/65536),r[t]=n-65536*e;r[0]+=e-1+37*(e-1)}function _(r,t,n){for(var e,o=~(n-1),i=0;i<16;i++)e=o&(r[i]^t[i]),r[i]^=e,t[i]^=e}function A(r,t){var n,e,o,i=$(),h=$();for(n=0;n<16;n++)h[n]=t[n];for(g(h),g(h),g(h),e=0;e<2;e++){for(i[0]=h[0]-65517,n=1;n<15;n++)i[n]=h[n]-65535-(i[n-1]>>16&1),i[n-1]&=65535;i[15]=h[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,_(h,i,1-o)}for(n=0;n<16;n++)r[2*n]=255&h[n],r[2*n+1]=h[n]>>8}function d(r,t){var n=new Uint8Array(32),e=new Uint8Array(32);return A(n,r),A(e,t),o(n,0,e,0)}function U(r){var t=new Uint8Array(32);return A(t,r),1&t[0]}function E(r,t){var n;for(n=0;n<16;n++)r[n]=t[2*n]+(t[2*n+1]<<8);r[15]&=32767}function x(r,t,n){for(var e=0;e<16;e++)r[e]=t[e]+n[e]}function M(r,t,n){for(var e=0;e<16;e++)r[e]=t[e]-n[e]}function m(r,t,n){var e,o,i=0,h=0,a=0,f=0,s=0,c=0,u=0,y=0,l=0,w=0,p=0,v=0,b=0,g=0,_=0,A=0,d=0,U=0,E=0,x=0,M=0,m=0,B=0,S=0,K=0,T=0,Y=0,k=0,L=0,z=0,R=0,P=n[0],O=n[1],N=n[2],C=n[3],F=n[4],I=n[5],G=n[6],Z=n[7],j=n[8],q=n[9],V=n[10],X=n[11],D=n[12],H=n[13],J=n[14],Q=n[15];e=t[0],i+=e*P,h+=e*O,a+=e*N,f+=e*C,s+=e*F,c+=e*I,u+=e*G,y+=e*Z,l+=e*j,w+=e*q,p+=e*V,v+=e*X,b+=e*D,g+=e*H,_+=e*J,A+=e*Q,e=t[1],h+=e*P,a+=e*O,f+=e*N,s+=e*C,c+=e*F,u+=e*I,y+=e*G,l+=e*Z,w+=e*j,p+=e*q,v+=e*V,b+=e*X,g+=e*D,_+=e*H,A+=e*J,d+=e*Q,e=t[2],a+=e*P,f+=e*O,s+=e*N,c+=e*C,u+=e*F,y+=e*I,l+=e*G,w+=e*Z,p+=e*j,v+=e*q,b+=e*V,g+=e*X,_+=e*D,A+=e*H,d+=e*J,U+=e*Q,e=t[3],f+=e*P,s+=e*O,c+=e*N,u+=e*C,y+=e*F,l+=e*I,w+=e*G,p+=e*Z,v+=e*j,b+=e*q,g+=e*V,_+=e*X,A+=e*D,d+=e*H,U+=e*J,E+=e*Q,e=t[4],s+=e*P,c+=e*O,u+=e*N,y+=e*C,l+=e*F,w+=e*I,p+=e*G,v+=e*Z,b+=e*j,g+=e*q,_+=e*V,A+=e*X,d+=e*D,U+=e*H,E+=e*J,x+=e*Q,e=t[5],c+=e*P,u+=e*O,y+=e*N,l+=e*C,w+=e*F,p+=e*I,v+=e*G,b+=e*Z,g+=e*j,_+=e*q,A+=e*V,d+=e*X,U+=e*D,E+=e*H,x+=e*J,M+=e*Q,e=t[6],u+=e*P,y+=e*O,l+=e*N,w+=e*C,p+=e*F,v+=e*I,b+=e*G,g+=e*Z,_+=e*j,A+=e*q,d+=e*V,U+=e*X,E+=e*D,x+=e*H,M+=e*J,m+=e*Q,e=t[7],y+=e*P,l+=e*O,w+=e*N,p+=e*C,v+=e*F,b+=e*I,g+=e*G,_+=e*Z,A+=e*j,d+=e*q,U+=e*V,E+=e*X,x+=e*D,M+=e*H,m+=e*J,B+=e*Q,e=t[8],l+=e*P,w+=e*O,p+=e*N,v+=e*C,b+=e*F,g+=e*I,_+=e*G,A+=e*Z,d+=e*j,U+=e*q,E+=e*V,x+=e*X,M+=e*D,m+=e*H,B+=e*J,S+=e*Q,e=t[9],w+=e*P,p+=e*O,v+=e*N,b+=e*C,g+=e*F,_+=e*I,A+=e*G,d+=e*Z,U+=e*j,E+=e*q,x+=e*V,M+=e*X,m+=e*D,B+=e*H,S+=e*J,K+=e*Q,e=t[10],p+=e*P,v+=e*O,b+=e*N,g+=e*C,_+=e*F,A+=e*I,d+=e*G,U+=e*Z,E+=e*j,x+=e*q,M+=e*V,m+=e*X,B+=e*D,S+=e*H,K+=e*J,T+=e*Q,e=t[11],v+=e*P,b+=e*O,g+=e*N,_+=e*C,A+=e*F,d+=e*I,U+=e*G,E+=e*Z,x+=e*j,M+=e*q,m+=e*V,B+=e*X;S+=e*D;K+=e*H,T+=e*J,Y+=e*Q,e=t[12],b+=e*P,g+=e*O,_+=e*N,A+=e*C,d+=e*F,U+=e*I,E+=e*G,x+=e*Z,M+=e*j,m+=e*q,B+=e*V,S+=e*X,K+=e*D,T+=e*H,Y+=e*J,k+=e*Q,e=t[13],g+=e*P,_+=e*O,A+=e*N,d+=e*C,U+=e*F,E+=e*I,x+=e*G,M+=e*Z,m+=e*j,B+=e*q,S+=e*V,K+=e*X,T+=e*D,Y+=e*H,k+=e*J,L+=e*Q,e=t[14],_+=e*P,A+=e*O,d+=e*N,U+=e*C,E+=e*F,x+=e*I,M+=e*G,m+=e*Z,B+=e*j,S+=e*q,K+=e*V,T+=e*X,Y+=e*D,k+=e*H,L+=e*J,z+=e*Q,e=t[15],A+=e*P,d+=e*O,U+=e*N,E+=e*C,x+=e*F,M+=e*I,m+=e*G,B+=e*Z,S+=e*j,K+=e*q,T+=e*V,Y+=e*X,k+=e*D,L+=e*H,z+=e*J,R+=e*Q,i+=38*d,h+=38*U,a+=38*E,f+=38*x,s+=38*M,c+=38*m,u+=38*B,y+=38*S,l+=38*K,w+=38*T,p+=38*Y,v+=38*k,b+=38*L,g+=38*z,_+=38*R,o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=_+o+65535,o=Math.floor(e/65536),_=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=_+o+65535,o=Math.floor(e/65536),_=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),r[0]=i,r[1]=h,r[2]=a,r[3]=f,r[4]=s,r[5]=c,r[6]=u,r[7]=y,r[8]=l,r[9]=w,r[10]=p,r[11]=v,r[12]=b,r[13]=g;r[14]=_;r[15]=A}function B(r,t){m(r,t,t)}function S(r,t){var n,e=$();for(n=0;n<16;n++)e[n]=t[n];for(n=253;n>=0;n--)B(e,e),2!==n&&4!==n&&m(e,e,t);for(n=0;n<16;n++)r[n]=e[n]}function K(r,t){var n,e=$();for(n=0;n<16;n++)e[n]=t[n];for(n=250;n>=0;n--)B(e,e),1!==n&&m(e,e,t);for(n=0;n<16;n++)r[n]=e[n]}function T(r,t,n){var e,o,i=new Uint8Array(32),h=new Float64Array(80),a=$(),f=$(),s=$(),c=$(),u=$(),y=$();for(o=0;o<31;o++)i[o]=t[o];for(i[31]=127&t[31]|64,i[0]&=248,E(h,n),o=0;o<16;o++)f[o]=h[o],c[o]=a[o]=s[o]=0;for(a[0]=c[0]=1,o=254;o>=0;--o)e=i[o>>>3]>>>(7&o)&1,_(a,f,e),_(s,c,e),x(u,a,s),M(a,a,s),x(s,f,c),M(f,f,c),B(c,u),B(y,a),m(a,s,a),m(s,f,u),x(u,a,s),M(a,a,s),B(f,a),M(s,c,y),m(a,s,ir),x(a,a,c),m(s,s,a),m(a,c,y),m(c,f,h),B(f,u),_(a,f,e),_(s,c,e);for(o=0;o<16;o++)h[o+16]=a[o],h[o+32]=s[o],h[o+48]=f[o],h[o+64]=c[o];var l=h.subarray(32),w=h.subarray(16);return S(l,l),m(w,w,l),A(r,w),0}function Y(r,t){return T(r,t,nr)}function k(r,t){return rr(t,32),Y(r,t)}function L(r,t,n){var e=new Uint8Array(32);return T(e,n,t),f(r,tr,e,ur)}function z(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),lr(r,t,n,e,h)}function R(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),wr(r,t,n,e,h)}function P(r,t,n,e){for(var o,i,h,a,f,s,c,u,y,l,w,p,v,b,g,_,A,d,U,E,x,M,m,B,S,K,T=new Int32Array(16),Y=new Int32Array(16),k=r[0],L=r[1],z=r[2],R=r[3],P=r[4],O=r[5],N=r[6],C=r[7],F=t[0],I=t[1],G=t[2],Z=t[3],j=t[4],q=t[5],V=t[6],X=t[7],D=0;e>=128;){for(U=0;U<16;U++)E=8*U+D,T[U]=n[E+0]<<24|n[E+1]<<16|n[E+2]<<8|n[E+3],Y[U]=n[E+4]<<24|n[E+5]<<16|n[E+6]<<8|n[E+7];for(U=0;U<80;U++)if(o=k,i=L,h=z,a=R,f=P,s=O,c=N,u=C,y=F,l=I,w=G,p=Z,v=j,b=q,g=V,_=X,x=C,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(P>>>14|j<<18)^(P>>>18|j<<14)^(j>>>9|P<<23),M=(j>>>14|P<<18)^(j>>>18|P<<14)^(P>>>9|j<<23),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=P&O^~P&N,M=j&q^~j&V,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=pr[2*U],M=pr[2*U+1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=T[U%16],M=Y[U%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,A=65535&S|K<<16,d=65535&m|B<<16,x=A,M=d,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(k>>>28|F<<4)^(F>>>2|k<<30)^(F>>>7|k<<25),M=(F>>>28|k<<4)^(k>>>2|F<<30)^(k>>>7|F<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=k&L^k&z^L&z,M=F&I^F&G^I&G,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,u=65535&S|K<<16,_=65535&m|B<<16,x=a,M=p,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=A,M=d,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,a=65535&S|K<<16,p=65535&m|B<<16,L=o,z=i,R=h,P=a,O=f,N=s,C=c,k=u,I=y,G=l,Z=w,j=p,q=v,V=b,X=g,F=_,U%16===15)for(E=0;E<16;E++)x=T[E],M=Y[E],m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=T[(E+9)%16],M=Y[(E+9)%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+1)%16],d=Y[(E+1)%16],x=(A>>>1|d<<31)^(A>>>8|d<<24)^A>>>7,M=(d>>>1|A<<31)^(d>>>8|A<<24)^(d>>>7|A<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+14)%16],d=Y[(E+14)%16],x=(A>>>19|d<<13)^(d>>>29|A<<3)^A>>>6,M=(d>>>19|A<<13)^(A>>>29|d<<3)^(d>>>6|A<<26),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,T[E]=65535&S|K<<16,Y[E]=65535&m|B<<16;x=k,M=F,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[0],M=t[0],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[0]=k=65535&S|K<<16,t[0]=F=65535&m|B<<16,x=L,M=I,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[1],M=t[1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[1]=L=65535&S|K<<16,t[1]=I=65535&m|B<<16,x=z,M=G,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[2],M=t[2],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[2]=z=65535&S|K<<16,t[2]=G=65535&m|B<<16,x=R,M=Z,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[3],M=t[3],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[3]=R=65535&S|K<<16,t[3]=Z=65535&m|B<<16,x=P,M=j,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[4],M=t[4],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[4]=P=65535&S|K<<16,t[4]=j=65535&m|B<<16,x=O,M=q,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[5],M=t[5],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[5]=O=65535&S|K<<16,t[5]=q=65535&m|B<<16,x=N,M=V,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[6],M=t[6],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[6]=N=65535&S|K<<16,t[6]=V=65535&m|B<<16,x=C,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[7],M=t[7],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[7]=C=65535&S|K<<16,t[7]=X=65535&m|B<<16,D+=128,e-=128}return e}function O(r,n,e){var o,i=new Int32Array(8),h=new Int32Array(8),a=new Uint8Array(256),f=e;for(i[0]=1779033703,i[1]=3144134277,i[2]=1013904242,i[3]=2773480762,i[4]=1359893119,i[5]=2600822924,i[6]=528734635,i[7]=1541459225,h[0]=4089235720,h[1]=2227873595,h[2]=4271175723,h[3]=1595750129,h[4]=2917565137,h[5]=725511199,h[6]=4215389547,h[7]=327033209,P(i,h,n,e),e%=128,o=0;o<e;o++)a[o]=n[f-e+o];for(a[e]=128,e=256-128*(e<112?1:0),a[e-9]=0,t(a,e-8,f/536870912|0,f<<3),P(i,h,a,e),o=0;o<8;o++)t(r,8*o,i[o],h[o]);return 0}function N(r,t){var n=$(),e=$(),o=$(),i=$(),h=$(),a=$(),f=$(),s=$(),c=$();M(n,r[1],r[0]),M(c,t[1],t[0]),m(n,n,c),x(e,r[0],r[1]),x(c,t[0],t[1]),m(e,e,c),m(o,r[3],t[3]),m(o,o,ar),m(i,r[2],t[2]),x(i,i,i),M(h,e,n),M(a,i,o),x(f,i,o),x(s,e,n),m(r[0],h,a),m(r[1],s,f),m(r[2],f,a),m(r[3],h,s)}function C(r,t,n){var e;for(e=0;e<4;e++)_(r[e],t[e],n)}function F(r,t){var n=$(),e=$(),o=$();S(o,t[2]),m(n,t[0],o),m(e,t[1],o),A(r,e),r[31]^=U(n)<<7}function I(r,t,n){var e,o;for(b(r[0],er),b(r[1],or),b(r[2],or),b(r[3],er),o=255;o>=0;--o)e=n[o/8|0]>>(7&o)&1,C(r,t,e),N(t,r),N(r,r),C(r,t,e)}function G(r,t){var n=[$(),$(),$(),$()];b(n[0],fr),b(n[1],sr),b(n[2],or),m(n[3],fr,sr),I(r,n,t)}function Z(r,t,n){var e,o=new Uint8Array(64),i=[$(),$(),$(),$()];for(n||rr(t,32),O(o,t,32),o[0]&=248,o[31]&=127,o[31]|=64,G(i,o),F(r,i),e=0;e<32;e++)t[e+32]=r[e];return 0}function j(r,t){var n,e,o,i;for(e=63;e>=32;--e){for(n=0,o=e-32,i=e-12;o<i;++o)t[o]+=n-16*t[e]*vr[o-(e-32)],n=t[o]+128>>8,t[o]-=256*n;t[o]+=n,t[e]=0}for(n=0,o=0;o<32;o++)t[o]+=n-(t[31]>>4)*vr[o],n=t[o]>>8,t[o]&=255;for(o=0;o<32;o++)t[o]-=n*vr[o];for(e=0;e<32;e++)t[e+1]+=t[e]>>8,r[e]=255&t[e]}function q(r){var t,n=new Float64Array(64);for(t=0;t<64;t++)n[t]=r[t];for(t=0;t<64;t++)r[t]=0;j(r,n)}function V(r,t,n,e){var o,i,h=new Uint8Array(64),a=new Uint8Array(64),f=new Uint8Array(64),s=new Float64Array(64),c=[$(),$(),$(),$()];O(h,e,32),h[0]&=248,h[31]&=127,h[31]|=64;var u=n+64;for(o=0;o<n;o++)r[64+o]=t[o];for(o=0;o<32;o++)r[32+o]=h[32+o];for(O(f,r.subarray(32),n+32),q(f),G(c,f),F(r,c),o=32;o<64;o++)r[o]=e[o];for(O(a,r,n+64),q(a),o=0;o<64;o++)s[o]=0;for(o=0;o<32;o++)s[o]=f[o];for(o=0;o<32;o++)for(i=0;i<32;i++)s[o+i]+=a[o]*h[i];return j(r.subarray(32),s),u}function X(r,t){var n=$(),e=$(),o=$(),i=$(),h=$(),a=$(),f=$();return b(r[2],or),E(r[1],t),B(o,r[1]),m(i,o,hr),M(o,o,r[2]),x(i,r[2],i),B(h,i),B(a,h),m(f,a,h),m(n,f,o),m(n,n,i),K(n,n),m(n,n,o),m(n,n,i),m(n,n,i),m(r[0],n,i),B(e,r[0]),m(e,e,i),d(e,o)&&m(r[0],r[0],cr),B(e,r[0]),m(e,e,i),d(e,o)?-1:(U(r[0])===t[31]>>7&&M(r[0],er,r[0]),m(r[3],r[0],r[1]),0)}function D(r,t,n,e){var i,h,a=new Uint8Array(32),f=new Uint8Array(64),s=[$(),$(),$(),$()],c=[$(),$(),$(),$()];if(h=-1,n<64)return-1;if(X(c,e))return-1;for(i=0;i<n;i++)r[i]=t[i];for(i=0;i<32;i++)r[i+32]=e[i];if(O(f,r,n),q(f),I(s,c,f),G(c,t.subarray(32)),N(s,c),F(a,s),n-=64,o(t,0,a,0)){for(i=0;i<n;i++)r[i]=0;return-1}for(i=0;i<n;i++)r[i]=t[i+64];return h=n}function H(r,t){if(r.length!==br)throw new Error("bad key size");if(t.length!==gr)throw new Error("bad nonce size")}function J(r,t){if(r.length!==Er)throw new Error("bad public key size");if(t.length!==xr)throw new Error("bad secret key size")}function Q(){var r,t;for(t=0;t<arguments.length;t++)if("[object Uint8Array]"!==(r=Object.prototype.toString.call(arguments[t])))throw new TypeError("unexpected type "+r+", use Uint8Array")}function W(r){for(var t=0;t<r.length;t++)r[t]=0}var $=function(r){var t,n=new Float64Array(16);if(r)for(t=0;t<r.length;t++)n[t]=r[t];return n},rr=function(){throw new Error("no PRNG")},tr=new Uint8Array(16),nr=new Uint8Array(32);nr[0]=9;var er=$(),or=$([1]),ir=$([56129,1]),hr=$([30883,4953,19914,30187,55467,16705,2637,112,59544,30585,16505,36039,65139,11119,27886,20995]),ar=$([61785,9906,39828,60374,45398,33411,5274,224,53552,61171,33010,6542,64743,22239,55772,9222]),fr=$([54554,36645,11616,51542,42930,38181,51040,26924,56412,64982,57905,49316,21502,52590,14035,8553]),sr=$([26200,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214]),cr=$([41136,18958,6951,50414,58488,44335,6150,12099,55207,15867,153,11085,57099,20417,9344,11139]),ur=new Uint8Array([101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107]),yr=function(r){this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.leftover=0,this.fin=0;var t,n,e,o,i,h,a,f;t=255&r[0]|(255&r[1])<<8,this.r[0]=8191&t,n=255&r[2]|(255&r[3])<<8,this.r[1]=8191&(t>>>13|n<<3),e=255&r[4]|(255&r[5])<<8,this.r[2]=7939&(n>>>10|e<<6),o=255&r[6]|(255&r[7])<<8,this.r[3]=8191&(e>>>7|o<<9),i=255&r[8]|(255&r[9])<<8,this.r[4]=255&(o>>>4|i<<12),this.r[5]=i>>>1&8190,h=255&r[10]|(255&r[11])<<8,this.r[6]=8191&(i>>>14|h<<2),a=255&r[12]|(255&r[13])<<8,this.r[7]=8065&(h>>>11|a<<5),f=255&r[14]|(255&r[15])<<8,this.r[8]=8191&(a>>>8|f<<8),this.r[9]=f>>>5&127,this.pad[0]=255&r[16]|(255&r[17])<<8,this.pad[1]=255&r[18]|(255&r[19])<<8,this.pad[2]=255&r[20]|(255&r[21])<<8,this.pad[3]=255&r[22]|(255&r[23])<<8,this.pad[4]=255&r[24]|(255&r[25])<<8,this.pad[5]=255&r[26]|(255&r[27])<<8,this.pad[6]=255&r[28]|(255&r[29])<<8,this.pad[7]=255&r[30]|(255&r[31])<<8};yr.prototype.blocks=function(r,t,n){for(var e,o,i,h,a,f,s,c,u,y,l,w,p,v,b,g,_,A,d,U=this.fin?0:2048,E=this.h[0],x=this.h[1],M=this.h[2],m=this.h[3],B=this.h[4],S=this.h[5],K=this.h[6],T=this.h[7],Y=this.h[8],k=this.h[9],L=this.r[0],z=this.r[1],R=this.r[2],P=this.r[3],O=this.r[4],N=this.r[5],C=this.r[6],F=this.r[7],I=this.r[8],G=this.r[9];n>=16;)e=255&r[t+0]|(255&r[t+1])<<8,E+=8191&e,o=255&r[t+2]|(255&r[t+3])<<8,x+=8191&(e>>>13|o<<3),i=255&r[t+4]|(255&r[t+5])<<8,M+=8191&(o>>>10|i<<6),h=255&r[t+6]|(255&r[t+7])<<8,m+=8191&(i>>>7|h<<9),a=255&r[t+8]|(255&r[t+9])<<8,B+=8191&(h>>>4|a<<12),S+=a>>>1&8191,f=255&r[t+10]|(255&r[t+11])<<8,K+=8191&(a>>>14|f<<2),s=255&r[t+12]|(255&r[t+13])<<8,T+=8191&(f>>>11|s<<5),c=255&r[t+14]|(255&r[t+15])<<8,Y+=8191&(s>>>8|c<<8),k+=c>>>5|U,u=0,y=u,y+=E*L,y+=x*(5*G),y+=M*(5*I),y+=m*(5*F),y+=B*(5*C),u=y>>>13,y&=8191,y+=S*(5*N),y+=K*(5*O),y+=T*(5*P),y+=Y*(5*R),y+=k*(5*z),u+=y>>>13,y&=8191,l=u,l+=E*z,l+=x*L,l+=M*(5*G),l+=m*(5*I),l+=B*(5*F),u=l>>>13,l&=8191,l+=S*(5*C),l+=K*(5*N),l+=T*(5*O),l+=Y*(5*P),l+=k*(5*R),u+=l>>>13,l&=8191,w=u,w+=E*R,w+=x*z,w+=M*L,w+=m*(5*G),w+=B*(5*I),u=w>>>13,w&=8191,w+=S*(5*F),w+=K*(5*C),w+=T*(5*N),w+=Y*(5*O),w+=k*(5*P),u+=w>>>13,w&=8191,p=u,p+=E*P,p+=x*R,p+=M*z,p+=m*L,p+=B*(5*G),u=p>>>13,p&=8191,p+=S*(5*I),p+=K*(5*F),p+=T*(5*C),p+=Y*(5*N),p+=k*(5*O),u+=p>>>13,p&=8191,v=u,v+=E*O,v+=x*P,v+=M*R,v+=m*z,v+=B*L,u=v>>>13,v&=8191,v+=S*(5*G),v+=K*(5*I),v+=T*(5*F),v+=Y*(5*C),v+=k*(5*N),u+=v>>>13,v&=8191,b=u,b+=E*N,b+=x*O,b+=M*P,b+=m*R,b+=B*z,u=b>>>13,b&=8191,b+=S*L,b+=K*(5*G),b+=T*(5*I),b+=Y*(5*F),b+=k*(5*C),u+=b>>>13,b&=8191,g=u,g+=E*C,g+=x*N,g+=M*O,g+=m*P,g+=B*R,u=g>>>13,g&=8191,g+=S*z,g+=K*L,g+=T*(5*G),g+=Y*(5*I),g+=k*(5*F),u+=g>>>13,g&=8191,_=u,_+=E*F,_+=x*C,_+=M*N,_+=m*O,_+=B*P,u=_>>>13,_&=8191,_+=S*R,_+=K*z,_+=T*L,_+=Y*(5*G),_+=k*(5*I),u+=_>>>13,_&=8191,A=u,A+=E*I,A+=x*F,A+=M*C,A+=m*N,A+=B*O,u=A>>>13,A&=8191,A+=S*P,A+=K*R,A+=T*z,A+=Y*L,A+=k*(5*G),u+=A>>>13,A&=8191,d=u,d+=E*G,d+=x*I,d+=M*F,d+=m*C,d+=B*N,u=d>>>13,d&=8191,d+=S*O,d+=K*P,d+=T*R,d+=Y*z,d+=k*L,u+=d>>>13,d&=8191,u=(u<<2)+u|0,u=u+y|0,y=8191&u,u>>>=13,l+=u,E=y,x=l,M=w,m=p,B=v,S=b,K=g,T=_,Y=A,k=d,t+=16,n-=16;this.h[0]=E,this.h[1]=x,this.h[2]=M,this.h[3]=m,this.h[4]=B,this.h[5]=S,this.h[6]=K,this.h[7]=T,this.h[8]=Y,this.h[9]=k},yr.prototype.finish=function(r,t){var n,e,o,i,h=new Uint16Array(10);if(this.leftover){for(i=this.leftover,this.buffer[i++]=1;i<16;i++)this.buffer[i]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(n=this.h[1]>>>13,this.h[1]&=8191,i=2;i<10;i++)this.h[i]+=n,n=this.h[i]>>>13,this.h[i]&=8191;for(this.h[0]+=5*n,n=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=n,n=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=n,h[0]=this.h[0]+5,n=h[0]>>>13,h[0]&=8191,i=1;i<10;i++)h[i]=this.h[i]+n,n=h[i]>>>13,h[i]&=8191;for(h[9]-=8192,e=(1^n)-1,i=0;i<10;i++)h[i]&=e;for(e=~e,i=0;i<10;i++)this.h[i]=this.h[i]&e|h[i];for(this.h[0]=65535&(this.h[0]|this.h[1]<<13),this.h[1]=65535&(this.h[1]>>>3|this.h[2]<<10),this.h[2]=65535&(this.h[2]>>>6|this.h[3]<<7),this.h[3]=65535&(this.h[3]>>>9|this.h[4]<<4),this.h[4]=65535&(this.h[4]>>>12|this.h[5]<<1|this.h[6]<<14),this.h[5]=65535&(this.h[6]>>>2|this.h[7]<<11),this.h[6]=65535&(this.h[7]>>>5|this.h[8]<<8),this.h[7]=65535&(this.h[8]>>>8|this.h[9]<<5),o=this.h[0]+this.pad[0],this.h[0]=65535&o,i=1;i<8;i++)o=(this.h[i]+this.pad[i]|0)+(o>>>16)|0,this.h[i]=65535&o;r[t+0]=this.h[0]>>>0&255,r[t+1]=this.h[0]>>>8&255,r[t+2]=this.h[1]>>>0&255,r[t+3]=this.h[1]>>>8&255,r[t+4]=this.h[2]>>>0&255,r[t+5]=this.h[2]>>>8&255,r[t+6]=this.h[3]>>>0&255,r[t+7]=this.h[3]>>>8&255,r[t+8]=this.h[4]>>>0&255,r[t+9]=this.h[4]>>>8&255,r[t+10]=this.h[5]>>>0&255,r[t+11]=this.h[5]>>>8&255,r[t+12]=this.h[6]>>>0&255,r[t+13]=this.h[6]>>>8&255,r[t+14]=this.h[7]>>>0&255,r[t+15]=this.h[7]>>>8&255},yr.prototype.update=function(r,t,n){var e,o;if(this.leftover){for(o=16-this.leftover,o>n&&(o=n),e=0;e<o;e++)this.buffer[this.leftover+e]=r[t+e];if(n-=o,t+=o,this.leftover+=o,this.leftover<16)return;this.blocks(this.buffer,0,16),this.leftover=0}if(n>=16&&(o=n-n%16,this.blocks(r,t,o),t+=o,n-=o),n){for(e=0;e<n;e++)this.buffer[this.leftover+e]=r[t+e];this.leftover+=n}};var lr=p,wr=v,pr=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],vr=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]),br=32,gr=24,_r=32,Ar=16,dr=32,Ur=32,Er=32,xr=32,Mr=32,mr=gr,Br=_r,Sr=Ar,Kr=64,Tr=32,Yr=64,kr=32,Lr=64;r.lowlevel={crypto_core_hsalsa20:f,crypto_stream_xor:y,crypto_stream:u,crypto_stream_salsa20_xor:s,crypto_stream_salsa20:c,crypto_onetimeauth:l,crypto_onetimeauth_verify:w,crypto_verify_16:e,crypto_verify_32:o,crypto_secretbox:p,crypto_secretbox_open:v,crypto_scalarmult:T,crypto_scalarmult_base:Y,crypto_box_beforenm:L,crypto_box_afternm:lr,crypto_box:z,crypto_box_open:R,crypto_box_keypair:k,crypto_hash:O,crypto_sign:V,crypto_sign_keypair:Z,crypto_sign_open:D,crypto_secretbox_KEYBYTES:br,crypto_secretbox_NONCEBYTES:gr,crypto_secretbox_ZEROBYTES:_r,crypto_secretbox_BOXZEROBYTES:Ar,crypto_scalarmult_BYTES:dr,crypto_scalarmult_SCALARBYTES:Ur,crypto_box_PUBLICKEYBYTES:Er,crypto_box_SECRETKEYBYTES:xr,crypto_box_BEFORENMBYTES:Mr,crypto_box_NONCEBYTES:mr,crypto_box_ZEROBYTES:Br,crypto_box_BOXZEROBYTES:Sr,crypto_sign_BYTES:Kr,crypto_sign_PUBLICKEYBYTES:Tr,crypto_sign_SECRETKEYBYTES:Yr,crypto_sign_SEEDBYTES:kr,crypto_hash_BYTES:Lr},r.util||(r.util={},r.util.decodeUTF8=r.util.encodeUTF8=r.util.encodeBase64=r.util.decodeBase64=function(){throw new Error("nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js")}),r.randomBytes=function(r){var t=new Uint8Array(r);return rr(t,r),t},r.secretbox=function(r,t,n){Q(r,t,n),H(n,t);for(var e=new Uint8Array(_r+r.length),o=new Uint8Array(e.length),i=0;i<r.length;i++)e[i+_r]=r[i];return p(o,e,e.length,t,n),o.subarray(Ar)},r.secretbox.open=function(r,t,n){Q(r,t,n),H(n,t);for(var e=new Uint8Array(Ar+r.length),o=new Uint8Array(e.length),i=0;i<r.length;i++)e[i+Ar]=r[i];return!(e.length<32)&&(0===v(o,e,e.length,t,n)&&o.subarray(_r))},r.secretbox.keyLength=br,r.secretbox.nonceLength=gr,r.secretbox.overheadLength=Ar,r.scalarMult=function(r,t){if(Q(r,t),r.length!==Ur)throw new Error("bad n size");if(t.length!==dr)throw new Error("bad p size");var n=new Uint8Array(dr);return T(n,r,t),n},r.scalarMult.base=function(r){if(Q(r),r.length!==Ur)throw new Error("bad n size");var t=new Uint8Array(dr);return Y(t,r),t},r.scalarMult.scalarLength=Ur,r.scalarMult.groupElementLength=dr,r.box=function(t,n,e,o){var i=r.box.before(e,o);return r.secretbox(t,n,i)},r.box.before=function(r,t){Q(r,t),J(r,t);var n=new Uint8Array(Mr);return L(n,r,t),n},r.box.after=r.secretbox,r.box.open=function(t,n,e,o){var i=r.box.before(e,o);return r.secretbox.open(t,n,i)},r.box.open.after=r.secretbox.open,r.box.keyPair=function(){var r=new Uint8Array(Er),t=new Uint8Array(xr);return k(r,t),{publicKey:r,secretKey:t}},r.box.keyPair.fromSecretKey=function(r){if(Q(r),r.length!==xr)throw new Error("bad secret key size");var t=new Uint8Array(Er);return Y(t,r),{publicKey:t,secretKey:new Uint8Array(r)}},r.box.publicKeyLength=Er,r.box.secretKeyLength=xr,r.box.sharedKeyLength=Mr,r.box.nonceLength=mr,r.box.overheadLength=r.secretbox.overheadLength,r.sign=function(r,t){if(Q(r,t),t.length!==Yr)throw new Error("bad secret key size");var n=new Uint8Array(Kr+r.length);return V(n,r,r.length,t),n},r.sign.open=function(r,t){if(2!==arguments.length)throw new Error("nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?");if(Q(r,t),t.length!==Tr)throw new Error("bad public key size");var n=new Uint8Array(r.length),e=D(n,r,r.length,t);if(e<0)return null;for(var o=new Uint8Array(e),i=0;i<o.length;i++)o[i]=n[i];return o},r.sign.detached=function(t,n){for(var e=r.sign(t,n),o=new Uint8Array(Kr),i=0;i<o.length;i++)o[i]=e[i];return o},r.sign.detached.verify=function(r,t,n){if(Q(r,t,n),t.length!==Kr)throw new Error("bad signature size");if(n.length!==Tr)throw new Error("bad public key size");var e,o=new Uint8Array(Kr+r.length),i=new Uint8Array(Kr+r.length);for(e=0;e<Kr;e++)o[e]=t[e];for(e=0;e<r.length;e++)o[e+Kr]=r[e];return D(i,o,o.length,n)>=0},r.sign.keyPair=function(){var r=new Uint8Array(Tr),t=new Uint8Array(Yr);return Z(r,t),{publicKey:r,secretKey:t}},r.sign.keyPair.fromSecretKey=function(r){if(Q(r),r.length!==Yr)throw new Error("bad secret key size");for(var t=new Uint8Array(Tr),n=0;n<t.length;n++)t[n]=r[32+n];return{publicKey:t,secretKey:new Uint8Array(r)}},r.sign.keyPair.fromSeed=function(r){if(Q(r),r.length!==kr)throw new Error("bad seed size");for(var t=new Uint8Array(Tr),n=new Uint8Array(Yr),e=0;e<32;e++)n[e]=r[e];return Z(t,n,!0),{publicKey:t,secretKey:n}},r.sign.publicKeyLength=Tr,r.sign.secretKeyLength=Yr,r.sign.seedLength=kr,r.sign.signatureLength=Kr,r.hash=function(r){Q(r);var t=new Uint8Array(Lr);return O(t,r,r.length),t},r.hash.hashLength=Lr,r.verify=function(r,t){return Q(r,t),
0!==r.length&&0!==t.length&&(r.length===t.length&&0===n(r,0,t,0,r.length))},r.setPRNG=function(r){rr=r},function(){var t="undefined"!=typeof self?self.crypto||self.msCrypto:null;if(t&&t.getRandomValues){var n=65536;r.setPRNG(function(r,e){var o,i=new Uint8Array(e);for(o=0;o<e;o+=n)t.getRandomValues(i.subarray(o,o+Math.min(e-o,n)));for(o=0;o<e;o++)r[o]=i[o];W(i)})}else"undefined"!=typeof require&&(t=require("crypto"),t&&t.randomBytes&&r.setPRNG(function(r,n){var e,o=t.randomBytes(n);for(e=0;e<n;e++)r[e]=o[e];W(o)}))}()}("undefined"!=typeof module&&module.exports?module.exports:self.nacl=self.nacl||{});(function(nacl) {
'use strict';

// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri.
// Public domain.
//
// Implementation derived from TweetNaCl version 20140427.
// See for details: http://tweetnacl.cr.yp.to/

var u64 = function(h, l) { this.hi = h|0 >>> 0; this.lo = l|0 >>> 0; };
var gf = function(init) {
  var i, r = new Float64Array(16);
  if (init) for (i = 0; i < init.length; i++) r[i] = init[i];
  return r;
};

//  Pluggable, initialized in high-level API below.
var randombytes = function(/* x, n */) { throw new Error('no PRNG'); };

var _0 = new Uint8Array(16);
var _9 = new Uint8Array(32); _9[0] = 9;

var gf0 = gf(),
    gf1 = gf([1]),
    _121665 = gf([0xdb41, 1]),
    D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),
    D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),
    X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),
    Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),
    I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);

function L32(x, c) { return (x << c) | (x >>> (32 - c)); }

function ld32(x, i) {
  var u = x[i+3] & 0xff;
  u = (u<<8)|(x[i+2] & 0xff);
  u = (u<<8)|(x[i+1] & 0xff);
  return (u<<8)|(x[i+0] & 0xff);
}

function dl64(x, i) {
  var h = (x[i] << 24) | (x[i+1] << 16) | (x[i+2] << 8) | x[i+3];
  var l = (x[i+4] << 24) | (x[i+5] << 16) | (x[i+6] << 8) | x[i+7];
  return new u64(h, l);
}

function st32(x, j, u) {
  var i;
  for (i = 0; i < 4; i++) { x[j+i] = u & 255; u >>>= 8; }
}

function ts64(x, i, u) {
  x[i]   = (u.hi >> 24) & 0xff;
  x[i+1] = (u.hi >> 16) & 0xff;
  x[i+2] = (u.hi >>  8) & 0xff;
  x[i+3] = u.hi & 0xff;
  x[i+4] = (u.lo >> 24)  & 0xff;
  x[i+5] = (u.lo >> 16)  & 0xff;
  x[i+6] = (u.lo >>  8)  & 0xff;
  x[i+7] = u.lo & 0xff;
}

function vn(x, xi, y, yi, n) {
  var i,d = 0;
  for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i];
  return (1 & ((d - 1) >>> 8)) - 1;
}

function crypto_verify_16(x, xi, y, yi) {
  return vn(x,xi,y,yi,16);
}

function crypto_verify_32(x, xi, y, yi) {
  return vn(x,xi,y,yi,32);
}

function core(out,inp,k,c,h) {
  var w = new Uint32Array(16), x = new Uint32Array(16),
      y = new Uint32Array(16), t = new Uint32Array(4);
  var i, j, m;

  for (i = 0; i < 4; i++) {
    x[5*i] = ld32(c, 4*i);
    x[1+i] = ld32(k, 4*i);
    x[6+i] = ld32(inp, 4*i);
    x[11+i] = ld32(k, 16+4*i);
  }

  for (i = 0; i < 16; i++) y[i] = x[i];

  for (i = 0; i < 20; i++) {
    for (j = 0; j < 4; j++) {
      for (m = 0; m < 4; m++) t[m] = x[(5*j+4*m)%16];
      t[1] ^= L32((t[0]+t[3])|0, 7);
      t[2] ^= L32((t[1]+t[0])|0, 9);
      t[3] ^= L32((t[2]+t[1])|0,13);
      t[0] ^= L32((t[3]+t[2])|0,18);
      for (m = 0; m < 4; m++) w[4*j+(j+m)%4] = t[m];
    }
    for (m = 0; m < 16; m++) x[m] = w[m];
  }

  if (h) {
    for (i = 0; i < 16; i++) x[i] = (x[i] + y[i]) | 0;
    for (i = 0; i < 4; i++) {
      x[5*i] = (x[5*i] - ld32(c, 4*i)) | 0;
      x[6+i] = (x[6+i] - ld32(inp, 4*i)) | 0;
    }
    for (i = 0; i < 4; i++) {
      st32(out,4*i,x[5*i]);
      st32(out,16+4*i,x[6+i]);
    }
  } else {
    for (i = 0; i < 16; i++) st32(out, 4 * i, (x[i] + y[i]) | 0);
  }
}

function crypto_core_salsa20(out,inp,k,c) {
  core(out,inp,k,c,false);
  return 0;
}

function crypto_core_hsalsa20(out,inp,k,c) {
  core(out,inp,k,c,true);
  return 0;
}

var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);
            // "expand 32-byte k"

function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) {
  var z = new Uint8Array(16), x = new Uint8Array(64);
  var u, i;
  if (!b) return 0;
  for (i = 0; i < 16; i++) z[i] = 0;
  for (i = 0; i < 8; i++) z[i] = n[i];
  while (b >= 64) {
    crypto_core_salsa20(x,z,k,sigma);
    for (i = 0; i < 64; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i];
    u = 1;
    for (i = 8; i < 16; i++) {
      u = u + (z[i] & 0xff) | 0;
      z[i] = u & 0xff;
      u >>>= 8;
    }
    b -= 64;
    cpos += 64;
    if (m) mpos += 64;
  }
  if (b > 0) {
    crypto_core_salsa20(x,z,k,sigma);
    for (i = 0; i < b; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i];
  }
  return 0;
}

function crypto_stream_salsa20(c,cpos,d,n,k) {
  return crypto_stream_salsa20_xor(c,cpos,null,0,d,n,k);
}

function crypto_stream(c,cpos,d,n,k) {
  var s = new Uint8Array(32);
  crypto_core_hsalsa20(s,n,k,sigma);
  return crypto_stream_salsa20(c,cpos,d,n.subarray(16),s);
}

function crypto_stream_xor(c,cpos,m,mpos,d,n,k) {
  var s = new Uint8Array(32);
  crypto_core_hsalsa20(s,n,k,sigma);
  return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,n.subarray(16),s);
}

function add1305(h, c) {
  var j, u = 0;
  for (j = 0; j < 17; j++) {
    u = (u + ((h[j] + c[j]) | 0)) | 0;
    h[j] = u & 255;
    u >>>= 8;
  }
}

var minusp = new Uint32Array([
  5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252
]);

function crypto_onetimeauth(out, outpos, m, mpos, n, k) {
  var s, i, j, u;
  var x = new Uint32Array(17), r = new Uint32Array(17),
      h = new Uint32Array(17), c = new Uint32Array(17),
      g = new Uint32Array(17);
  for (j = 0; j < 17; j++) r[j]=h[j]=0;
  for (j = 0; j < 16; j++) r[j]=k[j];
  r[3]&=15;
  r[4]&=252;
  r[7]&=15;
  r[8]&=252;
  r[11]&=15;
  r[12]&=252;
  r[15]&=15;

  while (n > 0) {
    for (j = 0; j < 17; j++) c[j] = 0;
    for (j = 0; (j < 16) && (j < n); ++j) c[j] = m[mpos+j];
    c[j] = 1;
    mpos += j; n -= j;
    add1305(h,c);
    for (i = 0; i < 17; i++) {
      x[i] = 0;
      for (j = 0; j < 17; j++) x[i] = (x[i] + (h[j] * ((j <= i) ? r[i - j] : ((320 * r[i + 17 - j])|0))) | 0) | 0;
    }
    for (i = 0; i < 17; i++) h[i] = x[i];
    u = 0;
    for (j = 0; j < 16; j++) {
      u = (u + h[j]) | 0;
      h[j] = u & 255;
      u >>>= 8;
    }
    u = (u + h[16]) | 0; h[16] = u & 3;
    u = (5 * (u >>> 2)) | 0;
    for (j = 0; j < 16; j++) {
      u = (u + h[j]) | 0;
      h[j] = u & 255;
      u >>>= 8;
    }
    u = (u + h[16]) | 0; h[16] = u;
  }

  for (j = 0; j < 17; j++) g[j] = h[j];
  add1305(h,minusp);
  s = (-(h[16] >>> 7) | 0);
  for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]);

  for (j = 0; j < 16; j++) c[j] = k[j + 16];
  c[16] = 0;
  add1305(h,c);
  for (j = 0; j < 16; j++) out[outpos+j] = h[j];
  return 0;
}

function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {
  var x = new Uint8Array(16);
  crypto_onetimeauth(x,0,m,mpos,n,k);
  return crypto_verify_16(h,hpos,x,0);
}

function crypto_secretbox(c,m,d,n,k) {
  var i;
  if (d < 32) return -1;
  crypto_stream_xor(c,0,m,0,d,n,k);
  crypto_onetimeauth(c, 16, c, 32, d - 32, c);
  for (i = 0; i < 16; i++) c[i] = 0;
  return 0;
}

function crypto_secretbox_open(m,c,d,n,k) {
  var i;
  var x = new Uint8Array(32);
  if (d < 32) return -1;
  crypto_stream(x,0,32,n,k);
  if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1;
  crypto_stream_xor(m,0,c,0,d,n,k);
  for (i = 0; i < 32; i++) m[i] = 0;
  return 0;
}

function set25519(r, a) {
  var i;
  for (i = 0; i < 16; i++) r[i] = a[i]|0;
}

function car25519(o) {
  var c;
  var i;
  for (i = 0; i < 16; i++) {
      o[i] += 65536;
      c = Math.floor(o[i] / 65536);
      o[(i+1)*(i<15?1:0)] += c - 1 + 37 * (c-1) * (i===15?1:0);
      o[i] -= (c * 65536);
  }
}

function sel25519(p, q, b) {
  var t, c = ~(b-1);
  for (var i = 0; i < 16; i++) {
    t = c & (p[i] ^ q[i]);
    p[i] ^= t;
    q[i] ^= t;
  }
}

function pack25519(o, n) {
  var i, j, b;
  var m = gf(), t = gf();
  for (i = 0; i < 16; i++) t[i] = n[i];
  car25519(t);
  car25519(t);
  car25519(t);
  for (j = 0; j < 2; j++) {
    m[0] = t[0] - 0xffed;
    for (i = 1; i < 15; i++) {
      m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1);
      m[i-1] &= 0xffff;
    }
    m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1);
    b = (m[15]>>16) & 1;
    m[14] &= 0xffff;
    sel25519(t, m, 1-b);
  }
  for (i = 0; i < 16; i++) {
    o[2*i] = t[i] & 0xff;
    o[2*i+1] = t[i]>>8;
  }
}

function neq25519(a, b) {
  var c = new Uint8Array(32), d = new Uint8Array(32);
  pack25519(c, a);
  pack25519(d, b);
  return crypto_verify_32(c, 0, d, 0);
}

function par25519(a) {
  var d = new Uint8Array(32);
  pack25519(d, a);
  return d[0] & 1;
}

function unpack25519(o, n) {
  var i;
  for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8);
  o[15] &= 0x7fff;
}

function A(o, a, b) {
  var i;
  for (i = 0; i < 16; i++) o[i] = (a[i] + b[i])|0;
}

function Z(o, a, b) {
  var i;
  for (i = 0; i < 16; i++) o[i] = (a[i] - b[i])|0;
}

function M(o, a, b) {
  var i, j, t = new Float64Array(31);
  for (i = 0; i < 31; i++) t[i] = 0;
  for (i = 0; i < 16; i++) {
    for (j = 0; j < 16; j++) {
      t[i+j] += a[i] * b[j];
    }
  }
  for (i = 0; i < 15; i++) {
    t[i] += 38 * t[i+16];
  }
  for (i = 0; i < 16; i++) o[i] = t[i];
  car25519(o);
  car25519(o);
}

function S(o, a) {
  M(o, a, a);
}

function inv25519(o, i) {
  var c = gf();
  var a;
  for (a = 0; a < 16; a++) c[a] = i[a];
  for (a = 253; a >= 0; a--) {
    S(c, c);
    if(a !== 2 && a !== 4) M(c, c, i);
  }
  for (a = 0; a < 16; a++) o[a] = c[a];
}

function pow2523(o, i) {
  var c = gf();
  var a;
  for (a = 0; a < 16; a++) c[a] = i[a];
  for (a = 250; a >= 0; a--) {
      S(c, c);
      if(a !== 1) M(c, c, i);
  }
  for (a = 0; a < 16; a++) o[a] = c[a];
}

function crypto_scalarmult(q, n, p) {
  var z = new Uint8Array(32);
  var x = new Float64Array(80), r, i;
  var a = gf(), b = gf(), c = gf(),
      d = gf(), e = gf(), f = gf();
  for (i = 0; i < 31; i++) z[i] = n[i];
  z[31]=(n[31]&127)|64;
  z[0]&=248;
  unpack25519(x,p);
  for (i = 0; i < 16; i++) {
    b[i]=x[i];
    d[i]=a[i]=c[i]=0;
  }
  a[0]=d[0]=1;
  for (i=254; i>=0; --i) {
    r=(z[i>>>3]>>>(i&7))&1;
    sel25519(a,b,r);
    sel25519(c,d,r);
    A(e,a,c);
    Z(a,a,c);
    A(c,b,d);
    Z(b,b,d);
    S(d,e);
    S(f,a);
    M(a,c,a);
    M(c,b,e);
    A(e,a,c);
    Z(a,a,c);
    S(b,a);
    Z(c,d,f);
    M(a,c,_121665);
    A(a,a,d);
    M(c,c,a);
    M(a,d,f);
    M(d,b,x);
    S(b,e);
    sel25519(a,b,r);
    sel25519(c,d,r);
  }
  for (i = 0; i < 16; i++) {
    x[i+16]=a[i];
    x[i+32]=c[i];
    x[i+48]=b[i];
    x[i+64]=d[i];
  }
  var x32 = x.subarray(32);
  var x16 = x.subarray(16);
  inv25519(x32,x32);
  M(x16,x16,x32);
  pack25519(q,x16);
  return 0;
}

function crypto_scalarmult_base(q, n) {
  return crypto_scalarmult(q, n, _9);
}

function crypto_box_keypair(y, x) {
  randombytes(x, 32);
  return crypto_scalarmult_base(y, x);
}

function crypto_box_beforenm(k, y, x) {
  var s = new Uint8Array(32);
  crypto_scalarmult(s, x, y);
  return crypto_core_hsalsa20(k, _0, s, sigma);
}

var crypto_box_afternm = crypto_secretbox;
var crypto_box_open_afternm = crypto_secretbox_open;

function crypto_box(c, m, d, n, y, x) {
  var k = new Uint8Array(32);
  crypto_box_beforenm(k, y, x);
  return crypto_box_afternm(c, m, d, n, k);
}

function crypto_box_open(m, c, d, n, y, x) {
  var k = new Uint8Array(32);
  crypto_box_beforenm(k, y, x);
  return crypto_box_open_afternm(m, c, d, n, k);
}

function add64() {
  var a = 0, b = 0, c = 0, d = 0, m16 = 65535, l, h, i;
  for (i = 0; i < arguments.length; i++) {
    l = arguments[i].lo;
    h = arguments[i].hi;
    a += (l & m16); b += (l >>> 16);
    c += (h & m16); d += (h >>> 16);
  }

  b += (a >>> 16);
  c += (b >>> 16);
  d += (c >>> 16);

  return new u64((c & m16) | (d << 16), (a & m16) | (b << 16));
}

function shr64(x, c) {
  return new u64((x.hi >>> c), (x.lo >>> c) | (x.hi << (32 - c)));
}

function xor64() {
  var l = 0, h = 0, i;
  for (i = 0; i < arguments.length; i++) {
    l ^= arguments[i].lo;
    h ^= arguments[i].hi;
  }
  return new u64(h, l);
}

function R(x, c) {
  var h, l, c1 = 32 - c;
  if (c < 32) {
    h = (x.hi >>> c) | (x.lo << c1);
    l = (x.lo >>> c) | (x.hi << c1);
  } else if (c < 64) {
    h = (x.lo >>> c) | (x.hi << c1);
    l = (x.hi >>> c) | (x.lo << c1);
  }
  return new u64(h, l);
}

function Ch(x, y, z) {
  var h = (x.hi & y.hi) ^ (~x.hi & z.hi),
      l = (x.lo & y.lo) ^ (~x.lo & z.lo);
  return new u64(h, l);
}

function Maj(x, y, z) {
  var h = (x.hi & y.hi) ^ (x.hi & z.hi) ^ (y.hi & z.hi),
      l = (x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo);
  return new u64(h, l);
}

function Sigma0(x) { return xor64(R(x,28), R(x,34), R(x,39)); }
function Sigma1(x) { return xor64(R(x,14), R(x,18), R(x,41)); }
function sigma0(x) { return xor64(R(x, 1), R(x, 8), shr64(x,7)); }
function sigma1(x) { return xor64(R(x,19), R(x,61), shr64(x,6)); }

var K = [
  new u64(0x428a2f98, 0xd728ae22), new u64(0x71374491, 0x23ef65cd),
  new u64(0xb5c0fbcf, 0xec4d3b2f), new u64(0xe9b5dba5, 0x8189dbbc),
  new u64(0x3956c25b, 0xf348b538), new u64(0x59f111f1, 0xb605d019),
  new u64(0x923f82a4, 0xaf194f9b), new u64(0xab1c5ed5, 0xda6d8118),
  new u64(0xd807aa98, 0xa3030242), new u64(0x12835b01, 0x45706fbe),
  new u64(0x243185be, 0x4ee4b28c), new u64(0x550c7dc3, 0xd5ffb4e2),
  new u64(0x72be5d74, 0xf27b896f), new u64(0x80deb1fe, 0x3b1696b1),
  new u64(0x9bdc06a7, 0x25c71235), new u64(0xc19bf174, 0xcf692694),
  new u64(0xe49b69c1, 0x9ef14ad2), new u64(0xefbe4786, 0x384f25e3),
  new u64(0x0fc19dc6, 0x8b8cd5b5), new u64(0x240ca1cc, 0x77ac9c65),
  new u64(0x2de92c6f, 0x592b0275), new u64(0x4a7484aa, 0x6ea6e483),
  new u64(0x5cb0a9dc, 0xbd41fbd4), new u64(0x76f988da, 0x831153b5),
  new u64(0x983e5152, 0xee66dfab), new u64(0xa831c66d, 0x2db43210),
  new u64(0xb00327c8, 0x98fb213f), new u64(0xbf597fc7, 0xbeef0ee4),
  new u64(0xc6e00bf3, 0x3da88fc2), new u64(0xd5a79147, 0x930aa725),
  new u64(0x06ca6351, 0xe003826f), new u64(0x14292967, 0x0a0e6e70),
  new u64(0x27b70a85, 0x46d22ffc), new u64(0x2e1b2138, 0x5c26c926),
  new u64(0x4d2c6dfc, 0x5ac42aed), new u64(0x53380d13, 0x9d95b3df),
  new u64(0x650a7354, 0x8baf63de), new u64(0x766a0abb, 0x3c77b2a8),
  new u64(0x81c2c92e, 0x47edaee6), new u64(0x92722c85, 0x1482353b),
  new u64(0xa2bfe8a1, 0x4cf10364), new u64(0xa81a664b, 0xbc423001),
  new u64(0xc24b8b70, 0xd0f89791), new u64(0xc76c51a3, 0x0654be30),
  new u64(0xd192e819, 0xd6ef5218), new u64(0xd6990624, 0x5565a910),
  new u64(0xf40e3585, 0x5771202a), new u64(0x106aa070, 0x32bbd1b8),
  new u64(0x19a4c116, 0xb8d2d0c8), new u64(0x1e376c08, 0x5141ab53),
  new u64(0x2748774c, 0xdf8eeb99), new u64(0x34b0bcb5, 0xe19b48a8),
  new u64(0x391c0cb3, 0xc5c95a63), new u64(0x4ed8aa4a, 0xe3418acb),
  new u64(0x5b9cca4f, 0x7763e373), new u64(0x682e6ff3, 0xd6b2b8a3),
  new u64(0x748f82ee, 0x5defb2fc), new u64(0x78a5636f, 0x43172f60),
  new u64(0x84c87814, 0xa1f0ab72), new u64(0x8cc70208, 0x1a6439ec),
  new u64(0x90befffa, 0x23631e28), new u64(0xa4506ceb, 0xde82bde9),
  new u64(0xbef9a3f7, 0xb2c67915), new u64(0xc67178f2, 0xe372532b),
  new u64(0xca273ece, 0xea26619c), new u64(0xd186b8c7, 0x21c0c207),
  new u64(0xeada7dd6, 0xcde0eb1e), new u64(0xf57d4f7f, 0xee6ed178),
  new u64(0x06f067aa, 0x72176fba), new u64(0x0a637dc5, 0xa2c898a6),
  new u64(0x113f9804, 0xbef90dae), new u64(0x1b710b35, 0x131c471b),
  new u64(0x28db77f5, 0x23047d84), new u64(0x32caab7b, 0x40c72493),
  new u64(0x3c9ebe0a, 0x15c9bebc), new u64(0x431d67c4, 0x9c100d4c),
  new u64(0x4cc5d4be, 0xcb3e42b6), new u64(0x597f299c, 0xfc657e2a),
  new u64(0x5fcb6fab, 0x3ad6faec), new u64(0x6c44198c, 0x4a475817)
];

function crypto_hashblocks(x, m, n) {
  var z = [], b = [], a = [], w = [], t, i, j;

  for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8*i);

  var pos = 0;
  while (n >= 128) {
    for (i = 0; i < 16; i++) w[i] = dl64(m, 8*i+pos);
    for (i = 0; i < 80; i++) {
      for (j = 0; j < 8; j++) b[j] = a[j];
      t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i%16]);
      b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2]));
      b[3] = add64(b[3], t);
      for (j = 0; j < 8; j++) a[(j+1)%8] = b[j];
      if (i%16 === 15) {
        for (j = 0; j < 16; j++) {
          w[j] = add64(w[j], w[(j+9)%16], sigma0(w[(j+1)%16]), sigma1(w[(j+14)%16]));
        }
      }
    }

    for (i = 0; i < 8; i++) {
      a[i] = add64(a[i], z[i]);
      z[i] = a[i];
    }

    pos += 128;
    n -= 128;
  }

  for (i = 0; i < 8; i++) ts64(x, 8*i, z[i]);
  return n;
}

var iv = new Uint8Array([
  0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08,
  0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b,
  0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b,
  0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1,
  0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1,
  0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f,
  0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b,
  0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79
]);

function crypto_hash(out, m, n) {
  var h = new Uint8Array(64), x = new Uint8Array(256);
  var i, b = n;

  for (i = 0; i < 64; i++) h[i] = iv[i];

  crypto_hashblocks(h, m, n);
  n %= 128;

  for (i = 0; i < 256; i++) x[i] = 0;
  for (i = 0; i < n; i++) x[i] = m[b-n+i];
  x[n] = 128;

  n = 256-128*(n<112?1:0);
  x[n-9] = 0;
  ts64(x, n-8, new u64((b / 0x20000000) | 0, b << 3));
  crypto_hashblocks(h, x, n);

  for (i = 0; i < 64; i++) out[i] = h[i];

  return 0;
}

function add(p, q) {
  var a = gf(), b = gf(), c = gf(),
      d = gf(), e = gf(), f = gf(),
      g = gf(), h = gf(), t = gf();

  Z(a, p[1], p[0]);
  Z(t, q[1], q[0]);
  M(a, a, t);
  A(b, p[0], p[1]);
  A(t, q[0], q[1]);
  M(b, b, t);
  M(c, p[3], q[3]);
  M(c, c, D2);
  M(d, p[2], q[2]);
  A(d, d, d);
  Z(e, b, a);
  Z(f, d, c);
  A(g, d, c);
  A(h, b, a);

  M(p[0], e, f);
  M(p[1], h, g);
  M(p[2], g, f);
  M(p[3], e, h);
}

function cswap(p, q, b) {
  var i;
  for (i = 0; i < 4; i++) {
    sel25519(p[i], q[i], b);
  }
}

function pack(r, p) {
  var tx = gf(), ty = gf(), zi = gf();
  inv25519(zi, p[2]);
  M(tx, p[0], zi);
  M(ty, p[1], zi);
  pack25519(r, ty);
  r[31] ^= par25519(tx) << 7;
}

function scalarmult(p, q, s) {
  var b, i;
  set25519(p[0], gf0);
  set25519(p[1], gf1);
  set25519(p[2], gf1);
  set25519(p[3], gf0);
  for (i = 255; i >= 0; --i) {
    b = (s[(i/8)|0] >> (i&7)) & 1;
    cswap(p, q, b);
    add(q, p);
    add(p, p);
    cswap(p, q, b);
  }
}

function scalarbase(p, s) {
  var q = [gf(), gf(), gf(), gf()];
  set25519(q[0], X);
  set25519(q[1], Y);
  set25519(q[2], gf1);
  M(q[3], X, Y);
  scalarmult(p, q, s);
}

function crypto_sign_keypair(pk, sk, seeded) {
  var d = new Uint8Array(64);
  var p = [gf(), gf(), gf(), gf()];
  var i;

  if (!seeded) randombytes(sk, 32);
  crypto_hash(d, sk, 32);
  d[0] &= 248;
  d[31] &= 127;
  d[31] |= 64;

  scalarbase(p, d);
  pack(pk, p);

  for (i = 0; i < 32; i++) sk[i+32] = pk[i];
  return 0;
}

var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);

function modL(r, x) {
  var carry, i, j, k;
  for (i = 63; i >= 32; --i) {
    carry = 0;
    for (j = i - 32, k = i - 12; j < k; ++j) {
      x[j] += carry - 16 * x[i] * L[j - (i - 32)];
      carry = (x[j] + 128) >> 8;
      x[j] -= carry * 256;
    }
    x[j] += carry;
    x[i] = 0;
  }
  carry = 0;
  for (j = 0; j < 32; j++) {
    x[j] += carry - (x[31] >> 4) * L[j];
    carry = x[j] >> 8;
    x[j] &= 255;
  }
  for (j = 0; j < 32; j++) x[j] -= carry * L[j];
  for (i = 0; i < 32; i++) {
    x[i+1] += x[i] >> 8;
    r[i] = x[i] & 255;
  }
}

function reduce(r) {
  var x = new Float64Array(64), i;
  for (i = 0; i < 64; i++) x[i] = r[i];
  for (i = 0; i < 64; i++) r[i] = 0;
  modL(r, x);
}

// Note: difference from C - smlen returned, not passed as argument.
function crypto_sign(sm, m, n, sk) {
  var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);
  var i, j, x = new Float64Array(64);
  var p = [gf(), gf(), gf(), gf()];

  crypto_hash(d, sk, 32);
  d[0] &= 248;
  d[31] &= 127;
  d[31] |= 64;

  var smlen = n + 64;
  for (i = 0; i < n; i++) sm[64 + i] = m[i];
  for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];

  crypto_hash(r, sm.subarray(32), n+32);
  reduce(r);
  scalarbase(p, r);
  pack(sm, p);

  for (i = 32; i < 64; i++) sm[i] = sk[i];
  crypto_hash(h, sm, n + 64);
  reduce(h);

  for (i = 0; i < 64; i++) x[i] = 0;
  for (i = 0; i < 32; i++) x[i] = r[i];
  for (i = 0; i < 32; i++) {
    for (j = 0; j < 32; j++) {
      x[i+j] += h[i] * d[j];
    }
  }

  modL(sm.subarray(32), x);
  return smlen;
}

function unpackneg(r, p) {
  var t = gf(), chk = gf(), num = gf(),
      den = gf(), den2 = gf(), den4 = gf(),
      den6 = gf();

  set25519(r[2], gf1);
  unpack25519(r[1], p);
  S(num, r[1]);
  M(den, num, D);
  Z(num, num, r[2]);
  A(den, r[2], den);

  S(den2, den);
  S(den4, den2);
  M(den6, den4, den2);
  M(t, den6, num);
  M(t, t, den);

  pow2523(t, t);
  M(t, t, num);
  M(t, t, den);
  M(t, t, den);
  M(r[0], t, den);

  S(chk, r[0]);
  M(chk, chk, den);
  if (neq25519(chk, num)) M(r[0], r[0], I);

  S(chk, r[0]);
  M(chk, chk, den);
  if (neq25519(chk, num)) return -1;

  if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]);

  M(r[3], r[0], r[1]);
  return 0;
}

function crypto_sign_open(m, sm, n, pk) {
  var i, mlen;
  var t = new Uint8Array(32), h = new Uint8Array(64);
  var p = [gf(), gf(), gf(), gf()],
      q = [gf(), gf(), gf(), gf()];

  mlen = -1;
  if (n < 64) return -1;

  if (unpackneg(q, pk)) return -1;

  for (i = 0; i < n; i++) m[i] = sm[i];
  for (i = 0; i < 32; i++) m[i+32] = pk[i];
  crypto_hash(h, m, n);
  reduce(h);
  scalarmult(p, q, h);

  scalarbase(q, sm.subarray(32));
  add(p, q);
  pack(t, p);

  n -= 64;
  if (crypto_verify_32(sm, 0, t, 0)) {
    for (i = 0; i < n; i++) m[i] = 0;
    return -1;
  }

  for (i = 0; i < n; i++) m[i] = sm[i + 64];
  mlen = n;
  return mlen;
}

var crypto_secretbox_KEYBYTES = 32,
    crypto_secretbox_NONCEBYTES = 24,
    crypto_secretbox_ZEROBYTES = 32,
    crypto_secretbox_BOXZEROBYTES = 16,
    crypto_scalarmult_BYTES = 32,
    crypto_scalarmult_SCALARBYTES = 32,
    crypto_box_PUBLICKEYBYTES = 32,
    crypto_box_SECRETKEYBYTES = 32,
    crypto_box_BEFORENMBYTES = 32,
    crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES,
    crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES,
    crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES,
    crypto_sign_BYTES = 64,
    crypto_sign_PUBLICKEYBYTES = 32,
    crypto_sign_SECRETKEYBYTES = 64,
    crypto_sign_SEEDBYTES = 32,
    crypto_hash_BYTES = 64;

nacl.lowlevel = {
  crypto_core_hsalsa20: crypto_core_hsalsa20,
  crypto_stream_xor: crypto_stream_xor,
  crypto_stream: crypto_stream,
  crypto_stream_salsa20_xor: crypto_stream_salsa20_xor,
  crypto_stream_salsa20: crypto_stream_salsa20,
  crypto_onetimeauth: crypto_onetimeauth,
  crypto_onetimeauth_verify: crypto_onetimeauth_verify,
  crypto_verify_16: crypto_verify_16,
  crypto_verify_32: crypto_verify_32,
  crypto_secretbox: crypto_secretbox,
  crypto_secretbox_open: crypto_secretbox_open,
  crypto_scalarmult: crypto_scalarmult,
  crypto_scalarmult_base: crypto_scalarmult_base,
  crypto_box_beforenm: crypto_box_beforenm,
  crypto_box_afternm: crypto_box_afternm,
  crypto_box: crypto_box,
  crypto_box_open: crypto_box_open,
  crypto_box_keypair: crypto_box_keypair,
  crypto_hash: crypto_hash,
  crypto_sign: crypto_sign,
  crypto_sign_keypair: crypto_sign_keypair,
  crypto_sign_open: crypto_sign_open,

  crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES,
  crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES,
  crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES,
  crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES,
  crypto_scalarmult_BYTES: crypto_scalarmult_BYTES,
  crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES,
  crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES,
  crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES,
  crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES,
  crypto_box_NONCEBYTES: crypto_box_NONCEBYTES,
  crypto_box_ZEROBYTES: crypto_box_ZEROBYTES,
  crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES,
  crypto_sign_BYTES: crypto_sign_BYTES,
  crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES,
  crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES,
  crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES,
  crypto_hash_BYTES: crypto_hash_BYTES
};

/* High-level API */

function checkLengths(k, n) {
  if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size');
  if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size');
}

function checkBoxLengths(pk, sk) {
  if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size');
  if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size');
}

function checkArrayTypes() {
  var t, i;
  for (i = 0; i < arguments.length; i++) {
     if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]')
       throw new TypeError('unexpected type ' + t + ', use Uint8Array');
  }
}

function cleanup(arr) {
  for (var i = 0; i < arr.length; i++) arr[i] = 0;
}

// TODO: Completely remove this in v0.15.
if (!nacl.util) {
  nacl.util = {};
  nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() {
    throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js');
  };
}

nacl.randomBytes = function(n) {
  var b = new Uint8Array(n);
  randombytes(b, n);
  return b;
};

nacl.secretbox = function(msg, nonce, key) {
  checkArrayTypes(msg, nonce, key);
  checkLengths(key, nonce);
  var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);
  var c = new Uint8Array(m.length);
  for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i];
  crypto_secretbox(c, m, m.length, nonce, key);
  return c.subarray(crypto_secretbox_BOXZEROBYTES);
};

nacl.secretbox.open = function(box, nonce, key) {
  checkArrayTypes(box, nonce, key);
  checkLengths(key, nonce);
  var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);
  var m = new Uint8Array(c.length);
  for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i];
  if (c.length < 32) return false;
  if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false;
  return m.subarray(crypto_secretbox_ZEROBYTES);
};

nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES;
nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES;
nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES;

nacl.scalarMult = function(n, p) {
  checkArrayTypes(n, p);
  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');
  if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size');
  var q = new Uint8Array(crypto_scalarmult_BYTES);
  crypto_scalarmult(q, n, p);
  return q;
};

nacl.scalarMult.base = function(n) {
  checkArrayTypes(n);
  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');
  var q = new Uint8Array(crypto_scalarmult_BYTES);
  crypto_scalarmult_base(q, n);
  return q;
};

nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES;
nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES;

nacl.box = function(msg, nonce, publicKey, secretKey) {
  var k = nacl.box.before(publicKey, secretKey);
  return nacl.secretbox(msg, nonce, k);
};

nacl.box.before = function(publicKey, secretKey) {
  checkArrayTypes(publicKey, secretKey);
  checkBoxLengths(publicKey, secretKey);
  var k = new Uint8Array(crypto_box_BEFORENMBYTES);
  crypto_box_beforenm(k, publicKey, secretKey);
  return k;
};

nacl.box.after = nacl.secretbox;

nacl.box.open = function(msg, nonce, publicKey, secretKey) {
  var k = nacl.box.before(publicKey, secretKey);
  return nacl.secretbox.open(msg, nonce, k);
};

nacl.box.open.after = nacl.secretbox.open;

nacl.box.keyPair = function() {
  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
  var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);
  crypto_box_keypair(pk, sk);
  return {publicKey: pk, secretKey: sk};
};

nacl.box.keyPair.fromSecretKey = function(secretKey) {
  checkArrayTypes(secretKey);
  if (secretKey.length !== crypto_box_SECRETKEYBYTES)
    throw new Error('bad secret key size');
  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
  crypto_scalarmult_base(pk, secretKey);
  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};
};

nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES;
nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES;
nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES;
nacl.box.nonceLength = crypto_box_NONCEBYTES;
nacl.box.overheadLength = nacl.secretbox.overheadLength;

nacl.sign = function(msg, secretKey) {
  checkArrayTypes(msg, secretKey);
  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
    throw new Error('bad secret key size');
  var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length);
  crypto_sign(signedMsg, msg, msg.length, secretKey);
  return signedMsg;
};

nacl.sign.open = function(signedMsg, publicKey) {
  if (arguments.length !== 2)
    throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?');
  checkArrayTypes(signedMsg, publicKey);
  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
    throw new Error('bad public key size');
  var tmp = new Uint8Array(signedMsg.length);
  var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);
  if (mlen < 0) return null;
  var m = new Uint8Array(mlen);
  for (var i = 0; i < m.length; i++) m[i] = tmp[i];
  return m;
};

nacl.sign.detached = function(msg, secretKey) {
  var signedMsg = nacl.sign(msg, secretKey);
  var sig = new Uint8Array(crypto_sign_BYTES);
  for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];
  return sig;
};

nacl.sign.detached.verify = function(msg, sig, publicKey) {
  checkArrayTypes(msg, sig, publicKey);
  if (sig.length !== crypto_sign_BYTES)
    throw new Error('bad signature size');
  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
    throw new Error('bad public key size');
  var sm = new Uint8Array(crypto_sign_BYTES + msg.length);
  var m = new Uint8Array(crypto_sign_BYTES + msg.length);
  var i;
  for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];
  for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i];
  return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);
};

nacl.sign.keyPair = function() {
  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
  crypto_sign_keypair(pk, sk);
  return {publicKey: pk, secretKey: sk};
};

nacl.sign.keyPair.fromSecretKey = function(secretKey) {
  checkArrayTypes(secretKey);
  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
    throw new Error('bad secret key size');
  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
  for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i];
  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};
};

nacl.sign.keyPair.fromSeed = function(seed) {
  checkArrayTypes(seed);
  if (seed.length !== crypto_sign_SEEDBYTES)
    throw new Error('bad seed size');
  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
  for (var i = 0; i < 32; i++) sk[i] = seed[i];
  crypto_sign_keypair(pk, sk, true);
  return {publicKey: pk, secretKey: sk};
};

nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES;
nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES;
nacl.sign.seedLength = crypto_sign_SEEDBYTES;
nacl.sign.signatureLength = crypto_sign_BYTES;

nacl.hash = function(msg) {
  checkArrayTypes(msg);
  var h = new Uint8Array(crypto_hash_BYTES);
  crypto_hash(h, msg, msg.length);
  return h;
};

nacl.hash.hashLength = crypto_hash_BYTES;

nacl.verify = function(x, y) {
  checkArrayTypes(x, y);
  // Zero length arguments are considered not equal.
  if (x.length === 0 || y.length === 0) return false;
  if (x.length !== y.length) return false;
  return (vn(x, 0, y, 0, x.length) === 0) ? true : false;
};

nacl.setPRNG = function(fn) {
  randombytes = fn;
};

(function() {
  // Initialize PRNG if environment provides CSPRNG.
  // If not, methods calling randombytes will throw.
  var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null;
  if (crypto && crypto.getRandomValues) {
    // Browsers.
    var QUOTA = 65536;
    nacl.setPRNG(function(x, n) {
      var i, v = new Uint8Array(n);
      for (i = 0; i < n; i += QUOTA) {
        crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));
      }
      for (i = 0; i < n; i++) x[i] = v[i];
      cleanup(v);
    });
  } else if (typeof require !== 'undefined') {
    // Node.js.
    crypto = require('crypto');
    if (crypto && crypto.randomBytes) {
      nacl.setPRNG(function(x, n) {
        var i, v = crypto.randomBytes(n);
        for (i = 0; i < n; i++) x[i] = v[i];
        cleanup(v);
      });
    }
  }
})();

})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {}));
!function(r){"use strict";function n(r,n){return r<<n|r>>>32-n}function e(r,n){var e=255&r[n+3];return e=e<<8|255&r[n+2],e=e<<8|255&r[n+1],e<<8|255&r[n+0]}function t(r,n){var e=r[n]<<24|r[n+1]<<16|r[n+2]<<8|r[n+3],t=r[n+4]<<24|r[n+5]<<16|r[n+6]<<8|r[n+7];return new sr(e,t)}function o(r,n,e){var t;for(t=0;t<4;t++)r[n+t]=255&e,e>>>=8}function i(r,n,e){r[n]=e.hi>>24&255,r[n+1]=e.hi>>16&255,r[n+2]=e.hi>>8&255,r[n+3]=255&e.hi,r[n+4]=e.lo>>24&255,r[n+5]=e.lo>>16&255,r[n+6]=e.lo>>8&255,r[n+7]=255&e.lo}function a(r,n,e,t,o){var i,a=0;for(i=0;i<o;i++)a|=r[n+i]^e[t+i];return(1&a-1>>>8)-1}function f(r,n,e,t){return a(r,n,e,t,16)}function u(r,n,e,t){return a(r,n,e,t,32)}function c(r,t,i,a,f){var u,c,w,y=new Uint32Array(16),l=new Uint32Array(16),s=new Uint32Array(16),h=new Uint32Array(4);for(u=0;u<4;u++)l[5*u]=e(a,4*u),l[1+u]=e(i,4*u),l[6+u]=e(t,4*u),l[11+u]=e(i,16+4*u);for(u=0;u<16;u++)s[u]=l[u];for(u=0;u<20;u++){for(c=0;c<4;c++){for(w=0;w<4;w++)h[w]=l[(5*c+4*w)%16];for(h[1]^=n(h[0]+h[3]|0,7),h[2]^=n(h[1]+h[0]|0,9),h[3]^=n(h[2]+h[1]|0,13),h[0]^=n(h[3]+h[2]|0,18),w=0;w<4;w++)y[4*c+(c+w)%4]=h[w]}for(w=0;w<16;w++)l[w]=y[w]}if(f){for(u=0;u<16;u++)l[u]=l[u]+s[u]|0;for(u=0;u<4;u++)l[5*u]=l[5*u]-e(a,4*u)|0,l[6+u]=l[6+u]-e(t,4*u)|0;for(u=0;u<4;u++)o(r,4*u,l[5*u]),o(r,16+4*u,l[6+u])}else for(u=0;u<16;u++)o(r,4*u,l[u]+s[u]|0)}function w(r,n,e,t){return c(r,n,e,t,!1),0}function y(r,n,e,t){return c(r,n,e,t,!0),0}function l(r,n,e,t,o,i,a){var f,u,c=new Uint8Array(16),y=new Uint8Array(64);if(!o)return 0;for(u=0;u<16;u++)c[u]=0;for(u=0;u<8;u++)c[u]=i[u];for(;o>=64;){for(w(y,c,a,Br),u=0;u<64;u++)r[n+u]=(e?e[t+u]:0)^y[u];for(f=1,u=8;u<16;u++)f=f+(255&c[u])|0,c[u]=255&f,f>>>=8;o-=64,n+=64,e&&(t+=64)}if(o>0)for(w(y,c,a,Br),u=0;u<o;u++)r[n+u]=(e?e[t+u]:0)^y[u];return 0}function s(r,n,e,t,o){return l(r,n,null,0,e,t,o)}function h(r,n,e,t,o){var i=new Uint8Array(32);return y(i,t,o,Br),s(r,n,e,t.subarray(16),i)}function g(r,n,e,t,o,i,a){var f=new Uint8Array(32);return y(f,i,a,Br),l(r,n,e,t,o,i.subarray(16),f)}function v(r,n){var e,t=0;for(e=0;e<17;e++)t=t+(r[e]+n[e]|0)|0,r[e]=255&t,t>>>=8}function b(r,n,e,t,o,i){var a,f,u,c,w=new Uint32Array(17),y=new Uint32Array(17),l=new Uint32Array(17),s=new Uint32Array(17),h=new Uint32Array(17);for(u=0;u<17;u++)y[u]=l[u]=0;for(u=0;u<16;u++)y[u]=i[u];for(y[3]&=15,y[4]&=252,y[7]&=15,y[8]&=252,y[11]&=15,y[12]&=252,y[15]&=15;o>0;){for(u=0;u<17;u++)s[u]=0;for(u=0;u<16&&u<o;++u)s[u]=e[t+u];for(s[u]=1,t+=u,o-=u,v(l,s),f=0;f<17;f++)for(w[f]=0,u=0;u<17;u++)w[f]=w[f]+l[u]*(u<=f?y[f-u]:320*y[f+17-u]|0)|0|0;for(f=0;f<17;f++)l[f]=w[f];for(c=0,u=0;u<16;u++)c=c+l[u]|0,l[u]=255&c,c>>>=8;for(c=c+l[16]|0,l[16]=3&c,c=5*(c>>>2)|0,u=0;u<16;u++)c=c+l[u]|0,l[u]=255&c,c>>>=8;c=c+l[16]|0,l[16]=c}for(u=0;u<17;u++)h[u]=l[u];for(v(l,Sr),a=0|-(l[16]>>>7),u=0;u<17;u++)l[u]^=a&(h[u]^l[u]);for(u=0;u<16;u++)s[u]=i[u+16];for(s[16]=0,v(l,s),u=0;u<16;u++)r[n+u]=l[u];return 0}function p(r,n,e,t,o,i){var a=new Uint8Array(16);return b(a,0,e,t,o,i),f(r,n,a,0)}function _(r,n,e,t,o){var i;if(e<32)return-1;for(g(r,0,n,0,e,t,o),b(r,16,r,32,e-32,r),i=0;i<16;i++)r[i]=0;return 0}function A(r,n,e,t,o){var i,a=new Uint8Array(32);if(e<32)return-1;if(h(a,0,32,t,o),0!==p(n,16,n,32,e-32,a))return-1;for(g(r,0,n,0,e,t,o),i=0;i<32;i++)r[i]=0;return 0}function U(r,n){var e;for(e=0;e<16;e++)r[e]=0|n[e]}function E(r){var n,e;for(e=0;e<16;e++)r[e]+=65536,n=Math.floor(r[e]/65536),r[(e+1)*(e<15?1:0)]+=n-1+37*(n-1)*(15===e?1:0),r[e]-=65536*n}function d(r,n,e){for(var t,o=~(e-1),i=0;i<16;i++)t=o&(r[i]^n[i]),r[i]^=t,n[i]^=t}function x(r,n){var e,t,o,i=hr(),a=hr();for(e=0;e<16;e++)a[e]=n[e];for(E(a),E(a),E(a),t=0;t<2;t++){for(i[0]=a[0]-65517,e=1;e<15;e++)i[e]=a[e]-65535-(i[e-1]>>16&1),i[e-1]&=65535;i[15]=a[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,d(a,i,1-o)}for(e=0;e<16;e++)r[2*e]=255&a[e],r[2*e+1]=a[e]>>8}function m(r,n){var e=new Uint8Array(32),t=new Uint8Array(32);return x(e,r),x(t,n),u(e,0,t,0)}function B(r){var n=new Uint8Array(32);return x(n,r),1&n[0]}function S(r,n){var e;for(e=0;e<16;e++)r[e]=n[2*e]+(n[2*e+1]<<8);r[15]&=32767}function K(r,n,e){var t;for(t=0;t<16;t++)r[t]=n[t]+e[t]|0}function T(r,n,e){var t;for(t=0;t<16;t++)r[t]=n[t]-e[t]|0}function Y(r,n,e){var t,o,i=new Float64Array(31);for(t=0;t<31;t++)i[t]=0;for(t=0;t<16;t++)for(o=0;o<16;o++)i[t+o]+=n[t]*e[o];for(t=0;t<15;t++)i[t]+=38*i[t+16];for(t=0;t<16;t++)r[t]=i[t];E(r),E(r)}function L(r,n){Y(r,n,n)}function k(r,n){var e,t=hr();for(e=0;e<16;e++)t[e]=n[e];for(e=253;e>=0;e--)L(t,t),2!==e&&4!==e&&Y(t,t,n);for(e=0;e<16;e++)r[e]=t[e]}function z(r,n){var e,t=hr();for(e=0;e<16;e++)t[e]=n[e];for(e=250;e>=0;e--)L(t,t),1!==e&&Y(t,t,n);for(e=0;e<16;e++)r[e]=t[e]}function R(r,n,e){var t,o,i=new Uint8Array(32),a=new Float64Array(80),f=hr(),u=hr(),c=hr(),w=hr(),y=hr(),l=hr();for(o=0;o<31;o++)i[o]=n[o];for(i[31]=127&n[31]|64,i[0]&=248,S(a,e),o=0;o<16;o++)u[o]=a[o],w[o]=f[o]=c[o]=0;for(f[0]=w[0]=1,o=254;o>=0;--o)t=i[o>>>3]>>>(7&o)&1,d(f,u,t),d(c,w,t),K(y,f,c),T(f,f,c),K(c,u,w),T(u,u,w),L(w,y),L(l,f),Y(f,c,f),Y(c,u,y),K(y,f,c),T(f,f,c),L(u,f),T(c,w,l),Y(f,c,Ar),K(f,f,w),Y(c,c,f),Y(f,w,l),Y(w,u,a),L(u,y),d(f,u,t),d(c,w,t);for(o=0;o<16;o++)a[o+16]=f[o],a[o+32]=c[o],a[o+48]=u[o],a[o+64]=w[o];var s=a.subarray(32),h=a.subarray(16);return k(s,s),Y(h,h,s),x(r,h),0}function P(r,n){return R(r,n,br)}function O(r,n){return gr(n,32),P(r,n)}function F(r,n,e){var t=new Uint8Array(32);return R(t,e,n),y(r,vr,t,Br)}function N(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Kr(r,n,e,t,a)}function C(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Tr(r,n,e,t,a)}function M(){var r,n,e,t=0,o=0,i=0,a=0,f=65535;for(e=0;e<arguments.length;e++)r=arguments[e].lo,n=arguments[e].hi,t+=r&f,o+=r>>>16,i+=n&f,a+=n>>>16;return o+=t>>>16,i+=o>>>16,a+=i>>>16,new sr(i&f|a<<16,t&f|o<<16)}function G(r,n){return new sr(r.hi>>>n,r.lo>>>n|r.hi<<32-n)}function Z(){var r,n=0,e=0;for(r=0;r<arguments.length;r++)n^=arguments[r].lo,e^=arguments[r].hi;return new sr(e,n)}function j(r,n){var e,t,o=32-n;return n<32?(e=r.hi>>>n|r.lo<<o,t=r.lo>>>n|r.hi<<o):n<64&&(e=r.lo>>>n|r.hi<<o,t=r.hi>>>n|r.lo<<o),new sr(e,t)}function q(r,n,e){var t=r.hi&n.hi^~r.hi&e.hi,o=r.lo&n.lo^~r.lo&e.lo;return new sr(t,o)}function I(r,n,e){var t=r.hi&n.hi^r.hi&e.hi^n.hi&e.hi,o=r.lo&n.lo^r.lo&e.lo^n.lo&e.lo;return new sr(t,o)}function V(r){return Z(j(r,28),j(r,34),j(r,39))}function X(r){return Z(j(r,14),j(r,18),j(r,41))}function D(r){return Z(j(r,1),j(r,8),G(r,7))}function H(r){return Z(j(r,19),j(r,61),G(r,6))}function J(r,n,e){var o,a,f,u=[],c=[],w=[],y=[];for(a=0;a<8;a++)u[a]=w[a]=t(r,8*a);for(var l=0;e>=128;){for(a=0;a<16;a++)y[a]=t(n,8*a+l);for(a=0;a<80;a++){for(f=0;f<8;f++)c[f]=w[f];for(o=M(w[7],X(w[4]),q(w[4],w[5],w[6]),Yr[a],y[a%16]),c[7]=M(o,V(w[0]),I(w[0],w[1],w[2])),c[3]=M(c[3],o),f=0;f<8;f++)w[(f+1)%8]=c[f];if(a%16===15)for(f=0;f<16;f++)y[f]=M(y[f],y[(f+9)%16],D(y[(f+1)%16]),H(y[(f+14)%16]))}for(a=0;a<8;a++)w[a]=M(w[a],u[a]),u[a]=w[a];l+=128,e-=128}for(a=0;a<8;a++)i(r,8*a,u[a]);return e}function Q(r,n,e){var t,o=new Uint8Array(64),a=new Uint8Array(256),f=e;for(t=0;t<64;t++)o[t]=Lr[t];for(J(o,n,e),e%=128,t=0;t<256;t++)a[t]=0;for(t=0;t<e;t++)a[t]=n[f-e+t];for(a[e]=128,e=256-128*(e<112?1:0),a[e-9]=0,i(a,e-8,new sr(f/536870912|0,f<<3)),J(o,a,e),t=0;t<64;t++)r[t]=o[t];return 0}function W(r,n){var e=hr(),t=hr(),o=hr(),i=hr(),a=hr(),f=hr(),u=hr(),c=hr(),w=hr();T(e,r[1],r[0]),T(w,n[1],n[0]),Y(e,e,w),K(t,r[0],r[1]),K(w,n[0],n[1]),Y(t,t,w),Y(o,r[3],n[3]),Y(o,o,Er),Y(i,r[2],n[2]),K(i,i,i),T(a,t,e),T(f,i,o),K(u,i,o),K(c,t,e),Y(r[0],a,f),Y(r[1],c,u),Y(r[2],u,f),Y(r[3],a,c)}function $(r,n,e){var t;for(t=0;t<4;t++)d(r[t],n[t],e)}function rr(r,n){var e=hr(),t=hr(),o=hr();k(o,n[2]),Y(e,n[0],o),Y(t,n[1],o),x(r,t),r[31]^=B(e)<<7}function nr(r,n,e){var t,o;for(U(r[0],pr),U(r[1],_r),U(r[2],_r),U(r[3],pr),o=255;o>=0;--o)t=e[o/8|0]>>(7&o)&1,$(r,n,t),W(n,r),W(r,r),$(r,n,t)}function er(r,n){var e=[hr(),hr(),hr(),hr()];U(e[0],dr),U(e[1],xr),U(e[2],_r),Y(e[3],dr,xr),nr(r,e,n)}function tr(r,n,e){var t,o=new Uint8Array(64),i=[hr(),hr(),hr(),hr()];for(e||gr(n,32),Q(o,n,32),o[0]&=248,o[31]&=127,o[31]|=64,er(i,o),rr(r,i),t=0;t<32;t++)n[t+32]=r[t];return 0}function or(r,n){var e,t,o,i;for(t=63;t>=32;--t){for(e=0,o=t-32,i=t-12;o<i;++o)n[o]+=e-16*n[t]*kr[o-(t-32)],e=n[o]+128>>8,n[o]-=256*e;n[o]+=e,n[t]=0}for(e=0,o=0;o<32;o++)n[o]+=e-(n[31]>>4)*kr[o],e=n[o]>>8,n[o]&=255;for(o=0;o<32;o++)n[o]-=e*kr[o];for(t=0;t<32;t++)n[t+1]+=n[t]>>8,r[t]=255&n[t]}function ir(r){var n,e=new Float64Array(64);for(n=0;n<64;n++)e[n]=r[n];for(n=0;n<64;n++)r[n]=0;or(r,e)}function ar(r,n,e,t){var o,i,a=new Uint8Array(64),f=new Uint8Array(64),u=new Uint8Array(64),c=new Float64Array(64),w=[hr(),hr(),hr(),hr()];Q(a,t,32),a[0]&=248,a[31]&=127,a[31]|=64;var y=e+64;for(o=0;o<e;o++)r[64+o]=n[o];for(o=0;o<32;o++)r[32+o]=a[32+o];for(Q(u,r.subarray(32),e+32),ir(u),er(w,u),rr(r,w),o=32;o<64;o++)r[o]=t[o];for(Q(f,r,e+64),ir(f),o=0;o<64;o++)c[o]=0;for(o=0;o<32;o++)c[o]=u[o];for(o=0;o<32;o++)for(i=0;i<32;i++)c[o+i]+=f[o]*a[i];return or(r.subarray(32),c),y}function fr(r,n){var e=hr(),t=hr(),o=hr(),i=hr(),a=hr(),f=hr(),u=hr();return U(r[2],_r),S(r[1],n),L(o,r[1]),Y(i,o,Ur),T(o,o,r[2]),K(i,r[2],i),L(a,i),L(f,a),Y(u,f,a),Y(e,u,o),Y(e,e,i),z(e,e),Y(e,e,o),Y(e,e,i),Y(e,e,i),Y(r[0],e,i),L(t,r[0]),Y(t,t,i),m(t,o)&&Y(r[0],r[0],mr),L(t,r[0]),Y(t,t,i),m(t,o)?-1:(B(r[0])===n[31]>>7&&T(r[0],pr,r[0]),Y(r[3],r[0],r[1]),0)}function ur(r,n,e,t){var o,i,a=new Uint8Array(32),f=new Uint8Array(64),c=[hr(),hr(),hr(),hr()],w=[hr(),hr(),hr(),hr()];if(i=-1,e<64)return-1;if(fr(w,t))return-1;for(o=0;o<e;o++)r[o]=n[o];for(o=0;o<32;o++)r[o+32]=t[o];if(Q(f,r,e),ir(f),nr(c,w,f),er(w,n.subarray(32)),W(c,w),rr(a,c),e-=64,u(n,0,a,0)){for(o=0;o<e;o++)r[o]=0;return-1}for(o=0;o<e;o++)r[o]=n[o+64];return i=e}function cr(r,n){if(r.length!==zr)throw new Error("bad key size");if(n.length!==Rr)throw new Error("bad nonce size")}function wr(r,n){if(r.length!==Cr)throw new Error("bad public key size");if(n.length!==Mr)throw new Error("bad secret key size")}function yr(){var r,n;for(n=0;n<arguments.length;n++)if("[object Uint8Array]"!==(r=Object.prototype.toString.call(arguments[n])))throw new TypeError("unexpected type "+r+", use Uint8Array")}function lr(r){for(var n=0;n<r.length;n++)r[n]=0}var sr=function(r,n){this.hi=0|r,this.lo=0|n},hr=function(r){var n,e=new Float64Array(16);if(r)for(n=0;n<r.length;n++)e[n]=r[n];return e},gr=function(){throw new Error("no PRNG")},vr=new Uint8Array(16),br=new Uint8Array(32);br[0]=9;var pr=hr(),_r=hr([1]),Ar=hr([56129,1]),Ur=hr([30883,4953,19914,30187,55467,16705,2637,112,59544,30585,16505,36039,65139,11119,27886,20995]),Er=hr([61785,9906,39828,60374,45398,33411,5274,224,53552,61171,33010,6542,64743,22239,55772,9222]),dr=hr([54554,36645,11616,51542,42930,38181,51040,26924,56412,64982,57905,49316,21502,52590,14035,8553]),xr=hr([26200,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214]),mr=hr([41136,18958,6951,50414,58488,44335,6150,12099,55207,15867,153,11085,57099,20417,9344,11139]),Br=new Uint8Array([101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107]),Sr=new Uint32Array([5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252]),Kr=_,Tr=A,Yr=[new sr(1116352408,3609767458),new sr(1899447441,602891725),new sr(3049323471,3964484399),new sr(3921009573,2173295548),new sr(961987163,4081628472),new sr(1508970993,3053834265),new sr(2453635748,2937671579),new sr(2870763221,3664609560),new sr(3624381080,2734883394),new sr(310598401,1164996542),new sr(607225278,1323610764),new sr(1426881987,3590304994),new sr(1925078388,4068182383),new sr(2162078206,991336113),new sr(2614888103,633803317),new sr(3248222580,3479774868),new sr(3835390401,2666613458),new sr(4022224774,944711139),new sr(264347078,2341262773),new sr(604807628,2007800933),new sr(770255983,1495990901),new sr(1249150122,1856431235),new sr(1555081692,3175218132),new sr(1996064986,2198950837),new sr(2554220882,3999719339),new sr(2821834349,766784016),new sr(2952996808,2566594879),new sr(3210313671,3203337956),new sr(3336571891,1034457026),new sr(3584528711,2466948901),new sr(113926993,3758326383),new sr(338241895,168717936),new sr(666307205,1188179964),new sr(773529912,1546045734),new sr(1294757372,1522805485),new sr(1396182291,2643833823),new sr(1695183700,2343527390),new sr(1986661051,1014477480),new sr(2177026350,1206759142),new sr(2456956037,344077627),new sr(2730485921,1290863460),new sr(2820302411,3158454273),new sr(3259730800,3505952657),new sr(3345764771,106217008),new sr(3516065817,3606008344),new sr(3600352804,1432725776),new sr(4094571909,1467031594),new sr(275423344,851169720),new sr(430227734,3100823752),new sr(506948616,1363258195),new sr(659060556,3750685593),new sr(883997877,3785050280),new sr(958139571,3318307427),new sr(1322822218,3812723403),new sr(1537002063,2003034995),new sr(1747873779,3602036899),new sr(1955562222,1575990012),new sr(2024104815,1125592928),new sr(2227730452,2716904306),new sr(2361852424,442776044),new sr(2428436474,593698344),new sr(2756734187,3733110249),new sr(3204031479,2999351573),new sr(3329325298,3815920427),new sr(3391569614,3928383900),new sr(3515267271,566280711),new sr(3940187606,3454069534),new sr(4118630271,4000239992),new sr(116418474,1914138554),new sr(174292421,2731055270),new sr(289380356,3203993006),new sr(460393269,320620315),new sr(685471733,587496836),new sr(852142971,1086792851),new sr(1017036298,365543100),new sr(1126000580,2618297676),new sr(1288033470,3409855158),new sr(1501505948,4234509866),new sr(1607167915,987167468),new sr(1816402316,1246189591)],Lr=new Uint8Array([106,9,230,103,243,188,201,8,187,103,174,133,132,202,167,59,60,110,243,114,254,148,248,43,165,79,245,58,95,29,54,241,81,14,82,127,173,230,130,209,155,5,104,140,43,62,108,31,31,131,217,171,251,65,189,107,91,224,205,25,19,126,33,121]),kr=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]),zr=32,Rr=24,Pr=32,Or=16,Fr=32,Nr=32,Cr=32,Mr=32,Gr=32,Zr=Rr,jr=Pr,qr=Or,Ir=64,Vr=32,Xr=64,Dr=32,Hr=64;r.lowlevel={crypto_core_hsalsa20:y,crypto_stream_xor:g,crypto_stream:h,crypto_stream_salsa20_xor:l,crypto_stream_salsa20:s,crypto_onetimeauth:b,crypto_onetimeauth_verify:p,crypto_verify_16:f,crypto_verify_32:u,crypto_secretbox:_,crypto_secretbox_open:A,crypto_scalarmult:R,crypto_scalarmult_base:P,crypto_box_beforenm:F,crypto_box_afternm:Kr,crypto_box:N,crypto_box_open:C,crypto_box_keypair:O,crypto_hash:Q,crypto_sign:ar,crypto_sign_keypair:tr,crypto_sign_open:ur,crypto_secretbox_KEYBYTES:zr,crypto_secretbox_NONCEBYTES:Rr,crypto_secretbox_ZEROBYTES:Pr,crypto_secretbox_BOXZEROBYTES:Or,crypto_scalarmult_BYTES:Fr,crypto_scalarmult_SCALARBYTES:Nr,crypto_box_PUBLICKEYBYTES:Cr,crypto_box_SECRETKEYBYTES:Mr,crypto_box_BEFORENMBYTES:Gr,crypto_box_NONCEBYTES:Zr,crypto_box_ZEROBYTES:jr,crypto_box_BOXZEROBYTES:qr,crypto_sign_BYTES:Ir,crypto_sign_PUBLICKEYBYTES:Vr,crypto_sign_SECRETKEYBYTES:Xr,crypto_sign_SEEDBYTES:Dr,crypto_hash_BYTES:Hr},r.util||(r.util={},r.util.decodeUTF8=r.util.encodeUTF8=r.util.encodeBase64=r.util.decodeBase64=function(){throw new Error("nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js")}),r.randomBytes=function(r){var n=new Uint8Array(r);return gr(n,r),n},r.secretbox=function(r,n,e){yr(r,n,e),cr(e,n);for(var t=new Uint8Array(Pr+r.length),o=new Uint8Array(t.length),i=0;i<r.length;i++)t[i+Pr]=r[i];return _(o,t,t.length,n,e),o.subarray(Or)},r.secretbox.open=function(r,n,e){yr(r,n,e),cr(e,n);for(var t=new Uint8Array(Or+r.length),o=new Uint8Array(t.length),i=0;i<r.length;i++)t[i+Or]=r[i];return!(t.length<32)&&(0===A(o,t,t.length,n,e)&&o.subarray(Pr))},r.secretbox.keyLength=zr,r.secretbox.nonceLength=Rr,r.secretbox.overheadLength=Or,r.scalarMult=function(r,n){if(yr(r,n),r.length!==Nr)throw new Error("bad n size");if(n.length!==Fr)throw new Error("bad p size");var e=new Uint8Array(Fr);return R(e,r,n),e},r.scalarMult.base=function(r){if(yr(r),r.length!==Nr)throw new Error("bad n size");var n=new Uint8Array(Fr);return P(n,r),n},r.scalarMult.scalarLength=Nr,r.scalarMult.groupElementLength=Fr,r.box=function(n,e,t,o){var i=r.box.before(t,o);return r.secretbox(n,e,i)},r.box.before=function(r,n){yr(r,n),wr(r,n);var e=new Uint8Array(Gr);return F(e,r,n),e},r.box.after=r.secretbox,r.box.open=function(n,e,t,o){var i=r.box.before(t,o);return r.secretbox.open(n,e,i)},r.box.open.after=r.secretbox.open,r.box.keyPair=function(){var r=new Uint8Array(Cr),n=new Uint8Array(Mr);return O(r,n),{publicKey:r,secretKey:n}},r.box.keyPair.fromSecretKey=function(r){if(yr(r),r.length!==Mr)throw new Error("bad secret key size");var n=new Uint8Array(Cr);return P(n,r),{publicKey:n,secretKey:new Uint8Array(r)}},r.box.publicKeyLength=Cr,r.box.secretKeyLength=Mr,r.box.sharedKeyLength=Gr,r.box.nonceLength=Zr,r.box.overheadLength=r.secretbox.overheadLength,r.sign=function(r,n){if(yr(r,n),n.length!==Xr)throw new Error("bad secret key size");var e=new Uint8Array(Ir+r.length);return ar(e,r,r.length,n),e},r.sign.open=function(r,n){if(2!==arguments.length)throw new Error("nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?");if(yr(r,n),n.length!==Vr)throw new Error("bad public key size");var e=new Uint8Array(r.length),t=ur(e,r,r.length,n);if(t<0)return null;for(var o=new Uint8Array(t),i=0;i<o.length;i++)o[i]=e[i];return o},r.sign.detached=function(n,e){for(var t=r.sign(n,e),o=new Uint8Array(Ir),i=0;i<o.length;i++)o[i]=t[i];return o},r.sign.detached.verify=function(r,n,e){if(yr(r,n,e),n.length!==Ir)throw new Error("bad signature size");if(e.length!==Vr)throw new Error("bad public key size");var t,o=new Uint8Array(Ir+r.length),i=new Uint8Array(Ir+r.length);for(t=0;t<Ir;t++)o[t]=n[t];for(t=0;t<r.length;t++)o[t+Ir]=r[t];return ur(i,o,o.length,e)>=0},r.sign.keyPair=function(){var r=new Uint8Array(Vr),n=new Uint8Array(Xr);return tr(r,n),{publicKey:r,secretKey:n}},r.sign.keyPair.fromSecretKey=function(r){if(yr(r),r.length!==Xr)throw new Error("bad secret key size");for(var n=new Uint8Array(Vr),e=0;e<n.length;e++)n[e]=r[32+e];return{publicKey:n,secretKey:new Uint8Array(r)}},r.sign.keyPair.fromSeed=function(r){if(yr(r),r.length!==Dr)throw new Error("bad seed size");for(var n=new Uint8Array(Vr),e=new Uint8Array(Xr),t=0;t<32;t++)e[t]=r[t];return tr(n,e,!0),{publicKey:n,secretKey:e}},r.sign.publicKeyLength=Vr,r.sign.secretKeyLength=Xr,r.sign.seedLength=Dr,r.sign.signatureLength=Ir,r.hash=function(r){yr(r);var n=new Uint8Array(Hr);return Q(n,r,r.length),n},r.hash.hashLength=Hr,r.verify=function(r,n){return yr(r,n),0!==r.length&&0!==n.length&&(r.length===n.length&&0===a(r,0,n,0,r.length))},r.setPRNG=function(r){gr=r},function(){var n="undefined"!=typeof self?self.crypto||self.msCrypto:null;if(n&&n.getRandomValues){var e=65536;r.setPRNG(function(r,t){var o,i=new Uint8Array(t);for(o=0;o<t;o+=e)n.getRandomValues(i.subarray(o,o+Math.min(t-o,e)));for(o=0;o<t;o++)r[o]=i[o];lr(i)})}else"undefined"!=typeof require&&(n=require("crypto"),n&&n.randomBytes&&r.setPRNG(function(r,e){var t,o=n.randomBytes(e);for(t=0;t<e;t++)r[t]=o[t];lr(o)}))}()}("undefined"!=typeof module&&module.exports?module.exports:self.nacl=self.nacl||{});{
  "author": {
    "name": "TweetNaCl-js contributors"
  },
  "browser": {
    "buffer": false,
    "crypto": false
  },
  "deprecated": false,
  "description": "Port of TweetNaCl cryptographic library to JavaScript",
  "devDependencies": {
    "browserify": "^13.0.0",
    "eslint": "^2.2.0",
    "faucet": "^0.0.1",
    "tap-browser-color": "^0.1.2",
    "tape": "^4.4.0",
    "tape-run": "^2.1.3",
    "tweetnacl-util": "^0.13.3",
    "uglify-js": "^2.6.1"
  },
  "directories": {
    "test": "test"
  },
  "homepage": "https://tweetnacl.js.org",
  "license": "Unlicense",
  "main": "nacl-fast.js",
  "name": "tweetnacl",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/dchest/tweetnacl-js.git"
  },
  "types": "nacl.d.ts",
  "version": "0.14.5"
}Copyright (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative
Reporters & Editors

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Jeremy Ashkenas",
    "email": "jeremy@documentcloud.org"
  },
  "deprecated": false,
  "description": "JavaScript's functional programming helper library.",
  "devDependencies": {
    "coveralls": "^2.11.2",
    "docco": "*",
    "eslint": "1.10.x",
    "gzip-size-cli": "^1.0.0",
    "karma": "^0.13.13",
    "karma-qunit": "~2.0.1",
    "karma-sauce-launcher": "^1.2.0",
    "nyc": "^2.1.3",
    "pretty-bytes-cli": "^1.0.0",
    "qunit": "^2.6.0",
    "qunit-cli": "~0.2.0",
    "uglify-js": "3.3.21"
  },
  "files": [
    "underscore.js",
    "underscore-min.js",
    "underscore-min.js.map"
  ],
  "homepage": "https://underscorejs.org",
  "license": "MIT",
  "main": "underscore.js",
  "name": "underscore",
  "repository": {
    "type": "git",
    "url": "git://github.com/jashkenas/underscore.git"
  },
  "version": "1.9.2"
}//     Underscore.js 1.9.2
//     https://underscorejs.org
//     (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
//     Underscore may be freely distributed under the MIT license.
!function(){var n="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||this||{},r=n._,e=Array.prototype,o=Object.prototype,s="undefined"!=typeof Symbol?Symbol.prototype:null,u=e.push,c=e.slice,p=o.toString,i=o.hasOwnProperty,t=Array.isArray,a=Object.keys,l=Object.create,f=function(){},h=function(n){return n instanceof h?n:this instanceof h?void(this._wrapped=n):new h(n)};"undefined"==typeof exports||exports.nodeType?n._=h:("undefined"!=typeof module&&!module.nodeType&&module.exports&&(exports=module.exports=h),exports._=h),h.VERSION="1.9.2";var v,y=function(u,i,n){if(void 0===i)return u;switch(null==n?3:n){case 1:return function(n){return u.call(i,n)};case 3:return function(n,r,t){return u.call(i,n,r,t)};case 4:return function(n,r,t,e){return u.call(i,n,r,t,e)}}return function(){return u.apply(i,arguments)}},d=function(n,r,t){return h.iteratee!==v?h.iteratee(n,r):null==n?h.identity:h.isFunction(n)?y(n,r,t):h.isObject(n)&&!h.isArray(n)?h.matcher(n):h.property(n)};h.iteratee=v=function(n,r){return d(n,r,1/0)};var g=function(u,i){return i=null==i?u.length-1:+i,function(){for(var n=Math.max(arguments.length-i,0),r=Array(n),t=0;t<n;t++)r[t]=arguments[t+i];switch(i){case 0:return u.call(this,r);case 1:return u.call(this,arguments[0],r);case 2:return u.call(this,arguments[0],arguments[1],r)}var e=Array(i+1);for(t=0;t<i;t++)e[t]=arguments[t];return e[i]=r,u.apply(this,e)}},m=function(n){if(!h.isObject(n))return{};if(l)return l(n);f.prototype=n;var r=new f;return f.prototype=null,r},b=function(r){return function(n){return null==n?void 0:n[r]}},j=function(n,r){return null!=n&&i.call(n,r)},x=function(n,r){for(var t=r.length,e=0;e<t;e++){if(null==n)return;n=n[r[e]]}return t?n:void 0},_=Math.pow(2,53)-1,A=b("length"),w=function(n){var r=A(n);return"number"==typeof r&&0<=r&&r<=_};h.each=h.forEach=function(n,r,t){var e,u;if(r=y(r,t),w(n))for(e=0,u=n.length;e<u;e++)r(n[e],e,n);else{var i=h.keys(n);for(e=0,u=i.length;e<u;e++)r(n[i[e]],i[e],n)}return n},h.map=h.collect=function(n,r,t){r=d(r,t);for(var e=!w(n)&&h.keys(n),u=(e||n).length,i=Array(u),o=0;o<u;o++){var a=e?e[o]:o;i[o]=r(n[a],a,n)}return i};var O=function(c){return function(n,r,t,e){var u=3<=arguments.length;return function(n,r,t,e){var u=!w(n)&&h.keys(n),i=(u||n).length,o=0<c?0:i-1;for(e||(t=n[u?u[o]:o],o+=c);0<=o&&o<i;o+=c){var a=u?u[o]:o;t=r(t,n[a],a,n)}return t}(n,y(r,e,4),t,u)}};h.reduce=h.foldl=h.inject=O(1),h.reduceRight=h.foldr=O(-1),h.find=h.detect=function(n,r,t){var e=(w(n)?h.findIndex:h.findKey)(n,r,t);if(void 0!==e&&-1!==e)return n[e]},h.filter=h.select=function(n,e,r){var u=[];return e=d(e,r),h.each(n,function(n,r,t){e(n,r,t)&&u.push(n)}),u},h.reject=function(n,r,t){return h.filter(n,h.negate(d(r)),t)},h.every=h.all=function(n,r,t){r=d(r,t);for(var e=!w(n)&&h.keys(n),u=(e||n).length,i=0;i<u;i++){var o=e?e[i]:i;if(!r(n[o],o,n))return!1}return!0},h.some=h.any=function(n,r,t){r=d(r,t);for(var e=!w(n)&&h.keys(n),u=(e||n).length,i=0;i<u;i++){var o=e?e[i]:i;if(r(n[o],o,n))return!0}return!1},h.contains=h.includes=h.include=function(n,r,t,e){return w(n)||(n=h.values(n)),("number"!=typeof t||e)&&(t=0),0<=h.indexOf(n,r,t)},h.invoke=g(function(n,t,e){var u,i;return h.isFunction(t)?i=t:h.isArray(t)&&(u=t.slice(0,-1),t=t[t.length-1]),h.map(n,function(n){var r=i;if(!r){if(u&&u.length&&(n=x(n,u)),null==n)return;r=n[t]}return null==r?r:r.apply(n,e)})}),h.pluck=function(n,r){return h.map(n,h.property(r))},h.where=function(n,r){return h.filter(n,h.matcher(r))},h.findWhere=function(n,r){return h.find(n,h.matcher(r))},h.max=function(n,e,r){var t,u,i=-1/0,o=-1/0;if(null==e||"number"==typeof e&&"object"!=typeof n[0]&&null!=n)for(var a=0,c=(n=w(n)?n:h.values(n)).length;a<c;a++)null!=(t=n[a])&&i<t&&(i=t);else e=d(e,r),h.each(n,function(n,r,t){u=e(n,r,t),(o<u||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},h.min=function(n,e,r){var t,u,i=1/0,o=1/0;if(null==e||"number"==typeof e&&"object"!=typeof n[0]&&null!=n)for(var a=0,c=(n=w(n)?n:h.values(n)).length;a<c;a++)null!=(t=n[a])&&t<i&&(i=t);else e=d(e,r),h.each(n,function(n,r,t){((u=e(n,r,t))<o||u===1/0&&i===1/0)&&(i=n,o=u)});return i},h.shuffle=function(n){return h.sample(n,1/0)},h.sample=function(n,r,t){if(null==r||t)return w(n)||(n=h.values(n)),n[h.random(n.length-1)];var e=w(n)?h.clone(n):h.values(n),u=A(e);r=Math.max(Math.min(r,u),0);for(var i=u-1,o=0;o<r;o++){var a=h.random(o,i),c=e[o];e[o]=e[a],e[a]=c}return e.slice(0,r)},h.sortBy=function(n,e,r){var u=0;return e=d(e,r),h.pluck(h.map(n,function(n,r,t){return{value:n,index:u++,criteria:e(n,r,t)}}).sort(function(n,r){var t=n.criteria,e=r.criteria;if(t!==e){if(e<t||void 0===t)return 1;if(t<e||void 0===e)return-1}return n.index-r.index}),"value")};var k=function(o,r){return function(e,u,n){var i=r?[[],[]]:{};return u=d(u,n),h.each(e,function(n,r){var t=u(n,r,e);o(i,n,t)}),i}};h.groupBy=k(function(n,r,t){j(n,t)?n[t].push(r):n[t]=[r]}),h.indexBy=k(function(n,r,t){n[t]=r}),h.countBy=k(function(n,r,t){j(n,t)?n[t]++:n[t]=1});var S=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;h.toArray=function(n){return n?h.isArray(n)?c.call(n):h.isString(n)?n.match(S):w(n)?h.map(n,h.identity):h.values(n):[]},h.size=function(n){return null==n?0:w(n)?n.length:h.keys(n).length},h.partition=k(function(n,r,t){n[t?0:1].push(r)},!0),h.first=h.head=h.take=function(n,r,t){return null==n||n.length<1?null==r?void 0:[]:null==r||t?n[0]:h.initial(n,n.length-r)},h.initial=function(n,r,t){return c.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))},h.last=function(n,r,t){return null==n||n.length<1?null==r?void 0:[]:null==r||t?n[n.length-1]:h.rest(n,Math.max(0,n.length-r))},h.rest=h.tail=h.drop=function(n,r,t){return c.call(n,null==r||t?1:r)},h.compact=function(n){return h.filter(n,Boolean)};var M=function(n,r,t,e){for(var u=(e=e||[]).length,i=0,o=A(n);i<o;i++){var a=n[i];if(w(a)&&(h.isArray(a)||h.isArguments(a)))if(r)for(var c=0,l=a.length;c<l;)e[u++]=a[c++];else M(a,r,t,e),u=e.length;else t||(e[u++]=a)}return e};h.flatten=function(n,r){return M(n,r,!1)},h.without=g(function(n,r){return h.difference(n,r)}),h.uniq=h.unique=function(n,r,t,e){h.isBoolean(r)||(e=t,t=r,r=!1),null!=t&&(t=d(t,e));for(var u=[],i=[],o=0,a=A(n);o<a;o++){var c=n[o],l=t?t(c,o,n):c;r&&!t?(o&&i===l||u.push(c),i=l):t?h.contains(i,l)||(i.push(l),u.push(c)):h.contains(u,c)||u.push(c)}return u},h.union=g(function(n){return h.uniq(M(n,!0,!0))}),h.intersection=function(n){for(var r=[],t=arguments.length,e=0,u=A(n);e<u;e++){var i=n[e];if(!h.contains(r,i)){var o;for(o=1;o<t&&h.contains(arguments[o],i);o++);o===t&&r.push(i)}}return r},h.difference=g(function(n,r){return r=M(r,!0,!0),h.filter(n,function(n){return!h.contains(r,n)})}),h.unzip=function(n){for(var r=n&&h.max(n,A).length||0,t=Array(r),e=0;e<r;e++)t[e]=h.pluck(n,e);return t},h.zip=g(h.unzip),h.object=function(n,r){for(var t={},e=0,u=A(n);e<u;e++)r?t[n[e]]=r[e]:t[n[e][0]]=n[e][1];return t};var F=function(i){return function(n,r,t){r=d(r,t);for(var e=A(n),u=0<i?0:e-1;0<=u&&u<e;u+=i)if(r(n[u],u,n))return u;return-1}};h.findIndex=F(1),h.findLastIndex=F(-1),h.sortedIndex=function(n,r,t,e){for(var u=(t=d(t,e,1))(r),i=0,o=A(n);i<o;){var a=Math.floor((i+o)/2);t(n[a])<u?i=a+1:o=a}return i};var E=function(i,o,a){return function(n,r,t){var e=0,u=A(n);if("number"==typeof t)0<i?e=0<=t?t:Math.max(t+u,e):u=0<=t?Math.min(t+1,u):t+u+1;else if(a&&t&&u)return n[t=a(n,r)]===r?t:-1;if(r!=r)return 0<=(t=o(c.call(n,e,u),h.isNaN))?t+e:-1;for(t=0<i?e:u-1;0<=t&&t<u;t+=i)if(n[t]===r)return t;return-1}};h.indexOf=E(1,h.findIndex,h.sortedIndex),h.lastIndexOf=E(-1,h.findLastIndex),h.range=function(n,r,t){null==r&&(r=n||0,n=0),t||(t=r<n?-1:1);for(var e=Math.max(Math.ceil((r-n)/t),0),u=Array(e),i=0;i<e;i++,n+=t)u[i]=n;return u},h.chunk=function(n,r){if(null==r||r<1)return[];for(var t=[],e=0,u=n.length;e<u;)t.push(c.call(n,e,e+=r));return t};var N=function(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var i=m(n.prototype),o=n.apply(i,u);return h.isObject(o)?o:i};h.bind=g(function(r,t,e){if(!h.isFunction(r))throw new TypeError("Bind must be called on a function");var u=g(function(n){return N(r,u,t,this,e.concat(n))});return u}),h.partial=g(function(u,i){var o=h.partial.placeholder,a=function(){for(var n=0,r=i.length,t=Array(r),e=0;e<r;e++)t[e]=i[e]===o?arguments[n++]:i[e];for(;n<arguments.length;)t.push(arguments[n++]);return N(u,a,this,this,t)};return a}),(h.partial.placeholder=h).bindAll=g(function(n,r){var t=(r=M(r,!1,!1)).length;if(t<1)throw new Error("bindAll must be passed function names");for(;t--;){var e=r[t];n[e]=h.bind(n[e],n)}}),h.memoize=function(e,u){var i=function(n){var r=i.cache,t=""+(u?u.apply(this,arguments):n);return j(r,t)||(r[t]=e.apply(this,arguments)),r[t]};return i.cache={},i},h.delay=g(function(n,r,t){return setTimeout(function(){return n.apply(null,t)},r)}),h.defer=h.partial(h.delay,h,1),h.throttle=function(t,e,u){var i,o,a,c,l=0;u||(u={});var f=function(){l=!1===u.leading?0:h.now(),i=null,c=t.apply(o,a),i||(o=a=null)},n=function(){var n=h.now();l||!1!==u.leading||(l=n);var r=e-(n-l);return o=this,a=arguments,r<=0||e<r?(i&&(clearTimeout(i),i=null),l=n,c=t.apply(o,a),i||(o=a=null)):i||!1===u.trailing||(i=setTimeout(f,r)),c};return n.cancel=function(){clearTimeout(i),l=0,i=o=a=null},n},h.debounce=function(t,e,u){var i,o,a=function(n,r){i=null,r&&(o=t.apply(n,r))},n=g(function(n){if(i&&clearTimeout(i),u){var r=!i;i=setTimeout(a,e),r&&(o=t.apply(this,n))}else i=h.delay(a,e,this,n);return o});return n.cancel=function(){clearTimeout(i),i=null},n},h.wrap=function(n,r){return h.partial(r,n)},h.negate=function(n){return function(){return!n.apply(this,arguments)}},h.compose=function(){var t=arguments,e=t.length-1;return function(){for(var n=e,r=t[e].apply(this,arguments);n--;)r=t[n].call(this,r);return r}},h.after=function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},h.before=function(n,r){var t;return function(){return 0<--n&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}},h.once=h.partial(h.before,2),h.restArguments=g;var I=!{toString:null}.propertyIsEnumerable("toString"),T=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],B=function(n,r){var t=T.length,e=n.constructor,u=h.isFunction(e)&&e.prototype||o,i="constructor";for(j(n,i)&&!h.contains(r,i)&&r.push(i);t--;)(i=T[t])in n&&n[i]!==u[i]&&!h.contains(r,i)&&r.push(i)};h.keys=function(n){if(!h.isObject(n))return[];if(a)return a(n);var r=[];for(var t in n)j(n,t)&&r.push(t);return I&&B(n,r),r},h.allKeys=function(n){if(!h.isObject(n))return[];var r=[];for(var t in n)r.push(t);return I&&B(n,r),r},h.values=function(n){for(var r=h.keys(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=n[r[u]];return e},h.mapObject=function(n,r,t){r=d(r,t);for(var e=h.keys(n),u=e.length,i={},o=0;o<u;o++){var a=e[o];i[a]=r(n[a],a,n)}return i},h.pairs=function(n){for(var r=h.keys(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=[r[u],n[r[u]]];return e},h.invert=function(n){for(var r={},t=h.keys(n),e=0,u=t.length;e<u;e++)r[n[t[e]]]=t[e];return r},h.functions=h.methods=function(n){var r=[];for(var t in n)h.isFunction(n[t])&&r.push(t);return r.sort()};var R=function(c,l){return function(n){var r=arguments.length;if(l&&(n=Object(n)),r<2||null==n)return n;for(var t=1;t<r;t++)for(var e=arguments[t],u=c(e),i=u.length,o=0;o<i;o++){var a=u[o];l&&void 0!==n[a]||(n[a]=e[a])}return n}};h.extend=R(h.allKeys),h.extendOwn=h.assign=R(h.keys),h.findKey=function(n,r,t){r=d(r,t);for(var e,u=h.keys(n),i=0,o=u.length;i<o;i++)if(r(n[e=u[i]],e,n))return e};var q,K,z=function(n,r,t){return r in t};h.pick=g(function(n,r){var t={},e=r[0];if(null==n)return t;h.isFunction(e)?(1<r.length&&(e=y(e,r[1])),r=h.allKeys(n)):(e=z,r=M(r,!1,!1),n=Object(n));for(var u=0,i=r.length;u<i;u++){var o=r[u],a=n[o];e(a,o,n)&&(t[o]=a)}return t}),h.omit=g(function(n,t){var r,e=t[0];return h.isFunction(e)?(e=h.negate(e),1<t.length&&(r=t[1])):(t=h.map(M(t,!1,!1),String),e=function(n,r){return!h.contains(t,r)}),h.pick(n,e,r)}),h.defaults=R(h.allKeys,!0),h.create=function(n,r){var t=m(n);return r&&h.extendOwn(t,r),t},h.clone=function(n){return h.isObject(n)?h.isArray(n)?n.slice():h.extend({},n):n},h.tap=function(n,r){return r(n),n},h.isMatch=function(n,r){var t=h.keys(r),e=t.length;if(null==n)return!e;for(var u=Object(n),i=0;i<e;i++){var o=t[i];if(r[o]!==u[o]||!(o in u))return!1}return!0},q=function(n,r,t,e){if(n===r)return 0!==n||1/n==1/r;if(null==n||null==r)return!1;if(n!=n)return r!=r;var u=typeof n;return("function"===u||"object"===u||"object"==typeof r)&&K(n,r,t,e)},K=function(n,r,t,e){n instanceof h&&(n=n._wrapped),r instanceof h&&(r=r._wrapped);var u=p.call(n);if(u!==p.call(r))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+r;case"[object Number]":return+n!=+n?+r!=+r:0==+n?1/+n==1/r:+n==+r;case"[object Date]":case"[object Boolean]":return+n==+r;case"[object Symbol]":return s.valueOf.call(n)===s.valueOf.call(r)}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof r)return!1;var o=n.constructor,a=r.constructor;if(o!==a&&!(h.isFunction(o)&&o instanceof o&&h.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in r)return!1}e=e||[];for(var c=(t=t||[]).length;c--;)if(t[c]===n)return e[c]===r;if(t.push(n),e.push(r),i){if((c=n.length)!==r.length)return!1;for(;c--;)if(!q(n[c],r[c],t,e))return!1}else{var l,f=h.keys(n);if(c=f.length,h.keys(r).length!==c)return!1;for(;c--;)if(l=f[c],!j(r,l)||!q(n[l],r[l],t,e))return!1}return t.pop(),e.pop(),!0},h.isEqual=function(n,r){return q(n,r)},h.isEmpty=function(n){return null==n||(w(n)&&(h.isArray(n)||h.isString(n)||h.isArguments(n))?0===n.length:0===h.keys(n).length)},h.isElement=function(n){return!(!n||1!==n.nodeType)},h.isArray=t||function(n){return"[object Array]"===p.call(n)},h.isObject=function(n){var r=typeof n;return"function"===r||"object"===r&&!!n},h.each(["Arguments","Function","String","Number","Date","RegExp","Error","Symbol","Map","WeakMap","Set","WeakSet"],function(r){h["is"+r]=function(n){return p.call(n)==="[object "+r+"]"}}),h.isArguments(arguments)||(h.isArguments=function(n){return j(n,"callee")});var D=n.document&&n.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof D&&(h.isFunction=function(n){return"function"==typeof n||!1}),h.isFinite=function(n){return!h.isSymbol(n)&&isFinite(n)&&!isNaN(parseFloat(n))},h.isNaN=function(n){return h.isNumber(n)&&isNaN(n)},h.isBoolean=function(n){return!0===n||!1===n||"[object Boolean]"===p.call(n)},h.isNull=function(n){return null===n},h.isUndefined=function(n){return void 0===n},h.has=function(n,r){if(!h.isArray(r))return j(n,r);for(var t=r.length,e=0;e<t;e++){var u=r[e];if(null==n||!i.call(n,u))return!1;n=n[u]}return!!t},h.noConflict=function(){return n._=r,this},h.identity=function(n){return n},h.constant=function(n){return function(){return n}},h.noop=function(){},h.property=function(r){return h.isArray(r)?function(n){return x(n,r)}:b(r)},h.propertyOf=function(r){return null==r?function(){}:function(n){return h.isArray(n)?x(r,n):r[n]}},h.matcher=h.matches=function(r){return r=h.extendOwn({},r),function(n){return h.isMatch(n,r)}},h.times=function(n,r,t){var e=Array(Math.max(0,n));r=y(r,t,1);for(var u=0;u<n;u++)e[u]=r(u);return e},h.random=function(n,r){return null==r&&(r=n,n=0),n+Math.floor(Math.random()*(r-n+1))},h.now=Date.now||function(){return(new Date).getTime()};var L={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},P=h.invert(L),W=function(r){var t=function(n){return r[n]},n="(?:"+h.keys(r).join("|")+")",e=RegExp(n),u=RegExp(n,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};h.escape=W(L),h.unescape=W(P),h.result=function(n,r,t){h.isArray(r)||(r=[r]);var e=r.length;if(!e)return h.isFunction(t)?t.call(n):t;for(var u=0;u<e;u++){var i=null==n?void 0:n[r[u]];void 0===i&&(i=t,u=e),n=h.isFunction(i)?i.call(n):i}return n};var C=0;h.uniqueId=function(n){var r=++C+"";return n?n+r:r},h.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var J=/(.)^/,U={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},V=/\\|'|\r|\n|\u2028|\u2029/g,$=function(n){return"\\"+U[n]};h.template=function(i,n,r){!n&&r&&(n=r),n=h.defaults({},n,h.templateSettings);var t,e=RegExp([(n.escape||J).source,(n.interpolate||J).source,(n.evaluate||J).source].join("|")+"|$","g"),o=0,a="__p+='";i.replace(e,function(n,r,t,e,u){return a+=i.slice(o,u).replace(V,$),o=u+n.length,r?a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":t?a+="'+\n((__t=("+t+"))==null?'':__t)+\n'":e&&(a+="';\n"+e+"\n__p+='"),n}),a+="';\n",n.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{t=new Function(n.variable||"obj","_",a)}catch(n){throw n.source=a,n}var u=function(n){return t.call(this,n,h)},c=n.variable||"obj";return u.source="function("+c+"){\n"+a+"}",u},h.chain=function(n){var r=h(n);return r._chain=!0,r};var G=function(n,r){return n._chain?h(r).chain():r};h.mixin=function(t){return h.each(h.functions(t),function(n){var r=h[n]=t[n];h.prototype[n]=function(){var n=[this._wrapped];return u.apply(n,arguments),G(this,r.apply(h,n))}}),h},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(r){var t=e[r];h.prototype[r]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==r&&"splice"!==r||0!==n.length||delete n[0],G(this,n)}}),h.each(["concat","join","slice"],function(n){var r=e[n];h.prototype[n]=function(){return G(this,r.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},h.prototype.valueOf=h.prototype.toJSON=h.prototype.value,h.prototype.toString=function(){return String(this._wrapped)},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}();{"version":3,"sources":["underscore.js"],"names":["root","self","global","this","previousUnderscore","_","ArrayProto","Array","prototype","ObjProto","Object","SymbolProto","Symbol","push","slice","toString","hasOwnProperty","nativeIsArray","isArray","nativeKeys","keys","nativeCreate","create","Ctor","obj","_wrapped","exports","nodeType","module","VERSION","builtinIteratee","optimizeCb","func","context","argCount","value","call","index","collection","accumulator","apply","arguments","cb","iteratee","identity","isFunction","isObject","matcher","property","Infinity","restArguments","startIndex","length","Math","max","rest","args","baseCreate","result","shallowProperty","key","has","path","deepGet","i","MAX_ARRAY_INDEX","pow","getLength","isArrayLike","each","forEach","map","collect","results","currentKey","createReduce","dir","memo","initial","reducer","reduce","foldl","inject","reduceRight","foldr","find","detect","predicate","findIndex","findKey","filter","select","list","reject","negate","every","all","some","any","contains","includes","include","item","fromIndex","guard","values","indexOf","invoke","contextPath","method","pluck","where","attrs","findWhere","computed","lastComputed","v","min","shuffle","sample","n","random","clone","last","rand","temp","sortBy","criteria","sort","left","right","a","b","group","behavior","partition","groupBy","indexBy","countBy","reStrSymbol","toArray","isString","match","size","pass","first","head","take","array","tail","drop","compact","Boolean","flatten","input","shallow","strict","output","idx","isArguments","j","len","without","otherArrays","difference","uniq","unique","isSorted","isBoolean","seen","union","arrays","intersection","argsLength","unzip","zip","object","createPredicateIndexFinder","findLastIndex","sortedIndex","low","high","mid","floor","createIndexFinder","predicateFind","isNaN","lastIndexOf","range","start","stop","step","ceil","chunk","count","executeBound","sourceFunc","boundFunc","callingContext","bind","TypeError","bound","callArgs","concat","partial","boundArgs","placeholder","position","bindAll","Error","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","now","throttled","remaining","clearTimeout","trailing","cancel","debounce","immediate","debounced","callNow","wrap","wrapper","compose","after","times","before","once","hasEnumBug","propertyIsEnumerable","nonEnumerableProps","collectNonEnumProps","nonEnumIdx","constructor","proto","prop","allKeys","mapObject","pairs","invert","functions","methods","names","createAssigner","keysFunc","defaults","source","l","extend","extendOwn","assign","eq","deepEq","keyInObj","pick","omit","String","props","tap","interceptor","isMatch","aStack","bStack","type","className","valueOf","areArrays","aCtor","bCtor","pop","isEqual","isEmpty","isElement","name","nodelist","document","childNodes","Int8Array","isFinite","isSymbol","parseFloat","isNumber","isNull","isUndefined","noConflict","constant","noop","propertyOf","matches","accum","Date","getTime","escapeMap","&","<",">","\"","'","`","unescapeMap","createEscaper","escaper","join","testRegexp","RegExp","replaceRegexp","string","test","replace","escape","unescape","fallback","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","\\","\r","\n","â€¨","â€©","escapeRegExp","escapeChar","template","text","settings","oldSettings","render","offset","variable","Function","e","data","argument","chain","instance","_chain","chainResult","mixin","toJSON","define","amd"],"mappings":"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"}//     Underscore.js 1.9.2
//     https://underscorejs.org
//     (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
//     Underscore may be freely distributed under the MIT license.

(function() {

  // Baseline setup
  // --------------

  // Establish the root object, `window` (`self`) in the browser, `global`
  // on the server, or `this` in some virtual machines. We use `self`
  // instead of `window` for `WebWorker` support.
  var root = typeof self == 'object' && self.self === self && self ||
            typeof global == 'object' && global.global === global && global ||
            this ||
            {};

  // Save the previous value of the `_` variable.
  var previousUnderscore = root._;

  // Save bytes in the minified (but not gzipped) version:
  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;

  // Create quick reference variables for speed access to core prototypes.
  var push = ArrayProto.push,
      slice = ArrayProto.slice,
      toString = ObjProto.toString,
      hasOwnProperty = ObjProto.hasOwnProperty;

  // All **ECMAScript 5** native function implementations that we hope to use
  // are declared here.
  var nativeIsArray = Array.isArray,
      nativeKeys = Object.keys,
      nativeCreate = Object.create;

  // Naked function reference for surrogate-prototype-swapping.
  var Ctor = function(){};

  // Create a safe reference to the Underscore object for use below.
  var _ = function(obj) {
    if (obj instanceof _) return obj;
    if (!(this instanceof _)) return new _(obj);
    this._wrapped = obj;
  };

  // Export the Underscore object for **Node.js**, with
  // backwards-compatibility for their old module API. If we're in
  // the browser, add `_` as a global object.
  // (`nodeType` is checked to ensure that `module`
  // and `exports` are not HTML elements.)
  if (typeof exports != 'undefined' && !exports.nodeType) {
    if (typeof module != 'undefined' && !module.nodeType && module.exports) {
      exports = module.exports = _;
    }
    exports._ = _;
  } else {
    root._ = _;
  }

  // Current version.
  _.VERSION = '1.9.2';

  // Internal function that returns an efficient (for current engines) version
  // of the passed-in callback, to be repeatedly applied in other Underscore
  // functions.
  var optimizeCb = function(func, context, argCount) {
    if (context === void 0) return func;
    switch (argCount == null ? 3 : argCount) {
      case 1: return function(value) {
        return func.call(context, value);
      };
      // The 2-argument case is omitted because weâ€™re not using it.
      case 3: return function(value, index, collection) {
        return func.call(context, value, index, collection);
      };
      case 4: return function(accumulator, value, index, collection) {
        return func.call(context, accumulator, value, index, collection);
      };
    }
    return function() {
      return func.apply(context, arguments);
    };
  };

  var builtinIteratee;

  // An internal function to generate callbacks that can be applied to each
  // element in a collection, returning the desired result â€” either `identity`,
  // an arbitrary callback, a property matcher, or a property accessor.
  var cb = function(value, context, argCount) {
    if (_.iteratee !== builtinIteratee) return _.iteratee(value, context);
    if (value == null) return _.identity;
    if (_.isFunction(value)) return optimizeCb(value, context, argCount);
    if (_.isObject(value) && !_.isArray(value)) return _.matcher(value);
    return _.property(value);
  };

  // External wrapper for our callback generator. Users may customize
  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
  // This abstraction hides the internal-only argCount argument.
  _.iteratee = builtinIteratee = function(value, context) {
    return cb(value, context, Infinity);
  };

  // Some functions take a variable number of arguments, or a few expected
  // arguments at the beginning and then a variable number of values to operate
  // on. This helper accumulates all remaining arguments past the functionâ€™s
  // argument length (or an explicit `startIndex`), into an array that becomes
  // the last argument. Similar to ES6â€™s "rest parameter".
  var restArguments = function(func, startIndex) {
    startIndex = startIndex == null ? func.length - 1 : +startIndex;
    return function() {
      var length = Math.max(arguments.length - startIndex, 0),
          rest = Array(length),
          index = 0;
      for (; index < length; index++) {
        rest[index] = arguments[index + startIndex];
      }
      switch (startIndex) {
        case 0: return func.call(this, rest);
        case 1: return func.call(this, arguments[0], rest);
        case 2: return func.call(this, arguments[0], arguments[1], rest);
      }
      var args = Array(startIndex + 1);
      for (index = 0; index < startIndex; index++) {
        args[index] = arguments[index];
      }
      args[startIndex] = rest;
      return func.apply(this, args);
    };
  };

  // An internal function for creating a new object that inherits from another.
  var baseCreate = function(prototype) {
    if (!_.isObject(prototype)) return {};
    if (nativeCreate) return nativeCreate(prototype);
    Ctor.prototype = prototype;
    var result = new Ctor;
    Ctor.prototype = null;
    return result;
  };

  var shallowProperty = function(key) {
    return function(obj) {
      return obj == null ? void 0 : obj[key];
    };
  };

  var has = function(obj, path) {
    return obj != null && hasOwnProperty.call(obj, path);
  }

  var deepGet = function(obj, path) {
    var length = path.length;
    for (var i = 0; i < length; i++) {
      if (obj == null) return void 0;
      obj = obj[path[i]];
    }
    return length ? obj : void 0;
  };

  // Helper for collection methods to determine whether a collection
  // should be iterated as an array or as an object.
  // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
  var getLength = shallowProperty('length');
  var isArrayLike = function(collection) {
    var length = getLength(collection);
    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
  };

  // Collection Functions
  // --------------------

  // The cornerstone, an `each` implementation, aka `forEach`.
  // Handles raw objects in addition to array-likes. Treats all
  // sparse array-likes as if they were dense.
  _.each = _.forEach = function(obj, iteratee, context) {
    iteratee = optimizeCb(iteratee, context);
    var i, length;
    if (isArrayLike(obj)) {
      for (i = 0, length = obj.length; i < length; i++) {
        iteratee(obj[i], i, obj);
      }
    } else {
      var keys = _.keys(obj);
      for (i = 0, length = keys.length; i < length; i++) {
        iteratee(obj[keys[i]], keys[i], obj);
      }
    }
    return obj;
  };

  // Return the results of applying the iteratee to each element.
  _.map = _.collect = function(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    var keys = !isArrayLike(obj) && _.keys(obj),
        length = (keys || obj).length,
        results = Array(length);
    for (var index = 0; index < length; index++) {
      var currentKey = keys ? keys[index] : index;
      results[index] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  };

  // Create a reducing function iterating left or right.
  var createReduce = function(dir) {
    // Wrap code that reassigns argument variables in a separate function than
    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
    var reducer = function(obj, iteratee, memo, initial) {
      var keys = !isArrayLike(obj) && _.keys(obj),
          length = (keys || obj).length,
          index = dir > 0 ? 0 : length - 1;
      if (!initial) {
        memo = obj[keys ? keys[index] : index];
        index += dir;
      }
      for (; index >= 0 && index < length; index += dir) {
        var currentKey = keys ? keys[index] : index;
        memo = iteratee(memo, obj[currentKey], currentKey, obj);
      }
      return memo;
    };

    return function(obj, iteratee, memo, context) {
      var initial = arguments.length >= 3;
      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
    };
  };

  // **Reduce** builds up a single result from a list of values, aka `inject`,
  // or `foldl`.
  _.reduce = _.foldl = _.inject = createReduce(1);

  // The right-associative version of reduce, also known as `foldr`.
  _.reduceRight = _.foldr = createReduce(-1);

  // Return the first value which passes a truth test. Aliased as `detect`.
  _.find = _.detect = function(obj, predicate, context) {
    var keyFinder = isArrayLike(obj) ? _.findIndex : _.findKey;
    var key = keyFinder(obj, predicate, context);
    if (key !== void 0 && key !== -1) return obj[key];
  };

  // Return all the elements that pass a truth test.
  // Aliased as `select`.
  _.filter = _.select = function(obj, predicate, context) {
    var results = [];
    predicate = cb(predicate, context);
    _.each(obj, function(value, index, list) {
      if (predicate(value, index, list)) results.push(value);
    });
    return results;
  };

  // Return all the elements for which a truth test fails.
  _.reject = function(obj, predicate, context) {
    return _.filter(obj, _.negate(cb(predicate)), context);
  };

  // Determine whether all of the elements match a truth test.
  // Aliased as `all`.
  _.every = _.all = function(obj, predicate, context) {
    predicate = cb(predicate, context);
    var keys = !isArrayLike(obj) && _.keys(obj),
        length = (keys || obj).length;
    for (var index = 0; index < length; index++) {
      var currentKey = keys ? keys[index] : index;
      if (!predicate(obj[currentKey], currentKey, obj)) return false;
    }
    return true;
  };

  // Determine if at least one element in the object matches a truth test.
  // Aliased as `any`.
  _.some = _.any = function(obj, predicate, context) {
    predicate = cb(predicate, context);
    var keys = !isArrayLike(obj) && _.keys(obj),
        length = (keys || obj).length;
    for (var index = 0; index < length; index++) {
      var currentKey = keys ? keys[index] : index;
      if (predicate(obj[currentKey], currentKey, obj)) return true;
    }
    return false;
  };

  // Determine if the array or object contains a given item (using `===`).
  // Aliased as `includes` and `include`.
  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
    if (!isArrayLike(obj)) obj = _.values(obj);
    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
    return _.indexOf(obj, item, fromIndex) >= 0;
  };

  // Invoke a method (with arguments) on every item in a collection.
  _.invoke = restArguments(function(obj, path, args) {
    var contextPath, func;
    if (_.isFunction(path)) {
      func = path;
    } else if (_.isArray(path)) {
      contextPath = path.slice(0, -1);
      path = path[path.length - 1];
    }
    return _.map(obj, function(context) {
      var method = func;
      if (!method) {
        if (contextPath && contextPath.length) {
          context = deepGet(context, contextPath);
        }
        if (context == null) return void 0;
        method = context[path];
      }
      return method == null ? method : method.apply(context, args);
    });
  });

  // Convenience version of a common use case of `map`: fetching a property.
  _.pluck = function(obj, key) {
    return _.map(obj, _.property(key));
  };

  // Convenience version of a common use case of `filter`: selecting only objects
  // containing specific `key:value` pairs.
  _.where = function(obj, attrs) {
    return _.filter(obj, _.matcher(attrs));
  };

  // Convenience version of a common use case of `find`: getting the first object
  // containing specific `key:value` pairs.
  _.findWhere = function(obj, attrs) {
    return _.find(obj, _.matcher(attrs));
  };

  // Return the maximum element (or element-based computation).
  _.max = function(obj, iteratee, context) {
    var result = -Infinity, lastComputed = -Infinity,
        value, computed;
    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
      obj = isArrayLike(obj) ? obj : _.values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value != null && value > result) {
          result = value;
        }
      }
    } else {
      iteratee = cb(iteratee, context);
      _.each(obj, function(v, index, list) {
        computed = iteratee(v, index, list);
        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
          result = v;
          lastComputed = computed;
        }
      });
    }
    return result;
  };

  // Return the minimum element (or element-based computation).
  _.min = function(obj, iteratee, context) {
    var result = Infinity, lastComputed = Infinity,
        value, computed;
    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
      obj = isArrayLike(obj) ? obj : _.values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value != null && value < result) {
          result = value;
        }
      }
    } else {
      iteratee = cb(iteratee, context);
      _.each(obj, function(v, index, list) {
        computed = iteratee(v, index, list);
        if (computed < lastComputed || computed === Infinity && result === Infinity) {
          result = v;
          lastComputed = computed;
        }
      });
    }
    return result;
  };

  // Shuffle a collection.
  _.shuffle = function(obj) {
    return _.sample(obj, Infinity);
  };

  // Sample **n** random values from a collection using the modern version of the
  // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisherâ€“Yates_shuffle).
  // If **n** is not specified, returns a single random element.
  // The internal `guard` argument allows it to work with `map`.
  _.sample = function(obj, n, guard) {
    if (n == null || guard) {
      if (!isArrayLike(obj)) obj = _.values(obj);
      return obj[_.random(obj.length - 1)];
    }
    var sample = isArrayLike(obj) ? _.clone(obj) : _.values(obj);
    var length = getLength(sample);
    n = Math.max(Math.min(n, length), 0);
    var last = length - 1;
    for (var index = 0; index < n; index++) {
      var rand = _.random(index, last);
      var temp = sample[index];
      sample[index] = sample[rand];
      sample[rand] = temp;
    }
    return sample.slice(0, n);
  };

  // Sort the object's values by a criterion produced by an iteratee.
  _.sortBy = function(obj, iteratee, context) {
    var index = 0;
    iteratee = cb(iteratee, context);
    return _.pluck(_.map(obj, function(value, key, list) {
      return {
        value: value,
        index: index++,
        criteria: iteratee(value, key, list)
      };
    }).sort(function(left, right) {
      var a = left.criteria;
      var b = right.criteria;
      if (a !== b) {
        if (a > b || a === void 0) return 1;
        if (a < b || b === void 0) return -1;
      }
      return left.index - right.index;
    }), 'value');
  };

  // An internal function used for aggregate "group by" operations.
  var group = function(behavior, partition) {
    return function(obj, iteratee, context) {
      var result = partition ? [[], []] : {};
      iteratee = cb(iteratee, context);
      _.each(obj, function(value, index) {
        var key = iteratee(value, index, obj);
        behavior(result, value, key);
      });
      return result;
    };
  };

  // Groups the object's values by a criterion. Pass either a string attribute
  // to group by, or a function that returns the criterion.
  _.groupBy = group(function(result, value, key) {
    if (has(result, key)) result[key].push(value); else result[key] = [value];
  });

  // Indexes the object's values by a criterion, similar to `groupBy`, but for
  // when you know that your index values will be unique.
  _.indexBy = group(function(result, value, key) {
    result[key] = value;
  });

  // Counts instances of an object that group by a certain criterion. Pass
  // either a string attribute to count by, or a function that returns the
  // criterion.
  _.countBy = group(function(result, value, key) {
    if (has(result, key)) result[key]++; else result[key] = 1;
  });

  var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
  // Safely create a real, live array from anything iterable.
  _.toArray = function(obj) {
    if (!obj) return [];
    if (_.isArray(obj)) return slice.call(obj);
    if (_.isString(obj)) {
      // Keep surrogate pair characters together
      return obj.match(reStrSymbol);
    }
    if (isArrayLike(obj)) return _.map(obj, _.identity);
    return _.values(obj);
  };

  // Return the number of elements in an object.
  _.size = function(obj) {
    if (obj == null) return 0;
    return isArrayLike(obj) ? obj.length : _.keys(obj).length;
  };

  // Split a collection into two arrays: one whose elements all satisfy the given
  // predicate, and one whose elements all do not satisfy the predicate.
  _.partition = group(function(result, value, pass) {
    result[pass ? 0 : 1].push(value);
  }, true);

  // Array Functions
  // ---------------

  // Get the first element of an array. Passing **n** will return the first N
  // values in the array. Aliased as `head` and `take`. The **guard** check
  // allows it to work with `_.map`.
  _.first = _.head = _.take = function(array, n, guard) {
    if (array == null || array.length < 1) return n == null ? void 0 : [];
    if (n == null || guard) return array[0];
    return _.initial(array, array.length - n);
  };

  // Returns everything but the last entry of the array. Especially useful on
  // the arguments object. Passing **n** will return all the values in
  // the array, excluding the last N.
  _.initial = function(array, n, guard) {
    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
  };

  // Get the last element of an array. Passing **n** will return the last N
  // values in the array.
  _.last = function(array, n, guard) {
    if (array == null || array.length < 1) return n == null ? void 0 : [];
    if (n == null || guard) return array[array.length - 1];
    return _.rest(array, Math.max(0, array.length - n));
  };

  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
  // Especially useful on the arguments object. Passing an **n** will return
  // the rest N values in the array.
  _.rest = _.tail = _.drop = function(array, n, guard) {
    return slice.call(array, n == null || guard ? 1 : n);
  };

  // Trim out all falsy values from an array.
  _.compact = function(array) {
    return _.filter(array, Boolean);
  };

  // Internal implementation of a recursive `flatten` function.
  var flatten = function(input, shallow, strict, output) {
    output = output || [];
    var idx = output.length;
    for (var i = 0, length = getLength(input); i < length; i++) {
      var value = input[i];
      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
        // Flatten current level of array or arguments object.
        if (shallow) {
          var j = 0, len = value.length;
          while (j < len) output[idx++] = value[j++];
        } else {
          flatten(value, shallow, strict, output);
          idx = output.length;
        }
      } else if (!strict) {
        output[idx++] = value;
      }
    }
    return output;
  };

  // Flatten out an array, either recursively (by default), or just one level.
  _.flatten = function(array, shallow) {
    return flatten(array, shallow, false);
  };

  // Return a version of the array that does not contain the specified value(s).
  _.without = restArguments(function(array, otherArrays) {
    return _.difference(array, otherArrays);
  });

  // Produce a duplicate-free version of the array. If the array has already
  // been sorted, you have the option of using a faster algorithm.
  // The faster algorithm will not work with an iteratee if the iteratee
  // is not a one-to-one function, so providing an iteratee will disable
  // the faster algorithm.
  // Aliased as `unique`.
  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
    if (!_.isBoolean(isSorted)) {
      context = iteratee;
      iteratee = isSorted;
      isSorted = false;
    }
    if (iteratee != null) iteratee = cb(iteratee, context);
    var result = [];
    var seen = [];
    for (var i = 0, length = getLength(array); i < length; i++) {
      var value = array[i],
          computed = iteratee ? iteratee(value, i, array) : value;
      if (isSorted && !iteratee) {
        if (!i || seen !== computed) result.push(value);
        seen = computed;
      } else if (iteratee) {
        if (!_.contains(seen, computed)) {
          seen.push(computed);
          result.push(value);
        }
      } else if (!_.contains(result, value)) {
        result.push(value);
      }
    }
    return result;
  };

  // Produce an array that contains the union: each distinct element from all of
  // the passed-in arrays.
  _.union = restArguments(function(arrays) {
    return _.uniq(flatten(arrays, true, true));
  });

  // Produce an array that contains every item shared between all the
  // passed-in arrays.
  _.intersection = function(array) {
    var result = [];
    var argsLength = arguments.length;
    for (var i = 0, length = getLength(array); i < length; i++) {
      var item = array[i];
      if (_.contains(result, item)) continue;
      var j;
      for (j = 1; j < argsLength; j++) {
        if (!_.contains(arguments[j], item)) break;
      }
      if (j === argsLength) result.push(item);
    }
    return result;
  };

  // Take the difference between one array and a number of other arrays.
  // Only the elements present in just the first array will remain.
  _.difference = restArguments(function(array, rest) {
    rest = flatten(rest, true, true);
    return _.filter(array, function(value){
      return !_.contains(rest, value);
    });
  });

  // Complement of _.zip. Unzip accepts an array of arrays and groups
  // each array's elements on shared indices.
  _.unzip = function(array) {
    var length = array && _.max(array, getLength).length || 0;
    var result = Array(length);

    for (var index = 0; index < length; index++) {
      result[index] = _.pluck(array, index);
    }
    return result;
  };

  // Zip together multiple lists into a single array -- elements that share
  // an index go together.
  _.zip = restArguments(_.unzip);

  // Converts lists into objects. Pass either a single array of `[key, value]`
  // pairs, or two parallel arrays of the same length -- one of keys, and one of
  // the corresponding values. Passing by pairs is the reverse of _.pairs.
  _.object = function(list, values) {
    var result = {};
    for (var i = 0, length = getLength(list); i < length; i++) {
      if (values) {
        result[list[i]] = values[i];
      } else {
        result[list[i][0]] = list[i][1];
      }
    }
    return result;
  };

  // Generator function to create the findIndex and findLastIndex functions.
  var createPredicateIndexFinder = function(dir) {
    return function(array, predicate, context) {
      predicate = cb(predicate, context);
      var length = getLength(array);
      var index = dir > 0 ? 0 : length - 1;
      for (; index >= 0 && index < length; index += dir) {
        if (predicate(array[index], index, array)) return index;
      }
      return -1;
    };
  };

  // Returns the first index on an array-like that passes a predicate test.
  _.findIndex = createPredicateIndexFinder(1);
  _.findLastIndex = createPredicateIndexFinder(-1);

  // Use a comparator function to figure out the smallest index at which
  // an object should be inserted so as to maintain order. Uses binary search.
  _.sortedIndex = function(array, obj, iteratee, context) {
    iteratee = cb(iteratee, context, 1);
    var value = iteratee(obj);
    var low = 0, high = getLength(array);
    while (low < high) {
      var mid = Math.floor((low + high) / 2);
      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
    }
    return low;
  };

  // Generator function to create the indexOf and lastIndexOf functions.
  var createIndexFinder = function(dir, predicateFind, sortedIndex) {
    return function(array, item, idx) {
      var i = 0, length = getLength(array);
      if (typeof idx == 'number') {
        if (dir > 0) {
          i = idx >= 0 ? idx : Math.max(idx + length, i);
        } else {
          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
        }
      } else if (sortedIndex && idx && length) {
        idx = sortedIndex(array, item);
        return array[idx] === item ? idx : -1;
      }
      if (item !== item) {
        idx = predicateFind(slice.call(array, i, length), _.isNaN);
        return idx >= 0 ? idx + i : -1;
      }
      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
        if (array[idx] === item) return idx;
      }
      return -1;
    };
  };

  // Return the position of the first occurrence of an item in an array,
  // or -1 if the item is not included in the array.
  // If the array is large and already in sort order, pass `true`
  // for **isSorted** to use binary search.
  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);

  // Generate an integer Array containing an arithmetic progression. A port of
  // the native Python `range()` function. See
  // [the Python documentation](https://docs.python.org/library/functions.html#range).
  _.range = function(start, stop, step) {
    if (stop == null) {
      stop = start || 0;
      start = 0;
    }
    if (!step) {
      step = stop < start ? -1 : 1;
    }

    var length = Math.max(Math.ceil((stop - start) / step), 0);
    var range = Array(length);

    for (var idx = 0; idx < length; idx++, start += step) {
      range[idx] = start;
    }

    return range;
  };

  // Chunk a single array into multiple arrays, each containing `count` or fewer
  // items.
  _.chunk = function(array, count) {
    if (count == null || count < 1) return [];
    var result = [];
    var i = 0, length = array.length;
    while (i < length) {
      result.push(slice.call(array, i, i += count));
    }
    return result;
  };

  // Function (ahem) Functions
  // ------------------

  // Determines whether to execute a function as a constructor
  // or a normal function with the provided arguments.
  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
    var self = baseCreate(sourceFunc.prototype);
    var result = sourceFunc.apply(self, args);
    if (_.isObject(result)) return result;
    return self;
  };

  // Create a function bound to a given object (assigning `this`, and arguments,
  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
  // available.
  _.bind = restArguments(function(func, context, args) {
    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
    var bound = restArguments(function(callArgs) {
      return executeBound(func, bound, context, this, args.concat(callArgs));
    });
    return bound;
  });

  // Partially apply a function by creating a version that has had some of its
  // arguments pre-filled, without changing its dynamic `this` context. _ acts
  // as a placeholder by default, allowing any combination of arguments to be
  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
  _.partial = restArguments(function(func, boundArgs) {
    var placeholder = _.partial.placeholder;
    var bound = function() {
      var position = 0, length = boundArgs.length;
      var args = Array(length);
      for (var i = 0; i < length; i++) {
        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
      }
      while (position < arguments.length) args.push(arguments[position++]);
      return executeBound(func, bound, this, this, args);
    };
    return bound;
  });

  _.partial.placeholder = _;

  // Bind a number of an object's methods to that object. Remaining arguments
  // are the method names to be bound. Useful for ensuring that all callbacks
  // defined on an object belong to it.
  _.bindAll = restArguments(function(obj, keys) {
    keys = flatten(keys, false, false);
    var index = keys.length;
    if (index < 1) throw new Error('bindAll must be passed function names');
    while (index--) {
      var key = keys[index];
      obj[key] = _.bind(obj[key], obj);
    }
  });

  // Memoize an expensive function by storing its results.
  _.memoize = function(func, hasher) {
    var memoize = function(key) {
      var cache = memoize.cache;
      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
      if (!has(cache, address)) cache[address] = func.apply(this, arguments);
      return cache[address];
    };
    memoize.cache = {};
    return memoize;
  };

  // Delays a function for the given number of milliseconds, and then calls
  // it with the arguments supplied.
  _.delay = restArguments(function(func, wait, args) {
    return setTimeout(function() {
      return func.apply(null, args);
    }, wait);
  });

  // Defers a function, scheduling it to run after the current call stack has
  // cleared.
  _.defer = _.partial(_.delay, _, 1);

  // Returns a function, that, when invoked, will only be triggered at most once
  // during a given window of time. Normally, the throttled function will run
  // as much as it can, without ever going more than once per `wait` duration;
  // but if you'd like to disable the execution on the leading edge, pass
  // `{leading: false}`. To disable execution on the trailing edge, ditto.
  _.throttle = function(func, wait, options) {
    var timeout, context, args, result;
    var previous = 0;
    if (!options) options = {};

    var later = function() {
      previous = options.leading === false ? 0 : _.now();
      timeout = null;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    };

    var throttled = function() {
      var now = _.now();
      if (!previous && options.leading === false) previous = now;
      var remaining = wait - (now - previous);
      context = this;
      args = arguments;
      if (remaining <= 0 || remaining > wait) {
        if (timeout) {
          clearTimeout(timeout);
          timeout = null;
        }
        previous = now;
        result = func.apply(context, args);
        if (!timeout) context = args = null;
      } else if (!timeout && options.trailing !== false) {
        timeout = setTimeout(later, remaining);
      }
      return result;
    };

    throttled.cancel = function() {
      clearTimeout(timeout);
      previous = 0;
      timeout = context = args = null;
    };

    return throttled;
  };

  // Returns a function, that, as long as it continues to be invoked, will not
  // be triggered. The function will be called after it stops being called for
  // N milliseconds. If `immediate` is passed, trigger the function on the
  // leading edge, instead of the trailing.
  _.debounce = function(func, wait, immediate) {
    var timeout, result;

    var later = function(context, args) {
      timeout = null;
      if (args) result = func.apply(context, args);
    };

    var debounced = restArguments(function(args) {
      if (timeout) clearTimeout(timeout);
      if (immediate) {
        var callNow = !timeout;
        timeout = setTimeout(later, wait);
        if (callNow) result = func.apply(this, args);
      } else {
        timeout = _.delay(later, wait, this, args);
      }

      return result;
    });

    debounced.cancel = function() {
      clearTimeout(timeout);
      timeout = null;
    };

    return debounced;
  };

  // Returns the first function passed as an argument to the second,
  // allowing you to adjust arguments, run code before and after, and
  // conditionally execute the original function.
  _.wrap = function(func, wrapper) {
    return _.partial(wrapper, func);
  };

  // Returns a negated version of the passed-in predicate.
  _.negate = function(predicate) {
    return function() {
      return !predicate.apply(this, arguments);
    };
  };

  // Returns a function that is the composition of a list of functions, each
  // consuming the return value of the function that follows.
  _.compose = function() {
    var args = arguments;
    var start = args.length - 1;
    return function() {
      var i = start;
      var result = args[start].apply(this, arguments);
      while (i--) result = args[i].call(this, result);
      return result;
    };
  };

  // Returns a function that will only be executed on and after the Nth call.
  _.after = function(times, func) {
    return function() {
      if (--times < 1) {
        return func.apply(this, arguments);
      }
    };
  };

  // Returns a function that will only be executed up to (but not including) the Nth call.
  _.before = function(times, func) {
    var memo;
    return function() {
      if (--times > 0) {
        memo = func.apply(this, arguments);
      }
      if (times <= 1) func = null;
      return memo;
    };
  };

  // Returns a function that will be executed at most one time, no matter how
  // often you call it. Useful for lazy initialization.
  _.once = _.partial(_.before, 2);

  _.restArguments = restArguments;

  // Object Functions
  // ----------------

  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

  var collectNonEnumProps = function(obj, keys) {
    var nonEnumIdx = nonEnumerableProps.length;
    var constructor = obj.constructor;
    var proto = _.isFunction(constructor) && constructor.prototype || ObjProto;

    // Constructor is a special case.
    var prop = 'constructor';
    if (has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);

    while (nonEnumIdx--) {
      prop = nonEnumerableProps[nonEnumIdx];
      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
        keys.push(prop);
      }
    }
  };

  // Retrieve the names of an object's own properties.
  // Delegates to **ECMAScript 5**'s native `Object.keys`.
  _.keys = function(obj) {
    if (!_.isObject(obj)) return [];
    if (nativeKeys) return nativeKeys(obj);
    var keys = [];
    for (var key in obj) if (has(obj, key)) keys.push(key);
    // Ahem, IE < 9.
    if (hasEnumBug) collectNonEnumProps(obj, keys);
    return keys;
  };

  // Retrieve all the property names of an object.
  _.allKeys = function(obj) {
    if (!_.isObject(obj)) return [];
    var keys = [];
    for (var key in obj) keys.push(key);
    // Ahem, IE < 9.
    if (hasEnumBug) collectNonEnumProps(obj, keys);
    return keys;
  };

  // Retrieve the values of an object's properties.
  _.values = function(obj) {
    var keys = _.keys(obj);
    var length = keys.length;
    var values = Array(length);
    for (var i = 0; i < length; i++) {
      values[i] = obj[keys[i]];
    }
    return values;
  };

  // Returns the results of applying the iteratee to each element of the object.
  // In contrast to _.map it returns an object.
  _.mapObject = function(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    var keys = _.keys(obj),
        length = keys.length,
        results = {};
    for (var index = 0; index < length; index++) {
      var currentKey = keys[index];
      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  };

  // Convert an object into a list of `[key, value]` pairs.
  // The opposite of _.object.
  _.pairs = function(obj) {
    var keys = _.keys(obj);
    var length = keys.length;
    var pairs = Array(length);
    for (var i = 0; i < length; i++) {
      pairs[i] = [keys[i], obj[keys[i]]];
    }
    return pairs;
  };

  // Invert the keys and values of an object. The values must be serializable.
  _.invert = function(obj) {
    var result = {};
    var keys = _.keys(obj);
    for (var i = 0, length = keys.length; i < length; i++) {
      result[obj[keys[i]]] = keys[i];
    }
    return result;
  };

  // Return a sorted list of the function names available on the object.
  // Aliased as `methods`.
  _.functions = _.methods = function(obj) {
    var names = [];
    for (var key in obj) {
      if (_.isFunction(obj[key])) names.push(key);
    }
    return names.sort();
  };

  // An internal function for creating assigner functions.
  var createAssigner = function(keysFunc, defaults) {
    return function(obj) {
      var length = arguments.length;
      if (defaults) obj = Object(obj);
      if (length < 2 || obj == null) return obj;
      for (var index = 1; index < length; index++) {
        var source = arguments[index],
            keys = keysFunc(source),
            l = keys.length;
        for (var i = 0; i < l; i++) {
          var key = keys[i];
          if (!defaults || obj[key] === void 0) obj[key] = source[key];
        }
      }
      return obj;
    };
  };

  // Extend a given object with all the properties in passed-in object(s).
  _.extend = createAssigner(_.allKeys);

  // Assigns a given object with all the own properties in the passed-in object(s).
  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
  _.extendOwn = _.assign = createAssigner(_.keys);

  // Returns the first key on an object that passes a predicate test.
  _.findKey = function(obj, predicate, context) {
    predicate = cb(predicate, context);
    var keys = _.keys(obj), key;
    for (var i = 0, length = keys.length; i < length; i++) {
      key = keys[i];
      if (predicate(obj[key], key, obj)) return key;
    }
  };

  // Internal pick helper function to determine if `obj` has key `key`.
  var keyInObj = function(value, key, obj) {
    return key in obj;
  };

  // Return a copy of the object only containing the whitelisted properties.
  _.pick = restArguments(function(obj, keys) {
    var result = {}, iteratee = keys[0];
    if (obj == null) return result;
    if (_.isFunction(iteratee)) {
      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
      keys = _.allKeys(obj);
    } else {
      iteratee = keyInObj;
      keys = flatten(keys, false, false);
      obj = Object(obj);
    }
    for (var i = 0, length = keys.length; i < length; i++) {
      var key = keys[i];
      var value = obj[key];
      if (iteratee(value, key, obj)) result[key] = value;
    }
    return result;
  });

  // Return a copy of the object without the blacklisted properties.
  _.omit = restArguments(function(obj, keys) {
    var iteratee = keys[0], context;
    if (_.isFunction(iteratee)) {
      iteratee = _.negate(iteratee);
      if (keys.length > 1) context = keys[1];
    } else {
      keys = _.map(flatten(keys, false, false), String);
      iteratee = function(value, key) {
        return !_.contains(keys, key);
      };
    }
    return _.pick(obj, iteratee, context);
  });

  // Fill in a given object with default properties.
  _.defaults = createAssigner(_.allKeys, true);

  // Creates an object that inherits from the given prototype object.
  // If additional properties are provided then they will be added to the
  // created object.
  _.create = function(prototype, props) {
    var result = baseCreate(prototype);
    if (props) _.extendOwn(result, props);
    return result;
  };

  // Create a (shallow-cloned) duplicate of an object.
  _.clone = function(obj) {
    if (!_.isObject(obj)) return obj;
    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
  };

  // Invokes interceptor with the obj, and then returns obj.
  // The primary purpose of this method is to "tap into" a method chain, in
  // order to perform operations on intermediate results within the chain.
  _.tap = function(obj, interceptor) {
    interceptor(obj);
    return obj;
  };

  // Returns whether an object has a given set of `key:value` pairs.
  _.isMatch = function(object, attrs) {
    var keys = _.keys(attrs), length = keys.length;
    if (object == null) return !length;
    var obj = Object(object);
    for (var i = 0; i < length; i++) {
      var key = keys[i];
      if (attrs[key] !== obj[key] || !(key in obj)) return false;
    }
    return true;
  };


  // Internal recursive comparison function for `isEqual`.
  var eq, deepEq;
  eq = function(a, b, aStack, bStack) {
    // Identical objects are equal. `0 === -0`, but they aren't identical.
    // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
    if (a === b) return a !== 0 || 1 / a === 1 / b;
    // `null` or `undefined` only equal to itself (strict comparison).
    if (a == null || b == null) return false;
    // `NaN`s are equivalent, but non-reflexive.
    if (a !== a) return b !== b;
    // Exhaust primitive checks
    var type = typeof a;
    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
    return deepEq(a, b, aStack, bStack);
  };

  // Internal recursive comparison function for `isEqual`.
  deepEq = function(a, b, aStack, bStack) {
    // Unwrap any wrapped objects.
    if (a instanceof _) a = a._wrapped;
    if (b instanceof _) b = b._wrapped;
    // Compare `[[Class]]` names.
    var className = toString.call(a);
    if (className !== toString.call(b)) return false;
    switch (className) {
      // Strings, numbers, regular expressions, dates, and booleans are compared by value.
      case '[object RegExp]':
      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
      case '[object String]':
        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
        // equivalent to `new String("5")`.
        return '' + a === '' + b;
      case '[object Number]':
        // `NaN`s are equivalent, but non-reflexive.
        // Object(NaN) is equivalent to NaN.
        if (+a !== +a) return +b !== +b;
        // An `egal` comparison is performed for other numeric values.
        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
      case '[object Date]':
      case '[object Boolean]':
        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
        // millisecond representations. Note that invalid dates with millisecond representations
        // of `NaN` are not equivalent.
        return +a === +b;
      case '[object Symbol]':
        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
    }

    var areArrays = className === '[object Array]';
    if (!areArrays) {
      if (typeof a != 'object' || typeof b != 'object') return false;

      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
      // from different frames are.
      var aCtor = a.constructor, bCtor = b.constructor;
      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
                               _.isFunction(bCtor) && bCtor instanceof bCtor)
                          && ('constructor' in a && 'constructor' in b)) {
        return false;
      }
    }
    // Assume equality for cyclic structures. The algorithm for detecting cyclic
    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.

    // Initializing stack of traversed objects.
    // It's done here since we only need them for objects and arrays comparison.
    aStack = aStack || [];
    bStack = bStack || [];
    var length = aStack.length;
    while (length--) {
      // Linear search. Performance is inversely proportional to the number of
      // unique nested structures.
      if (aStack[length] === a) return bStack[length] === b;
    }

    // Add the first object to the stack of traversed objects.
    aStack.push(a);
    bStack.push(b);

    // Recursively compare objects and arrays.
    if (areArrays) {
      // Compare array lengths to determine if a deep comparison is necessary.
      length = a.length;
      if (length !== b.length) return false;
      // Deep compare the contents, ignoring non-numeric properties.
      while (length--) {
        if (!eq(a[length], b[length], aStack, bStack)) return false;
      }
    } else {
      // Deep compare objects.
      var keys = _.keys(a), key;
      length = keys.length;
      // Ensure that both objects contain the same number of properties before comparing deep equality.
      if (_.keys(b).length !== length) return false;
      while (length--) {
        // Deep compare each member
        key = keys[length];
        if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
      }
    }
    // Remove the first object from the stack of traversed objects.
    aStack.pop();
    bStack.pop();
    return true;
  };

  // Perform a deep comparison to check if two objects are equal.
  _.isEqual = function(a, b) {
    return eq(a, b);
  };

  // Is a given array, string, or object empty?
  // An "empty" object has no enumerable own-properties.
  _.isEmpty = function(obj) {
    if (obj == null) return true;
    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
    return _.keys(obj).length === 0;
  };

  // Is a given value a DOM element?
  _.isElement = function(obj) {
    return !!(obj && obj.nodeType === 1);
  };

  // Is a given value an array?
  // Delegates to ECMA5's native Array.isArray
  _.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) === '[object Array]';
  };

  // Is a given variable an object?
  _.isObject = function(obj) {
    var type = typeof obj;
    return type === 'function' || type === 'object' && !!obj;
  };

  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet.
  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'], function(name) {
    _['is' + name] = function(obj) {
      return toString.call(obj) === '[object ' + name + ']';
    };
  });

  // Define a fallback version of the method in browsers (ahem, IE < 9), where
  // there isn't any inspectable "Arguments" type.
  if (!_.isArguments(arguments)) {
    _.isArguments = function(obj) {
      return has(obj, 'callee');
    };
  }

  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
  // IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
  var nodelist = root.document && root.document.childNodes;
  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
    _.isFunction = function(obj) {
      return typeof obj == 'function' || false;
    };
  }

  // Is a given object a finite number?
  _.isFinite = function(obj) {
    return !_.isSymbol(obj) && isFinite(obj) && !isNaN(parseFloat(obj));
  };

  // Is the given value `NaN`?
  _.isNaN = function(obj) {
    return _.isNumber(obj) && isNaN(obj);
  };

  // Is a given value a boolean?
  _.isBoolean = function(obj) {
    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
  };

  // Is a given value equal to null?
  _.isNull = function(obj) {
    return obj === null;
  };

  // Is a given variable undefined?
  _.isUndefined = function(obj) {
    return obj === void 0;
  };

  // Shortcut function for checking if an object has a given property directly
  // on itself (in other words, not on a prototype).
  _.has = function(obj, path) {
    if (!_.isArray(path)) {
      return has(obj, path);
    }
    var length = path.length;
    for (var i = 0; i < length; i++) {
      var key = path[i];
      if (obj == null || !hasOwnProperty.call(obj, key)) {
        return false;
      }
      obj = obj[key];
    }
    return !!length;
  };

  // Utility Functions
  // -----------------

  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
  // previous owner. Returns a reference to the Underscore object.
  _.noConflict = function() {
    root._ = previousUnderscore;
    return this;
  };

  // Keep the identity function around for default iteratees.
  _.identity = function(value) {
    return value;
  };

  // Predicate-generating functions. Often useful outside of Underscore.
  _.constant = function(value) {
    return function() {
      return value;
    };
  };

  _.noop = function(){};

  // Creates a function that, when passed an object, will traverse that objectâ€™s
  // properties down the given `path`, specified as an array of keys or indexes.
  _.property = function(path) {
    if (!_.isArray(path)) {
      return shallowProperty(path);
    }
    return function(obj) {
      return deepGet(obj, path);
    };
  };

  // Generates a function for a given object that returns a given property.
  _.propertyOf = function(obj) {
    if (obj == null) {
      return function(){};
    }
    return function(path) {
      return !_.isArray(path) ? obj[path] : deepGet(obj, path);
    };
  };

  // Returns a predicate for checking whether an object has a given set of
  // `key:value` pairs.
  _.matcher = _.matches = function(attrs) {
    attrs = _.extendOwn({}, attrs);
    return function(obj) {
      return _.isMatch(obj, attrs);
    };
  };

  // Run a function **n** times.
  _.times = function(n, iteratee, context) {
    var accum = Array(Math.max(0, n));
    iteratee = optimizeCb(iteratee, context, 1);
    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
    return accum;
  };

  // Return a random integer between min and max (inclusive).
  _.random = function(min, max) {
    if (max == null) {
      max = min;
      min = 0;
    }
    return min + Math.floor(Math.random() * (max - min + 1));
  };

  // A (possibly faster) way to get the current timestamp as an integer.
  _.now = Date.now || function() {
    return new Date().getTime();
  };

  // List of HTML entities for escaping.
  var escapeMap = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#x27;',
    '`': '&#x60;'
  };
  var unescapeMap = _.invert(escapeMap);

  // Functions for escaping and unescaping strings to/from HTML interpolation.
  var createEscaper = function(map) {
    var escaper = function(match) {
      return map[match];
    };
    // Regexes for identifying a key that needs to be escaped.
    var source = '(?:' + _.keys(map).join('|') + ')';
    var testRegexp = RegExp(source);
    var replaceRegexp = RegExp(source, 'g');
    return function(string) {
      string = string == null ? '' : '' + string;
      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
    };
  };
  _.escape = createEscaper(escapeMap);
  _.unescape = createEscaper(unescapeMap);

  // Traverses the children of `obj` along `path`. If a child is a function, it
  // is invoked with its parent as context. Returns the value of the final
  // child, or `fallback` if any child is undefined.
  _.result = function(obj, path, fallback) {
    if (!_.isArray(path)) path = [path];
    var length = path.length;
    if (!length) {
      return _.isFunction(fallback) ? fallback.call(obj) : fallback;
    }
    for (var i = 0; i < length; i++) {
      var prop = obj == null ? void 0 : obj[path[i]];
      if (prop === void 0) {
        prop = fallback;
        i = length; // Ensure we don't continue iterating.
      }
      obj = _.isFunction(prop) ? prop.call(obj) : prop;
    }
    return obj;
  };

  // Generate a unique integer id (unique within the entire client session).
  // Useful for temporary DOM ids.
  var idCounter = 0;
  _.uniqueId = function(prefix) {
    var id = ++idCounter + '';
    return prefix ? prefix + id : id;
  };

  // By default, Underscore uses ERB-style template delimiters, change the
  // following template settings to use alternative delimiters.
  _.templateSettings = {
    evaluate: /<%([\s\S]+?)%>/g,
    interpolate: /<%=([\s\S]+?)%>/g,
    escape: /<%-([\s\S]+?)%>/g
  };

  // When customizing `templateSettings`, if you don't want to define an
  // interpolation, evaluation or escaping regex, we need one that is
  // guaranteed not to match.
  var noMatch = /(.)^/;

  // Certain characters need to be escaped so that they can be put into a
  // string literal.
  var escapes = {
    "'": "'",
    '\\': '\\',
    '\r': 'r',
    '\n': 'n',
    '\u2028': 'u2028',
    '\u2029': 'u2029'
  };

  var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;

  var escapeChar = function(match) {
    return '\\' + escapes[match];
  };

  // JavaScript micro-templating, similar to John Resig's implementation.
  // Underscore templating handles arbitrary delimiters, preserves whitespace,
  // and correctly escapes quotes within interpolated code.
  // NB: `oldSettings` only exists for backwards compatibility.
  _.template = function(text, settings, oldSettings) {
    if (!settings && oldSettings) settings = oldSettings;
    settings = _.defaults({}, settings, _.templateSettings);

    // Combine delimiters into one regular expression via alternation.
    var matcher = RegExp([
      (settings.escape || noMatch).source,
      (settings.interpolate || noMatch).source,
      (settings.evaluate || noMatch).source
    ].join('|') + '|$', 'g');

    // Compile the template source, escaping string literals appropriately.
    var index = 0;
    var source = "__p+='";
    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
      index = offset + match.length;

      if (escape) {
        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
      } else if (interpolate) {
        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
      } else if (evaluate) {
        source += "';\n" + evaluate + "\n__p+='";
      }

      // Adobe VMs need the match returned to produce the correct offset.
      return match;
    });
    source += "';\n";

    // If a variable is not specified, place data values in local scope.
    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';

    source = "var __t,__p='',__j=Array.prototype.join," +
      "print=function(){__p+=__j.call(arguments,'');};\n" +
      source + 'return __p;\n';

    var render;
    try {
      render = new Function(settings.variable || 'obj', '_', source);
    } catch (e) {
      e.source = source;
      throw e;
    }

    var template = function(data) {
      return render.call(this, data, _);
    };

    // Provide the compiled source as a convenience for precompilation.
    var argument = settings.variable || 'obj';
    template.source = 'function(' + argument + '){\n' + source + '}';

    return template;
  };

  // Add a "chain" function. Start chaining a wrapped Underscore object.
  _.chain = function(obj) {
    var instance = _(obj);
    instance._chain = true;
    return instance;
  };

  // OOP
  // ---------------
  // If Underscore is called as a function, it returns a wrapped object that
  // can be used OO-style. This wrapper holds altered versions of all the
  // underscore functions. Wrapped objects may be chained.

  // Helper function to continue chaining intermediate results.
  var chainResult = function(instance, obj) {
    return instance._chain ? _(obj).chain() : obj;
  };

  // Add your own custom functions to the Underscore object.
  _.mixin = function(obj) {
    _.each(_.functions(obj), function(name) {
      var func = _[name] = obj[name];
      _.prototype[name] = function() {
        var args = [this._wrapped];
        push.apply(args, arguments);
        return chainResult(this, func.apply(_, args));
      };
    });
    return _;
  };

  // Add all of the Underscore functions to the wrapper object.
  _.mixin(_);

  // Add all mutator Array functions to the wrapper.
  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
    var method = ArrayProto[name];
    _.prototype[name] = function() {
      var obj = this._wrapped;
      method.apply(obj, arguments);
      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
      return chainResult(this, obj);
    };
  });

  // Add all accessor Array functions to the wrapper.
  _.each(['concat', 'join', 'slice'], function(name) {
    var method = ArrayProto[name];
    _.prototype[name] = function() {
      return chainResult(this, method.apply(this._wrapped, arguments));
    };
  });

  // Extracts the result from a wrapped and chained object.
  _.prototype.value = function() {
    return this._wrapped;
  };

  // Provide unwrapping proxy for some methods used in engine operations
  // such as arithmetic and JSON stringification.
  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;

  _.prototype.toString = function() {
    return String(this._wrapped);
  };

  // AMD registration happens at the end for compatibility with AMD loaders
  // that may not enforce next-turn semantics on modules. Even though general
  // practice for AMD registration is to be anonymous, underscore registers
  // as a named module because, like jQuery, it is a base library that is
  // popular enough to be bundled in a third party lib, but not be part of
  // an AMD load request. Those cases could generate an error when an
  // anonymous define() is called outside of a loader request.
  if (typeof define == 'function' && define.amd) {
    define('underscore', [], function() {
      return _;
    });
  }
}());
(The MIT License)

Copyright (c) 2017, Ryan Zimmerman <opensrc@ryanzim.com>

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the 'Software'), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict'

exports.fromCallback = function (fn) {
  return Object.defineProperty(function () {
    if (typeof arguments[arguments.length - 1] === 'function') fn.apply(this, arguments)
    else {
      return new Promise((resolve, reject) => {
        arguments[arguments.length] = (err, res) => {
          if (err) return reject(err)
          resolve(res)
        }
        arguments.length++
        fn.apply(this, arguments)
      })
    }
  }, 'name', { value: fn.name })
}

exports.fromPromise = function (fn) {
  return Object.defineProperty(function () {
    const cb = arguments[arguments.length - 1]
    if (typeof cb !== 'function') return fn.apply(this, arguments)
    else fn.apply(this, arguments).then(r => cb(null, r), cb)
  }, 'name', { value: fn.name })
}
{
  "author": {
    "name": "Ryan Zimmerman",
    "email": "opensrc@ryanzim.com"
  },
  "deprecated": false,
  "description": "Make a callback- or promise-based function support both promises and callbacks.",
  "devDependencies": {
    "colortape": "^0.1.2",
    "coveralls": "^3.0.1",
    "nyc": "^10.2.0",
    "standard": "^10.0.1",
    "tape": "^4.6.3"
  },
  "engines": {
    "node": ">= 4.0.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/RyanZim/universalify#readme",
  "license": "MIT",
  "name": "universalify",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/RyanZim/universalify.git"
  },
  "version": "0.1.2"
}Copyright 2011 Gary Court. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1.	Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2.	Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY GARY COURT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Gary Court.
{
  "author": {
    "name": "Gary Court",
    "email": "gary.court@gmail.com"
  },
  "dependencies": {
    "punycode": "^2.1.0"
  },
  "deprecated": false,
  "description": "An RFC 3986/3987 compliant, scheme extendable URI/IRI parsing/validating/resolving library for JavaScript.",
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-plugin-external-helpers": "^6.22.0",
    "babel-preset-latest": "^6.24.1",
    "mocha": "^3.2.0",
    "mocha-qunit-ui": "^0.1.3",
    "rollup": "^0.41.6",
    "rollup-plugin-babel": "^2.7.1",
    "rollup-plugin-node-resolve": "^2.0.0",
    "sorcery": "^0.10.0",
    "typescript": "^2.8.1",
    "uglify-js": "^2.8.14"
  },
  "directories": {
    "test": "tests"
  },
  "files": [
    "dist",
    "package.json",
    "yarn.lock",
    "README.md",
    "CHANGELOG",
    "LICENSE"
  ],
  "homepage": "https://github.com/garycourt/uri-js",
  "license": "BSD-2-Clause",
  "main": "dist/es5/uri.all.js",
  "name": "uri-js",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/garycourt/uri-js.git"
  },
  "types": "dist/es5/uri.all.d.ts",
  "version": "4.4.0"
}import { SCHEMES } from "./uri";
import http from "./schemes/http";
SCHEMES[http.scheme] = http;
import https from "./schemes/https";
SCHEMES[https.scheme] = https;
import ws from "./schemes/ws";
SCHEMES[ws.scheme] = ws;
import wss from "./schemes/wss";
SCHEMES[wss.scheme] = wss;
import mailto from "./schemes/mailto";
SCHEMES[mailto.scheme] = mailto;
import urn from "./schemes/urn";
SCHEMES[urn.scheme] = urn;
import uuid from "./schemes/urn-uuid";
SCHEMES[uuid.scheme] = uuid;
export * from "./uri";
//# sourceMappingURL=index.js.map{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,IAAI,MAAM,gBAAgB,CAAC;AAClC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAE5B,OAAO,KAAK,MAAM,iBAAiB,CAAC;AACpC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;AAE9B,OAAO,EAAE,MAAM,cAAc,CAAC;AAC9B,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;AAExB,OAAO,GAAG,MAAM,eAAe,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;AAE1B,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAEhC,OAAO,GAAG,MAAM,eAAe,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;AAE1B,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAE5B,cAAc,OAAO,CAAC"}import { buildExps } from "./regexps-uri";
export default buildExps(true);
//# sourceMappingURL=regexps-iri.js.map{"version":3,"file":"regexps-iri.js","sourceRoot":"","sources":["../../src/regexps-iri.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,eAAe,SAAS,CAAC,IAAI,CAAC,CAAC"}import { merge, subexp } from "./util";
export function buildExps(isIRI) {
    const ALPHA$$ = "[A-Za-z]", CR$ = "[\\x0D]", DIGIT$$ = "[0-9]", DQUOTE$$ = "[\\x22]", HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"), //case-insensitive
    LF$$ = "[\\x0A]", SP$$ = "[\\x20]", PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)), //expanded
    GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", //subset, excludes bidi control characters
    IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]", //subset
    UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"), DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$), //relaxed parsing rules
    IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$), H16$ = subexp(HEXDIG$$ + "{1,4}"), LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$), //                           6( h16 ":" ) ls32
    IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$), //                      "::" 5( h16 ":" ) ls32
    IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$), //[               h16 ] "::" 4( h16 ":" ) ls32
    IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$), //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
    IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$), //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
    IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$), //[ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
    IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$), //[ *4( h16 ":" ) h16 ] "::"              ls32
    IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$), //[ *5( h16 ":" ) h16 ] "::"              h16
    IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"), //[ *6( h16 ":" ) h16 ] "::"
    IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")), ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"), //RFC 6874
    IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$), //RFC 6874
    IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$), //RFC 6874, with relaxed parsing rules
    IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), //RFC 6874
    REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"), HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$), PORT$ = subexp(DIGIT$$ + "*"), AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")), SEGMENT$ = subexp(PCHAR$ + "*"), SEGMENT_NZ$ = subexp(PCHAR$ + "+"), SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"), PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), //simplified
    PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), //simplified
    PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), //simplified
    PATH_EMPTY$ = "(?!" + PCHAR$ + ")", PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$";
    return {
        NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"),
        NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"),
        NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"),
        ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        UNRESERVED: new RegExp(UNRESERVED$$, "g"),
        OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"),
        PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"),
        IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"),
        IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules
    };
}
export default buildExps(false);
//# sourceMappingURL=regexps-uri.js.map{"version":3,"file":"regexps-uri.js","sourceRoot":"","sources":["../../src/regexps-uri.ts"],"names":[],"mappings":"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"}/**
 * URI.js
 *
 * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.
 * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
 * @see http://github.com/garycourt/uri-js
 */
/**
 * Copyright 2011 Gary Court. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 *    1. Redistributions of source code must retain the above copyright notice, this list of
 *       conditions and the following disclaimer.
 *
 *    2. Redistributions in binary form must reproduce the above copyright notice, this list
 *       of conditions and the following disclaimer in the documentation and/or other materials
 *       provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation are those of the
 * authors and should not be interpreted as representing official policies, either expressed
 * or implied, of Gary Court.
 */
import URI_PROTOCOL from "./regexps-uri";
import IRI_PROTOCOL from "./regexps-iri";
import punycode from "punycode";
import { toUpperCase, typeOf, assign } from "./util";
export const SCHEMES = {};
export function pctEncChar(chr) {
    const c = chr.charCodeAt(0);
    let e;
    if (c < 16)
        e = "%0" + c.toString(16).toUpperCase();
    else if (c < 128)
        e = "%" + c.toString(16).toUpperCase();
    else if (c < 2048)
        e = "%" + ((c >> 6) | 192).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase();
    else
        e = "%" + ((c >> 12) | 224).toString(16).toUpperCase() + "%" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase();
    return e;
}
export function pctDecChars(str) {
    let newStr = "";
    let i = 0;
    const il = str.length;
    while (i < il) {
        const c = parseInt(str.substr(i + 1, 2), 16);
        if (c < 128) {
            newStr += String.fromCharCode(c);
            i += 3;
        }
        else if (c >= 194 && c < 224) {
            if ((il - i) >= 6) {
                const c2 = parseInt(str.substr(i + 4, 2), 16);
                newStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
            }
            else {
                newStr += str.substr(i, 6);
            }
            i += 6;
        }
        else if (c >= 224) {
            if ((il - i) >= 9) {
                const c2 = parseInt(str.substr(i + 4, 2), 16);
                const c3 = parseInt(str.substr(i + 7, 2), 16);
                newStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            }
            else {
                newStr += str.substr(i, 9);
            }
            i += 9;
        }
        else {
            newStr += str.substr(i, 3);
            i += 3;
        }
    }
    return newStr;
}
function _normalizeComponentEncoding(components, protocol) {
    function decodeUnreserved(str) {
        const decStr = pctDecChars(str);
        return (!decStr.match(protocol.UNRESERVED) ? str : decStr);
    }
    if (components.scheme)
        components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, "");
    if (components.userinfo !== undefined)
        components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.host !== undefined)
        components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.path !== undefined)
        components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.query !== undefined)
        components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.fragment !== undefined)
        components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    return components;
}
;
function _stripLeadingZeros(str) {
    return str.replace(/^0*(.*)/, "$1") || "0";
}
function _normalizeIPv4(host, protocol) {
    const matches = host.match(protocol.IPV4ADDRESS) || [];
    const [, address] = matches;
    if (address) {
        return address.split(".").map(_stripLeadingZeros).join(".");
    }
    else {
        return host;
    }
}
function _normalizeIPv6(host, protocol) {
    const matches = host.match(protocol.IPV6ADDRESS) || [];
    const [, address, zone] = matches;
    if (address) {
        const [last, first] = address.toLowerCase().split('::').reverse();
        const firstFields = first ? first.split(":").map(_stripLeadingZeros) : [];
        const lastFields = last.split(":").map(_stripLeadingZeros);
        const isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);
        const fieldCount = isLastFieldIPv4Address ? 7 : 8;
        const lastFieldsStart = lastFields.length - fieldCount;
        const fields = Array(fieldCount);
        for (let x = 0; x < fieldCount; ++x) {
            fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';
        }
        if (isLastFieldIPv4Address) {
            fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);
        }
        const allZeroFields = fields.reduce((acc, field, index) => {
            if (!field || field === "0") {
                const lastLongest = acc[acc.length - 1];
                if (lastLongest && lastLongest.index + lastLongest.length === index) {
                    lastLongest.length++;
                }
                else {
                    acc.push({ index, length: 1 });
                }
            }
            return acc;
        }, []);
        const longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0];
        let newHost;
        if (longestZeroFields && longestZeroFields.length > 1) {
            const newFirst = fields.slice(0, longestZeroFields.index);
            const newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);
            newHost = newFirst.join(":") + "::" + newLast.join(":");
        }
        else {
            newHost = fields.join(":");
        }
        if (zone) {
            newHost += "%" + zone;
        }
        return newHost;
    }
    else {
        return host;
    }
}
const URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i;
const NO_MATCH_IS_UNDEFINED = ("").match(/(){0}/)[1] === undefined;
export function parse(uriString, options = {}) {
    const components = {};
    const protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);
    if (options.reference === "suffix")
        uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString;
    const matches = uriString.match(URI_PARSE);
    if (matches) {
        if (NO_MATCH_IS_UNDEFINED) {
            //store each component
            components.scheme = matches[1];
            components.userinfo = matches[3];
            components.host = matches[4];
            components.port = parseInt(matches[5], 10);
            components.path = matches[6] || "";
            components.query = matches[7];
            components.fragment = matches[8];
            //fix port number
            if (isNaN(components.port)) {
                components.port = matches[5];
            }
        }
        else { //IE FIX for improper RegExp matching
            //store each component
            components.scheme = matches[1] || undefined;
            components.userinfo = (uriString.indexOf("@") !== -1 ? matches[3] : undefined);
            components.host = (uriString.indexOf("//") !== -1 ? matches[4] : undefined);
            components.port = parseInt(matches[5], 10);
            components.path = matches[6] || "";
            components.query = (uriString.indexOf("?") !== -1 ? matches[7] : undefined);
            components.fragment = (uriString.indexOf("#") !== -1 ? matches[8] : undefined);
            //fix port number
            if (isNaN(components.port)) {
                components.port = (uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined);
            }
        }
        if (components.host) {
            //normalize IP hosts
            components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);
        }
        //determine reference type
        if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {
            components.reference = "same-document";
        }
        else if (components.scheme === undefined) {
            components.reference = "relative";
        }
        else if (components.fragment === undefined) {
            components.reference = "absolute";
        }
        else {
            components.reference = "uri";
        }
        //check for reference errors
        if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) {
            components.error = components.error || "URI is not a " + options.reference + " reference.";
        }
        //find scheme handler
        const schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
        //check if scheme can't handle IRIs
        if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
            //if host component is a domain name
            if (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {
                //convert Unicode IDN -> ASCII IDN
                try {
                    components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());
                }
                catch (e) {
                    components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e;
                }
            }
            //convert IRI -> URI
            _normalizeComponentEncoding(components, URI_PROTOCOL);
        }
        else {
            //normalize encodings
            _normalizeComponentEncoding(components, protocol);
        }
        //perform scheme specific parsing
        if (schemeHandler && schemeHandler.parse) {
            schemeHandler.parse(components, options);
        }
    }
    else {
        components.error = components.error || "URI can not be parsed.";
    }
    return components;
}
;
function _recomposeAuthority(components, options) {
    const protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);
    const uriTokens = [];
    if (components.userinfo !== undefined) {
        uriTokens.push(components.userinfo);
        uriTokens.push("@");
    }
    if (components.host !== undefined) {
        //normalize IP hosts, add brackets and escape zone separator for IPv6
        uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => "[" + $1 + ($2 ? "%25" + $2 : "") + "]"));
    }
    if (typeof components.port === "number" || typeof components.port === "string") {
        uriTokens.push(":");
        uriTokens.push(String(components.port));
    }
    return uriTokens.length ? uriTokens.join("") : undefined;
}
;
const RDS1 = /^\.\.?\//;
const RDS2 = /^\/\.(\/|$)/;
const RDS3 = /^\/\.\.(\/|$)/;
const RDS4 = /^\.\.?$/;
const RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/;
export function removeDotSegments(input) {
    const output = [];
    while (input.length) {
        if (input.match(RDS1)) {
            input = input.replace(RDS1, "");
        }
        else if (input.match(RDS2)) {
            input = input.replace(RDS2, "/");
        }
        else if (input.match(RDS3)) {
            input = input.replace(RDS3, "/");
            output.pop();
        }
        else if (input === "." || input === "..") {
            input = "";
        }
        else {
            const im = input.match(RDS5);
            if (im) {
                const s = im[0];
                input = input.slice(s.length);
                output.push(s);
            }
            else {
                throw new Error("Unexpected dot segment condition");
            }
        }
    }
    return output.join("");
}
;
export function serialize(components, options = {}) {
    const protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL);
    const uriTokens = [];
    //find scheme handler
    const schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
    //perform scheme specific serialization
    if (schemeHandler && schemeHandler.serialize)
        schemeHandler.serialize(components, options);
    if (components.host) {
        //if host component is an IPv6 address
        if (protocol.IPV6ADDRESS.test(components.host)) {
            //TODO: normalize IPv6 address as per RFC 5952
        }
        //if host component is a domain name
        else if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) {
            //convert IDN via punycode
            try {
                components.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host));
            }
            catch (e) {
                components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
            }
        }
    }
    //normalize encoding
    _normalizeComponentEncoding(components, protocol);
    if (options.reference !== "suffix" && components.scheme) {
        uriTokens.push(components.scheme);
        uriTokens.push(":");
    }
    const authority = _recomposeAuthority(components, options);
    if (authority !== undefined) {
        if (options.reference !== "suffix") {
            uriTokens.push("//");
        }
        uriTokens.push(authority);
        if (components.path && components.path.charAt(0) !== "/") {
            uriTokens.push("/");
        }
    }
    if (components.path !== undefined) {
        let s = components.path;
        if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
            s = removeDotSegments(s);
        }
        if (authority === undefined) {
            s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//"
        }
        uriTokens.push(s);
    }
    if (components.query !== undefined) {
        uriTokens.push("?");
        uriTokens.push(components.query);
    }
    if (components.fragment !== undefined) {
        uriTokens.push("#");
        uriTokens.push(components.fragment);
    }
    return uriTokens.join(""); //merge tokens into a string
}
;
export function resolveComponents(base, relative, options = {}, skipNormalization) {
    const target = {};
    if (!skipNormalization) {
        base = parse(serialize(base, options), options); //normalize base components
        relative = parse(serialize(relative, options), options); //normalize relative components
    }
    options = options || {};
    if (!options.tolerant && relative.scheme) {
        target.scheme = relative.scheme;
        //target.authority = relative.authority;
        target.userinfo = relative.userinfo;
        target.host = relative.host;
        target.port = relative.port;
        target.path = removeDotSegments(relative.path || "");
        target.query = relative.query;
    }
    else {
        if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {
            //target.authority = relative.authority;
            target.userinfo = relative.userinfo;
            target.host = relative.host;
            target.port = relative.port;
            target.path = removeDotSegments(relative.path || "");
            target.query = relative.query;
        }
        else {
            if (!relative.path) {
                target.path = base.path;
                if (relative.query !== undefined) {
                    target.query = relative.query;
                }
                else {
                    target.query = base.query;
                }
            }
            else {
                if (relative.path.charAt(0) === "/") {
                    target.path = removeDotSegments(relative.path);
                }
                else {
                    if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {
                        target.path = "/" + relative.path;
                    }
                    else if (!base.path) {
                        target.path = relative.path;
                    }
                    else {
                        target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path;
                    }
                    target.path = removeDotSegments(target.path);
                }
                target.query = relative.query;
            }
            //target.authority = base.authority;
            target.userinfo = base.userinfo;
            target.host = base.host;
            target.port = base.port;
        }
        target.scheme = base.scheme;
    }
    target.fragment = relative.fragment;
    return target;
}
;
export function resolve(baseURI, relativeURI, options) {
    const schemelessOptions = assign({ scheme: 'null' }, options);
    return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);
}
;
export function normalize(uri, options) {
    if (typeof uri === "string") {
        uri = serialize(parse(uri, options), options);
    }
    else if (typeOf(uri) === "object") {
        uri = parse(serialize(uri, options), options);
    }
    return uri;
}
;
export function equal(uriA, uriB, options) {
    if (typeof uriA === "string") {
        uriA = serialize(parse(uriA, options), options);
    }
    else if (typeOf(uriA) === "object") {
        uriA = serialize(uriA, options);
    }
    if (typeof uriB === "string") {
        uriB = serialize(parse(uriB, options), options);
    }
    else if (typeOf(uriB) === "object") {
        uriB = serialize(uriB, options);
    }
    return uriA === uriB;
}
;
export function escapeComponent(str, options) {
    return str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar);
}
;
export function unescapeComponent(str, options) {
    return str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars);
}
;
//# sourceMappingURL=uri.js.map{"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/uri.ts"],"names":[],"mappings":"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"}export function merge(...sets) {
    if (sets.length > 1) {
        sets[0] = sets[0].slice(0, -1);
        const xl = sets.length - 1;
        for (let x = 1; x < xl; ++x) {
            sets[x] = sets[x].slice(1, -1);
        }
        sets[xl] = sets[xl].slice(1);
        return sets.join('');
    }
    else {
        return sets[0];
    }
}
export function subexp(str) {
    return "(?:" + str + ")";
}
export function typeOf(o) {
    return o === undefined ? "undefined" : (o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase());
}
export function toUpperCase(str) {
    return str.toUpperCase();
}
export function toArray(obj) {
    return obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : [];
}
export function assign(target, source) {
    const obj = target;
    if (source) {
        for (const key in source) {
            obj[key] = source[key];
        }
    }
    return obj;
}
//# sourceMappingURL=util.js.map{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,IAAkB;IAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE;YAC5B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAC/B;QACD,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACrB;SAAM;QACN,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;KACf;AACF,CAAC;AAED,MAAM,iBAAiB,GAAU;IAChC,OAAO,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;AAC1B,CAAC;AAED,MAAM,iBAAiB,CAAK;IAC3B,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACpJ,CAAC;AAED,MAAM,sBAAsB,GAAU;IACrC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,kBAAkB,GAAO;IAC9B,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvM,CAAC;AAGD,MAAM,iBAAiB,MAAc,EAAE,MAAW;IACjD,MAAM,GAAG,GAAG,MAAa,CAAC;IAC1B,IAAI,MAAM,EAAE;QACX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;YACzB,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;SACvB;KACD;IACD,OAAO,GAAG,CAAC;AACZ,CAAC"}const handler = {
    scheme: "http",
    domainHost: true,
    parse: function (components, options) {
        //report missing host
        if (!components.host) {
            components.error = components.error || "HTTP URIs must have a host.";
        }
        return components;
    },
    serialize: function (components, options) {
        const secure = String(components.scheme).toLowerCase() === "https";
        //normalize the default port
        if (components.port === (secure ? 443 : 80) || components.port === "") {
            components.port = undefined;
        }
        //normalize the empty path
        if (!components.path) {
            components.path = "/";
        }
        //NOTE: We do not parse query strings for HTTP URIs
        //as WWW Form Url Encoded query strings are part of the HTML4+ spec,
        //and not the HTTP spec.
        return components;
    }
};
export default handler;
//# sourceMappingURL=http.js.map{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/schemes/http.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,MAAM;IAEf,UAAU,EAAG,IAAI;IAEjB,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,qBAAqB;QACrB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACrB,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,6BAA6B,CAAC;SACrE;QAED,OAAO,UAAU,CAAC;IACnB,CAAC;IAED,SAAS,EAAG,UAAU,UAAwB,EAAE,OAAkB;QACjE,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;QAEnE,4BAA4B;QAC5B,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,KAAK,EAAE,EAAE;YACtE,UAAU,CAAC,IAAI,GAAG,SAAS,CAAC;SAC5B;QAED,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACrB,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;SACtB;QAED,mDAAmD;QACnD,oEAAoE;QACpE,wBAAwB;QAExB,OAAO,UAAU,CAAC;IACnB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"}import http from "./http";
const handler = {
    scheme: "https",
    domainHost: http.domainHost,
    parse: http.parse,
    serialize: http.serialize
};
export default handler;
//# sourceMappingURL=https.js.map{"version":3,"file":"https.js","sourceRoot":"","sources":["../../../src/schemes/https.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,OAAO;IAChB,UAAU,EAAG,IAAI,CAAC,UAAU;IAC5B,KAAK,EAAG,IAAI,CAAC,KAAK;IAClB,SAAS,EAAG,IAAI,CAAC,SAAS;CAC1B,CAAA;AAED,eAAe,OAAO,CAAC"}import { pctEncChar, pctDecChars, unescapeComponent } from "../uri";
import punycode from "punycode";
import { merge, subexp, toUpperCase, toArray } from "../util";
const O = {};
const isIRI = true;
//RFC 3986
const UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]";
const HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive
const PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded
//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =
//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]";  //(%d1-8 / %d11-12 / %d14-31 / %d127)
//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$);  //%d33 / %d35-91 / %d93-126 / obs-qtext
//const VCHAR$$ = "[\\x21-\\x7E]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$));  //%d0 / CR / LF / obs-qtext
//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+");
//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$);
//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"');
const ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]";
const QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]";
const VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]");
const DOT_ATOM_TEXT$ = subexp(ATEXT$$ + "+" + subexp("\\." + ATEXT$$ + "+") + "*");
const QUOTED_PAIR$ = subexp("\\\\" + VCHAR$$);
const QCONTENT$ = subexp(QTEXT$$ + "|" + QUOTED_PAIR$);
const QUOTED_STRING$ = subexp('\\"' + QCONTENT$ + "*" + '\\"');
//RFC 6068
const DTEXT_NO_OBS$$ = "[\\x21-\\x5A\\x5E-\\x7E]"; //%d33-90 / %d94-126
const SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]";
const QCHAR$ = subexp(UNRESERVED$$ + "|" + PCT_ENCODED$ + "|" + SOME_DELIMS$$);
const DOMAIN$ = subexp(DOT_ATOM_TEXT$ + "|" + "\\[" + DTEXT_NO_OBS$$ + "*" + "\\]");
const LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + "|" + QUOTED_STRING$);
const ADDR_SPEC$ = subexp(LOCAL_PART$ + "\\@" + DOMAIN$);
const TO$ = subexp(ADDR_SPEC$ + subexp("\\," + ADDR_SPEC$) + "*");
const HFNAME$ = subexp(QCHAR$ + "*");
const HFVALUE$ = HFNAME$;
const HFIELD$ = subexp(HFNAME$ + "\\=" + HFVALUE$);
const HFIELDS2$ = subexp(HFIELD$ + subexp("\\&" + HFIELD$) + "*");
const HFIELDS$ = subexp("\\?" + HFIELDS2$);
const MAILTO_URI = new RegExp("^mailto\\:" + TO$ + "?" + HFIELDS$ + "?$");
const UNRESERVED = new RegExp(UNRESERVED$$, "g");
const PCT_ENCODED = new RegExp(PCT_ENCODED$, "g");
const NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g");
const NOT_DOMAIN = new RegExp(merge("[^]", ATEXT$$, "[\\.]", "[\\[]", DTEXT_NO_OBS$$, "[\\]]"), "g");
const NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g");
const NOT_HFVALUE = NOT_HFNAME;
const TO = new RegExp("^" + TO$ + "$");
const HFIELDS = new RegExp("^" + HFIELDS2$ + "$");
function decodeUnreserved(str) {
    const decStr = pctDecChars(str);
    return (!decStr.match(UNRESERVED) ? str : decStr);
}
const handler = {
    scheme: "mailto",
    parse: function (components, options) {
        const mailtoComponents = components;
        const to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(",") : []);
        mailtoComponents.path = undefined;
        if (mailtoComponents.query) {
            let unknownHeaders = false;
            const headers = {};
            const hfields = mailtoComponents.query.split("&");
            for (let x = 0, xl = hfields.length; x < xl; ++x) {
                const hfield = hfields[x].split("=");
                switch (hfield[0]) {
                    case "to":
                        const toAddrs = hfield[1].split(",");
                        for (let x = 0, xl = toAddrs.length; x < xl; ++x) {
                            to.push(toAddrs[x]);
                        }
                        break;
                    case "subject":
                        mailtoComponents.subject = unescapeComponent(hfield[1], options);
                        break;
                    case "body":
                        mailtoComponents.body = unescapeComponent(hfield[1], options);
                        break;
                    default:
                        unknownHeaders = true;
                        headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);
                        break;
                }
            }
            if (unknownHeaders)
                mailtoComponents.headers = headers;
        }
        mailtoComponents.query = undefined;
        for (let x = 0, xl = to.length; x < xl; ++x) {
            const addr = to[x].split("@");
            addr[0] = unescapeComponent(addr[0]);
            if (!options.unicodeSupport) {
                //convert Unicode IDN -> ASCII IDN
                try {
                    addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());
                }
                catch (e) {
                    mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e;
                }
            }
            else {
                addr[1] = unescapeComponent(addr[1], options).toLowerCase();
            }
            to[x] = addr.join("@");
        }
        return mailtoComponents;
    },
    serialize: function (mailtoComponents, options) {
        const components = mailtoComponents;
        const to = toArray(mailtoComponents.to);
        if (to) {
            for (let x = 0, xl = to.length; x < xl; ++x) {
                const toAddr = String(to[x]);
                const atIdx = toAddr.lastIndexOf("@");
                const localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);
                let domain = toAddr.slice(atIdx + 1);
                //convert IDN via punycode
                try {
                    domain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain));
                }
                catch (e) {
                    components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
                }
                to[x] = localPart + "@" + domain;
            }
            components.path = to.join(",");
        }
        const headers = mailtoComponents.headers = mailtoComponents.headers || {};
        if (mailtoComponents.subject)
            headers["subject"] = mailtoComponents.subject;
        if (mailtoComponents.body)
            headers["body"] = mailtoComponents.body;
        const fields = [];
        for (const name in headers) {
            if (headers[name] !== O[name]) {
                fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) +
                    "=" +
                    headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar));
            }
        }
        if (fields.length) {
            components.query = fields.join("&");
        }
        return components;
    }
};
export default handler;
//# sourceMappingURL=mailto.js.map{"version":3,"file":"mailto.js","sourceRoot":"","sources":["../../../src/schemes/mailto.ts"],"names":[],"mappings":"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"}const UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/;
const UUID_PARSE = /^[0-9A-Fa-f\-]{36}/;
//RFC 4122
const handler = {
    scheme: "urn:uuid",
    parse: function (urnComponents, options) {
        const uuidComponents = urnComponents;
        uuidComponents.uuid = uuidComponents.nss;
        uuidComponents.nss = undefined;
        if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {
            uuidComponents.error = uuidComponents.error || "UUID is not valid.";
        }
        return uuidComponents;
    },
    serialize: function (uuidComponents, options) {
        const urnComponents = uuidComponents;
        //normalize UUID
        urnComponents.nss = (uuidComponents.uuid || "").toLowerCase();
        return urnComponents;
    },
};
export default handler;
//# sourceMappingURL=urn-uuid.js.map{"version":3,"file":"urn-uuid.js","sourceRoot":"","sources":["../../../src/schemes/urn-uuid.ts"],"names":[],"mappings":"AAQA,MAAM,IAAI,GAAG,0DAA0D,CAAC;AACxE,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC,UAAU;AACV,MAAM,OAAO,GAA+D;IAC3E,MAAM,EAAG,UAAU;IAEnB,KAAK,EAAG,UAAU,aAA2B,EAAE,OAAkB;QAChE,MAAM,cAAc,GAAG,aAA+B,CAAC;QACvD,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC;QACzC,cAAc,CAAC,GAAG,GAAG,SAAS,CAAC;QAE/B,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;YACpF,cAAc,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,IAAI,oBAAoB,CAAC;SACpE;QAED,OAAO,cAAc,CAAC;IACvB,CAAC;IAED,SAAS,EAAG,UAAU,cAA6B,EAAE,OAAkB;QACtE,MAAM,aAAa,GAAG,cAA+B,CAAC;QACtD,gBAAgB;QAChB,aAAa,CAAC,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9D,OAAO,aAAa,CAAC;IACtB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"}import { SCHEMES } from "../uri";
const NID$ = "(?:[0-9A-Za-z][0-9A-Za-z\\-]{1,31})";
const PCT_ENCODED$ = "(?:\\%[0-9A-Fa-f]{2})";
const TRANS$$ = "[0-9A-Za-z\\(\\)\\+\\,\\-\\.\\:\\=\\@\\;\\$\\_\\!\\*\\'\\/\\?\\#]";
const NSS$ = "(?:(?:" + PCT_ENCODED$ + "|" + TRANS$$ + ")+)";
const URN_SCHEME = new RegExp("^urn\\:(" + NID$ + ")$");
const URN_PATH = new RegExp("^(" + NID$ + ")\\:(" + NSS$ + ")$");
const URN_PARSE = /^([^\:]+)\:(.*)/;
const URN_EXCLUDED = /[\x00-\x20\\\"\&\<\>\[\]\^\`\{\|\}\~\x7F-\xFF]/g;
//RFC 2141
const handler = {
    scheme: "urn",
    parse: function (components, options) {
        const matches = components.path && components.path.match(URN_PARSE);
        let urnComponents = components;
        if (matches) {
            const scheme = options.scheme || urnComponents.scheme || "urn";
            const nid = matches[1].toLowerCase();
            const nss = matches[2];
            const urnScheme = `${scheme}:${options.nid || nid}`;
            const schemeHandler = SCHEMES[urnScheme];
            urnComponents.nid = nid;
            urnComponents.nss = nss;
            urnComponents.path = undefined;
            if (schemeHandler) {
                urnComponents = schemeHandler.parse(urnComponents, options);
            }
        }
        else {
            urnComponents.error = urnComponents.error || "URN can not be parsed.";
        }
        return urnComponents;
    },
    serialize: function (urnComponents, options) {
        const scheme = options.scheme || urnComponents.scheme || "urn";
        const nid = urnComponents.nid;
        const urnScheme = `${scheme}:${options.nid || nid}`;
        const schemeHandler = SCHEMES[urnScheme];
        if (schemeHandler) {
            urnComponents = schemeHandler.serialize(urnComponents, options);
        }
        const uriComponents = urnComponents;
        const nss = urnComponents.nss;
        uriComponents.path = `${nid || options.nid}:${nss}`;
        return uriComponents;
    },
};
export default handler;
//# sourceMappingURL=urn.js.map{"version":3,"file":"urn.js","sourceRoot":"","sources":["../../../src/schemes/urn.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,OAAO,EAAE,MAAM,QAAQ,CAAC;AAW7C,MAAM,IAAI,GAAG,qCAAqC,CAAC;AACnD,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAC7C,MAAM,OAAO,GAAG,mEAAmE,CAAC;AACpF,MAAM,IAAI,GAAG,QAAQ,GAAG,YAAY,GAAG,GAAG,GAAG,OAAO,GAAG,KAAK,CAAC;AAC7D,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACxD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACjE,MAAM,SAAS,GAAG,iBAAiB,CAAC;AACpC,MAAM,YAAY,GAAG,iDAAiD,CAAC;AAEvE,UAAU;AACV,MAAM,OAAO,GAA8C;IAC1D,MAAM,EAAG,KAAK;IAEd,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,aAAa,GAAG,UAA2B,CAAC;QAEhD,IAAI,OAAO,EAAE;YACZ,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK,CAAC;YAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;YACpD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAEzC,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YACxB,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YACxB,aAAa,CAAC,IAAI,GAAG,SAAS,CAAC;YAE/B,IAAI,aAAa,EAAE;gBAClB,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,aAAa,EAAE,OAAO,CAAkB,CAAC;aAC7E;SACD;aAAM;YACN,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,IAAI,wBAAwB,CAAC;SACtE;QAED,OAAO,aAAa,CAAC;IACtB,CAAC;IAED,SAAS,EAAG,UAAU,aAA2B,EAAE,OAAkB;QACpE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK,CAAC;QAC/D,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;QAC9B,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,aAAa,EAAE;YAClB,aAAa,GAAG,aAAa,CAAC,SAAS,CAAC,aAAa,EAAE,OAAO,CAAkB,CAAC;SACjF;QAED,MAAM,aAAa,GAAG,aAA8B,CAAC;QACrD,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;QAC9B,aAAa,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QAEpD,OAAO,aAAa,CAAC;IACtB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"}function isSecure(wsComponents) {
    return typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === "wss";
}
//RFC 6455
const handler = {
    scheme: "ws",
    domainHost: true,
    parse: function (components, options) {
        const wsComponents = components;
        //indicate if the secure flag is set
        wsComponents.secure = isSecure(wsComponents);
        //construct resouce name
        wsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');
        wsComponents.path = undefined;
        wsComponents.query = undefined;
        return wsComponents;
    },
    serialize: function (wsComponents, options) {
        //normalize the default port
        if (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === "") {
            wsComponents.port = undefined;
        }
        //ensure scheme matches secure flag
        if (typeof wsComponents.secure === 'boolean') {
            wsComponents.scheme = (wsComponents.secure ? 'wss' : 'ws');
            wsComponents.secure = undefined;
        }
        //reconstruct path from resource name
        if (wsComponents.resourceName) {
            const [path, query] = wsComponents.resourceName.split('?');
            wsComponents.path = (path && path !== '/' ? path : undefined);
            wsComponents.query = query;
            wsComponents.resourceName = undefined;
        }
        //forbid fragment component
        wsComponents.fragment = undefined;
        return wsComponents;
    }
};
export default handler;
//# sourceMappingURL=ws.js.map{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../../src/schemes/ws.ts"],"names":[],"mappings":"AAOA,kBAAkB,YAAyB;IAC1C,OAAO,OAAO,YAAY,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;AAC7H,CAAC;AAED,UAAU;AACV,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,IAAI;IAEb,UAAU,EAAG,IAAI;IAEjB,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,MAAM,YAAY,GAAG,UAA0B,CAAC;QAEhD,oCAAoC;QACpC,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;QAE7C,wBAAwB;QACxB,YAAY,CAAC,YAAY,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9G,YAAY,CAAC,IAAI,GAAG,SAAS,CAAC;QAC9B,YAAY,CAAC,KAAK,GAAG,SAAS,CAAC;QAE/B,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,SAAS,EAAG,UAAU,YAAyB,EAAE,OAAkB;QAClE,4BAA4B;QAC5B,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,KAAK,EAAE,EAAE;YAC1F,YAAY,CAAC,IAAI,GAAG,SAAS,CAAC;SAC9B;QAED,mCAAmC;QACnC,IAAI,OAAO,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE;YAC7C,YAAY,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3D,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC;SAChC;QAED,qCAAqC;QACrC,IAAI,YAAY,CAAC,YAAY,EAAE;YAC9B,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3D,YAAY,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC9D,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC;YAC3B,YAAY,CAAC,YAAY,GAAG,SAAS,CAAC;SACtC;QAED,2BAA2B;QAC3B,YAAY,CAAC,QAAQ,GAAG,SAAS,CAAC;QAElC,OAAO,YAAY,CAAC;IACrB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"}import ws from "./ws";
const handler = {
    scheme: "wss",
    domainHost: ws.domainHost,
    parse: ws.parse,
    serialize: ws.serialize
};
export default handler;
//# sourceMappingURL=wss.js.map{"version":3,"file":"wss.js","sourceRoot":"","sources":["../../../src/schemes/wss.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,MAAM,CAAC;AAEtB,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,KAAK;IACd,UAAU,EAAG,EAAE,CAAC,UAAU;IAC1B,KAAK,EAAG,EAAE,CAAC,KAAK;IAChB,SAAS,EAAG,EAAE,CAAC,SAAS;CACxB,CAAA;AAED,eAAe,OAAO,CAAC"}/** @license URI.js v4.4.0 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */
(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
	typeof define === 'function' && define.amd ? define(['exports'], factory) :
	(factory((global.URI = global.URI || {})));
}(this, (function (exports) { 'use strict';

function merge() {
    for (var _len = arguments.length, sets = Array(_len), _key = 0; _key < _len; _key++) {
        sets[_key] = arguments[_key];
    }

    if (sets.length > 1) {
        sets[0] = sets[0].slice(0, -1);
        var xl = sets.length - 1;
        for (var x = 1; x < xl; ++x) {
            sets[x] = sets[x].slice(1, -1);
        }
        sets[xl] = sets[xl].slice(1);
        return sets.join('');
    } else {
        return sets[0];
    }
}
function subexp(str) {
    return "(?:" + str + ")";
}
function typeOf(o) {
    return o === undefined ? "undefined" : o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase();
}
function toUpperCase(str) {
    return str.toUpperCase();
}
function toArray(obj) {
    return obj !== undefined && obj !== null ? obj instanceof Array ? obj : typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj) : [];
}
function assign(target, source) {
    var obj = target;
    if (source) {
        for (var key in source) {
            obj[key] = source[key];
        }
    }
    return obj;
}

function buildExps(isIRI) {
    var ALPHA$$ = "[A-Za-z]",
        CR$ = "[\\x0D]",
        DIGIT$$ = "[0-9]",
        DQUOTE$$ = "[\\x22]",
        HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"),
        //case-insensitive
    LF$$ = "[\\x0A]",
        SP$$ = "[\\x20]",
        PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)),
        //expanded
    GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]",
        SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]",
        RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),
        UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]",
        //subset, excludes bidi control characters
    IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]",
        //subset
    UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$),
        SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"),
        USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"),
        DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$),
        DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$),
        //relaxed parsing rules
    IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$),
        H16$ = subexp(HEXDIG$$ + "{1,4}"),
        LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$),
        IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$),
        //                           6( h16 ":" ) ls32
    IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$),
        //                      "::" 5( h16 ":" ) ls32
    IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$),
        //[               h16 ] "::" 4( h16 ":" ) ls32
    IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$),
        //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
    IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$),
        //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
    IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$),
        //[ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
    IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$),
        //[ *4( h16 ":" ) h16 ] "::"              ls32
    IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$),
        //[ *5( h16 ":" ) h16 ] "::"              h16
    IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"),
        //[ *6( h16 ":" ) h16 ] "::"
    IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")),
        ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"),
        //RFC 6874
    IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$),
        //RFC 6874
    IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$),
        //RFC 6874, with relaxed parsing rules
    IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"),
        IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"),
        //RFC 6874
    REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"),
        HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$),
        PORT$ = subexp(DIGIT$$ + "*"),
        AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"),
        PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")),
        SEGMENT$ = subexp(PCHAR$ + "*"),
        SEGMENT_NZ$ = subexp(PCHAR$ + "+"),
        SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"),
        PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"),
        PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"),
        //simplified
    PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$),
        //simplified
    PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$),
        //simplified
    PATH_EMPTY$ = "(?!" + PCHAR$ + ")",
        PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$),
        QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"),
        FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"),
        HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$),
        URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"),
        RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$),
        RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"),
        URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$),
        ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"),
        GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$",
        RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$",
        ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$",
        SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$",
        AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$";
    return {
        NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"),
        NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"),
        NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"),
        ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        UNRESERVED: new RegExp(UNRESERVED$$, "g"),
        OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"),
        PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"),
        IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"),
        IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules
    };
}
var URI_PROTOCOL = buildExps(false);

var IRI_PROTOCOL = buildExps(true);

var slicedToArray = function () {
  function sliceIterator(arr, i) {
    var _arr = [];
    var _n = true;
    var _d = false;
    var _e = undefined;

    try {
      for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
        _arr.push(_s.value);

        if (i && _arr.length === i) break;
      }
    } catch (err) {
      _d = true;
      _e = err;
    } finally {
      try {
        if (!_n && _i["return"]) _i["return"]();
      } finally {
        if (_d) throw _e;
      }
    }

    return _arr;
  }

  return function (arr, i) {
    if (Array.isArray(arr)) {
      return arr;
    } else if (Symbol.iterator in Object(arr)) {
      return sliceIterator(arr, i);
    } else {
      throw new TypeError("Invalid attempt to destructure non-iterable instance");
    }
  };
}();













var toConsumableArray = function (arr) {
  if (Array.isArray(arr)) {
    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];

    return arr2;
  } else {
    return Array.from(arr);
  }
};

/** Highest positive signed 32-bit float value */

var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1

/** Bootstring parameters */
var base = 36;
var tMin = 1;
var tMax = 26;
var skew = 38;
var damp = 700;
var initialBias = 72;
var initialN = 128; // 0x80
var delimiter = '-'; // '\x2D'

/** Regular expressions */
var regexPunycode = /^xn--/;
var regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars
var regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators

/** Error messages */
var errors = {
	'overflow': 'Overflow: input needs wider integers to process',
	'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
	'invalid-input': 'Invalid input'
};

/** Convenience shortcuts */
var baseMinusTMin = base - tMin;
var floor = Math.floor;
var stringFromCharCode = String.fromCharCode;

/*--------------------------------------------------------------------------*/

/**
 * A generic error utility function.
 * @private
 * @param {String} type The error type.
 * @returns {Error} Throws a `RangeError` with the applicable error message.
 */
function error$1(type) {
	throw new RangeError(errors[type]);
}

/**
 * A generic `Array#map` utility function.
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} callback The function that gets called for every array
 * item.
 * @returns {Array} A new array of values returned by the callback function.
 */
function map(array, fn) {
	var result = [];
	var length = array.length;
	while (length--) {
		result[length] = fn(array[length]);
	}
	return result;
}

/**
 * A simple `Array#map`-like wrapper to work with domain name strings or email
 * addresses.
 * @private
 * @param {String} domain The domain name or email address.
 * @param {Function} callback The function that gets called for every
 * character.
 * @returns {Array} A new string of characters returned by the callback
 * function.
 */
function mapDomain(string, fn) {
	var parts = string.split('@');
	var result = '';
	if (parts.length > 1) {
		// In email addresses, only the domain name should be punycoded. Leave
		// the local part (i.e. everything up to `@`) intact.
		result = parts[0] + '@';
		string = parts[1];
	}
	// Avoid `split(regex)` for IE8 compatibility. See #17.
	string = string.replace(regexSeparators, '\x2E');
	var labels = string.split('.');
	var encoded = map(labels, fn).join('.');
	return result + encoded;
}

/**
 * Creates an array containing the numeric code points of each Unicode
 * character in the string. While JavaScript uses UCS-2 internally,
 * this function will convert a pair of surrogate halves (each of which
 * UCS-2 exposes as separate characters) into a single code point,
 * matching UTF-16.
 * @see `punycode.ucs2.encode`
 * @see <https://mathiasbynens.be/notes/javascript-encoding>
 * @memberOf punycode.ucs2
 * @name decode
 * @param {String} string The Unicode input string (UCS-2).
 * @returns {Array} The new array of code points.
 */
function ucs2decode(string) {
	var output = [];
	var counter = 0;
	var length = string.length;
	while (counter < length) {
		var value = string.charCodeAt(counter++);
		if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
			// It's a high surrogate, and there is a next character.
			var extra = string.charCodeAt(counter++);
			if ((extra & 0xFC00) == 0xDC00) {
				// Low surrogate.
				output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
			} else {
				// It's an unmatched surrogate; only append this code unit, in case the
				// next code unit is the high surrogate of a surrogate pair.
				output.push(value);
				counter--;
			}
		} else {
			output.push(value);
		}
	}
	return output;
}

/**
 * Creates a string based on an array of numeric code points.
 * @see `punycode.ucs2.decode`
 * @memberOf punycode.ucs2
 * @name encode
 * @param {Array} codePoints The array of numeric code points.
 * @returns {String} The new Unicode string (UCS-2).
 */
var ucs2encode = function ucs2encode(array) {
	return String.fromCodePoint.apply(String, toConsumableArray(array));
};

/**
 * Converts a basic code point into a digit/integer.
 * @see `digitToBasic()`
 * @private
 * @param {Number} codePoint The basic numeric code point value.
 * @returns {Number} The numeric value of a basic code point (for use in
 * representing integers) in the range `0` to `base - 1`, or `base` if
 * the code point does not represent a value.
 */
var basicToDigit = function basicToDigit(codePoint) {
	if (codePoint - 0x30 < 0x0A) {
		return codePoint - 0x16;
	}
	if (codePoint - 0x41 < 0x1A) {
		return codePoint - 0x41;
	}
	if (codePoint - 0x61 < 0x1A) {
		return codePoint - 0x61;
	}
	return base;
};

/**
 * Converts a digit/integer into a basic code point.
 * @see `basicToDigit()`
 * @private
 * @param {Number} digit The numeric value of a basic code point.
 * @returns {Number} The basic code point whose value (when used for
 * representing integers) is `digit`, which needs to be in the range
 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
 * used; else, the lowercase form is used. The behavior is undefined
 * if `flag` is non-zero and `digit` has no uppercase form.
 */
var digitToBasic = function digitToBasic(digit, flag) {
	//  0..25 map to ASCII a..z or A..Z
	// 26..35 map to ASCII 0..9
	return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
};

/**
 * Bias adaptation function as per section 3.4 of RFC 3492.
 * https://tools.ietf.org/html/rfc3492#section-3.4
 * @private
 */
var adapt = function adapt(delta, numPoints, firstTime) {
	var k = 0;
	delta = firstTime ? floor(delta / damp) : delta >> 1;
	delta += floor(delta / numPoints);
	for (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) {
		delta = floor(delta / baseMinusTMin);
	}
	return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
};

/**
 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
 * symbols.
 * @memberOf punycode
 * @param {String} input The Punycode string of ASCII-only symbols.
 * @returns {String} The resulting string of Unicode symbols.
 */
var decode = function decode(input) {
	// Don't use UCS-2.
	var output = [];
	var inputLength = input.length;
	var i = 0;
	var n = initialN;
	var bias = initialBias;

	// Handle the basic code points: let `basic` be the number of input code
	// points before the last delimiter, or `0` if there is none, then copy
	// the first basic code points to the output.

	var basic = input.lastIndexOf(delimiter);
	if (basic < 0) {
		basic = 0;
	}

	for (var j = 0; j < basic; ++j) {
		// if it's not a basic code point
		if (input.charCodeAt(j) >= 0x80) {
			error$1('not-basic');
		}
		output.push(input.charCodeAt(j));
	}

	// Main decoding loop: start just after the last delimiter if any basic code
	// points were copied; start at the beginning otherwise.

	for (var index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{

		// `index` is the index of the next character to be consumed.
		// Decode a generalized variable-length integer into `delta`,
		// which gets added to `i`. The overflow checking is easier
		// if we increase `i` as we go, then subtract off its starting
		// value at the end to obtain `delta`.
		var oldi = i;
		for (var w = 1, k = base;; /* no condition */k += base) {

			if (index >= inputLength) {
				error$1('invalid-input');
			}

			var digit = basicToDigit(input.charCodeAt(index++));

			if (digit >= base || digit > floor((maxInt - i) / w)) {
				error$1('overflow');
			}

			i += digit * w;
			var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;

			if (digit < t) {
				break;
			}

			var baseMinusT = base - t;
			if (w > floor(maxInt / baseMinusT)) {
				error$1('overflow');
			}

			w *= baseMinusT;
		}

		var out = output.length + 1;
		bias = adapt(i - oldi, out, oldi == 0);

		// `i` was supposed to wrap around from `out` to `0`,
		// incrementing `n` each time, so we'll fix that now:
		if (floor(i / out) > maxInt - n) {
			error$1('overflow');
		}

		n += floor(i / out);
		i %= out;

		// Insert `n` at position `i` of the output.
		output.splice(i++, 0, n);
	}

	return String.fromCodePoint.apply(String, output);
};

/**
 * Converts a string of Unicode symbols (e.g. a domain name label) to a
 * Punycode string of ASCII-only symbols.
 * @memberOf punycode
 * @param {String} input The string of Unicode symbols.
 * @returns {String} The resulting Punycode string of ASCII-only symbols.
 */
var encode = function encode(input) {
	var output = [];

	// Convert the input in UCS-2 to an array of Unicode code points.
	input = ucs2decode(input);

	// Cache the length.
	var inputLength = input.length;

	// Initialize the state.
	var n = initialN;
	var delta = 0;
	var bias = initialBias;

	// Handle the basic code points.
	var _iteratorNormalCompletion = true;
	var _didIteratorError = false;
	var _iteratorError = undefined;

	try {
		for (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
			var _currentValue2 = _step.value;

			if (_currentValue2 < 0x80) {
				output.push(stringFromCharCode(_currentValue2));
			}
		}
	} catch (err) {
		_didIteratorError = true;
		_iteratorError = err;
	} finally {
		try {
			if (!_iteratorNormalCompletion && _iterator.return) {
				_iterator.return();
			}
		} finally {
			if (_didIteratorError) {
				throw _iteratorError;
			}
		}
	}

	var basicLength = output.length;
	var handledCPCount = basicLength;

	// `handledCPCount` is the number of code points that have been handled;
	// `basicLength` is the number of basic code points.

	// Finish the basic string with a delimiter unless it's empty.
	if (basicLength) {
		output.push(delimiter);
	}

	// Main encoding loop:
	while (handledCPCount < inputLength) {

		// All non-basic code points < n have been handled already. Find the next
		// larger one:
		var m = maxInt;
		var _iteratorNormalCompletion2 = true;
		var _didIteratorError2 = false;
		var _iteratorError2 = undefined;

		try {
			for (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
				var currentValue = _step2.value;

				if (currentValue >= n && currentValue < m) {
					m = currentValue;
				}
			}

			// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
			// but guard against overflow.
		} catch (err) {
			_didIteratorError2 = true;
			_iteratorError2 = err;
		} finally {
			try {
				if (!_iteratorNormalCompletion2 && _iterator2.return) {
					_iterator2.return();
				}
			} finally {
				if (_didIteratorError2) {
					throw _iteratorError2;
				}
			}
		}

		var handledCPCountPlusOne = handledCPCount + 1;
		if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
			error$1('overflow');
		}

		delta += (m - n) * handledCPCountPlusOne;
		n = m;

		var _iteratorNormalCompletion3 = true;
		var _didIteratorError3 = false;
		var _iteratorError3 = undefined;

		try {
			for (var _iterator3 = input[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
				var _currentValue = _step3.value;

				if (_currentValue < n && ++delta > maxInt) {
					error$1('overflow');
				}
				if (_currentValue == n) {
					// Represent delta as a generalized variable-length integer.
					var q = delta;
					for (var k = base;; /* no condition */k += base) {
						var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
						if (q < t) {
							break;
						}
						var qMinusT = q - t;
						var baseMinusT = base - t;
						output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));
						q = floor(qMinusT / baseMinusT);
					}

					output.push(stringFromCharCode(digitToBasic(q, 0)));
					bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
					delta = 0;
					++handledCPCount;
				}
			}
		} catch (err) {
			_didIteratorError3 = true;
			_iteratorError3 = err;
		} finally {
			try {
				if (!_iteratorNormalCompletion3 && _iterator3.return) {
					_iterator3.return();
				}
			} finally {
				if (_didIteratorError3) {
					throw _iteratorError3;
				}
			}
		}

		++delta;
		++n;
	}
	return output.join('');
};

/**
 * Converts a Punycode string representing a domain name or an email address
 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
 * it doesn't matter if you call it on a string that has already been
 * converted to Unicode.
 * @memberOf punycode
 * @param {String} input The Punycoded domain name or email address to
 * convert to Unicode.
 * @returns {String} The Unicode representation of the given Punycode
 * string.
 */
var toUnicode = function toUnicode(input) {
	return mapDomain(input, function (string) {
		return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;
	});
};

/**
 * Converts a Unicode string representing a domain name or an email address to
 * Punycode. Only the non-ASCII parts of the domain name will be converted,
 * i.e. it doesn't matter if you call it with a domain that's already in
 * ASCII.
 * @memberOf punycode
 * @param {String} input The domain name or email address to convert, as a
 * Unicode string.
 * @returns {String} The Punycode representation of the given domain name or
 * email address.
 */
var toASCII = function toASCII(input) {
	return mapDomain(input, function (string) {
		return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;
	});
};

/*--------------------------------------------------------------------------*/

/** Define the public API */
var punycode = {
	/**
  * A string representing the current Punycode.js version number.
  * @memberOf punycode
  * @type String
  */
	'version': '2.1.0',
	/**
  * An object of methods to convert from JavaScript's internal character
  * representation (UCS-2) to Unicode code points, and back.
  * @see <https://mathiasbynens.be/notes/javascript-encoding>
  * @memberOf punycode
  * @type Object
  */
	'ucs2': {
		'decode': ucs2decode,
		'encode': ucs2encode
	},
	'decode': decode,
	'encode': encode,
	'toASCII': toASCII,
	'toUnicode': toUnicode
};

/**
 * URI.js
 *
 * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.
 * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
 * @see http://github.com/garycourt/uri-js
 */
/**
 * Copyright 2011 Gary Court. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 *    1. Redistributions of source code must retain the above copyright notice, this list of
 *       conditions and the following disclaimer.
 *
 *    2. Redistributions in binary form must reproduce the above copyright notice, this list
 *       of conditions and the following disclaimer in the documentation and/or other materials
 *       provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation are those of the
 * authors and should not be interpreted as representing official policies, either expressed
 * or implied, of Gary Court.
 */
var SCHEMES = {};
function pctEncChar(chr) {
    var c = chr.charCodeAt(0);
    var e = void 0;
    if (c < 16) e = "%0" + c.toString(16).toUpperCase();else if (c < 128) e = "%" + c.toString(16).toUpperCase();else if (c < 2048) e = "%" + (c >> 6 | 192).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();else e = "%" + (c >> 12 | 224).toString(16).toUpperCase() + "%" + (c >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();
    return e;
}
function pctDecChars(str) {
    var newStr = "";
    var i = 0;
    var il = str.length;
    while (i < il) {
        var c = parseInt(str.substr(i + 1, 2), 16);
        if (c < 128) {
            newStr += String.fromCharCode(c);
            i += 3;
        } else if (c >= 194 && c < 224) {
            if (il - i >= 6) {
                var c2 = parseInt(str.substr(i + 4, 2), 16);
                newStr += String.fromCharCode((c & 31) << 6 | c2 & 63);
            } else {
                newStr += str.substr(i, 6);
            }
            i += 6;
        } else if (c >= 224) {
            if (il - i >= 9) {
                var _c = parseInt(str.substr(i + 4, 2), 16);
                var c3 = parseInt(str.substr(i + 7, 2), 16);
                newStr += String.fromCharCode((c & 15) << 12 | (_c & 63) << 6 | c3 & 63);
            } else {
                newStr += str.substr(i, 9);
            }
            i += 9;
        } else {
            newStr += str.substr(i, 3);
            i += 3;
        }
    }
    return newStr;
}
function _normalizeComponentEncoding(components, protocol) {
    function decodeUnreserved(str) {
        var decStr = pctDecChars(str);
        return !decStr.match(protocol.UNRESERVED) ? str : decStr;
    }
    if (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, "");
    if (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    return components;
}

function _stripLeadingZeros(str) {
    return str.replace(/^0*(.*)/, "$1") || "0";
}
function _normalizeIPv4(host, protocol) {
    var matches = host.match(protocol.IPV4ADDRESS) || [];

    var _matches = slicedToArray(matches, 2),
        address = _matches[1];

    if (address) {
        return address.split(".").map(_stripLeadingZeros).join(".");
    } else {
        return host;
    }
}
function _normalizeIPv6(host, protocol) {
    var matches = host.match(protocol.IPV6ADDRESS) || [];

    var _matches2 = slicedToArray(matches, 3),
        address = _matches2[1],
        zone = _matches2[2];

    if (address) {
        var _address$toLowerCase$ = address.toLowerCase().split('::').reverse(),
            _address$toLowerCase$2 = slicedToArray(_address$toLowerCase$, 2),
            last = _address$toLowerCase$2[0],
            first = _address$toLowerCase$2[1];

        var firstFields = first ? first.split(":").map(_stripLeadingZeros) : [];
        var lastFields = last.split(":").map(_stripLeadingZeros);
        var isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);
        var fieldCount = isLastFieldIPv4Address ? 7 : 8;
        var lastFieldsStart = lastFields.length - fieldCount;
        var fields = Array(fieldCount);
        for (var x = 0; x < fieldCount; ++x) {
            fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';
        }
        if (isLastFieldIPv4Address) {
            fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);
        }
        var allZeroFields = fields.reduce(function (acc, field, index) {
            if (!field || field === "0") {
                var lastLongest = acc[acc.length - 1];
                if (lastLongest && lastLongest.index + lastLongest.length === index) {
                    lastLongest.length++;
                } else {
                    acc.push({ index: index, length: 1 });
                }
            }
            return acc;
        }, []);
        var longestZeroFields = allZeroFields.sort(function (a, b) {
            return b.length - a.length;
        })[0];
        var newHost = void 0;
        if (longestZeroFields && longestZeroFields.length > 1) {
            var newFirst = fields.slice(0, longestZeroFields.index);
            var newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);
            newHost = newFirst.join(":") + "::" + newLast.join(":");
        } else {
            newHost = fields.join(":");
        }
        if (zone) {
            newHost += "%" + zone;
        }
        return newHost;
    } else {
        return host;
    }
}
var URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i;
var NO_MATCH_IS_UNDEFINED = "".match(/(){0}/)[1] === undefined;
function parse(uriString) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    var components = {};
    var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;
    if (options.reference === "suffix") uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString;
    var matches = uriString.match(URI_PARSE);
    if (matches) {
        if (NO_MATCH_IS_UNDEFINED) {
            //store each component
            components.scheme = matches[1];
            components.userinfo = matches[3];
            components.host = matches[4];
            components.port = parseInt(matches[5], 10);
            components.path = matches[6] || "";
            components.query = matches[7];
            components.fragment = matches[8];
            //fix port number
            if (isNaN(components.port)) {
                components.port = matches[5];
            }
        } else {
            //IE FIX for improper RegExp matching
            //store each component
            components.scheme = matches[1] || undefined;
            components.userinfo = uriString.indexOf("@") !== -1 ? matches[3] : undefined;
            components.host = uriString.indexOf("//") !== -1 ? matches[4] : undefined;
            components.port = parseInt(matches[5], 10);
            components.path = matches[6] || "";
            components.query = uriString.indexOf("?") !== -1 ? matches[7] : undefined;
            components.fragment = uriString.indexOf("#") !== -1 ? matches[8] : undefined;
            //fix port number
            if (isNaN(components.port)) {
                components.port = uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined;
            }
        }
        if (components.host) {
            //normalize IP hosts
            components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);
        }
        //determine reference type
        if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {
            components.reference = "same-document";
        } else if (components.scheme === undefined) {
            components.reference = "relative";
        } else if (components.fragment === undefined) {
            components.reference = "absolute";
        } else {
            components.reference = "uri";
        }
        //check for reference errors
        if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) {
            components.error = components.error || "URI is not a " + options.reference + " reference.";
        }
        //find scheme handler
        var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
        //check if scheme can't handle IRIs
        if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
            //if host component is a domain name
            if (components.host && (options.domainHost || schemeHandler && schemeHandler.domainHost)) {
                //convert Unicode IDN -> ASCII IDN
                try {
                    components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());
                } catch (e) {
                    components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e;
                }
            }
            //convert IRI -> URI
            _normalizeComponentEncoding(components, URI_PROTOCOL);
        } else {
            //normalize encodings
            _normalizeComponentEncoding(components, protocol);
        }
        //perform scheme specific parsing
        if (schemeHandler && schemeHandler.parse) {
            schemeHandler.parse(components, options);
        }
    } else {
        components.error = components.error || "URI can not be parsed.";
    }
    return components;
}

function _recomposeAuthority(components, options) {
    var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;
    var uriTokens = [];
    if (components.userinfo !== undefined) {
        uriTokens.push(components.userinfo);
        uriTokens.push("@");
    }
    if (components.host !== undefined) {
        //normalize IP hosts, add brackets and escape zone separator for IPv6
        uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, function (_, $1, $2) {
            return "[" + $1 + ($2 ? "%25" + $2 : "") + "]";
        }));
    }
    if (typeof components.port === "number" || typeof components.port === "string") {
        uriTokens.push(":");
        uriTokens.push(String(components.port));
    }
    return uriTokens.length ? uriTokens.join("") : undefined;
}

var RDS1 = /^\.\.?\//;
var RDS2 = /^\/\.(\/|$)/;
var RDS3 = /^\/\.\.(\/|$)/;
var RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/;
function removeDotSegments(input) {
    var output = [];
    while (input.length) {
        if (input.match(RDS1)) {
            input = input.replace(RDS1, "");
        } else if (input.match(RDS2)) {
            input = input.replace(RDS2, "/");
        } else if (input.match(RDS3)) {
            input = input.replace(RDS3, "/");
            output.pop();
        } else if (input === "." || input === "..") {
            input = "";
        } else {
            var im = input.match(RDS5);
            if (im) {
                var s = im[0];
                input = input.slice(s.length);
                output.push(s);
            } else {
                throw new Error("Unexpected dot segment condition");
            }
        }
    }
    return output.join("");
}

function serialize(components) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    var protocol = options.iri ? IRI_PROTOCOL : URI_PROTOCOL;
    var uriTokens = [];
    //find scheme handler
    var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
    //perform scheme specific serialization
    if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);
    if (components.host) {
        //if host component is an IPv6 address
        if (protocol.IPV6ADDRESS.test(components.host)) {}
        //TODO: normalize IPv6 address as per RFC 5952

        //if host component is a domain name
        else if (options.domainHost || schemeHandler && schemeHandler.domainHost) {
                //convert IDN via punycode
                try {
                    components.host = !options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host);
                } catch (e) {
                    components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
                }
            }
    }
    //normalize encoding
    _normalizeComponentEncoding(components, protocol);
    if (options.reference !== "suffix" && components.scheme) {
        uriTokens.push(components.scheme);
        uriTokens.push(":");
    }
    var authority = _recomposeAuthority(components, options);
    if (authority !== undefined) {
        if (options.reference !== "suffix") {
            uriTokens.push("//");
        }
        uriTokens.push(authority);
        if (components.path && components.path.charAt(0) !== "/") {
            uriTokens.push("/");
        }
    }
    if (components.path !== undefined) {
        var s = components.path;
        if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
            s = removeDotSegments(s);
        }
        if (authority === undefined) {
            s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//"
        }
        uriTokens.push(s);
    }
    if (components.query !== undefined) {
        uriTokens.push("?");
        uriTokens.push(components.query);
    }
    if (components.fragment !== undefined) {
        uriTokens.push("#");
        uriTokens.push(components.fragment);
    }
    return uriTokens.join(""); //merge tokens into a string
}

function resolveComponents(base, relative) {
    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
    var skipNormalization = arguments[3];

    var target = {};
    if (!skipNormalization) {
        base = parse(serialize(base, options), options); //normalize base components
        relative = parse(serialize(relative, options), options); //normalize relative components
    }
    options = options || {};
    if (!options.tolerant && relative.scheme) {
        target.scheme = relative.scheme;
        //target.authority = relative.authority;
        target.userinfo = relative.userinfo;
        target.host = relative.host;
        target.port = relative.port;
        target.path = removeDotSegments(relative.path || "");
        target.query = relative.query;
    } else {
        if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {
            //target.authority = relative.authority;
            target.userinfo = relative.userinfo;
            target.host = relative.host;
            target.port = relative.port;
            target.path = removeDotSegments(relative.path || "");
            target.query = relative.query;
        } else {
            if (!relative.path) {
                target.path = base.path;
                if (relative.query !== undefined) {
                    target.query = relative.query;
                } else {
                    target.query = base.query;
                }
            } else {
                if (relative.path.charAt(0) === "/") {
                    target.path = removeDotSegments(relative.path);
                } else {
                    if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {
                        target.path = "/" + relative.path;
                    } else if (!base.path) {
                        target.path = relative.path;
                    } else {
                        target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path;
                    }
                    target.path = removeDotSegments(target.path);
                }
                target.query = relative.query;
            }
            //target.authority = base.authority;
            target.userinfo = base.userinfo;
            target.host = base.host;
            target.port = base.port;
        }
        target.scheme = base.scheme;
    }
    target.fragment = relative.fragment;
    return target;
}

function resolve(baseURI, relativeURI, options) {
    var schemelessOptions = assign({ scheme: 'null' }, options);
    return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);
}

function normalize(uri, options) {
    if (typeof uri === "string") {
        uri = serialize(parse(uri, options), options);
    } else if (typeOf(uri) === "object") {
        uri = parse(serialize(uri, options), options);
    }
    return uri;
}

function equal(uriA, uriB, options) {
    if (typeof uriA === "string") {
        uriA = serialize(parse(uriA, options), options);
    } else if (typeOf(uriA) === "object") {
        uriA = serialize(uriA, options);
    }
    if (typeof uriB === "string") {
        uriB = serialize(parse(uriB, options), options);
    } else if (typeOf(uriB) === "object") {
        uriB = serialize(uriB, options);
    }
    return uriA === uriB;
}

function escapeComponent(str, options) {
    return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE, pctEncChar);
}

function unescapeComponent(str, options) {
    return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED, pctDecChars);
}

var handler = {
    scheme: "http",
    domainHost: true,
    parse: function parse(components, options) {
        //report missing host
        if (!components.host) {
            components.error = components.error || "HTTP URIs must have a host.";
        }
        return components;
    },
    serialize: function serialize(components, options) {
        var secure = String(components.scheme).toLowerCase() === "https";
        //normalize the default port
        if (components.port === (secure ? 443 : 80) || components.port === "") {
            components.port = undefined;
        }
        //normalize the empty path
        if (!components.path) {
            components.path = "/";
        }
        //NOTE: We do not parse query strings for HTTP URIs
        //as WWW Form Url Encoded query strings are part of the HTML4+ spec,
        //and not the HTTP spec.
        return components;
    }
};

var handler$1 = {
    scheme: "https",
    domainHost: handler.domainHost,
    parse: handler.parse,
    serialize: handler.serialize
};

function isSecure(wsComponents) {
    return typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === "wss";
}
//RFC 6455
var handler$2 = {
    scheme: "ws",
    domainHost: true,
    parse: function parse(components, options) {
        var wsComponents = components;
        //indicate if the secure flag is set
        wsComponents.secure = isSecure(wsComponents);
        //construct resouce name
        wsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');
        wsComponents.path = undefined;
        wsComponents.query = undefined;
        return wsComponents;
    },
    serialize: function serialize(wsComponents, options) {
        //normalize the default port
        if (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === "") {
            wsComponents.port = undefined;
        }
        //ensure scheme matches secure flag
        if (typeof wsComponents.secure === 'boolean') {
            wsComponents.scheme = wsComponents.secure ? 'wss' : 'ws';
            wsComponents.secure = undefined;
        }
        //reconstruct path from resource name
        if (wsComponents.resourceName) {
            var _wsComponents$resourc = wsComponents.resourceName.split('?'),
                _wsComponents$resourc2 = slicedToArray(_wsComponents$resourc, 2),
                path = _wsComponents$resourc2[0],
                query = _wsComponents$resourc2[1];

            wsComponents.path = path && path !== '/' ? path : undefined;
            wsComponents.query = query;
            wsComponents.resourceName = undefined;
        }
        //forbid fragment component
        wsComponents.fragment = undefined;
        return wsComponents;
    }
};

var handler$3 = {
    scheme: "wss",
    domainHost: handler$2.domainHost,
    parse: handler$2.parse,
    serialize: handler$2.serialize
};

var O = {};
var isIRI = true;
//RFC 3986
var UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]";
var HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive
var PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded
//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =
//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]";  //(%d1-8 / %d11-12 / %d14-31 / %d127)
//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$);  //%d33 / %d35-91 / %d93-126 / obs-qtext
//const VCHAR$$ = "[\\x21-\\x7E]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$));  //%d0 / CR / LF / obs-qtext
//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+");
//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$);
//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"');
var ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]";
var QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]";
var VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]");
var SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]";
var UNRESERVED = new RegExp(UNRESERVED$$, "g");
var PCT_ENCODED = new RegExp(PCT_ENCODED$, "g");
var NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g");
var NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g");
var NOT_HFVALUE = NOT_HFNAME;
function decodeUnreserved(str) {
    var decStr = pctDecChars(str);
    return !decStr.match(UNRESERVED) ? str : decStr;
}
var handler$4 = {
    scheme: "mailto",
    parse: function parse$$1(components, options) {
        var mailtoComponents = components;
        var to = mailtoComponents.to = mailtoComponents.path ? mailtoComponents.path.split(",") : [];
        mailtoComponents.path = undefined;
        if (mailtoComponents.query) {
            var unknownHeaders = false;
            var headers = {};
            var hfields = mailtoComponents.query.split("&");
            for (var x = 0, xl = hfields.length; x < xl; ++x) {
                var hfield = hfields[x].split("=");
                switch (hfield[0]) {
                    case "to":
                        var toAddrs = hfield[1].split(",");
                        for (var _x = 0, _xl = toAddrs.length; _x < _xl; ++_x) {
                            to.push(toAddrs[_x]);
                        }
                        break;
                    case "subject":
                        mailtoComponents.subject = unescapeComponent(hfield[1], options);
                        break;
                    case "body":
                        mailtoComponents.body = unescapeComponent(hfield[1], options);
                        break;
                    default:
                        unknownHeaders = true;
                        headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);
                        break;
                }
            }
            if (unknownHeaders) mailtoComponents.headers = headers;
        }
        mailtoComponents.query = undefined;
        for (var _x2 = 0, _xl2 = to.length; _x2 < _xl2; ++_x2) {
            var addr = to[_x2].split("@");
            addr[0] = unescapeComponent(addr[0]);
            if (!options.unicodeSupport) {
                //convert Unicode IDN -> ASCII IDN
                try {
                    addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());
                } catch (e) {
                    mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e;
                }
            } else {
                addr[1] = unescapeComponent(addr[1], options).toLowerCase();
            }
            to[_x2] = addr.join("@");
        }
        return mailtoComponents;
    },
    serialize: function serialize$$1(mailtoComponents, options) {
        var components = mailtoComponents;
        var to = toArray(mailtoComponents.to);
        if (to) {
            for (var x = 0, xl = to.length; x < xl; ++x) {
                var toAddr = String(to[x]);
                var atIdx = toAddr.lastIndexOf("@");
                var localPart = toAddr.slice(0, atIdx).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);
                var domain = toAddr.slice(atIdx + 1);
                //convert IDN via punycode
                try {
                    domain = !options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain);
                } catch (e) {
                    components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
                }
                to[x] = localPart + "@" + domain;
            }
            components.path = to.join(",");
        }
        var headers = mailtoComponents.headers = mailtoComponents.headers || {};
        if (mailtoComponents.subject) headers["subject"] = mailtoComponents.subject;
        if (mailtoComponents.body) headers["body"] = mailtoComponents.body;
        var fields = [];
        for (var name in headers) {
            if (headers[name] !== O[name]) {
                fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + "=" + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar));
            }
        }
        if (fields.length) {
            components.query = fields.join("&");
        }
        return components;
    }
};

var URN_PARSE = /^([^\:]+)\:(.*)/;
//RFC 2141
var handler$5 = {
    scheme: "urn",
    parse: function parse$$1(components, options) {
        var matches = components.path && components.path.match(URN_PARSE);
        var urnComponents = components;
        if (matches) {
            var scheme = options.scheme || urnComponents.scheme || "urn";
            var nid = matches[1].toLowerCase();
            var nss = matches[2];
            var urnScheme = scheme + ":" + (options.nid || nid);
            var schemeHandler = SCHEMES[urnScheme];
            urnComponents.nid = nid;
            urnComponents.nss = nss;
            urnComponents.path = undefined;
            if (schemeHandler) {
                urnComponents = schemeHandler.parse(urnComponents, options);
            }
        } else {
            urnComponents.error = urnComponents.error || "URN can not be parsed.";
        }
        return urnComponents;
    },
    serialize: function serialize$$1(urnComponents, options) {
        var scheme = options.scheme || urnComponents.scheme || "urn";
        var nid = urnComponents.nid;
        var urnScheme = scheme + ":" + (options.nid || nid);
        var schemeHandler = SCHEMES[urnScheme];
        if (schemeHandler) {
            urnComponents = schemeHandler.serialize(urnComponents, options);
        }
        var uriComponents = urnComponents;
        var nss = urnComponents.nss;
        uriComponents.path = (nid || options.nid) + ":" + nss;
        return uriComponents;
    }
};

var UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/;
//RFC 4122
var handler$6 = {
    scheme: "urn:uuid",
    parse: function parse(urnComponents, options) {
        var uuidComponents = urnComponents;
        uuidComponents.uuid = uuidComponents.nss;
        uuidComponents.nss = undefined;
        if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {
            uuidComponents.error = uuidComponents.error || "UUID is not valid.";
        }
        return uuidComponents;
    },
    serialize: function serialize(uuidComponents, options) {
        var urnComponents = uuidComponents;
        //normalize UUID
        urnComponents.nss = (uuidComponents.uuid || "").toLowerCase();
        return urnComponents;
    }
};

SCHEMES[handler.scheme] = handler;
SCHEMES[handler$1.scheme] = handler$1;
SCHEMES[handler$2.scheme] = handler$2;
SCHEMES[handler$3.scheme] = handler$3;
SCHEMES[handler$4.scheme] = handler$4;
SCHEMES[handler$5.scheme] = handler$5;
SCHEMES[handler$6.scheme] = handler$6;

exports.SCHEMES = SCHEMES;
exports.pctEncChar = pctEncChar;
exports.pctDecChars = pctDecChars;
exports.parse = parse;
exports.removeDotSegments = removeDotSegments;
exports.serialize = serialize;
exports.resolveComponents = resolveComponents;
exports.resolve = resolve;
exports.normalize = normalize;
exports.equal = equal;
exports.escapeComponent = escapeComponent;
exports.unescapeComponent = unescapeComponent;

Object.defineProperty(exports, '__esModule', { value: true });

})));
//# sourceMappingURL=uri.all.js.map
{"version":3,"file":"uri.all.js","sources":["../../src/index.ts","../../src/schemes/urn-uuid.ts","../../src/schemes/urn.ts","../../src/schemes/mailto.ts","../../src/schemes/wss.ts","../../src/schemes/ws.ts","../../src/schemes/https.ts","../../src/schemes/http.ts","../../src/uri.ts","../../node_modules/punycode/punycode.es6.js","../../src/regexps-iri.ts","../../src/regexps-uri.ts","../../src/util.ts"],"sourcesContent":["import { SCHEMES } from \"./uri\";\n\nimport http from \"./schemes/http\";\nSCHEMES[http.scheme] = http;\n\nimport https from \"./schemes/https\";\nSCHEMES[https.scheme] = https;\n\nimport ws from \"./schemes/ws\";\nSCHEMES[ws.scheme] = ws;\n\nimport wss from \"./schemes/wss\";\nSCHEMES[wss.scheme] = wss;\n\nimport mailto from \"./schemes/mailto\";\nSCHEMES[mailto.scheme] = mailto;\n\nimport urn from \"./schemes/urn\";\nSCHEMES[urn.scheme] = urn;\n\nimport uuid from \"./schemes/urn-uuid\";\nSCHEMES[uuid.scheme] = uuid;\n\nexport * from \"./uri\";\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { URNComponents } from \"./urn\";\nimport { SCHEMES } from \"../uri\";\n\nexport interface UUIDComponents extends URNComponents {\n\tuuid?: string;\n}\n\nconst UUID = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;\nconst UUID_PARSE = /^[0-9A-Fa-f\\-]{36}/;\n\n//RFC 4122\nconst handler:URISchemeHandler<UUIDComponents, URIOptions, URNComponents> = {\n\tscheme : \"urn:uuid\",\n\n\tparse : function (urnComponents:URNComponents, options:URIOptions):UUIDComponents {\n\t\tconst uuidComponents = urnComponents as UUIDComponents;\n\t\tuuidComponents.uuid = uuidComponents.nss;\n\t\tuuidComponents.nss = undefined;\n\n\t\tif (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {\n\t\t\tuuidComponents.error = uuidComponents.error || \"UUID is not valid.\";\n\t\t}\n\n\t\treturn uuidComponents;\n\t},\n\n\tserialize : function (uuidComponents:UUIDComponents, options:URIOptions):URNComponents {\n\t\tconst urnComponents = uuidComponents as URNComponents;\n\t\t//normalize UUID\n\t\turnComponents.nss = (uuidComponents.uuid || \"\").toLowerCase();\n\t\treturn urnComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, SCHEMES } from \"../uri\";\n\nexport interface URNComponents extends URIComponents {\n\tnid?:string;\n\tnss?:string;\n}\n\nexport interface URNOptions extends URIOptions {\n\tnid?:string;\n}\n\nconst NID$ = \"(?:[0-9A-Za-z][0-9A-Za-z\\\\-]{1,31})\";\nconst PCT_ENCODED$ = \"(?:\\\\%[0-9A-Fa-f]{2})\";\nconst TRANS$$ = \"[0-9A-Za-z\\\\(\\\\)\\\\+\\\\,\\\\-\\\\.\\\\:\\\\=\\\\@\\\\;\\\\$\\\\_\\\\!\\\\*\\\\'\\\\/\\\\?\\\\#]\";\nconst NSS$ = \"(?:(?:\" + PCT_ENCODED$ + \"|\" + TRANS$$ + \")+)\";\nconst URN_SCHEME = new RegExp(\"^urn\\\\:(\" + NID$ + \")$\");\nconst URN_PATH = new RegExp(\"^(\" + NID$ + \")\\\\:(\" + NSS$ + \")$\");\nconst URN_PARSE = /^([^\\:]+)\\:(.*)/;\nconst URN_EXCLUDED = /[\\x00-\\x20\\\\\\\"\\&\\<\\>\\[\\]\\^\\`\\{\\|\\}\\~\\x7F-\\xFF]/g;\n\n//RFC 2141\nconst handler:URISchemeHandler<URNComponents,URNOptions> = {\n\tscheme : \"urn\",\n\n\tparse : function (components:URIComponents, options:URNOptions):URNComponents {\n\t\tconst matches = components.path && components.path.match(URN_PARSE);\n\t\tlet urnComponents = components as URNComponents;\n\n\t\tif (matches) {\n\t\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\t\tconst nid = matches[1].toLowerCase();\n\t\t\tconst nss = matches[2];\n\t\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\t\turnComponents.nid = nid;\n\t\t\turnComponents.nss = nss;\n\t\t\turnComponents.path = undefined;\n\n\t\t\tif (schemeHandler) {\n\t\t\t\turnComponents = schemeHandler.parse(urnComponents, options) as URNComponents;\n\t\t\t}\n\t\t} else {\n\t\t\turnComponents.error = urnComponents.error || \"URN can not be parsed.\";\n\t\t}\n\n\t\treturn urnComponents;\n\t},\n\n\tserialize : function (urnComponents:URNComponents, options:URNOptions):URIComponents {\n\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\tconst nid = urnComponents.nid;\n\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\tif (schemeHandler) {\n\t\t\turnComponents = schemeHandler.serialize(urnComponents, options) as URNComponents;\n\t\t}\n\n\t\tconst uriComponents = urnComponents as URIComponents;\n\t\tconst nss = urnComponents.nss;\n\t\turiComponents.path = `${nid || options.nid}:${nss}`;\n\n\t\treturn uriComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, pctDecChars, unescapeComponent } from \"../uri\";\nimport punycode from \"punycode\";\nimport { merge, subexp, toUpperCase, toArray } from \"../util\";\n\nexport interface MailtoHeaders {\n\t[hfname:string]:string\n}\n\nexport interface MailtoComponents extends URIComponents {\n\tto:Array<string>,\n\theaders?:MailtoHeaders,\n\tsubject?:string,\n\tbody?:string\n}\n\nconst O:MailtoHeaders = {};\nconst isIRI = true;\n\n//RFC 3986\nconst UNRESERVED$$ = \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\" + (isIRI ? \"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\" : \"\") + \"]\";\nconst HEXDIG$$ = \"[0-9A-Fa-f]\";  //case-insensitive\nconst PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$));  //expanded\n\n//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =\n//const ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\#\\\\$\\\\%\\\\&\\\\'\\\\*\\\\+\\\\-\\\\/\\\\=\\\\?\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QTEXT$$ = \"[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F]\";  //(%d1-8 / %d11-12 / %d14-31 / %d127)\n//const QTEXT$$ = merge(\"[\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7E]\", OBS_QTEXT$$);  //%d33 / %d35-91 / %d93-126 / obs-qtext\n//const VCHAR$$ = \"[\\\\x21-\\\\x7E]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QP$ = subexp(\"\\\\\\\\\" + merge(\"[\\\\x00\\\\x0D\\\\x0A]\", OBS_QTEXT$$));  //%d0 / CR / LF / obs-qtext\n//const FWS$ = subexp(subexp(WSP$$ + \"*\" + \"\\\\x0D\\\\x0A\") + \"?\" + WSP$$ + \"+\");\n//const QUOTED_PAIR$ = subexp(subexp(\"\\\\\\\\\" + subexp(VCHAR$$ + \"|\" + WSP$$)) + \"|\" + OBS_QP$);\n//const QUOTED_STRING$ = subexp('\\\\\"' + subexp(FWS$ + \"?\" + QCONTENT$) + \"*\" + FWS$ + \"?\" + '\\\\\"');\nconst ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\nconst QTEXT$$ = \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\";\nconst VCHAR$$ = merge(QTEXT$$, \"[\\\\\\\"\\\\\\\\]\");\nconst DOT_ATOM_TEXT$ = subexp(ATEXT$$ + \"+\" + subexp(\"\\\\.\" + ATEXT$$ + \"+\") + \"*\");\nconst QUOTED_PAIR$ = subexp(\"\\\\\\\\\" + VCHAR$$);\nconst QCONTENT$ = subexp(QTEXT$$ + \"|\" + QUOTED_PAIR$);\nconst QUOTED_STRING$ = subexp('\\\\\"' + QCONTENT$ + \"*\" + '\\\\\"');\n\n//RFC 6068\nconst DTEXT_NO_OBS$$ = \"[\\\\x21-\\\\x5A\\\\x5E-\\\\x7E]\";  //%d33-90 / %d94-126\nconst SOME_DELIMS$$ = \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\";\nconst QCHAR$ = subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$ + \"|\" + SOME_DELIMS$$);\nconst DOMAIN$ = subexp(DOT_ATOM_TEXT$ + \"|\" + \"\\\\[\" + DTEXT_NO_OBS$$ + \"*\" + \"\\\\]\");\nconst LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + \"|\" + QUOTED_STRING$);\nconst ADDR_SPEC$ = subexp(LOCAL_PART$ + \"\\\\@\" + DOMAIN$);\nconst TO$ = subexp(ADDR_SPEC$ + subexp(\"\\\\,\" + ADDR_SPEC$) + \"*\");\nconst HFNAME$ = subexp(QCHAR$ + \"*\");\nconst HFVALUE$ = HFNAME$;\nconst HFIELD$ = subexp(HFNAME$ + \"\\\\=\" + HFVALUE$);\nconst HFIELDS2$ = subexp(HFIELD$ + subexp(\"\\\\&\" + HFIELD$) + \"*\");\nconst HFIELDS$ = subexp(\"\\\\?\" + HFIELDS2$);\nconst MAILTO_URI = new RegExp(\"^mailto\\\\:\" + TO$ + \"?\" + HFIELDS$ + \"?$\");\n\nconst UNRESERVED = new RegExp(UNRESERVED$$, \"g\");\nconst PCT_ENCODED = new RegExp(PCT_ENCODED$, \"g\");\nconst NOT_LOCAL_PART = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", '[\\\\\"]', VCHAR$$), \"g\");\nconst NOT_DOMAIN = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", \"[\\\\[]\", DTEXT_NO_OBS$$, \"[\\\\]]\"), \"g\");\nconst NOT_HFNAME = new RegExp(merge(\"[^]\", UNRESERVED$$, SOME_DELIMS$$), \"g\");\nconst NOT_HFVALUE = NOT_HFNAME;\nconst TO = new RegExp(\"^\" + TO$ + \"$\");\nconst HFIELDS = new RegExp(\"^\" + HFIELDS2$ + \"$\");\n\nfunction decodeUnreserved(str:string):string {\n\tconst decStr = pctDecChars(str);\n\treturn (!decStr.match(UNRESERVED) ? str : decStr);\n}\n\nconst handler:URISchemeHandler<MailtoComponents> =  {\n\tscheme : \"mailto\",\n\n\tparse : function (components:URIComponents, options:URIOptions):MailtoComponents {\n\t\tconst mailtoComponents = components as MailtoComponents;\n\t\tconst to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(\",\") : []);\n\t\tmailtoComponents.path = undefined;\n\n\t\tif (mailtoComponents.query) {\n\t\t\tlet unknownHeaders = false\n\t\t\tconst headers:MailtoHeaders = {};\n\t\t\tconst hfields = mailtoComponents.query.split(\"&\");\n\n\t\t\tfor (let x = 0, xl = hfields.length; x < xl; ++x) {\n\t\t\t\tconst hfield = hfields[x].split(\"=\");\n\n\t\t\t\tswitch (hfield[0]) {\n\t\t\t\t\tcase \"to\":\n\t\t\t\t\t\tconst toAddrs = hfield[1].split(\",\");\n\t\t\t\t\t\tfor (let x = 0, xl = toAddrs.length; x < xl; ++x) {\n\t\t\t\t\t\t\tto.push(toAddrs[x]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"subject\":\n\t\t\t\t\t\tmailtoComponents.subject = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"body\":\n\t\t\t\t\t\tmailtoComponents.body = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tunknownHeaders = true;\n\t\t\t\t\t\theaders[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (unknownHeaders) mailtoComponents.headers = headers;\n\t\t}\n\n\t\tmailtoComponents.query = undefined;\n\n\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\tconst addr = to[x].split(\"@\");\n\n\t\t\taddr[0] = unescapeComponent(addr[0]);\n\n\t\t\tif (!options.unicodeSupport) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\taddr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tmailtoComponents.error = mailtoComponents.error || \"Email address's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddr[1] = unescapeComponent(addr[1], options).toLowerCase();\n\t\t\t}\n\n\t\t\tto[x] = addr.join(\"@\");\n\t\t}\n\n\t\treturn mailtoComponents;\n\t},\n\n\tserialize : function (mailtoComponents:MailtoComponents, options:URIOptions):URIComponents {\n\t\tconst components = mailtoComponents as URIComponents;\n\t\tconst to = toArray(mailtoComponents.to);\n\t\tif (to) {\n\t\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\t\tconst toAddr = String(to[x]);\n\t\t\t\tconst atIdx = toAddr.lastIndexOf(\"@\");\n\t\t\t\tconst localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);\n\t\t\t\tlet domain = toAddr.slice(atIdx + 1);\n\n\t\t\t\t//convert IDN via punycode\n\t\t\t\ttry {\n\t\t\t\t\tdomain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Email address's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t\t}\n\n\t\t\t\tto[x] = localPart + \"@\" + domain;\n\t\t\t}\n\n\t\t\tcomponents.path = to.join(\",\");\n\t\t}\n\n\t\tconst headers = mailtoComponents.headers = mailtoComponents.headers || {};\n\n\t\tif (mailtoComponents.subject) headers[\"subject\"] = mailtoComponents.subject;\n\t\tif (mailtoComponents.body) headers[\"body\"] = mailtoComponents.body;\n\n\t\tconst fields = [];\n\t\tfor (const name in headers) {\n\t\t\tif (headers[name] !== O[name]) {\n\t\t\t\tfields.push(\n\t\t\t\t\tname.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) +\n\t\t\t\t\t\"=\" +\n\t\t\t\t\theaders[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (fields.length) {\n\t\t\tcomponents.query = fields.join(\"&\");\n\t\t}\n\n\t\treturn components;\n\t}\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport ws from \"./ws\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"wss\",\n\tdomainHost : ws.domainHost,\n\tparse : ws.parse,\n\tserialize : ws.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nexport interface WSComponents extends URIComponents {\n\tresourceName?: string;\n\tsecure?: boolean;\n}\n\nfunction isSecure(wsComponents:WSComponents):boolean {\n\treturn typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === \"wss\";\n}\n\n//RFC 6455\nconst handler:URISchemeHandler = {\n\tscheme : \"ws\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):WSComponents {\n\t\tconst wsComponents = components as WSComponents;\n\n\t\t//indicate if the secure flag is set\n\t\twsComponents.secure = isSecure(wsComponents);\n\n\t\t//construct resouce name\n\t\twsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');\n\t\twsComponents.path = undefined;\n\t\twsComponents.query = undefined;\n\n\t\treturn wsComponents;\n\t},\n\n\tserialize : function (wsComponents:WSComponents, options:URIOptions):URIComponents {\n\t\t//normalize the default port\n\t\tif (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === \"\") {\n\t\t\twsComponents.port = undefined;\n\t\t}\n\n\t\t//ensure scheme matches secure flag\n\t\tif (typeof wsComponents.secure === 'boolean') {\n\t\t\twsComponents.scheme = (wsComponents.secure ? 'wss' : 'ws');\n\t\t\twsComponents.secure = undefined;\n\t\t}\n\n\t\t//reconstruct path from resource name\n\t\tif (wsComponents.resourceName) {\n\t\t\tconst [path, query] = wsComponents.resourceName.split('?');\n\t\t\twsComponents.path = (path && path !== '/' ? path : undefined);\n\t\t\twsComponents.query = query;\n\t\t\twsComponents.resourceName = undefined;\n\t\t}\n\n\t\t//forbid fragment component\n\t\twsComponents.fragment = undefined;\n\n\t\treturn wsComponents;\n\t}\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport http from \"./http\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"https\",\n\tdomainHost : http.domainHost,\n\tparse : http.parse,\n\tserialize : http.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"http\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\t//report missing host\n\t\tif (!components.host) {\n\t\t\tcomponents.error = components.error || \"HTTP URIs must have a host.\";\n\t\t}\n\n\t\treturn components;\n\t},\n\n\tserialize : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\tconst secure = String(components.scheme).toLowerCase() === \"https\";\n\n\t\t//normalize the default port\n\t\tif (components.port === (secure ? 443 : 80) || components.port === \"\") {\n\t\t\tcomponents.port = undefined;\n\t\t}\n\t\t\n\t\t//normalize the empty path\n\t\tif (!components.path) {\n\t\t\tcomponents.path = \"/\";\n\t\t}\n\n\t\t//NOTE: We do not parse query strings for HTTP URIs\n\t\t//as WWW Form Url Encoded query strings are part of the HTML4+ spec,\n\t\t//and not the HTTP spec.\n\n\t\treturn components;\n\t}\n};\n\nexport default handler;","/**\n * URI.js\n *\n * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.\n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/uri-js\n */\n\n/**\n * Copyright 2011 Gary Court. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *    1. Redistributions of source code must retain the above copyright notice, this list of\n *       conditions and the following disclaimer.\n *\n *    2. Redistributions in binary form must reproduce the above copyright notice, this list\n *       of conditions and the following disclaimer in the documentation and/or other materials\n *       provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation are those of the\n * authors and should not be interpreted as representing official policies, either expressed\n * or implied, of Gary Court.\n */\n\nimport URI_PROTOCOL from \"./regexps-uri\";\nimport IRI_PROTOCOL from \"./regexps-iri\";\nimport punycode from \"punycode\";\nimport { toUpperCase, typeOf, assign } from \"./util\";\n\nexport interface URIComponents {\n\tscheme?:string;\n\tuserinfo?:string;\n\thost?:string;\n\tport?:number|string;\n\tpath?:string;\n\tquery?:string;\n\tfragment?:string;\n\treference?:string;\n\terror?:string;\n}\n\nexport interface URIOptions {\n\tscheme?:string;\n\treference?:string;\n\ttolerant?:boolean;\n\tabsolutePath?:boolean;\n\tiri?:boolean;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n}\n\nexport interface URISchemeHandler<Components extends URIComponents = URIComponents, Options extends URIOptions = URIOptions, ParentComponents extends URIComponents = URIComponents> {\n\tscheme:string;\n\tparse(components:ParentComponents, options:Options):Components;\n\tserialize(components:Components, options:Options):ParentComponents;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n\tabsolutePath?:boolean;\n}\n\nexport interface URIRegExps {\n\tNOT_SCHEME : RegExp,\n\tNOT_USERINFO : RegExp,\n\tNOT_HOST : RegExp,\n\tNOT_PATH : RegExp,\n\tNOT_PATH_NOSCHEME : RegExp,\n\tNOT_QUERY : RegExp,\n\tNOT_FRAGMENT : RegExp,\n\tESCAPE : RegExp,\n\tUNRESERVED : RegExp,\n\tOTHER_CHARS : RegExp,\n\tPCT_ENCODED : RegExp,\n\tIPV4ADDRESS : RegExp,\n\tIPV6ADDRESS : RegExp,\n}\n\nexport const SCHEMES:{[scheme:string]:URISchemeHandler} = {};\n\nexport function pctEncChar(chr:string):string {\n\tconst c = chr.charCodeAt(0);\n\tlet e:string;\n\n\tif (c < 16) e = \"%0\" + c.toString(16).toUpperCase();\n\telse if (c < 128) e = \"%\" + c.toString(16).toUpperCase();\n\telse if (c < 2048) e = \"%\" + ((c >> 6) | 192).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\telse e = \"%\" + ((c >> 12) | 224).toString(16).toUpperCase() + \"%\" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\n\treturn e;\n}\n\nexport function pctDecChars(str:string):string {\n\tlet newStr = \"\";\n\tlet i = 0;\n\tconst il = str.length;\n\n\twhile (i < il) {\n\t\tconst c = parseInt(str.substr(i + 1, 2), 16);\n\n\t\tif (c < 128) {\n\t\t\tnewStr += String.fromCharCode(c);\n\t\t\ti += 3;\n\t\t}\n\t\telse if (c >= 194 && c < 224) {\n\t\t\tif ((il - i) >= 6) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 6);\n\t\t\t}\n\t\t\ti += 6;\n\t\t}\n\t\telse if (c >= 224) {\n\t\t\tif ((il - i) >= 9) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tconst c3 = parseInt(str.substr(i + 7, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 9);\n\t\t\t}\n\t\t\ti += 9;\n\t\t}\n\t\telse {\n\t\t\tnewStr += str.substr(i, 3);\n\t\t\ti += 3;\n\t\t}\n\t}\n\n\treturn newStr;\n}\n\nfunction _normalizeComponentEncoding(components:URIComponents, protocol:URIRegExps) {\n\tfunction decodeUnreserved(str:string):string {\n\t\tconst decStr = pctDecChars(str);\n\t\treturn (!decStr.match(protocol.UNRESERVED) ? str : decStr);\n\t}\n\n\tif (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, \"\");\n\tif (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\n\treturn components;\n};\n\nfunction _stripLeadingZeros(str:string):string {\n\treturn str.replace(/^0*(.*)/, \"$1\") || \"0\";\n}\n\nfunction _normalizeIPv4(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV4ADDRESS) || [];\n\tconst [, address] = matches;\n\t\n\tif (address) {\n\t\treturn address.split(\".\").map(_stripLeadingZeros).join(\".\");\n\t} else {\n\t\treturn host;\n\t}\n}\n\nfunction _normalizeIPv6(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV6ADDRESS) || [];\n\tconst [, address, zone] = matches;\n\n\tif (address) {\n\t\tconst [last, first] = address.toLowerCase().split('::').reverse();\n\t\tconst firstFields = first ? first.split(\":\").map(_stripLeadingZeros) : [];\n\t\tconst lastFields = last.split(\":\").map(_stripLeadingZeros);\n\t\tconst isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);\n\t\tconst fieldCount = isLastFieldIPv4Address ? 7 : 8;\n\t\tconst lastFieldsStart = lastFields.length - fieldCount;\n\t\tconst fields = Array<string>(fieldCount);\n\n\t\tfor (let x = 0; x < fieldCount; ++x) {\n\t\t\tfields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';\n\t\t}\n\n\t\tif (isLastFieldIPv4Address) {\n\t\t\tfields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);\n\t\t}\n\n\t\tconst allZeroFields = fields.reduce<Array<{index:number,length:number}>>((acc, field, index) => {\n\t\t\tif (!field || field === \"0\") {\n\t\t\t\tconst lastLongest = acc[acc.length - 1];\n\t\t\t\tif (lastLongest && lastLongest.index + lastLongest.length === index) {\n\t\t\t\t\tlastLongest.length++;\n\t\t\t\t} else {\n\t\t\t\t\tacc.push({ index, length : 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, []);\n\n\t\tconst longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0];\n\n\t\tlet newHost:string;\n\t\tif (longestZeroFields && longestZeroFields.length > 1) {\n\t\t\tconst newFirst = fields.slice(0, longestZeroFields.index) ;\n\t\t\tconst newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);\n\t\t\tnewHost = newFirst.join(\":\") + \"::\" + newLast.join(\":\");\n\t\t} else {\n\t\t\tnewHost = fields.join(\":\");\n\t\t}\n\n\t\tif (zone) {\n\t\t\tnewHost += \"%\" + zone;\n\t\t}\n\n\t\treturn newHost;\n\t} else {\n\t\treturn host;\n\t}\n}\n\nconst URI_PARSE = /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?(\\[[^\\/?#\\]]+\\]|[^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n|\\r)*))?/i;\nconst NO_MATCH_IS_UNDEFINED = (<RegExpMatchArray>(\"\").match(/(){0}/))[1] === undefined;\n\nexport function parse(uriString:string, options:URIOptions = {}):URIComponents {\n\tconst components:URIComponents = {};\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\n\tif (options.reference === \"suffix\") uriString = (options.scheme ? options.scheme + \":\" : \"\") + \"//\" + uriString;\n\n\tconst matches = uriString.match(URI_PARSE);\n\n\tif (matches) {\n\t\tif (NO_MATCH_IS_UNDEFINED) {\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1];\n\t\t\tcomponents.userinfo = matches[3];\n\t\t\tcomponents.host = matches[4];\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = matches[7];\n\t\t\tcomponents.fragment = matches[8];\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = matches[5];\n\t\t\t}\n\t\t} else {  //IE FIX for improper RegExp matching\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1] || undefined;\n\t\t\tcomponents.userinfo = (uriString.indexOf(\"@\") !== -1 ? matches[3] : undefined);\n\t\t\tcomponents.host = (uriString.indexOf(\"//\") !== -1 ? matches[4] : undefined);\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = (uriString.indexOf(\"?\") !== -1 ? matches[7] : undefined);\n\t\t\tcomponents.fragment = (uriString.indexOf(\"#\") !== -1 ? matches[8] : undefined);\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = (uriString.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/) ? matches[4] : undefined);\n\t\t\t}\n\t\t}\n\n\t\tif (components.host) {\n\t\t\t//normalize IP hosts\n\t\t\tcomponents.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);\n\t\t}\n\n\t\t//determine reference type\n\t\tif (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {\n\t\t\tcomponents.reference = \"same-document\";\n\t\t} else if (components.scheme === undefined) {\n\t\t\tcomponents.reference = \"relative\";\n\t\t} else if (components.fragment === undefined) {\n\t\t\tcomponents.reference = \"absolute\";\n\t\t} else {\n\t\t\tcomponents.reference = \"uri\";\n\t\t}\n\n\t\t//check for reference errors\n\t\tif (options.reference && options.reference !== \"suffix\" && options.reference !== components.reference) {\n\t\t\tcomponents.error = components.error || \"URI is not a \" + options.reference + \" reference.\";\n\t\t}\n\n\t\t//find scheme handler\n\t\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t\t//check if scheme can't handle IRIs\n\t\tif (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\n\t\t\t//if host component is a domain name\n\t\t\tif (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\tcomponents.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//convert IRI -> URI\n\t\t\t_normalizeComponentEncoding(components, URI_PROTOCOL);\n\t\t} else {\n\t\t\t//normalize encodings\n\t\t\t_normalizeComponentEncoding(components, protocol);\n\t\t}\n\n\t\t//perform scheme specific parsing\n\t\tif (schemeHandler && schemeHandler.parse) {\n\t\t\tschemeHandler.parse(components, options);\n\t\t}\n\t} else {\n\t\tcomponents.error = components.error || \"URI can not be parsed.\";\n\t}\n\n\treturn components;\n};\n\nfunction _recomposeAuthority(components:URIComponents, options:URIOptions):string|undefined {\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array<string> = [];\n\n\tif (components.userinfo !== undefined) {\n\t\turiTokens.push(components.userinfo);\n\t\turiTokens.push(\"@\");\n\t}\n\n\tif (components.host !== undefined) {\n\t\t//normalize IP hosts, add brackets and escape zone separator for IPv6\n\t\turiTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => \"[\" + $1 + ($2 ? \"%25\" + $2 : \"\") + \"]\"));\n\t}\n\n\tif (typeof components.port === \"number\" || typeof components.port === \"string\") {\n\t\turiTokens.push(\":\");\n\t\turiTokens.push(String(components.port));\n\t}\n\n\treturn uriTokens.length ? uriTokens.join(\"\") : undefined;\n};\n\nconst RDS1 = /^\\.\\.?\\//;\nconst RDS2 = /^\\/\\.(\\/|$)/;\nconst RDS3 = /^\\/\\.\\.(\\/|$)/;\nconst RDS4 = /^\\.\\.?$/;\nconst RDS5 = /^\\/?(?:.|\\n)*?(?=\\/|$)/;\n\nexport function removeDotSegments(input:string):string {\n\tconst output:Array<string> = [];\n\n\twhile (input.length) {\n\t\tif (input.match(RDS1)) {\n\t\t\tinput = input.replace(RDS1, \"\");\n\t\t} else if (input.match(RDS2)) {\n\t\t\tinput = input.replace(RDS2, \"/\");\n\t\t} else if (input.match(RDS3)) {\n\t\t\tinput = input.replace(RDS3, \"/\");\n\t\t\toutput.pop();\n\t\t} else if (input === \".\" || input === \"..\") {\n\t\t\tinput = \"\";\n\t\t} else {\n\t\t\tconst im = input.match(RDS5);\n\t\t\tif (im) {\n\t\t\t\tconst s = im[0];\n\t\t\t\tinput = input.slice(s.length);\n\t\t\t\toutput.push(s);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unexpected dot segment condition\");\n\t\t\t}\n\t\t}\n\t}\n\n\treturn output.join(\"\");\n};\n\nexport function serialize(components:URIComponents, options:URIOptions = {}):string {\n\tconst protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array<string> = [];\n\n\t//find scheme handler\n\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t//perform scheme specific serialization\n\tif (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);\n\n\tif (components.host) {\n\t\t//if host component is an IPv6 address\n\t\tif (protocol.IPV6ADDRESS.test(components.host)) {\n\t\t\t//TODO: normalize IPv6 address as per RFC 5952\n\t\t}\n\n\t\t//if host component is a domain name\n\t\telse if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) {\n\t\t\t//convert IDN via punycode\n\t\t\ttry {\n\t\t\t\tcomponents.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host));\n\t\t\t} catch (e) {\n\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t}\n\t\t}\n\t}\n\n\t//normalize encoding\n\t_normalizeComponentEncoding(components, protocol);\n\n\tif (options.reference !== \"suffix\" && components.scheme) {\n\t\turiTokens.push(components.scheme);\n\t\turiTokens.push(\":\");\n\t}\n\n\tconst authority = _recomposeAuthority(components, options);\n\tif (authority !== undefined) {\n\t\tif (options.reference !== \"suffix\") {\n\t\t\turiTokens.push(\"//\");\n\t\t}\n\n\t\turiTokens.push(authority);\n\n\t\tif (components.path && components.path.charAt(0) !== \"/\") {\n\t\t\turiTokens.push(\"/\");\n\t\t}\n\t}\n\n\tif (components.path !== undefined) {\n\t\tlet s = components.path;\n\n\t\tif (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\n\t\t\ts = removeDotSegments(s);\n\t\t}\n\n\t\tif (authority === undefined) {\n\t\t\ts = s.replace(/^\\/\\//, \"/%2F\");  //don't allow the path to start with \"//\"\n\t\t}\n\n\t\turiTokens.push(s);\n\t}\n\n\tif (components.query !== undefined) {\n\t\turiTokens.push(\"?\");\n\t\turiTokens.push(components.query);\n\t}\n\n\tif (components.fragment !== undefined) {\n\t\turiTokens.push(\"#\");\n\t\turiTokens.push(components.fragment);\n\t}\n\n\treturn uriTokens.join(\"\");  //merge tokens into a string\n};\n\nexport function resolveComponents(base:URIComponents, relative:URIComponents, options:URIOptions = {}, skipNormalization?:boolean):URIComponents {\n\tconst target:URIComponents = {};\n\n\tif (!skipNormalization) {\n\t\tbase = parse(serialize(base, options), options);  //normalize base components\n\t\trelative = parse(serialize(relative, options), options);  //normalize relative components\n\t}\n\toptions = options || {};\n\n\tif (!options.tolerant && relative.scheme) {\n\t\ttarget.scheme = relative.scheme;\n\t\t//target.authority = relative.authority;\n\t\ttarget.userinfo = relative.userinfo;\n\t\ttarget.host = relative.host;\n\t\ttarget.port = relative.port;\n\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\ttarget.query = relative.query;\n\t} else {\n\t\tif (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\n\t\t\t//target.authority = relative.authority;\n\t\t\ttarget.userinfo = relative.userinfo;\n\t\t\ttarget.host = relative.host;\n\t\t\ttarget.port = relative.port;\n\t\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\t\ttarget.query = relative.query;\n\t\t} else {\n\t\t\tif (!relative.path) {\n\t\t\t\ttarget.path = base.path;\n\t\t\t\tif (relative.query !== undefined) {\n\t\t\t\t\ttarget.query = relative.query;\n\t\t\t\t} else {\n\t\t\t\t\ttarget.query = base.query;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (relative.path.charAt(0) === \"/\") {\n\t\t\t\t\ttarget.path = removeDotSegments(relative.path);\n\t\t\t\t} else {\n\t\t\t\t\tif ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\n\t\t\t\t\t\ttarget.path = \"/\" + relative.path;\n\t\t\t\t\t} else if (!base.path) {\n\t\t\t\t\t\ttarget.path = relative.path;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.path = base.path.slice(0, base.path.lastIndexOf(\"/\") + 1) + relative.path;\n\t\t\t\t\t}\n\t\t\t\t\ttarget.path = removeDotSegments(target.path);\n\t\t\t\t}\n\t\t\t\ttarget.query = relative.query;\n\t\t\t}\n\t\t\t//target.authority = base.authority;\n\t\t\ttarget.userinfo = base.userinfo;\n\t\t\ttarget.host = base.host;\n\t\t\ttarget.port = base.port;\n\t\t}\n\t\ttarget.scheme = base.scheme;\n\t}\n\n\ttarget.fragment = relative.fragment;\n\n\treturn target;\n};\n\nexport function resolve(baseURI:string, relativeURI:string, options?:URIOptions):string {\n\tconst schemelessOptions = assign({ scheme : 'null' }, options);\n\treturn serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);\n};\n\nexport function normalize(uri:string, options?:URIOptions):string;\nexport function normalize(uri:URIComponents, options?:URIOptions):URIComponents;\nexport function normalize(uri:any, options?:URIOptions):any {\n\tif (typeof uri === \"string\") {\n\t\turi = serialize(parse(uri, options), options);\n\t} else if (typeOf(uri) === \"object\") {\n\t\turi = parse(serialize(<URIComponents>uri, options), options);\n\t}\n\n\treturn uri;\n};\n\nexport function equal(uriA:string, uriB:string, options?: URIOptions):boolean;\nexport function equal(uriA:URIComponents, uriB:URIComponents, options?:URIOptions):boolean;\nexport function equal(uriA:any, uriB:any, options?:URIOptions):boolean {\n\tif (typeof uriA === \"string\") {\n\t\turiA = serialize(parse(uriA, options), options);\n\t} else if (typeOf(uriA) === \"object\") {\n\t\turiA = serialize(<URIComponents>uriA, options);\n\t}\n\n\tif (typeof uriB === \"string\") {\n\t\turiB = serialize(parse(uriB, options), options);\n\t} else if (typeOf(uriB) === \"object\") {\n\t\turiB = serialize(<URIComponents>uriB, options);\n\t}\n\n\treturn uriA === uriB;\n};\n\nexport function escapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar);\n};\n\nexport function unescapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars);\n};\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7E]/; // non-ASCII chars\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, fn) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = fn(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(string, fn) {\n\tconst parts = string.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tstring = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tstring = string.replace(regexSeparators, '\\x2E');\n\tconst labels = string.split('.');\n\tconst encoded = map(labels, fn).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = array => String.fromCodePoint(...array);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint - 0x30 < 0x0A) {\n\t\treturn codePoint - 0x16;\n\t}\n\tif (codePoint - 0x41 < 0x1A) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint - 0x61 < 0x1A) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t//  0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tlet oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tlet inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tlet basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue == n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.1.0',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport default punycode;\n","import { URIRegExps } from \"./uri\";\nimport { buildExps } from \"./regexps-uri\";\n\nexport default buildExps(true);\n","import { URIRegExps } from \"./uri\";\nimport { merge, subexp } from \"./util\";\n\nexport function buildExps(isIRI:boolean):URIRegExps {\n\tconst\n\t\tALPHA$$ = \"[A-Za-z]\",\n\t\tCR$ = \"[\\\\x0D]\",\n\t\tDIGIT$$ = \"[0-9]\",\n\t\tDQUOTE$$ = \"[\\\\x22]\",\n\t\tHEXDIG$$ = merge(DIGIT$$, \"[A-Fa-f]\"),  //case-insensitive\n\t\tLF$$ = \"[\\\\x0A]\",\n\t\tSP$$ = \"[\\\\x20]\",\n\t\tPCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)),  //expanded\n\t\tGEN_DELIMS$$ = \"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\",\n\t\tSUB_DELIMS$$ = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",\n\t\tRESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),\n\t\tUCSCHAR$$ = isIRI ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\" : \"[]\",  //subset, excludes bidi control characters\n\t\tIPRIVATE$$ = isIRI ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\",  //subset\n\t\tUNRESERVED$$ = merge(ALPHA$$, DIGIT$$, \"[\\\\-\\\\.\\\\_\\\\~]\", UCSCHAR$$),\n\t\tSCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\") + \"*\"),\n\t\tUSERINFO$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\")) + \"*\"),\n\t\tDEC_OCTET$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"[1-9]\" + DIGIT$$) + \"|\" + DIGIT$$),\n\t\tDEC_OCTET_RELAXED$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"0?[1-9]\" + DIGIT$$) + \"|0?0?\" + DIGIT$$),  //relaxed parsing rules\n\t\tIPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$),\n\t\tH16$ = subexp(HEXDIG$$ + \"{1,4}\"),\n\t\tLS32$ = subexp(subexp(H16$ + \"\\\\:\" + H16$) + \"|\" + IPV4ADDRESS$),\n\t\tIPV6ADDRESS1$ = subexp(                                                            subexp(H16$ + \"\\\\:\") + \"{6}\" + LS32$), //                           6( h16 \":\" ) ls32\n\t\tIPV6ADDRESS2$ = subexp(                                                 \"\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{5}\" + LS32$), //                      \"::\" 5( h16 \":\" ) ls32\n\t\tIPV6ADDRESS3$ = subexp(subexp(                                 H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{4}\" + LS32$), //[               h16 ] \"::\" 4( h16 \":\" ) ls32\n\t\tIPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,1}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{3}\" + LS32$), //[ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32\n\t\tIPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,2}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{2}\" + LS32$), //[ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32\n\t\tIPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,3}\" + H16$) + \"?\\\\:\\\\:\" +        H16$ + \"\\\\:\"          + LS32$), //[ *3( h16 \":\" ) h16 ] \"::\"    h16 \":\"   ls32\n\t\tIPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,4}\" + H16$) + \"?\\\\:\\\\:\"                                + LS32$), //[ *4( h16 \":\" ) h16 ] \"::\"              ls32\n\t\tIPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,5}\" + H16$) + \"?\\\\:\\\\:\"                                + H16$ ), //[ *5( h16 \":\" ) h16 ] \"::\"              h16\n\t\tIPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,6}\" + H16$) + \"?\\\\:\\\\:\"                                       ), //[ *6( h16 \":\" ) h16 ] \"::\"\n\t\tIPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join(\"|\")),\n\t\tZONEID$ = subexp(subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$) + \"+\"),  //RFC 6874\n\t\tIPV6ADDRZ$ = subexp(IPV6ADDRESS$ + \"\\\\%25\" + ZONEID$),  //RFC 6874\n\t\tIPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + ZONEID$),  //RFC 6874, with relaxed parsing rules\n\t\tIPVFUTURE$ = subexp(\"[vV]\" + HEXDIG$$ + \"+\\\\.\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"),\n\t\tIP_LITERAL$ = subexp(\"\\\\[\" + subexp(IPV6ADDRZ_RELAXED$ + \"|\" + IPV6ADDRESS$ + \"|\" + IPVFUTURE$) + \"\\\\]\"),  //RFC 6874\n\t\tREG_NAME$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$)) + \"*\"),\n\t\tHOST$ = subexp(IP_LITERAL$ + \"|\" + IPV4ADDRESS$ + \"(?!\" + REG_NAME$ + \")\" + \"|\" + REG_NAME$),\n\t\tPORT$ = subexp(DIGIT$$ + \"*\"),\n\t\tAUTHORITY$ = subexp(subexp(USERINFO$ + \"@\") + \"?\" + HOST$ + subexp(\"\\\\:\" + PORT$) + \"?\"),\n\t\tPCHAR$ = subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@]\")),\n\t\tSEGMENT$ = subexp(PCHAR$ + \"*\"),\n\t\tSEGMENT_NZ$ = subexp(PCHAR$ + \"+\"),\n\t\tSEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\@]\")) + \"+\"),\n\t\tPATH_ABEMPTY$ = subexp(subexp(\"\\\\/\" + SEGMENT$) + \"*\"),\n\t\tPATH_ABSOLUTE$ = subexp(\"\\\\/\" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + \"?\"),  //simplified\n\t\tPATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$),  //simplified\n\t\tPATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$),  //simplified\n\t\tPATH_EMPTY$ = \"(?!\" + PCHAR$ + \")\",\n\t\tPATH$ = subexp(PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tQUERY$ = subexp(subexp(PCHAR$ + \"|\" + merge(\"[\\\\/\\\\?]\", IPRIVATE$$)) + \"*\"),\n\t\tFRAGMENT$ = subexp(subexp(PCHAR$ + \"|[\\\\/\\\\?]\") + \"*\"),\n\t\tHIER_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tURI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tRELATIVE_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$),\n\t\tRELATIVE$ = subexp(RELATIVE_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tURI_REFERENCE$ = subexp(URI$ + \"|\" + RELATIVE$),\n\t\tABSOLUTE_URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\"),\n\n\t\tGENERIC_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tRELATIVE_REF$ = \"^(){0}\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tABSOLUTE_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?$\",\n\t\tSAMEDOC_REF$ = \"^\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tAUTHORITY_REF$ = \"^\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?$\"\n\t;\n\n\treturn {\n\t\tNOT_SCHEME : new RegExp(merge(\"[^]\", ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\"), \"g\"),\n\t\tNOT_USERINFO : new RegExp(merge(\"[^\\\\%\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_HOST : new RegExp(merge(\"[^\\\\%\\\\[\\\\]\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH : new RegExp(merge(\"[^\\\\%\\\\/\\\\:\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH_NOSCHEME : new RegExp(merge(\"[^\\\\%\\\\/\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_QUERY : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\", IPRIVATE$$), \"g\"),\n\t\tNOT_FRAGMENT : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\"), \"g\"),\n\t\tESCAPE : new RegExp(merge(\"[^]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tUNRESERVED : new RegExp(UNRESERVED$$, \"g\"),\n\t\tOTHER_CHARS : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, RESERVED$$), \"g\"),\n\t\tPCT_ENCODED : new RegExp(PCT_ENCODED$, \"g\"),\n\t\tIPV4ADDRESS : new RegExp(\"^(\" + IPV4ADDRESS$ + \")$\"),\n\t\tIPV6ADDRESS : new RegExp(\"^\\\\[?(\" + IPV6ADDRESS$ + \")\" + subexp(subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + \"(\" + ZONEID$ + \")\") + \"?\\\\]?$\")  //RFC 6874, with relaxed parsing rules\n\t};\n}\n\nexport default buildExps(false);\n","export function merge(...sets:Array<string>):string {\n\tif (sets.length > 1) {\n\t\tsets[0] = sets[0].slice(0, -1);\n\t\tconst xl = sets.length - 1;\n\t\tfor (let x = 1; x < xl; ++x) {\n\t\t\tsets[x] = sets[x].slice(1, -1);\n\t\t}\n\t\tsets[xl] = sets[xl].slice(1);\n\t\treturn sets.join('');\n\t} else {\n\t\treturn sets[0];\n\t}\n}\n\nexport function subexp(str:string):string {\n\treturn \"(?:\" + str + \")\";\n}\n\nexport function typeOf(o:any):string {\n\treturn o === undefined ? \"undefined\" : (o === null ? \"null\" : Object.prototype.toString.call(o).split(\" \").pop().split(\"]\").shift().toLowerCase());\n}\n\nexport function toUpperCase(str:string):string {\n\treturn str.toUpperCase();\n}\n\nexport function toArray(obj:any):Array<any> {\n\treturn obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== \"number\" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : [];\n}\n\n\nexport function assign(target: object, source: any): any {\n\tconst obj = target as any;\n\tif (source) {\n\t\tfor (const key in source) {\n\t\t\tobj[key] = source[key];\n\t\t}\n\t}\n\treturn obj;\n}"],"names":["SCHEMES","uuid","scheme","urn","mailto","wss","ws","https","http","urnComponents","nss","uuidComponents","toLowerCase","options","error","tolerant","match","UUID","undefined","handler","uriComponents","path","nid","schemeHandler","serialize","urnScheme","parse","matches","components","URN_PARSE","query","fields","join","length","push","name","replace","PCT_ENCODED","decodeUnreserved","toUpperCase","NOT_HFNAME","pctEncChar","headers","NOT_HFVALUE","O","mailtoComponents","body","subject","to","x","localPart","domain","iri","e","punycode","toASCII","unescapeComponent","toUnicode","toAddr","slice","atIdx","NOT_LOCAL_PART","lastIndexOf","String","xl","toArray","addr","unicodeSupport","split","unknownHeaders","hfield","toAddrs","hfields","decStr","UNRESERVED","str","pctDecChars","RegExp","merge","UNRESERVED$$","SOME_DELIMS$$","ATEXT$$","VCHAR$$","PCT_ENCODED$","QTEXT$$","subexp","HEXDIG$$","isIRI","domainHost","wsComponents","fragment","resourceName","secure","port","isSecure","host","toString","URI_PROTOCOL","IRI_PROTOCOL","ESCAPE","escapeComponent","uriA","uriB","typeOf","equal","uri","normalize","resolveComponents","baseURI","schemelessOptions","relativeURI","assign","resolve","target","relative","base","userinfo","removeDotSegments","charAt","skipNormalization","uriTokens","s","authority","absolutePath","reference","_recomposeAuthority","protocol","IPV6ADDRESS","test","output","Error","input","im","RDS5","pop","RDS3","RDS2","RDS1","$1","$2","_normalizeIPv6","_normalizeIPv4","_","uriString","isNaN","indexOf","parseInt","NO_MATCH_IS_UNDEFINED","URI_PARSE","newHost","zone","newFirst","newLast","longestZeroFields","index","b","a","allZeroFields","sort","acc","lastLongest","field","reduce","fieldCount","isLastFieldIPv4Address","firstFields","lastFields","lastFieldsStart","Array","IPV4ADDRESS","last","map","_stripLeadingZeros","first","address","reverse","NOT_FRAGMENT","NOT_QUERY","NOT_PATH","NOT_PATH_NOSCHEME","NOT_HOST","NOT_USERINFO","NOT_SCHEME","_normalizeComponentEncoding","newStr","substr","i","fromCharCode","c","c2","c3","il","chr","charCodeAt","encode","decode","ucs2encode","ucs2decode","regexNonASCII","string","mapDomain","regexPunycode","n","delta","handledCPCount","adapt","handledCPCountPlusOne","basicLength","stringFromCharCode","digitToBasic","q","floor","qMinusT","baseMinusT","t","k","bias","tMin","tMax","currentValue","maxInt","m","inputLength","delimiter","initialBias","initialN","fromCodePoint","splice","out","oldi","w","digit","basicToDigit","basic","j","baseMinusTMin","skew","numPoints","firstTime","damp","flag","codePoint","array","value","extra","counter","result","encoded","labels","fn","regexSeparators","parts","RangeError","errors","type","Math","buildExps","IPV6ADDRESS$","ZONEID$","IPV4ADDRESS$","RESERVED$$","SUB_DELIMS$$","IPRIVATE$$","ALPHA$$","DIGIT$$","AUTHORITY_REF$","USERINFO$","HOST$","PORT$","SAMEDOC_REF$","FRAGMENT$","ABSOLUTE_REF$","SCHEME$","PATH_ABEMPTY$","PATH_ABSOLUTE$","PATH_ROOTLESS$","PATH_EMPTY$","QUERY$","RELATIVE_REF$","PATH_NOSCHEME$","GENERIC_REF$","ABSOLUTE_URI$","HIER_PART$","URI_REFERENCE$","URI$","RELATIVE$","RELATIVE_PART$","AUTHORITY$","PCHAR$","PATH$","SEGMENT_NZ$","SEGMENT_NZ_NC$","SEGMENT$","IP_LITERAL$","REG_NAME$","IPV6ADDRZ_RELAXED$","IPVFUTURE$","IPV6ADDRESS1$","IPV6ADDRESS2$","IPV6ADDRESS3$","IPV6ADDRESS4$","IPV6ADDRESS5$","IPV6ADDRESS6$","IPV6ADDRESS7$","IPV6ADDRESS8$","IPV6ADDRESS9$","H16$","LS32$","DEC_OCTET_RELAXED$","DEC_OCTET$","UCSCHAR$$","GEN_DELIMS$$","SP$$","DQUOTE$$","CR$","obj","key","source","setInterval","call","prototype","o","Object","shift","sets"],"mappings":"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"}/** @license URI.js v4.4.0 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r(e.URI=e.URI||{})}(this,function(e){"use strict";function r(){for(var e=arguments.length,r=Array(e),n=0;n<e;n++)r[n]=arguments[n];if(r.length>1){r[0]=r[0].slice(0,-1);for(var t=r.length-1,o=1;o<t;++o)r[o]=r[o].slice(1,-1);return r[t]=r[t].slice(1),r.join("")}return r[0]}function n(e){return"(?:"+e+")"}function t(e){return e===undefined?"undefined":null===e?"null":Object.prototype.toString.call(e).split(" ").pop().split("]").shift().toLowerCase()}function o(e){return e.toUpperCase()}function a(e){return e!==undefined&&null!==e?e instanceof Array?e:"number"!=typeof e.length||e.split||e.setInterval||e.call?[e]:Array.prototype.slice.call(e):[]}function i(e,r){var n=e;if(r)for(var t in r)n[t]=r[t];return n}function u(e){var t=r("[0-9]","[A-Fa-f]"),o=n(n("%[EFef]"+t+"%"+t+t+"%"+t+t)+"|"+n("%[89A-Fa-f]"+t+"%"+t+t)+"|"+n("%"+t+t)),a="[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]",i=r("[\\:\\/\\?\\#\\[\\]\\@]",a),u=e?"[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]":"[]",s=e?"[\\uE000-\\uF8FF]":"[]",f=r("[A-Za-z]","[0-9]","[\\-\\.\\_\\~]",u),c=n(n("25[0-5]")+"|"+n("2[0-4][0-9]")+"|"+n("1[0-9][0-9]")+"|"+n("0?[1-9][0-9]")+"|0?0?[0-9]"),p=n(c+"\\."+c+"\\."+c+"\\."+c),h=n(t+"{1,4}"),d=n(n(h+"\\:"+h)+"|"+p),l=n(n(h+"\\:")+"{6}"+d),m=n("\\:\\:"+n(h+"\\:")+"{5}"+d),g=n(n(h)+"?\\:\\:"+n(h+"\\:")+"{4}"+d),v=n(n(n(h+"\\:")+"{0,1}"+h)+"?\\:\\:"+n(h+"\\:")+"{3}"+d),E=n(n(n(h+"\\:")+"{0,2}"+h)+"?\\:\\:"+n(h+"\\:")+"{2}"+d),C=n(n(n(h+"\\:")+"{0,3}"+h)+"?\\:\\:"+h+"\\:"+d),y=n(n(n(h+"\\:")+"{0,4}"+h)+"?\\:\\:"+d),S=n(n(n(h+"\\:")+"{0,5}"+h)+"?\\:\\:"+h),A=n(n(n(h+"\\:")+"{0,6}"+h)+"?\\:\\:"),D=n([l,m,g,v,E,C,y,S,A].join("|")),w=n(n(f+"|"+o)+"+");return{NOT_SCHEME:new RegExp(r("[^]","[A-Za-z]","[0-9]","[\\+\\-\\.]"),"g"),NOT_USERINFO:new RegExp(r("[^\\%\\:]",f,a),"g"),NOT_HOST:new RegExp(r("[^\\%\\[\\]\\:]",f,a),"g"),NOT_PATH:new RegExp(r("[^\\%\\/\\:\\@]",f,a),"g"),NOT_PATH_NOSCHEME:new RegExp(r("[^\\%\\/\\@]",f,a),"g"),NOT_QUERY:new RegExp(r("[^\\%]",f,a,"[\\:\\@\\/\\?]",s),"g"),NOT_FRAGMENT:new RegExp(r("[^\\%]",f,a,"[\\:\\@\\/\\?]"),"g"),ESCAPE:new RegExp(r("[^]",f,a),"g"),UNRESERVED:new RegExp(f,"g"),OTHER_CHARS:new RegExp(r("[^\\%]",f,i),"g"),PCT_ENCODED:new RegExp(o,"g"),IPV4ADDRESS:new RegExp("^("+p+")$"),IPV6ADDRESS:new RegExp("^\\[?("+D+")"+n(n("\\%25|\\%(?!"+t+"{2})")+"("+w+")")+"?\\]?$")}}function s(e){throw new RangeError(H[e])}function f(e,r){for(var n=[],t=e.length;t--;)n[t]=r(e[t]);return n}function c(e,r){var n=e.split("@"),t="";return n.length>1&&(t=n[0]+"@",e=n[1]),e=e.replace(j,"."),t+f(e.split("."),r).join(".")}function p(e){for(var r=[],n=0,t=e.length;n<t;){var o=e.charCodeAt(n++);if(o>=55296&&o<=56319&&n<t){var a=e.charCodeAt(n++);56320==(64512&a)?r.push(((1023&o)<<10)+(1023&a)+65536):(r.push(o),n--)}else r.push(o)}return r}function h(e){var r=e.charCodeAt(0);return r<16?"%0"+r.toString(16).toUpperCase():r<128?"%"+r.toString(16).toUpperCase():r<2048?"%"+(r>>6|192).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase():"%"+(r>>12|224).toString(16).toUpperCase()+"%"+(r>>6&63|128).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase()}function d(e){for(var r="",n=0,t=e.length;n<t;){var o=parseInt(e.substr(n+1,2),16);if(o<128)r+=String.fromCharCode(o),n+=3;else if(o>=194&&o<224){if(t-n>=6){var a=parseInt(e.substr(n+4,2),16);r+=String.fromCharCode((31&o)<<6|63&a)}else r+=e.substr(n,6);n+=6}else if(o>=224){if(t-n>=9){var i=parseInt(e.substr(n+4,2),16),u=parseInt(e.substr(n+7,2),16);r+=String.fromCharCode((15&o)<<12|(63&i)<<6|63&u)}else r+=e.substr(n,9);n+=9}else r+=e.substr(n,3),n+=3}return r}function l(e,r){function n(e){var n=d(e);return n.match(r.UNRESERVED)?n:e}return e.scheme&&(e.scheme=String(e.scheme).replace(r.PCT_ENCODED,n).toLowerCase().replace(r.NOT_SCHEME,"")),e.userinfo!==undefined&&(e.userinfo=String(e.userinfo).replace(r.PCT_ENCODED,n).replace(r.NOT_USERINFO,h).replace(r.PCT_ENCODED,o)),e.host!==undefined&&(e.host=String(e.host).replace(r.PCT_ENCODED,n).toLowerCase().replace(r.NOT_HOST,h).replace(r.PCT_ENCODED,o)),e.path!==undefined&&(e.path=String(e.path).replace(r.PCT_ENCODED,n).replace(e.scheme?r.NOT_PATH:r.NOT_PATH_NOSCHEME,h).replace(r.PCT_ENCODED,o)),e.query!==undefined&&(e.query=String(e.query).replace(r.PCT_ENCODED,n).replace(r.NOT_QUERY,h).replace(r.PCT_ENCODED,o)),e.fragment!==undefined&&(e.fragment=String(e.fragment).replace(r.PCT_ENCODED,n).replace(r.NOT_FRAGMENT,h).replace(r.PCT_ENCODED,o)),e}function m(e){return e.replace(/^0*(.*)/,"$1")||"0"}function g(e,r){var n=e.match(r.IPV4ADDRESS)||[],t=T(n,2),o=t[1];return o?o.split(".").map(m).join("."):e}function v(e,r){var n=e.match(r.IPV6ADDRESS)||[],t=T(n,3),o=t[1],a=t[2];if(o){for(var i=o.toLowerCase().split("::").reverse(),u=T(i,2),s=u[0],f=u[1],c=f?f.split(":").map(m):[],p=s.split(":").map(m),h=r.IPV4ADDRESS.test(p[p.length-1]),d=h?7:8,l=p.length-d,v=Array(d),E=0;E<d;++E)v[E]=c[E]||p[l+E]||"";h&&(v[d-1]=g(v[d-1],r));var C=v.reduce(function(e,r,n){if(!r||"0"===r){var t=e[e.length-1];t&&t.index+t.length===n?t.length++:e.push({index:n,length:1})}return e},[]),y=C.sort(function(e,r){return r.length-e.length})[0],S=void 0;if(y&&y.length>1){var A=v.slice(0,y.index),D=v.slice(y.index+y.length);S=A.join(":")+"::"+D.join(":")}else S=v.join(":");return a&&(S+="%"+a),S}return e}function E(e){var r=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},n={},t=!1!==r.iri?R:F;"suffix"===r.reference&&(e=(r.scheme?r.scheme+":":"")+"//"+e);var o=e.match(K);if(o){W?(n.scheme=o[1],n.userinfo=o[3],n.host=o[4],n.port=parseInt(o[5],10),n.path=o[6]||"",n.query=o[7],n.fragment=o[8],isNaN(n.port)&&(n.port=o[5])):(n.scheme=o[1]||undefined,n.userinfo=-1!==e.indexOf("@")?o[3]:undefined,n.host=-1!==e.indexOf("//")?o[4]:undefined,n.port=parseInt(o[5],10),n.path=o[6]||"",n.query=-1!==e.indexOf("?")?o[7]:undefined,n.fragment=-1!==e.indexOf("#")?o[8]:undefined,isNaN(n.port)&&(n.port=e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?o[4]:undefined)),n.host&&(n.host=v(g(n.host,t),t)),n.scheme!==undefined||n.userinfo!==undefined||n.host!==undefined||n.port!==undefined||n.path||n.query!==undefined?n.scheme===undefined?n.reference="relative":n.fragment===undefined?n.reference="absolute":n.reference="uri":n.reference="same-document",r.reference&&"suffix"!==r.reference&&r.reference!==n.reference&&(n.error=n.error||"URI is not a "+r.reference+" reference.");var a=J[(r.scheme||n.scheme||"").toLowerCase()];if(r.unicodeSupport||a&&a.unicodeSupport)l(n,t);else{if(n.host&&(r.domainHost||a&&a.domainHost))try{n.host=B.toASCII(n.host.replace(t.PCT_ENCODED,d).toLowerCase())}catch(i){n.error=n.error||"Host's domain name can not be converted to ASCII via punycode: "+i}l(n,F)}a&&a.parse&&a.parse(n,r)}else n.error=n.error||"URI can not be parsed.";return n}function C(e,r){var n=!1!==r.iri?R:F,t=[];return e.userinfo!==undefined&&(t.push(e.userinfo),t.push("@")),e.host!==undefined&&t.push(v(g(String(e.host),n),n).replace(n.IPV6ADDRESS,function(e,r,n){return"["+r+(n?"%25"+n:"")+"]"})),"number"!=typeof e.port&&"string"!=typeof e.port||(t.push(":"),t.push(String(e.port))),t.length?t.join(""):undefined}function y(e){for(var r=[];e.length;)if(e.match(X))e=e.replace(X,"");else if(e.match(ee))e=e.replace(ee,"/");else if(e.match(re))e=e.replace(re,"/"),r.pop();else if("."===e||".."===e)e="";else{var n=e.match(ne);if(!n)throw new Error("Unexpected dot segment condition");var t=n[0];e=e.slice(t.length),r.push(t)}return r.join("")}function S(e){var r=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},n=r.iri?R:F,t=[],o=J[(r.scheme||e.scheme||"").toLowerCase()];if(o&&o.serialize&&o.serialize(e,r),e.host)if(n.IPV6ADDRESS.test(e.host));else if(r.domainHost||o&&o.domainHost)try{e.host=r.iri?B.toUnicode(e.host):B.toASCII(e.host.replace(n.PCT_ENCODED,d).toLowerCase())}catch(u){e.error=e.error||"Host's domain name can not be converted to "+(r.iri?"Unicode":"ASCII")+" via punycode: "+u}l(e,n),"suffix"!==r.reference&&e.scheme&&(t.push(e.scheme),t.push(":"));var a=C(e,r);if(a!==undefined&&("suffix"!==r.reference&&t.push("//"),t.push(a),e.path&&"/"!==e.path.charAt(0)&&t.push("/")),e.path!==undefined){var i=e.path;r.absolutePath||o&&o.absolutePath||(i=y(i)),a===undefined&&(i=i.replace(/^\/\//,"/%2F")),t.push(i)}return e.query!==undefined&&(t.push("?"),t.push(e.query)),e.fragment!==undefined&&(t.push("#"),t.push(e.fragment)),t.join("")}function A(e,r){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{},t=arguments[3],o={};return t||(e=E(S(e,n),n),r=E(S(r,n),n)),n=n||{},!n.tolerant&&r.scheme?(o.scheme=r.scheme,o.userinfo=r.userinfo,o.host=r.host,o.port=r.port,o.path=y(r.path||""),o.query=r.query):(r.userinfo!==undefined||r.host!==undefined||r.port!==undefined?(o.userinfo=r.userinfo,o.host=r.host,o.port=r.port,o.path=y(r.path||""),o.query=r.query):(r.path?("/"===r.path.charAt(0)?o.path=y(r.path):(e.userinfo===undefined&&e.host===undefined&&e.port===undefined||e.path?e.path?o.path=e.path.slice(0,e.path.lastIndexOf("/")+1)+r.path:o.path=r.path:o.path="/"+r.path,o.path=y(o.path)),o.query=r.query):(o.path=e.path,r.query!==undefined?o.query=r.query:o.query=e.query),o.userinfo=e.userinfo,o.host=e.host,o.port=e.port),o.scheme=e.scheme),o.fragment=r.fragment,o}function D(e,r,n){var t=i({scheme:"null"},n);return S(A(E(e,t),E(r,t),t,!0),t)}function w(e,r){return"string"==typeof e?e=S(E(e,r),r):"object"===t(e)&&(e=E(S(e,r),r)),e}function b(e,r,n){return"string"==typeof e?e=S(E(e,n),n):"object"===t(e)&&(e=S(e,n)),"string"==typeof r?r=S(E(r,n),n):"object"===t(r)&&(r=S(r,n)),e===r}function x(e,r){return e&&e.toString().replace(r&&r.iri?R.ESCAPE:F.ESCAPE,h)}function O(e,r){return e&&e.toString().replace(r&&r.iri?R.PCT_ENCODED:F.PCT_ENCODED,d)}function N(e){return"boolean"==typeof e.secure?e.secure:"wss"===String(e.scheme).toLowerCase()}function I(e){var r=d(e);return r.match(he)?r:e}var F=u(!1),R=u(!0),T=function(){function e(e,r){var n=[],t=!0,o=!1,a=undefined;try{for(var i,u=e[Symbol.iterator]();!(t=(i=u.next()).done)&&(n.push(i.value),!r||n.length!==r);t=!0);}catch(s){o=!0,a=s}finally{try{!t&&u["return"]&&u["return"]()}finally{if(o)throw a}}return n}return function(r,n){if(Array.isArray(r))return r;if(Symbol.iterator in Object(r))return e(r,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_=function(e){if(Array.isArray(e)){for(var r=0,n=Array(e.length);r<e.length;r++)n[r]=e[r];return n}return Array.from(e)},P=2147483647,q=/^xn--/,U=/[^\0-\x7E]/,j=/[\x2E\u3002\uFF0E\uFF61]/g,H={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},z=Math.floor,L=String.fromCharCode,$=function(e){return String.fromCodePoint.apply(String,_(e))},M=function(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:36},V=function(e,r){return e+22+75*(e<26)-((0!=r)<<5)},k=function(e,r,n){var t=0;for(e=n?z(e/700):e>>1,e+=z(e/r);e>455;t+=36)e=z(e/35);return z(t+36*e/(e+38))},Z=function(e){var r=[],n=e.length,t=0,o=128,a=72,i=e.lastIndexOf("-");i<0&&(i=0);for(var u=0;u<i;++u)e.charCodeAt(u)>=128&&s("not-basic"),r.push(e.charCodeAt(u));for(var f=i>0?i+1:0;f<n;){for(var c=t,p=1,h=36;;h+=36){f>=n&&s("invalid-input");var d=M(e.charCodeAt(f++));(d>=36||d>z((P-t)/p))&&s("overflow"),t+=d*p;var l=h<=a?1:h>=a+26?26:h-a;if(d<l)break;var m=36-l;p>z(P/m)&&s("overflow"),p*=m}var g=r.length+1;a=k(t-c,g,0==c),z(t/g)>P-o&&s("overflow"),o+=z(t/g),t%=g,r.splice(t++,0,o)}return String.fromCodePoint.apply(String,r)},G=function(e){var r=[];e=p(e);var n=e.length,t=128,o=0,a=72,i=!0,u=!1,f=undefined;try{for(var c,h=e[Symbol.iterator]();!(i=(c=h.next()).done);i=!0){var d=c.value;d<128&&r.push(L(d))}}catch(U){u=!0,f=U}finally{try{!i&&h["return"]&&h["return"]()}finally{if(u)throw f}}var l=r.length,m=l;for(l&&r.push("-");m<n;){var g=P,v=!0,E=!1,C=undefined;try{for(var y,S=e[Symbol.iterator]();!(v=(y=S.next()).done);v=!0){var A=y.value;A>=t&&A<g&&(g=A)}}catch(U){E=!0,C=U}finally{try{!v&&S["return"]&&S["return"]()}finally{if(E)throw C}}var D=m+1;g-t>z((P-o)/D)&&s("overflow"),o+=(g-t)*D,t=g;var w=!0,b=!1,x=undefined;try{for(var O,N=e[Symbol.iterator]();!(w=(O=N.next()).done);w=!0){var I=O.value;if(I<t&&++o>P&&s("overflow"),I==t){for(var F=o,R=36;;R+=36){var T=R<=a?1:R>=a+26?26:R-a;if(F<T)break;var _=F-T,q=36-T;r.push(L(V(T+_%q,0))),F=z(_/q)}r.push(L(V(F,0))),a=k(o,D,m==l),o=0,++m}}}catch(U){b=!0,x=U}finally{try{!w&&N["return"]&&N["return"]()}finally{if(b)throw x}}++o,++t}return r.join("")},Q=function(e){return c(e,function(e){return q.test(e)?Z(e.slice(4).toLowerCase()):e})},Y=function(e){return c(e,function(e){return U.test(e)?"xn--"+G(e):e})},B={version:"2.1.0",ucs2:{decode:p,encode:$},decode:Z,encode:G,toASCII:Y,toUnicode:Q},J={},K=/^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i,W="".match(/(){0}/)[1]===undefined,X=/^\.\.?\//,ee=/^\/\.(\/|$)/,re=/^\/\.\.(\/|$)/,ne=/^\/?(?:.|\n)*?(?=\/|$)/,te={scheme:"http",domainHost:!0,parse:function(e,r){return e.host||(e.error=e.error||"HTTP URIs must have a host."),e},serialize:function(e,r){var n="https"===String(e.scheme).toLowerCase();return e.port!==(n?443:80)&&""!==e.port||(e.port=undefined),e.path||(e.path="/"),e}},oe={scheme:"https",domainHost:te.domainHost,parse:te.parse,serialize:te.serialize},ae={scheme:"ws",domainHost:!0,parse:function(e,r){var n=e;return n.secure=N(n),n.resourceName=(n.path||"/")+(n.query?"?"+n.query:""),n.path=undefined,n.query=undefined,n},serialize:function(e,r){if(e.port!==(N(e)?443:80)&&""!==e.port||(e.port=undefined),"boolean"==typeof e.secure&&(e.scheme=e.secure?"wss":"ws",e.secure=undefined),e.resourceName){var n=e.resourceName.split("?"),t=T(n,2),o=t[0],a=t[1];e.path=o&&"/"!==o?o:undefined,e.query=a,e.resourceName=undefined}return e.fragment=undefined,e}},ie={scheme:"wss",domainHost:ae.domainHost,parse:ae.parse,serialize:ae.serialize},ue={},se="[A-Za-z0-9\\-\\.\\_\\~\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]",fe="[0-9A-Fa-f]",ce=n(n("%[EFef][0-9A-Fa-f]%"+fe+fe+"%"+fe+fe)+"|"+n("%[89A-Fa-f][0-9A-Fa-f]%"+fe+fe)+"|"+n("%"+fe+fe)),pe=r("[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]",'[\\"\\\\]'),he=new RegExp(se,"g"),de=new RegExp(ce,"g"),le=new RegExp(r("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',pe),"g"),me=new RegExp(r("[^]",se,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),ge=me,ve={scheme:"mailto",parse:function(e,r){var n=e,t=n.to=n.path?n.path.split(","):[];if(n.path=undefined,n.query){for(var o=!1,a={},i=n.query.split("&"),u=0,s=i.length;u<s;++u){var f=i[u].split("=");switch(f[0]){case"to":for(var c=f[1].split(","),p=0,h=c.length;p<h;++p)t.push(c[p]);break;case"subject":n.subject=O(f[1],r);break;case"body":n.body=O(f[1],r);break;default:o=!0,a[O(f[0],r)]=O(f[1],r)}}o&&(n.headers=a)}n.query=undefined;for(var d=0,l=t.length;d<l;++d){var m=t[d].split("@");if(m[0]=O(m[0]),r.unicodeSupport)m[1]=O(m[1],r).toLowerCase();else try{m[1]=B.toASCII(O(m[1],r).toLowerCase())}catch(g){n.error=n.error||"Email address's domain name can not be converted to ASCII via punycode: "+g}t[d]=m.join("@")}return n},serialize:function(e,r){var n=e,t=a(e.to);if(t){for(var i=0,u=t.length;i<u;++i){var s=String(t[i]),f=s.lastIndexOf("@"),c=s.slice(0,f).replace(de,I).replace(de,o).replace(le,h),p=s.slice(f+1);try{p=r.iri?B.toUnicode(p):B.toASCII(O(p,r).toLowerCase())}catch(g){n.error=n.error||"Email address's domain name can not be converted to "+(r.iri?"Unicode":"ASCII")+" via punycode: "+g}t[i]=c+"@"+p}n.path=t.join(",")}var d=e.headers=e.headers||{};e.subject&&(d.subject=e.subject),e.body&&(d.body=e.body);var l=[];for(var m in d)d[m]!==ue[m]&&l.push(m.replace(de,I).replace(de,o).replace(me,h)+"="+d[m].replace(de,I).replace(de,o).replace(ge,h));return l.length&&(n.query=l.join("&")),n}},Ee=/^([^\:]+)\:(.*)/,Ce={scheme:"urn",parse:function(e,r){var n=e.path&&e.path.match(Ee),t=e;if(n){var o=r.scheme||t.scheme||"urn",a=n[1].toLowerCase(),i=n[2],u=o+":"+(r.nid||a),s=J[u];t.nid=a,t.nss=i,t.path=undefined,s&&(t=s.parse(t,r))}else t.error=t.error||"URN can not be parsed.";return t},serialize:function(e,r){var n=r.scheme||e.scheme||"urn",t=e.nid,o=n+":"+(r.nid||t),a=J[o];a&&(e=a.serialize(e,r));var i=e,u=e.nss;return i.path=(t||r.nid)+":"+u,i}},ye=/^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/,Se={scheme:"urn:uuid",parse:function(e,r){var n=e;return n.uuid=n.nss,n.nss=undefined,r.tolerant||n.uuid&&n.uuid.match(ye)||(n.error=n.error||"UUID is not valid."),n},serialize:function(e,r){var n=e;return n.nss=(e.uuid||"").toLowerCase(),n}};J[te.scheme]=te,J[oe.scheme]=oe,J[ae.scheme]=ae,J[ie.scheme]=ie,J[ve.scheme]=ve,J[Ce.scheme]=Ce,J[Se.scheme]=Se,e.SCHEMES=J,e.pctEncChar=h,e.pctDecChars=d,e.parse=E,e.removeDotSegments=y,e.serialize=S,e.resolveComponents=A,e.resolve=D,e.normalize=w,e.equal=b,e.escapeComponent=x,e.unescapeComponent=O,Object.defineProperty(e,"__esModule",{value:!0})});
//# sourceMappingURL=uri.all.min.js.map{"version":3,"sources":["../../src/util.ts","../../src/regexps-uri.ts","../../node_modules/punycode/punycode.es6.js","../../src/uri.ts","../../src/schemes/ws.ts","../../src/schemes/mailto.ts","../../src/regexps-iri.ts","../../src/schemes/http.ts","../../src/schemes/https.ts","../../src/schemes/wss.ts","../../src/schemes/urn.ts","../../src/schemes/urn-uuid.ts","../../src/index.ts"],"names":["merge","sets","Array","_len","_key","arguments","length","slice","xl","x","join","subexp","str","typeOf","o","undefined","Object","prototype","toString","call","split","pop","shift","toLowerCase","toUpperCase","toArray","obj","setInterval","assign","target","source","key","buildExps","isIRI","HEXDIG$$","PCT_ENCODED$","SUB_DELIMS$$","RESERVED$$","UCSCHAR$$","DEC_OCTET_RELAXED$","H16$","LS32$","IPV4ADDRESS$","IPV6ADDRESS1$","IPV6ADDRESS2$","IPV6ADDRESS3$","IPV6ADDRESS4$","IPV6ADDRESS5$","IPV6ADDRESS6$","IPV6ADDRESS7$","IPV6ADDRESS8$","IPV6ADDRESS9$","ZONEID$","UNRESERVED$$","RegExp","IPRIVATE$$","IPV6ADDRESS$","error","type","RangeError","errors","map","array","fn","result","mapDomain","string","parts","replace","regexSeparators","ucs2decode","output","counter","value","charCodeAt","extra","push","pctEncChar","chr","c","pctDecChars","newStr","i","il","parseInt","substr","String","fromCharCode","c2","c3","_normalizeComponentEncoding","components","protocol","decodeUnreserved","decStr","match","UNRESERVED","scheme","PCT_ENCODED","NOT_SCHEME","userinfo","NOT_USERINFO","host","NOT_HOST","path","NOT_PATH","NOT_PATH_NOSCHEME","query","NOT_QUERY","fragment","NOT_FRAGMENT","_stripLeadingZeros","_normalizeIPv4","matches","IPV4ADDRESS","address","_matches","_normalizeIPv6","IPV6ADDRESS","_matches2","zone","reverse","last","_address$toLowerCase$2","first","firstFields","lastFields","isLastFieldIPv4Address","test","fieldCount","lastFieldsStart","fields","allZeroFields","reduce","acc","field","index","lastLongest","longestZeroFields","sort","a","b","newHost","newFirst","newLast","parse","uriString","options","iri","IRI_PROTOCOL","URI_PROTOCOL","reference","URI_PARSE","NO_MATCH_IS_UNDEFINED","port","isNaN","indexOf","schemeHandler","SCHEMES","unicodeSupport","domainHost","punycode","toASCII","e","_recomposeAuthority","uriTokens","_","$1","$2","removeDotSegments","input","RDS1","RDS2","RDS3","im","RDS5","Error","s","serialize","toUnicode","authority","charAt","absolutePath","resolveComponents","base","relative","skipNormalization","tolerant","lastIndexOf","resolve","baseURI","relativeURI","schemelessOptions","normalize","uri","equal","uriA","uriB","escapeComponent","ESCAPE","unescapeComponent","isSecure","wsComponents","secure","maxInt","regexPunycode","regexNonASCII","floor","Math","stringFromCharCode","ucs2encode","fromCodePoint","apply","toConsumableArray","basicToDigit","codePoint","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","k","baseMinusTMin","decode","inputLength","n","bias","basic","j","oldi","w","t","baseMinusT","out","splice","encode","_step","Symbol","iterator","_iteratorNormalCompletion","_iterator","next","done","currentValue","basicLength","handledCPCount","m","_step2","_iteratorNormalCompletion2","_iterator2","handledCPCountPlusOne","_step3","_iteratorNormalCompletion3","_iterator3","q","qMinusT","handler","http","resourceName","_wsComponents$resourc2","ws","O","VCHAR$$","NOT_LOCAL_PART","NOT_HFNAME","NOT_HFVALUE","mailtoComponents","to","unknownHeaders","headers","hfields","hfield","toAddrs","subject","body","addr","toAddr","atIdx","localPart","domain","name","URN_PARSE","urnComponents","nid","nss","urnScheme","uriComponents","UUID","uuidComponents","uuid","https","wss","mailto","urn"],"mappings":"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","file":"dist/es5/uri.all.min.js","sourcesContent":["export function merge(...sets:Array<string>):string {\n\tif (sets.length > 1) {\n\t\tsets[0] = sets[0].slice(0, -1);\n\t\tconst xl = sets.length - 1;\n\t\tfor (let x = 1; x < xl; ++x) {\n\t\t\tsets[x] = sets[x].slice(1, -1);\n\t\t}\n\t\tsets[xl] = sets[xl].slice(1);\n\t\treturn sets.join('');\n\t} else {\n\t\treturn sets[0];\n\t}\n}\n\nexport function subexp(str:string):string {\n\treturn \"(?:\" + str + \")\";\n}\n\nexport function typeOf(o:any):string {\n\treturn o === undefined ? \"undefined\" : (o === null ? \"null\" : Object.prototype.toString.call(o).split(\" \").pop().split(\"]\").shift().toLowerCase());\n}\n\nexport function toUpperCase(str:string):string {\n\treturn str.toUpperCase();\n}\n\nexport function toArray(obj:any):Array<any> {\n\treturn obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== \"number\" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : [];\n}\n\n\nexport function assign(target: object, source: any): any {\n\tconst obj = target as any;\n\tif (source) {\n\t\tfor (const key in source) {\n\t\t\tobj[key] = source[key];\n\t\t}\n\t}\n\treturn obj;\n}","import { URIRegExps } from \"./uri\";\nimport { merge, subexp } from \"./util\";\n\nexport function buildExps(isIRI:boolean):URIRegExps {\n\tconst\n\t\tALPHA$$ = \"[A-Za-z]\",\n\t\tCR$ = \"[\\\\x0D]\",\n\t\tDIGIT$$ = \"[0-9]\",\n\t\tDQUOTE$$ = \"[\\\\x22]\",\n\t\tHEXDIG$$ = merge(DIGIT$$, \"[A-Fa-f]\"),  //case-insensitive\n\t\tLF$$ = \"[\\\\x0A]\",\n\t\tSP$$ = \"[\\\\x20]\",\n\t\tPCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)),  //expanded\n\t\tGEN_DELIMS$$ = \"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\",\n\t\tSUB_DELIMS$$ = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",\n\t\tRESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),\n\t\tUCSCHAR$$ = isIRI ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\" : \"[]\",  //subset, excludes bidi control characters\n\t\tIPRIVATE$$ = isIRI ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\",  //subset\n\t\tUNRESERVED$$ = merge(ALPHA$$, DIGIT$$, \"[\\\\-\\\\.\\\\_\\\\~]\", UCSCHAR$$),\n\t\tSCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\") + \"*\"),\n\t\tUSERINFO$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\")) + \"*\"),\n\t\tDEC_OCTET$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"[1-9]\" + DIGIT$$) + \"|\" + DIGIT$$),\n\t\tDEC_OCTET_RELAXED$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"0?[1-9]\" + DIGIT$$) + \"|0?0?\" + DIGIT$$),  //relaxed parsing rules\n\t\tIPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$),\n\t\tH16$ = subexp(HEXDIG$$ + \"{1,4}\"),\n\t\tLS32$ = subexp(subexp(H16$ + \"\\\\:\" + H16$) + \"|\" + IPV4ADDRESS$),\n\t\tIPV6ADDRESS1$ = subexp(                                                            subexp(H16$ + \"\\\\:\") + \"{6}\" + LS32$), //                           6( h16 \":\" ) ls32\n\t\tIPV6ADDRESS2$ = subexp(                                                 \"\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{5}\" + LS32$), //                      \"::\" 5( h16 \":\" ) ls32\n\t\tIPV6ADDRESS3$ = subexp(subexp(                                 H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{4}\" + LS32$), //[               h16 ] \"::\" 4( h16 \":\" ) ls32\n\t\tIPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,1}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{3}\" + LS32$), //[ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32\n\t\tIPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,2}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{2}\" + LS32$), //[ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32\n\t\tIPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,3}\" + H16$) + \"?\\\\:\\\\:\" +        H16$ + \"\\\\:\"          + LS32$), //[ *3( h16 \":\" ) h16 ] \"::\"    h16 \":\"   ls32\n\t\tIPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,4}\" + H16$) + \"?\\\\:\\\\:\"                                + LS32$), //[ *4( h16 \":\" ) h16 ] \"::\"              ls32\n\t\tIPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,5}\" + H16$) + \"?\\\\:\\\\:\"                                + H16$ ), //[ *5( h16 \":\" ) h16 ] \"::\"              h16\n\t\tIPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,6}\" + H16$) + \"?\\\\:\\\\:\"                                       ), //[ *6( h16 \":\" ) h16 ] \"::\"\n\t\tIPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join(\"|\")),\n\t\tZONEID$ = subexp(subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$) + \"+\"),  //RFC 6874\n\t\tIPV6ADDRZ$ = subexp(IPV6ADDRESS$ + \"\\\\%25\" + ZONEID$),  //RFC 6874\n\t\tIPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + ZONEID$),  //RFC 6874, with relaxed parsing rules\n\t\tIPVFUTURE$ = subexp(\"[vV]\" + HEXDIG$$ + \"+\\\\.\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"),\n\t\tIP_LITERAL$ = subexp(\"\\\\[\" + subexp(IPV6ADDRZ_RELAXED$ + \"|\" + IPV6ADDRESS$ + \"|\" + IPVFUTURE$) + \"\\\\]\"),  //RFC 6874\n\t\tREG_NAME$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$)) + \"*\"),\n\t\tHOST$ = subexp(IP_LITERAL$ + \"|\" + IPV4ADDRESS$ + \"(?!\" + REG_NAME$ + \")\" + \"|\" + REG_NAME$),\n\t\tPORT$ = subexp(DIGIT$$ + \"*\"),\n\t\tAUTHORITY$ = subexp(subexp(USERINFO$ + \"@\") + \"?\" + HOST$ + subexp(\"\\\\:\" + PORT$) + \"?\"),\n\t\tPCHAR$ = subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@]\")),\n\t\tSEGMENT$ = subexp(PCHAR$ + \"*\"),\n\t\tSEGMENT_NZ$ = subexp(PCHAR$ + \"+\"),\n\t\tSEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\@]\")) + \"+\"),\n\t\tPATH_ABEMPTY$ = subexp(subexp(\"\\\\/\" + SEGMENT$) + \"*\"),\n\t\tPATH_ABSOLUTE$ = subexp(\"\\\\/\" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + \"?\"),  //simplified\n\t\tPATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$),  //simplified\n\t\tPATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$),  //simplified\n\t\tPATH_EMPTY$ = \"(?!\" + PCHAR$ + \")\",\n\t\tPATH$ = subexp(PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tQUERY$ = subexp(subexp(PCHAR$ + \"|\" + merge(\"[\\\\/\\\\?]\", IPRIVATE$$)) + \"*\"),\n\t\tFRAGMENT$ = subexp(subexp(PCHAR$ + \"|[\\\\/\\\\?]\") + \"*\"),\n\t\tHIER_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tURI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tRELATIVE_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$),\n\t\tRELATIVE$ = subexp(RELATIVE_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tURI_REFERENCE$ = subexp(URI$ + \"|\" + RELATIVE$),\n\t\tABSOLUTE_URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\"),\n\n\t\tGENERIC_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tRELATIVE_REF$ = \"^(){0}\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tABSOLUTE_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?$\",\n\t\tSAMEDOC_REF$ = \"^\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tAUTHORITY_REF$ = \"^\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?$\"\n\t;\n\n\treturn {\n\t\tNOT_SCHEME : new RegExp(merge(\"[^]\", ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\"), \"g\"),\n\t\tNOT_USERINFO : new RegExp(merge(\"[^\\\\%\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_HOST : new RegExp(merge(\"[^\\\\%\\\\[\\\\]\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH : new RegExp(merge(\"[^\\\\%\\\\/\\\\:\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH_NOSCHEME : new RegExp(merge(\"[^\\\\%\\\\/\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_QUERY : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\", IPRIVATE$$), \"g\"),\n\t\tNOT_FRAGMENT : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\"), \"g\"),\n\t\tESCAPE : new RegExp(merge(\"[^]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tUNRESERVED : new RegExp(UNRESERVED$$, \"g\"),\n\t\tOTHER_CHARS : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, RESERVED$$), \"g\"),\n\t\tPCT_ENCODED : new RegExp(PCT_ENCODED$, \"g\"),\n\t\tIPV4ADDRESS : new RegExp(\"^(\" + IPV4ADDRESS$ + \")$\"),\n\t\tIPV6ADDRESS : new RegExp(\"^\\\\[?(\" + IPV6ADDRESS$ + \")\" + subexp(subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + \"(\" + ZONEID$ + \")\") + \"?\\\\]?$\")  //RFC 6874, with relaxed parsing rules\n\t};\n}\n\nexport default buildExps(false);\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7E]/; // non-ASCII chars\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, fn) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = fn(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(string, fn) {\n\tconst parts = string.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tstring = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tstring = string.replace(regexSeparators, '\\x2E');\n\tconst labels = string.split('.');\n\tconst encoded = map(labels, fn).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = array => String.fromCodePoint(...array);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint - 0x30 < 0x0A) {\n\t\treturn codePoint - 0x16;\n\t}\n\tif (codePoint - 0x41 < 0x1A) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint - 0x61 < 0x1A) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t//  0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tlet oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tlet inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tlet basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue == n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.1.0',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport default punycode;\n","/**\n * URI.js\n *\n * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.\n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/uri-js\n */\n\n/**\n * Copyright 2011 Gary Court. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *    1. Redistributions of source code must retain the above copyright notice, this list of\n *       conditions and the following disclaimer.\n *\n *    2. Redistributions in binary form must reproduce the above copyright notice, this list\n *       of conditions and the following disclaimer in the documentation and/or other materials\n *       provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation are those of the\n * authors and should not be interpreted as representing official policies, either expressed\n * or implied, of Gary Court.\n */\n\nimport URI_PROTOCOL from \"./regexps-uri\";\nimport IRI_PROTOCOL from \"./regexps-iri\";\nimport punycode from \"punycode\";\nimport { toUpperCase, typeOf, assign } from \"./util\";\n\nexport interface URIComponents {\n\tscheme?:string;\n\tuserinfo?:string;\n\thost?:string;\n\tport?:number|string;\n\tpath?:string;\n\tquery?:string;\n\tfragment?:string;\n\treference?:string;\n\terror?:string;\n}\n\nexport interface URIOptions {\n\tscheme?:string;\n\treference?:string;\n\ttolerant?:boolean;\n\tabsolutePath?:boolean;\n\tiri?:boolean;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n}\n\nexport interface URISchemeHandler<Components extends URIComponents = URIComponents, Options extends URIOptions = URIOptions, ParentComponents extends URIComponents = URIComponents> {\n\tscheme:string;\n\tparse(components:ParentComponents, options:Options):Components;\n\tserialize(components:Components, options:Options):ParentComponents;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n\tabsolutePath?:boolean;\n}\n\nexport interface URIRegExps {\n\tNOT_SCHEME : RegExp,\n\tNOT_USERINFO : RegExp,\n\tNOT_HOST : RegExp,\n\tNOT_PATH : RegExp,\n\tNOT_PATH_NOSCHEME : RegExp,\n\tNOT_QUERY : RegExp,\n\tNOT_FRAGMENT : RegExp,\n\tESCAPE : RegExp,\n\tUNRESERVED : RegExp,\n\tOTHER_CHARS : RegExp,\n\tPCT_ENCODED : RegExp,\n\tIPV4ADDRESS : RegExp,\n\tIPV6ADDRESS : RegExp,\n}\n\nexport const SCHEMES:{[scheme:string]:URISchemeHandler} = {};\n\nexport function pctEncChar(chr:string):string {\n\tconst c = chr.charCodeAt(0);\n\tlet e:string;\n\n\tif (c < 16) e = \"%0\" + c.toString(16).toUpperCase();\n\telse if (c < 128) e = \"%\" + c.toString(16).toUpperCase();\n\telse if (c < 2048) e = \"%\" + ((c >> 6) | 192).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\telse e = \"%\" + ((c >> 12) | 224).toString(16).toUpperCase() + \"%\" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\n\treturn e;\n}\n\nexport function pctDecChars(str:string):string {\n\tlet newStr = \"\";\n\tlet i = 0;\n\tconst il = str.length;\n\n\twhile (i < il) {\n\t\tconst c = parseInt(str.substr(i + 1, 2), 16);\n\n\t\tif (c < 128) {\n\t\t\tnewStr += String.fromCharCode(c);\n\t\t\ti += 3;\n\t\t}\n\t\telse if (c >= 194 && c < 224) {\n\t\t\tif ((il - i) >= 6) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 6);\n\t\t\t}\n\t\t\ti += 6;\n\t\t}\n\t\telse if (c >= 224) {\n\t\t\tif ((il - i) >= 9) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tconst c3 = parseInt(str.substr(i + 7, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 9);\n\t\t\t}\n\t\t\ti += 9;\n\t\t}\n\t\telse {\n\t\t\tnewStr += str.substr(i, 3);\n\t\t\ti += 3;\n\t\t}\n\t}\n\n\treturn newStr;\n}\n\nfunction _normalizeComponentEncoding(components:URIComponents, protocol:URIRegExps) {\n\tfunction decodeUnreserved(str:string):string {\n\t\tconst decStr = pctDecChars(str);\n\t\treturn (!decStr.match(protocol.UNRESERVED) ? str : decStr);\n\t}\n\n\tif (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, \"\");\n\tif (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\n\treturn components;\n};\n\nfunction _stripLeadingZeros(str:string):string {\n\treturn str.replace(/^0*(.*)/, \"$1\") || \"0\";\n}\n\nfunction _normalizeIPv4(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV4ADDRESS) || [];\n\tconst [, address] = matches;\n\t\n\tif (address) {\n\t\treturn address.split(\".\").map(_stripLeadingZeros).join(\".\");\n\t} else {\n\t\treturn host;\n\t}\n}\n\nfunction _normalizeIPv6(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV6ADDRESS) || [];\n\tconst [, address, zone] = matches;\n\n\tif (address) {\n\t\tconst [last, first] = address.toLowerCase().split('::').reverse();\n\t\tconst firstFields = first ? first.split(\":\").map(_stripLeadingZeros) : [];\n\t\tconst lastFields = last.split(\":\").map(_stripLeadingZeros);\n\t\tconst isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);\n\t\tconst fieldCount = isLastFieldIPv4Address ? 7 : 8;\n\t\tconst lastFieldsStart = lastFields.length - fieldCount;\n\t\tconst fields = Array<string>(fieldCount);\n\n\t\tfor (let x = 0; x < fieldCount; ++x) {\n\t\t\tfields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';\n\t\t}\n\n\t\tif (isLastFieldIPv4Address) {\n\t\t\tfields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);\n\t\t}\n\n\t\tconst allZeroFields = fields.reduce<Array<{index:number,length:number}>>((acc, field, index) => {\n\t\t\tif (!field || field === \"0\") {\n\t\t\t\tconst lastLongest = acc[acc.length - 1];\n\t\t\t\tif (lastLongest && lastLongest.index + lastLongest.length === index) {\n\t\t\t\t\tlastLongest.length++;\n\t\t\t\t} else {\n\t\t\t\t\tacc.push({ index, length : 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, []);\n\n\t\tconst longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0];\n\n\t\tlet newHost:string;\n\t\tif (longestZeroFields && longestZeroFields.length > 1) {\n\t\t\tconst newFirst = fields.slice(0, longestZeroFields.index) ;\n\t\t\tconst newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);\n\t\t\tnewHost = newFirst.join(\":\") + \"::\" + newLast.join(\":\");\n\t\t} else {\n\t\t\tnewHost = fields.join(\":\");\n\t\t}\n\n\t\tif (zone) {\n\t\t\tnewHost += \"%\" + zone;\n\t\t}\n\n\t\treturn newHost;\n\t} else {\n\t\treturn host;\n\t}\n}\n\nconst URI_PARSE = /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?(\\[[^\\/?#\\]]+\\]|[^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n|\\r)*))?/i;\nconst NO_MATCH_IS_UNDEFINED = (<RegExpMatchArray>(\"\").match(/(){0}/))[1] === undefined;\n\nexport function parse(uriString:string, options:URIOptions = {}):URIComponents {\n\tconst components:URIComponents = {};\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\n\tif (options.reference === \"suffix\") uriString = (options.scheme ? options.scheme + \":\" : \"\") + \"//\" + uriString;\n\n\tconst matches = uriString.match(URI_PARSE);\n\n\tif (matches) {\n\t\tif (NO_MATCH_IS_UNDEFINED) {\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1];\n\t\t\tcomponents.userinfo = matches[3];\n\t\t\tcomponents.host = matches[4];\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = matches[7];\n\t\t\tcomponents.fragment = matches[8];\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = matches[5];\n\t\t\t}\n\t\t} else {  //IE FIX for improper RegExp matching\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1] || undefined;\n\t\t\tcomponents.userinfo = (uriString.indexOf(\"@\") !== -1 ? matches[3] : undefined);\n\t\t\tcomponents.host = (uriString.indexOf(\"//\") !== -1 ? matches[4] : undefined);\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = (uriString.indexOf(\"?\") !== -1 ? matches[7] : undefined);\n\t\t\tcomponents.fragment = (uriString.indexOf(\"#\") !== -1 ? matches[8] : undefined);\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = (uriString.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/) ? matches[4] : undefined);\n\t\t\t}\n\t\t}\n\n\t\tif (components.host) {\n\t\t\t//normalize IP hosts\n\t\t\tcomponents.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);\n\t\t}\n\n\t\t//determine reference type\n\t\tif (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {\n\t\t\tcomponents.reference = \"same-document\";\n\t\t} else if (components.scheme === undefined) {\n\t\t\tcomponents.reference = \"relative\";\n\t\t} else if (components.fragment === undefined) {\n\t\t\tcomponents.reference = \"absolute\";\n\t\t} else {\n\t\t\tcomponents.reference = \"uri\";\n\t\t}\n\n\t\t//check for reference errors\n\t\tif (options.reference && options.reference !== \"suffix\" && options.reference !== components.reference) {\n\t\t\tcomponents.error = components.error || \"URI is not a \" + options.reference + \" reference.\";\n\t\t}\n\n\t\t//find scheme handler\n\t\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t\t//check if scheme can't handle IRIs\n\t\tif (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\n\t\t\t//if host component is a domain name\n\t\t\tif (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\tcomponents.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//convert IRI -> URI\n\t\t\t_normalizeComponentEncoding(components, URI_PROTOCOL);\n\t\t} else {\n\t\t\t//normalize encodings\n\t\t\t_normalizeComponentEncoding(components, protocol);\n\t\t}\n\n\t\t//perform scheme specific parsing\n\t\tif (schemeHandler && schemeHandler.parse) {\n\t\t\tschemeHandler.parse(components, options);\n\t\t}\n\t} else {\n\t\tcomponents.error = components.error || \"URI can not be parsed.\";\n\t}\n\n\treturn components;\n};\n\nfunction _recomposeAuthority(components:URIComponents, options:URIOptions):string|undefined {\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array<string> = [];\n\n\tif (components.userinfo !== undefined) {\n\t\turiTokens.push(components.userinfo);\n\t\turiTokens.push(\"@\");\n\t}\n\n\tif (components.host !== undefined) {\n\t\t//normalize IP hosts, add brackets and escape zone separator for IPv6\n\t\turiTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => \"[\" + $1 + ($2 ? \"%25\" + $2 : \"\") + \"]\"));\n\t}\n\n\tif (typeof components.port === \"number\" || typeof components.port === \"string\") {\n\t\turiTokens.push(\":\");\n\t\turiTokens.push(String(components.port));\n\t}\n\n\treturn uriTokens.length ? uriTokens.join(\"\") : undefined;\n};\n\nconst RDS1 = /^\\.\\.?\\//;\nconst RDS2 = /^\\/\\.(\\/|$)/;\nconst RDS3 = /^\\/\\.\\.(\\/|$)/;\nconst RDS4 = /^\\.\\.?$/;\nconst RDS5 = /^\\/?(?:.|\\n)*?(?=\\/|$)/;\n\nexport function removeDotSegments(input:string):string {\n\tconst output:Array<string> = [];\n\n\twhile (input.length) {\n\t\tif (input.match(RDS1)) {\n\t\t\tinput = input.replace(RDS1, \"\");\n\t\t} else if (input.match(RDS2)) {\n\t\t\tinput = input.replace(RDS2, \"/\");\n\t\t} else if (input.match(RDS3)) {\n\t\t\tinput = input.replace(RDS3, \"/\");\n\t\t\toutput.pop();\n\t\t} else if (input === \".\" || input === \"..\") {\n\t\t\tinput = \"\";\n\t\t} else {\n\t\t\tconst im = input.match(RDS5);\n\t\t\tif (im) {\n\t\t\t\tconst s = im[0];\n\t\t\t\tinput = input.slice(s.length);\n\t\t\t\toutput.push(s);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unexpected dot segment condition\");\n\t\t\t}\n\t\t}\n\t}\n\n\treturn output.join(\"\");\n};\n\nexport function serialize(components:URIComponents, options:URIOptions = {}):string {\n\tconst protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array<string> = [];\n\n\t//find scheme handler\n\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t//perform scheme specific serialization\n\tif (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);\n\n\tif (components.host) {\n\t\t//if host component is an IPv6 address\n\t\tif (protocol.IPV6ADDRESS.test(components.host)) {\n\t\t\t//TODO: normalize IPv6 address as per RFC 5952\n\t\t}\n\n\t\t//if host component is a domain name\n\t\telse if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) {\n\t\t\t//convert IDN via punycode\n\t\t\ttry {\n\t\t\t\tcomponents.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host));\n\t\t\t} catch (e) {\n\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t}\n\t\t}\n\t}\n\n\t//normalize encoding\n\t_normalizeComponentEncoding(components, protocol);\n\n\tif (options.reference !== \"suffix\" && components.scheme) {\n\t\turiTokens.push(components.scheme);\n\t\turiTokens.push(\":\");\n\t}\n\n\tconst authority = _recomposeAuthority(components, options);\n\tif (authority !== undefined) {\n\t\tif (options.reference !== \"suffix\") {\n\t\t\turiTokens.push(\"//\");\n\t\t}\n\n\t\turiTokens.push(authority);\n\n\t\tif (components.path && components.path.charAt(0) !== \"/\") {\n\t\t\turiTokens.push(\"/\");\n\t\t}\n\t}\n\n\tif (components.path !== undefined) {\n\t\tlet s = components.path;\n\n\t\tif (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\n\t\t\ts = removeDotSegments(s);\n\t\t}\n\n\t\tif (authority === undefined) {\n\t\t\ts = s.replace(/^\\/\\//, \"/%2F\");  //don't allow the path to start with \"//\"\n\t\t}\n\n\t\turiTokens.push(s);\n\t}\n\n\tif (components.query !== undefined) {\n\t\turiTokens.push(\"?\");\n\t\turiTokens.push(components.query);\n\t}\n\n\tif (components.fragment !== undefined) {\n\t\turiTokens.push(\"#\");\n\t\turiTokens.push(components.fragment);\n\t}\n\n\treturn uriTokens.join(\"\");  //merge tokens into a string\n};\n\nexport function resolveComponents(base:URIComponents, relative:URIComponents, options:URIOptions = {}, skipNormalization?:boolean):URIComponents {\n\tconst target:URIComponents = {};\n\n\tif (!skipNormalization) {\n\t\tbase = parse(serialize(base, options), options);  //normalize base components\n\t\trelative = parse(serialize(relative, options), options);  //normalize relative components\n\t}\n\toptions = options || {};\n\n\tif (!options.tolerant && relative.scheme) {\n\t\ttarget.scheme = relative.scheme;\n\t\t//target.authority = relative.authority;\n\t\ttarget.userinfo = relative.userinfo;\n\t\ttarget.host = relative.host;\n\t\ttarget.port = relative.port;\n\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\ttarget.query = relative.query;\n\t} else {\n\t\tif (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\n\t\t\t//target.authority = relative.authority;\n\t\t\ttarget.userinfo = relative.userinfo;\n\t\t\ttarget.host = relative.host;\n\t\t\ttarget.port = relative.port;\n\t\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\t\ttarget.query = relative.query;\n\t\t} else {\n\t\t\tif (!relative.path) {\n\t\t\t\ttarget.path = base.path;\n\t\t\t\tif (relative.query !== undefined) {\n\t\t\t\t\ttarget.query = relative.query;\n\t\t\t\t} else {\n\t\t\t\t\ttarget.query = base.query;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (relative.path.charAt(0) === \"/\") {\n\t\t\t\t\ttarget.path = removeDotSegments(relative.path);\n\t\t\t\t} else {\n\t\t\t\t\tif ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\n\t\t\t\t\t\ttarget.path = \"/\" + relative.path;\n\t\t\t\t\t} else if (!base.path) {\n\t\t\t\t\t\ttarget.path = relative.path;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.path = base.path.slice(0, base.path.lastIndexOf(\"/\") + 1) + relative.path;\n\t\t\t\t\t}\n\t\t\t\t\ttarget.path = removeDotSegments(target.path);\n\t\t\t\t}\n\t\t\t\ttarget.query = relative.query;\n\t\t\t}\n\t\t\t//target.authority = base.authority;\n\t\t\ttarget.userinfo = base.userinfo;\n\t\t\ttarget.host = base.host;\n\t\t\ttarget.port = base.port;\n\t\t}\n\t\ttarget.scheme = base.scheme;\n\t}\n\n\ttarget.fragment = relative.fragment;\n\n\treturn target;\n};\n\nexport function resolve(baseURI:string, relativeURI:string, options?:URIOptions):string {\n\tconst schemelessOptions = assign({ scheme : 'null' }, options);\n\treturn serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);\n};\n\nexport function normalize(uri:string, options?:URIOptions):string;\nexport function normalize(uri:URIComponents, options?:URIOptions):URIComponents;\nexport function normalize(uri:any, options?:URIOptions):any {\n\tif (typeof uri === \"string\") {\n\t\turi = serialize(parse(uri, options), options);\n\t} else if (typeOf(uri) === \"object\") {\n\t\turi = parse(serialize(<URIComponents>uri, options), options);\n\t}\n\n\treturn uri;\n};\n\nexport function equal(uriA:string, uriB:string, options?: URIOptions):boolean;\nexport function equal(uriA:URIComponents, uriB:URIComponents, options?:URIOptions):boolean;\nexport function equal(uriA:any, uriB:any, options?:URIOptions):boolean {\n\tif (typeof uriA === \"string\") {\n\t\turiA = serialize(parse(uriA, options), options);\n\t} else if (typeOf(uriA) === \"object\") {\n\t\turiA = serialize(<URIComponents>uriA, options);\n\t}\n\n\tif (typeof uriB === \"string\") {\n\t\turiB = serialize(parse(uriB, options), options);\n\t} else if (typeOf(uriB) === \"object\") {\n\t\turiB = serialize(<URIComponents>uriB, options);\n\t}\n\n\treturn uriA === uriB;\n};\n\nexport function escapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar);\n};\n\nexport function unescapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars);\n};\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nexport interface WSComponents extends URIComponents {\n\tresourceName?: string;\n\tsecure?: boolean;\n}\n\nfunction isSecure(wsComponents:WSComponents):boolean {\n\treturn typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === \"wss\";\n}\n\n//RFC 6455\nconst handler:URISchemeHandler = {\n\tscheme : \"ws\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):WSComponents {\n\t\tconst wsComponents = components as WSComponents;\n\n\t\t//indicate if the secure flag is set\n\t\twsComponents.secure = isSecure(wsComponents);\n\n\t\t//construct resouce name\n\t\twsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');\n\t\twsComponents.path = undefined;\n\t\twsComponents.query = undefined;\n\n\t\treturn wsComponents;\n\t},\n\n\tserialize : function (wsComponents:WSComponents, options:URIOptions):URIComponents {\n\t\t//normalize the default port\n\t\tif (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === \"\") {\n\t\t\twsComponents.port = undefined;\n\t\t}\n\n\t\t//ensure scheme matches secure flag\n\t\tif (typeof wsComponents.secure === 'boolean') {\n\t\t\twsComponents.scheme = (wsComponents.secure ? 'wss' : 'ws');\n\t\t\twsComponents.secure = undefined;\n\t\t}\n\n\t\t//reconstruct path from resource name\n\t\tif (wsComponents.resourceName) {\n\t\t\tconst [path, query] = wsComponents.resourceName.split('?');\n\t\t\twsComponents.path = (path && path !== '/' ? path : undefined);\n\t\t\twsComponents.query = query;\n\t\t\twsComponents.resourceName = undefined;\n\t\t}\n\n\t\t//forbid fragment component\n\t\twsComponents.fragment = undefined;\n\n\t\treturn wsComponents;\n\t}\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, pctDecChars, unescapeComponent } from \"../uri\";\nimport punycode from \"punycode\";\nimport { merge, subexp, toUpperCase, toArray } from \"../util\";\n\nexport interface MailtoHeaders {\n\t[hfname:string]:string\n}\n\nexport interface MailtoComponents extends URIComponents {\n\tto:Array<string>,\n\theaders?:MailtoHeaders,\n\tsubject?:string,\n\tbody?:string\n}\n\nconst O:MailtoHeaders = {};\nconst isIRI = true;\n\n//RFC 3986\nconst UNRESERVED$$ = \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\" + (isIRI ? \"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\" : \"\") + \"]\";\nconst HEXDIG$$ = \"[0-9A-Fa-f]\";  //case-insensitive\nconst PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$));  //expanded\n\n//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =\n//const ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\#\\\\$\\\\%\\\\&\\\\'\\\\*\\\\+\\\\-\\\\/\\\\=\\\\?\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QTEXT$$ = \"[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F]\";  //(%d1-8 / %d11-12 / %d14-31 / %d127)\n//const QTEXT$$ = merge(\"[\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7E]\", OBS_QTEXT$$);  //%d33 / %d35-91 / %d93-126 / obs-qtext\n//const VCHAR$$ = \"[\\\\x21-\\\\x7E]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QP$ = subexp(\"\\\\\\\\\" + merge(\"[\\\\x00\\\\x0D\\\\x0A]\", OBS_QTEXT$$));  //%d0 / CR / LF / obs-qtext\n//const FWS$ = subexp(subexp(WSP$$ + \"*\" + \"\\\\x0D\\\\x0A\") + \"?\" + WSP$$ + \"+\");\n//const QUOTED_PAIR$ = subexp(subexp(\"\\\\\\\\\" + subexp(VCHAR$$ + \"|\" + WSP$$)) + \"|\" + OBS_QP$);\n//const QUOTED_STRING$ = subexp('\\\\\"' + subexp(FWS$ + \"?\" + QCONTENT$) + \"*\" + FWS$ + \"?\" + '\\\\\"');\nconst ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\nconst QTEXT$$ = \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\";\nconst VCHAR$$ = merge(QTEXT$$, \"[\\\\\\\"\\\\\\\\]\");\nconst DOT_ATOM_TEXT$ = subexp(ATEXT$$ + \"+\" + subexp(\"\\\\.\" + ATEXT$$ + \"+\") + \"*\");\nconst QUOTED_PAIR$ = subexp(\"\\\\\\\\\" + VCHAR$$);\nconst QCONTENT$ = subexp(QTEXT$$ + \"|\" + QUOTED_PAIR$);\nconst QUOTED_STRING$ = subexp('\\\\\"' + QCONTENT$ + \"*\" + '\\\\\"');\n\n//RFC 6068\nconst DTEXT_NO_OBS$$ = \"[\\\\x21-\\\\x5A\\\\x5E-\\\\x7E]\";  //%d33-90 / %d94-126\nconst SOME_DELIMS$$ = \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\";\nconst QCHAR$ = subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$ + \"|\" + SOME_DELIMS$$);\nconst DOMAIN$ = subexp(DOT_ATOM_TEXT$ + \"|\" + \"\\\\[\" + DTEXT_NO_OBS$$ + \"*\" + \"\\\\]\");\nconst LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + \"|\" + QUOTED_STRING$);\nconst ADDR_SPEC$ = subexp(LOCAL_PART$ + \"\\\\@\" + DOMAIN$);\nconst TO$ = subexp(ADDR_SPEC$ + subexp(\"\\\\,\" + ADDR_SPEC$) + \"*\");\nconst HFNAME$ = subexp(QCHAR$ + \"*\");\nconst HFVALUE$ = HFNAME$;\nconst HFIELD$ = subexp(HFNAME$ + \"\\\\=\" + HFVALUE$);\nconst HFIELDS2$ = subexp(HFIELD$ + subexp(\"\\\\&\" + HFIELD$) + \"*\");\nconst HFIELDS$ = subexp(\"\\\\?\" + HFIELDS2$);\nconst MAILTO_URI = new RegExp(\"^mailto\\\\:\" + TO$ + \"?\" + HFIELDS$ + \"?$\");\n\nconst UNRESERVED = new RegExp(UNRESERVED$$, \"g\");\nconst PCT_ENCODED = new RegExp(PCT_ENCODED$, \"g\");\nconst NOT_LOCAL_PART = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", '[\\\\\"]', VCHAR$$), \"g\");\nconst NOT_DOMAIN = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", \"[\\\\[]\", DTEXT_NO_OBS$$, \"[\\\\]]\"), \"g\");\nconst NOT_HFNAME = new RegExp(merge(\"[^]\", UNRESERVED$$, SOME_DELIMS$$), \"g\");\nconst NOT_HFVALUE = NOT_HFNAME;\nconst TO = new RegExp(\"^\" + TO$ + \"$\");\nconst HFIELDS = new RegExp(\"^\" + HFIELDS2$ + \"$\");\n\nfunction decodeUnreserved(str:string):string {\n\tconst decStr = pctDecChars(str);\n\treturn (!decStr.match(UNRESERVED) ? str : decStr);\n}\n\nconst handler:URISchemeHandler<MailtoComponents> =  {\n\tscheme : \"mailto\",\n\n\tparse : function (components:URIComponents, options:URIOptions):MailtoComponents {\n\t\tconst mailtoComponents = components as MailtoComponents;\n\t\tconst to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(\",\") : []);\n\t\tmailtoComponents.path = undefined;\n\n\t\tif (mailtoComponents.query) {\n\t\t\tlet unknownHeaders = false\n\t\t\tconst headers:MailtoHeaders = {};\n\t\t\tconst hfields = mailtoComponents.query.split(\"&\");\n\n\t\t\tfor (let x = 0, xl = hfields.length; x < xl; ++x) {\n\t\t\t\tconst hfield = hfields[x].split(\"=\");\n\n\t\t\t\tswitch (hfield[0]) {\n\t\t\t\t\tcase \"to\":\n\t\t\t\t\t\tconst toAddrs = hfield[1].split(\",\");\n\t\t\t\t\t\tfor (let x = 0, xl = toAddrs.length; x < xl; ++x) {\n\t\t\t\t\t\t\tto.push(toAddrs[x]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"subject\":\n\t\t\t\t\t\tmailtoComponents.subject = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"body\":\n\t\t\t\t\t\tmailtoComponents.body = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tunknownHeaders = true;\n\t\t\t\t\t\theaders[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (unknownHeaders) mailtoComponents.headers = headers;\n\t\t}\n\n\t\tmailtoComponents.query = undefined;\n\n\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\tconst addr = to[x].split(\"@\");\n\n\t\t\taddr[0] = unescapeComponent(addr[0]);\n\n\t\t\tif (!options.unicodeSupport) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\taddr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tmailtoComponents.error = mailtoComponents.error || \"Email address's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddr[1] = unescapeComponent(addr[1], options).toLowerCase();\n\t\t\t}\n\n\t\t\tto[x] = addr.join(\"@\");\n\t\t}\n\n\t\treturn mailtoComponents;\n\t},\n\n\tserialize : function (mailtoComponents:MailtoComponents, options:URIOptions):URIComponents {\n\t\tconst components = mailtoComponents as URIComponents;\n\t\tconst to = toArray(mailtoComponents.to);\n\t\tif (to) {\n\t\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\t\tconst toAddr = String(to[x]);\n\t\t\t\tconst atIdx = toAddr.lastIndexOf(\"@\");\n\t\t\t\tconst localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);\n\t\t\t\tlet domain = toAddr.slice(atIdx + 1);\n\n\t\t\t\t//convert IDN via punycode\n\t\t\t\ttry {\n\t\t\t\t\tdomain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Email address's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t\t}\n\n\t\t\t\tto[x] = localPart + \"@\" + domain;\n\t\t\t}\n\n\t\t\tcomponents.path = to.join(\",\");\n\t\t}\n\n\t\tconst headers = mailtoComponents.headers = mailtoComponents.headers || {};\n\n\t\tif (mailtoComponents.subject) headers[\"subject\"] = mailtoComponents.subject;\n\t\tif (mailtoComponents.body) headers[\"body\"] = mailtoComponents.body;\n\n\t\tconst fields = [];\n\t\tfor (const name in headers) {\n\t\t\tif (headers[name] !== O[name]) {\n\t\t\t\tfields.push(\n\t\t\t\t\tname.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) +\n\t\t\t\t\t\"=\" +\n\t\t\t\t\theaders[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (fields.length) {\n\t\t\tcomponents.query = fields.join(\"&\");\n\t\t}\n\n\t\treturn components;\n\t}\n}\n\nexport default handler;","import { URIRegExps } from \"./uri\";\nimport { buildExps } from \"./regexps-uri\";\n\nexport default buildExps(true);\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"http\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\t//report missing host\n\t\tif (!components.host) {\n\t\t\tcomponents.error = components.error || \"HTTP URIs must have a host.\";\n\t\t}\n\n\t\treturn components;\n\t},\n\n\tserialize : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\tconst secure = String(components.scheme).toLowerCase() === \"https\";\n\n\t\t//normalize the default port\n\t\tif (components.port === (secure ? 443 : 80) || components.port === \"\") {\n\t\t\tcomponents.port = undefined;\n\t\t}\n\t\t\n\t\t//normalize the empty path\n\t\tif (!components.path) {\n\t\t\tcomponents.path = \"/\";\n\t\t}\n\n\t\t//NOTE: We do not parse query strings for HTTP URIs\n\t\t//as WWW Form Url Encoded query strings are part of the HTML4+ spec,\n\t\t//and not the HTTP spec.\n\n\t\treturn components;\n\t}\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport http from \"./http\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"https\",\n\tdomainHost : http.domainHost,\n\tparse : http.parse,\n\tserialize : http.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport ws from \"./ws\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"wss\",\n\tdomainHost : ws.domainHost,\n\tparse : ws.parse,\n\tserialize : ws.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, SCHEMES } from \"../uri\";\n\nexport interface URNComponents extends URIComponents {\n\tnid?:string;\n\tnss?:string;\n}\n\nexport interface URNOptions extends URIOptions {\n\tnid?:string;\n}\n\nconst NID$ = \"(?:[0-9A-Za-z][0-9A-Za-z\\\\-]{1,31})\";\nconst PCT_ENCODED$ = \"(?:\\\\%[0-9A-Fa-f]{2})\";\nconst TRANS$$ = \"[0-9A-Za-z\\\\(\\\\)\\\\+\\\\,\\\\-\\\\.\\\\:\\\\=\\\\@\\\\;\\\\$\\\\_\\\\!\\\\*\\\\'\\\\/\\\\?\\\\#]\";\nconst NSS$ = \"(?:(?:\" + PCT_ENCODED$ + \"|\" + TRANS$$ + \")+)\";\nconst URN_SCHEME = new RegExp(\"^urn\\\\:(\" + NID$ + \")$\");\nconst URN_PATH = new RegExp(\"^(\" + NID$ + \")\\\\:(\" + NSS$ + \")$\");\nconst URN_PARSE = /^([^\\:]+)\\:(.*)/;\nconst URN_EXCLUDED = /[\\x00-\\x20\\\\\\\"\\&\\<\\>\\[\\]\\^\\`\\{\\|\\}\\~\\x7F-\\xFF]/g;\n\n//RFC 2141\nconst handler:URISchemeHandler<URNComponents,URNOptions> = {\n\tscheme : \"urn\",\n\n\tparse : function (components:URIComponents, options:URNOptions):URNComponents {\n\t\tconst matches = components.path && components.path.match(URN_PARSE);\n\t\tlet urnComponents = components as URNComponents;\n\n\t\tif (matches) {\n\t\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\t\tconst nid = matches[1].toLowerCase();\n\t\t\tconst nss = matches[2];\n\t\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\t\turnComponents.nid = nid;\n\t\t\turnComponents.nss = nss;\n\t\t\turnComponents.path = undefined;\n\n\t\t\tif (schemeHandler) {\n\t\t\t\turnComponents = schemeHandler.parse(urnComponents, options) as URNComponents;\n\t\t\t}\n\t\t} else {\n\t\t\turnComponents.error = urnComponents.error || \"URN can not be parsed.\";\n\t\t}\n\n\t\treturn urnComponents;\n\t},\n\n\tserialize : function (urnComponents:URNComponents, options:URNOptions):URIComponents {\n\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\tconst nid = urnComponents.nid;\n\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\tif (schemeHandler) {\n\t\t\turnComponents = schemeHandler.serialize(urnComponents, options) as URNComponents;\n\t\t}\n\n\t\tconst uriComponents = urnComponents as URIComponents;\n\t\tconst nss = urnComponents.nss;\n\t\turiComponents.path = `${nid || options.nid}:${nss}`;\n\n\t\treturn uriComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { URNComponents } from \"./urn\";\nimport { SCHEMES } from \"../uri\";\n\nexport interface UUIDComponents extends URNComponents {\n\tuuid?: string;\n}\n\nconst UUID = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;\nconst UUID_PARSE = /^[0-9A-Fa-f\\-]{36}/;\n\n//RFC 4122\nconst handler:URISchemeHandler<UUIDComponents, URIOptions, URNComponents> = {\n\tscheme : \"urn:uuid\",\n\n\tparse : function (urnComponents:URNComponents, options:URIOptions):UUIDComponents {\n\t\tconst uuidComponents = urnComponents as UUIDComponents;\n\t\tuuidComponents.uuid = uuidComponents.nss;\n\t\tuuidComponents.nss = undefined;\n\n\t\tif (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {\n\t\t\tuuidComponents.error = uuidComponents.error || \"UUID is not valid.\";\n\t\t}\n\n\t\treturn uuidComponents;\n\t},\n\n\tserialize : function (uuidComponents:UUIDComponents, options:URIOptions):URNComponents {\n\t\tconst urnComponents = uuidComponents as URNComponents;\n\t\t//normalize UUID\n\t\turnComponents.nss = (uuidComponents.uuid || \"\").toLowerCase();\n\t\treturn urnComponents;\n\t},\n};\n\nexport default handler;","import { SCHEMES } from \"./uri\";\n\nimport http from \"./schemes/http\";\nSCHEMES[http.scheme] = http;\n\nimport https from \"./schemes/https\";\nSCHEMES[https.scheme] = https;\n\nimport ws from \"./schemes/ws\";\nSCHEMES[ws.scheme] = ws;\n\nimport wss from \"./schemes/wss\";\nSCHEMES[wss.scheme] = wss;\n\nimport mailto from \"./schemes/mailto\";\nSCHEMES[mailto.scheme] = mailto;\n\nimport urn from \"./schemes/urn\";\nSCHEMES[urn.scheme] = urn;\n\nimport uuid from \"./schemes/urn-uuid\";\nSCHEMES[uuid.scheme] = uuid;\n\nexport * from \"./uri\";\n"]}[submodule "vendor/big-list-of-naughty-strings"]
	path = vendor/big-list-of-naughty-strings
	url = https://github.com/minimaxir/big-list-of-naughty-strings.git
Carl Xiong <xiongc05@gmail.com>
Parsha Pourkhomami <parshap@gmail.com>
'use strict';

function isHighSurrogate(codePoint) {
  return codePoint >= 0xd800 && codePoint <= 0xdbff;
}

function isLowSurrogate(codePoint) {
  return codePoint >= 0xdc00 && codePoint <= 0xdfff;
}

// Truncate string by size in bytes
module.exports = function getByteLength(string) {
  if (typeof string !== "string") {
    throw new Error("Input must be string");
  }

  var charLength = string.length;
  var byteLength = 0;
  var codePoint = null;
  var prevCodePoint = null;
  for (var i = 0; i < charLength; i++) {
    codePoint = string.charCodeAt(i);
    // handle 4-byte non-BMP chars
    // low surrogate
    if (isLowSurrogate(codePoint)) {
      // when parsing previous hi-surrogate, 3 is added to byteLength
      if (prevCodePoint != null && isHighSurrogate(prevCodePoint)) {
        byteLength += 1;
      }
      else {
        byteLength += 3;
      }
    }
    else if (codePoint <= 0x7f ) {
      byteLength += 1;
    }
    else if (codePoint >= 0x80 && codePoint <= 0x7ff) {
      byteLength += 2;
    }
    else if (codePoint >= 0x800 && codePoint <= 0xffff) {
      byteLength += 3;
    }
    prevCodePoint = codePoint;
  }

  return byteLength;
};
"use strict";

module.exports = function getByteLength(string) {
  if (typeof string !== "string") {
    throw new Error("Input must be string");
  }
  return Buffer.byteLength(string, "utf8");
};
{
  "author": {
    "name": "Carl Xiong",
    "email": "xiongc05@gmail.com"
  },
  "browser": "browser.js",
  "deprecated": false,
  "description": "Get utf8 byte length of string",
  "devDependencies": {
    "tape": "^4.2.2"
  },
  "homepage": "https://github.com/parshap/utf8-byte-length#readme",
  "license": "WTFPL",
  "main": "index.js",
  "name": "utf8-byte-length",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/parshap/utf8-byte-length.git"
  },
  "version": "1.0.4"
}
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
var parse = require('spdx-expression-parse');
var correct = require('spdx-correct');

var genericWarning = (
  'license should be ' +
  'a valid SPDX license expression (without "LicenseRef"), ' +
  '"UNLICENSED", or ' +
  '"SEE LICENSE IN <filename>"'
);

var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/;

function startsWith(prefix, string) {
  return string.slice(0, prefix.length) === prefix;
}

function usesLicenseRef(ast) {
  if (ast.hasOwnProperty('license')) {
    var license = ast.license;
    return (
      startsWith('LicenseRef', license) ||
      startsWith('DocumentRef', license)
    );
  } else {
    return (
      usesLicenseRef(ast.left) ||
      usesLicenseRef(ast.right)
    );
  }
}

module.exports = function(argument) {
  var ast;

  try {
    ast = parse(argument);
  } catch (e) {
    var match
    if (
      argument === 'UNLICENSED' ||
      argument === 'UNLICENCED'
    ) {
      return {
        validForOldPackages: true,
        validForNewPackages: true,
        unlicensed: true
      };
    } else if (match = fileReferenceRE.exec(argument)) {
      return {
        validForOldPackages: true,
        validForNewPackages: true,
        inFile: match[1]
      };
    } else {
      var result = {
        validForOldPackages: false,
        validForNewPackages: false,
        warnings: [genericWarning]
      };
      if (argument.trim().length !== 0) {
        var corrected = correct(argument);
        if (corrected) {
          result.warnings.push(
            'license is similar to the valid expression "' + corrected + '"'
          );
        }
      }
      return result;
    }
  }

  if (usesLicenseRef(ast)) {
    return {
      validForNewPackages: false,
      validForOldPackages: false,
      spdx: true,
      warnings: [genericWarning]
    };
  } else {
    return {
      validForNewPackages: true,
      validForOldPackages: true,
      spdx: true
    };
  }
};
{
  "author": {
    "name": "Kyle E. Mitchell",
    "email": "kyle@kemitchell.com",
    "url": "https://kemitchell.com"
  },
  "dependencies": {
    "spdx-correct": "^3.0.0",
    "spdx-expression-parse": "^3.0.0"
  },
  "deprecated": false,
  "description": "Give me a string and I'll tell you if it's a valid npm package license string",
  "devDependencies": {
    "defence-cli": "^2.0.1",
    "replace-require-self": "^1.0.0"
  },
  "homepage": "https://github.com/kemitchell/validate-npm-package-license.js#readme",
  "license": "Apache-2.0",
  "name": "validate-npm-package-license",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/kemitchell/validate-npm-package-license.js.git"
  },
  "version": "3.0.4"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me"
  },
  "bin": {
    "which": "./bin/which"
  },
  "dependencies": {
    "isexe": "^2.0.0"
  },
  "deprecated": false,
  "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.",
  "devDependencies": {
    "mkdirp": "^0.5.0",
    "rimraf": "^2.6.2",
    "tap": "^12.0.1"
  },
  "files": [
    "which.js",
    "bin/which"
  ],
  "homepage": "https://github.com/isaacs/node-which#readme",
  "license": "ISC",
  "main": "which.js",
  "name": "which",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/node-which.git"
  },
  "version": "1.3.1"
}module.exports = which
which.sync = whichSync

var isWindows = process.platform === 'win32' ||
    process.env.OSTYPE === 'cygwin' ||
    process.env.OSTYPE === 'msys'

var path = require('path')
var COLON = isWindows ? ';' : ':'
var isexe = require('isexe')

function getNotFoundError (cmd) {
  var er = new Error('not found: ' + cmd)
  er.code = 'ENOENT'

  return er
}

function getPathInfo (cmd, opt) {
  var colon = opt.colon || COLON
  var pathEnv = opt.path || process.env.PATH || ''
  var pathExt = ['']

  pathEnv = pathEnv.split(colon)

  var pathExtExe = ''
  if (isWindows) {
    pathEnv.unshift(process.cwd())
    pathExtExe = (opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM')
    pathExt = pathExtExe.split(colon)


    // Always test the cmd itself first.  isexe will check to make sure
    // it's found in the pathExt set.
    if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')
      pathExt.unshift('')
  }

  // If it has a slash, then we don't bother searching the pathenv.
  // just check the file itself, and that's it.
  if (cmd.match(/\//) || isWindows && cmd.match(/\\/))
    pathEnv = ['']

  return {
    env: pathEnv,
    ext: pathExt,
    extExe: pathExtExe
  }
}

function which (cmd, opt, cb) {
  if (typeof opt === 'function') {
    cb = opt
    opt = {}
  }

  var info = getPathInfo(cmd, opt)
  var pathEnv = info.env
  var pathExt = info.ext
  var pathExtExe = info.extExe
  var found = []

  ;(function F (i, l) {
    if (i === l) {
      if (opt.all && found.length)
        return cb(null, found)
      else
        return cb(getNotFoundError(cmd))
    }

    var pathPart = pathEnv[i]
    if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"')
      pathPart = pathPart.slice(1, -1)

    var p = path.join(pathPart, cmd)
    if (!pathPart && (/^\.[\\\/]/).test(cmd)) {
      p = cmd.slice(0, 2) + p
    }
    ;(function E (ii, ll) {
      if (ii === ll) return F(i + 1, l)
      var ext = pathExt[ii]
      isexe(p + ext, { pathExt: pathExtExe }, function (er, is) {
        if (!er && is) {
          if (opt.all)
            found.push(p + ext)
          else
            return cb(null, p + ext)
        }
        return E(ii + 1, ll)
      })
    })(0, pathExt.length)
  })(0, pathEnv.length)
}

function whichSync (cmd, opt) {
  opt = opt || {}

  var info = getPathInfo(cmd, opt)
  var pathEnv = info.env
  var pathExt = info.ext
  var pathExtExe = info.extExe
  var found = []

  for (var i = 0, l = pathEnv.length; i < l; i ++) {
    var pathPart = pathEnv[i]
    if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"')
      pathPart = pathPart.slice(1, -1)

    var p = path.join(pathPart, cmd)
    if (!pathPart && /^\.[\\\/]/.test(cmd)) {
      p = cmd.slice(0, 2) + p
    }
    for (var j = 0, ll = pathExt.length; j < ll; j ++) {
      var cur = p + pathExt[j]
      var is
      try {
        is = isexe.sync(cur, { pathExt: pathExtExe })
        if (is) {
          if (opt.all)
            found.push(cur)
          else
            return cur
        }
      } catch (ex) {}
    }
  }

  if (opt.all && found.length)
    return found

  if (opt.nothrow)
    return null

  throw getNotFoundError(cmd)
}
#!/usr/bin/env node
var which = require("../")
if (process.argv.length < 3)
  usage()

function usage () {
  console.error('usage: which [-as] program ...')
  process.exit(1)
}

var all = false
var silent = false
var dashdash = false
var args = process.argv.slice(2).filter(function (arg) {
  if (dashdash || !/^-/.test(arg))
    return true

  if (arg === '--') {
    dashdash = true
    return false
  }

  var flags = arg.substr(1).split('')
  for (var f = 0; f < flags.length; f++) {
    var flag = flags[f]
    switch (flag) {
      case 's':
        silent = true
        break
      case 'a':
        all = true
        break
      default:
        console.error('which: illegal option -- ' + flag)
        usage()
    }
  }
  return false
})

process.exit(args.reduce(function (pv, current) {
  try {
    var f = which.sync(current, { all: all })
    if (all)
      f = f.join('\n')
    if (!silent)
      console.log(f)
    return pv;
  } catch (e) {
    return 1;
  }
}, 0))
The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Callback wrapping utility",
  "devDependencies": {
    "tap": "^2.3.1"
  },
  "directories": {
    "test": "test"
  },
  "files": [
    "wrappy.js"
  ],
  "homepage": "https://github.com/npm/wrappy",
  "license": "ISC",
  "main": "wrappy.js",
  "name": "wrappy",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/wrappy.git"
  },
  "version": "1.0.2"
}// Returns a wrapper function that returns a wrapped callback
// The wrapper function should do some stuff, and return a
// presumably different callback function.
// This makes sure that own properties are retained, so that
// decorations and such are not lost along the way.
module.exports = wrappy
function wrappy (fn, cb) {
  if (fn && cb) return wrappy(fn)(cb)

  if (typeof fn !== 'function')
    throw new TypeError('need wrapper function')

  Object.keys(fn).forEach(function (k) {
    wrapper[k] = fn[k]
  })

  return wrapper

  function wrapper() {
    var args = new Array(arguments.length)
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i]
    }
    var ret = fn.apply(this, args)
    var cb = args[args.length-1]
    if (typeof ret === 'function' && ret !== cb) {
      Object.keys(cb).forEach(function (k) {
        ret[k] = cb[k]
      })
    }
    return ret
  }
}
'use strict';
const os = require('os');
const path = require('path');

const home = os.homedir();
const env = process.env;

exports.data = env.XDG_DATA_HOME ||
	(home ? path.join(home, '.local', 'share') : null);

exports.config = env.XDG_CONFIG_HOME ||
	(home ? path.join(home, '.config') : null);

exports.cache = env.XDG_CACHE_HOME || (home ? path.join(home, '.cache') : null);

exports.runtime = env.XDG_RUNTIME_DIR || null;

exports.dataDirs = (env.XDG_DATA_DIRS || '/usr/local/share/:/usr/share/').split(':');

if (exports.data) {
	exports.dataDirs.unshift(exports.data);
}

exports.configDirs = (env.XDG_CONFIG_DIRS || '/etc/xdg').split(':');

if (exports.config) {
	exports.configDirs.unshift(exports.config);
}
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Get XDG Base Directory paths",
  "devDependencies": {
    "ava": "*",
    "require-uncached": "^1.0.2",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/xdg-basedir#readme",
  "license": "MIT",
  "name": "xdg-basedir",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/xdg-basedir.git"
  },
  "version": "3.0.0"
}The MIT License (MIT)

Copyright (c) 2013 Ozgur Ozcitak

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Ozgur Ozcitak",
    "email": "oozcitak@gmail.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "An XML builder for node.js",
  "devDependencies": {
    "coffee-coverage": "2.*",
    "coffeescript": "1.*",
    "coveralls": "*",
    "istanbul": "*",
    "mocha": "*"
  },
  "engines": {
    "node": ">=4.0"
  },
  "homepage": "http://github.com/oozcitak/xmlbuilder-js",
  "license": "MIT",
  "main": "./lib/index",
  "name": "xmlbuilder",
  "repository": {
    "type": "git",
    "url": "git://github.com/oozcitak/xmlbuilder-js.git"
  },
  "version": "9.0.7"
}// Generated by CoffeeScript 1.12.7
(function() {
  var assign, isArray, isEmpty, isFunction, isObject, isPlainObject,
    slice = [].slice,
    hasProp = {}.hasOwnProperty;

  assign = function() {
    var i, key, len, source, sources, target;
    target = arguments[0], sources = 2 <= arguments.length ? slice.call(arguments, 1) : [];
    if (isFunction(Object.assign)) {
      Object.assign.apply(null, arguments);
    } else {
      for (i = 0, len = sources.length; i < len; i++) {
        source = sources[i];
        if (source != null) {
          for (key in source) {
            if (!hasProp.call(source, key)) continue;
            target[key] = source[key];
          }
        }
      }
    }
    return target;
  };

  isFunction = function(val) {
    return !!val && Object.prototype.toString.call(val) === '[object Function]';
  };

  isObject = function(val) {
    var ref;
    return !!val && ((ref = typeof val) === 'function' || ref === 'object');
  };

  isArray = function(val) {
    if (isFunction(Array.isArray)) {
      return Array.isArray(val);
    } else {
      return Object.prototype.toString.call(val) === '[object Array]';
    }
  };

  isEmpty = function(val) {
    var key;
    if (isArray(val)) {
      return !val.length;
    } else {
      for (key in val) {
        if (!hasProp.call(val, key)) continue;
        return false;
      }
      return true;
    }
  };

  isPlainObject = function(val) {
    var ctor, proto;
    return isObject(val) && (proto = Object.getPrototypeOf(val)) && (ctor = proto.constructor) && (typeof ctor === 'function') && (ctor instanceof ctor) && (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object));
  };

  module.exports.assign = assign;

  module.exports.isFunction = isFunction;

  module.exports.isObject = isObject;

  module.exports.isArray = isArray;

  module.exports.isEmpty = isEmpty;

  module.exports.isPlainObject = isPlainObject;

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute;

  module.exports = XMLAttribute = (function() {
    function XMLAttribute(parent, name, value) {
      this.options = parent.options;
      this.stringify = parent.stringify;
      if (name == null) {
        throw new Error("Missing attribute name of element " + parent.name);
      }
      if (value == null) {
        throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name);
      }
      this.name = this.stringify.attName(name);
      this.value = this.stringify.attValue(value);
    }

    XMLAttribute.prototype.clone = function() {
      return Object.create(this);
    };

    XMLAttribute.prototype.toString = function(options) {
      return this.options.writer.set(options).attribute(this);
    };

    return XMLAttribute;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLCData = (function(superClass) {
    extend(XMLCData, superClass);

    function XMLCData(parent, text) {
      XMLCData.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing CDATA text");
      }
      this.text = this.stringify.cdata(text);
    }

    XMLCData.prototype.clone = function() {
      return Object.create(this);
    };

    XMLCData.prototype.toString = function(options) {
      return this.options.writer.set(options).cdata(this);
    };

    return XMLCData;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLComment, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLComment = (function(superClass) {
    extend(XMLComment, superClass);

    function XMLComment(parent, text) {
      XMLComment.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing comment text");
      }
      this.text = this.stringify.comment(text);
    }

    XMLComment.prototype.clone = function() {
      return Object.create(this);
    };

    XMLComment.prototype.toString = function(options) {
      return this.options.writer.set(options).comment(this);
    };

    return XMLComment;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDAttList, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDAttList = (function(superClass) {
    extend(XMLDTDAttList, superClass);

    function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      XMLDTDAttList.__super__.constructor.call(this, parent);
      if (elementName == null) {
        throw new Error("Missing DTD element name");
      }
      if (attributeName == null) {
        throw new Error("Missing DTD attribute name");
      }
      if (!attributeType) {
        throw new Error("Missing DTD attribute type");
      }
      if (!defaultValueType) {
        throw new Error("Missing DTD attribute default");
      }
      if (defaultValueType.indexOf('#') !== 0) {
        defaultValueType = '#' + defaultValueType;
      }
      if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {
        throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT");
      }
      if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {
        throw new Error("Default value only applies to #FIXED or #DEFAULT");
      }
      this.elementName = this.stringify.eleName(elementName);
      this.attributeName = this.stringify.attName(attributeName);
      this.attributeType = this.stringify.dtdAttType(attributeType);
      this.defaultValue = this.stringify.dtdAttDefault(defaultValue);
      this.defaultValueType = defaultValueType;
    }

    XMLDTDAttList.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdAttList(this);
    };

    return XMLDTDAttList;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDElement, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDElement = (function(superClass) {
    extend(XMLDTDElement, superClass);

    function XMLDTDElement(parent, name, value) {
      XMLDTDElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing DTD element name");
      }
      if (!value) {
        value = '(#PCDATA)';
      }
      if (Array.isArray(value)) {
        value = '(' + value.join(',') + ')';
      }
      this.name = this.stringify.eleName(name);
      this.value = this.stringify.dtdElementValue(value);
    }

    XMLDTDElement.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdElement(this);
    };

    return XMLDTDElement;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDEntity, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDEntity = (function(superClass) {
    extend(XMLDTDEntity, superClass);

    function XMLDTDEntity(parent, pe, name, value) {
      XMLDTDEntity.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing entity name");
      }
      if (value == null) {
        throw new Error("Missing entity value");
      }
      this.pe = !!pe;
      this.name = this.stringify.eleName(name);
      if (!isObject(value)) {
        this.value = this.stringify.dtdEntityValue(value);
      } else {
        if (!value.pubID && !value.sysID) {
          throw new Error("Public and/or system identifiers are required for an external entity");
        }
        if (value.pubID && !value.sysID) {
          throw new Error("System identifier is required for a public external entity");
        }
        if (value.pubID != null) {
          this.pubID = this.stringify.dtdPubID(value.pubID);
        }
        if (value.sysID != null) {
          this.sysID = this.stringify.dtdSysID(value.sysID);
        }
        if (value.nData != null) {
          this.nData = this.stringify.dtdNData(value.nData);
        }
        if (this.pe && this.nData) {
          throw new Error("Notation declaration is not allowed in a parameter entity");
        }
      }
    }

    XMLDTDEntity.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdEntity(this);
    };

    return XMLDTDEntity;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDNotation, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDNotation = (function(superClass) {
    extend(XMLDTDNotation, superClass);

    function XMLDTDNotation(parent, name, value) {
      XMLDTDNotation.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing notation name");
      }
      if (!value.pubID && !value.sysID) {
        throw new Error("Public or system identifiers are required for an external entity");
      }
      this.name = this.stringify.eleName(name);
      if (value.pubID != null) {
        this.pubID = this.stringify.dtdPubID(value.pubID);
      }
      if (value.sysID != null) {
        this.sysID = this.stringify.dtdSysID(value.sysID);
      }
    }

    XMLDTDNotation.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdNotation(this);
    };

    return XMLDTDNotation;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDeclaration, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  module.exports = XMLDeclaration = (function(superClass) {
    extend(XMLDeclaration, superClass);

    function XMLDeclaration(parent, version, encoding, standalone) {
      var ref;
      XMLDeclaration.__super__.constructor.call(this, parent);
      if (isObject(version)) {
        ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;
      }
      if (!version) {
        version = '1.0';
      }
      this.version = this.stringify.xmlVersion(version);
      if (encoding != null) {
        this.encoding = this.stringify.xmlEncoding(encoding);
      }
      if (standalone != null) {
        this.standalone = this.stringify.xmlStandalone(standalone);
      }
    }

    XMLDeclaration.prototype.toString = function(options) {
      return this.options.writer.set(options).declaration(this);
    };

    return XMLDeclaration;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  module.exports = XMLDocType = (function(superClass) {
    extend(XMLDocType, superClass);

    function XMLDocType(parent, pubID, sysID) {
      var ref, ref1;
      XMLDocType.__super__.constructor.call(this, parent);
      this.documentObject = parent;
      if (isObject(pubID)) {
        ref = pubID, pubID = ref.pubID, sysID = ref.sysID;
      }
      if (sysID == null) {
        ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1];
      }
      if (pubID != null) {
        this.pubID = this.stringify.dtdPubID(pubID);
      }
      if (sysID != null) {
        this.sysID = this.stringify.dtdSysID(sysID);
      }
    }

    XMLDocType.prototype.element = function(name, value) {
      var child;
      child = new XMLDTDElement(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var child;
      child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.entity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, false, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.pEntity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, true, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.notation = function(name, value) {
      var child;
      child = new XMLDTDNotation(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.toString = function(options) {
      return this.options.writer.set(options).docType(this);
    };

    XMLDocType.prototype.ele = function(name, value) {
      return this.element(name, value);
    };

    XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);
    };

    XMLDocType.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocType.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocType.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    XMLDocType.prototype.up = function() {
      return this.root() || this.documentObject;
    };

    return XMLDocType;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDocument, XMLNode, XMLStringWriter, XMLStringifier, isPlainObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isPlainObject = require('./Utility').isPlainObject;

  XMLNode = require('./XMLNode');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  module.exports = XMLDocument = (function(superClass) {
    extend(XMLDocument, superClass);

    function XMLDocument(options) {
      XMLDocument.__super__.constructor.call(this, null);
      options || (options = {});
      if (!options.writer) {
        options.writer = new XMLStringWriter();
      }
      this.options = options;
      this.stringify = new XMLStringifier(options);
      this.isDocument = true;
    }

    XMLDocument.prototype.end = function(writer) {
      var writerOptions;
      if (!writer) {
        writer = this.options.writer;
      } else if (isPlainObject(writer)) {
        writerOptions = writer;
        writer = this.options.writer.set(writerOptions);
      }
      return writer.document(this);
    };

    XMLDocument.prototype.toString = function(options) {
      return this.options.writer.set(options).document(this);
    };

    return XMLDocument;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute, XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLDocumentCB, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLStringifier, XMLText, isFunction, isObject, isPlainObject, ref,
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isPlainObject = ref.isPlainObject;

  XMLElement = require('./XMLElement');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLAttribute = require('./XMLAttribute');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  module.exports = XMLDocumentCB = (function() {
    function XMLDocumentCB(options, onData, onEnd) {
      var writerOptions;
      options || (options = {});
      if (!options.writer) {
        options.writer = new XMLStringWriter(options);
      } else if (isPlainObject(options.writer)) {
        writerOptions = options.writer;
        options.writer = new XMLStringWriter(writerOptions);
      }
      this.options = options;
      this.writer = options.writer;
      this.stringify = new XMLStringifier(options);
      this.onDataCallback = onData || function() {};
      this.onEndCallback = onEnd || function() {};
      this.currentNode = null;
      this.currentLevel = -1;
      this.openTags = {};
      this.documentStarted = false;
      this.documentCompleted = false;
      this.root = null;
    }

    XMLDocumentCB.prototype.node = function(name, attributes, text) {
      var ref1;
      if (name == null) {
        throw new Error("Missing node name");
      }
      if (this.root && this.currentLevel === -1) {
        throw new Error("Document can only have one root node");
      }
      this.openCurrent();
      name = name.valueOf();
      if (attributes == null) {
        attributes = {};
      }
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      this.currentNode = new XMLElement(this, name, attributes);
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      if (text != null) {
        this.text(text);
      }
      return this;
    };

    XMLDocumentCB.prototype.element = function(name, attributes, text) {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.dtdElement.apply(this, arguments);
      } else {
        return this.node(name, attributes, text);
      }
    };

    XMLDocumentCB.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (!this.currentNode || this.currentNode.children) {
        throw new Error("att() can only be used immediately after an ele() call in callback mode");
      }
      if (name != null) {
        name = name.valueOf();
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (!this.options.skipNullAttributes || (value != null)) {
          this.currentNode.attributes[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLDocumentCB.prototype.text = function(value) {
      var node;
      this.openCurrent();
      node = new XMLText(this, value);
      this.onData(this.writer.text(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.cdata = function(value) {
      var node;
      this.openCurrent();
      node = new XMLCData(this, value);
      this.onData(this.writer.cdata(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.comment = function(value) {
      var node;
      this.openCurrent();
      node = new XMLComment(this, value);
      this.onData(this.writer.comment(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.raw = function(value) {
      var node;
      this.openCurrent();
      node = new XMLRaw(this, value);
      this.onData(this.writer.raw(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.instruction = function(target, value) {
      var i, insTarget, insValue, len, node;
      this.openCurrent();
      if (target != null) {
        target = target.valueOf();
      }
      if (value != null) {
        value = value.valueOf();
      }
      if (Array.isArray(target)) {
        for (i = 0, len = target.length; i < len; i++) {
          insTarget = target[i];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        node = new XMLProcessingInstruction(this, target, value);
        this.onData(this.writer.processingInstruction(node, this.currentLevel + 1));
      }
      return this;
    };

    XMLDocumentCB.prototype.declaration = function(version, encoding, standalone) {
      var node;
      this.openCurrent();
      if (this.documentStarted) {
        throw new Error("declaration() must be the first node");
      }
      node = new XMLDeclaration(this, version, encoding, standalone);
      this.onData(this.writer.declaration(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.doctype = function(root, pubID, sysID) {
      this.openCurrent();
      if (root == null) {
        throw new Error("Missing root node name");
      }
      if (this.root) {
        throw new Error("dtd() must come before the root node");
      }
      this.currentNode = new XMLDocType(this, pubID, sysID);
      this.currentNode.rootNodeName = root;
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      return this;
    };

    XMLDocumentCB.prototype.dtdElement = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDElement(this, name, value);
      this.onData(this.writer.dtdElement(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var node;
      this.openCurrent();
      node = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.onData(this.writer.dtdAttList(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.entity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, false, name, value);
      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.pEntity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, true, name, value);
      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.notation = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDNotation(this, name, value);
      this.onData(this.writer.dtdNotation(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.up = function() {
      if (this.currentLevel < 0) {
        throw new Error("The document node has no parent");
      }
      if (this.currentNode) {
        if (this.currentNode.children) {
          this.closeNode(this.currentNode);
        } else {
          this.openNode(this.currentNode);
        }
        this.currentNode = null;
      } else {
        this.closeNode(this.openTags[this.currentLevel]);
      }
      delete this.openTags[this.currentLevel];
      this.currentLevel--;
      return this;
    };

    XMLDocumentCB.prototype.end = function() {
      while (this.currentLevel >= 0) {
        this.up();
      }
      return this.onEnd();
    };

    XMLDocumentCB.prototype.openCurrent = function() {
      if (this.currentNode) {
        this.currentNode.children = true;
        return this.openNode(this.currentNode);
      }
    };

    XMLDocumentCB.prototype.openNode = function(node) {
      if (!node.isOpen) {
        if (!this.root && this.currentLevel === 0 && node instanceof XMLElement) {
          this.root = node;
        }
        this.onData(this.writer.openNode(node, this.currentLevel));
        return node.isOpen = true;
      }
    };

    XMLDocumentCB.prototype.closeNode = function(node) {
      if (!node.isClosed) {
        this.onData(this.writer.closeNode(node, this.currentLevel));
        return node.isClosed = true;
      }
    };

    XMLDocumentCB.prototype.onData = function(chunk) {
      this.documentStarted = true;
      return this.onDataCallback(chunk);
    };

    XMLDocumentCB.prototype.onEnd = function() {
      this.documentCompleted = true;
      return this.onEndCallback();
    };

    XMLDocumentCB.prototype.ele = function() {
      return this.element.apply(this, arguments);
    };

    XMLDocumentCB.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLDocumentCB.prototype.dtd = function(root, pubID, sysID) {
      return this.doctype(root, pubID, sysID);
    };

    XMLDocumentCB.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLDocumentCB.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.t = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLDocumentCB.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.att = function() {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.a = function() {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocumentCB.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocumentCB.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    return XMLDocumentCB;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute, XMLElement, XMLNode, isFunction, isObject, ref,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction;

  XMLNode = require('./XMLNode');

  XMLAttribute = require('./XMLAttribute');

  module.exports = XMLElement = (function(superClass) {
    extend(XMLElement, superClass);

    function XMLElement(parent, name, attributes) {
      XMLElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing element name");
      }
      this.name = this.stringify.eleName(name);
      this.attributes = {};
      if (attributes != null) {
        this.attribute(attributes);
      }
      if (parent.isDocument) {
        this.isRoot = true;
        this.documentObject = parent;
        parent.rootObject = this;
      }
    }

    XMLElement.prototype.clone = function() {
      var att, attName, clonedSelf, ref1;
      clonedSelf = Object.create(this);
      if (clonedSelf.isRoot) {
        clonedSelf.documentObject = null;
      }
      clonedSelf.attributes = {};
      ref1 = this.attributes;
      for (attName in ref1) {
        if (!hasProp.call(ref1, attName)) continue;
        att = ref1[attName];
        clonedSelf.attributes[attName] = att.clone();
      }
      clonedSelf.children = [];
      this.children.forEach(function(child) {
        var clonedChild;
        clonedChild = child.clone();
        clonedChild.parent = clonedSelf;
        return clonedSelf.children.push(clonedChild);
      });
      return clonedSelf;
    };

    XMLElement.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (name != null) {
        name = name.valueOf();
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (!this.options.skipNullAttributes || (value != null)) {
          this.attributes[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLElement.prototype.removeAttribute = function(name) {
      var attName, i, len;
      if (name == null) {
        throw new Error("Missing attribute name");
      }
      name = name.valueOf();
      if (Array.isArray(name)) {
        for (i = 0, len = name.length; i < len; i++) {
          attName = name[i];
          delete this.attributes[attName];
        }
      } else {
        delete this.attributes[name];
      }
      return this;
    };

    XMLElement.prototype.toString = function(options) {
      return this.options.writer.set(options).element(this);
    };

    XMLElement.prototype.att = function(name, value) {
      return this.attribute(name, value);
    };

    XMLElement.prototype.a = function(name, value) {
      return this.attribute(name, value);
    };

    return XMLElement;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLProcessingInstruction, XMLRaw, XMLText, isEmpty, isFunction, isObject, ref,
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isEmpty = ref.isEmpty;

  XMLElement = null;

  XMLCData = null;

  XMLComment = null;

  XMLDeclaration = null;

  XMLDocType = null;

  XMLRaw = null;

  XMLText = null;

  XMLProcessingInstruction = null;

  module.exports = XMLNode = (function() {
    function XMLNode(parent) {
      this.parent = parent;
      if (this.parent) {
        this.options = this.parent.options;
        this.stringify = this.parent.stringify;
      }
      this.children = [];
      if (!XMLElement) {
        XMLElement = require('./XMLElement');
        XMLCData = require('./XMLCData');
        XMLComment = require('./XMLComment');
        XMLDeclaration = require('./XMLDeclaration');
        XMLDocType = require('./XMLDocType');
        XMLRaw = require('./XMLRaw');
        XMLText = require('./XMLText');
        XMLProcessingInstruction = require('./XMLProcessingInstruction');
      }
    }

    XMLNode.prototype.element = function(name, attributes, text) {
      var childNode, item, j, k, key, lastChild, len, len1, ref1, val;
      lastChild = null;
      if (attributes == null) {
        attributes = {};
      }
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      if (name != null) {
        name = name.valueOf();
      }
      if (Array.isArray(name)) {
        for (j = 0, len = name.length; j < len; j++) {
          item = name[j];
          lastChild = this.element(item);
        }
      } else if (isFunction(name)) {
        lastChild = this.element(name.apply());
      } else if (isObject(name)) {
        for (key in name) {
          if (!hasProp.call(name, key)) continue;
          val = name[key];
          if (isFunction(val)) {
            val = val.apply();
          }
          if ((isObject(val)) && (isEmpty(val))) {
            val = null;
          }
          if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {
            lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);
          } else if (!this.options.separateArrayItems && Array.isArray(val)) {
            for (k = 0, len1 = val.length; k < len1; k++) {
              item = val[k];
              childNode = {};
              childNode[key] = item;
              lastChild = this.element(childNode);
            }
          } else if (isObject(val)) {
            lastChild = this.element(key);
            lastChild.element(val);
          } else {
            lastChild = this.element(key, val);
          }
        }
      } else {
        if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {
          lastChild = this.text(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {
          lastChild = this.cdata(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {
          lastChild = this.comment(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {
          lastChild = this.raw(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) {
          lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text);
        } else {
          lastChild = this.node(name, attributes, text);
        }
      }
      if (lastChild == null) {
        throw new Error("Could not create any elements with: " + name);
      }
      return lastChild;
    };

    XMLNode.prototype.insertBefore = function(name, attributes, text) {
      var child, i, removed;
      if (this.isRoot) {
        throw new Error("Cannot insert elements at root level");
      }
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.element(name, attributes, text);
      Array.prototype.push.apply(this.parent.children, removed);
      return child;
    };

    XMLNode.prototype.insertAfter = function(name, attributes, text) {
      var child, i, removed;
      if (this.isRoot) {
        throw new Error("Cannot insert elements at root level");
      }
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.element(name, attributes, text);
      Array.prototype.push.apply(this.parent.children, removed);
      return child;
    };

    XMLNode.prototype.remove = function() {
      var i, ref1;
      if (this.isRoot) {
        throw new Error("Cannot remove the root element");
      }
      i = this.parent.children.indexOf(this);
      [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref1 = [])), ref1;
      return this.parent;
    };

    XMLNode.prototype.node = function(name, attributes, text) {
      var child, ref1;
      if (name != null) {
        name = name.valueOf();
      }
      attributes || (attributes = {});
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      child = new XMLElement(this, name, attributes);
      if (text != null) {
        child.text(text);
      }
      this.children.push(child);
      return child;
    };

    XMLNode.prototype.text = function(value) {
      var child;
      child = new XMLText(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.cdata = function(value) {
      var child;
      child = new XMLCData(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.comment = function(value) {
      var child;
      child = new XMLComment(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.commentBefore = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.commentAfter = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.raw = function(value) {
      var child;
      child = new XMLRaw(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.instruction = function(target, value) {
      var insTarget, insValue, instruction, j, len;
      if (target != null) {
        target = target.valueOf();
      }
      if (value != null) {
        value = value.valueOf();
      }
      if (Array.isArray(target)) {
        for (j = 0, len = target.length; j < len; j++) {
          insTarget = target[j];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        instruction = new XMLProcessingInstruction(this, target, value);
        this.children.push(instruction);
      }
      return this;
    };

    XMLNode.prototype.instructionBefore = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.instructionAfter = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.declaration = function(version, encoding, standalone) {
      var doc, xmldec;
      doc = this.document();
      xmldec = new XMLDeclaration(doc, version, encoding, standalone);
      if (doc.children[0] instanceof XMLDeclaration) {
        doc.children[0] = xmldec;
      } else {
        doc.children.unshift(xmldec);
      }
      return doc.root() || doc;
    };

    XMLNode.prototype.doctype = function(pubID, sysID) {
      var child, doc, doctype, i, j, k, len, len1, ref1, ref2;
      doc = this.document();
      doctype = new XMLDocType(doc, pubID, sysID);
      ref1 = doc.children;
      for (i = j = 0, len = ref1.length; j < len; i = ++j) {
        child = ref1[i];
        if (child instanceof XMLDocType) {
          doc.children[i] = doctype;
          return doctype;
        }
      }
      ref2 = doc.children;
      for (i = k = 0, len1 = ref2.length; k < len1; i = ++k) {
        child = ref2[i];
        if (child.isRoot) {
          doc.children.splice(i, 0, doctype);
          return doctype;
        }
      }
      doc.children.push(doctype);
      return doctype;
    };

    XMLNode.prototype.up = function() {
      if (this.isRoot) {
        throw new Error("The root node has no parent. Use doc() if you need to get the document object.");
      }
      return this.parent;
    };

    XMLNode.prototype.root = function() {
      var node;
      node = this;
      while (node) {
        if (node.isDocument) {
          return node.rootObject;
        } else if (node.isRoot) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.document = function() {
      var node;
      node = this;
      while (node) {
        if (node.isDocument) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.end = function(options) {
      return this.document().end(options);
    };

    XMLNode.prototype.prev = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i < 1) {
        throw new Error("Already at the first node");
      }
      return this.parent.children[i - 1];
    };

    XMLNode.prototype.next = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i === -1 || i === this.parent.children.length - 1) {
        throw new Error("Already at the last node");
      }
      return this.parent.children[i + 1];
    };

    XMLNode.prototype.importDocument = function(doc) {
      var clonedRoot;
      clonedRoot = doc.root().clone();
      clonedRoot.parent = this;
      clonedRoot.isRoot = false;
      this.children.push(clonedRoot);
      return this;
    };

    XMLNode.prototype.ele = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.doc = function() {
      return this.document();
    };

    XMLNode.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLNode.prototype.dtd = function(pubID, sysID) {
      return this.doctype(pubID, sysID);
    };

    XMLNode.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.t = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLNode.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.u = function() {
      return this.up();
    };

    XMLNode.prototype.importXMLBuilder = function(doc) {
      return this.importDocument(doc);
    };

    return XMLNode;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLProcessingInstruction,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLProcessingInstruction = (function(superClass) {
    extend(XMLProcessingInstruction, superClass);

    function XMLProcessingInstruction(parent, target, value) {
      XMLProcessingInstruction.__super__.constructor.call(this, parent);
      if (target == null) {
        throw new Error("Missing instruction target");
      }
      this.target = this.stringify.insTarget(target);
      if (value) {
        this.value = this.stringify.insValue(value);
      }
    }

    XMLProcessingInstruction.prototype.clone = function() {
      return Object.create(this);
    };

    XMLProcessingInstruction.prototype.toString = function(options) {
      return this.options.writer.set(options).processingInstruction(this);
    };

    return XMLProcessingInstruction;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLRaw,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLRaw = (function(superClass) {
    extend(XMLRaw, superClass);

    function XMLRaw(parent, text) {
      XMLRaw.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing raw text");
      }
      this.value = this.stringify.raw(text);
    }

    XMLRaw.prototype.clone = function() {
      return Object.create(this);
    };

    XMLRaw.prototype.toString = function(options) {
      return this.options.writer.set(options).raw(this);
    };

    return XMLRaw;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStreamWriter, XMLText, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLElement = require('./XMLElement');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLWriterBase = require('./XMLWriterBase');

  module.exports = XMLStreamWriter = (function(superClass) {
    extend(XMLStreamWriter, superClass);

    function XMLStreamWriter(stream, options) {
      XMLStreamWriter.__super__.constructor.call(this, options);
      this.stream = stream;
    }

    XMLStreamWriter.prototype.document = function(doc) {
      var child, i, j, len, len1, ref, ref1, results;
      ref = doc.children;
      for (i = 0, len = ref.length; i < len; i++) {
        child = ref[i];
        child.isLastRootNode = false;
      }
      doc.children[doc.children.length - 1].isLastRootNode = true;
      ref1 = doc.children;
      results = [];
      for (j = 0, len1 = ref1.length; j < len1; j++) {
        child = ref1[j];
        switch (false) {
          case !(child instanceof XMLDeclaration):
            results.push(this.declaration(child));
            break;
          case !(child instanceof XMLDocType):
            results.push(this.docType(child));
            break;
          case !(child instanceof XMLComment):
            results.push(this.comment(child));
            break;
          case !(child instanceof XMLProcessingInstruction):
            results.push(this.processingInstruction(child));
            break;
          default:
            results.push(this.element(child));
        }
      }
      return results;
    };

    XMLStreamWriter.prototype.attribute = function(att) {
      return this.stream.write(' ' + att.name + '="' + att.value + '"');
    };

    XMLStreamWriter.prototype.cdata = function(node, level) {
      return this.stream.write(this.space(level) + '<![CDATA[' + node.text + ']]>' + this.endline(node));
    };

    XMLStreamWriter.prototype.comment = function(node, level) {
      return this.stream.write(this.space(level) + '<!-- ' + node.text + ' -->' + this.endline(node));
    };

    XMLStreamWriter.prototype.declaration = function(node, level) {
      this.stream.write(this.space(level));
      this.stream.write('<?xml version="' + node.version + '"');
      if (node.encoding != null) {
        this.stream.write(' encoding="' + node.encoding + '"');
      }
      if (node.standalone != null) {
        this.stream.write(' standalone="' + node.standalone + '"');
      }
      this.stream.write(this.spacebeforeslash + '?>');
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.docType = function(node, level) {
      var child, i, len, ref;
      level || (level = 0);
      this.stream.write(this.space(level));
      this.stream.write('<!DOCTYPE ' + node.root().name);
      if (node.pubID && node.sysID) {
        this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
      } else if (node.sysID) {
        this.stream.write(' SYSTEM "' + node.sysID + '"');
      }
      if (node.children.length > 0) {
        this.stream.write(' [');
        this.stream.write(this.endline(node));
        ref = node.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          switch (false) {
            case !(child instanceof XMLDTDAttList):
              this.dtdAttList(child, level + 1);
              break;
            case !(child instanceof XMLDTDElement):
              this.dtdElement(child, level + 1);
              break;
            case !(child instanceof XMLDTDEntity):
              this.dtdEntity(child, level + 1);
              break;
            case !(child instanceof XMLDTDNotation):
              this.dtdNotation(child, level + 1);
              break;
            case !(child instanceof XMLCData):
              this.cdata(child, level + 1);
              break;
            case !(child instanceof XMLComment):
              this.comment(child, level + 1);
              break;
            case !(child instanceof XMLProcessingInstruction):
              this.processingInstruction(child, level + 1);
              break;
            default:
              throw new Error("Unknown DTD node type: " + child.constructor.name);
          }
        }
        this.stream.write(']');
      }
      this.stream.write(this.spacebeforeslash + '>');
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.element = function(node, level) {
      var att, child, i, len, name, ref, ref1, space;
      level || (level = 0);
      space = this.space(level);
      this.stream.write(space + '<' + node.name);
      ref = node.attributes;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        this.attribute(att);
      }
      if (node.children.length === 0 || node.children.every(function(e) {
        return e.value === '';
      })) {
        if (this.allowEmpty) {
          this.stream.write('></' + node.name + '>');
        } else {
          this.stream.write(this.spacebeforeslash + '/>');
        }
      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {
        this.stream.write('>');
        this.stream.write(node.children[0].value);
        this.stream.write('</' + node.name + '>');
      } else {
        this.stream.write('>' + this.newline);
        ref1 = node.children;
        for (i = 0, len = ref1.length; i < len; i++) {
          child = ref1[i];
          switch (false) {
            case !(child instanceof XMLCData):
              this.cdata(child, level + 1);
              break;
            case !(child instanceof XMLComment):
              this.comment(child, level + 1);
              break;
            case !(child instanceof XMLElement):
              this.element(child, level + 1);
              break;
            case !(child instanceof XMLRaw):
              this.raw(child, level + 1);
              break;
            case !(child instanceof XMLText):
              this.text(child, level + 1);
              break;
            case !(child instanceof XMLProcessingInstruction):
              this.processingInstruction(child, level + 1);
              break;
            default:
              throw new Error("Unknown XML node type: " + child.constructor.name);
          }
        }
        this.stream.write(space + '</' + node.name + '>');
      }
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.processingInstruction = function(node, level) {
      this.stream.write(this.space(level) + '<?' + node.target);
      if (node.value) {
        this.stream.write(' ' + node.value);
      }
      return this.stream.write(this.spacebeforeslash + '?>' + this.endline(node));
    };

    XMLStreamWriter.prototype.raw = function(node, level) {
      return this.stream.write(this.space(level) + node.value + this.endline(node));
    };

    XMLStreamWriter.prototype.text = function(node, level) {
      return this.stream.write(this.space(level) + node.value + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdAttList = function(node, level) {
      this.stream.write(this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType);
      if (node.defaultValueType !== '#DEFAULT') {
        this.stream.write(' ' + node.defaultValueType);
      }
      if (node.defaultValue) {
        this.stream.write(' "' + node.defaultValue + '"');
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdElement = function(node, level) {
      this.stream.write(this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value);
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdEntity = function(node, level) {
      this.stream.write(this.space(level) + '<!ENTITY');
      if (node.pe) {
        this.stream.write(' %');
      }
      this.stream.write(' ' + node.name);
      if (node.value) {
        this.stream.write(' "' + node.value + '"');
      } else {
        if (node.pubID && node.sysID) {
          this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
        } else if (node.sysID) {
          this.stream.write(' SYSTEM "' + node.sysID + '"');
        }
        if (node.nData) {
          this.stream.write(' NDATA ' + node.nData);
        }
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdNotation = function(node, level) {
      this.stream.write(this.space(level) + '<!NOTATION ' + node.name);
      if (node.pubID && node.sysID) {
        this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
      } else if (node.pubID) {
        this.stream.write(' PUBLIC "' + node.pubID + '"');
      } else if (node.sysID) {
        this.stream.write(' SYSTEM "' + node.sysID + '"');
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.endline = function(node) {
      if (!node.isLastRootNode) {
        return this.newline;
      } else {
        return '';
      }
    };

    return XMLStreamWriter;

  })(XMLWriterBase);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLText, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLElement = require('./XMLElement');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLWriterBase = require('./XMLWriterBase');

  module.exports = XMLStringWriter = (function(superClass) {
    extend(XMLStringWriter, superClass);

    function XMLStringWriter(options) {
      XMLStringWriter.__super__.constructor.call(this, options);
    }

    XMLStringWriter.prototype.document = function(doc) {
      var child, i, len, r, ref;
      this.textispresent = false;
      r = '';
      ref = doc.children;
      for (i = 0, len = ref.length; i < len; i++) {
        child = ref[i];
        r += (function() {
          switch (false) {
            case !(child instanceof XMLDeclaration):
              return this.declaration(child);
            case !(child instanceof XMLDocType):
              return this.docType(child);
            case !(child instanceof XMLComment):
              return this.comment(child);
            case !(child instanceof XMLProcessingInstruction):
              return this.processingInstruction(child);
            default:
              return this.element(child, 0);
          }
        }).call(this);
      }
      if (this.pretty && r.slice(-this.newline.length) === this.newline) {
        r = r.slice(0, -this.newline.length);
      }
      return r;
    };

    XMLStringWriter.prototype.attribute = function(att) {
      return ' ' + att.name + '="' + att.value + '"';
    };

    XMLStringWriter.prototype.cdata = function(node, level) {
      return this.space(level) + '<![CDATA[' + node.text + ']]>' + this.newline;
    };

    XMLStringWriter.prototype.comment = function(node, level) {
      return this.space(level) + '<!-- ' + node.text + ' -->' + this.newline;
    };

    XMLStringWriter.prototype.declaration = function(node, level) {
      var r;
      r = this.space(level);
      r += '<?xml version="' + node.version + '"';
      if (node.encoding != null) {
        r += ' encoding="' + node.encoding + '"';
      }
      if (node.standalone != null) {
        r += ' standalone="' + node.standalone + '"';
      }
      r += this.spacebeforeslash + '?>';
      r += this.newline;
      return r;
    };

    XMLStringWriter.prototype.docType = function(node, level) {
      var child, i, len, r, ref;
      level || (level = 0);
      r = this.space(level);
      r += '<!DOCTYPE ' + node.root().name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      if (node.children.length > 0) {
        r += ' [';
        r += this.newline;
        ref = node.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          r += (function() {
            switch (false) {
              case !(child instanceof XMLDTDAttList):
                return this.dtdAttList(child, level + 1);
              case !(child instanceof XMLDTDElement):
                return this.dtdElement(child, level + 1);
              case !(child instanceof XMLDTDEntity):
                return this.dtdEntity(child, level + 1);
              case !(child instanceof XMLDTDNotation):
                return this.dtdNotation(child, level + 1);
              case !(child instanceof XMLCData):
                return this.cdata(child, level + 1);
              case !(child instanceof XMLComment):
                return this.comment(child, level + 1);
              case !(child instanceof XMLProcessingInstruction):
                return this.processingInstruction(child, level + 1);
              default:
                throw new Error("Unknown DTD node type: " + child.constructor.name);
            }
          }).call(this);
        }
        r += ']';
      }
      r += this.spacebeforeslash + '>';
      r += this.newline;
      return r;
    };

    XMLStringWriter.prototype.element = function(node, level) {
      var att, child, i, j, len, len1, name, r, ref, ref1, ref2, space, textispresentwasset;
      level || (level = 0);
      textispresentwasset = false;
      if (this.textispresent) {
        this.newline = '';
        this.pretty = false;
      } else {
        this.newline = this.newlinedefault;
        this.pretty = this.prettydefault;
      }
      space = this.space(level);
      r = '';
      r += space + '<' + node.name;
      ref = node.attributes;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        r += this.attribute(att);
      }
      if (node.children.length === 0 || node.children.every(function(e) {
        return e.value === '';
      })) {
        if (this.allowEmpty) {
          r += '></' + node.name + '>' + this.newline;
        } else {
          r += this.spacebeforeslash + '/>' + this.newline;
        }
      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {
        r += '>';
        r += node.children[0].value;
        r += '</' + node.name + '>' + this.newline;
      } else {
        if (this.dontprettytextnodes) {
          ref1 = node.children;
          for (i = 0, len = ref1.length; i < len; i++) {
            child = ref1[i];
            if (child.value != null) {
              this.textispresent++;
              textispresentwasset = true;
              break;
            }
          }
        }
        if (this.textispresent) {
          this.newline = '';
          this.pretty = false;
          space = this.space(level);
        }
        r += '>' + this.newline;
        ref2 = node.children;
        for (j = 0, len1 = ref2.length; j < len1; j++) {
          child = ref2[j];
          r += (function() {
            switch (false) {
              case !(child instanceof XMLCData):
                return this.cdata(child, level + 1);
              case !(child instanceof XMLComment):
                return this.comment(child, level + 1);
              case !(child instanceof XMLElement):
                return this.element(child, level + 1);
              case !(child instanceof XMLRaw):
                return this.raw(child, level + 1);
              case !(child instanceof XMLText):
                return this.text(child, level + 1);
              case !(child instanceof XMLProcessingInstruction):
                return this.processingInstruction(child, level + 1);
              default:
                throw new Error("Unknown XML node type: " + child.constructor.name);
            }
          }).call(this);
        }
        if (textispresentwasset) {
          this.textispresent--;
        }
        if (!this.textispresent) {
          this.newline = this.newlinedefault;
          this.pretty = this.prettydefault;
        }
        r += space + '</' + node.name + '>' + this.newline;
      }
      return r;
    };

    XMLStringWriter.prototype.processingInstruction = function(node, level) {
      var r;
      r = this.space(level) + '<?' + node.target;
      if (node.value) {
        r += ' ' + node.value;
      }
      r += this.spacebeforeslash + '?>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.raw = function(node, level) {
      return this.space(level) + node.value + this.newline;
    };

    XMLStringWriter.prototype.text = function(node, level) {
      return this.space(level) + node.value + this.newline;
    };

    XMLStringWriter.prototype.dtdAttList = function(node, level) {
      var r;
      r = this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType;
      if (node.defaultValueType !== '#DEFAULT') {
        r += ' ' + node.defaultValueType;
      }
      if (node.defaultValue) {
        r += ' "' + node.defaultValue + '"';
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.dtdElement = function(node, level) {
      return this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value + this.spacebeforeslash + '>' + this.newline;
    };

    XMLStringWriter.prototype.dtdEntity = function(node, level) {
      var r;
      r = this.space(level) + '<!ENTITY';
      if (node.pe) {
        r += ' %';
      }
      r += ' ' + node.name;
      if (node.value) {
        r += ' "' + node.value + '"';
      } else {
        if (node.pubID && node.sysID) {
          r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
        } else if (node.sysID) {
          r += ' SYSTEM "' + node.sysID + '"';
        }
        if (node.nData) {
          r += ' NDATA ' + node.nData;
        }
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.dtdNotation = function(node, level) {
      var r;
      r = this.space(level) + '<!NOTATION ' + node.name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.pubID) {
        r += ' PUBLIC "' + node.pubID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.openNode = function(node, level) {
      var att, name, r, ref;
      level || (level = 0);
      if (node instanceof XMLElement) {
        r = this.space(level) + '<' + node.name;
        ref = node.attributes;
        for (name in ref) {
          if (!hasProp.call(ref, name)) continue;
          att = ref[name];
          r += this.attribute(att);
        }
        r += (node.children ? '>' : '/>') + this.newline;
        return r;
      } else {
        r = this.space(level) + '<!DOCTYPE ' + node.rootNodeName;
        if (node.pubID && node.sysID) {
          r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
        } else if (node.sysID) {
          r += ' SYSTEM "' + node.sysID + '"';
        }
        r += (node.children ? ' [' : '>') + this.newline;
        return r;
      }
    };

    XMLStringWriter.prototype.closeNode = function(node, level) {
      level || (level = 0);
      switch (false) {
        case !(node instanceof XMLElement):
          return this.space(level) + '</' + node.name + '>' + this.newline;
        case !(node instanceof XMLDocType):
          return this.space(level) + ']>' + this.newline;
      }
    };

    return XMLStringWriter;

  })(XMLWriterBase);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLStringifier,
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    hasProp = {}.hasOwnProperty;

  module.exports = XMLStringifier = (function() {
    function XMLStringifier(options) {
      this.assertLegalChar = bind(this.assertLegalChar, this);
      var key, ref, value;
      options || (options = {});
      this.noDoubleEncoding = options.noDoubleEncoding;
      ref = options.stringify || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this[key] = value;
      }
    }

    XMLStringifier.prototype.eleName = function(val) {
      val = '' + val || '';
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.eleText = function(val) {
      val = '' + val || '';
      return this.assertLegalChar(this.elEscape(val));
    };

    XMLStringifier.prototype.cdata = function(val) {
      val = '' + val || '';
      val = val.replace(']]>', ']]]]><![CDATA[>');
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.comment = function(val) {
      val = '' + val || '';
      if (val.match(/--/)) {
        throw new Error("Comment text cannot contain double-hypen: " + val);
      }
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.raw = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.attName = function(val) {
      return val = '' + val || '';
    };

    XMLStringifier.prototype.attValue = function(val) {
      val = '' + val || '';
      return this.attEscape(val);
    };

    XMLStringifier.prototype.insTarget = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.insValue = function(val) {
      val = '' + val || '';
      if (val.match(/\?>/)) {
        throw new Error("Invalid processing instruction value: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlVersion = function(val) {
      val = '' + val || '';
      if (!val.match(/1\.[0-9]+/)) {
        throw new Error("Invalid version number: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlEncoding = function(val) {
      val = '' + val || '';
      if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/)) {
        throw new Error("Invalid encoding: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlStandalone = function(val) {
      if (val) {
        return "yes";
      } else {
        return "no";
      }
    };

    XMLStringifier.prototype.dtdPubID = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdSysID = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdElementValue = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdAttType = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdAttDefault = function(val) {
      if (val != null) {
        return '' + val || '';
      } else {
        return val;
      }
    };

    XMLStringifier.prototype.dtdEntityValue = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdNData = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.convertAttKey = '@';

    XMLStringifier.prototype.convertPIKey = '?';

    XMLStringifier.prototype.convertTextKey = '#text';

    XMLStringifier.prototype.convertCDataKey = '#cdata';

    XMLStringifier.prototype.convertCommentKey = '#comment';

    XMLStringifier.prototype.convertRawKey = '#raw';

    XMLStringifier.prototype.assertLegalChar = function(str) {
      var res;
      res = str.match(/[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/);
      if (res) {
        throw new Error("Invalid character in string: " + str + " at index " + res.index);
      }
      return str;
    };

    XMLStringifier.prototype.elEscape = function(str) {
      var ampregex;
      ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\r/g, '&#xD;');
    };

    XMLStringifier.prototype.attEscape = function(str) {
      var ampregex;
      ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/\t/g, '&#x9;').replace(/\n/g, '&#xA;').replace(/\r/g, '&#xD;');
    };

    return XMLStringifier;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLText,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLText = (function(superClass) {
    extend(XMLText, superClass);

    function XMLText(parent, text) {
      XMLText.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing element text");
      }
      this.value = this.stringify.eleText(text);
    }

    XMLText.prototype.clone = function() {
      return Object.create(this);
    };

    XMLText.prototype.toString = function(options) {
      return this.options.writer.set(options).text(this);
    };

    return XMLText;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLWriterBase,
    hasProp = {}.hasOwnProperty;

  module.exports = XMLWriterBase = (function() {
    function XMLWriterBase(options) {
      var key, ref, ref1, ref2, ref3, ref4, ref5, ref6, value;
      options || (options = {});
      this.pretty = options.pretty || false;
      this.allowEmpty = (ref = options.allowEmpty) != null ? ref : false;
      if (this.pretty) {
        this.indent = (ref1 = options.indent) != null ? ref1 : '  ';
        this.newline = (ref2 = options.newline) != null ? ref2 : '\n';
        this.offset = (ref3 = options.offset) != null ? ref3 : 0;
        this.dontprettytextnodes = (ref4 = options.dontprettytextnodes) != null ? ref4 : 0;
      } else {
        this.indent = '';
        this.newline = '';
        this.offset = 0;
        this.dontprettytextnodes = 0;
      }
      this.spacebeforeslash = (ref5 = options.spacebeforeslash) != null ? ref5 : '';
      if (this.spacebeforeslash === true) {
        this.spacebeforeslash = ' ';
      }
      this.newlinedefault = this.newline;
      this.prettydefault = this.pretty;
      ref6 = options.writer || {};
      for (key in ref6) {
        if (!hasProp.call(ref6, key)) continue;
        value = ref6[key];
        this[key] = value;
      }
    }

    XMLWriterBase.prototype.set = function(options) {
      var key, ref, value;
      options || (options = {});
      if ("pretty" in options) {
        this.pretty = options.pretty;
      }
      if ("allowEmpty" in options) {
        this.allowEmpty = options.allowEmpty;
      }
      if (this.pretty) {
        this.indent = "indent" in options ? options.indent : '  ';
        this.newline = "newline" in options ? options.newline : '\n';
        this.offset = "offset" in options ? options.offset : 0;
        this.dontprettytextnodes = "dontprettytextnodes" in options ? options.dontprettytextnodes : 0;
      } else {
        this.indent = '';
        this.newline = '';
        this.offset = 0;
        this.dontprettytextnodes = 0;
      }
      this.spacebeforeslash = "spacebeforeslash" in options ? options.spacebeforeslash : '';
      if (this.spacebeforeslash === true) {
        this.spacebeforeslash = ' ';
      }
      this.newlinedefault = this.newline;
      this.prettydefault = this.pretty;
      ref = options.writer || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this[key] = value;
      }
      return this;
    };

    XMLWriterBase.prototype.space = function(level) {
      var indent;
      if (this.pretty) {
        indent = (level || 0) + this.offset + 1;
        if (indent > 0) {
          return new Array(indent).join(this.indent);
        } else {
          return '';
        }
      } else {
        return '';
      }
    };

    return XMLWriterBase;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDocument, XMLDocumentCB, XMLStreamWriter, XMLStringWriter, assign, isFunction, ref;

  ref = require('./Utility'), assign = ref.assign, isFunction = ref.isFunction;

  XMLDocument = require('./XMLDocument');

  XMLDocumentCB = require('./XMLDocumentCB');

  XMLStringWriter = require('./XMLStringWriter');

  XMLStreamWriter = require('./XMLStreamWriter');

  module.exports.create = function(name, xmldec, doctype, options) {
    var doc, root;
    if (name == null) {
      throw new Error("Root element needs a name");
    }
    options = assign({}, xmldec, doctype, options);
    doc = new XMLDocument(options);
    root = doc.element(name);
    if (!options.headless) {
      doc.declaration(options);
      if ((options.pubID != null) || (options.sysID != null)) {
        doc.doctype(options);
      }
    }
    return root;
  };

  module.exports.begin = function(options, onData, onEnd) {
    var ref1;
    if (isFunction(options)) {
      ref1 = [options, onData], onData = ref1[0], onEnd = ref1[1];
      options = {};
    }
    if (onData) {
      return new XMLDocumentCB(options, onData, onEnd);
    } else {
      return new XMLDocument(options);
    }
  };

  module.exports.stringWriter = function(options) {
    return new XMLStringWriter(options);
  };

  module.exports.streamWriter = function(stream, options) {
    return new XMLStreamWriter(stream, options);
  };

}).call(this);
You can choose any one of those:

The MIT License (MIT):

link:http://opensource.org/licenses/MIT

LGPL:
http://www.gnu.org/licenses/lgpl.html
this.addScript('dom.js',['DOMImplementation','XMLSerializer']);
this.addScript('dom-parser.js',['DOMHandler','DOMParser'],
		['DOMImplementation','XMLReader']);
this.addScript('sax.js','XMLReader');### Version 0.1.16

Sat May  4 14:58:03 UTC 2013

 * Correctly handle multibyte Unicode greater than two byts. #57. #56.
 * Initial unit testing and test coverage. #53. #46. #19.
 * Create Bower `component.json` #52.

### Version 0.1.8

 * Add: some test case from node-o3-xml(excludes xpath support)
 * Fix: remove existed attribute before setting  (bug introduced in v0.1.5)
 * Fix: index direct access for childNodes and any NodeList collection(not w3c standard)
 * Fix: remove last child bug
{
  "name": "xmldom",
  "version": "0.1.15",
  "main": "dom-parser.js",
  "ignore": [
    "**/.*",
    "node_modules",
    "components"
  ]
}
function DOMParser(options){
	this.options = options ||{locator:{}};
	
}
DOMParser.prototype.parseFromString = function(source,mimeType){
	var options = this.options;
	var sax =  new XMLReader();
	var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
	var errorHandler = options.errorHandler;
	var locator = options.locator;
	var defaultNSMap = options.xmlns||{};
	var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
	if(locator){
		domBuilder.setDocumentLocator(locator)
	}
	
	sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
	sax.domBuilder = options.domBuilder || domBuilder;
	if(/\/x?html?$/.test(mimeType)){
		entityMap.nbsp = '\xa0';
		entityMap.copy = '\xa9';
		defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
	}
	defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
	if(source){
		sax.parse(source,defaultNSMap,entityMap);
	}else{
		sax.errorHandler.error("invalid doc source");
	}
	return domBuilder.doc;
}
function buildErrorHandler(errorImpl,domBuilder,locator){
	if(!errorImpl){
		if(domBuilder instanceof DOMHandler){
			return domBuilder;
		}
		errorImpl = domBuilder ;
	}
	var errorHandler = {}
	var isCallback = errorImpl instanceof Function;
	locator = locator||{}
	function build(key){
		var fn = errorImpl[key];
		if(!fn && isCallback){
			fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
		}
		errorHandler[key] = fn && function(msg){
			fn('[xmldom '+key+']\t'+msg+_locator(locator));
		}||function(){};
	}
	build('warning');
	build('error');
	build('fatalError');
	return errorHandler;
}

//console.log('#\n\n\n\n\n\n\n####')
/**
 * +ContentHandler+ErrorHandler
 * +LexicalHandler+EntityResolver2
 * -DeclHandler-DTDHandler 
 * 
 * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
 * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
 * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
 */
function DOMHandler() {
    this.cdata = false;
}
function position(locator,node){
	node.lineNumber = locator.lineNumber;
	node.columnNumber = locator.columnNumber;
}
/**
 * @see org.xml.sax.ContentHandler#startDocument
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
 */ 
DOMHandler.prototype = {
	startDocument : function() {
    	this.doc = new DOMImplementation().createDocument(null, null, null);
    	if (this.locator) {
        	this.doc.documentURI = this.locator.systemId;
    	}
	},
	startElement:function(namespaceURI, localName, qName, attrs) {
		var doc = this.doc;
	    var el = doc.createElementNS(namespaceURI, qName||localName);
	    var len = attrs.length;
	    appendElement(this, el);
	    this.currentElement = el;
	    
		this.locator && position(this.locator,el)
	    for (var i = 0 ; i < len; i++) {
	        var namespaceURI = attrs.getURI(i);
	        var value = attrs.getValue(i);
	        var qName = attrs.getQName(i);
			var attr = doc.createAttributeNS(namespaceURI, qName);
			this.locator &&position(attrs.getLocator(i),attr);
			attr.value = attr.nodeValue = value;
			el.setAttributeNode(attr)
	    }
	},
	endElement:function(namespaceURI, localName, qName) {
		var current = this.currentElement
		var tagName = current.tagName;
		this.currentElement = current.parentNode;
	},
	startPrefixMapping:function(prefix, uri) {
	},
	endPrefixMapping:function(prefix) {
	},
	processingInstruction:function(target, data) {
	    var ins = this.doc.createProcessingInstruction(target, data);
	    this.locator && position(this.locator,ins)
	    appendElement(this, ins);
	},
	ignorableWhitespace:function(ch, start, length) {
	},
	characters:function(chars, start, length) {
		chars = _toString.apply(this,arguments)
		//console.log(chars)
		if(chars){
			if (this.cdata) {
				var charNode = this.doc.createCDATASection(chars);
			} else {
				var charNode = this.doc.createTextNode(chars);
			}
			if(this.currentElement){
				this.currentElement.appendChild(charNode);
			}else if(/^\s*$/.test(chars)){
				this.doc.appendChild(charNode);
				//process xml
			}
			this.locator && position(this.locator,charNode)
		}
	},
	skippedEntity:function(name) {
	},
	endDocument:function() {
		this.doc.normalize();
	},
	setDocumentLocator:function (locator) {
	    if(this.locator = locator){// && !('lineNumber' in locator)){
	    	locator.lineNumber = 0;
	    }
	},
	//LexicalHandler
	comment:function(chars, start, length) {
		chars = _toString.apply(this,arguments)
	    var comm = this.doc.createComment(chars);
	    this.locator && position(this.locator,comm)
	    appendElement(this, comm);
	},
	
	startCDATA:function() {
	    //used in characters() methods
	    this.cdata = true;
	},
	endCDATA:function() {
	    this.cdata = false;
	},
	
	startDTD:function(name, publicId, systemId) {
		var impl = this.doc.implementation;
	    if (impl && impl.createDocumentType) {
	        var dt = impl.createDocumentType(name, publicId, systemId);
	        this.locator && position(this.locator,dt)
	        appendElement(this, dt);
	    }
	},
	/**
	 * @see org.xml.sax.ErrorHandler
	 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
	 */
	warning:function(error) {
		console.warn('[xmldom warning]\t'+error,_locator(this.locator));
	},
	error:function(error) {
		console.error('[xmldom error]\t'+error,_locator(this.locator));
	},
	fatalError:function(error) {
		console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
	    throw error;
	}
}
function _locator(l){
	if(l){
		return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
	}
}
function _toString(chars,start,length){
	if(typeof chars == 'string'){
		return chars.substr(start,length)
	}else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
		if(chars.length >= start+length || start){
			return new java.lang.String(chars,start,length)+'';
		}
		return chars;
	}
}

/*
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
 * used method of org.xml.sax.ext.LexicalHandler:
 *  #comment(chars, start, length)
 *  #startCDATA()
 *  #endCDATA()
 *  #startDTD(name, publicId, systemId)
 *
 *
 * IGNORED method of org.xml.sax.ext.LexicalHandler:
 *  #endDTD()
 *  #startEntity(name)
 *  #endEntity(name)
 *
 *
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
 * IGNORED method of org.xml.sax.ext.DeclHandler
 * 	#attributeDecl(eName, aName, type, mode, value)
 *  #elementDecl(name, model)
 *  #externalEntityDecl(name, publicId, systemId)
 *  #internalEntityDecl(name, value)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
 * IGNORED method of org.xml.sax.EntityResolver2
 *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
 *  #resolveEntity(publicId, systemId)
 *  #getExternalSubset(name, baseURI)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
 * IGNORED method of org.xml.sax.DTDHandler
 *  #notationDecl(name, publicId, systemId) {};
 *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
 */
"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
	DOMHandler.prototype[key] = function(){return null}
})

/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
function appendElement (hander,node) {
    if (!hander.currentElement) {
        hander.doc.appendChild(node);
    } else {
        hander.currentElement.appendChild(node);
    }
}//appendChild and setAttributeNS are preformance key

//if(typeof require == 'function'){
	var XMLReader = require('./sax').XMLReader;
	var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;
	exports.XMLSerializer = require('./dom').XMLSerializer ;
	exports.DOMParser = DOMParser;
//}
/*
 * DOM Level 2
 * Object DOMException
 * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
 */

function copy(src,dest){
	for(var p in src){
		dest[p] = src[p];
	}
}
/**
^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
 */
function _extends(Class,Super){
	var pt = Class.prototype;
	if(Object.create){
		var ppt = Object.create(Super.prototype)
		pt.__proto__ = ppt;
	}
	if(!(pt instanceof Super)){
		function t(){};
		t.prototype = Super.prototype;
		t = new t();
		copy(pt,t);
		Class.prototype = pt = t;
	}
	if(pt.constructor != Class){
		if(typeof Class != 'function'){
			console.error("unknow Class:"+Class)
		}
		pt.constructor = Class
	}
}
var htmlns = 'http://www.w3.org/1999/xhtml' ;
// Node Types
var NodeType = {}
var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;

// ExceptionCode
var ExceptionCode = {}
var ExceptionMessage = {};
var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
//level2
var INVALID_STATE_ERR        	= ExceptionCode.INVALID_STATE_ERR        	= ((ExceptionMessage[11]="Invalid state"),11);
var SYNTAX_ERR               	= ExceptionCode.SYNTAX_ERR               	= ((ExceptionMessage[12]="Syntax error"),12);
var INVALID_MODIFICATION_ERR 	= ExceptionCode.INVALID_MODIFICATION_ERR 	= ((ExceptionMessage[13]="Invalid modification"),13);
var NAMESPACE_ERR            	= ExceptionCode.NAMESPACE_ERR           	= ((ExceptionMessage[14]="Invalid namespace"),14);
var INVALID_ACCESS_ERR       	= ExceptionCode.INVALID_ACCESS_ERR      	= ((ExceptionMessage[15]="Invalid access"),15);


function DOMException(code, message) {
	if(message instanceof Error){
		var error = message;
	}else{
		error = this;
		Error.call(this, ExceptionMessage[code]);
		this.message = ExceptionMessage[code];
		if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
	}
	error.code = code;
	if(message) this.message = this.message + ": " + message;
	return error;
};
DOMException.prototype = Error.prototype;
copy(ExceptionCode,DOMException)
/**
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
 * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
 * The items in the NodeList are accessible via an integral index, starting from 0.
 */
function NodeList() {
};
NodeList.prototype = {
	/**
	 * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
	 * @standard level1
	 */
	length:0, 
	/**
	 * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
	 * @standard level1
	 * @param index  unsigned long 
	 *   Index into the collection.
	 * @return Node
	 * 	The node at the indexth position in the NodeList, or null if that is not a valid index. 
	 */
	item: function(index) {
		return this[index] || null;
	},
	toString:function(isHTML,nodeFilter){
		for(var buf = [], i = 0;i<this.length;i++){
			serializeToString(this[i],buf,isHTML,nodeFilter);
		}
		return buf.join('');
	}
};
function LiveNodeList(node,refresh){
	this._node = node;
	this._refresh = refresh
	_updateLiveList(this);
}
function _updateLiveList(list){
	var inc = list._node._inc || list._node.ownerDocument._inc;
	if(list._inc != inc){
		var ls = list._refresh(list._node);
		//console.log(ls.length)
		__set__(list,'length',ls.length);
		copy(ls,list);
		list._inc = inc;
	}
}
LiveNodeList.prototype.item = function(i){
	_updateLiveList(this);
	return this[i];
}

_extends(LiveNodeList,NodeList);
/**
 * 
 * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
 * NamedNodeMap objects in the DOM are live.
 * used for attributes or DocumentType entities 
 */
function NamedNodeMap() {
};

function _findNodeIndex(list,node){
	var i = list.length;
	while(i--){
		if(list[i] === node){return i}
	}
}

function _addNamedNode(el,list,newAttr,oldAttr){
	if(oldAttr){
		list[_findNodeIndex(list,oldAttr)] = newAttr;
	}else{
		list[list.length++] = newAttr;
	}
	if(el){
		newAttr.ownerElement = el;
		var doc = el.ownerDocument;
		if(doc){
			oldAttr && _onRemoveAttribute(doc,el,oldAttr);
			_onAddAttribute(doc,el,newAttr);
		}
	}
}
function _removeNamedNode(el,list,attr){
	//console.log('remove attr:'+attr)
	var i = _findNodeIndex(list,attr);
	if(i>=0){
		var lastIndex = list.length-1
		while(i<lastIndex){
			list[i] = list[++i]
		}
		list.length = lastIndex;
		if(el){
			var doc = el.ownerDocument;
			if(doc){
				_onRemoveAttribute(doc,el,attr);
				attr.ownerElement = null;
			}
		}
	}else{
		throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
	}
}
NamedNodeMap.prototype = {
	length:0,
	item:NodeList.prototype.item,
	getNamedItem: function(key) {
//		if(key.indexOf(':')>0 || key == 'xmlns'){
//			return null;
//		}
		//console.log()
		var i = this.length;
		while(i--){
			var attr = this[i];
			//console.log(attr.nodeName,key)
			if(attr.nodeName == key){
				return attr;
			}
		}
	},
	setNamedItem: function(attr) {
		var el = attr.ownerElement;
		if(el && el!=this._ownerElement){
			throw new DOMException(INUSE_ATTRIBUTE_ERR);
		}
		var oldAttr = this.getNamedItem(attr.nodeName);
		_addNamedNode(this._ownerElement,this,attr,oldAttr);
		return oldAttr;
	},
	/* returns Node */
	setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
		var el = attr.ownerElement, oldAttr;
		if(el && el!=this._ownerElement){
			throw new DOMException(INUSE_ATTRIBUTE_ERR);
		}
		oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
		_addNamedNode(this._ownerElement,this,attr,oldAttr);
		return oldAttr;
	},

	/* returns Node */
	removeNamedItem: function(key) {
		var attr = this.getNamedItem(key);
		_removeNamedNode(this._ownerElement,this,attr);
		return attr;
		
		
	},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
	
	//for level2
	removeNamedItemNS:function(namespaceURI,localName){
		var attr = this.getNamedItemNS(namespaceURI,localName);
		_removeNamedNode(this._ownerElement,this,attr);
		return attr;
	},
	getNamedItemNS: function(namespaceURI, localName) {
		var i = this.length;
		while(i--){
			var node = this[i];
			if(node.localName == localName && node.namespaceURI == namespaceURI){
				return node;
			}
		}
		return null;
	}
};
/**
 * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
 */
function DOMImplementation(/* Object */ features) {
	this._features = {};
	if (features) {
		for (var feature in features) {
			 this._features = features[feature];
		}
	}
};

DOMImplementation.prototype = {
	hasFeature: function(/* string */ feature, /* string */ version) {
		var versions = this._features[feature.toLowerCase()];
		if (versions && (!version || version in versions)) {
			return true;
		} else {
			return false;
		}
	},
	// Introduced in DOM Level 2:
	createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
		var doc = new Document();
		doc.implementation = this;
		doc.childNodes = new NodeList();
		doc.doctype = doctype;
		if(doctype){
			doc.appendChild(doctype);
		}
		if(qualifiedName){
			var root = doc.createElementNS(namespaceURI,qualifiedName);
			doc.appendChild(root);
		}
		return doc;
	},
	// Introduced in DOM Level 2:
	createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
		var node = new DocumentType();
		node.name = qualifiedName;
		node.nodeName = qualifiedName;
		node.publicId = publicId;
		node.systemId = systemId;
		// Introduced in DOM Level 2:
		//readonly attribute DOMString        internalSubset;
		
		//TODO:..
		//  readonly attribute NamedNodeMap     entities;
		//  readonly attribute NamedNodeMap     notations;
		return node;
	}
};


/**
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
 */

function Node() {
};

Node.prototype = {
	firstChild : null,
	lastChild : null,
	previousSibling : null,
	nextSibling : null,
	attributes : null,
	parentNode : null,
	childNodes : null,
	ownerDocument : null,
	nodeValue : null,
	namespaceURI : null,
	prefix : null,
	localName : null,
	// Modified in DOM Level 2:
	insertBefore:function(newChild, refChild){//raises 
		return _insertBefore(this,newChild,refChild);
	},
	replaceChild:function(newChild, oldChild){//raises 
		this.insertBefore(newChild,oldChild);
		if(oldChild){
			this.removeChild(oldChild);
		}
	},
	removeChild:function(oldChild){
		return _removeChild(this,oldChild);
	},
	appendChild:function(newChild){
		return this.insertBefore(newChild,null);
	},
	hasChildNodes:function(){
		return this.firstChild != null;
	},
	cloneNode:function(deep){
		return cloneNode(this.ownerDocument||this,this,deep);
	},
	// Modified in DOM Level 2:
	normalize:function(){
		var child = this.firstChild;
		while(child){
			var next = child.nextSibling;
			if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
				this.removeChild(next);
				child.appendData(next.data);
			}else{
				child.normalize();
				child = next;
			}
		}
	},
  	// Introduced in DOM Level 2:
	isSupported:function(feature, version){
		return this.ownerDocument.implementation.hasFeature(feature,version);
	},
    // Introduced in DOM Level 2:
    hasAttributes:function(){
    	return this.attributes.length>0;
    },
    lookupPrefix:function(namespaceURI){
    	var el = this;
    	while(el){
    		var map = el._nsMap;
    		//console.dir(map)
    		if(map){
    			for(var n in map){
    				if(map[n] == namespaceURI){
    					return n;
    				}
    			}
    		}
    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
    	}
    	return null;
    },
    // Introduced in DOM Level 3:
    lookupNamespaceURI:function(prefix){
    	var el = this;
    	while(el){
    		var map = el._nsMap;
    		//console.dir(map)
    		if(map){
    			if(prefix in map){
    				return map[prefix] ;
    			}
    		}
    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
    	}
    	return null;
    },
    // Introduced in DOM Level 3:
    isDefaultNamespace:function(namespaceURI){
    	var prefix = this.lookupPrefix(namespaceURI);
    	return prefix == null;
    }
};


function _xmlEncoder(c){
	return c == '<' && '&lt;' ||
         c == '>' && '&gt;' ||
         c == '&' && '&amp;' ||
         c == '"' && '&quot;' ||
         '&#'+c.charCodeAt()+';'
}


copy(NodeType,Node);
copy(NodeType,Node.prototype);

/**
 * @param callback return true for continue,false for break
 * @return boolean true: break visit;
 */
function _visitNode(node,callback){
	if(callback(node)){
		return true;
	}
	if(node = node.firstChild){
		do{
			if(_visitNode(node,callback)){return true}
        }while(node=node.nextSibling)
    }
}



function Document(){
}
function _onAddAttribute(doc,el,newAttr){
	doc && doc._inc++;
	var ns = newAttr.namespaceURI ;
	if(ns == 'http://www.w3.org/2000/xmlns/'){
		//update namespace
		el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value
	}
}
function _onRemoveAttribute(doc,el,newAttr,remove){
	doc && doc._inc++;
	var ns = newAttr.namespaceURI ;
	if(ns == 'http://www.w3.org/2000/xmlns/'){
		//update namespace
		delete el._nsMap[newAttr.prefix?newAttr.localName:'']
	}
}
function _onUpdateChild(doc,el,newChild){
	if(doc && doc._inc){
		doc._inc++;
		//update childNodes
		var cs = el.childNodes;
		if(newChild){
			cs[cs.length++] = newChild;
		}else{
			//console.log(1)
			var child = el.firstChild;
			var i = 0;
			while(child){
				cs[i++] = child;
				child =child.nextSibling;
			}
			cs.length = i;
		}
	}
}

/**
 * attributes;
 * children;
 * 
 * writeable properties:
 * nodeValue,Attr:value,CharacterData:data
 * prefix
 */
function _removeChild(parentNode,child){
	var previous = child.previousSibling;
	var next = child.nextSibling;
	if(previous){
		previous.nextSibling = next;
	}else{
		parentNode.firstChild = next
	}
	if(next){
		next.previousSibling = previous;
	}else{
		parentNode.lastChild = previous;
	}
	_onUpdateChild(parentNode.ownerDocument,parentNode);
	return child;
}
/**
 * preformance key(refChild == null)
 */
function _insertBefore(parentNode,newChild,nextChild){
	var cp = newChild.parentNode;
	if(cp){
		cp.removeChild(newChild);//remove and update
	}
	if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
		var newFirst = newChild.firstChild;
		if (newFirst == null) {
			return newChild;
		}
		var newLast = newChild.lastChild;
	}else{
		newFirst = newLast = newChild;
	}
	var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;

	newFirst.previousSibling = pre;
	newLast.nextSibling = nextChild;
	
	
	if(pre){
		pre.nextSibling = newFirst;
	}else{
		parentNode.firstChild = newFirst;
	}
	if(nextChild == null){
		parentNode.lastChild = newLast;
	}else{
		nextChild.previousSibling = newLast;
	}
	do{
		newFirst.parentNode = parentNode;
	}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
	_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
	//console.log(parentNode.lastChild.nextSibling == null)
	if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
		newChild.firstChild = newChild.lastChild = null;
	}
	return newChild;
}
function _appendSingleChild(parentNode,newChild){
	var cp = newChild.parentNode;
	if(cp){
		var pre = parentNode.lastChild;
		cp.removeChild(newChild);//remove and update
		var pre = parentNode.lastChild;
	}
	var pre = parentNode.lastChild;
	newChild.parentNode = parentNode;
	newChild.previousSibling = pre;
	newChild.nextSibling = null;
	if(pre){
		pre.nextSibling = newChild;
	}else{
		parentNode.firstChild = newChild;
	}
	parentNode.lastChild = newChild;
	_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
	return newChild;
	//console.log("__aa",parentNode.lastChild.nextSibling == null)
}
Document.prototype = {
	//implementation : null,
	nodeName :  '#document',
	nodeType :  DOCUMENT_NODE,
	doctype :  null,
	documentElement :  null,
	_inc : 1,
	
	insertBefore :  function(newChild, refChild){//raises 
		if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
			var child = newChild.firstChild;
			while(child){
				var next = child.nextSibling;
				this.insertBefore(child,refChild);
				child = next;
			}
			return newChild;
		}
		if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
			this.documentElement = newChild;
		}
		
		return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
	},
	removeChild :  function(oldChild){
		if(this.documentElement == oldChild){
			this.documentElement = null;
		}
		return _removeChild(this,oldChild);
	},
	// Introduced in DOM Level 2:
	importNode : function(importedNode,deep){
		return importNode(this,importedNode,deep);
	},
	// Introduced in DOM Level 2:
	getElementById :	function(id){
		var rtv = null;
		_visitNode(this.documentElement,function(node){
			if(node.nodeType == ELEMENT_NODE){
				if(node.getAttribute('id') == id){
					rtv = node;
					return true;
				}
			}
		})
		return rtv;
	},
	
	//document factory method:
	createElement :	function(tagName){
		var node = new Element();
		node.ownerDocument = this;
		node.nodeName = tagName;
		node.tagName = tagName;
		node.childNodes = new NodeList();
		var attrs	= node.attributes = new NamedNodeMap();
		attrs._ownerElement = node;
		return node;
	},
	createDocumentFragment :	function(){
		var node = new DocumentFragment();
		node.ownerDocument = this;
		node.childNodes = new NodeList();
		return node;
	},
	createTextNode :	function(data){
		var node = new Text();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createComment :	function(data){
		var node = new Comment();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createCDATASection :	function(data){
		var node = new CDATASection();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createProcessingInstruction :	function(target,data){
		var node = new ProcessingInstruction();
		node.ownerDocument = this;
		node.tagName = node.target = target;
		node.nodeValue= node.data = data;
		return node;
	},
	createAttribute :	function(name){
		var node = new Attr();
		node.ownerDocument	= this;
		node.name = name;
		node.nodeName	= name;
		node.localName = name;
		node.specified = true;
		return node;
	},
	createEntityReference :	function(name){
		var node = new EntityReference();
		node.ownerDocument	= this;
		node.nodeName	= name;
		return node;
	},
	// Introduced in DOM Level 2:
	createElementNS :	function(namespaceURI,qualifiedName){
		var node = new Element();
		var pl = qualifiedName.split(':');
		var attrs	= node.attributes = new NamedNodeMap();
		node.childNodes = new NodeList();
		node.ownerDocument = this;
		node.nodeName = qualifiedName;
		node.tagName = qualifiedName;
		node.namespaceURI = namespaceURI;
		if(pl.length == 2){
			node.prefix = pl[0];
			node.localName = pl[1];
		}else{
			//el.prefix = null;
			node.localName = qualifiedName;
		}
		attrs._ownerElement = node;
		return node;
	},
	// Introduced in DOM Level 2:
	createAttributeNS :	function(namespaceURI,qualifiedName){
		var node = new Attr();
		var pl = qualifiedName.split(':');
		node.ownerDocument = this;
		node.nodeName = qualifiedName;
		node.name = qualifiedName;
		node.namespaceURI = namespaceURI;
		node.specified = true;
		if(pl.length == 2){
			node.prefix = pl[0];
			node.localName = pl[1];
		}else{
			//el.prefix = null;
			node.localName = qualifiedName;
		}
		return node;
	}
};
_extends(Document,Node);


function Element() {
	this._nsMap = {};
};
Element.prototype = {
	nodeType : ELEMENT_NODE,
	hasAttribute : function(name){
		return this.getAttributeNode(name)!=null;
	},
	getAttribute : function(name){
		var attr = this.getAttributeNode(name);
		return attr && attr.value || '';
	},
	getAttributeNode : function(name){
		return this.attributes.getNamedItem(name);
	},
	setAttribute : function(name, value){
		var attr = this.ownerDocument.createAttribute(name);
		attr.value = attr.nodeValue = "" + value;
		this.setAttributeNode(attr)
	},
	removeAttribute : function(name){
		var attr = this.getAttributeNode(name)
		attr && this.removeAttributeNode(attr);
	},
	
	//four real opeartion method
	appendChild:function(newChild){
		if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
			return this.insertBefore(newChild,null);
		}else{
			return _appendSingleChild(this,newChild);
		}
	},
	setAttributeNode : function(newAttr){
		return this.attributes.setNamedItem(newAttr);
	},
	setAttributeNodeNS : function(newAttr){
		return this.attributes.setNamedItemNS(newAttr);
	},
	removeAttributeNode : function(oldAttr){
		//console.log(this == oldAttr.ownerElement)
		return this.attributes.removeNamedItem(oldAttr.nodeName);
	},
	//get real attribute name,and remove it by removeAttributeNode
	removeAttributeNS : function(namespaceURI, localName){
		var old = this.getAttributeNodeNS(namespaceURI, localName);
		old && this.removeAttributeNode(old);
	},
	
	hasAttributeNS : function(namespaceURI, localName){
		return this.getAttributeNodeNS(namespaceURI, localName)!=null;
	},
	getAttributeNS : function(namespaceURI, localName){
		var attr = this.getAttributeNodeNS(namespaceURI, localName);
		return attr && attr.value || '';
	},
	setAttributeNS : function(namespaceURI, qualifiedName, value){
		var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
		attr.value = attr.nodeValue = "" + value;
		this.setAttributeNode(attr)
	},
	getAttributeNodeNS : function(namespaceURI, localName){
		return this.attributes.getNamedItemNS(namespaceURI, localName);
	},
	
	getElementsByTagName : function(tagName){
		return new LiveNodeList(this,function(base){
			var ls = [];
			_visitNode(base,function(node){
				if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
					ls.push(node);
				}
			});
			return ls;
		});
	},
	getElementsByTagNameNS : function(namespaceURI, localName){
		return new LiveNodeList(this,function(base){
			var ls = [];
			_visitNode(base,function(node){
				if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
					ls.push(node);
				}
			});
			return ls;
			
		});
	}
};
Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;


_extends(Element,Node);
function Attr() {
};
Attr.prototype.nodeType = ATTRIBUTE_NODE;
_extends(Attr,Node);


function CharacterData() {
};
CharacterData.prototype = {
	data : '',
	substringData : function(offset, count) {
		return this.data.substring(offset, offset+count);
	},
	appendData: function(text) {
		text = this.data+text;
		this.nodeValue = this.data = text;
		this.length = text.length;
	},
	insertData: function(offset,text) {
		this.replaceData(offset,0,text);
	
	},
	appendChild:function(newChild){
		throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
	},
	deleteData: function(offset, count) {
		this.replaceData(offset,count,"");
	},
	replaceData: function(offset, count, text) {
		var start = this.data.substring(0,offset);
		var end = this.data.substring(offset+count);
		text = start + text + end;
		this.nodeValue = this.data = text;
		this.length = text.length;
	}
}
_extends(CharacterData,Node);
function Text() {
};
Text.prototype = {
	nodeName : "#text",
	nodeType : TEXT_NODE,
	splitText : function(offset) {
		var text = this.data;
		var newText = text.substring(offset);
		text = text.substring(0, offset);
		this.data = this.nodeValue = text;
		this.length = text.length;
		var newNode = this.ownerDocument.createTextNode(newText);
		if(this.parentNode){
			this.parentNode.insertBefore(newNode, this.nextSibling);
		}
		return newNode;
	}
}
_extends(Text,CharacterData);
function Comment() {
};
Comment.prototype = {
	nodeName : "#comment",
	nodeType : COMMENT_NODE
}
_extends(Comment,CharacterData);

function CDATASection() {
};
CDATASection.prototype = {
	nodeName : "#cdata-section",
	nodeType : CDATA_SECTION_NODE
}
_extends(CDATASection,CharacterData);


function DocumentType() {
};
DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
_extends(DocumentType,Node);

function Notation() {
};
Notation.prototype.nodeType = NOTATION_NODE;
_extends(Notation,Node);

function Entity() {
};
Entity.prototype.nodeType = ENTITY_NODE;
_extends(Entity,Node);

function EntityReference() {
};
EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
_extends(EntityReference,Node);

function DocumentFragment() {
};
DocumentFragment.prototype.nodeName =	"#document-fragment";
DocumentFragment.prototype.nodeType =	DOCUMENT_FRAGMENT_NODE;
_extends(DocumentFragment,Node);


function ProcessingInstruction() {
}
ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
_extends(ProcessingInstruction,Node);
function XMLSerializer(){}
XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){
	return nodeSerializeToString.call(node,isHtml,nodeFilter);
}
Node.prototype.toString = nodeSerializeToString;
function nodeSerializeToString(isHtml,nodeFilter){
	var buf = [];
	var refNode = this.nodeType == 9?this.documentElement:this;
	var prefix = refNode.prefix;
	var uri = refNode.namespaceURI;
	
	if(uri && prefix == null){
		//console.log(prefix)
		var prefix = refNode.lookupPrefix(uri);
		if(prefix == null){
			//isHTML = true;
			var visibleNamespaces=[
			{namespace:uri,prefix:null}
			//{namespace:uri,prefix:''}
			]
		}
	}
	serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
	//console.log('###',this.nodeType,uri,prefix,buf.join(''))
	return buf.join('');
}
function needNamespaceDefine(node,isHTML, visibleNamespaces) {
	var prefix = node.prefix||'';
	var uri = node.namespaceURI;
	if (!prefix && !uri){
		return false;
	}
	if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
		|| uri == 'http://www.w3.org/2000/xmlns/'){
		return false;
	}
	
	var i = visibleNamespaces.length 
	//console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
	while (i--) {
		var ns = visibleNamespaces[i];
		// get namespace prefix
		//console.log(node.nodeType,node.tagName,ns.prefix,prefix)
		if (ns.prefix == prefix){
			return ns.namespace != uri;
		}
	}
	//console.log(isHTML,uri,prefix=='')
	//if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
	//	return false;
	//}
	//node.flag = '11111'
	//console.error(3,true,node.flag,node.prefix,node.namespaceURI)
	return true;
}
function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
	if(nodeFilter){
		node = nodeFilter(node);
		if(node){
			if(typeof node == 'string'){
				buf.push(node);
				return;
			}
		}else{
			return;
		}
		//buf.sort.apply(attrs, attributeSorter);
	}
	switch(node.nodeType){
	case ELEMENT_NODE:
		if (!visibleNamespaces) visibleNamespaces = [];
		var startVisibleNamespaces = visibleNamespaces.length;
		var attrs = node.attributes;
		var len = attrs.length;
		var child = node.firstChild;
		var nodeName = node.tagName;
		
		isHTML =  (htmlns === node.namespaceURI) ||isHTML 
		buf.push('<',nodeName);
		
		
		
		for(var i=0;i<len;i++){
			// add namespaces for attributes
			var attr = attrs.item(i);
			if (attr.prefix == 'xmlns') {
				visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
			}else if(attr.nodeName == 'xmlns'){
				visibleNamespaces.push({ prefix: '', namespace: attr.value });
			}
		}
		for(var i=0;i<len;i++){
			var attr = attrs.item(i);
			if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
				var prefix = attr.prefix||'';
				var uri = attr.namespaceURI;
				var ns = prefix ? ' xmlns:' + prefix : " xmlns";
				buf.push(ns, '="' , uri , '"');
				visibleNamespaces.push({ prefix: prefix, namespace:uri });
			}
			serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
		}
		// add namespace for current node		
		if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
			var prefix = node.prefix||'';
			var uri = node.namespaceURI;
			var ns = prefix ? ' xmlns:' + prefix : " xmlns";
			buf.push(ns, '="' , uri , '"');
			visibleNamespaces.push({ prefix: prefix, namespace:uri });
		}
		
		if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
			buf.push('>');
			//if is cdata child node
			if(isHTML && /^script$/i.test(nodeName)){
				while(child){
					if(child.data){
						buf.push(child.data);
					}else{
						serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
					}
					child = child.nextSibling;
				}
			}else
			{
				while(child){
					serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
					child = child.nextSibling;
				}
			}
			buf.push('</',nodeName,'>');
		}else{
			buf.push('/>');
		}
		// remove added visible namespaces
		//visibleNamespaces.length = startVisibleNamespaces;
		return;
	case DOCUMENT_NODE:
	case DOCUMENT_FRAGMENT_NODE:
		var child = node.firstChild;
		while(child){
			serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
			child = child.nextSibling;
		}
		return;
	case ATTRIBUTE_NODE:
		return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
	case TEXT_NODE:
		return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
	case CDATA_SECTION_NODE:
		return buf.push( '<![CDATA[',node.data,']]>');
	case COMMENT_NODE:
		return buf.push( "<!--",node.data,"-->");
	case DOCUMENT_TYPE_NODE:
		var pubid = node.publicId;
		var sysid = node.systemId;
		buf.push('<!DOCTYPE ',node.name);
		if(pubid){
			buf.push(' PUBLIC "',pubid);
			if (sysid && sysid!='.') {
				buf.push( '" "',sysid);
			}
			buf.push('">');
		}else if(sysid && sysid!='.'){
			buf.push(' SYSTEM "',sysid,'">');
		}else{
			var sub = node.internalSubset;
			if(sub){
				buf.push(" [",sub,"]");
			}
			buf.push(">");
		}
		return;
	case PROCESSING_INSTRUCTION_NODE:
		return buf.push( "<?",node.target," ",node.data,"?>");
	case ENTITY_REFERENCE_NODE:
		return buf.push( '&',node.nodeName,';');
	//case ENTITY_NODE:
	//case NOTATION_NODE:
	default:
		buf.push('??',node.nodeName);
	}
}
function importNode(doc,node,deep){
	var node2;
	switch (node.nodeType) {
	case ELEMENT_NODE:
		node2 = node.cloneNode(false);
		node2.ownerDocument = doc;
		//var attrs = node2.attributes;
		//var len = attrs.length;
		//for(var i=0;i<len;i++){
			//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
		//}
	case DOCUMENT_FRAGMENT_NODE:
		break;
	case ATTRIBUTE_NODE:
		deep = true;
		break;
	//case ENTITY_REFERENCE_NODE:
	//case PROCESSING_INSTRUCTION_NODE:
	////case TEXT_NODE:
	//case CDATA_SECTION_NODE:
	//case COMMENT_NODE:
	//	deep = false;
	//	break;
	//case DOCUMENT_NODE:
	//case DOCUMENT_TYPE_NODE:
	//cannot be imported.
	//case ENTITY_NODE:
	//case NOTATION_NODEï¼š
	//can not hit in level3
	//default:throw e;
	}
	if(!node2){
		node2 = node.cloneNode(false);//false
	}
	node2.ownerDocument = doc;
	node2.parentNode = null;
	if(deep){
		var child = node.firstChild;
		while(child){
			node2.appendChild(importNode(doc,child,deep));
			child = child.nextSibling;
		}
	}
	return node2;
}
//
//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
//					attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
function cloneNode(doc,node,deep){
	var node2 = new node.constructor();
	for(var n in node){
		var v = node[n];
		if(typeof v != 'object' ){
			if(v != node2[n]){
				node2[n] = v;
			}
		}
	}
	if(node.childNodes){
		node2.childNodes = new NodeList();
	}
	node2.ownerDocument = doc;
	switch (node2.nodeType) {
	case ELEMENT_NODE:
		var attrs	= node.attributes;
		var attrs2	= node2.attributes = new NamedNodeMap();
		var len = attrs.length
		attrs2._ownerElement = node2;
		for(var i=0;i<len;i++){
			node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
		}
		break;;
	case ATTRIBUTE_NODE:
		deep = true;
	}
	if(deep){
		var child = node.firstChild;
		while(child){
			node2.appendChild(cloneNode(doc,child,deep));
			child = child.nextSibling;
		}
	}
	return node2;
}

function __set__(object,key,value){
	object[key] = value
}
//do dynamic
try{
	if(Object.defineProperty){
		Object.defineProperty(LiveNodeList.prototype,'length',{
			get:function(){
				_updateLiveList(this);
				return this.$$length;
			}
		});
		Object.defineProperty(Node.prototype,'textContent',{
			get:function(){
				return getTextContent(this);
			},
			set:function(data){
				switch(this.nodeType){
				case ELEMENT_NODE:
				case DOCUMENT_FRAGMENT_NODE:
					while(this.firstChild){
						this.removeChild(this.firstChild);
					}
					if(data || String(data)){
						this.appendChild(this.ownerDocument.createTextNode(data));
					}
					break;
				default:
					//TODO:
					this.data = data;
					this.value = data;
					this.nodeValue = data;
				}
			}
		})
		
		function getTextContent(node){
			switch(node.nodeType){
			case ELEMENT_NODE:
			case DOCUMENT_FRAGMENT_NODE:
				var buf = [];
				node = node.firstChild;
				while(node){
					if(node.nodeType!==7 && node.nodeType !==8){
						buf.push(getTextContent(node));
					}
					node = node.nextSibling;
				}
				return buf.join('');
			default:
				return node.nodeValue;
			}
		}
		__set__ = function(object,key,value){
			//console.log(value)
			object['$$'+key] = value
		}
	}
}catch(e){//ie8
}

//if(typeof require == 'function'){
	exports.DOMImplementation = DOMImplementation;
	exports.XMLSerializer = XMLSerializer;
//}
{
  "author": {
    "name": "jindw",
    "email": "jindw@xidea.org",
    "url": "http://www.xidea.org"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "A W3C Standard XML DOM(Level2 CORE) implementation and parser(DOMParser/XMLSerializer).",
  "devDependencies": {
    "proof": "0.0.28"
  },
  "engines": {
    "node": ">=0.1"
  },
  "homepage": "https://github.com/xmldom/xmldom",
  "license": "(LGPL-2.0 or MIT)",
  "main": "./dom-parser.js",
  "maintainers": [
    {
      "name": "jindw",
      "email": "jindw@xidea.org",
      "url": "http://www.xidea.org"
    }
  ],
  "name": "xmldom",
  "repository": {
    "type": "git",
    "url": "git://github.com/xmldom/xmldom.git"
  },
  "version": "0.1.31"
}//[4]   	NameStartChar	   ::=   	":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
//[4a]   	NameChar	   ::=   	NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
//[5]   	Name	   ::=   	NameStartChar (NameChar)*
var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF
var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')

//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
var S_TAG = 0;//tag name offerring
var S_ATTR = 1;//attr name offerring 
var S_ATTR_SPACE=2;//attr name end and space offer
var S_EQ = 3;//=space?
var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
var S_ATTR_END = 5;//attr value end and no space(quot end)
var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
var S_TAG_CLOSE = 7;//closed el<el />

function XMLReader(){
	
}

XMLReader.prototype = {
	parse:function(source,defaultNSMap,entityMap){
		var domBuilder = this.domBuilder;
		domBuilder.startDocument();
		_copy(defaultNSMap ,defaultNSMap = {})
		parse(source,defaultNSMap,entityMap,
				domBuilder,this.errorHandler);
		domBuilder.endDocument();
	}
}
function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
	function fixedFromCharCode(code) {
		// String.prototype.fromCharCode does not supports
		// > 2 bytes unicode chars directly
		if (code > 0xffff) {
			code -= 0x10000;
			var surrogate1 = 0xd800 + (code >> 10)
				, surrogate2 = 0xdc00 + (code & 0x3ff);

			return String.fromCharCode(surrogate1, surrogate2);
		} else {
			return String.fromCharCode(code);
		}
	}
	function entityReplacer(a){
		var k = a.slice(1,-1);
		if(k in entityMap){
			return entityMap[k]; 
		}else if(k.charAt(0) === '#'){
			return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
		}else{
			errorHandler.error('entity not found:'+a);
			return a;
		}
	}
	function appendText(end){//has some bugs
		if(end>start){
			var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
			locator&&position(start);
			domBuilder.characters(xt,0,end-start);
			start = end
		}
	}
	function position(p,m){
		while(p>=lineEnd && (m = linePattern.exec(source))){
			lineStart = m.index;
			lineEnd = lineStart + m[0].length;
			locator.lineNumber++;
			//console.log('line++:',locator,startPos,endPos)
		}
		locator.columnNumber = p-lineStart+1;
	}
	var lineStart = 0;
	var lineEnd = 0;
	var linePattern = /.*(?:\r\n?|\n)|.*$/g
	var locator = domBuilder.locator;
	
	var parseStack = [{currentNSMap:defaultNSMapCopy}]
	var closeMap = {};
	var start = 0;
	while(true){
		try{
			var tagStart = source.indexOf('<',start);
			if(tagStart<0){
				if(!source.substr(start).match(/^\s*$/)){
					var doc = domBuilder.doc;
	    			var text = doc.createTextNode(source.substr(start));
	    			doc.appendChild(text);
	    			domBuilder.currentElement = text;
				}
				return;
			}
			if(tagStart>start){
				appendText(tagStart);
			}
			switch(source.charAt(tagStart+1)){
			case '/':
				var end = source.indexOf('>',tagStart+3);
				var tagName = source.substring(tagStart+2,end);
				var config = parseStack.pop();
				if(end<0){
					
	        		tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
	        		//console.error('#@@@@@@'+tagName)
	        		errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
	        		end = tagStart+1+tagName.length;
	        	}else if(tagName.match(/\s</)){
	        		tagName = tagName.replace(/[\s<].*/,'');
	        		errorHandler.error("end tag name: "+tagName+' maybe not complete');
	        		end = tagStart+1+tagName.length;
				}
				//console.error(parseStack.length,parseStack)
				//console.error(config);
				var localNSMap = config.localNSMap;
				var endMatch = config.tagName == tagName;
				var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()
		        if(endIgnoreCaseMach){
		        	domBuilder.endElement(config.uri,config.localName,tagName);
					if(localNSMap){
						for(var prefix in localNSMap){
							domBuilder.endPrefixMapping(prefix) ;
						}
					}
					if(!endMatch){
		            	errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
					}
		        }else{
		        	parseStack.push(config)
		        }
				
				end++;
				break;
				// end elment
			case '?':// <?...?>
				locator&&position(tagStart);
				end = parseInstruction(source,tagStart,domBuilder);
				break;
			case '!':// <!doctype,<![CDATA,<!--
				locator&&position(tagStart);
				end = parseDCC(source,tagStart,domBuilder,errorHandler);
				break;
			default:
				locator&&position(tagStart);
				var el = new ElementAttributes();
				var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
				//elStartEnd
				var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
				var len = el.length;
				
				
				if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
					el.closed = true;
					if(!entityMap.nbsp){
						errorHandler.warning('unclosed xml attribute');
					}
				}
				if(locator && len){
					var locator2 = copyLocator(locator,{});
					//try{//attribute position fixed
					for(var i = 0;i<len;i++){
						var a = el[i];
						position(a.offset);
						a.locator = copyLocator(locator,{});
					}
					//}catch(e){console.error('@@@@@'+e)}
					domBuilder.locator = locator2
					if(appendElement(el,domBuilder,currentNSMap)){
						parseStack.push(el)
					}
					domBuilder.locator = locator;
				}else{
					if(appendElement(el,domBuilder,currentNSMap)){
						parseStack.push(el)
					}
				}
				
				
				
				if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
					end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)
				}else{
					end++;
				}
			}
		}catch(e){
			errorHandler.error('element parse error: '+e)
			//errorHandler.error('element parse error: '+e);
			end = -1;
			//throw e;
		}
		if(end>start){
			start = end;
		}else{
			//TODO: è¿™é‡Œæœ‰å�¯èƒ½saxå›žé€€ï¼Œæœ‰ä½�ç½®é”™è¯¯é£Žé™©
			appendText(Math.max(tagStart,start)+1);
		}
	}
}
function copyLocator(f,t){
	t.lineNumber = f.lineNumber;
	t.columnNumber = f.columnNumber;
	return t;
}

/**
 * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
 * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
 */
function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
	var attrName;
	var value;
	var p = ++start;
	var s = S_TAG;//status
	while(true){
		var c = source.charAt(p);
		switch(c){
		case '=':
			if(s === S_ATTR){//attrName
				attrName = source.slice(start,p);
				s = S_EQ;
			}else if(s === S_ATTR_SPACE){
				s = S_EQ;
			}else{
				//fatalError: equal must after attrName or space after attrName
				throw new Error('attribute equal must after attrName');
			}
			break;
		case '\'':
		case '"':
			if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
				){//equal
				if(s === S_ATTR){
					errorHandler.warning('attribute value must after "="')
					attrName = source.slice(start,p)
				}
				start = p+1;
				p = source.indexOf(c,start)
				if(p>0){
					value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
					el.add(attrName,value,start-1);
					s = S_ATTR_END;
				}else{
					//fatalError: no end quot match
					throw new Error('attribute value no end \''+c+'\' match');
				}
			}else if(s == S_ATTR_NOQUOT_VALUE){
				value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
				//console.log(attrName,value,start,p)
				el.add(attrName,value,start);
				//console.dir(el)
				errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
				start = p+1;
				s = S_ATTR_END
			}else{
				//fatalError: no equal before
				throw new Error('attribute value must after "="');
			}
			break;
		case '/':
			switch(s){
			case S_TAG:
				el.setTagName(source.slice(start,p));
			case S_ATTR_END:
			case S_TAG_SPACE:
			case S_TAG_CLOSE:
				s =S_TAG_CLOSE;
				el.closed = true;
			case S_ATTR_NOQUOT_VALUE:
			case S_ATTR:
			case S_ATTR_SPACE:
				break;
			//case S_EQ:
			default:
				throw new Error("attribute invalid close char('/')")
			}
			break;
		case ''://end document
			//throw new Error('unexpected end of input')
			errorHandler.error('unexpected end of input');
			if(s == S_TAG){
				el.setTagName(source.slice(start,p));
			}
			return p;
		case '>':
			switch(s){
			case S_TAG:
				el.setTagName(source.slice(start,p));
			case S_ATTR_END:
			case S_TAG_SPACE:
			case S_TAG_CLOSE:
				break;//normal
			case S_ATTR_NOQUOT_VALUE://Compatible state
			case S_ATTR:
				value = source.slice(start,p);
				if(value.slice(-1) === '/'){
					el.closed  = true;
					value = value.slice(0,-1)
				}
			case S_ATTR_SPACE:
				if(s === S_ATTR_SPACE){
					value = attrName;
				}
				if(s == S_ATTR_NOQUOT_VALUE){
					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
					el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start)
				}else{
					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
						errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
					}
					el.add(value,value,start)
				}
				break;
			case S_EQ:
				throw new Error('attribute value missed!!');
			}
//			console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
			return p;
		/*xml space '\x20' | #x9 | #xD | #xA; */
		case '\u0080':
			c = ' ';
		default:
			if(c<= ' '){//space
				switch(s){
				case S_TAG:
					el.setTagName(source.slice(start,p));//tagName
					s = S_TAG_SPACE;
					break;
				case S_ATTR:
					attrName = source.slice(start,p)
					s = S_ATTR_SPACE;
					break;
				case S_ATTR_NOQUOT_VALUE:
					var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
					el.add(attrName,value,start)
				case S_ATTR_END:
					s = S_TAG_SPACE;
					break;
				//case S_TAG_SPACE:
				//case S_EQ:
				//case S_ATTR_SPACE:
				//	void();break;
				//case S_TAG_CLOSE:
					//ignore warning
				}
			}else{//not space
//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
				switch(s){
				//case S_TAG:void();break;
				//case S_ATTR:void();break;
				//case S_ATTR_NOQUOT_VALUE:void();break;
				case S_ATTR_SPACE:
					var tagName =  el.tagName;
					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
						errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!')
					}
					el.add(attrName,attrName,start);
					start = p;
					s = S_ATTR;
					break;
				case S_ATTR_END:
					errorHandler.warning('attribute space is required"'+attrName+'"!!')
				case S_TAG_SPACE:
					s = S_ATTR;
					start = p;
					break;
				case S_EQ:
					s = S_ATTR_NOQUOT_VALUE;
					start = p;
					break;
				case S_TAG_CLOSE:
					throw new Error("elements closed character '/' and '>' must be connected to");
				}
			}
		}//end outer switch
		//console.log('p++',p)
		p++;
	}
}
/**
 * @return true if has new namespace define
 */
function appendElement(el,domBuilder,currentNSMap){
	var tagName = el.tagName;
	var localNSMap = null;
	//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
	var i = el.length;
	while(i--){
		var a = el[i];
		var qName = a.qName;
		var value = a.value;
		var nsp = qName.indexOf(':');
		if(nsp>0){
			var prefix = a.prefix = qName.slice(0,nsp);
			var localName = qName.slice(nsp+1);
			var nsPrefix = prefix === 'xmlns' && localName
		}else{
			localName = qName;
			prefix = null
			nsPrefix = qName === 'xmlns' && ''
		}
		//can not set prefix,because prefix !== ''
		a.localName = localName ;
		//prefix == null for no ns prefix attribute 
		if(nsPrefix !== false){//hack!!
			if(localNSMap == null){
				localNSMap = {}
				//console.log(currentNSMap,0)
				_copy(currentNSMap,currentNSMap={})
				//console.log(currentNSMap,1)
			}
			currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
			a.uri = 'http://www.w3.org/2000/xmlns/'
			domBuilder.startPrefixMapping(nsPrefix, value) 
		}
	}
	var i = el.length;
	while(i--){
		a = el[i];
		var prefix = a.prefix;
		if(prefix){//no prefix attribute has no namespace
			if(prefix === 'xml'){
				a.uri = 'http://www.w3.org/XML/1998/namespace';
			}if(prefix !== 'xmlns'){
				a.uri = currentNSMap[prefix || '']
				
				//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
			}
		}
	}
	var nsp = tagName.indexOf(':');
	if(nsp>0){
		prefix = el.prefix = tagName.slice(0,nsp);
		localName = el.localName = tagName.slice(nsp+1);
	}else{
		prefix = null;//important!!
		localName = el.localName = tagName;
	}
	//no prefix element has default namespace
	var ns = el.uri = currentNSMap[prefix || ''];
	domBuilder.startElement(ns,localName,tagName,el);
	//endPrefixMapping and startPrefixMapping have not any help for dom builder
	//localNSMap = null
	if(el.closed){
		domBuilder.endElement(ns,localName,tagName);
		if(localNSMap){
			for(prefix in localNSMap){
				domBuilder.endPrefixMapping(prefix) 
			}
		}
	}else{
		el.currentNSMap = currentNSMap;
		el.localNSMap = localNSMap;
		//parseStack.push(el);
		return true;
	}
}
function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
	if(/^(?:script|textarea)$/i.test(tagName)){
		var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
		var text = source.substring(elStartEnd+1,elEndStart);
		if(/[&<]/.test(text)){
			if(/^script$/i.test(tagName)){
				//if(!/\]\]>/.test(text)){
					//lexHandler.startCDATA();
					domBuilder.characters(text,0,text.length);
					//lexHandler.endCDATA();
					return elEndStart;
				//}
			}//}else{//text area
				text = text.replace(/&#?\w+;/g,entityReplacer);
				domBuilder.characters(text,0,text.length);
				return elEndStart;
			//}
			
		}
	}
	return elStartEnd+1;
}
function fixSelfClosed(source,elStartEnd,tagName,closeMap){
	//if(tagName in closeMap){
	var pos = closeMap[tagName];
	if(pos == null){
		//console.log(tagName)
		pos =  source.lastIndexOf('</'+tagName+'>')
		if(pos<elStartEnd){//å¿˜è®°é—­å�ˆ
			pos = source.lastIndexOf('</'+tagName)
		}
		closeMap[tagName] =pos
	}
	return pos<elStartEnd;
	//} 
}
function _copy(source,target){
	for(var n in source){target[n] = source[n]}
}
function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
	var next= source.charAt(start+2)
	switch(next){
	case '-':
		if(source.charAt(start + 3) === '-'){
			var end = source.indexOf('-->',start+4);
			//append comment source.substring(4,end)//<!--
			if(end>start){
				domBuilder.comment(source,start+4,end-start-4);
				return end+3;
			}else{
				errorHandler.error("Unclosed comment");
				return -1;
			}
		}else{
			//error
			return -1;
		}
	default:
		if(source.substr(start+3,6) == 'CDATA['){
			var end = source.indexOf(']]>',start+9);
			domBuilder.startCDATA();
			domBuilder.characters(source,start+9,end-start-9);
			domBuilder.endCDATA() 
			return end+3;
		}
		//<!DOCTYPE
		//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
		var matchs = split(source,start);
		var len = matchs.length;
		if(len>1 && /!doctype/i.test(matchs[0][0])){
			var name = matchs[1][0];
			var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0]
			var sysid = len>4 && matchs[4][0];
			var lastMatch = matchs[len-1]
			domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
					sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
			domBuilder.endDTD();
			
			return lastMatch.index+lastMatch[0].length
		}
	}
	return -1;
}



function parseInstruction(source,start,domBuilder){
	var end = source.indexOf('?>',start);
	if(end){
		var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
		if(match){
			var len = match[0].length;
			domBuilder.processingInstruction(match[1], match[2]) ;
			return end+2;
		}else{//error
			return -1;
		}
	}
	return -1;
}

/**
 * @param source
 */
function ElementAttributes(source){
	
}
ElementAttributes.prototype = {
	setTagName:function(tagName){
		if(!tagNamePattern.test(tagName)){
			throw new Error('invalid tagName:'+tagName)
		}
		this.tagName = tagName
	},
	add:function(qName,value,offset){
		if(!tagNamePattern.test(qName)){
			throw new Error('invalid attribute:'+qName)
		}
		this[this.length++] = {qName:qName,value:value,offset:offset}
	},
	length:0,
	getLocalName:function(i){return this[i].localName},
	getLocator:function(i){return this[i].locator},
	getQName:function(i){return this[i].qName},
	getURI:function(i){return this[i].uri},
	getValue:function(i){return this[i].value}
//	,getIndex:function(uri, localName)){
//		if(localName){
//			
//		}else{
//			var qName = uri
//		}
//	},
//	getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
//	getType:function(uri,localName){}
//	getType:function(i){},
}




function _set_proto_(thiz,parent){
	thiz.__proto__ = parent;
	return thiz;
}
if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
	_set_proto_ = function(thiz,parent){
		function p(){};
		p.prototype = parent;
		p = new p();
		for(parent in thiz){
			p[parent] = thiz[parent];
		}
		return p;
	}
}

function split(source,start){
	var match;
	var buf = [];
	var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
	reg.lastIndex = start;
	reg.exec(source);//skip <
	while(match = reg.exec(source)){
		buf.push(match);
		if(match[1])return buf;
	}
}

exports.XMLReader = XMLReader;

(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the 'Software'), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial 
portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

{
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "browser": "./src/browser.js",
  "dependencies": {
    "ms": "2.1.2"
  },
  "deprecated": false,
  "description": "small debugging utility",
  "devDependencies": {
    "brfs": "^2.0.1",
    "browserify": "^16.2.3",
    "coveralls": "^3.0.2",
    "istanbul": "^0.4.5",
    "karma": "^3.1.4",
    "karma-browserify": "^6.0.0",
    "karma-chrome-launcher": "^2.2.0",
    "karma-mocha": "^1.3.0",
    "mocha": "^5.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6.0"
  },
  "files": [
    "src",
    "LICENSE",
    "README.md"
  ],
  "homepage": "https://github.com/visionmedia/debug#readme",
  "license": "MIT",
  "main": "./src/index.js",
  "name": "debug",
  "peerDependenciesMeta": {
    "supports-color": {
      "optional": true
    }
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "version": "4.2.0"
}/* eslint-env browser */

/**
 * This is the web browser implementation of `debug()`.
 */

exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = localstorage();

/**
 * Colors.
 */

exports.colors = [
	'#0000CC',
	'#0000FF',
	'#0033CC',
	'#0033FF',
	'#0066CC',
	'#0066FF',
	'#0099CC',
	'#0099FF',
	'#00CC00',
	'#00CC33',
	'#00CC66',
	'#00CC99',
	'#00CCCC',
	'#00CCFF',
	'#3300CC',
	'#3300FF',
	'#3333CC',
	'#3333FF',
	'#3366CC',
	'#3366FF',
	'#3399CC',
	'#3399FF',
	'#33CC00',
	'#33CC33',
	'#33CC66',
	'#33CC99',
	'#33CCCC',
	'#33CCFF',
	'#6600CC',
	'#6600FF',
	'#6633CC',
	'#6633FF',
	'#66CC00',
	'#66CC33',
	'#9900CC',
	'#9900FF',
	'#9933CC',
	'#9933FF',
	'#99CC00',
	'#99CC33',
	'#CC0000',
	'#CC0033',
	'#CC0066',
	'#CC0099',
	'#CC00CC',
	'#CC00FF',
	'#CC3300',
	'#CC3333',
	'#CC3366',
	'#CC3399',
	'#CC33CC',
	'#CC33FF',
	'#CC6600',
	'#CC6633',
	'#CC9900',
	'#CC9933',
	'#CCCC00',
	'#CCCC33',
	'#FF0000',
	'#FF0033',
	'#FF0066',
	'#FF0099',
	'#FF00CC',
	'#FF00FF',
	'#FF3300',
	'#FF3333',
	'#FF3366',
	'#FF3399',
	'#FF33CC',
	'#FF33FF',
	'#FF6600',
	'#FF6633',
	'#FF9900',
	'#FF9933',
	'#FFCC00',
	'#FFCC33'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

// eslint-disable-next-line complexity
function useColors() {
	// NB: In an Electron preload script, document will be defined but not fully
	// initialized. Since we know we're in Chrome, we'll just detect this case
	// explicitly
	if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
		return true;
	}

	// Internet Explorer and Edge do not support colors.
	if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
		return false;
	}

	// Is webkit? http://stackoverflow.com/a/16459606/376773
	// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
	return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
		// Is firebug? http://stackoverflow.com/a/398120/376773
		(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
		// Is firefox >= v31?
		// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
		// Double check webkit in userAgent just in case we are in a worker
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	args[0] = (this.useColors ? '%c' : '') +
		this.namespace +
		(this.useColors ? ' %c' : ' ') +
		args[0] +
		(this.useColors ? '%c ' : ' ') +
		'+' + module.exports.humanize(this.diff);

	if (!this.useColors) {
		return;
	}

	const c = 'color: ' + this.color;
	args.splice(1, 0, c, 'color: inherit');

	// The final "%c" is somewhat tricky, because there could be other
	// arguments passed either before or after the %c, so we need to
	// figure out the correct index to insert the CSS into
	let index = 0;
	let lastC = 0;
	args[0].replace(/%[a-zA-Z%]/g, match => {
		if (match === '%%') {
			return;
		}
		index++;
		if (match === '%c') {
			// We only are interested in the *last* %c
			// (the user may have provided their own)
			lastC = index;
		}
	});

	args.splice(lastC, 0, c);
}

/**
 * Invokes `console.debug()` when available.
 * No-op when `console.debug` is not a "function".
 * If `console.debug` is not available, falls back
 * to `console.log`.
 *
 * @api public
 */
exports.log = console.debug || console.log || (() => {});

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	try {
		if (namespaces) {
			exports.storage.setItem('debug', namespaces);
		} else {
			exports.storage.removeItem('debug');
		}
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */
function load() {
	let r;
	try {
		r = exports.storage.getItem('debug');
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}

	// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
	if (!r && typeof process !== 'undefined' && 'env' in process) {
		r = process.env.DEBUG;
	}

	return r;
}

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
	try {
		// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
		// The Browser also has localStorage in the global context.
		return localStorage;
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

formatters.j = function (v) {
	try {
		return JSON.stringify(v);
	} catch (error) {
		return '[UnexpectedJSONParseError]: ' + error.message;
	}
};

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 */

function setup(env) {
	createDebug.debug = createDebug;
	createDebug.default = createDebug;
	createDebug.coerce = coerce;
	createDebug.disable = disable;
	createDebug.enable = enable;
	createDebug.enabled = enabled;
	createDebug.humanize = require('ms');

	Object.keys(env).forEach(key => {
		createDebug[key] = env[key];
	});

	/**
	* Active `debug` instances.
	*/
	createDebug.instances = [];

	/**
	* The currently active debug mode names, and names to skip.
	*/

	createDebug.names = [];
	createDebug.skips = [];

	/**
	* Map of special "%n" handling functions, for the debug "format" argument.
	*
	* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
	*/
	createDebug.formatters = {};

	/**
	* Selects a color for a debug namespace
	* @param {String} namespace The namespace string for the for the debug instance to be colored
	* @return {Number|String} An ANSI color code for the given namespace
	* @api private
	*/
	function selectColor(namespace) {
		let hash = 0;

		for (let i = 0; i < namespace.length; i++) {
			hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
			hash |= 0; // Convert to 32bit integer
		}

		return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
	}
	createDebug.selectColor = selectColor;

	/**
	* Create a debugger with the given `namespace`.
	*
	* @param {String} namespace
	* @return {Function}
	* @api public
	*/
	function createDebug(namespace) {
		let prevTime;

		function debug(...args) {
			// Disabled?
			if (!debug.enabled) {
				return;
			}

			const self = debug;

			// Set `diff` timestamp
			const curr = Number(new Date());
			const ms = curr - (prevTime || curr);
			self.diff = ms;
			self.prev = prevTime;
			self.curr = curr;
			prevTime = curr;

			args[0] = createDebug.coerce(args[0]);

			if (typeof args[0] !== 'string') {
				// Anything else let's inspect with %O
				args.unshift('%O');
			}

			// Apply any `formatters` transformations
			let index = 0;
			args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
				// If we encounter an escaped % then don't increase the array index
				if (match === '%%') {
					return match;
				}
				index++;
				const formatter = createDebug.formatters[format];
				if (typeof formatter === 'function') {
					const val = args[index];
					match = formatter.call(self, val);

					// Now we need to remove `args[index]` since it's inlined in the `format`
					args.splice(index, 1);
					index--;
				}
				return match;
			});

			// Apply env-specific formatting (colors, etc.)
			createDebug.formatArgs.call(self, args);

			const logFn = self.log || createDebug.log;
			logFn.apply(self, args);
		}

		debug.namespace = namespace;
		debug.enabled = createDebug.enabled(namespace);
		debug.useColors = createDebug.useColors();
		debug.color = createDebug.selectColor(namespace);
		debug.destroy = destroy;
		debug.extend = extend;

		// Env-specific initialization logic for debug instances
		if (typeof createDebug.init === 'function') {
			createDebug.init(debug);
		}

		createDebug.instances.push(debug);

		return debug;
	}

	function destroy() {
		const index = createDebug.instances.indexOf(this);
		if (index !== -1) {
			createDebug.instances.splice(index, 1);
			return true;
		}
		return false;
	}

	function extend(namespace, delimiter) {
		const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
		newDebug.log = this.log;
		return newDebug;
	}

	/**
	* Enables a debug mode by namespaces. This can include modes
	* separated by a colon and wildcards.
	*
	* @param {String} namespaces
	* @api public
	*/
	function enable(namespaces) {
		createDebug.save(namespaces);

		createDebug.names = [];
		createDebug.skips = [];

		let i;
		const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
		const len = split.length;

		for (i = 0; i < len; i++) {
			if (!split[i]) {
				// ignore empty strings
				continue;
			}

			namespaces = split[i].replace(/\*/g, '.*?');

			if (namespaces[0] === '-') {
				createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
			} else {
				createDebug.names.push(new RegExp('^' + namespaces + '$'));
			}
		}

		for (i = 0; i < createDebug.instances.length; i++) {
			const instance = createDebug.instances[i];
			instance.enabled = createDebug.enabled(instance.namespace);
		}
	}

	/**
	* Disable debug output.
	*
	* @return {String} namespaces
	* @api public
	*/
	function disable() {
		const namespaces = [
			...createDebug.names.map(toNamespace),
			...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
		].join(',');
		createDebug.enable('');
		return namespaces;
	}

	/**
	* Returns true if the given mode name is enabled, false otherwise.
	*
	* @param {String} name
	* @return {Boolean}
	* @api public
	*/
	function enabled(name) {
		if (name[name.length - 1] === '*') {
			return true;
		}

		let i;
		let len;

		for (i = 0, len = createDebug.skips.length; i < len; i++) {
			if (createDebug.skips[i].test(name)) {
				return false;
			}
		}

		for (i = 0, len = createDebug.names.length; i < len; i++) {
			if (createDebug.names[i].test(name)) {
				return true;
			}
		}

		return false;
	}

	/**
	* Convert regexp to namespace
	*
	* @param {RegExp} regxep
	* @return {String} namespace
	* @api private
	*/
	function toNamespace(regexp) {
		return regexp.toString()
			.substring(2, regexp.toString().length - 2)
			.replace(/\.\*\?$/, '*');
	}

	/**
	* Coerce `val`.
	*
	* @param {Mixed} val
	* @return {Mixed}
	* @api private
	*/
	function coerce(val) {
		if (val instanceof Error) {
			return val.stack || val.message;
		}
		return val;
	}

	createDebug.enable(createDebug.load());

	return createDebug;
}

module.exports = setup;
/**
 * Detect Electron renderer / nwjs process, which is node, but we should
 * treat as a browser.
 */

if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
	module.exports = require('./browser.js');
} else {
	module.exports = require('./node.js');
}
/**
 * Module dependencies.
 */

const tty = require('tty');
const util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 */

exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

try {
	// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
	// eslint-disable-next-line import/no-extraneous-dependencies
	const supportsColor = require('supports-color');

	if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
		exports.colors = [
			20,
			21,
			26,
			27,
			32,
			33,
			38,
			39,
			40,
			41,
			42,
			43,
			44,
			45,
			56,
			57,
			62,
			63,
			68,
			69,
			74,
			75,
			76,
			77,
			78,
			79,
			80,
			81,
			92,
			93,
			98,
			99,
			112,
			113,
			128,
			129,
			134,
			135,
			148,
			149,
			160,
			161,
			162,
			163,
			164,
			165,
			166,
			167,
			168,
			169,
			170,
			171,
			172,
			173,
			178,
			179,
			184,
			185,
			196,
			197,
			198,
			199,
			200,
			201,
			202,
			203,
			204,
			205,
			206,
			207,
			208,
			209,
			214,
			215,
			220,
			221
		];
	}
} catch (error) {
	// Swallow - we only care if `supports-color` is available; it doesn't have to be.
}

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(key => {
	return /^debug_/i.test(key);
}).reduce((obj, key) => {
	// Camel-case
	const prop = key
		.substring(6)
		.toLowerCase()
		.replace(/_([a-z])/g, (_, k) => {
			return k.toUpperCase();
		});

	// Coerce string value into JS value
	let val = process.env[key];
	if (/^(yes|on|true|enabled)$/i.test(val)) {
		val = true;
	} else if (/^(no|off|false|disabled)$/i.test(val)) {
		val = false;
	} else if (val === 'null') {
		val = null;
	} else {
		val = Number(val);
	}

	obj[prop] = val;
	return obj;
}, {});

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
	return 'colors' in exports.inspectOpts ?
		Boolean(exports.inspectOpts.colors) :
		tty.isatty(process.stderr.fd);
}

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	const {namespace: name, useColors} = this;

	if (useColors) {
		const c = this.color;
		const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
		const prefix = `  ${colorCode};1m${name} \u001B[0m`;

		args[0] = prefix + args[0].split('\n').join('\n' + prefix);
		args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
	} else {
		args[0] = getDate() + name + ' ' + args[0];
	}
}

function getDate() {
	if (exports.inspectOpts.hideDate) {
		return '';
	}
	return new Date().toISOString() + ' ';
}

/**
 * Invokes `util.format()` with the specified arguments and writes to stderr.
 */

function log(...args) {
	return process.stderr.write(util.format(...args) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	if (namespaces) {
		process.env.DEBUG = namespaces;
	} else {
		// If you set a process.env field to null or undefined, it gets cast to the
		// string 'null' or 'undefined'. Just delete instead.
		delete process.env.DEBUG;
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
	return process.env.DEBUG;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init(debug) {
	debug.inspectOpts = {};

	const keys = Object.keys(exports.inspectOpts);
	for (let i = 0; i < keys.length; i++) {
		debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

formatters.o = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts)
		.replace(/\s*\n\s*/g, ' ');
};

/**
 * Map %O to `util.inspect()`, allowing multiple lines if needed.
 */

formatters.O = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts);
};
The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
{
  "bin": {
    "semver": "bin/semver.js"
  },
  "deprecated": false,
  "description": "The semantic version parser used by npm.",
  "devDependencies": {
    "tap": "^14.3.1"
  },
  "files": [
    "bin",
    "range.bnf",
    "semver.js"
  ],
  "homepage": "https://github.com/npm/node-semver#readme",
  "license": "ISC",
  "main": "semver.js",
  "name": "semver",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/node-semver.git"
  },
  "tap": {
    "check-coverage": true
  },
  "version": "6.3.0"
}range-set  ::= range ( logical-or range ) *
logical-or ::= ( ' ' ) * '||' ( ' ' ) *
range      ::= hyphen | simple ( ' ' simple ) * | ''
hyphen     ::= partial ' - ' partial
simple     ::= primitive | partial | tilde | caret
primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
xr         ::= 'x' | 'X' | '*' | nr
nr         ::= '0' | [1-9] ( [0-9] ) *
tilde      ::= '~' partial
caret      ::= '^' partial
qualifier  ::= ( '-' pre )? ( '+' build )?
pre        ::= parts
build      ::= parts
parts      ::= part ( '.' part ) *
part       ::= nr | [-0-9A-Za-z]+
exports = module.exports = SemVer

var debug
/* istanbul ignore next */
if (typeof process === 'object' &&
    process.env &&
    process.env.NODE_DEBUG &&
    /\bsemver\b/i.test(process.env.NODE_DEBUG)) {
  debug = function () {
    var args = Array.prototype.slice.call(arguments, 0)
    args.unshift('SEMVER')
    console.log.apply(console, args)
  }
} else {
  debug = function () {}
}

// Note: this is the semver.org version of the spec that it implements
// Not necessarily the package version of this code.
exports.SEMVER_SPEC_VERSION = '2.0.0'

var MAX_LENGTH = 256
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
  /* istanbul ignore next */ 9007199254740991

// Max safe segment length for coercion.
var MAX_SAFE_COMPONENT_LENGTH = 16

// The actual regexps go on exports.re
var re = exports.re = []
var src = exports.src = []
var t = exports.tokens = {}
var R = 0

function tok (n) {
  t[n] = R++
}

// The following Regular Expressions can be used for tokenizing,
// validating, and parsing SemVer version strings.

// ## Numeric Identifier
// A single `0`, or a non-zero digit followed by zero or more digits.

tok('NUMERICIDENTIFIER')
src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*'
tok('NUMERICIDENTIFIERLOOSE')
src[t.NUMERICIDENTIFIERLOOSE] = '[0-9]+'

// ## Non-numeric Identifier
// Zero or more digits, followed by a letter or hyphen, and then zero or
// more letters, digits, or hyphens.

tok('NONNUMERICIDENTIFIER')
src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'

// ## Main Version
// Three dot-separated numeric identifiers.

tok('MAINVERSION')
src[t.MAINVERSION] = '(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[t.NUMERICIDENTIFIER] + ')'

tok('MAINVERSIONLOOSE')
src[t.MAINVERSIONLOOSE] = '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')'

// ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier.

tok('PRERELEASEIDENTIFIER')
src[t.PRERELEASEIDENTIFIER] = '(?:' + src[t.NUMERICIDENTIFIER] +
                            '|' + src[t.NONNUMERICIDENTIFIER] + ')'

tok('PRERELEASEIDENTIFIERLOOSE')
src[t.PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[t.NUMERICIDENTIFIERLOOSE] +
                                 '|' + src[t.NONNUMERICIDENTIFIER] + ')'

// ## Pre-release Version
// Hyphen, followed by one or more dot-separated pre-release version
// identifiers.

tok('PRERELEASE')
src[t.PRERELEASE] = '(?:-(' + src[t.PRERELEASEIDENTIFIER] +
                  '(?:\\.' + src[t.PRERELEASEIDENTIFIER] + ')*))'

tok('PRERELEASELOOSE')
src[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] +
                       '(?:\\.' + src[t.PRERELEASEIDENTIFIERLOOSE] + ')*))'

// ## Build Metadata Identifier
// Any combination of digits, letters, or hyphens.

tok('BUILDIDENTIFIER')
src[t.BUILDIDENTIFIER] = '[0-9A-Za-z-]+'

// ## Build Metadata
// Plus sign, followed by one or more period-separated build metadata
// identifiers.

tok('BUILD')
src[t.BUILD] = '(?:\\+(' + src[t.BUILDIDENTIFIER] +
             '(?:\\.' + src[t.BUILDIDENTIFIER] + ')*))'

// ## Full Version String
// A main version, followed optionally by a pre-release version and
// build metadata.

// Note that the only major, minor, patch, and pre-release sections of
// the version string are capturing groups.  The build metadata is not a
// capturing group, because it should not ever be used in version
// comparison.

tok('FULL')
tok('FULLPLAIN')
src[t.FULLPLAIN] = 'v?' + src[t.MAINVERSION] +
                  src[t.PRERELEASE] + '?' +
                  src[t.BUILD] + '?'

src[t.FULL] = '^' + src[t.FULLPLAIN] + '$'

// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
// common in the npm registry.
tok('LOOSEPLAIN')
src[t.LOOSEPLAIN] = '[v=\\s]*' + src[t.MAINVERSIONLOOSE] +
                  src[t.PRERELEASELOOSE] + '?' +
                  src[t.BUILD] + '?'

tok('LOOSE')
src[t.LOOSE] = '^' + src[t.LOOSEPLAIN] + '$'

tok('GTLT')
src[t.GTLT] = '((?:<|>)?=?)'

// Something like "2.*" or "1.2.x".
// Note that "x.x" is a valid xRange identifer, meaning "any version"
// Only the first item is strictly required.
tok('XRANGEIDENTIFIERLOOSE')
src[t.XRANGEIDENTIFIERLOOSE] = src[t.NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'
tok('XRANGEIDENTIFIER')
src[t.XRANGEIDENTIFIER] = src[t.NUMERICIDENTIFIER] + '|x|X|\\*'

tok('XRANGEPLAIN')
src[t.XRANGEPLAIN] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
                   '(?:' + src[t.PRERELEASE] + ')?' +
                   src[t.BUILD] + '?' +
                   ')?)?'

tok('XRANGEPLAINLOOSE')
src[t.XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:' + src[t.PRERELEASELOOSE] + ')?' +
                        src[t.BUILD] + '?' +
                        ')?)?'

tok('XRANGE')
src[t.XRANGE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAIN] + '$'
tok('XRANGELOOSE')
src[t.XRANGELOOSE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAINLOOSE] + '$'

// Coercion.
// Extract anything that could conceivably be a part of a valid semver
tok('COERCE')
src[t.COERCE] = '(^|[^\\d])' +
              '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:$|[^\\d])'
tok('COERCERTL')
re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g')

// Tilde ranges.
// Meaning is "reasonably at or greater than"
tok('LONETILDE')
src[t.LONETILDE] = '(?:~>?)'

tok('TILDETRIM')
src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+'
re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g')
var tildeTrimReplace = '$1~'

tok('TILDE')
src[t.TILDE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAIN] + '$'
tok('TILDELOOSE')
src[t.TILDELOOSE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAINLOOSE] + '$'

// Caret ranges.
// Meaning is "at least and backwards compatible with"
tok('LONECARET')
src[t.LONECARET] = '(?:\\^)'

tok('CARETTRIM')
src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+'
re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g')
var caretTrimReplace = '$1^'

tok('CARET')
src[t.CARET] = '^' + src[t.LONECARET] + src[t.XRANGEPLAIN] + '$'
tok('CARETLOOSE')
src[t.CARETLOOSE] = '^' + src[t.LONECARET] + src[t.XRANGEPLAINLOOSE] + '$'

// A simple gt/lt/eq thing, or just "" to indicate "any version"
tok('COMPARATORLOOSE')
src[t.COMPARATORLOOSE] = '^' + src[t.GTLT] + '\\s*(' + src[t.LOOSEPLAIN] + ')$|^$'
tok('COMPARATOR')
src[t.COMPARATOR] = '^' + src[t.GTLT] + '\\s*(' + src[t.FULLPLAIN] + ')$|^$'

// An expression to strip any whitespace between the gtlt and the thing
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
tok('COMPARATORTRIM')
src[t.COMPARATORTRIM] = '(\\s*)' + src[t.GTLT] +
                      '\\s*(' + src[t.LOOSEPLAIN] + '|' + src[t.XRANGEPLAIN] + ')'

// this one has to use the /g flag
re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g')
var comparatorTrimReplace = '$1$2$3'

// Something like `1.2.3 - 1.2.4`
// Note that these all use the loose form, because they'll be
// checked against either the strict or loose comparator form
// later.
tok('HYPHENRANGE')
src[t.HYPHENRANGE] = '^\\s*(' + src[t.XRANGEPLAIN] + ')' +
                   '\\s+-\\s+' +
                   '(' + src[t.XRANGEPLAIN] + ')' +
                   '\\s*$'

tok('HYPHENRANGELOOSE')
src[t.HYPHENRANGELOOSE] = '^\\s*(' + src[t.XRANGEPLAINLOOSE] + ')' +
                        '\\s+-\\s+' +
                        '(' + src[t.XRANGEPLAINLOOSE] + ')' +
                        '\\s*$'

// Star ranges basically just allow anything at all.
tok('STAR')
src[t.STAR] = '(<|>)?=?\\s*\\*'

// Compile to actual regexp objects.
// All are flag-free, unless they were created above with a flag.
for (var i = 0; i < R; i++) {
  debug(i, src[i])
  if (!re[i]) {
    re[i] = new RegExp(src[i])
  }
}

exports.parse = parse
function parse (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (version instanceof SemVer) {
    return version
  }

  if (typeof version !== 'string') {
    return null
  }

  if (version.length > MAX_LENGTH) {
    return null
  }

  var r = options.loose ? re[t.LOOSE] : re[t.FULL]
  if (!r.test(version)) {
    return null
  }

  try {
    return new SemVer(version, options)
  } catch (er) {
    return null
  }
}

exports.valid = valid
function valid (version, options) {
  var v = parse(version, options)
  return v ? v.version : null
}

exports.clean = clean
function clean (version, options) {
  var s = parse(version.trim().replace(/^[=v]+/, ''), options)
  return s ? s.version : null
}

exports.SemVer = SemVer

function SemVer (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }
  if (version instanceof SemVer) {
    if (version.loose === options.loose) {
      return version
    } else {
      version = version.version
    }
  } else if (typeof version !== 'string') {
    throw new TypeError('Invalid Version: ' + version)
  }

  if (version.length > MAX_LENGTH) {
    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
  }

  if (!(this instanceof SemVer)) {
    return new SemVer(version, options)
  }

  debug('SemVer', version, options)
  this.options = options
  this.loose = !!options.loose

  var m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])

  if (!m) {
    throw new TypeError('Invalid Version: ' + version)
  }

  this.raw = version

  // these are actually numbers
  this.major = +m[1]
  this.minor = +m[2]
  this.patch = +m[3]

  if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
    throw new TypeError('Invalid major version')
  }

  if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
    throw new TypeError('Invalid minor version')
  }

  if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
    throw new TypeError('Invalid patch version')
  }

  // numberify any prerelease numeric ids
  if (!m[4]) {
    this.prerelease = []
  } else {
    this.prerelease = m[4].split('.').map(function (id) {
      if (/^[0-9]+$/.test(id)) {
        var num = +id
        if (num >= 0 && num < MAX_SAFE_INTEGER) {
          return num
        }
      }
      return id
    })
  }

  this.build = m[5] ? m[5].split('.') : []
  this.format()
}

SemVer.prototype.format = function () {
  this.version = this.major + '.' + this.minor + '.' + this.patch
  if (this.prerelease.length) {
    this.version += '-' + this.prerelease.join('.')
  }
  return this.version
}

SemVer.prototype.toString = function () {
  return this.version
}

SemVer.prototype.compare = function (other) {
  debug('SemVer.compare', this.version, this.options, other)
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  return this.compareMain(other) || this.comparePre(other)
}

SemVer.prototype.compareMain = function (other) {
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  return compareIdentifiers(this.major, other.major) ||
         compareIdentifiers(this.minor, other.minor) ||
         compareIdentifiers(this.patch, other.patch)
}

SemVer.prototype.comparePre = function (other) {
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  // NOT having a prerelease is > having one
  if (this.prerelease.length && !other.prerelease.length) {
    return -1
  } else if (!this.prerelease.length && other.prerelease.length) {
    return 1
  } else if (!this.prerelease.length && !other.prerelease.length) {
    return 0
  }

  var i = 0
  do {
    var a = this.prerelease[i]
    var b = other.prerelease[i]
    debug('prerelease compare', i, a, b)
    if (a === undefined && b === undefined) {
      return 0
    } else if (b === undefined) {
      return 1
    } else if (a === undefined) {
      return -1
    } else if (a === b) {
      continue
    } else {
      return compareIdentifiers(a, b)
    }
  } while (++i)
}

SemVer.prototype.compareBuild = function (other) {
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  var i = 0
  do {
    var a = this.build[i]
    var b = other.build[i]
    debug('prerelease compare', i, a, b)
    if (a === undefined && b === undefined) {
      return 0
    } else if (b === undefined) {
      return 1
    } else if (a === undefined) {
      return -1
    } else if (a === b) {
      continue
    } else {
      return compareIdentifiers(a, b)
    }
  } while (++i)
}

// preminor will bump the version up to the next minor release, and immediately
// down to pre-release. premajor and prepatch work the same way.
SemVer.prototype.inc = function (release, identifier) {
  switch (release) {
    case 'premajor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor = 0
      this.major++
      this.inc('pre', identifier)
      break
    case 'preminor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor++
      this.inc('pre', identifier)
      break
    case 'prepatch':
      // If this is already a prerelease, it will bump to the next version
      // drop any prereleases that might already exist, since they are not
      // relevant at this point.
      this.prerelease.length = 0
      this.inc('patch', identifier)
      this.inc('pre', identifier)
      break
    // If the input is a non-prerelease version, this acts the same as
    // prepatch.
    case 'prerelease':
      if (this.prerelease.length === 0) {
        this.inc('patch', identifier)
      }
      this.inc('pre', identifier)
      break

    case 'major':
      // If this is a pre-major version, bump up to the same major version.
      // Otherwise increment major.
      // 1.0.0-5 bumps to 1.0.0
      // 1.1.0 bumps to 2.0.0
      if (this.minor !== 0 ||
          this.patch !== 0 ||
          this.prerelease.length === 0) {
        this.major++
      }
      this.minor = 0
      this.patch = 0
      this.prerelease = []
      break
    case 'minor':
      // If this is a pre-minor version, bump up to the same minor version.
      // Otherwise increment minor.
      // 1.2.0-5 bumps to 1.2.0
      // 1.2.1 bumps to 1.3.0
      if (this.patch !== 0 || this.prerelease.length === 0) {
        this.minor++
      }
      this.patch = 0
      this.prerelease = []
      break
    case 'patch':
      // If this is not a pre-release version, it will increment the patch.
      // If it is a pre-release it will bump up to the same patch version.
      // 1.2.0-5 patches to 1.2.0
      // 1.2.0 patches to 1.2.1
      if (this.prerelease.length === 0) {
        this.patch++
      }
      this.prerelease = []
      break
    // This probably shouldn't be used publicly.
    // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
    case 'pre':
      if (this.prerelease.length === 0) {
        this.prerelease = [0]
      } else {
        var i = this.prerelease.length
        while (--i >= 0) {
          if (typeof this.prerelease[i] === 'number') {
            this.prerelease[i]++
            i = -2
          }
        }
        if (i === -1) {
          // didn't increment anything
          this.prerelease.push(0)
        }
      }
      if (identifier) {
        // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
        // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
        if (this.prerelease[0] === identifier) {
          if (isNaN(this.prerelease[1])) {
            this.prerelease = [identifier, 0]
          }
        } else {
          this.prerelease = [identifier, 0]
        }
      }
      break

    default:
      throw new Error('invalid increment argument: ' + release)
  }
  this.format()
  this.raw = this.version
  return this
}

exports.inc = inc
function inc (version, release, loose, identifier) {
  if (typeof (loose) === 'string') {
    identifier = loose
    loose = undefined
  }

  try {
    return new SemVer(version, loose).inc(release, identifier).version
  } catch (er) {
    return null
  }
}

exports.diff = diff
function diff (version1, version2) {
  if (eq(version1, version2)) {
    return null
  } else {
    var v1 = parse(version1)
    var v2 = parse(version2)
    var prefix = ''
    if (v1.prerelease.length || v2.prerelease.length) {
      prefix = 'pre'
      var defaultResult = 'prerelease'
    }
    for (var key in v1) {
      if (key === 'major' || key === 'minor' || key === 'patch') {
        if (v1[key] !== v2[key]) {
          return prefix + key
        }
      }
    }
    return defaultResult // may be undefined
  }
}

exports.compareIdentifiers = compareIdentifiers

var numeric = /^[0-9]+$/
function compareIdentifiers (a, b) {
  var anum = numeric.test(a)
  var bnum = numeric.test(b)

  if (anum && bnum) {
    a = +a
    b = +b
  }

  return a === b ? 0
    : (anum && !bnum) ? -1
    : (bnum && !anum) ? 1
    : a < b ? -1
    : 1
}

exports.rcompareIdentifiers = rcompareIdentifiers
function rcompareIdentifiers (a, b) {
  return compareIdentifiers(b, a)
}

exports.major = major
function major (a, loose) {
  return new SemVer(a, loose).major
}

exports.minor = minor
function minor (a, loose) {
  return new SemVer(a, loose).minor
}

exports.patch = patch
function patch (a, loose) {
  return new SemVer(a, loose).patch
}

exports.compare = compare
function compare (a, b, loose) {
  return new SemVer(a, loose).compare(new SemVer(b, loose))
}

exports.compareLoose = compareLoose
function compareLoose (a, b) {
  return compare(a, b, true)
}

exports.compareBuild = compareBuild
function compareBuild (a, b, loose) {
  var versionA = new SemVer(a, loose)
  var versionB = new SemVer(b, loose)
  return versionA.compare(versionB) || versionA.compareBuild(versionB)
}

exports.rcompare = rcompare
function rcompare (a, b, loose) {
  return compare(b, a, loose)
}

exports.sort = sort
function sort (list, loose) {
  return list.sort(function (a, b) {
    return exports.compareBuild(a, b, loose)
  })
}

exports.rsort = rsort
function rsort (list, loose) {
  return list.sort(function (a, b) {
    return exports.compareBuild(b, a, loose)
  })
}

exports.gt = gt
function gt (a, b, loose) {
  return compare(a, b, loose) > 0
}

exports.lt = lt
function lt (a, b, loose) {
  return compare(a, b, loose) < 0
}

exports.eq = eq
function eq (a, b, loose) {
  return compare(a, b, loose) === 0
}

exports.neq = neq
function neq (a, b, loose) {
  return compare(a, b, loose) !== 0
}

exports.gte = gte
function gte (a, b, loose) {
  return compare(a, b, loose) >= 0
}

exports.lte = lte
function lte (a, b, loose) {
  return compare(a, b, loose) <= 0
}

exports.cmp = cmp
function cmp (a, op, b, loose) {
  switch (op) {
    case '===':
      if (typeof a === 'object')
        a = a.version
      if (typeof b === 'object')
        b = b.version
      return a === b

    case '!==':
      if (typeof a === 'object')
        a = a.version
      if (typeof b === 'object')
        b = b.version
      return a !== b

    case '':
    case '=':
    case '==':
      return eq(a, b, loose)

    case '!=':
      return neq(a, b, loose)

    case '>':
      return gt(a, b, loose)

    case '>=':
      return gte(a, b, loose)

    case '<':
      return lt(a, b, loose)

    case '<=':
      return lte(a, b, loose)

    default:
      throw new TypeError('Invalid operator: ' + op)
  }
}

exports.Comparator = Comparator
function Comparator (comp, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (comp instanceof Comparator) {
    if (comp.loose === !!options.loose) {
      return comp
    } else {
      comp = comp.value
    }
  }

  if (!(this instanceof Comparator)) {
    return new Comparator(comp, options)
  }

  debug('comparator', comp, options)
  this.options = options
  this.loose = !!options.loose
  this.parse(comp)

  if (this.semver === ANY) {
    this.value = ''
  } else {
    this.value = this.operator + this.semver.version
  }

  debug('comp', this)
}

var ANY = {}
Comparator.prototype.parse = function (comp) {
  var r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
  var m = comp.match(r)

  if (!m) {
    throw new TypeError('Invalid comparator: ' + comp)
  }

  this.operator = m[1] !== undefined ? m[1] : ''
  if (this.operator === '=') {
    this.operator = ''
  }

  // if it literally is just '>' or '' then allow anything.
  if (!m[2]) {
    this.semver = ANY
  } else {
    this.semver = new SemVer(m[2], this.options.loose)
  }
}

Comparator.prototype.toString = function () {
  return this.value
}

Comparator.prototype.test = function (version) {
  debug('Comparator.test', version, this.options.loose)

  if (this.semver === ANY || version === ANY) {
    return true
  }

  if (typeof version === 'string') {
    try {
      version = new SemVer(version, this.options)
    } catch (er) {
      return false
    }
  }

  return cmp(version, this.operator, this.semver, this.options)
}

Comparator.prototype.intersects = function (comp, options) {
  if (!(comp instanceof Comparator)) {
    throw new TypeError('a Comparator is required')
  }

  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  var rangeTmp

  if (this.operator === '') {
    if (this.value === '') {
      return true
    }
    rangeTmp = new Range(comp.value, options)
    return satisfies(this.value, rangeTmp, options)
  } else if (comp.operator === '') {
    if (comp.value === '') {
      return true
    }
    rangeTmp = new Range(this.value, options)
    return satisfies(comp.semver, rangeTmp, options)
  }

  var sameDirectionIncreasing =
    (this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '>=' || comp.operator === '>')
  var sameDirectionDecreasing =
    (this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '<=' || comp.operator === '<')
  var sameSemVer = this.semver.version === comp.semver.version
  var differentDirectionsInclusive =
    (this.operator === '>=' || this.operator === '<=') &&
    (comp.operator === '>=' || comp.operator === '<=')
  var oppositeDirectionsLessThan =
    cmp(this.semver, '<', comp.semver, options) &&
    ((this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '<=' || comp.operator === '<'))
  var oppositeDirectionsGreaterThan =
    cmp(this.semver, '>', comp.semver, options) &&
    ((this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '>=' || comp.operator === '>'))

  return sameDirectionIncreasing || sameDirectionDecreasing ||
    (sameSemVer && differentDirectionsInclusive) ||
    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan
}

exports.Range = Range
function Range (range, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (range instanceof Range) {
    if (range.loose === !!options.loose &&
        range.includePrerelease === !!options.includePrerelease) {
      return range
    } else {
      return new Range(range.raw, options)
    }
  }

  if (range instanceof Comparator) {
    return new Range(range.value, options)
  }

  if (!(this instanceof Range)) {
    return new Range(range, options)
  }

  this.options = options
  this.loose = !!options.loose
  this.includePrerelease = !!options.includePrerelease

  // First, split based on boolean or ||
  this.raw = range
  this.set = range.split(/\s*\|\|\s*/).map(function (range) {
    return this.parseRange(range.trim())
  }, this).filter(function (c) {
    // throw out any that are not relevant for whatever reason
    return c.length
  })

  if (!this.set.length) {
    throw new TypeError('Invalid SemVer Range: ' + range)
  }

  this.format()
}

Range.prototype.format = function () {
  this.range = this.set.map(function (comps) {
    return comps.join(' ').trim()
  }).join('||').trim()
  return this.range
}

Range.prototype.toString = function () {
  return this.range
}

Range.prototype.parseRange = function (range) {
  var loose = this.options.loose
  range = range.trim()
  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
  var hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]
  range = range.replace(hr, hyphenReplace)
  debug('hyphen replace', range)
  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
  range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)
  debug('comparator trim', range, re[t.COMPARATORTRIM])

  // `~ 1.2.3` => `~1.2.3`
  range = range.replace(re[t.TILDETRIM], tildeTrimReplace)

  // `^ 1.2.3` => `^1.2.3`
  range = range.replace(re[t.CARETTRIM], caretTrimReplace)

  // normalize spaces
  range = range.split(/\s+/).join(' ')

  // At this point, the range is completely trimmed and
  // ready to be split into comparators.

  var compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
  var set = range.split(' ').map(function (comp) {
    return parseComparator(comp, this.options)
  }, this).join(' ').split(/\s+/)
  if (this.options.loose) {
    // in loose mode, throw out any that are not valid comparators
    set = set.filter(function (comp) {
      return !!comp.match(compRe)
    })
  }
  set = set.map(function (comp) {
    return new Comparator(comp, this.options)
  }, this)

  return set
}

Range.prototype.intersects = function (range, options) {
  if (!(range instanceof Range)) {
    throw new TypeError('a Range is required')
  }

  return this.set.some(function (thisComparators) {
    return (
      isSatisfiable(thisComparators, options) &&
      range.set.some(function (rangeComparators) {
        return (
          isSatisfiable(rangeComparators, options) &&
          thisComparators.every(function (thisComparator) {
            return rangeComparators.every(function (rangeComparator) {
              return thisComparator.intersects(rangeComparator, options)
            })
          })
        )
      })
    )
  })
}

// take a set of comparators and determine whether there
// exists a version which can satisfy it
function isSatisfiable (comparators, options) {
  var result = true
  var remainingComparators = comparators.slice()
  var testComparator = remainingComparators.pop()

  while (result && remainingComparators.length) {
    result = remainingComparators.every(function (otherComparator) {
      return testComparator.intersects(otherComparator, options)
    })

    testComparator = remainingComparators.pop()
  }

  return result
}

// Mostly just for testing and legacy API reasons
exports.toComparators = toComparators
function toComparators (range, options) {
  return new Range(range, options).set.map(function (comp) {
    return comp.map(function (c) {
      return c.value
    }).join(' ').trim().split(' ')
  })
}

// comprised of xranges, tildes, stars, and gtlt's at this point.
// already replaced the hyphen ranges
// turn into a set of JUST comparators.
function parseComparator (comp, options) {
  debug('comp', comp, options)
  comp = replaceCarets(comp, options)
  debug('caret', comp)
  comp = replaceTildes(comp, options)
  debug('tildes', comp)
  comp = replaceXRanges(comp, options)
  debug('xrange', comp)
  comp = replaceStars(comp, options)
  debug('stars', comp)
  return comp
}

function isX (id) {
  return !id || id.toLowerCase() === 'x' || id === '*'
}

// ~, ~> --> * (any, kinda silly)
// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
function replaceTildes (comp, options) {
  return comp.trim().split(/\s+/).map(function (comp) {
    return replaceTilde(comp, options)
  }).join(' ')
}

function replaceTilde (comp, options) {
  var r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]
  return comp.replace(r, function (_, M, m, p, pr) {
    debug('tilde', comp, _, M, m, p, pr)
    var ret

    if (isX(M)) {
      ret = ''
    } else if (isX(m)) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
    } else if (isX(p)) {
      // ~1.2 == >=1.2.0 <1.3.0
      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
    } else if (pr) {
      debug('replaceTilde pr', pr)
      ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
            ' <' + M + '.' + (+m + 1) + '.0'
    } else {
      // ~1.2.3 == >=1.2.3 <1.3.0
      ret = '>=' + M + '.' + m + '.' + p +
            ' <' + M + '.' + (+m + 1) + '.0'
    }

    debug('tilde return', ret)
    return ret
  })
}

// ^ --> * (any, kinda silly)
// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
// ^1.2.3 --> >=1.2.3 <2.0.0
// ^1.2.0 --> >=1.2.0 <2.0.0
function replaceCarets (comp, options) {
  return comp.trim().split(/\s+/).map(function (comp) {
    return replaceCaret(comp, options)
  }).join(' ')
}

function replaceCaret (comp, options) {
  debug('caret', comp, options)
  var r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]
  return comp.replace(r, function (_, M, m, p, pr) {
    debug('caret', comp, _, M, m, p, pr)
    var ret

    if (isX(M)) {
      ret = ''
    } else if (isX(m)) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
    } else if (isX(p)) {
      if (M === '0') {
        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
      } else {
        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'
      }
    } else if (pr) {
      debug('replaceCaret pr', pr)
      if (M === '0') {
        if (m === '0') {
          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
                ' <' + M + '.' + m + '.' + (+p + 1)
        } else {
          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
                ' <' + M + '.' + (+m + 1) + '.0'
        }
      } else {
        ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
              ' <' + (+M + 1) + '.0.0'
      }
    } else {
      debug('no pr')
      if (M === '0') {
        if (m === '0') {
          ret = '>=' + M + '.' + m + '.' + p +
                ' <' + M + '.' + m + '.' + (+p + 1)
        } else {
          ret = '>=' + M + '.' + m + '.' + p +
                ' <' + M + '.' + (+m + 1) + '.0'
        }
      } else {
        ret = '>=' + M + '.' + m + '.' + p +
              ' <' + (+M + 1) + '.0.0'
      }
    }

    debug('caret return', ret)
    return ret
  })
}

function replaceXRanges (comp, options) {
  debug('replaceXRanges', comp, options)
  return comp.split(/\s+/).map(function (comp) {
    return replaceXRange(comp, options)
  }).join(' ')
}

function replaceXRange (comp, options) {
  comp = comp.trim()
  var r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]
  return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
    debug('xRange', comp, ret, gtlt, M, m, p, pr)
    var xM = isX(M)
    var xm = xM || isX(m)
    var xp = xm || isX(p)
    var anyX = xp

    if (gtlt === '=' && anyX) {
      gtlt = ''
    }

    // if we're including prereleases in the match, then we need
    // to fix this to -0, the lowest possible prerelease value
    pr = options.includePrerelease ? '-0' : ''

    if (xM) {
      if (gtlt === '>' || gtlt === '<') {
        // nothing is allowed
        ret = '<0.0.0-0'
      } else {
        // nothing is forbidden
        ret = '*'
      }
    } else if (gtlt && anyX) {
      // we know patch is an x, because we have any x at all.
      // replace X with 0
      if (xm) {
        m = 0
      }
      p = 0

      if (gtlt === '>') {
        // >1 => >=2.0.0
        // >1.2 => >=1.3.0
        // >1.2.3 => >= 1.2.4
        gtlt = '>='
        if (xm) {
          M = +M + 1
          m = 0
          p = 0
        } else {
          m = +m + 1
          p = 0
        }
      } else if (gtlt === '<=') {
        // <=0.7.x is actually <0.8.0, since any 0.7.x should
        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
        gtlt = '<'
        if (xm) {
          M = +M + 1
        } else {
          m = +m + 1
        }
      }

      ret = gtlt + M + '.' + m + '.' + p + pr
    } else if (xm) {
      ret = '>=' + M + '.0.0' + pr + ' <' + (+M + 1) + '.0.0' + pr
    } else if (xp) {
      ret = '>=' + M + '.' + m + '.0' + pr +
        ' <' + M + '.' + (+m + 1) + '.0' + pr
    }

    debug('xRange return', ret)

    return ret
  })
}

// Because * is AND-ed with everything else in the comparator,
// and '' means "any version", just remove the *s entirely.
function replaceStars (comp, options) {
  debug('replaceStars', comp, options)
  // Looseness is ignored here.  star is always as loose as it gets!
  return comp.trim().replace(re[t.STAR], '')
}

// This function is passed to string.replace(re[t.HYPHENRANGE])
// M, m, patch, prerelease, build
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
// 1.2 - 3.4 => >=1.2.0 <3.5.0
function hyphenReplace ($0,
  from, fM, fm, fp, fpr, fb,
  to, tM, tm, tp, tpr, tb) {
  if (isX(fM)) {
    from = ''
  } else if (isX(fm)) {
    from = '>=' + fM + '.0.0'
  } else if (isX(fp)) {
    from = '>=' + fM + '.' + fm + '.0'
  } else {
    from = '>=' + from
  }

  if (isX(tM)) {
    to = ''
  } else if (isX(tm)) {
    to = '<' + (+tM + 1) + '.0.0'
  } else if (isX(tp)) {
    to = '<' + tM + '.' + (+tm + 1) + '.0'
  } else if (tpr) {
    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr
  } else {
    to = '<=' + to
  }

  return (from + ' ' + to).trim()
}

// if ANY of the sets match ALL of its comparators, then pass
Range.prototype.test = function (version) {
  if (!version) {
    return false
  }

  if (typeof version === 'string') {
    try {
      version = new SemVer(version, this.options)
    } catch (er) {
      return false
    }
  }

  for (var i = 0; i < this.set.length; i++) {
    if (testSet(this.set[i], version, this.options)) {
      return true
    }
  }
  return false
}

function testSet (set, version, options) {
  for (var i = 0; i < set.length; i++) {
    if (!set[i].test(version)) {
      return false
    }
  }

  if (version.prerelease.length && !options.includePrerelease) {
    // Find the set of versions that are allowed to have prereleases
    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
    // That should allow `1.2.3-pr.2` to pass.
    // However, `1.2.4-alpha.notready` should NOT be allowed,
    // even though it's within the range set by the comparators.
    for (i = 0; i < set.length; i++) {
      debug(set[i].semver)
      if (set[i].semver === ANY) {
        continue
      }

      if (set[i].semver.prerelease.length > 0) {
        var allowed = set[i].semver
        if (allowed.major === version.major &&
            allowed.minor === version.minor &&
            allowed.patch === version.patch) {
          return true
        }
      }
    }

    // Version has a -pre, but it's not one of the ones we like.
    return false
  }

  return true
}

exports.satisfies = satisfies
function satisfies (version, range, options) {
  try {
    range = new Range(range, options)
  } catch (er) {
    return false
  }
  return range.test(version)
}

exports.maxSatisfying = maxSatisfying
function maxSatisfying (versions, range, options) {
  var max = null
  var maxSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (v) {
    if (rangeObj.test(v)) {
      // satisfies(v, range, options)
      if (!max || maxSV.compare(v) === -1) {
        // compare(max, v, true)
        max = v
        maxSV = new SemVer(max, options)
      }
    }
  })
  return max
}

exports.minSatisfying = minSatisfying
function minSatisfying (versions, range, options) {
  var min = null
  var minSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (v) {
    if (rangeObj.test(v)) {
      // satisfies(v, range, options)
      if (!min || minSV.compare(v) === 1) {
        // compare(min, v, true)
        min = v
        minSV = new SemVer(min, options)
      }
    }
  })
  return min
}

exports.minVersion = minVersion
function minVersion (range, loose) {
  range = new Range(range, loose)

  var minver = new SemVer('0.0.0')
  if (range.test(minver)) {
    return minver
  }

  minver = new SemVer('0.0.0-0')
  if (range.test(minver)) {
    return minver
  }

  minver = null
  for (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    comparators.forEach(function (comparator) {
      // Clone to avoid manipulating the comparator's semver object.
      var compver = new SemVer(comparator.semver.version)
      switch (comparator.operator) {
        case '>':
          if (compver.prerelease.length === 0) {
            compver.patch++
          } else {
            compver.prerelease.push(0)
          }
          compver.raw = compver.format()
          /* fallthrough */
        case '':
        case '>=':
          if (!minver || gt(minver, compver)) {
            minver = compver
          }
          break
        case '<':
        case '<=':
          /* Ignore maximum versions */
          break
        /* istanbul ignore next */
        default:
          throw new Error('Unexpected operation: ' + comparator.operator)
      }
    })
  }

  if (minver && range.test(minver)) {
    return minver
  }

  return null
}

exports.validRange = validRange
function validRange (range, options) {
  try {
    // Return '*' instead of '' so that truthiness works.
    // This will throw if it's invalid anyway
    return new Range(range, options).range || '*'
  } catch (er) {
    return null
  }
}

// Determine if version is less than all the versions possible in the range
exports.ltr = ltr
function ltr (version, range, options) {
  return outside(version, range, '<', options)
}

// Determine if version is greater than all the versions possible in the range.
exports.gtr = gtr
function gtr (version, range, options) {
  return outside(version, range, '>', options)
}

exports.outside = outside
function outside (version, range, hilo, options) {
  version = new SemVer(version, options)
  range = new Range(range, options)

  var gtfn, ltefn, ltfn, comp, ecomp
  switch (hilo) {
    case '>':
      gtfn = gt
      ltefn = lte
      ltfn = lt
      comp = '>'
      ecomp = '>='
      break
    case '<':
      gtfn = lt
      ltefn = gte
      ltfn = gt
      comp = '<'
      ecomp = '<='
      break
    default:
      throw new TypeError('Must provide a hilo val of "<" or ">"')
  }

  // If it satisifes the range it is not outside
  if (satisfies(version, range, options)) {
    return false
  }

  // From now on, variable terms are as if we're in "gtr" mode.
  // but note that everything is flipped for the "ltr" function.

  for (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    var high = null
    var low = null

    comparators.forEach(function (comparator) {
      if (comparator.semver === ANY) {
        comparator = new Comparator('>=0.0.0')
      }
      high = high || comparator
      low = low || comparator
      if (gtfn(comparator.semver, high.semver, options)) {
        high = comparator
      } else if (ltfn(comparator.semver, low.semver, options)) {
        low = comparator
      }
    })

    // If the edge version comparator has a operator then our version
    // isn't outside it
    if (high.operator === comp || high.operator === ecomp) {
      return false
    }

    // If the lowest version comparator has an operator and our version
    // is less than it then it isn't higher than the range
    if ((!low.operator || low.operator === comp) &&
        ltefn(version, low.semver)) {
      return false
    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
      return false
    }
  }
  return true
}

exports.prerelease = prerelease
function prerelease (version, options) {
  var parsed = parse(version, options)
  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
}

exports.intersects = intersects
function intersects (r1, r2, options) {
  r1 = new Range(r1, options)
  r2 = new Range(r2, options)
  return r1.intersects(r2)
}

exports.coerce = coerce
function coerce (version, options) {
  if (version instanceof SemVer) {
    return version
  }

  if (typeof version === 'number') {
    version = String(version)
  }

  if (typeof version !== 'string') {
    return null
  }

  options = options || {}

  var match = null
  if (!options.rtl) {
    match = version.match(re[t.COERCE])
  } else {
    // Find the right-most coercible string that does not share
    // a terminus with a more left-ward coercible string.
    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
    //
    // Walk through the string checking with a /g regexp
    // Manually set the index so as to pick up overlapping matches.
    // Stop when we get a match that ends at the string end, since no
    // coercible string can be more right-ward without the same terminus.
    var next
    while ((next = re[t.COERCERTL].exec(version)) &&
      (!match || match.index + match[0].length !== version.length)
    ) {
      if (!match ||
          next.index + next[0].length !== match.index + match[0].length) {
        match = next
      }
      re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length
    }
    // leave it in a clean state
    re[t.COERCERTL].lastIndex = -1
  }

  if (match === null) {
    return null
  }

  return parse(match[2] +
    '.' + (match[3] || '0') +
    '.' + (match[4] || '0'), options)
}
#!/usr/bin/env node
// Standalone semver comparison program.
// Exits successfully and prints matching version(s) if
// any supplied version is valid and passes all tests.

var argv = process.argv.slice(2)

var versions = []

var range = []

var inc = null

var version = require('../package.json').version

var loose = false

var includePrerelease = false

var coerce = false

var rtl = false

var identifier

var semver = require('../semver')

var reverse = false

var options = {}

main()

function main () {
  if (!argv.length) return help()
  while (argv.length) {
    var a = argv.shift()
    var indexOfEqualSign = a.indexOf('=')
    if (indexOfEqualSign !== -1) {
      a = a.slice(0, indexOfEqualSign)
      argv.unshift(a.slice(indexOfEqualSign + 1))
    }
    switch (a) {
      case '-rv': case '-rev': case '--rev': case '--reverse':
        reverse = true
        break
      case '-l': case '--loose':
        loose = true
        break
      case '-p': case '--include-prerelease':
        includePrerelease = true
        break
      case '-v': case '--version':
        versions.push(argv.shift())
        break
      case '-i': case '--inc': case '--increment':
        switch (argv[0]) {
          case 'major': case 'minor': case 'patch': case 'prerelease':
          case 'premajor': case 'preminor': case 'prepatch':
            inc = argv.shift()
            break
          default:
            inc = 'patch'
            break
        }
        break
      case '--preid':
        identifier = argv.shift()
        break
      case '-r': case '--range':
        range.push(argv.shift())
        break
      case '-c': case '--coerce':
        coerce = true
        break
      case '--rtl':
        rtl = true
        break
      case '--ltr':
        rtl = false
        break
      case '-h': case '--help': case '-?':
        return help()
      default:
        versions.push(a)
        break
    }
  }

  var options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }

  versions = versions.map(function (v) {
    return coerce ? (semver.coerce(v, options) || { version: v }).version : v
  }).filter(function (v) {
    return semver.valid(v)
  })
  if (!versions.length) return fail()
  if (inc && (versions.length !== 1 || range.length)) { return failInc() }

  for (var i = 0, l = range.length; i < l; i++) {
    versions = versions.filter(function (v) {
      return semver.satisfies(v, range[i], options)
    })
    if (!versions.length) return fail()
  }
  return success(versions)
}

function failInc () {
  console.error('--inc can only be used on a single version with no range')
  fail()
}

function fail () { process.exit(1) }

function success () {
  var compare = reverse ? 'rcompare' : 'compare'
  versions.sort(function (a, b) {
    return semver[compare](a, b, options)
  }).map(function (v) {
    return semver.clean(v, options)
  }).map(function (v) {
    return inc ? semver.inc(v, inc, options, identifier) : v
  }).forEach(function (v, i, _) { console.log(v) })
}

function help () {
  console.log(['SemVer ' + version,
    '',
    'A JavaScript implementation of the https://semver.org/ specification',
    'Copyright Isaac Z. Schlueter',
    '',
    'Usage: semver [options] <version> [<version> [...]]',
    'Prints valid versions sorted by SemVer precedence',
    '',
    'Options:',
    '-r --range <range>',
    '        Print versions that match the specified range.',
    '',
    '-i --increment [<level>]',
    '        Increment a version by the specified level.  Level can',
    '        be one of: major, minor, patch, premajor, preminor,',
    "        prepatch, or prerelease.  Default level is 'patch'.",
    '        Only one version may be specified.',
    '',
    '--preid <identifier>',
    '        Identifier to be used to prefix premajor, preminor,',
    '        prepatch or prerelease version increments.',
    '',
    '-l --loose',
    '        Interpret versions and ranges loosely',
    '',
    '-p --include-prerelease',
    '        Always include prerelease versions in range matching',
    '',
    '-c --coerce',
    '        Coerce a string into SemVer if possible',
    '        (does not imply --loose)',
    '',
    '--rtl',
    '        Coerce version strings right to left',
    '',
    '--ltr',
    '        Coerce version strings left to right (default)',
    '',
    'Program exits successfully if any valid version satisfies',
    'all supplied ranges, and prints all satisfying versions.',
    '',
    'If no satisfying versions are found, then exits failure.',
    '',
    'Versions are printed in ascending order, so supplying',
    'multiple versions to the utility will just sort them.'
  ].join('\n'))
}
(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the 'Software'), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial 
portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

{
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "browser": "./src/browser.js",
  "dependencies": {
    "ms": "2.1.2"
  },
  "deprecated": false,
  "description": "small debugging utility",
  "devDependencies": {
    "brfs": "^2.0.1",
    "browserify": "^16.2.3",
    "coveralls": "^3.0.2",
    "istanbul": "^0.4.5",
    "karma": "^3.1.4",
    "karma-browserify": "^6.0.0",
    "karma-chrome-launcher": "^2.2.0",
    "karma-mocha": "^1.3.0",
    "mocha": "^5.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6.0"
  },
  "files": [
    "src",
    "LICENSE",
    "README.md"
  ],
  "homepage": "https://github.com/visionmedia/debug#readme",
  "license": "MIT",
  "main": "./src/index.js",
  "name": "debug",
  "peerDependenciesMeta": {
    "supports-color": {
      "optional": true
    }
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "version": "4.2.0"
}/* eslint-env browser */

/**
 * This is the web browser implementation of `debug()`.
 */

exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = localstorage();

/**
 * Colors.
 */

exports.colors = [
	'#0000CC',
	'#0000FF',
	'#0033CC',
	'#0033FF',
	'#0066CC',
	'#0066FF',
	'#0099CC',
	'#0099FF',
	'#00CC00',
	'#00CC33',
	'#00CC66',
	'#00CC99',
	'#00CCCC',
	'#00CCFF',
	'#3300CC',
	'#3300FF',
	'#3333CC',
	'#3333FF',
	'#3366CC',
	'#3366FF',
	'#3399CC',
	'#3399FF',
	'#33CC00',
	'#33CC33',
	'#33CC66',
	'#33CC99',
	'#33CCCC',
	'#33CCFF',
	'#6600CC',
	'#6600FF',
	'#6633CC',
	'#6633FF',
	'#66CC00',
	'#66CC33',
	'#9900CC',
	'#9900FF',
	'#9933CC',
	'#9933FF',
	'#99CC00',
	'#99CC33',
	'#CC0000',
	'#CC0033',
	'#CC0066',
	'#CC0099',
	'#CC00CC',
	'#CC00FF',
	'#CC3300',
	'#CC3333',
	'#CC3366',
	'#CC3399',
	'#CC33CC',
	'#CC33FF',
	'#CC6600',
	'#CC6633',
	'#CC9900',
	'#CC9933',
	'#CCCC00',
	'#CCCC33',
	'#FF0000',
	'#FF0033',
	'#FF0066',
	'#FF0099',
	'#FF00CC',
	'#FF00FF',
	'#FF3300',
	'#FF3333',
	'#FF3366',
	'#FF3399',
	'#FF33CC',
	'#FF33FF',
	'#FF6600',
	'#FF6633',
	'#FF9900',
	'#FF9933',
	'#FFCC00',
	'#FFCC33'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

// eslint-disable-next-line complexity
function useColors() {
	// NB: In an Electron preload script, document will be defined but not fully
	// initialized. Since we know we're in Chrome, we'll just detect this case
	// explicitly
	if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
		return true;
	}

	// Internet Explorer and Edge do not support colors.
	if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
		return false;
	}

	// Is webkit? http://stackoverflow.com/a/16459606/376773
	// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
	return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
		// Is firebug? http://stackoverflow.com/a/398120/376773
		(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
		// Is firefox >= v31?
		// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
		// Double check webkit in userAgent just in case we are in a worker
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	args[0] = (this.useColors ? '%c' : '') +
		this.namespace +
		(this.useColors ? ' %c' : ' ') +
		args[0] +
		(this.useColors ? '%c ' : ' ') +
		'+' + module.exports.humanize(this.diff);

	if (!this.useColors) {
		return;
	}

	const c = 'color: ' + this.color;
	args.splice(1, 0, c, 'color: inherit');

	// The final "%c" is somewhat tricky, because there could be other
	// arguments passed either before or after the %c, so we need to
	// figure out the correct index to insert the CSS into
	let index = 0;
	let lastC = 0;
	args[0].replace(/%[a-zA-Z%]/g, match => {
		if (match === '%%') {
			return;
		}
		index++;
		if (match === '%c') {
			// We only are interested in the *last* %c
			// (the user may have provided their own)
			lastC = index;
		}
	});

	args.splice(lastC, 0, c);
}

/**
 * Invokes `console.debug()` when available.
 * No-op when `console.debug` is not a "function".
 * If `console.debug` is not available, falls back
 * to `console.log`.
 *
 * @api public
 */
exports.log = console.debug || console.log || (() => {});

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	try {
		if (namespaces) {
			exports.storage.setItem('debug', namespaces);
		} else {
			exports.storage.removeItem('debug');
		}
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */
function load() {
	let r;
	try {
		r = exports.storage.getItem('debug');
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}

	// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
	if (!r && typeof process !== 'undefined' && 'env' in process) {
		r = process.env.DEBUG;
	}

	return r;
}

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
	try {
		// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
		// The Browser also has localStorage in the global context.
		return localStorage;
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

formatters.j = function (v) {
	try {
		return JSON.stringify(v);
	} catch (error) {
		return '[UnexpectedJSONParseError]: ' + error.message;
	}
};

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 */

function setup(env) {
	createDebug.debug = createDebug;
	createDebug.default = createDebug;
	createDebug.coerce = coerce;
	createDebug.disable = disable;
	createDebug.enable = enable;
	createDebug.enabled = enabled;
	createDebug.humanize = require('ms');

	Object.keys(env).forEach(key => {
		createDebug[key] = env[key];
	});

	/**
	* Active `debug` instances.
	*/
	createDebug.instances = [];

	/**
	* The currently active debug mode names, and names to skip.
	*/

	createDebug.names = [];
	createDebug.skips = [];

	/**
	* Map of special "%n" handling functions, for the debug "format" argument.
	*
	* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
	*/
	createDebug.formatters = {};

	/**
	* Selects a color for a debug namespace
	* @param {String} namespace The namespace string for the for the debug instance to be colored
	* @return {Number|String} An ANSI color code for the given namespace
	* @api private
	*/
	function selectColor(namespace) {
		let hash = 0;

		for (let i = 0; i < namespace.length; i++) {
			hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
			hash |= 0; // Convert to 32bit integer
		}

		return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
	}
	createDebug.selectColor = selectColor;

	/**
	* Create a debugger with the given `namespace`.
	*
	* @param {String} namespace
	* @return {Function}
	* @api public
	*/
	function createDebug(namespace) {
		let prevTime;

		function debug(...args) {
			// Disabled?
			if (!debug.enabled) {
				return;
			}

			const self = debug;

			// Set `diff` timestamp
			const curr = Number(new Date());
			const ms = curr - (prevTime || curr);
			self.diff = ms;
			self.prev = prevTime;
			self.curr = curr;
			prevTime = curr;

			args[0] = createDebug.coerce(args[0]);

			if (typeof args[0] !== 'string') {
				// Anything else let's inspect with %O
				args.unshift('%O');
			}

			// Apply any `formatters` transformations
			let index = 0;
			args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
				// If we encounter an escaped % then don't increase the array index
				if (match === '%%') {
					return match;
				}
				index++;
				const formatter = createDebug.formatters[format];
				if (typeof formatter === 'function') {
					const val = args[index];
					match = formatter.call(self, val);

					// Now we need to remove `args[index]` since it's inlined in the `format`
					args.splice(index, 1);
					index--;
				}
				return match;
			});

			// Apply env-specific formatting (colors, etc.)
			createDebug.formatArgs.call(self, args);

			const logFn = self.log || createDebug.log;
			logFn.apply(self, args);
		}

		debug.namespace = namespace;
		debug.enabled = createDebug.enabled(namespace);
		debug.useColors = createDebug.useColors();
		debug.color = createDebug.selectColor(namespace);
		debug.destroy = destroy;
		debug.extend = extend;

		// Env-specific initialization logic for debug instances
		if (typeof createDebug.init === 'function') {
			createDebug.init(debug);
		}

		createDebug.instances.push(debug);

		return debug;
	}

	function destroy() {
		const index = createDebug.instances.indexOf(this);
		if (index !== -1) {
			createDebug.instances.splice(index, 1);
			return true;
		}
		return false;
	}

	function extend(namespace, delimiter) {
		const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
		newDebug.log = this.log;
		return newDebug;
	}

	/**
	* Enables a debug mode by namespaces. This can include modes
	* separated by a colon and wildcards.
	*
	* @param {String} namespaces
	* @api public
	*/
	function enable(namespaces) {
		createDebug.save(namespaces);

		createDebug.names = [];
		createDebug.skips = [];

		let i;
		const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
		const len = split.length;

		for (i = 0; i < len; i++) {
			if (!split[i]) {
				// ignore empty strings
				continue;
			}

			namespaces = split[i].replace(/\*/g, '.*?');

			if (namespaces[0] === '-') {
				createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
			} else {
				createDebug.names.push(new RegExp('^' + namespaces + '$'));
			}
		}

		for (i = 0; i < createDebug.instances.length; i++) {
			const instance = createDebug.instances[i];
			instance.enabled = createDebug.enabled(instance.namespace);
		}
	}

	/**
	* Disable debug output.
	*
	* @return {String} namespaces
	* @api public
	*/
	function disable() {
		const namespaces = [
			...createDebug.names.map(toNamespace),
			...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
		].join(',');
		createDebug.enable('');
		return namespaces;
	}

	/**
	* Returns true if the given mode name is enabled, false otherwise.
	*
	* @param {String} name
	* @return {Boolean}
	* @api public
	*/
	function enabled(name) {
		if (name[name.length - 1] === '*') {
			return true;
		}

		let i;
		let len;

		for (i = 0, len = createDebug.skips.length; i < len; i++) {
			if (createDebug.skips[i].test(name)) {
				return false;
			}
		}

		for (i = 0, len = createDebug.names.length; i < len; i++) {
			if (createDebug.names[i].test(name)) {
				return true;
			}
		}

		return false;
	}

	/**
	* Convert regexp to namespace
	*
	* @param {RegExp} regxep
	* @return {String} namespace
	* @api private
	*/
	function toNamespace(regexp) {
		return regexp.toString()
			.substring(2, regexp.toString().length - 2)
			.replace(/\.\*\?$/, '*');
	}

	/**
	* Coerce `val`.
	*
	* @param {Mixed} val
	* @return {Mixed}
	* @api private
	*/
	function coerce(val) {
		if (val instanceof Error) {
			return val.stack || val.message;
		}
		return val;
	}

	createDebug.enable(createDebug.load());

	return createDebug;
}

module.exports = setup;
/**
 * Detect Electron renderer / nwjs process, which is node, but we should
 * treat as a browser.
 */

if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
	module.exports = require('./browser.js');
} else {
	module.exports = require('./node.js');
}
/**
 * Module dependencies.
 */

const tty = require('tty');
const util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 */

exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

try {
	// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
	// eslint-disable-next-line import/no-extraneous-dependencies
	const supportsColor = require('supports-color');

	if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
		exports.colors = [
			20,
			21,
			26,
			27,
			32,
			33,
			38,
			39,
			40,
			41,
			42,
			43,
			44,
			45,
			56,
			57,
			62,
			63,
			68,
			69,
			74,
			75,
			76,
			77,
			78,
			79,
			80,
			81,
			92,
			93,
			98,
			99,
			112,
			113,
			128,
			129,
			134,
			135,
			148,
			149,
			160,
			161,
			162,
			163,
			164,
			165,
			166,
			167,
			168,
			169,
			170,
			171,
			172,
			173,
			178,
			179,
			184,
			185,
			196,
			197,
			198,
			199,
			200,
			201,
			202,
			203,
			204,
			205,
			206,
			207,
			208,
			209,
			214,
			215,
			220,
			221
		];
	}
} catch (error) {
	// Swallow - we only care if `supports-color` is available; it doesn't have to be.
}

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(key => {
	return /^debug_/i.test(key);
}).reduce((obj, key) => {
	// Camel-case
	const prop = key
		.substring(6)
		.toLowerCase()
		.replace(/_([a-z])/g, (_, k) => {
			return k.toUpperCase();
		});

	// Coerce string value into JS value
	let val = process.env[key];
	if (/^(yes|on|true|enabled)$/i.test(val)) {
		val = true;
	} else if (/^(no|off|false|disabled)$/i.test(val)) {
		val = false;
	} else if (val === 'null') {
		val = null;
	} else {
		val = Number(val);
	}

	obj[prop] = val;
	return obj;
}, {});

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
	return 'colors' in exports.inspectOpts ?
		Boolean(exports.inspectOpts.colors) :
		tty.isatty(process.stderr.fd);
}

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	const {namespace: name, useColors} = this;

	if (useColors) {
		const c = this.color;
		const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
		const prefix = `  ${colorCode};1m${name} \u001B[0m`;

		args[0] = prefix + args[0].split('\n').join('\n' + prefix);
		args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
	} else {
		args[0] = getDate() + name + ' ' + args[0];
	}
}

function getDate() {
	if (exports.inspectOpts.hideDate) {
		return '';
	}
	return new Date().toISOString() + ' ';
}

/**
 * Invokes `util.format()` with the specified arguments and writes to stderr.
 */

function log(...args) {
	return process.stderr.write(util.format(...args) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	if (namespaces) {
		process.env.DEBUG = namespaces;
	} else {
		// If you set a process.env field to null or undefined, it gets cast to the
		// string 'null' or 'undefined'. Just delete instead.
		delete process.env.DEBUG;
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
	return process.env.DEBUG;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init(debug) {
	debug.inspectOpts = {};

	const keys = Object.keys(exports.inspectOpts);
	for (let i = 0; i < keys.length; i++) {
		debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

formatters.o = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts)
		.replace(/\s*\n\s*/g, ' ');
};

/**
 * Map %O to `util.inspect()`, allowing multiple lines if needed.
 */

formatters.O = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts);
};
(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the 'Software'), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial 
portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

{
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "browser": "./src/browser.js",
  "dependencies": {
    "ms": "2.1.2"
  },
  "deprecated": false,
  "description": "small debugging utility",
  "devDependencies": {
    "brfs": "^2.0.1",
    "browserify": "^16.2.3",
    "coveralls": "^3.0.2",
    "istanbul": "^0.4.5",
    "karma": "^3.1.4",
    "karma-browserify": "^6.0.0",
    "karma-chrome-launcher": "^2.2.0",
    "karma-mocha": "^1.3.0",
    "mocha": "^5.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6.0"
  },
  "files": [
    "src",
    "LICENSE",
    "README.md"
  ],
  "homepage": "https://github.com/visionmedia/debug#readme",
  "license": "MIT",
  "main": "./src/index.js",
  "name": "debug",
  "peerDependenciesMeta": {
    "supports-color": {
      "optional": true
    }
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "version": "4.2.0"
}/* eslint-env browser */

/**
 * This is the web browser implementation of `debug()`.
 */

exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = localstorage();

/**
 * Colors.
 */

exports.colors = [
	'#0000CC',
	'#0000FF',
	'#0033CC',
	'#0033FF',
	'#0066CC',
	'#0066FF',
	'#0099CC',
	'#0099FF',
	'#00CC00',
	'#00CC33',
	'#00CC66',
	'#00CC99',
	'#00CCCC',
	'#00CCFF',
	'#3300CC',
	'#3300FF',
	'#3333CC',
	'#3333FF',
	'#3366CC',
	'#3366FF',
	'#3399CC',
	'#3399FF',
	'#33CC00',
	'#33CC33',
	'#33CC66',
	'#33CC99',
	'#33CCCC',
	'#33CCFF',
	'#6600CC',
	'#6600FF',
	'#6633CC',
	'#6633FF',
	'#66CC00',
	'#66CC33',
	'#9900CC',
	'#9900FF',
	'#9933CC',
	'#9933FF',
	'#99CC00',
	'#99CC33',
	'#CC0000',
	'#CC0033',
	'#CC0066',
	'#CC0099',
	'#CC00CC',
	'#CC00FF',
	'#CC3300',
	'#CC3333',
	'#CC3366',
	'#CC3399',
	'#CC33CC',
	'#CC33FF',
	'#CC6600',
	'#CC6633',
	'#CC9900',
	'#CC9933',
	'#CCCC00',
	'#CCCC33',
	'#FF0000',
	'#FF0033',
	'#FF0066',
	'#FF0099',
	'#FF00CC',
	'#FF00FF',
	'#FF3300',
	'#FF3333',
	'#FF3366',
	'#FF3399',
	'#FF33CC',
	'#FF33FF',
	'#FF6600',
	'#FF6633',
	'#FF9900',
	'#FF9933',
	'#FFCC00',
	'#FFCC33'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

// eslint-disable-next-line complexity
function useColors() {
	// NB: In an Electron preload script, document will be defined but not fully
	// initialized. Since we know we're in Chrome, we'll just detect this case
	// explicitly
	if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
		return true;
	}

	// Internet Explorer and Edge do not support colors.
	if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
		return false;
	}

	// Is webkit? http://stackoverflow.com/a/16459606/376773
	// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
	return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
		// Is firebug? http://stackoverflow.com/a/398120/376773
		(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
		// Is firefox >= v31?
		// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
		// Double check webkit in userAgent just in case we are in a worker
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	args[0] = (this.useColors ? '%c' : '') +
		this.namespace +
		(this.useColors ? ' %c' : ' ') +
		args[0] +
		(this.useColors ? '%c ' : ' ') +
		'+' + module.exports.humanize(this.diff);

	if (!this.useColors) {
		return;
	}

	const c = 'color: ' + this.color;
	args.splice(1, 0, c, 'color: inherit');

	// The final "%c" is somewhat tricky, because there could be other
	// arguments passed either before or after the %c, so we need to
	// figure out the correct index to insert the CSS into
	let index = 0;
	let lastC = 0;
	args[0].replace(/%[a-zA-Z%]/g, match => {
		if (match === '%%') {
			return;
		}
		index++;
		if (match === '%c') {
			// We only are interested in the *last* %c
			// (the user may have provided their own)
			lastC = index;
		}
	});

	args.splice(lastC, 0, c);
}

/**
 * Invokes `console.debug()` when available.
 * No-op when `console.debug` is not a "function".
 * If `console.debug` is not available, falls back
 * to `console.log`.
 *
 * @api public
 */
exports.log = console.debug || console.log || (() => {});

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	try {
		if (namespaces) {
			exports.storage.setItem('debug', namespaces);
		} else {
			exports.storage.removeItem('debug');
		}
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */
function load() {
	let r;
	try {
		r = exports.storage.getItem('debug');
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}

	// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
	if (!r && typeof process !== 'undefined' && 'env' in process) {
		r = process.env.DEBUG;
	}

	return r;
}

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
	try {
		// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
		// The Browser also has localStorage in the global context.
		return localStorage;
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

formatters.j = function (v) {
	try {
		return JSON.stringify(v);
	} catch (error) {
		return '[UnexpectedJSONParseError]: ' + error.message;
	}
};

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 */

function setup(env) {
	createDebug.debug = createDebug;
	createDebug.default = createDebug;
	createDebug.coerce = coerce;
	createDebug.disable = disable;
	createDebug.enable = enable;
	createDebug.enabled = enabled;
	createDebug.humanize = require('ms');

	Object.keys(env).forEach(key => {
		createDebug[key] = env[key];
	});

	/**
	* Active `debug` instances.
	*/
	createDebug.instances = [];

	/**
	* The currently active debug mode names, and names to skip.
	*/

	createDebug.names = [];
	createDebug.skips = [];

	/**
	* Map of special "%n" handling functions, for the debug "format" argument.
	*
	* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
	*/
	createDebug.formatters = {};

	/**
	* Selects a color for a debug namespace
	* @param {String} namespace The namespace string for the for the debug instance to be colored
	* @return {Number|String} An ANSI color code for the given namespace
	* @api private
	*/
	function selectColor(namespace) {
		let hash = 0;

		for (let i = 0; i < namespace.length; i++) {
			hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
			hash |= 0; // Convert to 32bit integer
		}

		return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
	}
	createDebug.selectColor = selectColor;

	/**
	* Create a debugger with the given `namespace`.
	*
	* @param {String} namespace
	* @return {Function}
	* @api public
	*/
	function createDebug(namespace) {
		let prevTime;

		function debug(...args) {
			// Disabled?
			if (!debug.enabled) {
				return;
			}

			const self = debug;

			// Set `diff` timestamp
			const curr = Number(new Date());
			const ms = curr - (prevTime || curr);
			self.diff = ms;
			self.prev = prevTime;
			self.curr = curr;
			prevTime = curr;

			args[0] = createDebug.coerce(args[0]);

			if (typeof args[0] !== 'string') {
				// Anything else let's inspect with %O
				args.unshift('%O');
			}

			// Apply any `formatters` transformations
			let index = 0;
			args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
				// If we encounter an escaped % then don't increase the array index
				if (match === '%%') {
					return match;
				}
				index++;
				const formatter = createDebug.formatters[format];
				if (typeof formatter === 'function') {
					const val = args[index];
					match = formatter.call(self, val);

					// Now we need to remove `args[index]` since it's inlined in the `format`
					args.splice(index, 1);
					index--;
				}
				return match;
			});

			// Apply env-specific formatting (colors, etc.)
			createDebug.formatArgs.call(self, args);

			const logFn = self.log || createDebug.log;
			logFn.apply(self, args);
		}

		debug.namespace = namespace;
		debug.enabled = createDebug.enabled(namespace);
		debug.useColors = createDebug.useColors();
		debug.color = createDebug.selectColor(namespace);
		debug.destroy = destroy;
		debug.extend = extend;

		// Env-specific initialization logic for debug instances
		if (typeof createDebug.init === 'function') {
			createDebug.init(debug);
		}

		createDebug.instances.push(debug);

		return debug;
	}

	function destroy() {
		const index = createDebug.instances.indexOf(this);
		if (index !== -1) {
			createDebug.instances.splice(index, 1);
			return true;
		}
		return false;
	}

	function extend(namespace, delimiter) {
		const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
		newDebug.log = this.log;
		return newDebug;
	}

	/**
	* Enables a debug mode by namespaces. This can include modes
	* separated by a colon and wildcards.
	*
	* @param {String} namespaces
	* @api public
	*/
	function enable(namespaces) {
		createDebug.save(namespaces);

		createDebug.names = [];
		createDebug.skips = [];

		let i;
		const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
		const len = split.length;

		for (i = 0; i < len; i++) {
			if (!split[i]) {
				// ignore empty strings
				continue;
			}

			namespaces = split[i].replace(/\*/g, '.*?');

			if (namespaces[0] === '-') {
				createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
			} else {
				createDebug.names.push(new RegExp('^' + namespaces + '$'));
			}
		}

		for (i = 0; i < createDebug.instances.length; i++) {
			const instance = createDebug.instances[i];
			instance.enabled = createDebug.enabled(instance.namespace);
		}
	}

	/**
	* Disable debug output.
	*
	* @return {String} namespaces
	* @api public
	*/
	function disable() {
		const namespaces = [
			...createDebug.names.map(toNamespace),
			...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
		].join(',');
		createDebug.enable('');
		return namespaces;
	}

	/**
	* Returns true if the given mode name is enabled, false otherwise.
	*
	* @param {String} name
	* @return {Boolean}
	* @api public
	*/
	function enabled(name) {
		if (name[name.length - 1] === '*') {
			return true;
		}

		let i;
		let len;

		for (i = 0, len = createDebug.skips.length; i < len; i++) {
			if (createDebug.skips[i].test(name)) {
				return false;
			}
		}

		for (i = 0, len = createDebug.names.length; i < len; i++) {
			if (createDebug.names[i].test(name)) {
				return true;
			}
		}

		return false;
	}

	/**
	* Convert regexp to namespace
	*
	* @param {RegExp} regxep
	* @return {String} namespace
	* @api private
	*/
	function toNamespace(regexp) {
		return regexp.toString()
			.substring(2, regexp.toString().length - 2)
			.replace(/\.\*\?$/, '*');
	}

	/**
	* Coerce `val`.
	*
	* @param {Mixed} val
	* @return {Mixed}
	* @api private
	*/
	function coerce(val) {
		if (val instanceof Error) {
			return val.stack || val.message;
		}
		return val;
	}

	createDebug.enable(createDebug.load());

	return createDebug;
}

module.exports = setup;
/**
 * Detect Electron renderer / nwjs process, which is node, but we should
 * treat as a browser.
 */

if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
	module.exports = require('./browser.js');
} else {
	module.exports = require('./node.js');
}
/**
 * Module dependencies.
 */

const tty = require('tty');
const util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 */

exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

try {
	// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
	// eslint-disable-next-line import/no-extraneous-dependencies
	const supportsColor = require('supports-color');

	if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
		exports.colors = [
			20,
			21,
			26,
			27,
			32,
			33,
			38,
			39,
			40,
			41,
			42,
			43,
			44,
			45,
			56,
			57,
			62,
			63,
			68,
			69,
			74,
			75,
			76,
			77,
			78,
			79,
			80,
			81,
			92,
			93,
			98,
			99,
			112,
			113,
			128,
			129,
			134,
			135,
			148,
			149,
			160,
			161,
			162,
			163,
			164,
			165,
			166,
			167,
			168,
			169,
			170,
			171,
			172,
			173,
			178,
			179,
			184,
			185,
			196,
			197,
			198,
			199,
			200,
			201,
			202,
			203,
			204,
			205,
			206,
			207,
			208,
			209,
			214,
			215,
			220,
			221
		];
	}
} catch (error) {
	// Swallow - we only care if `supports-color` is available; it doesn't have to be.
}

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(key => {
	return /^debug_/i.test(key);
}).reduce((obj, key) => {
	// Camel-case
	const prop = key
		.substring(6)
		.toLowerCase()
		.replace(/_([a-z])/g, (_, k) => {
			return k.toUpperCase();
		});

	// Coerce string value into JS value
	let val = process.env[key];
	if (/^(yes|on|true|enabled)$/i.test(val)) {
		val = true;
	} else if (/^(no|off|false|disabled)$/i.test(val)) {
		val = false;
	} else if (val === 'null') {
		val = null;
	} else {
		val = Number(val);
	}

	obj[prop] = val;
	return obj;
}, {});

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
	return 'colors' in exports.inspectOpts ?
		Boolean(exports.inspectOpts.colors) :
		tty.isatty(process.stderr.fd);
}

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	const {namespace: name, useColors} = this;

	if (useColors) {
		const c = this.color;
		const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
		const prefix = `  ${colorCode};1m${name} \u001B[0m`;

		args[0] = prefix + args[0].split('\n').join('\n' + prefix);
		args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
	} else {
		args[0] = getDate() + name + ' ' + args[0];
	}
}

function getDate() {
	if (exports.inspectOpts.hideDate) {
		return '';
	}
	return new Date().toISOString() + ' ';
}

/**
 * Invokes `util.format()` with the specified arguments and writes to stderr.
 */

function log(...args) {
	return process.stderr.write(util.format(...args) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	if (namespaces) {
		process.env.DEBUG = namespaces;
	} else {
		// If you set a process.env field to null or undefined, it gets cast to the
		// string 'null' or 'undefined'. Just delete instead.
		delete process.env.DEBUG;
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
	return process.env.DEBUG;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init(debug) {
	debug.inspectOpts = {};

	const keys = Object.keys(exports.inspectOpts);
	for (let i = 0; i < keys.length; i++) {
		debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

formatters.o = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts)
		.replace(/\s*\n\s*/g, ' ');
};

/**
 * Map %O to `util.inspect()`, allowing multiple lines if needed.
 */

formatters.O = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts);
};
The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

====

`String.fromCodePoint` by Mathias Bynens used according to terms of MIT
License, as follows:

    Copyright Mathias Bynens <https://mathiasbynens.be/>

    Permission is hereby granted, free of charge, to any person obtaining
    a copy of this software and associated documentation files (the
    "Software"), to deal in the Software without restriction, including
    without limitation the rights to use, copy, modify, merge, publish,
    distribute, sublicense, and/or sell copies of the Software, and to
    permit persons to whom the Software is furnished to do so, subject to
    the following conditions:

    The above copyright notice and this permission notice shall be
    included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "deprecated": false,
  "description": "An evented streaming XML parser in JavaScript",
  "devDependencies": {
    "standard": "^8.6.0",
    "tap": "^10.5.1"
  },
  "files": [
    "lib/sax.js",
    "LICENSE",
    "README.md"
  ],
  "homepage": "https://github.com/isaacs/sax-js#readme",
  "license": "ISC",
  "main": "lib/sax.js",
  "name": "sax",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/sax-js.git"
  },
  "version": "1.2.4"
};(function (sax) { // wrapper for non-node envs
  sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
  sax.SAXParser = SAXParser
  sax.SAXStream = SAXStream
  sax.createStream = createStream

  // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
  // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
  // since that's the earliest that a buffer overrun could occur.  This way, checks are
  // as rare as required, but as often as necessary to ensure never crossing this bound.
  // Furthermore, buffers are only tested at most once per write(), so passing a very
  // large string into write() might have undesirable effects, but this is manageable by
  // the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme
  // edge case, result in creating at most one complete copy of the string passed in.
  // Set to Infinity to have unlimited buffers.
  sax.MAX_BUFFER_LENGTH = 64 * 1024

  var buffers = [
    'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',
    'procInstName', 'procInstBody', 'entity', 'attribName',
    'attribValue', 'cdata', 'script'
  ]

  sax.EVENTS = [
    'text',
    'processinginstruction',
    'sgmldeclaration',
    'doctype',
    'comment',
    'opentagstart',
    'attribute',
    'opentag',
    'closetag',
    'opencdata',
    'cdata',
    'closecdata',
    'error',
    'end',
    'ready',
    'script',
    'opennamespace',
    'closenamespace'
  ]

  function SAXParser (strict, opt) {
    if (!(this instanceof SAXParser)) {
      return new SAXParser(strict, opt)
    }

    var parser = this
    clearBuffers(parser)
    parser.q = parser.c = ''
    parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
    parser.opt = opt || {}
    parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
    parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'
    parser.tags = []
    parser.closed = parser.closedRoot = parser.sawRoot = false
    parser.tag = parser.error = null
    parser.strict = !!strict
    parser.noscript = !!(strict || parser.opt.noscript)
    parser.state = S.BEGIN
    parser.strictEntities = parser.opt.strictEntities
    parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)
    parser.attribList = []

    // namespaces form a prototype chain.
    // it always points at the current tag,
    // which protos to its parent tag.
    if (parser.opt.xmlns) {
      parser.ns = Object.create(rootNS)
    }

    // mostly just for error reporting
    parser.trackPosition = parser.opt.position !== false
    if (parser.trackPosition) {
      parser.position = parser.line = parser.column = 0
    }
    emit(parser, 'onready')
  }

  if (!Object.create) {
    Object.create = function (o) {
      function F () {}
      F.prototype = o
      var newf = new F()
      return newf
    }
  }

  if (!Object.keys) {
    Object.keys = function (o) {
      var a = []
      for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
      return a
    }
  }

  function checkBufferLength (parser) {
    var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
    var maxActual = 0
    for (var i = 0, l = buffers.length; i < l; i++) {
      var len = parser[buffers[i]].length
      if (len > maxAllowed) {
        // Text/cdata nodes can get big, and since they're buffered,
        // we can get here under normal conditions.
        // Avoid issues by emitting the text node now,
        // so at least it won't get any bigger.
        switch (buffers[i]) {
          case 'textNode':
            closeText(parser)
            break

          case 'cdata':
            emitNode(parser, 'oncdata', parser.cdata)
            parser.cdata = ''
            break

          case 'script':
            emitNode(parser, 'onscript', parser.script)
            parser.script = ''
            break

          default:
            error(parser, 'Max buffer length exceeded: ' + buffers[i])
        }
      }
      maxActual = Math.max(maxActual, len)
    }
    // schedule the next check for the earliest possible buffer overrun.
    var m = sax.MAX_BUFFER_LENGTH - maxActual
    parser.bufferCheckPosition = m + parser.position
  }

  function clearBuffers (parser) {
    for (var i = 0, l = buffers.length; i < l; i++) {
      parser[buffers[i]] = ''
    }
  }

  function flushBuffers (parser) {
    closeText(parser)
    if (parser.cdata !== '') {
      emitNode(parser, 'oncdata', parser.cdata)
      parser.cdata = ''
    }
    if (parser.script !== '') {
      emitNode(parser, 'onscript', parser.script)
      parser.script = ''
    }
  }

  SAXParser.prototype = {
    end: function () { end(this) },
    write: write,
    resume: function () { this.error = null; return this },
    close: function () { return this.write(null) },
    flush: function () { flushBuffers(this) }
  }

  var Stream
  try {
    Stream = require('stream').Stream
  } catch (ex) {
    Stream = function () {}
  }

  var streamWraps = sax.EVENTS.filter(function (ev) {
    return ev !== 'error' && ev !== 'end'
  })

  function createStream (strict, opt) {
    return new SAXStream(strict, opt)
  }

  function SAXStream (strict, opt) {
    if (!(this instanceof SAXStream)) {
      return new SAXStream(strict, opt)
    }

    Stream.apply(this)

    this._parser = new SAXParser(strict, opt)
    this.writable = true
    this.readable = true

    var me = this

    this._parser.onend = function () {
      me.emit('end')
    }

    this._parser.onerror = function (er) {
      me.emit('error', er)

      // if didn't throw, then means error was handled.
      // go ahead and clear error, so we can write again.
      me._parser.error = null
    }

    this._decoder = null

    streamWraps.forEach(function (ev) {
      Object.defineProperty(me, 'on' + ev, {
        get: function () {
          return me._parser['on' + ev]
        },
        set: function (h) {
          if (!h) {
            me.removeAllListeners(ev)
            me._parser['on' + ev] = h
            return h
          }
          me.on(ev, h)
        },
        enumerable: true,
        configurable: false
      })
    })
  }

  SAXStream.prototype = Object.create(Stream.prototype, {
    constructor: {
      value: SAXStream
    }
  })

  SAXStream.prototype.write = function (data) {
    if (typeof Buffer === 'function' &&
      typeof Buffer.isBuffer === 'function' &&
      Buffer.isBuffer(data)) {
      if (!this._decoder) {
        var SD = require('string_decoder').StringDecoder
        this._decoder = new SD('utf8')
      }
      data = this._decoder.write(data)
    }

    this._parser.write(data.toString())
    this.emit('data', data)
    return true
  }

  SAXStream.prototype.end = function (chunk) {
    if (chunk && chunk.length) {
      this.write(chunk)
    }
    this._parser.end()
    return true
  }

  SAXStream.prototype.on = function (ev, handler) {
    var me = this
    if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {
      me._parser['on' + ev] = function () {
        var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)
        args.splice(0, 0, ev)
        me.emit.apply(me, args)
      }
    }

    return Stream.prototype.on.call(me, ev, handler)
  }

  // this really needs to be replaced with character classes.
  // XML allows all manner of ridiculous numbers and digits.
  var CDATA = '[CDATA['
  var DOCTYPE = 'DOCTYPE'
  var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'
  var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'
  var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }

  // http://www.w3.org/TR/REC-xml/#NT-NameStartChar
  // This implementation works on strings, a single character at a time
  // as such, it cannot ever support astral-plane characters (10000-EFFFF)
  // without a significant breaking change to either this  parser, or the
  // JavaScript language.  Implementation of an emoji-capable xml parser
  // is left as an exercise for the reader.
  var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/

  var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/

  var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
  var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/

  function isWhitespace (c) {
    return c === ' ' || c === '\n' || c === '\r' || c === '\t'
  }

  function isQuote (c) {
    return c === '"' || c === '\''
  }

  function isAttribEnd (c) {
    return c === '>' || isWhitespace(c)
  }

  function isMatch (regex, c) {
    return regex.test(c)
  }

  function notMatch (regex, c) {
    return !isMatch(regex, c)
  }

  var S = 0
  sax.STATE = {
    BEGIN: S++, // leading byte order mark or whitespace
    BEGIN_WHITESPACE: S++, // leading whitespace
    TEXT: S++, // general stuff
    TEXT_ENTITY: S++, // &amp and such.
    OPEN_WAKA: S++, // <
    SGML_DECL: S++, // <!BLARG
    SGML_DECL_QUOTED: S++, // <!BLARG foo "bar
    DOCTYPE: S++, // <!DOCTYPE
    DOCTYPE_QUOTED: S++, // <!DOCTYPE "//blah
    DOCTYPE_DTD: S++, // <!DOCTYPE "//blah" [ ...
    DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE "//blah" [ "foo
    COMMENT_STARTING: S++, // <!-
    COMMENT: S++, // <!--
    COMMENT_ENDING: S++, // <!-- blah -
    COMMENT_ENDED: S++, // <!-- blah --
    CDATA: S++, // <![CDATA[ something
    CDATA_ENDING: S++, // ]
    CDATA_ENDING_2: S++, // ]]
    PROC_INST: S++, // <?hi
    PROC_INST_BODY: S++, // <?hi there
    PROC_INST_ENDING: S++, // <?hi "there" ?
    OPEN_TAG: S++, // <strong
    OPEN_TAG_SLASH: S++, // <strong /
    ATTRIB: S++, // <a
    ATTRIB_NAME: S++, // <a foo
    ATTRIB_NAME_SAW_WHITE: S++, // <a foo _
    ATTRIB_VALUE: S++, // <a foo=
    ATTRIB_VALUE_QUOTED: S++, // <a foo="bar
    ATTRIB_VALUE_CLOSED: S++, // <a foo="bar"
    ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar
    ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar="&quot;"
    ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot
    CLOSE_TAG: S++, // </a
    CLOSE_TAG_SAW_WHITE: S++, // </a   >
    SCRIPT: S++, // <script> ...
    SCRIPT_ENDING: S++ // <script> ... <
  }

  sax.XML_ENTITIES = {
    'amp': '&',
    'gt': '>',
    'lt': '<',
    'quot': '"',
    'apos': "'"
  }

  sax.ENTITIES = {
    'amp': '&',
    'gt': '>',
    'lt': '<',
    'quot': '"',
    'apos': "'",
    'AElig': 198,
    'Aacute': 193,
    'Acirc': 194,
    'Agrave': 192,
    'Aring': 197,
    'Atilde': 195,
    'Auml': 196,
    'Ccedil': 199,
    'ETH': 208,
    'Eacute': 201,
    'Ecirc': 202,
    'Egrave': 200,
    'Euml': 203,
    'Iacute': 205,
    'Icirc': 206,
    'Igrave': 204,
    'Iuml': 207,
    'Ntilde': 209,
    'Oacute': 211,
    'Ocirc': 212,
    'Ograve': 210,
    'Oslash': 216,
    'Otilde': 213,
    'Ouml': 214,
    'THORN': 222,
    'Uacute': 218,
    'Ucirc': 219,
    'Ugrave': 217,
    'Uuml': 220,
    'Yacute': 221,
    'aacute': 225,
    'acirc': 226,
    'aelig': 230,
    'agrave': 224,
    'aring': 229,
    'atilde': 227,
    'auml': 228,
    'ccedil': 231,
    'eacute': 233,
    'ecirc': 234,
    'egrave': 232,
    'eth': 240,
    'euml': 235,
    'iacute': 237,
    'icirc': 238,
    'igrave': 236,
    'iuml': 239,
    'ntilde': 241,
    'oacute': 243,
    'ocirc': 244,
    'ograve': 242,
    'oslash': 248,
    'otilde': 245,
    'ouml': 246,
    'szlig': 223,
    'thorn': 254,
    'uacute': 250,
    'ucirc': 251,
    'ugrave': 249,
    'uuml': 252,
    'yacute': 253,
    'yuml': 255,
    'copy': 169,
    'reg': 174,
    'nbsp': 160,
    'iexcl': 161,
    'cent': 162,
    'pound': 163,
    'curren': 164,
    'yen': 165,
    'brvbar': 166,
    'sect': 167,
    'uml': 168,
    'ordf': 170,
    'laquo': 171,
    'not': 172,
    'shy': 173,
    'macr': 175,
    'deg': 176,
    'plusmn': 177,
    'sup1': 185,
    'sup2': 178,
    'sup3': 179,
    'acute': 180,
    'micro': 181,
    'para': 182,
    'middot': 183,
    'cedil': 184,
    'ordm': 186,
    'raquo': 187,
    'frac14': 188,
    'frac12': 189,
    'frac34': 190,
    'iquest': 191,
    'times': 215,
    'divide': 247,
    'OElig': 338,
    'oelig': 339,
    'Scaron': 352,
    'scaron': 353,
    'Yuml': 376,
    'fnof': 402,
    'circ': 710,
    'tilde': 732,
    'Alpha': 913,
    'Beta': 914,
    'Gamma': 915,
    'Delta': 916,
    'Epsilon': 917,
    'Zeta': 918,
    'Eta': 919,
    'Theta': 920,
    'Iota': 921,
    'Kappa': 922,
    'Lambda': 923,
    'Mu': 924,
    'Nu': 925,
    'Xi': 926,
    'Omicron': 927,
    'Pi': 928,
    'Rho': 929,
    'Sigma': 931,
    'Tau': 932,
    'Upsilon': 933,
    'Phi': 934,
    'Chi': 935,
    'Psi': 936,
    'Omega': 937,
    'alpha': 945,
    'beta': 946,
    'gamma': 947,
    'delta': 948,
    'epsilon': 949,
    'zeta': 950,
    'eta': 951,
    'theta': 952,
    'iota': 953,
    'kappa': 954,
    'lambda': 955,
    'mu': 956,
    'nu': 957,
    'xi': 958,
    'omicron': 959,
    'pi': 960,
    'rho': 961,
    'sigmaf': 962,
    'sigma': 963,
    'tau': 964,
    'upsilon': 965,
    'phi': 966,
    'chi': 967,
    'psi': 968,
    'omega': 969,
    'thetasym': 977,
    'upsih': 978,
    'piv': 982,
    'ensp': 8194,
    'emsp': 8195,
    'thinsp': 8201,
    'zwnj': 8204,
    'zwj': 8205,
    'lrm': 8206,
    'rlm': 8207,
    'ndash': 8211,
    'mdash': 8212,
    'lsquo': 8216,
    'rsquo': 8217,
    'sbquo': 8218,
    'ldquo': 8220,
    'rdquo': 8221,
    'bdquo': 8222,
    'dagger': 8224,
    'Dagger': 8225,
    'bull': 8226,
    'hellip': 8230,
    'permil': 8240,
    'prime': 8242,
    'Prime': 8243,
    'lsaquo': 8249,
    'rsaquo': 8250,
    'oline': 8254,
    'frasl': 8260,
    'euro': 8364,
    'image': 8465,
    'weierp': 8472,
    'real': 8476,
    'trade': 8482,
    'alefsym': 8501,
    'larr': 8592,
    'uarr': 8593,
    'rarr': 8594,
    'darr': 8595,
    'harr': 8596,
    'crarr': 8629,
    'lArr': 8656,
    'uArr': 8657,
    'rArr': 8658,
    'dArr': 8659,
    'hArr': 8660,
    'forall': 8704,
    'part': 8706,
    'exist': 8707,
    'empty': 8709,
    'nabla': 8711,
    'isin': 8712,
    'notin': 8713,
    'ni': 8715,
    'prod': 8719,
    'sum': 8721,
    'minus': 8722,
    'lowast': 8727,
    'radic': 8730,
    'prop': 8733,
    'infin': 8734,
    'ang': 8736,
    'and': 8743,
    'or': 8744,
    'cap': 8745,
    'cup': 8746,
    'int': 8747,
    'there4': 8756,
    'sim': 8764,
    'cong': 8773,
    'asymp': 8776,
    'ne': 8800,
    'equiv': 8801,
    'le': 8804,
    'ge': 8805,
    'sub': 8834,
    'sup': 8835,
    'nsub': 8836,
    'sube': 8838,
    'supe': 8839,
    'oplus': 8853,
    'otimes': 8855,
    'perp': 8869,
    'sdot': 8901,
    'lceil': 8968,
    'rceil': 8969,
    'lfloor': 8970,
    'rfloor': 8971,
    'lang': 9001,
    'rang': 9002,
    'loz': 9674,
    'spades': 9824,
    'clubs': 9827,
    'hearts': 9829,
    'diams': 9830
  }

  Object.keys(sax.ENTITIES).forEach(function (key) {
    var e = sax.ENTITIES[key]
    var s = typeof e === 'number' ? String.fromCharCode(e) : e
    sax.ENTITIES[key] = s
  })

  for (var s in sax.STATE) {
    sax.STATE[sax.STATE[s]] = s
  }

  // shorthand
  S = sax.STATE

  function emit (parser, event, data) {
    parser[event] && parser[event](data)
  }

  function emitNode (parser, nodeType, data) {
    if (parser.textNode) closeText(parser)
    emit(parser, nodeType, data)
  }

  function closeText (parser) {
    parser.textNode = textopts(parser.opt, parser.textNode)
    if (parser.textNode) emit(parser, 'ontext', parser.textNode)
    parser.textNode = ''
  }

  function textopts (opt, text) {
    if (opt.trim) text = text.trim()
    if (opt.normalize) text = text.replace(/\s+/g, ' ')
    return text
  }

  function error (parser, er) {
    closeText(parser)
    if (parser.trackPosition) {
      er += '\nLine: ' + parser.line +
        '\nColumn: ' + parser.column +
        '\nChar: ' + parser.c
    }
    er = new Error(er)
    parser.error = er
    emit(parser, 'onerror', er)
    return parser
  }

  function end (parser) {
    if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')
    if ((parser.state !== S.BEGIN) &&
      (parser.state !== S.BEGIN_WHITESPACE) &&
      (parser.state !== S.TEXT)) {
      error(parser, 'Unexpected end')
    }
    closeText(parser)
    parser.c = ''
    parser.closed = true
    emit(parser, 'onend')
    SAXParser.call(parser, parser.strict, parser.opt)
    return parser
  }

  function strictFail (parser, message) {
    if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {
      throw new Error('bad call to strictFail')
    }
    if (parser.strict) {
      error(parser, message)
    }
  }

  function newTag (parser) {
    if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()
    var parent = parser.tags[parser.tags.length - 1] || parser
    var tag = parser.tag = { name: parser.tagName, attributes: {} }

    // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
    if (parser.opt.xmlns) {
      tag.ns = parent.ns
    }
    parser.attribList.length = 0
    emitNode(parser, 'onopentagstart', tag)
  }

  function qname (name, attribute) {
    var i = name.indexOf(':')
    var qualName = i < 0 ? [ '', name ] : name.split(':')
    var prefix = qualName[0]
    var local = qualName[1]

    // <x "xmlns"="http://foo">
    if (attribute && name === 'xmlns') {
      prefix = 'xmlns'
      local = ''
    }

    return { prefix: prefix, local: local }
  }

  function attrib (parser) {
    if (!parser.strict) {
      parser.attribName = parser.attribName[parser.looseCase]()
    }

    if (parser.attribList.indexOf(parser.attribName) !== -1 ||
      parser.tag.attributes.hasOwnProperty(parser.attribName)) {
      parser.attribName = parser.attribValue = ''
      return
    }

    if (parser.opt.xmlns) {
      var qn = qname(parser.attribName, true)
      var prefix = qn.prefix
      var local = qn.local

      if (prefix === 'xmlns') {
        // namespace binding attribute. push the binding into scope
        if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {
          strictFail(parser,
            'xml: prefix must be bound to ' + XML_NAMESPACE + '\n' +
            'Actual: ' + parser.attribValue)
        } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {
          strictFail(parser,
            'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\n' +
            'Actual: ' + parser.attribValue)
        } else {
          var tag = parser.tag
          var parent = parser.tags[parser.tags.length - 1] || parser
          if (tag.ns === parent.ns) {
            tag.ns = Object.create(parent.ns)
          }
          tag.ns[local] = parser.attribValue
        }
      }

      // defer onattribute events until all attributes have been seen
      // so any new bindings can take effect. preserve attribute order
      // so deferred events can be emitted in document order
      parser.attribList.push([parser.attribName, parser.attribValue])
    } else {
      // in non-xmlns mode, we can emit the event right away
      parser.tag.attributes[parser.attribName] = parser.attribValue
      emitNode(parser, 'onattribute', {
        name: parser.attribName,
        value: parser.attribValue
      })
    }

    parser.attribName = parser.attribValue = ''
  }

  function openTag (parser, selfClosing) {
    if (parser.opt.xmlns) {
      // emit namespace binding events
      var tag = parser.tag

      // add namespace info to tag
      var qn = qname(parser.tagName)
      tag.prefix = qn.prefix
      tag.local = qn.local
      tag.uri = tag.ns[qn.prefix] || ''

      if (tag.prefix && !tag.uri) {
        strictFail(parser, 'Unbound namespace prefix: ' +
          JSON.stringify(parser.tagName))
        tag.uri = qn.prefix
      }

      var parent = parser.tags[parser.tags.length - 1] || parser
      if (tag.ns && parent.ns !== tag.ns) {
        Object.keys(tag.ns).forEach(function (p) {
          emitNode(parser, 'onopennamespace', {
            prefix: p,
            uri: tag.ns[p]
          })
        })
      }

      // handle deferred onattribute events
      // Note: do not apply default ns to attributes:
      //   http://www.w3.org/TR/REC-xml-names/#defaulting
      for (var i = 0, l = parser.attribList.length; i < l; i++) {
        var nv = parser.attribList[i]
        var name = nv[0]
        var value = nv[1]
        var qualName = qname(name, true)
        var prefix = qualName.prefix
        var local = qualName.local
        var uri = prefix === '' ? '' : (tag.ns[prefix] || '')
        var a = {
          name: name,
          value: value,
          prefix: prefix,
          local: local,
          uri: uri
        }

        // if there's any attributes with an undefined namespace,
        // then fail on them now.
        if (prefix && prefix !== 'xmlns' && !uri) {
          strictFail(parser, 'Unbound namespace prefix: ' +
            JSON.stringify(prefix))
          a.uri = prefix
        }
        parser.tag.attributes[name] = a
        emitNode(parser, 'onattribute', a)
      }
      parser.attribList.length = 0
    }

    parser.tag.isSelfClosing = !!selfClosing

    // process the tag
    parser.sawRoot = true
    parser.tags.push(parser.tag)
    emitNode(parser, 'onopentag', parser.tag)
    if (!selfClosing) {
      // special case for <script> in non-strict mode.
      if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {
        parser.state = S.SCRIPT
      } else {
        parser.state = S.TEXT
      }
      parser.tag = null
      parser.tagName = ''
    }
    parser.attribName = parser.attribValue = ''
    parser.attribList.length = 0
  }

  function closeTag (parser) {
    if (!parser.tagName) {
      strictFail(parser, 'Weird empty close tag.')
      parser.textNode += '</>'
      parser.state = S.TEXT
      return
    }

    if (parser.script) {
      if (parser.tagName !== 'script') {
        parser.script += '</' + parser.tagName + '>'
        parser.tagName = ''
        parser.state = S.SCRIPT
        return
      }
      emitNode(parser, 'onscript', parser.script)
      parser.script = ''
    }

    // first make sure that the closing tag actually exists.
    // <a><b></c></b></a> will close everything, otherwise.
    var t = parser.tags.length
    var tagName = parser.tagName
    if (!parser.strict) {
      tagName = tagName[parser.looseCase]()
    }
    var closeTo = tagName
    while (t--) {
      var close = parser.tags[t]
      if (close.name !== closeTo) {
        // fail the first time in strict mode
        strictFail(parser, 'Unexpected close tag')
      } else {
        break
      }
    }

    // didn't find it.  we already failed for strict, so just abort.
    if (t < 0) {
      strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)
      parser.textNode += '</' + parser.tagName + '>'
      parser.state = S.TEXT
      return
    }
    parser.tagName = tagName
    var s = parser.tags.length
    while (s-- > t) {
      var tag = parser.tag = parser.tags.pop()
      parser.tagName = parser.tag.name
      emitNode(parser, 'onclosetag', parser.tagName)

      var x = {}
      for (var i in tag.ns) {
        x[i] = tag.ns[i]
      }

      var parent = parser.tags[parser.tags.length - 1] || parser
      if (parser.opt.xmlns && tag.ns !== parent.ns) {
        // remove namespace bindings introduced by tag
        Object.keys(tag.ns).forEach(function (p) {
          var n = tag.ns[p]
          emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })
        })
      }
    }
    if (t === 0) parser.closedRoot = true
    parser.tagName = parser.attribValue = parser.attribName = ''
    parser.attribList.length = 0
    parser.state = S.TEXT
  }

  function parseEntity (parser) {
    var entity = parser.entity
    var entityLC = entity.toLowerCase()
    var num
    var numStr = ''

    if (parser.ENTITIES[entity]) {
      return parser.ENTITIES[entity]
    }
    if (parser.ENTITIES[entityLC]) {
      return parser.ENTITIES[entityLC]
    }
    entity = entityLC
    if (entity.charAt(0) === '#') {
      if (entity.charAt(1) === 'x') {
        entity = entity.slice(2)
        num = parseInt(entity, 16)
        numStr = num.toString(16)
      } else {
        entity = entity.slice(1)
        num = parseInt(entity, 10)
        numStr = num.toString(10)
      }
    }
    entity = entity.replace(/^0+/, '')
    if (isNaN(num) || numStr.toLowerCase() !== entity) {
      strictFail(parser, 'Invalid character entity')
      return '&' + parser.entity + ';'
    }

    return String.fromCodePoint(num)
  }

  function beginWhiteSpace (parser, c) {
    if (c === '<') {
      parser.state = S.OPEN_WAKA
      parser.startTagPosition = parser.position
    } else if (!isWhitespace(c)) {
      // have to process this as a text node.
      // weird, but happens.
      strictFail(parser, 'Non-whitespace before first tag.')
      parser.textNode = c
      parser.state = S.TEXT
    }
  }

  function charAt (chunk, i) {
    var result = ''
    if (i < chunk.length) {
      result = chunk.charAt(i)
    }
    return result
  }

  function write (chunk) {
    var parser = this
    if (this.error) {
      throw this.error
    }
    if (parser.closed) {
      return error(parser,
        'Cannot write after close. Assign an onready handler.')
    }
    if (chunk === null) {
      return end(parser)
    }
    if (typeof chunk === 'object') {
      chunk = chunk.toString()
    }
    var i = 0
    var c = ''
    while (true) {
      c = charAt(chunk, i++)
      parser.c = c

      if (!c) {
        break
      }

      if (parser.trackPosition) {
        parser.position++
        if (c === '\n') {
          parser.line++
          parser.column = 0
        } else {
          parser.column++
        }
      }

      switch (parser.state) {
        case S.BEGIN:
          parser.state = S.BEGIN_WHITESPACE
          if (c === '\uFEFF') {
            continue
          }
          beginWhiteSpace(parser, c)
          continue

        case S.BEGIN_WHITESPACE:
          beginWhiteSpace(parser, c)
          continue

        case S.TEXT:
          if (parser.sawRoot && !parser.closedRoot) {
            var starti = i - 1
            while (c && c !== '<' && c !== '&') {
              c = charAt(chunk, i++)
              if (c && parser.trackPosition) {
                parser.position++
                if (c === '\n') {
                  parser.line++
                  parser.column = 0
                } else {
                  parser.column++
                }
              }
            }
            parser.textNode += chunk.substring(starti, i - 1)
          }
          if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {
            parser.state = S.OPEN_WAKA
            parser.startTagPosition = parser.position
          } else {
            if (!isWhitespace(c) && (!parser.sawRoot || parser.closedRoot)) {
              strictFail(parser, 'Text data outside of root node.')
            }
            if (c === '&') {
              parser.state = S.TEXT_ENTITY
            } else {
              parser.textNode += c
            }
          }
          continue

        case S.SCRIPT:
          // only non-strict
          if (c === '<') {
            parser.state = S.SCRIPT_ENDING
          } else {
            parser.script += c
          }
          continue

        case S.SCRIPT_ENDING:
          if (c === '/') {
            parser.state = S.CLOSE_TAG
          } else {
            parser.script += '<' + c
            parser.state = S.SCRIPT
          }
          continue

        case S.OPEN_WAKA:
          // either a /, ?, !, or text is coming next.
          if (c === '!') {
            parser.state = S.SGML_DECL
            parser.sgmlDecl = ''
          } else if (isWhitespace(c)) {
            // wait for it...
          } else if (isMatch(nameStart, c)) {
            parser.state = S.OPEN_TAG
            parser.tagName = c
          } else if (c === '/') {
            parser.state = S.CLOSE_TAG
            parser.tagName = ''
          } else if (c === '?') {
            parser.state = S.PROC_INST
            parser.procInstName = parser.procInstBody = ''
          } else {
            strictFail(parser, 'Unencoded <')
            // if there was some whitespace, then add that in.
            if (parser.startTagPosition + 1 < parser.position) {
              var pad = parser.position - parser.startTagPosition
              c = new Array(pad).join(' ') + c
            }
            parser.textNode += '<' + c
            parser.state = S.TEXT
          }
          continue

        case S.SGML_DECL:
          if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {
            emitNode(parser, 'onopencdata')
            parser.state = S.CDATA
            parser.sgmlDecl = ''
            parser.cdata = ''
          } else if (parser.sgmlDecl + c === '--') {
            parser.state = S.COMMENT
            parser.comment = ''
            parser.sgmlDecl = ''
          } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {
            parser.state = S.DOCTYPE
            if (parser.doctype || parser.sawRoot) {
              strictFail(parser,
                'Inappropriately located doctype declaration')
            }
            parser.doctype = ''
            parser.sgmlDecl = ''
          } else if (c === '>') {
            emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)
            parser.sgmlDecl = ''
            parser.state = S.TEXT
          } else if (isQuote(c)) {
            parser.state = S.SGML_DECL_QUOTED
            parser.sgmlDecl += c
          } else {
            parser.sgmlDecl += c
          }
          continue

        case S.SGML_DECL_QUOTED:
          if (c === parser.q) {
            parser.state = S.SGML_DECL
            parser.q = ''
          }
          parser.sgmlDecl += c
          continue

        case S.DOCTYPE:
          if (c === '>') {
            parser.state = S.TEXT
            emitNode(parser, 'ondoctype', parser.doctype)
            parser.doctype = true // just remember that we saw it.
          } else {
            parser.doctype += c
            if (c === '[') {
              parser.state = S.DOCTYPE_DTD
            } else if (isQuote(c)) {
              parser.state = S.DOCTYPE_QUOTED
              parser.q = c
            }
          }
          continue

        case S.DOCTYPE_QUOTED:
          parser.doctype += c
          if (c === parser.q) {
            parser.q = ''
            parser.state = S.DOCTYPE
          }
          continue

        case S.DOCTYPE_DTD:
          parser.doctype += c
          if (c === ']') {
            parser.state = S.DOCTYPE
          } else if (isQuote(c)) {
            parser.state = S.DOCTYPE_DTD_QUOTED
            parser.q = c
          }
          continue

        case S.DOCTYPE_DTD_QUOTED:
          parser.doctype += c
          if (c === parser.q) {
            parser.state = S.DOCTYPE_DTD
            parser.q = ''
          }
          continue

        case S.COMMENT:
          if (c === '-') {
            parser.state = S.COMMENT_ENDING
          } else {
            parser.comment += c
          }
          continue

        case S.COMMENT_ENDING:
          if (c === '-') {
            parser.state = S.COMMENT_ENDED
            parser.comment = textopts(parser.opt, parser.comment)
            if (parser.comment) {
              emitNode(parser, 'oncomment', parser.comment)
            }
            parser.comment = ''
          } else {
            parser.comment += '-' + c
            parser.state = S.COMMENT
          }
          continue

        case S.COMMENT_ENDED:
          if (c !== '>') {
            strictFail(parser, 'Malformed comment')
            // allow <!-- blah -- bloo --> in non-strict mode,
            // which is a comment of " blah -- bloo "
            parser.comment += '--' + c
            parser.state = S.COMMENT
          } else {
            parser.state = S.TEXT
          }
          continue

        case S.CDATA:
          if (c === ']') {
            parser.state = S.CDATA_ENDING
          } else {
            parser.cdata += c
          }
          continue

        case S.CDATA_ENDING:
          if (c === ']') {
            parser.state = S.CDATA_ENDING_2
          } else {
            parser.cdata += ']' + c
            parser.state = S.CDATA
          }
          continue

        case S.CDATA_ENDING_2:
          if (c === '>') {
            if (parser.cdata) {
              emitNode(parser, 'oncdata', parser.cdata)
            }
            emitNode(parser, 'onclosecdata')
            parser.cdata = ''
            parser.state = S.TEXT
          } else if (c === ']') {
            parser.cdata += ']'
          } else {
            parser.cdata += ']]' + c
            parser.state = S.CDATA
          }
          continue

        case S.PROC_INST:
          if (c === '?') {
            parser.state = S.PROC_INST_ENDING
          } else if (isWhitespace(c)) {
            parser.state = S.PROC_INST_BODY
          } else {
            parser.procInstName += c
          }
          continue

        case S.PROC_INST_BODY:
          if (!parser.procInstBody && isWhitespace(c)) {
            continue
          } else if (c === '?') {
            parser.state = S.PROC_INST_ENDING
          } else {
            parser.procInstBody += c
          }
          continue

        case S.PROC_INST_ENDING:
          if (c === '>') {
            emitNode(parser, 'onprocessinginstruction', {
              name: parser.procInstName,
              body: parser.procInstBody
            })
            parser.procInstName = parser.procInstBody = ''
            parser.state = S.TEXT
          } else {
            parser.procInstBody += '?' + c
            parser.state = S.PROC_INST_BODY
          }
          continue

        case S.OPEN_TAG:
          if (isMatch(nameBody, c)) {
            parser.tagName += c
          } else {
            newTag(parser)
            if (c === '>') {
              openTag(parser)
            } else if (c === '/') {
              parser.state = S.OPEN_TAG_SLASH
            } else {
              if (!isWhitespace(c)) {
                strictFail(parser, 'Invalid character in tag name')
              }
              parser.state = S.ATTRIB
            }
          }
          continue

        case S.OPEN_TAG_SLASH:
          if (c === '>') {
            openTag(parser, true)
            closeTag(parser)
          } else {
            strictFail(parser, 'Forward-slash in opening tag not followed by >')
            parser.state = S.ATTRIB
          }
          continue

        case S.ATTRIB:
          // haven't read the attribute name yet.
          if (isWhitespace(c)) {
            continue
          } else if (c === '>') {
            openTag(parser)
          } else if (c === '/') {
            parser.state = S.OPEN_TAG_SLASH
          } else if (isMatch(nameStart, c)) {
            parser.attribName = c
            parser.attribValue = ''
            parser.state = S.ATTRIB_NAME
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_NAME:
          if (c === '=') {
            parser.state = S.ATTRIB_VALUE
          } else if (c === '>') {
            strictFail(parser, 'Attribute without value')
            parser.attribValue = parser.attribName
            attrib(parser)
            openTag(parser)
          } else if (isWhitespace(c)) {
            parser.state = S.ATTRIB_NAME_SAW_WHITE
          } else if (isMatch(nameBody, c)) {
            parser.attribName += c
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_NAME_SAW_WHITE:
          if (c === '=') {
            parser.state = S.ATTRIB_VALUE
          } else if (isWhitespace(c)) {
            continue
          } else {
            strictFail(parser, 'Attribute without value')
            parser.tag.attributes[parser.attribName] = ''
            parser.attribValue = ''
            emitNode(parser, 'onattribute', {
              name: parser.attribName,
              value: ''
            })
            parser.attribName = ''
            if (c === '>') {
              openTag(parser)
            } else if (isMatch(nameStart, c)) {
              parser.attribName = c
              parser.state = S.ATTRIB_NAME
            } else {
              strictFail(parser, 'Invalid attribute name')
              parser.state = S.ATTRIB
            }
          }
          continue

        case S.ATTRIB_VALUE:
          if (isWhitespace(c)) {
            continue
          } else if (isQuote(c)) {
            parser.q = c
            parser.state = S.ATTRIB_VALUE_QUOTED
          } else {
            strictFail(parser, 'Unquoted attribute value')
            parser.state = S.ATTRIB_VALUE_UNQUOTED
            parser.attribValue = c
          }
          continue

        case S.ATTRIB_VALUE_QUOTED:
          if (c !== parser.q) {
            if (c === '&') {
              parser.state = S.ATTRIB_VALUE_ENTITY_Q
            } else {
              parser.attribValue += c
            }
            continue
          }
          attrib(parser)
          parser.q = ''
          parser.state = S.ATTRIB_VALUE_CLOSED
          continue

        case S.ATTRIB_VALUE_CLOSED:
          if (isWhitespace(c)) {
            parser.state = S.ATTRIB
          } else if (c === '>') {
            openTag(parser)
          } else if (c === '/') {
            parser.state = S.OPEN_TAG_SLASH
          } else if (isMatch(nameStart, c)) {
            strictFail(parser, 'No whitespace between attributes')
            parser.attribName = c
            parser.attribValue = ''
            parser.state = S.ATTRIB_NAME
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_VALUE_UNQUOTED:
          if (!isAttribEnd(c)) {
            if (c === '&') {
              parser.state = S.ATTRIB_VALUE_ENTITY_U
            } else {
              parser.attribValue += c
            }
            continue
          }
          attrib(parser)
          if (c === '>') {
            openTag(parser)
          } else {
            parser.state = S.ATTRIB
          }
          continue

        case S.CLOSE_TAG:
          if (!parser.tagName) {
            if (isWhitespace(c)) {
              continue
            } else if (notMatch(nameStart, c)) {
              if (parser.script) {
                parser.script += '</' + c
                parser.state = S.SCRIPT
              } else {
                strictFail(parser, 'Invalid tagname in closing tag.')
              }
            } else {
              parser.tagName = c
            }
          } else if (c === '>') {
            closeTag(parser)
          } else if (isMatch(nameBody, c)) {
            parser.tagName += c
          } else if (parser.script) {
            parser.script += '</' + parser.tagName
            parser.tagName = ''
            parser.state = S.SCRIPT
          } else {
            if (!isWhitespace(c)) {
              strictFail(parser, 'Invalid tagname in closing tag')
            }
            parser.state = S.CLOSE_TAG_SAW_WHITE
          }
          continue

        case S.CLOSE_TAG_SAW_WHITE:
          if (isWhitespace(c)) {
            continue
          }
          if (c === '>') {
            closeTag(parser)
          } else {
            strictFail(parser, 'Invalid characters in closing tag')
          }
          continue

        case S.TEXT_ENTITY:
        case S.ATTRIB_VALUE_ENTITY_Q:
        case S.ATTRIB_VALUE_ENTITY_U:
          var returnState
          var buffer
          switch (parser.state) {
            case S.TEXT_ENTITY:
              returnState = S.TEXT
              buffer = 'textNode'
              break

            case S.ATTRIB_VALUE_ENTITY_Q:
              returnState = S.ATTRIB_VALUE_QUOTED
              buffer = 'attribValue'
              break

            case S.ATTRIB_VALUE_ENTITY_U:
              returnState = S.ATTRIB_VALUE_UNQUOTED
              buffer = 'attribValue'
              break
          }

          if (c === ';') {
            parser[buffer] += parseEntity(parser)
            parser.entity = ''
            parser.state = returnState
          } else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) {
            parser.entity += c
          } else {
            strictFail(parser, 'Invalid character in entity name')
            parser[buffer] += '&' + parser.entity + c
            parser.entity = ''
            parser.state = returnState
          }

          continue

        default:
          throw new Error(parser, 'Unknown state: ' + parser.state)
      }
    } // while

    if (parser.position >= parser.bufferCheckPosition) {
      checkBufferLength(parser)
    }
    return parser
  }

  /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
  /* istanbul ignore next */
  if (!String.fromCodePoint) {
    (function () {
      var stringFromCharCode = String.fromCharCode
      var floor = Math.floor
      var fromCodePoint = function () {
        var MAX_SIZE = 0x4000
        var codeUnits = []
        var highSurrogate
        var lowSurrogate
        var index = -1
        var length = arguments.length
        if (!length) {
          return ''
        }
        var result = ''
        while (++index < length) {
          var codePoint = Number(arguments[index])
          if (
            !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`
            codePoint < 0 || // not a valid Unicode code point
            codePoint > 0x10FFFF || // not a valid Unicode code point
            floor(codePoint) !== codePoint // not an integer
          ) {
            throw RangeError('Invalid code point: ' + codePoint)
          }
          if (codePoint <= 0xFFFF) { // BMP code point
            codeUnits.push(codePoint)
          } else { // Astral code point; split in surrogate halves
            // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
            codePoint -= 0x10000
            highSurrogate = (codePoint >> 10) + 0xD800
            lowSurrogate = (codePoint % 0x400) + 0xDC00
            codeUnits.push(highSurrogate, lowSurrogate)
          }
          if (index + 1 === length || codeUnits.length > MAX_SIZE) {
            result += stringFromCharCode.apply(null, codeUnits)
            codeUnits.length = 0
          }
        }
        return result
      }
      /* istanbul ignore next */
      if (Object.defineProperty) {
        Object.defineProperty(String, 'fromCodePoint', {
          value: fromCodePoint,
          configurable: true,
          writable: true
        })
      } else {
        String.fromCodePoint = fromCodePoint
      }
    }())
  }
})(typeof exports === 'undefined' ? this.sax = {} : exports)
(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the 'Software'), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial 
portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)

# BIN directory
BIN := $(THIS_DIR)/node_modules/.bin

# Path
PATH := node_modules/.bin:$(PATH)
SHELL := /bin/bash

# applications
NODE ?= $(shell which node)
YARN ?= $(shell which yarn)
PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
BROWSERIFY ?= $(NODE) $(BIN)/browserify

.FORCE:

install: node_modules

node_modules: package.json
	@NODE_ENV= $(PKG) install
	@touch node_modules

lint: .FORCE
	eslint browser.js debug.js index.js node.js

test-node: .FORCE
	istanbul cover node_modules/mocha/bin/_mocha -- test/**.js

test-browser: .FORCE
	mkdir -p dist

	@$(BROWSERIFY) \
		--standalone debug \
		. > dist/debug.js

	karma start --single-run
	rimraf dist

test: .FORCE
	concurrently \
		"make test-node" \
		"make test-browser"

coveralls:
	cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js

.PHONY: all install clean distclean
{
  "name": "debug",
  "repo": "visionmedia/debug",
  "description": "small debugging utility",
  "version": "2.6.9",
  "keywords": [
    "debug",
    "log",
    "debugger"
  ],
  "main": "src/browser.js",
  "scripts": [
    "src/browser.js",
    "src/debug.js"
  ],
  "dependencies": {
    "rauchg/ms.js": "0.7.1"
  }
}
module.exports = require('./src/node');
{
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "browser": "./src/browser.js",
  "component": {
    "scripts": {
      "debug/index.js": "browser.js",
      "debug/debug.js": "debug.js"
    }
  },
  "dependencies": {
    "ms": "2.0.0"
  },
  "deprecated": false,
  "description": "small debugging utility",
  "devDependencies": {
    "browserify": "9.0.3",
    "chai": "^3.5.0",
    "concurrently": "^3.1.0",
    "coveralls": "^2.11.15",
    "eslint": "^3.12.1",
    "istanbul": "^0.4.5",
    "karma": "^1.3.0",
    "karma-chai": "^0.1.0",
    "karma-mocha": "^1.3.0",
    "karma-phantomjs-launcher": "^1.0.2",
    "karma-sinon": "^1.0.5",
    "mocha": "^3.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "rimraf": "^2.5.4",
    "sinon": "^1.17.6",
    "sinon-chai": "^2.8.0"
  },
  "homepage": "https://github.com/visionmedia/debug#readme",
  "license": "MIT",
  "main": "./src/index.js",
  "name": "debug",
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "version": "2.6.9"
}/**
 * This is the web browser implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
               && 'undefined' != typeof chrome.storage
                  ? chrome.storage.local
                  : localstorage();

/**
 * Colors.
 */

exports.colors = [
  'lightseagreen',
  'forestgreen',
  'goldenrod',
  'dodgerblue',
  'darkorchid',
  'crimson'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

function useColors() {
  // NB: In an Electron preload script, document will be defined but not fully
  // initialized. Since we know we're in Chrome, we'll just detect this case
  // explicitly
  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
    return true;
  }

  // is webkit? http://stackoverflow.com/a/16459606/376773
  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
    // is firebug? http://stackoverflow.com/a/398120/376773
    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
    // is firefox >= v31?
    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
    // double check webkit in userAgent just in case we are in a worker
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

exports.formatters.j = function(v) {
  try {
    return JSON.stringify(v);
  } catch (err) {
    return '[UnexpectedJSONParseError]: ' + err.message;
  }
};


/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var useColors = this.useColors;

  args[0] = (useColors ? '%c' : '')
    + this.namespace
    + (useColors ? ' %c' : ' ')
    + args[0]
    + (useColors ? '%c ' : ' ')
    + '+' + exports.humanize(this.diff);

  if (!useColors) return;

  var c = 'color: ' + this.color;
  args.splice(1, 0, c, 'color: inherit')

  // the final "%c" is somewhat tricky, because there could be other
  // arguments passed either before or after the %c, so we need to
  // figure out the correct index to insert the CSS into
  var index = 0;
  var lastC = 0;
  args[0].replace(/%[a-zA-Z%]/g, function(match) {
    if ('%%' === match) return;
    index++;
    if ('%c' === match) {
      // we only are interested in the *last* %c
      // (the user may have provided their own)
      lastC = index;
    }
  });

  args.splice(lastC, 0, c);
}

/**
 * Invokes `console.log()` when available.
 * No-op when `console.log` is not a "function".
 *
 * @api public
 */

function log() {
  // this hackery is required for IE8/9, where
  // the `console.log` function doesn't have 'apply'
  return 'object' === typeof console
    && console.log
    && Function.prototype.apply.call(console.log, console, arguments);
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  try {
    if (null == namespaces) {
      exports.storage.removeItem('debug');
    } else {
      exports.storage.debug = namespaces;
    }
  } catch(e) {}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  var r;
  try {
    r = exports.storage.debug;
  } catch(e) {}

  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
  if (!r && typeof process !== 'undefined' && 'env' in process) {
    r = process.env.DEBUG;
  }

  return r;
}

/**
 * Enable namespaces listed in `localStorage.debug` initially.
 */

exports.enable(load());

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
  try {
    return window.localStorage;
  } catch (e) {}
}

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
exports.coerce = coerce;
exports.disable = disable;
exports.enable = enable;
exports.enabled = enabled;
exports.humanize = require('ms');

/**
 * The currently active debug mode names, and names to skip.
 */

exports.names = [];
exports.skips = [];

/**
 * Map of special "%n" handling functions, for the debug "format" argument.
 *
 * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
 */

exports.formatters = {};

/**
 * Previous log timestamp.
 */

var prevTime;

/**
 * Select a color.
 * @param {String} namespace
 * @return {Number}
 * @api private
 */

function selectColor(namespace) {
  var hash = 0, i;

  for (i in namespace) {
    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
    hash |= 0; // Convert to 32bit integer
  }

  return exports.colors[Math.abs(hash) % exports.colors.length];
}

/**
 * Create a debugger with the given `namespace`.
 *
 * @param {String} namespace
 * @return {Function}
 * @api public
 */

function createDebug(namespace) {

  function debug() {
    // disabled?
    if (!debug.enabled) return;

    var self = debug;

    // set `diff` timestamp
    var curr = +new Date();
    var ms = curr - (prevTime || curr);
    self.diff = ms;
    self.prev = prevTime;
    self.curr = curr;
    prevTime = curr;

    // turn the `arguments` into a proper Array
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }

    args[0] = exports.coerce(args[0]);

    if ('string' !== typeof args[0]) {
      // anything else let's inspect with %O
      args.unshift('%O');
    }

    // apply any `formatters` transformations
    var index = 0;
    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
      // if we encounter an escaped % then don't increase the array index
      if (match === '%%') return match;
      index++;
      var formatter = exports.formatters[format];
      if ('function' === typeof formatter) {
        var val = args[index];
        match = formatter.call(self, val);

        // now we need to remove `args[index]` since it's inlined in the `format`
        args.splice(index, 1);
        index--;
      }
      return match;
    });

    // apply env-specific formatting (colors, etc.)
    exports.formatArgs.call(self, args);

    var logFn = debug.log || exports.log || console.log.bind(console);
    logFn.apply(self, args);
  }

  debug.namespace = namespace;
  debug.enabled = exports.enabled(namespace);
  debug.useColors = exports.useColors();
  debug.color = selectColor(namespace);

  // env-specific initialization logic for debug instances
  if ('function' === typeof exports.init) {
    exports.init(debug);
  }

  return debug;
}

/**
 * Enables a debug mode by namespaces. This can include modes
 * separated by a colon and wildcards.
 *
 * @param {String} namespaces
 * @api public
 */

function enable(namespaces) {
  exports.save(namespaces);

  exports.names = [];
  exports.skips = [];

  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
  var len = split.length;

  for (var i = 0; i < len; i++) {
    if (!split[i]) continue; // ignore empty strings
    namespaces = split[i].replace(/\*/g, '.*?');
    if (namespaces[0] === '-') {
      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
    } else {
      exports.names.push(new RegExp('^' + namespaces + '$'));
    }
  }
}

/**
 * Disable debug output.
 *
 * @api public
 */

function disable() {
  exports.enable('');
}

/**
 * Returns true if the given mode name is enabled, false otherwise.
 *
 * @param {String} name
 * @return {Boolean}
 * @api public
 */

function enabled(name) {
  var i, len;
  for (i = 0, len = exports.skips.length; i < len; i++) {
    if (exports.skips[i].test(name)) {
      return false;
    }
  }
  for (i = 0, len = exports.names.length; i < len; i++) {
    if (exports.names[i].test(name)) {
      return true;
    }
  }
  return false;
}

/**
 * Coerce `val`.
 *
 * @param {Mixed} val
 * @return {Mixed}
 * @api private
 */

function coerce(val) {
  if (val instanceof Error) return val.stack || val.message;
  return val;
}
/**
 * Detect Electron renderer process, which is node, but we should
 * treat as a browser.
 */

if (typeof process !== 'undefined' && process.type === 'renderer') {
  module.exports = require('./browser.js');
} else {
  module.exports = require('./node.js');
}
module.exports = inspectorLog;

// black hole
const nullStream = new (require('stream').Writable)();
nullStream._write = () => {};

/**
 * Outputs a `console.log()` to the Node.js Inspector console *only*.
 */
function inspectorLog() {
  const stdout = console._stdout;
  console._stdout = nullStream;
  console.log.apply(console, arguments);
  console._stdout = stdout;
}
/**
 * Module dependencies.
 */

var tty = require('tty');
var util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(function (key) {
  return /^debug_/i.test(key);
}).reduce(function (obj, key) {
  // camel-case
  var prop = key
    .substring(6)
    .toLowerCase()
    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });

  // coerce string value into JS value
  var val = process.env[key];
  if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
  else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
  else if (val === 'null') val = null;
  else val = Number(val);

  obj[prop] = val;
  return obj;
}, {});

/**
 * The file descriptor to write the `debug()` calls to.
 * Set the `DEBUG_FD` env variable to override with another value. i.e.:
 *
 *   $ DEBUG_FD=3 node script.js 3>debug.log
 */

var fd = parseInt(process.env.DEBUG_FD, 10) || 2;

if (1 !== fd && 2 !== fd) {
  util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
}

var stream = 1 === fd ? process.stdout :
             2 === fd ? process.stderr :
             createWritableStdioStream(fd);

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
  return 'colors' in exports.inspectOpts
    ? Boolean(exports.inspectOpts.colors)
    : tty.isatty(fd);
}

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

exports.formatters.o = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts)
    .split('\n').map(function(str) {
      return str.trim()
    }).join(' ');
};

/**
 * Map %o to `util.inspect()`, allowing multiple lines if needed.
 */

exports.formatters.O = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts);
};

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var name = this.namespace;
  var useColors = this.useColors;

  if (useColors) {
    var c = this.color;
    var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';

    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
    args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
  } else {
    args[0] = new Date().toUTCString()
      + ' ' + name + ' ' + args[0];
  }
}

/**
 * Invokes `util.format()` with the specified arguments and writes to `stream`.
 */

function log() {
  return stream.write(util.format.apply(util, arguments) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  if (null == namespaces) {
    // If you set a process.env field to null or undefined, it gets cast to the
    // string 'null' or 'undefined'. Just delete instead.
    delete process.env.DEBUG;
  } else {
    process.env.DEBUG = namespaces;
  }
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  return process.env.DEBUG;
}

/**
 * Copied from `node/src/node.js`.
 *
 * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
 * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
 */

function createWritableStdioStream (fd) {
  var stream;
  var tty_wrap = process.binding('tty_wrap');

  // Note stream._type is used for test-module-load-list.js

  switch (tty_wrap.guessHandleType(fd)) {
    case 'TTY':
      stream = new tty.WriteStream(fd);
      stream._type = 'tty';

      // Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    case 'FILE':
      var fs = require('fs');
      stream = new fs.SyncWriteStream(fd, { autoClose: false });
      stream._type = 'fs';
      break;

    case 'PIPE':
    case 'TCP':
      var net = require('net');
      stream = new net.Socket({
        fd: fd,
        readable: false,
        writable: true
      });

      // FIXME Should probably have an option in net.Socket to create a
      // stream from an existing fd which is writable only. But for now
      // we'll just add this hack and set the `readable` member to false.
      // Test: ./node test/fixtures/echo.js < /etc/passwd
      stream.readable = false;
      stream.read = null;
      stream._type = 'pipe';

      // FIXME Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    default:
      // Probably an error on in uv_guess_handle()
      throw new Error('Implement me. Unknown stream file type!');
  }

  // For supporting legacy API we put the FD here.
  stream.fd = fd;

  stream._isStdio = true;

  return stream;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init (debug) {
  debug.inspectOpts = {};

  var keys = Object.keys(exports.inspectOpts);
  for (var i = 0; i < keys.length; i++) {
    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
  }
}

/**
 * Enable namespaces listed in `process.env.DEBUG` initially.
 */

exports.enable(load());
Copyright (c) 2017 Garen J. Torikian

MIT License

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
var fs = require('fs');
var path = require('path');
var alloc = require('buffer-alloc');
var MAX_BYTES = 512;

module.exports = function(bytes, size, cb) {
  // Only two args
  if (cb === undefined) {
    var file = bytes;
    cb = size;

    fs.stat(file, function(err, stat) {
      if (err || !stat.isFile()) return cb(err, false);

      fs.open(file, 'r', function(r_err, descriptor){
          if (r_err) return cb(r_err);
          bytes = alloc(MAX_BYTES);
          // Read the file with no encoding for raw buffer access.
          fs.read(descriptor, bytes, 0, bytes.length, 0, function(err, size, bytes){
            fs.close(descriptor, function(c_err){
                if (c_err) return cb(c_err, false);
                return cb(null, isBinaryCheck(bytes, size));
            });
          });
      });
    });
  }
  else
    return cb(null, isBinaryCheck(bytes, size));
};

function isBinaryCheck(bytes, size) {
  if (size === 0)
    return false;

  var suspicious_bytes = 0;
  var total_bytes = Math.min(size, MAX_BYTES);

  // UTF-8 BOM
  if (size >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) {
    return false;
  }

  // UTF-32 BOM
  if (size >= 4 && bytes[0] === 0x00 && bytes[1] === 0x00 && bytes[2] == 0xFE && bytes[3] == 0xFF) {
    return false;
  }

  // UTF-32 LE BOM
  if (size >= 4 && bytes[0] == 0xFF && bytes[1] == 0xFE && bytes[2] === 0x00 && bytes[3] === 0x00) {
    return false;
  }

  // GB BOM
  if (size >= 4 && bytes[0] == 0x84 && bytes[1] == 0x31 && bytes[2] == 0x95 && bytes[3] == 0x33) {
    return false;
  }

  if (total_bytes >= 5 && bytes.slice(0, 5) == "%PDF-") {
      /* PDF. This is binary. */
      return true;
  }

  // UTF-16 BE BOM
  if (size >= 2 && bytes[0] == 0xFE && bytes[1] == 0xFF) {
    return false;
  }

  // UTF-16 LE BOM
  if (size >= 2 && bytes[0] == 0xFF && bytes[1] == 0xFE) {
    return false;
  }

  for (var i = 0; i < total_bytes; i++) {
    if (bytes[i] === 0) { // NULL byte--it's binary!
      return true;
    }
    else if ((bytes[i] < 7 || bytes[i] > 14) && (bytes[i] < 32 || bytes[i] > 127)) {
      // UTF-8 detection
      if (bytes[i] > 193 && bytes[i] < 224 && i + 1 < total_bytes) {
          i++;
          if (bytes[i] > 127 && bytes[i] < 192) {
            continue;
          }
      }
      else if (bytes[i] > 223 && bytes[i] < 240 && i + 2 < total_bytes) {
          i++;
          if (bytes[i] > 127 && bytes[i] < 192 && bytes[i + 1] > 127 && bytes[i + 1] < 192) {
            i++;
            continue;
          }
      }
      suspicious_bytes++;
      // Read at least 32 bytes before making a decision
      if (i > 32 && (suspicious_bytes * 100) / total_bytes > 10) {
        return true;
      }
    }
  }

  if ((suspicious_bytes * 100) / total_bytes > 10) {
    return true;
  }

  return false;
}

module.exports.sync = function(bytes, size) {
  // Only one arg
  if (size === undefined) {
    var file = bytes;
    try {
      if(!fs.statSync(file).isFile()) return false;
    } catch (err) {
      // otherwise continue on
    }
    var descriptor = fs.openSync(file, 'r');
    try {
      // Read the file with no encoding for raw buffer access.
      bytes = alloc(MAX_BYTES);
      size = fs.readSync(descriptor, bytes, 0, bytes.length, 0);
    } finally {
      fs.closeSync(descriptor);
    }
    return isBinaryCheck(bytes, size);
  }
  else
    return isBinaryCheck(bytes, size);
}
{
  "dependencies": {
    "buffer-alloc": "^1.2.0"
  },
  "deprecated": false,
  "description": "Detects if a file is binary in Node.js. Similar to Perl's -B.",
  "devDependencies": {
    "grunt": "~0.4.1",
    "grunt-cli": "~0.1.13",
    "grunt-exec": "0.4.3",
    "grunt-release": "~0.6.0",
    "mocha": "^2.2.4"
  },
  "engines": {
    "node": ">=0.6.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/gjtorikian/isBinaryFile#readme",
  "license": "MIT",
  "main": "./index.js",
  "maintainers": [
    {
      "name": "Garen J. Torikian",
      "email": "gjtorikian@gmail.com"
    }
  ],
  "name": "isbinaryfile",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/gjtorikian/isBinaryFile.git"
  },
  "version": "3.0.3"
}/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function(val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isNaN(val) === false) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  if (ms >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (ms >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (ms >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (ms >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  return plural(ms, d, 'day') ||
    plural(ms, h, 'hour') ||
    plural(ms, m, 'minute') ||
    plural(ms, s, 'second') ||
    ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, n, name) {
  if (ms < n) {
    return;
  }
  if (ms < n * 1.5) {
    return Math.floor(ms / n) + ' ' + name;
  }
  return Math.ceil(ms / n) + ' ' + name + 's';
}
The MIT License (MIT)

Copyright (c) 2016 Zeit, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "deprecated": false,
  "description": "Tiny milisecond conversion utility",
  "devDependencies": {
    "eslint": "3.19.0",
    "expect.js": "0.3.1",
    "husky": "0.13.3",
    "lint-staged": "3.4.1",
    "mocha": "3.4.1"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/zeit/ms#readme",
  "license": "MIT",
  "lint-staged": {
    "*.js": [
      "npm run lint",
      "prettier --single-quote --write",
      "git add"
    ]
  },
  "main": "./index",
  "name": "ms",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/zeit/ms.git"
  },
  "version": "2.0.0"
}This software is released under the MIT license:

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
module.exports = function (args, opts) {
    if (!opts) opts = {};
    
    var flags = { bools : {}, strings : {}, unknownFn: null };

    if (typeof opts['unknown'] === 'function') {
        flags.unknownFn = opts['unknown'];
    }

    if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {
      flags.allBools = true;
    } else {
      [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
          flags.bools[key] = true;
      });
    }
    
    var aliases = {};
    Object.keys(opts.alias || {}).forEach(function (key) {
        aliases[key] = [].concat(opts.alias[key]);
        aliases[key].forEach(function (x) {
            aliases[x] = [key].concat(aliases[key].filter(function (y) {
                return x !== y;
            }));
        });
    });

    [].concat(opts.string).filter(Boolean).forEach(function (key) {
        flags.strings[key] = true;
        if (aliases[key]) {
            flags.strings[aliases[key]] = true;
        }
     });

    var defaults = opts['default'] || {};
    
    var argv = { _ : [] };
    Object.keys(flags.bools).forEach(function (key) {
        setArg(key, defaults[key] === undefined ? false : defaults[key]);
    });
    
    var notFlags = [];

    if (args.indexOf('--') !== -1) {
        notFlags = args.slice(args.indexOf('--')+1);
        args = args.slice(0, args.indexOf('--'));
    }

    function argDefined(key, arg) {
        return (flags.allBools && /^--[^=]+$/.test(arg)) ||
            flags.strings[key] || flags.bools[key] || aliases[key];
    }

    function setArg (key, val, arg) {
        if (arg && flags.unknownFn && !argDefined(key, arg)) {
            if (flags.unknownFn(arg) === false) return;
        }

        var value = !flags.strings[key] && isNumber(val)
            ? Number(val) : val
        ;
        setKey(argv, key.split('.'), value);
        
        (aliases[key] || []).forEach(function (x) {
            setKey(argv, x.split('.'), value);
        });
    }

    function setKey (obj, keys, value) {
        var o = obj;
        for (var i = 0; i < keys.length-1; i++) {
            var key = keys[i];
            if (key === '__proto__') return;
            if (o[key] === undefined) o[key] = {};
            if (o[key] === Object.prototype || o[key] === Number.prototype
                || o[key] === String.prototype) o[key] = {};
            if (o[key] === Array.prototype) o[key] = [];
            o = o[key];
        }

        var key = keys[keys.length - 1];
        if (key === '__proto__') return;
        if (o === Object.prototype || o === Number.prototype
            || o === String.prototype) o = {};
        if (o === Array.prototype) o = [];
        if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') {
            o[key] = value;
        }
        else if (Array.isArray(o[key])) {
            o[key].push(value);
        }
        else {
            o[key] = [ o[key], value ];
        }
    }
    
    function aliasIsBoolean(key) {
      return aliases[key].some(function (x) {
          return flags.bools[x];
      });
    }

    for (var i = 0; i < args.length; i++) {
        var arg = args[i];
        
        if (/^--.+=/.test(arg)) {
            // Using [\s\S] instead of . because js doesn't support the
            // 'dotall' regex modifier. See:
            // http://stackoverflow.com/a/1068308/13216
            var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
            var key = m[1];
            var value = m[2];
            if (flags.bools[key]) {
                value = value !== 'false';
            }
            setArg(key, value, arg);
        }
        else if (/^--no-.+/.test(arg)) {
            var key = arg.match(/^--no-(.+)/)[1];
            setArg(key, false, arg);
        }
        else if (/^--.+/.test(arg)) {
            var key = arg.match(/^--(.+)/)[1];
            var next = args[i + 1];
            if (next !== undefined && !/^-/.test(next)
            && !flags.bools[key]
            && !flags.allBools
            && (aliases[key] ? !aliasIsBoolean(key) : true)) {
                setArg(key, next, arg);
                i++;
            }
            else if (/^(true|false)$/.test(next)) {
                setArg(key, next === 'true', arg);
                i++;
            }
            else {
                setArg(key, flags.strings[key] ? '' : true, arg);
            }
        }
        else if (/^-[^-]+/.test(arg)) {
            var letters = arg.slice(1,-1).split('');
            
            var broken = false;
            for (var j = 0; j < letters.length; j++) {
                var next = arg.slice(j+2);
                
                if (next === '-') {
                    setArg(letters[j], next, arg)
                    continue;
                }
                
                if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) {
                    setArg(letters[j], next.split('=')[1], arg);
                    broken = true;
                    break;
                }
                
                if (/[A-Za-z]/.test(letters[j])
                && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
                    setArg(letters[j], next, arg);
                    broken = true;
                    break;
                }
                
                if (letters[j+1] && letters[j+1].match(/\W/)) {
                    setArg(letters[j], arg.slice(j+2), arg);
                    broken = true;
                    break;
                }
                else {
                    setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
                }
            }
            
            var key = arg.slice(-1)[0];
            if (!broken && key !== '-') {
                if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
                && !flags.bools[key]
                && (aliases[key] ? !aliasIsBoolean(key) : true)) {
                    setArg(key, args[i+1], arg);
                    i++;
                }
                else if (args[i+1] && /^(true|false)$/.test(args[i+1])) {
                    setArg(key, args[i+1] === 'true', arg);
                    i++;
                }
                else {
                    setArg(key, flags.strings[key] ? '' : true, arg);
                }
            }
        }
        else {
            if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
                argv._.push(
                    flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
                );
            }
            if (opts.stopEarly) {
                argv._.push.apply(argv._, args.slice(i + 1));
                break;
            }
        }
    }
    
    Object.keys(defaults).forEach(function (key) {
        if (!hasKey(argv, key.split('.'))) {
            setKey(argv, key.split('.'), defaults[key]);
            
            (aliases[key] || []).forEach(function (x) {
                setKey(argv, x.split('.'), defaults[key]);
            });
        }
    });
    
    if (opts['--']) {
        argv['--'] = new Array();
        notFlags.forEach(function(key) {
            argv['--'].push(key);
        });
    }
    else {
        notFlags.forEach(function(key) {
            argv._.push(key);
        });
    }

    return argv;
};

function hasKey (obj, keys) {
    var o = obj;
    keys.slice(0,-1).forEach(function (key) {
        o = (o[key] || {});
    });

    var key = keys[keys.length - 1];
    return key in o;
}

function isNumber (x) {
    if (typeof x === 'number') return true;
    if (/^0x[0-9a-f]+$/i.test(x)) return true;
    return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
}

{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "deprecated": false,
  "description": "parse argument options",
  "devDependencies": {
    "covert": "^1.0.0",
    "tap": "~0.4.0",
    "tape": "^3.5.0"
  },
  "homepage": "https://github.com/substack/minimist",
  "license": "MIT",
  "main": "index.js",
  "name": "minimist",
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/minimist.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/6..latest",
      "ff/5",
      "firefox/latest",
      "chrome/10",
      "chrome/latest",
      "safari/5.1",
      "safari/latest",
      "opera/12"
    ]
  },
  "version": "1.2.5"
}(The MIT License)

Copyright (c) 2011-2017 JP Richardson

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
 merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "JP Richardson",
    "email": "jprichardson@gmail.com"
  },
  "dependencies": {
    "graceful-fs": "^4.1.2",
    "jsonfile": "^4.0.0",
    "universalify": "^0.1.0"
  },
  "deprecated": false,
  "description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as mkdir -p, cp -r, and rm -rf.",
  "devDependencies": {
    "coveralls": "^3.0.0",
    "istanbul": "^0.4.5",
    "klaw": "^2.1.1",
    "klaw-sync": "^3.0.2",
    "minimist": "^1.1.1",
    "mocha": "^5.0.5",
    "proxyquire": "^2.0.1",
    "read-dir-files": "^0.1.1",
    "rimraf": "^2.2.8",
    "secure-random": "^1.1.1",
    "semver": "^5.3.0",
    "standard": "^11.0.1",
    "standard-markdown": "^4.0.1"
  },
  "engines": {
    "node": ">=6 <7 || >=8"
  },
  "homepage": "https://github.com/jprichardson/node-fs-extra",
  "license": "MIT",
  "main": "./lib/index.js",
  "name": "fs-extra",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jprichardson/node-fs-extra.git"
  },
  "version": "7.0.1"
}'use strict'

module.exports = Object.assign(
  {},
  // Export promiseified graceful-fs:
  require('./fs'),
  // Export extra methods:
  require('./copy-sync'),
  require('./copy'),
  require('./empty'),
  require('./ensure'),
  require('./json'),
  require('./mkdirs'),
  require('./move-sync'),
  require('./move'),
  require('./output'),
  require('./path-exists'),
  require('./remove')
)

// Export fs.promises as a getter property so that we don't trigger
// ExperimentalWarning before fs.promises is actually accessed.
const fs = require('fs')
if (Object.getOwnPropertyDescriptor(fs, 'promises')) {
  Object.defineProperty(module.exports, 'promises', {
    get () { return fs.promises }
  })
}
'use strict'
/* eslint-disable node/no-deprecated-api */
module.exports = function (size) {
  if (typeof Buffer.allocUnsafe === 'function') {
    try {
      return Buffer.allocUnsafe(size)
    } catch (e) {
      return new Buffer(size)
    }
  }
  return new Buffer(size)
}
'use strict'

const fs = require('graceful-fs')
const os = require('os')
const path = require('path')

// HFS, ext{2,3}, FAT do not, Node.js v0.10 does not
function hasMillisResSync () {
  let tmpfile = path.join('millis-test-sync' + Date.now().toString() + Math.random().toString().slice(2))
  tmpfile = path.join(os.tmpdir(), tmpfile)

  // 550 millis past UNIX epoch
  const d = new Date(1435410243862)
  fs.writeFileSync(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141')
  const fd = fs.openSync(tmpfile, 'r+')
  fs.futimesSync(fd, d, d)
  fs.closeSync(fd)
  return fs.statSync(tmpfile).mtime > 1435410243000
}

function hasMillisRes (callback) {
  let tmpfile = path.join('millis-test' + Date.now().toString() + Math.random().toString().slice(2))
  tmpfile = path.join(os.tmpdir(), tmpfile)

  // 550 millis past UNIX epoch
  const d = new Date(1435410243862)
  fs.writeFile(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141', err => {
    if (err) return callback(err)
    fs.open(tmpfile, 'r+', (err, fd) => {
      if (err) return callback(err)
      fs.futimes(fd, d, d, err => {
        if (err) return callback(err)
        fs.close(fd, err => {
          if (err) return callback(err)
          fs.stat(tmpfile, (err, stats) => {
            if (err) return callback(err)
            callback(null, stats.mtime > 1435410243000)
          })
        })
      })
    })
  })
}

function timeRemoveMillis (timestamp) {
  if (typeof timestamp === 'number') {
    return Math.floor(timestamp / 1000) * 1000
  } else if (timestamp instanceof Date) {
    return new Date(Math.floor(timestamp.getTime() / 1000) * 1000)
  } else {
    throw new Error('fs-extra: timeRemoveMillis() unknown parameter type')
  }
}

function utimesMillis (path, atime, mtime, callback) {
  // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)
  fs.open(path, 'r+', (err, fd) => {
    if (err) return callback(err)
    fs.futimes(fd, atime, mtime, futimesErr => {
      fs.close(fd, closeErr => {
        if (callback) callback(futimesErr || closeErr)
      })
    })
  })
}

function utimesMillisSync (path, atime, mtime) {
  const fd = fs.openSync(path, 'r+')
  fs.futimesSync(fd, atime, mtime)
  return fs.closeSync(fd)
}

module.exports = {
  hasMillisRes,
  hasMillisResSync,
  timeRemoveMillis,
  utimesMillis,
  utimesMillisSync
}
'use strict'

const u = require('universalify').fromCallback
const rimraf = require('./rimraf')

module.exports = {
  remove: u(rimraf),
  removeSync: rimraf.sync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const assert = require('assert')

const isWindows = (process.platform === 'win32')

function defaults (options) {
  const methods = [
    'unlink',
    'chmod',
    'stat',
    'lstat',
    'rmdir',
    'readdir'
  ]
  methods.forEach(m => {
    options[m] = options[m] || fs[m]
    m = m + 'Sync'
    options[m] = options[m] || fs[m]
  })

  options.maxBusyTries = options.maxBusyTries || 3
}

function rimraf (p, options, cb) {
  let busyTries = 0

  if (typeof options === 'function') {
    cb = options
    options = {}
  }

  assert(p, 'rimraf: missing path')
  assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
  assert.strictEqual(typeof cb, 'function', 'rimraf: callback function required')
  assert(options, 'rimraf: invalid options argument provided')
  assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')

  defaults(options)

  rimraf_(p, options, function CB (er) {
    if (er) {
      if ((er.code === 'EBUSY' || er.code === 'ENOTEMPTY' || er.code === 'EPERM') &&
          busyTries < options.maxBusyTries) {
        busyTries++
        const time = busyTries * 100
        // try again, with the same exact callback as this one.
        return setTimeout(() => rimraf_(p, options, CB), time)
      }

      // already gone
      if (er.code === 'ENOENT') er = null
    }

    cb(er)
  })
}

// Two possible strategies.
// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
//
// Both result in an extra syscall when you guess wrong.  However, there
// are likely far more normal files in the world than directories.  This
// is based on the assumption that a the average number of files per
// directory is >= 1.
//
// If anyone ever complains about this, then I guess the strategy could
// be made configurable somehow.  But until then, YAGNI.
function rimraf_ (p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  // sunos lets the root user unlink directories, which is... weird.
  // so we have to lstat here and make sure it's not a dir.
  options.lstat(p, (er, st) => {
    if (er && er.code === 'ENOENT') {
      return cb(null)
    }

    // Windows can EPERM on stat.  Life is suffering.
    if (er && er.code === 'EPERM' && isWindows) {
      return fixWinEPERM(p, options, er, cb)
    }

    if (st && st.isDirectory()) {
      return rmdir(p, options, er, cb)
    }

    options.unlink(p, er => {
      if (er) {
        if (er.code === 'ENOENT') {
          return cb(null)
        }
        if (er.code === 'EPERM') {
          return (isWindows)
            ? fixWinEPERM(p, options, er, cb)
            : rmdir(p, options, er, cb)
        }
        if (er.code === 'EISDIR') {
          return rmdir(p, options, er, cb)
        }
      }
      return cb(er)
    })
  })
}

function fixWinEPERM (p, options, er, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')
  if (er) {
    assert(er instanceof Error)
  }

  options.chmod(p, 0o666, er2 => {
    if (er2) {
      cb(er2.code === 'ENOENT' ? null : er)
    } else {
      options.stat(p, (er3, stats) => {
        if (er3) {
          cb(er3.code === 'ENOENT' ? null : er)
        } else if (stats.isDirectory()) {
          rmdir(p, options, er, cb)
        } else {
          options.unlink(p, cb)
        }
      })
    }
  })
}

function fixWinEPERMSync (p, options, er) {
  let stats

  assert(p)
  assert(options)
  if (er) {
    assert(er instanceof Error)
  }

  try {
    options.chmodSync(p, 0o666)
  } catch (er2) {
    if (er2.code === 'ENOENT') {
      return
    } else {
      throw er
    }
  }

  try {
    stats = options.statSync(p)
  } catch (er3) {
    if (er3.code === 'ENOENT') {
      return
    } else {
      throw er
    }
  }

  if (stats.isDirectory()) {
    rmdirSync(p, options, er)
  } else {
    options.unlinkSync(p)
  }
}

function rmdir (p, options, originalEr, cb) {
  assert(p)
  assert(options)
  if (originalEr) {
    assert(originalEr instanceof Error)
  }
  assert(typeof cb === 'function')

  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
  // if we guessed wrong, and it's not a directory, then
  // raise the original error.
  options.rmdir(p, er => {
    if (er && (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM')) {
      rmkids(p, options, cb)
    } else if (er && er.code === 'ENOTDIR') {
      cb(originalEr)
    } else {
      cb(er)
    }
  })
}

function rmkids (p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  options.readdir(p, (er, files) => {
    if (er) return cb(er)

    let n = files.length
    let errState

    if (n === 0) return options.rmdir(p, cb)

    files.forEach(f => {
      rimraf(path.join(p, f), options, er => {
        if (errState) {
          return
        }
        if (er) return cb(errState = er)
        if (--n === 0) {
          options.rmdir(p, cb)
        }
      })
    })
  })
}

// this looks simpler, and is strictly *faster*, but will
// tie up the JavaScript thread and fail on excessively
// deep directory trees.
function rimrafSync (p, options) {
  let st

  options = options || {}
  defaults(options)

  assert(p, 'rimraf: missing path')
  assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
  assert(options, 'rimraf: missing options')
  assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')

  try {
    st = options.lstatSync(p)
  } catch (er) {
    if (er.code === 'ENOENT') {
      return
    }

    // Windows can EPERM on stat.  Life is suffering.
    if (er.code === 'EPERM' && isWindows) {
      fixWinEPERMSync(p, options, er)
    }
  }

  try {
    // sunos lets the root user unlink directories, which is... weird.
    if (st && st.isDirectory()) {
      rmdirSync(p, options, null)
    } else {
      options.unlinkSync(p)
    }
  } catch (er) {
    if (er.code === 'ENOENT') {
      return
    } else if (er.code === 'EPERM') {
      return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
    } else if (er.code !== 'EISDIR') {
      throw er
    }
    rmdirSync(p, options, er)
  }
}

function rmdirSync (p, options, originalEr) {
  assert(p)
  assert(options)
  if (originalEr) {
    assert(originalEr instanceof Error)
  }

  try {
    options.rmdirSync(p)
  } catch (er) {
    if (er.code === 'ENOTDIR') {
      throw originalEr
    } else if (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM') {
      rmkidsSync(p, options)
    } else if (er.code !== 'ENOENT') {
      throw er
    }
  }
}

function rmkidsSync (p, options) {
  assert(p)
  assert(options)
  options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))

  if (isWindows) {
    // We only end up here once we got ENOTEMPTY at least once, and
    // at this point, we are guaranteed to have removed all the kids.
    // So, we know that it won't be ENOENT or ENOTDIR or anything else.
    // try really hard to delete stuff on windows, because it has a
    // PROFOUNDLY annoying habit of not closing handles promptly when
    // files are deleted, resulting in spurious ENOTEMPTY errors.
    const startTime = Date.now()
    do {
      try {
        const ret = options.rmdirSync(p, options)
        return ret
      } catch (er) { }
    } while (Date.now() - startTime < 500) // give up after 500ms
  } else {
    const ret = options.rmdirSync(p, options)
    return ret
  }
}

module.exports = rimraf
rimraf.sync = rimrafSync
'use strict'
const u = require('universalify').fromPromise
const fs = require('../fs')

function pathExists (path) {
  return fs.access(path).then(() => true).catch(() => false)
}

module.exports = {
  pathExists: u(pathExists),
  pathExistsSync: fs.existsSync
}
'use strict'

const u = require('universalify').fromCallback
const fs = require('graceful-fs')
const path = require('path')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function outputFile (file, data, encoding, callback) {
  if (typeof encoding === 'function') {
    callback = encoding
    encoding = 'utf8'
  }

  const dir = path.dirname(file)
  pathExists(dir, (err, itDoes) => {
    if (err) return callback(err)
    if (itDoes) return fs.writeFile(file, data, encoding, callback)

    mkdir.mkdirs(dir, err => {
      if (err) return callback(err)

      fs.writeFile(file, data, encoding, callback)
    })
  })
}

function outputFileSync (file, ...args) {
  const dir = path.dirname(file)
  if (fs.existsSync(dir)) {
    return fs.writeFileSync(file, ...args)
  }
  mkdir.mkdirsSync(dir)
  fs.writeFileSync(file, ...args)
}

module.exports = {
  outputFile: u(outputFile),
  outputFileSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const copySync = require('../copy-sync').copySync
const removeSync = require('../remove').removeSync
const mkdirpSync = require('../mkdirs').mkdirsSync
const buffer = require('../util/buffer')

function moveSync (src, dest, options) {
  options = options || {}
  const overwrite = options.overwrite || options.clobber || false

  src = path.resolve(src)
  dest = path.resolve(dest)

  if (src === dest) return fs.accessSync(src)

  if (isSrcSubdir(src, dest)) throw new Error(`Cannot move '${src}' into itself '${dest}'.`)

  mkdirpSync(path.dirname(dest))
  tryRenameSync()

  function tryRenameSync () {
    if (overwrite) {
      try {
        return fs.renameSync(src, dest)
      } catch (err) {
        if (err.code === 'ENOTEMPTY' || err.code === 'EEXIST' || err.code === 'EPERM') {
          removeSync(dest)
          options.overwrite = false // just overwriteed it, no need to do it again
          return moveSync(src, dest, options)
        }

        if (err.code !== 'EXDEV') throw err
        return moveSyncAcrossDevice(src, dest, overwrite)
      }
    } else {
      try {
        fs.linkSync(src, dest)
        return fs.unlinkSync(src)
      } catch (err) {
        if (err.code === 'EXDEV' || err.code === 'EISDIR' || err.code === 'EPERM' || err.code === 'ENOTSUP') {
          return moveSyncAcrossDevice(src, dest, overwrite)
        }
        throw err
      }
    }
  }
}

function moveSyncAcrossDevice (src, dest, overwrite) {
  const stat = fs.statSync(src)

  if (stat.isDirectory()) {
    return moveDirSyncAcrossDevice(src, dest, overwrite)
  } else {
    return moveFileSyncAcrossDevice(src, dest, overwrite)
  }
}

function moveFileSyncAcrossDevice (src, dest, overwrite) {
  const BUF_LENGTH = 64 * 1024
  const _buff = buffer(BUF_LENGTH)

  const flags = overwrite ? 'w' : 'wx'

  const fdr = fs.openSync(src, 'r')
  const stat = fs.fstatSync(fdr)
  const fdw = fs.openSync(dest, flags, stat.mode)
  let pos = 0

  while (pos < stat.size) {
    const bytesRead = fs.readSync(fdr, _buff, 0, BUF_LENGTH, pos)
    fs.writeSync(fdw, _buff, 0, bytesRead)
    pos += bytesRead
  }

  fs.closeSync(fdr)
  fs.closeSync(fdw)
  return fs.unlinkSync(src)
}

function moveDirSyncAcrossDevice (src, dest, overwrite) {
  const options = {
    overwrite: false
  }

  if (overwrite) {
    removeSync(dest)
    tryCopySync()
  } else {
    tryCopySync()
  }

  function tryCopySync () {
    copySync(src, dest, options)
    return removeSync(src)
  }
}

// return true if dest is a subdir of src, otherwise false.
// extract dest base dir and check if that is the same as src basename
function isSrcSubdir (src, dest) {
  try {
    return fs.statSync(src).isDirectory() &&
           src !== dest &&
           dest.indexOf(src) > -1 &&
           dest.split(path.dirname(src) + path.sep)[1].split(path.sep)[0] === path.basename(src)
  } catch (e) {
    return false
  }
}

module.exports = {
  moveSync
}
'use strict'

const u = require('universalify').fromCallback
const fs = require('graceful-fs')
const path = require('path')
const copy = require('../copy').copy
const remove = require('../remove').remove
const mkdirp = require('../mkdirs').mkdirp
const pathExists = require('../path-exists').pathExists

function move (src, dest, opts, cb) {
  if (typeof opts === 'function') {
    cb = opts
    opts = {}
  }

  const overwrite = opts.overwrite || opts.clobber || false

  src = path.resolve(src)
  dest = path.resolve(dest)

  if (src === dest) return fs.access(src, cb)

  fs.stat(src, (err, st) => {
    if (err) return cb(err)

    if (st.isDirectory() && isSrcSubdir(src, dest)) {
      return cb(new Error(`Cannot move '${src}' to a subdirectory of itself, '${dest}'.`))
    }
    mkdirp(path.dirname(dest), err => {
      if (err) return cb(err)
      return doRename(src, dest, overwrite, cb)
    })
  })
}

function doRename (src, dest, overwrite, cb) {
  if (overwrite) {
    return remove(dest, err => {
      if (err) return cb(err)
      return rename(src, dest, overwrite, cb)
    })
  }
  pathExists(dest, (err, destExists) => {
    if (err) return cb(err)
    if (destExists) return cb(new Error('dest already exists.'))
    return rename(src, dest, overwrite, cb)
  })
}

function rename (src, dest, overwrite, cb) {
  fs.rename(src, dest, err => {
    if (!err) return cb()
    if (err.code !== 'EXDEV') return cb(err)
    return moveAcrossDevice(src, dest, overwrite, cb)
  })
}

function moveAcrossDevice (src, dest, overwrite, cb) {
  const opts = {
    overwrite,
    errorOnExist: true
  }

  copy(src, dest, opts, err => {
    if (err) return cb(err)
    return remove(src, cb)
  })
}

function isSrcSubdir (src, dest) {
  const srcArray = src.split(path.sep)
  const destArray = dest.split(path.sep)

  return srcArray.reduce((acc, current, i) => {
    return acc && destArray[i] === current
  }, true)
}

module.exports = {
  move: u(move)
}
'use strict'
const u = require('universalify').fromCallback
const mkdirs = u(require('./mkdirs'))
const mkdirsSync = require('./mkdirs-sync')

module.exports = {
  mkdirs,
  mkdirsSync,
  // alias
  mkdirp: mkdirs,
  mkdirpSync: mkdirsSync,
  ensureDir: mkdirs,
  ensureDirSync: mkdirsSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const invalidWin32Path = require('./win32').invalidWin32Path

const o777 = parseInt('0777', 8)

function mkdirsSync (p, opts, made) {
  if (!opts || typeof opts !== 'object') {
    opts = { mode: opts }
  }

  let mode = opts.mode
  const xfs = opts.fs || fs

  if (process.platform === 'win32' && invalidWin32Path(p)) {
    const errInval = new Error(p + ' contains invalid WIN32 path characters.')
    errInval.code = 'EINVAL'
    throw errInval
  }

  if (mode === undefined) {
    mode = o777 & (~process.umask())
  }
  if (!made) made = null

  p = path.resolve(p)

  try {
    xfs.mkdirSync(p, mode)
    made = made || p
  } catch (err0) {
    if (err0.code === 'ENOENT') {
      if (path.dirname(p) === p) throw err0
      made = mkdirsSync(path.dirname(p), opts, made)
      mkdirsSync(p, opts, made)
    } else {
      // In the case of any other error, just see if there's a dir there
      // already. If so, then hooray!  If not, then something is borked.
      let stat
      try {
        stat = xfs.statSync(p)
      } catch (err1) {
        throw err0
      }
      if (!stat.isDirectory()) throw err0
    }
  }

  return made
}

module.exports = mkdirsSync
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const invalidWin32Path = require('./win32').invalidWin32Path

const o777 = parseInt('0777', 8)

function mkdirs (p, opts, callback, made) {
  if (typeof opts === 'function') {
    callback = opts
    opts = {}
  } else if (!opts || typeof opts !== 'object') {
    opts = { mode: opts }
  }

  if (process.platform === 'win32' && invalidWin32Path(p)) {
    const errInval = new Error(p + ' contains invalid WIN32 path characters.')
    errInval.code = 'EINVAL'
    return callback(errInval)
  }

  let mode = opts.mode
  const xfs = opts.fs || fs

  if (mode === undefined) {
    mode = o777 & (~process.umask())
  }
  if (!made) made = null

  callback = callback || function () {}
  p = path.resolve(p)

  xfs.mkdir(p, mode, er => {
    if (!er) {
      made = made || p
      return callback(null, made)
    }
    switch (er.code) {
      case 'ENOENT':
        if (path.dirname(p) === p) return callback(er)
        mkdirs(path.dirname(p), opts, (er, made) => {
          if (er) callback(er, made)
          else mkdirs(p, opts, callback, made)
        })
        break

      // In the case of any other error, just see if there's a dir
      // there already.  If so, then hooray!  If not, then something
      // is borked.
      default:
        xfs.stat(p, (er2, stat) => {
          // if the stat fails, then that's super weird.
          // let the original error be the failure reason.
          if (er2 || !stat.isDirectory()) callback(er, made)
          else callback(null, made)
        })
        break
    }
  })
}

module.exports = mkdirs
'use strict'

const path = require('path')

// get drive on windows
function getRootPath (p) {
  p = path.normalize(path.resolve(p)).split(path.sep)
  if (p.length > 0) return p[0]
  return null
}

// http://stackoverflow.com/a/62888/10333 contains more accurate
// TODO: expand to include the rest
const INVALID_PATH_CHARS = /[<>:"|?*]/

function invalidWin32Path (p) {
  const rp = getRootPath(p)
  p = p.replace(rp, '')
  return INVALID_PATH_CHARS.test(p)
}

module.exports = {
  getRootPath,
  invalidWin32Path
}
'use strict'

const u = require('universalify').fromCallback
const jsonFile = require('./jsonfile')

jsonFile.outputJson = u(require('./output-json'))
jsonFile.outputJsonSync = require('./output-json-sync')
// aliases
jsonFile.outputJSON = jsonFile.outputJson
jsonFile.outputJSONSync = jsonFile.outputJsonSync
jsonFile.writeJSON = jsonFile.writeJson
jsonFile.writeJSONSync = jsonFile.writeJsonSync
jsonFile.readJSON = jsonFile.readJson
jsonFile.readJSONSync = jsonFile.readJsonSync

module.exports = jsonFile
'use strict'

const u = require('universalify').fromCallback
const jsonFile = require('jsonfile')

module.exports = {
  // jsonfile exports
  readJson: u(jsonFile.readFile),
  readJsonSync: jsonFile.readFileSync,
  writeJson: u(jsonFile.writeFile),
  writeJsonSync: jsonFile.writeFileSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdir = require('../mkdirs')
const jsonFile = require('./jsonfile')

function outputJsonSync (file, data, options) {
  const dir = path.dirname(file)

  if (!fs.existsSync(dir)) {
    mkdir.mkdirsSync(dir)
  }

  jsonFile.writeJsonSync(file, data, options)
}

module.exports = outputJsonSync
'use strict'

const path = require('path')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists
const jsonFile = require('./jsonfile')

function outputJson (file, data, options, callback) {
  if (typeof options === 'function') {
    callback = options
    options = {}
  }

  const dir = path.dirname(file)

  pathExists(dir, (err, itDoes) => {
    if (err) return callback(err)
    if (itDoes) return jsonFile.writeJson(file, data, options, callback)

    mkdir.mkdirs(dir, err => {
      if (err) return callback(err)
      jsonFile.writeJson(file, data, options, callback)
    })
  })
}

module.exports = outputJson
'use strict'
// This is adapted from https://github.com/normalize/mz
// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
const u = require('universalify').fromCallback
const fs = require('graceful-fs')

const api = [
  'access',
  'appendFile',
  'chmod',
  'chown',
  'close',
  'copyFile',
  'fchmod',
  'fchown',
  'fdatasync',
  'fstat',
  'fsync',
  'ftruncate',
  'futimes',
  'lchown',
  'lchmod',
  'link',
  'lstat',
  'mkdir',
  'mkdtemp',
  'open',
  'readFile',
  'readdir',
  'readlink',
  'realpath',
  'rename',
  'rmdir',
  'stat',
  'symlink',
  'truncate',
  'unlink',
  'utimes',
  'writeFile'
].filter(key => {
  // Some commands are not available on some systems. Ex:
  // fs.copyFile was added in Node.js v8.5.0
  // fs.mkdtemp was added in Node.js v5.10.0
  // fs.lchown is not available on at least some Linux
  return typeof fs[key] === 'function'
})

// Export all keys:
Object.keys(fs).forEach(key => {
  if (key === 'promises') {
    // fs.promises is a getter property that triggers ExperimentalWarning
    // Don't re-export it here, the getter is defined in "lib/index.js"
    return
  }
  exports[key] = fs[key]
})

// Universalify async methods:
api.forEach(method => {
  exports[method] = u(fs[method])
})

// We differ from mz/fs in that we still ship the old, broken, fs.exists()
// since we are a drop-in replacement for the native module
exports.exists = function (filename, callback) {
  if (typeof callback === 'function') {
    return fs.exists(filename, callback)
  }
  return new Promise(resolve => {
    return fs.exists(filename, resolve)
  })
}

// fs.read() & fs.write need special treatment due to multiple callback args

exports.read = function (fd, buffer, offset, length, position, callback) {
  if (typeof callback === 'function') {
    return fs.read(fd, buffer, offset, length, position, callback)
  }
  return new Promise((resolve, reject) => {
    fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
      if (err) return reject(err)
      resolve({ bytesRead, buffer })
    })
  })
}

// Function signature can be
// fs.write(fd, buffer[, offset[, length[, position]]], callback)
// OR
// fs.write(fd, string[, position[, encoding]], callback)
// We need to handle both cases, so we use ...args
exports.write = function (fd, buffer, ...args) {
  if (typeof args[args.length - 1] === 'function') {
    return fs.write(fd, buffer, ...args)
  }

  return new Promise((resolve, reject) => {
    fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {
      if (err) return reject(err)
      resolve({ bytesWritten, buffer })
    })
  })
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function createFile (file, callback) {
  function makeFile () {
    fs.writeFile(file, '', err => {
      if (err) return callback(err)
      callback()
    })
  }

  fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err
    if (!err && stats.isFile()) return callback()
    const dir = path.dirname(file)
    pathExists(dir, (err, dirExists) => {
      if (err) return callback(err)
      if (dirExists) return makeFile()
      mkdir.mkdirs(dir, err => {
        if (err) return callback(err)
        makeFile()
      })
    })
  })
}

function createFileSync (file) {
  let stats
  try {
    stats = fs.statSync(file)
  } catch (e) {}
  if (stats && stats.isFile()) return

  const dir = path.dirname(file)
  if (!fs.existsSync(dir)) {
    mkdir.mkdirsSync(dir)
  }

  fs.writeFileSync(file, '')
}

module.exports = {
  createFile: u(createFile),
  createFileSync
}
'use strict'

const file = require('./file')
const link = require('./link')
const symlink = require('./symlink')

module.exports = {
  // file
  createFile: file.createFile,
  createFileSync: file.createFileSync,
  ensureFile: file.createFile,
  ensureFileSync: file.createFileSync,
  // link
  createLink: link.createLink,
  createLinkSync: link.createLinkSync,
  ensureLink: link.createLink,
  ensureLinkSync: link.createLinkSync,
  // symlink
  createSymlink: symlink.createSymlink,
  createSymlinkSync: symlink.createSymlinkSync,
  ensureSymlink: symlink.createSymlink,
  ensureSymlinkSync: symlink.createSymlinkSync
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function createLink (srcpath, dstpath, callback) {
  function makeLink (srcpath, dstpath) {
    fs.link(srcpath, dstpath, err => {
      if (err) return callback(err)
      callback(null)
    })
  }

  pathExists(dstpath, (err, destinationExists) => {
    if (err) return callback(err)
    if (destinationExists) return callback(null)
    fs.lstat(srcpath, (err) => {
      if (err) {
        err.message = err.message.replace('lstat', 'ensureLink')
        return callback(err)
      }

      const dir = path.dirname(dstpath)
      pathExists(dir, (err, dirExists) => {
        if (err) return callback(err)
        if (dirExists) return makeLink(srcpath, dstpath)
        mkdir.mkdirs(dir, err => {
          if (err) return callback(err)
          makeLink(srcpath, dstpath)
        })
      })
    })
  })
}

function createLinkSync (srcpath, dstpath) {
  const destinationExists = fs.existsSync(dstpath)
  if (destinationExists) return undefined

  try {
    fs.lstatSync(srcpath)
  } catch (err) {
    err.message = err.message.replace('lstat', 'ensureLink')
    throw err
  }

  const dir = path.dirname(dstpath)
  const dirExists = fs.existsSync(dir)
  if (dirExists) return fs.linkSync(srcpath, dstpath)
  mkdir.mkdirsSync(dir)

  return fs.linkSync(srcpath, dstpath)
}

module.exports = {
  createLink: u(createLink),
  createLinkSync
}
'use strict'

const path = require('path')
const fs = require('graceful-fs')
const pathExists = require('../path-exists').pathExists

/**
 * Function that returns two types of paths, one relative to symlink, and one
 * relative to the current working directory. Checks if path is absolute or
 * relative. If the path is relative, this function checks if the path is
 * relative to symlink or relative to current working directory. This is an
 * initiative to find a smarter `srcpath` to supply when building symlinks.
 * This allows you to determine which path to use out of one of three possible
 * types of source paths. The first is an absolute path. This is detected by
 * `path.isAbsolute()`. When an absolute path is provided, it is checked to
 * see if it exists. If it does it's used, if not an error is returned
 * (callback)/ thrown (sync). The other two options for `srcpath` are a
 * relative url. By default Node's `fs.symlink` works by creating a symlink
 * using `dstpath` and expects the `srcpath` to be relative to the newly
 * created symlink. If you provide a `srcpath` that does not exist on the file
 * system it results in a broken symlink. To minimize this, the function
 * checks to see if the 'relative to symlink' source file exists, and if it
 * does it will use it. If it does not, it checks if there's a file that
 * exists that is relative to the current working directory, if does its used.
 * This preserves the expectations of the original fs.symlink spec and adds
 * the ability to pass in `relative to current working direcotry` paths.
 */

function symlinkPaths (srcpath, dstpath, callback) {
  if (path.isAbsolute(srcpath)) {
    return fs.lstat(srcpath, (err) => {
      if (err) {
        err.message = err.message.replace('lstat', 'ensureSymlink')
        return callback(err)
      }
      return callback(null, {
        'toCwd': srcpath,
        'toDst': srcpath
      })
    })
  } else {
    const dstdir = path.dirname(dstpath)
    const relativeToDst = path.join(dstdir, srcpath)
    return pathExists(relativeToDst, (err, exists) => {
      if (err) return callback(err)
      if (exists) {
        return callback(null, {
          'toCwd': relativeToDst,
          'toDst': srcpath
        })
      } else {
        return fs.lstat(srcpath, (err) => {
          if (err) {
            err.message = err.message.replace('lstat', 'ensureSymlink')
            return callback(err)
          }
          return callback(null, {
            'toCwd': srcpath,
            'toDst': path.relative(dstdir, srcpath)
          })
        })
      }
    })
  }
}

function symlinkPathsSync (srcpath, dstpath) {
  let exists
  if (path.isAbsolute(srcpath)) {
    exists = fs.existsSync(srcpath)
    if (!exists) throw new Error('absolute srcpath does not exist')
    return {
      'toCwd': srcpath,
      'toDst': srcpath
    }
  } else {
    const dstdir = path.dirname(dstpath)
    const relativeToDst = path.join(dstdir, srcpath)
    exists = fs.existsSync(relativeToDst)
    if (exists) {
      return {
        'toCwd': relativeToDst,
        'toDst': srcpath
      }
    } else {
      exists = fs.existsSync(srcpath)
      if (!exists) throw new Error('relative srcpath does not exist')
      return {
        'toCwd': srcpath,
        'toDst': path.relative(dstdir, srcpath)
      }
    }
  }
}

module.exports = {
  symlinkPaths,
  symlinkPathsSync
}
'use strict'

const fs = require('graceful-fs')

function symlinkType (srcpath, type, callback) {
  callback = (typeof type === 'function') ? type : callback
  type = (typeof type === 'function') ? false : type
  if (type) return callback(null, type)
  fs.lstat(srcpath, (err, stats) => {
    if (err) return callback(null, 'file')
    type = (stats && stats.isDirectory()) ? 'dir' : 'file'
    callback(null, type)
  })
}

function symlinkTypeSync (srcpath, type) {
  let stats

  if (type) return type
  try {
    stats = fs.lstatSync(srcpath)
  } catch (e) {
    return 'file'
  }
  return (stats && stats.isDirectory()) ? 'dir' : 'file'
}

module.exports = {
  symlinkType,
  symlinkTypeSync
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const _mkdirs = require('../mkdirs')
const mkdirs = _mkdirs.mkdirs
const mkdirsSync = _mkdirs.mkdirsSync

const _symlinkPaths = require('./symlink-paths')
const symlinkPaths = _symlinkPaths.symlinkPaths
const symlinkPathsSync = _symlinkPaths.symlinkPathsSync

const _symlinkType = require('./symlink-type')
const symlinkType = _symlinkType.symlinkType
const symlinkTypeSync = _symlinkType.symlinkTypeSync

const pathExists = require('../path-exists').pathExists

function createSymlink (srcpath, dstpath, type, callback) {
  callback = (typeof type === 'function') ? type : callback
  type = (typeof type === 'function') ? false : type

  pathExists(dstpath, (err, destinationExists) => {
    if (err) return callback(err)
    if (destinationExists) return callback(null)
    symlinkPaths(srcpath, dstpath, (err, relative) => {
      if (err) return callback(err)
      srcpath = relative.toDst
      symlinkType(relative.toCwd, type, (err, type) => {
        if (err) return callback(err)
        const dir = path.dirname(dstpath)
        pathExists(dir, (err, dirExists) => {
          if (err) return callback(err)
          if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
          mkdirs(dir, err => {
            if (err) return callback(err)
            fs.symlink(srcpath, dstpath, type, callback)
          })
        })
      })
    })
  })
}

function createSymlinkSync (srcpath, dstpath, type) {
  const destinationExists = fs.existsSync(dstpath)
  if (destinationExists) return undefined

  const relative = symlinkPathsSync(srcpath, dstpath)
  srcpath = relative.toDst
  type = symlinkTypeSync(relative.toCwd, type)
  const dir = path.dirname(dstpath)
  const exists = fs.existsSync(dir)
  if (exists) return fs.symlinkSync(srcpath, dstpath, type)
  mkdirsSync(dir)
  return fs.symlinkSync(srcpath, dstpath, type)
}

module.exports = {
  createSymlink: u(createSymlink),
  createSymlinkSync
}
'use strict'

const u = require('universalify').fromCallback
const fs = require('fs')
const path = require('path')
const mkdir = require('../mkdirs')
const remove = require('../remove')

const emptyDir = u(function emptyDir (dir, callback) {
  callback = callback || function () {}
  fs.readdir(dir, (err, items) => {
    if (err) return mkdir.mkdirs(dir, callback)

    items = items.map(item => path.join(dir, item))

    deleteItem()

    function deleteItem () {
      const item = items.pop()
      if (!item) return callback()
      remove.remove(item, err => {
        if (err) return callback(err)
        deleteItem()
      })
    }
  })
})

function emptyDirSync (dir) {
  let items
  try {
    items = fs.readdirSync(dir)
  } catch (err) {
    return mkdir.mkdirsSync(dir)
  }

  items.forEach(item => {
    item = path.join(dir, item)
    remove.removeSync(item)
  })
}

module.exports = {
  emptyDirSync,
  emptydirSync: emptyDirSync,
  emptyDir,
  emptydir: emptyDir
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdirpSync = require('../mkdirs').mkdirsSync
const utimesSync = require('../util/utimes.js').utimesMillisSync

const notExist = Symbol('notExist')

function copySync (src, dest, opts) {
  if (typeof opts === 'function') {
    opts = {filter: opts}
  }

  opts = opts || {}
  opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
  opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber

  // Warn about using preserveTimestamps on 32-bit node
  if (opts.preserveTimestamps && process.arch === 'ia32') {
    console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
    see https://github.com/jprichardson/node-fs-extra/issues/269`)
  }

  const destStat = checkPaths(src, dest)

  if (opts.filter && !opts.filter(src, dest)) return

  const destParent = path.dirname(dest)
  if (!fs.existsSync(destParent)) mkdirpSync(destParent)
  return startCopy(destStat, src, dest, opts)
}

function startCopy (destStat, src, dest, opts) {
  if (opts.filter && !opts.filter(src, dest)) return
  return getStats(destStat, src, dest, opts)
}

function getStats (destStat, src, dest, opts) {
  const statSync = opts.dereference ? fs.statSync : fs.lstatSync
  const srcStat = statSync(src)

  if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts)
  else if (srcStat.isFile() ||
           srcStat.isCharacterDevice() ||
           srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts)
  else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts)
}

function onFile (srcStat, destStat, src, dest, opts) {
  if (destStat === notExist) return copyFile(srcStat, src, dest, opts)
  return mayCopyFile(srcStat, src, dest, opts)
}

function mayCopyFile (srcStat, src, dest, opts) {
  if (opts.overwrite) {
    fs.unlinkSync(dest)
    return copyFile(srcStat, src, dest, opts)
  } else if (opts.errorOnExist) {
    throw new Error(`'${dest}' already exists`)
  }
}

function copyFile (srcStat, src, dest, opts) {
  if (typeof fs.copyFileSync === 'function') {
    fs.copyFileSync(src, dest)
    fs.chmodSync(dest, srcStat.mode)
    if (opts.preserveTimestamps) {
      return utimesSync(dest, srcStat.atime, srcStat.mtime)
    }
    return
  }
  return copyFileFallback(srcStat, src, dest, opts)
}

function copyFileFallback (srcStat, src, dest, opts) {
  const BUF_LENGTH = 64 * 1024
  const _buff = require('../util/buffer')(BUF_LENGTH)

  const fdr = fs.openSync(src, 'r')
  const fdw = fs.openSync(dest, 'w', srcStat.mode)
  let pos = 0

  while (pos < srcStat.size) {
    const bytesRead = fs.readSync(fdr, _buff, 0, BUF_LENGTH, pos)
    fs.writeSync(fdw, _buff, 0, bytesRead)
    pos += bytesRead
  }

  if (opts.preserveTimestamps) fs.futimesSync(fdw, srcStat.atime, srcStat.mtime)

  fs.closeSync(fdr)
  fs.closeSync(fdw)
}

function onDir (srcStat, destStat, src, dest, opts) {
  if (destStat === notExist) return mkDirAndCopy(srcStat, src, dest, opts)
  if (destStat && !destStat.isDirectory()) {
    throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`)
  }
  return copyDir(src, dest, opts)
}

function mkDirAndCopy (srcStat, src, dest, opts) {
  fs.mkdirSync(dest)
  copyDir(src, dest, opts)
  return fs.chmodSync(dest, srcStat.mode)
}

function copyDir (src, dest, opts) {
  fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts))
}

function copyDirItem (item, src, dest, opts) {
  const srcItem = path.join(src, item)
  const destItem = path.join(dest, item)
  const destStat = checkPaths(srcItem, destItem)
  return startCopy(destStat, srcItem, destItem, opts)
}

function onLink (destStat, src, dest, opts) {
  let resolvedSrc = fs.readlinkSync(src)

  if (opts.dereference) {
    resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
  }

  if (destStat === notExist) {
    return fs.symlinkSync(resolvedSrc, dest)
  } else {
    let resolvedDest
    try {
      resolvedDest = fs.readlinkSync(dest)
    } catch (err) {
      // dest exists and is a regular file or directory,
      // Windows may throw UNKNOWN error. If dest already exists,
      // fs throws error anyway, so no need to guard against it here.
      if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest)
      throw err
    }
    if (opts.dereference) {
      resolvedDest = path.resolve(process.cwd(), resolvedDest)
    }
    if (isSrcSubdir(resolvedSrc, resolvedDest)) {
      throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`)
    }

    // prevent copy if src is a subdir of dest since unlinking
    // dest in this case would result in removing src contents
    // and therefore a broken symlink would be created.
    if (fs.statSync(dest).isDirectory() && isSrcSubdir(resolvedDest, resolvedSrc)) {
      throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)
    }
    return copyLink(resolvedSrc, dest)
  }
}

function copyLink (resolvedSrc, dest) {
  fs.unlinkSync(dest)
  return fs.symlinkSync(resolvedSrc, dest)
}

// return true if dest is a subdir of src, otherwise false.
function isSrcSubdir (src, dest) {
  const srcArray = path.resolve(src).split(path.sep)
  const destArray = path.resolve(dest).split(path.sep)
  return srcArray.reduce((acc, current, i) => acc && destArray[i] === current, true)
}

function checkStats (src, dest) {
  const srcStat = fs.statSync(src)
  let destStat
  try {
    destStat = fs.statSync(dest)
  } catch (err) {
    if (err.code === 'ENOENT') return {srcStat, destStat: notExist}
    throw err
  }
  return {srcStat, destStat}
}

function checkPaths (src, dest) {
  const {srcStat, destStat} = checkStats(src, dest)
  if (destStat.ino && destStat.ino === srcStat.ino) {
    throw new Error('Source and destination must not be the same.')
  }
  if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
    throw new Error(`Cannot copy '${src}' to a subdirectory of itself, '${dest}'.`)
  }
  return destStat
}

module.exports = copySync
'use strict'

module.exports = {
  copySync: require('./copy-sync')
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdirp = require('../mkdirs').mkdirs
const pathExists = require('../path-exists').pathExists
const utimes = require('../util/utimes').utimesMillis

const notExist = Symbol('notExist')

function copy (src, dest, opts, cb) {
  if (typeof opts === 'function' && !cb) {
    cb = opts
    opts = {}
  } else if (typeof opts === 'function') {
    opts = {filter: opts}
  }

  cb = cb || function () {}
  opts = opts || {}

  opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
  opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber

  // Warn about using preserveTimestamps on 32-bit node
  if (opts.preserveTimestamps && process.arch === 'ia32') {
    console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
    see https://github.com/jprichardson/node-fs-extra/issues/269`)
  }

  checkPaths(src, dest, (err, destStat) => {
    if (err) return cb(err)
    if (opts.filter) return handleFilter(checkParentDir, destStat, src, dest, opts, cb)
    return checkParentDir(destStat, src, dest, opts, cb)
  })
}

function checkParentDir (destStat, src, dest, opts, cb) {
  const destParent = path.dirname(dest)
  pathExists(destParent, (err, dirExists) => {
    if (err) return cb(err)
    if (dirExists) return startCopy(destStat, src, dest, opts, cb)
    mkdirp(destParent, err => {
      if (err) return cb(err)
      return startCopy(destStat, src, dest, opts, cb)
    })
  })
}

function handleFilter (onInclude, destStat, src, dest, opts, cb) {
  Promise.resolve(opts.filter(src, dest)).then(include => {
    if (include) {
      if (destStat) return onInclude(destStat, src, dest, opts, cb)
      return onInclude(src, dest, opts, cb)
    }
    return cb()
  }, error => cb(error))
}

function startCopy (destStat, src, dest, opts, cb) {
  if (opts.filter) return handleFilter(getStats, destStat, src, dest, opts, cb)
  return getStats(destStat, src, dest, opts, cb)
}

function getStats (destStat, src, dest, opts, cb) {
  const stat = opts.dereference ? fs.stat : fs.lstat
  stat(src, (err, srcStat) => {
    if (err) return cb(err)

    if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts, cb)
    else if (srcStat.isFile() ||
             srcStat.isCharacterDevice() ||
             srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts, cb)
    else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts, cb)
  })
}

function onFile (srcStat, destStat, src, dest, opts, cb) {
  if (destStat === notExist) return copyFile(srcStat, src, dest, opts, cb)
  return mayCopyFile(srcStat, src, dest, opts, cb)
}

function mayCopyFile (srcStat, src, dest, opts, cb) {
  if (opts.overwrite) {
    fs.unlink(dest, err => {
      if (err) return cb(err)
      return copyFile(srcStat, src, dest, opts, cb)
    })
  } else if (opts.errorOnExist) {
    return cb(new Error(`'${dest}' already exists`))
  } else return cb()
}

function copyFile (srcStat, src, dest, opts, cb) {
  if (typeof fs.copyFile === 'function') {
    return fs.copyFile(src, dest, err => {
      if (err) return cb(err)
      return setDestModeAndTimestamps(srcStat, dest, opts, cb)
    })
  }
  return copyFileFallback(srcStat, src, dest, opts, cb)
}

function copyFileFallback (srcStat, src, dest, opts, cb) {
  const rs = fs.createReadStream(src)
  rs.on('error', err => cb(err)).once('open', () => {
    const ws = fs.createWriteStream(dest, { mode: srcStat.mode })
    ws.on('error', err => cb(err))
      .on('open', () => rs.pipe(ws))
      .once('close', () => setDestModeAndTimestamps(srcStat, dest, opts, cb))
  })
}

function setDestModeAndTimestamps (srcStat, dest, opts, cb) {
  fs.chmod(dest, srcStat.mode, err => {
    if (err) return cb(err)
    if (opts.preserveTimestamps) {
      return utimes(dest, srcStat.atime, srcStat.mtime, cb)
    }
    return cb()
  })
}

function onDir (srcStat, destStat, src, dest, opts, cb) {
  if (destStat === notExist) return mkDirAndCopy(srcStat, src, dest, opts, cb)
  if (destStat && !destStat.isDirectory()) {
    return cb(new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`))
  }
  return copyDir(src, dest, opts, cb)
}

function mkDirAndCopy (srcStat, src, dest, opts, cb) {
  fs.mkdir(dest, err => {
    if (err) return cb(err)
    copyDir(src, dest, opts, err => {
      if (err) return cb(err)
      return fs.chmod(dest, srcStat.mode, cb)
    })
  })
}

function copyDir (src, dest, opts, cb) {
  fs.readdir(src, (err, items) => {
    if (err) return cb(err)
    return copyDirItems(items, src, dest, opts, cb)
  })
}

function copyDirItems (items, src, dest, opts, cb) {
  const item = items.pop()
  if (!item) return cb()
  return copyDirItem(items, item, src, dest, opts, cb)
}

function copyDirItem (items, item, src, dest, opts, cb) {
  const srcItem = path.join(src, item)
  const destItem = path.join(dest, item)
  checkPaths(srcItem, destItem, (err, destStat) => {
    if (err) return cb(err)
    startCopy(destStat, srcItem, destItem, opts, err => {
      if (err) return cb(err)
      return copyDirItems(items, src, dest, opts, cb)
    })
  })
}

function onLink (destStat, src, dest, opts, cb) {
  fs.readlink(src, (err, resolvedSrc) => {
    if (err) return cb(err)

    if (opts.dereference) {
      resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
    }

    if (destStat === notExist) {
      return fs.symlink(resolvedSrc, dest, cb)
    } else {
      fs.readlink(dest, (err, resolvedDest) => {
        if (err) {
          // dest exists and is a regular file or directory,
          // Windows may throw UNKNOWN error. If dest already exists,
          // fs throws error anyway, so no need to guard against it here.
          if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest, cb)
          return cb(err)
        }
        if (opts.dereference) {
          resolvedDest = path.resolve(process.cwd(), resolvedDest)
        }
        if (isSrcSubdir(resolvedSrc, resolvedDest)) {
          return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))
        }

        // do not copy if src is a subdir of dest since unlinking
        // dest in this case would result in removing src contents
        // and therefore a broken symlink would be created.
        if (destStat.isDirectory() && isSrcSubdir(resolvedDest, resolvedSrc)) {
          return cb(new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`))
        }
        return copyLink(resolvedSrc, dest, cb)
      })
    }
  })
}

function copyLink (resolvedSrc, dest, cb) {
  fs.unlink(dest, err => {
    if (err) return cb(err)
    return fs.symlink(resolvedSrc, dest, cb)
  })
}

// return true if dest is a subdir of src, otherwise false.
function isSrcSubdir (src, dest) {
  const srcArray = path.resolve(src).split(path.sep)
  const destArray = path.resolve(dest).split(path.sep)
  return srcArray.reduce((acc, current, i) => acc && destArray[i] === current, true)
}

function checkStats (src, dest, cb) {
  fs.stat(src, (err, srcStat) => {
    if (err) return cb(err)
    fs.stat(dest, (err, destStat) => {
      if (err) {
        if (err.code === 'ENOENT') return cb(null, {srcStat, destStat: notExist})
        return cb(err)
      }
      return cb(null, {srcStat, destStat})
    })
  })
}

function checkPaths (src, dest, cb) {
  checkStats(src, dest, (err, stats) => {
    if (err) return cb(err)
    const {srcStat, destStat} = stats
    if (destStat.ino && destStat.ino === srcStat.ino) {
      return cb(new Error('Source and destination must not be the same.'))
    }
    if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
      return cb(new Error(`Cannot copy '${src}' to a subdirectory of itself, '${dest}'.`))
    }
    return cb(null, destStat)
  })
}

module.exports = copy
'use strict'

const u = require('universalify').fromCallback
module.exports = {
  copy: u(require('./copy'))
}
The MIT License (MIT)

Copyright (c) 2017 Vladimir Krivosheev

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
"use strict"

const fsExtra = require("fs-extra")
const Promise = require('bluebird-lst')

function makeFs(Promise) {
  const fs = Object.create(null)

  for (const methodName of Object.keys(fsExtra)) {
    const method = fsExtra[methodName]
    if (methodName === "createFile" || methodName === "mkdirp") {
      continue
    }

    if (typeof method !== "function" ||
        methodName.endsWith("Sync") ||
        methodName.endsWith("Stream") ||
        methodName.match(/^[A-Z]/) ||
        methodName === "exists" ||
        methodName === "watch" ||
        methodName === "watchFile" ||
        methodName === "unwatchFile") {
      fs[methodName] = method
    }
    else {
      fs[methodName] = Promise.promisify(method)
    }
  }

  fs.createFile = fs.ensureFile
  fs.mkdirp = fs.mkdirs
  return fs
}

module.exports = makeFs(Promise){
  "dependencies": {
    "bluebird-lst": "^1.0.7",
    "fs-extra": "^7.0.1"
  },
  "deprecated": false,
  "description": "fs-extra module promisified with bluebird",
  "engines": {
    "node": ">=6 <7 || >=8"
  },
  "files": [
    "index.*"
  ],
  "homepage": "https://github.com/develar/fs-extra-p#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "fs-extra-p",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/develar/fs-extra-p.git"
  },
  "version": "7.0.1"
}MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Type check values: `is.string('ðŸ¦„') //=> true`",
  "devDependencies": {
    "@sindresorhus/tsconfig": "^0.1.0",
    "@types/jsdom": "^11.12.0",
    "@types/node": "^10.12.10",
    "@types/tempy": "^0.2.0",
    "@types/zen-observable": "^0.8.0",
    "ava": "^0.25.0",
    "del-cli": "^1.1.0",
    "jsdom": "^11.6.2",
    "rxjs": "^6.3.3",
    "tempy": "^0.2.1",
    "tslint": "^5.9.1",
    "tslint-xo": "^0.10.0",
    "typescript": "^3.2.1",
    "zen-observable": "^0.8.8"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "dist"
  ],
  "homepage": "https://github.com/sindresorhus/is#readme",
  "license": "MIT",
  "main": "dist/index.js",
  "name": "@sindresorhus/is",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is.git"
  },
  "types": "dist/index.d.ts",
  "version": "0.14.0"
}"use strict";
/// <reference lib="es2016"/>
/// <reference lib="es2017.sharedmemory"/>
/// <reference lib="esnext.asynciterable"/>
/// <reference lib="dom"/>
Object.defineProperty(exports, "__esModule", { value: true });
// TODO: Use the `URL` global when targeting Node.js 10
// tslint:disable-next-line
const URLGlobal = typeof URL === 'undefined' ? require('url').URL : URL;
const toString = Object.prototype.toString;
const isOfType = (type) => (value) => typeof value === type;
const isBuffer = (input) => !is.nullOrUndefined(input) && !is.nullOrUndefined(input.constructor) && is.function_(input.constructor.isBuffer) && input.constructor.isBuffer(input);
const getObjectType = (value) => {
    const objectName = toString.call(value).slice(8, -1);
    if (objectName) {
        return objectName;
    }
    return null;
};
const isObjectOfType = (type) => (value) => getObjectType(value) === type;
function is(value) {
    switch (value) {
        case null:
            return "null" /* null */;
        case true:
        case false:
            return "boolean" /* boolean */;
        default:
    }
    switch (typeof value) {
        case 'undefined':
            return "undefined" /* undefined */;
        case 'string':
            return "string" /* string */;
        case 'number':
            return "number" /* number */;
        case 'symbol':
            return "symbol" /* symbol */;
        default:
    }
    if (is.function_(value)) {
        return "Function" /* Function */;
    }
    if (is.observable(value)) {
        return "Observable" /* Observable */;
    }
    if (Array.isArray(value)) {
        return "Array" /* Array */;
    }
    if (isBuffer(value)) {
        return "Buffer" /* Buffer */;
    }
    const tagType = getObjectType(value);
    if (tagType) {
        return tagType;
    }
    if (value instanceof String || value instanceof Boolean || value instanceof Number) {
        throw new TypeError('Please don\'t use object wrappers for primitive types');
    }
    return "Object" /* Object */;
}
(function (is) {
    // tslint:disable-next-line:strict-type-predicates
    const isObject = (value) => typeof value === 'object';
    // tslint:disable:variable-name
    is.undefined = isOfType('undefined');
    is.string = isOfType('string');
    is.number = isOfType('number');
    is.function_ = isOfType('function');
    // tslint:disable-next-line:strict-type-predicates
    is.null_ = (value) => value === null;
    is.class_ = (value) => is.function_(value) && value.toString().startsWith('class ');
    is.boolean = (value) => value === true || value === false;
    is.symbol = isOfType('symbol');
    // tslint:enable:variable-name
    is.numericString = (value) => is.string(value) && value.length > 0 && !Number.isNaN(Number(value));
    is.array = Array.isArray;
    is.buffer = isBuffer;
    is.nullOrUndefined = (value) => is.null_(value) || is.undefined(value);
    is.object = (value) => !is.nullOrUndefined(value) && (is.function_(value) || isObject(value));
    is.iterable = (value) => !is.nullOrUndefined(value) && is.function_(value[Symbol.iterator]);
    is.asyncIterable = (value) => !is.nullOrUndefined(value) && is.function_(value[Symbol.asyncIterator]);
    is.generator = (value) => is.iterable(value) && is.function_(value.next) && is.function_(value.throw);
    is.nativePromise = (value) => isObjectOfType("Promise" /* Promise */)(value);
    const hasPromiseAPI = (value) => !is.null_(value) &&
        isObject(value) &&
        is.function_(value.then) &&
        is.function_(value.catch);
    is.promise = (value) => is.nativePromise(value) || hasPromiseAPI(value);
    is.generatorFunction = isObjectOfType("GeneratorFunction" /* GeneratorFunction */);
    is.asyncFunction = isObjectOfType("AsyncFunction" /* AsyncFunction */);
    is.boundFunction = (value) => is.function_(value) && !value.hasOwnProperty('prototype');
    is.regExp = isObjectOfType("RegExp" /* RegExp */);
    is.date = isObjectOfType("Date" /* Date */);
    is.error = isObjectOfType("Error" /* Error */);
    is.map = (value) => isObjectOfType("Map" /* Map */)(value);
    is.set = (value) => isObjectOfType("Set" /* Set */)(value);
    is.weakMap = (value) => isObjectOfType("WeakMap" /* WeakMap */)(value);
    is.weakSet = (value) => isObjectOfType("WeakSet" /* WeakSet */)(value);
    is.int8Array = isObjectOfType("Int8Array" /* Int8Array */);
    is.uint8Array = isObjectOfType("Uint8Array" /* Uint8Array */);
    is.uint8ClampedArray = isObjectOfType("Uint8ClampedArray" /* Uint8ClampedArray */);
    is.int16Array = isObjectOfType("Int16Array" /* Int16Array */);
    is.uint16Array = isObjectOfType("Uint16Array" /* Uint16Array */);
    is.int32Array = isObjectOfType("Int32Array" /* Int32Array */);
    is.uint32Array = isObjectOfType("Uint32Array" /* Uint32Array */);
    is.float32Array = isObjectOfType("Float32Array" /* Float32Array */);
    is.float64Array = isObjectOfType("Float64Array" /* Float64Array */);
    is.arrayBuffer = isObjectOfType("ArrayBuffer" /* ArrayBuffer */);
    is.sharedArrayBuffer = isObjectOfType("SharedArrayBuffer" /* SharedArrayBuffer */);
    is.dataView = isObjectOfType("DataView" /* DataView */);
    is.directInstanceOf = (instance, klass) => Object.getPrototypeOf(instance) === klass.prototype;
    is.urlInstance = (value) => isObjectOfType("URL" /* URL */)(value);
    is.urlString = (value) => {
        if (!is.string(value)) {
            return false;
        }
        try {
            new URLGlobal(value); // tslint:disable-line no-unused-expression
            return true;
        }
        catch (_a) {
            return false;
        }
    };
    is.truthy = (value) => Boolean(value);
    is.falsy = (value) => !value;
    is.nan = (value) => Number.isNaN(value);
    const primitiveTypes = new Set([
        'undefined',
        'string',
        'number',
        'boolean',
        'symbol'
    ]);
    is.primitive = (value) => is.null_(value) || primitiveTypes.has(typeof value);
    is.integer = (value) => Number.isInteger(value);
    is.safeInteger = (value) => Number.isSafeInteger(value);
    is.plainObject = (value) => {
        // From: https://github.com/sindresorhus/is-plain-obj/blob/master/index.js
        let prototype;
        return getObjectType(value) === "Object" /* Object */ &&
            (prototype = Object.getPrototypeOf(value), prototype === null || // tslint:disable-line:ban-comma-operator
                prototype === Object.getPrototypeOf({}));
    };
    const typedArrayTypes = new Set([
        "Int8Array" /* Int8Array */,
        "Uint8Array" /* Uint8Array */,
        "Uint8ClampedArray" /* Uint8ClampedArray */,
        "Int16Array" /* Int16Array */,
        "Uint16Array" /* Uint16Array */,
        "Int32Array" /* Int32Array */,
        "Uint32Array" /* Uint32Array */,
        "Float32Array" /* Float32Array */,
        "Float64Array" /* Float64Array */
    ]);
    is.typedArray = (value) => {
        const objectType = getObjectType(value);
        if (objectType === null) {
            return false;
        }
        return typedArrayTypes.has(objectType);
    };
    const isValidLength = (value) => is.safeInteger(value) && value > -1;
    is.arrayLike = (value) => !is.nullOrUndefined(value) && !is.function_(value) && isValidLength(value.length);
    is.inRange = (value, range) => {
        if (is.number(range)) {
            return value >= Math.min(0, range) && value <= Math.max(range, 0);
        }
        if (is.array(range) && range.length === 2) {
            return value >= Math.min(...range) && value <= Math.max(...range);
        }
        throw new TypeError(`Invalid range: ${JSON.stringify(range)}`);
    };
    const NODE_TYPE_ELEMENT = 1;
    const DOM_PROPERTIES_TO_CHECK = [
        'innerHTML',
        'ownerDocument',
        'style',
        'attributes',
        'nodeValue'
    ];
    is.domElement = (value) => is.object(value) && value.nodeType === NODE_TYPE_ELEMENT && is.string(value.nodeName) &&
        !is.plainObject(value) && DOM_PROPERTIES_TO_CHECK.every(property => property in value);
    is.observable = (value) => {
        if (!value) {
            return false;
        }
        if (value[Symbol.observable] && value === value[Symbol.observable]()) {
            return true;
        }
        if (value['@@observable'] && value === value['@@observable']()) {
            return true;
        }
        return false;
    };
    is.nodeStream = (value) => !is.nullOrUndefined(value) && isObject(value) && is.function_(value.pipe) && !is.observable(value);
    is.infinite = (value) => value === Infinity || value === -Infinity;
    const isAbsoluteMod2 = (rem) => (value) => is.integer(value) && Math.abs(value % 2) === rem;
    is.even = isAbsoluteMod2(0);
    is.odd = isAbsoluteMod2(1);
    const isWhiteSpaceString = (value) => is.string(value) && /\S/.test(value) === false;
    is.emptyArray = (value) => is.array(value) && value.length === 0;
    is.nonEmptyArray = (value) => is.array(value) && value.length > 0;
    is.emptyString = (value) => is.string(value) && value.length === 0;
    is.nonEmptyString = (value) => is.string(value) && value.length > 0;
    is.emptyStringOrWhitespace = (value) => is.emptyString(value) || isWhiteSpaceString(value);
    is.emptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length === 0;
    is.nonEmptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length > 0;
    is.emptySet = (value) => is.set(value) && value.size === 0;
    is.nonEmptySet = (value) => is.set(value) && value.size > 0;
    is.emptyMap = (value) => is.map(value) && value.size === 0;
    is.nonEmptyMap = (value) => is.map(value) && value.size > 0;
    const predicateOnArray = (method, predicate, values) => {
        if (is.function_(predicate) === false) {
            throw new TypeError(`Invalid predicate: ${JSON.stringify(predicate)}`);
        }
        if (values.length === 0) {
            throw new TypeError('Invalid number of values');
        }
        return method.call(values, predicate);
    };
    // tslint:disable variable-name
    is.any = (predicate, ...values) => predicateOnArray(Array.prototype.some, predicate, values);
    is.all = (predicate, ...values) => predicateOnArray(Array.prototype.every, predicate, values);
    // tslint:enable variable-name
})(is || (is = {}));
// Some few keywords are reserved, but we'll populate them for Node.js users
// See https://github.com/Microsoft/TypeScript/issues/2536
Object.defineProperties(is, {
    class: {
        value: is.class_
    },
    function: {
        value: is.function_
    },
    null: {
        value: is.null_
    }
});
exports.default = is;
// For CommonJS default export support
module.exports = is;
module.exports.default = is;
//# sourceMappingURL=index.js.map{"version":3,"file":"index.js","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"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"}MIT License

Copyright (c) 2018 Szymon Marczak

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "author": {
    "name": "Szymon Marczak"
  },
  "dependencies": {
    "defer-to-connect": "^1.0.1"
  },
  "deprecated": false,
  "description": "Timings for HTTP requests",
  "devDependencies": {
    "ava": "^0.25.0",
    "coveralls": "^3.0.2",
    "nyc": "^12.0.2",
    "p-event": "^2.1.0",
    "xo": "^0.22.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "source"
  ],
  "homepage": "https://github.com/szmarczak/http-timer#readme",
  "license": "MIT",
  "main": "source",
  "name": "@szmarczak/http-timer",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/szmarczak/http-timer.git"
  },
  "version": "1.1.2"
}'use strict';
const deferToConnect = require('defer-to-connect');

module.exports = request => {
	const timings = {
		start: Date.now(),
		socket: null,
		lookup: null,
		connect: null,
		upload: null,
		response: null,
		end: null,
		error: null,
		phases: {
			wait: null,
			dns: null,
			tcp: null,
			request: null,
			firstByte: null,
			download: null,
			total: null
		}
	};

	const handleError = origin => {
		const emit = origin.emit.bind(origin);
		origin.emit = (event, ...args) => {
			// Catches the `error` event
			if (event === 'error') {
				timings.error = Date.now();
				timings.phases.total = timings.error - timings.start;

				origin.emit = emit;
			}

			// Saves the original behavior
			return emit(event, ...args);
		};
	};

	let uploadFinished = false;
	const onUpload = () => {
		timings.upload = Date.now();
		timings.phases.request = timings.upload - timings.connect;
	};

	handleError(request);

	request.once('socket', socket => {
		timings.socket = Date.now();
		timings.phases.wait = timings.socket - timings.start;

		const lookupListener = () => {
			timings.lookup = Date.now();
			timings.phases.dns = timings.lookup - timings.socket;
		};

		socket.once('lookup', lookupListener);

		deferToConnect(socket, () => {
			timings.connect = Date.now();

			if (timings.lookup === null) {
				socket.removeListener('lookup', lookupListener);
				timings.lookup = timings.connect;
				timings.phases.dns = timings.lookup - timings.socket;
			}

			timings.phases.tcp = timings.connect - timings.lookup;

			if (uploadFinished && !timings.upload) {
				onUpload();
			}
		});
	});

	request.once('finish', () => {
		uploadFinished = true;

		if (timings.connect) {
			onUpload();
		}
	});

	request.once('response', response => {
		timings.response = Date.now();
		timings.phases.firstByte = timings.response - timings.upload;

		handleError(response);

		response.once('end', () => {
			timings.end = Date.now();
			timings.phases.download = timings.end - timings.response;
			timings.phases.total = timings.end - timings.start;
		});
	});

	return timings;
};
    MIT License

    Copyright (c) Microsoft Corporation. All rights reserved.

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE
{
  "dependencies": {},
  "deprecated": false,
  "description": "TypeScript definitions for debug",
  "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped#readme",
  "license": "MIT",
  "main": "",
  "name": "@types/debug",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/DefinitelyTyped/DefinitelyTyped.git",
    "directory": "types/debug"
  },
  "typeScriptVersion": "2.0",
  "types": "index",
  "typesPublisherContentHash": "c45deaee8b444b3ae0df891511582b5067c8c689a7d9b4cabe984bacad67e4ab",
  "version": "4.1.5"
}    MIT License

    Copyright (c) Microsoft Corporation.

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE
{
  "dependencies": {},
  "deprecated": false,
  "description": "TypeScript definitions for Node.js",
  "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped#readme",
  "license": "MIT",
  "main": "",
  "name": "@types/node",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/DefinitelyTyped/DefinitelyTyped.git",
    "directory": "types/node"
  },
  "typeScriptVersion": "3.2",
  "types": "index.d.ts",
  "typesPublisherContentHash": "4f85562c3b423a581784a611b555ececad27893a2c8423e8605daf6318850135",
  "typesVersions": {
    "<=3.6": {
      "*": [
        "ts3.6/*"
      ]
    }
  },
  "version": "10.17.37"
}This software is dual-licensed under the ISC and MIT licenses.
You may use this software under EITHER of the following licenses.

----------

The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

----------

Copyright Isaac Z. Schlueter and Contributors
All rights reserved.

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
module.exports = exports = abbrev.abbrev = abbrev

abbrev.monkeyPatch = monkeyPatch

function monkeyPatch () {
  Object.defineProperty(Array.prototype, 'abbrev', {
    value: function () { return abbrev(this) },
    enumerable: false, configurable: true, writable: true
  })

  Object.defineProperty(Object.prototype, 'abbrev', {
    value: function () { return abbrev(Object.keys(this)) },
    enumerable: false, configurable: true, writable: true
  })
}

function abbrev (list) {
  if (arguments.length !== 1 || !Array.isArray(list)) {
    list = Array.prototype.slice.call(arguments, 0)
  }
  for (var i = 0, l = list.length, args = [] ; i < l ; i ++) {
    args[i] = typeof list[i] === "string" ? list[i] : String(list[i])
  }

  // sort them lexicographically, so that they're next to their nearest kin
  args = args.sort(lexSort)

  // walk through each, seeing how much it has in common with the next and previous
  var abbrevs = {}
    , prev = ""
  for (var i = 0, l = args.length ; i < l ; i ++) {
    var current = args[i]
      , next = args[i + 1] || ""
      , nextMatches = true
      , prevMatches = true
    if (current === next) continue
    for (var j = 0, cl = current.length ; j < cl ; j ++) {
      var curChar = current.charAt(j)
      nextMatches = nextMatches && curChar === next.charAt(j)
      prevMatches = prevMatches && curChar === prev.charAt(j)
      if (!nextMatches && !prevMatches) {
        j ++
        break
      }
    }
    prev = current
    if (j === cl) {
      abbrevs[current] = current
      continue
    }
    for (var a = current.substr(0, j) ; j <= cl ; j ++) {
      abbrevs[a] = current
      a += current.charAt(j)
    }
  }
  return abbrevs
}

function lexSort (a, b) {
  return a === b ? 0 : a > b ? 1 : -1
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me"
  },
  "deprecated": false,
  "description": "Like ruby's abbrev module, but in js",
  "devDependencies": {
    "tap": "^10.1"
  },
  "files": [
    "abbrev.js"
  ],
  "homepage": "https://github.com/isaacs/abbrev-js#readme",
  "license": "ISC",
  "main": "abbrev.js",
  "name": "abbrev",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/isaacs/abbrev-js.git"
  },
  "version": "1.1.1"
}var Ajv = require('ajv');
var ajv = new Ajv({allErrors: true});

var schema = {
  "properties": {
    "foo": { "type": "string" },
    "bar": { "type": "number", "maximum": 3 }
  }
};

var validate = ajv.compile(schema);

test({"foo": "abc", "bar": 2});
test({"foo": 2, "bar": 4});

function test(data) {
  var valid = validate(data);
  if (valid) console.log('Valid!');
  else console.log('Invalid: ' + ajv.errorsText(validate.errors));
}The MIT License (MIT)

Copyright (c) 2015-2017 Evgeny Poberezkin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

{
  "author": {
    "name": "Evgeny Poberezkin"
  },
  "collective": {
    "type": "opencollective",
    "url": "https://opencollective.com/ajv"
  },
  "dependencies": {
    "fast-deep-equal": "^3.1.1",
    "fast-json-stable-stringify": "^2.0.0",
    "json-schema-traverse": "^0.4.1",
    "uri-js": "^4.2.2"
  },
  "deprecated": false,
  "description": "Another JSON Schema Validator",
  "devDependencies": {
    "ajv-async": "^1.0.0",
    "bluebird": "^3.5.3",
    "brfs": "^2.0.0",
    "browserify": "^16.2.0",
    "chai": "^4.0.1",
    "coveralls": "^3.0.1",
    "del-cli": "^3.0.0",
    "dot": "^1.0.3",
    "eslint": "^7.3.1",
    "gh-pages-generator": "^0.2.3",
    "glob": "^7.0.0",
    "if-node-version": "^1.0.0",
    "js-beautify": "^1.7.3",
    "jshint": "^2.10.2",
    "json-schema-test": "^2.0.0",
    "karma": "^5.0.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-mocha": "^2.0.0",
    "karma-sauce-launcher": "^4.1.3",
    "mocha": "^8.0.1",
    "nyc": "^15.0.0",
    "pre-commit": "^1.1.1",
    "require-globify": "^1.3.0",
    "typescript": "^3.9.5",
    "uglify-js": "^3.6.9",
    "watch": "^1.0.0"
  },
  "files": [
    "lib/",
    "dist/",
    "scripts/",
    "LICENSE",
    ".tonic_example.js"
  ],
  "funding": {
    "type": "github",
    "url": "https://github.com/sponsors/epoberezkin"
  },
  "homepage": "https://github.com/ajv-validator/ajv",
  "license": "MIT",
  "main": "lib/ajv.js",
  "name": "ajv",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ajv-validator/ajv.git"
  },
  "tonicExampleFilename": ".tonic_example.js",
  "typings": "lib/ajv.d.ts",
  "version": "6.12.5"
}rules:
  no-console: 0
  no-empty: [2, allowEmptyCatch: true]
'use strict';

var fs = require('fs')
  , path = require('path')
  , browserify = require('browserify')
  , uglify = require('uglify-js');

var pkg = process.argv[2]
  , standalone = process.argv[3]
  , compress = process.argv[4];

var packageDir = path.join(__dirname, '..');
if (pkg != '.') packageDir = path.join(packageDir, 'node_modules', pkg);

var json = require(path.join(packageDir, 'package.json'));

var distDir = path.join(__dirname, '..', 'dist');
if (!fs.existsSync(distDir)) fs.mkdirSync(distDir);

var bOpts = {};
if (standalone) bOpts.standalone = standalone;

browserify(bOpts)
.require(path.join(packageDir, json.main), {expose: json.name})
.bundle(function (err, buf) {
  if (err) {
    console.error('browserify error:', err);
    process.exit(1);
  }

  var outputFile = path.join(distDir, json.name);
  var uglifyOpts = {
    warnings: true,
    compress: {},
    output: {
      preamble: '/* ' + json.name + ' ' + json.version + ': ' + json.description + ' */'
    }
  };
  if (compress) {
    var compressOpts = compress.split(',');
    for (var i=0, il = compressOpts.length; i<il; ++i) {
      var pair = compressOpts[i].split('=');
      uglifyOpts.compress[pair[0]] = pair.length < 1 || pair[1] != 'false';
    }
  }
  if (standalone) {
    uglifyOpts.sourceMap = {
      filename: json.name + '.min.js',
      url: json.name + '.min.js.map'
    };
  }

  var result = uglify.minify(buf.toString(), uglifyOpts);
  fs.writeFileSync(outputFile + '.min.js', result.code);
  if (result.map) fs.writeFileSync(outputFile + '.min.js.map', result.map);
  if (standalone) fs.writeFileSync(outputFile + '.bundle.js', buf);
  if (result.warnings) {
    for (var j=0, jl = result.warnings.length; j<jl; ++j)
      console.warn('UglifyJS warning:', result.warnings[j]);
  }
});
//compile doT templates to js functions
'use strict';

var glob = require('glob')
  , fs = require('fs')
  , path = require('path')
  , doT = require('dot')
  , beautify = require('js-beautify').js_beautify;

var defsRootPath = process.argv[2] || path.join(__dirname, '../lib');

var defs = {};
var defFiles = glob.sync('./dot/**/*.def', { cwd: defsRootPath });
defFiles.forEach(function (f) {
  var name = path.basename(f, '.def');
  defs[name] = fs.readFileSync(path.join(defsRootPath, f));
});

var filesRootPath = process.argv[3] || path.join(__dirname, '../lib');
var files = glob.sync('./dot/**/*.jst', { cwd: filesRootPath });

var dotjsPath = path.join(filesRootPath, './dotjs');
try { fs.mkdirSync(dotjsPath); } catch(e) {}

console.log('\n\nCompiling:');

var FUNCTION_NAME = /function\s+anonymous\s*\(it[^)]*\)\s*{/;
var OUT_EMPTY_STRING = /out\s*\+=\s*'\s*';/g;
var ISTANBUL = /'(istanbul[^']+)';/g;
var ERROR_KEYWORD = /\$errorKeyword/g;
var ERROR_KEYWORD_OR = /\$errorKeyword\s+\|\|/g;
var VARS = [
  '$errs', '$valid', '$lvl', '$data', '$dataLvl',
  '$errorKeyword', '$closingBraces', '$schemaPath',
  '$validate'
];

files.forEach(function (f) {
  var keyword = path.basename(f, '.jst');
  var targetPath = path.join(dotjsPath, keyword + '.js');
  var template = fs.readFileSync(path.join(filesRootPath, f));
  var code = doT.compile(template, defs);
  code = code.toString()
             .replace(OUT_EMPTY_STRING, '')
             .replace(FUNCTION_NAME, 'function generate_' + keyword + '(it, $keyword, $ruleType) {')
             .replace(ISTANBUL, '/* $1 */');
  removeAlwaysFalsyInOr();
  VARS.forEach(removeUnusedVar);
  code = "'use strict';\nmodule.exports = " + code;
  code = beautify(code, { indent_size: 2 }) + '\n';
  fs.writeFileSync(targetPath, code);
  console.log('compiled', keyword);

  function removeUnusedVar(v) {
    v = v.replace(/\$/g, '\\$$');
    var regexp = new RegExp(v + '[^A-Za-z0-9_$]', 'g');
    var count = occurrences(regexp);
    if (count == 1) {
      regexp = new RegExp('var\\s+' + v + '\\s*=[^;]+;|var\\s+' + v + ';');
      code = code.replace(regexp, '');
    }
  }

  function removeAlwaysFalsyInOr() {
    var countUsed = occurrences(ERROR_KEYWORD);
    var countOr = occurrences(ERROR_KEYWORD_OR);
    if (countUsed == countOr + 1) code = code.replace(ERROR_KEYWORD_OR, '');
  }

  function occurrences(regexp) {
    return (code.match(regexp) || []).length;
  }
});
#!/usr/bin/env node

'use strict';

var fs = require('fs');
var name = process.argv[2] || '.';
var property = process.argv[3] || 'version';
if (name != '.') name = 'node_modules/' + name;
var json = JSON.parse(fs.readFileSync(name + '/package.json', 'utf8'));
console.log(json[property]);
#!/usr/bin/env sh

set -e

mkdir -p .browser

echo
echo Preparing browser tests:

find spec -type f -name '*.spec.js' | \
xargs -I {} sh -c \
'export f="{}"; echo $f; browserify $f -t require-globify -t brfs -x ajv -u buffer -o $(echo $f | sed -e "s/spec/.browser/");'
#!/usr/bin/env bash

set -e

if [[ -n $TRAVIS_TAG && $TRAVIS_JOB_NUMBER =~ ".3" ]]; then
  echo "About to publish $TRAVIS_TAG to ajv-dist..."

  git config user.email "$GIT_USER_EMAIL"
  git config user.name "$GIT_USER_NAME"

  git clone https://${GITHUB_TOKEN}@github.com/ajv-validator/ajv-dist.git ../ajv-dist

  rm -rf ../ajv-dist/dist
  mkdir ../ajv-dist/dist
  cp ./dist/ajv.* ../ajv-dist/dist
  cat bower.json | sed 's/"name": "ajv"/"name": "ajv-dist"/' > ../ajv-dist/bower.json
  cd ../ajv-dist

  if [[ `git status --porcelain` ]]; then
    echo "Changes detected. Updating master branch..."
    git add -A
    git commit -m "updated by travis build #$TRAVIS_BUILD_NUMBER"
    git push --quiet origin master > /dev/null 2>&1
  fi

  echo "Publishing tag..."

  git tag $TRAVIS_TAG
  git push --tags > /dev/null 2>&1

  echo "Done"
fi
#!/usr/bin/env bash

set -e

if [[ "$TRAVIS_BRANCH" == "master" && "$TRAVIS_PULL_REQUEST" == "false" && $TRAVIS_JOB_NUMBER =~ ".3" ]]; then
  git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qE '\.md$|^LICENSE$|travis-gh-pages$' && {
    rm -rf ../gh-pages
    git clone -b gh-pages --single-branch https://${GITHUB_TOKEN}@github.com/ajv-validator/ajv.git ../gh-pages
    mkdir -p ../gh-pages/_source
    cp *.md ../gh-pages/_source
    cp LICENSE ../gh-pages/_source
    currentDir=$(pwd)
    cd ../gh-pages
    $currentDir/node_modules/.bin/gh-pages-generator
    # remove logo from README
    sed -i -E "s/<img[^>]+ajv_logo[^>]+>//" index.md
    git config user.email "$GIT_USER_EMAIL"
    git config user.name "$GIT_USER_NAME"
    git add .
    git commit -am "updated by travis build #$TRAVIS_BUILD_NUMBER"
    git push --quiet origin gh-pages > /dev/null 2>&1
  }
fi
'use strict';

var compileSchema = require('./compile')
  , resolve = require('./compile/resolve')
  , Cache = require('./cache')
  , SchemaObject = require('./compile/schema_obj')
  , stableStringify = require('fast-json-stable-stringify')
  , formats = require('./compile/formats')
  , rules = require('./compile/rules')
  , $dataMetaSchema = require('./data')
  , util = require('./compile/util');

module.exports = Ajv;

Ajv.prototype.validate = validate;
Ajv.prototype.compile = compile;
Ajv.prototype.addSchema = addSchema;
Ajv.prototype.addMetaSchema = addMetaSchema;
Ajv.prototype.validateSchema = validateSchema;
Ajv.prototype.getSchema = getSchema;
Ajv.prototype.removeSchema = removeSchema;
Ajv.prototype.addFormat = addFormat;
Ajv.prototype.errorsText = errorsText;

Ajv.prototype._addSchema = _addSchema;
Ajv.prototype._compile = _compile;

Ajv.prototype.compileAsync = require('./compile/async');
var customKeyword = require('./keyword');
Ajv.prototype.addKeyword = customKeyword.add;
Ajv.prototype.getKeyword = customKeyword.get;
Ajv.prototype.removeKeyword = customKeyword.remove;
Ajv.prototype.validateKeyword = customKeyword.validate;

var errorClasses = require('./compile/error_classes');
Ajv.ValidationError = errorClasses.Validation;
Ajv.MissingRefError = errorClasses.MissingRef;
Ajv.$dataMetaSchema = $dataMetaSchema;

var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema';

var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ];
var META_SUPPORT_DATA = ['/properties'];

/**
 * Creates validator instance.
 * Usage: `Ajv(opts)`
 * @param {Object} opts optional options
 * @return {Object} ajv instance
 */
function Ajv(opts) {
  if (!(this instanceof Ajv)) return new Ajv(opts);
  opts = this._opts = util.copy(opts) || {};
  setLogger(this);
  this._schemas = {};
  this._refs = {};
  this._fragments = {};
  this._formats = formats(opts.format);

  this._cache = opts.cache || new Cache;
  this._loadingSchemas = {};
  this._compilations = [];
  this.RULES = rules();
  this._getId = chooseGetId(opts);

  opts.loopRequired = opts.loopRequired || Infinity;
  if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true;
  if (opts.serialize === undefined) opts.serialize = stableStringify;
  this._metaOpts = getMetaSchemaOptions(this);

  if (opts.formats) addInitialFormats(this);
  if (opts.keywords) addInitialKeywords(this);
  addDefaultMetaSchema(this);
  if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta);
  if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}});
  addInitialSchemas(this);
}



/**
 * Validate data using schema
 * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize.
 * @this   Ajv
 * @param  {String|Object} schemaKeyRef key, ref or schema object
 * @param  {Any} data to be validated
 * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`).
 */
function validate(schemaKeyRef, data) {
  var v;
  if (typeof schemaKeyRef == 'string') {
    v = this.getSchema(schemaKeyRef);
    if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"');
  } else {
    var schemaObj = this._addSchema(schemaKeyRef);
    v = schemaObj.validate || this._compile(schemaObj);
  }

  var valid = v(data);
  if (v.$async !== true) this.errors = v.errors;
  return valid;
}


/**
 * Create validating function for passed schema.
 * @this   Ajv
 * @param  {Object} schema schema object
 * @param  {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords.
 * @return {Function} validating function
 */
function compile(schema, _meta) {
  var schemaObj = this._addSchema(schema, undefined, _meta);
  return schemaObj.validate || this._compile(schemaObj);
}


/**
 * Adds schema to the instance.
 * @this   Ajv
 * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored.
 * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`.
 * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead.
 * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead.
 * @return {Ajv} this for method chaining
 */
function addSchema(schema, key, _skipValidation, _meta) {
  if (Array.isArray(schema)){
    for (var i=0; i<schema.length; i++) this.addSchema(schema[i], undefined, _skipValidation, _meta);
    return this;
  }
  var id = this._getId(schema);
  if (id !== undefined && typeof id != 'string')
    throw new Error('schema id must be string');
  key = resolve.normalizeId(key || id);
  checkUnique(this, key);
  this._schemas[key] = this._addSchema(schema, _skipValidation, _meta, true);
  return this;
}


/**
 * Add schema that will be used to validate other schemas
 * options in META_IGNORE_OPTIONS are alway set to false
 * @this   Ajv
 * @param {Object} schema schema object
 * @param {String} key optional schema key
 * @param {Boolean} skipValidation true to skip schema validation, can be used to override validateSchema option for meta-schema
 * @return {Ajv} this for method chaining
 */
function addMetaSchema(schema, key, skipValidation) {
  this.addSchema(schema, key, skipValidation, true);
  return this;
}


/**
 * Validate schema
 * @this   Ajv
 * @param {Object} schema schema to validate
 * @param {Boolean} throwOrLogError pass true to throw (or log) an error if invalid
 * @return {Boolean} true if schema is valid
 */
function validateSchema(schema, throwOrLogError) {
  var $schema = schema.$schema;
  if ($schema !== undefined && typeof $schema != 'string')
    throw new Error('$schema must be a string');
  $schema = $schema || this._opts.defaultMeta || defaultMeta(this);
  if (!$schema) {
    this.logger.warn('meta-schema not available');
    this.errors = null;
    return true;
  }
  var valid = this.validate($schema, schema);
  if (!valid && throwOrLogError) {
    var message = 'schema is invalid: ' + this.errorsText();
    if (this._opts.validateSchema == 'log') this.logger.error(message);
    else throw new Error(message);
  }
  return valid;
}


function defaultMeta(self) {
  var meta = self._opts.meta;
  self._opts.defaultMeta = typeof meta == 'object'
                            ? self._getId(meta) || meta
                            : self.getSchema(META_SCHEMA_ID)
                              ? META_SCHEMA_ID
                              : undefined;
  return self._opts.defaultMeta;
}


/**
 * Get compiled schema from the instance by `key` or `ref`.
 * @this   Ajv
 * @param  {String} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id).
 * @return {Function} schema validating function (with property `schema`).
 */
function getSchema(keyRef) {
  var schemaObj = _getSchemaObj(this, keyRef);
  switch (typeof schemaObj) {
    case 'object': return schemaObj.validate || this._compile(schemaObj);
    case 'string': return this.getSchema(schemaObj);
    case 'undefined': return _getSchemaFragment(this, keyRef);
  }
}


function _getSchemaFragment(self, ref) {
  var res = resolve.schema.call(self, { schema: {} }, ref);
  if (res) {
    var schema = res.schema
      , root = res.root
      , baseId = res.baseId;
    var v = compileSchema.call(self, schema, root, undefined, baseId);
    self._fragments[ref] = new SchemaObject({
      ref: ref,
      fragment: true,
      schema: schema,
      root: root,
      baseId: baseId,
      validate: v
    });
    return v;
  }
}


function _getSchemaObj(self, keyRef) {
  keyRef = resolve.normalizeId(keyRef);
  return self._schemas[keyRef] || self._refs[keyRef] || self._fragments[keyRef];
}


/**
 * Remove cached schema(s).
 * If no parameter is passed all schemas but meta-schemas are removed.
 * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed.
 * Even if schema is referenced by other schemas it still can be removed as other schemas have local references.
 * @this   Ajv
 * @param  {String|Object|RegExp} schemaKeyRef key, ref, pattern to match key/ref or schema object
 * @return {Ajv} this for method chaining
 */
function removeSchema(schemaKeyRef) {
  if (schemaKeyRef instanceof RegExp) {
    _removeAllSchemas(this, this._schemas, schemaKeyRef);
    _removeAllSchemas(this, this._refs, schemaKeyRef);
    return this;
  }
  switch (typeof schemaKeyRef) {
    case 'undefined':
      _removeAllSchemas(this, this._schemas);
      _removeAllSchemas(this, this._refs);
      this._cache.clear();
      return this;
    case 'string':
      var schemaObj = _getSchemaObj(this, schemaKeyRef);
      if (schemaObj) this._cache.del(schemaObj.cacheKey);
      delete this._schemas[schemaKeyRef];
      delete this._refs[schemaKeyRef];
      return this;
    case 'object':
      var serialize = this._opts.serialize;
      var cacheKey = serialize ? serialize(schemaKeyRef) : schemaKeyRef;
      this._cache.del(cacheKey);
      var id = this._getId(schemaKeyRef);
      if (id) {
        id = resolve.normalizeId(id);
        delete this._schemas[id];
        delete this._refs[id];
      }
  }
  return this;
}


function _removeAllSchemas(self, schemas, regex) {
  for (var keyRef in schemas) {
    var schemaObj = schemas[keyRef];
    if (!schemaObj.meta && (!regex || regex.test(keyRef))) {
      self._cache.del(schemaObj.cacheKey);
      delete schemas[keyRef];
    }
  }
}


/* @this   Ajv */
function _addSchema(schema, skipValidation, meta, shouldAddSchema) {
  if (typeof schema != 'object' && typeof schema != 'boolean')
    throw new Error('schema should be object or boolean');
  var serialize = this._opts.serialize;
  var cacheKey = serialize ? serialize(schema) : schema;
  var cached = this._cache.get(cacheKey);
  if (cached) return cached;

  shouldAddSchema = shouldAddSchema || this._opts.addUsedSchema !== false;

  var id = resolve.normalizeId(this._getId(schema));
  if (id && shouldAddSchema) checkUnique(this, id);

  var willValidate = this._opts.validateSchema !== false && !skipValidation;
  var recursiveMeta;
  if (willValidate && !(recursiveMeta = id && id == resolve.normalizeId(schema.$schema)))
    this.validateSchema(schema, true);

  var localRefs = resolve.ids.call(this, schema);

  var schemaObj = new SchemaObject({
    id: id,
    schema: schema,
    localRefs: localRefs,
    cacheKey: cacheKey,
    meta: meta
  });

  if (id[0] != '#' && shouldAddSchema) this._refs[id] = schemaObj;
  this._cache.put(cacheKey, schemaObj);

  if (willValidate && recursiveMeta) this.validateSchema(schema, true);

  return schemaObj;
}


/* @this   Ajv */
function _compile(schemaObj, root) {
  if (schemaObj.compiling) {
    schemaObj.validate = callValidate;
    callValidate.schema = schemaObj.schema;
    callValidate.errors = null;
    callValidate.root = root ? root : callValidate;
    if (schemaObj.schema.$async === true)
      callValidate.$async = true;
    return callValidate;
  }
  schemaObj.compiling = true;

  var currentOpts;
  if (schemaObj.meta) {
    currentOpts = this._opts;
    this._opts = this._metaOpts;
  }

  var v;
  try { v = compileSchema.call(this, schemaObj.schema, root, schemaObj.localRefs); }
  catch(e) {
    delete schemaObj.validate;
    throw e;
  }
  finally {
    schemaObj.compiling = false;
    if (schemaObj.meta) this._opts = currentOpts;
  }

  schemaObj.validate = v;
  schemaObj.refs = v.refs;
  schemaObj.refVal = v.refVal;
  schemaObj.root = v.root;
  return v;


  /* @this   {*} - custom context, see passContext option */
  function callValidate() {
    /* jshint validthis: true */
    var _validate = schemaObj.validate;
    var result = _validate.apply(this, arguments);
    callValidate.errors = _validate.errors;
    return result;
  }
}


function chooseGetId(opts) {
  switch (opts.schemaId) {
    case 'auto': return _get$IdOrId;
    case 'id': return _getId;
    default: return _get$Id;
  }
}

/* @this   Ajv */
function _getId(schema) {
  if (schema.$id) this.logger.warn('schema $id ignored', schema.$id);
  return schema.id;
}

/* @this   Ajv */
function _get$Id(schema) {
  if (schema.id) this.logger.warn('schema id ignored', schema.id);
  return schema.$id;
}


function _get$IdOrId(schema) {
  if (schema.$id && schema.id && schema.$id != schema.id)
    throw new Error('schema $id is different from id');
  return schema.$id || schema.id;
}


/**
 * Convert array of error message objects to string
 * @this   Ajv
 * @param  {Array<Object>} errors optional array of validation errors, if not passed errors from the instance are used.
 * @param  {Object} options optional options with properties `separator` and `dataVar`.
 * @return {String} human readable string with all errors descriptions
 */
function errorsText(errors, options) {
  errors = errors || this.errors;
  if (!errors) return 'No errors';
  options = options || {};
  var separator = options.separator === undefined ? ', ' : options.separator;
  var dataVar = options.dataVar === undefined ? 'data' : options.dataVar;

  var text = '';
  for (var i=0; i<errors.length; i++) {
    var e = errors[i];
    if (e) text += dataVar + e.dataPath + ' ' + e.message + separator;
  }
  return text.slice(0, -separator.length);
}


/**
 * Add custom format
 * @this   Ajv
 * @param {String} name format name
 * @param {String|RegExp|Function} format string is converted to RegExp; function should return boolean (true when valid)
 * @return {Ajv} this for method chaining
 */
function addFormat(name, format) {
  if (typeof format == 'string') format = new RegExp(format);
  this._formats[name] = format;
  return this;
}


function addDefaultMetaSchema(self) {
  var $dataSchema;
  if (self._opts.$data) {
    $dataSchema = require('./refs/data.json');
    self.addMetaSchema($dataSchema, $dataSchema.$id, true);
  }
  if (self._opts.meta === false) return;
  var metaSchema = require('./refs/json-schema-draft-07.json');
  if (self._opts.$data) metaSchema = $dataMetaSchema(metaSchema, META_SUPPORT_DATA);
  self.addMetaSchema(metaSchema, META_SCHEMA_ID, true);
  self._refs['http://json-schema.org/schema'] = META_SCHEMA_ID;
}


function addInitialSchemas(self) {
  var optsSchemas = self._opts.schemas;
  if (!optsSchemas) return;
  if (Array.isArray(optsSchemas)) self.addSchema(optsSchemas);
  else for (var key in optsSchemas) self.addSchema(optsSchemas[key], key);
}


function addInitialFormats(self) {
  for (var name in self._opts.formats) {
    var format = self._opts.formats[name];
    self.addFormat(name, format);
  }
}


function addInitialKeywords(self) {
  for (var name in self._opts.keywords) {
    var keyword = self._opts.keywords[name];
    self.addKeyword(name, keyword);
  }
}


function checkUnique(self, id) {
  if (self._schemas[id] || self._refs[id])
    throw new Error('schema with key or id "' + id + '" already exists');
}


function getMetaSchemaOptions(self) {
  var metaOpts = util.copy(self._opts);
  for (var i=0; i<META_IGNORE_OPTIONS.length; i++)
    delete metaOpts[META_IGNORE_OPTIONS[i]];
  return metaOpts;
}


function setLogger(self) {
  var logger = self._opts.logger;
  if (logger === false) {
    self.logger = {log: noop, warn: noop, error: noop};
  } else {
    if (logger === undefined) logger = console;
    if (!(typeof logger == 'object' && logger.log && logger.warn && logger.error))
      throw new Error('logger must implement log, warn and error methods');
    self.logger = logger;
  }
}


function noop() {}
'use strict';


var Cache = module.exports = function Cache() {
  this._cache = {};
};


Cache.prototype.put = function Cache_put(key, value) {
  this._cache[key] = value;
};


Cache.prototype.get = function Cache_get(key) {
  return this._cache[key];
};


Cache.prototype.del = function Cache_del(key) {
  delete this._cache[key];
};


Cache.prototype.clear = function Cache_clear() {
  this._cache = {};
};
'use strict';

var KEYWORDS = [
  'multipleOf',
  'maximum',
  'exclusiveMaximum',
  'minimum',
  'exclusiveMinimum',
  'maxLength',
  'minLength',
  'pattern',
  'additionalItems',
  'maxItems',
  'minItems',
  'uniqueItems',
  'maxProperties',
  'minProperties',
  'required',
  'additionalProperties',
  'enum',
  'format',
  'const'
];

module.exports = function (metaSchema, keywordsJsonPointers) {
  for (var i=0; i<keywordsJsonPointers.length; i++) {
    metaSchema = JSON.parse(JSON.stringify(metaSchema));
    var segments = keywordsJsonPointers[i].split('/');
    var keywords = metaSchema;
    var j;
    for (j=1; j<segments.length; j++)
      keywords = keywords[segments[j]];

    for (j=0; j<KEYWORDS.length; j++) {
      var key = KEYWORDS[j];
      var schema = keywords[key];
      if (schema) {
        keywords[key] = {
          anyOf: [
            schema,
            { $ref: 'https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#' }
          ]
        };
      }
    }
  }

  return metaSchema;
};
'use strict';

var metaSchema = require('./refs/json-schema-draft-07.json');

module.exports = {
  $id: 'https://github.com/ajv-validator/ajv/blob/master/lib/definition_schema.js',
  definitions: {
    simpleTypes: metaSchema.definitions.simpleTypes
  },
  type: 'object',
  dependencies: {
    schema: ['validate'],
    $data: ['validate'],
    statements: ['inline'],
    valid: {not: {required: ['macro']}}
  },
  properties: {
    type: metaSchema.properties.type,
    schema: {type: 'boolean'},
    statements: {type: 'boolean'},
    dependencies: {
      type: 'array',
      items: {type: 'string'}
    },
    metaSchema: {type: 'object'},
    modifying: {type: 'boolean'},
    valid: {type: 'boolean'},
    $data: {type: 'boolean'},
    async: {type: 'boolean'},
    errors: {
      anyOf: [
        {type: 'boolean'},
        {const: 'full'}
      ]
    }
  }
};
'use strict';

var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i;
var customRuleCode = require('./dotjs/custom');
var definitionSchema = require('./definition_schema');

module.exports = {
  add: addKeyword,
  get: getKeyword,
  remove: removeKeyword,
  validate: validateKeyword
};


/**
 * Define custom keyword
 * @this  Ajv
 * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords).
 * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`.
 * @return {Ajv} this for method chaining
 */
function addKeyword(keyword, definition) {
  /* jshint validthis: true */
  /* eslint no-shadow: 0 */
  var RULES = this.RULES;
  if (RULES.keywords[keyword])
    throw new Error('Keyword ' + keyword + ' is already defined');

  if (!IDENTIFIER.test(keyword))
    throw new Error('Keyword ' + keyword + ' is not a valid identifier');

  if (definition) {
    this.validateKeyword(definition, true);

    var dataType = definition.type;
    if (Array.isArray(dataType)) {
      for (var i=0; i<dataType.length; i++)
        _addRule(keyword, dataType[i], definition);
    } else {
      _addRule(keyword, dataType, definition);
    }

    var metaSchema = definition.metaSchema;
    if (metaSchema) {
      if (definition.$data && this._opts.$data) {
        metaSchema = {
          anyOf: [
            metaSchema,
            { '$ref': 'https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#' }
          ]
        };
      }
      definition.validateSchema = this.compile(metaSchema, true);
    }
  }

  RULES.keywords[keyword] = RULES.all[keyword] = true;


  function _addRule(keyword, dataType, definition) {
    var ruleGroup;
    for (var i=0; i<RULES.length; i++) {
      var rg = RULES[i];
      if (rg.type == dataType) {
        ruleGroup = rg;
        break;
      }
    }

    if (!ruleGroup) {
      ruleGroup = { type: dataType, rules: [] };
      RULES.push(ruleGroup);
    }

    var rule = {
      keyword: keyword,
      definition: definition,
      custom: true,
      code: customRuleCode,
      implements: definition.implements
    };
    ruleGroup.rules.push(rule);
    RULES.custom[keyword] = rule;
  }

  return this;
}


/**
 * Get keyword
 * @this  Ajv
 * @param {String} keyword pre-defined or custom keyword.
 * @return {Object|Boolean} custom keyword definition, `true` if it is a predefined keyword, `false` otherwise.
 */
function getKeyword(keyword) {
  /* jshint validthis: true */
  var rule = this.RULES.custom[keyword];
  return rule ? rule.definition : this.RULES.keywords[keyword] || false;
}


/**
 * Remove keyword
 * @this  Ajv
 * @param {String} keyword pre-defined or custom keyword.
 * @return {Ajv} this for method chaining
 */
function removeKeyword(keyword) {
  /* jshint validthis: true */
  var RULES = this.RULES;
  delete RULES.keywords[keyword];
  delete RULES.all[keyword];
  delete RULES.custom[keyword];
  for (var i=0; i<RULES.length; i++) {
    var rules = RULES[i].rules;
    for (var j=0; j<rules.length; j++) {
      if (rules[j].keyword == keyword) {
        rules.splice(j, 1);
        break;
      }
    }
  }
  return this;
}


/**
 * Validate keyword definition
 * @this  Ajv
 * @param {Object} definition keyword definition object.
 * @param {Boolean} throwError true to throw exception if definition is invalid
 * @return {boolean} validation result
 */
function validateKeyword(definition, throwError) {
  validateKeyword.errors = null;
  var v = this._validateKeyword = this._validateKeyword
                                  || this.compile(definitionSchema, true);

  if (v(definition)) return true;
  validateKeyword.errors = v.errors;
  if (throwError)
    throw new Error('custom keyword definition is invalid: '  + this.errorsText(v.errors));
  else
    return false;
}
{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",
    "description": "Meta-schema for $data reference (JSON Schema extension proposal)",
    "type": "object",
    "required": [ "$data" ],
    "properties": {
        "$data": {
            "type": "string",
            "anyOf": [
                { "format": "relative-json-pointer" }, 
                { "format": "json-pointer" }
            ]
        }
    },
    "additionalProperties": false
}
{
    "id": "http://json-schema.org/draft-04/schema#",
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Core schema meta-schema",
    "definitions": {
        "schemaArray": {
            "type": "array",
            "minItems": 1,
            "items": { "$ref": "#" }
        },
        "positiveInteger": {
            "type": "integer",
            "minimum": 0
        },
        "positiveIntegerDefault0": {
            "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ]
        },
        "simpleTypes": {
            "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ]
        },
        "stringArray": {
            "type": "array",
            "items": { "type": "string" },
            "minItems": 1,
            "uniqueItems": true
        }
    },
    "type": "object",
    "properties": {
        "id": {
            "type": "string"
        },
        "$schema": {
            "type": "string"
        },
        "title": {
            "type": "string"
        },
        "description": {
            "type": "string"
        },
        "default": {},
        "multipleOf": {
            "type": "number",
            "minimum": 0,
            "exclusiveMinimum": true
        },
        "maximum": {
            "type": "number"
        },
        "exclusiveMaximum": {
            "type": "boolean",
            "default": false
        },
        "minimum": {
            "type": "number"
        },
        "exclusiveMinimum": {
            "type": "boolean",
            "default": false
        },
        "maxLength": { "$ref": "#/definitions/positiveInteger" },
        "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" },
        "pattern": {
            "type": "string",
            "format": "regex"
        },
        "additionalItems": {
            "anyOf": [
                { "type": "boolean" },
                { "$ref": "#" }
            ],
            "default": {}
        },
        "items": {
            "anyOf": [
                { "$ref": "#" },
                { "$ref": "#/definitions/schemaArray" }
            ],
            "default": {}
        },
        "maxItems": { "$ref": "#/definitions/positiveInteger" },
        "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" },
        "uniqueItems": {
            "type": "boolean",
            "default": false
        },
        "maxProperties": { "$ref": "#/definitions/positiveInteger" },
        "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" },
        "required": { "$ref": "#/definitions/stringArray" },
        "additionalProperties": {
            "anyOf": [
                { "type": "boolean" },
                { "$ref": "#" }
            ],
            "default": {}
        },
        "definitions": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "properties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "patternProperties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "dependencies": {
            "type": "object",
            "additionalProperties": {
                "anyOf": [
                    { "$ref": "#" },
                    { "$ref": "#/definitions/stringArray" }
                ]
            }
        },
        "enum": {
            "type": "array",
            "minItems": 1,
            "uniqueItems": true
        },
        "type": {
            "anyOf": [
                { "$ref": "#/definitions/simpleTypes" },
                {
                    "type": "array",
                    "items": { "$ref": "#/definitions/simpleTypes" },
                    "minItems": 1,
                    "uniqueItems": true
                }
            ]
        },
        "format": { "type": "string" },
        "allOf": { "$ref": "#/definitions/schemaArray" },
        "anyOf": { "$ref": "#/definitions/schemaArray" },
        "oneOf": { "$ref": "#/definitions/schemaArray" },
        "not": { "$ref": "#" }
    },
    "dependencies": {
        "exclusiveMaximum": [ "maximum" ],
        "exclusiveMinimum": [ "minimum" ]
    },
    "default": {}
}
{
    "$schema": "http://json-schema.org/draft-06/schema#",
    "$id": "http://json-schema.org/draft-06/schema#",
    "title": "Core schema meta-schema",
    "definitions": {
        "schemaArray": {
            "type": "array",
            "minItems": 1,
            "items": { "$ref": "#" }
        },
        "nonNegativeInteger": {
            "type": "integer",
            "minimum": 0
        },
        "nonNegativeIntegerDefault0": {
            "allOf": [
                { "$ref": "#/definitions/nonNegativeInteger" },
                { "default": 0 }
            ]
        },
        "simpleTypes": {
            "enum": [
                "array",
                "boolean",
                "integer",
                "null",
                "number",
                "object",
                "string"
            ]
        },
        "stringArray": {
            "type": "array",
            "items": { "type": "string" },
            "uniqueItems": true,
            "default": []
        }
    },
    "type": ["object", "boolean"],
    "properties": {
        "$id": {
            "type": "string",
            "format": "uri-reference"
        },
        "$schema": {
            "type": "string",
            "format": "uri"
        },
        "$ref": {
            "type": "string",
            "format": "uri-reference"
        },
        "title": {
            "type": "string"
        },
        "description": {
            "type": "string"
        },
        "default": {},
        "examples": {
            "type": "array",
            "items": {}
        },
        "multipleOf": {
            "type": "number",
            "exclusiveMinimum": 0
        },
        "maximum": {
            "type": "number"
        },
        "exclusiveMaximum": {
            "type": "number"
        },
        "minimum": {
            "type": "number"
        },
        "exclusiveMinimum": {
            "type": "number"
        },
        "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
        "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "pattern": {
            "type": "string",
            "format": "regex"
        },
        "additionalItems": { "$ref": "#" },
        "items": {
            "anyOf": [
                { "$ref": "#" },
                { "$ref": "#/definitions/schemaArray" }
            ],
            "default": {}
        },
        "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
        "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "uniqueItems": {
            "type": "boolean",
            "default": false
        },
        "contains": { "$ref": "#" },
        "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
        "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "required": { "$ref": "#/definitions/stringArray" },
        "additionalProperties": { "$ref": "#" },
        "definitions": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "properties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "patternProperties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "dependencies": {
            "type": "object",
            "additionalProperties": {
                "anyOf": [
                    { "$ref": "#" },
                    { "$ref": "#/definitions/stringArray" }
                ]
            }
        },
        "propertyNames": { "$ref": "#" },
        "const": {},
        "enum": {
            "type": "array",
            "minItems": 1,
            "uniqueItems": true
        },
        "type": {
            "anyOf": [
                { "$ref": "#/definitions/simpleTypes" },
                {
                    "type": "array",
                    "items": { "$ref": "#/definitions/simpleTypes" },
                    "minItems": 1,
                    "uniqueItems": true
                }
            ]
        },
        "format": { "type": "string" },
        "allOf": { "$ref": "#/definitions/schemaArray" },
        "anyOf": { "$ref": "#/definitions/schemaArray" },
        "oneOf": { "$ref": "#/definitions/schemaArray" },
        "not": { "$ref": "#" }
    },
    "default": {}
}
{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "http://json-schema.org/draft-07/schema#",
    "title": "Core schema meta-schema",
    "definitions": {
        "schemaArray": {
            "type": "array",
            "minItems": 1,
            "items": { "$ref": "#" }
        },
        "nonNegativeInteger": {
            "type": "integer",
            "minimum": 0
        },
        "nonNegativeIntegerDefault0": {
            "allOf": [
                { "$ref": "#/definitions/nonNegativeInteger" },
                { "default": 0 }
            ]
        },
        "simpleTypes": {
            "enum": [
                "array",
                "boolean",
                "integer",
                "null",
                "number",
                "object",
                "string"
            ]
        },
        "stringArray": {
            "type": "array",
            "items": { "type": "string" },
            "uniqueItems": true,
            "default": []
        }
    },
    "type": ["object", "boolean"],
    "properties": {
        "$id": {
            "type": "string",
            "format": "uri-reference"
        },
        "$schema": {
            "type": "string",
            "format": "uri"
        },
        "$ref": {
            "type": "string",
            "format": "uri-reference"
        },
        "$comment": {
            "type": "string"
        },
        "title": {
            "type": "string"
        },
        "description": {
            "type": "string"
        },
        "default": true,
        "readOnly": {
            "type": "boolean",
            "default": false
        },
        "examples": {
            "type": "array",
            "items": true
        },
        "multipleOf": {
            "type": "number",
            "exclusiveMinimum": 0
        },
        "maximum": {
            "type": "number"
        },
        "exclusiveMaximum": {
            "type": "number"
        },
        "minimum": {
            "type": "number"
        },
        "exclusiveMinimum": {
            "type": "number"
        },
        "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
        "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "pattern": {
            "type": "string",
            "format": "regex"
        },
        "additionalItems": { "$ref": "#" },
        "items": {
            "anyOf": [
                { "$ref": "#" },
                { "$ref": "#/definitions/schemaArray" }
            ],
            "default": true
        },
        "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
        "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "uniqueItems": {
            "type": "boolean",
            "default": false
        },
        "contains": { "$ref": "#" },
        "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
        "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "required": { "$ref": "#/definitions/stringArray" },
        "additionalProperties": { "$ref": "#" },
        "definitions": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "properties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "patternProperties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "propertyNames": { "format": "regex" },
            "default": {}
        },
        "dependencies": {
            "type": "object",
            "additionalProperties": {
                "anyOf": [
                    { "$ref": "#" },
                    { "$ref": "#/definitions/stringArray" }
                ]
            }
        },
        "propertyNames": { "$ref": "#" },
        "const": true,
        "enum": {
            "type": "array",
            "items": true,
            "minItems": 1,
            "uniqueItems": true
        },
        "type": {
            "anyOf": [
                { "$ref": "#/definitions/simpleTypes" },
                {
                    "type": "array",
                    "items": { "$ref": "#/definitions/simpleTypes" },
                    "minItems": 1,
                    "uniqueItems": true
                }
            ]
        },
        "format": { "type": "string" },
        "contentMediaType": { "type": "string" },
        "contentEncoding": { "type": "string" },
        "if": {"$ref": "#"},
        "then": {"$ref": "#"},
        "else": {"$ref": "#"},
        "allOf": { "$ref": "#/definitions/schemaArray" },
        "anyOf": { "$ref": "#/definitions/schemaArray" },
        "oneOf": { "$ref": "#/definitions/schemaArray" },
        "not": { "$ref": "#" }
    },
    "default": true
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/json-schema-secure.json#",
  "title": "Meta-schema for the security assessment of JSON Schemas",
  "description": "If a JSON Schema fails validation against this meta-schema, it may be unsafe to validate untrusted data",
  "definitions": {
    "schemaArray": {
      "type": "array",
      "minItems": 1,
      "items": {"$ref": "#"}
    }
  },
  "dependencies": {
    "patternProperties": {
      "description": "prevent slow validation of large property names",
      "required": ["propertyNames"],
      "properties": {
        "propertyNames": {
          "required": ["maxLength"]
        }
      }
    },
    "uniqueItems": {
      "description": "prevent slow validation of large non-scalar arrays",
      "if": {
        "properties": {
          "uniqueItems": {"const": true},
          "items": {
            "properties": {
              "type": {
                "anyOf": [
                  {
                    "enum": ["object", "array"]
                  },
                  {
                    "type": "array",
                    "contains": {"enum": ["object", "array"]}
                  }
                ]
              }
            }
          }
        }
      },
      "then": {
        "required": ["maxItems"]
      }
    },
    "pattern": {
      "description": "prevent slow pattern matching of large strings",
      "required": ["maxLength"]
    },
    "format": {
      "description": "prevent slow format validation of large strings",
      "required": ["maxLength"]
    }
  },
  "properties": {
    "additionalItems": {"$ref": "#"},
    "additionalProperties": {"$ref": "#"},
    "dependencies": {
      "additionalProperties": {
        "anyOf": [
          {"type": "array"},
          {"$ref": "#"}
        ]
      }
    },
    "items": {
      "anyOf": [
        {"$ref": "#"},
        {"$ref": "#/definitions/schemaArray"}
      ]
    },
    "definitions": {
      "additionalProperties": {"$ref": "#"}
    },
    "patternProperties": {
      "additionalProperties": {"$ref": "#"}
    },
    "properties": {
      "additionalProperties": {"$ref": "#"}
    },
    "if": {"$ref": "#"},
    "then": {"$ref": "#"},
    "else": {"$ref": "#"},
    "allOf": {"$ref": "#/definitions/schemaArray"},
    "anyOf": {"$ref": "#/definitions/schemaArray"},
    "oneOf": {"$ref": "#/definitions/schemaArray"},
    "not": {"$ref": "#"},
    "contains": {"$ref": "#"},
    "propertyNames": {"$ref": "#"}
  }
}
These files are compiled dot templates from dot folder.

Do NOT edit them directly, edit the templates and run `npm run build` from main ajv folder.
'use strict';
module.exports = function generate__limit(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $isMax = $keyword == 'maximum',
    $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum',
    $schemaExcl = it.schema[$exclusiveKeyword],
    $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data,
    $op = $isMax ? '<' : '>',
    $notOp = $isMax ? '>' : '<',
    $errorKeyword = undefined;
  if (!($isData || typeof $schema == 'number' || $schema === undefined)) {
    throw new Error($keyword + ' must be number');
  }
  if (!($isDataExcl || $schemaExcl === undefined || typeof $schemaExcl == 'number' || typeof $schemaExcl == 'boolean')) {
    throw new Error($exclusiveKeyword + ' must be number or boolean');
  }
  if ($isDataExcl) {
    var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),
      $exclusive = 'exclusive' + $lvl,
      $exclType = 'exclType' + $lvl,
      $exclIsNumber = 'exclIsNumber' + $lvl,
      $opExpr = 'op' + $lvl,
      $opStr = '\' + ' + $opExpr + ' + \'';
    out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';
    $schemaValueExcl = 'schemaExcl' + $lvl;
    out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { ';
    var $errorKeyword = $exclusiveKeyword;
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' } else if ( ';
    if ($isData) {
      out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
    }
    out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; ';
    if ($schema === undefined) {
      $errorKeyword = $exclusiveKeyword;
      $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
      $schemaValue = $schemaValueExcl;
      $isData = $isDataExcl;
    }
  } else {
    var $exclIsNumber = typeof $schemaExcl == 'number',
      $opStr = $op;
    if ($exclIsNumber && $isData) {
      var $opExpr = '\'' + $opStr + '\'';
      out += ' if ( ';
      if ($isData) {
        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
      }
      out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { ';
    } else {
      if ($exclIsNumber && $schema === undefined) {
        $exclusive = true;
        $errorKeyword = $exclusiveKeyword;
        $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
        $schemaValue = $schemaExcl;
        $notOp += '=';
      } else {
        if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema);
        if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {
          $exclusive = true;
          $errorKeyword = $exclusiveKeyword;
          $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
          $notOp += '=';
        } else {
          $exclusive = false;
          $opStr += '=';
        }
      }
      var $opExpr = '\'' + $opStr + '\'';
      out += ' if ( ';
      if ($isData) {
        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
      }
      out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { ';
    }
  }
  $errorKeyword = $errorKeyword || $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be ' + ($opStr) + ' ';
      if ($isData) {
        out += '\' + ' + ($schemaValue);
      } else {
        out += '' + ($schemaValue) + '\'';
      }
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' } ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate__limitItems(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  var $op = $keyword == 'maxItems' ? '>' : '<';
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
  }
  out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should NOT have ';
      if ($keyword == 'maxItems') {
        out += 'more';
      } else {
        out += 'fewer';
      }
      out += ' than ';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + ($schema);
      }
      out += ' items\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate__limitLength(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  var $op = $keyword == 'maxLength' ? '>' : '<';
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
  }
  if (it.opts.unicode === false) {
    out += ' ' + ($data) + '.length ';
  } else {
    out += ' ucs2length(' + ($data) + ') ';
  }
  out += ' ' + ($op) + ' ' + ($schemaValue) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should NOT be ';
      if ($keyword == 'maxLength') {
        out += 'longer';
      } else {
        out += 'shorter';
      }
      out += ' than ';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + ($schema);
      }
      out += ' characters\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate__limitProperties(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  var $op = $keyword == 'maxProperties' ? '>' : '<';
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
  }
  out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should NOT have ';
      if ($keyword == 'maxProperties') {
        out += 'more';
      } else {
        out += 'fewer';
      }
      out += ' than ';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + ($schema);
      }
      out += ' properties\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate_allOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $currentBaseId = $it.baseId,
    $allSchemasEmpty = true;
  var arr1 = $schema;
  if (arr1) {
    var $sch, $i = -1,
      l1 = arr1.length - 1;
    while ($i < l1) {
      $sch = arr1[$i += 1];
      if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
        $allSchemasEmpty = false;
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + '[' + $i + ']';
        $it.errSchemaPath = $errSchemaPath + '/' + $i;
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
        if ($breakOnError) {
          out += ' if (' + ($nextValid) + ') { ';
          $closingBraces += '}';
        }
      }
    }
  }
  if ($breakOnError) {
    if ($allSchemasEmpty) {
      out += ' if (true) { ';
    } else {
      out += ' ' + ($closingBraces.slice(0, -1)) + ' ';
    }
  }
  return out;
}
'use strict';
module.exports = function generate_anyOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $noEmptySchema = $schema.every(function($sch) {
    return (it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all));
  });
  if ($noEmptySchema) {
    var $currentBaseId = $it.baseId;
    out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false;  ';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    var arr1 = $schema;
    if (arr1) {
      var $sch, $i = -1,
        l1 = arr1.length - 1;
      while ($i < l1) {
        $sch = arr1[$i += 1];
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + '[' + $i + ']';
        $it.errSchemaPath = $errSchemaPath + '/' + $i;
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
        out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { ';
        $closingBraces += '}';
      }
    }
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should match some schema in anyOf\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError(vErrors); ';
      } else {
        out += ' validate.errors = vErrors; return false; ';
      }
    }
    out += ' } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
    if (it.opts.allErrors) {
      out += ' } ';
    }
  } else {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  }
  return out;
}
'use strict';
module.exports = function generate_comment(it, $keyword, $ruleType) {
  var out = ' ';
  var $schema = it.schema[$keyword];
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $comment = it.util.toQuotedString($schema);
  if (it.opts.$comment === true) {
    out += ' console.log(' + ($comment) + ');';
  } else if (typeof it.opts.$comment == 'function') {
    out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);';
  }
  return out;
}
'use strict';
module.exports = function generate_const(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!$isData) {
    out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';';
  }
  out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be equal to constant\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' }';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate_contains(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $idx = 'i' + $lvl,
    $dataNxt = $it.dataLevel = it.dataLevel + 1,
    $nextData = 'data' + $dataNxt,
    $currentBaseId = it.baseId,
    $nonEmptySchema = (it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all));
  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
  if ($nonEmptySchema) {
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';
    $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
    var $passData = $data + '[' + $idx + ']';
    $it.dataPathArr[$dataNxt] = $idx;
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
    if (it.util.varOccurences($code, $nextData) < 2) {
      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
    } else {
      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
    }
    out += ' if (' + ($nextValid) + ') break; }  ';
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {';
  } else {
    out += ' if (' + ($data) + '.length == 0) {';
  }
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should contain a valid item\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' } else { ';
  if ($nonEmptySchema) {
    out += '  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
  }
  if (it.opts.allErrors) {
    out += ' } ';
  }
  return out;
}
'use strict';
module.exports = function generate_custom(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $rule = this,
    $definition = 'definition' + $lvl,
    $rDef = $rule.definition,
    $closingBraces = '';
  var $compile, $inline, $macro, $ruleValidate, $validateCode;
  if ($isData && $rDef.$data) {
    $validateCode = 'keywordValidate' + $lvl;
    var $validateSchema = $rDef.validateSchema;
    out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;';
  } else {
    $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it);
    if (!$ruleValidate) return;
    $schemaValue = 'validate.schema' + $schemaPath;
    $validateCode = $ruleValidate.code;
    $compile = $rDef.compile;
    $inline = $rDef.inline;
    $macro = $rDef.macro;
  }
  var $ruleErrs = $validateCode + '.errors',
    $i = 'i' + $lvl,
    $ruleErr = 'ruleErr' + $lvl,
    $asyncKeyword = $rDef.async;
  if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema');
  if (!($inline || $macro)) {
    out += '' + ($ruleErrs) + ' = null;';
  }
  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
  if ($isData && $rDef.$data) {
    $closingBraces += '}';
    out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { ';
    if ($validateSchema) {
      $closingBraces += '}';
      out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { ';
    }
  }
  if ($inline) {
    if ($rDef.statements) {
      out += ' ' + ($ruleValidate.validate) + ' ';
    } else {
      out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; ';
    }
  } else if ($macro) {
    var $it = it.util.copy(it);
    var $closingBraces = '';
    $it.level++;
    var $nextValid = 'valid' + $it.level;
    $it.schema = $ruleValidate.validate;
    $it.schemaPath = '';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    var $code = it.validate($it).replace(/validate\.schema/g, $validateCode);
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' ' + ($code);
  } else {
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
    out += '  ' + ($validateCode) + '.call( ';
    if (it.opts.passContext) {
      out += 'this';
    } else {
      out += 'self';
    }
    if ($compile || $rDef.schema === false) {
      out += ' , ' + ($data) + ' ';
    } else {
      out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' ';
    }
    out += ' , (dataPath || \'\')';
    if (it.errorPath != '""') {
      out += ' + ' + (it.errorPath);
    }
    var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',
      $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
    out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData )  ';
    var def_callRuleValidate = out;
    out = $$outStack.pop();
    if ($rDef.errors === false) {
      out += ' ' + ($valid) + ' = ';
      if ($asyncKeyword) {
        out += 'await ';
      }
      out += '' + (def_callRuleValidate) + '; ';
    } else {
      if ($asyncKeyword) {
        $ruleErrs = 'customErrors' + $lvl;
        out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } ';
      } else {
        out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; ';
      }
    }
  }
  if ($rDef.modifying) {
    out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];';
  }
  out += '' + ($closingBraces);
  if ($rDef.valid) {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  } else {
    out += ' if ( ';
    if ($rDef.valid === undefined) {
      out += ' !';
      if ($macro) {
        out += '' + ($nextValid);
      } else {
        out += '' + ($valid);
      }
    } else {
      out += ' ' + (!$rDef.valid) + ' ';
    }
    out += ') { ';
    $errorKeyword = $rule.keyword;
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    var def_customError = out;
    out = $$outStack.pop();
    if ($inline) {
      if ($rDef.errors) {
        if ($rDef.errors != 'full') {
          out += '  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + '; if (' + ($ruleErr) + '.schemaPath === undefined) { ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '"; } ';
          if (it.opts.verbose) {
            out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
          }
          out += ' } ';
        }
      } else {
        if ($rDef.errors === false) {
          out += ' ' + (def_customError) + ' ';
        } else {
          out += ' if (' + ($errs) + ' == errors) { ' + (def_customError) + ' } else {  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + '; if (' + ($ruleErr) + '.schemaPath === undefined) { ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '"; } ';
          if (it.opts.verbose) {
            out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
          }
          out += ' } } ';
        }
      }
    } else if ($macro) {
      out += '   var err =   '; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } ';
        if (it.opts.messages !== false) {
          out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
      if (!it.compositeRule && $breakOnError) {
        /* istanbul ignore if */
        if (it.async) {
          out += ' throw new ValidationError(vErrors); ';
        } else {
          out += ' validate.errors = vErrors; return false; ';
        }
      }
    } else {
      if ($rDef.errors === false) {
        out += ' ' + (def_customError) + ' ';
      } else {
        out += ' if (Array.isArray(' + ($ruleErrs) + ')) { if (vErrors === null) vErrors = ' + ($ruleErrs) + '; else vErrors = vErrors.concat(' + ($ruleErrs) + '); errors = vErrors.length;  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + ';  ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '";  ';
        if (it.opts.verbose) {
          out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
        }
        out += ' } } else { ' + (def_customError) + ' } ';
      }
    }
    out += ' } ';
    if ($breakOnError) {
      out += ' else { ';
    }
  }
  return out;
}
'use strict';
module.exports = function generate_dependencies(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $schemaDeps = {},
    $propertyDeps = {},
    $ownProperties = it.opts.ownProperties;
  for ($property in $schema) {
    if ($property == '__proto__') continue;
    var $sch = $schema[$property];
    var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;
    $deps[$property] = $sch;
  }
  out += 'var ' + ($errs) + ' = errors;';
  var $currentErrorPath = it.errorPath;
  out += 'var missing' + ($lvl) + ';';
  for (var $property in $propertyDeps) {
    $deps = $propertyDeps[$property];
    if ($deps.length) {
      out += ' if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';
      if ($ownProperties) {
        out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') ';
      }
      if ($breakOnError) {
        out += ' && ( ';
        var arr1 = $deps;
        if (arr1) {
          var $propertyKey, $i = -1,
            l1 = arr1.length - 1;
          while ($i < l1) {
            $propertyKey = arr1[$i += 1];
            if ($i) {
              out += ' || ';
            }
            var $prop = it.util.getProperty($propertyKey),
              $useData = $data + $prop;
            out += ' ( ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';
          }
        }
        out += ')) {  ';
        var $propertyPath = 'missing' + $lvl,
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;
        }
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'should have ';
            if ($deps.length == 1) {
              out += 'property ' + (it.util.escapeQuotes($deps[0]));
            } else {
              out += 'properties ' + (it.util.escapeQuotes($deps.join(", ")));
            }
            out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
      } else {
        out += ' ) { ';
        var arr2 = $deps;
        if (arr2) {
          var $propertyKey, i2 = -1,
            l2 = arr2.length - 1;
          while (i2 < l2) {
            $propertyKey = arr2[i2 += 1];
            var $prop = it.util.getProperty($propertyKey),
              $missingProperty = it.util.escapeQuotes($propertyKey),
              $useData = $data + $prop;
            if (it.opts._errorDataPathProperty) {
              it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
            }
            out += ' if ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') {  var err =   '; /* istanbul ignore else */
            if (it.createErrors !== false) {
              out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } ';
              if (it.opts.messages !== false) {
                out += ' , message: \'should have ';
                if ($deps.length == 1) {
                  out += 'property ' + (it.util.escapeQuotes($deps[0]));
                } else {
                  out += 'properties ' + (it.util.escapeQuotes($deps.join(", ")));
                }
                out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' ';
              }
              if (it.opts.verbose) {
                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
              }
              out += ' } ';
            } else {
              out += ' {} ';
            }
            out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';
          }
        }
      }
      out += ' }   ';
      if ($breakOnError) {
        $closingBraces += '}';
        out += ' else { ';
      }
    }
  }
  it.errorPath = $currentErrorPath;
  var $currentBaseId = $it.baseId;
  for (var $property in $schemaDeps) {
    var $sch = $schemaDeps[$property];
    if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
      out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';
      if ($ownProperties) {
        out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') ';
      }
      out += ') { ';
      $it.schema = $sch;
      $it.schemaPath = $schemaPath + it.util.getProperty($property);
      $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);
      out += '  ' + (it.validate($it)) + ' ';
      $it.baseId = $currentBaseId;
      out += ' }  ';
      if ($breakOnError) {
        out += ' if (' + ($nextValid) + ') { ';
        $closingBraces += '}';
      }
    }
  }
  if ($breakOnError) {
    out += '   ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}
'use strict';
module.exports = function generate_enum(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $i = 'i' + $lvl,
    $vSchema = 'schema' + $lvl;
  if (!$isData) {
    out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';';
  }
  out += 'var ' + ($valid) + ';';
  if ($isData) {
    out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';
  }
  out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }';
  if ($isData) {
    out += '  }  ';
  }
  out += ' if (!' + ($valid) + ') {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('enum') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be equal to one of the allowed values\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' }';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate_format(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  if (it.opts.format === false) {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
    return out;
  }
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $unknownFormats = it.opts.unknownFormats,
    $allowUnknown = Array.isArray($unknownFormats);
  if ($isData) {
    var $format = 'format' + $lvl,
      $isObject = 'isObject' + $lvl,
      $formatType = 'formatType' + $lvl;
    out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \'string\'; if (' + ($isObject) + ') { ';
    if (it.async) {
      out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; ';
    }
    out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if (  ';
    if ($isData) {
      out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || ';
    }
    out += ' (';
    if ($unknownFormats != 'ignore') {
      out += ' (' + ($schemaValue) + ' && !' + ($format) + ' ';
      if ($allowUnknown) {
        out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 ';
      }
      out += ') || ';
    }
    out += ' (' + ($format) + ' && ' + ($formatType) + ' == \'' + ($ruleType) + '\' && !(typeof ' + ($format) + ' == \'function\' ? ';
    if (it.async) {
      out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) ';
    } else {
      out += ' ' + ($format) + '(' + ($data) + ') ';
    }
    out += ' : ' + ($format) + '.test(' + ($data) + '))))) {';
  } else {
    var $format = it.formats[$schema];
    if (!$format) {
      if ($unknownFormats == 'ignore') {
        it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"');
        if ($breakOnError) {
          out += ' if (true) { ';
        }
        return out;
      } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) {
        if ($breakOnError) {
          out += ' if (true) { ';
        }
        return out;
      } else {
        throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"');
      }
    }
    var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate;
    var $formatType = $isObject && $format.type || 'string';
    if ($isObject) {
      var $async = $format.async === true;
      $format = $format.validate;
    }
    if ($formatType != $ruleType) {
      if ($breakOnError) {
        out += ' if (true) { ';
      }
      return out;
    }
    if ($async) {
      if (!it.async) throw new Error('async format in sync schema');
      var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate';
      out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { ';
    } else {
      out += ' if (! ';
      var $formatRef = 'formats' + it.util.getProperty($schema);
      if ($isObject) $formatRef += '.validate';
      if (typeof $format == 'function') {
        out += ' ' + ($formatRef) + '(' + ($data) + ') ';
      } else {
        out += ' ' + ($formatRef) + '.test(' + ($data) + ') ';
      }
      out += ') { ';
    }
  }
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format:  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += '  } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should match format "';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + (it.util.escapeQuotes($schema));
      }
      out += '"\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + (it.util.toQuotedString($schema));
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' } ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate_if(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $thenSch = it.schema['then'],
    $elseSch = it.schema['else'],
    $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? (typeof $thenSch == 'object' && Object.keys($thenSch).length > 0) || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)),
    $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? (typeof $elseSch == 'object' && Object.keys($elseSch).length > 0) || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)),
    $currentBaseId = $it.baseId;
  if ($thenPresent || $elsePresent) {
    var $ifClause;
    $it.createErrors = false;
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true;  ';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    out += '  ' + (it.validate($it)) + ' ';
    $it.baseId = $currentBaseId;
    $it.createErrors = true;
    out += '  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }  ';
    it.compositeRule = $it.compositeRule = $wasComposite;
    if ($thenPresent) {
      out += ' if (' + ($nextValid) + ') {  ';
      $it.schema = it.schema['then'];
      $it.schemaPath = it.schemaPath + '.then';
      $it.errSchemaPath = it.errSchemaPath + '/then';
      out += '  ' + (it.validate($it)) + ' ';
      $it.baseId = $currentBaseId;
      out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';
      if ($thenPresent && $elsePresent) {
        $ifClause = 'ifClause' + $lvl;
        out += ' var ' + ($ifClause) + ' = \'then\'; ';
      } else {
        $ifClause = '\'then\'';
      }
      out += ' } ';
      if ($elsePresent) {
        out += ' else { ';
      }
    } else {
      out += ' if (!' + ($nextValid) + ') { ';
    }
    if ($elsePresent) {
      $it.schema = it.schema['else'];
      $it.schemaPath = it.schemaPath + '.else';
      $it.errSchemaPath = it.errSchemaPath + '/else';
      out += '  ' + (it.validate($it)) + ' ';
      $it.baseId = $currentBaseId;
      out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';
      if ($thenPresent && $elsePresent) {
        $ifClause = 'ifClause' + $lvl;
        out += ' var ' + ($ifClause) + ' = \'else\'; ';
      } else {
        $ifClause = '\'else\'';
      }
      out += ' } ';
    }
    out += ' if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('if') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should match "\' + ' + ($ifClause) + ' + \'" schema\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError(vErrors); ';
      } else {
        out += ' validate.errors = vErrors; return false; ';
      }
    }
    out += ' }   ';
    if ($breakOnError) {
      out += ' else { ';
    }
  } else {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  }
  return out;
}
'use strict';

//all requires must be explicit because browserify won't work with dynamic requires
module.exports = {
  '$ref': require('./ref'),
  allOf: require('./allOf'),
  anyOf: require('./anyOf'),
  '$comment': require('./comment'),
  const: require('./const'),
  contains: require('./contains'),
  dependencies: require('./dependencies'),
  'enum': require('./enum'),
  format: require('./format'),
  'if': require('./if'),
  items: require('./items'),
  maximum: require('./_limit'),
  minimum: require('./_limit'),
  maxItems: require('./_limitItems'),
  minItems: require('./_limitItems'),
  maxLength: require('./_limitLength'),
  minLength: require('./_limitLength'),
  maxProperties: require('./_limitProperties'),
  minProperties: require('./_limitProperties'),
  multipleOf: require('./multipleOf'),
  not: require('./not'),
  oneOf: require('./oneOf'),
  pattern: require('./pattern'),
  properties: require('./properties'),
  propertyNames: require('./propertyNames'),
  required: require('./required'),
  uniqueItems: require('./uniqueItems'),
  validate: require('./validate')
};
'use strict';
module.exports = function generate_items(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $idx = 'i' + $lvl,
    $dataNxt = $it.dataLevel = it.dataLevel + 1,
    $nextData = 'data' + $dataNxt,
    $currentBaseId = it.baseId;
  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
  if (Array.isArray($schema)) {
    var $additionalItems = it.schema.additionalItems;
    if ($additionalItems === false) {
      out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; ';
      var $currErrSchemaPath = $errSchemaPath;
      $errSchemaPath = it.errSchemaPath + '/additionalItems';
      out += '  if (!' + ($valid) + ') {   ';
      var $$outStack = $$outStack || [];
      $$outStack.push(out);
      out = ''; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } ';
        if (it.opts.messages !== false) {
          out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      var __err = out;
      out = $$outStack.pop();
      if (!it.compositeRule && $breakOnError) {
        /* istanbul ignore if */
        if (it.async) {
          out += ' throw new ValidationError([' + (__err) + ']); ';
        } else {
          out += ' validate.errors = [' + (__err) + ']; return false; ';
        }
      } else {
        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
      }
      out += ' } ';
      $errSchemaPath = $currErrSchemaPath;
      if ($breakOnError) {
        $closingBraces += '}';
        out += ' else { ';
      }
    }
    var arr1 = $schema;
    if (arr1) {
      var $sch, $i = -1,
        l1 = arr1.length - 1;
      while ($i < l1) {
        $sch = arr1[$i += 1];
        if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
          out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { ';
          var $passData = $data + '[' + $i + ']';
          $it.schema = $sch;
          $it.schemaPath = $schemaPath + '[' + $i + ']';
          $it.errSchemaPath = $errSchemaPath + '/' + $i;
          $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true);
          $it.dataPathArr[$dataNxt] = $i;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          out += ' }  ';
          if ($breakOnError) {
            out += ' if (' + ($nextValid) + ') { ';
            $closingBraces += '}';
          }
        }
      }
    }
    if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? (typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0) || $additionalItems === false : it.util.schemaHasRules($additionalItems, it.RULES.all))) {
      $it.schema = $additionalItems;
      $it.schemaPath = it.schemaPath + '.additionalItems';
      $it.errSchemaPath = it.errSchemaPath + '/additionalItems';
      out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') {  for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';
      $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
      var $passData = $data + '[' + $idx + ']';
      $it.dataPathArr[$dataNxt] = $idx;
      var $code = it.validate($it);
      $it.baseId = $currentBaseId;
      if (it.util.varOccurences($code, $nextData) < 2) {
        out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
      } else {
        out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
      }
      if ($breakOnError) {
        out += ' if (!' + ($nextValid) + ') break; ';
      }
      out += ' } }  ';
      if ($breakOnError) {
        out += ' if (' + ($nextValid) + ') { ';
        $closingBraces += '}';
      }
    }
  } else if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += '  for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';
    $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
    var $passData = $data + '[' + $idx + ']';
    $it.dataPathArr[$dataNxt] = $idx;
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
    if (it.util.varOccurences($code, $nextData) < 2) {
      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
    } else {
      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
    }
    if ($breakOnError) {
      out += ' if (!' + ($nextValid) + ') break; ';
    }
    out += ' }';
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}
'use strict';
module.exports = function generate_multipleOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  out += 'var division' + ($lvl) + ';if (';
  if ($isData) {
    out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || ';
  }
  out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', ';
  if (it.opts.multipleOfPrecision) {
    out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' ';
  } else {
    out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') ';
  }
  out += ' ) ';
  if ($isData) {
    out += '  )  ';
  }
  out += ' ) {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be multiple of ';
      if ($isData) {
        out += '\' + ' + ($schemaValue);
      } else {
        out += '' + ($schemaValue) + '\'';
      }
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate_not(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += ' var ' + ($errs) + ' = errors;  ';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    $it.createErrors = false;
    var $allErrorsOption;
    if ($it.opts.allErrors) {
      $allErrorsOption = $it.opts.allErrors;
      $it.opts.allErrors = false;
    }
    out += ' ' + (it.validate($it)) + ' ';
    $it.createErrors = true;
    if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption;
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' if (' + ($nextValid) + ') {   ';
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should NOT be valid\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
    if (it.opts.allErrors) {
      out += ' } ';
    }
  } else {
    out += '  var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should NOT be valid\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if ($breakOnError) {
      out += ' if (false) { ';
    }
  }
  return out;
}
'use strict';
module.exports = function generate_oneOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $currentBaseId = $it.baseId,
    $prevValid = 'prevValid' + $lvl,
    $passingSchemas = 'passingSchemas' + $lvl;
  out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; ';
  var $wasComposite = it.compositeRule;
  it.compositeRule = $it.compositeRule = true;
  var arr1 = $schema;
  if (arr1) {
    var $sch, $i = -1,
      l1 = arr1.length - 1;
    while ($i < l1) {
      $sch = arr1[$i += 1];
      if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + '[' + $i + ']';
        $it.errSchemaPath = $errSchemaPath + '/' + $i;
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
      } else {
        out += ' var ' + ($nextValid) + ' = true; ';
      }
      if ($i) {
        out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { ';
        $closingBraces += '}';
      }
      out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }';
    }
  }
  it.compositeRule = $it.compositeRule = $wasComposite;
  out += '' + ($closingBraces) + 'if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should match exactly one schema in oneOf\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError(vErrors); ';
    } else {
      out += ' validate.errors = vErrors; return false; ';
    }
  }
  out += '} else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }';
  if (it.opts.allErrors) {
    out += ' } ';
  }
  return out;
}
'use strict';
module.exports = function generate_pattern(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema);
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || ';
  }
  out += ' !' + ($regexp) + '.test(' + ($data) + ') ) {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern:  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += '  } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should match pattern "';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + (it.util.escapeQuotes($schema));
      }
      out += '"\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + (it.util.toQuotedString($schema));
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}
'use strict';
module.exports = function generate_properties(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $key = 'key' + $lvl,
    $idx = 'idx' + $lvl,
    $dataNxt = $it.dataLevel = it.dataLevel + 1,
    $nextData = 'data' + $dataNxt,
    $dataProperties = 'dataProperties' + $lvl;
  var $schemaKeys = Object.keys($schema || {}).filter(notProto),
    $pProperties = it.schema.patternProperties || {},
    $pPropertyKeys = Object.keys($pProperties).filter(notProto),
    $aProperties = it.schema.additionalProperties,
    $someProperties = $schemaKeys.length || $pPropertyKeys.length,
    $noAdditional = $aProperties === false,
    $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length,
    $removeAdditional = it.opts.removeAdditional,
    $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional,
    $ownProperties = it.opts.ownProperties,
    $currentBaseId = it.baseId;
  var $required = it.schema.required;
  if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) {
    var $requiredHash = it.util.toHash($required);
  }

  function notProto(p) {
    return p !== '__proto__';
  }
  out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;';
  if ($ownProperties) {
    out += ' var ' + ($dataProperties) + ' = undefined;';
  }
  if ($checkAdditional) {
    if ($ownProperties) {
      out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
    } else {
      out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
    }
    if ($someProperties) {
      out += ' var isAdditional' + ($lvl) + ' = !(false ';
      if ($schemaKeys.length) {
        if ($schemaKeys.length > 8) {
          out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') ';
        } else {
          var arr1 = $schemaKeys;
          if (arr1) {
            var $propertyKey, i1 = -1,
              l1 = arr1.length - 1;
            while (i1 < l1) {
              $propertyKey = arr1[i1 += 1];
              out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' ';
            }
          }
        }
      }
      if ($pPropertyKeys.length) {
        var arr2 = $pPropertyKeys;
        if (arr2) {
          var $pProperty, $i = -1,
            l2 = arr2.length - 1;
          while ($i < l2) {
            $pProperty = arr2[$i += 1];
            out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') ';
          }
        }
      }
      out += ' ); if (isAdditional' + ($lvl) + ') { ';
    }
    if ($removeAdditional == 'all') {
      out += ' delete ' + ($data) + '[' + ($key) + ']; ';
    } else {
      var $currentErrorPath = it.errorPath;
      var $additionalProperty = '\' + ' + $key + ' + \'';
      if (it.opts._errorDataPathProperty) {
        it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
      }
      if ($noAdditional) {
        if ($removeAdditional) {
          out += ' delete ' + ($data) + '[' + ($key) + ']; ';
        } else {
          out += ' ' + ($nextValid) + ' = false; ';
          var $currErrSchemaPath = $errSchemaPath;
          $errSchemaPath = it.errSchemaPath + '/additionalProperties';
          var $$outStack = $$outStack || [];
          $$outStack.push(out);
          out = ''; /* istanbul ignore else */
          if (it.createErrors !== false) {
            out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } ';
            if (it.opts.messages !== false) {
              out += ' , message: \'';
              if (it.opts._errorDataPathProperty) {
                out += 'is an invalid additional property';
              } else {
                out += 'should NOT have additional properties';
              }
              out += '\' ';
            }
            if (it.opts.verbose) {
              out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
            }
            out += ' } ';
          } else {
            out += ' {} ';
          }
          var __err = out;
          out = $$outStack.pop();
          if (!it.compositeRule && $breakOnError) {
            /* istanbul ignore if */
            if (it.async) {
              out += ' throw new ValidationError([' + (__err) + ']); ';
            } else {
              out += ' validate.errors = [' + (__err) + ']; return false; ';
            }
          } else {
            out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
          }
          $errSchemaPath = $currErrSchemaPath;
          if ($breakOnError) {
            out += ' break; ';
          }
        }
      } else if ($additionalIsSchema) {
        if ($removeAdditional == 'failing') {
          out += ' var ' + ($errs) + ' = errors;  ';
          var $wasComposite = it.compositeRule;
          it.compositeRule = $it.compositeRule = true;
          $it.schema = $aProperties;
          $it.schemaPath = it.schemaPath + '.additionalProperties';
          $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';
          $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
          var $passData = $data + '[' + $key + ']';
          $it.dataPathArr[$dataNxt] = $key;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; }  ';
          it.compositeRule = $it.compositeRule = $wasComposite;
        } else {
          $it.schema = $aProperties;
          $it.schemaPath = it.schemaPath + '.additionalProperties';
          $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';
          $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
          var $passData = $data + '[' + $key + ']';
          $it.dataPathArr[$dataNxt] = $key;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          if ($breakOnError) {
            out += ' if (!' + ($nextValid) + ') break; ';
          }
        }
      }
      it.errorPath = $currentErrorPath;
    }
    if ($someProperties) {
      out += ' } ';
    }
    out += ' }  ';
    if ($breakOnError) {
      out += ' if (' + ($nextValid) + ') { ';
      $closingBraces += '}';
    }
  }
  var $useDefaults = it.opts.useDefaults && !it.compositeRule;
  if ($schemaKeys.length) {
    var arr3 = $schemaKeys;
    if (arr3) {
      var $propertyKey, i3 = -1,
        l3 = arr3.length - 1;
      while (i3 < l3) {
        $propertyKey = arr3[i3 += 1];
        var $sch = $schema[$propertyKey];
        if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
          var $prop = it.util.getProperty($propertyKey),
            $passData = $data + $prop,
            $hasDefault = $useDefaults && $sch.default !== undefined;
          $it.schema = $sch;
          $it.schemaPath = $schemaPath + $prop;
          $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey);
          $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);
          $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            $code = it.util.varReplace($code, $nextData, $passData);
            var $useData = $passData;
          } else {
            var $useData = $nextData;
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ';
          }
          if ($hasDefault) {
            out += ' ' + ($code) + ' ';
          } else {
            if ($requiredHash && $requiredHash[$propertyKey]) {
              out += ' if ( ' + ($useData) + ' === undefined ';
              if ($ownProperties) {
                out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
              }
              out += ') { ' + ($nextValid) + ' = false; ';
              var $currentErrorPath = it.errorPath,
                $currErrSchemaPath = $errSchemaPath,
                $missingProperty = it.util.escapeQuotes($propertyKey);
              if (it.opts._errorDataPathProperty) {
                it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
              }
              $errSchemaPath = it.errSchemaPath + '/required';
              var $$outStack = $$outStack || [];
              $$outStack.push(out);
              out = ''; /* istanbul ignore else */
              if (it.createErrors !== false) {
                out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
                if (it.opts.messages !== false) {
                  out += ' , message: \'';
                  if (it.opts._errorDataPathProperty) {
                    out += 'is a required property';
                  } else {
                    out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
                  }
                  out += '\' ';
                }
                if (it.opts.verbose) {
                  out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
                }
                out += ' } ';
              } else {
                out += ' {} ';
              }
              var __err = out;
              out = $$outStack.pop();
              if (!it.compositeRule && $breakOnError) {
                /* istanbul ignore if */
                if (it.async) {
                  out += ' throw new ValidationError([' + (__err) + ']); ';
                } else {
                  out += ' validate.errors = [' + (__err) + ']; return false; ';
                }
              } else {
                out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
              }
              $errSchemaPath = $currErrSchemaPath;
              it.errorPath = $currentErrorPath;
              out += ' } else { ';
            } else {
              if ($breakOnError) {
                out += ' if ( ' + ($useData) + ' === undefined ';
                if ($ownProperties) {
                  out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
                }
                out += ') { ' + ($nextValid) + ' = true; } else { ';
              } else {
                out += ' if (' + ($useData) + ' !== undefined ';
                if ($ownProperties) {
                  out += ' &&   Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
                }
                out += ' ) { ';
              }
            }
            out += ' ' + ($code) + ' } ';
          }
        }
        if ($breakOnError) {
          out += ' if (' + ($nextValid) + ') { ';
          $closingBraces += '}';
        }
      }
    }
  }
  if ($pPropertyKeys.length) {
    var arr4 = $pPropertyKeys;
    if (arr4) {
      var $pProperty, i4 = -1,
        l4 = arr4.length - 1;
      while (i4 < l4) {
        $pProperty = arr4[i4 += 1];
        var $sch = $pProperties[$pProperty];
        if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
          $it.schema = $sch;
          $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty);
          $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty);
          if ($ownProperties) {
            out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
          } else {
            out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
          }
          out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { ';
          $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
          var $passData = $data + '[' + $key + ']';
          $it.dataPathArr[$dataNxt] = $key;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          if ($breakOnError) {
            out += ' if (!' + ($nextValid) + ') break; ';
          }
          out += ' } ';
          if ($breakOnError) {
            out += ' else ' + ($nextValid) + ' = true; ';
          }
          out += ' }  ';
          if ($breakOnError) {
            out += ' if (' + ($nextValid) + ') { ';
            $closingBraces += '}';
          }
        }
      }
    }
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}
'use strict';
module.exports = function generate_propertyNames(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  out += 'var ' + ($errs) + ' = errors;';
  if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    var $key = 'key' + $lvl,
      $idx = 'idx' + $lvl,
      $i = 'i' + $lvl,
      $invalidName = '\' + ' + $key + ' + \'',
      $dataNxt = $it.dataLevel = it.dataLevel + 1,
      $nextData = 'data' + $dataNxt,
      $dataProperties = 'dataProperties' + $lvl,
      $ownProperties = it.opts.ownProperties,
      $currentBaseId = it.baseId;
    if ($ownProperties) {
      out += ' var ' + ($dataProperties) + ' = undefined; ';
    }
    if ($ownProperties) {
      out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
    } else {
      out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
    }
    out += ' var startErrs' + ($lvl) + ' = errors; ';
    var $passData = $key;
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
    if (it.util.varOccurences($code, $nextData) < 2) {
      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
    } else {
      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
    }
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + '<errors; ' + ($i) + '++) { vErrors[' + ($i) + '].propertyName = ' + ($key) + '; }   var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('propertyNames') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { propertyName: \'' + ($invalidName) + '\' } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'property name \\\'' + ($invalidName) + '\\\' is invalid\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError(vErrors); ';
      } else {
        out += ' validate.errors = vErrors; return false; ';
      }
    }
    if ($breakOnError) {
      out += ' break; ';
    }
    out += ' } }';
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}
'use strict';
module.exports = function generate_ref(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $async, $refCode;
  if ($schema == '#' || $schema == '#/') {
    if (it.isRoot) {
      $async = it.async;
      $refCode = 'validate';
    } else {
      $async = it.root.schema.$async === true;
      $refCode = 'root.refVal[0]';
    }
  } else {
    var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot);
    if ($refVal === undefined) {
      var $message = it.MissingRefError.message(it.baseId, $schema);
      if (it.opts.missingRefs == 'fail') {
        it.logger.error($message);
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('$ref') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { ref: \'' + (it.util.escapeQuotes($schema)) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'can\\\'t resolve reference ' + (it.util.escapeQuotes($schema)) + '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: ' + (it.util.toQuotedString($schema)) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        if ($breakOnError) {
          out += ' if (false) { ';
        }
      } else if (it.opts.missingRefs == 'ignore') {
        it.logger.warn($message);
        if ($breakOnError) {
          out += ' if (true) { ';
        }
      } else {
        throw new it.MissingRefError(it.baseId, $schema, $message);
      }
    } else if ($refVal.inline) {
      var $it = it.util.copy(it);
      $it.level++;
      var $nextValid = 'valid' + $it.level;
      $it.schema = $refVal.schema;
      $it.schemaPath = '';
      $it.errSchemaPath = $schema;
      var $code = it.validate($it).replace(/validate\.schema/g, $refVal.code);
      out += ' ' + ($code) + ' ';
      if ($breakOnError) {
        out += ' if (' + ($nextValid) + ') { ';
      }
    } else {
      $async = $refVal.$async === true || (it.async && $refVal.$async !== false);
      $refCode = $refVal.code;
    }
  }
  if ($refCode) {
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
    if (it.opts.passContext) {
      out += ' ' + ($refCode) + '.call(this, ';
    } else {
      out += ' ' + ($refCode) + '( ';
    }
    out += ' ' + ($data) + ', (dataPath || \'\')';
    if (it.errorPath != '""') {
      out += ' + ' + (it.errorPath);
    }
    var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',
      $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
    out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ', rootData)  ';
    var __callValidate = out;
    out = $$outStack.pop();
    if ($async) {
      if (!it.async) throw new Error('async schema referenced by sync schema');
      if ($breakOnError) {
        out += ' var ' + ($valid) + '; ';
      }
      out += ' try { await ' + (__callValidate) + '; ';
      if ($breakOnError) {
        out += ' ' + ($valid) + ' = true; ';
      }
      out += ' } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ';
      if ($breakOnError) {
        out += ' ' + ($valid) + ' = false; ';
      }
      out += ' } ';
      if ($breakOnError) {
        out += ' if (' + ($valid) + ') { ';
      }
    } else {
      out += ' if (!' + (__callValidate) + ') { if (vErrors === null) vErrors = ' + ($refCode) + '.errors; else vErrors = vErrors.concat(' + ($refCode) + '.errors); errors = vErrors.length; } ';
      if ($breakOnError) {
        out += ' else { ';
      }
    }
  }
  return out;
}
'use strict';
module.exports = function generate_required(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $vSchema = 'schema' + $lvl;
  if (!$isData) {
    if ($schema.length < it.opts.loopRequired && it.schema.properties && Object.keys(it.schema.properties).length) {
      var $required = [];
      var arr1 = $schema;
      if (arr1) {
        var $property, i1 = -1,
          l1 = arr1.length - 1;
        while (i1 < l1) {
          $property = arr1[i1 += 1];
          var $propertySch = it.schema.properties[$property];
          if (!($propertySch && (it.opts.strictKeywords ? (typeof $propertySch == 'object' && Object.keys($propertySch).length > 0) || $propertySch === false : it.util.schemaHasRules($propertySch, it.RULES.all)))) {
            $required[$required.length] = $property;
          }
        }
      }
    } else {
      var $required = $schema;
    }
  }
  if ($isData || $required.length) {
    var $currentErrorPath = it.errorPath,
      $loopRequired = $isData || $required.length >= it.opts.loopRequired,
      $ownProperties = it.opts.ownProperties;
    if ($breakOnError) {
      out += ' var missing' + ($lvl) + '; ';
      if ($loopRequired) {
        if (!$isData) {
          out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';
        }
        var $i = 'i' + $lvl,
          $propertyPath = 'schema' + $lvl + '[' + $i + ']',
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);
        }
        out += ' var ' + ($valid) + ' = true; ';
        if ($isData) {
          out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';
        }
        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined ';
        if ($ownProperties) {
          out += ' &&   Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';
        }
        out += '; if (!' + ($valid) + ') break; } ';
        if ($isData) {
          out += '  }  ';
        }
        out += '  if (!' + ($valid) + ') {   ';
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'';
            if (it.opts._errorDataPathProperty) {
              out += 'is a required property';
            } else {
              out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        out += ' } else { ';
      } else {
        out += ' if ( ';
        var arr2 = $required;
        if (arr2) {
          var $propertyKey, $i = -1,
            l2 = arr2.length - 1;
          while ($i < l2) {
            $propertyKey = arr2[$i += 1];
            if ($i) {
              out += ' || ';
            }
            var $prop = it.util.getProperty($propertyKey),
              $useData = $data + $prop;
            out += ' ( ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';
          }
        }
        out += ') {  ';
        var $propertyPath = 'missing' + $lvl,
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;
        }
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'';
            if (it.opts._errorDataPathProperty) {
              out += 'is a required property';
            } else {
              out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        out += ' } else { ';
      }
    } else {
      if ($loopRequired) {
        if (!$isData) {
          out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';
        }
        var $i = 'i' + $lvl,
          $propertyPath = 'schema' + $lvl + '[' + $i + ']',
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);
        }
        if ($isData) {
          out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) {  var err =   '; /* istanbul ignore else */
          if (it.createErrors !== false) {
            out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
            if (it.opts.messages !== false) {
              out += ' , message: \'';
              if (it.opts._errorDataPathProperty) {
                out += 'is a required property';
              } else {
                out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
              }
              out += '\' ';
            }
            if (it.opts.verbose) {
              out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
            }
            out += ' } ';
          } else {
            out += ' {} ';
          }
          out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { ';
        }
        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined ';
        if ($ownProperties) {
          out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';
        }
        out += ') {  var err =   '; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'';
            if (it.opts._errorDataPathProperty) {
              out += 'is a required property';
            } else {
              out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ';
        if ($isData) {
          out += '  }  ';
        }
      } else {
        var arr3 = $required;
        if (arr3) {
          var $propertyKey, i3 = -1,
            l3 = arr3.length - 1;
          while (i3 < l3) {
            $propertyKey = arr3[i3 += 1];
            var $prop = it.util.getProperty($propertyKey),
              $missingProperty = it.util.escapeQuotes($propertyKey),
              $useData = $data + $prop;
            if (it.opts._errorDataPathProperty) {
              it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
            }
            out += ' if ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') {  var err =   '; /* istanbul ignore else */
            if (it.createErrors !== false) {
              out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
              if (it.opts.messages !== false) {
                out += ' , message: \'';
                if (it.opts._errorDataPathProperty) {
                  out += 'is a required property';
                } else {
                  out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
                }
                out += '\' ';
              }
              if (it.opts.verbose) {
                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
              }
              out += ' } ';
            } else {
              out += ' {} ';
            }
            out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';
          }
        }
      }
    }
    it.errorPath = $currentErrorPath;
  } else if ($breakOnError) {
    out += ' if (true) {';
  }
  return out;
}
'use strict';
module.exports = function generate_uniqueItems(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (($schema || $isData) && it.opts.uniqueItems !== false) {
    if ($isData) {
      out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { ';
    }
    out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { ';
    var $itemType = it.schema.items && it.schema.items.type,
      $typeIsArray = Array.isArray($itemType);
    if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) {
      out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } ';
    } else {
      out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; ';
      var $method = 'checkDataType' + ($typeIsArray ? 's' : '');
      out += ' if (' + (it.util[$method]($itemType, 'item', it.opts.strictNumbers, true)) + ') continue; ';
      if ($typeIsArray) {
        out += ' if (typeof item == \'string\') item = \'"\' + item; ';
      }
      out += ' if (typeof itemIndices[item] == \'number\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } ';
    }
    out += ' } ';
    if ($isData) {
      out += '  }  ';
    }
    out += ' if (!' + ($valid) + ') {   ';
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema:  ';
        if ($isData) {
          out += 'validate.schema' + ($schemaPath);
        } else {
          out += '' + ($schema);
        }
        out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' } ';
    if ($breakOnError) {
      out += ' else { ';
    }
  } else {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  }
  return out;
}
'use strict';
module.exports = function generate_validate(it, $keyword, $ruleType) {
  var out = '';
  var $async = it.schema.$async === true,
    $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'),
    $id = it.self._getId(it.schema);
  if (it.opts.strictKeywords) {
    var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords);
    if ($unknownKwd) {
      var $keywordsMsg = 'unknown keyword: ' + $unknownKwd;
      if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg);
      else throw new Error($keywordsMsg);
    }
  }
  if (it.isTop) {
    out += ' var validate = ';
    if ($async) {
      it.async = true;
      out += 'async ';
    }
    out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; ';
    if ($id && (it.opts.sourceCode || it.opts.processCode)) {
      out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' ';
    }
  }
  if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) {
    var $keyword = 'false schema';
    var $lvl = it.level;
    var $dataLvl = it.dataLevel;
    var $schema = it.schema[$keyword];
    var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
    var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
    var $breakOnError = !it.opts.allErrors;
    var $errorKeyword;
    var $data = 'data' + ($dataLvl || '');
    var $valid = 'valid' + $lvl;
    if (it.schema === false) {
      if (it.isTop) {
        $breakOnError = true;
      } else {
        out += ' var ' + ($valid) + ' = false; ';
      }
      var $$outStack = $$outStack || [];
      $$outStack.push(out);
      out = ''; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
        if (it.opts.messages !== false) {
          out += ' , message: \'boolean schema is false\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      var __err = out;
      out = $$outStack.pop();
      if (!it.compositeRule && $breakOnError) {
        /* istanbul ignore if */
        if (it.async) {
          out += ' throw new ValidationError([' + (__err) + ']); ';
        } else {
          out += ' validate.errors = [' + (__err) + ']; return false; ';
        }
      } else {
        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
      }
    } else {
      if (it.isTop) {
        if ($async) {
          out += ' return data; ';
        } else {
          out += ' validate.errors = null; return true; ';
        }
      } else {
        out += ' var ' + ($valid) + ' = true; ';
      }
    }
    if (it.isTop) {
      out += ' }; return validate; ';
    }
    return out;
  }
  if (it.isTop) {
    var $top = it.isTop,
      $lvl = it.level = 0,
      $dataLvl = it.dataLevel = 0,
      $data = 'data';
    it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));
    it.baseId = it.baseId || it.rootId;
    delete it.isTop;
    it.dataPathArr = [""];
    if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) {
      var $defaultMsg = 'default is ignored in the schema root';
      if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
      else throw new Error($defaultMsg);
    }
    out += ' var vErrors = null; ';
    out += ' var errors = 0;     ';
    out += ' if (rootData === undefined) rootData = data; ';
  } else {
    var $lvl = it.level,
      $dataLvl = it.dataLevel,
      $data = 'data' + ($dataLvl || '');
    if ($id) it.baseId = it.resolve.url(it.baseId, $id);
    if ($async && !it.async) throw new Error('async schema in sync schema');
    out += ' var errs_' + ($lvl) + ' = errors;';
  }
  var $valid = 'valid' + $lvl,
    $breakOnError = !it.opts.allErrors,
    $closingBraces1 = '',
    $closingBraces2 = '';
  var $errorKeyword;
  var $typeSchema = it.schema.type,
    $typeIsArray = Array.isArray($typeSchema);
  if ($typeSchema && it.opts.nullable && it.schema.nullable === true) {
    if ($typeIsArray) {
      if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null');
    } else if ($typeSchema != 'null') {
      $typeSchema = [$typeSchema, 'null'];
      $typeIsArray = true;
    }
  }
  if ($typeIsArray && $typeSchema.length == 1) {
    $typeSchema = $typeSchema[0];
    $typeIsArray = false;
  }
  if (it.schema.$ref && $refKeywords) {
    if (it.opts.extendRefs == 'fail') {
      throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)');
    } else if (it.opts.extendRefs !== true) {
      $refKeywords = false;
      it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"');
    }
  }
  if (it.schema.$comment && it.opts.$comment) {
    out += ' ' + (it.RULES.all.$comment.code(it, '$comment'));
  }
  if ($typeSchema) {
    if (it.opts.coerceTypes) {
      var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema);
    }
    var $rulesGroup = it.RULES.types[$typeSchema];
    if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) {
      var $schemaPath = it.schemaPath + '.type',
        $errSchemaPath = it.errSchemaPath + '/type';
      var $schemaPath = it.schemaPath + '.type',
        $errSchemaPath = it.errSchemaPath + '/type',
        $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType';
      out += ' if (' + (it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true)) + ') { ';
      if ($coerceToTypes) {
        var $dataType = 'dataType' + $lvl,
          $coerced = 'coerced' + $lvl;
        out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; var ' + ($coerced) + ' = undefined; ';
        if (it.opts.coerceTypes == 'array') {
          out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ') && ' + ($data) + '.length == 1) { ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; if (' + (it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)) + ') ' + ($coerced) + ' = ' + ($data) + '; } ';
        }
        out += ' if (' + ($coerced) + ' !== undefined) ; ';
        var arr1 = $coerceToTypes;
        if (arr1) {
          var $type, $i = -1,
            l1 = arr1.length - 1;
          while ($i < l1) {
            $type = arr1[$i += 1];
            if ($type == 'string') {
              out += ' else if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; ';
            } else if ($type == 'number' || $type == 'integer') {
              out += ' else if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' ';
              if ($type == 'integer') {
                out += ' && !(' + ($data) + ' % 1)';
              }
              out += ')) ' + ($coerced) + ' = +' + ($data) + '; ';
            } else if ($type == 'boolean') {
              out += ' else if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; ';
            } else if ($type == 'null') {
              out += ' else if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; ';
            } else if (it.opts.coerceTypes == 'array' && $type == 'array') {
              out += ' else if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; ';
            }
          }
        }
        out += ' else {   ';
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';
          if ($typeIsArray) {
            out += '' + ($typeSchema.join(","));
          } else {
            out += '' + ($typeSchema);
          }
          out += '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'should be ';
            if ($typeIsArray) {
              out += '' + ($typeSchema.join(","));
            } else {
              out += '' + ($typeSchema);
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        out += ' } if (' + ($coerced) + ' !== undefined) {  ';
        var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',
          $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
        out += ' ' + ($data) + ' = ' + ($coerced) + '; ';
        if (!$dataLvl) {
          out += 'if (' + ($parentData) + ' !== undefined)';
        }
        out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } ';
      } else {
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';
          if ($typeIsArray) {
            out += '' + ($typeSchema.join(","));
          } else {
            out += '' + ($typeSchema);
          }
          out += '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'should be ';
            if ($typeIsArray) {
              out += '' + ($typeSchema.join(","));
            } else {
              out += '' + ($typeSchema);
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
      }
      out += ' } ';
    }
  }
  if (it.schema.$ref && !$refKeywords) {
    out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' ';
    if ($breakOnError) {
      out += ' } if (errors === ';
      if ($top) {
        out += '0';
      } else {
        out += 'errs_' + ($lvl);
      }
      out += ') { ';
      $closingBraces2 += '}';
    }
  } else {
    var arr2 = it.RULES;
    if (arr2) {
      var $rulesGroup, i2 = -1,
        l2 = arr2.length - 1;
      while (i2 < l2) {
        $rulesGroup = arr2[i2 += 1];
        if ($shouldUseGroup($rulesGroup)) {
          if ($rulesGroup.type) {
            out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers)) + ') { ';
          }
          if (it.opts.useDefaults) {
            if ($rulesGroup.type == 'object' && it.schema.properties) {
              var $schema = it.schema.properties,
                $schemaKeys = Object.keys($schema);
              var arr3 = $schemaKeys;
              if (arr3) {
                var $propertyKey, i3 = -1,
                  l3 = arr3.length - 1;
                while (i3 < l3) {
                  $propertyKey = arr3[i3 += 1];
                  var $sch = $schema[$propertyKey];
                  if ($sch.default !== undefined) {
                    var $passData = $data + it.util.getProperty($propertyKey);
                    if (it.compositeRule) {
                      if (it.opts.strictDefaults) {
                        var $defaultMsg = 'default is ignored for: ' + $passData;
                        if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
                        else throw new Error($defaultMsg);
                      }
                    } else {
                      out += ' if (' + ($passData) + ' === undefined ';
                      if (it.opts.useDefaults == 'empty') {
                        out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' ';
                      }
                      out += ' ) ' + ($passData) + ' = ';
                      if (it.opts.useDefaults == 'shared') {
                        out += ' ' + (it.useDefault($sch.default)) + ' ';
                      } else {
                        out += ' ' + (JSON.stringify($sch.default)) + ' ';
                      }
                      out += '; ';
                    }
                  }
                }
              }
            } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) {
              var arr4 = it.schema.items;
              if (arr4) {
                var $sch, $i = -1,
                  l4 = arr4.length - 1;
                while ($i < l4) {
                  $sch = arr4[$i += 1];
                  if ($sch.default !== undefined) {
                    var $passData = $data + '[' + $i + ']';
                    if (it.compositeRule) {
                      if (it.opts.strictDefaults) {
                        var $defaultMsg = 'default is ignored for: ' + $passData;
                        if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
                        else throw new Error($defaultMsg);
                      }
                    } else {
                      out += ' if (' + ($passData) + ' === undefined ';
                      if (it.opts.useDefaults == 'empty') {
                        out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' ';
                      }
                      out += ' ) ' + ($passData) + ' = ';
                      if (it.opts.useDefaults == 'shared') {
                        out += ' ' + (it.useDefault($sch.default)) + ' ';
                      } else {
                        out += ' ' + (JSON.stringify($sch.default)) + ' ';
                      }
                      out += '; ';
                    }
                  }
                }
              }
            }
          }
          var arr5 = $rulesGroup.rules;
          if (arr5) {
            var $rule, i5 = -1,
              l5 = arr5.length - 1;
            while (i5 < l5) {
              $rule = arr5[i5 += 1];
              if ($shouldUseRule($rule)) {
                var $code = $rule.code(it, $rule.keyword, $rulesGroup.type);
                if ($code) {
                  out += ' ' + ($code) + ' ';
                  if ($breakOnError) {
                    $closingBraces1 += '}';
                  }
                }
              }
            }
          }
          if ($breakOnError) {
            out += ' ' + ($closingBraces1) + ' ';
            $closingBraces1 = '';
          }
          if ($rulesGroup.type) {
            out += ' } ';
            if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) {
              out += ' else { ';
              var $schemaPath = it.schemaPath + '.type',
                $errSchemaPath = it.errSchemaPath + '/type';
              var $$outStack = $$outStack || [];
              $$outStack.push(out);
              out = ''; /* istanbul ignore else */
              if (it.createErrors !== false) {
                out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';
                if ($typeIsArray) {
                  out += '' + ($typeSchema.join(","));
                } else {
                  out += '' + ($typeSchema);
                }
                out += '\' } ';
                if (it.opts.messages !== false) {
                  out += ' , message: \'should be ';
                  if ($typeIsArray) {
                    out += '' + ($typeSchema.join(","));
                  } else {
                    out += '' + ($typeSchema);
                  }
                  out += '\' ';
                }
                if (it.opts.verbose) {
                  out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
                }
                out += ' } ';
              } else {
                out += ' {} ';
              }
              var __err = out;
              out = $$outStack.pop();
              if (!it.compositeRule && $breakOnError) {
                /* istanbul ignore if */
                if (it.async) {
                  out += ' throw new ValidationError([' + (__err) + ']); ';
                } else {
                  out += ' validate.errors = [' + (__err) + ']; return false; ';
                }
              } else {
                out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
              }
              out += ' } ';
            }
          }
          if ($breakOnError) {
            out += ' if (errors === ';
            if ($top) {
              out += '0';
            } else {
              out += 'errs_' + ($lvl);
            }
            out += ') { ';
            $closingBraces2 += '}';
          }
        }
      }
    }
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces2) + ' ';
  }
  if ($top) {
    if ($async) {
      out += ' if (errors === 0) return data;           ';
      out += ' else throw new ValidationError(vErrors); ';
    } else {
      out += ' validate.errors = vErrors; ';
      out += ' return errors === 0;       ';
    }
    out += ' }; return validate;';
  } else {
    out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';';
  }

  function $shouldUseGroup($rulesGroup) {
    var rules = $rulesGroup.rules;
    for (var i = 0; i < rules.length; i++)
      if ($shouldUseRule(rules[i])) return true;
  }

  function $shouldUseRule($rule) {
    return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule));
  }

  function $ruleImplementsSomeKeyword($rule) {
    var impl = $rule.implements;
    for (var i = 0; i < impl.length; i++)
      if (it.schema[impl[i]] !== undefined) return true;
  }
  return out;
}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{## def.setExclusiveLimit:
  $exclusive = true;
  $errorKeyword = $exclusiveKeyword;
  $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
#}}

{{
  var $isMax = $keyword == 'maximum'
    , $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum'
    , $schemaExcl = it.schema[$exclusiveKeyword]
    , $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data
    , $op = $isMax ? '<' : '>'
    , $notOp = $isMax ? '>' : '<'
    , $errorKeyword = undefined;

  if (!($isData || typeof $schema == 'number' || $schema === undefined)) {
    throw new Error($keyword + ' must be number');
  }
  if (!($isDataExcl || $schemaExcl === undefined
                    || typeof $schemaExcl == 'number'
                    || typeof $schemaExcl == 'boolean')) {
    throw new Error($exclusiveKeyword + ' must be number or boolean');
  }
}}

{{? $isDataExcl }}
  {{
    var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr)
      , $exclusive = 'exclusive' + $lvl
      , $exclType = 'exclType' + $lvl
      , $exclIsNumber = 'exclIsNumber' + $lvl
      , $opExpr = 'op' + $lvl
      , $opStr = '\' + ' + $opExpr + ' + \'';
  }}
  var schemaExcl{{=$lvl}} = {{=$schemaValueExcl}};
  {{ $schemaValueExcl = 'schemaExcl' + $lvl; }}

  var {{=$exclusive}};
  var {{=$exclType}} = typeof {{=$schemaValueExcl}};
  if ({{=$exclType}} != 'boolean' && {{=$exclType}} != 'undefined' && {{=$exclType}} != 'number') {
    {{ var $errorKeyword = $exclusiveKeyword; }}
    {{# def.error:'_exclusiveLimit' }}
  } else if ({{# def.$dataNotType:'number' }}
            {{=$exclType}} == 'number'
              ? (
                  ({{=$exclusive}} = {{=$schemaValue}} === undefined || {{=$schemaValueExcl}} {{=$op}}= {{=$schemaValue}})
                    ? {{=$data}} {{=$notOp}}= {{=$schemaValueExcl}}
                    : {{=$data}} {{=$notOp}} {{=$schemaValue}}
                )
              : (
                  ({{=$exclusive}} = {{=$schemaValueExcl}} === true)
                    ? {{=$data}} {{=$notOp}}= {{=$schemaValue}}
                    : {{=$data}} {{=$notOp}} {{=$schemaValue}}
                )
            || {{=$data}} !== {{=$data}}) {
    var op{{=$lvl}} = {{=$exclusive}} ? '{{=$op}}' : '{{=$op}}=';
    {{
      if ($schema === undefined) {
        $errorKeyword = $exclusiveKeyword;
        $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
        $schemaValue = $schemaValueExcl;
        $isData = $isDataExcl;
      }
    }}
{{??}}
  {{
    var $exclIsNumber = typeof $schemaExcl == 'number'
      , $opStr = $op;  /*used in error*/
  }}

  {{? $exclIsNumber && $isData }}
    {{ var $opExpr = '\'' + $opStr + '\''; /*used in error*/ }}
    if ({{# def.$dataNotType:'number' }}
        ( {{=$schemaValue}} === undefined
          || {{=$schemaExcl}} {{=$op}}= {{=$schemaValue}}
            ? {{=$data}} {{=$notOp}}= {{=$schemaExcl}}
            : {{=$data}} {{=$notOp}} {{=$schemaValue}} )
        || {{=$data}} !== {{=$data}}) {
  {{??}}
    {{
      if ($exclIsNumber && $schema === undefined) {
          {{# def.setExclusiveLimit }}
          $schemaValue = $schemaExcl;
          $notOp += '=';
      } else {
        if ($exclIsNumber)
          $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema);

        if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {
          {{# def.setExclusiveLimit }}
          $notOp += '=';
        } else {
          $exclusive = false;
          $opStr += '=';
        }
      }

      var $opExpr = '\'' + $opStr + '\''; /*used in error*/
    }}

    if ({{# def.$dataNotType:'number' }}
        {{=$data}} {{=$notOp}} {{=$schemaValue}}
        || {{=$data}} !== {{=$data}}) {
  {{?}}
{{?}}
    {{ $errorKeyword = $errorKeyword || $keyword; }}
    {{# def.error:'_limit' }}
  } {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{# def.numberKeyword }}

{{ var $op = $keyword == 'maxItems' ? '>' : '<'; }}
if ({{# def.$dataNotType:'number' }} {{=$data}}.length {{=$op}} {{=$schemaValue}}) {
  {{ var $errorKeyword = $keyword; }}
  {{# def.error:'_limitItems' }}
} {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{# def.numberKeyword }}

{{ var $op = $keyword == 'maxLength' ? '>' : '<'; }}
if ({{# def.$dataNotType:'number' }} {{# def.strLength }} {{=$op}} {{=$schemaValue}}) {
  {{ var $errorKeyword = $keyword; }}
  {{# def.error:'_limitLength' }}
} {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{# def.numberKeyword }}

{{ var $op = $keyword == 'maxProperties' ? '>' : '<'; }}
if ({{# def.$dataNotType:'number' }} Object.keys({{=$data}}).length {{=$op}} {{=$schemaValue}}) {
  {{ var $errorKeyword = $keyword; }}
  {{# def.error:'_limitProperties' }}
} {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}

{{
  var $currentBaseId = $it.baseId
    , $allSchemasEmpty = true;
}}

{{~ $schema:$sch:$i }}
  {{? {{# def.nonEmptySchema:$sch }} }}
    {{
      $allSchemasEmpty = false;
      $it.schema = $sch;
      $it.schemaPath = $schemaPath + '[' + $i + ']';
      $it.errSchemaPath = $errSchemaPath + '/' + $i;
    }}

    {{# def.insertSubschemaCode }}

    {{# def.ifResultValid }}
  {{?}}
{{~}}

{{? $breakOnError }}
  {{? $allSchemasEmpty }}
    if (true) {
  {{??}}
    {{= $closingBraces.slice(0,-1) }}
  {{?}}
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}

{{
  var $noEmptySchema = $schema.every(function($sch) {
    return {{# def.nonEmptySchema:$sch }};
  });
}}
{{? $noEmptySchema }}
  {{ var $currentBaseId = $it.baseId; }}
  var {{=$errs}} = errors;
  var {{=$valid}} = false;

  {{# def.setCompositeRule }}

  {{~ $schema:$sch:$i }}
    {{
      $it.schema = $sch;
      $it.schemaPath = $schemaPath + '[' + $i + ']';
      $it.errSchemaPath = $errSchemaPath + '/' + $i;
    }}

    {{# def.insertSubschemaCode }}

    {{=$valid}} = {{=$valid}} || {{=$nextValid}};

    if (!{{=$valid}}) {
    {{ $closingBraces += '}'; }}
  {{~}}

  {{# def.resetCompositeRule }}

  {{= $closingBraces }}

  if (!{{=$valid}}) {
    {{# def.extraError:'anyOf' }}
  } else {
    {{# def.resetErrors }}
  {{? it.opts.allErrors }} } {{?}}
{{??}}
  {{? $breakOnError }}
    if (true) {
  {{?}}
{{?}}
{{## def.coerceType:
  {{
    var $dataType = 'dataType' + $lvl
      , $coerced = 'coerced' + $lvl;
  }}
  var {{=$dataType}} = typeof {{=$data}};
  var {{=$coerced}} = undefined;

  {{? it.opts.coerceTypes == 'array' }}
    if ({{=$dataType}} == 'object' && Array.isArray({{=$data}}) && {{=$data}}.length == 1) {
      {{=$data}} = {{=$data}}[0];
      {{=$dataType}} = typeof {{=$data}};
      if ({{=it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)}}) {{=$coerced}} = {{=$data}};
    }
  {{?}}

  if ({{=$coerced}} !== undefined) ;
  {{~ $coerceToTypes:$type:$i }}
    {{? $type == 'string' }}
      else if ({{=$dataType}} == 'number' || {{=$dataType}} == 'boolean')
        {{=$coerced}} = '' + {{=$data}};
      else if ({{=$data}} === null) {{=$coerced}} = '';
    {{?? $type == 'number' || $type == 'integer' }}
      else if ({{=$dataType}} == 'boolean' || {{=$data}} === null
          || ({{=$dataType}} == 'string' && {{=$data}} && {{=$data}} == +{{=$data}}
          {{? $type == 'integer' }} && !({{=$data}} % 1){{?}}))
        {{=$coerced}} = +{{=$data}};
    {{?? $type == 'boolean' }}
      else if ({{=$data}} === 'false' || {{=$data}} === 0 || {{=$data}} === null)
        {{=$coerced}} = false;
      else if ({{=$data}} === 'true' || {{=$data}} === 1)
        {{=$coerced}} = true;
    {{?? $type == 'null' }}
      else if ({{=$data}} === '' || {{=$data}} === 0 || {{=$data}} === false)
        {{=$coerced}} = null;
    {{?? it.opts.coerceTypes == 'array' && $type == 'array' }}
      else if ({{=$dataType}} == 'string' || {{=$dataType}} == 'number' || {{=$dataType}} == 'boolean' || {{=$data}} == null)
        {{=$coerced}} = [{{=$data}}];
    {{?}}
  {{~}}
  else {
    {{# def.error:'type' }}
  }

  if ({{=$coerced}} !== undefined) {
    {{# def.setParentData }}
    {{=$data}} = {{=$coerced}};
    {{? !$dataLvl }}if ({{=$parentData}} !== undefined){{?}}
      {{=$parentData}}[{{=$parentDataProperty}}] = {{=$coerced}};
  }
#}}
{{# def.definitions }}
{{# def.setupKeyword }}

{{ var $comment = it.util.toQuotedString($schema); }}
{{? it.opts.$comment === true }}
  console.log({{=$comment}});
{{?? typeof it.opts.$comment == 'function' }}
  self._opts.$comment({{=$comment}}, {{=it.util.toQuotedString($errSchemaPath)}}, validate.root.schema);
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{? !$isData }}
  var schema{{=$lvl}} = validate.schema{{=$schemaPath}};
{{?}}
var {{=$valid}} = equal({{=$data}}, schema{{=$lvl}});
{{# def.checkError:'const' }}
{{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}


{{
  var $idx = 'i' + $lvl
    , $dataNxt = $it.dataLevel = it.dataLevel + 1
    , $nextData = 'data' + $dataNxt
    , $currentBaseId = it.baseId
    , $nonEmptySchema = {{# def.nonEmptySchema:$schema }};
}}

var {{=$errs}} = errors;
var {{=$valid}};

{{? $nonEmptySchema }}
  {{# def.setCompositeRule }}

  {{
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
  }}

  var {{=$nextValid}} = false;

  for (var {{=$idx}} = 0; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) {
    {{
      $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
      var $passData = $data + '[' + $idx + ']';
      $it.dataPathArr[$dataNxt] = $idx;
    }}

    {{# def.generateSubschemaCode }}
    {{# def.optimizeValidate }}

    if ({{=$nextValid}}) break;
  }

  {{# def.resetCompositeRule }}
  {{= $closingBraces }}

  if (!{{=$nextValid}}) {
{{??}}
  if ({{=$data}}.length == 0) {
{{?}}

    {{# def.error:'contains' }}
  } else {
    {{? $nonEmptySchema }}
      {{# def.resetErrors }}
    {{?}}
  {{? it.opts.allErrors }} } {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{
  var $rule = this
    , $definition = 'definition' + $lvl
    , $rDef = $rule.definition
    , $closingBraces = '';
  var $validate = $rDef.validate;
  var $compile, $inline, $macro, $ruleValidate, $validateCode;
}}

{{? $isData && $rDef.$data }}
  {{
    $validateCode = 'keywordValidate' + $lvl;
    var $validateSchema = $rDef.validateSchema;
  }}
  var {{=$definition}} = RULES.custom['{{=$keyword}}'].definition;
  var {{=$validateCode}} = {{=$definition}}.validate;
{{??}}
  {{
    $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it);
    if (!$ruleValidate) return;
    $schemaValue = 'validate.schema' + $schemaPath;
    $validateCode = $ruleValidate.code;
    $compile = $rDef.compile;
    $inline = $rDef.inline;
    $macro = $rDef.macro;
  }}
{{?}}

{{
  var $ruleErrs = $validateCode + '.errors'
    , $i = 'i' + $lvl
    , $ruleErr = 'ruleErr' + $lvl
    , $asyncKeyword = $rDef.async;

  if ($asyncKeyword && !it.async)
    throw new Error('async keyword in sync schema');
}}


{{? !($inline || $macro) }}{{=$ruleErrs}} = null;{{?}}
var {{=$errs}} = errors;
var {{=$valid}};

{{## def.callRuleValidate:
  {{=$validateCode}}.call(
    {{? it.opts.passContext }}this{{??}}self{{?}}
    {{? $compile || $rDef.schema === false }}
      , {{=$data}}
    {{??}}
      , {{=$schemaValue}}
      , {{=$data}}
      , validate.schema{{=it.schemaPath}}
    {{?}}
    , {{# def.dataPath }}
    {{# def.passParentData }}
    , rootData
  )
#}}

{{## def.extendErrors:_inline:
  for (var {{=$i}}={{=$errs}}; {{=$i}}<errors; {{=$i}}++) {
    var {{=$ruleErr}} = vErrors[{{=$i}}];
    if ({{=$ruleErr}}.dataPath === undefined)
      {{=$ruleErr}}.dataPath = (dataPath || '') + {{= it.errorPath }};
    {{# _inline ? 'if (\{\{=$ruleErr\}\}.schemaPath === undefined) {' : '' }}
      {{=$ruleErr}}.schemaPath = "{{=$errSchemaPath}}";
    {{# _inline ? '}' : '' }}
    {{? it.opts.verbose }}
      {{=$ruleErr}}.schema = {{=$schemaValue}};
      {{=$ruleErr}}.data = {{=$data}};
    {{?}}
  }
#}}


{{? $isData && $rDef.$data }}
  {{ $closingBraces += '}'; }}
  if ({{=$schemaValue}} === undefined) {
    {{=$valid}} = true;
  } else {
  {{? $validateSchema }}
    {{ $closingBraces += '}'; }}
    {{=$valid}} = {{=$definition}}.validateSchema({{=$schemaValue}});
    if ({{=$valid}}) {
  {{?}}
{{?}}

{{? $inline }}
  {{? $rDef.statements }}
    {{= $ruleValidate.validate }}
  {{??}}
    {{=$valid}} = {{= $ruleValidate.validate }};
  {{?}}
{{?? $macro }}
  {{# def.setupNextLevel }}
  {{
    $it.schema = $ruleValidate.validate;
    $it.schemaPath = '';
  }}
  {{# def.setCompositeRule }}
  {{ var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); }}
  {{# def.resetCompositeRule }}
  {{= $code }}
{{??}}
  {{# def.beginDefOut}}
    {{# def.callRuleValidate }}
  {{# def.storeDefOut:def_callRuleValidate }}

  {{? $rDef.errors === false }}
    {{=$valid}} = {{? $asyncKeyword }}await {{?}}{{= def_callRuleValidate }};
  {{??}}
    {{? $asyncKeyword }}
      {{ $ruleErrs = 'customErrors' + $lvl; }}
      var {{=$ruleErrs}} = null;
      try {
        {{=$valid}} = await {{= def_callRuleValidate }};
      } catch (e) {
        {{=$valid}} = false;
        if (e instanceof ValidationError) {{=$ruleErrs}} = e.errors;
        else throw e;
      }
    {{??}}
      {{=$ruleErrs}} = null;
      {{=$valid}} = {{= def_callRuleValidate }};
    {{?}}
  {{?}}
{{?}}

{{? $rDef.modifying }}
  if ({{=$parentData}}) {{=$data}} = {{=$parentData}}[{{=$parentDataProperty}}];
{{?}}

{{= $closingBraces }}

{{## def.notValidationResult:
  {{? $rDef.valid === undefined }}
    !{{? $macro }}{{=$nextValid}}{{??}}{{=$valid}}{{?}}
  {{??}}
    {{= !$rDef.valid }}
  {{?}}
#}}

{{? $rDef.valid }}
  {{? $breakOnError }} if (true) { {{?}}
{{??}}
  if ({{# def.notValidationResult }}) {
    {{ $errorKeyword = $rule.keyword; }}
    {{# def.beginDefOut}}
      {{# def.error:'custom' }}
    {{# def.storeDefOut:def_customError }}

    {{? $inline }}
      {{? $rDef.errors }}
        {{? $rDef.errors != 'full' }}
          {{# def.extendErrors:true }}
        {{?}}
      {{??}}
        {{? $rDef.errors === false}}
          {{= def_customError }}
        {{??}}
          if ({{=$errs}} == errors) {
            {{= def_customError }}
          } else {
            {{# def.extendErrors:true }}
          }
        {{?}}
      {{?}}
    {{?? $macro }}
      {{# def.extraError:'custom' }}
    {{??}}
      {{? $rDef.errors === false}}
        {{= def_customError }}
      {{??}}
        if (Array.isArray({{=$ruleErrs}})) {
          if (vErrors === null) vErrors = {{=$ruleErrs}};
          else vErrors = vErrors.concat({{=$ruleErrs}});
          errors = vErrors.length;
          {{# def.extendErrors:false }}
        } else {
          {{= def_customError }}
        }
      {{?}}
    {{?}}

  } {{? $breakOnError }} else { {{?}}
{{?}}
{{## def.assignDefault:
  {{? it.compositeRule }}
    {{
      if (it.opts.strictDefaults) {
        var $defaultMsg = 'default is ignored for: ' + $passData;
        if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
        else throw new Error($defaultMsg);
      }
    }}
  {{??}}
    if ({{=$passData}} === undefined
      {{? it.opts.useDefaults == 'empty' }}
        || {{=$passData}} === null
        || {{=$passData}} === ''
      {{?}}
    )
      {{=$passData}} = {{? it.opts.useDefaults == 'shared' }}
                         {{= it.useDefault($sch.default) }}
                       {{??}}
                         {{= JSON.stringify($sch.default) }}
                       {{?}};
  {{?}}
#}}


{{## def.defaultProperties:
  {{
    var $schema = it.schema.properties
      , $schemaKeys = Object.keys($schema); }}
  {{~ $schemaKeys:$propertyKey }}
    {{ var $sch = $schema[$propertyKey]; }}
    {{? $sch.default !== undefined }}
      {{ var $passData = $data + it.util.getProperty($propertyKey); }}
      {{# def.assignDefault }}
    {{?}}
  {{~}}
#}}


{{## def.defaultItems:
  {{~ it.schema.items:$sch:$i }}
    {{? $sch.default !== undefined }}
      {{ var $passData = $data + '[' + $i + ']'; }}
      {{# def.assignDefault }}
    {{?}}
  {{~}}
#}}
{{## def.setupKeyword:
  {{
    var $lvl = it.level;
    var $dataLvl = it.dataLevel;
    var $schema = it.schema[$keyword];
    var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
    var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
    var $breakOnError = !it.opts.allErrors;
    var $errorKeyword;

    var $data = 'data' + ($dataLvl || '');
    var $valid = 'valid' + $lvl;
    var $errs = 'errs__' + $lvl;
  }}
#}}


{{## def.setCompositeRule:
  {{
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
  }}
#}}


{{## def.resetCompositeRule:
  {{ it.compositeRule = $it.compositeRule = $wasComposite; }}
#}}


{{## def.setupNextLevel:
  {{
    var $it = it.util.copy(it);
    var $closingBraces = '';
    $it.level++;
    var $nextValid = 'valid' + $it.level;
  }}
#}}


{{## def.ifValid:
  {{? $breakOnError }}
    if ({{=$valid}}) {
    {{ $closingBraces += '}'; }}
  {{?}}
#}}


{{## def.ifResultValid:
  {{? $breakOnError }}
    if ({{=$nextValid}}) {
    {{ $closingBraces += '}'; }}
  {{?}}
#}}


{{## def.elseIfValid:
  {{? $breakOnError }}
    {{ $closingBraces += '}'; }}
    else {
  {{?}}
#}}


{{## def.nonEmptySchema:_schema:
  (it.opts.strictKeywords
    ? (typeof _schema == 'object' && Object.keys(_schema).length > 0)
      || _schema === false
    : it.util.schemaHasRules(_schema, it.RULES.all))
#}}


{{## def.strLength:
  {{? it.opts.unicode === false }}
    {{=$data}}.length
  {{??}}
    ucs2length({{=$data}})
  {{?}}
#}}


{{## def.willOptimize:
  it.util.varOccurences($code, $nextData) < 2
#}}


{{## def.generateSubschemaCode:
  {{
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
  }}
#}}


{{## def.insertSubschemaCode:
  {{= it.validate($it) }}
  {{ $it.baseId = $currentBaseId; }}
#}}


{{## def._optimizeValidate:
  it.util.varReplace($code, $nextData, $passData)
#}}


{{## def.optimizeValidate:
  {{? {{# def.willOptimize}} }}
    {{= {{# def._optimizeValidate }} }}
  {{??}}
    var {{=$nextData}} = {{=$passData}};
    {{= $code }}
  {{?}}
#}}


{{## def.$data:
  {{
    var $isData = it.opts.$data && $schema && $schema.$data
      , $schemaValue;
  }}
  {{? $isData }}
    var schema{{=$lvl}} = {{= it.util.getData($schema.$data, $dataLvl, it.dataPathArr) }};
    {{ $schemaValue = 'schema' + $lvl; }}
  {{??}}
    {{ $schemaValue = $schema; }}
  {{?}}
#}}


{{## def.$dataNotType:_type:
  {{?$isData}} ({{=$schemaValue}} !== undefined && typeof {{=$schemaValue}} != _type) || {{?}}
#}}


{{## def.check$dataIsArray:
  if (schema{{=$lvl}} === undefined) {{=$valid}} = true;
  else if (!Array.isArray(schema{{=$lvl}})) {{=$valid}} = false;
  else {
#}}


{{## def.numberKeyword:
  {{? !($isData || typeof $schema == 'number') }}
    {{ throw new Error($keyword + ' must be number'); }}
  {{?}}
#}}


{{## def.beginDefOut:
  {{
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
  }}
#}}


{{## def.storeDefOut:_variable:
  {{
    var _variable = out;
    out = $$outStack.pop();
  }}
#}}


{{## def.dataPath:(dataPath || ''){{? it.errorPath != '""'}} + {{= it.errorPath }}{{?}}#}}

{{## def.setParentData:
  {{
    var $parentData = $dataLvl ? 'data' + (($dataLvl-1)||'') : 'parentData'
      , $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
  }}
#}}

{{## def.passParentData:
  {{# def.setParentData }}
  , {{= $parentData }}
  , {{= $parentDataProperty }}
#}}


{{## def.iterateProperties:
  {{? $ownProperties }}
    {{=$dataProperties}} = {{=$dataProperties}} || Object.keys({{=$data}});
    for (var {{=$idx}}=0; {{=$idx}}<{{=$dataProperties}}.length; {{=$idx}}++) {
      var {{=$key}} = {{=$dataProperties}}[{{=$idx}}];
  {{??}}
    for (var {{=$key}} in {{=$data}}) {
  {{?}}
#}}


{{## def.noPropertyInData:
  {{=$useData}} === undefined
  {{? $ownProperties }}
    || !{{# def.isOwnProperty }}
  {{?}}
#}}


{{## def.isOwnProperty:
  Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($propertyKey)}}')
#}}
{{# def.definitions }}
{{# def.errors }}
{{# def.missing }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}


{{## def.propertyInData:
  {{=$data}}{{= it.util.getProperty($property) }} !== undefined
  {{? $ownProperties }}
    && Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($property)}}')
  {{?}}
#}}


{{
  var $schemaDeps = {}
    , $propertyDeps = {}
    , $ownProperties = it.opts.ownProperties;

  for ($property in $schema) {
    if ($property == '__proto__') continue;
    var $sch = $schema[$property];
    var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;
    $deps[$property] = $sch;
  }
}}

var {{=$errs}} = errors;

{{ var $currentErrorPath = it.errorPath; }}

var missing{{=$lvl}};
{{ for (var $property in $propertyDeps) { }}
  {{ $deps = $propertyDeps[$property]; }}
  {{? $deps.length }}
    if ({{# def.propertyInData }}
      {{? $breakOnError }}
          && ({{# def.checkMissingProperty:$deps }})) {
          {{# def.errorMissingProperty:'dependencies' }}
      {{??}}
        ) {
          {{~ $deps:$propertyKey }}
            {{# def.allErrorsMissingProperty:'dependencies' }}
          {{~}}
      {{?}}
    } {{# def.elseIfValid }}
  {{?}}
{{ } }}

{{
  it.errorPath = $currentErrorPath;
  var $currentBaseId = $it.baseId;
}}


{{ for (var $property in $schemaDeps) { }}
  {{ var $sch = $schemaDeps[$property]; }}
  {{? {{# def.nonEmptySchema:$sch }} }}
    {{=$nextValid}} = true;

    if ({{# def.propertyInData }}) {
      {{ 
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + it.util.getProperty($property);
        $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);
      }}

      {{# def.insertSubschemaCode }}
    }

    {{# def.ifResultValid }}
  {{?}}
{{ } }}

{{? $breakOnError }} 
  {{= $closingBraces }}
  if ({{=$errs}} == errors) {
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{
  var $i = 'i' + $lvl
    , $vSchema = 'schema' + $lvl;
}}

{{? !$isData }}
  var {{=$vSchema}} = validate.schema{{=$schemaPath}};
{{?}}
var {{=$valid}};

{{?$isData}}{{# def.check$dataIsArray }}{{?}}

{{=$valid}} = false;

for (var {{=$i}}=0; {{=$i}}<{{=$vSchema}}.length; {{=$i}}++)
  if (equal({{=$data}}, {{=$vSchema}}[{{=$i}}])) {
    {{=$valid}} = true;
    break;
  }

{{? $isData }}  }  {{?}}

{{# def.checkError:'enum' }}

{{? $breakOnError }} else { {{?}}
{{# def.definitions }}

{{## def._error:_rule:
  {{ 'istanbul ignore else'; }}
  {{? it.createErrors !== false }}
    {
      keyword: '{{= $errorKeyword || _rule }}'
      , dataPath: (dataPath || '') + {{= it.errorPath }}
      , schemaPath: {{=it.util.toQuotedString($errSchemaPath)}}
      , params: {{# def._errorParams[_rule] }}
      {{? it.opts.messages !== false }}
        , message: {{# def._errorMessages[_rule] }}
      {{?}}
      {{? it.opts.verbose }}
        , schema: {{# def._errorSchemas[_rule] }}
        , parentSchema: validate.schema{{=it.schemaPath}}
        , data: {{=$data}}
      {{?}}
    }
  {{??}}
    {}
  {{?}}
#}}


{{## def._addError:_rule:
  if (vErrors === null) vErrors = [err];
  else vErrors.push(err);
  errors++;
#}}


{{## def.addError:_rule:
  var err = {{# def._error:_rule }};
  {{# def._addError:_rule }}
#}}


{{## def.error:_rule:
  {{# def.beginDefOut}}
    {{# def._error:_rule }}
  {{# def.storeDefOut:__err }}

  {{? !it.compositeRule && $breakOnError }}
    {{ 'istanbul ignore if'; }}
    {{? it.async }}
      throw new ValidationError([{{=__err}}]);
    {{??}}
      validate.errors = [{{=__err}}];
      return false;
    {{?}}
  {{??}}
    var err = {{=__err}};
    {{# def._addError:_rule }}
  {{?}}
#}}


{{## def.extraError:_rule:
  {{# def.addError:_rule}}
  {{? !it.compositeRule && $breakOnError }}
    {{ 'istanbul ignore if'; }}
    {{? it.async }}
      throw new ValidationError(vErrors);
    {{??}}
      validate.errors = vErrors;
      return false;
    {{?}}
  {{?}}
#}}


{{## def.checkError:_rule:
  if (!{{=$valid}}) {
    {{# def.error:_rule }}
  }
#}}


{{## def.resetErrors:
  errors = {{=$errs}};
  if (vErrors !== null) {
    if ({{=$errs}}) vErrors.length = {{=$errs}};
    else vErrors = null;
  }
#}}


{{## def.concatSchema:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=$schema}}{{?}}#}}
{{## def.appendSchema:{{?$isData}}' + {{=$schemaValue}}{{??}}{{=$schemaValue}}'{{?}}#}}
{{## def.concatSchemaEQ:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=it.util.escapeQuotes($schema)}}{{?}}#}}

{{## def._errorMessages = {
  'false schema':  "'boolean schema is false'",
  $ref:            "'can\\\'t resolve reference {{=it.util.escapeQuotes($schema)}}'",
  additionalItems: "'should NOT have more than {{=$schema.length}} items'",
  additionalProperties: "'{{? it.opts._errorDataPathProperty }}is an invalid additional property{{??}}should NOT have additional properties{{?}}'",
  anyOf:           "'should match some schema in anyOf'",
  const:           "'should be equal to constant'",
  contains:        "'should contain a valid item'",
  dependencies:    "'should have {{? $deps.length == 1 }}property {{= it.util.escapeQuotes($deps[0]) }}{{??}}properties {{= it.util.escapeQuotes($deps.join(\", \")) }}{{?}} when property {{= it.util.escapeQuotes($property) }} is present'",
  'enum':          "'should be equal to one of the allowed values'",
  format:          "'should match format \"{{#def.concatSchemaEQ}}\"'",
  'if':            "'should match \"' + {{=$ifClause}} + '\" schema'",
  _limit:          "'should be {{=$opStr}} {{#def.appendSchema}}",
  _exclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'",
  _limitItems:     "'should NOT have {{?$keyword=='maxItems'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} items'",
  _limitLength:    "'should NOT be {{?$keyword=='maxLength'}}longer{{??}}shorter{{?}} than {{#def.concatSchema}} characters'",
  _limitProperties:"'should NOT have {{?$keyword=='maxProperties'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} properties'",
  multipleOf:      "'should be multiple of {{#def.appendSchema}}",
  not:             "'should NOT be valid'",
  oneOf:           "'should match exactly one schema in oneOf'",
  pattern:         "'should match pattern \"{{#def.concatSchemaEQ}}\"'",
  propertyNames:   "'property name \\'{{=$invalidName}}\\' is invalid'",
  required:        "'{{? it.opts._errorDataPathProperty }}is a required property{{??}}should have required property \\'{{=$missingProperty}}\\'{{?}}'",
  type:            "'should be {{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}'",
  uniqueItems:     "'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)'",
  custom:          "'should pass \"{{=$rule.keyword}}\" keyword validation'",
  patternRequired: "'should have property matching pattern \\'{{=$missingPattern}}\\''",
  switch:          "'should pass \"switch\" keyword validation'",
  _formatLimit:    "'should be {{=$opStr}} \"{{#def.concatSchemaEQ}}\"'",
  _formatExclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'"
} #}}


{{## def.schemaRefOrVal: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=$schema}}{{?}} #}}
{{## def.schemaRefOrQS: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}}

{{## def._errorSchemas = {
  'false schema':  "false",
  $ref:            "{{=it.util.toQuotedString($schema)}}",
  additionalItems: "false",
  additionalProperties: "false",
  anyOf:           "validate.schema{{=$schemaPath}}",
  const:           "validate.schema{{=$schemaPath}}",
  contains:        "validate.schema{{=$schemaPath}}",
  dependencies:    "validate.schema{{=$schemaPath}}",
  'enum':          "validate.schema{{=$schemaPath}}",
  format:          "{{#def.schemaRefOrQS}}",
  'if':            "validate.schema{{=$schemaPath}}",
  _limit:          "{{#def.schemaRefOrVal}}",
  _exclusiveLimit: "validate.schema{{=$schemaPath}}",
  _limitItems:     "{{#def.schemaRefOrVal}}",
  _limitLength:    "{{#def.schemaRefOrVal}}",
  _limitProperties:"{{#def.schemaRefOrVal}}",
  multipleOf:      "{{#def.schemaRefOrVal}}",
  not:             "validate.schema{{=$schemaPath}}",
  oneOf:           "validate.schema{{=$schemaPath}}",
  pattern:         "{{#def.schemaRefOrQS}}",
  propertyNames:   "validate.schema{{=$schemaPath}}",
  required:        "validate.schema{{=$schemaPath}}",
  type:            "validate.schema{{=$schemaPath}}",
  uniqueItems:     "{{#def.schemaRefOrVal}}",
  custom:          "validate.schema{{=$schemaPath}}",
  patternRequired: "validate.schema{{=$schemaPath}}",
  switch:          "validate.schema{{=$schemaPath}}",
  _formatLimit:    "{{#def.schemaRefOrQS}}",
  _formatExclusiveLimit: "validate.schema{{=$schemaPath}}"
} #}}


{{## def.schemaValueQS: {{?$isData}}{{=$schemaValue}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}}

{{## def._errorParams = {
  'false schema':  "{}",
  $ref:            "{ ref: '{{=it.util.escapeQuotes($schema)}}' }",
  additionalItems: "{ limit: {{=$schema.length}} }",
  additionalProperties: "{ additionalProperty: '{{=$additionalProperty}}' }",
  anyOf:           "{}",
  const:           "{ allowedValue: schema{{=$lvl}} }",
  contains:        "{}",
  dependencies:    "{ property: '{{= it.util.escapeQuotes($property) }}', missingProperty: '{{=$missingProperty}}', depsCount: {{=$deps.length}}, deps: '{{= it.util.escapeQuotes($deps.length==1 ? $deps[0] : $deps.join(\", \")) }}' }",
  'enum':          "{ allowedValues: schema{{=$lvl}} }",
  format:          "{ format: {{#def.schemaValueQS}} }",
  'if':            "{ failingKeyword: {{=$ifClause}} }",
  _limit:          "{ comparison: {{=$opExpr}}, limit: {{=$schemaValue}}, exclusive: {{=$exclusive}} }",
  _exclusiveLimit: "{}",
  _limitItems:     "{ limit: {{=$schemaValue}} }",
  _limitLength:    "{ limit: {{=$schemaValue}} }",
  _limitProperties:"{ limit: {{=$schemaValue}} }",
  multipleOf:      "{ multipleOf: {{=$schemaValue}} }",
  not:             "{}",
  oneOf:           "{ passingSchemas: {{=$passingSchemas}} }",
  pattern:         "{ pattern: {{#def.schemaValueQS}} }",
  propertyNames:   "{ propertyName: '{{=$invalidName}}' }",
  required:        "{ missingProperty: '{{=$missingProperty}}' }",
  type:            "{ type: '{{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}' }",
  uniqueItems:     "{ i: i, j: j }",
  custom:          "{ keyword: '{{=$rule.keyword}}' }",
  patternRequired: "{ missingPattern: '{{=$missingPattern}}' }",
  switch:          "{ caseIndex: {{=$caseIndex}} }",
  _formatLimit:    "{ comparison: {{=$opExpr}}, limit: {{#def.schemaValueQS}}, exclusive: {{=$exclusive}} }",
  _formatExclusiveLimit: "{}"
} #}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}

{{## def.skipFormat:
  {{? $breakOnError }} if (true) { {{?}}
  {{ return out; }}
#}}

{{? it.opts.format === false }}{{# def.skipFormat }}{{?}}


{{# def.$data }}


{{## def.$dataCheckFormat:
  {{# def.$dataNotType:'string' }}
  ({{? $unknownFormats != 'ignore' }}
     ({{=$schemaValue}} && !{{=$format}}
      {{? $allowUnknown }}
        && self._opts.unknownFormats.indexOf({{=$schemaValue}}) == -1
      {{?}}) ||
   {{?}}
   ({{=$format}} && {{=$formatType}} == '{{=$ruleType}}'
                 && !(typeof {{=$format}} == 'function'
                     ? {{? it.async}}
                        (async{{=$lvl}} ? await {{=$format}}({{=$data}}) : {{=$format}}({{=$data}}))
                       {{??}}
                        {{=$format}}({{=$data}})
                       {{?}}
                     : {{=$format}}.test({{=$data}}))))
#}}

{{## def.checkFormat:
  {{
    var $formatRef = 'formats' + it.util.getProperty($schema);
    if ($isObject) $formatRef += '.validate';
  }}
  {{? typeof $format == 'function' }}
    {{=$formatRef}}({{=$data}})
  {{??}}
    {{=$formatRef}}.test({{=$data}})
  {{?}}
#}}


{{
  var $unknownFormats = it.opts.unknownFormats
    , $allowUnknown = Array.isArray($unknownFormats);
}}

{{? $isData }}
  {{
    var $format = 'format' + $lvl
      , $isObject = 'isObject' + $lvl
      , $formatType = 'formatType' + $lvl;
  }}
  var {{=$format}} = formats[{{=$schemaValue}}];
  var {{=$isObject}} = typeof {{=$format}} == 'object'
                        && !({{=$format}} instanceof RegExp)
                        && {{=$format}}.validate;
  var {{=$formatType}} = {{=$isObject}} && {{=$format}}.type || 'string';
  if ({{=$isObject}}) {
    {{? it.async}}
      var async{{=$lvl}} = {{=$format}}.async;
    {{?}}
    {{=$format}} = {{=$format}}.validate;
  }
  if ({{# def.$dataCheckFormat }}) {
{{??}}
  {{ var $format = it.formats[$schema]; }}
  {{? !$format }}
    {{? $unknownFormats == 'ignore' }}
      {{ it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); }}
      {{# def.skipFormat }}
    {{?? $allowUnknown && $unknownFormats.indexOf($schema) >= 0 }}
      {{# def.skipFormat }}
    {{??}}
      {{ throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); }}
    {{?}}
  {{?}}
  {{
    var $isObject = typeof $format == 'object'
                    && !($format instanceof RegExp)
                    && $format.validate;
    var $formatType = $isObject && $format.type || 'string';
    if ($isObject) {
      var $async = $format.async === true;
      $format = $format.validate;
    }
  }}
  {{? $formatType != $ruleType }}
    {{# def.skipFormat }}
  {{?}}
  {{? $async }}
    {{
      if (!it.async) throw new Error('async format in sync schema');
      var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate';
    }}
    if (!(await {{=$formatRef}}({{=$data}}))) {
  {{??}}
    if (!{{# def.checkFormat }}) {
  {{?}}
{{?}}
    {{# def.error:'format' }}
  } {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}


{{## def.validateIfClause:_clause:
  {{
    $it.schema = it.schema['_clause'];
    $it.schemaPath = it.schemaPath + '._clause';
    $it.errSchemaPath = it.errSchemaPath + '/_clause';
  }}
  {{# def.insertSubschemaCode }}
  {{=$valid}} = {{=$nextValid}};
  {{? $thenPresent && $elsePresent }}
    {{ $ifClause = 'ifClause' + $lvl; }}
    var {{=$ifClause}} = '_clause';
  {{??}}
    {{ $ifClause = '\'_clause\''; }}
  {{?}}
#}}

{{
  var $thenSch = it.schema['then']
    , $elseSch = it.schema['else']
    , $thenPresent = $thenSch !== undefined && {{# def.nonEmptySchema:$thenSch }}
    , $elsePresent = $elseSch !== undefined && {{# def.nonEmptySchema:$elseSch }}
    , $currentBaseId = $it.baseId;
}}

{{? $thenPresent || $elsePresent }}
  {{
    var $ifClause;
    $it.createErrors = false;
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
  }}
  var {{=$errs}} = errors;
  var {{=$valid}} = true;

  {{# def.setCompositeRule }}
  {{# def.insertSubschemaCode }}
  {{ $it.createErrors = true; }}
  {{# def.resetErrors }}
  {{# def.resetCompositeRule }}

  {{? $thenPresent }}
    if ({{=$nextValid}}) {
      {{# def.validateIfClause:then }}
    }
    {{? $elsePresent }}
      else {
    {{?}}
  {{??}}
    if (!{{=$nextValid}}) {
  {{?}}

  {{? $elsePresent }}
      {{# def.validateIfClause:else }}
    }
  {{?}}

  if (!{{=$valid}}) {
    {{# def.extraError:'if' }}
  } 
  {{? $breakOnError }} else { {{?}}
{{??}}
  {{? $breakOnError }}
    if (true) {
  {{?}}
{{?}}

{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}


{{## def.validateItems:startFrom:
  for (var {{=$idx}} = {{=startFrom}}; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) {
    {{
      $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
      var $passData = $data + '[' + $idx + ']';
      $it.dataPathArr[$dataNxt] = $idx;
    }}

    {{# def.generateSubschemaCode }}
    {{# def.optimizeValidate }}

    {{? $breakOnError }}
      if (!{{=$nextValid}}) break;
    {{?}}
  }
#}}

{{
  var $idx = 'i' + $lvl
    , $dataNxt = $it.dataLevel = it.dataLevel + 1
    , $nextData = 'data' + $dataNxt
    , $currentBaseId = it.baseId;
}}

var {{=$errs}} = errors;
var {{=$valid}};

{{? Array.isArray($schema) }}
  {{ /* 'items' is an array of schemas */}}
  {{ var $additionalItems = it.schema.additionalItems; }}
  {{? $additionalItems === false }}
    {{=$valid}} = {{=$data}}.length <= {{= $schema.length }};
    {{
      var $currErrSchemaPath = $errSchemaPath;
      $errSchemaPath = it.errSchemaPath + '/additionalItems';      
    }}
    {{# def.checkError:'additionalItems' }}
    {{ $errSchemaPath = $currErrSchemaPath; }}
    {{# def.elseIfValid}}
  {{?}}

  {{~ $schema:$sch:$i }}
    {{? {{# def.nonEmptySchema:$sch }} }}
      {{=$nextValid}} = true;

      if ({{=$data}}.length > {{=$i}}) {
        {{
          var $passData = $data + '[' + $i + ']';
          $it.schema = $sch;
          $it.schemaPath = $schemaPath + '[' + $i + ']';
          $it.errSchemaPath = $errSchemaPath + '/' + $i;
          $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true);
          $it.dataPathArr[$dataNxt] = $i;
        }}

        {{# def.generateSubschemaCode }}
        {{# def.optimizeValidate }}
      }

      {{# def.ifResultValid }}
    {{?}}
  {{~}}

  {{? typeof $additionalItems == 'object' && {{# def.nonEmptySchema:$additionalItems }} }}
    {{
      $it.schema = $additionalItems;
      $it.schemaPath = it.schemaPath + '.additionalItems';
      $it.errSchemaPath = it.errSchemaPath + '/additionalItems';
    }}
    {{=$nextValid}} = true;

    if ({{=$data}}.length > {{= $schema.length }}) {
      {{# def.validateItems: $schema.length }}
    }

    {{# def.ifResultValid }}
  {{?}}

{{?? {{# def.nonEmptySchema:$schema }} }}
  {{ /* 'items' is a single schema */}}
  {{
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
  }}
  {{# def.validateItems: 0 }}
{{?}}

{{? $breakOnError }}
  {{= $closingBraces }}
  if ({{=$errs}} == errors) {
{{?}}
{{## def.checkMissingProperty:_properties:
  {{~ _properties:$propertyKey:$i }}
    {{?$i}} || {{?}}
    {{
      var $prop = it.util.getProperty($propertyKey)
        , $useData = $data + $prop;
    }}
    ( ({{# def.noPropertyInData }}) && (missing{{=$lvl}} = {{= it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop) }}) )
  {{~}}
#}}


{{## def.errorMissingProperty:_error:
  {{
    var $propertyPath = 'missing' + $lvl
      , $missingProperty = '\' + ' + $propertyPath + ' + \'';
    if (it.opts._errorDataPathProperty) {
      it.errorPath = it.opts.jsonPointers
                      ? it.util.getPathExpr($currentErrorPath,  $propertyPath, true)
                      : $currentErrorPath + ' + ' + $propertyPath;
    }
  }}
  {{# def.error:_error }}
#}}


{{## def.allErrorsMissingProperty:_error:
  {{
    var $prop = it.util.getProperty($propertyKey)
      , $missingProperty = it.util.escapeQuotes($propertyKey)
      , $useData = $data + $prop;
    if (it.opts._errorDataPathProperty) {
      it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
    }
  }}
  if ({{# def.noPropertyInData }}) {
    {{# def.addError:_error }}
  }
#}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{# def.numberKeyword }}

var division{{=$lvl}};
if ({{?$isData}}
      {{=$schemaValue}} !== undefined && (
      typeof {{=$schemaValue}} != 'number' ||
    {{?}}
      (division{{=$lvl}} = {{=$data}} / {{=$schemaValue}},
      {{? it.opts.multipleOfPrecision }}
        Math.abs(Math.round(division{{=$lvl}}) - division{{=$lvl}}) > 1e-{{=it.opts.multipleOfPrecision}}
      {{??}}
        division{{=$lvl}} !== parseInt(division{{=$lvl}})
      {{?}}
      )
    {{?$isData}}  )  {{?}} ) {
  {{# def.error:'multipleOf' }}
} {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}

{{? {{# def.nonEmptySchema:$schema }} }}
  {{
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
  }}

  var {{=$errs}} = errors;

  {{# def.setCompositeRule }}

  {{
    $it.createErrors = false;
    var $allErrorsOption;
    if ($it.opts.allErrors) {
      $allErrorsOption = $it.opts.allErrors;
      $it.opts.allErrors = false;
    }
  }}
  {{= it.validate($it) }}
  {{
    $it.createErrors = true;
    if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption;
  }}

  {{# def.resetCompositeRule }}

  if ({{=$nextValid}}) {
    {{# def.error:'not' }}
  } else {
    {{# def.resetErrors }}
  {{? it.opts.allErrors }} } {{?}}
{{??}}
  {{# def.addError:'not' }}
  {{? $breakOnError}}
    if (false) {
  {{?}}
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}

{{
  var $currentBaseId = $it.baseId
    , $prevValid = 'prevValid' + $lvl
    , $passingSchemas = 'passingSchemas' + $lvl;
}}

var {{=$errs}} = errors
  , {{=$prevValid}} = false
  , {{=$valid}} = false
  , {{=$passingSchemas}} = null;

{{# def.setCompositeRule }}

{{~ $schema:$sch:$i }}
  {{? {{# def.nonEmptySchema:$sch }} }}
    {{
      $it.schema = $sch;
      $it.schemaPath = $schemaPath + '[' + $i + ']';
      $it.errSchemaPath = $errSchemaPath + '/' + $i;
    }}

    {{# def.insertSubschemaCode }}
  {{??}}
    var {{=$nextValid}} = true;
  {{?}}

  {{? $i }}
    if ({{=$nextValid}} && {{=$prevValid}}) {
      {{=$valid}} = false;
      {{=$passingSchemas}} = [{{=$passingSchemas}}, {{=$i}}];
    } else {
    {{ $closingBraces += '}'; }}
  {{?}}

    if ({{=$nextValid}}) {
      {{=$valid}} = {{=$prevValid}} = true;
      {{=$passingSchemas}} = {{=$i}};
    }
{{~}}

{{# def.resetCompositeRule }}

{{= $closingBraces }}

if (!{{=$valid}}) {
  {{# def.extraError:'oneOf' }}
} else {
  {{# def.resetErrors }}
{{? it.opts.allErrors }} } {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}

{{
  var $regexp = $isData
                ? '(new RegExp(' + $schemaValue + '))'
                : it.usePattern($schema);
}}

if ({{# def.$dataNotType:'string' }} !{{=$regexp}}.test({{=$data}}) ) {
  {{# def.error:'pattern' }}
} {{? $breakOnError }} else { {{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}


{{## def.validateAdditional:
  {{ /* additionalProperties is schema */
    $it.schema = $aProperties;
    $it.schemaPath = it.schemaPath + '.additionalProperties';
    $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';
    $it.errorPath = it.opts._errorDataPathProperty
                    ? it.errorPath
                    : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
    var $passData = $data + '[' + $key + ']';
    $it.dataPathArr[$dataNxt] = $key;
  }}

  {{# def.generateSubschemaCode }}
  {{# def.optimizeValidate }}
#}}


{{
  var $key = 'key' + $lvl
    , $idx = 'idx' + $lvl
    , $dataNxt = $it.dataLevel = it.dataLevel + 1
    , $nextData = 'data' + $dataNxt
    , $dataProperties = 'dataProperties' + $lvl;

  var $schemaKeys = Object.keys($schema || {}).filter(notProto)
    , $pProperties = it.schema.patternProperties || {}
    , $pPropertyKeys = Object.keys($pProperties).filter(notProto)
    , $aProperties = it.schema.additionalProperties
    , $someProperties = $schemaKeys.length || $pPropertyKeys.length
    , $noAdditional = $aProperties === false
    , $additionalIsSchema = typeof $aProperties == 'object'
                              && Object.keys($aProperties).length
    , $removeAdditional = it.opts.removeAdditional
    , $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional
    , $ownProperties = it.opts.ownProperties
    , $currentBaseId = it.baseId;

  var $required = it.schema.required;
  if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) {
    var $requiredHash = it.util.toHash($required);
  }

  function notProto(p) { return p !== '__proto__'; }
}}


var {{=$errs}} = errors;
var {{=$nextValid}} = true;
{{? $ownProperties }}
  var {{=$dataProperties}} = undefined;
{{?}}

{{? $checkAdditional }}
  {{# def.iterateProperties }}
    {{? $someProperties }}
      var isAdditional{{=$lvl}} = !(false
        {{? $schemaKeys.length }}
          {{? $schemaKeys.length > 8 }}
            || validate.schema{{=$schemaPath}}.hasOwnProperty({{=$key}})
          {{??}}
            {{~ $schemaKeys:$propertyKey }}
              || {{=$key}} == {{= it.util.toQuotedString($propertyKey) }}
            {{~}}
          {{?}}
        {{?}}
        {{? $pPropertyKeys.length }}
          {{~ $pPropertyKeys:$pProperty:$i }}
            || {{= it.usePattern($pProperty) }}.test({{=$key}})
          {{~}}
        {{?}}
      );

      if (isAdditional{{=$lvl}}) {
    {{?}}
    {{? $removeAdditional == 'all' }}
      delete {{=$data}}[{{=$key}}];
    {{??}}
      {{
        var $currentErrorPath = it.errorPath;
        var $additionalProperty = '\' + ' + $key + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
        }
      }}
      {{? $noAdditional }}
        {{? $removeAdditional }}
          delete {{=$data}}[{{=$key}}];
        {{??}}
          {{=$nextValid}} = false;
          {{
            var $currErrSchemaPath = $errSchemaPath;
            $errSchemaPath = it.errSchemaPath + '/additionalProperties';
          }}
          {{# def.error:'additionalProperties' }}
          {{ $errSchemaPath = $currErrSchemaPath; }}
          {{? $breakOnError }} break; {{?}}
        {{?}}
      {{?? $additionalIsSchema }}
        {{? $removeAdditional == 'failing' }}
          var {{=$errs}} = errors;
          {{# def.setCompositeRule }}

          {{# def.validateAdditional }}

          if (!{{=$nextValid}}) {
            errors = {{=$errs}};
            if (validate.errors !== null) {
              if (errors) validate.errors.length = errors;
              else validate.errors = null;
            }
            delete {{=$data}}[{{=$key}}];
          }

          {{# def.resetCompositeRule }}
        {{??}}
          {{# def.validateAdditional }}
          {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}}
        {{?}}
      {{?}}
      {{ it.errorPath = $currentErrorPath; }}
    {{?}}
    {{? $someProperties }}
      }
    {{?}}
  }

  {{# def.ifResultValid }}
{{?}}

{{ var $useDefaults = it.opts.useDefaults && !it.compositeRule; }}

{{? $schemaKeys.length }}
  {{~ $schemaKeys:$propertyKey }}
    {{ var $sch = $schema[$propertyKey]; }}

    {{? {{# def.nonEmptySchema:$sch}} }}
      {{
        var $prop = it.util.getProperty($propertyKey)
          , $passData = $data + $prop
          , $hasDefault = $useDefaults && $sch.default !== undefined;
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + $prop;
        $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey);
        $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);
        $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);
      }}

      {{# def.generateSubschemaCode }}

      {{? {{# def.willOptimize }} }}
        {{
          $code = {{# def._optimizeValidate }};
          var $useData = $passData;
        }}
      {{??}}
        {{ var $useData = $nextData; }}
        var {{=$nextData}} = {{=$passData}};
      {{?}}

      {{? $hasDefault }}
        {{= $code }}
      {{??}}
        {{? $requiredHash && $requiredHash[$propertyKey] }}
          if ({{# def.noPropertyInData }}) {
            {{=$nextValid}} = false;
            {{
              var $currentErrorPath = it.errorPath
                , $currErrSchemaPath = $errSchemaPath
                , $missingProperty = it.util.escapeQuotes($propertyKey);
              if (it.opts._errorDataPathProperty) {
                it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
              }
              $errSchemaPath = it.errSchemaPath + '/required';
            }}
            {{# def.error:'required' }}
            {{ $errSchemaPath = $currErrSchemaPath; }}
            {{ it.errorPath = $currentErrorPath; }}
          } else {
        {{??}}
          {{? $breakOnError }}
            if ({{# def.noPropertyInData }}) {
              {{=$nextValid}} = true;
            } else {
          {{??}}
            if ({{=$useData}} !== undefined
              {{? $ownProperties }}
                && {{# def.isOwnProperty }}
              {{?}}
            ) {
          {{?}}
        {{?}}

          {{= $code }}
        }
      {{?}}  {{ /* $hasDefault */ }}
    {{?}} {{ /* def.nonEmptySchema */ }}

    {{# def.ifResultValid }}
  {{~}}
{{?}}

{{? $pPropertyKeys.length }}
  {{~ $pPropertyKeys:$pProperty }}
    {{ var $sch = $pProperties[$pProperty]; }}

    {{? {{# def.nonEmptySchema:$sch}} }}
      {{
        $it.schema = $sch;
        $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty);
        $it.errSchemaPath = it.errSchemaPath + '/patternProperties/'
                                             + it.util.escapeFragment($pProperty);
      }}

      {{# def.iterateProperties }}
        if ({{= it.usePattern($pProperty) }}.test({{=$key}})) {
          {{
            $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
            var $passData = $data + '[' + $key + ']';
            $it.dataPathArr[$dataNxt] = $key;
          }}

          {{# def.generateSubschemaCode }}
          {{# def.optimizeValidate }}

          {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}}
        }
        {{? $breakOnError }} else {{=$nextValid}} = true; {{?}}
      }

      {{# def.ifResultValid }}
    {{?}} {{ /* def.nonEmptySchema */ }}
  {{~}}
{{?}}


{{? $breakOnError }}
  {{= $closingBraces }}
  if ({{=$errs}} == errors) {
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}

var {{=$errs}} = errors;

{{? {{# def.nonEmptySchema:$schema }} }}
  {{
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
  }}

  {{
    var $key = 'key' + $lvl
      , $idx = 'idx' + $lvl
      , $i = 'i' + $lvl
      , $invalidName = '\' + ' + $key + ' + \''
      , $dataNxt = $it.dataLevel = it.dataLevel + 1
      , $nextData = 'data' + $dataNxt
      , $dataProperties = 'dataProperties' + $lvl
      , $ownProperties = it.opts.ownProperties
      , $currentBaseId = it.baseId;
  }}

  {{? $ownProperties }}
    var {{=$dataProperties}} = undefined;
  {{?}}
  {{# def.iterateProperties }}
    var startErrs{{=$lvl}} = errors;

    {{ var $passData = $key; }}
    {{# def.setCompositeRule }}
    {{# def.generateSubschemaCode }}
    {{# def.optimizeValidate }}
    {{# def.resetCompositeRule }}

    if (!{{=$nextValid}}) {
      for (var {{=$i}}=startErrs{{=$lvl}}; {{=$i}}<errors; {{=$i}}++) {
        vErrors[{{=$i}}].propertyName = {{=$key}};
      }
      {{# def.extraError:'propertyNames' }}
      {{? $breakOnError }} break; {{?}}
    }
  }
{{?}}

{{? $breakOnError }}
  {{= $closingBraces }}
  if ({{=$errs}} == errors) {
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}

{{## def._validateRef:_v:
  {{? it.opts.passContext }}
    {{=_v}}.call(this,
  {{??}}
    {{=_v}}(
  {{?}}
    {{=$data}}, {{# def.dataPath }}{{# def.passParentData }}, rootData)
#}}

{{ var $async, $refCode; }}
{{? $schema == '#' || $schema == '#/' }}
  {{
    if (it.isRoot) {
      $async = it.async;
      $refCode = 'validate';
    } else {
      $async = it.root.schema.$async === true;
      $refCode = 'root.refVal[0]';
    }
  }}
{{??}}
  {{ var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot); }}
  {{? $refVal === undefined }}
    {{ var $message = it.MissingRefError.message(it.baseId, $schema); }}
    {{? it.opts.missingRefs == 'fail' }}
      {{ it.logger.error($message); }}
      {{# def.error:'$ref' }}
      {{? $breakOnError }} if (false) { {{?}}
    {{?? it.opts.missingRefs == 'ignore' }}
      {{ it.logger.warn($message); }}
      {{? $breakOnError }} if (true) { {{?}}
    {{??}}
      {{ throw new it.MissingRefError(it.baseId, $schema, $message); }}
    {{?}}
  {{?? $refVal.inline }}
    {{# def.setupNextLevel }}
    {{
      $it.schema = $refVal.schema;
      $it.schemaPath = '';
      $it.errSchemaPath = $schema;
    }}
    {{ var $code = it.validate($it).replace(/validate\.schema/g, $refVal.code); }}
    {{= $code }}
    {{? $breakOnError}}
      if ({{=$nextValid}}) {
    {{?}}
  {{??}}
    {{
      $async = $refVal.$async === true || (it.async && $refVal.$async !== false);
      $refCode = $refVal.code;
    }}
  {{?}}
{{?}}

{{? $refCode }}
  {{# def.beginDefOut}}
    {{# def._validateRef:$refCode }}
  {{# def.storeDefOut:__callValidate }}

  {{? $async }}
    {{ if (!it.async) throw new Error('async schema referenced by sync schema'); }}
    {{? $breakOnError }} var {{=$valid}}; {{?}}
    try {
      await {{=__callValidate}};
      {{? $breakOnError }} {{=$valid}} = true; {{?}}
    } catch (e) {
      if (!(e instanceof ValidationError)) throw e;
      if (vErrors === null) vErrors = e.errors;
      else vErrors = vErrors.concat(e.errors);
      errors = vErrors.length;
      {{? $breakOnError }} {{=$valid}} = false; {{?}}
    }
    {{? $breakOnError }} if ({{=$valid}}) { {{?}}
  {{??}}
    if (!{{=__callValidate}}) {
      if (vErrors === null) vErrors = {{=$refCode}}.errors;
      else vErrors = vErrors.concat({{=$refCode}}.errors);
      errors = vErrors.length;
    } {{? $breakOnError }} else { {{?}}
  {{?}}
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.missing }}
{{# def.setupKeyword }}
{{# def.$data }}

{{ var $vSchema = 'schema' + $lvl; }}

{{## def.setupLoop:
  {{? !$isData }}
    var {{=$vSchema}} = validate.schema{{=$schemaPath}};
  {{?}}

  {{
    var $i = 'i' + $lvl
      , $propertyPath = 'schema' + $lvl + '[' + $i + ']'
      , $missingProperty = '\' + ' + $propertyPath + ' + \'';
    if (it.opts._errorDataPathProperty) {
      it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);
    }
  }}
#}}


{{## def.isRequiredOwnProperty:
  Object.prototype.hasOwnProperty.call({{=$data}}, {{=$vSchema}}[{{=$i}}])
#}}


{{? !$isData }}
  {{? $schema.length < it.opts.loopRequired &&
      it.schema.properties && Object.keys(it.schema.properties).length }}
    {{ var $required = []; }}
    {{~ $schema:$property }}
      {{ var $propertySch = it.schema.properties[$property]; }}
      {{? !($propertySch && {{# def.nonEmptySchema:$propertySch}}) }}
        {{ $required[$required.length] = $property; }}
      {{?}}
    {{~}}
  {{??}}
    {{ var $required = $schema; }}
  {{?}}
{{?}}


{{? $isData || $required.length }}
  {{
    var $currentErrorPath = it.errorPath
      , $loopRequired = $isData || $required.length >= it.opts.loopRequired
      , $ownProperties = it.opts.ownProperties;
  }}

  {{? $breakOnError }}
    var missing{{=$lvl}};
    {{? $loopRequired }}
      {{# def.setupLoop }}
      var {{=$valid}} = true;

      {{?$isData}}{{# def.check$dataIsArray }}{{?}}

      for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) {
        {{=$valid}} = {{=$data}}[{{=$vSchema}}[{{=$i}}]] !== undefined
                      {{? $ownProperties }}
                        && {{# def.isRequiredOwnProperty }}
                      {{?}};
        if (!{{=$valid}}) break;
      }

      {{? $isData }}  }  {{?}}

      {{# def.checkError:'required' }}
      else {
    {{??}}
      if ({{# def.checkMissingProperty:$required }}) {
        {{# def.errorMissingProperty:'required' }}
      } else {
    {{?}}
  {{??}}
    {{? $loopRequired }}
      {{# def.setupLoop }}
      {{? $isData }}
        if ({{=$vSchema}} && !Array.isArray({{=$vSchema}})) {
          {{# def.addError:'required' }}
        } else if ({{=$vSchema}} !== undefined) {
      {{?}}

      for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) {
        if ({{=$data}}[{{=$vSchema}}[{{=$i}}]] === undefined
            {{? $ownProperties }}
              || !{{# def.isRequiredOwnProperty }}
            {{?}}) {
          {{# def.addError:'required' }}
        }
      }

      {{? $isData }}  }  {{?}}
    {{??}}
      {{~ $required:$propertyKey }}
        {{# def.allErrorsMissingProperty:'required' }}
      {{~}}
    {{?}}
  {{?}}

  {{ it.errorPath = $currentErrorPath; }}

{{?? $breakOnError }}
  if (true) {
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.$data }}


{{? ($schema || $isData) && it.opts.uniqueItems !== false }}
  {{? $isData }}
    var {{=$valid}};
    if ({{=$schemaValue}} === false || {{=$schemaValue}} === undefined)
      {{=$valid}} = true;
    else if (typeof {{=$schemaValue}} != 'boolean')
      {{=$valid}} = false;
    else {
  {{?}}

  var i = {{=$data}}.length
    , {{=$valid}} = true
    , j;
  if (i > 1) {
    {{
      var $itemType = it.schema.items && it.schema.items.type
        , $typeIsArray = Array.isArray($itemType);
    }}
    {{? !$itemType || $itemType == 'object' || $itemType == 'array' ||
        ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0)) }}
      outer:
      for (;i--;) {
        for (j = i; j--;) {
          if (equal({{=$data}}[i], {{=$data}}[j])) {
            {{=$valid}} = false;
            break outer;
          }
        }
      }
    {{??}}
      var itemIndices = {}, item;
      for (;i--;) {
        var item = {{=$data}}[i];
        {{ var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); }}
        if ({{= it.util[$method]($itemType, 'item', it.opts.strictNumbers, true) }}) continue;
        {{? $typeIsArray}}
          if (typeof item == 'string') item = '"' + item;
        {{?}}
        if (typeof itemIndices[item] == 'number') {
          {{=$valid}} = false;
          j = itemIndices[item];
          break;
        }
        itemIndices[item] = i;
      }
    {{?}}
  }

  {{? $isData }}  }  {{?}}

  if (!{{=$valid}}) {
    {{# def.error:'uniqueItems' }}
  } {{? $breakOnError }} else { {{?}}
{{??}}
  {{? $breakOnError }} if (true) { {{?}}
{{?}}
{{# def.definitions }}
{{# def.errors }}
{{# def.defaults }}
{{# def.coerce }}

{{ /**
    * schema compilation (render) time:
    * it = { schema, RULES, _validate, opts }
    * it.validate - this template function,
    *   it is used recursively to generate code for subschemas
    *
    * runtime:
    * "validate" is a variable name to which this function will be assigned
    * validateRef etc. are defined in the parent scope in index.js
    */ }}

{{
  var $async = it.schema.$async === true
    , $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref')
    , $id = it.self._getId(it.schema);
}}

{{
  if (it.opts.strictKeywords) {
    var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords);
    if ($unknownKwd) {
      var $keywordsMsg = 'unknown keyword: ' + $unknownKwd;
      if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg);
      else throw new Error($keywordsMsg);
    }
  }
}}

{{? it.isTop }}
  var validate = {{?$async}}{{it.async = true;}}async {{?}}function(data, dataPath, parentData, parentDataProperty, rootData) {
    'use strict';
    {{? $id && (it.opts.sourceCode || it.opts.processCode) }}
      {{= '/\*# sourceURL=' + $id + ' */' }}
    {{?}}
{{?}}

{{? typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref) }}
  {{ var $keyword = 'false schema'; }}
  {{# def.setupKeyword }}
  {{? it.schema === false}}
    {{? it.isTop}}
      {{ $breakOnError = true; }}
    {{??}}
      var {{=$valid}} = false;
    {{?}}
    {{# def.error:'false schema' }}
  {{??}}
    {{? it.isTop}}
      {{? $async }}
        return data;
      {{??}}
        validate.errors = null;
        return true;
      {{?}}
    {{??}}
      var {{=$valid}} = true;
    {{?}}
  {{?}}

  {{? it.isTop}}
    };
    return validate;
  {{?}}

  {{ return out; }}
{{?}}


{{? it.isTop }}
  {{
    var $top = it.isTop
      , $lvl = it.level = 0
      , $dataLvl = it.dataLevel = 0
      , $data = 'data';
    it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));
    it.baseId = it.baseId || it.rootId;
    delete it.isTop;

    it.dataPathArr = [""];

    if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) {
      var $defaultMsg = 'default is ignored in the schema root';
      if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
      else throw new Error($defaultMsg);
    }
  }}

  var vErrors = null; {{ /* don't edit, used in replace */ }}
  var errors = 0;     {{ /* don't edit, used in replace */ }}
  if (rootData === undefined) rootData = data; {{ /* don't edit, used in replace */ }}
{{??}}
  {{
    var $lvl = it.level
      , $dataLvl = it.dataLevel
      , $data = 'data' + ($dataLvl || '');

    if ($id) it.baseId = it.resolve.url(it.baseId, $id);

    if ($async && !it.async) throw new Error('async schema in sync schema');
  }}

  var errs_{{=$lvl}} = errors;
{{?}}

{{
  var $valid = 'valid' + $lvl
    , $breakOnError = !it.opts.allErrors
    , $closingBraces1 = ''
    , $closingBraces2 = '';

  var $errorKeyword;
  var $typeSchema = it.schema.type
    , $typeIsArray = Array.isArray($typeSchema);

  if ($typeSchema && it.opts.nullable && it.schema.nullable === true) {
    if ($typeIsArray) {
      if ($typeSchema.indexOf('null') == -1)
        $typeSchema = $typeSchema.concat('null');
    } else if ($typeSchema != 'null') {
      $typeSchema = [$typeSchema, 'null'];
      $typeIsArray = true;
    }
  }

  if ($typeIsArray && $typeSchema.length == 1) {
    $typeSchema = $typeSchema[0];
    $typeIsArray = false;
  }
}}

{{## def.checkType:
  {{
    var $schemaPath = it.schemaPath + '.type'
      , $errSchemaPath = it.errSchemaPath + '/type'
      , $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType';
  }}

  if ({{= it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true) }}) {
#}}

{{? it.schema.$ref && $refKeywords }}
  {{? it.opts.extendRefs == 'fail' }}
    {{ throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); }}
  {{?? it.opts.extendRefs !== true }}
    {{
      $refKeywords = false;
      it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"');
    }}
  {{?}}
{{?}}

{{? it.schema.$comment && it.opts.$comment }}
  {{= it.RULES.all.$comment.code(it, '$comment') }}
{{?}}

{{? $typeSchema }}
  {{? it.opts.coerceTypes }}
    {{ var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); }}
  {{?}}

  {{ var $rulesGroup = it.RULES.types[$typeSchema]; }}
  {{? $coerceToTypes || $typeIsArray || $rulesGroup === true ||
    ($rulesGroup && !$shouldUseGroup($rulesGroup)) }}
    {{
      var $schemaPath = it.schemaPath + '.type'
        , $errSchemaPath = it.errSchemaPath + '/type';
    }}
    {{# def.checkType }}
      {{? $coerceToTypes }}
        {{# def.coerceType }}
      {{??}}
        {{# def.error:'type' }}
      {{?}}
    }
  {{?}}
{{?}}


{{? it.schema.$ref && !$refKeywords }}
  {{= it.RULES.all.$ref.code(it, '$ref') }}
  {{? $breakOnError }}
    }
    if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) {
    {{ $closingBraces2 += '}'; }}
  {{?}}
{{??}}
  {{~ it.RULES:$rulesGroup }}
    {{? $shouldUseGroup($rulesGroup) }}
      {{? $rulesGroup.type }}
        if ({{= it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers) }}) {
      {{?}}
        {{? it.opts.useDefaults }}
          {{? $rulesGroup.type == 'object' && it.schema.properties }}
            {{# def.defaultProperties }}
          {{?? $rulesGroup.type == 'array' && Array.isArray(it.schema.items) }}
            {{# def.defaultItems }}
          {{?}}
        {{?}}
        {{~ $rulesGroup.rules:$rule }}
          {{? $shouldUseRule($rule) }}
            {{ var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); }}
            {{? $code }}
              {{= $code }}
              {{? $breakOnError }}
                {{ $closingBraces1 += '}'; }}
              {{?}}
            {{?}}
          {{?}}
        {{~}}
        {{? $breakOnError }}
          {{= $closingBraces1 }}
          {{ $closingBraces1 = ''; }}
        {{?}}
      {{? $rulesGroup.type }}
        }
        {{? $typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes }}
          else {
            {{
              var $schemaPath = it.schemaPath + '.type'
                , $errSchemaPath = it.errSchemaPath + '/type';
            }}
            {{# def.error:'type' }}
          }
        {{?}}
      {{?}}

      {{? $breakOnError }}
        if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) {
        {{ $closingBraces2 += '}'; }}
      {{?}}
    {{?}}
  {{~}}
{{?}}

{{? $breakOnError }} {{= $closingBraces2 }} {{?}}

{{? $top }}
    {{? $async }}
      if (errors === 0) return data;           {{ /* don't edit, used in replace */ }}
      else throw new ValidationError(vErrors); {{ /* don't edit, used in replace */ }}
    {{??}}
      validate.errors = vErrors; {{ /* don't edit, used in replace */ }}
      return errors === 0;       {{ /* don't edit, used in replace */ }}
    {{?}}
  };

  return validate;
{{??}}
  var {{=$valid}} = errors === errs_{{=$lvl}};
{{?}}

{{
  function $shouldUseGroup($rulesGroup) {
    var rules = $rulesGroup.rules;
    for (var i=0; i < rules.length; i++)
      if ($shouldUseRule(rules[i]))
        return true;
  }

  function $shouldUseRule($rule) {
    return it.schema[$rule.keyword] !== undefined ||
           ($rule.implements && $ruleImplementsSomeKeyword($rule));
  }

  function $ruleImplementsSomeKeyword($rule) {
    var impl = $rule.implements;
    for (var i=0; i < impl.length; i++)
      if (it.schema[impl[i]] !== undefined)
        return true;
  }
}}
'use strict';

var MissingRefError = require('./error_classes').MissingRef;

module.exports = compileAsync;


/**
 * Creates validating function for passed schema with asynchronous loading of missing schemas.
 * `loadSchema` option should be a function that accepts schema uri and returns promise that resolves with the schema.
 * @this  Ajv
 * @param {Object}   schema schema object
 * @param {Boolean}  meta optional true to compile meta-schema; this parameter can be skipped
 * @param {Function} callback an optional node-style callback, it is called with 2 parameters: error (or null) and validating function.
 * @return {Promise} promise that resolves with a validating function.
 */
function compileAsync(schema, meta, callback) {
  /* eslint no-shadow: 0 */
  /* global Promise */
  /* jshint validthis: true */
  var self = this;
  if (typeof this._opts.loadSchema != 'function')
    throw new Error('options.loadSchema should be a function');

  if (typeof meta == 'function') {
    callback = meta;
    meta = undefined;
  }

  var p = loadMetaSchemaOf(schema).then(function () {
    var schemaObj = self._addSchema(schema, undefined, meta);
    return schemaObj.validate || _compileAsync(schemaObj);
  });

  if (callback) {
    p.then(
      function(v) { callback(null, v); },
      callback
    );
  }

  return p;


  function loadMetaSchemaOf(sch) {
    var $schema = sch.$schema;
    return $schema && !self.getSchema($schema)
            ? compileAsync.call(self, { $ref: $schema }, true)
            : Promise.resolve();
  }


  function _compileAsync(schemaObj) {
    try { return self._compile(schemaObj); }
    catch(e) {
      if (e instanceof MissingRefError) return loadMissingSchema(e);
      throw e;
    }


    function loadMissingSchema(e) {
      var ref = e.missingSchema;
      if (added(ref)) throw new Error('Schema ' + ref + ' is loaded but ' + e.missingRef + ' cannot be resolved');

      var schemaPromise = self._loadingSchemas[ref];
      if (!schemaPromise) {
        schemaPromise = self._loadingSchemas[ref] = self._opts.loadSchema(ref);
        schemaPromise.then(removePromise, removePromise);
      }

      return schemaPromise.then(function (sch) {
        if (!added(ref)) {
          return loadMetaSchemaOf(sch).then(function () {
            if (!added(ref)) self.addSchema(sch, ref, undefined, meta);
          });
        }
      }).then(function() {
        return _compileAsync(schemaObj);
      });

      function removePromise() {
        delete self._loadingSchemas[ref];
      }

      function added(ref) {
        return self._refs[ref] || self._schemas[ref];
      }
    }
  }
}
'use strict';

// do NOT remove this file - it would break pre-compiled schemas
// https://github.com/ajv-validator/ajv/issues/889
module.exports = require('fast-deep-equal');
'use strict';

var resolve = require('./resolve');

module.exports = {
  Validation: errorSubclass(ValidationError),
  MissingRef: errorSubclass(MissingRefError)
};


function ValidationError(errors) {
  this.message = 'validation failed';
  this.errors = errors;
  this.ajv = this.validation = true;
}


MissingRefError.message = function (baseId, ref) {
  return 'can\'t resolve reference ' + ref + ' from id ' + baseId;
};


function MissingRefError(baseId, ref, message) {
  this.message = message || MissingRefError.message(baseId, ref);
  this.missingRef = resolve.url(baseId, ref);
  this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef));
}


function errorSubclass(Subclass) {
  Subclass.prototype = Object.create(Error.prototype);
  Subclass.prototype.constructor = Subclass;
  return Subclass;
}
'use strict';

var util = require('./util');

var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/;
var DAYS = [0,31,28,31,30,31,30,31,31,30,31,30,31];
var TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i;
var HOSTNAME = /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i;
var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
var URIREF = /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
// uri-template: https://tools.ietf.org/html/rfc6570
var URITEMPLATE = /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i;
// For the source: https://gist.github.com/dperini/729294
// For test cases: https://mathiasbynens.be/demo/url-regex
// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983.
// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu;
var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i;
var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i;
var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/;
var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i;
var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;


module.exports = formats;

function formats(mode) {
  mode = mode == 'full' ? 'full' : 'fast';
  return util.copy(formats[mode]);
}


formats.fast = {
  // date: http://tools.ietf.org/html/rfc3339#section-5.6
  date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/,
  // date-time: http://tools.ietf.org/html/rfc3339#section-5.6
  time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,
  'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,
  // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js
  uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,
  'uri-reference': /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,
  'uri-template': URITEMPLATE,
  url: URL,
  // email (sources from jsen validator):
  // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363
  // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation')
  email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,
  hostname: HOSTNAME,
  // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html
  ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
  // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses
  ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,
  regex: regex,
  // uuid: http://tools.ietf.org/html/rfc4122
  uuid: UUID,
  // JSON-pointer: https://tools.ietf.org/html/rfc6901
  // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A
  'json-pointer': JSON_POINTER,
  'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,
  // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00
  'relative-json-pointer': RELATIVE_JSON_POINTER
};


formats.full = {
  date: date,
  time: time,
  'date-time': date_time,
  uri: uri,
  'uri-reference': URIREF,
  'uri-template': URITEMPLATE,
  url: URL,
  email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,
  hostname: HOSTNAME,
  ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
  ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,
  regex: regex,
  uuid: UUID,
  'json-pointer': JSON_POINTER,
  'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,
  'relative-json-pointer': RELATIVE_JSON_POINTER
};


function isLeapYear(year) {
  // https://tools.ietf.org/html/rfc3339#appendix-C
  return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
}


function date(str) {
  // full-date from http://tools.ietf.org/html/rfc3339#section-5.6
  var matches = str.match(DATE);
  if (!matches) return false;

  var year = +matches[1];
  var month = +matches[2];
  var day = +matches[3];

  return month >= 1 && month <= 12 && day >= 1 &&
          day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]);
}


function time(str, full) {
  var matches = str.match(TIME);
  if (!matches) return false;

  var hour = matches[1];
  var minute = matches[2];
  var second = matches[3];
  var timeZone = matches[5];
  return ((hour <= 23 && minute <= 59 && second <= 59) ||
          (hour == 23 && minute == 59 && second == 60)) &&
         (!full || timeZone);
}


var DATE_TIME_SEPARATOR = /t|\s/i;
function date_time(str) {
  // http://tools.ietf.org/html/rfc3339#section-5.6
  var dateTime = str.split(DATE_TIME_SEPARATOR);
  return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true);
}


var NOT_URI_FRAGMENT = /\/|:/;
function uri(str) {
  // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "."
  return NOT_URI_FRAGMENT.test(str) && URI.test(str);
}


var Z_ANCHOR = /[^\\]\\Z/;
function regex(str) {
  if (Z_ANCHOR.test(str)) return false;
  try {
    new RegExp(str);
    return true;
  } catch(e) {
    return false;
  }
}
'use strict';

var resolve = require('./resolve')
  , util = require('./util')
  , errorClasses = require('./error_classes')
  , stableStringify = require('fast-json-stable-stringify');

var validateGenerator = require('../dotjs/validate');

/**
 * Functions below are used inside compiled validations function
 */

var ucs2length = util.ucs2length;
var equal = require('fast-deep-equal');

// this error is thrown by async schemas to return validation errors via exception
var ValidationError = errorClasses.Validation;

module.exports = compile;


/**
 * Compiles schema to validation function
 * @this   Ajv
 * @param  {Object} schema schema object
 * @param  {Object} root object with information about the root schema for this schema
 * @param  {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution
 * @param  {String} baseId base ID for IDs in the schema
 * @return {Function} validation function
 */
function compile(schema, root, localRefs, baseId) {
  /* jshint validthis: true, evil: true */
  /* eslint no-shadow: 0 */
  var self = this
    , opts = this._opts
    , refVal = [ undefined ]
    , refs = {}
    , patterns = []
    , patternsHash = {}
    , defaults = []
    , defaultsHash = {}
    , customRules = [];

  root = root || { schema: schema, refVal: refVal, refs: refs };

  var c = checkCompiling.call(this, schema, root, baseId);
  var compilation = this._compilations[c.index];
  if (c.compiling) return (compilation.callValidate = callValidate);

  var formats = this._formats;
  var RULES = this.RULES;

  try {
    var v = localCompile(schema, root, localRefs, baseId);
    compilation.validate = v;
    var cv = compilation.callValidate;
    if (cv) {
      cv.schema = v.schema;
      cv.errors = null;
      cv.refs = v.refs;
      cv.refVal = v.refVal;
      cv.root = v.root;
      cv.$async = v.$async;
      if (opts.sourceCode) cv.source = v.source;
    }
    return v;
  } finally {
    endCompiling.call(this, schema, root, baseId);
  }

  /* @this   {*} - custom context, see passContext option */
  function callValidate() {
    /* jshint validthis: true */
    var validate = compilation.validate;
    var result = validate.apply(this, arguments);
    callValidate.errors = validate.errors;
    return result;
  }

  function localCompile(_schema, _root, localRefs, baseId) {
    var isRoot = !_root || (_root && _root.schema == _schema);
    if (_root.schema != root.schema)
      return compile.call(self, _schema, _root, localRefs, baseId);

    var $async = _schema.$async === true;

    var sourceCode = validateGenerator({
      isTop: true,
      schema: _schema,
      isRoot: isRoot,
      baseId: baseId,
      root: _root,
      schemaPath: '',
      errSchemaPath: '#',
      errorPath: '""',
      MissingRefError: errorClasses.MissingRef,
      RULES: RULES,
      validate: validateGenerator,
      util: util,
      resolve: resolve,
      resolveRef: resolveRef,
      usePattern: usePattern,
      useDefault: useDefault,
      useCustomRule: useCustomRule,
      opts: opts,
      formats: formats,
      logger: self.logger,
      self: self
    });

    sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode)
                   + vars(defaults, defaultCode) + vars(customRules, customRuleCode)
                   + sourceCode;

    if (opts.processCode) sourceCode = opts.processCode(sourceCode, _schema);
    // console.log('\n\n\n *** \n', JSON.stringify(sourceCode));
    var validate;
    try {
      var makeValidate = new Function(
        'self',
        'RULES',
        'formats',
        'root',
        'refVal',
        'defaults',
        'customRules',
        'equal',
        'ucs2length',
        'ValidationError',
        sourceCode
      );

      validate = makeValidate(
        self,
        RULES,
        formats,
        root,
        refVal,
        defaults,
        customRules,
        equal,
        ucs2length,
        ValidationError
      );

      refVal[0] = validate;
    } catch(e) {
      self.logger.error('Error compiling schema, function code:', sourceCode);
      throw e;
    }

    validate.schema = _schema;
    validate.errors = null;
    validate.refs = refs;
    validate.refVal = refVal;
    validate.root = isRoot ? validate : _root;
    if ($async) validate.$async = true;
    if (opts.sourceCode === true) {
      validate.source = {
        code: sourceCode,
        patterns: patterns,
        defaults: defaults
      };
    }

    return validate;
  }

  function resolveRef(baseId, ref, isRoot) {
    ref = resolve.url(baseId, ref);
    var refIndex = refs[ref];
    var _refVal, refCode;
    if (refIndex !== undefined) {
      _refVal = refVal[refIndex];
      refCode = 'refVal[' + refIndex + ']';
      return resolvedRef(_refVal, refCode);
    }
    if (!isRoot && root.refs) {
      var rootRefId = root.refs[ref];
      if (rootRefId !== undefined) {
        _refVal = root.refVal[rootRefId];
        refCode = addLocalRef(ref, _refVal);
        return resolvedRef(_refVal, refCode);
      }
    }

    refCode = addLocalRef(ref);
    var v = resolve.call(self, localCompile, root, ref);
    if (v === undefined) {
      var localSchema = localRefs && localRefs[ref];
      if (localSchema) {
        v = resolve.inlineRef(localSchema, opts.inlineRefs)
            ? localSchema
            : compile.call(self, localSchema, root, localRefs, baseId);
      }
    }

    if (v === undefined) {
      removeLocalRef(ref);
    } else {
      replaceLocalRef(ref, v);
      return resolvedRef(v, refCode);
    }
  }

  function addLocalRef(ref, v) {
    var refId = refVal.length;
    refVal[refId] = v;
    refs[ref] = refId;
    return 'refVal' + refId;
  }

  function removeLocalRef(ref) {
    delete refs[ref];
  }

  function replaceLocalRef(ref, v) {
    var refId = refs[ref];
    refVal[refId] = v;
  }

  function resolvedRef(refVal, code) {
    return typeof refVal == 'object' || typeof refVal == 'boolean'
            ? { code: code, schema: refVal, inline: true }
            : { code: code, $async: refVal && !!refVal.$async };
  }

  function usePattern(regexStr) {
    var index = patternsHash[regexStr];
    if (index === undefined) {
      index = patternsHash[regexStr] = patterns.length;
      patterns[index] = regexStr;
    }
    return 'pattern' + index;
  }

  function useDefault(value) {
    switch (typeof value) {
      case 'boolean':
      case 'number':
        return '' + value;
      case 'string':
        return util.toQuotedString(value);
      case 'object':
        if (value === null) return 'null';
        var valueStr = stableStringify(value);
        var index = defaultsHash[valueStr];
        if (index === undefined) {
          index = defaultsHash[valueStr] = defaults.length;
          defaults[index] = value;
        }
        return 'default' + index;
    }
  }

  function useCustomRule(rule, schema, parentSchema, it) {
    if (self._opts.validateSchema !== false) {
      var deps = rule.definition.dependencies;
      if (deps && !deps.every(function(keyword) {
        return Object.prototype.hasOwnProperty.call(parentSchema, keyword);
      }))
        throw new Error('parent schema must have all required keywords: ' + deps.join(','));

      var validateSchema = rule.definition.validateSchema;
      if (validateSchema) {
        var valid = validateSchema(schema);
        if (!valid) {
          var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors);
          if (self._opts.validateSchema == 'log') self.logger.error(message);
          else throw new Error(message);
        }
      }
    }

    var compile = rule.definition.compile
      , inline = rule.definition.inline
      , macro = rule.definition.macro;

    var validate;
    if (compile) {
      validate = compile.call(self, schema, parentSchema, it);
    } else if (macro) {
      validate = macro.call(self, schema, parentSchema, it);
      if (opts.validateSchema !== false) self.validateSchema(validate, true);
    } else if (inline) {
      validate = inline.call(self, it, rule.keyword, schema, parentSchema);
    } else {
      validate = rule.definition.validate;
      if (!validate) return;
    }

    if (validate === undefined)
      throw new Error('custom keyword "' + rule.keyword + '"failed to compile');

    var index = customRules.length;
    customRules[index] = validate;

    return {
      code: 'customRule' + index,
      validate: validate
    };
  }
}


/**
 * Checks if the schema is currently compiled
 * @this   Ajv
 * @param  {Object} schema schema to compile
 * @param  {Object} root root object
 * @param  {String} baseId base schema ID
 * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean)
 */
function checkCompiling(schema, root, baseId) {
  /* jshint validthis: true */
  var index = compIndex.call(this, schema, root, baseId);
  if (index >= 0) return { index: index, compiling: true };
  index = this._compilations.length;
  this._compilations[index] = {
    schema: schema,
    root: root,
    baseId: baseId
  };
  return { index: index, compiling: false };
}


/**
 * Removes the schema from the currently compiled list
 * @this   Ajv
 * @param  {Object} schema schema to compile
 * @param  {Object} root root object
 * @param  {String} baseId base schema ID
 */
function endCompiling(schema, root, baseId) {
  /* jshint validthis: true */
  var i = compIndex.call(this, schema, root, baseId);
  if (i >= 0) this._compilations.splice(i, 1);
}


/**
 * Index of schema compilation in the currently compiled list
 * @this   Ajv
 * @param  {Object} schema schema to compile
 * @param  {Object} root root object
 * @param  {String} baseId base schema ID
 * @return {Integer} compilation index
 */
function compIndex(schema, root, baseId) {
  /* jshint validthis: true */
  for (var i=0; i<this._compilations.length; i++) {
    var c = this._compilations[i];
    if (c.schema == schema && c.root == root && c.baseId == baseId) return i;
  }
  return -1;
}


function patternCode(i, patterns) {
  return 'var pattern' + i + ' = new RegExp(' + util.toQuotedString(patterns[i]) + ');';
}


function defaultCode(i) {
  return 'var default' + i + ' = defaults[' + i + '];';
}


function refValCode(i, refVal) {
  return refVal[i] === undefined ? '' : 'var refVal' + i + ' = refVal[' + i + '];';
}


function customRuleCode(i) {
  return 'var customRule' + i + ' = customRules[' + i + '];';
}


function vars(arr, statement) {
  if (!arr.length) return '';
  var code = '';
  for (var i=0; i<arr.length; i++)
    code += statement(i, arr);
  return code;
}
'use strict';

var URI = require('uri-js')
  , equal = require('fast-deep-equal')
  , util = require('./util')
  , SchemaObject = require('./schema_obj')
  , traverse = require('json-schema-traverse');

module.exports = resolve;

resolve.normalizeId = normalizeId;
resolve.fullPath = getFullPath;
resolve.url = resolveUrl;
resolve.ids = resolveIds;
resolve.inlineRef = inlineRef;
resolve.schema = resolveSchema;

/**
 * [resolve and compile the references ($ref)]
 * @this   Ajv
 * @param  {Function} compile reference to schema compilation funciton (localCompile)
 * @param  {Object} root object with information about the root schema for the current schema
 * @param  {String} ref reference to resolve
 * @return {Object|Function} schema object (if the schema can be inlined) or validation function
 */
function resolve(compile, root, ref) {
  /* jshint validthis: true */
  var refVal = this._refs[ref];
  if (typeof refVal == 'string') {
    if (this._refs[refVal]) refVal = this._refs[refVal];
    else return resolve.call(this, compile, root, refVal);
  }

  refVal = refVal || this._schemas[ref];
  if (refVal instanceof SchemaObject) {
    return inlineRef(refVal.schema, this._opts.inlineRefs)
            ? refVal.schema
            : refVal.validate || this._compile(refVal);
  }

  var res = resolveSchema.call(this, root, ref);
  var schema, v, baseId;
  if (res) {
    schema = res.schema;
    root = res.root;
    baseId = res.baseId;
  }

  if (schema instanceof SchemaObject) {
    v = schema.validate || compile.call(this, schema.schema, root, undefined, baseId);
  } else if (schema !== undefined) {
    v = inlineRef(schema, this._opts.inlineRefs)
        ? schema
        : compile.call(this, schema, root, undefined, baseId);
  }

  return v;
}


/**
 * Resolve schema, its root and baseId
 * @this Ajv
 * @param  {Object} root root object with properties schema, refVal, refs
 * @param  {String} ref  reference to resolve
 * @return {Object} object with properties schema, root, baseId
 */
function resolveSchema(root, ref) {
  /* jshint validthis: true */
  var p = URI.parse(ref)
    , refPath = _getFullPath(p)
    , baseId = getFullPath(this._getId(root.schema));
  if (Object.keys(root.schema).length === 0 || refPath !== baseId) {
    var id = normalizeId(refPath);
    var refVal = this._refs[id];
    if (typeof refVal == 'string') {
      return resolveRecursive.call(this, root, refVal, p);
    } else if (refVal instanceof SchemaObject) {
      if (!refVal.validate) this._compile(refVal);
      root = refVal;
    } else {
      refVal = this._schemas[id];
      if (refVal instanceof SchemaObject) {
        if (!refVal.validate) this._compile(refVal);
        if (id == normalizeId(ref))
          return { schema: refVal, root: root, baseId: baseId };
        root = refVal;
      } else {
        return;
      }
    }
    if (!root.schema) return;
    baseId = getFullPath(this._getId(root.schema));
  }
  return getJsonPointer.call(this, p, baseId, root.schema, root);
}


/* @this Ajv */
function resolveRecursive(root, ref, parsedRef) {
  /* jshint validthis: true */
  var res = resolveSchema.call(this, root, ref);
  if (res) {
    var schema = res.schema;
    var baseId = res.baseId;
    root = res.root;
    var id = this._getId(schema);
    if (id) baseId = resolveUrl(baseId, id);
    return getJsonPointer.call(this, parsedRef, baseId, schema, root);
  }
}


var PREVENT_SCOPE_CHANGE = util.toHash(['properties', 'patternProperties', 'enum', 'dependencies', 'definitions']);
/* @this Ajv */
function getJsonPointer(parsedRef, baseId, schema, root) {
  /* jshint validthis: true */
  parsedRef.fragment = parsedRef.fragment || '';
  if (parsedRef.fragment.slice(0,1) != '/') return;
  var parts = parsedRef.fragment.split('/');

  for (var i = 1; i < parts.length; i++) {
    var part = parts[i];
    if (part) {
      part = util.unescapeFragment(part);
      schema = schema[part];
      if (schema === undefined) break;
      var id;
      if (!PREVENT_SCOPE_CHANGE[part]) {
        id = this._getId(schema);
        if (id) baseId = resolveUrl(baseId, id);
        if (schema.$ref) {
          var $ref = resolveUrl(baseId, schema.$ref);
          var res = resolveSchema.call(this, root, $ref);
          if (res) {
            schema = res.schema;
            root = res.root;
            baseId = res.baseId;
          }
        }
      }
    }
  }
  if (schema !== undefined && schema !== root.schema)
    return { schema: schema, root: root, baseId: baseId };
}


var SIMPLE_INLINED = util.toHash([
  'type', 'format', 'pattern',
  'maxLength', 'minLength',
  'maxProperties', 'minProperties',
  'maxItems', 'minItems',
  'maximum', 'minimum',
  'uniqueItems', 'multipleOf',
  'required', 'enum'
]);
function inlineRef(schema, limit) {
  if (limit === false) return false;
  if (limit === undefined || limit === true) return checkNoRef(schema);
  else if (limit) return countKeys(schema) <= limit;
}


function checkNoRef(schema) {
  var item;
  if (Array.isArray(schema)) {
    for (var i=0; i<schema.length; i++) {
      item = schema[i];
      if (typeof item == 'object' && !checkNoRef(item)) return false;
    }
  } else {
    for (var key in schema) {
      if (key == '$ref') return false;
      item = schema[key];
      if (typeof item == 'object' && !checkNoRef(item)) return false;
    }
  }
  return true;
}


function countKeys(schema) {
  var count = 0, item;
  if (Array.isArray(schema)) {
    for (var i=0; i<schema.length; i++) {
      item = schema[i];
      if (typeof item == 'object') count += countKeys(item);
      if (count == Infinity) return Infinity;
    }
  } else {
    for (var key in schema) {
      if (key == '$ref') return Infinity;
      if (SIMPLE_INLINED[key]) {
        count++;
      } else {
        item = schema[key];
        if (typeof item == 'object') count += countKeys(item) + 1;
        if (count == Infinity) return Infinity;
      }
    }
  }
  return count;
}


function getFullPath(id, normalize) {
  if (normalize !== false) id = normalizeId(id);
  var p = URI.parse(id);
  return _getFullPath(p);
}


function _getFullPath(p) {
  return URI.serialize(p).split('#')[0] + '#';
}


var TRAILING_SLASH_HASH = /#\/?$/;
function normalizeId(id) {
  return id ? id.replace(TRAILING_SLASH_HASH, '') : '';
}


function resolveUrl(baseId, id) {
  id = normalizeId(id);
  return URI.resolve(baseId, id);
}


/* @this Ajv */
function resolveIds(schema) {
  var schemaId = normalizeId(this._getId(schema));
  var baseIds = {'': schemaId};
  var fullPaths = {'': getFullPath(schemaId, false)};
  var localRefs = {};
  var self = this;

  traverse(schema, {allKeys: true}, function(sch, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {
    if (jsonPtr === '') return;
    var id = self._getId(sch);
    var baseId = baseIds[parentJsonPtr];
    var fullPath = fullPaths[parentJsonPtr] + '/' + parentKeyword;
    if (keyIndex !== undefined)
      fullPath += '/' + (typeof keyIndex == 'number' ? keyIndex : util.escapeFragment(keyIndex));

    if (typeof id == 'string') {
      id = baseId = normalizeId(baseId ? URI.resolve(baseId, id) : id);

      var refVal = self._refs[id];
      if (typeof refVal == 'string') refVal = self._refs[refVal];
      if (refVal && refVal.schema) {
        if (!equal(sch, refVal.schema))
          throw new Error('id "' + id + '" resolves to more than one schema');
      } else if (id != normalizeId(fullPath)) {
        if (id[0] == '#') {
          if (localRefs[id] && !equal(sch, localRefs[id]))
            throw new Error('id "' + id + '" resolves to more than one schema');
          localRefs[id] = sch;
        } else {
          self._refs[id] = fullPath;
        }
      }
    }
    baseIds[jsonPtr] = baseId;
    fullPaths[jsonPtr] = fullPath;
  });

  return localRefs;
}
'use strict';

var ruleModules = require('../dotjs')
  , toHash = require('./util').toHash;

module.exports = function rules() {
  var RULES = [
    { type: 'number',
      rules: [ { 'maximum': ['exclusiveMaximum'] },
               { 'minimum': ['exclusiveMinimum'] }, 'multipleOf', 'format'] },
    { type: 'string',
      rules: [ 'maxLength', 'minLength', 'pattern', 'format' ] },
    { type: 'array',
      rules: [ 'maxItems', 'minItems', 'items', 'contains', 'uniqueItems' ] },
    { type: 'object',
      rules: [ 'maxProperties', 'minProperties', 'required', 'dependencies', 'propertyNames',
               { 'properties': ['additionalProperties', 'patternProperties'] } ] },
    { rules: [ '$ref', 'const', 'enum', 'not', 'anyOf', 'oneOf', 'allOf', 'if' ] }
  ];

  var ALL = [ 'type', '$comment' ];
  var KEYWORDS = [
    '$schema', '$id', 'id', '$data', '$async', 'title',
    'description', 'default', 'definitions',
    'examples', 'readOnly', 'writeOnly',
    'contentMediaType', 'contentEncoding',
    'additionalItems', 'then', 'else'
  ];
  var TYPES = [ 'number', 'integer', 'string', 'array', 'object', 'boolean', 'null' ];
  RULES.all = toHash(ALL);
  RULES.types = toHash(TYPES);

  RULES.forEach(function (group) {
    group.rules = group.rules.map(function (keyword) {
      var implKeywords;
      if (typeof keyword == 'object') {
        var key = Object.keys(keyword)[0];
        implKeywords = keyword[key];
        keyword = key;
        implKeywords.forEach(function (k) {
          ALL.push(k);
          RULES.all[k] = true;
        });
      }
      ALL.push(keyword);
      var rule = RULES.all[keyword] = {
        keyword: keyword,
        code: ruleModules[keyword],
        implements: implKeywords
      };
      return rule;
    });

    RULES.all.$comment = {
      keyword: '$comment',
      code: ruleModules.$comment
    };

    if (group.type) RULES.types[group.type] = group;
  });

  RULES.keywords = toHash(ALL.concat(KEYWORDS));
  RULES.custom = {};

  return RULES;
};
'use strict';

var util = require('./util');

module.exports = SchemaObject;

function SchemaObject(obj) {
  util.copy(obj, this);
}
'use strict';

// https://mathiasbynens.be/notes/javascript-encoding
// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode
module.exports = function ucs2length(str) {
  var length = 0
    , len = str.length
    , pos = 0
    , value;
  while (pos < len) {
    length++;
    value = str.charCodeAt(pos++);
    if (value >= 0xD800 && value <= 0xDBFF && pos < len) {
      // high surrogate, and there is a next character
      value = str.charCodeAt(pos);
      if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate
    }
  }
  return length;
};
'use strict';


module.exports = {
  copy: copy,
  checkDataType: checkDataType,
  checkDataTypes: checkDataTypes,
  coerceToTypes: coerceToTypes,
  toHash: toHash,
  getProperty: getProperty,
  escapeQuotes: escapeQuotes,
  equal: require('fast-deep-equal'),
  ucs2length: require('./ucs2length'),
  varOccurences: varOccurences,
  varReplace: varReplace,
  schemaHasRules: schemaHasRules,
  schemaHasRulesExcept: schemaHasRulesExcept,
  schemaUnknownRules: schemaUnknownRules,
  toQuotedString: toQuotedString,
  getPathExpr: getPathExpr,
  getPath: getPath,
  getData: getData,
  unescapeFragment: unescapeFragment,
  unescapeJsonPointer: unescapeJsonPointer,
  escapeFragment: escapeFragment,
  escapeJsonPointer: escapeJsonPointer
};


function copy(o, to) {
  to = to || {};
  for (var key in o) to[key] = o[key];
  return to;
}


function checkDataType(dataType, data, strictNumbers, negate) {
  var EQUAL = negate ? ' !== ' : ' === '
    , AND = negate ? ' || ' : ' && '
    , OK = negate ? '!' : ''
    , NOT = negate ? '' : '!';
  switch (dataType) {
    case 'null': return data + EQUAL + 'null';
    case 'array': return OK + 'Array.isArray(' + data + ')';
    case 'object': return '(' + OK + data + AND +
                          'typeof ' + data + EQUAL + '"object"' + AND +
                          NOT + 'Array.isArray(' + data + '))';
    case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND +
                           NOT + '(' + data + ' % 1)' +
                           AND + data + EQUAL + data +
                           (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';
    case 'number': return '(typeof ' + data + EQUAL + '"' + dataType + '"' +
                          (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';
    default: return 'typeof ' + data + EQUAL + '"' + dataType + '"';
  }
}


function checkDataTypes(dataTypes, data, strictNumbers) {
  switch (dataTypes.length) {
    case 1: return checkDataType(dataTypes[0], data, strictNumbers, true);
    default:
      var code = '';
      var types = toHash(dataTypes);
      if (types.array && types.object) {
        code = types.null ? '(': '(!' + data + ' || ';
        code += 'typeof ' + data + ' !== "object")';
        delete types.null;
        delete types.array;
        delete types.object;
      }
      if (types.number) delete types.integer;
      for (var t in types)
        code += (code ? ' && ' : '' ) + checkDataType(t, data, strictNumbers, true);

      return code;
  }
}


var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]);
function coerceToTypes(optionCoerceTypes, dataTypes) {
  if (Array.isArray(dataTypes)) {
    var types = [];
    for (var i=0; i<dataTypes.length; i++) {
      var t = dataTypes[i];
      if (COERCE_TO_TYPES[t]) types[types.length] = t;
      else if (optionCoerceTypes === 'array' && t === 'array') types[types.length] = t;
    }
    if (types.length) return types;
  } else if (COERCE_TO_TYPES[dataTypes]) {
    return [dataTypes];
  } else if (optionCoerceTypes === 'array' && dataTypes === 'array') {
    return ['array'];
  }
}


function toHash(arr) {
  var hash = {};
  for (var i=0; i<arr.length; i++) hash[arr[i]] = true;
  return hash;
}


var IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i;
var SINGLE_QUOTE = /'|\\/g;
function getProperty(key) {
  return typeof key == 'number'
          ? '[' + key + ']'
          : IDENTIFIER.test(key)
            ? '.' + key
            : "['" + escapeQuotes(key) + "']";
}


function escapeQuotes(str) {
  return str.replace(SINGLE_QUOTE, '\\$&')
            .replace(/\n/g, '\\n')
            .replace(/\r/g, '\\r')
            .replace(/\f/g, '\\f')
            .replace(/\t/g, '\\t');
}


function varOccurences(str, dataVar) {
  dataVar += '[^0-9]';
  var matches = str.match(new RegExp(dataVar, 'g'));
  return matches ? matches.length : 0;
}


function varReplace(str, dataVar, expr) {
  dataVar += '([^0-9])';
  expr = expr.replace(/\$/g, '$$$$');
  return str.replace(new RegExp(dataVar, 'g'), expr + '$1');
}


function schemaHasRules(schema, rules) {
  if (typeof schema == 'boolean') return !schema;
  for (var key in schema) if (rules[key]) return true;
}


function schemaHasRulesExcept(schema, rules, exceptKeyword) {
  if (typeof schema == 'boolean') return !schema && exceptKeyword != 'not';
  for (var key in schema) if (key != exceptKeyword && rules[key]) return true;
}


function schemaUnknownRules(schema, rules) {
  if (typeof schema == 'boolean') return;
  for (var key in schema) if (!rules[key]) return key;
}


function toQuotedString(str) {
  return '\'' + escapeQuotes(str) + '\'';
}


function getPathExpr(currentPath, expr, jsonPointers, isNumber) {
  var path = jsonPointers // false by default
              ? '\'/\' + ' + expr + (isNumber ? '' : '.replace(/~/g, \'~0\').replace(/\\//g, \'~1\')')
              : (isNumber ? '\'[\' + ' + expr + ' + \']\'' : '\'[\\\'\' + ' + expr + ' + \'\\\']\'');
  return joinPaths(currentPath, path);
}


function getPath(currentPath, prop, jsonPointers) {
  var path = jsonPointers // false by default
              ? toQuotedString('/' + escapeJsonPointer(prop))
              : toQuotedString(getProperty(prop));
  return joinPaths(currentPath, path);
}


var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/;
var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;
function getData($data, lvl, paths) {
  var up, jsonPointer, data, matches;
  if ($data === '') return 'rootData';
  if ($data[0] == '/') {
    if (!JSON_POINTER.test($data)) throw new Error('Invalid JSON-pointer: ' + $data);
    jsonPointer = $data;
    data = 'rootData';
  } else {
    matches = $data.match(RELATIVE_JSON_POINTER);
    if (!matches) throw new Error('Invalid JSON-pointer: ' + $data);
    up = +matches[1];
    jsonPointer = matches[2];
    if (jsonPointer == '#') {
      if (up >= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);
      return paths[lvl - up];
    }

    if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);
    data = 'data' + ((lvl - up) || '');
    if (!jsonPointer) return data;
  }

  var expr = data;
  var segments = jsonPointer.split('/');
  for (var i=0; i<segments.length; i++) {
    var segment = segments[i];
    if (segment) {
      data += getProperty(unescapeJsonPointer(segment));
      expr += ' && ' + data;
    }
  }
  return expr;
}


function joinPaths (a, b) {
  if (a == '""') return b;
  return (a + ' + ' + b).replace(/([^\\])' \+ '/g, '$1');
}


function unescapeFragment(str) {
  return unescapeJsonPointer(decodeURIComponent(str));
}


function escapeFragment(str) {
  return encodeURIComponent(escapeJsonPointer(str));
}


function escapeJsonPointer(str) {
  return str.replace(/~/g, '~0').replace(/\//g, '~1');
}


function unescapeJsonPointer(str) {
  return str.replace(/~1/g, '/').replace(/~0/g, '~');
}
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Ajv = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
'use strict';


var Cache = module.exports = function Cache() {
  this._cache = {};
};


Cache.prototype.put = function Cache_put(key, value) {
  this._cache[key] = value;
};


Cache.prototype.get = function Cache_get(key) {
  return this._cache[key];
};


Cache.prototype.del = function Cache_del(key) {
  delete this._cache[key];
};


Cache.prototype.clear = function Cache_clear() {
  this._cache = {};
};

},{}],2:[function(require,module,exports){
'use strict';

var MissingRefError = require('./error_classes').MissingRef;

module.exports = compileAsync;


/**
 * Creates validating function for passed schema with asynchronous loading of missing schemas.
 * `loadSchema` option should be a function that accepts schema uri and returns promise that resolves with the schema.
 * @this  Ajv
 * @param {Object}   schema schema object
 * @param {Boolean}  meta optional true to compile meta-schema; this parameter can be skipped
 * @param {Function} callback an optional node-style callback, it is called with 2 parameters: error (or null) and validating function.
 * @return {Promise} promise that resolves with a validating function.
 */
function compileAsync(schema, meta, callback) {
  /* eslint no-shadow: 0 */
  /* global Promise */
  /* jshint validthis: true */
  var self = this;
  if (typeof this._opts.loadSchema != 'function')
    throw new Error('options.loadSchema should be a function');

  if (typeof meta == 'function') {
    callback = meta;
    meta = undefined;
  }

  var p = loadMetaSchemaOf(schema).then(function () {
    var schemaObj = self._addSchema(schema, undefined, meta);
    return schemaObj.validate || _compileAsync(schemaObj);
  });

  if (callback) {
    p.then(
      function(v) { callback(null, v); },
      callback
    );
  }

  return p;


  function loadMetaSchemaOf(sch) {
    var $schema = sch.$schema;
    return $schema && !self.getSchema($schema)
            ? compileAsync.call(self, { $ref: $schema }, true)
            : Promise.resolve();
  }


  function _compileAsync(schemaObj) {
    try { return self._compile(schemaObj); }
    catch(e) {
      if (e instanceof MissingRefError) return loadMissingSchema(e);
      throw e;
    }


    function loadMissingSchema(e) {
      var ref = e.missingSchema;
      if (added(ref)) throw new Error('Schema ' + ref + ' is loaded but ' + e.missingRef + ' cannot be resolved');

      var schemaPromise = self._loadingSchemas[ref];
      if (!schemaPromise) {
        schemaPromise = self._loadingSchemas[ref] = self._opts.loadSchema(ref);
        schemaPromise.then(removePromise, removePromise);
      }

      return schemaPromise.then(function (sch) {
        if (!added(ref)) {
          return loadMetaSchemaOf(sch).then(function () {
            if (!added(ref)) self.addSchema(sch, ref, undefined, meta);
          });
        }
      }).then(function() {
        return _compileAsync(schemaObj);
      });

      function removePromise() {
        delete self._loadingSchemas[ref];
      }

      function added(ref) {
        return self._refs[ref] || self._schemas[ref];
      }
    }
  }
}

},{"./error_classes":3}],3:[function(require,module,exports){
'use strict';

var resolve = require('./resolve');

module.exports = {
  Validation: errorSubclass(ValidationError),
  MissingRef: errorSubclass(MissingRefError)
};


function ValidationError(errors) {
  this.message = 'validation failed';
  this.errors = errors;
  this.ajv = this.validation = true;
}


MissingRefError.message = function (baseId, ref) {
  return 'can\'t resolve reference ' + ref + ' from id ' + baseId;
};


function MissingRefError(baseId, ref, message) {
  this.message = message || MissingRefError.message(baseId, ref);
  this.missingRef = resolve.url(baseId, ref);
  this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef));
}


function errorSubclass(Subclass) {
  Subclass.prototype = Object.create(Error.prototype);
  Subclass.prototype.constructor = Subclass;
  return Subclass;
}

},{"./resolve":6}],4:[function(require,module,exports){
'use strict';

var util = require('./util');

var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/;
var DAYS = [0,31,28,31,30,31,30,31,31,30,31,30,31];
var TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i;
var HOSTNAME = /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i;
var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
var URIREF = /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
// uri-template: https://tools.ietf.org/html/rfc6570
var URITEMPLATE = /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i;
// For the source: https://gist.github.com/dperini/729294
// For test cases: https://mathiasbynens.be/demo/url-regex
// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983.
// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu;
var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i;
var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i;
var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/;
var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i;
var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;


module.exports = formats;

function formats(mode) {
  mode = mode == 'full' ? 'full' : 'fast';
  return util.copy(formats[mode]);
}


formats.fast = {
  // date: http://tools.ietf.org/html/rfc3339#section-5.6
  date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/,
  // date-time: http://tools.ietf.org/html/rfc3339#section-5.6
  time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,
  'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,
  // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js
  uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,
  'uri-reference': /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,
  'uri-template': URITEMPLATE,
  url: URL,
  // email (sources from jsen validator):
  // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363
  // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation')
  email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,
  hostname: HOSTNAME,
  // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html
  ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
  // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses
  ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,
  regex: regex,
  // uuid: http://tools.ietf.org/html/rfc4122
  uuid: UUID,
  // JSON-pointer: https://tools.ietf.org/html/rfc6901
  // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A
  'json-pointer': JSON_POINTER,
  'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,
  // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00
  'relative-json-pointer': RELATIVE_JSON_POINTER
};


formats.full = {
  date: date,
  time: time,
  'date-time': date_time,
  uri: uri,
  'uri-reference': URIREF,
  'uri-template': URITEMPLATE,
  url: URL,
  email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,
  hostname: HOSTNAME,
  ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
  ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,
  regex: regex,
  uuid: UUID,
  'json-pointer': JSON_POINTER,
  'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,
  'relative-json-pointer': RELATIVE_JSON_POINTER
};


function isLeapYear(year) {
  // https://tools.ietf.org/html/rfc3339#appendix-C
  return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
}


function date(str) {
  // full-date from http://tools.ietf.org/html/rfc3339#section-5.6
  var matches = str.match(DATE);
  if (!matches) return false;

  var year = +matches[1];
  var month = +matches[2];
  var day = +matches[3];

  return month >= 1 && month <= 12 && day >= 1 &&
          day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]);
}


function time(str, full) {
  var matches = str.match(TIME);
  if (!matches) return false;

  var hour = matches[1];
  var minute = matches[2];
  var second = matches[3];
  var timeZone = matches[5];
  return ((hour <= 23 && minute <= 59 && second <= 59) ||
          (hour == 23 && minute == 59 && second == 60)) &&
         (!full || timeZone);
}


var DATE_TIME_SEPARATOR = /t|\s/i;
function date_time(str) {
  // http://tools.ietf.org/html/rfc3339#section-5.6
  var dateTime = str.split(DATE_TIME_SEPARATOR);
  return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true);
}


var NOT_URI_FRAGMENT = /\/|:/;
function uri(str) {
  // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "."
  return NOT_URI_FRAGMENT.test(str) && URI.test(str);
}


var Z_ANCHOR = /[^\\]\\Z/;
function regex(str) {
  if (Z_ANCHOR.test(str)) return false;
  try {
    new RegExp(str);
    return true;
  } catch(e) {
    return false;
  }
}

},{"./util":10}],5:[function(require,module,exports){
'use strict';

var resolve = require('./resolve')
  , util = require('./util')
  , errorClasses = require('./error_classes')
  , stableStringify = require('fast-json-stable-stringify');

var validateGenerator = require('../dotjs/validate');

/**
 * Functions below are used inside compiled validations function
 */

var ucs2length = util.ucs2length;
var equal = require('fast-deep-equal');

// this error is thrown by async schemas to return validation errors via exception
var ValidationError = errorClasses.Validation;

module.exports = compile;


/**
 * Compiles schema to validation function
 * @this   Ajv
 * @param  {Object} schema schema object
 * @param  {Object} root object with information about the root schema for this schema
 * @param  {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution
 * @param  {String} baseId base ID for IDs in the schema
 * @return {Function} validation function
 */
function compile(schema, root, localRefs, baseId) {
  /* jshint validthis: true, evil: true */
  /* eslint no-shadow: 0 */
  var self = this
    , opts = this._opts
    , refVal = [ undefined ]
    , refs = {}
    , patterns = []
    , patternsHash = {}
    , defaults = []
    , defaultsHash = {}
    , customRules = [];

  root = root || { schema: schema, refVal: refVal, refs: refs };

  var c = checkCompiling.call(this, schema, root, baseId);
  var compilation = this._compilations[c.index];
  if (c.compiling) return (compilation.callValidate = callValidate);

  var formats = this._formats;
  var RULES = this.RULES;

  try {
    var v = localCompile(schema, root, localRefs, baseId);
    compilation.validate = v;
    var cv = compilation.callValidate;
    if (cv) {
      cv.schema = v.schema;
      cv.errors = null;
      cv.refs = v.refs;
      cv.refVal = v.refVal;
      cv.root = v.root;
      cv.$async = v.$async;
      if (opts.sourceCode) cv.source = v.source;
    }
    return v;
  } finally {
    endCompiling.call(this, schema, root, baseId);
  }

  /* @this   {*} - custom context, see passContext option */
  function callValidate() {
    /* jshint validthis: true */
    var validate = compilation.validate;
    var result = validate.apply(this, arguments);
    callValidate.errors = validate.errors;
    return result;
  }

  function localCompile(_schema, _root, localRefs, baseId) {
    var isRoot = !_root || (_root && _root.schema == _schema);
    if (_root.schema != root.schema)
      return compile.call(self, _schema, _root, localRefs, baseId);

    var $async = _schema.$async === true;

    var sourceCode = validateGenerator({
      isTop: true,
      schema: _schema,
      isRoot: isRoot,
      baseId: baseId,
      root: _root,
      schemaPath: '',
      errSchemaPath: '#',
      errorPath: '""',
      MissingRefError: errorClasses.MissingRef,
      RULES: RULES,
      validate: validateGenerator,
      util: util,
      resolve: resolve,
      resolveRef: resolveRef,
      usePattern: usePattern,
      useDefault: useDefault,
      useCustomRule: useCustomRule,
      opts: opts,
      formats: formats,
      logger: self.logger,
      self: self
    });

    sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode)
                   + vars(defaults, defaultCode) + vars(customRules, customRuleCode)
                   + sourceCode;

    if (opts.processCode) sourceCode = opts.processCode(sourceCode, _schema);
    // console.log('\n\n\n *** \n', JSON.stringify(sourceCode));
    var validate;
    try {
      var makeValidate = new Function(
        'self',
        'RULES',
        'formats',
        'root',
        'refVal',
        'defaults',
        'customRules',
        'equal',
        'ucs2length',
        'ValidationError',
        sourceCode
      );

      validate = makeValidate(
        self,
        RULES,
        formats,
        root,
        refVal,
        defaults,
        customRules,
        equal,
        ucs2length,
        ValidationError
      );

      refVal[0] = validate;
    } catch(e) {
      self.logger.error('Error compiling schema, function code:', sourceCode);
      throw e;
    }

    validate.schema = _schema;
    validate.errors = null;
    validate.refs = refs;
    validate.refVal = refVal;
    validate.root = isRoot ? validate : _root;
    if ($async) validate.$async = true;
    if (opts.sourceCode === true) {
      validate.source = {
        code: sourceCode,
        patterns: patterns,
        defaults: defaults
      };
    }

    return validate;
  }

  function resolveRef(baseId, ref, isRoot) {
    ref = resolve.url(baseId, ref);
    var refIndex = refs[ref];
    var _refVal, refCode;
    if (refIndex !== undefined) {
      _refVal = refVal[refIndex];
      refCode = 'refVal[' + refIndex + ']';
      return resolvedRef(_refVal, refCode);
    }
    if (!isRoot && root.refs) {
      var rootRefId = root.refs[ref];
      if (rootRefId !== undefined) {
        _refVal = root.refVal[rootRefId];
        refCode = addLocalRef(ref, _refVal);
        return resolvedRef(_refVal, refCode);
      }
    }

    refCode = addLocalRef(ref);
    var v = resolve.call(self, localCompile, root, ref);
    if (v === undefined) {
      var localSchema = localRefs && localRefs[ref];
      if (localSchema) {
        v = resolve.inlineRef(localSchema, opts.inlineRefs)
            ? localSchema
            : compile.call(self, localSchema, root, localRefs, baseId);
      }
    }

    if (v === undefined) {
      removeLocalRef(ref);
    } else {
      replaceLocalRef(ref, v);
      return resolvedRef(v, refCode);
    }
  }

  function addLocalRef(ref, v) {
    var refId = refVal.length;
    refVal[refId] = v;
    refs[ref] = refId;
    return 'refVal' + refId;
  }

  function removeLocalRef(ref) {
    delete refs[ref];
  }

  function replaceLocalRef(ref, v) {
    var refId = refs[ref];
    refVal[refId] = v;
  }

  function resolvedRef(refVal, code) {
    return typeof refVal == 'object' || typeof refVal == 'boolean'
            ? { code: code, schema: refVal, inline: true }
            : { code: code, $async: refVal && !!refVal.$async };
  }

  function usePattern(regexStr) {
    var index = patternsHash[regexStr];
    if (index === undefined) {
      index = patternsHash[regexStr] = patterns.length;
      patterns[index] = regexStr;
    }
    return 'pattern' + index;
  }

  function useDefault(value) {
    switch (typeof value) {
      case 'boolean':
      case 'number':
        return '' + value;
      case 'string':
        return util.toQuotedString(value);
      case 'object':
        if (value === null) return 'null';
        var valueStr = stableStringify(value);
        var index = defaultsHash[valueStr];
        if (index === undefined) {
          index = defaultsHash[valueStr] = defaults.length;
          defaults[index] = value;
        }
        return 'default' + index;
    }
  }

  function useCustomRule(rule, schema, parentSchema, it) {
    if (self._opts.validateSchema !== false) {
      var deps = rule.definition.dependencies;
      if (deps && !deps.every(function(keyword) {
        return Object.prototype.hasOwnProperty.call(parentSchema, keyword);
      }))
        throw new Error('parent schema must have all required keywords: ' + deps.join(','));

      var validateSchema = rule.definition.validateSchema;
      if (validateSchema) {
        var valid = validateSchema(schema);
        if (!valid) {
          var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors);
          if (self._opts.validateSchema == 'log') self.logger.error(message);
          else throw new Error(message);
        }
      }
    }

    var compile = rule.definition.compile
      , inline = rule.definition.inline
      , macro = rule.definition.macro;

    var validate;
    if (compile) {
      validate = compile.call(self, schema, parentSchema, it);
    } else if (macro) {
      validate = macro.call(self, schema, parentSchema, it);
      if (opts.validateSchema !== false) self.validateSchema(validate, true);
    } else if (inline) {
      validate = inline.call(self, it, rule.keyword, schema, parentSchema);
    } else {
      validate = rule.definition.validate;
      if (!validate) return;
    }

    if (validate === undefined)
      throw new Error('custom keyword "' + rule.keyword + '"failed to compile');

    var index = customRules.length;
    customRules[index] = validate;

    return {
      code: 'customRule' + index,
      validate: validate
    };
  }
}


/**
 * Checks if the schema is currently compiled
 * @this   Ajv
 * @param  {Object} schema schema to compile
 * @param  {Object} root root object
 * @param  {String} baseId base schema ID
 * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean)
 */
function checkCompiling(schema, root, baseId) {
  /* jshint validthis: true */
  var index = compIndex.call(this, schema, root, baseId);
  if (index >= 0) return { index: index, compiling: true };
  index = this._compilations.length;
  this._compilations[index] = {
    schema: schema,
    root: root,
    baseId: baseId
  };
  return { index: index, compiling: false };
}


/**
 * Removes the schema from the currently compiled list
 * @this   Ajv
 * @param  {Object} schema schema to compile
 * @param  {Object} root root object
 * @param  {String} baseId base schema ID
 */
function endCompiling(schema, root, baseId) {
  /* jshint validthis: true */
  var i = compIndex.call(this, schema, root, baseId);
  if (i >= 0) this._compilations.splice(i, 1);
}


/**
 * Index of schema compilation in the currently compiled list
 * @this   Ajv
 * @param  {Object} schema schema to compile
 * @param  {Object} root root object
 * @param  {String} baseId base schema ID
 * @return {Integer} compilation index
 */
function compIndex(schema, root, baseId) {
  /* jshint validthis: true */
  for (var i=0; i<this._compilations.length; i++) {
    var c = this._compilations[i];
    if (c.schema == schema && c.root == root && c.baseId == baseId) return i;
  }
  return -1;
}


function patternCode(i, patterns) {
  return 'var pattern' + i + ' = new RegExp(' + util.toQuotedString(patterns[i]) + ');';
}


function defaultCode(i) {
  return 'var default' + i + ' = defaults[' + i + '];';
}


function refValCode(i, refVal) {
  return refVal[i] === undefined ? '' : 'var refVal' + i + ' = refVal[' + i + '];';
}


function customRuleCode(i) {
  return 'var customRule' + i + ' = customRules[' + i + '];';
}


function vars(arr, statement) {
  if (!arr.length) return '';
  var code = '';
  for (var i=0; i<arr.length; i++)
    code += statement(i, arr);
  return code;
}

},{"../dotjs/validate":38,"./error_classes":3,"./resolve":6,"./util":10,"fast-deep-equal":42,"fast-json-stable-stringify":43}],6:[function(require,module,exports){
'use strict';

var URI = require('uri-js')
  , equal = require('fast-deep-equal')
  , util = require('./util')
  , SchemaObject = require('./schema_obj')
  , traverse = require('json-schema-traverse');

module.exports = resolve;

resolve.normalizeId = normalizeId;
resolve.fullPath = getFullPath;
resolve.url = resolveUrl;
resolve.ids = resolveIds;
resolve.inlineRef = inlineRef;
resolve.schema = resolveSchema;

/**
 * [resolve and compile the references ($ref)]
 * @this   Ajv
 * @param  {Function} compile reference to schema compilation funciton (localCompile)
 * @param  {Object} root object with information about the root schema for the current schema
 * @param  {String} ref reference to resolve
 * @return {Object|Function} schema object (if the schema can be inlined) or validation function
 */
function resolve(compile, root, ref) {
  /* jshint validthis: true */
  var refVal = this._refs[ref];
  if (typeof refVal == 'string') {
    if (this._refs[refVal]) refVal = this._refs[refVal];
    else return resolve.call(this, compile, root, refVal);
  }

  refVal = refVal || this._schemas[ref];
  if (refVal instanceof SchemaObject) {
    return inlineRef(refVal.schema, this._opts.inlineRefs)
            ? refVal.schema
            : refVal.validate || this._compile(refVal);
  }

  var res = resolveSchema.call(this, root, ref);
  var schema, v, baseId;
  if (res) {
    schema = res.schema;
    root = res.root;
    baseId = res.baseId;
  }

  if (schema instanceof SchemaObject) {
    v = schema.validate || compile.call(this, schema.schema, root, undefined, baseId);
  } else if (schema !== undefined) {
    v = inlineRef(schema, this._opts.inlineRefs)
        ? schema
        : compile.call(this, schema, root, undefined, baseId);
  }

  return v;
}


/**
 * Resolve schema, its root and baseId
 * @this Ajv
 * @param  {Object} root root object with properties schema, refVal, refs
 * @param  {String} ref  reference to resolve
 * @return {Object} object with properties schema, root, baseId
 */
function resolveSchema(root, ref) {
  /* jshint validthis: true */
  var p = URI.parse(ref)
    , refPath = _getFullPath(p)
    , baseId = getFullPath(this._getId(root.schema));
  if (Object.keys(root.schema).length === 0 || refPath !== baseId) {
    var id = normalizeId(refPath);
    var refVal = this._refs[id];
    if (typeof refVal == 'string') {
      return resolveRecursive.call(this, root, refVal, p);
    } else if (refVal instanceof SchemaObject) {
      if (!refVal.validate) this._compile(refVal);
      root = refVal;
    } else {
      refVal = this._schemas[id];
      if (refVal instanceof SchemaObject) {
        if (!refVal.validate) this._compile(refVal);
        if (id == normalizeId(ref))
          return { schema: refVal, root: root, baseId: baseId };
        root = refVal;
      } else {
        return;
      }
    }
    if (!root.schema) return;
    baseId = getFullPath(this._getId(root.schema));
  }
  return getJsonPointer.call(this, p, baseId, root.schema, root);
}


/* @this Ajv */
function resolveRecursive(root, ref, parsedRef) {
  /* jshint validthis: true */
  var res = resolveSchema.call(this, root, ref);
  if (res) {
    var schema = res.schema;
    var baseId = res.baseId;
    root = res.root;
    var id = this._getId(schema);
    if (id) baseId = resolveUrl(baseId, id);
    return getJsonPointer.call(this, parsedRef, baseId, schema, root);
  }
}


var PREVENT_SCOPE_CHANGE = util.toHash(['properties', 'patternProperties', 'enum', 'dependencies', 'definitions']);
/* @this Ajv */
function getJsonPointer(parsedRef, baseId, schema, root) {
  /* jshint validthis: true */
  parsedRef.fragment = parsedRef.fragment || '';
  if (parsedRef.fragment.slice(0,1) != '/') return;
  var parts = parsedRef.fragment.split('/');

  for (var i = 1; i < parts.length; i++) {
    var part = parts[i];
    if (part) {
      part = util.unescapeFragment(part);
      schema = schema[part];
      if (schema === undefined) break;
      var id;
      if (!PREVENT_SCOPE_CHANGE[part]) {
        id = this._getId(schema);
        if (id) baseId = resolveUrl(baseId, id);
        if (schema.$ref) {
          var $ref = resolveUrl(baseId, schema.$ref);
          var res = resolveSchema.call(this, root, $ref);
          if (res) {
            schema = res.schema;
            root = res.root;
            baseId = res.baseId;
          }
        }
      }
    }
  }
  if (schema !== undefined && schema !== root.schema)
    return { schema: schema, root: root, baseId: baseId };
}


var SIMPLE_INLINED = util.toHash([
  'type', 'format', 'pattern',
  'maxLength', 'minLength',
  'maxProperties', 'minProperties',
  'maxItems', 'minItems',
  'maximum', 'minimum',
  'uniqueItems', 'multipleOf',
  'required', 'enum'
]);
function inlineRef(schema, limit) {
  if (limit === false) return false;
  if (limit === undefined || limit === true) return checkNoRef(schema);
  else if (limit) return countKeys(schema) <= limit;
}


function checkNoRef(schema) {
  var item;
  if (Array.isArray(schema)) {
    for (var i=0; i<schema.length; i++) {
      item = schema[i];
      if (typeof item == 'object' && !checkNoRef(item)) return false;
    }
  } else {
    for (var key in schema) {
      if (key == '$ref') return false;
      item = schema[key];
      if (typeof item == 'object' && !checkNoRef(item)) return false;
    }
  }
  return true;
}


function countKeys(schema) {
  var count = 0, item;
  if (Array.isArray(schema)) {
    for (var i=0; i<schema.length; i++) {
      item = schema[i];
      if (typeof item == 'object') count += countKeys(item);
      if (count == Infinity) return Infinity;
    }
  } else {
    for (var key in schema) {
      if (key == '$ref') return Infinity;
      if (SIMPLE_INLINED[key]) {
        count++;
      } else {
        item = schema[key];
        if (typeof item == 'object') count += countKeys(item) + 1;
        if (count == Infinity) return Infinity;
      }
    }
  }
  return count;
}


function getFullPath(id, normalize) {
  if (normalize !== false) id = normalizeId(id);
  var p = URI.parse(id);
  return _getFullPath(p);
}


function _getFullPath(p) {
  return URI.serialize(p).split('#')[0] + '#';
}


var TRAILING_SLASH_HASH = /#\/?$/;
function normalizeId(id) {
  return id ? id.replace(TRAILING_SLASH_HASH, '') : '';
}


function resolveUrl(baseId, id) {
  id = normalizeId(id);
  return URI.resolve(baseId, id);
}


/* @this Ajv */
function resolveIds(schema) {
  var schemaId = normalizeId(this._getId(schema));
  var baseIds = {'': schemaId};
  var fullPaths = {'': getFullPath(schemaId, false)};
  var localRefs = {};
  var self = this;

  traverse(schema, {allKeys: true}, function(sch, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {
    if (jsonPtr === '') return;
    var id = self._getId(sch);
    var baseId = baseIds[parentJsonPtr];
    var fullPath = fullPaths[parentJsonPtr] + '/' + parentKeyword;
    if (keyIndex !== undefined)
      fullPath += '/' + (typeof keyIndex == 'number' ? keyIndex : util.escapeFragment(keyIndex));

    if (typeof id == 'string') {
      id = baseId = normalizeId(baseId ? URI.resolve(baseId, id) : id);

      var refVal = self._refs[id];
      if (typeof refVal == 'string') refVal = self._refs[refVal];
      if (refVal && refVal.schema) {
        if (!equal(sch, refVal.schema))
          throw new Error('id "' + id + '" resolves to more than one schema');
      } else if (id != normalizeId(fullPath)) {
        if (id[0] == '#') {
          if (localRefs[id] && !equal(sch, localRefs[id]))
            throw new Error('id "' + id + '" resolves to more than one schema');
          localRefs[id] = sch;
        } else {
          self._refs[id] = fullPath;
        }
      }
    }
    baseIds[jsonPtr] = baseId;
    fullPaths[jsonPtr] = fullPath;
  });

  return localRefs;
}

},{"./schema_obj":8,"./util":10,"fast-deep-equal":42,"json-schema-traverse":44,"uri-js":45}],7:[function(require,module,exports){
'use strict';

var ruleModules = require('../dotjs')
  , toHash = require('./util').toHash;

module.exports = function rules() {
  var RULES = [
    { type: 'number',
      rules: [ { 'maximum': ['exclusiveMaximum'] },
               { 'minimum': ['exclusiveMinimum'] }, 'multipleOf', 'format'] },
    { type: 'string',
      rules: [ 'maxLength', 'minLength', 'pattern', 'format' ] },
    { type: 'array',
      rules: [ 'maxItems', 'minItems', 'items', 'contains', 'uniqueItems' ] },
    { type: 'object',
      rules: [ 'maxProperties', 'minProperties', 'required', 'dependencies', 'propertyNames',
               { 'properties': ['additionalProperties', 'patternProperties'] } ] },
    { rules: [ '$ref', 'const', 'enum', 'not', 'anyOf', 'oneOf', 'allOf', 'if' ] }
  ];

  var ALL = [ 'type', '$comment' ];
  var KEYWORDS = [
    '$schema', '$id', 'id', '$data', '$async', 'title',
    'description', 'default', 'definitions',
    'examples', 'readOnly', 'writeOnly',
    'contentMediaType', 'contentEncoding',
    'additionalItems', 'then', 'else'
  ];
  var TYPES = [ 'number', 'integer', 'string', 'array', 'object', 'boolean', 'null' ];
  RULES.all = toHash(ALL);
  RULES.types = toHash(TYPES);

  RULES.forEach(function (group) {
    group.rules = group.rules.map(function (keyword) {
      var implKeywords;
      if (typeof keyword == 'object') {
        var key = Object.keys(keyword)[0];
        implKeywords = keyword[key];
        keyword = key;
        implKeywords.forEach(function (k) {
          ALL.push(k);
          RULES.all[k] = true;
        });
      }
      ALL.push(keyword);
      var rule = RULES.all[keyword] = {
        keyword: keyword,
        code: ruleModules[keyword],
        implements: implKeywords
      };
      return rule;
    });

    RULES.all.$comment = {
      keyword: '$comment',
      code: ruleModules.$comment
    };

    if (group.type) RULES.types[group.type] = group;
  });

  RULES.keywords = toHash(ALL.concat(KEYWORDS));
  RULES.custom = {};

  return RULES;
};

},{"../dotjs":27,"./util":10}],8:[function(require,module,exports){
'use strict';

var util = require('./util');

module.exports = SchemaObject;

function SchemaObject(obj) {
  util.copy(obj, this);
}

},{"./util":10}],9:[function(require,module,exports){
'use strict';

// https://mathiasbynens.be/notes/javascript-encoding
// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode
module.exports = function ucs2length(str) {
  var length = 0
    , len = str.length
    , pos = 0
    , value;
  while (pos < len) {
    length++;
    value = str.charCodeAt(pos++);
    if (value >= 0xD800 && value <= 0xDBFF && pos < len) {
      // high surrogate, and there is a next character
      value = str.charCodeAt(pos);
      if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate
    }
  }
  return length;
};

},{}],10:[function(require,module,exports){
'use strict';


module.exports = {
  copy: copy,
  checkDataType: checkDataType,
  checkDataTypes: checkDataTypes,
  coerceToTypes: coerceToTypes,
  toHash: toHash,
  getProperty: getProperty,
  escapeQuotes: escapeQuotes,
  equal: require('fast-deep-equal'),
  ucs2length: require('./ucs2length'),
  varOccurences: varOccurences,
  varReplace: varReplace,
  schemaHasRules: schemaHasRules,
  schemaHasRulesExcept: schemaHasRulesExcept,
  schemaUnknownRules: schemaUnknownRules,
  toQuotedString: toQuotedString,
  getPathExpr: getPathExpr,
  getPath: getPath,
  getData: getData,
  unescapeFragment: unescapeFragment,
  unescapeJsonPointer: unescapeJsonPointer,
  escapeFragment: escapeFragment,
  escapeJsonPointer: escapeJsonPointer
};


function copy(o, to) {
  to = to || {};
  for (var key in o) to[key] = o[key];
  return to;
}


function checkDataType(dataType, data, strictNumbers, negate) {
  var EQUAL = negate ? ' !== ' : ' === '
    , AND = negate ? ' || ' : ' && '
    , OK = negate ? '!' : ''
    , NOT = negate ? '' : '!';
  switch (dataType) {
    case 'null': return data + EQUAL + 'null';
    case 'array': return OK + 'Array.isArray(' + data + ')';
    case 'object': return '(' + OK + data + AND +
                          'typeof ' + data + EQUAL + '"object"' + AND +
                          NOT + 'Array.isArray(' + data + '))';
    case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND +
                           NOT + '(' + data + ' % 1)' +
                           AND + data + EQUAL + data +
                           (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';
    case 'number': return '(typeof ' + data + EQUAL + '"' + dataType + '"' +
                          (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';
    default: return 'typeof ' + data + EQUAL + '"' + dataType + '"';
  }
}


function checkDataTypes(dataTypes, data, strictNumbers) {
  switch (dataTypes.length) {
    case 1: return checkDataType(dataTypes[0], data, strictNumbers, true);
    default:
      var code = '';
      var types = toHash(dataTypes);
      if (types.array && types.object) {
        code = types.null ? '(': '(!' + data + ' || ';
        code += 'typeof ' + data + ' !== "object")';
        delete types.null;
        delete types.array;
        delete types.object;
      }
      if (types.number) delete types.integer;
      for (var t in types)
        code += (code ? ' && ' : '' ) + checkDataType(t, data, strictNumbers, true);

      return code;
  }
}


var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]);
function coerceToTypes(optionCoerceTypes, dataTypes) {
  if (Array.isArray(dataTypes)) {
    var types = [];
    for (var i=0; i<dataTypes.length; i++) {
      var t = dataTypes[i];
      if (COERCE_TO_TYPES[t]) types[types.length] = t;
      else if (optionCoerceTypes === 'array' && t === 'array') types[types.length] = t;
    }
    if (types.length) return types;
  } else if (COERCE_TO_TYPES[dataTypes]) {
    return [dataTypes];
  } else if (optionCoerceTypes === 'array' && dataTypes === 'array') {
    return ['array'];
  }
}


function toHash(arr) {
  var hash = {};
  for (var i=0; i<arr.length; i++) hash[arr[i]] = true;
  return hash;
}


var IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i;
var SINGLE_QUOTE = /'|\\/g;
function getProperty(key) {
  return typeof key == 'number'
          ? '[' + key + ']'
          : IDENTIFIER.test(key)
            ? '.' + key
            : "['" + escapeQuotes(key) + "']";
}


function escapeQuotes(str) {
  return str.replace(SINGLE_QUOTE, '\\$&')
            .replace(/\n/g, '\\n')
            .replace(/\r/g, '\\r')
            .replace(/\f/g, '\\f')
            .replace(/\t/g, '\\t');
}


function varOccurences(str, dataVar) {
  dataVar += '[^0-9]';
  var matches = str.match(new RegExp(dataVar, 'g'));
  return matches ? matches.length : 0;
}


function varReplace(str, dataVar, expr) {
  dataVar += '([^0-9])';
  expr = expr.replace(/\$/g, '$$$$');
  return str.replace(new RegExp(dataVar, 'g'), expr + '$1');
}


function schemaHasRules(schema, rules) {
  if (typeof schema == 'boolean') return !schema;
  for (var key in schema) if (rules[key]) return true;
}


function schemaHasRulesExcept(schema, rules, exceptKeyword) {
  if (typeof schema == 'boolean') return !schema && exceptKeyword != 'not';
  for (var key in schema) if (key != exceptKeyword && rules[key]) return true;
}


function schemaUnknownRules(schema, rules) {
  if (typeof schema == 'boolean') return;
  for (var key in schema) if (!rules[key]) return key;
}


function toQuotedString(str) {
  return '\'' + escapeQuotes(str) + '\'';
}


function getPathExpr(currentPath, expr, jsonPointers, isNumber) {
  var path = jsonPointers // false by default
              ? '\'/\' + ' + expr + (isNumber ? '' : '.replace(/~/g, \'~0\').replace(/\\//g, \'~1\')')
              : (isNumber ? '\'[\' + ' + expr + ' + \']\'' : '\'[\\\'\' + ' + expr + ' + \'\\\']\'');
  return joinPaths(currentPath, path);
}


function getPath(currentPath, prop, jsonPointers) {
  var path = jsonPointers // false by default
              ? toQuotedString('/' + escapeJsonPointer(prop))
              : toQuotedString(getProperty(prop));
  return joinPaths(currentPath, path);
}


var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/;
var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;
function getData($data, lvl, paths) {
  var up, jsonPointer, data, matches;
  if ($data === '') return 'rootData';
  if ($data[0] == '/') {
    if (!JSON_POINTER.test($data)) throw new Error('Invalid JSON-pointer: ' + $data);
    jsonPointer = $data;
    data = 'rootData';
  } else {
    matches = $data.match(RELATIVE_JSON_POINTER);
    if (!matches) throw new Error('Invalid JSON-pointer: ' + $data);
    up = +matches[1];
    jsonPointer = matches[2];
    if (jsonPointer == '#') {
      if (up >= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);
      return paths[lvl - up];
    }

    if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);
    data = 'data' + ((lvl - up) || '');
    if (!jsonPointer) return data;
  }

  var expr = data;
  var segments = jsonPointer.split('/');
  for (var i=0; i<segments.length; i++) {
    var segment = segments[i];
    if (segment) {
      data += getProperty(unescapeJsonPointer(segment));
      expr += ' && ' + data;
    }
  }
  return expr;
}


function joinPaths (a, b) {
  if (a == '""') return b;
  return (a + ' + ' + b).replace(/([^\\])' \+ '/g, '$1');
}


function unescapeFragment(str) {
  return unescapeJsonPointer(decodeURIComponent(str));
}


function escapeFragment(str) {
  return encodeURIComponent(escapeJsonPointer(str));
}


function escapeJsonPointer(str) {
  return str.replace(/~/g, '~0').replace(/\//g, '~1');
}


function unescapeJsonPointer(str) {
  return str.replace(/~1/g, '/').replace(/~0/g, '~');
}

},{"./ucs2length":9,"fast-deep-equal":42}],11:[function(require,module,exports){
'use strict';

var KEYWORDS = [
  'multipleOf',
  'maximum',
  'exclusiveMaximum',
  'minimum',
  'exclusiveMinimum',
  'maxLength',
  'minLength',
  'pattern',
  'additionalItems',
  'maxItems',
  'minItems',
  'uniqueItems',
  'maxProperties',
  'minProperties',
  'required',
  'additionalProperties',
  'enum',
  'format',
  'const'
];

module.exports = function (metaSchema, keywordsJsonPointers) {
  for (var i=0; i<keywordsJsonPointers.length; i++) {
    metaSchema = JSON.parse(JSON.stringify(metaSchema));
    var segments = keywordsJsonPointers[i].split('/');
    var keywords = metaSchema;
    var j;
    for (j=1; j<segments.length; j++)
      keywords = keywords[segments[j]];

    for (j=0; j<KEYWORDS.length; j++) {
      var key = KEYWORDS[j];
      var schema = keywords[key];
      if (schema) {
        keywords[key] = {
          anyOf: [
            schema,
            { $ref: 'https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#' }
          ]
        };
      }
    }
  }

  return metaSchema;
};

},{}],12:[function(require,module,exports){
'use strict';

var metaSchema = require('./refs/json-schema-draft-07.json');

module.exports = {
  $id: 'https://github.com/ajv-validator/ajv/blob/master/lib/definition_schema.js',
  definitions: {
    simpleTypes: metaSchema.definitions.simpleTypes
  },
  type: 'object',
  dependencies: {
    schema: ['validate'],
    $data: ['validate'],
    statements: ['inline'],
    valid: {not: {required: ['macro']}}
  },
  properties: {
    type: metaSchema.properties.type,
    schema: {type: 'boolean'},
    statements: {type: 'boolean'},
    dependencies: {
      type: 'array',
      items: {type: 'string'}
    },
    metaSchema: {type: 'object'},
    modifying: {type: 'boolean'},
    valid: {type: 'boolean'},
    $data: {type: 'boolean'},
    async: {type: 'boolean'},
    errors: {
      anyOf: [
        {type: 'boolean'},
        {const: 'full'}
      ]
    }
  }
};

},{"./refs/json-schema-draft-07.json":41}],13:[function(require,module,exports){
'use strict';
module.exports = function generate__limit(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $isMax = $keyword == 'maximum',
    $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum',
    $schemaExcl = it.schema[$exclusiveKeyword],
    $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data,
    $op = $isMax ? '<' : '>',
    $notOp = $isMax ? '>' : '<',
    $errorKeyword = undefined;
  if (!($isData || typeof $schema == 'number' || $schema === undefined)) {
    throw new Error($keyword + ' must be number');
  }
  if (!($isDataExcl || $schemaExcl === undefined || typeof $schemaExcl == 'number' || typeof $schemaExcl == 'boolean')) {
    throw new Error($exclusiveKeyword + ' must be number or boolean');
  }
  if ($isDataExcl) {
    var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),
      $exclusive = 'exclusive' + $lvl,
      $exclType = 'exclType' + $lvl,
      $exclIsNumber = 'exclIsNumber' + $lvl,
      $opExpr = 'op' + $lvl,
      $opStr = '\' + ' + $opExpr + ' + \'';
    out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';
    $schemaValueExcl = 'schemaExcl' + $lvl;
    out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { ';
    var $errorKeyword = $exclusiveKeyword;
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' } else if ( ';
    if ($isData) {
      out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
    }
    out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; ';
    if ($schema === undefined) {
      $errorKeyword = $exclusiveKeyword;
      $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
      $schemaValue = $schemaValueExcl;
      $isData = $isDataExcl;
    }
  } else {
    var $exclIsNumber = typeof $schemaExcl == 'number',
      $opStr = $op;
    if ($exclIsNumber && $isData) {
      var $opExpr = '\'' + $opStr + '\'';
      out += ' if ( ';
      if ($isData) {
        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
      }
      out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { ';
    } else {
      if ($exclIsNumber && $schema === undefined) {
        $exclusive = true;
        $errorKeyword = $exclusiveKeyword;
        $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
        $schemaValue = $schemaExcl;
        $notOp += '=';
      } else {
        if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema);
        if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {
          $exclusive = true;
          $errorKeyword = $exclusiveKeyword;
          $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
          $notOp += '=';
        } else {
          $exclusive = false;
          $opStr += '=';
        }
      }
      var $opExpr = '\'' + $opStr + '\'';
      out += ' if ( ';
      if ($isData) {
        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
      }
      out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { ';
    }
  }
  $errorKeyword = $errorKeyword || $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be ' + ($opStr) + ' ';
      if ($isData) {
        out += '\' + ' + ($schemaValue);
      } else {
        out += '' + ($schemaValue) + '\'';
      }
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' } ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],14:[function(require,module,exports){
'use strict';
module.exports = function generate__limitItems(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  var $op = $keyword == 'maxItems' ? '>' : '<';
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
  }
  out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should NOT have ';
      if ($keyword == 'maxItems') {
        out += 'more';
      } else {
        out += 'fewer';
      }
      out += ' than ';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + ($schema);
      }
      out += ' items\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],15:[function(require,module,exports){
'use strict';
module.exports = function generate__limitLength(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  var $op = $keyword == 'maxLength' ? '>' : '<';
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
  }
  if (it.opts.unicode === false) {
    out += ' ' + ($data) + '.length ';
  } else {
    out += ' ucs2length(' + ($data) + ') ';
  }
  out += ' ' + ($op) + ' ' + ($schemaValue) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should NOT be ';
      if ($keyword == 'maxLength') {
        out += 'longer';
      } else {
        out += 'shorter';
      }
      out += ' than ';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + ($schema);
      }
      out += ' characters\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],16:[function(require,module,exports){
'use strict';
module.exports = function generate__limitProperties(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  var $op = $keyword == 'maxProperties' ? '>' : '<';
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
  }
  out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should NOT have ';
      if ($keyword == 'maxProperties') {
        out += 'more';
      } else {
        out += 'fewer';
      }
      out += ' than ';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + ($schema);
      }
      out += ' properties\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],17:[function(require,module,exports){
'use strict';
module.exports = function generate_allOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $currentBaseId = $it.baseId,
    $allSchemasEmpty = true;
  var arr1 = $schema;
  if (arr1) {
    var $sch, $i = -1,
      l1 = arr1.length - 1;
    while ($i < l1) {
      $sch = arr1[$i += 1];
      if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
        $allSchemasEmpty = false;
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + '[' + $i + ']';
        $it.errSchemaPath = $errSchemaPath + '/' + $i;
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
        if ($breakOnError) {
          out += ' if (' + ($nextValid) + ') { ';
          $closingBraces += '}';
        }
      }
    }
  }
  if ($breakOnError) {
    if ($allSchemasEmpty) {
      out += ' if (true) { ';
    } else {
      out += ' ' + ($closingBraces.slice(0, -1)) + ' ';
    }
  }
  return out;
}

},{}],18:[function(require,module,exports){
'use strict';
module.exports = function generate_anyOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $noEmptySchema = $schema.every(function($sch) {
    return (it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all));
  });
  if ($noEmptySchema) {
    var $currentBaseId = $it.baseId;
    out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false;  ';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    var arr1 = $schema;
    if (arr1) {
      var $sch, $i = -1,
        l1 = arr1.length - 1;
      while ($i < l1) {
        $sch = arr1[$i += 1];
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + '[' + $i + ']';
        $it.errSchemaPath = $errSchemaPath + '/' + $i;
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
        out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { ';
        $closingBraces += '}';
      }
    }
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should match some schema in anyOf\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError(vErrors); ';
      } else {
        out += ' validate.errors = vErrors; return false; ';
      }
    }
    out += ' } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
    if (it.opts.allErrors) {
      out += ' } ';
    }
  } else {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  }
  return out;
}

},{}],19:[function(require,module,exports){
'use strict';
module.exports = function generate_comment(it, $keyword, $ruleType) {
  var out = ' ';
  var $schema = it.schema[$keyword];
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $comment = it.util.toQuotedString($schema);
  if (it.opts.$comment === true) {
    out += ' console.log(' + ($comment) + ');';
  } else if (typeof it.opts.$comment == 'function') {
    out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);';
  }
  return out;
}

},{}],20:[function(require,module,exports){
'use strict';
module.exports = function generate_const(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!$isData) {
    out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';';
  }
  out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be equal to constant\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' }';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],21:[function(require,module,exports){
'use strict';
module.exports = function generate_contains(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $idx = 'i' + $lvl,
    $dataNxt = $it.dataLevel = it.dataLevel + 1,
    $nextData = 'data' + $dataNxt,
    $currentBaseId = it.baseId,
    $nonEmptySchema = (it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all));
  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
  if ($nonEmptySchema) {
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';
    $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
    var $passData = $data + '[' + $idx + ']';
    $it.dataPathArr[$dataNxt] = $idx;
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
    if (it.util.varOccurences($code, $nextData) < 2) {
      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
    } else {
      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
    }
    out += ' if (' + ($nextValid) + ') break; }  ';
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {';
  } else {
    out += ' if (' + ($data) + '.length == 0) {';
  }
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should contain a valid item\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' } else { ';
  if ($nonEmptySchema) {
    out += '  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
  }
  if (it.opts.allErrors) {
    out += ' } ';
  }
  return out;
}

},{}],22:[function(require,module,exports){
'use strict';
module.exports = function generate_custom(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $rule = this,
    $definition = 'definition' + $lvl,
    $rDef = $rule.definition,
    $closingBraces = '';
  var $compile, $inline, $macro, $ruleValidate, $validateCode;
  if ($isData && $rDef.$data) {
    $validateCode = 'keywordValidate' + $lvl;
    var $validateSchema = $rDef.validateSchema;
    out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;';
  } else {
    $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it);
    if (!$ruleValidate) return;
    $schemaValue = 'validate.schema' + $schemaPath;
    $validateCode = $ruleValidate.code;
    $compile = $rDef.compile;
    $inline = $rDef.inline;
    $macro = $rDef.macro;
  }
  var $ruleErrs = $validateCode + '.errors',
    $i = 'i' + $lvl,
    $ruleErr = 'ruleErr' + $lvl,
    $asyncKeyword = $rDef.async;
  if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema');
  if (!($inline || $macro)) {
    out += '' + ($ruleErrs) + ' = null;';
  }
  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
  if ($isData && $rDef.$data) {
    $closingBraces += '}';
    out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { ';
    if ($validateSchema) {
      $closingBraces += '}';
      out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { ';
    }
  }
  if ($inline) {
    if ($rDef.statements) {
      out += ' ' + ($ruleValidate.validate) + ' ';
    } else {
      out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; ';
    }
  } else if ($macro) {
    var $it = it.util.copy(it);
    var $closingBraces = '';
    $it.level++;
    var $nextValid = 'valid' + $it.level;
    $it.schema = $ruleValidate.validate;
    $it.schemaPath = '';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    var $code = it.validate($it).replace(/validate\.schema/g, $validateCode);
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' ' + ($code);
  } else {
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
    out += '  ' + ($validateCode) + '.call( ';
    if (it.opts.passContext) {
      out += 'this';
    } else {
      out += 'self';
    }
    if ($compile || $rDef.schema === false) {
      out += ' , ' + ($data) + ' ';
    } else {
      out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' ';
    }
    out += ' , (dataPath || \'\')';
    if (it.errorPath != '""') {
      out += ' + ' + (it.errorPath);
    }
    var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',
      $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
    out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData )  ';
    var def_callRuleValidate = out;
    out = $$outStack.pop();
    if ($rDef.errors === false) {
      out += ' ' + ($valid) + ' = ';
      if ($asyncKeyword) {
        out += 'await ';
      }
      out += '' + (def_callRuleValidate) + '; ';
    } else {
      if ($asyncKeyword) {
        $ruleErrs = 'customErrors' + $lvl;
        out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } ';
      } else {
        out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; ';
      }
    }
  }
  if ($rDef.modifying) {
    out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];';
  }
  out += '' + ($closingBraces);
  if ($rDef.valid) {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  } else {
    out += ' if ( ';
    if ($rDef.valid === undefined) {
      out += ' !';
      if ($macro) {
        out += '' + ($nextValid);
      } else {
        out += '' + ($valid);
      }
    } else {
      out += ' ' + (!$rDef.valid) + ' ';
    }
    out += ') { ';
    $errorKeyword = $rule.keyword;
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    var def_customError = out;
    out = $$outStack.pop();
    if ($inline) {
      if ($rDef.errors) {
        if ($rDef.errors != 'full') {
          out += '  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + '; if (' + ($ruleErr) + '.schemaPath === undefined) { ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '"; } ';
          if (it.opts.verbose) {
            out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
          }
          out += ' } ';
        }
      } else {
        if ($rDef.errors === false) {
          out += ' ' + (def_customError) + ' ';
        } else {
          out += ' if (' + ($errs) + ' == errors) { ' + (def_customError) + ' } else {  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + '; if (' + ($ruleErr) + '.schemaPath === undefined) { ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '"; } ';
          if (it.opts.verbose) {
            out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
          }
          out += ' } } ';
        }
      }
    } else if ($macro) {
      out += '   var err =   '; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } ';
        if (it.opts.messages !== false) {
          out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
      if (!it.compositeRule && $breakOnError) {
        /* istanbul ignore if */
        if (it.async) {
          out += ' throw new ValidationError(vErrors); ';
        } else {
          out += ' validate.errors = vErrors; return false; ';
        }
      }
    } else {
      if ($rDef.errors === false) {
        out += ' ' + (def_customError) + ' ';
      } else {
        out += ' if (Array.isArray(' + ($ruleErrs) + ')) { if (vErrors === null) vErrors = ' + ($ruleErrs) + '; else vErrors = vErrors.concat(' + ($ruleErrs) + '); errors = vErrors.length;  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + ';  ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '";  ';
        if (it.opts.verbose) {
          out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
        }
        out += ' } } else { ' + (def_customError) + ' } ';
      }
    }
    out += ' } ';
    if ($breakOnError) {
      out += ' else { ';
    }
  }
  return out;
}

},{}],23:[function(require,module,exports){
'use strict';
module.exports = function generate_dependencies(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $schemaDeps = {},
    $propertyDeps = {},
    $ownProperties = it.opts.ownProperties;
  for ($property in $schema) {
    if ($property == '__proto__') continue;
    var $sch = $schema[$property];
    var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;
    $deps[$property] = $sch;
  }
  out += 'var ' + ($errs) + ' = errors;';
  var $currentErrorPath = it.errorPath;
  out += 'var missing' + ($lvl) + ';';
  for (var $property in $propertyDeps) {
    $deps = $propertyDeps[$property];
    if ($deps.length) {
      out += ' if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';
      if ($ownProperties) {
        out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') ';
      }
      if ($breakOnError) {
        out += ' && ( ';
        var arr1 = $deps;
        if (arr1) {
          var $propertyKey, $i = -1,
            l1 = arr1.length - 1;
          while ($i < l1) {
            $propertyKey = arr1[$i += 1];
            if ($i) {
              out += ' || ';
            }
            var $prop = it.util.getProperty($propertyKey),
              $useData = $data + $prop;
            out += ' ( ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';
          }
        }
        out += ')) {  ';
        var $propertyPath = 'missing' + $lvl,
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;
        }
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'should have ';
            if ($deps.length == 1) {
              out += 'property ' + (it.util.escapeQuotes($deps[0]));
            } else {
              out += 'properties ' + (it.util.escapeQuotes($deps.join(", ")));
            }
            out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
      } else {
        out += ' ) { ';
        var arr2 = $deps;
        if (arr2) {
          var $propertyKey, i2 = -1,
            l2 = arr2.length - 1;
          while (i2 < l2) {
            $propertyKey = arr2[i2 += 1];
            var $prop = it.util.getProperty($propertyKey),
              $missingProperty = it.util.escapeQuotes($propertyKey),
              $useData = $data + $prop;
            if (it.opts._errorDataPathProperty) {
              it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
            }
            out += ' if ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') {  var err =   '; /* istanbul ignore else */
            if (it.createErrors !== false) {
              out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } ';
              if (it.opts.messages !== false) {
                out += ' , message: \'should have ';
                if ($deps.length == 1) {
                  out += 'property ' + (it.util.escapeQuotes($deps[0]));
                } else {
                  out += 'properties ' + (it.util.escapeQuotes($deps.join(", ")));
                }
                out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' ';
              }
              if (it.opts.verbose) {
                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
              }
              out += ' } ';
            } else {
              out += ' {} ';
            }
            out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';
          }
        }
      }
      out += ' }   ';
      if ($breakOnError) {
        $closingBraces += '}';
        out += ' else { ';
      }
    }
  }
  it.errorPath = $currentErrorPath;
  var $currentBaseId = $it.baseId;
  for (var $property in $schemaDeps) {
    var $sch = $schemaDeps[$property];
    if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
      out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';
      if ($ownProperties) {
        out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') ';
      }
      out += ') { ';
      $it.schema = $sch;
      $it.schemaPath = $schemaPath + it.util.getProperty($property);
      $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);
      out += '  ' + (it.validate($it)) + ' ';
      $it.baseId = $currentBaseId;
      out += ' }  ';
      if ($breakOnError) {
        out += ' if (' + ($nextValid) + ') { ';
        $closingBraces += '}';
      }
    }
  }
  if ($breakOnError) {
    out += '   ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}

},{}],24:[function(require,module,exports){
'use strict';
module.exports = function generate_enum(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $i = 'i' + $lvl,
    $vSchema = 'schema' + $lvl;
  if (!$isData) {
    out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';';
  }
  out += 'var ' + ($valid) + ';';
  if ($isData) {
    out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';
  }
  out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }';
  if ($isData) {
    out += '  }  ';
  }
  out += ' if (!' + ($valid) + ') {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('enum') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be equal to one of the allowed values\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' }';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],25:[function(require,module,exports){
'use strict';
module.exports = function generate_format(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  if (it.opts.format === false) {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
    return out;
  }
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $unknownFormats = it.opts.unknownFormats,
    $allowUnknown = Array.isArray($unknownFormats);
  if ($isData) {
    var $format = 'format' + $lvl,
      $isObject = 'isObject' + $lvl,
      $formatType = 'formatType' + $lvl;
    out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \'string\'; if (' + ($isObject) + ') { ';
    if (it.async) {
      out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; ';
    }
    out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if (  ';
    if ($isData) {
      out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || ';
    }
    out += ' (';
    if ($unknownFormats != 'ignore') {
      out += ' (' + ($schemaValue) + ' && !' + ($format) + ' ';
      if ($allowUnknown) {
        out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 ';
      }
      out += ') || ';
    }
    out += ' (' + ($format) + ' && ' + ($formatType) + ' == \'' + ($ruleType) + '\' && !(typeof ' + ($format) + ' == \'function\' ? ';
    if (it.async) {
      out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) ';
    } else {
      out += ' ' + ($format) + '(' + ($data) + ') ';
    }
    out += ' : ' + ($format) + '.test(' + ($data) + '))))) {';
  } else {
    var $format = it.formats[$schema];
    if (!$format) {
      if ($unknownFormats == 'ignore') {
        it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"');
        if ($breakOnError) {
          out += ' if (true) { ';
        }
        return out;
      } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) {
        if ($breakOnError) {
          out += ' if (true) { ';
        }
        return out;
      } else {
        throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"');
      }
    }
    var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate;
    var $formatType = $isObject && $format.type || 'string';
    if ($isObject) {
      var $async = $format.async === true;
      $format = $format.validate;
    }
    if ($formatType != $ruleType) {
      if ($breakOnError) {
        out += ' if (true) { ';
      }
      return out;
    }
    if ($async) {
      if (!it.async) throw new Error('async format in sync schema');
      var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate';
      out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { ';
    } else {
      out += ' if (! ';
      var $formatRef = 'formats' + it.util.getProperty($schema);
      if ($isObject) $formatRef += '.validate';
      if (typeof $format == 'function') {
        out += ' ' + ($formatRef) + '(' + ($data) + ') ';
      } else {
        out += ' ' + ($formatRef) + '.test(' + ($data) + ') ';
      }
      out += ') { ';
    }
  }
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format:  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += '  } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should match format "';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + (it.util.escapeQuotes($schema));
      }
      out += '"\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + (it.util.toQuotedString($schema));
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += ' } ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],26:[function(require,module,exports){
'use strict';
module.exports = function generate_if(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $thenSch = it.schema['then'],
    $elseSch = it.schema['else'],
    $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? (typeof $thenSch == 'object' && Object.keys($thenSch).length > 0) || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)),
    $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? (typeof $elseSch == 'object' && Object.keys($elseSch).length > 0) || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)),
    $currentBaseId = $it.baseId;
  if ($thenPresent || $elsePresent) {
    var $ifClause;
    $it.createErrors = false;
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true;  ';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    out += '  ' + (it.validate($it)) + ' ';
    $it.baseId = $currentBaseId;
    $it.createErrors = true;
    out += '  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }  ';
    it.compositeRule = $it.compositeRule = $wasComposite;
    if ($thenPresent) {
      out += ' if (' + ($nextValid) + ') {  ';
      $it.schema = it.schema['then'];
      $it.schemaPath = it.schemaPath + '.then';
      $it.errSchemaPath = it.errSchemaPath + '/then';
      out += '  ' + (it.validate($it)) + ' ';
      $it.baseId = $currentBaseId;
      out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';
      if ($thenPresent && $elsePresent) {
        $ifClause = 'ifClause' + $lvl;
        out += ' var ' + ($ifClause) + ' = \'then\'; ';
      } else {
        $ifClause = '\'then\'';
      }
      out += ' } ';
      if ($elsePresent) {
        out += ' else { ';
      }
    } else {
      out += ' if (!' + ($nextValid) + ') { ';
    }
    if ($elsePresent) {
      $it.schema = it.schema['else'];
      $it.schemaPath = it.schemaPath + '.else';
      $it.errSchemaPath = it.errSchemaPath + '/else';
      out += '  ' + (it.validate($it)) + ' ';
      $it.baseId = $currentBaseId;
      out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';
      if ($thenPresent && $elsePresent) {
        $ifClause = 'ifClause' + $lvl;
        out += ' var ' + ($ifClause) + ' = \'else\'; ';
      } else {
        $ifClause = '\'else\'';
      }
      out += ' } ';
    }
    out += ' if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('if') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should match "\' + ' + ($ifClause) + ' + \'" schema\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError(vErrors); ';
      } else {
        out += ' validate.errors = vErrors; return false; ';
      }
    }
    out += ' }   ';
    if ($breakOnError) {
      out += ' else { ';
    }
  } else {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  }
  return out;
}

},{}],27:[function(require,module,exports){
'use strict';

//all requires must be explicit because browserify won't work with dynamic requires
module.exports = {
  '$ref': require('./ref'),
  allOf: require('./allOf'),
  anyOf: require('./anyOf'),
  '$comment': require('./comment'),
  const: require('./const'),
  contains: require('./contains'),
  dependencies: require('./dependencies'),
  'enum': require('./enum'),
  format: require('./format'),
  'if': require('./if'),
  items: require('./items'),
  maximum: require('./_limit'),
  minimum: require('./_limit'),
  maxItems: require('./_limitItems'),
  minItems: require('./_limitItems'),
  maxLength: require('./_limitLength'),
  minLength: require('./_limitLength'),
  maxProperties: require('./_limitProperties'),
  minProperties: require('./_limitProperties'),
  multipleOf: require('./multipleOf'),
  not: require('./not'),
  oneOf: require('./oneOf'),
  pattern: require('./pattern'),
  properties: require('./properties'),
  propertyNames: require('./propertyNames'),
  required: require('./required'),
  uniqueItems: require('./uniqueItems'),
  validate: require('./validate')
};

},{"./_limit":13,"./_limitItems":14,"./_limitLength":15,"./_limitProperties":16,"./allOf":17,"./anyOf":18,"./comment":19,"./const":20,"./contains":21,"./dependencies":23,"./enum":24,"./format":25,"./if":26,"./items":28,"./multipleOf":29,"./not":30,"./oneOf":31,"./pattern":32,"./properties":33,"./propertyNames":34,"./ref":35,"./required":36,"./uniqueItems":37,"./validate":38}],28:[function(require,module,exports){
'use strict';
module.exports = function generate_items(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $idx = 'i' + $lvl,
    $dataNxt = $it.dataLevel = it.dataLevel + 1,
    $nextData = 'data' + $dataNxt,
    $currentBaseId = it.baseId;
  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
  if (Array.isArray($schema)) {
    var $additionalItems = it.schema.additionalItems;
    if ($additionalItems === false) {
      out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; ';
      var $currErrSchemaPath = $errSchemaPath;
      $errSchemaPath = it.errSchemaPath + '/additionalItems';
      out += '  if (!' + ($valid) + ') {   ';
      var $$outStack = $$outStack || [];
      $$outStack.push(out);
      out = ''; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } ';
        if (it.opts.messages !== false) {
          out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      var __err = out;
      out = $$outStack.pop();
      if (!it.compositeRule && $breakOnError) {
        /* istanbul ignore if */
        if (it.async) {
          out += ' throw new ValidationError([' + (__err) + ']); ';
        } else {
          out += ' validate.errors = [' + (__err) + ']; return false; ';
        }
      } else {
        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
      }
      out += ' } ';
      $errSchemaPath = $currErrSchemaPath;
      if ($breakOnError) {
        $closingBraces += '}';
        out += ' else { ';
      }
    }
    var arr1 = $schema;
    if (arr1) {
      var $sch, $i = -1,
        l1 = arr1.length - 1;
      while ($i < l1) {
        $sch = arr1[$i += 1];
        if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
          out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { ';
          var $passData = $data + '[' + $i + ']';
          $it.schema = $sch;
          $it.schemaPath = $schemaPath + '[' + $i + ']';
          $it.errSchemaPath = $errSchemaPath + '/' + $i;
          $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true);
          $it.dataPathArr[$dataNxt] = $i;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          out += ' }  ';
          if ($breakOnError) {
            out += ' if (' + ($nextValid) + ') { ';
            $closingBraces += '}';
          }
        }
      }
    }
    if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? (typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0) || $additionalItems === false : it.util.schemaHasRules($additionalItems, it.RULES.all))) {
      $it.schema = $additionalItems;
      $it.schemaPath = it.schemaPath + '.additionalItems';
      $it.errSchemaPath = it.errSchemaPath + '/additionalItems';
      out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') {  for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';
      $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
      var $passData = $data + '[' + $idx + ']';
      $it.dataPathArr[$dataNxt] = $idx;
      var $code = it.validate($it);
      $it.baseId = $currentBaseId;
      if (it.util.varOccurences($code, $nextData) < 2) {
        out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
      } else {
        out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
      }
      if ($breakOnError) {
        out += ' if (!' + ($nextValid) + ') break; ';
      }
      out += ' } }  ';
      if ($breakOnError) {
        out += ' if (' + ($nextValid) + ') { ';
        $closingBraces += '}';
      }
    }
  } else if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += '  for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';
    $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
    var $passData = $data + '[' + $idx + ']';
    $it.dataPathArr[$dataNxt] = $idx;
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
    if (it.util.varOccurences($code, $nextData) < 2) {
      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
    } else {
      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
    }
    if ($breakOnError) {
      out += ' if (!' + ($nextValid) + ') break; ';
    }
    out += ' }';
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}

},{}],29:[function(require,module,exports){
'use strict';
module.exports = function generate_multipleOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (!($isData || typeof $schema == 'number')) {
    throw new Error($keyword + ' must be number');
  }
  out += 'var division' + ($lvl) + ';if (';
  if ($isData) {
    out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || ';
  }
  out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', ';
  if (it.opts.multipleOfPrecision) {
    out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' ';
  } else {
    out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') ';
  }
  out += ' ) ';
  if ($isData) {
    out += '  )  ';
  }
  out += ' ) {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be multiple of ';
      if ($isData) {
        out += '\' + ' + ($schemaValue);
      } else {
        out += '' + ($schemaValue) + '\'';
      }
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + ($schema);
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],30:[function(require,module,exports){
'use strict';
module.exports = function generate_not(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    out += ' var ' + ($errs) + ' = errors;  ';
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    $it.createErrors = false;
    var $allErrorsOption;
    if ($it.opts.allErrors) {
      $allErrorsOption = $it.opts.allErrors;
      $it.opts.allErrors = false;
    }
    out += ' ' + (it.validate($it)) + ' ';
    $it.createErrors = true;
    if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption;
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' if (' + ($nextValid) + ') {   ';
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should NOT be valid\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
    if (it.opts.allErrors) {
      out += ' } ';
    }
  } else {
    out += '  var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should NOT be valid\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if ($breakOnError) {
      out += ' if (false) { ';
    }
  }
  return out;
}

},{}],31:[function(require,module,exports){
'use strict';
module.exports = function generate_oneOf(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $currentBaseId = $it.baseId,
    $prevValid = 'prevValid' + $lvl,
    $passingSchemas = 'passingSchemas' + $lvl;
  out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; ';
  var $wasComposite = it.compositeRule;
  it.compositeRule = $it.compositeRule = true;
  var arr1 = $schema;
  if (arr1) {
    var $sch, $i = -1,
      l1 = arr1.length - 1;
    while ($i < l1) {
      $sch = arr1[$i += 1];
      if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
        $it.schema = $sch;
        $it.schemaPath = $schemaPath + '[' + $i + ']';
        $it.errSchemaPath = $errSchemaPath + '/' + $i;
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
      } else {
        out += ' var ' + ($nextValid) + ' = true; ';
      }
      if ($i) {
        out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { ';
        $closingBraces += '}';
      }
      out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }';
    }
  }
  it.compositeRule = $it.compositeRule = $wasComposite;
  out += '' + ($closingBraces) + 'if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should match exactly one schema in oneOf\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError(vErrors); ';
    } else {
      out += ' validate.errors = vErrors; return false; ';
    }
  }
  out += '} else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }';
  if (it.opts.allErrors) {
    out += ' } ';
  }
  return out;
}

},{}],32:[function(require,module,exports){
'use strict';
module.exports = function generate_pattern(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema);
  out += 'if ( ';
  if ($isData) {
    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || ';
  }
  out += ' !' + ($regexp) + '.test(' + ($data) + ') ) {   ';
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern:  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += '  } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should match pattern "';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + (it.util.escapeQuotes($schema));
      }
      out += '"\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + (it.util.toQuotedString($schema));
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '} ';
  if ($breakOnError) {
    out += ' else { ';
  }
  return out;
}

},{}],33:[function(require,module,exports){
'use strict';
module.exports = function generate_properties(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $key = 'key' + $lvl,
    $idx = 'idx' + $lvl,
    $dataNxt = $it.dataLevel = it.dataLevel + 1,
    $nextData = 'data' + $dataNxt,
    $dataProperties = 'dataProperties' + $lvl;
  var $schemaKeys = Object.keys($schema || {}).filter(notProto),
    $pProperties = it.schema.patternProperties || {},
    $pPropertyKeys = Object.keys($pProperties).filter(notProto),
    $aProperties = it.schema.additionalProperties,
    $someProperties = $schemaKeys.length || $pPropertyKeys.length,
    $noAdditional = $aProperties === false,
    $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length,
    $removeAdditional = it.opts.removeAdditional,
    $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional,
    $ownProperties = it.opts.ownProperties,
    $currentBaseId = it.baseId;
  var $required = it.schema.required;
  if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) {
    var $requiredHash = it.util.toHash($required);
  }

  function notProto(p) {
    return p !== '__proto__';
  }
  out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;';
  if ($ownProperties) {
    out += ' var ' + ($dataProperties) + ' = undefined;';
  }
  if ($checkAdditional) {
    if ($ownProperties) {
      out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
    } else {
      out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
    }
    if ($someProperties) {
      out += ' var isAdditional' + ($lvl) + ' = !(false ';
      if ($schemaKeys.length) {
        if ($schemaKeys.length > 8) {
          out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') ';
        } else {
          var arr1 = $schemaKeys;
          if (arr1) {
            var $propertyKey, i1 = -1,
              l1 = arr1.length - 1;
            while (i1 < l1) {
              $propertyKey = arr1[i1 += 1];
              out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' ';
            }
          }
        }
      }
      if ($pPropertyKeys.length) {
        var arr2 = $pPropertyKeys;
        if (arr2) {
          var $pProperty, $i = -1,
            l2 = arr2.length - 1;
          while ($i < l2) {
            $pProperty = arr2[$i += 1];
            out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') ';
          }
        }
      }
      out += ' ); if (isAdditional' + ($lvl) + ') { ';
    }
    if ($removeAdditional == 'all') {
      out += ' delete ' + ($data) + '[' + ($key) + ']; ';
    } else {
      var $currentErrorPath = it.errorPath;
      var $additionalProperty = '\' + ' + $key + ' + \'';
      if (it.opts._errorDataPathProperty) {
        it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
      }
      if ($noAdditional) {
        if ($removeAdditional) {
          out += ' delete ' + ($data) + '[' + ($key) + ']; ';
        } else {
          out += ' ' + ($nextValid) + ' = false; ';
          var $currErrSchemaPath = $errSchemaPath;
          $errSchemaPath = it.errSchemaPath + '/additionalProperties';
          var $$outStack = $$outStack || [];
          $$outStack.push(out);
          out = ''; /* istanbul ignore else */
          if (it.createErrors !== false) {
            out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } ';
            if (it.opts.messages !== false) {
              out += ' , message: \'';
              if (it.opts._errorDataPathProperty) {
                out += 'is an invalid additional property';
              } else {
                out += 'should NOT have additional properties';
              }
              out += '\' ';
            }
            if (it.opts.verbose) {
              out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
            }
            out += ' } ';
          } else {
            out += ' {} ';
          }
          var __err = out;
          out = $$outStack.pop();
          if (!it.compositeRule && $breakOnError) {
            /* istanbul ignore if */
            if (it.async) {
              out += ' throw new ValidationError([' + (__err) + ']); ';
            } else {
              out += ' validate.errors = [' + (__err) + ']; return false; ';
            }
          } else {
            out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
          }
          $errSchemaPath = $currErrSchemaPath;
          if ($breakOnError) {
            out += ' break; ';
          }
        }
      } else if ($additionalIsSchema) {
        if ($removeAdditional == 'failing') {
          out += ' var ' + ($errs) + ' = errors;  ';
          var $wasComposite = it.compositeRule;
          it.compositeRule = $it.compositeRule = true;
          $it.schema = $aProperties;
          $it.schemaPath = it.schemaPath + '.additionalProperties';
          $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';
          $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
          var $passData = $data + '[' + $key + ']';
          $it.dataPathArr[$dataNxt] = $key;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; }  ';
          it.compositeRule = $it.compositeRule = $wasComposite;
        } else {
          $it.schema = $aProperties;
          $it.schemaPath = it.schemaPath + '.additionalProperties';
          $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';
          $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
          var $passData = $data + '[' + $key + ']';
          $it.dataPathArr[$dataNxt] = $key;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          if ($breakOnError) {
            out += ' if (!' + ($nextValid) + ') break; ';
          }
        }
      }
      it.errorPath = $currentErrorPath;
    }
    if ($someProperties) {
      out += ' } ';
    }
    out += ' }  ';
    if ($breakOnError) {
      out += ' if (' + ($nextValid) + ') { ';
      $closingBraces += '}';
    }
  }
  var $useDefaults = it.opts.useDefaults && !it.compositeRule;
  if ($schemaKeys.length) {
    var arr3 = $schemaKeys;
    if (arr3) {
      var $propertyKey, i3 = -1,
        l3 = arr3.length - 1;
      while (i3 < l3) {
        $propertyKey = arr3[i3 += 1];
        var $sch = $schema[$propertyKey];
        if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
          var $prop = it.util.getProperty($propertyKey),
            $passData = $data + $prop,
            $hasDefault = $useDefaults && $sch.default !== undefined;
          $it.schema = $sch;
          $it.schemaPath = $schemaPath + $prop;
          $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey);
          $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);
          $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            $code = it.util.varReplace($code, $nextData, $passData);
            var $useData = $passData;
          } else {
            var $useData = $nextData;
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ';
          }
          if ($hasDefault) {
            out += ' ' + ($code) + ' ';
          } else {
            if ($requiredHash && $requiredHash[$propertyKey]) {
              out += ' if ( ' + ($useData) + ' === undefined ';
              if ($ownProperties) {
                out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
              }
              out += ') { ' + ($nextValid) + ' = false; ';
              var $currentErrorPath = it.errorPath,
                $currErrSchemaPath = $errSchemaPath,
                $missingProperty = it.util.escapeQuotes($propertyKey);
              if (it.opts._errorDataPathProperty) {
                it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
              }
              $errSchemaPath = it.errSchemaPath + '/required';
              var $$outStack = $$outStack || [];
              $$outStack.push(out);
              out = ''; /* istanbul ignore else */
              if (it.createErrors !== false) {
                out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
                if (it.opts.messages !== false) {
                  out += ' , message: \'';
                  if (it.opts._errorDataPathProperty) {
                    out += 'is a required property';
                  } else {
                    out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
                  }
                  out += '\' ';
                }
                if (it.opts.verbose) {
                  out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
                }
                out += ' } ';
              } else {
                out += ' {} ';
              }
              var __err = out;
              out = $$outStack.pop();
              if (!it.compositeRule && $breakOnError) {
                /* istanbul ignore if */
                if (it.async) {
                  out += ' throw new ValidationError([' + (__err) + ']); ';
                } else {
                  out += ' validate.errors = [' + (__err) + ']; return false; ';
                }
              } else {
                out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
              }
              $errSchemaPath = $currErrSchemaPath;
              it.errorPath = $currentErrorPath;
              out += ' } else { ';
            } else {
              if ($breakOnError) {
                out += ' if ( ' + ($useData) + ' === undefined ';
                if ($ownProperties) {
                  out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
                }
                out += ') { ' + ($nextValid) + ' = true; } else { ';
              } else {
                out += ' if (' + ($useData) + ' !== undefined ';
                if ($ownProperties) {
                  out += ' &&   Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
                }
                out += ' ) { ';
              }
            }
            out += ' ' + ($code) + ' } ';
          }
        }
        if ($breakOnError) {
          out += ' if (' + ($nextValid) + ') { ';
          $closingBraces += '}';
        }
      }
    }
  }
  if ($pPropertyKeys.length) {
    var arr4 = $pPropertyKeys;
    if (arr4) {
      var $pProperty, i4 = -1,
        l4 = arr4.length - 1;
      while (i4 < l4) {
        $pProperty = arr4[i4 += 1];
        var $sch = $pProperties[$pProperty];
        if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
          $it.schema = $sch;
          $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty);
          $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty);
          if ($ownProperties) {
            out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
          } else {
            out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
          }
          out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { ';
          $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
          var $passData = $data + '[' + $key + ']';
          $it.dataPathArr[$dataNxt] = $key;
          var $code = it.validate($it);
          $it.baseId = $currentBaseId;
          if (it.util.varOccurences($code, $nextData) < 2) {
            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
          } else {
            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
          }
          if ($breakOnError) {
            out += ' if (!' + ($nextValid) + ') break; ';
          }
          out += ' } ';
          if ($breakOnError) {
            out += ' else ' + ($nextValid) + ' = true; ';
          }
          out += ' }  ';
          if ($breakOnError) {
            out += ' if (' + ($nextValid) + ') { ';
            $closingBraces += '}';
          }
        }
      }
    }
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}

},{}],34:[function(require,module,exports){
'use strict';
module.exports = function generate_propertyNames(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  out += 'var ' + ($errs) + ' = errors;';
  if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {
    $it.schema = $schema;
    $it.schemaPath = $schemaPath;
    $it.errSchemaPath = $errSchemaPath;
    var $key = 'key' + $lvl,
      $idx = 'idx' + $lvl,
      $i = 'i' + $lvl,
      $invalidName = '\' + ' + $key + ' + \'',
      $dataNxt = $it.dataLevel = it.dataLevel + 1,
      $nextData = 'data' + $dataNxt,
      $dataProperties = 'dataProperties' + $lvl,
      $ownProperties = it.opts.ownProperties,
      $currentBaseId = it.baseId;
    if ($ownProperties) {
      out += ' var ' + ($dataProperties) + ' = undefined; ';
    }
    if ($ownProperties) {
      out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
    } else {
      out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
    }
    out += ' var startErrs' + ($lvl) + ' = errors; ';
    var $passData = $key;
    var $wasComposite = it.compositeRule;
    it.compositeRule = $it.compositeRule = true;
    var $code = it.validate($it);
    $it.baseId = $currentBaseId;
    if (it.util.varOccurences($code, $nextData) < 2) {
      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
    } else {
      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
    }
    it.compositeRule = $it.compositeRule = $wasComposite;
    out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + '<errors; ' + ($i) + '++) { vErrors[' + ($i) + '].propertyName = ' + ($key) + '; }   var err =   '; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('propertyNames') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { propertyName: \'' + ($invalidName) + '\' } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'property name \\\'' + ($invalidName) + '\\\' is invalid\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError(vErrors); ';
      } else {
        out += ' validate.errors = vErrors; return false; ';
      }
    }
    if ($breakOnError) {
      out += ' break; ';
    }
    out += ' } }';
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
  }
  return out;
}

},{}],35:[function(require,module,exports){
'use strict';
module.exports = function generate_ref(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $async, $refCode;
  if ($schema == '#' || $schema == '#/') {
    if (it.isRoot) {
      $async = it.async;
      $refCode = 'validate';
    } else {
      $async = it.root.schema.$async === true;
      $refCode = 'root.refVal[0]';
    }
  } else {
    var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot);
    if ($refVal === undefined) {
      var $message = it.MissingRefError.message(it.baseId, $schema);
      if (it.opts.missingRefs == 'fail') {
        it.logger.error($message);
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('$ref') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { ref: \'' + (it.util.escapeQuotes($schema)) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'can\\\'t resolve reference ' + (it.util.escapeQuotes($schema)) + '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: ' + (it.util.toQuotedString($schema)) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        if ($breakOnError) {
          out += ' if (false) { ';
        }
      } else if (it.opts.missingRefs == 'ignore') {
        it.logger.warn($message);
        if ($breakOnError) {
          out += ' if (true) { ';
        }
      } else {
        throw new it.MissingRefError(it.baseId, $schema, $message);
      }
    } else if ($refVal.inline) {
      var $it = it.util.copy(it);
      $it.level++;
      var $nextValid = 'valid' + $it.level;
      $it.schema = $refVal.schema;
      $it.schemaPath = '';
      $it.errSchemaPath = $schema;
      var $code = it.validate($it).replace(/validate\.schema/g, $refVal.code);
      out += ' ' + ($code) + ' ';
      if ($breakOnError) {
        out += ' if (' + ($nextValid) + ') { ';
      }
    } else {
      $async = $refVal.$async === true || (it.async && $refVal.$async !== false);
      $refCode = $refVal.code;
    }
  }
  if ($refCode) {
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = '';
    if (it.opts.passContext) {
      out += ' ' + ($refCode) + '.call(this, ';
    } else {
      out += ' ' + ($refCode) + '( ';
    }
    out += ' ' + ($data) + ', (dataPath || \'\')';
    if (it.errorPath != '""') {
      out += ' + ' + (it.errorPath);
    }
    var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',
      $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
    out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ', rootData)  ';
    var __callValidate = out;
    out = $$outStack.pop();
    if ($async) {
      if (!it.async) throw new Error('async schema referenced by sync schema');
      if ($breakOnError) {
        out += ' var ' + ($valid) + '; ';
      }
      out += ' try { await ' + (__callValidate) + '; ';
      if ($breakOnError) {
        out += ' ' + ($valid) + ' = true; ';
      }
      out += ' } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ';
      if ($breakOnError) {
        out += ' ' + ($valid) + ' = false; ';
      }
      out += ' } ';
      if ($breakOnError) {
        out += ' if (' + ($valid) + ') { ';
      }
    } else {
      out += ' if (!' + (__callValidate) + ') { if (vErrors === null) vErrors = ' + ($refCode) + '.errors; else vErrors = vErrors.concat(' + ($refCode) + '.errors); errors = vErrors.length; } ';
      if ($breakOnError) {
        out += ' else { ';
      }
    }
  }
  return out;
}

},{}],36:[function(require,module,exports){
'use strict';
module.exports = function generate_required(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  var $vSchema = 'schema' + $lvl;
  if (!$isData) {
    if ($schema.length < it.opts.loopRequired && it.schema.properties && Object.keys(it.schema.properties).length) {
      var $required = [];
      var arr1 = $schema;
      if (arr1) {
        var $property, i1 = -1,
          l1 = arr1.length - 1;
        while (i1 < l1) {
          $property = arr1[i1 += 1];
          var $propertySch = it.schema.properties[$property];
          if (!($propertySch && (it.opts.strictKeywords ? (typeof $propertySch == 'object' && Object.keys($propertySch).length > 0) || $propertySch === false : it.util.schemaHasRules($propertySch, it.RULES.all)))) {
            $required[$required.length] = $property;
          }
        }
      }
    } else {
      var $required = $schema;
    }
  }
  if ($isData || $required.length) {
    var $currentErrorPath = it.errorPath,
      $loopRequired = $isData || $required.length >= it.opts.loopRequired,
      $ownProperties = it.opts.ownProperties;
    if ($breakOnError) {
      out += ' var missing' + ($lvl) + '; ';
      if ($loopRequired) {
        if (!$isData) {
          out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';
        }
        var $i = 'i' + $lvl,
          $propertyPath = 'schema' + $lvl + '[' + $i + ']',
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);
        }
        out += ' var ' + ($valid) + ' = true; ';
        if ($isData) {
          out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';
        }
        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined ';
        if ($ownProperties) {
          out += ' &&   Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';
        }
        out += '; if (!' + ($valid) + ') break; } ';
        if ($isData) {
          out += '  }  ';
        }
        out += '  if (!' + ($valid) + ') {   ';
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'';
            if (it.opts._errorDataPathProperty) {
              out += 'is a required property';
            } else {
              out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        out += ' } else { ';
      } else {
        out += ' if ( ';
        var arr2 = $required;
        if (arr2) {
          var $propertyKey, $i = -1,
            l2 = arr2.length - 1;
          while ($i < l2) {
            $propertyKey = arr2[$i += 1];
            if ($i) {
              out += ' || ';
            }
            var $prop = it.util.getProperty($propertyKey),
              $useData = $data + $prop;
            out += ' ( ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';
          }
        }
        out += ') {  ';
        var $propertyPath = 'missing' + $lvl,
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;
        }
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'';
            if (it.opts._errorDataPathProperty) {
              out += 'is a required property';
            } else {
              out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        out += ' } else { ';
      }
    } else {
      if ($loopRequired) {
        if (!$isData) {
          out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';
        }
        var $i = 'i' + $lvl,
          $propertyPath = 'schema' + $lvl + '[' + $i + ']',
          $missingProperty = '\' + ' + $propertyPath + ' + \'';
        if (it.opts._errorDataPathProperty) {
          it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);
        }
        if ($isData) {
          out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) {  var err =   '; /* istanbul ignore else */
          if (it.createErrors !== false) {
            out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
            if (it.opts.messages !== false) {
              out += ' , message: \'';
              if (it.opts._errorDataPathProperty) {
                out += 'is a required property';
              } else {
                out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
              }
              out += '\' ';
            }
            if (it.opts.verbose) {
              out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
            }
            out += ' } ';
          } else {
            out += ' {} ';
          }
          out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { ';
        }
        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined ';
        if ($ownProperties) {
          out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';
        }
        out += ') {  var err =   '; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'';
            if (it.opts._errorDataPathProperty) {
              out += 'is a required property';
            } else {
              out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ';
        if ($isData) {
          out += '  }  ';
        }
      } else {
        var arr3 = $required;
        if (arr3) {
          var $propertyKey, i3 = -1,
            l3 = arr3.length - 1;
          while (i3 < l3) {
            $propertyKey = arr3[i3 += 1];
            var $prop = it.util.getProperty($propertyKey),
              $missingProperty = it.util.escapeQuotes($propertyKey),
              $useData = $data + $prop;
            if (it.opts._errorDataPathProperty) {
              it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
            }
            out += ' if ( ' + ($useData) + ' === undefined ';
            if ($ownProperties) {
              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
            }
            out += ') {  var err =   '; /* istanbul ignore else */
            if (it.createErrors !== false) {
              out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';
              if (it.opts.messages !== false) {
                out += ' , message: \'';
                if (it.opts._errorDataPathProperty) {
                  out += 'is a required property';
                } else {
                  out += 'should have required property \\\'' + ($missingProperty) + '\\\'';
                }
                out += '\' ';
              }
              if (it.opts.verbose) {
                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
              }
              out += ' } ';
            } else {
              out += ' {} ';
            }
            out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';
          }
        }
      }
    }
    it.errorPath = $currentErrorPath;
  } else if ($breakOnError) {
    out += ' if (true) {';
  }
  return out;
}

},{}],37:[function(require,module,exports){
'use strict';
module.exports = function generate_uniqueItems(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if (($schema || $isData) && it.opts.uniqueItems !== false) {
    if ($isData) {
      out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { ';
    }
    out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { ';
    var $itemType = it.schema.items && it.schema.items.type,
      $typeIsArray = Array.isArray($itemType);
    if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) {
      out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } ';
    } else {
      out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; ';
      var $method = 'checkDataType' + ($typeIsArray ? 's' : '');
      out += ' if (' + (it.util[$method]($itemType, 'item', it.opts.strictNumbers, true)) + ') continue; ';
      if ($typeIsArray) {
        out += ' if (typeof item == \'string\') item = \'"\' + item; ';
      }
      out += ' if (typeof itemIndices[item] == \'number\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } ';
    }
    out += ' } ';
    if ($isData) {
      out += '  }  ';
    }
    out += ' if (!' + ($valid) + ') {   ';
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } ';
      if (it.opts.messages !== false) {
        out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema:  ';
        if ($isData) {
          out += 'validate.schema' + ($schemaPath);
        } else {
          out += '' + ($schema);
        }
        out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' } ';
    if ($breakOnError) {
      out += ' else { ';
    }
  } else {
    if ($breakOnError) {
      out += ' if (true) { ';
    }
  }
  return out;
}

},{}],38:[function(require,module,exports){
'use strict';
module.exports = function generate_validate(it, $keyword, $ruleType) {
  var out = '';
  var $async = it.schema.$async === true,
    $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'),
    $id = it.self._getId(it.schema);
  if (it.opts.strictKeywords) {
    var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords);
    if ($unknownKwd) {
      var $keywordsMsg = 'unknown keyword: ' + $unknownKwd;
      if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg);
      else throw new Error($keywordsMsg);
    }
  }
  if (it.isTop) {
    out += ' var validate = ';
    if ($async) {
      it.async = true;
      out += 'async ';
    }
    out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; ';
    if ($id && (it.opts.sourceCode || it.opts.processCode)) {
      out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' ';
    }
  }
  if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) {
    var $keyword = 'false schema';
    var $lvl = it.level;
    var $dataLvl = it.dataLevel;
    var $schema = it.schema[$keyword];
    var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
    var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
    var $breakOnError = !it.opts.allErrors;
    var $errorKeyword;
    var $data = 'data' + ($dataLvl || '');
    var $valid = 'valid' + $lvl;
    if (it.schema === false) {
      if (it.isTop) {
        $breakOnError = true;
      } else {
        out += ' var ' + ($valid) + ' = false; ';
      }
      var $$outStack = $$outStack || [];
      $$outStack.push(out);
      out = ''; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
        if (it.opts.messages !== false) {
          out += ' , message: \'boolean schema is false\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      var __err = out;
      out = $$outStack.pop();
      if (!it.compositeRule && $breakOnError) {
        /* istanbul ignore if */
        if (it.async) {
          out += ' throw new ValidationError([' + (__err) + ']); ';
        } else {
          out += ' validate.errors = [' + (__err) + ']; return false; ';
        }
      } else {
        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
      }
    } else {
      if (it.isTop) {
        if ($async) {
          out += ' return data; ';
        } else {
          out += ' validate.errors = null; return true; ';
        }
      } else {
        out += ' var ' + ($valid) + ' = true; ';
      }
    }
    if (it.isTop) {
      out += ' }; return validate; ';
    }
    return out;
  }
  if (it.isTop) {
    var $top = it.isTop,
      $lvl = it.level = 0,
      $dataLvl = it.dataLevel = 0,
      $data = 'data';
    it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));
    it.baseId = it.baseId || it.rootId;
    delete it.isTop;
    it.dataPathArr = [""];
    if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) {
      var $defaultMsg = 'default is ignored in the schema root';
      if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
      else throw new Error($defaultMsg);
    }
    out += ' var vErrors = null; ';
    out += ' var errors = 0;     ';
    out += ' if (rootData === undefined) rootData = data; ';
  } else {
    var $lvl = it.level,
      $dataLvl = it.dataLevel,
      $data = 'data' + ($dataLvl || '');
    if ($id) it.baseId = it.resolve.url(it.baseId, $id);
    if ($async && !it.async) throw new Error('async schema in sync schema');
    out += ' var errs_' + ($lvl) + ' = errors;';
  }
  var $valid = 'valid' + $lvl,
    $breakOnError = !it.opts.allErrors,
    $closingBraces1 = '',
    $closingBraces2 = '';
  var $errorKeyword;
  var $typeSchema = it.schema.type,
    $typeIsArray = Array.isArray($typeSchema);
  if ($typeSchema && it.opts.nullable && it.schema.nullable === true) {
    if ($typeIsArray) {
      if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null');
    } else if ($typeSchema != 'null') {
      $typeSchema = [$typeSchema, 'null'];
      $typeIsArray = true;
    }
  }
  if ($typeIsArray && $typeSchema.length == 1) {
    $typeSchema = $typeSchema[0];
    $typeIsArray = false;
  }
  if (it.schema.$ref && $refKeywords) {
    if (it.opts.extendRefs == 'fail') {
      throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)');
    } else if (it.opts.extendRefs !== true) {
      $refKeywords = false;
      it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"');
    }
  }
  if (it.schema.$comment && it.opts.$comment) {
    out += ' ' + (it.RULES.all.$comment.code(it, '$comment'));
  }
  if ($typeSchema) {
    if (it.opts.coerceTypes) {
      var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema);
    }
    var $rulesGroup = it.RULES.types[$typeSchema];
    if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) {
      var $schemaPath = it.schemaPath + '.type',
        $errSchemaPath = it.errSchemaPath + '/type';
      var $schemaPath = it.schemaPath + '.type',
        $errSchemaPath = it.errSchemaPath + '/type',
        $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType';
      out += ' if (' + (it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true)) + ') { ';
      if ($coerceToTypes) {
        var $dataType = 'dataType' + $lvl,
          $coerced = 'coerced' + $lvl;
        out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; var ' + ($coerced) + ' = undefined; ';
        if (it.opts.coerceTypes == 'array') {
          out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ') && ' + ($data) + '.length == 1) { ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; if (' + (it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)) + ') ' + ($coerced) + ' = ' + ($data) + '; } ';
        }
        out += ' if (' + ($coerced) + ' !== undefined) ; ';
        var arr1 = $coerceToTypes;
        if (arr1) {
          var $type, $i = -1,
            l1 = arr1.length - 1;
          while ($i < l1) {
            $type = arr1[$i += 1];
            if ($type == 'string') {
              out += ' else if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; ';
            } else if ($type == 'number' || $type == 'integer') {
              out += ' else if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' ';
              if ($type == 'integer') {
                out += ' && !(' + ($data) + ' % 1)';
              }
              out += ')) ' + ($coerced) + ' = +' + ($data) + '; ';
            } else if ($type == 'boolean') {
              out += ' else if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; ';
            } else if ($type == 'null') {
              out += ' else if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; ';
            } else if (it.opts.coerceTypes == 'array' && $type == 'array') {
              out += ' else if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; ';
            }
          }
        }
        out += ' else {   ';
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';
          if ($typeIsArray) {
            out += '' + ($typeSchema.join(","));
          } else {
            out += '' + ($typeSchema);
          }
          out += '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'should be ';
            if ($typeIsArray) {
              out += '' + ($typeSchema.join(","));
            } else {
              out += '' + ($typeSchema);
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
        out += ' } if (' + ($coerced) + ' !== undefined) {  ';
        var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',
          $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
        out += ' ' + ($data) + ' = ' + ($coerced) + '; ';
        if (!$dataLvl) {
          out += 'if (' + ($parentData) + ' !== undefined)';
        }
        out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } ';
      } else {
        var $$outStack = $$outStack || [];
        $$outStack.push(out);
        out = ''; /* istanbul ignore else */
        if (it.createErrors !== false) {
          out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';
          if ($typeIsArray) {
            out += '' + ($typeSchema.join(","));
          } else {
            out += '' + ($typeSchema);
          }
          out += '\' } ';
          if (it.opts.messages !== false) {
            out += ' , message: \'should be ';
            if ($typeIsArray) {
              out += '' + ($typeSchema.join(","));
            } else {
              out += '' + ($typeSchema);
            }
            out += '\' ';
          }
          if (it.opts.verbose) {
            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
          }
          out += ' } ';
        } else {
          out += ' {} ';
        }
        var __err = out;
        out = $$outStack.pop();
        if (!it.compositeRule && $breakOnError) {
          /* istanbul ignore if */
          if (it.async) {
            out += ' throw new ValidationError([' + (__err) + ']); ';
          } else {
            out += ' validate.errors = [' + (__err) + ']; return false; ';
          }
        } else {
          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
        }
      }
      out += ' } ';
    }
  }
  if (it.schema.$ref && !$refKeywords) {
    out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' ';
    if ($breakOnError) {
      out += ' } if (errors === ';
      if ($top) {
        out += '0';
      } else {
        out += 'errs_' + ($lvl);
      }
      out += ') { ';
      $closingBraces2 += '}';
    }
  } else {
    var arr2 = it.RULES;
    if (arr2) {
      var $rulesGroup, i2 = -1,
        l2 = arr2.length - 1;
      while (i2 < l2) {
        $rulesGroup = arr2[i2 += 1];
        if ($shouldUseGroup($rulesGroup)) {
          if ($rulesGroup.type) {
            out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers)) + ') { ';
          }
          if (it.opts.useDefaults) {
            if ($rulesGroup.type == 'object' && it.schema.properties) {
              var $schema = it.schema.properties,
                $schemaKeys = Object.keys($schema);
              var arr3 = $schemaKeys;
              if (arr3) {
                var $propertyKey, i3 = -1,
                  l3 = arr3.length - 1;
                while (i3 < l3) {
                  $propertyKey = arr3[i3 += 1];
                  var $sch = $schema[$propertyKey];
                  if ($sch.default !== undefined) {
                    var $passData = $data + it.util.getProperty($propertyKey);
                    if (it.compositeRule) {
                      if (it.opts.strictDefaults) {
                        var $defaultMsg = 'default is ignored for: ' + $passData;
                        if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
                        else throw new Error($defaultMsg);
                      }
                    } else {
                      out += ' if (' + ($passData) + ' === undefined ';
                      if (it.opts.useDefaults == 'empty') {
                        out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' ';
                      }
                      out += ' ) ' + ($passData) + ' = ';
                      if (it.opts.useDefaults == 'shared') {
                        out += ' ' + (it.useDefault($sch.default)) + ' ';
                      } else {
                        out += ' ' + (JSON.stringify($sch.default)) + ' ';
                      }
                      out += '; ';
                    }
                  }
                }
              }
            } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) {
              var arr4 = it.schema.items;
              if (arr4) {
                var $sch, $i = -1,
                  l4 = arr4.length - 1;
                while ($i < l4) {
                  $sch = arr4[$i += 1];
                  if ($sch.default !== undefined) {
                    var $passData = $data + '[' + $i + ']';
                    if (it.compositeRule) {
                      if (it.opts.strictDefaults) {
                        var $defaultMsg = 'default is ignored for: ' + $passData;
                        if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
                        else throw new Error($defaultMsg);
                      }
                    } else {
                      out += ' if (' + ($passData) + ' === undefined ';
                      if (it.opts.useDefaults == 'empty') {
                        out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' ';
                      }
                      out += ' ) ' + ($passData) + ' = ';
                      if (it.opts.useDefaults == 'shared') {
                        out += ' ' + (it.useDefault($sch.default)) + ' ';
                      } else {
                        out += ' ' + (JSON.stringify($sch.default)) + ' ';
                      }
                      out += '; ';
                    }
                  }
                }
              }
            }
          }
          var arr5 = $rulesGroup.rules;
          if (arr5) {
            var $rule, i5 = -1,
              l5 = arr5.length - 1;
            while (i5 < l5) {
              $rule = arr5[i5 += 1];
              if ($shouldUseRule($rule)) {
                var $code = $rule.code(it, $rule.keyword, $rulesGroup.type);
                if ($code) {
                  out += ' ' + ($code) + ' ';
                  if ($breakOnError) {
                    $closingBraces1 += '}';
                  }
                }
              }
            }
          }
          if ($breakOnError) {
            out += ' ' + ($closingBraces1) + ' ';
            $closingBraces1 = '';
          }
          if ($rulesGroup.type) {
            out += ' } ';
            if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) {
              out += ' else { ';
              var $schemaPath = it.schemaPath + '.type',
                $errSchemaPath = it.errSchemaPath + '/type';
              var $$outStack = $$outStack || [];
              $$outStack.push(out);
              out = ''; /* istanbul ignore else */
              if (it.createErrors !== false) {
                out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';
                if ($typeIsArray) {
                  out += '' + ($typeSchema.join(","));
                } else {
                  out += '' + ($typeSchema);
                }
                out += '\' } ';
                if (it.opts.messages !== false) {
                  out += ' , message: \'should be ';
                  if ($typeIsArray) {
                    out += '' + ($typeSchema.join(","));
                  } else {
                    out += '' + ($typeSchema);
                  }
                  out += '\' ';
                }
                if (it.opts.verbose) {
                  out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
                }
                out += ' } ';
              } else {
                out += ' {} ';
              }
              var __err = out;
              out = $$outStack.pop();
              if (!it.compositeRule && $breakOnError) {
                /* istanbul ignore if */
                if (it.async) {
                  out += ' throw new ValidationError([' + (__err) + ']); ';
                } else {
                  out += ' validate.errors = [' + (__err) + ']; return false; ';
                }
              } else {
                out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
              }
              out += ' } ';
            }
          }
          if ($breakOnError) {
            out += ' if (errors === ';
            if ($top) {
              out += '0';
            } else {
              out += 'errs_' + ($lvl);
            }
            out += ') { ';
            $closingBraces2 += '}';
          }
        }
      }
    }
  }
  if ($breakOnError) {
    out += ' ' + ($closingBraces2) + ' ';
  }
  if ($top) {
    if ($async) {
      out += ' if (errors === 0) return data;           ';
      out += ' else throw new ValidationError(vErrors); ';
    } else {
      out += ' validate.errors = vErrors; ';
      out += ' return errors === 0;       ';
    }
    out += ' }; return validate;';
  } else {
    out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';';
  }

  function $shouldUseGroup($rulesGroup) {
    var rules = $rulesGroup.rules;
    for (var i = 0; i < rules.length; i++)
      if ($shouldUseRule(rules[i])) return true;
  }

  function $shouldUseRule($rule) {
    return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule));
  }

  function $ruleImplementsSomeKeyword($rule) {
    var impl = $rule.implements;
    for (var i = 0; i < impl.length; i++)
      if (it.schema[impl[i]] !== undefined) return true;
  }
  return out;
}

},{}],39:[function(require,module,exports){
'use strict';

var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i;
var customRuleCode = require('./dotjs/custom');
var definitionSchema = require('./definition_schema');

module.exports = {
  add: addKeyword,
  get: getKeyword,
  remove: removeKeyword,
  validate: validateKeyword
};


/**
 * Define custom keyword
 * @this  Ajv
 * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords).
 * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`.
 * @return {Ajv} this for method chaining
 */
function addKeyword(keyword, definition) {
  /* jshint validthis: true */
  /* eslint no-shadow: 0 */
  var RULES = this.RULES;
  if (RULES.keywords[keyword])
    throw new Error('Keyword ' + keyword + ' is already defined');

  if (!IDENTIFIER.test(keyword))
    throw new Error('Keyword ' + keyword + ' is not a valid identifier');

  if (definition) {
    this.validateKeyword(definition, true);

    var dataType = definition.type;
    if (Array.isArray(dataType)) {
      for (var i=0; i<dataType.length; i++)
        _addRule(keyword, dataType[i], definition);
    } else {
      _addRule(keyword, dataType, definition);
    }

    var metaSchema = definition.metaSchema;
    if (metaSchema) {
      if (definition.$data && this._opts.$data) {
        metaSchema = {
          anyOf: [
            metaSchema,
            { '$ref': 'https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#' }
          ]
        };
      }
      definition.validateSchema = this.compile(metaSchema, true);
    }
  }

  RULES.keywords[keyword] = RULES.all[keyword] = true;


  function _addRule(keyword, dataType, definition) {
    var ruleGroup;
    for (var i=0; i<RULES.length; i++) {
      var rg = RULES[i];
      if (rg.type == dataType) {
        ruleGroup = rg;
        break;
      }
    }

    if (!ruleGroup) {
      ruleGroup = { type: dataType, rules: [] };
      RULES.push(ruleGroup);
    }

    var rule = {
      keyword: keyword,
      definition: definition,
      custom: true,
      code: customRuleCode,
      implements: definition.implements
    };
    ruleGroup.rules.push(rule);
    RULES.custom[keyword] = rule;
  }

  return this;
}


/**
 * Get keyword
 * @this  Ajv
 * @param {String} keyword pre-defined or custom keyword.
 * @return {Object|Boolean} custom keyword definition, `true` if it is a predefined keyword, `false` otherwise.
 */
function getKeyword(keyword) {
  /* jshint validthis: true */
  var rule = this.RULES.custom[keyword];
  return rule ? rule.definition : this.RULES.keywords[keyword] || false;
}


/**
 * Remove keyword
 * @this  Ajv
 * @param {String} keyword pre-defined or custom keyword.
 * @return {Ajv} this for method chaining
 */
function removeKeyword(keyword) {
  /* jshint validthis: true */
  var RULES = this.RULES;
  delete RULES.keywords[keyword];
  delete RULES.all[keyword];
  delete RULES.custom[keyword];
  for (var i=0; i<RULES.length; i++) {
    var rules = RULES[i].rules;
    for (var j=0; j<rules.length; j++) {
      if (rules[j].keyword == keyword) {
        rules.splice(j, 1);
        break;
      }
    }
  }
  return this;
}


/**
 * Validate keyword definition
 * @this  Ajv
 * @param {Object} definition keyword definition object.
 * @param {Boolean} throwError true to throw exception if definition is invalid
 * @return {boolean} validation result
 */
function validateKeyword(definition, throwError) {
  validateKeyword.errors = null;
  var v = this._validateKeyword = this._validateKeyword
                                  || this.compile(definitionSchema, true);

  if (v(definition)) return true;
  validateKeyword.errors = v.errors;
  if (throwError)
    throw new Error('custom keyword definition is invalid: '  + this.errorsText(v.errors));
  else
    return false;
}

},{"./definition_schema":12,"./dotjs/custom":22}],40:[function(require,module,exports){
module.exports={
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",
    "description": "Meta-schema for $data reference (JSON Schema extension proposal)",
    "type": "object",
    "required": [ "$data" ],
    "properties": {
        "$data": {
            "type": "string",
            "anyOf": [
                { "format": "relative-json-pointer" }, 
                { "format": "json-pointer" }
            ]
        }
    },
    "additionalProperties": false
}

},{}],41:[function(require,module,exports){
module.exports={
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "http://json-schema.org/draft-07/schema#",
    "title": "Core schema meta-schema",
    "definitions": {
        "schemaArray": {
            "type": "array",
            "minItems": 1,
            "items": { "$ref": "#" }
        },
        "nonNegativeInteger": {
            "type": "integer",
            "minimum": 0
        },
        "nonNegativeIntegerDefault0": {
            "allOf": [
                { "$ref": "#/definitions/nonNegativeInteger" },
                { "default": 0 }
            ]
        },
        "simpleTypes": {
            "enum": [
                "array",
                "boolean",
                "integer",
                "null",
                "number",
                "object",
                "string"
            ]
        },
        "stringArray": {
            "type": "array",
            "items": { "type": "string" },
            "uniqueItems": true,
            "default": []
        }
    },
    "type": ["object", "boolean"],
    "properties": {
        "$id": {
            "type": "string",
            "format": "uri-reference"
        },
        "$schema": {
            "type": "string",
            "format": "uri"
        },
        "$ref": {
            "type": "string",
            "format": "uri-reference"
        },
        "$comment": {
            "type": "string"
        },
        "title": {
            "type": "string"
        },
        "description": {
            "type": "string"
        },
        "default": true,
        "readOnly": {
            "type": "boolean",
            "default": false
        },
        "examples": {
            "type": "array",
            "items": true
        },
        "multipleOf": {
            "type": "number",
            "exclusiveMinimum": 0
        },
        "maximum": {
            "type": "number"
        },
        "exclusiveMaximum": {
            "type": "number"
        },
        "minimum": {
            "type": "number"
        },
        "exclusiveMinimum": {
            "type": "number"
        },
        "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
        "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "pattern": {
            "type": "string",
            "format": "regex"
        },
        "additionalItems": { "$ref": "#" },
        "items": {
            "anyOf": [
                { "$ref": "#" },
                { "$ref": "#/definitions/schemaArray" }
            ],
            "default": true
        },
        "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
        "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "uniqueItems": {
            "type": "boolean",
            "default": false
        },
        "contains": { "$ref": "#" },
        "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
        "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
        "required": { "$ref": "#/definitions/stringArray" },
        "additionalProperties": { "$ref": "#" },
        "definitions": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "properties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "default": {}
        },
        "patternProperties": {
            "type": "object",
            "additionalProperties": { "$ref": "#" },
            "propertyNames": { "format": "regex" },
            "default": {}
        },
        "dependencies": {
            "type": "object",
            "additionalProperties": {
                "anyOf": [
                    { "$ref": "#" },
                    { "$ref": "#/definitions/stringArray" }
                ]
            }
        },
        "propertyNames": { "$ref": "#" },
        "const": true,
        "enum": {
            "type": "array",
            "items": true,
            "minItems": 1,
            "uniqueItems": true
        },
        "type": {
            "anyOf": [
                { "$ref": "#/definitions/simpleTypes" },
                {
                    "type": "array",
                    "items": { "$ref": "#/definitions/simpleTypes" },
                    "minItems": 1,
                    "uniqueItems": true
                }
            ]
        },
        "format": { "type": "string" },
        "contentMediaType": { "type": "string" },
        "contentEncoding": { "type": "string" },
        "if": {"$ref": "#"},
        "then": {"$ref": "#"},
        "else": {"$ref": "#"},
        "allOf": { "$ref": "#/definitions/schemaArray" },
        "anyOf": { "$ref": "#/definitions/schemaArray" },
        "oneOf": { "$ref": "#/definitions/schemaArray" },
        "not": { "$ref": "#" }
    },
    "default": true
}

},{}],42:[function(require,module,exports){
'use strict';

// do not edit .js files directly - edit src/index.jst



module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }



    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};

},{}],43:[function(require,module,exports){
'use strict';

module.exports = function (data, opts) {
    if (!opts) opts = {};
    if (typeof opts === 'function') opts = { cmp: opts };
    var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;

    var cmp = opts.cmp && (function (f) {
        return function (node) {
            return function (a, b) {
                var aobj = { key: a, value: node[a] };
                var bobj = { key: b, value: node[b] };
                return f(aobj, bobj);
            };
        };
    })(opts.cmp);

    var seen = [];
    return (function stringify (node) {
        if (node && node.toJSON && typeof node.toJSON === 'function') {
            node = node.toJSON();
        }

        if (node === undefined) return;
        if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
        if (typeof node !== 'object') return JSON.stringify(node);

        var i, out;
        if (Array.isArray(node)) {
            out = '[';
            for (i = 0; i < node.length; i++) {
                if (i) out += ',';
                out += stringify(node[i]) || 'null';
            }
            return out + ']';
        }

        if (node === null) return 'null';

        if (seen.indexOf(node) !== -1) {
            if (cycles) return JSON.stringify('__cycle__');
            throw new TypeError('Converting circular structure to JSON');
        }

        var seenIndex = seen.push(node) - 1;
        var keys = Object.keys(node).sort(cmp && cmp(node));
        out = '';
        for (i = 0; i < keys.length; i++) {
            var key = keys[i];
            var value = stringify(node[key]);

            if (!value) continue;
            if (out) out += ',';
            out += JSON.stringify(key) + ':' + value;
        }
        seen.splice(seenIndex, 1);
        return '{' + out + '}';
    })(data);
};

},{}],44:[function(require,module,exports){
'use strict';

var traverse = module.exports = function (schema, opts, cb) {
  // Legacy support for v0.3.1 and earlier.
  if (typeof opts == 'function') {
    cb = opts;
    opts = {};
  }

  cb = opts.cb || cb;
  var pre = (typeof cb == 'function') ? cb : cb.pre || function() {};
  var post = cb.post || function() {};

  _traverse(opts, pre, post, schema, '', schema);
};


traverse.keywords = {
  additionalItems: true,
  items: true,
  contains: true,
  additionalProperties: true,
  propertyNames: true,
  not: true
};

traverse.arrayKeywords = {
  items: true,
  allOf: true,
  anyOf: true,
  oneOf: true
};

traverse.propsKeywords = {
  definitions: true,
  properties: true,
  patternProperties: true,
  dependencies: true
};

traverse.skipKeywords = {
  default: true,
  enum: true,
  const: true,
  required: true,
  maximum: true,
  minimum: true,
  exclusiveMaximum: true,
  exclusiveMinimum: true,
  multipleOf: true,
  maxLength: true,
  minLength: true,
  pattern: true,
  format: true,
  maxItems: true,
  minItems: true,
  uniqueItems: true,
  maxProperties: true,
  minProperties: true
};


function _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {
  if (schema && typeof schema == 'object' && !Array.isArray(schema)) {
    pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
    for (var key in schema) {
      var sch = schema[key];
      if (Array.isArray(sch)) {
        if (key in traverse.arrayKeywords) {
          for (var i=0; i<sch.length; i++)
            _traverse(opts, pre, post, sch[i], jsonPtr + '/' + key + '/' + i, rootSchema, jsonPtr, key, schema, i);
        }
      } else if (key in traverse.propsKeywords) {
        if (sch && typeof sch == 'object') {
          for (var prop in sch)
            _traverse(opts, pre, post, sch[prop], jsonPtr + '/' + key + '/' + escapeJsonPtr(prop), rootSchema, jsonPtr, key, schema, prop);
        }
      } else if (key in traverse.keywords || (opts.allKeys && !(key in traverse.skipKeywords))) {
        _traverse(opts, pre, post, sch, jsonPtr + '/' + key, rootSchema, jsonPtr, key, schema);
      }
    }
    post(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
  }
}


function escapeJsonPtr(str) {
  return str.replace(/~/g, '~0').replace(/\//g, '~1');
}

},{}],45:[function(require,module,exports){
/** @license URI.js v4.4.0 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */
(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
	typeof define === 'function' && define.amd ? define(['exports'], factory) :
	(factory((global.URI = global.URI || {})));
}(this, (function (exports) { 'use strict';

function merge() {
    for (var _len = arguments.length, sets = Array(_len), _key = 0; _key < _len; _key++) {
        sets[_key] = arguments[_key];
    }

    if (sets.length > 1) {
        sets[0] = sets[0].slice(0, -1);
        var xl = sets.length - 1;
        for (var x = 1; x < xl; ++x) {
            sets[x] = sets[x].slice(1, -1);
        }
        sets[xl] = sets[xl].slice(1);
        return sets.join('');
    } else {
        return sets[0];
    }
}
function subexp(str) {
    return "(?:" + str + ")";
}
function typeOf(o) {
    return o === undefined ? "undefined" : o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase();
}
function toUpperCase(str) {
    return str.toUpperCase();
}
function toArray(obj) {
    return obj !== undefined && obj !== null ? obj instanceof Array ? obj : typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj) : [];
}
function assign(target, source) {
    var obj = target;
    if (source) {
        for (var key in source) {
            obj[key] = source[key];
        }
    }
    return obj;
}

function buildExps(isIRI) {
    var ALPHA$$ = "[A-Za-z]",
        CR$ = "[\\x0D]",
        DIGIT$$ = "[0-9]",
        DQUOTE$$ = "[\\x22]",
        HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"),
        //case-insensitive
    LF$$ = "[\\x0A]",
        SP$$ = "[\\x20]",
        PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)),
        //expanded
    GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]",
        SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]",
        RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),
        UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]",
        //subset, excludes bidi control characters
    IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]",
        //subset
    UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$),
        SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"),
        USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"),
        DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$),
        DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$),
        //relaxed parsing rules
    IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$),
        H16$ = subexp(HEXDIG$$ + "{1,4}"),
        LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$),
        IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$),
        //                           6( h16 ":" ) ls32
    IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$),
        //                      "::" 5( h16 ":" ) ls32
    IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$),
        //[               h16 ] "::" 4( h16 ":" ) ls32
    IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$),
        //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
    IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$),
        //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
    IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$),
        //[ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
    IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$),
        //[ *4( h16 ":" ) h16 ] "::"              ls32
    IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$),
        //[ *5( h16 ":" ) h16 ] "::"              h16
    IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"),
        //[ *6( h16 ":" ) h16 ] "::"
    IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")),
        ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"),
        //RFC 6874
    IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$),
        //RFC 6874
    IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$),
        //RFC 6874, with relaxed parsing rules
    IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"),
        IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"),
        //RFC 6874
    REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"),
        HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$),
        PORT$ = subexp(DIGIT$$ + "*"),
        AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"),
        PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")),
        SEGMENT$ = subexp(PCHAR$ + "*"),
        SEGMENT_NZ$ = subexp(PCHAR$ + "+"),
        SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"),
        PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"),
        PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"),
        //simplified
    PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$),
        //simplified
    PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$),
        //simplified
    PATH_EMPTY$ = "(?!" + PCHAR$ + ")",
        PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$),
        QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"),
        FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"),
        HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$),
        URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"),
        RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$),
        RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"),
        URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$),
        ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"),
        GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$",
        RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$",
        ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$",
        SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$",
        AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$";
    return {
        NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"),
        NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"),
        NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"),
        ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        UNRESERVED: new RegExp(UNRESERVED$$, "g"),
        OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"),
        PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"),
        IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"),
        IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules
    };
}
var URI_PROTOCOL = buildExps(false);

var IRI_PROTOCOL = buildExps(true);

var slicedToArray = function () {
  function sliceIterator(arr, i) {
    var _arr = [];
    var _n = true;
    var _d = false;
    var _e = undefined;

    try {
      for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
        _arr.push(_s.value);

        if (i && _arr.length === i) break;
      }
    } catch (err) {
      _d = true;
      _e = err;
    } finally {
      try {
        if (!_n && _i["return"]) _i["return"]();
      } finally {
        if (_d) throw _e;
      }
    }

    return _arr;
  }

  return function (arr, i) {
    if (Array.isArray(arr)) {
      return arr;
    } else if (Symbol.iterator in Object(arr)) {
      return sliceIterator(arr, i);
    } else {
      throw new TypeError("Invalid attempt to destructure non-iterable instance");
    }
  };
}();













var toConsumableArray = function (arr) {
  if (Array.isArray(arr)) {
    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];

    return arr2;
  } else {
    return Array.from(arr);
  }
};

/** Highest positive signed 32-bit float value */

var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1

/** Bootstring parameters */
var base = 36;
var tMin = 1;
var tMax = 26;
var skew = 38;
var damp = 700;
var initialBias = 72;
var initialN = 128; // 0x80
var delimiter = '-'; // '\x2D'

/** Regular expressions */
var regexPunycode = /^xn--/;
var regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars
var regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators

/** Error messages */
var errors = {
	'overflow': 'Overflow: input needs wider integers to process',
	'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
	'invalid-input': 'Invalid input'
};

/** Convenience shortcuts */
var baseMinusTMin = base - tMin;
var floor = Math.floor;
var stringFromCharCode = String.fromCharCode;

/*--------------------------------------------------------------------------*/

/**
 * A generic error utility function.
 * @private
 * @param {String} type The error type.
 * @returns {Error} Throws a `RangeError` with the applicable error message.
 */
function error$1(type) {
	throw new RangeError(errors[type]);
}

/**
 * A generic `Array#map` utility function.
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} callback The function that gets called for every array
 * item.
 * @returns {Array} A new array of values returned by the callback function.
 */
function map(array, fn) {
	var result = [];
	var length = array.length;
	while (length--) {
		result[length] = fn(array[length]);
	}
	return result;
}

/**
 * A simple `Array#map`-like wrapper to work with domain name strings or email
 * addresses.
 * @private
 * @param {String} domain The domain name or email address.
 * @param {Function} callback The function that gets called for every
 * character.
 * @returns {Array} A new string of characters returned by the callback
 * function.
 */
function mapDomain(string, fn) {
	var parts = string.split('@');
	var result = '';
	if (parts.length > 1) {
		// In email addresses, only the domain name should be punycoded. Leave
		// the local part (i.e. everything up to `@`) intact.
		result = parts[0] + '@';
		string = parts[1];
	}
	// Avoid `split(regex)` for IE8 compatibility. See #17.
	string = string.replace(regexSeparators, '\x2E');
	var labels = string.split('.');
	var encoded = map(labels, fn).join('.');
	return result + encoded;
}

/**
 * Creates an array containing the numeric code points of each Unicode
 * character in the string. While JavaScript uses UCS-2 internally,
 * this function will convert a pair of surrogate halves (each of which
 * UCS-2 exposes as separate characters) into a single code point,
 * matching UTF-16.
 * @see `punycode.ucs2.encode`
 * @see <https://mathiasbynens.be/notes/javascript-encoding>
 * @memberOf punycode.ucs2
 * @name decode
 * @param {String} string The Unicode input string (UCS-2).
 * @returns {Array} The new array of code points.
 */
function ucs2decode(string) {
	var output = [];
	var counter = 0;
	var length = string.length;
	while (counter < length) {
		var value = string.charCodeAt(counter++);
		if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
			// It's a high surrogate, and there is a next character.
			var extra = string.charCodeAt(counter++);
			if ((extra & 0xFC00) == 0xDC00) {
				// Low surrogate.
				output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
			} else {
				// It's an unmatched surrogate; only append this code unit, in case the
				// next code unit is the high surrogate of a surrogate pair.
				output.push(value);
				counter--;
			}
		} else {
			output.push(value);
		}
	}
	return output;
}

/**
 * Creates a string based on an array of numeric code points.
 * @see `punycode.ucs2.decode`
 * @memberOf punycode.ucs2
 * @name encode
 * @param {Array} codePoints The array of numeric code points.
 * @returns {String} The new Unicode string (UCS-2).
 */
var ucs2encode = function ucs2encode(array) {
	return String.fromCodePoint.apply(String, toConsumableArray(array));
};

/**
 * Converts a basic code point into a digit/integer.
 * @see `digitToBasic()`
 * @private
 * @param {Number} codePoint The basic numeric code point value.
 * @returns {Number} The numeric value of a basic code point (for use in
 * representing integers) in the range `0` to `base - 1`, or `base` if
 * the code point does not represent a value.
 */
var basicToDigit = function basicToDigit(codePoint) {
	if (codePoint - 0x30 < 0x0A) {
		return codePoint - 0x16;
	}
	if (codePoint - 0x41 < 0x1A) {
		return codePoint - 0x41;
	}
	if (codePoint - 0x61 < 0x1A) {
		return codePoint - 0x61;
	}
	return base;
};

/**
 * Converts a digit/integer into a basic code point.
 * @see `basicToDigit()`
 * @private
 * @param {Number} digit The numeric value of a basic code point.
 * @returns {Number} The basic code point whose value (when used for
 * representing integers) is `digit`, which needs to be in the range
 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
 * used; else, the lowercase form is used. The behavior is undefined
 * if `flag` is non-zero and `digit` has no uppercase form.
 */
var digitToBasic = function digitToBasic(digit, flag) {
	//  0..25 map to ASCII a..z or A..Z
	// 26..35 map to ASCII 0..9
	return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
};

/**
 * Bias adaptation function as per section 3.4 of RFC 3492.
 * https://tools.ietf.org/html/rfc3492#section-3.4
 * @private
 */
var adapt = function adapt(delta, numPoints, firstTime) {
	var k = 0;
	delta = firstTime ? floor(delta / damp) : delta >> 1;
	delta += floor(delta / numPoints);
	for (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) {
		delta = floor(delta / baseMinusTMin);
	}
	return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
};

/**
 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
 * symbols.
 * @memberOf punycode
 * @param {String} input The Punycode string of ASCII-only symbols.
 * @returns {String} The resulting string of Unicode symbols.
 */
var decode = function decode(input) {
	// Don't use UCS-2.
	var output = [];
	var inputLength = input.length;
	var i = 0;
	var n = initialN;
	var bias = initialBias;

	// Handle the basic code points: let `basic` be the number of input code
	// points before the last delimiter, or `0` if there is none, then copy
	// the first basic code points to the output.

	var basic = input.lastIndexOf(delimiter);
	if (basic < 0) {
		basic = 0;
	}

	for (var j = 0; j < basic; ++j) {
		// if it's not a basic code point
		if (input.charCodeAt(j) >= 0x80) {
			error$1('not-basic');
		}
		output.push(input.charCodeAt(j));
	}

	// Main decoding loop: start just after the last delimiter if any basic code
	// points were copied; start at the beginning otherwise.

	for (var index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{

		// `index` is the index of the next character to be consumed.
		// Decode a generalized variable-length integer into `delta`,
		// which gets added to `i`. The overflow checking is easier
		// if we increase `i` as we go, then subtract off its starting
		// value at the end to obtain `delta`.
		var oldi = i;
		for (var w = 1, k = base;; /* no condition */k += base) {

			if (index >= inputLength) {
				error$1('invalid-input');
			}

			var digit = basicToDigit(input.charCodeAt(index++));

			if (digit >= base || digit > floor((maxInt - i) / w)) {
				error$1('overflow');
			}

			i += digit * w;
			var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;

			if (digit < t) {
				break;
			}

			var baseMinusT = base - t;
			if (w > floor(maxInt / baseMinusT)) {
				error$1('overflow');
			}

			w *= baseMinusT;
		}

		var out = output.length + 1;
		bias = adapt(i - oldi, out, oldi == 0);

		// `i` was supposed to wrap around from `out` to `0`,
		// incrementing `n` each time, so we'll fix that now:
		if (floor(i / out) > maxInt - n) {
			error$1('overflow');
		}

		n += floor(i / out);
		i %= out;

		// Insert `n` at position `i` of the output.
		output.splice(i++, 0, n);
	}

	return String.fromCodePoint.apply(String, output);
};

/**
 * Converts a string of Unicode symbols (e.g. a domain name label) to a
 * Punycode string of ASCII-only symbols.
 * @memberOf punycode
 * @param {String} input The string of Unicode symbols.
 * @returns {String} The resulting Punycode string of ASCII-only symbols.
 */
var encode = function encode(input) {
	var output = [];

	// Convert the input in UCS-2 to an array of Unicode code points.
	input = ucs2decode(input);

	// Cache the length.
	var inputLength = input.length;

	// Initialize the state.
	var n = initialN;
	var delta = 0;
	var bias = initialBias;

	// Handle the basic code points.
	var _iteratorNormalCompletion = true;
	var _didIteratorError = false;
	var _iteratorError = undefined;

	try {
		for (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
			var _currentValue2 = _step.value;

			if (_currentValue2 < 0x80) {
				output.push(stringFromCharCode(_currentValue2));
			}
		}
	} catch (err) {
		_didIteratorError = true;
		_iteratorError = err;
	} finally {
		try {
			if (!_iteratorNormalCompletion && _iterator.return) {
				_iterator.return();
			}
		} finally {
			if (_didIteratorError) {
				throw _iteratorError;
			}
		}
	}

	var basicLength = output.length;
	var handledCPCount = basicLength;

	// `handledCPCount` is the number of code points that have been handled;
	// `basicLength` is the number of basic code points.

	// Finish the basic string with a delimiter unless it's empty.
	if (basicLength) {
		output.push(delimiter);
	}

	// Main encoding loop:
	while (handledCPCount < inputLength) {

		// All non-basic code points < n have been handled already. Find the next
		// larger one:
		var m = maxInt;
		var _iteratorNormalCompletion2 = true;
		var _didIteratorError2 = false;
		var _iteratorError2 = undefined;

		try {
			for (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
				var currentValue = _step2.value;

				if (currentValue >= n && currentValue < m) {
					m = currentValue;
				}
			}

			// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
			// but guard against overflow.
		} catch (err) {
			_didIteratorError2 = true;
			_iteratorError2 = err;
		} finally {
			try {
				if (!_iteratorNormalCompletion2 && _iterator2.return) {
					_iterator2.return();
				}
			} finally {
				if (_didIteratorError2) {
					throw _iteratorError2;
				}
			}
		}

		var handledCPCountPlusOne = handledCPCount + 1;
		if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
			error$1('overflow');
		}

		delta += (m - n) * handledCPCountPlusOne;
		n = m;

		var _iteratorNormalCompletion3 = true;
		var _didIteratorError3 = false;
		var _iteratorError3 = undefined;

		try {
			for (var _iterator3 = input[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
				var _currentValue = _step3.value;

				if (_currentValue < n && ++delta > maxInt) {
					error$1('overflow');
				}
				if (_currentValue == n) {
					// Represent delta as a generalized variable-length integer.
					var q = delta;
					for (var k = base;; /* no condition */k += base) {
						var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
						if (q < t) {
							break;
						}
						var qMinusT = q - t;
						var baseMinusT = base - t;
						output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));
						q = floor(qMinusT / baseMinusT);
					}

					output.push(stringFromCharCode(digitToBasic(q, 0)));
					bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
					delta = 0;
					++handledCPCount;
				}
			}
		} catch (err) {
			_didIteratorError3 = true;
			_iteratorError3 = err;
		} finally {
			try {
				if (!_iteratorNormalCompletion3 && _iterator3.return) {
					_iterator3.return();
				}
			} finally {
				if (_didIteratorError3) {
					throw _iteratorError3;
				}
			}
		}

		++delta;
		++n;
	}
	return output.join('');
};

/**
 * Converts a Punycode string representing a domain name or an email address
 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
 * it doesn't matter if you call it on a string that has already been
 * converted to Unicode.
 * @memberOf punycode
 * @param {String} input The Punycoded domain name or email address to
 * convert to Unicode.
 * @returns {String} The Unicode representation of the given Punycode
 * string.
 */
var toUnicode = function toUnicode(input) {
	return mapDomain(input, function (string) {
		return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;
	});
};

/**
 * Converts a Unicode string representing a domain name or an email address to
 * Punycode. Only the non-ASCII parts of the domain name will be converted,
 * i.e. it doesn't matter if you call it with a domain that's already in
 * ASCII.
 * @memberOf punycode
 * @param {String} input The domain name or email address to convert, as a
 * Unicode string.
 * @returns {String} The Punycode representation of the given domain name or
 * email address.
 */
var toASCII = function toASCII(input) {
	return mapDomain(input, function (string) {
		return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;
	});
};

/*--------------------------------------------------------------------------*/

/** Define the public API */
var punycode = {
	/**
  * A string representing the current Punycode.js version number.
  * @memberOf punycode
  * @type String
  */
	'version': '2.1.0',
	/**
  * An object of methods to convert from JavaScript's internal character
  * representation (UCS-2) to Unicode code points, and back.
  * @see <https://mathiasbynens.be/notes/javascript-encoding>
  * @memberOf punycode
  * @type Object
  */
	'ucs2': {
		'decode': ucs2decode,
		'encode': ucs2encode
	},
	'decode': decode,
	'encode': encode,
	'toASCII': toASCII,
	'toUnicode': toUnicode
};

/**
 * URI.js
 *
 * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.
 * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
 * @see http://github.com/garycourt/uri-js
 */
/**
 * Copyright 2011 Gary Court. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 *    1. Redistributions of source code must retain the above copyright notice, this list of
 *       conditions and the following disclaimer.
 *
 *    2. Redistributions in binary form must reproduce the above copyright notice, this list
 *       of conditions and the following disclaimer in the documentation and/or other materials
 *       provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation are those of the
 * authors and should not be interpreted as representing official policies, either expressed
 * or implied, of Gary Court.
 */
var SCHEMES = {};
function pctEncChar(chr) {
    var c = chr.charCodeAt(0);
    var e = void 0;
    if (c < 16) e = "%0" + c.toString(16).toUpperCase();else if (c < 128) e = "%" + c.toString(16).toUpperCase();else if (c < 2048) e = "%" + (c >> 6 | 192).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();else e = "%" + (c >> 12 | 224).toString(16).toUpperCase() + "%" + (c >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();
    return e;
}
function pctDecChars(str) {
    var newStr = "";
    var i = 0;
    var il = str.length;
    while (i < il) {
        var c = parseInt(str.substr(i + 1, 2), 16);
        if (c < 128) {
            newStr += String.fromCharCode(c);
            i += 3;
        } else if (c >= 194 && c < 224) {
            if (il - i >= 6) {
                var c2 = parseInt(str.substr(i + 4, 2), 16);
                newStr += String.fromCharCode((c & 31) << 6 | c2 & 63);
            } else {
                newStr += str.substr(i, 6);
            }
            i += 6;
        } else if (c >= 224) {
            if (il - i >= 9) {
                var _c = parseInt(str.substr(i + 4, 2), 16);
                var c3 = parseInt(str.substr(i + 7, 2), 16);
                newStr += String.fromCharCode((c & 15) << 12 | (_c & 63) << 6 | c3 & 63);
            } else {
                newStr += str.substr(i, 9);
            }
            i += 9;
        } else {
            newStr += str.substr(i, 3);
            i += 3;
        }
    }
    return newStr;
}
function _normalizeComponentEncoding(components, protocol) {
    function decodeUnreserved(str) {
        var decStr = pctDecChars(str);
        return !decStr.match(protocol.UNRESERVED) ? str : decStr;
    }
    if (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, "");
    if (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    return components;
}

function _stripLeadingZeros(str) {
    return str.replace(/^0*(.*)/, "$1") || "0";
}
function _normalizeIPv4(host, protocol) {
    var matches = host.match(protocol.IPV4ADDRESS) || [];

    var _matches = slicedToArray(matches, 2),
        address = _matches[1];

    if (address) {
        return address.split(".").map(_stripLeadingZeros).join(".");
    } else {
        return host;
    }
}
function _normalizeIPv6(host, protocol) {
    var matches = host.match(protocol.IPV6ADDRESS) || [];

    var _matches2 = slicedToArray(matches, 3),
        address = _matches2[1],
        zone = _matches2[2];

    if (address) {
        var _address$toLowerCase$ = address.toLowerCase().split('::').reverse(),
            _address$toLowerCase$2 = slicedToArray(_address$toLowerCase$, 2),
            last = _address$toLowerCase$2[0],
            first = _address$toLowerCase$2[1];

        var firstFields = first ? first.split(":").map(_stripLeadingZeros) : [];
        var lastFields = last.split(":").map(_stripLeadingZeros);
        var isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);
        var fieldCount = isLastFieldIPv4Address ? 7 : 8;
        var lastFieldsStart = lastFields.length - fieldCount;
        var fields = Array(fieldCount);
        for (var x = 0; x < fieldCount; ++x) {
            fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';
        }
        if (isLastFieldIPv4Address) {
            fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);
        }
        var allZeroFields = fields.reduce(function (acc, field, index) {
            if (!field || field === "0") {
                var lastLongest = acc[acc.length - 1];
                if (lastLongest && lastLongest.index + lastLongest.length === index) {
                    lastLongest.length++;
                } else {
                    acc.push({ index: index, length: 1 });
                }
            }
            return acc;
        }, []);
        var longestZeroFields = allZeroFields.sort(function (a, b) {
            return b.length - a.length;
        })[0];
        var newHost = void 0;
        if (longestZeroFields && longestZeroFields.length > 1) {
            var newFirst = fields.slice(0, longestZeroFields.index);
            var newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);
            newHost = newFirst.join(":") + "::" + newLast.join(":");
        } else {
            newHost = fields.join(":");
        }
        if (zone) {
            newHost += "%" + zone;
        }
        return newHost;
    } else {
        return host;
    }
}
var URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i;
var NO_MATCH_IS_UNDEFINED = "".match(/(){0}/)[1] === undefined;
function parse(uriString) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    var components = {};
    var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;
    if (options.reference === "suffix") uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString;
    var matches = uriString.match(URI_PARSE);
    if (matches) {
        if (NO_MATCH_IS_UNDEFINED) {
            //store each component
            components.scheme = matches[1];
            components.userinfo = matches[3];
            components.host = matches[4];
            components.port = parseInt(matches[5], 10);
            components.path = matches[6] || "";
            components.query = matches[7];
            components.fragment = matches[8];
            //fix port number
            if (isNaN(components.port)) {
                components.port = matches[5];
            }
        } else {
            //IE FIX for improper RegExp matching
            //store each component
            components.scheme = matches[1] || undefined;
            components.userinfo = uriString.indexOf("@") !== -1 ? matches[3] : undefined;
            components.host = uriString.indexOf("//") !== -1 ? matches[4] : undefined;
            components.port = parseInt(matches[5], 10);
            components.path = matches[6] || "";
            components.query = uriString.indexOf("?") !== -1 ? matches[7] : undefined;
            components.fragment = uriString.indexOf("#") !== -1 ? matches[8] : undefined;
            //fix port number
            if (isNaN(components.port)) {
                components.port = uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined;
            }
        }
        if (components.host) {
            //normalize IP hosts
            components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);
        }
        //determine reference type
        if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {
            components.reference = "same-document";
        } else if (components.scheme === undefined) {
            components.reference = "relative";
        } else if (components.fragment === undefined) {
            components.reference = "absolute";
        } else {
            components.reference = "uri";
        }
        //check for reference errors
        if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) {
            components.error = components.error || "URI is not a " + options.reference + " reference.";
        }
        //find scheme handler
        var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
        //check if scheme can't handle IRIs
        if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
            //if host component is a domain name
            if (components.host && (options.domainHost || schemeHandler && schemeHandler.domainHost)) {
                //convert Unicode IDN -> ASCII IDN
                try {
                    components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());
                } catch (e) {
                    components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e;
                }
            }
            //convert IRI -> URI
            _normalizeComponentEncoding(components, URI_PROTOCOL);
        } else {
            //normalize encodings
            _normalizeComponentEncoding(components, protocol);
        }
        //perform scheme specific parsing
        if (schemeHandler && schemeHandler.parse) {
            schemeHandler.parse(components, options);
        }
    } else {
        components.error = components.error || "URI can not be parsed.";
    }
    return components;
}

function _recomposeAuthority(components, options) {
    var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;
    var uriTokens = [];
    if (components.userinfo !== undefined) {
        uriTokens.push(components.userinfo);
        uriTokens.push("@");
    }
    if (components.host !== undefined) {
        //normalize IP hosts, add brackets and escape zone separator for IPv6
        uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, function (_, $1, $2) {
            return "[" + $1 + ($2 ? "%25" + $2 : "") + "]";
        }));
    }
    if (typeof components.port === "number" || typeof components.port === "string") {
        uriTokens.push(":");
        uriTokens.push(String(components.port));
    }
    return uriTokens.length ? uriTokens.join("") : undefined;
}

var RDS1 = /^\.\.?\//;
var RDS2 = /^\/\.(\/|$)/;
var RDS3 = /^\/\.\.(\/|$)/;
var RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/;
function removeDotSegments(input) {
    var output = [];
    while (input.length) {
        if (input.match(RDS1)) {
            input = input.replace(RDS1, "");
        } else if (input.match(RDS2)) {
            input = input.replace(RDS2, "/");
        } else if (input.match(RDS3)) {
            input = input.replace(RDS3, "/");
            output.pop();
        } else if (input === "." || input === "..") {
            input = "";
        } else {
            var im = input.match(RDS5);
            if (im) {
                var s = im[0];
                input = input.slice(s.length);
                output.push(s);
            } else {
                throw new Error("Unexpected dot segment condition");
            }
        }
    }
    return output.join("");
}

function serialize(components) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    var protocol = options.iri ? IRI_PROTOCOL : URI_PROTOCOL;
    var uriTokens = [];
    //find scheme handler
    var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
    //perform scheme specific serialization
    if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);
    if (components.host) {
        //if host component is an IPv6 address
        if (protocol.IPV6ADDRESS.test(components.host)) {}
        //TODO: normalize IPv6 address as per RFC 5952

        //if host component is a domain name
        else if (options.domainHost || schemeHandler && schemeHandler.domainHost) {
                //convert IDN via punycode
                try {
                    components.host = !options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host);
                } catch (e) {
                    components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
                }
            }
    }
    //normalize encoding
    _normalizeComponentEncoding(components, protocol);
    if (options.reference !== "suffix" && components.scheme) {
        uriTokens.push(components.scheme);
        uriTokens.push(":");
    }
    var authority = _recomposeAuthority(components, options);
    if (authority !== undefined) {
        if (options.reference !== "suffix") {
            uriTokens.push("//");
        }
        uriTokens.push(authority);
        if (components.path && components.path.charAt(0) !== "/") {
            uriTokens.push("/");
        }
    }
    if (components.path !== undefined) {
        var s = components.path;
        if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
            s = removeDotSegments(s);
        }
        if (authority === undefined) {
            s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//"
        }
        uriTokens.push(s);
    }
    if (components.query !== undefined) {
        uriTokens.push("?");
        uriTokens.push(components.query);
    }
    if (components.fragment !== undefined) {
        uriTokens.push("#");
        uriTokens.push(components.fragment);
    }
    return uriTokens.join(""); //merge tokens into a string
}

function resolveComponents(base, relative) {
    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
    var skipNormalization = arguments[3];

    var target = {};
    if (!skipNormalization) {
        base = parse(serialize(base, options), options); //normalize base components
        relative = parse(serialize(relative, options), options); //normalize relative components
    }
    options = options || {};
    if (!options.tolerant && relative.scheme) {
        target.scheme = relative.scheme;
        //target.authority = relative.authority;
        target.userinfo = relative.userinfo;
        target.host = relative.host;
        target.port = relative.port;
        target.path = removeDotSegments(relative.path || "");
        target.query = relative.query;
    } else {
        if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {
            //target.authority = relative.authority;
            target.userinfo = relative.userinfo;
            target.host = relative.host;
            target.port = relative.port;
            target.path = removeDotSegments(relative.path || "");
            target.query = relative.query;
        } else {
            if (!relative.path) {
                target.path = base.path;
                if (relative.query !== undefined) {
                    target.query = relative.query;
                } else {
                    target.query = base.query;
                }
            } else {
                if (relative.path.charAt(0) === "/") {
                    target.path = removeDotSegments(relative.path);
                } else {
                    if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {
                        target.path = "/" + relative.path;
                    } else if (!base.path) {
                        target.path = relative.path;
                    } else {
                        target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path;
                    }
                    target.path = removeDotSegments(target.path);
                }
                target.query = relative.query;
            }
            //target.authority = base.authority;
            target.userinfo = base.userinfo;
            target.host = base.host;
            target.port = base.port;
        }
        target.scheme = base.scheme;
    }
    target.fragment = relative.fragment;
    return target;
}

function resolve(baseURI, relativeURI, options) {
    var schemelessOptions = assign({ scheme: 'null' }, options);
    return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);
}

function normalize(uri, options) {
    if (typeof uri === "string") {
        uri = serialize(parse(uri, options), options);
    } else if (typeOf(uri) === "object") {
        uri = parse(serialize(uri, options), options);
    }
    return uri;
}

function equal(uriA, uriB, options) {
    if (typeof uriA === "string") {
        uriA = serialize(parse(uriA, options), options);
    } else if (typeOf(uriA) === "object") {
        uriA = serialize(uriA, options);
    }
    if (typeof uriB === "string") {
        uriB = serialize(parse(uriB, options), options);
    } else if (typeOf(uriB) === "object") {
        uriB = serialize(uriB, options);
    }
    return uriA === uriB;
}

function escapeComponent(str, options) {
    return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE, pctEncChar);
}

function unescapeComponent(str, options) {
    return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED, pctDecChars);
}

var handler = {
    scheme: "http",
    domainHost: true,
    parse: function parse(components, options) {
        //report missing host
        if (!components.host) {
            components.error = components.error || "HTTP URIs must have a host.";
        }
        return components;
    },
    serialize: function serialize(components, options) {
        var secure = String(components.scheme).toLowerCase() === "https";
        //normalize the default port
        if (components.port === (secure ? 443 : 80) || components.port === "") {
            components.port = undefined;
        }
        //normalize the empty path
        if (!components.path) {
            components.path = "/";
        }
        //NOTE: We do not parse query strings for HTTP URIs
        //as WWW Form Url Encoded query strings are part of the HTML4+ spec,
        //and not the HTTP spec.
        return components;
    }
};

var handler$1 = {
    scheme: "https",
    domainHost: handler.domainHost,
    parse: handler.parse,
    serialize: handler.serialize
};

function isSecure(wsComponents) {
    return typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === "wss";
}
//RFC 6455
var handler$2 = {
    scheme: "ws",
    domainHost: true,
    parse: function parse(components, options) {
        var wsComponents = components;
        //indicate if the secure flag is set
        wsComponents.secure = isSecure(wsComponents);
        //construct resouce name
        wsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');
        wsComponents.path = undefined;
        wsComponents.query = undefined;
        return wsComponents;
    },
    serialize: function serialize(wsComponents, options) {
        //normalize the default port
        if (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === "") {
            wsComponents.port = undefined;
        }
        //ensure scheme matches secure flag
        if (typeof wsComponents.secure === 'boolean') {
            wsComponents.scheme = wsComponents.secure ? 'wss' : 'ws';
            wsComponents.secure = undefined;
        }
        //reconstruct path from resource name
        if (wsComponents.resourceName) {
            var _wsComponents$resourc = wsComponents.resourceName.split('?'),
                _wsComponents$resourc2 = slicedToArray(_wsComponents$resourc, 2),
                path = _wsComponents$resourc2[0],
                query = _wsComponents$resourc2[1];

            wsComponents.path = path && path !== '/' ? path : undefined;
            wsComponents.query = query;
            wsComponents.resourceName = undefined;
        }
        //forbid fragment component
        wsComponents.fragment = undefined;
        return wsComponents;
    }
};

var handler$3 = {
    scheme: "wss",
    domainHost: handler$2.domainHost,
    parse: handler$2.parse,
    serialize: handler$2.serialize
};

var O = {};
var isIRI = true;
//RFC 3986
var UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]";
var HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive
var PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded
//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =
//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]";  //(%d1-8 / %d11-12 / %d14-31 / %d127)
//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$);  //%d33 / %d35-91 / %d93-126 / obs-qtext
//const VCHAR$$ = "[\\x21-\\x7E]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$));  //%d0 / CR / LF / obs-qtext
//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+");
//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$);
//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"');
var ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]";
var QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]";
var VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]");
var SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]";
var UNRESERVED = new RegExp(UNRESERVED$$, "g");
var PCT_ENCODED = new RegExp(PCT_ENCODED$, "g");
var NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g");
var NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g");
var NOT_HFVALUE = NOT_HFNAME;
function decodeUnreserved(str) {
    var decStr = pctDecChars(str);
    return !decStr.match(UNRESERVED) ? str : decStr;
}
var handler$4 = {
    scheme: "mailto",
    parse: function parse$$1(components, options) {
        var mailtoComponents = components;
        var to = mailtoComponents.to = mailtoComponents.path ? mailtoComponents.path.split(",") : [];
        mailtoComponents.path = undefined;
        if (mailtoComponents.query) {
            var unknownHeaders = false;
            var headers = {};
            var hfields = mailtoComponents.query.split("&");
            for (var x = 0, xl = hfields.length; x < xl; ++x) {
                var hfield = hfields[x].split("=");
                switch (hfield[0]) {
                    case "to":
                        var toAddrs = hfield[1].split(",");
                        for (var _x = 0, _xl = toAddrs.length; _x < _xl; ++_x) {
                            to.push(toAddrs[_x]);
                        }
                        break;
                    case "subject":
                        mailtoComponents.subject = unescapeComponent(hfield[1], options);
                        break;
                    case "body":
                        mailtoComponents.body = unescapeComponent(hfield[1], options);
                        break;
                    default:
                        unknownHeaders = true;
                        headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);
                        break;
                }
            }
            if (unknownHeaders) mailtoComponents.headers = headers;
        }
        mailtoComponents.query = undefined;
        for (var _x2 = 0, _xl2 = to.length; _x2 < _xl2; ++_x2) {
            var addr = to[_x2].split("@");
            addr[0] = unescapeComponent(addr[0]);
            if (!options.unicodeSupport) {
                //convert Unicode IDN -> ASCII IDN
                try {
                    addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());
                } catch (e) {
                    mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e;
                }
            } else {
                addr[1] = unescapeComponent(addr[1], options).toLowerCase();
            }
            to[_x2] = addr.join("@");
        }
        return mailtoComponents;
    },
    serialize: function serialize$$1(mailtoComponents, options) {
        var components = mailtoComponents;
        var to = toArray(mailtoComponents.to);
        if (to) {
            for (var x = 0, xl = to.length; x < xl; ++x) {
                var toAddr = String(to[x]);
                var atIdx = toAddr.lastIndexOf("@");
                var localPart = toAddr.slice(0, atIdx).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);
                var domain = toAddr.slice(atIdx + 1);
                //convert IDN via punycode
                try {
                    domain = !options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain);
                } catch (e) {
                    components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
                }
                to[x] = localPart + "@" + domain;
            }
            components.path = to.join(",");
        }
        var headers = mailtoComponents.headers = mailtoComponents.headers || {};
        if (mailtoComponents.subject) headers["subject"] = mailtoComponents.subject;
        if (mailtoComponents.body) headers["body"] = mailtoComponents.body;
        var fields = [];
        for (var name in headers) {
            if (headers[name] !== O[name]) {
                fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + "=" + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar));
            }
        }
        if (fields.length) {
            components.query = fields.join("&");
        }
        return components;
    }
};

var URN_PARSE = /^([^\:]+)\:(.*)/;
//RFC 2141
var handler$5 = {
    scheme: "urn",
    parse: function parse$$1(components, options) {
        var matches = components.path && components.path.match(URN_PARSE);
        var urnComponents = components;
        if (matches) {
            var scheme = options.scheme || urnComponents.scheme || "urn";
            var nid = matches[1].toLowerCase();
            var nss = matches[2];
            var urnScheme = scheme + ":" + (options.nid || nid);
            var schemeHandler = SCHEMES[urnScheme];
            urnComponents.nid = nid;
            urnComponents.nss = nss;
            urnComponents.path = undefined;
            if (schemeHandler) {
                urnComponents = schemeHandler.parse(urnComponents, options);
            }
        } else {
            urnComponents.error = urnComponents.error || "URN can not be parsed.";
        }
        return urnComponents;
    },
    serialize: function serialize$$1(urnComponents, options) {
        var scheme = options.scheme || urnComponents.scheme || "urn";
        var nid = urnComponents.nid;
        var urnScheme = scheme + ":" + (options.nid || nid);
        var schemeHandler = SCHEMES[urnScheme];
        if (schemeHandler) {
            urnComponents = schemeHandler.serialize(urnComponents, options);
        }
        var uriComponents = urnComponents;
        var nss = urnComponents.nss;
        uriComponents.path = (nid || options.nid) + ":" + nss;
        return uriComponents;
    }
};

var UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/;
//RFC 4122
var handler$6 = {
    scheme: "urn:uuid",
    parse: function parse(urnComponents, options) {
        var uuidComponents = urnComponents;
        uuidComponents.uuid = uuidComponents.nss;
        uuidComponents.nss = undefined;
        if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {
            uuidComponents.error = uuidComponents.error || "UUID is not valid.";
        }
        return uuidComponents;
    },
    serialize: function serialize(uuidComponents, options) {
        var urnComponents = uuidComponents;
        //normalize UUID
        urnComponents.nss = (uuidComponents.uuid || "").toLowerCase();
        return urnComponents;
    }
};

SCHEMES[handler.scheme] = handler;
SCHEMES[handler$1.scheme] = handler$1;
SCHEMES[handler$2.scheme] = handler$2;
SCHEMES[handler$3.scheme] = handler$3;
SCHEMES[handler$4.scheme] = handler$4;
SCHEMES[handler$5.scheme] = handler$5;
SCHEMES[handler$6.scheme] = handler$6;

exports.SCHEMES = SCHEMES;
exports.pctEncChar = pctEncChar;
exports.pctDecChars = pctDecChars;
exports.parse = parse;
exports.removeDotSegments = removeDotSegments;
exports.serialize = serialize;
exports.resolveComponents = resolveComponents;
exports.resolve = resolve;
exports.normalize = normalize;
exports.equal = equal;
exports.escapeComponent = escapeComponent;
exports.unescapeComponent = unescapeComponent;

Object.defineProperty(exports, '__esModule', { value: true });

})));


},{}],"ajv":[function(require,module,exports){
'use strict';

var compileSchema = require('./compile')
  , resolve = require('./compile/resolve')
  , Cache = require('./cache')
  , SchemaObject = require('./compile/schema_obj')
  , stableStringify = require('fast-json-stable-stringify')
  , formats = require('./compile/formats')
  , rules = require('./compile/rules')
  , $dataMetaSchema = require('./data')
  , util = require('./compile/util');

module.exports = Ajv;

Ajv.prototype.validate = validate;
Ajv.prototype.compile = compile;
Ajv.prototype.addSchema = addSchema;
Ajv.prototype.addMetaSchema = addMetaSchema;
Ajv.prototype.validateSchema = validateSchema;
Ajv.prototype.getSchema = getSchema;
Ajv.prototype.removeSchema = removeSchema;
Ajv.prototype.addFormat = addFormat;
Ajv.prototype.errorsText = errorsText;

Ajv.prototype._addSchema = _addSchema;
Ajv.prototype._compile = _compile;

Ajv.prototype.compileAsync = require('./compile/async');
var customKeyword = require('./keyword');
Ajv.prototype.addKeyword = customKeyword.add;
Ajv.prototype.getKeyword = customKeyword.get;
Ajv.prototype.removeKeyword = customKeyword.remove;
Ajv.prototype.validateKeyword = customKeyword.validate;

var errorClasses = require('./compile/error_classes');
Ajv.ValidationError = errorClasses.Validation;
Ajv.MissingRefError = errorClasses.MissingRef;
Ajv.$dataMetaSchema = $dataMetaSchema;

var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema';

var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ];
var META_SUPPORT_DATA = ['/properties'];

/**
 * Creates validator instance.
 * Usage: `Ajv(opts)`
 * @param {Object} opts optional options
 * @return {Object} ajv instance
 */
function Ajv(opts) {
  if (!(this instanceof Ajv)) return new Ajv(opts);
  opts = this._opts = util.copy(opts) || {};
  setLogger(this);
  this._schemas = {};
  this._refs = {};
  this._fragments = {};
  this._formats = formats(opts.format);

  this._cache = opts.cache || new Cache;
  this._loadingSchemas = {};
  this._compilations = [];
  this.RULES = rules();
  this._getId = chooseGetId(opts);

  opts.loopRequired = opts.loopRequired || Infinity;
  if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true;
  if (opts.serialize === undefined) opts.serialize = stableStringify;
  this._metaOpts = getMetaSchemaOptions(this);

  if (opts.formats) addInitialFormats(this);
  if (opts.keywords) addInitialKeywords(this);
  addDefaultMetaSchema(this);
  if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta);
  if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}});
  addInitialSchemas(this);
}



/**
 * Validate data using schema
 * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize.
 * @this   Ajv
 * @param  {String|Object} schemaKeyRef key, ref or schema object
 * @param  {Any} data to be validated
 * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`).
 */
function validate(schemaKeyRef, data) {
  var v;
  if (typeof schemaKeyRef == 'string') {
    v = this.getSchema(schemaKeyRef);
    if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"');
  } else {
    var schemaObj = this._addSchema(schemaKeyRef);
    v = schemaObj.validate || this._compile(schemaObj);
  }

  var valid = v(data);
  if (v.$async !== true) this.errors = v.errors;
  return valid;
}


/**
 * Create validating function for passed schema.
 * @this   Ajv
 * @param  {Object} schema schema object
 * @param  {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords.
 * @return {Function} validating function
 */
function compile(schema, _meta) {
  var schemaObj = this._addSchema(schema, undefined, _meta);
  return schemaObj.validate || this._compile(schemaObj);
}


/**
 * Adds schema to the instance.
 * @this   Ajv
 * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored.
 * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`.
 * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead.
 * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead.
 * @return {Ajv} this for method chaining
 */
function addSchema(schema, key, _skipValidation, _meta) {
  if (Array.isArray(schema)){
    for (var i=0; i<schema.length; i++) this.addSchema(schema[i], undefined, _skipValidation, _meta);
    return this;
  }
  var id = this._getId(schema);
  if (id !== undefined && typeof id != 'string')
    throw new Error('schema id must be string');
  key = resolve.normalizeId(key || id);
  checkUnique(this, key);
  this._schemas[key] = this._addSchema(schema, _skipValidation, _meta, true);
  return this;
}


/**
 * Add schema that will be used to validate other schemas
 * options in META_IGNORE_OPTIONS are alway set to false
 * @this   Ajv
 * @param {Object} schema schema object
 * @param {String} key optional schema key
 * @param {Boolean} skipValidation true to skip schema validation, can be used to override validateSchema option for meta-schema
 * @return {Ajv} this for method chaining
 */
function addMetaSchema(schema, key, skipValidation) {
  this.addSchema(schema, key, skipValidation, true);
  return this;
}


/**
 * Validate schema
 * @this   Ajv
 * @param {Object} schema schema to validate
 * @param {Boolean} throwOrLogError pass true to throw (or log) an error if invalid
 * @return {Boolean} true if schema is valid
 */
function validateSchema(schema, throwOrLogError) {
  var $schema = schema.$schema;
  if ($schema !== undefined && typeof $schema != 'string')
    throw new Error('$schema must be a string');
  $schema = $schema || this._opts.defaultMeta || defaultMeta(this);
  if (!$schema) {
    this.logger.warn('meta-schema not available');
    this.errors = null;
    return true;
  }
  var valid = this.validate($schema, schema);
  if (!valid && throwOrLogError) {
    var message = 'schema is invalid: ' + this.errorsText();
    if (this._opts.validateSchema == 'log') this.logger.error(message);
    else throw new Error(message);
  }
  return valid;
}


function defaultMeta(self) {
  var meta = self._opts.meta;
  self._opts.defaultMeta = typeof meta == 'object'
                            ? self._getId(meta) || meta
                            : self.getSchema(META_SCHEMA_ID)
                              ? META_SCHEMA_ID
                              : undefined;
  return self._opts.defaultMeta;
}


/**
 * Get compiled schema from the instance by `key` or `ref`.
 * @this   Ajv
 * @param  {String} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id).
 * @return {Function} schema validating function (with property `schema`).
 */
function getSchema(keyRef) {
  var schemaObj = _getSchemaObj(this, keyRef);
  switch (typeof schemaObj) {
    case 'object': return schemaObj.validate || this._compile(schemaObj);
    case 'string': return this.getSchema(schemaObj);
    case 'undefined': return _getSchemaFragment(this, keyRef);
  }
}


function _getSchemaFragment(self, ref) {
  var res = resolve.schema.call(self, { schema: {} }, ref);
  if (res) {
    var schema = res.schema
      , root = res.root
      , baseId = res.baseId;
    var v = compileSchema.call(self, schema, root, undefined, baseId);
    self._fragments[ref] = new SchemaObject({
      ref: ref,
      fragment: true,
      schema: schema,
      root: root,
      baseId: baseId,
      validate: v
    });
    return v;
  }
}


function _getSchemaObj(self, keyRef) {
  keyRef = resolve.normalizeId(keyRef);
  return self._schemas[keyRef] || self._refs[keyRef] || self._fragments[keyRef];
}


/**
 * Remove cached schema(s).
 * If no parameter is passed all schemas but meta-schemas are removed.
 * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed.
 * Even if schema is referenced by other schemas it still can be removed as other schemas have local references.
 * @this   Ajv
 * @param  {String|Object|RegExp} schemaKeyRef key, ref, pattern to match key/ref or schema object
 * @return {Ajv} this for method chaining
 */
function removeSchema(schemaKeyRef) {
  if (schemaKeyRef instanceof RegExp) {
    _removeAllSchemas(this, this._schemas, schemaKeyRef);
    _removeAllSchemas(this, this._refs, schemaKeyRef);
    return this;
  }
  switch (typeof schemaKeyRef) {
    case 'undefined':
      _removeAllSchemas(this, this._schemas);
      _removeAllSchemas(this, this._refs);
      this._cache.clear();
      return this;
    case 'string':
      var schemaObj = _getSchemaObj(this, schemaKeyRef);
      if (schemaObj) this._cache.del(schemaObj.cacheKey);
      delete this._schemas[schemaKeyRef];
      delete this._refs[schemaKeyRef];
      return this;
    case 'object':
      var serialize = this._opts.serialize;
      var cacheKey = serialize ? serialize(schemaKeyRef) : schemaKeyRef;
      this._cache.del(cacheKey);
      var id = this._getId(schemaKeyRef);
      if (id) {
        id = resolve.normalizeId(id);
        delete this._schemas[id];
        delete this._refs[id];
      }
  }
  return this;
}


function _removeAllSchemas(self, schemas, regex) {
  for (var keyRef in schemas) {
    var schemaObj = schemas[keyRef];
    if (!schemaObj.meta && (!regex || regex.test(keyRef))) {
      self._cache.del(schemaObj.cacheKey);
      delete schemas[keyRef];
    }
  }
}


/* @this   Ajv */
function _addSchema(schema, skipValidation, meta, shouldAddSchema) {
  if (typeof schema != 'object' && typeof schema != 'boolean')
    throw new Error('schema should be object or boolean');
  var serialize = this._opts.serialize;
  var cacheKey = serialize ? serialize(schema) : schema;
  var cached = this._cache.get(cacheKey);
  if (cached) return cached;

  shouldAddSchema = shouldAddSchema || this._opts.addUsedSchema !== false;

  var id = resolve.normalizeId(this._getId(schema));
  if (id && shouldAddSchema) checkUnique(this, id);

  var willValidate = this._opts.validateSchema !== false && !skipValidation;
  var recursiveMeta;
  if (willValidate && !(recursiveMeta = id && id == resolve.normalizeId(schema.$schema)))
    this.validateSchema(schema, true);

  var localRefs = resolve.ids.call(this, schema);

  var schemaObj = new SchemaObject({
    id: id,
    schema: schema,
    localRefs: localRefs,
    cacheKey: cacheKey,
    meta: meta
  });

  if (id[0] != '#' && shouldAddSchema) this._refs[id] = schemaObj;
  this._cache.put(cacheKey, schemaObj);

  if (willValidate && recursiveMeta) this.validateSchema(schema, true);

  return schemaObj;
}


/* @this   Ajv */
function _compile(schemaObj, root) {
  if (schemaObj.compiling) {
    schemaObj.validate = callValidate;
    callValidate.schema = schemaObj.schema;
    callValidate.errors = null;
    callValidate.root = root ? root : callValidate;
    if (schemaObj.schema.$async === true)
      callValidate.$async = true;
    return callValidate;
  }
  schemaObj.compiling = true;

  var currentOpts;
  if (schemaObj.meta) {
    currentOpts = this._opts;
    this._opts = this._metaOpts;
  }

  var v;
  try { v = compileSchema.call(this, schemaObj.schema, root, schemaObj.localRefs); }
  catch(e) {
    delete schemaObj.validate;
    throw e;
  }
  finally {
    schemaObj.compiling = false;
    if (schemaObj.meta) this._opts = currentOpts;
  }

  schemaObj.validate = v;
  schemaObj.refs = v.refs;
  schemaObj.refVal = v.refVal;
  schemaObj.root = v.root;
  return v;


  /* @this   {*} - custom context, see passContext option */
  function callValidate() {
    /* jshint validthis: true */
    var _validate = schemaObj.validate;
    var result = _validate.apply(this, arguments);
    callValidate.errors = _validate.errors;
    return result;
  }
}


function chooseGetId(opts) {
  switch (opts.schemaId) {
    case 'auto': return _get$IdOrId;
    case 'id': return _getId;
    default: return _get$Id;
  }
}

/* @this   Ajv */
function _getId(schema) {
  if (schema.$id) this.logger.warn('schema $id ignored', schema.$id);
  return schema.id;
}

/* @this   Ajv */
function _get$Id(schema) {
  if (schema.id) this.logger.warn('schema id ignored', schema.id);
  return schema.$id;
}


function _get$IdOrId(schema) {
  if (schema.$id && schema.id && schema.$id != schema.id)
    throw new Error('schema $id is different from id');
  return schema.$id || schema.id;
}


/**
 * Convert array of error message objects to string
 * @this   Ajv
 * @param  {Array<Object>} errors optional array of validation errors, if not passed errors from the instance are used.
 * @param  {Object} options optional options with properties `separator` and `dataVar`.
 * @return {String} human readable string with all errors descriptions
 */
function errorsText(errors, options) {
  errors = errors || this.errors;
  if (!errors) return 'No errors';
  options = options || {};
  var separator = options.separator === undefined ? ', ' : options.separator;
  var dataVar = options.dataVar === undefined ? 'data' : options.dataVar;

  var text = '';
  for (var i=0; i<errors.length; i++) {
    var e = errors[i];
    if (e) text += dataVar + e.dataPath + ' ' + e.message + separator;
  }
  return text.slice(0, -separator.length);
}


/**
 * Add custom format
 * @this   Ajv
 * @param {String} name format name
 * @param {String|RegExp|Function} format string is converted to RegExp; function should return boolean (true when valid)
 * @return {Ajv} this for method chaining
 */
function addFormat(name, format) {
  if (typeof format == 'string') format = new RegExp(format);
  this._formats[name] = format;
  return this;
}


function addDefaultMetaSchema(self) {
  var $dataSchema;
  if (self._opts.$data) {
    $dataSchema = require('./refs/data.json');
    self.addMetaSchema($dataSchema, $dataSchema.$id, true);
  }
  if (self._opts.meta === false) return;
  var metaSchema = require('./refs/json-schema-draft-07.json');
  if (self._opts.$data) metaSchema = $dataMetaSchema(metaSchema, META_SUPPORT_DATA);
  self.addMetaSchema(metaSchema, META_SCHEMA_ID, true);
  self._refs['http://json-schema.org/schema'] = META_SCHEMA_ID;
}


function addInitialSchemas(self) {
  var optsSchemas = self._opts.schemas;
  if (!optsSchemas) return;
  if (Array.isArray(optsSchemas)) self.addSchema(optsSchemas);
  else for (var key in optsSchemas) self.addSchema(optsSchemas[key], key);
}


function addInitialFormats(self) {
  for (var name in self._opts.formats) {
    var format = self._opts.formats[name];
    self.addFormat(name, format);
  }
}


function addInitialKeywords(self) {
  for (var name in self._opts.keywords) {
    var keyword = self._opts.keywords[name];
    self.addKeyword(name, keyword);
  }
}


function checkUnique(self, id) {
  if (self._schemas[id] || self._refs[id])
    throw new Error('schema with key or id "' + id + '" already exists');
}


function getMetaSchemaOptions(self) {
  var metaOpts = util.copy(self._opts);
  for (var i=0; i<META_IGNORE_OPTIONS.length; i++)
    delete metaOpts[META_IGNORE_OPTIONS[i]];
  return metaOpts;
}


function setLogger(self) {
  var logger = self._opts.logger;
  if (logger === false) {
    self.logger = {log: noop, warn: noop, error: noop};
  } else {
    if (logger === undefined) logger = console;
    if (!(typeof logger == 'object' && logger.log && logger.warn && logger.error))
      throw new Error('logger must implement log, warn and error methods');
    self.logger = logger;
  }
}


function noop() {}

},{"./cache":1,"./compile":5,"./compile/async":2,"./compile/error_classes":3,"./compile/formats":4,"./compile/resolve":6,"./compile/rules":7,"./compile/schema_obj":8,"./compile/util":10,"./data":11,"./keyword":39,"./refs/data.json":40,"./refs/json-schema-draft-07.json":41,"fast-json-stable-stringify":43}]},{},[])("ajv")
});
/* ajv 6.12.5: Another JSON Schema Validator */
!function(e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Ajv=e()}(function(){return function o(i,n,l){function c(r,e){if(!n[r]){if(!i[r]){var t="function"==typeof require&&require;if(!e&&t)return t(r,!0);if(u)return u(r,!0);var a=new Error("Cannot find module '"+r+"'");throw a.code="MODULE_NOT_FOUND",a}var s=n[r]={exports:{}};i[r][0].call(s.exports,function(e){return c(i[r][1][e]||e)},s,s.exports,o,i,n,l)}return n[r].exports}for(var u="function"==typeof require&&require,e=0;e<l.length;e++)c(l[e]);return c}({1:[function(e,r,t){"use strict";var a=r.exports=function(){this._cache={}};a.prototype.put=function(e,r){this._cache[e]=r},a.prototype.get=function(e){return this._cache[e]},a.prototype.del=function(e){delete this._cache[e]},a.prototype.clear=function(){this._cache={}}},{}],2:[function(e,r,t){"use strict";var a=e("./error_classes").MissingRef;function s(r,n,t){var l=this;if("function"!=typeof this._opts.loadSchema)throw new Error("options.loadSchema should be a function");"function"==typeof n&&(t=n,n=void 0);var e=c(r).then(function(){var e=l._addSchema(r,void 0,n);return e.validate||function o(i){try{return l._compile(i)}catch(e){if(e instanceof a)return r(e);throw e}function r(e){var r=e.missingSchema;if(s(r))throw new Error("Schema "+r+" is loaded but "+e.missingRef+" cannot be resolved");var t=l._loadingSchemas[r];return t||(t=l._loadingSchemas[r]=l._opts.loadSchema(r)).then(a,a),t.then(function(e){if(!s(r))return c(e).then(function(){s(r)||l.addSchema(e,r,void 0,n)})}).then(function(){return o(i)});function a(){delete l._loadingSchemas[r]}function s(e){return l._refs[e]||l._schemas[e]}}}(e)});return t&&e.then(function(e){t(null,e)},t),e;function c(e){var r=e.$schema;return r&&!l.getSchema(r)?s.call(l,{$ref:r},!0):Promise.resolve()}}r.exports=s},{"./error_classes":3}],3:[function(e,r,t){"use strict";var a=e("./resolve");function s(e,r,t){this.message=t||s.message(e,r),this.missingRef=a.url(e,r),this.missingSchema=a.normalizeId(a.fullPath(this.missingRef))}function o(e){return e.prototype=Object.create(Error.prototype),e.prototype.constructor=e}r.exports={Validation:o(function(e){this.message="validation failed",this.errors=e,this.ajv=this.validation=!0}),MissingRef:o(s)},s.message=function(e,r){return"can't resolve reference "+r+" from id "+e}},{"./resolve":6}],4:[function(e,r,t){"use strict";var a=e("./util"),o=/^(\d\d\d\d)-(\d\d)-(\d\d)$/,i=[0,31,28,31,30,31,30,31,31,30,31,30,31],n=/^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i,s=/^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i,l=/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,c=/^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,u=/^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i,h=/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,d=/^(?:\/(?:[^~/]|~0|~1)*)*$/,p=/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,f=/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;function m(e){return a.copy(m[e="full"==e?"full":"fast"])}function v(e){var r=e.match(o);if(!r)return!1;var t,a=+r[2],s=+r[3];return 1<=a&&a<=12&&1<=s&&s<=(2!=a||((t=+r[1])%4!=0||t%100==0&&t%400!=0)?i[a]:29)}function y(e,r){var t=e.match(n);if(!t)return!1;var a=t[1],s=t[2],o=t[3];return(a<=23&&s<=59&&o<=59||23==a&&59==s&&60==o)&&(!r||t[5])}(r.exports=m).fast={date:/^\d\d\d\d-[0-1]\d-[0-3]\d$/,time:/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,"date-time":/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,uri:/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":f},m.full={date:v,time:y,"date-time":function(e){var r=e.split(g);return 2==r.length&&v(r[0])&&y(r[1],!0)},uri:function(e){return P.test(e)&&l.test(e)},"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":f};var g=/t|\s/i;var P=/\/|:/;var E=/[^\\]\\Z/;function w(e){if(E.test(e))return!1;try{return new RegExp(e),!0}catch(e){return!1}}},{"./util":10}],5:[function(e,r,t){"use strict";var R=e("./resolve"),$=e("./util"),j=e("./error_classes"),D=e("fast-json-stable-stringify"),O=e("../dotjs/validate"),I=$.ucs2length,A=e("fast-deep-equal"),k=j.Validation;function C(e,c,u,r){var d=this,p=this._opts,h=[void 0],f={},l=[],t={},m=[],a={},v=[],s=function(e,r,t){var a=L.call(this,e,r,t);return 0<=a?{index:a,compiling:!0}:{index:a=this._compilations.length,compiling:!(this._compilations[a]={schema:e,root:r,baseId:t})}}.call(this,e,c=c||{schema:e,refVal:h,refs:f},r),o=this._compilations[s.index];if(s.compiling)return o.callValidate=P;var y=this._formats,g=this.RULES;try{var i=E(e,c,u,r);o.validate=i;var n=o.callValidate;return n&&(n.schema=i.schema,n.errors=null,n.refs=i.refs,n.refVal=i.refVal,n.root=i.root,n.$async=i.$async,p.sourceCode&&(n.source=i.source)),i}finally{(function(e,r,t){var a=L.call(this,e,r,t);0<=a&&this._compilations.splice(a,1)}).call(this,e,c,r)}function P(){var e=o.validate,r=e.apply(this,arguments);return P.errors=e.errors,r}function E(e,r,t,a){var s=!r||r&&r.schema==e;if(r.schema!=c.schema)return C.call(d,e,r,t,a);var o=!0===e.$async,i=O({isTop:!0,schema:e,isRoot:s,baseId:a,root:r,schemaPath:"",errSchemaPath:"#",errorPath:'""',MissingRefError:j.MissingRef,RULES:g,validate:O,util:$,resolve:R,resolveRef:w,usePattern:_,useDefault:F,useCustomRule:x,opts:p,formats:y,logger:d.logger,self:d}),i=Q(h,z)+Q(l,N)+Q(m,q)+Q(v,T)+i;p.processCode&&(i=p.processCode(i,e));try{var n=new Function("self","RULES","formats","root","refVal","defaults","customRules","equal","ucs2length","ValidationError",i)(d,g,y,c,h,m,v,A,I,k);h[0]=n}catch(e){throw d.logger.error("Error compiling schema, function code:",i),e}return n.schema=e,n.errors=null,n.refs=f,n.refVal=h,n.root=s?n:r,o&&(n.$async=!0),!0===p.sourceCode&&(n.source={code:i,patterns:l,defaults:m}),n}function w(e,r,t){r=R.url(e,r);var a,s,o=f[r];if(void 0!==o)return S(a=h[o],s="refVal["+o+"]");if(!t&&c.refs){var i=c.refs[r];if(void 0!==i)return S(a=c.refVal[i],s=b(r,a))}s=b(r);var n,l=R.call(d,E,c,r);if(void 0!==l||(n=u&&u[r])&&(l=R.inlineRef(n,p.inlineRefs)?n:C.call(d,n,c,u,e)),void 0!==l)return S(h[f[r]]=l,s);delete f[r]}function b(e,r){var t=h.length;return h[t]=r,"refVal"+(f[e]=t)}function S(e,r){return"object"==typeof e||"boolean"==typeof e?{code:r,schema:e,inline:!0}:{code:r,$async:e&&!!e.$async}}function _(e){var r=t[e];return void 0===r&&(r=t[e]=l.length,l[r]=e),"pattern"+r}function F(e){switch(typeof e){case"boolean":case"number":return""+e;case"string":return $.toQuotedString(e);case"object":if(null===e)return"null";var r=D(e),t=a[r];return void 0===t&&(t=a[r]=m.length,m[t]=e),"default"+t}}function x(e,r,t,a){if(!1!==d._opts.validateSchema){var s=e.definition.dependencies;if(s&&!s.every(function(e){return Object.prototype.hasOwnProperty.call(t,e)}))throw new Error("parent schema must have all required keywords: "+s.join(","));var o=e.definition.validateSchema;if(o)if(!o(r)){var i="keyword schema is invalid: "+d.errorsText(o.errors);if("log"!=d._opts.validateSchema)throw new Error(i);d.logger.error(i)}}var n,l=e.definition.compile,c=e.definition.inline,u=e.definition.macro;if(l)n=l.call(d,r,t,a);else if(u)n=u.call(d,r,t,a),!1!==p.validateSchema&&d.validateSchema(n,!0);else if(c)n=c.call(d,a,e.keyword,r,t);else if(!(n=e.definition.validate))return;if(void 0===n)throw new Error('custom keyword "'+e.keyword+'"failed to compile');var h=v.length;return{code:"customRule"+h,validate:v[h]=n}}}function L(e,r,t){for(var a=0;a<this._compilations.length;a++){var s=this._compilations[a];if(s.schema==e&&s.root==r&&s.baseId==t)return a}return-1}function N(e,r){return"var pattern"+e+" = new RegExp("+$.toQuotedString(r[e])+");"}function q(e){return"var default"+e+" = defaults["+e+"];"}function z(e,r){return void 0===r[e]?"":"var refVal"+e+" = refVal["+e+"];"}function T(e){return"var customRule"+e+" = customRules["+e+"];"}function Q(e,r){if(!e.length)return"";for(var t="",a=0;a<e.length;a++)t+=r(a,e);return t}r.exports=C},{"../dotjs/validate":38,"./error_classes":3,"./resolve":6,"./util":10,"fast-deep-equal":42,"fast-json-stable-stringify":43}],6:[function(e,r,t){"use strict";var m=e("uri-js"),v=e("fast-deep-equal"),y=e("./util"),l=e("./schema_obj"),a=e("json-schema-traverse");function c(e,r,t){var a=this._refs[t];if("string"==typeof a){if(!this._refs[a])return c.call(this,e,r,a);a=this._refs[a]}if((a=a||this._schemas[t])instanceof l)return d(a.schema,this._opts.inlineRefs)?a.schema:a.validate||this._compile(a);var s,o,i,n=u.call(this,r,t);return n&&(s=n.schema,r=n.root,i=n.baseId),s instanceof l?o=s.validate||e.call(this,s.schema,r,void 0,i):void 0!==s&&(o=d(s,this._opts.inlineRefs)?s:e.call(this,s,r,void 0,i)),o}function u(e,r){var t=m.parse(r),a=p(t),s=g(this._getId(e.schema));if(0===Object.keys(e.schema).length||a!==s){var o=P(a),i=this._refs[o];if("string"==typeof i)return function(e,r,t){var a=u.call(this,e,r);if(a){var s=a.schema,o=a.baseId;e=a.root;var i=this._getId(s);return i&&(o=f(o,i)),n.call(this,t,o,s,e)}}.call(this,e,i,t);if(i instanceof l)i.validate||this._compile(i),e=i;else{if(!((i=this._schemas[o])instanceof l))return;if(i.validate||this._compile(i),o==P(r))return{schema:i,root:e,baseId:s};e=i}if(!e.schema)return;s=g(this._getId(e.schema))}return n.call(this,t,s,e.schema,e)}(r.exports=c).normalizeId=P,c.fullPath=g,c.url=f,c.ids=function(e){var r=P(this._getId(e)),h={"":r},d={"":g(r,!1)},p={},f=this;return a(e,{allKeys:!0},function(e,r,t,a,s,o,i){if(""!==r){var n=f._getId(e),l=h[a],c=d[a]+"/"+s;if(void 0!==i&&(c+="/"+("number"==typeof i?i:y.escapeFragment(i))),"string"==typeof n){n=l=P(l?m.resolve(l,n):n);var u=f._refs[n];if("string"==typeof u&&(u=f._refs[u]),u&&u.schema){if(!v(e,u.schema))throw new Error('id "'+n+'" resolves to more than one schema')}else if(n!=P(c))if("#"==n[0]){if(p[n]&&!v(e,p[n]))throw new Error('id "'+n+'" resolves to more than one schema');p[n]=e}else f._refs[n]=c}h[r]=l,d[r]=c}}),p},c.inlineRef=d,c.schema=u;var h=y.toHash(["properties","patternProperties","enum","dependencies","definitions"]);function n(e,r,t,a){if(e.fragment=e.fragment||"","/"==e.fragment.slice(0,1)){for(var s=e.fragment.split("/"),o=1;o<s.length;o++){var i,n,l,c=s[o];if(c){if(void 0===(t=t[c=y.unescapeFragment(c)]))break;h[c]||((l=this._getId(t))&&(r=f(r,l)),t.$ref&&(i=f(r,t.$ref),(n=u.call(this,a,i))&&(t=n.schema,a=n.root,r=n.baseId)))}}return void 0!==t&&t!==a.schema?{schema:t,root:a,baseId:r}:void 0}}var i=y.toHash(["type","format","pattern","maxLength","minLength","maxProperties","minProperties","maxItems","minItems","maximum","minimum","uniqueItems","multipleOf","required","enum"]);function d(e,r){return!1!==r&&(void 0===r||!0===r?function e(r){var t;if(Array.isArray(r)){for(var a=0;a<r.length;a++)if("object"==typeof(t=r[a])&&!e(t))return!1}else for(var s in r){if("$ref"==s)return!1;if("object"==typeof(t=r[s])&&!e(t))return!1}return!0}(e):r?function e(r){var t,a=0;if(Array.isArray(r)){for(var s=0;s<r.length;s++)if("object"==typeof(t=r[s])&&(a+=e(t)),a==1/0)return 1/0}else for(var o in r){if("$ref"==o)return 1/0;if(i[o])a++;else if("object"==typeof(t=r[o])&&(a+=e(t)+1),a==1/0)return 1/0}return a}(e)<=r:void 0)}function g(e,r){return!1!==r&&(e=P(e)),p(m.parse(e))}function p(e){return m.serialize(e).split("#")[0]+"#"}var s=/#\/?$/;function P(e){return e?e.replace(s,""):""}function f(e,r){return r=P(r),m.resolve(e,r)}},{"./schema_obj":8,"./util":10,"fast-deep-equal":42,"json-schema-traverse":44,"uri-js":45}],7:[function(e,r,t){"use strict";var o=e("../dotjs"),i=e("./util").toHash;r.exports=function(){var a=[{type:"number",rules:[{maximum:["exclusiveMaximum"]},{minimum:["exclusiveMinimum"]},"multipleOf","format"]},{type:"string",rules:["maxLength","minLength","pattern","format"]},{type:"array",rules:["maxItems","minItems","items","contains","uniqueItems"]},{type:"object",rules:["maxProperties","minProperties","required","dependencies","propertyNames",{properties:["additionalProperties","patternProperties"]}]},{rules:["$ref","const","enum","not","anyOf","oneOf","allOf","if"]}],s=["type","$comment"];return a.all=i(s),a.types=i(["number","integer","string","array","object","boolean","null"]),a.forEach(function(e){e.rules=e.rules.map(function(e){var r,t;return"object"==typeof e&&(t=e[r=Object.keys(e)[0]],e=r,t.forEach(function(e){s.push(e),a.all[e]=!0})),s.push(e),a.all[e]={keyword:e,code:o[e],implements:t}}),a.all.$comment={keyword:"$comment",code:o.$comment},e.type&&(a.types[e.type]=e)}),a.keywords=i(s.concat(["$schema","$id","id","$data","$async","title","description","default","definitions","examples","readOnly","writeOnly","contentMediaType","contentEncoding","additionalItems","then","else"])),a.custom={},a}},{"../dotjs":27,"./util":10}],8:[function(e,r,t){"use strict";var a=e("./util");r.exports=function(e){a.copy(e,this)}},{"./util":10}],9:[function(e,r,t){"use strict";r.exports=function(e){for(var r,t=0,a=e.length,s=0;s<a;)t++,55296<=(r=e.charCodeAt(s++))&&r<=56319&&s<a&&56320==(64512&(r=e.charCodeAt(s)))&&s++;return t}},{}],10:[function(e,r,t){"use strict";function i(e,r,t,a){var s=a?" !== ":" === ",o=a?" || ":" && ",i=a?"!":"",n=a?"":"!";switch(e){case"null":return r+s+"null";case"array":return i+"Array.isArray("+r+")";case"object":return"("+i+r+o+"typeof "+r+s+'"object"'+o+n+"Array.isArray("+r+"))";case"integer":return"(typeof "+r+s+'"number"'+o+n+"("+r+" % 1)"+o+r+s+r+(t?o+i+"isFinite("+r+")":"")+")";case"number":return"(typeof "+r+s+'"'+e+'"'+(t?o+i+"isFinite("+r+")":"")+")";default:return"typeof "+r+s+'"'+e+'"'}}r.exports={copy:function(e,r){for(var t in r=r||{},e)r[t]=e[t];return r},checkDataType:i,checkDataTypes:function(e,r,t){{if(1===e.length)return i(e[0],r,t,!0);var a,s="",o=n(e);for(a in o.array&&o.object&&(s=o.null?"(":"(!"+r+" || ",s+="typeof "+r+' !== "object")',delete o.null,delete o.array,delete o.object),o.number&&delete o.integer,o)s+=(s?" && ":"")+i(a,r,t,!0);return s}},coerceToTypes:function(e,r){if(Array.isArray(r)){for(var t=[],a=0;a<r.length;a++){var s=r[a];(o[s]||"array"===e&&"array"===s)&&(t[t.length]=s)}if(t.length)return t}else{if(o[r])return[r];if("array"===e&&"array"===r)return["array"]}},toHash:n,getProperty:h,escapeQuotes:l,equal:e("fast-deep-equal"),ucs2length:e("./ucs2length"),varOccurences:function(e,r){r+="[^0-9]";var t=e.match(new RegExp(r,"g"));return t?t.length:0},varReplace:function(e,r,t){return r+="([^0-9])",t=t.replace(/\$/g,"$$$$"),e.replace(new RegExp(r,"g"),t+"$1")},schemaHasRules:function(e,r){if("boolean"==typeof e)return!e;for(var t in e)if(r[t])return!0},schemaHasRulesExcept:function(e,r,t){if("boolean"==typeof e)return!e&&"not"!=t;for(var a in e)if(a!=t&&r[a])return!0},schemaUnknownRules:function(e,r){if("boolean"==typeof e)return;for(var t in e)if(!r[t])return t},toQuotedString:c,getPathExpr:function(e,r,t,a){return u(e,t?"'/' + "+r+(a?"":".replace(/~/g, '~0').replace(/\\//g, '~1')"):a?"'[' + "+r+" + ']'":"'[\\'' + "+r+" + '\\']'")},getPath:function(e,r,t){var a=c(t?"/"+f(r):h(r));return u(e,a)},getData:function(e,r,t){var a,s,o,i;if(""===e)return"rootData";if("/"==e[0]){if(!d.test(e))throw new Error("Invalid JSON-pointer: "+e);s=e,o="rootData"}else{if(!(i=e.match(p)))throw new Error("Invalid JSON-pointer: "+e);if(a=+i[1],"#"==(s=i[2])){if(r<=a)throw new Error("Cannot access property/index "+a+" levels up, current level is "+r);return t[r-a]}if(r<a)throw new Error("Cannot access data "+a+" levels up, current level is "+r);if(o="data"+(r-a||""),!s)return o}for(var n=o,l=s.split("/"),c=0;c<l.length;c++){var u=l[c];u&&(o+=h(m(u)),n+=" && "+o)}return n},unescapeFragment:function(e){return m(decodeURIComponent(e))},unescapeJsonPointer:m,escapeFragment:function(e){return encodeURIComponent(f(e))},escapeJsonPointer:f};var o=n(["string","number","integer","boolean","null"]);function n(e){for(var r={},t=0;t<e.length;t++)r[e[t]]=!0;return r}var a=/^[a-z$_][a-z$_0-9]*$/i,s=/'|\\/g;function h(e){return"number"==typeof e?"["+e+"]":a.test(e)?"."+e:"['"+l(e)+"']"}function l(e){return e.replace(s,"\\$&").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\f/g,"\\f").replace(/\t/g,"\\t")}function c(e){return"'"+l(e)+"'"}var d=/^\/(?:[^~]|~0|~1)*$/,p=/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;function u(e,r){return'""'==e?r:(e+" + "+r).replace(/([^\\])' \+ '/g,"$1")}function f(e){return e.replace(/~/g,"~0").replace(/\//g,"~1")}function m(e){return e.replace(/~1/g,"/").replace(/~0/g,"~")}},{"./ucs2length":9,"fast-deep-equal":42}],11:[function(e,r,t){"use strict";var l=["multipleOf","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","additionalItems","maxItems","minItems","uniqueItems","maxProperties","minProperties","required","additionalProperties","enum","format","const"];r.exports=function(e,r){for(var t=0;t<r.length;t++){e=JSON.parse(JSON.stringify(e));for(var a=r[t].split("/"),s=e,o=1;o<a.length;o++)s=s[a[o]];for(o=0;o<l.length;o++){var i=l[o],n=s[i];n&&(s[i]={anyOf:[n,{$ref:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"}]})}}return e}},{}],12:[function(e,r,t){"use strict";var a=e("./refs/json-schema-draft-07.json");r.exports={$id:"https://github.com/ajv-validator/ajv/blob/master/lib/definition_schema.js",definitions:{simpleTypes:a.definitions.simpleTypes},type:"object",dependencies:{schema:["validate"],$data:["validate"],statements:["inline"],valid:{not:{required:["macro"]}}},properties:{type:a.properties.type,schema:{type:"boolean"},statements:{type:"boolean"},dependencies:{type:"array",items:{type:"string"}},metaSchema:{type:"object"},modifying:{type:"boolean"},valid:{type:"boolean"},$data:{type:"boolean"},async:{type:"boolean"},errors:{anyOf:[{type:"boolean"},{const:"full"}]}}}},{"./refs/json-schema-draft-07.json":41}],13:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a,s,o,i,n,l,c=" ",u=e.level,h=e.dataLevel,d=e.schema[r],p=e.schemaPath+e.util.getProperty(r),f=e.errSchemaPath+"/"+r,m=!e.opts.allErrors,v="data"+(h||""),y=e.opts.$data&&d&&d.$data,g=y?(c+=" var schema"+u+" = "+e.util.getData(d.$data,h,e.dataPathArr)+"; ","schema"+u):d,P="maximum"==r,E=P?"exclusiveMaximum":"exclusiveMinimum",w=e.schema[E],b=e.opts.$data&&w&&w.$data,S=P?"<":">",_=P?">":"<",F=void 0;if(!y&&"number"!=typeof d&&void 0!==d)throw new Error(r+" must be number");if(!b&&void 0!==w&&"number"!=typeof w&&"boolean"!=typeof w)throw new Error(E+" must be number or boolean");b?(o="exclIsNumber"+u,i="' + "+(n="op"+u)+" + '",c+=" var schemaExcl"+u+" = "+(t=e.util.getData(w.$data,h,e.dataPathArr))+"; ",F=E,(l=l||[]).push(c+=" var "+(a="exclusive"+u)+"; var "+(s="exclType"+u)+" = typeof "+(t="schemaExcl"+u)+"; if ("+s+" != 'boolean' && "+s+" != 'undefined' && "+s+" != 'number') { "),c="",!1!==e.createErrors?(c+=" { keyword: '"+(F||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(f)+" , params: {} ",!1!==e.opts.messages&&(c+=" , message: '"+E+" should be boolean' "),e.opts.verbose&&(c+=" , schema: validate.schema"+p+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+v+" "),c+=" } "):c+=" {} ",x=c,c=l.pop(),c+=!e.compositeRule&&m?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c+=" } else if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" "+s+" == 'number' ? ( ("+a+" = "+g+" === undefined || "+t+" "+S+"= "+g+") ? "+v+" "+_+"= "+t+" : "+v+" "+_+" "+g+" ) : ( ("+a+" = "+t+" === true) ? "+v+" "+_+"= "+g+" : "+v+" "+_+" "+g+" ) || "+v+" !== "+v+") { var op"+u+" = "+a+" ? '"+S+"' : '"+S+"='; ",void 0===d&&(f=e.errSchemaPath+"/"+(F=E),g=t,y=b)):(i=S,(o="number"==typeof w)&&y?(n="'"+i+"'",c+=" if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" ( "+g+" === undefined || "+w+" "+S+"= "+g+" ? "+v+" "+_+"= "+w+" : "+v+" "+_+" "+g+" ) || "+v+" !== "+v+") { "):(o&&void 0===d?(a=!0,f=e.errSchemaPath+"/"+(F=E),g=w,_+="="):(o&&(g=Math[P?"min":"max"](w,d)),w===(!o||g)?(a=!0,f=e.errSchemaPath+"/"+(F=E),_+="="):(a=!1,i+="=")),n="'"+i+"'",c+=" if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" "+v+" "+_+" "+g+" || "+v+" !== "+v+") { ")),F=F||r,(l=l||[]).push(c),c="",!1!==e.createErrors?(c+=" { keyword: '"+(F||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(f)+" , params: { comparison: "+n+", limit: "+g+", exclusive: "+a+" } ",!1!==e.opts.messages&&(c+=" , message: 'should be "+i+" ",c+=y?"' + "+g:g+"'"),e.opts.verbose&&(c+=" , schema:  ",c+=y?"validate.schema"+p:""+d,c+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+v+" "),c+=" } "):c+=" {} ";var x=c;return c=l.pop(),c+=!e.compositeRule&&m?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c+=" } ",m&&(c+=" else { "),c}},{}],14:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || ");var d=r,p=p||[];p.push(t+=" "+c+".length "+("maxItems"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have ",t+="maxItems"==r?"more":"fewer",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" items' "),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+o,t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],15:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || "),t+=!1===e.opts.unicode?" "+c+".length ":" ucs2length("+c+") ";var d=r,p=p||[];p.push(t+=" "+("maxLength"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT be ",t+="maxLength"==r?"longer":"shorter",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" characters' "),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+o,t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],16:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || ");var d=r,p=p||[];p.push(t+=" Object.keys("+c+").length "+("maxProperties"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have ",t+="maxProperties"==r?"more":"fewer",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" properties' "),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+o,t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],17:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.schema[r],s=e.schemaPath+e.util.getProperty(r),o=e.errSchemaPath+"/"+r,i=!e.opts.allErrors,n=e.util.copy(e),l="";n.level++;var c="valid"+n.level,u=n.baseId,h=!0,d=a;if(d)for(var p,f=-1,m=d.length-1;f<m;)p=d[f+=1],(e.opts.strictKeywords?"object"==typeof p&&0<Object.keys(p).length||!1===p:e.util.schemaHasRules(p,e.RULES.all))&&(h=!1,n.schema=p,n.schemaPath=s+"["+f+"]",n.errSchemaPath=o+"/"+f,t+="  "+e.validate(n)+" ",n.baseId=u,i&&(t+=" if ("+c+") { ",l+="}"));return i&&(t+=h?" if (true) { ":" "+l.slice(0,-1)+" "),t}},{}],18:[function(e,r,t){"use strict";r.exports=function(r,e){var t=" ",a=r.level,s=r.dataLevel,o=r.schema[e],i=r.schemaPath+r.util.getProperty(e),n=r.errSchemaPath+"/"+e,l=!r.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=r.util.copy(r),p="";d.level++;var f="valid"+d.level;if(o.every(function(e){return r.opts.strictKeywords?"object"==typeof e&&0<Object.keys(e).length||!1===e:r.util.schemaHasRules(e,r.RULES.all)})){var m=d.baseId;t+=" var "+h+" = errors; var "+u+" = false;  ";var v=r.compositeRule;r.compositeRule=d.compositeRule=!0;var y=o;if(y)for(var g,P=-1,E=y.length-1;P<E;)g=y[P+=1],d.schema=g,d.schemaPath=i+"["+P+"]",d.errSchemaPath=n+"/"+P,t+="  "+r.validate(d)+" ",d.baseId=m,t+=" "+u+" = "+u+" || "+f+"; if (!"+u+") { ",p+="}";r.compositeRule=d.compositeRule=v,t+=" "+p+" if (!"+u+") {   var err =   ",!1!==r.createErrors?(t+=" { keyword: 'anyOf' , dataPath: (dataPath || '') + "+r.errorPath+" , schemaPath: "+r.util.toQuotedString(n)+" , params: {} ",!1!==r.opts.messages&&(t+=" , message: 'should match some schema in anyOf' "),r.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+r.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!r.compositeRule&&l&&(t+=r.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; "),t+=" } else {  errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; } ",r.opts.allErrors&&(t+=" } ")}else l&&(t+=" if (true) { ");return t}},{}],19:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.errSchemaPath+"/"+r,s=e.util.toQuotedString(e.schema[r]);return!0===e.opts.$comment?t+=" console.log("+s+");":"function"==typeof e.opts.$comment&&(t+=" self._opts.$comment("+s+", "+e.util.toQuotedString(a)+", validate.root.schema);"),t}},{}],20:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h=e.opts.$data&&o&&o.$data;h&&(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ");h||(t+=" var schema"+a+" = validate.schema"+i+";");var d=d||[];d.push(t+="var "+u+" = equal("+c+", schema"+a+"); if (!"+u+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'const' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { allowedValue: schema"+a+" } ",!1!==e.opts.messages&&(t+=" , message: 'should be equal to constant' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var p=t,t=d.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+p+"]); ":" validate.errors = ["+p+"]; return false; ":" var err = "+p+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" }",l&&(t+=" else { "),t}},{}],21:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=e.util.copy(e);d.level++;var p,f,m,v="valid"+d.level,y="i"+a,g=d.dataLevel=e.dataLevel+1,P="data"+g,E=e.baseId,w=e.opts.strictKeywords?"object"==typeof o&&0<Object.keys(o).length||!1===o:e.util.schemaHasRules(o,e.RULES.all);t+="var "+h+" = errors;var "+u+";",w?(p=e.compositeRule,e.compositeRule=d.compositeRule=!0,d.schema=o,d.schemaPath=i,d.errSchemaPath=n,t+=" var "+v+" = false; for (var "+y+" = 0; "+y+" < "+c+".length; "+y+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers,!0),f=c+"["+y+"]",d.dataPathArr[g]=y,m=e.validate(d),d.baseId=E,e.util.varOccurences(m,P)<2?t+=" "+e.util.varReplace(m,P,f)+" ":t+=" var "+P+" = "+f+"; "+m+" ",t+=" if ("+v+") break; }  ",e.compositeRule=d.compositeRule=p,t+="  if (!"+v+") {"):t+=" if ("+c+".length == 0) {";var b=b||[];b.push(t),t="",!1!==e.createErrors?(t+=" { keyword: 'contains' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: {} ",!1!==e.opts.messages&&(t+=" , message: 'should contain a valid item' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var S=t,t=b.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+S+"]); ":" validate.errors = ["+S+"]; return false; ":" var err = "+S+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } else { ",w&&(t+="  errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; } "),e.opts.allErrors&&(t+=" } "),t}},{}],22:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a,s,o,i,n,l=" ",c=e.level,u=e.dataLevel,h=e.schema[r],d=e.schemaPath+e.util.getProperty(r),p=e.errSchemaPath+"/"+r,f=!e.opts.allErrors,m="data"+(u||""),v="valid"+c,y="errs__"+c,g=e.opts.$data&&h&&h.$data,P=g?(l+=" var schema"+c+" = "+e.util.getData(h.$data,u,e.dataPathArr)+"; ","schema"+c):h,E=this,w="definition"+c,b=E.definition,S="";if(g&&b.$data){var _=b.validateSchema;l+=" var "+w+" = RULES.custom['"+r+"'].definition; var "+(n="keywordValidate"+c)+" = "+w+".validate;"}else{if(!(i=e.useCustomRule(E,h,e.schema,e)))return;P="validate.schema"+d,n=i.code,a=b.compile,s=b.inline,o=b.macro}var F,x,R,$,j,D,O,I,A,k,C=n+".errors",L="i"+c,N="ruleErr"+c,q=b.async;if(q&&!e.async)throw new Error("async keyword in sync schema");return s||o||(l+=C+" = null;"),l+="var "+y+" = errors;var "+v+";",g&&b.$data&&(S+="}",l+=" if ("+P+" === undefined) { "+v+" = true; } else { ",_&&(S+="}",l+=" "+v+" = "+w+".validateSchema("+P+"); if ("+v+") { ")),s?l+=b.statements?" "+i.validate+" ":" "+v+" = "+i.validate+"; ":o?(S="",(F=e.util.copy(e)).level++,x="valid"+F.level,F.schema=i.validate,F.schemaPath="",R=e.compositeRule,e.compositeRule=F.compositeRule=!0,$=e.validate(F).replace(/validate\.schema/g,n),e.compositeRule=F.compositeRule=R,l+=" "+$):((I=I||[]).push(l),l="",l+="  "+n+".call( ",l+=e.opts.passContext?"this":"self",l+=a||!1===b.schema?" , "+m+" ":" , "+P+" , "+m+" , validate.schema"+e.schemaPath+" ",l+=" , (dataPath || '')",'""'!=e.errorPath&&(l+=" + "+e.errorPath),O=l+=" , "+(j=u?"data"+(u-1||""):"parentData")+" , "+(D=u?e.dataPathArr[u]:"parentDataProperty")+" , rootData )  ",l=I.pop(),!1===b.errors?(l+=" "+v+" = ",q&&(l+="await "),l+=O+"; "):l+=q?" var "+(C="customErrors"+c)+" = null; try { "+v+" = await "+O+"; } catch (e) { "+v+" = false; if (e instanceof ValidationError) "+C+" = e.errors; else throw e; } ":" "+C+" = null; "+v+" = "+O+"; "),b.modifying&&(l+=" if ("+j+") "+m+" = "+j+"["+D+"];"),l+=""+S,b.valid?f&&(l+=" if (true) { "):(l+=" if ( ",void 0===b.valid?(l+=" !",l+=o?""+x:v):l+=" "+!b.valid+" ",t=E.keyword,(I=I||[]).push(l+=") { "),(I=I||[]).push(l=""),l="",!1!==e.createErrors?(l+=" { keyword: '"+(t||"custom")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(p)+" , params: { keyword: '"+E.keyword+"' } ",!1!==e.opts.messages&&(l+=" , message: 'should pass \""+E.keyword+"\" keyword validation' "),e.opts.verbose&&(l+=" , schema: validate.schema"+d+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+m+" "),l+=" } "):l+=" {} ",A=l,l=I.pop(),k=l+=!e.compositeRule&&f?e.async?" throw new ValidationError(["+A+"]); ":" validate.errors = ["+A+"]; return false; ":" var err = "+A+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l=I.pop(),s?b.errors?"full"!=b.errors&&(l+="  for (var "+L+"="+y+"; "+L+"<errors; "+L+"++) { var "+N+" = vErrors["+L+"]; if ("+N+".dataPath === undefined) "+N+".dataPath = (dataPath || '') + "+e.errorPath+"; if ("+N+".schemaPath === undefined) { "+N+'.schemaPath = "'+p+'"; } ',e.opts.verbose&&(l+=" "+N+".schema = "+P+"; "+N+".data = "+m+"; "),l+=" } "):!1===b.errors?l+=" "+k+" ":(l+=" if ("+y+" == errors) { "+k+" } else {  for (var "+L+"="+y+"; "+L+"<errors; "+L+"++) { var "+N+" = vErrors["+L+"]; if ("+N+".dataPath === undefined) "+N+".dataPath = (dataPath || '') + "+e.errorPath+"; if ("+N+".schemaPath === undefined) { "+N+'.schemaPath = "'+p+'"; } ',e.opts.verbose&&(l+=" "+N+".schema = "+P+"; "+N+".data = "+m+"; "),l+=" } } "):o?(l+="   var err =   ",!1!==e.createErrors?(l+=" { keyword: '"+(t||"custom")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(p)+" , params: { keyword: '"+E.keyword+"' } ",!1!==e.opts.messages&&(l+=" , message: 'should pass \""+E.keyword+"\" keyword validation' "),e.opts.verbose&&(l+=" , schema: validate.schema"+d+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+m+" "),l+=" } "):l+=" {} ",l+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&f&&(l+=e.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; ")):!1===b.errors?l+=" "+k+" ":(l+=" if (Array.isArray("+C+")) { if (vErrors === null) vErrors = "+C+"; else vErrors = vErrors.concat("+C+"); errors = vErrors.length;  for (var "+L+"="+y+"; "+L+"<errors; "+L+"++) { var "+N+" = vErrors["+L+"]; if ("+N+".dataPath === undefined) "+N+".dataPath = (dataPath || '') + "+e.errorPath+";  "+N+'.schemaPath = "'+p+'";  ',e.opts.verbose&&(l+=" "+N+".schema = "+P+"; "+N+".data = "+m+"; "),l+=" } } else { "+k+" } "),l+=" } ",f&&(l+=" else { ")),l}},{}],23:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e),d="";h.level++;var p,f="valid"+h.level,m={},v={},y=e.opts.ownProperties;for(I in o){"__proto__"!=I&&(k=o[I],(p=Array.isArray(k)?v:m)[I]=k)}t+="var "+u+" = errors;";var g=e.errorPath;for(I in t+="var missing"+a+";",v)if((p=v[I]).length){if(t+=" if ( "+c+e.util.getProperty(I)+" !== undefined ",y&&(t+=" && Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(I)+"') "),l){t+=" && ( ";var P=p;if(P)for(var E=-1,w=P.length-1;E<w;){R=P[E+=1],E&&(t+=" || "),t+=" ( ( "+(O=c+(D=e.util.getProperty(R)))+" === undefined ",y&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(R)+"') "),t+=") && (missing"+a+" = "+e.util.toQuotedString(e.opts.jsonPointers?R:D)+") ) "}t+=")) {  ";var b="missing"+a,S="' + "+b+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.opts.jsonPointers?e.util.getPathExpr(g,b,!0):g+" + "+b);var _=_||[];_.push(t),t="",!1!==e.createErrors?(t+=" { keyword: 'dependencies' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { property: '"+e.util.escapeQuotes(I)+"', missingProperty: '"+S+"', depsCount: "+p.length+", deps: '"+e.util.escapeQuotes(1==p.length?p[0]:p.join(", "))+"' } ",!1!==e.opts.messages&&(t+=" , message: 'should have ",t+=1==p.length?"property "+e.util.escapeQuotes(p[0]):"properties "+e.util.escapeQuotes(p.join(", ")),t+=" when property "+e.util.escapeQuotes(I)+" is present' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var F=t,t=_.pop();t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+F+"]); ":" validate.errors = ["+F+"]; return false; ":" var err = "+F+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "}else{t+=" ) { ";var x=p;if(x)for(var R,$=-1,j=x.length-1;$<j;){R=x[$+=1];var D=e.util.getProperty(R),S=e.util.escapeQuotes(R),O=c+D;e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(g,R,e.opts.jsonPointers)),t+=" if ( "+O+" === undefined ",y&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(R)+"') "),t+=") {  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'dependencies' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { property: '"+e.util.escapeQuotes(I)+"', missingProperty: '"+S+"', depsCount: "+p.length+", deps: '"+e.util.escapeQuotes(1==p.length?p[0]:p.join(", "))+"' } ",!1!==e.opts.messages&&(t+=" , message: 'should have ",t+=1==p.length?"property "+e.util.escapeQuotes(p[0]):"properties "+e.util.escapeQuotes(p.join(", ")),t+=" when property "+e.util.escapeQuotes(I)+" is present' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } "}}t+=" }   ",l&&(d+="}",t+=" else { ")}e.errorPath=g;var I,A=h.baseId;for(I in m){var k=m[I];(e.opts.strictKeywords?"object"==typeof k&&0<Object.keys(k).length||!1===k:e.util.schemaHasRules(k,e.RULES.all))&&(t+=" "+f+" = true; if ( "+c+e.util.getProperty(I)+" !== undefined ",y&&(t+=" && Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(I)+"') "),t+=") { ",h.schema=k,h.schemaPath=i+e.util.getProperty(I),h.errSchemaPath=n+"/"+e.util.escapeFragment(I),t+="  "+e.validate(h)+" ",h.baseId=A,t+=" }  ",l&&(t+=" if ("+f+") { ",d+="}"))}return l&&(t+="   "+d+" if ("+u+" == errors) {"),t}},{}],24:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h=e.opts.$data&&o&&o.$data,d=(h&&(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; "),"i"+a),p="schema"+a;h||(t+=" var "+p+" = validate.schema"+i+";"),t+="var "+u+";",h&&(t+=" if (schema"+a+" === undefined) "+u+" = true; else if (!Array.isArray(schema"+a+")) "+u+" = false; else {"),t+=u+" = false;for (var "+d+"=0; "+d+"<"+p+".length; "+d+"++) if (equal("+c+", "+p+"["+d+"])) { "+u+" = true; break; }",h&&(t+="  }  ");var f=f||[];f.push(t+=" if (!"+u+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'enum' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { allowedValues: schema"+a+" } ",!1!==e.opts.messages&&(t+=" , message: 'should be equal to one of the allowed values' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var m=t,t=f.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+m+"]); ":" validate.errors = ["+m+"]; return false; ":" var err = "+m+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" }",l&&(t+=" else { "),t}},{}],25:[function(e,r,t){"use strict";r.exports=function(e,r,t){var a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+e.util.getProperty(r),l=e.errSchemaPath+"/"+r,c=!e.opts.allErrors,u="data"+(o||"");if(!1===e.opts.format)return c&&(a+=" if (true) { "),a;var h,d=e.opts.$data&&i&&i.$data,p=d?(a+=" var schema"+s+" = "+e.util.getData(i.$data,o,e.dataPathArr)+"; ","schema"+s):i,f=e.opts.unknownFormats,m=Array.isArray(f);if(d){a+=" var "+(h="format"+s)+" = formats["+p+"]; var "+(v="isObject"+s)+" = typeof "+h+" == 'object' && !("+h+" instanceof RegExp) && "+h+".validate; var "+(g="formatType"+s)+" = "+v+" && "+h+".type || 'string'; if ("+v+") { ",e.async&&(a+=" var async"+s+" = "+h+".async; "),a+=" "+h+" = "+h+".validate; } if (  ",d&&(a+=" ("+p+" !== undefined && typeof "+p+" != 'string') || "),a+=" (","ignore"!=f&&(a+=" ("+p+" && !"+h+" ",m&&(a+=" && self._opts.unknownFormats.indexOf("+p+") == -1 "),a+=") || "),a+=" ("+h+" && "+g+" == '"+t+"' && !(typeof "+h+" == 'function' ? ",a+=e.async?" (async"+s+" ? await "+h+"("+u+") : "+h+"("+u+")) ":" "+h+"("+u+") ",a+=" : "+h+".test("+u+"))))) {"}else{if(!(h=e.formats[i])){if("ignore"==f)return e.logger.warn('unknown format "'+i+'" ignored in schema at path "'+e.errSchemaPath+'"'),c&&(a+=" if (true) { "),a;if(m&&0<=f.indexOf(i))return c&&(a+=" if (true) { "),a;throw new Error('unknown format "'+i+'" is used in schema at path "'+e.errSchemaPath+'"')}var v,y,g=(v="object"==typeof h&&!(h instanceof RegExp)&&h.validate)&&h.type||"string";if(v&&(y=!0===h.async,h=h.validate),g!=t)return c&&(a+=" if (true) { "),a;if(y){if(!e.async)throw new Error("async format in sync schema");a+=" if (!(await "+(P="formats"+e.util.getProperty(i)+".validate")+"("+u+"))) { "}else{a+=" if (! ";var P="formats"+e.util.getProperty(i);v&&(P+=".validate"),a+="function"==typeof h?" "+P+"("+u+") ":" "+P+".test("+u+") ",a+=") { "}}var E=E||[];E.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'format' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { format:  ",a+=d?""+p:""+e.util.toQuotedString(i),a+="  } ",!1!==e.opts.messages&&(a+=" , message: 'should match format \"",a+=d?"' + "+p+" + '":""+e.util.escapeQuotes(i),a+="\"' "),e.opts.verbose&&(a+=" , schema:  ",a+=d?"validate.schema"+n:""+e.util.toQuotedString(i),a+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var w=a,a=E.pop();return a+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+w+"]); ":" validate.errors = ["+w+"]; return false; ":" var err = "+w+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",c&&(a+=" else { "),a}},{}],26:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=e.util.copy(e);d.level++;var p,f,m="valid"+d.level,v=e.schema.then,y=e.schema.else,g=void 0!==v&&(e.opts.strictKeywords?"object"==typeof v&&0<Object.keys(v).length||!1===v:e.util.schemaHasRules(v,e.RULES.all)),P=void 0!==y&&(e.opts.strictKeywords?"object"==typeof y&&0<Object.keys(y).length||!1===y:e.util.schemaHasRules(y,e.RULES.all)),E=d.baseId;return g||P?(d.createErrors=!1,d.schema=o,d.schemaPath=i,d.errSchemaPath=n,t+=" var "+h+" = errors; var "+u+" = true;  ",f=e.compositeRule,e.compositeRule=d.compositeRule=!0,t+="  "+e.validate(d)+" ",d.baseId=E,d.createErrors=!0,t+="  errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; }  ",e.compositeRule=d.compositeRule=f,g?(t+=" if ("+m+") {  ",d.schema=e.schema.then,d.schemaPath=e.schemaPath+".then",d.errSchemaPath=e.errSchemaPath+"/then",t+="  "+e.validate(d)+" ",d.baseId=E,t+=" "+u+" = "+m+"; ",g&&P?t+=" var "+(p="ifClause"+a)+" = 'then'; ":p="'then'",t+=" } ",P&&(t+=" else { ")):t+=" if (!"+m+") { ",P&&(d.schema=e.schema.else,d.schemaPath=e.schemaPath+".else",d.errSchemaPath=e.errSchemaPath+"/else",t+="  "+e.validate(d)+" ",d.baseId=E,t+=" "+u+" = "+m+"; ",g&&P?t+=" var "+(p="ifClause"+a)+" = 'else'; ":p="'else'",t+=" } "),t+=" if (!"+u+") {   var err =   ",!1!==e.createErrors?(t+=" { keyword: 'if' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { failingKeyword: "+p+" } ",!1!==e.opts.messages&&(t+=" , message: 'should match \"' + "+p+" + '\" schema' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&l&&(t+=e.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; "),t+=" }   ",l&&(t+=" else { ")):l&&(t+=" if (true) { "),t}},{}],27:[function(e,r,t){"use strict";r.exports={$ref:e("./ref"),allOf:e("./allOf"),anyOf:e("./anyOf"),$comment:e("./comment"),const:e("./const"),contains:e("./contains"),dependencies:e("./dependencies"),enum:e("./enum"),format:e("./format"),if:e("./if"),items:e("./items"),maximum:e("./_limit"),minimum:e("./_limit"),maxItems:e("./_limitItems"),minItems:e("./_limitItems"),maxLength:e("./_limitLength"),minLength:e("./_limitLength"),maxProperties:e("./_limitProperties"),minProperties:e("./_limitProperties"),multipleOf:e("./multipleOf"),not:e("./not"),oneOf:e("./oneOf"),pattern:e("./pattern"),properties:e("./properties"),propertyNames:e("./propertyNames"),required:e("./required"),uniqueItems:e("./uniqueItems"),validate:e("./validate")}},{"./_limit":13,"./_limitItems":14,"./_limitLength":15,"./_limitProperties":16,"./allOf":17,"./anyOf":18,"./comment":19,"./const":20,"./contains":21,"./dependencies":23,"./enum":24,"./format":25,"./if":26,"./items":28,"./multipleOf":29,"./not":30,"./oneOf":31,"./pattern":32,"./properties":33,"./propertyNames":34,"./ref":35,"./required":36,"./uniqueItems":37,"./validate":38}],28:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=e.util.copy(e),p="";d.level++;var f="valid"+d.level,m="i"+a,v=d.dataLevel=e.dataLevel+1,y="data"+v,g=e.baseId;if(t+="var "+h+" = errors;var "+u+";",Array.isArray(o)){var P,E,w,b=e.schema.additionalItems;!1===b&&(t+=" "+u+" = "+c+".length <= "+o.length+"; ",P=n,n=e.errSchemaPath+"/additionalItems",(E=E||[]).push(t+="  if (!"+u+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'additionalItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+o.length+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have more than "+o.length+" items' "),e.opts.verbose&&(t+=" , schema: false , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",w=t,t=E.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+w+"]); ":" validate.errors = ["+w+"]; return false; ":" var err = "+w+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } ",n=P,l&&(p+="}",t+=" else { "));var S=o;if(S)for(var _=-1,F=S.length-1;_<F;){var x,R,$=S[_+=1];(e.opts.strictKeywords?"object"==typeof $&&0<Object.keys($).length||!1===$:e.util.schemaHasRules($,e.RULES.all))&&(t+=" "+f+" = true; if ("+c+".length > "+_+") { ",x=c+"["+_+"]",d.schema=$,d.schemaPath=i+"["+_+"]",d.errSchemaPath=n+"/"+_,d.errorPath=e.util.getPathExpr(e.errorPath,_,e.opts.jsonPointers,!0),d.dataPathArr[v]=_,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",t+=" }  ",l&&(t+=" if ("+f+") { ",p+="}"))}"object"==typeof b&&(e.opts.strictKeywords?"object"==typeof b&&0<Object.keys(b).length||!1===b:e.util.schemaHasRules(b,e.RULES.all))&&(d.schema=b,d.schemaPath=e.schemaPath+".additionalItems",d.errSchemaPath=e.errSchemaPath+"/additionalItems",t+=" "+f+" = true; if ("+c+".length > "+o.length+") {  for (var "+m+" = "+o.length+"; "+m+" < "+c+".length; "+m+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers,!0),x=c+"["+m+"]",d.dataPathArr[v]=m,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",l&&(t+=" if (!"+f+") break; "),t+=" } }  ",l&&(t+=" if ("+f+") { ",p+="}"))}else{(e.opts.strictKeywords?"object"==typeof o&&0<Object.keys(o).length||!1===o:e.util.schemaHasRules(o,e.RULES.all))&&(d.schema=o,d.schemaPath=i,d.errSchemaPath=n,t+="  for (var "+m+" = 0; "+m+" < "+c+".length; "+m+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers,!0),x=c+"["+m+"]",d.dataPathArr[v]=m,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",l&&(t+=" if (!"+f+") break; "),t+=" }")}return l&&(t+=" "+p+" if ("+h+" == errors) {"),t}},{}],29:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="var division"+a+";if (",u&&(t+=" "+h+" !== undefined && ( typeof "+h+" != 'number' || "),t+=" (division"+a+" = "+c+" / "+h+", ",t+=e.opts.multipleOfPrecision?" Math.abs(Math.round(division"+a+") - division"+a+") > 1e-"+e.opts.multipleOfPrecision+" ":" division"+a+" !== parseInt(division"+a+") ",t+=" ) ",u&&(t+="  )  ");var d=d||[];d.push(t+=" ) {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'multipleOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { multipleOf: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should be multiple of ",t+=u?"' + "+h:h+"'"),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+o,t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var p=t,t=d.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+p+"]); ":" validate.errors = ["+p+"]; return false; ":" var err = "+p+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],30:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e);h.level++;var d,p,f,m,v="valid"+h.level;return(e.opts.strictKeywords?"object"==typeof o&&0<Object.keys(o).length||!1===o:e.util.schemaHasRules(o,e.RULES.all))?(h.schema=o,h.schemaPath=i,h.errSchemaPath=n,t+=" var "+u+" = errors;  ",d=e.compositeRule,e.compositeRule=h.compositeRule=!0,h.createErrors=!1,h.opts.allErrors&&(p=h.opts.allErrors,h.opts.allErrors=!1),t+=" "+e.validate(h)+" ",h.createErrors=!0,p&&(h.opts.allErrors=p),e.compositeRule=h.compositeRule=d,(f=f||[]).push(t+=" if ("+v+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: {} ",!1!==e.opts.messages&&(t+=" , message: 'should NOT be valid' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",m=t,t=f.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+m+"]); ":" validate.errors = ["+m+"]; return false; ":" var err = "+m+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } else {  errors = "+u+"; if (vErrors !== null) { if ("+u+") vErrors.length = "+u+"; else vErrors = null; } ",e.opts.allErrors&&(t+=" } ")):(t+="  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: {} ",!1!==e.opts.messages&&(t+=" , message: 'should NOT be valid' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l&&(t+=" if (false) { ")),t}},{}],31:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=e.util.copy(e),p="";d.level++;var f="valid"+d.level,m=d.baseId,v="prevValid"+a,y="passingSchemas"+a;t+="var "+h+" = errors , "+v+" = false , "+u+" = false , "+y+" = null; ";var g=e.compositeRule;e.compositeRule=d.compositeRule=!0;var P=o;if(P)for(var E,w=-1,b=P.length-1;w<b;)E=P[w+=1],(e.opts.strictKeywords?"object"==typeof E&&0<Object.keys(E).length||!1===E:e.util.schemaHasRules(E,e.RULES.all))?(d.schema=E,d.schemaPath=i+"["+w+"]",d.errSchemaPath=n+"/"+w,t+="  "+e.validate(d)+" ",d.baseId=m):t+=" var "+f+" = true; ",w&&(t+=" if ("+f+" && "+v+") { "+u+" = false; "+y+" = ["+y+", "+w+"]; } else { ",p+="}"),t+=" if ("+f+") { "+u+" = "+v+" = true; "+y+" = "+w+"; }";return e.compositeRule=d.compositeRule=g,t+=p+"if (!"+u+") {   var err =   ",!1!==e.createErrors?(t+=" { keyword: 'oneOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { passingSchemas: "+y+" } ",!1!==e.opts.messages&&(t+=" , message: 'should match exactly one schema in oneOf' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&l&&(t+=e.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; "),t+="} else {  errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; }",e.opts.allErrors&&(t+=" } "),t}},{}],32:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o,d=u?"(new RegExp("+h+"))":e.usePattern(o);t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'string') || ");var p=p||[];p.push(t+=" !"+d+".test("+c+") ) {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'pattern' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { pattern:  ",t+=u?""+h:""+e.util.toQuotedString(o),t+="  } ",!1!==e.opts.messages&&(t+=" , message: 'should match pattern \"",t+=u?"' + "+h+" + '":""+e.util.escapeQuotes(o),t+="\"' "),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+e.util.toQuotedString(o),t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],33:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e),d="";h.level++;var p,f,m,v="valid"+h.level,y="key"+a,g="idx"+a,P=h.dataLevel=e.dataLevel+1,E="data"+P,w="dataProperties"+a,b=Object.keys(o||{}).filter(k),S=e.schema.patternProperties||{},_=Object.keys(S).filter(k),F=e.schema.additionalProperties,x=b.length||_.length,R=!1===F,$="object"==typeof F&&Object.keys(F).length,j=e.opts.removeAdditional,D=R||$||j,O=e.opts.ownProperties,I=e.baseId,A=e.schema.required;function k(e){return"__proto__"!==e}if(A&&(!e.opts.$data||!A.$data)&&A.length<e.opts.loopRequired&&(p=e.util.toHash(A)),t+="var "+u+" = errors;var "+v+" = true;",O&&(t+=" var "+w+" = undefined;"),D){if(t+=O?" "+w+" = "+w+" || Object.keys("+c+"); for (var "+g+"=0; "+g+"<"+w+".length; "+g+"++) { var "+y+" = "+w+"["+g+"]; ":" for (var "+y+" in "+c+") { ",x){if(t+=" var isAdditional"+a+" = !(false ",b.length)if(8<b.length)t+=" || validate.schema"+i+".hasOwnProperty("+y+") ";else{var C=b;if(C)for(var L=-1,N=C.length-1;L<N;)U=C[L+=1],t+=" || "+y+" == "+e.util.toQuotedString(U)+" "}if(_.length){var q=_;if(q)for(var z=-1,T=q.length-1;z<T;)te=q[z+=1],t+=" || "+e.usePattern(te)+".test("+y+") "}t+=" ); if (isAdditional"+a+") { "}"all"==j?t+=" delete "+c+"["+y+"]; ":(Z=e.errorPath,f="' + "+y+" + '",e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers)),R?j?t+=" delete "+c+"["+y+"]; ":(G=n,n=e.errSchemaPath+"/additionalProperties",(W=W||[]).push(t+=" "+v+" = false; "),t="",!1!==e.createErrors?(t+=" { keyword: 'additionalProperties' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { additionalProperty: '"+f+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is an invalid additional property":"should NOT have additional properties",t+="' "),e.opts.verbose&&(t+=" , schema: false , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",X=t,t=W.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+X+"]); ":" validate.errors = ["+X+"]; return false; ":" var err = "+X+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n=G,l&&(t+=" break; ")):$&&("failing"==j?(t+=" var "+u+" = errors;  ",m=e.compositeRule,e.compositeRule=h.compositeRule=!0,h.schema=F,h.schemaPath=e.schemaPath+".additionalProperties",h.errSchemaPath=e.errSchemaPath+"/additionalProperties",h.errorPath=e.opts._errorDataPathProperty?e.errorPath:e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers),oe=c+"["+y+"]",h.dataPathArr[P]=y,ie=e.validate(h),h.baseId=I,e.util.varOccurences(ie,E)<2?t+=" "+e.util.varReplace(ie,E,oe)+" ":t+=" var "+E+" = "+oe+"; "+ie+" ",t+=" if (!"+v+") { errors = "+u+"; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete "+c+"["+y+"]; }  ",e.compositeRule=h.compositeRule=m):(h.schema=F,h.schemaPath=e.schemaPath+".additionalProperties",h.errSchemaPath=e.errSchemaPath+"/additionalProperties",h.errorPath=e.opts._errorDataPathProperty?e.errorPath:e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers),oe=c+"["+y+"]",h.dataPathArr[P]=y,ie=e.validate(h),h.baseId=I,e.util.varOccurences(ie,E)<2?t+=" "+e.util.varReplace(ie,E,oe)+" ":t+=" var "+E+" = "+oe+"; "+ie+" ",l&&(t+=" if (!"+v+") break; "))),e.errorPath=Z),x&&(t+=" } "),t+=" }  ",l&&(t+=" if ("+v+") { ",d+="}")}var Q=e.opts.useDefaults&&!e.compositeRule;if(b.length){var V=b;if(V)for(var U,H=-1,K=V.length-1;H<K;){var M,B,J,Z,G,Y,W,X,ee=o[U=V[H+=1]];(e.opts.strictKeywords?"object"==typeof ee&&0<Object.keys(ee).length||!1===ee:e.util.schemaHasRules(ee,e.RULES.all))&&(oe=c+(M=e.util.getProperty(U)),B=Q&&void 0!==ee.default,h.schema=ee,h.schemaPath=i+M,h.errSchemaPath=n+"/"+e.util.escapeFragment(U),h.errorPath=e.util.getPath(e.errorPath,U,e.opts.jsonPointers),h.dataPathArr[P]=e.util.toQuotedString(U),ie=e.validate(h),h.baseId=I,e.util.varOccurences(ie,E)<2?(ie=e.util.varReplace(ie,E,oe),J=oe):t+=" var "+(J=E)+" = "+oe+"; ",B?t+=" "+ie+" ":(p&&p[U]?(t+=" if ( "+J+" === undefined ",O&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(U)+"') "),t+=") { "+v+" = false; ",Z=e.errorPath,G=n,Y=e.util.escapeQuotes(U),e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(Z,U,e.opts.jsonPointers)),n=e.errSchemaPath+"/required",(W=W||[]).push(t),t="",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+Y+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+Y+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",X=t,t=W.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+X+"]); ":" validate.errors = ["+X+"]; return false; ":" var err = "+X+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n=G,e.errorPath=Z,t+=" } else { "):l?(t+=" if ( "+J+" === undefined ",O&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(U)+"') "),t+=") { "+v+" = true; } else { "):(t+=" if ("+J+" !== undefined ",O&&(t+=" &&   Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(U)+"') "),t+=" ) { "),t+=" "+ie+" } ")),l&&(t+=" if ("+v+") { ",d+="}")}}if(_.length){var re=_;if(re)for(var te,ae=-1,se=re.length-1;ae<se;){var oe,ie,ee=S[te=re[ae+=1]];(e.opts.strictKeywords?"object"==typeof ee&&0<Object.keys(ee).length||!1===ee:e.util.schemaHasRules(ee,e.RULES.all))&&(h.schema=ee,h.schemaPath=e.schemaPath+".patternProperties"+e.util.getProperty(te),h.errSchemaPath=e.errSchemaPath+"/patternProperties/"+e.util.escapeFragment(te),t+=O?" "+w+" = "+w+" || Object.keys("+c+"); for (var "+g+"=0; "+g+"<"+w+".length; "+g+"++) { var "+y+" = "+w+"["+g+"]; ":" for (var "+y+" in "+c+") { ",t+=" if ("+e.usePattern(te)+".test("+y+")) { ",h.errorPath=e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers),oe=c+"["+y+"]",h.dataPathArr[P]=y,ie=e.validate(h),h.baseId=I,e.util.varOccurences(ie,E)<2?t+=" "+e.util.varReplace(ie,E,oe)+" ":t+=" var "+E+" = "+oe+"; "+ie+" ",l&&(t+=" if (!"+v+") break; "),t+=" } ",l&&(t+=" else "+v+" = true; "),t+=" }  ",l&&(t+=" if ("+v+") { ",d+="}"))}}return l&&(t+=" "+d+" if ("+u+" == errors) {"),t}},{}],34:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e);h.level++;var d,p,f,m,v,y,g,P,E,w,b,S="valid"+h.level;return t+="var "+u+" = errors;",(e.opts.strictKeywords?"object"==typeof o&&0<Object.keys(o).length||!1===o:e.util.schemaHasRules(o,e.RULES.all))&&(h.schema=o,h.schemaPath=i,h.errSchemaPath=n,p="idx"+a,f="i"+a,m="' + "+(d="key"+a)+" + '",v="data"+(h.dataLevel=e.dataLevel+1),y="dataProperties"+a,P=e.baseId,(g=e.opts.ownProperties)&&(t+=" var "+y+" = undefined; "),t+=g?" "+y+" = "+y+" || Object.keys("+c+"); for (var "+p+"=0; "+p+"<"+y+".length; "+p+"++) { var "+d+" = "+y+"["+p+"]; ":" for (var "+d+" in "+c+") { ",t+=" var startErrs"+a+" = errors; ",E=d,w=e.compositeRule,e.compositeRule=h.compositeRule=!0,b=e.validate(h),h.baseId=P,e.util.varOccurences(b,v)<2?t+=" "+e.util.varReplace(b,v,E)+" ":t+=" var "+v+" = "+E+"; "+b+" ",e.compositeRule=h.compositeRule=w,t+=" if (!"+S+") { for (var "+f+"=startErrs"+a+"; "+f+"<errors; "+f+"++) { vErrors["+f+"].propertyName = "+d+"; }   var err =   ",!1!==e.createErrors?(t+=" { keyword: 'propertyNames' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { propertyName: '"+m+"' } ",!1!==e.opts.messages&&(t+=" , message: 'property name \\'"+m+"\\' is invalid' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&l&&(t+=e.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; "),l&&(t+=" break; "),t+=" } }"),l&&(t+="  if ("+u+" == errors) {"),t}},{}],35:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a,s=" ",o=e.dataLevel,i=e.schema[r],n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(o||""),u="valid"+e.level;if("#"==i||"#/"==i)a=e.isRoot?(t=e.async,"validate"):(t=!0===e.root.schema.$async,"root.refVal[0]");else{var h,d,p=e.resolveRef(e.baseId,i,e.isRoot);if(void 0===p){var f,m=e.MissingRefError.message(e.baseId,i);if("fail"==e.opts.missingRefs){e.logger.error(m),(f=f||[]).push(s),s="",!1!==e.createErrors?(s+=" { keyword: '$ref' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { ref: '"+e.util.escapeQuotes(i)+"' } ",!1!==e.opts.messages&&(s+=" , message: 'can\\'t resolve reference "+e.util.escapeQuotes(i)+"' "),e.opts.verbose&&(s+=" , schema: "+e.util.toQuotedString(i)+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),s+=" } "):s+=" {} ";var v=s,s=f.pop();s+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+v+"]); ":" validate.errors = ["+v+"]; return false; ":" var err = "+v+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l&&(s+=" if (false) { ")}else{if("ignore"!=e.opts.missingRefs)throw new e.MissingRefError(e.baseId,i,m);e.logger.warn(m),l&&(s+=" if (true) { ")}}else{p.inline?((h=e.util.copy(e)).level++,d="valid"+h.level,h.schema=p.schema,h.schemaPath="",h.errSchemaPath=i,s+=" "+e.validate(h).replace(/validate\.schema/g,p.code)+" ",l&&(s+=" if ("+d+") { ")):(t=!0===p.$async||e.async&&!1!==p.$async,a=p.code)}}if(a){(f=f||[]).push(s),s="",s+=e.opts.passContext?" "+a+".call(this, ":" "+a+"( ",s+=" "+c+", (dataPath || '')",'""'!=e.errorPath&&(s+=" + "+e.errorPath);var y=s+=" , "+(o?"data"+(o-1||""):"parentData")+" , "+(o?e.dataPathArr[o]:"parentDataProperty")+", rootData)  ";if(s=f.pop(),t){if(!e.async)throw new Error("async schema referenced by sync schema");l&&(s+=" var "+u+"; "),s+=" try { await "+y+"; ",l&&(s+=" "+u+" = true; "),s+=" } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ",l&&(s+=" "+u+" = false; "),s+=" } ",l&&(s+=" if ("+u+") { ")}else s+=" if (!"+y+") { if (vErrors === null) vErrors = "+a+".errors; else vErrors = vErrors.concat("+a+".errors); errors = vErrors.length; } ",l&&(s+=" else { ")}return s}},{}],36:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h=e.opts.$data&&o&&o.$data,d=(h&&(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; "),"schema"+a);if(!h)if(o.length<e.opts.loopRequired&&e.schema.properties&&Object.keys(e.schema.properties).length){var p=[],f=o;if(f)for(var m,v=-1,y=f.length-1;v<y;){m=f[v+=1];var g=e.schema.properties[m];g&&(e.opts.strictKeywords?"object"==typeof g&&0<Object.keys(g).length||!1===g:e.util.schemaHasRules(g,e.RULES.all))||(p[p.length]=m)}}else p=o;if(h||p.length){var P=e.errorPath,E=h||e.opts.loopRequired<=p.length,w=e.opts.ownProperties;if(l)if(t+=" var missing"+a+"; ",E){h||(t+=" var "+d+" = validate.schema"+i+"; ");var b="' + "+($="schema"+a+"["+(F="i"+a)+"]")+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(P,$,e.opts.jsonPointers)),t+=" var "+u+" = true; ",h&&(t+=" if (schema"+a+" === undefined) "+u+" = true; else if (!Array.isArray(schema"+a+")) "+u+" = false; else {"),t+=" for (var "+F+" = 0; "+F+" < "+d+".length; "+F+"++) { "+u+" = "+c+"["+d+"["+F+"]] !== undefined ",w&&(t+=" &&   Object.prototype.hasOwnProperty.call("+c+", "+d+"["+F+"]) "),t+="; if (!"+u+") break; } ",h&&(t+="  }  "),(R=R||[]).push(t+="  if (!"+u+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var S=t,t=R.pop();t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+S+"]); ":" validate.errors = ["+S+"]; return false; ":" var err = "+S+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } else { "}else{t+=" if ( ";var _=p;if(_)for(var F=-1,x=_.length-1;F<x;){D=_[F+=1],F&&(t+=" || "),t+=" ( ( "+(k=c+(A=e.util.getProperty(D)))+" === undefined ",w&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(D)+"') "),t+=") && (missing"+a+" = "+e.util.toQuotedString(e.opts.jsonPointers?D:A)+") ) "}t+=") {  ";var R,b="' + "+($="missing"+a)+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.opts.jsonPointers?e.util.getPathExpr(P,$,!0):P+" + "+$),(R=R||[]).push(t),t="",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";S=t;t=R.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+S+"]); ":" validate.errors = ["+S+"]; return false; ":" var err = "+S+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } else { "}else if(E){h||(t+=" var "+d+" = validate.schema"+i+"; ");var $,b="' + "+($="schema"+a+"["+(F="i"+a)+"]")+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(P,$,e.opts.jsonPointers)),h&&(t+=" if ("+d+" && !Array.isArray("+d+")) {  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if ("+d+" !== undefined) { "),t+=" for (var "+F+" = 0; "+F+" < "+d+".length; "+F+"++) { if ("+c+"["+d+"["+F+"]] === undefined ",w&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", "+d+"["+F+"]) "),t+=") {  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ",h&&(t+="  }  ")}else{var j=p;if(j)for(var D,O=-1,I=j.length-1;O<I;){D=j[O+=1];var A=e.util.getProperty(D),b=e.util.escapeQuotes(D),k=c+A;e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(P,D,e.opts.jsonPointers)),t+=" if ( "+k+" === undefined ",w&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(D)+"') "),t+=") {  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } "}}e.errorPath=P}else l&&(t+=" if (true) {");return t}},{}],37:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a,s,o,i=" ",n=e.level,l=e.dataLevel,c=e.schema[r],u=e.schemaPath+e.util.getProperty(r),h=e.errSchemaPath+"/"+r,d=!e.opts.allErrors,p="data"+(l||""),f="valid"+n,m=e.opts.$data&&c&&c.$data,v=m?(i+=" var schema"+n+" = "+e.util.getData(c.$data,l,e.dataPathArr)+"; ","schema"+n):c;return(c||m)&&!1!==e.opts.uniqueItems?(m&&(i+=" var "+f+"; if ("+v+" === false || "+v+" === undefined) "+f+" = true; else if (typeof "+v+" != 'boolean') "+f+" = false; else { "),i+=" var i = "+p+".length , "+f+" = true , j; if (i > 1) { ",t=e.schema.items&&e.schema.items.type,a=Array.isArray(t),!t||"object"==t||"array"==t||a&&(0<=t.indexOf("object")||0<=t.indexOf("array"))?i+=" outer: for (;i--;) { for (j = i; j--;) { if (equal("+p+"[i], "+p+"[j])) { "+f+" = false; break outer; } } } ":(i+=" var itemIndices = {}, item; for (;i--;) { var item = "+p+"[i]; ",i+=" if ("+e.util["checkDataType"+(a?"s":"")](t,"item",e.opts.strictNumbers,!0)+") continue; ",a&&(i+=" if (typeof item == 'string') item = '\"' + item; "),i+=" if (typeof itemIndices[item] == 'number') { "+f+" = false; j = itemIndices[item]; break; } itemIndices[item] = i; } "),i+=" } ",m&&(i+="  }  "),(s=s||[]).push(i+=" if (!"+f+") {   "),i="",!1!==e.createErrors?(i+=" { keyword: 'uniqueItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(h)+" , params: { i: i, j: j } ",!1!==e.opts.messages&&(i+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(i+=" , schema:  ",i+=m?"validate.schema"+u:""+c,i+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),i+=" } "):i+=" {} ",o=i,i=s.pop(),i+=!e.compositeRule&&d?e.async?" throw new ValidationError(["+o+"]); ":" validate.errors = ["+o+"]; return false; ":" var err = "+o+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",i+=" } ",d&&(i+=" else { ")):d&&(i+=" if (true) { "),i}},{}],38:[function(e,r,t){"use strict";r.exports=function(a,e){var r="",t=!0===a.schema.$async,s=a.util.schemaHasRulesExcept(a.schema,a.RULES.all,"$ref"),o=a.self._getId(a.schema);if(a.opts.strictKeywords){var i=a.util.schemaUnknownRules(a.schema,a.RULES.keywords);if(i){var n="unknown keyword: "+i;if("log"!==a.opts.strictKeywords)throw new Error(n);a.logger.warn(n)}}if(a.isTop&&(r+=" var validate = ",t&&(a.async=!0,r+="async "),r+="function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict'; ",o&&(a.opts.sourceCode||a.opts.processCode)&&(r+=" /*# sourceURL="+o+" */ ")),"boolean"==typeof a.schema||!s&&!a.schema.$ref){var l=a.level,c=a.dataLevel,u=a.schema[e="false schema"],h=a.schemaPath+a.util.getProperty(e),d=a.errSchemaPath+"/"+e,p=!a.opts.allErrors,f="data"+(c||""),m="valid"+l;return!1===a.schema?(a.isTop?p=!0:r+=" var "+m+" = false; ",(U=U||[]).push(r),r="",!1!==a.createErrors?(r+=" { keyword: 'false schema' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: {} ",!1!==a.opts.messages&&(r+=" , message: 'boolean schema is false' "),a.opts.verbose&&(r+=" , schema: false , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ",D=r,r=U.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+D+"]); ":" validate.errors = ["+D+"]; return false; ":" var err = "+D+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "):r+=a.isTop?t?" return data; ":" validate.errors = null; return true; ":" var "+m+" = true; ",a.isTop&&(r+=" }; return validate; "),r}if(a.isTop){var v=a.isTop,l=a.level=0,c=a.dataLevel=0,f="data";if(a.rootId=a.resolve.fullPath(a.self._getId(a.root.schema)),a.baseId=a.baseId||a.rootId,delete a.isTop,a.dataPathArr=[""],void 0!==a.schema.default&&a.opts.useDefaults&&a.opts.strictDefaults){var y="default is ignored in the schema root";if("log"!==a.opts.strictDefaults)throw new Error(y);a.logger.warn(y)}r+=" var vErrors = null; ",r+=" var errors = 0;     ",r+=" if (rootData === undefined) rootData = data; "}else{l=a.level,f="data"+((c=a.dataLevel)||"");if(o&&(a.baseId=a.resolve.url(a.baseId,o)),t&&!a.async)throw new Error("async schema in sync schema");r+=" var errs_"+l+" = errors;"}var g,m="valid"+l,p=!a.opts.allErrors,P="",E="",w=a.schema.type,b=Array.isArray(w);if(w&&a.opts.nullable&&!0===a.schema.nullable&&(b?-1==w.indexOf("null")&&(w=w.concat("null")):"null"!=w&&(w=[w,"null"],b=!0)),b&&1==w.length&&(w=w[0],b=!1),a.schema.$ref&&s){if("fail"==a.opts.extendRefs)throw new Error('$ref: validation keywords used in schema at path "'+a.errSchemaPath+'" (see option extendRefs)');!0!==a.opts.extendRefs&&(s=!1,a.logger.warn('$ref: keywords ignored in schema at path "'+a.errSchemaPath+'"'))}if(a.schema.$comment&&a.opts.$comment&&(r+=" "+a.RULES.all.$comment.code(a,"$comment")),w){a.opts.coerceTypes&&(g=a.util.coerceToTypes(a.opts.coerceTypes,w));var S=a.RULES.types[w];if(g||b||!0===S||S&&!Z(S)){h=a.schemaPath+".type",d=a.errSchemaPath+"/type",h=a.schemaPath+".type",d=a.errSchemaPath+"/type";if(r+=" if ("+a.util[b?"checkDataTypes":"checkDataType"](w,f,a.opts.strictNumbers,!0)+") { ",g){var _="dataType"+l,F="coerced"+l;r+=" var "+_+" = typeof "+f+"; var "+F+" = undefined; ","array"==a.opts.coerceTypes&&(r+=" if ("+_+" == 'object' && Array.isArray("+f+") && "+f+".length == 1) { "+f+" = "+f+"[0]; "+_+" = typeof "+f+"; if ("+a.util.checkDataType(a.schema.type,f,a.opts.strictNumbers)+") "+F+" = "+f+"; } "),r+=" if ("+F+" !== undefined) ; ";var x=g;if(x)for(var R,$=-1,j=x.length-1;$<j;)"string"==(R=x[$+=1])?r+=" else if ("+_+" == 'number' || "+_+" == 'boolean') "+F+" = '' + "+f+"; else if ("+f+" === null) "+F+" = ''; ":"number"==R||"integer"==R?(r+=" else if ("+_+" == 'boolean' || "+f+" === null || ("+_+" == 'string' && "+f+" && "+f+" == +"+f+" ","integer"==R&&(r+=" && !("+f+" % 1)"),r+=")) "+F+" = +"+f+"; "):"boolean"==R?r+=" else if ("+f+" === 'false' || "+f+" === 0 || "+f+" === null) "+F+" = false; else if ("+f+" === 'true' || "+f+" === 1) "+F+" = true; ":"null"==R?r+=" else if ("+f+" === '' || "+f+" === 0 || "+f+" === false) "+F+" = null; ":"array"==a.opts.coerceTypes&&"array"==R&&(r+=" else if ("+_+" == 'string' || "+_+" == 'number' || "+_+" == 'boolean' || "+f+" == null) "+F+" = ["+f+"]; ");(U=U||[]).push(r+=" else {   "),r="",!1!==a.createErrors?(r+=" { keyword: 'type' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: { type: '",r+=b?""+w.join(","):""+w,r+="' } ",!1!==a.opts.messages&&(r+=" , message: 'should be ",r+=b?""+w.join(","):""+w,r+="' "),a.opts.verbose&&(r+=" , schema: validate.schema"+h+" , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ";var D=r;r=U.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+D+"]); ":" validate.errors = ["+D+"]; return false; ":" var err = "+D+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",r+=" } if ("+F+" !== undefined) {  ";var O=c?"data"+(c-1||""):"parentData";r+=" "+f+" = "+F+"; ",c||(r+="if ("+O+" !== undefined)"),r+=" "+O+"["+(c?a.dataPathArr[c]:"parentDataProperty")+"] = "+F+"; } "}else{(U=U||[]).push(r),r="",!1!==a.createErrors?(r+=" { keyword: 'type' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: { type: '",r+=b?""+w.join(","):""+w,r+="' } ",!1!==a.opts.messages&&(r+=" , message: 'should be ",r+=b?""+w.join(","):""+w,r+="' "),a.opts.verbose&&(r+=" , schema: validate.schema"+h+" , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ";D=r;r=U.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+D+"]); ":" validate.errors = ["+D+"]; return false; ":" var err = "+D+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "}r+=" } "}}if(a.schema.$ref&&!s)r+=" "+a.RULES.all.$ref.code(a,"$ref")+" ",p&&(r+=" } if (errors === ",r+=v?"0":"errs_"+l,r+=") { ",E+="}");else{var I=a.RULES;if(I)for(var A=-1,k=I.length-1;A<k;)if(Z(S=I[A+=1])){if(S.type&&(r+=" if ("+a.util.checkDataType(S.type,f,a.opts.strictNumbers)+") { "),a.opts.useDefaults)if("object"==S.type&&a.schema.properties){var u=a.schema.properties,C=Object.keys(u);if(C)for(var L,N=-1,q=C.length-1;N<q;){if(void 0!==(Q=u[L=C[N+=1]]).default){var z=f+a.util.getProperty(L);if(a.compositeRule){if(a.opts.strictDefaults){y="default is ignored for: "+z;if("log"!==a.opts.strictDefaults)throw new Error(y);a.logger.warn(y)}}else r+=" if ("+z+" === undefined ","empty"==a.opts.useDefaults&&(r+=" || "+z+" === null || "+z+" === '' "),r+=" ) "+z+" = ",r+="shared"==a.opts.useDefaults?" "+a.useDefault(Q.default)+" ":" "+JSON.stringify(Q.default)+" ",r+="; "}}}else if("array"==S.type&&Array.isArray(a.schema.items)){var T=a.schema.items;if(T)for(var Q,$=-1,V=T.length-1;$<V;)if(void 0!==(Q=T[$+=1]).default){z=f+"["+$+"]";if(a.compositeRule){if(a.opts.strictDefaults){y="default is ignored for: "+z;if("log"!==a.opts.strictDefaults)throw new Error(y);a.logger.warn(y)}}else r+=" if ("+z+" === undefined ","empty"==a.opts.useDefaults&&(r+=" || "+z+" === null || "+z+" === '' "),r+=" ) "+z+" = ",r+="shared"==a.opts.useDefaults?" "+a.useDefault(Q.default)+" ":" "+JSON.stringify(Q.default)+" ",r+="; "}}var U,H=S.rules;if(H)for(var K,M,B=-1,J=H.length-1;B<J;){!G(M=H[B+=1])||(K=M.code(a,M.keyword,S.type))&&(r+=" "+K+" ",p&&(P+="}"))}p&&(r+=" "+P+" ",P=""),S.type&&(r+=" } ",w&&w===S.type&&!g&&(h=a.schemaPath+".type",d=a.errSchemaPath+"/type",(U=U||[]).push(r+=" else { "),r="",!1!==a.createErrors?(r+=" { keyword: 'type' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: { type: '",r+=b?""+w.join(","):""+w,r+="' } ",!1!==a.opts.messages&&(r+=" , message: 'should be ",r+=b?""+w.join(","):""+w,r+="' "),a.opts.verbose&&(r+=" , schema: validate.schema"+h+" , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ",D=r,r=U.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+D+"]); ":" validate.errors = ["+D+"]; return false; ":" var err = "+D+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",r+=" } ")),p&&(r+=" if (errors === ",r+=v?"0":"errs_"+l,r+=") { ",E+="}")}}function Z(e){for(var r=e.rules,t=0;t<r.length;t++)if(G(r[t]))return 1}function G(e){return void 0!==a.schema[e.keyword]||e.implements&&function(e){for(var r=e.implements,t=0;t<r.length;t++)if(void 0!==a.schema[r[t]])return 1}(e)}return p&&(r+=" "+E+" "),v?(t?(r+=" if (errors === 0) return data;           ",r+=" else throw new ValidationError(vErrors); "):(r+=" validate.errors = vErrors; ",r+=" return errors === 0;       "),r+=" }; return validate;"):r+=" var "+m+" = errors === errs_"+l+";",r}},{}],39:[function(e,r,t){"use strict";var i=/^[a-z_$][a-z0-9_$-]*$/i,l=e("./dotjs/custom"),a=e("./definition_schema");function s(e,r){s.errors=null;var t=this._validateKeyword=this._validateKeyword||this.compile(a,!0);if(t(e))return!0;if(s.errors=t.errors,r)throw new Error("custom keyword definition is invalid: "+this.errorsText(t.errors));return!1}r.exports={add:function(e,r){var n=this.RULES;if(n.keywords[e])throw new Error("Keyword "+e+" is already defined");if(!i.test(e))throw new Error("Keyword "+e+" is not a valid identifier");if(r){this.validateKeyword(r,!0);var t=r.type;if(Array.isArray(t))for(var a=0;a<t.length;a++)o(e,t[a],r);else o(e,t,r);var s=r.metaSchema;s&&(r.$data&&this._opts.$data&&(s={anyOf:[s,{$ref:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"}]}),r.validateSchema=this.compile(s,!0))}function o(e,r,t){for(var a,s=0;s<n.length;s++){var o=n[s];if(o.type==r){a=o;break}}a||n.push(a={type:r,rules:[]});var i={keyword:e,definition:t,custom:!0,code:l,implements:t.implements};a.rules.push(i),n.custom[e]=i}return n.keywords[e]=n.all[e]=!0,this},get:function(e){var r=this.RULES.custom[e];return r?r.definition:this.RULES.keywords[e]||!1},remove:function(e){var r=this.RULES;delete r.keywords[e],delete r.all[e],delete r.custom[e];for(var t=0;t<r.length;t++)for(var a=r[t].rules,s=0;s<a.length;s++)if(a[s].keyword==e){a.splice(s,1);break}return this},validate:s}},{"./definition_schema":12,"./dotjs/custom":22}],40:[function(e,r,t){r.exports={$schema:"http://json-schema.org/draft-07/schema#",$id:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",description:"Meta-schema for $data reference (JSON Schema extension proposal)",type:"object",required:["$data"],properties:{$data:{type:"string",anyOf:[{format:"relative-json-pointer"},{format:"json-pointer"}]}},additionalProperties:!1}},{}],41:[function(e,r,t){r.exports={$schema:"http://json-schema.org/draft-07/schema#",$id:"http://json-schema.org/draft-07/schema#",title:"Core schema meta-schema",definitions:{schemaArray:{type:"array",minItems:1,items:{$ref:"#"}},nonNegativeInteger:{type:"integer",minimum:0},nonNegativeIntegerDefault0:{allOf:[{$ref:"#/definitions/nonNegativeInteger"},{default:0}]},simpleTypes:{enum:["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},uniqueItems:!0,default:[]}},type:["object","boolean"],properties:{$id:{type:"string",format:"uri-reference"},$schema:{type:"string",format:"uri"},$ref:{type:"string",format:"uri-reference"},$comment:{type:"string"},title:{type:"string"},description:{type:"string"},default:!0,readOnly:{type:"boolean",default:!1},examples:{type:"array",items:!0},multipleOf:{type:"number",exclusiveMinimum:0},maximum:{type:"number"},exclusiveMaximum:{type:"number"},minimum:{type:"number"},exclusiveMinimum:{type:"number"},maxLength:{$ref:"#/definitions/nonNegativeInteger"},minLength:{$ref:"#/definitions/nonNegativeIntegerDefault0"},pattern:{type:"string",format:"regex"},additionalItems:{$ref:"#"},items:{anyOf:[{$ref:"#"},{$ref:"#/definitions/schemaArray"}],default:!0},maxItems:{$ref:"#/definitions/nonNegativeInteger"},minItems:{$ref:"#/definitions/nonNegativeIntegerDefault0"},uniqueItems:{type:"boolean",default:!1},contains:{$ref:"#"},maxProperties:{$ref:"#/definitions/nonNegativeInteger"},minProperties:{$ref:"#/definitions/nonNegativeIntegerDefault0"},required:{$ref:"#/definitions/stringArray"},additionalProperties:{$ref:"#"},definitions:{type:"object",additionalProperties:{$ref:"#"},default:{}},properties:{type:"object",additionalProperties:{$ref:"#"},default:{}},patternProperties:{type:"object",additionalProperties:{$ref:"#"},propertyNames:{format:"regex"},default:{}},dependencies:{type:"object",additionalProperties:{anyOf:[{$ref:"#"},{$ref:"#/definitions/stringArray"}]}},propertyNames:{$ref:"#"},const:!0,enum:{type:"array",items:!0,minItems:1,uniqueItems:!0},type:{anyOf:[{$ref:"#/definitions/simpleTypes"},{type:"array",items:{$ref:"#/definitions/simpleTypes"},minItems:1,uniqueItems:!0}]},format:{type:"string"},contentMediaType:{type:"string"},contentEncoding:{type:"string"},if:{$ref:"#"},then:{$ref:"#"},else:{$ref:"#"},allOf:{$ref:"#/definitions/schemaArray"},anyOf:{$ref:"#/definitions/schemaArray"},oneOf:{$ref:"#/definitions/schemaArray"},not:{$ref:"#"}},default:!0}},{}],42:[function(e,r,t){"use strict";r.exports=function e(r,t){if(r===t)return!0;if(r&&t&&"object"==typeof r&&"object"==typeof t){if(r.constructor!==t.constructor)return!1;var a,s,o;if(Array.isArray(r)){if((a=r.length)!=t.length)return!1;for(s=a;0!=s--;)if(!e(r[s],t[s]))return!1;return!0}if(r.constructor===RegExp)return r.source===t.source&&r.flags===t.flags;if(r.valueOf!==Object.prototype.valueOf)return r.valueOf()===t.valueOf();if(r.toString!==Object.prototype.toString)return r.toString()===t.toString();if((a=(o=Object.keys(r)).length)!==Object.keys(t).length)return!1;for(s=a;0!=s--;)if(!Object.prototype.hasOwnProperty.call(t,o[s]))return!1;for(s=a;0!=s--;){var i=o[s];if(!e(r[i],t[i]))return!1}return!0}return r!=r&&t!=t}},{}],43:[function(e,r,t){"use strict";r.exports=function(e,r){"function"==typeof(r=r||{})&&(r={cmp:r});var a,l="boolean"==typeof r.cycles&&r.cycles,c=r.cmp&&(a=r.cmp,function(t){return function(e,r){return a({key:e,value:t[e]},{key:r,value:t[r]})}}),u=[];return function e(r){if(r&&r.toJSON&&"function"==typeof r.toJSON&&(r=r.toJSON()),void 0!==r){if("number"==typeof r)return isFinite(r)?""+r:"null";if("object"!=typeof r)return JSON.stringify(r);if(Array.isArray(r)){for(s="[",o=0;o<r.length;o++)o&&(s+=","),s+=e(r[o])||"null";return s+"]"}if(null===r)return"null";if(-1!==u.indexOf(r)){if(l)return JSON.stringify("__cycle__");throw new TypeError("Converting circular structure to JSON")}for(var t=u.push(r)-1,a=Object.keys(r).sort(c&&c(r)),s="",o=0;o<a.length;o++){var i=a[o],n=e(r[i]);n&&(s&&(s+=","),s+=JSON.stringify(i)+":"+n)}return u.splice(t,1),"{"+s+"}"}}(e)}},{}],44:[function(e,r,t){"use strict";var m=r.exports=function(e,r,t){"function"==typeof r&&(t=r,r={}),function e(r,t,a,s,o,i,n,l,c,u){if(s&&"object"==typeof s&&!Array.isArray(s)){for(var h in t(s,o,i,n,l,c,u),s){var d=s[h];if(Array.isArray(d)){if(h in m.arrayKeywords)for(var p=0;p<d.length;p++)e(r,t,a,d[p],o+"/"+h+"/"+p,i,o,h,s,p)}else if(h in m.propsKeywords){if(d&&"object"==typeof d)for(var f in d)e(r,t,a,d[f],o+"/"+h+"/"+f.replace(/~/g,"~0").replace(/\//g,"~1"),i,o,h,s,f)}else(h in m.keywords||r.allKeys&&!(h in m.skipKeywords))&&e(r,t,a,d,o+"/"+h,i,o,h,s)}a(s,o,i,n,l,c,u)}}(r,"function"==typeof(t=r.cb||t)?t:t.pre||function(){},t.post||function(){},e,"",e)};m.keywords={additionalItems:!0,items:!0,contains:!0,additionalProperties:!0,propertyNames:!0,not:!0},m.arrayKeywords={items:!0,allOf:!0,anyOf:!0,oneOf:!0},m.propsKeywords={definitions:!0,properties:!0,patternProperties:!0,dependencies:!0},m.skipKeywords={default:!0,enum:!0,const:!0,required:!0,maximum:!0,minimum:!0,exclusiveMaximum:!0,exclusiveMinimum:!0,multipleOf:!0,maxLength:!0,minLength:!0,pattern:!0,format:!0,maxItems:!0,minItems:!0,uniqueItems:!0,maxProperties:!0,minProperties:!0}},{}],45:[function(e,r,t){var a;a=this,function(e){"use strict";function J(){for(var e=arguments.length,r=Array(e),t=0;t<e;t++)r[t]=arguments[t];if(1<r.length){r[0]=r[0].slice(0,-1);for(var a=r.length-1,s=1;s<a;++s)r[s]=r[s].slice(1,-1);return r[a]=r[a].slice(1),r.join("")}return r[0]}function Z(e){return"(?:"+e+")"}function a(e){return void 0===e?"undefined":null===e?"null":Object.prototype.toString.call(e).split(" ").pop().split("]").shift().toLowerCase()}function f(e){return e.toUpperCase()}function r(e){var r="[A-Za-z]",t="[0-9]",a=J(t,"[A-Fa-f]"),s=Z(Z("%[EFef]"+a+"%"+a+a+"%"+a+a)+"|"+Z("%[89A-Fa-f]"+a+"%"+a+a)+"|"+Z("%"+a+a)),o="[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]",i=J("[\\:\\/\\?\\#\\[\\]\\@]",o),n=e?"[\\uE000-\\uF8FF]":"[]",l=J(r,t,"[\\-\\.\\_\\~]",e?"[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]":"[]"),c=Z(r+J(r,t,"[\\+\\-\\.]")+"*"),u=Z(Z(s+"|"+J(l,o,"[\\:]"))+"*"),h=(Z("(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9][0-9])|(?:[1-9][0-9])|"+t),Z("(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9][0-9])|(?:0?[1-9][0-9])|0?0?"+t)),d=Z(h+"\\."+h+"\\."+h+"\\."+h),p=Z(a+"{1,4}"),f=Z(Z(p+"\\:"+p)+"|"+d),m=Z(Z(p+"\\:")+"{6}"+f),v=Z("\\:\\:"+Z(p+"\\:")+"{5}"+f),y=Z(Z(p)+"?\\:\\:"+Z(p+"\\:")+"{4}"+f),g=Z(Z(Z(p+"\\:")+"{0,1}"+p)+"?\\:\\:"+Z(p+"\\:")+"{3}"+f),P=Z(Z(Z(p+"\\:")+"{0,2}"+p)+"?\\:\\:"+Z(p+"\\:")+"{2}"+f),E=Z(Z(Z(p+"\\:")+"{0,3}"+p)+"?\\:\\:"+p+"\\:"+f),w=Z(Z(Z(p+"\\:")+"{0,4}"+p)+"?\\:\\:"+f),b=Z(Z(Z(p+"\\:")+"{0,5}"+p)+"?\\:\\:"+p),S=Z(Z(Z(p+"\\:")+"{0,6}"+p)+"?\\:\\:"),_=Z([m,v,y,g,P,E,w,b,S].join("|")),F=Z(Z(l+"|"+s)+"+"),x=(Z(_+"\\%25"+F),Z(_+Z("\\%25|\\%(?!"+a+"{2})")+F)),R=Z("[vV]"+a+"+\\."+J(l,o,"[\\:]")+"+"),$=Z("\\["+Z(x+"|"+_+"|"+R)+"\\]"),j=Z(Z(s+"|"+J(l,o))+"*"),D=Z($+"|"+d+"(?!"+j+")|"+j),O=Z(t+"*"),I=Z(Z(u+"@")+"?"+D+Z("\\:"+O)+"?"),A=Z(s+"|"+J(l,o,"[\\:\\@]")),k=Z(A+"*"),C=Z(A+"+"),L=Z(Z(s+"|"+J(l,o,"[\\@]"))+"+"),N=Z(Z("\\/"+k)+"*"),q=Z("\\/"+Z(C+N)+"?"),z=Z(L+N),T=Z(C+N),Q="(?!"+A+")",V=(Z(N+"|"+q+"|"+z+"|"+T+"|"+Q),Z(Z(A+"|"+J("[\\/\\?]",n))+"*")),U=Z(Z(A+"|[\\/\\?]")+"*"),H=Z(Z("\\/\\/"+I+N)+"|"+q+"|"+T+"|"+Q),K=Z(c+"\\:"+H+Z("\\?"+V)+"?"+Z("\\#"+U)+"?"),M=Z(Z("\\/\\/"+I+N)+"|"+q+"|"+z+"|"+Q),B=Z(M+Z("\\?"+V)+"?"+Z("\\#"+U)+"?");Z(K+"|"+B),Z(c+"\\:"+H+Z("\\?"+V)+"?"),Z(Z("\\/\\/("+Z("("+u+")@")+"?("+D+")"+Z("\\:("+O+")")+"?)")+"?("+N+"|"+q+"|"+T+"|"+Q+")"),Z("\\?("+V+")"),Z("\\#("+U+")"),Z(Z("\\/\\/("+Z("("+u+")@")+"?("+D+")"+Z("\\:("+O+")")+"?)")+"?("+N+"|"+q+"|"+z+"|"+Q+")"),Z("\\?("+V+")"),Z("\\#("+U+")"),Z(Z("\\/\\/("+Z("("+u+")@")+"?("+D+")"+Z("\\:("+O+")")+"?)")+"?("+N+"|"+q+"|"+T+"|"+Q+")"),Z("\\?("+V+")"),Z("\\#("+U+")"),Z("("+u+")@"),Z("\\:("+O+")");return{NOT_SCHEME:new RegExp(J("[^]",r,t,"[\\+\\-\\.]"),"g"),NOT_USERINFO:new RegExp(J("[^\\%\\:]",l,o),"g"),NOT_HOST:new RegExp(J("[^\\%\\[\\]\\:]",l,o),"g"),NOT_PATH:new RegExp(J("[^\\%\\/\\:\\@]",l,o),"g"),NOT_PATH_NOSCHEME:new RegExp(J("[^\\%\\/\\@]",l,o),"g"),NOT_QUERY:new RegExp(J("[^\\%]",l,o,"[\\:\\@\\/\\?]",n),"g"),NOT_FRAGMENT:new RegExp(J("[^\\%]",l,o,"[\\:\\@\\/\\?]"),"g"),ESCAPE:new RegExp(J("[^]",l,o),"g"),UNRESERVED:new RegExp(l,"g"),OTHER_CHARS:new RegExp(J("[^\\%]",l,i),"g"),PCT_ENCODED:new RegExp(s,"g"),IPV4ADDRESS:new RegExp("^("+d+")$"),IPV6ADDRESS:new RegExp("^\\[?("+_+")"+Z(Z("\\%25|\\%(?!"+a+"{2})")+"("+F+")")+"?\\]?$")}}var u=r(!1),h=r(!0),w=function(e,r){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,r){var t=[],a=!0,s=!1,o=void 0;try{for(var i,n=e[Symbol.iterator]();!(a=(i=n.next()).done)&&(t.push(i.value),!r||t.length!==r);a=!0);}catch(e){s=!0,o=e}finally{try{!a&&n.return&&n.return()}finally{if(s)throw o}}return t}(e,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")},A=2147483647,t=/^xn--/,s=/[^\0-\x7E]/,o=/[\x2E\u3002\uFF0E\uFF61]/g,i={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},k=Math.floor,C=String.fromCharCode;function L(e){throw new RangeError(i[e])}function n(e,r){var t=e.split("@"),a="";return 1<t.length&&(a=t[0]+"@",e=t[1]),a+function(e,r){for(var t=[],a=e.length;a--;)t[a]=r(e[a]);return t}((e=e.replace(o,".")).split("."),r).join(".")}function N(e){for(var r=[],t=0,a=e.length;t<a;){var s,o=e.charCodeAt(t++);55296<=o&&o<=56319&&t<a?56320==(64512&(s=e.charCodeAt(t++)))?r.push(((1023&o)<<10)+(1023&s)+65536):(r.push(o),t--):r.push(o)}return r}function q(e,r){return e+22+75*(e<26)-((0!=r)<<5)}function z(e,r,t){var a=0;for(e=t?k(e/700):e>>1,e+=k(e/r);455<e;a+=36)e=k(e/35);return k(a+36*e/(e+38))}function l(e){var r=[],t=e.length,a=0,s=128,o=72,i=e.lastIndexOf("-");i<0&&(i=0);for(var n=0;n<i;++n)128<=e.charCodeAt(n)&&L("not-basic"),r.push(e.charCodeAt(n));for(var l,c=0<i?i+1:0;c<t;){for(var u=a,h=1,d=36;;d+=36){t<=c&&L("invalid-input");var p=(l=e.charCodeAt(c++))-48<10?l-22:l-65<26?l-65:l-97<26?l-97:36;(36<=p||p>k((A-a)/h))&&L("overflow"),a+=p*h;var f=d<=o?1:o+26<=d?26:d-o;if(p<f)break;var m=36-f;h>k(A/m)&&L("overflow"),h*=m}var v=r.length+1,o=z(a-u,v,0==u);k(a/v)>A-s&&L("overflow"),s+=k(a/v),a%=v,r.splice(a++,0,s)}return String.fromCodePoint.apply(String,r)}function c(e){var r=[],t=(e=N(e)).length,a=128,s=0,o=72,i=!0,n=!1,l=void 0;try{for(var c,u=e[Symbol.iterator]();!(i=(c=u.next()).done);i=!0){var h=c.value;h<128&&r.push(C(h))}}catch(e){n=!0,l=e}finally{try{!i&&u.return&&u.return()}finally{if(n)throw l}}var d=r.length,p=d;for(d&&r.push("-");p<t;){var f=A,m=!0,v=!1,y=void 0;try{for(var g,P=e[Symbol.iterator]();!(m=(g=P.next()).done);m=!0){var E=g.value;a<=E&&E<f&&(f=E)}}catch(e){v=!0,y=e}finally{try{!m&&P.return&&P.return()}finally{if(v)throw y}}var w=p+1;f-a>k((A-s)/w)&&L("overflow"),s+=(f-a)*w,a=f;var b=!0,S=!1,_=void 0;try{for(var F,x=e[Symbol.iterator]();!(b=(F=x.next()).done);b=!0){var R=F.value;if(R<a&&++s>A&&L("overflow"),R==a){for(var $=s,j=36;;j+=36){var D=j<=o?1:o+26<=j?26:j-o;if($<D)break;var O=$-D,I=36-D;r.push(C(q(D+O%I,0))),$=k(O/I)}r.push(C(q($,0))),o=z(s,w,p==d),s=0,++p}}}catch(e){S=!0,_=e}finally{try{!b&&x.return&&x.return()}finally{if(S)throw _}}++s,++a}return r.join("")}var v={version:"2.1.0",ucs2:{decode:N,encode:function(e){return String.fromCodePoint.apply(String,function(e){if(Array.isArray(e)){for(var r=0,t=Array(e.length);r<e.length;r++)t[r]=e[r];return t}return Array.from(e)}(e))}},decode:l,encode:c,toASCII:function(e){return n(e,function(e){return s.test(e)?"xn--"+c(e):e})},toUnicode:function(e){return n(e,function(e){return t.test(e)?l(e.slice(4).toLowerCase()):e})}},d={};function m(e){var r=e.charCodeAt(0);return r<16?"%0"+r.toString(16).toUpperCase():r<128?"%"+r.toString(16).toUpperCase():r<2048?"%"+(r>>6|192).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase():"%"+(r>>12|224).toString(16).toUpperCase()+"%"+(r>>6&63|128).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase()}function p(e){for(var r="",t=0,a=e.length;t<a;){var s,o,i,n=parseInt(e.substr(t+1,2),16);n<128?(r+=String.fromCharCode(n),t+=3):194<=n&&n<224?(6<=a-t?(s=parseInt(e.substr(t+4,2),16),r+=String.fromCharCode((31&n)<<6|63&s)):r+=e.substr(t,6),t+=6):224<=n?(9<=a-t?(o=parseInt(e.substr(t+4,2),16),i=parseInt(e.substr(t+7,2),16),r+=String.fromCharCode((15&n)<<12|(63&o)<<6|63&i)):r+=e.substr(t,9),t+=9):(r+=e.substr(t,3),t+=3)}return r}function y(e,t){function r(e){var r=p(e);return r.match(t.UNRESERVED)?r:e}return e.scheme&&(e.scheme=String(e.scheme).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_SCHEME,"")),void 0!==e.userinfo&&(e.userinfo=String(e.userinfo).replace(t.PCT_ENCODED,r).replace(t.NOT_USERINFO,m).replace(t.PCT_ENCODED,f)),void 0!==e.host&&(e.host=String(e.host).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_HOST,m).replace(t.PCT_ENCODED,f)),void 0!==e.path&&(e.path=String(e.path).replace(t.PCT_ENCODED,r).replace(e.scheme?t.NOT_PATH:t.NOT_PATH_NOSCHEME,m).replace(t.PCT_ENCODED,f)),void 0!==e.query&&(e.query=String(e.query).replace(t.PCT_ENCODED,r).replace(t.NOT_QUERY,m).replace(t.PCT_ENCODED,f)),void 0!==e.fragment&&(e.fragment=String(e.fragment).replace(t.PCT_ENCODED,r).replace(t.NOT_FRAGMENT,m).replace(t.PCT_ENCODED,f)),e}function b(e){return e.replace(/^0*(.*)/,"$1")||"0"}function S(e,r){var t=e.match(r.IPV4ADDRESS)||[],a=w(t,2)[1];return a?a.split(".").map(b).join("."):e}function g(e,r){var t=e.match(r.IPV6ADDRESS)||[],a=w(t,3),s=a[1],o=a[2];if(s){for(var i=s.toLowerCase().split("::").reverse(),n=w(i,2),l=n[0],c=n[1],u=c?c.split(":").map(b):[],h=l.split(":").map(b),d=r.IPV4ADDRESS.test(h[h.length-1]),p=d?7:8,f=h.length-p,m=Array(p),v=0;v<p;++v)m[v]=u[v]||h[f+v]||"";d&&(m[p-1]=S(m[p-1],r));var y,g,P=m.reduce(function(e,r,t){var a;return r&&"0"!==r||((a=e[e.length-1])&&a.index+a.length===t?a.length++:e.push({index:t,length:1})),e},[]).sort(function(e,r){return r.length-e.length})[0],E=void 0;return E=P&&1<P.length?(y=m.slice(0,P.index),g=m.slice(P.index+P.length),y.join(":")+"::"+g.join(":")):m.join(":"),o&&(E+="%"+o),E}return e}var P=/^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i,E=void 0==="".match(/(){0}/)[1];function _(e){var r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},t={},a=!1!==r.iri?h:u;"suffix"===r.reference&&(e=(r.scheme?r.scheme+":":"")+"//"+e);var s=e.match(P);if(s){E?(t.scheme=s[1],t.userinfo=s[3],t.host=s[4],t.port=parseInt(s[5],10),t.path=s[6]||"",t.query=s[7],t.fragment=s[8],isNaN(t.port)&&(t.port=s[5])):(t.scheme=s[1]||void 0,t.userinfo=-1!==e.indexOf("@")?s[3]:void 0,t.host=-1!==e.indexOf("//")?s[4]:void 0,t.port=parseInt(s[5],10),t.path=s[6]||"",t.query=-1!==e.indexOf("?")?s[7]:void 0,t.fragment=-1!==e.indexOf("#")?s[8]:void 0,isNaN(t.port)&&(t.port=e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?s[4]:void 0)),t.host&&(t.host=g(S(t.host,a),a)),t.reference=void 0!==t.scheme||void 0!==t.userinfo||void 0!==t.host||void 0!==t.port||t.path||void 0!==t.query?void 0===t.scheme?"relative":void 0===t.fragment?"absolute":"uri":"same-document",r.reference&&"suffix"!==r.reference&&r.reference!==t.reference&&(t.error=t.error||"URI is not a "+r.reference+" reference.");var o=d[(r.scheme||t.scheme||"").toLowerCase()];if(r.unicodeSupport||o&&o.unicodeSupport)y(t,a);else{if(t.host&&(r.domainHost||o&&o.domainHost))try{t.host=v.toASCII(t.host.replace(a.PCT_ENCODED,p).toLowerCase())}catch(e){t.error=t.error||"Host's domain name can not be converted to ASCII via punycode: "+e}y(t,u)}o&&o.parse&&o.parse(t,r)}else t.error=t.error||"URI can not be parsed.";return t}var F=/^\.\.?\//,x=/^\/\.(\/|$)/,R=/^\/\.\.(\/|$)/,$=/^\/?(?:.|\n)*?(?=\/|$)/;function j(e){for(var r=[];e.length;)if(e.match(F))e=e.replace(F,"");else if(e.match(x))e=e.replace(x,"/");else if(e.match(R))e=e.replace(R,"/"),r.pop();else if("."===e||".."===e)e="";else{var t=e.match($);if(!t)throw new Error("Unexpected dot segment condition");var a=t[0];e=e.slice(a.length),r.push(a)}return r.join("")}function D(r){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},e=t.iri?h:u,a=[],s=d[(t.scheme||r.scheme||"").toLowerCase()];if(s&&s.serialize&&s.serialize(r,t),r.host&&!e.IPV6ADDRESS.test(r.host)&&(t.domainHost||s&&s.domainHost))try{r.host=t.iri?v.toUnicode(r.host):v.toASCII(r.host.replace(e.PCT_ENCODED,p).toLowerCase())}catch(e){r.error=r.error||"Host's domain name can not be converted to "+(t.iri?"Unicode":"ASCII")+" via punycode: "+e}y(r,e),"suffix"!==t.reference&&r.scheme&&(a.push(r.scheme),a.push(":"));var o,i,n,l,c=(i=!1!==t.iri?h:u,n=[],void 0!==(o=r).userinfo&&(n.push(o.userinfo),n.push("@")),void 0!==o.host&&n.push(g(S(String(o.host),i),i).replace(i.IPV6ADDRESS,function(e,r,t){return"["+r+(t?"%25"+t:"")+"]"})),"number"!=typeof o.port&&"string"!=typeof o.port||(n.push(":"),n.push(String(o.port))),n.length?n.join(""):void 0);return void 0!==c&&("suffix"!==t.reference&&a.push("//"),a.push(c),r.path&&"/"!==r.path.charAt(0)&&a.push("/")),void 0!==r.path&&(l=r.path,t.absolutePath||s&&s.absolutePath||(l=j(l)),void 0===c&&(l=l.replace(/^\/\//,"/%2F")),a.push(l)),void 0!==r.query&&(a.push("?"),a.push(r.query)),void 0!==r.fragment&&(a.push("#"),a.push(r.fragment)),a.join("")}function O(e,r){var t=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},a={};return arguments[3]||(e=_(D(e,t),t),r=_(D(r,t),t)),!(t=t||{}).tolerant&&r.scheme?(a.scheme=r.scheme,a.userinfo=r.userinfo,a.host=r.host,a.port=r.port,a.path=j(r.path||""),a.query=r.query):(void 0!==r.userinfo||void 0!==r.host||void 0!==r.port?(a.userinfo=r.userinfo,a.host=r.host,a.port=r.port,a.path=j(r.path||""),a.query=r.query):(r.path?("/"===r.path.charAt(0)?a.path=j(r.path):(a.path=void 0===e.userinfo&&void 0===e.host&&void 0===e.port||e.path?e.path?e.path.slice(0,e.path.lastIndexOf("/")+1)+r.path:r.path:"/"+r.path,a.path=j(a.path)),a.query=r.query):(a.path=e.path,a.query=void 0!==r.query?r.query:e.query),a.userinfo=e.userinfo,a.host=e.host,a.port=e.port),a.scheme=e.scheme),a.fragment=r.fragment,a}function I(e,r){return e&&e.toString().replace(r&&r.iri?h.PCT_ENCODED:u.PCT_ENCODED,p)}var T={scheme:"http",domainHost:!0,parse:function(e){return e.host||(e.error=e.error||"HTTP URIs must have a host."),e},serialize:function(e){var r="https"===String(e.scheme).toLowerCase();return e.port!==(r?443:80)&&""!==e.port||(e.port=void 0),e.path||(e.path="/"),e}},Q={scheme:"https",domainHost:T.domainHost,parse:T.parse,serialize:T.serialize};function V(e){return"boolean"==typeof e.secure?e.secure:"wss"===String(e.scheme).toLowerCase()}var U={scheme:"ws",domainHost:!0,parse:function(e){var r=e;return r.secure=V(r),r.resourceName=(r.path||"/")+(r.query?"?"+r.query:""),r.path=void 0,r.query=void 0,r},serialize:function(e){var r,t,a,s;return e.port!==(V(e)?443:80)&&""!==e.port||(e.port=void 0),"boolean"==typeof e.secure&&(e.scheme=e.secure?"wss":"ws",e.secure=void 0),e.resourceName&&(r=e.resourceName.split("?"),s=(t=w(r,2))[1],e.path=(a=t[0])&&"/"!==a?a:void 0,e.query=s,e.resourceName=void 0),e.fragment=void 0,e}},H={scheme:"wss",domainHost:U.domainHost,parse:U.parse,serialize:U.serialize},K={},M="[A-Za-z0-9\\-\\.\\_\\~\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]",B="[0-9A-Fa-f]",G=(Z(Z("%[EFef]"+B+"%"+B+B+"%"+B+B)+"|"+Z("%[89A-Fa-f]"+B+"%"+B+B)+"|"+Z("%"+B+B)),J("[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]",'[\\"\\\\]')),Y=new RegExp(M,"g"),W=new RegExp("(?:(?:%[EFef][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[89A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[0-9A-Fa-f][0-9A-Fa-f]))","g"),X=new RegExp(J("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',G),"g"),ee=new RegExp(J("[^]",M,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),re=ee;function te(e){var r=p(e);return r.match(Y)?r:e}var ae={scheme:"mailto",parse:function(e,r){var t=e,a=t.to=t.path?t.path.split(","):[];if(t.path=void 0,t.query){for(var s=!1,o={},i=t.query.split("&"),n=0,l=i.length;n<l;++n){var c=i[n].split("=");switch(c[0]){case"to":for(var u=c[1].split(","),h=0,d=u.length;h<d;++h)a.push(u[h]);break;case"subject":t.subject=I(c[1],r);break;case"body":t.body=I(c[1],r);break;default:s=!0,o[I(c[0],r)]=I(c[1],r)}}s&&(t.headers=o)}t.query=void 0;for(var p=0,f=a.length;p<f;++p){var m=a[p].split("@");if(m[0]=I(m[0]),r.unicodeSupport)m[1]=I(m[1],r).toLowerCase();else try{m[1]=v.toASCII(I(m[1],r).toLowerCase())}catch(e){t.error=t.error||"Email address's domain name can not be converted to ASCII via punycode: "+e}a[p]=m.join("@")}return t},serialize:function(e,r){var t,a=e,s=null!=(t=e.to)?t instanceof Array?t:"number"!=typeof t.length||t.split||t.setInterval||t.call?[t]:Array.prototype.slice.call(t):[];if(s){for(var o=0,i=s.length;o<i;++o){var n=String(s[o]),l=n.lastIndexOf("@"),c=n.slice(0,l).replace(W,te).replace(W,f).replace(X,m),u=n.slice(l+1);try{u=r.iri?v.toUnicode(u):v.toASCII(I(u,r).toLowerCase())}catch(e){a.error=a.error||"Email address's domain name can not be converted to "+(r.iri?"Unicode":"ASCII")+" via punycode: "+e}s[o]=c+"@"+u}a.path=s.join(",")}var h=e.headers=e.headers||{};e.subject&&(h.subject=e.subject),e.body&&(h.body=e.body);var d,p=[];for(d in h)h[d]!==K[d]&&p.push(d.replace(W,te).replace(W,f).replace(ee,m)+"="+h[d].replace(W,te).replace(W,f).replace(re,m));return p.length&&(a.query=p.join("&")),a}},se=/^([^\:]+)\:(.*)/,oe={scheme:"urn",parse:function(e,r){var t,a,s,o,i=e.path&&e.path.match(se),n=e;return i?(t=r.scheme||n.scheme||"urn",a=i[1].toLowerCase(),s=i[2],o=d[t+":"+(r.nid||a)],n.nid=a,n.nss=s,n.path=void 0,o&&(n=o.parse(n,r))):n.error=n.error||"URN can not be parsed.",n},serialize:function(e,r){var t=e.nid,a=d[(r.scheme||e.scheme||"urn")+":"+(r.nid||t)];a&&(e=a.serialize(e,r));var s=e;return s.path=(t||r.nid)+":"+e.nss,s}},ie=/^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/,ne={scheme:"urn:uuid",parse:function(e,r){var t=e;return t.uuid=t.nss,t.nss=void 0,r.tolerant||t.uuid&&t.uuid.match(ie)||(t.error=t.error||"UUID is not valid."),t},serialize:function(e){var r=e;return r.nss=(e.uuid||"").toLowerCase(),r}};d[T.scheme]=T,d[Q.scheme]=Q,d[U.scheme]=U,d[H.scheme]=H,d[ae.scheme]=ae,d[oe.scheme]=oe,d[ne.scheme]=ne,e.SCHEMES=d,e.pctEncChar=m,e.pctDecChars=p,e.parse=_,e.removeDotSegments=j,e.serialize=D,e.resolveComponents=O,e.resolve=function(e,r,t){var a=function(e,r){var t=e;if(r)for(var a in r)t[a]=r[a];return t}({scheme:"null"},t);return D(O(_(e,a),_(r,a),a,!0),a)},e.normalize=function(e,r){return"string"==typeof e?e=D(_(e,r),r):"object"===a(e)&&(e=_(D(e,r),r)),e},e.equal=function(e,r,t){return"string"==typeof e?e=D(_(e,t),t):"object"===a(e)&&(e=D(e,t)),"string"==typeof r?r=D(_(r,t),t):"object"===a(r)&&(r=D(r,t)),e===r},e.escapeComponent=function(e,r){return e&&e.toString().replace(r&&r.iri?h.ESCAPE:u.ESCAPE,m)},e.unescapeComponent=I,Object.defineProperty(e,"__esModule",{value:!0})}("object"==typeof t&&void 0!==r?t:a.URI=a.URI||{})},{}],ajv:[function(a,e,r){"use strict";var n=a("./compile"),d=a("./compile/resolve"),t=a("./cache"),p=a("./compile/schema_obj"),s=a("fast-json-stable-stringify"),o=a("./compile/formats"),i=a("./compile/rules"),l=a("./data"),c=a("./compile/util");(e.exports=y).prototype.validate=function(e,r){var t;if("string"==typeof e){if(!(t=this.getSchema(e)))throw new Error('no schema with key or ref "'+e+'"')}else{var a=this._addSchema(e);t=a.validate||this._compile(a)}var s=t(r);!0!==t.$async&&(this.errors=t.errors);return s},y.prototype.compile=function(e,r){var t=this._addSchema(e,void 0,r);return t.validate||this._compile(t)},y.prototype.addSchema=function(e,r,t,a){if(Array.isArray(e)){for(var s=0;s<e.length;s++)this.addSchema(e[s],void 0,t,a);return this}var o=this._getId(e);if(void 0!==o&&"string"!=typeof o)throw new Error("schema id must be string");return S(this,r=d.normalizeId(r||o)),this._schemas[r]=this._addSchema(e,t,a,!0),this},y.prototype.addMetaSchema=function(e,r,t){return this.addSchema(e,r,t,!0),this},y.prototype.validateSchema=function(e,r){var t=e.$schema;if(void 0!==t&&"string"!=typeof t)throw new Error("$schema must be a string");if(!(t=t||this._opts.defaultMeta||function(e){var r=e._opts.meta;return e._opts.defaultMeta="object"==typeof r?e._getId(r)||r:e.getSchema(f)?f:void 0,e._opts.defaultMeta}(this)))return this.logger.warn("meta-schema not available"),!(this.errors=null);var a=this.validate(t,e);if(!a&&r){var s="schema is invalid: "+this.errorsText();if("log"!=this._opts.validateSchema)throw new Error(s);this.logger.error(s)}return a},y.prototype.getSchema=function(e){var r=g(this,e);switch(typeof r){case"object":return r.validate||this._compile(r);case"string":return this.getSchema(r);case"undefined":return function(e,r){var t=d.schema.call(e,{schema:{}},r);if(t){var a=t.schema,s=t.root,o=t.baseId,i=n.call(e,a,s,void 0,o);return e._fragments[r]=new p({ref:r,fragment:!0,schema:a,root:s,baseId:o,validate:i}),i}}(this,e)}},y.prototype.removeSchema=function(e){if(e instanceof RegExp)return P(this,this._schemas,e),P(this,this._refs,e),this;switch(typeof e){case"undefined":return P(this,this._schemas),P(this,this._refs),this._cache.clear(),this;case"string":var r=g(this,e);return r&&this._cache.del(r.cacheKey),delete this._schemas[e],delete this._refs[e],this;case"object":var t=this._opts.serialize,a=t?t(e):e;this._cache.del(a);var s=this._getId(e);s&&(s=d.normalizeId(s),delete this._schemas[s],delete this._refs[s])}return this},y.prototype.addFormat=function(e,r){"string"==typeof r&&(r=new RegExp(r));return this._formats[e]=r,this},y.prototype.errorsText=function(e,r){if(!(e=e||this.errors))return"No errors";for(var t=void 0===(r=r||{}).separator?", ":r.separator,a=void 0===r.dataVar?"data":r.dataVar,s="",o=0;o<e.length;o++){var i=e[o];i&&(s+=a+i.dataPath+" "+i.message+t)}return s.slice(0,-t.length)},y.prototype._addSchema=function(e,r,t,a){if("object"!=typeof e&&"boolean"!=typeof e)throw new Error("schema should be object or boolean");var s=this._opts.serialize,o=s?s(e):e,i=this._cache.get(o);if(i)return i;a=a||!1!==this._opts.addUsedSchema;var n=d.normalizeId(this._getId(e));n&&a&&S(this,n);var l,c=!1!==this._opts.validateSchema&&!r;c&&!(l=n&&n==d.normalizeId(e.$schema))&&this.validateSchema(e,!0);var u=d.ids.call(this,e),h=new p({id:n,schema:e,localRefs:u,cacheKey:o,meta:t});"#"!=n[0]&&a&&(this._refs[n]=h);this._cache.put(o,h),c&&l&&this.validateSchema(e,!0);return h},y.prototype._compile=function(t,e){if(t.compiling)return(t.validate=s).schema=t.schema,s.errors=null,s.root=e||s,!0===t.schema.$async&&(s.$async=!0),s;var r,a;t.compiling=!0,t.meta&&(r=this._opts,this._opts=this._metaOpts);try{a=n.call(this,t.schema,e,t.localRefs)}catch(e){throw delete t.validate,e}finally{t.compiling=!1,t.meta&&(this._opts=r)}return t.validate=a,t.refs=a.refs,t.refVal=a.refVal,t.root=a.root,a;function s(){var e=t.validate,r=e.apply(this,arguments);return s.errors=e.errors,r}},y.prototype.compileAsync=a("./compile/async");var u=a("./keyword");y.prototype.addKeyword=u.add,y.prototype.getKeyword=u.get,y.prototype.removeKeyword=u.remove,y.prototype.validateKeyword=u.validate;var h=a("./compile/error_classes");y.ValidationError=h.Validation,y.MissingRefError=h.MissingRef,y.$dataMetaSchema=l;var f="http://json-schema.org/draft-07/schema",m=["removeAdditional","useDefaults","coerceTypes","strictDefaults"],v=["/properties"];function y(e){if(!(this instanceof y))return new y(e);e=this._opts=c.copy(e)||{},function(e){var r=e._opts.logger;if(!1===r)e.logger={log:_,warn:_,error:_};else{if(void 0===r&&(r=console),!("object"==typeof r&&r.log&&r.warn&&r.error))throw new Error("logger must implement log, warn and error methods");e.logger=r}}(this),this._schemas={},this._refs={},this._fragments={},this._formats=o(e.format),this._cache=e.cache||new t,this._loadingSchemas={},this._compilations=[],this.RULES=i(),this._getId=function(e){switch(e.schemaId){case"auto":return b;case"id":return E;default:return w}}(e),e.loopRequired=e.loopRequired||1/0,"property"==e.errorDataPath&&(e._errorDataPathProperty=!0),void 0===e.serialize&&(e.serialize=s),this._metaOpts=function(e){for(var r=c.copy(e._opts),t=0;t<m.length;t++)delete r[m[t]];return r}(this),e.formats&&function(e){for(var r in e._opts.formats){e.addFormat(r,e._opts.formats[r])}}(this),e.keywords&&function(e){for(var r in e._opts.keywords){e.addKeyword(r,e._opts.keywords[r])}}(this),function(e){var r;e._opts.$data&&(r=a("./refs/data.json"),e.addMetaSchema(r,r.$id,!0));if(!1===e._opts.meta)return;var t=a("./refs/json-schema-draft-07.json");e._opts.$data&&(t=l(t,v));e.addMetaSchema(t,f,!0),e._refs["http://json-schema.org/schema"]=f}(this),"object"==typeof e.meta&&this.addMetaSchema(e.meta),e.nullable&&this.addKeyword("nullable",{metaSchema:{type:"boolean"}}),function(e){var r=e._opts.schemas;if(!r)return;if(Array.isArray(r))e.addSchema(r);else for(var t in r)e.addSchema(r[t],t)}(this)}function g(e,r){return r=d.normalizeId(r),e._schemas[r]||e._refs[r]||e._fragments[r]}function P(e,r,t){for(var a in r){var s=r[a];s.meta||t&&!t.test(a)||(e._cache.del(s.cacheKey),delete r[a])}}function E(e){return e.$id&&this.logger.warn("schema $id ignored",e.$id),e.id}function w(e){return e.id&&this.logger.warn("schema id ignored",e.id),e.$id}function b(e){if(e.$id&&e.id&&e.$id!=e.id)throw new Error("schema $id is different from id");return e.$id||e.id}function S(e,r){if(e._schemas[r]||e._refs[r])throw new Error('schema with key or id "'+r+'" already exists')}function _(){}},{"./cache":1,"./compile":5,"./compile/async":2,"./compile/error_classes":3,"./compile/formats":4,"./compile/resolve":6,"./compile/rules":7,"./compile/schema_obj":8,"./compile/util":10,"./data":11,"./keyword":39,"./refs/data.json":40,"./refs/json-schema-draft-07.json":41,"fast-json-stable-stringify":43}]},{},[])("ajv")});
//# sourceMappingURL=ajv.min.js.map{"version":3,"file":"ajv.min.js","sources":["0"],"names":["f","exports","module","define","amd","window","global","self","this","Ajv","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","Cache","_cache","prototype","put","key","value","get","del","clear","2","MissingRefError","MissingRef","compileAsync","schema","meta","callback","_opts","loadSchema","undefined","loadMetaSchemaOf","then","schemaObj","_addSchema","validate","_compileAsync","_compile","loadMissingSchema","ref","missingSchema","added","missingRef","schemaPromise","_loadingSchemas","removePromise","sch","addSchema","_refs","_schemas","v","$schema","getSchema","$ref","Promise","resolve","./error_classes","3","baseId","message","url","normalizeId","fullPath","errorSubclass","Subclass","Object","create","constructor","Validation","errors","ajv","validation","./resolve","4","util","DATE","DAYS","TIME","HOSTNAME","URI","URITEMPLATE","URL","UUID","JSON_POINTER","JSON_POINTER_URI_FRAGMENT","RELATIVE_JSON_POINTER","formats","mode","copy","date","str","matches","match","year","month","day","time","full","hour","minute","second","fast","date-time","uri","uri-reference","uri-template","email","hostname","ipv4","ipv6","regex","uuid","json-pointer","json-pointer-uri-fragment","relative-json-pointer","dateTime","split","DATE_TIME_SEPARATOR","NOT_URI_FRAGMENT","test","Z_ANCHOR","RegExp","./util","5","errorClasses","stableStringify","validateGenerator","ucs2length","equal","ValidationError","compile","root","localRefs","opts","refVal","refs","patterns","patternsHash","defaults","defaultsHash","customRules","index","compIndex","compiling","_compilations","compilation","callValidate","_formats","RULES","localCompile","cv","$async","sourceCode","source","splice","result","apply","arguments","_schema","_root","isRoot","isTop","schemaPath","errSchemaPath","errorPath","resolveRef","usePattern","useDefault","useCustomRule","logger","vars","refValCode","patternCode","defaultCode","customRuleCode","processCode","Function","makeValidate","error","_refVal","refCode","refIndex","resolvedRef","rootRefId","addLocalRef","localSchema","inlineRef","inlineRefs","refId","inline","regexStr","toQuotedString","valueStr","rule","parentSchema","it","validateSchema","deps","definition","dependencies","every","keyword","hasOwnProperty","join","errorsText","macro","arr","statement","../dotjs/validate","fast-deep-equal","fast-json-stable-stringify","6","SchemaObject","traverse","res","resolveSchema","parse","refPath","_getFullPath","getFullPath","_getId","keys","id","parsedRef","resolveUrl","getJsonPointer","ids","schemaId","baseIds","","fullPaths","allKeys","jsonPtr","rootSchema","parentJsonPtr","parentKeyword","keyIndex","escapeFragment","PREVENT_SCOPE_CHANGE","toHash","fragment","slice","parts","part","unescapeFragment","SIMPLE_INLINED","limit","checkNoRef","item","Array","isArray","countKeys","count","Infinity","normalize","serialize","TRAILING_SLASH_HASH","replace","./schema_obj","json-schema-traverse","uri-js","7","ruleModules","type","rules","maximum","minimum","properties","ALL","all","types","forEach","group","map","implKeywords","k","push","implements","$comment","keywords","concat","custom","../dotjs","8","obj","9","len","pos","charCodeAt","10","checkDataType","dataType","data","strictNumbers","negate","EQUAL","AND","OK","NOT","to","checkDataTypes","dataTypes","array","object","null","number","integer","coerceToTypes","optionCoerceTypes","COERCE_TO_TYPES","getProperty","escapeQuotes","varOccurences","dataVar","varReplace","expr","schemaHasRules","schemaHasRulesExcept","exceptKeyword","schemaUnknownRules","getPathExpr","currentPath","jsonPointers","isNumber","joinPaths","getPath","prop","path","escapeJsonPointer","getData","$data","lvl","paths","up","jsonPointer","segments","segment","unescapeJsonPointer","decodeURIComponent","encodeURIComponent","hash","IDENTIFIER","SINGLE_QUOTE","b","./ucs2length","11","KEYWORDS","metaSchema","keywordsJsonPointers","JSON","stringify","j","anyOf","12","$id","definitions","simpleTypes","statements","valid","not","required","items","modifying","async","const","./refs/json-schema-draft-07.json","13","$keyword","$schemaValueExcl","$exclusive","$exclType","$exclIsNumber","$opStr","$opExpr","$$outStack","out","$lvl","level","$dataLvl","dataLevel","$schemaPath","$errSchemaPath","$breakOnError","allErrors","$isData","$schemaValue","dataPathArr","$isMax","$exclusiveKeyword","$schemaExcl","$isDataExcl","$op","$notOp","$errorKeyword","createErrors","messages","verbose","__err","pop","compositeRule","Math","14","15","unicode","16","17","$it","$closingBraces","$nextValid","$currentBaseId","$allSchemasEmpty","arr1","$sch","$i","l1","strictKeywords","18","$valid","$errs","$wasComposite","19","20","21","$passData","$code","$idx","$dataNxt","$nextData","$nonEmptySchema","22","$compile","$inline","$macro","$ruleValidate","$validateCode","$rule","$definition","$rDef","$validateSchema","$parentData","$parentDataProperty","def_callRuleValidate","def_customError","$ruleErrs","$ruleErr","$asyncKeyword","passContext","23","$deps","$schemaDeps","$propertyDeps","$ownProperties","ownProperties","$property","$currentErrorPath","$propertyKey","$useData","$prop","$propertyPath","$missingProperty","_errorDataPathProperty","arr2","i2","l2","24","$vSchema","25","$ruleType","format","$format","$unknownFormats","unknownFormats","$allowUnknown","$isObject","$formatType","warn","indexOf","$formatRef","26","$ifClause","$thenSch","$elseSch","$thenPresent","$elsePresent","27","allOf","contains","enum","if","maxItems","minItems","maxLength","minLength","maxProperties","minProperties","multipleOf","oneOf","pattern","propertyNames","uniqueItems","./_limit","./_limitItems","./_limitLength","./_limitProperties","./allOf","./anyOf","./comment","./const","./contains","./dependencies","./enum","./format","./if","./items","./multipleOf","./not","./oneOf","./pattern","./properties","./propertyNames","./ref","./required","./uniqueItems","./validate","28","$currErrSchemaPath","$additionalItems","additionalItems","29","multipleOfPrecision","30","$allErrorsOption","31","$prevValid","$passingSchemas","32","$regexp","33","$requiredHash","$additionalProperty","$key","$dataProperties","$schemaKeys","filter","notProto","$pProperties","patternProperties","$pPropertyKeys","$aProperties","additionalProperties","$someProperties","$noAdditional","$additionalIsSchema","$removeAdditional","removeAdditional","$checkAdditional","$required","loopRequired","i1","$pProperty","$useDefaults","useDefaults","arr3","i3","l3","$hasDefault","default","arr4","i4","l4","34","$invalidName","35","$refCode","$refVal","$message","missingRefs","__callValidate","36","$propertySch","$loopRequired","37","$itemType","$typeIsArray","38","$refKeywords","$unknownKwd","$keywordsMsg","$top","rootId","strictDefaults","$defaultMsg","$coerceToTypes","$closingBraces1","$closingBraces2","$typeSchema","nullable","extendRefs","coerceTypes","$rulesGroup","$shouldUseGroup","$dataType","$coerced","$type","arr5","i5","l5","$shouldUseRule","impl","$ruleImplementsSomeKeyword","39","definitionSchema","validateKeyword","throwError","_validateKeyword","add","_addRule","ruleGroup","rg","remove","./definition_schema","./dotjs/custom","40","description","41","title","schemaArray","nonNegativeInteger","nonNegativeIntegerDefault0","stringArray","readOnly","examples","exclusiveMinimum","exclusiveMaximum","contentMediaType","contentEncoding","else","42","flags","valueOf","toString","43","cmp","cycles","node","seen","toJSON","isFinite","TypeError","seenIndex","sort","44","cb","_traverse","pre","post","arrayKeywords","propsKeywords","skipKeywords","45","merge","_len","sets","_key","xl","x","subexp","typeOf","shift","toLowerCase","toUpperCase","buildExps","isIRI","ALPHA$$","DIGIT$$","HEXDIG$$","PCT_ENCODED$","SUB_DELIMS$$","RESERVED$$","IPRIVATE$$","UNRESERVED$$","SCHEME$","USERINFO$","DEC_OCTET_RELAXED$","IPV4ADDRESS$","H16$","LS32$","IPV6ADDRESS1$","IPV6ADDRESS2$","IPV6ADDRESS3$","IPV6ADDRESS4$","IPV6ADDRESS5$","IPV6ADDRESS6$","IPV6ADDRESS7$","IPV6ADDRESS8$","IPV6ADDRESS9$","IPV6ADDRESS$","ZONEID$","IPV6ADDRZ_RELAXED$","IPVFUTURE$","IP_LITERAL$","REG_NAME$","HOST$","PORT$","AUTHORITY$","PCHAR$","SEGMENT$","SEGMENT_NZ$","SEGMENT_NZ_NC$","PATH_ABEMPTY$","PATH_ABSOLUTE$","PATH_NOSCHEME$","PATH_ROOTLESS$","PATH_EMPTY$","QUERY$","FRAGMENT$","HIER_PART$","URI$","RELATIVE_PART$","RELATIVE$","NOT_SCHEME","NOT_USERINFO","NOT_HOST","NOT_PATH","NOT_PATH_NOSCHEME","NOT_QUERY","NOT_FRAGMENT","ESCAPE","UNRESERVED","OTHER_CHARS","PCT_ENCODED","IPV4ADDRESS","IPV6ADDRESS","URI_PROTOCOL","IRI_PROTOCOL","slicedToArray","Symbol","iterator","_arr","_n","_d","_e","_s","_i","next","done","err","sliceIterator","maxInt","regexPunycode","regexNonASCII","regexSeparators","overflow","not-basic","invalid-input","floor","stringFromCharCode","String","fromCharCode","error$1","RangeError","mapDomain","string","fn","ucs2decode","output","counter","extra","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","baseMinusTMin","base","decode","input","inputLength","bias","basic","lastIndexOf","codePoint","oldi","w","baseMinusT","fromCodePoint","encode","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","_currentValue2","return","basicLength","handledCPCount","m","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","currentValue","handledCPCountPlusOne","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","_currentValue","q","qMinusT","punycode","version","ucs2","from","toConsumableArray","toASCII","toUnicode","SCHEMES","pctEncChar","chr","pctDecChars","newStr","il","c2","_c","c3","parseInt","substr","_normalizeComponentEncoding","components","protocol","decodeUnreserved","decStr","scheme","userinfo","host","query","_stripLeadingZeros","_normalizeIPv4","address","_normalizeIPv6","_matches2","zone","_address$toLowerCase$","reverse","_address$toLowerCase$2","last","first","firstFields","lastFields","isLastFieldIPv4Address","fieldCount","lastFieldsStart","fields","newFirst","newLast","longestZeroFields","reduce","acc","field","lastLongest","newHost","URI_PARSE","NO_MATCH_IS_UNDEFINED","uriString","options","iri","reference","port","isNaN","schemeHandler","unicodeSupport","domainHost","RDS1","RDS2","RDS3","RDS5","removeDotSegments","im","s","uriTokens","authority","_","$1","$2","charAt","absolutePath","resolveComponents","relative","target","tolerant","unescapeComponent","handler","secure","handler$1","isSecure","wsComponents","handler$2","resourceName","_wsComponents$resourc","_wsComponents$resourc2","handler$3","O","VCHAR$$","NOT_LOCAL_PART","NOT_HFNAME","NOT_HFVALUE","handler$4","mailtoComponents","unknownHeaders","headers","hfields","hfield","toAddrs","_x","_xl","subject","body","_x2","_xl2","addr","setInterval","toAddr","atIdx","localPart","domain","name","URN_PARSE","handler$5","nid","nss","urnComponents","uriComponents","handler$6","uuidComponents","baseURI","relativeURI","schemelessOptions","assign","uriA","uriB","escapeComponent","defineProperty","factory","compileSchema","$dataMetaSchema","schemaKeyRef","_meta","_skipValidation","checkUnique","addMetaSchema","skipValidation","throwOrLogError","defaultMeta","META_SCHEMA_ID","keyRef","_getSchemaObj","_fragments","_getSchemaFragment","removeSchema","_removeAllSchemas","cacheKey","addFormat","separator","text","dataPath","shouldAddSchema","cached","addUsedSchema","recursiveMeta","willValidate","currentOpts","_metaOpts","_validate","customKeyword","addKeyword","getKeyword","removeKeyword","META_IGNORE_OPTIONS","META_SUPPORT_DATA","log","noop","console","setLogger","cache","_get$IdOrId","_get$Id","chooseGetId","errorDataPath","metaOpts","getMetaSchemaOptions","addInitialFormats","addInitialKeywords","$dataSchema","addDefaultMetaSchema","optsSchemas","schemas","addInitialSchemas","./cache","./compile","./compile/async","./compile/error_classes","./compile/formats","./compile/resolve","./compile/rules","./compile/schema_obj","./compile/util","./data","./keyword","./refs/data.json"],"mappings":"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"}The MIT License (MIT)

Copyright (c) 2016 Evgeny Poberezkin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';

var KEYWORDS = require('./keywords');

module.exports = defineKeywords;


/**
 * Defines one or several keywords in ajv instance
 * @param  {Ajv} ajv validator instance
 * @param  {String|Array<String>|undefined} keyword keyword(s) to define
 * @return {Ajv} ajv instance (for chaining)
 */
function defineKeywords(ajv, keyword) {
  if (Array.isArray(keyword)) {
    for (var i=0; i<keyword.length; i++)
      get(keyword[i])(ajv);
    return ajv;
  }
  if (keyword) {
    get(keyword)(ajv);
    return ajv;
  }
  for (keyword in KEYWORDS) get(keyword)(ajv);
  return ajv;
}


defineKeywords.get = get;

function get(keyword) {
  var defFunc = KEYWORDS[keyword];
  if (!defFunc) throw new Error('Unknown keyword ' + keyword);
  return defFunc;
}
{
  "author": {
    "name": "Evgeny Poberezkin"
  },
  "deprecated": false,
  "description": "Custom JSON-Schema keywords for Ajv validator",
  "devDependencies": {
    "ajv": "^6.9.1",
    "ajv-pack": "^0.3.0",
    "chai": "^4.2.0",
    "coveralls": "^3.0.2",
    "dot": "^1.1.1",
    "eslint": "^7.2.0",
    "glob": "^7.1.3",
    "istanbul": "^0.4.3",
    "js-beautify": "^1.8.9",
    "json-schema-test": "^2.0.0",
    "mocha": "^8.0.1",
    "pre-commit": "^1.1.3",
    "uuid": "^8.1.0"
  },
  "files": [
    "index.js",
    "ajv-keywords.d.ts",
    "keywords"
  ],
  "homepage": "https://github.com/epoberezkin/ajv-keywords#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "ajv-keywords",
  "peerDependencies": {
    "ajv": "^6.9.1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/epoberezkin/ajv-keywords.git"
  },
  "typings": "ajv-keywords.d.ts",
  "version": "3.5.2"
}'use strict';

var TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d:\d\d)?$/i;
var DATE_TIME_SEPARATOR = /t|\s/i;

var COMPARE_FORMATS = {
  date: compareDate,
  time: compareTime,
  'date-time': compareDateTime
};

var $dataMetaSchema = {
  type: 'object',
  required: [ '$data' ],
  properties: {
    $data: {
      type: 'string',
      anyOf: [
        { format: 'relative-json-pointer' },
        { format: 'json-pointer' }
      ]
    }
  },
  additionalProperties: false
};

module.exports = function (minMax) {
  var keyword = 'format' + minMax;
  return function defFunc(ajv) {
    defFunc.definition = {
      type: 'string',
      inline: require('./dotjs/_formatLimit'),
      statements: true,
      errors: 'full',
      dependencies: ['format'],
      metaSchema: {
        anyOf: [
          {type: 'string'},
          $dataMetaSchema
        ]
      }
    };

    ajv.addKeyword(keyword, defFunc.definition);
    ajv.addKeyword('formatExclusive' + minMax, {
      dependencies: ['format' + minMax],
      metaSchema: {
        anyOf: [
          {type: 'boolean'},
          $dataMetaSchema
        ]
      }
    });
    extendFormats(ajv);
    return ajv;
  };
};


function extendFormats(ajv) {
  var formats = ajv._formats;
  for (var name in COMPARE_FORMATS) {
    var format = formats[name];
    // the last condition is needed if it's RegExp from another window
    if (typeof format != 'object' || format instanceof RegExp || !format.validate)
      format = formats[name] = { validate: format };
    if (!format.compare)
      format.compare = COMPARE_FORMATS[name];
  }
}


function compareDate(d1, d2) {
  if (!(d1 && d2)) return;
  if (d1 > d2) return 1;
  if (d1 < d2) return -1;
  if (d1 === d2) return 0;
}


function compareTime(t1, t2) {
  if (!(t1 && t2)) return;
  t1 = t1.match(TIME);
  t2 = t2.match(TIME);
  if (!(t1 && t2)) return;
  t1 = t1[1] + t1[2] + t1[3] + (t1[4]||'');
  t2 = t2[1] + t2[2] + t2[3] + (t2[4]||'');
  if (t1 > t2) return 1;
  if (t1 < t2) return -1;
  if (t1 === t2) return 0;
}


function compareDateTime(dt1, dt2) {
  if (!(dt1 && dt2)) return;
  dt1 = dt1.split(DATE_TIME_SEPARATOR);
  dt2 = dt2.split(DATE_TIME_SEPARATOR);
  var res = compareDate(dt1[0], dt2[0]);
  if (res === undefined) return;
  return res || compareTime(dt1[1], dt2[1]);
}
'use strict';

module.exports = {
  metaSchemaRef: metaSchemaRef
};

var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema';

function metaSchemaRef(ajv) {
  var defaultMeta = ajv._opts.defaultMeta;
  if (typeof defaultMeta == 'string') return { $ref: defaultMeta };
  if (ajv.getSchema(META_SCHEMA_ID)) return { $ref: META_SCHEMA_ID };
  console.warn('meta schema not defined');
  return {};
}
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    macro: function (schema, parentSchema) {
      if (!schema) return true;
      var properties = Object.keys(parentSchema.properties);
      if (properties.length == 0) return true;
      return {required: properties};
    },
    metaSchema: {type: 'boolean'},
    dependencies: ['properties']
  };

  ajv.addKeyword('allRequired', defFunc.definition);
  return ajv;
};
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    macro: function (schema) {
      if (schema.length == 0) return true;
      if (schema.length == 1) return {required: schema};
      var schemas = schema.map(function (prop) {
        return {required: [prop]};
      });
      return {anyOf: schemas};
    },
    metaSchema: {
      type: 'array',
      items: {
        type: 'string'
      }
    }
  };

  ajv.addKeyword('anyRequired', defFunc.definition);
  return ajv;
};
'use strict';

var util = require('./_util');

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    macro: function (schema) {
      var schemas = [];
      for (var pointer in schema)
        schemas.push(getSchema(pointer, schema[pointer]));
      return {'allOf': schemas};
    },
    metaSchema: {
      type: 'object',
      propertyNames: {
        type: 'string',
        format: 'json-pointer'
      },
      additionalProperties: util.metaSchemaRef(ajv)
    }
  };

  ajv.addKeyword('deepProperties', defFunc.definition);
  return ajv;
};


function getSchema(jsonPointer, schema) {
  var segments = jsonPointer.split('/');
  var rootSchema = {};
  var pointerSchema = rootSchema;
  for (var i=1; i<segments.length; i++) {
    var segment = segments[i];
    var isLast = i == segments.length - 1;
    segment = unescapeJsonPointer(segment);
    var properties = pointerSchema.properties = {};
    var items = undefined;
    if (/[0-9]+/.test(segment)) {
      var count = +segment;
      items = pointerSchema.items = [];
      while (count--) items.push({});
    }
    pointerSchema = isLast ? schema : {};
    properties[segment] = pointerSchema;
    if (items) items.push(pointerSchema);
  }
  return rootSchema;
}


function unescapeJsonPointer(str) {
  return str.replace(/~1/g, '/').replace(/~0/g, '~');
}
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    inline: function (it, keyword, schema) {
      var expr = '';
      for (var i=0; i<schema.length; i++) {
        if (i) expr += ' && ';
        expr += '(' + getData(schema[i], it.dataLevel) + ' !== undefined)';
      }
      return expr;
    },
    metaSchema: {
      type: 'array',
      items: {
        type: 'string',
        format: 'json-pointer'
      }
    }
  };

  ajv.addKeyword('deepRequired', defFunc.definition);
  return ajv;
};


function getData(jsonPointer, lvl) {
  var data = 'data' + (lvl || '');
  if (!jsonPointer) return data;

  var expr = data;
  var segments = jsonPointer.split('/');
  for (var i=1; i<segments.length; i++) {
    var segment = segments[i];
    data += getProperty(unescapeJsonPointer(segment));
    expr += ' && ' + data;
  }
  return expr;
}


var IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i;
var INTEGER = /^[0-9]+$/;
var SINGLE_QUOTE = /'|\\/g;
function getProperty(key) {
  return INTEGER.test(key)
          ? '[' + key + ']'
          : IDENTIFIER.test(key)
            ? '.' + key
            : "['" + key.replace(SINGLE_QUOTE, '\\$&') + "']";
}


function unescapeJsonPointer(str) {
  return str.replace(/~1/g, '/').replace(/~0/g, '~');
}
'use strict';

var sequences = {};

var DEFAULTS = {
  timestamp: function() { return Date.now(); },
  datetime: function() { return (new Date).toISOString(); },
  date: function() { return (new Date).toISOString().slice(0, 10); },
  time: function() { return (new Date).toISOString().slice(11); },
  random: function() { return Math.random(); },
  randomint: function (args) {
    var limit = args && args.max || 2;
    return function() { return Math.floor(Math.random() * limit); };
  },
  seq: function (args) {
    var name = args && args.name || '';
    sequences[name] = sequences[name] || 0;
    return function() { return sequences[name]++; };
  }
};

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    compile: function (schema, parentSchema, it) {
      var funcs = {};

      for (var key in schema) {
        var d = schema[key];
        var func = getDefault(typeof d == 'string' ? d : d.func);
        funcs[key] = func.length ? func(d.args) : func;
      }

      return it.opts.useDefaults && !it.compositeRule
              ? assignDefaults
              : noop;

      function assignDefaults(data) {
        for (var prop in schema){
          if (data[prop] === undefined
            || (it.opts.useDefaults == 'empty'
            && (data[prop] === null || data[prop] === '')))
            data[prop] = funcs[prop]();
        }
        return true;
      }

      function noop() { return true; }
    },
    DEFAULTS: DEFAULTS,
    metaSchema: {
      type: 'object',
      additionalProperties: {
        type: ['string', 'object'],
        additionalProperties: false,
        required: ['func', 'args'],
        properties: {
          func: { type: 'string' },
          args: { type: 'object' }
        }
      }
    }
  };

  ajv.addKeyword('dynamicDefaults', defFunc.definition);
  return ajv;

  function getDefault(d) {
    var def = DEFAULTS[d];
    if (def) return def;
    throw new Error('invalid "dynamicDefaults" keyword property value: ' + d);
  }
};
'use strict';

module.exports = require('./_formatLimit')('Maximum');
'use strict';

module.exports = require('./_formatLimit')('Minimum');
'use strict';

module.exports = {
  'instanceof': require('./instanceof'),
  range: require('./range'),
  regexp: require('./regexp'),
  'typeof': require('./typeof'),
  dynamicDefaults: require('./dynamicDefaults'),
  allRequired: require('./allRequired'),
  anyRequired: require('./anyRequired'),
  oneRequired: require('./oneRequired'),
  prohibited: require('./prohibited'),
  uniqueItemProperties: require('./uniqueItemProperties'),
  deepProperties: require('./deepProperties'),
  deepRequired: require('./deepRequired'),
  formatMinimum: require('./formatMinimum'),
  formatMaximum: require('./formatMaximum'),
  patternRequired: require('./patternRequired'),
  'switch': require('./switch'),
  select: require('./select'),
  transform: require('./transform')
};
'use strict';

var CONSTRUCTORS = {
  Object: Object,
  Array: Array,
  Function: Function,
  Number: Number,
  String: String,
  Date: Date,
  RegExp: RegExp
};

module.exports = function defFunc(ajv) {
  /* istanbul ignore else */
  if (typeof Buffer != 'undefined')
    CONSTRUCTORS.Buffer = Buffer;

  /* istanbul ignore else */
  if (typeof Promise != 'undefined')
    CONSTRUCTORS.Promise = Promise;

  defFunc.definition = {
    compile: function (schema) {
      if (typeof schema == 'string') {
        var Constructor = getConstructor(schema);
        return function (data) {
          return data instanceof Constructor;
        };
      }

      var constructors = schema.map(getConstructor);
      return function (data) {
        for (var i=0; i<constructors.length; i++)
          if (data instanceof constructors[i]) return true;
        return false;
      };
    },
    CONSTRUCTORS: CONSTRUCTORS,
    metaSchema: {
      anyOf: [
        { type: 'string' },
        {
          type: 'array',
          items: { type: 'string' }
        }
      ]
    }
  };

  ajv.addKeyword('instanceof', defFunc.definition);
  return ajv;

  function getConstructor(c) {
    var Constructor = CONSTRUCTORS[c];
    if (Constructor) return Constructor;
    throw new Error('invalid "instanceof" keyword value ' + c);
  }
};
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    macro: function (schema) {
      if (schema.length == 0) return true;
      if (schema.length == 1) return {required: schema};
      var schemas = schema.map(function (prop) {
        return {required: [prop]};
      });
      return {oneOf: schemas};
    },
    metaSchema: {
      type: 'array',
      items: {
        type: 'string'
      }
    }
  };

  ajv.addKeyword('oneRequired', defFunc.definition);
  return ajv;
};
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    inline: require('./dotjs/patternRequired'),
    statements: true,
    errors: 'full',
    metaSchema: {
      type: 'array',
      items: {
        type: 'string',
        format: 'regex'
      },
      uniqueItems: true
    }
  };

  ajv.addKeyword('patternRequired', defFunc.definition);
  return ajv;
};
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'object',
    macro: function (schema) {
      if (schema.length == 0) return true;
      if (schema.length == 1) return {not: {required: schema}};
      var schemas = schema.map(function (prop) {
        return {required: [prop]};
      });
      return {not: {anyOf: schemas}};
    },
    metaSchema: {
      type: 'array',
      items: {
        type: 'string'
      }
    }
  };

  ajv.addKeyword('prohibited', defFunc.definition);
  return ajv;
};
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'number',
    macro: function (schema, parentSchema) {
      var min = schema[0]
        , max = schema[1]
        , exclusive = parentSchema.exclusiveRange;

      validateRangeSchema(min, max, exclusive);

      return exclusive === true
              ? {exclusiveMinimum: min, exclusiveMaximum: max}
              : {minimum: min, maximum: max};
    },
    metaSchema: {
      type: 'array',
      minItems: 2,
      maxItems: 2,
      items: { type: 'number' }
    }
  };

  ajv.addKeyword('range', defFunc.definition);
  ajv.addKeyword('exclusiveRange');
  return ajv;

  function validateRangeSchema(min, max, exclusive) {
    if (exclusive !== undefined && typeof exclusive != 'boolean')
      throw new Error('Invalid schema for exclusiveRange keyword, should be boolean');

    if (min > max || (exclusive && min == max))
      throw new Error('There are no numbers in range');
  }
};
'use strict';

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'string',
    inline: function (it, keyword, schema) {
      return getRegExp() + '.test(data' + (it.dataLevel || '') + ')';

      function getRegExp() {
        try {
          if (typeof schema == 'object')
            return new RegExp(schema.pattern, schema.flags);

          var rx = schema.match(/^\/(.*)\/([gimuy]*)$/);
          if (rx) return new RegExp(rx[1], rx[2]);
          throw new Error('cannot parse string into RegExp');
        } catch(e) {
          console.error('regular expression', schema, 'is invalid');
          throw e;
        }
      }
    },
    metaSchema: {
      type: ['string', 'object'],
      properties: {
        pattern: { type: 'string' },
        flags: { type: 'string' }
      },
      required: ['pattern'],
      additionalProperties: false
    }
  };

  ajv.addKeyword('regexp', defFunc.definition);
  return ajv;
};
'use strict';

var util = require('./_util');

module.exports = function defFunc(ajv) {
  if (!ajv._opts.$data) {
    console.warn('keyword select requires $data option');
    return ajv;
  }
  var metaSchemaRef = util.metaSchemaRef(ajv);
  var compiledCaseSchemas = [];

  defFunc.definition = {
    validate: function v(schema, data, parentSchema) {
      if (parentSchema.selectCases === undefined)
        throw new Error('keyword "selectCases" is absent');
      var compiled = getCompiledSchemas(parentSchema, false);
      var validate = compiled.cases[schema];
      if (validate === undefined) validate = compiled.default;
      if (typeof validate == 'boolean') return validate;
      var valid = validate(data);
      if (!valid) v.errors = validate.errors;
      return valid;
    },
    $data: true,
    metaSchema: { type: ['string', 'number', 'boolean', 'null'] }
  };

  ajv.addKeyword('select', defFunc.definition);
  ajv.addKeyword('selectCases', {
    compile: function (schemas, parentSchema) {
      var compiled = getCompiledSchemas(parentSchema);
      for (var value in schemas)
        compiled.cases[value] = compileOrBoolean(schemas[value]);
      return function() { return true; };
    },
    valid: true,
    metaSchema: {
      type: 'object',
      additionalProperties: metaSchemaRef
    }
  });
  ajv.addKeyword('selectDefault', {
    compile: function (schema, parentSchema) {
      var compiled = getCompiledSchemas(parentSchema);
      compiled.default = compileOrBoolean(schema);
      return function() { return true; };
    },
    valid: true,
    metaSchema: metaSchemaRef
  });
  return ajv;


  function getCompiledSchemas(parentSchema, create) {
    var compiled;
    compiledCaseSchemas.some(function (c) {
      if (c.parentSchema === parentSchema) {
        compiled = c;
        return true;
      }
    });
    if (!compiled && create !== false) {
      compiled = {
        parentSchema: parentSchema,
        cases: {},
        default: true
      };
      compiledCaseSchemas.push(compiled);
    }
    return compiled;
  }

  function compileOrBoolean(schema) {
    return typeof schema == 'boolean'
            ? schema
            : ajv.compile(schema);
  }
};
'use strict';

var util = require('./_util');

module.exports = function defFunc(ajv) {
  if (ajv.RULES.keywords.switch && ajv.RULES.keywords.if) return;

  var metaSchemaRef = util.metaSchemaRef(ajv);

  defFunc.definition = {
    inline: require('./dotjs/switch'),
    statements: true,
    errors: 'full',
    metaSchema: {
      type: 'array',
      items: {
        required: [ 'then' ],
        properties: {
          'if': metaSchemaRef,
          'then': {
            anyOf: [
              { type: 'boolean' },
              metaSchemaRef
            ]
          },
          'continue': { type: 'boolean' }
        },
        additionalProperties: false,
        dependencies: {
          'continue': [ 'if' ]
        }
      }
    }
  };

  ajv.addKeyword('switch', defFunc.definition);
  return ajv;
};
'use strict';

module.exports = function defFunc (ajv) {
  var transform = {
    trimLeft: function (value) {
      return value.replace(/^[\s]+/, '');
    },
    trimRight: function (value) {
      return value.replace(/[\s]+$/, '');
    },
    trim: function (value) {
      return value.trim();
    },
    toLowerCase: function (value) {
      return value.toLowerCase();
    },
    toUpperCase: function (value) {
      return value.toUpperCase();
    },
    toEnumCase: function (value, cfg) {
      return cfg.hash[makeHashTableKey(value)] || value;
    }
  };

  defFunc.definition = {
    type: 'string',
    errors: false,
    modifying: true,
    valid: true,
    compile: function (schema, parentSchema) {
      var cfg;

      if (schema.indexOf('toEnumCase') !== -1) {
        // build hash table to enum values
        cfg = {hash: {}};

        // requires `enum` in schema
        if (!parentSchema.enum)
          throw new Error('Missing enum. To use `transform:["toEnumCase"]`, `enum:[...]` is required.');
        for (var i = parentSchema.enum.length; i--; i) {
          var v = parentSchema.enum[i];
          if (typeof v !== 'string') continue;
          var k = makeHashTableKey(v);
          // requires all `enum` values have unique keys
          if (cfg.hash[k])
            throw new Error('Invalid enum uniqueness. To use `transform:["toEnumCase"]`, all values must be unique when case insensitive.');
          cfg.hash[k] = v;
        }
      }

      return function (data, dataPath, object, key) {
        // skip if value only
        if (!object) return;

        // apply transform in order provided
        for (var j = 0, l = schema.length; j < l; j++)
          data = transform[schema[j]](data, cfg);

        object[key] = data;
      };
    },
    metaSchema: {
      type: 'array',
      items: {
        type: 'string',
        enum: [
          'trimLeft', 'trimRight', 'trim',
          'toLowerCase', 'toUpperCase', 'toEnumCase'
        ]
      }
    }
  };

  ajv.addKeyword('transform', defFunc.definition);
  return ajv;

  function makeHashTableKey (value) {
    return value.toLowerCase();
  }
};
'use strict';

var KNOWN_TYPES = ['undefined', 'string', 'number', 'object', 'function', 'boolean', 'symbol'];

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    inline: function (it, keyword, schema) {
      var data = 'data' + (it.dataLevel || '');
      if (typeof schema == 'string') return 'typeof ' + data + ' == "' + schema + '"';
      schema = 'validate.schema' + it.schemaPath + '.' + keyword;
      return schema + '.indexOf(typeof ' + data + ') >= 0';
    },
    metaSchema: {
      anyOf: [
        {
          type: 'string',
          enum: KNOWN_TYPES
        },
        {
          type: 'array',
          items: {
            type: 'string',
            enum: KNOWN_TYPES
          }
        }
      ]
    }
  };

  ajv.addKeyword('typeof', defFunc.definition);
  return ajv;
};
'use strict';

var SCALAR_TYPES = ['number', 'integer', 'string', 'boolean', 'null'];

module.exports = function defFunc(ajv) {
  defFunc.definition = {
    type: 'array',
    compile: function(keys, parentSchema, it) {
      var equal = it.util.equal;
      var scalar = getScalarKeys(keys, parentSchema);

      return function(data) {
        if (data.length > 1) {
          for (var k=0; k < keys.length; k++) {
            var i, key = keys[k];
            if (scalar[k]) {
              var hash = {};
              for (i = data.length; i--;) {
                if (!data[i] || typeof data[i] != 'object') continue;
                var prop = data[i][key];
                if (prop && typeof prop == 'object') continue;
                if (typeof prop == 'string') prop = '"' + prop;
                if (hash[prop]) return false;
                hash[prop] = true;
              }
            } else {
              for (i = data.length; i--;) {
                if (!data[i] || typeof data[i] != 'object') continue;
                for (var j = i; j--;) {
                  if (data[j] && typeof data[j] == 'object' && equal(data[i][key], data[j][key]))
                    return false;
                }
              }
            }
          }
        }
        return true;
      };
    },
    metaSchema: {
      type: 'array',
      items: {type: 'string'}
    }
  };

  ajv.addKeyword('uniqueItemProperties', defFunc.definition);
  return ajv;
};


function getScalarKeys(keys, schema) {
  return keys.map(function(key) {
    var properties = schema.items && schema.items.properties;
    var propType = properties && properties[key] && properties[key].type;
    return Array.isArray(propType)
            ? propType.indexOf('object') < 0 && propType.indexOf('array') < 0
            : SCALAR_TYPES.indexOf(propType) >= 0;
  });
}
These files are compiled dot templates from dot folder.

Do NOT edit them directly, edit the templates and run `npm run build` from main ajv-keywords folder.
'use strict';
module.exports = function generate__formatLimit(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $errorKeyword;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  out += 'var ' + ($valid) + ' = undefined;';
  if (it.opts.format === false) {
    out += ' ' + ($valid) + ' = true; ';
    return out;
  }
  var $schemaFormat = it.schema.format,
    $isDataFormat = it.opts.$data && $schemaFormat.$data,
    $closingBraces = '';
  if ($isDataFormat) {
    var $schemaValueFormat = it.util.getData($schemaFormat.$data, $dataLvl, it.dataPathArr),
      $format = 'format' + $lvl,
      $compare = 'compare' + $lvl;
    out += ' var ' + ($format) + ' = formats[' + ($schemaValueFormat) + '] , ' + ($compare) + ' = ' + ($format) + ' && ' + ($format) + '.compare;';
  } else {
    var $format = it.formats[$schemaFormat];
    if (!($format && $format.compare)) {
      out += '  ' + ($valid) + ' = true; ';
      return out;
    }
    var $compare = 'formats' + it.util.getProperty($schemaFormat) + '.compare';
  }
  var $isMax = $keyword == 'formatMaximum',
    $exclusiveKeyword = 'formatExclusive' + ($isMax ? 'Maximum' : 'Minimum'),
    $schemaExcl = it.schema[$exclusiveKeyword],
    $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data,
    $op = $isMax ? '<' : '>',
    $result = 'result' + $lvl;
  var $isData = it.opts.$data && $schema && $schema.$data,
    $schemaValue;
  if ($isData) {
    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
    $schemaValue = 'schema' + $lvl;
  } else {
    $schemaValue = $schema;
  }
  if ($isDataExcl) {
    var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),
      $exclusive = 'exclusive' + $lvl,
      $opExpr = 'op' + $lvl,
      $opStr = '\' + ' + $opExpr + ' + \'';
    out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';
    $schemaValueExcl = 'schemaExcl' + $lvl;
    out += ' if (typeof ' + ($schemaValueExcl) + ' != \'boolean\' && ' + ($schemaValueExcl) + ' !== undefined) { ' + ($valid) + ' = false; ';
    var $errorKeyword = $exclusiveKeyword;
    var $$outStack = $$outStack || [];
    $$outStack.push(out);
    out = ''; /* istanbul ignore else */
    if (it.createErrors !== false) {
      out += ' { keyword: \'' + ($errorKeyword || '_formatExclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
      if (it.opts.messages !== false) {
        out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' ';
      }
      if (it.opts.verbose) {
        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
      }
      out += ' } ';
    } else {
      out += ' {} ';
    }
    var __err = out;
    out = $$outStack.pop();
    if (!it.compositeRule && $breakOnError) {
      /* istanbul ignore if */
      if (it.async) {
        out += ' throw new ValidationError([' + (__err) + ']); ';
      } else {
        out += ' validate.errors = [' + (__err) + ']; return false; ';
      }
    } else {
      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
    }
    out += ' }  ';
    if ($breakOnError) {
      $closingBraces += '}';
      out += ' else { ';
    }
    if ($isData) {
      out += ' if (' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'string\') ' + ($valid) + ' = false; else { ';
      $closingBraces += '}';
    }
    if ($isDataFormat) {
      out += ' if (!' + ($compare) + ') ' + ($valid) + ' = true; else { ';
      $closingBraces += '}';
    }
    out += ' var ' + ($result) + ' = ' + ($compare) + '(' + ($data) + ',  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += ' ); if (' + ($result) + ' === undefined) ' + ($valid) + ' = false; var ' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true; if (' + ($valid) + ' === undefined) { ' + ($valid) + ' = ' + ($exclusive) + ' ? ' + ($result) + ' ' + ($op) + ' 0 : ' + ($result) + ' ' + ($op) + '= 0; } if (!' + ($valid) + ') var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\';';
  } else {
    var $exclusive = $schemaExcl === true,
      $opStr = $op;
    if (!$exclusive) $opStr += '=';
    var $opExpr = '\'' + $opStr + '\'';
    if ($isData) {
      out += ' if (' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'string\') ' + ($valid) + ' = false; else { ';
      $closingBraces += '}';
    }
    if ($isDataFormat) {
      out += ' if (!' + ($compare) + ') ' + ($valid) + ' = true; else { ';
      $closingBraces += '}';
    }
    out += ' var ' + ($result) + ' = ' + ($compare) + '(' + ($data) + ',  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += ' ); if (' + ($result) + ' === undefined) ' + ($valid) + ' = false; if (' + ($valid) + ' === undefined) ' + ($valid) + ' = ' + ($result) + ' ' + ($op);
    if (!$exclusive) {
      out += '=';
    }
    out += ' 0;';
  }
  out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { ';
  var $errorKeyword = $keyword;
  var $$outStack = $$outStack || [];
  $$outStack.push(out);
  out = ''; /* istanbul ignore else */
  if (it.createErrors !== false) {
    out += ' { keyword: \'' + ($errorKeyword || '_formatLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit:  ';
    if ($isData) {
      out += '' + ($schemaValue);
    } else {
      out += '' + (it.util.toQuotedString($schema));
    }
    out += ' , exclusive: ' + ($exclusive) + ' } ';
    if (it.opts.messages !== false) {
      out += ' , message: \'should be ' + ($opStr) + ' "';
      if ($isData) {
        out += '\' + ' + ($schemaValue) + ' + \'';
      } else {
        out += '' + (it.util.escapeQuotes($schema));
      }
      out += '"\' ';
    }
    if (it.opts.verbose) {
      out += ' , schema:  ';
      if ($isData) {
        out += 'validate.schema' + ($schemaPath);
      } else {
        out += '' + (it.util.toQuotedString($schema));
      }
      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
    }
    out += ' } ';
  } else {
    out += ' {} ';
  }
  var __err = out;
  out = $$outStack.pop();
  if (!it.compositeRule && $breakOnError) {
    /* istanbul ignore if */
    if (it.async) {
      out += ' throw new ValidationError([' + (__err) + ']); ';
    } else {
      out += ' validate.errors = [' + (__err) + ']; return false; ';
    }
  } else {
    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
  }
  out += '}';
  return out;
}
'use strict';
module.exports = function generate_patternRequired(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $key = 'key' + $lvl,
    $idx = 'idx' + $lvl,
    $matched = 'patternMatched' + $lvl,
    $dataProperties = 'dataProperties' + $lvl,
    $closingBraces = '',
    $ownProperties = it.opts.ownProperties;
  out += 'var ' + ($valid) + ' = true;';
  if ($ownProperties) {
    out += ' var ' + ($dataProperties) + ' = undefined;';
  }
  var arr1 = $schema;
  if (arr1) {
    var $pProperty, i1 = -1,
      l1 = arr1.length - 1;
    while (i1 < l1) {
      $pProperty = arr1[i1 += 1];
      out += ' var ' + ($matched) + ' = false;  ';
      if ($ownProperties) {
        out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';
      } else {
        out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';
      }
      out += ' ' + ($matched) + ' = ' + (it.usePattern($pProperty)) + '.test(' + ($key) + '); if (' + ($matched) + ') break; } ';
      var $missingPattern = it.util.escapeQuotes($pProperty);
      out += ' if (!' + ($matched) + ') { ' + ($valid) + ' = false;  var err =   '; /* istanbul ignore else */
      if (it.createErrors !== false) {
        out += ' { keyword: \'' + ('patternRequired') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingPattern: \'' + ($missingPattern) + '\' } ';
        if (it.opts.messages !== false) {
          out += ' , message: \'should have property matching pattern \\\'' + ($missingPattern) + '\\\'\' ';
        }
        if (it.opts.verbose) {
          out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
        }
        out += ' } ';
      } else {
        out += ' {} ';
      }
      out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; }   ';
      if ($breakOnError) {
        $closingBraces += '}';
        out += ' else { ';
      }
    }
  }
  out += '' + ($closingBraces);
  return out;
}
'use strict';
module.exports = function generate_switch(it, $keyword, $ruleType) {
  var out = ' ';
  var $lvl = it.level;
  var $dataLvl = it.dataLevel;
  var $schema = it.schema[$keyword];
  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
  var $breakOnError = !it.opts.allErrors;
  var $data = 'data' + ($dataLvl || '');
  var $valid = 'valid' + $lvl;
  var $errs = 'errs__' + $lvl;
  var $it = it.util.copy(it);
  var $closingBraces = '';
  $it.level++;
  var $nextValid = 'valid' + $it.level;
  var $ifPassed = 'ifPassed' + it.level,
    $currentBaseId = $it.baseId,
    $shouldContinue;
  out += 'var ' + ($ifPassed) + ';';
  var arr1 = $schema;
  if (arr1) {
    var $sch, $caseIndex = -1,
      l1 = arr1.length - 1;
    while ($caseIndex < l1) {
      $sch = arr1[$caseIndex += 1];
      if ($caseIndex && !$shouldContinue) {
        out += ' if (!' + ($ifPassed) + ') { ';
        $closingBraces += '}';
      }
      if ($sch.if && (it.opts.strictKeywords ? typeof $sch.if == 'object' && Object.keys($sch.if).length > 0 : it.util.schemaHasRules($sch.if, it.RULES.all))) {
        out += ' var ' + ($errs) + ' = errors;   ';
        var $wasComposite = it.compositeRule;
        it.compositeRule = $it.compositeRule = true;
        $it.createErrors = false;
        $it.schema = $sch.if;
        $it.schemaPath = $schemaPath + '[' + $caseIndex + '].if';
        $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/if';
        out += '  ' + (it.validate($it)) + ' ';
        $it.baseId = $currentBaseId;
        $it.createErrors = true;
        it.compositeRule = $it.compositeRule = $wasComposite;
        out += ' ' + ($ifPassed) + ' = ' + ($nextValid) + '; if (' + ($ifPassed) + ') {  ';
        if (typeof $sch.then == 'boolean') {
          if ($sch.then === false) {
            var $$outStack = $$outStack || [];
            $$outStack.push(out);
            out = ''; /* istanbul ignore else */
            if (it.createErrors !== false) {
              out += ' { keyword: \'' + ('switch') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { caseIndex: ' + ($caseIndex) + ' } ';
              if (it.opts.messages !== false) {
                out += ' , message: \'should pass "switch" keyword validation\' ';
              }
              if (it.opts.verbose) {
                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
              }
              out += ' } ';
            } else {
              out += ' {} ';
            }
            var __err = out;
            out = $$outStack.pop();
            if (!it.compositeRule && $breakOnError) {
              /* istanbul ignore if */
              if (it.async) {
                out += ' throw new ValidationError([' + (__err) + ']); ';
              } else {
                out += ' validate.errors = [' + (__err) + ']; return false; ';
              }
            } else {
              out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
            }
          }
          out += ' var ' + ($nextValid) + ' = ' + ($sch.then) + '; ';
        } else {
          $it.schema = $sch.then;
          $it.schemaPath = $schemaPath + '[' + $caseIndex + '].then';
          $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/then';
          out += '  ' + (it.validate($it)) + ' ';
          $it.baseId = $currentBaseId;
        }
        out += '  } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } } ';
      } else {
        out += ' ' + ($ifPassed) + ' = true;  ';
        if (typeof $sch.then == 'boolean') {
          if ($sch.then === false) {
            var $$outStack = $$outStack || [];
            $$outStack.push(out);
            out = ''; /* istanbul ignore else */
            if (it.createErrors !== false) {
              out += ' { keyword: \'' + ('switch') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { caseIndex: ' + ($caseIndex) + ' } ';
              if (it.opts.messages !== false) {
                out += ' , message: \'should pass "switch" keyword validation\' ';
              }
              if (it.opts.verbose) {
                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
              }
              out += ' } ';
            } else {
              out += ' {} ';
            }
            var __err = out;
            out = $$outStack.pop();
            if (!it.compositeRule && $breakOnError) {
              /* istanbul ignore if */
              if (it.async) {
                out += ' throw new ValidationError([' + (__err) + ']); ';
              } else {
                out += ' validate.errors = [' + (__err) + ']; return false; ';
              }
            } else {
              out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
            }
          }
          out += ' var ' + ($nextValid) + ' = ' + ($sch.then) + '; ';
        } else {
          $it.schema = $sch.then;
          $it.schemaPath = $schemaPath + '[' + $caseIndex + '].then';
          $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/then';
          out += '  ' + (it.validate($it)) + ' ';
          $it.baseId = $currentBaseId;
        }
      }
      $shouldContinue = $sch.continue
    }
  }
  out += '' + ($closingBraces) + 'var ' + ($valid) + ' = ' + ($nextValid) + ';';
  return out;
}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}

var {{=$valid}} = undefined;

{{## def.skipFormatLimit:
  {{=$valid}} = true;
  {{ return out; }}
#}}

{{## def.compareFormat:
  {{? $isData }}
    if ({{=$schemaValue}} === undefined) {{=$valid}} = true;
    else if (typeof {{=$schemaValue}} != 'string') {{=$valid}} = false;
    else {
    {{ $closingBraces += '}'; }}
  {{?}}

  {{? $isDataFormat }}
    if (!{{=$compare}}) {{=$valid}} = true;
    else {
    {{ $closingBraces += '}'; }}
  {{?}}

  var {{=$result}} = {{=$compare}}({{=$data}}, {{# def.schemaValueQS }});

  if ({{=$result}} === undefined) {{=$valid}} = false;
#}}


{{? it.opts.format === false }}{{# def.skipFormatLimit }}{{?}}

{{
  var $schemaFormat = it.schema.format
    , $isDataFormat = it.opts.$data && $schemaFormat.$data
    , $closingBraces = '';
}}

{{? $isDataFormat }}
  {{
    var $schemaValueFormat = it.util.getData($schemaFormat.$data, $dataLvl, it.dataPathArr)
      , $format = 'format' + $lvl
      , $compare = 'compare' + $lvl;
  }}

  var {{=$format}} = formats[{{=$schemaValueFormat}}]
    , {{=$compare}} = {{=$format}} && {{=$format}}.compare;
{{??}}
  {{ var $format = it.formats[$schemaFormat]; }}
  {{? !($format && $format.compare) }}
    {{# def.skipFormatLimit }}
  {{?}}
  {{ var $compare = 'formats' + it.util.getProperty($schemaFormat) + '.compare'; }}
{{?}}

{{
  var $isMax = $keyword == 'formatMaximum'
    , $exclusiveKeyword = 'formatExclusive' + ($isMax ? 'Maximum' : 'Minimum')
    , $schemaExcl = it.schema[$exclusiveKeyword]
    , $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data
    , $op = $isMax ? '<' : '>'
    , $result = 'result' + $lvl;
}}

{{# def.$data }}


{{? $isDataExcl }}
  {{
    var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr)
      , $exclusive = 'exclusive' + $lvl
      , $opExpr = 'op' + $lvl
      , $opStr = '\' + ' + $opExpr + ' + \'';
  }}
  var schemaExcl{{=$lvl}} = {{=$schemaValueExcl}};
  {{ $schemaValueExcl = 'schemaExcl' + $lvl; }}

  if (typeof {{=$schemaValueExcl}} != 'boolean' && {{=$schemaValueExcl}} !== undefined) {
    {{=$valid}} = false;
    {{ var $errorKeyword = $exclusiveKeyword; }}
    {{# def.error:'_formatExclusiveLimit' }}
  }

  {{# def.elseIfValid }}

  {{# def.compareFormat }}
  var {{=$exclusive}} = {{=$schemaValueExcl}} === true;

  if ({{=$valid}} === undefined) {
    {{=$valid}} = {{=$exclusive}}
                  ? {{=$result}} {{=$op}} 0
                  : {{=$result}} {{=$op}}= 0;
  }

  if (!{{=$valid}}) var op{{=$lvl}} = {{=$exclusive}} ? '{{=$op}}' : '{{=$op}}=';
{{??}}
  {{
    var $exclusive = $schemaExcl === true
      , $opStr = $op;  /*used in error*/
    if (!$exclusive) $opStr += '=';
    var $opExpr = '\'' + $opStr + '\''; /*used in error*/
  }}

  {{# def.compareFormat }}

  if ({{=$valid}} === undefined)
    {{=$valid}} = {{=$result}} {{=$op}}{{?!$exclusive}}={{?}} 0;
{{?}}

{{= $closingBraces }}

if (!{{=$valid}}) {
  {{ var $errorKeyword = $keyword; }}
  {{# def.error:'_formatLimit' }}
}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}

{{
  var $key = 'key' + $lvl
    , $idx = 'idx' + $lvl
    , $matched = 'patternMatched' + $lvl
    , $dataProperties = 'dataProperties' + $lvl
    , $closingBraces = ''
    , $ownProperties = it.opts.ownProperties;
}}

var {{=$valid}} = true;
{{? $ownProperties }}
  var {{=$dataProperties}} = undefined;
{{?}}

{{~ $schema:$pProperty }}
  var {{=$matched}} = false;
  {{# def.iterateProperties }}
    {{=$matched}} = {{= it.usePattern($pProperty) }}.test({{=$key}});
    if ({{=$matched}}) break;
  }

  {{ var $missingPattern = it.util.escapeQuotes($pProperty); }}
  if (!{{=$matched}}) {
    {{=$valid}} = false;
    {{# def.addError:'patternRequired' }}
  } {{# def.elseIfValid }}
{{~}}

{{= $closingBraces }}
{{# def.definitions }}
{{# def.errors }}
{{# def.setupKeyword }}
{{# def.setupNextLevel }}


{{## def.validateIf:
  {{# def.setCompositeRule }}
  {{ $it.createErrors = false; }}
  {{# def._validateSwitchRule:if }}
  {{ $it.createErrors = true; }}
  {{# def.resetCompositeRule }}
  {{=$ifPassed}} = {{=$nextValid}};
#}}

{{## def.validateThen:
  {{? typeof $sch.then == 'boolean' }}
    {{? $sch.then === false }}
      {{# def.error:'switch' }}
    {{?}}
    var {{=$nextValid}} = {{= $sch.then }};
  {{??}}
    {{# def._validateSwitchRule:then }}
  {{?}}
#}}

{{## def._validateSwitchRule:_clause:
  {{
    $it.schema = $sch._clause;
    $it.schemaPath = $schemaPath + '[' + $caseIndex + ']._clause';
    $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/_clause';
  }}
  {{# def.insertSubschemaCode }}
#}}

{{## def.switchCase:
  {{? $sch.if && {{# def.nonEmptySchema:$sch.if }} }}
    var {{=$errs}} = errors;
    {{# def.validateIf }}
    if ({{=$ifPassed}}) {
      {{# def.validateThen }}  
    } else {
      {{# def.resetErrors }}
    }
  {{??}}
    {{=$ifPassed}} = true;
    {{# def.validateThen }}
  {{?}}
#}}


{{
  var $ifPassed = 'ifPassed' + it.level
    , $currentBaseId = $it.baseId
    , $shouldContinue;
}}
var {{=$ifPassed}};

{{~ $schema:$sch:$caseIndex }}
  {{? $caseIndex && !$shouldContinue }}
    if (!{{=$ifPassed}}) {
    {{ $closingBraces+= '}'; }}
  {{?}}

  {{# def.switchCase }}
  {{ $shouldContinue = $sch.continue }}
{{~}}

{{= $closingBraces }}

var {{=$valid}} = {{=$nextValid}};
.git/
node_modules/
coverage/
build/
assets/
dist/
docs/
tests//**
 * Copyright (c) 2016, David Voiss <davidvoiss@gmail.com>
 *
 * Permission to use, copy, modify, and/or distribute this software for any purpose
 * with or without fee is hereby granted, provided that the above copyright notice
 * and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
 * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
 * THIS SOFTWARE.
*/

/* jshint node: true */
"use strict";

/**
 * A module to get Android versions by API level, NDK level, semantic version, or version name.
 *
 * Versions are referenced from here:
 * {@link https://source.android.com/source/build-numbers.html#platform-code-names-versions-api-levels-and-ndk-releases}
 * {@link https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/Build.java}
 *
 * The version for "Current Development Build" ("CUR_DEVELOPMENT") is not included.
 *
 * @module android-versions
 */

var VERSIONS = {
  BASE:                   { api: 1,     ndk: 0, semver: "1.0",               name: "(no code name)",     },
  BASE_1_1:               { api: 2,     ndk: 0, semver: "1.1",               name: "(no code name)",     },
  CUPCAKE:                { api: 3,     ndk: 1, semver: "1.5",               name: "Cupcake",            },
  DONUT:                  { api: 4,     ndk: 2, semver: "1.6",               name: "Donut",              },
  ECLAIR:                 { api: 5,     ndk: 2, semver: "2.0",               name: "Eclair",             },
  ECLAIR_0_1:             { api: 6,     ndk: 2, semver: "2.0.1",             name: "Eclair",             },
  ECLAIR_MR1:             { api: 7,     ndk: 3, semver: "2.1",               name: "Eclair",             },
  FROYO:                  { api: 8,     ndk: 4, semver: "2.2.x",             name: "Froyo",              },
  GINGERBREAD:            { api: 9,     ndk: 5, semver: "2.3.0 - 2.3.2",     name: "Gingerbread",        },
  GINGERBREAD_MR1:        { api: 10,    ndk: 5, semver: "2.3.3 - 2.3.7",     name: "Gingerbread",        },
  HONEYCOMB:              { api: 11,    ndk: 5, semver: "3.0",               name: "Honeycomb",          },
  HONEYCOMB_MR1:          { api: 12,    ndk: 6, semver: "3.1",               name: "Honeycomb",          },
  HONEYCOMB_MR2:          { api: 13,    ndk: 6, semver: "3.2.x",             name: "Honeycomb",          },
  ICE_CREAM_SANDWICH:     { api: 14,    ndk: 7, semver: "4.0.1 - 4.0.2",     name: "Ice Cream Sandwich", },
  ICE_CREAM_SANDWICH_MR1: { api: 15,    ndk: 8, semver: "4.0.3 - 4.0.4",     name: "Ice Cream Sandwich", },
  JELLY_BEAN:             { api: 16,    ndk: 8, semver: "4.1.x",             name: "Jellybean",          },
  JELLY_BEAN_MR1:         { api: 17,    ndk: 8, semver: "4.2.x",             name: "Jellybean",          },
  JELLY_BEAN_MR2:         { api: 18,    ndk: 8, semver: "4.3.x",             name: "Jellybean",          },
  KITKAT:                 { api: 19,    ndk: 8, semver: "4.4.0 - 4.4.4",     name: "KitKat",             },
  KITKAT_WATCH:           { api: 20,    ndk: 8, semver: "4.4",               name: "KitKat Watch",       },
  LOLLIPOP:               { api: 21,    ndk: 8, semver: "5.0",               name: "Lollipop",           },
  LOLLIPOP_MR1:           { api: 22,    ndk: 8, semver: "5.1",               name: "Lollipop",           },
  M:                      { api: 23,    ndk: 8, semver: "6.0",               name: "Marshmallow",        },
  N:                      { api: 24,    ndk: 8, semver: "7.0",               name: "Nougat",             },
  N_MR1:                  { api: 25,    ndk: 8, semver: "7.1",               name: "Nougat",             },
  O:                      { api: 26,    ndk: 8, semver: "8.0.0",             name: "Oreo",               },
  O_MR1:                  { api: 27,    ndk: 8, semver: "8.1.0",             name: "Oreo",               },
  P:                      { api: 28,    ndk: 8, semver: "9",                 name: "Pie",                },
  Q:                      { api: 29,    ndk: 8, semver: "10",                name: "Android10",          },
  R:                      { api: 30,    ndk: 8, semver: "11",                name: "Android11",          }
}

// Add a key to each version of Android for the "versionCode".
// This is the same key we use in the VERSIONS map above.
Object.keys(VERSIONS).forEach(function(version) {
  VERSIONS[version].versionCode = version
})

var semver = require('semver');

// semver format requires <major>.<minor>.<patch> but we allow just <major>.<minor> format.
// Coerce <major>.<minor> to <major>.<minor>.0
function formatSemver(semver) {
  if (semver.match(/^\d+.\d+$/)) {
    return semver + '.0'
  } else {
    return semver
  }
}

// The default predicate compares against API level, semver, name, or code.
function getFromDefaultPredicate(arg) {
  // Coerce arg to string for comparisons below.
  arg = arg.toString()

  return getFromPredicate(function(version) {
    // Check API level before all else.
    if (arg === version.api.toString()) {
      return true
    }

    var argSemver = formatSemver(arg)
    if (semver.valid(argSemver) && semver.satisfies(argSemver, version.semver)) {
      return true
    }

    // Compare version name and code.
    return arg === version.name || arg === version.versionCode
  })
}

// The function to allow passing a predicate.
function getFromPredicate(predicate) {
  if (predicate === null) {
    return null
  }

  return Object.keys(VERSIONS).filter(function(version) {
    return predicate(VERSIONS[version])
  }).map(function(key) { return VERSIONS[key] })
}

/**
 * The Android version codes available as keys for easier look-up.
 */
Object.keys(VERSIONS).forEach(function(name) {
  exports[name] = VERSIONS[name]
})

/**
 * The complete reference of Android versions for easier look-up.
 */
exports.VERSIONS = VERSIONS

/**
 * Retrieve a single Android version.
 *
 * @param {object | Function} arg - The value or predicate to use to retrieve values.
 *
 * @return {object} An object representing the version found or null if none found.
 */
exports.get = function(arg) {
  var result = exports.getAll(arg)

  if (result === null || result.length === 0) {
    return null
  }

  return result[0]
}

/**
 * Retrieve all Android versions that meet the criteria of the argument.
 *
 * @param {object | Function} arg - The value or predicate to use to retrieve values.
 *
 * @return {object} An object representing the version found or null if none found.
 */
exports.getAll = function(arg) {
  if (arg === null) {
    return null
  }

  if (typeof arg === "function") {
    return getFromPredicate(arg)
  } else {
    return getFromDefaultPredicate(arg)
  }
}{
  "author": {
    "name": "dvoiss"
  },
  "dependencies": {
    "semver": "^5.7.1"
  },
  "deprecated": false,
  "description": "Get the name, API level, version level, NDK level, or version code from any version of Android.",
  "devDependencies": {
    "jshint": "^2.10.2",
    "tape": "^4.11.0"
  },
  "homepage": "https://github.com/dvoiss/android-versions#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "android-versions",
  "pre-commit": [
    "jshint"
  ],
  "repository": {
    "type": "git",
    "url": "git+https://github.com/dvoiss/android-versions.git"
  },
  "version": "1.6.0"
}
0.3.1 / 2016-01-14
==================

  * add MIT LICENSE file (#23, @kasicka)
  * preserve chaining after redundant style-method calls (#19, @drewblaisdell)
  * package: add "license" field (#16, @BenjaminTsai)

0.3.0 / 2014-05-09
==================

  * package: remove "test" script and "devDependencies"
  * package: remove "engines" section
  * pacakge: remove "bin" section
  * package: beautify
  * examples: remove `starwars` example (#15)
  * Documented goto, horizontalAbsolute, and eraseLine methods in README.md (#12, @Jammerwoch)
  * add `.jshintrc` file

< 0.3.0
=======

  * Prehistoric
(The MIT License)

Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Nathan Rajlich",
    "email": "nathan@tootallnate.net",
    "url": "http://tootallnate.net"
  },
  "deprecated": false,
  "description": "Advanced ANSI formatting tool for Node.js",
  "homepage": "https://github.com/TooTallNate/ansi.js#readme",
  "license": "MIT",
  "main": "./lib/ansi.js",
  "name": "ansi",
  "repository": {
    "type": "git",
    "url": "git://github.com/TooTallNate/ansi.js.git"
  },
  "version": "0.3.1"
}
/**
 * References:
 *
 *   - http://en.wikipedia.org/wiki/ANSI_escape_code
 *   - http://www.termsys.demon.co.uk/vtansi.htm
 *
 */

/**
 * Module dependencies.
 */

var emitNewlineEvents = require('./newlines')
  , prefix = '\x1b[' // For all escape codes
  , suffix = 'm'     // Only for color codes

/**
 * The ANSI escape sequences.
 */

var codes = {
    up: 'A'
  , down: 'B'
  , forward: 'C'
  , back: 'D'
  , nextLine: 'E'
  , previousLine: 'F'
  , horizontalAbsolute: 'G'
  , eraseData: 'J'
  , eraseLine: 'K'
  , scrollUp: 'S'
  , scrollDown: 'T'
  , savePosition: 's'
  , restorePosition: 'u'
  , queryPosition: '6n'
  , hide: '?25l'
  , show: '?25h'
}

/**
 * Rendering ANSI codes.
 */

var styles = {
    bold: 1
  , italic: 3
  , underline: 4
  , inverse: 7
}

/**
 * The negating ANSI code for the rendering modes.
 */

var reset = {
    bold: 22
  , italic: 23
  , underline: 24
  , inverse: 27
}

/**
 * The standard, styleable ANSI colors.
 */

var colors = {
    white: 37
  , black: 30
  , blue: 34
  , cyan: 36
  , green: 32
  , magenta: 35
  , red: 31
  , yellow: 33
  , grey: 90
  , brightBlack: 90
  , brightRed: 91
  , brightGreen: 92
  , brightYellow: 93
  , brightBlue: 94
  , brightMagenta: 95
  , brightCyan: 96
  , brightWhite: 97
}


/**
 * Creates a Cursor instance based off the given `writable stream` instance.
 */

function ansi (stream, options) {
  if (stream._ansicursor) {
    return stream._ansicursor
  } else {
    return stream._ansicursor = new Cursor(stream, options)
  }
}
module.exports = exports = ansi

/**
 * The `Cursor` class.
 */

function Cursor (stream, options) {
  if (!(this instanceof Cursor)) {
    return new Cursor(stream, options)
  }
  if (typeof stream != 'object' || typeof stream.write != 'function') {
    throw new Error('a valid Stream instance must be passed in')
  }

  // the stream to use
  this.stream = stream

  // when 'enabled' is false then all the functions are no-ops except for write()
  this.enabled = options && options.enabled
  if (typeof this.enabled === 'undefined') {
    this.enabled = stream.isTTY
  }
  this.enabled = !!this.enabled

  // then `buffering` is true, then `write()` calls are buffered in
  // memory until `flush()` is invoked
  this.buffering = !!(options && options.buffering)
  this._buffer = []

  // controls the foreground and background colors
  this.fg = this.foreground = new Colorer(this, 0)
  this.bg = this.background = new Colorer(this, 10)

  // defaults
  this.Bold = false
  this.Italic = false
  this.Underline = false
  this.Inverse = false

  // keep track of the number of "newlines" that get encountered
  this.newlines = 0
  emitNewlineEvents(stream)
  stream.on('newline', function () {
    this.newlines++
  }.bind(this))
}
exports.Cursor = Cursor

/**
 * Helper function that calls `write()` on the underlying Stream.
 * Returns `this` instead of the write() return value to keep
 * the chaining going.
 */

Cursor.prototype.write = function (data) {
  if (this.buffering) {
    this._buffer.push(arguments)
  } else {
    this.stream.write.apply(this.stream, arguments)
  }
  return this
}

/**
 * Buffer `write()` calls into memory.
 *
 * @api public
 */

Cursor.prototype.buffer = function () {
  this.buffering = true
  return this
}

/**
 * Write out the in-memory buffer.
 *
 * @api public
 */

Cursor.prototype.flush = function () {
  this.buffering = false
  var str = this._buffer.map(function (args) {
    if (args.length != 1) throw new Error('unexpected args length! ' + args.length);
    return args[0];
  }).join('');
  this._buffer.splice(0); // empty
  this.write(str);
  return this
}


/**
 * The `Colorer` class manages both the background and foreground colors.
 */

function Colorer (cursor, base) {
  this.current = null
  this.cursor = cursor
  this.base = base
}
exports.Colorer = Colorer

/**
 * Write an ANSI color code, ensuring that the same code doesn't get rewritten.
 */

Colorer.prototype._setColorCode = function setColorCode (code) {
  var c = String(code)
  if (this.current === c) return
  this.cursor.enabled && this.cursor.write(prefix + c + suffix)
  this.current = c
  return this
}


/**
 * Set up the positional ANSI codes.
 */

Object.keys(codes).forEach(function (name) {
  var code = String(codes[name])
  Cursor.prototype[name] = function () {
    var c = code
    if (arguments.length > 0) {
      c = toArray(arguments).map(Math.round).join(';') + code
    }
    this.enabled && this.write(prefix + c)
    return this
  }
})

/**
 * Set up the functions for the rendering ANSI codes.
 */

Object.keys(styles).forEach(function (style) {
  var name = style[0].toUpperCase() + style.substring(1)
    , c = styles[style]
    , r = reset[style]

  Cursor.prototype[style] = function () {
    if (this[name]) return this
    this.enabled && this.write(prefix + c + suffix)
    this[name] = true
    return this
  }

  Cursor.prototype['reset' + name] = function () {
    if (!this[name]) return this
    this.enabled && this.write(prefix + r + suffix)
    this[name] = false
    return this
  }
})

/**
 * Setup the functions for the standard colors.
 */

Object.keys(colors).forEach(function (color) {
  var code = colors[color]

  Colorer.prototype[color] = function () {
    this._setColorCode(this.base + code)
    return this.cursor
  }

  Cursor.prototype[color] = function () {
    return this.foreground[color]()
  }
})

/**
 * Makes a beep sound!
 */

Cursor.prototype.beep = function () {
  this.enabled && this.write('\x07')
  return this
}

/**
 * Moves cursor to specific position
 */

Cursor.prototype.goto = function (x, y) {
  x = x | 0
  y = y | 0
  this.enabled && this.write(prefix + y + ';' + x + 'H')
  return this
}

/**
 * Resets the color.
 */

Colorer.prototype.reset = function () {
  this._setColorCode(this.base + 39)
  return this.cursor
}

/**
 * Resets all ANSI formatting on the stream.
 */

Cursor.prototype.reset = function () {
  this.enabled && this.write(prefix + '0' + suffix)
  this.Bold = false
  this.Italic = false
  this.Underline = false
  this.Inverse = false
  this.foreground.current = null
  this.background.current = null
  return this
}

/**
 * Sets the foreground color with the given RGB values.
 * The closest match out of the 216 colors is picked.
 */

Colorer.prototype.rgb = function (r, g, b) {
  var base = this.base + 38
    , code = rgb(r, g, b)
  this._setColorCode(base + ';5;' + code)
  return this.cursor
}

/**
 * Same as `cursor.fg.rgb(r, g, b)`.
 */

Cursor.prototype.rgb = function (r, g, b) {
  return this.foreground.rgb(r, g, b)
}

/**
 * Accepts CSS color codes for use with ANSI escape codes.
 * For example: `#FF000` would be bright red.
 */

Colorer.prototype.hex = function (color) {
  return this.rgb.apply(this, hex(color))
}

/**
 * Same as `cursor.fg.hex(color)`.
 */

Cursor.prototype.hex = function (color) {
  return this.foreground.hex(color)
}


// UTIL FUNCTIONS //

/**
 * Translates a 255 RGB value to a 0-5 ANSI RGV value,
 * then returns the single ANSI color code to use.
 */

function rgb (r, g, b) {
  var red = r / 255 * 5
    , green = g / 255 * 5
    , blue = b / 255 * 5
  return rgb5(red, green, blue)
}

/**
 * Turns rgb 0-5 values into a single ANSI color code to use.
 */

function rgb5 (r, g, b) {
  var red = Math.round(r)
    , green = Math.round(g)
    , blue = Math.round(b)
  return 16 + (red*36) + (green*6) + blue
}

/**
 * Accepts a hex CSS color code string (# is optional) and
 * translates it into an Array of 3 RGB 0-255 values, which
 * can then be used with rgb().
 */

function hex (color) {
  var c = color[0] === '#' ? color.substring(1) : color
    , r = c.substring(0, 2)
    , g = c.substring(2, 4)
    , b = c.substring(4, 6)
  return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16)]
}

/**
 * Turns an array-like object into a real array.
 */

function toArray (a) {
  var i = 0
    , l = a.length
    , rtn = []
  for (; i<l; i++) {
    rtn.push(a[i])
  }
  return rtn
}

/**
 * Accepts any node Stream instance and hijacks its "write()" function,
 * so that it can count any newlines that get written to the output.
 *
 * When a '\n' byte is encountered, then a "newline" event will be emitted
 * on the stream, with no arguments. It is up to the listeners to determine
 * any necessary deltas required for their use-case.
 *
 * Ex:
 *
 *   var cursor = ansi(process.stdout)
 *     , ln = 0
 *   process.stdout.on('newline', function () {
 *    ln++
 *   })
 */

/**
 * Module dependencies.
 */

var assert = require('assert')
var NEWLINE = '\n'.charCodeAt(0)

function emitNewlineEvents (stream) {
  if (stream._emittingNewlines) {
    // already emitting newline events
    return
  }

  var write = stream.write

  stream.write = function (data) {
    // first write the data
    var rtn = write.apply(stream, arguments)

    if (stream.listeners('newline').length > 0) {
      var len = data.length
        , i = 0
      // now try to calculate any deltas
      if (typeof data == 'string') {
        for (; i<len; i++) {
          processByte(stream, data.charCodeAt(i))
        }
      } else {
        // buffer
        for (; i<len; i++) {
          processByte(stream, data[i])
        }
      }
    }

    return rtn
  }

  stream._emittingNewlines = true
}
module.exports = emitNewlineEvents


/**
 * Processes an individual byte being written to a stream
 */

function processByte (stream, b) {
  assert.equal(typeof b, 'number')
  if (b === NEWLINE) {
    stream.emit('newline')
  }
}
Copyright (c) 2016, Contributors

Permission to use, copy, modify, and/or distribute this software for any purpose
with or without fee is hereby granted, provided that the above copyright notice
and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
'use strict'

const stringWidth = require('string-width')

function ansiAlign (text, opts) {
  if (!text) return text

  opts = opts || {}
  const align = opts.align || 'center'

  // short-circuit `align: 'left'` as no-op
  if (align === 'left') return text

  const split = opts.split || '\n'
  const pad = opts.pad || ' '
  const widthDiffFn = align !== 'right' ? halfDiff : fullDiff

  let returnString = false
  if (!Array.isArray(text)) {
    returnString = true
    text = String(text).split(split)
  }

  let width
  let maxWidth = 0
  text = text.map(function (str) {
    str = String(str)
    width = stringWidth(str)
    maxWidth = Math.max(width, maxWidth)
    return {
      str,
      width
    }
  }).map(function (obj) {
    return new Array(widthDiffFn(maxWidth, obj.width) + 1).join(pad) + obj.str
  })

  return returnString ? text.join(split) : text
}

ansiAlign.left = function left (text) {
  return ansiAlign(text, { align: 'left' })
}

ansiAlign.center = function center (text) {
  return ansiAlign(text, { align: 'center' })
}

ansiAlign.right = function right (text) {
  return ansiAlign(text, { align: 'right' })
}

module.exports = ansiAlign

function halfDiff (maxWidth, curWidth) {
  return Math.floor((maxWidth - curWidth) / 2)
}

function fullDiff (maxWidth, curWidth) {
  return maxWidth - curWidth
}
{
  "author": {
    "name": "nexdrew"
  },
  "dependencies": {
    "string-width": "^3.0.0"
  },
  "deprecated": false,
  "description": "align-text with ANSI support for CLIs",
  "devDependencies": {
    "ava": "^1.0.1",
    "chalk": "^2.4.1",
    "coveralls": "^3.0.2",
    "nyc": "^13.1.0",
    "standard": "^12.0.1",
    "standard-version": "^4.4.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/nexdrew/ansi-align#readme",
  "license": "ISC",
  "main": "index.js",
  "name": "ansi-align",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/nexdrew/ansi-align.git"
  },
  "version": "3.0.0"
}'use strict';
module.exports = function () {
	return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Regular expression for matching ANSI escape codes",
  "devDependencies": {
    "ava": "0.17.0",
    "xo": "0.16.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/ansi-regex#readme",
  "license": "MIT",
  "maintainers": [
    {
      "name": "Sindre Sorhus",
      "email": "sindresorhus@gmail.com",
      "url": "sindresorhus.com"
    },
    {
      "name": "Joshua Appelman",
      "email": "jappelman@xebia.com",
      "url": "jbnicolai.com"
    },
    {
      "name": "JD Ballard",
      "email": "i.am.qix@gmail.com",
      "url": "github.com/qix-"
    }
  ],
  "name": "ansi-regex",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/ansi-regex.git"
  },
  "version": "2.1.1"
}'use strict';
const colorConvert = require('color-convert');

const wrapAnsi16 = (fn, offset) => function () {
	const code = fn.apply(colorConvert, arguments);
	return `\u001B[${code + offset}m`;
};

const wrapAnsi256 = (fn, offset) => function () {
	const code = fn.apply(colorConvert, arguments);
	return `\u001B[${38 + offset};5;${code}m`;
};

const wrapAnsi16m = (fn, offset) => function () {
	const rgb = fn.apply(colorConvert, arguments);
	return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
};

function assembleStyles() {
	const codes = new Map();
	const styles = {
		modifier: {
			reset: [0, 0],
			// 21 isn't widely supported and 22 does the same thing
			bold: [1, 22],
			dim: [2, 22],
			italic: [3, 23],
			underline: [4, 24],
			inverse: [7, 27],
			hidden: [8, 28],
			strikethrough: [9, 29]
		},
		color: {
			black: [30, 39],
			red: [31, 39],
			green: [32, 39],
			yellow: [33, 39],
			blue: [34, 39],
			magenta: [35, 39],
			cyan: [36, 39],
			white: [37, 39],
			gray: [90, 39],

			// Bright color
			redBright: [91, 39],
			greenBright: [92, 39],
			yellowBright: [93, 39],
			blueBright: [94, 39],
			magentaBright: [95, 39],
			cyanBright: [96, 39],
			whiteBright: [97, 39]
		},
		bgColor: {
			bgBlack: [40, 49],
			bgRed: [41, 49],
			bgGreen: [42, 49],
			bgYellow: [43, 49],
			bgBlue: [44, 49],
			bgMagenta: [45, 49],
			bgCyan: [46, 49],
			bgWhite: [47, 49],

			// Bright color
			bgBlackBright: [100, 49],
			bgRedBright: [101, 49],
			bgGreenBright: [102, 49],
			bgYellowBright: [103, 49],
			bgBlueBright: [104, 49],
			bgMagentaBright: [105, 49],
			bgCyanBright: [106, 49],
			bgWhiteBright: [107, 49]
		}
	};

	// Fix humans
	styles.color.grey = styles.color.gray;

	for (const groupName of Object.keys(styles)) {
		const group = styles[groupName];

		for (const styleName of Object.keys(group)) {
			const style = group[styleName];

			styles[styleName] = {
				open: `\u001B[${style[0]}m`,
				close: `\u001B[${style[1]}m`
			};

			group[styleName] = styles[styleName];

			codes.set(style[0], style[1]);
		}

		Object.defineProperty(styles, groupName, {
			value: group,
			enumerable: false
		});

		Object.defineProperty(styles, 'codes', {
			value: codes,
			enumerable: false
		});
	}

	const ansi2ansi = n => n;
	const rgb2rgb = (r, g, b) => [r, g, b];

	styles.color.close = '\u001B[39m';
	styles.bgColor.close = '\u001B[49m';

	styles.color.ansi = {
		ansi: wrapAnsi16(ansi2ansi, 0)
	};
	styles.color.ansi256 = {
		ansi256: wrapAnsi256(ansi2ansi, 0)
	};
	styles.color.ansi16m = {
		rgb: wrapAnsi16m(rgb2rgb, 0)
	};

	styles.bgColor.ansi = {
		ansi: wrapAnsi16(ansi2ansi, 10)
	};
	styles.bgColor.ansi256 = {
		ansi256: wrapAnsi256(ansi2ansi, 10)
	};
	styles.bgColor.ansi16m = {
		rgb: wrapAnsi16m(rgb2rgb, 10)
	};

	for (let key of Object.keys(colorConvert)) {
		if (typeof colorConvert[key] !== 'object') {
			continue;
		}

		const suite = colorConvert[key];

		if (key === 'ansi16') {
			key = 'ansi';
		}

		if ('ansi16' in suite) {
			styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0);
			styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10);
		}

		if ('ansi256' in suite) {
			styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0);
			styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10);
		}

		if ('rgb' in suite) {
			styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0);
			styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10);
		}
	}

	return styles;
}

// Make the export immutable
Object.defineProperty(module, 'exports', {
	enumerable: true,
	get: assembleStyles
});
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "color-convert": "^1.9.0"
  },
  "deprecated": false,
  "description": "ANSI escape codes for styling strings in the terminal",
  "devDependencies": {
    "ava": "*",
    "babel-polyfill": "^6.23.0",
    "svg-term-cli": "^2.1.1",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/ansi-styles#readme",
  "license": "MIT",
  "name": "ansi-styles",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/ansi-styles.git"
  },
  "version": "3.2.1"
}{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "7zip-bin": "~4.1.0",
    "app-builder-bin": "2.7.1",
    "async-exit-hook": "^2.0.1",
    "bluebird-lst": "^1.0.9",
    "builder-util": "10.1.2",
    "builder-util-runtime": "8.2.5",
    "chromium-pickle-js": "^0.2.0",
    "debug": "^4.1.1",
    "ejs": "^2.6.2",
    "electron-osx-sign": "0.4.11",
    "electron-publish": "20.44.4",
    "fs-extra-p": "^8.0.2",
    "hosted-git-info": "^2.7.1",
    "is-ci": "^2.0.0",
    "isbinaryfile": "^4.0.1",
    "js-yaml": "^3.13.1",
    "lazy-val": "^1.0.4",
    "minimatch": "^3.0.4",
    "normalize-package-data": "^2.5.0",
    "plist": "^3.0.1",
    "read-config-file": "3.2.2",
    "sanitize-filename": "^1.6.1",
    "semver": "^6.1.1",
    "temp-file": "^3.3.3"
  },
  "deprecated": false,
  "description": "electron-builder lib",
  "engines": {
    "node": ">=6.11.4"
  },
  "files": [
    "out",
    "templates",
    "scheme.json",
    "certs/root_certs.keychain"
  ],
  "homepage": "https://github.com/electron-userland/electron-builder",
  "license": "MIT",
  "main": "out/index.js",
  "name": "app-builder-lib",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-builder.git"
  },
  "typings": "./out/index.d.ts",
  "version": "20.44.4"
}{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "additionalProperties": false,
    "definitions": {
        "AppImageOptions": {
            "additionalProperties": false,
            "properties": {
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "category": {
                    "description": "The [application category](https://specifications.freedesktop.org/menu-spec/latest/apa.html#main-category-registry).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "description": {
                    "description": "As [description](/configuration/configuration#Metadata-description) from application package.json, but allows you to specify different for Linux.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "desktop": {
                    "description": "The [Desktop file](https://developer.gnome.org/integration-guide/stable/desktop-files.html.en) entries (name to value)."
                },
                "license": {
                    "description": "The path to EULA license file. Defaults to `license.txt` or `eula.txt` (or uppercase variants). Only plain text is supported.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "mimeTypes": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The mime types in addition to specified in the file associations. Use it if you don't want to register a new mime type, but reuse existing."
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "synopsis": {
                    "description": "The [short description](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "systemIntegration": {
                    "default": "ask",
                    "description": "The system integration installation.",
                    "enum": [
                        "ask",
                        "doNotAsk"
                    ],
                    "type": "string"
                }
            },
            "title": "AppImageOptions",
            "type": "object"
        },
        "AppXOptions": {
            "additionalProperties": false,
            "properties": {
                "addAutoLaunchExtension": {
                    "description": "Whether to add auto launch extension. Defaults to `true` if [electron-winstore-auto-launch](https://github.com/felixrieseberg/electron-winstore-auto-launch) in the dependencies.",
                    "type": "boolean"
                },
                "applicationId": {
                    "description": "The application id. Defaults to `identityName`. Canâ€™t start with numbers.",
                    "type": "string"
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "backgroundColor": {
                    "default": "#464646",
                    "description": "The background color of the app tile. See [Visual Elements](https://msdn.microsoft.com/en-us/library/windows/apps/br211471.aspx).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "displayName": {
                    "description": "A friendly name that can be displayed to users. Corresponds to [Properties.DisplayName](https://msdn.microsoft.com/en-us/library/windows/apps/br211432.aspx).\nDefaults to the application product name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "electronUpdaterAware": {
                    "default": false,
                    "type": "boolean"
                },
                "identityName": {
                    "description": "The name. Corresponds to [Identity.Name](https://msdn.microsoft.com/en-us/library/windows/apps/br211441.aspx). Defaults to the [application name](/configuration/configuration#Metadata-name).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "languages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "The list of [supported languages](https://docs.microsoft.com/en-us/windows/uwp/globalizing/manage-language-and-region#specify-the-supported-languages-in-the-apps-manifest) that will be listed in the Windows Store.\nThe first entry (index 0) will be the default language.\nDefaults to en-US if omitted."
                },
                "makeappxArgs": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "publisher": {
                    "description": "The Windows Store publisher. Not used if AppX is build for testing. See [AppX Package Code Signing](#appx-package-code-signing) below.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "publisherDisplayName": {
                    "description": "A friendly name for the publisher that can be displayed to users. Corresponds to [Properties.PublisherDisplayName](https://msdn.microsoft.com/en-us/library/windows/apps/br211460.aspx).\nDefaults to company name from the application metadata.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "showNameOnTiles": {
                    "description": "Whether to overlay the app's name on top of tile images on the Start screen. Defaults to `false`. (https://docs.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/element-uap-shownameontiles) in the dependencies.",
                    "type": "boolean"
                },
                "setBuildNumber": {
                    "description": "Whether to set build number. See https://github.com/electron-userland/electron-builder/issues/3875",
                    "type": "boolean"
                }
            },
            "title": "AppXOptions",
            "type": "object"
        },
        "AsarOptions": {
            "additionalProperties": false,
            "properties": {
                "externalAllowed": {
                    "default": false,
                    "description": "Allows external asar files.",
                    "type": "boolean"
                },
                "ordering": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "smartUnpack": {
                    "default": true,
                    "description": "Whether to automatically unpack executables files.",
                    "type": "boolean"
                }
            },
            "title": "AsarOptions",
            "type": "object"
        },
        "BintrayOptions": {
            "additionalProperties": false,
            "description": "[Bintray](https://bintray.com/) options. Requires an API key. An API key can be obtained from the user [profile](https://bintray.com/profile/edit) page (\"Edit Your Profile\" -> API Key).\nDefine `BT_TOKEN` environment variable.",
            "properties": {
                "component": {
                    "description": "The Bintray component (Debian only).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "distribution": {
                    "default": "stable",
                    "description": "The Bintray distribution (Debian only).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "owner": {
                    "description": "The owner.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "package": {
                    "description": "The Bintray package name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "provider": {
                    "description": "The provider. Must be `bintray`.",
                    "enum": [
                        "bintray"
                    ],
                    "type": "string"
                },
                "publishAutoUpdate": {
                    "default": true,
                    "description": "Whether to publish auto update info files.\n\nAuto update relies only on the first provider in the list (you can specify several publishers).\nThus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.",
                    "type": "boolean"
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "repo": {
                    "default": "generic",
                    "description": "The Bintray repository name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "token": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "updaterCacheDirName": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "user": {
                    "description": "The Bintray user account. Used in cases where the owner is an organization.",
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "required": [
                "provider"
            ],
            "title": "BintrayOptions",
            "type": "object"
        },
        "CustomPublishOptions": {
            "additionalProperties": {
            },
            "properties": {
                "provider": {
                    "$ref": "#/definitions/PublishProvider",
                    "description": "The provider."
                },
                "publishAutoUpdate": {
                    "default": true,
                    "description": "Whether to publish auto update info files.\n\nAuto update relies only on the first provider in the list (you can specify several publishers).\nThus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.",
                    "type": "boolean"
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "updaterCacheDirName": {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "required": [
                "provider"
            ],
            "title": "CustomPublishOptions",
            "type": "object"
        },
        "DebOptions": {
            "additionalProperties": false,
            "properties": {
                "afterInstall": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "afterRemove": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "category": {
                    "description": "The [application category](https://specifications.freedesktop.org/menu-spec/latest/apa.html#main-category-registry).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "compression": {
                    "anyOf": [
                        {
                            "enum": [
                                "bzip2",
                                "gz",
                                "xz"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "xz",
                    "description": "The compression type."
                },
                "depends": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Package dependencies. Defaults to `[\"gconf2\", \"gconf-service\", \"libnotify4\", \"libappindicator1\", \"libxtst6\", \"libnss3\"]`."
                },
                "description": {
                    "description": "As [description](/configuration/configuration#Metadata-description) from application package.json, but allows you to specify different for Linux.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "desktop": {
                    "description": "The [Desktop file](https://developer.gnome.org/integration-guide/stable/desktop-files.html.en) entries (name to value)."
                },
                "fpm": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "*Advanced only* The [fpm](https://github.com/jordansissel/fpm/wiki#usage) options.\n\nExample: `[\"--before-install=build/deb-preinstall.sh\", \"--after-upgrade=build/deb-postinstall.sh\"]`"
                },
                "icon": {
                    "type": "string"
                },
                "maintainer": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "mimeTypes": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The mime types in addition to specified in the file associations. Use it if you don't want to register a new mime type, but reuse existing."
                },
                "packageCategory": {
                    "description": "The [package category](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Section).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "priority": {
                    "description": "The [Priority](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Priority) attribute.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "synopsis": {
                    "description": "The [short description](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "vendor": {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "title": "DebOptions",
            "type": "object"
        },
        "DmgContent": {
            "additionalProperties": false,
            "properties": {
                "name": {
                    "description": "The name of the file within the DMG. Defaults to basename of `path`.",
                    "type": "string"
                },
                "path": {
                    "description": "The path of the file within the DMG.",
                    "type": "string"
                },
                "type": {
                    "enum": [
                        "dir",
                        "file",
                        "link"
                    ],
                    "type": "string"
                },
                "x": {
                    "type": "number"
                },
                "y": {
                    "type": "number"
                }
            },
            "required": [
                "x",
                "y"
            ],
            "title": "DmgContent",
            "type": "object"
        },
        "DmgOptions": {
            "additionalProperties": false,
            "properties": {
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "background": {
                    "description": "The path to background image (default: `build/background.tiff` or `build/background.png` if exists). The resolution of this file determines the resolution of the installer window.\nIf background is not specified, use `window.size`. Default locations expected background size to be 540x380.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "backgroundColor": {
                    "description": "The background color (accepts css colors). Defaults to `#ffffff` (white) if no background image.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "contents": {
                    "description": "The content â€” to customize icon locations.",
                    "items": {
                        "$ref": "#/definitions/DmgContent"
                    },
                    "type": "array"
                },
                "format": {
                    "default": "UDZO",
                    "description": "The disk image format. `ULFO` (lzfse-compressed image (OS X 10.11+ only)).",
                    "enum": [
                        "UDBZ",
                        "UDCO",
                        "UDRO",
                        "UDRW",
                        "UDZO",
                        "ULFO"
                    ],
                    "type": "string"
                },
                "icon": {
                    "description": "The path to DMG icon (volume icon), which will be shown when mounted, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to the application icon (`build/icon.icns`).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "iconSize": {
                    "default": 80,
                    "description": "The size of all the icons inside the DMG.",
                    "type": [
                        "null",
                        "number"
                    ]
                },
                "iconTextSize": {
                    "default": 12,
                    "description": "The size of all the icon texts inside the DMG.",
                    "type": [
                        "null",
                        "number"
                    ]
                },
                "internetEnabled": {
                    "default": false,
                    "description": "Whether to create internet-enabled disk image (when it is downloaded using a browser it will automatically decompress the image, put the application on the desktop, unmount and remove the disk image file).",
                    "type": "boolean"
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "title": {
                    "default": "${productName} ${version}",
                    "description": "The title of the produced DMG, which will be shown when mounted (volume name).\n\nMacro `${productName}`, `${version}` and `${name}` are supported.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "window": {
                    "$ref": "#/definitions/DmgWindow",
                    "description": "The DMG windows position and size."
                },
                "sign": {
                    "default": false,
                    "description": "Disable signing of the DMG when building. This can help solve issues with Gatekeeper disabling installation of your app.",
                    "type": "boolean"
                }
            },
            "title": "DmgOptions",
            "type": "object"
        },
        "DmgWindow": {
            "additionalProperties": false,
            "properties": {
                "height": {
                    "description": "The height. Defaults to background image height or 380.",
                    "type": "number"
                },
                "width": {
                    "description": "The width. Defaults to background image width or 540.",
                    "type": "number"
                },
                "x": {
                    "default": 400,
                    "description": "The X position relative to left of the screen.",
                    "type": "number"
                },
                "y": {
                    "default": 100,
                    "description": "The Y position relative to top of the screen.",
                    "type": "number"
                }
            },
            "title": "DmgWindow",
            "type": "object"
        },
        "ElectronDownloadOptions": {
            "additionalProperties": false,
            "properties": {
                "arch": {
                    "type": "string"
                },
                "cache": {
                    "description": "The [cache location](https://github.com/electron-userland/electron-download#cache-location).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "customDir": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "customFilename": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "isVerifyChecksum": {
                    "type": "boolean"
                },
                "mirror": {
                    "description": "The mirror.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "platform": {
                    "enum": [
                        "darwin",
                        "linux",
                        "mas",
                        "win32"
                    ],
                    "type": "string"
                },
                "strictSSL": {
                    "type": "boolean"
                },
                "version": {
                    "type": "string"
                }
            },
            "title": "ElectronDownloadOptions",
            "type": "object"
        },
        "FileAssociation": {
            "additionalProperties": false,
            "description": "File associations.\n\nmacOS (corresponds to [CFBundleDocumentTypes](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-101685)) and NSIS only.\n\nOn Windows works only if [nsis.perMachine](https://electron.build/configuration/configuration#NsisOptions-perMachine) is set to `true`.",
            "properties": {
                "description": {
                    "description": "*windows-only.* The description.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "ext": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "string"
                        }
                    ],
                    "description": "The extension (minus the leading period). e.g. `png`."
                },
                "icon": {
                    "description": "The path to icon (`.icns` for MacOS and `.ico` for Windows), relative to `build` (build resources directory). Defaults to `${firstExt}.icns`/`${firstExt}.ico` (if several extensions specified, first is used) or to application icon.\n\nNot supported on Linux, file issue if need (default icon will be `x-office-document`).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "isPackage": {
                    "description": "*macOS-only* Whether the document is distributed as a bundle. If set to true, the bundle directory is treated as a file. Corresponds to `LSTypeIsPackage`.",
                    "type": "boolean"
                },
                "mimeType": {
                    "description": "*linux-only.* The mime-type.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "name": {
                    "description": "The name. e.g. `PNG`. Defaults to `ext`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "role": {
                    "default": "Editor",
                    "description": "*macOS-only* The appâ€™s role with respect to the type. The value can be `Editor`, `Viewer`, `Shell`, or `None`. Corresponds to `CFBundleTypeRole`.",
                    "type": "string"
                }
            },
            "required": [
                "ext"
            ],
            "title": "FileAssociation",
            "type": "object"
        },
        "FileSet": {
            "additionalProperties": false,
            "properties": {
                "filter": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "string"
                        }
                    ],
                    "description": "The [glob patterns](/file-patterns)."
                },
                "from": {
                    "description": "The source path relative to the project directory.",
                    "type": "string"
                },
                "to": {
                    "description": "The destination path relative to the app's content directory for `extraFiles` and the app's resource directory for `extraResources`.",
                    "type": "string"
                }
            },
            "title": "FileSet",
            "type": "object"
        },
        "GenericServerOptions": {
            "additionalProperties": false,
            "description": "Generic (any HTTP(S) server) options.\nIn all publish options [File Macros](/file-patterns#file-macros) are supported.",
            "properties": {
                "channel": {
                    "default": "latest",
                    "description": "The channel.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "provider": {
                    "description": "The provider. Must be `generic`.",
                    "enum": [
                        "generic"
                    ],
                    "type": "string"
                },
                "publishAutoUpdate": {
                    "default": true,
                    "description": "Whether to publish auto update info files.\n\nAuto update relies only on the first provider in the list (you can specify several publishers).\nThus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.",
                    "type": "boolean"
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "updaterCacheDirName": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "url": {
                    "description": "The base url. e.g. `https://bucket_name.s3.amazonaws.com`.",
                    "type": "string"
                },
                "useMultipleRangeRequest": {
                    "description": "Whether to use multiple range requests for differential update. Defaults to `true` if `url` doesn't contain `s3.amazonaws.com`.",
                    "type": "boolean"
                }
            },
            "required": [
                "provider",
                "url"
            ],
            "title": "GenericServerOptions",
            "type": "object"
        },
        "GithubOptions": {
            "additionalProperties": false,
            "description": "[GitHub](https://help.github.com/articles/about-releases/) options.\n\nGitHub [personal access token](https://help.github.com/articles/creating-an-access-token-for-command-line-use/) is required. You can generate by going to [https://github.com/settings/tokens/new](https://github.com/settings/tokens/new). The access token should have the repo scope/permission.\nDefine `GH_TOKEN` environment variable.",
            "properties": {
                "host": {
                    "default": "github.com",
                    "description": "The host (including the port if need).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "owner": {
                    "description": "The owner.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "private": {
                    "description": "Whether to use private github auto-update provider if `GH_TOKEN` environment variable is defined. See [Private GitHub Update Repo](/auto-update#private-github-update-repo).",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "protocol": {
                    "anyOf": [
                        {
                            "enum": [
                                "http",
                                "https"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "https",
                    "description": "The protocol. GitHub Publisher supports only `https`."
                },
                "provider": {
                    "description": "The provider. Must be `github`.",
                    "enum": [
                        "github"
                    ],
                    "type": "string"
                },
                "publishAutoUpdate": {
                    "default": true,
                    "description": "Whether to publish auto update info files.\n\nAuto update relies only on the first provider in the list (you can specify several publishers).\nThus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.",
                    "type": "boolean"
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "releaseType": {
                    "anyOf": [
                        {
                            "enum": [
                                "draft",
                                "prerelease",
                                "release"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "draft",
                    "description": "The type of release. By default `draft` release will be created.\n\nAlso you can set release type using environment variable. If `EP_DRAFT`is set to `true` â€” `draft`, if `EP_PRE_RELEASE`is set to `true` â€” `prerelease`."
                },
                "repo": {
                    "description": "The repository name. [Detected automatically](#github-repository-and-bintray-package).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "token": {
                    "description": "The access token to support auto-update from private github repositories. Never specify it in the configuration files. Only for [setFeedURL](/auto-update#appupdatersetfeedurloptions).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "updaterCacheDirName": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "vPrefixedTagName": {
                    "default": true,
                    "description": "Whether to use `v`-prefixed tag name.",
                    "type": "boolean"
                }
            },
            "required": [
                "provider"
            ],
            "title": "GithubOptions",
            "type": "object"
        },
        "LinuxConfiguration": {
            "additionalProperties": false,
            "properties": {
                "appId": {
                    "default": "com.electron.${name}",
                    "description": "The application id. Used as [CFBundleIdentifier](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070) for MacOS and as\n[Application User Model ID](https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx) for Windows (NSIS target only, Squirrel.Windows not supported). It is strongly recommended that an explicit ID is set.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName}-${version}.${ext}` (some target can have other defaults, see corresponding options).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "asar": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/AsarOptions"
                        },
                        {
                            "type": [
                                "null",
                                "boolean"
                            ]
                        }
                    ],
                    "default": true,
                    "description": "Whether to package the application's source code into an archive, using [Electron's archive format](http://electron.atom.io/docs/tutorial/application-packaging/).\n\nNode modules, that must be unpacked, will be detected automatically, you don't need to explicitly set [asarUnpack](#configuration-asarUnpack) - please file an issue if this doesn't work."
                },
                "asarUnpack": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "A [glob patterns](/file-patterns) relative to the [app directory](#MetadataDirectories-app), which specifies which files to unpack when creating the [asar](http://electron.atom.io/docs/tutorial/application-packaging/) archive."
                },
                "category": {
                    "description": "The [application category](https://specifications.freedesktop.org/menu-spec/latest/apa.html#main-category-registry).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "compression": {
                    "anyOf": [
                        {
                            "enum": [
                                "maximum",
                                "normal",
                                "store"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "normal",
                    "description": "The compression level. If you want to rapidly test build, `store` can reduce build time significantly. `maximum` doesn't lead to noticeable size difference, but increase build time."
                },
                "cscKeyPassword": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscLink": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "depends": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "description": {
                    "description": "As [description](/configuration/configuration#Metadata-description) from application package.json, but allows you to specify different for Linux.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "desktop": {
                    "description": "The [Desktop file](https://developer.gnome.org/integration-guide/stable/desktop-files.html.en) entries (name to value)."
                },
                "detectUpdateChannel": {
                    "default": true,
                    "description": "Whether to infer update channel from application version pre-release components. e.g. if version `0.12.1-alpha.1`, channel will be set to `alpha`. Otherwise to `latest`.",
                    "type": "boolean"
                },
                "electronUpdaterCompatibility": {
                    "description": "The [electron-updater compatibility](/auto-update#compatibility) semver range.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "executableName": {
                    "description": "The executable name. Defaults to `productName`.\nCannot be specified per target, allowed only in the `linux`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "extraFiles": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "extraResources": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "fileAssociations": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileAssociation"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/FileAssociation"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The file associations."
                },
                "files": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "forceCodeSigning": {
                    "description": "Whether to fail if app will be not code signed.",
                    "type": "boolean"
                },
                "generateUpdatesFilesForAllChannels": {
                    "default": false,
                    "description": "Please see [Building and Releasing using Channels](https://github.com/electron-userland/electron-builder/issues/1182#issuecomment-324947139).",
                    "type": "boolean"
                },
                "icon": {
                    "description": "The path to icon set directory or one png file, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory. The icon filename must contain the size (e.g. 32x32.png) of the icon.\nBy default will be generated automatically based on the macOS icns file.",
                    "type": "string"
                },
                "maintainer": {
                    "description": "The maintainer. Defaults to [author](/configuration/configuration#Metadata-author).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "mimeTypes": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The mime types in addition to specified in the file associations. Use it if you don't want to register a new mime type, but reuse existing."
                },
                "packageCategory": {
                    "description": "backward compatibility + to allow specify fpm-only category for all possible fpm targets in one place",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "protocols": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/Protocol"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/Protocol"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The URL protocol schemes."
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "releaseInfo": {
                    "$ref": "#/definitions/ReleaseInfo",
                    "description": "The release info. Intended for command line usage:\n\n```\n-c.releaseInfo.releaseNotes=\"new features\"\n```"
                },
                "synopsis": {
                    "description": "The [short description](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "target": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/TargetConfiguration"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/TargetConfiguration"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "default": "AppImage",
                    "description": "Target package type: list of `AppImage`, `snap`, `deb`, `rpm`, `freebsd`, `pacman`, `p5p`, `apk`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`.\n\nelectron-builder [docker image](/multi-platform-build#docker) can be used to build Linux targets on any platform.\n\nPlease [do not put an AppImage into another archive](https://github.com/probonopd/AppImageKit/wiki/Creating-AppImages#common-mistake) like a .zip or .tar.gz."
                },
                "vendor": {
                    "description": "The vendor. Defaults to [author](/configuration/configuration#Metadata-author).",
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "title": "LinuxConfiguration",
            "type": "object"
        },
        "LinuxTargetSpecificOptions": {
            "additionalProperties": false,
            "properties": {
                "afterInstall": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "afterRemove": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "category": {
                    "description": "The [application category](https://specifications.freedesktop.org/menu-spec/latest/apa.html#main-category-registry).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "compression": {
                    "anyOf": [
                        {
                            "enum": [
                                "bzip2",
                                "gz",
                                "xz"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "xz",
                    "description": "The compression type."
                },
                "depends": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Package dependencies."
                },
                "description": {
                    "description": "As [description](/configuration/configuration#Metadata-description) from application package.json, but allows you to specify different for Linux.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "desktop": {
                    "description": "The [Desktop file](https://developer.gnome.org/integration-guide/stable/desktop-files.html.en) entries (name to value)."
                },
                "fpm": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "*Advanced only* The [fpm](https://github.com/jordansissel/fpm/wiki#usage) options.\n\nExample: `[\"--before-install=build/deb-preinstall.sh\", \"--after-upgrade=build/deb-postinstall.sh\"]`"
                },
                "icon": {
                    "type": "string"
                },
                "maintainer": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "mimeTypes": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The mime types in addition to specified in the file associations. Use it if you don't want to register a new mime type, but reuse existing."
                },
                "packageCategory": {
                    "description": "The package category.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "synopsis": {
                    "description": "The [short description](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "vendor": {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "title": "LinuxTargetSpecificOptions",
            "type": "object"
        },
        "MacConfiguration": {
            "additionalProperties": false,
            "properties": {
                "appId": {
                    "default": "com.electron.${name}",
                    "description": "The application id. Used as [CFBundleIdentifier](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070) for MacOS and as\n[Application User Model ID](https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx) for Windows (NSIS target only, Squirrel.Windows not supported). It is strongly recommended that an explicit ID is set.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName}-${version}.${ext}` (some target can have other defaults, see corresponding options).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "asar": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/AsarOptions"
                        },
                        {
                            "type": [
                                "null",
                                "boolean"
                            ]
                        }
                    ],
                    "default": true,
                    "description": "Whether to package the application's source code into an archive, using [Electron's archive format](http://electron.atom.io/docs/tutorial/application-packaging/).\n\nNode modules, that must be unpacked, will be detected automatically, you don't need to explicitly set [asarUnpack](#configuration-asarUnpack) - please file an issue if this doesn't work."
                },
                "asarUnpack": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "A [glob patterns](/file-patterns) relative to the [app directory](#MetadataDirectories-app), which specifies which files to unpack when creating the [asar](http://electron.atom.io/docs/tutorial/application-packaging/) archive."
                },
                "binaries": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Paths of any extra binaries that need to be signed."
                },
                "bundleShortVersion": {
                    "description": "The `CFBundleShortVersionString`. Do not use it unless you need to.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "bundleVersion": {
                    "description": "The `CFBundleVersion`. Do not use it unless [you need to](https://github.com/electron-userland/electron-builder/issues/565#issuecomment-230678643).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "category": {
                    "description": "The application category type, as shown in the Finder via *View -> Arrange by Application Category* when viewing the Applications directory.\n\nFor example, `\"category\": \"public.app-category.developer-tools\"` will set the application category to *Developer Tools*.\n\nValid values are listed in [Apple's documentation](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW8).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "compression": {
                    "anyOf": [
                        {
                            "enum": [
                                "maximum",
                                "normal",
                                "store"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "normal",
                    "description": "The compression level. If you want to rapidly test build, `store` can reduce build time significantly. `maximum` doesn't lead to noticeable size difference, but increase build time."
                },
                "cscInstallerKeyPassword": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscInstallerLink": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscKeyPassword": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscLink": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "darkModeSupport": {
                    "default": false,
                    "description": "Whether a dark mode is supported. If your app does have a dark mode, you can make your app follow the system-wide dark mode setting.",
                    "type": "boolean"
                },
                "hardenedRuntime": {
                    "default": false,
                    "description": "Whether your app has to be signed with hardened runtime.",
                    "type": "boolean"
                },
                "gatekeeperAssess": {
                    "default": false,
                    "description": "Whether to let electron-osx-sign validate the signing or not.",
                    "type": "boolean"
                },
                "detectUpdateChannel": {
                    "default": true,
                    "description": "Whether to infer update channel from application version pre-release components. e.g. if version `0.12.1-alpha.1`, channel will be set to `alpha`. Otherwise to `latest`.",
                    "type": "boolean"
                },
                "electronLanguages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "string"
                        }
                    ],
                    "description": "The electron locales. By default Electron locales used as is."
                },
                "electronUpdaterCompatibility": {
                    "description": "The [electron-updater compatibility](/auto-update#compatibility) semver range.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "entitlements": {
                    "description": "The path to entitlements file for signing the app. `build/entitlements.mac.plist` will be used if exists (it is a recommended way to set).\nMAS entitlements is specified in the [mas](/configuration/mas).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "entitlementsInherit": {
                    "description": "The path to child entitlements which inherit the security settings for signing frameworks and bundles of a distribution. `build/entitlements.mac.inherit.plist` will be used if exists (it is a recommended way to set).\nOtherwise [default](https://github.com/electron-userland/electron-osx-sign/blob/master/default.entitlements.darwin.inherit.plist).\n\nThis option only applies when signing with `entitlements` provided.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "extendInfo": {
                    "description": "The extra entries for `Info.plist`."
                },
                "extraDistFiles": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "Extra files to put in archive. Not applicable for `tar.*`."
                },
                "extraFiles": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "extraResources": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "fileAssociations": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileAssociation"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/FileAssociation"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The file associations."
                },
                "files": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "forceCodeSigning": {
                    "description": "Whether to fail if app will be not code signed.",
                    "type": "boolean"
                },
                "generateUpdatesFilesForAllChannels": {
                    "default": false,
                    "description": "Please see [Building and Releasing using Channels](https://github.com/electron-userland/electron-builder/issues/1182#issuecomment-324947139).",
                    "type": "boolean"
                },
                "helperBundleId": {
                    "default": "${appBundleIdentifier}.helper",
                    "description": "The bundle identifier to use in the application helper's plist.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "icon": {
                    "default": "build/icon.icns",
                    "description": "The path to application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "identity": {
                    "description": "The name of certificate to use when signing. Consider using environment variables [CSC_LINK or CSC_NAME](/code-signing) instead of specifying this option.\nMAS installer identity is specified in the [mas](/configuration/mas).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "minimumSystemVersion": {
                    "description": "The minimum version of macOS required for the app to run. Corresponds to `LSMinimumSystemVersion`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "protocols": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/Protocol"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/Protocol"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The URL protocol schemes."
                },
                "provisioningProfile": {
                    "description": "The path to the provisioning profile to use when signing, absolute or relative to the app root.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "releaseInfo": {
                    "$ref": "#/definitions/ReleaseInfo",
                    "description": "The release info. Intended for command line usage:\n\n```\n-c.releaseInfo.releaseNotes=\"new features\"\n```"
                },
                "requirements": {
                    "description": "Path of [requirements file](https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/RequirementLang/RequirementLang.html) used in signing. Not applicable for MAS.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "target": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/TargetConfiguration"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/TargetConfiguration"
                                    },
                                    {
                                        "enum": [
                                            "7z",
                                            "default",
                                            "dir",
                                            "dmg",
                                            "mas",
                                            "mas-dev",
                                            "pkg",
                                            "tar.bz2",
                                            "tar.gz",
                                            "tar.lz",
                                            "tar.xz",
                                            "zip"
                                        ],
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "enum": [
                                "7z",
                                "default",
                                "dir",
                                "dmg",
                                "mas",
                                "mas-dev",
                                "pkg",
                                "tar.bz2",
                                "tar.gz",
                                "tar.lz",
                                "tar.xz",
                                "zip"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The target package type: list of `default`, `dmg`, `mas`, `mas-dev`, `pkg`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`. Defaults to `default` (dmg and zip for Squirrel.Mac)."
                },
                "type": {
                    "anyOf": [
                        {
                            "enum": [
                                "development",
                                "distribution"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "distribution",
                    "description": "Whether to sign app for development or for distribution."
                }
            },
            "title": "MacConfiguration",
            "type": "object"
        },
        "MasConfiguration": {
            "additionalProperties": false,
            "properties": {
                "appId": {
                    "default": "com.electron.${name}",
                    "description": "The application id. Used as [CFBundleIdentifier](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070) for MacOS and as\n[Application User Model ID](https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx) for Windows (NSIS target only, Squirrel.Windows not supported). It is strongly recommended that an explicit ID is set.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName}-${version}.${ext}` (some target can have other defaults, see corresponding options).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "asar": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/AsarOptions"
                        },
                        {
                            "type": [
                                "null",
                                "boolean"
                            ]
                        }
                    ],
                    "default": true,
                    "description": "Whether to package the application's source code into an archive, using [Electron's archive format](http://electron.atom.io/docs/tutorial/application-packaging/).\n\nNode modules, that must be unpacked, will be detected automatically, you don't need to explicitly set [asarUnpack](#configuration-asarUnpack) - please file an issue if this doesn't work."
                },
                "asarUnpack": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "A [glob patterns](/file-patterns) relative to the [app directory](#MetadataDirectories-app), which specifies which files to unpack when creating the [asar](http://electron.atom.io/docs/tutorial/application-packaging/) archive."
                },
                "binaries": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Paths of any extra binaries that need to be signed."
                },
                "bundleShortVersion": {
                    "description": "The `CFBundleShortVersionString`. Do not use it unless you need to.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "bundleVersion": {
                    "description": "The `CFBundleVersion`. Do not use it unless [you need to](https://github.com/electron-userland/electron-builder/issues/565#issuecomment-230678643).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "category": {
                    "description": "The application category type, as shown in the Finder via *View -> Arrange by Application Category* when viewing the Applications directory.\n\nFor example, `\"category\": \"public.app-category.developer-tools\"` will set the application category to *Developer Tools*.\n\nValid values are listed in [Apple's documentation](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW8).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "compression": {
                    "anyOf": [
                        {
                            "enum": [
                                "maximum",
                                "normal",
                                "store"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "normal",
                    "description": "The compression level. If you want to rapidly test build, `store` can reduce build time significantly. `maximum` doesn't lead to noticeable size difference, but increase build time."
                },
                "cscInstallerKeyPassword": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscInstallerLink": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscKeyPassword": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscLink": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "darkModeSupport": {
                    "default": false,
                    "description": "Whether a dark mode is supported. If your app does have a dark mode, you can make your app follow the system-wide dark mode setting.",
                    "type": "boolean"
                },
                "hardenedRuntime": {
                    "default": false,
                    "description": "Whether your app has to be signed with hardened runtime.",
                    "type": "boolean"
                },
                "detectUpdateChannel": {
                    "default": true,
                    "description": "Whether to infer update channel from application version pre-release components. e.g. if version `0.12.1-alpha.1`, channel will be set to `alpha`. Otherwise to `latest`.",
                    "type": "boolean"
                },
                "electronLanguages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "string"
                        }
                    ],
                    "description": "The electron locales. By default Electron locales used as is."
                },
                "electronUpdaterCompatibility": {
                    "description": "The [electron-updater compatibility](/auto-update#compatibility) semver range.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "entitlements": {
                    "description": "The path to entitlements file for signing the app. `build/entitlements.mas.plist` will be used if exists (it is a recommended way to set).\nOtherwise [default](https://github.com/electron-userland/electron-osx-sign/blob/master/default.entitlements.mas.plist).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "entitlementsInherit": {
                    "description": "The path to child entitlements which inherit the security settings for signing frameworks and bundles of a distribution. `build/entitlements.mas.inherit.plist` will be used if exists (it is a recommended way to set).\nOtherwise [default](https://github.com/electron-userland/electron-osx-sign/blob/master/default.entitlements.mas.inherit.plist).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "extendInfo": {
                    "description": "The extra entries for `Info.plist`."
                },
                "extraDistFiles": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "Extra files to put in archive. Not applicable for `tar.*`."
                },
                "extraFiles": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "extraResources": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "fileAssociations": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileAssociation"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/FileAssociation"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The file associations."
                },
                "files": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "forceCodeSigning": {
                    "description": "Whether to fail if app will be not code signed.",
                    "type": "boolean"
                },
                "generateUpdatesFilesForAllChannels": {
                    "default": false,
                    "description": "Please see [Building and Releasing using Channels](https://github.com/electron-userland/electron-builder/issues/1182#issuecomment-324947139).",
                    "type": "boolean"
                },
                "helperBundleId": {
                    "default": "${appBundleIdentifier}.helper",
                    "description": "The bundle identifier to use in the application helper's plist.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "icon": {
                    "default": "build/icon.icns",
                    "description": "The path to application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "identity": {
                    "description": "The name of certificate to use when signing. Consider using environment variables [CSC_LINK or CSC_NAME](/code-signing) instead of specifying this option.\nMAS installer identity is specified in the [mas](/configuration/mas).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "minimumSystemVersion": {
                    "description": "The minimum version of macOS required for the app to run. Corresponds to `LSMinimumSystemVersion`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "protocols": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/Protocol"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/Protocol"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The URL protocol schemes."
                },
                "provisioningProfile": {
                    "description": "The path to the provisioning profile to use when signing, absolute or relative to the app root.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "releaseInfo": {
                    "$ref": "#/definitions/ReleaseInfo",
                    "description": "The release info. Intended for command line usage:\n\n```\n-c.releaseInfo.releaseNotes=\"new features\"\n```"
                },
                "requirements": {
                    "description": "Path of [requirements file](https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/RequirementLang/RequirementLang.html) used in signing. Not applicable for MAS.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "target": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/TargetConfiguration"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/TargetConfiguration"
                                    },
                                    {
                                        "enum": [
                                            "7z",
                                            "default",
                                            "dir",
                                            "dmg",
                                            "mas",
                                            "mas-dev",
                                            "pkg",
                                            "tar.bz2",
                                            "tar.gz",
                                            "tar.lz",
                                            "tar.xz",
                                            "zip"
                                        ],
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "enum": [
                                "7z",
                                "default",
                                "dir",
                                "dmg",
                                "mas",
                                "mas-dev",
                                "pkg",
                                "tar.bz2",
                                "tar.gz",
                                "tar.lz",
                                "tar.xz",
                                "zip"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The target package type: list of `default`, `dmg`, `mas`, `mas-dev`, `pkg`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`. Defaults to `default` (dmg and zip for Squirrel.Mac)."
                },
                "type": {
                    "anyOf": [
                        {
                            "enum": [
                                "development",
                                "distribution"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "distribution",
                    "description": "Whether to sign app for development or for distribution."
                }
            },
            "title": "MasConfiguration",
            "type": "object"
        },
        "MetadataDirectories": {
            "additionalProperties": false,
            "properties": {
                "app": {
                    "description": "The application directory (containing the application package.json), defaults to `app`, `www` or working directory.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "buildResources": {
                    "default": "build",
                    "description": "The path to build resources.\n\nPlease note â€” build resources is not packed into the app. If you need to use some files, e.g. as tray icon, please include required files explicitly: `\"files\": [\"**\\/*\", \"build/icon.*\"]`",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "output": {
                    "default": "dist",
                    "description": "The output directory. [File macros](/file-patterns#file-macros) are supported.",
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "title": "MetadataDirectories",
            "type": "object"
        },
        "MsiOptions": {
            "additionalProperties": false,
            "properties": {
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "createDesktopShortcut": {
                    "default": true,
                    "description": "Whether to create desktop shortcut. Set to `always` if to recreate also on reinstall (even if removed by user).",
                    "enum": [
                        "always",
                        false,
                        true
                    ]
                },
                "createStartMenuShortcut": {
                    "default": true,
                    "description": "Whether to create start menu shortcut.",
                    "type": "boolean"
                },
                "menuCategory": {
                    "default": false,
                    "description": "Whether to create submenu for start menu shortcut and program files directory. If `true`, company name will be used. Or string value.",
                    "type": [
                        "string",
                        "boolean"
                    ]
                },
                "oneClick": {
                    "default": true,
                    "description": "One-click installation.",
                    "type": "boolean"
                },
                "perMachine": {
                    "default": false,
                    "description": "Whether to install per all users (per-machine).",
                    "type": "boolean"
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "runAfterFinish": {
                    "default": true,
                    "description": "Whether to run the installed application after finish. For assisted installer corresponding checkbox will be removed.",
                    "type": "boolean"
                },
                "shortcutName": {
                    "description": "The name that will be used for all shortcuts. Defaults to the application name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "upgradeCode": {
                    "description": "The [upgrade code](https://msdn.microsoft.com/en-us/library/windows/desktop/aa372375(v=vs.85).aspx). Optional, by default generated using app id.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "warningsAsErrors": {
                    "default": true,
                    "description": "If `warningsAsErrors` is `true` (default): treat warnings as errors. If `warningsAsErrors` is `false`: allow warnings.",
                    "type": "boolean"
                }
            },
            "title": "MsiOptions",
            "type": "object"
        },
        "NsisOptions": {
            "additionalProperties": false,
            "properties": {
                "allowElevation": {
                    "default": true,
                    "description": "*assisted installer only.* Allow requesting for elevation. If false, user will have to restart installer with elevated permissions.",
                    "type": "boolean"
                },
                "allowToChangeInstallationDirectory": {
                    "default": false,
                    "description": "*assisted installer only.* Whether to allow user to change installation directory.",
                    "type": "boolean"
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName} Setup ${version}.${ext}`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "createDesktopShortcut": {
                    "default": true,
                    "description": "Whether to create desktop shortcut. Set to `always` if to recreate also on reinstall (even if removed by user).",
                    "enum": [
                        "always",
                        false,
                        true
                    ]
                },
                "createStartMenuShortcut": {
                    "default": true,
                    "description": "Whether to create start menu shortcut.",
                    "type": "boolean"
                },
                "deleteAppDataOnUninstall": {
                    "default": false,
                    "description": "*one-click installer only.* Whether to delete app data on uninstall.",
                    "type": "boolean"
                },
                "differentialPackage": {
                    "description": "Defaults to `true` for web installer (`nsis-web`)",
                    "type": "boolean"
                },
                "displayLanguageSelector": {
                    "default": false,
                    "description": "Whether to display a language selection dialog. Not recommended (by default will be detected using OS language).",
                    "type": "boolean"
                },
                "guid": {
                    "description": "See [GUID vs Application Name](../configuration/nsis#guid-vs-application-name).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "include": {
                    "description": "The path to NSIS include script to customize installer. Defaults to `build/installer.nsh`. See [Custom NSIS script](#custom-nsis-script).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerHeader": {
                    "default": "build/installerHeader.bmp",
                    "description": "*assisted installer only.* `MUI_HEADERIMAGE`, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerHeaderIcon": {
                    "description": "*one-click installer only.* The path to header icon (above the progress bar), relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/installerHeaderIcon.ico` or application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerIcon": {
                    "description": "The path to installer icon, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/installerIcon.ico` or application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerLanguages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "The installer languages (e.g. `en_US`, `de_DE`). Change only if you understand what do you do and for what."
                },
                "installerSidebar": {
                    "description": "*assisted installer only.* `MUI_WELCOMEFINISHPAGE_BITMAP`, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/installerSidebar.bmp` or `${NSISDIR}\\\\Contrib\\\\Graphics\\\\Wizard\\\\nsis3-metro.bmp`. Image size 164 Ã— 314 pixels.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "language": {
                    "description": "[LCID Dec](https://msdn.microsoft.com/en-au/goglobal/bb964664.aspx), defaults to `1033`(`English - United States`).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "license": {
                    "description": "The path to EULA license file. Defaults to `license.txt` or `eula.txt` (or uppercase variants). In addition to `txt, `rtf` and `html` supported (don't forget to use `target=\"_blank\"` for links).\n\nMultiple license files in different languages are supported â€” use lang postfix (e.g. `_de`, `_ru`)). For example, create files `license_de.txt` and `license_en.txt` in the build resources.\nIf OS language is german, `license_de.txt` will be displayed. See map of [language code to name](https://github.com/meikidd/iso-639-1/blob/master/src/data.js).\n\nAppropriate license file will be selected by user OS language.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "menuCategory": {
                    "default": false,
                    "description": "Whether to create submenu for start menu shortcut and program files directory. If `true`, company name will be used. Or string value.",
                    "type": [
                        "string",
                        "boolean"
                    ]
                },
                "multiLanguageInstaller": {
                    "description": "Whether to create multi-language installer. Defaults to `unicode` option value.",
                    "type": "boolean"
                },
                "oneClick": {
                    "default": true,
                    "description": "Whether to create one-click installer or assisted.",
                    "type": "boolean"
                },
                "packElevateHelper": {
                    "default": true,
                    "description": "Whether to pack the elevate executable (required for electron-updater if per-machine installer used or can be used in the future). Ignored if `perMachine` is set to `true`.",
                    "type": "boolean"
                },
                "perMachine": {
                    "default": false,
                    "description": "Whether to show install mode installer page (choice per-machine or per-user) for assisted installer. Or whether installation always per all users (per-machine).\n\nIf `oneClick` is `true` (default): Whether to install per all users (per-machine).\n\nIf `oneClick` is `false` and `perMachine` is `true`: no install mode installer page, always install per-machine.\n\nIf `oneClick` is `false` and `perMachine` is `false` (default): install mode installer page.",
                    "type": "boolean"
                },
                "preCompressedFileExtensions": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "default": [
                        ".avi",
                        ".mov",
                        ".m4v",
                        ".mp4",
                        ".m4p",
                        ".qt",
                        ".mkv",
                        ".webm",
                        ".vmdk"
                    ],
                    "description": "The file extension of files that will be not compressed. Applicable only for `extraResources` and `extraFiles` files."
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "runAfterFinish": {
                    "default": true,
                    "description": "Whether to run the installed application after finish. For assisted installer corresponding checkbox will be removed.",
                    "type": "boolean"
                },
                "script": {
                    "description": "The path to NSIS script to customize installer. Defaults to `build/installer.nsi`. See [Custom NSIS script](#custom-nsis-script).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "shortcutName": {
                    "description": "The name that will be used for all shortcuts. Defaults to the application name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "unicode": {
                    "default": true,
                    "description": "Whether to create [Unicode installer](http://nsis.sourceforge.net/Docs/Chapter1.html#intro-unicode).",
                    "type": "boolean"
                },
                "uninstallDisplayName": {
                    "default": "${productName} ${version}",
                    "description": "The uninstaller display name in the control panel.",
                    "type": "string"
                },
                "uninstallerIcon": {
                    "description": "The path to uninstaller icon, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/uninstallerIcon.ico` or application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "uninstallerSidebar": {
                    "description": "*assisted installer only.* `MUI_UNWELCOMEFINISHPAGE_BITMAP`, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `installerSidebar` option or `build/uninstallerSidebar.bmp` or `build/installerSidebar.bmp` or `${NSISDIR}\\\\Contrib\\\\Graphics\\\\Wizard\\\\nsis3-metro.bmp`",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "useZip": {
                    "default": false,
                    "type": "boolean"
                },
                "warningsAsErrors": {
                    "default": true,
                    "description": "If `warningsAsErrors` is `true` (default): NSIS will treat warnings as errors. If `warningsAsErrors` is `false`: NSIS will allow warnings.",
                    "type": "boolean"
                }
            },
            "title": "NsisOptions",
            "type": "object"
        },
        "NsisWebOptions": {
            "additionalProperties": false,
            "description": "Web Installer options.",
            "properties": {
                "allowElevation": {
                    "default": true,
                    "description": "*assisted installer only.* Allow requesting for elevation. If false, user will have to restart installer with elevated permissions.",
                    "type": "boolean"
                },
                "allowToChangeInstallationDirectory": {
                    "default": false,
                    "description": "*assisted installer only.* Whether to allow user to change installation directory.",
                    "type": "boolean"
                },
                "appPackageUrl": {
                    "description": "The application package download URL. Optional â€” by default computed using publish configuration.\n\nURL like `https://example.com/download/latest` allows web installer to be version independent (installer will download latest application package).\nPlease note â€” it is [full URL](https://github.com/electron-userland/electron-builder/issues/1810#issuecomment-317650878).\n\nCustom `X-Arch` http header is set to `32` or `64`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName} Web Setup ${version}.${ext}`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "createDesktopShortcut": {
                    "default": true,
                    "description": "Whether to create desktop shortcut. Set to `always` if to recreate also on reinstall (even if removed by user).",
                    "enum": [
                        "always",
                        false,
                        true
                    ]
                },
                "createStartMenuShortcut": {
                    "default": true,
                    "description": "Whether to create start menu shortcut.",
                    "type": "boolean"
                },
                "deleteAppDataOnUninstall": {
                    "default": false,
                    "description": "*one-click installer only.* Whether to delete app data on uninstall.",
                    "type": "boolean"
                },
                "differentialPackage": {
                    "description": "Defaults to `true` for web installer (`nsis-web`)",
                    "type": "boolean"
                },
                "displayLanguageSelector": {
                    "default": false,
                    "description": "Whether to display a language selection dialog. Not recommended (by default will be detected using OS language).",
                    "type": "boolean"
                },
                "guid": {
                    "description": "See [GUID vs Application Name](../configuration/nsis#guid-vs-application-name).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "include": {
                    "description": "The path to NSIS include script to customize installer. Defaults to `build/installer.nsh`. See [Custom NSIS script](#custom-nsis-script).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerHeader": {
                    "default": "build/installerHeader.bmp",
                    "description": "*assisted installer only.* `MUI_HEADERIMAGE`, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerHeaderIcon": {
                    "description": "*one-click installer only.* The path to header icon (above the progress bar), relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/installerHeaderIcon.ico` or application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerIcon": {
                    "description": "The path to installer icon, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/installerIcon.ico` or application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installerLanguages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "The installer languages (e.g. `en_US`, `de_DE`). Change only if you understand what do you do and for what."
                },
                "installerSidebar": {
                    "description": "*assisted installer only.* `MUI_WELCOMEFINISHPAGE_BITMAP`, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/installerSidebar.bmp` or `${NSISDIR}\\\\Contrib\\\\Graphics\\\\Wizard\\\\nsis3-metro.bmp`. Image size 164 Ã— 314 pixels.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "language": {
                    "description": "[LCID Dec](https://msdn.microsoft.com/en-au/goglobal/bb964664.aspx), defaults to `1033`(`English - United States`).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "license": {
                    "description": "The path to EULA license file. Defaults to `license.txt` or `eula.txt` (or uppercase variants). In addition to `txt, `rtf` and `html` supported (don't forget to use `target=\"_blank\"` for links).\n\nMultiple license files in different languages are supported â€” use lang postfix (e.g. `_de`, `_ru`)). For example, create files `license_de.txt` and `license_en.txt` in the build resources.\nIf OS language is german, `license_de.txt` will be displayed. See map of [language code to name](https://github.com/meikidd/iso-639-1/blob/master/src/data.js).\n\nAppropriate license file will be selected by user OS language.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "menuCategory": {
                    "default": false,
                    "description": "Whether to create submenu for start menu shortcut and program files directory. If `true`, company name will be used. Or string value.",
                    "type": [
                        "string",
                        "boolean"
                    ]
                },
                "multiLanguageInstaller": {
                    "description": "Whether to create multi-language installer. Defaults to `unicode` option value.",
                    "type": "boolean"
                },
                "oneClick": {
                    "default": true,
                    "description": "Whether to create one-click installer or assisted.",
                    "type": "boolean"
                },
                "packElevateHelper": {
                    "default": true,
                    "description": "Whether to pack the elevate executable (required for electron-updater if per-machine installer used or can be used in the future). Ignored if `perMachine` is set to `true`.",
                    "type": "boolean"
                },
                "perMachine": {
                    "default": false,
                    "description": "Whether to show install mode installer page (choice per-machine or per-user) for assisted installer. Or whether installation always per all users (per-machine).\n\nIf `oneClick` is `true` (default): Whether to install per all users (per-machine).\n\nIf `oneClick` is `false` and `perMachine` is `true`: no install mode installer page, always install per-machine.\n\nIf `oneClick` is `false` and `perMachine` is `false` (default): install mode installer page.",
                    "type": "boolean"
                },
                "preCompressedFileExtensions": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "default": [
                        ".avi",
                        ".mov",
                        ".m4v",
                        ".mp4",
                        ".m4p",
                        ".qt",
                        ".mkv",
                        ".webm",
                        ".vmdk"
                    ],
                    "description": "The file extension of files that will be not compressed. Applicable only for `extraResources` and `extraFiles` files."
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "runAfterFinish": {
                    "default": true,
                    "description": "Whether to run the installed application after finish. For assisted installer corresponding checkbox will be removed.",
                    "type": "boolean"
                },
                "script": {
                    "description": "The path to NSIS script to customize installer. Defaults to `build/installer.nsi`. See [Custom NSIS script](#custom-nsis-script).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "shortcutName": {
                    "description": "The name that will be used for all shortcuts. Defaults to the application name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "unicode": {
                    "default": true,
                    "description": "Whether to create [Unicode installer](http://nsis.sourceforge.net/Docs/Chapter1.html#intro-unicode).",
                    "type": "boolean"
                },
                "uninstallDisplayName": {
                    "default": "${productName} ${version}",
                    "description": "The uninstaller display name in the control panel.",
                    "type": "string"
                },
                "uninstallerIcon": {
                    "description": "The path to uninstaller icon, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `build/uninstallerIcon.ico` or application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "uninstallerSidebar": {
                    "description": "*assisted installer only.* `MUI_UNWELCOMEFINISHPAGE_BITMAP`, relative to the [build resources](/configuration/configuration#MetadataDirectories-buildResources) or to the project directory.\nDefaults to `installerSidebar` option or `build/uninstallerSidebar.bmp` or `build/installerSidebar.bmp` or `${NSISDIR}\\\\Contrib\\\\Graphics\\\\Wizard\\\\nsis3-metro.bmp`",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "useZip": {
                    "default": false,
                    "type": "boolean"
                },
                "warningsAsErrors": {
                    "default": true,
                    "description": "If `warningsAsErrors` is `true` (default): NSIS will treat warnings as errors. If `warningsAsErrors` is `false`: NSIS will allow warnings.",
                    "type": "boolean"
                }
            },
            "title": "NsisWebOptions",
            "type": "object"
        },
        "PkgBackgroundOptions": {
            "additionalProperties": false,
            "description": "Options for the background image in a PKG installer",
            "properties": {
                "alignment": {
                    "anyOf": [
                        {
                            "enum": [
                                "bottom",
                                "bottomleft",
                                "bottomright",
                                "center",
                                "left",
                                "right",
                                "top",
                                "topleft",
                                "topright"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "center",
                    "description": "Alignment of the background image.\nOptions are: center, left, right, top, bottom, topleft, topright, bottomleft, bottomright"
                },
                "file": {
                    "description": "Path to the image to use as an installer background.",
                    "type": "string"
                },
                "scaling": {
                    "anyOf": [
                        {
                            "enum": [
                                "none",
                                "proportional",
                                "tofit"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "tofit",
                    "description": "Scaling of the background image.\nOptions are: tofit, none, proportional"
                }
            },
            "title": "PkgBackgroundOptions",
            "type": "object"
        },
        "PkgOptions": {
            "additionalProperties": false,
            "description": "macOS product archive options.",
            "properties": {
                "allowAnywhere": {
                    "default": true,
                    "description": "Whether can be installed at the root of any volume, including non-system volumes. Otherwise, it cannot be installed at the root of a volume.\n\nCorresponds to [enable_anywhere](https://developer.apple.com/library/content/documentation/DeveloperTools/Reference/DistributionDefinitionRef/Chapters/Distribution_XML_Ref.html#//apple_ref/doc/uid/TP40005370-CH100-SW70).",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "allowCurrentUserHome": {
                    "default": true,
                    "description": "Whether can be installed into the current userâ€™s home directory.\nA home directory installation is done as the current user (not as root), and it cannot write outside of the home directory.\nIf the product cannot be installed in the userâ€™s home directory and be not completely functional from userâ€™s home directory.\n\nCorresponds to [enable_currentUserHome](https://developer.apple.com/library/content/documentation/DeveloperTools/Reference/DistributionDefinitionRef/Chapters/Distribution_XML_Ref.html#//apple_ref/doc/uid/TP40005370-CH100-SW70).",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "allowRootDirectory": {
                    "default": true,
                    "description": "Whether can be installed into the root directory. Should usually be `true` unless the product can be installed only to the userâ€™s home directory.\n\nCorresponds to [enable_localSystem](https://developer.apple.com/library/content/documentation/DeveloperTools/Reference/DistributionDefinitionRef/Chapters/Distribution_XML_Ref.html#//apple_ref/doc/uid/TP40005370-CH100-SW70).",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "background": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/PkgBackgroundOptions"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Options for the background image for the installer."
                },
                "conclusion": {
                    "description": "The path to the conclusion file. This may be used to customize the text on the final \"Summary\" page of the installer.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "hasStrictIdentifier": {
                    "default": true,
                    "description": "Require identical bundle identifiers at install path?",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "identity": {
                    "description": "The name of certificate to use when signing. Consider using environment variables [CSC_LINK or CSC_NAME](/code-signing) instead of specifying this option.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "installLocation": {
                    "default": "/Applications",
                    "description": "The install location. [Do not use it](https://stackoverflow.com/questions/12863944/how-do-you-specify-a-default-install-location-to-home-with-pkgbuild) to create per-user package.\nMostly never you will need to change this option. `/Applications` would install it as expected into `/Applications` if the local system domain is chosen, or into `$HOME/Applications` if the home installation is chosen.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "isRelocatable": {
                    "default": true,
                    "description": "Install bundle over previous version if moved by user?",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "isVersionChecked": {
                    "default": true,
                    "description": "Don't install bundle if newer version on disk?",
                    "type": [
                        "null",
                        "boolean"
                    ]
                },
                "license": {
                    "description": "The path to EULA license file. Defaults to `license.txt` or `eula.txt` (or uppercase variants). In addition to `txt, `rtf` and `html` supported (don't forget to use `target=\"_blank\"` for links).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "overwriteAction": {
                    "anyOf": [
                        {
                            "enum": [
                                "update",
                                "upgrade"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "upgrade",
                    "description": "Specifies how an existing version of the bundle on disk should be handled when the version in\nthe package is installed.\n\nIf you specify upgrade, the bundle in the package atomi-cally replaces any version on disk;\nthis has the effect of deleting old paths that no longer exist in the new version of\nthe bundle.\n\nIf you specify update, the bundle in the package overwrites the version on disk, and any files\nnot contained in the package will be left intact; this is appropriate when you are delivering\nan update-only package.\n\nAnother effect of update is that the package bundle will not be installed at all if there is\nnot already a version on disk; this allows a package to deliver an update for an app that\nthe user might have deleted."
                },
                "productbuild": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "should be not documented, only to experiment"
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "scripts": {
                    "default": "build/pkg-scripts",
                    "description": "The scripts directory, relative to `build` (build resources directory).\nThe scripts can be in any language so long as the files are marked executable and have the appropriate shebang indicating the path to the interpreter.\nScripts are required to be executable (`chmod +x file`).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "welcome": {
                    "description": "The path to the welcome file. This may be used to customize the text on the Introduction page of the installer.",
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "title": "PkgOptions",
            "type": "object"
        },
        "PlugDescriptor": {
            "additionalProperties": {
                "anyOf": [
                    {
                        "additionalProperties": {
                        },
                        "type": "object"
                    },
                    {
                        "type": "null"
                    }
                ]
            },
            "title": "PlugDescriptor",
            "type": "object"
        },
        "PortableOptions": {
            "additionalProperties": false,
            "description": "Portable options.",
            "properties": {
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "guid": {
                    "description": "See [GUID vs Application Name](../configuration/nsis#guid-vs-application-name).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "requestExecutionLevel": {
                    "default": "user",
                    "description": "The [requested execution level](http://nsis.sourceforge.net/Reference/RequestExecutionLevel) for Windows.",
                    "enum": [
                        "admin",
                        "highest",
                        "user"
                    ],
                    "type": "string"
                },
                "unicode": {
                    "default": true,
                    "description": "Whether to create [Unicode installer](http://nsis.sourceforge.net/Docs/Chapter1.html#intro-unicode).",
                    "type": "boolean"
                },
                "useZip": {
                    "default": false,
                    "type": "boolean"
                },
                "warningsAsErrors": {
                    "default": true,
                    "description": "If `warningsAsErrors` is `true` (default): NSIS will treat warnings as errors. If `warningsAsErrors` is `false`: NSIS will allow warnings.",
                    "type": "boolean"
                },
                "unpackDirName": {
                    "description": "The unpack directory name in [TEMP](https://www.askvg.com/where-does-windows-store-temporary-files-and-how-to-change-temp-folder-location/) directory.\n\nDefaults to [uuid](https://github.com/segmentio/ksuid) of build (changed on each build of portable executable).",
                    "type": "string"
                }
            },
            "title": "PortableOptions",
            "type": "object"
        },
        "Protocol": {
            "additionalProperties": false,
            "description": "URL Protocol Schemes. Protocols to associate the app with. macOS only.\n\nPlease note â€” on macOS [you need to register an `open-url` event handler](http://electron.atom.io/docs/api/app/#event-open-url-macos).",
            "properties": {
                "name": {
                    "description": "The name. e.g. `IRC server URL`.",
                    "type": "string"
                },
                "role": {
                    "default": "Editor",
                    "description": "*macOS-only* The appâ€™s role with respect to the type.",
                    "enum": [
                        "Editor",
                        "None",
                        "Shell",
                        "Viewer"
                    ],
                    "type": "string"
                },
                "schemes": {
                    "description": "The schemes. e.g. `[\"irc\", \"ircs\"]`.",
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                }
            },
            "required": [
                "name",
                "schemes"
            ],
            "title": "Protocol",
            "type": "object"
        },
        "PublishProvider": {
            "enum": [
                "bintray",
                "custom",
                "generic",
                "github",
                "s3",
                "spaces"
            ],
            "title": "PublishProvider",
            "type": "string"
        },
        "ReleaseInfo": {
            "additionalProperties": false,
            "properties": {
                "releaseDate": {
                    "description": "The release date.",
                    "type": "string"
                },
                "releaseName": {
                    "description": "The release name.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "releaseNotes": {
                    "description": "The release notes.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "releaseNotesFile": {
                    "description": "The path to release notes file. Defaults to `release-notes-${platform}.md` (where `platform` it is current platform â€” `mac`, `linux` or `windows`) or `release-notes.md` in the [build resources](#MetadataDirectories-buildResources).",
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "title": "ReleaseInfo",
            "type": "object"
        },
        "S3Options": {
            "additionalProperties": false,
            "properties": {
                "acl": {
                    "anyOf": [
                        {
                            "enum": [
                                "private",
                                "public-read"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "public-read",
                    "description": "The ACL. Set to `null` to not [add](https://github.com/electron-userland/electron-builder/issues/1822).\n\nPlease see [required permissions for the S3 provider](https://github.com/electron-userland/electron-builder/issues/1618#issuecomment-314679128)."
                },
                "bucket": {
                    "description": "The bucket name.",
                    "type": "string"
                },
                "channel": {
                    "default": "latest",
                    "description": "The update channel.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "encryption": {
                    "anyOf": [
                        {
                            "enum": [
                                "AES256",
                                "aws:kms"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Server-side encryption algorithm to use for the object."
                },
                "endpoint": {
                    "description": "The endpoint URI to send requests to. The default endpoint is built from the configured region.\nThe endpoint should be a string like `https://{service}.{region}.amazonaws.com`.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "path": {
                    "default": "/",
                    "description": "The directory path.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "provider": {
                    "description": "The provider. Must be `s3`.",
                    "enum": [
                        "s3"
                    ],
                    "type": "string"
                },
                "publishAutoUpdate": {
                    "default": true,
                    "description": "Whether to publish auto update info files.\n\nAuto update relies only on the first provider in the list (you can specify several publishers).\nThus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.",
                    "type": "boolean"
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "region": {
                    "description": "The region. Is determined and set automatically when publishing.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "storageClass": {
                    "anyOf": [
                        {
                            "enum": [
                                "REDUCED_REDUNDANCY",
                                "STANDARD",
                                "STANDARD_IA"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "STANDARD",
                    "description": "The type of storage to use for the object."
                },
                "updaterCacheDirName": {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "required": [
                "bucket",
                "provider"
            ],
            "title": "S3Options",
            "type": "object"
        },
        "SnapOptions": {
            "additionalProperties": false,
            "properties": {
                "after": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "Specifies any [parts](https://snapcraft.io/docs/reference/parts) that should be built before this part.\nDefaults to `[\"desktop-gtk2\"\"]`.\n\nIf list contains `default`, it will be replaced to default list, so, `[\"default\", \"foo\"]` can be used to add custom parts `foo` in addition to defaults."
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "assumes": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "The list of features that must be supported by the core in order for this snap to install."
                },
                "buildPackages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The list of debian packages needs to be installed for building this snap."
                },
                "category": {
                    "description": "The [application category](https://specifications.freedesktop.org/menu-spec/latest/apa.html#main-category-registry).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "confinement": {
                    "anyOf": [
                        {
                            "enum": [
                                "classic",
                                "devmode",
                                "strict"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "strict",
                    "description": "The type of [confinement](https://snapcraft.io/docs/reference/confinement) supported by the snap."
                },
                "description": {
                    "description": "As [description](/configuration/configuration#Metadata-description) from application package.json, but allows you to specify different for Linux.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "desktop": {
                    "description": "The [Desktop file](https://developer.gnome.org/integration-guide/stable/desktop-files.html.en) entries (name to value)."
                },
                "environment": {
                    "anyOf": [
                        {
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The custom environment. Defaults to `{\"TMPDIR: \"$XDG_RUNTIME_DIR\"}`. If you set custom, it will be merged with default."
                },
                "grade": {
                    "anyOf": [
                        {
                            "enum": [
                                "devel",
                                "stable"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "stable",
                    "description": "The quality grade of the snap. It can be either `devel` (i.e. a development version of the snap, so not to be published to the â€œstableâ€� or â€œcandidateâ€� channels) or â€œstableâ€� (i.e. a stable release or release candidate, which can be released to all channels)."
                },
                "hooks": {
                    "default": "build/snap-hooks",
                    "description": "The [hooks](https://docs.snapcraft.io/build-snaps/hooks) directory, relative to `build` (build resources directory).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "mimeTypes": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The mime types in addition to specified in the file associations. Use it if you don't want to register a new mime type, but reuse existing."
                },
                "plugs": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/PlugDescriptor"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/PlugDescriptor"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The list of [plugs](https://snapcraft.io/docs/reference/interfaces).\nDefaults to `[\"desktop\", \"desktop-legacy\", \"home\", \"x11\", \"unity7\", \"browser-support\", \"network\", \"gsettings\", \"pulseaudio\", \"opengl\"]`.\n\nIf list contains `default`, it will be replaced to default list, so, `[\"default\", \"foo\"]` can be used to add custom plug `foo` in addition to defaults.\n\nAdditional attributes can be specified using object instead of just name of plug:\n```\n[\n  {\n    \"browser-sandbox\": {\n      \"interface\": \"browser-support\",\n      \"allow-sandbox\": true\n    },\n  },\n  \"another-simple-plug-name\"\n]\n```"
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "stagePackages": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "description": "The list of Ubuntu packages to use that are needed to support the `app` part creation. Like `depends` for `deb`.\nDefaults to `[\"libasound2\", \"libgconf2-4\", \"libnotify4\", \"libnspr4\", \"libnss3\", \"libpcre3\", \"libpulse0\", \"libxss1\", \"libxtst6\"]`.\n\nIf list contains `default`, it will be replaced to default list, so, `[\"default\", \"foo\"]` can be used to add custom package `foo` in addition to defaults."
                },
                "summary": {
                    "description": "The 78 character long summary. Defaults to [productName](/configuration/configuration#Configuration-productName).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "synopsis": {
                    "description": "The [short description](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "useTemplateApp": {
                    "description": "Whether to use template snap. Defaults to `true` if `stagePackages` not specified.",
                    "type": "boolean"
                }
            },
            "title": "SnapOptions",
            "type": "object"
        },
        "SpacesOptions": {
            "additionalProperties": false,
            "description": "[DigitalOcean Spaces](https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-spaces) options.\nAccess key is required, define `DO_KEY_ID` and `DO_SECRET_KEY` environment variables.",
            "properties": {
                "acl": {
                    "anyOf": [
                        {
                            "enum": [
                                "private",
                                "public-read"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "public-read",
                    "description": "The ACL. Set to `null` to not [add](https://github.com/electron-userland/electron-builder/issues/1822)."
                },
                "channel": {
                    "default": "latest",
                    "description": "The update channel.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "name": {
                    "description": "The space name.",
                    "type": "string"
                },
                "path": {
                    "default": "/",
                    "description": "The directory path.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "provider": {
                    "description": "The provider. Must be `spaces`.",
                    "enum": [
                        "spaces"
                    ],
                    "type": "string"
                },
                "publishAutoUpdate": {
                    "default": true,
                    "description": "Whether to publish auto update info files.\n\nAuto update relies only on the first provider in the list (you can specify several publishers).\nThus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.",
                    "type": "boolean"
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ]
                },
                "region": {
                    "description": "The region (e.g. `nyc3`).",
                    "type": "string"
                },
                "updaterCacheDirName": {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            },
            "required": [
                "name",
                "provider",
                "region"
            ],
            "title": "SpacesOptions",
            "type": "object"
        },
        "SquirrelWindowsOptions": {
            "additionalProperties": false,
            "properties": {
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "iconUrl": {
                    "description": "A URL to an ICO file to use as the application icon (displayed in Control Panel > Programs and Features). Defaults to the Electron icon.\n\nPlease note â€” [local icon file url is not accepted](https://github.com/atom/grunt-electron-installer/issues/73), must be https/http.\n\nIf you don't plan to build windows installer, you can omit it.\nIf your project repository is public on GitHub, it will be `https://github.com/${u}/${p}/blob/master/build/icon.ico?raw=true` by default.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "loadingGif": {
                    "description": "The path to a .gif file to display during install. `build/install-spinner.gif` will be used if exists (it is a recommended way to set)\n(otherwise [default](https://github.com/electron/windows-installer/blob/master/resources/install-spinner.gif)).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "msi": {
                    "description": "Whether to create an MSI installer. Defaults to `false` (MSI is not created).",
                    "type": "boolean"
                },
                "name": {
                    "description": "https://github.com/electron-userland/electron-builder/issues/1743",
                    "type": "string"
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "remoteReleases": {
                    "description": "A URL to your existing updates. Or `true` to automatically set to your GitHub repository. If given, these will be downloaded to create delta updates.",
                    "type": [
                        "null",
                        "string",
                        "boolean"
                    ]
                },
                "remoteToken": {
                    "description": "Authentication token for remote updates",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "useAppIdAsId": {
                    "description": "Use `appId` to identify package instead of `name`.",
                    "type": "boolean"
                }
            },
            "title": "SquirrelWindowsOptions",
            "type": "object"
        },
        "TargetConfiguration": {
            "additionalProperties": false,
            "properties": {
                "arch": {
                    "anyOf": [
                        {
                            "items": {
                                "enum": [
                                    "arm64",
                                    "armv7l",
                                    "ia32",
                                    "x64"
                                ],
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "enum": [
                                "arm64",
                                "armv7l",
                                "ia32",
                                "x64"
                            ],
                            "type": "string"
                        }
                    ],
                    "description": "The arch or list of archs."
                },
                "target": {
                    "description": "The target name. e.g. `snap`.",
                    "type": "string"
                }
            },
            "required": [
                "target"
            ],
            "title": "TargetConfiguration",
            "type": "object"
        },
        "WindowsConfiguration": {
            "additionalProperties": false,
            "properties": {
                "additionalCertificateFile": {
                    "description": "The path to an additional certificate file you want to add to the signature block.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "appId": {
                    "default": "com.electron.${name}",
                    "description": "The application id. Used as [CFBundleIdentifier](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070) for MacOS and as\n[Application User Model ID](https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx) for Windows (NSIS target only, Squirrel.Windows not supported). It is strongly recommended that an explicit ID is set.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "artifactName": {
                    "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName}-${version}.${ext}` (some target can have other defaults, see corresponding options).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "asar": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/AsarOptions"
                        },
                        {
                            "type": [
                                "null",
                                "boolean"
                            ]
                        }
                    ],
                    "default": true,
                    "description": "Whether to package the application's source code into an archive, using [Electron's archive format](http://electron.atom.io/docs/tutorial/application-packaging/).\n\nNode modules, that must be unpacked, will be detected automatically, you don't need to explicitly set [asarUnpack](#configuration-asarUnpack) - please file an issue if this doesn't work."
                },
                "asarUnpack": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "A [glob patterns](/file-patterns) relative to the [app directory](#MetadataDirectories-app), which specifies which files to unpack when creating the [asar](http://electron.atom.io/docs/tutorial/application-packaging/) archive."
                },
                "certificateFile": {
                    "description": "The path to the *.pfx certificate you want to sign with. Please use it only if you cannot use env variable `CSC_LINK` (`WIN_CSC_LINK`) for some reason.\nPlease see [Code Signing](/code-signing).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "certificatePassword": {
                    "description": "The password to the certificate provided in `certificateFile`. Please use it only if you cannot use env variable `CSC_KEY_PASSWORD` (`WIN_CSC_KEY_PASSWORD`) for some reason.\nPlease see [Code Signing](/code-signing).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "certificateSha1": {
                    "description": "The SHA1 hash of the signing certificate. The SHA1 hash is commonly specified when multiple certificates satisfy the criteria specified by the remaining switches. Works only on Windows (or on macOS if [Parallels Desktop](https://www.parallels.com/products/desktop/) Windows 10 virtual machines exits).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "certificateSubjectName": {
                    "description": "The name of the subject of the signing certificate. Required only for EV Code Signing and works only on Windows (or on macOS if [Parallels Desktop](https://www.parallels.com/products/desktop/) Windows 10 virtual machines exits).",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "compression": {
                    "anyOf": [
                        {
                            "enum": [
                                "maximum",
                                "normal",
                                "store"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "normal",
                    "description": "The compression level. If you want to rapidly test build, `store` can reduce build time significantly. `maximum` doesn't lead to noticeable size difference, but increase build time."
                },
                "cscKeyPassword": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "cscLink": {
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "detectUpdateChannel": {
                    "default": true,
                    "description": "Whether to infer update channel from application version pre-release components. e.g. if version `0.12.1-alpha.1`, channel will be set to `alpha`. Otherwise to `latest`.",
                    "type": "boolean"
                },
                "electronUpdaterCompatibility": {
                    "description": "The [electron-updater compatibility](/auto-update#compatibility) semver range.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "extraFiles": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "extraResources": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "fileAssociations": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileAssociation"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/FileAssociation"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The file associations."
                },
                "files": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/FileSet"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/FileSet"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "forceCodeSigning": {
                    "description": "Whether to fail if app will be not code signed.",
                    "type": "boolean"
                },
                "generateUpdatesFilesForAllChannels": {
                    "default": false,
                    "description": "Please see [Building and Releasing using Channels](https://github.com/electron-userland/electron-builder/issues/1182#issuecomment-324947139).",
                    "type": "boolean"
                },
                "icon": {
                    "default": "build/icon.ico",
                    "description": "The path to application icon.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "legalTrademarks": {
                    "description": "The trademarks and registered trademarks.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "protocols": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/Protocol"
                        },
                        {
                            "items": {
                                "$ref": "#/definitions/Protocol"
                            },
                            "type": "array"
                        }
                    ],
                    "description": "The URL protocol schemes."
                },
                "publish": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/GithubOptions"
                        },
                        {
                            "$ref": "#/definitions/S3Options"
                        },
                        {
                            "$ref": "#/definitions/SpacesOptions"
                        },
                        {
                            "$ref": "#/definitions/GenericServerOptions"
                        },
                        {
                            "$ref": "#/definitions/BintrayOptions"
                        },
                        {
                            "$ref": "#/definitions/CustomPublishOptions"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/GithubOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/S3Options"
                                    },
                                    {
                                        "$ref": "#/definitions/SpacesOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/GenericServerOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/BintrayOptions"
                                    },
                                    {
                                        "$ref": "#/definitions/CustomPublishOptions"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ]
                },
                "publisherName": {
                    "anyOf": [
                        {
                            "items": {
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "[The publisher name](https://github.com/electron-userland/electron-builder/issues/1187#issuecomment-278972073), exactly as in your code signed certificate. Several names can be provided.\nDefaults to common name from your code signing certificate."
                },
                "releaseInfo": {
                    "$ref": "#/definitions/ReleaseInfo",
                    "description": "The release info. Intended for command line usage:\n\n```\n-c.releaseInfo.releaseNotes=\"new features\"\n```"
                },
                "requestedExecutionLevel": {
                    "anyOf": [
                        {
                            "enum": [
                                "asInvoker",
                                "highestAvailable",
                                "requireAdministrator"
                            ],
                            "type": "string"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "asInvoker",
                    "description": "The [security level](https://msdn.microsoft.com/en-us/library/6ad1fshk.aspx#Anchor_9) at which the application requests to be executed.\nCannot be specified per target, allowed only in the `win`."
                },
                "rfc3161TimeStampServer": {
                    "default": "http://timestamp.comodoca.com/rfc3161",
                    "description": "The URL of the RFC 3161 time stamp server.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "sign": {
                    "anyOf": [
                        {
                            "typeof": "function"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "description": "The custom function (or path to file or module id) to sign Windows executable."
                },
                "signAndEditExecutable": {
                    "default": true,
                    "description": "Whether to sign and add metadata to executable. Advanced option.",
                    "type": "boolean"
                },
                "signDlls": {
                    "default": false,
                    "description": "Whether to sign DLL files. Advanced option.",
                    "type": "boolean"
                },
                "signingHashAlgorithms": {
                    "anyOf": [
                        {
                            "items": {
                                "enum": [
                                    "sha1",
                                    "sha256"
                                ],
                                "type": "string"
                            },
                            "type": "array"
                        },
                        {
                            "type": "null"
                        }
                    ],
                    "default": "['sha1', 'sha256']",
                    "description": "Array of signing algorithms used. For AppX `sha256` is always used."
                },
                "target": {
                    "anyOf": [
                        {
                            "$ref": "#/definitions/TargetConfiguration"
                        },
                        {
                            "items": {
                                "anyOf": [
                                    {
                                        "$ref": "#/definitions/TargetConfiguration"
                                    },
                                    {
                                        "type": "string"
                                    }
                                ]
                            },
                            "type": "array"
                        },
                        {
                            "type": [
                                "null",
                                "string"
                            ]
                        }
                    ],
                    "default": "nsis",
                    "description": "The target package type: list of `nsis`, `nsis-web` (Web installer), `portable` ([portable](/configuration/nsis#portable) app without installation), `appx`, `msi`, `squirrel`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`.\nAppX package can be built only on Windows 10.\n\nTo use Squirrel.Windows please install `electron-builder-squirrel-windows` dependency."
                },
                "timeStampServer": {
                    "default": "http://timestamp.digicert.com",
                    "description": "The URL of the time stamp server.",
                    "type": [
                        "null",
                        "string"
                    ]
                },
                "verifyUpdateCodeSignature": {
                    "default": true,
                    "description": "Whether to verify the signature of an available update before installation.\nThe [publisher name](#publisherName) will be used for the signature verification.",
                    "type": "boolean"
                }
            },
            "title": "WindowsConfiguration",
            "type": "object"
        }
    },
    "description": "Configuration Options",
    "properties": {
        "$schema": {
            "description": "JSON Schema for this document.",
            "type": [
                "null",
                "string"
            ]
        },
        "afterAllArtifactBuild": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be [run after all artifacts are build](#afterAllArtifactBuild)."
        },
        "afterPack": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be [run after pack](#afterpack) (but before pack into distributable format and sign)."
        },
        "afterSign": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be [run after pack and sign](#aftersign) (but before pack into distributable format)."
        },
        "apk": {
            "anyOf": [
                {
                    "$ref": "#/definitions/LinuxTargetSpecificOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "appId": {
            "default": "com.electron.${name}",
            "description": "The application id. Used as [CFBundleIdentifier](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070) for MacOS and as\n[Application User Model ID](https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx) for Windows (NSIS target only, Squirrel.Windows not supported). It is strongly recommended that an explicit ID is set.",
            "type": [
                "null",
                "string"
            ]
        },
        "appImage": {
            "anyOf": [
                {
                    "$ref": "#/definitions/AppImageOptions"
                },
                {
                    "type": "null"
                }
            ],
            "description": "AppImage options."
        },
        "appx": {
            "anyOf": [
                {
                    "$ref": "#/definitions/AppXOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "artifactBuildCompleted": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be run on artifact build completed."
        },
        "artifactBuildStarted": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be run on artifact build start."
        },
        "artifactName": {
            "description": "The [artifact file name template](/configuration/configuration#artifact-file-name-template). Defaults to `${productName}-${version}.${ext}` (some target can have other defaults, see corresponding options).",
            "type": [
                "null",
                "string"
            ]
        },
        "asar": {
            "anyOf": [
                {
                    "$ref": "#/definitions/AsarOptions"
                },
                {
                    "type": [
                        "null",
                        "boolean"
                    ]
                }
            ],
            "default": true,
            "description": "Whether to package the application's source code into an archive, using [Electron's archive format](http://electron.atom.io/docs/tutorial/application-packaging/).\n\nNode modules, that must be unpacked, will be detected automatically, you don't need to explicitly set [asarUnpack](#configuration-asarUnpack) - please file an issue if this doesn't work."
        },
        "asarUnpack": {
            "anyOf": [
                {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "A [glob patterns](/file-patterns) relative to the [app directory](#MetadataDirectories-app), which specifies which files to unpack when creating the [asar](http://electron.atom.io/docs/tutorial/application-packaging/) archive."
        },
        "beforeBuild": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be run before dependencies are installed or rebuilt. Works when `npmRebuild` is set to `true`. Resolving to `false` will skip dependencies install or rebuild.\n\nIf provided and `node_modules` are missing, it will not invoke production dependencies check."
        },
        "buildDependenciesFromSource": {
            "default": false,
            "description": "Whether to build the application native dependencies from source.",
            "type": "boolean"
        },
        "buildVersion": {
            "description": "The build version. Maps to the `CFBundleVersion` on macOS, and `FileVersion` metadata property on Windows. Defaults to the `version`.\nIf `TRAVIS_BUILD_NUMBER` or `APPVEYOR_BUILD_NUMBER` or `CIRCLE_BUILD_NUM` or `BUILD_NUMBER` or `bamboo.buildNumber` env defined, it will be used as a build version (`version.build_number`).",
            "type": [
                "null",
                "string"
            ]
        },
        "compression": {
            "anyOf": [
                {
                    "enum": [
                        "maximum",
                        "normal",
                        "store"
                    ],
                    "type": "string"
                },
                {
                    "type": "null"
                }
            ],
            "default": "normal",
            "description": "The compression level. If you want to rapidly test build, `store` can reduce build time significantly. `maximum` doesn't lead to noticeable size difference, but increase build time."
        },
        "copyright": {
            "default": "Copyright Â© year ${author}",
            "description": "The human-readable copyright line for the app.",
            "type": [
                "null",
                "string"
            ]
        },
        "cscKeyPassword": {
            "type": [
                "null",
                "string"
            ]
        },
        "cscLink": {
            "type": [
                "null",
                "string"
            ]
        },
        "deb": {
            "anyOf": [
                {
                    "$ref": "#/definitions/DebOptions"
                },
                {
                    "type": "null"
                }
            ],
            "description": "Debian package options."
        },
        "detectUpdateChannel": {
            "default": true,
            "description": "Whether to infer update channel from application version pre-release components. e.g. if version `0.12.1-alpha.1`, channel will be set to `alpha`. Otherwise to `latest`.",
            "type": "boolean"
        },
        "directories": {
            "anyOf": [
                {
                    "$ref": "#/definitions/MetadataDirectories"
                },
                {
                    "type": "null"
                }
            ]
        },
        "dmg": {
            "anyOf": [
                {
                    "$ref": "#/definitions/DmgOptions"
                },
                {
                    "type": "null"
                }
            ],
            "description": "macOS DMG options."
        },
        "electronCompile": {
            "description": "Whether to use [electron-compile](http://github.com/electron/electron-compile) to compile app. Defaults to `true` if `electron-compile` in the dependencies. And `false` if in the `devDependencies` or doesn't specified.",
            "type": "boolean"
        },
        "electronDist": {
            "description": "The path to custom Electron build (e.g. `~/electron/out/R`).",
            "type": "string"
        },
        "electronDownload": {
            "$ref": "#/definitions/ElectronDownloadOptions",
            "description": "The [electron-download](https://github.com/electron-userland/electron-download#usage) options."
        },
        "electronUpdaterCompatibility": {
            "description": "The [electron-updater compatibility](/auto-update#compatibility) semver range.",
            "type": [
                "null",
                "string"
            ]
        },
        "electronVersion": {
            "description": "The version of electron you are packaging for. Defaults to version of `electron`, `electron-prebuilt` or `electron-prebuilt-compile` dependency.",
            "type": [
                "null",
                "string"
            ]
        },
        "extends": {
            "description": "The name of a built-in configuration preset or path to config file (relative to project dir). Currently, only `react-cra` is supported.\n\nIf `react-scripts` in the app dependencies, `react-cra` will be set automatically. Set to `null` to disable automatic detection.",
            "type": [
                "null",
                "string"
            ]
        },
        "extraFiles": {
            "anyOf": [
                {
                    "$ref": "#/definitions/FileSet"
                },
                {
                    "items": {
                        "anyOf": [
                            {
                                "$ref": "#/definitions/FileSet"
                            },
                            {
                                "type": "string"
                            }
                        ]
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ]
        },
        "extraMetadata": {
            "description": "Inject properties to `package.json`."
        },
        "extraResources": {
            "anyOf": [
                {
                    "$ref": "#/definitions/FileSet"
                },
                {
                    "items": {
                        "anyOf": [
                            {
                                "$ref": "#/definitions/FileSet"
                            },
                            {
                                "type": "string"
                            }
                        ]
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ]
        },
        "fileAssociations": {
            "anyOf": [
                {
                    "$ref": "#/definitions/FileAssociation"
                },
                {
                    "items": {
                        "$ref": "#/definitions/FileAssociation"
                    },
                    "type": "array"
                }
            ],
            "description": "The file associations."
        },
        "files": {
            "anyOf": [
                {
                    "$ref": "#/definitions/FileSet"
                },
                {
                    "items": {
                        "anyOf": [
                            {
                                "$ref": "#/definitions/FileSet"
                            },
                            {
                                "type": "string"
                            }
                        ]
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ]
        },
        "forceCodeSigning": {
            "description": "Whether to fail if app will be not code signed.",
            "type": "boolean"
        },
        "framework": {
            "description": "The framework name. One of `electron`, `proton-native`, `libui`. Defaults to `electron`.",
            "type": [
                "null",
                "string"
            ]
        },
        "freebsd": {
            "anyOf": [
                {
                    "$ref": "#/definitions/LinuxTargetSpecificOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "generateUpdatesFilesForAllChannels": {
            "default": false,
            "description": "Please see [Building and Releasing using Channels](https://github.com/electron-userland/electron-builder/issues/1182#issuecomment-324947139).",
            "type": "boolean"
        },
        "icon": {
            "type": [
                "null",
                "string"
            ]
        },
        "includePdb": {
            "default": false,
            "description": "Whether to include PDB files.",
            "type": "boolean"
        },
        "launchUiVersion": {
            "description": "*libui-based frameworks only* The version of LaunchUI you are packaging for. Applicable for Windows only. Defaults to version suitable for used framework version.",
            "type": [
                "null",
                "string",
                "boolean"
            ]
        },
        "linux": {
            "anyOf": [
                {
                    "$ref": "#/definitions/LinuxConfiguration"
                },
                {
                    "type": "null"
                }
            ],
            "description": "Options related to how build Linux targets."
        },
        "mac": {
            "anyOf": [
                {
                    "$ref": "#/definitions/MacConfiguration"
                },
                {
                    "type": "null"
                }
            ],
            "description": "Options related to how build macOS targets."
        },
        "mas": {
            "anyOf": [
                {
                    "$ref": "#/definitions/MasConfiguration"
                },
                {
                    "type": "null"
                }
            ],
            "description": "MAS (Mac Application Store) options."
        },
        "msi": {
            "anyOf": [
                {
                    "$ref": "#/definitions/MsiOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "muonVersion": {
            "description": "The version of muon you are packaging for.",
            "type": [
                "null",
                "string"
            ]
        },
        "nodeGypRebuild": {
            "default": false,
            "description": "Whether to execute `node-gyp rebuild` before starting to package the app.\n\nDon't [use](https://github.com/electron-userland/electron-builder/issues/683#issuecomment-241214075) [npm](http://electron.atom.io/docs/tutorial/using-native-node-modules/#using-npm) (neither `.npmrc`) for configuring electron headers. Use `electron-builder node-gyp-rebuild` instead.",
            "type": "boolean"
        },
        "nodeVersion": {
            "description": "*libui-based frameworks only* The version of NodeJS you are packaging for.\nYou can set it to `current` to set the Node.js version that you use to run.",
            "type": [
                "null",
                "string"
            ]
        },
        "npmArgs": {
            "anyOf": [
                {
                    "items": {
                        "type": "string"
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "Additional command line arguments to use when installing app native deps."
        },
        "npmRebuild": {
            "default": true,
            "description": "Whether to [rebuild](https://docs.npmjs.com/cli/rebuild) native dependencies before starting to package the app.",
            "type": "boolean"
        },
        "npmSkipBuildFromSource": {
            "type": "boolean"
        },
        "nsis": {
            "anyOf": [
                {
                    "$ref": "#/definitions/NsisOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "nsisWeb": {
            "anyOf": [
                {
                    "$ref": "#/definitions/NsisWebOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "onNodeModuleFile": {
            "anyOf": [
                {
                    "typeof": "function"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ],
            "description": "The function (or path to file or module id) to be [run on each node module](#onnodemodulefile) file."
        },
        "p5p": {
            "anyOf": [
                {
                    "$ref": "#/definitions/LinuxTargetSpecificOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "pacman": {
            "anyOf": [
                {
                    "$ref": "#/definitions/LinuxTargetSpecificOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "pkg": {
            "anyOf": [
                {
                    "$ref": "#/definitions/PkgOptions"
                },
                {
                    "type": "null"
                }
            ],
            "description": "macOS PKG options."
        },
        "portable": {
            "anyOf": [
                {
                    "$ref": "#/definitions/PortableOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "productName": {
            "description": "As [name](#Metadata-name), but allows you to specify a product name for your executable which contains spaces and other special characters not allowed in the [name property](https://docs.npmjs.com/files/package.json#name).",
            "type": [
                "null",
                "string"
            ]
        },
        "protocols": {
            "anyOf": [
                {
                    "$ref": "#/definitions/Protocol"
                },
                {
                    "items": {
                        "$ref": "#/definitions/Protocol"
                    },
                    "type": "array"
                }
            ],
            "description": "The URL protocol schemes."
        },
        "protonNodeVersion": {
            "type": [
                "null",
                "string"
            ]
        },
        "publish": {
            "anyOf": [
                {
                    "$ref": "#/definitions/GithubOptions"
                },
                {
                    "$ref": "#/definitions/S3Options"
                },
                {
                    "$ref": "#/definitions/SpacesOptions"
                },
                {
                    "$ref": "#/definitions/GenericServerOptions"
                },
                {
                    "$ref": "#/definitions/BintrayOptions"
                },
                {
                    "$ref": "#/definitions/CustomPublishOptions"
                },
                {
                    "items": {
                        "anyOf": [
                            {
                                "$ref": "#/definitions/GithubOptions"
                            },
                            {
                                "$ref": "#/definitions/S3Options"
                            },
                            {
                                "$ref": "#/definitions/SpacesOptions"
                            },
                            {
                                "$ref": "#/definitions/GenericServerOptions"
                            },
                            {
                                "$ref": "#/definitions/BintrayOptions"
                            },
                            {
                                "$ref": "#/definitions/CustomPublishOptions"
                            },
                            {
                                "type": "string"
                            }
                        ]
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ]
        },
        "readonly": {
            "default": false,
            "description": "Whether to fail if the application is not signed (to prevent unsigned app if code signing configuration is not correct).",
            "type": "boolean"
        },
        "releaseInfo": {
            "$ref": "#/definitions/ReleaseInfo",
            "description": "The release info. Intended for command line usage:\n\n```\n-c.releaseInfo.releaseNotes=\"new features\"\n```"
        },
        "remoteBuild": {
            "default": true,
            "description": "Whether to build using Electron Build Service if target not supported on current OS.",
            "type": "boolean"
        },
        "removePackageScripts": {
            "default": true,
            "description": "Whether to remove `scripts` field from `package.json` files.",
            "type": "boolean"
        },
        "rpm": {
            "anyOf": [
                {
                    "$ref": "#/definitions/LinuxTargetSpecificOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "snap": {
            "anyOf": [
                {
                    "$ref": "#/definitions/SnapOptions"
                },
                {
                    "type": "null"
                }
            ],
            "description": "Snap options."
        },
        "squirrelWindows": {
            "anyOf": [
                {
                    "$ref": "#/definitions/SquirrelWindowsOptions"
                },
                {
                    "type": "null"
                }
            ]
        },
        "target": {
            "anyOf": [
                {
                    "$ref": "#/definitions/TargetConfiguration"
                },
                {
                    "items": {
                        "anyOf": [
                            {
                                "$ref": "#/definitions/TargetConfiguration"
                            },
                            {
                                "type": "string"
                            }
                        ]
                    },
                    "type": "array"
                },
                {
                    "type": [
                        "null",
                        "string"
                    ]
                }
            ]
        },
        "win": {
            "anyOf": [
                {
                    "$ref": "#/definitions/WindowsConfiguration"
                },
                {
                    "type": "null"
                }
            ],
            "description": "Options related to how build Windows targets."
        }
    },
    "type": "object"
}
base: core18
grade: stable
confinement: strict
parts:
  launch-scripts:
    plugin: dump
    source: scripts
  gnome-platform-empty-dirs:
    plugin: nil
    override-build: >
      mkdir -p "$SNAPCRAFT_PART_INSTALL/data-dir/themes"
      mkdir -p "$SNAPCRAFT_PART_INSTALL/data-dir/icons"
      mkdir -p "$SNAPCRAFT_PART_INSTALL/data-dir/sounds"
      mkdir $SNAPCRAFT_PART_INSTALL/gnome-platform

  app-files:
    plugin: dump
    source: app
    organize:
      '*': app/
    stage:
      - -app/chrome-sandbox
      - -LICENSES.chromium.html
  app:
    plugin: "nil"
      # cd ~ && rm -rf ~/squashfs-root && unsquashfs /media/psf/ramdisk/electron-builder-test/dist/__snap-x64/se-wo-template_1.1.0_amd64.snap
      # comm -12 <(ls ~/squashfs-root/usr/lib/x86_64-linux-gnu/) <(ls /snap/gnome-3-28-1804/current/usr/lib/x86_64-linux-gnu/) > /media/psf/Home/f.txt
      # run snap-exclude-list.js
    stage:
      - '-usr/lib/python*'
      - '-usr/bin/python*'
      - '-var/lib/ucf'
      - '-usr/include'
      - '-usr/lib/X11'
      - '-usr/share'
      - '-usr/sbin'
      - '-usr/bin'
      - "-usr/lib/*/libicudata.*"
      - "-usr/lib/*/libicui18n.*"
      - "-usr/lib/*/libgtk-*"
      - "-usr/lib/*/libgdk-*"
      - "-usr/lib/*/glib-*"
      - "-usr/lib/*/gtk-*"
      - "-usr/lib/*/gdk-*"
      - "-usr/lib/*/krb5"
      - "-usr/lib/systemd"
      - "-usr/lib/glib-networking"
      - "-usr/lib/dconf"
      - "-usr/lib/*/avahi"
      - "-usr/lib/*/gio"
      - "-usr/lib/*/libatk*"
      - "-usr/lib/*/libatspi*"
      - "-usr/lib/*/libavahi*"
      - "-usr/lib/*/libcairo*"
      - "-usr/lib/*/libcolordprivate*"
      - "-usr/lib/*/libcolord*"
      - "-usr/lib/*/libcroco*"
      - "-usr/lib/*/libcups*"
      - "-usr/lib/*/libdatrie*"
      - "-usr/lib/*/libdconf*"
      - "-usr/lib/*/libepoxy*"
      - "-usr/lib/*/libexpatw*"
      - "-usr/lib/*/libffi*"
      - "-usr/lib/*/libfontconfig*"
      - "-usr/lib/*/libfreetype*"
      - "-usr/lib/*/libgdk_pixbuf*"
      - "-usr/lib/*/libgdk_pixbuf_xlib*"
      - "-usr/lib/*/libgio*"
      - "-usr/lib/*/libglib*"
      - "-usr/lib/*/libgmodule*"
      - "-usr/lib/*/libgmp*"
      - "-usr/lib/*/libgnutls*"
      - "-usr/lib/*/libgobject*"
      - "-usr/lib/*/libgraphite2*"
      - "-usr/lib/*/libgssapi_krb5*"
      - "-usr/lib/*/libgthread*"
      - "-usr/lib/*/libharfbuzz*"
      - "-usr/lib/*/libhogweed*"
      - "-usr/lib/*/libicuio*"
      - "-usr/lib/*/libicutest*"
      - "-usr/lib/*/libicutu*"
      - "-usr/lib/*/libicuuc*"
      - "-usr/lib/*/libidn2*"
      - "-usr/lib/*/libjbig*"
      - "-usr/lib/*/libjpeg*"
      - "-usr/lib/*/libjson*"
      - "-usr/lib/*/libk5crypto*"
      - "-usr/lib/*/libkrb5*"
      - "-usr/lib/*/libkrb5support*"
      - "-usr/lib/*/liblcms2*"
      - "-usr/lib/*/libnettle*"
      - "-usr/lib/*/libp11*"
      - "-usr/lib/*/libpango*"
      - "-usr/lib/*/libpangocairo*"
      - "-usr/lib/*/libpangoft2*"
      - "-usr/lib/*/libpixman*"
      - "-usr/lib/*/libpng16*"
      - "-usr/lib/*/libproxy*"
      - "-usr/lib/*/librest*"
      - "-usr/lib/*/librsvg*"
      - "-usr/lib/*/libsecret*"
      - "-usr/lib/*/libsoup*"
      - "-usr/lib/*/libsqlite3*"
      - "-usr/lib/*/libtasn1*"
      - "-usr/lib/*/libthai*"
      - "-usr/lib/*/libtiff*"
      - "-usr/lib/*/libunistring*"
      - "-usr/lib/*/libwayland*"
      - "-usr/lib/*/libX11*"
      - "-usr/lib/*/libXau*"
      - "-usr/lib/*/libxcb*"
      - "-usr/lib/*/libXcomposite*"
      - "-usr/lib/*/libXcursor*"
      - "-usr/lib/*/libXdamage*"
      - "-usr/lib/*/libXdmcp*"
      - "-usr/lib/*/libXext*"
      - "-usr/lib/*/libXfixes*"
      - "-usr/lib/*/libXinerama*"
      - "-usr/lib/*/libXi*"
      - "-usr/lib/*/libxkbcommon*"
      - "-usr/lib/*/libxml2*"
      - "-usr/lib/*/libXrandr*"
      - "-usr/lib/*/libXrender*"
plugs:
  gnome-3-28-1804:
    interface: content
    target: $SNAP/gnome-platform
    default-provider: gnome-3-28-1804
  gtk-3-themes:
    interface: content
    target: $SNAP/data-dir/themes
    default-provider: gtk-common-themes
  icon-themes:
    interface: content
    target: $SNAP/data-dir/icons
    default-provider: gtk-common-themes
  sound-themes:
    interface: content
    target: $SNAP/data-dir/sounds
    default-provider: gtk-common-themes
!include UAC.nsh

!ifndef INSTALL_MODE_PER_ALL_USERS
  !include multiUserUi.nsh
!endif

!ifndef BUILD_UNINSTALLER
  !ifndef HIDE_RUN_AFTER_FINISH
    Function StartApp
      ${if} ${isUpdated}
        StrCpy $1 "--updated"
      ${else}
        StrCpy $1 ""
      ${endif}
      ${StdUtils.ExecShellAsUser} $0 "$launchLink" "open" "$1"
    FunctionEnd

    !define MUI_FINISHPAGE_RUN
    !define MUI_FINISHPAGE_RUN_FUNCTION "StartApp"
  !endif

  !ifmacrodef customWelcomePage
    !insertmacro customWelcomePage
  !endif

  !ifmacrodef licensePage
    !insertmacro skipPageIfUpdated
    !insertmacro licensePage
  !endif

  !ifndef INSTALL_MODE_PER_ALL_USERS
    !insertmacro PAGE_INSTALL_MODE
  !endif

  !ifdef allowToChangeInstallationDirectory
    !include StrContains.nsh

    !insertmacro skipPageIfUpdated
    !insertmacro MUI_PAGE_DIRECTORY

    # pageDirectory leave doesn't work (it seems because $INSTDIR is set after custom leave function)
    # so, we use instfiles pre
    !define MUI_PAGE_CUSTOMFUNCTION_PRE instFilesPre

    # sanitize the MUI_PAGE_DIRECTORY result to make sure it has a application name sub-folder
    Function instFilesPre
      ${If} ${FileExists} "$INSTDIR\*"
        ${StrContains} $0 "${APP_FILENAME}" $INSTDIR
        ${If} $0 == ""
          StrCpy $INSTDIR "$INSTDIR\${APP_FILENAME}"
        ${endIf}
      ${endIf}
    FunctionEnd
  !endif
  !insertmacro MUI_PAGE_INSTFILES
  !insertmacro MUI_PAGE_FINISH
!else
  !insertmacro MUI_UNPAGE_WELCOME
  !ifndef INSTALL_MODE_PER_ALL_USERS
    !insertmacro PAGE_INSTALL_MODE
  !endif
  !insertmacro MUI_UNPAGE_INSTFILES
  !insertmacro MUI_UNPAGE_FINISH
!endif

!macro initMultiUser
  !ifdef INSTALL_MODE_PER_ALL_USERS
    !insertmacro setInstallModePerAllUsers
  !else
    ${If} ${UAC_IsInnerInstance}
    ${AndIfNot} ${UAC_IsAdmin}
      # special return value for outer instance so it knows we did not have admin rights
      SetErrorLevel 0x666666
      Quit
    ${endIf}

    !ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED
      !define MULTIUSER_INIT_TEXT_ADMINREQUIRED "$(^Caption) requires administrator privileges."
    !endif

    !ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED
      !define MULTIUSER_INIT_TEXT_POWERREQUIRED "$(^Caption) requires at least Power User privileges."
    !endif

    !ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE
      !define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this computer."
    !endif

    # checks registry for previous installation path (both for upgrading, reinstall, or uninstall)
    StrCpy $hasPerMachineInstallation "0"
    StrCpy $hasPerUserInstallation "0"

    # set installation mode to setting from a previous installation
    ReadRegStr $perMachineInstallationFolder HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation
    ${if} $perMachineInstallationFolder != ""
      StrCpy $hasPerMachineInstallation "1"
    ${endif}

    ReadRegStr $perUserInstallationFolder HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation
    ${if} $perUserInstallationFolder != ""
      StrCpy $hasPerUserInstallation "1"
    ${endif}

    ${GetParameters} $R0
    ${GetOptions} $R0 "/allusers" $R1
    ${IfNot} ${Errors}
      StrCpy $hasPerMachineInstallation "1"
      StrCpy $hasPerUserInstallation "0"
    ${EndIf}

    ${GetOptions} $R0 "/currentuser" $R1
    ${IfNot} ${Errors}
      StrCpy $hasPerMachineInstallation "0"
      StrCpy $hasPerUserInstallation "1"
    ${EndIf}

    ${if} $hasPerUserInstallation == "1"
    ${andif} $hasPerMachineInstallation == "0"
      !insertmacro setInstallModePerUser
    ${elseif} $hasPerUserInstallation == "0"
      ${andif} $hasPerMachineInstallation == "1"
      !insertmacro setInstallModePerAllUsers
    ${else}
      # if there is no installation, or there is both per-user and per-machine
      !ifdef INSTALL_MODE_PER_ALL_USERS
        !insertmacro setInstallModePerAllUsers
      !else
        !insertmacro setInstallModePerUser
      !endif
    ${endif}
  !endif
!macroend
# assisted installer messages, see messages.yml for one-click installer messages
chooseInstallationOptions:
  en: Choose Installation Options
  de: Installationsoption wÃ¤hlen
  ru: Ð’Ñ‹Ð±ÐµÑ€Ð¸Ñ‚Ðµ Ð¾Ð¿Ñ†Ð¸Ð¸ ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²ÐºÐ¸
  sk: Vyberte moÅ¾nosti inÅ¡talÃ¡cie
  fr: Choisis les options d'installation
  hu_HU: TelepÃ­tÃ©si opciÃ³k kivÃ¡lasztÃ¡sa
  pt_BR: Escolha uma opÃ§Ã£o de instalaÃ§Ã£o
  zh_CN: å®‰è£…é€‰é¡¹
  tr_TR: YÃ¼kleme AyarlarÄ±nÄ± SeÃ§in
  sv_SE: VÃ¤lj alternativ fÃ¶r installation
  pl_PL: Wybierz opcje instalacji
  no: Velg alternativer for installering
  nl_NL: Kies installatie-opties
  it_IT: Scegli opzioni di installazione
  fi: Valitse asennusvaihtoehdot
  es: Elegir opciones de instalaciÃ³n
  da: VÃ¦lg Installeringsmuligheder
  ja: ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã�®é�¸æŠž
chooseUninstallationOptions:
  en: Choose Uninstallation Options
  de: Deinstallationsoption wÃ¤hlen
  ru: Ð’Ñ‹Ð±ÐµÑ€Ð¸Ñ‚Ðµ Ð¾Ð¿Ñ†Ð¸Ð¸ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ�
  sk: Vyberte moÅ¾nosti odinÅ¡talovania
  fr: Choisis les options de dÃ©sinstallation
  hu_HU: EltÃ¡volÃ­tÃ¡si opciÃ³k kivÃ¡lasztÃ¡sa
  pt_BR: Escolha uma opÃ§Ã£o de desinstalaÃ§Ã£o
  zh_CN: å�¸è½½é€‰é¡¹
  tr_TR: KaldÄ±rma AyarlarÄ±nÄ± SeÃ§in
  sv_SE: VÃ¤lj alternativ fÃ¶r avinstallation
  pl_PL: Wybierz opcje dezinstalacji
  no: Velg alternativer for avinstallering
  nl_NL: Kies verwijderings-opties
  it_IT: Scegli opzioni di disinstallazione
  fi: Valitse asennuksen poistovaihtoehdot
  es: Elegir opciones de desinstalaciÃ³n
  da: VÃ¦lg Afinstalleringsmuligheder
  ja: ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã�®é�¸æŠž
whichInstallationShouldBeRemoved:
  en: Which installation should be removed?
  de: Welche Installation soll entfernt werden?
  ru: ÐšÐ°ÐºÑƒÑŽ Ð¸Ð· ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ‹Ñ… Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼ Ñ�Ð»ÐµÐ´ÑƒÐµÑ‚ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ?
  sk: KtorÃ¡ inÅ¡talÃ¡cia by mala byt odstrÃ¡nenÃ¡?
  fr: Quelle installation doit Ãªtre supprimÃ©eÂ ?
  hu_HU: Melyik telepÃ­tÃ©st tÃ¡volÃ­tsuk el?
  pt_BR: Qual instalaÃ§Ã£o deve ser removida?
  zh_CN: éœ€è¦�ç§»é™¤å“ªä¸ªå®‰è£…ï¼Ÿ
  tr_TR: Hangi YÃ¼kleme KaldÄ±rÄ±lsÄ±n?
  sv_SE: Vilken installation ska tas bort?
  pl_PL: KtÃ³rÄ… instalacjÄ™ chcesz usunÄ…Ä‡?
  no: Hvilken installasjon skal fjernes?
  nl_NL: Welke installatie moet worden verwijderd?
  it_IT: Quale installazione intendi rimuovere?
  fi: MikÃ¤ asennus pitÃ¤isi poistaa?
  es: Â¿QuÃ© tipo de instalaciÃ³n debe eliminarse?
  da: Hvilken installering skal fjernes?
  ja: ã�©ã‚Œã‚’ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�—ã�¾ã�™ã�‹ï¼Ÿ
whoShouldThisApplicationBeInstalledFor:
  en: Who should this application be installed for?
  de: FÃ¼r wen soll diese Anwendung installiert werden?
  ru: Ð”Ð»Ñ� ÐºÐ¾Ð³Ð¾ Ñ�Ð»ÐµÐ´ÑƒÐµÑ‚ ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ Ñ�Ñ‚Ð¾ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ?
  sk: Pre koho sa ma tÃ¡to aplikacia inÅ¡talovaÅ¥?
  fr: Pour qui cette application doit-elle Ãªtre installÃ©eÂ ?
  hu_HU: Kinek legyen ez az alkalmazÃ¡s telepÃ­tve?
  pt_BR: Para quem esta aplicaÃ§Ã£o deve ser instalada?
  zh_CN: ä¸ºå“ªä½�ç”¨æˆ·å®‰è£…è¯¥åº”ç”¨ï¼Ÿ
  tr_TR: Bu Uygulama Kimler iÃ§in Kurulsun?
  sv_SE: Vem ska den hÃ¤r applikationen installeras fÃ¶r?
  pl_PL: Dla kogo zainstalowaÄ‡ tÄ™ aplikacjÄ™?
  no: Hvem skal dette programmet installeres for?
  nl_NL: Voor wie moet deze applicatie worden geÃ¯nstalleerd?
  it_IT: Per chi dovrebbe essere installata questa applicazione?
  fi: Kenen kÃ¤yttÃ¶Ã¶n tÃ¤mÃ¤ sovellus pitÃ¤isi asentaa?
  es: Â¿Para quiÃ©n se instalarÃ¡ esta aplicaciÃ³n?
  da: Hvem skal denne applikation installeres til?
  ja: ã�©ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�—ã�¾ã�™ã�‹ï¼Ÿ
selectUserMode:
  en: Please select whether you wish to make this software available to all users or just yourself
  de: Bitte wÃ¤hlen Sie, ob Sie die Anwendung nur fÃ¼r sich oder fÃ¼r alle Benutzer installieren mÃ¶chten.
  ru: Ð’Ñ‹Ð±ÐµÑ€Ð¸, Ñ…Ð¾Ñ‡ÐµÑˆÑŒ Ð»Ð¸ Ñ‚Ñ‹ Ñ�Ð´ÐµÐ»Ð°Ñ‚ÑŒ Ñ�Ñ‚Ñƒ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñƒ Ð´Ð¾Ñ�Ñ‚ÑƒÐ¿Ð½Ð¾Ð¹ Ð´Ð»Ñ� Ð²Ñ�ÐµÑ… Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ Ð¸Ð»Ð¸ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ� Ñ�ÐµÐ±Ñ�
  sk: ProsÃ­m vyberte Ä�i sa ma tento softvÃ©r inÅ¡talovaÅ¥ len pre VÃ¡s alebo pre vÅ¡etkÃ½ch uÅ¾ivateÄ¾ov
  fr: "Choisis pour qui ce logiciel doit Ãªtre accessibleÂ : pour tous les utilisateurs ou juste pour toiÂ ?"
  hu_HU: VÃ¡laszd ki, hogy a szoftver elÃ©rhetÅ‘ legyen-e minden felhasznÃ¡lÃ³ szÃ¡mÃ¡ra, vagy csak neked
  pt_BR: Por favor, selecione se este software deve estar disponÃ­vel apenas para vocÃª ou para todos usuÃ¡rios
  zh_CN: è¯·é€‰æ‹©ä¸ºå½“å‰�ç”¨æˆ·è¿˜æ˜¯æ‰€æœ‰ç”¨æˆ·å®‰è£…è¯¥è½¯ä»¶
  tr_TR: LÃ¼tfen bu yazÄ±lÄ±mÄ± tÃ¼m kullanÄ±cÄ±lar iÃ§in mi yoksa sadece kendiniz mi kullanmak istediÄŸinizi seÃ§in
  sv_SE: VÃ¤lj om du vill gÃ¶ra den hÃ¤r mjukvaran tillgÃ¤nglig fÃ¶r alla anvÃ¤ndare eller bara fÃ¶r dig
  pl_PL: Wybierz, czy to oprogramowanie ma byÄ‡ dostÄ™pne dla wszystkich uÅ¼ytkownikÃ³w, czy tylko dla Ciebie
  no: Velg om du vil gjÃ¸re denne programvaren tilgjengelig for alle brukerne eller bare deg selv
  nl_NL: Selecteer of je deze software beschikbaar wilt maken voor alle gebruikers of alleen voor jezelf.
  it_IT: Seleziona se desideri rendere questo software accessibile a tutti gli utenti o solo a te
  fi: Valitse, haluatko tÃ¤mÃ¤n ohjelmiston kaikkien kÃ¤yttÃ¤jien vai pelkÃ¤stÃ¤Ã¤n itsesi kÃ¤yttÃ¶Ã¶n
  es: Elige si deseas que este software estÃ© disponible para todos los usuarios o solo para ti.
  da: VÃ¦lg, om du vil gÃ¸re denne software tilgÃ¦ngelig for andre brugere, eller kun for dig selv
  ja: ã�“ã�®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’ã�™ã�¹ã�¦ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�Œä½¿ç”¨ã�§ã��ã‚‹ã‚ˆã�†ã�«ã�™ã‚‹ã�‹ã€�ç�¾åœ¨ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�®ã�¿ä½¿ç”¨ã�™ã‚‹ã�‹ã‚’é�¸æŠžã�—ã�¦ã��ã� ã�•ã�„
whichInstallationRemove:
  en: This software is installed both per-machine (all users) and per-user.\nWhich installation you wish to remove?
  de: Die Anwendung wurde fÃ¼r alle Benutzer und pro Benutzer installiert.\nWelche Installation mÃ¶chten Sie entfernen?
  ru: Ð­Ñ‚Ð° Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð° Ð´Ð»Ñ� Ð²Ñ�ÐµÐ³Ð¾ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° (Ð´Ð»Ñ� Ð²Ñ�ÐµÑ… Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹) Ð¸ Ð´Ð»Ñ� Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ�.\nÐšÐ°ÐºÑƒÑŽ Ð¸Ð· ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ‹Ñ… Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼ Ñ‚Ñ‹ Ñ…Ð¾Ñ‡ÐµÑˆÑŒ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ?
  sk: Tento softvÃ©r je nainÅ¡talovanÃ½ pre VÃ¡s a sÃºÄ�asne pre vÅ¡etkÃ½ch uÅ¾ivateÄ¾ov.\nKtorÃº inÅ¡talÃ¡ciu si Å¾elÃ¡te odstraniÅ¥?
  fr: Ce logiciel est installÃ© Ã  la fois par machine (tous les utilisateurs) et par utilisateur.\nQuelle installation veux-tu supprimerÂ ?
  hu_HU: Ez a szoftver szÃ¡mÃ­tÃ³gÃ©penkÃ©nt (minden felhasznÃ¡lÃ³) Ã©s felhasznÃ¡lÃ³nkÃ©nt is telepÃ­tve van.\nMelyik telepÃ­tÃ©st szeretnÃ©d eltÃ¡volÃ­tani?
  pt_BR: Este software Ã© instalado por mÃ¡quina (todos os usuÃ¡rios) e por usuÃ¡rio. Qual instalaÃ§Ã£o vocÃª deseja remover?
  zh_CN: è¯¥è½¯ä»¶å·²ä¸ºæ‰€æœ‰ç”¨æˆ·å’Œå½“å‰�ç”¨æˆ·å®‰è£….\næ‚¨å¸Œæœ›ç§»é™¤å“ªä¸ªå®‰è£…?
  tr_TR: Bu yazÄ±lÄ±m hem makine baÅŸÄ±na (tÃ¼m kullanÄ±cÄ±lar) hem de kullanÄ±cÄ± baÅŸÄ±na yÃ¼klenir.\nKaldÄ±rmak istediÄŸiniz kurulum?
  sv_SE: Den hÃ¤r mjukvaran Ã¤r installerad bÃ¥de â€�per datorâ€� (alla anvÃ¤ndare) och â€�per anvÃ¤ndareâ€�.\nVilken installation vill du ta bort?
  pl_PL: To oprogramowanie zostaÅ‚o zainstalowane zarÃ³wno dla urzÄ…dzenia (wszyscy uÅ¼ytkownicy), jak i dla uÅ¼ytkownika.\nKtÃ³rÄ… instalacjÄ™ chcesz usunÄ…Ä‡?
  no: Denne programvaren er installert bÃ¥de per-maskin (alle brukere) og per-bruker. Hvilken installasjon vil du fjerne?
  nl_NL: Deze software is zowel per apparaat (alle gebruikers) als per gebruiker geÃ¯nstalleerd. Welke installatie wil je verwijderen?
  it_IT: Questo software Ã¨ stato installato sia per computer (tutti gli utenti) sia per utente.\nQuale installazione desideri rimuovere?
  fi: TÃ¤mÃ¤ ohjelmisto on asennettu sekÃ¤ konekohtaisesti (kaikki kÃ¤yttÃ¤jÃ¤t) ettÃ¤ kÃ¤yttÃ¤jÃ¤kohtaisesti.\nMinkÃ¤ asennuksen haluat poistaa?
  es: Este software se ha instalado para la mÃ¡quina (todos los usuarios) y para el usuario.\nÂ¿QuÃ© instalaciÃ³n quieres eliminar?
  da: Denne software er installeret bÃ¥de pr. maskine (alle brugere) og pr. bruger./nHvilken installering Ã¸nsker du at fjerne?
  ja: ã�“ã�®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã�¯ã€�ãƒžã‚·ãƒ³ã�”ã�¨ï¼ˆã�™ã�¹ã�¦ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼‰ã�¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�”ã�¨ã�«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�•ã‚Œã�¦ã�„ã�¾ã�™ã€‚\ nã�©ã�¡ã‚‰ã‚’å‰Šé™¤ã�—ã�¾ã�™ã�‹ï¼Ÿ
freshInstallForAll:
  en: Fresh install for all users. (will prompt for admin credentials)
  de: Neuinstallation fÃ¼r alle Benutzer durchfÃ¼hren. (Administratorrechte benÃ¶tigt)
  ru: Ð�Ð¾Ð²Ð°Ñ� ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²ÐºÐ° Ð´Ð»Ñ� Ð²Ñ�ÐµÑ… Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹. (Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑŽÑ‚Ñ�Ñ� Ð¿Ñ€Ð°Ð²Ð° Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ�Ñ‚Ñ€Ð°Ñ‚Ð¾Ñ€Ð°)
  sk: NovÃ¡ inÅ¡talÃ¡cia pre vÅ¡etkÃ½ch uÅ¾ivateÄ¾ov. (will prompt for admin credentials)
  fr: Nouvelle installation pour tous les utilisateurs. (demandera les identifiants administrateur)
  hu_HU: Ãšj telepÃ­tÃ©s minden felhasznÃ¡lÃ³ szÃ¡mÃ¡ra. (Az adminisztrÃ¡tor hitelesÃ­tÅ‘ adataira lesz szÃ¼ksÃ©g.)
  pt_BR: InstalaÃ§Ã£o limpa para todos os usuÃ¡rios. (irÃ¡ solicitar credenciais de administrador)
  zh_CN: ä¸ºæ‰€æœ‰ç”¨æˆ·è¿›è¡Œå…¨æ–°å®‰è£…. (éœ€è¦�ç®¡ç�†å‘˜èµ„æ ¼)
  tr_TR: TÃ¼m kullanÄ±cÄ±lar iÃ§in yeni yÃ¼kleme. (yÃ¶netici kimlik bilgilerini soracaktÄ±r)
  sv_SE: Ny installation fÃ¶r alla anvÃ¤ndare. (kommer att begÃ¤ra adminbehÃ¶righet)
  pl_PL: Nowa instalacja dla wszystkich uÅ¼ytkownikÃ³w (potrzebne bÄ™dÄ… dane administratora).
  no: Ny installasjon for alle brukere. (vil be om administratorlegitimasjon)
  nl_NL: Nieuwe installatie voor alle gebruikers. (zal om beheerder-gegevens vragen)
  it_IT: Re-installa per tutti gli utenti. (Richiede le credenziali di amministratore)
  fi: Uusi asennus kaikille kÃ¤yttÃ¤jille (pyytÃ¤Ã¤ yllÃ¤pitÃ¤jÃ¤n kÃ¤yttÃ¤jÃ¤tunnuksia)
  es: InstalaciÃ³n nueva para todos los usuarios (se pedirÃ¡n los credenciales del administrador)
  da: Ny installering til alle brugere. (Vil medfÃ¸re administrations-legitimationsoplysninger)
  ja: ã�™ã�¹ã�¦ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�«æ–°è¦�ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ï¼ˆç®¡ç�†è€…æ¨©é™�ã�Œå¿…è¦�ï¼‰
freshInstallForCurrent:
  en: Fresh install for current user only.
  de: Neuinstallation nur fÃ¼r den aktuellen Benutzer durchfÃ¼hren.
  ru: Ð�Ð¾Ð²Ð°Ñ� ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²ÐºÐ° Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ� Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ�.
  fr: Nouvelle installation uniquement pour l'utilisateur actuel.
  hu_HU: Ãšj telepÃ­tÃ©s csak a jelenlegi felhasznÃ¡lÃ³ szÃ¡mÃ¡ra.
  pt_BR: InstalaÃ§Ã£o limpa somente para o usuÃ¡rio atual.
  zh_CN: ä»…ä¸ºå½“å‰�ç”¨æˆ·è¿›è¡Œå…¨æ–°å®‰è£….
  tr_TR: Sadece mevcut kullanÄ±cÄ± iÃ§in yeni yÃ¼kleme.
  sv_SE: Ny installation endast fÃ¶r den aktuella anvÃ¤ndaren.
  pl_PL: Nowa instalacja wyÅ‚Ä…cznie dla obecnego uÅ¼ytkownika.
  no: Ny installasjon kun for nÃ¥vÃ¦rende bruker.
  nl_NL: Nieuwe installatie alleen voor huidige gebruiker.
  it_IT: Re-installa solo per l'utente attuale.
  fi: Uusi asennus vain nykyiselle kÃ¤yttÃ¤jÃ¤lle.
  es: InstalaciÃ³n nueva solo para el usuario actual.
  da: Ny installering kun til nuvÃ¦rende bruger.
  ja: ç�¾åœ¨ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�®ã�¿æ–°è¦�ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«
onlyForMe:
  en: Only for &me
  de: Nur fÃ¼r &mich
  ru: Ð¢Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ� &Ð¼ÐµÐ½Ñ�
  sk: Iba pre mÅˆa
  fr: Juste pour moi
  hu_HU: Csak az Ã©n szÃ¡momra
  pt_BR: Apenas para &mim
  zh_CN: ä»…ä¸ºæˆ‘å®‰è£…
  tr_TR: Sadece benim iÃ§in
  sv_SE: Endast fÃ¶r &mig
  pl_PL: Tylko dla &mnie
  no: Kun for &meg
  nl_NL: Alleen voor &mij
  it_IT: Solo per &me
  fi: Vain minulle
  es: Solo para mÃ­.
  da: Kun til mig
  ja: ç�¾åœ¨ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�®ã�¿ã�«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�™ã‚‹
forAll:
  en: Anyone who uses this computer (&all users)
  de: FÃ¼r alle Benutzer dieses Computers (&alle Benutzer)
  ru: Ð”Ð»Ñ� &Ð²Ñ�ÐµÑ… Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð°
  sk: Pre kaÅ¾dÃ©ho kto pouÅ¾iva tento poÄ�itaÄ� (vÅ¡etci uÅ¾ivatelia)
  fr: Pour tous ceux qui utilisent cet ordinateur (tous les utilisateurs)
  hu_HU: BÃ¡rki szÃ¡mÃ¡ra, aki ezt a szÃ¡mÃ­tÃ³gÃ©pet hasznÃ¡lja (minden felhasznÃ¡lÃ³)
  pt_BR: Para todos que usam esta mÃ¡quina (&todos os usuÃ¡rios)
  zh_CN: ä¸ºä½¿ç”¨è¿™å�°ç”µè„‘çš„ä»»ä½•äººå®‰è£… (æ‰€æœ‰ç”¨æˆ·)
  tr_TR: Bu bilgisayarÄ± kullanan herkes (ve tÃ¼m kullanÄ±cÄ±lar)
  sv_SE: Alla som anvÃ¤nder den hÃ¤r datorn (alla anvÃ¤ndare)
  pl_PL: KaÅ¼dy korzystajÄ…cy z tego komputera (wszyscy uÅ¼ytkownicy)
  no: Alle som bruker denne datamaskinen (alle brukere)
  nl_NL: Iedereen die deze computer gebruikt (alle gebruikers)
  it_IT: Per chiunque usi questo computer (tutti gli utenti)
  fi: Kaikille, jotka kÃ¤yttÃ¤vÃ¤t tÃ¤tÃ¤ tietokonetta (kaikki kÃ¤yttÃ¤jÃ¤t)
  es: Cualquiera que utilice este ordenador (todos los usuarios)
  da: Enhver, der bruger denne computer (alle brugere)
  ja: ã�“ã�®ã‚³ãƒ³ãƒ”ãƒ¥ãƒ¼ã‚¿ãƒ¼ã‚’ä½¿ç”¨ã�—ã�¦ã�„ã‚‹ã�™ã�¹ã�¦ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ç”¨ã�«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�™ã‚‹
loginWithAdminAccount:
  en: You need to login with an account that is a member of the admin group to continue...
  de: Um die Installation fortzusetzen mÃ¼ssen Sie sich mit einem Administrator-Account anmelden...
  ru: Ð§Ñ‚Ð¾Ð±Ñ‹ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÑŒ, Ñ‚ÐµÐ±Ðµ Ð½ÑƒÐ¶Ð½Ð¾ Ð²Ð¾Ð¹Ñ‚Ð¸ Ð² ÑƒÑ‡ÐµÑ‚Ð½ÑƒÑŽ Ð·Ð°Ð¿Ð¸Ñ�ÑŒ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ� Ð²Ñ…Ð¾Ð´Ð¸Ñ‚ Ð² Ð³Ñ€ÑƒÐ¿Ð¿Ñƒ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ�Ñ‚Ñ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð²...
  sk: Pre pokraÄ�ovanie sa musÃ­te zalogovaÅ¥ s ÃºÄ�tom ktorÃ½ patrÃ­ do skupiny adminstrÃ¡torov...
  fr: Tu dois te connecter avec un compte ayant des droits d'administrateur pour continuer...
  hu_HU: A folytatÃ¡shoz adminisztrÃ¡tori jogokkal rendelkezÅ‘ fiÃ³kkal kell bejelentkezned...
  pt_BR: VocÃª precisa realizar o login com uma conta que Ã© membro do grupo de administraÃ§Ã£o para continuar...
  zh_CN: æ‚¨éœ€è¦�ç”¨å±žäºŽç®¡ç�†å‘˜ç¾¤ç»„çš„ç”¨æˆ·è´¦æˆ·ç™»å½•æ�¥ç»§ç»­...
  tr_TR: Devam etmek iÃ§in yÃ¶netici grubunun Ã¼yesi olan bir hesapla giriÅŸ yapmanÄ±z gerekiyor..
  sv_SE: Du mÃ¥ste logga in med ett konto som Ã¤r medlem i admingruppen fÃ¶r att fortsÃ¤tta...
  pl_PL: Musisz siÄ™ zalogowaÄ‡ za pomocÄ… konta bÄ™dÄ…cego czÅ‚onkiem grupy administratora, by kontynuowaÄ‡...
  no: Du mÃ¥ logge inn med en konto som er medlem av administrasjonsgruppen for Ã¥ fortsette...
  nl_NL: Je dient in te loggen met een account dat lid is van de beheerdersgroep om verder te gaan...
  it_IT: Devi accedere con un account incluso nel gruppo amministratore per continuare...
  fi: Jatkaaksesi sinun on kirjauduttava kÃ¤yttÃ¤jÃ¤tilillÃ¤, joka on yllÃ¤pitÃ¤jÃ¤ryhmÃ¤n jÃ¤sen...
  es: Para continuar, tienes que iniciar sesiÃ³n con una cuenta que pertenezca al grupo de administradores...
  da: Du skal logge ind med en konto, der er medlem af administrationsgruppen for at kunne fortsÃ¦tte...
  ja: ç¶šè¡Œã�™ã‚‹ã�«ã�¯ã€�ç®¡ç�†è€…æ¨©é™�ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã�§ãƒ­ã‚°ã‚¤ãƒ³ã�™ã‚‹å¿…è¦�ã�Œã�‚ã‚Šã�¾ã�™...
perUserInstallExists:
  en: There is already a per-user installation.
  de: Es existiert bereits eine Installtion fÃ¼r den ausgewÃ¤hlten Benutzer.
  ru: Ð£Ð¶Ðµ ÐµÑ�Ñ‚ÑŒ ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ� Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° Ð´Ð»Ñ� Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ�.
  fr: Il y a dÃ©jÃ  une installation par utilisateur.
  hu_HU: MÃ¡r van egy felhasznÃ¡lÃ³nkÃ©nti telepÃ­tÃ©s.
  pt_BR: JÃ¡ existe uma instalaÃ§Ã£o por usuÃ¡rio.
  zh_CN: å·²ç»�å­˜åœ¨ä¸€ä¸ªå®‰è£…åˆ°å½“å‰�ç”¨æˆ·çš„å®‰è£….
  tr_TR: Her kullanÄ±cÄ± iÃ§in zaten bir kurulum var.
  sv_SE: Det finns redan en â€�per anvÃ¤ndareâ€�-installation.
  pl_PL: Instalacja dla uÅ¼ytkownika juÅ¼ istnieje.
  no: Det er allerede en per-bruker-installasjon.
  nl_NL: Er is al een installatie 'per gebruiker'.
  it_IT: Ãˆ giÃ  presente un'installazione per utente.
  fi: TÃ¤mÃ¤ on jo kÃ¤yttÃ¤jÃ¤kohtainen asennus.
  es: Ya hay una instalaciÃ³n por usuario.
  da: Der er allerede en pr. bruger installation.
  ja: ã�™ã�§ã�«ç�¾åœ¨ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�•ã‚Œã�¦ã�„ã�¾ã�™ã€‚
perUserInstall:
  en: There is a per-user installation.
  de: Benutzerinstallation bereits vorhanden.
  ru: Ð•Ñ�Ñ‚ÑŒ ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ� Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° Ð´Ð»Ñ� Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ�.
  fr: Il y a une installation par utilisateur.
  hu_HU: Van felhasznÃ¡lÃ³nkÃ©nti telepÃ­tÃ©s.
  pt_BR: Existe uma instalaÃ§Ã£o por usuÃ¡rio.
  zh_CN: å­˜åœ¨ä¸€ä¸ªå®‰è£…åˆ°å½“å‰�ç”¨æˆ·çš„å®‰è£….
  tr_TR: KullanÄ±cÄ± baÅŸÄ±na bir kurulum var.
  sv_SE: Det finns en â€�per anvÃ¤ndareâ€�-installation.
  pl_PL: Instalacja dla uÅ¼ytkownika istnieje.
  no: Det er en per-bruker-installasjon.
  nl_NL: Er is een installatie 'per gebruiker'.
  it_IT: Ãˆ presente un'installazione per utente.
  fi: KÃ¤yttÃ¤jÃ¤kohtainen asennus on olemassa.
  es: Hay una instalaciÃ³n por usuario.
  da: Der er en pr. bruger installation.
  ja: ãƒ¦ãƒ¼ã‚¶ãƒ¼ã�”ã�¨ã�®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�Œã�‚ã‚Šã�¾ã�™ã€‚
perMachineInstallExists:
  en: There is already a per-machine installation.
  de: Es existiert bereits eine Installation fÃ¼r diesen Computer.
  ru: Ð£Ð¶Ðµ ÐµÑ�Ñ‚ÑŒ ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ� Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° Ð´Ð»Ñ� Ð²Ñ�ÐµÐ³Ð¾ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð°.
  fr: Il y a dÃ©jÃ  une installation par machine.
  hu_HU: MÃ¡r van egy szÃ¡mÃ­tÃ³gÃ©penkÃ©nti telepÃ­tÃ©s.
  pt_BR: JÃ¡ existe uma instalaÃ§Ã£o por mÃ¡quina.
  zh_CN: å·²ç»�å­˜åœ¨ä¸€ä¸ªå®‰è£…åˆ°æ‰€æœ‰ç”¨æˆ·çš„å®‰è£….
  tr_TR: Zaten makine baÅŸÄ±na bir kurulum var.
  sv_SE: Det finns redan en â€�per datorâ€�-installation.
  pl_PL: Instalacja dla urzÄ…dzenia juÅ¼ istnieje.
  no: Det er allerede en per-maskin-installasjon.
  nl_NL: Er is al een installatie 'per apparaat'.
  it_IT: Ãˆ giÃ  presente un'installazione per computer.
  fi: TÃ¤mÃ¤ on jo tietokonekohtainen asennus.
  es: Ya hay una instalaciÃ³n por mÃ¡quina.
  da: Der er allerede en pr. maskine installation.
  ja: æ—¢ã�«ã�™ã�¹ã�¦ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ç”¨ã�«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�•ã‚Œã�¦ã�„ã�¾ã�™ã€‚
perMachineInstall:
  en: There is a per-machine installation.
  de: Es existiert eine Installation fÃ¼r diesen Computer.
  ru: Ð•Ñ�Ñ‚ÑŒ ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ� Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° Ð´Ð»Ñ� Ð²Ñ�ÐµÐ³Ð¾ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð°.
  fr: Il y a une installation par machine.
  hu_HU: Van szÃ¡mÃ­tÃ³gÃ©penkÃ©nti telepÃ­tÃ©s.
  pt_BR: Existe uma instalaÃ§Ã£o por mÃ¡quina.
  zh_CN: å­˜åœ¨ä¸€ä¸ªå®‰è£…åˆ°æ‰€æœ‰ç”¨æˆ·çš„å®‰è£….
  tr_TR: Makine baÅŸÄ±na bir yÃ¼kleme var.
  sv_SE: Det finns en â€�per datorâ€�-installation.
  pl_PL: Instalacja dla urzÄ…dzenia istnieje.
  no: Det er en per-maskin-installasjon.
  nl_NL: Er is een installatie 'per apparaat'.
  it_IT: Ãˆ presente un'installazione per computer.
  fi: Tietokonekohtainen asennus on olemassa.
  es: Hay una instalaciÃ³n por mÃ¡quina.
  da: Der er en pr. maskine installation.
  ja: ã�™ã�¹ã�¦ã�®ãƒ¦ãƒ¼ã‚¶ãƒ¼ç”¨ã�®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�Œã�‚ã‚Šã�¾ã�™ã€‚
reinstallUpgrade:
  en: Will reinstall/upgrade.
  de: Die Anwendung wird aktualisiert.
  ru: Ð˜Ð³Ñ€Ð° Ð±ÑƒÐ´ÐµÑ‚ Ð¿ÐµÑ€ÐµÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð°/Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð°.
  fr: Va rÃ©installer/mettre Ã  jour.
  hu_HU: ÃšjratelepÃ­t/frissÃ­t.
  pt_BR: IrÃ¡ reinstalar/atualizar.
  zh_CN: å�³å°†é‡�æ–°å®‰è£…/å�‡çº§.
  tr_TR: Yeniden yÃ¼kleme/yÃ¼kseltme
  sv_SE: Kommer att ominstallera/uppgradera.
  pl_PL: NastÄ…pi ponowna instalacja/aktualizacja.
  no: Vil installere pÃ¥ nytt / oppgradere.
  nl_NL: Zal opnieuw installeren/upgraden.
  it_IT: Re-installa/aggiorna il programma.
  fi: Asennetaan uudelleen/pÃ¤ivitetÃ¤Ã¤n.
  es: Se reinstalarÃ¡/actualizarÃ¡.
  da: Reinstallerer/opgraderer.
  ja: å†�ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«/ã‚¢ãƒƒãƒ—ã‚°ãƒ¬ãƒ¼ãƒ‰ã�—ã�¾ã�™ã€‚
uninstall:
  en: Will uninstall.
  de: Die Anwendung wird deinstalliert.
  ru: Ð˜Ð³Ñ€Ð° Ð±ÑƒÐ´ÐµÑ‚ ÑƒÐ´Ð°Ð»ÐµÐ½Ð°.
  fr: Va dÃ©sinstaller.
  hu_HU: EltÃ¡volÃ­t.
  pt_BR: IrÃ¡ desinstalar.
  zh_CN: å�³å°†å�¸è½½.
  tr_TR: KaldÄ±ralacak.
  sv_SE: Kommer att avinstallera.
  pl_PL: NastÄ…pi dezinstalacja.
  no: Vil avinstallere.
  nl_NL: Zal installatie verwijderen.
  it_IT: Disinstalla il programma.
  fi: Poistetaan asennus.
  es: Se desinstalarÃ¡.
  da: Afinstallerer.
  ja: ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�—ã�¾ã�™ã€‚
!include x64.nsh
!include WinVer.nsh

BrandingText "${PRODUCT_NAME} ${VERSION}"
ShowInstDetails nevershow
SpaceTexts none
!ifdef BUILD_UNINSTALLER
  ShowUninstDetails nevershow
!endif
FileBufSize 64
Name "${PRODUCT_NAME}"

!define APP_EXECUTABLE_FILENAME "${PRODUCT_FILENAME}.exe"
!define UNINSTALL_FILENAME "Uninstall ${PRODUCT_FILENAME}.exe"

!macro check64BitAndSetRegView
  ${IfNot} ${AtLeastWin7}
    MessageBox MB_OK "$(win7Required)"
    Quit
  ${EndIf}

  !ifdef APP_64
    ${If} ${RunningX64}
      SetRegView 64
    ${Else}
      !ifndef APP_32
        MessageBox MB_OK|MB_ICONEXCLAMATION "$(x64WinRequired)"
        Quit
      !endif
    ${EndIf}
  !endif
!macroend

# avoid exit code 2
!macro quitSuccess
  SetErrorLevel 0
  Quit
!macroend

!macro setLinkVars
  # old desktop shortcut (could exist or not since the user might has selected to delete it)
  ReadRegStr $oldShortcutName SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" ShortcutName
  ${if} $oldShortcutName == ""
    StrCpy $oldShortcutName "${PRODUCT_FILENAME}"
  ${endIf}
  StrCpy $oldDesktopLink "$DESKTOP\$oldShortcutName.lnk"

  # new desktop shortcut (will be created/renamed in case of a fresh installation or if the user haven't deleted the initial one)
  StrCpy $newDesktopLink "$DESKTOP\${SHORTCUT_NAME}.lnk"

  ReadRegStr $oldMenuDirectory SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" MenuDirectory
  ${if} $oldMenuDirectory == ""
    StrCpy $oldStartMenuLink "$SMPROGRAMS\$oldShortcutName.lnk"
  ${else}
    StrCpy $oldStartMenuLink "$SMPROGRAMS\$oldMenuDirectory\$oldShortcutName.lnk"
  ${endIf}

  # new menu shortcut (will be created/renamed in case of a fresh installation or if the user haven't deleted the initial one)
  !ifdef MENU_FILENAME
    StrCpy $newStartMenuLink "$SMPROGRAMS\${MENU_FILENAME}\${SHORTCUT_NAME}.lnk"
  !else
    StrCpy $newStartMenuLink "$SMPROGRAMS\${SHORTCUT_NAME}.lnk"
  !endif
!macroend

!macro skipPageIfUpdated
  !define UniqueID ${__LINE__}

  Function skipPageIfUpdated_${UniqueID}
    ${if} ${isUpdated}
      Abort
    ${endif}
  FunctionEnd

  !define MUI_PAGE_CUSTOMFUNCTION_PRE skipPageIfUpdated_${UniqueID}
  !undef UniqueID
!macroend

!macro StartApp
  Var /GLOBAL startAppArgs
  ${if} ${isUpdated}
    StrCpy $startAppArgs "--updated"
  ${else}
    StrCpy $startAppArgs ""
  ${endif}

  ${StdUtils.ExecShellAsUser} $0 "$launchLink" "open" "$startAppArgs"
!macroendLoading...!include installer.nsh

InitPluginsDir

${IfNot} ${Silent}
  SetDetailsPrint none
${endif}

StrCpy $appExe "$INSTDIR\${APP_EXECUTABLE_FILENAME}"

# must be called before uninstallOldVersion
!insertmacro setLinkVars

!ifdef ONE_CLICK
  !ifdef HEADER_ICO
    File /oname=$PLUGINSDIR\installerHeaderico.ico "${HEADER_ICO}"
  !endif
  ${IfNot} ${Silent}
    !ifdef HEADER_ICO
      SpiderBanner::Show /MODERN /ICON "$PLUGINSDIR\installerHeaderico.ico"
    !else
      SpiderBanner::Show /MODERN
    !endif

    FindWindow $0 "#32770" "" $hwndparent
    FindWindow $0 "#32770" "" $hwndparent $0
    GetDlgItem $0 $0 1000
    SendMessage $0 ${WM_SETTEXT} 0 "STR:$(installing)"
  ${endif}
  !insertmacro CHECK_APP_RUNNING
!else
  ${ifNot} ${UAC_IsInnerInstance}
    !insertmacro CHECK_APP_RUNNING
  ${endif}
!endif

Var /GLOBAL keepShortcuts
StrCpy $keepShortcuts "false"
!insertMacro setIsTryToKeepShortcuts
${if} $isTryToKeepShortcuts == "true"
  ReadRegStr $R1 SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" KeepShortcuts

  ${if} $R1 == "true"
  ${andIf} ${FileExists} "$appExe"
    StrCpy $keepShortcuts "true"
  ${endIf}
${endif}

!insertmacro uninstallOldVersion SHELL_CONTEXT
${if} $installMode == "all"
  !insertmacro uninstallOldVersion HKEY_CURRENT_USER
${endIf}

SetOutPath $INSTDIR

!ifdef UNINSTALLER_ICON
  File /oname=uninstallerIcon.ico "${UNINSTALLER_ICON}"
!endif

!insertmacro installApplicationFiles
!insertmacro registryAddInstallInfo
!insertmacro addStartMenuLink $keepShortcuts
!insertmacro addDesktopLink $keepShortcuts

${if} ${FileExists} "$newStartMenuLink"
  StrCpy $launchLink "$newStartMenuLink"
${else}
  StrCpy $launchLink "$INSTDIR\${APP_EXECUTABLE_FILENAME}"
${endIf}

!ifmacrodef registerFileAssociations
  !insertmacro registerFileAssociations
!endif

!ifmacrodef customInstall
  !insertmacro customInstall
!endif

!macro doStartApp
  # otherwise app window will be in background
  HideWindow
  !insertmacro StartApp
!macroend

!ifdef ONE_CLICK
  # https://github.com/electron-userland/electron-builder/pull/3093#issuecomment-403734568
  !ifdef RUN_AFTER_FINISH
    ${ifNot} ${Silent}
    ${orIf} ${isForceRun}
      !insertmacro doStartApp
    ${endIf}
  !else
    ${if} ${isForceRun}
      !insertmacro doStartApp
    ${endIf}
  !endif
  !insertmacro quitSuccess
!else
  # for assisted installer run only if silent, because assisted installer has run after finish option
  ${if} ${isForceRun}
  ${andIf} ${Silent}
    !insertmacro doStartApp
  ${endIf}
!endifVar newStartMenuLink
Var oldStartMenuLink
Var newDesktopLink
Var oldDesktopLink
Var oldShortcutName
Var oldMenuDirectory

!include "common.nsh"
!include "MUI2.nsh"
!include "multiUser.nsh"
!include "allowOnlyOneInstallerInstance.nsh"

!ifdef INSTALL_MODE_PER_ALL_USERS
  !ifdef BUILD_UNINSTALLER
    RequestExecutionLevel user
  !else
    RequestExecutionLevel admin
  !endif
!else
  RequestExecutionLevel user
!endif

!ifdef BUILD_UNINSTALLER
  SilentInstall silent
!else
  Var appExe
  Var launchLink
!endif

!ifdef ONE_CLICK
  !include "oneClick.nsh"
!else
  !include "assistedInstaller.nsh"
!endif

!insertmacro addLangs

!ifmacrodef customHeader
  !insertmacro customHeader
!endif

Function .onInit
  !ifmacrodef preInit
    !insertmacro preInit
  !endif

  !ifdef DISPLAY_LANG_SELECTOR
    !insertmacro MUI_LANGDLL_DISPLAY
  !endif

  !ifdef BUILD_UNINSTALLER
    WriteUninstaller "${UNINSTALLER_OUT_FILE}"
    !insertmacro quitSuccess
  !else
    !insertmacro check64BitAndSetRegView

    !ifdef ONE_CLICK
      !insertmacro ALLOW_ONLY_ONE_INSTALLER_INSTANCE
    !else
      ${IfNot} ${UAC_IsInnerInstance}
        !insertmacro ALLOW_ONLY_ONE_INSTALLER_INSTANCE
      ${EndIf}
    !endif

    !insertmacro initMultiUser

    !ifmacrodef customInit
      !insertmacro customInit
    !endif

    !ifmacrodef addLicenseFiles
      InitPluginsDir
      !insertmacro addLicenseFiles
    !endif
  !endif
FunctionEnd

!ifndef BUILD_UNINSTALLER
  !include "installUtil.nsh"
!endif

Section "install"
  !ifndef BUILD_UNINSTALLER
    !include "installSection.nsh"
  !endif
SectionEnd

!ifdef BUILD_UNINSTALLER
  !include "uninstaller.nsh"
!endif# one-click installer messages, see assistedMessages.yml for assisted installer messages
# en must be first (https://github.com/electron-userland/electron-builder/issues/2517)
win7Required:
  en: Windows 7 and above is required
  de: Windows 7 oder hÃ¶her wird vorausgesetzt
  it: Ãˆ necessario disporre del sistema operativo Windows 7 e successivi
  fr: Windows 7 (ou une version ultÃ©rieure) est requis
  ja: Windows 7 ä»¥é™�ã�Œå¿…è¦�ã�§ã�™
  ko: Windows 7 ì�´ìƒ�ì�´ í•„ìš”í•©ë‹ˆë‹¤
  ru: Ð¢Ñ€ÐµÐ±ÑƒÐµÑ‚Ñ�Ñ� Windows 7 Ð¸ Ð²Ñ‹ÑˆÐµ
  sk: Iba Windows 7 a vyÅ¡Å¡ie je podporovanÃ½
  hu: Windows 7 vagy Ãºjabb szÃ¼ksÃ©ges
  pl: Windows 7 lub nowszy jest wymagany
  pt_BR: Requer Windows 7 ou superior
  zh_CN: éœ€è¦� Windows 7 æˆ–ä»¥ä¸Šç³»ç»Ÿ
  tr_TR: Windows 7 ve Ã¼stÃ¼ gereklidir
  sv_SE: Windows 7 eller hÃ¶gre krÃ¤vs
  no: Windows 7 og over er nÃ¸dvendig
  nl_NL: Windows 7 en hoger is vereist
  fi: Windows 7 tai uudempi vaaditaan
  es: Se necesita Windows 7 o una versiÃ³n superior.
  da: Windows 7 og hÃ¸jere er nÃ¸dvendig
x64WinRequired:
  en: 64-bit Windows is required
  de: 64-Bit-Windows wird vorausgesetzt
  it: Ãˆ necessario disporre di un sistema operativo Windows a 64 bit
  fr: Windows 64 bits est requis
  ja: 64 ãƒ“ãƒƒãƒˆ ãƒ�ãƒ¼ã‚¸ãƒ§ãƒ³ã�® Windows ã�Œå¿…è¦�ã�§ã�™
  ko: 64 ë¹„íŠ¸ ë²„ì „ì�˜ Windowsê°€ í•„ìš”í•©ë‹ˆë‹¤
  ru: Ð¢Ñ€ÐµÐ±ÑƒÐµÑ‚Ñ�Ñ� Windows 64-bit
  sk: Potrebujete 64-bit Windows
  hu: 64-bit Windows szÃ¼ksÃ©ges
  pl: Windows 64-bitowy jest wymagany
  pt_BR: Requer Windows 64 bits
  zh_CN: éœ€è¦� 64 ä½� Windows ç³»ç»Ÿ
  tr_TR: 64 bit Windows gerekli
  sv_SE: 64-bitars Windows krÃ¤vs
  no: 64-biters Windows er nÃ¸dvendig
  nl_NL: 64-bit Windows is vereist
  fi: 64-bittinen Windows on pakollinen
  es: Windows de 64 bits es requerido
  da: 64-bit Windows er pÃ¥krÃ¦vet
appRunning:
  en: "${PRODUCT_NAME} is running.\nClick OK to close it."
  de: "${PRODUCT_NAME} ist geÃ¶ffnet. \nKlicken Sie zum Schliessen auf Â«OKÂ»."
  it: "${PRODUCT_NAME} Ã¨ in esecuzione. \nPremi OK per chiudere."
  fr: "${PRODUCT_NAME} est en cours dâ€™utilisation. \nCliquez sur Â«OKÂ» pour fermer ce programme."
  ja: "${PRODUCT_NAME} ã�Œå®Ÿè¡Œä¸­ã�§ã�™ã€‚\nOK ã‚’ã‚¯ãƒªãƒƒã‚¯ã�™ã‚‹ã�¨çµ‚äº†ã�—ã�¾ã�™ã€‚"
  ko: "${PRODUCT_NAME}ì�´(ê°€) ì‹¤í–‰ ì¤‘ìž…ë‹ˆë‹¤. \nOKì�„ í�´ë¦­í•˜ë©´ ì¢…ë£Œë�©ë‹ˆë‹¤."
  ru: "ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ ${PRODUCT_NAME} ÑƒÐ¶Ðµ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð¾.\nÐ�Ð°Ð¶Ð¼Ð¸Ñ‚Ðµ OK Ð´Ð»Ñ� Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ�."
  sk: "${PRODUCT_NAME} prÃ¡ve beÅ¾Ã­.\nUkonÄ�ite ho kliknutÃ­m na OK."
  hu: "${PRODUCT_NAME} Ã©ppen fut. \nKattiontson az Â«OKÂ»-ra a bezÃ¡rÃ¡sÃ¡hoz."
  pl: "${PRODUCT_NAME} jest otwarty. Aby zamknÄ…Ä‡ kliknij na OK."
  pt_BR: "${PRODUCT_NAME} estÃ¡ em execuÃ§Ã£o.\nClique em OK para fechar."
  zh_CN: "${PRODUCT_NAME} æ­£åœ¨è¿�è¡Œ.\nç‚¹å‡» OK å…³é—­."
  tr_TR: "${PRODUCT_NAME} Ã§alÄ±ÅŸÄ±yor.\nKapatmak iÃ§in Tamam'Ä± tÄ±klayÄ±n."
  sv_SE: "${PRODUCT_NAME} kÃ¶rs. \nKlicka pÃ¥ OK fÃ¶r att stÃ¤nga det."
  no: "${PRODUCT_NAME} kjÃ¸rer. \nKlikk OK for Ã¥ lukke det."
  nl_NL: "${PRODUCT_NAME} draait. \nKlik op 'OK' om het te sluiten."
  fi: "${PRODUCT_NAME} on kÃ¤ynnissÃ¤. Napsauta OK sulkeaksesi sen."
  es: "${PRODUCT_NAME} se estÃ¡ ejecutando. Haz clic en Aceptar para cerrarlo."
  da: "${PRODUCT_NAME} er i gang. Klik OK for at lukke."
installing:
  en: Installing, please wait...
  de: Installation lÃ¤uft, bitte warten...
  it: Attendere prego. Installazione in corso...
  fr: En cours dâ€™installation... Veuillez patienter s'il vous plaÃ®t.
  ja: ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�—ã�¦ã�„ã�¾ã�™ã€‚ã�—ã�°ã‚‰ã��ã�Šå¾…ã�¡ã��ã� ã�•ã�„...
  ko: ì„¤ì¹˜í•˜ê³  ìžˆìŠµë‹ˆë‹¤. ìž ì‹œ ê¸°ë‹¤ë ¤ì£¼ì‹­ì‹œì˜¤...
  ru: Ð£Ñ�Ñ‚Ð°Ð½Ð¾Ð²ÐºÐ°, Ð¿Ð¾Ð¶Ð°Ð»ÑƒÐ¹Ñ�Ñ‚Ð°, Ð¿Ð¾Ð´Ð¾Ð¶Ð´Ð¸Ñ‚Ðµ...
  sk: InÅ¡talujem, prosÃ­m poÄ�kajte...
  hu: TelepÃ­tÃ©s, kÃ©rem vÃ¡rjon...
  pl: Zaczekaj na ukoÅ„czenie instalacji...
  pt_BR: Instalando, por favor aguarde...
  zh_CN: æ­£åœ¨å®‰è£…, è¯·ç¨�å€™...
  tr_TR: YÃ¼kleniyor, lÃ¼tfen bekleyin...
  sv_SE: Installerar, vÃ¤nligen vÃ¤nta...
  no: Installerer, vennligst vent...
  nl_NL: Installeren, even geduld...
  fi: Asennetaan, odota...
  es: Instalando, espera un momento...
  da: Installerer, vent venligst...
areYouSureToUninstall:
  en: Are you sure you want to uninstall ${PRODUCT_NAME}?
  de: Sind Sie sicher, dass Sie ${PRODUCT_NAME} deinstallieren mÃ¶chten?
  it: Sicuro di voler procedere alla disinstallazione di ${PRODUCT_NAME}?
  fr: Etes-vous sÃ»r(e) de vouloir dÃ©sinstaller ${PRODUCT_NAME}?
  ja: ${PRODUCT_NAME} ã‚’ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã�—ã�¦ã‚‚ã‚ˆã‚�ã�—ã�„ã�§ã�™ã�‹ï¼Ÿ
  ko: ${PRODUCT_NAME}ì�„(ë¥¼) ì œê±° í•˜ì‹œê² ìŠµë‹ˆê¹Œ?
  ru: Ð’Ñ‹ ÑƒÐ²ÐµÑ€ÐµÐ½Ñ‹, Ñ‡Ñ‚Ð¾ Ñ…Ð¾Ñ‚Ð¸Ñ‚Ðµ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ ${PRODUCT_NAME}?
  sk: Ste si istÃ½ Å¾e chcete odinÅ¡talovaÅ¥ ${PRODUCT_NAME}?
  hu: Biztos benne, hogy szeretnÃ© eltÃ¡volÃ­tani a ${PRODUCT_NAME} alkalmazÃ¡st?
  pl: Czy na pewno chcesz odinstalowaÄ‡ ${PRODUCT_NAME}?
  pt_BR: Tem certeza que deseja desinstalar ${PRODUCT_NAME}?
  zh_CN: ç¡®å®šå�¸è½½ ${PRODUCT_NAME} å�—ï¼Ÿ
  tr_TR: ${PRODUCT_NAME} kaldÄ±rmak istediÄŸinize Eminmisiniz?
  sv_SE: Ã„r du sÃ¤ker pÃ¥ att du vill avinstallera ${PRODUCT_NAME}?
  no: Er du sikker pÃ¥ at du vil avinstallere ${PRODUCT_NAME}?
  nl_NL: Weet je zeker dat je ${PRODUCT_NAME} wilt verwijderen?
  fi: Oletko varma, ettÃ¤ haluat poistaa ${PRODUCT_NAME} asennuksen?
  es: Â¿Seguro que quieres desinstalar ${PRODUCT_NAME}?
  da: Er du sikker pÃ¥, at du vil afinstallere ${PRODUCT_NAME}?
!include FileFunc.nsh
!include UAC.nsh

!define FOLDERID_UserProgramFiles {5CD7AEE2-2219-4A67-B85D-6C9CE15660CB}
!define KF_FLAG_CREATE 0x00008000

# allow user to define own custom
!define /ifndef INSTALL_REGISTRY_KEY "Software\${APP_GUID}"
!define /ifndef UNINSTALL_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_APP_KEY}"

# current Install Mode ("all" or "CurrentUser")
Var installMode

!ifndef INSTALL_MODE_PER_ALL_USERS
  !ifndef ONE_CLICK
    Var hasPerUserInstallation
    Var hasPerMachineInstallation
  !endif
  Var PerUserInstallationFolder

  !macro setInstallModePerUser
    StrCpy $installMode CurrentUser
    SetShellVarContext current

    # Ñ�hecks registry for previous installation path
    ReadRegStr $perUserInstallationFolder HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation
    ${if} $perUserInstallationFolder != ""
      StrCpy $INSTDIR $perUserInstallationFolder
    ${else}
      StrCpy $0 "$LocalAppData\Programs"
      System::Store S
      # Win7 has a per-user programfiles known folder and this can be a non-default location
      System::Call 'SHELL32::SHGetKnownFolderPath(g "${FOLDERID_UserProgramFiles}", i ${KF_FLAG_CREATE}, p 0, *p .r2)i.r1'
      ${If} $1 == 0
        System::Call '*$2(&w${NSIS_MAX_STRLEN} .s)'
        StrCpy $0 $1
        System::Call 'OLE32::CoTaskMemFree(p r2)'
      ${endif}
      System::Store L
      StrCpy $INSTDIR "$0\${APP_FILENAME}"
    ${endif}

    # allow /D switch to override installation path https://github.com/electron-userland/electron-builder/issues/1551
    ${StdUtils.GetParameter} $R0 "D" ""
    ${If} $R0 != ""
      StrCpy $INSTDIR $R0
    ${endif}

  !macroend
!endif

!ifdef INSTALL_MODE_PER_ALL_USERS_REQUIRED
  Var perMachineInstallationFolder

  !macro setInstallModePerAllUsers
    StrCpy $installMode all
    SetShellVarContext all

    !ifdef BUILD_UNINSTALLER
      ${IfNot} ${UAC_IsAdmin}
        ShowWindow $HWNDPARENT ${SW_HIDE}
        !insertmacro UAC_RunElevated
        Quit
      ${endif}
    !endif

    # Ñ�heck registry for previous installation path
    ReadRegStr $perMachineInstallationFolder HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation
    ${if} $perMachineInstallationFolder != ""
      StrCpy $INSTDIR $perMachineInstallationFolder
    ${else}
      StrCpy $0 "$PROGRAMFILES"
      !ifdef APP_64
        ${if} ${RunningX64}
          StrCpy $0 "$PROGRAMFILES64"
        ${endif}
      !endif

      !ifdef MENU_FILENAME
        StrCpy $0 "$0\${MENU_FILENAME}"
      !endif

      StrCpy $INSTDIR "$0\${APP_FILENAME}"
    ${endif}

    # allow /D switch to override installation path https://github.com/electron-userland/electron-builder/issues/1551
    ${StdUtils.GetParameter} $R0 "D" ""
    ${If} $R0 != ""
      StrCpy $INSTDIR $R0
    ${endif}

  !macroend
!endif
!include nsDialogs.nsh

Var HasTwoAvailableOptions
Var RadioButtonLabel1
Var isForceMachineInstall
Var isForceCurrentInstall

!macro PAGE_INSTALL_MODE
  !insertmacro MUI_PAGE_INIT

  !insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE ""
  Var MultiUser.InstallModePage
  Var MultiUser.InstallModePage.Text
  Var MultiUser.InstallModePage.AllUsers
  Var MultiUser.InstallModePage.CurrentUser
  Var MultiUser.InstallModePage.ReturnValue

  !ifndef BUILD_UNINSTALLER
    !insertmacro FUNCTION_INSTALL_MODE_PAGE_FUNCTION MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID} ""
    PageEx custom
      PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
      Caption " "
    PageExEnd
  !else
    !insertmacro FUNCTION_INSTALL_MODE_PAGE_FUNCTION MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID} un.
    UninstPage custom un.multiUser.InstallModePre_${MUI_UNIQUEID} un.MultiUser.InstallModeLeave_${MUI_UNIQUEID}
  !endif
!macroend

!macro FUNCTION_INSTALL_MODE_PAGE_FUNCTION PRE LEAVE UNINSTALLER_FUNCPREFIX
	Function "${UNINSTALLER_FUNCPREFIX}${PRE}"
		${if} ${UAC_IsInnerInstance}
		${andIf} ${UAC_IsAdmin}
		  # inner Process (and Admin) - skip selection, inner process is always used for elevation (machine-wide)
			!insertmacro setInstallModePerAllUsers
			Abort
		${endIf}

		StrCpy $isForceMachineInstall "0"
		StrCpy $isForceCurrentInstall "0"
		!ifmacrodef customInstallmode
		  !insertmacro customInstallMode
		!endif

    ${if} $isForceMachineInstall == "1"
    ${OrIf} ${isForAllUsers}
      StrCpy $hasPerMachineInstallation "1"
      StrCpy $hasPerUserInstallation "0"
      ${ifNot} ${UAC_IsAdmin}
        ShowWindow $HWNDPARENT ${SW_HIDE}
        !insertmacro UAC_RunElevated
        Quit
      ${endIf}

      !insertmacro setInstallModePerAllUsers
      Abort
    ${endIf}

    ${if} $isForceCurrentInstall == "1"
    ${OrIf} ${isForCurrentUser}
      StrCpy $hasPerMachineInstallation "0"
      StrCpy $hasPerUserInstallation "1"
      !insertmacro setInstallModePerUser
      Abort
    ${endIf}

		# If uninstalling, will check if there is both a per-user and per-machine installation. If there is only one, will skip the form.
	  # If uninstallation was invoked from the "add/remove programs" Windows will automatically requests elevation (depending if uninstall keys are in HKLM or HKCU)
		# so (for uninstallation) just checking UAC_IsAdmin would probably be enought to determine if it's a per-user or per-machine. However, user can run the uninstall.exe from the folder itself
		!ifdef BUILD_UNINSTALLER
			${if} $hasPerUserInstallation == "1"
      ${andif} $hasPerMachineInstallation == "0"
				!insertmacro setInstallModePerUser
				Abort
			${elseIf} $hasPerUserInstallation == "0"
      ${andIf} $hasPerMachineInstallation == "1"
				${IfNot} ${UAC_IsAdmin}
          ShowWindow $HWNDPARENT ${SW_HIDE}
          !insertmacro UAC_RunElevated
          Quit
        ${endIf}

				!insertmacro setInstallModePerAllUsers
				Abort
			${endIf}

      !insertmacro MUI_HEADER_TEXT "$(chooseUninstallationOptions)" "$(whichInstallationShouldBeRemoved)"
		!else
      !insertmacro MUI_HEADER_TEXT "$(chooseInstallationOptions)" "$(whoShouldThisApplicationBeInstalledFor)"
		!endif

    !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
		nsDialogs::Create 1018
		Pop $MultiUser.InstallModePage

		!ifndef BUILD_UNINSTALLER
			${NSD_CreateLabel} 0u 0u 300u 20u "$(selectUserMode)"
			StrCpy $8 "$(forAll)"
			StrCpy $9 "$(onlyForMe)"
		!else
			${NSD_CreateLabel} 0u 0u 300u 20u "$(whichInstallationRemove)"
			StrCpy $8 "$(forAll)"
			StrCpy $9 "$(onlyForMe)"
		!endif
		Pop $MultiUser.InstallModePage.Text

		${NSD_CreateRadioButton} 10u 30u 280u 20u "$8"
		Pop $MultiUser.InstallModePage.AllUsers
		${IfNot} ${UAC_IsAdmin}
			!ifdef MULTIUSER_INSTALLMODE_ALLOW_ELEVATION
				StrCpy $HasTwoAvailableOptions 1
			!else
			  # since radio button is disabled, we add that comment to the disabled control itself
				SendMessage $MultiUser.InstallModePage.AllUsers ${WM_SETTEXT} 0 "STR:$8 (must run as admin)"
				EnableWindow $MultiUser.InstallModePage.AllUsers 0 # start out disabled
				StrCpy $HasTwoAvailableOptions 0
			!endif
		${else}
			StrCpy $HasTwoAvailableOptions 1
		${endif}

		System::Call "advapi32::GetUserName(t.r0,*i${NSIS_MAX_STRLEN})i"
		${NSD_CreateRadioButton} 10u 50u 280u 20u "$9 ($0)"
		Pop $MultiUser.InstallModePage.CurrentUser

		nsDialogs::SetUserData $MultiUser.InstallModePage.AllUsers 1 ; Install for All Users (1, pra exibir o icone SHIELD de elevation)
		nsDialogs::SetUserData $MultiUser.InstallModePage.CurrentUser 0	; Install for Single User (0 pra nÃ£o exibir)

		${if} $HasTwoAvailableOptions == "1" ; if there are 2 available options, bind to radiobutton change
			${NSD_OnClick} $MultiUser.InstallModePage.CurrentUser ${UNINSTALLER_FUNCPREFIX}InstModeChange
			${NSD_OnClick} $MultiUser.InstallModePage.AllUsers ${UNINSTALLER_FUNCPREFIX}InstModeChange
		${endif}

		${NSD_CreateLabel} 0u 110u 280u 50u ""
		Pop $RadioButtonLabel1

		${if} $installMode == "all"
			SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0 ; set as default
			SendMessage $MultiUser.InstallModePage.AllUsers ${BM_CLICK} 0 0 ; trigger click event
		${else}
			SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0 ; set as default
			SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_CLICK} 0 0 ; trigger click event
		${endif}

		!insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
		nsDialogs::Show
	FunctionEnd

	Function "${UNINSTALLER_FUNCPREFIX}${LEAVE}"
		SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue

		${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED}
			${IfNot} ${UAC_IsAdmin}
        ShowWindow $HWNDPARENT ${SW_HIDE}
        !insertmacro UAC_RunElevated
        ${Switch} $0
          ${Case} 0
            ${If} $1 = 1
              Quit ;we are the outer process, the inner process has done its work (ExitCode is $2), we are done
            ${EndIf}
            ${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user
            ${OrIf} $2 = 0x666666 ;our special return, the new process was not admin after all
              MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "$(loginWithAdminAccount)"
            ${EndIf}
            ${Break}
          ${Case} 1223 ;user aborted
            ;MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "This option requires admin privileges, aborting!"
            ;Quit ; instead of quit just abort going to the next page, and stay in the radiobuttons
            ${Break}
          ${Case} 1062
            MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Logon service not running, aborting!" ; "Unable to elevate, Secondary Logon service not running!"
            ;Quit ; instead of quit just abort going to the next page, and stay in the radiobuttons
            ${Break}
          ${Default}
            MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Unable to elevate, error $0"
            ;Quit ; instead of quit just abort going to the next page, and stay in the radiobuttons
            ${Break}
        ${EndSwitch}

        ShowWindow $HWNDPARENT ${SW_SHOW}
        BringToFront
        Abort
      ${else}
        !insertmacro setInstallModePerAllUsers
			${endif}
		${else}
			!insertmacro setInstallModePerUser
		${endif}

		!insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
	FunctionEnd

	Function "${UNINSTALLER_FUNCPREFIX}InstModeChange"
		pop $1
		nsDialogs::GetUserData $1
		pop $1
		GetDlgItem $0 $hwndParent 1 ; get item 1 (next button) at parent window, store in $0 - (0 is back, 1 is next .. what about CANCEL? http://nsis.sourceforge.net/Buttons_Header )

		StrCpy $7 ""
		${if} "$1" == "0" ; current user
			${if} $hasPerUserInstallation == "1"
				!ifndef BUILD_UNINSTALLER
					StrCpy $7 "$(perUserInstallExists)($perUserInstallationFolder)$\r$\n$(reinstallUpgrade)"
				!else
					StrCpy $7 "$(perUserInstall)($perUserInstallationFolder)$\r$\n$(uninstall)"
				!endif
			${else}
				StrCpy $7 "$(freshInstallForCurrent)"
			${endif}
			SendMessage $0 ${BCM_SETSHIELD} 0 0 ; hide SHIELD
		${else} ; all users
			${if} $hasPerMachineInstallation == "1"
				!ifndef BUILD_UNINSTALLER
					StrCpy $7 "$(perMachineInstallExists)($perMachineInstallationFolder)$\r$\n$(reinstallUpgrade)"
				!else
					StrCpy $7 "$(perMachineInstall)($perMachineInstallationFolder)$\r$\n$(uninstall)"
				!endif
			${else}
				StrCpy $7 "$(freshInstallForAll)"
			${endif}
			${ifNot} ${UAC_IsAdmin}
				StrCpy $7 "$7"
				SendMessage $0 ${BCM_SETSHIELD} 0 1 ; display SHIELD
			${else}
				SendMessage $0 ${BCM_SETSHIELD} 0 0 ; hide SHIELD
			${endif}
		${endif}
		SendMessage $RadioButtonLabel1 ${WM_SETTEXT} 0 "STR:$7"
	FunctionEnd
!macroend
!ifndef BUILD_UNINSTALLER
  !ifmacrodef licensePage
    !insertmacro skipPageIfUpdated
    !insertmacro licensePage
  !endif
!endif

!insertmacro MUI_PAGE_INSTFILES
!ifdef BUILD_UNINSTALLER
  !insertmacro MUI_UNPAGE_INSTFILES
!endif

!macro initMultiUser
  !ifdef INSTALL_MODE_PER_ALL_USERS
    !insertmacro setInstallModePerAllUsers
  !else
    !insertmacro setInstallModePerUser
  !endif
!macroend!include "common.nsh"
!include "extractAppPackage.nsh"

WindowIcon Off
AutoCloseWindow True
RequestExecutionLevel ${REQUEST_EXECUTION_LEVEL}

SilentInstall silent

Function .onInit
  !insertmacro check64BitAndSetRegView
FunctionEnd

Section
  StrCpy $INSTDIR "$TEMP\${UNPACK_DIR_NAME}"
  RMDir /r $INSTDIR
	SetOutPath $INSTDIR

	!ifdef APP_DIR_64
    !ifdef APP_DIR_32
      ${if} ${RunningX64}
        File /r "${APP_DIR_64}\*.*"
      ${else}
        File /r "${APP_DIR_32}\*.*"
      ${endIf}
    !else
      File /r "${APP_DIR_64}\*.*"
    !endif
  !else
    !ifdef APP_DIR_32
      File /r "${APP_DIR_32}\*.*"
    !else
      !insertmacro extractEmbeddedAppPackage
    !endif
  !endif

  System::Call 'Kernel32::SetEnvironmentVariable(t, t)i ("PORTABLE_EXECUTABLE_DIR", "$EXEDIR").r0'
  System::Call 'Kernel32::SetEnvironmentVariable(t, t)i ("PORTABLE_EXECUTABLE_FILE", "$EXEPATH").r0'
  System::Call 'Kernel32::SetEnvironmentVariable(t, t)i ("PORTABLE_EXECUTABLE_APP_FILENAME", "${APP_FILENAME}").r0'
  ${StdUtils.GetAllParameters} $R0 0
	ExecWait "$INSTDIR\${APP_EXECUTABLE_FILENAME} $R0" $0
  SetErrorLevel $0

  SetOutPath $PLUGINSDIR
	RMDir /r $INSTDIR
SectionEnd
It is developer documentation. See [user documentation](https://electron.build/configuration/nsis).

http://www.mathiaswestin.net/2012/09/how-to-make-per-user-installation-with.html

https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx#FOLDERID_UserProgramFiles

https://github.com/Drizin/NsisMultiUser

NSIS vs Inno Setup â€” it is not easy to choose because both are far from ideal, e.g. inno also doesn't have built-in per-user installation implementation â€” http://stackoverflow.com/questions/34330668/inno-setup-custom-dialog-with-per-user-or-per-machine-installation.

http://stackoverflow.com/questions/2565215/checking-if-the-application-is-running-in-nsis-before-uninstalling

One-click installer: http://forums.winamp.com/showthread.php?t=300479

# GUID
See [docs](https://electron.build/configuration/nsis).

We use UUID v5 to generate sha-1 name-based UUID.

http://stackoverflow.com/questions/3029994/convert-uri-to-guid
https://alexandrebrisebois.wordpress.com/2013/11/14/create-predictable-guids-for-your-windows-azure-table-storage-entities/
https://github.com/Squirrel/Squirrel.Windows/pull/658

# Compression

NSIS LZMA compression is slower and worse compared to external `7za` compression. Slower because `7za` is multi-threaded, worse because LZMA codec implementation is outdated and BCJ2 filter is not enabled.
Difference for test app â€” 4 MB (before: 36.3 after: 32.8).

And compression time is also greatly reduced.

Since NSIS is awesome, no disadvantages in our approach â€” [compression is disabled](http://nsis.sourceforge.net/Reference/SetCompress) before `File /oname=app.7z "${APP_ARCHIVE}"` and enabled after (it is the reasons why `SOLID` compression is not used).
So, opposite to Squirrel.Windows, archive is not twice compressed.

So, in your custom NSIS scripts you should not use any compression instructions. Only `SetCompress` if you need to disable compression for already archived file.


Function un.onInit
  !insertmacro check64BitAndSetRegView

  ${IfNot} ${Silent}
    !ifdef ONE_CLICK
      MessageBox MB_OKCANCEL "$(areYouSureToUninstall)" IDOK +2
      Quit

      # one-click installer executes uninstall section in the silent mode, but we must show message dialog if silent mode was not explicitly set by user (using /S flag)
      !insertmacro CHECK_APP_RUNNING
      SetSilent silent
    !endif
  ${endIf}

  !insertmacro initMultiUser

  !ifmacrodef customUnInit
    !insertmacro customUnInit
  !endif
FunctionEnd

Section "un.install"
  !ifndef ONE_CLICK
    # for assisted installer we check it here to show progress
    !insertmacro CHECK_APP_RUNNING
  !endif

  !insertmacro setLinkVars

  ${ifNot} ${isKeepShortcuts}
    WinShell::UninstAppUserModelId "${APP_ID}"

    !ifndef DO_NOT_CREATE_DESKTOP_SHORTCUT
      WinShell::UninstShortcut "$oldDesktopLink"
      Delete "$oldDesktopLink"
    !endif

    !ifndef DO_NOT_CREATE_START_MENU_SHORTCUT
      WinShell::UninstShortcut "$oldStartMenuLink"

      Delete "$oldStartMenuLink"
      ReadRegStr $R1 SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" MenuDirectory
      ${ifNot} $R1 == ""
        RMDir "$SMPROGRAMS\$R1"
      ${endIf}
    !endif
  ${endIf}

  # refresh the desktop
  System::Call 'shell32::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'

  !ifmacrodef unregisterFileAssociations
    !insertmacro unregisterFileAssociations
  !endif

  # delete the installed files
  !ifmacrodef customRemoveFiles
    !insertmacro customRemoveFiles
  !else
    RMDir /r $INSTDIR
  !endif

  Var /GLOBAL isDeleteAppData
  StrCpy $isDeleteAppData "0"

  ClearErrors
  ${GetParameters} $R0
  ${GetOptions} $R0 "--delete-app-data" $R1
  ${if} ${Errors}
    !ifdef DELETE_APP_DATA_ON_UNINSTALL
      ${ifNot} ${isUpdated}
        StrCpy $isDeleteAppData "1"
      ${endif}
    !endif
  ${else}
    StrCpy $isDeleteAppData "1"
  ${endIf}

  ${if} $isDeleteAppData == "1"
    # electron always uses per user app data
    ${if} $installMode == "all"
      SetShellVarContext current
    ${endif}
    RMDir /r "$APPDATA\${APP_FILENAME}"
    !ifdef APP_PRODUCT_FILENAME
      RMDir /r "$APPDATA\${APP_PRODUCT_FILENAME}"
    !endif
    # electron use package.json name for cache,indexdb etc.
    !ifdef APP_PACKAGE_NAME
      RMDir /r "$APPDATA\${APP_PACKAGE_NAME}"
    !endif
    ${if} $installMode == "all"
      SetShellVarContext all
    ${endif}
  ${endif}

  DeleteRegKey SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}"
  !ifdef UNINSTALL_REGISTRY_KEY_2
    DeleteRegKey SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY_2}"
  !endif
  DeleteRegKey SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}"

  !ifmacrodef customUnInstall
    !insertmacro customUnInstall
  !endif

  !ifdef ONE_CLICK
    !insertmacro quitSuccess
  !endif
SectionEnd
; fileassoc.nsh
; File association helper macros
; Written by Saivert
;
; Features automatic backup system and UPDATEFILEASSOC macro for
; shell change notification.
;
; |> How to use <|
; To associate a file with an application so you can double-click it in explorer, use
; the APP_ASSOCIATE macro like this:
;
;   Example:
;   !insertmacro APP_ASSOCIATE "txt" "myapp.textfile" "Description of txt files" \
;     "$INSTDIR\myapp.exe,0" "Open with myapp" "$INSTDIR\myapp.exe $\"%1$\""
;
; Never insert the APP_ASSOCIATE macro multiple times, it is only ment
; to associate an application with a single file and using the
; the "open" verb as default. To add more verbs (actions) to a file
; use the APP_ASSOCIATE_ADDVERB macro.
;
;   Example:
;   !insertmacro APP_ASSOCIATE_ADDVERB "myapp.textfile" "edit" "Edit with myapp" \
;     "$INSTDIR\myapp.exe /edit $\"%1$\""
;
; To have access to more options when registering the file association use the
; APP_ASSOCIATE_EX macro. Here you can specify the verb and what verb is to be the
; standard action (default verb).
;
; Note, that this script takes into account user versus global installs.
; To properly work you must initialize the SHELL_CONTEXT variable via SetShellVarContext.
;
; And finally: To remove the association from the registry use the APP_UNASSOCIATE
; macro. Here is another example just to wrap it up:
;   !insertmacro APP_UNASSOCIATE "txt" "myapp.textfile"
;
; |> Note <|
; When defining your file class string always use the short form of your application title
; then a period (dot) and the type of file. This keeps the file class sort of unique.
;   Examples:
;   Winamp.Playlist
;   NSIS.Script
;   Photoshop.JPEGFile
;
; |> Tech info <|
; The registry key layout for a global file association is:
;
; HKEY_LOCAL_MACHINE\Software\Classes
;     <".ext"> = <applicationID>
;     <applicationID> = <"description">
;         shell
;             <verb> = <"menu-item text">
;                 command = <"command string">
;
;
; The registry key layout for a per-user file association is:
;
; HKEY_CURRENT_USER\Software\Classes
;     <".ext"> = <applicationID>
;     <applicationID> = <"description">
;         shell
;             <verb> = <"menu-item text">
;                 command = <"command string">
;

!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
  ; Backup the previously associated file class
  ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" ""
  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"

  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}"

  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" "open"
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}`
!macroend

!macro APP_ASSOCIATE_EX EXT FILECLASS DESCRIPTION ICON VERB DEFAULTVERB SHELLNEW COMMANDTEXT COMMAND
  ; Backup the previously associated file class
  ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" ""
  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"

  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}"
  StrCmp "${SHELLNEW}" "0" +2
  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}\ShellNew" "NullFile" ""

  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" `${DEFAULTVERB}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}`
!macroend

!macro APP_ASSOCIATE_ADDVERB FILECLASS VERB COMMANDTEXT COMMAND
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}`
!macroend

!macro APP_ASSOCIATE_REMOVEVERB FILECLASS VERB
  DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}\shell\${VERB}`
!macroend


!macro APP_UNASSOCIATE EXT FILECLASS
  ; Backup the previously associated file class
  ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" `${FILECLASS}_backup`
  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "$R0"

  DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}`
!macroend

!macro APP_ASSOCIATE_GETFILECLASS OUTPUT EXT
  ReadRegStr ${OUTPUT} SHELL_CONTEXT "Software\Classes\.${EXT}" ""
!macroend


; !defines for use with SHChangeNotify
!ifdef SHCNE_ASSOCCHANGED
!undef SHCNE_ASSOCCHANGED
!endif
!define SHCNE_ASSOCCHANGED 0x08000000
!ifdef SHCNF_FLUSH
!undef SHCNF_FLUSH
!endif
!define SHCNF_FLUSH        0x1000

!macro UPDATEFILEASSOC
; Using the system.dll plugin to call the SHChangeNotify Win32 API function so we
; can update the shell.
  System::Call "shell32::SHChangeNotify(i,i,i,i) (${SHCNE_ASSOCCHANGED}, ${SHCNF_FLUSH}, 0, 0)"
!macroend#################################################################################
# StdUtils plug-in for NSIS
# Copyright (C) 2004-2018 LoRd_MuldeR <MuldeR2@GMX.de>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
#
# http://www.gnu.org/licenses/lgpl-2.1.txt
#################################################################################

# DEVELOPER NOTES:
# - Please see "https://github.com/lordmulder/stdutils/" for news and updates!
# - Please see "Docs\StdUtils\StdUtils.html" for detailed function descriptions!
# - Please see "Examples\StdUtils\StdUtilsTest.nsi" for usage examples!

#################################################################################
# FUNCTION DECLARTIONS
#################################################################################

!ifndef ___STDUTILS__NSH___
!define ___STDUTILS__NSH___

!define StdUtils.Time             '!insertmacro _StdU_Time'          #time(), as in C standard library
!define StdUtils.GetMinutes       '!insertmacro _StdU_GetMinutes'    #GetSystemTimeAsFileTime(), returns the number of minutes
!define StdUtils.GetHours         '!insertmacro _StdU_GetHours'      #GetSystemTimeAsFileTime(), returns the number of hours
!define StdUtils.GetDays          '!insertmacro _StdU_GetDays'       #GetSystemTimeAsFileTime(), returns the number of days
!define StdUtils.Rand             '!insertmacro _StdU_Rand'          #rand(), as in C standard library
!define StdUtils.RandMax          '!insertmacro _StdU_RandMax'       #rand(), as in C standard library, with maximum value
!define StdUtils.RandMinMax       '!insertmacro _StdU_RandMinMax'    #rand(), as in C standard library, with minimum/maximum value
!define StdUtils.RandList         '!insertmacro _StdU_RandList'      #rand(), as in C standard library, with list support
!define StdUtils.RandBytes        '!insertmacro _StdU_RandBytes'     #Generates random bytes, returned as Base64-encoded string
!define StdUtils.FormatStr        '!insertmacro _StdU_FormatStr'     #sprintf(), as in C standard library, one '%d' placeholder
!define StdUtils.FormatStr2       '!insertmacro _StdU_FormatStr2'    #sprintf(), as in C standard library, two '%d' placeholders
!define StdUtils.FormatStr3       '!insertmacro _StdU_FormatStr3'    #sprintf(), as in C standard library, three '%d' placeholders
!define StdUtils.ScanStr          '!insertmacro _StdU_ScanStr'       #sscanf(), as in C standard library, one '%d' placeholder
!define StdUtils.ScanStr2         '!insertmacro _StdU_ScanStr2'      #sscanf(), as in C standard library, two '%d' placeholders
!define StdUtils.ScanStr3         '!insertmacro _StdU_ScanStr3'      #sscanf(), as in C standard library, three '%d' placeholders
!define StdUtils.TrimStr          '!insertmacro _StdU_TrimStr'       #Remove whitspaces from string, left and right
!define StdUtils.TrimStrLeft      '!insertmacro _StdU_TrimStrLeft'   #Remove whitspaces from string, left side only
!define StdUtils.TrimStrRight     '!insertmacro _StdU_TrimStrRight'  #Remove whitspaces from string, right side only
!define StdUtils.RevStr           '!insertmacro _StdU_RevStr'        #Reverse a string, e.g. "reverse me" <-> "em esrever"
!define StdUtils.ValidFileName    '!insertmacro _StdU_ValidFileName' #Test whether string is a valid file name - no paths allowed
!define StdUtils.ValidPathSpec    '!insertmacro _StdU_ValidPathSpec' #Test whether string is a valid full(!) path specification
!define StdUtils.ValidDomainName  '!insertmacro _StdU_ValidDomain'   #Test whether string is a valid host name or domain name
!define StdUtils.StrToUtf8        '!insertmacro _StdU_StrToUtf8'     #Convert string from Unicode (UTF-16) or ANSI to UTF-8 bytes
!define StdUtils.StrFromUtf8      '!insertmacro _StdU_StrFromUtf8'   #Convert string from UTF-8 bytes to Unicode (UTF-16) or ANSI
!define StdUtils.SHFileMove       '!insertmacro _StdU_SHFileMove'    #SHFileOperation(), using the FO_MOVE operation
!define StdUtils.SHFileCopy       '!insertmacro _StdU_SHFileCopy'    #SHFileOperation(), using the FO_COPY operation
!define StdUtils.AppendToFile     '!insertmacro _StdU_AppendToFile'  #Append contents of an existing file to another file
!define StdUtils.ExecShellAsUser  '!insertmacro _StdU_ExecShlUser'   #ShellExecute() as NON-elevated user from elevated installer
!define StdUtils.InvokeShellVerb  '!insertmacro _StdU_InvkeShlVrb'   #Invokes a "shell verb", e.g. for pinning items to the taskbar
!define StdUtils.ExecShellWaitEx  '!insertmacro _StdU_ExecShlWaitEx' #ShellExecuteEx(), returns the handle of the new process
!define StdUtils.WaitForProcEx    '!insertmacro _StdU_WaitForProcEx' #WaitForSingleObject(), e.g. to wait for a running process
!define StdUtils.GetParameter     '!insertmacro _StdU_GetParameter'  #Get the value of a specific command-line option
!define StdUtils.TestParameter    '!insertmacro _StdU_TestParameter' #Test whether a specific command-line option has been set
!define StdUtils.ParameterCnt     '!insertmacro _StdU_ParameterCnt'  #Get number of command-line tokens, similar to argc in main()
!define StdUtils.ParameterStr     '!insertmacro _StdU_ParameterStr'  #Get the n-th command-line token, similar to argv[i] in main()
!define StdUtils.GetAllParameters '!insertmacro _StdU_GetAllParams'  #Get complete command-line, but without executable name
!define StdUtils.GetRealOSVersion '!insertmacro _StdU_GetRealOSVer'  #Get the *real* Windows version number, even on Windows 8.1+
!define StdUtils.GetRealOSBuildNo '!insertmacro _StdU_GetRealOSBld'  #Get the *real* Windows build number, even on Windows 8.1+
!define StdUtils.GetRealOSName    '!insertmacro _StdU_GetRealOSStr'  #Get the *real* Windows version, as a "friendly" name
!define StdUtils.GetOSEdition     '!insertmacro _StdU_GetOSEdition'  #Get the Windows edition, i.e. "workstation" or "server"
!define StdUtils.GetOSReleaseId   '!insertmacro _StdU_GetOSRelIdNo'  #Get the Windows release identifier (on Windows 10)
!define StdUtils.VerifyOSVersion  '!insertmacro _StdU_VrfyRealOSVer' #Compare *real* operating system to an expected version number
!define StdUtils.VerifyOSBuildNo  '!insertmacro _StdU_VrfyRealOSBld' #Compare *real* operating system to an expected build number
!define StdUtils.HashText         '!insertmacro _StdU_HashText'      #Compute hash from text string (CRC32, MD5, SHA1/2/3, BLAKE2)
!define StdUtils.HashFile         '!insertmacro _StdU_HashFile'      #Compute hash from file (CRC32, MD5, SHA1/2/3, BLAKE2)
!define StdUtils.NormalizePath    '!insertmacro _StdU_NormalizePath' #Simplifies the path to produce a direct, well-formed path
!define StdUtils.GetParentPath    '!insertmacro _StdU_GetParentPath' #Get parent path by removing the last component from the path
!define StdUtils.SplitPath        '!insertmacro _StdU_SplitPath'     #Split the components of the given path
!define StdUtils.GetDrivePart     '!insertmacro _StdU_GetDrivePart'  #Get drive component of path
!define StdUtils.GetDirectoryPart '!insertmacro _StdU_GetDirPart'    #Get directory component of path
!define StdUtils.GetFileNamePart  '!insertmacro _StdU_GetFNamePart'  #Get file name component of path
!define StdUtils.GetExtensionPart '!insertmacro _StdU_GetExtnPart'   #Get file extension component of path
!define StdUtils.TimerCreate      '!insertmacro _StdU_TimerCreate'   #Create a new event-timer that will be triggered periodically
!define StdUtils.TimerDestroy     '!insertmacro _StdU_TimerDestroy'  #Destroy a running timer created with TimerCreate()
!define StdUtils.ProtectStr       '!insertmacro _StdU_PrtctStr'      #Protect a given String using Windows' DPAPI
!define StdUtils.UnprotectStr     '!insertmacro _StdU_UnprtctStr'    #Unprotect a string that was protected via ProtectStr()
!define StdUtils.GetLibVersion    '!insertmacro _StdU_GetLibVersion' #Get the current StdUtils library version (for debugging)
!define StdUtils.SetVerbose       '!insertmacro _StdU_SetVerbose'    #Enable or disable "verbose" mode (for debugging)


#################################################################################
# MACRO DEFINITIONS
#################################################################################

!macro _StdU_Time out
	StdUtils::Time /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetMinutes out
	StdUtils::GetMinutes /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetHours out
	StdUtils::GetHours /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetDays out
	StdUtils::GetDays /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_Rand out
	StdUtils::Rand /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_RandMax out max
	push ${max}
	StdUtils::RandMax /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_RandMinMax out min max
	push ${min}
	push ${max}
	StdUtils::RandMinMax /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_RandList count max
	push ${max}
	push ${count}
	StdUtils::RandList /NOUNLOAD
!macroend

!macro _StdU_RandBytes out count
	push ${count}
	StdUtils::RandBytes /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_FormatStr out format val
	push `${format}`
	push ${val}
	StdUtils::FormatStr /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_FormatStr2 out format val1 val2
	push `${format}`
	push ${val1}
	push ${val2}
	StdUtils::FormatStr2 /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_FormatStr3 out format val1 val2 val3
	push `${format}`
	push ${val1}
	push ${val2}
	push ${val3}
	StdUtils::FormatStr3 /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ScanStr out format input default
	push `${format}`
	push `${input}`
	push ${default}
	StdUtils::ScanStr /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ScanStr2 out1 out2 format input default1 default2
	push `${format}`
	push `${input}`
	push ${default1}
	push ${default2}
	StdUtils::ScanStr2 /NOUNLOAD
	pop ${out1}
	pop ${out2}
!macroend

!macro _StdU_ScanStr3 out1 out2 out3 format input default1 default2 default3
	push `${format}`
	push `${input}`
	push ${default1}
	push ${default2}
	push ${default3}
	StdUtils::ScanStr3 /NOUNLOAD
	pop ${out1}
	pop ${out2}
	pop ${out3}
!macroend

!macro _StdU_TrimStr var
	push ${var}
	StdUtils::TrimStr /NOUNLOAD
	pop ${var}
!macroend

!macro _StdU_TrimStrLeft var
	push ${var}
	StdUtils::TrimStrLeft /NOUNLOAD
	pop ${var}
!macroend

!macro _StdU_TrimStrRight var
	push ${var}
	StdUtils::TrimStrRight /NOUNLOAD
	pop ${var}
!macroend

!macro _StdU_RevStr var
	push ${var}
	StdUtils::RevStr /NOUNLOAD
	pop ${var}
!macroend

!macro _StdU_ValidFileName out test
	push `${test}`
	StdUtils::ValidFileName /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ValidPathSpec out test
	push `${test}`
	StdUtils::ValidPathSpec /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ValidDomain out test
	push `${test}`
	StdUtils::ValidDomainName /NOUNLOAD
	pop ${out}
!macroend


!macro _StdU_StrToUtf8 out str
	push `${str}`
	StdUtils::StrToUtf8 /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_StrFromUtf8 out trnc str
	push ${trnc}
	push `${str}`
	StdUtils::StrFromUtf8 /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_SHFileMove out from to hwnd
	push `${from}`
	push `${to}`
	push ${hwnd}
	StdUtils::SHFileMove /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_SHFileCopy out from to hwnd
	push `${from}`
	push `${to}`
	push ${hwnd}
	StdUtils::SHFileCopy /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_AppendToFile out from dest offset maxlen
	push `${from}`
	push `${dest}`
	push ${offset}
	push ${maxlen}
	StdUtils::AppendToFile /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ExecShlUser out file verb args
	push `${file}`
	push `${verb}`
	push `${args}`
	StdUtils::ExecShellAsUser /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_InvkeShlVrb out path file verb_id
	push "${path}"
	push "${file}"
	push ${verb_id}
	StdUtils::InvokeShellVerb /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ExecShlWaitEx out_res out_val file verb args
	push `${file}`
	push `${verb}`
	push `${args}`
	StdUtils::ExecShellWaitEx /NOUNLOAD
	pop ${out_res}
	pop ${out_val}
!macroend

!macro _StdU_WaitForProcEx out handle
	push `${handle}`
	StdUtils::WaitForProcEx /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetParameter out name default
	push `${name}`
	push `${default}`
	StdUtils::GetParameter /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_TestParameter out name
	push `${name}`
	StdUtils::TestParameter /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ParameterCnt out
	StdUtils::ParameterCnt /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_ParameterStr out index
	push ${index}
	StdUtils::ParameterStr /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetAllParams out truncate
	push `${truncate}`
	StdUtils::GetAllParameters /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetRealOSVer out_major out_minor out_spack
	StdUtils::GetRealOsVersion /NOUNLOAD
	pop ${out_major}
	pop ${out_minor}
	pop ${out_spack}
!macroend

!macro _StdU_GetRealOSBld out
	StdUtils::GetRealOsBuildNo /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetRealOSStr out
	StdUtils::GetRealOsName /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_VrfyRealOSVer out major minor spack
	push `${major}`
	push `${minor}`
	push `${spack}`
	StdUtils::VerifyRealOsVersion /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_VrfyRealOSBld out build
	push `${build}`
	StdUtils::VerifyRealOsBuildNo /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetOSEdition out
	StdUtils::GetOsEdition /NOUNLOAD
	pop ${out}
!macroend


!macro _StdU_GetOSRelIdNo out
	StdUtils::GetOsReleaseId /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_HashText out type text
	push `${type}`
	push `${text}`
	StdUtils::HashText /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_HashFile out type file
	push `${type}`
	push `${file}`
	StdUtils::HashFile /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_NormalizePath out path
	push `${path}`
	StdUtils::NormalizePath /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetParentPath out path
	push `${path}`
	StdUtils::GetParentPath /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_SplitPath out_drive out_dir out_fname out_ext path
	push `${path}`
	StdUtils::SplitPath /NOUNLOAD
	pop ${out_drive}
	pop ${out_dir}
	pop ${out_fname}
	pop ${out_ext}
!macroend

!macro _StdU_GetDrivePart out path
	push `${path}`
	StdUtils::GetDrivePart /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetDirPart out path
	push `${path}`
	StdUtils::GetDirectoryPart /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetFNamePart out path
	push `${path}`
	StdUtils::GetFileNamePart /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetExtnPart out path
	push `${path}`
	StdUtils::GetExtensionPart /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_TimerCreate out callback interval
	GetFunctionAddress ${out} ${callback}
	push ${out}
	push ${interval}
	StdUtils::TimerCreate /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_TimerDestroy out timer_id
	push ${timer_id}
	StdUtils::TimerDestroy /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_PrtctStr out dpsc salt text
	push `${dpsc}`
	push `${salt}`
	push `${text}`
	StdUtils::ProtectStr /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_UnprtctStr out trnc salt data
	push `${trnc}`
	push `${salt}`
	push `${data}`
	StdUtils::UnprotectStr /NOUNLOAD
	pop ${out}
!macroend

!macro _StdU_GetLibVersion out_ver out_tst
	StdUtils::GetLibVersion /NOUNLOAD
	pop ${out_ver}
	pop ${out_tst}
!macroend

!macro _StdU_SetVerbose enable
	Push ${enable}
	StdUtils::SetVerboseMode /NOUNLOAD
!macroend


#################################################################################
# MAGIC NUMBERS
#################################################################################

!define StdUtils.Const.ShellVerb.PinToTaskbar     0
!define StdUtils.Const.ShellVerb.UnpinFromTaskbar 1
!define StdUtils.Const.ShellVerb.PinToStart       2
!define StdUtils.Const.ShellVerb.UnpinFromStart   3

!endif # !___STDUTILS__NSH___
; StrContains
; This function does a case sensitive searches for an occurrence of a substring in a string. 
; It returns the substring if it is found. 
; Otherwise it returns null(""). 
; Written by kenglish_hi
; Adapted from StrReplace written by dandaman32
 
 
Var STR_HAYSTACK
Var STR_NEEDLE
Var STR_CONTAINS_VAR_1
Var STR_CONTAINS_VAR_2
Var STR_CONTAINS_VAR_3
Var STR_CONTAINS_VAR_4
Var STR_RETURN_VAR
 
Function StrContains
  Exch $STR_NEEDLE
  Exch 1
  Exch $STR_HAYSTACK
  ; Uncomment to debug
  ;MessageBox MB_OK 'STR_NEEDLE = $STR_NEEDLE STR_HAYSTACK = $STR_HAYSTACK '
    StrCpy $STR_RETURN_VAR ""
    StrCpy $STR_CONTAINS_VAR_1 -1
    StrLen $STR_CONTAINS_VAR_2 $STR_NEEDLE
    StrLen $STR_CONTAINS_VAR_4 $STR_HAYSTACK
    loop:
      IntOp $STR_CONTAINS_VAR_1 $STR_CONTAINS_VAR_1 + 1
      StrCpy $STR_CONTAINS_VAR_3 $STR_HAYSTACK $STR_CONTAINS_VAR_2 $STR_CONTAINS_VAR_1
      StrCmp $STR_CONTAINS_VAR_3 $STR_NEEDLE found
      StrCmp $STR_CONTAINS_VAR_1 $STR_CONTAINS_VAR_4 done
      Goto loop
    found:
      StrCpy $STR_RETURN_VAR $STR_NEEDLE
      Goto done
    done:
   Pop $STR_NEEDLE ;Prevent "invalid opcode" errors and keep the
   Exch $STR_RETURN_VAR  
FunctionEnd
 
!macro _StrContainsConstructor OUT NEEDLE HAYSTACK
  Push `${HAYSTACK}`
  Push `${NEEDLE}`
  Call StrContains
  Pop `${OUT}`
!macroend
 
!define StrContains '!insertmacro "_StrContainsConstructor"'/*** UAC Plug-in ***

Interactive User (MediumIL)        Admin user (HighIL)
***[Setup.exe]*************      ***[Setup.exe]**************
*                         *      *                          *
* +++[.OnInit]+++++++++++ *      * +++[.OnInit]++++++++++++ *
* + UAC_RunElevated >---+-+----> * +                      + *
* + NSIS.Quit           + *      * +                      + *
* +++++++++++++++++++++++ *      * ++++++++++++++++++++++++ *
*                         *      *                          *
*                         *      *                          *
* +++[Section]+++++++++++ *      * +++[Section]++++++++++++ *
* +                     + *   /--+-+-<UAC_AsUser_ExecShell+ *
* +++++++++++++++++++++++ *   |  * ++++++++++++++++++++++++ *
*                         *   |  *                          *
*  Win32.ShellExecute <---+--/   *                          *
*                         *      *                          *
***************************      ****************************

*/

!ifndef UAC_HDR__INC
!verbose push
!verbose 3
!ifndef UAC_VERBOSE  
	!define UAC_VERBOSE 3
!endif
!verbose ${UAC_VERBOSE}

!define UAC_HDR__INC 0x00020400 ;MMmmbbrr

!include LogicLib.nsh



/* UAC_RunElevated
**
** Starts the elevation operation.
**
** Return values:
**
** $0: Win32 error code (0 on success, 1223 if user aborted elevation dialog, anything else should be treated as a fatal error)
** $1: If $0==0:
**     0 UAC is not supported by the OS
**     1 Started a elevated child process, the current process should act like a wrapper (Call Quit without any further processing)
**     2 The process is already running @ HighIL (Member of admin group)
**     3 You should call RunElevated again (This can happen if a user without admin priv. is used in the runas dialog)
** $2: If $0==0 && $1==1: ExitCode of the elevated fork process (The NSIS errlvl is also set)
** $3: If $0==0: 1 if the user is a member of the admin group or 0 otherwise
**/
!macro UAC_RunElevated
UAC::_ 0
!macroend
!macro UAC_PageElevation_RunElevated
UAC::_ 0
!macroend
/*!macro UAC_OnInitElevation_RunElevated
UAC::_ 0
!macroend
!macro UAC_OnInitElevation_OnGuiInit
!macroend*/



/* UAC_GetIntegrityLevel <NSISVar:Output | "s">
**
** Get integrity level of current process
**
**/
!macro UAC_GetIntegrityLevel outvar
UAC::_ 6
!if "${outvar}" != "s"
	Pop ${outvar}
!endif
!macroend



/* UAC_IsAdmin
**
** Is the current process running with administrator privileges? Result in $0
**
** ${If} ${UAC_IsAdmin} ...
**
**/
!macro UAC_IsAdmin
UAC::_ 2
!macroend
!define UAC_IsAdmin `"" UAC_IsAdmin ""`
!macro _UAC_IsAdmin _a _b _t _f
!insertmacro _UAC_MakeLL_Cmp _!= 0 2s
!macroend



/* UAC_IsInnerInstance
**
** Does the current process have a NSIS/UAC parent process that is part of the elevation operation?
**
** ${If} ${UAC_IsInnerInstance} ...
**
**/
!macro UAC_IsInnerInstance
UAC::_ 3
!macroend
!define UAC_IsInnerInstance `"" UAC_IsInnerInstance ""`
!macro _UAC_IsInnerInstance _a _b _t _f
!insertmacro _UAC_MakeLL_Cmp _!= 0 3s
!macroend



/* UAC_PageElevation_OnInit, UAC_PageElevation_OnGuiInit,
**
** Helper macros for elevation on a custom elevation page, see the DualMode example for more information.
**
**/
!macro UAC_Notify_OnGuiInit
UAC::_ 4
!macroend
!macro UAC_PageElevation_OnGuiInit
!insertmacro UAC_Notify_OnGuiInit
!macroend
!macro UAC_PageElevation_OnInit
UAC::_ 5
${IfThen} ${Errors} ${|} Quit ${|}
!macroend



/* UAC_AsUser_Call <Function|Label> <NSISAddressName> <UAC_* flags>
**
** Calls a function or label in the user process instance.
** All the UAC_AsUser_* macros use this helper macro.
**
**/
!define UAC_SYNCREGISTERS 0x1
;define UAC_SYNCSTACK     0x2
!define UAC_SYNCOUTDIR    0x4
!define UAC_SYNCINSTDIR   0x8
;define UAC_CLEARERRFLAG  0x10
!macro UAC_AsUser_Call type name flags
push $0
Get${type}Address $0 ${name}
!verbose push
!verbose ${UAC_VERBOSE}
!insertmacro _UAC_ParseDefineFlagsToInt _UAC_AsUser_Call__flags ${flags}
!verbose pop
StrCpy $0 "1$0:${_UAC_AsUser_Call__flags}"
!undef _UAC_AsUser_Call__flags
Exch $0
UAC::_
!macroend



/*
** UAC_AsUser_GetSection <Flags|InstTypes|Size|Text> <SectionIndex> <NSISVar:Output>
*/
!macro UAC_AsUser_GetSection secprop secidx outvar
!insertmacro _UAC_AsUser_GenOp ${outvar} SectionGet${secprop} ${secidx} ""
!macroend



/*
** UAC_AsUser_GetGlobalVar <NSISVar:SourceAndOutput>
** UAC_AsUser_GetGlobal <NSISVar:Output> <NSISVar:Source>
*/
!macro UAC_AsUser_GetGlobalVar var
!insertmacro _UAC_AsUser_GenOp ${var} StrCpy "" ${var}
!macroend
!macro UAC_AsUser_GetGlobal outvar srcvar
!insertmacro _UAC_AsUser_GenOp ${outvar} StrCpy "" ${srcvar}
!macroend



/*
** UAC_AsUser_ExecShell <Verb> <ApplicationOrFile> <Parameters> <Working Directory> <SW_*>
**
** Call ExecShell in the user process instance.
**
*/
!macro UAC_AsUser_ExecShell verb command params workdir show
!insertmacro _UAC_IncL
goto _UAC_L_E_${__UAC_L}
_UAC_L_F_${__UAC_L}:
ExecShell "${verb}" "${command}" '${params}' ${show}
return
_UAC_L_E_${__UAC_L}:
!if "${workdir}" != ""
	push $outdir
	SetOutPath "${workdir}"
!endif
!insertmacro UAC_AsUser_Call Label _UAC_L_F_${__UAC_L} ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} #|${UAC_CLEARERRFLAG}
!if "${workdir}" != ""
	pop $outdir 
	SetOutPath $outdir
!endif
!macroend



!macro _UAC_MakeLL_Cmp cmpop cmp pluginparams
!insertmacro _LOGICLIB_TEMP
UAC::_ ${pluginparams}
pop $_LOGICLIB_TEMP
!insertmacro ${cmpop} $_LOGICLIB_TEMP ${cmp} `${_t}` `${_f}`
!macroend
!macro _UAC_definemath def val1 op val2
!define /math _UAC_definemath "${val1}" ${op} ${val2}
!ifdef ${def}
	!undef ${def}
!endif
!define ${def} "${_UAC_definemath}"
!undef _UAC_definemath
!macroend
!macro _UAC_ParseDefineFlags_orin parse outflags
!searchparse /noerrors ${${parse}} "" _UAC_ParseDefineFlags_orin_f1 "|" _UAC_ParseDefineFlags_orin_f2
!define _UAC_ParseDefineFlags_orin_this ${_UAC_ParseDefineFlags_orin_f1}
!undef ${parse}
!define ${parse} ${_UAC_ParseDefineFlags_orin_f2}
!define _UAC_ParseDefineFlags_orin_saveout ${${outflags}}
!undef ${outflags}
!define /math ${outflags} "${_UAC_ParseDefineFlags_orin_saveout}" | "${_UAC_ParseDefineFlags_orin_this}"
!undef _UAC_ParseDefineFlags_orin_saveout
!undef _UAC_ParseDefineFlags_orin_this
!ifdef _UAC_ParseDefineFlags_orin_f1
	!undef _UAC_ParseDefineFlags_orin_f1
!endif
!ifdef _UAC_ParseDefineFlags_orin_f2
	!undef _UAC_ParseDefineFlags_orin_f2
!endif
!macroend
!macro _UAC_ParseDefineFlags_Begin _outdef _in
!define _UAC_PDF${_outdef}_parse "${_in}"
!define _UAC_PDF${_outdef}_flags ""
!define _UAC_PDF${_outdef}_r 0
!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags	;0x1
!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags	;0x2
!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags	;0x4
!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags	;0x8
!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags	;0x10
!macroend
!macro _UAC_ParseDefineFlags_End _outdef
!define ${_outdef} ${_UAC_PDF${_outdef}_r}
!undef _UAC_PDF${_outdef}_r
!undef _UAC_PDF${_outdef}_flags
!undef _UAC_PDF${_outdef}_parse
!macroend
!macro _UAC_ParseDefineFlags_IncludeFlag _outdef flag
!if ${_UAC_PDF${_outdef}_flags} & ${flag}
	!insertmacro _UAC_definemath _UAC_PDF${_outdef}_r ${_UAC_PDF${_outdef}_r} | ${flag}
!endif
!macroend
!macro _UAC_ParseDefineFlagsToInt _outdef _in
!insertmacro _UAC_ParseDefineFlags_Begin _UAC_ParseDefineFlagsToInt_tmp "${_in}"
!define ${_outdef} ${_UAC_PDF_UAC_ParseDefineFlagsToInt_tmp_flags}
!insertmacro _UAC_ParseDefineFlags_End _UAC_ParseDefineFlagsToInt_tmp
!undef _UAC_ParseDefineFlagsToInt_tmp
!macroend
!macro _UAC_IncL
!insertmacro _UAC_definemath __UAC_L "${__UAC_L}" + 1
!macroend
!macro _UAC_AsUser_GenOp outvar op opparam1 opparam2
!define _UAC_AUGOGR_ID _UAC_AUGOGR_OP${outvar}${op}${opparam1}${opparam2}
!ifndef ${_UAC_AUGOGR_ID} ;Has this exact action been done before? 
	!if ${outvar} == $0
		!define ${_UAC_AUGOGR_ID} $1
	!else
		!define ${_UAC_AUGOGR_ID} $0
	!endif
	!if "${opparam1}" == ""
		!define _UAC_AUGOGR_OPP1 ${${_UAC_AUGOGR_ID}}
		!define _UAC_AUGOGR_OPP2 ${opparam2}
	!else
		!define _UAC_AUGOGR_OPP1 ${opparam1}
		!define _UAC_AUGOGR_OPP2 ${${_UAC_AUGOGR_ID}}
	!endif	
	goto ${_UAC_AUGOGR_ID}_C
	${_UAC_AUGOGR_ID}_F:
		${op} ${_UAC_AUGOGR_OPP1} ${_UAC_AUGOGR_OPP2}
		return
	${_UAC_AUGOGR_ID}_C:
	!undef _UAC_AUGOGR_OPP1
	!undef _UAC_AUGOGR_OPP2
!endif
push ${${_UAC_AUGOGR_ID}}
!insertmacro UAC_AsUser_Call Label ${_UAC_AUGOGR_ID}_F ${UAC_SYNCREGISTERS}
StrCpy ${outvar} ${${_UAC_AUGOGR_ID}}
pop ${${_UAC_AUGOGR_ID}}
!undef _UAC_AUGOGR_ID
!macroend



!verbose pop
!endif /* UAC_HDR__INC */!include "nsProcess.nsh"

!ifmacrondef customCheckAppRunning
  !include "getProcessInfo.nsh"
  Var pid
!endif

# http://nsis.sourceforge.net/Allow_only_one_installer_instance
!macro ALLOW_ONLY_ONE_INSTALLER_INSTANCE
  BringToFront
  !define /ifndef SYSTYPE_PTR p ; NSIS v3.0+
  System::Call 'kernel32::CreateMutex(${SYSTYPE_PTR}0, i1, t"${APP_GUID}")?e'
  Pop $0
  IntCmpU $0 183 0 launch launch ; ERROR_ALREADY_EXISTS
    StrLen $0 "$(^SetupCaption)"
    IntOp $0 $0 + 1 ; GetWindowText count includes \0
    StrCpy $1 "" ; Start FindWindow with NULL
    loop:
      FindWindow $1 "#32770" "" "" $1
      StrCmp 0 $1 notfound
      System::Call 'user32::GetWindowText(${SYSTYPE_PTR}r1, t.r2, ir0)'
      StrCmp $2 "$(^SetupCaption)" 0 loop
      SendMessage $1 0x112 0xF120 0 /TIMEOUT=2000 ; WM_SYSCOMMAND:SC_RESTORE to restore the window if it is minimized
      System::Call "user32::SetForegroundWindow(${SYSTYPE_PTR}r1)"
    notfound:
      Abort
  launch:
!macroend

!macro CHECK_APP_RUNNING
    !ifmacrodef customCheckAppRunning
      !insertmacro customCheckAppRunning
    !else
      !insertmacro _CHECK_APP_RUNNING
    !endif
!macroend

!macro _CHECK_APP_RUNNING
  ${GetProcessInfo} 0 $pid $1 $2 $3 $4
  ${if} $3 != "${APP_EXECUTABLE_FILENAME}"
    ${if} ${isUpdated}
      # allow app to exit without explicit kill
      Sleep 100
    ${endIf}

    ${nsProcess::FindProcess} "${APP_EXECUTABLE_FILENAME}" $R0
    ${if} $R0 == 0
      ${if} ${isUpdated}
        # allow app to exit without explicit kill
        Sleep 1000
        Goto doStopProcess
      ${endIf}
      MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(appRunning)" /SD IDOK IDOK doStopProcess
      Quit

      doStopProcess:

      DetailPrint `Closing running "${PRODUCT_NAME}"...`

      # https://github.com/electron-userland/electron-builder/issues/2516#issuecomment-372009092
      nsExec::Exec `taskkill /im "${APP_EXECUTABLE_FILENAME}" /fi "PID ne $pid"` $R0
      # to ensure that files are not "in-use"
      Sleep 100

      ${nsProcess::FindProcess} "${APP_EXECUTABLE_FILENAME}" $R0
      ${if} $R0 == 0
        # wait to give a chance to exit gracefully
        Sleep 1000
        # do not use /t tree kill - app was killed softly already
        nsExec::Exec `taskkill /f /im "${APP_EXECUTABLE_FILENAME}" /fi "PID ne $pid"` $R0
        ${If} $R0 != 0
          DetailPrint `Waiting for "${PRODUCT_NAME}" to close (taskkill exit code $R0).`
          Sleep 2000
        ${endIf}
      ${endIf}
    ${endIf}
  ${endIf}

  ${nsProcess::Unload}
!macroend!macro extractEmbeddedAppPackage
  !ifdef COMPRESS
    SetCompress off
  !endif

  Var /GLOBAL packageArch

  !ifdef APP_64
    StrCpy $packageArch "64"

    !ifdef APP_32
      ${if} ${RunningX64}
        !insertmacro x64_app_files
      ${else}
        !insertmacro ia32_app_files
      ${endIf}
    !else
      !insertmacro x64_app_files
    !endif
  !else
    !insertmacro ia32_app_files
  !endif

  !ifdef COMPRESS
    SetCompress "${COMPRESS}"
  !endif

  !ifdef ZIP_COMPRESSION
    nsisunz::Unzip "$PLUGINSDIR\app-$packageArch.zip" "$INSTDIR"
  !else
    !insertmacro extractUsing7za "$PLUGINSDIR\app-$packageArch.7z"
  !endif

  # after decompression
  ${if} $packageArch == "64"
    !ifmacrodef customFiles_x64
      !insertmacro customFiles_x64
    !endif
  ${else}
    !ifmacrodef customFiles_ia32
      !insertmacro customFiles_ia32
    !endif
  ${endIf}
!macroend

!macro x64_app_files
  File /oname=$PLUGINSDIR\app-64.${COMPRESSION_METHOD} "${APP_64}"
!macroend

!macro ia32_app_files
  StrCpy $packageArch "32"
  File /oname=$PLUGINSDIR\app-32.${COMPRESSION_METHOD} "${APP_32}"
!macroend

!macro extractUsing7za FILE
  Nsis7z::Extract "${FILE}"
!macroend; NSIS PROCESS INFO LIBRARY - GetProcessInfo.nsh
; Version 1.1 - Mar 28th, 2011
;
; Description:
;   Gets process information.
;
; Usage example:
;   ${GetProcessInfo} 0 $0 $1 $2 $3 $4
;   DetailPrint "pid=$0 parent_pid=$1 priority=$2 process_name=$3 exe=$4"
;
; History:
;   1.1 - 28/03/2011 - Added uninstall function, include guards, file header. Fixed getting full exe path on pre vista systems. (Sergius)
;

!ifndef GETPROCESSINFO_INCLUDED
!define GETPROCESSINFO_INCLUDED

!define PROCESSINFO.TH32CS_SNAPPROCESS      2
!define PROCESSINFO.INVALID_HANDLE_VALUE    -1

!define GetProcessInfo '!insertmacro GetProcessInfo'

;@in pid_in - if 0 - get current process info
;@out pid_out - real process id (may be useful, if pid_in=0)
;@out ppid - parent process id
;@out priority
;@out name - name of process
;@out fullname - fully-qualified path of process
!macro GetProcessInfo pid_in pid_out ppid priority name fullname
    Push ${pid_in}
    !ifdef BUILD_UNINSTALLER
        Call un._GetProcessInfo
    !else
        Call _GetProcessInfo
    !endif
    ;name;pri;ppid;fname;pid;
    Pop ${name}
    Pop ${priority}
    Pop ${ppid}
    Pop ${fullname}
    Pop ${pid_out}
!macroend

!macro FUNC_GETPROCESSINFO
    Exch $R3 ;pid
    Push $0
    Push $1
    Push $2
    Push $3
    Push $4
    Push $5
    Push $R0 ;hSnapshot
    Push $R1 ;result
    Push $R9 ;PROCESSENTRY32;MODULEENTRY32 and so on
    Push $R8

    ;zero registers to waste trash, if error occurred
    StrCpy $0 ""
    StrCpy $1 ""
    StrCpy $2 ""
    StrCpy $3 ""
    StrCpy $4 ""
    StrCpy $5 ""

    IntCmp $R3 0 0 skip_pid_detection skip_pid_detection
    System::Call 'kernel32::GetCurrentProcess() i.R0'
    System::Call "Kernel32::GetProcessId(i R0) i.R3"

skip_pid_detection:
    System::Call 'Kernel32::CreateToolhelp32Snapshot(i ${PROCESSINFO.TH32CS_SNAPPROCESS},i R3) i.R0'

    IntCmp $R0 ${PROCESSINFO.INVALID_HANDLE_VALUE} end ;someting wrong

    ;$R9=PROCESSENTRY32
    ;typedef struct tagPROCESSENTRY32 {
    ;  DWORD     dwSize;
    ;  DWORD     cntUsage;
    ;  DWORD     th32ProcessID;
    ;  ULONG_PTR th32DefaultHeapID;
    ;  DWORD     th32ModuleID;
    ;  DWORD     cntThreads;
    ;  DWORD     th32ParentProcessID;
    ;  LONG      pcPriClassBase;
    ;  DWORD     dwFlags;
    ;  TCHAR     szExeFile[MAX_PATH];
    ;}PROCESSENTRY32, *PPROCESSENTRY32;
    ;dwSize=4*9+2*260

    System::Alloc 1024
    pop $R9
    System::Call "*$R9(i 556)"

    System::Call 'Kernel32::Process32FirstW(i R0, i $R9) i.R1'
    StrCmp $R1 0 end

nnext_iteration:
    System::Call "*$R9(i,i,i.R1)" ;get PID
    IntCmp $R1 $R3 exitloop

    System::Call 'Kernel32::Process32NextW(i R0, i $R9) i.R1'
    IntCmp $R1 0 0 nnext_iteration nnext_iteration

exitloop:
    ;$0 - pid
    ;$1 - threads
    ;$2 - ppid
    ;$3 - priority
    ;$4 - process name
    System::Call "*$R9(i,i,i.r0,i,i,i.r1,i.r2,i.r3,i,&w256.r4)" ; Get next module

    ;free:
    System::Free $R9
    System::Call "Kernel32::CloseToolhelp32Snapshot(i R0)"

    ;===============
    ;now get full path and commandline

    System::Call "Kernel32::OpenProcess(i 1040, i 0, i r0)i .R0"

    StrCmp $R0 0 end

    IntOp $R8 0 + 256
    System::Call "psapi::GetModuleFileNameExW(i R0,i 0,t .r5, *i $R8)i .R1"

end:
    Pop $R8
    Pop $R9
    Pop $R1
    Pop $R0
    Exch $5
    Exch 1
    Exch $4
    Exch 2
    Exch $3
    Exch 3
    Exch $2
    Exch 4
    Pop $1
    Exch 4
    Exch $0
    Exch 5
    Pop $R3
!macroend ;FUNC_GETPROCESSINFO

!ifndef BUILD_UNINSTALLER
Function _GetProcessInfo
    !insertmacro FUNC_GETPROCESSINFO
FunctionEnd
!endif

!ifdef BUILD_UNINSTALLER
Function un._GetProcessInfo
    !insertmacro FUNC_GETPROCESSINFO
FunctionEnd
!endif

!endif ;GETPROCESSINFO_INCLUDED!macro moveFile FROM TO
  ClearErrors
  Rename `${FROM}` `${TO}`
  ${if} ${errors}
    # not clear - can NSIS rename on another drive or not, so, in case of error, just copy
    ClearErrors
    !insertmacro copyFile `${FROM}` `${TO}`
    Delete `${FROM}`
  ${endif}
!macroend

!macro copyFile FROM TO
  ${StdUtils.GetParentPath} $R5 `${TO}`
  CreateDirectory `$R5`
  ClearErrors
  CopyFiles /SILENT `${FROM}` `${TO}`
!macroend

Function GetInQuotes
  Exch $R0
  Push $R1
  Push $R2
  Push $R3

   StrCpy $R2 -1
   IntOp $R2 $R2 + 1
    StrCpy $R3 $R0 1 $R2
    StrCmp $R3 "" 0 +3
     StrCpy $R0 ""
     Goto Done
    StrCmp $R3 '"' 0 -5

   IntOp $R2 $R2 + 1
   StrCpy $R0 $R0 "" $R2

   StrCpy $R2 0
   IntOp $R2 $R2 + 1
    StrCpy $R3 $R0 1 $R2
    StrCmp $R3 "" 0 +3
     StrCpy $R0 ""
     Goto Done
    StrCmp $R3 '"' 0 -5

   StrCpy $R0 $R0 $R2
   Done:

  Pop $R3
  Pop $R2
  Pop $R1
  Exch $R0
FunctionEnd

!macro GetInQuotes Var Str
  Push "${Str}"
  Call GetInQuotes
  Pop "${Var}"
!macroend

Function GetFileParent
  Exch $R0
  Push $R1
  Push $R2
  Push $R3

  StrCpy $R1 0
  StrLen $R2 $R0

  loop:
    IntOp $R1 $R1 + 1
    IntCmp $R1 $R2 get 0 get
    StrCpy $R3 $R0 1 -$R1
    StrCmp $R3 "\" get
  Goto loop

  get:
    StrCpy $R0 $R0 -$R1

    Pop $R3
    Pop $R2
    Pop $R1
    Exch $R0
FunctionEnd

Var /GLOBAL isTryToKeepShortcuts

!macro setIsTryToKeepShortcuts
  StrCpy $isTryToKeepShortcuts "true"
  !ifdef allowToChangeInstallationDirectory
    ${ifNot} ${isUpdated}
      StrCpy $isTryToKeepShortcuts "false"
    ${endIf}
  !endif
!macroend

# https://nsis-dev.github.io/NSIS-Forums/html/t-172971.html
!macro readReg VAR ROOT_KEY SUB_KEY NAME
  ${if} "${ROOT_KEY}" == "SHELL_CONTEXT"
    ReadRegStr "${VAR}" SHELL_CONTEXT "${SUB_KEY}" "${NAME}"
  ${elseif} "${ROOT_KEY}" == "HKEY_CURRENT_USER"
    ReadRegStr "${VAR}" HKEY_CURRENT_USER "${SUB_KEY}" "${NAME}"
  ${elseif} "${ROOT_KEY}" == "HKEY_LOCAL_MACHINE"
    ReadRegStr "${VAR}" HKEY_LOCAL_MACHINE "${SUB_KEY}" "${NAME}"
  ${else}
    MessageBox MB_OK "Unsupported ${ROOT_KEY}"
  ${endif}
!macroend

# http://stackoverflow.com/questions/24595887/waiting-for-nsis-uninstaller-to-finish-in-nsis-installer-either-fails-or-the-uni
Function uninstallOldVersion
  Var /GLOBAL uninstallerFileName
  Var /GLOBAL installationDir
  Var /GLOBAL uninstallString
  Var /GLOBAL rootKey

  ClearErrors
  Exch $rootKey

  !insertmacro readReg $uninstallString "$rootKey" "${UNINSTALL_REGISTRY_KEY}" UninstallString
  ${if} $uninstallString == ""
    !ifdef UNINSTALL_REGISTRY_KEY_2
      !insertmacro readReg $uninstallString "$rootKey" "${UNINSTALL_REGISTRY_KEY_2}" UninstallString
    !endif
    ${if} $uninstallString == ""
      Goto Done
    ${endif}
  ${endif}

  # uninstaller should be copied out of app installation dir (because this dir will be deleted), so, extract uninstaller file name
  !insertmacro GetInQuotes $uninstallerFileName "$uninstallString"

  !insertmacro readReg $installationDir "$rootKey" "${INSTALL_REGISTRY_KEY}" InstallLocation
  ${if} $installationDir == ""
  ${andIf} $uninstallerFileName != ""
    # https://github.com/electron-userland/electron-builder/issues/735#issuecomment-246918567
    Push $uninstallerFileName
    Call GetFileParent
    Pop $installationDir
  ${endif}

  ${if} $installationDir == ""
  ${andIf} $uninstallerFileName == ""
    Goto Done
  ${endif}

  !insertmacro copyFile "$uninstallerFileName" "$PLUGINSDIR\old-uninstaller.exe"
  StrCpy $uninstallerFileName "$PLUGINSDIR\old-uninstaller.exe"

  ${if} $installMode == "CurrentUser"
  ${orIf} $rootKey == "HKEY_CURRENT_USER"
    StrCpy $0 "/currentuser"
  ${else}
    StrCpy $0 "/allusers"
  ${endif}

  !insertMacro setIsTryToKeepShortcuts

  ${if} $isTryToKeepShortcuts == "true"
    !insertmacro readReg $R5 "$rootKey" "${INSTALL_REGISTRY_KEY}" KeepShortcuts
    # if true, it means that old uninstaller supports --keep-shortcuts flag
    ${if} $R5 == "true"
    ${andIf} ${FileExists} "$appExe"
      StrCpy $0 "$0 --keep-shortcuts"
    ${endIf}
  ${endIf}

  ${if} ${isDeleteAppData}
    StrCpy $0 "$0 --delete-app-data"
  ${else}
    # always pass --updated flag - to ensure that if DELETE_APP_DATA_ON_UNINSTALL is defined, user data will be not removed
    StrCpy $0 "$0 --updated"
  ${endif}

  ExecWait '"$uninstallerFileName" /S /KEEP_APP_DATA $0 _?=$installationDir' $R0
  ${if} $R0 != 0
    DetailPrint `Aborting, uninstall was not successful. Uninstaller error code: $R0.`
    SetErrorLevel 5
    Abort "Cannot uninstall"
  ${endif}
  Done:
FunctionEnd

!macro uninstallOldVersion ROOT_KEY
  Push "${ROOT_KEY}"
  Call uninstallOldVersion
!macroend# functions (nsis macro) for installer

!include "extractAppPackage.nsh"

!ifdef APP_PACKAGE_URL
  !include webPackage.nsh
!endif

!macro installApplicationFiles
  !ifdef APP_BUILD_DIR
    File /r "${APP_BUILD_DIR}\*.*"
  !else
    !ifdef APP_PACKAGE_URL
      Var /GLOBAL packageFile
      Var /GLOBAL isPackageFileExplicitlySpecified

      ${StdUtils.GetParameter} $packageFile "package-file" ""
      ${if} $packageFile == ""
        !ifdef APP_64_NAME
          !ifdef APP_32_NAME
            ${if} ${RunningX64}
              StrCpy $packageFile "${APP_64_NAME}"
              StrCpy $1 "${APP_64_HASH}"
            ${else}
              StrCpy $packageFile "${APP_32_NAME}"
              StrCpy $1 "${APP_32_HASH}"
            ${endif}
          !else
            StrCpy $packageFile "${APP_64_NAME}"
            StrCpy $1 "${APP_64_HASH}"
          !endif
        !else
          StrCpy $packageFile "${APP_32_NAME}"
          StrCpy $1 "${APP_32_HASH}"
        !endif
        StrCpy $4 "$packageFile"
        StrCpy $packageFile "$EXEDIR/$packageFile"
        StrCpy $isPackageFileExplicitlySpecified "false"
      ${else}
        StrCpy $isPackageFileExplicitlySpecified "true"
      ${endIf}

      # we do not check file hash is specifed explicitly using --package-file because it is clear that user definitly want to use this file and it is user responsibility to check
      # 1. auto-updater uses --package-file and validates checksum
      # 2. user can user another package file (use case - one installer suitable for any app version (use latest version))
      ${if} ${FileExists} "$packageFile"
        ${if} $isPackageFileExplicitlySpecified == "true"
          Goto fun_extract
        ${else}
          ${StdUtils.HashFile} $3 "SHA2-512" "$packageFile"
          ${if} $3 == $1
            Goto fun_extract
          ${else}
            MessageBox MB_OK "Package file $4 found locally, but checksum doesn't match â€” expected $1, actual $3.$\r$\nLocal file is ignored and package will be downloaded from Internet."
          ${endIf}
        ${endIf}
      ${endIf}

      !insertmacro downloadApplicationFiles

      fun_extract:
        !insertmacro extractUsing7za "$packageFile"

        # electron always uses per user app data
        ${if} $installMode == "all"
          SetShellVarContext current
        ${endif}

        !insertmacro moveFile "$packageFile" "$LOCALAPPDATA\${APP_PACKAGE_STORE_FILE}"

        ${if} $installMode == "all"
          SetShellVarContext all
        ${endif}
    !else
      !insertmacro extractEmbeddedAppPackage
      # electron always uses per user app data
      ${if} $installMode == "all"
        SetShellVarContext current
      ${endif}
      !insertmacro copyFile "$EXEPATH" "$LOCALAPPDATA\${APP_INSTALLER_STORE_FILE}"
      ${if} $installMode == "all"
        SetShellVarContext all
      ${endif}
    !endif
  !endif

  File "/oname=${UNINSTALL_FILENAME}" "${UNINSTALLER_OUT_FILE}"
!macroend

!macro registryAddInstallInfo
	WriteRegStr SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" InstallLocation "$INSTDIR"
	WriteRegStr SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" KeepShortcuts "true"
  WriteRegStr SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" ShortcutName "${SHORTCUT_NAME}"
  !ifdef MENU_FILENAME
    WriteRegStr SHELL_CONTEXT "${INSTALL_REGISTRY_KEY}" MenuDirectory "${MENU_FILENAME}"
  !endif

	${if} $installMode == "all"
		StrCpy $0 "/allusers"
		StrCpy $1 ""
	${else}
		StrCpy $0 "/currentuser"
		StrCpy $1 ""
	${endIf}

  WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" DisplayName "${UNINSTALL_DISPLAY_NAME}$1"
  # https://github.com/electron-userland/electron-builder/issues/750
  StrCpy $2 "$INSTDIR\${UNINSTALL_FILENAME}"
  WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" UninstallString '"$2" $0'
  WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" QuietUninstallString '"$2" $0 /S'

	WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" "DisplayVersion" "${VERSION}"
	!ifdef UNINSTALLER_ICON
	  WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" "DisplayIcon" "$INSTDIR\uninstallerIcon.ico"
	!else
	  WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" "DisplayIcon" "$appExe,0"
	!endif

  !ifdef COMPANY_NAME
	  WriteRegStr SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" "Publisher" "${COMPANY_NAME}"
	!endif
	WriteRegDWORD SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" NoModify 1
	WriteRegDWORD SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" NoRepair 1

  # allow user to define ESTIMATED_SIZE to avoid GetSize call
  !ifdef ESTIMATED_SIZE
    IntFmt $0 "0x%08X" ${ESTIMATED_SIZE}
  !else
    ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
    IntFmt $0 "0x%08X" $0
  !endif
	WriteRegDWORD SHELL_CONTEXT "${UNINSTALL_REGISTRY_KEY}" "EstimatedSize" "$0"
!macroend

!macro cleanupOldMenuDirectory
  ${if} $oldMenuDirectory != ""
    !ifdef MENU_FILENAME
      ${if} $oldMenuDirectory != "${MENU_FILENAME}"
        RMDir "$SMPROGRAMS\$oldMenuDirectory"
      ${endIf}
    !else
      RMDir "$SMPROGRAMS\$oldMenuDirectory"
    !endif
  ${endIf}
!macroend

!macro createMenuDirectory
  !ifdef MENU_FILENAME
    CreateDirectory "$SMPROGRAMS\${MENU_FILENAME}"
    ClearErrors
  !endif
!macroend

!macro addStartMenuLink keepShortcuts
  !ifndef DO_NOT_CREATE_START_MENU_SHORTCUT
    # The keepShortcuts mechanism is NOT enabled.
    # Menu shortcut will be recreated.
    ${if} $keepShortcuts  == "false"
      !insertmacro cleanupOldMenuDirectory
      !insertmacro createMenuDirectory

      CreateShortCut "$newStartMenuLink" "$appExe" "" "$appExe" 0 "" "" "${APP_DESCRIPTION}"
      # clear error (if shortcut already exists)
      ClearErrors
      WinShell::SetLnkAUMI "$newStartMenuLink" "${APP_ID}"
    # The keepShortcuts mechanism IS enabled.
    # The menu shortcut could either not exist (it shouldn't be recreated) or exist in an obsolete location.
    ${elseif} $oldStartMenuLink != $newStartMenuLink
    ${andIf} ${FileExists} "$oldStartMenuLink"
      !insertmacro createMenuDirectory

      Rename $oldStartMenuLink $newStartMenuLink
      WinShell::UninstShortcut "$oldStartMenuLink"
      WinShell::SetLnkAUMI "$newStartMenuLink" "${APP_ID}"

      !insertmacro cleanupOldMenuDirectory
    ${endIf}
  !endif
!macroend

!macro addDesktopLink keepShortcuts
  !ifndef DO_NOT_CREATE_DESKTOP_SHORTCUT
    # https://github.com/electron-userland/electron-builder/pull/1432
    ${ifNot} ${isNoDesktopShortcut}
      # The keepShortcuts mechanism is NOT enabled.
      # Shortcuts will be recreated.
      ${if} $keepShortcuts == "false"
        CreateShortCut "$newDesktopLink" "$appExe" "" "$appExe" 0 "" "" "${APP_DESCRIPTION}"
        ClearErrors
        WinShell::SetLnkAUMI "$newDesktopLink" "${APP_ID}"
      # The keepShortcuts mechanism IS enabled.
      # The desktop shortcut could exist in an obsolete location (due to name change).
      ${elseif} $oldDesktopLink != $newDesktopLink
      ${orIf} ${FileExists} "$oldDesktopLink"
        Rename $oldDesktopLink $newDesktopLink
        WinShell::UninstShortcut "$oldDesktopLink"
        WinShell::SetLnkAUMI "$newDesktopLink" "${APP_ID}"

      !ifdef RECREATE_DESKTOP_SHORTCUT
      ${elseif} $oldDesktopLink != $newDesktopLink
      ${orIfNot} ${FileExists} "$oldDesktopLink"
        ${ifNot} ${isUpdated}
          CreateShortCut "$newDesktopLink" "$appExe" "" "$appExe" 0 "" "" "${APP_DESCRIPTION}"
          ClearErrors
          WinShell::SetLnkAUMI "$newDesktopLink" "${APP_ID}"
        ${endIf}
      !endif
      ${endIf}
      System::Call 'Shell32::SHChangeNotify(i 0x8000000, i 0, i 0, i 0)'
    ${endIf}
  !endif
!macroend!define nsProcess::FindProcess `!insertmacro nsProcess::FindProcess`

!macro nsProcess::FindProcess _FILE _ERR
	nsProcess::_FindProcess /NOUNLOAD `${_FILE}`
	Pop ${_ERR}
!macroend


!define nsProcess::KillProcess `!insertmacro nsProcess::KillProcess`

!macro nsProcess::KillProcess _FILE _ERR
	nsProcess::_KillProcess /NOUNLOAD `${_FILE}`
	Pop ${_ERR}
!macroend

!define nsProcess::CloseProcess `!insertmacro nsProcess::CloseProcess`

!macro nsProcess::CloseProcess _FILE _ERR
	nsProcess::_CloseProcess /NOUNLOAD `${_FILE}`
	Pop ${_ERR}
!macroend


!define nsProcess::Unload `!insertmacro nsProcess::Unload`

!macro nsProcess::Unload
	nsProcess::_Unload
!macroend
!macro downloadApplicationFiles
  Var /GLOBAL packageUrl
  Var /GLOBAL packageArch

  StrCpy $packageUrl "${APP_PACKAGE_URL}"
  StrCpy $packageArch "${APP_PACKAGE_URL}"

  !ifdef APP_PACKAGE_URL_IS_INCOMLETE
    !ifdef APP_64_NAME
      !ifdef APP_32_NAME
        ${if} ${RunningX64}
          StrCpy $packageUrl "$packageUrl/${APP_64_NAME}"
        ${else}
          StrCpy $packageUrl "$packageUrl/${APP_32_NAME}"
        ${endif}
      !else
        StrCpy $packageUrl "$packageUrl/${APP_64_NAME}"
      !endif
    !else
      StrCpy $packageUrl "$packageUrl/${APP_32_NAME}"
    !endif
  !endif

  ${if} ${RunningX64}
    StrCpy $packageArch "64"
  ${else}
    StrCpy $packageArch "32"
  ${endif}

  download:
  inetc::get /USERAGENT "electron-builder (Mozilla)" /header "X-Arch: $packageArch" /RESUME "" "$packageUrl" "$PLUGINSDIR\package.7z" /END
  Pop $0
  ${if} $0 == "Cancelled"
    quit
  ${elseif} $0 != "OK"
    Messagebox MB_RETRYCANCEL|MB_ICONEXCLAMATION "Unable to download application package from $packageUrl (status: $0).$\r$\n$\r$\nPlease check you Internet connection and retry." IDRETRY download
    Quit
  ${endif}

  StrCpy $packageFile "$PLUGINSDIR\package.7z"
!macroend<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
  <Fragment>
    <WixVariable Id="WixUISupportPerUser" Value="1" Overridable="yes"/>
    <WixVariable Id="WixUISupportPerMachine" Value="1" Overridable="yes"/>

    <PropertyRef Id="ApplicationFolderName"/>

    <UI Id="WixUI_Assisted">
      <Dialog Id="InstallScopeDialog" Width="370" Height="270" Title="!(loc.InstallScopeDlg_Title)" KeepModeless="yes">
        <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.InstallScopeDlgBannerBitmap)"/>
        <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0"/>
        <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0"/>
        <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Transparent="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgDescription)"/>
        <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgTitle)"/>

        <Control Id="BothScopes" Type="RadioButtonGroup" X="20" Y="55" Width="330" Height="120" Property="WixAppFolder" Hidden="yes">
          <RadioButtonGroup Property="WixAppFolder">
            <RadioButton Value="WixPerUserFolder" X="0" Y="0" Width="295" Height="16" Text="!(loc.InstallScopeDlgPerUser)"/>
            <RadioButton Value="WixPerMachineFolder" X="0" Y="60" Width="295" Height="16" Text="!(loc.InstallScopeDlgPerMachine)"/>
          </RadioButtonGroup>
          <Condition Action="show">Privileged AND (!(wix.WixUISupportPerUser) AND !(wix.WixUISupportPerMachine))</Condition>
        </Control>
        <Control Id="PerUserDescription" Type="Text" X="33" Y="70" Width="300" Height="36" Hidden="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgPerUserDescription)">
          <Condition Action="show">!(wix.WixUISupportPerUser)</Condition>
        </Control>
        <Control Id="NoPerUserDescription" Type="Text" X="33" Y="70" Width="300" Height="36" Hidden="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgNoPerUserDescription)">
          <Condition Action="show">NOT !(wix.WixUISupportPerUser)</Condition>
        </Control>
        <Control Id="PerMachineDescription" Type="Text" X="33" Y="131" Width="300" Height="36" Hidden="yes" NoPrefix="yes" Text="!(loc.InstallScopeDlgPerMachineDescription)">
          <Condition Action="show">Privileged</Condition>
        </Control>

        <Control Id="Install" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Default="yes" Text="!(loc.AdvancedWelcomeEulaDlgInstall)" Hidden="yes">
          <Condition Action="show">WixAppFolder = "WixPerMachineFolder"</Condition>
          <Condition Action="hide">WixAppFolder = "WixPerUserFolder"</Condition>

          <!-- F*** WiX - it doesn't work. Installed per-user in any case. -->
          <Publish Property="MSIINSTALLPERUSER">1</Publish>

          <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1</Publish>
          <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
          <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
          <Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
          <Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
          <Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
        </Control>
        <Control Id="InstallNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Default="yes" Text="!(loc.AdvancedWelcomeEulaDlgInstall)" Hidden="yes">
          <Condition Action="show">WixAppFolder = "WixPerUserFolder"</Condition>
          <Condition Action="hide">WixAppFolder = "WixPerMachineFolder"</Condition>

          <!--<Publish Property="MSIINSTALLPERUSER" Value="1" Order="0">WixAppFolder = "WixPerUserFolder"</Publish>-->

          <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1</Publish>
          <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
          <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
          <Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
          <Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
          <Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
        </Control>

        <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
          <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
        </Control>
      </Dialog>

      <!--<Publish Dialog="InstallScopeDialog" Control="InstallNoShield" Property="MSIINSTALLPERUSER" Value="1" Order="3">WixAppFolder = "WixPerUserFolder"</Publish>-->
      <!--<Publish Dialog="InstallScopeDialog" Control="Install" Property="MSIINSTALLPERUSER" Value="{}" Order="4">WixAppFolder = "WixPerMachineFolder"</Publish>-->

      <TextStyle Id="WixUI_Font_Normal" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Normal_Size)"/>
      <TextStyle Id="WixUI_Font_Bigger" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Bigger_Size)"/>
      <TextStyle Id="WixUI_Font_Title" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Title_Size)" Bold="yes"/>
      <TextStyle Id="WixUI_Font_Emphasized" FaceName="!(loc.Advanced_Font_FaceName)" Size="!(loc.Advanced_Font_Emphasized_Size)" Bold="yes"/>

      <Property Id="DefaultUIFont" Value="WixUI_Font_Normal"/>

      <DialogRef Id="BrowseDlg"/>
      <DialogRef Id="DiskCostDlg"/>
      <DialogRef Id="ErrorDlg"/>
      <DialogRef Id="FatalError"/>
      <DialogRef Id="FilesInUse"/>
      <DialogRef Id="MsiRMFilesInUse"/>
      <DialogRef Id="PrepareDlg"/>
      <DialogRef Id="ProgressDlg"/>
      <DialogRef Id="ResumeDlg"/>
      <DialogRef Id="UserExit"/>

      <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
      <Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="runAfterFinish">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>

      <!--<Publish Dialog="BrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="1">1</Publish>-->
      <!--<Publish Dialog="BrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="2"><![CDATA[WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>-->

      <!--<Publish Dialog="InstallScopeDialog" Control="Next" Property="WixAppFolder" Value="WixPerUserFolder" Order="1">!(wix.WixUISupportPerUser) AND NOT Privileged</Publish>-->
      <!--<Publish Dialog="InstallScopeDialog" Control="Next" Property="MSIINSTALLPERUSER" Value="1" Order="2">!(wix.WixUISupportPerUser) AND NOT Privileged</Publish>-->

      <!--<Publish Dialog="InstallScopeDialog" Control="Next" Property="MSIINSTALLPERUSER" Value="1" Order="3">WixAppFolder = "WixPerUserFolder"</Publish>-->
      <!--<Publish Dialog="InstallScopeDialog" Control="Next" Property="MSIINSTALLPERUSER" Value="{}" Order="4">WixAppFolder = "WixPerMachineFolder"</Publish>-->

      <!-- do not allow choosing installation dir if per-user -->
      <!--<Publish Dialog="InstallScopeDialog" Control="Next" Event="NewDialog" Value="FeaturesDlg" Order="6">WixAppFolder = "WixPerUserFolder"</Publish>-->
      <!--<Publish Dialog="InstallScopeDialog" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="7">WixAppFolder = "WixPerMachineFolder"</Publish>-->

      <!--<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="InstallScopeDialog">!(wix.WixUISupportPerUser)</Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="AdvancedWelcomeEulaDlg">NOT !(wix.WixUISupportPerUser)</Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="ExitDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>-->
      <!--<Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish>-->

      <!--<Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>-->

      <!--<Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="FeaturesDlg">1</Publish>-->
      <!--<Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>-->
      <!--<Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>-->
      <!--<Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>-->

      <!--<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish>-->
      <!--<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="3">Installed AND PATCH</Publish>-->

      <!--<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>-->

      <InstallUISequence>
        <Show Dialog="InstallScopeDialog" Sequence="1">NOT Installed</Show>
      </InstallUISequence>
    </UI>

    <Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONFOLDER"/>
    <UIRef Id="WixUI_Common"/>
  </Fragment>
</Wix><?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
  <!-- https://blogs.msdn.microsoft.com/gremlininthemachine/2006/12/05/msi-wix-and-unicode/ -->
  <Product Id="*" Name="${productName}" UpgradeCode="${upgradeCode}" Version="${version}" Language="1033" Codepage="65001" Manufacturer="${manufacturer}">
    <Package Compressed="yes" InstallerVersion="500"/>

    <Condition Message="Windows 7 and above is required"><![CDATA[Installed OR VersionNT >= 601]]></Condition>

    <!--
    AllowSameVersionUpgrades:
      When set to no (the default), installing a product with the same version and upgrade code (but different product code) is allowed and treated by MSI as two products.
      When set to yes, WiX sets the msidbUpgradeAttributesVersionMaxInclusive attribute, which tells MSI to treat a product with the same version as a major upgrade.

      So, AllowSameVersionUpgrades="yes" allows to build and test MSI with the same version, and previously installed app will be removed.
    -->
    <MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage='A newer version of "[ProductName]" is already installed.'/>
    <MediaTemplate CompressionLevel="${compressionLevel}" EmbedCab="yes"/>

    <Property Id="ApplicationFolderName" Value="${installationDirectoryWixName}"/>
    <Property Id="WixAppFolder" Value="WixPerUserFolder"/>

    {{ if (iconPath) { }}
    <Icon Id="icon.ico" SourceFile="${iconPath}"/>
    <Property Id="ARPPRODUCTICON" Value="icon.ico"/>
    {{ } -}}

    {{ if (isAssisted || isRunAfterFinish) { }}
    <CustomAction Id="runAfterFinish" FileKey="mainExecutable" ExeCommand="" Execute="immediate" Impersonate="yes" Return="asyncNoWait"/>
    {{ } -}}

    <Property Id="ALLUSERS" Secure="yes" Value="2"/>
    {{ if (isPerMachine) { }}
    <Property Id="MSIINSTALLPERUSER" Secure="yes"/>
    {{ } else { }}
    <Property Id="MSIINSTALLPERUSER" Secure="yes" Value="1"/>
    {{ } -}}

    {{ if (isAssisted) { }}
    <!-- Check "Run after finish" checkbox by default -->
    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1"/>
    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Run ${productName}"/>

    <UIRef Id="WixUI_Assisted"/>
    {{ } else if (isRunAfterFinish) { }}
    <!-- https://stackoverflow.com/questions/1871531/launch-after-install-with-no-ui -->
    <InstallExecuteSequence>
      <Custom Action="runAfterFinish" After="InstallFinalize"/>
    </InstallExecuteSequence>
    {{ } -}}

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="${programFilesId}">
        {{ if (menuCategory) { }}
          <Directory Id="COMPANYDIR" Name="${menuCategory}">
        {{ } -}}
              <Directory Id="APPLICATIONFOLDER" Name="${installationDirectoryWixName}"/>
        {{ if (menuCategory) { }}
          </Directory>
        {{ } -}}
      </Directory>

      <!-- Desktop link -->
      {{ if (isCreateDesktopShortcut) { }}
      <Directory Id="DesktopFolder" Name="Desktop"/>
      {{ } -}}

      <!-- Start menu link -->
      {{ if (isCreateStartMenuShortcut) { }}
      <Directory Id="ProgramMenuFolder"/>
      {{ } }}
    </Directory>

    <!-- Files -->
    <Feature Id="ProductFeature" Absent="disallow">
      <ComponentGroupRef Id="ProductComponents"/>
    </Feature>

    {{-dirs}}

    <ComponentGroup Id="ProductComponents" Directory="APPLICATIONFOLDER">
      {{-files}}
    </ComponentGroup>
  </Product>
</Wix>
#!/bin/bash

# Link to the binary
ln -sf '/opt/${productFilename}/${executable}' '/usr/local/bin/${executable}'
#!/bin/bash

# Delete the link to the binary
rm -f '/usr/local/bin/${executable}'
[Desktop Entry]
Name=<%= title %>
Comment=<%= comment %>
Exec=<%= executable %>
Terminal=false
Type=Application
icns ‡wic12  g‰PNG

   IHDR   @   @   ªiqÞ  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  	pIDATxí[ilNY>T)ŠÚªÅ ¤Á¤abé ñ£ÔE©%Á‰Â©d$$„?"Œu2–Š%Z©ˆ]1k˜X¦–6¨­-ªµÕ™ç¹¾ïËíwÎw¿{Û{Û&ú&o¾{Ïò¾ÏóöÞsÏ{Î©õR�úüÈhPCä#á'ú3´´´5´)”R-†>…>„þ-€~�z*^ Èƒ&C‡¶k×®g\\\t÷îÝE—.]DÛ¶mEÓ¦ßù———‹7oÞˆ§OŸŠG�‰'Ož”¾~ý:ý.Bs ç %P×Å‹ $ åœL8p`÷ääd1räH‘�� :uê$6lhIâÛ·o¢°°PÜ¾}[œ9sFäääˆ7n<’RDÇÐÛ–j±²|okÝºué¼yóäùóçåçÏŸ�»zB´E›´MPúª3$¿7oÞ¼xáÂ…òþýûÕclÑ›¶éƒ¾èJßµ*ƒàýòèÑ£å•+W, »[E_ôIßPb¨™�A¬xõêÕ®<êNCÄWƒ¾‰ìg×t2:wîü”SÜ®·'bA 2j*«z÷î-oÞ¼é:™ª$bB Vy„e½zõ’÷îÝ«*VÏú±! ËœÁÉ<`:¾ã»ñÈE0@ñq÷î]qéÒ%ñâÅÑ¦M1xð`�y€ÒÎi"&0è‰«W¯ŠwïÞ‰®]»ŠaÃ†	N¨‚O‚À¼£óˆtÔí	®¯Î}ÿ¨¨¨¢ììlå/ˆ›œ?>?MŒ~@7n,§L™"?~¬ô±[€É�!°K111rÉ’%²´´T1EŒÄŠvý«CØÜ—óÕÜ+V(ÎŠŠŠäðáÃ+�CÛJ÷ýúõ“˜Ú*}ÃÜºuKâ¯]ÉV°í””YVV¦˜"Vb†ús\V]–:Tb¾®8Z´h‘%@¸4ê'Ož,+**”þ¡
>~ü(ñ˜Û²½fÍÅ±3ü/­:íï=ãñ8½ÎÍÍUœ�¢Ÿ¤Õo£F�äõë×¡
øi³²g®‹��—oß¾UL3±£m<4¤Xg&B,ž:uj[DS1píÚ5QRb/Aûúõ«¸x‘‰�=9wŽÉŸ=Áë%8 1;Ê×™ï­‡�-ƒ�¹}àïàÚÎÓ]»â¤-þô¢¸˜“AUˆ�P§Ö~/±
À¬1cÆÄ0�ÕI‡tÅ!Ë:vì².¸ÂI[¦×Xk6aÜ;9àf–¶�Eaòù;ÇŽSÞ-¾µ²}ûö¶ÞÕ&MšÈ;wîø»†ýÅ:€òéV­¯>}úh?‡~'ä@.èeÁW©JêÑ£G…î;ë7ÌßåË—kAƒ�3gŽ¹›­kß(ÖþÆ�-í‘¹ S’ÂÒ¢`å‚,³’ÆÇ�g	rÈ�!òåË—am™ìß¿Ÿ‹–vä¹sçÊ/_¾˜»j¯ÉíWZð­TÅéñ™½{÷j�~øðAfddH¼·• “ /8St"�Íš53laJm¸E‹•lwëÖM®]»Öyú&r‚Úšú·CŽýŸ'¸å³gÏ$§¡Û¶m“‡®ÒøàÁƒ�)uË–-¥âJ³}ûvyüøqÇA%rB ô£%*Ì’Èw†Ùš”#GŽÈèèhã/Í¿xVV–kîÉÅ7$š‰†ºž4bÄ×œÛ1tôèQéÌÃm!'žLZ7ø	ÜÎ³{<æbÆŒâýû÷œ´ˆÝ»w‹ñãÇ»îÏÇI!¦ Æ/nÚx/˜ó‹´´4#ÏÇÀ'vîÜ)&L˜à‰c'…˜. Q0<a6zâÄ	1}út�DÆØ!Ú±c‡@Öhnâêµ�“2Ò€¯Ÿ«Îƒ��<y’‰Š‘L!cÝO‚›¹zïã¤Ó £¦«ÎÍÆNŸ>-RSS�†äñÙ4‚anãÅµ�SY°m] �ŒÙÏÜ‚ZÝŸ={Ö ÏLù�Ø²e‹ñXõq«ÎÇÉ±±œ¾b“ÒÕ/rü@òÄõBx®Ú·2F.ä„`ŽµÐ„ØØØÏXì°²é¨îÂ…é3ÈÈÈHc¶èÈ@5“9Á¿’Û7ÒD$©n!VscuËßšöFÑóçÏ–½Ëâ\Çy qùòectGB$@^lÚ´I ‰	eF[þàÁ�ERc®€] ‘˜˜hœ/Ð6Ö‚·ÜQ•¯©Öeãý´wN3C%Cééé�•]®nÞ¼Ù–M£üü|IþY"�O‘Ódˆ\Ð7[Ë4Dá|¦ü8BþÚI‡	šÙþò!íè*òòòdß¾}Â´¡S»é0¹ ¿~m:é�] O¯^½Òa”Ù]áV¶aŽÏ «áDÈ�\`ËÑFI:äb^7^©À¨(w�œ.‰…³é¯·$Fä%'Etó 6âÒ®­[·
žÙÑ	÷ê]]•RÆI¾Jy¨‚S§N…ªRÊ9@ê–ÅÙ�ØÉ²JNŠ„
 ft'/:á¨îD¸ijWœ´%I¬:iM;9 2SÛ …V(ÂvÖ8…¡}
¸ìDx,Î®8i‹_¡Ë^b'øu¶‰aöíÛ§Œu}kŒ˜‰\¸/P-IÅr’Äc©¡®nŽ+1ƒujµ˜û:s%õï™3g*ùA]ÜÇ£/‰•˜¡¶V�}<-¸¯uoýúõÊSP×H#°r·ÔÖ^œ“ýŠ6gÏž=1'NT¢ÅOQm‘9tèÓë’OŸ>%à?
H
&b½¾Ü¿^¯<µX@LÄŽê_Çâfi­Zµ*ËÌÌ¬Eº•]1dš¨—×°¨ñfÝºuÊÀXš·wðˆ�X@Ö›åd‹(FÝ­iÓ¦I¦­5-ôIßÄ %–Z‘öðú'>ŒU7ŽÇ‡$}pÿ‘>éJµ.)@p#))ÉØÅ(Ž‡ãzÚä¦+}Ð”>ë”DÍBè¿ƒ’6l�>tL4¸mÐmÒ¶Ï}¹"Næv¶@Ã±Ð™8Ñ9Gf[Ž5Ê8:‹³¼Çj÷t‚ó�FŠÍ—Çc¹‡€ßwXÔd.ý4ú^×·ªe^ÀŒ¥'nFøô$)bxÀŠœ?$Î“^L±1�ß¦°×¡g}š‡_OÄë ˜AGâ¦´³ï—•þMHN`xÖ�+·Ï|¿žÿËüÔK}ê#ðƒGà¸"‘ W°:    IEND®B`‚ic07  !‰PNG

   IHDR   €   €   Ã>aË  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  IDATxí�	¬E—ÇYÜPWWDq�Û'Œ»îk4j”¨‘qˆ8š`0L&ãþÉ¨ãàþ©è(nŸã®DE\À7DPTDAE”šÿ¯¦ûÙïÞË½]}»ß»}é“œ×¯»««ÎùŸê¾ÝUçœ2¦ ��������������Õ�M¬èZÒmSqqOñÁþ†Ú®'æ|'1ô»øWñÏâÅ?ˆg‹g‰çûœo:j¦€‘÷÷ï%ÞQŒÑ»‰ë¡Åº˜Î0Mü�x¢x²˜Î‘{ÊsX[èï->\<PÜWÜ]ÜB�:u2m´‘Ùd“MÌf›mf6ÝtSÓ½{wÓµkW³öÚk›.]º¸²¿ýö›ùå—_Ì’%KÌÂ…Í?ü`æÎ�kæÍ›g,X`~ÿ�D+Z¨½OÄãÄ/‰ßÿ"Îå­ o?ñÉâAâ]ÄN‡:˜­¶ÚÊôíÛ×ôë×Ïì¶ÛnfÇw4[n¹¥éÖ­›éÜ¹³ŠÆ§+V˜Å‹›ï¾ûÎL›6Í|üñÇfÒ¤Iæ“O>13gÎ4ÖÚ°2þùLüŒx¬x’¸å¤þohÊKàwû$ñ9âýÅÎšë­·žéß¿¿9üðÃÍ!‡búôéc6Ø`�ÎŽ-Zd¦L™b^{í5óÒK/™‰'šŸæÕÁÑ
ý}K|¿øq1ïÕ�À–ºv„xº˜»Ê®¹æšvÀ€öÖ[oµº3u#¶/!² ²…r2#;:ä‰ oï#Å¼|9P·Øb;lØ0ûþûï·¯Å«´ŽlÈˆ¬¡Ü�#µE§‚j À§Ù?‹gˆˆ½{÷¶7Ýt“�3gNèë²"3²‡z:¡:T�:6Aì@ÛvÛmí¨Q£ì�?þØXÖõ�ÙÑ]B½h[P€ /x7‹—‹­ÞØíUW]eõæucEtB7ttý›¶è¾ZÓÁÒžÁÌ±Çk'OžÜØÖ¬C:tCÇPß@w0XíˆÏÏ/[ÒØ;ï¼Ó®\¹²xóq):¢+:£{€Xäå“\¢ÖG<öþ.v qÄVßÕù°^ŠR¢3º‡8˜4ýOÂöRôM”îØ±£½òÊ+í¯¿þš"¬ùª
ÝÁ ,‚Ž 6`Ô”Äî4±ÝpÃí˜1còe­¥0› #°j*ú‹´aZÕ}M˜0!C8óY5˜D>Á
Ìš‚þIZÌÛ=öØÃN�:5Ÿj©ÁŒÀ*ÀìrMIzgü}÷Ý×~ûí·m c¾› #°na' Ã\Ò’Ú�åkÆÎÎž=;ß–iCéÁ
Ì„†`™+ÚZÒN[ÍÏÛo¾ù¦ákŽ¦ÀìÀ0ÀLS§,ºJJœ#ÁAãÅ_4;ï¼³·àóçÏwÎ8eàì¡·dÓ³gÏÌçû½-¹ O"ÝÁæ§Ÿ~2ú¼sI8¥¬¿þú%%kï~þùçFcÎE¥_/©}eû–øo5oå¬aå4áu;2y2zôh{ÔQGÙ=zX¹t…w€•û–U‡²'žx¢û„\¶l™WÝYf¬Ÿ€C=ÔÊí,ú]ï|zõêeO?ýtûä“OZ¹Ÿy‰†`	¦b°mhºPÒYÝ±öž{îñRô¾ûî³;í´S¨hÍíÞ{ïmŸ~úi¯6Ò.,_A{Ûm·Ù­·Þº¦¼àxà�öÕW_õ,Á4¨Œ’xQY$¶C‡�­ 1íàÁƒCå¼¶k¬±†>|¸ÅmMrµ'Ÿ|²—¼`ã9tÝu×y‰¦Áõ`Üp/…ëH¨	¸ÿþû[Œ‡–.]jO8á„P±ÄÛ‹/¾¸M;�<‡�X`�Är�1"L®˜‚mÐ&XƒyÃÐ¿I«ûÁÄVê’K.	ª{{íµ×Æn·ž‚<mÎ8ãŒºå/øî»ïŽ-Ø‚qp-˜7í.)p‹µ7ÞxcležyæË#œëÒàuÖY§MüyWICÞ°Å-ØéÓ§ÇÆŒƒkÁìÛ•:ªõgÅîå&îÌÞòåËí~ûí*’Ú–/„,}
ôIjwØa‡Ôä7ø¢‹.ŠÝÀ˜ÉàZ°ÇíF§¨e÷R3~üøØJÈŸ>úV*S÷–—+nÄ–Ã·àC=T·ŒàUÊŠV²³fÍŠ-XG\Ð±A»/!“Åö‚.ˆ-<‡Rõ¤Á7Üpƒ—,>…O;í´Td¬¤'?->æA=Ø ]^Ý7?óØ_}õUlÙÿøã�èdG¨DjÛ“N:)¶,>ùbÉâñv†/¼ÐG‡yÄ‡ ñØÀ 	1Ü{Jp£yìØu0DÊPiV¤1t£÷€Ô«ghš Ñ¬hÆŒ^Uƒ9Ø„-°‰7%í '«¥Þo¼±Ñ§œW£z‰q‘¸^y&Â—hß´‰èá,êåŒÄ†‡jnÁˆz‹±‰7%é f¡¥³Ï>ÛMÐø´Ê	aÛYQÀ´‘6!³>[Ó®¶¥>ßèe.dr„M\Ðlx Î6‰F‡¨âþúî6z‰ÓF«2ÌŠ1³—‘ 	˜µä!ê8ÉŒ^­zÃó›o¾yø¯×`‰1°�%é ç©…š±sáØ^­©°>_Œbæ|/‹]ž¼ Y�V/�YTíêÜsÏ=ÕMH<¶1µ�m¼È·êìZ;ÿüó½Š>òÈ#£»©þO®€,ˆÇÿa‡–EÕî'KSÉ‰ëŽØÛdŽî>ýøŠ;áSéÛFY7¬^^Rûô“Ò®.¦“õ2U©ÉTŽ}úé§V©eR—›Ie$I,#¶ˆ|¢zý.û>N¤›*¾Í¬»îºü›ˆ?Ÿèý¡Vc—]v™ËÿS«\Òó»ì²‹9÷Üs“^¾Êë.¿üòº^Œ±6	ˆL*™>i‹˜À7n\âÞ^È|º Mín8p`›Dá„’æ$Ö©§žšÊT66	äÂ_ [¥NgªF»ýöÛ×õø; ÛwÞyÇ2N½õ°E¼fÔ¢2øüÿî»ïZ}zÕ%kTÏÝwßÝ~ÿý÷>"¬²,?Ø&¨[¥Nw©F{Þyç­Rˆ$'^~ùe«O Ppï­2�Ù?ü0IÓ^×(”•s§·|`V‰qió™Ž#,¶	ÚÂV©ÒšªíS±½ÿþûãÈâUæ£�>JäaÃ¸[¸œ¿÷Þ{Î!ýKY¿¿eÇJËD÷ñí;çœs¬†•½0ŠSÛma+l–á×ýËZk­•Y(7>÷Þ{¯›(ŠDË†
µl™å÷þñÇÏtî?/¼‘¥kÌÁ%´¸ýöÛ]HWÄq³¬,+G}´}þùçÃªSßrŽ�°•›Õ$âÐi*ôþýÄ¨‘8×$*CVNÚÐû�ËÇÇ$Œ€u™>wÝuW£O&—’cY“žLæ¸ãŽ3L0•	)õBØ2Æ‡²„9¹ãç2Ž2$-÷v—´¹“ÄG”¶[mP¢}Ñéâÿ©VÞçÜ¨°Íjª5õ[!…
•4­ÛêŽæë%íßïDvU`#l%Æf5)î8@_jRäjÍ
›¡ÀgŸ}fä­l*MÑr?õÔSFoÜ©jÄFÎfµ„ŒÓ˜aÚ–Š²~„Õ¶-ÎŽ…ñ¿üòË²æ˜ÃÀøYÎ	”5êy b#l†íªRœÐ]5lÆXx¯^½ªV–÷“üvüñ.9t©.$žVh—Ñpsé©†ÚÇFØJ´™ÛU¥8 �ƒn¤XO:eYU‚9IFpîü/¾ø¢L"÷?rw••i”Ø[‰º‰�·H5Ùâv€.Ì‡g�‰»š Yžãq�ñyü—ÒvÛmçŒÏ<@(b§.’7•°Š“s?p<È±e”C«{ìóâWJ<N¹óùäËa#l�³]¸Siç	°’›?KW®JÂe}ìë¯¿vw¾¦yËšRÄ¯yâ‰'Ü7|ÙÉ>€�°U@ÎváN¥mœà~P‚ß•Juäòƒ;¼ð±H)‘Øã'õÒ)­¯­÷#¶r¶«Ö~œà†ýXc§YH‰˜Ü�ÏH_)‘Íãk²¦ôTnö#¶ª9d§8Û,<mÛQ…`ÅÍ –5�£
ÆßgŸ}ÊÎåé@ÄV5Ý£ãt †£‹$å	‹V²² ”†JÝ˜}«ÚaÌ^Ln¢ÒsyÛ×˜p(rË?á�Òmœ°‚‹XE+Ï¤U<Œ2z¸EžJõàÛyìØ±FË¥§r¹±UM£Åé L-ÅÆå„–×�3>3Œ¥DÁc�=æfKÏåu?b+g»jzÄé ‹©€�«È£¥Z�uŽx¾SN9Å¼õÖ[er± $ÆW¼}Ù¹¼ÀFØ* g»p§Ò6NXÈ…äë“ÓF¥:ö+bü7ß|³LFV}ôÑGÍÁ\v.Ï°¶
ÈÙ.Ü©´�ÓèBK¥‘žU©®†:†#‰<nÍo¼Q&ËÇb|›l6ÂFAàÛU¥8`¾jXF¥¬£›BN%sp«{–ÊKˆ×#�<bäVVzª)öÑ=è Ë¤¶«Jq;ÀÜ�ø†ntR¶Q£¬œF~òe¢2QòðÃgâUÖ`;ÀFØJÄÝšJøY}G�rƒbÓ°Äº¾ÿ•W^)“‘	­Ìárï–�l¢a3lW•â<ø-™F-•&MªÖÞ†'yì)Ÿ[Ð¹´YÂº•à)Œ¢-=ÝTûa3lW•ât *pã¦nì¼f•UÛËä$igÎ<óLóÂ/”ÕÏÌØƒ>hŽ9æ˜²sMw@¶‰Ìo”�uWP8nªŽÉ\‹ËÔ‚…\
ô
u¥rÈ×-œÔ*g�u–yöYRæµ&fÅxà3hÐ Ö'2Øk·pl¸„£¡³YZªâ_6�À‡×_Ý¹§ýÇ70„ÔëúÎ·šÒå™TÆb<’5‘=ŒŒá¬õÓÞ�!Ø&�až0Áf©QÕ4Nl¯¹æšÔ1Õc+Qh˜<vÊ�Œ_#|©ËYZ!+}EÖ÷©(òDe†m‚¶Æi‹ÍR¥«U›UŽRêÚ¯78™¢L}ç×%Sœ‹5y]º•QyVõÁ¡Ø&h[¥NQ�+Y;­Õ¿Ò
—\NqŒßR>÷Üsî)¶›t›fx86Á6ØHŒ­R§®ª‘� Ë
õRÚ	"äg}Ó­&ÑaæÌ™«_N+A6	ÚÆFØ*Åý¤2¦˜ÜwŽõ’Òž›Jž¸Ië%;¨ÒÐ&½<öu#GŽqŠ}Mµ‚ÌImT/El‚�Z¦ë­·ôú�:°’E|ò—ÞiE’¨ÖOŠz“Dal‚mÄØ(6ù<¨”IõÏxÁƒ&)Ñã™­K›ˆêÑ*[iWÛRw+)cÓ&¥ž1JB‘¸Zl�MD7”;>T©Ù·0Ë0†úô{›ŒJ#vUdô:¥µ¼ÊÇ-ÌOŒ¾Xâ÷*ÇOW¥ù‹8•Ð!±E@ØÆÍ…jm}; õ=$^¬…*½Öj‡…ÈhU­âÞç+ùù{WRáf#-JÔw¨’—rœ¹™°…/lãEI:ÀµàÞµX¢wjvU€™áqŠL­fƒÇljuF+ÂoÑ—x*aƒ€°	¶ñ¢$€þKü¿·ZÑ«AwŒ÷gE?‹¯dÎb‚‡$�ìƒwòãcoJÚxcù@køÑpòE"W¼®u@Zf¶V1ïóÈœE½¡ ‘x¾ðPÕm	öÿPáDo‘I; Â]+^Žç�–€c?17ONV´Í6Û„	Rm‚…p!ÏŠ”ìÒ«j0¼žðÔÅ‰¨ž0I-ŽÑ7¾ap$â‹^U²Wôë×¯j™zN’�+"ì:ËxA×t°s°ñæ�-Ú…vP«¸{­…[,×z ÈwÙ8Öó {lÐ®t¥Zw9õyW:èWqŸ¹ÿbáÈ?;�ÏÂ‘`É¯öíNä�çÄÊí*vÞûbéØÿï >KÇêKÁaÖæÉsö«‚4‰éGF ì¨Q£*Þõ•‹Gû-¶``�É”¯êNLÿ®+Ý¤óüqw*%g
•J¼]–�Ó`ÂœÀºáˆ"ÄaYåôuþzq:�B™ìàÁƒŸ†žÊ‚qd�–ÁŸAáæ‰ä&á5/rq	ßG0Û ã†M×Ò[ÎAPÀÑB‹qutÎ¬ù(Ys‹K«w´'itÐ9„*¡TMyC½Xù[#x±ÅÃHG[0nh:^Ò14i¯¸âŠØŠRPsvôèÑVË Yeì°xùP¬Q8ç‰Ãñ¸}-[¶Ì«î,Ï�;×jLÞjå/«Á"MwÏÝŽóª"–,žÌ>72ƒa€˜‚mªÔ!ÕÚþ¬ìrý{»7ß|³¹ôÒKÿ<ó?üHéBÄ�<iÝb“¬”ÙèÉ*ÕÜÚÈL‘«‡HdäfÔ—ôÒg†^v…þ¹1ÜÉÃ–i*wßu×]YÞ€MY7˜Ež€-S~y0|(#™ª ðøf5�‚â! V`v†`™KbQÛ±b§¿ïUG Œ"Æ;0Ì51Zõ˜Ø½]ýõÕX�Ï‚MäÌf¤¯ÞÈw+Žkî±6tèÐ6Yä1/}I�¥LB|¬ö[_ò%¢Nºê&±ST»VÙ,òb£Ìä°q	0«¦¥‘føV[~ä›¸�^1ºG¿ÀlV:JZÎ»Õ¸¯¾új+÷æF·Wjò¡+:Ë`²Z>Pÿ+v (_Ÿ}ûí·S¹Q+BGtõ0ðóÓEÍB|ß2Â…O»‹¸eè“¡Õf#tB7r k 3ºçö_²§F$ç'ìÆ�Ã*ØwÜq‡eº8ï„èYÙÑ5¿Hø,ˆ7ßÄ_‹]GÐŠn1�™ÑC‡PŸ@7tlê·|éWm®«¯Ï;ðH¤pË-·ØÙ³g7ü‘™Cù]Ð	Ý
Š‰À*÷Ÿâ–ŽÀñ�!C¬òÿZK…�™�%sÈÈŽèRPBxC)ž.vÀ’hi¯½ö²#FŒ°ãÇ�·xµ5Ñ&m#²Ù¹BÃ#+27üÛ}	™Ú@‚Ÿ%&Ç»'ÇW€e]8à sÐA¹à{Œ¬�§¢õ~	¬1Èñ2¼Q†0·Ä¬:^XùRýƒKÜƒbB¥‰žòÔ¢`âõ×€	3jñ¶`Ý<BÏXà¹OŸ>n­_Ö dYÖ �øDÊkìº O‚?IöHâI2n­Ëêb$�˜2eŠ×ï{i`+Y&‰Ï€§ŠsEyí Q�yÌ ÆMº¿x{qK‡Ðÿ-DxAžpçÎ�[u ¢sI¶ ËÝ¬åš’0ø—â‰â×ÅÄ3Ä¹¥fè Qð;i§§xg1‹ýÂt�âîâ®âµÄÅ•ˆ,SÄ7,ò6GŒ�I½.ž%þ]ÜÔl`UFYS'x*ÀtÞ8F‡�0èr1¿ãŸ;æXAM�ÀÿÌq¾ý†EçÜ    IEND®B`‚ic13  ?ô‰PNG

   IHDR         \r¨f  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  4ýIDATxí}¸ÕÕö¶Ñ¤
(R¤((A)êg	Æ J"1¢þØ5±ƒ»Æ[ÔÄ(*’cƒÔˆ4A)”‚R¤Ptï;9g¾™¹sî=sÎì)ç®õ<ëÞ™93{¯ýîµöìÙe-¥„A@A@A@A@A@A@A@A@A@A@A@A@A@A@A ¡ì•P¹D,ó°î÷ÎdóþkóYJIC@€¤ÕHaòÔÀcµÁÁ:þ7Àq�×Âÿêàjà*`¿³`#ð-xø?àmà-Þ€ÿëÀëÿ·âx'X(ÅH�®Ê«q›‚[‚ÛƒÛ€›ƒƒiì4r¸IbÁÆ��Âð
ðàOÁKÁ«Á›ÀB)@@€äVRMˆFãîî>
Ü
Ì7¼i#Gö–€?ÏÏ³‘ØJÒ $§BØ=o>ÜÜÜÌëi&~N¬Ï¿ž	^æu¡˜� Þ
h‚ì{€O ÷³K_\0í·ß~ªN�:ªvíÚªV­Zª^½zÖÿš5kªªU«ªêÕ««5j¨}öÙGí»ï¾V>{öìQßÿ½Ú¹s§úÏþ£vïÞ­¶oß®¶mÛ¦6mÚdýßºu«Ú²e‹úî»ï
–-óànüç'Ã{à·À3À_‚…b@@€èA?Yž>Lãg—>U«VM5lØPµlÙRzè¡ªU«Vê�CQMš4±®×¯_ß2z:„bˆÏ†��ÁÆ�ÕúõëÕ—_~©V­Z¥–,Y¢–-[¦–.]j]ßµ‹_ �‰ŸlÞ O/E„€4 Ñ ÝÙ÷ Î‹øÆnÞ¼¹êØ±£êÔ©“õ¿uëÖêàƒ¶Þî{íoj­­^ÂÚµkÕâÅ‹Õ‚Ôüùó­ÿ+V¬°zyô¿7}ƒÓÀ/�ß2ˆ@¼Úc°`	Hš]yvë‡�ƒ9R_!±«Þ¶m[uôÑG«^½z©#�<Òj x=MÄO6 óæÍSÓ¦MS3gÎT‹-²>-ò,g&‚_ ós�ŸB!# @È€"9ÜñM6¸¸BŒùF§±÷ë×OõèÑÃêÚg¿Ïñ|IÇø©0cÆ5eÊ«Q`�!â¥¹àçÀìp@Q($*TÎ�ò©ÉÐØÏŸ>\.qÄjàÀ�jðàÁª[·nÖ ]¹”Ø�Tœ={¶š8q¢zóÍ7ÕÂ…ó)á×¸i<øi0!A vúB‚Á;À|[ådtíõe—]¦ñÔ;vìÀç³ Ä„Ø£ò0ÌüF¬‰y_°� 9{#Ç“ÀüFÝÎ©´‘×gŸ}¶~å•W4¦ÑÄâ+@€+bFìÊÃ6ƒ=ë€uÁ:Œ#À9û� çTPŒØë{î¹Gcš¬•—Ÿs!@ìˆ!±,ëL]°NX7B‚€º#UBå|ãcÎ]ã»^¿ôÒKÒÅÏeÕ\ç'1%¶Äu�‹Y7¬#Ö•� 
­‘Ê#àœßøXq§Ï9çýÞ{ï ÞòHˆ1±&æ¨“\Ìºb�±î„�‚¨…§®säÙWÑ¨„çŸ¾þè£�‚è°ÜÄœØWÐ°îX‡¬K!A o¸j�;Ù|kêõ¹çž+†‚!›Öë$W}eê’u*$”‹@Süúø[p…Ú{ï½õé§Ÿ®ßÿýbõVžÖ	ë†uäWw™:eÝ²Ž…�2Ç•¥`_êÙ³§~ã�7BV[I.lXG¬«\õ˜©cÖµ� `!ÐŸû*vØéûï¿_cG\Øº*éB€uÅ:cÝåª×L�³î…*1ÿƒ²/—Qì—·¾-±åÕ�šJ²¦`Ýq|€uéWÇ™º§U2¸µî.°ï·>¶ÞêW_}Õ´~Jú!Àºd�¢¾ý˜:@]H×vK,TðØ;à2ÊÀE&—_~¹Þ°aCDª)ÙD… ë”u[ÎB"êuC¨„8e[.cümÚ´Ñ¯½öZTú(ùÄ„ ë˜uí§Ý Ž•û¢<£Á¾]þŸýìgn®bRIÉ6jX×¬sèƒSG¨+Ô¡@ >Ê@¯2e*û€Ð�?þxÔú'ù%Ö=uÀO72:CÝJ1\þ¸L%ÃÕ–ž>}zBTQÄˆê uÁOG2ºCJ!½ óbp™Ê6l˜þúë¯ãÒ9É7aP¨~º’Ñ!ê’PŠ8²n »*•#À·Ür‹†«ë„© ˆ7Ô	êFŽYêuJ(ü2–ÙºËo½çŸ>n=“üŽ u$Ç¸ uŠº%”`.‚leFú<C¿ûî»	W=/)PW¨3Ð%/S·¨cB	Dà*Èô=ØUi]»vÕŸ~úiRtKäH	ÔêŽWŸ2:F]J×B–2>úú÷ï¯×¬Y“•1“† u‡:Ýò2u�:'” èñÅ[AúÔSOÕß|óMÒtJäIÔ!ê’ŸŽáuO(F®@ÞeÞüg�u–F0Ë”©šˆ›T¨KÔ)èš—©{ÔA¡¸ yÒ¬«Rè0R‚n$Õ”Ò+uŠºåÕ·ŒR…"D`(òÚvUÈðáÃ5âÛ§WËDòD#@Ý¢Žyõ.£‹ÔI¡8yl»*bÈ�!i­@"\ú ŽQ×¼ú—ÑIê¦�A:#íµ`W4HÂn¥ß¶RS†/£Îyõ0£›ÔÑÔPš¢ÓÛ›àÃ�èöîÝ[½üòËªAƒÎËr,E FÔgœ¡¨Ä›ÏÇ¸0ü¥÷‡$ž§¥ »¦—Àœ vèÐÁ
/Ý¬Y3çe9"A`åÊ•Vx÷O>ùÄ›ß¿pax»÷‡¤�§¡ Œót¡¼Æ�«	&(låt^6z¼iÓ&µhÑ"µ`Áµxñbµzõj…)"õí·ß*8žT5jÔPx jÙ²¥jß¾½:âˆ#”4N…W	FÞÕçŸnã½bÅ
…î·Úµk—Úk¯½,¼AXµhÑBµk×NÁïŸÂ^µï¾ûžiÀ'çÍ›§N:é$…ECÞ'Ã…_�ù© T¿Æ³®ï­ý÷ß_Oœ81’oF½7nœµ]ŠVž‡Y—Œ”™›Júöí«o¿ývýÙgŸE"oÚ3áH;v=jÔ(�FTW©R¥®^}Èž3LX·nÝô5×\£?øàƒÈ  .R'³r8þSw…Š@€û°·�mpÑòëÇ{Ìxå®]»ÖÚZŽÿ8[&§|¹ŽëÔ©cM!‰ÿªãÀ=ôäXkÖAµjÕ¬�º×_]ÿý÷þ™†x•:IÝôÔ?uW|	 „B¨1úìõÒK/±ÚÊ&Å <ð€nÞ¼¹+_¯…žS1GŒ¡ñ)Q6óJzå…^(ÏmwQõ@£<xp$ÞŸ¨›>zA¦.@€qôs:`À £zæÌ™£ûôéãÊÓ+CXçt�õÆûá‡*©Ùk½lÙ2=tèÐHðfýúë¯7ºJ”/ê¨�ŽP—£˜@fi§KQ �LÓ&£ôŒ;Vc@É•§Wç#GŽÔ›7o®t�À”)St«V­"Ç›º|ùrcxSG©«>ºB�Ê�®¸g3Ø‘Ýf“�9o»í6�‘c;?gÞQW¶mËTå˜HØúåqøá‡íN]¥Îzò¦NS·…ÊA€óý\YáoÌ˜1ÆZìÑ£G»òòæÕ9#ÚVßÏ<óŒ®^½zì˜sŒçÃ?4¦WÔYÝ¡nSÇ…r ð;\wwÂ	'hÌû©(F�õæçùñÇ_ÒŸŒÑ—ãÏÖ1gx–.]jD·¨³ÔÝl^ŽÿÔq!zâ/Ú q}áÂ…F*ˆs·IRÆl¹Ï;ï¼H¦­Œ€ZN¢X-§5jd×m¶¼qÿï×¯Ÿ1ßÔ]£Ôqêº��8žv)È£�>ZŽJþV”i.êñæ—”ó§žzªðÂ%ðIŽŽG5»RH^uÕUÆP£ûÈD]§Îeøþ»€:ýôÓõž={B¯N»åpìàÊß+O”ç|SrŠ¬Tˆ+!£Ä/h^\m8yòd#pS‡©Ë>2Qç…€Àaà`¤†j¬7R!“&MŠuÄßYÎòŽù)P
ÄzôéÛu]QþÖ«W/ccMÄ€:í)užº_©‰}Æƒ]àp%ž	bô~óyóKâ9Ç'fÍše†HÓäšþ$âë'“ÉÀ1ÔiŸ<©ûiØ�1ÍÃ-¹üú{ì±ÆÜz½õÖ[�6ó@6¿J‹ì—§™øæ‹s¾?hýõèÑCïÞ½ÛäÜäDÝöÈDÝ¯´!ÇöGáç:©Zµª~ç�wŒT ÍáÙÕ[)‰9¯[·®±i*c ;¾é¦›ƒ¥SÏrcK·~ûí·%÷�ºM÷äO -T:úJìã‚.qGj«V­ÒðäÊÏ›Ï|ðAG)ÒsÈ7^çÎ�S‡÷…^hdê¸�žÑ*ˆÒ.Û`ÀÁ‡†‡cà?ýôÓv^Î|“~Ì�liÜ0Äñ‹‘v]\d2¦uœºîÑ»å8§MDN{Gžã3¤õæÎ¼/»ì2uÈ!‡8/…z<uêÔPÓ‹*1ìPTˆ_Uv¡å3mÚ4…A×ÐÒ‹*!L¿ZˆLåG§®{ˆ¶@›ˆœâh håÿßYRºs:ÿüó�—B=¦"ÎŸ??Ô4£Jlýúõ
Þ„¢Ê.´|fÌàZ—ôæí¼	œºN�÷mÂÜÐ“Yö4Žà×Èü ¬ üå•W*Œ;/…z¼nÝ:Ë_¨‰F”¾‰,?„eJ6ô‘Hß‰i¥�?¦c_sD]§Î{ˆ6AÛˆ”¢n ØÕù…³„]ºtQÃ†s^
ýø«¯¾Rtè™VÂ†•T‰ÿ
.ÕR%³SX:{5MÔyê¾‡h®OcÏï¡ŸFÝ ð;ÇåÀŸ-!½éš$DxUìÚ¥•ØƒIÑS2Öÿ§Id—¬üìÂÀ«ëZØ'ÔyŸ^ m#Ò±€( vqF8�„W…uÒÎKFŽÎÉHºQ%ºuëÖ¨²
%L¦ºÁ¥¾D1€IÝ§xˆ6âúDöüêi” ÖÔ)ý%—\¢°äÕyÉÈ1¼ÂI7ªDÓÖ{áÛ“ci%Ê…üÔ}Ú€‡h#®¥ç÷PO£j jBê‘NÉ4#Š·?ó„{&gÖ©;6ý‰6 ˜ÿW{ï•j…-½R”?ªà"´Ú‚‡h+´ãU-�‚’tp–æ—¿ü¥‚§Vç%cÇue$™´vÓ¥Jôš5k*l±M•ÌNa‰wT m€¶à!Ú
mÆ8EÑ ì‹R¸&ù›4ib|äß‰ÃuEñ©áÌ3Ìcâ•&bƒË�]i%¸l�TtÎøÔ1m†¶c”¢h ~„ë,ÅOúS+†žóšÉc8ØPQWj˜å9ì°tmGˆ.£«:ÃÄÖ/­Ö­[û]6v�/(Ú„‡h3´£EpJ°_¶üž=÷Üs³§‘ü¯]»¶ŠºRÃ*Ç/|V�…•¼‘tø¹…�@FÒŽ"Ñ£Ž:*Šl\yÐ&<c=´ÚŽQ2Ý p^Óµß>ðý=Œ’
yôÑGÍÃTâž¡Èi#xØI›È–¼Ø‚­~ô#ã/Þ2Øp �¶á!ÚmÈ™n Br×Ôß/~ñ‹XäÙÀN˜µ…èÂ©¿€s7XaBIZì¹ÄÒ�/)Ú†‡h;´!cdºê”œo2ø¾w^Šì˜­z‡®‰ˆÈò.4#*Å©§žZèã±>ÇA-6^i£ÿøÇ±MaÒ6|z{.
O“@KÛÛ)ðgœatÓ�3/ï1¿¥Mï9ðæYìyÇŽUïÞ.‹M2ÒçÓ†7{,Q­Mñ«ÎžÐF<D -!“ _]u³Rs^•­kœ{©šà¶QÏÀPœðÎ{Ð A©„Ë8Õ´){ÝñmÄ³�6”ºn WÝLs=¨Å]»v5ævË6ó¦ë®»Î–)+[ÿcä¿$Â„1`ñõÊDÿ‹ð»�·™º‘!Åh+ùhKFV²™êp"Õ5”zòÉ'+8DÄåxé¢‹.R-Z´ˆWˆ<r¿á†bû\ÊC¼¼oáüv\ã>y‰áPµmÛ6È#Fî¥�ÐV<D[Švq‚G€ §¿Æv+FßpÓ§O7ÕhNwìØ±¶lN9“r|Úi§‰Š¨� 7\tk‹9¦àô†B*mñÉÐV|ü)Ò¦RC¯BR»Âáø ÝÿlÕ`w fä§ŒI9†Ï¸T»Ïbœý¿eË=dÈ��Dâ�µøF]ÑgqòŸŸ´�NÒ¦RACJz±´`2øb`�÷ÂIˆîÙ³§-£SÞ¸Žèõ×_wŠ™êcz×Å¨v¢0öÖmRÝ®Óf<²Ò¦h[‰'ŽXÚÂc[¨f<¾$Ò_|¡ÛµmgËê”;êcv‘ü�I„© ™àTCÿä'?I¶¹ê’F–T—ë´ÚŽGöTÌüÞ)4Ü=šÍîíÛ·÷é9£Ó>üðÃZâ›?éÆùå—'zœ~ýBØÓ¶MÜÀ0l!é´dÉ�7¶ÌNùMcñ‡~öÙg“QÞòíØ±Ccä?,ó©+ö´n½õÖ¼Ëç�>�(mËÞX‡ãÄw­lÛ
�–7Ç°ðÆ–ÛYSÇØu¦ÿýïÇ©c¡æÍp`gŸ}v¤©,òÑãÇ�µÌ&£íxÊGÛJôÎ°3�³k;wî\“…žö¸qã4æƒ½À‡zŽÕ}š]Ð$M=$¼ kF3vÖ>Çœî2ý	Æ ŸX–¬/^\l1#}ž¶CòàHK,ÝÉl�±ßhœ5Sµ·Ðúæ›oÖ|c8ËSì1#Ãžyæ™šqóJ‰øæ?çœscÅA®ûï¿_sªðÑG5ÒwÜqzâÄ‰©„›c)´!�ÞÑÆI\Uøo°-0•=Í„ úî»ïÖÝ»w÷[˜a—ÓYf¿cl/µ>/’´*¬zÙ½{·†3‹¼±ÈâCã¿çž{\bpàëÉ'ŸÔýúõÓì%eïú›zôÐ¡Cõ„	4Ü{»òHÛ	mÈS~Ú˜©¼Hºpj„G]óÿwÞygÚðö•¡®4bÝi–‡óÚì²Ö«WÏwubj.æá›‡Ýüüã�=|ÓMûE?Zz´Âs?ÖòhÁ‚ÖÌÈðáÃõ‘Gi…vg
:æb6pù¦�9æÍÐÞÏ=÷œÑ(ÓåÉlâ7êœ§Ì´1ÚZ(æº€ylµNÜËŽ¹L?/'¡g"éVø~·ÝW+ˆ¾3­�{t†Ém¥ióäOÆ*øÕ¯~¥žxâ‰ �ªÛo¿]]}õÕy?‡†ÆÂš{vŒçhD,G)hˆ-¼‰;ë ÔhòäÉêÄOtÆ)`È¢>àiI+ë(d·V|C®X±ÂD£(iÆŒ »Õ|Û:ë;ßã´LÁÅ±�=mˆ¶äÁ—¶
…ù-áòyè¡‡*zã*-e‰ñí{ì±ÀûÝï~§®½öÚÀÏUæhC´%¹lÍó[ Ó° ¦ãò·uøá‡§:8D +ÉÍYãÿÃþ¸Ä7Ýt“‚/†ÀÏUö`…¶ä!ÚZ(¶J"¦¸™SH”9Oå8å0Þ£Ù>ôÐC�Krýõ×«o¼1ðsòÀð±%Úm®h
«`_ßå6mÁ,ŠF²„À©úÍo~£0g¸”4þ[n¹%ðsòÀÿ!àcK´µP¾¯Ãj èHÍôGŸfiðºóËQ.øæçˆý½÷Þ›ë–œ×ù½/ÆŸž¼ -Ñ¦D[ÅyaX@K‡pŠS3œŠ­ËN±åØƒ ßüün¿ë®»<¿T|Êý„ŠG€¶D›ò�Ëæ<¿å}VÐÂ™#çÁ}vÞ"Ç)@€Ý÷;î¸#°¤W\q…õ×‚� m‰6å¡žó‚NÃj \ÝFVIs4Þ‚�,±‡F�­n»í¶À¥ÂêG«Ç ÆºœÐ–|¢¹l.çÃüVÐØ™�tÿ�h¤ïxÌ˜1
›¡~É%—XÆÏUzBá"àcS.›+4·0jª
2wƒÇZøBå‘çbF€ƒvœ³Jt·ŽÍ=%¹7(&î÷±)Úm¯(
£¨	ì@”¦AƒE	%Çƒ »ü…Ì×sOÀïÿ{ïHu<…(Ñ\}lŠ6GÛ+ŠÂh jB‚ÚN)|„uþ,Ç	D€t8è”Pã�ã
\Àû}lŠ6GÛ+ŠÂh (ˆ«%âÎ,¡ô Ài>N÷qÚ/a+°‚[m1þ  x¯�MÑæ\/ÞB’£`+d‹pô·V­PV)Ry& ünçBŸ ÆÏXöðY§àÒ+`Žr{!Ð¦<3+´¹Dô („­\±„h+…”Qž‰�ûî»Oýö·¿lüð ¤yäÙìa}Ñ¦<«is‰h j8q¨V­ZªCZ;ËRÊÇ\×�ÀŠK}ƒ|ÿY[�“è5ˆÜi¿—aâi[rÙžç·¼NÃø¨îÌ‰Š!ÊáD$yÇünçÎ>nïBpùmy ’ú‚Z8÷æ°+—í’Sè ¿	¹‡Y(™ð»�«õ‚?|óYÆïóJfAKL*Ú”ÏxK" ûûŸ˜ó;¥}³•‚>Ñ‹Ï¥—^ØøéGÁ[¯,ïŽQ	hSž1 Jã²½BÄ£àJƒ#•žÑÊBä’gBFà�ü£ºøâ‹�y!„§ã˜¡{sØ•Ëö
Éºè�©Ë+•µà…T…¹gžzê)Å¥ºpæ(ø¤WúÓŸ\�zNnÚ”Ï‹Õe{…äFàIâ|rÐ9åB—gòCàé§Ÿ¶Üw#¶A~dîBüõç?ÿYŒ?jænÎaW.Û+$÷0 ×<:µTˆàòLÅ<óÌ3ŠKuƒÿ©§žªØpÈ›¿bŒ£ºƒ6åóbuÙ^!²„Ñ ¸ú•]:Â\ˆàòLùŒ;Ö2~ÑB§œrŠB¸rU»vÑ«Lƒd+÷V€@»rÙ^IøþF°Ë™2ß6A¿5�ÏËqñ¼ðÂjÔ¨Q
A;%vòÉ'+6bü�`‹äfÚ”OOÎe{…FàÒ2
ô­SˆàòŒ?/¾ø¢â&� Æ?hÐ ËøëÔ©ãŸ°\�Ú”Oà²½B£ØéÌ˜ŠTùœÏËqáüíoSç�wžÚ¹ÓU%&ÈØsª©êÖu¹u¨ð9¹!:rØU°Šö7Œ`Òµ'—9Ï¼}ûvŸ¬ä’Iþþ÷¿«‘#G*.B'œp‚â'C©3‚Iï¥MyÖpÐæ‚U¶OÁÂh híöHG*¥ðAÚà%„ WÜ¡÷~ýúYÆï³×Ü ´’t!°n=³ ´¹¢ß´a4 [ ˆÝ °pß|óÿ	E€Àk¯½¦~þóŸ«mÛ¶Êí¸ãŽ³ŒßÇÓL täæhð±)Úm¯(
£`7Ä¥}Œã.d�7ÞxC�1BmÝº5PfÇ{¬7nœ:ðÀ='7Ç‡€�MÑæñ	À‘ÈÍNh6lØà<•cLœ8Qqoþ–-Á^½zõRãÇ�—ÐíêÄd’>6E›KÄ, »"�…_½zµóTŽCFàÍ7ßTÜ›¿y³«Ý­0—=zˆñWˆR2oð±)ÚœëÓ»ÉÃø`¾k�™¯]ë:uþ$ÇE"0iÒ$Å½ù›6m
”R·nÝ§	7%žD ¼åæâð±©PŒ,¬àKgW­Z%‹�œ€„t<yòd5lØ°Àƒ¬4þ—^zI5iÒ$$I$™(à" Ú”‡\6çù-ïÓ°€åÎ¿þúëÀo(çór\�©S§ª¡C‡ª�]_[eoô\éÒ¥‹õæ÷‰,ã¹SN“Š {{´)-÷œtV°Ä™{��·Èq ÞyçE¯<>Aå¦Ò¹sgëÍïX²ÜçäÇd!�ã…ê²¹B%«`wÄ‘äšå+V*“<ç@àÝwßµŒßgÈqWÙÃ£Ž:Êzó·hÑ¢ì�r%UÐ–<û hk‰úX�\s‹-JÈIvÚ´i–ñûtÿÊ·S§NŠKƒ[¶lYî}òc:ð±%Úm®h
«ÀÉh×ÜßgŸ}V´p•9�÷ß_�uÖYê«¯¾
ÃGa½ù=ôÐ@ÏÉÍÉEÀÇ–hkÁ€ä(^X =“¸,þã�?ön^È!‚\ö"0sæLEgœkÖkä;tè`}ó·iÓÆ›¤œ§n ¢-yˆ¶V´7 ¦VÀ´æòO––,Y¢Ö­[—=•ÿy"0{ölEgœ…ÿË/¿¬;ì°<s’ÛÒ€ mˆ¶ä!—­y~tf°9Ûáe¹yañâÅ�„©ì7Ï™3Ç2~ŸU_åBC£ç"1þraJå�´!ÏF Úm-Ú7”Tþ›­�Û ­Øàtbøá‡ª>}ú„˜E2’¢ÃŽÊsZŽkñé®‰�¿�[k6lxýÜ¹sÕ�!CÔÊ•+²uëÖÖ€_ûöí=—¦›¹†Xs.æ9ÝdW¯^]Õ«WÏÂ›¸—b@Ú�ÇÉ.m,´7k˜ G«ØW± *»³¥@4pVÄÛo¿­fÌ˜¡8(ÃÁ9nÁõ8i°<éR)9ßµkWÅm·ÇsŒ¥¤¹°˜7ožõæ:uÊo}Žö~øá¹’Níõ…*N�r&„ßÀ_~ù¥…7�ßIltéÃ�ƒžGy¤âNGr©,|ò±!ÚX°‘a'`†�Aúì¢XŒ·’ÆÛ~ÒIèŠë»ï¾[wïÞ]#.›]®lùòý�…8úüóÏ×Ó§O/Äüùóu«V­§�FóÙR"¼Ý5B�i8*Ñ0ìÀ˜dë=0�U“zÂ„	�wj!¢íÐ†²åÊü§�%–Î†d¶Àè¢i´Þ©« t5õÍ7ß¬›6mj—ÅY®B�áUc€OÏš5ËÂ„Øà-8�æÍ›k|2¤×\Ã�™~ôÑGý”=06ÞºéÛ·¯ÆÖé\Y'ú:õƒ6ä)m,±ÄQ:)°…Fh©DƒìŽ2tÛ¶mmù�e	ë˜o·.¸  …ÇÊ>ýÁxÅNí9–9ëž={Åc;(5ÔR…mÇ£s´­DöT…€9…†ÓŠT€Ž‘V«›î”=iÇü”ÀLA*ð¬HH|Ëë1cÆø½á¼JÚ9{tp†R‘h‰ù�¶ãÑAÚm,Ñô0¤³ÇÔ”†CÃÄ€ê'æYuïÞ½m™�ò'å[y5ù‰ŸºkØ,¦±Ê1¼b[ßzë­‰ÇŒ6CÛñèm+ñôSHhNÀß{ï½ÄŽÑæ‚ºâÎ2š>†�¥Á‰Å0ˆ`_0`€­¦±Ë•þå—_®1ƒDôHï¥ÍÐv<òÓ¶OÍ !ç*máo¼ñÆHÁË7³/¾øB·kÛÎ–Ó)sRŽKÉøù™…8‰Áûª«®Ò˜cÏW]"½�6ãÑAÚm+ñ´$|l ¾è4¶3F
`E™QM>91(äø ƒJtï©"Œ�¿s:ŽSs…à`ò™|Ð)f"Ži+´O¹iS´­TÐo ¥] Na!M"À¥ˆ´ªBË–Ï)kRŽá²[O™2%1˜+×S$[§ûï¿¿æLD’ˆ¶B›qÊ‰cÚTj¨#$Ý	¶qç�w&cDÀµårÊ˜”c*%üÿ%¯bÁj6]«V­ÄbŽ-ÔK�‹-fhÏÓV<ºH[¢M¥†ö�¤ÓÀvAà�>«²°„Ws.Ý)[ÒŽ¹ê0MÓUåi>§ûŽ;î¸DãÍú¿úê«Ë+Fd¿ñS‰¶âÑIÚm*Ut¤µ’”Ï€ë®»Î–É)_ÒŽÛµk§¹46íôÌ3Ï¤oDFÖØã;Ü9ºÿ´%#æv`¯€ÿÀ®\²ˆ›8^yå•ìi,ÿ¹¡kÍcÉ;h¦Üpôì³Ï},Q÷3¤õ}÷Ý—(™r	Ã]†=ôP®Ÿ#»Nñlx¢Ñ–RGl\ÞÛo ìZ‹uQÐí·ßnËâ”+©Çðí§¹N>­„�Š©Â�R5üïÇ7ÿÐF<úH2ö¢6–0„¦Ë¢ñ`›>ùäk{§}!Âƒ]»vYÑp#Ì²è¬,X ° ¤ètâJà…^ˆ+ë‚ò¥Ï†Z�‹¸õ™6â!ÚmÉ™l (ð`Û[0šVõ—¿üÅHA*JhüÀ­è±X'^¯¾új¬2š9?·è?!mDÿ
‘�¶Á:wm‡6dŒL7 ô]î* CZÇá*Œ5½Î;Œ¡bÂ4"~K§�è8…|ÒFtüÔ+Se¤MÐ6<Ä´!cdº à|åÛ]ºÐŠzp‹­*=í¦‘èÒÇ)dâ‹Âîl‰ƒ�ì-FM´	O¨wÚŒñîrÀû(ˆÑçž{Î[X£xoÝº5–^G…âØ…�_ø0’6–\¾IÓJ}Ä]·ÑŸ6á!ÚmÇ(EÑ Ð‰ÛSÎRð�FÖQý÷�®•lùäóùçŸçs[bî¡¯DŸh¶‰‘¯"A¢þD¥-øôòh3nˆ	^ÀïQ4 ë¯à¥NùàÊ;ßéü9ÔcúVOãwt¨¥‰øFÅ8Iå‹òeÁ9Ú‚‡h+´ãU°	%ë,½�r`.
¢BzFW£È6´<ÒfL˜Ïö³‹(¢~z‚Ž‚h>ži+´ãUÀ‚üÌi‹h�<ð@$#óüŽN3¥­÷Bã‰k*-Œz¦üØ1FRå¦ÁY)Ú€çå´ÑV"¡(€å(Ñ8g©8ÅõÏþÓyÉÈqÚFÀ3Œ\L%Ê {í•š­ëe` ìQÈOÝ§xˆ«§–{®;�²`!oÍ–†o‰»îºËxw±fÍšÙ,SùŸ�/ÒDŒØ“¶FË‰/õ;2�—B?†ÓK÷==%Úm$2Šºø%sõ¸Ôõõ×_7Zà8 Õ
	ç Fñ	;qìý·Â¤…�nTé1´{1&‰:ï³Ì›¶A‰ŒÌ–Ò¿¿Çe;¶9¿î¸ã££ô�5²bÈù‹“ü«3–&ÂÖZuðÁ§Id—¬pî:û„c:Ø˜æýö§MÐ6"¥8€E(¡kO.GAá¥ÇXÁù5]©¦„ç·(•˜JÞHºUªTI�ÌN LÇZ¤®û¬6¤MÐ6"¥8 �¯]Å9`jº‹ßsØZ)°aeÆî(œƒ„•\déÀ©edy…™Ç.ºuëf’®´¨ãÔuÑbqFW°~Ð	W_Ý{ï½ÎK¡üñ¡¦UbŒ0ïÀQeZ>pke| -4a	1Ê0|:®„{H÷YiH[ MT*: ¥e—Çv€@Ç‘¦‚^ÒÑ>8óKÃqÝVcÜ¦BÂw®îÜ¹sêð¾ðÂ+,[¡7P·}œ£Òh•’~ŽR»”ä”SN1±%®pTÞ2æ{N?uK—.-Tßbî¦›nrÕm¾åŽë>5å"œQˆ¨Û>e£TZâdë$°½4¶FQÞ·ÞzK³’�ù%ùxÄˆFpˆ*QlbÒuêÔIÞÆA/Æ&ˆ:MÝöèußì‚d�túÜ¶Á¡Ûnl€	½èr¹_¿~v>Î<“vÌ¸ð³fÍ
ƒ¨5jT*ðfý?ÿüóFà¡.S§=:F�§î�ÛÁ.€FŽi¤2&MšätÑ•·W–8Î¹¨ˆ½ ,ÄJ¾Þ:¥/~ì19uÙ›Î©óB8ÂP6Pìªÿõ¯½B°ôRûÄ]·óuÊ×1.éeË–…^ö¸Lº7f¬[0‰‰:ìóÙI]¯´(»/�Œ«Üƒic³fÍôŠ+B×[¦éÓ%³óuÊÇñSO=z™ãLpçÎ�ºOŸ>‰Á×[§Œl‚¨gÔaO~Ôqêº�ÜáìÌ3Ï42+0qâDÍïlo~qŸ³ëÏà¥¥Fpw­Ù³‰_oþ‚£Ðáæ¨?u×›Î#ÝìƒüRE íB°¸‡~8ô
b‚÷ß¿+o¾QŸc±RI„ËUYpqž¨F·M›6Æ¦Y©³>úCÝ¦Ž•ƒ@üF6€œ‡›é\zUÔõÑ£GÛù8óŒú¸gÏžzÍš5E•%3V`z^Í›77²žºJ�õèušº-”·à€;vÔŒìk‚n»í¶Xgú÷ï_)Œ?[wãÆ�‹u} ÃoÁóoVœPÿSG©«^ýÅ9uZ(Ojà¾©`�C‡52@À-]¿~}W~ÞüMœsŠ¨¢ µ¢)S¦èV­ZEŽ÷€ôòåËƒŠ›×ýüî§ŽúèÉT\£N@€[àè×(§”LÑœ9s"­Æýøã�kNKVVâTgƒqÕ¹W
9ßÿýõõ×_o4ØjŽéNêpú¶sBè$Ð©b7ØVÎÙ2ê¬)â”5j~#:óë¸ZµjšK|-Zdª©KADsu›‹®.¿<x°ž>}ºQ\¨“ÔM�žPw©ÃBE 0Ïº€å®>Sƒ‚Y-Y»v­¾å–[4GŠ½ùrÎ5ñÃ‡7®ˆYùÓö®Ûõc�=¦±ý9¼ÙÐ4HÃõ–ñiUêbŽ�¦Ô]¡"¨‚ç_»N2Œ,òÎ¦M›4­†f-òYÕå’Ë)'—ÀöíÛW³kˆð^Þ¤åÜn#ž0a‚æ‚öíÛû½UsâÍ­¶pæ¡¯¹æ�;>©‡‰‹}¨‹ÎzÏSg©»‰¦´øn¦WÌ	à®N4{÷î­^yåE§ŸQ…®»Z°`�åÔaõêÕŠa°èáƒå“îÇèÃÊk9–ÀJ°(D+É<vìØ¡-‹7ŒM1x'£éÐUZ�5¬º§zMÂè»âqT‰@ä´ÓNósî9rx]IVLL…â@
½¦¸Z[T€Ñ��ðß’b) €ÆIS÷¼ú˜ÑÑÔúí�ÓBŒ*´ |¸jVh¾‘ù&†³ë-œ½.ÿS0rÐ\ Æ�ïÍ‚[|‡ƒg{Hêyš b¸¼
ü?`[öyóæ)vÏhÜŸ;òªÄ0dØe—]¦žxâ	/
Üä3
üŠ÷‡$ŸÛF”d!=²ÍÇùVð °=†çjëÖ­
="	ëä‘IN+Œâså•W*øiô–ö\¸\¦UðÞ˜´ó46 Äp&˜ß_Çó$K˜Ž±åN8áé	dA‘ÿ¡ À7?¶+l óKo4.Þå÷CÒ¯¥µ ®ÿ×Ã“,±`8ðO<Q�,(ò¿(hüW\qE.ãg4Ÿë‹Ê Æ‡ÓÜ ¶Éàºà£y’¥™3gªuëÖY�@TSBÙ¼åi!À)Ç‹/¾Xa{¯_Áø-À®??„bB€�ûee¦d¸xã¥0ë$eˆêuÈO·2:—ö(ŠQÄG÷�ËTfŒm#ŽA'%Ëˆà¶^êŽŸNet-®¨ZÈ^ÈVÈà2•Ö½{wýé§ŸF¤:’MÚ ®Pgüt)£cbü "©ô[¶ìª@îîc`!A <¨#9v‚R§¨[B)@€2þv5µk×ÖO>ùdyõ/¿Ub¨Ô¯Þdt‰:%”"†@V.vU(÷‡Ó4÷ý	D€º@�ð	ÝEÝ¡Q—„Rˆ ƒÔ
v5<§k(F­ªÜP¨~:’Ñê�PŠhÙ§€ËT2¿õ°�¸r[@%.=ë>Ç÷>u…:Ó,TÔF¸N»L#°ß~ûék¯½Voß¾½›Bå*:ëšuÎº÷Ó‰Œ®Pg„Jnú5˜‰ÊT<œ‹èÙ³gW.K¨„¥e³®ýt £Ô{“Ž…J�Þ(ÏÇà2J@¿}wß}·¦[*¡ÒB€uÊºeûÕ}F'¨B• �Æ(ãó`_e`¼¸¨|Ê•–™%³4¬KÖi®úÎèuB¨!ÀnÞÿ¯—QÎßxã�šNA…Ò‰ ëŽu˜cnŸuÎº§H— TVê„‚ÿ\¦àµN�:é_|±RðH›ù3Ø
ëŒu—«^3uÎº,ƒW‡M`_¥9ãŒ3ôÜ¹sÓf•N^Öë*W=fê˜[xm¿’8,:ãï?Á¾
D¿ó]t‘±�Ò•ÎZC,ðÒ¥K­ºaåª¿LÝ²Ž…�œì‹_~^
öU&øþ×7Üpƒ^µjUˆ*,I‚ ë€uÁ:ÉU_™ºd�²n…�¼à¨0=¾ìû*WãÆ�õ˜1c4Ü’¢»òLsbÏ:ÈU?™ºcÊ?@*�^xì5pNEkÚ´©yö‹/¾(B¥åÑ| ÆŒòKÌË«“L�±î„�¢à4’LçT¼úõë[1íL.ÍÇPJíbÊx�Ä¸¼:ÈÔëJ¦ö ‚P¸TCrç€?çTD†‰æ³±cÇÊ:‚"Z"ÎãCbézÛ‹?ë„uÃ:Œ"P©Ÿžö*¢ëü°Ã³¢ÕÎ™3GÖäÑpŸX1Â/±«ßL°.X'B‚@¤PéF€§�ËUVÆ«g¨pD•‘Pá>Ã§bD¬*Â3ƒ9±Ã…’|'Šœû¹*8=<<\œ“°4UõèÑC�tÒIêøã�W:tˆ,¤uN¡"þaÏž=ê“O>QS§NU&LPèÂÐngd&‚ÿžþ,TÒ ^ŽG»àúÙà3ÁÍrÜc_®^½º:ê¨£TÿþýÞ~ªsçÎVÌ{û†:øæ›oÔ‡~¨Þ~ûm5yòdõÑG)ìÒË§„+qÓßÀÏ�çæó€Ü“Ò ä‡S!w„‡ØætT¹½ün<Ô¨.]º¨ž={Z½„¶mÛª†fNÕÿõë×+†oçÛýý÷ßWX¦«V¬X‘oø¶ç§wmò­ÿ5X(d¤ÐÉuÄu†4?Ì¥¨y­Hƒ“JÕ¨Q#…Á0«gÀžBûöíU³fÍ¦Ã<Ú ©øé»ï¾S7nT+W®Tð©o½Ùù¦‡¿=… 
Ÿüù
¹7r4ÿ`®½X 2ˆ€4 ÁõIšÛ|x ˜»ÑM[í³Ï>–ñ·hÑBµnÝZµiÓF±×@ÆrXë7¬‡Wü´à½aƒc²«¾mÛ6ËÐw‘or2æ¨Å‹«åË—[¿ñÞ€´÷Ï¿	ž žþ,Ò D rŽ,ØîîæØ?
¦ªU«*x¼Ql Ø4hÐÀ:®W¯žª[·®ªQ£†Â»Âœº99Û@Ðh1ý¦¾ýö[µk×.7ÙjóæÍ
óð–ÑoØ°Á
¶Ê€‘—0³HbwžßòîJç›Ábô !j’ jÄsçÇõêl8^@WÔl€K�6 4ò`~×Óø×€…bF@€˜+ œì›â·v`~2tÏóZmp’i+„[þ<Ì.=�yM(aH�°
)Gœêø�½„VàÃÀ2ÿ›à?§	j�«€£ Î¿oÓ¥Ö—àÏÁŸdþ/Á¾ÝóšßÃ}B1" @Œà‡”5§ë�Ùf/¡Qæ¼>þ×³qà}ô‚CæøÃÞàì(!Gî~ ó;œøä�`ùfðF0�ý+0ßäë2çô Äû„RŠ€4 )­¸Ä¦±sú‘Lã'gëŸótl ÈœŠ#ÎÇ3B‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  E"ð¿¶[#R¤aÂ    IEND®B`‚ic08  ?ô‰PNG

   IHDR         \r¨f  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  4ýIDATxí}¸ÕÕö¶Ñ¤
(R¤((A)êg	Æ J"1¢þØ5±ƒ»Æ[ÔÄ(*’cƒÔˆ4A)”‚R¤Ptï;9g¾™¹sî=sÎì)ç®õ<ëÞ™93{¯ýîµöìÙe-¥„A@A@A@A@A@A@A@A@A@A@A@A@A@A@A ¡ì•P¹D,ó°î÷ÎdóþkóYJIC@€¤ÕHaòÔÀcµÁÁ:þ7Àq�×Âÿêàjà*`¿³`#ð-xø?àmà-Þ€ÿëÀëÿ·âx'X(ÅH�®Ê«q›‚[‚ÛƒÛ€›ƒƒiì4r¸IbÁÆ��Âð
ðàOÁKÁ«Á›ÀB)@@€äVRMˆFãîî>
Ü
Ì7¼i#Gö–€?ÏÏ³‘ØJÒ $§BØ=o>ÜÜÜÌëi&~N¬Ï¿ž	^æu¡˜� Þ
h‚ì{€O ÷³K_\0í·ß~ªN�:ªvíÚªV­Zª^½zÖÿš5kªªU«ªêÕ««5j¨}öÙGí»ï¾V>{öìQßÿ½Ú¹s§úÏþ£vïÞ­¶oß®¶mÛ¦6mÚdýßºu«Ú²e‹úî»ï
–-óànüç'Ã{à·À3À_‚…b@@€èA?Yž>Lãg—>U«VM5lØPµlÙRzè¡ªU«Vê�CQMš4±®×¯_ß2z:„bˆÏ†��ÁÆ�ÕúõëÕ—_~©V­Z¥–,Y¢–-[¦–.]j]ßµ‹_ �‰ŸlÞ O/E„€4 Ñ ÝÙ÷ Î‹øÆnÞ¼¹êØ±£êÔ©“õ¿uëÖêàƒ¶Þî{íoj­­^ÂÚµkÕâÅ‹Õ‚Ôüùó­ÿ+V¬°zyô¿7}ƒÓÀ/�ß2ˆ@¼Úc°`	Hš]yvë‡�ƒ9R_!±«Þ¶m[uôÑG«^½z©#�<Òj x=MÄO6 óæÍSÓ¦MS3gÎT‹-²>-ò,g&‚_ ós�ŸB!# @È€"9ÜñM6¸¸BŒùF§±÷ë×OõèÑÃêÚg¿Ïñ|IÇø©0cÆ5eÊ«Q`�!â¥¹àçÀìp@Q($*TÎ�ò©ÉÐØÏŸ>\.qÄjàÀ�jðàÁª[·nÖ ]¹”Ø�Tœ={¶š8q¢zóÍ7ÕÂ…ó)á×¸i<øi0!A vúB‚Á;À|[ådtíõe—]¦ñÔ;vìÀç³ Ä„Ø£ò0ÌüF¬‰y_°� 9{#Ç“ÀüFÝÎ©´‘×gŸ}¶~å•W4¦ÑÄâ+@€+bFìÊÃ6ƒ=ë€uÁ:Œ#À9û� çTPŒØë{î¹Gcš¬•—Ÿs!@ìˆ!±,ëL]°NX7B‚€º#UBå|ãcÎ]ã»^¿ôÒKÒÅÏeÕ\ç'1%¶Äu�‹Y7¬#Ö•� 
­‘Ê#àœßøXq§Ï9çýÞ{ï ÞòHˆ1±&æ¨“\Ìºb�±î„�‚¨…§®säÙWÑ¨„çŸ¾þè£�‚è°ÜÄœØWÐ°îX‡¬K!A o¸j�;Ù|kêõ¹çž+†‚!›Öë$W}eê’u*$”‹@Süúø[p…Ú{ï½õé§Ÿ®ßÿýbõVžÖ	ë†uäWw™:eÝ²Ž…�2Ç•¥`_êÙ³§~ã�7BV[I.lXG¬«\õ˜©cÖµ� `!ÐŸû*vØéûï¿_cG\Øº*éB€uÅ:cÝåª×L�³î…*1ÿƒ²/—Qì—·¾-±åÕ�šJ²¦`Ýq|€uéWÇ™º§U2¸µî.°ï·>¶ÞêW_}Õ´~Jú!Àºd�¢¾ý˜:@]H×vK,TðØ;à2ÊÀE&—_~¹Þ°aCDª)ÙD… ë”u[ÎB"êuC¨„8e[.cümÚ´Ñ¯½öZTú(ùÄ„ ë˜uí§Ý Ž•û¢<£Á¾]þŸýìgn®bRIÉ6jX×¬sèƒSG¨+Ô¡@ >Ê@¯2e*û€Ð�?þxÔú'ù%Ö=uÀO72:CÝJ1\þ¸L%ÃÕ–ž>}zBTQÄˆê uÁOG2ºCJ!½ óbp™Ê6l˜þúë¯ãÒ9É7aP¨~º’Ñ!ê’PŠ8²n »*•#À·Ür‹†«ë„© ˆ7Ô	êFŽYêuJ(ü2–ÙºËo½çŸ>n=“üŽ u$Ç¸ uŠº%”`.‚leFú<C¿ûî»	W=/)PW¨3Ð%/S·¨cB	Dà*Èô=ØUi]»vÕŸ~úiRtKäH	ÔêŽWŸ2:F]J×B–2>úú÷ï¯×¬Y“•1“† u‡:Ýò2u�:'” èñÅ[AúÔSOÕß|óMÒtJäIÔ!ê’ŸŽáuO(F®@ÞeÞüg�u–F0Ë”©šˆ›T¨KÔ)èš—©{ÔA¡¸ yÒ¬«Rè0R‚n$Õ”Ò+uŠºåÕ·ŒR…"D`(òÚvUÈðáÃ5âÛ§WËDòD#@Ý¢Žyõ.£‹ÔI¡8yl»*bÈ�!i­@"\ú ŽQ×¼ú—ÑIê¦�A:#íµ`W4HÂn¥ß¶RS†/£Îyõ0£›ÔÑÔPš¢ÓÛ›àÃ�èöîÝ[½üòËªAƒÎËr,E FÔgœ¡¨Ä›ÏÇ¸0ü¥÷‡$ž§¥ »¦—Àœ vèÐÁ
/Ý¬Y3çe9"A`åÊ•Vx÷O>ùÄ›ß¿pax»÷‡¤�§¡ Œót¡¼Æ�«	&(låt^6z¼iÓ&µhÑ"µ`Áµxñbµzõj…)"õí·ß*8žT5jÔPx jÙ²¥jß¾½:âˆ#”4N…W	FÞÕçŸnã½bÅ
…î·Úµk—Úk¯½,¼AXµhÑBµk×NÁïŸÂ^µï¾ûžiÀ'çÍ›§N:é$…ECÞ'Ã…_�ù© T¿Æ³®ï­ý÷ß_Oœ81’oF½7nœµ]ŠVž‡Y—Œ”™›Júöí«o¿ývýÙgŸE"oÚ3áH;v=jÔ(�FTW©R¥®^}Èž3LX·nÝô5×\£?øàƒÈ  .R'³r8þSw…Š@€û°·�mpÑòëÇ{Ìxå®]»ÖÚZŽÿ8[&§|¹ŽëÔ©cM!‰ÿªãÀ=ôäXkÖAµjÕ¬�º×_]ÿý÷þ™†x•:IÝôÔ?uW|	 „B¨1úìõÒK/±ÚÊ&Å <ð€nÞ¼¹+_¯…žS1GŒ¡ñ)Q6óJzå…^(ÏmwQõ@£<xp$ÞŸ¨›>zA¦.@€qôs:`À £zæÌ™£ûôéãÊÓ+CXçt�õÆûá‡*©Ùk½lÙ2=tèÐHðfýúë¯7ºJ”/ê¨�ŽP—£˜@fi§KQ �LÓ&£ôŒ;Vc@É•§Wç#GŽÔ›7o®t�À”)St«V­"Ç›º|ùrcxSG©«>ºB�Ê�®¸g3Ø‘Ýf“�9o»í6�‘c;?gÞQW¶mËTå˜HØúåqøá‡íN]¥Îzò¦NS·…ÊA€óý\YáoÌ˜1ÆZìÑ£G»òòæÕ9#ÚVßÏ<óŒ®^½zì˜sŒçÃ?4¦WÔYÝ¡nSÇ…r ð;\wwÂ	'hÌû©(F�õæçùñÇ_ÒŸŒÑ—ãÏÖ1gx–.]jD·¨³ÔÝl^ŽÿÔq!zâ/Ú q}áÂ…F*ˆs·IRÆl¹Ï;ï¼H¦­Œ€ZN¢X-§5jd×m¶¼qÿï×¯Ÿ1ßÔ]£Ôqêº��8žv)È£�>ZŽJþV”i.êñæ—”ó§žzªðÂ%ðIŽŽG5»RH^uÕUÆP£ûÈD]§Îeøþ»€:ýôÓõž={B¯N»åpìàÊß+O”ç|SrŠ¬Tˆ+!£Ä/h^\m8yòd#pS‡©Ë>2Qç…€Àaà`¤†j¬7R!“&MŠuÄßYÎòŽù)P
ÄzôéÛu]QþÖ«W/ccMÄ€:í)užº_©‰}Æƒ]àp%ž	bô~óyóKâ9Ç'fÍše†HÓäšþ$âë'“ÉÀ1ÔiŸ<©ûiØ�1ÍÃ-¹üú{ì±ÆÜz½õÖ[�6ó@6¿J‹ì—§™øæ‹s¾?hýõèÑCïÞ½ÛäÜäDÝöÈDÝ¯´!ÇöGáç:©Zµª~ç�wŒT ÍáÙÕ[)‰9¯[·®±i*c ;¾é¦›ƒ¥SÏrcK·~ûí·%÷�ºM÷äO -T:úJìã‚.qGj«V­ÒðäÊÏ›Ï|ðAG)ÒsÈ7^çÎ�S‡÷…^hdê¸�žÑ*ˆÒ.Û`ÀÁ‡†‡cà?ýôÓv^Î|“~Ì�liÜ0Äñ‹‘v]\d2¦uœºîÑ»å8§MDN{Gžã3¤õæÎ¼/»ì2uÈ!‡8/…z<uêÔPÓ‹*1ìPTˆ_Uv¡å3mÚ4…A×ÐÒ‹*!L¿ZˆLåG§®{ˆ¶@›ˆœâh håÿßYRºs:ÿüó�—B=¦"ÎŸ??Ô4£Jlýúõ
Þ„¢Ê.´|fÌàZ—ôæí¼	œºN�÷mÂÜÐ“Yö4Žà×Èü ¬ üå•W*Œ;/…z¼nÝ:Ë_¨‰F”¾‰,?„eJ6ô‘Hß‰i¥�?¦c_sD]§Î{ˆ6AÛˆ”¢n ØÕù…³„]ºtQÃ†s^
ýø«¯¾Rtè™VÂ†•T‰ÿ
.ÕR%³SX:{5MÔyê¾‡h®OcÏï¡ŸFÝ ð;ÇåÀŸ-!½éš$DxUìÚ¥•ØƒIÑS2Öÿ§Id—¬üìÂÀ«ëZØ'ÔyŸ^ m#Ò±€( vqF8�„W…uÒÎKFŽÎÉHºQ%ºuëÖ¨²
%L¦ºÁ¥¾D1€IÝ§xˆ6âúDöüêi” ÖÔ)ý%—\¢°äÕyÉÈ1¼ÂI7ªDÓÖ{áÛ“ci%Ê…üÔ}Ú€‡h#®¥ç÷PO£j jBê‘NÉ4#Š·?ó„{&gÖ©;6ý‰6 ˜ÿW{ï•j…-½R”?ªà"´Ú‚‡h+´ãU-�‚’tp–æ—¿ü¥‚§Vç%cÇue$™´vÓ¥Jôš5k*l±M•ÌNa‰wT m€¶à!Ú
mÆ8EÑ ì‹R¸&ù›4ib|äß‰ÃuEñ©áÌ3Ìcâ•&bƒË�]i%¸l�TtÎøÔ1m†¶c”¢h ~„ë,ÅOúS+†žóšÉc8ØPQWj˜å9ì°tmGˆ.£«:ÃÄÖ/­Ö­[û]6v�/(Ú„‡h3´£EpJ°_¶üž=÷Üs³§‘ü¯]»¶ŠºRÃ*Ç/|V�…•¼‘tø¹…�@FÒŽ"Ñ£Ž:*Šl\yÐ&<c=´ÚŽQ2Ý p^Óµß>ðý=Œ’
yôÑGÍÃTâž¡Èi#xØI›È–¼Ø‚­~ô#ã/Þ2Øp �¶á!ÚmÈ™n Br×Ôß/~ñ‹XäÙÀN˜µ…èÂ©¿€s7XaBIZì¹ÄÒ�/)Ú†‡h;´!cdºê”œo2ø¾w^Šì˜­z‡®‰ˆÈò.4#*Å©§žZèã±>ÇA-6^i£ÿøÇ±MaÒ6|z{.
O“@KÛÛ)ðgœatÓ�3/ï1¿¥Mï9ðæYìyÇŽUïÞ.‹M2ÒçÓ†7{,Q­Mñ«ÎžÐF<D -!“ _]u³Rs^•­kœ{©šà¶QÏÀPœðÎ{Ð A©„Ë8Õ´){ÝñmÄ³�6”ºn WÝLs=¨Å]»v5ævË6ó¦ë®»Î–)+[ÿcä¿$Â„1`ñõÊDÿ‹ð»�·™º‘!Åh+ùhKFV²™êp"Õ5”zòÉ'+8DÄåxé¢‹.R-Z´ˆWˆ<r¿á†bû\ÊC¼¼oáüv\ã>y‰áPµmÛ6È#Fî¥�ÐV<D[Švq‚G€ §¿Æv+FßpÓ§O7ÕhNwìØ±¶lN9“r|Úi§‰Š¨� 7\tk‹9¦àô†B*mñÉÐV|ü)Ò¦RC¯BR»Âáø ÝÿlÕ`w fä§ŒI9†Ï¸T»Ïbœý¿eË=dÈ��Dâ�µøF]ÑgqòŸŸ´�NÒ¦RACJz±´`2øb`�÷ÂIˆîÙ³§-£SÞ¸Žèõ×_wŠ™êcz×Å¨v¢0öÖmRÝ®Óf<²Ò¦h[‰'ŽXÚÂc[¨f<¾$Ò_|¡ÛµmgËê”;êcv‘ü�I„© ™àTCÿä'?I¶¹ê’F–T—ë´ÚŽGöTÌüÞ)4Ü=šÍîíÛ·÷é9£Ó>üðÃZâ›?éÆùå—'zœ~ýBØÓ¶MÜÀ0l!é´dÉ�7¶ÌNùMcñ‡~öÙg“QÞòíØ±Ccä?,ó©+ö´n½õÖ¼Ëç�>�(mËÞX‡ãÄw­lÛ
�–7Ç°ðÆ–ÛYSÇØu¦ÿýïÇ©c¡æÍp`gŸ}v¤©,òÑãÇ�µÌ&£íxÊGÛJôÎ°3�³k;wî\“…žö¸qã4æƒ½À‡zŽÕ}š]Ð$M=$¼ kF3vÖ>Çœî2ý	Æ ŸX–¬/^\l1#}ž¶CòàHK,ÝÉl�±ßhœ5Sµ·Ðúæ›oÖ|c8ËSì1#Ãžyæ™šqóJ‰øæ?çœscÅA®ûï¿_sªðÑG5ÒwÜqzâÄ‰©„›c)´!�ÞÑÆI\Uøo°-0•=Í„ úî»ïÖÝ»w÷[˜a—ÓYf¿cl/µ>/’´*¬zÙ½{·†3‹¼±ÈâCã¿çž{\bpàëÉ'ŸÔýúõÓì%eïú›zôÐ¡Cõ„	4Ü{»òHÛ	mÈS~Ú˜©¼Hºpj„G]óÿwÞygÚðö•¡®4bÝi–‡óÚì²Ö«WÏwubj.æá›‡Ýüüã�=|ÓMûE?Zz´Âs?ÖòhÁ‚ÖÌÈðáÃõ‘Gi…vg
:æb6pù¦�9æÍÐÞÏ=÷œÑ(ÓåÉlâ7êœ§Ì´1ÚZ(æº€ylµNÜËŽ¹L?/'¡g"éVø~·ÝW+ˆ¾3­�{t†Ém¥ióäOÆ*øÕ¯~¥žxâ‰ �ªÛo¿]]}õÕy?‡†ÆÂš{vŒçhD,G)hˆ-¼‰;ë ÔhòäÉêÄOtÆ)`È¢>àiI+ë(d·V|C®X±ÂD£(iÆŒ »Õ|Û:ë;ßã´LÁÅ±�=mˆ¶äÁ—¶
…ù-áòyè¡‡*zã*-e‰ñí{ì±ÀûÝï~§®½öÚÀÏUæhC´%¹lÍó[ Ó° ¦ãò·uøá‡§:8D +ÉÍYãÿÃþ¸Ä7Ýt“‚/†ÀÏUö`…¶ä!ÚZ(¶J"¦¸™SH”9Oå8å0Þ£Ù>ôÐC�Krýõ×«o¼1ðsòÀð±%Úm®h
«`_ßå6mÁ,ŠF²„À©úÍo~£0g¸”4þ[n¹%ðsòÀÿ!àcK´µP¾¯Ãj èHÍôGŸfiðºóËQ.øæçˆý½÷Þ›ë–œ×ù½/ÆŸž¼ -Ñ¦D[ÅyaX@K‡pŠS3œŠ­ËN±åØƒ ßüün¿ë®»<¿T|Êý„ŠG€¶D›ò�Ëæ<¿å}VÐÂ™#çÁ}vÞ"Ç)@€Ý÷;î¸#°¤W\q…õ×‚� m‰6å¡žó‚NÃj \ÝFVIs4Þ‚�,±‡F�­n»í¶À¥ÂêG«Ç ÆºœÐ–|¢¹l.çÃüVÐØ™�tÿ�h¤ïxÌ˜1
›¡~É%—XÆÏUzBá"àcS.›+4·0jª
2wƒÇZøBå‘çbF€ƒvœ³Jt·ŽÍ=%¹7(&î÷±)Úm¯(
£¨	ì@”¦AƒE	%Çƒ »ü…Ì×sOÀïÿ{ïHu<…(Ñ\}lŠ6GÛ+ŠÂh jB‚ÚN)|„uþ,Ç	D€t8è”Pã�ã
\Àû}lŠ6GÛ+ŠÂh (ˆ«%âÎ,¡ô Ài>N÷qÚ/a+°‚[m1þ  x¯�MÑæ\/ÞB’£`+d‹pô·V­PV)Ry& ünçBŸ ÆÏXöðY§àÒ+`Žr{!Ð¦<3+´¹Dô („­\±„h+…”Qž‰�ûî»Oýö·¿lüð ¤yäÙìa}Ñ¦<«is‰h j8q¨V­ZªCZ;ËRÊÇ\×�ÀŠK}ƒ|ÿY[�“è5ˆÜi¿—aâi[rÙžç·¼NÃø¨îÌ‰Š!ÊáD$yÇünçÎ>nïBpùmy ’ú‚Z8÷æ°+—í’Sè ¿	¹‡Y(™ð»�«õ‚?|óYÆïóJfAKL*Ú”ÏxK" ûûŸ˜ó;¥}³•‚>Ñ‹Ï¥—^ØøéGÁ[¯,ïŽQ	hSž1 Jã²½BÄ£àJƒ#•žÑÊBä’gBFà�ü£ºøâ‹�y!„§ã˜¡{sØ•Ëö
Éºè�©Ë+•µà…T…¹gžzê)Å¥ºpæ(ø¤WúÓŸ\�zNnÚ”Ï‹Õe{…äFàIâ|rÐ9åB—gòCàé§Ÿ¶Üw#¶A~dîBüõç?ÿYŒ?jænÎaW.Û+$÷0 ×<:µTˆàòLÅ<óÌ3ŠKuƒÿ©§žªØpÈ›¿bŒ£ºƒ6åóbuÙ^!²„Ñ ¸ú•]:Â\ˆàòLùŒ;Ö2~ÑB§œrŠB¸rU»vÑ«Lƒd+÷V€@»rÙ^IøþF°Ë™2ß6A¿5�ÏËqñ¼ðÂjÔ¨Q
A;%vòÉ'+6bü�`‹äfÚ”OOÎe{…FàÒ2
ô­SˆàòŒ?/¾ø¢â&� Æ?hÐ ËøëÔ©ãŸ°\�Ú”Oà²½B£ØéÌ˜ŠTùœÏËqáüíoSç�wžÚ¹ÓU%&ÈØsª©êÖu¹u¨ð9¹!:rØU°Šö7Œ`Òµ'—9Ï¼}ûvŸ¬ä’Iþþ÷¿«‘#G*.B'œp‚â'C©3‚Iï¥MyÖpÐæ‚U¶OÁÂh híöHG*¥ðAÚà%„ WÜ¡÷~ýúYÆï³×Ü ´’t!°n=³ ´¹¢ß´a4 [ ˆÝ °pß|óÿ	E€Àk¯½¦~þóŸ«mÛ¶Êí¸ãŽ³ŒßÇÓL täæhð±)Úm¯(
£`7Ä¥}Œã.d�7ÞxC�1BmÝº5PfÇ{¬7nœ:ðÀ='7Ç‡€�MÑæñ	À‘ÈÍNh6lØà<•cLœ8Qqoþ–-Á^½zõRãÇ�—ÐíêÄd’>6E›KÄ, »"�…_½zµóTŽCFàÍ7ßTÜ›¿y³«Ý­0—=zˆñWˆR2oð±)ÚœëÓ»ÉÃø`¾k�™¯]ë:uþ$ÇE"0iÒ$Å½ù›6m
”R·nÝ§	7%žD ¼åæâð±©PŒ,¬àKgW­Z%‹�œ€„t<yòd5lØ°Àƒ¬4þ—^zI5iÒ$$I$™(à" Ú”‡\6çù-ïÓ°€åÎ¿þúëÀo(çór\�©S§ª¡C‡ª�]_[eoô\éÒ¥‹õæ÷‰,ã¹SN“Š {{´)-÷œtV°Ä™{��·Èq ÞyçE¯<>Aå¦Ò¹sgëÍïX²ÜçäÇd!�ã…ê²¹B%«`wÄ‘äšå+V*“<ç@àÝwßµŒßgÈqWÙÃ£Ž:Êzó·hÑ¢ì�r%UÐ–<û hk‰úX�\s‹-JÈIvÚ´i–ñûtÿÊ·S§NŠKƒ[¶lYî}òc:ð±%Úm®h
«ÀÉh×ÜßgŸ}V´p•9�÷ß_�uÖYê«¯¾
ÃGa½ù=ôÐ@ÏÉÍÉEÀÇ–hkÁ€ä(^X =“¸,þã�?ön^È!‚\ö"0sæLEgœkÖkä;tè`}ó·iÓÆ›¤œ§n ¢-yˆ¶V´7 ¦VÀ´æòO––,Y¢Ö­[—=•ÿy"0{ölEgœ…ÿË/¿¬;ì°<s’ÛÒ€ mˆ¶ä!—­y~tf°9Ûáe¹yañâÅ�„©ì7Ï™3Ç2~ŸU_åBC£ç"1þraJå�´!ÏF Úm-Ú7”Tþ›­�Û ­Øàtbøá‡ª>}ú„˜E2’¢ÃŽÊsZŽkñé®‰�¿�[k6lxýÜ¹sÕ�!CÔÊ•+²uëÖÖ€_ûöí=—¦›¹†Xs.æ9ÝdW¯^]Õ«WÏÂ›¸—b@Ú�ÇÉ.m,´7k˜ G«ØW± *»³¥@4pVÄÛo¿­fÌ˜¡8(ÃÁ9nÁõ8i°<éR)9ßµkWÅm·ÇsŒ¥¤¹°˜7ožõæ:uÊo}Žö~øá¹’Níõ…*N�r&„ßÀ_~ù¥…7�ßIltéÃ�ƒžGy¤âNGr©,|ò±!ÚX°‘a'`†�Aúì¢XŒ·’ÆÛ~ÒIèŠë»ï¾[wïÞ]#.›]®lùòý�…8úüóÏ×Ó§O/Äüùóu«V­§�FóÙR"¼Ý5B�i8*Ñ0ìÀ˜dë=0�U“zÂ„	�wj!¢íÐ†²åÊü§�%–Î†d¶Àè¢i´Þ©« t5õÍ7ß¬›6mj—ÅY®B�áUc€OÏš5ËÂ„Øà-8�æÍ›k|2¤×\Ã�™~ôÑGý”=06ÞºéÛ·¯ÆÖé\Y'ú:õƒ6ä)m,±ÄQ:)°…Fh©DƒìŽ2tÛ¶mmù�e	ë˜o·.¸  …ÇÊ>ýÁxÅNí9–9ëž={Åc;(5ÔR…mÇ£s´­DöT…€9…†ÓŠT€Ž‘V«›î”=iÇü”ÀLA*ð¬HH|Ëë1cÆø½á¼JÚ9{tp†R‘h‰ù�¶ãÑAÚm,Ñô0¤³ÇÔ”†CÃÄ€ê'æYuïÞ½m™�ò'å[y5ù‰ŸºkØ,¦±Ê1¼b[ßzë­‰ÇŒ6CÛñèm+ñôSHhNÀß{ï½ÄŽÑæ‚ºâÎ2š>†�¥Á‰Å0ˆ`_0`€­¦±Ë•þå—_®1ƒDôHï¥ÍÐv<òÓ¶OÍ !ç*máo¼ñÆHÁË7³/¾øB·kÛÎ–Ó)sRŽKÉøù™…8‰Áûª«®Ò˜cÏW]"½�6ãÑAÚm+ñ´$|l ¾è4¶3F
`E™QM>91(äø ƒJtï©"Œ�¿s:ŽSs…à`ò™|Ð)f"Ži+´O¹iS´­TÐo ¥] Na!M"À¥ˆ´ªBË–Ï)kRŽá²[O™2%1˜+×S$[§ûï¿¿æLD’ˆ¶B›qÊ‰cÚTj¨#$Ý	¶qç�w&cDÀµårÊ˜”c*%üÿ%¯bÁj6]«V­ÄbŽ-ÔK�‹-fhÏÓV<ºH[¢M¥†ö�¤ÓÀvAà�>«²°„Ws.Ý)[ÒŽ¹ê0MÓUåi>§ûŽ;î¸DãÍú¿úê«Ë+Fd¿ñS‰¶âÑIÚm*Ut¤µ’”Ï€ë®»Î–É)_ÒŽÛµk§¹46íôÌ3Ï¤oDFÖØã;Ü9ºÿ´%#æv`¯€ÿÀ®\²ˆ›8^yå•ìi,ÿ¹¡kÍcÉ;h¦Üpôì³Ï},Q÷3¤õ}÷Ý—(™r	Ã]†=ôP®Ÿ#»Nñlx¢Ñ–RGl\ÞÛo ìZ‹uQÐí·ßnËâ”+©Çðí§¹N>­„�Š©Â�R5üïÇ7ÿÐF<úH2ö¢6–0„¦Ë¢ñ`›>ùäk{§}!Âƒ]»vYÑp#Ì²è¬,X ° ¤ètâJà…^ˆ+ë‚ò¥Ï†Z�‹¸õ™6â!ÚmÉ™l (ð`Û[0šVõ—¿üÅHA*JhüÀ­è±X'^¯¾új¬2š9?·è?!mDÿ
‘�¶Á:wm‡6dŒL7 ô]î* CZÇá*Œ5½Î;Œ¡bÂ4"~K§�è8…|ÒFtüÔ+Se¤MÐ6<Ä´!cdº à|åÛ]ºÐŠzp‹­*=í¦‘èÒÇ)dâ‹Âîl‰ƒ�ì-FM´	O¨wÚŒñîrÀû(ˆÑçž{Î[X£xoÝº5–^G…âØ…�_ø0’6–\¾IÓJ}Ä]·ÑŸ6á!ÚmÇ(EÑ Ð‰ÛSÎRð�FÖQý÷�®•lùäóùçŸçs[bî¡¯DŸh¶‰‘¯"A¢þD¥-øôòh3nˆ	^ÀïQ4 ë¯à¥NùàÊ;ßéü9ÔcúVOãwt¨¥‰øFÅ8Iå‹òeÁ9Ú‚‡h+´ãU°	%ë,½�r`.
¢BzFW£È6´<ÒfL˜Ïö³‹(¢~z‚Ž‚h>ži+´ãUÀ‚üÌi‹h�<ð@$#óüŽN3¥­÷Bã‰k*-Œz¦üØ1FRå¦ÁY)Ú€çå´ÑV"¡(€å(Ñ8g©8ÅõÏþÓyÉÈqÚFÀ3Œ\L%Ê {í•š­ëe` ìQÈOÝ§xˆ«§–{®;�²`!oÍ–†o‰»îºËxw±fÍšÙ,SùŸ�/ÒDŒØ“¶FË‰/õ;2�—B?†ÓK÷==%Úm$2Šºø%sõ¸Ôõõ×_7Zà8 Õ
	ç Fñ	;qìý·Â¤…�nTé1´{1&‰:ï³Ì›¶A‰ŒÌ–Ò¿¿Çe;¶9¿î¸ã££ô�5²bÈù‹“ü«3–&ÂÖZuðÁ§Id—¬pî:û„c:Ø˜æýö§MÐ6"¥8€E(¡kO.GAá¥ÇXÁù5]©¦„ç·(•˜JÞHºUªTI�ÌN LÇZ¤®û¬6¤MÐ6"¥8 �¯]Å9`jº‹ßsØZ)°aeÆî(œƒ„•\déÀ©edy…™Ç.ºuëf’®´¨ãÔuÑbqFW°~Ð	W_Ý{ï½ÎK¡üñ¡¦UbŒ0ïÀQeZ>pke| -4a	1Ê0|:®„{H÷YiH[ MT*: ¥e—Çv€@Ç‘¦‚^ÒÑ>8óKÃqÝVcÜ¦BÂw®îÜ¹sêð¾ðÂ+,[¡7P·}œ£Òh•’~ŽR»”ä”SN1±%®pTÞ2æ{N?uK—.-Tßbî¦›nrÕm¾åŽë>5å"œQˆ¨Û>e£TZâdë$°½4¶FQÞ·ÞzK³’�ù%ùxÄˆFpˆ*QlbÒuêÔIÞÆA/Æ&ˆ:MÝöèußì‚d�túÜ¶Á¡Ûnl€	½èr¹_¿~v>Î<“vÌ¸ð³fÍ
ƒ¨5jT*ðfý?ÿüóFà¡.S§=:F�§î�ÛÁ.€FŽi¤2&MšätÑ•·W–8Î¹¨ˆ½ ,ÄJ¾Þ:¥/~ì19uÙ›Î©óB8ÂP6Pìªÿõ¯½B°ôRûÄ]·óuÊ×1.éeË–…^ö¸Lº7f¬[0‰‰:ìóÙI]¯´(»/�Œ«Üƒic³fÍôŠ+B×[¦éÓ%³óuÊÇñSO=z™ãLpçÎ�ºOŸ>‰Á×[§Œl‚¨gÔaO~Ôqêº�ÜáìÌ3Ï42+0qâDÍïlo~qŸ³ëÏà¥¥Fpw­Ù³‰_oþ‚£Ðáæ¨?u×›Î#ÝìƒüRE íB°¸‡~8ô
b‚÷ß¿+o¾QŸc±RI„ËUYpqž¨F·M›6Æ¦Y©³>úCÝ¦Ž•ƒ@üF6€œ‡›é\zUÔõÑ£GÛù8óŒú¸gÏžzÍš5E•%3V`z^Í›77²žºJ�õèušº-”·à€;vÔŒìk‚n»í¶Xgú÷ï_)Œ?[wãÆ�‹u} ÃoÁóoVœPÿSG©«^ýÅ9uZ(Ojà¾©`�C‡52@À-]¿~}W~ÞüMœsŠ¨¢ µ¢)S¦èV­ZEŽ÷€ôòåËƒŠ›×ýüî§ŽúèÉT\£N@€[àè×(§”LÑœ9s"­Æýøã�kNKVVâTgƒqÕ¹W
9ßÿýõõ×_o4ØjŽéNêpú¶sBè$Ð©b7ØVÎÙ2ê¬)â”5j~#:óë¸ZµjšK|-Zdª©KADsu›‹®.¿<x°ž>}ºQ\¨“ÔM�žPw©ÃBE 0Ïº€å®>Sƒ‚Y-Y»v­¾å–[4GŠ½ùrÎ5ñÃ‡7®ˆYùÓö®Ûõc�=¦±ý9¼ÙÐ4HÃõ–ñiUêbŽ�¦Ô]¡"¨‚ç_»N2Œ,òÎ¦M›4­†f-òYÕå’Ë)'—ÀöíÛW³kˆð^Þ¤åÜn#ž0a‚æ‚öíÛû½UsâÍ­¶pæ¡¯¹æ�;>©‡‰‹}¨‹ÎzÏSg©»‰¦´øn¦WÌ	à®N4{÷î­^yåE§ŸQ…®»Z°`�åÔaõêÕŠa°èáƒå“îÇèÃÊk9–ÀJ°(D+É<vìØ¡-‹7ŒM1x'£éÐUZ�5¬º§zMÂè»âqT‰@ä´ÓNósî9rx]IVLL…â@
½¦¸Z[T€Ñ��ðß’b) €ÆIS÷¼ú˜ÑÑÔúí�ÓBŒ*´ |¸jVh¾‘ù&†³ë-œ½.ÿS0rÐ\ Æ�ïÍ‚[|‡ƒg{Hêyš b¸¼
ü?`[öyóæ)vÏhÜŸ;òªÄ0dØe—]¦žxâ	/
Üä3
üŠ÷‡$ŸÛF”d!=²ÍÇùVð °=†çjëÖ­
="	ëä‘IN+Œâså•W*øiô–ö\¸\¦UðÞ˜´ó46 Äp&˜ß_Çó$K˜Ž±åN8áé	dA‘ÿ¡ À7?¶+l óKo4.Þå÷CÒ¯¥µ ®ÿ×Ã“,±`8ðO<Q�,(ò¿(hüW\qE.ãg4Ÿë‹Ê Æ‡ÓÜ ¶Éàºà£y’¥™3gªuëÖY�@TSBÙ¼åi!À)Ç‹/¾Xa{¯_Áø-À®??„bB€�ûee¦d¸xã¥0ë$eˆêuÈO·2:—ö(ŠQÄG÷�ËTfŒm#ŽA'%Ëˆà¶^êŽŸNet-®¨ZÈ^ÈVÈà2•Ö½{wýé§ŸF¤:’MÚ ®Pgüt)£cbü "©ô[¶ìª@îîc`!A <¨#9v‚R§¨[B)@€2þv5µk×ÖO>ùdyõ/¿Ub¨Ô¯Þdt‰:%”"†@V.vU(÷‡Ó4÷ý	D€º@�ð	ÝEÝ¡Q—„Rˆ ƒÔ
v5<§k(F­ªÜP¨~:’Ñê�PŠhÙ§€ËT2¿õ°�¸r[@%.=ë>Ç÷>u…:Ó,TÔF¸N»L#°ß~ûék¯½Voß¾½›Bå*:ëšuÎº÷Ó‰Œ®Pg„Jnú5˜‰ÊT<œ‹èÙ³gW.K¨„¥e³®ýt £Ô{“Ž…J�Þ(ÏÇà2J@¿}wß}·¦[*¡ÒB€uÊºeûÕ}F'¨B• �Æ(ãó`_e`¼¸¨|Ê•–™%³4¬KÖi®úÎèuB¨!ÀnÞÿ¯—QÎßxã�šNA…Ò‰ ëŽu˜cnŸuÎº§H— TVê„‚ÿ\¦àµN�:é_|±RðH›ù3Ø
ëŒu—«^3uÎº,ƒW‡M`_¥9ãŒ3ôÜ¹sÓf•N^Öë*W=fê˜[xm¿’8,:ãï?Á¾
D¿ó]t‘±�Ò•ÎZC,ðÒ¥K­ºaåª¿LÝ²Ž…�œì‹_~^
öU&øþ×7Üpƒ^µjUˆ*,I‚ ë€uÁ:ÉU_™ºd�²n…�¼à¨0=¾ìû*WãÆ�õ˜1c4Ü’¢»òLsbÏ:ÈU?™ºcÊ?@*�^xì5pNEkÚ´©yö‹/¾(B¥åÑ| ÆŒòKÌË«“L�±î„�¢à4’LçT¼úõë[1íL.ÍÇPJíbÊx�Ä¸¼:ÈÔëJ¦ö ‚P¸TCrç€?çTD†‰æ³±cÇÊ:‚"Z"ÎãCbézÛ‹?ë„uÃ:Œ"P©Ÿžö*¢ëü°Ã³¢ÕÎ™3GÖäÑpŸX1Â/±«ßL°.X'B‚@¤PéF€§�ËUVÆ«g¨pD•‘Pá>Ã§bD¬*Â3ƒ9±Ã…’|'Šœû¹*8=<<\œ“°4UõèÑC�tÒIêøã�W:tˆ,¤uN¡"þaÏž=ê“O>QS§NU&LPèÂÐngd&‚ÿžþ,TÒ ^ŽG»àúÙà3ÁÍrÜc_®^½º:ê¨£TÿþýÞ~ªsçÎVÌ{û†:øæ›oÔ‡~¨Þ~ûm5yòdõÑG)ìÒË§„+qÓßÀÏ�çæó€Ü“Ò ä‡S!w„‡ØætT¹½ün<Ô¨.]º¨ž={Z½„¶mÛª†fNÕÿõë×+†oçÛýý÷ßWX¦«V¬X‘oø¶ç§wmò­ÿ5X(d¤ÐÉuÄu†4?Ì¥¨y­Hƒ“JÕ¨Q#…Á0«gÀžBûöíU³fÍ¦Ã<Ú ©øé»ï¾S7nT+W®Tð©o½Ùù¦‡¿=… 
Ÿüù
¹7r4ÿ`®½X 2ˆ€4 ÁõIšÛ|x ˜»ÑM[í³Ï>–ñ·hÑBµnÝZµiÓF±×@ÆrXë7¬‡Wü´à½aƒc²«¾mÛ6ËÐw‘or2æ¨Å‹«åË—[¿ñÞ€´÷Ï¿	ž žþ,Ò D rŽ,ØîîæØ?
¦ªU«*x¼Ql Ø4hÐÀ:®W¯žª[·®ªQ£†Â»Âœº99Û@Ðh1ý¦¾ýö[µk×.7ÙjóæÍ
óð–ÑoØ°Á
¶Ê€‘—0³HbwžßòîJç›Ábô !j’ jÄsçÇõêl8^@WÔl€K�6 4ò`~×Óø×€…bF@€˜+ œì›â·v`~2tÏóZmp’i+„[þ<Ì.=�yM(aH�°
)Gœêø�½„VàÃÀ2ÿ›à?§	j�«€£ Î¿oÓ¥Ö—àÏÁŸdþ/Á¾ÝóšßÃ}B1" @Œà‡”5§ë�Ùf/¡Qæ¼>þ×³qà}ô‚CæøÃÞàì(!Gî~ ó;œøä�`ùfðF0�ý+0ßäë2çô Äû„RŠ€4 )­¸Ä¦±sú‘Lã'gëŸótl ÈœŠ#ÎÇ3B‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  ‚€  E"ð¿¶[#R¤aÂ    IEND®B`‚ic04  ¶ARGB’ %g‹‹g%… ‹î�ÿî‹‚ ³…ÿ³�  ‰‡ÿ ‰€ "ï‡ÿï"  d‰ÿd  ‡‰ÿ‡  †‰ÿ†  a‰ÿa  í‡ÿí€  �‡ÿ �� 
ª…ÿª
‚ 	€è�ÿè€	… [€€[’ ’ r‘‘r† ŠÒøÿÿøÒŠ„  éÜ�ÿÜë ‚ „î;
“ÿÿŽ
?ñ‚€  &Ðã ^ÿÿW 	çÏ&  i÷ýœg×ÿÚ`e þ÷i  Ž‚ÿÛeÚ�ÿŽ  ��ÿÝeØ‚ÿ �  göýœfa×ÿÕf þög  !Îã \ÿÿW 	çË!€ ë;
“ÿÿ�
@î‚ ™æÝ�ÿÝç™„ €ËòÿÿòË€‡ e……e“ ’ r‘‘r† ŠÒøÿÿøÒŠ„  éÜ�ÿÜë ‚ „î;
“ÿÿŽ
?ñ‚€  &Ðã ^ÿÿW 	çÏ&  i÷ýœg×ÿÚ`e þ÷i  Ž‚ÿÛeÚ�ÿŽ  ��ÿÝeØ‚ÿ �  göýœfa×ÿÕf þög  !Îã \ÿÿW 	çË!€ ë;
“ÿÿ�
@î‚ ™æÝ�ÿÝç™„ €ËòÿÿòË€‡ e……e“ ’ r‘‘r† ŠÒøÿÿøÒŠ„  éÜ�ÿÜë ‚ „î;
“ÿÿŽ
?ñ‚€  &Ðã ^ÿÿW 	çÏ&  i÷ýœg×ÿÚ`e þ÷i  Ž‚ÿÛeÚ�ÿŽ  ��ÿÝeØ‚ÿ �  göýœfa×ÿÕf þög  !Îã \ÿÿW 	çË!€ ë;
“ÿÿ�
@î‚ ™æÝ�ÿÝç™„ €ËòÿÿòË€‡ e……e“ ic14  ”m‰PNG

   IHDR         ôxÔú  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  @ IDATxì]Ø5ÖJï½÷"H”¢((MuEÅEQ»Øq­ë®.kÇ
è*‚€í·+ØP@”Þ{¯2ÿyG>Eýî$·ÌÜÉÌ{žç|÷~7™”7™œ“ääD) D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€�¤È“ô|€�0"€w9¯ðáù0ùÌaü^à�ß¿!t@x¿ð/¿ãsÏÁß–ÃøŒ¸Ž0‰‹ `qã±è‘F ïfþƒ\X>Kä2‡|/!ß‹ÂÅå{Qá‚b¤¡Ÿó¾ã3‡å«+Ì!Ðs„:>!è÷
ïþo—ÿ·
o;„·È÷MyÃ!ßwÊw¤ÎI[¾’ˆ 9BÊÂ2�¸!�O*Œ™9„zåƒ\A>+ò%ùŽpur|â™0V 0ä(PV	¯<È«åsÍÁßVÈ'ÂñÌ>a #@ `À™],€ /)\K¸¦píƒß«Ë'³û"Â˜½ç,ËË×H¶°Š°C«Kò"ùüYx±0¾o¦b  �ˆ€_PðY¦G ¼!È«	CÈ×n(|„0fø¥…¡D]ÈKS"(ü…±j0_x®ða(Ë„¡8 ‰�4 �&€|<Ö`f_]¸®pSác„	—Æ²=íHé# £Cl¬þ^xºð,á…ÂXAàJ�€@"É"@ YÄ?Î`�Ù<fõGCèCÀìÊ )8 ô±J  ÊÀa¬`Õ +$"@4PÐ ÄàX#€åz,å7>Iø(ášÂÅ…IáC`«i±ðwÂŸ	ÏÆÖ¶HD€ü	* „ÿÆXØ×Æì¾íÁOìãSàØ`u`ÒÁÏŸä'HD öPˆ}ˆ= 8f‡%ýöÂÇ	7./z:üðÃUáÂ…UÁ‚U�~ã¼yó*0Â*¤Š-êÆË—/Ÿ:ì°ÃÜßsÂQÉ_~ùEíß¿ßý<pà€Ú·oŸÚ¹s§Ú¾}»Úµk×oáˆ³gÏžßx÷îÝn<<o	­•rÎž,<A[8¦H"±D€
@,›=Ö•>Lj_KøxáÎÂ-„aÄƒ=êâÅ‹»B¾L™2ªzõêªB…
ª\¹rîÿ¥J•RàbÅŠ©"EŠ¸‚ÂñóçÏ¯�„<~ž<©½æŽã((üP
öîÝë
|(à;v¨mÛ¶©M›6¹¼aÃµnÝ:µfÍµtéR…ÿ¡H€·nÝê¦!8‡…`X#ÂiÂ)Œã‡<a  �â�@j#C<°a-£ƒ@©
„üIÂ�„[cæŸ5‚ÐÎàUªTQuêÔQÕªUS•+WV•*URåË—wÃq!ÌSäAWŠ”(9ÊÁÚµkÕªU«ÔÊ•+Õ²eËÔO?ý¤V¬Xñ›�¸Y&¬LþDø3a(pRD"‘E€
@d›6öÃŒûù˜åCè·Æñ¼@	³ñ%J¨Ò¥K«¸‚¾fÍšêˆ#ŽPø¬X±¢»D�åú8¶°Å°zõjµxñbõã�?ª%K–¸ŠÁ?ü 6nÜ¨¶lÙâ®:d7üJÊ V`7°_˜D"… €H5gì+ƒþ\K¸ƒðiÂú�íçc	¾dÉ’ªV­ZªqãÆªnÝºêÈ#�t?1«Ï™ÉK™H	ÈY9ÀjÁÂ…Õ¼yóÜÏ9sæ¨E‹©Í›7»Û	÷ãgØ@'ü©0¶	a°* Ö7!+ Àé„ýÂ]„q6ßwÂþ;–ï›6mêÎî�9æWðcV�½xRæ€V LŸ>]a•`Ö¬Y¿m#d.'Ï”–Jè‡Âï
C)€s"°* Ö6]ìŽ%þæÂ;ÈGÊg>aßÖô6TGu”jÑ¢…‚ÀÇ2>öéalG
'Â¾ ÛP¦M›¦¾ûî;5wî\wkÁç’ì“ôç	¿s�¿•On$» `W{±´JUN>Gøxa8ëñ…°d�}û£�>ZµiÓÆý„5>–ùIáC Û8}0cÆõÕW_¹ŸX)ðÙÀN†p‚àuá�„W“ˆ€P°¢™b_HÌöq\ïìƒã¾Œñ à1»‡ÀoÛ¶­»#>’}Àˆv“&MR“¿š¬¾™ö�« øè· Æ‚od/äª€}Ý&V%¦«æ¶®²˜jÃ˜ï|á¶Â÷ÈÃ=ìáCàwèÐA5oÞÜÝ×—¼HC Ç¿ýö[õé§Ÿº+°!€?áyð%ab•€DB‡ €Ð5	$Ôî*|¡0fþXÈÁx¯Y³fª}ûöªS§N®¥~Ù²e3–>
?ë×¯wO|òÉ'jÂ„	jæÌ™®O‚—+ X	#üž0N�ˆ@h š¦`A�†Â	÷®)œ1‚U~“&MÔi§�¦ºvíê
}Zêg^«Â	¾ÿþûjÜ¸qjöìÙ®÷ÂWj±¤÷Šð(a¸ &�¬#@ ëMûÀNKáÞÂÝ„+
g„ à±¼ß¥Kw¦�å}ö‘ˆ@"`0ˆm¬|øá‡îQC(¤Õ’Ö[ÂÏ#lÍE
RVRÄ ±µ¨:ù¥¬'÷>Uûý!8ßÁLƒ>ß#�d€§B/Äª N‰2H°x_øYá/„÷
“ˆ@ Pnf&àÊ]8ë�àï(\H8m‚Cž“N:IuëÖÍµÞÇÅ9$"�)pÁN¼õÖ[ê³Ï>se(í]’Îxa(p2Ä«ŠR0Pgæò«àÇùýK„¡ ¤í´×àâŒþ¹çžë.ócæO"~#€• l¼úê«®¯\‹œ‚s!( ÏÃŸ@F•tHD !T BÃ€!€=þÎÂ×
cÆŸ¶àÇ•¸0ä»à‚Üã{Ü×TI�# {8zá…Ô{ï½ç^…œ�B@ÀŠÀcÂÓF@@ ùƒ  peªJAðc�ÿráÓ…ÓÚˆ‡«]XñwïÞ]�qÆîwºßTIYG n‰qràÝwßU¯½öšû¿¥IÛåù±ÂO	ÃF€Š€€@Ê,T 2‹'Sû�¦òqµpá´œ÷à:ÝÖ­[«^½z¹ûû˜ý“ˆ@XX·n�k'0zôh5uêÔL\g§B8>ø¤ð¬°Ö›å²* v¶[XK]K
v…0Îò§e…÷»Xæ¿ðÂÕ‰'žÈã{amq–+W°=ðùçŸ«1cÆ¸ÛpKœ&­‘çáC`˜0
¥	&ÿ* ì	™@ ×ñöÆ¬ÿˆt,_¾¼:ë¬³ÔE]äÎüáŸŸDlE ÷`%`Ô¨QêÍ7ßTk×®M·*ó%¬¼(ÌëˆÓE3æÏSˆyH³úäyÜÊwƒð1é¤U£Fw™¿gÏž®—¾tÒâ³D ŒàôÀ‹/¾¨°=°dÉ’t‹8],Œ[÷¤›Ÿ�'T âÙî™¨õq’ÈÍÂ¸¬'eËþÚµk+ýÞ½{»7ïe¢`Lƒ„ÜPøüóÏ»ÊÀÏ?ÿœNQqb —= <9�„øl< ÏvO§ÖUäa,õÃº?eï}˜ñc¿_¿~ªV­Zé”‡Ï+X´h‘>|¸k'�æŠ ¼
â´ ¶VX	�¨ dv+3Å,ÿ\á[„›¤ZƒÊ•+«¾}ûrÆŸ*€|.r,X°Àµxî¹çÔÊ•+Ó©ßlyø>áW…±:@"žPð„‡�h,Ÿ…q¬ûþISéÒ¥]�}—_~¹{oÒ	ð"qp%ñSO=åzÜ¸qcªµ…= Ž>(<'ÕDø\< �vNµ–Xâ¿LøáÊ©$‚ùà¼çª«®R­ZµJ%	>Cb…À×_­†â:Jã&B,%<.ü´0¶HD€cÚIL¸$uRá¼yó:§œrŠóÁ8û÷ïwHD€˜#€wïÞ!¼K©¼ƒŸÁ;Œw™Dþ‚ W þIìÀ¬ÿFaúá{Ò„+xèºì-T¨PÒÏó"@~E`×®]®‹á|Ð½š8E\° Á‡…¹�"ˆQ|Œ
@[5õ:�"�Þ)Ü&•$ªU«¦ úôé£è²7ùÈ¸9r¤zâ‰'Ô²eËr�¤ÿõK‰òáôQ#ÐÍZZY_GÌôoÆyâzúèŒ�Yþyç�§†êzñãí|Ä‡ÿ�tÀ;uüñÇ«N�:©mÛ¶)œ�m‚d“­.œ.\Dø[áÝÂ$"@bŒ ,ó>NiŸñØc�uÆ�Ç}~óí]Æ$i! û ¼sx÷R}o¾ó´Ê âL\ˆoëcsÎ|`)|T²0T¨PAÝzë­
{“Íš5S¼š7YŸ¤† Þµzõê©¿ýíoªdÉ’êûï¿W¸|(Iª%ñ»
ï†ÿ€¤—ä’åP°¼S,~y‚gû“º®ƒO·nÝÔÓO?­zôèÁ[úRl >FÒE ÛíÚµS:tP°˜?¾’¥…d’Å»% ®0¶6	“b„ €5¶TFŸç?+|’pRtÄG¸3þ»îºKÁà�Dˆ@ö¨T©’:óÌ3U�:u.Ú°aC²…‚£¯“…Wÿ�ìÃŒo/T ìm»dK^Z¸Gø^áJÉ<\ @÷z^x)ÃlCÎ%'ó8ã"à3x'±wê©§ªíÛ·»Š ®"N‚ÊJÜ3„K	OÞ%LŠ8T "ÞÀ«×\>‡÷†OcjÚ´©züñÇÕÍ7ß¬Ê–ÅA"D ¬Àåöé§Ÿ®5j¤~øáµfÍšdŠŠ±G€a8K+¤#@ Â�{°jXò‡;Ðc’©jþüùU¯^½Ô°aÃT›6mhä—xŒK²ˆ ìt6l¨Ä‹ Ú²e‹š;w®Jr5 ‚…áNx^«Â¬}F€
€Ï g1ùÂ’7Œü®�L9ªV­ªzè!uç�wª2eÊ$ó(ã"J•*å®À^gÆŒjëÖ­É”[†Ø€UátaÞ.( D�¨ D­E­4ø¡ÂW	çÿõ'ýß<yò¸ÆDÏ<óŒ»—È£}zÌƒ„¼ÃÍ›7W;vT«V­rO
$Q^l	´n » º¢DT ¢Ôš¿Öå$ù!ÜAVÿF„™þ¿ÿýouß}÷ÑÂß1F"ö P±bÅßü`5 wÆ�†Â'
ÿ(¼X˜¨ D¤!¥‡	÷&\GØ˜àbôÙgŸuÝùæË—”� qŒHˆ@vÀ»{0|$y§@E)=|``¦pR$>)„Pa£¤P¤bòÌ]Â÷—0}Çû.½ôR÷îq‘ˆ ˆ>Õ«WW]»vU;wîT³gÏNÆ@wt†Ñ¯…áE�d1T ,n¼ƒE//ŸO	Ã­¯ñýòåË«Ç{Ìuç[¬ô qA hÑ¢®�'OžœŒ+aŒ1m…±Ê8Q8iÄò)$PIC¤XŒ¦òÜ3Â¸áË˜ä×•/\úÂð�Dˆ@üÀ»çA­Zµr},_¾<Id-Æv@RÎ’É„qýE€
€¿øú™z;IÆ~Æ7zÁ"øüóÏW°òoÒ¤‰ŸecÚD€X‚@Íš5ÝÕ€Õ«W»%qŸ@-©"Œç/±¤º,æ!P8‹¾^$eÅÌ¿¦i™qkØ½÷Þ«î¾ûnoa$"@ˆ@Å‹W§�všëísÊ”)j÷îÝ9AºÏrá4áµÂßé"3<\PW{èJKÿ„†Ïn#Â%!ðãß»woúñ7BŒ‘ˆ@üÀ}Ø„Að7ß|£6m2¾Æ��…a8U˜'ˆ
€­ôkay{�ð?…þú“þ/€Œ9Rµm» DÀ�úõë»—~á¨à¢E‹¼#ÿ
‡cð=RXøKáýÂ¤�#@ ät°x˜í?"<@« Z‚�O¿~ýÔÐ¡CU­ZØª#"@ÌÀ)!Ü%€U€™3açgD›N†Ï€IÂÆû—”¨ dô$³Ä1?¸õíeú\Á‚ÕwÜáîù—(aìÀ4yÆ#D )RDuéÒÅÝ6„]ÀþýÆ“ú£Ì:&
ó˜`ˆû
€7Ž­†ð³ÂÝL‹Y¡B÷|ÿ5×\Ãý~SÐ��\€]À‰'žèºOÒ_ Ž	6þBxK®‰óÇ¬#@ ëM�° õ$d„p§„1þP»vm÷ˆ_÷îÝy¾ÿOØð_"@RC Ç_@ãÆ�]§AIbÃj l6¦–;Ÿò* ~¢›zÚGÉ£c„�5M¢E‹jôèÑ4ö3Œñˆ H
�ºuëªvíÚ©éÓ§«•+Wš>‹ULØL¦Ã SÔŠG   “È¦¹Ä}^¸™é30Ö>|¸jÔ«n$"@ˆ€?TªTÉ=!°`ÁµpáBÓL*IÄ6Â8"¸Úô!Æó* þcœLp­ù‚°±$ÏñìWµjÕdòa\"@ˆ@JÀ‘&p<gœ Q‰u¢0VV=ÁH¾#@Àwˆ�38NbŽ>Òä	ìËÝxã�ê¡‡R¥Jû2Išqˆ  ž.\X�|òÉjïÞ½
'©¬ÄƒC’ÂI]<`˜>£%‰ €$ó)zKIw´p}“ôq¯÷?þñõïÿ[á¨‰"4¸N6p• |\ãhÆ†é2J
PH´?’#ü�0IÂÿž{îqÏùã;‰"�-pL°}ûö
ÊÀçŸî*e)#q À&€J€`~E¡à²féÂÐM¢c¶ÿÀ¨ë®»Náf? D Û`;²M›6îVäÄ‰Õ¾}ûLŠ„í l{N¦a 	b>Ä¡à¨†Iâ>Þ…á,CKE‹UƒVW^y%ÏøkÑb"@‚D J@ëÖ­ÝÛ?ûì3×6À x9…MÀ$aÜ&H
* ~0»ò9Jçýµw¾�?þ¸ëÛ_™ˆ  YBà˜cŽQ•+WVPöìÙcR
(­„á6x½ÉŒ“9¨ dKÓ”ªIÄÑÂ­M(S¦Œ+ü/ºè"“èŒCˆ È*Íš5S8–Œí€]»v™”¥²D‚ÇÀ�…·š<À8™A€
@fp4M1àÛ¿½ÉþÃ†S8ëO"D€Ø‚@Ó¦MÝ[H?ýôSS% #�þTx»-õ´½œT ‚kÁÒ’Õ0á¿™d	gC†Q=zô0‰Î8D€�P! Ï¤Õ«WW&L0UêJj
"l´t ñHi @ ð’x´°Ä}XøB“gŠ+¦}ôQuá…FÑM’d"@ˆ@àà!ÜPŠ• 82 œˆÂ1ÁñÂFÇ	Òd”PH LÎ+iÝ#|µp]º°öä‘GTß¾}uQNˆ =°	(W®œ»`¨à>”üÂ„„¾‚�
€ÿ�w“dq»°k8ÓÀ9ÿË/¿ÜÿR1"@ˆ@@}ôÑªxñâîJÀ/¿ü¢Ë¥ÖÂØÀUÂ$ŸÐ
%Ÿò�K²}¤¢
ÐUŽ}î¾ûnuÃ7ðœ¿,†"`-[¶Tðˆ#‚ŽãèÊOg'¯ž©‹ÌðÔ �n&O�"‘†	—ÐE>üðÃÕm·Ý¦n½õV…ï$"@ˆ@Ô€³ c�=Öuüå—_š(ðu%`¶ðÂ¨á†úPÚøÓ
8Î2Z¸ª.y¼×\s�4h�¢oZ'DÀf0ÁiÛ¶­Ú²e‹úúë¯Mªêc…?¦£ Ä’ˆC 	°£â<ësÂ0dÑRÿþýÕý÷ß¯
,¨�ËD€Û€pÂ	'¨µk×ª3p3°–p„®Óq2€Ž‚´p™G `Ž•ILÜÍû¸ðé&‘O9å÷¬É’%M¢3 D äÏŸß½@höìÙjáB£ÕýRñŠÂóx`†z€)É Ëÿ
_j’$.Î5j”ªT	ÎãK°Þ¿¿{ƒnÃ�â0¢-D|ûDÔj~hÿFÏéãq¿Ñ³páÂª]»vjòäÉjÅ
Øúi	« X*ÅJ€ÖŠP›#èÏ¥#c øŸ†áŠ'qÄêå—_VÍ›íx¦eCàŽ;Ô¦M›Ô²eË\^²d‰Z¹r¥Ú¶m›Ú¾}»{iHŽð‡ƒ"•-[VÕ¨QÃõ(V­Z5÷<1VLâ>xÚÐîq*ãæÍ›ÕúõëÕÒ¥K]a¶xñbw‰}ýçßÑÇaóƒþ�0ú7ü~` �yèß`¸ GX\èÛo¿Uç�wžš?¾I•1û‡O•ÿ™Dfo´Ži¼gèA:Ëç‹Â¸ãÚ“àÂ¿C‡žñlÜ¹s§úùçŸÕ´iÓÜ=¾ï¿ÿ^Í›7Oa�Äa˜%Kð‘ ;‰š5k*xkÒ¤‰kQw£PHD H`Ä†>=uêT5sæL5gÎw)—ß@ØsûCq¡ �Cð×¯_ßíã˜ ´jÕJÕ©S'ò
<B	X·nÝpIðŒ{
œ œ?"@À(�hGHØ[Â°ü÷$hûO<ñ„êÓ§�g<1ÓÁ@øá‡ªI“&)ìíaÖï'a• 3§ã�?ÞU¨`]Œ‰ø�ÀªU«ÜåêñãÇ«¯¾úÊøXÁò“p8,•wîÜYá,}©R¥üÌ2ki�9R0À]4(Ä<‰ÓMØhÙÀ =F!I#P\žxWûQZôŸA21ˆÉLß‘K‹œO<Ñ�¬ÅÀ§TâÈÊeÀ¹îºë¹†Ô‘•†hÍÚdÙ³wd%Ë?ŽbGlS²ÖÇe…ÀÀyðÁ�¹sçf¿3Å™Äû�±c0‰d�A’«Q‡½ôÒK�Ý»wûýþ–>Å+¯¼Ò‘{¿�êoŠS&âÉJ‹sê©§:²ÕâÈþk`˜0£è  rÜ¸qN÷îÝ™q‡®�Ë;ŽÜâˆW½è€.5Á‰±2‰q c0‰ŽÀY’#Î¤j;ëÉ'ŸìÈÞV$^Ôï¾ûÎ‘e:§|ùòÚz›`ãg1¶r€ý«¯¾êÈRm$ðg%üE@öï�±cÇ:gžy¦S¨P¡Ð÷q1ˆuz÷îíÈ–„¿À˜:ÆJ¼·†cÆ`ŒÅ$"0ß_*¬í¤X6ŒÂr�X5;·Ür‹#FŒÚ:›àdñ?îÈþ©óÑG8Œ1+Û�ãhÎ9çœãˆ…¾u}\lœË.»ÌùñÇmƒ=×òbÌÄØi8N`,Æ˜L"¾#P^rÈ9‡êÙAå8�õBG¬š�áÃ‡;6ô¬«`úpl\qÅÎ¢E‹rtøc<X½zµsûí·;rš$ô}X÷žÉ)gðàÁÎÖ­[­oL(ìCuu>Ž1c3‰ø† œý<!¬í”0zì±Ç¬~	å˜“Ó£GGÎÜkëk‚IXâ@™yå•W9Žhuû°ðé# §VœãŽ;.RýïV¼äˆbú e9Œ¡I^bl¦s;�äJ²{„µfšØO´‘ ÇŒãÔ®][[O,Âû»0bÄì�?äˆªsÇw8rî>²}¼bÅŠî$ÄÖq½eÇXj8†`lÆM"G ‘¤¸HXÛÅy‡#g†­Ua5×]wYa eÒº8â�É™>}º•mÅB§†€øžw�üt}#
á˜=_}õÕV!c,Å˜jØ£1V“ˆ@ÆÀ•”ïk;a•*UÙHxÑÄ—¶Ž&8Øû¦ï½÷ž�MÆ2'‰À”)Sœ¦M›Æ®�wêÔÉ�Ï[	c*ÆVÃqc5ÆlÈ%•ýÂžÖÃ#FŒ°òÃ~ÇŽ=ë§«¿Íá0 ³µí¬ìpY(ôØwÇFz[K÷þµhÑÂj» ¼Ÿ†'40VcÌ&�´h#)À÷´V8^{íµŽÜü•…¡-½,q¶?Ž³¢?·i‘"Eœ'Ÿ|2=0ùt(€/ˆ$,ÊµïúŸûŽ-ÿ×«WÏ™0aB(ÛHW(Œ­c±Æ˜�±›DRF ”<9AXÛéà
wÃ†º>ºp¹‰Ë‘‹u´õ3Á 
q`(÷5„®�X Ô=z´Sºtiöñƒã¼w~òÉ'©šÅ'1Æb¬5k&H<Œá$"�4¸(éamg“ë<­ôÄgÍš5ÓÖÏƒ(Å�¿€¡C‡fq˜cÖ™BàµW_¥+ßl¿/rÃ óÅ_d
æ@Ó�×CŒ¹†bç¥w)9ºJôÂžV¶ÿûßÿ}2‘Ù²eËœÖ­[{ÖMW÷(‡ãb#…$Ù‹Àûï¿	ç>~½gð´'×[ÙÀsý`ÇXN"ÆT‘˜_k$åÀ[žM$W÷ÆÒÚß¤=�ƒWl]*µ©?úQÖY³f94Ð¾¿‡¶w¿ËÚÎÊ•+ýh_ÓÄ˜‹±×°Í0–cL'#–XÚÎG9óçÏ÷µ£g:q\oŠ«MMêÇ8Ê9ê¨£è:8Ó�Ðçô’Ü'Žý»pÉ%—Xé´coÎÊ0¦“ˆ€�“%ÆaÏ�ÇQ`\d½ðÂî×Õ�á¿··nÝx› %}ß¾}Î5×\Ãþ­¿}¿qkæC=dIÿ±˜ƒ�bLÇØN"	(+!FKÿ_|±ƒÁÆ&‚Å­Zµ88&18Jpñ²u€´©f¢¬TpW^sú¯î×
Oœ81Mhƒûöík:¦alÇO"¹"p—üªíLX¶mß.~O=õTmÝLêÇ88Cn«Õt #r3[°`A2KÂ|þ4ÖáR$]˜¯X±ÂÝª3—0Æ“ˆÀ_h-¿¬öpDì�7ÞÈâ0—ZÖppch5ëY>Q‡;Õ-[¶¤Ö |ÊWvïÞíôéÓ‡}W3~éÞÏ�ZyK&ÆdŒÍºúI8ÆxŒõ$"ðåÛ»ÂÚ„ýEÒÙD?üðƒ÷&õcï>0dÈ›š>6e}é¥—L÷‚ùxŒs%J”°Ò§	Æä$l?0ÖcÌ'�>òw¯°çàÐ¸qcççm"¼¸öVW7†{·}>p¥Š¥fRxX»v­Ó²eKöqÍø•Ó‡uŸg�u–uG›Ñ16cŒÖÕOÂ1Ö÷&UC0˜-ìÙq
,è¼øâ‹áõK‚[´J•*åY7]ÝþÇ¾qã�7¢ÏhA ðàƒ²kÆ¯dÞaQÚ¸Í‰¾†1cµA}1æ×&Å¸ˆ|\XÛazõêe�Õ?,d{öì©­›Iýç÷>A¸@‰”}/^Ì“-ãW²ïo‡¬<úŠ1cµa}1öÓM°€Wj+ß,ìÙapy†�.3aµ^¬X1ÏºéêÎðÜûÆå—_n¥±TöEvfK0hÐ öoÍø•Ê;Œ³õ¯¼òJf+ Ô0VcÌ6¨7Æ~È€ØÒa±­¹RE¥îw
—ðÂ Ož<ê¦›nR�5òŠÊ0ñe¯Äío(Ëf{¡d‰TÍ›7ÏöjX]þÕ«W+qleuÂZø½{÷ªáÃ‡«={ö„µˆ	Ë…±c6Ænaì‡€,ˆ%ÅY¸@Z¼ƒ®ÕÛ·o¯ÄÑ„.ZèÂe‰Z½ýöÛ¡+WT
$†gJfHQ©Ž•õ æo³Mš4I}ùå—þfâSê³1vd dA,)®
@eiíÂ‡{µºÜ§n¾ùf%Ëè^ÑBöúë¯+qêÊ²E¥Po¾ù¦Z¿~}TªcU=03E—Ue«ÊmSaåÂ…>n#aÌÆØ�1\C���	±£¸* —IKk×ô{÷î­:vìh]§Ø¼y³z÷]u%ù‰ÀÜ¹sÕøñãýÌ‚i'@`úôéêë¯áÙ•ä'r¥²Zºt©ŸYø–6ÆnŒáY ™;Š£P_Z¹¯®¥kÔ¨¡®¿þz•7o^]ÔÐ…óÍ7Jœÿ„®\Q+�øXPcÇŽ�Zµ¬¨ÏG}¤¶oßnEYm.ä¢E‹ÔÇle0vcÇXn@�	�±¢¸) ¨ïUÂU½ZY\æªk¯½V‰Ó¯h¡Ã’è‡~¨Ä5j(ËµBa�tùòåQ«V¨ëÃÖqãÆ…ºŒQ)Ü�Vði#aÇXŽ1]C�	�±’‰±ª¬4ná^ÂžÔ®];Õ¯_?Ï8a”»ÐÕ{ï½ÖâE®\K–,áRtÀ­
W®pú”)S¬Vr1–cL7 ÈÈˆØPœ ¬å_-\Ò«uÅ–»lT¼xq¯h¡›={¶Â²)03ÁdÆ\\¦N�Êåÿ ûN¼L›6-À3›Ærl`l×dd„}û¾šŠ%
Ž“p¢€pF" r~ïÖ­›:å”SrþµîKÒ\þ¶Ùäu
¤€ ‡Â…ãi¤àïzîq@›O\`LÇØn@��± ¸( 8ÍÎóLˆøÌW7ÜpƒÊ—/Ÿ•�£´ï¿ÿÞÊ²Û\hØ ˆKZ›«`MÙ×­[Ç>ž…ÖÂ‰›�.1¦clÇ¯!#Y¡IÃšà¸( ˜ÒŸ®k•óÎ;OµjÕJ-´á[·nUØ%‹ …RpxÃû"–¤IÁ"€#¯¶ûÁØŽ1Þ€ +ì]6¨`N”8( E¤²W
{îëT¬XQ‰÷\¬ü\¹r¥õ/©�ÀcYzáÂ…6Ýº2CAÑ%‹ fÿ?ÿüs°™ú�ÆxŒõ‚¬€Ì€ìˆ4ÅAÀžŽÖô¢‹.RM›6µº±ñ‚îÜ¹Óê:ØZøùóçÛZt«ÊME+;Í…»¢pòc<Æz‚ÌÐÚŒ¤ê(QW `Ê?@ØsSŽ".»ì²P7”Iá,X ð¢’‚G ƒ#±÷wØ¸àØ%);DÅÎc½�s ÈÈ;�ƒv‘¨+ ]‡Ö:,à.²víÚºh¡§Cšì5ÑÆ�\0“üC §[xÄÕ?|u)ÃöÂV‡@‡Öc½¡‹`ÈÈ�ÈR” hnW{º€jØ°¡êß¿¿õŒÆh¤ì €­âï/öØ‡&Æþbì•úš5k¬¼8·:aÌÇØ¯!ÈÈ�È®DY8UNëÕ	×FV«VMÓÂŒ³º[¶l	A#ZBÌN‰¿¿�Àèç¤ì €U®¨lsaÌ7¼æ2²$’U ¿´VaOËÿºuëª=zD¢a© d·© ø�?V ¨ ø�s¢àf<*
 êˆ±2@C�!}„!S"GQU N�–Òzsºä’KTÕªž÷YÓàû÷ïç	€,¶ÓŽ;²X‚èg%ýœ”€”0Œý�Y™9Š¢ �­ZÈ«µ°ÿÓ«—ö^ ¯$B€(iç¡× 0°P'þ@¥Â'
Fhi@�õG£¦€AØ@–@¦x®(g½qR(@€–‚ƒÖrgA+Uª”dá|~º!„HÙA ‚‰øû‹=0¶Ù½¿èøŸzÇÈ C¿ �)�-‘¢¨) y¤uàåÁÓj³V­Z‘ÙûÏé�‡v˜µwäÔÁæOÜ7në¶àž7o^…~NÊyòäQhƒ¨l 4™ÙŠÚÛT[ZFë½©gÏžªfÍš‘iDT£Áu—‘ªs˜*€øûÛ"P°¨ ø‹±WêP ¢¨äB@&ddLd(j
 Lú«xµNùòåÕ\àÅÊ0¼˜E‹µ²ìQ(4„±bÅ¢P•ÐÖ¡páÂ‘œ�†ð?ãK T2²AC�-Ñ86v°¢QR *H�.Ô4 úÛßþ¦ê×¯¯‹f]8^Ì%JXWî¨¸`Á‚ÄßçÆŒ² òºŒ$_¶lY•?$OÃ¹2²Á€ c k"AQR à¬ÁS²c†�Q\F„`p×u$:m+€øûÛ2Å‹WÀ™”Ê”)Ùm.ÈÈƒU<È˜È8ŠŠPXš™g}:vì¨p'tTÉ`	+ªUÏz½Š)¢0C"ù‡ ¶ ¢àµÓ?„üM×èFu ÈA6@Fh2²2Çzò˜ÕŽŽó*/¬W±Ïåcê�‚G J•*&³‡à¡agap‹[„j®ªT¨™•ï\�…l€Œ08é Y£u4—k&!û1

 $ÞyÂžY³fÍTçÎ�Cf‹S¯^=U¨�§ÿ£ÌfÈÔ~CàÈ#�T8	@ò(·Çµü+@ŒSöGqDä€Œ€¬ÐddŽõ³­(( u¤!<%;:/ÎzFÝH®¦¬ `™”<uê ’üF ¾Û©hù�ò_ÓÇÄÂÀoþ_´ìÈÈ
ÈAæXÿÒGAÀÙLO—~X6<÷Üs5íi0l °
@
,M7hÐ ØLcš[“&MŒÑHÁ" ×¸¬¾@Vl5Aæh}ÎÛJÉçf»€ƒ××Uû´ÓN3iP]2¡‡!HR°`o”
@0˜cZ¹rå`2c.¿!Ð¢EU®\¹ßþ�òÈ‚ì�²–lW Žä›{¡¡‡ÙÍ›77Y¾Ê‰ÎÏ €½Q’üG Ç´Z¶ŒœKvÿ�K3‡Ö­[Gö`nÐ@f@vh²2ÈZ²]8S�/à…~Û¶m:o\è¸ãŽ£5zÀ�Ý©S§ÈzHJ£ìÚ´iC%×©ÌD‚]ÑñÇŸ™Ä,I2²CC�=�AÖ’Í
 ÖOñBÆB^xa¬œ‡`‰ôè£�ö‚…aD ƒ#”.Rpà¼6}^‡7–Äã¶µ‡S�§�AÖîIÙ¬  øZ^¯AíÚµM;x%a]–­N?ýtëÊmk�qüÛ.¤àÀ–K”z‡¤YNpŽG/—¨7dˆ† ƒ<'¢šç³l«�OPƒãfÏòãL'¼WÅ�ÐqK–,·jg¥¾ÀÚÀ}hVÊÕLá¨ÅÐH+ªV/ÿëÒ¥K`ù…)#Èß1�A�E�IÖ‘§ qmpþÒsS
÷Ì3­ÞžIþ†ÆÊî!e Ò|‚Ÿ‚(MS|ŠW¥Jž§SL™�Š –þÛµkwèO±úbà\²ÈJŸ ¶* �pÏÃÀX–…±P	.-Ï9ç“ý«8Â“±:ÃPˆKÑƒ3©„àx	J É_0Žà¦¸dˆÁdd’ud£ WwpÀàéª	š®�+ájK¬�üA žÂzöì+S�L-Uàþùç›ÌÎRË€O¹Û§†WäF-Èƒ•dÈ"È$ëÜ°Ú¨ %@{Nía°b°wÙN‹ŠÁ9¬XIþ Ð¨Q#[ú­qª:tˆõò´1P)FìÖ­\	v�%F��I�MV‘�
 îböœÚÃkè¸Óßÿþ÷Ø¸ï²­1ûì×¯_l<£‰m2yá¨Vß¾}MnoK&YÆànùâ‹/&‚ d	dŠ† “ ›¬"Û €¬ÝøƒæåkM{XÍš5UŸ>}L£3ž!¸-¬W¯^†±ÍO`„yÂ	'ø™E,ÓÆÞ?=.þÚô�%�)Ùä995H#Ð(¶) Og÷°nß¾}  †93( õë×s­*Ûa‡¦.»ì2^H’Vƒß‹n¸�·`f°=°}ˆ>np#^swR�)§N › £¬!Û hXÅ¼ÐÅRMî­öÂàÐ°êÕ««+¯¼òÐŸø=°ï|Þy¸
œN9åÚcd°1°ôOo¢2Å` ²	2Ê²IÀÒ
î`ö¤SO=•Çßþ„ÐE]¤ ¸Hé!€sÿ·Ýv›Â�á¤ð �/_>uóÀ›Mfhá)tHKÏ–W]uUHK—½bÁ%0d‹AFY³`“p¤ ÛÊ«Ê–-ËýÀ\ ‚WÀ;ï¼“‚+l’ù	3£“N:)™G7 ŽiqŒ«œøn¨DöeS @uë­·ªªU«ÚWø J[ÈAFAVYA6) '	¢žËÿ0Îâ~wîý‚‹[¹ccòë1Ç£n¹åî‹š€•¥8GumÒÀ¾wïÞÜÞòÀ²2FC�Q'iâ„&Ø ~–µw3Âa­ÿ÷­›nºÉt+q"1Á
Ê}÷ÝÇ%æ·ýÔ©SÕÕW_­¶mÛâR†·hØóÿç?ÿÉk­=š²ÅÀ)R€¬²ân [ ¬IdÎ­rŸ;:¿þ^ºtiõÀ¨jÕªyGdèoÀŠS§NVzúü­Qþ2cÆ÷Ìú¬Y³¢\Mßê†eíÁƒ«*Uªø–GT†Œ�¬Ñd•û(¶( ­PÏ›?pi…ÁÕ�šv‹~pãÆ�Õc�=kÿÞÉ´2ÜÍâ˜)œ@øÃ'Ã¼yóÂYÀ�—
”÷Üs�:ñÄC^Òp2²FC�U�Y¡'[ XVÂßrB‚�<ƒ‘ôœuÖYêŽ;î 5TèS÷Þ{/ýÍkpÊVðìÙ³Õ%—\¢æÎ�›­"XŸïW\ázS´¾"U 2ÆÀñdd)`½k{N"–½çÓO?uHæìÝ»×¹îºëbšë¸ü.)92«4”1E@„¾#Yì¿ã¢î]íÑ£‡³}ûö@Û-
™AÖ@æhð…ÌÒîH’�ã$|—pBÀÅe¥³nÝº(ô­@ë€—ÿ’þ—$ÄÕó(‡AøóÍ7�¶33G`Îœ9Ž8ea¿õuï§¬rÌ4ïrˆ	Y™£Á2²+ÔdÃÀ±‚ çÚþ±Çkr>3Ô‘�ÂÁ�êÃƒæ¥‡€_¯^=5bÄ¯_‡<Å¯A!ðý÷ß»ýuÚ´iAe¹|ºvíª†Æ13Å–…Ñ$dŽ† ³´‘4iøv åó¼é¾ÙiÀ’z?�w»ÇÜõþw'*Í›7W/¿ü²jÕÊÓßTê`óÉ´�™¿êÙ³§’Õ™´Ò‰óÃ\p�zþùçÝëÂãŒCºuo×®�‚ìÑd—6’&�Xã¼Ú|á„Ë-åÊ•sæÏŸÿ‡%þ“<»wïvÄ[ #ÞÀbíÕ¶‡‰a�#³Ëä�ã�  {ŒÖ­[Ç²ofâÝaåˆÁŸ³iÓ¦@Ú+ê™@æ@öhÚ²‹g®„TédypŸpB ;vìèìÚµ+êý-�ú8pÀyöÙgñ�o¯¶°5¬{÷îÎŠ+Á˜™$�À‚¸çï1êÞ»Â…;ƒr`øKÊ�9�=ì!» ÃBKa_žÀZl^/ôà¢•Çÿ¼2ƒÓ›~ýú©_|Q5mÚÔüAKc-ZÔ½#A”U¹reKkíb/\¸�{þi4qÍš5ÕðáÃ]ÿ8óOÊ�9�=‚ìâ~¢¤DÁPNÞN¨eI‡vÞÿýÌ¨tLå,Z´È'8ŽØ$Äß«mÂ&‘œwÞyçuæ?áB`ñâÅNÛ¶m#Ùÿ‚x?äö:G¼#†«Q#TÈÈ M[B†…}¢-EÁ/¥çþ¿¸´u–/_¡.®ªìÙ³ÇÝ¨[·®®“[ŽåPì…B¸�Â‹ÀÏ?ÿLáï1ù‘±1á;'.}�‡~ØÙºukx8%ƒì�òj‹ƒ2Œ>–ˆd©�<°G8!À§�v÷µx‘`ðré¥—:%J”HØ^í–09ºã¼ñÆÎ/¿ü jÌ"U~úé'Gn¯¬¯ÉV�#×à:r<Î‘m°ÀòÍô{Q¨P!G¬ü�éÓ§§
=ŸKØT@iÚ2²Œ”$7K|Opo»í¶$š‹QÓA ‚“&MrÎ>ûl/Xží¦k×L‡Ã±�u¤t:  g±õtÜqÇÖ 4Ÿ~úi·v;vìpF�åÈÍx�åŸ©¾.—U9cÇŽuöïßPK1  dÐ†�e¤$€/å7„‚‹½é·Þz‹½0`vîÜé¼öÚkN—.]ž^m”í°#�<Òµ~ærÀ�$Åì°ìo`Y�±>'Ž°œ'Ÿ|Ò�r{(­ZµÊyôÑG]E Ì+yóæuÚ´iãˆã*góæÍ‡V�ßB 2ÈÀNêu=ï²‘pÒ!”•ïs„¾ìr%£ƒãA¤ì €c0ï½÷žsî¹ç:h¯¶
2ƒ¢Xç:rã!íC²Ó5RÊuåÊ•NûöíëGP^ÑG¼hýúõŽXÐ;ð!Vß�•M÷¾”,YÒÝ®€"¾eË¯*0Ìg ƒÆ?È2È4’!8:±Y8áK'Þÿx‘…Ï�Û$yì§Ïœ9Ó¹ï¾ûÜ�R<&l3¯öL7¬~ýúNÿþý�wß}—Ký&¢8ðÁÐ¹sçÀú„9fþ¦¶ Ø?~¼sÍ5×88=b0ãËx] °Àÿü?ÿùOgêÔ©´}
IÿÅ}*�Ešñ²,”ÇÃº,q¡ 6Z8!áË¡C‡&g@ðÈª€‚�ö/¾øBM˜0A‰v¬ÄRVÉ¾dÆÜÕ«WW²ªÄ`L‰—8UµjÕŒçÃýE`õêÕJ75nÜ83:˜:ÎoãŠçk¯½VÁïE²´víZ5eÊõå—_ª‰'*Ù^R¨C¦	nfá›¢N�:
ngÁ¢ (1ÄÍtVL/M®¼òJ÷nM2½$|Œ&NàÁÉ¿Áq°ds}¢¬ðâ>õÔSJ,ÓEáïYF@fW®ðÿñÇ.p�wÜß¾qãFµmÛ6%š³{ÏRÂq	œõà¾‚âÅ‹»ƒa“&M”ìí«F�¹ÿ#œd'kÖ¬q�üÈyê@* n®•¬T)¹;#ù‰ûl%F‹J®&vû7ú9ú»¿sû8ú¹XŠ{æ…ýý¸T©RJV•¬2¸Ü AWÉ¥O³ø¿ÿýO]~ùåJ%¼ÊòˆÞà!aaT à4á#áŽ‰ Á-v²$çÎúÅáïáC +P doÕeñK®dS‰¿µoß>÷Â`Fc@”ý5%>·ÝO”p„¯â,Ñ_�ewÐËõ¿„ùñ„ÿÿû_WøûÕ‡   ØnØ°AÉ•±î'ú8~ƒ"�³†þ-÷É»J-ú8V³Àèëâ§Â�ê3M�-%Æ«J¶Š¼r/�p|À+RÐažnvƒ.ÌÁüÊË§çZn…
T­Zµ²T<f›*²�©ÄI‰Ë©¦ÁçìG òª«®RA	1U·ß~»ºþúëSZö7E+“PRÁ5kÖ4}Œñ,G ²2IN±xÕ2²-óûE^¹jÂÂè¢°¦”¹¢W¹±LÍ™Dˆ€]¬^µÚ½oâí·ß¤à˜mÿç?ÿq}á§²çH!™‰ÕälÝh*™VS'ðà0* ˜Ú{ZºÔ®]Û]&-fHˆ@Ê`ûG,éUPÂËìwÜq‡ºé¦›VHDÀ dB&i2-tËÖaT <¯¡ÃþÀHD€Øƒ öÂa´ûêk¯Rhüýë_îÒ¿Û$Of_ “lK<e[6Ð›€7µ™Ø_ƒ•,‰;ÀÌÿê«¯V¯¿‡hþfdr^^Ý|óÍŠÂß¼™ƒred“† ÛB¥�†M(. y®¥”.]Ú=þ¥šÁD€„ œò0`€zñÅ)fþr±gþ� ÍLr€¿È&A¶AÆ…†Â¦ ÀRÒÓºO<¾Ñ 04Ý‡!‰À²?ÎG%ü1Û‡ðÇ¾¿Árlâ‚3„$‰ !›4ÙæyÂMó|ÆƒÃ¨ ”ôª%4-÷�ˆ /p†sã�7ª—_~9�BBøÃÀÇý°@"A" ™Ù¤!È6*  Õ�0Ï··FD!"V üqÎ_n©¤ˆ˜íc¿.~áð‡D²�€�l‚l• Û
@]¯†Ãþž�–å•Ãˆ ð¸¿8p 3fŒ�¹üž4fþpð£?
ÿßqá·à€l28nê)ã‚.u˜ ”ÅsV–ô ta~DÀ¸zÆ²?|£ApìƒK}àâ>õID ›@6œ€Œ�ÜMAlìW÷j@\˜�²HD€„ø»‡ðæ™g)„ÿ7Ü D› @g&: ›.'ƒŒ�[˜€rL/�áG·Â‘ˆ ¸å–[n1¹5#…Æž?ü
ÀÅ/gþ�”‰d È&È(AÆAÖ…‚Â¤ À:ÒSºÃÝ"÷ùBÑoX"à"�³ì?tèÐÀ¹âŠ+Ôý÷ßOáâÌÈÈ&—À�q¡9	�×¤bÅ�êäéJ©jÕª<ßPc0" C Âgî±ç¯¹]—”Q8–ý!ü±ç�›%ID L`e
2JC�qÚeM›àYîÿg¬Ý™H�={ö¸Gïž|òÉ´ÒIæáþýû«‡zˆÂ?Ð7Pdd\h€0mTòj),¯ÔäÛ^1Œ‚ÀîÝ»Ý™�Ëþ¸HèÁ¤ð¤…™Iª@FlS{ÊºTóNå¹°( y¤ðž X¤‚Ÿ!DÀ�½{÷º·ì=üðÃêÀ�†O¥íâ‹/VÈ¯D	Ï[ÂÓË„O� `h¨Y™—u
‹€eÏó}EŠQåÊ…Æx2ëÇ� €ðÇž?fâAìù£~ýúõS�=ö˜Éñª á`~Dà/@FAVi²Îs»[ó|Æ‚CQ©ÎEVôª@5¸mÉ+	†"�"XöÇ±» gþ]t‘›Ÿ�s•kÅÇˆ@f€Œ2P  ë óöe6÷äSË
 ŽFx^T¡BU¸páäkÈ'ˆ H�ýû÷«»ï¾ÛõµÔ²ÿyç�§žxâ	.û§Õr|8h £ «4Yçyä]ó|Æ‚Ã¢ ”•yžë©^½º‚ßo Á! kÌü±ì”ðïÕ«—2d�~×ÌÌ)C@FAVi²2/ë–- Ü“ìy�—�V•u0Y "% ðqÃ€_~5­õZ  @ IDATù%�ª�}öÙêñÇW%Kz.RfBRAÀ@VAÖAæe�Â²€·Ýó6�R¥B�WÖŒ A  �?ûP ‚þXöúé§)üƒh`æá²
².n˜V <Ëb ªoÊ„‰@œ€À‡Ãìûcÿ?ÂÌN…Ê”ñ¼$ˆ¢0"�²
².3Ú°¬ x‚ <�VŸäÃDÀïƒŸý;ï¼3Pá�[)ü�šˆ‘BŽ dd–†<ežæÙŒ‡Eð4ˆÀ�_T 2ÖæLˆäŠ fû<ð€;óß·/˜JÝºusoäû�k“ðG@_6¸¥ÒSæUí°( žû!¸øƒ^À‚êÌ'Ž`æÿè£�º3XþA]ºtQO=õ”*_¾|Ù1"�U—UyÊ¼@
*™„A@<}|Â·rÑ¢EƒÂ„ù�X! kÿÁƒ»Â?¨™ÿgœ¡FŽirf:VmÁÊÚ� d•Á} �yY—¿Y/€€ ƒÏk€óçÏo¢QÙßsX"�`|wûí·+xû‚:vìè.ûW¬èéü3ˆ¢0"�q0û‡ÌÒdž§á»æùŒ‡A€wÏ * ik&Bþ‚ üìßrË-*ÈeÿÑ£G+\šB"QDÀP€ÌËºg»0( Ð‚<Ý"æË—�+ Q|SX§¬"0lØ0uë­·ª]»vRŽN�:)XûWªäyñg ea&DÀ/  @fi2/ë+ Y/€€ -ÈS  {*¼Lˆ@0¾»á†[ö?é¤“Ü=ÎüsZ€ŸQE ²
2KC�y\ *yºÆ±ŠÃÃb…¦IL,@`èÐ¡ê¦›n
Lø·oß^=ÿüó\ö· o°ˆé# Yep¬2O»L�~i¼SÃ
 €ðÔ„`UiàXÁ»¦%D@>\8PíÜ¹34N8áwÙßà‚”@ÊÃLˆ€ß@VœZƒÌóœøú]N¤†i5ü"{* ¸b‘+ AtæeàgÿÚk¯Lø·k×N�3FÕ©S'Ê°²nDà@V\]™çyÿÍõéŸ0( Ú ƒýŸàa²D àÌý�7Þ¨vìØH…Ú´iãÎükÔ¨H~Ì„„	™Š€0l­ „©qY"`Ø0`@`Âÿ¸ãŽsgþµjÕ²	&–•d® ˜C	�	ž+~•ÍscL"#pæþšk®QÛ·o¤ÖÇ¼kðGáÜÌ$¤È,È<­· ¿«ç)xýÎü`úX
ñ,‡Á™Ê€ŠÊlˆ€=¼ôÒKêê«¯V[·n¤Ð-[¶T#FŒPõêÕ$?fBÂŠ€�Ì‚ÌƒìË*y
Þ€J<ïN¤`@-Ál"ƒÀ/¼ ®¼òÊÀ„‹-V(ü#Ó…X‘40�Y�yT ­røáYÇ)�®ÀG‰@°¼öÚkî²ÿæÍ›É3/¬_¿~ ù1"ve–Vöù]Ï0Bº{a¦ßX1}"z^yåwæ¿qãÆ@ÊÚ¬Y35jÔ(Õ Aƒ@òc&DÀdd^Ög¶ž‚7  Qn6³‰.o¾ù¦»ç”ð?úè£Ý=
ÿèö)Ö,5· ².Ã°à)ü?½ ¦Ö	ùT|xç�wÔ¥—^ªÖ¯_H¥�:ê(×Ú¿qãÆ�äÇLˆ€MÊ,­ìó»ÎY×@¤‚¿;^ýåD!"�o¿ý¶ºä’KþððGáŸ[kð7" BM/³ ó².ØÂ   ¨ ð­!) 0nÜ8uùå—«µk×¦ðtò�4iÒÄ]ö§ðO;> È¾¬R í
À�YÇ)«�ÄÌ‰@n@øcæ¿zõêÜ‚3þ¬üáU°yóæO›	�(!` ³¸p°Á¹¥žÏº‚À| .»ì2µjÕª@òÃŒŸÂ?¨™I°e F€Ú 0#ÐeX"`†ÀG}äÎüW¬Xaö@š±p›Îù·jÕ*Í”ø8ˆ2‹+ »Â>ùô\ãß½{w<zkI4|üñÇ®ð_¾|¹&ff‚qÄçü)ü3ƒ'S‰22²/«† H÷ý^(ìÜ¹Ó+˜aD |öÙgªÿþjéÒ¥�Ôn}Ÿ{î9…ÛýHD€˜#` ³ ó²>³ƒ @ð<±k×.sä“Dÿ>}ú&ü±ì�=
ÿv&VÉwdd a�°§ mÊÀªÒ÷FeD Lœ8QõíÛW-Y²$�ìëÖ­ëõ£ðnf1 «V  ó û²JaX ž6 ;vìPŽãé* « 2s"à_~ù¥+ü-ZäWH·ZµjêÿûŸjÛ¶í~ç?D€˜! Y™¥!È<* ÂÞƒœ¯M›6q !:ˆ*þXöÿé§Ÿ©bíÚµÕÈ‘#UûöíÉ�™�("€ È,iåžæùŒ‡a ÆÛ½j³}ûvµo_Ö&½ŠÈ0"�Q¦L™âÎü.\˜Ñt%V¥J5tèPÕ¡C‡DQø; @VAfi<�ß5Ïg$8
 öB¶zÕ€«ðJ‚aDÀ ü{÷î­æÏŸH™±ì?bÄÕ¥K—@òc&D Ê@VLX!ó û²JaQ ¶x¡°wï^£
¯$F¬@`Ú´iîÌ?(á_µjUwÏ¿sçÎVàÃB�°# @È,Aæe]ƒ ,ƒhW ŽUhðf073fÌpgþóæÍ¤ +VTÏ>û,gþ� ÍLâ‚ d•á
 · ¤S@ò\Ø³g�‰Ue\úëA¦OŸî
ÿ¹sçR»J•*¹î}¹ìÜÌ$Fà d–†B±†- àä© @£ÚºÕs‘@ƒ5ƒ‰@xøî»ïÜeÿ9sæRÈråÊ©'Ÿ|RuíÚ5�ü˜	ˆ�U+Öž2/(¼Â°€º®÷ª0ÀÜ¸q£W†+€ð‡Áß¬Y³)?„?.ö9ãŒ3É�™�¸! Ye  xÊ¼ 0Ë
€ç¡Iœ«¤T—`>A!€ÿÅ_¬ AeÊ”QO<ñ…`3�Ø" Yeà¹ÖSæ^XV 6K…á)¡B²y3¢�ˆ@4À^?œü|ûí·�T¨téÒê©§žRÝ»w$?fBâŠ€�¬‚¬…@K(pn<hCž#p àav¾! +ÿ‹.ºHÁð/ÂÌŸÂ?¤™P&«Õ�u¡X“ài6¹nÝ:ö-"`=?üðƒ;óJø—,YR2D�{î¹ÖcÇ
0�U�uT iÌòÝóÎßåË—›ì«’$¿�p! á�=ÿ¯¿þ:�‚/^ÜuïÛ£G�@òc&D î`ï²JC�u�yY§0­ lóBcÅŠ&g+½’`È,p…?ÜüA%J”P�>ú¨:ÿüóƒÈŽy" àü?d•† ë¸pHXY}ÈÿùŠËhðXøƒàBŸ¾}ûª „‘"EÜsþXm "�QAÖynyUâ°¬ À%¢§ ïJë×‡âèdPmÃ|"€ÀÏ?ÿìÎü¿øâ‹@jS´hQ5xð`uá…’3!Dàw £ «4Y—u7À(cX ‹X…%¢mÛ¶©Õ«=u„D�òw"�/^¨ðÇÌËþ—^ziVêËL‰@Ü€Œ‚¬Òdd^Ö),
 €Xé…´*¨$"`K–,q=üMœ81�âæÿ~ýú’3!Dà¯@F¬ xÊº¿¦êß/aR `9á©XWú‡S&†,]ºÔ=ê¤ðøá‡UÿþýKÈhD€ø�€�Œ‚ŒÓZ	úQ¶ÜÒ›°=·BæüëJÇqrþå'Ë–-S˜…öÙg�”­@�êþûïW—]vY ù1"@rG ²Éà d€\ ÄáIÏ+ÿ-Z¤öîÝ›Ë£ü‰d¼ü°¼ÿä“O)–ý!ü¯¼òÊ@òc&D€$F ²	2JC�qZGš42¦ XøyúGÆ¾ªÁþJÆÀaBDÀ�•+WºKðãÇ�7}$­xùóçWƒR×^{­Ê“'OZiña"@ÒG ²	2JC�q¡±f“ ÿÈžK#<	 éZÎ
«V­rgþ|ðA ù,XÐþ$?fBˆ€Ã �qž÷ÞèsÊ\Œ0) ¿Hµ~òª X‘ˆ@XÀK'?}ôQ E‚ðÿïÿ«n¼ñFuØaaz}©>3!¡E ²Éà dd]((l#È/Tàf.UID ¬Y³Æ]öjæ�eÿ{ï½W]wÝu\öC`ˆÀ!@6AFi(T,l
ÀbÏS;¢/ M÷bp ¬]»ÖþãÆ�$?Xûÿç?ÿáž h3"�<²	²mqò)û÷DØ £“ û÷‡Â‹¢­Â”C� ®û¼âŠ+ÔØ±c)gÞ¼yÕ�wÞ©n¸áÎüAœ™�ä€L²í j6`™”Éó–¤yóæ©­[=O&×rŒM’@ ËþpµûÆo$ñTêQ±ìÿïÿ[ýãÿP‡~xê	ñI"@|C 2	²IC�m�q¡¡°) Ï“ ˜}Ñ04ý'VÙ°aƒ;óë­·©7þm·Ý¦n¾ùf…U  áD 2	²IC�m�q¡¡°) XÛŸå…4­¹sçzEaÈ8›6mRW]u•zóÍ73žvn	Bàß~ûí®@áŸBü�„È$ƒ•iÈ¶Pí_‡M€Ÿßo½šuß¾}jÖ,OÁëq†�¤Ø¼y³;óå•W’~6•òåËçîùcßßID€„È$È&A¶…Ê—}Ø à·Px'¾$"Ü±þË/ž‡=Êß‰@R@øÃáNPÂ?gÙKÿœù'ÕTŒL²‚ dd’† Ó ÛBEaT Bk¼P2\nñJ‚aD@‹ –ô®¹æ5fÌmÜLD€ð¿å–[Ü¥
ÿL Ê4ˆ€ÿnKC¦-ö¿4ÉåF`•Tœ�pãÚòe¡¹O!a9`/x©ápgôèÑ�Tþü¯¿þzõÏþ“Ëþ� ÎLˆ@f€,‚LÒ�V®iž÷%8Œ
 ®û›ãU[\º0{Îl¯(#)#€e\²3bÄˆ”ÓHæA¸ô…¥?ýàØ‰{€,2¸¤2-tWÙ†õlÑL¯æÇžËÌ™3UÏž=½¢1,dìÚµKmÜ¸Q­_¿ÞeZ0ÜgÂ‘îÓÆÒ7ßpÕm©R¥T™2eT¹råÜÏbÅŠùîÿ~ûöí®Ÿý‘#G‚fþ°1ø×¿þ¥àí�d/è¿è?8.Š#aøÄéü†«bs˜¡CÑ+^¼¸ÛÇË–-«Àèë…¶€˜–²ÈÀ&ÍS¦eº°* 8ç·K¸P"`` ÁÁA3BÙý/ÄòåËÕ�?þ¨¾ÿþ{—gÏžíŠ¸0ƒâÎ�ž¶ž®"P´hQÁ�Á²N�:ªI“&êÈ#�T�5rÿGx¦ZüÀ�ÕsÏ=—©$=Ó�ðÇJ.÷Á%?$»Ø½{·ëýcÑœ9sÜ>ŽþŽí#ôq0¿¡ÝÑ¿Ñ�¡ð6lØP5nÜØå¨êÕ«sKÈÀ,‡A¡ý5Y¦�¤IÃ—à°^$^Uj;A¸n¢ZW«VM}õÕWªjUD%…Ìð§M›¦¾øâ5aÂ÷â&(93ŸL–3¦5j¨6mÚ¨O<Q{ì±ªJ•*)g�²cþé§ŸN9�dÄ²?l ü©Ä&ƒ\vãâˆ)S¦¨/¿üRMš4ÉU p#d¦	ý£råÊ®’Û®];nÙ²¥*Q¢D¦³bzi €ñc�Æ Öÿí…—§‘U¬…ÏS\®Ž3“¹²,£9Ÿ|ò‰¬º‘²‰€ÌôYsî»ï>ç„Npd6“k{%jÇLü.3i§~ýúNÿþý�wß}×‘e×¤ ‘™¿sõÕWVn”WN8¢t$UNFÎèãÇ�wÛLfçŽœÖ¬¯ä¼…
rDpÄHÔ™:uª#+Ùƒ¹þÈ È¢œvJð	Y™FJ�{$®'°2{úCcðŸà€ðzï½÷œsÏ=×‘½KÏvÒµc&ÃÅ†À9æ˜cœÇ{Ìí\ê!3ñ@Ë/	9²ý¡-#d±Uq†î*¶²Thñz'J–,étíÚÕyíµ×œ-[¶d¤˜çäÕVÃ ËHI"ÐUâÃÛOB€ÿþ÷¿;²¼ó.lõ!¸^ýu§K—.f%^í“í0±päÈ5�¹‚${¸ŽìÁ:£Ã*…ìçZþV­Zå<úè£ÎÑGí`µ&Ûý8QþPveùÙ‘Ó*ŽÓ†¼•²2(Qûü2²Œ”$Øÿ_&œ`ðbm£.—½ª8pÀ‘=Oçì³ÏvÄ‚9a›xµW¶ÂÄ°ÊyüñÇÿ°5€™¿½sd¯5°ºôéÓ‡uöº°6g1LuF�å
þlõÕTóíÔ©“#×SsB¤måÌE€ì�Ò´dXB[6	#%@ ¢?N0f bŒ“¹eJ¹"0þ|G®Àu°ôèÕaCAGnòs…ðM7ÝèìÂŸËµ¹v¯Püøé§Ÿ:'Ÿ|r }"ÓïÆÃ.¸À™>}z(0�z! {VA!ÃèÜC@H…’‡
,ÏÝÿýQïgY«Ÿqqž}öY§nÝº	ÛÀ«}Â#E+îd¬Î}ûöýÃêCÖ”ÿÌâäÞGŽàe¬½³Ýïå4ŒóðÃ;rñ/õå™C ²Ç`‹2Œ”"gËs„¾œgžy¦#·0e®U™’‹À¢E‹œóÏ??Ðýq¯v¶5ÂŸq8_ªÏ>ûÌÁª�­}KWîSO=Õ‘[êÂ	¾å¥‚Ì�ìÑ´dd)EêÉsžv rÜYºt©åÝ)\Åÿàƒœ¦M›ê:7Ã=Sé·NïÞ½¹ì®®í–ÆŸ=ô�#¾$"ß‡kÖ¬é¼ôÒKlxH™C 2²ï¹CvA†‘RD {'ï'grßÿýÌµlŒSÂ �%ÿÒ¥K'ÄÛ«-ö{?=ï¼óq{ãÞÎª£M.¿ür“¥ÛÈ¼â^Ø=Cß™ë“�9þ  »B½ÿÆË€³ß~4¿þí¿\¾Àå,<Ï‘ÒC .-ïºë.uÕUW¹þúÓK-ÞOŸsÎ9jÈ�!®k×x#®ÚÃk›lÉ¨§žzÊ½w"\¥ó¯4p¹}ç�wºn§q÷)} süÿCvyû‚N¿(‘Oád©á~á„yÇŽá!¥† Î¥‹à7Ñh¶�WûÄ)Ç$Å5ljÁ§|CàçŸvpT.N}1·ºâ” �N§×Í k srÃ÷�ß ³ »Hi" gÿ?	'\üc;ß|óMz­Ó§a vñÅ'ÄÖw†ý±OvëÖ�ƒkß£~øÁ=ùÁþúk…A*©©wTÈÈM‚Ì‚ì
5…} à­ö¼JQÎWs …n†Ûïn¼áÆÀî½O¡ˆÖ<Ò½{w÷"!\RD
.Tâƒ�ãÃ!M".¼•¸£v¯ä>äg~5D Ëÿ�9‚Ì‚ì
5Ù  à(Å':Å‘‡ÉžŒ.™Ø„Ë1uÇw¨gž}&6uö«¢²ì¯†¦Ê—/ïWL7pC[¿~ýÜÛûRx<Ò�¼ùæ›J.ÀR˜�ÌÀ¾?d�AfAv‘2€@CIcƒpÂe¹ØÁ>É�xÀ�/q/L–¸¿å`ƒ³ÀrE¬èŒ¸Òàœvìû?n¥„Ã/’�1�59ï‚OÈ*È¬Ð“+  q±ð,|ID°ð�<yr¢`þ~ÐþÿóŸÿ(¹Ìâ�_ù5YN9åwæ_®\¹de|@¿¾ûî»ÕÛo¿íc.ÑH+WÏ=÷\4*@- c k4YµX'Á¶( ;-­t‡`=.À†µsæÌq�‰ñ_X‹hE¹Ú·o¯äªXU©R%+Ê§B¾üòËî1Ì8Õ9Õºb+G?ÿüóT“ˆÍs�-�1Y™EÊ �%-œ©L¸üR½zug‘¸°%åŽÀ†¸õÂ�a‰ûW68N¶dÉ’ÜAæ¯YE`ÆŒÆ�œ¶â§¾?#\},3Û¬¶]Ø3‡l1è[�Q�UV�-+  ó[áÙ^¨Š{Füx $îO•x°òˆÁ Xö—û×•º¨9Ÿ­n¿ýv…q€”¢8¹Û&X åŽÀ”)SLúdd•d“°^ýX‡ªø±×E‰e¸\|ÂeÑ4[¾AƒîQ?1J3%>îâÆZñýOÙçŸ^aû„”;†}2
²Ê
²I  	ïñBg4qü‡ô;pÿyÏ=÷(îûÿŽI*ßÄƒš’eÀTå3>#0}Út%'[h”Îp~ï½÷š¹¥‘‹��B¦¸œ‡l‚Œ²†lS °´ò£ºrLCMœ8Ñ+JìÂF�ezv5vØ$Sa±¡pOO8I&YÆM,[?ðàjÕªUi¦ÄÇçÍ›Ç•Â\ºd
d‹† ›¬YþG]lS 6I™=¥»’¨wÞyGÉÍv¨_ì	û¡C‡�=™ N@¸Lš)43“–fÇŽ›™Ä˜Škã› Ò¯@–@¦@¶h²	2Ê²M °Øä÷´TùòË/ÕâÅ‹7ö4räHõã�ž‹&±Ç( 0<ýôÓ
«¤ì# OvƒV¸ñŽ”Ö¬Yãöq�—™Cž
d	dŠ† “¬3@³Q˜"@{:Z¹r¥‚Ñ[Ü	
 )³Ìœ9S�=:³‰2µ”7nœÉÞlJiÇù¡×_]É¥7q†à·ºC–@¦h2	²É*²QÀÔkœÊÐ\á,îžîþïÿþ�Fk^%Å0ô/8‚Q ){ìÞ½Ûõb÷÷Ü�À
Ž»Æ} }²Ä È$ë–mT ÐßßÞŽ/‰hÒ¤IêÛo­²ÇHT•”~Ç2Þ˜1cRz–éøþûï¹ï¬‡É×°Ç Á¯¿õÖ[±ß>„�,Ñdd’ud« gÓ½Ð–Ë@b=@ÃheîÜ¹^1,0#xñÅf¡¤à þ/½ô’ÚµkWð™Ç$ÇÕ«W»Æo1©n®Õ„q)d‰† ‹<�ÔižÏZ°­
 ,~ÞÕ¡öî»ïÆòìûÞ½{öðpu%É?¦N�ª¾þúkÿ2`Ê	øé§ŸÔøñã†3 3`‰«ÿÔ2Ä€	2É:²U ÐØsYã…8fÀ_}õ•W”H†¡ÞN$Ø¶m›‚)x üyîßÜgÏžÛmÈƒUTÈ k›€ùüD¯W ž­`7Ÿ áý�ä?ÀŠ )8`˜EÅ+¼±Åòá‡“Yˆr�Ì€ì€Ñdd‘•d³ O?o
{®sc	[q!œ‹¦S”àZžÓâllÒ¿ç4þ|n½ü‡ïß äìƒû^Ž 3€Ì0Xþ‡ì�²ÖëœÍ
 úÃaOÿŒë×¯w�q rháÂ…Š^¼‚ki8 ™<yrp2'Wø¯]»–H„€\}­°'ÂÑ?ÈAö@YK¶+ «ù×tè¿öÚkjãÆ�ºh‘‡0â’t°MùÉ'Ÿ(^£æØ›58—\�"ž”\Ox‘A²2Ã€	2ÈZ²] ð¯{nx.çXÛˆ‡ËÑEÄÿïX’^±b…ÿ1W¹¥‡ºà;ŒŠöÃƒ/˜9nCæ@öXMQP ¾“ðtÔ£!œŽzÆþÜ–êÂðöÁéÒ?ü†¢D¾Øâ2pËy‚®à´iÓbáù2²ÂÀ»$dd�Õ`¿´À+ÂøLHðæ4eŠu®šÖ'· ì‹.X° · þæ#4¨ øð!ICÁåEL‡ ÐW.Z´( Ü²—d„�ç?#™“½Z˜ç µÅ9OSìcá×(/�ãòÞŠfÞù3ŽiHþ#€ :¸òç?ç€ã€À>ÊÙ a0†BÖDâldT ˜cÀ“¢îÛ³ºFõì¾â8 “oðº	c€ŽÃ,Ô_SKØÃÖ%Ê„kÓ!#²&ÇP¢¢  Í`�±
_|[c'ª„€(¯p„¹Ý`ÈÓþ¶¶ZÐÇIÙA ¶.Q&ÈÈAÆXoü—SÇ() POµƒFŽªÏFçtëà?a€ipn8ø‚E(G,Í._¾<B5²«*Ž¸g$Š™`89„Œ‰ÌRH” ôËÂžW7a™\D�p=nÞºÂÔ†¸�øûÛ"¸œ…·/ú‹±Wê0¾ŒêI*ÈjÈÈ˜ÈPÔ€YÒ2ZÏL£F�Šœ%1€-[¶D¦cÚV&âïo«mß¾�—ü…Ø3u¬pEq Šd‚A¶@ÆD†¢¦ àxÆóÂžG§OŸ¹ËD  `€$eÌŒhà/öØ08Ÿío!bœ:Æ—(* ¸X
2ACF²E“Fè‚£¦  `hižŽ�`(÷ÜsÏEJ`âöª¨.Ï…î­É¥@8@üs&ƒ?AÉ�ÛÍž„/í¤0nFMƒRY``<™¢]]Nä€ˆ¢€»YŸö¼¡	¾­n{
¸9RÏ#HRv€@üýÅÂ‡
€¿{¥E 2ÀàžÈÈ”ÈÝûE }xœð|IDLžxâ‰ÈìÛæÉ“G~øá‰ªËß}F€øû°$Øa‡)àLÊQëã°Ù�0XÕ€,y/;¨û›kT \Ô0ZÜ>Ž;VÍŠpŽùóç·¢¬Q,dÞ¼yU�¢XµÐÔ)_¾|®šÅ° èçQ!Œý†îá!K<O—ÙŠIT ´Çÿ	Ïñj,i6,Ç·ðb.\Ø«ºó'âï#À’tÁ‚U”�¿he>uà�~Â‘]Œý{ÿ�!�%‘¤(+ péôœ®Õ&Ož¬^}õU]´Ð‡ãÅ,Q¢DèËÕbp$þþ¶nÑ¢E##€üEÊŸÔË”)™UFŒùû2DëÐ �PF‰² À¡¹yÞ`£¢§Ÿ~ÚúU * Ù}¿¨ ø�±bÅ¨ øsÂJ—.	 ³Œù¥�‘�ý£¡£® ¬�:>+ì ²‰èÛo¿5u™(‰¬ÿ€råÊe½q- –ÿ‰¿¿­� bì/Æ^©W¨P!v.pù‹1_C���!‘¥¨+ h88šëÕ‚Øzê©§ÔªU¸çÁ^ªZµª½…·¼ä˜•,YÒòZ„»øXe©U«V¸áÒ•/_Þz#LŒñëöþ!3 ;"MqP °ó”®gÏž­FŒ¡‹êðzõêEb‰.Ô '(\ƒˆ}l2õ3Ž¹Ö¨Q#SÉ1�$¨Y³f’O„/:ÆxŒõ™Ù½ÿœúÇA@]_žšSéDŸÏ<óŒúé§Ÿ‡þ÷ÚµkÓ=K­tÄGd)çxe[·nÝxU8$µÅc(¹6ÆvŒñY™yŠ‹°^Zòqá_¼Zw�2Ä+J¨Ã*W®¬*Uªê2F±p°¿ `
¦e6l¨Š/LfÌå7`�	†Í„±c¼† # + 3"OqQ Ð�ï
ÃŸ³'=ÿüóê›o¾ñŒÖ@ŒGuTX‹ÙrÁ0­Q£F‘­_˜*vä‘G*ìE“‚E Š—Í“ŒéÛ2²"' ~œ‡	{:Ìß¸q£»
 ßî¶öH)ˆ‚o5_Fa4xä’Ï‘ÊVò˜eâ‰Ö­[+¬ØHË1ûÇØ®!ÈÈÈŠXPœ 4èÛÂïëZN"Þyç]´P†üñ®Ç´P.¢…j×®�µƒ£mM‚í–¶mÛÚVl«Ë#mÚ´±öŒå†ÎÞ  #bCqS vIËöÔðpïø}÷Ýg¢1†®£4iÒ„G¥l¤N8!À™•Í³Q[[.-Z´°±èîŽ±cº†   #bCqS Ð°“„µ¾¿þúkS‹ÑPu¸ëìÚµk¨ÊåÂàXZ«V­¢\ÅÐÕv.¶[¤‡T�{ì±ÊV#°úÇXn@�	�±¢8* ¸Ûùá•º–~ôÑGM<Fé’	4WvvéÒ…Û ¡Ž-[Ç€ Êx6p	|Úi§e<]&øW°Âuê©§Zé Þþ0†dddC¬(Ž
 7<i/
Z½zµzä‘GLî‹U§iÙ²%gH´Œ.O?ýô rbF J®­Fi®K˜ÿ‡çÅÎ�;‡¹ˆ¹–mÿþýîØ�1Ü€ <oŽ5HÃÊ(qU ÐXðôô½®Õ`<‚{£m"¸¤=ãŒ3l*²•eÅÑ¨Ž;ZYvÛ}ôÑGsë%€FÄvbõêÕÈ)³Y`Ì64üƒÐzŠÍléÂ“Zœ \òp¿ð^¯æØ½{·4h�Z³f�W´Ð…�sÎ9VŸÛ ¹è¬³ÎReË–Í%„?ù�@�T÷îÝ­µL÷ŸL¤_¨P!Õ­[·L$h«1fcìÖÆ~È È‚XRœ 48®zü@×òÓ¦MSC‡ÕEU8¥Î<óÌP•)J…�et�=¢T%ëêŽ�Hþ €ã–°q±�0VcÌ6 Œý‘¾îW‡AÜ€=Ð½Âku@¡SM�:U-Tá½zõ¢ÛTŸZäì³Ï¦ðñ	[Ód+V¬¨.¸àÓèŒ—ðýß¯_?ë®ÿÅm8YÃ˜�±2€sþ)õÇýÏž|òÉ';Û¶m“›$í }ûö9={öô¬“®ÎÿkŸ�{Ñ�ï¾ûÎŽNñRŠowGÕØÇ5cW²ïq‡œíÛ·[Õ{06cŒ6¬+ÆüØSÜW r: Ö÷¿Éù'ÑçÇl•o€¼yóª¨R¥J%ªO�/¼P5mÚ4…'ùH¦€†+¯¼2ÓÉÆ:=ØW\}õÕªH‘"Vá€3ÿ£c½]{º•b”ô8Gß)ì©AÊ�{Ž8–°F3?ØŽ�žuÒÕ™á¿÷‰zõê9,°¦ýãPÐµk×:rô•}\3v™¾Çb[áìÚµËª®ƒ1c³A1Æc¬'�? �Wþ)¬íDr4Æ×’Ö¼ ?üðƒ#—ÕhëeR÷¸Ç‘KE¬i÷8ô¥—^rdßš}Ü`üòz‡K”(á|õÕWVuŒÅ“½êuHØHùŽ±žDþ‚@Cùe‰°gg0Îƒ>hÕKòä“O:(·®nOÜö�:ur¶lÙbU»Ç¥°räËéÓ§û·fìÒ½ßt8`U·ÁXl8¶-•úcŒ'�„\&!û…=ÙWw¾øâk^”;v8âÒÓ³Nº:Ç9\îX°ª½­é˜,(¶fj×®Í>®»½ÇÇwœ³jÕª¶ˆÿIaÆXœ¨N‡üŽ1c;‰x"PPBßÖvªO<ÑY¿~½ÿ½<C9ˆolZL´knmÿÐCe¨˜ŒŸŒ=Ú#6í»›[Çù7ñêLœ8ÑÏ¦ÉxÚ{1¶ÆtŒí$" E ™ÄÐnHçÖ[oµjÉì…^à ™¤ ÞÐ¬;•ñÑÖ’qôõšk®1
Œ'ïB¾|ùÛ\lS`ìÅlÀË1¦“ˆ€1—JÌ_„=;˜\Hâ¼÷Þ{–�ŽƒS·Ýv›g�tuŽS¸xTt-ZdMû² Ž³aÃ†df†±.¹ägïÞ½VuŒ¹{Æ"ŒáËID )
Kì×„µ�¬yóæ’ØBp˜qÞyçiëeR÷(Ç�ÃŸO>ùÄ–fe9A`Ö¬YNƒØÇ5ã—¸ûuV®\yráÿŠ±c®áØƒ1c9‰$�@}yb�°¶³ÁË�¶Ð²eËœÖ­[këeR÷(Æ)\¸°3fÌ[š“åÌ�÷ßß‘ËšØÇŒ_õë×wæÌ™“ráý	cl§=0vc'�”è)OÂ_´ç@‚}´aÃ†…÷ÍÉ¥dsçÎuš5kæY/]½£Ž¥Eñ'žbüÉ6^{õ5S+ñX½uêÔ±òTÆXŒµãÆlŒÝ$"�ùäég„µ�³Û,iq2 I“&Úº™Ô?
qä
Tç‰'ž°MÎ±¼àd@éÒ¥ÙÇŽaU«Vµrkck+:³1v“ˆ@ÚT‘f
k‘V­Z9K—.õŽÂ„‹mÄ·½¶n&õ·9Žø>wà0‰=^}õU¾lîŸ™(;\YO˜0ÁºÆ˜Š±ÕŒÕ³ID ct‘”6k;á¹çžëÀñŽM4oÞ<§cÇŽÚº™ÔßÆ8˜YŒ1Â¦&cY“D`ì»ccí(¨E‹Ž\—›$jÙ�Ž±cªá¸‚1c5‰d�;$E£Žh›«`¼æðÇÓ¸'Á¦£œÙ’í-Á”)Sb¹Ú7Ö?ÿü³•‡±ÔtÜ•x£IDÀŠIªã„µ{ŽãÆ�³î…ƒ¶}×]w9Ø7©§íqpïùôéÓ­k'8u.\èœyæ™±èßð‘/Wû:ëÖ­K°,>‰14	ûŒÍ£IDÀ7Ž’”
kœC¶ñêXxÙÂ¸(ûU‡‚ƒk’W¯^�Åá�Yg�M›69wÜq‡S¬X1í{lò®‡1NÅŠ�Ç{Ì:'?9}cg¾0&cl&ßè&9lÖ¸€Ç¦ûr^>|Â. G�Îa‡¦­§	a‰Ó°aCç•W^±Ê…ó¡íÂï™CàÃ?tp	NXúf¦ÊÑ¹sg+÷ûsZcf——a,Æ˜L"� �Gr¹]Xë*Xâ8W]u•UN‚r^B|îÚµË>|¸¡‰ºØÌ8ßÅWÐµï¡Ìïî*Ðí·ßžÌ³Ð¾°gyøá‡�­[·ZÛ²pöƒ1Óp¬ÁŒ±c2‰†@!ÉéamGÍ›7¯3xð`k_Hî7o¹å§\¹rÚúš`dà�ÑG}du°ðþ"0yòdçœsÎqòçÏo]/Q¢„sÙe—9?þø£¿ �:ÆJ¼³†cÆ`ŒÅ$"85%Ço…µ�{�Xv¶�fÎœé0À)_¾¼¶Î&¸øÃN>ùdgÀ·oßn;ô, àRœ±cÇºF‚6ÂâßÞ½{;_}õU èøŸÆÈ$ì20öÖ&�¬!Ð^r^'¬ˆUªTq>ÿüsÿß¢ r˜6mškD¯b&u2–ú±øòË/[ç�!€¦cìÙ³ÇUºwïJWÂ¸¨ªoß¾ÎgŸ}fP;¢`lÄi8V`ÌÅØK"YGà
)Á>amçmÔ¨‘ƒcHQ!œ-2dˆÓ®];è˜`àGœ<yò8Õ«Ww®»î:×3pH\ŸeWhãò«ó£ÿš¤Y @§eË–ÎÅã�(ÆDŒ�&8HŒµsIi"@Ã‰4<ø8|N?(|­Ir§Ÿ~ºzî¹ç”ì§›D·"Ž\1¬d{@‰Uµš4i’š={¶’£V¾–]%B_üñJÎó+¹ÚTU«VÍ×<™x|GYJìÔøñã•,¹+ZJ¶–|Döö•(Jl%v,J UªT)_ó:qñQ .¾øb%gþM³~L"†"@J* i€÷§GKÊÿ/wýÓï¹þÛ«W/õôÓO+ÙgÌ5ÜæwîÜ©de@ÉÌIÍ˜1C}ÿý÷JŽªÍ›7+™™+ñ3�tõÄ0ËÅJ¬œUãÆ�]–ã[JfJÜø&� é °eË·O‹k]Wñ•ku]…@NÍ(±#P2;O*yYÁR2ÃW²ÿí
|ôq¹ó^‰ÿ{%7÷¹¿'• %‘�—/*¹°É´ÄïIÄ„áò—”&T ÒðO�×”ÿ_nñ§ßsý÷úë¯W÷ß¿cµ\Ã£ò£xtW–-[¦Àr¢@a6…UÌ vïÞ­öïßï*býëâ!ó¸ƒ„{�5Ü™=fûX5Ã'%¾	¢ë ÜÊÙu%—Ö¨åË—»}3Ûœ>.GÛ‚ï;Z{±WQâ°ç·>Ž,¹´(²ÿÐ¦ÿøÇ?Ô#�<rèÏ^ß§Ià¹Â‹½"1Ì* æX™Æl-_®¥{ Bì¾ûîSb5+ž${¬
ŒUÌš€	8êJQ<[;žµ†r›ÓÇ¡ äôq(»q&±ePr´ØtEp‘`ÕSxJœ1ËtÝÏt‚LO­~>MØs}ï‹/¾pg´Xê‹#a0Ã*•3óÇ'þ'�¨ €>þçþ�ßâLb8¬Ä°Ò]1ÀÆDn—Q’@€#m`%õ'‰»C¸£°§š�ÙŠjÖüuo;‰<•"`r<WÝxã�¦”{¤‚·	¿h]E-(0 ÿiº$]Dø]ØŸ0a‚:òÈ#] ]|†"@lDà�wÞQ—^zi2'„þÿöÎØª*;Ã[dVQÑ€Ò€ÒdP@E1qL«UQ£&%1ˆ"-ŽÄ�”eÊ"•²«Új‡jœ'ÊÐ¶ÝˆC%  63Ê 2=D@P&A”Iòÿ§yÖxïžs‡÷îð­ª¿î}çî½ï9ßá²×Ù{íµu�¿‘’EU#œZ8g€üA÷?Øé’×¥uO÷5Ž†�6mZùëÑ €@)PÒ¢pã�7†õë×Ç½¬Q*8Lò( –8 y€šÒ¤×©~ u‘:¤?ä[mà­¡w< ëÙ‰ˆƒ€@pþ„ë®».¬Zµ*îÙ{¹ßikÜ
”KN  9³¤5v¨Â4ÉQ~i³Ô8yŽRb†3Ï<3(ÍnÒï¢<  �‚"à\	Î{²|¹C£bÙ‡*u½´.Vi
eL  ct‰*Ú‹µàx€ãÓÕÜ´iS4àD7­ZµJWœÏ! $�Ù³gG�ÿÒ¥Kãžß<¼VŠí-Äm˜rÀ8˜I¾ŽlTÃ^ÃúéØt_²qãÆ(0' )>‡ 
‘€3�^sÍ5á³Ï>‹{z‹TÐ�ÿÂ¸(—€ìø%­íè{¸çIN\­y$ÀyzõêÅt@µ¤ø($ö÷œÿ’%KâžV…
^'9ÛVCp jtÊ×¬ÖûeÒù’—	VkN/ê%‚½{÷Ú*³Ú²|@ ¶	Ì˜1#ôïß?É“ÿ�ó¯¤Iµ}îåöý8 µsÇ=!V!](5”ª5z	�GXP-*>„ j‘€“š%øó¦>7I®ÅÓ.Û¯Æ¨½[ïù.�œ+5Jwž°àÂ¼9@ �¼ÿþûaÀ€I¢ý�â÷VéO…tåt.8 µ{·?Ñ×{©ËßK±F¼¹÷ïÐ!mZ�Ú½2¾(ãÆ�×_}’uþ~ò*ý¾l à…â ÔþM™¯SøBòH@Z'ÀÉ‚ì8 k×®µöœ PÖ^~ùåpóÍ7‡µk×ÆåàÎßOþtþq‰å©@žÀ&lÖ#þõô“ÒN|ûí·aÂ„	¡eË–¡G�ª‚A ¨yÏ?ÿ|¸õÖ[ƒ§(cš‡ýï�èücËg1€|ÒMÖöÇ*^!�'¥uvíÚÞ}÷Ýà-…Ï>ûìh�qÕÃ  ä�€w1ýõ¯î»ï¾à’˜æÎˆô‡˜å)–g8 yœ°y'Àðt@?)­°{÷îàÀï&è„Aõë×W5€@þ¸Ã>|xä øA$¦yˆàvéå˜å)Vp j rÂ¯ðt@…k$À# ÞEpÝºu¡oß¾¡aÃ´a	O‡â€ þJ`Ë–-aèÐ¡á±Ç‹Fcrqçï'ÿ?Æ,O±"€PC ~�G¼LÐiƒ›Ä©;oÞ¼°páÂ(aPÓ¦MãT¡  �ØV¬XF�»Ž
zDs�ôz’J”­8 5Ã9“oqíyRo©EœœsÛÛnvëÖ�ÔÁq€QˆEÀ©}o¸á†(I¬
-ä<Àîü'$¨CÑ$€Pƒ°3øª
ÕùPê%µ’Òš—âxM®“uîÜ9my
@ ¨ŽÀ˜1cÂÀ�“äõws³¥ë¤éV p 
ôÆ¤œÖ:½Ÿ"�&µI9^åÛmÛ¶…‰'Fñ ={ö‡Îm®@ ‡$à ã#F„»îº+|õÕW‡,SÅAo}>@ZPÅç.ôr#Òœ†·ö0ZGéçiÊF{e€—	z[á>}úe  �ˆÀÖ­[Ã°aÃ¢Hÿï¾û.	•±*|�´2I%ÊÖ€ÚážÉ·~£JïJž
è§¯˜9sfX¼xq”0¨yóæqªQ(cŽ%ºå–[Â¨Q£’Dú›ØKÒÍ’G-±" €P7)å�qÃ#ÞFøé0)­yOîÉ“'‡.]º°‘PZZ€@ù¨ÜÐçƒ>Háþ�t§äd?X‘À(’•rš»ôþ=Éù´½B ÖÂÿ6DÁ�ND\€¨a€À�<ßïµý·ß~{X¹2ÑèýV5rŸô€ôý�ò¦(à Åm:è$íq$-“<pŒ”ÖœÁËÁ�_|ñEèÕ«WhÒ$VŠ�´íR (^kÖ¬‰ý|ðÁ°}ûö$R¡Â·I/Hþ?	+28 EvÃ8]'òX]ìe‚Ž˜;wnð_§N�B›6mh’?! �r!0uêÔhß±cÇ&�ï÷2¿k%�FbEJ  Ho\Êi;àf²ÔNŠµB@å¢­;ß~ûíhÀ±uëÖõa(;wî#GŽŒ‚ý#”ÐÞRù_I,óK®ÐŠã ÚÉì|¼Lpœä1ýR)­y¸oüøñ‘3Ð»wïpÄŽ-Ä  �R&àx »ï¾;<ðÀá›o¼¸(¶íUÉ§¤[¤µ±kQ°`	à ì­I|b;Uc¢äàÀ3¥´»	ªLøá‡Âœ9s‚‡Û¶mÚ·oïÃ P‚œÄùüß|óÍè·ŸàÝï`¿ÿ–v$¨GÑ&€PÀ7'ƒS«ôŽ‚=¥qÛp` ç÷îÝí%À®‚qÉQ…OÀ‰}~øápç�w†¥K—&=áOUá&i”D°_Rz\ €oN§æ_ø;Rk)ö† Îø5iÒ¤0{öì(@°U+çÂ  �b&0kÖ¬pÓM7…gŸ}6$ÌêçË~UºAú‹ÿÀJ‹ @iÝÏÔ«Ù¤?ÆK{$�Ô—b™·ý|ë­·‚stíÚ5Ô«W/V=
A …C`ÇŽá©§žŠýæÏŸŸôÄ¶«Âo¤aÒ—I+S¾8à Ç}Êô,�4èÿ¤Ï¤3¤XùT.Zì Á…FN@Ë–-}ƒ Š€€·Nçûè£�&]Ûï««�œÒ÷	Éÿ‡`%J  Doì—µXO–¼Tðd)¶y‰�G¼LÐË=*€A …IÀÉ¾ž~úé¨óŸ1cF&'é©ÃA’°'€Pâ78åòÖëý8iŸä¥‚±Çõ@äœ‹-ŠbŽ?þxUÇ  �B"àa~§òõS¿³	m‡Ê?$Ý%UHXÀ(ƒ›œr‰Þ×Ó™»¼J »t¬Û>ýôÓhù�ó†;6€•±ÑQy#àÎÞ�þwÜíþ™Á-RGù{ÈßÿG`eB  Lnô—é˜€	RS©‹+q�Ê…mÛ¶…÷Þ{/|øá‡á„NˆòvX¬M	]ƒ rDÀi½½®È�!á…^ˆ~›	›vboá;DòÞ"X™À(³žr¹^%ð¿ÒÉ£GK±mÕªUáµ×^ëÖ­;vÍš5‹]—‚€@v–/_î¿ÿþpï½÷†eË¼'Xbû\5þCú/éëÄµ©Pp Jâ6f|Nê1Gš$µ’~.Å~œ÷TÀÌ™3£B»víŠ�Æ�«	È��7†'žx":4¼óÎ;Á¿Á„æßü›Ò`i¼DbAÀ Pî
À�ÒZÉ�‚‰uÎ9çì›0aÂ>¥Öè$äŠ€Sþmù7–Éosÿ¶ý÷oƒ@ü§=X•�Su¥Ã¥ÌäŠ½¡ÐUW]í/îeƒ ��„‡z(¼òÊ+ÁËü2´?«Þpi^†õ©V‚˜(Á›šå%}©úc%Ïv•Ž’b›‡$çÍ›Mx§±“O>9Úr8v„ "ÞŸã‘G	÷ÜsO˜2eJ&ÃýnÇOýÃ¥ÿ”<ï�AàG8 ?¢àM
gÿš.yÉàqRG)vl€ÊFë�'OžÆ�êÔ©9�5òG P�Í›7‡‘#GFÉ|^}õÕLÖô»uÏí¿!Þÿêß4�ŸHôŸúOjòG¹ð|áUÒ0)ã1ýÓO?=úíòË/gD \þåp�‰xÄìõ×_�?þx¦ëù+¿o�Þ<(½"}_y�WH à@"ü]�õÁíÒ�R¢%ƒ•:_@¿~ýÂm·Ý.ºè¢ÀŠ�J2¼–3oÚãˆþ#F�š)p0SNÿ÷¬ô;iu¦�P¯|à ”Ï½ÎÕ•þ�º[ºTŠ�@(õË½¯€�Aƒ…K/½48pƒ@¹p@Ÿ÷Ùxî¹ç¢ŽÏoÜ™‘y¸ÿ-é·Òµ@¥²$€P–·=ë‹v�ý¯Ò¿KŽÈÈìœþùaðàÁŒdD�JÅH ò‰ÿ™gž‰2ùeÑñûò—H�H¿—2^" ºXÀ(Ã›žÃKþ™Úò´ÀRFÓ>;çž{n”ÒôÂ/djÀP°’#àŽ_kùÃ“O>&Mš²ìø=Üÿ¼äáþU%‹ª8 5‚¹ä¿äl]á-ÒåRÆ¡þÞj¸OŸ>aÀ€á’K.	-Z´(yp\`éøúë¯£e±/¾øb˜6mZpÖÌ,Ì›õ¼.=.}˜E;T…@²¥]ð‚@5¼¤ô—’·í+eå\öèÑ#80\vÙeÑ¦Cjƒ@Qð:þ7Þx#ZÒ7gŽ3ngeŽœ"yË^§ðÝ+aÈŠ@VÿIgõÍT.UGêÂþIòÔ@�l/ò¤“NŠœ€þýû‡îÝ»G9²m“úÈ¥ìóçÏ/½ôRÔù{Óž˜½õ¿*mÏA{4�ˆ  ÿòE ¥þgÉ‰H2ÎPyržðÒA;ž&hÒ¤IåG¼B Ö	x¿‡÷Ýñ{IŸ‡ýs`ÔÆ3ÒŸ¤9h�& ð8 ?ÁÁy àL‚×HC¤Ù¶ï8�SO=5\qÅáê«¯íÚµË¶IêC c+W®£G�Ž¶Æv
ì,ç÷+Ïc©Þ<)ýAZ_y�Wäš @®‰Ò^UÜSÿ›äåƒ'WU(Éqwþ_|q¸òÊ+ƒ3’O 	=Ê"Õí'  	^IDATfJÀë÷½ö˜1c¢T×vrdËÔŽ—óý�”³Fstn4S‚p Jð¦ø%Ù$yT ­”µ¹ã·`GÀÓÞ€ƒ@®	,[¶,ÞwÇo ‹�ù<µ
ðÓþs¿ `5C  f8ó-h¯CŽðˆ@çƒ?ÎìHëÖ­Cß¾}£)í�Ž;Î32#°~ýú0uêÔhˆß;ò­Y³&³†]k‘û‰ßsü+]„£È€ü±¥åxZ«˜Wxz g¼*éKyÂÎ�;‡.¸ ðA³fÍÒW¤DÙØ´iSô„ï`¾‰'†E‹G÷çÐf«-ó;ª?§EÏ‘¦Ê€ @Üä"¹Ä¦:ÏK¥�ÒÙR)'V¯^½Ð±cÇÈp¦Á^½záä„lé4âNÖ¬YQ¦>wüK–,	»wïÎåîTcNÜ3RrÞþÍ�Z%€P«øùòCh¬cÞpè_¤_J9Ã÷*‚N�:E›y‚ÓN;-xÚ +?ÎŸ;wn”�òäÉañâÅ¹ŠâO…é(þñÒ%oÔ³CÂ Pp 
â6pUplÀµ’cÚUQ&ãÃÞž¸C‡ÁY½+aïÞ½CÛ¶mÃá‡;©!VjöîÝ***ÂG}íÂçì|K—.ÍfûÝê9˜Ïsû£$Ïõc(88 wK8¡Ch£cÿ ]%yzÀ£97�8Û ·*¶3àiƒ–-�Ï+V6lˆ†óÝéû)ßYúrÈ—ŠÆO÷æEz[ú\Â P°p 
öÖpb‡ ÐHÇ~!])]$�(åÅ4hºví�x5AÏž=£=	È@˜Ü9kÔùœƒöìÙQô¾Ÿò?ùä“°s§§àóf«Õò;Òé}é;	ƒ@ÁÀ(ø[Ä	VA �Ž_(Ù8K:BÊ›sÌ1Ñª‚.]º„³Î:+rÚ´iŽ>:ã]�óv®åÔðÖ­[ÃçŸuøÓ§O,ˆ¢ö·lÙ’oßê¦Kîô'H¬ß¬¸à ×ýâl&ÐP‡zIïWG½úXÞÌ±GuT4Eà€B�8˜ÐyÊ qã¼ÌPäízŠ¥á;vé{ƒïùÉÞ�{ŽØß¶m[¾æòSñ|¯?–Hãök–^}ƒ@QÀ(ÊÛÆIWAÀ�ã}$;ž"ð(A�DôyuAÓ¦MC·nÝ¢ÀB;§œrJhß¾}ðFF¤)Ö�H`Î²çuV¬X.\uôØûøã�ÃæÍ›ó­_ÕÙíÕ~º÷¿;þiÒV	ƒ@ÑÀ(ú[ÈTAàx?GºDê'9�°ŽTcÖ¨Q£h¤À+<:à)úo¿÷´BÃ†ƒGÊÑöíÛ¾ÿþûàázã»ƒ÷Ó¼ßû)ßûÉþ»ïj|JÝYÀ7Y+M•¾”0”�òüŸ§¤n!“†€;}zdà‚ý¯¨+Õ¸Õ­[7r
LèÍŒÚ¶må!ð
;~õˆ�cˆè$FÅê ¸ƒw2ày®ÞOôŽÀwïWËËò¼™Žƒ÷ÜÙïÙ³§ÆïÉþ/ôûIßOø÷¿:¸ÏÎ �’$€P’·•‹ª†€GÎ”Î“<BpŠT_ªuó4Â‘G�
ØA8ñÄC«V­¢ýš7oe/ôÞNiìé;	žZðHƒ§?Î·³àNÝiqÝQûÉÜCõîÜ=,ïlzÎ�ï×�7Fï×®]V¯^uð~Úß¾}{Mß§»§»T`¡ä'ü÷¤¿H<éVp Êã>s•‡&àEþ�¥¾’GºK>V°æ)ºÓ÷{�x¤À�ƒJ§ÀŸùxå«ß;Á‘�„TùBÝ¡§Ê	süÔn¹Ó®|­ììÝÁ»Ã÷q?á»Œ�éù}�Û�ß|ÉOúS¤E’�a(;8 ewË¹à*4ÐñŸI^Qp®tšäy]^¨ö±üðr=GîÏ•&IŽÜ_%í”0”5€²¾ý\|5¼9ÑI’w(ô”AÉA	+\ßèÔÜá/�<¤ï�÷–K›%H!€�ƒ·¨†€÷n'�*õ–<uÐVú‰ß‘ Ô‚íÓw®“*$å$Í“Ì·IÂ  �jðW5pøÕpZb¯.°SpÆ~µ×«�`¹'à§xwø+¤ûåÎÞÑú5¾VPß‰A ¨	à õíãäˆ€KÇJŽ#h#y„ «äio!ÙiÀÒpgþµô•äáûO$?á{mþ*ÉÇýô�A YÀÈU!ƒ€ƒ[K­$;+Ù9ðhÁ1’c
Ê5®Àóõ–÷û©Þ�ü§’;ùµÒÉA| �8 y€J“HCàp}îÑ€–’óxÚÀ‚Güjù³£$;V©˜l§NÖ�·µMÚ ¹S·ü$ïWç{Ý½?óSÿ^	ƒ jˆ @�æk “€“vJž:8Nòô�ƒ[Ð|¿|ìh©r¡±Þ×—êIÎrè6”Û®”ÞdV¯”;ãåly»¥]Ò©ò	~«Þ{È~ã~y®ÞAx>¶^ò�½¸=†îƒ@!À(„»À9@ 9�:ª’ÚÁ»ã?Ròh���Ø!H}ï:•õ*ßëP”îö½ºƒö«åNÞOñî¸Sßû‰~»dG ÕAp€   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ Ø	ü?Ë‘Ûù&p    IEND®B`‚ic09  ”m‰PNG

   IHDR         ôxÔú  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  @ IDATxì]Ø5ÖJï½÷"H”¢((MuEÅEQ»Øq­ë®.kÇ
è*‚€í·+ØP@”Þ{¯2ÿyG>Eýî$·ÌÜÉÌ{žç|÷~7™”7™œ“ääD) D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€"@ˆ  D€�¤È“ô|€�0"€w9¯ðáù0ùÌaü^à�ß¿!t@x¿ð/¿ãsÏÁß–ÃøŒ¸Ž0‰‹ `qã±è‘F ïfþƒ\X>Kä2‡|/!ß‹ÂÅå{Qá‚b¤¡Ÿó¾ã3‡å«+Ì!Ðs„:>!è÷
ïþo—ÿ·
o;„·È÷MyÃ!ßwÊw¤ÎI[¾’ˆ 9BÊÂ2�¸!�O*Œ™9„zåƒ\A>+ò%ùŽpur|â™0V 0ä(PV	¯<È«åsÍÁßVÈ'ÂñÌ>a #@ `À™],€ /)\K¸¦píƒß«Ë'³û"Â˜½ç,ËË×H¶°Š°C«Kò"ùüYx±0¾o¦b  �ˆ€_PðY¦G ¼!È«	CÈ×n(|„0fø¥…¡D]ÈKS"(ü…±j0_x®ða(Ë„¡8 ‰�4 �&€|<Ö`f_]¸®pSác„	—Æ²=íHé# £Cl¬þ^xºð,á…ÂXAàJ�€@"É"@ YÄ?Î`�Ù<fõGCèCÀìÊ )8 ô±J  ÊÀa¬`Õ +$"@4PÐ ÄàX#€åz,å7>Iø(ášÂÅ…IáC`«i±ðwÂŸ	ÏÆÖ¶HD€ü	* „ÿÆXØ×Æì¾íÁOìãSàØ`u`ÒÁÏŸä'HD öPˆ}ˆ= 8f‡%ýöÂÇ	7./z:üðÃUáÂ…UÁ‚U�~ã¼yó*0Â*¤Š-êÆË—/Ÿ:ì°ÃÜßsÂQÉ_~ùEíß¿ßý<pà€Ú·oŸÚ¹s§Ú¾}»Úµk×oáˆ³gÏžßx÷îÝn<<o	­•rÎž,<A[8¦H"±D€
@,›=Ö•>Lj_KøxáÎÂ-„aÄƒ=êâÅ‹»B¾L™2ªzõêªB…
ª\¹rîÿ¥J•RàbÅŠ©"EŠ¸‚ÂñóçÏ¯�„<~ž<©½æŽã((üP
öîÝë
|(à;v¨mÛ¶©M›6¹¼aÃµnÝ:µfÍµtéR…ÿ¡H€·nÝê¦!8‡…`X#ÂiÂ)Œã‡<a  �â�@j#C<°a-£ƒ@©
„üIÂ�„[cæŸ5‚ÐÎàUªTQuêÔQÕªUS•+WV•*URåË—wÃq!ÌSäAWŠ”(9ÊÁÚµkÕªU«ÔÊ•+Õ²eËÔO?ý¤V¬Xñ›�¸Y&¬LþDø3a(pRD"‘E€
@d›6öÃŒûù˜åCè·Æñ¼@	³ñ%J¨Ò¥K«¸‚¾fÍšêˆ#ŽPø¬X±¢»D�åú8¶°Å°zõjµxñbõã�?ª%K–¸ŠÁ?ü 6nÜ¨¶lÙâ®:d7üJÊ V`7°_˜D"… €H5gì+ƒþ\K¸ƒðiÂú�íçc	¾dÉ’ªV­ZªqãÆªnÝºêÈ#�t?1«Ï™ÉK™H	ÈY9ÀjÁÂ…Õ¼yóÜÏ9sæ¨E‹©Í›7»Û	÷ãgØ@'ü©0¶	a°* Ö7!+ Àé„ýÂ]„q6ßwÂþ;–ï›6mêÎî�9æWðcV�½xRæ€V LŸ>]a•`Ö¬Y¿m#d.'Ï”–Jè‡Âï
C)€s"°* Ö6]ìŽ%þæÂ;ÈGÊg>aßÖô6TGu”jÑ¢…‚ÀÇ2>öéalG
'Â¾ ÛP¦M›¦¾ûî;5wî\wkÁç’ì“ôç	¿s�¿•On$» `W{±´JUN>Gøxa8ëñ…°d�}û£�>ZµiÓÆý„5>–ùIáC Û8}0cÆõÕW_¹ŸX)ðÙÀN†p‚àuá�„W“ˆ€P°¢™b_HÌöq\ïìƒã¾Œñ à1»‡ÀoÛ¶­»#>’}Àˆv“&MR“¿š¬¾™ö�« øè· Æ‚od/äª€}Ý&V%¦«æ¶®²˜jÃ˜ï|á¶Â÷ÈÃ=ìáCàwèÐA5oÞÜÝ×—¼HC Ç¿ýö[õé§Ÿº+°!€?áyð%ab•€DB‡ €Ð5	$Ôî*|¡0fþXÈÁx¯Y³fª}ûöªS§N®¥~Ù²e3–>
?ë×¯wO|òÉ'jÂ„	jæÌ™®O‚—+ X	#üž0N�ˆ@h š¦`A�†Â	÷®)œ1‚U~“&MÔi§�¦ºvíê
}Zêg^«Â	¾ÿþûjÜ¸qjöìÙ®÷ÂWj±¤÷Šð(a¸ &�¬#@ ëMûÀNKáÞÂÝ„+
g„ à±¼ß¥Kw¦�å}ö‘ˆ@"`0ˆm¬|øá‡îQC(¤Õ’Ö[ÂÏ#lÍE
RVRÄ ±µ¨:ù¥¬'÷>Uûý!8ßÁLƒ>ß#�d€§B/Äª N‰2H°x_øYá/„÷
“ˆ@ Pnf&àÊ]8ë�àï(\H8m‚Cž“N:IuëÖÍµÞÇÅ9$"�)pÁN¼õÖ[ê³Ï>se(í]’Îxa(p2Ä«ŠR0Pgæò«àÇùýK„¡ ¤í´×àâŒþ¹çžë.ócæO"~#€• l¼úê«®¯\‹œ‚s!( ÏÃŸ@F•tHD !T BÃ€!€=þÎÂ×
cÆŸ¶àÇ•¸0ä»à‚Üã{Ü×TI�# {8zá…Ô{ï½ç^…œ�B@ÀŠÀcÂÓF@@ ùƒ  peªJAðc�ÿráÓ…ÓÚˆ‡«]XñwïÞ]�qÆîwºßTIYG n‰qràÝwßU¯½öšû¿¥IÛåù±ÂO	ÃF€Š€€@Ê,T 2‹'Sû�¦òqµpá´œ÷à:ÝÖ­[«^½z¹ûû˜ý“ˆ@XX·n�k'0zôh5uêÔL\g§B8>ø¤ð¬°Ö›å²* v¶[XK]K
v…0Îò§e…÷»Xæ¿ðÂÕ‰'žÈã{amq–+W°=ðùçŸ«1cÆ¸ÛpKœ&­‘çáC`˜0
¥	&ÿ* ì	™@ ×ñöÆ¬ÿˆt,_¾¼:ë¬³ÔE]äÎüáŸŸDlE ÷`%`Ô¨QêÍ7ßTk×®M·*ó%¬¼(ÌëˆÓE3æÏSˆyH³úäyÜÊwƒð1é¤U£Fw™¿gÏž®—¾tÒâ³D ŒàôÀ‹/¾¨°=°dÉ’t‹8],Œ[÷¤›Ÿ�'T âÙî™¨õq’ÈÍÂ¸¬'eËþÚµk+ýÞ½{»7ïe¢`Lƒ„ÜPøüóÏ»ÊÀÏ?ÿœNQqb —= <9�„øl< ÏvO§ÖUäa,õÃº?eï}˜ñc¿_¿~ªV­Zé”‡Ï+X´h‘>|¸k'�æŠ ¼
â´ ¶VX	�¨ dv+3Å,ÿ\á[„›¤ZƒÊ•+«¾}ûrÆŸ*€|.r,X°Àµxî¹çÔÊ•+Ó©ßlyø>áW…±:@"žPð„‡�h,Ÿ…q¬ûþISéÒ¥]�}—_~¹{oÒ	ð"qp%ñSO=åzÜ¸qcªµ…= Ž>(<'ÕDø\< �vNµ–Xâ¿LøáÊ©$‚ùà¼çª«®R­ZµJ%	>Cb…À×_­†â:Jã&B,%<.ü´0¶HD€cÚIL¸$uRá¼yó:§œrŠóÁ8û÷ïwHD€˜#€wïÞ!¼K©¼ƒŸÁ;Œw™Dþ‚ W þIìÀ¬ÿFaúá{Ò„+xèºì-T¨PÒÏó"@~E`×®]®‹á|Ð½š8E\° Á‡…¹�"ˆQ|Œ
@[5õ:�"�Þ)Ü&•$ªU«¦ úôé£è²7ùÈ¸9r¤zâ‰'Ô²eËr�¤ÿõK‰òáôQ#ÐÍZZY_GÌôoÆyâzúèŒ�Yþyç�§†êzñãí|Ä‡ÿ�tÀ;uüñÇ«N�:©mÛ¶)œ�m‚d“­.œ.\Dø[áÝÂ$"@bŒ ,ó>NiŸñØc�uÆ�Ç}~óí]Æ$i! û ¼sx÷R}o¾ó´Ê âL\ˆoëcsÎ|`)|T²0T¨PAÝzë­
{“Íš5S¼š7YŸ¤† Þµzõê©¿ýíoªdÉ’êûï¿W¸|(Iª%ñ»
ï†ÿ€¤—ä’åP°¼S,~y‚gû“º®ƒO·nÝÔÓO?­zôèÁ[úRl >FÒE ÛíÚµS:tP°˜?¾’¥…d’Å»% ®0¶6	“b„ €5¶TFŸç?+|’pRtÄG¸3þ»îºKÁà�Dˆ@ö¨T©’:óÌ3U�:u.Ú°aC²…‚£¯“…Wÿ�ìÃŒo/T ìm»dK^Z¸Gø^áJÉ<\ @÷z^x)ÃlCÎ%'ó8ã"à3x'±wê©§ªíÛ·»Š ®"N‚ÊJÜ3„K	OÞ%LŠ8T "ÞÀ«×\>‡÷†OcjÚ´©züñÇÕÍ7ß¬Ê–ÅA"D ¬Àåöé§Ÿ®5j¤~øáµfÍšdŠŠ±G€a8K+¤#@ Â�{°jXò‡;Ðc’©jþüùU¯^½Ô°aÃT›6mhä—xŒK²ˆ ìt6l¨Ä‹ Ú²e‹š;w®Jr5 ‚…áNx^«Â¬}F€
€Ï g1ùÂ’7Œü®�L9ªV­ªzè!uç�wª2eÊ$ó(ã"J•*å®À^gÆŒjëÖ­É”[†Ø€UátaÞ.( D�¨ D­E­4ø¡ÂW	çÿõ'ýß<yò¸ÆDÏ<óŒ»—È£}zÌƒ„¼ÃÍ›7W;vT«V­rO
$Q^l	´n » º¢DT ¢Ôš¿Öå$ù!ÜAVÿF„™þ¿ÿýouß}÷ÑÂß1F"ö P±bÅßü`5 wÆ�†Â'
ÿ(¼X˜¨ D¤!¥‡	÷&\GØ˜àbôÙgŸuÝùæË—”� qŒHˆ@vÀ»{0|$y§@E)=|``¦pR$>)„Pa£¤P¤bòÌ]Â÷—0}Çû.½ôR÷îq‘ˆ ˆ>Õ«WW]»vU;wîT³gÏNÆ@wt†Ñ¯…áE�d1T ,n¼ƒE//ŸO	Ã­¯ñýòåË«Ç{Ìuç[¬ô qA hÑ¢®�'OžœŒ+aŒ1m…±Ê8Q8iÄò)$PIC¤XŒ¦òÜ3Â¸áË˜ä×•/\úÂð�Dˆ@üÀ»çA­Zµr},_¾<Id-Æv@RÎ’É„qýE€
€¿øú™z;IÆ~Æ7zÁ"øüóÏW°òoÒ¤‰ŸecÚD€X‚@Íš5ÝÕ€Õ«W»%qŸ@-©"Œç/±¤º,æ!P8‹¾^$eÅÌ¿¦i™qkØ½÷Þ«î¾ûnoa$"@ˆ@Å‹W§�všëísÊ”)j÷îÝ9AºÏrá4áµÂßé"3<\PW{èJKÿ„†Ïn#Â%!ðãß»woúñ7BŒ‘ˆ@üÀ}Ø„Að7ß|£6m2¾Æ��…a8U˜'ˆ
€­ôkay{�ð?…þú“þ/€Œ9Rµm» DÀ�úõë»—~á¨à¢E‹¼#ÿ
‡cð=RXøKáýÂ¤�#@ ät°x˜í?"<@« Z‚�O¿~ýÔÐ¡CU­ZØª#"@ÌÀ)!Ü%€U€™3açgD›N†Ï€IÂÆû—”¨ dô$³Ä1?¸õíeú\Á‚ÕwÜáîù—(aìÀ4yÆ#D )RDuéÒÅÝ6„]ÀþýÆ“ú£Ì:&
ó˜`ˆû
€7Ž­†ð³ÂÝL‹Y¡B÷|ÿ5×\Ãý~SÐ��\€]À‰'žèºOÒ_ Ž	6þBxK®‰óÇ¬#@ ëM�° õ$d„p§„1þP»vm÷ˆ_÷îÝy¾ÿOØð_"@RC Ç_@ãÆ�]§AIbÃj l6¦–;Ÿò* ~¢›zÚGÉ£c„�5M¢E‹jôèÑ4ö3Œñˆ H
�ºuëªvíÚ©éÓ§«•+Wš>‹ULØL¦Ã SÔŠG   “È¦¹Ä}^¸™é30Ö>|¸jÔ«n$"@ˆ€?TªTÉ=!°`ÁµpáBÓL*IÄ6Â8"¸Úô!Æó* þcœLp­ù‚°±$ÏñìWµjÕdòa\"@ˆ@JÀ‘&p<gœ Q‰u¢0VV=ÁH¾#@Àwˆ�38NbŽ>Òä	ìËÝxã�ê¡‡R¥Jû2Išqˆ  ž.\X�|òÉjïÞ½
'©¬ÄƒC’ÂI]<`˜>£%‰ €$ó)zKIw´p}“ôq¯÷?þñõïÿ[á¨‰"4¸N6p• |\ãhÆ†é2J
PH´?’#ü�0IÂÿž{îqÏùã;‰"�-pL°}ûö
ÊÀçŸî*e)#q À&€J€`~E¡à²féÂÐM¢c¶ÿÀ¨ë®»Náf? D Û`;²M›6îVäÄ‰Õ¾}ûLŠ„í l{N¦a 	b>Ä¡à¨†Iâ>Þ…á,CKE‹UƒVW^y%ÏøkÑb"@‚D J@ëÖ­ÝÛ?ûì3×6À x9…MÀ$aÜ&H
* ~0»ò9Jçýµw¾�?þ¸ëÛ_™ˆ  YBà˜cŽQ•+WVPöìÙcR
(­„á6x½ÉŒ“9¨ dKÓ”ªIÄÑÂ­M(S¦Œ+ü/ºè"“èŒCˆ È*Íš5S8–Œí€]»v™”¥²D‚ÇÀ�…·š<À8™A€
@fp4M1àÛ¿½ÉþÃ†S8ëO"D€Ø‚@Ó¦MÝ[H?ýôSS% #�þTx»-õ´½œT ‚kÁÒ’Õ0á¿™d	gC†Q=zô0‰Î8D€�P! Ï¤Õ«WW&L0UêJj
"l´t ñHi @ ð’x´°Ä}XøB“gŠ+¦}ôQuá…FÑM’d"@ˆ@àà!ÜPŠ• 82 œˆÂ1ÁñÂFÇ	Òd”PH LÎ+iÝ#|µp]º°öä‘GTß¾}uQNˆ =°	(W®œ»`¨à>”üÂ„„¾‚�
€ÿ�w“dq»°k8ÓÀ9ÿË/¿ÜÿR1"@ˆ@@}ôÑªxñâîJÀ/¿ü¢Ë¥ÖÂØÀUÂ$ŸÐ
%Ÿò�K²}¤¢
ÐUŽ}î¾ûnuÃ7ðœ¿,†"`-[¶Tðˆ#‚ŽãèÊOg'¯ž©‹ÌðÔ �n&O�"‘†	—ÐE>üðÃÕm·Ý¦n½õV…ï$"@ˆ@Ô€³ c�=Öuüå—_š(ðu%`¶ðÂ¨á†úPÚøÓ
8Î2Z¸ª.y¼×\s�4h�¢oZ'DÀf0ÁiÛ¶­Ú²e‹úúë¯Mªêc…?¦£ Ä’ˆC 	°£â<ësÂ0dÑRÿþýÕý÷ß¯
,¨�ËD€Û€pÂ	'¨µk×ª3p3°–p„®Óq2€Ž‚´p™G `Ž•ILÜÍû¸ðé&‘O9å÷¬É’%M¢3 D äÏŸß½@höìÙjáB£ÕýRñŠÂóx`†z€)É Ëÿ
_j’$.Î5j”ªT	ÎãK°Þ¿¿{ƒnÃ�â0¢-D|ûDÔj~hÿFÏéãq¿Ñ³páÂª]»vjòäÉjÅ
Øúi	« X*ÅJ€ÖŠP›#èÏ¥#c øŸ†áŠ'qÄêå—_VÍ›íx¦eCàŽ;Ô¦M›Ô²eË\^²d‰Z¹r¥Ú¶m›Ú¾}»{iHŽð‡ƒ"•-[VÕ¨QÃõ(V­Z5÷<1VLâ>xÚÐîq*ãæÍ›ÕúõëÕÒ¥K]a¶xñbw‰}ýçßÑÇaóƒþ�0ú7ü~` �yèß`¸ GX\èÛo¿Uç�wžš?¾I•1û‡O•ÿ™Dfo´Ži¼gèA:Ëç‹Â¸ãÚ“àÂ¿C‡žñlÜ¹s§úùçŸÕ´iÓÜ=¾ï¿ÿ^Í›7Oa�Äa˜%Kð‘ ;‰š5k*xkÒ¤‰kQw£PHD H`Ä†>=uêT5sæL5gÎw)—ß@ØsûCq¡ �Cð×¯_ßíã˜ ´jÕJÕ©S'ò
<B	X·nÝpIðŒ{
œ œ?"@À(�hGHØ[Â°ü÷$hûO<ñ„êÓ§�g<1ÓÁ@øá‡ªI“&)ìíaÖï'a• 3§ã�?ÞU¨`]Œ‰ø�ÀªU«ÜåêñãÇ«¯¾úÊøXÁò“p8,•wîÜYá,}©R¥üÌ2ki�9R0À]4(Ä<‰ÓMØhÙÀ =F!I#P\žxWûQZôŸA21ˆÉLß‘K‹œO<Ñ�¬ÅÀ§TâÈÊeÀ¹îºë¹†Ô‘•†hÍÚdÙ³wd%Ë?ŽbGlS²ÖÇe…ÀÀyðÁ�¹sçf¿3Å™Äû�±c0‰d�A’«Q‡½ôÒK�Ý»wûýþ–>Å+¯¼Ò‘{¿�êoŠS&âÉJ‹sê©§:²ÕâÈþk`˜0£è  rÜ¸qN÷îÝ™q‡®�Ë;ŽÜâˆW½è€.5Á‰±2‰q c0‰ŽÀY’#Î¤j;ëÉ'ŸìÈÞV$^Ôï¾ûÎ‘e:§|ùòÚz›`ãg1¶r€ý«¯¾êÈRm$ðg%üE@öï�±cÇ:gžy¦S¨P¡Ð÷q1ˆuz÷îíÈ–„¿À˜:ÆJ¼·†cÆ`ŒÅ$"0ß_*¬í¤X6ŒÂr�X5;·Ür‹#FŒÚ:›àdñ?îÈþ©óÑG8Œ1+Û�ãhÎ9çœãˆ…¾u}\lœË.»ÌùñÇmƒ=×òbÌÄØi8N`,Æ˜L"¾#P^rÈ9‡êÙAå8�õBG¬š�áÃ‡;6ô¬«`úpl\qÅÎ¢E‹rtøc<X½zµsûí·;rš$ô}X÷žÉ)gðàÁÎÖ­[­oL(ìCuu>Ž1c3‰ø† œý<!¬í”0zì±Ç¬~	å˜“Ó£GGÎÜkëk‚IXâ@™yå•W9Žhuû°ðé# §VœãŽ;.RýïV¼äˆbú e9Œ¡I^bl¦s;�äJ²{„µfšØO´‘ ÇŒãÔ®][[O,Âû»0bÄì�?äˆªsÇw8rî>²}¼bÅŠî$ÄÖq½eÇXj8†`lÆM"G ‘¤¸HXÛÅy‡#g†­Ua5×]wYa eÒº8â�É™>}º•mÅB§†€øžw�üt}#
á˜=_}õÕV!c,Å˜jØ£1V“ˆ@ÆÀ•”ïk;a•*UÙHxÑÄ—¶Ž&8Øû¦ï½÷ž�MÆ2'‰À”)Sœ¦M›Æ®�wêÔÉ�Ï[	c*ÆVÃqc5ÆlÈ%•ýÂžÖÃ#FŒ°òÃ~ÇŽ=ë§«¿Íá0 ³µí¬ìpY(ôØwÇFz[K÷þµhÑÂj» ¼Ÿ†'40VcÌ&�´h#)À÷´V8^{íµŽÜü•…¡-½,q¶?Ž³¢?·i‘"Eœ'Ÿ|2=0ùt(€/ˆ$,ÊµïúŸûŽ-ÿ×«WÏ™0aB(ÛHW(Œ­c±Æ˜�±›DRF ”<9AXÛéà
wÃ†º>ºp¹‰Ë‘‹u´õ3Á 
q`(÷5„®�X Ô=z´Sºtiöñƒã¼w~òÉ'©šÅ'1Æb¬5k&H<Œá$"�4¸(éamg“ë<­ôÄgÍš5ÓÖÏƒ(Å�¿€¡C‡fq˜cÖ™BàµW_¥+ßl¿/rÃ óÅ_d
æ@Ó�×CŒ¹†bç¥w)9ºJôÂžV¶ÿûßÿ}2‘Ù²eËœÖ­[{ÖMW÷(‡ãb#…$Ù‹Àûï¿	ç>~½gð´'×[ÙÀsý`ÇXN"ÆT‘˜_k$åÀ[žM$W÷ÆÒÚß¤=�ƒWl]*µ©?úQÖY³f94Ð¾¿‡¶w¿ËÚÎÊ•+ýh_ÓÄ˜‹±×°Í0–cL'#–XÚÎG9óçÏ÷µ£g:q\oŠ«MMêÇ8Ê9ê¨£è:8Ó�Ðçô’Ü'Žý»pÉ%—Xé´coÎÊ0¦“ˆ€�“%ÆaÏ�ÇQ`\d½ðÂî×Õ�á¿··nÝx› %}ß¾}Î5×\Ãþ­¿}¿qkæC=dIÿ±˜ƒ�bLÇØN"	(+!FKÿ_|±ƒÁÆ&‚Å­Zµ88&18Jpñ²u€´©f¢¬TpW^sú¯î×
Oœ81Mhƒûöík:¦alÇO"¹"p—üªíLX¶mß.~O=õTmÝLêÇ88Cn«Õt #r3[°`A2KÂ|þ4ÖáR$]˜¯X±ÂÝª3—0Æ“ˆÀ_h-¿¬öpDì�7ÞÈâ0—ZÖppch5ëY>Q‡;Õ-[¶¤Ö |ÊWvïÞíôéÓ‡}W3~éÞÏ�ZyK&ÆdŒÍºúI8ÆxŒõ$"ðåÛ»ÂÚ„ýEÒÙD?üðƒ÷&õcï>0dÈ›š>6e}é¥—L÷‚ùxŒs%J”°Ò§	Æä$l?0ÖcÌ'�>òw¯°çàÐ¸qcççm"¼¸öVW7†{·}>p¥Š¥fRxX»v­Ó²eKöqÍø•Ó‡uŸg�u–uG›Ñ16cŒÖÕOÂ1Ö÷&UC0˜-ìÙq
,è¼øâ‹áõK‚[´J•*åY7]ÝþÇ¾qã�7¢ÏhA ðàƒ²kÆ¯dÞaQÚ¸Í‰¾†1cµA}1æ×&Å¸ˆ|\XÛazõêe�Õ?,d{öì©­›Iýç÷>A¸@‰”}/^Ì“-ãW²ïo‡¬<úŠ1cµa}1öÓM°€Wj+ß,ìÙapy†�.3aµ^¬X1ÏºéêÎðÜûÆå—_n¥±TöEvfK0hÐ öoÍø•Ê;Œ³õ¯¼òJf+ Ô0VcÌ6¨7Æ~È€ØÒa±­¹RE¥îw
—ðÂ Ož<ê¦›nR�5òŠÊ0ñe¯Äío(Ëf{¡d‰TÍ›7ÏöjX]þÕ«W+qleuÂZø½{÷ªáÃ‡«={ö„µˆ	Ë…±c6Ænaì‡€,ˆ%ÅY¸@Z¼ƒ®ÕÛ·o¯ÄÑ„.ZèÂe‰Z½ýöÛ¡+WT
$†gJfHQ©Ž•õ æo³Mš4I}ùå—þfâSê³1vd dA,)®
@eiíÂ‡{µºÜ§n¾ùf%Ëè^ÑBöúë¯+qêÊ²E¥Po¾ù¦Z¿~}TªcU=03E—Ue«ÊmSaåÂ…>n#aÌÆØ�1\C���	±£¸* —IKk×ô{÷î­:vìh]§Ø¼y³z÷]u%ù‰ÀÜ¹sÕøñãýÌ‚i'@`úôéêë¯áÙ•ä'r¥²Zºt©ŸYø–6ÆnŒáY ™;Š£P_Z¹¯®¥kÔ¨¡®¿þz•7o^]ÔÐ…óÍ7Jœÿ„®\Q+�øXPcÇŽ�Zµ¬¨ÏG}¤¶oßnEYm.ä¢E‹ÔÇle0vcÇXn@�	�±¢¸) ¨ïUÂU½ZY\æªk¯½V‰Ó¯h¡Ã’è‡~¨Ä5j(ËµBa�tùòåQ«V¨ëÃÖqãÆ…ºŒQ)Ü�Vði#aÇXŽ1]C�	�±’‰±ª¬4ná^ÂžÔ®];Õ¯_?Ï8a”»ÐÕ{ï½ÖâE®\K–,áRtÀ­
W®pú”)S¬Vr1–cL7 ÈÈˆØPœ ¬å_-\Ò«uÅ–»lT¼xq¯h¡›={¶Â²)03ÁdÆ\\¦N�Êåÿ ûN¼L›6-À3›Ærl`l×dd„}û¾šŠ%
Ž“p¢€pF" r~ïÖ­›:å”SrþµîKÒ\þ¶Ùäu
¤€ ‡Â…ãi¤àïzîq@›O\`LÇØn@��± ¸( 8ÍÎóLˆøÌW7ÜpƒÊ—/Ÿ•�£´ï¿ÿÞÊ²Û\hØ ˆKZ›«`MÙ×­[Ç>ž…ÖÂ‰›�.1¦clÇ¯!#Y¡IÃšà¸( ˜ÒŸ®k•óÎ;OµjÕJ-´á[·nUØ%‹ …RpxÃû"–¤IÁ"€#¯¶ûÁØŽ1Þ€ +ì]6¨`N”8( E¤²W
{îëT¬XQ‰÷\¬ü\¹r¥õ/©�ÀcYzáÂ…6Ýº2CAÑ%‹ fÿ?ÿüs°™ú�ÆxŒõ‚¬€Ì€ìˆ4ÅAÀžŽÖô¢‹.RM›6µº±ñ‚îÜ¹Óê:ØZøùóçÛZt«ÊME+;Í…»¢pòc<Æz‚ÌÐÚŒ¤ê(QW `Ê?@ØsSŽ".»ì²P7”Iá,X ð¢’‚G ƒ#±÷wØ¸àØ%);DÅÎc½�s ÈÈ;�ƒv‘¨+ ]‡Ö:,à.²víÚºh¡§Cšì5ÑÆ�\0“üC §[xÄÕ?|u)ÃöÂV‡@‡Öc½¡‹`ÈÈ�ÈR” hnW{º€jØ°¡êß¿¿õŒÆh¤ì €­âï/öØ‡&Æþbì•úš5k¬¼8·:aÌÇØ¯!ÈÈ�È®DY8UNëÕ	×FV«VMÓÂŒ³º[¶l	A#ZBÌN‰¿¿�Àèç¤ì €U®¨lsaÌ7¼æ2²$’U ¿´VaOËÿºuëª=zD¢a© d·© ø�?V ¨ ø�s¢àf<*
 êˆ±2@C�!}„!S"GQU N�–Òzsºä’KTÕªž÷YÓàû÷ïç	€,¶ÓŽ;²X‚èg%ýœ”€”0Œý�Y™9Š¢ �­ZÈ«µ°ÿÓ«—ö^ ¯$B€(iç¡× 0°P'þ@¥Â'
Fhi@�õG£¦€AØ@–@¦x®(g½qR(@€–‚ƒÖrgA+Uª”dá|~º!„HÙA ‚‰øû‹=0¶Ù½¿èøŸzÇÈ C¿ �)�-‘¢¨) y¤uàåÁÓj³V­Z‘ÙûÏé�‡v˜µwäÔÁæOÜ7në¶àž7o^…~NÊyòäQhƒ¨l 4™ÙŠÚÛT[ZFë½©gÏžªfÍš‘iDT£Áu—‘ªs˜*€øûÛ"P°¨ ø‹±WêP ¢¨äB@&ddLd(j
 Lú«xµNùòåÕ\àÅÊ0¼˜E‹µ²ìQ(4„±bÅ¢P•ÐÖ¡páÂ‘œ�†ð?ãK T2²AC�-Ñ86v°¢QR *H�.Ô4 úÛßþ¦ê×¯¯‹f]8^Ì%JXWî¨¸`Á‚ÄßçÆŒ² òºŒ$_¶lY•?$OÃ¹2²Á€ c k"AQR à¬ÁS²c†�Q\F„`p×u$:m+€øûÛ2Å‹WÀ™”Ê”)Ùm.ÈÈƒU<È˜È8ŠŠPXš™g}:vì¨p'tTÉ`	+ªUÏz½Š)¢0C"ù‡ ¶ ¢àµÓ?„üM×èFu ÈA6@Fh2²2Çzò˜ÕŽŽó*/¬W±Ïåcê�‚G J•*&³‡à¡agap‹[„j®ªT¨™•ï\�…l€Œ08é Y£u4—k&!û1

 $ÞyÂžY³fÍTçÎ�Cf‹S¯^=U¨�§ÿ£ÌfÈÔ~CàÈ#�T8	@ò(·Çµü+@ŒSöGqDä€Œ€¬ÐddŽõ³­(( u¤!<%;:/ÎzFÝH®¦¬ `™”<uê ’üF ¾Û©hù�ò_ÓÇÄÂÀoþ_´ìÈÈ
ÈAæXÿÒGAÀÙLO—~X6<÷Üs5íi0l °
@
,M7hÐ ØLcš[“&MŒÑHÁ" ×¸¬¾@Vl5Aæh}ÎÛJÉçf»€ƒ××Uû´ÓN3iP]2¡‡!HR°`o”
@0˜cZ¹rå`2c.¿!Ð¢EU®\¹ßþ�òÈ‚ì�²–lW Žä›{¡¡‡ÙÍ›77Y¾Ê‰ÎÏ €½Q’üG Ç´Z¶ŒœKvÿ�K3‡Ö­[Gö`nÐ@f@vh²2ÈZ²]8S�/à…~Û¶m:o\è¸ãŽ£5zÀ�Ý©S§ÈzHJ£ìÚ´iC%×©ÌD‚]ÑñÇŸ™Ä,I2²CC�=�AÖ’Í
 ÖOñBÆB^xa¬œ‡`‰ôè£�ö‚…aD ƒ#”.Rpà¼6}^‡7–Äã¶µ‡S�§�AÖîIÙ¬  øZ^¯AíÚµM;x%a]–­N?ýtëÊmk�qüÛ.¤àÀ–K”z‡¤YNpŽG/—¨7dˆ† ƒ<'¢šç³l«�OPƒãfÏòãL'¼WÅ�ÐqK–,·jg¥¾ÀÚÀ}hVÊÕLá¨ÅÐH+ªV/ÿëÒ¥K`ù…)#Èß1�A�E�IÖ‘§ qmpþÒsS
÷Ì3­ÞžIþ†ÆÊî!e Ò|‚Ÿ‚(MS|ŠW¥Jž§SL™�Š –þÛµkwèO±úbà\²ÈJŸ ¶* �pÏÃÀX–…±P	.-Ï9ç“ý«8Â“±:ÃPˆKÑƒ3©„àx	J É_0Žà¦¸dˆÁdd’ud£ WwpÀàéª	š®�+ájK¬�üA žÂzöì+S�L-Uàþùç›ÌÎRË€O¹Û§†WäF-Èƒ•dÈ"È$ëÜ°Ú¨ %@{Nía°b°wÙN‹ŠÁ9¬XIþ Ð¨Q#[ú­qª:tˆõò´1P)FìÖ­\	v�%F��I�MV‘�
 îböœÚÃkè¸Óßÿþ÷Ø¸ï²­1ûì×¯_l<£‰m2yá¨Vß¾}MnoK&YÆànùâ‹/&‚ d	dŠ† “ ›¬"Û €¬ÝøƒæåkM{XÍš5UŸ>}L£3ž!¸-¬W¯^†±ÍO`„yÂ	'ø™E,ÓÆÞ?=.þÚô�%�)Ùä995H#Ð(¶) Og÷°nß¾}  †93( õë×s­*Ûa‡¦.»ì2^H’Vƒß‹n¸�·`f°=°}ˆ>np#^swR�)§N › £¬!Û hXÅ¼ÐÅRMî­öÂàÐ°êÕ««+¯¼òÐŸø=°ï|Þy¸
œN9åÚcd°1°ôOo¢2Å` ²	2Ê²IÀÒ
î`ö¤SO=•Çßþ„ÐE]¤ ¸Hé!€sÿ·Ýv›Â�á¤ð �/_>uóÀ›Mfhá)tHKÏ–W]uUHK—½bÁ%0d‹AFY³`“p¤ ÛÊ«Ê–-ËýÀ\ ‚WÀ;ï¼“‚+l’ù	3£“N:)™G7 ŽiqŒ«œøn¨DöeS @uë­·ªªU«ÚWø J[ÈAFAVYA6) '	¢žËÿ0Îâ~wîý‚‹[¹ccòë1Ç£n¹åî‹š€•¥8GumÒÀ¾wïÞÜÞòÀ²2FC�Q'iâ„&Ø ~–µw3Âa­ÿ÷­›nºÉt+q"1Á
Ê}÷ÝÇ%æ·ýÔ©SÕÕW_­¶mÛâR†·hØóÿç?ÿÉk­=š²ÅÀ)R€¬²ân [ ¬IdÎ­rŸ;:¿þ^ºtiõÀ¨jÕªyGdèoÀŠS§NVzúü­Qþ2cÆ÷Ìú¬Y³¢\Mßê†eíÁƒ«*Uªø–GT†Œ�¬Ñd•û(¶( ­PÏ›?pi…ÁÕ�šv‹~pãÆ�Õc�=kÿÞÉ´2ÜÍâ˜)œ@øÃ'Ã¼yóÂYÀ�—
”÷Üs�:ñÄC^Òp2²FC�U�Y¡'[ XVÂßrB‚�<ƒ‘ôœuÖYêŽ;î 5TèS÷Þ{/ýÍkpÊVðìÙ³Õ%—\¢æÎ�›­"XŸïW\ázS´¾"U 2ÆÀñdd)`½k{N"–½çÓO?uHæìÝ»×¹îºëbšë¸ü.)92«4”1E@„¾#Yì¿ã¢î]íÑ£‡³}ûö@Û-
™AÖ@æhð…ÌÒîH’�ã$|—pBÀÅe¥³nÝº(ô­@ë€—ÿ’þ—$ÄÕó(‡AøóÍ7�¶33G`Îœ9Ž8ea¿õuï§¬rÌ4ïrˆ	Y™£Á2²+ÔdÃÀ±‚ çÚþ±Çkr>3Ô‘�ÂÁ�êÃƒæ¥‡€_¯^=5bÄ¯_‡<Å¯A!ðý÷ß»ýuÚ´iAe¹|ºvíª†Æ13Å–…Ñ$dŽ† ³´‘4iøv åó¼é¾ÙiÀ’z?�w»ÇÜõþw'*Í›7W/¿ü²jÕÊÓßTê`óÉ´�™¿êÙ³§’Õ™´Ò‰óÃ\p�zþùçÝëÂãŒCºuo×®�‚ìÑd—6’&�Xã¼Ú|á„Ë-åÊ•sæÏŸÿ‡%þ“<»wïvÄ[ #ÞÀbíÕ¶‡‰a�#³Ëä�ã�  {ŒÖ­[Ç²ofâÝaåˆÁŸ³iÓ¦@Ú+ê™@æ@öhÚ²‹g®„TédypŸpB ;vìèìÚµ+êý-�ú8pÀyöÙgñ�o¯¶°5¬{÷îÎŠ+Á˜™$�À‚¸çï1êÞ»Â…;ƒr`øKÊ�9�=ì!» ÃBKa_žÀZl^/ôà¢•Çÿ¼2ƒÓ›~ýú©_|Q5mÚÔüAKc-ZÔ½#A”U¹reKkíb/\¸�{þi4qÍš5ÕðáÃ]ÿ8óOÊ�9�=‚ìâ~¢¤DÁPNÞN¨eI‡vÞÿýÌ¨tLå,Z´È'8ŽØ$Äß«mÂ&‘œwÞyçuæ?áB`ñâÅNÛ¶m#Ùÿ‚x?äö:G¼#†«Q#TÈÈ M[B†…}¢-EÁ/¥çþ¿¸´u–/_¡.®ªìÙ³ÇÝ¨[·®®“[ŽåPì…B¸�Â‹ÀÏ?ÿLáï1ù‘±1á;'.}�‡~ØÙºukx8%ƒì�òj‹ƒ2Œ>–ˆd©�<°G8!À§�v÷µx‘`ðré¥—:%J”HØ^í–09ºã¼ñÆÎ/¿ü jÌ"U~úé'Gn¯¬¯ÉV�#×à:r<Î‘m°ÀòÍô{Q¨P!G¬ü�éÓ§§
=ŸKØT@iÚ2²Œ”$7K|Opo»í¶$š‹QÓA ‚“&MrÎ>ûl/Xží¦k×L‡Ã±�u¤t:  g±õtÜqÇÖ 4Ÿ~úi·v;vìpF�åÈÍx�åŸ©¾.—U9cÇŽuöïßPK1  dÐ†�e¤$€/å7„‚‹½é·Þz‹½0`vîÜé¼öÚkN—.]ž^m”í°#�<Òµ~ærÀ�$Åì°ìo`Y�±>'Ž°œ'Ÿ|Ò�r{(­ZµÊyôÑG]E Ì+yóæuÚ´iãˆã*góæÍ‡V�ßB 2ÈÀNêu=ï²‘pÒ!”•ïs„¾ìr%£ƒãA¤ì €c0ï½÷žsî¹ç:h¯¶
2ƒ¢Xç:rã!íC²Ó5RÊuåÊ•NûöíëGP^ÑG¼hýúõŽXÐ;ð!Vß�•M÷¾”,YÒÝ®€"¾eË¯*0Ìg ƒÆ?È2È4’!8:±Y8áK'Þÿx‘…Ï�Û$yì§Ïœ9Ó¹ï¾ûÜ�R<&l3¯öL7¬~ýúNÿþý�wß}—Ký&¢8ðÁÐ¹sçÀú„9fþ¦¶ Ø?~¼sÍ5×88=b0ãËx] °Àÿü?ÿùOgêÔ©´}
IÿÅ}*�Ešñ²,”ÇÃº,q¡ 6Z8!áË¡C‡&g@ðÈª€‚�ö/¾øBM˜0A‰v¬ÄRVÉ¾dÆÜÕ«WW²ªÄ`L‰—8UµjÕŒçÃýE`õêÕJ75nÜ83:˜:ÎoãŠçk¯½VÁïE²´víZ5eÊõå—_ª‰'*Ù^R¨C¦	nfá›¢N�:
ngÁ¢ (1ÄÍtVL/M®¼òJ÷nM2½$|Œ&NàÁÉ¿Áq°ds}¢¬ðâ>õÔSJ,ÓEáïYF@fW®ðÿñÇ.p�wÜß¾qãFµmÛ6%š³{ÏRÂq	œõà¾‚âÅ‹»ƒa“&M”ìí«F�¹ÿ#œd'kÖ¬q�üÈyê@* n®•¬T)¹;#ù‰ûl%F‹J®&vû7ú9ú»¿sû8ú¹XŠ{æ…ýý¸T©RJV•¬2¸Ü AWÉ¥O³ø¿ÿýO]~ùåJ%¼ÊòˆÞà!aaT à4á#áŽ‰ Á-v²$çÎúÅáïáC +P doÕeñK®dS‰¿µoß>÷Â`Fc@”ý5%>·ÝO”p„¯â,Ñ_�ewÐËõ¿„ùñ„ÿÿû_WøûÕ‡   ØnØ°AÉ•±î'ú8~ƒ"�³†þ-÷É»J-ú8V³Àèëâ§Â�ê3M�-%Æ«J¶Š¼r/�p|À+RÐažnvƒ.ÌÁüÊË§çZn…
T­Zµ²T<f›*²�©ÄI‰Ë©¦ÁçìG òª«®RA	1U·ß~»ºþúëSZö7E+“PRÁ5kÖ4}Œñ,G ²2IN±xÕ2²-óûE^¹jÂÂè¢°¦”¹¢W¹±LÍ™Dˆ€]¬^µÚ½oâí·ß¤à˜mÿç?ÿq}á§²çH!™‰ÕälÝh*™VS'ðà0* ˜Ú{ZºÔ®]Û]&-fHˆ@Ê`ûG,éUPÂËìwÜq‡ºé¦›VHDÀ dB&i2-tËÖaT <¯¡ÃþÀHD€Øƒ öÂa´ûêk¯Rhüýë_îÒ¿Û$Of_ “lK<e[6Ð›€7µ™Ø_ƒ•,‰;ÀÌÿê«¯V¯¿‡hþfdr^^Ý|óÍŠÂß¼™ƒred“† ÛB¥�†M(. y®¥”.]Ú=þ¥šÁD€„ œò0`€zñÅ)fþr±gþ� ÍLr€¿È&A¶AÆ…†Â¦ ÀRÒÓºO<¾Ñ 04Ý‡!‰À²?ÎG%ü1Û‡ðÇ¾¿Árlâ‚3„$‰ !›4ÙæyÂMó|ÆƒÃ¨ ”ôª%4-÷�ˆ /p†sã�7ª—_~9�BBøÃÀÇý°@"A" ™Ù¤!È6*  Õ�0Ï··FD!"V üqÎ_n©¤ˆ˜íc¿.~áð‡D²�€�l‚l• Û
@]¯†Ãþž�–å•Ãˆ ð¸¿8p 3fŒ�¹üž4fþpð£?
ÿßqá·à€l28nê)ã‚.u˜ ”ÅsV–ô ta~DÀ¸zÆ²?|£ApìƒK}àâ>õID ›@6œ€Œ�ÜMAlìW÷j@\˜�²HD€„ø»‡ðæ™g)„ÿ7Ü D› @g&: ›.'ƒŒ�[˜€rL/�áG·Â‘ˆ ¸å–[n1¹5#…Æž?ü
ÀÅ/gþ�”‰d È&È(AÆAÖ…‚Â¤ À:ÒSºÃÝ"÷ùBÑoX"à"�³ì?tèÐÀ¹âŠ+Ôý÷ßOáâÌÈÈ&—À�q¡9	�×¤bÅ�êäéJ©jÕª<ßPc0" C Âgî±ç¯¹]—”Q8–ý!ü±ç�›%ID L`e
2JC�qÚeM›àYîÿg¬Ý™H�={ö¸Gïž|òÉ´ÒIæáþýû«‡zˆÂ?Ð7Pdd\h€0mTòj),¯ÔäÛ^1Œ‚ÀîÝ»Ý™�Ëþ¸HèÁ¤ð¤…™Iª@FlS{ÊºTóNå¹°( y¤ðž X¤‚Ÿ!DÀ�½{÷º·ì=üðÃêÀ�†O¥íâ‹/VÈ¯D	Ï[ÂÓË„O� `h¨Y™—u
‹€eÏó}EŠQåÊ…Æx2ëÇ� €ðÇž?fâAìù£~ýúõS�=ö˜Éñª á`~Dà/@FAVi²Îs»[ó|Æ‚CQ©ÎEVôª@5¸mÉ+	†"�"XöÇ±» gþ]t‘›Ÿ�s•kÅÇˆ@f€Œ2P  ë óöe6÷äSË
 ŽFx^T¡BU¸páäkÈ'ˆ H�ýû÷«»ï¾ÛõµÔ²ÿyç�§žxâ	.û§Õr|8h £ «4Yçyä]ó|Æ‚Ã¢ ”•yžë©^½º‚ßo Á! kÌü±ì”ðïÕ«—2d�~×ÌÌ)C@FAVi²2/ë–- Ü“ìy�—�V•u0Y "% ðqÃ€_~5­õZ  @ IDATù%�ª�}öÙêñÇW%Kz.RfBRAÀ@VAÖAæe�Â²€·Ýó6�R¥B�WÖŒ A  �?ûP ‚þXöúé§)üƒh`æá²
².n˜V <Ëb ªoÊ„‰@œ€À‡Ãìûcÿ?ÂÌN…Ê”ñ¼$ˆ¢0"�²
².3Ú°¬ x‚ <�VŸäÃDÀïƒŸý;ï¼3Pá�[)ü�šˆ‘BŽ dd–†<ežæÙŒ‡Eð4ˆÀ�_T 2ÖæLˆäŠ fû<ð€;óß·/˜JÝºusoäû�k“ðG@_6¸¥ÒSæUí°( žû!¸øƒ^À‚êÌ'Ž`æÿè£�º3XþA]ºtQO=õ”*_¾|Ù1"�U—UyÊ¼@
*™„A@<}|Â·rÑ¢EƒÂ„ù�X! kÿÁƒ»Â?¨™ÿgœ¡FŽirf:VmÁÊÚ� d•Á} �yY—¿Y/€€ ƒÏk€óçÏo¢QÙßsX"�`|wûí·+xû‚:vìè.ûW¬èéü3ˆ¢0"�q0û‡ÌÒdž§á»æùŒ‡A€wÏ * ik&Bþ‚ üìßrË-*ÈeÿÑ£G+\šB"QDÀP€ÌËºg»0( Ð‚<Ý"æË—�+ Q|SX§¬"0lØ0uë­·ª]»vRŽN�:)XûWªäyñg ea&DÀ/  @fi2/ë+ Y/€€ -ÈS  {*¼Lˆ@0¾»á†[ö?é¤“Ü=ÎüsZ€ŸQE ²
2KC�y\ *yºÆ±ŠÃÃb…¦IL,@`èÐ¡ê¦›n
Lø·oß^=ÿüó\ö· o°ˆé# Yep¬2O»L�~i¼SÃ
 €ðÔ„`UiàXÁ»¦%D@>\8PíÜ¹34N8áwÙßà‚”@ÊÃLˆ€ß@VœZƒÌóœøú]N¤†i5ü"{* ¸b‘+ AtæeàgÿÚk¯Lø·k×N�3FÕ©S'Ê°²nDà@V\]™çyÿÍõéŸ0( Ú ƒýŸàa²D àÌý�7Þ¨vìØH…Ú´iãÎükÔ¨H~Ì„„	™Š€0l­ „©qY"`Ø0`@`Âÿ¸ãŽsgþµjÕ²	&–•d® ˜C	�	ž+~•ÍscL"#pæþšk®QÛ·o¤ÖÇ¼kðGáÜÌ$¤È,È<­· ¿«ç)xýÎü`úX
ñ,‡Á™Ê€ŠÊlˆ€=¼ôÒKêê«¯V[·n¤Ð-[¶T#FŒPõêÕ$?fBÂŠ€�Ì‚ÌƒìË*y
Þ€J<ïN¤`@-Ál"ƒÀ/¼ ®¼òÊÀ„‹-V(ü#Ó…X‘40�Y�yT ­røáYÇ)�®ÀG‰@°¼öÚkî²ÿæÍ›É3/¬_¿~ ù1"ve–Vöù]Ï0Bº{a¦ßX1}"z^yåwæ¿qãÆ@ÊÚ¬Y35jÔ(Õ Aƒ@òc&DÀdd^Ög¶ž‚7  Qn6³‰.o¾ù¦»ç”ð?úè£Ý=
ÿèö)Ö,5· ².Ã°à)ü?½ ¦Ö	ùT|xç�wÔ¥—^ªÖ¯_H¥�:ê(×Ú¿qãÆ�äÇLˆ€MÊ,­ìó»ÎY×@¤‚¿;^ýåD!"�o¿ý¶ºä’KþððGáŸ[kð7" BM/³ ó².ØÂ   ¨ ð­!) 0nÜ8uùå—«µk×¦ðtò�4iÒÄ]ö§ðO;> È¾¬R í
À�YÇ)«�ÄÌ‰@n@øcæ¿zõêÜ‚3þ¬üáU°yóæO›	�(!` ³¸p°Á¹¥žÏº‚À| .»ì2µjÕª@òÃŒŸÂ?¨™I°e F€Ú 0#ÐeX"`†ÀG}äÎüW¬Xaö@š±p›Îù·jÕ*Í”ø8ˆ2‹+ »Â>ùô\ãß½{w<zkI4|üñÇ®ð_¾|¹&ff‚qÄçü)ü3ƒ'S‰22²/«† H÷ý^(ìÜ¹Ó+˜aD |öÙgªÿþjéÒ¥�Ôn}Ÿ{î9…ÛýHD€˜#` ³ ó²>³ƒ @ð<±k×.sä“Dÿ>}ú&ü±ì�=
ÿv&VÉwdd a�°§ mÊÀªÒ÷FeD Lœ8QõíÛW-Y²$�ìëÖ­ëõ£ðnf1 «V  ó û²JaX ž6 ;vìPŽãé* « 2s"à_~ù¥+ü-ZäWH·ZµjêÿûŸjÛ¶í~ç?D€˜! Y™¥!È<* ÂÞƒœ¯M›6q !:ˆ*þXöÿé§Ÿ©bíÚµÕÈ‘#UûöíÉ�™�("€ È,iåžæùŒ‡a ÆÛ½j³}ûvµo_Ö&½ŠÈ0"�Q¦L™âÎü.\˜Ñt%V¥J5tèPÕ¡C‡DQø; @VAfi<�ß5Ïg$8
 öB¶zÕ€«ðJ‚aDÀ ü{÷î­æÏŸH™±ì?bÄÕ¥K—@òc&D Ê@VLX!ó û²JaQ ¶x¡°wï^£
¯$F¬@`Ú´iîÌ?(á_µjUwÏ¿sçÎVàÃB�°# @È,Aæe]ƒ ,ƒhW ŽUhðf073fÌpgþóæÍ¤ +VTÏ>û,gþ� ÍLâ‚ d•á
 · ¤S@ò\Ø³g�‰Ue\úëA¦OŸî
ÿ¹sçR»J•*¹î}¹ìÜÌ$Fà d–†B±†- àä© @£ÚºÕs‘@ƒ5ƒ‰@xøî»ïÜeÿ9sæRÈråÊ©'Ÿ|RuíÚ5�ü˜	ˆ�U+Öž2/(¼Â°€º®÷ª0ÀÜ¸q£W†+€ð‡Áß¬Y³)?„?.ö9ãŒ3É�™�¸! Ye  xÊ¼ 0Ë
€ç¡Iœ«¤T—`>A!€ÿÅ_¬ AeÊ”QO<ñ…`3�Ø" Yeà¹ÖSæ^XV 6K…á)¡B²y3¢�ˆ@4À^?œü|ûí·�T¨téÒê©§žRÝ»w$?fBâŠ€�¬‚¬…@K(pn<hCž#p àav¾! +ÿ‹.ºHÁð/ÂÌŸÂ?¤™P&«Õ�u¡X“ài6¹nÝ:ö-"`=?üðƒ;óJø—,YR2D�{î¹ÖcÇ
0�U�uT iÌòÝóÎßåË—›ì«’$¿�p! á�=ÿ¯¿þ:�‚/^ÜuïÛ£G�@òc&D î`ï²JC�u�yY§0­ lóBcÅŠ&g+½’`È,p…?ÜüA%J”P�>ú¨:ÿüóƒÈŽy" àü?d•† ë¸pHXY}ÈÿùŠËhðXøƒàBŸ¾}ûª „‘"EÜsþXm "�QAÖynyUâ°¬ À%¢§ ïJë×‡âèdPmÃ|"€ÀÏ?ÿìÎü¿øâ‹@jS´hQ5xð`uá…’3!Dàw £ «4Y—u7À(cX ‹X…%¢mÛ¶©Õ«=u„D�òw"�/^¨ðÇÌËþ—^ziVêËL‰@Ü€Œ‚¬Òdd^Ö),
 €Xé…´*¨$"`K–,q=üMœ81�âæÿ~ýú’3!Dà¯@F¬ xÊº¿¦êß/aR `9á©XWú‡S&†,]ºÔ=ê¤ðøá‡UÿþýKÈhD€ø�€�Œ‚ŒÓZ	úQ¶ÜÒ›°=·BæüëJÇqrþå'Ë–-S˜…öÙg�”­@�êþûïW—]vY ù1"@rG ²Éà d€\ ÄáIÏ+ÿ-Z¤öîÝ›Ë£ü‰d¼ü°¼ÿä“O)–ý!ü¯¼òÊ@òc&D€$F ²	2JC�qZGš42¦ XøyúGÆ¾ªÁþJÆÀaBDÀ�•+WºKðãÇ�7}$­xùóçWƒR×^{­Ê“'OZiña"@ÒG ²	2JC�q¡±f“ ÿÈžK#<	 éZÎ
«V­rgþ|ðA ù,XÐþ$?fBˆ€Ã �qž÷ÞèsÊ\Œ0) ¿Hµ~òª X‘ˆ@XÀK'?}ôQ E‚ðÿïÿ«n¼ñFuØaaz}©>3!¡E ²Éà dd]((l#È/Tàf.UID ¬Y³Æ]öjæ�eÿ{ï½W]wÝu\öC`ˆÀ!@6AFi(T,l
ÀbÏS;¢/ M÷bp ¬]»ÖþãÆ�$?Xûÿç?ÿáž h3"�<²	²mqò)û÷DØ £“ û÷‡Â‹¢­Â”C� ®û¼âŠ+ÔØ±c)gÞ¼yÕ�wÞ©n¸áÎüAœ™�ä€L²í j6`™”Éó–¤yóæ©­[=O&×rŒM’@ ËþpµûÆo$ñTêQ±ìÿïÿ[ýãÿP‡~xê	ñI"@|C 2	²IC�m�q¡¡°) Ï“ ˜}Ñ04ý'VÙ°aƒ;óë­·©7þm·Ý¦n¾ùf…U  áD 2	²IC�m�q¡¡°) XÛŸå…4­¹sçzEaÈ8›6mRW]u•zóÍ73žvn	Bàß~ûí®@áŸBü�„È$ƒ•iÈ¶Pí_‡M€Ÿßo½šuß¾}jÖ,OÁëq†�¤Ø¼y³;óå•W’~6•òåËçîùcßßID€„È$È&A¶…Ê—}Ø à·Px'¾$"Ü±þË/ž‡=Êß‰@R@øÃáNPÂ?gÙKÿœù'ÕTŒL²‚ dd’† Ó ÛBEaT Bk¼P2\nñJ‚aD@‹ –ô®¹æ5fÌmÜLD€ð¿å–[Ü¥
ÿL Ê4ˆ€ÿnKC¦-ö¿4ÉåF`•Tœ�pãÚòe¡¹O!a9`/x©ápgôèÑ�Tþü¯¿þzõÏþ“Ëþ� ÎLˆ@f€,‚LÒ�V®iž÷%8Œ
 ®û›ãU[\º0{Îl¯(#)#€e\²3bÄˆ”ÓHæA¸ô…¥?ýàØ‰{€,2¸¤2-tWÙ†õlÑL¯æÇžËÌ™3UÏž=½¢1,dìÚµKmÜ¸Q­_¿ÞeZ0ÜgÂ‘îÓÆÒ7ßpÕm©R¥T™2eT¹råÜÏbÅŠùîÿ~ûöí®Ÿý‘#G‚fþ°1ø×¿þ¥àí�d/è¿è?8.Š#aøÄéü†«bs˜¡CÑ+^¼¸ÛÇË–-«Àèë…¶€˜–²ÈÀ&ÍS¦eº°* 8ç·K¸P"`` ÁÁA3BÙý/ÄòåËÕ�?þ¨¾ÿþ{—gÏžíŠ¸0ƒâÎ�ž¶ž®"P´hQÁ�Á²N�:ªI“&êÈ#�T�5rÿGx¦ZüÀ�ÕsÏ=—©$=Ó�ðÇJ.÷Á%?$»Ø½{·ëýcÑœ9sÜ>ŽþŽí#ôq0¿¡ÝÑ¿Ñ�¡ð6lØP5nÜØå¨êÕ«sKÈÀ,‡A¡ý5Y¦�¤IÃ—à°^$^Uj;A¸n¢ZW«VM}õÕWªjUD%…Ìð§M›¦¾øâ5aÂ÷â&(93ŸL–3¦5j¨6mÚ¨O<Q{ì±ªJ•*)g�²cþé§ŸN9�dÄ²?l ü©Ä&ƒ\vãâˆ)S¦¨/¿üRMš4ÉU p#d¦	ý£råÊ®’Û®];nÙ²¥*Q¢D¦³bzi €ñc�Æ Öÿí…—§‘U¬…ÏS\®Ž3“¹²,£9Ÿ|ò‰¬º‘²‰€ÌôYsî»ï>ç„Npd6“k{%jÇLü.3i§~ýúNÿþý�wß}×‘e×¤ ‘™¿sõÕWVn”WN8¢t$UNFÎèãÇ�wÛLfçŽœÖ¬¯ä¼…
rDpÄHÔ™:uª#+Ùƒ¹þÈ È¢œvJð	Y™FJ�{$®'°2{úCcðŸà€ðzï½÷œsÏ=×‘½KÏvÒµc&ÃÅ†À9æ˜cœÇ{Ìí\ê!3ñ@Ë/	9²ý¡-#d±Uq†î*¶²Thñz'J–,étíÚÕyíµ×œ-[¶d¤˜çäÕVÃ ËHI"ÐUâÃÛOB€ÿþ÷¿;²¼ó.lõ!¸^ýu§K—.f%^í“í0±päÈ5�¹‚${¸ŽìÁ:£Ã*…ìçZþV­Zå<úè£ÎÑGí`µ&Ûý8QþPveùÙ‘Ó*ŽÓ†¼•²2(Qûü2²Œ”$Øÿ_&œ`ðbm£.—½ª8pÀ‘=Oçì³ÏvÄ‚9a›xµW¶ÂÄ°ÊyüñÇÿ°5€™¿½sd¯5°ºôéÓ‡uöº°6g1LuF�å
þlõÕTóíÔ©“#×SsB¤måÌE€ì�Ò´dXB[6	#%@ ¢?N0f bŒ“¹eJ¹"0þ|G®Àu°ôèÕaCAGnòs…ðM7ÝèìÂŸËµ¹v¯Püøé§Ÿ:'Ÿ|r }"ÓïÆÃ.¸À™>}z(0�z! {VA!ÃèÜC@H…’‡
,ÏÝÿýQïgY«Ÿqqž}öY§nÝº	ÛÀ«}Â#E+îd¬Î}ûöýÃêCÖ”ÿÌâäÞGŽàe¬½³Ýïå4ŒóðÃ;rñ/õå™C ²Ç`‹2Œ”"gËs„¾œgžy¦#·0e®U™’‹À¢E‹œóÏ??Ðýq¯v¶5ÂŸq8_ªÏ>ûÌÁª�­}KWîSO=Õ‘[êÂ	¾å¥‚Ì�ìÑ´dd)EêÉsžv rÜYºt©åÝ)\Åÿàƒœ¦M›ê:7Ã=Sé·NïÞ½¹ì®®í–ÆŸ=ô�#¾$"ß‡kÖ¬é¼ôÒKlxH™C 2²ï¹CvA†‘RD {'ï'grßÿýÌµlŒSÂ �%ÿÒ¥K'ÄÛ«-ö{?=ï¼óq{ãÞÎª£M.¿ür“¥ÛÈ¼â^Ø=Cß™ë“�9þ  »B½ÿÆË€³ß~4¿þí¿\¾Àå,<Ï‘ÒC .-ïºë.uÕUW¹þúÓK-ÞOŸsÎ9jÈ�!®k×x#®ÚÃk›lÉ¨§žzÊ½w"\¥ó¯4p¹}ç�wºn§q÷)} süÿCvyû‚N¿(‘Oád©á~á„yÇŽá!¥† Î¥‹à7Ñh¶�WûÄ)Ç$Å5ljÁ§|CàçŸvpT.N}1·ºâ” �N§×Í k srÃ÷�ß ³ »Hi" gÿ?	'\üc;ß|óMz­Ó§a vñÅ'ÄÖw†ý±OvëÖ�ƒkß£~øÁ=ùÁþúk…A*©©wTÈÈM‚Ì‚ì
5…} à­ö¼JQÎWs …n†Ûïn¼áÆÀî½O¡ˆÖ<Ò½{w÷"!\RD
.Tâƒ�ãÃ!M".¼•¸£v¯ä>äg~5D Ëÿ�9‚Ì‚ì
5Ù  à(Å':Å‘‡ÉžŒ.™Ø„Ë1uÇw¨gž}&6uö«¢²ì¯†¦Ê—/ïWL7pC[¿~ýÜÛûRx<Ò�¼ùæ›J.ÀR˜�ÌÀ¾?d�AfAv‘2€@CIcƒpÂe¹ØÁ>É�xÀ�/q/L–¸¿å`ƒ³ÀrE¬èŒ¸Òàœvìû?n¥„Ã/’�1�59ï‚OÈ*È¬Ð“+  q±ð,|ID°ð�<yr¢`þ~ÐþÿóŸÿ(¹Ìâ�_ù5YN9åwæ_®\¹de|@¿¾ûî»ÕÛo¿íc.ÑH+WÏ=÷\4*@- c k4YµX'Á¶( ;-­t‡`=.À†µsæÌq�‰ñ_X‹hE¹Ú·o¯äªXU©R%+Ê§B¾üòËî1Ì8Õ9Õºb+G?ÿüóT“ˆÍs�-�1Y™EÊ �%-œ©L¸üR½zug‘¸°%åŽÀ†¸õÂ�a‰ûW68N¶dÉ’ÜAæ¯YE`ÆŒÆ�œ¶â§¾?#\},3Û¬¶]Ø3‡l1è[�Q�UV�-+  ó[áÙ^¨Š{Füx $îO•x°òˆÁ Xö—û×•º¨9Ÿ­n¿ýv…q€”¢8¹Û&X åŽÀ”)SLúdd•d“°^ýX‡ªø±×E‰e¸\|ÂeÑ4[¾AƒîQ?1J3%>îâÆZñýOÙçŸ^aû„”;†}2
²Ê
²I  	ïñBg4qü‡ô;pÿyÏ=÷(îûÿŽI*ßÄƒš’eÀTå3>#0}Út%'[h”Îp~ï½÷š¹¥‘‹��B¦¸œ‡l‚Œ²†lS °´ò£ºrLCMœ8Ñ+JìÂF�ezv5vØ$Sa±¡pOO8I&YÆM,[?ðàjÕªUi¦ÄÇçÍ›Ç•Â\ºd
d‹† ›¬YþG]lS 6I™=¥»’¨wÞyGÉÍv¨_ì	û¡C‡�=™ N@¸Lš)43“–fÇŽ›™Ä˜Škã› Ò¯@–@¦@¶h²	2Ê²M °Øä÷´TùòË/ÕâÅ‹7ö4räHõã�ž‹&±Ç( 0<ýôÓ
«¤ì# OvƒV¸ñŽ”Ö¬Yãöq�—™Cž
d	dŠ† “¬3@³Q˜"@{:Z¹r¥‚Ñ[Ü	
 )³Ìœ9S�=:³‰2µ”7nœÉÞlJiÇù¡×_]É¥7q†à·ºC–@¦h2	²É*²QÀÔkœÊÐ\á,îžîþïÿþ�Fk^%Å0ô/8‚Q ){ìÞ½Ûõb÷÷Ü�À
Ž»Æ} }²Ä È$ë–mT ÐßßÞŽ/‰hÒ¤IêÛo­²ÇHT•”~Ç2Þ˜1cRz–éøþûï¹ï¬‡É×°Ç Á¯¿õÖ[±ß>„�,Ñdd’ud« gÓ½Ð–Ë@b=@ÃheîÜ¹^1,0#xñÅf¡¤à þ/½ô’ÚµkWð™Ç$ÇÕ«W»Æo1©n®Õ„q)d‰† ‹<�ÔižÏZ°­
 ,~ÞÕ¡öî»ïÆòìûÞ½{öðpu%É?¦N�ª¾þúkÿ2`Ê	øé§ŸÔøñã†3 3`‰«ÿÔ2Ä€	2É:²U ÐØsYã…8fÀ_}õ•W”H†¡ÞN$Ø¶m›‚)x üyîßÜgÏžÛmÈƒUTÈ k›€ùüD¯W ž­`7Ÿ áý�ä?ÀŠ )8`˜EÅ+¼±Åòá‡“Yˆr�Ì€ì€Ñdd‘•d³ O?o
{®sc	[q!œ‹¦S”àZžÓâllÒ¿ç4þ|n½ü‡ïß äìƒû^Ž 3€Ì0Xþ‡ì�²ÖëœÍ
 úÃaOÿŒë×¯w�q rháÂ…Š^¼‚ki8 ™<yrp2'Wø¯]»–H„€\}­°'ÂÑ?ÈAö@YK¶+ «ù×tè¿öÚkjãÆ�ºh‘‡0â’t°MùÉ'Ÿ(^£æØ›58—\�"ž”\Ox‘A²2Ã€	2ÈZ²] ð¯{nx.çXÛˆ‡ËÑEÄÿïX’^±b…ÿ1W¹¥‡ºà;ŒŠöÃƒ/˜9nCæ@öXMQP ¾“ðtÔ£!œŽzÆþÜ–êÂðöÁéÒ?ü†¢D¾Øâ2pËy‚®à´iÓbáù2²ÂÀ»$dd�Õ`¿´À+ÂøLHðæ4eŠu®šÖ'· ì‹.X° · þæ#4¨ øð!ICÁåEL‡ ÐW.Z´( Ü²—d„�ç?#™“½Z˜ç µÅ9OSìcá×(/�ãòÞŠfÞù3ŽiHþ#€ :¸òç?ç€ã€À>ÊÙ a0†BÖDâldT ˜cÀ“¢îÛ³ºFõì¾â8 “oðº	c€ŽÃ,Ô_SKØÃÖ%Ê„kÓ!#²&ÇP¢¢  Í`�±
_|[c'ª„€(¯p„¹Ý`ÈÓþ¶¶ZÐÇIÙA ¶.Q&ÈÈAÆXoü—SÇ() POµƒFŽªÏFçtëà?a€ipn8ø‚E(G,Í._¾<B5²«*Ž¸g$Š™`89„Œ‰ÌRH” ôËÂžW7a™\D�p=nÞºÂÔ†¸�øûÛ"¸œ…·/ú‹±Wê0¾ŒêI*ÈjÈÈ˜ÈPÔ€YÒ2ZÏL£F�Šœ%1€-[¶D¦cÚV&âïo«mß¾�—ü…Ø3u¬pEq Šd‚A¶@ÆD†¢¦ àxÆóÂžG§OŸ¹ËD  `€$eÌŒhà/öØ08Ÿío!bœ:Æ—(* ¸X
2ACF²E“Fè‚£¦  `hižŽ�`(÷ÜsÏEJ`âöª¨.Ï…î­É¥@8@üs&ƒ?AÉ�ÛÍž„/í¤0nFMƒRY``<™¢]]Nä€ˆ¢€»YŸö¼¡	¾­n{
¸9RÏ#HRv€@üýÅÂ‡
€¿{¥E 2ÀàžÈÈ”ÈÝûE }xœð|IDLžxâ‰ÈìÛæÉ“G~øá‰ªËß}F€øû°$Øa‡)àLÊQëã°Ù�0XÕ€,y/;¨û›kT \Ô0ZÜ>Ž;VÍŠpŽùóç·¢¬Q,dÞ¼yU�¢XµÐÔ)_¾|®šÅ° èçQ!Œý†îá!K<O—ÙŠIT ´Çÿ	Ïñj,i6,Ç·ðb.\Ø«ºó'âï#À’tÁ‚U”�¿he>uà�~Â‘]Œý{ÿ�!�%‘¤(+ péôœ®Õ&Ož¬^}õU]´Ð‡ãÅ,Q¢DèËÕbp$þþ¶nÑ¢E##€üEÊŸÔË”)™UFŒùû2DëÐ �PF‰² À¡¹yÞ`£¢§Ÿ~ÚúU * Ù}¿¨ ø�±bÅ¨ øsÂJ—.	 ³Œù¥�‘�ý£¡£® ¬�:>+ì ²‰èÛo¿5u™(‰¬ÿ€råÊe½q- –ÿ‰¿¿­� bì/Æ^©W¨P!v.pù‹1_C���!‘¥¨+ h88šëÕ‚Øzê©§ÔªU¸çÁ^ªZµª½…·¼ä˜•,YÒòZ„»øXe©U«V¸áÒ•/_Þz#LŒñëöþ!3 ;"MqP °ó”®gÏž­FŒ¡‹êðzõêEb‰.Ô '(\ƒˆ}l2õ3Ž¹Ö¨Q#SÉ1�$¨Y³f’O„/:ÆxŒõ™Ù½ÿœúÇA@]_žšSéDŸÏ<óŒúé§Ÿ‡þ÷ÚµkÓ=K­tÄGd)çxe[·nÝxU8$µÅc(¹6ÆvŒñY™yŠ‹°^Zòqá_¼Zw�2Ä+J¨Ã*W®¬*Uªê2F±p°¿ `
¦e6l¨Š/LfÌå7`�	†Í„±c¼† # + 3"OqQ Ð�ï
ÃŸ³'=ÿüóê›o¾ñŒÖ@ŒGuTX‹ÙrÁ0­Q£F‘­_˜*vä‘G*ìE“‚E Š—Í“ŒéÛ2²"' ~œ‡	{:Ìß¸q£»
 ßî¶öH)ˆ‚o5_Fa4xä’Ï‘ÊVò˜eâ‰Ö­[+¬ØHË1ûÇØ®!ÈÈÈŠXPœ 4èÛÂïëZN"Þyç]´P†üñ®Ç´P.¢…j×®�µƒ£mM‚í–¶mÛÚVl«Ë#mÚ´±öŒå†ÎÞ  #bCqS vIËöÔðpïø}÷Ýg¢1†®£4iÒ„G¥l¤N8!À™•Í³Q[[.-Z´°±èîŽ±cº†   #bCqS Ð°“„µ¾¿þúkS‹ÑPu¸ëìÚµk¨ÊåÂàXZ«V­¢\ÅÐÕv.¶[¤‡T�{ì±ÊV#°úÇXn@�	�±¢8* ¸Ûùá•º–~ôÑGM<Fé’	4WvvéÒ…Û ¡Ž-[Ç€ Êx6p	|Úi§e<]&øW°Âuê©§Zé Þþ0†dddC¬(Ž
 7<i/
Z½zµzä‘GLî‹U§iÙ²%gH´Œ.O?ýô rbF J®­Fi®K˜ÿ‡çÅÎ�;‡¹ˆ¹–mÿþýîØ�1Ü€ <oŽ5HÃÊ(qU ÐXðôô½®Õ`<‚{£m"¸¤=ãŒ3l*²•eÅÑ¨Ž;ZYvÛ}ôÑGsë%€FÄvbõêÕÈ)³Y`Ì64üƒÐzŠÍléÂ“Zœ \òp¿ð^¯æØ½{·4h�Z³f�W´Ð…�sÎ9VŸÛ ¹è¬³ÎReË–Í%„?ù�@�T÷îÝ­µL÷ŸL¤_¨P!Õ­[·L$h«1fcìÖÆ~È È‚XRœ 48®zü@×òÓ¦MSC‡ÕEU8¥Î<óÌP•)J…�et�=¢T%ëêŽ�Hþ €ã–°q±�0VcÌ6 Œý‘¾îW‡AÜ€=Ð½Âku@¡SM�:U-Tá½zõ¢ÛTŸZäì³Ï¦ðñ	[Ód+V¬¨.¸àÓèŒ—ðýß¯_?ë®ÿÅm8YÃ˜�±2€sþ)õÇýÏž|òÉ';Û¶m“›$í }ûö9={öô¬“®ÎÿkŸ�{Ñ�ï¾ûÎŽNñRŠowGÕØÇ5cW²ïq‡œíÛ·[Õ{06cŒ6¬+ÆüØSÜW r: Ö÷¿Éù'ÑçÇl•o€¼yóª¨R¥J%ªO�/¼P5mÚ4…'ùH¦€†+¯¼2ÓÉÆ:=ØW\}õÕªH‘"Vá€3ÿ£c½]{º•b”ô8Gß)ì©AÊ�{Ž8–°F3?ØŽ�žuÒÕ™á¿÷‰zõê9,°¦ýãPÐµk×:rô•}\3v™¾Çb[áìÚµËª®ƒ1c³A1Æc¬'�? �Wþ)¬íDr4Æ×’Ö¼ ?üðƒ#—ÕhëeR÷¸Ç‘KE¬i÷8ô¥—^rdßš}Ü`üòz‡K”(á|õÕWVuŒÅ“½êuHØHùŽ±žDþ‚@Cùe‰°gg0Îƒ>hÕKòä“O:(·®nOÜö�:ur¶lÙbU»Ç¥°räËéÓ§û·fìÒ½ßt8`U·ÁXl8¶-•úcŒ'�„\&!û…=ÙWw¾øâk^”;v8âÒÓ³Nº:Ç9\îX°ª½­é˜,(¶fj×®Í>®»½ÇÇwœ³jÕª¶ˆÿIaÆXœ¨N‡üŽ1c;‰x"PPBßÖvªO<ÑY¿~½ÿ½<C9ˆolZL´knmÿÐCe¨˜ŒŸŒ=Ú#6í»›[Çù7ñêLœ8ÑÏ¦ÉxÚ{1¶ÆtŒí$" E ™ÄÐnHçÖ[oµjÉì…^à ™¤ ÞÐ¬;•ñÑÖ’qôõšk®1
Œ'ïB¾|ùÛ\lS`ìÅlÀË1¦“ˆ€1—JÌ_„=;˜\Hâ¼÷Þ{–�ŽƒS·Ýv›g�tuŽS¸xTt-ZdMû² Ž³aÃ†df†±.¹ägïÞ½VuŒ¹{Æ"ŒáËID )
Kì×„µ�¬yóæ’ØBp˜qÞyçiëeR÷(Ç�ÃŸO>ùÄ–fe9A`Ö¬YNƒØÇ5ã—¸ûuV®\yráÿŠ±c®áØƒ1c9‰$�@}yb�°¶³ÁË�¶Ð²eËœÖ­[këeR÷(Æ)\¸°3fÌ[š“åÌ�÷ßß‘ËšØÇŒ_õë×wæÌ™“ráý	cl§=0vc'�”è)OÂ_´ç@‚}´aÃ†…÷ÍÉ¥dsçÎuš5kæY/]½£Ž¥Eñ'žbüÉ6^{õ5S+ñX½uêÔ±òTÆXŒµãÆlŒÝ$"�ùäég„µ�³Û,iq2 I“&Úº™Ô?
qä
Tç‰'ž°MÎ±¼àd@éÒ¥ÙÇŽaU«Vµrkck+:³1v“ˆ@ÚT‘f
k‘V­Z9K—.õŽÂ„‹mÄ·½¶n&õ·9Žø>wà0‰=^}õU¾lîŸ™(;\YO˜0ÁºÆ˜Š±ÕŒÕ³ID ct‘”6k;á¹çžëÀñŽM4oÞ<§cÇŽÚº™ÔßÆ8˜YŒ1Â¦&cY“D`ì»ccí(¨E‹Ž\—›$jÙ�Ž±cªá¸‚1c5‰d�;$E£Žh›«`¼æðÇÓ¸'Á¦£œÙ’í-Á”)Sb¹Ú7Ö?ÿü³•‡±ÔtÜ•x£IDÀŠIªã„µ{ŽãÆ�³î…ƒ¶}×]w9Ø7©§íqpïùôéÓ­k'8u.\èœyæ™±èßð‘/Wû:ëÖ­K°,>‰14	ûŒÍ£IDÀ7Ž’”
kœC¶ñêXxÙÂ¸(ûU‡‚ƒk’W¯^�Åá�Yg�M›69wÜq‡S¬X1í{lò®‡1NÅŠ�Ç{Ì:'?9}cg¾0&cl&ßè&9lÖ¸€Ç¦ûr^>|Â. G�Îa‡¦­§	a‰Ó°aCç•W^±Ê…ó¡íÂï™CàÃ?tp	NXúf¦ÊÑ¹sg+÷ûsZcf——a,Æ˜L"� �Gr¹]Xë*Xâ8W]u•UN‚r^B|îÚµË>|¸¡‰ºØÌ8ßÅWÐµï¡Ìïî*Ðí·ßžÌ³Ð¾°gyøá‡�­[·ZÛ²pöƒ1Óp¬ÁŒ±c2‰†@!ÉéamGÍ›7¯3xð`k_Hî7o¹å§\¹rÚúš`dà�ÑG}du°ðþ"0yòdçœsÎqòçÏo]/Q¢„sÙe—9?þø£¿ �:ÆJ¼³†cÆ`ŒÅ$"85%Ço…µ�{�Xv¶�fÎœé0À)_¾¼¶Î&¸øÃN>ùdgÀ·oßn;ô, àRœ±cÇºF‚6ÂâßÞ½{;_}õU èøŸÆÈ$ì20öÖ&�¬!Ð^r^'¬ˆUªTq>ÿüsÿß¢ r˜6mškD¯b&u2–ú±øòË/[ç�!€¦cìÙ³ÇUºwïJWÂ¸¨ªoß¾ÎgŸ}fP;¢`lÄi8V`ÌÅØK"YGà
)Á>amçmÔ¨‘ƒcHQ!œ-2dˆÓ®];è˜`àGœ<yò8Õ«Ww®»î:×3pH\ŸeWhãò«ó£ÿš¤Y @§eË–ÎÅã�(ÆDŒ�&8HŒµsIi"@Ã‰4<ø8|N?(|­Ir§Ÿ~ºzî¹ç”ì§›D·"Ž\1¬d{@‰Uµš4i’š={¶’£V¾–]%B_üñJÎó+¹ÚTU«VÍ×<™x|GYJìÔøñã•,¹+ZJ¶–|Döö•(Jl%v,J UªT)_ó:qñQ .¾øb%gþM³~L"†"@J* i€÷§GKÊÿ/wýÓï¹þÛ«W/õôÓO+ÙgÌ5ÜæwîÜ©de@ÉÌIÍ˜1C}ÿý÷JŽªÍ›7+™™+ñ3�tõÄ0ËÅJ¬œUãÆ�]–ã[JfJÜø&� é °eË·O‹k]Wñ•ku]…@NÍ(±#P2;O*yYÁR2ÃW²ÿí
|ôq¹ó^‰ÿ{%7÷¹¿'• %‘�—/*¹°É´ÄïIÄ„áò—”&T ÒðO�×”ÿ_nñ§ßsý÷úë¯W÷ß¿cµ\Ã£ò£xtW–-[¦Àr¢@a6…UÌ vïÞ­öïßï*býëâ!ó¸ƒ„{�5Ü™=fûX5Ã'%¾	¢ë ÜÊÙu%—Ö¨åË—»}3Ûœ>.GÛ‚ï;Z{±WQâ°ç·>Ž,¹´(²ÿÐ¦ÿøÇ?Ô#�<rèÏ^ß§Ià¹Â‹½"1Ì* æX™Æl-_®¥{ Bì¾ûîSb5+ž${¬
ŒUÌš€	8êJQ<[;žµ†r›ÓÇ¡ äôq(»q&±ePr´ØtEp‘`ÕSxJœ1ËtÝÏt‚LO­~>MØs}ï‹/¾pg´Xê‹#a0Ã*•3óÇ'þ'�¨ €>þçþ�ßâLb8¬Ä°Ò]1ÀÆDn—Q’@€#m`%õ'‰»C¸£°§š�ÙŠjÖüuo;‰<•"`r<WÝxã�¦”{¤‚·	¿h]E-(0 ÿiº$]Dø]ØŸ0a‚:òÈ#] ]|†"@lDà�wÞQ—^zi2'„þÿöÎØª*;Ã[dVQÑ€Ò€ÒdP@E1qL«UQ£&%1ˆ"-ŽÄ�”eÊ"•²«Új‡jœ'ÊÐ¶ÝˆC%  63Ê 2=D@P&A”Iòÿ§yÖxïžs‡÷îð­ª¿î}çî½ï9ßá²×Ù{íµu�¿‘’EU#œZ8g€üA÷?Øé’×¥uO÷5Ž†�6mZùëÑ €@)PÒ¢pã�7†õë×Ç½¬Q*8Lò( –8 y€šÒ¤×©~ u‘:¤?ä[mà­¡w< ëÙ‰ˆƒ€@pþ„ë®».¬Zµ*îÙ{¹ßikÜ
”KN  9³¤5v¨Â4ÉQ~i³Ô8yŽRb†3Ï<3(ÍnÒï¢<  �‚"à\	Î{²|¹C£bÙ‡*u½´.Vi
eL  ct‰*Ú‹µàx€ãÓÕÜ´iS4àD7­ZµJWœÏ! $�Ù³gG�ÿÒ¥Kãžß<¼VŠí-Äm˜rÀ8˜I¾ŽlTÃ^ÃúéØt_²qãÆ(0' )>‡ 
‘€3�^sÍ5á³Ï>‹{z‹TÐ�ÿÂ¸(—€ìø%­íè{¸çIN\­y$ÀyzõêÅt@µ¤ø($ö÷œÿ’%KâžV…
^'9ÛVCp jtÊ×¬ÖûeÒù’—	VkN/ê%‚½{÷Ú*³Ú²|@ ¶	Ì˜1#ôïß?É“ÿ�ó¯¤Iµ}îåöý8 µsÇ=!V!](5”ª5z	�GXP-*>„ j‘€“š%øó¦>7I®ÅÓ.Û¯Æ¨½[ïù.�œ+5Jwž°àÂ¼9@ �¼ÿþûaÀ€I¢ý�â÷VéO…tåt.8 µ{·?Ñ×{©ËßK±F¼¹÷ïÐ!mZ�Ú½2¾(ãÆ�×_}’uþ~ò*ý¾l à…â ÔþM™¯SøBòH@Z'ÀÉ‚ì8 k×®µöœ PÖ^~ùåpóÍ7‡µk×ÆåàÎßOþtþq‰å©@žÀ&lÖ#þõô“ÒN|ûí·aÂ„	¡eË–¡G�ª‚A ¨yÏ?ÿ|¸õÖ[ƒ§(cš‡ýï�èücËg1€|ÒMÖöÇ*^!�'¥uvíÚÞ}÷Ýà-…Ï>ûìh�qÕÃ  ä�€w1ýõ¯î»ï¾à’˜æÎˆô‡˜å)–g8 yœ°y'Àðt@?)­°{÷îàÀï&è„Aõë×W5€@þ¸Ã>|xä øA$¦yˆàvéå˜å)Vp j rÂ¯ðt@…k$À# ÞEpÝºu¡oß¾¡aÃ´a	O‡â€ þJ`Ë–-aèÐ¡á±Ç‹Fcrqçï'ÿ?Æ,O±"€PC ~�G¼LÐiƒ›Ä©;oÞ¼°páÂ(aPÓ¦MãT¡  �ØV¬XF�»Ž
zDs�ôz’J”­8 5Ã9“oqíyRo©EœœsÛÛnvëÖ�ÔÁq€QˆEÀ©}o¸á†(I¬
-ä<Àîü'$¨CÑ$€Pƒ°3øª
ÕùPê%µ’Òš—âxM®“uîÜ9my
@ ¨ŽÀ˜1cÂÀ�“äõws³¥ë¤éV p 
ôÆ¤œÖ:½Ÿ"�&µI9^åÛmÛ¶…‰'Fñ ={ö‡Îm®@ ‡$à ã#F„»îº+|õÕW‡,SÅAo}>@ZPÅç.ôr#Òœ†·ö0ZGéçiÊF{e€—	z[á>}úe  �ˆÀÖ­[Ã°aÃ¢Hÿï¾û.	•±*|�´2I%ÊÖ€ÚážÉ·~£JïJž
è§¯˜9sfX¼xq”0¨yóæqªQ(cŽ%ºå–[Â¨Q£’Dú›ØKÒÍ’G-±" €P7)å�qÃ#ÞFøé0)­yOîÉ“'‡.]º°‘PZZ€@ù¨ÜÐçƒ>Háþ�t§äd?X‘À(’•rš»ôþ=Éù´½B ÖÂÿ6DÁ�ND\€¨a€À�<ßïµý·ß~{X¹2ÑèýV5rŸô€ôý�ò¦(à Åm:è$íq$-“<pŒ”ÖœÁËÁ�_|ñEèÕ«WhÒ$VŠ�´íR (^kÖ¬‰ý|ðÁ°}ûö$R¡Â·I/Hþ?	+28 EvÃ8]'òX]ìe‚Ž˜;wnð_§N�B›6mh’?! �r!0uêÔhß±cÇ&�ï÷2¿k%�FbEJ  Ho\Êi;àf²ÔNŠµB@å¢­;ß~ûíhÀ±uëÖõa(;wî#GŽŒ‚ý#”ÐÞRù_I,óK®ÐŠã ÚÉì|¼Lpœä1ýR)­y¸oüøñ‘3Ð»wïpÄŽ-Ä  �R&àx »ï¾;<ðÀá›o¼¸(¶íUÉ§¤[¤µ±kQ°`	à ì­I|b;Uc¢äàÀ3¥´»	ªLøá‡Âœ9s‚‡Û¶mÚ·oïÃ P‚œÄùüß|óÍè·ŸàÝï`¿ÿ–v$¨GÑ&€PÀ7'ƒS«ôŽ‚=¥qÛp` ç÷îÝí%À®‚qÉQ…OÀ‰}~øápç�w†¥K—&=áOUá&i”D°_Rz\ €oN§æ_ø;Rk)ö† Îø5iÒ¤0{öì(@°U+çÂ  �b&0kÖ¬pÓM7…gŸ}6$ÌêçË~UºAú‹ÿÀJ‹ @iÝÏÔ«Ù¤?ÆK{$�Ô—b™·ý|ë­·‚stíÚ5Ô«W/V=
A …C`ÇŽá©§žŠýæÏŸŸôÄ¶«Âo¤aÒ—I+S¾8à Ç}Êô,�4èÿ¤Ï¤3¤XùT.Zì Á…FN@Ë–-}ƒ Š€€·Nçûè£�&]Ûï««�œÒ÷	Éÿ‡`%J  Doì—µXO–¼Tðd)¶y‰�G¼LÐË=*€A …IÀÉ¾ž~úé¨óŸ1cF&'é©ÃA’°'€Pâ78åòÖëý8iŸä¥‚±Çõ@äœ‹-ŠbŽ?þxUÇ  �B"àa~§òõS¿³	m‡Ê?$Ý%UHXÀ(ƒ›œr‰Þ×Ó™»¼J »t¬Û>ýôÓhù�ó†;6€•±ÑQy#àÎÞ�þwÜíþ™Á-RGù{ÈßÿG`eB  Lnô—é˜€	RS©‹+q�Ê…mÛ¶…÷Þ{/|øá‡á„NˆòvX¬M	]ƒ rDÀi½½®È�!á…^ˆ~›	›vboá;DòÞ"X™À(³žr¹^%ð¿ÒÉ£GK±mÕªUáµ×^ëÖ­;vÍš5‹]—‚€@v–/_î¿ÿþpï½÷†eË¼'Xbû\5þCú/éëÄµ©Pp Jâ6f|Nê1Gš$µ’~.Å~œ÷TÀÌ™3£B»víŠ�Æ�«	È��7†'žx":4¼óÎ;Á¿Á„æßü›Ò`i¼DbAÀ Pî
À�ÒZÉ�‚‰uÎ9çì›0aÂ>¥Öè$äŠ€Sþmù7–Éosÿ¶ý÷oƒ@ü§=X•�Su¥Ã¥ÌäŠ½¡ÐUW]í/îeƒ ��„‡z(¼òÊ+ÁËü2´?«Þpi^†õ©V‚˜(Á›šå%}©úc%Ïv•Ž’b›‡$çÍ›Mx§±“O>9Úr8v„ "ÞŸã‘G	÷ÜsO˜2eJ&ÃýnÇOýÃ¥ÿ”<ï�AàG8 ?¢àM
gÿš.yÉàqRG)vl€ÊFë�'OžÆ�êÔ©9�5òG P�Í›7‡‘#GFÉ|^}õÕLÖô»uÏí¿!Þÿêß4�ŸHôŸúOjòG¹ð|áUÒ0)ã1ýÓO?=úíòË/gD \þåp�‰xÄìõ×_�?þx¦ëù+¿o�Þ<(½"}_y�WH à@"ü]�õÁíÒ�R¢%ƒ•:_@¿~ýÂm·Ý.ºè¢ÀŠ�J2¼–3oÚãˆþ#F�š)p0SNÿ÷¬ô;iu¦�P¯|à ”Ï½ÎÕ•þ�º[ºTŠ�@(õË½¯€�Aƒ…K/½48pƒ@¹p@Ÿ÷Ùxî¹ç¢ŽÏoÜ™‘y¸ÿ-é·Òµ@¥²$€P–·=ë‹v�ý¯Ò¿KŽÈÈìœþùaðàÁŒdD�JÅH ò‰ÿ™gž‰2ùeÑñûò—H�H¿—2^" ºXÀ(Ã›žÃKþ™Úò´ÀRFÓ>;çž{n”ÒôÂ/djÀP°’#àŽ_kùÃ“O>&Mš²ìø=Üÿ¼äáþU%‹ª8 5‚¹ä¿äl]á-ÒåRÆ¡þÞj¸OŸ>aÀ€á’K.	-Z´(yp\`éøúë¯£e±/¾øb˜6mZpÖÌ,Ì›õ¼.=.}˜E;T…@²¥]ð‚@5¼¤ô—’·í+eå\öèÑ#80\vÙeÑ¦Cjƒ@Qð:þ7Þx#ZÒ7gŽ3ngeŽœ"yË^§ðÝ+aÈŠ@VÿIgõÍT.UGêÂþIòÔ@�l/ò¤“NŠœ€þýû‡îÝ»G9²m“úÈ¥ìóçÏ/½ôRÔù{Óž˜½õ¿*mÏA{4�ˆ  ÿòE ¥þgÉ‰H2ÎPyržðÒA;ž&hÒ¤IåG¼B Ö	x¿‡÷Ýñ{IŸ‡ýs`ÔÆ3ÒŸ¤9h�& ð8 ?ÁÁy àL‚×HC¤Ù¶ï8�SO=5\qÅáê«¯íÚµË¶IêC c+W®£G�Ž¶Æv
ì,ç÷+Ïc©Þ<)ýAZ_y�Wäš @®‰Ò^UÜSÿ›äåƒ'WU(Éqwþ_|q¸òÊ+ƒ3’O 	=Ê"Õí'  	^IDATfJÀë÷½ö˜1c¢T×vrdËÔŽ—óý�”³Fstn4S‚p Jð¦ø%Ù$yT ­”µ¹ã·`GÀÓÞ€ƒ@®	,[¶,ÞwÇo ‹�ù<µ
ðÓþs¿ `5C  f8ó-h¯CŽðˆ@çƒ?ÎìHëÖ­Cß¾}£)í�Ž;Î32#°~ýú0uêÔhˆß;ò­Y³&³†]k‘û‰ßsü+]„£È€ü±¥åxZ«˜Wxz g¼*éKyÂÎ�;‡.¸ ðA³fÍÒW¤DÙØ´iSô„ï`¾‰'†E‹G÷çÐf«-ó;ª?§EÏ‘¦Ê€ @Üä"¹Ä¦:ÏK¥�ÒÙR)'V¯^½Ð±cÇÈp¦Á^½záä„lé4âNÖ¬YQ¦>wüK–,	»wïÎåîTcNÜ3RrÞþÍ�Z%€P«øùòCh¬cÞpè_¤_J9Ã÷*‚N�:E›y‚ÓN;-xÚ +?ÎŸ;wn”�òäÉañâÅ¹ŠâO…é(þñÒ%oÔ³CÂ Pp 
â6pUplÀµ’cÚUQ&ãÃÞž¸C‡ÁY½+aïÞ½CÛ¶mÃá‡;©!VjöîÝ***ÂG}íÂçì|K—.ÍfûÝê9˜Ïsû£$Ïõc(88 wK8¡Ch£cÿ ]%yzÀ£97�8Û ·*¶3àiƒ–-�Ï+V6lˆ†óÝéû)ßYúrÈ—ŠÆO÷æEz[ú\Â P°p 
öÖpb‡ ÐHÇ~!])]$�(åÅ4hºví�x5AÏž=£=	È@˜Ü9kÔùœƒöìÙQô¾Ÿò?ùä“°s§§àóf«Õò;Òé}é;	ƒ@ÁÀ(ø[Ä	VA �Ž_(Ù8K:BÊ›sÌ1Ñª‚.]º„³Î:+rÚ´iŽ>:ã]�óv®åÔðÖ­[ÃçŸuøÓ§O,ˆ¢ö·lÙ’oßê¦Kîô'H¬ß¬¸à ×ýâl&ÐP‡zIïWG½úXÞÌ±GuT4Eà€B�8˜ÐyÊ qã¼ÌPäízŠ¥á;vé{ƒïùÉÞ�{ŽØß¶m[¾æòSñ|¯?–Hãök–^}ƒ@QÀ(ÊÛÆIWAÀ�ã}$;ž"ð(A�DôyuAÓ¦MC·nÝ¢ÀB;§œrJhß¾}ðFF¤)Ö�H`Î²çuV¬X.\uôØûøã�ÃæÍ›ó­_ÕÙíÕ~º÷¿;þiÒV	ƒ@ÑÀ(ú[ÈTAàx?GºDê'9�°ŽTcÖ¨Q£h¤À+<:à)úo¿÷´BÃ†ƒGÊÑöíÛ¾ÿþûàázã»ƒ÷Ó¼ßû)ßûÉþ»ïj|JÝYÀ7Y+M•¾”0”�òüŸ§¤n!“†€;}zdà‚ý¯¨+Õ¸Õ­[7r
LèÍŒÚ¶må!ð
;~õˆ�cˆè$FÅê ¸ƒw2ày®ÞOôŽÀwïWËËò¼™Žƒ÷ÜÙïÙ³§ÆïÉþ/ôûIßOø÷¿:¸ÏÎ �’$€P’·•‹ª†€GÎ”Î“<BpŠT_ªuó4Â‘G�
ØA8ñÄC«V­¢ýš7oe/ôÞNiìé;	žZðHƒ§?Î·³àNÝiqÝQûÉÜCõîÜ=,ïlzÎ�ï×�7Fï×®]V¯^uð~Úß¾}{Mß§»§»T`¡ä'ü÷¤¿H<éVp Êã>s•‡&àEþ�¥¾’GºK>V°æ)ºÓ÷{�x¤À�ƒJ§ÀŸùxå«ß;Á‘�„TùBÝ¡§Ê	süÔn¹Ó®|­ììÝÁ»Ã÷q?á»Œ�éù}�Û�ß|ÉOúS¤E’�a(;8 ewË¹à*4ÐñŸI^Qp®tšäy]^¨ö±üðr=GîÏ•&IŽÜ_%í”0”5€²¾ý\|5¼9ÑI’w(ô”AÉA	+\ßèÔÜá/�<¤ï�÷–K›%H!€�ƒ·¨†€÷n'�*õ–<uÐVú‰ß‘ Ô‚íÓw®“*$å$Í“Ì·IÂ  �jðW5pøÕpZb¯.°SpÆ~µ×«�`¹'à§xwø+¤ûåÎÞÑú5¾VPß‰A ¨	à õíãäˆ€KÇJŽ#h#y„ «äio!ÙiÀÒpgþµô•äáûO$?á{mþ*ÉÇýô�A YÀÈU!ƒ€ƒ[K­$;+Ù9ðhÁ1’c
Ê5®Àóõ–÷û©Þ�ü§’;ùµÒÉA| �8 y€J“HCàp}îÑ€–’óxÚÀ‚Güjù³£$;V©˜l§NÖ�·µMÚ ¹S·ü$ïWç{Ý½?óSÿ^	ƒ jˆ @�æk “€“vJž:8Nòô�ƒ[Ð|¿|ìh©r¡±Þ×—êIÎrè6”Û®”ÞdV¯”;ãåly»¥]Ò©ò	~«Þ{È~ã~y®ÞAx>¶^ò�½¸=†îƒ@!À(„»À9@ 9�:ª’ÚÁ»ã?Ròh���Ø!H}ï:•õ*ßëP”îö½ºƒö«åNÞOñî¸Sßû‰~»dG ÕAp€   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ Ø	ü?Ë‘Ûù&p    IEND®B`‚ic05  ,ARGBÈ 	-^�““�^-‘ nÉøƒÿøÉnŽ YÙ‰ÿÙY‹ ’�ÿ’ˆ ¦�ÿ¦‡  �‘ÿ �† Sþ‘ÿþS„ Ø“ÿØƒ  g•ÿ g‚ Ä•ÿÄ� %ö•ÿö%�  T—ÿ T�  w—ÿ w�  ‡—ÿ ‡�  †—ÿ †�  t—ÿ t�  P—ÿ P�  ò•ÿò � ¼•ÿ¼‚  [•ÿ [ƒ 
Í“ÿÍ
„ Dú‘ÿúD†  }‘ÿ }‡ ‘�ÿ‘ˆ |ù‹ÿù|‹ CÆ‰ÿÆCŽ V²ìƒÿì²V’ EhzzhEÉ Ê $22$” Z—ÉæññæÉ—Z� eË‡ÿËe� %§‹ÿ§%Š 3Ì�ÿÌ3ˆ #ÌÿëŒm£úƒÿ÷žl�îÿÌ#† ¦ÿë6€ gü�ÿú\€ ?ðÿ¦… `þÿ“� Î�ÿ Ã‚  ÿþ`„ Èÿÿv‚  µ�ÿ ©‚ ‚ÿÿÈƒ Rýÿÿ³� ã�ÿß€ ¿ÿÿýRƒ  �€ÿü{ «‚ÿ— …þ€ÿ �ƒ  Â‚ÿÚÃè‚ÿ˜œäÃÝ‚ÿ Â‚ ß‰ÿ›™†ÿß� *êˆÿ�–‡ÿê*� *ê‡ÿ ”ˆÿê*� Ý†ÿ¢‘‰ÿÝ‚  ½‚ÿÚÃè¦Ž‚ÿåÃÝ‚ÿ ½ƒ  Š€ÿü{ Ž‚ÿ¡ …þ€ÿ Šƒ Lûÿÿ³� æ�ÿÛ€ ¿ÿÿûLƒ ¾ÿÿv‚  ¶�ÿ ©‚ ‚ÿÿ¾„ Uûÿ“� Î�ÿ Ã‚  ÿûU† —ÿë6€ gü�ÿú\€ ?ðÿ—‡ ¼ÿëŒm£úƒÿ÷žl�ïÿ¼ˆ %º�ÿº%Š ’ú‰ÿú’� T¶ù…ÿù¶T‘ 	H„²ÓááÓ²„H– Ë Ê $22$” Z—ÉæññæÉ—Z� eË‡ÿËe� %§‹ÿ§%Š 3Ì�ÿÌ3ˆ #ÌÿëŒm£úƒÿ÷žl�îÿÌ#† ¦ÿë6€ gü�ÿú\€ ?ðÿ¦… `þÿ“� Î�ÿ Ã‚  ÿþ`„ Èÿÿv‚  µ�ÿ ©‚ ‚ÿÿÈƒ Rýÿÿ³� ã�ÿß€ ¿ÿÿýRƒ  �€ÿü{ «‚ÿ— …þ€ÿ �ƒ  Â‚ÿÚÃè‚ÿ˜œäÃÝ‚ÿ Â‚ ß‰ÿ›™†ÿß� *êˆÿ�–‡ÿê*� *ê‡ÿ ”ˆÿê*� Ý†ÿ¢‘‰ÿÝ‚  ½‚ÿÚÃè¦Ž‚ÿåÃÝ‚ÿ ½ƒ  Š€ÿü{ Ž‚ÿ¡ …þ€ÿ Šƒ Lûÿÿ³� æ�ÿÛ€ ¿ÿÿûLƒ ¾ÿÿv‚  ¶�ÿ ©‚ ‚ÿÿ¾„ Uûÿ“� Î�ÿ Ã‚  ÿûU† —ÿë6€ gü�ÿú\€ ?ðÿ—‡ ¼ÿëŒm£úƒÿ÷žl�ïÿ¼ˆ %º�ÿº%Š ’ú‰ÿú’� T¶ù…ÿù¶T‘ 	H„²ÓááÓ²„H– Ë Ê $22$” Z—ÉæññæÉ—Z� eË‡ÿËe� %§‹ÿ§%Š 3Ì�ÿÌ3ˆ #ÌÿëŒm£úƒÿ÷žl�îÿÌ#† ¦ÿë6€ gü�ÿú\€ ?ðÿ¦… `þÿ“� Î�ÿ Ã‚  ÿþ`„ Èÿÿv‚  µ�ÿ ©‚ ‚ÿÿÈƒ Rýÿÿ³� ã�ÿß€ ¿ÿÿýRƒ  �€ÿü{ «‚ÿ— …þ€ÿ �ƒ  Â‚ÿÚÃè‚ÿ˜œäÃÝ‚ÿ Â‚ ß‰ÿ›™†ÿß� *êˆÿ�–‡ÿê*� *ê‡ÿ ”ˆÿê*� Ý†ÿ¢‘‰ÿÝ‚  ½‚ÿÚÃè¦Ž‚ÿåÃÝ‚ÿ ½ƒ  Š€ÿü{ Ž‚ÿ¡ …þ€ÿ Šƒ Lûÿÿ³� æ�ÿÛ€ ¿ÿÿûLƒ ¾ÿÿv‚  ¶�ÿ ©‚ ‚ÿÿ¾„ Uûÿ“� Î�ÿ Ã‚  ÿûU† —ÿë6€ gü�ÿú\€ ?ðÿ—‡ ¼ÿëŒm£úƒÿ÷žl�ïÿ¼ˆ %º�ÿº%Š ’ú‰ÿú’� T¶ù…ÿù¶T‘ 	H„²ÓááÓ²„H– Ë ic10 �)‰PNG

   IHDR         +ƒ  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  @ IDATxì�œUå™ÿzï0Cï0ô^‚`�€ˆ4b‰Æž ÆÞÄh6š²›ì&ûIÜ$›ìúw?1–àjìÆ^Á(Ò‡^‡2ôþ~/÷š‰Kæœ[¿ÏçóãÜ¹sï{ÎùžáÞó>ïSÌ0@ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €   @ €  �I*eÒÁp,€   3�ÊþÎ*.m%}ÇKÉŸ¿úœÿÊö¹ö'¤ÇI}õ¹½‰ßùƒ   @ [	à ÈÖ+ÇqC €@6Ð÷oõ„j”Ù&'§mU—&öÕÊ<ÖsIéù¤Ê: ’þ²€²�ým_Nø“ÿäV€äcmå Ø]F{üqRú�ë÷ÉÇ»üqYíôŸ%=—Üê±öƒA €  �"8 RšÝ@ €@NÐÄº¶«Ö!¤ßÕLüNÛäkµMJï­›xMò9½V“{9äH>.ë ð§Sne'÷z¬Érb¯Ç;\ÛÚîÛ-.m“Ïi›üY¯Õãä{ôø`Ò{äŒÀ  @ 8F8 Žoƒ   �¼! ‰·&äu\š KÉŸË>×ÀŸ—ê¹ºê—‘~Öó’Vî±¿PôÀæ„6ú¶´Œô³~·)!9¤­	É)Pö9ý,G@ €ÀAà 8ž‚   �¼" 	yÙ‰½kb¯I¾7q5-³ÕãÆ‰çšùV“zE `ñP€k]ë\ë[=.I<ÖVN9ä(H>ÖV’Ãƒ   ä% yyÙ9i@ yG@«øš¨KeWíõs�«¹«E™ÇúYýžïJ‡�E¦ºr”¸V%$‡ÁÊ„ÖøV¿O:ä$ÐÏÑƒ   �Ü%ÀMMî^[Î€@>ÐŠ}2_“w©‰KúV®–‰Ç…‰ÇZÉgõÞ!ä‘)Š@‘+\«]rèñòÄc9’m•~ g@ Èz8 ²þr€ ò’€
æir¯Õü¤4Ñoëêàjçj“x¬~UÇÇ p$êb �E®¥®Å‰ÇK|+Ç@²ö@2j@Å
1@ €@ÖÀ�5—Š…  �—4qW.¾&ûIi¢ßÑÕÉ¥‰~{—&û*º§|~}·iU_[¾çVnJ#�- ­ê¨8¡œÅ®Å®®….9ÊF¨ö€	  @ ãpc”q—„‚  �·ÔÚNáû
ã×ª¾+l_“|Mö»¸:¸¾¯vxšä''úþƒ@J$r¨å¡Ò¹æ¹ä�s@éJH!ÔcµKÄ  @ i%€ ­øÙ9  �¼% ï…ñku_Òd_ýÞ®®	iÂ¯ç““üäÖŸÂ �Q’N�äV~9æ&4Ó·rèyEHJÐë1@ €@Êà Hjv@ ¯	hu¿fBšø·vi¢ßÓÕË¥þF.­ì'¥p~ÙJ@iŠHjƒ?V„À,×g.9–¹äØ‘Qƒ   �øà ˆ�-#C ÈWúnÑd_}IEøº'T”Ø*Œ_­ù4Ù—s Šƒ@®Pm MòåPËÁÕ®Ù®9‰­«¡œ’D	8€ ¢!€ ŽŒ@ Ÿ	h¥>9áW8+W×€ÄV«ýÊëO®ìk‹A $#´U»AEÌp}”Ø.÷m2e@E`€   �c"€à˜°ñ&@ yM@ßšô''þýq?× Ä¶¥o5áO†ü+wƒ ŽŽ€Š&SäXáúÄ5=±Uç�¤#@Î "@ GG ÀÑqâU€ ò�€Ví¦¯~åë'WøU´O!þjÑ§I¿Ä„ß!`ˆˆ€rHj7¨LF¨®€"”^ (€  pH8 ‰†_@ È[únÐd_+üÊÓoëÒê~_—&þm\šèkÒ¯v} �Zj/(g€œK]JøÔ¥(�%.ÕPt€œD8€ ÀÀ_  $	$'þ…þDWrÒ¯Uè¯ïÒ¤Ÿï‡�MV©ÒÑ]²ýû™+fÓuM«.šœ¥®d§�¤3àcN…q8€ ¸‰ão €@>Ð¬PRX7××\*Ü§JýÍ\�]\ŠÀb Pvb^ö±võÕŸË>§ßU¯^ÝjÕªeuêÔ±Úµk‡ŸkÔ¨aU«VµÊ•+©*Uª„Ç_Ýj¼}ûöÙÞ½{ºÕï¤={öØÎ�;m×®]¶mÛ6Ûºu«mß¾=üœt$·3i_}®ìÏe'_Ï62ZùßäZïZëR‡¥¼çúÂ¥t9ðö8€@¾8º%�|£ÂùB ÈMÉ	¿¶ªÔ?Ð5ÄÕËÕÞÕÔ¥I¿Úòaå$PvÂ~¨Çšœ7jÔÈš6mjõêÕ³ºuë~¹ÕD^?k2/•�Øk²Ÿ”Æ¨V­šiB¯ÇIiÒ¯ç´ïäþõœ,¹Mþ.ù{MÄ“Òë4á/»Mþ.é$�3 )=·{÷îð³œe•th+mÙ²%8´Ý¼ysøYÛuëÖÙ†ÂaÇþOYçÀ¡'_Ëö¨¨í œë\Å®Y®\ºÔa éÀ!à00@ ¹N @®_aÎ€ÀªÈßÓ5Ì5ÔÕÑÕÜ¥I¿Bû±c$ U÷‚‚kÕª•5nÜØ6l&ùÚ6hÐÀê×¯”œðkÕ^ïÑ$^JNè“ymËNîË®æã!¦ämÉˆ�dÔ€r$Ú&ÚJŠ,H:ä(--Ú´i“mÜ¸18´]¿~½-_¾ÜÖ¬YÞ“’ÊÝ�(U@Î€U.uxßõ®ë3—º`€  �Ãp äðÅåÔ  �¼' |}åò+´¿�«ƒK-úZ¸TÜ;­º7oÞÜZ´hVí›4i&ùšØk%_JNìµ­Y³f�&øz¬­ÆHNø�°»¼þuÒ! H9vìØñåV�ËF(j@’£@Î�’’’M°råJ[µjUˆFÈk˜Gò*¸Ò¥Vƒ‹\3\JPí ÕÀ  @ Çà È±Êé@ yO ‰Pñ>…ö÷uiÒ¯ªýÊéÇ¾B@¡ðšÄ·mÛ6¬à7kÖ,¬æk«É¾~§|Mî“¡ùÚjBŸ\ÉÿÊ�ü˜r¨A2‚ ™j�Œ"�s@N�µk×†¨mA°dÉ’à8(›Z�‚ÃÍ¦]¨f€º
È B‚JPg�@ 9@ @\DNÈkúoíRXÿ WoW;—žkäÂœ€&ñ;v´öíÛ‡ÕüÂÂBÓ$_üdÈ¾&ù_ÍÃ^öH:’õä�c ™Z §ÀêÕ«MQÅÅÅ¶páÂ�~�½gù‘oð—¹»fºTHPézŽzƒ  ��p dãUã˜! ãW?åõKE.åõ+§?oM¡ùmÚ´ù2d_¹ùZÉ×d_aüúYyúz�¤U|,ÿ(z@éÉÕ�#@NEèg(ÔsK—.¯Ë?JÿpÆª zê( Z’Š*} ƒ   �,"€ ‹.‡
ä=�' °þ~	õò­&ýu]ye*”§Õ|ÞkÙ²eÈÓ×j¾&ùú9¹º¯É¾žOV½Ï+Hœl¹	(5@Qª+ ­+V¬Ž ý¬úúYéŠPaÃ<´-~ÎrÌr}’�ÒÖ¸0@ Èp8 2üqx€@ÞPN¿&úZí×Ä¿‡K«ýy3é×J}»ví¬uëÖa¢¯U|Mô•·¯Pþd8¿Bø1ÄE@)É´¥¨ž€"- ÇÀ²eËlñâÅù- g€¢>wÉ ¨ 9J\  d  xQ8$@ ï	(w¿›«¿+9é— �+§­nÝºÖ¡C‡Æ_vu_“ýdÓ¦MC¾œÁÉe!Tª@2…@N�²QJX´h‘©AØ&?GMþ“Î€�ýñ.ÕÀ  @ Cà È�Áa@ yO ºhëR>¿Zöiò¯Jþ­\9iêo¯I½¤I½¤•þ.]º'€+œ¿Zµj9yþœTnP;C¥	(@“ÿyóæ…Çr$ë
(r`ß¾}¹	àÀY-÷�:È	 Ö‚ª°ÄµË…A €@	à H#|v@À	¨E_w—&ýªâ¼KüsÎT‰_údŽ¾¶EEEaÂ¯Â}ZñW‹=¹F@	T7@rÌ™3'8	’5ä0(--ÍµÓNž�º¼éR9f»Ôjƒ   �4À�èìÈ{
ñïêR.ÿ0—&ýrTvåŒ%sõµ²¯<ý®]»†	·nÝB?µßÃ �¯ÔŽP…¿øâ‹à˜;wnhK˜ŒPZAŽ™B4ù—3à]—jÌu‘"à0@ ©"€ U¤Ù �ïÇ®ÿ®Á®Q®A.9rÂTy¿lÛ½¾}ûZ¯^½¬cÇŽAéË‰ËÌIÄD@E.\4kÖ,ûôÓOÿ¡-¡¢rÈ4éŸîzÕ5ÍµÈ¥�Ý.€ b$€ F¸@À	4u©UŸŠù�àáRˆÖþj?™¿ß¼ys4h�õéÓÇ:wîŠøÕ¨QÃOƒ Ž…€
*e`þüù6cÆ›>}z(0˜ŒPAØ~?¥¼åzÍõ‰k¡k�ƒ   �dýhL€@E	¨ _—Zöu�r©¨_VW³S…þd%~­ôk²?`À ëÞ½{(ÞW½ºNƒ â °k×®PLpöìÙöÑG§€Ò’r Ó€VÿU4PQï»ÔM@‘t  �¨à ˆŠ$ã@ 0kìÚ»”ÏškŒK YiUªT1…õ7iÒÄ´Â¯‚}C‡µþýû‡�þ:uêdåyqÐÈ[·néü±½ÿþû¡Ž€Z–””„Ô�½{÷fói*àe×3.Õ(v­wa€  PA8 *�·C yO@qî-\�]'¸Nviå_Ëá•]YešÔ«`_ãÆ�­S§N6lØ0<xp(à§�µî«T©RPV��$°ÿ~“ÔRP)*$8mÚ4{÷ÝwmÁ‚¶~ýúPXPÎ‚,4Ôê¿"žs½æšïZéÚéÂ  @àà 8h¼€€hàRQ¿�.Mú•Û_èªâÊSØ~£F�¾\åïÝ»·><¬ò«-Ÿ~¯H ÈZùWº€Ú*:àí·ß¶™3g†úŠØ°aCø}vœÍ—G©p†Õ.Õ
�3àC××&@ å € °x) �÷ô™™œø«}ßy®!®Z®¬ù<Uq¾úõë©5ß�!ClÄˆ¦É¿Âý5á×*?d7EÈ! ‰¿œ o½õVHP¤€º”––šŠf‘©hàv×®?¹Þu%ú@ G ÀÞ ñk@ N@ÅûÔ´¾½kœëWWmWVöÓ¤_mø4hV÷�;î8“Ú·oo
û×ï«UËŠSqä P^»wï“}¥,Z´(¤	¼óÎ;!J`Ó¦MÁ!�EÎ Üæšçú_×ó®b—Z#ÐJÐ!`€ E À¡Èð< �ïôù¨*wšøv�åúš«¥++Vü5±Wå~åî«xßÈ‘#Ãj¿BûkÕª&ý¬ôûÕÄ �g ÉþöíÛCªÀ|`¯¿þº½÷Þ{&g€:
dIÝ€dDÀ
¿„ï¹žtMsÉ ÂD8€@Y8 ÊÒà1  �TÀ¯À¥Õþ3]r È�ñKäU«Vyû
ñ=z´�;6LþUØ¯víÚáw~  �/	¨fÀ¶mÛBÁ@uxñÅí•W^	)úÝž={¾|m?ÐÊ¿&þr üÅ¥¨€5.Ú:€@’ €$	¶€@¾Ðç¡*úk…ÿT—Vü»ºÔÚ¯¦+c-9éWxÿ¨Q£‚úôéc-[¶«ÿŠÀ  ­þ«£ÀŠ+lÆŒöê«¯)2 Kœ;ü<Õ2p®Ku)B@Åˆp �ßp ä÷õçì! �­ú4Á×d_«ýc]jé×Ä•±Ÿ‘ÉI¿*øýë_·o|ã¡ˆ_›6mBU…øc€ *B@)ê°téÒPDðoû›½ñÆ_vÈðÈ MöK\jø¢KQr
ÈA ƒ  �¼$�±7·yy58i@ •ªúÎ”ãßÇ¥‰ÿ‰®6.UùÏHÓ¤_…úT©_UûÇŒcZéoÝºuXégÒŸ‘—�ƒ‚@N�3@‘Ë–-‘/¿ürè* *0˜áÎ µ\êzÉ%GÀ—jdEnƒ'@ 28 "CÉ@€@–Ðçž–ÇÕÆï\×pWkW}WFZåÊ•Cõ~òÓ¤àÀ�Ö±cÇàP¡?€@*	¨@ &þ.´?üÐäPí ¥	ìÛ—Ñ‹ë¥Îi™ëm×£.µT[ARä ùq�9K@à@8¿V÷â?ÁÕ×ÕÎ•‘3hMú«T©b½zõ²O<1¬ø™Šù)×ƒ  �	4é_½zµÍ™3'D¼ôÒK6kÖ,Û»wo&;´ú¿Øõ©kªK)ŠÀà0@ ·	à ÈíëËÙA rüÄ	®oººZ¹2®¢¿&ý’V÷‡ªø÷îÝ;óSØ?-ûüªa€@FPkAE¨xàÌ™3C�·ß~;D	(* C#Ô9`¹ëC×®×\«]ÆàÇ‡A 8f8 Žo„ ²€@S?Æ3\g»zºZº”ûŸq¦	¾&ýãÆ�³„¼þ‚‚‚�óŸqËA 8ÕX³fM¨ðÑGÙóÏ?orÈA�¡¦Z +\Ÿ¹wý¯k�ƒ  �sp äÜ%å„  'ÐÜ¥Pÿq®Á®ö®Œ›økµÐ Aa¥È�!Ö©S'kß¾½Õ«WÏƒ  �ý6oÞlÅÅÅ¶`ÁûàƒBdÀôéÓ35"@Ž€b×4×ó.¥¬ra€ r† €œ¹”œ àZ¸Nq�êêïjëªìÊ(SÿèÑ£C^¿Vû5ñoÚTÁ
  �Ü%°nÝºàPTÀ[o½œª��¦€%®�]u=ëZéÂ  d= Y	9@À	hÅÿt×É®A.µóË(«^½ºõïßßF�Bý{ôèÂüõ<@ ŸìÚµ+¤|þùç!5àÕW_µ�?þØô|šÚNw=çzÚED€CÀ  �ì%€ {¯G˜5rC]§¹F¹Š\U\c
ç?î¸ãìk_ûš)Ì_UýÛ¶U`@ K–,	]”ðÞ{ïÙ;ï¼cJÈ0ÛëÇ3Çõªë×û®.€@ÖÀ�u—Œ† œ€’ä�w)Üÿ8WoWFåø«eßÈ‘#màÀ�AZñ¯U«–&@ _%°}ûvSDÀ‡~ôúë¯‡Ö‚_}]šV�€™®w\JxÓ•qÞ
?&€À!	à 8$~d �ú~LšøÃ5ÆÕË•19þuêÔ±aÃ†ÙàÁƒÃª¿&ÿ-Z¨,@ GK`åÊ•Á	 h€iÓ¦Ù»ï¾k[·n=Ú·§âuª0Ëõ²ëo.9J]  �Œ'€ ã/8%Êk•´K¹þ]³œÞ°aCëÓ§O˜øŸtÒI¡²£FÊNÀ  @àX	lØ°ÁÔ1à…^Ž€3fØÆ��u¸8Þ·ÝýÐõ´ë—¢2²��@ ÀÀ �É´º¯‰¿VýÇ»F¸jº2ÂÚµk
û)·ÿÄON ŠúeÄ¥á   �" â€šü¿ôÒK¡• 
.^¼8“Îp‡Ì[®§\Š�#@Q  �Œ#€ ã.	$tòí	®	®‘®z®´[�5¬{÷îaâ¯Uõ§¨_Ú/ ä	T× Õ�#`öìÙ¶sçÎL9ûÍ~ ¯»¦º^s-pa€ 2Š €Œº àZ¹TÙ_¡þRWÚ­~ýúÖµk×PÍÜ¸q!×¿qãÆi?. €@>X¿~}¨ðüóÏ‡îsçÎµÒÒŒIÃ/ñkòtBê°<¯çd& ™y]8*ä#­ð÷siÒ¶«½+íŸQÊïWEÿ#FØèÑ£Cq¿ø¡a€  �n›6m
­_yå{ë­·Bç€©°ßÙ»wÉð‰K  �´HûÍuZÏž�C ™@ ¶D×	.Müû¸Ò^Ù¿U«V_NüÇ�o½zõ2òûýÊ`€ 2�€êÌš5Ëžzê©/Ë—gÄÂ»jÌpÉðšëc×6@ -p ¤;;… œ€Šùuu}Ãõ-× WÚ?“Ú·oo={ö´SN9%¨M›6V¥J?4€ 2�ÀÞ½{méÒ¥öì³Ï}öÙgV\\œ	‡­ˆ€é®ÿq©cÀ\WÆ/ðcÁ  �<!�ö›í<áÌiB ÿH ¥ÿøu×9®q®´·ôkÝºu(î7aÂÓŠ¿" 0@ È^Š PDÀÔ©SC±ÀeË–eÂÉ¨uàs®Ç\o¸V¸0@ )#€ e¨Ù à”<¯pÿs]g¹š¹Òö9T©R%Ó
¿ªúŸ}öÙaÅ¿°°�¿(  �\  ˆ€Õ«W‡h€Ç<8!°¿äÓfJXçzÒõ¨Ki›\  �Ø	¤íÆ;ö3c€@&Pž—VûÏsuw¥-Ï_!ýíÚµ³Þ½{Û7¿ùM3fŒiâ_¹rÚÉq`€  �}ûöGÀË/¿lO<ñ„Íœ9Ó/^lr¤Ñä˜íú“ëy×ç.ê8ˆ� €øØ22 `¦äùB××•®ã]U]i1Mü›7on]ºt±/¼ÐN?ýtkÖ¬™) ƒ   �Ü' •ÿµk×Ú3Ï<c?ü°Í›7ÏV­Z•nGÀ'ÿ¦ë7®·\«]iõLøþ1@ G	p×›£–Ó‚@H¶õû¶ËÉ.9ª¥ã¸4ñoÜ¸qXñ¿è¢‹lÔ¨QVPP`5kÖLÇá°O@ H3�;vØš5kìÕW_µÿú¯ÿ
Ö¯_ŸNGÀnG¢‰ÿs®‡]´t = Ñ3eDä;�Z@ô¾éºØÕÉUÝ•rÓÄ¿I“&6`À ;÷Üs¿õ¯V--~ˆ”Ÿ?;„   �ÃØ½{wˆ xå•WìÑGµ�>úÈJJJÒéØåG¼Àõ_®'\êe¸Ý…A ˆ„ €H02 àôy¢ÉÿX×¥®Ñ®:®”›BúkÔ¨aÝºu³I“&Ùi§�Vü«WO‹"åçÏ! @ |víÚ"”ðÐCÙ_|a;wîLg±À­~¯¸þàzÑ%'@Z+úþ1@ à È�‹È)@ hf­•þK\\m]i‰¯WXQQ‘Mœ8ÑN>ùdëÜ¹³Õ¯_ßƒ   ž@ii©ÍŸ?ßž{î9{ì±ÇlÎœ9¦t�4™v¼Ä5ÕõG—"!€A 8f8 Žo„ œ@W�ël—BþºêºRnZñïÐ¡Cõ?ãŒ3˜ø§ü
°C@ ¹C éøßÿýß�°hÑ¢�¦3ÜâûýÐ¥”€Ç]k\{]  �rÀPnd¼púìP¸ÿñ®I.UùoâJi=…ú+Ÿ¿cÇŽ¡�ŸBý»wïn4ðCÁ  @ #°iÓ&›={vè ö�.4ÕP7�›Z–¸Ô%à!×›.Ò”�€Vï0@ å! I~;×U®\Ã\Š±O©CQ“ÿÂÂBÓjÿ�wÞigžyfhïGe¿  DB@ß)­Zµ²~ýúYÿþýCqÀÕ«WÛÖ­JÑO©é;Vuu:¹¸º»J])÷Fø>1@ K	¤ô†=KqØ€Àß	(¯œë»®!.­ú§Ô*W®luêÔ	ùý\pA¸)ÓÍ™*þc€   �¸ìÝ»×–/_nŸ|ò‰=òÈ#¡N€ûöiq>å¦h€\ÿázÞ•¶B¾oÈ"8 ²èbq¨H#Í®‹\—¹Nwuv¥<Ü_+1cÇŽµ	&ØÈ‘#­mÛ¶LüýB`€  �:r,Y²Ä^ýu›:uª½øâ‹¡P`šÒæû™?íúO×µš €C³á7€ÀÊõ?Ë¥Uÿ~®”—ÔW¸ÿðáÃí¢‹.²Q£FY›6mB›??€  �j¸téR{õÕWí¿ÿû¿íí·ßNGm �»Ò >q)àI—j`€ J€˜ÙƒbáI@À	Tuuq)Ïÿ
—rSÚÚOÿnÝºÙw¾óûÞ÷¾g£G�¶-ZXÕª:4€  �>ú.jÜ¸±uíÚÕúôéc¶nÝ:+)Qt~J­†ï­�«»«¹k™k“+-¹	¾_È`D dðÅáÐ �F�|ß]ç¹4ñOyYýF�Ù9çœcgŸ}vÈóoÚ´©@ ÈLšü«>Àã�?nþóŸmÃ†é8PMü?rýÉõ˜+-áûÅ  �%€ C/‡�4¨îûíåºÒu’«­+¥¦<ÿ“N:)Lü•ç¯p€  �-” ú r¼ðÂ¡>@Ž}‰ïó×o\³\»\  #€?@ I@¹ýÊõ¿Úuª«Ð•RS¸ÿe—]f—^zi÷oÒ$åMRz¾ì€ r�@ƒBZ@ÇŽMÑkk×®©)>SEîuvµwiÁ¯ØµÓ…A yN @žÿpúHP…ÿï¹´ò?Ü•Ò\µñ;ï¼óìª«®2µöëÒ¥yþ~0@ ÈNª ¶�ZçÎ�­~ýú¶zõjÛ¼ys*OHßåú~ïéjìZîJy�ß'd t18¤�@=ßçi®›]Ê÷oéJ™)ÜÿôÓO·k®¹Æ.¹ä2dˆé9€  �ô�¦è¶þýû[§N�Â)Ûž={Ryz*¢£.>:€Ý.	$%À!`ÈG8 òñªsÎ8@@“ýs]“\'ºj¸Rb•+W¶=zØ7¿ùM›4i’�zê©¦�I€  �‹ NmÛ¶µêÕ«ÛÖ­[C·€ýû÷§êtõßÍ¥Â:J	P4@JÃ| �p dÀEà �bZbæº*!µJ™©eÒøñãíºë®³+®¸"„FªÝ@ Èeú®SZÀñÇoª [±b…mß¾=•§-À`—ŠìÈ°Æ•Òpß¤‘ €4Âg×H�¾O­ú+äÿL—R Rbµk×¶¡C‡†"šüík_³5Rt�’sd'€   �#ÐwŸÒT@-owìØŠîÞ­èü”XßË —"ä�_áÚâÂ  �< € .2§' ÿë*t¥ëšÄã”-»wèÐ!ù»á†lâÄ‰¦( €  �Ï6lãÝ»wiê°qãÆT!Ñ=€¢ú»êºVºT 0e9	¾/H i€Î.!�bJ®WŽ¿ªü_àRØ_JLyý#GŽ¡þW^yeXñPþ?@ €€™¾U`Ð AÁ9®(€uëÖÙÎ�)ëØ§À*ØÜ¥�®Jl}ƒA ¹H @.^UÎ	'ÐÞ^äºÃ5ÒUÝ»U©RÅŠŠŠìâ‹/¶Ûn»ÍN>ùd«SG‡  @ _% ïH9$uP4À†,EEuoÐË5Ð•L	HY(ÂWYð3 / ñòet¤‹€fÛ#\×¹&¹Z¹Rb-Z´°Ñ£GÛ-·Üb—^z©ég€   �#hÖ¬™wÜq¦Ô9ÕØ´i“mÙ’²ô|Eq¸J]k])+LàûÂ  �À�Èì)&ÐÌ÷wškŠk¬«¶+v«V­šuíÚÕ.¿üòPáøðá¦ç0@ € Žž€¾;U$°_¿~!znåÊ•Á°oß¾£äØ_©NA½]}\›\ª°Í…A 9B @Ž\HNN@Éõ]]ßuÝê*r¥$á¾eË–vâ‰'Ú]wÝeçŸ¾5o®TB€   �c%Ð´iS<x°©Hà¶mÛB�ÀÍ›7ëpåyŸîZº¾æªáZîÚà¢@ CÀ �íp dûäø!p€€*øžàR®Ê
ýÕ­[×úöík×\sMXõWK#Výý
`€   �è;µsçÎ¡unAAA(XZZj»víŠ`ô#¡VÁªÐÑ%ÀjWJvìûÁ  �˜à ˆ	,ÃB …ÔSoœë®ã]òÖÇnZ™8é¤“lòäÉ6~üxZûÅNœ@ €@¾PW�þýû[ïÞ½CqÀÕ«W‡¨€ðP�À.®¾.9 ”°Ý…A YJ @–^8N@•zÛºTåÿ6—Âÿcÿ?­ÕˆŽ;šÚúÝtÓMÖ£GVý<@ ˆ“€:ì(ånÈ�!¡6À’%KL))¨ ” ÕR4€Ò –ºT$ƒ ²�@ì“…,dÂ!C h•_}{ïq]êR®ž¾ cµ&Mš„
ÿ?üáí¬³Î²ÂÂÂÐÃ8Ö�28  @ �@åÊ•­aÃ†!`À€¶~ýú�°}{ì‹òºÇPÄá W;×bW‰k¯ƒ ²ˆ €,ºX*T¡÷8×ƒ®±.åÿÇjºáÐd_þUèO•‰Õ§ƒ   @ õjÔ¨aíÚµ³¡C‡†�ÏŸ??¤ìß{�¾Z¾Ã"W/××*×d	 Yr¡8L$úö×]®.åæÅjšèk•áûßÿ¾�wÞyÖºukVýc%Îà€   �#¨T©RˆèÕ«—ÙÒ¥K­¤¤Äöì‰}>®ùC—"w»Ô%`«ƒ ²€ €,¸H"œ€Bï”ã¯*ÿW¹T�'Öÿ¿ZõWÈÿ\
ý�92Ühè†ƒ   @ ýô�¬Ž<]»vµP\\l;vì°˜£’N€ÁNA½ç»h˜þ?	Ž G$ëâˆ{ç€ÀÑ¨ã/R/Þû]g¸”ƒ«iÕ_½‡Uáÿ’K.	7U«V�uŸ@ €À±Ðwt‹-BÄž¢V®\ik×®ME4€Ò»»º¹–ºÖ¹€A J @†^	õ}{¶k²k˜K¹w±ZýúõC�?MþO8ákÔ¨Q¬ûcp@ € ¢!P¯^=ëÒ¥K¨Õ³uëÖ°sçÎh?ô(JGTaÀþ.¥,tÅ¾Sß Ç �·@ E”_7Éu“«‡+Öÿ¯
#ìÞ½»Ýxã�vÕUW™r
Õòƒ   @ {è»»U«VÁ	 ¾ÉÚ 1Ÿ�îQÔ‘Hu2¨”€-.È0±N(2ì\9dåû÷vÝæºÜ¥/ÔX­N�:vÒI'Ù½÷Þkgœq†5oÞÜÈõ�9ƒC € b# ïpEðÉ™ß§OÛ°aƒ-_¾ÜvïŽ=:¿¡Ÿ”œ *Z¼ÄµÖ{kß% G	Š—A EôrŒë^×).}‘ÆjÊ¼âŠ+ìöÛo·AƒÑÞ/VÚ@ Hµlß¾½80Dõ-\¸Ð¶l‰}a¾¶Ÿ¡Z*zQm‹]8�L € ®Ç �êùf‚ëN—ŠþÅžïß¿»õÖ[C¥ÿŽ;²êïÐ1@ €@.P4@Ó¦MCšŸZù.[¶ÌV­Ò¼<VS]€6.ÜìZìÚåÂ  �4À�æÀî!� ÐÊ·ßuÝèêãŠõÿfÃ†müøñvÏ=÷Ø¸qãB»?ß'@ €@ŽP‘_ÕúéÝ»·mß¾=¤¨]`Œ¦{™Ö®¾®.”3 ƒ ÒH ÖIFÏ‹]C ›töƒ½Åu…KÞòXM¡€×\s�]wÝu¡]…þbÅÍà€   �Œ! ï|Ýôë×Ï4h`J	Ø¸qcÜÇ×Äw ÅµšçZïÂ  �4À�&ðì	
�»ÖuŽ« ñ\l›ž={Úµ×^kç�w^¸ˆmG@ €@ÆhÜ¸±)õO…—,Ybk×ªV_¬VÇGoïRºc±k�ƒ Ò@ @ ³K8ýß;É¥�ÿ‰.yÅc³ÚµkÛ¨Q£ìŽ;î°³Ï>›�ÿØH30  @ ;(%@é ŠX¿~½­\¹2î.r¨0 ÒU‰p‘‹â€ƒ@*	à H%mö�TW“~ûû†«¦+6kÓ¦M¨ò¯�ÿN8ÁªWW]€   �|' ”€¢¢"ëÑ£‡Õ­[7D”––Æ‰E7!E.E@nu-pÅÞ›Ð÷�A 	8 øS€@j	4öÝ�êÒÊÿ`WeWlÖ¹sg»ì²Ëì;ßùN(ü£JÀ  @ HÐ½AË–-­k×®V¥J[ºtiˆHþ>†­î}ÐÖµÁµÂµÝ…A ) € �ÙÚûör×u.Ã‰ÍÔ÷W«ýÊ÷¿ä’K¬  öò±�C €  ?T{`Ý3lÞ¼ÙV¬Xa{÷î�sÇ-}ð^.uXâŠ½¡ïƒ@ÞÀ�÷ H�ž¾Ÿë]WºäõŽÍôÅ}Î9çØÝwßmcÆŒ±ZµjÅ¶/†   @ wh¡W¯^Ö·o_Ûµk—-[¶Ì¶nU¤~lÖÔGèªëZìZëÂ  �	à ˆ.CCÀ	(æ~˜ë×·\ª~›©¢ï¥—^j7ÝtSÈé«\9ÖƒØÎƒ�! @ HÝ;´hÑ"Dè±R6lP¤~l¦ZHŠPšä*×rÄD @L`N@³ïã]w¸”÷¯â±™zú~÷»ßùþúâÆ  @ €À±PJ€º¨“ÐêÕ«mÕ*ÍÍc³j>rWk×2×R�¨	à ˆš(ãAà U¹ëú¾k”Kùm±X2ß_!ÿ'N4}ac€   @ ¢4ùW:€"åˆ¹.€œ �\]]ò6(% Ö">>�¼#€ ï.9'œš�OpMqqÅ‡_XXhãÇ�·)S¦ØñÇojçƒA €   �¨èÞB]…úôéc[¶l	‘ 1ÖÐ=“º(%@yK\;]  �d$4òíD×Ý®‰çbÙ´k×Î.¼ðB»í¶Û¬[·nF‹¿X03(  @ ï	èCé…°={ö„â€›6mŠ“Ks\“´“E®.ˆ€ € 2ôeu±ëvW‡Äs±lT¡÷ºë®³«®ºÊš7×n1@ €  /�†ÚÀ�­^½z¡8àš5kâÜa¼¿K rlqa€@	à ¨ @Þ' Jÿšð×u“+¶yÍš5mØ°av×]wÙyç�guëªk@ € RC@í…U uëÖ¡&€œ Š
ˆÉêû¸j(+vÅv �`Èu8 rý
s~© ÐÉwò×U.y«c1MþGŽi÷ß¿�5ÊªWW�A€   ¤–@ÕªUC]€=zØâÅ‹mùòåq:ÔE©wâ	kOÂÔ’doH= ©gÎs‡€VþU©öf×å®†®XL!wgœqF˜ü«ÝŸ¾x1@ €  �.UªT±–-[†º %%%!%`ÇŽØRõkùyöuÕsÍs­wa€À1ÀpÐxœ€–ßUäï×ù®Xbñ+W®l�:u².¸ „ý«
¯žÃ  @ €@º	èž¤Y³f6xð`Û»w¯)`ãÆ�¶ÿþ8M-•uïÕÔ5ßµÑE›@‡€A <p ”‡¯…ÀZùW>š*ý«ÝŸBÓ"7UÜUßÝë¯¿>ü+(( Òä”€   �ŠÐýJƒlèÐ¡¦tÅ9sæ'@EÆ<Ì{ÕïXÑ—­\\+\ P8 Ê‹—BÀ	hù}¨k²ëDW,“yÔUéÿöÛoÅþôÅŠA €   �L%P£F�Ð–X,°uëÖÅ	 '@{W;×B—œ ±„ø¸rŽ €œ»¤œPŒô…s¼ë^×(WMWä¦üþãŽ;Î¦L™b§Ÿ~:•þ#'Ì€€   ÄA@ EEE!‚qéÒ¥¡KÀ¾}ûâØUÒ	ÐÙ_ìZîŠeGq<cB �p ¤“>ûÎ&Ê;;Íõ}××\ª¹É{®Iÿ}÷Ýg#FŒ0ýŒA €   �l!P­Z5ëÐ¡ƒõéÓ'D,\¸0Ôˆáø5�iãêéZçR4À^† €ÃÀáWHÐÿ““\S\\±”à¯S§Ž�?Þ&OžlTúwÊ  @ YI@Z´ha={öN€E‹ÙîÝ»ã8Ý£µp©.À×é ƒÀ¡à 8ž‡ÀZé?Ù¥•ÿþ®XþÏ4mÚÔ.¹ä»õÖ[M=uUPƒ   @ ÙJ@÷2………Ö»woS€êlÛ¶-ŽÓQ}¦BW‘Kõ Š]D8#Ëdæ`;â9d!åøŸåºË¥•ÿXúïµnÝÚ®¾úêPé¿}ûö¾€   ä-rôíÛ×”0oÞ<+--�ãÄ´r¢H€n.µT›À=.ø
 _Â�HPq™s\÷¸z»bY’W›¿o¼Ñ®¸â
SÕ\€   ä�zõê…H€ºuëÚÜ¹smÃ†qœ¢îÕš»T Ä5ÛEa@‡€A , eið(ì_+ÿ·»ô%ËäðàÁö½ï}ÏÎ?ÿ|kÒ¤‰ïƒ   @ ¹I V­ZÖ¥KSkã5kÖ„1œ©îÙšº:¹ä˜ç"À!`HÀ�$ÁÔñ�&ÿw»ú¸b™ü�5Êîºë®Pñ¿aÃ†¾€   ä6�Úµk[·nÝB›À•+WZqqq'œŒP:Àz—ºÄR�0ŽƒgLÄM @Ü„?›Ôöƒ½Âu“K+ÿ±Ø˜1cìž{î19äÇ  @ €@¾P‹cÕ<R«ÀåË—›ÚÆdÊ­ìáRÀLN ‡€A  8@ †o&ºnpéË";õÔSCØÿÈ‘#M_€  @ È7É6�Íš5EU0&kæã¶s)`Ž‹t ‡€å7 ù}ý9ûTíÿl×®XVþ+W®l'N´»ï¾ÛFŒÁäÿ wþ…   @ O	T­Z5¤tïÞÝ6mÚd³gÏ¶ýû÷ÇACN€®.9äi ;€CÀò— €ü½öœùŠÁ¿Ôu½KÕþ#7µ½ùÖ·¾ewÜq‡õë×ÏäõÆ  @ €@¾HFÙ–-[‚`ß¾X
÷+ ³K Ÿ¹p8,?	0ÉÏëÎY  V§»nqiòyÁ?»9óÌ3í†n°þýû[¥J‘ïÂƒ   @ ÙI@÷Fj…Ü¦M›	 š »wÇ’®/'€ÒVº	‹§ÁÇÅ �Ñp dôåáàb$�œüßãûèëŠ|f®ž·ZùWÁ¿^½z1ù�ñb24  @ ÙK@N€–-[Zß¾}móæÍ¦š »víŠú„t¯WèR:À*×|N ‡€å ùu½9ÛT}ïL×í®þ®È'ÿjíwñÅÛm·Ýf�:ubòï�1@ €  p(r4iÒÄz÷îmÛ·o·¹sçÚŽ;õòŠ</'@'×—œ tXþÀ�?×š3=@ ªoÆ»&»ú¹"Ÿü«¢íE]d7ß|³µk§H3€   @àhh¥gÏžaò¿`ÁÛ¶mÛÑ¼­<¯Ñ½_W7—"æºˆpX~À�×™³<@ ²oNtÝíÒä_?Gjò\ûÛß9ÿLþ#EË`€   ä	�˜º(@é ÚFlr¨;@××BW,-|\E @F]&FZùåº×5Äùä_+ÿ—]v™ÝrË-Öºukß@ €  p,	 š ;wîé 1F¨;@±KŽ "–Ûp äöõåì�—wŒKaÿC]‘þÝ+g­E‹aòÓM7Ya¡RË0@ €   �Š¨[·np¨  Ò¶nÝZ‘áö^Ý#* “k©K‘ rš@¤¡œ&ÅÉe3�A~ðšü�p©ú¤Ö¶mÛ�óíµ×ZóæÍ#›Á  @ €@>¨S§ŽõèÑ#tX¼xqh1E…¶Lh¶oWD<>ÃA £à È¨ËÁÁÄ@ ·�©É¿rÿ«G=¾&ÿW^y¥]ýõ¦ €   @ Zj­<`À€0¨jlÚ´)ÚˆUþ¦Â8åXõ™B @¦\	Ž#júÛîáºÝ¥ªÿ5]‘YåÊ•C…ÿ«¯¾Ú$å©a€   @ ñ¨U«VHÐ=Øüùó­´´Ôöï�´nŸêE©(`#—:¬wEºƒ@Ú	à Hû%à b"ÐÉÇ½Ñu¶«NÔûÐÊÿ…^h
ûW¥Z€   @ ^5jÔ-·lÙb1¥È	ÐÞUÛ¥H 90ä 9u99™�6¾½Þu‰«ž+RkÕª•}÷»ßµë®»Î5’“ƒ   @ H�š5kZ¿~ýlïÞ½¡;ÀæÍ›£Þm°›KÎ€Ï]¥.9C @Î\JNÄ	¨’«Š¸\åºÒéä_Õþ™ü;U€   ¤‘@2`Ïž=Á	 ˆ€ˆMu£”Jº×õ…+òø˜ÒB @Z°³Ó˜ø¸ç¸nvE¾4_PPÂþÕê�•ÿ˜® ÃB €   �£  H€^½z…‚€ª	C‹@Eôt­u-rEÞƒÐÇÄ �r8 RŽœÆD@«ýçºTô/ò^|�7¶‹/¾Øn¼ñF+,,Œé€   @àh	Ô®];ÔØ¶m›Í™3Ç¶oß~´o=Ú×©@/×:××.�¬&€ «/Ÿ  
ÿªô?ÅÕ.ñ\d­ökòë­·ZË–Ê0À  @ € 2�@ýúõ­wïÞ¦4 9vìØõa©Ú³"–¹æ»ö¸0d- Y{é8ð…g�uÝáîNœ  @ IDATë*rEjZùWµÿÛn»�É¤d€   DC ^½zÁ	 ‚€Jˆ!@©¥ºÏ,v-v©6 �¬$€ +/�  ¢#]“]ý]ú92«S§Ž�þùvóÍ7[»v‘Dvœ@ € ò�€"ŠŠŠlãÆ�öÅ_ØîÝ»£FÒÔlïZà*vaÈJ8 ²ò²qÐ	C|«°ÿ®Hÿ–«W¯nçž{®Ý~ûíÖ¹sçÄîØ@ €   d*¥mÊ	PRRb³gÏ­#<V-4µpµr©Àr�¬#é¤)ëÎžÎf*Èr§kœ«Z”'R¥J›0a‚Mž<9|‰D96cA €   ÄG I“&áþmÅŠ¡&Àþýû£ÜYe¬­«±k¶k�ƒ@VÀ�U—‹ƒMèêÛk]jùW#ñ\d›qãÆÙ½÷ÞrÉ"”�  @ € RB Y³fÖ¥K[¼xq¨	ñN5êèÒÔ<W‰ƒ@ÖÀ�5—ŠMP‹¿+\—¸ê»"µñãÇ‡VC‡µÊ•åäÅ  @ € ²�@AA�µjÕÊ6mÚ"">~MþåP[@ElqaÈ
8 ²â2q�	šð_äºÎÕ,ñ\d›SN9Åî¾ûn6l˜U­Z5²q€   @ µ´�Ó¦MëÐ¡ƒ)@Ý"¶Ú>ž:lr}îÚéÂ �ñp dü%â ô·z¦ëW›Äs‘mFŽÉä?2š@ € ÒO@N€–-[G@qqqH	ˆø¨êúx]\Ë\Šˆ´à€�‡A r8 "GÊ€18ÎÇ½Ù5 êñîÕUWÙ˜1c¬F�ÈK
D}¸Œ@ €  p”äP:@íÚµmùòåAGùÖ£}Y#¡¤z K�öM¼é"€ ]äÙoy¨Íß�®“\‘&æ÷éÓÇî¼óN;õÔS­n]9q1@ €   �\"P­Zµ�
PXXê¬^½:êÓStªœ +\K¢œñ % QÒd¬8¨Ýßí®S]‘.ÏwìØÑn»í¶Ðò�É—Ž1! @ €@fP”g»ví¬^½z6sæLÛ°aC”¦ª.ÚFI•±b!€ ¬úûŽk¢+ÒŠÿê{é¥—ÚE]d6Œèp€   @ S	T¯^ÝZ·nm[·nµÏ?ÿÜ¶oßå¡ª3€ºU©àL×6�Œ#€ ã.	” ÐÀ·º®v&ž‹dS¿~}»âŠ+ìê«¯…a"”A  @ € 2ž@�:u¬sçÎ¶k×.›5k–íÜiñþZ@‘ ¥®/\‘îãa¨0 FÈ 1¨écªÝŸ&ÿ�¢_á_ßþö·í–[n±¶mÛF94cA €   d�X·nÝlãÆ�Á	°wïÞ(�ZQ«í\
/˜åÚãÂ �1hvž1—‚)C@Åþ¾çêQæ¹
?¬T©’�vÚivÃ70ù¯0Íì`Ïž=Áë/�ÿŽ;Âc}ñïÛ·Ï´•öïßoUªT	Rõ`=®Zµª)t°fÍšAzŒA €@ê	ès\Ÿßú—´’›üüN~–ë¨¾ú9®Ïm-ès\[}®cùK@Aº'\·n�=ùä“á»?Bº‡Õ½¬Š>á¸�
à“¯Â bý|<­üw‹r\Mþ�?þx»ñÆ­k×®QÍXH`Ó¦MVZZj›7oÒÏI)ïO7ŽÚ&ëfR7�»wïþ€n““Ý,ÖªU+´Rø «��jHh%A�•^’‚üÃà�  �¬  Ïc}†ës[ŸÓz¬•Úägû¶mÛ¬¬ô™®÷è³<)�¨>¿Uý=ù9®‰¿ZÁ••>»5j>»UX?ë3]Ÿír c¹M@÷„º7\»v­½ùæ›Q;t/«{ÚÅ®Or›$g—M*eÓÁr¬9O@9SS\ç¸jGu¶šü6Ìî»ï>9r$ÿ¨ÀfÀ8ºÑÓM¡¾¸×¬Y¼ø«V­2I-~’Ïëgý~Ë–-‘µnÕR¨E‹Ö¬Y³ æÍ›‡~Ãê9¬Ç*8Ù´iÓ ºMDŠŸÁ  �  ÉûúõëÃçµ>³õÙ­Ù•+W†ÏrUj×sú×sZí�Òä hÙ²eø¼nÜ¸qøüN~®ës\�õù®ÏrmqîFI?3ÆÒ½Äë¯¿nS¦L±wß}7j'€
þÙuŸkQfœ1G‘ïp äû_@æœ?”[]—¹Tý?2SŽ×ý÷ßo§Ÿ~zù‹l`J9­ÐëQ7‡+V¬°¥K—Í�;×æÏŸo.Œº­Ï1Ÿ£Vœ:tè`j7)uêÔ)¤ž´jÕ*8tc‰Cà˜ñòF@ K	(d_Y}–/_¾Ü/^l‹-²Ø¼yó‚ôYŸ	¦H/}ŽwéÒ%|Ž«pœÂÆ“^mU€e?ý]>ýôÓ6yòdûâÕî‹ÔÖúhÿéú©«$Ò‘Ç@ À1@ã-‘¨á#ªèß÷]­¢]+³·Þzk¨ú¯°>,û(ä3y£¨›CµíÑ„ÿã�?+BÊ×—%·™x†ŠB‘)� gÏžÖ·o_ëÕ«Wp
¨'q2j ùºL<Ž	€À±())ù‡ÏqU^×g¹¶ú�>¿3ù3\ç�ü|Ö¤_aã½{÷ŸçrÈ) HE{aÙK@iƒ¿ûÝïì§?ýiˆ6‰øL–ûx?pý·‹Î Ãe¸òÀP>^¼:zú<Ù%¯h�(‡WþÞ¤I“BÅ¾”£$ÿX
ëW¨§&ü3fÌ°™3gÚ|`Ë–-ù�ñAü{ÐÍ¤" `ƒ
7“Z]jß¾}p(‚ ƒ  ��TˆOŽ[Ej):ëÓO?Ÿã}ôQXõÏôÉþÑ2×ç¸î5>ÇûôéÚËµiÓ&¤$�G;¯K?Eþìg?³‡z(¤F|DŸûxŠv}Îu`õ"â0Ž† €£¡Äkâ" ê:]šüïÒÏ‘˜
úœ{î¹vÇw˜VX±Ì' Ï»&ø
½ÓªÐûï¿oo½õV(ú”ùG_ñ#T=¥«|ýë_·�†&¥hU‰JÕçË€@ü4yZ²dIøŸ6mšIŸ|òI(äÿÞÓ¿”`ÄˆÁ¹«Ït9X„Hÿµ)Ï(-åÁ´G}4ê´Â}~oºäøÐ¥Ÿ1¤œ €”#g‡e´öÇ÷»"-ú§•ÓSO=Õþå_þÅ:vèh•*óg^†yF=Ô*�Vû•ª�þ_|Ñžyæ™8¼îuÞG:­)Uà¬³Î²Ñ£G‡ÜSÝ@’kz$rüH5åëës¼¸¸ØÞ~ûíðþÞ{ïåÍ¤ÿP¼Õ-føðávòÉ'ÇnëÖ­C·Ä2›Àþ}ûmá¢…vÓM7Ù_ÿú×Ða"Â#Nœìc.‹p\†‚ÀQ`ftÔ¨xaÄêûx×»®qD5¶&NC†±_üâaKŸ¨ÈF;ŽŠí¨¢³Büÿö·¿Ù³Ï>ÂDUÝ9SŠ?E{ÆåM»ª6­ÊÓú›VKmµš¤Vƒ  �tØ¾}{HÕRxÿË/¿¸Ë—-·]»wE=aJçiVhßŠÞÒç¸ê�;ÖF�"ô³¢°Ì% 4¥ÞpÃaqÚÊ?ó_¹þÕUš¹8²\%€ W¯lfŸ—ŠþMpýØY|¾¾h»wïn?úÑ�lÜ¸q„Mgàß€Úð)·__ª�?þ¸½öÚk¡—sÔm�2ðÔ+tHŠjÑMd�=BT€n"U/@©.¤T-o† ÊA µ¥Ïq­öÿùÏ¶?ü0´XÅy{x�ZùW!ØãŽ;Î&L˜`C‡)Šúg±âðìÒõ[µ|þùçí®»î²Ù³gG]ƒh±Ÿ×í®©.Š¦ë"çé~©2•§>Í§ÝÝ÷ÿO®ž®ÈœPjÓsýõ×‡/V}Éb™C@7†
ó×éO~òû÷ÿ÷PZ+H{÷îÍœÍÐ#ÑM·nD5¡ºŠšØºukÈ+UwÝXRl*C/‡�!°cÇŽÐ®OÎ[9ÚÿøÇ?†È-}Žkµ;<1’³[-_yå•ðY®ŸUçEé8sÏ/¿•cFQwº§œ3gNèXáq4ð±”
ûŽKRF @ÊP³#' É~¡ë.×‰®ê®H¬Y³fvé¥—Úå—_n´û‹i$ƒèæFU 5ñWA�?üááKT7Œ‡ÓEr¼Ù0ˆ&6l…µä_U¡VZ Ž€l¸‚#²‹À¶mÛláÂ…öÄOØ½÷ÞkS§N“X}¾ó9^þk™tèª`âôéÓƒ#@Ep	 ûågç;ô½ªˆ;E0ªu¥þ?Ddº'nâªãúÀÙÀ>�ÃÀpX<ü2bšü_íºÀÕ0ª±kÕªegŸ}¶Ýzë­¡íNTã2Î±ÐjµBDU<G+E¿ÿýïí³Ï>_ ¬ø;×²ïT1V…íW_}5¬Lèæ±Aƒ!] ìky@ ¼ô£Õê‡~Ø&Ož&þ,0VüËKòà¯—#@QŠŽS×¥T(²Ku_pœYºžUÞ¢¢¢àpW§"ÝãDdª©( 9>wmuaˆ� €Ø³ƒy8¿éRë9"1yÊO8á„°*Ñ±cÇHÆd�c' ÉýúõëíÍ7ß´ú§
}t•7'Ï9!¢ÇÎõpïÔ*œúm«‹‚ÂJKKK­yóæV·n]V’ŽßA % ”-9µâÿƒüÀž|òIS[4MV±xÈÙ¢h.9T#Gß—úW¡@êÄÃ¼¼£Ê)£Ö¼r èÿC„÷4º?.r-wÍqívaˆ• €Xñ2x‚@eßvÝçê”x.’�ª¢ßsÏ=6xð`¾$#!zìƒè¦ñ£�>
9þ¿þõ¯Ch£Â#ü’<öƒËƒwÊPRRb3gÎ7‘
[lÙ²¥)B†ú yðÀ)B 
o~ã�7‚W+ÿšìhÅK9’sçÎu^”â¨"°|Ž§æn/ŠÎÐ÷ªê,[i¿º¾ßö®]rìwaˆ� €ØÐ2pòl~ß5Â%g@$ÖµkW»å–[ì”SN	¹Ï‘Ê å& Uÿ¥K—†‚P?þñ�C�ºÕ«WSÜ¯Ü$£yƒnÖu=¦M›Ò.´ŠTPPÀÿ‘hð2
r’€¸šì«@ëÏ~ö³ðù±qãFrüÓpµ• T ¥[¨Î‹¶mÛ¶©D¤á‚”Ù¥ø·nÝ:mTZ£œîZS«™ëc×ºÇe(ü8 þžˆ˜@{ïZ×Y®š®HLUs'Mšd—\rIXáŒdP)7…ö+Ï_ù¡�=öX¸QÑ�$–~Š¾˜7o^¸�ÔªR«V­B¡@n Óm8dUeÿ)S¦ØsÏ=BÑ©Õ’þ+¤<sM0UxNÑuŠ Ðä“¨®ô^µåU*€Rbä�³&"ÓY+WU×®�.±ÀVMPH“òþå h”x®ÂåÄ�?Þn¸á†Wá ÜÖ¯¸_þò—ö›ßü&ô�ŽðK°ÜÇÃN@7ñª4­:³fÍ
ÿ_ä ÊôÁyñ,ò‰€&˜
eþùÏn¿ýíoÃgyþ™÷ §ºê|úé§á³¼E‹!gnú®•R2Ú·o¢íäh�páC=¬;º”_ 'À.�È	à ˆ)&¨¢éñ®É®‰ç"ÙŒ;Öî¸ãëÖ­[$ã1Hùh5ù…^°x ¬ú/Y²„<ÿò!Lù«0þüà¨‘ó¦C‡!„‘œÒ”_
v�Œ °iÓ&{ôÑGC®¿VýUôË\JPJ†6Š�iZÕé±ôPÇ¥f‡h»�BEÛ¹f¹Š]"'€ r¤˜  ÙùÝ.9äˆÄ†&ÿÇwq"!zôƒhâ¸jÕ*S�¿û·¡åöÃ=úá•ÇD@×oÍš5¡H œºyQ8©Â1@ ?(*H¹þúW¾ÿŒ3LN],;$kîèº©X >Ã›6mJä4]>¥£ªH£¢ t="4ÕP»ìO\Ôˆ,C À�	qhéƒ^îú–«zT;P¸Õõ×_ÂÿUáK­>¨ÍœZB=òÈ#¡7´žÃ²�€¢T]ZE•NÓ¹sg«QCQ‡ �ËòÿÔSO™Šµj+‡ –�Á¡üódj—>Ç‰èJýµLÖe�#]x¥‘iá¬�k›K© ›]"#€ 2””  	ÿ)®ë\…‰ç*¼©S§ŽMœ8Ñ.¿ürkÔ(²r>®|@7�¯½öšýó?ÿ³=ûì³Q~Áå¾Œ<G]SÝü/Z´(tkPN)ÿ¯2òRqPˆ„@ii©ýùÏ¶ý×µwß}7ÊÂe‘ƒ”Ÿ€òÎÕñEíè4Õ"	)åçXÑw¨¦Ž¾C!©ôŒëè~ºµk‘kŽk¯ƒ@$p D‚‘AÊì�ïqõ)ó\…Ž3&„þËË�¥Ž€V‹ÿô§?…ÉÿK/½å[êN‚=’@2%@¦ÔÛX1@ ·¨�Üï~÷»ö¯UJ*üçÎõMäU4€VŸ»téÒ»rç³ãLêÕ«gmÚ´	© J±‹Ð´âÕÂ5Ó¥Â€"!€ Œ’  ¢%7¹Nu©�I$vÂ	'Ø�7Þh#FŒˆd<9:*î÷«_ýÊzè!ûä¥¡a¹H@­UXJÑ Ö®];òIsñBsNyI@íã½õðÃG�£œ—<3õ¤×¯_BÐUÌ±k×®!/=S�5W�Kõ I'‡º
FhJ«Õ|íS×¦Çe¨<&€ �/~Ä§®–ã]“\õ£[V¯½öZ;í´ÓLmW°ÔP‹?µ÷ûÃþÚý¥f¯ì%]” k®Æ††PRZ¦ëj°_DC@Ž[9qŸ|òIÛ°aC4ƒ2JÆPGÕwÑVÅUœŽV�©½\Š¤sýßS�†ˆLjŠXìšëÚåÂ P!8 *„�7'¨XÉ(×Í®Èzó©Jù¤I“ìâ‹/“’Ä¾ØÄH@¡¡ÊaÓŠÑïÿ{Óª–JªPáÙ³g[ýúõ­cÇŽÌ�KÏYæå «nËÏ~ö3›:uª)ÊËræ*ÍCé“Î\:½¤îÚk¡JWê¬ñé§ŸFÙaC‹lª«µÀµ0ugÄžr• €\½²©=/MúúRT»•uÂ„	¡ê¿òª°ø	è¦ñÍ7ß´Ÿüä'!ï_«XþX½zu¸�TáM9Ô) ƒ ²ƒÀ®]»ì™gž±|À^yåÓÏX~�#?™ÖÕ¤IëÔ©“Ñ•º¿}gªžŽŠ3jA%ÂŽI*¨PXÕ 5`ê.iNî	@N^Ö”ž”ú”^êºØY/±‘#GÚu×]gC†IéÉäëÎ4ùýõ×í�•þµŒå/…«W¸V3ä¨[W‹ �É´êøôÓOÛ�~ô#ûàý¢œxdòisl‡  	èÂ…C$€RèpP1<-Ç‹¢XUK)âz mýpÕkp†‹Uš®]¾‰ _®t<ç©¼¤1.µü‹l™^­lî¼óN=z4yÿñ\·U“ÿ·ß~;¬ü«Ò?�@«HºiTeiE`€@fPÄÖóÏ?&ÿ*ü‡A@TP©]Z•Öçx�‘­Ó øš7oœ Ó§O�²}².`3—ZHû]ÊM @¹‘ñ†2’¡ÿ#Ë<W¡‡Ê=VÑ¿óÎ;/ä!Wh0Þ|DZ1R®¨Vþ™üWÞ½@EŒfÍšeÕªU³îÝ»“�wœp6Øºu«=úè£Á‰ûñÇgÃ!sŒ)$ â®ŠèR«:uÀ	�øŠ SQ@¥dÈ	 û­ˆ¬ÀÇ‘#@Q ¤D5ß†Á�oW<ºóÕÐE.…þGVž_Õþú¯
¶X¼ô¥¤œÿÿøÇ!W4Þ½1z¶P1U––sN+HµjÕÊÖSá¸!�s4©P¡¿ûî»/äçÜ	rB‘PA_¥¨Õ«jÐU)¬GDß—ŠP€
ìFhJPk�/\[#—¡ò„ €<¹ÐŸf5ï|×®VQ�Ý»wo»ýöÛmðàÁV©’`qÐäÿƒ>“ÿ^x!®Ý0nŽ(--a¤Š(**Â	�#×•ÓÈn;wì´^|Áî¿ÿþ¨'Ù†£?(�uëÖÙÒ¥K­iÓ¦Ö¡Cœ ¥ý“�5
© 3fÌ°5kÖDµ-¼©+€z*€ÂM;z8 Žž¯ü;�aþð×À¿?U±Gª˜:eÊ;v,…j*†òˆïV�?MþUí_£0�’’ÓŒ
õìÙ“›Ç£�Æk ­ü«Ú¿
þ©ç8�£!°bÅŠ	PXXh�;w¦;ÀÑ@«àk´ %Þ*¨{¯Í›7WpÄ/ß®Z �]
-Xúå³<€ÀQÀp�xÉ?há?Ýä:Õ¥"€6›4i’]tÑE¡Zm…d€ÃÐÍâƒ>hùË_û:~	�¯P:ÀgŸ}ÂH•@éW	ñ3â' ^ï/¿ü²}ÿûß·™3f][âgžK{Pa@uPÁeõ¬¯R…©@Ü×Wu”Úº}ûvS‘N_ŽÈZú8
™�æÚÑ˜“ø_Ÿ9ÂSTÈÑD×%.y#±aÃ†Ùm·Ý¾Œ"�AI@_ü¿úÕ¯ì‘Gá¦ñ�”øÅá¨0à¢E‹B1©víÚqóx8Xü1P.±Âþßÿ}Û³wO{`È\' €:G¨(`‹-H»LÁW'Õ`Ð"ÌâÅ‹£Ú£âš¸V¹f¹öº0‘ €#"âe÷ÇWº¸"IÒ×Ï½÷ÞkÃ‡g"Qt5qûíoaZ‡Ê˜N@¥Ô"°W¯^aUƒš~Á8¼œ °ÿþÐW\\Ï=÷\”UÅs‚'Q>*îªi¥t)<‹Ÿ€ê4lØÐÞzë-SD]DÖÀÇ©éZäŠÌ³Ñ±1L†À�¡&«¹Ó]®“\*XakÜ¸±]sÍ5vÎ9ç„ö4�I@_4�=ö˜ýüç?7å b¨…«˜ÑòåËmÀ€¡¨N€Šå½82Epýâ¿°ÿùŸÿ‰2�øÈ;æ9I@ŸãŠ&Ñgw¿~ý¬nÝº9yž™tRJ·P= 9óTSG˜LrJ¨ãzÇ™gÁÇÂr” €½°Ÿ–þN¾íºÐ‰›¸råÊ6jÔ(»é¦›¬M›6.Ã•% /ùgŸ}Ö~ó›ß„/œ²¿ã1Ž•€þ®Ô_Zÿ—Õ¹ƒö€ÇJ’÷AàÈ4QxòÉ'CñÖ�7ù¼GA@�Ô¢N­êúöíK$æQ0«èK”
 ÞŸþyè®#g@¦…¹F®×G®Hõq°%€ G/lÄ§ÕÇÇ»ÙÕËIè¿ªþ«€Ñ AƒøÂ‰øb}u8å›ýô§?µ7Þxƒ¼ÿ¯Âáç
Øµk×—m¥ÔP…Ž0@ Zš¤)døž{î	ÅÛ¢�Ñò�ÀÖ­[Mi]*
(É©‹ÅK ~ýú!@÷ej³‘)„C’`uDc2LŽÀ�£6ÂÓRnÑ­®Ó]*XaÓß�7ÞhgŸ}¶© …û?ðÀöÔSOEYu6¾fä¬# ›—Y³fY·nÝ¬cÇŽ8ô²î
rÀ™L@«ƒ_|ñE˜üOŸ>=„gòñrlÙI@÷
r("S"¥+Þë¨T EÈ¦M›U=-ÐºäÁyÛµÓ…Aà p O&hÂQBQP©V­š�rÊ)Á €X|¶mÛf=ô�ýñ�Œ²ØL|ÌÈYK@&UUzèÐ¡¡Ê17�Y{)9ð#°téRûå/œ¸Š¸Á 9šæÏŸoºo2dˆ5h µ,N5kÖ4EÃ.\¸0°WZ]¦T ¥ênvÍpÑÀ!`ÿ— €ÿË„gþN §?Tá¿Þ®
‡þkR Ïò”)SBá0ÂÌþ:êG
�:uªýçþgøb‰z|ÆƒÀW	¬[·ÎªV­Òz”ãˆA # Y}Ž«uë†*6ï†À$ëºhò/'€V©±x	("V�”
 GzDÖÐÇ‘à}© AÍµaøß�kW4ºóQlþ®“]‘„þkÅÿŽ;î L¢»PiæÌ™¡Oô|@ÞÿÁ ñ\ävïÞzwèÐ!¤T¯ÉÇFäÇÉ€ÈZ‘}ï½÷‚Ã|Ñ"u÷Â ?E $ëtéÒ%þæù´Ö´iÓÐ	ëã�?Ž*ZSvr hŽ÷ºk·ƒÀ?Àð8ø!A@ã]Wº"	ýW®¿Úý]{íµ¦öX|´RôÃþ0Tþ×¤ƒ@ªlÞ¼9„3ª¥TÛ¶mÉ#Mxö“s/^l>ø ½ùæ›8qsîêfö	©ÅëÎ�;­gÏž´xMÁ¥R*€êç¨Í§Ú2Ftß¦T€¦®Å®9.º8ìïp ü���çPýDïtrERVÂ&Ožlò(“ìTc2­ýå/	¡ÿ
ÉÆ �jr@iUC>êÕ«—êÝ³?d=…þ«pëüÇ„ÂlYBœ@VÐ}ÄÚµkƒãiøðáF4Wü—Omt	 nrÀDdú®åzÃ¥š ¾$€àK<HPòî$×D—Ú‰TØTéTUÿUüOE ±xèK{Îœ9¡ê¿Zÿég©& ú*\Ö©S'ëÚµ+ÿçS}Ø_VÐÿ}~«M.¡ÿY})³úà•
PRRbJéÒ7ñ^Nñ•@ÛS´€§T€í®]„„:ì  ü%”%PÕéºÑÕ¡ì/ŽõqÃ†mÂ„	ö½ï}/:9Öqxß‘	(üú¿øEX9Ú±cÇ‘ßÀ+ ­`*œQ]èöd†ÍIsçÎµ_ÿú×öâ‹/úŸ“W8{NjãÆ�¡Gý°aÃ¸KÁeS]Ê^¾|yH¥‹è>N‹zÍ\JP:@$­|,Ë	à ÈòñáËS8Å5ÜÉßÆÀ�ÃJFçÎ�ñ G|±Ê§ê½Ï=÷\hû§/é& 9 û÷ïo
oÄ  �ÃÐªëO<ªþë1�tH¦Ô­[×FŒR»Òy<ù°o±–`úôé!’.¢snäã(¢÷,AÍöa"ÉïÎv  Õÿq®a®HÊwkåïÜsÏ…dŒcûG“­Gy„�ÑØ3py	¨ˆ”êQÌš5+ª¢Få=^�¬" .ýŸÑÊ+�L  Öt/½ô’}öÙg¤¦à‚è^YÅuïaôœîéuo¯{|Ýëcˆf•Ž9A «Ÿ…Vÿ{¸*ìÒŠßøñãíúë¯7õ”Åâ# œÑÇ<þ‹°�l|ÌÈyC@í¤ÔKº{÷î!¿1oNœ…@9	¨xæŸþô'ûÿïÿÙž={Êùn^�ø$?ÇU°F�ñíˆ‘}g¶oßÞŠ‹‹C]§ˆ>ÔÚ[]ÞqQ!:�Îï*<ÑËo|9sö5ýL.r©ê$¡ÿ*þuùå—[aaaÎ@ÊÄQè¿¾$~øáP°'�‘cÊ_
!ÕŠæ«¯¾jÛ·«ŒÀ´iÓBWDy¿ÛÏAà˜lÙ²Å^xá{ã�7¨KqLËÿ&Ý;ëZ÷Ò™îíu�¯{}ÝócyN @žÿøé+4hˆë—<„¶‚‚;ãŒ3LùÿX¼víÚeýë_mÆŒ¦H ™D@ U’~úé§CQ£L:6Ž™B`Ù²eÁI¦à2‘À’%KìÑG5¢Swut­{iÝSGdºÇ×½¾îùuï�å1 y|ñ§ÞÒ·×ººD�BmþF�mW\q…¿¢ z˜14¹š?~øR&gô0 øUÚ	¼þúëaõˆ(€´_
 	üíoÅÿÑ…A 	(
@‘\êS¯{,~J¥Õ½´î©#l¡­{}ÝóëÞËc8 òøâû©«4·¼�c]µ]¶.]ºØ…^hmÛ¶­ðXpxšL©b´Šó°úxVü6½ÔðÉ'Ÿ´Ï?ÿ<½ÂÞ!�a´²ª"kóæÍË°#ãp ð�Ö®]jT(ªKÝKëžZ÷Ö™îõuÏ¯{ÚóD5‡Á��W-šc®äÃ¹.qÕsUØê×¯o§Ÿ~º�5ªÂc1Àá	$Wÿ§N�úôþÕüé'ðÎ;ï„( ¢UÒ-8‚Ì  Ïñ×^{-(3Žˆ£€À¡	¨³‹>Ç°{÷îC¿�ßDJ@÷Ôº·Ö=vD¦{þK\šh.€å! yxÑ§¬Òügºz»*ü Ö%ÊW:ï¼óýO Žs£/âd^5áxq’fì¨¨¯¹êU|ôÑGQÉ8Èj+W®“Õ À �ÔrXµ ´ÅRC@© º·Ö=öÿgï<à¥*Îÿ=€R¤÷^.¥)M”&MÄöB¬(h4±—Xb7š¨‰‰&Q£1–cŒñ÷O4±boQAP¤X@i*þç{î½Þ\¸»;³»çÌyæó9w÷îî™3óÌìÙù¾óÎ;ž¶ÔÖ˜_ci ¶é*L3Æî* b×$)P{í	:Ý^¢�vîÜÙxà�fàÀ�©@š/"Á/·QÍþ¯\¹2Í(¨{ÂhæH3žÄHXÃQÜ¼xòÉ'�âc� �Ú¥B»<ûì³lWYÀFÓØZcl�µ=%�ý¥¤¤	H)#€ e^VÝûx„=¼,Ô¯[·®™4i’Ùo¿ýÒI³Àµ–ë�‚ñÌ�;—`<fÏåÜÈsåé§Ÿ&€FÎ€€fPe›7o^ µ¡
i"°|ùò(þ;¶Õ5ÆÖX[cnOI@Z@š€”2 RÖà¶º
ú±›= ¤¶=œS¹e²M›6Îy‘ÁÖ	hö_Ç‡zˆÙÿ­£âÝ˜xá…¢u¤_ýuLKH± �ÿùÏ¢ïAþ¯Ä à—€<¸äð¿ÿýÏ°s…_¶[ËMclÏž¶Ò ÒÒÜü ßÃ `£n¥J5ì{Z÷s¸=Ä95kÖÌì»ï¾fäÈ‘Îy‘Aõ´ŽZ³FsæÌÁý®z\|"†P®ÏóçÏ�aé(òO@»b<þøãæ•W^ÉÿÅ¸ò@@;hg�IH…# ±¶ÆÜ{{JÒÒÒÒ¤”À �’†.«¦î
ú1ÄGµ·Ùf3aÂsÐA='åŸÀÇl~ÿûß\ïòÏš+ä�€–h)	i$ @˜2â²}k[?Œ:Ëˆõ·¿ý-ŠGD âÂµ©ÆÚskìíqÜ-M màÍªP8"\)W r%—¼óÔÖ;ØC_òZ>Šß®]»h=RII‰�ìÈ£rµ{ÿý÷£ Q
ÄC‚@R	(ê¹DÐŠ+’ZÊ�œH,=ÿüóæí·ßÎé|N‚@\,]º4êËl	XØÑ˜[± 4÷”¤	¤¤Ð…ž Æ=:î-ä¯|ímVú‚wó‘¥‚�Œ;Öì±Ç>²#�(â?Ô3 ÅGA@ Å A M$šÔïH��$Ð˜D^ ìFTøVÔØ[cp�¥¤¤H) € �l«¸­=FØcš=¼øê�1ÂL›6Í´nÝÚfI*��>ú(ú±]¿~}!.Ç5 �WAŠ@0À¼b&ó˜ÐÒ—W_}5f¥¢8Èž€Æ"ZÎ%o¼ ²ççr†ÆÞƒk,î)IH#(CiRà0 ÞÀeÕÓV{ÛÃ‹Z—ÅQÖÇÑ£G§ƒ^j)‘ôÖ[oE?´¬·‹AƒPg«V­2¯½öšY´h‘s^d �$Ð2®gžy&º—'¡¼”ÕÐ2®þóŸÄ%ªTÞ×\cq�^ ÒÒ
Ò¤À	` ¼�mõ´¶gg{LòUUÝpvß}wS§N_Y’O5ôï¿ÿý¯Ñ>ê$„BàÝwß�Œ ¡Ô‡z@`kÃE}ž­Ó¶F‰÷’D@Á }ôQ£]H…% 1¸Æâ“{LÒ
ÒÒ¤€	` ¸qËªÖÇ>l�¦>ªÚ¡C3uêTÓ§�²%Š€¢ÿkÛ(Üì
Eœë‚€¼Z4#Š *m®QlZöBð¿b·×÷I@c’7Þx#ê×,çòI6³¼4×˜\csOIZAš�A¾' qÍ@\[ÆO¹êÙl´žgœ�ìjÖ¬iöÞ{ï(ðˆž“
C`Íš5‘Ë¨f�H‰€�ÿûßÿXR£R—*	hË?­—~ç�wª|Ÿ!�T£È�Ë®.…oA�ÅPcs�ãriiiR Pq�6lYµv²�ØÃË—xøðáÑM¦mÛ¶aS‹Yí5ú©§ž2ÿ‹YÃP/Þ{ï=óúë¯{É‹L WóæÍ3êëxqÅµ…(W®4óÿÄO˜eË–åšç9Ð˜\ �Ñ=%iiiR 0 Ú°¶ZÍì¡µ<²â9'™>}ºÙu×]M�5œó#ƒÌ	(ú¿‚ì0pÌœŸL¹DkK@B& Èÿ,¹ŠÔ-¥˜Xž-sçÎe9Wú€Æä›kŒî1  ´ƒ4„´)@ lÔ²*³�ß³GmUÜsÏ=Í¸qãL£F�|dG�Û¨~T%’X'�!4>–(rÕà‘ R‰j6
›%­ÿ— 	!Ð}ü•W^1

H*<�Í5F×XÝS’v�†�– H @€�j«ÔÒcíÑÃGõ7nlöÝw_SRRâ#;òÈ‚ÀçŸ­‘Æý?h|4q.\¹G'®àX¾|ydÈ]½zuŸæ#H-˜3gq ŠØt£k¬®1»§$!-!MA
Œ €À´¬:Cìã>öØÆGõ´¶hÄˆ¦vm/Î>Š”š<´þÿ¥—^JM}©h:	hfT.Ò$„H@�.eä"A TåA.µc©84F×X]cvOIBZBš‚ �5¨­Ž"ôía�î>ªÖ¹sg³ÿþû›.]ºøÈŽ<²$ AãsÏ=—åY|É"ðá‡Fî£Ä¹HV»QÚÌ(È¥b¹� 2-ã’±‹e Åke�Õ5f×ØÝS’–�¦ ú·' qÉ@\ZÂ_9d©ÛËÎm«-E¦M›f†ês{5<'¹Ô}ðÁDÖ¼�©ž1êë2vÉã…�Ð¼öÚk BkTê³Å)zóÍ7�–¼�ŠC@ãv�Ù5v÷´- ´„4^ ÅiÒ¼]ÕY$æ­ddœ�.ö¤1öèdçÔ»wï( H«V­œó"ƒì	hO] a—�Ð	hÐˆ›tè­œ¾ú)ŽË¢E‹Œ\¤I™€¹2 ¨Ï“ŠG@cvÔÞS’¦c�.ö B @ YVmÙ±Ÿ=œÛµV­Z‘qÀ€FÏI…' =uåNG‚@H$ÑßÓÐÒé©£Œ·ï¾û®ùôÓOÓSijšZåq –,Y’Zq¨¸Æì»ËÀÓø]šBÚBƒg¡‡ª¡h�»ÛÃK¨þ!C†˜É“'³í_{Æ'Ÿ|bä:J‚@hö_k¥I…€ o½õ–Ñ½œ�Ð	¨¿/^¼Ø(¦/Åmmm¨1¼Æòž’´…4†—ÝÅ<•‰l` p€³SÇØòõQ&Yµ•H÷î^âú(R*óÐ¬‘– � �k×®�ÖI¯[·.Õ¥Ž)  A4wî\£àh$¤�@¹€@€Åom�á5–÷ä 
IcŒÑRò	` H~ªÝì!Ë\;ýã’t£�ÅpÒ¤I¦aÃ†.Yq®�õë×G–t~D rjâ( î£‰k6
¼ZýöÛoc Ø^“€< ÃˆT\Ãk,¯1½'#€4†´†4)á0 $¼mñÕ†Ú¢c„�ªÔ¯_ßyä‘¦G¼||ðÌ5ýxjÛ¨5jäšçA q¾øâ‹Èð•¸‚S`TA@ÁÐäÍö–UÀá¥`	ÌŸ?ßè^N*>�å5¦×ØÞS’Ö�æ@?zZ¬lhÀb‘÷wÝ^6«Qöhíš¥¶4h�9r¤Ï›…k±Ry~¹@ît$¤…@yÄô´Ô—z†M@�-W¯^v%©6!0oÞ< ›0)Ö¿þÓklïi[@iiiR‚	` HpãÙ¢«ý¦Úc¸�j(hˆ,…%%^âú(Rjó�Z°`AjëOÅÓI@k¥‰{‘Î¶­Ö2ÞÊše\¡µ,õ©Ž€Æ.ì|Q¥Â½¯1½Æöã{JÒÒhHO@‹‘�Wêþ®)ÜD{tpÍRëƒvÝuW3zôhS¯^=×ì8ß‘€Üç0 8BäôÄP ú}âš�WA@ -ãÂ P^
š€biçvˆG3kL¯±½ÆøžbHsH{à�&Î© rÂ‹“´8|{lï£4Mš41‡z¨iÛ¶­�ìÈÃ‘€ Cs„Èé‰# µÒ×lx–.]Ê€-°áå°	È˜«�]Hñ  ±½Æøë{JÒÒ ªò´ÐÙ` (4q×“Ÿþ8{´pÍRë‚†µk×vÍŽó	lØ°Áh	ÀªU«sât$�€ÖLkðH‚@’	È`áÂ…x $¹){NÔ÷µ`Íš59�ÏIþ	hl_>Î÷@ÚCDZ„”@ Øh¶È²¸íg�þ®ÅW”ù-Z˜#Ž8‚ÙW˜žÎ×�&ûF{‚I6‰# €¼ 4ˆ$A ©´  Ì‚&µ)·ÝÃYþâBÐÿ¹òÐX_c~O;LIƒH‹àà¿¹òž#€¼#ÎË´Gß${8Gþ×Ú í*Ë ³ÿyi«¬3e4kdœ	 Pƒ¦´*êÇl…–ÒÆ§Ú‘€xu„r/ �ù=Åú’‘aßðx5uF¥Á �¦X}¨–-ÍÞöèã£TmÚ´1‡rHdô‘y¸X·n�Y¹r¥{Fä �(ïÿx $°ñ(òwV­\eä@‚@	h+cÝËIñ" Ù�ù5ö÷”¤E¤I¤MH	"€ A�UVÔööq/{èÑ)É8bÄ3tèPS§N§¼8Ùýhâ:ç�'9%‹€ú¿�$$™Àª/1 $¹ý(» nüòu¶ÆúókìïÉë×›&ÉW�É·j ªæ×WÕ^ŠºÙÛÎknÚ·oY6l×ú¦²\Ì€¦²Ù©t�r  t‰$PWíjA‚@	,[¶Œø1mx�ùå à!I‹H“H› )= -T4V¡Hû¹N#›�—µÿ²üí´ÓNfÈ�!¾öõSCr‰~4Ù€Ž�V
š†@Z[?ŒzËx¥{8K ÂhOj‘=¶ÌžY¡Î¨U«V4ö—ðäP@…” ÒPeÅkµÞÆyö¿]»væ ƒ2ÌþÇ¯¬_¿ž% ñkJT êÿOx 8—Ésýæ›oò’7™B î´ŒQ÷rR<	hì/ -à!I“H›H£�B @BÊ³¾=¾g�Ž®E®_¿~õôèÑf›m¶qÍŽó=Ð¬‘Ü IH#¹MK<‘ �dº‡c HrRv6lÀ à0Ïçjì/ À¤	<$ii/™y(YTC @5€bò¶Tú.öØÉÛº–©K—.fúôé¦iÓ¦®Yq~hÐˆå<`É24pÄu:ME!·B@}/–­ â­à	` ‹wKHHxHÒ&Ò(Ò*Ì,z šï,0 ä›°ŸüëÙlö·‡óì¿"€jÝÿÈ‘#Í¶Û:ÛüÔŽ\6" M‚Gm„„RD€þŸ¢Æ¸ªº‡Ë˜E‚@Z	` ˆwËKHHxÚ	LEZEš…s bÞ@¶xj£AöØÕÎ®5²ôpÀ¦qãÆ6;R	hÐˆ Ž-C™
A€%0… Ì5òI@3ÿ òI˜¼“@ /˜ø·’´€4�'/ iiiôeÌ›ŸŠyÙâ•Ïþwv-ª¬}ƒŠöÿtÍ‹óóG@ fŽòÇ—œãM@â‰™£x·¥«ž€îá,¨žŸ— ß�d´íˆ#"màÉ+XZ/€4=€ø7R[ÄQöhàZTíù¹×^{ùßdžÏ¯Y³&[3æ™1ÙÇ—@�5èÿñmJ–!mµ¥¾L‚@Z	h,Ãw þ­¯¤¤<$iiiRŒ	` ˆqãØ¢Õ±Ç¾öèäZLÝˆwØa3vìXnÈ®0ó|¾Žž,±y.)ÙCÀ?E'ö´7±ÿÂ‘#2  Ñ£{¸~wIH+ÝË1 Ä¿õÕFÒÒžîYÒ,Ò.Ò0¤˜à×)¦SV,mÐ¹‡=¹³k×®fêÔ©¦eË–®Yq~ž	èŒ Ï�É>¶d Ã Ûæ¡`@üdŠ�K@÷rR2HH#H+xHÒ,Ò.Ò0¤˜À Ó†±ÅRˆþñö(±‡³aïÞ½ÍäÉ“}Y÷l‘Hù" MIH# ilõðê¬{¸§Ù´ðàP£T`“œfÖ½JAZÁC’f‘v‘†a»1@ó‘€|Põ“§¢iîn�¦®ÙµiÓÆì¶Ûn¦U«V®Yq~èGÓÓ–,(-—€€_ô¿<É­8äÅ‚ 8ì¹jñ	È­@ñÛ!›H#H+H3xHÒ.Ò0Î»—y(YTA @PbðR][†]ì±£=œ­g²èí³Ï>¬ÅŠAÃfR4pŽù˜É¥øbG@Æ/%bíhìš†eA ~ýú ,xñÑ°èÎDF²ÚT¿¹Ò
ž¼ ¤]¤a¤e¤iH1#€ fRVœÆöñ0{8›áš5k÷ð´®'ž´+UÝºuÙ©!°6¥:™Pÿ×ÞÄ$$•€Ò@ÄrIjRnW{Ö«§]¬II" ­ €€j?IFZ†t0}g�À7Q÷üÔ&=ì±³=œïž%%%fÂ„	¸"º·KÁr�Õ\³GÌ€9ŠyÀà£¡(9À 'lœqñ H^cjÙ’4ƒ´ƒ‡$#-#MƒÞô Ôg4ˆOš~ò’ï÷^ö�åÌ)øŸÜÈ‡nè§däRå¨ ã"ˆ5rÞø$fµ¢8i# ß_Ö@§­Õ©o9 å$’÷(Í íàa)ª4Œ´Œ4ëZcÖ0 Ä«AôeÑþ™{ÚÃyÿÌòÈÿr©%%‡€Üæ@Éi/Jê—@ù <`ür%·ÂÐ=œ% …eÎÕâC iÓ¦†±g|Ú#›’¨Ý<î -#M#mã4©™Mølõ0 TÏ¨�ŸØÎ^L3JìáôEÑÀcÀ€fÈ�!…,?×ò@`»í¶3Mš4ñ�Y@ yÔÿ›7ož¼‚SbT" ~,# †¬JPxšº‡ ¹Í-í áÁˆ)-#M#m#�CŠ	 1iˆ²b´¶�ß³‡óÚÿ.]ºD�<HÇ«�3)�¬¯´[&¤øLˆ$œZ¶l‰p
±qST§Zµj™Ž;²:EmNU+hK9ÝËIÉ$ 1¨‚JKxHÒ4Ò6Ò8¤˜À “†°ÅÐd§²£–k±vÚi'3fÌ×l8¿„E Ö_¡ô\nÔïÙÀ�!gÇƒ€ ÜÇãÑ”¢°ð (,ï|\MBZÂC’¦)×7ÎœÊC– €øtÊØÇÎ�24{¶óÎ;›víÚÅ§v”$+@íÛ·Ïê>�¤PÐ4Ý¿ž–ô–¤ürýoÝº5nÐt…T`Àä7»4„´„~“=$i›½í!­CŠ 1h[µCw{ìfçàýû÷7ãÇ�·Y‘’J@€:$µø”9Ð¬‘fMIH: Ú¶m‹tÒ’ògM@kÿu/—7#)Ù¤%¤)<$i›±ö�Ö¡cx êš�àJÐÏùŠø6ÆmíQÃ9'í=<tèP£ HÉ% % žÖ^%%O;wîœºzSáðÈ Ð©S'– „×´Ô¨º‡·hÑ¢šOñvHKHSH[8&iiœ1ö Êµ…Pì„ Ø-Pzý.öa’=œ×þï°ÃfÒ¤I¸Ð–rMì_y 0šØæ£à9ÐÖQx¾ä�ÓbG }»ö b×*(ßºwïnt/'%Ÿ€–ãISH[xHÒ8Ò:]<äEŽ0 8ôpú¶6M×oïš—¶ëèÛ·o´u‡k^œ_\
Õ¦M"¡·¸z�	4lØ0Z7]àËr9ä…@ã&�£™Pí@‚@ZÈˆ«{9)ÚPÚÂÃ–€"­#Í#íC*" E„_viÄ�E¬¶kQzõêeF�EmW�18¿víÚ‘@[’ �š5òp(-È¨gŒ	Ô¬UÓl¿ýöôé·EóO €¦ÅÌQ©ÒÒ’´Ž4Á =ÀtÉ€=÷sÅ¿‡=ÆÚÃ¹-FŒ}IÝ‹Eq  Ò={öŒCQ(òN@kKJJˆšžwÒ\ PjÖ(5 hOtÒ@@³ÄŠ€@X­-€4†‡$­#Í#íã¬{<”'µY ¿¸MßÌ^~{´v-†n¶;î¸#�ã\AÆè|D#˜cŒ„¢ä•€¶ò4Ã�×r’92% @€=zôˆ"¢gzŸƒ@’	hé¢îåì �äVÜ¼ì
J-�áÉ°#Í#í#D* E_vÙ®öqw{8/Ô^�ƒbÍxqÛÓëÕå­`:$¤�€fI»uë–†ªRÇ”�@^-2æ’ :Œ<x°Áã%¼–Ö½LCZÃC’æ‘ö‘"‰ €"�·—Õ ¯=†ØÃië?Ò—RkIáÐV€D�
§M©É–	hÉ‹Ä	!�!WýºNmƒM‚@¸d Ð,q³fLì†ØÊÒÒÆ¤Ò<Ò>Ò@Î !².D�0 ‚rÕ×ho_Ö‚çQ�ÜfµOg½zõª¾¯&’€n²ÚGš h‰l>
�Í.´mÛ6
|™Åi|±' ¾­�³Ü¢I™€Æ,Z¶¨ÉRx¤1¤5<-Õ“ö‘’"� €"@/»¤¦ºFú¸¼,rÚ¦ƒ‰¢�vÚ)¼ŠQ#T" RÍ±n´žC@ ÝËI™@‹-¢˜LF…ÛÊÒž–’4nEê. Š¾¾½ì`{tu½¼ÖZ6Ì¸åÅ%  @ IDAThÛRxP@xíJ�6&ÐµkWÓ¿ÿ�_ä?B@»¹àHcR�*	hö_ÂPcRy½�Â$ ­!Íá)Îƒ4�´�4©À0 xÙå:ÙÇÑöpæ?~üx3dÈn¸ÅiÇ¼_UëGûôéc´µ	¡Ð¶QžÜ
CED½L@.Ñ;ì°ƒÑ~Ú$„H@c 5jbõ¨Sw¤9¤=<$i i!i"R�	8Ð—7”Ë)Ôµs(MY\wÝuWöŠ¥WTQÝl%Žúöí‹{t|x)ù4h¹�2pL~[Rƒ-�‡‹bº� " däÚn»íB¬uªD@MÒÒ ’´�4©À0 ¸½œö¿f�–®—ÖZ­›­_ïW–q>_.WcÇŽÅ Î�DÙr& ÁÄÀ�s>Ÿ!�ýûˆŒ¹I(+e„@64QÑ¯_¿h·â¸dC.™Ÿ•æ�öð{LZHšHÚˆT@ 
»ìR=íãX—Ým·ÝØ7ÛÈ˜ç¡íÑFŒaj×®ó’R<dO@ ÖÿgÏ�3’E sçNÌ�&«É(m†4û¯I
$¥ƒ€¶¨–ñ”¤‰¤�H$€ €°í¥ä/£}/wt½¬,pZ‡Ãq®$ã~Ýºu£8 Š@p�ø·%Ìœ€ÜEå6ª`—$„L@"I[hõèÑ#äjR·Pß>|8ëÿSÔöÒÒ ž<�¥‰¤�¼¬)HQ38U€¾¬OV¨~íéV/ë379aÐ AÑ@A¸	˜@ÿmÞ¼yô»Í6ÛZCª•FŠþ/7BîcilýôÕYž.êó$„B@â÷ÿPZ3ózè7[ÆLiIšHÚˆíÌ<ÀÌ4 ™’òó¹Þ6í{éœän%R:(ŠôèÑ£Y�ŽæNM-åÕÂ6—©iîÔW´K—.Q@Wyu‘ qÝk¯½|m’ÔÔADZÄS’6’F"ˆ €�¶—Ñ>nÛÛÃÙü¯ p²º±¥Pá¯ØWÒÌÿöÛoYÚ	²SìÖàú>4kÖ,
$Ô¶m[Ù‘bO@÷qm•Æ–—±o*
˜!íÞ¢-á�f, �©Í¥E¤I<$i#i$ö¼ö 3“,0 dBÉÏgÚÛlúÛÃ©sKüi­³ÿ~%I¹´jÕ*²¶² I­FY·D@kÿµ†ƒÖ–ñzˆ´ã€[6}u’û¿<¸4e\’¾öW�ÕöÒ$~Ç¥�¤‘¤•H €  �Ë.ÑË>w½œ¾d'Nd?aW�	<_–v¹[5mÚ4�¥§ÈØ˜€Ä¿§õƒgÌˆ1�víÚEÁ ¹�Ç¸‘(ZF4&™2e
Áÿ2¢æ‡:uêi ’F’V"€ €@¶—ØÎŠpé¼h¿wïÞ‘Û¬§È›…©=WñB V­ZF[¦iëEO'A ©´zØ°a³’Ú€”Û‰À¨Q£ØúÒ‰ '›€‚Àé>®Ù_¶(.vkïúÒ";î¸£‘6ñ�¤‘¤•àz€Y] ª#äçý6msáÂ]6Í wìØÑO©È%q´Àþûïox‡�¤�ø<xpR‹O¹!àD@Á/µ N�:Nùp2ŠE@“�Ê£…”nÒ$ê¼ ¤‘ÚCš‰”g ò¸,{mo±³ë¥deÝu×]�‚g‘ÒI@?º²¸ËâÊš»tö�¤×Z®Ï#FŒˆf�’^Ê�\È€«sß¾šì"A yÚ´icöÛo?ÃŽÉk;ß%–&‘6ñä	"­$ÍDÊ3 yl³ohY´J\/¥ Yš9@ø¹’Löù-Z´0Ó¦McÝ]²›1µ¥Wt¹@{˜-H-C*ž|0�3Æhi	I" ‰ÝÃ5&å>ž¤–ËOY¥I¤MÔ<¤®6i&i'R	` È#Ü²¬µ­E?{8±Öz«qãÆ¶ÌÊƒÅý
²²Ž9ÒôèÑƒß¸7åÛˆ€ÖÊƒ…(èaáŸÐr.}JJœçRH�*“€&!XŠXÌˆßµ¥M¤Q¤U“´’4“´)�œDiËRÖZûïÜ‘5p:t(A³BêuÑº»©S§‚A:@äÔ‚Ð¬§ŒW¬}.8z.Cò†=ztKF‘ P5M@h,ªíÿð^©šQ_ÕÒ>õOcRi&i'R	` È#\›µ"µi_ËÖ.—ÑMvÀ€Q”Mn¸.$Ã9WëîöÞ{oúD8M|M7nlöÙg¶þ¾¥©`¦Ú·oÍšu±ÑÔIH�:˜£�>ÚÈƒ…�rÒ&Ú	@ZÅƒN‘f’v"Úu9à<<b ÈÔJY*Â�óìÿ¶Ûnk&Mš„û%°<µA%¬ëèÁl$¬Hˆ;m_©5Ï²´/îmEù
G@ß‰ÝwßÝÇ ¹p…æJ©$ Ï-yqí²Ë.FãR*Ð2 iO}CÚ‰(©•{~ŽÀ3ÐM²ëcÿï¾ÉkYÿ«ˆÁƒBèeM.ìä �c·nÝˆvS'¾v
5qâÄ¨¯&¾2T 	hÐ,QÕ¹sg�¹’üPäÿ8 #®´Aä¨É(iOÛTK;IC‘òD @žÀÚlkÛC!1�6I•+�¶|ëÞ½;3ùk«Äæ,×ÑéÓ§³5db[0×:gmýÇ–Qéhoj™ETWP5O3gÙ]œOC ºw+f…îãDþÏ X
?"½"­"Íâa€´“4”´)0 äjY–½í£\XœBbj@ ™³V­Zå¯¤äœXšYÕÀqàÀ�l™ØV·àŠ¬ˆÑš5Òú@ °9ÍþOž<98oþ.¯@ ¸t×oßÿþ÷ñD-nSÄþêÒ*Ò,Œ™ÒNÒPòÔê ò¶¬ãöpÍ^O.5�5rÍŠó$ f¹årÈ!‰lß¤WIûk·
ÖŒ&½%)¾	ôïßßì·ß~FQÖIˆ¹tË‹kØ°aÌþÇ©abXiiiIJF R` ÈT›¥¢£hË.öÈ9ÉÍJ3»]¬›·‡½5s.'Æ›€DÖ{ìa†Âà1ÞM•ºÒuìØÑL›6�µÿ©ky*œ-�&Mš˜‰&Fñ ²=—ÏC _Êgÿ5ÉàIÔå«¨äê/Ò,Ò.–Št±U’–"âdÚ@ Ú,e±Ò±�Köš	PäìfÍš¹dÃ¹) Ð²eKsÜqÇ™>}ˆ™’‚æNDµ°¶‹Ò¶@2R‘  �­èÛ¯¯9è ƒŒŒ$Ä�@ëÖ­£>Ù¯_?&¢âÐ 	(ƒ4‹´‹o&ÊõTjž¬"b ÈO{µÙötÍZ[®hV—m³\I†¾,­rÑÛwß}1…ßÜ±¯¡ftïš2eŠiÚ´iìËK!úÍ?n¼9òÈ#�ž“ PLWÈ�[1\<¬é.fU¸v	H³è÷ßÓ=LZJšŠä™  Ï@mvb:È]]²Ö ZA³ºvíêÃ�Æ¥(œ›rÏ;ì°Ã¢×„™bJ@ÛsÌ1QDà@«Hµ �]JJwv‘çŒÆ$‹@Ïž=ÍŒ3Œ¶ª$A S2I»HÃx¸‡IKIS¡W3m€?ÐAeñ1í]©¨•u³8g³�ÊufÌ˜1¦yóæ›½ÇØ�’’sÂ	' ¼¶ˆ×óN ^½z‘!jÜ¸q>\ ó^^. �8ÐöYr·VÄuÖ\Ç©eÒU‰~ypM˜0�I¨t5½—ÚJ»HÃxX -%M%mEòH €G˜eYídÛ»f+×™áÃ‡ýßdÊÎ×àQ÷ÙgúNÊÚ>Õ•åðàÁ‘@»S�  �ì	hÏuy t! pöð8Ã™€îãcÇŽ�fÿ1B9ãLeÚ@ÆÓ2 i*i+’G <Â,Ëj€}tù*`V·nÝL�=žå¿}‚ÏQ[öh©§(¬Áó¢‚þ´hÑÂœxâ‰ÑžÑ\ÿüŒœ � K–,1÷ÝwŸùðÃÍ·ß~› ’SÔì´ÓNæˆ#ŽˆP!Ô‡:ž€tŒ4Œ´Œ‡ ÀÒTÒV$�0 x„i³R¸~E¬là’­ÜÄ‰�"»“ �í0{öl3t(±SráÇ9ÙPÔÿc�=6ºw1k”=?Î€€¼ûî»æúë¯7·Ýv›Y±bP PP:t0‡~¸5j”�õÛ-;‹iiiÇ¤¤­¤±Hž` ð²,›þö±“k–ú²hý¬\hHÈ…€,®“&MŠ\±;urî’¹�sRD@ýMÛþÈó„mKSÔðTÕ+�¹sçFâÿ—¿ü¥ùøã�½æMf¨Ž€Œ¸{î¹g´íŸ'×íê.Éû�†‘–ñ` %d¥±Hž` ð²,EªlçšeÇŽMß¾}}­�q-ç'”€Ö‘jOé½÷ÞÛ(0	ù Pñ÷”SN‰"ÿæãä	�Ð	,X°ÀÜxã�æÎ;ï4Ë—/½ºÔ/†4VÐ®V­ZÅ°t)idD’–‘¦ñ�¤­¤±Hž` ðÒf³�=œ]Tä:« ZÌþûk˜4ç¤H¬rç6lXš1P÷<ÐŒÿÉ'Ÿ-7QJ ��÷Þ{ÏüêW¿2÷ÜsnÿÙ¡ãÓžhßv�¶ß^ÃXü�–‘¦ñ°,°|‰µ´É  –eÑË>v³‡Sç”«Ìˆ#|l�á¯fä”hºùÎš5+ZÓ—èŠPøØÐýJëþ§M›f7n»òQ Ä�À¼yóÌ7Ü`äö¿xñâ¸—òH@{¶wÜqÑ¶mÛn»m€5¤JÅ" m ¥i<,�¶’Æ’Ö"y à$V=\?”,dHÑ«óöú’ôïßßp¥k¿rÑV –5kÖDëJß~ûíâŠ$ž€îQZ/zÌ1ÇEÿ'A ÙP”ÿ›o¾ÙÜu×]fÙ²eÙ�Ì§!à�@“&M"î¾ûîËRA<Ébc'HÓHÛxˆk"�%­õ–=6l|%þË–  ÙÛòçw²oµÞòÛÕ¿£/Š¢·³þªzV|";Š0~üx3}útv—ÈŸ®‚€¬úò,™1c†)))©â¼l�ÀG}­÷ÿãÿˆøß(ÞË­ÑÞc�=ÌÁŒ7o”ÉXšFÚÆÃÄ¦4–´É  Ú,´___{4tÉN–XEÒö°VÆ¥œ(ÍÒuÔQ‘€�6rª%�’Aƒ™3Ï<3reÝ s‰ ,Z´ÈÜrË-æç?ÿ¹‘ 	Å  .-T 6òE@šFÚFÇ1Ic©³²Gº#H�ŽÀD›Å {´uÍJ[°(‹f×HÈíñ{üñÇ›)S¦àî—À)È³gÏžföìÙfòäÉFÛÿ‘  �Ì	,Y²$ÿZó// ŠA`ôèÑæ´ÓN‹ÆœÅ¸>×LiiiIZKš‹äH €#@{ºª36uÉJim•¡`,ša#A _z÷î&í>	—/È�æÛ¾}û(X”¶‹òàÎ(%ª�ª	|òÉ'‘Ûÿí·ßîc=lÕáUTC`àÀ�fæÌ™Ñî@5jÔ¨æÓ¼7å[Kãx˜4�Ö’æB(¹5‹aÏ&G€öt…L=ÁÚŸ2ç©íÚ4+;aÂ< ,HR~	È K—.fáÂ…fî¼¹æÛo¿ÍïÉ=ñºwïm÷§¨ÿž,ù‰gB �)ÍüßvÛmæ¦›nÂí?Sh|Î;-ß:çœs¢ ®Š@‚@!ÈðÁ˜7ß|Ó¬^½Úå’ê´Š˜ú�=¾qÉ(íçb pïmÇÙC�9§Î�;G3kd³¦6gŒœ˜:uêm=õþûïcÈ‚]Ú>ªûÓgœmù×°¡S¨“´¡£¾0K—.5·Þzk$þet%A ‰-ßR``
I@MO>ù¤ùôÓO].«‰ÖµöxÔŸ»d”össž±N;¸JõïoŸ7«ôNO[¶liúõë‡[mNô8)W»îºkÌMZXz’+Å°Ïk×®�9ñÄÍ¡‡ÊÌØMMíò@@[_Ýyç�æ¿ø…Qð?ŠA@KÿN?ýô(êÝºu‹Q®™bZ2(�#­ã!IsI{‘` p€gO?mIád ÐÍX7gm•Áz,·áììHô�92š;v,Þ'ÙáþÓòÑZQ¹ý3ó|sSAÏ4Û_>óOÀ?ÏpÉ.cšùÿÁ~`öÛo?v™Ê˜ôI@ÚFGZÇƒJšKÚëÐH„pv€gOÕZ£hì’�¶gÛyç�™�u�È¹9Ð’“Q£FE±'­õñÇ7ë×¯Ï9?Nƒ@¯^½¢5ÿ‡~¸aÛÈ0Ú”ZŽ€ÜþµÞ_ G—×Âš+G`øðá‘�Ì˜1xp×ºÉª�&œ†fyä‘(þ”Cé¥¹¤½¤ÁÖ8ä“êS‰�{óËòÔÃGÛ£]îÙ˜(ÛqÇgäjK‚@1È:«­=zôˆ´hæjÍî«Åh‹b_S?Òýû÷�–†Èí¿AƒÅ.×‡@¢HüËåÿæ›oFü'ªåÂ)¬îãÚêï‚.0ãÇ�÷1ëjRgnØ°Á<öØcQ\‡Bhë
PÿÏŸÙƒ(ÖB¶	÷‰l‰U|^ÆY šT¼”Û3y t±ÙI(6íÕªÁÚæ­Iç®]ìêpý,	h‹žvØÁœrÊ)æ ƒ"PT–üø8–-[fî»ï¾È ÀÌ?ý¡àoÄˆæì³Ï6cìÌ¿‡­×ŠQ® �’’#Íã!i€*ÆDvŽ0—#8{Zm{f�]í‘sDm§µÇ{D‚K[ŠI@ZmI¹ÓN;™uëÖEÛ¶¬\¹²˜EâÚ" uyŠ¡µ¢x Û‘ˆ;—	‡À'Ÿ|b~ó›ß˜ë¯¿ž­þÂiÖDÕ¤qãÆfß}÷5—]v™<x0�¥ÕzáVÁ _yåóúë¯›¯¾úÊ¥ÂLKí!/€¯]2Jë¹ royYŸN¶GŸÜ³°k¬Û¿ÖØÊåVâ‹�bP?ÔìÿŽ;îh4˜Pð*ÍdiR˜ÔÎÚJ3FreÆ(Ìv¦Vù# ñûí·›+®¸"ÚZ5W"gTM }ûöfÚ´iæ¼óÎ3={ö$¨oÕ˜xµˆ4¾\¾|¹yúé§Í_|áRM¼®¶ÇCe�.y¥ò\‚ æÞì�í©­s?½ôL¼ûôéƒøwÉùÞ	(bë1ÇmÛ¢Ù„·ß~Û|óÍ7Þ¯C†Å% {Ð>ûìm…!²¸mÁÕ“I@^R>ø ¹á†ÌgŸiI*	…%Ð¹sgsØa‡™N8�xR…EÏÕ²  €4�Æ’4˜´Ø§òJ] rkrqëg§¬/‚DV×®]s+gA Ï nÊ”)¦mÛ¶æòË/�¬¶«V­ÊóUÉ¾´ûƒ¶ù;þøãÍþûïoºØ8$º'‘  �Ì	|þùçæOúSärÍV™sã“~”Çm9ãŒ3¢å¤Íš9íJí§Pä�­�æ)ßöÜÑ³TLZì{°`+Ì«z‹% UQ©þ5­ÿ?Ä;Û#çõÿ
„¡}Y'L˜À€Õ3çE" 5[ŠC‡�< -ZdˆP¤ÆðtYvÔžçŸ¾9øàƒMëÖ­ÿžØ’MzHüÿá0^x¡ë¶Vé�FM½�±Vb·Ýv‹ŒóZºÕ°aC/y“	òI@F«¹sçš7ß|3ÚuÊñZ‹íùÄÈ" 9@³§È Ð×�r;½ô,ºµÎšà.9·4[,·-tûõëg®ºê*3oÞ<óõ×]Áßç5š6mj9äsä‘Gš°Þß'\òJ�/¿ü2rû¿ä’KÌ’%KRSo*Z|ÿÚ¶Wñ£Ž:ê(ÓÅzo1Ž,~»P‚Ì¨¯JûH9î”"&-&M¶6³«ó©r ÊId÷ØÞ~\‡“¿¬< úöíËÌ[vìùt	H<jÆ¸[·næ¦›n2ÿüç?£€.E,—Î�€<9zõêmñ·×^{E.x2ì�  �ì(xÕ_ÿúWsñÅyD‘ P(µk×Ž‚FŸ~úéf÷Ýw7úM&A IdÀ’öñ° 4X¹[‘$q(+€ì[A#f­9qšý×eµF–[ÖÝŠ))ä>>jÔ¨ÈpÏ=÷˜[o½o€7ž¬íåQþ�;î83hÐ £}¢I€@öV¬XatßS`ÔùóçgŸg@ å1[&MšdŽ=öX³Ã;˜:uêä�§@ ¸¤y¤}¤�<$i1i²wìA”ê,€2ý“¬²�ÊÕä {Œ°GÎëÿµvKÁÕ´~‹�¤(•Š¯½†W¯^¹réÑ1¨KÒPÄº¼uëÖ5ŒÖúÏ˜1Ãl¿ýöF3H$@ {Š}rï½÷š‹.ºÈ|ðÁÙgó340×ýaÃ†1/izŠ§6‘ÁvôèÑÑ¼#Ž8Â”””°t+=] ÈšÊ õÎ;ï˜—_~Ù¬Y³Æ¥ŽÚŸZ7ã'í� ’x d«ì£ÛÚÇìÑ ûS+ÎhÙ²e4¯x…gHyì²Ë.Q�@-¸ùæ›Í«¯¾ÄP¼ö”�¦Q£FæÀŒÖú+nƒÚŠäF@{W?úè£æ'?ùI°ÿ´•œ„æ“O>i>üðCóÕW_å‹³¼�HêÝ»w,Z÷òž={uI�€&$¤…–-[æRl¤É¤ÍÖ¹d”¶s1 d×â5íÇµïd‰=œ¼'´öE7v’N@kË5#1}úôh¶ùÏþ³yøá‡£¯ß|ƒA¶�í«Ù"	}E„V ¿aÃ†™öíÛ³Ì¨��Àµ‚# 5ÿŠöíµ×FÑ«ƒ« ­�âƒ\pÁfÄˆQï¾ûîh©ƒ–<p/l‹Ë€« iûî»oô»*w¶÷+lpµü�’úßÿþçr1i1i2i³ÕöÀ}ÉBÈ$a È„RÅg´àj€=šT¼”Û3uú.v	¡Øn»í¢å ÚãuòäÉÑàñþûï�‚d1€Ìo+—Z mÝ¨ívH€@î$þïºë®hÍÿG}”{F1>S3ËÚáE‚Sîæ:t0=zô0Zo.C€<V­Z…! Ïm¨pÇŽEøßyç�Ù¢5ÏÌÉ¾x¤�<T¤É¤Í‘Õi=�=?5Éi;5”**ªMV§Úc{lWñrvÏäš«(ÜŠàJ‚@h4€ÔE
6§­^”)Ûq�Wh˜¼ÕGƒFmç÷ƒü Šð/^×Ñ,	È�€¶úÓšEûUüËP¨˜ûí·Ÿ‘WIE�Sºwïn†m+Úî�e¹÷§­�©û¸„ÿ9çœcŽ9æ˜È˜®à­jB$ ïÑ×^{Í¼òÊ+fÝ:'ï}íG½ÐÏÛƒí 3ì,Leªìcò èc�œÅ¿òiÞ¼yôƒªç$„H@ƒ‰PÍDw±VÞqãÆ™xÀüë_ÿ2šQ#¹Ðì¾‚0î¹çžfÌ˜1‘À“5Ý½pä �„�ëû#�<b®¿þú`Å¿\pO>ùd³Ç{|'þ+7›î1ºk«¹>}ú˜§Ÿ~ÚÈ«ë™gžq°W¾LªŸËP»ë®»š½÷ÞÛŒ92Šîß°¡æšHŸ€î+ÒDºß:$i2­©f[Œ, b È–ý¨îÊêdNQX$Œü‚�Ð	h›"¹¥k}©Ö£?ÿüóFÁu°vn­¯Y:yVh™…¶cÔ ^? $@ÀEû¿óÎ;Í�7ÞhÞ~ûm?™Æ,Ý“Ï:ë¬h7¢ê§f¢å	 ½»%RÿûßÿšÿûßÑ}Ü1€WÌ¨®8õë×�„¿–Y(î‚~'Ë=0
W
®�â�@� ßÿ}—‚H“irVm‰KFi:@æ­-ÚÎöhf'Ÿ,YÓµNš�´ÐL’Œ^tj°£%0O<ñDäê ÛwÛÊ%W3ýò¦2dHÄSs à�ÀÚµk#·ÿ�þi}¿–M�:5«ÝA$PwÚi§èÞ#ï.ÝÇeÌýûßÿn–.]ê¯ÎIÁý&L˜m­¥[@ÿ€œªm•@·nÝ"£­~¨ú7¥É¤Í¤ÑæÚƒ@€Bu	@u„*Þ—kIO{8¹˜hFT[íh0O‚@Úh�£nør+ÕàGëÕŸ}öYóÂ/˜—^zÉ¬^­ ®¤Êd,<xp$úµå¢fá¸T&Äsø! ñ/·ÿ›nº)Øhÿòš1cF´æ?×­Aµ�òÑ½IÞHº/½øâ‹æ¹çž3o¼ñq6éŽúÝ§�F”áÃ‡G3þZM‚@š	h,#M$mä \£ýÇò$`�
@�Ê>RÏ>öµ‡“ M›6Ñ ž ]™ƒç“áÐ€HÞ :´†ýÕW_��
3gÎóúë¯›ÒkÄÕ,Q¿~ý¢Á¢fû5xÔV‹Ü7Âû.P£x�øÿÓŸþmõ'cdˆIÑþ5óÿ½ï}Ï4iâ¼™‘©]»vtŸÒ½êã�?6/¿ürdÐ£îãóçÏcÆu’±[¢_ÆnEô'�I€@)�iÊ¿,pÁ"m&�&­† ’ 2€Töu®ìá´þ_{¹ß‘  �Rrc×ºRŠ´-#€�ÚVÏeøöÛoƒÇÕ¾}ûÈµV?†
î§%:´V”ä�ÀúõëÍŸÿügsùå—›7ß|3*bÎŠèúé§›<ÐT·æ?—b*¶ÑÄ‰#×v­ç•E÷ïwÞy'z|ï½÷rÉ6qçHôËKK‡·zÔklÉš¸¦¤À" M$mäh �6“Fsš¤-P•cq ™7ƒÌåZ_â´ub³fÍ¢™¼Ì/Ë'!�Á:•zÞ¼yÑ RKôÃ Ù¤wß}×|þùçA ‘û§–BÈ�¶|ID¹øÇÅ?ˆ&¦	 ðõ×_GkØ¯»îº`Å¿î1'œp‚9à€ò"þ+7³îkò4Ð¡sçÎ�¼»ä°páÂè>®×h1„¤õûòÎÒ=¼|IDùÚ~m‰K‚ ¶N@ßi#Ç$m&�&­¶Ø1¯TœŽ ³fVÇêfç…û²’wèÐ!³«ò)¤”€¶Ô¬‰ªÒŽò�7€/^yÈ0ðé§Ÿ&‚’ÖÍjÏívíÚEFÕM‘Ÿ5Ë¯çÑŒ2 šùøá‡Í•W^Å!	¨jßUE÷¹ýtÐA>‚m}—o&Oä½$o&Ó§O�îÙ
úª½¿u×}]^_~øab»2ÎJ°hÆR÷r:Êwº‘@k™I€@æ¤‰¤�<$i4iµwìñ�‡ü‚Î@fÍ[¾þ¿vf¯úSúáÐ�1_«æÃ«¨Š€ÖˆéB‡"à+P �ó­G€‘2h ùÉ'Ÿ˜Ï>ûÌ,Y²$ŠHýÍ7Å»ÿkYƒÖzêGM–mms£Á¡\ÝÊg‹ô	(‰ÿ|0rûuÍ¿f¤åö/ñ]l¯"ÅÐ½O‡<¼äðÁDÛi™€¼t×!£®b
è(fÒöªmÛ¶5-Z´ˆîåzÔNõ{¤àeìÄRÌâÚ!�&Ò÷J÷¨+V¸TIMq þŸ=VÙƒ´ ¶§Ò[å{L:…l•µXAÏH€@îôc!!­CÛ))>€¶ Ò,’<dÐò¿üòËh ©ÁæªU«¢ÿõ¸fÍšèÈ¥
`¨èÙš±×—~´ôù!Á¯ïºº;vŒ�ú?ëns)?ç@ í¾úê+óØc�™+®¸"Zf"O:é$3mÚ´¢‹ÿªøê~¨™sJjvµL@]ÝÏu_¶lÙw÷mÝÇ+ßËe–!'—$ƒ„îßú=Ñ¡û¸Ê¤×ô¨íš%ðÅQb¿ü^Näþ\hs¶N@ÚHã$G€4Z{H³a Ø:rƒ @eoË§«·=œ š”( A þh¹€fÛ+GW–Q@ÅåË—GHÍ(i )Åøâ‹/¢CÆ <µã@åC¥S¾ûå�z®A£f|48Ô€Q�šÉ×L‘ž—?ðÉ_û’|ÐVSÚêïšk®‰"ÕûÌ;.yiœ1sæLsè¡‡z‰ö_ˆz•ÇD‘à.Oº�ë~­C÷nÝÇõ¨ûº^Ó£îå2è*–Cå{xù.2ò «|èÞ¬åXº_k'„ªîã2âê}ÝûI€@þ	è{¯±”–9$i4i5Öád @�ìGšÚC÷�~ä>VùÇ-³Kó)@ [¸i`§C³8[J`Jh¹€�å�z]‚_‡ŒzÔÚN=’  �dÐVrû¿ôÒK£­F“Y‹­—ZcŒÙ³g›C9ÄG`­­_,Ïïê>.!®ck“'û›ÞÇu/×}¼üþ]þ(#.÷ñ<7ÙC KºoyX)�&­&ÍöQ–EHÝÇ1 Tßä²(IA8…sÕ™< d A ñ  ï¥fƒH€@Ødàû÷¿ÿüSº“ÆÇ{läöï!ªvbi†Ÿ ª‰i.

�ÍHüëþ¥1™wIZMšíöøÊ!ŸàO­|Ý+(uÐÝNÆY°äB?T$@ € 
C@Ë|žzê)sÑE™—_~¹0-ðU•~ÆŒæ¨£Žb¢¡Àì¹ àF@ÚHIZÉ1I«i' fvªé$j«É;”·eMRä>§õÿŠ$Û½»ì$@ € 
A@®á�?þ¸ùÉO~bžyæ™h�x!®[Èk(xÖ¬Y³¢hÿzN‚  �4ÒHÒJŠ×ä�Êã H»­tÈ'øS1 TßÄ²"õ´‡Ó€rýWY  @ ù' ñ¯hÿçž{®yóÍ7ƒÿíÛ·�ÄÿÑG�ø5ÿùï\ˆ+i$Ë¤¥Õ¤Ùð ¨¦¡1 TÈ¾]ß�ìáä»¯h³rÑ#A €  �_
÷Âó/˜Ë.»Ì¼ñÆQ€Ïü^±ð¹k°,—EûOÓšÿÂ“æŠ€@¾	H#I+9&i5i6i7ÒV` Ø
û–ø(¢¤s�Ô�3€­Ãæ]@ €€+­ùöÙg£™ÿ9sæ)þå*{ÒI'™Ã?|£-P]Ùq>  �b�FòdÈ”f“v{×_£.I¸¦Ó¬v*èXÆö|­ÿwrÿ—EK[‘iŸ[  @ ù! ñÿä“Oš3Î8Ã<ýôÓFÿ‡–´Îÿ”SN1Ç<KCk\ê�”�F’Vòà Í&í&GÚ [ Sö²:O{8yJh]ËÖö°Ýzx€   �êÈí_3þç�wžyþùçÍúõë«;%qï7oÞÜÌœ93Šø¯ç$@ ¡�Vò/MšMÚÀV:€­À)ë<
&á4u/k½‡½õ’ò.  @ ¥4Óÿâ‹/Fnÿÿ2„–´Oö‰'ž¹ý#þCk]êH+yØÉDšMÚÀVº”ÓÌöVòå-/ mÚ´1:h9
	€   Ÿ¾þúëh‹¿/¼0rÿÑí¿eË–ÑšÿN8Áè9	€@h¤•¤™  Ä °uHMíÛmíáä)¡ÎìÁ¢µõ’ò.  @ e4ÓÿÌ3Ï˜sÎ9'zQü+Ú¿„¿fÿ=l“•²Bu! �¤�Vò` �f“v“†#m�€“°ÝBž¡¼¬ ê@Nîÿµk×Ž¢ÿ×¯ÏŽ¡tê@ Å' ™ÿ—^z)Úêï¹çž2àŸfû�8âˆhÍ?â¿ø}Ž@ ù# ­¤Ý ¤�“´›4œsFŽåˆíé ¶Ü4Rì]ìQcË©þ­gÁý¿zN|€  �)‰ÿÿ÷ÿþ_´æÿ‰'ž0ëÖ­ËôÔÄ|NkþgÌ˜afÍšÅ8"1­FA! ÒLâ¦I»u±³¯[h [ c_ÞÎ�íád ðäÎ²åRò  @ E6lØ`žzê)sñÅ›ÿû¿ÿRü+ÈßQGEüg!E�›ªB å<-›–¾•†“–#UA @PÊ^R§ig'FrÙ#Zï–!ó  @ rûÿéOìV64S¦L‰ ÖÃfƒ–ÏB (*i&Ë�4y+‡`­IÀ-€±/{Y õ{ ¶™w  @ ™ÐÌ¿¶ú»üòËÍßþö· gþ5f�ø?í´ÓL¯^½2ÁÂg  C@šÉÃN',¨¦G` Ø2 Æö-Y�œ’¬XÍš5sÊƒ“! @ i' µþ7Þx£yì±Ç‚ÿ/Èíÿ¸ãŽ3]»vM{sS@ …¤™<x ˆœ4œ´©
 ª€b_ªemDY¯ê·3{µV­Z‘kÛm�6Èìb|
€  (­ù¿æšk‚]óß´iS3}úôh«¿Î�µt•@ }¤™ä ¥m^’4œ´œ4�SFeˆí©NëÛc[+÷‚©Ót°‡S @u`Eñ%A €  ��—_~ÙÜtÓMæßÿþw°3ÿrû?öØcâ?·>ÂY€@8¤�<-�–sšÌ‡êÆ5Á`cåÿ5°Oœw Ð6ð)GÊ#  @ ;Ï<óŒ¹á†Ì<`Ö¬Y“ÝÉ	ø´Ü]?üðh»¿Þ½{' Ä€@~	H;IC-Y²ÄåBšÄ•–“¦[å’Qˆçb ¨ºU5²£=œ< Z·níÃ‚Uu	y€  0�çŸÞ\qÅæïÿ{�â¿I“&æÐC5'Ÿ|²)))	¸%©  �Ì	hö_Ê1IÃIË±@ YPûRùº'€‚Xh]	€   �Ì	¼þúëßüqæ_âêÔ©æøã�GügÞ-ø$ �ÒNJÃ9Çs7 U·¬ ííál `€ªó*  @ *¯¼òŠ¹îºëÌ}÷ÝgV¯^]ÕGýZãÆ�Í!‡üëÓ§O¢ëBá! ø&ài' i8i9b TÑ@ ª€b_Ò¶Î{÷©o·ž'U#æU@ €ÀÆæÌ™Eûè¡‡‚ÿšùW´ÿÙ³g›nÝºm\yþƒ   �H;yš@•–c+À*úK 6‡RÛ¾¤ÐýzÌ9Õ¯_ß‡ûJÎ×çD@ €@’Èíÿúë¯7ÿ_~ùe’ŠžQY6l¹ýÏœ9ñŸ1>¤•€– HK9&/šÎ±±<ÀæÍ¢Þ¦m#œR»ví èD�“! @ -äö/ñÿàƒ)þ5jdößsê©§¢ý§¥WSO@ W
(-å!IÓ9[<”#VY` Ø¼9Ú—œ×ÿ+z¥‡ ›—ŽW  @ P´ÿK/½ÔÜ{ï½fåÊ•Õ¬´*ZóðÁ›3Î8Ãôïß?¸úQ!@ ¾	HCyÚ	@šNÚŽT‰ 1 *Á({ªEûmíá PkWô£O‚   @ jï¾ûníÿ‘G	ræ_q€&NœhN:é$CÀ¿ªû ¯B Ø”€4”‡8 ÒrÒtdÛ0€M€Øå&‚`s.¼@ ðFàý÷ß7W_}u°nÿ40{ï½·™5k–é×¯Ÿ7nd@ tž ,Ø¤Ã` Øˆý·�=´^ÄÉ yóæFÑ~I€   TøöÛoÍ[o½en¸ás÷Ýw›+VT¼È3¯š:uªùáh¶ß~û@jE5  †€4”´”c’–“¦“¶#U"€ Œ²§�ì£³€:®¬ÿ$@ € J	Hü+Úÿe—]f}ôÑ Å¿~û÷Ûo?söÙg›^½zÑô€  �%ÝG=L¤–/�¶#U"@ÀJ0ìSuMÛ×Ýøåìþ«]»v´þ¿fMðfGŽOC €@È>üðÃhÍÿ_ÿúWóùçŸWÕzõê™Ñ£G›Ù³g#þƒk]*Š€4”–HS9&i:i;'ÏnÇ2ÄîtêÆM¢NÒbã—²ÿ¯S§N¦U«VÙŸÈ€   �@	,X°À\uÕUÁFû—Ûÿž{îiÎ;ï<3pàÀ@[‘jA (i)i*IÚÎir×Cb•€�›CQ"� :tð±neã’ñ  @ �äöÿÞ{ïE[ýÝu×]AÎü+Úÿ^{íe~üã›!C†< ØQ)2 +Š Må!IÛ±@%�Ä ¨Ã>­gg€,Vl¸1Xþƒ   �tøè£�Ìµ×^ü[¹repêÔ©cÆ�Íü÷îÝÛÔ¨�§ip�L…  �‚�–òäQ-m'�G*#€`ã® ë�sÈÉ¦M› pc®ü@ )$°hÑ¢ Å¿fþÇŽk.¸àÓ§OÄ
û8U† òC@� ¥©<$i;< *�Ä P	FYçh¹ñKÙÿ'—•†f"g@ € !0oÞ<óÓŸþÔÜqÇfùòå�Ôª¢uëÖ5»ï¾»¹øâ‹£­þpû¯`Ã3@ ®¤¥<l¨bHÛa ¨Ô  *Á°O½,À`c¨ü@ é"0þ|sÍ5×˜;ï¼3È­þ$þ'L˜‰ÿvØ�™ÿtuoj€€G – lÒ^Üˆ ÎK ´fEÑ€I€   �´�ÛÿÍ7ßlþøÇ?+þGŒaÎ9çÜþÓÖ¹©/ P0ÒRžbªIÛ RËáP	†}*Õî´ØDÁÔY·ÝvÛ�sæ?@ €@àÞyçó«_ýÊÜ~ûíæ³Ï>®¶å3ÿgŸ}¶<x°©U«Vpu¤B€ â@@ZJšJÚJ»É8$i;ff+Ä PCa{ÕAjW¼”ý3­Uñd­Êþâœ@ (­ù¿þúë£hÿ!®ù¯]»¶Ùm·ÝÌE]dÀVEêg\Hi*i«O?ýÔ¥ÒÒvÒxÒzN–—BÄé\– T´FûÔiö_YµlÙ÷ÿ
¦<ƒ   �X¼x±¹í¶ÛÌ}÷ÝdÀ?mõ7dÈ3{ölÓ·o_Ä
ú4U„ ŠO@Ë ¤­<$i<i=’%€ ¢(:¤‚D8¥Ö­[³ AN†   �$Ðšÿ[n¹ÅÜzë­æã�?NRÑ3*«fþÇ�ÍüË€%~aãC€ œ	( ´•‡$�ÇN e YPÑ£êÚ§Î -Z´0Ú˜@ �€Öüÿîw¿3¿þõ¯ƒÿûŠöî¹çš¡C‡2óz‡¦~€@¬HSI[yHÒxÒz$K @E7�[HãŠs{¦- ëÕ#Ðdnô8€ ’B`Á‚ÑÌÿ]wÝ¤øW€¿Q£F™ýèGfØ°alõ—”ŽI9! �`HSI[yHÒx,(‰ ¢Gy1 4jÔÈh­ 	€  *�¥K—š;î¸ÃÜsÏ=AŠÿm¶Ù&šñŸ9s¦Ùyç�ÿ¡vdêÄš€4•´•‡„ D 00 T°à  @ J.4¿ýío£Ùÿ�>ú¨ÊÏ$ùEÍüËíÿä“O6'N42�  @ ð0 ä‡9¿j\µ.Äy	@Ã†ñ ¨`Ê3@ ˆ@yÀ¿Ûo¿ÝèyhIûM�;6rû9r$3ÿ¡50õ� E@ i+I� e Ù ¢Gyñ P´JE&A € B" }˜ðï7¿ùM°âøðáfÖ¬YfÄˆˆÿ�:/u� I@šJÚÊCb	@%ˆx TÀ� IÅ¿¹=S'­Y»Jnô8€ âH`É’%‘øÿùÏnBtû×Ì¿¶ø;í´ÓÌî»ïÎïx;!e‚ RG@šÊ“@� me=@ÅWI¡û�|LêÖ­kê×¯_‘#Ï  @ 	'°xñbó‹_üÂÜvÛmFëÿCKåâ_[ý�=ñZS@ Ñ¤­¤±Ö®]ëRi<¶i+#ÈTu)ˆöAþ%µÊ¸äôÐ¼ys£ý*I€   �Èí_ÿn½õVóá‡†P¥Íê ·ÿ3Î8ñ¿^€  P|ÒVÒXŽIOZOš/õ	@iðâþß¬Y3 ©ÿJ €@>ùäsç�wFÑþCø§V’ø?óÌ3Í¸qã˜ù£ÛR@ 02 HcyH,(ƒÈ€Rr	q^ÿ¯ÎY¯Þ%¾ d@ E$ Ù~EúWÀ¿±$ù¹´ÜþåÿG?ú‘?~¼ÙvÛmós!r…   'ÒV jNk	œ*““1 ”6„< œCL6jÔˆ- cÒ±)  äF`ùòåæ®»îŠfþµþ?ÄÔ¯_?3{ölÄˆ�K�  � h+@i,IZ�@€€ÒÞ¤}ûœ£÷©s²`)PþB €@ò¬X±Âüá07ß|³	Uü0Àüð‡?4“&Mbæ?y]”C )# måÉ  ­Ç^í€Ò/‘¬AÎ ­QÁ P
”¿€  �,Ÿ}ö™ùãÿh®¸â
óÁ$«ð–vðàÁæÂ/4cÇŽ�¢Jgxƒ   �"�¶òd]Z @igöâ€ Hw.@ N–.]­÷×Ìˆâ_kþwÜqGóãÿ8
øÇš§îÂÉ€ 
FÀ³  Ûr J»¯¢ÿ8ïß§ *
v?àB€  à�ÀÊ•+Í<`n¸áj´ÿ’’’ÈíÌ˜1üN{è3d@ P¤­<Y—Ö#â«…€ ´÷ÊÄÙ  €m¶i)RþB €@Ü	HüßsÏ=æòË/Rükæ¿wïÞæì³Ï6“'OÆí?î’òA Ø„€´•§% Òz,°P«¥�L�Áy€ºuë2³PÊ“¿€  sË–-3÷Þ{¯ùÉO~ìV}ûö�Œšù¯_ß9ÔOÌ[”âA �€< ¤±<$v(ƒˆ „ÜAœG²N±ÀÃ×“,  @ ¯¾üòËÈíÿ¢‹.
6Ú×®]£5ÿãÇ�g‹Þ¼ö&2‡  �?ÒVž< ¤õX`!ÔÌ_s%*g/K d�b	@¢Ú�ÂB H‰ÿûï¿?Ç¡nõ'ñÉ%—˜	& þS×Ã©0 i+O ,(ëx ”‚PDHç% 
P¡õ†$@ €@	|ñÅæÁ4šùŸ?~‹è\&­ù¿ì²ËÌÄ‰}Í9—‰  @ 7ÒVž‚ Jë±€…€ ´/:o¨ÎY§q%rûjs  ä›@¹Ûÿ¹çžk.\˜ïË%Eû—øßc�=|Í¥\€ *HcIk}ûí·/fÿLK 0 X,(í<ZR¯ôin6lÈ`#7tœ@ y&°zõjó—¿üÅ\zé¥ÁŠÿÎ�;Gžrû÷ä.šçV!{@ È„€îéÒZŽIZ� €Òž$kP­Ò§¹ýmÒ¤	 ¹¡ã,@ È#�åË—›‡zÈ\pÁæÝwßÍã•Š—u¯^½¢˜S¦L18¯è+^E¸2  lF@ ÒZŽIZ€…À€Òžäì¢µ) tüZr:  x%°jÕ*sß}÷E[áÍ›7ÏkÞqÉ¬[·nÑÌÿäÉ“ÿqiÊ@À#i,Oq X¯mÛ€RÎÖ v ðø-'+@ p&°víZóè£�šë®»Î„*þÛµkgfÏžücæß¹Ë�  �Xð¸€4_êõ/ ¥^NÖ òè”x ÄòžA¡  ¤Ž€Äÿ#�<ÍŒ¿ùæ›AÖ¿OŸ>æä“O6Ó§O÷á$#*@ å JóIÿ®�K®uÀ PÚ	œ— hmJ­ZNarmCÎƒ   |G`ÅŠæoû›¹ä’KÌë¯¿þÝë!=ÑVgŸ}¶ÙgŸ}L£F�Bªu�   �MHcyÚmMšÀ&|Óø¯:�³€ iì:Ô€@¼hæÿþûï7W]u•yã�7âU8O¥éÚµ«9óÌ3�þÕ¯¯]�H€  2�r u,7 xÈ*¹Y¤~„m:/ < ’û% ä€ B °~ýúhÍÿ�7Þ¬øïØ±£9þøãÍ¾ûî‹ø¡ÓR@ Èƒ@W÷#,(ÝþÏÙ@ b „ûE¡f€ âL`Ýºu‘ø¿ôÒKÍœ9sâ\ÔœË¦5ÿßÿþ÷Ía‡fš5k–s>œ@ É" �åq	@ê×lc ðà €x $ëFBi! „B@3ÿ<ð€¹úê«Í/¼Jµ6ªG�=Ì~ð3uêTþmD†  „O ÜÀC@– ØîÂ  }í0 „ó¡†€ âFàë¯¿6ÿøÇ?Ìµ×^¬øïÔ©“9ñÄÿqë|”€@�” <\€…ˆ€G K <|-É€ 2"ðÕW_Eâÿíÿ¹çžËèœ¤}¨{÷î‘ø?âˆ#˜ùOZãQ^@ žx^�zý›z ¶_ÊÂy-È¶Ûnkä–B‚   ä›€Üþ~øáÈíÿ™gžÉ÷åŠ’·nÝÌgœa<ð@ÄQZ€‹B ˆi,i-Iš/õð©`;�T»3¹¦Ô¬éœ�‡~M€  2�o¾ùÆ<ñÄ‘øúé§ƒ¬jûöíÍ	'œ€ø²u©  �ìHcIkyHk©Ÿ±ÅÀ“€:& _K²€   �-Ðš‰EûUükÍÿI'�dŽ<òHfþ·Øx€@zxÔYx ØnƒÀ£@z¾†Ô€ 
M`íÚµæ‘G1?ýéOÍSO=UèËäz]»v53gÎ4‡rˆiÞ¼yA®ÉE  @ þð ð×F J Î® Z›B “œ  @ ‚€fþÿõ¯™«®ºÊ<ûì³oô¬uëÖæØc�5Ó§O7-[¶¨fT€ \xÔYÒ|ÎºÏ¥.q8@é çÅû²Ja ˆC—¦€ Â" 5ÿšñW´‰ÿo¿ý6¬
ÚÚ´mÛÖÌ˜1#rûoÕªUpõ£B€  �;i,� Îº/÷šÄãL ž– hm
€xtjJ@ Úêï¿ÿý¯9ÿüóÍþóŸ Å‡"MÉ|  @ IDATÌ©§žj¦M›Bi;ê@ ~HcyŠµF@Û$ < Ô11 øù’“  £5ÿÿüç?#·ÿPÅ¿¢ýŸ~úéæðÃ7Íš5£Ù! @ ›ð¨³0 Xº < ð Øì»Ê€  �#­ùþùç£hÿsæÌ16lÈ1§øžÖ¤IsôÑGG3ÿˆÿø¶%ƒ  Plx øm ¥ ç�%‰à·c’  �´Ðšÿçž{Îœ{î¹‘@Æ€Ð’ÖùsÌ1æ¸ãŽ3
þG‚   l‰€ žb HópK Sôº³+ˆG·”a§ª€  °)�õë×›gŸyÖœÁùÑÚÿÅ»víÌ)§œmõ§% $@ €@u<é-‰‚ V;%ï;[‚<uÊ”à¦š€  °)¹ùËÝÿGgýÈ¼ðÂ&Dñß¼yssüñÇG³ÿ-Z´ØÿC € 6#àQg9k¾Í
—ÀX`ŒöSr^\©�[ˆ[3%°OSd@ ‰#P.þËÝþý?´¤uþ3gÎ4ßÿþ÷â?´Ö¥>€ òG@ËS,i¾ðöÒÍ=  uÊò#Kþ|€ RN@nÿ/½ô’9ë¬³Ì“O>äÌ›6mÌ‰'žhfÌ˜Ášÿ”÷wª@ [å:K�Ž	€ˆÀƒ@QA›<tJÇ>Íé€  �$å3ÿ?úÑ�ÌÓO?¤ø×Ì¿‚ýÉ  % $@ €@6¤±¤µ<$ bêƒ Xê:œK œðq2  �ÔÐïÆ‹/¾h.¸àóì³ÏšÝþ›6mÍúËíñŸº.N…! x! €Ç% ÎºÏK¥Š˜	 ž< 0 ±si@ 	# ±ÿÊ+¯˜sÎ9Çüë_ÿ2ZZ’ÛÿQGeN>ùd£Èÿ$@ €@.< œ×äR‡8�ƒ @œú#e�  <Œåîé¥—+þäïØc��ÄëÖ­ƒoS*@ ù#€À/[– °Ào�"7@ Ø*ü»òÊ+ÍSO=eÖ­[·ÕÏ&ñÍ†šƒ:È}ôÑüKbRf@ 1#àÙ À€˜µo1Š#7gWOëRŠQ®	@ " ñá…šüãAºýk¶ÿý÷7§�vš))))U.@ ¡ð¤µ¼è¾¤³f	@©øw+I€¤(?  �üPôb‰ÿK.¹Ä<öØcAŠÿV­ZEnÿrýïÒ¥Kþ`’3  ¤Š€G i>ç‰ß¤ÃÇ à) Û &ý«@ù! ä�€Öü_}õÕæïÿ{�â_Ñþ?üpsÂ	'˜öíÛç$9C €@êÈ À6€þš� žb ¨SzrMñ×ºä@ E' ™ÿn¸Á<þøãfíÚµE/�ï4nÜ8rû×Ì?âß7]òƒ   i,� b Ð¥Œ\A¾rå -œ<uL×¢p>  Ä„Àœ9sÌUW]eþò—¿)þµæêÔ©æÔSO5½zõŠ	uŠ@ !�Æò´]®4ŸóÒï¤³e	€1_ÛFtÞ€Y‘œ1 $ýë@ù! ø#ðì³ÏFnÿ?üp�â_[ýyä‘fÆŒ¦[·nþÀ‘  @ i,O»æHóIû¥:±Àƒ@ëRÔ)¿þ:õý)Õ_&*@ œÀ«¯¾¹ý?òÈ#AŠÿ&MšD[ý!þË[œG@ Èi,i-i.Ç„ÀÄ Ô à¼³Öuâàø•ät@ xíµ×Ì•W^iî¿ÿ~³fÍš j´qš7o‰¹ý3ó¿1þƒ   ÿ¤±<ÅÐ‘æKýŒ-  êæ üÙÉ€@Ò¼ðÂÑÌ¨â¿Y³fæˆ#Žˆ¢ýwïÞ=iÍCy! @ �< ð °íÏ O ¦`	@ï(€€'¯¿þz$þxà³zõjO¹Æ'›F�™8ÀwÜqñŸv¡$€ B' �å)  ÛYð (�©Îà”äæ‰À	!'C H,�7ß|Ó\sÍ5‘ÛÿªU«[�-\kþ÷ß3kÖ,Ó³gÏ-}Œ×! @ Þ	HcyZR'ÍÇ. Þ[(yj;g€– ` H^ãSb@ ®žþysË-·˜ûî»Ï„(þåöè¡‡šã�?ÞôîÝÛçC € ²" �å)€4ŸóöïY>†ÆÀƒ@ù. Œa§H€ òH@3ÿ7ß|³yðÁÍÊ•+óx¥âd]¿~}3yòäÈí¿OŸ>Å)W…   �T�Æò¸  ©îM•wö ÐzO< *€ò€@èÞyçsíµ×š?ÿùÏæ‹/¾®º40{î¹§9í´ÓÌöÛo\ý¨  $ƒ€4–§Ø:Îš/Ä¶^J< JùÈDKÖØ:®-¿+·OOÁ)¶|Þ�   �Xx÷ÝwÍÕW_mî½÷^³bÅŠX”Ég!ðoÊ”)fæÌ™fàÀ�>³&/@ €@V¤±<,±“ÖK½û¿Àc (í~²i_Èº¥ÿfÿ÷óÏ?÷µ6%û‹s  „€–|½öÚkæ¦›n2÷ÜsO°âÿÀ4§Ÿ~:kþÒ«¸  l�€ÖÿKk9&i=< ,¶,íI²­)}šÛ_Y¦¾ú
£Rnô8€@2ÌŸ?ßüìg?‹¢ý‡èö_§N3vìXsòÉ'#þ“Ñ%)%  �à	Hcyð´–ÖC¬Yx ”~edÒ¾MMKÿÍí¯§í)r»8gA €@^	¼ÿþûæÊ+¯ŒÜþ=ÌDäµ¬¹d¾ÝvÛ™ñãÇ›sÎ9Çôïß?—,8€  à�€'�%­‡€…€ ´‹ª3|Yú4÷¿êœŠRY«V­Ü3áL@ ˆ¹ý¿÷Þ{æºë®3wß}·7ÄXÕO…iØ°¡Ùk¯½ÌìÙ³Í AƒL�9‡Ä‰]Ý(  $—€´•'€´ž–¤>a (íêÎ ­O‘‹
€Ô¯  D`áÂ…Q´­ùqæ¿nÝºÑÌÿ¹çž¹ý#þê¼T€@Â	H[IcyHÒzx XÄ (íMÞ< ˆàáëI€ bB@âÿª«®Šfþ—-[“Rù+†ÖüO˜0Áœþù‘ø¯Y“a�?ºä@ ®¤­<z ` °‚@i¯ôb øòË/�ö©$A €@ò	Hük«¿;î¸#È™ÿúõë'þµæñŸü>K  „F@ÚJËCÂ "€RZ°ÚµcÉ:…€+EÎ‡  P|¡‹Íü�7Î\rÉ%¦OŸ>ˆÿâw9J @ Uðè ­G _¿ÒŽ¦-!œMK Jaò€@’	,Z´È\ýõæÎ;ï4!ºý×®]ÛŒ3·ÿ$wRÊ@ %< ¤õØÐBÀ ôË#k�¶†pJ«W¯ÆÀ‰ 'C (Eû_¼xq$þo¿ýö Å¿¶ú5j”¹øâ‹ÍŽ;îÈÌñºW†   �È  �å!Iëá`!` (íMŠàÜ³V­ZeÖ¯'¶D)RþB H�÷ßßÜrË-&Tñ/·ÍüËíŸ5ÿÉê›”€@Z	H[IcyHÒz5�% ¥½ÉKÀ+V˜uë0,yø‚’  �‚ÐÌÿ­·Þjîºë.óé§ŸôÚ…¸Ø6Ûlc†jÎ<óLÓ¯_?¶«-t®@ Î¤­¤±<$‚ –AÄ „6—üÂµcihOÛT¸…ó! @ CK–,1?ûÙÏÌ¯~õ« Å¿fþ‡¹ý�1ñŸa¿àc€  P|ÒVÒX’´ž4_ê€Ò.°Æ>8÷¬Ï>û@ê¿R € ’Dà£�>ŠÜþùË_)þðOÑþ5ó�øORÏ¤¬€   2 HcyHÒzÒ|©O J»À×öÁÙ·Dn£žö©L}Ç   �|X°`�ùõ¯ìÌ­ZµÌÈ‘#Íyç�y è  @ I¤­<-Í“Ö“æK}"@E�EÈÉ*¤ ,¨ Ê3@ q%°téRó›ßüÆüö·¿5ZZªY³f´æÿ?ø�<x0nÿ¡50õ�  �ÒV‚ :ë¼�pãPÑšåq êU¼”Ý³o¾ùÆGÍî¢|€ ²"°hÑ¢hÖ_ÿCÿrû6l˜9ë¬³ÌÄ‰Ùê/«ÞÁ‡! @ N$þ¥±ëÿ+Ä F¹ â•ž©“j¿J  Ä�€Äÿm·ÝEüQükæÔ¨Qæì³Ï6&L@üÇ¯R"@ È�€4•‡Ù]@%æ *`h+@ç� V®\ÉV€Ly@ 6>þøãÈí_Ûý-\¸06åòU�5j˜]wÝÕÈí_â_[ÿ‘  @ I% - ¥­<$i<i=’%€ ¢ÈÀy'  @y@ .>ùä“(àßM7Ýd>øàƒ¸Ë[94ó¿Ë.»|7óOÀ?ohÉ€ ŠDÀ£@�- ËÚ‘é�ŠíÅ °bÅ
< *˜ò€@Ñ	,^¼Øüîw¿3?ÿùÏ�¶ý-iæ·Ýv‹fþYóZëR@ é% €´•‡„ D< *`¬³O�{ØçŸnÖ®ÅÀT�•g€ ŠG@[ÝqÇÑšÿÅ¿Èî¼óÎæ´ÓNcÍñºW†   �<�¦’¶ò�¤ñ¤õH–  ÝÀ‹ÀgŸ}fV¯^]‘+Ï  @ ($þo¿ýöhæ?D·Íü:4Šö¿ûî»³Õ_Qz…   �|�¦’¶ò�ð ¨@ œ{˜œ_~ùeE®<ƒ   �‚�Ûÿïÿ{ó³Ÿý,Ø5ÿŠö¯™ÿ=÷Üñ_ðÆ! @ ß¤©¤­<$i<\´Ë@² ¢G­±O—Uü›Û3E™Æ �;Î‚  àƒ€þÝ}÷ÝQÐ¿gþÅ¨ÿþfæÌ™†™=†<  @ Ž¤©¤­<$i<i=’%€@E7øÚ>UçØ`�œ#K—.õµ]EEÉx@ X¾|y´æÿÆo4óçÏÏèœ¤}¨oß¾æÌ3Ï4“'O6µk×NZñ)/  @ #Ú]MÚÊ1IÛIãIë‘, wm4¹Ê�6~9óÿ¬BÑ*¿ýö[£õ™$@ (
ºóÎ;Í7Ü`,XP˜‹ð*úM4h�™={¶™:uª©S§N¯Î¥  @ …# -%Må!¸º´�4©Œ €�»‚¢÷}b�œ ÊN3PrYiÐ �þ%A €@ž	h†àÞ{ï5×^{m�â¿fÍšfØ°aæœsÎ1cÇŽEüç¹?‘=  —€´”4•‡$mG„öJ svu¯”GHOÂ¹§}ñÅìR¯ .€@¬	èž{ÿý÷››nº)X·ÿîÝ»›Y³fEâ¿^½z±n
@ p%  ôûî!IÛ °H •`Ø§²9‡š”µjÕ*y›�  @ Ÿä¨€—_~¹yë­·òy©¢åÝ­[7sÞyç™½öÚË þ‹Ö\€ 
H@ZÊ“€´ •ÚŽ% •`”ug€ö«TÐ
  ä�€úÓŸ"ñb´¹ýo¿ýöQÀ?­ùßn»íò“œ! @ 1" -%Må!a Ø"€��h{çž¶lÙ2 så?@ ^	h` ·ÿ«®º*È5ÿ‚¥™ÿ.¸ÀL˜0ñïµ÷�  Ä�€~ç¥©<$i;¶ ¬@%ö©—% K–,ñå²²qéø€ ¢%Všù¿è¢‹Ì‡~$‰ÿK/½4Úê·ÿ ›˜JA €ÀVÈËOšÊCÂ`ˆÄ Øˆ¬CŠé”äŠêÉeÅ©œ@ 4Zxß}÷Eâ_÷ZmRÒV=zô@ü‡Ô¨Ô€ ²& -åiyŸ´ •Z €J0ìÓ¯ì!+‘F”5ì‘Súä“OŒ  ø# wÀ‡z(ÿ,ð—qŒr*))1W\q…™8q"nÿ1jŠ@ …%àIOIÓIÛIã‘Êà°yWXa_RGÉ9iFJÛV¬]ËŽ9CäD@ •h?àx Z?þüJï„ó´K—.æÇ?þq$þë×¯NÅ¨	  @ ÒPÒR¼ü¤é¤íH•` ¨£ì©öïûÈN~¥
ZáiïÊÍKÈ+€ RD \ü_xá…fîÜ¹>±£×¹sçÈí¿ýö3ˆÿØ5‚   ��†ò PZNšŽ½Ù7i; › ±ÿ~i�EöÀ °9^�  PP<üðÃÑÌÿ¼yó
zíB]Lÿäö¿Ï>ûàö_(è\€ bKÀ£@šNÚŽT‰ 1 *Á({ª� rÒÙ °b'›ãå@ ™X³f�ùë_ÿ‰ãPÅ»víÌøC3iÒ$Ó AƒÌÀð)@ €@À¤¡<y HÓIÛ‘*À P	FÙS¹‰,´‡“@�+<tÜÍKÇ+€ R@@â¿<àß;ï¼d�Û¶mkÎ;ï<sÐA™F�YG*@ È–€4”‡€êÒrÒt,Ø¤0 lÄþ»ÒÎ í[é¡ãn^:^�  8�Õ«WGnÿçŸ¾	Uü÷êÕËœ~úéæÀDüÞŸ©  dG@JZÊ1• ¤íH•` ¨£ì©ÜDÛÃÙàã�?Þ<w^�   �-Xµj•yôÑG£hø¡ŠEû?ë¬³Ì”)Sÿ[ì	¼@ i% åa"UZNšŽ% ›t$‚ nÄþ«Î²ÜN#¾ùæóùçŸ=’  @ zëÖ­‹Öü_yå•æõ×_¯þ„~BkþgÍšüÃí?�H‘! @ ¯<j(i9i:§IÝ¼V¶H™c ¨¼:Œ,FNé³Ï>c+@'‚œ¤…€öüÕšÿK.¹Ä<ÿüóAV»cÇŽæŒ3Î0Gq„iÚ´i�u¤R€   Ú@ÊC’–sšÐõP†Xf� êfYc_v^ðé§Ÿ°j¾¼
@à;ÿÚêïòË/væ¿{÷îæ´ÓN3‡~¸iÒ¤Éwuç	  @  PÊ1•»ÿKÓ‘6!€` eÿª³hßH'—­_ñdÁªº”¼
@ á¾úê«Hü_qÅæ¥—^Jxmª.~§N�Ì©§ž‰ÿfÍšUý!^…   @ ÒNâ¨IÃIËa ¨¢O°
(ö%¹‹,°Ç{äl$Y¼x±� ¶$@ á(ÿ—^z©yùå—Ã« ­QIII´æÿ°Ã3�7²ŽT
€  à‹€‚ÿIC9&i8i9– T@PìKÚ/r¾=œ< >øà³h‘ŒO$@ ¨L`ýúõæ‘G‰Öü‡*þ{öìÍüOŸ>ñ_¹ñy@ Øi'i(Ç$7ßÒt¤Mä<»½I>¡ý»ÞVHÊýk—Ši/k¹°lØ #	€ D@3ÿÚêïšk®1/¾øb�Pðï„N0|ðÿgï<À¬,®ÿ?6Š¢¨H¯‚4E{7Öh41ÿ“kLb7{ïIŒÆh4ö†RÄ("Uz•*H]`dé½ã>óÛ«‹,[î;ï½oùžç™çîÞ½ï¼3Ÿywîœ3gÎÑ™ÿDŽ°:%" "à› :º:T@A‡C—C§“|‡€ ßRò+V#ÂO.+ûÏ•— «W¯®üú¤ˆ€$˜ ÊÿÇìvþ‡’Èž6iÒDgþ9²ê”ˆ€ˆ@˜Ð™<ÅOC‡C—äÍf_óY· ;§�ËH`ÿÎ±ÍR"" i'°qãF·óÿÀ&6Õ_«V­œòÿ›ßüÆ(à_ÚŸxõ_D@D *Ð™Ð�<:œÜÿwR€�€±oã{RhK ÿ}ÒXx²dí¼¥ú‹ˆ€Dœ ;ÿ0O?ý´5jdÄ[›]ó4h`~ûÛßš_üâRþ³C¨«D@D@RL �ÉC
@t7t¸Àç’:
¸ó‘å¡ÁzÄC”µ¡dÑ¢E¾,Y;o©þ"" &€òß¯_?çö?bÄˆ·4û¦Õ¯_ß\yå•Î €!@"" " "P5ìþ£;t7t8 vR€�€±oã6Búˆ@2þ|STT¨]," q%�Ùù¿çž{LR•Îüãò�@Ê\ŸTµ[D@D ßÐ™Ð�<:œŽ ì¤ ;cß^oÖ£­¶dÍ	WdR^U«VÍV%�t ŠoŸ>}\´ÿ¤*ÿÍ›77×]w�‹öß°aÃt¬z)" " ž	 +¡3y8:�î†‡.')ƒ@Ö®íeÔ•´·ˆ¹Ä–ÀÖ#dLÚã¡þˆ€”G`Ë–-nÇÿ¡‡2#G&óÌ?Aþ.»ì2sÉ%—˜Æ�—‡C(‡ º’åŸ; »¡Ã) 4Ê Ê€Rê-ò÷Í¶…\’YgYt k|ºPD fPþIñwÇw˜±cÇŽ$MPþ¯¾újóûßÿÞhç?i£«þˆ€ˆ€äš º’‡óÿèlènÊÁ^Î Ê Pû',HÓm	d X°`�),,,ÿNú«ˆ€$€ .|Ã†sÊ?;ÿ[·â‰—,ÉüÃ  �ÿd�­z#" "�èJèL�Ý-°wÀvDúò¬Ï¶GºWþ·ÖV5Ó¶¯jd[-óÜ¹�ã	f{{]'" 9!€²ÏŽÿý÷ßïÜþ“¨ü³óÕUW™K/½TÊNž*ÝDD@D Ð•< ÐÙÐÝÐá$;! ÀNÀ”¼�ûÈ4[y Ì›7ÏÌš5Ë|ýõ×f—]v)ÿŽú«ˆ€Ä� Ê>;þ·Ýv›{M¢Û�:uÌµ×^ë\ÿëÕ«ÃQR“E@D@D zÐ‘Ð•Ð™
:º›Ž ”RG Ê�cÿDôH¬H�¢HnÛ¶Í�iY¹reùwÓ_E@D †PþG�eþò—¿˜áÃ‡»¬'1ìF¹MÆíŸhÿ¸ýó³Œ¹åâÒE@D@D ÒÐ‘8ÿ�ÎPÐÙfØ².`=‰¾\€ò‡—è‘Ëm)²%P$ÉåË—›¯¾úªü»é¯" "3ü?~¼ùë_ÿê”~OšàöÍ5×˜+®¸Â4hÐ iÝSD@D@D ¯Ð‘Ð•
º:ÛŠ€õ$þr *b,I³l	´ª%µ…‡s-·VŸ�ÀRÏ™ÜþÙùO¢Ûÿ~ûíg®¼òJsùå—KùÏÑs¥Ûˆ€ˆ€¤‹ :’‡”éèjèl�<·Ó@^1 *åö#D“$¨Ä¼ìO›‚‚‚²ÿ¨wE@D fpû7nœÛù4hPb•výÿð‡?˜F�Ål„Ô\ˆt$t¥€‚®†Î†î&)‡€ åÀ)ùSæ,	UÖ²páB3}:Ï¤DD@âM 7ÿÉ“'›;ï¼Ó|öÙg‰Tþ	øÇ®?çþ¥üÇûyUëE@D@¢M 	])  «Í°E €Ô€
 Ù?cEšmK  ®±¸·¬]«¬#×'D@¢LàóÏ?7<ð€2dH"þí½÷Þæç?ÿ¹ùýï/å?Ê¢Ú&" "{èFèHŽ¢«¡³É ‚§B€
 Ù?P‚è}Ë*þhùŸX\¼ØÎ/,ÿCú«ˆ€D˜ gþï¹çóá‡š5kÖD¸¥Ù5åÿÒK/5×_½iÕª•¢ýg‡QW‰€ˆ€ˆ@¥ ¡#yt5t¶@�Û=´#òUÈ P¹!bÛÿý@� /2³ç`˜’ˆ€ˆ@¼pæåÿ®»î2Ÿ~ú©Ù°!yözõê™_ýêWæÆo4-[¶Œ× ©µ" " "CèFèH]M®Ö• )@% Ù�l´eš-�Ž�ßröl *‡\Ÿˆ�aÃ†¹�ÿ~ýú%Òíß}÷ýfç_Ê”ž<µED@D ÉÐ�Ð‘
:º:›¤
X ’?³Õõ¥-<\5KÞ«òËâÅ‹] @Rgíº«l/U¨DÀ3�¯¿þÚlÜ¸Ñ°»M`;^)ü�î¾ûîîÿ”×ÝvÛÍT¯^Ý½znB,ª#ÚÿSO=eúöí›È�Üþüã»3ÿ¸ýKD@âC€ù:3�—žË™ß3ówæµZµj©�Çã3¢jišðÿK @t¤€‚Ž†®–<÷Ä€`Êº\€²¨ìøÖ¤)¶²*Ü¢°°Ð,Y²Äàj*‡ ¿Õ«W›åË—»¼²üÏ‘_véÒ¥fåÊ•fÕªUîoœaçÿ’/ Ò…Ví²Ë.n¡˜yÅÀâ±víÚ†Üðûì³�ÙÿýÍ`ˆÏ{™W›I”þ}ôÑGn‘�”~eúÁ8þä'?17ß|³iÓ¦Mæm½Š€ä™ óøŠ+\aîfç•y�÷ye>_¿~½3à–žÃùa³¥tan®Q£†›¯ñúáÿŸ¹»nÝºßÌßÌë¼ÇÜ/— ÿ×èF zÑÕÂímtjOÎ*5\¦“ 7	*°%ëo”r]Ê `)JDÀ‰¸ŽÍŸ?ß¥�™;w®™3gŽ{�È²(ù2¯¼ÇùõuëÖeuwµjÕ25kÖt¯ìó{¦°x$mÜ�hš6mj6lè~çsq¢ý?öØc‰Uþ«þð‡.àŸ”ÿ¸=�jo’°ø/**rŠ ÑÀ™ÏqfÍTzÏÌå¼Ç¾iÓ¦¬0`ÌÝk¯½Ìž{îé
† æhÞã@óæÍM‹-L“&M¾™Ë÷Øc�¬î§‹D@Ê&€NÄÿy@AOCGCWS ÀJÀ” �J>‚¶€kIk[ª•¼Wå,]|©}ôÑU¾Vˆ€·èc�ˆ’�Û_üŽû»C(¸ô‡!¸˜²ëDÙ™à%Ð AgèCÉdw‰…$J&†~Æs Ê2~üxóä“OºhÿIøÇ‚ÿ§?ý©¹æškÌÁå¡PÛD qPäçÍ›÷Í<>kÖ,7‡3�³N*..v%¬Žc8 àE°3Á£.s5›6¼rD¨]»vÎ(€�€¹^""�=t"þçJÆý?»��€7�ãå2 T~ÔÖÛ�N¶å{¶dm @Qùâ‹/*W}RRN WNþoPö'L˜`¾üòK·ÓÏn»ý¾8¼ÎhkFp;mÖ¬™iÜ¸±+š;ä�CœòÉ¢�‚¨œyäÓ³gOç^•vùj‹öŸýìgnç¿uklº�0	 lãæË<>iÒ$3mÚ47¯3�³Û�KÔƒ2¥´`8Äˆ[¿~}çÙ…Q—y£ bÅHD@*O �ˆ5^@áÜ?:ºš¤d ¨¤’�d®@q °6óÅÇŽ
�DD`G¸õcÆ}äÈ‘NÑg§ÆŒ‘\(îØƒßážÅ/Á•O ¼vìØÑzè¡æ°ÃsçRw¬!7ï°8ôÑG«üã‘�òÿÇ?þÑHùÏÍ3¥»¤“ núììG„¢ 0ÚòqXâ(´iF8BÀŽòÏk§N�Ìá‡îQ2êfÚ«WˆÖEèDåyâT²½èf  °’Àd ¨$(û1ü‰gÚB~Éº¶d%™óÊ.tVä¬*ÑE"�Pì±¸ÂýœÝs~ž8q¢áÿ&iÂ™W„s¦¸¢wèÐÁø™Â™Ô\	Êÿ?ÿùOóÁ$rçŸ³½_|±¹úê«MÛ¶ms…U÷�Ô`^ãxÆ[æïŒçÖÌ™,Ÿ’'Ä!˜<y²+ôo.¹x``>ç½$†MÞ(ªGù"€.Ä‘Mk<t3&t5I%È P	H%A!GÅ<[šØ’5;\ÊPnp#“ˆ@Ú	à.�’Ï.FvŠXPe¢8§…»c”>}ú8÷R‘Gq„éÜ¹³[H2_„™>åŸ€¸ý01iB�Æÿ÷ÿþŸsûoß¾}Òº§þˆ@^	pfÃí¨Q£Ü+ó8^[i¼(=zôpŠ?Þ xw{ì±Î0@l‰ˆÀÿ@úî1›,Ø ô£›¡£%o·( •¹$k%¶2•'ð3¸–L´¥£-YG~ÁÚ…ÂsÎ9ç$‘º$ �;B(ý¸ø�3Æíe™¿â;Æë™@†}ûöun¥Gu”3üñnG‰s¨>ƒËã�?nºuëæ"nû¬;
uÑû¢‹.27Üpƒ‘ò…Q’@€sý,à‡æær”ÿ)S¦øHç•<Î�1dŽ`Ô=î¸ãœ‡€2
$b˜Õ‰ Ð…XïvÿÑÍäþ_�2 T–ý(gL¦ØB”É¬ œuáK%ˆ”bHžyv…Øêß¿¿4h�;ÿ•–þgÓOb!Pz÷îmN=õTsÆg8c Ç|D f.zñÅÝÎ?gv“&¡8÷ÜsÍUW]åÝIëŸú#¹&À¹]æqþ~ýú™O>ùÄÇ">×ÝÈÙýøÞÃÈM!xà™gžiN;í4ç€A’8Hþ/Xx8ÿ�N†n(F[Úøï’¶ì/“#myÍ–@¡£¿÷½ï™×^{Í¥
Ø&].‘'@J>ÎºgŒ,=D}�|¿Ãh ‹Ev“¾ÿýï›“O>ÙíhØ.™:uªyê©§œ»*é·’&áºà‚Ì-·ÜbŽ<’©[""�-<´ØÅŽÿgŸ}æ”ù»³mN¬¯Ã0yÂ	'8OÐO<Ñ'eˆõ�ªñU$ðÕW_™K/½ÔàéP¤t©-cmQ€JÂ”@%A•|Œk¦-ø«2 �ºË—Îƒ•�ÕK"	lÜ¸Ñ¹ú�=Ú)™4œù—dO€EøÐ¡CÝÑ	2`8å”SÜnyª++,ä9óÿþûïÇ6"wy}å˜ÄYg�%å¿<Hú›T‚ s6ë•áÃ‡»yœWævIöð¶"ÞÊ€óÏ?ßœtÒIÎ@°R‰$� sŠ§4ÎèdèfRþ«ðÐÈÿ¼
°J}ôû3Q¤²6 T«VÍ�åå<˜D’F€ˆ®ì(2Äüë_ÿ2Ï>û¬;ã¯E£¿‘&H"t1pŽŽó¤ì ì®¢³¥óæÍscòÖ[o%Ò CŠU¼¬®»î:CÜ‰ˆ@Õ	à¹Å\�‹ÿ?þñóòË/;O.\w%~ð]IjDŽÄq¬"3‡3�ëˆ¨Æª%š0~1·ÜâÜÿ@[zÚ"€…PY‘ ²¤¾ýÜ®öÇæ¶`È:?Ásš6mjÎ>ûl³Ë.:‰ñ-^ýw¸„’
Åÿ‰'žp»FI<[•qbI�Áƒ›#F¸E#AïØE*+k A©~øaÓµkWÑw£‚á›v ü`õ¶ÛnsÊY¾ù°~Ø� s
G´ðØúÛßþæRƒ²['î¨¼½‘1|úé§ÎÈ‚!`ß}÷ui`µFô†YE„ Ï;Ç Y·`h ËíµïÛ2ÊY&« R€*À*ù()&ªÛr®-û•¼WåxÎížwÞy†sªˆ;\ÓIã÷ÒK/™'Ÿ|Ò|ôÑGfÅŠ>ò»ÆMNÚ�Q±¨¨È-ÚQòñ2"H †€Ì’`‚�<òˆyç�wLÏî¢üãöß¥KsôÑG—i ÉÉ`è&"SÌÙÄjyæ™gÌƒ>èŒ¹ë×¯×<žƒñD)ÂÈ2}út —3Ò™9\ëÄ€n‘3þ{á…qˆJ±½þß¶Ì±E) « S€*À*ù(.'ÙÒ¨ä½¬^Ø¥#½W“&M¾Y gU‘.�<Ø¼y³síÕ«—¹ûî»]*9v¤qQ—äž † �¸Ö‘_—¸ ,"]ª?”ÿU«Vå¾a!ß‘ ZdH@ùïÜ¹³æÔ�y«úd@ñd—ŸcAwÞy§3$bÔE)•ä– Ì×¬YãŒ/¤ÉEYÊÌã»ïžõÉÓÜvBw��àù?~¼[+z=ËÞæi[Vïävz{'d Ø	˜
ÞæñD[˜õl\½zusÐA¹èÔ™º
î«?‹@¤°Ha·ˆ]evþÙyÖùÐü_°¤ê"'7Ç1pƒïÑ£‡yï½÷|¤ÜÉ¿ÓvþI­uã�7ºÛrûÿ ý*å`×Ÿ¨þÌã¯¿þºaçYÜr€åèOÌãI#ˆ.A[ëÖ­ëÌwZ3æhtïx®ñå¸sO !é0[Þ³es€zRyiÖÊk*i}Ûi´‰¶œaKÝoß®ÚO|ÉbÝýÍo~c0HD .Pòq7÷Ýw�®åÏqÅ¥ë±j'F rOc`|’x†—¹“3ÿwÝu—¬*å?V�¨›GxØÀs(ýÿùÏ\àVÍãy�2n�²Ä‚Îœ9ÓÍu—_~¹Ë ucÀôVä	à5ŠîƒPpeD“òŸH ²€f/!bÅç¶�Ï,k “:V]Ü¥›5kf«’ˆ@ô	°ëÏŽ‘ýûõë—Èåè�Bå[ÈN^Rƒ0âöO´”ÿŽ;jW¬ò�…>™r¸•“†î¿ÿý¯ËÖ’Ô9")ÃŒÑ}Îœ9æÅ_tß¿x;Dš£¤ˆttt €‚†.(Š`À6Äör ²:7aÑ'	_Âü#�@.]�Pêâày%o<ùãµëŸàºÅN	°ûÅ™ÿ;î¸CÊÿN)é"°=�Œ÷Ö«¯¾êŒ¸ÅÅÅ:¶µ=¢Hÿ†×ÆØ±cÍ­·Þê<»ð mÑ¢…žFzÔÔ¸<ZÐyXKz*ASÀ©,`*@ÐJ.!ÝÄq¶´µ%kC
îª­ZµrçVe (!«—È`ÑH€¨ÇÜüûßÿvn£:#¹aJMƒ2Êÿ=÷Üã”åËNÍÐ«£ <4ÈÍã 8_Î‚\?r�<y²3` ¨_¿¾Q€Àø�cÚZÌ|Ó½{wç=J�Ñ ÂùÿÁ¶tµeS€zR{iÖŠkj‰}ÛqÎœŒµåt[~ûvÕ~"J7¹»ùb&°‹D¢F 7-žÑ‡zÈ>ÜE'ŽZÕžô@ù?ýôÓÍ½÷Þk?üpí|¥gèÕÓ,	°èFaìÖ­›ùç?ÿé”Æ$ÆÉO,/cLIåÚ»wo—áå¦›n2çž{®K/Ë©Ñ© €®ÃzÝ' ,³×£ƒéü– å�%¸’Ëàw†-õ²­†Iœs¬D°®S§N¶Õè:… çý{öìin¿ývwîP‹ÆP0«ÒJÀHzòÉ'›ûî»ÏqÄRþ+ÉMK7¶â¹…)Bè/9ÏžxSãX ;ªíÚµ3{ï½wr:¨ž$Š q,ÈÅœPæÙë_°e®-rcÊ¦< ²€Vr	G ¦ÚØŒµråJ÷¥LJ@È~@t¥_œ%'4A‡¦N�ª´P~ñª¶*À½õØc�uÆ(þ)Úêã©$@jÖ§žzÊÅn!ø›’ä˜;w®èˆ§X:yc÷1÷`€Dçñ è^è`èb’,È h¥.áJg[±e�RïWùG&ë“N:I‹Ú*“Ó¾	0IÏ›7Ï<ñÄæùçŸ7, µhôMYõU… ÊÿñÇïÜþO<ñD³Ç�¦ÛªÜZŸ�X`gøóÏ?wG·Þyçç.ËŽ¨Ñ•&°zõj`mþüù¦uëÖî8€â£TŸ>2æ$æ¢Í @ú€¾¶t³EÍ,ÇM€,Á•º¬‘ýù[²ö¹Â­šc ]t‘©V­Z©ªõ£ä–@ÆB‹‹õÛo¿íòBç¶º›lO e¿sçÎæþûï7(ÿZÐnÏG¿‰@YÈÿÈ#�˜ÿýïÎ5¼¬Ïè½ä`=9sæL3aÂçÐ¼ysm,%o˜cÙ#âIýãÿ0“&M
º©´ØxÛ–±±‘Fï‘vÄµXž&Ù(ŸV±¸¯ü,�|=z´yà�L¯^½ÌŠ+òÕÝW”ýcŽ9ÆÜ|óÍÎý_Ê¿¨˜À'Ÿ|âÜþûõët§­â›é‘#€¢5dÈóàƒº¬Šù¹!J]ƒÐm8ÿ�®ãAÏAçB÷Òî€'I à•\ºÆ¾žkKË UÙšt€|°Ü[ƒ€ÔµY`çŸÿìü£üüO"ù$€²ÜqÇ™;ï¼Óœ}öÙòŽÊç`èÞ± À<þÑG¹�ÿ�m�Å°…ÒHž…‚‚çÐ¨Q#Ó¸qcÍ¡¡�V¥•!°aÃ—±ã¤‡Í¥‰öžÏÚ²¡2÷ÖgÊ& @Ù\ªò.ù'�°åP[²ößß¼y³ÁpÖYg™š5kVåþú¬"°uëV3xð`w¾ºoß¾Šˆ¦.öA ³ó�òÆg(¿µ¨ª#ÑØåýàƒœò�1W»¾‰îJwŽx S¦LqÇL‰À:S"¹&À¦Ò3Ï<cÆ�gÐwÈZ{í'¶|`‹< €Ô€ ðJ.åüÜrRf-k×®uçb.\˜uºPªJ W,”ÎWsfc€DòI€€œùÿË_þâ”¹ýçs4tï8@Ù'ciþÈ±­y<£–»6€g£G�Š‘;ìºS)è6œýG×	(èZè\Rþ‚”  À’‡pœ}€f,[¶ÌLž<9¨uŒª$"P)C‡5�>ú¨‹Êêá\V¥î©‰ÀÎ�Ú�@(ÿxCIùß)½/ÿG€y»{÷îæoû›5j”�óµB›@Ó¦Ms™}>þøcƒ;¶DrE€tt‚®…Î%@@˜2 XrùlûJ	ä×BþÖaÃ†™M›8U �p	Œ1Ò<üÐÃ†3YÚ1
—µj¯˜@Fù¿ýöÛÍùçŸ¯óª#Ó'RN€�b¶<öØcfüøñrûOùóPQ÷ñxè¡‡\fJD ÐiÐmÐq
:VFß
X•.—ÀÏ3ÀL:Ú–%AªÃ5†’åË;i†®MÜDIÕçÓ>Ú1JÁxG½‹(ÿ'Ÿ|²éÒ¥‹sûçw‰ˆÀÎ	°«†K7®Ýœ«•×ÎYé/ß;v¬;òG°È€g±¿­T?‰@9ÐiÐm<¸ÿ£c¡kÉzUïÊþI«¬Ê’*ÿs¸¢Œ²%Ð~¾ÀÍ¬Y³ôe^>oý5 \Ÿ{î9Óû“ÞÚ1
ÀQ—ú!°Ë.»˜ã�?ÞÜpÃæôÓOWÎj?XUK‚	á�õÓO?íÜþåÁ•àÁ¡kx‹ðìŒ92h>öZ§*“D ½�ÝÆƒ‘]Kîÿ <@,y	J1/hu¸e‘‹]é{‚’Ôõe`FùçÌ¨\ Ë"¤÷rM€Tœù?ï¼óí?×ðu¿X˜8q¢;Ï�@Gc9„yoô AƒÌ“O>éÖ›yoŒ�Xè2è4žÖ›èXèZ2 xxbd ð ±¤Š¥öuŠ-«ƒTIªŒ(Rkˆº¶LK–,1ÿýïÍ›o¾éã,V™÷Ð›"PY¸ù³óÏ™ÿ³Ï>[ÿ*NŸK-vÐfÎœé”b·(Õ_j/ç Á#	Ð&�0¬[·Îé4è6Ý
]Kâ�€  –ªb’ýù«R¿WùG¾Ð§N�jŠŠŠ|¸ËTùþº ™°¾öíÛ×)ÿ‹/Nf'Õ«XèÔ©“¹æškí?V£¦Ææ“ÀÒ¥KÍ+¯¼âÎþkç?Ÿ#‘Œ{³;KV€·ß~Û°A Ÿ0X¢Ë Óx0V¢[¡cI<�ÀÈ’jpMY´J,eÃ‡7,fA›¢ë@€I¸OŸ>æ_ÿú—áü¿DòM cÇŽæ–[n1_|±Ùc�=òÝÝ_"O #.Aÿ8Âµzu GÃÈ÷UÌ�+V˜·ÞzËôìÙÓ—›vî¯;Eš€g]Ý
Kâ‰€ ž@–TCzŠ™¶l	R-_îXe=åÌÒ]› cÆŒqn~Ÿ}öYz£.Ä™ ÿPþqû¿è¢‹L�5âÜµ]rB€Ý³�š¿ÿýï/ ‰ø$0{ölóïÿÛ=cÊà“lºëB‡A—ñ`°D§B·BÇ’x" €'�%Õð�~aË² ÕnØ°Áy |õU ÓAš kB€Åâ«¯¾ê¢ý&¤KêFŒ	´nÝÚ\uÕUæÂ/4ÕªU‹qOÔtÈ"þÏ�;×üç?ÿ1_~ù¥¢¶ç{êîB 6Ö
_|ÁV"Á	 ÃàÍŒNPÐ©x0m®lCâ.—Àÿ�ŽµUz90aÂ¹dùŸÔÔÈ¤ûÎ;ï˜^½zé9JÍ¨G·£íÛ·7wÜq‡ùùÏnªW¯Ý†ªe"!‹-rÁ[9Æåám„z¦¦D� k…gŸ}ÖG­ijOÌpd	ÆÓQft*t+‰G2 x„YRÕDû:×–@i*ðCš–åË—ûo¡jL<Š½{÷6¯½öš™7o^âû«F›@»víœòÏ™ÿÚµkG»±j�D„ F\"µãžíi!‘ž©Q$°víZ÷¼±q TÔQ¡ø´	Ý…cK‚•¢K¡S¡[I<�À#Ì’ªÐØÇÛ²(HÕ(pC†1v&Ò]SD]}ê©§Ì¨Q£bÚ5;	Hõwè¡‡š.]º¸3ÿ5kÖLB·Ô� Á[qËfGVñ€BÇ­”(,,tGˆÄñ‰dC ÝeèÐ¡>¼–Ð¥Ð©´šÍ@”s� åÀ	ð§ÑöZV¾ô9�%Kl Œ©»˜�¢—_~ÙŒ?^©$S7úÑêpÛ¶mÍ=÷Üc~ðƒ)ÿÑµ&Ú.\hÞxã3iÒ$ÍãÑªÄµnÜ¸q.ÝdAAAâú¦…O �ÝÅ“á]
�Jâ™€ ž�–T7Æ¾~´j\gðX¹reÐªt}JlÝºÕ¹ð}ðÁfÕªU)éµº5DûoÓ¦�¹ï¾ûÌ¹çžköÙgŸ¨5Qí�ÈÀõÿ“O>qùÙ=¸ÐF¶ŸjX4	à}Ò¿óÂ/˜uëÖE³‘jUd	 ³ »xš»Ð¥Ð©$ž	È àhIu¸¬L²%P6 Ò±p†FÙ Â¤$Ö:gÎ—'zæÌÀ(IÄ£>åˆÀî»ïn~ò“Ÿ˜SO=U©þrÄ\·IŒ¸ìúsî_FÜdŒi{�J÷îÝÍ§Ÿ~*”8`ÛŒÎ‚îâ!¥$:ºT #ÕyDé[Ë ÞððÐÎZ=“ðäÉ“}¤ÑÚ]qXê	úGäU‰ä“ 1Llˆ`.¨<�‚9æÍ7ßtó¸Î`Wž›>éŸÀôéÓ� ëP‰T† ÞKè,žžt(t)Id jI•<´Ó‚VÏYÒžÎÒmŽ®�(\öÈÑ³gO=+£45ÅeÌ˜1nI™LÒ4òêk|ß÷í××ÅpQìŸ $u­¬+ÆŽkºvíêc7×G“TGÄ	 « ³xš¿Ð¡d iÌe 	¬­v±-“mYä¸Ð�ÿW©Ü‚PLþµ‹/v.£Dÿ—ˆ@�Rê¥—^r;™Ê_…Q¢N`ò¤É†l+V¬ˆzSÕ¾”À‹‹g’c)òHIÉ è&º
:‹÷t't(t)Id j©*yx`Æ­›µD¾K åêã�?v)£<]ùî-ô»dE`þüùæ­·Þ2³fÍÊêz]$i!€ÒßçÓ>.uVZú¬~FŸ Jÿ”)S\F
Œþxå³…è(è*žŽþ¡;¡CIB" @H`Kªe;6p46,iÃ‡7K—.·µª=vør&à
é¢Š‹‹c×~58Ù0NuëÖÍ6ÌÇŽ@²a©w©&0qâDÓ£G_‘³SÍR�÷K€ÔÂ19r¤úE›¨ÚÐQÐU<ìþÃÝI.­!>!2 „×V]h¬�AnÃ?)�”“5Åd^‹Eþ½÷Þ3ãÇ�7r³NæÇ¹W¨–,YâÎ�~ùeàÌ¨qF¡¶‹ÀN	ðÝþá‡šÏ?ÿ|§ŸÑD _2^ Ï?ÿ¼ÒRçkbp_æ1t t&t't(IHd 	lIµ[í+!Ù`òåŒ·Ž„;Xq¬�	—ˆÑ
ÇÑKO›Ù="0‚%" Ûàãý÷ß÷±pÞ¾bý&ž0w�1Âåw'8 DJÈ¸ÿ£« ³t&t't(IHd 	l©j‰`Ø�…	—ÉWÇ J‘Mù�|!cmå|µ¾�Sþ0D¼ûxªdžÕˆ7UÍ�œ ]ÖÐ¡CÍÜ¹ssz_ÝLªJ€ã†dX½zuU/ÕçN ÝÅÓZ�IÑÿC~fd °­~ž-X²V¹µ�v|%" �9sæ˜·ß~[.yzbA`À€nÓâ1Ã¥Fæˆ ßëÇ¶nÕfWŽ�ë6Y µÆ*ÅtÉ`‚/C7a.ó°û�®„Î„î$	‘€ !Â-©z‹}gËø ·Âú:nÜ8e
2×¯_¿Þ|ðÁfÚ´iZ8&`<ÓÐ…U«V¹g–¼ÒcŠŠŠL¿~ýdØ×Ã……….½«¼Qc3d¡7÷tt‚®„Î„î$	‘€ !Â-U5Ö¬Ñ¥~ÏêG,kì¢yJ±‘UtQ4à6Ú½{wƒ¢1jE%	°{Äygv’$"�v¸ÌC"q!@ªáQ£F9…O^+qµpÛ‰N‚nâa÷Ÿ†¢+¡3IB& @È€KªÇ,6Ñ–•AnÇ?†™3gj×7È˜_Ë0JÔŒ3|�·Š95?.Ø) M�2ÄeÄÔÎ°dRfq”K"q"@f²é8WœF-œ¶bB'A7ñ` @GBWòâJN�“S« ¹KB¦~an-�„›C†q©µU¤‹cK€/ß·ÞzËàR-�¸Èìzz
·î«½"ààÃ™Yí¢ê�ˆ‚ºâ¹òÅ_h"nƒç¹½¬GÑIÐM<:º’ÒLx€YQ2 TDÈßß§ÛªFø¨®W¯^n÷×G]ª#^øâe•|Ñ[¶èˆT¼FO­…ÀòåËÝ‚A;ŸzÒJ`Íš5¦ÿþfòdR]KD ~8ïÝ£Gm@ÆM  @ IDATC<"Iz	à‰ŠNâIÐ‘Ð•$9  @ —Ü‚íZ¾í—¹%.6S¦Lq–W\Á%é"€Û(®w, %"Wœ!3fL\›¯v‹@ S§NuF\ÅÂ„Qç‘ Š?F,âIÒI /tîÿèFèHrmÍÑã$@Ž@—Üfš}póæÍ.Ë‚rÛzÝ-¯p�>}º¶‚'€DâJ€”Að�ˆ@Ú|öÙgfÒ$¥¹NÛ¸'©¿(|Ìã¤ÔfT’F¶ò}Aá(:‰A7BG’äˆ€ 9]r›öu¨-�þrvP�´r;xù¾gþ±¸KiÊ÷Hèþ>Œ=Ú(% ’ª#NX4Ëø§S[wF€5	Ùˆ�hg„’ý>:ºˆA'B7BG’äˆ€ 9]r›Õö³aÐÛÎ›7Ï�Ôù« $ãs}qq±3 èì|ÆL-Ý9Ü1(àÎé/É#0~üxï“7¬©ì;¿<Ï³fÍRL¢”=èÄ0Añ èDèFèH’� G KÝ/‰IçéŸ¯Tóôc	 ôsÖ
·Q)LQ!µ©ª–-[æÎAëiUÉéóq%À<NyïÅuÕîïX¹r¥éÛ·¯áU’èè ž�Hîÿž`V¶ *KÊßç
lUŸÙ²!h•œ½!˜�v„ƒ’Œþõ+V¬piwtÖ.úc¥Vž ó×¸q�³£Vþ†ú¤ä‘ g¦Ù5Û°!ð×{¡[‹À·Hüá‡<%é €ÎÁw7:ˆa2D'*ðP—ª¨ ª ËÓG7Úz¦Ú2;h}äßdñ¬‰7(Éè_OôÒÿÉØý±R+O`öìÙfÂ„	>"Wþ¦ú¤ä‰ÀÄ‰Ï¼D’B€c x&’ÖUÞ‰IÕòû�Î�î�âA˜Ñ‰Ð�$9$ @a—ºU�ýy@©ß³þ×+Ð’ä`·hÚ´iÎâê!ÕJrA©g±#@6b�SZ"I&€¢Dð?òfKD Ix¶Ù P0À$�êÎû‚Î�îáIÐ…
<Õ¥jª@@€*ÀòøÑ…¶.ÏNæÎ‚‚3…r)ô8:«jÑ¢E†´QÊ±�Qs¼ µ%;£H2�¹sç9c—R¸&y”ÓÙ7 d(ò´#œNˆ1é5º:º‡ABB'’ä˜€ 9^r»¯íë—¶�÷2��žFvÑ$É$PXXh ÷ÿdoê{…€HÒH2�‰'˜¹sç&¹‹ê[J	à™¨c é|ttt‚„.„N$É1 r¼ÔíX	)õ{Ö?’J‹ó8rÏad/dLY48Jçë";LjX ‘Â-Zî£ êÒÈÀËEY{"?Lj`–ð@9”‡K– cpëQttO‚$«¨'˜U­F€ªó÷ùå¶ª¶>üº|ùr3räH³`Á­SM‘ @ª4¢­òå*�¤ÀÈ¥ÔhI]õ‹,.(GJ•¦g!©X£°3,CnRGØ8]�Ãƒ û y©ÌC{RW… ùr¢}bË¶ Í  ‹ÜhƒRŒÞõœÿ;vlô¦‰€GDFW �@UU¤pÌEúH‰ã™@æ8*âå�ênDªCÇ@×ð è<è>Šˆêf¶UÈ �-9?×áúÂ?Aà¤Àìc™[»v­Ÿ–©–HX¸p¡ùüóÏ#Ñ5BÂ"@
)žss	‹°êÍ'�/¾øÂ0—KD ÉÈq®õë×'¹›©ìº:º†AçA÷‘û¿˜ÙV!@¶äü\·ÉV3Ù–qA«ÃâÊ¹�gs‚6I×$€E�3£‹/X“.�h`þBAR:Àh�“ZWu<Û äPuvº"^X³�²˜#/’dÈèž¼;ÐyÐ}Ð�$y" @žÀ—ºí<ûso[òÆ5çÓO?U´øRpãü#_¢³fÍòm5Î(Ôöà¸ž HÎËò\+�k’FU})‹À–-[œ'±‹$É!À¸¢[xrÿG×AçA÷‘ä‘€ y„_rë•ö•H˜�·y	0„íÌ™3óß+µ 0ŽËÀUALpvƒ—D’B€Ý2â[(?zRFTý(� Š";ÅÌå’ä`Šná)ˆ)º:º�$�d È#üR·æÌ`[çÂ$ëÐ¡CKU­ãJ`éÒ¥Î�.®íW»E *p‘V&€ªÓg£N  g¢™Ë%"�ãb.W<—äŒ6:º…AÇA×ÑÙ0ƒV!@P‚~®/²Õ|dKà`€L¼Ð¹q?ã’×Zp‰&z´DÒ@€ C¸J+€TF;}Üöõ64Kq\Ò1Þê¥qGPIëºzõjáH æ.t
O1LÐqÐuÐy$y& @ž äöœ‰™háÞ·”¼—ÕVWRu­S_›6mrÑ6llŠ/µ<u8ö"e)uÃžØoÛºÍ Ô3�Ø!VÇÊ PXX(@\âøº:…�ttt�À1ÏâÈ2jm– :#²À6…À�5>Î~öÙg%ROkÖ¬q OWã	A­Nv�ð|‘ˆ@¬\±Ò�ÿ':ºDÒB@€dŒ4:º:…A·AÇA×‘D€€ „’&pH°�-�ÿ9p¡5j”™8C›$Ž¶2þü86]m�¬	àÀâQ"I P´ È`Ì•ˆ@š4Ž¹\oèèžŽå¡Û ã( JD "2¶l`fëkËF[É„	ÌÇ¬r�(æïbR ä¯º³ä� ÁÒ8?*�¸À{kÞ¼y2 Ä} Õþ*`Wæ‹*c‹Ôx-¡CàþïAÐiÐmÐqäå¨�*d ðAÑ_˜L{Ú8=
$gw”FÎßàä²&< ´šKâºW` �çKFBmJ ÀÂ…Íºuë‚V¥ëE VØ1f.÷pn<VýNRcÑÐ!<¥þC§A·‘[H„ "4¶)É˜bËh[[É&Ožl>ýôS[•$n˜t‹Š(5nã¦ö#@i¦ñ*�8À @<Oî³qF¡¶§�À²eËôìÇxÜÑÐ!<º:º�¾Ø= õU… ¾Hú«g‰­ª«-�·ØAî×¯ŸÛ…ð×<Õ6¬æxpèìhØ¤U	ðÜ{Úuˆb÷Ô¦À›EóxŠ\]ý†  2~}ƒ#V?à¹„îàÉ]�ÝF!2 Dh0JšÂY™a¶N•ÁÎïôíËÑI\�ú�/O‰¤‘ .Óx(FG?9}æûÀÆ��Cú$Šz’ÅÅÅ:þÓÑFg@wð�½$“â�FaÄž "6 %Í!V[Vm<þ™µ£”dî®GÂ@"i$Àó/XG>Y}æ9æ{W†¬d�«zS9ò ¨§¨}Š9�ÁÓî?Ytåö�Ú@ÛöÈ ÁA±M"oÐ¶Ì²åk[²ÎÒŽ=Ú2$ë:tan	à6·jÕªÜÞTw�ˆÀFŠSDCÍÈš s¸bYd�OÆœ i ™Ë%ñ"€®€ÎàaîBwA‡A—Q.Ô>2 DpPl“¶ÙR`¾û«m	$sæÌ1~ø¡Y»vm ztqnlÚ´É¬^xØsÓXÝE<ÀeZ0ÏPU]Î	pößÃ":çíÖEÀŒ¸:þâƒdîê@G@W@gð ,bÑa
lA§‘DŒ€ �RÍ!Zæ'¶v�Á
;vìX3aÂ„RÕëÇ¨àK“‰X®£Q!µ+L˜žÿ0)«î°	0‡Ë 6eÕU2 DudvÞ.ttOžè.è0è2’� ‚ƒRÒ$,fhìcmÙTò^Ö/äôìÚµ«¢²fM0w2ùÊ w¼u§hàùgñ(�¸ÀxÅ¾y31°$"�>J¯1çè):º‚AgAwA‡Ñî¿ aT!@TýÕ¹ÞVõ®-�½ 8�Õ¿_y=ýõP5í@€P¥ŽÚ‹ÞH	�Ì y ¤dÀÚMy $t`Õ­JÀ ¦# •B‰Mž<Ùéè
�ÝFQ2 Dt`Jš…ëé3¦Û²µä½¬_ŠŠŠLŸ>}ä–˜5ÁÜ\ˆÛ¨¾8sÃZw‰=ÿÑµ¨ê0änÛ¦Í¯ª“ÓI €WG`â1’Œº:‚AWAgAw‘û¿ aU!@XdýÕ‹9®»-‹ƒVIZ–�?þØÌ�;7hUº>Dä^Õgˆ€Uu¤	ðüËu:ÒC¤ÆU‚ s¸ • ¥�$–€Ö1ñZttOéwÑUÐY¼¸Äƒ`<[)@ôÇ�³4ÿ³eª-�·fÌ˜azôè!3ÂãÎ¢Q
P„HM•  vO%"g(?:ÆçTÛƒ`.—D› ó:º�AGAWAgÑ—¸ aV!@˜týÕ½ÐVÕÓ–â U›ž={º4Zœ¥ÎõÚ‡«j�$2 Äc¬ÔÊ²	ðÝŠW eóÑ»é  #X´Ç™yŠ”èè„JÐUÐY$' @Ä¨¤yXÒ>²e¶-_—¼—õËìÙ³Ý?üºuë²®C†G€E£,çáñUÍÑ&Àó¯…c´ÇH­«˜ s¸ŒìsÒ'’K€¹\ÿÑ_t ”t‚nBEè*Úý÷ 4ì*d ›°ŸúùÇšc95W­rÁ‚æÍ7ßt–¿ uézÿvÝuWC‘ˆ@	ðìï¾ûîf—]vIc÷Õç„à9Ö3œ�ÁT7²" ÿ�¬°åì"vÿÑÐ	<º	:
º
:‹$â¤eD|€J5�hšÖ˜Uê½¬~Ä"KÐ�nÝºyd…0Ô‹øÒÜc�=B½‡*�¨@ù¯^½zT›§v‰@…Pü™Ã™Ë%"�V2äFwäYû£ xòÒ@7éa‹"ÿGwØ·k™¾�¶Ãù_¦Ù±emÐ–.[¶ÌtíÚÕ­J×{&°Ûn»É à™©ª‹=ÿñ+µtçd Ø9ý%˜Ë%Ñ$ÀÚ ]Àƒ “ › P2 Äd Jš¹Ù¾baó’Ç�œŸ½zõ26lˆ…„·–/ÍjÕª%¼—êž”M@€²¹èÝxÐîg¼ÆK­õO@ ÿL}ÔÈšŸµ?:€'A'A7AG‘Ä„€ 1¨RÍeÆÒ¶ºÔ{Yý¸bÅ
óÆo˜‚‚E+ÎŠ`8É:®ª5xþkÖ¬�Æª•"°c‘´8z;ñ8þ¢�Œè3�Yó³öGð è"è$è&’� FƒUÒT¶ë»Ú8i'ç~æÍ›ç,�+W®Œ‰„¶˜/Í½öÚ+¡½S·D |<ÿµjÕR µò1é¯'°çž{Ê ñ1RóÂ#ÀF€ðøf[3k}vÿYû{:û�.‚N"Wâl%O×É �'ðnKtÍá¶`mÛ w)ÀW^yÅÌš8¶`Ð¦èú5jÔp
�€ˆ@	ðüï³Ï>iìºúœÄˆ…7‹DÒH`¿ýö3Ìå’h`­ÏšßÓî?:º:‰"ÿGk¨+l� "Šä¸ÑÍ–éA[G®â™3gº\ Ë—/Z�®÷@ ×Ñ½÷Þ[; XªŠøàùÇ  jñ;µø[ ”Íå[ú)]öß "6ä¬ñ{öìéÖü¬ý=:ºHàÀäÚ¢*ªH@€*‹ÐÇ9s3Ò–ÀA76mÚär�NŸØž!<ñm

�Ž ÄwüÔò`2€`µèjÈ/y ä—¿îž_q™Ë%Ñ!ÀÿÍ7ß4¬ù=º:ºˆ$†d ˆá •4y½}ýÄ–‚’ß³~áÑ@ûôécV­Z•u=ºÐ¾4ñ �ˆ@	džy ¤qô“Óg ’3–êIÕ	Ô®][€ªcí
Öö¬ñYë{:û_`‹‚."‰! b8h¥šÜ×þŒ.p, ,‚D�:uª2”œ�	…ûœDÒH ï—8 �]WŸD€ç%H"i$À®l.Ñy"ÿ³¶g�ïi÷�ÝDS2 ÄtàJšM�ž¶LÚ,‚³gÏ6Ýºu3K—.Z�®@€/M  Ô¥±&€¬nÝºŠëQTã	 Ø¤I�ƒÖ£�JÌá:Ê�¡gMÏÚž5¾§Ýtt/y£A)}­� þcÞÏva°-�clÙ²ÅtïÞÝLž<Y^ y|.ÈŸ»ï¾û*@Ç@·Î D�–ˆ@œ	p„€” 8�¢Úžž}y dCÎÿ5ìþ³¦gmÏßƒ k s {HbL@€^IÓ	Ý�Î” ]Á28wî\g)\¼xqÐêt} ¸Ž6hÐ @ºTâG€¨éìí¶Ûnñk¼Z,ß!P¿~}ƒAK"i# 4€ÑqÖòìþ³¶÷´û�®�Î¡´aÑâ¬[!@Öè"u!Q8ù‡`óæÍÎR8zôhã)MH¤@Å¥1 š7o—æª�"à… ‹F=÷^Pª’<`´qãÆò Èó8èö¹'P­Z5rs�}‡;²ãÏZžÝÖö]C‘ÿ=ÀÌw2 ä{üÜµ­æ¶x‰@”PR…,\¸ÐOëTK•	p@ŠP•±é‚˜¨S§Žžû˜�¡šÿ0 4mÚT =©#ÀÚE�\ó?ì¬áYË{Œü�Ž�®�Î!‰9 b>€¥š?Æþ<Ð–5¥ÞËúÇ~ýú™‘#GúŠšu;Òz!9tÙ=b)�´ÀðÕ°aÃ´tWýL8�F�é@ÂÇXÝÛ‘@Ë–-•cG,9}‡hÿ£F�2¬å=	ºÅ@[Ð5$	  @±¤üs~hÁ9Kqq±yõÕWÍüùó×¥
ªN c ðtf«êÐ"�}‘ àuËPdZÄ¶�ˆ@Z´hÑB€<6kwÖð¬å=	º:º†$d HÀ –êÂ(ûó¶,+õ^Ö?0ÀYW¯–·OÖ³¼�3t(BŠ �%@]KÄ PðËX�]R¶k×Îp´E"i!ÀÑ61$ù!Àš��Öðž�ÝC’2 $d Kº±Á¾·ÅË?éš5kL×®]ÍôéÓ“E)&½á]³fÍbÒZ5S‚¨Q£†;öR½zõ`éjˆŽpµjÕJ€ˆŒ‡š>žym^„Ï¹¼;°fgíÎÞ“ S [ cHB@€„d©n|aîeËÊRïeõ#îçX{÷îmä�Â@‘íÐCT‡.�¸ gz‡âÒ\µS*$€2Ô¾}{½Âë"så ¥rÍÏ`²VgÍÎÚÝÓRt	t
tI‚È � Á,é
¹>ÚâÅ÷‡	Kâ¸qãJª×K®ì¿ÿþ¦mÛ¶¹º�î#y%@À4=ïyÝÜ3¢Ö­[+"ºg®ª.šPú�;î8ãÊãð°VgÍîIù§'èmñ’GÐÖ#‰ "2ž›�Ï>¹:½øÿL˜0Áôïßß¬X±Âs3U]y8CÇ ‘H:Îÿã �$  Æ-âHD ÉxÆ>ø`Ã3/É=Öè¬ÕY³{tt	�ö4JÕÈ ¥Ñð×–-¶*"vzËÿÑ­[7óùçŸ›mÛ¶ùk¥j*— _¦ ð�ˆ@’	ð¬£ü×¯_?ÉÝTßRJà°ÃsF€”v_ÝN	�]wÝÕ 0æJrK€µ9ktÖê]�B’02 $l@Kug²ý™™`A©÷²þqÊ”)æý÷ß73fÌÈº]Xu(EG}tÕ/Ô"#œ=üðÃ�Ò¥ÅhÐÔÔJ8ä�C\€ËJ_ Š@	�í‚c\Ê^”ûÁcmÎ�µº'Aw@‡@—�$�€ 	Ô’.±Uÿ™-üÞ¶ç<Ñ{ï½ç‚‹lÜ¸±äz	› ;¢�:u
û6ª_òJ eË–
x™×ÐÍÃ$€R¤ã-aVÝù&�9ÿ_¯^½|7%u÷gMNà?ÖèžÎþ£3 ; CÖR7 1é° 1¨,›Y`¯ûŸ-ó²¼~»ËŠ‹‹Íÿþ÷?Ÿç‹¶«_¿ìH€³t,«U«¶ãõŽ$„ ÊÑA”�Þ¨"°=\¢I¸çž{nÿý&	!À1®#�<Ò»H’[œùgmÎÝ“ 3 ;xªOÕD�€ ÏMkë{Ç–­AëÅ²H€‘ž={*-`P˜•¼«:ÇvíÚÎ×ID ijÖ¬iÚ´i£\éIXõg;Gu”ÁÓE"I$À<Þ±cG¹ÿçxpIûÇšœµ¹§ÝtttI‚	H£Hðà–tm±}%‡ç$]Ýºu«éÕ«—ùì³ÏÐÐJÔÑ¸qcsÆgè|t%Xé#ñ#€qëˆ#Žˆ_ÃÕb¨6oÞ¼
Wè£"d*ÂˆËf…6*r7fþc-Îšœµ¹'AW@g@w�$˜€ 	ÜR]ãú][¼äñœ4i’ùàƒÌìÙ³KÝB?†E€8 'žx¢Ž„Xõæ• ®ÿ:tÈkts› »ÿ<ë
t6iÕŸk¸ÿŸ~úéÊX”cð¬ÁY‹³&÷$èè
Þ*ôÔ.U B€Á*WÙ6õ·eˆ¯¶qÞˆt#[¶(;ˆ/¦;«×ºöíÛ›<pgÑû"K(CÄ¸ OºD’L€ã\Ç¼{Þ“ÜOõ-}X£{ì±:ÿŸÃ¡gíÍœµ¸GAG@W@g�$œ€ 	àRÝ›`þ¯-ËK½—õ�EEEÎíhÄˆY×¡+O€ÈºßûÞ÷´{Tydúd`Øbá(·Ñ–š˜ q 0xID )0â’æ’£\xHrC€µ7®ÿ¬Å=	ºÁË¶LôTŸª‰8 ">@›·ÁÖ5Ü¬{_û¨wäÈ‘.íÈúõë}T§:Ê!P»vm·{T½zõr>¥?‰@¼´nÝZéÿâ5djm -Z´0<ó2x€¨K#E`¯½ö2çœsŽ‚¸æpTXs“ò�5¸'A'@7f‹ôž F½ ¢>B~Û7×VÇùž%>ªÝ¼y³4h�0`€�êTG9°¬³[Š•�€;ˆ;�Zµj9å_îÿqIµ¿²Püñxa.—ˆ@�ö� ÅlRHrC€57koÖàž� Ý A’2 ¤d KºÉlÁŸ÷mñ2tÊ”)æ­·Þ2óæÍ+¹…^Â"@6€sÏ=WÁ Ã¬zsJ wè“N:In£9¥®›å›À1ÇãÒ¥å»º¿%P­Z5ç™ÈÆ„‚[¥Y¹ëYk³æfííIÐÐ	Ð¼Y<µMÕ„H@€áF´ê¯l»°ôM·e[Ð6b�üôÓO]0R’HÂ#°÷Þ{›SO=ÕpG"q'@ê?Œ H²ºyä‘f¿ýöKS·Õ×`M‚û?¯’ð	°Æ&ðknO»ÿ,ÚÑÐ	Ð$)" @Š»¤«üÃO¶åu[Ö•¼èeñâÅæ“O>1£G�T�..Ÿ î£d8å”SL�5Êÿ°þ*&Ð¤Iƒ ÷Q‰¤‰ G¸:wîìŽs¥©ßêkò`ÌâYÖînÆ–56kmÖÜž ] �@;xž Æ¥ â2R~ÛÉyŸî¶¶%ðQ ¬’C†1¯¼òŠYµJÙCüÕöµ‘à’K.Ñy»í±è·˜8î¸ã®ÐH#Œ_x�P"q$@ð?Ž$6kÖLq‰r0€¬­Yc³ÖöämËÚ ]ÀK\°`Ð-<�À#ÌUEÄÏY¶üÇ/ÿøkÖ¬1½{÷viIbÄ!vMÝsÏ=Í‰'žè�J¹»áSƒ-�}÷Ý×�ý'"ºDÒH å‰´®;vLc÷Õç¨S§ŽùÑ�~dX“HÂ'@Ê?ÖØ¬µ=	kt t/™Á<µKÕäˆ€ 9ÁÛl²mjËÿlñøƒà$]»v5³gÏŽ`w“Ñ$ÜG8à óƒü@çî’1¤©ëçþ�?þxÿKÝÈ«Ã¥	œpÂ	îÿ ô{úYâ@€8D'Ÿ|²iÛ¶­RZæ`ÀXS³¶öl›5?kt tI
	È �ÂA/Õe,€œÿ™cKàó?[·n5ƒvJ·lÙRê6úÑ'ÎÛ�vÚiæ ƒ’ë�O°ª+tÕ«W7¸ÿ|ðÁ¡ßK7�(À�‹7WË–-£ÜLµMv @ Ë‹/¾XGw ãÿÖÒDýgmÍÛƒ°ÖgÍÏÚß‹°‡6©Š<� Ð#tKf“q¶à´ÌG»–-[fºwïnúõëç£:ÕQ¼ 8wwÑEÉ >z+ºPx”É"ºã£–å– i0	ê*�¸  1»ÿÄpÑ1ÄðG�µ4kjÖÖž„ŠXó³ö÷bQðÔ.U“c2 äxoGÔ¾®¶·ÅËQ€©S§º`%EEEìn2šÄNêùçŸïv�0HD ê8+úýïßEÿ�z[Õ>È�†:ƒY1$"x®üô§?uGãÐÞ8·‘54�ÿXS{Öø¬õYó+b·'¨q­F€¸Žœ¿vüc¾-/ÚâEc_·n�éÛ·¯yç�w|å*õ×Û„Ô„ÒÏ ¼ ”J-!ƒšðnpîŸ�#‚ JD@Œ;Â…GE"Q'ÀÆó8ž\JýîhmÞ¼Ù­¡YK³¦ö$¬ñYë³ægí/I1 R<ø¥ºŽP[Hâe¦!Oé›o¾i†ÇØ(	ƒ �x8‡wÈ!‡(�T€U§7D='b´Îþ{CªŠB€ã\gžy¦iÝºuBz¤n$•@ÝºuÍ/ùKC I¸X;³†f-íIXÛ³Æg­/×OPã\�’ÐÆyôü¶× …¶eK#[‡–/_î< Ž>úhS«V-¬³P}
^ ìþoÜ¸ÑŒ9Ò¬_¿ÞgõªK¼@Á¹üòËM£FL-�ÒP¨Hï5lØ0óõ×Ú˜+ÍF?Gƒ k¸sÏ=×\yå•†ÍI8øÿ_¸p¡yüñÇÍ€Œ§€Ú(ücmyÀ–ÂpZ®ZãF °’·«½;%ÀªƒƒFX½DÙ°aƒ8p ùàƒ?Kü¨V­š;W}Øa‡ÉÀ?^Õ� F*”›.¸@ÑÎ²ÔåÉ%@ 2»´oß>¹�TÏbM OÎþ×®];ÖýˆzãY+³ffíìqÝÌšžµ=k|Y£þä¨}ò Èè˜Ü†ô ólikK+[v·%�¬^½Ú,X°À  ò¢€u�pîp1<3_Èì­]»v‡ÏèÈ�]wÝÕ\rÉ%æ¿ø…iÐ A¾š¡ûŠ@ä	ì¿ÿþfÓ¦MfèÐ¡¾vý"ßg50ØýÿÉO~b.»ì2C I8Øý1b„yðÁÍôéÓ}y±ûÖÇ–'lYNËUk	È ÇQ·Íh�Km9Ò–À+v&´•+W:÷Æc�=VëB;”¬Æ�›É“'›‚‚-C`¬*³#Ð®];Ó¥Kg Üm7}ÝdGQW¥� nÕ(ZDüž3gNº¬>Æ€ ›¤ü»ýöÛMÓ¦Mµ‰â˜±YöÐC™!C†8c §[M±õ<hËd[´ûï	jªÑ€$Œ¢ß>pVh°-}mñ²�LÓO?ýÔ�Ï”È¦ÿHÍÃ.ë�è¿rÕ(Y bôøCÓ¡CEŒÎ‚Ÿ.I�¶mÛºÿeÊHßØGµÇxÃ…`Ãòào”X³Ff­ì1ê?kxÖò¬éø/¼á‹eÍÚ’‰å°…Þh&
Ò…°©-�Ís–iÑ¢EæÈ#�4õêÕ3ìZKüà‹/ ‚ÇLš4É§õØ_#USªuÔQææ›oÖÙÿT�º:„ ©ÕìÊÑ¹‰'šmÛ8•'�üÀk‹Ø·Þz«"ÿ‡8[·nuÿï÷ÝwŸ™1c†/×vûGÙr¿-_…Ø|US2 ÄtàrÐl‚†0�aKà¨/ +ÀŠ+LÇŽç%~	�8 æÎ�ëëKÄo#U[*`äÃõÿ”SNÑî*F\�ôE`¿ýö3õë×7£F�2_}¥u»/®ª§êHM‰÷¸ãŽÓîÕñUúŠÙ³g›‡~Ø4Èeuªô…å�hÿ³¥Ÿ-rý/ŸU*ÿ*@*‡½R�fÂ˜e>åml©nK !ÀÑ¬Y³œ%™ €
&çã@ÄõÝwßÝŒ7Î\vø�Þ��	àúÿ³ŸýÌüîw¿3(3�ÊÀ;Žÿ¾	ìªô®•g§Oú#P·n]ø�yœ9]bd½òÊ+æùçŸ÷Äyµmm[0 (W8CûZe ˆý†Ú�M¶v¶ :ØÒÜ–ÀG8çÄît§N�L‹-dU¶P}
F RJáFöÅ_\Ë$"�K‡z¨¹å–[tf4—Ðu¯DÀ›c.Á §M›¦£ ‰Ýèw×ÿsÏ=×\ýõ¦Q£FZ§…4dñ!ëÇý÷ßïŽÈzº›wÃmyÄ–[$"P& ÊÄ¢7KÀ @:ÀŽ¶ì[êý¬\µj•¡tîÜYG²¦¸ó‰&Ý¼ys— ¨¨H‹Ç�£Ò_<`±x×]w¹s£Ú5òWÕ¥Š Á×8J3räH³xñâTõ]�Í/�#Ž8ÂÜpÃæøã�—òâPàúOÊ?ŽûxŒ÷A*ïglùÈ¹þ‡8~q¯Z€¸�`øíÏheo…' Æ€@ÂDWXXhˆtLdÙ=÷Ü3P}ºxG¸ïíµ×^n‰Ô2› ÿÇ—]v™ùÍo~ãþ·Ã¾Ÿê�$À›‹ì.Ìã£G�v©t“Ü_õ-X;\qÅæ’K.1JÝÞ˜,]ºÔ¼üòËæÕW_5Éö$m=Ýl‘ë¿' I®F€$�®¿¾1©,·/€F¶>
@< Ü1 ´lÙR_4ªOá)\9_6~üx�#õ	Wuí@ eåØc�u�ÿð>áw‰ˆ@0@!ÃcŽà®J£Œ§®.Ÿ Y(.¸àóç?ÿYñ[ÊGè¯ü÷ïßß<ôÐC¦¸¸8P]¥.f³nœ-�Ù2£ÔûúQÊ$ @™XôfØFÞË–ƒlñÂÍš5nòÃÝWG)ePð_æ­Zµ2˜2eŠO³ ­Ò¥I$ÐÂÆó …Ñ¢µk”ÄVŸòE€´€ÕˆéRPP ì.ùˆ„ß—yûÂ/4üã¿%Ä±&#ë1¾/=§ú$h÷mÁ@ùCCÃ¤T-@RF2ü~0¡0Á`K'[ö°%�p å”³ÂdØ{ï½Õ§‹w$ SR²p$ø¢Çsf;ÞLï¤’ A'o¿ývóƒüÀB""à� †qÒæ6mÚÔÅX²d‰¿ÊU“X®›nºÉœtÒIBI8HíùÜsÏ™÷Þ{Ï§GÏzÛÚ×mù—-kÂi¹jM ’6¢áög�­ž£ mmiéãVD©'Êq‡L›6m´{èêwê §4çH‰»0oña$"à‡@­ZµÌ¯~õ+sÕUWéÜ¿¤ªEv €BÖ AÃÿÛàÁƒ}žÞá^z#}x¶ØùÿÑ�~äÒ§�@nzÌÑ×Þ½{»¨ÿxÀz”Ïl]·E®ÿ¡&½* ’>Âþû·ÔVIÔ>âìã£z pŠ£ |é(€ªßÖOv�vß}wçr¶bÅŠoÿ¨ŸD K19í´ÓÌm·Ýæž/ýßf	R—‰@%ðÿÆ÷#ß—S§N• Ìô‘Š	g‚À­—_~¹!ó„$¸þãò�ëÿ—_~éó&E¶²lùØå}öI6áuÉ �ð¡{L0slihY°u¸¨XGÛ·oïòóžÄ¾ä‰À ¾„Ö­Ã™C"Ù@éÔ©“ÛÉàU.£ÙqÔU"Px ´k×ÎÌ§OŸîÓ…¸*ÍÐgB€M¢ý“ò�8’ðÌœ9Óüýï7ü±ÁóÕ“àúÿ¶-ÿ´eµ§:UMJÈ �’�öÜM´G×³å`u3!Î˜1Ãà®Îq€5jø¨Vu”" Óƒ:Èe7nœâ”b£«F€ÿQv28/Ê"R"">¼lHŸË<ÎÑ9Åu	Ÿy’ï€Ëÿ�7ÞèÖ\òà
o¤ÉÆôÆo˜gŸ}Ö÷æKOÛêgl™^ëUsR	È �Ô‘¿_ 0 Gêø¸ œS'5 »ÕúBòAuû:
ˆé¢E‹œéöÕo"P1‚JâöÞyç)è_Å¸ô	ðN€ €p€K¸tÉR³íkýö9á’±…�ÿcŽ9FFÜÇ×ÿ�šGyÄ½öx+Îû£ü²Å›K�Çö©ªˆ� âáæ1áÚBjÀ£mñr€Ç«W¯6;vtù�m½Ïð²ÀÝoéÒ¥nÉsõª.Á6lhn½õVó‹_üÂ$KpWÕ5ˆ,ŽÜ`ˆkØ ¡™9k¦Y¸padÛª†E� ñ–n¾ùfsöÙg»,LÑkarZD¼Ž‡~Ø:Ôg§ðÂ}Î"ÿ¯õY±êJ Ò3Öaôt£­ô+[šØrˆ¯àÀ™õ–-[ºôG¾êU=ÿG ÏŠF�™6w;GŽ^HD "déøÓŸþd.½ôR‹ª–þ.!àèM«–­Lã&�]^q¼º$"P�£Ž:Ê)ÿßÿþ÷åÁU¬€Ÿ5k–yé¥—Ì;ï¼ã;^GÛ´§m!  D²" @VØtQ)¤Üd‰	X6oÞl˜R§Nsøá‡ŽIü`	# eÁ‚föìÙ~o ÚE€,×_½Sþq?–ˆ€äŸ F ¹|WN˜0Á,[¶,ÿ�R"K€ Ëìü_xá….5pdš€†hùõ×_wçþ—/g™ìM&ÛšþaËp[¾öV«*J R7äÞ;Ì„@M[Ž´ÅKô¾µk×ºóRx°ó¨x –¬gÉ7nì<æÌ!¹ƒD¶'€Ûÿµ×^k~ýë_+CÇöhô›ä� F€Œ·A¿úŠ¯c‰lO€À‘qüãbIÂ#À¹ÿO>ùÄ<þøãÆóºŠÎÿ¶¥«-d �ˆ@Öd È�.,E`ƒýy�-ûÙ‚À‹,^¼Ø`9ÅjÍNµÄ?�œ%e‰…#.kÈ Vnÿ¿ýío“#E¯"1™ã{²I“&Î{N1"6@yl›'xR2�ÿüç?7ûì³O[“Ž[“e‰ Ã‡³IïU^³µa PÐ¯XÓY™ é÷0z�er•-¤lìë¸§s uëÖŠàêwêÙm·ÝÜÂO x{¶Xçnú5.ØU¼îºëÌ/ùKS¯ž—Ó=qéºÚ)±#€1÷Àtÿ«reˆÝ†Ò`ÎüßtÓMæ¢‹.Rì–Po_)ÿ{ÿùÏL·nÝ|Ÿûeïô¤-ã·¿£~�ìÈ �7]U6�Åöí-¶t¶¥VÙ©Ú»ÄÀ­%+vÍšœ4�ø& _Îyã	@nÛ¦ÔR¾9Ç¥>Òp’šhÿuëÖ�K³ÕNH5Œ ¸z“êµhA‘YP´ÀàŽ,I'RýÝrË-îÌ­Z^–déYÉ^ã±úÜsÏ™×^{Íy¯Vò²Ê|Œs=OØÒÛ–Í•¹@Ÿ�ŠÈ P!ý½*˜˜ˆJÊ3ŽìnK`Y³f�)((py�IÈÙu‰8Ð¡Cg¹þòË/Í¦MÄw”¤‰ ÿc·Ýv›ùéOjöÝwß4u]}�Ø`ÇÐòÀ–fÕªUÎ€¾evyIZp$äüóÏwgþÏ;ï<—U)-}ÏW?ù{óÍ7ÍÓO?íâWylÙ¶^´å¿¶ài+/d ð‚Q•”"@NRÎ'5°Å[jÀ•+Wº3êìLâš,	‡ ÆÜ½;ì0ghÁ�Œ$ù8jsæ™g~³c´çž{&¿Óê¡$� F ¾'Û¶mkˆFN–—�Ñ#$I'€—äe—]æÜþ�?þxƒWˆ$|ýû÷7�=ö˜™:uªï›u·õ_©š|“My}2 ¤ü©ûX)Ññ8À×=–.]ê²p@;“¾¨–]|É¾€ö’ä`ÑxÚi§™n¸ÁœuÖYÚ1JîP«g)"ÀQ Žvq¬«°°ÐRÔýÔu•ïí‹/¾ØÍã‡z¨¼%sôpLõ™gž1}ûö5[·nõy×/me�ÙÂù¯ûl¤êŠ' â9nQo5Õ¢’Fm_½¤db-**rÊ	_nŠîcP»vmC !ò¾“‘aþüùáÞPµç… iþÅYÑ“O>Y‹Æ¼Œ‚n*áàÿ›c]xôÌ›7Ï÷Ùäp­Z«L€@Éìüß|óÍîH•+ÐYX¶l™yá…Ìo¼áŽÜdUIÙ±‘ö7[zØ²®ì�è]Èž€ Ù³Ó•åÀß°Ð–ú¶j‹—ƒûk×®uŠ(mpS—{›%¢T¯^Ý`lÁ�”]$Œ f”$ƒ c{õÕW›«®ºÊrˆ·;É€£^ˆ@B`ÄíÔ©“;ÞEv€%K–øÞ©L©øuƒ5ÐI'�äÒüýîw¿3õë³ä’ä‚À†Ì«¯¾jþýï;�÷$hÇÛ¶<cK±ÇzU•|C@€oPè‡�p¥-‡ÛBL€]l	,DZ-..v»ä)—„K€¸ ¤—b‡ö	à\©$¾jÔ¨áò†ÿùÏ6¿úÕ¯´hŒïPªå"P)sñ¨S§ŽY±b…óêR\€J¡‹ì‡öÚk/sÂ	'¸Œ-¸þË+2·C5lØ0óè£�š)S¦ø¼1i;&Øò¨-}V¬ºD 4 JÓÐÏaXf+]bË¶ìçë‹-2¸^±«qÀÞÂøj^âêÙe—]\j),28@\ ¥
ŒßP7jÔÈEˆ¾õÖ[Í\à\ƒã×µXD ª0æðÈ#�tG}ˆ@€]Iü°ùA¦–Ûo¿Ýì�À�’Ü KÒý÷ßoä;ÕæÛ‹ûmd‹Ò0ånHSw'Í©òœw˜	ŒÔ€ìþc¨iK`!·1ñ HSGPÀ½÷&ó $Là|ôÑG›-Z¸ì xbà'‰>\E>ø`síµ×º#vu„&úã¦Š€OêÖ­kŽ9æçùƒ7 EÞ >)‡W)þ»?ýéOæºë®3SIî,X°À<ùä“¦{÷î¾×?l˜ýÃ–wl‘e.wCšÊ;É �ÊaÏy§ÑgÙÒÄ–ö¶xÉKƒòÏ‚ ·fIøPÉ3}ÜqÇ9OŠ¼ÂgŸí7nì¢üÿõ¯uQ¢‰�AG""�N|_„yƒ:^]$Ñ$À?Êþ9çœcºtéâ¼¸äòŸû±â„ˆÿýóœ‰¸YïÛò¤-‹sß3Ý1md HÛˆç¯¿¤D[?Ì–F¶x1Y˜O ÜšÛ·o/786‚òH– ¼H3ÅâqÕªUfýúõ¹¸½îQIì»áŠ+®p»þÊxO"" o€Î�;;o â»ð�*o€h=(úŒ»þüã]Š^¹üç~Œ€Ì®ÿÓO?mHýçQúGª¿{m™î±^U%;% ÀNÑè!À½i¶-mñ�Ýg&ãvíÚ9¹v6C¹2ª„3Ê$gJÉ!O,Æ¹2”,‡o16ìúŸ}öÙæ¾ûî3?úÑ�œÛ¯\Es8º•Ä„ 
&Y@ˆñ‚g 1vÈ¸ã9§yLhD§™Œx˜¿ïºë.sæ™gºcxZãä~Œðp<x°¹÷Þ{ÃúG°¿.¶Œ±…4Ú�€ ¡#ÖJ`b[`yäˆ°�-^„»Ð¤ä|£¾ ½`­T%(•¸”uÔQæˆ#ŽpÊ?Þ Z@V
Ÿ÷‘ò‹±¸ñÆÝn†1íú{Ç¬
E QØQ®W¯ž9öØcÝÑ <0æ’ñ…#’Ü`,XÇ`À½óÎ;Íe—]æ<í´ëŸ»1(}'”"ýcL2dˆïÿ<c·åC[8 �œ� '˜u“R0à;… ñ ªÛXX �# Jè~ûyK8¸mi©€ÅIƒÜ.RÇŽ¿	ˆ7€â„ÿÔªUË¥k$ô_þòsâ‰'ºc2†…Ï^w�¤ÀXØ¬Y3—[¾I“&îœ3Æ {„™«9Z‡wÿ?üá.u#šÇÃç¿³;8å¿oß¾¾ÿVÛ{ðï9[øY"9# @ÎPëF¥pP|†-ÛÒÂ/Ï!ççÍ›ç2�æˆ¹’ÜÀ`Ï=÷tŠèÉ'ŸìŽeà	ÀNAeð?<çœóg—è¶Ûn3^x¡‹‰¡ÿþY«FHŒ¹ûì³�S>3Ç»ð²Ã˜+C€ÿ' £øc8¿úê«ÍM7ÝdN=õTƒ7—Žmùç]•ÙTzüñÇÍ»ï¾ë;e&ž°l¹Û2eID §¼(^9m±n–„žoK[
è%$9F€9sæ¸\õœiTf K6Â¢…$îç§Ÿ~ºK?‡+)† Î•êli°AaÁ_Òú]rÉ%.ôE]dZ´haªW÷âT¬�ºZD ö0"Ö©SÇtêÔÉ¹£3¿,Y²Ä{•gWðáÅÐÂñ9‚³^yå•ææ›o6g�u–ó¤“78ß 5°^yñÅÍ/¼à;âÿ6Û¶±¶ÜmË[tÆÆB�ä–€ ¹å­»}K€	¯Ø–µ¶t²Å›Ï>;Î³gÏ6¸/@GçŸ-Ý<	\1œrÊ).`àš5kÌÂ…�7€Î–Vm`PüQðYˆg\ýøÃºà—¼/7ÑªñÔ§E@*&°Ç{¸ ¯ÄØ9ãŒ3œ‡Qéô¯šÇ+fXúÈÙœ sŠ?G¶ð×°aC—Z·ôgõs~°NéÕ«—ÛýÏ¤›öØ’[×£¶ôµO ‰äœ€ 9G®–"@ê“y¶ð[jÚâEB7uêTç}à�*= ªÙW’1´jÕÊ�-%N^ ¤�âX€<Êg?Œ,À¯ºê*sÃ7˜sÏ=×)þ¼/Å¿|~ú«ˆ@pìJ_'ãÙÕ¡C$pùòån×¯òcHáˆÆpÎø_{íµÎCŽŒ-üMx·ôë×Ïe^˜5k–ï dÃzÙ–ÿÚBzl‰ä…€·ë¼´\7M�Æ¶3Ûr±-ÞŒ  :æ˜cÌSO=å^u–"ÑŽj üÏ˜1Ãôïßß|ôÑGfæÌ™.N _¾ãÎ~â½Â9Ð£�>Ú\pÁî9nÚ´©sÿ#È'�õë×;o®	&¤õéÓÇ™M›7É¨[20oñÎbw÷~b*` çwŒ’hÀˆ5räHsýõ×»WÏ­#þÕû¶Üf‹Îý{†«êªF@€ªñÒ§Ã#p˜­úŸ¶œ`Ë®¾nÃŽ;¥O>ù¤9è ƒ|U«z<Àu”sv¸Ø�?Þ- ?üðC÷ž§[Ä²vô‰aAþgb(à9qÀ(¦E,GS��dÀhË<^`£¥:Ô0‡�1Â¥‚MvÏËï
þ	'œ`Î;ï<CP\Ž%âA¡Ýþò¹åó¯lDàa÷ñÇ›-[pRõ&œûjËl™è­VU$Y� KpºÌ;üß~`Ë�¶`ð&Ù¹âŠ+œE—4u’h Õ†€iÓ¦™É“';ë;9wW®\Í{n*¸Ö²P$‹E›6mœâ_¿~}�õÌZÕ‰€„C€ �dãa=z´+w‰Í“Aéç¨iXÙéoÛ¶­K«ˆWmx%²YôüóÏ‡±î@é¿×–l‘›c´…T´N€Tsl:YÃ¶ôW¶t±¥™ÏVãnGz�k®¹ÆE5öY·êòO€Ý$rD`âÄ‰fÒ¤IfÔ¨QÎ@àÙ*ï¿ñ•¬‘]þZµj¹E"yŸ=ôPç¥B€?U¸ŽJD@D Žp¥&…Ú‚Üñ.Ž	0��7Îù>W�7DÌãl2tîÜÙ0�£üãmÈQ­ºuë*>KÞF¦j7^ºt©yöÙg]ÁàYˆuõ€-¯Ú²ÁsÝªN²" @VØtQˆÈp£-WÛ²¿Ïû4jÔÈÜzë­æ×¿þµ‹Lï³nÕ< XH²hÄ ðÅ_˜éÓ§›Ï?ÿÜÅÈD Î¼†×’ìkÎéã,(©ûHûD -\û›7oîþzõêi±˜=b])"a(X¥çq¼¼˜ËyåoÌßQžÃA›™Ç™«ñÐÂhËQ-7kÖÌà­¥�þ?„;ikŒW^yÅ<òÈ#Î`µ“�eûöR{ás¶<aËòl+Ñu"à›€ ¾‰ª>ZÚJî·å[jù¨0SGëÖ­Í½÷ÞkH�†2&‰Îš²ˆÄÍ”�%\M96€A€³{¤$"u„|†¤¢¤ ì³H$â3),"ñ �ˆ€ˆ@š¶¸¸øƒÀÜ¹sÍœ9s×1òR¢¶fÍšngíÀ<Îî>ó8ó7žZ¼’‰EO<‹Ý»w7wÞy§{î<÷‚(ÿ½lÁ«uŽçºU�" @ |º8D�mÝ·Úr‘-^}¡qÓ»ÿþûÍ©§ž*#@ˆ˜‹ª9ÀqŒ,(1à¾Çñ�Ì“×Ìï¾Ï¡rnŸ]zÜ=)üÎ¢�WˆuêÔq»BìIáÏÅS¡{ˆ€Ä‰À†Ì²eËÜ<Î\¾hÑ"7—3o3Ÿó7æñÌÜ¾iÓ&¯Ý#X0‚™ù:3gµÌåÌíÌå¼’�E(ÿ4ýë_Í˜1c|wh«­°‡-�Ø2ÚwåªO‚� (A]&�ãmåœ›:Õ÷MŽ;î8s÷Ýw›3Î8Cg­}Ã�@}¸ô­ZµÊX�Âï™‚€ôUëÖ­s�©X|bH(]pEeQHa'ŸÂ.»AyÚk¯½ÜÏ{ï½·;ÿY»vmÃÏûì³Ï7E‹Ä<j‚ˆ@,	lÝºÕÍáÌÛkÖ¬qó8ÆÞÌÜÎü�)ÌéÌã\“™Çùaî&ê>¯ÌçÌãÌá¥†YÒ­2ó3s9s:gû•>8–�O…�æùè×¯Ÿ¹Û®‡^áç³øÀ@{;ÿÃ²¸V—ˆ@èd ±n€ÀîöZ< î±åà õ”yé9çœcxà„­ÌèÍD`�ÈÖ�üÌb€ U™$gáÇ‚‘sŸ™E$J=HŠüD>ê”ˆ@0�3gæqŽ0g
ó9ÂÜMa>ç•y›ãæqæxIúŒ²K—.¦wïÞatþ[é]¶àà5—`�U�é$ ™/�ã—^3q2;7´å[ÚÙâMúöíë\³ï‹m�  @ IDAT¸ãÐÇ[Åª(ÒXðQØ’ˆ€ˆ€Ä� s8»õ:V¿±Ëw‹‰ôÔSOÖ€!È4['AÿX»Jù°ªôCÀëÙj?MR-"°ûÍ²eƒ-‡Ú²�-^„‚á>H$vÎùID@D@D@D@’G€T”ÿøÇ?Ì»ï¾ë¼G<÷°ÐÖ÷7[Þ´e¥çºU�x% €Wœª,$ëm½DP%lÿa¶x¹‹Û ‡9/Nz6‚üHD@D@D@D@’C€µÞã�?î”âJx–¶¾çmyÑ–%žëVu"à�€ Þ‘ªÂ�¬³õ.²¥©-mlñöìr†pþüùî< F ¼ID@D@D@D@âO€,/½ô’yýõ×ÃHŒ«ÿÿlù§-sãOK=HoJT`©�y'°Ø¶ È–mii‹· –D&�<‚ÈÝN4`‰ˆ€ˆ€ˆ€ˆ@|	™W_}Õ<÷Üs.Å¤çž|më`ËÃ¶Œó\·ª�ÐÈ ZU�¶^<ZØÒÜoBº8\Äˆ.Ü®];—
È[åªHD@D@D@D g.\èÿ_|Ñyz†pã!¶ÎGlùÌŒˆ b1Ljd)L°8p„-ûÚâMÈ1Ìq€ºuëšöíÛ+Õ›7²ªHD@D@D@rC€ Ï]»v5ÿú×¿LAAA7¥ÒÇl!âÿf[$"2 Äf¨ÔÐR8o5Ï‚v²¥–-ÞdÅŠfÎœ9ÎÐºuk³Ç{x«[‰€ˆ€ˆ€ˆ€„G`ýúõ¦{÷îæ‰'ž0¤ýA¾²u¢üwµÅ{DÁÚ«*E`;2 l‡C¿ÄˆÀFÛÖÙ%íí`_÷òÙöÅ‹›Ù³g›zõê¹˜ 2ø¤«ºD@D@D@DÀ?b:}øá‡æÑG5¤ýAÛ:Ÿµå¿¶,¡~U)¡� tÄºAˆ8€'@M[0�&Ð›|õÕW†à1Mš4qF€ÝvÓ¿‹7¸ªHD@D@D@< µsß¾}Íc�=fÆŒã±æoªb·ÿe[^°… Ôˆ%i4±65ºr¯Î²¥Ž-ímÙÝo‚`Ö¬Y¦E‹®ìºë®ÞêVE" " " " Á	À¹ÿþæÞ{ï5#GŽ^áŽ5l°o½kË¶d<Pwü”Þ�� ƒ¤&VH ,Œ Ílii‹×ç:c =`Ó¦M�<,a‰ˆ€ˆ€ˆ€D€ ;ÿƒ2wß}·1bD-Úd+ýØ–lù2Œ¨NÈ%¯ŠR.®{‰ÀwÛß9@j@^ŸíÂÂB°yóæ¦Y³f2XÀÈ'”ÿ�º�ÿaÃ†…Ñ”ÿ¶<hË¸0n :E ×¼*I¹n¼î'ß!€`†-ÛÒÄ–]lñ&x�Ì xè8€7´ªHD@D@D@ªD`ëÖ­fèÐ¡æ®»î2Ã‡7_M¦h¯²ÍÖ†KÁ¶Œµe«-ˆ= b?„ê@)LÌm™cË¡¶4´Å›€/<ˆ	Ð¦MÓ¸qc,`‰ˆ€ˆ€ˆ€ä’ Ê?JÿwÜáŒ Û¶¡«{¬	ŸÛÒÅ\6Û"�D� Ã¨N”"À7 ‘Y9pˆ-Øâ-rF€ùóç;O Ž4jÔÈì¾»×¸ƒ¶¹�²lØ°Á<ØÜsÏ=î5å‹½/9ï´e -Rþ-IrÈ �œ±TO¾%€' F€Ù¶aK=[¼IÆ0eÊÓ±cG—&p—]¼9xk§*�$@Ù5j”¹é¦›\´ÿ”pMµå/¶´…èÿH 5œêL)Xk9°Ä–ÃmÙÏo‚`ñâÅî8@»víLÃ†uÀ]U$" " " ÛÀíôèÑæ¯ý«{%õ_ÂæÑý¶|bËÚêW•"�w2 ä}Ô€	¹•‰|¥-ö±ÅÛV=VgŽ|ùå—¦eË–¦Aƒ:`KD@D@D@DÀ'Üþ‰òß¥K3dÈ‚òÏ™ÿB[ˆöÿž-kl‘ˆ@"	È �ÈaU§JÈxídË^¥þøÇL`ÀñãÇ›V­Z™-ZÈ 0UU " " " ÿG e¿ÿþæ–[n1cÆŒ1x„ ‹m�OÚòº-«B¨_UŠ@dÈ ™¡PCB$Àù-b��{ÚâM0›¹sç:#@“&MdðFW‰€ˆ€ˆ€¤• Ê?;þ÷Þ{¯sûéÌÿRË÷[^µeQZY«ßé! @zÆ:í=åÀ—¶Ô°# ¯Þ$púôéæÀt�wÛMÿ^Þ «"�TØ´i“4h�Kõ‡û?k­d…­ó%[ž¶…# H<i(‰bu°�ÕögŒ µl!E`5[¼
1fÌ˜aš6mêŽÈà¯*H�Í›7›¾}ûš»ï¾Û><¬sÎŸ]ÿ§l‘òeÕ92 DnHÔ �	à	@`À}mii‹WO [Ÿ)**2sæÌq^ Ä� *¨˜@Fùà�Ìˆ#*¾ »O°$Øßßl™•]ºJâI@€xŽ›ZŒ g½ÈñŠ'@;[ªÛâUðà8 ™È #€W¼ªLD@D@D �pûÿè£�Ì}÷ÝgFŽVñ}Ã–Çm™ÖMT¯D•€ Qµ+lËì¦ÙRÛ–6¶x7,X°À¥¬]»¶;P½º÷[ØfKD@D@D@D þV­Zeºuëfzè!3nÜ¸°:„òÿ–-(ÿ3Ãº‰ê�(� Ê££¶…M`¹½A�-ØÒÌïÇ¾úê+3{ölS³fMÓ¦M##€¥,�RV¯^mÞ~ûmó÷¿ÿÝL˜0¡Ô_¼þHÀ¿^¶�î�˜PH% R9ìêt)Åög,À5m	Å`Ñ¢E.0 Ê?F€5¼ÛJuG?Š€ˆ€ˆ€ˆ@|¬X±Â¼öÚkNùŸòÿÛ»'»Ê;Íã?I(ÇF­œ%„DÎØŒí5Ïx–Û5Å¸vwj÷?Øª©ÙòÃ`Ö24Ø`ì †„A$%”QÎRw+KÝÊê Ä>Ï¹‘º¡{nêï[õøÞ¾-Ýsîç`u¿ïyßß»|yV'¾_oì;ÿ^ó¿,«ƒð¾”‚  ¥p•8Ç¬<à5`^0NÉùî uuuÉr oaãúôqB €  Ðvª««ã©§žŠ‡~8Ö­ËlF¾«ý?«üJq(mZ€€6}ùùðÍ\Àƒ ½”J7%§mÏž=±bÅŠØ·o_Œ7.***rúþ¼ €  P*^"ùÀÄ“O>.žœQságWûwçŸ‚!ó¶¥%À @i]/Î6[ÿ�Øªx9ÀX%çsõ<UUUzk`ìØp�@ €  Ð–jjjâ±ÇK¦þ{©dFÍ[ý=¯<¦,Íè¼-%'À @É]2N8c�mzïÐ]9Oñ`@NÛ¡C‡’™ 0`@4(§ïÏ›!€  € Å*à
ÿ�<òHrç¿¶¶6«Ót¡çS\ð/³ÂY�<ï‹@– d©Ë{—ª€—xÀ�ä|9@CCC,[¶,¼ömÈ�!I]€öíÛëP4@ @ üŽ;Ó§O�ŸÿüçÉvÞö/£æ�PPÖgtÞ�’`  d/'ž±€GŽ«o8ZÉùr€#GŽ$o<ú=zôèd& ƒ ’¦!€  €@Y	=z4æÍ›'NŒ7ß|3>œÕçó´ÿ—•UÖfuÞ�R`  ”¯çžµ€ç¥yŸXwþ½E`Î¼+Àš5kbãÆ�1xðà$;vÔ¡h €  €@éÔ××Ç|wß}w¼ýöÛáß}2j{õ¾T|çß39i Ð‚  - ðÍ<°Bñr ä¼&€Þ3 XµjURpÄˆÑ¥KÎÇ| €  �7ï|ôÊ+¯Ä½÷Þ3gÎÌò¸^¾ù´â5ÿ™í'˜åà½È—  ù’æ8¥,àeoÓ[Édw ãlÝº5)XYY™,	èÜ¹³_¦!€  € %'à5þ/½ôR²æéÒL‹ðû÷´gßùßXrPœ0y`  Ïà®d\ÀÓÉ<omœâ]rÞêêêbùòåÑ®]»d G�9?oˆ  € d)°}ûö¤Êÿ<k×fº—>ÇãÊCÊ†,?ï�@¹0 P.W’Ï‘,Q\¹æB¥§’ó¶{÷îX²dIxÚÜyç�É€@ÎÄ"€  € 9ðúþõë×‡;þ�=öXlÚ´)‡ï~Ú[yëfû{XÙ|ÚwyZ`  E^D U�CúŽk4*ž	ÐGÉy;tèP2À#ècÇŽ/`‡€œ3ó† €  �#oóçYŒÞæoòäÉá6ïÔ4IñÝ×k¢!€À—` àKBñÇh&Ð ç.0ã‘ç”¾JÎ›·Èñ´9�ž{‡€;äœ™7D @ �³hhhˆÙ³g'Åþ^{íµð�Œ›ë2ý\™¢ÐùÏš·.O Êóºò©²ðO6ÿ òÜ6/è§´SrÚ¼oîºuëbÎœ9Ñ¯_¿ðÌ)1o†  € g!àb¯¾újüÃ?üC2à5×aò,Ìÿ£¼¬¸øÎP€€3ã�#ÐLàˆž»àŒ3F©TÎQrÚŽ?»víŠ$�ÿ‘#GF÷îÝ©�SeÞ@ ÎDÀëýwìØÏ<óLÜsÏ=É¬EÿÎ’QóÒË…ÊÏ”©ŠgcÒ@à+0 ðÐø+48ªç5Š÷·ñr€!J{%çÍE]ðÀ�1~üøèÓ'“ò9?oÞ@ ÊO ºº:|ðÁxôÑGcóæLkðùw­9ÊÿRf* !€ÀW` à+Âñ×h&àL;”UÊHÅƒ 9Ÿ	 ÷LÖÔ­Y³&¶nÝz²8 ·¤!€  € ùð]þ+V$ëý§L™;wîÌò°Mzó�ßùŸ§økœ…  g�Ç_E ™À1=ß¢x›À�Ê0¥³’óV__p¥ÝáÃ‡ÇÀ�)˜seÞ@ Np±¿™3gÆ?þã?ÆÔ©S“-‹Oý39üú€Þë-Å�ÿŠo¸Ð@à, 8K@þ:Í\œÆ3+½•±J&ƒ GŽ	O½[¸paTTTÄ˜1c¢S§N:@ È½€+û¿øâ‹ñ³Ÿý,æÎ�ûóÉ»óÿœò/Êr%³âzomJ€€6u¹ù°yðÆ·Þ!À=òqJ%çÍÅw<ínÕ*¯<ÐhÃØ±Ñ­[·œ‡7D @ �¶-PWWO>ùdLš4)™�˜a±?CïSžV&)þ}Ê7Xh �# rÉÛ pŠ€÷¥õV5ÞÇÛvW2iÞ!ÀËüÃÙK*++Ù! iÞ@ �¶%à›¾Ñàb�?þx¬_¿>k€]:ÀCÊÃJæËúÃðþ£  ÅxU8§rðöJÅ3< BÉ¤y^ÿ€vm :”A€L¤yS@ Ú†€ïòÏš5+îºë®xå•W².ögÔÊ/•§×U¢!€@ d€Ê["ÐLà�ž¯S<¢íA€J%“ÖØØUUUÉ @ß¾}cÔ¨QqÎ9™lF�Éùó¦ €  PMMMñæ›oÆ=÷Ü~øa²QÆg¶ZïÿeŠâß™h �‘  Áò¶4hÐsÿ`«QF(”Lþ¿wìØ±¤8 —=z4}úôÑáh €  €À¸ÈðÓO?÷ßÌ›7/ü»E†íˆÞ{¾r·ò’²_¡!€@†™tB2<_Þ�Rð8ÏpÅ¾ÎÊ%³²ý.¸téÒ¨©©I<Ð®];’†  € œ.àõþîðÿò—¿Œ?üáùXïïY’/(¾ó?MiRh �±  óö4ð6ÕŠ¼3Ày'õ�ûvàÀ�X·n]lØ°!™àA ¶
Ì½3ïˆ  €@©<x0Þyç�˜8qbL�:5vïvù¢LÛ^½ûdåAežÂ6B !� ò¡Ì1ø¬ÀN}éâ€ž0X9WÉ¤9r$p�@ïß;räÈèÕ«W&ÇâM@ @ ô6oÞœTøè¡‡bÆŒáß2n¾ò¤âJÿÿ±—qÆäí@àÏ üÙ‚gäS`�¶LÙªS<�YÛ¾}{,Y²$jkkcÐ AÉ²€ÌÆ#€  €@I,X° &MšO<ñD>¦üÛÄëý©üQÙ¬Ð@ Ï äœÃ!ÐLÀkß\ÐË\p”ÒNÉ¤Õ××ÇŠ+’]»v�#F°$ iÞ@ �âð¬À×^{-YïïÇ}û¼sq¦íS½»×ùß«¼®d~@ƒ† -0 Ð
/!�G�£:V•âeý•¡Jf{÷yZßÆ�“â€Þ"pØ°aÑ½{w’†  € mAÀ…‚_xá…xä‘Gâ£�>ŠÃ‡gý±]Üï}ÅëýßQ2? ŽAC �V h†—È£€ßx=œgtT¼U`7%“æ*¿^ïçiÑ¯_¿0` »d¢Í›"€  Pþù¿xñâd½¿§ý¯\¹2üZÆ­Nïÿ¼âiÿ*™î)¨÷§!€À0 ð@|�<
lÑ±>Q<+À5ú*™5ï°hÑ¢d— ïàÙ �;{‡B € ”“Àþýû“)ÿ÷ß<ÿüóù¨òo¾µÊŠïü¯Ph P ÁEàh&à5qþ!éA€áJ¥’Yó’€µk×ÆêÕ«£¢¢")È’€Ì¸yc@ ò.à)ÿ^çÿ‹_ü"_Uþý]ÝÿñqÁc‰  Er!8š	¸8àÅÅ½CÀ@%Óÿ¯îØ±#æÌ™MMMqî¹çFeeetè�é!õ‘h €  �•€ù½Ð“O>÷Ýw_¾ªü{Á9Ê¿(Ï)Þõˆ† E$ÀoøEt18š	¸@ÎÅ³¼Àƒ ]•ÌÚÁƒcáÂ…±lÙ²èÑ£G²] w !€  €@i	ìÞ½;Þ|óÍ¸çž{âÅ_Ì×”wößVîR\ñßÅÿh Pd Ùáth&àÊ<›”åŠçUz*™5ß-¨ªªŠ¹sç&ƒ Œ^½zQ 03qÞ@ �Ü	?~<ÙégÊ”)q×]w%Eÿü³=ÍÓüÓbõ<óê‚yøL�²`  ,/+ªÌvéóx:ÝAe”âí”Ìš÷ö’€6DïÞ½“](˜7oŒ  €ÀY¸¸ï‡~'NŒ'žx"¼¼/Í}ÏXœt"5y8&‡@ �³` à,ðø«äQ AÇr]€õJÅÅ3-ÙßØØ«V­ŠY³fEÇŽÃ³<Ð®]¦cúX4@ ø²ÞÊ¯ºº:&OžÿôOÿ³gÏŽúúú/û×ÏæÏí×_ž¡x½ÿå€BC �"`  È/§‡@3ï°A™©ôP2_à_*öìÙ3gÎŒÚÚÚ¤8`ß¾}ÃÛÒ@ @ °‡J–í=øàƒñÐC%wýý³;m›ŽáNÿÿVæ+®]DC �`  .§ˆ@3�ãzî";þaëE}#•>J¦·å>kÖ¬‰ùóç‡·	4hPR#@Ç¥!€  €@¶oß¯¼òJüó?ÿs2õßƒyhþ=Ä7#~£<¨lVüJD€€¹Pœ&§ø§ü'Š{‡€JG%³æ"Bþecúôéáž	àœsÎ9™“7F @ �Ï
x‰žwíyøá‡ãW¿úUlÜ¸1òTèÏËg)÷(“¶ø�R`  Ô®ç‹ÀŸ<ÝÎ5æ*Þ`ˆÒMÉt6@CCC²¯°ùpaÀþýûGÏž=© x € Y	xjÿÖ­[ãå—_Ž»ï¾;Þzë­pá¿<4¯)pAâ—”Ÿ)³Ð@  (Á‹Æ)#ÐLà˜žû‡òÇŠoÅ�Tz)™=z4¶mÛvrÊáèÑ£“�:ðOŠìi € äTÀwø×­[“&MJªüçñ®¿;ÿ›”'•Ÿ+UŠ÷ !€@‰
ðÛz‰^8N�S¼$`™âíw†+Þ) ½’Yó�OC\½zu,X° 9Î°aÃ¢k×®ÌÈL�7F hKþY[WWS¦L‰{ï½7¦N�{÷î�<úsñáEÊ½Ê¿);”¸  %~9}š	xÀ{ñ.Tz+Þ%Àåú3�àA€M›6%ÛnÙ²%†ÉÖ�:6@ ¾‚@ºänâÄ‰ÉzoÍë×òÐ\ÔoŸòšâ)ÿï�øZ4(u Jý
rþ|VÀ£õÛ¸FÀ0¥BÉ´ùN„«{§€O>ù$¼kÀ˜1c¢[7—$ !€  €À™ø®ÿÓO?�ù{÷Ýw“-yót×ß§¹Qù�r¿²\ñ®C4( ÊäBò1h&àõz®Ì»JY¯x— ÌtI€Þ?éø»@ÑÒ¥KcóæÍ1pàÀ0`@´oŸù¡}x € %-pìØ±X´hQÒñê©§båÊ•Ér»<}(¯íw•ÿÿ«¼ xY¡§ !€@	0 PF“�‚À)õµ—,Q\ p�ÒCÉ´?~<Ù&Ð¿´,^¼8™0xðàèÕ«µ2•çÍ@ JUÀw÷=pî»þ÷ß¼ýöÛQ[[þ™š§¶]Çq§ß…þÞW¼€† e(À @^T>Í<š¿Eñ’€ÍÊpÅ32o®X\SS“ÜÉðºÅÞ½{ÇðáÃƒ�2§ç  € %$àesÓ¦MKŠüýñ�LîúûghÛbk¢ò[e¥âßh P¦ ”é…åc!pŠÀ~}½Vñº>Ï©xV@æÍµÖ¯_Ë–-‹íÛ·Ç Aƒ¢²²2óãr @ Š]Àä�<òHüæ7¿‰3f$3èòxÎM:Ö[Ê}ÊëJ­BC �2`  Ì/0�f.
¸Nñ’ Oíó’€¾JæÍk·mÛ–ô/;žÒ8bÄˆèÒ¥KæÇæ  € ›À¾}ûâ…^H¦û{‹¿�7†Væ±ù¦ÀcÊ¿*^÷ïÁ ´ ÚÀEæ#"ÐLÀÅ|¼�¯§ûù‡: /ÿ455ÅÚµk“�€ªªªèÞ½{²m Ët%h € e/àéþ}ôQLš4)üñ˜;wnøgc›oLU<åÿY¥Z¡ÐŸh´�¼üÒßV0ùœ”�€7öl 	¬W†*½•¼´½{÷ÆŠ+’m½ÕÑ�!C¢¢¢"/Çæ  € BÀwù÷»ßÅoûÛxë­·b×®]ù>�M:àSÊ#Ê‡Ê!…† mL€€6vÁù¸4piaô’ ?ºî"�í”Ì›UWW';ø—¢úúúdÛÀ=<)�†  €@yìØ±#^|ñÅxôÑG£@Eþ|‡º2Iù½²ZÉÛö:ŠH /¿èÑçåT@ e�Žzy‚r§ò—J^v
ÐqN¶Q£FÅM7Ý?ùÉOâæ›o¦>ÀIž € ”¢@ccc|ðÁ1yòä˜>}z²Î¿ ŸÃÛû½¢<£ÌUŽ(4hÃ ´á‹ÏGG �azí6åo•o*yÿ7âÊ+¯Œ[n¹%î¸ãŽ˜0aB´k—÷SÐÇ¦!€  ðÕ>ýôÓdm¿‹ü½÷Þ{±p¡wâÍ{ó]ÿ÷•?*ï(žþOC ‚% üG€ Í¼]àre‡â< ›’·æÝ–.];wîLvèß¿R,0o'À�@ øŠþÙõúë¯'kýŸ{î¹d©ÛW|«³ùkÞÎï5å7ÊËÊ…† $ ðœ*à}ˆ¼CÀÅ¿Dx¯>	l¯ä¥¹J²‹.X° ¶oßíÛ·�DçÎ�ór|‚  €À™8p Þÿý¤²ÿ¯ýë˜5kVøgYžÛQoºò[åaež’×½u<¹ sk‹üqzXÀÿFÜ ü­r»â%yoW\qEÜ~ûíñ½ï}/¼D€�€¼_ˆ  Ð‚€·ðóÿ7ß|3Þxã�X´hQ*//mÒQÞP<å¦ÂÖ~B !€ÀéÌ 8Ý„W@à³5úÒ;ø—‰žJ?%¯ÿvxÀÇ®¤ìÙ  èÓ§Oò\çBC @ ¯ÇŽ‹uëÖÅ´iÓâ±Ç‹ßÿþ÷±eË–¼žÃ‰ƒÑ£GžUþŸ²L¡!€ ­
0 U¾� §tÒ×7*ÿM¹UÉûN:fÒñÿÖ·¾?úÑ�âúë¯�Aƒ1` €@æÇ�×ª™={vx�ÿ»ï¾{÷îÍü¸­Àþ§)O(3”¼¯9Ð1i Pb ”Øãt(�þ:/	ø+å*¥»’÷æŽÿ~ðƒøîw¿×^{m2�÷“à€ € mFÀÿ9sæÄÔ©SãÕW_M
ôáé¸®Óãžò¿S¡!€ _J ¯Óx¿Ôñ‡@ Øü‹‡÷^¥x‡€J¥—’×vðàÁ¤H «¯¯�ž={F�=¢K×,¤!€  ��}ûöÅ’%Kâé§ŸŽûî»/™öïŸAj›u\¯õÿ…òïJÁNDÇ¦!€@	
0 /§Œ@‘øß�>Ê_+w*—(ç*yo:tˆ‹/¾8î¸ãŽøÎw¾ãÇ�Oò~"@ l\ÙÕªUñöÛoÇ/¼Ë–-¯ý/PÛ­ã.UžQ^T¼î€BB !€À™	0 pf^üi8]À3‰Æ(ÿåDÆë± ûõ¥wÞygÜrË-1fÌ˜èÕ+ï“ôñi € ¥*°ÿþX¿~}¼÷Þ{ñÌ3Ïºãß$GÏ¸›r"ëõX°Q›† %.À @‰_@N�"8Gçr“ò?¤´WòÞ:uê—\rIüÝßý]|ûÛßŽ#FD×®]ó~@ t¢ºº:þô§?%Óý—.]‡¬®ÞqÉmS\ÜïQeºrT¡!€ g%À ÀYññ—@à¸Hàw•ÿª\®ôPòÞ¼] kL˜0!~úÓŸÆ7Ü�
¤F@Þ/D ŠZ ±±1)è7sæÌd;¿¹sç†×ø»â�š×õ¢<©LU\ä�Î¿h pö œ½!ï€ §tÔKã”Ÿ*©S
R�Ï'gÜ|óÍ1pà@fè‚Ð@ �¶,à;þÛ·o�>øàäÿ={ö²ãß¨ë±IyEù½²Z9¢Ð@ �œ	0 �3JÞNð¿/Þ"ðZåNåÛJ?Å³òÞ<àz W_}uR,ð¦›nŠaÃ†Q,0ïW‚"€ …pq¿M›6ÅôéÓ“â~óçÏ¯û/àßÝß¥üIyF™£xÇŠü	�† ¹`  ·ž¼œ.à: }•(ÿC¹T)Èl 7<Ð½{÷¸ôÒKãïÿþï“]úöí®@C (_¯ç¯««Kªú?þøãÉÖ~‡*dÇßØ¾ë¿DyLyU©S
¶ö@Ç¦!€@™0 Pæ˜�‡@	¸ÀùŠwø±2DñR�‚4wø+++ã¢‹.ŠýèGI±À0P�«ÁA@ �ìÜñß±cGRÜï¹çž‹åË—Gmmm!üùÃzjÿåYÅþ×(^ûOC 2`  S^ÞZè£×®Vþ»ò-Å_dY€Ž›Ìð ïð“Ÿü$n½õVj†† ”°À§Ÿ~.îç5þÓ¦M‹É“'‡«ú{@§ú[ÔÓý÷*ï*¿SæŸøZ4@ { ²7æ pº@½4\ùšâm¯W
6 cG‡Â3 .¸à‚ø›¿ù›ø‹¿ø‹äk/ !€ ”Ž€;øîø¿þúëñüóÏÇÊ•+“ ÇŽ+ô‡pç¶âmýf)5JÁOJç@C �6$À @ºØ|TŠPÀE/T¾¯xiÀyJÁ–èØÑ±cÇ2dH\xá…qûí·'3F��¼îïÓ@ ŠSàÈ‘#±aÃ†äŽÿo¼+V¬ˆ-[¶„_/pó	¬S<Õÿue…â"4@ ï ä�œ"€@çêµñŠ\À³<K  mðàÁ1|øð¤>ÀøÃ;vltëÖ-ÚµãŸÎ‚^Ž œðTÿúúúX»vm¼ôÒKÉ:ÿšššØºuk1ùî¾ïò{�¿;þ«”Ý
(˜ ¿ÅŒž#€@•zí
åå‡J?¥à­¢¢"FŒ×]w]üøÇ?Ž	&D×®]~^œ  Ð–bîÜ¹ñì³ÏÆÇÕÕÕ±gÏžb!ñ¶~/)/(‹”Z…† \€€‚_N Nð¿K£•kÏp¡À¢èm÷ìÙ3Î?ÿü¸þúë“Y7Þxcxp€†  �?wògÌ˜‘ÜíŸ={v¬Y³&8�¿øü#5èÛ.ðç»þs”Ê§
(
 Šâ2p Ð‚€— ŒS¾©üµrƒÒY)xëÒ¥KŒ5*.½ôÒ¸í¶Û’:#GŽ,øyq €@9TUU%ëûßyç�X²dIlÜ¸1©ô_$Ÿ¹Iç1SyQy_Y­PàO4(. Šëzp6 pº@½äú ·*.x¥RÐB�:þÉæãÇ�O–|ÿûßO:w.ŠqŠ“çÈ@ Tššš’Î¾+ú{šÿªU«Âkü‹¨¹ÀßBåyå=Åëü P” åeá¤@ �ÞzÍ�|Gq­€‚
Ô9$­oß¾Içßõ¾ùÍo&uX�êðˆ œ™€§ù{}ÿûï¿Ÿ<úŽ]]Ý™½I¶Úw÷½¶ÿmešâA€}
(j Šúòpr Ð‚@_½v©òmå/•ó•¢ð.žpùå—'®àmÙ9@W‰† |Ž€+ú{?¯ëwÇÿ“O>Iîø»Ê5wü×(¯(R–(E52¡ó¡!€ ­
0 Ð*ß@ �"8Wçw�r£òÅƒEÕÆŒ^xa\vÙeI�€«®º*\H�†  ðgð[°`A²¾ñâÅ±bÅŠX¿~ýŸÿ@ñ<sgÿUe†2OÙ­Ð@ �’`  ¤.'‹ -ôÑkðŒ€ÿ¤\¤Uó¬€‹.º(¸é¦›âë_ÿzŒ;¶¨Î‘“A ò-°víÚøè£�búôéI§ùòåQdwûS’åzò–â;þîøïUh €@I
0 P’—�“F �†éµ›Ü¤ŒPŠ®yF€—\wÝuqÅW$ÞU€† ´�ÆÆÆpGÑ¢EIQ?O÷÷ÿ"mÕ:¯éŠ;þ(› PÒ ”ôåãä@ �Ází[Ê-Ê×”¢¼Õî�W_}u\{íµÉ`À%—\C‡�öíÛë”i €@ù?~<6oÞK—.M:ýsæÌ‰ùóç‡ýi[«óš¥¸ªÿ»ÊV…† ”…  eqù Ð‚À ½æA€Û×	(Ê� �W2À¸òÊ+ã‚.ˆ~ýúù[4@ dvíÚ+W®Œ…&�wü}÷¿ˆ›;þ^ßÿŽâÎÿ…† ”•  eu9ù0 Ð‚€—ü•r«r™2R)ÊÖ«W¯d6À7¾ñ�d0ÀÃ†‹Î�;åùrR €À©MMM±iÓ¦¤ãï;þ~øar×ÿþý§þÑbúºJ'³X™¦¼¬0Õ_4(O Êóºò©@àt�J½t»â.QF*•¢lLŠºhàÅ_œ4hKŠòjqR´mOñß¶m[¸¨ß²eË’¢~.î·}ûöb†9¢“«R–*®ìÿ†R«Ð@ �²`  ¬//ZðÜú›•ï*W+ç)Ý”¢líÚµo'xÛm·%³Æ�Ã‡�þýû3P”WŒ“B m¸Ó¿sçÎ¨©©‰U«V%wùßyç�dû¾O?ý´˜êurë”ùÊTåe—BC Ú„  mâ2ó!@ wú],ð¯•«”QJw¥h›·¼ì²ËNœwÞyI­€>}¼"È^`ïÞ½áµýëÖ­;Ùé_¼xq±nß×ä�¾Ø¨,P^T\ÜÏƒ4@ M	0 Ð¦.7Nð¿�^`?AùÏŠ·©T(EÙ<#À;¸^À„	â†nHv;vlTVVƒEyÙ8)JZÀ�þÚÚÚdŠ¿«÷Ïœ93æÎ�^×ï™ E~Çß[T)ÞÎïß•¹J“RÔÓt~4@  2aåM@ Äüo¡ë\¬|_ñÎç+ý•¢mpzöì_ûÚ×’\uÕU‘ÎèÝ»wòý¢ý œ¥€;ôûöí;y§Á‚1kÖ¬$H:üEÞé·ëNe�âŠþ¯+Ë¯û§ã/´] Úîµç“#€@Ëôò(å‡Š‹ŽV¼¥`'¥h[:3 {÷îqã�7†‹zKÁÑ£G'3<cÀ3h €@K¾“ï;ú¾Ó¿aÃ†dë¾éÓ§ÇŒ3âÐ¡C¥p§ßë°â­û6(.ê÷’âiÿÇ €€ à?@àtÿÛè¥îø{Y€ë\¡x'�JQ·sÎ9':vì]»v�k¯½6¼­`:Ð·oßdù ƒE}	99ò"�vúëêêNvú½mßœ9s¢¡¡!Ž9G�ÍË¹œåAêï×*‹¯ï÷t0Õ_4@ ¹  Í5xŽ œ.à¥îô_­xç€›•Šëý-õ:$ƒ]ºtI
z0ÀµF�•ì$àå�;{¬ƒ† mA ©©)<�ßü7nÜ˜¬åw§ß…ü“Nÿ±c%qÃü¸®—×÷W+ï+o+óxª?@  Z@á%@ wö½`”ò=åÛÊ…Š·,‰´ïú{f€ã­¿þõ¯Ç5×\çŸ~<8\3À;xÊCÀwðëëë“5ý[·n�5kÖÄ¼yóâ£�>J¶ìó]~Ç³J¤ù®¾·í[¡üIySñ4Oÿ/™¡s¥!€ `   ìJ\À}•[”;•ko!X:Ï¤uêÔ)¨¨¨ˆë®».n½õÖpA×ð@€¿ï4(-ßÁ?|øpÒñ÷z~ñ›6mZ²mßž={’¿¿_bÍoå7OyFyO©SJîƒèœi €@Á (=F �2p§ßu.QnW< 0Dé¢”TÏÙ~ô£gÜrË-É`À¸qãÂ^&à™.6HC �âpE~ßÅ÷ô~wðW¯^�túß{ï½äŽ¿g ¸�ŸK¬y-B£²Eq‡ß…ý–*^ïïÁ  €À
ð›Ü‚ñÇ@ �<g¾·2L¹Uñ6‚.ØKñ¬€’ú·ÖK¼k€�Ìp1Á.¸ †=zô8¹”€b‚ºº4ò,àéúéÔýƒFMMM¬\¹2)Þ÷ñÇÇŽ;’Î¾«ú—ÐÔþTñS=ñÝþýŠ‹úy¿iÊ&eŸRU	už4@ (Jê—Ò¢ä¤@ �Ï
¸ÓïåžàÝ< àÝ\L°$›;ü.è�¡C‡&»
\~ùåqé¥—Æ°aÃ’šžÀì€’¼¼œt‰ø.¿ã5ý›6mŠ%K–Ä'Ÿ|.à·yóæ¤Ãïâ~(áæâ}®Þï¿«ùûn¿§ù{0€†  � r€È[ € -øÎÿ`Å;Ü ¸p gøõ¢ß=@çØbóÿ~ýú%Ï=÷Ü¤˜ ë\vÙeÉo3è"‚´ÈÇ‹|i�æ~oÓç;ü®Ôïõüë×¯�Ý»w'…ývíÚUŠwù›;¸pŸïøûn¿úÍTª•­Š_§!€ äP€€bòV €@+}ôº—\ |Sñ¬€áŠg”ì`€Î=éì»Óï:pÍ Ï¸è¢‹’ç^B�°\Àb4ZðTýô¿§ð{ÿòåË“;ý~î¿×÷{0À³ J¼¹Óï»ý5Šïö{¿•Š§ùïUh € 	0 �,o‹ ´ ÐA¯õW<0AqÑÀ›•
¥,š‹öéÓçdF�_|q\qÅÉ�AƒE—.®‘HC 466Æ¶mÛ’;ü‹-ŠeË–ÅÆ�cïÞ½'ãâ~eÔöè³| ¸¨ß\Å�þ�Ê1…†  �±  óö €@+®à�€qÊ×Ï¯tSÊ¦yç€ÊÊÊèß¿2CÀ3< à1bD2XP6˜‚À¸c_]]�tò}‡ß~ßñ÷þ�;wFmmmRàïÞ¦Ô¾ííV)¾Ó?KY­¸ãÏÚ~!Ð@ �|
0 �OmŽ… ´,àY#Ü¤|C©tRÊ®y©€<SÀK<à�±cÇÆèÑ£cÈ�!IÁÁ²ûà| 6'àm÷¶lÙ6lˆµk×&SúÝù÷T~¸ÃïŽ™¶Ãú\UÊ‡ÊtÅ�þ*Åwûi € `  @ðhAÀõ †(#•óô€À(ÅËÊ²¹F@:C ­%0räÈd¦€< à¥Ý»w/ËÏÏ‡*�C‡%SùÝáwgßwö«ªªN®ÝOïð—ÁúýÏ»`žÆ¿Qq‡ßÅüÖ(UÊÅëþi € `  À€Ã#€ ­øîÿHe¬ââ�×+×* (ûæ-ü™™Ã‡OvðŒo?èA�^½¼’‚†@~öïßŸtö½Ÿïè»*MMÍgîìoÝº5Ùš/¿gV°£¹ƒ?G™­¸˜ßZ¥Jñ,  €@	0 PDƒSA ZpÕ¼1Ê8åbååje ÒfZ×®]Ã5¼aºó€gŒ3&©'àï804p1Bg+àâ{ž¦¿}ûöd�¾‹ó¹³ï×ÒŠüÞ†ÏkøÎöp¥ö÷·ë„ç+ó”eŠ§ø¯W €@‘
0 P¤†ÓB Zp‘@¸`àeÊ%ÊåŠ·ls­]»vI‡ß�ÿÞ½{'uüè¯½tÀ³<SÀ3ÚÜ"_êûŽ¾;õŽ+òûn¾§ò»c¿oß¾d½¾ýµÿŒ·ëk£ÍÛö}¢,U+.ìçN¿‹üÑ@ J@€€¸Hœ" ÐŠ@_½îå)—*ç�øz˜ÛtëÔ©S2�.#ðŒÇƒ é,#t!Âtà€YåýŸŒïæ»ð^Ú¡O×äûî¾;õuuuIüÜÓ÷ÝÙ?|˜ìú¯b“âiýë”%Êò_×é‘†  Pb ”Øãt@ �VzêuôŒ x†€—ŒRø·^níÛ·OÒ¥.:˜ÆNºÄÀƒž1à¸ ¡‹ÒŠWÀÅõ\ˆÏwówöÝ©÷}wöOÛO“NÝwGÿøqêÓ5»²žÞàB~žÒï;üîôûŽ¿úPh € %,À/…%|ñ8u@ L< p¡âb‚£× µ"àÎ~:CÀ3Ò~½G�É �	zöì™Ìðë~î¢…þ¾gÐr/à;ñLŠê8p éàûN¾Ÿ§�{ßÿô¿;ÿ¾›ï;ü~�ö¹^·¿Aqñ¾Š;üi§ŸiÂ !€ å"À @¹\I> Ð²€·tçßƒ . èY®!0R¨ÐÎ@À�}Ïð²�tæ€ŸûuÇ3<à�Ç_§qCÇßïÜ¹‹Ò)0pƒ¶Ô¼~Þú¦&§1éÔ»€žã;øiÒ;ùõõõÉkîì;îà§wñýÜwòý:íŒ\Ä¯Jñ~ßíw!?wþ=À”!Ð@ �rh[¿u”ãä3!€ _^Àÿæ�T\40]*àâ�”AJG…v–;vLê¤;¤³<@�tëÖ]ƒ]¢K—.É €ëø¹ãYÍã¥:tH– x	ƒŸ·ßÍƒ
Ís&ÉôæñßõùcÇŽµßSðýgüè~ó466†ãuøîèûyCƒ;ÿž²Ÿvî=u?­°ï»øGŽ9“ÓçÏ¶.`ÈmÊÅÅüÒ©ý.êW¥´ÙÊ†úì4@ Í0 Ðf.58MÀu\DÐ5®R<SÀN…BË“€;ùð`�—¤ñì8é €N}î×¿� |Þs4wÜÝÙ÷ãç=w§ÞqÇûôñÔçîà;¾‹ï)ùiÜ©÷}¿-¯{t4wúßÙ_ ¸ãï¢~L›hk ´µ+ÎçE Zð­ã¡Š®P¼dÀ_{v€—
x°€† Å-àN½§öû.ÿfÅSú)îôûk¦ö�† ´e ÚòÕç³#€ ­tÓ·<#àJåÅ•J_å\…jwB !P`èÛ­Ô)µŠ;üó”…Šïø×+4@ N
0 p’‚' € -xf€VxI€wð€€sžâ¿îtVh �­@“ÞÞÓúwø×)îì;Þ¦Ï¯{-?wú…@C 8]€€ÓMx@ uÿÜ8Gé­\¤¸  = ÐOñ`€¿×C¡!€ÀÙ	Ô_ß§¸c¿Kq‡¹âÂ}~ô÷Ž*ð@à‹ øb#þ €@ëþ9âY½”ñÊŠ¼dÀõÒÁ ×àgŽh´"àN¼×ð§�~¯ã÷”~wô)«”ýŠïîÓá@àÌøeìÌÍø € -tÐËžàÇîŠk\ªx§
xwÏð÷üÈ²!ÐÚ¬€§ó»³èÄ£+õ»³ï
ýK¯á÷÷Ž)¾ËïG € g%À ÀYññ—@ >GÀ?c< àtT¼›€—
¤3ÆèyÅŽ2( ZÙ	¸³ï‚|îÐ;;•õJz‡ßSû]½ÿˆâÎ>Óú…@C È½  ¹7å@ Zðì€t¦€;ûÃ•Ë
\¬xÖ€—ø{ÞiÀ�@ !P*î¼»Ãï
ý~ô´~ßÍ_¦øÿb¥Fñ÷üg}gŸ»ûB !€ d/À @öÆ@ utUÜÑwú(ðL�qŠw¡œ«x@À3	Òè)�‚
øŽ}štK¾j½æŠü«•uŠ;û{wø�…¿h € ù`  ÿæ@àó<(�øÑ^>àÙŽ<00Xñ÷=C �häZ ùÔüôÿVÄ}wò}‡ßñ4~wðÓÎ¾éì�†  P Çuà,@ ¾X ù @ýñ
Å³F+ž%0ôÄóAzô÷ÓA�ôÑ4ZpGÝ�ûæiÔ×Û”ÊfÅw÷ýÜwõ½5Ÿ¿ß¼³¯/i € ¯  Å{m83@ �/ðwö›xëAxp`Œâ‚‘Ê0Å»øgŸÓ^qKÿã+þ·ÜŽŸø€~ôvzŽ«ñoRªwð×+îä»Ó¿OiÞÉw§ß3h € ”œ  %wÉ8a@ �/!àï*à¤;¸óïZž!àQ¼´ ýÚ3
<KÀé Aú¨—h%"�vêÓGwô}wßwì}7ßñTý-Í¾Þ­çH+õûÑqÇŸ†  €@Ù0 P6—’‚  ð%<c ðóôkÏè¯¤•zÞïDüº<°�þìLÒG}ëä÷üœ–;wæÝÒN}ú˜¾æŽº;øÞ^o×‰Ôê1íðûußÉw§Þwð?O¿ÖS € å/�þSþŸ”Oˆ  €À¸^€‹¦;¤îøûy_Åƒ x`À¯ypÀñƒ^
Å…�ƒæ©öûß¡wß©SÜ¡ß¡¸“ï¿_s§ÞißÏ]�Ïñº~ € m^€€6ÿŸ   € g àåð AóY H	ü}/7ð–†žUà¤Ï{ê¹ãïû=ü˜.Qð×åÜÜ÷÷CŠ§Ûûk?8ß¡÷vy~LŸûûÍ;ôi?½{ï÷ð÷ÓuýzJC @ �Ö hM†×@ 8;�NúëÍÒ¯ýèx–@óøÏzPÁi<(�þy,¤Ïýg›?O¿Nkx âÔœú=ý‘¤ãìÎsºN>}~ê£×Ð{Ÿ{wÀ?O¿NŸ»#ž>wÇÜý4î°ûïùŽ~ó¤>}O¿GócèK € äJ€€\Iò> € äFÀËÒ�?wÇÝiþ<}íÔÇæõWZ,hèŸýéÏÿt-ý©� pK_O<ÐZ<Í>ýžŸ§}¦ßƒ†  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  € ›ËŒ  êIDAT €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €@q
ü‹°’è“ò    IEND®B`‚ic11  (‰PNG

   IHDR           szzô  
ªiCCPICC Profile  H‰•–TSiÇ¿÷^z¡B‘z“.@z]:ØI€PbH*6TÄQDDPÐQÇˆ¨ˆ(ÁÞdPÇÁ‚5û€%ÎìžÝ=û?ç¾÷;7÷»ß½_ÞwÎ€r‹-fÀ
 d
²Eþ^Œ¸øþ)€ Ð§›#z†‡T3ï¿ëý4ÕM‹É\ÿþû•"—'æ  …£œÄs2Q>�ZG(Ê ¢~ý¥ÙÂI.EYY„ˆrí$§LsÛ$'MsïTLT„7Ê¿@ °Ù¢ Èc¨Ÿ‘ÃIAóPÐn�µ€Ë ì�²'•ÍE9åÙ™™K&ù0Ê&IÉ“ò·œI²œlvŠŒ§{™Á‡/f°—ÿŸÇñ¿•™!™ÙC5Jª( br¿ÉsK_$cARhØó¹Ó5Mrª$ z†9bï„æ²}‚dk3Bƒg8™ïÇ’åÉfEÍ°hI„,?Oì9ÃlÑ÷½$éÑž²}y,YÎÜÔ¨ØÎáÇ„Î°8=2è{Œ·Ì/’DÈjNùÉzÌÿ¥/>KŸ� ë‘ý½6ž8NV—çã+ó¢e1Âl/Y~aF¸,ž—á/ó‹s"ek³Ñ�íûÚpÙù¤±ÃgðA`N6oYödÁÞK„ËEü”Ôl†'zcx–€c9›akmÃ`òþMÿ½oéS÷
¢_ýî[Ÿ€k•T*=ýÝ,À	´~ÒàwŸq r¨ÿr1G"Ê™öa&X@ò@¨môû1À8 à|A Q ,�
2�,+ÁZP ŠÀV°T€*°Ô‚#àhmà<¸®�^p<ý`¼ cà=˜€ Q!¤é@†�9d1!7È
†" x(J��Z	­‡Š ¨ª†ê _ SÐyè
ÔÝ‡ QèôF`
¬kÁF°Ì„=á 8
^§ÀYp.œo�Ëáø0ÜŸ‡¯Á·á~ø<Ž „ŒÐ]Äa"ÞH’€$#"d5Rˆ”!5HÒŠt!7‘~ä%ò	ƒÃÐ0ŒÆ€‰Æp0Y˜Õ˜Í˜
L-¦	Ó‰¹‰ÀŒa¾a©XM¬9ÖËÂÆaS°K±Ø2ììIìEìmìö=‡£ãŒqŽ¸ \<.···×ˆkÇõáqãx<^oŽwÅ‡áÙøl|~þ0þþ~ÿ‘@&èl	~„‚€°ŽPF8D8K¸A&Lˆ†Dgb‘K\N,&î'¶¯‡ˆ$E’1É•EJ#­%•“HI�HoÉd²Ù‰<�Ì'ç‘ËÉGÉ—ÉäO%ŠÅ›²€"¡l¡¤´SîSÞR©T#ª5�šMÝB­£^ >¡~”£ÉYÊ±ä¸rkä*åšänÈ½’'ÊÊ{Ê/’Ï•/“?.]þ¥QÁHÁ[�­°Z¡Rá”Â]…qEš¢�b˜b¦âfÅCŠWG”ðJFJ¾J\¥|¥}J”iMŸæMãÐÖÓöÓ.Ò†”qÊÆÊ,å4å"å#Ê=Êc*J*sTbT–©TªœQé§#t#:‹žA/¦£ß¡VÕRõTå©nRmP½¡úAm–š‡O­P­Qí¶Úgu†º¯zºú6õfõÇ3�yK5öj\Ôx9Ky–Ë,Î¬ÂYÇf=Ð„5Í4#4WhîÓìÖ×ÒÖò×jíÒº õR›®í¡�¦]ª}V{T‡¦ã¦Ã×)Õ9§óœ¡Âðdd0Ê�Œ1]MÝ ]‰nµn�î„ž±^´Þ:½F½Çú$}¦~²~©~‡þ˜�ŽAˆÁJƒzƒ†DC¦aªáNÃ.ÃFÆF±F�š�FŒÕŒYÆ¹ÆõÆ�L¨&î&Y&5&·Lq¦LÓtÓ=¦½f°™½YªY¥ÙusØÜÁœo¾Ç¼o6v¶ÓlÁìšÙw-(ž9õ–tË`Ëu–Í–¯¬¬¬¶YuY}³¶·Î°ÞoýÐFÉ&Ðf�M«Í[3[Žm¥í-;ª�ŸÝ»»×sÌçðæì�sÏžfb¿Ñ¾Ãþ«ƒ£ƒÈ¡ÁaÔÑÀ1Ñq·ã]¦23œ¹™yÙ	ëäå´Æ©Íé“³ƒs¶ó1ç?],\Ò]¹ŒÌ5žË›»î «ž+ÛµÚµß�á–èö“[¿»®;Û½Æý©‡¾×ã€Ç°§©gšçaÏW^Ö^"¯“^¼�½Wy·û >þ>…>=¾J¾Ñ¾¾OüôüRüêýÆüíýWø·`‚¶Üei±8¬:ÖX càªÀÎ JPdPEÐÓ`³`Qpk²=äQ¨a¨ ´9„±Â¶‡=7Ï
?=7/|^å¼g6+#º"i‘‹#E¾�òŠ*Žzm-‰îˆ‘�YSó!Ö'¶$¶?Î*nUÜµx�x~|K>!&á@Âø|ßù;æ-°_P°àÎBã…Ë^Y¤±(cÑ™Åò‹Ù‹�'bc%~a‡±kØãI¬¤ÝIcoÎNÎ®·”;Êså•ð†“]“K’GR\S¶§Œ¦º§–¥¾ä{ó+ø¯ÓÒªÒ>¤‡¥L—fÄf4f23O	”é‚Î%ÚK–-éš„ýYÎY;²ÆDA¢bH¼PÜ’­Œ:ÝÉÉ@Ž[NeÎÇ¥1K�/S\&XÖ½Ülù¦åÃ¹~¹?¯À¬à¬èX©»ríÊ�Už«ªWC«“Vw¬Ñ_“¿f(Ï?¯v-imúÚ_×Y¯+Y÷n}ìúÖ|­ü¼üÁþêä
Dw7ºl¬úóÿ‡žMv›vmúVÈ-¼Zd]TVôe3góÕm~,ÿQº%yKO±CñÞ­¸­‚­w¶¹o«-Q,É-Ü²½©”QZXúnÇâWÊæ”Uí$í”ìì/.oÙe°kë®/©·+½*wkîÞ´ûÃîž{=ö6TiUU}þ‰ÿÓ½jÿê¦£š²}¸}9ûží�Ùßõ3óçºŠ|=(8Ø_QÛYçXWwHóPq=\/©=¼àpïŸ#-Õ�ôÆ¢£à¨äèó_¹s,èXÇqæñ††'vŸ¤�,l‚š–7�5§6÷·Ä·ô�
<ÕÑêÒzò´åéƒmºm•gTÎŸ%�Í?+=—{n¼]Øþò|ÊùÁŽÅ/Ä]¸Õ9¯³çbÐÅË—ü.]èòì:wÙõrÛç+§®2¯6_s¸ÖÔmß}òWû_Oö8ô4]w¼ÞÒëÔÛÚ7·ïì÷çoúÜ¼t‹uëÚíÐÛ}w¢ïÜ»»ànÿ=î½‘û÷_?Èy0ñ0ïöQác…ÇeO4ŸÔüfú[c¿Cÿ™Ÿ�î§‘Or_ü.þýËPþ3ê³²a�áºÛ‘¶Q¿ÑÞçóŸ½¾˜xYð‡â»_™¼:ñ§ÇŸÝcqcC¯E¯¥o6¿U{ðÝœwãáãOÞg¾ŸøPøQýcí'æ§®Ï±Ÿ‡'–~Á)ÿjúµõ[Ð·GÒL©TÈ±§F589€7 Æ@CçfÒüéùxJÐôL?Eà?ñô=% Ð×ä(äÝÀQÔŒ<ÐÜ¨MŽAQ ¶³“Ù?%N¶³�ÎEA§FìG©ô­ øV ¾Š¤Ò‰=Ré×ýh±÷hÏšžË'…Cç÷¼„¥××j•þEÿ ‘‚¯’Ð8{  1IDATX	íWIH\I.»G[m�
îŽ„6Œƒ‚â!9x& ‡„ôÁ“è-�ƒ™£ÌA�à‚K\fôàaQ•\5f&J#î¢Øn8Ú.]ù¿
ïåõ«×ÝÏ$·¤ »ªþúêû¾Zß{Œ}ï)äŽðá	ÍIOO¿}ý���Ýëëë®ëëëEªþK¿ÄÍ$³îÅÆÆ:‹ŠŠ^<ÌÉÉ±¥¦¦²ˆˆ¡q~~Î677Ùââ¢gffæýØØØŸ‡‡‡P£ÛŒ‰`˜çåååæææ¸Ù,úñó`ä�ÚÃ333ß™Õ•pè	$dÔž››;8??/‘Þ5 pÝÉ„ÃáhRÄxCC¯©©áüêêÊ¯‡‹‹ÞÓÓÃ«««ySSw»Ý.p�TŠ………•zÑâyyyœ@ê¯¢¢‚ßÜÜH&`Ìétª8ô),,ätBœà–u{YYÙ^¯Ðç--->„ µX,|aaA2@»_ÂßÛÛ+°à7ÅìZM‹¶b·ÛŸUVV>	ùt:q´ô‰ˆØîî®>Ìvvv¤"NpCÃHAkIIÉìíí­:º‘‘iTqqqœŒ©¥°¶¶Æ###}ð$Ê§¦¦74 edÂAçM¬umm­Jœ’’Â‡‡‡µµÜÖÖ&pñññÂÝ’¼®®Ž+Ë© ¡AâÉ€Õj-�žžVp>ùÊÊ
ÇïííùÄ•J{{;§Æ»ººøÖÖ–Àº\.¥Ù'‡´$III¯0�wM���B¼££ÃTWh@K2�••õûþþ¾)ÔÝÝ-Ä[[[•PÐÐRhOÖÎtêëëcUUU¬±±Qä¦;~ÊZ			/ý­›~XýýýÜf³ñææf}SÐ:4 %¦�ñtrrÒ�@»	éFâ4rCìöövÀMhI(ðs}}ý©–U9]$ÜŸ8-FðBZF,ÅÅÅôV£z0ºˆbbb8Ýz*F)¬®®ª÷‘ú‹ÜÐ vuï©
z'&&ÞÒyWÍiËJðèèˆ---)U5§ç;;;Së(�9¦å@ÔäU€Zìòòò/ºÑhêE;^»ô‰FŒ¦Yft¶¥iii"NpCÃ¨	>! xèËÇ18Iã‰FÇ199ù7š*±¼_óBBË%8ÀNÿŠr‹•Þ`šÇÇÇ•=öÅ98ÀE†O@YúsÄBÇî5½”x½†ùs†>è¢ôÙkŸ%Ì•—––¾å�ÇŸžXô!úÇÁ$Ì~˜ØˆèWú0qæçç?ÊÎÎŽÍÈÈ`QQQ‚ÿôô”ÑSŽ-//ÎÎÎ¾£|”üM?� ø3k@K‘L•,º}>ÍNNN\ÿ‡~ÛZð�r°ønHRÑL    IEND®B`‚info  bplist00ÔX$versionX$objectsY$archiverT$top † ¥U$nullÓ	
WNS.keysZNS.objectsV$class¡€¡€€TnameTiconÒZ$classnameX$classes\NSDictionary¢XNSObject_NSKeyedArchiverÑTroot€#-27=CJR]dfhjlnsx}ˆ‘ž¡ª¼¿Ä                            Æ           (  f   €€     ( Ž  @@     (B  ¶( 00     ¨%  Þj        ¨  †�      h  .¡ (                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
      0   F   b   z   �   ¢   ²   ¿   É   Ð   ×   Ü   Þ   á   á   Þ   Ü   ×   Ð   É   ¿   ²   ¢   �   z   b   F   0      
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           	   #   F   l   –   ¼   ×   ì   ù   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ù   ì   ×   ¼   –   l   F   #   	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      D   w   ­   Õ   ñ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ñ   Õ   ­   w   D                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         L   ‡   ¿   ë   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ë   ¿   ‡   L                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         1   s   ¶   è   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ###ÿ999ÿMMMÿZZZÿkkkÿ{{{ÿ………ÿ���ÿ“““ÿ•••ÿ˜˜˜ÿ˜˜˜ÿ•••ÿ“““ÿ���ÿ………ÿ{{{ÿkkkÿZZZÿMMMÿ999ÿ###ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   è   ¶   s   1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             8   ‚   É   ÷   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ666ÿZZZÿÿžžžÿ½½½ÿÓÓÓÿæææÿóóóÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿóóóÿæææÿÓÓÓÿ½½½ÿžžžÿÿZZZÿ666ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÷   É   ‚   8                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      -   z   Ê   û   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ???ÿpppÿ   ÿÉÉÉÿçççÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿçççÿÉÉÉÿ   ÿpppÿ???ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   û   Ê   z   -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  `   º   õ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿQQQÿ‹‹‹ÿÃÃÃÿêêêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿÃÃÃÿ‹‹‹ÿQQQÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   õ   º   `                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              2   �   á   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ			ÿ999ÿ|||ÿ¼¼¼ÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíííÿ¼¼¼ÿ|||ÿ999ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   á   �   2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          K   ¬   õ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿFFFÿ���ÿÑÑÑÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÑÑÑÿ���ÿFFFÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   õ   ¬   K                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ]   Å   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ@@@ÿ’’’ÿØØØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØØØÿ’’’ÿ@@@ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Å   ]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         e   Ñ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ&&&ÿyyyÿÍÍÍÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÍÍÍÿyyyÿ&&&ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ñ   e                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         \   Ï   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿFFFÿ¤¤¤ÿïïïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïÿ¤¤¤ÿFFFÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ï   \                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         Q   Ç   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿfffÿÈÈÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÈÈÿfffÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ç   Q                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          ;   ³   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ|||ÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿ|||ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ³   ;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              ’   ö   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ€€€ÿäääÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿ€€€ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ö   ’                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 b   Þ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ}}}ÿãããÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãããÿ}}}ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Þ   b                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  1   ¸   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿmmmÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞÞÞÿmmmÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ¸   1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      u   ï   ÿ   ÿ   ÿ   ÿ   ÿ   ÿQQQÿÎÎÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÎÎÿQQQÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ï   t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          .   º   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿ©©©ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ©©©ÿ...ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   º   .                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              i   ë   ÿ   ÿ   ÿ   ÿ   ÿÿ~~~ÿïïïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïÿ~~~ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ë   i                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     ¦   ÿ   ÿ   ÿ   ÿ   ÿ   ÿBBBÿÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÿBBBÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ¦                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          <   Õ   ÿ   ÿ   ÿ   ÿ   ÿÿ‹‹‹ÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ‹‹‹ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Õ   <                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              l   ò   ÿ   ÿ   ÿ   ÿ   ÿ<<<ÿËËËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËËËÿ<<<ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ò   l                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     ›   ÿ   ÿ   ÿ   ÿ   ÿÿzzzÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿzzzÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ›                                                                                                                                                                                                                                                                                                                                                                                                                                                                              ¾   ÿ   ÿ   ÿ   ÿ   ÿÿ±±±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±±±ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ¾                                                                                                                                                                                                                                                                                                                                                                                                                                                                   8   ×   ÿ   ÿ   ÿ   ÿ   ÿFFFÿÚÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿFFFÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ×   8                                                                                                                                                                                                                                                                                                                                                                                                                                                       S   ì   ÿ   ÿ   ÿ   ÿÿuuuÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿuuuÿÿ   ÿ   ÿ   ÿ   ÿ   ì   S                                                                                                                                                                                                                                                                                                                                                                                                                                               f   ÷   ÿ   ÿ   ÿ   ÿÿœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÿÿ   ÿ   ÿ   ÿ   ÿ   ÷   f                                                                                                                                                                                                                                                                                                                                                                                                                                       w   ü   ÿ   ÿ   ÿ   ÿÿ¼¼¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼ÿÿ   ÿ   ÿ   ÿ   ÿ   ü   w                                                                                                                                                                                                                                                                                                                                                                                                                              ˆ   ÿ   ÿ   ÿ   ÿ   ÿ666ÿ×××ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×××ÿ666ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ˆ                                                                                                                                                                                                                                                                                                                                                                                                                     �   ÿ   ÿ   ÿ   ÿ   ÿGGGÿèèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿGGGÿ   ÿ   ÿ   ÿ   ÿ   ÿ   �                                                                                                                                                                                                                                                                                                                                                                                                             �   ÿ   ÿ   ÿ   ÿ   ÿYYYÿòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÿYYYÿ   ÿ   ÿ   ÿ   ÿ   ÿ   �                                                                                                                                                                                                                                                                                                                                                                                                     ‘   ÿ   ÿ   ÿ   ÿ   ÿhhhÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿhhhÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ‘                                                                                                                                                                                                                                                                                                                                                                                             �   ÿ   ÿ   ÿ   ÿ   ÿoooÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿoooÿ   ÿ   ÿ   ÿ   ÿ   ÿ   �                                                                                                                                                                                                                                                                                                                                                                                      }   ÿ   ÿ   ÿ   ÿ   ÿqqqÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿqqqÿ   ÿ   ÿ   ÿ   ÿ   ÿ   }                                                                                                                                                                                                                                                                                                                                                                               o   ý   ÿ   ÿ   ÿ   ÿpppÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿpppÿ   ÿ   ÿ   ÿ   ÿ   ý   o                                                                                                                                                                                                                                                                                                                                                                       \   ú   ÿ   ÿ   ÿ   ÿlllÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿlllÿ   ÿ   ÿ   ÿ   ÿ   ú   \                                                                                                                                                                                                                                                                                                                                                               C   ò   ÿ   ÿ   ÿ   ÿ^^^ÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿ^^^ÿ   ÿ   ÿ   ÿ   ÿ   ò   C                                                                                                                                                                                                                                                                                                                                                       (   á   ÿ   ÿ   ÿ   ÿOOOÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿOOOÿ   ÿ   ÿ   ÿ   ÿ   á   (                                                                                                                                                                                                                                                                                                                                                  Ì   ÿ   ÿ   ÿ   ÿ<<<ÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿÇÇÇÿšššÿvvvÿZZZÿMMMÿGGGÿJJJÿTTTÿjjjÿŒŒŒÿµµµÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿÎÎÎÿ¡¡¡ÿ}}}ÿ^^^ÿNNNÿGGGÿHHHÿRRRÿdddÿ………ÿ­­­ÿÚÚÚÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíííÿ<<<ÿ   ÿ   ÿ   ÿ   ÿ   Ì                                                                                                                                                                                                                                                                                                                                             ­   ÿ   ÿ   ÿ   ÿ(((ÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïÿ¨¨¨ÿYYYÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ@@@ÿ‡‡‡ÿØØØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ¶¶¶ÿfffÿ)))ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ555ÿyyyÿÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáááÿ(((ÿ   ÿ   ÿ   ÿ   ÿ   ­                                                                                                                                                                                                                                                                                                                                      €   ÿ   ÿ   ÿ   ÿÿÈÈÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçççÿƒƒƒÿ%%%ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿZZZÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿ˜˜˜ÿ333ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿHHHÿ´´´ÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÈÈÿÿ   ÿ   ÿ   ÿ   ÿ   €                                                                                                                                                                                                                                                                                                                               N   ù   ÿ   ÿ   ÿÿ®®®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ‘‘‘ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ]]]ÿÙÙÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§§ÿ---ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿIIIÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®ÿÿ   ÿ   ÿ   ÿ   ù   N                                                                                                                                                                                                                                                                                                                       (   å   ÿ   ÿ   ÿ   ÿ‡‡‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍÍÍÿ>>>ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ™™™ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßßßÿXXXÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ|||ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡‡‡ÿ   ÿ   ÿ   ÿ   ÿ   å   (                                                                                                                                                                                                                                                                                                               
   ¿   ÿ   ÿ   ÿ   ÿXXXÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿaaaÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾¾¾ÿ###ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿFFFÿàààÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿXXXÿ   ÿ   ÿ   ÿ   ÿ   ¿   
                                                                                                                                                                                                                                                                                                           ƒ   ÿ   ÿ   ÿ   ÿ---ÿèèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†††ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿCCCÿæææÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ+++ÿÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿ---ÿ   ÿ   ÿ   ÿ   ÿ   ƒ                                                                                                                                                                                                                                                                                                       C   ø   ÿ   ÿ   ÿÿÈÈÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ:::ÿæææÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢¢¢ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÏÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÈÈÿÿ   ÿ   ÿ   ÿ   ø   C                                                                                                                                                                                                                                                                                                  Ô   ÿ   ÿ   ÿ   ÿ•••ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿAAAÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²²²ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ%%%ÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•••ÿ   ÿ   ÿ   ÿ   ÿ   Ô                                                                                                                                                                                                                                                                                              –   ÿ   ÿ   ÿ   ÿTTTÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ···ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿcccÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÖÖÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿBBBÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿTTTÿ   ÿ   ÿ   ÿ   ÿ   –                                                                                                                                                                                                                                                                                       K   û   ÿ   ÿ   ÿÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáááÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ���ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ>>>ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿuuuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáááÿÿ   ÿ   ÿ   ÿ   û   K                                                                                                                                                                                                                                                                                  ×   ÿ   ÿ   ÿÿ«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ\\\ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿßßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡‡‡ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ½½½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«««ÿÿ   ÿ   ÿ   ÿ   ×                                                                                                                                                                                                                                                                              ‡   ÿ   ÿ   ÿ   ÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»»»ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿcccÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ;;;ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿ   ÿ   ÿ   ÿ   ÿ   ‡                                                                                                                                                                                                                                                                       4   ó   ÿ   ÿ   ÿ   ÿåååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿBBBÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ			ÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿ   ÿ   ÿ   ÿ   ÿ   ó   4                                                                                                                                                                                                                                                                  »   ÿ   ÿ   ÿÿ£££ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ]]]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ888ÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£££ÿÿ   ÿ   ÿ   ÿ   »                                                                                                                                                                                                                                                              _   ÿ   ÿ   ÿ   ÿLLLÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿVVVÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÁÁÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿLLLÿ   ÿ   ÿ   ÿ   ÿ   _                                                                                                                                                                                                                                                          Ù   ÿ   ÿ   ÿÿÎÎÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãããÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ111ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿhhhÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÎÎÿÿ   ÿ   ÿ   ÿ   Ù                                                                                                                                                                                                                                                      |   ÿ   ÿ   ÿ   ÿyyyÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿIIIÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ%%%ÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyyyÿ   ÿ   ÿ   ÿ   ÿ   |                                                                                                                                                                                                                                                  ê   ÿ   ÿ   ÿ$$$ÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ___ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿçççÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìììÿ$$$ÿ   ÿ   ÿ   ÿ   ê                                                                                                                                                                                                                                              Œ   ÿ   ÿ   ÿ   ÿšššÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿ111ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWWWÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšššÿ   ÿ   ÿ   ÿ   ÿ   Œ                                                                                                                                                                                                                                       '   ð   ÿ   ÿ   ÿ555ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ˜˜˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ000ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿgggÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ444ÿ   ÿ   ÿ   ÿ   ð   '                                                                                                                                                                                                                                   ™   ÿ   ÿ   ÿÿ­­­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿvvvÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿKKKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­­­ÿÿ   ÿ   ÿ   ÿ   ™                                                                                                                                                                                                                               )   ñ   ÿ   ÿ   ÿ===ÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºººÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ```ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÜÜÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ666ÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ===ÿ   ÿ   ÿ   ÿ   ñ   )                                                                                                                                                                                                                           “   ÿ   ÿ   ÿÿ³³³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿRRRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ***ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³³³ÿÿ   ÿ   ÿ   ÿ   “                                                                                                                                                                                                                           ë   ÿ   ÿ   ÿBBBÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«««ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿNNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑÑÑÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ)))ÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿBBBÿ   ÿ   ÿ   ÿ   ì                                                                                                                                                                                                                       �   ÿ   ÿ   ÿÿ±±±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³³³ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿWWWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÖÖÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±±±ÿÿ   ÿ   ÿ   ÿ   �                                                                                                                                                                                                                  Ý   ÿ   ÿ   ÿ666ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂÂÂÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿjjjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâââÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿ666ÿ   ÿ   ÿ   ÿ   Ý                                                                                                                                                                                                              f   ÿ   ÿ   ÿ   ÿŸŸŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØØØÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ………ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿ###ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿWWWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸŸŸÿ   ÿ   ÿ   ÿ   ÿ   f                                                                                                                                                                                                          É   ÿ   ÿ   ÿ###ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿ!!!ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ@@@ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ{{{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿ###ÿ   ÿ   ÿ   ÿ   É                                                                                                                                                                                                      A   ý   ÿ   ÿ   ÿ~~~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿEEEÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÓÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqqqÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~~~ÿ   ÿ   ÿ   ÿ   ý   A                                                                                                                                                                                                       ÿ   ÿ   ÿÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|||ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ+++ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬¬¬ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿßßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿÿ   ÿ   ÿ   ÿ                                                                                                                                                                                                      ë   ÿ   ÿ   ÿZZZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÃÃÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿkkkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿAAAÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZZZÿ   ÿ   ÿ   ÿ   ë                                                                                                                                                                                              f   ÿ   ÿ   ÿÿ¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ...ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUUUÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ“““ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹¹¹ÿÿ   ÿ   ÿ   ÿ   f                                                                                                                                                                                          ¼   ÿ   ÿ   ÿ+++ÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡‡‡ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿãããÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿ+++ÿ   ÿ   ÿ   ÿ   ¼                                                                                                                                                                                      +   ô   ÿ   ÿ   ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ“““ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ111ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿkkkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ   ÿ   ÿ   ÿ   ô   +                                                                                                                                                                                   {   ÿ   ÿ   ÿÿÏÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{{{ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ(((ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢¢¢ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿØØØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÏÏÿÿ   ÿ   ÿ   ÿ   {                                                                                                                                                                                  Å   ÿ   ÿ   ÿ;;;ÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿªªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ???ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿ;;;ÿ   ÿ   ÿ   ÿ   Å                                                                                                                                                                              -   ö   ÿ   ÿ   ÿ‰‰‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ½½½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËËËÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ,,,ÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰‰‰ÿ   ÿ   ÿ   ÿ   ö   -                                                                                                                                                                           v   ÿ   ÿ   ÿÿÏÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿcccÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ¾¾¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÁÁÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÏÏÿÿ   ÿ   ÿ   ÿ   v                                                                                                                                                                          ¹   ÿ   ÿ   ÿ888ÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿ:::ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÄÄÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿXXXÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿ888ÿ   ÿ   ÿ   ÿ   ¹                                                                                                                                                                         î   ÿ   ÿ   ÿ~~~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿ('(ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÆÆÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿDDDÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿuuuÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~~~ÿ   ÿ   ÿ   ÿ   î                                                                                                                                                                      W   ÿ   ÿ   ÿÿÄÄÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔÔÔÿ)))ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÆÆÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿFFFÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿrrrÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÄÄÿÿ   ÿ   ÿ   ÿ   W                                                                                                                                                                   •   ÿ   ÿ   ÿ&&&ÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÿ<<<ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÉÉÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïÿVVVÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ………ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿ&&&ÿ   ÿ   ÿ   ÿ   •                                                                                                                                                                  Ð   ÿ   ÿ   ÿ\\\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿeeeÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÍÍÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ€€€ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿªªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\\\ÿ   ÿ   ÿ   ÿ   Ð                                                                                                                                                              )   õ   ÿ   ÿ   ÿžžžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨ÿ'''ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ


ÿgggÿ)))ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÿ:::ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿZZZÿÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžžžÿ   ÿ   ÿ   ÿ   õ   )                                                                                                                                                           [   ÿ   ÿ   ÿ			ÿÕÕÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿ‚‚‚ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿTTTÿÊÊÊÿÿÿÿÿÕÕÕÿ%%%ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÎÎÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿ———ÿ)))ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ@@@ÿ···ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÕÕÿ			ÿ   ÿ   ÿ   ÿ   [                                                                                                                                                           –   ÿ   ÿ   ÿ)))ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿ‹‹‹ÿ666ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿeeeÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÒÒÿ###ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ"""ÿÒÒÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿœœœÿBBBÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿXXXÿ¶¶¶ÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ)))ÿ   ÿ   ÿ   ÿ   –                                                                                                                                                          É   ÿ   ÿ   ÿ[[[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÉÉÉÿ‰‰‰ÿQQQÿ)))ÿÿÿ   ÿ   ÿ   ÿ   ÿÿÿ???ÿrrrÿ±±±ÿêêêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÐÐÿ!!!ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ%%%ÿÓÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓÿ•••ÿZZZÿ///ÿÿÿ   ÿ   ÿ   ÿ   ÿ


ÿÿ999ÿhhhÿ¥¥¥ÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[[[ÿ   ÿ   ÿ   ÿ   É                                                                                                                                                         ì   ÿ   ÿ   ÿ���ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿàààÿÌÌÌÿ½½½ÿ¸¸¸ÿ»»»ÿÅÅÅÿØØØÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍÍÍÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ$$$ÿÔÔÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿäääÿÏÏÏÿ¿¿¿ÿ¸¸¸ÿºººÿÃÃÃÿÔÔÔÿéééÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ì                                                                                                                                                      @   þ   ÿ   ÿÿÁÁÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ&&&ÿÖÖÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÿÿ   ÿ   ÿ   þ   @                                                                                                                                                   l   ÿ   ÿ   ÿÿåååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ***ÿÙÙÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿÿ   ÿ   ÿ   ÿ   l                                                                                                                                                   ž   ÿ   ÿ   ÿ777ÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÈÈÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ***ÿÙÙÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿ777ÿ   ÿ   ÿ   ÿ   ž                                                                                                                                                  Æ   ÿ   ÿ   ÿbbbÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅÅÅÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ,,,ÿÚÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿbbbÿ   ÿ   ÿ   ÿ   Æ                                                                                                                                                 â   ÿ   ÿ   ÿŠŠŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÄÄÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠŠŠÿ   ÿ   ÿ   ÿ   â                                                                                                                                              +   ö   ÿ   ÿ   ÿ±±±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ000ÿÝÝÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±±±ÿ   ÿ   ÿ   ÿ   ö   +                                                                                                                                           F   ÿ   ÿ   ÿÿÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ111ÿßßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÐÐÿÿ   ÿ   ÿ   ÿ   F                                                                                                                                           i   ÿ   ÿ   ÿÿçççÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾¾¾ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ222ÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçççÿÿ   ÿ   ÿ   ÿ   i                                                                                                                                           ‰   ÿ   ÿ   ÿ...ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ555ÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿ...ÿ   ÿ   ÿ   ÿ   ‰                                                                                                                                           ¤   ÿ   ÿ   ÿKKKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºººÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ555ÿäääÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿKKKÿ   ÿ   ÿ   ÿ   ¤                                                                                                                                           ½   ÿ   ÿ   ÿdddÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸¸¸ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ888ÿåååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿdddÿ   ÿ   ÿ   ÿ   ½                                                                                                                                          Ð   ÿ   ÿ   ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶¶¶ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ;;;ÿçççÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ   ÿ   ÿ   ÿ   Ð                                                                                                                                         à   ÿ   ÿ   ÿ”””ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´´´ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ===ÿçççÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””ÿ   ÿ   ÿ   ÿ   à                                                                                                                                         í   ÿ   ÿ   ÿ©©©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²²²ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ???ÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©©©ÿ   ÿ   ÿ   ÿ   í                                                                                                                                      *   ô   ÿ   ÿ   ÿ»»»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯¯¯ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿBBBÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»»»ÿ   ÿ   ÿ   ÿ   ô   *                                                                                                                                   6   û   ÿ   ÿÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­­­ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿDDDÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇÿÿ   ÿ   ÿ   û   6                                                                                                                                   A   ÿ   ÿ   ÿÿÓÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«««ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿEEEÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓÿÿ   ÿ   ÿ   ÿ   A                                                                                                                                   K   ÿ   ÿ   ÿÿÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨ÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿHHHÿïïïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÜÜÿÿ   ÿ   ÿ   ÿ   K                                                                                                                                   T   ÿ   ÿ   ÿÿãããÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿKKKÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãããÿÿ   ÿ   ÿ   ÿ   T                                                                                                                                   \   ÿ   ÿ   ÿÿèèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£££ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿLLLÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿÿ   ÿ   ÿ   ÿ   \                                                                                                                                   a   ÿ   ÿ   ÿÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿNNNÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿÿ   ÿ   ÿ   ÿ   a                                                                                                                                   c   ÿ   ÿ   ÿÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸŸŸÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿQQQÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíííÿÿ   ÿ   ÿ   ÿ   c                                                                                                                                   f   ÿ   ÿ   ÿÿîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿTTTÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿÿ   ÿ   ÿ   ÿ   f                                                                                                                                   c   ÿ   ÿ   ÿÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™™™ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿUUUÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìììÿÿ   ÿ   ÿ   ÿ   c                                                                                                                                   a   ÿ   ÿ   ÿÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ———ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿWWWÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿÿ   ÿ   ÿ   ÿ   a                                                                                                                                   \   ÿ   ÿ   ÿÿèèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”””ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿZZZÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿÿ   ÿ   ÿ   ÿ   \                                                                                                                                   S   ÿ   ÿ   ÿÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘‘‘ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ[[[ÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâââÿÿ   ÿ   ÿ   ÿ   S                                                                                                                                   J   ÿ   ÿ   ÿÿÛÛÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ\\\ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿÿ   ÿ   ÿ   ÿ   J                                                                                                                                   @   ÿ   ÿ   ÿÿÑÑÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽŽŽÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ```ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑÑÑÿÿ   ÿ   ÿ   ÿ   @                                                                                                                                   4   ú   ÿ   ÿÿÆÆÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿbbbÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÆÆÿÿ   ÿ   ÿ   ú   4                                                                                                                                   (   ô   ÿ   ÿ   ÿ¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰‰‰ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿdddÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹¹¹ÿ   ÿ   ÿ   ÿ   ô   (                                                                                                                                      ì   ÿ   ÿ   ÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†††ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿhhhÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿ   ÿ   ÿ   ÿ   ì                                                                                                                                         Þ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ………ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿjjjÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’’’ÿ   ÿ   ÿ   ÿ   Þ                                                                                                                                         Î   ÿ   ÿ   ÿ~~~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚‚‚ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿmmmÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~~~ÿ   ÿ   ÿ   ÿ   Î                                                                                                                                          »   ÿ   ÿ   ÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿoooÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿ   ÿ   ÿ   ÿ   »                                                                                                                                           ¡   ÿ   ÿ   ÿHHHÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~~~ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿrrrÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿHHHÿ   ÿ   ÿ   ÿ   ¡                                                                                                                                           …   ÿ   ÿ   ÿ***ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿzzzÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿsssÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ***ÿ   ÿ   ÿ   ÿ   …                                                                                                                                           e   ÿ   ÿ   ÿÿåååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿxxxÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿvvvÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿÿ   ÿ   ÿ   ÿ   e                                                                                                                                           C   ÿ   ÿ   ÿÿÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿvvvÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿzzzÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÿÿ   ÿ   ÿ   ÿ   C                                                                                                                                           '   ô   ÿ   ÿ   ÿ¬¬¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿsssÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ|||ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬¬¬ÿ   ÿ   ÿ   ÿ   ô   '                                                                                                                                              ß   ÿ   ÿ   ÿ†††ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿpppÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ|||ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†††ÿ   ÿ   ÿ   ÿ   ß                                                                                                                                                 Á   ÿ   ÿ   ÿ]]]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿmmmÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ���ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]]]ÿ   ÿ   ÿ   ÿ   Á                                                                                                                                                  —   ÿ   ÿ   ÿ222ÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿlllÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ„„„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ222ÿ   ÿ   ÿ   ÿ   —                                                                                                                                                   f   ÿ   ÿ   ÿÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿhhhÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ………ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáááÿÿ   ÿ   ÿ   ÿ   f                                                                                                                                                   ;   ý   ÿ   ÿÿ¼¼¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿàààÿÌÌÌÿ½½½ÿ¸¸¸ÿ»»»ÿÅÅÅÿØØØÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿeeeÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ‡‡‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿäääÿÏÏÏÿ¿¿¿ÿ¸¸¸ÿºººÿÃÃÃÿÔÔÔÿéééÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼ÿÿ   ÿ   ÿ   ý   ;                                                                                                                                                      é   ÿ   ÿ   ÿ‰‰‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÈÈÈÿ‰‰‰ÿQQQÿ)))ÿÿÿ   ÿ   ÿ   ÿ   ÿÿÿ???ÿrrrÿ°°°ÿêêêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿdddÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓÿ•••ÿZZZÿ///ÿÿÿ   ÿ   ÿ   ÿ   ÿ


ÿÿ999ÿhhhÿ¥¥¥ÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰‰‰ÿ   ÿ   ÿ   ÿ   é                                                                                                                                                         Ã   ÿ   ÿ   ÿTTTÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿ‹‹‹ÿ666ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿeeeÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ```ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿŒŒŒÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿœœœÿBBBÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿXXXÿ¶¶¶ÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTTTÿ   ÿ   ÿ   ÿ   Ã                                                                                                                                                          �   ÿ   ÿ   ÿ$$$ÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿ‚‚‚ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿTTTÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ\\\ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ���ÿñññÿ———ÿ)))ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ???ÿ···ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿ$$$ÿ   ÿ   ÿ   ÿ   �                                                                                                                                                           T   ÿ   ÿ   ÿÿÎÎÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨ÿ'''ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ


ÿrrrÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ]]]ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ)))ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿYYYÿÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÎÎÿÿ   ÿ   ÿ   ÿ   T                                                                                                                                                           #   ò   ÿ   ÿ   ÿ•••ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿeeeÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ000ÿÃÃÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ[[[ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿªªªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•••ÿ   ÿ   ÿ   ÿ   ò   #                                                                                                                                                              Ê   ÿ   ÿ   ÿUUUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÿ<<<ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ£££ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿWWWÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ………ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUUUÿ   ÿ   ÿ   ÿ   Ê                                                                                                                                                                  Ž   ÿ   ÿ   ÿ   ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔÔÔÿ)))ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ•••ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿUUUÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿrrrÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿ   ÿ   ÿ   ÿ   ÿ   Ž                                                                                                                                                                   N   ÿ   ÿ   ÿÿ»»»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛÿ('(ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿš™™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿUUUÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿuuuÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»»»ÿÿ   ÿ   ÿ   ÿ   N                                                                                                                                                                      é   ÿ   ÿ   ÿuuuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿ:::ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ			ÿ´´´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿQQQÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿuuuÿ   ÿ   ÿ   ÿ   é                                                                                                                                                                          ²   ÿ   ÿ   ÿ222ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿcccÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿSSSÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÁÁÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿ222ÿ   ÿ   ÿ   ÿ   ²                                                                                                                                                                           l   ÿ   ÿ   ÿÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿOOOÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ,,,ÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇÿÿ   ÿ   ÿ   ÿ   l                                                                                                                                                                           %   ñ   ÿ   ÿ   ÿ~~~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèèèÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ¥¥¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿAAAÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~~~ÿ   ÿ   ÿ   ÿ   ñ   %                                                                                                                                                                              ½   ÿ   ÿ   ÿ333ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{{{ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ(((ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢¢¢ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿØØØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿ333ÿ   ÿ   ÿ   ÿ   ½                                                                                                                                                                                  p   ÿ   ÿ   ÿÿÆÆÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ“““ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ111ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿkkkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÆÆÿÿ   ÿ   ÿ   ÿ   p                                                                                                                                                                                   "   ï   ÿ   ÿ   ÿtttÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡‡‡ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿãããÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtttÿ   ÿ   ÿ   ÿ   ï   "                                                                                                                                                                                       ³   ÿ   ÿ   ÿ###ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ...ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUUUÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ“““ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿ###ÿ   ÿ   ÿ   ÿ   ³                                                                                                                                                                                           [   ÿ   ÿ   ÿ   ÿ¯¯¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÃÃÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿkkkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿAAAÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯¯¯ÿ   ÿ   ÿ   ÿ   ÿ   [                                                                                                                                                                                              ã   ÿ   ÿ   ÿMMMÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|||ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ+++ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬¬¬ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿßßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿMMMÿ   ÿ   ÿ   ÿ   ã                                                                                                                                                                                                  ”   ÿ   ÿ   ÿ


ÿÒÒÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿEEEÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÓÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqqqÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÒÒÿ


ÿ   ÿ   ÿ   ÿ   ”                                                                                                                                                                                                   8   ú   ÿ   ÿ   ÿrrrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿ!!!ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ«««ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ@@@ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ{{{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrrrÿ   ÿ   ÿ   ÿ   ú   8                                                                                                                                                                                                      ½   ÿ   ÿ   ÿÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØØØÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ………ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿ###ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿWWWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿÿ   ÿ   ÿ   ÿ   ½                                                                                                                                                                                                          X   ÿ   ÿ   ÿ   ÿ���ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂÂÂÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿjjjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâââÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ@@@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   X                                                                                                                                                                                                              Õ   ÿ   ÿ   ÿ,,,ÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³³³ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿXXXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÖÖÿ


ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿ,,,ÿ   ÿ   ÿ   ÿ   Õ                                                                                                                                                                                                                  t   ÿ   ÿ   ÿ   ÿ¤¤¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«««ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿNNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑÑÑÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ)))ÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤ÿ   ÿ   ÿ   ÿ   ÿ   t                                                                                                                                                                                                                      ã   ÿ   ÿ   ÿ555ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®®®ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿRRRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ***ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ555ÿ   ÿ   ÿ   ÿ   ã                                                                                                                                                                                                                          †   ÿ   ÿ   ÿ   ÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºººÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ```ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÜÜÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ666ÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿ   ÿ   ÿ   ÿ   ÿ   †                                                                                                                                                                                                                              ë   ÿ   ÿ   ÿ222ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿvvvÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿKKKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿ222ÿ   ÿ   ÿ   ÿ   ë                                                                                                                                                                                                                                  ‰   ÿ   ÿ   ÿ   ÿœœœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ˜˜˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿ000ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿgggÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœœœÿ   ÿ   ÿ   ÿ   ÿ   ‰                                                                                                                                                                                                                                      è   ÿ   ÿ   ÿ(((ÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿ111ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWWWÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿ(((ÿ   ÿ   ÿ   ÿ   è                                                                                                                                                                                                                                          }   ÿ   ÿ   ÿ   ÿ‹‹‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ___ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿçççÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÆÆÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹ÿ   ÿ   ÿ   ÿ   ÿ   }                                                                                                                                                                                                                                              à   ÿ   ÿ   ÿÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿIIIÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ%%%ÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâââÿÿ   ÿ   ÿ   ÿ   à                                                                                                                                                                                                                                                  j   ÿ   ÿ   ÿ   ÿgggÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãããÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ’’’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ111ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿhhhÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgggÿ   ÿ   ÿ   ÿ   ÿ   j                                                                                                                                                                                                                                                      Î   ÿ   ÿ   ÿÿÁÁÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿVVVÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÿÿ   ÿ   ÿ   ÿ   Î                                                                                                                                                                                                                                                          O   ü   ÿ   ÿ   ÿ===ÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ]]]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ888ÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ===ÿ   ÿ   ÿ   ÿ   ü   O                                                                                                                                                                                                                                                              ª   ÿ   ÿ   ÿ   ÿ‘‘‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿBBBÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ			ÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfffÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘‘‘ÿ   ÿ   ÿ   ÿ   ÿ   ª                                                                                                                                                                                                                                                                  &   ì   ÿ   ÿ   ÿÿÚÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»»»ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿcccÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ;;;ÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿÿ   ÿ   ÿ   ÿ   ì   &                                                                                                                                                                                                                                                                       v   ÿ   ÿ   ÿ   ÿPPPÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ\\\ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿßßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡‡‡ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ½½½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿPPPÿ   ÿ   ÿ   ÿ   ÿ   v                                                                                                                                                                                                                                                                           
   È   ÿ   ÿ   ÿ   ÿ———ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáááÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ���ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ>>>ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿuuuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ———ÿ   ÿ   ÿ   ÿ   ÿ   È   
                                                                                                                                                                                                                                                                               :   õ   ÿ   ÿ   ÿÿÔÔÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ···ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿcccÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÖÖÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿBBBÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔÔÔÿÿ   ÿ   ÿ   ÿ   õ   :                                                                                                                                                                                                                                                                                       „   ÿ   ÿ   ÿ   ÿDDDÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ���ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿAAAÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²²²ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ%%%ÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿDDDÿ   ÿ   ÿ   ÿ   ÿ   „                                                                                                                                                                                                                                                                                              Ä   ÿ   ÿ   ÿ   ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ:::ÿæææÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢¢¢ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÏÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€ÿ   ÿ   ÿ   ÿ   ÿ   Ä                                                                                                                                                                                                                                                                                                  3   ð   ÿ   ÿ   ÿÿµµµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†††ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿCCCÿæææÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¨¨ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ+++ÿÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿÿ   ÿ   ÿ   ÿ   ð   3                                                                                                                                                                                                                                                                                                       p   ÿ   ÿ   ÿ   ÿÿÝÝÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿaaaÿðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾¾¾ÿ###ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿFFFÿàààÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÿÿ   ÿ   ÿ   ÿ   ÿ   p                                                                                                                                                                                                                                                                                                              ­   ÿ   ÿ   ÿ   ÿFFFÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍÍÍÿ>>>ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ™™™ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßßßÿXXXÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ|||ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿFFFÿ   ÿ   ÿ   ÿ   ÿ   ­                                                                                                                                                                                                                                                                                                                     ×   ÿ   ÿ   ÿ   ÿpppÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ‘‘‘ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ]]]ÿÙÙÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§§§ÿ---ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿIIIÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpppÿ   ÿ   ÿ   ÿ   ÿ   ×                                                                                                                                                                                                                                                                                                                          ;   ó   ÿ   ÿ   ÿÿ˜˜˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçççÿƒƒƒÿ%%%ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿZZZÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿ™™™ÿ333ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿHHHÿ´´´ÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜˜˜ÿÿ   ÿ   ÿ   ÿ   ó   ;                                                                                                                                                                                                                                                                                                                               l   ÿ   ÿ   ÿ   ÿÿ···ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïÿ¨¨¨ÿYYYÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ@@@ÿ‡‡‡ÿØØØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿ¶¶¶ÿfffÿ)))ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ555ÿyyyÿÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ···ÿÿ   ÿ   ÿ   ÿ   ÿ   l                                                                                                                                                                                                                                                                                                                                      —   ÿ   ÿ   ÿ   ÿÿÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿÇÇÇÿšššÿvvvÿZZZÿMMMÿGGGÿJJJÿTTTÿjjjÿŒŒŒÿµµµÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿÎÎÎÿ¡¡¡ÿ}}}ÿ^^^ÿOOOÿGGGÿHHHÿRRRÿeeeÿ………ÿ­­­ÿÚÚÚÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÐÐÿÿ   ÿ   ÿ   ÿ   ÿ   —                                                                                                                                                                                                                                                                                                                                             ¹   ÿ   ÿ   ÿ   ÿ***ÿáááÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáááÿ***ÿ   ÿ   ÿ   ÿ   ÿ   ¹                                                                                                                                                                                                                                                                                                                                                     Ô   ÿ   ÿ   ÿ   ÿ<<<ÿëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëëÿ<<<ÿ   ÿ   ÿ   ÿ   ÿ   Ô                                                                                                                                                                                                                                                                                                                                                          1   ç   ÿ   ÿ   ÿ   ÿHHHÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿHHHÿ   ÿ   ÿ   ÿ   ÿ   ç   1                                                                                                                                                                                                                                                                                                                                                               E   ñ   ÿ   ÿ   ÿ   ÿSSSÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿSSSÿ   ÿ   ÿ   ÿ   ÿ   ñ   E                                                                                                                                                                                                                                                                                                                                                                       X   ø   ÿ   ÿ   ÿ   ÿZZZÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿZZZÿ   ÿ   ÿ   ÿ   ÿ   ø   X                                                                                                                                                                                                                                                                                                                                                                               g   ü   ÿ   ÿ   ÿ   ÿ\\\ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿ\\\ÿ   ÿ   ÿ   ÿ   ÿ   ü   g                                                                                                                                                                                                                                                                                                                                                                                       s   þ   ÿ   ÿ   ÿ   ÿVVVÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿVVVÿ   ÿ   ÿ   ÿ   ÿ   þ   s                                                                                                                                                                                                                                                                                                                                                                                               x   ÿ   ÿ   ÿ   ÿ   ÿNNNÿîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿNNNÿ   ÿ   ÿ   ÿ   ÿ   ÿ   x                                                                                                                                                                                                                                                                                                                                                                                                       z   þ   ÿ   ÿ   ÿ   ÿCCCÿæææÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæææÿCCCÿ   ÿ   ÿ   ÿ   ÿ   þ   z                                                                                                                                                                                                                                                                                                                                                                                                               u   ý   ÿ   ÿ   ÿ   ÿ333ÿ×××ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×××ÿ333ÿ   ÿ   ÿ   ÿ   ÿ   ý   u                                                                                                                                                                                                                                                                                                                                                                                                                       m   ú   ÿ   ÿ   ÿ   ÿ!!!ÿÂÂÂÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂÂÂÿ!!!ÿ   ÿ   ÿ   ÿ   ÿ   ú   m                                                                                                                                                                                                                                                                                                                                                                                                                               _   õ   ÿ   ÿ   ÿ   ÿÿ¦¦¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦ÿÿ   ÿ   ÿ   ÿ   ÿ   õ   _                                                                                                                                                                                                                                                                                                                                                                                                                                       O   ì   ÿ   ÿ   ÿ   ÿÿƒƒƒÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿƒƒƒÿÿ   ÿ   ÿ   ÿ   ÿ   ì   O                                                                                                                                                                                                                                                                                                                                                                                                                                               ;   Ü   ÿ   ÿ   ÿ   ÿ   ÿYYYÿéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééÿYYYÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ü   ;                                                                                                                                                                                                                                                                                                                                                                                                                                                       $   Ä   ÿ   ÿ   ÿ   ÿ   ÿ///ÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇÿ///ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ä   $                                                                                                                                                                                                                                                                                                                                                                                                                                                                  §   ÿ   ÿ   ÿ   ÿ   ÿÿ™™™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™™™ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   §                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ú   ÿ   ÿ   ÿ   ÿ   ÿ^^^ÿåååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååÿ^^^ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ú                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         P   ä   ÿ   ÿ   ÿ   ÿ   ÿ%%%ÿ³³³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³³³ÿ%%%ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ä   P                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               *   Á   ÿ   ÿ   ÿ   ÿ   ÿÿrrrÿìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìììÿrrrÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Á   *                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          Š   ú   ÿ   ÿ   ÿ   ÿ   ÿ---ÿ²²²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²²²ÿ---ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ú   Š                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      M   Ù   ÿ   ÿ   ÿ   ÿ   ÿÿ```ÿÝÝÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÝÝÿ```ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ù   M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  £   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ���ÿöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ���ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   £                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              Z   Þ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ:::ÿµµµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿ:::ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Þ   Z                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          ›   ú   ÿ   ÿ   ÿ   ÿ   ÿÿPPPÿÆÆÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÆÆÿPPPÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ú   ›                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      G   Ë   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ```ÿÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÐÐÿ```ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   Ë   G                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  x   é   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿeeeÿÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÐÐÿeeeÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   é   x                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              $   –   õ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ\\\ÿÄÄÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÄÄÿ\\\ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   õ   –   $                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           6   ­   ü   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿGGGÿ­­­ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿ­­­ÿGGGÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ü   ­   6                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           D   º   þ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ...ÿŒŒŒÿßßßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßßßÿŒŒŒÿ...ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   þ   º   D                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          J   ·   ü   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ[[[ÿ±±±ÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿ±±±ÿ[[[ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ü   ·   J                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          @   ©   õ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ'''ÿqqqÿ¾¾¾ÿõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõõÿ¾¾¾ÿqqqÿ'''ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   õ   ©   @                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           2   ’   è   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ,,,ÿsssÿ¼¼¼ÿñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññÿ¼¼¼ÿsssÿ,,,ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   è   ’   2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              q   Ì   þ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ$$$ÿ___ÿ¡¡¡ÿÙÙÙÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÙÙÙÿ¡¡¡ÿ___ÿ$$$ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   þ   Ì   q                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 C   œ   å   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ333ÿjjjÿ¥¥¥ÿÔÔÔÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿÔÔÔÿ¥¥¥ÿjjjÿ333ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   å   œ   C                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     _   ²   í   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ			ÿ(((ÿUUUÿƒƒƒÿ°°°ÿÔÔÔÿíííÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿíííÿÔÔÔÿ°°°ÿƒƒƒÿUUUÿ(((ÿ			ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   í   ²   _                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          !   f   ±   é   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ???ÿ```ÿƒƒƒÿ   ÿ»»»ÿÐÐÐÿãããÿðððÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿðððÿãããÿÐÐÐÿ»»»ÿ   ÿƒƒƒÿ```ÿ???ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   é   ±   f   !                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  S   —   Ó   ø   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ"""ÿ///ÿ@@@ÿMMMÿYYYÿ```ÿiiiÿsssÿvvvÿzzzÿzzzÿvvvÿsssÿiiiÿ```ÿYYYÿMMMÿ@@@ÿ///ÿ"""ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ø   Ó   —   S                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          	   0   g   ¥   Ø   ö   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ö   Ø   ¥   g   0   	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      +   Y   Ž   ¾   á   ÷   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÷   á   ¾   Ž   Y   +                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             -   O   x   �   ¼   Ö   ê   ÷   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÷   ê   Ö   ¼   �   x   O   -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
      -   C   X   n   ‚   ‘       ­   ¶   ¾   Ä   Æ   È   È   Æ   Ä   ¾   ¶   ­       ‘   ‚   n   X   C   -      
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü  ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü    ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø        ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà        ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü              ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü                ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿø                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿð                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                  ÿÿÿÿÿÿÿÿÿÿÿÿÿþ                  ÿÿÿÿÿÿÿÿÿÿÿÿü                  ?ÿÿÿÿÿÿÿÿÿÿÿÿø                  ÿÿÿÿÿÿÿÿÿÿÿÿà                  ÿÿÿÿÿÿÿÿÿÿÿÿÀ                  ÿÿÿÿÿÿÿÿÿÿÿÿ€                  ÿÿÿÿÿÿÿÿÿÿÿÿ                    ÿÿÿÿÿÿÿÿÿÿÿþ                    ÿÿÿÿÿÿÿÿÿÿþ                    ÿÿÿÿÿÿÿÿÿÿü                    ?ÿÿÿÿÿÿÿÿÿÿø                    ÿÿÿÿÿÿÿÿÿÿð                    ÿÿÿÿÿÿÿÿÿÿà                    ÿÿÿÿÿÿÿÿÿÿÀ                    ÿÿÿÿÿÿÿÿÿÿ€                    ÿÿÿÿÿÿÿÿÿÿ                      ÿÿÿÿÿÿÿÿÿÿ                      ÿÿÿÿÿÿÿÿÿþ                      ÿÿÿÿÿÿÿÿü                      ?ÿÿÿÿÿÿÿÿø                      ÿÿÿÿÿÿÿÿø                      ÿÿÿÿÿÿÿÿð                      ÿÿÿÿÿÿÿÿà                      ÿÿÿÿÿÿÿÿà                      ÿÿÿÿÿÿÿÿÀ                      ÿÿÿÿÿÿÿÿ€                      ÿÿÿÿÿÿÿÿ€                      ÿÿÿÿÿÿÿÿ                        ÿÿÿÿÿÿÿÿ                        ÿÿÿÿÿÿÿþ                        ÿÿÿÿÿÿþ                        ÿÿÿÿÿÿü                        ?ÿÿÿÿÿÿø                        ÿÿÿÿÿÿø                        ÿÿÿÿÿÿð                        ÿÿÿÿÿÿð                        ÿÿÿÿÿÿà                        ÿÿÿÿÿÿà                        ÿÿÿÿÿÿÀ                        ÿÿÿÿÿÿÀ                        ÿÿÿÿÿÿÀ                        ÿÿÿÿÿÿ€                        ÿÿÿÿÿÿ€                        ÿÿÿÿÿÿ                          ÿÿÿÿÿÿ                          ÿÿÿÿÿÿ                          ÿÿÿÿÿþ                          ÿÿÿÿþ                          ÿÿÿÿþ                          ÿÿÿÿü                          ?ÿÿÿÿü                          ?ÿÿÿÿü                          ?ÿÿÿÿø                          ÿÿÿÿø                          ÿÿÿÿø                          ÿÿÿÿð                          ÿÿÿÿð                          ÿÿÿÿð                          ÿÿÿÿð                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿ€                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿÀ                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿà                          ÿÿÿÿð                          ÿÿÿÿð                          ÿÿÿÿð                          ÿÿÿÿð                          ÿÿÿÿø                          ÿÿÿÿø                          ÿÿÿÿø                          ÿÿÿÿü                          ?ÿÿÿÿü                          ?ÿÿÿÿü                          ?ÿÿÿÿþ                          ÿÿÿÿþ                          ÿÿÿÿþ                          ÿÿÿÿÿ                          ÿÿÿÿÿÿ                          ÿÿÿÿÿÿ                          ÿÿÿÿÿÿ€                        ÿÿÿÿÿÿ€                        ÿÿÿÿÿÿÀ                        ÿÿÿÿÿÿÀ                        ÿÿÿÿÿÿà                        ÿÿÿÿÿÿà                        ÿÿÿÿÿÿà                        ÿÿÿÿÿÿð                        ÿÿÿÿÿÿð                        ÿÿÿÿÿÿø                        ÿÿÿÿÿÿü                        ?ÿÿÿÿÿÿü                        ?ÿÿÿÿÿÿþ                        ÿÿÿÿÿÿþ                        ÿÿÿÿÿÿÿ                        ÿÿÿÿÿÿÿÿ                        ÿÿÿÿÿÿÿÿ€                      ÿÿÿÿÿÿÿÿÀ                      ÿÿÿÿÿÿÿÿÀ                      ÿÿÿÿÿÿÿÿà                      ÿÿÿÿÿÿÿÿà                      ÿÿÿÿÿÿÿÿð                      ÿÿÿÿÿÿÿÿø                      ÿÿÿÿÿÿÿÿü                      ?ÿÿÿÿÿÿÿÿü                      ?ÿÿÿÿÿÿÿÿþ                      ÿÿÿÿÿÿÿÿÿ                      ÿÿÿÿÿÿÿÿÿÿ€                    ÿÿÿÿÿÿÿÿÿÿ€                    ÿÿÿÿÿÿÿÿÿÿÀ                    ÿÿÿÿÿÿÿÿÿÿà                    ÿÿÿÿÿÿÿÿÿÿð                    ÿÿÿÿÿÿÿÿÿÿø                    ÿÿÿÿÿÿÿÿÿÿü                    ?ÿÿÿÿÿÿÿÿÿÿþ                    ÿÿÿÿÿÿÿÿÿÿÿ                    ÿÿÿÿÿÿÿÿÿÿÿÿ€                  ÿÿÿÿÿÿÿÿÿÿÿÿÀ                  ÿÿÿÿÿÿÿÿÿÿÿÿà                  ÿÿÿÿÿÿÿÿÿÿÿÿð                  ÿÿÿÿÿÿÿÿÿÿÿÿø                  ÿÿÿÿÿÿÿÿÿÿÿÿü                  ?ÿÿÿÿÿÿÿÿÿÿÿÿþ                  ÿÿÿÿÿÿÿÿÿÿÿÿÿ                  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿà                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿð                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿø                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿü                ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü              ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü          ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà        ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü        ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(   €                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 '>R`ktxxtk`R>'                                                                                                                                                                                                                                                                                                                                                                                                                               N}§Ê   ç   ø   þ   þ   þ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   þ   þ   þ   ø   çÊ§}N                                                                                                                                                                                                                                                                                                                                                                                                O‘É   ô   ÿ   þ   þ   ÿ   þÿþ+++ý:::üGGGüOOOûRRRûRRRûOOOûGGGü:::ü+++ýþÿ   þ   ÿ   þ   þ   ÿ   ôÉ‘O                                                                                                                                                                                                                                                                                                                                                                        W¨è   ÿ   þ   þÿýKKKûuuuû   üÀÀÀýÚÚÚþíííþúúúþþþþþÿÿÿþþþþþÿÿÿþÿÿÿþþþþþÿÿÿþþþþþúúúþíííþÚÚÚþÀÀÀý   üuuuûKKKûýÿ   þ   þ   ÿè¨W                                                                                                                                                                                                                                                                                                                                                    4”ä   ÿ   þ   ÿýTTTû•••üËËËþóóóþÿÿÿþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿýýýÿýýýÿýýýÿýýýÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿþóóóþËËËþ•••üTTTûý   ÿ   þ   ÿä”4                                                                                                                                                                                                                                                                                                                                   M¹   ú   ÿ   þýcccû°°°ýìììþÿÿÿþþþþÿþþþþÿÿÿÿþþþÿûûûÿûûûÿüüüÿýýýÿýýýÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿýýýÿýýýÿüüüÿûûûÿûûûÿþþþÿÿÿÿÿþþþþþþþÿÿÿÿþìììþ°°°ýcccûý   þ   ÿ   ú¹M                                                                                                                                                                                                                                                                                                                  PÈ   ÿ   þþ@@@û¡¡¡ýìììþÿÿÿþþþþþÿÿÿÿýýýÿûûûÿüüüÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿüüüÿûûûÿýýýÿÿÿÿÿþþþþÿÿÿþìììþ¡¡¡ý@@@ûþ   þ   ÿÈP                                                                                                                                                                                                                                                                                                    ?Áÿ   þ			ý]]]ûÆÆÆþþþþþþþþÿþþþþüüüÿûûûÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýýýÿûûûÿüüüÿþþþþþþþÿþþþþÆÆÆþ]]]û			ý   þÿÁ?                                                                                                                                                                                                                                                                                        ¡ü   ÿü```üÔÔÔþÿÿÿÿþþþþýýýÿûûûÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýýýÿûûûÿýýýÿþþþþÿÿÿÿÔÔÔþ```üü   ÿü¡                                                                                                                                                                                                                                                                            eë   ÿ   üMMMüÎÎÎþÿÿÿÿþþþþüüüÿüüüÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿüüüÿþþþþÿÿÿÿÎÎÎþMMMü   ü   ÿëe                                                                                                                                                                                                                                                                 ²ÿ   ý'''ü¯¯¯þÿÿÿÿþþþþüüüÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿüüüÿþþþþÿÿÿÿ¯¯¯þ'''ü   ýÿ²                                                                                                                                                                                                                                                    Mç   ÿûqqqýñññÿÿÿÿþüüüþüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿüüüþÿÿÿþñññÿqqqýû   ÿç   M                                                                                                                                                                                                                                  �þ   þ"""ü»»»þÿÿÿÿýýýþüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿýýýþÿÿÿÿ»»»þ"""ü   þþ�                                                                                                                                                                                                                             ©ÿ   üSSSýéééÿÿÿÿþûûûþýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýÿûûûþÿÿÿþéééÿSSSý   üÿ©                                                                                                                                                                                                                        Èÿ   û„„„þÿÿÿÿþþþþüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿþþþþÿÿÿÿ„„„þ   ûÿÈ                                                                                                                                                                                                                $Ù   ÿû¨¨¨þÿÿÿÿüüüþýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýÿüüüþÿÿÿÿ¨¨¨þû   ÿÙ   $                                                                                                                                                                                                     (ß   ÿûÃÃÃÿÿÿÿþûûûþþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûþÿÿÿþÃÃÃÿû   ÿß   (                                                                                                                                                                                             'à   ÿûÒÒÒÿÿÿÿþûûûþþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûþÿÿÿþÒÒÒÿû   ÿà   '                                                                                                                                                                                     Ù   ÿû×××ÿÿÿÿþûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿûûûÿûûûÿûûûÿüüüÿýýýÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿýýýÿûûûÿûûûÿûûûÿûûûÿýýýÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿþ×××ÿû   ÿÙ                                                                                                                                                                                Í   ÿûÔÔÔÿÿÿÿþûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿýýýÿüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿþÔÔÔÿû   ÿÍ                                                                                                                                                                         ¯   ÿûÇÇÇÿÿÿÿþûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿöööÿÎÎÎÿ­­­ÿŸŸŸÿ¢¢¢ÿµµµÿÜÜÜÿýýýÿÿÿÿÿþþþÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿøøøÿÒÒÒÿ¯¯¯ÿ   ÿ¡¡¡ÿ²²²ÿØØØÿûûûÿÿÿÿÿþþþÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿþÇÇÇÿû   ÿ¯                                                                                                                                                                  Š   ÿû®®®þÿÿÿþûûûþÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿýýýÿÿÿÿÿÔÔÔÿoooÿ%%%ÿÿ   ÿ   ÿ   ÿ   ÿ			ÿ888ÿŽŽŽÿíííÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿÜÜÜÿxxxÿ***ÿÿ   ÿ   ÿ   ÿ   ÿÿ222ÿ………ÿæææÿÿÿÿÿüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûþÿÿÿþ®®®þû   ÿŠ                                                                                                                                                             [ÿ   üŒŒŒþÿÿÿÿûûûþþþþÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿðððÿrrrÿÿ   ÿ   ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿÿ¡¡¡ÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿöööÿ€€€ÿÿ   ÿ   ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿÿ“““ÿýýýÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿþþþÿûûûþÿÿÿÿŒŒŒþ   üÿ   [                                                                                                                                                     *ë   ÿ___ýÿÿÿÿüüüþþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÞÞÞÿ222ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿÿ   ÿgggÿúúúÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿçççÿ@@@ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿÿ   ÿXXXÿóóóÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüþÿÿÿÿ___ý   ÿë   *                                                                                                                                              ¾   ÿ000ûîîîÿÿÿÿþýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿßßßÿ$$$ÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿ]]]ÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿéééÿ222ÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿKKKÿ÷÷÷ÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿþîîîÿ000û   ÿ¾                                                                                                                                          w   ÿüÅÅÅþÿÿÿþûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿùùùÿ===ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿÿÿÿÿüüüÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿPPPÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿmmmÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿþÅÅÅþü   ÿw                                                                                                                                     .ò   ÿƒƒƒþÿÿÿþûûûþþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüÿÿÿÿÿ†††ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÇÇÇÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ›››ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¶¶¶ÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿûûûþÿÿÿþƒƒƒþ   ÿò   .                                                                                                                              ´   ÿ999ûùùùÿÿÿÿþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿæææÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿOOOÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿòòòÿ&&&ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ???ÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿþùùùÿ999û   ÿ´                                                                                                                          T   ÿ   ý¾¾¾þÿÿÿþüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ‘‘‘ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÒÒÒÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ¦¦¦ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÂÂÂÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿþ¾¾¾þ   ý   ÿT                                                                                                                      Ï   ÿcccüÿÿÿþüüüþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿGGGÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ���ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿ[[[ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿxxxÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüþÿÿÿþcccü   ÿÏ                                                                                                                  i   ÿüÚÚÚþÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿîîîÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿZZZÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿøøøÿ***ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿEEEÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþÚÚÚþü   ÿi                                                                                                           Ø   ÿyyyýÿÿÿþûûûÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÖÖÖÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ===ÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿæææÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ)))ÿùùùÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿûûûÿÿÿÿþyyyý   ÿØ                                                                                                       h   ÿüãããþÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿËËËÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ000ÿûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÝÝÝÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿóóóÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþãããþü   ÿh                                                                                                   Í   ÿyyyüÿÿÿþûûûÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÒÒÒÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ888ÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿãããÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ%%%ÿ÷÷÷ÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿûûûÿÿÿÿþyyyü   ÿÍ                                                                                               Q   ÿýÚÚÚþÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿèèèÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿQQQÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿôôôÿ!!!ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ;;;ÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþÚÚÚþý   ÿQ                                                                                              ±   ÿ]]]üÿÿÿþüüüÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿ888ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ~~~ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿMMMÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿhhhÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüÿÿÿÿþ]]]ü   ÿ±                                                                                          )   ö   ÿ¼¼¼þÿÿÿþüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿzzzÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÁÁÁÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ���ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ®®®ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿþ¼¼¼þ   ÿ   ö)                                                                                      x   ÿ333ûüüüþÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÑÑÑÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ888ÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿàààÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ)))ÿôôôÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüþ333û   ÿx                                                                                   Ç   ÿ„„„üÿÿÿþûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýýýÿÿÿÿÿbbbÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ´´´ÿÿÿÿÿûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüÿÿÿÿÿxxxÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ———ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿþ„„„ü   ÿÇ                                                                               0   ûÿÍÍÍþÿÿÿþüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿáááÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ¢¢¢ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿïïïÿ---ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿCCCÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿþÍÍÍþÿ   û0                                                                              s   ÿ555ûýýýþÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿ¼¼¼ÿ			ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ   ÿ   ÿÿ£££ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÌÌÌÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ"""ÿÞÞÞÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýþ555û   ÿs                                                                               ³   ÿzzzüÿÿÿþûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿ²²²ÿÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿÿ   ÿÿ   ÿÿ¥¥¥ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÄÄÄÿÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿ%%%ÿØØØÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿþzzzü   ÿ³                                                                              è   ÿ¸¸¸ýÿÿÿþüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿÐÐÐÿ777ÿ   ÿ   ÿ   ÿÿÿÿÿÿÿ   ÿ   ÿÿ'''ÿ   ÿÿ   ÿÿ   ÿÿ©©©ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÛÛÛÿCCCÿ   ÿ   ÿ   ÿÿÿÿÿÿÿ   ÿ   ÿ   ÿWWWÿçççÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿþ¸¸¸ý   ÿ   è                                                                      C   ÿþêêêþÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿÿÿÿÿøøøÿžžžÿ555ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿOOOÿÄÄÄÿ÷÷÷ÿJJJÿ   ÿÿ   ÿÿ   ÿÿ«««ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿþþþÿûûûÿ©©©ÿ<<<ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿGGGÿ¸¸¸ÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿêêêþþ   ÿC                                                                      v   ÿBBBûÿÿÿþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿýýýÿÿÿÿÿûûûÿÌÌÌÿ———ÿqqqÿ```ÿbbbÿ{{{ÿ¦¦¦ÿÞÞÞÿÿÿÿÿýýýÿÿÿÿÿòòòÿHHHÿ   ÿÿ   ÿÿ   ÿÿ­­­ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýÿýýýÿÿÿÿÿýýýÿÒÒÒÿ›››ÿtttÿ```ÿbbbÿxxxÿ¡¡¡ÿÙÙÙÿÿÿÿÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿþBBBû   ÿv                                                                      ¥   ÿrrrûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿüüüÿÿÿÿÿñññÿEEEÿ   ÿÿ   ÿÿ   ÿÿ°°°ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿrrrû   ÿ¥                                                                   Ï   ÿ¢¢¢üÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿûûûÿûûûÿüüüÿüüüÿûûûÿûûûÿýýýÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿðððÿCCCÿ   ÿÿ   ÿÿ   ÿ


ÿ²²²ÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿûûûÿûûûÿüüüÿüüüÿûûûÿûûûÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ¢¢¢ü   ÿÏ                                                                  í   ÿÇÇÇýÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿïïïÿ@@@ÿ   ÿÿ   ÿÿ   ÿÿµµµÿÿÿÿÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÇÇÇý   ÿ   í                                                              4   ýÿäääþÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿîîîÿ>>>ÿ   ÿÿ   ÿÿ   ÿÿ···ÿÿÿÿÿûûûÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿäääþÿ   ý4                                                              Q   ÿ(((ýøøøþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿìììÿ<<<ÿ   ÿÿ   ÿÿ   ÿÿ¹¹¹ÿÿÿÿÿûûûÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿøøøþ(((ý   ÿQ                                                              g   ÿAAAüÿÿÿþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿëëëÿ:::ÿ   ÿÿ   ÿÿ   ÿÿ¼¼¼ÿÿÿÿÿûûûÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿþAAAü   ÿg                                                              ~   ÿVVVûÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿêêêÿ888ÿ   ÿÿ   ÿÿ   ÿÿ¾¾¾ÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþVVVû   ÿ~                                                              ‘   ÿeeeûÿÿÿþüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿèèèÿ555ÿ   ÿÿ   ÿÿ   ÿÿÁÁÁÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿþeeeû   ÿ‘                                                              ž   ÿsssûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿçççÿ333ÿ   ÿÿ   ÿÿ   ÿÿÄÄÄÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿsssû   ÿž                                                              ¦   ÿ€€€ûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿæææÿ111ÿ   ÿÿ   ÿÿ   ÿÿÆÆÆÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ€€€û   ÿ¦                                                              «   ÿ†††ûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿäääÿ...ÿ   ÿÿ   ÿÿ   ÿÿÈÈÈÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ†††û   ÿ«                                                              ¬   ÿ†††ûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿãããÿ,,,ÿ   ÿÿ   ÿÿ   ÿÿÊÊÊÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ†††û   ÿ¬                                                              ©   ÿƒƒƒûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿâââÿ)))ÿ   ÿÿ   ÿÿ   ÿÿÍÍÍÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿƒƒƒû   ÿ©                                                              ¢   ÿzzzûÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿàààÿ(((ÿ   ÿÿ   ÿÿ   ÿÿÎÎÎÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿzzzû   ÿ¢                                                              ˜   ÿkkkûÿÿÿþûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿßßßÿ'''ÿ   ÿÿ   ÿÿ   ÿÿÐÐÐÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿþkkkû   ÿ˜                                                              ‡   ÿ]]]ûÿÿÿþüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿÝÝÝÿ%%%ÿ   ÿÿ   ÿÿ   ÿÿÓÓÓÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿþ]]]û   ÿ‡                                                              q   ÿKKKûÿÿÿþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿÜÜÜÿ$$$ÿ   ÿÿ   ÿÿ   ÿÿÕÕÕÿÿÿÿÿûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿþKKKû   ÿq                                                              [   ÿ333üýýýþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿÛÛÛÿ###ÿ   ÿÿ   ÿÿ   ÿÿ×××ÿÿÿÿÿûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýþ333ü   ÿ[                                                              A   ÿþîîîþÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿÙÙÙÿ!!!ÿ   ÿÿ   ÿÿ   ÿ   ÿØØØÿÿÿÿÿûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿîîîþþ   ÿA                                                              $   öÿÔÔÔþÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿØØØÿ   ÿ   ÿÿ   ÿÿ   ÿ"""ÿÚÚÚÿÿÿÿÿûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÔÔÔþÿ   ö$                                                               			
Þ   ÿ³³³ýÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿûûûÿûûûÿüüüÿüüüÿûûûÿûûûÿýýýÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿÿÖÖÖÿÿ   ÿÿ   ÿÿ   ÿ"""ÿÛÛÛÿÿÿÿÿûûûÿÿÿÿÿþþþÿþþþÿüüüÿûûûÿûûûÿüüüÿüüüÿûûûÿûûûÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿ³³³ý   ÿÞ			
                                                                    ¸   ÿˆˆˆüÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿÿÕÕÕÿÿ   ÿÿ   ÿÿ   ÿ$$$ÿÜÜÜÿÿÿÿÿûûûÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿˆˆˆü   ÿ¸                                                                       Œ   ÿXXXûÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿýýýÿÿÿÿÿûûûÿÌÌÌÿ———ÿqqqÿ```ÿbbbÿ{{{ÿ¦¦¦ÿÞÞÞÿÿÿÿÿþþþÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿÿÒÒÒÿÿ   ÿÿ   ÿÿ   ÿ&&&ÿÞÞÞÿÿÿÿÿýýýÿýýýÿÒÒÒÿ›››ÿtttÿ```ÿbbbÿxxxÿ¡¡¡ÿÙÙÙÿÿÿÿÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþXXXû   ÿŒ                                                                      Y   ÿ'''ý÷÷÷þÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿÿÿÿÿøøøÿžžžÿ555ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿPPPÿÂÂÂÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿÿÐÐÐÿÿ   ÿÿ   ÿÿ   ÿ(((ÿÚÚÚÿ®®®ÿ:::ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿGGGÿ¸¸¸ÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿ÷÷÷þ'''ý   ÿY                                                                      &   ÷ÿÐÐÐþÿÿÿþüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿÐÐÐÿ777ÿ   ÿ   ÿ   ÿÿÿÿÿÿÿ   ÿ   ÿÿeeeÿîîîÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿÿÎÎÎÿÿ   ÿÿ   ÿÿ   ÿÿÿ   ÿ   ÿÿÿÿÿÿÿ   ÿ   ÿ   ÿVVVÿçççÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿþÐÐÐþÿ   ÷&                                                                       Í   ÿ———üÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿ²²²ÿÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿ222ÿáááÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿÿËËËÿÿ   ÿÿ   ÿÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿ%%%ÿØØØÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ———ü   ÿÍ                                                                           ‘   ÿSSSûÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿ¼¼¼ÿ			ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ...ÿéééÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿûûûÿÿÿÿÿÊÊÊÿÿ   ÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ"""ÿÞÞÞÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþSSSû   ÿ‘                                                                              M   ÿýèèèþÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿáááÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿWWWÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿºººÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿCCCÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿèèèþý   ÿM                                                                              ã   ÿ¦¦¦ýÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýýýÿÿÿÿÿbbbÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¬¬¬ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüÿÿÿÿÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ———ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ¦¦¦ý   ÿã                                                                                  �   ÿUUUûÿÿÿþýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÑÑÑÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ999ÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿàààÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ)))ÿôôôÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýýýÿÿÿÿþUUUû   ÿ�                                                                                      J   ÿþÞÞÞþÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿzzzÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÁÁÁÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ���ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ®®®ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþÞÞÞþþ   ÿJ                                                                                       Ô   ÿŠŠŠýÿÿÿþûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿ888ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ~~~ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿMMMÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿhhhÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿþŠŠŠý   ÿÔ                                                                                           |   ÿ,,,û÷÷÷þÿÿÿþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿèèèÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿQQQÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿôôôÿ!!!ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ;;;ÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿþ÷÷÷þ,,,û   ÿ|                                                                                              !ï   ÿªªªþÿÿÿþûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÒÒÒÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ888ÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿãããÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ%%%ÿ÷÷÷ÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿþªªªþ   ÿï!                                                                                                  š   ÿ???ûÿÿÿþþþþþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿËËËÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ000ÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÝÝÝÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿóóóÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþþÿÿÿþ???û   ÿš                                                                                                      2ù   ÿ°°°þÿÿÿþûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÖÖÖÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ===ÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿæææÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ)))ÿùùùÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿþ°°°þ   ÿù2                                                                                                          ¡   ÿ:::ûýýýÿþþþþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿîîîÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿZZZÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿøøøÿ***ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿDDDÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþþýýýÿ:::û   ÿ¡                                                                                                              .õ   ÿ   þÿÿÿþûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿGGGÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ���ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿ[[[ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿwwwÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿþ   þ   ÿõ.                                                                                                                  �   ÿ$$$ûêêêÿÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ‘‘‘ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÒÒÒÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ¦¦¦ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÂÂÂÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþêêêÿ$$$û   ÿ�                                                                                                                         á   ÿrrrýÿÿÿþüüüþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿæææÿÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿOOOÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿòòòÿ&&&ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ???ÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüþÿÿÿþrrrý   ÿá                                                                                                                             c   ÿüÂÂÂþÿÿÿþûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿüüüÿÿÿÿÿ†††ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÇÇÇÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿ›››ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¶¶¶ÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿþÂÂÂþü   ÿc                                                                                                                               ¸   ÿ222ûòòòÿÿÿÿþýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿùùùÿ===ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿÿÿÿÿüüüÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿPPPÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿmmmÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿþòòòÿ222û   ÿ¸                                                                                                                                      +ì   ÿpppýÿÿÿÿûûûþþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿßßßÿ$$$ÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿ]]]ÿÿÿÿÿýýýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿéééÿ222ÿ   ÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿ   ÿKKKÿ÷÷÷ÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿûûûþÿÿÿÿpppý   ÿì   +                                                                                                                                             fÿ   ü§§§þÿÿÿþûûûÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÞÞÞÿ222ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿÿ   ÿgggÿúúúÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿçççÿ@@@ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÿÿ   ÿXXXÿóóóÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿÿÿÿþ§§§þ   üÿ   f                                                                                                                                                  ¢   ÿûÒÒÒÿÿÿÿþüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿðððÿrrrÿÿ   ÿ   ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿÿ¡¡¡ÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿöööÿ€€€ÿÿ   ÿ   ÿ   ÿÿÿÿ   ÿ   ÿ   ÿ   ÿÿ“““ÿýýýÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿþÒÒÒÿû   ÿ¢                                                                                                                                                         Ð   ÿ...üêêêÿÿÿÿþüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿýýýÿÿÿÿÿÔÔÔÿoooÿ%%%ÿÿ   ÿ   ÿ   ÿ   ÿ			ÿ888ÿŽŽŽÿíííÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿÜÜÜÿxxxÿ***ÿÿ   ÿ   ÿ   ÿ   ÿÿ222ÿ………ÿæææÿÿÿÿÿüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿþêêêÿ...ü   ÿÐ                                                                                                                                                                .ê   ÿJJJýøøøÿþþþþýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿöööÿÎÎÎÿ­­­ÿŸŸŸÿ¢¢¢ÿµµµÿÜÜÜÿýýýÿÿÿÿÿþþþÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿþþþÿÿÿÿÿøøøÿÒÒÒÿ¯¯¯ÿ   ÿ¡¡¡ÿ²²²ÿØØØÿûûûÿÿÿÿÿþþþÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿþþþþøøøÿJJJý   ÿê   .                                                                                                                                                                     Lû   þ```ýÿÿÿÿýýýþýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿýýýÿüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿýýýþÿÿÿÿ```ý   þû   L                                                                                                                                                                             gÿ   ükkkýÿÿÿÿüüüþýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿûûûÿûûûÿûûûÿüüüÿýýýÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿýýýÿûûûÿûûûÿûûûÿûûûÿýýýÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüþÿÿÿÿkkký   üÿ   g                                                                                                                                                                                     vÿ   ülllýÿÿÿÿýýýþýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿýýýþÿÿÿÿlllý   üÿ   v                                                                                                                                                                                          |ÿ   ücccýúúúÿþþþþüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿþþþþúúúÿcccý   üÿ   |                                                                                                                                                                                            xÿ   üOOOýîîîÿÿÿÿþûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿÿÿÿþîîîÿOOOý   üÿx                                                                                                                                                                                                       kü   þ333üÜÜÜÿÿÿÿþûûûþýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿûûûþÿÿÿþÜÜÜÿ333ü   þü   k                                                                                                                                                                                                                  Rï   ÿû´´´þÿÿÿÿüüüþüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüÿüüüþÿÿÿÿ´´´þû   ÿï   R                                                                                                                                                                                                                             2Ú   ÿû}}}ýùùùÿÿÿÿþûûûÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýÿûûûÿÿÿÿþùùùÿ}}}ýû   ÿÚ   2                                                                                                                                                                                                                                     °ÿ   ü;;;üÓÓÓþÿÿÿÿýýýþüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿýýýþÿÿÿÿÓÓÓþ;;;ü   üÿ°                                                                                                                                                                                                                                                tõ   ÿû………ýõõõÿÿÿÿþüüüþüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿüüüþÿÿÿþõõõÿ………ýû   ÿõt                                                                                                                                                                                                                                                           3Éÿ   ý///ü¶¶¶þÿÿÿÿþþþþýýýÿüüüÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿüüüÿýýýÿþþþþÿÿÿÿ¶¶¶þ///ü   ýÿÉ   3                                                                                                                                                                                                                                                                    vð   ÿ   üJJJüÇÇÇþÿÿÿÿþþþþýýýÿûûûÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿûûûÿýýýÿþþþþÿÿÿÿÇÇÇþJJJü   ü   ÿðv                                                                                                                                                                                                                                                                                %¦û   ÿýSSSûÃÃÃþþþþþþþþþþþþþüüüÿüüüÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿüüüÿþþþþþþþþþþþþÃÃÃþSSSûý   ÿû¦   %                                                                                                                                                                                                                                                                                          <ºÿ   þþBBBû©©©ýóóóþÿÿÿÿþþþþþþþÿûûûÿûûûÿýýýÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿþþþÿýýýÿûûûÿûûûÿþþþÿþþþþÿÿÿÿóóóþ©©©ýBBBûþ   þÿº<                                                                                                                                                                                                                                                                                                            Dµú   ÿ   þ!!!üuuuüÅÅÅþùùùþÿÿÿÿþþþþÿÿÿÿþþþÿûûûÿûûûÿýýýÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿýýýÿûûûÿûûûÿþþþÿÿÿÿÿþþþþÿÿÿÿùùùþÅÅÅþuuuü!!!ü   þ   ÿúµD                                                                                                                                                                                                                                                                                                                           6›ì   ÿ   þÿ...üwwwûºººýíííþÿÿÿþþþþÿþþþþþþþÿÿÿÿÿþþþÿýýýÿûûûÿûûûÿûûûÿûûûÿûûûÿüüüÿüüüÿûûûÿûûûÿûûûÿûûûÿûûûÿýýýÿþþþÿÿÿÿÿþþþÿþþþþþþþÿÿÿÿþíííþºººýwwwû...üÿ   þ   ÿì›6                                                                                                                                                                                                                                                                                                                                            h½   ÷   ÿ   þ   ÿþKKKû€€€û±±±ý×××þôôôþÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþÿÿÿþôôôþ×××þ±±±ý€€€ûKKKûþ   ÿ   þ   ÿ   ÷½h                                                                                                                                                                                                                                                                                                                                                                (o´   ë   ÿ   þ   þ   þÿ   þAAAü\\\ûvvvû���ü   üªªªü±±±ý¶¶¶ý¶¶¶ý±±±ýªªªü   ü���üvvvû\\\ûAAAü   þÿ   þ   þ   þ   ÿ   ë´o(                                                                                                                                                                                                                                                                                                                                                                                        I�³Ý   ø   ÿ   þ   þ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   þ   þ   ÿ   øÝ³�I                                                                                                                                                                                                                                                                                                                                                                                                                   			
(Kiˆ¢´ÃÎÕ   Ø   ØÕÎÃ´¢ˆiK(			
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü  ?ÿÿÿÿÿÿÿÿÿÿÿÿ€  ÿÿÿÿÿÿÿÿÿÿÿü    ?ÿÿÿÿÿÿÿÿÿÿà    ÿÿÿÿÿÿÿÿÿÿ€    ÿÿÿÿÿÿÿÿÿþ      ÿÿÿÿÿÿÿÿø      ÿÿÿÿÿÿÿÿà      ÿÿÿÿÿÿÿÿÀ      ÿÿÿÿÿÿÿÿ        ÿÿÿÿÿÿÿþ        ÿÿÿÿÿÿø        ÿÿÿÿÿÿð        ÿÿÿÿÿÿà        ÿÿÿÿÿÿÀ        ÿÿÿÿÿÿ€        ÿÿÿÿÿÿ          ÿÿÿÿÿþ          ÿÿÿÿü          ?ÿÿÿÿø          ÿÿÿÿð          ÿÿÿÿð          ÿÿÿÿà          ÿÿÿÿÀ          ÿÿÿÿÀ          ÿÿÿÿ€          ÿÿÿÿ            ÿÿÿÿ            ÿÿÿþ            ÿÿþ            ÿÿü            ?ÿÿü            ?ÿÿø            ÿÿø            ÿÿð            ÿÿð            ÿÿð            ÿÿà            ÿÿà            ÿÿà            ÿÿÀ            ÿÿÀ            ÿÿÀ            ÿÿÀ            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ              ÿÿ              ÿÿ              ÿÿ              ÿÿ              ÿÿ              ÿÿ              ÿÿ              ÿÿ              ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿ€            ÿÿÀ            ÿÿÀ            ÿÿÀ            ÿÿÀ            ÿÿà            ÿÿà            ÿÿà            ÿÿð            ÿÿð            ÿÿø            ÿÿø            ÿÿø            ÿÿü            ?ÿÿü            ?ÿÿþ            ÿÿþ            ÿÿÿ            ÿÿÿÿ€          ÿÿÿÿ€          ÿÿÿÿÀ          ÿÿÿÿà          ÿÿÿÿà          ÿÿÿÿð          ÿÿÿÿø          ÿÿÿÿü          ?ÿÿÿÿþ          ÿÿÿÿÿ          ÿÿÿÿÿÿ€        ÿÿÿÿÿÿÀ        ÿÿÿÿÿÿà        ÿÿÿÿÿÿð        ÿÿÿÿÿÿø        ÿÿÿÿÿÿü        ?ÿÿÿÿÿÿÿ        ÿÿÿÿÿÿÿÿ€      ÿÿÿÿÿÿÿÿà      ÿÿÿÿÿÿÿÿð      ÿÿÿÿÿÿÿÿü      ?ÿÿÿÿÿÿÿÿÿ      ÿÿÿÿÿÿÿÿÿÿÀ    ÿÿÿÿÿÿÿÿÿÿø    ÿÿÿÿÿÿÿÿÿÿÿ    ÿÿÿÿÿÿÿÿÿÿÿÿà  ÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(   @   €           @                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           7   `   …   Ÿ   ¯   ¸   ¸   ¯   Ÿ   …   `   7                                                                                                                                                                                        k   ´éÿDDDþdddþ€€€ÿ“““ÿ›››ÿ›››ÿ“““ÿ€€€ÿdddþDDDþÿé   ´   k                                                                                                                                                          YYYC   ¯			õBBBÿŒŒŒþÎÎÎÿøøøþÿÿÿûþþþúÿÿÿûÿÿÿûÿÿÿûÿÿÿûÿÿÿûÿÿÿûþþþúÿÿÿûøøøþÎÎÎÿŒŒŒþBBBÿ			õ   ¯CYYY                                                                                                                                          A   Äÿ{{{þÝÝÝþÿÿÿûþþþûþþþýÿÿÿþüüüþûûûþúúúÿûûûÿûûûÿûûûÿûûûÿúúúÿûûûþüüüþÿÿÿþþþþýþþþûÿÿÿûÝÝÝþ{{{þÿ   ÄA                                                                                                                                     ©ÿˆˆˆþóóóüÿÿÿûþþþþüüüÿúúúþüüüþþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿüüüþúúúþüüüÿþþþþÿÿÿûóóóüˆˆˆþÿ   ©                                                                                                                      T   ì\\\ÿêêêûÿÿÿüýýýþûûûÿýýýþþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿýýýþûûûÿýýýþÿÿÿüêêêû\\\ÿ   ìT                                                                                                             ‹ÿ®®®ýÿÿÿûýýýþûûûÿýýýþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýþûûûÿýýýþÿÿÿû®®®ýÿ   ‹                                                                                               ���   ¬---ÿàààúÿÿÿýúúúÿýýýþÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýþúúúÿÿÿÿýàààú---ÿ   ¬���                                                                                    ………   ¶AAAÿõõõúÿÿÿþûûûÿýýýþûûûÿûûûÿüüüÿûûûÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿûûûÿüüüÿûûûÿûûûÿþþþþûûûÿÿÿÿþõõõúAAAÿ   ¶………                                                                                      ­CCCÿûûûúþþþþüüüÿüüüþýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüþüüüÿþþþþûûûúCCCÿ   ­                                                                                     �333ÿöööúÿÿÿþüüüþüüüþÿÿÿÿòòòÿ   ÿaaaÿRRRÿgggÿ®®®ÿùùùÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿôôôÿ¤¤¤ÿcccÿRRRÿeeeÿªªªÿ÷÷÷ÿÿÿÿÿýýýþüüüþÿÿÿþöööú333ÿ   �                                                                             ^ÿáááûÿÿÿþüüüþüüüþÿÿÿÿ¾¾¾ÿÿ   ÿÿ   ÿÿ   ÿ111ÿÕÕÕÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÅÅÅÿ$$$ÿ   ÿÿ   ÿÿ   ÿ+++ÿÏÏÏÿÿÿÿÿýýýþüüüþÿÿÿþáááûÿ   ^                                                               			$   î±±±ÿÿÿÿýûûûÿüüüþÿÿÿÿÀÀÀÿÿ   ÿÿÿÿÿÿ   ÿÿÚÚÚÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÉÉÉÿ


ÿ   ÿÿÿÿÿÿ   ÿÿÔÔÔÿÿÿÿÿýýýþûûûÿÿÿÿý±±±ÿ   î			$                                                              ¯gggÿÿÿÿûûûûÿþþþþÿÿÿÿùùùÿ...ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿMMMÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿ666ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿCCCÿÿÿÿÿþþþÿþþþþûûûÿÿÿÿûgggÿ   ¯                                                          Pÿïïïüÿÿÿþýýýþûûûÿÿÿÿÿ±±±ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÓÓÓÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿ¼¼¼ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÊÊÊÿÿÿÿÿüüüÿýýýþÿÿÿþïïïüÿ   P                                                ÿÿÿ   Ê’’’ÿÿÿÿüûûûþÿÿÿÿûûûÿÿÿÿÿyyyÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¡¡¡ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿ………ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ–––ÿÿÿÿÿûûûÿÿÿÿÿûûûþÿÿÿü’’’ÿ   Êÿÿÿ                                               R(((ÿùùùüÿÿÿþþþþþþþþÿûûûÿÿÿÿÿmmmÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ“““ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿvvvÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿˆˆˆÿÿÿÿÿúúúÿþþþÿþþþþÿÿÿþùùùü(((ÿ   R                                           »‰‰‰ÿÿÿÿüûûûþþþþÿþþþÿûûûÿÿÿÿÿ‹‹‹ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¯¯¯ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿ–––ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¤¤¤ÿÿÿÿÿûûûÿÿÿÿÿþþþÿûûûþÿÿÿü‰‰‰ÿ   »                                          -üåååÿÿÿÿþýýýþþþþÿÿÿÿÿüüüÿÿÿÿÿÎÎÎÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿèèèÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿ×××ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿâââÿÿÿÿÿýýýÿÿÿÿÿþþþÿýýýþÿÿÿþåååÿü   -                                         }SSSÿÿÿÿûüüüþþþþÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿ\\\ÿ   ÿÿÿ   ÿ   ÿ   ÿÿÿ   ÿTTTÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿfffÿ   ÿÿÿ   ÿ   ÿ   ÿÿÿ   ÿuuuÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿþþþÿüüüþÿÿÿûSSSÿ   }                                          Åžžžÿÿÿÿüûûûþþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿïïïÿ888ÿ   ÿÿÿÿÿ   ÿ   ÿÿ   ÿ’’’ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿôôôÿAAAÿ   ÿÿÿÿÿÿ   ÿLLLÿùùùÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿûûûþÿÿÿüžžžÿ   Å                                      			ôÝÝÝÿÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿóóóÿuuuÿÿ   ÿÿ   ÿÿxxxÿÿ   ÿ   ÿ–––ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿöööÿ{{{ÿÿ   ÿÿ   ÿÿ………ÿúúúÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþÝÝÝÿ			ô                                    J...ÿÿÿÿüÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿìììÿ½½½ÿ«««ÿÃÃÃÿðððÿÿÿÿÿÅÅÅÿÿ   ÿ   ÿ˜˜˜ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿîîîÿ¾¾¾ÿ«««ÿÁÁÁÿðððÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþÿÿÿü...ÿ   J                                 wWWWÿÿÿÿûûûûþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿùùùÿÿÿÿÿÃÃÃÿÿ   ÿ   ÿ›››ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûþÿÿÿûWWWÿ   w                              œ|||ÿÿÿÿûúúúþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýýýÿüüüÿûûûÿüüüÿþþþÿÿÿÿÿúúúÿÿÿÿÿÁÁÁÿÿ   ÿ   ÿ���ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿýýýÿüüüÿûûûÿüüüÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúþÿÿÿû|||ÿ   œ                           ¶˜˜˜ÿÿÿÿûûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ¿¿¿ÿÿ   ÿ   ÿ   ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿû˜˜˜ÿ   ¶                               Èªªªÿÿÿÿüûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ½½½ÿÿ   ÿÿ£££ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿüªªªÿ   È                                   Ï¶¶¶ÿÿÿÿüüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿºººÿ			ÿ   ÿÿ¦¦¦ÿÿÿÿÿúúúÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿü¶¶¶ÿ   Ï                                   Ð···ÿÿÿÿüüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ¸¸¸ÿÿ   ÿÿ¨¨¨ÿÿÿÿÿúúúÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿü···ÿ   Ð                                   Ê­­­ÿÿÿÿüûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ¶¶¶ÿÿ   ÿÿ«««ÿÿÿÿÿúúúÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿü­­­ÿ   Ê                        			       »���ÿÿÿÿûûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ´´´ÿÿ   ÿÿ­­­ÿÿÿÿÿúúúÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿû���ÿ   »    			                       ¢ƒƒƒÿÿÿÿûûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýýýÿüüüÿûûûÿüüüÿþþþÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ²²²ÿÿ   ÿÿ°°°ÿÿÿÿÿúúúÿÿÿÿÿýýýÿüüüÿûûûÿüüüÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿûƒƒƒÿ   ¢                              �___ÿÿÿÿúûûûþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ¯¯¯ÿÿ   ÿÿ²²²ÿÿÿÿÿùùùÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûþÿÿÿú___ÿ   �                                 U777ÿÿÿÿüþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿìììÿ½½½ÿ«««ÿÃÃÃÿòòòÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿ­­­ÿÿ   ÿÿ³³³ÿÿÿÿÿìììÿ¾¾¾ÿ«««ÿÁÁÁÿðððÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþÿÿÿü777ÿ   U                                 &úçççÿÿÿÿþýýýÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿóóóÿuuuÿÿ   ÿÿ   ÿÿŒŒŒÿüüüÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿúúúÿÿÿÿÿªªªÿÿ   ÿÿeeeÿÿ   ÿÿ   ÿÿ………ÿúúúÿþþþÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿþçççÿú   &                               ÿÿÿ   Ò®®®ÿÿÿÿüûûûþþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿïïïÿ888ÿ   ÿÿÿÿÿÿ   ÿTTTÿüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿúúúÿÿÿÿÿ¨¨¨ÿÿ   ÿ   ÿ   ÿÿÿÿÿ   ÿLLLÿùùùÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿûûûþÿÿÿü®®®ÿ   Òÿÿÿ                                   �cccÿÿÿÿûûûûþþþþÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿ\\\ÿ   ÿÿÿ   ÿ   ÿ   ÿÿÿ   ÿ���ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿúúúÿÿÿÿÿLLLÿ   ÿÿÿ   ÿ   ÿ   ÿÿÿ   ÿuuuÿÿÿÿÿüüüÿþþþÿÿÿÿÿÿÿÿÿþþþÿûûûþÿÿÿûcccÿ   �                                      >ÿóóóýÿÿÿþþþþþþþþÿÿÿÿÿüüüÿÿÿÿÿÎÎÎÿÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿéééÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÖÖÖÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÿâââÿÿÿÿÿýýýÿÿÿÿÿþþþÿþþþþÿÿÿþóóóýÿ   >                                              Í¡¡¡ÿÿÿÿüûûûþþþþÿþþþÿûûûÿÿÿÿÿ‹‹‹ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¯¯¯ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿ–––ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¤¤¤ÿÿÿÿÿûûûÿÿÿÿÿþþþÿûûûþÿÿÿü¡¡¡ÿ   Í                                               k<<<ÿÿÿÿûýýýþþþþþþþþÿûûûÿÿÿÿÿmmmÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ“““ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿvvvÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿˆˆˆÿÿÿÿÿúúúÿþþþÿþþþþýýýþÿÿÿû<<<ÿ   k                                           ß¯¯¯ÿÿÿÿýûûûþÿÿÿÿûûûÿÿÿÿÿyyyÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ¡¡¡ÿÿÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿÿÿÿÿ………ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ–––ÿÿÿÿÿûûûÿÿÿÿÿûûûþÿÿÿý¯¯¯ÿ   ß                                               l333ÿþþþûþþþÿþþþþûûûÿÿÿÿÿ±±±ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÓÓÓÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿ¼¼¼ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿÊÊÊÿÿÿÿÿüüüÿþþþþþþþÿþþþû333ÿ   l                                                    ���   ËŠŠŠÿÿÿÿüúúúÿþþþþÿÿÿÿùùùÿ...ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿMMMÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿ666ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿCCCÿÿÿÿÿþþþÿþþþþúúúÿÿÿÿüŠŠŠÿ   Ë���                                                           >ýÓÓÓýÿÿÿþüüüþüüüÿÿÿÿÿÀÀÀÿÿ   ÿÿÿÿÿÿ   ÿÿÚÚÚÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿÉÉÉÿ


ÿ   ÿÿÿÿÿÿ   ÿÿÔÔÔÿÿÿÿÿýýýÿüüüþÿÿÿþÓÓÓýý   >                                                                  ‚111ÿùùùúþþþÿýýýþüüüÿÿÿÿÿ¾¾¾ÿÿ   ÿÿ   ÿÿ   ÿ111ÿÕÕÕÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿÅÅÅÿ$$$ÿ   ÿÿ   ÿÿ   ÿ+++ÿÏÏÏÿÿÿÿÿüüüÿýýýþþþþÿùùùú111ÿ   ‚                                                                      ÿÿÿ   µVVVÿÿÿÿúûûûÿþþþþüüüÿÿÿÿÿòòòÿ   ÿaaaÿRRRÿgggÿ®®®ÿùùùÿÿÿÿÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿôôôÿ¤¤¤ÿcccÿRRRÿeeeÿªªªÿ÷÷÷ÿÿÿÿÿýýýÿþþþþûûûÿÿÿÿúVVVÿ   µÿÿÿ                                                                       ///   Òmmmÿÿÿÿûûûûÿýýýþüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿýýýþûûûÿÿÿÿûmmmÿ   Ò///                                                                               Ûnnnÿÿÿÿúüüüÿüüüþþþþþûûûÿûûûÿüüüÿûûûÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿûûûÿüüüÿûûûÿûûûÿþþþþüüüþüüüÿÿÿÿúnnnÿ   Û                                                                                          ÕXXXÿûûûúÿÿÿþûûûÿþþþþÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþþûûûÿÿÿÿþûûûúXXXÿ   Õ                                                                                               ###   »222ÿÜÜÜûÿÿÿüûûûÿüüüþþþþþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþþüüüþûûûÿÿÿÿüÜÜÜû222ÿ   »###                                                                                                    ¶¶¶   ‰ÿ•••þÿÿÿûÿÿÿýüüüÿûûûþþþþþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþþûûûþüüüÿÿÿÿýÿÿÿû•••þÿ   ‰¶¶¶                                                                                                               B   Ø555ÿÀÀÀýÿÿÿûþþþüþþþþûûûÿüüüþþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿüüüþûûûÿþþþþþþþüÿÿÿûÀÀÀý555ÿ   ØB                                                                                                                           	   wëAAAÿ´´´þûûûüÿÿÿûþþþýÿÿÿþüüüþúúúþûûûÿüüüÿüüüÿüüüÿüüüÿüüüÿüüüÿûûûÿúúúþüüüþÿÿÿþþþþýÿÿÿûûûûü´´´þAAAÿë   w	                                                                                                                                          			   y   Þ&&&ÿuuuþÃÃÃÿöööþÿÿÿûþþþûÿÿÿûÿÿÿüÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿüÿÿÿûþþþûÿÿÿûöööþÃÃÃÿuuuþ&&&ÿ   Þ   y			                                                                                                                                                                L   ¡   âþJJJþuuuþšššÿ¶¶¶ÿÇÇÇÿÎÎÎÿÎÎÎÿÇÇÇÿ¶¶¶ÿšššÿuuuþJJJþþ   â   ¡   L                                                                                                                                                                                 				   6   j   —   ¹   Ð   Ýãã   Ý   Ð   ¹   —   j   6				                                                                                                                                                                                                                    
   
                                                                                                                                                                                                                                			                        			                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿ  ÿÿÿÿÿø  ÿÿÿÿà  ÿÿÿÿ€  ÿÿÿÿ    ÿÿÿü    ?ÿÿø    ÿÿð    ÿÿà    ÿÿÀ    ÿÿÀ    ÿÿ€    ÿÿ      ÿÿ      ÿþ      þ      ü      ?ü      ?ü      ?ø      ø      ø      ø      ð      ð      ð      ð      ð      ð      ð      ð      ð      ø      ø      ø      ø      ü      ?ü      ?þ      þ      ÿ      ÿÿ      ÿÿ€    ÿÿ€    ÿÿÀ    ÿÿà    ÿÿð    ÿÿø    ÿÿü    ?ÿÿþ    ÿÿÿ€  ÿÿÿÿà  ÿÿÿÿø  ÿÿÿÿþ  ÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(   0   `           $                                                                                                                                                                                                                                                                                                kkkççççççkkk                                                                                                                                             111                                                111                                                                                                                      			                  R   ‚   §¼ÆÆ¼   §   ‚   R               			                                                                                                              j			Â>>>ötttÿ¡¡¡þÂÂÂÿÖÖÖÿßßßÿßßßÿÖÖÖÿÂÂÂÿ¡¡¡þtttÿ>>>ö			Â   j                                                                                                      „&&&í€€€ÿÕÕÕþþþþþþþþüþþþúÿÿÿûÿÿÿüÿÿÿüÿÿÿüÿÿÿüÿÿÿûþþþúþþþüþþþþÕÕÕþ€€€ÿ&&&í   „                                                                                             Zç���ÿôôôýÿÿÿûþþþûýýýþúúúþûûûþüüüþýýýÿýýýÿýýýÿýýýÿüüüþûûûþúúúþýýýþþþþûÿÿÿûôôôý���ÿç   Z                                                                                  	   ¢UUUÿéééýÿÿÿûýýýýûûûÿýýýþþþþþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþþýýýþûûûÿýýýýÿÿÿûéééýUUUÿ   ¢	                                                                             Ê���ÿÿÿÿúüüüýøøøÿûûûþýýýþþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿýýýþûûûþøøøÿýýýýÿÿÿú���ÿÊ                                                                        


Õ®®®ÿÿÿÿú÷÷÷þüüüÿÿÿÿþþþþÿÿÿÿÿüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿþþþÿÿÿÿþüüüÿ÷÷÷þÿÿÿú®®®ÿ


Õ                                                             Ë®®®ÿÿÿÿú÷÷÷ÿÿÿÿþ÷÷÷þÊÊÊÿ¹¹¹ÿÛÛÛÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿþþþÿþþþÿ×××ÿ¸¸¸ÿÍÍÍÿúúúþÿÿÿþøøøÿÿÿÿú®®®ÿË                                                      ¥’’’ÿÿÿÿú÷÷÷ÿÿÿÿþ···ÿ%%%ÿ   ÿ   ÿÿQQQÿçççÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÞÞÞÿEEEÿÿ   ÿ   ÿ---ÿÄÄÄÿÿÿÿþ÷÷÷ÿÿÿÿú’’’ÿ   ¥                                                  c___ÿÿÿÿûøøøþÿÿÿþ¹¹¹ÿÿ   ÿÿÿÿ   ÿ111ÿóóóÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿêêêÿ###ÿ   ÿÿÿÿ   ÿÿÈÈÈÿÿÿÿþøøøþÿÿÿû___ÿ   c                                          ###çéééÿÿÿÿýýýýþÿÿÿþ444ÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿ‰‰‰ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿuuuÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿFFFÿÿÿÿþüüüþÿÿÿýéééÿ###ç                               			       �–––ÿÿÿÿûùùùÿÿÿÿþ×××ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿBBBÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿ111ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿæææÿÿÿÿþùùùÿÿÿÿû–––ÿ   �    			                           111î÷÷÷ÿÿÿÿþüüüþÿÿÿÿÍÍÍÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ666ÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿ%%%ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÝÝÝÿÿÿÿÿüüüþÿÿÿþ÷÷÷ÿ111î                              w‹‹‹ÿÿÿÿûûûûþýýýÿÿÿÿÿíííÿÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿ```ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿMMMÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿ"""ÿøøøÿÿÿÿÿþþþÿûûûþÿÿÿû‹‹‹ÿ   w                            ËÛÛÛÿÿÿÿüýýýþþþþÿûûûÿÿÿÿÿrrrÿ   ÿÿÿÿÿÿ   ÿ¯¯¯ÿÿÿÿÿúúúÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿ´´´ÿ   ÿÿÿÿÿÿ   ÿ………ÿÿÿÿÿûûûÿþþþÿýýýþÿÿÿüÛÛÛÿË                              )KKKüÿÿÿÿýýýþþþþþþþþÿþþþÿÿÿÿÿ÷÷÷ÿMMMÿ   ÿÿ   ÿ   ÿÿ   ÿ111ÿçççÿÿÿÿÿüüüÿÿÿÿÿþþþÿþþþÿþþþÿýýýÿÿÿÿÿ†††ÿ   ÿ   ÿ   ÿÿ   ÿ]]]ÿýýýÿþþþÿþþþÿþþþÿþþþþýýýþÿÿÿÿKKKü   )                      `‚‚‚ÿÿÿÿûûûûþþþþÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿ§§§ÿUUUÿDDDÿkkkÿÍÍÍÿWWWÿ   ÿ222ÿéééÿÿÿÿÿüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿÆÆÆÿeeeÿDDDÿYYYÿ°°°ÿþþþÿýýýÿþþþÿÿÿÿÿþþþÿþþþÿûûûþÿÿÿû‚‚‚ÿ   `                   ’°°°ÿÿÿÿûüüüþþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿúúúÿQQQÿ   ÿ444ÿêêêÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüþÿÿÿû°°°ÿ   ’            KKK    ¶ÑÑÑÿÿÿÿûýýýþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿûûûÿüüüÿûûûÿûûûÿþþþÿùùùÿNNNÿ   ÿ666ÿìììÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüÿûûûÿüüüÿûûûÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþÿÿÿûÑÑÑÿ¶    KKK                ÍãããÿÿÿÿüýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿýýýÿþþþÿøøøÿLLLÿ   ÿ999ÿíííÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿüãããÿÍ                       !!!×íííÿÿÿÿüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿþþþÿ÷÷÷ÿIIIÿ   ÿ;;;ÿïïïÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿüíííÿ!!!×                      """ØîîîÿÿÿÿüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿÿÿÿÿöööÿGGGÿ   ÿ===ÿðððÿÿÿÿÿüüüÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿüîîîÿ"""Ø                       ÏæææÿÿÿÿüýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿõõõÿEEEÿ   ÿ???ÿòòòÿÿÿÿÿüüüÿÿÿÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿüæææÿÏ                aaa    


ºÕÕÕÿÿÿÿûýýýÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿûûûÿûûûÿüüüÿûûûÿüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿóóóÿCCCÿ   ÿAAAÿòòòÿÿÿÿÿúúúÿûûûÿüüüÿûûûÿûûûÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿûÕÕÕÿ


º    aaa               ™¶¶¶ÿÿÿÿûüüüþþþþÿÿÿÿÿþþþÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿüüüÿÿÿÿÿòòòÿAAAÿ   ÿCCCÿóóóÿÿÿÿÿþþþÿÿÿÿÿþþþÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüþÿÿÿû¶¶¶ÿ   ™                   iŠŠŠÿÿÿÿûûûûþþþþÿþþþÿÿÿÿÿþþþÿþþþÿüüüÿ§§§ÿUUUÿEEEÿjjjÿÎÎÎÿÿÿÿÿüüüÿÿÿÿÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿòòòÿ>>>ÿ   ÿIIIÿÁÁÁÿfffÿCCCÿYYYÿ°°°ÿþþþÿýýýÿþþþÿÿÿÿÿþþþÿþþþÿûûûþÿÿÿûŠŠŠÿ   i                      2TTTÿÿÿÿþüüüþþþþÿþþþÿþþþÿÿÿÿÿ÷÷÷ÿMMMÿ   ÿÿ   ÿ   ÿ   ÿ–––ÿÿÿÿÿüüüÿþþþÿþþþÿþþþÿÿÿÿÿüüüÿÿÿÿÿïïïÿ@@@ÿ   ÿÿ   ÿ   ÿÿ   ÿ]]]ÿýýýÿþþþÿþþþÿþþþÿþþþÿüüüþÿÿÿþTTTÿ   2                          Õäääÿÿÿÿýýýýþþþþÿûûûÿÿÿÿÿrrrÿ   ÿÿÿÿÿ   ÿ   ÿÅÅÅÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿúúúÿÿÿÿÿ§§§ÿ   ÿÿÿÿÿÿ   ÿ………ÿÿÿÿÿûûûÿþþþÿýýýþÿÿÿýäääÿÕ                       			       …šššÿÿÿÿûûûûþýýýÿÿÿÿÿíííÿÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿ```ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿþþþÿüüüÿÿÿÿÿLLLÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿ"""ÿøøøÿÿÿÿÿþþþÿûûûþÿÿÿûšššÿ   …    			                       (@@@øÿÿÿÿþþþþüüüþÿÿÿÿÍÍÍÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿ777ÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿûûûÿ$$$ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿÝÝÝÿÿÿÿÿüüüþþþþþÿÿÿÿ@@@ø   (                               ¢©©©ÿÿÿÿûùùùÿÿÿÿþ×××ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿ   ÿBBBÿÿÿÿÿýýýÿþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿ111ÿ   ÿÿ   ÿ   ÿ   ÿ   ÿ   ÿÿæææÿÿÿÿþúúúÿÿÿÿû©©©ÿ   ¢                                   (333õøøøÿþþþþþþþþÿÿÿÿ444ÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿ‰‰‰ÿÿÿÿÿûûûÿþþþÿÿÿÿÿÿÿÿÿþþþÿûûûÿÿÿÿÿuuuÿ   ÿÿ   ÿ   ÿ   ÿÿ   ÿFFFÿÿÿÿÿüüüþÿÿÿþøøøÿ333õ   (                                       |xxxÿÿÿÿú÷÷÷ÿÿÿÿþ¹¹¹ÿÿ   ÿÿÿÿ   ÿ111ÿóóóÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿþþþÿýýýÿÿÿÿÿêêêÿ###ÿ   ÿÿÿÿ   ÿÿÈÈÈÿÿÿÿþøøøÿÿÿÿúxxxÿ   |                                            ,,,   ¿¯¯¯ÿÿÿÿûøøøÿÿÿÿþ···ÿ%%%ÿ   ÿ   ÿÿQQQÿçççÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÞÞÞÿEEEÿÿ   ÿ   ÿ---ÿÄÄÄÿÿÿÿþøøøÿÿÿÿû¯¯¯ÿ   ¿,,,                                                   âÌÌÌÿÿÿÿûøøøÿÿÿÿþ÷÷÷ÿÊÊÊÿ¹¹¹ÿÛÛÛÿÿÿÿÿýýýÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿþþþÿþþþÿ×××ÿ¸¸¸ÿÍÍÍÿúúúÿÿÿÿþøøøÿÿÿÿûÌÌÌÿâ                                                             1ìÎÎÎÿÿÿÿû÷÷÷ÿýýýþÿÿÿþþþþÿÿÿÿÿüüüÿýýýÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿýýýÿüüüÿÿÿÿÿþþþÿÿÿÿþüüüþ÷÷÷ÿÿÿÿûÎÎÎÿì   1                                                                     1åµµµÿÿÿÿúûûûþùùùÿûûûþýýýÿþþþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþþÿüüüÿûûûþùùùÿûûûþÿÿÿúµµµÿå   1                                                                             Æ{{{ÿüüüüÿÿÿûüüüþûûûÿþþþþÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþþûûûÿüüüþÿÿÿûüüüü{{{ÿÆ                                                                                     ;;;   ƒ222ù¶¶¶ÿÿÿÿýþþþûþþþýûûûþûûûþüüüþýýýÿþþþÿþþþÿþþþÿþþþÿýýýÿüüüþûûûþûûûþþþþýþþþûÿÿÿý¶¶¶ÿ222ù   ƒ;;;                                                                                             *®CCCü§§§ÿðððþÿÿÿýþþþúþþþûÿÿÿüÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿüþþþûþþþúÿÿÿýðððþ§§§ÿCCCü®   *                                                                                                       .   ”!!!ã```ÿ™™™þÅÅÅþâââÿóóóÿùùùÿùùùÿóóóÿâââÿÅÅÅþ™™™þ```ÿ!!!ã   ”.                                                                                                                          
   >   {«Ë(((Þ111å111å(((ÞË«   {   >   
                                                                                                                                                                                                                                                                                                                            ---                        ---                                                                                                                                                                                                                                                                         ÿÿÿÿÿÿ  ÿÿÿÿÿÿ  ÿÿÿÿÿÿ  ÿÿðÿÿ  ÿÿ€ÿÿ  ÿü  ?ÿ  ÿø  ÿ  ÿà  ÿ  ÿÀ  ÿ  ÿ€  ÿ  ÿ    ÿ  þ      þ      ü    ?  ø      ø      ø      ð      ð      ð      à      à      à      à      à      à      à      à      ð      ð      ð      ð      ø      ø      ü    ?  þ      þ      ÿ    ÿ  ÿ€  ÿ  ÿÀ  ÿ  ÿà  ÿ  ÿð  ÿ  ÿü  ?ÿ  ÿÿ  ÿÿ  ÿÿðÿÿ  ÿÿÿÿÿÿ  ÿÿÿÿÿÿ  ÿÿÿÿÿÿ  (       @                                                                            ŠŠŠÿÿÿ        ÿÿÿŠŠŠ                                                                                   ppp                                        ppp                                                                999           &m222¥SSSÆbbbÕbbbÕSSSÆ222¥m   &        999                                                    000       B:::»ŒŒŒûÇÇÇÿëëëþüüüÿÿÿÿÿÿÿÿÿüüüÿëëëþÇÇÇÿŒŒŒû:::»   B    000                                                   (((ª™™™ÿóóóþÿÿÿþþþþûÿÿÿûþþþüþþþüþþþüþþþüÿÿÿûþþþûÿÿÿþóóóþ™™™ÿ(((ª                                                  0QQQáÜÜÜÿÿÿÿûýýýûøøøþûûûÿþþþþþþþÿþþþÿþþþÿþþþÿþþþþûûûÿøøøþýýýûÿÿÿûÝÝÝÿQQQá   0                                       2cccî÷÷÷ÿÿÿÿúþþþþþþþÿÿÿÿþýýýÿþþþÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿýýýÿÿÿÿþþþþÿþþþþÿÿÿú÷÷÷ÿcccî   2                               UUUàõõõÿÿÿÿû±±±ÿ>>>þ...ÿwwwÿôôôÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿïïïÿpppÿ---ÿBBBþ¹¹¹ÿÿÿÿûõõõÿUUUà                       ×××    +++«ØØØÿÿÿÿú³³³ÿ   þ   ÿÿ   ÿUUUÿÿÿÿÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿIIIÿ   ÿÿ   ÿþ¿¿¿ÿÿÿÿúÙÙÙÿ+++«    ×××                   MœœœÿÿÿÿûÿÿÿþMMMþ   ÿÿÿÿÿÕÕÕÿÿÿÿÿüüüÿüüüÿÿÿÿÿÊÊÊÿ   ÿÿÿÿ   ÿZZZþÿÿÿþÿÿÿû���ÿ   M            ÿÿÿ    BBB¾ñññÿÿÿÿüÿÿÿþ???ÿ   ÿÿ   ÿÿ   ÿÈÈÈÿÿÿÿÿüüüÿüüüÿÿÿÿÿ¾¾¾ÿ   ÿÿ   ÿÿ   ÿLLLÿÿÿÿþþþþüñññÿBBB¾    ÿÿÿ           0‘‘‘þÿÿÿþøøøþÿÿÿþŒŒŒÿ   ÿÿÿ   ÿ!!!ÿõõõÿÿÿÿÿýýýÿþþþÿÿÿÿÿôôôÿ"""ÿ   ÿÿÿ   ÿ™™™ÿÿÿÿþøøøþÿÿÿþ‘‘‘þ   0    ,,,    


vËËËÿÿÿÿûüüüþÿÿÿÿüüüÿkkkÿÿ   ÿ+++ÿÿˆˆˆÿÿÿÿÿúúúÿþþþÿýýýÿÿÿÿÿÇÇÇÿ%%%ÿ   ÿÿtttÿÿÿÿÿþþþÿüüüþÿÿÿûËËËÿ


v    ,,,´´´    ===­ïïïÿÿÿÿûþþþþþþþÿýýýÿÿÿÿÿâââÿÑÑÑÿÿÿÿÿ¤¤¤ÿ   ÿ���ÿÿÿÿÿúúúÿþþþÿýýýÿÿÿÿÿ÷÷÷ÿÒÒÒÿäääÿÿÿÿÿýýýÿÿÿÿÿþþþþÿÿÿûïïïÿ===­    ´´´        \\\Ïÿÿÿÿþþþüþþþÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿ£££ÿ   ÿ���ÿÿÿÿÿúúúÿÿÿÿÿüüüÿýýýÿÿÿÿÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿþþþüÿÿÿÿ\\\Ï               lllßÿÿÿÿýýýýþþþÿþþþÿÿÿÿÿþþþÿýýýÿüüüÿþþþÿúúúÿÿÿÿÿ   ÿ   ÿ“““ÿÿÿÿÿúúúÿþþþÿþþþÿüüüÿýýýÿþþþÿÿÿÿÿþþþÿþþþÿýýýýÿÿÿÿlllß              mmmßÿÿÿÿýýýýþþþÿþþþÿÿÿÿÿþþþÿýýýÿüüüÿþþþÿþþþÿúúúÿÿÿÿÿžžžÿ   ÿ–––ÿÿÿÿÿúúúÿþþþÿüüüÿýýýÿþþþÿÿÿÿÿþþþÿþþþÿýýýýÿÿÿÿmmmß               ^^^Ñÿÿÿÿþþþüþþþÿÿÿÿÿþþþÿüüüÿÿÿÿÿÿÿÿÿýýýÿüüüÿÿÿÿÿúúúÿÿÿÿÿ›››ÿ   ÿ™™™ÿÿÿÿÿüüüÿþþþÿÿÿÿÿüüüÿþþþÿÿÿÿÿþþþÿþþþüÿÿÿÿ^^^Ñ        ÕÕÕ    AAA²ñññÿÿÿÿûþþþþþþþÿýýýÿÿÿÿÿâââÿÓÓÓÿøøøÿÿÿÿÿþþþÿþþþÿúúúÿÿÿÿÿ™™™ÿ   ÿšššÿÿÿÿÿÐÐÐÿäääÿÿÿÿÿýýýÿÿÿÿÿþþþþÿÿÿûñññÿAAA²    ÕÕÕ444    }ÐÐÐÿÿÿÿûüüüþÿÿÿÿüüüÿkkkÿÿ   ÿ+++ÿÏÏÏÿÿÿÿÿýýýÿþþþÿúúúÿÿÿÿÿ•••ÿÿ$$$ÿ   ÿÿtttÿÿÿÿÿþþþÿýýýþÿÿÿûÐÐÐÿ}    444       8™™™ÿÿÿÿþøøøþÿÿÿþŒŒŒÿ   ÿÿÿ   ÿ,,,ÿúúúÿÿÿÿÿþþþÿýýýÿÿÿÿÿñññÿÿ   ÿÿÿ   ÿ™™™ÿÿÿÿþøøøþÿÿÿþ™™™ÿ   8                MMMÈ÷÷÷ÿþþþüÿÿÿþ???ÿ   ÿÿ   ÿÿ   ÿÊÊÊÿÿÿÿÿüüüÿüüüÿÿÿÿÿ¼¼¼ÿ   ÿÿ   ÿÿ   ÿLLLÿÿÿÿþýýýü÷÷÷ÿMMMÈ                       Y¨¨¨ÿÿÿÿûÿÿÿÿMMMþ   ÿÿÿÿÿÖÖÖÿÿÿÿÿüüüÿüüüÿÿÿÿÿÊÊÊÿ   ÿÿÿÿ   ÿZZZþÿÿÿÿÿÿÿû¨¨¨ÿ   Y                        888»ãããÿÿÿÿû³³³ÿ   þ   ÿÿ   ÿUUUÿÿÿÿÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿIIIÿ   ÿÿ   ÿþ¿¿¿ÿÿÿÿûãããÿ888»                               %eeeìýýýÿÿÿÿü²²²ÿ>>>þ...ÿwwwÿôôôÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿïïïÿpppÿ---ÿBBBþºººÿÿÿÿüýýýÿeeeì   %                               Euuuùÿÿÿþÿÿÿûþþþÿþþþþÿÿÿþýýýÿþþþÿÿÿÿÿþþþÿþþþÿÿÿÿÿþþþÿýýýÿÿÿÿþþþþþþþþÿÿÿÿûÿÿÿþuuuù   E                                       Edddðìììÿÿÿÿûüüüü÷÷÷þüüüÿþþþþþþþÿþþþÿþþþÿþþþÿþþþþüüüÿ÷÷÷þüüüüÿÿÿûìììÿdddð   E                                        


       $999Ä¯¯¯ÿüüüýÿÿÿýþþþúÿÿÿüýýýýüüüýüüüýýýýýÿÿÿüþþþúÿÿÿýüüüý¯¯¯ÿ999Ä   $    


                                                   \OOOÔ¡¡¡ÿÙÙÙþøøøþÿÿÿÿþþþÿþþþÿÿÿÿÿøøøþÙÙÙþ¡¡¡ÿOOOÔ   \                                                        ===       =‰JJJ¿hhhÜwwwèwwwèhhhÜJJJ¿‰   =    ===                                                                ###•••                                    •••###                                                                                FFFÝÝÝ                ÝÝÝFFF                                            ÿÿÿÿÿÿÿÿÿøÿÿÀÿÿ  ÿþ  ü  ?ø  ð  ð  à  à  à  À  À  À  À  À  À  à  à  à  ð  ð  ø  ü  ?þ  ÿ  ÿÿÀÿÿðÿÿÿÿÿÿÿÿÿ(                                                qqq                              qqq                    FFF       ```u¤¤¤¿»»»Û»»»Û¤¤¤¿___u       FFF            rrr    ;;;KÂÂÂëÿÿÿÿÿÿÿýþþþÿþþþÿÿÿÿýÿÿÿÿÂÂÂë;;;K    qqq    vvv    ;;;NÒÒÒþÇÇÇþ¥¥¥úúúúüýýýýýýýýøøøü£££úÊÊÊþÒÒÒþ;;;N    vvv       ÃÃÃçÄÄÄÿ   û   ÿ‹‹‹þÿÿÿþÿÿÿþ‚‚‚þ   ÿ   ûÉÉÉÿÂÂÂç           eeexýýýÿ®®®ú   ÿ   þrrrÿÿÿÿÿÿÿÿÿrrrÿ   þ   ÿµµµúüüüÿeeex        £££¿ÿÿÿÿþþþü”””þyyyÿZZZÿÐÐÐÿÿÿÿÿíííÿyyyÿ–––þÿÿÿüÿÿÿÿ£££¿       	¼¼¼ÞÿÿÿÿüüüýýýýÿÿÿÿÿÚÚÚÿJJJÿÕÕÕÿÿÿÿÿýýýÿþþþÿüüüýÿÿÿÿ¼¼¼Þ   	   	½½½ßÿÿÿÿüüüýþþþÿýýýÿÿÿÿÿÙÙÙÿJJJÿÖÖÖÿÿÿÿÿýýýÿüüüýÿÿÿÿ½½½ß   	    ¥¥¥Âÿÿÿÿþþþü“““þ{{{ÿïïïÿÿÿÿÿÔÔÔÿZZZÿvvvÿ˜˜˜þÿÿÿüÿÿÿÿ¥¥¥Â        jjj}ÿÿÿÿ®®®ú   ÿ   þyyyÿÿÿÿÿÿÿÿÿnnnÿ   þ   ÿ´´´úþþþÿjjj}           ÇÇÇìÄÄÄÿ   ü   ÿ‰‰‰þÿÿÿÿÿÿÿÿ„„„þ   ÿ   üÉÉÉÿÆÆÆì       ƒƒƒ    EEEX×××ÿÇÇÇý¤¤¤úúúúüýýýýýýýýøøøü¢¢¢úÊÊÊý×××ÿEEEX    ƒƒƒ    ………    GGGWÉÉÉòÿÿÿÿþþþþþþþÿþþþÿþþþþÿÿÿÿÉÉÉòFFFW    ………            JJJ       kkkƒ­­­ËÂÂÂäÂÂÂä¬¬¬Ëkkkƒ       JJJ                    vvv                              vvv            ÿÿ  ü?  ð  à  À  À  €  €  €  €  À  À  à  ð  ø  ÿÿ  <svg xmlns="http://www.w3.org/2000/svg" viewBox="-13 -13 58.2 58.4">
	<style>
		.st0{
			fill: #000;
		}
		.circ{
			stroke: #000;
			fill: white;
			stroke-wdith: 1;
		}
	</style>
	<circle class="circ" cx="16.1" cy="16.1" r="25"/>
	<g> <!-- viewBox="0 0 32.2 32.4" -->
		<circle class="st0" cx="5.5" cy="5.5" r="5.5"/>
		<circle class="st0" cx="26.6" cy="5.5" r="5.5"/>
		<circle class="st0" cx="5.5" cy="26.9" r="5.5"/>
		<circle class="st0" cx="26.6" cy="26.9" r="5.5"/>
		<path transform="rotate(-45.361 16.087 16.23)" class="st0" d="M1.1 15.1h30v2.3h-30z"/>
	</g>
</svg>‰PNG

   IHDR         +ƒ ôIDATxÚìÁ   €�þ¯î                                                          €Ùƒ     ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUØƒ     ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUØƒ     ÿ×FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUØ»ƒÐ6Ë8 ãé¦©Í´]ÚC[:r±9DÙFD]qH)GJ;…™Âæ,Ì‰Œb­CKçaÙUë©èe²‚§d —Ñ9ØÅ2v
¶Ã”Î‰A´I:ŸÃÿª(NKÛç�ß¥mÒ÷{ßÿåk?Z3333333333333333333³‡Þ6<Š$RhÃcHãqt ;ÑvÆÇ:âkÒñš6¤�ïÉ{›™™™™™™Ù?®I¤‘A²Èái°/bE”ð2FðãŽb'ñNaïc“8��0…i|¦1Ÿ;�ILÄkÇq*Þó$Æp4¾çáXÃH¬©„"†cÍûPˆkÉ!‹d�F-	333333³Ö6´£ýÀn<�!”0Š×qïbÓ(ãSÌb—ñ®ãÜBwð#îã7¬àÁ:Y‰5Ü�5ÝA·bÍ×ã.c³q�eLc"öàXìÉ(JŠ=Û�ô£í>…`ffffffÿuIt 9°/aoà>Äy|†‹˜ÇU,â6~A„zìÍm,â*æq1öò|ìí‰ØëÑØûý( ‡>t ™0333333û“ÁèÃ“Ø‹PÄÞÂ$.àÌã{Tð+š	oâÿ/ÍØóJœÁ|œÉLÆY� g¸7Î´œ1gmffffff›º$2È"�ç0ŒWpc_ã–PÅZÂ›î�fU,áZœéç˜Âñ8óá˜�<²Èøô€™™™™™ÙÆª½Èáá ÞÁY|‰+XÄ={¿%5q‹¸3q6fä †bvrèE{ÂÌÌÌÌÌÌÖ­º‘EÏâ ÞÆ9|…ÜE#áM¯þžîb!fè\ÌÔ�˜±<²èF*affffff­íH£( ˆ1”1‡ø	5¬¢Ž¦�ïë_XCu¬¢3vs(cE0€¤±=affffffY+º�Eƒxã˜Á·XÂïXEÃ›|­ƒ54°³¸³9ƒñ˜ÙAä‘EZffffff[´´!ƒ~<…>À,°ŒÔ½Ù×ù¡@+XÆfc¦K1ãýÈ -	33333³MX+v »0ˆ7QÆ7¨àgTQóÿåk¨£†jÌv%f½³?ˆ]èÆŸ03333³�XRèD/öàÎànbUÔü#}ÚB¨¡ŠeÜÄ%œÁ!ìA/:‘ò)3³?Ø;³�*ó0»–‘“d54„zÓM�Ø¦„!E-tSÑBÐ"´€D$]Õ�Ab•u‘�ÔE��dZ4-ZdšIešæÉô�‡÷"šf¦)2ÓÎï�Äå|ÿÿûþ<ðžï;ßB!Ä`#£q&`
nÂ|¬ÀlûøÞ}�R~j7v`6`æã&LÁ‡Ñþ¿&„B!„H(Fâ�I¸ó°Ÿavèsö¥üf{±[ð–cnÀ$�#0RW!„B!~‘…±87`.–b5¾Ä€~)ûÝ^àK¬ÆRÌÅ8c1ÊÿG…B!„â	ÅŒÂLÄu˜ƒ%X‹�ø>DÃ™”?Ã÷ØˆµX‚9¸1£0BW!„B!þoðŸ€‹1‹°_`@Å74ýƒ¾NCÔ>à¬Ä"ÌÆÅ8A/!„B!À‡‚0ŒÆé˜�X†5øFÇ7pƒyXXØßÿ‡ndd¤�9ÒÆŽk			6iÒ$›:uªÍœ9ÓRRRlÎœ9–ššjsçÎµyóæYzzº-X°À.\hK–,±¥K—º|íßãgþ;ü®ÿë�ÁcùcòØ~ŽåÇäØ¾ÖâþËZ?ß�^h8{ðÖ``NÇhÓB!„BÏÀŽñ¸b1Va#v…h€ê·aþóA~øðá6~üx›<y²%''ûÐ½bÅ
[³f�mÞ¼Ù233mß¾}vèÐ!;vì˜Xaa¡�;wÎ.^¼h—/_¶+W®Øµk×¬´´ÔnÜ¸a·nÝ²;wîØ½{÷¬ªªÊ<x`>t=zä>~üØ­©©±ÚÚZ{òä‰Ë×þ=~æò».ëòXþ˜<¶ƒcù19¶¯�µøšX›¯‘µúšY»ï�½øžØ›ï‘½úžÙ»×€ZxM>©‘^4è»°«°ârŒÇp½  „B!Ä¯G&ažÆ2¬Ã@ˆ¤ïÑØ¸¸8›={¶ŸM_½zµmÝºÕöìÙc‡¶ãÇ�ÛÙ³g­¸¸Ø‡æŠŠ
»{÷®1\ûÐ]WWgÏŸ?·W¯^YSS“µ¶¶Z °ŽŽëêê²žžëííµÁkôµ²f_;{ð½°'ß{ô½²gß;5ðZ”””µñQ+¯µóRK¯)µõSë Ï[?À:,ÃÓ˜�Iþ!„B!„²ü†©˜……X†õØ¢!è«6l˜ÅÇÇÛ¬Y³lÑ¢E~{ûöí~f;''ÇNž<i.\ð3áåååÆPëgÐŸ>}êCoKK‹µ··[ww·‰/C�¼VÔÌkG½–ÔÔkK�½ÖÔÜkO¼ôÄ{C�¼Wô,èsûvb=–a!faª?w!„B!=cp>îÅóø'6…hÐùÏËöcccmÚ´i>D®]»Ö²²²ìÈ‘#~){QQ‘]½zÕ/}ç¬µ¥¯_¿¶·oßZgg§‰Ÿµ÷Ðï	½ñÑ+ï½óÒKï)½õÓk½�àË6áŸx÷â|NB!„B
B1Wâ,ÆJlÑ0óÑQ£Fù ¸lÙ2?zvv¶åææ—�û{Ø9ÃìCd}}½577û%ìbhC½—ôÔ{K�½×ôÜ{O<dÂ³AF‚þÿä3[±‹ñ ®Ä8Ý/@!„Bˆ�ç\Œ»ðÞÄf´`6&&Æ¸¹œßhnÕªU¶mÛ6Û¿¿ååå7ªóØUWW[cc£}øðÁDPâ½'ž2áÙ #ž2ãÙ!Cž%2ì/6ãM<…»p±?	!„B!~¿c:fâ¼�íhA¦ôÜÄ‰---Í‡µ;vøðvâÄ	»té’_Îîýýä}}}&Ä×@V<3dÇ3D–<SdË3FÖ<sdÏ3HƒÑv¼�g0Óý¹I!„BñÝŒÁ4Ü‰§ð6¶ÛYý)S¦øÝà×¯_o»wï¶£G�ú{½9{ëw–÷î�	ñ#!cž52çÙ#ƒžE2éÙ$£Áxµ@;ÞÆS¸ÓtÏ !„B!¾�Ñ˜Œ[0¯cÚ¯ntt´%&&ú@µqãFãNï~i6gbýsètó=1h ‹žI²é%«žY²ë&Ëži²¶áuÌÇ-˜ìÏeBñ{wóåÆqü¤¦¡Áñ„¯è�Ðò•^«…Ø¢$tƒŠ¤"-¢@ˆ6mZ¸ZäFÜ%ˆ J.ÔB\ˆI„¢-Ä6’HhŽ:×ùrm�àéÔóøûÀ÷?x®�yæ¾EDDä_ÒéÝ¢n§/da-%%ÅŠŠŠ¬¦¦Æ¬££Ãï²©©)[YYÑõy8<³þìòû³Ì3íÏ6Ï¸?ë<óþì3aî�S7Ý¢3¾ãDDDDDŽ¸¿é&=¢ZóIüvýúukmmõßT÷÷÷ûÕmËËË:y_B}#Ï¸?ë<óþì3>ÌDØo X¥zD7}ç‰ˆˆˆˆ!ÑUê¤çô‘öÉÂT^^ž]¸pÁnÜ¸ammm~íÚèè¨ÍÍÍùî"G3à³ÀLøl0#>+ÌŒÏ3¶öé#=§NºªŸˆˆˆˆHX§Rª§Çô&lwõçææZuuµ]»vÍšššüäôññq›ŸŸ×!}"8d�Yñ™av|†˜%Ÿ)f+l¬ÓzLõTê;RDDDD$àrè
Ý£úLI² —��m•••VWWg---ÖÓÓc¯_¿6®PÓA}"‡Äù,1S>[Ì˜Ï3ç³Ç†¡$}¦ºGW|gŠˆˆˆˆH:•S„žÑ,%ÂpBÿÙ³g­¶¶Ö"‘ˆŸv>11á¿mÞÙÙ1ùy˜1Ÿ5fÎg�ôYd&ÃrÓ@‚féE¨\ŠˆˆˆÈïì]¢v¥YPKMMµ‚‚ãdÿmrWW—ÛÂÂ‚mmm™ˆü:Ì Ï"3é³ÉŒú¬2³>»Ìp�‹Ñ(µÓ%ß­"""""¿�:Mõô”>P<¨‡úeeeYII‰q]™ŸRÞ××gÓÓÓ‹Ålww×ö÷÷-™Lšˆür>‹Ì¤Ï&3ê³ÊÌúì2Ã>ËÌt�ŒÓzJõtÚw®ˆˆˆˆÈÿìO:Gwè%Ei�,H¥§§[~~¾UUUù•d>´±±1ÿíñöö¶ííí™ˆ3ë³Ëû,3Ó>ÛÌ¸Ï:3Äö(J/é�ó,""""ò£l:O÷i’¾íP¿ŒŒ?U¼´´Ôý÷Äoß¾µµµ5ã›D}Ã/>ËÌ´Ï63î³ÞÐÐào°|ðÐÀï4I÷é<eûnù�§\ºLÝôž¾Q"Hÿôçääø?ýÍÍÍÖÛÛkïÞ½ó677-‘H˜ˆ„–Ï8³î3?33ã;€]à;�Ý´ô�ÞS7]¦\]%(""""‡ù¶ÿ$S„^Ð§ }ãÏoý•ßòòrëìì´ÁÁA[\\´õõu‹Çãú¦_äˆbö}°|'°|G”••ùÎ`wí�€Oô‚"TL'õV€ˆˆˆˆT:Ó]zE_ƒòmZZšeffúIàííí~BøÒÒ’mllèª>ùáƒìßìßìß%ì” ½ð•^Ñ]*Ö5‚""""ò#Çè•Ðš¤(ÅƒòOaa¡µµµÙÀÀ€ÍÎÎÚêêª¿ò+"r@¾3Ø¾CØ%¾SØ-Aú0 NQš¤TB'ôF€ˆˆˆˆü�Ê¤‹ô„f(FÉ üÓ_TTd·oß6þP÷ßôG£Q?\Dä�|—°S|·°c|×°s‚òa@’b4COè"eúÎ‘Ø»—¨ã8Žãt¤¢¢)&	Ž)‰N¹("aKpIN·	‡NnNÖ$‚!ä N¡àiƒm*Á7Hˆ\È-¦\ÇqáY¼{ñ&š‚è‡úñz>àù/¼>ÜÇ¯ß/  ÿ�ËêŠº­ž©w*ú�þÊÊJknn¶ÁÁA›��µ��Ëd2üèpÚ—¾5Úßm�o‘6é"\dÕ;õLÝVWü   @É»¤ªT�z®Rê“²P‹D"V__ïŸïšœœ´õõuK§Ó–Ïç Îš¶Ç7H[ä›¤mò�ÒV…~ðI¥ÔsÕ£ªø×   €Òþ†ÿµ R*ò�þ²²2koo·x<nËËË¶³³cÙlÖ  ¾IÚ&ß(m•o–¶+ôË€¼J©õ@Õq   P"ªI=T/Õž*†ú£_�Òú§¸¢Ñ¨ÍÏÏ[2™´ƒƒ>Ù hÚ(ß*m–o—6Ì·L›òe@Qí©—ê¡jâ   ×UõX½Riu¢,Ä¬¿¿ß¦§§ý…[ûûûV, .m—o˜¶Ì7MÛæ§­µ•V¯Ôc?;   pa\S�Ô‚z¯NBý‹gg§���ÙÒÒ’moo[.—3 (Ú4ß6mœo�6/ä'NÔ{µ ùY  €`5©!µ¨öÔWe¡ÕØØèßÖþþ×~l J�¶îÇSÚ@ßÂ@/¾ª=µ¨†ül  @0®©'jQ}PZåååÖÕÕe£££–H$lww×Ž�� þ3¾}Ú@ßBm¢o£62ÔË€jQ=á‰   €óU¯î¨)•R_”…TMM�õõõÙøø¸­®®ú§³  Î7QÛè©­ôÍðà‹J©)uÇÏ   œ™uWM©·!þ�kk«ÛÌÌŒmmmY¡P0 ÀÏi#}+µ™¾�ÚÐPßðVM©»~  àÔÔª{ê©J†ö?þÕÕÕÖÛÛkzÑ•?ÚšÉd ð{´�¾¡ÚRßTmkˆïHª§êžŸM   øgÊÕ-WoTAY(ÕÕÕYww·�ŒŒØÚÚš àïhK}Sµ­¾±ÚÚÐ.
ê�Š«[~V  à�EÔMS¯Õge¡ÔÒÒb611a›››¼Ô N�¶Õ7V[ë›«íí"à³z­bê¦Ÿ]   ø-7Ô�J¨œ²ª¨¨°¶¶6‹F£677ÇKý àis}{µÁ¾ÅÚä�.r*¡†ü  À/]W÷ÕõQYÕÖÖZGG‡Åb1[YY±ÃÃC œm°o±6Ù·YÒEÀGõBÝ÷3øÆÞÝ³´†Q¯4¤“bU$H;´:¸•B$‚ƒNÁÅ�PèÖÁ¢‹K»‹àŠ{…,.Bq
¡ "¸(¾BJ†HÁ4ÉÕÃÅ³•ÒE½Ÿèÿç+œ“<Ésß  à/íÊ[å³r¬Ôãò~¿î¨öwP···­T*  ¼“ÕÍÞÑêê8�PWŽ£M{Ë�   "mÊeVù—“ý{zzlttÔæææ,ŸÏó~? Ä˜:Ú»Z�íÝ­�Ó�ß£�{ã›  ð%•×Ê{å[\~ñO¥R611a‹‹‹vrrbÕjÕ  �A�íÝ­÷.W§Çéß¢Í{¥´>  x$º•ie+.WúõööÚØØ˜h¼¸¸0 @Có.W§{·«ããtuàeÚ·  à{¦¤•%¥úWÿ¦¦&ëëë³L&c+++vyyÉ/þ ðpx§«Û½ãÕõÞùêþ8¼Pˆ¶0íÛ  ð€´)ÃÊGå ô{þ‰DÂúûûmrrÒ677íêêÊjµš $ïxu½w¾ºß7@[‡Ñ6s>   ht	¥[É*_•ß�¿øûÁPétÚVWW­P(X½^7 Àã Î÷î_[[ó-Ð&ÄáAÀïh#³J·o'  @ƒ^ë·¬œ+•�_ü;::üdè��;==µr¹l €GÉ7@[à›022âøA@%ÚÊe®  �ä©òBù *7!¿øwvvÚøø¸­¯¯Ûùù¹U* @|ÎÎÎ|#´¾�Ü(‡Ñ†¾ðM  ˆ¡&¥M™RrÊ¯�‡û%“I²¥¥%Óîñ ü“6Â·B›áÛ¡	}Xà/%mj›o,  @L´(/•OÊ‘RV,@üCÛàà -,,X>Ÿ·ëëk @þK›áÛ¡ñ-Ñ¦„|PVŽ¢m}é[  PBy®¼Sv•ŸŠ…Hkk«Øüü<_ü ·ñ À7EÛâjß¢mÝ�¶ö9‡ €P÷Ï([Ê¥â¯þ---þálvvÖööö¬T*  ·A›âÛ¢�ñ­Ñæ„z5 mí–’áµ   p_š•”2§ì+7¡Þóïêê²™™ÛÙÙ±b±È•~ €[§mñ�ÑÖøæh{Bžp£ìGœòM  ¸#IeJÙVŠŠÝwš››­½½Ý²Ù¬år9¿Æ©Z­  wÈ·F›ãÛ£ò-Ò&…zPŒ¶xÊ·Ø»c–¶¢0Œã`JI,mˆ[êR'A�œãàâ¨è&ºj@ttÐ]Z¥cAÈÐA—nÑ/P(˜�`h”‡Vc¾}x¹th¡•"ç˜äÿƒç3üOÈ¹÷ €G”Ò†´÷Z-ÖuÿL&cSSSþ¹¦ããc~ø ‚S{¼Aj‘7ImŠùX@-ióï   �!£Íi_´«X×ý…‚•J%;::²V«e  Dä-R“¼MjTÌÇ®’FÏy³  þÃ3mP{§Fú×ß_º´¶¶f•JÅšÍ¦ ð„x›Ô(o•šó6À¡öVô†  <PN[Ô>kÍB/—ËY±Xô—.]\\  O˜·JÍòv©a±n4’v/zË  þâ¹6ª•´oš…^:�ög*wwwíôôÔ  h'j—7L-ó¦ÅhiÒð’6êm  øÍ+m^Û�ô¯¿_�\__÷«”··· @ò†©eÞ4µ-æm€}mÞ  �Ô6´¯š…^¿-,,X¹\¶ËËK  ¨iÞ65Î[£±IÛ7¼õ   «½Ôf´²ÖŒqÝzzÚvvv¬^¯  �H�óÖ©y±h&­Ÿñö €®óZ[Ò*š…\OO�Ûòò²_‘¼¿¿7  :˜·NÍóö©�ÞÂÐýMš¿äg   ÐÒÚ˜öAû®YÈõõõÙìì¬íííñY? @×Qû¼�j¡7Qm½É`ÌÏ   cåµ¢V	ý]ÿÞÞ^+
¶¹¹i''' @7S½‰j£72d““3@E+úÙ   t””6¢migš…ÜÀÀ€­¬¬ØÁÁ�ÝÝÝ  0o¢Úè�T+cÜ8Ó¶´?+  €¶—Õ&µOÚµf¡–ÍfmbbÂ¶··íüüÜ  ÀŸÔHo¥šéíTCCî:9#Lú™  ´­7ÚªVÓ,ÔR©Ô¯oúW«U  ÿ¦fz;ÕPo©šr5mÕÏ   ­¼ÐÆµ�ZC³PËçó¦ÏùŽnnn  <œÚéUK½©jkÈ5’³Ã¸Ÿ%~²w÷,mP†1EHš¡ZjœqEp\ê$.B:(¸8ø‚¸šÑÍAêl]�
Rq©K†:fP‚ˆfÁÄïÓ‡C¶BiÅœÄr_ðü†ûøÆä  -ïƒ6£•´{Í"ÖÞÞîŸX,//[¥R1  ðlÞR5ÕÛªÆF>¸×JÚŒß   %%´>­ kµîîn›žž¶íím>õ à…¨©ÞV5Ö[«æFîX+h}~c  €–‘Ö&´­ÈúK§Ó6<<l«««vxxh  àÅycÕZo®Úý�[Ú„ß   éÞk9í§ö YÄ:;;-—ËÙÞÞžÝÝÝ  ho­^èíUƒ#<ÔoŒœß   )Ú´-¯íkQßõïííµB¡`Õj•÷ú DÍõöªÁÞb59ò!À¾–×zü  aÞjCÚWíL³ˆuttØÔÔ”íîîÚÅÅ… €xj°·XMö6«ÑQ;«ßC~‹  €†KjãÚí6"ø‰DÂºººlqqÑìññÑ  @ó¨ÅÞdµÙ­VG=¸­ß ã~“  €†ù¨Íkå¨?þ“É¤�ŒŒØææ¦Õj5{zz2  Ð|j²·Y�öV«Ù‘ÊÚ¼ß&   !¯ø[ÓjAŸúû�-,,X¹\¶››  -Ç­V{³ÕîÈÿ¨ik¼* €—“ÒÆ´oÚUÔ§þ£££¶±±a'''  ZŸšííVÃ#ÿàª~£ŒùÍ  ž-£Íi¥¨ùÏd26;;kÅbÑ®¯¯  ¼Þn5Ü[®¦G~% ¤Íùí  þYV[Òªñnkk³þþ~[YY1ý¨ßõ à•RÃ½åjº·]��zPÕ–ü†  %¡h_´Óˆ`§R)›œœ´��;??7  ðêyÓÕvo¼Zõà´~Ãð»   üÙí“ö]»Œu6›µ|>o•J…×û ðñ¶«ñÞz5?ê!Àeý–ùä·  øÍ;í³VŒú¾ÿàà ­¯¯ÛÑÑ‘ €_ìÝ±J›a†áÚB•,µ´PBRÉRâ £ƒ.‚ˆ'�ªà�ÀAÍÜãH7Ô]p)­„ŽEµSk	uˆÞ>¼|kiiû}˜ä¾à9†÷NHþ¿séÖûÍ×íOù\€÷Ú[o   "¯´í,ÅQîïï·R©dÇÇÇÖl6  t>Ý|¿ýj o�ÍÚfÅ[  <*h5í[ŠCœÏçm}}ÝÎÏÏ  to µ€7AŠö�Sóæ  ‹½	ñkŠ\,mkk‹Ÿü `ü%@Màm�¢ABëÔ¼}  è2O´im7ÅÃþ2™ŒMMMÙþþ>?ù  NMàm FðVHôpÀ]mš‡ ºEF›×>h­ØÇ6›ÍÚòò²�žžòn  ào5‚·‚š!Å— ­Ð@óÞD  t°Ú¬öQ³Ø+
V­VíòòÒ   ~Á[AÍàí�¢QBÍz Ð�òÚªö9öQíííµÉÉIÛÙÙ±››  ø5ƒ·ƒÂ["v¯„&ZõF  ƒµmíGìc:00`årÙêõºµZ-  øSjoµ„7Eìn	m´í­ @›ëÑÆ´wZ3ö²µµ5»ºº2  €¿ä-Q©T¼-|	Ð­4æí @z¬Mh)>ü�ŒŒØÆÆ†]__  À?ò¦ØÜÜ´ÑÑÑT_hÞP  ´‘§ÚŒv¢Ý§ø¿ÿáá¡ÝÞÞ  Àâmqtt”ê¹ ÷¡�f¼¥  hÏ´9í“f1788hV¯×yÅ  ˆB�á­¡æðöˆÝ7¡¡æ¼©  xÀžk‹ÚYìã˜Ëåü�½  ™7‡ÚÃ$vç„–Zô¶ àz©-i_bÅááa«ÕjÖh4   o5ˆ·HìÞ	Mµä� ÀÑ£½ÖªÚ÷˜‡°¯¯ÏÆÇÇmooÏîîî  üdïþYÚ
 0Œ“TMiG—qËqTÔ%‹1Ø¯ “_ ‹«8ØQºwÒº7¡R
bhpuqJ 	4bH<}9Ü±Ðžãóƒ÷;<÷ïÅ€yƒ¨E¼IÔ&ÑG€zÒXoùB  `ä´=­ýð¿²²bçççÖív  à©¨E¼IÔ&ƒ84´=o.  žHJ›ÓÞkmÍ¢699iårÙªÕªõz=  xbÞ$joµJô �4×¿  Ú„–×>D~ã?�NÛìì¬íîîÚÍÍoú  CEmâ�¢VñfQ»D~$í•ç3� €AIióÚG­£YÄR©”år9;88°V«e   CÊ[EÍâí¢†‰<t’›ç—  €himAûý—ÿ|>oGGGÖl6  `Èy³¨]¼aâ	à-¶àm @€qmQû¬Ýk±±±1«îÉÉ‰u:  x&¼]Ô0Þ2jšÈ#À}Òd‹Þh  <¢ŒVÔ¾h]Í"–Éd¬X,ÚÅÅoú  Ï‘7ŒZÆ›Fmyè&mVôV à¼ÒÖ´oZO³ˆe³Y+•Jvuueý~ß   ž)o5�·�'òÐKmÍ› €ÿ0¡­k_µ¾f›šš²��»¾¾6  €Q¡¶ñÆQëDúI«­óu  À¿z­m&WåÍ"6==m•JÅnoo  `Ô¨q¼uÔ<‘G€‡¤Ù6½á  øãÚ–V‹|øŸ™™±ýý}k4  0ªÔ:Þ<jŸè#@MÛâÅ€ €?5¡mh—‘ÿ…BÁ­^¯  À¨Sóxû¨�¢� —Úÿ  ø�¬VÖªšEmiiÉNOO­Ýn  Àáí£òŠl­¤åÊÞv  üÂm[«iµååe;;;ã3  àERy©‰¢� 5mÛ  —ÑÞiß5‹ÚêêªÛÝÝ� €ŸìÝ=K[q†qrjh+É`¥êÐMºõ#ˆ8‹¨ 38É"H&I	8¹ºwö8v(Ô±KÍbpÐ$8(•äéÍCÆBßòH“\?¸?Ã¹Î?'ç`\©…¼‰ÔFÑ‡ ß´œ·  òJÛÒ.4‹X’$¶¾¾nÕj•_þ  DMäm¤FòV
<¸Ð¶ø:  àµ¶­Õ4‹X:�¶\.gµZÍz½ž  Ày©‘¼•ÔL‘‡ 5mÛÛ 0–ÒÚšvõ¶ÿÉÉIÛÜÜ´ÓÓSnþ  ~~à­¤fòv
ü:À¹¶Æ'`ü¤µUíL³ˆe2ËçóV¯×¹ù  øÅ!€šÉÛIù$À™¶Ê!  Œ�—Ú†V�úåjjÊvvvìòòÒ   ð{ÔNÞPj©È'ªÚ/€Ñ7ýØ6›µB¡`�FÃ   ðgÔPÞRjªð¿x FR¢­h_µnÄezzÚŠÅ¢]]]   þŽZÊ›JmuÐí7áŠ7" `¤LhKÚ­õËÿîî®5›M  À?ñ¦R[E>	Ðí·áO ÀèHiËÚgíI³A.•JÙÌÌŒíííÙÍÍ�  ` ¼­ÔXÞZj®ˆC€§~#.{3 †ÞíDûqz<77ç¦ëëk  À@yc©µ¼¹"Z®ßˆ'ÞŒ €¡ö^;Ö£nþ+•ŠÝÝÝ   Bxk©¹"µcoG ÀÐy¡-jŸ´Í¹$IlaaÁ¬Óé   Bys©½¼ÁÔb‡ ýv\ô– �wÚ‘Ö‰8%žŸŸ·R©d­VË   ð<Ô^Þ`j±¨':Ú‘·$ `(¼ÕµûˆÃìì¬•Ëe»½½5   </5˜·˜š,êà^;ô¦ ü·RÚí£Ö	xÛ¿_hö÷÷­Ýn  øÁÞ«´†a§lAZ0¡¡dÌÐIëÐ‚ƒ“‚dÉ’)c\E7Gé-8fÊd¼!85Ù²�8H	q¨hyûð’+hÏkNÂÿÏ-œüùÎ!0j1o²B¡u;ÀïiS¸  Ò)¯ík#Í’^>Ÿ·ããc�F  €ÙR“y›©Ñ¢¾iûÞ˜ €Tù¨íjw? ÙlÖŽŽŽl0   ÒAmæ�¦V‹:¸Óv½5 ©ðA«h·þ••;88àž  €R£y«©Ù¢nµŠ7' `¦Þk;ÚuÔ›ÿ½½=Þü  ¤—·šš-òK€kmÇÛ 0ï´Mí—öªY’[^^¶Z­fý~ß   �nj6o75\ÄÀë´97ùS@ ˜�oÚ¥6Ö,É---YµZµ^¯g   ˜j7o8µ\Ä!ÀX»ô ¼©Uí\{Ñ,Ée2+—Ëvssc   ˜/j8o95]Ä!À‹vî-
 x_µ3í�fIokkËºÝ®  `>©å¼é"ZqÚ gÞ¤ €P_´Ó¨»þK¥’µZ-›L&  €ù¤–ó¦SÛEŒ´SoS @ˆOÚ¡vñ ßÞÞ¶N§cãñØ   0×¼éÚívä— ÷Ú¡7*  Q­¢õ#àvuuÅ›  €¢¶óÆSëEôµŠ·*  1ßµVÄƒ{}}Ý�†=??   ‹Ï[OÍuÐòV $â‡vqÝßÚÚš5›M{||4   ,&µž7ŸÚ/êzÀoV ÀYÕšÿø_,­^¯ÛÓÓ“  `±©ù¼ýÔ€Q74¹ þÝgí§ö Y’ËårvrrbÃáÐ  À_öÎ=4ç=Žã¹nsÙph¹'Š49Mä¹–‘²r�F¹çÖF‡dY.eÆ¬�åš
‹?FŒFö°Íml–Íu¦³½Ï§÷_GéÇùýŽçy~ïW½ÿÑöXÏóëû¼¿Ÿ«ž€ÞÏ< ½ óA zÖô°B!þ¦¦RœTxx8–-[†'Ož@!„Bx
z@ó‚ô„.JMèe…B|¡¦“Ï'‚9sæèò/„Báí  =¡yC7‚ >S=­Bˆ$ÆT`‚“ªW¯&L˜€{÷îAÀË;�9øõë×(//GII	>|ˆû÷ï£°°>Ÿ|NŠ‹‹ñàÁ<~ü¥¥¥¨¨¨@UUjjj „âç�ãïß¿ÇË—/ñìÙ3ØÍ³º¨¨ˆg·�áß<Çígù;ÖÎ×ÂžzCóˆn
èi…Bü-¿™²L8}ù4h.]º„ÚÚZˆàæíÛ·xúô)/óW¯^EVVŽ=ŠŒŒlÛ¶ÉÉÉHJJÂ’%K0oÞ<Ìž=qqq˜6m&OžŒI“&aêÔ©˜1cfÍš…¹sçbáÂ…X¹r%Ö­[‡Í›7#--™™™8uê.^¼ˆüü|^¼x¡ �Bü·½íÒÚ¥�ùœœœ>}‡Bzz:¶nÝŠ6°�{ñâÅHHHà9>sæLžãv†›xŽóßâããa?ÃŸµßáïÚkðµ<ˆ3gÎàòåË¸}û6=z„W¯^É+x~Îæé�ÐËfÑÛ
!„ø&¿šöšª�¾ü÷ïßçÏŸWÄ?ø²@¼pß½{ÙÙÙ8vìRSS‘˜˜HÃ7nÜ8ØgÏi¿Íš5s<º_¿~}´mÛÑÑÑ1b¦L™ÂžÂM›6aß¾}8{ö,òòò`&–Ù*!„_óéÓ'fæoÝº…sçÎÁvµ3P»bÅ
LŸ>cÇŽåîöŽ;¢qãÆŽŸã�5‚½6ÿ�Q£Fñÿ\¾|9€yÊÊÊÜ^/ÁÏÙü‚A€jÓ^z\!„_ñ‹)ÙTi‚“êÖ­÷¾~þü"°ùòå�¢™1flvïÞÍL~ll,zõê…–-[ò3÷5hÐ ]ºtÁðáÃYA�’’‚#GŽ0Ó`•
!<‰}³BëÆ�8yò$¶oßÎj¬˜˜tïÞ�r9ÇÃÂÂø7ÙßÆê�;v°ê+77Ö?Îà…šç’^Ñ<£ÏR¥)™^W!	1Å›ÊLpPÌÎnÙ²ïÞ½ƒÜr~ëÏg†ßJøiÂÆŒƒvíÚ1oÑzÇ#ö.ÌŸ BCC¨°’T>—'Nœ`Öëùóç¨««ƒB!ì»·^kfYwîÜ‰ùóçcÈ�!hÓ¦ÏqçÎp÷ÏñÈÈH8�íc`k‚µ)°M4ôŠöÝLïèÂ3TfŠ§çB�SÏ4Ú�‰ÿ-Z´€•êK9 yóæ¬¬Ÿäõë×câÄ‰èÔ©6lèFÐ93Ù¼ys<K—.…µ°:ÀÊLÙÿ*„ÜWÍÀæÍ›79ÅúîYÊß¡Cž}ÁtŽ[å+½V¯^�Ã‡ãúõë°�±
ê&ôŒæé!]Ú0šÞW!<J}SoS¶©Ö‡Ä/d+»æ„w0‘w^ú�?´Ç,DD?O/È²`,5µç–•.\€4·BP—'+ígïü¢E‹0`À 4mÚÔ3çx“&MÐ·o_Ø,´ ˆ’�½£}»ÑVXkÊ6õ¦BÒÁ…¡ì½¶L×þÔÕ*ïÏX†„“žïÜ¹ƒýû÷sˆžQ÷ È*EEEaÍš5Ø
Bõš
!üv6Kee%®]»ÆÁyC‡…]ú=ŽÛ{ÀÊ {O±ª ¾WÂï¡w4I/ižÒ•¡€ôÀBá1ÂMI¦
‡/Nœä{åÊ­ðñóa;açÄçU«V¡gÏž4K6üÉó¦ñ/œÐ¾}{Œ?{öìaŸiUU„âgóñãGØ@SVmY?<‡ž†…†Á.Lž?¿M”µ­±* sçÎ\Chí¼XVWWCø}½¤yJ7ÚV*LIôÂBá¡¡±¦§¿h{ôè›Ð«²iÿ„“ï‹‹‹¹æÉVô1Ûok�<o¿§ªÅ¦Qs€ í¯æNlË¸é9Bü”ª-ŸÏÇ-,Ã†ƒ•I+xû�ëm-«ÒÒÒX`Ã•¬ðïõ€ô”æ-Ý˜ATbŠÕP@!„Wˆ2å˜êLpJ]»vEzz:³ÂÿJDmeËüGŽ	Ëö+Kôƒ.!!!Ì´%&&"??>|Ð°)!Äÿ²¯¿¨¨ˆ%íÖçÎ ¤U*yþ\þ‘ê.{ïXù¶qãFØ{ª/?¯tÙµk=¦ÃÏB�)‡žX!‚|â¤)Ãá¾®Z»v-§Çÿ¡¦¦¶ï™Ã�l¨?'»ÀzÞ :Gtt4[(òòò`Õ
!œ†åê………HMMEŸ>}ÐªU+X6Ôóç°•]¬žè×¯RRR`CpðßÍDô˜æaÜ˜�aŠÔf !D°iúÝá¾FÒãââP^^á7esœ`Ÿ™™ÉŒëÖ­eÝKJm{ ×låææ2 „²w6¯´®a/å”(_1ØDdàcbppDÖ #,…H¢m™()ƒ£�¤µ{`ä{¸‹Úe‘�R'‘$I9>Ú«Í€ÕIû>W÷àÎätNÏZï»ÞçúÕõxô¬ë}î�ËÀ®Ùš››“ŠŠ
ÁÇªõ÷m¬t‘x£³æÁ`PðØ¢{â.à1ÕkÂsÆbÀïê‘	!Äc¤Bè›é¹ÌÓér4â<È¯×È£��ñûý’‘‘Áÿ8> EQ«WWW¬$Bþ÷È’GtÆ1~Lf‰óC@]]�¶œã¸çÅeÀkªç4ïkÔÔ+Bˆ‡òþk¡sHJç±I^?<‰ã¦Q+Ð�@@0£ÎV‡„ö\5�+++‚Ø).˜"„ü§vÿÝÝ]éèè�ÜÜ\Îø;4���-���²¿¿/Ñh”ã]î)r¨ç„÷ŒÅÙŸCµê™	!Ä”B_¡wHL©¤¤DÐb®sæÄÑD�ô…BRUU%ˆ<²ÞÀ¹ ’¤ñ�]]]rxxÈÅ˜„�}ÀEuSwŠó×yi,|ŽÆžŸŸ³À=»�Ô{âlLŸù;ôU=3!„$8Ðg(
‰)åääâÐt:q6Öo}}]|>Ÿ ÝßzÃæ2iÄbii©ÌÎÎÊíí-;e!ÿDcýVWWµª‰tëïM·	�ê:Š±¸¸È®.— ï©^ÔôyG¡Ïê�	!$AIƒ>BßMÿö÷÷ëvyâj@îîî4Š®¬¬Œsþî–v´µµI8æn Bˆ‚Š²nž“¢¢"Aç�õw¥›Ç


¤··WŽŽŽø˜ë<êAáEcÑõøú¨šB0òÏ]@bP'wzz*Ä¹ÍÐ[[[‚Jn…Né#k4Ã;‰p¦”‹yyy‘ååe©¯¯gÕ?±ºº´`aaAÏ�8ŠzQxÒXœõäc4 !$QçþBbH“ƒEl�s¦ê¯18333	…Š„õf,•——'}}}‚åRÜŸAˆ…;[.//e||\>|ø`ý}˜¨ÊÏÏ—ÑÑQÁn v8ë‹Ô“Â›š>ãŸÜ@I4ò OÐHIÛßKÄ|Üø£Õâ““ééé‘¬¬,ëÍ—–K•——ËÒÒ’n˜&„XÑò¯;[ZZZXõ÷€RSS¥±±QÐ‘Ç¢ˆ³]‘êMáQMŸñè“zjBq9¿@=ÐŸ¦èFFFäññQHÜM£V‹ÛÛÛç`½éò�ô ê‚@Bˆwy}}ÕE¨TrÃ¿·F»tŒcmm�#oªÕ¼GR/Ý£ÞšB\Ì¯Ð$&…Š…¶º‘ø‚ê°Î‰ÖÔÔXo´<*Íú�ããc!„x�››™žž,ú³þ¾ó¨4ºqrrR„8‚zTxÕXœï‘zkBq)ùÐ’é¼ÿ††ÙÞÞWÔHLMM	²n­7W^WJJŠ477f™5Mˆ·–”é_ff¦õ÷œ×•žž.ØJ¯;ˆ#¨W…g5}¶ïÐ’zlBqaä_ ú‰!é’"dß2ï?ÎÜßßËÄÄ„ :l½©²EÉÉÉÒÔÔ$›››Ü³Aˆ8;;“ÁÁAÎû[ö˜;<<,8{.t xUõ¬ælª·0�â¶È¿&èHL	¦E+ÐOOOBâ·!úââB†††$--Íz3e£*++ó¤\HH‚òööö÷Þ|Z§ÙØÚÚ*¨Fëÿ‰/ð¬ê]Í?¼©Çnb4 !ÄM‘_ 1¥¤¤$éîî–ëëk!ñ3�â÷û‹…¬7QKg…çççåùùY!	ƒF{nllHíoµŒjµ\ÕÕÕ‚Ôvt9 ¼«zXxYÓçú…Ñ€„7�MAQÓsÿápXHü>þ÷ööÄçóYoš(•J(’H$"„�¿Ø;ŸWÊ¿0ŽççÝ¯È7ãçFbáG~-|Ã†šR×Ê†4MÓ,$Ke¡dAYèÖõk…ÑÅeáÞQ·»pÇJ’qËb&”â*\]Ï÷éÙ}ë›Ìu>‡é¼_õúç¾ÏçœçyþŒqd‹‹‹TVVfüþEª¨¨ ¹¹9
ƒ´"V}? ÉÚ}’½ à…ˆfß²ßUÏûŸŸŸGÝ¿ÆÃ¿Ïç#®ÿ6>,Áÿš››KÃÃÃtvvF €×Ëíí--//Syy¹ñûÅ¨¨(*--¥ññq	´ö�,Ë™Võº~gßJ € �ýÂ’*m6ÐÅÅ=7FÜù7ÿðÑ1�ƒƒƒèÅÀë=hÈ¸V>è¿_Áÿ7//�œN'>h†³¬dZÎ¶ª×ô‹dp  ÐÌßl{Í’*ív;êþ56üóz½T__o|8‚�›��M£££t~~N €WõWžxóÏø}
>naa!ÍÌÌàu¥þ~ ’m¯ç5Û'Y  4Ç¾g,©²¨¨ˆÜn7…ÃaÖþ766¨©©ÉøPŸf~~>�ŒŒà#  ¯„_·¿dlgqq±ñû|zO —Ë…� áL+Ù–3®êõ°ï%“ €þaý,©233“¦§§1zLÏ�‘þ[ZZŒCð·Ëä%ÀÕÕ ^öæÿóâg9Ðq�·ñ{|²Ò$raaÓ4ÂÙV2.g]Õëé—L  ó†�bïYRabb"õööbä˜&¶¶¶ˆGý‚`dæää×ã#  /Äýý½Ìx/))¡ØŒl…‘�ôx<26è�3®d]Î¼*×òž�’l  Ï¾cXRemm-íìì°ž““êêê¢¸¸8ãŒXyr¼ººŠðÀ°»»+S[bcqø‡‘ÛÚÚJ›››ôðð@@’u9óª^Ëö�dt  °€Zö+û òI1Ï-ÆAB———ÒÍ=--ÍøàŸ¥|@ªªª¢õõuôì @rP;88 ÎÎNâ[Dã÷!ø,åR{{;/k„³®d^Î¾*×ò�ý*  “Î~bC,©0%%…úûûñôßzä¹öÔÔñ<ZãCT÷ ±±‘� n� ÐÀññ1õôôPrr²ñûTc||<uwwÓéé)m¥ ’}9«\ËûI²:  ("†ýÈþdI…ÑÑÑÔÜÜL{{{¬oú·´´D555Æ‡¨Ö¤¤$â	& `1¡Pˆ&''qø‡ÊMOO'§ÓIwwwôÀÙW20ga•kù“ý(™  PÂúØ0K*ÌÊÊ¢••<ý×Ôô�ojQ÷­Pþ—ÇÆÆ0Á Ç¶z½^*((0~¿�Ê•)ÕÕÕ´¶¶&k@K)€d`þýT¹–aÖ'™  žÉ_¬CåÓ›ÍF\‹.5éÀú'£8üC+•ÒžGŽ$ Ô×ýK™MCCñm¡ñ{´Æ˜˜²Ûíä÷ûQÒ¥¹/gbÕ¥ Éî  !ñìö‡Âºaù‘Ùßß'`-777òã’ššj|¸�–ß I‰	w8Fx@!‡‡‡2¹%!!Áø}Zß×¥­­�ŽŽŽhA²0gbÕ—4?Ø˜
  ˆ”böVtH�›B·Û�gfžŒº\.ª¬¬4>Ô@-Ê…û ©' Š¸¾¾¦‰‰	âmã÷¨E™444„×\³šÇã‘lÌYe)À7Éð  ð›$²öFåÈ?‡ÃAÁ`�€µlooS]]æDC­fddÐìì¬L� à_öÎî•ò5ŠãgœÓñþVç¸Ð¾Ð.:HvQŠLyijÜÓV‘¶¹E»”‘\*œp¥\(%t„r¡F.hò2¢Ð˜$c£¢Ñn·Ç¬³ZÍÍ™Ç9óìgÿvÏ÷SŸ¿à·{ö÷÷[ëYüXëÿòò2egg®@½æååÑÂÂ-H&æl¬z5àû§dy  x$?³Uì;–(;‹].y½^ÁåêêŠ(22Òø õëp8ˆ_\p €àèèˆœN'>âÂ�Ì¨¬¬ÄŠW}H6nnn–¬¬ðY¾c+±  ðž°6v–°¤ÂœœZ]]ÅŸ‰†ªÑøø8ÙívãC‰òá©©©‰< þwë?æ·À�^hmmE7—¾ì&™³²Êç`ÿbm’í àbX7ëU¹cvpp�|>�àþ�ìííÉ´hþ‚o|€�¡3%%…ÆÆÆdw9 à¿Ý	^[[#î¤1þ�¡5##ƒ¦¦¦P¸ÑƒddÎÊªg~xY·d{  ø¿°ÏØm–T˜””D���¨jàææ†ÚÚÚ(>>ÞøàCoAAmll àÑÈG\î ÁêVh‰« ØÚ¤ÎÊ’™9;«|–Ûì3Éø  ð~g'Y?K*,**¢ÍÍM|A2÷÷÷4==MYYYÆ‡h�« n·›.//	 ð¨Õ­Räðoüù-¡ü»»»±¹I_'§dfÎÎ*Ÿ£Ÿ�dû	  ¾Qý¯eß«œú?00@~¿Ÿ@p¹¸¸�]²ÑÑÑÆh333‰b¥ ÿŽÿÒÒRãÏhe5]qq1moo£�£ÉÌœ�UoxÏÖ   ð%°¯Ø�
y­««£óósÁ¿3:::J|ïÚø°­eDD„´3îïï àáí-½½½eü¹­e\\µ´´Ðíí--Hvæ­²¨ó‘}%Y  >Åö²XRann.­¬¬~ëÿáá!•””`ð´bõH&™c   °¸¸ˆ�ÿÐªÊõÂ¹¹9É@’¡9K«|ŽØ^Éü  ãù•}Ê¾Q9¼³³�_ÓÔØþþ~¬‹‚VVIíîî àkNNN¨££ƒ¸cÆø³Z· ¶¶V:U€$Cs–VÝÝù†}*Ù `4iì${§à`‘ÉÅÕÕÕt||L øÃbvvv¨°°ÕhicccihhøY™™žžnü9­­Íf£ÙÙYÌÐ‡diÎÔ*·‚Ü±“’ý ÆÍ¾`oT¶‰ÍÏÏÐ31º««‹�&Ðú–——Óúú: þðkjjŒ?`xlv©ªª"¯×K@œ©Uoxºa_È;  À8ž°ö5ûIÅ¡’��@ííí¨òé©þËT^‡ÃA|ÏÚø`­oLLõõõÑõõ5 ä—ê?WV�?`øtÌÌÌ`³‹Þ« ’­9c«zŽŸØ×¬CÞ  F‘Ä¾d}Š†}É º­­-zîþ÷ôôÿ!H`øXVVFKKK  :==¥úúzãÏ6Ê–
§ÓI�‡€6$[sÆVYðñ±/å]  `‘ìsö-K*LKK“Iß@OÕèàà€òóóQý‡áÖBŠ¡ |fbb‚ìv»ñç/SSS¥ Ð†dlÎÚ*Ÿå[ö¹¼  ŒÙù?ÁúU}v¹\tvvF øøý~¡äädãƒÄ, ð7{góJk†ñòUä+z3z•Î�‘:)#¯�Ð&ÅðìRÂD2 “¤“N)D'ŠRG>Ç@tü¶ö±}$”ò•l]ïÝý7¬ÖîYëúÕïØ«çéZû¹×µH ÑsÔ]]]Þ¿hð”»éµ·âúúÄ’±5kKæ6µ–qqA÷„/ŠÿÂâƒVVVbkkÄÎ×ÕkÕRRR¼"4xæææbbb‚_�ˆ×¬¬¬ ¼¼Üû÷¦………ØÝÝÅÇÇˆ54kKæ6¹–b˜…€„¸_üW!þaÂ¼¼<ŒŽŽ2Ì[âéé	‹‹‹(((ð>€Ðà
…‹Å@ˆ¯ïqùúÏë[i ¯víëëÃãã#ˆ=$kkæ–ìmr=ÿˆ,$Ä]òÅQñÝÀC¿@·¶¶âääÄ
ú[744@FÀ¼ 4ØMÒóóó ÄG¶··QUUåý{€Z½š.‰èd"±›%{›œ}Gu�@qŽ$ñ³596==bµÓu¡ö>xÐàÛÛÛ‹ûû{âÛ1®ññqv¸ÐÀ›ŸŸ�™™í%"VÑì-ÜäzFÅÏºW „8Å¿âñÍTñ_gg'®®®@ìpww§êÒ¤î}ð Á·¦¦†W/‹¼ÚÚÚ¼þiðMKKƒ|‰f }4{K79ú&þÐ½!ÄRÅ6ñÊd“÷ææ&ˆ=dÔŽWÿQgÌÌÌÄÐÐûCˆwåÅÅÅÞ?ÿÔ�2À��¼¾¾‚XE3¸dq“ëy%¶éž�âŸÄŸ"}ý×Æ——{Å/KKK�M“÷�ƒºcss3ÎÎÎ@ˆ/Ç¸úûû‘””äý³OÝ¹ÕexxX¯µ$VÑ.YÜt'ÔOÝ3BO²øE¼aÂÆÆFìïïƒØCFìôÌtjjª÷�ƒºcii)VWWAˆAþôòþ¹§î(™D-£Ñ(ˆu4‹K&7¹¦·âÝ;BM‰øËd{÷ÜÜï~µÌÁÁd³ä}Ø î…ÇÁÁA¾Oˆ,,,püŸ:gvv6äh�s%fªH3¹ds“kúK÷„�À’.~Ÿ¼tl1ãòòÄÏÏÏX^^FVV–÷Aƒºg(Âùù9q™÷÷wtwwsŠ‹ºøG®m¹¹¹±ŽfrÉæ&�=‹_uA	$Õâo&¬®®ÆÚÚï|µÌéé)zzzØþO�´¬¬ëëë ÄeQ__ïýóN�S‹‰+**‹Å@ì#™\³¹dt“ëú[÷„�À‘'~ã¦Šÿ&''yo·}´aWÆÿYE�4==### Äa´Äµ¤¤Äûç�º[¸±±Áã\‰A³¹dt“…€qñ›î%!�¢N<aÂ¦¦&–¼$hltvvrß®÷ƒºkGGï’&.£#ÒÞ?ëÔIuBqll 	A3ºdu“ëz {	BH`øGü.¾™x	äääè&4�ƒØoÿð>\P·­­­ÅÞÞq‘ÛÛ[H×…÷Ï9u×ääd´´´àââ$1HF×¬.™ÝÔº¾‰ßuOA	ÿ‰E˜°½½ÇÇÇ ö‰D"¨««ó>\P·-**ÂÔÔÈÿì�Í+åaÇ›‰ˆHÝ’Q—i¹,mlˆR�ÄFÊ‚¦I“º‹’±P"Âî–—nìPŠB),¼Ô,¼ÔÝÜ…�$5�9�¿áé>�ç|?õù~Îõ}ÞÎ>r||L<*M}�C¿ƒtvvFÀ’Õ9³›ü®¿eM pž/ìûÏDñ�wÁ».KlooS P, ß¦¤¤Poo/½¿¿ ¾±°°@êëz­<q‰F£ôòòBÀÚX@ÉìœÝM}×ìŒ¬-  Nóƒ½34öOÞ->>>H><SW‚#wØU, ÿ677c ð’þþ~â+Òêkz­4 Âï¸]$³sv7Ù8úNÖ  gùÊN™:ý/++£ƒƒiD’ŽÌÔå¦êCÔauuµ\•À'žŸŸ©­­M}}C7¹Z[[éââ‚€ÕæÑ’Ý9Ã›¼0%k €“ô°·¦ºŒŽŽbìŸ=d¦.7ÕQ* ‹ŠŠhee… ði>÷ÉÉ	ÕÔÔ¨¯oè½r[1??Ÿvww	ØÈÞäÍ£[Yc  œ£˜�±dÂÊÊJ4s±ÌÑÑ…B!õ¡ê¹>:88H xôWºr———«¯o¨g`ii	7Gí#ž³¼Éï“µ À)~²M�þ���cž«e¶¶¶(33S} €zloo§··7À—«¸ÃÃÃ”——§¾¶¡ÇÆÆp{Ô>’á9Ë›¼ðWÖ  gøÎ®ZüËŽáùù9»ó\çççÕ	¨Ë††º¿¿' |€7³äWjjªúÚ†zìééA#@7�,Ï™Þä&Àº¬9  ÖùÌö±qÅ���Msssãb™D"A|r„	 P•<+� �7ÄãqªªªR_×PßFîåå%ûp–—LÏÙÞÔ÷�³}²ö  X%Ä®šûW[[KWWWìrssCÝÝÝêƒT¥ô¼ØØØ  |yƒ[QQ¡¾®¡.KJJèðð�€H¦çlor,àª¬=  VOÿ#ìE�““#‹^__	Øåôô”êêêÔ	¨ËÜÜ\šžž& |˜ °¹¹I¥¥¥êëê2--Mþö�p¦—lÏßÔ7þÃFp  {„Ø}SoÿñþÖööö¨¸¸X}�€ª”·Ò€ fgg)ª¯k¨oÀââ"&¸ƒd{Îø&{ìã  vøÄ†Ù„‰b�F¥ù°O,£¬¬,õAê³££Áx±022Bü¿U}MC} è%åXciÎø&�lXÖ" €¤ò�Ý1õö¿©©	§ÿÇååe4 „*mii‘&˜ |ð€ÒÇ%==]}MC}†ÃaüŽ;x€³¾É^ ;² $õôÿ7°S+ïn×ÖÖpúïP×ÖÉÉIl @•Ö××Óõõµ¼¡à#� ä¿eõõuÚÕÕ…C%÷nHÖçÌo*_ÆÙ_¸ @ò(1uúŸ‘‘A���ôðð@Àžžž(‰` ªô?{çÎÒh„aˆ«‚aUDAQŒñ‚¼b#jcã¥YAÐJ„TA±ôØÙ¼ º"m\¯)¢… "¤QØÅbM¡Fv«Îóv¿8‡yx~ÁçÄyç;ßœžžº¸¸À  8Íóó3ñýÛêëêtdd„’É$»à^_z~îý���L È:9ìWS›ÿkkkéððPÞV ;x||¤™™  J»ººèàà@>…ÀU~þøI���êëê´¯¯�nnnXw2Iz~îýMÞðU²	  «T³§ì‡×ÂÍËË“Iàëë+{¸¿¿'þv ¨ÒP(D¼¬ àüÝÛ­­­êëê´­­�®®®Ø÷üÒûs0ñ¬?ØSÉ& €¬ác#ì/–¼‰'�Ø¸maã866¦¾�€:mhh h4Šß%à2~š››Õ×3Ôi  óósV.(•ÞŸ3€©çý‹�HF d…bö»©·ÿ£££ôòòBÀ.®¯¯ippP}õ6Ž|… ÀUdÅññ1ñ0K}=C�JÈV"½?g “§ ¾KF d…/ìK^­©©¡��z'`‰D‚øû9õÔiEEñýéømN ö÷÷©®®N}=C�æääH ;áÿ¯’8˜zæ’Q  Æñ³ßØŒ×Bõûý4>>N©TŠ€}Äãql�†j---¥¹¹9 €Ó€X,F|ÄV}=C•Ê£ÝÝ]öÂ@² gÏ<Ã~“¬ 0Æ'v€M²äUþ.Q&³™L†€}œ��Q{{»úê´¤¤„fgg1  N ¶··‰ß®©¯g¨v  o˜�µHà,`rWI’�Ì 0Âg6ÊþñZ ùùù499Iétš€•È·£---ê¨Ó¢¢"ŠD"  § T]]­¾ž¡Ú€Üæì†³€dÎ&žû6*™ àÛÏÞÚ°-wl{9::¢ÆÆFõT©G‡Ã  W‘+,WWW©ªªJ}=C½ ‚É0Øg“KïØ~Ü €wüìûÛkaæææÒÄÄ½½½°Ùœ[__¯¾�€:-(( ©©) €Ó€ååeª¬¬T_ÏPï `}}]jØgÉœL<ûßìv à�VöÖÔæÿ­­-Ld8ÐÔÔ¤¾�€8 €«€µµ5œ €8€~Ó‰O–8˜ÜYr+Ù ðßä³lÚkAú|>¢§§'vsrrB¡PH}õî ˜žžÆ  8ÝPonnb Ä àœ$#pV0ñüÓì‚d Àd/Ù�Å(÷¯¬¬à8–#· ttt¨o  n Àå[ �€úz†¸ 8qjI2gÏÿƒ½” øgrÙ0›bÉ«ÃÃÃxûïñxœº»»Õ7P§eee4??� pz ‹Å(ª¯g¨w °··GÀ­S œLý¤Ø°d À?QÌÆØŒ×B,//§ÅÅE|‹å‰D‚z{{Õ7ð/{ç÷J÷ÇñÍ�"ìb.\lé-”L4�\�•¬Ü åB)w.Ž"«å2¥Ý,¡¤]HDqê É�bg.¶CÔ';g{íÕëbµ¾û~¿«ó¾y^ÏG=þï×éý|ù¼_/�fffRoo/ ÀêÀÜÜegg«¯g¨Qyv*5 ¬úÝ’¬À™ÁÄøÆ¾•, økX7û�¥h­¬¬¤ÃÃCvàóùÈív«¿@@•Ê ¢ÁÁAŠD"€­éÅÅEâÕZêëª�å"�€UHVàÌ`ê|`Ý’i  E:û†šxOÛßß�·ÿ±»»KMMMê/P§yyy466† °¯×K.—K}=C•Êó—••ÖÍ�ÌÀÙÁÄ9²o$Ó  þ—ö1ûÑÄð?&'Ÿ”{8::’=èü†Ný%ªS6`ðôh4-�õ�ÜÂÂBõõU*gccƒ€•ÏPM¢þÁ~dK¶ ü'÷ØWl(ÚâKNN¦ÎÎN
…Bìáôô”ºººÐ €*-..¦ùùy4 €ÕœœœPQQ‘úz†:­¨¨ íímöÁ™A²gg!Ä¾’l øWî².ö½�ÿþËåcaa�€]òx<h @•–——Óêê*†–«¹¼¼¤ÒÒRõõuZ__Oì„³ƒ©æö=ë’Œ ø#Iìök´EOmmmt~~NÀ.‚Á ñ$V4  Jkjjh `5···Äg¿ãP¥|ÿ”¯`€�pv�¿!g	çá+ûB2 à�<dß±‘h.''‡¦¦¦Ø9„ebbG¨Ò††4.�íÈËöövJHHP_ÓPŸ===ò5#°Éœ%Lœ‡ûN2 à$²ÏØ€�b“)ògggìdff†RRRÔ_" >[ZZ( ¶7 úúú(55U}MC}Ñõõ5{áar#U€}&Y ðØIÃÿÒÒÒhxx˜€½,--¯CS‰€ºŒ‹‹£îînÀ	_r�ŒŒPVV–úº†úÇ Wû‘,Á™ÂÔ0À×’u  ¿ˆaŸ²~Ãÿªªªhgg‡€½lnnRuuµúKÔezz:š—À	È‹ÙÙYÊÍÍU_×P—‰‰‰rö�õH–àLaj Ÿ}Š•€ Â}ö¥‰·ÿIIIÄo¯ð	­å¿U‘€ºÌÏÏ§ééiÀ	lmmïÓV_×P•òõâÚÚûá,!™‚³…©Y /%ó  „G¬�¥h-))¡ååevsqqAü~TýEê²¬¬Œ¼^/à¾|þB¼]}]C]ÖÕÕÑÞÞG ™‚³…©óá“Ì ¸Ï>gC&Vÿµ¶¶ÒÕÕûWH�ŽŽb Temm-VGGýŽ766Rll¬úÚ†zìèè ¿ßOÀH¦àlaj%`ˆ}.Ù åd±“ì÷hËårÉú8àä¿¥S™€zlnn¦››À	„#aòx<”‘‘¡¾¶¡ð�(g!Ù‚3†‰óñ��”ì€bbØ'ì'C]Wy;œÁúú:¨¿Lüdï|^yO£8^Æ £D“Ùh¾CYLùI�ÉDS²ùŠ’åµºYè&)?"$;+«+’D
å›’X]WÈ�©ï,$”K!\7Ô{Nç_ø>«sÞ¯zýžóñ¼ŸïóœC]¨o»»»Aˆ¥I sss(..v_ßÔ…ú+ñÌÌ' ìK%#Ô:¹ÿa3@â™_Å^ñMDêÌx¹2®�‡‰âñ8d«ûõaAA¦§§Aˆ¥I ûûû¨®®v_ßÔ…:örssÄÜ·L3†d�ëäMìÕDˆSÊÅ/!FÿÕÖÖêFƒØáöö===î7ÔOÀ­­-b­¡kcc£ûú¦öMNNF4åj›hÆ�¬j$àÍ@„8ä'ñƒøCDjƒ!ygÈ·³ÆxÇää$HQ644àòò„Xûå¬³³©©©îkœÚ6--ƒƒƒüŽÛD3†d�P{ÒâÍB„8ãwq2ÔììX,b���6�¢ÖÕimmm|7JL255…¼¼<÷uNí÷qYXXÀóó3ˆI4kHæµf&5âŒ¿Åx€Òñççç ö8>>F]]�û�µm~~>&&&@ˆEvwwQYYé¾Î©m#‘ŽŽŽØ‹Ê.š5$s„Z3qÍB„8â±#Äè¿œœ6ÿ3þ~´··×ýÆ‚Ú¶¦¦{{{ Ä"wwwì@-«×Â¥i1¯ÿ;i(Ù#ÔHÀÍD„8áOqED¢¶´´àððÄîÇvvv2ZÇýƒÚµµµ Ä*ýýýÈÌÌt_ëÔîûÿ±±1<>>‚˜F3‡d�PkgE3!N¨¿…8qÇÓÓˆY´3zii)’’’Üo2¨=3220::
B,³¸¸ˆ¢¢"÷õNMªãáÖ××ÙÇÅ>š9${„jøM3!øM‘¨eeeØÞÞ±ÍÙÙ:::ØEšZT¿ckkk Ä2ñø¨¯¯w_ïÔdWíq�ÇA\ ÙCþw‡ZCCš�1Î_â× £¡ðúúÄ6///X^^†œ°»ßhP{677ãêê
„Xæõõ]]]HOOw_óÔ–)))�^EÚë‚¸@³‡d�Pkè«f#BŒÏþÿ(~1ne~~žÍÿœpzzŠòòrÈI»ûÍ5£†¡¡¡!~Çˆ›g %%%îëžÚÿ·ººÊëÿ¾úSi‘¿}ˆ5ô]ü¨‰£DÄÏ"µªª
 >¸¹¹A{{;›RSbee„8@¯HG£Q÷uOÍ¨{’ŠŠ
œœœ€¸B3ˆd‘Pké³f$BŒò¯x¢Xpâƒ··7,--AN[Ýo8¨›ššpqqB¼|Çûúú ÓÝ×>µaVV†‡‡q{{â
Í ’EB­¥SÍH„ägñ“ø*"sss‹Å@ü=�“vN &ÌÎÎÆÈÈ¯�WÈUi> fŒD"ØÙÙÑÃ-âÍ"’IB¬¥Wñ“f%BŒñ‡8%"5üÉ¯f¼nå�ÿÙ;›WêÓ0Ž/£&² Êa=ÏB^JyÉŠ…œÙXH1+‹sbaI�Ò��Bg&¥ÔÄÂÆÛcacX�…ÇËÆQ^òr<çû\]+óÌa¦Îoñ»ÝßO}þƒs®îïï¾îë
‡Ãèéé�Ü±þÐAÍ·¼¼‹‹‹ Ä&ÎÎÎÐÜÜlýÿŸ~ŒöyÒ¢O‰•h‘LâÔÅÔ¤f%BØþÿo=ÆÇÇ¹ûßB^^^°´´„ÌÌLëÔ|}>Ÿ~Ô"Ä6††† ­ÓÖ× j¶iiiƒxzz±É"šI$›ð !1øYô‹'†fmnn‚ØÉÉÉ	dmWIQ£ÍÍÍÅÌÌ±‘��TTTX_¨Ù»ÿ¹ûŸh&‘lâÄï*"ú53òAø$þáDûgg'wÿ[Ìýý=fgg‘‘‘aý„š«×ëÅáá!±‘ÛÛ[Ýê’””d}- æ®þëêêÒ3	±Í$’Mœzð»f&B>­âß"âP'Ë­‡­(v¿!­««ƒ´\Y¡fN�åð?b5sss�Tëë5Óüü|¬¯¯³ŽÍ$’MœÚnr ™‰�@ŠøEü&"õ°°³³b5úÞnjj
2EÝúC5Ïúúzlooƒ‹Ñµi~¿			Ö×j”ú±µµ•«¨‰ h6qèƒæ7ñ‹f'B§D\qâ½Uww7§­Ú>]RRÂ•€Ô¸¶ÑÞÞ^<>>‚Û‘ç\(((°¾.P³ÌÎÎ†¬³ÔÁÄ„šM$£hVqà7¶¢Ù‰ÃùM¼�ÉÉÉ�Ã.Q000€””ë#Ôkkk±ºº
B
…ÐÖÖf}] Æ¨kˆ›ššpqqB^m©ÒŒ"YÅ‰ßÙ¥f'B&YˆˆCm,++Ãîî.y½µ¨¨ˆ-¤ÔSSS166†››B LOOC¶bX_¨æååaaaÏÏÏ äšQ$«8u&h†"ÄPJÅ¯NÿëëëÃÕÕyÝ0<<ÌY Ôù“�8??GGG?äR·«[+ZZZøöŸÄB3Šd§†~ÕEˆ¡´Š!ñ˜žžùâÊöó‹«tp uýÐ¨@  ­!ÿ$BnV­¯ÔÝæää`~~ž“ÿÉ[Ï 4«Hfqâ÷â6 b*?‰Cb4Þöÿššìïïƒ�¹»»ÃÈÈ¤àZ8¡®žüÏ&„¼Áññ±ÐJLL´¾VPWª·º^¯áp„¼�fÉ,Nt4EÅ!ÍR„Æ/â‚Ewpp�-W$&Ñh§§§¨®®†Çã±þ�BÝ¤n/Ñ�S|3JÈ;¬­­¡¸¸ØúšA]YÇuÅÛòò2oÿÉ{hV‘ÌâÔ3€ÍR„Æ¯â�ˆ8Ô÷Ý+++ô‰E$Áää$²²²¬?¨PW©7šíííØÛÛ!äm®¯¯Ñßß™²n}Ý ®R·ù|>í8$ä¿.¥$³85›ê@³!‘(~#qüðõ]wUUŽŽŽ@È{\^^¢¡¡�‡Gêº‰Ñ²öO?RBÞgó¯MTVVZ_7¨»nÿKKK±µµÅ‹(òÐÌ"ÙÅ‰ÙTñ³f*Bá“ø§CÓÿÙþÿ�½swil‹â0£âQQ¯â‘€…ŠXD­nQ,„�±PDázñm!âm¬d„Ne!¦ÑiD´‰X©ÅˆdHÑhˆ�‰ï×,Ö?p=Ù;ž3ìßßpXgÿöc-ð¿ðµ<i¾R]]mü‚:ÃôôtšžžÆ›Q ÞÈÓÓy½^ÊÊÊ2¾~@gXPP@ÜgO¸€•g :§¬H¦àá3Ð17{}}o®À›¸¿¿§ÉÉIŒ„Ž85jnn¦@ @ €·
†h``€xäšñuÚªœàz<
‡Ã€…)É.œat|‡ÉT ü|`½ì£êº¾¾Ýÿ�%‚Á ®�B»•ÌÅÅEz~~& €µQZ»»»Ò�×Æ×hŸ.—‹VWWqâšÀFG{d½’­ p8•¬Ÿ%e÷hhˆnnn +‹GŸÏGÆ/^ =¦¦¦R__]\\ À:���´°°@üŒÆøzí±°°�FFFäf! ‘ìÂF×M&¿d+ LèþŸ™™I¼óŠæYÀ2±XL:öò7dü"¾ÿ•Q·ÛM|‚‰†Q (°··GUUU¸ m©ã���h@T¦SI†áu(¦ cø��)|è2Ï½¦¦ïgAÜPcc#ñ�ÜøÅ|?óóóiii	§F (‰Dhxx›¸Ðkkkicc›¸@	Î0’e8Ó¨~“1ÉV 8˜ö›†÷³ruæòò’ ˆw÷uee…x|�ñ‹ø~]ÿGGGñl	 µ·³òÿçÍ4ãk
|‹‹‹innN&R  €d®eº¦š|“Œ€Cif¿ë(À¼ûŠ”ß‘ÎÏÏSii©ñ‹˜Pe‡¿¥¥MKP 
QOOegg_S =›¸ÝÝÝ�F	 cM%Ëp¦Ññ}~—Œ€Cù‡�²¤bCCh-\__Soo/qc6ã70qïE+++‰ôÒ„ `�““êïïÇµh›ííí´¿¿O hB²gßgT2 ä#û•ý¥ò‘§¥¥Ií»»;@;;;Ä3Ù�_ÜÀÄ˜››+WFooo	 ßøÖññqâÎëÆ×h�uuu´¶¶F///€.8ËH¦ál£ú�þb¿JÖÀaT±~M´–——Q„�6x†¯tcå¦€Æ/r ^322¤YÙÕÕ ¬s||L¼@Æ›h›ååå2vòáá� ÐˆdÎ4ºê›_² âû‰ê(ÄGGG€NøÇ.ÝÙ].—ñ‹¨Ç¤¤$jkk“ÓK €uNOOipp�rrrŒ¯'Ð¥AÛØØ6qA¢�LÃÙF×8ÀO’¹ pÐÀö§ê‚Úãñ ‹6HòƒŸšš¢¼¼<ã=PÍäädy×·¹¹‰wÿ ÄA8¦™™*))1¾ž@{LII¡ŽŽ:<<$ gÉ6œqT¿ÙŸìl  'ñ—†ëÿÌfgg¥{; ‰àìì�¦ jÓ?	ÿ<fRÆM ¬q~~.oþ‹ŠŠŒ¯'Ð>[[[¥G ‰žHÅÙF×á“_2 áoöK*–••ÑÖÖ–¼Ù ‘×±ººº0 Æ£<#ñù|èS@D"š˜˜À›h«MMM´½½M¯¯¯@‚ûPI¶áŒ£ãÛý!™ ‡\ÿÿ—½T�£ív»å„ö7{çòWÅáGiQÆçBÛ¢Ÿ [Q|,ld˜€AÄ¬\‰â"ÅEAD‚‚Ø_¨hÜ(Ù¸;(ˆ�´�B4Qmk#(19s800‹fì{çÖíÔïƒï?¨®®ß­Sç ð³»»KÏ{N¼î´?Áÿ¬ÜX£J	€¸ºº¢¡¡!â¹ØÚï%P�¥¥¥´´´„�¸ÀÒêSÎ8fœ9¯ØWx ì@4û–ýj´ü¿§§‡‚Á `v?�«ÞE\Ò­ý�þ»999^nnn ðä›yóït:µßK :ËÊÊˆÃ?:þ+‘lÃÇŒg _Ù·’½ PL&û‘%#æççÓêê*=<< V±¹¹Iõõõ©ýÁþ³äv»e¦/ ài\\\HÖ´´4í÷¨Î’’âð�
.`9œm$ãpÖ1c-”ì€b~e?³d@™ÑÎ��ðXþ6kccƒjkkQ	 ÿN	-ƒƒƒt{{K €§qyyIÜ ÿ òÞ-ssstwwG XgÉ8œuÌXÏŸ%{ øýÿkÖod1;jkkCGm ãöçG TÀ¿*åÊM
@ˆï^ûûû‰g`k¿—@µ7ÿ“““øˆ”ÂG²g£kÚÏ¾F  ’öûÍÀB–†@ÓÓÓèþ”Vloo“Ëå"žñ®ý�	þDyyy4::Š7ÿ „XößÝÝM)))Úï%P™2²ueeÏ·€-Î™SSSf4AýÆ¾“€¢Ûÿg¬—%#Óþþ> ™	ÜÒÒBIIIÚœ4žó/7F³³³h@ˆá¿¯¯á*ÝÇ«ªªÈãñ ºØ†½½=É<&¬q/ûU @Qìöw–ŒX]]�[`›wZGGGÔÚÚJ			Ú¢4SFôÉWúûû{ <	ù/CÃ?¨Ì˜˜yk½¶¶†ðì¶?Jæ1¾Î%{½�,€Å8Ø7lÀÈ"Ž��¥ÎÎNlÒÀVNOO©««‡X}”wy555˜€Á9ÿ™™™Úï'P�ñññÔÜÜL‡‡‡ØÇ�û Hæáìct­Ø7’Å °˜ö½ãµÐýØ²{õÈÈñ�0&hphljj¢��ô" ´ð/Ó2’““µßO eÒDGG��� 6½`’ÌÃÙÇŒ5ÿ^² SÆ~2ãý¿×ë% ìH0”Íº   ~Üð/}ð!€§#ÝÕ'&&0êªRUoo¯ŒZÀÎpæ1«À'Éb XÈÏìKö‹‘Å!£×� `S¤Üúú:ÕÕÕQ\\œö­Dù “••%·–'''¸ù ®¯¯%üóoIû=*éÛ"M[çççÑK
„œy$ûp2ºþ¿°/%“`vØàûéÌ_lñþØžÇÇGòù|R^˜žžN¼qkð
cåCNEE-//K•  ´ðïv»)55Uû=Z©\ É´ž††ÚÚÚBÓVV} 8û˜1%%À£ °’_XûÝÀÂ•²j>€ãæ„~¿_n»rss‰o´?„…£‰‰‰ÔÞÞN<Ž™«>33ƒF©PIøw:�Ä!
Õ[ ìàõ*Ù‡3�ÑßÂwÖ#™ ‹Èg},±²²’Ž��ñî„[_ yÐØØH&µ?Œ…‹QQQTXXHãããt~~.U €�JX¥7Jvv¶öû
´Öèèh*//§ÅÅEù @6”ìÃÈŒß„O2 °wö¡9îq¯ã�f;gÂPÔ¶8Þß†’òÇB‘×Œl^“—EJ’Y)¶)D„¡†¤„=^fh“ò²$oéá‘—„c‹°3)Ž¦'ßsu•?N‡ãl÷}ïÙîûúÔõ·{·ûþ=¿ëþ}¿×·	heA5�9ÑôéÓ­¾¾Þ„h�-LÆÈ+U4sa‚?ÔäääXUU3„�ãÃ‡†�hõ'Å$³eéÒ¥vçÎ•ü‹–½<�ïF”Eo&„ÇÄAEûÿÙ»UXXhB´ôj€Ë—/ÛÌ™3}°ØgûgddØ¡C‡¬ººZ¥¢B8Lû/))±nÝºù¶´'ÌÊxifÿ'ñññá-//7ý©jTøz x!7r ŠèÍ„ð˜vÐi(êä¡íÙ³§�<yÒ„hé|ùòÅž={Æl€Áƒª´�l§þIII¶hÑ"Ãlý	áBþÉ‘#G,--Í¯ë«æÎ�ËÖ´~m§þì“ÎÏÏ·p8lŸ?6!|=¼�Ó÷$
�¦7ÂC~�R¡0dN4räH¦ªá>}úd·nÝ²¼¼<ë×¯Ÿaóø\,N‹lÊ”)
…§þ:-Â…žÿÝ»w[jjªo×lÄù�ãåË—véÒ%[¼x±¡uHëxŒ>à¦¤¤Ø’%KìêÕ«ï'ü=¼�ïLJ¥GÂ#â¡©Ð�9Ñ¤I“Ô‹+ü7+Kômd 6�MhüGŒaûöí3$C+á_Í×®]ýº~0Ç¡rÜ“|éª©©±S§NÙŒ3,11QëxÓœøó^ã.ïýë×¯õWø¬7ôBÎßz²©ôhBxÄ¯PTëäamß¾½­]»Ö„ðsÊë›7oììÙ³–��mÉÉÉ�ßÜy¹i4h�íÜ¹Óîß¿ÏJ!„;£þöïßïgóÏqr‡æºñ½yÝÏŸ?ç¸Ã1cÆXÛ¶m¿Þz¹Ž£ÏŸÓ%ÐRÇÖ:!|½<‘Ó÷§* GÂ#:C!è/'+’\ùƒ+„ÏaRq$±ØÄ‰§�ßè¹$f- s�³ /^¼hïÞ½3!„kiÿ<G;“o×�^½zÙ®]»¬¶¶ö§U7nÜ°íÛ·stW\\\à×_7ËýG�e›7o¶ë×¯3hRˆ€@/Oäð=¢'+¥GÂ#Ò¡ôÕÉÃ:|øpŽq" ð$éÁƒ<Iš={¶uéÒ%ð¿ÆªM›6ì›Û¸q£¡Õ‚›w!„«iÿ,û‡AösÏ?§ƒàomHÎ÷.¨6â/$x~=n¬PMÁªŠmÛ¶ÙÍ›7U¹%ÉíÛ·mØ°aNß§¯P„M� 3¡W�9Ñ¸qãìýû÷&DÐˆF£öôéS;vìC¦°ÁüF°­C¬¢Ø±c‡!ÙŸ§rBWaÒ:Êþ}ø—žžÎ©-˜Òè{ôðáC~@˜3gŽuêÔ)ðëóÿïUNNŸ1˜dè…ÆŽëÆ»õ
ÊT ð* 0úÓÁÊÒ9Íã�ÿðèÑ#¦N¯X±‚'Ú8Ùüæð;âH®¬¬,Û²e‹]»v�¥ÉBoÌÿ‰'lÈ�!¾.ûßºu«+-CõõõvïÞ=Û»w/GŽ8PãÐß?tèP[¸p¡ÛÝ»wÕã/€âÚá¼­ˆÞ,WA€Â~ƒŠ¡�NÒîÝ»³|NAx’�QGì/�?¾õïßßÐøS¢ÌÌL[½zµ•––ª&ôÑPoÍ?ûQ¨éë´ÿ’’/*úZYYi6mÚ4ëÑ£Gà�?ªHx/6lØ`.\`ª¿âÐÁ9}ß>BÅôjB¸L
tŠ:x@ÙëRQQaBˆÁÑSçÎ�³¢¢"––0€#î‚°YDÒ8S W®\É¬ô…2…\á%<ÉfúzïÞ½}»¾¤¥¥qD¨Ç!s<Ù~üø±=zÔòòòh€ñoÉôs´Y~~¾…B!C¥›F²
ñcè‰\ÈˆBWèÕ„p™ß¡.ôÿóÇQñßcqêÍÓïU«V1p*##Ã’’’ü²Qd©,zqÙÿ†¶ –†VUU©Ä_ˆ&(=sæK´}ÜFÄ²ÿººº&£‡íàÁƒ¶lÙ2›<y2Û|ÊÚ§O?~¼-_¾œo”ÈçBˆŸBOoäÆûø‚^MiM€ê s"œj*ôEˆöˆUWWsÔ“i–†Ç>Ý:´˜�bëÖ­Y‚;zôhËÎÎ¶uëÖ1³ûµY"6'ÿìùÇd_ŸHïÙ³‡æ?Æ÷šóíÏŸ?o›6m²pÓ�1‹ü°Û’ÂXQ™ÆÿyóæqKYY™á¤Ÿco…‚žÞÈ�÷³š@Ï&„K´ƒÖ@�þp¬_¿Þ„Î~,ž<yÂžJôŽ±B`Ö¬Y,ŸÇ\|ŽDèRL7‰‰‰‰†1[œïŒrP†??Kûß¾}kBˆØÒãÇ�³çßÏ'ÿ¨,jŽUElEˆD"V^^Îê„ÜÜ\C¥?�öíÛ×:vìóû—œœl¸^‚Xy�¸V¶©¡²A“X„pz#x$7r ÖÐ³‰¿Ù»›WÜÓ8Žã%nYLÍ¤ìFMV³�<„$�ldÁæH6ÔÉ(�+BŠrödMIÙ”QópÊsÉCMÃi:ÃÌw¾}j–³¹¯›Ü¿ó~Õ·Ä}nåü\~Ÿßu]ß	’ã5çõ5°û®öÅHèv5Wò`­™˜™™ëéé1( ð]SS£íÅÅÅVXX¨³«322B::+àçççkvÍ„‚~CCƒn`}…‚þ˜ÍÏÏÛÆÆ†ùÌ�nv¼Ú§®àánÿjÂçaUÿ’åÿäääÄ|””NNN*p·´´Xcc£UWW›oÓÐƒUï—¢U±X,ÞŸ�þmVV–ù{i+–_
ú¾”_ß³««ËÆÆÆtÏ¶µµegggtî^†~ÏÂ�…VF›Sfä¯]¯B.ÎÊÊJÛÝÝ5 /þP@³^§§§vxxh¾Z@`fggÕ`Ð»ë+¨ûR|Íì477[SS“ö¨úö•?<Ðç¼‰•^ÓÚÚjmmmÖÝÝmCCCº¹öýž
~.¿ÎÅö™}>o—–i/..êèÑ¨†ÿ¢¢"m—òñ(éÇqßº ­ûûû¶ººjZùå§¨ajGG‡öþß8îësþ5½Æ_«í½½½z�ééi=¬õ÷ÖCäããc»¿¿×÷ð:vvv4‘6ö)£í*³	ò³×•—…”ÿÒQ9 ÞÌ¦ŽÿòfUZÎé7~ú½¾¾6?'[7Ÿ>{¯mÏÏÏ ©�úÓƒ@ßw®ÓE":ó¯UP>–}K}bÔGåááA+îîîþÇõ±N_ó×0Žo�~W=#%b¼Rf Íë]`@Ýltvvr–7  ¯ßí_çÔ{Ÿ�¨Îükß¼÷ÑÃK H¢‡xÊHáf•ÕÞ)»�¾óúÕë�€RûŽ'&&  ¼êþrõã(++³”””H†ÿ¼¼<�=uue �d”‘<+Ž…ÊjÝÊn@ ï½>zýpAêœØ¥¥%  ¯·çeeÅÊËË£þuòÉøø¸]^^ $!e$ÏJ�ã¡²ÚGe7 P¡×'¯¿C.Êªª*;880  ð:áyyÙJJJ,555Šá_]ì}æL{þ I)#yV
•Õ>)»�Š½Ž/Hu¿¸¸0  ð¢Ôìmë·-+--ÕÑ�Qÿ999Ößß¯cP ‰)#yVJÄØx¤ìHõªóº	½ ÛÛÛ9C €WØóïçÉk6)---’á¿  @ÿÎÏÏ "0n++…��ÊluÊp@œ2½>xýr1fffÚðð° €—½‰\[[ÓÌ,‹ìžÿÑÑQq ¡¬ä™)pŒTfû ÄéG¯i¯Ç€QgÏÍÍ  x¹eÿÛÛÛêöÕeÿÙÙÙ„ Q¤¬ä™)pœTf›V†âô“×ª××�‹±¾¾ÞÖ××  ¼ÌÌÿÞÞžÕÖÖjÙTÏùà¨? Q¤¬ä™)p¬Tf[U†âô‹×çÐ ÚÚÚìèèÈ  @b===Ùææ¦ÕÔÔD6üçææÚÈÈˆÝÜÜ D�²’g¦DœðYˆS�×/©¾¾>{||4  �ÐeÿjøWQQ¡ðÕnÿƒƒƒv{{k QÊJž™1n~Q†âózïõWÀ¨&DSSS  ;ó¿¿¿o–žžÙ™ÿÞÞ^Žð-Pf
oàªìö^Yî_öîÝ%Ž(Ãx!/Yu­)"ViRÄNH‘ÆBD‘Å+S(Xx+,,m–BJ›--D,,dÁº*¢…¶‚VÆ|ùxë ³{¦š}~ðýÃÑgçœ9@…²>+>/!a{{»mmm  H.þwvvt^TñŸÒ3ÿËËËÄ?€Z¡fòv
\?Õn+j9 BŸ|~ûü	y}[¢Î& €p¯¯¯¶··§¿¯zS”Î¯ýk+ìýý½@�P3ùÚžÄw ~«å€
uølûüyûûûíììÌ  @¸R©d}}}V__ŸÊøÏd2655e 5DÍäí¸ŽªÝ¶Õr@…¾ù”},d¢(²‡‡  Aoþuæ`` Õgþ£("þÔ"5“¯�I¬§eµP¡>�¡ ŸßÓýÄ   j:óßÛÛ«7ÿiýÚÿÒÒ’]]] Ô 5“·Skê£Z¨@�ÏPè uuu¶¶¶f   jºê¯»»;µoþ³Ù¬ÍÎÎÚÍÍ�@S;yC%qÀ�šˆé£Ï|è ¹\Î677  TçððÐòù¼566¦öÍÿÄÄ„�œœ Ô:o'5T7Ì«é€˜r>ë¡7 tvvÚîî® €Ê‹EÅCCC*ã¿­­Íæææ¬\. ÀÔNÞP�ë«n]MÄôÅ§àóòðõôôð‹>  U888Ð×þÓÿ­­­Úö}}m  Q;yC%q`AMÄôÕ§zàØØ˜ÝÝÝ  ˆïôôÔFFF´í?¥ñ¯mÿççç ñvRC%p`QMÄôÝçÖÇBfaaÁžŸŸ  Ästtd£££©�ÿ––›™™Ñ}×  '¢vò†Jb½½UÓ1ýôy
}ðVWW  ÄS*•tæ¿©©)µoþ§§§íòòÒ  ÿ¥†J`Í}RÓ1|ðÉ^¨^666  ÄÛö?<<œÚøÏd2æÛþùà ¼Mþ·@-—WÛïÈú,†þ ÐÑÑa…BÁ  ÀûÛþ'''ÉiŒÿææf·ããc ¼Iå-•Ä ‹j;àŸ}~ù¼„<t]]]¶¿¿o  àí¯ý*’Ózæ?Š">ø ÿØ»w–F£ Œã¤‰	ØHÄjKYÖNØj±XYlD#ˆ 6¦QÄ%ˆZŠ•Íb§ŸÀ€@´Ò*¨�
^ð†(vb%J’ÙaŠ…½¼F÷›óþ0ß`òäœ÷ÌëX†Ò,å8-Ëý°lTñI« Uriº®®.V  ð‚““{í?Ðkÿö�¡þ¹ÁÉ? ¼q f)×\Ò*X¶ªø¬µ¡Uv]xuu%  à/¶ÿ^OÆƒ=ù¯­­µ···¥R© àu4CùXXÖÚ°lTñUë\«âÒtãããòðð   ÀÃ¶ohh(Ôðo7r¹«þ àí,Ci–r�Å­sËv@Y­G-q©™™)—Ë  ~…»ÚÙßßo+ñ=ù·mGGG x3ËPš¥|ÌäGËvÀZ®Í–L&e~~^  Àï×:ƒ}í?�NKGG‡ìîî
 à¿Y–ÒLåc6XÆ"¤µò®�ÖØØ(KKK  Ä\^^Êèè¨�ü‡zí¿§§G¶¶¶¸ n,Ki¦ò1Ÿó–ñ€­Y×Fkmm•µµ5  îôÚ¿œžžÚÉ]]]°¯ý÷õõ‰®ú#ü€;ËRš©|ÌèYËx@„Z®�ÖÛÛk{� ˆ»ëëköÚMM�d³Y988àµ ðÃ²”f*szÁ2á£Ö²k£éËÆv
  @œÝÜÜH>Ÿúä¿³³Svvv8ù ,Ki¦ò1«—-ãšµÖ]mjjÊN<  ˆ«³³36ü§R)éîî–ýý}Â? ø¿=f™ÊÃ¼^·ŒDø¢uèÚhsssr/  ÄÑÅÅ…ŒŒŒØžÿ@Ã¿]û×ðÏµ ðÏ²”f*3ûÐ2á›Ö�k£-..Êóó³  Çkÿ“““’Éd‚ÿmmmöÚ©T €w–¥4Sù˜Ûw–ñ€Y­'—&K$R( €¸9>>–‰‰	©¯¯úäss“ð ïË2•f+×Ùýdø‡„VÎ±ÁìGÏÊÊŠ  ·oþõµÿ`¿ùO&“ÒÞÞ.{{{|ó ïÏ2•§?”s–õ€?¤´¾»6XSS“‹E  .nooezzZ‚]õ×ÒÒ"«««|â ?Ù»w—Æ‚( ã,*¤Ý­bÔHŠ…m4�°hEI%ne¥u›Eì,‰(6Š �l·`ë…"¤°U+5‚o|4
8{8¤Xn;s3~?8ÿÁ0ácfr?†5•¶Uûøok= à›NÞu�uuuÉáá¡  ðYÞü���YüûzòßÛÛ+»»»òþþ. €aM¥mÆ^ž·Ö:®¬¿¿ßÞ@ ð	ÞüÛÉ<÷2þëêê,þõÍ?×þ ¿1ÚVaìçÖz@@Jç¯ëËårR,  Ÿ���Éðð°·'ÿ555ÒÓÓ#z•Oý@hSY[…°§ÿµÖ~è¬».°‘‘¹¹¹  |u}}-ù|^¼ŒÿÚÚZéèè�ÕÕU®ý@eXSi[…±¯¯[ëi�‚ë›˜˜�§§' ÀG299iñïéÉ¿ýÛÿææ&ñ •cM¥mÆÞ^°Ö~ê¹.°ÙÙYy}}  <üÃ?{óŸH$|ŒûÞt6›•B¡Àµ ¨,k*m«0ö÷#k=  £sêºÀ–––ø£  €wîîîdzzÚNþ=�»ö¯'ÿüŽ@åÙ^¬mÆj­du]Øòò²  à“««+™™™‘ÆÆFoã¿»»[666¤T*	  ´­ÂØç­õ€€_:%—Å‹ÅdmmM  ðÅåå¥Œ��KSS“×ñ¿··ÇÉ? D‹µ•6–ë^_²ÖþóEgÀqaÙµÈ�� À£kÿž¾ù·±kÿÛÛÛÄ? D�¶UXOÏ¬ù€²˜Î�ëÂjii‘ýý}  ÚÝÞÞÊÜÜœ477{ÿíííö©¿··7 DŽµ•6V{þ�5PöUgÔuauvvÊÁÁ�  PÍŠÅ¢}z)•Jy{í?“ÉÈÖÖñ Ñem¥�ÆÞ?jÍ”Åu¦\V__Ÿ  ÕêááÁ®ý×××{{òßÚÚ*+++Ä? D›µ•6V{ÿ”5P–Ô™w]Xƒƒƒrrr"  T£ççgY\\”d2émü§ÓiÑ•¶ïK "ÍÚJ+ŒýÞš(û®óÇuaår99??  ªÍýý½÷ñßÖÖfŸú{yy À?öî�¥Í(àxéÐ¡C>€ˆ$/¹@ŠK�êÐE:uréÒN]—82‰sÁ(j�(Ñçg?@oI„’§ï78|ßãÿçŽÿ¼ç{ÖVÚX>Ö€š5)èh¸N¬µµ5{+ €$éõz²¹¹iþ…zæaaAô¶¶ý@rX[icùXÖ|@ä‹Ž×‰U.—í
  IÑï÷egg'è§þ²Ù¬œžž²í ¸;MËÇZpaÍD¾êè¸N¬J¥"OOO @Râ¿V«ýå?—ËI½^—áp( €D±¶ÒÆò±&t¬ù€È7]×‰µµµ%/// @ÜÝßßÛ—ÿt:jüÛÛÑzæŸø€d²¶ÒÆò±.t­ù€Èw·®«Z­r¶ wÄ{{{A?õ7==-ív[F£‘  ÉÚJËÇºpkÍD~è¸sœT¶�r<  1ŽÛ¯_þƒ>óßh4Ø• Éfm¥�åcm¸³æ"?uô\'Öññ±  ç³”‡‡‡È¡Æÿüü¼´Z-¶ý@ ´±|¬=k> ²¢càzÖðììL  ˆë—ÿƒƒ™œœ6þ3™ŒhüsÛ? „ÃK[Ëu�Xó‘_:^]&U*•²‹†  ˆá%J¶%~ff&Ôø·—ŽŽŽd0  ÖXÚZ®ëÄ«5ùã8¡djjJ:�Ž  'ÿ³³³ÁÆÿÜÜñ a²ÆÒÖò±^üþ DþúøçãòòR  ˆ	âÝÝ];óòmÿ'''Ä? „ÉK[Ëy½°æÔG«®ªT*ÉÕÕ•  v¾ÙlJ>Ÿ6þ'&&¤Z­Ú. @�¬±´µ|¬«Ö~x÷>éXw½ pqqQºÝ®  ‡ø???—b±lüçr9ÙÞÞ–ÇÇG ËK[ËÇE€ëÖ~x÷>ëØpý`iiI®¯¯ €·ôüül[â5þƒ~ê¯^¯Ûß
 š5–¶–� 6¬ýðî¥tüsý`yyYnnn €7üòoOý
…Pãßî3Øßßç� øÏÞÝ´Â†/ÉZ§MŒ:fœs:oRÊËG°³³³³QR&…bDV²˜’IL�V¤| ¥,HÞ3k¯u�«+«“Îæ¾gN=÷ÿW×7P�ÿõÌ}?a°ÆÒÖò± HYû!xtÆ\ ííírxx(  üOOO²±±!õõõ‘�ÿx<.“““’Ïç k,m-€1k?ï£NÚuÐÑÑ!GGG @±=>>J6›•†††HŸùŸ™™‘ûû{ ÃK[ËÇ mí‡àÅtf]þ˜JJJ¤³³SŽ�� €b¿ù×3ÿ‘Žÿºº:Éd2\ø ÒÆ²ÖÒær}žÌZû!xq�9×@WW—œœœ  Åòòò"¹\N#ÿ555¢oþ‰ “5–¶–�Àœµ‚÷I'ãº èîî–ÓÓS  žŸŸessÓ>�ÕøO&“2==Íwþ \ÖXÚZ> k?/¡³àº èéé‘³³3  ?û·ïü755E6þ‰„ÌÏÏóæ Âf�¥­åc°`í‡à%u] ½½½r~~.  Òëë«lmmE:þ«ªªdjjŠø XcikùX ,Zû!xŸu–\ }}}rqq!  òÌÿÎÎŽ477GúÌÿÄÄ·ý Œ6–µ–‡À’µ‚÷EgÙuÐßßÏ  P0ö³ÿÖÖÖÈÆmm­]øwww'  (k,m-€ek?ï«ÎŠë```@.// €B¼ùßÞÞ¶ÿÞ¾ƒ¹©¬¬”ññq¹½½  ÞXcikùX ¬Xû!xßtV] ƒƒƒruu%  ø>ó¿»»k?û�jüÇb1æ9
 ø›=´µ|, V­ý¼ï:kŽ ûÇåúúZ  ðù©¿½½=iii‰lüWWWK:�æ à=ÖXÚZ> kÖ~Þ�u×@*•’›› À×™ÿ\.'mmmöœ‰èmÿvæ?ŸÏ  ï°ÆÒÖòñ,\·öCð~êd] ###œ[ x;ó¿¿¿oŸú+++‹dü———ËÐÐËs À¿XcikùX d­ý¼_:¿] £££ÜZ ðræÿààÀnû/--�düWTTˆ^èÄÏþà{wÓJyÆq|!éä!Äbjš‡f¦f¬­Å†²!kEJ)9B)/`V6’"I^À¡tBÖ’§lxD×\çZž)Ìÿ¾gsÿ¿ŸºÞÁ©ÿùýî'¼Å2–f-À–e?Ä^ƒÎ¶Ë�©  @fgg)   Ne7½+MMMÁ†ÿºº:™››“l6+  ¼£ °¬¥™Ëõ´mÙ±× ³ãX ØÓE÷÷÷ @///²¿¿/���Ánû¯¬¬”ééi¾— €÷²o†f-À r~él9   8…ÿƒƒinn–ÂÂÂ ÃEE…LMMqæ å€�`Ë²bï§Î¦ë 333\ ˆ´í?“ÉH2™vÛmmmnåŸçr ‘.Ô¬åã€Mî €²› 7 V5  ‘·ýë…!¯üÛóM @”g 5kù( 6x 9?tÖ]€ÉÉIV6  ÿþ¥¥¥EŠŠŠ‚ÿååå’J¥äööV  ˆÀ2–f-Àºe?ÄÞw�5×`bbBîîî €·<==YøommµÿBÝö¯Oýþ .,ciÖòQ ¬YöCì}ÓYu- ÆÆÆø“ x×Ê:�¶ðêÊUUUîÏGã  ®,ciÖòQ ¬ZöCì}ÕYq- FGGåææF  xÍÑÑ‘´µµIIII�á¿¬¬LäââB  pdK³–�`Å²bï‹Î²k022B  xÕññ±´··»í¿¦¦ÆÂÿùù¹  à« Ð¬å£ X¶ì‡Øû¬³äZ K6›  ò=??Û™ÿŽŽŽ`ÃuuµŒ��Ëåå¥  à‰e,ÍZ>
€%Ë~ˆ½O:‹®ÀÐÐ�\__  ùööö,ü{Û¿þ9c' À7ËXšµ| ‹–ý{u\€ÁÁA¹ºº  ò·ýwuuIiii�á?‘HHoo¯œœœ  žYÆÒ¬å£ X°ì‡Øû 3ïZ ôõõqæ ð×…ÝÝÝ¶òê™ÿþþ~Â? à±Œ¥YËG0oÙ±W¯óÛµ èéé‘ÓÓS  '“ÉHgg§…ÿPŸúK¥Rrvv& €?ìÝ¿K›AÀñJA£Q#ÒÝÙÍ­.¤!â�ªXÅ4‚‚““S6qèàêêâèäÈ¤‚FÑ B†¸;¸dÑ<}Þgìz¯I¸û~àþ€ÀÁñ½Ë{‡Ob�¥­ÇÀ_k?ï›ŽC—ÉÔÕÕ%‹‹‹òøø(  T*[|}êohh(ºíŸø |:m,[Sµ¹\×¯Ck?/­£èº0;;+÷÷÷ ÛÝÝ�,--Ioo¯—ñŸN§ekk‹½ ZÁK[+Ž€¢µ‚—Òqàº099)··· –=õ·¼¼ìíÉÿðð°ìîîÊóó³  ÐÖXÚZql Xû!xIû® vÙ  Ø
‹ÿ��/ãppP666äééI  hk,m­86 ö­ý¼„Ž=×€ññq»ð	 ž‡‡Y]]•þþ~o¿ù___—jµ*  ´�5–¶V {Ö~ÞW;® cccR.— –ËËKY[[³“_ÿö¯ï/sÑ-  ¬±´µâØ Ø±öTÁq2Éèè¨”J% uòoOi${ÿÉd2ú¬Á~'  m`�¥­å¼¦Yó*’s�P###rqq! € Ø·ð¹\NR©”�ñoŸ3ÌÏÏËÍÍ�  Ð&ÖXÚZÎëš5 "t4]&T&“‘óós xÏžÀËçóv1ž¯þ­¬¬p¹-  Ý¬±´µ\×¶¦5 "¿u4\&Uww·œ��	 À_ÍfS*•ŠÝ†¯'ÿ¾Æ?þ :…5–¶–ëúÖ°æTdNÇ«ã¤’ÓÓS ø«V«ÙÉÿ'ÞŒžž™žž¶7— èÚXq¬q¯Ö|€ŠduÔ]'ÖÉÉ‰  ü�ÿÍÍM{ÏÇøïëë“©©)¹ºº²:  Ð	´±âXçêÖ|€ŠüÒQu�XÇÇÇòþþ.  hÛ7ÿ…BÁ×ø·'¢'‰ @ÇÐ¶²Ær_ë¬õ~~Tä‡Žk×‰utt$�FC  þ¨×ëvòïëS‰DBfffì©¿��  CX[icÅ±Þ][ó*ò]GÉub‹Ey{{ €^^^d{{ÛNþ}ýæ?›ÍFOýÿ ð�½ûwi38ŽšMŠƒÄˆPÒ¡C»‰`Õ¥ŠJÖúè*‚ˆ"
ñ¸ê®c!«Q'íâ :ˆšÁA‡§ÏûL%ëÝðÞñýÀýO¾Üå^¤�µ•6–�™÷×šP‰^]%×�µ¼¼,/// ˆ#þggg£�ÿÖÖV{ðïüüœø ¤‘µ•6–�¹W²æTâ‡®¢ëÆšŸŸ—z½. €8â_¯ýÇzòoþ]^^ÿ €´²¶ÒÆò1ûŠÖ|€J|Óµïº±¦§§åþþ^  ázxx°ííí1Æ¿}KyllLÎÎÎx¸ �fÖVÚX>æß¾5 _tíºn¬ÉÉI¹½½ @�¯ý[ü/,,ØÉ¬ŸúO^ûçä �vÖVÚX>fà®5 Y]Û®kbbB®¯¯ ž››‹ÿŽŽŽh¯ýçóùä?ÿœü B`m¥�åcn[ó*ñYWÁuc�ŽŽÊÅÅ…  ÂR­VeqqQººº¢ŒÿL&#CCCrzz* @ ¬­´±|ÌÂ‚5 ŸtÍ¹n¬¾¾>©T* G­V“¥¥¥¨Oþåää„“ @H¬­´±|ÌÃ9k>@%2º¦\7V.—³Ó @0�Ùç…4þc}ðÏ®ýël"þ ¡±ù¥�åc&NYóÿùíº±ÚÚÚäàà@  éwww'+++ÒÙÙeü·´´Èðð°”Ëeâ "k+m,ç™h­4Èëzsý±U, �n���R(¤§§'Êøonn–þþ~9<<ä?ÿ €PY[ic¹ÎÅ7k= Á/]5×]{{{ H÷wþWWWíä?Òkÿöà_©TâS € i[ù˜�5k= ÁO]W®lggGÞßß �Îø_[[“îîîhOþGFF8ù „ÎšJÛÊÇ|¼²Öôêª¸n°ÍÍMy}} @ºÔëuY__�öÚSS“�üñŸ @è¬©´­|ÌÈŠµÐà»®cÇÍeŸ’z~~ @z<==ÉÆÆ†d³ÙhOþ’“®ý b`M¥måcN[ë¾êúãºÁfffìŠ)  ªÕªlmmYüÇzò¯¯ýÿ ð�½{w‰+ˆ0Þ$`“t›à®¢ ±°p±
Ø„ Ø%¥Xjm'heçúÀG¡(>p]ÙUY++ÁF°Õ^#¨ëÛÂ=9œrá&ÅÌº0÷ûÁù„�ñcgæ"¸k{ÚV>öÊ¼µPæ«Î¢ëëéé‘óós TßÕÕ•ŒŽŽ–}C8¨±×þõ3Iû „ÄšJÛÊÇ^¹h­”ù¢3æºÀºººäôôT  Õ�ÿt:ô�ÿŽŽ)
Ä?  4ÖTÚV>öÌ1k= Ì'�A×–J¥äèèH  Õ=ö?>>ôwþ;;;‰ @¨¬©´­|ì›ƒÖz@™:}®¬¾¾^ P½ÿ&''¥¥¥%Øcÿmmm²½½-¯¯¯ @€¬©´­|ì›}Öz€*÷[çÍe�ÕÔÔÈîî®  ÞßõõµLLLH"‘6þ[[[eccC^^^ €@YSi[¹î›oÖx@„Ÿ:Eq™µµ5)•J x?777233c¿„zç¿½½]²Ù,ñ ™µ”6•�ý³h�Dø®sæºÐ¦§§åþþ^  ïãââBfggí—ÿ@ïüÛkÿ{{{òôô$  ÌZJ›ÊÇzf�DHé».´‘‘¹¼¼ @åÝÞÞÊÜÜ\Ðwþ›››%ŸÏÿ €8°–Ò¦ò±‡[ã¾éì».´��ûn%  ²ŠÅ¢ÌÏÏ‡úÚ¿Mcc£d2y||  bÀZJ›ÊÇ>ºo�DHêd\Zoo¯œœœ  ²þ-,,Ø�ÿ@�ýÛƒz’ø Ä‰µ”6•�ý4c�D¨Ó™r]hÝÝÝrxx( €Ê¸»»“¥¥%ijj
õ—ûÛ¶¶¶ìŠ  1b-¥Måc?�²Æ"|Öv\döJs¡P @eZ^^¶cÿú2~°Çþ777¹ó ˆ#k)m*{ê°5á£N¿ëB«­­••• ø�ÿÕÕÕ�?õg¿üçr9Žý âÊZJ›ÊÇÞÚo�üÃ/�’ë?pétZ  ~�ý¯¯¯K2™öØCCƒìììÈÃÃƒ  WÚR>Nù•¬í€ÿø¡óGG\fhhHžŸŸ àNƒØÃÓ£ñÁûO$’Íf‰ øËÞý³´…G
éØ%ŠÄ`¤Hˆ¢–RÁÝÁQÄÅO HFÅ?ˆˆ‚ n*(*‚³œ$�ÉA
F\ŠIsûöåÝiï�çN'ÏÞ8pxrî½­ÌJ[*Ž½õ§µâ»Î½ëS óóóòüü,  çø·“=÷õäß^iÐøç± @ËÓ†²–ŠáôÿÞÚ‘Õ¹Ò	\Ýôô´<>>
 àãôøö>¼žü{}Ï¿þFû¾  ­NÊZÊqt®¬í€i�}�šË¢›˜˜�B¡  €�Ñ/àÛ©x6›õö±ÿÎÎNÙÛÛãª?  ÄXCiK¹î±5�}k; DRgYç·Ë¢Ëårr}}- €Å¿�Š÷õõy{òßÑÑ!;;;òöö&  ÀXCiK9î³ÖrËÖv@ˆÏ:s:U—E—L&í�U @Sì=ø££#¯ã?“Épò @ÚPÖRŽ{mUgÎÚÑ¦3¥SqYtííí²¶¶& €æîù?99‘��_ãß¾öppÀÉ?  hCYK9î·�)k; ‚:eq™¥¥%©Õj ÷þþn�ý�ŒŒøÿöÎÿÆÆ†”Ëe  u¬�´¡âØsËÖt@D9�×…·°° /// ¿ó÷øøØë“ÿîînY__—××W  ªžµ“6Tûîƒ5QFçFç�ëU€ÅbQ  ÿ�{ìppÐÛøO§Ó¢ñÏŸÂ  ü›µ“û€Öp7Öt@D)�C�Àeñ���ËÝÝ�  «V«ÿÃÃÃÞÆ*•’­­-â €ÚNÖPŽ{o shMDôE'ïz`¿\^^
  qüŸžžÖ]õãÛôôôÈææ&_û  œµ“6TW æ­é€ˆ>éÌº^˜H$dwwW  õ*•Šœ��ÉÐÐ�¯ño×nooóÎ?  ÑX;iCÅqà¬5Q›Î¤Î/q™|>/A ÀØÉÿùù¹Œ��ùüÁ?Þù  	ÚLÖNîû°5Ü$W ¢Y£:O®pqq‘G? >þ½¾ê¯««KVWW‰  ¢³fÒvŠc/~²–šôUçÖuÎÌÌH©T huzÏ¿\\\Èèè7oã¿··WVVVˆ øËÞÝ³´E¯¯�¢ƒqÐÐî]Dtß6—€ú	|YEDM7gq''ÅAÄÁ Qptq4*Tj)†–ª9=œo�œÇ¡7ÿœoðà}þ>7÷Õ±fÒvŠb=.XËUJêìyo“‹‹€zÿòxx(###ÁÆWW—¬¯¯ËÝÝ�  €ªX3i;EqÀžµP¥O:Î› ìtëƒƒ€z�ÿL&#MMMAÆ"‘�µµ5¹¿¿  P5k&ÿÍ@ÖnÖr@•>êÌ{ÿÐÙÙ)[[[ õÿGGGÒßßôoþWVVøò €ƒ6“µSÿ ˜·–ªÔ 3¡óÇûr¸ººjW^@=)—ËvÕ_È§ý÷ööÚ�···  j£­dÍä_›­Ý&¸ µÊè<zÄÙÙY¶…¨+///r||,}}}ÒÒÒdüÇãqÑmÿ|ù ÀÇZI›)ŠõùÑ¨ÑW�¢÷g ÙlV.// ê%þONN$�NÛoþC�ÿååe¾ü àg­¤ÍÅöÿ¢5P£Ï:;:¿¢½ïïï ÔÃ¾ÓÓSÛöò�KKKÄ?  Ñ°VÒfr®ÑÖl;Öp@�:9�_ž‡1™LÊææ¦ @È^__¥P(ØU¡oû¿¹¹  	k%m&ç:mÍ–³†7Léüð<Œ���²°° •JE  Ôø?;;“��imm0þíV; èáá�¿ç  DD×Tk%m&çZmÍ6Å ðhÐIé”¼/Ž“““òôô$ ê—ÿÁÁAinnvÛ.—ã@W  "¦�d­ä_¯­Ù¾} œ¾èu*žrttT®¯¯ ;ðÏî
zÛ>Ÿç´  ¢g�¤­ä]¯+:Ek7À©[gWç¯ç¡L¥Rv% „âííMÎÏÏexxXb±X�ñßÑÑaþ•J%¶ý =k$m%çšm­¶kí8Åuò:eÏCÙÓÓ#ÛÛÛ ¡lû/‹ÿúå?Øø_\\´ø  ïÂI[É»n—uòÖn€SLgZç§ç¡Ôd{‘€¶ý_]]ÉøøxÐþéßl®ú à}Ùzëÿ˜`­6mí85è¤u¾{_(gffäùùY à?f_þ³Ù¬´µµÿííí277'zÕÛþà{g¢ã†ñ0§Æ®AMöì3¶ÙF²Ù×±ïK"¡±…Aø�¬ÉîMˆÈ>%F–aÙ¢cƒ!{�ëÜ]åÔé8§Ãó~³¼ïõ«»4ó™ù|Þç}Ÿë^®Gˆ0bÚˆÉýùM­öµ›PÕ"ÓõÂŒï�Û·!„þuéÒE‹õ­ø?~<îÝ»!„B„j#ÓH^<Ã3©Ù„ðˆ
)_].ÌØØX9rBQ gþ¿‰ß¶ý—/_&L�øB!rj#ÓHŽÏpj´j6!<"Ê"ÙâƒËÅ�õë×C!
gÏžE×®]}[ù�ŠŠÂŒ3Øö/„Bˆ\�ÚÈ4’ãsœ-™šM�(j‘h‘ãj8yòd�%„Ès8ßýñãGÎŸ½yóÙÙÙxñâž={†—/_âÕ«Wxûö-Þ¿Ï
xPIKKCÏž=yÔŸ_Ûþqû¶F´„(ˆÇ‘~øðïÞ½ƒÝÇyï~þüù_÷ñ×¯_ó{öÞÇ…ùjýR¹ R£%R³	á¡`‹®Í^½zñÁ$„¯°ÏÉÉÁÃ‡qåÊ?~{öìÁ†°téRÌž=cÆŒÁÀ�Ñ·o_˜¡×f�=Ð­[7F÷îÝùµÞ½{ó5ýû÷ÇÐ¡Cù Z°`V­Z…­[·"%%©©©ÈÈÈ`òÀòý&þù9DFFúRü—(Q‚â?33Bˆ|ugöþýû¸téŽ=Š�;w"
aÑ¢E˜>}:FŽ‰üÛ}œ¶¯ñ{ö¾vÄˆ°nþŒµk×bÇŽ°ŸMsÓ»wïÂÁ2ÿ"—0MÄ5êþ<§Fk!@á51é¸\ mÚ´ÁÅ‹!„ðn“øôéSnÞ:„uëÖaÚ´i°�E|»víÐ¬Y3Ô©SUªTAéÒ¥Q¬X±Ÿ^ÃEŠAÉ’%Q±bET¯^�sk­ZµBçÎ�‘��ÀÄBRR7•§N�‚U•ÙEP aò¤_¿~¾mû·k�âæÍ›Bä_¾|ÁƒpîÜ9ìÝ»+W®¤§Ý8zÔ¶m[4iÒµjÕB¥J•8²ãàEÂ¿[ªT)þ¬5j qãÆÜŸ™Ç	ç¸qã°lÙ2&ŽÏŸ?�G�ñ=
!<…šÈÖžãóœÚ,�ZM�)oqÐâ³ËEZ¯^=ìÞ½BˆŸÃÚñY¥±ª>çÆfÎœI±ß¡CÄÅÅqC‘—Â’	Û¨21`IV˜/^Œ}ûö±’•••…|Ïù4h�úóiåŸ›ü7n@‘«0)šžžÎ*ë¦¢Ø·*…€í“hÈ™×÷ˆ2eÊð½Ø{b÷€½G¾×Ã‡ãÚµk7B8AMdëÌq½R›¤VÂc~µH²Èq­8Í›7Bˆÿ?öøñcœ<y«W¯f…ÝZ;Y±)[¶lAœ¬¢×¬YVÉ¢°ž?>+]&@9›šŸ¸zõ*«`þœùg‚†×Ñ�;w „?Ÿ?†�®ÁVû+V°?>>õë×g5¿ %6lˆŽ;bØ°a)³Î3Ž}úô	Bˆ‚šÈ´‘óÿIÔjBxÌ/	®> …
‚e¹i<&„ø×¶~º±ïß¿VáçšiÚ´i¾Û(:š‚²õ´S§N£7n„µ¿Ò» /¹~ý:;*|*þ¹Ñ°Jžÿ„/4WµJ9½R&NœÈy|™¢ˆöÉý„ãdV½äèÀ¤I“°eËØè“ºBˆÿ„ZÈöwÔFÌÿ'P«	#ÀX‹®ŒÖ­[ÓÔFñwž<yÂöÊ%K–`È�!¬´|{0ø=*W®«*ÑØjÛ¶mô4°t®‹ÿÑ£G³íß¯nÿ£F�RÛ¿aœå·j8gççÌ™CUóJáúBT«V�‰Ž¹sçâÀ�°D#�a…ÿÄ´5‘ûÚ£6‹• •-ÎX|u¹PëÖ­Ë68!`s”<c~Íš5>|84h€Â…s­5*T¨€öíÛcÖ¬Yì‚°nŽB„[ü<ø[uÎwaI¶ßºuBï�¼�;sÖ§è�‰‰qX¯¾Ið³X¸p!Ì³†fµBBLQ¹­5j²3ÔhB„‰²!‹7*ç–—/_!‚Š�ÅÌÊÈ®]»0eÊ´lÙÖJøã÷¢jÕª4 JNNÆ…Â2"`qv\/^Ü�Ÿ!Ý¾-¹DÓ1!„gsýLnÚ´‰�C�5‚�6þžý�“cx‚�™ÁrÔËVu¢€ µ�»—5YˆMˆ0ŽµøÝõa`•(Š !&üYÍ6ó;Î½×®];ð›Ã1Ÿ2óCž[�ššê•51S§N¥1ž?7&5ÌÓ@Ç¯
ááÜnFF¶oßÎÄ¡u,þþüÝ]4�Ý¼y3._¾ÌSm„è~�ZÈ4‘ãº¢&+@N",š[Üq}X{¯ÚÁD`°H¶^Ûl;ÛÌ£££¿t0�bÇ„¹Oó|êììlü,öÂ™øråÊùñ³¢‘¡uOp£-„p?‚5--¡PˆÆ]f¨øû±KbÒ<_x²�ù½( ‡i j!÷õDMÖœMˆ0RÆâœãÅÊV¹Ó§OC?cÇ"±íÚ\ y¾U™¿ñó*"""Ç#tNœ8�¬¬,ü ¬àY[¼_gþùïêÓ§�Ä¿î>-ì 1Ÿž‰øûïŸì�Ï+îyÇ›™c”b”ß²ÀJÉ¯(W6rýxlÈ“XÝHéZ^l¸±±‘Äµ"V,P~Eš®…0	Ã ™2„Ü¡tæôÞÍbš‡ïãùþz¿êü×óùžûyÎ9ïã§€ß�š a5âÚÚšÜÞÞ
!. Hµ�?¾£_¡Íyc~Òø¢ñÍÈ�MLL”¡¡!!Ä¡kü`
533#^¯W"##]Ñ{ÃùR¬ÖÒªfù}©$���aÛ€�µŠ–Ž��<8-//!äõ�['''¢�[¨VkÕÚõùö-óxqq±Œ��‰:£Ó#€8h ÕB¿h±/Ðf„¼1Á5þ2ÚšªægJ„8´¤kk:v"'$$ˆ^l\¹{ëÐU‰Xq———'ƒƒƒr||ü_«§àÁ †]˜Eu¨øÇ.­¦Ñg…�×=àb%ëÔÔ”TWW‹vn1�æ ëÊÊJüíµEšwDâÔ¤ZÈûÿ?B›òÆ|¯Q¤ñ‡Ñd_ZZ
±DˆSæC777¥­­MÒÓÓya4ñ! ªª
;¨õÿ¯¤>`æmÿÎÿ0JÔ™Z^œ	y×××¢­¹0iÕíÌã&�ÄÄÄHcc£èŠ\Þ‰EÐ@Æ¿h±"h3B@´Æ¦Ñƒ›““#ºÖ‹Ubk´U-‹ÃÃÃ’••…Ùt¢®¿Ä™\IB{¿^â±1@W¢ò¯JG»ýWTTÈúú:s*!¯ôkéîîÆêQÍã®Ï£ÈãØ‘ÞÞÞ.ÛÛÛØ¾@ˆªÿÐ>ª�üñ�lB“ ~Ö×øÛÈÁMNN–��y~~BìÈÝÝªE555-Z¹pý¥ÍjñÜÜ\éïï‡øÇ¾]Wþõ,2ŸòŠªÿìì¬x<Ñî ×çM«uui›4ü¦§§E+§|à$vÿG«ö�2ö}@ƒ�C“@€OþðhhhÀË;!6Ûß
#¹ÞÞ^IMMeµÈÚí¤¨Ž;Õ¹[ÿ]˜ùßÚÚ‚ï!Ä7åàà ›D´åœyÜÚÝ LMMM¢«yo$vî6‚öñÓüÿ'Îÿ“@û ¼×øÝhRWÓ.)BìTõWwu¬XÓQ×_Ì¦¶ýÃí_Å?«b„¼€««+™˜˜�’’ºûÛ(‚ƒƒ%;;[ÆÇÇñb7Tó@ûÿ ÁÞsþŸšD�¯FpZZšÌÏÏóòJlsiÔÕ-¬ú3¬PùGÛ¿îùgþ$ä…Ý[Ÿ?­úÓäÏžcXŸÖÑÑ!jìÊ±'b§ùhÕ>þø¾B‹`Â4F�ú DEEIOO8±ü¥qooOZZZDWûÑä�aºø/++m…eÛ?!/hù_\\”ÚÚZQ“P×ç»?DDDÀøT×îr$€ØeþšGµ�?æÿG¡Å	0?j´jüit>WWvÑÝ•X–‡‡Ñ–˜………¹þâÅ0]üc}�VþùpJˆ�U·››‘ÌÌLÑoÈõyÄ!�N¼ŒŒåº@byTë@ó7Œ†öj…#$Àü ñNã7ƒ‡ó\‡‡‡BˆçýÇÆÆDW±U”a·<DéžŠB|äüü\ººº$>>žÝ[�¤¤$Œ\\\!VEµ4�ñ3íõZŒøEcÕèANII‘™™Î±Kqyy)}}}’žžÎõ~KTºŠŠŠdee­Ì„�ÿçèèHš››E×´Rü;<âââDÇôh,M¬Ú‰­£šÇç}Œ» 4bÌquvvbÎš+$éÓÓSimm•ØØX×_ªÖÿ………²ººÊ<Iˆo³¶ðÈðz½ÝrQ„‡‡ã7ßÙÙ‘§§'!ÄB^RÐ:ªyžsh®Vÿ‰™|§ñAãÂ  Œ\îïï…³Åÿþþ¾Ô××Ó$Ša‰

’üü|ÑÊ?Å?!>²´´$�Gt×¶ësˆÛBs<˜.,,Ð$•XÕ8Ð:Æ;J¡¹>@ƒb"ù~ð€1Ïîî.çZ‰©lllH]]�è­ë/QÓ¾299I£TB|dnnNÊËË%44Ôõ9äöÎç•ö<Œãcš¸9È4(a!ÒDIÉÆÆÆ-6ÃBwgc¡fyYiv6w#Ò±AäG?¢t7"¹Ó%I]J�ŒüHh”fjžyzÊbjº}ù|Ï9Ÿú¾^õþžó9ß÷çó<ï'ªR“e#SzÄ% øÐ‘dG½N(óÿæ½ ÒL¾ê£kA—––J<·Äu€t¼üoooÛjµÌÌÌÈ<!oÌ?¯X /œ±mjjíœ‰ü‚¾‘ÆÆFÑš ÃÒ½MÊ<Žz�0êú£y/€4ó­êƒêO—‚ŽÅb¶›÷ööV R=—µ±±!ÍÍÍ$ý#_Ì¿}¸®¯¯Óö ½$³NýÝpŽ£ÿ¨¦¦ÆÌ×ÃÃƒ ¤õ6æqÔë8Ö³y­æ½ <Èx§úÝ±¨-mýððP RØ–e³ÕjþIúGÞþ544ÈÊÊ
æ  ùŸ˜˜5ÿœãèUYYi5òøø( ©F½�y÷Z6¯õŽùð…Uûa¬p™��%¹RÆææ¦´´´ðb„¼š[]ZZbÕ@ÀKÜ¹¹9›­ÕË³ÈŸ!èë� ä©@JQOcÞF=Nu¼ožÀbª„ê/—ÂÎÍÍ•¾¾>fµ %|Úù$o[Þòb„|1ÿÏÉÕ„¡|ù_\\”úúzÎqHuuu¢— äMA*ÓÿÍÛ¨Çq¬_óX	ó\ å ¼Wýáøläggg�Lvvv¤ý§v^Œ�W/ÿ:ó�ùøª6??/”Iz‘jkkE/è6…” ž&¤KJóXï™ÿßr šU¿¹ÌÅÅÅ¢�l|CÒ8::ÝóÏ~hä…222ÌÄ,//“ö,íß¾´c†­-è5²M[[[VK ÉQÒ³Ê¼�{ÝšÇjfþ|ãUÂµÀóóóehhˆö,HÖM¬µbåååEþù³¦juu•À?€€ìííIkk+\ÈIííí²»»+ I\ÿgžF½M5›0¯à!¿ª°mûÍÍ� „ÉõõµJaaaä?|�mÿÏ;ª1ÿ _ÓŽ��¥»»›—ä¬¬¬,éêê’ƒƒHæeÔÓ„qYù`ÀS~V}q=”ËÊÊdŸ1 õvffFtPä?z�?aTSSSÌ¡äêêJDÃ´"~ Pd/³ýýýö@ ò…¥yõ4aÔêóX žR¡Úp,r{¡•ûû{á¶¤h��üÇòg•®bÀ.qÇÆÆ¤   òç
Wååå�Ç=…01£^&¬®ÓóX žò�*®úÛ¥Ðß¼y#mmmrzz* ŽØŒŸ&¬Gþ#yø÷lþÙóð‚ukkkR]]-úŠü9‚B—¥´k�Ñ‘¡¡Æ¼ŒzÇú4O7�à1¿¨.]ã¢¢"[Õà:ÕÛÛKâ?òB222"OOO ÁÿONN¤££ƒÐ?”TuvvZÀ$@Xë¦ÕË„Q›—æ­ <§IõÙµà³³³E[ghÉ‚×bíÕÃÃÃRRRù”~UUUÉää¤ÜÝÝ	 ãââÂf´srr"† ä*‹IOO�\^^
€ãÈ’yõ2aÔægóV žó½jQõ�ã6 Kg=??€×´Œ&	ihhˆüGJ»,|rzzšM€^âŽ��3÷ÿ/{çóJiÆñ"å�¼½ˆHÇR~-åM)6J‘,Ä±éµÐHo’,^©“¬&†b¡“da¡$fabLù™2HNØÆ¯$õ�«kñ6ãõãœyžæ<Ï<ßO}þƒ§û¹¿÷}Ý×E™)))ðz½¬Ò"†�ì¢%Æ«–4KMj¶"Äü#‹0bjj*–——AH°¬­­iÓ?µæøí¨¿¬¬,ÈÍ?Ã?!A6o]XX€LËà:N©¹¹¹˜™™Ñç'„üš]$Ã˜ñ=k¦"Ä&”‰ïÍ(ÇæI,	ŠËËK´´´Àår9~#CC_ö?11Á‰&„‰ßï‡Çãá¼’ƒÛššìíí��`‘Ì¢ÙE2Œßã{ÍT„Ø„?Å·"Œ�††¾Ç"s¯ÖÝn·ã714¤ÝþµáŸÏçã¨?B~²ô?66Öñk	�IIIhkkÃõõ5	É,š]$Ã˜ñ-¾ÕLEˆ�x-~aÄÌÌL¬®®‚�@ØÙÙAQQ‘ã7/4¤ê�¿½½]§PB‚;Ä]ZZB~~>GþÑ�÷n™œœÔç(„ˆfÉ.f|ƒ_4Kb3þ?ˆ0 vþå-y	=©ïèè@||¼ã7.4ô ………ØÜÜ!$p>ï|Fss3"##¿ŽÐÐ?(++Óç(„Z½$™Å¬©%4Kb3þß™q“ÖÔÔÄi äÅ†QÓÓÓÈÎÎvü¦…Zg¤TWWNOOA	èí¬ŽÎŠ‹‹süúA­abb"úúúpwwBéþ/™Å¬òÿwš¥±!‹—"Œ˜‘‘�ÅÅEò'''¨¨¨`Ã(j%uíš››Ó±”„�çù¸ü‘O¸¨Õª¹tœðÊÊ
§�—Ð¬"ÿ}3¾½KÍP„Ø”Wâ'nÒôVàêê
„<6óhhÉÉÉŽß¬PëõhllÄöö6!Osvv†îînâRË™,Ä=(yý>$«˜Õýÿ“f(BlJš8.Â€º!¨««ÃÁÁù=‘?<<Dqq1ÂÃÃ¿Q¡Ö»=JHHÀàà KH	y†ùùyHã?Ç¯ÔšëxNNfggÙ�<…fÉ*fbŽk†"Ä¦„‰â­ÑÅWÞaé��'®ú>OB–ã7)Ôº–––b}}„�ÿ³¿¿�ÖÖVHÅŒã×
jM£¢¢PUUÅž.äÙCLÉ*fL/¹;4Cbc*ÄuFƒ×ëe	ù���äååAºõ:~ƒB­ktt48Í„�G�¼›uü:A­mZZ¦¦¦X@»ŒÒŒ"YÅŒom]³!6'C7£«ººšÏ ÈãVz{{9ö�ÚBiR©V„E9::‚Çã�lœ¿FPK«£)kkkq~~B”ÿkF1~û¯Žkv"Äæ„‹oÄ¯"Œ(MÞø€üÇÖÖäöŸGj].úûûqqqB”±±1¤§§;~} ö™ì"#‡ÙÓ…<,ÿ7«õWñ�f'B~JÅyÔ2oyïÍg 777èéé�tçuü†„ÚÇ’’Hü~?êëë¿.PÛ¨Þ*++q||B¾ëEeÖSÔyÍL„ü&$‹ÿšñ ¼¼»»» ŽF¿�‚‚¾ý§vRÇuvvâöö„8ŸÏ·Ûíøuá{gÓJëÆñÎ‘ŽG"jLÏ„¼tŠ‘¨“BaëVÉP$¥…Ú$e²'Œ¬�2ñZlo™ ´21ØR	GYY[+ÉKþçêú
ë™<×õÿÕï¬û~Öýžûº..‹‹‹±¾¾Ž��"çQÍ&]ÿŸÒÌDˆ~#â/éXXXˆ­­->xóúúŠ¹¹9ÖþÓÐN899!žI$èïïg	eS×îîn$“IßHÑL"Ù$ˆµõKŒhf"Ä‹{AÜÆýý=ˆOnooÑÔÔÄ¹ÿ4”æååAº³“4qÍêê*d¶ºûço/€ÃÃC>Ç}£YD2IP_ÿ÷4+bŒ?Å‰ ^ ”——cÄÏÏÏzmTÞ¶º?€ÐðÚÙÙ‰‹‹â‘T*…ÞÞ^HWu÷ÏÞ[ ìIåÍ"’I‚z0¡Y‰ƒü+&D¤cff&fffô*8ñÅõõ5ººº ¾î 4´j×ó……â‘x<Žúúz÷Ï^%ðé–óós·å¨šE$“±¦š‘1J¥øCDºF"\^^‚øªµÚÝÝEQQ‘ûÃ¿}}}x||!Þ˜šš‚”Â¸Ðp›ŸŸ�X,Æ�Q>Ñ"Y$¨õôC3!FÉ£âG]X777AÜ aihh2†ÇýÁƒ†ßºº:ììì€o=\¤Æýþ§¡W¿ü¶¶¶âááÄšA$‹±–>Ä¨f$BÓ"^‰HWùŠ óà‰ÎÎÎP]]ÍÑÔ‚:Åbbb‚M¤ˆ't|ZYY™ûýOí”sáýýÄš=$ƒµŽ®4bœ¿Ä˜ˆtmiiÑPHÌ£®KKK�9êîÔŽ¸¹¹!NžãÚ1;++ËýÞ§v¦ºŒ��ëXKâëƒ”d� ÖQL³!ÆùCì_D¤cAA–——ùæÕrÅN»FË•;÷jÇ’’¬­­�hÃ´¶¶6÷ûžš*Ð›‰§§§ n^djö�Äz{4â€Zñ§ˆt•¯	ZSHì¿m­ªª‚tÞuà ¶FI���áóó„Xgqq‘×ÿ©5õf¢”¶°œËQÉA­ŸŸš‰qÂñ»ˆt­©©ÁÆÆˆ]^^^°²²‚œœ÷jNkywwB,óöö†ÁÁAŽp¥ÖÔÆÄÑhÉdÄ<š9${µ~¾k&"Ä	¿‰_Å”ˆtÌÈÈÀÈÈˆ†Db“««+ÈÈ4vÿ§&­¬¬äDâàúÿš››ÝïwjN½™X[[«%.Äü)Í’=‚X;)ñ«f"BQ.î‰H×ÆÆFƒØäàà ìþOMš���ÉÉIbýúii©ûýNMª7···Y`Í’9‚Z7{š…qFžø-¨.¬³³³¬£µ‡þ¦óóólþGMÛÓÓƒ§§'b•ÑÑQäææºßëÔ¤:Ùbzz©T
ÄìyT³†dŽ ÖÍ7ÍB„8äñ¿€Ð§e­#µuîÔ¶ˆÇã Ä ZÝÞÞî~ŸÿÏÞ¹»Ô•Ea|pœQgFñ¢\X¤°ÐB¢¢…W1i,;ÁB%…b©XH@A|‚Q´Tn‘|€·½¦Dâà$ñJôÞä›Å*Â¼Šsš³×÷ƒß°÷a}ûì½uV½ÞÖÖÆ¦Ôî¢C²†_kæÍ@„¥Dœ¿ˆðb(ÂÆÆˆ[¡¡¡Á|qAÝ¶¸¸ÓÓÓ ÄEvww!o¤Íïsê¶ˆF£¼�ê&š1$kø±V¾ˆsš�1Ê�b»÷¡	‹Žå¸¿¿q‡ÍÍMäææš/,¨ûM¤zzzø~”8Éìì,ŠŠŠÌïsêþ8ÀååeÄãq§Ðl!Ã¯QÔq±]3!†ùM|'Â«õõõˆD" n�L&133¹Zg¾° îÛÒÒÂë£ÄÉw³}}}HKK3¿Ç©û} †‡‡ùwÍ’1üZ+ï4ûbœŸÄAñI„µÁÐÀÀ ‰ˆïÿÍÔ†UUU:ñ‚—¸½½åûjÂÔÔT„Ãa‚8ƒf
É~51}5ûB¾«?ˆð¨¾�Åb �GgêJSóEµaII	æççAˆKÿ÷÷÷QSSc~SæååakkÄ$SøÙ‹êƒfBˆR(¾¿úðñe3-GØÙÙAEE…ù‚‚šy?ªqíi±´´ÄùÿÔÔ-€ÅÅEösqÍ’-üX_Å·šy!ÊâKñA„SRRÐÑÑ�««+�`³¶¶†ŒŒóµc{{;@ˆ$’	Hã,6r¥¦ÁÝÝHð‘,¡™B²…kãA|©™‡òÏÄm1!Â‹åååX__	.���˜šš‚t\5_LP3j“¡³³3âÊw¼µµ•�\©)»»»q~~x4KH¦ðc]$ÄmÍ:„�oøE|-~áAýk,]‡µø Ám544d¾� öîíí�¸º¼Buuµù}MmÙÔÔ„ããc�à`J–ðë&ê'ñµfBÈ7|/>ß‹ðªÚ|ˆ“ÓÓStuu™/$¨-C¡VVV@ˆD£QTVVšß×Ô–eeeØÞÞ	6’!ü<À|/>×¬Cù?‹oÄÏ"¼˜••™Çª³äIð888@mm­ùB‚Ú2''ããã Ä�	 ÚÇ¥´´Ôü¾¦–Ô[¨ºöI`Ñì Â¯ÑŸÅ7šq!ÿHªøB¼áÕÆÆFœœœ€�H$9E7_HP{¤{{{Aˆ &''‘ŸŸo~_S{ÎÌÌp@pÑì Â¯õp)¾ÐŒCùW~7Ä¤/`bb$x¬®®"33Ó|AíÙÙÙ‰D"BþMû¸dgg›ßÓÔž£££¸¿¿	$š$Cø±’â†fBÈ’&¾?Šð vnnnÆÅÅH°þÍÍÍq 5i8ÆÍÍ	ø€öqIOO7¿§©=ûûûq}}843HvðkzÉGñ•fBÈÿR"þ.>‰ðbaa!@‚C<ÇØØ ¨Iëêê‹Åô5!Aî -kùOöÎ¦%®,Ã3’™AdFZiQü@Ò"´â'6˜vöî²r'¨‚B+„Þ�¸SÈ^DEÄ…èBŒ"¶ÒhqaãÊM ‹h *ÑÄš—úÆ>Â=ÔûÀóÎ=·ë­{ºßãÔ¤½½½¼ÒÕO43 ;¸xîàžfBÈ£ø¾�Ÿ]ü§¶««K®®®„x�vÍGFFX8R“ÆãqÙÛÛc€xÍåå¥Äb1óû™Ú_�9ƒÊC�43 ;¸x>Ã7ši!�"F`>@ÉÆššY[[â’H$Ø  &mii‘õõu�">£_?›››ÍïgjR½>îøøXˆWhV@fpñ<À4Œh¦!„<š?á;øJêûûû9�ÅÎÏÏ¥§§‡ jÒºº:YXX`€xÍéé©Ô××›ßÏÔ¤úìñÍÈ
®æ–|…ï4ËB~‰ø
f\}UÛßßâGáØÙÙi¾€ &Õë/'''uˆ!¾rxx(ÑhÔü~¦6­¬¬”ÝÝ]!Þ YÁÕ3��¯øõŸ�§ñ7\€ß¡dc(’¡¡!¹¹¹lŽŽŽ¤££Ã|AMªÃ‡ÆÇÇÙ  ¾¢ó+¶¶¶¤ººÚü~¦6ÍÏÏ—��!~€l YÁÅú‡ša!Oâ|/­Õ¯$Ø¤Óiioo7_@P›ëÌûû{!Ä×ÀêêªTUU™ßÏÔ¦999ºˆ?'–�\­ÿ|­†òdþ…à(ÙXXX(ccc,¬N*•’ÖÖVóµi8–d2É÷ñº°¼¼,8m~?S“ê£••!Á¿µš�\¬ýøA³!$ëa€ð”lmkkÓ!s$¸ìììHSS“ù‚Ú´  @†‡‡Ù  ^7 ¥¼¼Üü~¦v KKKBü<�làjí?Áÿ#Äpþ„’�EEE211Áâ:ÀlooŽb™/ ¨ÝÿŽðE¼n ÌÏÏKYY™ùýLÍ6 ô6ø¯ÿš	�\¬ûO¸­™…â„¿`ÂÕ)€x<.™LF‹<677÷°š/ ¨Móòò¤¯¯� â+z…åÌÌŒ”––šßÏÔn`nnŽuf°•š�	\~ýOhf!„8áwøîÃ(ÙXRR"˜²­w~’À¡“s#‘ˆù‚Ú477Wº»»åîîNñµ055%ø­5¿Ÿ©ÝÀìì¬îÜ{ÿ‘\½§à>|©™…âŒð-üââÅÜÐÐ '''B‚y w¡›/ (O âk`zzš' (O ð@`AÐ,€µr±æ_à[Nþ'äy¨…]Ú•ëëk!�Bï�®­­5_@P»3 Ù  ^­Eøá Ê $� ö×€,àjÍ?Âºß!ÏÂð=ü%[£Ñ¨œ��		Þ- ���æÊ[ ñù€ŠŠ
óû™ò 8´öGpµÞßà{Í(„�gã?x
%[C¡�Nÿ¼½½R©”Äb1óµi8–d2É ùŸ½sii3
Â0E¼«´‚ˆˆâAu!hí"EëBJ@ÜéÆ…ˆ;Š—)Á�%TpÑmT4Ø¥  ñB¬/P"xÙˆ¢`ê"Va:ôxÌ9_æ}àù'çË;ó�oŽ§ ‘H„***Ôïg¨·°°°@À=8óKöçÀÔzJm xQ^³a6ijÀññ1µ8D,£ÎÎNõê´¤¤„�  ÀÓ€h4JUUUê÷3ÔiVV–ìàÞ|Îü&¿ýO²a©M  /Ê+ÖÇÆYz®EEEéöö–€ÄãqêééQ  NËËËe2ñÓÓàÑ€Ìr©­­U¿Ÿ¡NåF#àœõ%ósö7µÖqÖ‡Éÿ ¤‡|ö+›2Ñ¥mhh ÝÝ]npxxH~¿_}€€*•¢)£ <Íöö6ñ«úýõ6r×××	¸g}y.qö7±Î)ö«Ô$ €´ñ‘ýÅÒsÍÍÍ¥ÉÉIœp„D"ACCCÄÇ³Ô‡¨ÏÆÆFâéÑø,	x¾‘ÛÔÔ¤~?C�òsi‚§ÞþKÖçÌoj�I- Hû,€oì_³ *++ikk‹€}...htt ¨ÒÖÖVZ]]E xš³³3jiiQ¿Ÿ¡JeŽÑþþ>g�ŒÏYßT¶üË~Ã·ÿ Øá3ûÛÔ)€ééiº»»#`—««+š˜˜@ ª´½½�666ä;j ¼ÊÍÍns�jííí•asÀ	$ÛsÆ7ùöÿ·Ô   +¼e¿³)§ äÛ[îâÍ›eîïï)
¡ UÚÕÕEGGGh  O“J¥ˆËê÷3Ôéàà �žžpbò¿d{Îø¦reŠý.5 Àê)€–žkvv6ñýÛòØ}XÏÏÏ£ UÚ××G×××€—á!–2Ë%//Oýž†úÇsÜ�S¥’í9ã›Zß¼ýÀ>ïØ�©Y ÕÕÕ´¶¶†S –YZZ¢‚‚õ!ês`` 7 €Œhäâë¶Ôïi¨JÉ’|•«œfÖŸC’é9Û›üö?$µ À:ŸØŸ,=×œœ¡ËËKÖøÿÀV$ *åÅØØ�	Á{vv–ÊÊÊÔïk¨¯077‡F®}$Ës¦—loh}JÍ p‚ö‹©Y ¥¥¥�Fñð¶H<'ŸÏ§>H@]ÓÌÌàqd†Åòò2ÕÕÕ©ß×P“2TZ~ûÀ.���’å9Ó›üöÿ‹Ô  gø`h€Øßß/×Ñ;œœœ?ª>H@]Ö××Óââ"�	ìííQss³ú}uYSSC›››ìr~~.YÞàÚîH­ pŠ7l�ýcêM\$¡‡‡iG†çLMMa Te[[Åb1 SŽßvtt¨ß×P—ÝÝÝtpp@ÀœÝ%Ãs–7µ®Ø Ô  çxÏþ0y�k"‘ `çá‡Õ	¨.8âê(�QWúý~âÙê÷6Ôãðð0N�ÚE²;gx“ëúCj €“ä±Ãì�‰ÏSè¥M&“ÒÏÊÊ
åçç«P�|\QŠ&ð�½ó{¥5ãøäçRšˆh”«ñ»dÒHJjäÂÅfî†;MG¹pDQvwê\’¸’¢ã‚�Ú)’s¡-Ùi§œ›as4r¡sÎwžž¿aYÛ^ëû©Ï?°×^oßç}×³âÈ(@=ÉUPPàýÞ¦þñøø4³Kv79I*&þ£5!äÍR-nºÉU/¢;99±ÏÁÁ¤'Úû0A½Pç¥ƒ—&,..¢¼¼ÜûýMý™ 0??ÏK¤ã‡fvÉî&[H7µ¶ „¼iRÅwâWSó©©)žˆ‘Hr|Ôû@Aý°¬¬ Ä¥I ÇÇÇhnnö~S?ŠÿÂÂBììì€Äïë¿dv“ÅÿWñ�Ö„�7Ïoâ'&¬®®Æîî.ˆ]b±ÆÇÇ½Ô›ššx qŽ‡‡tvvz¿¿©û¦¤¤ àìì$.hV—Ìnr]?iMAIRÄ>CTécÔ CìÎp���å$ ê…¼8Š8I?¤8ò~�S÷Û¸ä£Ÿãq|Ù(YÝäšþ'öiMAIªÄ5&¬¨¨@(ÒžFb�íímäååy,¨û_ŽúúúðòòB\cnn%%%Þïsê¶™™™XZZÂÓÓˆõûF4£KV7¹¦kZKBŠ$±[üb¨·KúÅÅˆ=Âá0ÚÚÚ¼ÔmKKKõ´!¢­-Þïsê¶ÅÅÅ8==±ŽfsÉè&OŒ~»µ– „$¿ŠÅï&ùùù˜™™á˜.‹ÜÝÝattÔû`AÝ¶¥¥‡‡‡ ÄEîïïÑÕÕåý>§îšœœ¬—ßÜÜ€ØE2¹fsÉè¦Öó»øQkBHÂò§5u
 µµGGG ÖæHë©´´4ïu×žž}ÙEˆ«ŒŒŒ@ŽH{¿×©›¦§§czzš£ì£™\²¹É¯ÿQ­!	Í/âñ›©·¼òEšy‹ìïï£ªª
IIIÞ‡êžƒ ÄeVVV ý¹Þïwê¦¹¹¹ØÚÚâ=QöÇþi&—lnj-¿‰´v „$<ˆŸE˜°²²ëëë|Ð["�bppò†Ýû�AÝ³¶¶››› Äe.//ÑÞÞîý~§nÎÿ¯¯¯G$±zñŸfqÉä&×ó³Ö„'Èß‹/"LØÛÛË‡½%žŸŸ±ººŠììlïƒuOé�æØ(âE;×ÀÀ RSS½ßóÔ-å?­-.±XÄšÁ%‹›\Ëñ½Ö„gø]‰0aQQ¤ßKgÕ“×çüüÒà}Ð îÇ±±1ž&"^°¼¼Ì6 êœ999X[[c´ˆüÖšÁ%‹›\Ë�Ö
„§øYü[¼aÂÆÆFìíí�Ø™044Ä¯GÔ)å¥–a$Ä®®®¼ß÷Ô­—¸2â’#¢í¢Ù[2¸Éµ¼»ÅŒŸ!ÎQ&®ˆ?L=øåH£Q'¯þ¶W/‘ÊÊÊò>pPgÔbèúú„øÒ³+G¥y¡+uêò¿ÉÉIÜÞÞ‚Xk5ÝNôC\Ñ�â$©â_â¿"LXSSƒ���×'£®®ráŽ÷¡ƒ&¼ú2kbb‚ÇFÿgï|^)ßÃ8~/®ºÄ	%1”…sjÒ‘�•Ù¨QâDR6ÊFfJSÊ;Ä›e¡Ù(ibaá”²°¸¢‰’I~S~KNg<óîYÝîÜi6Ÿïé|}Þ¯zý¾�çûþú<Ÿç!6¡­Ò~¿ßúß?}è¦¢H$"$&hæFö6ù/`£~#B^,ypFMu´´´ð/\__K__·ÐaUU•¬®®
!6qvv&¡PÈúß?u¿ÉÉÉÒÔÔ¤WILÐ¬�Ìmòô?
'õÛ€ò¢I€Aø~7Q@rssett”ƒ¼œoÕ&´ÜY<¨ëÕ™777BˆM<??Ëðð°dffZ_¨»õz½233#OOOBb’5k#s›z†ßágÔoBÈ‹'¾‡w
ˆÞg¬­­•��!Îrpp õõõ’’’b}ø î5??_æææ„	‡Ã‚ÁiÖ×ên}>Ÿàj¢þS‹8Žfldm“3Dîà{ý& „XÁŸ°~‚QS÷y;;;y¢ç0÷÷÷ºJ
ÿ¶>|PWïþ×Æ„ØZÇ»ºº$11ÑúZ@ÝiZZšôôôÈÝÝ�ÇÑl�Œmrt~‚¥úM@±†dø~…bÂ¢¢"žêÅ }ôääDêêê$))ÉúBÝ95z||œÃÿˆbó0À@ `}= îþ·¾¾Î«Ÿ±A³52¶Égø¾ÑoBˆuäÂ0b ˜èiÚÓu×1q½o755Å;¤Ô•ÖÔÔÈææ¦b1º6] Ö×ê>=�`‡ÿÅÍÔÈÖ&;†"ðƒ~B¬$áž©�€YYY200ÀÓ=‡» ööö¤¢¢‚+©›ÔØd¡{Œ	±�ùùy)..¶¾.Pw™——'Ìy1 cÍÔÈÖ&ÿíÁ ~B¬%¾ƒß ˜°¼¼\–——…8Çãã£Jzzºõa„ºÇêêj®þ#D½ÎÕÞÞn}] îˆuõßéé©ÇÑ,�Lmò~ƒï4ûBþ°} à+¸hê*@jjª477Ëññ±çº ¶¶¶¤¬¬Œ] Ôj]‘««+!„ˆÖñÙÙYÁVëëuÍ=ý�D"BœZ³4Þ�&[ÿá+þ#„ mª‡_ ˜0;;[°ë˜/	yxx�þþ~ÉÈÈ°>”PÞý'Ä�
îS[_¨;®p566êü
â,ÈÎš¡‘¥M>Ã/°ž­ÿ„�ó7�&¯¬­­	qîôh{{[*++¹NŠÆýÊ¨‰‰	Þý'äg´ ¤¤Äú:Aãÿôqq‘{ÿc ²³éÖÿ8¢YŸBþsà5\‡QSwÅÚÚÚ÷ùÂppÀØØ˜x½^ëÃ	�[umåÎÎŽB~æèèHz{{%!!ÁúZAãRÝ?ßÚÚ*———B_õ¬ÙÚäÎÿuøš­ÿ„�ÿã/ø^@1aaa¡LNNòäÏtïþþ¾ƒAvÐxSçSx½^Ö B~ÃÊÊŠøý~ëk�O}>Ÿ,--qï¿Ãà=©ïKdg“Ïï¾ÕŒO!¿ ~„�ŠŽžh	‡Ãìpˆh4*ÓÓÓ’““c}H¡q¥þþ;::dwwW!¿DOV‡††§~Ö×§ÿÝÝÝr{{+ÄÑÓÍÊÈÌ&»�áGÍö„ò›�€Õð“Ó¿C¡·8Èùù¹444ˆÇã±>¬Ðø±´´Tp—‘Ã@°w>¯°ïaïÞpš{GÝ[’„$RR6WÊ%YúÕµ“1Ùœ’ƒ•¥¬d§wÈŠ¨“)Gg1N™	‘˜dLScLÓ±ñÜ§ç/˜3óyfÔçýª×_ð�ù|ßßï÷ù@
ƒAjkk³þÜ€ï«Š«¥¥…xë>âèOý—¬lnê¿xÂþƒÁ €T(`çØ„É­ <èŠ­ >Ÿ�¸LÏúÀßÏÄè©©)ŠF£ Hm³Ëüü<9�NëÏø.”ßâôô´TÝ©ÿœ‘MOýO°s’é  EêX?ûf¨X¦ÕÜH”x~~¦ÉÉIr8Ö‡˜{›››åÿ H�ËËK¡üü|ëÏ˜[y®�p½¹¹! ÚÆ)÷JÎÈ&KÿßX¿dy  øÉV 71ØG&ûŽC¡•þ1	�s©Ì£à¯ü@GGGÔÐÐ`ý9skuu5mnn¢ô_ÎÄ’�9#›¼~Ö�Ò @:üÎþÇÆî—AG±XŒ€ÎK€µµ5ª¬¬´>¼Àœ•þËÌ‡‡ ü<‰D‚¼^/Ö»Â\)¥èôòòB@ÎÂ’‰9›¼~qÖ+  ÒàÖÅ~5Ô
 VUUÑþþ>ÖÉ(N“&~³>ÄÀ¬+_.yð¾�···400@yyyÖŸ)0û¥ÿýýýtqq�s\wv“daÎÄ&¯ßû•uaç?  ~e=l˜%J éîî–ýõ@‡““jmmEx„Yµ¤¤„VWWñÕ€Ì«¹äEZ]]�õç
Ì®���´³³C@ÉÀœ…Mç´0ë‘ì  òëe˜œ033COOOtúH766ÈårYf`V”ÕEãããøO`¸ ¸¸Øúóf¯ôvv›t‘û$g`Ó}ÿ?X¯dv  0Äßì7“­ ´µµ…�âJ)î-C)ÌÚ®è³³3”Œ`�»»;%~Áfý9uåÍ²‡>‰P]ù'Ù—3°éÒÿo’Õ À yìG6d² ½½�NOOñÐ Äýý=a¥Tµ¼¼/ó Pjà^lÙîÂ+Â¬?k ^ßoo/"�éþŸ%órö5]úb?JV  ÃüÅÎ±I“ÃyÒ,&†+©««/ Š¥¥¥´¸¸Hñxœ  :-]TSScýyU*¸dýÞÞžüÖ€’u9óšÒœdç$£ €.öK¦,**¢õõuz}}% 3iÖçó—h[t Y¹Qúþ£Ñ( ôH&“´´´DN§ÓúsUfL,,, ‚KÎ¸’u9óš¾†_$› €"¿±Øï,RN� JÏt�©ìËËËÄ¥ÚÖ‡h®_”+K°*
€,¶tñ7¼€Æ,(( ±±1z||$ [úÏWãCÌwöƒds  PæOö“éV �ÇC×××tˆÅb2�§üZz`æÿMMMä÷û¥Â ��‡ˆp8Ln·›
­?‡`æs˜éêêŠ€*’m9ãj”þ’L  YÂÅ~fÉ”‡ƒxýŒ<¨½þ3ž(�y 0#ëëëi{{m; ä€óósêìì$~€³þ,‚éÛ××GÇÇÇ¨àÒÿø"Ù–3®ékø¥ÿ €\´üË^³dÊÚÚZÚÝÝÅIy(`OO�õá¦gYY­¬¬H[	øŸ½si‰+‹¢0Ý¶_¨ ‘Dˆ�øÄ(’¤AH¨SŽš'„ˆˆ !œX:�8P‚H©ˆAQNDDiŒ˜A’"ÚÑˆb¡èêÍý0pïµn�õÁ÷Nqj�}ÏÙ›ç9==Õ\~~>~	c€þ¸wîÜÁìì,‹¸ößÚÑL+ÙÖê5üCü�Wÿ	!WA¼øB<a•UUUú®˜Ø×ðÝ»wðx<Æ‡ úcÞ¸q½½½<ürÅŒ��£¨¨ÒÅÝø½‰^ÞÂÂBø|>ý[Ñ,+™Öê5<_h'„�+âWÑ'Â"õmcKK677Al+¥E€ÊÊJãÃ½œYYYèééaÇB‚„Àq SSS�'9ÆïOôRjÁhtt‡‡‡ ¶¢V²¬ý:|š½	!ä
ùYôˆk"¬2%%^¯GGG öÎ–.++3>Ñÿ655òåŸ‡B‚ð&ÀÈÈ222Œß§èÿ?±æáß$»j†•,kõ:®‰ÍÞ„rÅ$ˆmâž«ÌÎÎÆôô4ûØçææðàÁãÃý×kÿ:=bgg„�àCtÚ—£  ÀøýŠþ³R ÒYÿß¿±ýÝ¿fWÉ°V¯ãžØ¦™›B‚„tq@„•–——k—Zb'''xûö-¤«´ñ!‰þÝ´´4tuuáë×¯ „/ÇÇÇ˜œœÄíÛ·�ß·¨ªJ-õ÷÷óðïšY%»Ú±žšµ	!$ˆøI,ß‹°Êèèh455±€E€ùùyÞ ÞºuÝÝÝðûý „¸ãF×ØØ¤É›ñû½xó¯ODööö@y÷¯™U²«Õkù^,Õ¬M!AF´øTübõäööv|ûöÄþ› 2"�ó¥7==}}}ØÝÝ!Ä5èX·‰‰	ÜûíÂÂÂŒßËLõ7>>Înÿ!U³ªdV«×ò‹øT36!„))¢WX={|``@ç{®­­áÙ³gˆ��5>@¨Îýú5@qg1waaÕÕÕˆŠŠ2~O3Íˆˆ<zô333ú[ ö#ÙT3ªdU«×3 z5[BH�“kñh@µ¸¸X¯©ûÙÞÞFkk+¤’m|˜2Åððpí!cÅøÅˆ�`eeõõõˆ��7~3D-ø444@Ö^úÄ4›JFµcM}š©	!ÄDˆÅV		3z8%öóñãG½Î&óß�U„FmZ$!xË†�byyuuuHJJ2~ŸuðäÉ¬¯¯ƒ8úÁD³©dT«×tC|¨™šB\B¼øÜêÑ€×¯_ÇË—/9�Ü!ä¸Ž—º{÷®ñá*„Çüéaii	„�ÐlLÖÑÑéíaü~ªfff¢­­M÷Ä9$‹j&•ljÇÈ¿çš¥	!Äe¤Šƒâ©ÕÊ^½z¥c�ˆ#oÛ.Þ“ÆÄÄ´BÉÜÜ\x½^lmm�²è¸¡¡!”””@¾T¿÷…ˆÚ°·´´Tû¶ìïïƒ8;zS²¨…µSqP34!„¸”RqY<·z´Íââ"ˆ3œŸŸëlÛšš$''ºÜîµk×ôð?88Èf„˜SÌÕ®ðìà~µ ÿþ}¼yóggg Ž¢T²¨Õëz..kv&„'>?ˆ°Hoäñx°±±â0>þŒÎÎNäååqT K½yó&jkk!·:td!Ä¨I/úF¼¹¹Ò±ÜøýÐ­¦¥¥¡±±«««löç<š=%ƒÚ1jóƒøX³3!„¸œD±UüS„UÆÅÅéà§OŸ@C;ÄË3”˜˜h|sÓUÑœœôôôÀï÷ë­ò{çúbãGñ(„—ãÅ4Æ%qd¦iŽ´‘ˆ¦f^à�æÈå�Éå¸+L’[r742î/”dä’—Ž»‘LnGã’Û¸L§‰ÖY­¤”œsôìÙÏžg}jýÏÞûÙë÷û~¿ëkL4a»¸ò]Ø>în€äZñ§Lžââb·ü'zNyOzÐ ?ß—ÔïòÌÆSOH¡J¨¿ƒ®f.X° ¯_¿†©Ûn€û÷ïcîÜ¹à¡ÒÝ !WjjªªG�uv†1æËHÀÍ›7QXX¨9æDþ]R©Òœ––†Ñ£GãìÙ³®ú'zMyNzÏxìû/‘W6Æ˜zFu:èPÀŒŒ”––¢¶¶¦nsÞ½{§™ÒX,†Ö­[GÞ¤…±ZÔ­[7,Y²ú³i4Æ|3É¼¤¤ÙÙÙîéšÖþýûcË–-xöì™çý=¦¼&=g<BÿNË#cL=ä'*F]	:033'NœðcbfJµwÅŠ
ÄiÚ´iä[¢ÅJžªþùùù(//GMMŒ1æ{‡›7n`Ö¬YàJ9o
IXk—.]0qâDpÖ_&q]�ô˜òšÁ‡þÉÇä‘�1¦_üF=¤”6lˆáÃ‡ãúõë¾H �<þ<


ÀrÈ©U«VÈÉÉ+z®cþïß¿Ç‘#G�››‹””ð¿5òïÔ´ûk¯|^^žÂZ¹©Å™-‰=üË[ÒcÆã÷ð€*ðáßZSk¨¿($µ.r>Î;ÍÜðâÅ”••aÔ¨QàX€óêHÍš5C×®]5ŸXYYéYcÌ_æ>|ø›7oVëyË–-#ÿ~­«Î-ú]ànÜ¸ü\õô”ò–Á�ÇÈ¯‘'6Æ˜ˆ�A¢jƒ¾˜2e
ž?“Øp©G�i^nèÐ¡hÓ¦�/â¸º{÷î˜3gØ�¡\cŒ	bãËíÛ·±téRôìÙÓ[_â|ðïÛ·/–/_®˜Ó³7	G^’ž2‡ÿZê�¼°1ÆDˆ†Ô¯ÔÔ'
A©]»v añf€Ä£=ó<ÀÎ�;1lØ0´mÛÖ£Æ-Z wïÞ˜9s&.^¼üÝ&jŒ	œ>èPºvíZôéÓ3ò…n0­þºTé×¯–-[ndpçV¸ÿå%é)ƒþì?ÉûÒËcLÄhB�¥þ¤¤ÒÓÓ±cÇWCCÔRZUU…íÛ·ƒªZÓüDÞ þÀÁ_(ÌXÐ
Æ«W¯‚3»>øcâ�§·nÝÂªU«T­f:½3~,³HÏ®W¯^ÚÐÂgêƒ¸�w¤‡”—þ; Ï;VØc"JKªˆzðÍºÚ¢<èõ€!ûSeK©þX¹—^³¥\UyCø¾Ï2ŒYYY(**Â¹sçÀÖDÏ‡cê<íÕ«WàÆ e4HUìF�Eþ=ýoâ3RVË�!C°~ýz\¾|ÕÕÕjaÁ‚ÞQ2øB…¼n‘¼¯1ÆDœTª”ª¡ T¥àaÉ°á›-ÕêÀcÇŽ�k§T	aW€Mä×U"­�êÐ¡ƒ.K¶nÝ*Óýöí[cL‚ÑzÑ{÷îaÿþý˜4i’:“š4nâî®¯/oµ·S§NZç·oß>Ü½{Wc&”\òŒôŽñø>ÔP¥ò¼ÆcÄ/TyÀy šS1bîÜ¹>Øº®jWìh<`Ì˜1NœþÜêß£GÌŸ?'OžÓ Ý"jŒ	kÅTI.\Ðx@,/t#ÿçÁƒŸ‰ªý\ËêŽÄ�C¯(Ï|Æ…¼m¹¼®1Æ˜/4¢r©

JÊ3fàÉ“'0¡E»Ž‚¤jÒÂ…µs—É»Qªø«åpÂ„	(..Æ©S§ÀM
nó7Æ$ZËÃ®‚_™ž®5‚¼ˆÔ¡?;;Ó¦MÃ®]»Àg¡gbB�<âôéÓãå;*¨\y]cŒ1_Ñ˜OUQR)))à¡Róv&)ÒwupàÀ,Z´yyyHKKÓ­|}ªò7oÞÀÔ©S±mÛ6œ9sF‡þ�?Âc’¹•úéÓ§¸rå
Øö®5¥#GŽDÇŽõî«Oïqf h®öìÙØ³g.]ºVûÎšDÐÊ#¶oß>ß“*j¼<®1Æ˜oò3µ8ØP@I³Ô«W¯Æ›7o`’~^jËc+¼*ã………êàç©ª9˜v“Hi¦?33ãÆ�ÃÊ•+uÁqíÚ5Ð(Û,cêõ«²²Ç�Ç†0yòd8P«a?¿Ç“â°Oi-\NNŽrÖ­[‡²²20ŸÅ•þäõò†ôñøÞTS‹åm�1Æ|—tjõŽB�êÜ¹3vïÞ­:“œ³¦�?FEE>ŒM›6aÞ¼yÈÏÏWB>+1¡
b(–*Clë×žç½{÷ªÊÏà,¯¨ü‡½»w©óŒÃ8K—B±CÍ$(‡vª¬rüÔÉ%‹Á—É.:Å!ˆ:œšA)X„‚.Ç:Aq‰:¨X0�B£µô×‹kíÒ¤ÏõøýÀ=*äðxÝÏs¿ x°›ÀžœœxzüââbLMMÅÀÀ@477{Ô]ÚV§¯øwÒïæ›Ïð{‡ø���ÐÑ¶ìÍRïEuBwÃïŸ÷ÊOJî à?ùAYPþR"ËÔÔÔD¡Pà&@Ðúx?uÑrÏXXXˆééiO7íîîöîùõõõ‘Ëå¼5Åº}-/ñSý†††Ð&†žÎ?>>šÒï÷Ùææf1à€ó Z7v=J'Ãø˜ØÉÉÉŒŽŽŽÐ¦lÞ•½²²2Å±±^ZVQQµµµÑÔÔäŸ©}ƒ¼yŸö2ð¬Ýtöò¬«««@Ñþý7Z�0ÁàßÝuÁ] ðAê•×Jd�|>ËËË¬µ.Þ)}~Â´»»ëëë¡ÿk¯CÕËÑÑQÏÐS'Oãìééñ´üöööhmm�–––hkk‹ÎÎÎèêêŠÞÞÞèïï�¡¡!¯œ˜˜ð9Î³³³~´ºº[[[~²¯”D øxþÛ¬b|ótggÇG³iª½ŸÖjæ—ç###¾Ù«Í=ËJ7}}ÍÖµÛ×qÅëÚîÏé>?Å×küZ}/ò=£lmmÍýÃÃÃ8;;ãøàâ~¹¨¦š=òÚ ðÁ>Wž(»Jd�ÆÆFOAÄÃ›5 3˜].OOOãøø84p÷>{{{^Ë©xVÁÁÁAèß]uŸ7vÒ9üðàv¯ãžU¥½üd^7
|¾þþþ¾¯Ýº†;ÚwÀ×q}Î_£™~�^Ë	+—»Ÿ:`ªÁÿ®òÄ ðQ¾Tú”7)¦ýiÊ¶   Šš;Ÿº_ªS…Þ(}î® €ÿåk¥OùM‰,£uážÞ½½½   (Jîzê|)öRÜQûÜY ™x¬¼P~W"Ë”––†Özš    Š‹:ž»ž:_‚Á¿»éwU @¦¾Sæ•k%²LYYY{�7   Šƒº�;žº^ŠÁÿ�ò³;*  ‰¼ò«ò·Y¦¼¼<ÆÆÆ¼¡   î7u:w;u¼ƒwÑvü€´>S”U%2ŽÏÖñpÞ   ÷“ºœ;�º]ªÿW•wS @R_(O•#%²N.—‹™™™8??   Ü/êpîrêt©ÿGÊSwR À'ñ•òLy«DÖ©ªªŠ¹¹¹¸¼¼   Üênîpêr©ÿo•gî¢ €Oê±ò\y§DÖ©®®Žùùù¸¸¸   Ümêlînêp©ÿï”çìø ·'§¼TþP"ëäóùXZZŠëëë   ÀÝ¤®æÎ¦î–jðÿ^yéî	 ¸Uß*?**‘eJJJ¢®®.
…BÜÜÜ   îw4u5w6u·ƒwÌWÊ7�  wÂ÷Ê/ÊUª™ +++Ì þaçŽUÚ
Ã0Ž7Ú8‡î—RÚ¡ ‚�4h0Žz®^�×àäÖ‚�Á)�I#QPH ‹àâêâ&1qILÞ>¼s‡ZÎ[O’ÿþ×�çûÎ9  eOþµÑ"Ÿü÷UÕ·&  U~¨³¨K€õõu«×ë\   ¤ãðïÛL-òðæ �:ª j¤,ÉæççýæêêÊ^^^   oÂ·˜6™o3m´ˆÃÿH5TÁ7&  •Þ«-u­ÆÊ’lnnÎŠÅ¢5.   Þèð¯-æ›LÛ,âð?V×jË·%  ÕÔŽºQÃˆK€ÍÍM»¸¸°^¯g   ø?´½|ƒi‹Eþ‡êFíðä &Çµ­n•E|°¶¶fÍfÓF£‘   –6—o/m° ×þ½[µí[ 0QÕ®ºS–tÙlÖJ¥’µZ->   ~í_›Ë·—6XÔáÿNíú† L¤Eµ§îÕ8àM ÿþìòò’Ï   hcùÖÒæŠzò?V÷j�Ã? L¾�j_=D}°ººjµZÍ†Ã¡   ÚV¾±´µ"_ûPû¾ SaI¨Ge¸±±aº�æ    ™Ã¿o+m¬ ?üóÕ�oE ÀTù¤U[YÒe2+
v~~ný~ß   ðO|KiSù¶ÒÆŠ:ü·Õ¡oD ÀTZR?Õ³²ˆòù¼�œœØ`00   ¼Šo(m)ßTÚVQ=«_<ù€é÷U«§È7NOO¹   xåá_*úÉÿ“:VßÞ fÂu¤ºÊ"ÊårV­Vù   à/h3ùvÒ†Š|òßUG¾ 3å³*G^¬¬¬X¥R±N§c   ø3m%ßLÚNÑ‡ÿ²o@ ÀLú®*ª­,¢ååe+—ËÖívøÍÞÝ«´€aqÑâb!âVÒ”¯E:Õ#pVpéæä.dpÑPpQüEA‡à98:¹¹H!.
¢&tQòôáÝZJé�¯¨¹/xÎá~“|ù  À�ÜHÑJn¦Ìã¿áÕ¢ý  í³·îµ<e¬(
-//«Ñh   !ÚÈ�­”xü·¼õh>  ìƒ·™ùv€r¹¬¹¹9Õëu  t:7Q´‘)ûßþ7yæ ð³ÂÛò®<elppPSSS:==  @§rE¹�2�ÿ+o+ €_øâmxMO+•Jš™™ÑÙÙ™   :�(ZÈM”yü7½�h;  ~£â­z7ž2ÖßßŸz
   S¸}¢�ÜB™Çÿ�·M À({K™�ôööjttTûûûzxx  À+­ãæ‰öqeÿì)Z €¿ðÉÛÎ| ««Kccc:88Ðýý½   ^™h·N4�Û'ûgÿÛÑp  üƒ�ÞŠ×ð”µ‘‘íííéööV   ¯D´�'ZÇÍ“¹†·í Àxç-z×ž²6<<¬Z­¦f³)  €—ÎMmãÆÉ>þ¯½Åh6  AÙ[Ëþ%@QÚÙÙQ«Õ  ÀKå–‰¦qÛ<Å7ÿk<ó xlï½yïÒSÖ*•Štqq!  €—Æ-ã¦É>þ/½ùh4  ”¼YïÜSÖT­Vurr¢v»-  €g.šÅíã–É>þÏ½Ùh3  ½õ¦½º§¬õõõibbBGGG¼&  <gÑ*n–h7Löñ_÷¦£É  x%oÒ;ö”µžž���Ç{sïîî  ðÌD£¸U¢YÜ.ÙÇÿ±7É7ÿ €§öÆûê}óÚž2ÖÝÝ­¡¡!íîîòç€ßÙ»c–6À(
Ãi�¸Õƒ�¡ƒ"DÈ\Éä ¥NÒU'AüÁM¡cVÁQp¨‹RG‘B)ÜŠPÑ@CEogìPZêÕ¨ïç?¼7‰Ÿ   “¸MÔ(n5Kæá£iïÜ`  Üƒní­¶¯ýÐ"k•J%ÖÖÖBëð.   ¸On5‰ÛD�’ü­¿k_{ëö àuk¯µ�Ú•Yˆ¥¥¥h6›  p_NNNÜ$år9ûø¿rc©µ8þ �¢¨�i;Z[‹Œ
…èëë‹ÙÙÙ8::Šëëë   ¸+j7ˆZÄM¢6É<þÛÚŽ6æÖ  ƒti5mS»Ð"k¥R)ÆÇÇcww—Ç À]ps¨=Ü j‘ìoþ/´M­æÆ  ´!íCö‡ ]]]1::�F#Z­V   dQk¸9Ôn�üãß-5ä¶  ƒ´am];×"óOFFFü ÏÙÙY   Ü65†[CÍ‘ü“ï\[×†9þ IE{¯}Ó"sƒƒƒ±¸¸ÇÇÇü‡   p+Ôn5†[#»gÜLj'7  ÐKmAûªEæz{{crr2öööx  üµ„›BmáÆÈ?þÝJn'  °çÚœöY‹Ì‹Å¨×ë±µµív;   þ•Â-¡¦p[äÿn¤97  �@I›ÒöµŸZd®Z­Æêêj4›Í   øKn5„["ÿðwíkSn%  ‘gZ]kh--2W.—cff&x   ü‘ZÁÍ vpCäÿn¡†Vw# ðHUµí»™ëéé‰‰‰‰ØÞÞŽËËË   ø�Á­ fp;äÿn 7  OÀ+mYû¢EöjµZ¬¬¬Äééi   ˆ©Üj7CþÜ>Ën!  ž�Ú´öI‹ìõ÷÷Çüü|  €šÀm F¸£ãßÍ3í à	êÖÞh;Ú�™ûÅÞ½«4@Q&ÉÌà„šFlÒh7baÐÊNˆØLaïHµìEÑ`«h/ZXˆ…�ÚDPÁ"A%÷,ö2£ÛÛÿÁÿk1ç¤Óiëïï·ÕÕU«Õj  ¾¿tøM Û âÁÿImª‚ß>  |aßUAm¨Ge¯Y2™´žž›ŸŸ·J¥b  àËðí×à·€n‚ˆ‡ÿGµ¡
¼ì  ‘„Ê«u­,â+cccvppÀW  øÜ|ë÷÷÷}ûcÞòï]«•÷[  ˆs95©Ž”E|%```ÀVVV¬Z­  ø|´ñ¾õ…B!è-ÿÞ‘šôÛ  üõå€£êPYD]]]¶´´ÄO  ø\|Ûµñ¾õÚü¨Õ(/û ày2ê·ÚQõˆ±nkk³‰‰	ÛÛÛ³z½n  àÃò-×¦û¶kã£üëjGýö[  <[Jõª5uõ“€¾¾>[^^¶››  �6Ü·\›ù/ÿ·jMõú  þÉ/5«.”E”ËålffÆNOO­Ñh  xÿ´Ù¾ÝÚpßrmzTjÖo  ðß²ª¨Êê)bÌ[ZZlhhÈÖ××íîîÎ  À»å[­ÍöíÖ†G=ø?©²*ú­  ^ÌO5¨6U5bØS©”µ··Ûôô´�œœð¹@  Þm³o´¶Ú7[Ûõð_U›jÐo  ðâ¾©5§.•E”ÉdlxxØ¶··­V«  x{Údßfm´oµ6;ªK5§:ü6  ¯&¡ZÕ¸:V�ˆ±O§ÓÖÝÝm¥RÉ®®®  ¼ßbm²o³6:êÁ¿¡ŽÕ¸jõ›  „~*pKÝG"‘°l6k###¶»»k  âh{}ƒµÅ¾ÉÚæ¨‡ÿ{µÅ'þ  x;?T§*©JÔ›šš,ŸÏÛââ¢�ŸŸón   ~ë¯ÍõíÕû¾è¯¢JªÓo  ðæ?	˜RgQH&“ÖÜÜlÅbÑÊå²Õëu  /Oë[«ÍõíÕG>üŸ©)þå €?ìÝ¿KœYGqn\ÔìŠ’6•‚)"‚m$EÀbšX
	XÛØØ¤›4)ÄbR‡€6‘„4B,Ò	�XL£¢±ÐN|öðôa°Ü8ÎùÀù¾wxßyïõÒOOè#]R("“““ùDâøøØ·$IúŸú³­¹±lmn.Û[ªKúHOòŒ!I’®�_é>½¢¯ô½Ôu�ýýýQ­Vcww7ÎÏÏC’$ýg¹¥ljn+[òz¿ïô•^Ñý<[H’¤këÝ¥eúBQòºÀñññX[[‹“““�$Iÿš[Ê¦¾Þ/ûBËt7Ï’$©%Ü¡
} &E‰:::bpp0æççóÉE³ÙI’ô÷ØÌÜN64·”M-ùÃ¿I¨’gI’ÔrnÓ½¤ŠRuwwç“‹ÕÕÕ¨×ë~@’¤`#s+ÙÌÜN6´ôSÿzIc~å_’¤Ö÷UéEÉbzz:¶¶¶¢Ñh„$IJ‰mÌ�d+s3ÙÎÒ}¢jž$IÒ�ÑC�è5}£(UgggŒŽŽÆÒÒRìíí…$IŠÜD¶17’­,ýÃÿ½¦GyF�$I7Î-ºGËô™¢d½½½155qzz’$µ#60·�MÌmd#K÷™–éžú“$éæû�ÓjP”lxx8æææb{{Û¿H’Ú›—ÛÇæ²‰¥kÐzœgI’Ô6:hŒžS�¢d]]]111+++±¿¿’$Ýdl]nÛ—È–®NÏi,Ï ’$©-ýN³ôž®(JÖ××•J%Ö××ãðð0$IºIØ¶Ü8¶.7�í+Ý½§ÙÜ|I’Ôö~¡ô‚(~Æßfffbss3...B’¤VÆ–å¦±m?éuÿì€^ÐƒÜzI’$ ýI³ô–®(J722‹‹‹±³³“÷"K’ÔJØ®Ü0¶,7-÷­|Wô–fsÛ%I’~à6=¤S”®§§'ïC®Õjqtt’$µ6+·‹Ë-Ë]+ß1Õèanº$IÒ?0DÏè]R”nhh(òÊ³³³�$é:b£r«Ø¬Ü®Ü±ò]Ò;zš.I’þbïþYªnã8Ž“v;©â
-M�˜SØ`þ™} m987JÒâÐ�‹S…b‚IACO¡? h -"6˜ÚAQxÔãñ{¿ù÷xC”]zî÷ÞOáúx�ãùýô“ÎÑuz@[%êéé‰‰‰‰XZZŠýýý�$	Å±I¹MlTn›Uª-z@×s»%I’~ÁEºKoé�âO×ÔÔ###±¸¸qtt’$•Àå±I¹MlT©‹ÿ!½¥»þÖ_’$ýNM4@OèE‰ÚÚÚò·•ÏŸ?�ííí¨Õj!IÒŸÀæäö°A¹ElRÉoý?Ñð·þ’$é¤üM·éý (QgggŒ��Å‹/bww7$I:A¹5lNnTòâÿƒ^ÑíÜdI’¤Ö@×hž>Rd…8>>ËËËñõë×�$éwb[rcØš’ø£ì#ÍÓµÜbI’¤?ä] QzI_(JÔØØÝÝÝ199+++¾1@’ôËØ’Ü¶%7†­)yñÿB/i”.ø ?I’TJ#]¦;ôŽöK055«««ñíÛ·�$ég°¹!lÉi¸øïÓ;ºC—ss%I’PÚyºAÏh›j¥ÞÐÛÛÓÓÓ±¾¾{{{!IÒÈ­`3r;Ø�‚OöÏj´MÏèFn¬$IÒ)sžºè½¡ï%jhhˆÖÖÖŠ………ØÜÜŒJ¥’$)·��È­`3r;Ø�’—ÿïô†nQ——I’tÚýEWè>½§JÉÚÛÛ£¿¿?æææ‚?òü� IRn›�ÛÀFäV¾øWè=Ý§+¹¥’$IgÄ9j¦Aš§]ª–ü €÷5ç·;>Œµµ5(IÿCœý¹lAnÛPúâ_¥]š§Ajö!’$é¬j ¥eªP”ü  ¥¥%úúúâñãÇù^çƒƒƒ�$Õ7Îú<ó9ûsØ‚Âÿ¬BË4J¾ÚO’$Õ‹fºJ÷èR”|P`WWWÇììllmmùA€$ÕçÅ?ÏxÎú<ó9û?à/;¤t�®æFJ’$Õ¡6¢§ô™ª¥ÿ# ££#bffÆgHR8>>þ÷7þœíyÆsÖŸ†oü«ô™žÒPn¢$IR�k¤Kt“^S•¢d¼ç9¿ŒG�å¿‰Öjµ�$�)yvïììäYÎ™žg{áwùSV¥×t“.ùNI’þaïþ]¢Žã8Ž!ˆ�u$A"Üä¹Ê�´Ýp‚«RPºÙRƒ‹QÖÐà "Dps‡ƒK¨[˜ Aˆ|•.Áé‘<¾(ï^¼ç è—oóù€ç¿ðúðÑï}¿8o.©‚z¢6Uªì4kjj²ÎÎN°¹¹9ÛÚÚ²4M šoµ6Û·[î[®M�pñOÕ¦z¢
~ö  œcWÕ-õ\}VÇÊN9ÿ¯Q__ŸMMMÙÆÆ†úc¥ €´É¾ÍÚhßjm¶o·6<BÇê³z®nùY   ¹¦Jj^Õ•E(“ÉX>Ÿ·±±1[YYá €¶Ø7YÛì­­öÍR]Í«’Ÿm   ø®*«îªªúª,@þÉ¨ÞÞ^·jµjûûû ø·´½¾ÁÚbßdms¤‹ÿWUUwU–ïù  üœ‹*§¨wª¡,BÍÍÍÖÕÕeÃÃÃþY©Z­f €¿K[ë›«íõÖGºø7Ô;õ@åxÁ  À¯iVyõX½W©²(uttX¿ÿötmmÍ�† þßTm«o¬¶Ö7WÛ©T½W�TÞÏ,   ü¶Ëª¨ž©êXY”ÚÚÚ¬X,ÚÄÄ„---ñó  øÚPßRmªo«66ÚÅÿX}PÏTÑÏ(   üqmª¨^¨Íhhii±žž±J¥b;;;|9  ~Ì·R›éÛ©õ-Õ¦F¼øoªªèg   þº«ê¶zª>*‹V6›µÁÁA›œœ´ååe;880 €8çÛ¨�ô­ÔfúvjC#öQ=U·ù¤  Àé¸¢Jê¥ú¤ÌöT@¡P°r¹ì/°J’Ä à¼Óú&j}#µ•Q/þŸÔKUò3   §î¦º§*ê‹²ˆår9µ……[__·££#€sÂ7OÛç¨-ôMÔ6Fí‹ª¨{~Æ    œê¾z­eËd2V*•ü‘×ÅÅEÛÝÝµ““€ÿŒo›6Î·N›çÛ§Œ|ñOÔkußÏ   „w]ÝQ¯T¢,jÝÝÝþÂ«™™[]]µz½n pÆù–iÓ|Û´q¾uÚ¼È%ê•ºãg   Îœ›ê¡z«jÊ¢ÖÚÚêß¹žžž¶jµjÛÛÛþl 8#|³´]¾aÚ2ß4m[ô‹M½UyÔ  àÿpM•Õ•¨TYÔÚÛÛmhhÈfggýíØ{{{üD @D¾MÚ(ß*m–o—6,ú¥?U‰z£Ê~F  €oì�½K]w‡ñ¥zS¥ƒÈá"JL‡�Ú¡Q‡ÚEÄPœL	ØÅQh¦Ð©à Z¥“SÁø8E‰‚P(Z(%CK°¨ H¬µ¾4ê·>pÉ’¾`rÏõyàù>�ž{Îù€¼£ZÞ–ßÈŸä2rÕ‚‚‚hllŒþþþxðàA,..ÆÆÆ? À¿èW‹Ü$µÉ�R«Ü¬\nª›ïöûoÀmÿM    €¼çmÙ-'äÏr_FëOdµ¶¶ÆÀÀ@ÌÌÌøZ;;; ðºPsÜ5È-R“Ü¦\ï§ïÖ»ùÝþ     Š™’Ê¯å�r;×Ÿ(**ò	Ú���188èÄõÎ-? Ày]ô»1j�›£ö¸AjQîøo»ín¼[Ÿrû   àÂR Käûr@~'7eäú�………QQQ]]]144ôÂ“ggg ðoQ;^¸Ó¯¶¸1j�›“ûývÓ-wÓÝö.ü   àeŠd£ü\~+Wå±Œ<àÓ¶oÝºÃÃÃ1;;›}2€3 àUïôgïô»jˆ[¢¦$äN¿=v³Ýn7¼ÑM    ø¯dä§rJþ&÷däºÅÅÅqéÒ¥¨ªªò]»‘‘‘˜››‹'Ožðc  ¼|Ñï6¨n…šáv¨!n‰š’÷Üh·ÚÍÎð¨?    üÞ’—e‡üJþ ·ä©Œ×wîR©TTVVF{{»ízøða<~ü8ž>}êovÀ…Á›×öÝ µÀMPÜµÂÍHBÛÜ`·ØMþRvÈËn6    Àÿ¤P¦ä»òžœ•kòHFô»»¥¥¥Q^^7nÜˆ»wïÆääd,,,Äêêj<{ö,ž? �?hÓÞ¶6î­kóÞ¾à¨	nƒ‘�äšì»É)7    à(‘iÙ+Éßå‘Œ$YRReeeQWW===1>>KKK±µµqrr �8¼]mØ[Ö¦½mmÜ[×æ½}5 i¹µn®Û›v‹    ^e2#?–ãò¹/Od$HÇ»ºº:2™Lttt„ ó;Á+++±»»ÇÇÇ|U  GÑ6½QmÕ›Õv½amÙ›Ö¶³ßêOš'rßmucÝÚŒÛ    ð†(–Wä{òž|$7å¡<“a“óª€ß®­­�æææèïï�‰‰‰X\\Œ���ØÛÛ½GÌa‚ ooOôµIoSõVµYoWÎ>ÚŸ4Ïä¡ÜtKÝT·õŠ[    �C¼#ëe·œ�kòO	Õï	§Óéhhhøû Á©©©ÐÉá¾ë¨‹ž 8g´1oM›óö´Áì~Þ¦6ê­&¹5n¥›évvËz7     Ç)•õò#ù…ü^ÈS	ÕwkjjâêÕ«ÑÒÒ½½½1::óóó±¾¾Î çpÁ¯mycÚš7§íyƒÚbö.’=•n¤[éfÖ»¡     	¤R^—ŸÈqù«<Jø�Vß	÷EÈµk×¢­­-úúúbll,{~€SÖ�d¼. ð
´oE›É¾Çï-iSÞ–6æ­e¿ÍŸpOå‘[è&º�×ÝJ    €<¡H¦åò39%·eä‹ú¤˜/RšššâæÍ›qçÎ�¸ÿ~LOOÇòòr £MxÚˆ·¢Íx;Ú�·¤My[yä¶Ûçº…i·   þbïìBº<Ã8l.e	vàÆèÄÑ"Ü�®£†ÕŒp±HhäZ¡Ð¨ ²>��
'Y‘´'ÂJ$³X‹³TeÂ?‚Ö§m.óÞÅï ƒA�¶Úÿý]pA”¾ïóÜ÷ï}áéý2Æ¤1ã±?Äü	‡0ÒÉ¬¬¬àÙd}s|æÌ™OþC ¥¥%ÎŸ?·oßc’™Wö9ž,ø96tŒp¬è˜áØI7‡ð'¬Á±ÐÏöcŒ1Æ˜¤òÎÀ�±{q#ÍËËngÖsÌóæÍ‹ªªªØ³gO;v,úúúbhh(ŒI”e2­l“qe�Ì+û:8&ÒÕaìÅzügè\gŒ1ÆcŒ™˜�%ø)6`?Ž`¤«<Ó¬Ï–EIII,\¸0Ö¬Yûöí‹ŽŽŽèïï�„1/3dTY%³Ê.V–É´²MÆ•u2ŸÎŽ`?6à§X‚ù:·cŒ1ÆcžJ6àø96ã FÌÉÉ‰É“'ëågóçÏ×›Ï7nÜû÷ï�ãÇ�ÇåË—ãîÝ»aÌ‹€ì)ƒdQ™$›Ê(YUfÉ®2L–“â 6ãçøèfŒ1ÆcŒyf^E½/ ·`¦0’ä¸qãbâÄ‰1}úô˜;wn”——ë*ëîÝ»£­­-ºººb``@oQ7æ9 ,‘)e‹Œ)kdNÙ#ƒÊ"™T6ÉhÒLanA=×¯s•1ÆcŒ1æ¹‘ƒïàGX�­x#‰Ž3FoJŸ2eŠnµ^°`A,]º4Ö­[§o¦755Å©S§‚[³}Ç€y*dC!+ÊÙQ†È’2E¶”1²¦Ì‘½¤z[±?ÂwtN2ÆcŒ1Æüë¼†ÅX‰µØŽI7;;;òóóƒÏ©iWQQ¡ÝŽ;âàÁƒqôèÑ8sæLôööÆ�7|×@ Çê5=WïÉ€²@&”2¢¬�e‡%þ8ÂÀlÇZ¬Äb�{Œ1ÆcŒ1/Œ\|+ðKüÆÑ/`ž˜™™©O­M�:5fÏž‹/ŽÊÊÊØ°aCìÜ¹SÏs·¶¶ÆÉ“'£»»[·ß¹s'=zæå†©WôL½£‡ê%=Uoé±zMÏÕ{2 ,�‰ÄrÆïðK¬À÷tŽ1ÆcŒ1Æ¼tdc–ãø-^Ä_3¼¸ùKÇ�Q\\¬7¸/[¶,V¯^›6mŠíÛ·G}}½nooo�Ó§OGOOO\¿~=nÝºÃÃÃaþT[j¬ZSsÕž¨ôD½¡Gê=Sïè¡zIOŸë¿Wç†‹ø-~�åXäùcŒ1Æóÿ"ßÆ2ÜŒ�ø#¦2¼èyfssscÒ¤I1mÚ´˜5kV,Z´(–/_¼NÐmÛ¶Å®]»âÀ�ÑÜÜ¬ï¿wvvÆ¹sçâÒ¥KqõêÕ¸yó&ÏœßÓ-é£££‘4˜³æNTj¢ÚP#ÕŠš©vÔPµ¤¦ª-5V­©¹jOÔz’ø\þCSø#6âf,Ã·ýÉ>cŒ1ÆcÒƒ1ø–álÂ.¼†¿gxAô\ÌÊÊŠ	&Daa¡®B—––êqUUU±~ýú¨®®æ%s_E]]�¹GŽ‰––=“~âÄ	½ˆîìÙ³qáÂ…`a¬—Ó]¹rE·¶F*•ÒÂ™+âºåýþýûñðáC]%ç6x922�?ÖbûŸ,Ðù]mƒmI¶­}°/í“}kŒEcbl#cÕ˜»æÀ\4'æ¦92WÍ™¹«ÔB5¡6ªµRÍ¨�jH-Ÿ§çèïx»°	·`¾¥sƒ1ÆcŒ1&­ÉÅ¸ëð{¼ˆ¿dx±ôŸ:vìØÈËËÓmÞ6¯oÉÏ™3'ÊÊÊbÉ’%º­}åÊ•±jÕªX»vm°hÖUñ­[·ê
yMM�®–×ÖÖjq½wïÞàÖx=ÿÞÐÐ,ºõÂ»C‡Eccc>|8PæïôoüŒ~–ßÑï²m‹mjÛìCûbŸÚ7cÐX“ÆÆ5VÆ¬±3Í…9inÌ1ñ}~þ‚ñ{¬Ã8ÃÏócŒ1ÆãGÞÄRÜŒß`'öá½/¤¬ý?xû°¿ÁÍXŠoúÖ~cŒ1ÆcÌÓÈÁwñü;°S8œá…–µ/ƒÃ˜ÂnìÀ¯ñ|×ßç7ÆcŒ1Æ<+™ø
¾ŽïãgØ€?`¦ð·/Ä¬ý/üSØƒ?`~†ïãëøŠ¯ôcŒ1°s¡YÕqÇŸZn9Úàq[ŒÜˆF›i¶5°•s¶.J²¼Õ`WŠ¥R]ÝQàŸˆ(” ?D7…¤1Eè"¶b¤“1�:ñ4Ö\ÃmºzÑMÔEPh¹ùyÃÎ¹ù]}çOJ)¥+Õ,¡–nžå]z9Åy.2¨E\	8Ï)zy—gé¦–%ù�_J)¥”RJé¿êÊ(²–�¼ÅqÎ0ÊÏÌ2ÌEü�y~f”3ç-v²–"eøSJ)¥”RJ×BeTPI�<Å|Å #”òÙ@Dá"%Fä+Þà):©£’
Ê
)¥”RJ)¥´ >XJ5-läs’!Î1žM�XÄ.2Î9†8Éa^`#-T³4¯õ§”RJ)¥”Ke”SI‘6zx�ÏfŒq¦˜+dxŒ…eŽ)Æc˜Ïy�Ú(RIyžî§”RJ)¥”®—Ê¸…nc�°›7ù’!~d‚_˜-dÈŒkÃ,¿0Á�ñ%o²›GXÅmÔpKþ”RJ)¥”Rú£2*)RÏ¬¥‡—ùˆocœI¦³1WÑ,ÓL2Îßò/ÓÃZî ž"•öSJ)¥”RJéßUA5u4ÒÊc<Ã^>¦�ó”˜`Š‹\*dˆ�¿w‰‹L1A‰óôñ1{y†Çh¥‘:ª©(¤”RJ)¥”Rºª-¡ŠZ–ÓD;›ØÅ>>e€Ÿ˜a–9.ÿ.ƒïuÆšÃ³Ìð|Ê>v±‰všXN-U,)¤”RJ)¥”Rºfª ÈrZ¸—.g/q�#ô3Ê43Ìq‰ËÌ20/4ó\æsÌ0Í(ýá /±ƒÇéâ^ZXN1OõSJ)¥”RJiáw3ËhàNVÓÁžäyöòGéc„If˜…?od³àªšç/ƒ½5€&¡�£¼Ç^žçI6ÐÁjî¤�eÜ\H)¥”RJ)¥t]vUÜJ#ÍÜÃºx‚mìa?ðß0L)?#¼¢f)1Ì7|ÁìgÛx‚.ÖpÍ4r+ÖÒš¦”RJ)¥”RJÿ°©¤†FVÐFëÙÀ&¶ð4{x•·ù�#œ ŸAF(1Í¯‹Ü4%F¤ŸáCÞæUöð4[ØÄÖÓA+h¤kaMRJ)¥”RJ)¥ÿ±rª¨¥�&VÒÆ}tÒÍÃ<Êf¶²�çx‘Wx�¼Ã!Þç>ã½|Mß1À÷œæCs–á8vŽ³3ÄNó=|G_ÓË1>ãÞçïp€×y…yŽíle3�ò0Ýtrm¬¤‰j©¢¼�RJ)¥”RJ)-ònb)Õ,£Žz¸�&š¹‹»i¥�5tp? “ut±žéæ!pìëéb�¸÷¢ƒ5´ÓÊÝÜE3MÜNõÔ±Œj–æõû”RJ)ýÆ     ù¿6‚ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÂ     ù¿6‚ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÂ     ù¿6‚ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÂ     ù¿6‚ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªÒ    úÿÚ                        ¸âq“pq>_É    IEND®B`‚‰PNG

   IHDR   €   €   Ã>aË  ®IDATxÚì�	°^CÇß‚XC$±†X‚Ø‚`ì;Å0b¡()ó¢P±%b7EŒR•Q¦F�H”A� –Qˆ!ö%±oEH"–ˆÈÝæü^õyÕuïý¾ï½÷õ}ß’ÛU]÷[îí>çÿ?½ŸîÛ�‡<ä!yÈCò�‡<ä!u%6[±©ÝOr¯ý,iå¡VÈNtPÃ)§œÒ0dÈ�†M6Ù¤¹gÏž+¯³Î:Ýˆ|æ7þãî-r£¨2Ò•ˆ•VZ©AÃj«­¶º|ï¿òÊ+µÊ*«œ-ñù<A~›ÖÜÜ<£©©é�ÆÆÆ÷åÖ¹D>óÿq÷òÏ’i‘&iÇòjÌ�¡2¤kPBzKü³ö!lªú©ü¼Lb$141ê`´Ÿ[Fš¤MäEžq9rcÈ.4Ùmø;ìÐ ¥µ¿�0\H™&?-PÒ4
QÑf›mJuîŸzê©ÞÈ‘#½[n¹Å¿ûî»ýxÀôÑGƒ'žx¢5ò™ßø�{¸—gx–4HËN›¼È“¼‘Y�)!oœß¨U®TÓÈçaÿ'_·H�Ö_ýð¨£Žò®¹æB?üðÃpÉ’%aE¡	Q{÷šZÓ -Ò$mò /;odA&dCF«™hÌ¡â×Xc%þOè�R/Tàås4`À ÿ’K.ñž~úé`Ñ¢EJvdÎ5‚Èó¼Dô}Ÿ˜úÏh±4Cò"OòFdQc@FdEfdrCè(ñÚÞˆ‡
˜�¨Ë•øÍ7ßÜ1b„?sæÌð�?þAz�˜ˆ%Büþ„ñÝÎ�™�Í2„åÈŽF§ÜJ‘/miQÀÛW®OkÉÃƒ>Ø›4iRðë¯¿¶‘^ˆp%ÒQÐ´
„²!#²"³ÖTè‚Nª_n1âd+h¢|÷(ER‚‚ãŽ;Î›1cFh­ºîÄ Úä±2#;: :¡:JÄÈóŽ¢5¤ë&%f¤ÄŸLUïyä‘þ+¯¼ÒVÚµÔ¹%Ý½1hm¤µ: :¡:¢+:[¬pÁnw•’ñª©îƒ�vÚÉ—¡™M¼–®¶X­Á–™mC@'tCGtEgtOö}ê?4É¬×F	¿Q2Ö\sMoôèÑÁo¿ý^TóD¥½²µ: _ÑÑ�ÑÀÂ`Ò´¢Tù½¥|D"¥ÞßgŸ}üwß}�(5¥ˆ¯YC@7¾£+:£;€˜(FõNþ@Qø#ÓzW^ye C©Vœ´ý´«ÓZ¶Ú�ágtFw0 0›z5‚f©ê¸+ÕÞbÞ`ƒ¼iÓ¦µ"£Õ½Z�['»YˆÀ ,ÀlÀ¬êÆîHàã9¢ Õ^¸ë®»úŸ|ò‰–úÐ.õuâµ_B° °#°3°«ò¹ŽÅZÛû£�>:øñÇ•|m}m÷´I °#°35‚Z/ùW(ùC‡–/_édŽƒ¶¾.ú:‰6`¤F vjµÚæ�TòÏ=÷Ü@{ùv•¿¢»IÐQXYF0²Öú*h‹’Î9çÆÒmòKM¯ÆWîÏ÷g¿NPz�"iÚ93ËZÛZ!ÿ/"¸G§æŒ3ÎH+ùÅ&Mô{Áûªa¸_n¶F1��;½& ;0K0­v#Ðvj€üÃ™–-[†rEÉW õûÒ¥K£7Þx#zè¡‡¢qãÆE&LˆüñˆÞ²�N&ŒŠÊ�®ï¼óN4eÊ”H¼‹¢ñãÇG�=öX4wî\È/)·�.˜‘‚%˜‚­b]�sû„"è[Œ£Ä?ü ÓºE•URß{ï½høðáÑV[mÅÄHÂOO¦K£=÷Ü33fL$N<³ËÉ'`˜£F�Š¶Ûn;V0rwëÖ-8p ÓÀÑ·ß~Û&w‘B¡i‡`–¤¶`¬˜WÝZ¾�6A{õêåQJ‘¯ÿýôÓOÑ…^­ºêª6p…0„TcèÓ§%¬K�À&_k*q‹Äë§Ýr÷îÝ;;v¬~»Œ ,Á”çÁX}
ª­Ýÿ»YÑóï»ï¾PÇù¥Èÿì³Ï(
VÎ•ï©Q�Õ{ZZZ"3´´� sò¿ûî»èÀ´åF®¢rÛº�|òÉ8��TQ#Ðy0[žkÅ¾ZÚýíE¹…(vþùçFð°XG‡ðùçŸGýúõ‹ŒóGñ%åói§�f·�ÄLÉÿþûï1ÚNÉÍ½ÚLˆƒiôûï¿ìÌêo`Éw°å9°óŠ÷%ˆk4nNÓå+ x¿üò²ìôéwCöÛo?‘k§¢>{õÕWÛÍ1“u~Â1ÇãLîóÎ;/i¼é†‚-ó˜ƒ=T²êG€¡F ÿÅ_,Zõµê¿þúë@KqÙQÀÀûF�À¹¨NwÞy§+¹µÉÀY$.wÁ¦ ŒÁšçÀ^¹¨T¯#æK¹Ò‰Ô‘£P	ÔZ�žð†n¨Ub¹@*Ì¥gÒh:”À­·ÞZåvf p€æS´)PÇ°æ9°‡å¤ËÛ~Qà¹ÐŽ{:äSð‹•¢Ûn»Íeé·kÆájÎKÿÄ‰mâœF)ÙZ”C›°sžƒƒ®î4šª€dŽ;“…ªþÔöÿðÃw¤ÓÍ7ß¬U¦“Àn¶d÷°æå\nÙd—»hS æ<p¡ÜtYéÁÇ#ÀÞ{ïíéÌ•ErÁêŸeÏ�6ÚH«Qç@ÊönÍÏ•è,=ÎåÖBpè¡‡–œÚÖÿtfìy.”›.!_ (ñ2ä‘GìÒ_Ò >øàƒÈl¶$º’‘…SÏ"»ßÒ£Gç im»í¶ŒŒl¹KÖ`Ï³p']aMfããLçÅC�R¥ßnÛ^{í5ÈÊÌ vÞygòrn Ÿ~ú©=ãçÜ 6ÝtS&†l¹KÖ|…ž‡“¬ Ñtü6¡“©l©ÖÒß^ é¤!lVÀZà87€¯¿þ:êÞ½{fÀú‡=)T*h- <'p“e_ Ù´ýW�¡ì‡÷D`{Gn»€œ?~´îºëfÖ<xp&} Ù&ÉæÏÌú â&Þî¦ËÂ;„¸ ¸Ér^€ª¿›dò™Ýxã��å××‘õsJif£€«®ºÊù(@Ó4hPf£€aÃ†uhËö'„Ò€8Ê²ç¤\¨
CYÄ	uÜßA�£Ë.»Ì9�_xáÒù<À­·Þªr;o~øa»j·CÉy¸€Ò�#åÌ¹ÈDËÉä„Nðlò‰¥‚MÊÛo¿Í¹ójt¯½öÊÄSHÓüâ‹/ì‘€Ë ML‡äæÛà„´àÈµè)\ëÐ_ËGfÄ‚ŽV³¶À„3Ï<SEœÀƒ>è®úO_Ã`ÑIótVýßqÇ¶Ü��¥HŽàJ¹sÙùdéÈ…�éhÙðå—_F}ûö-L5 “N:Éù:€�>9ÆÎ¿l¹9ä{h×i<ánH®\v›Mõ‰sèAÚ~BAg�gŸ}7/-�—)ÖèãÎÎÈ×R6{öl
€Vßzí´Ü[l±1eÉm7pCºpåt4 í._sLuåÇª«²Œ §Éµ×^[� Tm¿�õqjM3+ò™Àâ$²4ò¹¶Wn¢Žûq-[n»€Ò†+8sÙþoÍQhÿÖ[o…êëW&¸ª8iF{ì±GªÇ�pý¬³Îbm!sòñPfùZå²É_k­µ(Ñí–›xâ‰'âRæLnõ„òƒ+8S]TÿCðm¶Ù&`âAvµo^[îºë®h÷Ýw/Ö0‹GË§ZufYícœ	òU¾þýûG}ôC8fŠvhqxetúôéir;ÁnàˆüàL9,Û dñæ&ãÈ¨í¿S°ÕEZ�ýõ×©Î¢.¸€Í­#†Ë/¿œž.m¦>Ÿ9ùL[o¼ñÆ©äãb·ßDîÇcèâ‹/n“wq¼—çÍ›Ç­Ž�6Ù€#äƒ3åÐÅàt½á†ìö?‹�²ö÷ölÈÈŒü÷ß?’ÄSÉÇ‘Õlo×mkäv3YGÈh8+?pJ¶´aŸ‘èÔ©SuüŸõ±k…NóÄL T½tÉšÕ9%]¯Úsÿøã�õþË­ÑuPYà9áîÊí Òþ÷“ËR¹²s'TKÎ8´ï”O÷äÓ3ç�éBäÓæÇÉ/)71ë œÀ\ÁÜ)—åLÿòö:Bb`@�‡$ù´Ó¬ø¥‘�Q`	ò«%('pWÈwÊe9À!$Æ&’‰Ž êŽ|ªõ-·Ü2•|š91¼jÉ·å�#¸Bn¸S.Ë1€Ì.ÏZû¯'òéÐÑ±SÒíŽA:„UL~ÒG ®�î\À?Íö+´×3üê…|\½˜•K#Ÿ! gúÅÉ¯ZÐ	!¸B~¸+Ç šŒü[.œXáY õ@>{™ÜJ#Ïe&�j€ü¤ƒ\¡Ü)—åtÙò�Gkê5i É5Öö™ÉK#Ÿ/Ó¿µA~ºÃ�.
MP.ËN"±k¯½Ö6€š&ÿ«¯¾Â	#�|°ŒæÌ™SCä' ®Ðî”ËràA¹°™Ó6€Z%ï^ZÓÈgµ�%ß#?i p…>pçÂ &×¦$Éÿæ›oðH%ŸuþY³f¹%¿ò0Ù…L”G¡ØPsä³³g—]vI#ŸãW¢—_~¹FÉO \¡Ü)—åŒî"±‹.ºÈ6€Z"Ÿµw&²RÉg�ÂK/½TÃä' ®Ðî\Ìâ^„ó…=P+äã+‡�AùxøâF^ãä'çà
ýàÎÅDÐUÆ‹Åö¨	òÙGÏ&”4òå¥ÑÑsÏ=Wä'}à
áÎ…´�¯Q%qÍ¬ÚÉ_°`^:©ä³Ç‡T«I«iòcœ„p…žpW®Ð	lÜŸ8õS ªÉ_¸pa´ï¾û¦’�ßSO=UWäÛÀ\¡+Ü)—ålßM.�”†Qº\µäã$ºÿþû§‘Ï‹©¢'Ÿ|²îÈ·9�#¸‚3¸+w&�&`}¹,’È)\�‚]y‡�$ù‹/æðF%_½wÛœI9o˜àþE•wQà}áîÊö–	’f)AoÊGm¶}+é–vÜ,»lRÉ_}õÕÙà€|'r3Â:ÃÜÁ¡·°{ÍQp^59…*ù?ÿüstØa‡¥‘�;6ÇØdI>éV�S(¡7œ¹Ü0’Dy)²:…TÚ-œûõì¾#Ž8¢ù9ï’|•;îÞ]q·p"áÝáL9tq&Ð!f¾œ3êì�¡•ØÂ��ÌÞ±‚óôSÉç ªÉ“'gF>rkÉ“7†3ê¨ÈÆ{ƒ(ÜÀùÁ™rè¢	è%—ùQ °f+µ5CÀ™CI�“)YUûÈ­~„ô;:"·îdv¶5Ìž„Ò‡+8s¹E#˜jC|2«ðæP5q¥Þ{ï½Y“OÄò±ÊS›CC¸!mÃ•³ ý€‹äBíYÞÁÄJm‡ôÀ÷ÜsOÖäÓGaIó¬Øöp8�Ò…+åÎåù@;ËÅ“+3ºC¸ÒDØ‘!�cò“@3×°ãŽ;*ù? B«81òxpåüœ õÖ[¯Q„~¡¯»î:ŸL«äˆ�¼‡WÀ5ù
4½z%¿šŽˆ	á„´à®29#Pe6‰xæèòj:$Š•¿¬‰¢ê¯ªC¢p'¤GÊY§„nËž3‰´ßÚäÇÄUè˜8­þá‚4àŽâ½×§…=j6Šø–óƒ"³>(2½Y
á‚4à&ó£b…´Áfe-��²zXd~Tl«Îp &­Øòo6ÇÅæ�á¥—^jw‰ùaÑÍvçxN Ææ*Ë£‡?z_€ÑZ ZŽ‹œº>.^K?ØÃÏÃ‰rÔ¯‹ë.Î5µ€}htþÂˆ,_‘,ýÏÂ…¤³V¶¬'ûg·jßêä¯Œéœá²œm“Ü®¶_ÒçY¸¨ÄëãVÐßD€¡C‡úÖ+ãò—Fu\n&˜âr}u˜óÀE¥^y¼Q$ë0ö²èüµqN^—|™4Xƒ9ÏÁAÅ^)@Ð!œfŽj÷L–¿82£GòŒÁšçÀà¢’/Žæý�¿˜-äú!Œ u¬£WÇÁ”¯`Ì3`ö}œ¼FîãˆáÏœ9S� y´£—Gk¯lÁ˜çÀ¼Òäh¸4Êõ93÷èéÇÞ ž¿>¾#¯�Oæ‚)ØòœÁºì«!¨n'-@ÀÓO?=ÐU*‹ü´€©à¨·OQâ‰zOKK/s°Ôk–F€K{l¹‘«˜Ü¶nœ»Ü6ñS  Ø½~0Õ1ÿ°¶°¯Š ¦8Ä€àßtÓM¡©¾ÂXšæÓ�;3Ž“ñÒp©ÀöéÓo[M'�üÌ�`éÒ¥ìÅg†°ÝrsÅØ±cIƒ˜F~¼Ý�ÀLMz%Ïþ«tàFcñž,q¶u
-åâ`ÚÇœFÃ‡g^<<ÜÇ˜ë3fL´hÑ¢® ¿”�¿ž3È8ž‰¢Ô~¾Ôr£G�f¤r$Ÿ �>0KÒ[ëêf-¢IÂ³Û£gë‹n˜ dqJ>ýãÆ�ÃÕ‹m] mƒæ€|7F`Ï21eÊÞ¨N…Ó+ÎŸZLn®‰NØ�!XL›À¸šƒŽG×�ç˜Ã=Jv	#P`ˆö=…vâ8ðüq·£IACÇäN'ÌÀÁLÝ®õgß)ì+–yrÅùÓã¬ÝT#(½ÏŽ¨U¦»Îž{CPc@^;‘;�|°3°C°ŒWýµbÛˆ_¨P=jŸ 
H¬*ãÑ6Œ”|°ÃÚ"?92è/Š|naôfÌ˜‘AòÁŒÀ
ÌÀ.Þã¯U#è'íØ<s<‹wÿý÷‡:Ooë;$7—ê8LÀŒÀ
Ìâä×ºôÅf™‰OüØuh&{Åõ_êÑY«@° °#°ªò“}‚î¢à$�,’7]L«j“«ê¶Ôk•�î` “<`FfušdÅ®ÑLýCÚ8¬>”ýqþ3Ï<£[ÎãµAÝ•zÝW‰Îè`&`FJ~=†F	Mø<HÿÎtx<9"à¤õ,ŠBÍ¯ž<èˆ®èŒî` `6Æù5×/xÌ4	�ì÷÷eÍîÄgÍjŽx»­G7tDWtF÷X{¿B…&™Û×já,c�™;÷eŽ/SÁi†`\�¤§�.è„nèˆ®èlÞË¨íý
ìö®�T‡ãß, ørÎŽ¯ï*L:PnNÜrï(bË¦Ä#;: ‹!ÞGG«Ô7µb�‡†&œˆR2�ëf¸J		x	’çš µBÂº($HG[6dEfdGtA'tS=[ÉÏCÁÚ€Žâ1câH{Êâ€áÉ
[ GÁÂ6Xs�aGç?Ú†§5dB6dÔ²£º S^êK…$@+	xƒd	ô)ù¼\�A¦Kñ‹÷äü?Û”®ñE$­)Úõ~%;~â!RÒ‘Y�IIGVdFvtPÏK}'Aœ µJØM@ý—\¿QC0ûƒã�?Þ»ýöÛ}ÙwŠ›•mÅ–pí¨ÿuÉ&mò /ò$o[dCFd5ÇìæÄ;Í¶¤\{È'É„ÉýÒ¦Î·Às†•´€7gŽ1Â§ÿùçŸoÝÆ.D¡øjñm»ÚŸ	ÜÃ½<Ã³¤AZ¤IÚäA^J:2 2!›í(Û*{œÖêv¦H½$Í›1ôWå§%¶Aègé…SS„Ûo¿} ïðekš/›H¼c�=¶5ò™ßø�{¸—gx6%½%äEžä�*“Ê™—ølƒ–,®BTƒì2jèÙ³'‡Xm&ñ¯BÎ•R*ï“Ò:[na¦mÚD¦ÅØ=Ëx–4H‹4I›<È‹<ÉÛ–)ïÜUÈâ%N–UÿßÎÛ Ã@PÎLÁ‘	èi)Ÿ¿" ;é¤(‰Ý¼Ó†¡à§óJHSœã’{\ã÷xDdÍg�»ÔPKzÑóB3ô÷ÖÓ}ü›Ž;¼±Å2lù'	>o„ÿ Å%    IEND®B`‚‰PNG

   IHDR         óÿa  =IDATxÚe“»‹ZQÆ‚DHH‘ÅZ…�¤Ý`£��Š °²"i|"h¡ˆ•…�BP+­TTÝFÄI,[dEH%æzOæ;{ÎBÈÀ\3ßoîÌ¹s™Ùlf0Î9‡ÃÚáp`^¯—™L&„ßÁqF9h …�(üææFc/öÑçóÅ›Íæã`0ø	o4�ˆ!G.´Š•“É¤–Íf™Ýn¿�N§¿9™ñb\º�r6›í6“É,‹ÇãZ0dV«õËf³á“ÉäZ­V/dúUÚù|ÖËåòe6›]¡�X¦Ú&ðy4a8�œ§R)ƒKK$bÈQ|<?ƒd½^Ç_!lµZ)4"‘WD¹v»}ÁD`ÀŠ‹¨Õj9·žËåŒh4ÊO§“€—Ë%w:�œnŸ‹Et¥#.{Ûï÷pdtýŠê4¶€·Û-§çëõšÃ‡g0`E�^¯÷]Pðn·ðjµz…Q\ VŒP©TÔù|ó‹¶çó¹€�Ç#G¬P(¼Ž ÆJ¥óx<÷ô†.1
qe8«Kìt:ê‚ƒ«ìÃp8|’Ÿñ„éto‹Å ‹>#mç€b·].³X,Ÿ‹…Aû`Ðÿ·HÔ2É€Z0`™Ãá`Ô¢æ÷ûQäUÿ%;¿ªUÆä Á
Ó&j`Ù~¿gô¹í¸ZË÷n·ûŽÖù¡Ûí~ƒãLo¼CŽ\hÁ€Åo«þHTÅï,ÎÒÞH1ä Qz°û«](ÙÕe‰    IEND®B`‚‰PNG

   IHDR         àw=ø  	IDATxÚ�•Û+m[ÇÇ²Ör9å…„ívè�\ò çAl	‰:
/¶òpäRça‘„”Þ<*—âå’\RÞÎ¡ó€Âƒügk.sœñÍ±3eïs¾5š£ßïûûŒ1ÇsLñ^ñññ¦ëéììôI)íææFÑ7q<xMíµ¶¶&VVVDYYYX ð$''‹ÈÈH¿J¥¦¦vTTThô‰‘Ãƒ—ja|(3£ÜÜ\¯Š)((LNN^ïííÉËËKûááA7úÄÈáÁKµ†ãRII‰¨®®~¯¼¹¾¾–J¯¶mÓ,ÕÒè#‡/5fX0µ"""Dll¬(//÷ªWg[C�XHÉ~}}µ�èS–¼ÔP›––¦Y0a‹¥¥%‘——æÌü×……… lµ–¡ÖÖV933c???c@ÝÐãã£=55e···ËÍÍÍéùùù @0a‹ððpáè'õªSLÛâóùlžýýýY–%ÕÌ%êêê’ä¼^¯öìïïëX 5»¥¥Å[UUÅˆœŸŸã	öööRlÇÄÄhHNNŽ›ÙKµœ:‡ïÀÀ€®…&la466væÔ‡æææô¬Ô4¤©©I"á-Pee¥Îùý~ý\^^¶±�ƒ%Þé—��±Ñèè¨ÌÌÌ”ÍÍÍòþþ^¢——‰vvvdFF†¬¯¯—ÙÙÙr||œ°Ùx	¦@ééé"11ñ·‹‹r–sZ\Ê3Jtpp £££%ß�y+ã¥,˜°E]]�(**ê½»»ÃÏùFz)x03?<<Ôk¾»»+ƒ¾õRLØ¢¶¶Vö|o  èèè¸^¤Ž.ƒw ˜°EJJŠHHHh>;;{¿D \ð­­-×ÌÏ÷K&l£Ÿ×××Co7yddDfeeq‚ô†ªïÛÌÑíí­lhhÐž‰‰	×&Ã‚éºä†††þR3pSskjj¾ÍÜñûð˜’‡e¸l²·¸¸X¨;ä÷ããcÍéééq}hEàFOOORù?üÐ`À‚	[¨O]8ò÷õõ;W…õöªPñÿº*8¾q° jvRR³7—]ñììì?Î:Zÿç²kkk“ÛÛÛN-@0aóÇqqq"??ßKÂãñ|VÆ¯Ê�ôu­fn›+›FŸ9<©¡,˜°~“ŒjÖ« »»ûäôôT:?³hô‰‘Ãƒ—
aÀ‚é’Z
1==ÍÉ,—_Ý˜_ÔÿöÏÕÕÕàÉÉ‰T/›FŸ9<fÍ©…ë#q½ŠŽŽ¡þ³aÃÃÃµ¢´´”Ô§¨¨¨zumwÒè#‡/5ÔÂø¡X7£ÆÆFßÕÕ•G}ÉBÝ?æ›Ñ}bäð¸kÝú•Ú°x•XÓK    IEND®B`‚‰PNG

   IHDR         \r¨f  %·IDATxÚì�_HTyÇS·ÌM‰Í"·%Ã¨,«ÝhÚ w1S²"-²—Œd70Y1!‚�"¢zèßî‚Vû0�FJ›…ØBÁÊ¦QRæºi%¦†•gÏ÷Ç}X†{gFÇgÆï¾ ãÌ½¿ß9ß{æÞ;÷ž;�B!„B!„B!„B!„B!„B!„B!„BH¸£ŠƒÌß„�ˆåSÕ<U†*Sµ]µ_õ“ê´ªJåVÕ«šTÍªÕ–Z¬×š¬÷¸­Ïœ¶–±ßZf¦µŽyf�„��ò™µæª*T¿ªU©þU«$ÈÆº¬u6Zc¨°Æ”aÆH	˜DÕrU�ê¤õíÜÈF¢âÐi�õ¤5öåf.„¯$¨V«öªjTíª!•D¸†¬¹ÔXs[mæJ™–¢ÊW�Sý©zè7}út™;w®,Z´HV­Z%.—Krrr¤  @vïÞ-ûöí“²²2)//—ÊÊJã5üïÁ{ñ|ËÀ²°L,{"
Â;ÌÕšs¾‰!SˆTU±ªVÕ3ž�hæÌ™²`ÁÙ°aƒÙ`�9"UUUrëÖ-yðà�<{öLÞ¼y#### X–…ebÙXÖ…ubÝÆ‚1�· ôX±(6±!$
™§*RÕ©úTâ¯déÒ¥²uëV³Ñ]»vMÚÚÚ¤¯¯OFGGe’Á0Œ	cÃ1VŒck1è³bTdbFH¯ÊTý¢êòw#HLL”5kÖHII‰ÔÔÔ˜k``@"ŒcÇ0Ì	sK1è²b—ibIH„ð…ªTÕªõÇìiiiRTT$ÕÕÕÒÑÑ!ïß¿—(sÂÜ0GÌsö·ŒZ±,5±%$LùJuFõ�?Æ^±b…9ñÖØØ(ýýý2ÅÀœ1wÄ ±ð· ¶gL¬		\ªßTƒ¾¼dÉ)--•¦¦&b@,Ä1ò§"æ&ö„L±ªlUƒêƒ7³&''ËŽ;¤¶¶Ö|ëŸ{ˆb†Øù*¬d›œ¾Uýîëø~åÊ•râÄ	yúô©�q�Ø!†ˆ¥?ç	~7¹!$H|­r«>x»'++KÜn7wñ'ö1Elc_{n“+B&ˆ4ÕYoÇøIII²sçNinnTcÄ1÷uŽà¬É!ã$IU¡êñ¶áïÙ³Ç\!GB
bŽØû*=È¡É%!c KuÏÉXñññ¸–~xä9ñVî™œâƒÏU?«FìŒ+yyyÒÒÒ"$¬@N�äÈ©Œ ·&Ç„ØP¨ú[%vZ·n�Ü¸qCHxƒ!WNyDŽM®	±HQ]r2LJJŠœ:uJ†††„DÈr†Üy+—x+2ÉQuØ$..Î[>yòDHD‚Ü!‡È¥Sè0 S²ÝÖq§cýŒŒ©«« —È©·sÇÙ¶lê�®ºít!Ï�¤··WHT�œ"·Þ.$ºm¼A¢š<Õs;,^¼X®_¿.$ªAŽ‘k§"ðÜx„DŸ¨;íòïÚµKººº„L	�käÜÛ!Áaã$«®Ø%{Îœ9ráÂ!Säp*WŒwHD“¦j¶K0ºÝÞ½{WÈ”€œŠ@3ï'ˆ\¾Q=¶K,Ú^÷ôô! ^€'ŠÀcã%QäªzíÎò£k-úÓâÑ³Þpú• ×xŠDEªA»ãýË—/!^€GœÎo‘°æ»3ý©©©rçÎ!ÄàxÆþxŒ„%?ª>z&ýè>|(„ŒxÞ±+�×HXQi×£/33S^¼x!„Œx²ïAÏ‘° B%žÚ´i“¼zõJ	x^²ó˜ñ™TÊì¾ù·mÛfMEÈ /ÁSö{ð ™öÚtèEÃHvä%ÁèLoÙw"†IHÙn÷,ýÂÂBB‚ ¼�Ù�wÆ“$$|§ê÷LB~~¾¼}ûV	"ð¼fWú�7IPùRÕíü�7ò±[$TÀkðœ]è6%AëÝ×æôõë×ËË—/…�ÏÁ{vE �½ƒÓÂë¦g°ÓÓÓ¥³³S™à=xÐ®Üd‹±‰#FuÎ3ÈóçÏÇC!Bþ›0n½xñ¢”——›B999æ™uÙÙÙ²eË)))Á-ÑžšÅiŽ·ïß¿/ÕÕÕrèÐ!ÓÄ#77ñ6»à›7o6O:zô¨yvà£G�B}£</Ú�sÆ»$`¾÷î¬Y³¤¡¡ABÁë×¯åêÕ«ævÑ…:v˜uj8âr¹äØ±cÒÞÞ.Ä¿3íõõõR\\,Ë–-“3føo<&líÚµrðàAimm•/Â“6cRï’€ïéøPcbbäüùólº»»Íí¡Vÿ¸€5{ölì1°	‰—kèÐc]°þcïÜc{Ê¶8žw<3—xuÃ½mÏD¸^Ñ‹ÉEõ
†xDQ"Uq›¹‚‘Æ„ÄõNäj<[Tƒ¦‰6c"hKIZ-Ó™qµîùî¿Î]9¿£ûüö:¿ýIÖŸÍÞgw}ûœ½×£iÓ¦ê-!''‡êëëI3ðIø&ŸÇ¶–€¾qìþ�MMMÕÞTbçÎ�Ô¥Kbc7˜cÎž=›>|HR;vŒ•ín8ƒ(Ç�Ä/|Ók¿(_¶D\Äó'¾˜cÆŒÑÚ¡çöíÛ4|øpŒ¥Ý:tè v¼>P¬RVVFÉÉÉ�¬7^Ñ7lØ 3J¾	õÿ'[d42Rù"ÆÇÇkíÒsøðajÓ¦Æ
ÔRRR¨¶¶–b�+W®P·nÝ_o´¼¼\k7"ø*Wù´å“àX-{mÖÚ˜333“7n˜ÆzÚ2Uq&­õîÙ³§Î$ø*|–�[«|ÛòQZzUñÝ´ié"===ZŽÈ»ÇÄ�ÀÁƒ©Y³fQ_oœñ”””�&à³žU†m|ÀÇÙÂmÔ¨Qôöí[Ò :ÈbcläÈ‘øs�¾¨‹Ÿwƒ*--%Àgá»|LåãOþ†Â‹üýþýûºîn™3šaóæÍS×VaãÁƒgÜz'%%éªßõ*0ú_åë–ÿ£¹c…üŸ“••¥+„A=ÃHÛ¿Øúõ³Û³lõêÕ¤	ø°×˜…Êç-@±†/ÒÄ‰éýû÷ÔÀàÚ�v0Ï°SâŠ,$ ÒèõF´a^^é >_æc*Ÿ·(þÊ›x´k×NÅuëàòåË^'þF~
„ üÙk°™6dÈ|·k[ø4o6¢|?ÆA²D6[Dâéêþ‚o>Œa¼á|¢¨¨ˆ„ƒ˜~<�ÓÙ8>í5fv¬'Màuý†¦­¬Wnn.Kæ1Ú2,}÷g÷ýfÛ AƒèÝ»wÚ’œàÛ¼ž`,·káX±{Aš4iBùùù¤	VÙÕ|kÕª•º¦’JFF†¨õÆæpíÚ5Ò|>ÎÇ-VZˆAóÀÂ…IÔ¶m[Œ#ÊvíÚ%6­·_¿~âÖ{Ñ¢E¤ø8Si!ÆhïX9/ðñìÙ3ÒÅ�0Ž4C&›Ä„!œ_°N»"ÁA:{JÀÇ½
ˆ”+MÄßó…ß¶médÎœ9" Ú·o¯jHcÇŽ"×7D7oÞ$�À×ù¸J1BgÇ*ÝŸ˜˜¨5¶®®NÔë(Ïg¿zõ*IcÚ´i˜?Ì~v1àëðy6n¥ÒF°•/ø¾}ûH'ÏŸ?g÷°²Õf$�“ô¾}ûŠ]o|§ë>ÏÇUÚ9]«v?tÿþýu·òB}8ü#ËP€TUUU(x"v½Ç�D«1ø>»Zi$Äd|Á¹téÆksçÎ%I<~ü:Å®÷À�IÈ‚ïó±•FBJÇ*Ü‹
®HÑÍ©S§Dÿ  üµ$îÝ»Ç2-Ejý#,8ˆ$)h€�_¡´BÒøB£Wœ8qBô úÓKâÎ�;¬"Ž(C9ò šÌB^sHc¥ŸŸÝÙ«W¯Àšyž={Vò 
gŠËýoÞ¼¹ØõîÝ»wPF h�Ïáç°UJæ‹Œj<AqýúuV³]–¡Û� ì‚0f±ë�f. «2Ur˜J|ç¹®cÇŽê¤8 Ð•GòŽ„ÖWÒš|°Š¿¢1Aßš@|ya)%>È±:÷Ã­\¹’‚�]»vë�8ÃB—±‹Š]ïõë×SÀ@|uJ;!à÷ƒa'¾{÷nà9zôh‘ÎˆÃ4œªKcÅŠö7 	þ–ª´#œ¶üêÝt!È€AW‘Îˆö¸.’ÆÉ“'%®7Î.¢RŽš€6ø• Ò�`fò>}ú4Eƒ‚‚‘Ñ€K–,!MØðkïÒìQ«Êmðù(	æ¬ëAp0„ïñhå§ãzG\"ÐÅ‹I*S§N÷°{÷nŠÐ?<UÊ·Žýê~˜´´4[�6²ûh�y6“ÞXP8&Š@#|^¿*-	$ÕGžµî×R$©ØÝ(¸~ HÃ¶Ÿ[ �@+Ò‹~Áïþ â«£®x8#«‘ » ˜Ã?Ä‹DhZá1ÒªÿÅ±ßÜ±qãF2�ÊÊJÖÈL;rä	…×ÀÁšñë½víZ2h…Ïï7¥)A,u? jÃÝºu‹€%`˜i&L`]‘Dƒj¸FßÀ ¿¦¦†LZáõ•¦ñ^ô¯6†€ktÞ1Ò;wî,¸¸wXðäÉ“�ÍÅhÑ¢…ú�2	h…QšÂ×ŽUñæ‹¦ñúõkôä7®PNN…T×�4i’-»îh†ÍµJiK ÿpO¼Q£FªŸ‰<zôˆ�©F»wï�$žæjz DfjÉuhÚas†¶Ìç_®	ãÀÍäÓlôpGˆ¨w§Ý³gO˜v~ÓÅ�ä£ÏY ~X­´e8r¬È=i8‚é<yò„†GDï¼C‡QH@àÒiM®û�ôj©‘”EJcÓÍ±ß]³³áL`Á‚�:#Jg#GA2<ÜzæÌ™ÆŠ¿S§N”��MB€vø3ü®4f0Sø«mqq1Iâøñã”�� Ó‘ö‰WP~õ$=êÝŒ#]\wáL{ÓÏéÓ§«jÅ‚€v !ö<Ð˜¹ìpO¶{÷îê{PÕÕÕ´yófìêˆè;eÊÖ÷?;ÿ¬Y³"^r¡®
³²²´üŒ1‚ÎŸ?/õ,bÏ�™I#Ç
Ü“…³¹èã†:ñŸÕè2>>Ÿ<*,‘~è[àKüÛ·oç_ªcNRRÞ’>+©…TÏ�;§Š{
âÏW ´f qüþëÖ­$Þ[°°°Ïƒ{mµSµnÝÚ3º­eË–æÁÎ£^óÏœ9C/_¾$FñÏŸ?ß�øY3XïÞøž1cõéÓ­Ýñåù9GƒFko„P³.Ó²�Ïñx ¥5âX½;—=77—Âî¸ËËËUË±¼¼<ºpá‚º·½qã†J(yõê…ì¬~M‘–qdÞÆJJJÐ(ë�nO8@Å5.Šjª+½ñ(Êz¥5ùÎ5IµC>}ú”,¡?v[ßŽ-Ÿ4-±u„ÖÌ#‹ÇÿãÑ.°Ó.]ºÔ—ø·lÙB–ˆ?³¼ò²L< ÌwOWB–ð‰Ù²e¾ÄŸ‘‘A_x]¯æ›vøgÇÊÜ“ÌÌÌ$‹lxejjª/ñ£"³Å7Ð_Ó2¥9ƒHpì�{’(m	H˜Yµj•¿9%Öß(ÍÄßy¼5NÈ-áØù×¬YãKüëÖ­#Ëç-ñ+g¥9ƒXÀ1^¼xAñ;?Jeù?~4ð÷–ÏZâ=”æâŸîÉõèÑCÅ†[DƒÜ�øñ¹`Åß°yÐ[ghÎþížÜØ±cÉ"¦ô�g�ÏKƒM±µ†æÌá²{r)))d‘Kzzº/ñ/_¾\]ZhŠ­74g_:VÌK€[D‚,H_âG| "-�½‘+íÀWŽ•òB‹q L×—ø/^lÅ¯hŠ¯{©Òž|ãX�{rG�%‹¸`?¥»‘`Å¯hŠ¯}�Òž$ò  t´µˆJ9õ%~¤#Uúì�YhI†™TÄ%
n	c\³9Å¸0>L$Îh„Éƒcp�ƒGÜÔ3Š>hŒâ‚IÜŒk"*.D£÷@¢¸$5ý×Ss¸à½×ÜîszÎçQouUýé®ªSÿQb4E“�¬ö0Ú‰�îkÀ(p¨ˆ ÷ò£ÿœ9sô²—w@Stœ>Zí1 ‹z¼ÕÕÕ…?ëÖ­#Þóá€pG_ñhŠºRYí1à'w£ºtébn(¼Y¿~=Ì2#?¼ÿTüÞMA[d< =ÿùÙÝ(X7Á’IáËÆ�£?,¿a ªx4m‘1�öü§ÀÝ¨¾}ûÚÜ
O¶lÙ�øáÍ§éÝþMA[d\ =ÿù�V·…­¶ÂXoGS¦•~Tü¬ê¡-26ÐžïRl¼Px±}ûö¨¬ÍQž
þôŠ¯@SÐŸBvf ýû÷·e¶6ÀkŸT˜	+àI¯âg4mQsP–_ °ÅVxPRR�øQÿ@ÅÏh*ä€î( $»ví"Å4Â‹¼¼<[®KÑ=€ˆOúõë§§ @ÉñN�:E,þiÓ¦©øyž@[,O~¡y ���FñõâHTâÏÍÍµõùv@SÐËJÁ¹îFuíÚÕ–aV|+oUaM8Î¼yóÆ(,�¦ -2nÐžÿdÓ» (ì¨xOii©éÜ¹sÄâÏÉÉÑ�[æ@Sô×j�cœøä¾ˆ2ØŠ·”••¡2qÄâŸ2eŠæmðš¢·?Yí1 •ú R®â‡"EÂ
Ôá×!@SÔÀj�ñN¼r7nß¾}Fñ†#GŽ�µax1yòd[V[4EÇð•Õº;Ñàn.œ(±çØ±c¦[·n‹?33Ó<{öÌ(b€¦è86Xí1 ƒµîÆ­\¹Ò(±åøñã¦{÷î‹âÄ‰*~y@St,k­ö˜PI½â”ØqòäI±øÇ�§%ÛdM‘ñ„æø°‡&”(±áÔ©S¦G�‹?##Ã<}úÔ("�¦È˜Bs|øËÝ¸áÃ‡«mT¨¨¨0={öŒFüêÒ$h	š"ã
Íñáwwãz÷î­ëÌvæôéÓ$4¼5j”yüø±QÄ-ASdl¡9>Lu7×Okkk�Ò>œ={–”‡/FŽi=zdÙ@KôJ·Õ#ÒœxçnàáÃ‡�òõœ;wŽüõ/ÒÓÓM}}½QÄ-Ññ}g5Çˆ8'ž¸¹víZ£|/^4}úô‰XüX/>|øÐ(� Z¢cüÄjŽß:QM+Ç(ÑSUUEî‡Ã†3÷ïß7J`€–è8W[Í1c§»‘cÇŽÕ¢‘QréÒ¥¨ÄŸššjîÝ»g”À AKd¬¡5~üAŒA4é$
._¾lTü
°¢§?VkÉr¢D æ6°”ð¹zõ*1~/†jîÜ¹c”@nÓú�mVkIpâ¥{bnØ°Á‘––ÓÐÐ`[YY‰Ô\\×´ëö»wïFe®qíÚ5bû^<ØÜºu+ð‰0Èb¼qã†9sæúÛfD^¸pÏno5~þüÙhˆŽùK«5†|ïD­%P¿¦¦uô­]vJJ
rñCVÙ�)Ü[qÝvÉ’%öçùóç_<ç0`@Äâ2dH`Ý—ð\[·nµ%ÉFŒ�Ïà�Ç°?ÃIÉøñãÍ‚ÌÞ½{ƒ”õÑg®±ZcÊ?®†B(¢KJá­ƒúùcÆŒ‰¸ª­•0wîÜ�NI7oÞ4ƒŠøÿ8p ý·†¤(b£âkY ijÖ¬Y¸1)y#Ú�†ÈóAc|ùÕÝX8ÓÞ¾}[¤ûªU«ÈfÜ×Þ`¨¶ƒ�>€¾Á[<ÒÿK…ë×¯iI…º…d²·Odee™'N‰`~Pwg«1Æ¤8ÑânðÎ�;Å¹ê&%%µûD¤Ÿ­óçÏ�jÂ'&&bï!P›\&Lˆe£2–ÒÜª¡ú,-Vc<	mRPP ¥ö>ÓÑf¶�¥6ƒÀ‡`rAÞp±|Ñíß¿ßÚ	mÂœ­ôˆª¹¹Ùp9ó“&Mb-þøøx»P`æÌ™¾ô#6nW¯^m˜Í@;¤ýÐòi‡#§�)8F"ŸâüY�ÕÕÕ�©q7uêT¿û'4¬�¡zÊdµ%€œxínøŠ+G<x`’“’UüÞ-³P‡€Mß.]ºÔ´µµ†@3´½¯­¶ð�åÄ‹géÜ&#Ù|b¸Œ7APrÚq4Ç®�7mÚÄ1ïš¡m-·ÚB=þBZ[[Maa!kñ÷êÕËº äSpìg”Rc—²­Ð¤'«)AüHB�EÇ…={ö°?&%RŒƒÂ•+WHå"V�+Ô¬Ê£A+Ô ÄjJß9QEüèñÈ¡Î:ÎÒÙMBR`ÇUA9îCZ4ž‹u,[¶ŒËR	Z¡í«²šF1Çe@qq1ÚÃ>’““Q«÷îÝúEVp‘‹çç?´$�4'šUBn?ñ×ã›7o6@p.;ŒIÅô÷¢E‹8V j¶Z,‹*Ü“––ækRÐš5kØOBêí‡<y©<xPTãÆacc£ŸÉ?ÐmW…Õ’Pæ¹õÍËËË�¼ÿžWà´¿¤2cÆ<B¿ºÂ c�1'm‚†ÄïÄ÷áR†À<Â�Y¥Ÿ¥,·H-‘��m�‰} Ú íya5$œÝ…rÖÈÀóšåË—‹™„dÙ$ÒSáÀ�û›�¾S�&h©w«� �íD«Ÿ©ÁH÷ÌÉÉ9!;vì(ÒõgñâÅh¿È(--å�úÛjµ :«08àxyÄ…ß‚å–NHïþàÂˆCjã¨Øk'¤P®P5V;aíä’’ã8ß%S²×W%ÑÔÔD&´¬ÈÏÏ7^-Ð6XÍˆ8'ê]Ÿ=ÏJˆŸ?žì®ÊŠ…AÀ”ki©ý�¯/�¡Ú†z«™€ñ'9âò¬€èÑ£Gñ›úFòÔ(�üÅ…ãbÏn¯Bôådµ@É‘ Ü_½¸€5´è? yyyFuuuØ¼”Úß0ˆAÞˆ'yÿÐ õý·Z	(›ñ�®êAx;kFÚbúôéÒ<ý‰×Ÿ¨@™5/–§˜û´ê�±	0)N4¹833ÓÞ‹!¨"#úÀìÙ³� à¾K®ÿŠ
¬Éc�„9�¹O»Éj$àl§{eee±®¹G² eEQQ‘Ju‘KW²"77×ÄÌùkh#ø$9ñÖýàÈvÓ´ÔÐa¶mÛ&Î ==]j£fCÌoIŽ=šþî[«�ÿ	ÓNß±cG,=ÖD]K¥_H(ˆ)œ\0è?ž>�˜ëô7­&þGüÇÞÙ…V•]qœ6MÇÖ–¤Xµ¢A|Q:µÕŠ>XüS‘ú Òh¬PŒ¨´¥¨ÕhE§ !1’A©J¬Á¨Z�ƒÑø eLmƒ3„h	MRâ¨4qÚ±¶ìîßê}˜nö=Ü˜»oÎ¹wýà!¹9ký÷½çž³÷ZS¬ú�.·AË2­[·.‘f¤6`__ŸI555‰Œ7_éá<Ž×ÝýöË˜(0~íûöí&‰4ä’%KdjmÂ ÿ¡ÓP5¢Wãàà 	÷ì—±Px”Zu~.Ü9Õô’B|ÐËÑÜÕ_Hä×.ZŒoûžŽtÊX(PÖ¹	X¶lY¨Ž-´£JÜÒÔ®®.“TöîÝ›¤xÓD4T‰p<�·=ûe.ÅVÍîM¯Ó§O›\¿~�$'Æ�&ÉÜ¿ßYãkÑŒ#Ôœ<í{ì×,c Àù®Õ Û»§§'äÔËØ‹™t|�N:7nLÌÀ™3gL ð²¯ý x_Þu“±~ýz‚æææDL
¢sQ>ÀU@iiiÜãM-þ`Óñ²»?ñ¼B©U‡ó}ŒE<!ŠU8}×ã§ñãÇ‡(K¥Õ˜Ó¨¤¤$T'&<ìûÚÙ!žWþ�·­^}>P“'O6ÝÝÝ&Ë°ÍXw:qâ„É'˜ù6oÞ¼ØÆ›.ÁÀgxØÝß+ñºâå=79+W®òTàêÕ«|ÏŽå¥?Qòjpe·xsO(Ès<‹wÝý‰Ç•´|Ýê#7hõõõ&µµµ±+IM}¸|åÒ¥K¼éÆiÒO¨Ç¬xÖ·Ï�ÄãJ$¬>sŸ‡ß¾}Û„ ªª*fœ3gŽéíí5y½cñ&0eÊ”P½*ñª¯$Úgâm%#ö¹	›1c†töÁ�FôÉÀ‚dð
çÎ�c~ÀˆöZ¸{÷n°îÓxÕÝ§xZÉ˜7­nºA\µjU°Y‚���¦¬¬,çfä—ý…FKKËˆT^¸p¡yøða¨Ù~xÔ·ß›âieHL·êqƒÉ#¥P´µµåìn53Ž;&�%u:&œÆŒCw(š­æúqg�xYy-~hõÒyfK�¿ �¬>ÌwÄ`�~˜âÛÙÙi#œ={–Ëæ`õXQÉß€àI¼éîÿ¥xX{|mœ¹ÑÖàïÛ·�;ÅY1"ßyiþˆ3*Íš5+ko´‹/6—/_ýX/úWšâ]eØ”X]pƒ;}út™hšçÏŸËM«Õ«W3yhH‹‰˜K“	.éN¤d¶Œ¸©©‰5”çv>U£ÅR[ÊË±æž:�9 âEßñ\ï*YaœÕ_Ü Ï�;×<}úÔäŠgÏžñ	NI'
uÊ'zyy¹Y´h‘Yºt)?¤‹Ï¡C‡Ì•+WÄÊëóâÅYCêÔ)³k×.³víZz$o>Ý¥\ú†h�F‘MÖÈ‚¯\�÷ð ëK¼*žU²~S°ÛöòåËåÆŽ¢ä<‡÷|ƒ¿[oú…�$4à�O
*JÀkxÎ7øt²Ox~lõ/7ø•••òVQB‚Çðšë?<)ÞTrÂ«ÿ¸IØºu«ÜñU”à-<æú/Š'•œ²‹à»Ú¶m›^	(A>ùñ–ÏsâE%ç|ÁªÚ—�-[¶è›€’ÍÁ�§Òþjñ¢2"YNWÞ™OŠ2ð^òyï‰•…ÔúÄä���£(¯ÞÁCé­þøðE«_¢˜4ÂMExï¤ü5â9%V��ß¦ë÷ÞÑÑa%ð
žñy	�éà�7¿²ú·¯�A%<â_	Š§ð–’6ZýÓMâØ±cÍñãÇ�¢øÀxÄõ^O)‰âGVŸøÖ‡SšuÿŠxOxZw¡OÄKJ"ùžUGºÒP¬S
<€|Á;â!%Ñ|Ëª%]eØ‹/¥ !÷Q•ŸZÄ;J^0Öêw¾D›;vÈÚs¥0 ×äœÜû<�WÄ3JÞM®ô-'Fv¸sçŽQòrì/â!À#:µ7¿™kõqºº}”²TJ^ANÉmT?‚�ÅJA0ÑêLT¿8jÊ)ù¹$§éò�ÄJÁ}%ø™ÕLà›3°{÷n)
ª$rGýÏöEOð€^ò63­®aŸfÎœiÎŸ?/<”d@®È¹K—Wr.¹WË(«_Z=Og˜+VH…Z%Ö�#r5ðÉñ/$çŠâð–ÕûQuç7oÞ,-¥•XANÈ9ŠüïKŽ%‚/Y½cÕ•ÎHãÆ�“:õ�=2ÊˆBÈ9‰ø]äTr«(CxRPgõ�tÆš8q¢Ù³g�yüø±Qr
1'öä jà“»:½Ã¯‡ï[ý1ÂdfÒ¤IÒyöÁƒF	1&ÖÄ<*'äLr§(Yzd¸Âêƒ(Ó•••ÑÓNšE*Ù…˜[b•rD®ôÑž‚7RÍ>Œ2!-YaÖØØ¨ó†±#†Ä2ƒ&¡’É‘¢æËV?µjÇ|Qš6mšt«mkkÓ¹@Œˆ1#vÇhµ“É‰¢äLWaõ§LúÕÓ*¼®®N[…{ &Ä†«>1¯Ð�¯Ä�«·­þ`õ©cTï4c.kkkkM{{»´´.08gÎ�Ït]¯>%ÆÄZ{ï+qå;VÕžVæ^�=ÚÌž=›;Û¤”žóù
çÆ9r®œ3çžIŒˆ%1•Ø*JBø†ÕO¬®E\x«1••¥«·nÝ2ýýý&¡pìœçÂ9ù«ïDÚ_#†KEI03¬vXýÙêU”ñÝ¦&L0óçÏ—®´¦µµÕôõõÑ£>Nýò9&Ž�cäX9fŽÝSh3R¯ˆ±’˜)JžQœ*2ù«V§tyF***bÚ«4®X³f�©ªª2'Ož47nÜ0÷îÝ3½½½fpp0«ÍQÙÛdÛìƒ}±OöÍ1p,Ç6Ôó!Ä‚˜‰‘¢ ý-«Ÿ[5YýÍÊG£F�’�8uêTùŽ]^^.tÓ¦MfçÎ�fÿþý¦ººÚ9rÄÔ××›£G�"~æwü�×ðZþ‡ÿel‹m²möÁ¾†+Îµ‰s':èåóÕ—Y½kuÓ)T’t=áœ87ÎQçæ+
D3Éê©vTR5ëþž€ÁÎ1r¬8vÎAÎEQ”a1ÚjªÕÂTåÚ÷¬®[u¤º×¼Ìá g_ì³ƒcHK%ÇÆ1Ê±*Š’Þ´ú¦Õ·Sð�Ô]ô«ß[]J]~·ZÝMÚ¿¦ÖÈw#~æwü�×ðZþ‡ÿel‹m²möÁ¾Ø§ì[Q”DP”*ƒ5Æê+V_µúâg~Çßx�¼VQþÛ    úÿÚ                X•dºšˆ½u°    IEND®B`‚‰PNG

   IHDR           szzô  �IDATxÚ­—_HUIÇÏ=÷šQk%m!b¦n‚‘,PIXAI2¤‡é¡„|Ðõi}nÅÀó†.È®‹¨½X¢/Ë*õ Vš‚²»j (ëŠJ­÷zfç3Ü9½÷šµþ`î™3ó›ïgþþæ\ãsÌår¹óòò<faa¡‘––¦yÊ¨ÃÇ8j‹‹‹s777»êëë�‹/êb@_‘üyU‡¾´ùbàÙ³g�èèh#""ÂÌÊÊ2Ož<É;‚YQQQ?ŒVTTÌ×ÕÕ­�ÈSF>øÒ†¶h …æ¡L
©i®¬¬gÎœ1eqé�7Þ>}úTÌÍÍY?~´„4Ë²TÂ(£|iC[4ÐÒºÚ¥K—Œ””ãÄ‰zúâ¯\¹ò[__Ÿðù|»’³+�;òéÛ•F	£Ì_§ÊhC[4BmAíØ±c81íþmYYÙ?kkkÐë“öáÃK>5&ö%U‡¾´¡-h!ˆ6XÁv¸qêÔ)^[[û/³Œ�ðÎ`Éb<�yêÈúMuœw´t'`À
€‡……éÒ„òòò5¿˜o``@dgg[©©©Bn8±µµe�	[__ÕÕÕBNµÈÍÍµž?®4ÐBm °:!UÊÌÌ|±´´¤z?88(d•EµÛí<oÝº%0D÷w ??_8}%ÄUZh¢­9{Fþüy=õßõôôè©2À(¸\3%jš¦J333c©IØË—/ÔãñàCõ^RRBï”&Ú0 Á„m„‡‡Û£—Àq¹‰ªVNNŽ‘ó	, ÃÃÃÚÇîÏë×¯´84hÃÐ<ØüpÎ±Ì––œõ9·±GO>99YììììßxbccCÄÄÄè©·ý÷kò b_¾|ÙK°øarrR9K�ðÞ½{ö¨’’’ÄÄÄ„sØ�‘áWM{||¼ò•MÔÔÔ8;j¡LØÆôô´)§Ô¸víÚ £ÀÉÂ£[\\oÞ¼!ÚÙ‚N8£úäÉ�Y^^&kk ˆ6X0aÛëûöí)¿£Ïy¶õk1ý®á­­­Î©¦žvyžh“‡¥¹ÚÂªªªþPiAb#ïèèPðÇ�ëNÙ�°ÐæL›ÎKeeå¡: á���
þèÑ#'üP€sO *--�øÔx½^�uuu)xSS“Ç4;h	`ÙKðìÙ3woo/w÷¯„ÒP›pjjJ`ÝÝÝ
þàÁîôå¬¿~ý:ä&„&lCžkÏ¹sç¸	¿õêÕ'�!GíþýûAáccc"!!!è1Dm°`ÂæbÐ�(ýáÃ‡V¨@Dp!/Ï¯ØÞÞÞ0.)ùI†A(d ‚ lîfÖÂÅzÈlÄ‚†b-:>>ŠGFFtŠY´aÀ‚	Û�¢ú³+lkk³ïñP—‘ Ÿ{‘¼ííí ˜°•?~Üx÷î�ëýû÷†\ç_fggÕáu¼#¿Ú0`Át3¡¿¢$äOÿ:{ûûû¿øƒdhhHi …&Ú6+ˆ9oÆŒ»wïþÍ‘¢÷úX~Æ'™ú¡-h¡i3‚™Ç£N›Ò­OÅÍ›7ÿšŸŸW£�â^v2Á(ÔG)uøàKùoI ¡w=Ú0`…üC"ÿ\°'t'¾NLLü™£´¹¹Éˆà(qvµ3QF>øÒ†¶h „&Ú04ùQÁ_1ãôéÓfzzº^«Ü«W¯¾�qÁK°Y]]µœ!š<eÔáƒ/mhˆZh¢}c�ÔrÈÝì’.Ly–uÕ7r«222~*..þýÎ�;Ó$ò”Q‡Ž´¡-h¡ùþ+ºåî6ù',OƒQTTàCuøàKã(ÍnÍ.xÜ:z’ÈSF>øÖþD«Ó¦ëŠõ    IEND®B`‚‰PNG

   IHDR   0   0   Wù‡  <IDATxÚíšihUG€ï{‰Kb±.‰¸b‹Ü1îŠ¸€Eb¤(4úË…
)(i#¨!AÿY("�è×R(âVü-ˆŒ”×Ä$ïåNÏ7Í¹\soòÞÓ,z`¸÷Ý;sÎ73gfÎÌ}NKÄ¦ÿˆD#‘Hú”)SÒnÜ¸áœ={ÖÙ¿?ÉÞóŒwä!o�Ó>ÜB80íñãÇNii©3sæL–^’ú‘¸×‡ä!/e(‹tu· ?~¼#-ÊïLI¹’
¢Ñhé�!CnNš4©jêÔ©OIÜóŒwä!/e(‹tu[¯¤‰ôéÓÇAèk¹ü2fÌ˜ê¼¼<süøq÷Úµk®´®y÷î�ijj"Ù{žñŽ<ä¥eÑ�.t¢»K¤è×VúJZ¯lÉ’%ñS§N™×¯_»Æ˜×u›%Åä>Îï6)Î;òð›2”EºÐ‰bltæÀW‰îÞ½Û™7oð§iÓ¦5]¸pÁ Ò
Õ‹Å\R<w[ZZŒ<û(ñŒwšOÄ–EºÐ‰nl`›ØîÑn•žž^QPP -k�ð`Ã¤í{ÊPèB'º±�-µÝYðSüôüùóØn¦ñm®ÚÚ
˜Hüyi¿.tc[ØüÜJD~äÈ‘µwîÜÁnìÃ‡¸Æ´áá™‚%‚Wwò?³®‡nl`›ØV–Tý>¢n#­ñøÖ­[Vqcc#WkH&sùòeóàÁ…
©D8¼ºÒýû÷Í¥K—ÌíÛ·Mss³Í†laÛ0xLÉHVV–#
œÉ“'Së?Ïœ9óüÅ‹Í„	Œ¼³I¦A³nÝ:SSSã¶'ú®ªªÊ,[¶Ì“§GVisõêÕ�*�m`�	¶„"@ês?îÛ·Ïú<-ŽbZ\�ržÄoY°˜ïƒU+ü‹/Ì¸qã´ò$Ogß¾}Íõë×ý•h†eK´Hi7Mš>}z=J\¤•fÆŒ(c¦àê¥Þ½{Ûë¡C‡ÈÆ€T€gÈÞ½{ýe¼Ô«W/{]¾|¹Ž+W+Lc˜ddd8Ã†ÓÁòëéÓ§-3ŠÄ_<�´/^ì÷ó°é“žò—	¤˜gÏžÙbŒ`�	0as¯õ.\Ø¨sukK0ÐPÒafÏžÝ®iÏHì£.ªKB
óðáCí¯÷a‚MYÃz@ý«èÄ‰ÖžÎóÈË—/�d¡ÆµgˆqÚs!�6W¯^móŠ+„6ÂØ±cn£å`@%L°)k»Ã`Äˆ•Ož<±ž âúýw×®]ê¿ �ünE°¦-h}Ü!þQŸ§¬êÐ1PTTôQ#À L°ÁØÑ¢5mýúõº°XxM³Ñš5kB{áØ±c|ÛrZ¡W¯^á
�1 º6oÞlÂâ(Ð°Á¨Ìþ…KkõýáÃ‡=÷ñAø•ÙVÜ°aƒ�Ëóóó+§4þíÛ·&77×‚®\¹Ò\¹rÅlß¾�hÔlÚ´ÉÈ®M[<`SÝ6=f•Aƒé�ãD†¨ù…­¶�¸F‡Á/Z´ã ëzÌÔáï�l0zÌ*[·n�Î™3ÇÉÌÌü½²²ÒV Ð�P@[„¤ÁX‡-,ÐÀS	*£cÂ§ƒ€W�&Ø`„fGE^Ú”““ós0ö)Ô�ü<¬åëëëq3¿`Áàõ}˜ŽD!H6•70�e
û»®®Îfn_iâHihh0+V¬°ðóçÏg×€OQw6Û‹N£²O½Ï|ŸZ‚‘&³xÙa1û„Á§\Ø`Ô
´u!–éÛÕÕÕŸäB
Ï"¤‹ÕÜ¹sFÃáSw!Ø`¸ÐªU«8"ádàÂÝ»wu»Éb€ÄMk×®µð³fÍ2µµµaðú,•AìÂŒ°Âì¨ôïß_§¤æã$§ÑÀJË¾ x¢VÂæx®�•:Ùi6•9l!Ë+,,Lz![ºt©Ù±c‡ô6nÜˆrNÌóçÏ.lfÛ¶mèHz!ƒFe%¾”®‰k·!I„˜*³3…W8äàÁƒäO6”pÕ�aƒÐö2+ÜMö¹0$Ìi@ÇPÝ)Ìç‘sçÎi,”J0‡	6åˆ(Ñ.ùáÈ‘#©„Ó@$NÓƒŸNÃ›²v´¡%®P§ûà64Ì<‰64¤´¡ÑS˜`SÖ°ÓÿF¡˜ð¸§·”Ø†˜t3k¨ˆokÍrää †Ù=ÈêÆM½ö|°À¤ŒÉ'~·eË=r{àXÅú>°$}Ì8tèP';;[§¨ßJJJôl¨Û¶°…MlÃ L°%�À€Î’®½YVV¦•Pn-ºþ-lb�)EñÆƒl"*}•À?Mît+<6±­,Ÿ{B�-÷ÆÑ£Gm%ÄX‹´”¯»Ÿz¼NYt ‹™ÝØÀ6=†ÏU ‹X§cë`,†Q° H²=@ÞVx�¡ÝØÀVgÁ«DÄUÙ·òY´¦¸¸Ø¼ÿÞçc@ø±ÿ3“&ÿç%ò�—2”EºÐ‰nK-ÒÈ#2¨Ò¸é×¯ß ¹ü<qâÄ—0²Ù!oŒ¡Ñ&ÅxG2R†²è@:Ñ�luégVù®ÁØò(_VÇr9óiØ³g�9yò¤[^^nîÝ»g=zD²÷<ãyÈKÊ¢]èD·ÓMaIß¹s§ÿqÊ7’
%�’ýC¾°T�¸çïÈC^-„tõÔ*hµtY…#2í9²’:oÞ¼i73ïÈC^ÊPÖÞãHš¸DúèÑ£Ód§‘ÕÙ&îyÆ;òØ¼ÿË¿ò] h#xœe    IEND®B`‚‰PNG

   IHDR         ôxÔú  \ßIDATxÚìÁ   €�þ¯î                                                          €Ù»»Ð,Ë7 à¿œÓ™-!*²8'ê2(¡Ëƒr$¢Ñè2
£ “ÔƒØIÁpEAE	XÍZ)ØAö1"�>ìKtÎD‡âÔûÏõžýêÏ?ß}éõƒÆ¶÷yîûº/¸Ÿ÷yï÷~RJ)¥”RJ—ªËP‹:LF=¦â
4`æ × -ˆhÆ5hÄÌB®ÀTÔc2êP‹Ë¤”RJiÈ&ô‰¨ÇUhÆõX‰uxO¢�xïàcìÁ—Ø‡8ˆÃèCÄôã("úq}ˆ8Œƒ8€}ø{ð1ÞÁkèDžÄÃX‡•¸Í¸
õ˜˜)¥”Ò«ÅÌÁõ¸b3^Ä{ø
¿¡'pe”Æiœ@?~ÃWx/b3ÄXŠ9˜‚Z)¥”ÒEªXŒ6<�mèÁ·8„œC¹Èãpß¢ÛðÚ°ya�RJi,‡z´`%6â|ŠpçP2þöâà~À§x±-¨Ç8)¥”Ò«EnÁãØŽoÐ‡A9¡W+Ñ‡o°�ã4å�‚”RJÃáJ´¢Ïc~Á9IwœÁ/Ø…çÑŽV\)¥”Rº@Ó°íx½�“ïh�ôâ´c!¦I)¥”þ‡:ÌÇ:taoNøc:°]X‡ù¨“RJ)anÆV|„#(c!jjjJ}}}ihh(³fÍ*MMM¥¥¥¥,X° ,\¸°,Z´¨,[¶¬¬X±¢Üyç�eÍš5eíÚµeýúõ¥½½½Üwß}ñsü.þÿÿ¯‰×Æ1âXqÌ8vœ#ÎçŒsWÚ€±Gð¶âfÌ�RJé’1MX�W±´-Ø«­­-Ó§O/³gÏ.sçÎ-K—.-wÝuWyä‘GÊÖ­[KgggÙ¾}{ùàƒÊž={JoooùþûïËï¿ÿ^Ž;VNž<YNŸ>]Îž=[ÎŸ?_þ¥xm#ŽÇŒcÇ9â\qÎ8w´!ÚmŠ¶E£­Ñæh{ô!ú}�÷ãU¬GS~Ã ¥”.>1°‡PF2&Ož\y'=oÞ¼²|ùòòÀT&Ð—^z©ôôô”/¾ø¢8p ?~¼œ9s¦2�ÑÖhs´=ú}‰>Eß¢�Ñ×èsô=r¹ÀHÇ!ìÀÌÇD)¥”Æ¤ñ˜‹‡ðúQ†;&L˜·Ë+ï†W­ZU}ôÑòÜsÏ•÷ß¿|÷ÝwåÄ‰•wÙ—šèsô=r¹xöÙg#7‘£ÈUä¬’;ŒDôã-<„¹/¥”Ò¨v®Æ½Ø1ÜŸçOš4©Ì˜1£rûûþûï/¥»»»ìß¿¿2Ù–ô�"G‘«ÈYä.r¹ŒœFn#Ç#±n`îÅÕù\ƒ”R]¦ã6táW”áˆX×ÜÜ\ÚÚÚÊ¦M›ÊÛo¿]~úé§rêÔ©’ª+r¹�G®#ç‘ûWüŠ.Ü†éRJ)�ˆñX„-èŽÍx¦L™R/^\Y9¿mÛ¶²wïÞòÇ”sçÎ•4¬"ç‘ûƒ‹“›£áÚ„¨[°(?"H)¥á1÷`'ŽõB½ë®»®2¹¼üòË±ò½²°-�J161F1V1f1vÃ±Àð8vâÌ”RJ©ªÆ£øq(¿WßØØXV¯^]žyæ™xwYù<:�M1v1†1–m«Ûbl‡zß‚Ñ�Ö¼+�RJfÖb'†jáÞ’%KÊÆ�+‹Î<XÒE)Æ6Æ8Æ:Æ|(`'ÖæVÄ)¥ôÿiÄ|†Á¡X¼wÃ7T“íÚµ«=z´¤KJŒyŒ}Ô@ÔÂP-&ÄgØ€F)¥”þVžÆÏ(ÕŒË/¿¼ò®oóæÍq[8Wê§*µðùçŸGmD�TjÕŽŸñ4Z¤”R5hE'W{Òomm-O=õTÙ½{wùóÏ?KJÿ j$j%j&jg(.£­¨‘RJ— 	¸	¯W{5l1ûØc�•O>ù¤²‡}JÿFÔNÔPÔRÔªÇñ:nÂ)¥t	¨Ã*tã/”jÄÌ™3+O³{óÍ7K___I©š¢¦¢¶¢Æ¢ÖP­øÝX•�*N)]¬êp;º«µiO]]]l[ùš×¾}ûJJÃ j-j.j/j°š›uãö¼H)],jp+zª5ñÇƒbî¾ûîòá‡æçúi$×DF-FMVóB ·æ�”ÒXUƒñN¢\HŒ7®\{íµeË–-åë¯¿ÎíwÓ¨µ5µ5µŠ�“x7æ…@Ji,Y€.Tãqºñ=í®®®Òßß_RÅ¢F£V£f«õ8ãta�”RÅÑ�>”‰©S§–5kÖ”wß}7oó§1'j6j7j8j}èÈ…þÃÞý¼Fq‡"Ö°‚°M`«x*AŠ"ˆà%·r[BPD°'õ¤bÅxð¨Hoñæ%"Ø„J$"¢/M‘=yc †·¼9	¥Õ™1?vó|àýæyag¿3#i½é~^U]t�F#N�:SSSñéÓ§�ÚY^Ãy-ç5�×6Pu^ek~ŽXÒZëšÀŸU[___\¸pÁÓüêè§òÏk¨:Ù\“lP’VÙAà^Õ“ý{öìY^Š³³³!my­ç5Ÿ×>ÕŸ¸G¶(I«ààWà]Õ_üçÏŸ�7oÞ„´åµŸT¿#À;²ÉlS’VÀw@˜©²¬vìØá/~é3¯_¿Î&–Û ªL¶Ù$[•¤oäGàw`¡ìrêééY>5==’þ-ÛÈF² ì,�­f³’TAøø»ÊùÆÆÆâÉ“'!é‹²•l¦ê—³Ùl·Ž$t˜,»€6oÞƒƒƒñàÁç“
Êf²�l([ÊÎ$Ù²$}…:p©Ê!¿ýû÷ÇÄÄDÌÏÏ‡¤Ò²¡l)›ªzHð’w$ýŸA`ªì¢ÙµkW\»vÍWöJßX6•mec@Ùùƒl\’>S.–ýÕ_«Õbtt4fffBÒŠÉÆ²µl®ÊÝ€‹Þ�”~Qf8�ï<÷~i•dkÙ\¶”�‡dû’6¤pø«ÌÙ¾}{\¾|9Z­VHZ}Ù^6˜-ef8Ô�´aô·Ë~—xx8ž>}’Ö^¶˜Mf›@™¹ô#©£u#ÀË2‹bïÞ½qëÖ­øøñcHZ?²Él3ÊÌK`èBRÇé®óE—Cwww?~Ü×÷Jë\6š­f³@Ñ™®=HêûÊôˆ»wïzÈOjÙj6›íV9 ¸Imo˜-º¶lÙÇŽók}R›Êv³ál(:³À’ÚÒVà\™[þ;wîŒ›7oÆââbHj[Ùp¶œM—ýKà°Imc7pX*|WWWÅ³gÏBRçÈ¦³íl(2KÀ`7’Ö½#À4E¦··7ÆÇÇãÃ‡!©ódÛÙx¶�ià’Ö¥MÀI U4îC‡ÅãÇ�CRçËÖ³y è´€“À&$­Û€+ÀBÑÇûNŸ>oß¾IF6Ÿí—y\p¸lCÒšk @™F£±üâ�¥¥¥�´ñdû¹r Egh iÍ “e>àóèÑ£�¤Ü%?,4	 iÕ^}�³ÙŒ¹¹¹�¤”r'än(ñ=�Àa$­š±¢‡ýêõzÜ¸qÃ÷øKú¯ï	äŽÈ]Qæpà’VÔ&à,ð¾H ýýýqÿþý�¤/É]‘;(2ï�³>! ­ŒpX,æÑ£Gãùóç!I_+wFî È,W�’¾™ï�ßŠ¾ÕïÄ‰ÑjµB’þaïî^¢Lã0Ž_äJ¦µ¥Q"´-kîÁ¢Ëj±A1TKED„R!iA±±–A„DQô^GQ!hP�È„“4PTÐÉÐS‰iÌµüîÓXö¾·Ugž¹>ðû”ûþÎ3ó¼…²vXCÂŸèZU
ûÛüŠŠŠxàÀQDä?²†XK¬)ºMPdŒýàvÈÆ+//çÙ³g™Éd("ò­¬%Ök€�¹í&"Á~Ð²áæÌ™ÃÎÎNŠˆüß¬-Ö !ÓãZ&"ÞªÄC6Zmm-ãñ8EDF‹5ÆZ dâ®i"ò¯~Ð²Áb±“É$EDF›µÆš dú\ÛDäýàIÈÆÚ°aS©EDÆŠ5ÇÚ dž¸Æ‰ÈW~�¹Ío÷îÝL§ÓcÖkPèm‚	×:1N€§¾›¨°°�---z¬¯ˆŒ+k�µÈšÀwžºæ‰ˆÛ!þmmmz�¯ˆdk‘5)ô `@’ïj ôûnš’’?~\þ"’uÖ&k ßéwÉC¿ xì»Y&OžÌS§NQD$[Y£¬U |ç±k¡H©Ðë»I¦N�Ê3gÎPD$ÛY«¬Y |§×5Q$ü à¾ïæ˜>}:ÏŸ?O‘\aÍ²vð�û®�"V 3äÃÿêÕ«É1Ö®Ðƒ€N×H‘*pÝw3”••ñÒ¥KÉUÖ0k ß¹îZ)!Å :|7Á”)StÎ_D"ÁZfMà;®™"ð€v ß«ý;::("Ö´�»2ÖL×N‘÷'€Ÿ…?qâDž8q‚""Qcm³Æð™×N‘Ö `ÐgÁO˜0�‡b&“¡ˆHÔXÛ¬q¾ƒ®¡"9( å³ÐmCìÛ·�ÃÃÃ‰(kœµ.ä  åZ*’C~�ô}«ß®]»822B‘|8Ø¹sgÈ[“®©"9ò Ÿ ô™­[·òÃ‡ÉÖ<k ßéÑƒ‚$Û• ¸è»¨c±S©EDò�µÏÀw.ºÆŠd¡ G}óüùóùâÅæ»/_¾ðóçÏî½âƒƒƒÒµ%vzÏÖµ­o[ç¶ÞuÊ�Ž5Ðµ€ïu­É2� †}qee%ãñ8óÅÇ�ùêÕ+>xð€W®\a{{»»îaË–-\¿~=W¯^Í+VpÙ²e\¹r%×¬YÃM›6qûöíÜ¿?OŸ>Í»wïr``€oÞ¼Ñë�%ë¼{÷ŽÉd’]]]<wî<È;v°¾¾žk×®µuíÖ÷òåË¹jÕ*®[·Ž›7ofss3>Ì.ðÞ½{|þü9Óé4ó‰µÐšÀg†]kE²Èß+þgÌ˜á"eŸ>}b¿{XSS/^ÌŠŠ
Nš4ÉÝî xìþa{ÃXuu57nÜÈ¶¶6vwwëŠŒ‹÷ïßóáÃ‡<vìX[[ËiÓ¦Ù:ýêâ6ß‹�‹ŠŠ\,XÀmÛ¶¹Wë>zô(¬‰ö·‡Ü°"Y @Âó)‘}Ä¯EÊ¾ÁìÝ»—.dii)Œê³ªªÊ~Ipß ^¾|I‘ÑòúõkÞ¸qÃý2USScûyÔ×¸ôÎ›7�{öìá�;wøöíÛ(?28äšpíGß¸é»™[ÿjeÔ<{öŒ'Ožä¢E‹Ü2€qû5{öl;µ`"î<«È·²ÓM½½½liiáÜ¹s=î_™ð_ÁêêêxäÈ&	F‘5€ïÜt'­¾‹µ±±Ñ]Eû&4kÖ¬1� ï/-v¾õòåËît„H(;€¼uë–�¿÷ø5kì§¼¼Ü®!p§Á¢Äi­à;­ Hû,Ò¥K—Fæ\u__Ÿ;¯?sæLÈê),,tÿûk×®¹EþfïìB²Jƒ8>Š„l+±%û^XI,¹™†´¬}	íUÑM„�aB"B7ùÒE7ÕJeuÝõeluaRñ’	}@-QFŸ�‘Xàj}³üö"–êõ=GçÌü`î›ó?ïyž™ÿHLjºººÐ¨‡ž•É^ãè;@£!l“4ˆçVú7Zì81²�ˆ^ŠÇ†‰8®ëëëãíÛ·Ñ¨£'


xÅŠœÉdØq¾šú0�2eÊu5Ž^�††~ôè' h&´Sšÿ‹ ÉŽ%DÔ-)Ì3f¨é`ncxåååÈIuàj ±±1ŒZ9 ýýý¡yµ¸¸X}�Ïš5‹ÛÚÚ’09 í„†JsïÚì8›ý´Küìß¿Ÿ5óàÁÌéF÷T~ÌÀ�À7/:¡³~ñâÅ¨‹DN¼nÝºÅÊ�†Ž¦ñ²ÝM‚œ(©#¢�‚BÄ—¦ZG;¼�?ÎsæÌA.‰Üï¢‰_ŽMãl¥+**Jl�Ïœ9/Pè�æžh©4ç�A£'~%¢g’BÄÜîë×¯Õšø¤Óia”þ€IÑíÛ·Ù±ÃÓ§OÑäg¡¾ñõGBÍMÈÐRhª4çgA«'‡ü@D�’L¥Rh&Rû ­]»y˜
Ü›^¸p��äsóæM^°`�¹_¾|9<;47hB[¥ùvÍvœÑBD#YŠÝÃp³R{ß¿lÙ2äa2Ð †ÿ;'¹t�ï\k%6`W¬¹/ Ï§tBc$h¶ãä€ßˆè­äÛ¶m¶ÛiœíÏòUd#¦N�Êd'qÀåæk|îÜ¹ÜÓÓ£us(4VšëÛ ÝŽ3~"¢IÁÁ
›ê´�e#æ…ñËæÀöövv’Ã±cÇxúôéæk�€{çåË—Y!ÐXh­4×ž áŽ3òˆh· È°éN\Í6°ÔÄ¼ ~Í/àðáÃìèçÌ_g`åk¾¦ÿeee|ýúuV´š+ÍuwÐrÇ%Ñ{I—í‘#GXØÏ_]]m^¿·i£�Ž^.^¼ˆÞóµü=—ÒÞÞ^V4Wêð>h¹ãŒ‚ý-(.å·<M¼{÷ÝþæP²pG¥Ž>îÞ½‹UÑæk8[ÔÔÔ`Í±F‡Rh¯4OhyŠGÈŸ’ÂBGñãÇ�µ­7ÅjSóÂ'�ÊÊJ·ÖyOl¾v¥±iÓ&�fAÐ^ùT4ÝqÔÑ�däÍEÚ8qâöŠ›½ÑÄªU«|› >þÌ[·n5_³£Ýš¹wï^­žÒÑÀ¡ íŽóŠ¥Gÿ6l€Ø¨ëøŸ={¶yÁK@ /ÿ�;ÆµÂW¯^UùƒoãÆ�ò« h¼ã|ƒ´ðX÷fê,~W®\i^èÆ˜!G×´3yyòä	Ž„Í×êK‘TZ˜¿zõ
š,Í3MŽóª‰h@2"vîÜ9VnÐ5k^äÆk§:44ÄÎäãÃ‡\__o¾FÇ---·dB“¡Í’‚Ö;ÎÑyAñà~14ÒiâáÃ‡ð»7/n¹ˆC‡±3ù8uêî‚Í×çxcÚ´i*=M ÉòÞ� õ…ä8ÿQODŸ²Îüùó1?¯íÁÀÚ[óÂ–K+U5;“‡��^´h‘ùÚÌU¬^½cv½M Ñ’?Íw"*%¢{ÙŠ¦°°�Ož<©q‹–;¡å8š››Ù™<ìÙ³Ç|Mæ2ÐD‰#u…@£¡Õ’<ïíw€i»ß’‡býúõêºþñï]·n�yA‹Â ”œ‰§¯¯Ï'["ˆ¥K—j}…æA«¥yp›`ÛÔÑ?‚å*-3Ñµ^TTd^Ì¢ˆÍ›7‡f)gbÙµk—ùZŒ"ÐOqúôiV´š-ÉÚ_CŽI~$¢L¶"ÉËËã}ûö±Bð’2/dQEII	ß¿Ÿ�‰#kåååæk1ª¨­­Ó
�fC»%yfÂ»À1G�HŽÂ†‡‡YwîÜÁÆ,ó"e´¶¶²3a`""o¾£\�ÝÝÝÍ
�fC»%yŽ„w�cŠŸ‰¨W²îÒ¥K¬‘;v˜°¨£¢¢‚ß¼yÃÎ„ÌýCàÍ×`Ô±eËV
´.É³7¼3ì”cc£ºÆ?088è{þc+utt°?7nÜ€ñ‹ùŒ:ÊÊÊøùóçZ÷B@Ã¥¹î$Ç¿ÑËlQZZ¶Mi$“É`Æ¼xÅuuuìÄO:�6_{qD~~>=z”•‡–Kr}ÞN¢ÉÇè‡äË®­­�‚ÎtÌ©›®¸#h0 qâ½ß­ªª2_{qÅš5k‚¡˜R åÐtéX`>9‰åw"ÌVK–,QëùŽ;éyóæ™­8¿�Îž=ËN|\»vÍ�ÿcŒT*¥õ @Ë¡é’\Ã;ÂI$DÔ!qÁêììd­\¹rÅ�ÿcŽ¦¦&vþeïü^ªÊ¢8¾„œHñùÃˆÆ@A%FóA_´™Ê|0AòA2é©�DÅ—Àz)ŒÄ� Á‹æ�Bê!ƒH�ÊBÒ²±0äj©µ†µ_:†³÷={­|ÿ€{Îºë{Ï¹k¯¯1(š™}Í™TtttÐäRO×�‰þ[y…àe ö*€ºº:ÜÞÞÆ réÒ%öË´


pcc3ÙÕÕÕìkÎ´ÚÚÚ‚¼øŠz:õv�ÏV^!8E Üóºù´3ÿÉ“'Tvww±¾¾ž}³²±øÅ‹(øÏÇ�1++‹}Í™Vqq±š½0ÔÛusQî)Ïœ¡ vtŽý™/_¾Èÿÿvæ ä8 !>|ˆñññìkÎ´öïß�pt�î(Ïœ  xÝôôôôÀ¼ÐìÄÄDöÍÊ†._¾Œ‚‘íìkÍV6@(Â€C=žz½Îg~ ¼C<õ:YÿíííH|Ð…¾¨ì›•544 à;4pÉ¾Öl©¿¿€z½ÎçÝVÞ!šx x¬³ôçÍ›7túúúØ7)[*,,Äïß¿£àïŒKmm-ûZ³¥ÖÖVt êõºË�+ýô¿«ê"OG¢ÿ%L[]]EÁ?(Ÿ>??Ÿ}­ÙÒ‰'Ô) ž¯$o‚ýô?åu“)NtiiÉ…ãQ´––}“²¥ŒŒ5ƒ!øz€rÞÙ×š-QøÒææ&: õ|Ý(é)yLê4&ÿi©ˆ3éhUUUì›”Í)i
¨üãÕ«Wtä’}­ÙŒ­¯¯s[(µ£¼D¿@Hãµ­3{ÜiMii)û&eK;:::Š‚ÌÍÍÑ-öµfK™™™øéÓ'têýº;%BÊS„Àð lzÝØîîntŠ –€ËëRïÜ¹ƒ‚ÌÎÎÊ ‹JIIÁååetò �Ï¾©<EÌÎÿa�ÿþWVVÐ>þŒyyyì›”Íe@CCC(øÇôô´„ Yþ@¡@A ;0,Á  ¾zÝÐ+W® K¬­­ann.û&eS·nÝBÁ?&''166–}�ÙRrr2...¢c�è|þ¯Ê[„ˆ&
 t2Üß¾}‹Ak€iH‡}“²%ÊFÁ?=z„qqqìkÍæ šžwòò�k0 <FˆX~€÷^7²³³]ƒ¦s�=Ê¾IÙ\•z÷î]üsIHH`_k¶”ššŠ>|@!OÐ¹ï•ÇË�"žŸŸG×‡ÃXVVÆ¾IÙ=™Ž��£à”¸˜””Ä¾ÖléðáÃê¯F!O oÐ¹@ˆHÒ `Þë666Øfe%ïZÖ¤Z~=úôéS|}UKA.ìkÍæºkŠvòò�ë0¯¼Fˆ8þ€^Oi333è*§OŸfß¤lž‘¦E5‚¿']:Ä¾Öl©²²Òå¼ò�“Êk„ˆ"F'ò·¦¦Æéîèè`ß¤l);;[íbückkKJJØ×š-�<y†¼�<B7*8„ˆ¡ Â¿ºi{öìq~QËõë×1**Š}£²!š¿ ´:Á?~þü)yuþüytòò
¯kVž#DÌÑ¿A¯â¥-y4)ï2´’–}£²¡––üçâÅ‹ìkÍ†èÁâÆ�è8äºUåH`d� +^ÅÛÓÓƒŽCK:hYûfeCýýý(øÏàà í\`_o6².h#È+tÞ¤®(ï¬sÎ«xipèÝ»w,òÒ‹ŠŠØ7+ÓÚ»w/†B!üçÙ³gt\‹}Í™Ö�TxÈ+t‡MÏ�`•8 ˜õºQgÏžE.455±oV¦uðàAuDMð:†&/-¨ººZEŽ3�<CçºÌ*¬ñ' |ûÕM¢Ýá´Cœ2hXåååjƒ`†3gÎ°¯9Óêêê’Ü‰ÿê›ò ÁW½
÷øñãêøž?.‘©†Ea"‚9nÞ¼)?rÿÿ?55ÅíÈ)y‡Îõ¹
‚2 àµW@ËíÛ·‘4pìØ1öMKš£»¼|ùÓÒÒØ×ž)åää¨°1f�wèœ¾V^$ç”×æ¿#GŽ¨ð
nôöö²oZ¦TPP þ—Ì±³³ƒUUUìkOŽ¸ú
yyˆÎfÀS % î{nss3rdnnÙ7.jooGÁ<×®]c_{&´oß>A¦�‡è\§ûÊ“cdÀ?^…;66†¡•–ì›—�ÀÙ;÷—ª²(Žïz‘=5(LH(„°ÈÒ)¥&*œ¨~*zL5¿EÍãTXÐP‘ASö¤H‚~‰¨¤ìeØ#(,“£¥=4J/½ÈZÃwÿÕÙçž{îñ\÷÷ëXg³¾÷î½Öwñú¿ƒÀÞ…AƒYƒX ÔÚÚ*–�–˜òÔ¬5‰F‘Rê«ÓGÉÏÏ—H$"¶²ÿ~¦Ðý�f!B[àÎ¥¥¥b1Ðh‰)O_µ&‘ÀÿœçÁuæÅ‹2bÄë­Q;/gÎœÁ¿3ëÏb¼«—ïÝ»'¶-q‘¯ó\yJ©ˆÓÇè×¯Ÿv³�ÒÒRë‹X¼"++K^½z%¤CGµøÔÇX²d‰�–@SLùŠhm"qç_ÓÁ-((Ðïà¶wºŒŒëYþýÓû?$9rÛÛ¬?“~GJJŠÜ¸qCˆ@K )æ¼A›H\IVJ]3}ˆÝ»wÍúõë­/f~Gvv¶´´´¡ïEgXŠ£Ï‚h )nòvMk‰9J©6§�€Îà»wï
Í“'O$33Óú‚æW$%%é4*++¹ÛÇ€ÉÒ­[·„ 4ÅÍÔI›Ö(7þ1^„´··ÑhÊÊÊ¬/j~vþcg8	ØÃ0wî\ëÏ¦_±jÕ*!ß Mqg>�"q»þ¿`ú {öìò-oÞ¼‘É“'[_Øü˜û¿té’�ðq³ö&}|²ýÅÚ_òÐ79¼Àg€ø�kºþOMM•ºº:!ßsùòeéÓ§�õ.–X±bßECÌÎ�;é}CtëÖM:$ä‡@[ 1æg hñ�¿]\Ï²ûß�Õ«W[_äbñüojj^jjjpKcýY�¡ñ�k­Ó Ðc.¡UÄwïÿJSâñ€üœ×¯_Ë´iÓ¬/tÑö*TWW	/×¯_—‘#GZV½ÆèÑ£åÙ³gBŒ·LnòYÉÝ þ’¡”j4Í­bM(qæÎ�;’žžn}Á‹fæÃ†BB:ÖñvmýYõ¸Ö¾råŠ#Ðh�)§�Z³ˆoüaðþÇ,0}Ù]RQQ!½{÷¶¾ð¹‰Èû÷ï…„Wü‡ný9õ]ºt‘½{÷
qí>éÆwâ«Ö,âå¦ƒ\RR"Ä=[¶l¡ƒš!Æ�¯}Hh›²pumý9�±±•}SÑ­1çšE|!E)Uç”ì®]»r<ËÃìôÊ•+­/€?	ü«ä"”�³Œ5ÊúsKÌ›7O;)’¨€Ö@sLù­ÓÚE|YþóÁ)Ù¹¹¹ÒÜÜ,$zÕÅ…‹­/„?ÿÚÚZ!á¤¾¾^rrr¬?§±ÄÌ™3Y3½�¼AsL9þÀå@þð—é0/_¾\ˆ7ÚÚÚdÑ¢EÖDbØ°a\‚nñGñµþœÆÓ§O×ëÂ‰g 9æ\C»HL$)¥Ž›¼Ù�;&Ä;‘HD–-[f½‰Jvv6=ÐÃ=ÁÂQ¿cáÂ…üçïG�…ö˜ò}\kñLºRªÁ)É�††!±ññãGY»v-ÜÀlmøãiˆA?ÆØ±c­ðX–X-]ºTÛ‚“˜�æ@{LyoÐF<ó»Rê³S’§L™Âñ?Ÿ€Íí�¤ÿþVÇÙ³gKcc£�prÿþ}¾ùÇØ”¸qãFºüù;í1åþ³Ö0â™Óá...â/UUUV\µ&''ãÖƒÛýÂ-þ¸�±^Ä½Æ�!CäðáÃÜaá?Ðcþµ†Ïïÿ•&‹sçÎ	ñŸG�Éüùó;m_@VV–Þ#OÂËãÇ�eÂ„	Ö‹¸Ç€í7—£Åh4ÈhÌ> o¤ÞÿaiKÿê8/¿À“ÀÐ¡C;Õu(ÞB!.$¼<|ø�âï1ÒÒÒdëÖ­zÂ‡Äh�[õ­e$j~SJ}rJîŒ3ø®LÃ6…%ü:áqãÆiä/_¾	/<€Ýj�OAØ”‰ñ8ì~HØóÝ£Gtùs’%835h�é»|ÒZF¢¦Øtà×¬Y#$¸Á«W¯Ê¬Y³à‚•pÆ>;vì`t‚<=ååå*šûöíðîÝ;ìÃOH{a¬©=}ú´´··	h�ùû@ËHTü¢”ªpJ*Þ¦Oœ8!$X°¾S§NEñsQÄ†8t?óº?q®ý�ÕþFÏž=e×®]ß5È=þ\¶oßŽ¡¾À.�üü|9xð Y;h�›>©ãZÓˆkR•Rõ¦õ¿è&7söìY™3g¾E¨Šâ˜1c¤¬¬Œý!	DSS“Lš4)Ðþ8#N´´´Hyy¹žBèÞ½{hÎxß¾}ñ\¡ˆ·¶¶
éÐ)7õ¯^kqÍ¯J©·NI�8q"Y„ ¼§ß¾}[6oÞ¬e¯^½:¤(fffJaa¡œ:uŠWý	<


‚:+süówÝ‚§�‹/bs¦Gð�¯CÞ÷a�¼nÝ:XU³÷)<ûT E¦ï÷VkqÍŸ†„êNn¾ç�ššÙ´i
:f�ã¶r855U_ÑéBOŸ>’pàº�T�Šÿ¶mÛ<ÏÅ¿|ùRNž<‰pÝT:pàÀ¸9÷<â¢½*ª««yÍN Eæo
M#®ùÏ)™x—Cã	/hFÂÛûÿìÝ=HÝWð·j¥“‚RÅ�Qº·K-HMÀŠZ?P‹´~ê%Ñàu
UADâ"A££ j\²pF¯Y$|Ãs6±÷‡Þsÿy~à,_ïsÏ×{666tzzZ›››Í¦¨¨H³³³Íu<QWŸ‡ŒŒÍËË33¯ŠŠ
ó÷ââ"VÌZx�wÕ}…?Ú\#üÿ×m0<KŒ/ £££ØC-|ñÅ²0ËÞë	ZÊ˜/´uuuXM3úŽ��9Ó>d‘û¬2�îÝ hËuxgwwW)|+Ø—GxommáAÓg`ff‡®ðáŒ¥Yóµ°° ëëëø;ãZf?¼¾÷€ ÊËË}†?îÆ'´†°ª€»÷¸É°··gÅ,--éÜÜê5ŽSïóóóº¼¼¬›››zxx¨§§§f«�BŸQÈ$Wn±!Ðýü "G¶Á,,,4KqD:8\‡Õ¯C#‘ÛáR" ‹�I®:<2ÙFN?9 bæÀ¥1¢úøïG¯á�m$,©Çb1%J d‘{5™†l#§ßiNãQ¸D£Q}òø‰·ðÇüØØ›ãP¢!“Ü5‰l#§gŽÓ±< H2———Z]]ísÙ·Qþä2	ÙäªËgBV�DäµmÑ�~ggG‰(<3ÿÚÚZŸËþØógø“/È¤û¼•òÚdÅ•!"ïmƒˆë2¸>DD�‡ÛŸ34Ëá�ò	™„lrÕç{“q×�"òÉ6ˆeeeæ™Z"
þ²MM�¯ðG‡>4Íáaò™„lrÕè'“q×¯"òÅ6ˆ���JDÁ†õMMM^Ã¿§§G¯¯¯•(	�M®:ýb2ŽâúÓõ�>99©DèðGG;_á�ÃWxÏŸáOÉ„lr×+2ŽâzîÚß[]]U"
&tÂkkkó:óïëë3my‰’Ùä~ûGq[ ¿²úÂ£m&³Õskk«·ðGÿõÞÞ^ž	¢ @6!£\uûŠ-�ÿÛw"òÖ6x¹¹¹¼@<x˜	¯¢ùÎü)H�MÈ(Wí¾5YGwäŠÈ‰mððü&fD¨7Ñq Êëžww7ÃŸ‚¶†ŒrÕï‰É:ºãg¹´îó~/QÀ>ôÚÛÛ1#÷õ _68  A6Ý§çÅ¥É:ºã±ˆÄlƒ788¨D˜ðÇ¼·ðÇïéèè0·ˆåªã˜É:ºã/ÇÀ™·´‰(ùpå®««KEÄ×ræOA†Œr×2²Žî˜°ZZZš®­­)%öÞûûû±ï-üqµm…‰…¬rÕó„Ð-ßˆÈKÛ eeeéþþ¾Qr[žyÝóGGAÜ2 
8d²ÊUÓ/Mæ)"òÆ6hùùùzrr¢D”¼ðð:óoii1Í…ˆB …¬rÕõ“yÆ÷"òÎ6hÅÅÅü  Jâ²ÿðð°×ðohhà²?…	2
Yåªíw&óŒù`´’’¾ïM”±X½ö}†?^äi
d²ÊUßLæÑ­g€/lƒÖØØ¨Däÿ´ÿÈÈzœ{ÿúúz�F£JBÈ*W�_ðYàÛ~‘Ï¶AÃÁ#"òÚØá�w¼…UU•^]])QH!«\uþÙd�ñ›«	ÐÄÄ„‘¿¥ÌH$¢©©©^—ýÏÏÏ•(Ä�Uîf@È<ã×‡Ãìì¬‘—ðÇ‡–ý½Îü/..”(ä�UîšGæ»Z€®¬¬(%ÖÍÍ�Ž��kJJŠÏðçž?=È*wŸd�ñÔ6Xéééº½½­D”ÐÓþ˜ù£“™·ð¯¬¬Ô³³3%z �UÈ,Wí?ã…m°233õàà@‰(q3ÿ©©)¯3ÿÒÒRó†:Ñ‚¬Bf¹êÿ…�ñ­ˆüc¬œœ=::RúÊÞÝ¼T™†qÿ­fµpÀqßðå˜ø‚‘Šø’££Î¸q-Å]´WD!ˆ®Ü´¨\ŠÑJ„JPÑ±ÌEŠ¸Í"MS{·Å¡¸†ëÞ1÷}ÇnŸßçO¸à:ßç<ÏsÎMô}Þöïëë“cÇŽy‹KK‹ìììÑ£­Òf¹và/Ó>Â FmÃÊÌÌ”��!¢ÃwíÚ5¯·ýdkkKˆŽ m•6Ëµ£¦}„Ÿ LÙ†
…dooOˆèÐ�/Õç•^oû¿zõJˆŽ(m•6ËµS¦}„ã žØ†UPPÀÓÀˆÙ�7¼Æ¿±±Q677…èÓVi³\ûðÄ´��à©mX¥¥¥‡…ˆÇÍ›7½>ó¯««ãm
m•6ËµOMû¿ Ø´«©©‰’ë×¯K||¼·ø×××ó

m•6Ëµ›¦}„4 Û¶a�;wÎ¼©LD±�¸¸8oñ¯©©‘õõu!
m•6ËµÛ¦}„\ »¶aµ¶¶
Å¦¿¿ßë7ÿÚÚZyñâ…Œ6Ëµ»¦}„B ¯mÃºpá‚‘…Ãàà ×øWUUÉêêª�6Ëµ#¯Mû¥ ÞØ†ÕÞÞ.D¤¢744$			Þâ_YY)ÏŸ?¢€Òf¹öä�i¡À;Û°:;;…ˆ¢7<<,'NœðÿêêjY[[¢ Óf¹vå�i¡ÀÛ°._¾,D�Û·o{�yy9ãO$¢ÍríËÓ>Âo >Ú†uåÊ!¢ÈÝºuK½Å¿¬¬Œçu‰¡ÍríÌGÓ>B½ë ««Kˆ(âóÈõ42¯ßü—––„ˆmV$ õ 48°«»»[ˆÈíÎ�;^ãúôiYYY"R†6Ëµ;¦}„? |¶«§§GˆÈnddD’’’¼ÅÿÌ™3²¸¸(Dô/Ú,×þ|6í#üéº èíí"úowïÞõÿ’’Y^^"ú†6Ë} í#> ŠÅèè¨$''3þD|ð¿ó;€O|	�(zcccròäIoñ/..–……!¢˜^üdÚGîŸ^½zUˆèÛø§¤¤x‹ÿ©S§"7m¡³ü# ¢èÜ»wORSS½Å¿¨¨H?~,Dtht„* ïmÃºté’‘<�´´4oñÏÉÉ‘ùùy!¢ˆh³\{õÞ´�Pà­mXBD"ããã’‘‘á-þùùùòðáC!¢ˆi³\»õÖ´�Pì:øâÅ‹BtSSS^ã
…äÑ£GBDQÑfErp1! »¶aµµµ	QÐãŸ™™éó¶?ãO¤¢§ÍríØ®i!À¶mXçÏŸ—¯_¿
QMOOKVV–·øçææÊÌÌŒQÔ´UÚ,×žm›ö~ðÒ6¬ææfùòå‹Íìì¬~÷ÿôôt™œœ"RQÓVi³\»öÒ´�ð3€g¶aUTTH8¢€Å_¿�{‹vv¶LLLYØi«´Y®}{fÚG8`É6¬ÂÂB988¢ ˜››“¼¼<oñ×ÿ¸ÿ¾QL´UÚ,×Î-™öâ üm–~îïïãÿ}nûëÏ‰(vÚ*÷þšæÅ�ð#€1Û°þaïÞ^iÏÃ8Ž?ã\„,šË¡¹q(’I.d´IÂ&©‰í`Òž\,9µ#‡d·ÉáF$’ÒÈ¾œö-ZJØ‘í|Ì!$lÏô|ïvkÖï»Úñ]¿µú¼þ„§ïõûZë÷MLLäƒƒt‹‹‹œ’’b,þòB!y«  ¼i•4K·{ÿ¨öÑ„îxrss“Ùòò2§¦¦šŠ¿\"„c€—%­òæ5Ýª} |´–Üsîr¹ P---Éûö�Å_.šŸŸg xQÒ*i–n?å½Õ°"##Õo¡ÑÊÊ
§§§‹BBÏÌÌ0 ¼8i•4K·‡ï	„òÎjXAAA<;;Ë �ÿŒŒ£ñŸ››c xÒ*i–nßå­fX<22Â �duu•333�Åßápðää$À«‘Vé÷QšBùƒˆ¾Y¬««‹ÅÚÚgee‹\\OOO3 ¼*i•n¿©æ�PÞÑ­ÕÐœN'‚õõu‰¿Ñ'ÿ©©)€W'­Òíä­j%“ˆ®p%0º��ÎÎÎ6ÿØØXûØë*à+Õ<ðþFÀ’’Ü~ÿœœcñ�ŽŽæ‰‰	 #¤QÒ*Üø÷|±š|SúîîŽüôå FãÃ£££ ÆH£¼ùUÏÜð½0"ú×jhr%êáá!ø›­­-ÎÍÍ5ùòØØ€YÒ(ýõÝªuaB	"¢IÝkKå7Ó þd{{Ûhü£¢¢xpp�À8i”´J·§“ªyð�ÍSÞ[~egg‡óòòŒ>ù3 ø„4Jÿ@i¸ù[34` °»»k<þCCC >#�Òï«´Üü©{Pcc#ØÝÞÞççç›Œ?>øž4Jÿ i¸ù�ˆn¬†WWWÇÏÏÏ`Wûûû\XXh,þáááÜßßÏ àSÒ&i”ngoTëÀÍ¯Dt`5<yªº¿¿g »~¸  Àè“oo/>øž´É›“¿Õ:pID«VÃKJJâËËK°›££#...6ÿ°°0 °i“4J·»«ªuà&˜ˆ>Y/>>^]¢`'ÇÇÇ\TTd,þÜÙÙ‰7cØ‡´I¥ÛßOªuð¿>èþß¹°°À vqrr"OþFãßÝÝ�c {‘6I£t;ü�À£¿4Ãã¾¾>°ƒÓÓS.--5zìßÓÓƒøØ�´I¿ÇÒ8ð¨œˆž¬X__Ï ¾vvvÆeeeF¿íßÑÑ�øØ“´I·ÇOªqàÑoºk�+**øññ‘|åüüœ+++�Å?$$„ÛÚÚøéé‰Àv¤IÒ&ý5ÀÒ8ðèg"Ú¶brr2~	 >=ö///7zìßÞÞŽ½ ö%M’6éöy[5<
%¢ÏVCt8ìr¹À´‹‹ù”o,þÁÁÁÜÒÒ‚øØ›4IÚ¤ÛéÏªqàÑODÔo5ÄÐÐPg “®®®¸ººÚè±SS?<<0 Øš4IÚ¤Ûë~Õ8°ôV3Dnhh` S®¯¯�Æ_þ�´¶¶âÉÀ?H“ô»-m¯î¸µdUU¾Æâ_SScôØ¿¹¹ñðÒ"i’n·oq€w~!¢¯VÃLKKSG² ¯éææ†kkk�ÆßétâØÀH‹¤IºýþªÚÿ±w¦!Uma&ÜHÈ2oz1%‚Š¢",­¼Du+úQ”ÒõC.ˆ…v‰²’À¬2š³I£2Ê ";M6Q	Ò`ÙwÏ»¸÷G÷ÚYûœ³÷n÷ûÀ÷ÿ¸ör½k}ë[ï§åoTúÌˆˆ©¿U/„X(þšÎ^æF‡díÚµòùóg!„„Ð"h’î¼Ri1D�æ¤ÄB@biÚþüù¶‰XXîÙé’�Ð, „&ùþ?‡¦ÃdéÍuëÖ		-ZZZTËÜ›7oÊ¥K—äèÑ£²ÿ~Ùµk—äçç£»�êm_PP ÅÅÅræÌ¹~ýºx<inn¶¥ùÍ»wïdÁ‚¶žüW­Z%?~úýàß¾}+>”7n(oøÃ‡ËÞ½{1¯1¿j¾ïÛ·OJJJäÂ…RWW'Ož<‘>	9 Eúÿuhñ«°ÅÇ`Âƒ�'&‡Æ<zôHÎŸ?¯š×,\¸P†&ñññÒ£G	7T)qqq2`À ™:uªlÞ¼;nl"”X›Éû÷ïeéÒ¥¶ŠÿêÕ«ÕÆˆ„Ø´Ý¹sYø5¨B°�Jß¾}ñ&&N†š;uïÞ]µ‘<x°*8ÍÍÍ•Ó§OËýû÷Yâl AFú�´° Ð?b¼ÑàkPccc¥±±Qˆ³NøW¯^•œœIMMÅBˆ÷ì–ˆ'Ún2DV¬X�™… û’%KìLûÃ;œ›ØìqâÄ	Y¿~½Œ1BzõêeÙüˆ‰‰‘1cÆÈ–-[äâÅ‹*F4Z¤ûžJÓˆaÐ/¹Lw:D™ü\�–Çi§–Q£FIçÎ�­MÍI:11Q233åÔ©Sêß�z]¾|¹­¿wåÊ•Lû‡˜—/_Æ7C&JsßkMtêÔI†ªÌ¡ªªª˜pÐ #@eJÓˆ_ü©TuÒ$?/ýyöìY¤=�X`Úé ‡Ì j
�0òw oëoÌÊÊbÚ?D¬Ÿ±±EªÞ1s¼k×®’žžŽÌ—z­B~Ð ý7ƒ–¿I÷F«¯�ÍÈÈ !�Í@¸JKKeâÄ‰8•à;86’’’ÐHµ?º¿Cž­':d)P»@œË‹/P¬‡;ydk;¿±Ù9r¤8p€×öí�é¾S«Ò2â7	ÞhÔ-ð¯_¿bO…óµk×ÐWSÜä¼HNN–�;wâjà»“?îqq×jÓïÀÓB.ÔE EEE~|¯�Š	& p�"û€ö@ƒtß¦Qi	È¨\w/VYY)ÄZîÝ»'‹/Fêã²1|øp9~ü8D¦;8ÝÙ)þL×:˜òòrIKK3yNØ_'0wî\©­­b9Ð#YÐr Nž®˜jëÖ­B¬®tx§Ÿ��€ñn�"EÜéj
wÌø
 û@œyŠÛ´iž›¶›9-Û·oWžÄ2 =ú#4ŒÌÞøæcpñ6œ�S, f&sæÌù÷~œ¸øs!v(W®\AV¨ÝÎ½É“'K}=-Ó- šíÑ}ƒoJÃHÀü¦«èÓ§�rÑ"æQVVC×‹w°1oÞ<¦ýjÞ’——/‰v?áÅqäÈUÃCLšíÑßÿCÃHPu çt}`¹IÌ)ôCÊ¿[·n®ï`cöìÙìXéÌÎmp{Ô¤nÛUÀu¯aè`Ð#ÙÑs¼ÿžlÝGUü©Žc;vt½x3fÌ�¦¦&!Îsm›6mšç$^»À‚µ(æ ÍÑ�;´‹Mš7¾úèñãÇ«'<$ð8Ë–-ã}¿	�g’/_¾â,<x€§r®ŸŸÞW|:üsQhŽn¬¿*í"¦ôðøì.]ºHuuµ¿A�úÞ»~a4!pºäâê@îÞ½‹—®ŸŸÿ\¹Ih4G7Îúÿ›C˜7Ju“zÇŽBüßÉ.Ê\äúÑŒ˜9s¦jCœECC*ý]??ÿÓ§Oçf50 5FÆ¸Ti1…,Ý€O™2….XÆAA<ð]¿š”öçbêÐJíÑ£G»~~þ(fÍšÅ«Sÿí¡5ìÿo3ÉÞhò5àh�‰{>bŒmÛ¶ÁKÜõ‹`°�·À¯^½â(Pì†oãúù©t8„á1\K­Ñ�k“Ò,báÞ¨ÐMæC‡	ÑsìØ1‰ˆˆpýâlLš4Iž?.Äy&-kÖ¬qýü4pÄÜ½{·C@cŒŒk…Ò,b*9îaix¡áöíÛëú…/Ø7nœ<{öLˆó8xð V¹~Ž"Á‘h}R 1ú1…VÓIõÆ_§,lI›àm:ìA]¿à™ÑyíñãÇBœG]]Ö×ÏQŸ>}*Ä§=º‘¹õEi1�_½Q«›È°½$m³qãF×/tf¤ýa(CégÁnà�ŽŸtô´ÅÀ8Ö*­"–�kÄ�üŸŠŠ
Þûýû÷çÉßÙÏ³`ñëúyhÀ´¨¨HH›@[ôã�"–‘â�O¾>@||<›µQ�’’âú.ØˆŠŠâ]©C©©®‘Þ½{»~ŽIIIÌpµý¤Ú¢¿OJ£ˆeDzã–¯�€@qq±…"??ßõ›™÷ÿÍÍÍBœåi‘‘‘áú¹iVlØ°AÈw@SŒd—n)�"–ò—nc1hmm"*e�˜˜èúEÍÌ¦*{öìâNž<‰Žw®Ÿ›fEÏž=¥¶¶VˆZblƒ	m"–ó»î5@tt´x<!"ÙÙÙ®_ÐÌŽAƒÉ›7o„8ÃÎzìØ±®Ÿ“òIµ( %Ð}õ?´‰XN”7jt× ………âvðl¥_¿~®_ÌLÌ/öžp%%%t´´¨Þ¥ªªJˆ@KŒ¤ÿk”6‘¿Ù;¿—ª²(Ž:¡Ò5GG%BA¯–†"ŠB=„W¡7'�|�pô¡`(%ABôÁTüa>ôÃû „ŠR6à”	ŠŠø;ÔÖœuþ€öyÙ{ß³×úÀ÷8û,Ö÷Þ³÷þ.%ü#*à’’;Œ2ÍÍÍä™,¥§§s°f¾}ûwîÜ!_‹²TUUEþ+€å!è%<û?ÈÈµtø£>| ªà¸O¯×K¾‰Éü
ÐÝÝŒ>Þ¼y/^$_‹²?~Â ‡ —ˆÖêÐö$Fél€qQ?|ø¨ÒÕÕ¡¡¡ä›˜ìø/”ÑËZ^^N¾e¿"=ÄÉ:�sö¿zþrrXkˆ�Ó½øÓ¨EFFÂÄÄ0Zæüó½ÊÉÉ¡ØC|nôñ:¡1ÊIµ´!J¶òûý@�@  �‡|óR¡ºº:`”ƒW1É×ž
áË«W¯€ èè!¢5Ú°½ˆQNˆ¥ç¢®¨¨ —	ÐÒÒB¾q©Rvv6 £ö`–Ïç#_{ªT]]Mñî?z‡“õyn{£…2Kg¢Q—óóó|/š%C@ÃÛ ŠYZZÂ°òµ§2xgg�ž�Þ!Z›3ÛƒmÄYú$*àG�æææxè�b=yòu<{öŒ‡þð�\™ g8Y›O¶1Zi½¨ÌÌL{>:::¸9ª¿ÀcTRYYI¾æT«©©	ˆ€^�ž!^ôF;Ù–vô¢0)¬§§€žä›•j%%%Ù©‹Œ|ð¼Åõë×É×œj•––ÂÉÉ	 ½ÂIºä®í=Œv~¶ôZTÀx-Øôýÿ¼¼<òÍJ†ø¶Ip0;;±±±äkN±0ŸÂ˜`ô§W¨_ÛÞÃX:ìc?Ë}ee®�oVÄ³ÑÛÛËWšÎLNN‚á G8™,yj{4ÄZš£žmýöí[‹ÊW¥ŒæÁƒäk�£¯¥¥K¢G8Y�9Ûs˜ ¢�z¶ugg' Ô¤Û·oÃÙÙ0ÿkªêëëÁ`ÐÐ#Äk�^Ã¿YZ§< ¡¡�|“Ò¥ÔÔTØÝÝFîô¿‚‚òµ¦IŒÃ¹ÿè1è5LPò¯è¦¤¤ÀÚÚ˜Èýû÷É7)]JLL´óé¹×³®^½J¾Öt©¸¸Øž3b è	èâu@�a‚–,K;¢—ØÞÞ¦�÷ÐïÞ½K¾IéRLLŒ=:”‘^µÄO´äkMã` Sc¯Ñœ¬ÁŽí1LP_	|!z‘7oÞ„íím0‰¯_¿â>4ù&¥s2àØØ0òXXX€èèhòµ¦K×®]3­o"øLè	NÖà_ý~J,�ŠN´âu"“ØÛÛƒÜÜ\òMJ—.\¸ ###ÀÈcff.]ºD¾Öt	óÖ××M¼Zêäðô©í-LÐii\TÌEEEpxx†€Ã:8!M£ðnúÐÐ0ò˜ššÂ/-äkMç6×êê*z z�“ç·½…q¿[:Åõ+--�|“Ò©¾¾>`ä†´„‡‡“¯3]Â�13ô '±¿ç¶§0®Ácé?QAcl.~:7å„tFFù&¥3(e`` y`]DDùZÓùàË—/&m›:�NG/‰ú‰q:iÚýýý` x²�oRºÃÃÃÀÈãÝ»w<êZï “®Pcïwœ†^Â¸Ž8K¢—›ŸŸ�ûçFìe’oR:³ÒGGG�‘G €Ë—/“¯5�Y[[[¦œ™ÂÞïä¹xæ¿{©½à��ŒÐ5bŠ•Ïç#ß¤t	�izzy`ÐÒ•+WÈ×š&á!cS¶L±çcï?7zãZ~µôYô’³²²\ÿàüüœsÒ5*>>�‘ÇÆÆ$$$�¯5]ºuë›ðï{¾“gþl{ãjþ¶ô]tàéÓ§àvjkkÉ7)]JNN†ÍÍM`äqtt7nÜ _kºTVVfÿÑp9Øë�ìý·½ƒ1â,À¢¨¸½^¯ëC.Z[[É7)�1©˜“ÎH§-rÜµFÕÔÔ€ËÁ�½ÞÉó.òÞ¿9T;)ðÆÆFp3/_¾ÄD:ò�J‡îÝ»å2Ymmmàr°Ç;{^ôÆ~±ô^ôÒqÒØòò2¸Üƒöx<ä•=~ü%ŸoÉ×š®¨k¿ß.{»Ói’ïmÏ`þgïÜBªÚ¢0§sðbeˆe/aÉÁf� ñAéP/l©—Nå‹øP˜>øAõPQPb¡r² *é~�ÒD» tQºiPF™5ÎüçSD�=·îµ¶c�ñÁÿîÄ±þµ×œsŒ?P”�†ùÇãƒõå–ˆ7+¿…ÛÄÇ�'Å{ÚÚÚt@Œº\=z$a÷hÔ¾+”@f\r(tÄº²=#…BâÍÊo¡5IuŠ/� ¸p)¾æüÖÒ¥K9GÃÓ]gH\Ò™ÿÁ%d4®Ö¬Yc_¦©««oV~+//ÏbRüiw-))_s~«²²’¾}ûÆõÃžî²ÎûŽPK‚Q‹ÃT7¶Ñ®/^¤øøxñ†å§°µ¨øÇÎ�;Å×œßc®›››‰)ðrxºËZ[ì;B	4…Fï]Úº°Ã�ÁÁA½àóù?ÌQñ�+W®h(��JOOç‡—»¬ó½}7(�ç7£C.…¿}ûvb¶é°]'Þ´üÒìÙ³©¿¿ŸßÀY´_ù¨ÒÒR®€àá®ë<dßŠþ4z®(ÒÒÒèîÝ»Ä�sçÎé1€OÂøeÅjkkÅ×ž_;\$†À»áá.ë|nß	Š(ê\€òòrúòå·h`wˆ7/¯5iÒ$mÿ‹×¯_×c 4wî\ŽÛÿðlx·Û:ñ.PÄ‘î2"_Ò§N�"nlÛ¶M¼yy-ŒÅ�%&é—§_ƒ^kóæÍÄx¶ë.h—þÈ¥Üès¸"Áy#ú�9ÑÑÑA3fÌo`^ª¦¦†”Ø±oß>„ºˆ¯C¯”��@.\à8+ÂõŽÈgûPÄgÔT³ß°aƒxóJ©©©ÔÝÝMJìxùò%effŠ¯E¯´lÙ2»ÓÂxµë[ì;@Í_F¯ÃËôéÓéæÍ›Ä‰k×®éØT�„Wè¸Pbî"¾½šýâÄ	b<^í²Æ×ÖûÅPãø‹ßX]„)++of^Œþ½wï)±çéÓ§hÅ_“ÑîW|øð�o†G»­ž¯(ß¥ÞW48oÜµkqâÆ�4uêTñ†í±¨ÊÄaÇŽâk2šŠ‹‹ã8	Þìz'ä¶¦ý)?Rj4®xfÎœ‰`	V³Ó7nÜ(ÞÔ¢¥yóæQOO)‡��ÊÏÏ_›ÑÒªU«èÓ§OÜÂ~àÍ.ë¶^¯(?ð»Ñ—dÅŠ4<<L\xøð!r°Å[4„<zeâÑÐÐ€skñõ9^%''ÛŒ€Ã“]×xÄz½¢ü„L£g.`°íÈ‰½{÷âïopãQqq1‘21ç¬]»V|�ŽWUUUÜ.·Â‹]½­Ïz¼¢üë�FÃÎÕ¯^½J\øøñ#-_¾\¼Á�U)))öÿ­L\p43gÎñµ:V-Y²Ä¶V2Ï¤ë§QëíŠ†x£“.Laa!½yó†¸ÐÞÞ®7¦Ç(DÐ*Ÿ£G�â›øz�TS¦L¡Ë—/#à½ð`×5ž´Þ®(ä¸@[¶laµeV__¯¡V®\i[¢­¯âk6Â¼n?pá¹ð^×5>³ž®(ð�Ñ×pÅ…@’3gÎ°ê
Øºu«xÓsUvv6=yò„Vðø2_»®Z·n�ŒŒ#à¹®aP_­—+J„$5¹<@¹¹¹HÂj`F(o|.ÎŸ?O
?:;;iþüùâk8œ


èÅ‹Ü†?Ás]×Ød½\QÆ@†Q�C‘á2«Øàþþ~Z¼x±xü•éØ±c¤ðåìÙ³+¾–¥ŒŒêêêâvÄI·G�õpEeFŸ]ÎÑöïßOœ¸ÿ>åääˆ7ÂŸë iNáOSc“NÂüyÎ?Ç®x,¼Ö-éÞ­(ãä£FäÄí&-:�k/Þ¿�@Ý³g)Áê˜6mšøÚ† Y³fq<Ú‚·F²£sÀz·¢D�t£—Â[´hõõõ'l“••%Þ'Ožl&)Á£±±³Ä×8FY·µµ3à©ðV×uvXÏV”(ò·Ñ;—\½zµ¼Ã‰PQQ‘XcÄ—ÅáÃ‡I	.§ÿ=-zPÐÂ…éÖ­[Äx)<Õu�ï¬W+ŠT;!·QÁ SÀDv 'mEJàA^<v»DŽ±~üøqðÓáÑŠâIF­.…ˆ3ÇÖÖV–¿¶kkkq.&÷üÎ�;¤È¡··—JJJDÔ7fäoÚ´‰‰!ðÐHîo´Z�VÉ6êu(Fô!sŒŽÅ”-´Àa»4Ð—ý“üêÕ+Räñöí[ª®®¦¤¤¤ÀÖxZZíÞ½C~¸f;D2Ë¡×z³ò{÷JkÇÜ¿0&™Å ‰™BV§™&©»`Á¡	�a�\¢¥”—"ÅÂ-ÿŠ%ÎÂ¿(J·X˜»°ºnÎ‘äOWýæý>«©i¦ç¹qÎû¾çû©gcçô¼ßç}Ÿ?¿‡‚à7«ÝétL\ÀƒšÕN„}555åª`ÌËË“¥¥%õ¢Cám}}—à¸nð/..Vëý…Ì4¹¼ìNe2Q�DZ­O§T0Z[[›*`áD233ƒAÓçû[[[YÚ—þIÍõõõa#¨+ö³Œ��Éíí­“ïs@fêþÏÈà>•ÉDAô�Õ–t:iLLŒŒ��‹“¡üfoo¯$'';.ñûã‹hccCˆþËÞÞžTUUIll¬ãúxRR’477Ëùù¹8²Ï¬îÿ¾¤²˜(~´Ú±NGÅZ#¦��îääDÚÛÛ%%%Å·œ•””à8oó#-X/_]]Å&AìqÄ5¾õõõ²»»+.€Œ4Ù—q¬2˜(„ÞXí³N‡MOOŸÏ'nptt„Mt¨*fË©~¬...ªSD¦žžžÔ‹@uu5J	Ûò¢ªÆÆFÙÞÞ—@6"#uƒÏ*{‰l Õj_t:n~~¾:†ä8[<99)EEE¸@'d�)™™™ÒÙÙ‰’¡*À‰^àúl¼ìâ
m\žƒcu!ëãqqqâñxp.÷x¸íh&²Q÷·ø¢2—ÈF÷Lè>È^¯W®®®ÄE°é/6Sáe (_MxáÀ1¡¦¦&™››SåB‰^®Í]^^ÆÌ.ÑÂLSPÖöQ·»»[�Xðûýâ6ÈÂ²²2“ße‚uþÉn¾Ó-„VWW'÷÷÷âF˜v?==Ei]ìPÅvÒÒÒ°¦úÕG
±1aXPP µµµ2<<ŒéOUà„(ØnnnÔ¦Á‰‰	\O‹2»X�ÇW:f£¾j+>>^m²-,,”––™ššÂe]êåÚ¥��ÈB“ßjMe-‘M7êvæ®®.µéÈí°ïòò•Ô&Ÿ‘‘LÕãËu°á
_ jÝ¾¼¼\*++
êK«¿¿ÇÕþ³³3¹¾¾VÓ²Dv+,„Â5›››2;;+¨À‡zêdAEE…êß¥¥¥èï¨m¯Öð;::dhh3X˜AÃUøá²áh2ørÓÙÝÏVûK§CãkxttTÂÙóó3ÖëQo@}<>>ª` rœkG¿FÿF?GÇßÂ²Ï`F™úK‘Cnôk–¤å´DN�y&Ç,ý¼á�œæ­ÕuÏò.,,‘Ë!ë�yºƒ?2´=‚Èa¢­öÎj¢{{àÊÊŠ¹2Îäv?´w*K‰è[«½×íì²µµ%DD.ƒlCÆ™þïU†9Ø÷&Çq/vË¹2Íôzñ5•�D.ðƒÕvt;vv¶ìïï‘Ã!Ë�i&ƒÿŽÊL"ùI÷â 4”E	R""‡B†!ËLÿc••D.T`µºCNNŽ
‘Ã »�a&ƒÿ•‘D.ö«Õ>ê>¹¹¹\ "§Mû#»Lÿ�*‰Â@™Õ>é>YYYrpp DD6‡¬Bf™þŸT&…‘j«L6îìì‘M!£L7üT…¡?¬æ79"èóù„ˆÈf�M¦Gýü*‰ÂØŸV˜Z[[""›@&™ù	¨ì#¢ˆZ“—€ÔÔT™ŸŸ"¢C!“Ìd�Rg²�˜˜(ÓÓÓBD"È d‘Ù´?²Žˆþ¥Æä% !!Ay·82Ùƒ2ü‘qDô¿Ë×ºUtt´ôôôÈÝÝ�½2d2Ùc2ø_sÚŸHÏï&/h„ˆèµ c�5&Ù„,S™FDÚ¼V»4yÐ¼^¯\\\ÑC¶ cLÿK•eDdì�ÕÎL8�ÇÃÒÁDô’�)ÈÓÁÿLeýÍÞý¼TZ†aG8A`CâBðP¶0r#M‚	B¡¶�ˆÑâljþ	Ä…„"¸q%ÑB0Ôaf1èÒÙ9AcFdÐ	‘#£ âñî¾‚"{ž×#çÇ÷×p®ë9?Þ÷=@²Ï=/bŠ—ÏçmyyÙ  #m‰6%öð¶@fžç1ljj²™™»ºº2 ˆ¤íÐ†hKbÿçü¥/p·>ð<õXÌ…BÁŠÅ¢Àÿ¤ÍÐvÄ^é¯<[àÎµx~õXL†‡‡mooÏ à6Ú
mFìÎh›ÂF(›÷<³žRL9;;;ù#! ÿE¡­ˆ=øKÚ¤°M ÊîÏ�žbLQ[ZZlvv–ë ü�6AÛ �ˆ=ü‹Ú¢°I îÕ7žƒØëÆÆÆìèèÈ @[ MHø½ÿ€ÿò*ä6ÁØçlnn€º¥øëþ~nóªÔ'ž'±%nmmµ……»¼¼4 uC�W÷µ)‡ÿ“°9 *ÆûžyÏuL™s¹œ���Ûññ±¨yêº:¯îÇü×Ú˜°5 *òâÀ<§‹Iww·mll€š¥Ž«ë)ŸúOµ-\ìT¾/=/cKÞÜÜl“““<8¨-ê´º­Ž§þ/Ã¦ ¨{~óXllkkË T?uY�NÙmHØ Uç�ç'ÏÛ”çææìââÂ TuWN½Ðï­¶#l€ªöµçÀc)�ÞÝÝ5 UC�M}œ¯r6@Íxèy–2mmmá“Äùù¹¨Xê¨ºªÎ¦þÏÂV ¨9Íž)ÏEì0444ØÈÈˆmoo€Š£nª£êjÊÁ¡m ¦}åùÝc±Éçó655Å�@…PÕIu3¥ÓÚ‚°	 êê.�_<×)£ÑÛÛkëëëvssc î�º§ª‹©ÿµ6€«ü�ú”ó|çy�2 ���V(lß ÜuNÝSSÿ×ê~Ø  uíSÏš§”2&ííí6==m''' lÔ1uM�K=øKêzè< 8y×óÈó‡ÇRÒÓÓÃÏ@¿îWÇRû©n«ã¡ë ð/>ó¬y,õg�ÑÑQÛÙÙ1 ™©KêT–¯û•µÐm ¸ÅÏ#Ï�¥>;`bbÂ@4uGÊrO¿òF]æ‰~ b=ô¬¤^ tttØüü¼�žž€[©+êŒº“åà/©»<Ô@Ök¾õìx,5]]]¶¸¸hgggàŸÔuD]ÉÒ5uU�å·~ wåCÏ´§˜:LzBY__Ÿ­¬¬ð'C€uA�P7Ô‘Q]€2øÂó8ËÏ¹\Îúûûmii‰ÿ@=?·_PÔ‰¬_÷?Ý€2kô|ïyå±,o†††øF õø‰_¯ý¬¿òJ]�€{ô‘çgO1ë�ÁÁA[]]å� jùà×k\¯õ»8ø‹ê^è þdïìB«ÊÎ0ã_RÅ‘(Z*QHe¥D/rQ¬0Tg@b›(
¢• ¢ƒP™Ž?WV+bdøsÑâÍ¨ˆŽb@ì ƒ?E'7F1Ž$ÕÚišÐ$_ßgÝ¶¥âÙ'9IÞÉ9{­õ}ïqy’}ö6Æ#µò¼ì‘ñ¾Nš4‰¿ƒ¦¡^½zÆŒÈ2™&Ûd<ß�¿GžO¯9cŒ)ÆË5²EÊÈÇ%K–Ä±cÇ|3R!»d˜,“é|”-rMz­cL2U6Ê{2ò•kžïÜ¹3îß¿aLCFÉ*™%»d8ïÉÆôÚ2Æ˜@¥Ü.ÉÈ×™3gÆ†âÊ•+¾–€)6È$Ù$£d5«�ÿ‘Üž^KÆ3™%›äc˜ïyË–-‹ƒF{{{3Œ�A²H&ÉfVÿcÙ”^;Æ3
¨’ûe›Œ,¬ªªJ÷DoiiñõÌPAÖÈÙ#ƒd1+ÛäþôZ1Æ˜QH•üLvÈÈBî’VWWÇ��¶¶¶0¦ �-2FÖÈ\–‡üÌ¿1f¬0_î‘­2²rîÜ¹Q__.\ˆ—/_†1y@†È™"[d,KÉþžôZ0Æ˜1È\ùyWFV–––Æ¢E‹¢©©)®^½ÝÝÝaÌ;@VÈÙ!Cd)ë�ÿ.™OÙ7ÆSR!-oÊ^Y9qâDþ!OÍºvíšÿ3`þÛ¦O6ÈY!3Yoú½d›Œ§¬cŒù~ WÉœ|)#K9S{ñâÅ±cÇŽ¸téR<þ<Ì˜„Þ“²@&ÈÉZ2œ#Ó)ÛÆcÞ‰äç²]FÖrëÕêêêX¿~}œ;w.ž<yýýýaF%ô–ÓkzNïÉ Y(„íd7eØcÌ{óc¹Y^—ÿ�Q9ÉkõêÕqøðá¸uëVtuu…ÙÐCzIOé-=.T~È&%«)³Æc2£\®’Íò™ŒB9yòä¨©©‰Í›7Ç™3g¢µµÕW ,~è½¢gôŽÒKzZHÉb3ÙL5ÆSPªäy]~/£�NŸ>=jkkÓ¦’ËåâáÃ‡ñæÍ›0Ã= ô„ÞÐ#zUè<�9²Gýù}cŒÊä
ù;ùùO…”¿O›6-–.]qäÈ‘¸qãFttt¤{¾›Â@m©1µ¦æÔžÐzRè¾“-2FÖÈ\Êž1Æ˜¢à‡rµ<.Ûd¿Œ¡�3ÈgÍš+W®Œ­[·¦ÛÀÞ¼y3ž>}êË¿ÔŒÚQCjIM©-5¦ÖÔ|ˆì'KdŠl¥ŒcŒ)jfË�dNvÈCiyyyTVVÆòåËÓ»Õ}ûöÅÙ³gãÎ�;ñâÅ‹èéé‰ÁÁÁ£°vj@-¨	µ¡FÔŠšQ;jH-‡Z²Bfrd(eÉcÌˆ£TÎ“õ2'ËÉ'L˜1oÞ¼tMù�7ÆÞ½{ãÄ‰qùòåxðàAtvvÆÛ·o£¯¯�Mr$oð¬�µ°&ÖÆY+kfíÔ€ZPjC�†K2A6rd…Ì¤ìcŒ5Ì–ÊßËû²OF1È¯¶gÌ˜sæÌ‰…¦_y766ÆîÝ»ãÐ¡CÑÜÜ/^ŒÛ·os¦{º�Íë×¯£··—Ï¸³áÅ¦ÎXŒÉØÌ�¹0'æÆ™+sfî¬�µ°&ÖÆYk±ØGÈ™ð;}cŒ;TÊ:¹_~%»d³eeel¤éóì,`så*vé�ôÚµkcÓ¦M±mÛ¶ØµkWz—}àÀ�ôø£G�r'»ôîûäÉ“qêÔ©8}ú4ò5ßãg<†ÇòžË18ÇäØŒÁXŒÉØÌ�¹0'æÆ‹Ý.zMÏé}Ê€1Æ˜1ÍdY-ëåiyO~/ÃŽhé!½¤§õô8õÚcŒùTÈ¹E~!¿‘+ñ†ZìÒ#zEÏè]�o¾cŒ1&fÈŸÊOd³ü³üN–xÓ.é½ 'ô†¥^cŒ1¢\VËUòSyI¶Ê¿–xc.”Ô¶•ZSsjO|ù]cŒ1ÃÉ8Y)—ÊuòSù'yO>“=%ÞÀßÕjFí¨!µ¤¦Ô–§ZcŒ1EÎY-ëd£ü\~)ÉÎ1~^kï¤Ô„ÚP#jEÍRíŒ1Æ˜QÄx9UÎ—µr�Ü.�Èó²E¶Êg²[öÊaö2wÖÀZXkc�¬•5³vj@-RMŒ1Æ˜1Ì89AN•Uògr�l�;äoåäåUùµüV¶Ëç²KvË7òï²GöÉ~9ðNZä1<–çð\ŽÁ±8&ÇfÆbLÆfÌ…917æÈ\™3sg¬…5ùW÷ÆcLþ”Ê‰²LN‘Óå�äOäb¹L®�?—¿�¿”ëäÇr½¬—¿B¾æ{üŒÇðXžÃs9Çâ˜›1‹1›9ø’¹æßìÁ�     �ÿk#¨ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª*íÁ	   € ÿ¯û*      #¹Æoå§s«    IEND®B`‚‰PNG

   IHDR   @   @   ªiqÞ  
§IDATxÚí›iˆTËÇ»ÛqÜ÷}qE—pù$
A�Ê3âIô›>E.®<P4¢Ñh1w£>w1bœ}<·`ô=5ˆKDÅÝîž®œ_Ñçrç¶sçöÜig<PS5÷Þ:çÿ¯:UunÝêÈWù*_Db’ª‘jÕª›8qbdÔ¨Q‘.]º�l™kÜÓçl�*.Õb±X5cLdìØ±‘fÍšÙ|Ýºu‘mÛ¶E4h�/ÏÔ&Qæ÷ÜÏRèª*¤£€q.Ô‘¬¿¤ßHúƒ¤ï%ý é^4ý/‰2×¸Ç3<Kêªt’a£2÷89½[S²’¶KzØ®]»ÔðáÃSsæÌImÚ´É;vÌ\¾|Ù\½z•DÙ^ãÏð,u¨‹t¡ÝØ¨,¡`øC¢·›J6_ÒO]»vµd.^¼hÞ¿Ÿ2Æ$R©TBrRRR‘'%ÝÏP‡ºè@:Ñ�¶áØC…‰¸o5¼´U«V¸ê·òÿÿlŽ=šJ$Jr©d2™ŠÇã\7RþlâÏð,u¨‹t¡ÝØÀ6E,†Š U7ÌÏÏ"Ù¿ûõëgÎŸ?`H'%)YŠFSiâz–ºè ŒØÅ¶°‰m~SŽE'£¹ŒYòuëÖ5ë×¯·.Ž+§{2…(¡²ŠÖE:Ñ�laÛ` ‹bËõ˜�áv�:uj,ÿžêÓ§�¹{÷®ÓÚÛþÄÃ7„z6±°€	l`Ìe0Ãx/�ìæøñãéé8¸ ä&N*gA§×#l`Øk.Ü^ÉÿgöìÙ�ã’ôˆÒ	NË.ÀazÝ” o Y,`Ëu8Ô¨Q#Z³fÍH¯^½pûgÍš…Á ŠŠŠ @žá:÷õZ¶=@7¹zCl`+˜ÁŠ|£F�È¢¢E“ðÔ¶¶ö€’{ýúµ‘PÖL™2ÅH\ofÎœiöïßo>}ú¤`7‚›<òöí[³sçN3uêT«{úôéfÏž=æÃ‡ªÛ=$â`+˜Á‡0¢kì’Þ½{C(@íyäìÙ³¦}ûöe�.–SçæÍ›JH	&éÒ%Ó¹sçÏêîÞ½»¹víšÛSh‹»`VaÆ=ò‹:uê]¿~]%Ïºod-¶€äy'ååå‘Ûë-[¶4wîÜÑÞ*µT÷•+WLíÚµ}u7nÜØÜ¸qÃÑ­XÁö2ÍÕ«W·ùš5k(üsåÊ•¶¡%Jsf{Ü»gÏž yF=69rdàÐ¼ÿþ�t:Ô©60‚Ì`‡ƒr
*îðòw}ûöE1‘�3Ö�C‡iï�û&Yš�ôŠã®%‰Þ;}ú´ÖóÕ«Ã¡°°Pëƒ±˜Áå8Ì%oÓ¦MÉ~>pà€í<"1
Ú óçÏÔ zûöíFë—Ôûô²lÙ²¬toØ°¡˜n°‚ìp€‹rË¦÷;hÐ «�	&-Ž–œl@ÊfGà˜;wnVº—/_nê«§‚sp€KV^ ÉþE¯¥Ã\u+‡ÀªU«�T7¦7|À}�Í¦X&Ýõg
ìp€œ‚ˆ3ó˜7oÞØ™ñ,Qld0I¥ŽÑ¦M›š§OŸêDXê
pëÖ-�äJÕ]¿~}óðáÃŒxÀá 8)Ç îÿ��ª½ïª†&Mš„b–B e T‹/Ö¢¾ïì¯Ã`Äˆ~ºuùeÃD;Fõx½ 8éêG"9—û6T}ùò¥8p ‚"á–Å<cÌ˜1€óÖÍÐç&¿{÷n#a¬—´W7�ÄrìÕ�1à'ËÍGôfW	ã�?F“‰W±ÛÝ&¶6l¨@� hõêÕ�/®¤ÆTò„¹:¶›4ibCß-ZÓÝ¼ysV
êøê#E¸À	nÊÕ/ìýÕ€lïëØwI‰/;ÏŸ?7gÎœ1{÷î5ìåñ~ ®”ü¾}û ï¸þ‘#GÝ„Üè¾pá‚yõê•Ÿn¯ëp‚›_xœ—ÎOž<Ùâr¹¿_#x_}Ý.˜<«QŸFy‡6qÖ­’9âp‚›ÃÕ#úùóÒ¥Ku,-tÕ¤Þ@%oÏ”J²�ÖÐ÷àÁƒîû^ÝžÙÞŸ¾*Ã	nW�èg)äÔ–-[œ(ñ#Ï²û…Šaàº~‡I Nps¸zE"&-
]rIž�!ÌöJž1îC>T$á7åê'??~ÜVÉù'NÙµÑh‘¥ÏÎÚVà@'¸EÈ5zF äOž<iÄò»víÒû>[¸€ÜJdÝ¡C-þƒµX‡@y“g©”Í
g]ß±cG òá‡ œà¦\½Â�ŽmÜ¸Q'Ár%îÜ9“þ˜Ab1(ùÐ“ œà¦\ýÞþ¸páB[‰ïta—A%O S¯^=‡<³²yÕz„\à7åê};nÜ8C¥°��ÆéD†òyÛ!¿yófòÞ€'| ”€Ü”«_(<œ½¾ôçê2‡Â„«º³«ï	$\ÑŸ|¦î/^”9&ãQ8ÁM¹ú½µ“úí½{÷B½É3oÞ<Ó¶m[þ×­« äÉ8W`,XÀîo¨—!¸À	n.®™Ò±cG-^Úºuk¨×aïŽÐÚµk}É{uóA„ó ª;Ìë0\à¤ƒ|ùýèÑ£Ñ“7+ó†Qžî	ø“ÏÜš1cFè°Ã.pRŽA¶ÄzˆÛ%=z¤Ã Ô–.ûäÉ“R¿¨îÛ·oC0Ô–˜)Â.p
ôåX‚§V¬XQå7Eá å–Í¶ø¨nÝº1Æè–*·-ŽJ°Ã.Ê-HèÞ ®R˜ž¼’UðÃHìp€‹ró—ÌÍ‘_Ê–2³}Rç‚ÊþiLÇ>˜Á‡SPáp�k­< ßû52¬ôG5ö3ØÕ±á”•ˆáhz÷¤³d/èq8èa¨Jøy\É�Ì`W.aH|‘$ôŒ ©’�€¼âI�¬`v8”U–,YâVð�|n&<�{¡¢�È8äÁF°*y8„>ë9!ò}Œ9Ž¦é!ŒWà!)0èØ�ƒŒ`3ØÃŠNŠQrYžòÙT F÷î�žL…“#ç°€	l`t0—§è‘3ùÐ‰�¿öèÑÃÜ¿?Ng°~Ó_ê $¶°I`Ø¬9�MUù*ùÞÆX/ÒCê¹:*ë±‘À6À¢Ës}X:J–.�‘ì9o…Ïž=Ã“n�å4¼Ä“ØÂ&¶Áà@Û—mY‹[Köù’KLÎ�„$½£“¤žÿñÝï÷Þ§uu’C'º±�-lbÛÁRÑ!!‘Ù`ÉþÞºukvqØ…Ñ_‰¸4AOBÌH^,¥¯û±uÑ�.t¢ØR—·*X¢"1ù�OdÂ„	 J*QØ»!C†pF ÅÞÁÇ�µAâäÞä¾Ç³Ô¡.:Ð…Ntc[Ø¬l? Ò_m¨w¤Og•±ù”hqØ°a©iÓ¦¥-ZÄë1»Ã$[æ÷x†g©C]t +ã×*•X ó,¡õ% é×„’þ”~Q9A¢Ì5îñÏR§„_V±=%Ë’Óòë/ß
Þg¨ë÷[ÁªÖJ&��ÈI/ÛD™kÜs<ˆ:_å«ä\þNÏ0¨œž    IEND®B`‚‰PNG

   IHDR   `   `   â˜w8  ÕIDATxÚí�{ŒTE‡»g QPy‚HÈ*Š’¨k„„‡€&Âê
kÄ¬î.a�¢q‰«ÐtVyüŠ
®¨+ *ˆŸø Œ(.ˆ ²Q^.OqºûÖž¯sOoYi2ÓÕ·{zfú$5÷Îí{«Îù�S§ªNÕ­+S™ÊT¦2•©D).©ÒJ5x¦Ây&+“àcb'NŒ=þøã±-[¶TÜ{ï½Mn¼ñÆ¦$Î¹ÆoÜÃ½.•RèjÝ_|qlüøñ±‘#GVœqÆ�š5k6¨¢¢b´ü4]ÒK’ÖJÚ(éß’¶‘8ç¿q÷òÏ’y‘'yk-)+#áÜsÏ�)uîÜ¹]Ó¦M'§�JÚ é�$Ì98á„‚öíÛ›óÎ;ÏôîÝÛ4È<˜Ä9×Ò¿q÷òÏ’y‘'yS†–GÙªü<©M›6 ëÒ¥Kf¸\["é¿€&ÿ\pA –k{ì±ÔÛo¿�øæ›o‡Nc’A�RržNœs�ß¸‡{y†gÉƒ¼È“¼)ƒ²(“²á^”¯zíjl[·nÝ¥²²òrú€iÑ¢EpõÕW›yóæ%·oßžHƒ’ «GÃ!•J¥S2™$eþç7HŸ±(�'ySeQ&eÃ¼8¯wV/‚ÆÅ'ÇN9å”nâŸçÈµ#€ ~9�Æ3¹k×®Öl�g‰IAæb�’*GŸWÝA”AY”IÙð /ðoð¯õ¥6Ä+…ZµjE5oÝ¨Q£irí°k®ºêªÔš5k¡û€ - 0lˆcŽ¤ÏØJQeá5(Í¼À¼Á#¼Â3¼×ÙÚ�Ç3UYüíïÕÕôïß?õþûï'À&FA÷ ÜK!ªŽÏOð¦®	ž3¢ K]",§eË–1ñµíÄ¢^B¨3Ï<3õâ‹/¼mí G«»Vp	ážá�™êøR•+›4i;þøãŠåìD�[n¹%±ÿþ",Éø‚*Bùâx…gxGdA&d+e—“i¸Ž;î¸±ôÃÅ�K—.M[}Ø(z _ô¯ü›æ�™ÔÆ�µÁ�wïÞ=.–2Ë¹ä’KÒõÃêÓBáoý€/¾"àž9GdA&dCFd…J	üØ©§žÚ¨qãÆ‹`ôºë®«’xX}iÕÎ‘™�‘Ue/	ðO>ùäÆB‹að¶Ûn«‚ÿ°/ž±zR] —_d@.#2"+2×ª(W»™ÂÐ³0vÇwT©¿·\ŽÛw“Û-V£ëòÁ5ûÛ%eÚdDVd¶ì°øàWq.~q:Ýzë­.ø¶ ®pÙ,�d_�x(äÏ½îºý?«�™CÙÁ‚†¹¸]Mé#3ÀúŒ\{íµiG�`6ø®Àûöí3Ë–-3>ø ¹ûî»�ÄîÍÂ…ièTXWQ‘[½*÷‹/¾0O=õ”™0a‚¹çž{Ì#�<bV­Ze:tLE!×�™‘ÀLŠ6ÂeL"!ß¾òoUÏž=ƒƒÂaVð¡üÑŒ7Î´mÛÖÀ´›$/sýõ×§A�Œ|è�wÞ1Ä…dåE¢£fúôéæèÑ£<—U	‘ÙÁ ,ÀlŠÒî6oÞ¼µœo•Q¢ùüóÏ“!ØYÁ_¿~½9ûì³M8¨I'a6“ˆÁ¨ð2à1óçÏ×ç#Q€"5Žòµ<Ê·¿éï½zõ2ß~û­�\%¨¬È`&Ú.2ÄPçÂä‚¡ÅfãÆ�F"Œ&Ö«pY“Àù“O>é*Á|Í—gƒ~L>0xå\&lÌ÷ßo 7@¨2ƒ÷‚‰bT0ü \Ïo)ð¦›nB²LXÁNÐO?ýd¤Š*ø«MúUóñÇ«¼k�‚/ñWÉÕ&uQ×\s�*ÔMZ°à^°#°ŠÜõðç´ÓNk.‡Í2í‡e¤\¿¯=hêÔ©9�¯I­sÈ�!¶åyûÿŸþÙÈèÕV0)'ƒxùå—mcpÛƒ4`6!F‘»¢Ê°¿?†fÏž�Õõè%œþù^BÛŠÀ…©à¹�mK–,ñæ´¸µÑuE`Â½!F‘Ö5t”Ãn‰‹ ùÌ$
É­ò6l°ö|ÆŒv¯ÈGŒÌí<sJê®d‚ÆìÞ½Ûn�]·€	Ø€X)v‘Y¿ :9¬ŽÝtƒk¡Ÿþù¼­Ÿã¨Q£¼ @õë×ÏåÅGôæÜÚèöŠ°á~°Rì"±~ño,åØuÙe—Qžký®à(�y)@]y+€a•ù*€ôî»ïÚ
ÈZÀŒÀ
ÌÃ(|ÿ_aâ¹çž³}¿K\×^G$5àöÛoÏ»\~ùåQÔ Üê1Û#0â0‹¤ÈÚ2ØÐµkWsäÈJÏjý6sŸ~ú©ö~òRÀÌ™3ónÆŒ“wÀ~ïÞ½N�µÆ`V`vù. Š�tÒI}aâ¾ûî£ä@ãûÕLh0ÈÇòt™M›6åÝzõÕWLoC6lXuc{þ  +ž;ÅÒ×ý@3aä³Ï>C"FU'8Ö«ã _¡}Çîˆ•µGy�V¬XQ#è¼X!Øåå†¤AiFœƒ†Ìi|«¼ªªÊ\zé¥^#a‰«`ý^
à^{Mž<ÙVnN#ááÃ‡gE¸ä6Æ`v`èë~XVÒ[±Ê¨©/V?ùå—_šÓO?]• ÀÇôµ68>ër Âzeµ›*˜¤!‰jcA]t!t[5u}˜‘*¦>îg\ØÓ¾�˜°ÁÛ¼y³éÑ£Gh; æ!Ó|ô Ôuxƒ¯Ï®\¹’øŒë‚®ÊÐdóÈŠkwðU#ÙuÒÌÈ}Ü�ö]—I–IŠ¤ú¥”Àóæ¡‡bqVV«ø›o¾ÙìØ±#Û|€—å3¹râ‰'þÂ¶k×Î,Z´ÈÜpÃü²ÖDâFsæÌ±ýædÚ€Ø�¡×x`À€ø®L^�¯�/†TU„¬Å4³fÍ2“&M"`—ž!ûá‡lÊü7ß|“È/À—õ=æÃ?Ì<ƒ²©mS¦L1÷ß¿yâ‰'ø�vÃåÛw’;0Ë\ý?ËÇy{!q×]wÇÿû.ñ¨nNØ¸Æe¹nÓˆÛà3'ñÁhÃLY¹Ì	ûv�°C°Tlkêÿ‰û�ù§Ÿ~:©
ð l1ôÈVE¸–O¸@Öq*ø÷öÞ{ïÙJ:Ö
�Èæ£U``©Øæ|ã6ÀQ�«‡|\@vÁçøW%é³9ðâGnC–¹* šBCµmÛ¶Ì ¬TÈ÷bO}†Ý?³víZ�•?¹1Ø�!Xú(`žÄµ‰�¨J|NX|à·ÞzËµü¢+ ìÀ,sQ€6K;tèÀÜnB(5ð?úè£¬à¯^½Úüèù;0KÅ6—1ÀJ‰ê‘™* ¤Àÿä“O˜©²ÁO�xßxã×í�j…W°C°ô¬>çœsÈ'©™–
øÄæeò[ÁÏ,îzýõ×kÕò]~ÁÁ2æA«”øÌ50¢UðuA×òåË=À/šVù„!–ŸuÖYt©ÔÕ:øDHñ©6øòæŠyå•WJ|—o°C°Tlsi„ÿ%–Fø@P›à³ÐtìØÑŸPFÉ€ïòv`–¹Ž„¡Ù2�!N£ÝÐZŸˆj§N�üÌŒÙâÅ‹=‚wÅë†‚‚¥Ï8`¢‹ð:®ðeV,+øz$�¦–Õh6ò‘0ØÁ+Xæ¬ yp¤ˆ©ÛsQ‡"¼Àá…ü|-?Rå¹s`Ï`™ó@LbéýÂ•	©bã´œ¯¾úŠeí
ºNä°ìÃ×íp_Qƒq`ß`™ó@Lz�åp�‰’b…£µ!ýúë¯|Z¼Mãcùn9EGƒ‚eÎ1ñ_T—Má„<kÐ>!ñºR·nÝŒþ3Ï<ã~¶Éž‚NÈ�ÀìÀ,}&å¡ùLnX=!2�|J’È%ë@	)3ì¾Ð1wîÜHÀ×QôÐ¡C9G>%É=vìÀP1õY’Hã�•&ÔpRK·�$ÀÈ¾×[2Ó¦MC±�”W÷fä†Š©Ï´ä¯äP%¯ej;rY
GûÙTIµ¼Áà�È³ËRNÁìÀÐÂÔ‹ÖÉpšÐ*’ra–mý¼ÊšoWSÁ'Ta/M)èÂ,NÁ
ÌÀ.Š÷Æ;ã�‚.M${iº–çÛãù/¼°(KÝþ?ØÙXz5Ä2áÑ�ª$/¢ç¥¼B.ÎEqQ.Î…�B-ÎÍöÒž3°óu?î&+hÑ¿ûî;] U^ž~ŒÞ�˜E±‘„.Qúå¤6ÆaÁþçe½ ŒxÌ"{YOÞ³j"‡õÒ�gÛ­åW”ë0«¾}û6‰òU6æø“Xê­c‚òKzŽõƒ÷ƒ•…]4$–”®ây1YkAƒMU­LÀŒÀªû=³"~¡Ò
(¿¨ýëî#³ÈˆùmÍ#;Î†L5Ø­
Tv°à^°±°ŠœâáK{­H|‡ ›½_DƒÙ¬Ã–ÀLÀF±*ÔfA•’Øt4Ì�=:aíŒØ`¶«±wTî°£X!I,#ÎQ„ º1I’c6fÃ&•Ù¹,,l
Nq�)Ë¶¼(G³nÝº¤Ö„ú¾e™ÊˆÌÈ`&`S´}ã¤š2Bþ5Sn²d„¦”2X7í{øá‡«Ý´OeCVdFv0 0)ú&ÝbEÐ†±·²t;S2¤J¨wÛVªLÈˆ¬ÈŒì`àì˜X+ÛWþYþ¥×“´”P/6nuÁGFdEf�í*#wEvM%—ø’QRV5¤´±* °EQ”6¸È„lÈˆ¬jù` •ŠFP5eF ìI��ÓKrudA&dCÆRßUn@	¿aP"]JV3$¬�¼Kº6Ø¼Ùv#² ²!£~i)A˜¥wÔCÎ7S]GŒ‘8pà@¦]pÚRÛ)=ãïáÞ‘Y�	ÙJ|·a–è![Ú·”ªúO¹Ä@,%o¯hmP·dP«À;<ð
ÏðŽÈ‚LÈV¿ ô9ìW$¥�´?äãô<Šíjl×À<Â+<Ã{�ý’Lc1²ê��·u�.Û1Þb¼óÎ;“ÄÏý>eý'¬àžàážáÔ˜êü÷Ää-Æ>òÿÚð-ö@Y©ðýEC?oÅ1Ÿ¥ãÙVdÛ¡sŽé²á^à	ÞàÑµúúòE½ô'ee‹
iÐËµ5X›øØàŠ+®$$‘Ü³gOF�åŸÝÏfMîàŠk
¸‚N”E™”ðOð�ðZ_?uK)>vìX—å½ÄÊx‹|_¸±FÀçiYW/K[KZµ#§¤€“y‘'ySeQ&eÃ¼À¼5”OÛVêz�l#ýë?†Ÿ´Ýºƒ@>ÆHä’ï¶¤?kûÚk¯%$¼�ØºukbçÎ�	ñÝ$Î¹–þ�{¸—gx–<È‹<É›2(‹2)[}<5Ô�:“”ø¾p+ñÃWÊé¤pqÓvIGC õ£j†“eí$Î¹¦¿s/Ïð,y�y’wÖòËôËÏšË«�t_Ù0<Ö§OŸfòV|W‰¹÷ŸM·ðo’þ.i†¤GIœs�ß¸‡{y†g%ò"ÏòçÌsQF„ ÅËô�ÎUUÖ$•]K™ÊT¦2•©.Ðÿ j<nF›ßâ    IEND®B`‚‰PNG

   IHDR   €   €   Ã>aË  F‚IDATxÚì}x]Å¹í‘ä	ÂGÚ#7	éí¦¼.4ƒ�Ü›ZJè„ÐcpÁãŽ�Ü$Ër‘,	7Y66ÆŒ1Å`‚Wõv¤£^­ö¿µþ3óýÇg›<›G
¹Þ‹™ÝgÖZóÏìÙ[Ç¡cË±åØrl9¶[Ž-Ç–cË±åßn),,‡JJJvïÞ�ðâ‹/*^~ùå„íÛ·'¼þúëÌûíz�å9<÷Øò)X>üðÃP{{{HDB¯¼òJÂûï¿Ÿ€|"�ôpiÈã£–ØcâÎMä5ymîëèèÐ{[þIKvvvhüøñ¡¥K—†V¬X‘ÐØØ˜ð7„öù^'b¹è¢‹N½ñÆÿ×�wÞyÚý÷ßÿ5âŽ;î8�Ûx*�á±"ò7�Á{._¾<aÉ’%¡1cÆ„233CÇ–¿ã²C7ß|shêÔ©¡µk×&tww'=JKKµUz|ýë_?iÔ¨QßÚ¶mÛÀýû÷ß‹pþD$YÜÐÐ°¡¹¹ù­¶¶¶ý¬ ª5	æ¹�ûxL}}ýžƒs'ó¯¾úêÅ#GŽüÖüÇœ{¯êêê–�eY·n]Â”)SB7Ýt“–õØò	-›6m
4(4aÂ„PMM�†õùóç« \¾ð…/œ˜••õË½{÷Þ‡S›ššÞ†˜����ÝXä£î#‚Kð8^‹×äµyÞQè—§žzê‰>B¸2%Á‰ŒN=ô�–ýØò1—õë×‡RRRBÓ¦M¡E&µ¶¶&ú}¿øÅ/NÁÀí×hýÏ@”wÐ'·{1½°]]]Ò‰ÿuvvu(°D3]D7¶~½K�ÿx�U.±†Ñ”÷ä½Y–å—¿üå)¾|0K"Ëüä“O†æÎ�Âà2tl9‚eåÊ•¾Ïe¨O8pà@„V/|/ô³}0:Ÿâ÷B má��Œ3õ¢bƒtC<ù›èTà@ÀÖ¹¯‹@¾Ó]OäîÁ}îG×±·¨¨hÆ}PÖÞ@hõêÕ‰èBzÀ	.bqÌ:¶¡©©©¡éÓ§'€È6lH<í´ÓBÀ	èƒ¯CøßÔŽÅµn/JÕh�æEWñ�vvH{G‡´utJ}{§”µuHak‡hí”}À^ä÷´t:`8 `_9öÕ·wÈAœ�@a�½GÁ{Òqüy%XF”u#Ëüå/ùtì
Y'Ö�uLKK[Ür×]w…>÷¹Ïi¢'íÙ³'#óBêÉo¼ñÆÍuuuo�`/:Co'„í˜W¡Uä[!Z9…mî�·šÚeS}‡¬­ë�Õ@Nm‡¬ –4tÿÊšvÉ©é�ÜÚvœÛ.›q��²·×nÃ=:ô^zÏnW†ö(°Y{‘ÝÀ[¬ërß}÷…0vHÜ¸qcëzÒI'iÝÿÇ.xc¨W°µoÙ²¥Çw¾ó�ÐOúÓÞ|óÍ»@Þ{ ”Âw3Ü·G…‚àÒ‰´º­‚·Ë«¢­ –B@b9° ø¹À*ìË…¨4±ù5µÈÜVï�ã9í²Òãùšv@‚ãy/šŒ÷fÌ€(# ÑÉ2»²Óe�~þóŸŸðÝï~7Äº²Î®þÿóŒðÈ#�„®¾úêÐ•W^™€<Ÿß°™ÏÕ>·±õ Ý ²‹dFIe‹k—. þ`»ì…è[ê!8ÄÉ®>(K‘.VÖ¤€�:ˆLÔúÔò«¼Q`š%Çà>"z�¥zOÞ›BË¢e‚Ú M`F 86Q#à	aÛ²eË°®¬3ž$z�ƒ«®ºJ9ù·_úõëÂ¨Y§X‡¢­ž- áñô‚‚‚Ù±P|’FTA,Ð”´¶Ë¶úƒ’â³"åyÀ‹N¬ðùZ yÎ)$,8ÑÝîáE÷yw—òì~,Ë’ƒu–�eì`™]ÙY_Ö�ud]xà�o°î›7oî1tèPŽBeeeÊÑ¿åò£ýÈgùLOá9ºOÚºuë-˜U+ñÂƒBˆ®öƒÒŽ´¨ýyÝAméYÀ2€ä¯@ºœ`žÂ› ßŸ®%×�¨ÐN˜ê ¦z~,ô€OÝ}–¹²=_�¨€²¶ ì(7M€´‚ucXgo!ä‚œ¸úw[¾öµ¯%¤§§÷¼å–[B—\rÉ©yyyÉl%$„�ènƒà� ¬(h>(jÙÂ '¶¡ýÐ<…¨Ìf¤
Í›àŠºC[>÷›ÚƒâSx…¿?I¸í4B¤MñÊžß¬uÑ:±n¬#À1‚Fr@.n»í¶PFFFOrôo%:ÃÜ:ãŒ3srrzr}æÌ™¿ÂTë/<¦`»HN;Ð¢ªZÊ�—©á•m²,ÔøuÞ§ �\h`•
L4ÁËS|;_óÕîº=` ”�edÙª­¬KÕ¬ƒÖEëÔí"ëÊ:{#�‹Y³f�%"œ'èI®È×?µËqÇÇ
è[ºßÿþ÷‰õq	HïÀDN*N(~wk[›tl“f¤;H^›dT1uˆXÞ‘ìHw"hë4¸îÁLÀÔ`¢œ)†qâë5	mÌˆÞ ®lZN¦+ïæ‘î¬�Ö±ue�Yw@ŸnÈ	¹qõÀ 9Ñ¿á$—Ÿª%)))ä—+®¸"iß¾}IÜ¼sçÎ1¨°†ALívJD)kj“5 ,Âg“0 ,‡”zx´‘|¿g g VÐ ‚&1ñq�8SY÷£÷¶²°Œ,3Êªˆ¨´Né•m²ÛJ›Qç6˜À�\�rCŽÈ9#w±œ~*–„ëÂÐ·ùÁÞqx>•ÔVÏ
·@üƒm­Ò¼×Ðª}æŠî�Í´ÊÁZa¤#5˜@ ÙDó&@
¨¨Á¨gžý¼f‰X.+óZ�jÖÃ¡
ëÀ’*­«Ö¹Ýq@.È	¹!G|ðÁrFîÈa€ÛOC¿Ùe—õ@–ˆ×ë'c><c%;[ZZºYaV¾¾¥ýc«,®)^ø*¢¤UÜf0’ 5�E„å‘�¸nBÆ �©3�]<>(º…ûHlÈ'4H™Í 4 Òt€u'ä¢)¹!GäŠœa†ôd¼I$—ŸŠñÀÃ?zî¹çB—_~yÒðáÃ{öìùy<ó®B…X¹í@…ÃÍ­’¡øFÓ,¤.O ¸|›ÖDœ	TlÅáÍPCC¸®ûÌH„‰—WT¡LU¾Œñhµú©øÎ¬;ÖÉA¸©œ´À-jrEÎÈ9$—ä”Ü’ãéå‡?üa\Ë°õôcékN|V�m–’Æf�×Š>Ñ‘â4@œ	@®7@Ü q™‰¢ð&0#ø–Ï4Ø]Aá™úu3™òœ)Y–xñ«¬ìf «£¯gF¥ÖœÄ˜ ð& ‡ä’œ’ÛIÑO?ýtMñæ+‘Ï²ÈöÄ7tÏR|¼&í�¶H{K³ä5´Hf¸E2(>�ET1%Z OSJ2™*Ù„ÏSŒ€	<¼È^@oK¹ßŽ1T+ìÏ"îÕjý}\y‚­ßÃêIdV•ÎÜNÈM;J3Ñ¬Ü‘CrIN9‡BŽÉõ7¾ñ�ñ¢4íÕ«WÂÄ‰{!›øöÛo?N{ñ›€ƒÀÞºfVV‘éQÕ‚´Å·
#)hÁZ™7„!Ö ­N8Ô„Â¡ùàè^�¿Õ•…h†ü XWo Ö=šf„£¼ì©§	¢œy�KrJnÉ1¹6îÿ5–„±cÇê‡”xÝù'Wðn<Ûvã;*ˆß$ê›%]ÅoÑÊ/	[å—p‰ñ0™
/º	oy
o­“yKÍ>ð>ÙÌ[(²Î±ër›™�0ñm{¬a­.
gvu7.2�’rEÎÈ9—„�[rL®Éù¿Œú7ÜpƒŠ?gÎœþµXXX/~[S£Õ7F]N±Ã€]+îà…Gpš@‰fZ“Wq4µVªˆ1¡çµè`oK‹È«ÍÝóº-ûLü8ác[¾?Øò¬Ì fz6 ¿î#�ã¥&h;Ô‚7¥µ³gÏî/"Êù?Ss~ŒÉ„n$}ûÛßNÂŒ¯àMßÛW˜Æìlhl”ˆ_ÞÐ¤Ä.vbÃåf¦*¾’e¤Xˆë²=éÈ[¿{x¡LÌ¨ kê:eS¤YžÛöŽ_ñ"Á¼n[SßÉcx¬»NÌõ¼Ù<" ËBxÁ­¼
Ý�ip�À¸Èp¥#%gä®µIM œ’[rL®¿õ­o%aÊ8É´ø','Ÿ|râí·ßN'öÂäEJ¬øÍ@MC£¬¬l–E*z³)ÁÊ"ÍäöXBˆ°Â7.ð¤“poyCÐlù9üÀ#¿Bnx6UÎ1Qú§8wä$¹á¹ùØæ1zM3“¾…°Á¨–£Å—ÁÊEXYƒ¢[
Œ×@¢œ­Ä15�MÒ5€x�krNî©Á?­ß=z4C??~ü“+`—¦j€´ª&YPÁ
ÑÕ ²ÂVi3€å[£&ˆ�>Oâ­å1¯ðâÙ†©ßp„N•þÃ'ÈÀ1Säª§æÌsMÀc(°…yßÖý}ñ­Ü¢˜Â›@ûz¢Y·[Ý�
ã$ÃxwÍäP¹lhP(ÇèdÍš5:€ÿØñÀ	'œ é™gžÙ	#À÷ñ­|
ÅvÕCüVxgÅGe ßWÎ;�û<L)¸K5ïaÂ�‚¹®¢Ç‰Æc!jNC—LÞúŽœ�–ÑcSäáœ�ØÎ}Íš¿&à>³ÝDVE“?Ÿ©™�ðëaâáƒá>l0óÇ
î¹Ð<¹˜ª1È!¸ŒrZ5�€œãò÷©>"ùÇÎ~ö³ŸM¼÷Þ{é¼ž»víJA�øÝ['ØÔ6H:…÷(÷&°mÈ3�bf0€Ì#�‰Ã¼7@‘s êƒK×Iÿ¡cåªésTà¥nÎ ynë7tœ]¶V^;(<Ÿ×ô­=ØâÃ
»¿hâ»Ö„qá¸ir<Ž¿Å.-¬%·jåšœ¿÷Þ{)Ô€ZP“˜n½õV}¯¿páÂß`ÐßÙ-”4 µÀ
´¸…Z!3"Ì -$@a]ƒ!0èºî‰öà>
n0#¸ý+ë»ä põ´Ù²¶ªIük…®š:KŒ~Bþ{ÂÓ2aÝËüª‡³ƒŒPv-…>˜ZØ·z¶å›È@“ãÇ™ÀÁ¹TNkÇuõõÝäœÜSQMþ!âãËÖDÌüñf_À\õkìïñév
%ÍÀ›‘FI+oÒŠ-FŠÖÏ¼UÊŒa Ž3ƒõ‹¾{ðäÆð0X¡ÐžŒ}ù9}=…™³^6W·È–êfä_’F=!bûù#&HÿGÇËÝ©™²®¢ž/‰x/ÜõÍ ¼¿™ÓÆ2
39ó&<ò1â[>lü�7‚r}>Ò7"à¸Njëê”sFj@-¾ùÍoöüÙÏ~öw�	øf¿·ˆð4¤Y¨(©­GEeQ9ÅovðÂ7Åoy5L¼ð~Ý‡Ð ðÁ|ÐLý q	îsÍ<+FM–«¦Ìr-2¶�Ó}7ÎY,ÀçÀœ™&/TÔñI åh²hc÷4h›¬ås?Ênõ‰÷jzãÀòÖPÈ›BóäT�)©!×fj@-¨	µù»¿÷½ïIìsŽ?þøÓð'Zua¨�h}¸AÒ\ÁÇ!�0 ¶�)M`­?ˆ`aFk­Öb›ôåMò¾r
­‘ ÿ�Ç¥ß�1È�—kñh8ï@X�rwÆ*0r’šàŽäÅ².B±[!hì½‚÷7Ä�ì}(<áë«uoŒåÄÃ¸«°(@nÉqCT|åžPjBm¨ðwùÊ'ƒ�ÞÌçææÞSçXñëjåÃH½¤•5¢°Ml÷b/tÞýFŠ#Ì¥>ïÉB…Á~ˆÌ|Ð^ èÀ÷iDwð¶<°l�<¸|�ŒÃÈŸ‘‹J<vÂþ=™¹úTÐØxyÃµõ�¬Cœ¼ØqÂÜÆr`uŒrâ`PþÊŒC®û”ï®®—&p^ëL@-¨	µ¡FÔê“ÖŸwß.ãÈÿËùùù;8è«q­¿®¶Fr+ÐúUh3€¯„å�øJ—;�ON|×àaæP±}‹34ÿ´¼»}Ô3tAPë¯³ÜÄ“3ä|DŠ`„Yoîâ_
Ñ<ÎL&¸/‡	o¦e˜7Á}Ë7ÁMä�Î/Š1Àjp]ÞÉ=5€¼Emðý`/jõ‰ŠÏ·Oe²õóW9nÇœ´ ÝÕH þîH-
Ö@‘QP…ÞÌ °îAó�I2SÄ¶˜Ø(ÝoëqFðQ�àº¦…t HÜî@!±�]Aj^X~;i†ŽþžV–Õs¢Êµx»?ò&üG¶vëç=/éžÊœèL•SÍÊ1¹çuà¾Vª�€PjD­¨Ù'"þç?ÿy~ÏŸ„¿Égë?(¼Œ�Ã?sêâMë€0Zž_ŠÂZÐX#”WaÜíóâ[ª2ïHXXª×Wò¬åÙq‹AÎB-G¶è‹xÃÄå³x-œ¿-~Ìæ·äŽ0GðØêM:UœîŒlƒ7”­Tï59à·›Éyìá‚Âø
pµp¼²^àºQ9¯�ŠO-4
@›-Ôïgzá×L’ Ý'ò‘'ÿv­'³“'O¾¤²²²+zÓšî¤{áÄ4%ÜÁ
jyî?¼ŒÛf¤±âûÙçæâ¹|Cc·lB¼±¦h‘�‘fÙP�´¦U6Õ¶Éæ¼ìiê–qgñ4{X+50oë8ÞÊ®}="Áõ³É9C—Ë&>#YUúÆnUu›Þoî»ßýonì’@NõA=o¡»FFl¨/³–oõmÐÔøQ£A.K	å™œƒ{¾�Ô„ÚLš4éjEÍ¨Ý'2ë‡Ÿhaøï‰ßÝ™ÃÖ‰D:#ÕÕR¼„Ç¤y¥õly,a….ý&Ðpf$)*>·“D}M»±¡KŸÉìÜ#S6l“!Ù¹rOZ¶Üžœ.7aþþæYäÎ”¹wA¶[ºF&¯ß*³·ï”Ü’jöçU�AxáËéî^Ü¾Áõ��úgá/…ëåå†yúí½èSÃ¨Ü�’ÛÐ-30&¸}î"¹+u‰<°x™ŒÄ[Å'7m—Œòe}e£l€—GZ£QÁu5Îè®~¬¿îÓTËöo–÷H6€û:h@-¨	µ¡Fìµñí`oj÷I<þõ øøé›øÆýpoÖUƒ›–EªeI„Ñ°[Ä¤Þ„Ï›	bóŽ®+!<_[æ&�˜µ§ˆ¢ây}¦€}�‘³�
âáhú+ ÏàÇ¤/pÃ³ó!pƒoÙNx¤*ˆ–AÓ•4#"Éò¥òÌ+oÉà¬Uòû'gÁ\i’^Áü@ºô{ä1¹zÊs:+wSÊùù=�H_ló÷eÙ.5ã…Y2
MË”ÉD"ŠÏº©ð&¶E@å&9Êm£ãÔ¡œK°­´ªZjª#ÔDäøÃÛýÔŠšQ»ÿïàšk®éÍ¿usmUUo$U@=núN¸FRKêI¤	oy/ºå-JxÁŽ˜¸ß½³�{Â|ì	’Œ–ó0�séãSåJóÇ¹ér[Úór×âr×¢årkj'q°o¶ü×¸éè·Ç#t/¤ÀîÌF˜^qÆ—í/‘‰k·ÈM˜¸„o‡>C�–>•÷�õa±Lzm—Þÿ\L%OÛ¶SfcÛí¸ÿ-ó2åú™äwO<'ã\îgyi@^k4Œ°¾²‰O¬›ß`œfåÌ5¤žSŽ©÷Ô€ZPÕ†Q+¾$ºöÚkíMáÇÿwß}÷q)-©pû™NÞ¤7[]†ð_¢2xÁYH3á*+Ã– ÂTbÞ» Rn˜1Oú€Èsv/†	nŸÿ¼Èfï)•E%uÑ¾=ì?¯jEÞÍ˜×IÊþ
yúÝ² ¨FŠ*¼»×r¿!~ÊþÔ–×å¶9qý)Úzû Šô‡p�š$—£¥ß¾ày÷Ê;:FXPX#WL™IC ìgò‘PïëvŠkåÙ÷eôÆ×åfDF–�×½™¯™EtlàLÀ:GžE€Kœ—>eã£Õ‘*¾²ªª“á¯ŽS©µ£†wâÇ‡ÿ^x¶ü:~°é}Œ6y“®jÜ,¿2Â
¨«µ€Ì[Á±�Ð¼UÊÖàµØÿ¯,­•ë¦ÏÖºó'7Í],Ï¼—O¡ùI¸ˆŠê‘ND]îY¾•Âû2RxÛee^¹ŒÉÝ W<1}:E-ý ê@vÝsi2dõ™þÎ>š‡ãNé5žÇàî¾ì5ÒÇÿ×Ø'eþ¾2–÷®GÚÀ¹’Çé£âS;÷ËXFƒŸ™§�‘útÄô�éÖ½À>o’;äë åÙ­+oª5¡6ÔˆZQ3jG¡åÇýŸ{î¹!=ðëËËË;bx“îºªJy³¢Zæ»‚³0u„9ÕÄÜkùE%ÒpÎ
šþ’±BCè î^žQý˜b‘;×Âgì`ÒŒ -%VÉÓ'��õÚ·?’™#—Ž™Êë«�ç#¤_�×Àƒr6È3ÍSÃ,­n‡Ù|Ën ÀzÝlaÒö]ìZ´eOØôº,­9ˆºÕEËáEs]"ËLƒü)=‡&Ð{ÎÎåÀ�üh�UhãGay
mL9â¶3C<ŽGªTjD­<�ÚQÃ�û4�ˆŸP=ž)¦GðÂ|ÌÀMè6„ÐZI)†Ø “¦)`…5ñ	ÚÜK’îx~=ëÝ}ráˆ	Jð-)™ ±�äºã)†	8â5Åg™2°í%þía¥_öûcßý�1˜¼qö"N³;a«¥`¼ËãEÔL„šc~AD.ÃÄP_Œþ¼p©d;cúu
X¬ÆàË,D±t9Ñæb¼tJý°H_ùj�LøØmÑ2^|mýäœÐíÔ€Z@“J@5¢VÔ,VÃ£Ÿ¿b•„gIžüYüªv6Fÿü
¥³ª²RJ�%¸9D¼	s°ƒUÎœžVT«S¯ÉÊ%¹*ÖL²8ƒffaJÑJ¾mã±Ir0GðÅÆ¯ÙÌpí„L.9AîÀÀm:ëøDÀVMqi/zºÂGK�x¼êå€ƒÃ‘r%ÆéÅµöôX9-°[xÑ…ã
v5ƒ—­ã_¡‹‰m .o\ŒKÔ3®^|å¾Væ#Ÿ�´,\)Ô†Q+jFíðgæÇSË£îðÎß÷ÿ§c†é}¸ŠïŠT†ewE•Ì7ñYÐ
f…vÇXe(¸9Y+î„Å5®E8îó—hýK‚I[	A!Œ`‹ ¾Rx�ÌÙP×.ÿºO®:™�mÚâ ó©áIŸé¾.Æy&|@p@¯kûºH1ê¥×ôšCÐ9»
$ÝLjO8%Ù¼		qJŸ‡FpÞ‚×3><‚â+ŸÊ­qêòÖøæ;þ©I5´©€FB³]½{÷æŸlõvZ&íoúè×¾—^zéYxþoAh‘òŠpwM¸B^/‹¸ðOGÆE‚"@qhÁ­R&<Á<{Rð*ö×�O…†Ë •ø{@¼Ž3Œl0‚Ig	_@(öüjŒÆK¿Á|‚xL®y:E&¿þ¾ÿ“Â0<Ç‰î¯ï×u›ïE‘x¾ð{\Füü«fÖIj°�}™8æþç_€†ËoÆO—yyU¬3Ï
_¬ˆ‹¢µf'¸‚û�R‹7 	´¡ºi jFí¨!µ<êþÿâ‹/æã_OüÌéuøõ*¶~ B"À†’ˆ$;¡ç{'Õ5çf+4¨œ7É˜ùAûHÎFÊˆµ[ÙRµ’ö„a!ráÎeº­~ÞŽäŠIÏˆïç/Á£ãàÜÍ*^ûjj±n]ÇÀŽ‹¶äÔüˆüfÂSr6Ä|(+—_{!ƒ(UÔ Cr7I_D·KðÈ9go¹v¾!Xëv­Þ8ƒÈÆ#¶“_€y3´€&˜¤*Âª5ÃÏí^Gñ3øÔ2ñ¨€rbÿß¿k7*Úú+º* >±7K)ô­Ÿ4UiÑ"h7Xšµ§”¢)I�¢ïFÿŒkÔÄ…H3 Ç~|}¤YÃdËyCÇê3üylqBèÙ
Ù×R8ÞÛ…dOÜçÎ¡iì¾,ëM@Ò Î­÷¢ºN°ÚuÆ“ÆÙ—K1¾™»?LX¤<´_7ñÆí|Ï­ïÿ§)Ø¶²¸Z¼>ÔŠšQ;jH-�Ê ‰XðJñ3ø±æd„:ª³¢¼\JË+0è¨‘yZ :ä}ÁtÝLaà>ÂWÎ*LÂæåWÉoÑ²~õà£2({[-¯ÁªDÆŽ„SAê²ªÉ-ŽÈ�˜Èé‹	œs1á2_ñ_÷*9@‚ýÃD¢ ~›ÙfÂç�U¨‰µ\÷f®–_=0L~7ñiI+¬v×wÂÓpþ^N8žóà’UZ·ß!J¥T3¢ÅEHÇS@xæ}t5#øþŸü§¢1Rj†ü#;µ£†Ô’¹ð«=@œŒÀo€0�WV¡“$ókæPEšn÷&�·h0ƒêÏ¥�ØGå�hYJ�À…Øh~®»Š“-ÈU“ŸQñÏAÈ¿â‰gÙ?ƒì6Yí‚\ñß�¨Â¼?Faç õ×IÃ½U†®Þ¢ýù%£'I2g&Ë`¶x£²Ü®žX¿~FŠà&D'�JEN|ÇƒÝàç>r©¼ÆA9R‘§&Ô†Q+jFí¨!µ¤¦Gów=†�Óð£E¯!œà¢å]•¸ø¥aIe�ÔZ Û¦y- U„ûŠçj_‰î<Îž=°t­{)Æówó1‘(>�^-¹ÕmìïAþd>V©ø·¥f¡UEøM!ïÃcÍ8±(±Ô�"»c™jÞÁÖ=X~8vËõéâ©»ù™D«q&5aµ,õó>,D�&±nüÛ¾N&7Î ±¢{áÍÖ�|ðÜºßéQ­ÚTF ]À»ï¾û5¤–À‘6þÕ¯~•�	¤oãÇ	vqPQZŠ‹b`ñNI…ÌÓW›LtÒÁ¡(æ6ƒdNVŸxã}¹`ØXÌŒ�10tRtéªø­2sÛ;<†°¿ç,!dƒ^KU&´‰g†8bøVM0OA8»7õ­Uüó`¾±›ßägÞl‰jE±‚q~ƒ¯�uls!Î™ºc§¼MXÂ™Åƒ\¥}4¯ºÝPMŽ¨	´	5¢VÔŒÚQCj©šá’€ßèï…ô8œôcüÄy%¥¥ÝáÒy7I¶bÞ¹Òì�ã~«(÷põ´9:ÀºæÉ™’]Rä Ï\ñgà5-E×Ö‡Ï´Fmx�-®ÿ¬ÑÔPD¬	4´*¹ÜvD`ù8xã$Õ@ÌôEHçèž³ˆóQÆXñý -ƒ³k¦>'gãØßOŸc­¾PáÊ -Û-²‚Üšð¦A2¶S›*€ZQ3üô~¾úOjé4M8"@øÞ<	Ï�¿À„B5zÑJ`[Q…Ì-p@¥Qq+d�…$[?ÔµfÂžŠc9xöÂ+ÒoÐHí“6¼¦ïÌ—ááÌ×vFÅçT.æãÇoÝ©â§áþ6ý¨ÚL`yÃ|×M,C(^Šk»mq-¸.x¾°¦äUÊ¯1šÿÕýCå/nf�\Ä>ÍË�èÇ§“^z5ZŒU0@eq�£ÎZµ�¼ºÑÃ!V|Fj²­8,ÔˆZQ3jÿ7µ¤¦Gm üvÿø¹²^¬ØàUÜdŽ7 Q ©Á‰n•Ñm¶^b#ˆ’ÎI~z¥ä^>y†¾Ì™÷ön´ø±”†Ñ	ÛþJñ=é4@ ¸ý#ÄÏ„©Ö…ñÈ÷î^YüÞ>y±²‰Žè>;Öúf5E!AãÔª~ƒoÎºˆ<�µãWonŠ‚n#»°J®œøû~ÔåYš‚]Ÿ	©<¶nûÔ™ €ˆåÛò¼5ÙêP\RÚÍy j‡¿:ã¨€pqOÂ‡ gãÕb« ¤¤»²¤X^.
ËlŠ˜ïûž
 u…2¸®ÀâM ÛâÏs"Ú?>¾y‡œ‡0OFŽdí+‘ÿÆü@´¢†>ÎïùÙçòXT<^xD™(àîÅA_æþR¹ñ©9r®Ž#“›ŸI‘,lãèÜ·(BÏ·<¡&MÅ#ëåxœ;ë¾ÁroÆJŽAXÿ´Ã.‹o6ùöQÅ?ï7F¬�­Ÿåö�ÇZ½ERÇó¶åÓ§DÄ8åõ`,hm*„A+€ÚáÑ³©%5=R$zðd^¿J!EÅÅÝa5@…3 
¡ˆÂÀuƒ9Ú
Îu«´‡Ç~&KV”ÖÈ¦ÏÒ9ôsÑú]·UÒ½ø$Û‹ëÈ4¡}ÞÂzš3'/oÃ7„gÞ7„†"43>K/©3¡û–qÿ«§<«¸{áRýÁG€yØÇ¯�æ¼¹KMÜ¸~æ|ÎX—YDXD4�)ª!Nx^›0ž¹�üÓ H©5*Ž1 qŸ$‘¾ò•¯ðàãò“Ÿœ…A`CÔ %j€W
+dnps Ï"€�…"b�À4G’Ñ¬ÄDÏÃé+tö¬?FÐÎXÅO£\Ë÷Æ‰CXT1#¸ÈÃ'N9³9ÈcÀ}²˜ù~‘c]Uìõl�÷á‹«3ï,wÌËä¢«_D£Hö�rùÞBöC¹/>ž_'ñºÆƒïú‚\˜ð&òá˜k€Ô€ZPjC�¨5£vÔ�ZBÓ#7 þµ+5À~ðƒ30’¬ñ ¢¸H¶–ËlÞÜÀLà¶év¦U\§	tÝWÎmÛ”w~J~¥Nñ>³õm†}ÿÚ©0D«¬Š´ÒñY,zŠ]O3ñ4|ÏÚ]Q& uŽö@[êÅ#'b_©{|‹Ä^yÂZ.ÊŠ§”ÙQ¤Ò 0�¶PŒ/pþmÏ¥ºÐ?‚ƒZdÉ‡ýA1mÇy�	®f ã8Ïó¯fPl-*WB+jíª¿ÿýïŸA-¡é‘à‹_ü"þÂÆOñ{4ˆ(%RXTÔ]VT(ÛË0âôî"•Â›	 ¦4q˜nÂoóy¾$?,WŒŸ&}A"_»Î…0œüyzóvÉ7ò9…ÿoð¶Ö»¯PñÎÑÑùH9ëÞGäLÕ.v¡Ü‹žxÔ�p»Ž®ÆÌ#Ï»+íyýp$Q+3‚£ÖoÃ vˆôy`¨Ü¹`)}c œÑƒ­ÜÖUTæ«—Ê§­¼TjD­¨µƒ†?£–Ðôˆ�pÊ)§pÄx&~€Ù¤÷y±‚ÂÂ®ÒÂBy«°T’}Áˆ¼(Ì „ß_`'r /ÓJhèÏFëtér6æÚûÃ #Ö¿Ê¿èe‹Õ¾zÞÀ½PÕâ+n0X·î‡ÐnÊ‡ô1ëøÛñÓ1šŸ&÷a$ï…÷e²ÇÜCïÁî$å@¥\Ž÷gÂ w/ZNã��ÓwîÇuŸ’f¦±îÞ0®Þ¾U»|0¬›øÆŸ5$ÝqoüR“Ð† VÔ³¸ïSCj	M�ü) ¿RÝ8ùÓñïÞmg8Ñ‹È»%±…Ð4E»¦º®K°î¶ÌÙ‡†=ž£Ï½œ69*×>�¬¤ÎÙWÆGB¨tBehÖ*˜ Ù‘ReÆŠN³·ûQ8[¦>ÎÍ(lp\8× ÔßŒ�*gÝó°Ü“¾’¿ƒà»AÎB²ó÷±òyÎ\c1ñÑÔ¸
44Ûo°ó¨5¢VÔÿTÝvjH-�#7 ÿÂƒ‡“�ÿ"þ}»5j€‚‚ÎbD€=…E —›SÜº!62ñë‘€‰(ÿ`cHöj9s œf�ðê»<)éÏî*”ßŽ›<*}Ô9²&à>Þ_E¢!ŒT<?ÞQ!üóujžEÕÁ.Š)[t2Þç_2r"ðˆÜŸ½†ö…ò‡±?ZG¶pîAøc™VÆñf°uÏ¹åSjC�¨5£vÔ�ZRÓ#6 –žø‡
h€ñ§x1üIxgaA� A¬dsŸz`ýðF0G+!T`ô<U¯®{&…ÏÔÜGs°e9L“~FMpï¼|�ïò0û7Ç˜PŠ¸'älÝúP`ùý���E™PŽw÷Ë…ÃÆÂ¨Cðfp¿"b·×/S”Ã÷×Áíä‚ç[ƒrF0n�·À6j±ÌƒøE1€viÿÔ’šÍga=Î9çœyrjjêx|^$ù]¸°Kó*@x$¾€f†D%Ö	Ûg•2p{2Žç7ð6½�Qÿpé‹V>rý6Ó ‰a—ÝÁŒ÷
0Søæá‡áÕñPLèÌ–yåò|y#çxßç�þÖDÐui[ËŒ9—P±¼Õ”S¶½‹5JËúø¦7ýô°3t\d4‘Ý5�÷0Îë.É[ U–�ãp®M¨�G5ƒvã¨aÿþý©åQý™X�ÿøÇ'0Œ1â–¼¼<þÍ¢@�ççËÚ¼2™�÷Q�Þ
oÈ'l[2Z>¿©»oá29ãÏƒäRŒüùÂ…ƒ6‹4JX'bæì)ãø &Ê±‚>s/xg·¬®lq×s&°èƒuËÛhºÒí³ý¶Œ`¼6�:††>4LMðÄö]œhrõ2Mt¢ÒGj|°Ï¶	¯Ïf!¿6/�
ò%ß™ “@‚hâVjˆ÷'­’¾ô¥/}†îéÛ·ï€Ý»w·Ñ yùùÝ¥¸É+ù¥2û€ÀZ»­[w`Û]d0Ä \‹¿ù;óîArý³©:_`h¡ƒàÛ0	Óèó@TŒñ¹/ÉÚÊFY\\ƒ�c…�D°[ŠM�yl»�Ÿ‘Yñ¢ `�Ÿ|³<)±!œ°óœ)	ê­ÞÎŽ—ý^0îŒ7jñr>€ùyªµÂ¿ÑÔÖ§OŸÔÐi™tTßbÔx<Ò“ð›ôÿ¹cÇŽ=)ˆ]…ˆ;ó
]a‚HVøÆm#‚çi¨�½»-¢œq÷_ä¾%9:½:ƒ­äýŽ ëFÐç…I´†ãA+ÖS|>wëàñŽYóe9æõWU6ã¸J~çH7ò‘¬;¡mû·ÏÊÉ²ð-¢þ„Ü0êeã¦áúå<÷°­”uf·”Ê²Fçì±^�í,ÿá¹rfëŠ Õ„ÚP#jEÍ¨5¤–GýQ(Nî�·�'#ÿ%ü.í*ü•ÈËëÌÇMöP‰¹@
aÑuƒñÀá+&´µÌÁíÀa�k0rùZýõîœŠ’âÃ�§ö¿“·¿§ƒÃ>”��¹‚KñÙö/¾,k+ðâ§´Nfƒt-«žg-GËÆ| eYÞ`‘áÚ©3Õ¨7j¤Šøã­Œh‘¼çV‡›dMIDròËeuqDÖ„ñ‚)j„WÇ›ñcpyöÛæ"¿ ]è>hBm¨µ¢fÔoO¦–Gk€ ~ŽüsH?—œœ<Qû¸‹ã�`å�2†k!‡/x@tˆ	˜Iø‰ô~qƒ?;ÿ‘‘rî ‘­cäòqOÊ¨¥kdeQ;ÑÒOÐ\„zŽÌùWÃ·&§ã	a"Á`�|z.^÷î•µ0Ób<¾ÍÆ±JœŠŸl¿!Œî)Qƒ�	ü9}…Î!$ï[÷¦QeâÁ‚°<š•Ã'˜{¬üvÌòð¢¥²jaaµ7A€/ À£Ü Ñ‰Phr€­}žÖ©µÃo:SÃ�õgâ=0�x"/rýõ×_�yeÿÿ¶wîÁQVi¯Qpt oU3»VQ+èz[tvjvGav�q×UÔYEpf PFe4ÂænXÀ$Ü‚"73¢ÜIw'éî$�H¢dýcücöòÇÉÙçwø¾=™|é®ØÕ¸È¤«žêî¯¿ïœó>Ï{Þóžó]ºIÉE«°¯¹Õä1fYa‚(rà;¢;øÛD =è�ø	sÿ’×5žkz§¹,³ŽU˜}L"nÐÒ0=Õ•í¢ÄãˆÃ6‹>úÔüð¥7TÎ\[Æ½æè	e	õ
�÷_+âóÛé¡žÐ¼ƒžB«íæš…eš|_NJ´™¿s?—‹!¸³—ÏrØõ:!ô/:c8fÚ³6_¸eÚlû>F6M‘s—Ô·’ÇÐvÇ‰ã+)\=h€Ò¤ÉjƒFÊÙ:ÐíÐÐ%€_-ôÓ•¤öÊàþýû�ÖªRƒÖ¸È ã¸*ªm>~Zün: Û{ÆK�ÇJ{œVúþY·QÏÔâÊ�_ÏV¦½€Pk	S¬¹>ãm°LGÅ�¯sÓ4£¸Gëü·Ë	p„¿]°Ä<¿q›òƒ“f§�Š[m¢Ø%*~"–$Òp“È\E¥[§?gîÕ	¤åU80àÛM™v]bVñ»²i¶§©"O™©;ƒzóms·NnaëS…Å¦˜õcp¶ùã½‡Î´J@i"mšmïG+4C;4DËt"Àyº¯œ«‚.g5I‹
É.›šN5ãiò¸ÍÍÌh<F€`CÝw~÷à‰E¯}‹[­´Î�P�–2¥bJ(ÂÛÍd-ÿÞ&²™æ&Nú"óîz‹×û(¯¡]„¶3¦³f §zÔšŸ¾Yh‡…Ûè…Â$-3¿ ÛÇ6ê²òr�Ç›$*í!áôÄp!¸›³®•Ø�j�jì´Yºiuû‘Ì‡=®@	í¤EK©ñ½åæÓ+šsé»l�¨a.7zœhá8I	W‡ï ùªk³úX“íýtÎSh„Vh†vh˜ÖÝÁÞAè¯IH/›?þÓºÆŒJL£p¢©Ñhj1y4&yc“ƒÀLŸ^ÙWi{É]Êâ_ÓgÎ¾­ÐbN0§l§ûÔ,3AÓ­ìè	Æ<„`Ìuõ4Ÿ.«XâlSÂµZÙ5ß‰þ9úÅj¦¼–mëøk9=x¼zðô·‹MQE�Ù©O¶ëXî²¥¼Ü„;qRõ8;H s$Øß=ÿ²¢ž\½QNö¥³ÝµÅ›z.%”Ïèä•eÁûq6ÙsK´À…³ß£aäµÃÕ´�öùKÍ'�îÑ -ÐÄjƒFh…fh‡†é: !ãü‹õ¢0�Mºµ²²²Ec•u6«²XS³YÝÙ®qV_¤ A2XÑ0ž7•ø½`×ÕlÚf~§«ËÔ[>Pï|"{C€zÓo8��×»º¨Ã+Ò×ÆŽ›7Ê÷šÒ„öcÌÆ	<p�Ïê"y7s�áYõäÙrŠùæ!=-dñ»;Í;-&Évh-¡ì¤®Þ¥wB´ž
Ôn.é§«“n‘°ä¬0æë·|9ûä
vÚ)çù¡" ‘bza‰)×�S¦Ù¶=[²'$7á6uf9ðáxqN—ð ÷h€h"m˜þµ šyÚ¹%à4^ýôºHÿX9„Ç�nØ°¡Ty WšœJÈÓŽ5&ÌÖ¦6/
x‘Ú0ûÀÒ7å Ïª×,²ãtÞ'Uæç«JÉlo{¼hd3c�áï@djö¯z¦Ð_>2ÍÌÐ¾%
µˆâ×ËqìËõ}D‘%Š4üoQà69QGÃúúJ³°l»Éÿ$dÞküLS¸/íÔm›³E'}Þø$b^Úõ‰r%¯œýÓ0¶^‘à=]Tº]IæÎvM=ãÇÍd%zw*Qü9Ûì5Mþ¡�™Wúž¹gWð�šJâ¸An’ó°ßïý[Û¬h�&h³~ýúuh…fhX JgÐåDv˜:uêÃZaê$Ì4$¦Y8ÒxÌ¤n°ƒNh—0'‰<ˆI=ËöJV#¦•=«‡þ`áR.©";W=NÔ®ââSŠí1ç-6…Úß.9' ,!óîŸë·IÜ/6ìàÜ¾’³çU÷,9ÃL3FÐ
£¦n/™‡—å˜¹¥ïÚUÆ•º ¥´¦ÑN»ÊêO-¦¬¡Å¬ÅÍ›{›—¶”+j‘ÓØáævå r0œËÙ$|_É©òz?tã¥«}ðÙîÃmàî}@´Ñ� £šÂšÃ@=h` ž2AøÞž={Žj˜ÊëLS¢Á”©§äßœan[@@�z•„¬÷HB4$=¤Ž0¹Ê'*è v»=~•’½_1ìãåJ4ž³6`ëN¸úÇ z Ig¡~_ªûf”lQ®°Ò†ç;˜†>õK3öÉ_š›ÿí8†Æî¹êÑóÍ½Ï½`Æk„8	ßÍÚ0öÓûòÛÍjŠ˜6b3 •ÿ–Yz¨ÆE4ÇW�Ÿàotqý…å¼Qü£�?EG4B+4C»Lü@?�J¼HÄ†ê_+ç{•vÖ74˜¦†zóiC3Ó)˜Ì˜”Ûé™Ì‰‰¯+'X²÷(½Ó_Œqâ§(�c'/]¡ñy¦™¼$Ë7Jd×¦Àþ¾#ÈI)¨ŸMD*Õ]oæëÐ'uÏ!9kþ\�ä÷ê[2ä8õ1Sá7†0–‡9‡ôš–É–_kØÉ’mä1Ôåõ|êö°+)àúÓ„ÖdÄ? š ¡š%	ÿéò¨AºÃø
þ5æÀ�q2NT¹IŠ	z›k¨3. œpàw„ð:bêÄoåÊè¹lˆ°>wënR˜�m^Ü¶Ë”Ø‹@?ï™`ŽëÚ’9¯ä	þ½y$”[>Ó%±æÅ�+8ÿÏÝ@Ü"l7³tùÚ¼m{ÌK»+ˆV”ÃqØ@”�#ðÛüä8Ø–ÜVz?‘®áîÑ -ÐmÐ­R…ÿ´…„oéY38À·õÆ/v�‡šL~RC ›°k‘\HÛ#-øøÍC�åúŽð#=fæõÐ¿WÎŒÀæ—º~oœ�©àF�g_ ›?^+ßÇâ‘ý¿»ƒˆ{<ÁqÊÄ™�k»-�ö¥td‡à>¶Ýë‡ÊüÅy×Þ�&hãiXüÉT¸”J”]ÞzðàÁF/ñè�š„ðnC«ÉÅSipWÑœa©Dõ‘z›Ûˆ ä„îÛ§Ÿ^z�½v£Ù¤éWnÝg½¬ß�£c8vŽÖîošú4KËôp+Hž~cµÑâ:��u¤ŒÚOyp»YÃµ8‡{z?OmTÏ¿mÐ(C½?˜âYúw*<ìJ=:þU<�FÔY¨3áú„)

ÕÓw�”�ÔÄ8RÜv¥|#WS-±¹&ç`•)mûAS“ÞMüRõrŽ½KÉ™ü?eå°_°þ }gÄ~;•Õwq×ðl"®GÄ¿Š&hƒF.ùËì‹�r¡þ‰b°¼ìJ}¾YYg-HCâuõ¦±.n~×pÜäÐh?ŒƒÀ÷ \Èw¿§Ü¯$@pz!a8ëHœÙ„œ`¶¹OS¹ÒØ1Î¾IØ6ïØdå¶#>K¾ö±ï“üš9;Y¾MNWÙeÞÏ]©ìÉ ý”§pÇq‰¯kþéýü¥|­´ƒ&hƒFHþ’¯âaºÂÄF=ŒxZ4íðÂ‘EL(i !ôœ ’ÒÞßíË…%¬-ÌÑ…"·sVQ˜¬3�uöm�zuvü3Ã@y
åú­M=ÿ÷:sØj¦h&a×$tüs*‹2)»×m°á²XœÆââ8.àîÑ -Ðm’­üe2 ñfÐ0½ôùúuëÖm!ˆÅb15¬!3udÃÞ¸˜ ,—þéXÄçIÈèíqÅ"ËSk6iÊ6ÓÎËÿA'�ÖTÅÍ6­Ø­QOFpz;àójMÏøã«µá:ó£ÅKOŸ’Ö±ÜûGöÎ>½n·ÛŽí°ÿsqÚ`¹…c¸†s¸G´Ð´�Ì?páÇ‰ªì[zeÉQWœü ¢¢âe£4¬Ów‚�êšO¯�c�30€|ž±IÈLk;ùÀã¥ZQœe§Eœùzõ¦ºãf»–x·ëI ÛÛ­ÿ“\=¯Û¹ïfEÒÿ±‚[F~oÛ•ZÈ4ì—“ê.NüNE\ûÜ£Z I†{ê«…„Kôø‘«xÑÂ…_®óÆ%5Ð€za³–K1ÀÚ�ˆnY´û­Þ†c½÷D’ÛæÊppÇ¹r¹<ëçzÎÀ�,Åj•ŽÅ›ñZeœªËÉŸÕýÜwÊÌ+ÍÄ¹‹ìªß-Â�Ï<gž)ÝB>á•õYïëwb³;.ûánsÝ	ËeÌ¡®áîÑ -¾êU?™X¼PCÁeC‡®ïß---ÝJ`\¢¡q¡&7k5öæb$zøƒd8Ô''<¸=(�_!üe=Ùkò«¿5wè¤Ó˜Ÿ=cþêñfôcÓ…§íç1OÌ0w(Û¿ÿ•å<ø‰L®®têì×{ûÙgp‡qO|¸%ë‡k8‡{4@‹ô¿ôsÂÍ@eŸWèê“«µþ|·2Ò„ïÑhÌÔE£¦2VgVÕ{‰—Þ1ÒÁ#%Ùö �¼{ßS–Á~þ1üå<c±Vó>Õ°PÌ‚‘½õ>eú\pòX~±Yôá!’.–k9&õƒn¶¥¶ŽàJœµ™£â®.5ÑXŒ¿ŠgÕ•Û½pçp�h‘ÆØŸ™Å!aÐ�!C†Ž¦L™2U×ü—†ÜY�Ê	jÍáX½)Ä°Ô¢§ÞÜž¢¬à÷¼x½G " 0™-|V�×vÁÛ7“õ÷ÚV_|ÞK|¸ƒC¸$ì‹Ûÿ„c¸Vï‡ó´—|3¶Dì…ŸË†~µÞGêN¢×üpõNP[kÈ	òºF‚¯Š:Ž´”û9’õ¸h 
º…kDg¨~�Â>'>Ø«g5Æ_\vŠSÆýßˆã×.ôÆþ¯y(ð2Ð!z
Åwø§¹+Vü»pS#`ÐfEðˆÊ³H-zž�ÔÛS£. Ç¹ãÿ_ëG|WÎÞXƒ‰‹«êñVSc9„K8…[8†k8Ï@èÏèPp1g¢ô$
xSQQÑ»
[qJ°N×ûþh½)PÌuÄ¤"Ôåt°û;¸ò\Owå¹mn¿³£þ\E8�›¸ÇœÁÂ%œÂ-Ãu¦B&Ï.ÑräUÊ	p‚1ÊV?Öœ•gÖâxµ5ðPmÜÅ[O/Âô@J^²m É¶ z¸màk®?ß•ËgËAQ]+œˆ›jSí‰gˆ_RRò1\Â©îðñ§|2ú3²ˆ1éRýÍü0=� o½«¬¬ì°ï‚©–q1ZQ5«ã-&"‚d;"ã °½·–÷ÑEˆ8p"žùú]Ý Û×ˆƒŠÚ¨‰‰›ÂëÝÓ¦M‡á.áná8p²ç,t‚ÁZ�®F�Ðtå.yñn�cÖ!tVWkl«Ž˜�Þ7ÅšÍ[I^4èI°žIâ=¤<>	ÎxýÎáÛC	7pWÅÅÅÃÂ%œž¥â�€Ë‘h°?\a>BŸoÉÏÏß¢lÖ:A$éÄàŽñåµõ"¥RqI©Õ!å~©v8SõãvØã³ln°¶×DN‹'
ýp”——ÇÿX¸ƒC¸„Ó³[üàÌ€_†š³ŽÔçÑYYYk	qLmÂáp‡g¸‰FÂæ`uÔ¬ÑµýoÅ•%#ßžt[®'L7AZS—2\>ßU7‘jøÃæˆ×óáNûá®àîà.Ï‚Œ?­SÇ6(1®?,À	þBÿh™¥“Gÿ�§‡B¡Ž° ÔFÂz¯6;Ô3¸U<›0
y‰¹1Žx»Ý¡GsØ€;>‰3¤]¿N] ±~{M½µµ[Ã`Å‡8�8‚+8ƒ;8œäù&:�.#¦sÖ8Áõú«Ÿ}ðÁM $2"á°©‡ÌáH�Ùmâü¼…íE±n¢Å|t#?æ# t`¿Ünû¹ßƒõä¥Q¿ßþµM²©Û°›q~k7<åååMp7pWßXñƒÃ�›(”]©Ð6JŸGéö¥	ú›ór†…¾N	…Ã�‚©…LµÈÚ]3ÅµÍ"‘^Ô&R[<@zÁ’
×¢íœx]�
Û7àT®m´ácmjû1ÙÅÙ†øÖVl–íÜÇ_p7pÔ5ÛO'ìŸÍ³ƒK„+t2c¤aôìÙ³³öíÛ÷{V!G÷¶Y' Õ¡*m™=‘¨)•#äˆø•"!<ÂùÜ-�íI·¥êwIÛÞòÞKÕãwGd�B¡°¶a#‘›gÍš•p'pG™ÎöÏ¶Å¢‹…!šÛ^­Å�k	{7ÞxãŠ;u_;F–(¡£
â<#ÂÞp�ÙXÛh
c'Dv›EŽ"µø©~~O~l·úüvÐ¦MjÛ^	O[i3mØ‚MØ†�;o¸á†°àNà&É"Ï9åöÁZä¸Jáo”æ¹Dƒ›ôgÕ³¶nÝZï¾#Dª*…*SÖÔ13%êi±Òï} azBT¿E[ ß{�<ÞqÙ~}
õl£´¥BÎJû@U(8{GÛ	õÀ`6b+6Óóá .ànÎUñƒ×¸!a¨È¸FŽ@4¸Vç¸ÇÍ›7ïM%F­$K‰�Y©wÁ„„j†"fGuÜ¬Wï{;z\B·Xgð�"»«SDb>ûp=:D= 8eo;u¬¯iT�1Õ¦~[ÔN	�Ó:á6È–lRO‡�ØŠÍØîB~Ó¼s /Àãz=àÊÁƒ�Ô#Mì° ‚Æ+?x]ÿƒßDï§…¼^ŽVUé³r„J	PyÔ
pDìi*©YVÝ`ÿE¼0zLbŸðz/Îa{°‡6žÃDµ�'¾ŽAl•ÑDY¶Ì}*›:¨‹:©‡¤-~»h£ßVÚNŽ3pàÀñØ„mØˆ­ØŒíp�ÆxÎFƒËµü9ŒlX‘À:‚¾ß=}úôWô?¸µº²ÃïUêev<:Ž"„À¶�„‰ ŽÀ¶#r’Cm�ÄÛ®5„£f»ÄÜ‰›­ø¼C(GµOûê˜0bÛ2Â^™”MlS� ƒ6ðÝ�V´‘¶Î˜1ãÚŽØ‚MØ†�èõçtn0H"²†CšÂæµ'¯Ó¶Û&Mš4=;;{Ë‡~Ø.â�ïDáÈÑ#rˆÊÎ£¯ßÙÁ@HŸÃG� ‹ˆƒýîà	­÷J ÏGlyàh§Ÿo�Ž:}Ñ©‡6Ñ6ÚH[i3mÇlÁ&lŒõ}¯‡HºTêEE"Â(á»ú|ß£�>ú«œœœz âqýGn§zý¬ÛöP9D§VØNUT9%á:€15Øœª8-6ù‡-³kÔIÝ´�¶Ð&Ú&ÐV×ãe¶`ÓŸ{¸ï…nñh@×ˆ 5LsåZ&µÉ¢Lˆ
ßÓªÙø	&<¹xñâ\]8±[¢Û¿ÿŠ}Á8ß@o™ìïƒc ŸåD†2)›:¨kâÄ‰OR7m -´‰¶ÑFÚÚ­Çðu°±Ïz/âù]"Â%Þ‰‘+©Ê¤Gè
™ëDö(Ï!®gz¥‹&&è�’~òÈ#�ÌY´hQÎòåËß_½zõ~�ËÕ;vìhÚµk×èêå?ìÝ»÷´óGÀgÝçø~#qÓcÖª9fÙ²eï«Œ\Ê¢LÊ¦ê¢Nê¦´…6Ñ6ÚH[]�—ØÒ÷J;*œçr›8ôzÖåN˜U–ý]+w­U®Ó6Ð+êFa´p§¯'OÒ¾è	šSFŒñàÈ‘#ÔçkÛýüÆ>ìË1K”E™”MÔE�ÔMhm¢m¶�nŒ?¯¯·gêå;‚.‚p¯·ö†‰oÓ•u_£éÖ	5Jâ^§—ëÔ{:À¨T`öåŽ¥Ê¢LÊ¦ê¢Nê¦¶-.Ì÷ëËì¿^g¸ ‹C\ì‰r)¡ØŠûæx¨ÅUôXN³
W× *à3Ûø�}Ø—c8–2(‹2)›:|Á©»Oô³ËÎž8º(!Ñœs€AIp‰Yp½›²øå÷‰þÍÉ@ÿnÎ.H·�;®_ßx~î8†ƒÔÁßÞ7Më{õ½ú^>¯ÿ¶¥²óø…    IEND®B`‚‰PNG

   IHDR         óÿa  IDATxÚu‘ÙOSQÆï“þ1<øê“‰šhÀy@A�Qh4âF‚\¨²-MºÐ…RJ¡‹ÐÅˆ¡I4„`B)P
ôÒRº\
©ØE›Ï9U!a’INf¾ßwÎÌáö‡CÈ}+äÌŽä¯ÐÄ÷|v’’�YÍF=î x¶9“MÈæIˆ!!‹›½6Ü¢Iæ@°oýÌ[„¬‰i÷ÀR*Æ³S±°ÄÓ°±LdP­·à´èÔÓ^Æ3`¦•þobŽ¥uÑ]Œn¥1.üÀÇÍŒ&3p%ÒDPÚ*‡e1ˆñd#Bý›»è'æœÌéÛÜÍ[×·pMkÆ©ÆVœzÖŠºÔ3¸i°£øEG¡Vò²wLCŠì€1ŒåŒá”¼7¼ƒ'®�¸EM{$óü**:Õ8OÙèùåBÅ¢6ô\×¢Á1
Æ#)9goû¡mÔš†Ñê™@ûØJž·C4öâ»xû#‰+$JtÍú!r�á¶Ù	Æô„w|œ>(¤ôüš'¾áÌ‹vœ}Ý	ÙÜZAPÙeÀº±‡O¢ZÙ‹öñi”6IÐôyº Àê)N»–HéV0øx$B­Á
7-Ñ@;©ì6á†ÑÎÄƒªî~\U¡[ %†X2Ä½š•ZÝ¸K^.V¡FÕÇZV^ qZê—µtB2ã‡+¼×Fš•83ñrš@L¬	DQÞ&ÃE±ªÅ0î›Þ¢øi�¸ƒq8é5'ˆ`'³*¹•rº—£`,§÷Ejÿf¾B¢ÆÚºz)‚+2šFÆqI¦ÅÉ‡"\¦¯oD¥Â€cu�qABºåh^ï�q,Ô‹™jqÿòžåA*8ù,K<Š7¡†æ¯wx �@µ´µ?"ãþÅ pˆžî¡ÿ¦?£kžÇ9©¬¹¥¯:pIÚ]¨ÿíÓ%!c»ÇDé[—)Bytyƒhp‚ht’Î<óëPøBy¦)À…Ê,"±Âô˜bÉÎŠ9^¬òÒÌûâ7’!«0­æB    IEND®B`‚‰PNG

   IHDR         àw=ø   bKGD ÿ ÿ ÿ ½§“  4IDATHÇ=•Û�ÝUÇ?kïß9Ó9gÎÌœé”éMì¤7 ½¨HQcxQ^Hˆj�Äøæ?`|À„‰WT4j£jB‰–›@‹¥ÐRí´´�)ÃLÛé\ÏÌ9ç·÷úú0-ûq=ì•µòý¬�üi>A5Âc†}»¹š—CYuÂöHøœÉ¿`ðáBDvÍHœ—Ù_RÖ3!'­E7÷wâ—~²*ÿê»¢ÑÍ|¹¿Àþ<±ÈµgE²àfÚ#ã‘hvÀzdf&	30Œì.�I,g³ƒ&\ØQÉƒçì×þ«Ò³®N©Pä¥Ž«°%=kâ!ezÜ•]"yÆÌ@�rF€ zLþ�¤g-Úƒ«æ:N
Em¤NR•¢oü2�²¬¯HTW}_)ýÀ0IJ†EA�D5b·�B Ç—,JH(¹ÌO-÷¯ZŸ•~Ø>?ê“-·ƒ—£aãëÊþÛ«‹P0'íÙ^8tˆ��î¹÷3,¦ŒË1Hpw™Ì,„ð ð;I±0³,Ø­œÂa„2gb DŒK³óœ›œbùÜyj½½ìÙ¿Ÿ�²L`FdrI–³�1¼iÆÛöÔ{Á~
|Ó ÄTc°VƒT’RIŒ­,.\gxp€ÿ¾s‚5ƒÜ´k7I0·´DX™¦Ä¬"égÉã·ì“­›Ýý0RÍÉÌê£'Þfzf†,QïëçÖÛn§ãÆ9wö<cï±mëÚ­E6¬ÛÀúmÛhu€®¦a)„p H)T3#g'ÖªŽ¼ø<m36n¾�zOEî2züïž£Ú×Çúë7Ñ,;¤ìôoÜÄÑão±Ðisýö�¤2(›¨%×'¤û„�+„¢`fzš™ù9|ú³Œ4Y˜œà•×Ž¢¢Ê®½è§^¯Q	ÆÔøîØyƒ�‡_|žÍ;vSº°`a…¿¯pi«!ÜDð1’R¢aôØQ^?~‚·îaÓ–-ô®ÌÜR›zc€©‹oÐnw)<Q—�2( Œ­òµ.° Ë9QkôÑ7ØäµW^æJ«Åþ»îf¨Ù$¥Ì«¯`ç¾�l%Ä9§Þ9Áº�×ã9#\W©·µ	äx’‘Sâ–Û=s†½·ÝÆðê!æ[‹„`,–™VÊ z{z83zŠ¹V‹Í7ÜH*Z!ÉQv‚KBHRöDa�cGßdÃÖ8rä0K'iÖûXZZæ£{÷±gï~º� ín‡J½Á-ûŠHö.äYr�4$?½B¢c!Ð^˜g©µÀÇöïcóŽ›ùÇ¡Cœ{ç-V÷V@ÙéÐM™ÜíPv»®f¤^£iN—#€£Óô´\xv/Š
ããcœ;{–×�fÓ–­|âS÷òîØ8ÿ|ææ/œ¥fbM³ŸÎÜkGÖ2ØSåé¿ý•§~ý¦¯`!àî¾ÒDOæö’`Á¥F0Óâò’]ºx‘÷ÞŸdwÎ,ÎÍ°kÇN.-.ñê±ãôÆ¬bva‘U½«ø÷‹Ï2zfÌµZÔ‡VË]‘À‚åð’ýòS`ú±ÐÃfV¦TV¦/_¤Ñ¤o Ÿ‰±qN½ñ_üÊ×˜^l13}‰ËãcÌÎÎÐÓ×O,
††‡©Vª4‡‡J bð
ß±'ÏLl÷œ	Ö™™•JÈ)áîEÁ^ú5sn?p'Áàåž£oÝz¶}d’CÄåä”]R0ãý@¼8i??509p?Îýj¤0‚™aÈ9ñæ‘W Û¥›ýkFØµgr­ÄQ`†ƒ†ÅÀ‚ƒˆPL“>”¡æ•ƒ
Õµÿ‘KÁ°$÷(ÜbˆÜqç]\žš"V*4‡†Heºv×d�È-Ø÷¬�.Çn¸<\×^Í‡ÖlôvI±8ßyL²€)¹
@†eÏÙS·Ôðu#4›”ÝÎ
��‘$T€¦Ìì�¥Åîcm¼ØpÝÉCØ/FÇ>�¾d—´ÝÄÃYþUÄàŠ~1IpUú×j³Áì÷XxÂà$ò`âéÀ“§ßçþ­k©›ñøÉ³ñJšÍ«c³ˆ„î–ôy3Û&i=B&;MàïžK”§®ä…4T4â#Û7ç–ÄÁ3“|cÛ:þ?¨gÒ¶²    IEND®B`‚‰PNG

   IHDR         \r¨f  ” IDATxÚì][ŒU×yîH&�8nepÀ‰›VJÒHQåF~èCå—D­±\+j]ãÇZ}ªäJ­\©/}ªÓJyµMS©¶lƒ‡aC©0�\‚cÀ5-8à2ÜæÜæ03gï}x÷ÿÖü?ßÞk�ËœÌÍkIŸþuÙçœ½Öú¿ÿ²öø…Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xb‰%–Xn©ò‹‹B,±Är[‘û—æ�_îŽÁŸ�F"–Xn2Ñ�ùWºàW†ð»ú�hb‰eñe0ÑCb/|F°BðYÁjÁÝ‚{¿)X#¸OðEÅ:ÅzHƒ]£r�~öý®ÕúÝ+ô·–ø†¢—aˆF!–X† |¢/U®RbÞ²>ôÐC_Ù´iÓ<xpãÉ“'Ÿ�˜˜øçjµú/—/_mµZ{³,;våÊ•ÓW¯^�T>þøã©<Ï["¯ˆ¼"²%ýS“ë&?ÇgðY|¾ß‰ï>pàÀSø-ü¦‹{õ^Vë½-íe¢Aˆ%”ùždÿ¼’lÝ3Ï<ó{{÷îýó3gÎüC£Ñx]HúŽ�uRœÏBp“Åú‚¯Çoãp/¸'Üî÷ª÷üy…Þ!ƒX>�¤	¿R½é}�<òÈ×öíÛ·Q<ï÷ÅïâUEèÅ_O„Ÿ·º†êÌÌÌ~Ü;æ€¹hZñÌÑ7ÑÄòé"=Cäåê%×<úè£¿ûî»ï>]©Tþ-MÓÿ"]¡nHðEÌE"…ã˜æøØc�}sÖ¹/·õˆÆ –OéWÀË/[¶lÝ«¯¾ú�³gÏþ£xøÿ’túîŽæŠ9ôÑGÏmÞ¼ùÛX�|VDcËíOü0¼_n¤{ôâÅ‹›$L>/p„€´ºI ï8qc®'®ûïw:�óX¬Mh˜&DCËíäí—iˆûEñrtþüùç%Æ	û ‚Ü‚?¾øûÌÆ`k%ÑÑã0Q×pYŒ
b¹e½½Gü•‚{‘ÓðÁŸ$Éñ˜/aˆÅúúßqÝîk‡5Ü°aÃ7°¦XÛ¢!ˆQA,7?Ìç‹8«ë%Œý“Z­6"ŠÜºÎ„�w4ÉºÊ;XK¬éèèèã¬²‘bzËÍ&þj_ž�?%�¾‘ !llx‚Ÿî\ÉÏµÚùÉV'?2ÓÉ:ÝÎr¹“ïìivòRß%òß§DNAZ�òM½v·`Ÿà@3ËOwò£‚ÿ�mçç“NÞl÷¾¿Ozþ³³³‡vïÞýÖkA,7ƒøK‘›Ê�ÕýòfÜÓr¢}lhC¾švòSBôw…�û/a…´;o4Ú© Ñvc^³³/xíNHÀúø�€´ÛòÛm¹‡¹{ù0éàÞ>ñù›Äš¿ýöÛOË¬×s‚¥ÑÄr#ˆ·”>üW’£žBá‡FK<íñèïÑßšâÕÛùv!Þ¸q„‡l@ª HXÖ};›È©¶ mÏ  ®²�º^¤‡qÃ”Êº»Gw¯ïLÏÝ{ÒzþCˆ4MO`/°'Ø›hbYTéCü/¬_¿þ+ï½÷ÞßˆÒýüz)°I |” |Ï.¤áë&Ð×F]¤‘Pˆ˜1`HL# 4”ì2æ¼<$„^¯mz¤ŸøÝf| a˜€qHg´¯Ž¹ÌÍéÿÌ±ëüìÉÑ£Gÿ{„½êf¢ˆe¯ÏÃ½»îºëËÇ�V<þ9([»Ýv@]åÐ°ÏN‹—?.ùú�§2Gî1%��_�)‰ A(z\#Û0$)ÆXÇ¸zñfÌ0X]eÓÕ½”¢L~Â“Ýc÷¡óÈ¤_çƒþZ–ï•¹bÎ—3®¡·ž¬‡ãƒÁ¹÷ßÿïV®\ù¥âaaŒb6ÜÿuÁ}¯¼òÊ9x::H!ýñKEžlµ¶!Æœ·WiÞT	…~�IÛJ6Gtí'1IþRÞÎóŽñ/¼§��vÑ h˜Oò·»{ÿ:É¯FÀ<¥o›Ã×l»µH‡4žƒöCd�½ôÒK°‡ØË˜Ä2ßp™à7üñoÊÛi/‰2]%‰ûa°A8+Š~°™ÁªGì@Ž4èc
 XhÒÆAþ:ÉÈ°\Û¬«—o«‡g¾Ï1@û,rð#ýü¸ýN=ˆ ìKF }Œdh0ÿm²ÛðY‘?ifn�®×zcï°‡ØKì)ö6¦±ô÷q²äÈ‘¿Î²¬J¥è�z¢š¶óŸMKž’F¡ðí«�ôž@¿Èyw!	 ý@zõ¶¢ãŸð0Ï‹vú‘ $=¼Á¾Ÿ‘ ¤’Ýr} ×ÐûC–ç²@Û_ÔUb­°fµ¬'Á‡ö{Š½�iA,=ÃýçŸþ;ò`üJ³XœMÚù	ñGU±Œô"=�(ŒH"‹H4FLŠ9º†ï½ÀsÔUò©AÂs\‰_0 j„Šž~ÌÐ(7�šÎ×7ˆ€®ÕVÁž)·–Fd“¬«œ°·/¾øâ·e¯×bÏc4½><ÁÝ?üð7ä¯ò6u¤xžÃ¤‡Þ
xf6ËÔH…øQK�ü&A H¯ž‰o`øldŒ@1
ÈÔS»¨ÁOOî×ëmÊzï�:¯áÉ?¡¿ÍÐß7L™EÝ# Ôpm0Vì³~ÁîF*kËu^¨AÀc¯±çØû|z½þgàõ·lÙòÝV«u®¿V¸…øoÖç<þÖj
iJ†ý@yL	!õ0
0Ú #=a‚ôÜ?"è~ ÈëÌëÓ X×È.m­×Ôû×èýÑÏyô	ÿÙG ­ØZÏÞwj6	?¤ÁÆì=t º£�;´ôðú+—.]ú¥'N<�@%ÿ3“å»êi¾Õ)mRÉïÉj*°>ß 
F ¡p¤‚ ¸¶!+’Pá{ëlŽÈðê¨ÓÃÅG‡êÙõ³"­`èïêÞÁŸæÿž÷gÝÍÏê3 UÌ_×«šrÝ,p}Xg k.k?Ý•àÃDè t:aÑ@4wXÈï½ÐsÏO<ñûõz}ïâˆŸÊSP@y�ºk{À)5Iî Gp%„åÅÁFF<ÂHXJ ™Aš G—6¤¶‹Q®5Y6 ÅC>´™’¨dîOòs.ÌõÑOòsœ0`é `u¹nD×{€½XÌ^Bž|òÉ¡ÅˆbJpg…ü¿&X'›ÿ§ò_X¨²L¶ä`ª1§|#sžIà¤öA¢oL	L¹-"PÅ÷Ó %Œ’G€>HkgnÓûó°d5#�º÷ì¾Hð¶ö—…¶µŸ�÷´Íß,=’D¿»7»ï6ë%{1ü7�ü�üº†®�ëÊuwHÑïÖw{³pC �€n@G +1%¸óBþäoËÿIÂ¾+išæ!œò˜ÐnŠÒUDéæù�ìôP)CÖkg*éñEjÞË> #	©mMøÚ-£€º‘ÔˆM¼q�àJvH’c4*Itø‚Ðq¦)œÃ X‹m�ô Ú^øßïÏõGÛõ©ÁÍvßÏb_W@7$%øžèÊ—cJpÛ“Ÿ!ÿÆ�¿U«ÕöõÚøAáÃé4ßQ‡çXøYuÞG•Q¢[_-Td`›«ô|¡°:$ÏÂ(ÀÎ¼h aõv ô¿¡ã…P¾˜20ŸWò�1ÐÏu‚ß·ŸÞ?õÙfÔcë ÒÁ"'À+ÖTëåõÑöëAÕ]‡{V&ü€®@g,%ˆFàöÍ÷×¾üòËß•Wy/bc‡EUBÊ=õD+éUBÙDÚ8â3*p ¼aH=,� @oLRóÑ¡‚ÞÞ‡õ“ø
æô$>_îágì^”øÁc¿š«sNœ¯y~ ®•“ôþ\ÓŸüf”ÑÖqjÈ·ê‰ÛÃ…ì=tºŠç·ùùßd­Ûµk×_Èf&Q€£Í‚g!ùMj$@¥¼s Oy-@¿#�€÷˜Ð?(£q x.p-ô	€tfÜçR�’oç�®€cvŠOÒ“üz½ïùz}+|öñþ Ö¤Z2˜€‘]QŒ¼˜ÿ;ã\1ã,r2É·Ð‡½\ˆ$R CÐ%Õ©%ÑÜÚ‡}Kô çþC‡áÏv;º‘]�1“VoˆÇøQ­HzHõ2$?#  –¢˜’RæñÌ( �)€†º©y=}SŽ3�ü”ŠòKCE¤J^|>µ<èQ§d½Ð®©äo£¯hlô¾SEðRÚ*ºÌó³9`-¬·ÈQKLò äWÀHÍ°¥šˆÄž&y}vàþ›,öw KÐ)Õ­%ñpðÖ%ÿrþt÷¹²§œžnåã¦PU=ÊÉ]¢
Å-y|ï„šýÞY@ðøËˆÁG�|ü§„2r)Ñ¬×Ð@Ž«ô„¾dÆÕd¬ =ÐãÓ((Ùi”Âœ?|äg`¿y~�†Ô (¶–¼?ƒF]	ÚŒÊl¿*�Ü»-"±/˜ã™™á€Ièt:�À­yÒ—œÞþ–üu?À¦‹ÃS	½†Ê T0HÀ�pŠjù*½£ÈÔ dÈ,DÌcÒPT³~é Éè¿‰Ô÷ða›×ù‡Œ$?È,’¿AÅûm—Ò>âs’mz%=úmÝ2/ççºÒ6®Wòƒô ú]R÷{½9}úô cÐµø„àÖ:éÿìÚµk¿zîÜ¹íÃn*ÂÂV*L-+ô“ð0%`€¶E	$}Í)³)}Ù»‘Ýžøi rdH#!‰¨°q†é©HÏk“¸Ý#Ò.~Wx@D/ïŒ–J›�I@Ç·kÀ:û!-%°‹)ƒyÛFkÜŸb@Ã€=o1%òŒA× sñ	Á­AþÕ>øà7«Õê�[­–Û$H«›üñÓÓI>
òS1@|HËý�ôèƒb¡˜Âé8�ôúJvVQÁ™ïk<.$h@xKeñ…!€i�“!,M §'émœÒõñÛ|·m»€QŠßæ3ïoóŒìº^ìSCJÂë:z)@�üŒ°‡¶7ÜWkÛ^j¤qúrwýÁ±J¥²:Ý‹Fàæ’ÿsòp|«Ñhé¶�…¾ ?k•#u ¢¤„]3™X¨ÉH€ÞÞI"ãA!Ú�‹èõH|¯¾Ò?I§`ÝóêŒÂ1ÔIòÌ€6¡mï»<sPƒ¤Àî©˜ºÐÈqnž—ðñ^ÆÐŸ�Yƒ'.ÖhŒµ>IO¯ÆÀ";«s¯µ]èCxÈ Ð9èt0�›CþU°ÂõzýÈü<>q@6|s aŠDoF%ïo 6nðó^�$
öñàÐˆE0Ï¦gÖº’Ù#0ûÞÆ<�ïÝ%Ÿ^øy>Yâ³m'ÿ4†€ý�Š¤pP›1ÔGŸ·�Œ Ðg P#0 {	¬ŠFàÆ’åš5k¾>99¹o˜›ìù•Ø›'Õh¾O…R ¯o¨šHÃT€O	
©Án/=`*à¿£ÄÊ ‹a7ë�a˜Î6	O²+üq“¼ ñ	mó°Ò÷öÝ_ž"ùi Hv•|ÑÇí¡í/jëb <èÞO¨§N7f“átPtñkÐÉhnùW,Y²äw&&&¶Ëà�­›Ã1È©™ÙüÍjb¤çÆû§Åa›ä·6�€_ëNYM!yH¨0# ›¢Ó(H’‰@_HFÂËÅUu‚íuÏÛà“
5Tš¶ÈüC#àÍ±;ùu­ØOï_B7òkšVDqý”�z€¶9èHsv¸H ‡ÏÐIèf4Ÿ,ù—~ûÔ©SÿjäVÙ5ÙÐrêûÚ¥–Ûè×h hœGGTÐ‚r@:„Š•zi€‚g„^ëÈoc )…š|#ÀÈ ¤™z\>!èÙ#­‚ã*{“>óeÙ„9¿Õ�äüTÒ(jš”ð:Œ“Œ°ôÌ¥‡÷'ÑYwû9×vû™po�¤@€Žì]©NÏB·ˆPßJ}ÐIè&t4�ëA~ |Ãï�cÇŽ}¯ËôÄ…Ë³ùXÅm¬ƒÛd(€ü1På°C¿–ÀêI·°RÁ1 #½«Cšâ• 	˜Ì›ËQ€J�Æ à8àÚýÐÓ€ŒòP¯Ðg¿ƒzBâw—’Þs®™�D[×Âóþh‡žŸëò33Ø^A4ä[LªQ(E�E# :�¹8Ý5¢ìi ›ÐQÿ�ÁøÚð�¥Ç»ý÷ïß¿ÿY’{0&š³ù6æú�¦¦j�ôþJr­SY‚÷èu0ÿ�‡¨Ü~ÈËH€^PP
�-´¾66×&� ýˆ�y$'±Yççµî½Ú›†é‰›O”ï—s*„ý€—
I�†QdÎg_˜ã“üvÎãÈ/ Q@zàœ„9Ü»ÔÏ6¡KótºZüÛ�,žüëÆÇÇÿR¬lgò�TtSÝ'¨›T£�ª'ÀxÁCPq˜`uŽÙëÁ¥'Œ˜@™ý¿!ÀµÀÆùê°O"�Þ�Ä¡DUI¸6ÉFôÚv-Ç-
HŒøðäüMÔ9®ÄVC@c¦ÑÉÎH¤Ár~ž¡èÚðñÉÏµ/çù-ÖÕ°‹¤ñ¯¦n¯úcLuBõâUKñ›2>1„€ŽBW¡³Ñ,žüË÷¾ðÂOÈâ&333n‘!Cpìâô,Èb©dH~à5%øk
G[¡i@Ñð<€uHmCIµ/TVô3Ÿ…â“*é	ItôÓû+Á´mu°ñ„Äs{æÿEcQŽ"Ø¦Ç'áÃß÷tœóÓùò, <®ä7Ð`Òˆr=yˆg{ÂT�©[ÑáZzw5ø*-E¤.°�µmågf‹:ÆºJÉ¦M›þºŽF`a‡~X¸ÏÉÿêòòï¹_$Ñûc²9#¯¾º…€$éƒÍE?�6½†‚}€*™ïuR?(?ú£W³¨ !ª4 
’»¦õ*ë|j ™Ö�ARC¢/�3¹u�¥&ùû|¦ÏûbÈÏ°ß#?×‰ë„þÁ!ý”+í~ÊOcÀÜŸãêýÕhÛ¼¿“®ceÇ°½š8Ýš¯Bg¡»Ðaèr<\À‰¿<Zùê¥K—öÏwÑ§¦gò“B|l �€k[$pIÉ¬J ¹ 7œá¿�ñ0Ðz@åâÙ€—JtSv?¨ÒËè£Ç„ÎHHŽûÀ˜’r¼žæ;;j¨ówô¼Ïwõöåû½:ú}ÏOâ«±äk¿ECH#É¼ŸÆ–ä¸Ü›`ïèõ+ŽiÓCÈ$�@§ [Ð±y�.ü't8>˜— ùíÄ_þ;§ï÷[àééék²)ø�ê,6Œy¾ züÐâáy(hä°ÿuH‡„’9§§ -/Oåi·z:JõrTüHá¤k+‰Â°:ôÈ£!hÔ‹íi¤ùÁf;?ÔÌJ@ß[2†kFItz~~«ñy‰^‡>óø
HH[ïðÅž°n{òºJ" ;CÿJb§þ„’_$#D'©CÿÏÞ™ßU\wþ»*å™8™q2®Ô8ãqfj6�=å$Ž—©šrÂfððx·1N)Ûox`-;Bû¾ƒ6´#	d³oB „�ôÛý6Éq�ãºs¾­søÜÛýžÊÌ„ÍþU}ëôëîûÞ½Ýç{–î~ï·®ÿX5:ùÑOíLeg #ðð«ýÞ2cÆŒs,—ú‡6„/°ÉÈ¿@„ï1ÙÛôüªÃDØ8F*�Ê„‚Q;À@úÆt3[Á\Ñ1ãmMoßl/×0Qw�ýèîÑÿ]íÙõ¯ÈôTóžx®š÷ä~•Í X»C}³ë1&£¤z7�ß‘E‚§FBC9	ùö+õD`ÌEDi½îýƒÔ�¸™îùÂ`šÿÔ.iP�ë�]C�Ú’Ž™®�ë�¢,üƒtY:ý›EÁ_E~òþß;óÌ3?022ÒÁ`°wŠð
Ó„úä%BûäañQ†ãd_‚^¢¾uØÒàqX3àÄ ·÷ÒWXJ„ë îùí=ƒL*¡ »@N�$hwëðqâ¯;<P]°|Cuæ¤›ªÓ.ŸÚÀ™“oR›úÈPèš¸¾u˜Ÿ—Ceµç¤÷{·²Kƒ?£_ Zb!Uãrû˜’j±;Sìù;˜SÒ/f»C’8RÕI—$wƒôí€¤Öº¥ÓÒíXø�h½è§c¾ï°ï\og Û°ðÀÀQóðÇ'f~šÏbdÝS»a‘ :$‘ Dw�"‹� �ˆ0jÇ8œô’l±> �‚TN87A¾D&È„Ý`ù½}õ¦]Õ'\[�vÙ”êTƒ¤ ò‡N¿bZuõæût�®ÅÛóþòÞe¸O¨ŸÞËjÇx¨C�í÷ÇXA~¨Ê¤b^†Ð*7æ	ò\˜ï„(;éx¹H·Tö´Rç�¡Ÿ�£Ÿ@:-Ý–ŽÿfQ°}Þÿ~øáÉ>hãbÿÐØñÉèÑÉBG¨¦:“B
í ½çýX|Õ•©@}‹å"¤,�@¾F�å© ÿÒÊÏœ"C"¹KÁ	CÂ•9·Ã°Âêï7"Ùºš·Ÿ‚ô2è]»‚Ï…ø|^ÝÓÜo±ÒŠœŸhÉ=ä'½Ê×l„û!¿úõF´óiè' %Ä1$ xý„c‚—�tðDõUºm:þ~³Ð:ïÿCû÷Üç˜ýÅ‰æÀèQSvóú²Ê�^A‘ ¯ÑÃ(°%ÈDƒé£.ÈŽBIÉØEÈ¼F °ˆa-ˆ´Aí.£ŠÀÃz9É“ôŒäÍåñy@]	»ö~ûYt3T¼7Ÿ	ñISüþ1fApÊnôžŸœ=ÊDP¤ìÌä«ý�˜'Ò="»lÛ/¼¿$�Þ$éea>º:”ä|ƒtp`ìÅP?$e—‚t[:.]oµðëúÿîûÞ÷¾÷Û÷«»4`m°Q·¾Ì&Ç'¢û˜Ê	‰ü}.­��_ÀÚ³åãž€v�‘/‘øv‘•C‰Z?d¯�H	ˆ2R4ˆ¤z<ªKoÃãfÀã®9Ü_}ÈBúÓZþŒ+§UŸ¿u^uömóTö(@íÈ3ìÚµ±oÏZC|	Ç”î‡-MÂ}@ÈÏ³&röc9ÑŒ¼¨##:ã@�]/™ÝË„û*ã$‚ø.�ä_[
‡#�SYQçº~tÓe;è‡Dº¤ëÒù_ÏT ýÿ™Bû·]3Ç³ �ŸÕà™…†øD’�<RI,:Vi€e@¡„l•Ò£¨¬HbÂË±�ˆa r«�5‚�DöÑ1@L…î­¼§ðð*Ÿ¿bcµ°ûè‹k»ÆªoY�Úr\hï±’Å¼fŠ’Ë0b�œH ¢ o'*Âp‚ho{¸GoÏ|ø1ßà„wCÐé{Ðêb]IÝr½r$£`:™G í±gÏž™Òyé~ž
ü:†þpÙe—}ÜîR{ìÓäB~¤Âãõ	ý	íR„<¤ÎàÊš¤CýQÊc®¤’æ!°âÍ6˜·IBêlM Ä‹²ä]v*ïc“o.À7—m¨™C9’ß\±ÁûM–L8ËvîJ†'ïAÜû÷xz¤Às¶Íù+Æ¯)iƒü>?öãý3¯_ƒ{t½éb=2’Na ¨«“ßq4éæ‰è°t]:/Ýo•
üº­ú¿ÓNû=x"×?:V-±�žg˜¯Á�	ˆ�¬U`}Ã@àý�j¢=ìÃ8°ÒK›)eÁ0^ã� xÇZÖ-qÅ·÷‡4D
†°_h¦¤ÞAg?×]�úãÉ‰ü!OŸp­yûQõa=Aeßù�#êãFÜõB¯~OÁú×S“Ò%‰Áâþ‰nÜëÃ h,¼.½ör6~U/CòD|^gägnEtI ¾ED(Ýê•>™´2F@}!ý<ƒd]—õè(z{ýµ­í�:%øàë_ÿúÿÖnWà×%ôÛ¦M›~¨¤rÀ„õ}x{<~L–˜\MeM¤#HN*�€W Œ’ 	+kg²º<Œ%—Í½Ø±¼=óˆ…Å;ŠUwÁS†Û/â'oò‹·Ì®–y_Âw ¶/Þ<[ýXðÔóÕývŽ`ë°Îd†ÈËÜG´ðø<"(c`’\¾&<~HŒn¹è§ùŒ¹bnƒÜÌ?í=YÞÃõ¦áPDvÕIº®IÎs©ë6Ø³´Öç7n¼Hh�
¼öCÿ7�|òÉ°E‘Á’ðå >80†åíö(À ²O„¿>d/B6Ò�Z
à%ð:/ƒZT�ç‘"³Ø„òfe?‘›ÁA>Œ$4N×@¬^'ƒÕa4$¯üyyòDà�gß83^šEa8´â¯>5>>å–jÆÃ{’ØiXéÛ�…·zYÄãþ0n<k›œŸ1€qf®4Ž�Ùë"5X ²TÐô'•I]§Ô]2é¨E•Y
0O°k+ô€áááAq@\x-§xBY¼·ïÛ·oa{�º†Fl2|€ë–·ˆÊœ-^cÙS_îõx PÀª3FÁ£�æV–”�fŸå„ jÏ<"§á §»xf•gìï-<ù�Ø[ûF«M:àÃþ»ÊªS›úd×MzQ~}îòjsïˆŽ[J@d 2÷íuB¯?!@ããÄâ*S¶5Ëøg9Œ?D¯…L|þ©ëV½—I']&gá‹T@åŸ™Pÿ£ÒYt¸ î™gžY(.8'~ëµàý9ðó–I“&}Îá—n	¼\Ô¦>YVàQ€Ê&UÆ
7;Í]ƒ˜d&ÝÑÛT”„m¤bJF¢€¡„DMDDÀ‘W†¯�rY›¿Æó“64^Ÿ¥E@Hœð½%käÉv*LªÍûµÅ'¯½­Zñ\§úË¤{€ôqÿäñD@vFx~!Æ,Nk2®ÜQß,”N~æ‘m=/ žû§2k N|µ“t;é½¿ˆ¯r`cßX{òÈürâÄ‰ŸÓop@ˆ(àµ¶ð§0ç�oxÃþ¸§§ç‰V’„§Gœô
Å|ÐM “Q@?êyÝëeù°ö^Æ�+–¤DR@¢�Ph¼ÞßÊ�£€T¨_ŒD ¶ÔH	Å¿µ|cÃƒ§\:©úîâ»ª-æÉïwòoé±º»Õo|ØõºršR�~Ž§'„Ïùx=§Éðø<³¿Î‚�Y¾-ñ]¶Yô£Ü‹÷ºDÈýU/I
`ðßœÃaz¥—ô¤»Òãñœ¸ NˆâH¾ øZ[øû£Í›7_ÆÀ´ A+/Wèß‹u-!RCv�‡l�<Õ‡R¨#àÄW¿l} óö¬!H™ÕÖôR„£Aì†ì…c$œ0€þ*ã]‰
 !©ÇÌúí0Ïµ…He“Ÿ½nFõ¹ëg¨Oí!OsÂ§º€×)U¸ã¡§ª]¶0¸²?>/á…,"êIhæû„úµqÈÆ´÷üª/öõÍmÔåy¿�H�èQh¯Wx" �vÆ’Ÿ Ä	q£Õ‚àkiáïwÞüæ7¿g`` ëDå¾>óþ6ˆs»ÇXHíeê@ö�Ô©Ý'�0¯e8˜�#
(Nö <R¥-==„P¯2€ø N6Æ@`7á’Í?�:G^~ïÃÕ5»Ÿ¬>:ñ®ÇH¸Øcƒ¶(˜Ý#÷.@x†øŽÊQ•%ëe"-�“I¤/py¹™gúàúÉ‘èSú«}ÞÿþþÑ2 â„¸!Ž¼Ë…?¶ý.=‘éÐÂ_—ˆoÉ}€AÓŽÅnÁ˜àbŒB&8@�Ê¡í¶‹P¼¢žð5ËY)Q u´…Ä`°hÖ.5@FÎèäŸ=>ˆ¾½jÓ‹ûó3ôUŸ¿i6ÆCÒqº^¸çùjû�ÖZx|¤PŸ6�–Š|?÷ømr~¶ñT–ôHN ì‡üîá“n¸®>ÿN`à¯C×ÊÜèý\ïtÊRº|":/nˆ#­_Þÿ�o|ãŸ™¥{Á¶þ* 4!×÷Œ˜çgk¥=òIaÒZnbC i„Ži—¢I
ª™AŠ+é^,½g”# ¬ÏbõÁkBŒ€£uª€d«í’-?U:�E %¡ÕgÂŽ‡ý:>w~çhõ×3%Ô®;óêéÕ:ûÞÁ=ƒ?Ï¼¼Æþ$éWÆÈ	‹1 ï_ áAž®1wNþlnõ�Á ¥.AøˆF»\â˜@m[pŽõ[ß;Šn»@Ü0Ž´�^õÞß~.ù‚„r@(?Õ?â<¦L9×¤ƒ!WªSÙÛYÀjµ…LïŸ¢�…¤R$È�äeÒ	BÓ¤è.sTFæÀx]F$¹5©Aif½0P�¿rcuÖ”›�¸×"±d:6üýµÛ«;ôiFHEdçÎZrüÚK¿ÞäìüÀö�cÕ*}i*H¯k‡ lûé¹UÑÛçûAÜ<âò2dÆûCv¼š{ˆßå: ô"¨§—Nü.IÈ/ÔCÿ¹	ºÖ¤p\ÇLŽ&�FçÛë¿8òêŽJïÿY4;öø§väw_û Ë»G�ÌBÊÿ%�¬X`IÁÃþˆ Ô—´€É+r84ÙN\¢¼ §,V�ñ.´7ÖX½Î³@þŒB"Pá1!vcP–é‰ëPX?ýÉÕ�{^¨ævñE7µ!‰4ø\>û–9¬+È¸¼Ð¾Kpï‘¿çÚVG~ñô!lÕù1¶›]æ�Ý!À<ã$DzRÀ1¯}¡ƒ(à˜ÐpJ±¦º0 Þ¾¢gl< hG`Ÿ¸"Îˆ;yðjõþÿvÁ‚ßáAÛã‰þaTG*Î×ÜË’‘D�ÄÇ*'°uèùŸGÝeŠ�d]¡GùœØä˜l3y{=<%ÇK-ìƒø‹Ã(XÒkÚÜ€�J¡ýöb”!#})—×'xŸÙ‡†ª�O½Mž_ÄGf?ö¬¥)•14‰½¨õóSg(Ò€:Á‹Œ9JãÁ–/¡½C É%êÒ<g$�_D xtÍAè/½“#›ãÎLº}"X´hÑ·Å™WaPzßÛüûòÃ“ã<¸þßzµ²kÔImè´�ó²T#ˆ|?Yä˜B6I ¾êÓL	Ô?Cà!e¦@(¢ ±”S¤ÃSä&]H} :ïU‹�‹ÖÑ8Y'I]{AŸV×#IInÞsH_ª§¥7¥Ó‚Ë0d¤&~¿mž_(�'á»�EaŸS~B‘Ã—s�ñp�@G 5ý½ì:EúéQgž¹º”!XÕ3:žþKêçÃž4Îü©s§ˆ^mÞÿßÜqÇ_ÓÃe¨?´çþÃ¨„˜Â««<ˆzßÊ©Žz'4)@ªÉÂ!Ñ^Ÿ•`rÆÌ8¨�r&/F{CYQØxÃŒØäÐÑFšà×"!©¤÷…ì�Ye€¡ðþY¯×™1ºtë"}ý¸èK¼?QhûÜÜ/ý x¾ØÇ<e¼�E^¼¿ÿz É¤´QßÐ«zD€crýl�>úÍ‘33HÇ[èqFÜi¼šVþ[ÞÿÐ¡C•LYRXÝ=¢AÓ@1pz-t«ìƒåöþGY$T}BL°0¼i�&@ö<øvYÃ õ‹6ÀN ž//D¡­LX€”‹”uu —…¡ÂgF¥M"œ;sIa N³ˆ`¹^‹‡ôw2»$/QÏJ=Rh\¶l1Ê™ÏŒ<sóN!�u#ÁIêm´÷àýCoYÃ2©>’†Õ†ú_@œwœCÅŽÀ«åÔß[¦L™ò%¬=ž"_²…¦9àä÷2“ƒUá!·O“‡ŠFÕ‡íÃTN`¢¤&Q>oÃb @qA�ïŽ©ìRÇd!IÚ jk@lÊÔ��âf<×W�1ajuò�®d ’<ï¶ùÕV‹šŸE¿Úócb,ºÇÊ£Ú9¹ñðªCrÈ‹~>§®Åvz!ŒºôHTí!sïßÐMÏû1 x~Ç¯—®ŸHD,îˆC¯ŠÓ�œùoxÿwìÝ»wõ‰€5=5Â'òû æ1 ²O© O*Àµ>áÈÖùF€ð# °pÄš�7Þ¤ð…"G¿qSƒc3ï<- <Å:$oo(èËõ”ù¤áâM»Ãû7ŒÀ>¥(€€ð½Ê]ˆ/``Éé�®c¿Lïðü�Rr’"ºl…¹®#&¹¦ÛÛÐG‹�w[¤{"œ°ŸÉ[mú¯õ(€ï¼RÃ¼ÿ›ÞûÞ÷ž<88ø÷†JÐC¹l`_ÿP�à#�H2rw»UuòGº0OÒÀ�‡ÿ*Çäbñu�Ú;Q»#@‹J*£tä“RbEÞ_åPà¥¦°«ôS]vn~�‘bÝÀÏÒjùFÃ&ƒÊ¬n½Iµ­±=õ»û�U+{íÚ^70ŒAw"í"©×	‹!j½\®ãzÊ|F’Ajžÿ“×ÝQ�’Èopyöô;h<â@NÂbÃZ=«AÏº¶ßžÕÆeµ�Ë²^}æQ"W'¾d¶Êä®Ï© Ú©#ïÇ9�2:�ýu'etM2¢Q/K’¾šLzš0·C:ÍZ€ÊÒùñ€¸óîw¿ûdq‰(€4à•þËRýsÃ¿¿çž{&Šðã€u=¨!ÖRõEd@$@Ð*$S[DXn¼B3äSªíô!‰—�üx%õK^yµ)òzSì-öÏ7w	vÚQÙ]C?—4Hz� r	}ÑÆÀ5ÛMn¶÷Ú`Fb¥‘¥H� ÷êì0@rê[²ƒ¬ÏÕ»Ÿ4¯?Qž©(à¡§«6�¬ÚÞö¹#�'Ø<h†ÐÆp¹î�(¬ôúŽFTÀª~Ì�ÏµKo£]ÀË‡‘p¢‡.u£{èb €¡#tx„õ,×aé|Ix8eqH\§œ[¤¯àïûÿŽá=���{1 ­qxàH˜9äýäKa=%;Ëô ã@›GŽ°âaðìDj3˜l„ÿ]™ue)Aä”’Ž•}Ç½ùS`AŠ,òo?b„}®«ºùþÇªÉ[vWW¬Û®_ìM_ÁýÚœeÕWf.²ÛXV}gÑj;L³¾ºäîÍÕëï­¦nûI5óá½Õªç»uÊÎ	yî–°ûÉ± YþæA–ªPWï›_á—õ÷ÖÍsßëÏ¦ûPŸ³o™+ïßÀ,
P”“¢ Ã]FèµûªK×l©¾¿tMõ£Õ«	ë¶U×l¹¿ºñ¾Gì{ª�]CÕÎÃ#’?Oån|¼F:r~"¹�¬„Á?épBÝÓ»ô:<?9¾ëpÔ¹n‰øÉû›T•S»ä¨t¿/0 â�¸ÄÁ ,
xnýÉRýëK/½ô;ÛœD2Ê!÷÷U³Ó€Ä@™Av!KÈ©ÈÁ »07•yÍ£K”Á¤Åñ}_—„�Dž¿ë?Æî0OÄßÐu¤š¶ãÁêûKÖèˆ¬}kn’{ÅÒCž‚Ô¨î’‰öÓ\7UsûüêK×V3Ý+Oêx//¢I’2 [ ê2�B(4Wz"²7�Ð0^|……©?{ü~/nÞûœÇ÷UKâsì+Ê½êºqŸÿ#ö�„sí\fÆA×oí?ZítC°ÍŒÂš¥ž˜Ì<?†Yu�Qv‚'²CüB'Xð‹5(ŽôŽ(µîõ1�Ôç¡¿t=úÝ×3$ŒqIœ·^y[‚åÖßoè¡‡fçÒÂ èØoXD¡iY}ÀT7»Cý¨Oý›Q ‹†.}ò0,(Æ	¯Â#¨m>“Š—'œŒ‚ä	·ËC6öŒT7ìz¸úÊ�‹ì`
Ú”"«ãZÉk¶î–gu$ò;±‘ª)¤PÂ«®!Õw©É5ölF4Ât'üÊý])2ùÚì¥Õ_N¼¾:ëšéÕ»…êºö³fðâþê»ÖÛ´y÷ÿÕó0ý$Ù2û!’§eˆÜØšŠ'"´šÇ>§*Ç¼KÖçýhx~¢Hœ�ë‘§IÚ!<º˜¤;5ï/Qn`¹ÕãÛC\§Ä­|Kð•¸ø÷»v–ù½vî¿k¼àÙ¾A#8ƒ2;aÄÈnèŒÐ_e�:RXß´¼Ý>>¡äp¼êH04îù‘”Õ.àMØ!HÞl›…µ"Å†Î#Õ¶ðÒIò|ÿHˆ(HÊ´ãQ£Œüøä[ä}‘í¨Ê[j&Õ}0Avïg¯µ÷¿Æ¼ü–ô\xù5‡ú’a;ÁªêcWOyõÙ’�ò�<“Þ÷Ê]�Ïxªµßu°Oi„~càÿùùÏ¼ú†êŠ÷V[úF“!Øl÷½-àùs#Ï\×Û:ñØBsÊO2tï¡Ft¤Á£ÝÐwã üh}? Ë8õq«Õbà+mñï-W\qÅyåƒ”`[ÏPfG€­¬÷H€(€É¢<ÏežrÈðð1ùÙkÐXV˜Ëmí;Z]µa‡ýë­©((Àc#Oœà-ÛK|âºÛ¥øžû&PvoÞ¾°ÚžC‹uÒkÍáòµÛªO_{ë	ßßëï�Ý}³°xþKm]#ýºSÇˆ~[àÿËóËL±hd{JO,‰cÞÉ£Cú’ü¤	œ=q¢£/ ÝB¦r�*ÏŸëDÏtW×ù#2Úñ£Q7aÂ„sÅ­WÔb`›sÿo·ÿ‚:o<«Ög˜¯Ey‘¬â°Ø°ê1*],3–˜Éãan ºØúËÏH
lE(ˆT.¬pÁž¦äÓ3…\…¬•?råuÕÙ7Ï­¾fß»{[uÑ=»Òwô'ì|´š¸û‰jâ}�W—m{°úáÆûª¬Ùn?È±±úÛ…wÙ5óª¿´0;ëªûwo^œs
Èˆ–ÖØ³Y(íÄ_{¸?ý#Ñ/Üp'ŸÕ†€€¶)í}Ñ°üÝÚ{‹ç?Ë~Uh]ŸoËÚœOz`�¥?©.X·£úî][ªo,]_}éÎ%Õ'¦ÝV�þã)¼ÿ	ŒïošUÝ}°7-J®�‘�ÌA|à‹}’‡v€4òCl�RTtt6×[ý°×»n{”ëÎl�µ÷Á‹¶§üL@ñý€—;ü}=üÝë^÷ß{ì¯¿¿?Ý¸ËOôQ¨/øàŒ
>@¦Ú}"H0l±¸1Á
ûÄqF€þz�EÃ‚QÐ5™÷�§”‚Ýò“ÇS>z’)Ÿ tÙÀ™×ÜhJ½®šôàÓöÝ}‚³Ý$t•X�äh’sU7=uP¤O†â–½)ŒOíqþ@èù?�ÞdÞ2v'6u§ÅÊsoÕê}I0 NB
éŸ�^´a;ö93žï«N½äšÂ€Ì|ôYk5Ø}›äÙG‹E¼›ö2ù@õåù+e<Û ½¯¤o{àI›£ŸÙºóÇ<²22Àv³Áu„u€$/Ž¤siÇ
§åºëä§.¢ƒŒÃ,ë#.Œg ,¥î1n½?K^Oðò‡ÿ¿­åÂ/Ôê?äw™„Ý"¬,¤$2š×©•õ r®úi+úBzÊå–Ng(F€°_µE±±¤XWZÈ�ò•
©Õþoš'»î±ýù·Aó¨1Ê�F@H¯²å…‡ç/Ô©¯IE.[��Ûëg½¿¿än²ì@;ÂéœÿÙ·ÎI?2íÑý6†#<‡!ŒÖ¹æÍãÚ�ç/\�<tŒ×ù9÷ÊjW9ÆNÄºú'OVçÍY–�ÔzüÍˆ]UMßõHµÃžu‰Œ ¤n�æ¡'çÓ¢�ð]u‘óãtäÑ1þ> ºpX*¯ë/Æ…¸%Ž‰kyðJ	ÿÿÓ¶mÛnïA:ûúmR‡�{ÿÃ#Õ,•n!m`2c` ¤Ju>à�|ÊënM|…rÂ™(NréÂA)èV[›¸qçqÏ÷Ã«\R6¥´Ð~Muûs=®À±ë€r§ú¯ïF	S[’n¼=ÈŒ!Ð{A2�úÓ×ä"3ZkµhëÌÉ?ó‘½Õ—ïXdnó<È Õg,-ø¶ý’Ðd‹fæÚ|¥Ï"BqÉ3J²AÏ°ß¼»g„1©?¿P—ÜØ®¾<wEÛˆå+ßdç-¶S*às9’®e~™wO%Ñ#�@È�� å“ºç�5 Iéµë·ëvè+u®÷‡�;´®þ_í0qKk“¼üá¿áÏ8ðPë ü`Ï¬¡�ŽXepØ	ïý™�úA!ê˜@„+\êù‘]¢íñÏj¿…´­ÃâON»=…ãDÙÉBÀ)CB~”;�z‘âc$1("F!ÁÊ:j¬ˆEÄßÚ?ZM»÷�ê3ZÐ—ð”?eG{•Ÿß¾¯§n€¢iýóc§$êfR„Q|Þ-¦«/Ï�Œ-:½OO¶oÇ”‡ž±4kzËçÑ®Ä¢§Ú¥£¾fTŸSæ|úâ’³'œ‡Óˆ<]¿ÐGê\o‰ºðü³q^!Å‰q# qK{ùÓ€òð�B’ß×»Þuºüí ¯¯OÒBž#XHá°#yþQ—„ìNvòû$ëÑ@„hH V;ê“ÐÎ¤«\ËÙîéªþ§+ZŽsg.­f<býQÒ".†¡¾$çÚN”Bå†c4+»!0¬ê«¶9ñ7Ú}ÿØVÞ?2áÚ6„/ñ1û­Àï®Þ¬ûh~^Hâ»äu½¬kþêŽ…Åç}ÇÒ€¥½éZž_ÀH2Í¯ncxŒ€êsç��êœÛ´|>¼Í½º§† Úk:
ô�4Bc$Ñé,$®uQFï…àÁºÎñ€¸%Ž×~OœË½ÜáÿÍ™3ç‚ñ¢×0ß&b–\ˆ\è°×"…çg0dXOR&�…š&¯ï.ÐÎN‡MŠ�>ûÆÜe®\W&œìe…ü�ƒ!~F!ÈËâ“ê Ejg�BëÔc�®¯¬TŽïÄßÒ7–öÈ?<ajáñyžGaù7–¬Kë‰h,HÁóE;ÊõÈÅï]‡~b¼$…�^9MG‡uãÄsæ©ùº/¸%ÙÁ¸Ï>4\}ÑM<�ž5äÅ«î©VõŒ9ñ!¦è«üDåMÀkgäw27õ5úHá%Uù¥÷ó­½Çdh8Í(‹câÚË˜”‡üœò;íÄÒÒñ`Oß`�[9�“^R¯G\Æ ÖKêu>¸,"º5†ÐîñÝˆH2)L>¨…zž'–íë¨NvI†2vú,}^�Ô•¨v# ðv"Nz{È²Œ‘YÞs4ÜÙaØnÆJ{âgê˜-ÏHY?ÝuÑ=÷U³Ö½9y|*‡×õvd‘®p_�Û÷÷j�1trÎ|r?_ÈÉÏáÛw©ÆÕ¤�·¿–©>5íŽx¾�–‚\S­í:âs;,Pfî›‘%$2Ï/Œ¢oè`è¥{ÿÆúUÔåºAfš¾KJï÷ôsÈ€8&®9çŠCA/×ÙÿaxŸýŠÉ3Üp	µÝÛe ��×^GÈÄ¢‘€G•ÉÅ/c$|’‘ný	ÿ˜ðå>~{á*'ø°…Ô·>ÛíŠÊ1crÆ„h'´m„Ð¹§«G¤x{õ‹ìµ¾#â7Þ÷hõñI7rŸ 7 úE_m%y!µÀk%‰> ÷Â3�4õ>wãÌüžt(ˆ´¨ù^€v÷ú�ãë©¦ÛéiFøü³®ºggÚÅa'âºÌu�)ôòKBt®}ÆÁ<Ý•ô:"aq£p˜!£,Ž‰kÎ¹â»/×ößï¿ãï8Ýnð—¾5–wÉÓ·+ùÎÀÈÂªô:›•S»®•„è¥×'œ#šàý“‡X~h@+Í…B]¸aRNC¾9
š‚ðv <x$°xåPž¿}0‘?�‹ÿì´ÛÛ^å‹®¬N»ä[9_YÝðø� vÝS;¡GËU–Œz¯Ò½¹a ¼Ü·ÉØ‰Â“³1Ô¹§.øü:_¹²èŒÏgY¼ûæòÅóÌ ­ìÁƒCrœJHÊ!àD²vôÝ‰ú¡ÐQƒérÈD|Âþ\ï%Å�ñø#Ž‰kâÜË´Xþæ¿ám7ÜpÃùÙÍêðBÈ„ÎÞþðøIF¸?óP"y"?Û#ùBJ=¿âµ*‘€�‰Éé«|‚cA0Á\¯—œ¾ûQ)’èŠå‡&L©fÔ5 c ÙQXy®¬O¦à"
eõi Ü^dÁ¦�c)Ï_{x úÚ¬%õ{kíý-üþª-ºÝ¶¯ÇH–÷§ÁçÇç·MCr@b'p¬¶kÛNFˆ{2œnç%–)y~†�¡�È¿æM™ñ»ù™ÛŒôÜüÀS¡K"?Î �­/yº”‡ýD ™sŠr8¯Ùè5ë\é¼ë?<°~âÈxF`úôéßòŸ/þwÀËòåÃÛwîÜyûx7þDw2 éAgE¸¨9 ªCÆà%I$�,ŒF¼�Ê´§k ?aÜaÕ�øÙ&Ü•D«Õ"–”7ä×—¬Åãd×5ì0™šuD’�$ä/«o�pwõÿþÁ½æùõM¼]6Åï)7 ”õ|nzú {ü'*ïmÒï3ÿ¼¬L�×'‚g«ê<_zïãŸé}Gõ­AGÆrÎžÔÆ˜øõ9ñçp�Bx_,Bî/ÍXàãÀø\r÷BþÃ…� ÞõÄÉŽÓ¡œ9±!×§!ò}«’þfëZnÐ[“¡ÿOvc Ú9Ô;vÜ.ÎµûrÐË‘ÿ¿ûÙgŸÝíž¾-vvú Ax
ÒL’œ‰Á#ÏÊ,¯ú¡LÑC(
un L	XÙþ““o,À»³~éóÂë¨/å25È
Qr<oáþÃó’[’×?V­Ø×YýÕM³Ò}ü…îB!_¸u~u�…ú‰”ù¯!9�È��Ï�~¬¼#ã>Ëˆ�h¥UNÞ�‹tÏ	'¹œ´u7ÏßÁøa`1˜D #íáí—n{ÀÇ‚ñùª}þ<¶†�àÌ?`˜¨À$aýhxo<?^?Âþè{]\çDo¦¾C^w;ºàLˆkâ\»u€—:ÿÿ—†ÿÑÕÕ58Þ�¯î8’ÈLPÏû±ŽlF„�ú ï/)ë‹%f¥µ\lá}ñ©Û8Þg¡áTËÿCaCÎ8ÐçJ¢	"âíë¤A
D^�¬ŸŠ[«E¾ô­Ã1ûfÞÖê4»Wl$e;­7£šüÐÓ¬°eŒQG�Ïô~ù}GD÷…Ñó¾Miðh@RPÿÜ½­¸ßóç¯¨æ§ëX7)øÔ–^Ó/_ˆ‹¹p~í#ûü3ÀÇ,™ÇuNÈ¢‰½"ÓžŒ€ëpé°š^_HúÛ�Ók„üµrèç]�GÆ5 âš8'î±ðR€rÿÿN9å”³ìû?éæ\Rv)Ì“µs«7Ë-Ÿª”ÁÃ*7V-¨â6H)`}ë‘á_!xÿ™öe–“‚ü&ißP›Áù~7«ØiÀ  à¹àú Ýâ.yýãáþ¼'öWŸžzsÜƒ€Qr|Ø¾sÙö‡j7òw<tòxMÊ1^6d£ðþ„ùm<²÷›ôÓ§Ó3$ø˜~Â¶!—v××JÜÆï_7ÞDb,Îx¡¿6>|æ�Ï÷g$O:•öi†øxpJó|Šë(¹~ §ƒ±p]Æ` çƒ"kW2>çÄ½ü<À?©h³ÿÿ¶©S§žï7Ýû»zÈ÷ÓÀ`4H�šaD~Ï`ù5Ôáé™0kÎd´>�E^6ý±ý¦8)“¤¥75ÓŽ vWSgCz€b;±œH™AXÙ;–rýM=ÃÕ÷¯	â»,ñ•y+õÍ;Hï‡„œ&)«½è[Ö‘âP¼?)C£ÿ8l‹åý/9Ø×Ìý+Aåöh¤nÍ-â�šQÌ>KßÓP[Ó³Á…þÐŽµŠ&ñò�V&çG7åú\¦¼Á¯1<ß�¾t¨“'O>_Ükuà¥>ÿÿ_Ö¯_}vƒ”]>ÖÝç¤Ná¿o�×W9^°�©Â3àÃL,“XN Q<ØökäoÓ¾:I¤sâI~vÚ­¾€4„òPÄx ÝËH”^§À6è‹;¶µ·xïÉØ� £³lÏò{k‹ˆùÖ#÷C9'¬ÀõD6‰9”y¯�žH‡²KýžaÓ�7þôÉÂó3~’”gãñ%ýž¢ó¡9úÈ„©�ñ’¼cŸ{üðüM]€”äî¤”É± [¤ Ž#n ¾€[“®ÛáøèãpCa\éwµÇÚµk¯÷Ú}/à¥\ ü“GydÍx7¼£s@$Ngç“Lƒ‘‘¾ž¯»A°ô�M×ù$H:Âêæõä`M# �½Ê†•¿ñéC®8àcW_¯Æû&I$€,‰ŸêÃ{¢Ä±Ý¸°3-ô¥�’ý Ç©O¥-" �ªÓ·òtz�<}Ø¥—1™QÈë‰Z
pM¢óùÙ~½@zCÛWç®(¼òÅ«7Æ8HfQ@Û³õ±#u‘™›ýÈÌiöíLè_¿é�ùw¯ïoQîh8tÒ
Y$Àöuî¤pn†ˆréëÎ-¡;Fƒúîè× ˆsâ^»…À—rðýû÷ïœ›ÝÝÝ/Êuƒz@3 C’é�yx¡æñCªO™e:ÀÒ–0¢ë0„yÙAÖnÝ×�+�m½MV~î§ƒèyDÐÞ °ÌràmG«vìogØyv÷X.øôõ3ªëŸ|¡A.QEÂw¼pÓCG©ö²._¤Ò³ —À=4¼ûí ÕIþ,!¿2c�|´áñ‘�>#¾À5‡¹v‰ÍãF´qçA~€&ùA}¯Þû€’üxàú‹Þz ê­“ÿ ×¬ëÈùCÙ¥8'î½D�€lðM†Øo—ŒwÃKÆÙƒß)é!‘&)I­­`ð‘L“`r‡0œ1ÀxØvÊÅW¢¬.ìo*èa”O`aÉ•×Ëô!”]­�a!ÿÒgÙ·o@a1‚¼¾�>Ü™yD•!œKÊÞ^‹$âR¯2c$ãžç’&	”3C†s©÷ÒO†Fí3SoµßÈÇ2Œ15Pz|�\^X°¿»øœ^rMý`^ßç_2ôCz–äAôLuòCú2ì—éÆõ’Í”–°ÇøÂñk7çÄ=ç �€—äà¿zë[ßzF”@“Å‚�ÊÍœ‰":8(ð’ÙÂ ƒÝ�áHíI
õMÒ�u…ð,–‡Ûêû®D.o}h¯RÖŠHD@z@* y×õ?Î{óîÇì×„¯v#Ÿ…<sâtûÕ�çüóX Ã´™%¹¤€‘pòBêôÏNhžî�û¡®¹ö¡Üžéòô¬!Ï°³û‹"ªòþÙºE­iì]b8’Œòõ÷=ª±³÷Çx~ú�q�¡nðÑ…BO ¸@ø.»”.4"Vœ[=-Ès~BÿCq�t]—>Á£ö÷ÄÁ—äD`›€xÞyç}q¼}¡«'õu
òú²”&}ðTÆRXVËš`u��Áá½ˆ“%e”<oæR'âå!íW€ïCÊè^£€’º�Âë§�üž¾£é¿ü\²z#ïí²Ž¿ž±ÈVøû!}œJ;eÀŠ¨ ‚b\
´Ó§ØBmßb„ï’~AL<yÈÓ/½¦ñÌÂÜç{kžÒ·
õßÆ·¶þ3×æá¢ëGÿœ¯/ºïíù8ŽÝ’L:�Ùš&ä÷u)'7i,úyç†.ºŽ¦öÔýO²IœÁ�R)ˆ{â`«�ÿ”; ¿U3 ÿnÚ´ißÏ <ÝÕaƒÀuâû@2@~�#¯€@ï�ufK+îmN`·¾ùº@Dß]½Å”ÇÕåßÜ6·Z*�•®s…ìHtDT€²-0…ÞÔo?Ám§ûþ×¬ÅA€Â h»ì‚u24Ã àU2I
NJ•!©@¹¨+�'Ç3cpF%ùLÂvŒ`v¿!?e!n n}||N¤K¤R>’j—ôÏš—Ë»Fì‚gúgI]¼éþ4¯	è„#>ËíUÎÒ‘"â½¥Oè«×¡ëêïRHõýâ“Î
^7˜83¯Ä=q n²ðRì üçåË—O¶“I• ›rÙÀÃ�}z0³pƒµ(@ L:à—Ô5©‚ÉÒ¤~„d©LD@ž&4×ZŠHkŸj¡wî•Oµ/šÜÕqÅsÌ¢®C…•Ò-´zKÿXZ=gúŒô^nJ*üÒ~,ã:åÊN&¼Þ/õ"½÷U™ëEZ'o¼�ê�äéº.õcÍ¤x$gëŸÏÇ@œ{Û|=kãù§ì|ØÚ‹#á‘ã{tÅüÌ¡Ï�Ï™ææT_»©Øi�=WKCêæÑÚI);)Ñ/œŒ#ßõÑ$á¾]Æ™¡Ã®ßª“4¨Þ��83ž÷ÄÁv;/ÅÀ;í¿—Þ7äÏÂ®Ãý"Bzè ¾:?Lª>Ò�ðäœ�…ø„T³X7ˆI¤êƒÄPƒýÔ4$uè'ç{;Š„g	òGÝ+oµ•þUÏwUŸ˜4={?ÊçÜ:Ï«ôâióÃDI9Ú1
%Dö‚ „û´é³£ÿ\Þc Ùö~FBÒßÃûo,¼«xþ¯ÝÆ8&â»ôhŒ( –ÄxwþÏ·þS·îÆ †Q½bZ±5<³å¶1Ž7:ˆþ†Ã0¨\D°80÷üè¾¤#ø!¹«£¿-Ÿ$qOÌv^2ð&Ã»î»ï¾%­o�ò–C}n)eâá3# °„AIˆO×†„ð„l¾qf€u¶Ã ïÐ»"�/ß>ÏVðGC)Y8Â¨ÎÉ?”È¿dïÁê£¦ò>Î_±ÒŠˆ.äåKOu£9$½™ydÊ\}!ZHí	Ùû»ä~ÉÑ)»‘¸`Í¶üÙõ­Ë <÷@ºÆÂ�“0½Nerrµ¯ê©Î¹aFñþú'ÑëADƒ�ÔA¾ïáø,t*î£ö'RšdNÞ�þ*Ëáeú/9(„SgÚòIRØµk×ãà‹‹/‘à€ú‡¾Û~¢hƒßP[l8¤ À€?¨Ê�—©y|,.å�€‰�¤?íDÖpX9)ñWÝÿDõçw™IR°•åË«åÏuÊÖ×ð0®¤�ü
û=u@gZ_ù¾þ;Žúƒáä½ì$‚#ýãµƒò¸àý 8åHR]H¶Ù0,áûÿáî<ƒô¸®ô\eýRÕî¿µ­µÖI«²ËåX[ûCÞ•D1II‰£(Ri+Q«ƒ("F ‰8 f@äA‘	‚"!$äI˜€0 H¢ØUkWû¼çê©¾÷ûÔŸ‡à ÖT½uîtßî¾á¼çœº¿á;öfmðýóÿsRyŸ$–2†cóíØŠö5Ûx¼Â÷ú>ì+õµëBý�ßÁX=ïK2<%¼OÒîàÎ#fÄ	Ð±M5WñJÜY
7Y
ü¸_ú3Ãß:tèíª‚®í³
:á“¡@É�öNðQ"B¤p\Àz·ÜXìóA�4„tRÑ'xâóo5É� J5lå†àqZðD¥ñáBƒ<ÿBûöÝ�ÏŽ-]ï¥Ýj£wrÆz4^PHÞ|$Ÿ$€p¥ÿ!/„ŽË˜’ixðš×û˜Ÿ(�gÉDZ²ùã¦Oy§õŽ1/+Þ=.…Åò1·ƒÇ—ê›ýß@ûº¼uÌ”8Ùëó=’xcúŸù'ôïïý£X]‡žu»wŸ/{sé.†G
p":G?¶Î8“ðHkÿQˆ{ÆÁ¿Ó¥@qöãÞ ‡~±½½ý°¨.Võ~àd…ìvËGãh0B~&þJùJ�:¯o¸€/MDâZL¦›�$[³=#ð�¶œµñäyŸ\Óµ�i‘‘d»Íö/°ß´¿áéQÊ\9o>^_á�ÆO	±!4`Ù
ˆŒxDÊ= sâÁ=M”‘F¤#{>÷)±Ò—œf¶�*‘T¸ñ™1";íN˜ï¤'‚`®‡xmÏ^kæWžzò»üÅêmåádWŸèU/˜‹Î•‡˜®§&‰H]MâHÐIÿÑ[»ÖÓQÿ/H¢×n€Vg }m î¯ªc þÑÇýà?6\ÓÕÕÕW»€ U–M„'ô�i<?�Øé°¸>æ¢ÃqPîØóRd=×	ÅÒ£ÃïIYf´�V¨�]>µrcð<séàŠnµ°¿õH7ž?Á-öYì©{JÏ$!/„Uº´²PL€’véi$Þ›Wc§×¾�žÏ¢D@B<ÆýB>ä5NNIA›uæÓÌÊ3ˆ2®/¯Ú/=±l]ÉÀJ~åéÑ¡ï8 ¼G‰ŒÝ]bXº“Äó['†>º±0D''(-xDË°˜ù¥[íxm>qÏ8xµ¸ø1¿˜oò‡^ÛÝÝÝ_,ê>g q‰ r´8B~ƒ7"NÈï¥<LÞÑùt"Q C
‡ƒß{ÂÅŸ,X�)˜¼ûŠî3�Ïî±ùì‡6í3ÿ’òdÐÏYO;Òg×xhÛc…fìYZÎ„DDB&H‰EºÕ–&Wžþ�Á¾2léÚùe0�òa(ÍuuÊ‰|ý°‘åˆÈ0Ïàu7ª0slM²®é>c÷‘±ôÃ¬„í‰Ç‡ÈèAæùñøŒ2Ð)t‘ˆ!œU¦ÿ8Æf—:¦<YdmRÁ+ýRP¿8è\Ì6}ÜßÔÄëì3Åç«
ºÀ*¤
b%ÏCf,(‘AL'4™5:Æ˜Ì%!Ñ€ÿß—\�…GYzIO7Ò^74*.x|ùúßï_oïò¿jÊøÍ'e
îãQ…ÀÉò“ƒ s(93ß¤•—ë=}B1@T?&,?iC›ŸØqÎa»%·–�„ÔÉ2›KÒ<?ÔŸóLÜyy!­Ò7)2JÚ±¥ónì–K<1ˆ‘ÀÛUù‹Å«ü~Ï9žû5fïï÷tÉ~ú_ÏbX!ÂCb“œÃë3Dui@?�G=&*õðžI?œXYïíÚÝ¹8qâD”âžqðzqñãü>`¾p}OOÏ‡U`¾UlÎñªÖ®…F Q¼¡æt:çÞ¹=Ô"­k00@ÿ;ð°td˜`(Âñ �t®0¿d­+¤¾süÌ X«õb§~SÜmïñ_=ä¹”ïÛà3íèIWÆ’—ƒÜ’‚ŽE0,òü�Ì �à¾¤W˜Çßaä×Ï‚ÏÚ} ±a‡áõ¢yÿaÔ»Ò3³q‰d�:Îÿ·¼0^mBûig9Q&w}P6 †ÕúªðÁvóö~/Š~é(F%¯ŸF€èÇà ¼¤“îÉ9d¢§Id;GÀÓ#{%y–8¢ÿçYZ$�_RèëëûðñìÄ ä» õÐ¯Z!þgMLoæ¸e¤!h19ØK¾92Ç=ÍØÞÓ&ýšz«sc§h¼ïñƒ\÷jÏ8v:x–/¹âJ~¿ei±,lôù¶?`!ŠíRÐf¢©‡z‚R³3Ì�¬>”v™‘Æ‹
=©GEÆ{‰¬ìU'‚XbÞ\Ÿðú.óÂc¼|”õ6ûnÞä�{ØðÀËÉ%)Ï÷èâo¨ƒÏàëw!«?{úÁã±ü��=.ýœïùßjà®x/€¾å¨±,{lofáÝë»~1÷ã8'ºÂ#KóO§U"»=#86=K’sAw�DÊš¯ªŠ Ä=qP\d7àà€j¸Ñ
ô¿!{MP1á8h	äÿ€F0xºäÕiT­LfC‡®e8Áð€ù„rØ‡poëJÁrs#ß|ÏÞ`î®	MÅ,ûUàí6îº|„áå—ÉŽ3éy˜5–â1æÄ›bÂ1 ¹�D’[o„»õÍÄ@)�FmÞYl¶¼L¶!ñð<WŠ*™MžñÜ5nºž#*„ôÔwÛ½½Yv£Þ FB›Î|¨—©j¶ù�µ;²P¾9	÷ñúÔÍ=pzž¥:†“,ã¡[è]Hãä|¬Ïx?ÑÏ9a~,FÈè¿òVñJÜÅÅËk °HQ–ÒÁó;Œø^Q‡è TÜä9-6¾@ãøµ<’Ò{^Æp\/Žã	¸W¼6¹cå¿ ñeøùëÍ¦ˆ“vî‘"gUscö–Å±Ÿ+8…T:ªüÉä÷Hîçù2’sžåQ˜Q éYö©®yáz•'Ï«5.NÀäÿ{'ÍÊÊ0iÏaë»>3ò»!zÕ†(Ze¹ö‰áÙ}îœ0Ó®ÍÇùÍDvî‰ƒä¼tÒ¢_"eÙ)é\IŸÐM&¶=¿È­çúŸ{ù³£®GNÌéÒy¥¯<ð‰šÀ‡ 	á³‚Î�VNžŸÆUÅÝ£c}±¤¡íƒ0æ÷ûx¸…ÅÎÆhÑ¢
IxO‡;éDÒòFÈÉu›}6E\ÚÖ^>�@xÓçvìI÷‹£Ð�â²ùƒI§ãù\ž•´“ˆhGé?0ka=Â»$ý�IMÚ[Ÿ "iê‘D4¥½úm{Æ³%âŽ{ûýlYŽÇ ð2šhþânEIÙ5ó?A‘ctAÏ•L"Œ$ÜÇ•æ” 9éÄÁ@üò¸_ºá™íx¦ó�ýŸk>Õv°r Î†øŠ-~X»€`^ß@Êhñ¥ñú4‚b%I“à�ê×98_ÐðÀ‰îé|7Îþ.é»¨ˆßziJlÊv	Í¤Sj´ø?'„JÃzŒA5`<='lÀyÎ‰‡9æ´Ÿ.M<òo6¤qx=©¿�i…4-¸X†ÇŸBzÔŽ½±ÿ¢ñð™{ž»°ÏæZl~â‘ù+²öZ¶AùK}Î
ÓéD¤gbÚÇå¤WèHŒ<N|“Q§‰*•§tÚŽ£ó@^ý‡D ó­Lµ*÷Œƒ7\np¾v@zžÈ�…TžŽ��¥¼=’¢ ‹ªÆ�Ñ c+ÈÉÌD¢wF>¿ éà]¥1náå‘·Xèÿè¢U5‰sßÌÌQ˜dû(žLé˜1•Ì<ùºKÞŒc�·ÿN;S¤sYC‚Ô5¡®�>Ù	Çq¢%PÎCH¯_éÉÀðm»ÜPõ˜dÒÎîµÕ¾¢4nû[5Ë‹-½Îê<ë?mÚ˜¥7Hè¤Ï=|2D$ïI†­™þé<Ž,¢BctÐyçB”e)Î8¯êBÜ/§ø²íFê¯*èB#ñl,\”¥ôì®sÓj8';ó¤id¬÷‡ò0Ah2�ì˜wK�t°ß£„^ÂC¥WŸ´%´=QÀ’"N¯ô²¥²Hâ™ÊûÉó5hŸ´ªc�R �‡f0å@wm@Z²„—çžñ9Á›#…|Ò4¤ƒ¤üDQÌ^”xÄë{ ¿ç£^Âpká�Žâ:ó£�’®³ï&¾´ïKp=%�‘KdK–ãtC\gáCQæ«ˆpVÍ†ÆÉO:äï
×òLæ ”O\gêDÔ@Ü/§¸®£££Ï¤�	Q–Ò‹»ÏªRn€HÏP€Fe8P£s<"�*”&]J“0\gR€Ø¤c:ºÁqâcž°Ý~†[†�3%~Öñ\�×aßïë,õ]Ð,uØ¸ÒŒ«„”>¬ Ù”€Ò„Ç�D°5‡ïï]íäqYÚ·ÀõIB“�=ÛZ‹¢§ýþÌyþÊòâûˆ˜d]
:¾Ê>Æú�ÆSv—ÂÐÍo•¶×b´3¯+ÐÇ:‡¸ŒN¢¬G8,'+«Y©CC_3ÏŽ®™ghr‰éy=>I
Æ½^qðr€kŽ=z¤¶…¢°Ë»Ï`%©¬¾yÇ1?¯cäÑyÿŸ°ÊäYV°Ú¤Ã‹¡{bº‰`õkNÌÐ‰úg;ÏV×$MX~R¨zæwú=?¯Ì¬íÿ�Õ	ÂS#�íXD1•å%œÍÎg¼!hHÛæ˜u5Ë¡H?¶fÏÈßÒ’]mQ’'Ö0÷Om¾ø<‡ÒcìGW‰XØÑ�ñC‹Ö”ù£¹ËÊ½'¶«H>§}‚g“pBæDJäw‰þ¡£ÂY—@~€3t�Gÿí¸¤qæl]>I
âž¶×3 ƒ±øÅ÷Þ{o—¨.´E–
:éMBv—€ˆ @v®aŽ Ï¡Ó°Îyò$$‹ûÌ"k/ü{Çœ8ÏÓß~¹9\³H{æß=V|×fÑo5/úÌêÍÅ6aK¡;cêÒ®1†/õÀùT™!¡Éh@@šÜ1nå¦üHƒö7h<�A 8C,Ú,•)0Nß™Ø„ðçŽÛu°€ðÉì¼á.]“”÷v›€�ÕeŽ #c2’ž>ô;Ž"#¾îÃä2ºÇ0ÓÃuˆ�ä¾œœàäÍôŸ!r”âL¯Ä=½x9÷|~÷îÝ›«
º±çLnñò>Ð0!†I„K<€ôÞØõ�ˆ¯±*žžˆƒÙX†J{ˆçÇÜ l6ïÿ]­aGÏéø²½Ü2åHOÈ;ëØ©â«O�*ìg-KŠízO@FÀ‰ñCç0¢$¤”7ux:!]zŽ	L¼²~ðä[©C
mmn²<D‘ô±e�G²T>ÊtÌVN¦BdÇ„½G‹ÖÙ!¦§l]_2 ú¥ä—ö8ññúÌ#Åþ“¤ÿégú?y�Ò}ò‰¾³ äˆL¢Ë†D÷íÎEòs�¤8“òÈ¶ÝG î‰ƒƒo Ø
ü¹mÛ¶-¯]@°­û4•W…]
~ŒF¢á ¹d$/H¢�ÔÂæ„Ì/„ÿéx—Ü…P9–ÚÖÓ)oî»¨€�=ƒ4è{QÙF¾ý¾Ôó<ý³¹­�À©ßqïð,¼Uþê¨Îa ”¤ÿïùdñæ;¶Z1ß~CoœmU_|gjKñÔæ·’û1qIÚ¥@¹�”9¦)óí£&Ñ>îÍ'½Ó1‚qèôãÇ¯,×+ÖŠPôa‘Ú»ëè7ÒÏÿ¯ßÿùœvFZƒ®•<‹®àPüiÐõs%ýŸ%™8DqNÕæ×öíÛ—‹ƒƒ·8è¯×®]Û\»€¤ßè9íòö�=4( „PnqÕøA�(y6¿¿]#4I	¸Dâx/±ð®4ìEŸoŽœ€âº¼uÌË¡,ÑûL;Üc_¡»„_YjFÀ†fJá%ËJ€=üÏæ‘(Ù[¨G’ÆC_ÀS'Q×:[  Æ
ÒcÐ¨ÏÅ|ß1ÞÛ„¶|ù@á¿?'IÏ*ÉœÄ")1ä8¥éóÌãça»€ÇŽçq:Ê„fM2ç@’ì4ÎÔã“¤ î‰ƒƒð2PÝ×�ÿË‚&Ö. éÝÝ'K„FBb³‚XEÃ¬ÎsD�ù�ÀÃ.¥%³(€ûcÉ•öcê0Èƒ¢g6iýµ·‹«LQ¦´ÈQod"Ñë1dÝ)µÃò"e|8`»ìœ8Nè|68‚±väÀ€Ø=\žÇ à9Ë¤ã^¬@lÀÿxVfÄ1NB²+ï¦gG{›`H§î}ÀÌ{)â DƒeoŽç'ÜwãÀ°“{Ó’ž‡òãÝë‘XçS]“ƒ2u—h·VÈŸ8±2Ä™È«züš7oÞq°âuà�õƒ ÿnÄˆC)dmèé+5\NV$6�Š,7îY¢‚R~óÈ.9©°ê<'üÏ0ÃÒ(ÆºS¿-î=ÙÜ3¥¹`â©g?¾v;y“!ÁCó–Ù
Á‡Å}Mˆm§¥¨€t(+`ç!ôHâáüiÏØSÁ„d:!FšóžŸ�?ÉÚ:Ðù½´–ïm47Á²® e^ÈžŒ©Ë†’ÒN®/yfÃLt«¦Ç×q÷ì’äwçƒÞ±œ]ÃÁu…ë]§,H ÎTñJÜÓ‚æ'Áþòž{îùqUAÛ{z!0€ÜuO:2"Xj‰ßÌµå°«Îü@ÞDˆÞ@R›Rfìz/#¿0f×!u*„,+¤–ÒÌÓ=òFÓÚœÀÖþß›lbq^//šþ>8÷ƒàŽóÈèáE>IåGú[iÑª³.oÒwRúõ–FZ>ÒþŒ`dtMé/É¶þR›×?ù²µB|IõQ­­âNâ�ö¾¨öøô/c|]_Zž¦<Ñ‘HF=dè)È)	µõÙVT¢œÕ¸þ‹3Úé'þH’v)ˆ{âàà},ÿ(è?ÿÔ§>u»¨TÈ-NÄŒàH!�<ü×�ÀÀµœ2‚c(Q‚àÖ7Z|¬È‹Õ—‚,³M?ÿ}j‹üâiyÿd�×%Ê¦{é£”Nüh À}“gëm¦wÛ™Í3Š8‘¨NdMŒÇ'ÔÅ#"ICÖ
T^Ï1/’s=„ó1­s3ÞïÈÚá#'x_	ùL~^?'(Ëp¤�¸©Çç<ŽÀû=Ð)/×Ìæ8Ñ¥@:és‚Wë¿ÎµØ=Å£*ˆ{â`½�‚ÆgÁÿ™áfû:éùÜB‘–\Üu†¨Û 9æt"eEi´òqu„àÊDg8ši`¥'ìJaç²ÎS¶d†çDæáoìÃëc°PL—Âc«·Éh(íò6Sþem=á›K	Í”v’•—¯’½.[Ê+Ê‡ôóš–dø Išh£ËC9‚LÖÙÙ{O„5þWï”êoÐëÁîiñ¾µçCüíŽ·w)Ì&ç£A¡¿ÈÏdá>zéÓáegÔM¤öOà H£#é¿¸‚ó¬qÎ¸w“sðÏœ“€Aúa�?7\ÿþûï¬*ð«]§ë�ü,’´¼=dï”TCû*@)?†«r«ë•?‚eÈ˜±Œ\ÿºïJ{_{~œ”,ñø(+!”ìÑÕ[
"¤ðUûýÿ¹ï)¶ÛÂqø°…ÈBky4“ ¯ž9“÷&Ø%É>t®ç¸ß×¯‘tOî’÷ÜM’¿4YWé_ØüfVÿÎ^”®¼HBxHÏl~�Ù1€{ñx/7
&KÞšy¤²nè8ÃH#*E·<BEÐOdcúo\9UT9TqÎ·ÿyúÃ ƒùÓ`Ÿ2|Ñ~¢hc•xíø©Ú!?2�cPo��ìOG‚Ÿ	GK2?Ðì�Íó£÷¸ˆE6Fþö¸©®¨OI<¼bcô$,C¹PPŒ•Ž=±n‡Gá~AFãr�}?`âë»Â2áúS¶BåC:R@è+@æÒx<É“¯g“Ÿ{2—�œ°ÝàåtéÀ(>im—ÖÿáÅkKOˆŸzTƒøyT` ‰�wè¿]Èõ0}.úå’þ2ç˜HÞ þ‹+pè+À¿—;wîÜ(î9ùi°AþqP=ü¯[[[gTxwWonñ ÈI”òÏrY2n’}ì8ôó–_çM
(ÌâÎ~…ª�ß¤0q»
ÊÍ¬nyÉ§3’Ÿ2kŽ&½¸Ÿ€�Ñol³‰Á-3@RVˆ¡tƒdÈ1s\Û3w!uÏ|ŒÓ’BBrd‰ì&!±/ã>8oyÖžO¼º�ë xìÿ²aˆÆV’‰1×y"»xŒãèEgÔƒ˜NÆõD™ ÕWôÒs?dƒú¿çx_å@œ÷ÄÁÁýqÐ|;ð¿ê©§ž¬2 GŽ÷¤²ÕBV£ççY.t8Ñâ¹ÒH
D“ÞÜQI5¸üÆˆ	R(HHX*I½Xµ€´žwüþcÅÍÏ¿TÓ ÷½<K!`˜X©!�+#c¤´‰Šç@HÒ@d—^'Éº×ÇÈ)$~�©·¤þáš“ßŸÖâuÏmßÍ°Œº½9j-#ž€Ç'ÜOÈ¯|Apèb¾ŒŒ~¼_ÉOwœ‰z(™çoTÿÅ•wjñiØ°aCÅ½F^ú¸w~æsŸûÜ}*T‚¬-µ,bf1‘ÇÊ˜•çÏ#¡£t·úg¢@Ê@(íÁc‹×@N—7ebÉ�H(
ÊÖO¤cê¡Þâö±S1..>/0²˜iË�¯Ù¼ÀFÛ44¯›9ƒ§!äCÉ÷²tJ1zÇ’’üHŽãù»»ð2Ì·(âŽQ“½®OK
¶™ê@1a@YrKÈóÒÏ~.÷øu¼½Ï%á ºÑ!¤úU³¢Ä	äú]­ÿZ¨Eøâœ¸Wµp0~èÓ†[:;;/Ô.0XÑy:!2h8dâi,´Þzóc	:$“°_éã‰×våúÞ¤Y®¤`è¦7&$¼Kî�XÿE�	Uµùå{ÓçÒP2
�/YSl9u¡Øf† µïÏÀëšä¹JC˜: OZfƒQ'³“)ÈN“¥k’!€·§Ò­=4ë*)L=ìCCŒ’á@6Ô€àç�:dÚÿ„ø	ñKF"JÖ1 ©~EïOÄ‰ÌX5VtõÃ™ÚÐw .ˆsâÞ`lª¿€¥À/ïß¿OUÁ·?IƒTx|<=’4²©ÖùŽäþµŸ9§Žo6Ü¢0=1 ãö·•‡L@2qÉPÂ¥„L\ó³Öušã9	î¶·ç–ëF`�¾×ŸŽw%Q ò’d4A:x>¢xUÊ˜Úƒ éé¥%!‚úéÝ¶,â¹Ñ¶ÏÆ»çž>_"Â‹ØÁ³,Ÿ<º„W÷¾¡ÿ9ïzÃ�ÒÀDžÎ�–lD_¹‡P©ÿÛ»NV qMœ÷a@¾¨‡%K�³zõêùV8}¦ÈJZRØg�³¼3$UÞe%òËÉé³{b$¹cP•Cã\› ¼Z¤žj˜dÀ�ù%1(¤+i€‡•é¤�¢¿°s¿~ÝVÏ
äˆ2âzýÎ½}o»MÊ,ï=_ò\ŒŸQìlÈà¯ìHóûy¿/iÚ1¦¹ãy#ü=�QÛ~•€ïLž­¼NXŒÃ�$â#ú*G€Bôæ�¿\æR_ãýÑ�ROÐ¨¨Ôq$ò¥ŸÄ5q.Y'³%ÀÁZ	ø�68¬Ê ´²£J�SÝ`ùõM!OTu€ò2~–gê$DtyÃÐa­~óiû$øIûJm�^ã¤£Q&)4EÊ+)!!Ì{æ·'Ïªa À}v¾õhO0›l¹p�6¨D…7°dZ)½ê*BgíédöcYÛ&w"y&F˜(¨©<¾xusù³…«Ë^9–ÑËïe�ÆÁ�§�ç÷ØÚ¹EG[úVQ¶™ÜªˆÉÞâ\Š±ôv¡NÞÿ’�ÖëßÔÑ_S›âsÉ�¬vhUú/ŽT qMœkd`°Vþõg?ûÙ{¬pÿÇ_‹5PÝ`�è Üûç®´+y›÷ˆøŽ§‚üºý"Ð¦¸‚ýVÞØÖì=$OÆ˜ÉNF¼–’…t¢@ÀŸ¯Ø>ØŸÿÅŸ#…kísXÏ¬Üès«Mñ›™4Ë–Å@¾‘Št%äªÁ‘uwº�¿qÿäÙÔÅåÐM;•×ï›ì°sÉPK(‡ðó�Ôš$UŸÈ8Ë0nì³¸zÏê˜þ}µÙò,êþ€þïh\ÿÈ“ço\»ßãFÄ1qMœ¬€|% -ø/78p £ª›;O|	ò„Ì.›„`é�[w¿.Wˆ•}ç‹•í}N8y¤ðÕ§F?™½°˜ö«ý¦\ò:¿5EŒåIÇ�x-ÂçsÈRˆKè;Æ>‘õ5ÍA”£�’÷Ô6âæ}‡/F%V†eš$$§~]Hò3žFz>�Ì°®×ž	çC‚3á§®o´!N4¦QŽÛw4BfâmÝS/Tm1rO|mWñƒés‹/k�…·“6W}oâLÛÍ¹½ØØ{.‚evMI§jé—<¿t…ˆÒ�P7 âF¥ÇŒk_çò×€«W .ý[�¬|iëÖ­kl5à÷…U:Ê˜ÞÛÙMƒ Ð�„ÌjP!Ñ:��¬.•wYïy)Š)Íku<pùØ=ã¦­GŽ›"ÚG>J!¥Àd¤ËÔ €„¬"Òô#'‹ûg.( Ò”ç!{³pmO0›ŒKz™�/{yO#ç�ž/=¿6ÛGxL;fÑ¼£½^^pµm²jjïÏ<dh?¿ŸÊ["T¿-)žäeÿ‘âö'„ûåýd|&ïØ­¾_Ûm
÷Ëû_h<¤ÏhHSˆâI]ºyóÿà§}p0^
ÒdÄ_�=zdUÚM¶ü!‰$ý’tâñÿP´_”¯˜¢I©~>™l¨c²¾¢×Y÷Ð=ãiWÔ²	L6²­	˜Äzþõ=6[>¦¦T6E%òt›OÉ€Éü¦XäCÆÏYXÊ²©$åÓ1IƒŽE)°Œ¥ò1f'-ëðò›û3‚Þ:jrRï3¡Ðç)tOÕO„¾Ö–Uÿ«òþªÙ^OkèdFRkíô?ºÒTO·8Æù†=>C“ço6Ù�ÓÌáçÆŽ;R\çª^ì‰À¿´¿ïZ!ÿÒ×ÆªŽ“xƒsM~}“çuY"ìÛu÷ÌªM@�R@@E»¥øYDChé‘õsÂ¹R¬T0o1Ó>6ú“ö9rÛ@CÙr…ÿšŠ—¶ü*K¶ùÅMVFÂ¢;Á™`wœ$ù(M„"éP9A'Rh1<¶p¥—“²~ö¢Q˜ŸpLè§Ý ´Ú­eß!­Ò4b ³ö»y§í°<¯2¢7r@98×h~ê¿ºó¤¸Q…ÇÄµÁ� ¬žü'þ^òM¶FùžmT(Úe	;;{ë™Ò=š�ÁúÎÝ´ø’Æ×(L	×øÄœÒ€¼÷ÚV®–b¹¢R¼,
.Ùï›J”7Î4ã!\––3Çî¶�wÌÊ‡÷+yØÛFŒ7¹çâ²ái3'Í—!€¸¤9IÆrW™ÔÁ`qLiŒKž?”}± ÓKºñM¯w–)]îÿÑÀZ›ˆ½å¹±õê/#©¾Ê ýøL±¼­/z~ô 1çú…¬Â’Nõ_œ¨4 â–8&®¥4P±#ðo—,YÒâÆ$áhgW1çÒXTÒ¸_“§5¦|`æ¼šå{Ó^)Æî9Æ«ÓŸ(žÞòVqÃÓ/*O†©o½”8�»+’»¤È¹Áéþó\Ëø:œÓ×†l’ëyž]wÙ§Ìf¾ýn±Í�>nÚªïà¡!»«Ü;Ñ‘ÀËËø©ú-<Ö[.×#ÞV»óþÊ	¥úÓžöÿ¨;üe|Ý~9høŽ}ÅŒc'Ã.ËÑö½Æo�Ÿ™õ§ÒÏ[f«7	`H	.�¾ŠG:àL=þˆ[âãÿêï öŽÀÿpß}÷=áëWhõï‡ýHÒ øÀC²æ#½afú®XQþdþJ÷ý%™r¨§¸á©³ü?�³ÐòÇ¼§�ý®HQòü�¦®¿¶¼G!'Çä÷�÷Í˜Ÿ�2‘¾wütû=ÃZ“!C„•úñ& !r(O ¯Òx+Ïðdn˜\ö#/m{+‹¨n91ös%’åöò! í£¹£{'LÏêü»ß&Ñ§Óû¦Ïóv 7nÑY¼>¨ÐÇ
Q}= ¿¸ ^TBÜÇß8øó ÿâŸøÄmGŽ9›€»:{ª=@Ñ�lÐ Œ}coF ›ž]Ì<ŠRÅ�1|Ø¦7ñh.o2£0;äùó]É»„”Üyý‰úÔMéÑ¶dx§Â#SÜaDccà°,væ·šôs{Îe‘i$i'in°L‚¹üýœE^¦'…�~`ÞrnàÝ�ð€þ÷¶´|í'm˜6ÌÛœºê…"&õNs�]£¯®ò\�LÚs¨Bÿ �tHâ‚xrˆSâ–8v9ÆÿÕó ì¸fýúõ+ª*Ôfh‘âÐé™à¤?ßdºf[F­õÇ|M(×é+ ?ãÑmn4Úy¾”ƒ ¡•‘‘ˆH!ä�$iý»¢a Úxvû¯‹¯Êñ\BÀëŸxÞvæ­*–Û®Â­6£¾Í°Á6-í±M;´-åŒðþ‚ø Ð?ó»Ï7?3ŠvrCðÜk»c}M‚ØÆÈòJÍÄwÚKí-|ù—ÃmHÓŸè&ê`ËµÓKõ—¾ýíØÿ.® á¤â€¸PÅqJÜÇ.ÓøP±à??ðÀ�w4R©Ž¾jƒKBx@þG–®s�,�-Xiaâ9@rÿU¶Þ~µfå…œf†¡É•¸|-
”•<ÀÉÕjY„\g“ŠºÏb$<\&li•š'7¾QÜÄ$eËB8þý©ÍEÓ.›'ÐŽ:Á¢‚6i¨M3s-Lfˆ’¶¯žïdqi°cÈ	ûŽ–ž)|ÉÞ˜~´/Ú"ÈÚ:¦Çî9œ´¯™�Ñæ­´bx¯_¦þÁ´–¬þÃ¬�.¡Õ×.=�l@�'Ä…JˆSâVÅú?`Ðæòƒþ¥…*·:t¨ß
®�z%HK
û;Ž'Hº¡è 0dÝk™ç¼×6ùlÒ2š‘ Í¿ÒÈ¯J´Mb×~¾”Ü¥Ÿo»x~fÛi¥et¢WØbÐXÝ	nÄB:œL�Â\»	&"}Ûãm�|C±äPgxîVÇ†Ólƒ”ƒ.ÆézNú|þ'ßð×÷fízÇØiëL[x;Ðÿ3“þ�˜vHQ×“ÀË¿¶»ß¢—s™Á]d“»›­…¤õ¾co®;èF¥¾\ÿ8&ìkï¬$ÿáÃ‡ûÅ)q+(ÿ_ŽaÀŸò^@X¢¸æÕW_]‰QË ,è8E_O§eÈ;À1æ×‡ òÃÈ™Á3þÆ<ñ…@ú5æ‘7šBéØ¦6gÊxçKÓ˜È£NÕ
ÖFè»Â¼Ùè�;Š;_œTÜ£ûýúýbEïyî§ûçm‰X2ÂÐoß´{y­^H�:“¾Ý¾|ôÔ²uÅâƒÑ…mÏ›Ì¬¶½öKÂP¡^{âÕ§ì‘Q,ÝÿñW_«C0ÒHî7Ûê²¸ûœyüÑ^êñèüåÁXm´¨i•µÕ*+ãú“tÌÖýßpÒ“ÿ*‹|¦XÙ(3 NUå«[dEÿÏo?…CÌøAzÍš5ËÄ©À-öÿÿé`‡ÿÕï0øO÷ßÿ£ª@¶¶÷Ô'Hã`FÞå%\I£üêÐŠo¿Sòˆ›zí…�yËjè‘å›Š™^<šK‡HIÙrŒzm7÷4h·[ë‘î¤pº,¹7õöÊñ;ámÃà~Â€1p™Õ_¸Õ"ƒaË×‹¶‡ú‡¶p#¸Åä3Œ.ÌÓòŸÕÊS*ë{î¶wáf–<Øº6	íAÚV’2¤-"ZÙ<yxþ�E«(mo/Hm°<b_9Á^A¾Ö¶+¿êë}ÇKS«<þ€ÏWë#�î7ÀÍþÿBœ"ü¯Üÿù‡†[ßyç�vU ­­-@é(#X”7Ø¥
ÉïÀÇVo•‚e‰2¦ï¶}ø•ÖâG3æ7¡c( §¯³‰µé‡ûŠ™5=¼$Š-©cü¸¥‚:†,Z­/êXþŠúû½Ië<Wä¿÷XñÃæ¥š¤®.ëÕ?Ê›mÿÃOšæ#×m/¾ßf† ®uƒyß5É¬0ã ùŒf^é:&[s»$Z‚5H.´<­öÆÞJóÞ¯ZÄ¥á—æ#¢áÝØw®»e§69y»@è(¿nÑÁßÍZP<Ø²DQŒŽžM˜î¾4 ä~ÒýJò¿ûî»íâÒ•þW/2ø|SSÓ4*ùM–°¢ãDÒ`WD€—4éi�Á*£X dA©†¬Ýïg÷rI9HÇò”Œù]¹ãøŠ­[¯6"Q/�?Ãù©¿Œ€äô£'Š'Öï°1ùÔ„P×ßfàŸß(xzÅúbÖî÷‹W�÷GÂ*:�§ðÐŽÙ5ár�½ä4ÉöüÿlÎB{ÓïynâÑ‘¤ëõ×=“çÔìÿÆõÉµÿï÷“ÎÃ�úR—ÿ+–ÿ® aÀ¿ýÌg>sÿ±cÇþWí
‚}í]õYJ7l±‘„àu:lÒ»�ÅÃF¢@U
æøaKk� Ñ+Ÿï„�r »¸ÆVRâMÜöv17Ž712Ž¼þ3©7²ÎóÇí=Zütá…éÔ¯¡úç¸ÞÆü·�œ`s$sl%ey1bíÖbêÎ=Å‚÷Ž‹tØPÂv´ì´ÉÆ®bÉá.½CŽM}so1üÕ­ÅÃs[í5ÞŠ6¸o5)¯í§oÖjÿ�èK®�÷¿tÔq�âŽíý¿O\j4ü¿Ò†7Ú+Â[T™*,k?QM�vH•EnØ`L|·ãb$ðÐ)à]j]Ç3/O$(dEaìc¡¯dÏúÎ¸i
©³úËhH2ö>Ué‘d<òúëx¿m¡=`uVè‹’ú_VÐ �»'6iSÐ%÷èÕùóóKÛÝûW@Ü‡®œð¿zð'ÉjÀ_ÙúåfÉ
A•rIÚå®c(²K”ºnƒb$roG¾†->dÒoúé·ì!D¸êçÃ,”œ]Œýõaî5 fŠ¸þìáö�ÀÏ?ôK!</ÊEæ9çxŸÕ¿-«?ÆÁó`˜@,ÕßóÏö<cmuDîö±SŠ«ZÛ p¬±ó ÏO]Óúg÷»}ô”âù×ö£Þz¯¸÷å°"Sóy·hsÓ¯æñ«õk@ýÿë¶ÎDÿkóCÜ‡’Ùÿ?¹Âÿê—ƒ|¿ò¿2Ü¶{÷î�X¼%í'i°�50Æ¢Ú€4dpÆî>TürýÅÃËÖ�®Úl/½mž¤'}þ¥ö ZÃÏ ðx¥G3Ï�dh YYÿ6 ú‘äß,|Ê^„úQËÒâ›¶¥ø‹òº—4B¨6 ×Ú[~ÿ­i¾~a)k¯ÉïwÙ·ö†ÉÜG–m,žÜ°³¿¯í£ô?ù.a*o„âŒ¸#9—ª_þ¹üÃ ~84¾`øÜ�!CžË-^Ž·ÛºjYÙàà’uXµÂ SÔÏ_mÀ]±ÉÉeÊïòK¶~­í»ÍIÈ:³VD�¬g0¸¾Nýgz^òQv…ÓÏoß"„ïN�«ùˆd¢,¥9� Îòê¶½ù¥âsã3ãè‰ÿïûW{—t½�?þøóÆ�ÿÊÞ~ ôr‡ÿÕïð­ÀOû¯—Ü±wïÞc�T|aÛÉ
�e�‘x¿¬ëçGæ÷'}©"ŠFœfkØO—!ü¬y‘¶!7^�«®?éÖ–Éfónã÷QÒÏÍÿhÎ3-Å]/M?«vãÓ£l6¸-A
Ïë»}¶Â1¢øš‘\ß9øö¤ÙÅs—¿X½E»-êèýcêévCäWÄçÎ§ùö_ÅÞÿ+dÀ+ÂL~þ™gžÕHåß<ÖIãUtHc
�lÜC_¢ó ñç›™_•yÔ«Ì+¶é.^é8sÅÔ_¿£°Q;ï|éoi÷¹�Rÿ?Úþ—n7ÂqEœaò�W+Âÿ+r2ð/Ÿµ½ÌwÙÆ ã�4Àü¶6x5W&ã\
ºÖeuyÈ[ÿzP�ÚÁÞ‹[i1 !ýÓÙŠõ'l{ðRÿu'Ïëã°m¹õp—�¶î~”úÿÑõÿ‚½¿8"®ˆ3âÎ•:ùW=£ &¿0jÔ¨ñªdÄÑ£G£,�( A¹48pðýª=ÒƒöûùŸpˆá—_ð1ôÜ}‡ÍÓž½ìõoí>g¤?nÛ¦GÄò…÷Z:ú?JýÿèúÿWm>ö¯ÐqD\aòÏ½ÿ•7ù—OòÓa5wþ›O~ò“wÛÖÆ±²4BÞ ËŽõ ƒI7tì~àc{þô#}öÑÑá% yÛðqÅÆˆh—­þzö&ýï9�aŠ•M“w“Þëø¨Ïÿ£éÿ¥¦Ë�¤ú/nˆ#âJ­�üôW2ùwÅê/	^=qâÄ)ªtÞ=Úf!îÉ®ñü(U¢l—B!IWÔçÿ²wíÁUTi¾ÊZ´¦Jpjkt@)`‡Ú‘•Ýuf�Åµf×qÖÅ†AfYDVŒº2²ìŒ:®:ÃðJ„ÄL*ïðHÂ+r“{o!	�°Jÿ´
¬Þï×{®?Ò'=§sì\î%�ª_�Sé¾}û;ßï{œïœîû‹-{h`ÈTû«Í;œ�âÖ]ùñ�˜†,zo7î%UÅOõå	Ëxòg½þàrÎ/[¶llÄéOOÿ3s gƒ•G»}Ð AÓb±ØyyÅ‘+´j{De[§i€Í×&}Õ²ï§@œÃVõÙ„³¿¿‚Ö��‰ñ]ã'Ü‚à»Í§dUàbºåÇzx\K“Ú}Mxõ­°äÏzýƒÃ)>_Éy/ÿ›ššÎÃ6`#ÊVkÑß�þgÞ’ þ| <Û}«V­Ê3�hiuJTAÐwÀ¥ÏV)ÙO�ökw<8Œ×{£®I6ß,ÐŒíg¯ÿÆÙÝuõ€´É_ÑyÁýÎÉ‹ßv˜•°H¹äHc˜òg­þÁ]pXnºCX±bEl6¢íû7,ýehÀç<Y@Îõ×_ÿˆìtjã ø{ÈÚÖST¦¦Pö
·óøì[G’RõÙš"–†9¥ïÁØ4Ì^]äþXèÆöOú\þ21~|×œ5¥=ÞËÓÅ›Ã–?[õî’ÏÈuØlB‹þÜ÷oˆþÙ—üã´iÓðŒÀ—þ€ØÚvÖ?b°Õ²‚M0; öƒœÀ#¼²ãîM×Ðîyþeà«þ/7oÇóùb çûLþ�Ÿ¸Æÿê{Sßíð Q^òl_ÈŸmúgÁ]�÷_NŸ>{þÇYDÿ¬ÍF
&É«Žva ’É¤Õ×ª±¥Í)$IŒ0GŒ4|ÞêzfƒYz´Ñù�ìÃÿ'ž2¾TûÛýò³`R•ßÔy!tù+Ä±Àøßª<ÔcäÇk¶Þ¨mê;ù³Gÿà*8kt àº¼:o'l6aý³0àŠÀ�999³åçŽ?»r@üÂþ¶“G·:nVøÇl]¨¾EÄ2\/0çï¨Q Y [â’U0TéP©ÿÚò¯•{Û*×Ú'›}–‰ƒ¹—‘¿ðB”4ÈŸúß×ÚÞ>Ü‡ÀXùÏîèo^à¾€ï~$¿vºR ‡°¹µ‹ŠðQHúª½¢”¼–~}+ð³f™†xn#ê)ÃGKgð?Û]ƒÝ#Ët¨ØÊ¿A^2º[®�k-Úê.÷ÑÙ ªÿdayºäÏtýƒ£4zä×´WŠÜ[àº¿¹òŸ�Y€¾;p¸`”l{|ôèÑ£ñ Ö$ÕâÖ�8àá*T?ŸäÓ®ïK8¶Ú÷i××ÁkèÖðøêb�A²ÿLA‰³­ýO0^¼¸ÓukòÓð?‘Ï¸Qß}-×Ï×–ÊuÿÀµS­‹©Ë×a™2�òg¬þ‹ZÏ9±¤
X€óà>l@Ùwý¢Vgž_ú+'Mšô²Ê¥ W—l‘í#€êgG ûó­&?yVÞ¸»úÿ�ò91P }Õâ�}HÛaÈ¨TJ4ß"Ë…ïÊ9K$º¯"c³Õ;Ò/�cˆø©óóŸpüåb^×ƒG–­‘�Š¥_þÔÿZ¸0ú_çÁ}eüµŸìŽþæÝ�ž'‡©‡~ºyóæ÷18‰DÂAË¾ÛvëW¶´›b"Œ5ZÙ²�Vƒù|ýûpmàó±Uxúªb&�ÀWxL^ƒý»êZ§òÜEvÊÀ=}~þ‘ò
²ÕzÄ'ä—wœ¼ÄÙ«%¦éœ4=ù®ƒóŠûÃ<OüvýeeÀ'µ÷¨‚àÐ¡CŸ”½ÐçÕ ±©µK#û�oïŸÂò|ÃõÅ’àfùØŸSºÕSÔÂ�äý/W8oî©qÖÖ�t~ßÒélm•G‹’ÎòªZç¿ŠË�¿ò:?çƒÙë+ð½ Fè\Ô–ÃÓ~ç…ë,üiÏûó‰¿ì�þæ÷pY�ÁûfÍšµPê’À1¡1‘tÖ·ž3(Œ}»9§žRÚŸ9Bêà1ÿûeûòd{ð+�ß'C x>[öÝÖÝ‰8[U&ÉÕõ¿^20p1g‘úƒãj¿ÿw´e?‹çý³}Y�A5(,,,Á`Am²�ÊFË¾F AB#$¿ßÉ{>^ñ�¹ù¸çæ0ÜTëƒylÙ×ÎÃ¯û¼},™Áò§_ÿkà`P¾®[·nSþ,–ý®¹‚àmª’+•ÑiÕÕÕÇãñ¸;hªe_µ©~eò´'¢|”jTßBá
?"RÊ¦Z<¶po­3þW¯û~`‡ðoòœÿüUY úõ¿G¸ÔøkjjŽƒÛà¸âúm¶…¿k© Èˆr‡à÷F�=GæJ}Ss´t˜	£D�YÊ|>>Áõëa[î+{�Èk³%}ŸïŒû¹ÊTëÔþýW:¯TÉùÓ­pÎ ˆ†††‹à4¸Í|Ñ§Eá/Ë‚úDoöL~8sæÌE2gºlÊ Rí––3¹,GR÷¡Ðšî/¬Fà—zço¯rž�‡x&/ý�Ùï“¢àý//r>ûgo¬pfÊ1üšðŠ¦öl”?múÿ}²CãŸ_€‡Ÿxâ‰WÁiOê³Ï‹>µèß§9‚‡dÎ´Q¤Íñ„S!í5JYhÙ1ÃùÖ.ÜûÓÉßÇò—·t‚käžà°z¿Žmêß§¨�Ž‘9ÓcUUUõ²gÚ0 ªí1q¥-]Aj�Ì„f›ë÷ÉßGòƒ[1$#À]p\§mRÿþ2àª 7�üCnnîó2‡ú”Æ�Öß!4ˆw~§ålp�ßÂ¶[ß÷øÇh}¯—ßÂÀ±|ýü¾¹?ö#ùC¾~q²Ü"ß gÁ]Îû¹á‡UsêßŸ§#-¸ÿñÇ_$ÿ…É¤úÇ›Ø—ÅYÀ>5��Â6äû�äézE‚ñ¤€|€×{}1cÆŒ…à®âðˆ(õ7O¸A(õ{¬L˜7oÞ›2¸—”Œøƒ(l]Ë9’Ñ7B±µ‰8ùlƒ^Ïþ~ÿïgDòÍï[×z\"·Ì¸ôÒK/½	Î¦æý|¿?7ü˜Rÿþ<¸©‡zÀ(ÁCK–,ÉSÖ…êû*£NeÁ	 {íUË¾j°¸žÑ`ÌÐ?Éo)�Ÿ\3ðW]Îêóþ›ú{êï;Ð–õz@®à?òóóKuc÷W¦ÅÉ3½ˆhp&‚"�e„"|	‹{aË{íùþÙ�äï�üà¸C>¾ ÜGÁUmÞ¯/ùýE7~ÿz€ÿþ€1‚©ÛÌ™ýúæ¸³Aª"Ü©ƒÇ‚šð'0Áûv‘üåGµœ!‡Ì§¼¼|¸	Žú­÷Góþ^Õô¢ Ø±²´2cçÎ�5ôÆfÝ(
-Ov’AÇ¾½±µ9?ìû�ä7\9ÙÔÍ¸}2L\'ÁMÅQ­èÍûeþEAÏÊÀ]œµÿþz*ÂŒ˜(»¸@ +Â„ó÷©¾ODf„A#ù}äßœì Güù‹¥Ú¯úûöí«.>)œü{OÅ_+úEóþ¯SÔWî<xð3‡n¥’‚áýÄi'?)ZÐZFâªE`Ü{ªeßçó”5’ß#?8AŽs à8.z+þQÑ/”z€¾2àqãFŽù<¡)ˆý¸+.�§H%°#,ID²ì®o³�«ˆäw±;ñ¡Æ4>�sà8è1~­âÍûÃ+
~Ë³<ˆ�¿^Ó�Þ(8Ü”pÖ'»H�@„E„ÑÀcö„¥‘™¯ÇsŸï§òC÷Gš“ùB€kà¸z–û¾ýúÞ	ñ8�ïË<l6Š1>ß'bMNY¢#œc�-ÈÂ@èGòCçÐ=¹ø!�5çÿ¾Çø‡DÆ¢àÊ@`'ð]©ÄþgYYÙv*,8vÊ”  yV­mD;ËÖ|=užv¾ÁCøþ~ �œ»3þaNà÷úS­p×¿ªøG ¼•��Ü# 9�¿L_½zõF¥4‚ÊôUðáæ$ÒÂ^/ÝP-€ch­Rl"„Ú>%¿få‡n5%týëüÐ N�[à˜fü\ëUü¯¾¸S0uñâÅùòV¡ËT°Ù ÇcNY¼Ý‡ÐDÑl@ìó8[Oô´0P<v­Éÿn¼)¿Aÿ:À!p	œ·"ãÏ'0F0å…^ø�(ð*”0e»›[�5	U ô'$IfNq°HÁ	+ƒ!|ï7Ûå‡¡Ë^ë wæÎ�û6¸NEÆŸ¹N€5.Þ!˜ôè£�.–ß_ÿ”ŠŽ?JÄ¨ˆŸ6DÄîÏK°p­•�>Í~ ƒg_û¼!g¥ü›DwÐ¡�îÁpG=Øs—ú8ç�Œ?ãœ ÷	¨]Y£ãG�5Wvl5ˆGO¥uöMd¨‘ycq¢Ó½�À1¶Á	‹nvì1ðl‘_tuÆ©ŽÅ5ýÕ?¸Î€;ŠCÂ%®óGÆŸYN@ß' EñÙ�Q‚qR½�%Ok•cNG'HƒÔv4c¥ Ëa„ò�˜ÑÏl€æˆi6öµãÁ¿�­é~”Ü+�¤ûÛEGÐUú$üõ®ÌgÀîí§ôuþÈø3Í	pÛðm'0VðÈôéÓ—JzwŠ·A]£ìhn×	m	oc0Ø[ãýÒØ2Nþòx»«[½‚Â�%à¸BãçÞ~p+2þtž}7yœÀpõlöíj.7>''gîž={ê¤À{ÝR-ûª=K8EñNF(Úl0æïëbëBõƒD|ÂòüôË_”è„. k€à¸¡8r»âÌp�ñ·¸Îæ8nâ³)¸E=“=Œ+îœîL	V®\YV__Ù–8pû…|ïÄ;hp€¼hý	M#ÕAc6§ÜøÝÁâúi•¿Dœï¾Æ„�ƒ6;t…Ëà ¸ N¸Ü`¥˜âÎ-à÷ös“Odü™èø Ñ õ,6—	Y%ø[¤{S§N]rìØ±$ˆ¡4Æ�ÒxGØÕl <ÇÓ×ˆ}‹ëY9�ðåßo—±nÆ˜úª««» ÝƒŠ£Xìã2ŸâÐ Ôƒ=‘ñg¦ÐŸ"ô_!á�2ä…’’’ˆŸˆa&ú5â66ŸÖœƒß`íRèòo”ºKõÉfãø«ÖÈø kè¼‡”„_¥ßûT_´½7£� —	}ŠƒÞ)Á÷	Æ�¿èÀ�	Æ‡$J•5Ÿb
 %'Œmwœ°0H«ûýÚòc1–!èOñ%|ðÁ…Ð5t®¥ü=û¸Ì¯xêœp• ‘à_0\¸páZ©
.Ñ"5ì%Î­;)O�ÅZ¤`Ø‚�ZGÜv úõ1V;šZ�Ú†Æ^�¿Ÿ¾ KèTÍõïƒ®YågÊå|?ªô_;N@¯pJÀUfc‡þyúk¯¤”_5x“Ã8t²ÉÙÒÔæ¬�ŸùŠì«ãl¯è§Ç ‰îÇðyÃ÷­‘1ÙkÃiãj;þÐt]B§Ð-£>«üLù»Ï÷£JÿµS Õ�æq•€Ù kw›<yò¯«««Oi­Ž0E,YtöK­ S:ƒPÇÐêç‡„8[öí®Ù1ûdn‚ãh}¼¡³I“&ýZ=Áw7çúŒú¬òƒÚ|@Tì»6ëßÐW	˜xjc÷0àiy"¬¨¶¶ö&ŽÕ78»e9«¬‰Î ká,Ž×³¸?=d†ìƒèp	èº�=ÝA‡ž¹>£¾^åÿF4ßïOSÿl`ÄÙ@®Z&šxã�7>ûÚk¯­?räÈŸ@¶°�(XÕ /-•ùo±T½]Ã¨V‹¸ì?ÎkºÁáœIµ
©>Ïƒ,�©ZÒû4úP�@7¢£9Ð•ÒY.£¾èÔ'êG)¿œ°@èSæÙ7�«^1á†nxvÁ‚ùìr÷Ä	è«V�?ÿ�b,Ub4Û¤ˆX*BA¼“†¦œÙ@ÑWçû8^+ÐùºƒZ#âl”{Å=ãÞ!C ù­qèÐ¡.èBtòt£t”ëY×Öó\Ÿ…¾(åïNÀ?`mÀ³R0”Ó!W]~|Ýu×=õâ‹/®�ß�?M2‡áü�­—ú�Ì™±²PÑô¡]á»­:´DP‡Á>Rù"ùnÜÃ¶Æ$î	÷Öçò§ZŒ9Æ^tð4t¡trGÊð™îC‡¬ðës}Fý(å�²Uð›¨Õ:‚±j3ÉS³gÏþ­<Fšô!°áA�DÚƒ1§ÎAò½X«³)ÖæÖJšN»Kk…’A¬mîpÖHëÖÐ/�ÿãXas§³^{ƒ|¦,vJ®Ñê^kÛÉ„³·1î~ÇNZp8òcŒ1Ös5öciøªºï—î«¹~õ£?C6 öpZðmƒ#¸Sð€àÉ‡~xé¦M›?~ü6`aÀéÆcŠ±•1ž%øWŒ¹Áð¿�J÷SëúQÔ�þz›ä"®üGð7j£ÉÔ¡C‡Î“ŸŠ.©©©éø3ÄNµÝúç[Àúúiû>ŒÆc‰1ÅØª1ö3|V÷¹¡g`õ£?s6`vß48‚+‹…cÔVÓŸ U�8qââÂÂÂR©¾`aàvÇ‰4œoBp‡1ÂXaÌ0vC5–c®,îÿ›~†Eýè¯WÓ­> ;NX,¼Ý]{fVðÁ)X=;eÊ”7ŠŠŠv=zôÓ4\V8ŒEqqñ.›¥#Œ•;fŒö£1¦,î1Õ÷¾6Ï�Òýè/„ië=9ÖÔªwæx²‚±‚VÎ`Î„	/_¾|seeeRö«_î­áÈgR-ûªÍd@VÈÙ1Œ‰›±žhŸÃÝ{ªªÏ9~†Ïy~”îGÖN  #àÔ€ÅÂ!ÜGà›ŒQE¬{?Ì¼õÖ[çÉ+¨W—––î“m¬�I¿LƒÁ§åú�2A6È(²¾™•ì÷ª±ãí¹Ž?„Å=¦ú^Ã�Òýè/-Ž@+rÕà–nÓf#»9fHu¿+x@EÂÙpXîZµjÕû»víŠÉ×Ï5ƒ´3h»ã„ÉAàeŸãžóòòÞ‡�2)Ù€¬�™‘žF�1b´gš�1eU¿{q/2üèïj:}Õ€ûnöd=8N<ÙÁ]‚ª÷ÒÏÌÉÍÍ�?sæÌeo½õVYyyù¡½{÷¶IÑì3Í Óã 0wÿ÷€%:Üî÷ˆ{U÷ü�’á.O”gzßƒÑ{¢ýÍ\Ç×«ú‘áGÿ×ÞÙ³6†a‡J†Rè)ÄR¤Å 8tèG7—.‚¤PÐÁ? äH~AÜuÊ »C6ÿ€³»tèàóâç!ï±¦õ¾á¦CrÞ“×õ~œÐ®˜ü{œlÖe`K]ÎX „‘´o}ä'ã‡Ö¶¦iÞŒÇã·6Û¾ŸL&¦ÓéÇÙlöÙÀü:ŸÏ¿ÙÂøn_[þiÿÓþ´@k3ô™ý´sƒûÂ@.=_,gå5Ê©}½öG¹¦\[Æ°º/6æ§2v¹‡Ýë]¹§ƒ~äŸå©¶}ÿ¬#€g–gOo¿súMö÷¿Ÿã|eE²=2h83ðÕA[ÃL
Þ‡Öð‰ï­Ÿù³óçéKë±C{b}å}í?Oüµcï‘_{XÆò1û=üžvïöaxŸåÙÓè› =Ëüð8Oà++#‚Úª€-Â²•g¬‚Ï–H!r(Qƒ”>¨”÷¶Ç¸äèÀîŸà™åÙÓ/›é}‰_›í¾r¶upxèOXl·W.¶Q{m9¸ èÝÐ{¡ñõ!õñ/‚îÝöÖ¿Í,ï'øæU¡×2_¹«‚\ëá 1
¡¤°“ˆ¡ôvKô-ðRÊ{¸À}ìÝô� {?òÖ3è5Û+ÿ›z‰6–Ha+C[t€(º—ë|œ yúÖØ7à{‚^‘:!“Br@¡·:¶OÈè)ìuà½" 5!)°R@È�˜ˆâÏÊµŒä€nt`¯ /èÔ…@o&b@‚kÇr-€y:°W€ôŠÒUH!r@´w¹2F{-Ø¼¢ü})äb@±k—iÈsÐ»¢ü1 ‡z8Â\ï�®(WVy·¢(Š¢(Š¢(Š¢(ÊõÌ/¥h—EÞÔ    IEND®B`‚‰PNG

   IHDR           szzô  ¬IDATxÚ­Vëo“çõ§nû&mšúl·Oë*ˆºQTu‘PË¥í.HûÐ	Ö@¹…4I�ÀI±Çqì\mÇv®„@Ú…¡’8ÛI|·ã˜Ü7��ßóÊ—µÀ²©¯tt?ÏïwÎyž÷’è¶z5 ßíJbOgâŸÝ‰Í'=‰Íà•ä¿Ö2–9Y“©Õ}[W[bõuWbÝÙß\éŒo +±š¡‡Ü³˜åîø&:cëèäïŽèúŠ+¶élKàõÿÛØáÇ÷œÑ5½3º¾êŒ­ÁMñ 	!Aˆ8Ãd,ë„ª#\ìqÆØKÑúßÌWñ#Glýq{díÑ5¸"D”âSœXCg\‚ÖÒÈ�Z'{œÑU8¨á¤–hníÈ£?³GVCŽÈ
Ú)ÂRí$ÜîäøÖâú‰Ž	Í< *½
*„ÒŒnüô•æ®ØÊí¡Õ -¼»Â
ažáT§°ÊÓÐÐ»°ˆÏzPqûúâb(5™õ*¸ƒý{h¶ è­Åã¥O¹-¼ö°•…m„j
I³ˆd@a®>ä•^T0�Œ¢W¯hÈa�¦)ÚâñÂ·„fZÏYD�Û‚„4¨0LsAçMl/¾ °ë\5,�<pÒˆ'&Æ¯õ¶	BJ‹Ð´Åë?ºèÊZ‚ËË’P‘mvR´‹»tˆIˆk�JïŒ â�å#cx»ìÜÞÜ\sq×4#ež>Õö´*~¾,ž™ œ07Í/¡ya	-)�Yì`€��½!˜z`|0›Ç7çíAÑìjtwk(é»ƒÃŽ+hñøÑ>5�Ûì»a 1M¢™ è%fm÷ÀkÍ�Ô’˜7§C�[É®éyì74b×ùËØolÆG¦6ì¾dF%w|#º÷ä<NôÞÂîªzì©iÄÎ³U8hïE~¥o}^�ê$‘Ñ&š4–0Kâ­³Î-í´úÑ4—Dã|R
ìü�ÿ=
oKƒì@íæJ˜÷pl,¼MÃCîk¨x8©BÿÉÖƒsCë§ÃØ_ÛŒ#í½ÔKRŸà|£æ+Y¼uMs©ZëÜ"ý
R¨øâÝÇx¯Ê¨~7³ÁNô—pØÕ§ŒO\ÿMÞZU¸¤Âé/îã�;Ã¤Ø£…øuéÅŒn“?© 7M^ªÕY|‰!«/2'Ø@±¡8P×B¡E8˜Ü66‹ürX�¨RóÍJsaœ`'�žfê·�Z;ŠÎQO4i*Lˆ¹òô'‡`qB3—qÄÕ¢~Ô�¼¢28ùd7>šÀ¯JÊQ|{${Ry-”h§FÈÜöÂ³h™Kp¼ˆÚû£Ø]Y—@}åã�dzë¬ÞXªa6‹À—f)ŒãÞÃcî«<Ær”?B£�Bl¦˜ý}m~gl–ymgÞ8O õópóKùAuNößCÑ$+(�Í/¥³0€eF36“XÀE"
ût;K. æÞWhöÇØ¬š´€Ä^½ûV«S#Ç�î2.5‰SWe÷ÔmM×ìÝ¸hÓ+*¼¤k˜‰zÌ3äBXYô©£ûùz½SVû¸­rß( @12ŽŠ‰ÞÅ¨~<‹#Ý¸ôxFæDOùìD¡qD= 3�Ž†ƒfN˜§e’ü,ŒzÂâYÀ¶ã¥¨_À‰kCx«ø<¬üÜºæâ"¢Í2!!"Ø~ü4j<ó &�sëÂj.â­£Y5�\Hº
¾Rûøºý1ªøÖß±ƒXag?ú	´ùh*&b 6@ƒñ9ì8qZ3'®’¸àÛÀZÑ4Ô'kož@(Ï4‚Ât–?n°áÍÃE8ÖÞCA-Tõ£gx�_¹üó¼ÏÃq•AìÞ¨
abMùÐ}ì­2©ZË¸ïž®À¶£%¨Ío@¼Õ§¸~*œãº© „�“šŸÂŸœÄ/

åýVó£^Ø¦p’¡wÎTâ]~�Î\ÿn~²ûâ8îºŠO�½èæm*Výoüù$>Ô[P7©´3,žâ­“Ë4ÒkA¤ù·üýüÐq|XÛÄ¹€Â¡ö>´8`–�AÝ¼‡½—ÍØv¬¿a˜½Uuøû>2X�Wx¿<ZŒ7N¡¨&êR#‡úì?#3áï›&‚Ïë¸Ó\ÆýÂ4[P¸Ä[°�¢mc^˜8¯‚‘ÍäÏ{p�ŽtÝÄÑžAT=˜TkµãóŠs!^â©Ë½ê¦%i3áÜ19ƒ�[ºðþE=º}´ð>ÚøtÛGg±ãX	Îþõ0z²µßÐódÆ%º¯_}“øŽqbþ®‘¯PíK 5|ÒßçQçŸ­DYÿ—ø¬û&òøº~â¾ž®ÉÖg8;®£‡x}Í>{+Xà—c{1æ2|¤óö0È>>¥·G8§L2LäÌeÆ~uô¯ºêÆC?1zæübR3æGš¹s/X'ær˜59l§ætðÇº­\’’�w•Ø(A&D(Ã¹ãìz–sÇ¢õßvþÂg‚»+©õ?—Ã¨/Ã
O³Lp-Ë
ì�—Ýó-ŸMô†QoR3ò‚üJ°>)=j×ßÖåxŠ×Œc¾<Ã“Ùjîn�ðèŸzS4LéŸÎz8?hxâ«6°Fj·ªûo×7Õ©,V‡Å    IEND®B`‚‰PNG

   IHDR   0   0   Wù‡  CIDATxÚÍš	l”×µÇ?c’(m^eyOHO•
j^*”D*QÑ£J£6Mv[	K’&‘<RJ1$`v;6¶1¶ïØxÁ°ÁxaŒÍf{¼cÏx¯³x<ÞÇ³œwþGóñƒ×¦iÒ÷®ô×wç~÷žó;÷;÷ÞoÆV¾«rùòeåæÍ›JYY™R\\ìSUUåÓÐÐàS__ïSYYéƒ6Ü+//—¾ÿçåÒ¥K
‰jjj|ìv»/×ýX“ÐöpÉ=?ôÅµýŸfWÙ¶m›²~ýze`` Ð�âv»•µª¼2±ò³ÿüµï±Ø„'3/å=…žŽòg³~å;sîBe�ÿ6ôpŒôÝ¸q£òé§Ÿ*%%%ß¸F£ñÎäÐÐ '5uv+“YÉúêÒS­óûûû�ŽŒ\rÚÇêÜŽñnrŒ[!ÔÑ†{èƒ¾™/=Õn²(��=òd<6Q_ßi±Z­˜m¥³³ÓgxxØë¨¶±q¶ÍfKb89�äv¹ÜcNõ;\Ô;î¢n;äD]Úp}Èé §Ýnéç±°¡Úñ…ø‚Ï¸$%%ygÝh4NRó»ª¶v–m`àª{|Üíbp‹ÝAÕCã®BÛ¸ã‚uÜ™mweYî¯m¸‡>ÕCÆ`,lØlW+kjg©ë¾<uaøV…w/|OO�ïîý�JHxØzz�<ã.§ÃA­#ã®«V»#ÝlwŸ±Ø)£oœ²X9V�gåŠ¤Ž6Üã>v:c§t‹Ý}µßî€Ø‚Í£1"$,ü»÷‹OÕ?Xþ®Â[ ~€YK{‡RZV>ƒó·†gŒzFìÎü¾1gªyŒÎ˜ítŽá³
€Ù˜�  «GhIQ&�ÁXØÈ·Ž9a¶9­jà«Å`ß*˜¾QÉÎÎ¾¿X9ßMÖ~¥B«ýÍÐà Õa·S¥mÔ‘js³èœÙ+!PYª$‘ÔEž>ç 	|LÄ¶X£nØ†øª¨ÒþÆlµ
ƒÊ“““ó·àmM:÷õY}]ÝÊÝÊªß²Á±ÑÑQ*ìu&Gé¬i”Ò!‡2D² 
8îyÛ }¿¿:¶Ä&Ûf#Nø‚Oøî`°xv¿¿ÊÎû—Ë¥´µ·OªÔj•Âââ—mýýÖ‘‘Ê3�¸záh„Î°3–'€¼Aˆøò0‰2û&‚Cƒñ�ØóL|À|ÂwaqÉË`“ÓéÆÿµà€ÉÊÊò™;w®²}ÇŽáÝ@;6<Læag|/ƒG(M$uoÈ×$éÑ;D;²òD=ƒœ¡öQÇ~¢]ö_ð962L`øŒYæÍ›+l`|h)**R^|ñEE=Y[ZÛ"íCƒtÛ2èˆí¦´ÞaJõ
Ÿ%¯ÎB&\‡éü€›üÓré£3èÃ´´-ý"å�¥õyÀeŒ
[Ø�íßcÌ gõäž1cX¾çëõúI:�NÑ”•ýzÀÚGmýî„î!Jæ  ÑÄ ÔY¡Îí96­�I¡…7)øFýêO{)¸´’Îs{*�—¾2v"x
Ôsß_B÷°0€L`crròDø…*áááˆP^°Cþ ÍF¹=Î8 AÜ—áQ
>wŠR¹_*_38ÿ£ïuÑªˆ8Z•DGï4Ð¢£‘t°è6esÉ]Òc'Úùº¶ß`°˜ÀF°.X°ÀË�rp˜L&¥H£ù­Íb¦:s¿ûtç ÃRR×‹¯Ýø,Žäs
Ïâ9«C rX|=×ç` !u—‘™Îæ”Šiî¥‡Â)¶¹›²¸Ædp_Ì:lÁ.$þ¾¦Ó|,`Á:!€O>ùDQ_ø1¥Øø‘�ï¶9c;Äx"àUuógn‡ó3�ýR¦¥Ï/SÀ…k´/_Cw(Î;mH1Í4�R/ê­¼&þ˜’C1µ­´›û‡Ý¬¥³]6›^èD¯ÏC³Ø¬VÒéõ)êë˜¥øøøà¨ö)((P>Û0µ·«ËÜbî£¸›;�!Ø@"‚m˜ÙƒœßKŽ„sŠ$ÒG©¹äŸ~‰6ÅgÐ’²8Ÿ±�9UZŒÜ†	´4(’ör
­æ´Ú•§¡’²ií‰DZz$‚Ýb›vØVýÀ'|£MXÀdìî2ö—]SÁ
f°+“'Oöî<EÅË­&#iºû\'l¬ƒ`©†â;úéàKîÒüý¡t¬¦•Ò-ãœFNÊàk§ÓW#D	œ&[“3i	ÃmŒK§ÀR-�Ò›(³ßEëO¥ÑçåôÕñ:F¡Úš·?„k*(�mÃüAð¿`Ø
ŠŠ–«;Ø•ÇÜ€V«µ˜L”Õauœ2°!6/²A¨Ë‚[CËj(¾ÝJqí}’Ëéüø?Ë¸Hosp[Ò/"ï±F0»H	6àj­çê,ÃÆ¶õ‰�ýà;ÇNR*Î ñëõ'`ÉîèsXÌ&£ Ø•Å‹{wŸ¦ÆÆ‚Î^#%µ÷9c cñF!ÌÆé6->A';Ir”û ,J«£e‡ÃiÃE7÷àiÈ‚L ‘¤Ö±êZöe”úte]E6tÐ¶‰€Ð¦úƒo(ÖÐÏLV'ØÀ¨îF`WBBB8‘¤ü°U×Ü¬ë12dŸ`�„¨½_rsù—Ñr§‘Ü�Ìîþ«7èÍÝ‡( à‚Á6éy2Þ
( ¹}ºÅ,ëáCÃöû Ûõ´<$Áˆ�ûþ¼&°�¬ ö+W®øÄÇÇ+o.\4ÕÐ¢7Õv)¦ÕâŽkëã <òÔO·Z(�óöÃälú0!ƒr‡‰vfçÓ[_QD];§…}�Ä.¤¦…*@–¡�¬)ÿ”lØ„mñ'~'ú�i³¸ë˜­]¯7½¹`áÔØØX%//ÏGV3~Y³aãOÛõºÁªŽŠæ bÛ,HV…Ï²¸Bªt´�S[çœ/ŽRŒ®;7{g,‰û]¯  Mê…IÁ²òØ)
ä{øt²±ƒæ±�°ÚvoŠÂ·×g«|¦ªÎ^#XÁv,\ŸŠŠ
eÕ»ë§µéš‡*;º)ªÅìŽe˜Ó"Ë�j1ÉITVMoí9L±œ	žÔ�™ã>ÈïpÞ¡fùÿ‰~É
¯nEÁžŒ]~š>/¼-ïE+9�üyÁ§G`ûÃ,ÌdqWòä‚qåºõÓÀvüÐäƒße^{cÎ¿ëï5šµ†.ŠÖ›Ý :%2y®†¯¬ž‘åG�“ÿ™\úâb‘¼BœÂLy„@Nê�ô{Þç•Èu“'ÍrP­=Iû5UÊOr]TÖîA€†�|Gó¤‚Œ`3Ø•ÄÄDu?ÕP[£o0tÒÉ“ûöIŒ@\×eáîäÔy'4FÚüÀ/iKüYJ7Ž`¡¡? $]dñl¨ó² DÚ–Ÿ@ X²ÈRüÜéER�Ñ›\`#X,ì«V­Â–„ ©¸s§Xßn 8½Ñ#ðF–\!äºl‹+C¢y?/Ç²«¬;CÉ­&yˆÖõr»RTIÛâCa|÷žÀG7÷"pžu^¨çõçà™©×	60‚Ì`W{ì1ïAv­°ðD{k+�Õu;£tìLÇ ½\Eqüxì–×ä¤”ÝeSìYš¿û •ÜÅ+5RFÎƒ“€�^,FYö‡È9"O¤�ƒ¨ÖóûQÅó~ð£
`ØÀ¨d`W|}}½/r±	‰ïò"¡+º×q`c˜(º©G ö”ÑïvÒ\Þ÷÷æ—b§À=I­=×nËÂÞqšNT6áŒˆ{Ý²;í-(—÷u“ØÃïJoqàóxÜ�Â[ª=ñ)Áð5Rgd&ƒl`T_èÀŽâ=‰ç-\ø|}MµU«o¥¨æ^wÏ Gl´[òwÑ�P
dG‡4•Øþ�â0šg4Å iÀ{z½p�ð¹C‰-FJî´Éé¼…ßF?â=?Õ8*çÄâƒ¡t”w´=ù¥\?Æ;Ø Es°€‡à,`ª¯©±Î[¸èyõ$VÔrôèQ‰ˆ«~EÅÅÙ-:¥6u:#›Ø ÃA˜Aì.ó[çâ}GiI`0mI=�“¼=R^G«ƒ#é´Þˆ@å`Û’–K¿äþAô‡¨x
8•ròéÐµr
)­¢Ýç¯Ðïv|AË9ˆE{�Ò¶Ì<<%øÂ¤<Òš:œ`*f60‚5((Hñ–©S§zÓ(($dYS}iîµ¸�¼cuC»+ÿýå²¹­¶c�ÈÙ{åv!Ì"‘þûö�üÝxo©+9È%<Ó˜ù•¼“íÊ+e{¥p¥‹ãT›â¥÷Z\`›š>`ö–)S¦ QIJNFRý°¤äºF×ÔD)�gä=â^—ÌŠˆë±žmu§žÎŸ/–Ð‚ÏS"/ÖÈÆ.Š¬7à�Gz¯‘Í§R)´²b�"ý`KlI "®Ã7À&°%§¤`Ãæ	å•W^Qøëš<…Àƒ—òZ [M®H/¤÷ÊP�Ðmq¾‚÷øMœûgº %°iœÿÃOÑ¢ƒaØ0„à ÕÞ?|ƒ,�.gÎœ©<Pž~úi¹ÆÅÅûá¡œÏ½�¢kl ‹u:Gx#Ïˆê”'"Ô½íêÓ�…þÎ�:�¯¡WJi%r|îKZD1ôD[RW¯â‹}²ïf‡®¡�Îçæ¦€	l*ë_ÏÞ~ûm%##Ãå…Ÿÿ|úõë×›ï5ÔÓÙºg8;ŠVgK¤Î¢Wœ2xôX|òš±„Á‘ïø�R}¤ÿÃ%>ÂºØ§ÞÙÄð`ø�^˜&°�¬-Ï<óŒòúë¯+ÁÁÁX“¶lÝ:çö­[Ãuuu”\×â
4‚øŸ(	 KÒGo‚P÷ô3Lì?Qb;Œ}¤°/ø„o0€L`ã_-¯¾úªòþûï+� ê€Ý{ÖÝ½sÇQ[[Kgjt.8  `"½êx ~œ_�#y+=.âúÃûÃŽWaõ�”Æ>àëÎ�ÛŽ]»w¯XÀ¶¿Yüüü”5kÖ(aaaÊmß>¹÷ç�;ß½Y^>\_[C¹Õ�Îˆ:…#¾BS÷T?ñªŽ‡­nƒm>¬¨œ}í`Ÿð°€	lß¨<÷ÜsÊöíÛ‹Å¢lÞ¼ûÕä7ÍçŸ3Zë«µt][ãŒ¯Ñ»Âà\àÚ¿•06`6a»àÚµÖ›6Í‡OøXž}öYåï*³gÏVV¬X� ”÷Þ{OžÄ´éÓ_HJIÉ¬¸}›ªµZºZUëŠ¯nvFÔ¶»�!N›ÖqQEz$Ÿ=÷ÂXè‹1{…mÀlÂötö_ð	ß` Ë·*o¼ñ†üjwøðaÅßßßoÎœ9�ró“nÞ¼æÂ…w+nÝ$mU%iªª)»ªÞ¯mvFU·¸"jÚÜa¬c	…Õ¶¹Ñ†{èƒ¾šÊj°Å6×Â6|lÝºÕïÈ‘#øÛ±0üÃeß¾}ò/ééé>Ë–-›òãýiõo›·lYŸž‘‘§))ª¼u‹ª**èv%T©¥Bä?=B¨£�ïUIŸJ†Öaìæ-þëa6a>nÜ¸!>¿Ë‚­Fåï·ü‹€ßk¯½öè”GEjýxÆK/ÍÚð14Içsrnäç®ZK‹‹F¡®_ÍÏ7äò½¸¸¸$ô�ñâK³06`6a>àë{+™™™ê+8~Öðýàƒ¦ðÁ‚@&óõ	¾þ«¯Ÿßó?™6mæK¿˜9ûeÖO~:m&Úp}Ðc06`KµýO+òîÚ5ü£‡ü¿°°Ð7&&æ‘Õ«WO~â‰'Ð#)Bmüp2ú /Æ`,lÀÖÿ—Uø×¡ïô¿¼æ¸f°šK    IEND®B`‚‰PNG

   IHDR   @   @   ªiqÞ  ¤IDATxÚí[	tUåµ¾œª»êÔWìê`[ÅÚª]¼ª¼" ØÊr ±ÏöQ
OT° …0È\ !	IÈ<‘‘@†9!džç„›éÞ$77óMî°ßþvÏ¹ç&Á�§µv­žµ>þ?çüÿÞß·ÿýç$èþ}}MWrr².>>^§KOOwËËËs+,,¤Ž{‡–çIIIÿÚb£££u›6mÒíÜ¹S�6›m4�a tcè õRVžI[ôA_Ø€­˜˜˜o¶èððpg½¨¨ÈÍáp@È(UÜØ±c�Ï_}õßòõõûnDDÄ½€¯¯ïwçÎ}õõ9Úªý`¶`ÓÕ×7æ:zô¨“l[[�þðÃ�÷Xà=•••3­­kÍ]]Ñ=}}™ýKõÀÀ€q`pÐ¬Àˆ{=½}™hc0¶®­¬ªšy·jÇÓÓåhøPï¥¤¤üó„?~Ü)²¥¥#>
eyY©.,,ì®úúú¿°˜‹eÀd·Ùˆv†ƒø)5Øµ:	äúô˜:ÙFÛ
»«¤¤D×ÔÔ$Ù_ªpùZ¯ââbÝ¥K—tiiiº¾¾>u^cñúQ‹Á°«¯¿¿Õf³Bˆƒìv´ZímVkmŸÕZÜkµ]é¶Ú3º­ŽK
PÇ=<C´°Úìè°ÕË6a›Ó©ë|ƒ¸€Ó×qA°Îb±èºººÜ:;;GŸ<qBçããsgssónÞ-£m·9,ƒVÛÕþAÛå®AÇÇæAJ4RœÉ*H`$vîÉsy6HÇ¹ú^í´ÁlÂ6|4±¯ì3íäI8€8�Û?êÂÖåLy½^?J]àJKK_ëîéi°Y­D6«½›ÙtØ�uPlû Å0âY|’i€’YÜ¤…zmÐ}¸?0@Ç8 °Ùe°g|ÁgûVJpRêàúÕ§¼jœçö¨)“&éÜW¯¾½©©9Ø20@dtô3¹ü®ÈGµÐa&žÀHX�¤ ¹CÀ‚QªÐž'j€Ø‚M±ðŸðÍkÂ¡÷ÝWßNà¦ðüê¦Dvv¶S|kkëè¬¬,]rRÒÏÚM¦ÂÁÁrX¬õ=ûÑvE´Zèp›…âÛù61\2‘(‘¹'ÐÚ¡÷Ø†øªïé·ÛÙ÷àà �KRbâÏ²._Ž*_pÿÒ—Õjc£ËËËtéŸ|2¡Ãln´rô-ý}Öls?E2©hF\› D¥Œ\$ƒˆDªxÒ¶†!Š}ÁgŽ¹Ÿ9ô[™8}ÂÜÊÊÊ„+8ƒû—ºjkka©ÅâË±êÿÆlîl°ïÙ¶Ó¦~
3öS,F¾•K@ À"@Ô5aQD–pŒ>`�Õ—øp´XÜÀ\ÁÜ¡áÿu�?^Ç†pªu’WÛø¸¸9Õ,ýdîéµ¥¶õQ˜AˆPŒ u@ˆ@„‚qŠyÆe‚ò|äˆ«¶ ~¤?pHmû;§�þ~Ç8æ
Îà^QQ¡»xñâõk±ˆðžëöÀè/~ë;£1¿¿¯�ºº»mÇX|¨�Iû(š#ÀÏZ„´S¤†xE|J§�Òºt²ÛŽ:î)âû5áêhkâ×é\ú8àÖcã)Aƒ1œÇ?ø h(((Àáìë—Æ?üáe{apÕ÷ööRow·5­­—BZÄ9E�ÄP2ÚèÕ@h�Qç6ÉfTÓ|Ÿ`š „
«y°â™šCÅµQ.>£\2À)�ƒ ŽàZ[W¬n‘÷Ýwß˜7ožnÝºu8rÊB’››;ßÜÙI–žnÛåö
née‡½% ©	*�  líƒÔe«k¥™›vÓÿ†'R�nè ¸önÓ«‰‡-Ã`[õ3Ä¤Â!˜ƒ�É-Ý]6>B¿fÏ‡>¤�öððmŸ{-X°@^aÏœ9£Û¸qã÷8õëû{º©ÒÔeifg€qŠº8Ö€Ÿ%¨÷R2§û¶‹ôì‡ž”Ög¤þAÒI:ÑCJà ´×ú«âµ «4N(C™#¸‚ssß°aÃ÷xwÐñ4pƒ¶Ï¼Æ�§;ÁG["’Ñ/++ßÛÍ‘4™ÍÖC�g-=qŽRB€@¨PôBîÉ(ÕiÆÆ]´4,ž–…'Ð³œÓ7ì¤¥\OéTúõ
4[šM| ña~à˜`èÎ]Ì š ?õš4iŽ¹òbãïç÷ ¿Âvõuš)³µÓÔÄNš{(€C
- ZF =(5AÜÓ`O^%ÍÝ$Ø[PCU-ô”ÇvZ{”Ž˜m,¦G>,ÀâO Nà qCÄ ç>žºœÁ]þþþB´Aã5/777]ww·sô‹KJöt™ÍÔbê°E5uqd»)€£&©S Nµ D¨ÏqÏ%M¥·AÜ§¼åEˆW|.mä•_M¿]½‘ö\.¢x¾‡6áOD«Âá7A(·gp‡†’’Ò=jpVˆÖ×í·ßŽ7+·þþ~�»»ûø�ËØcî £ÙØØ%Â¨Ðˆ	äYlÛ€lkGMVJæÔOâtLní¥cf+¥˜m"^€€ÀNc'Ep‰´O$Z‘”F/lõ’!‘×�#Ü÷(6cÚ,ðq-ñ#ø6vS†ÁìèeÐ²zõêðî 3›ÍnÐ:âº÷Þ{�£áÂ…ÅíííÔÚÖn‹mê¤`@ÐÀ	¢u“ÂVv¨¸ŽVrÿÉë ÍÞ±�^ÜæEsþ¶Ÿ^ûÈ�VÅ£há]²­aa)|¯l¤§.ÒîKùô¯ÛÏfÓ»Ñ)ôÂæÝôgž&îñ©RZ/>Â•þR*œ4Wá|˜¹·¶·ÛL¬å<kR³ ZG\¼ZÊž‰zyEÅñ®ÚmA�l°“B]‚0W°8ŽãÔ^™D“Ý?¤9{ÒÒ¸ã´6-ƒ6¤_‘ò�ØTZÆ÷`Çå£�<Ï«›i}Ê)š»Ë‡f¬ÛNÓ×ï -òhéáTúÃ™«SÏÑ;üóK»ýh
Û^“_Ê ç~€p&p‡h�&hƒFh1ÿM&“,~o¼ñÆýú†Sg{¥5u8 \êâ@JqÂ÷pF_Â+úSk¶’gv…¼¾Æan›¹>Hq”	˜fdI--Š¢ik¶Ðï·í¥eñ'È« FF5Ál§ÝÙåô4?;Tm Ä.ìÈÔÚ™UJS>ØBË"’àS|‡	ÂQá ïd&´èM‹-º¡uÄ: žúÇÅÍ1ØCí1|8	Ò›Ù‘Õ8ÂÏ"yîîå}2/^åVòâe“û¡Ü6mõÌ?ã'¢²‰FÑn;w_mÏ(’U=Þd•ƒNFUÐI¿ãÔ_ûñ9ŠaáÁWM°Ç¶í´+»œ3a#ysÀ°¸Â8©ˆæÞI¬�µ´Ú¡	ÚÔÓáˆP�ÿç/\Üfjm¥Êf£íV2$âˆ‰uÈW›¿Æ}L/íôæWâ>´ƒpŒ×;„dQ7¥ž¡©œÂ/yúÒ®+e2¢1­Œ:ÈJ6…3P?Ì#þgÿZ…ÌqÚ{¼8¾ÀkË{‰ib#˜ï‰pëäçÂ š.\¼¸M]†,„o½õ–3 ù……I­FÊi4Ú^5Ã)„pãNâ{øäõfx"ý÷Þ@YÔB@HŒ¨j¦×vûòÚ°‰Öœ¼(m¢�ýê®ADÊZ™rš^Øæ…�B]yÍýçòóVd2ûd&U°Rºpe°h�&hSðæ›o:õãu71)n--+Ë3t¶Áh÷¯c
¨†ÝzEó\\Î[×‹
Y8bR8ñygÓTN÷ÙùÓÁ*ƒŒX¨íP§ q®"%@Û.Ð�mXcÄâ†ûˆiÂÛäzïÈid8€‹ÆË…k šJËÊó Zñ%Ùy544`Äàð/$®¶Zè„¾ÕîãD¤Å0JœÁ9ödÌK¤·_q"y‘Ù~ê=ùîûôvt
NqØ²`P�þ€ë=�†M9Nç…p—ÍèÛ.»�OaûÚHž9²õJ „—ÂP¹r š ¡šUýxó“ Ìœ9óþêêj“±¹™R®¶:üÙé!@5ŠrˆÔ;„Ø,>¼,âîHÑæãçèñ¥îô~ê9Œº3hÚôéÀ\Å«/€ºöŒ‰c*øóÑx¯øÛ/Ê:XÛ*Ûç;aq4kÛ^øÆc$Gpg¬Åè067QkƒFh…fU?^% /¿üòx@�¡©‰’ê�ÿ:	 R7qÝÕî·	AÞëÿÀ‡ÏóÙôø’ÕôÁñó$)ÊÏ !Rr*sé‘xœ<ø-0B¯�"€�©?cíVÚ|6!™åÏ6iÅZ9[D°Oø`¯:á+÷¡ZM�@ÏìÙ³Ç+¿ÍÒÀ¢% /½ôÒøªªªž–ÆFJ¬ã Ô¶‹€ 'Ú]GjdD|ùà2y…‡¬	Q<²Aµ (¢´å{Øjn3áí•‚U‰ÜÞ ‚ÐF‚„oëvÐº“—Dl4gÅœ{i®W€DÄá£”ÊÜ¡!Q@Uu4B+4»~ü” L›6íg••-�”\gpø1YˆDY‡RàêÔy?’ÓøÞž^åû}$§s 3H’- ÚÊËŒû±³ôÄÒÕ÷Ô³¸§Ž¨+ˆSþÙuÛÈãÄŠãýqHMYµ�ü*š0…Fð „Ÿ:X
w? ´°&œ; Z¡YÕ//A8~ÿûßÿAIi©¾¹AO©u-v_1ÒªoÕ ©*#²îX:M^¹žöÕrên¡QIò±3@!‚@¨RD®åmqÍñqÜSGT²  ÊÀ‹àfÚpú2Eñ®°þt&ýír	ÎìS8h™©ðÁ�ë¬�µ4Û›õzâ7\=4B+4»®:þ=NGßÉÉË+lá œ®m´ûÖ°v @‹Ô5g¡,æ÷ë·ÓâÈd9¹mLÏ’u`EDÎíÈô×F«VJõ…ÊuŠAŒÄ·¬A¶Ð­ò•-RI¶c„O5(]yi wh€h‚6h„Vhv^H‰ÌÌÌ1\½ñâ¥KG›õWéR­Þæ+†ŒJ ÔR«¬6©Lsçy¤0F	Ä±.ÜÏ¤«í"Â¿Ê€QQGv2Z±-[ìGØZ9åwçT åÅW@µ‘K#ì ®
uå¥AyÐM.^:
�c yÈÅ‹ŸÜ<’’²»¡¾ž
kêmp"¨QJp­WµÈ!e)ïõ/nÝƒÏ^ ˆC�aO^Mãéð;†_½  7$v%X›>ÉâØ@Ê0=¸|·â „/KXW�›†÷ š ù60ØC.|4”£°—×Þy5ÕÕTUSk¯n!U, �‚”~•ÍÍ+ôÛ!‡iêÊuä™žIaumüŒEV¶ •¥ÝŸ|Bè‰wVÊ”ˆ®oÅ‰v±×k„rO>pü•¿)ünãNå6	|x}m;qŽV²ÿÜ
l©Ò^¸ãÀ4@4yyyÍƒFhþ:Œ)€EaÔ3Ï<óHQq±Y_[CGª`¬Ê Ãøg8ÆÈìÎ(¤§W­£Y[>’}ièa¤,ž#]	„ogOñœ~öý�´95�b˜|åE’)m!Y…$ù òÇý‡�IXùe�y;(š&.{Ÿžáíq*Ÿ¼²J°n Cã†œT)¥ªÁ-ÐmÐ­×zÖ­Y³æ¼ž;>]_[K•u6_Ì7q NT0©f!7Ï'˜^æ“Yb'Ñz9é¯kè@©ž$eF$ÞâšD½–@ßý€~ÏÓb]â	
«h XÎ¼ XþLÞ‡ûÿ×2w|“ðåLó.Ñ³íèÃO.SbÑ[vÓ_üÂÀ\†ñk‘ øVYC­€&hƒFh½æŒ ¸…„„¸óš@å••¶P~›óƒñJ8pb°2³ xš±j=æWÐ[4íýMä¯´E	"ï†Æ‘çÅ|,�8åñVYG‹x_ŸüÞ:É5´`ïAÚ~ò<(©¡Ø~àCÐ²ˆD:Ä¾cù|p˜3%¤LOS–¯¥¥Á±t0—?˜¬ô ·#“Á\àÏÂÜ¡¡šµ„„†º+Ú qÄ…!ü‘"òbÌôéÓÉËÏ7ÕWUÒ‰Šz‡O%GUÒ´¢T Ú2Z³ÿæM—¬âu`=öm¤%FÀÊ\žÇ"ÃôfÎŽ
ÄBÇußòF9ÍÞéC“9¥§ð?ï±•æ}t€Vð™9O§%�ô?žÞä|.˜Î~’×“W<ðVÙÂEgœÁ½Ž5@4Aÿ±¦´~êµbÅŠ¹¸9ùÈ‘ D®¨¼Ü1?yŒ0yòGŽ%zìç<ç²Q<|àùíÒUä“_-•_y‹—QÃ¡G^€|J®Ò^ùWÅ§¾aòexzqû^ú“÷!z/)�3§g_åÊŽa`#y�k£¨¼BFZ I´}ÞµdÉ¬�7üñµ×&çôÕT”ÓñòZ‡w�8œ!R
 � !ÂÏ€ö\žá\¿�ì¤H>Óû”5¨Ï$ü~gà“BëRÏâ}'CP}M†}d"Ž¾Â\ÁÜ¡á5ÖM¢í³®›o¾YÃùóçßŒ‰‰‰!¼gRqi©-”«pÇ#¡×€vª@r6ŸÍ¡	‹–ÑÖç)‚ƒà]ªG
²À…ó"¸•×�G,¦µ'."h8à¹
Å6¦ÖGúGpçÊÊ
J`ÐMÐ�Ÿ{=ÿüó£�‰'>v9+«¥ª¼Œ.”V8”s  ô:�c->h¼žHÿùúRÚu:ƒbyWæPßõI&ýfÑRZ‘(£í[Ú€¾×æx¡¤ÂÎ™—³Zž|òÉÇ E4}‘§ûÜsÏáÛÀÍè¸oß¾ÕüA%E¶c¥5´A�´È‹s­QG™ðFðašðúZèåOÛùP³ƒG}á¾ƒrï�C±8£íÐþ#lŽôNàv¬´š¹ÛÀÜ¡Z 	Ú¾ð5fÌ7ŽÞ­\½‹ÿ4™ÿ\†Š­1¥u´¿Œjéé
!¥•®Ð‚°áT/pž4™Ï“yåŸµÉ“Ö§eà[Ú\»¿3�#À\ ¾‰bÊê¨¸¨ÐZÆ£ŸÈœÁý‰'ž¸Zt×s�5JÊŸÿüçc0~üã?œ~ægUÚÂKëi?H‚ìu‡$,bxSó.ªPÇ=<û6$�*ÀA¸„1'pGpgp‡UÓu]=ô~K¤›0a¦ÂmsæÌ™ÁoŠmeœZ9ö0d‚„R†”ˆR«Ýw¶<l™j£Ž{_°¿?†ˆ/©§Ü‚B;¸�#¸‚3¸C´|©‹Óè[0¸èõ×_ÉÈÌì.-)ÆáÂ]RCûJBzE€^�Ô5hÏ5”¸Ü¿Žþ¾
àÀ¥´¸˜ÀÁõñÇç/wá…A­²ÁÛp–^¸pá+ü›ÖövX�—k;RTAÞLÌ»„ƒPâ*ì3êŸÖîóûC8ü	à;?/Ï.ànà¨puS5|©kôèÑÎ pJ}fÍš5“ÿ ±¶¨¨˜Š8éùEŽ â:Ú‡ôI¤øèÕR­Ÿ]†Ù�í}hø‚Oø.fñii§jÁ	ÜŽn*÷¯äºé¦›œAøÕ¯~…èŽ½ï¾q�FFE}ÌéGÅùŽìœÛ‘‚2‡_q=íe¢Þ ]¬@ê0xæZju@í/¶ö±MØfì‹…³ÏÜ¼<‡ûÆ�{œnnÃ8uAHMME<ù­Ÿüä'wp}ÿ®ÝãÌÙ³mü‘�Šrs™L.9¿ÔXTKûA¼XOû!žÉøT\uýmÑ¢¥?lÁ&låæ8à>×¯_ïàNà†ÿ=®_ù5|>ñ6s¯®Â�?1(((†W`KA~2É+Ù9¶´Ü[LA¹#€x³¨},to±žÁâ†a¯@�º´EŸØ‚
l\ÉÎ¶B8g|À×xö	ßà .®ÿá×âÅ‹¥¼ñÆG?öØcß¾çž{ˆ»§L™ò\``Pô™³çºssr¨0/×Q�“MYÙÙö³Ù¹¶�s
í‰y%ö˜ü2G‹+¨DäW8pÏ¸·Í³¡úÂl�=w®;0((
>àëž{ï½¾ÁAåôu^�B�7>üðÃco¹å	Ä/~ñ‹É[¶lÙŸ��ÉÁè½’•Ey,¢ AaQùŒ¼lWr�3Èáz¡ÏYî°›°ðŸð­rù§^wß}7ŠQ�<òÈM¿þõ¯ÇòÑó ßY˜ìÔåË—/óöö9›žrôXEÚ©S-üßZºx[ ÔqÏ¢cbÓ½}|¢úÂ†j¶á¾àówÝvÛm’|ü¼áé§Ÿ¾õþûïÇÛ‡ŠïòüÇåÜnÂOúÓÉ¿üå/§¨ãž¡Úªý`¶`¶áã}¹ž¹9]GqêÞðÔSOÝ2uêÔÛ}ôÑÛïºë.»&î¼óÎ±hƒ¶èƒ¾°ájû_îâÔq”ØžÜ8 £ð‚ÂâÆpŠß  Îszž¡�kŸ_ÿàëÿ tBœþg    IEND®B`‚‰PNG

   IHDR   `   `   â˜w8  .7IDATxÚì}˜UÕÕöŠbl1¢~&_úŸª"J¬‰±%ÆDE¿ïWì]ÄBGA@ºÀ3ÃÀ0Cf`èU¤H›Þ{ï½×;wýï»rîÝ÷reP¢‰æ÷<¼ì}ÏÙgïµÞµöÚåœ{ÇöíñíñíñíñíÑãñÉ'ŸØ8 øôÓO}|’’’|²²²æõ¯Yåôžo�/x¬X±ÂöÚk¯ÙÆŽk;vì˜�ˆôz»�çlÄ©‡ó¼–ñ¼§×ñãÇ}Xç«¯¾ªm|{¸ÉÉÉ¶Ã‡+Z[[�„3µ}Ù½ô£]ðÊ+¯\6yòä+gÎœyõŒ3®ž4iÒ•<÷ãÿø–ñ6ŠBëfV{Úöÿ—G\\œíùçŸ·ÝpÃ¶¦¦&õX‡Ã�Ôöì³Ï^‚02!fxeeå¬ºººÍÍÍ‡ÚÚÚR:::Š�j ±³³“`¾˜×Pß!–å=¸÷)„£AÏ=÷Ü%îu[mõnllô0`€×U¦ÿøƒ±yþüù¶	&Ø@X/z¥óZ¿~ýúnÛ¶m@AAÁÛõõõ[@fQWW—½»»[@˜8P¸iOÀ?QÀsÝ±ã`]¬“u³¶ål—2 ¬«Ç¡Íÿ<âKJJlÛ·o·}ðÁ¶öööÞðä^–òŒÉ?1ãá�Ç;q(á¡v0Ø Øì�Ú»²«Ð¼ƒ`^¯±L€Ûõ?‡—XëÁ�è%ÇóóóÇ‡„„üÜâ(eC8³EEEÙŠ‹‹¿ùÄ‡‡‡»bqCCC/„§ÇûìÙ³ghUUÕz(ÝLb”pgWÂ»�éê|îìê’ºŽ.©ì°K^[—¤¶tI"O4[©uŽ×òZ»¤¢½Kê;y¯]P—°.ÖiØ†³=´Ý‚PµŽ²P&
†žÒ‹²ŠˆÑá›x@1<Í§¶¶¶·¥P¯ýû÷ßU]]½!¨Ë"ÝÁPãPÂ»� ¦ƒÌ£�]²§¾K¶ÔuI¤…ˆZ“ßD0ïD­3í”-õ¼·SŽ5i]ZgŒÉ6Ð`7ÛdÛ”�²P&ÊF)+eFÏô�“ØˆoÊAOwvìÖÎÍªU«~YQQ�(C/§g;º:á¦]�à¾SªÚ;%¡¹Svƒ4¸¡¦S6"%©›ëÔŠ­À¶z7˜Ï¼â;µÜfË ë´.äQw�¶¡mÙa¶M(d¢!„2RVçÌÉÒÁÙ‹¿ÞäoÙ²Å†i¡í­·Þ¢çëtpÈ�!fff¾‹�°A•D˜‡H¼´ÃÙ-²¯¾C"j:d}u‡lY›j;@`§DÕu HA¤ÂÂÍ  0çPž¨E
l®c]¬Sëfl‹m¢m•A L”�2bªÚ@™t!u@Oè=zôhÛìÙ³m[·nýz’_SS£’““Ã)^À¶iÓ¦�8‡î®Ä·wtØ�ŽVxZFs‡ì9ë@Æ�‰tÀ”Þº‰¤‘@…jÁn ç�±\÷¡Nt*"Ø&À¶)C:diƒL”­2r.@™†â¨Æ
BU†SêH]¿VÇ‰'l±±±6Lñœ)[ttôK---�T¤­½½««£Ãaïì�<(»d¬­nW"ÜéJ;E	cŠÏ Ó[ 5„‹tz»UÎI8ªFUh[jp‚†h‡,”	²¡7ÚaÊJ™);u€./R'êF©+uþZ©©©6,xØ55äüæ7¿9?//o9ã)ÐÝÚÖÖÝÝÑ.5­ír°ÊVµËz Š™*)H5<(Y$Ç2‚ÂéÑî0Ä+éžÐû˜j]nä#Ï¶˜ß¨P9š`•Qe¥Ì­míÝÐ�êôë_ÿú|êH]¢l)))ÿ>âïºë.]X}üñÇ¶•+Wö¾âŠ+¸º½sþèÂÞÞÞÖæ°··Kfˆ†rk@<ÓpÉ·@â-˜Þ`AÑéiÍ{Á“|‚žoê²Èï .„×t ”Ç’±’)dnl(À©ª£ºP'êF©+u¦îäàøÃ¿–üsÏ=W§fñññ6__ßÞÆ6mÚ´”——£·´´¶uu´µ1•£um²š^Oe«ÚdƒÂÍN€¦Æ ›N‡ZÂä=¯›û­:•|5ø©F 6–\ëªUf•½züC—Ö.êF± üAhh¨êNÈ9ù—@·‚ƒƒ{sÕ8uêÔbÎŸD›!hg[«Ôƒü�5m
�²HwO©¨�Ëí&1u’ˆ¼§!ÚéÈæšç=&¼YV¸ ƒ)á-c5eW¤®¥U¨S³eêJ�©;9 ää_rÜwß}¶GyÄ6nÜ8]Õ6ì²ÒÒÒã5Í--]�­­RÙÜ*Qô"(@…Öx(în†'¢FIr#ŽDR�1�z‘îQ†÷»`È7yoò-y+�²R‡vÕ¥
:Q7êH]ËÊÊŽSwr@.È	¹ùJ�k®¹†	÷ë¹ºõùþ÷¿AaaáÌñ¥©¥ÅÞÑÚ"e�-P²MÂ*  Yga½§b¬nïòÈ6�°á	ÃÌ�u�P^3Ä·{Ïrš7mh›ž²G©lEJ¹©C+tiÕ:J›Z„:RWêLÝû÷ï¹ '†£¯à8çœs4½üòËmGŽÑy~vvv0ilnîjki–
�®«²ÎÀRŠ©·Â=àn„6’ìií9­jŒmv‚½†áËZåM†ø*¢Ý™z“_éF¾e€µ*?ª’FhU©+u¦îä@Dø¤®Ï¥—^j¸ú²,Ïm¶6ôÎƒ_mnj’¦æf{ks“Ô46É¦*’�ÎÔATxA	9… C$ÉµÖkØv°ËÞÜ—Y¤Ø[ÛFCðš1SÍ›ú´îJ¦Ú;MÈqÉfg­35º¨6U¶HMS³´67«îä€\�“õë×÷MKKãéË%Ÿ^ÿ½ï}�Kq]d………F·kF<lí:!Äv¶²œ‚¶¨ÀŠ
7œ¨0F0Ê{Â‚'‘¸?
ä¯É(’'|ƒå¶‰3äCd5ÎáC†;ñžp¶ÃÔ„EC¼',Z,à°ª¼E¶ÁÑa�ï 	‚]ÞæÕ«W"7³fÍê}É%—(g_ê1|øpŸŸüä'½~ùË_^‚ùp\Èohl´·Áû×4ËŠ2PÖ�š‡qÖžF Œ×m ” VE8`ˆCžÄråZ\/Ÿ»D†Žÿ@ž	Þ Ï„l`^Ï­+ªÃ½ñ¦ÏX_éÕ¶%`dö$¿pÓmípu³´55*ä‚œ�rôä“Oú|iÄ_ýõ¶‡zˆÛ=Ür˜‚B©ohè¢ ©µM²²¬EÖ@ÈÕ „DÞÀÝƒŒ'™qÁÀEŽå¡ÆL×ãÞ¨Æn™q(N�ž"o„ï�MðxbòƒF½'�'É®V‘5eMÎûL[ž=ÓÓiÔGat£!�§Î)Ð��†¢˜˜˜)"Â•rß¿ÿýïÊÝ—rÌ�;—¡‡�Ø7‡Ñ›¤¹¡ÁQZß¨Þ¨5@³e§÷x‚ÊZ 	ÞÀyÓ+ÜÐà�I{�ÊÍïL–YŸœ”=m"{@ø‡NÈ�±Óä™ÀP‰Ì+—í0Û¡ô~ïúñÆ)¼ä\côšU7ÍSgK7r@.È	¹ñóó "ÊÙ—BþM7Ýäƒ…FdûbÏg3b¾ÔÕ×ÛÑ¨ì­l’�2¦ °H�À–H�B¦K[ãà"B¢hQ
7ÒZôáË¢„\¹!ç‘y²*)[V%fkþŽwgÊÐqÓäÞiódYl�Àö¬û‘jý^mšÞYîíõ*»¥‹>SWèLÝ÷TÒë•rCŽÈÕ‚ú�»–®ôtÊ¹yóæ?càeCŽ4˜^Ó +,òÃ,!)8¯1µà"ÞÁ³W$JSccž×qàÍˆ]††Œy˜¢ù·6í‘÷öÓAù®IJP\:ÎØ•(S§¦ñÍîä{À’Ûx¿ÑÏÒ·…ç4¥�‹–úzå†‘+QîÎšx(Üb°Í™3§/-ŠùîN<8çˆo¯©«—È²F4îi BtyŠ1†•õ„1‚IŒ1˜§GsJ9ãH¼¼)/…mB>�kŒ™Ž1âváþióeMv†6š=ê3ÀÔ`�Æ�ñ†|�ƒÈò&!'õàÏØv’3r÷þûï+—gsðé–zÿòåËÿ„øæ€…¥¹®Î_U/!¥M€h6©•·„fj`àiäJˆ•'a„—1Zq^óÖs`»<ÇÁw3Æ‰	;É-'žÅ˜UÕj ÙªßÀod³z-Ò&F?MKM>ÔJƒqŽœ�›ZpD®È¹ÃËc_¼p»õé§Ÿ¶-^¼˜7÷ÁžFz©­©±× ‹©÷—4B
¡°„k¶4Pò=�b<åCK«¬é)š×ú«1à9Öšë ´I{Éð¥kä–·'É,Ð|>†vŒ³^Ê¯$›6½È÷Ô…å-”‚|&'ä†±`AAî0qéóÔSO)§_èð÷÷×‡ÑS¦Lˆ-Ø–Úº:i¬­q$ÂÒÁJ¾X©�§¨¤ž3Åü*€SO>TßÝÐ-»jñx°ºUvV5kº+Ý=õ¸ÖØ­{ükNñ\%›¤Ó‹µNÓVêÌ(ÖPô÷Ù¾²¾¸Ž!
m´cw³•çÑ¦��2¹Í Õù§1€§ŽF÷\äÜ€£Z¸âÃý„Ÿ�ä0   ×Ù¼(Ëy?ß¡œÆ�¥–­«©‘-e?%lXA!Œ;²òš–5ÆÛVáî½ï	ó*dá¡h¾M^X&O,Z&�Í�ÿ»0Hžñ_!o„n”I›wKPlºlÐÒ‰r…EJ#Ã\%uW’^ Q¥õòúúmrÓÈ	2½ ,¿J†û.‚å•àu21r§ø�—È‚*Ù	CsULÙh@…ê ²;uq×zš” '[Ë4J(WäŒÜ‰ˆrù…Èøá‡}î¹ç†Ÿïâ!{,-ZW]Ý�WU£¡g•¢Á‚§˜ZB9»¹•ê=êÍ²Kå­Õ‘r7f+7½9An~ë]¹SË»§Ì‘{¦ÍC:WîÄ5Îp®}ŒÜ?ý#Â5Cëk Wòy HÇ›¥u€EØ˜õ[åñ�2ñÿ±�‚Ä/9_nÅÔ”ÛþIyò§©ót†ôû±SÑîDÅ=SfË¨uQ²1·œOÞ _ƒÊª0úhïµRÃ¡Üä‚#rUÎÈ9¼÷Þ{ûüíoûüSR>é¡å¦OŸ~ÂOwUu�4``9R^'ËŠ$Ô�oR#¤WïÐ8‰û¸Uì{,Aî~o–Üâœå‹)ån™}<EüS‹dYN…„äUËòœJ	Ì,•E‰¹òÁÁXY›©3–PÔÁÁ÷¢V$dÊèõ[äÁé`Ä‰Š? îÇË¤=G5ì“¡£&Ë’„l1%â—R 3�&êjú�™‹äFô’ûÞŸ#þ'’¸¥Y�Üõ!ñÔ7TS Ø�ON–ãó‘òZpUå@/rG­Eìç[˜á5oÎ_5üàM±I5¨�Üì•UUQ‚ðSlYÛXÞDdÞ�ÏTËÖkØY�"·ÁûnŸð�ŒÝö‰¬*ª—px_Ka,63kÊY¥�*9Wg}úÄöŠFYüiœ<½$D†€XòxöK¡‘2óÓ	Ê.·îmÓº§ì?!7ƒà·7lã‹Z¬Ÿ×Ø¦^_QX+£¢öÉmè)wŒŸ&1éÜ¹…õ¢¤$ØÓÙh$+­wñŒsäˆ\‘3aß¾}“DD9%·g<°‡á3fÌÆ¬óðÔ7+©©¬´gWVË
4††ÝAA�Fw#¯à9‚Za�üíÃEò{,š¦}‹·Þììâ–Ázœ…î¯Auê•;ÛŽ‘aó–h\Œ½Ÿÿñ[�º¢%8¯Š„ì)¬ƒmë´5 ½DîÂ`üð?Yr`H«=•�31•eÊÇ'eÈè÷ä”[[Rçr&…;ù„Kÿz�<Sr”]Q­œ‘;|a7¹$§äöŒ9r$õÂ+?Æ‹HeUÕÕR[Yá8^V#ËŠÐPò†1ˆG¯@ù:õ¨iû�ÁÇsá¢:Y�é-J¾'Và:½•/N-EÏáÀ|3¼ý÷žÃèü˜ö>×e9N¨áÔ ÿCÝ†û–$çqÂepE±ê¤¯¥<·bƒBŠa�tÊh`t4¤ê˜7AHÉU8#wä�\’SåößnÐÅö2îÅsO©¨¬”êŠ
ÙYR‹ÊÙdê„Âx…’Ï¼–Qe^^/ƒ£çžLãV/Ã”w‘ X^oyQ_/ÁåíÕ›tPôö»˜Û‡É|ŒúpP/FYC¸!ž`|ùë�Í{åæ7ÆÉ˜1¬Yá…eY‡:ÉZÈøá±$5À«a‘”zÖ±¬!ßwÝ=9Yì*©!gÊ9$—"¢ÜžÑ K—.eüç“¯70—å@b/+/—&@CCðÆðè%¼®ç0xðˆ³éÅºRÅ”@…ED½Î.vÔ´ëôôÏ˜Ä,è¯³}ß­ml�Ïïq’è…0Ë8ë@8Ç`ÄšÍ:­,´Œ¯mk»*“_j¡ö”Ç}ƒµW©ñª›Ñú»øÐ¼žÈ9v@È¥ˆ(·gâŸž~�Ê¿¬,/³ç–UÈ*¢ÄkcL	Ó8`<ÁtO‚SÆa˜Þ9n*HüLù@êâžOâï›¡nnÅfg*+
jà¹Ä÷Œbã¦–¤é ûøGKeµÃ	Ë	(‹®QÒŠÐæÌ¢–s/‹zo7^nH7<¸Î‘#rEÎÈ9$—äT¹íéÀCe¬|ÏEö\¼¹CPVjO-­�å4€´Agž0QHx�»‹O-]-CFÇeq;—sŒ2|Þ»:½P†Íõ“^#bz87:ÄwÐËµ|¨EšlŒGM¨0çMÏBýžñ‘Ü‹9?§¹ˆYÞ¯«¡b4aòÙåëôÁ‹êb7©•7\È[ç–Ô	9«*+ÓÙ#¹$§XŸKŽOk ¼ŽÝ_œ£•.Ãè�†JJ»cJ*%¨ �°ÁZ6â…ŠZ#h¡e ‚ZÆW�Ã7¾>ZÞÛyP4¾âüª"
[#›@>Ú{&Ï”›FŒ“g–­‘e¹•œ~j9†4ƒ78Ëiü'h8��-\&wŒ}_áåì�ê V¯¥Œ”iÒörãk£eô–ý§ô¼!^õ£NÆñ
4=åÆJ€œ‘;rH.É)¹%Ç=­€y±Ï\ðC¼‘Í8VYZÒ}¤¨R–R D¡�y£€yFPž×ÝÃ¹1:G÷^¨Lp>Éo“�ï{¿ý.µ‡ñ˜[–ºkzóšö õ^Ë»Ÿ^ïž óN¦²~m_Ã¦¥Çº²Fn…`ÀŸÄ�ž2SvÞo ºys`Î5ÊÕ‘âJåŽ¦§§gŸþùÿMnñ×épÿý÷÷f¡k¯½öÿ`ÿ¿B’’bÇÇ0@ Uy0`5æj8Øä-òÝŒP`ÂÒ#Øçù=Hö�Í�U x#¼l>f&C¡ô­˜ƒOÞ{”žHbA„“x“7aÐÊóœ7ê\ÞÍ±äÆWGÉÔÑ¢=Æ§WS'öß˜4úÖDÈ¨F_a<Üèä©7aœ 7.(R8JËÊù| œþ’Ü*Ç§9øð]0tèÐßÁ ¥˜BUÂ {Ñò-äšº‘oŒbPXcA=^Ø
‚�É@�ðz_'\x8V~òéýS?‰Q¢BHŒzž‚jy…ãµèæ×ÖòF	ÇbfÊã^ÖÇzGcµ{ÃËoËä=Ga «Æk¤áØÂ~.`%Bä<U;Á£2›mtôB¾Ox€œ‘;rH.É)¹UŽOwÜ}÷Ýj€;ï¼s 6’ZKJ±(.rìBe�ylL1àg@a„0ÝÑ¤V� ‡=¹d¥,‹Ï”»ÆM…÷¿ËU(c.êª&éž(pBï×ú×�°…\ÏZ,�Íñ•EGbBšØŽ1S%¨Z=~Ü¶2ð•wð°æ ',ò«ua6øo1Vžàê½lÇ¯ Ž®T‘O8y¨æ=l\Õ9#w%¥¥4@ëwÜ1€Ü*Ç§;n»í6} sûí·ßÀ›ŠKJ¥¼¨Ð±« ‚•r¡Ô¸`õ#¡ç¨Ë„e•ÈCÓçËMPzôÖ�Aˆ!ß2És~6yÔÇñÀ?)W�7!c0pçØ)â—˜Ã•·–1TyÔ£ßÝu!è³yŸ~^žW¥åWg•Ê˜Ahœu,™cò�FOOç#–ŸÊEže pVîf rJn•ãÓè&¼ØwðàÁ×á Å%%j€Ýùå€JÙÐrÁÂ ¦C,ƒÒìî/…É „ƒ×Voæf<Õ,ãc={“‹Ì)ûOÊà7ÇË'N'�ŸÀ^ÄÅË˜û,pÐ}ãÇ€·#v±d©Ö5Ïú…È€W ËÚ-œdHõBõi`¸¡v”+wä�\’SrKŽ{z…Ïù5Ì‚*xsia�c_A+ÕÊ—X�Ò,ã-lH®Ò½ü™ûŽÊM¯�Â›lþ²‹²eÑÉ^Ú€{ÕÃñnçªup]‚©ä=Øv¾å�qÀXÎï¹ÍÌ¸�¶<ï£<4ÀÄ�‡äF=zÓ^×Ó³1˜_ûÜë˜¢Yå=‰÷îéÔ·†:è9ÂÓ û`€2pWT\ÌYP%(ý¹%Ç=½Çøtîw¾ó�ŸbîšÃ›K
ò»æÓ ¬¼J–ƒHÓàg'Œ€¦kj9õªU9åò—©sÔcbþÍÛåÚçß�w#vÊfÄå «NÂ† ]x-ˆÏÒõÂÓº?”Åsž÷:‰CïâÂoÜÖ�1¿%c‘’|Îž¦c{ãIÿ•â›ZÀÐ¦:§:Å†d£o¾¥s®çyà8ƒóv“CüžQ9%·ä¸§WQzáÝÆ~È^‰×ìbysq~~÷ñüc  ÞŒF‘ºâ/	Ê­Ôî=1j¯xéMy!dƒÆý9Ø˜ûÓ¤™:3š¸q»l©jA�ªˆ!Ð¬—[.Oæœ_�l†ÏZ–:ÝV…÷†¼8R& '@žg�áÎ+{
õ áÞžmà­g®'È9"WäŒÜ1Š�Krú³Ÿý¬9îé; ½{ì±ï {~*fo.ÊÏ³'äÉÒS30ç�`VZ­y%,¯RþúÁ<�v~ŸÍ�UW¯ó°@»ûÝj„QxL¹¹¬�±›Fó$ž°NwyLO#òÕƒ	^Ó}žo¢¼ÏçÃ%�4€^Ó”Ä¹Œ)a¼{™Ñ�$ý�ÞŸƒ€xpFîŠáÄäœ^HnÉ±­‡Ãoöž‡ô<üºIPaQ‘äåÙÓò
$‚Y+´1óÙPiâ=9ð4ì<Î>/7còÄ’$^¯eW°ë«îCL¿ž½Ã?D6æWê¦ÙÒìr˜�†Ô�äí±Î²†0ÈÀ6øŽÐ cdö±dí=ËrTN/Ç!>£·»teªð"Ÿ\¥å(wä�\’Ó'žx‚Üúœž}X(°Ð9���cð}ÉC%¹yy²&·B–²1ox
”ChÞ2@¹nˆ½¹n‹Üðâ›˜�Bðù¯*„”!Ä7¹@_!¹aâá$8.]"*še©UŸz¤”ÄÓ\3Â5Á0¾ÒþÇžNOyþÔrh:f{êÆ6ôzŽÑÑÀ[grD®òòó•»|¤x-e9%·äØÖÓ�·!Îea<B{óW­¨0/W¢rK% Â²!oÀò€÷y¬¨ÿÅ>Ë ¬4'dëF]`V…ËÃX†¤,Í*×Au ¦¨·¾=Q¦oÛ/QI¡E,_®FóŒ»•„÷9¦.B²ÊäÞI3äî‰Óù°Ÿ½Ä½ƒô
-·šÏÐ;T¶¥äöŒ ãlä†‘+r¦Ü‘CrIN•Û3øM6}üƒüàw‰‰‰•yèJ…¹9ŽOrŠÄ_­èY …!?Ê¯…b�Ï÷—!˜»/:xR"—‹ê@x…éº	9S¹mÔ$€óÔÂ¥²2!S"ÑZh8î^zºÞh!öž†Ž'Ãæp&eÉÊrJ¾>+Ï+— “É²,&U"
«aôZ\S£»t±ô2Ÿ½¸¨PŽÈ9#wä�\’SåöLÇÅ_Ü¿£v>²W`ð8�Ï0”�Ý��“ÏMÃÙ&ÁÌyU`%ÛÀèTùÓ„ir3æÿœ‹ÿeÊ‡âûi<\°ŒÇ½òóÑå#×#$ÝŠÕîÄð­ž‹—mË›�M�0ä{�u­ätsÿq„¿‘œ}é“° ½WåÑuúôíô�0Q¾G—Åep¢À2Ô¥'°.CÅƒ«üœìnrwðàÁä’œ’Û3 ¼HD|ßŸ…8ÆndÏÎÉ‘ÕÙXX�¢­Ï
=o@ïÄ#È?sŸäÿ<Oú… ?ZþˆíƒÀä\’‰²å÷.E¯Ñ©$<tôæ}ºÕpL÷a¶4mË^Ùˆ¸ÁU/Ê€Ì¥ÀgõLžÃx3oØxá¾´«=LIØãü²äNô¶[0@÷_‰§fA˜*¿%�:[‚±M¤Žatö„Ñ™¬É)r•ÎÈ¾Ü8‹\’Sr{FpŒ8p`?vüšàCXÅ9rrs¥ '[ö0q�roÜK°r¦T^Ÿ½¾·ëˆzßÓ¡l=\yyU„x~„ŒŠØ¥ðÒÌ2·ú”*Î”38ŸÃ¢k0V¾X¹¢Í’©Q{dmF¡lB�c¸? õfêý.9BPÏÃ3?’¡â2¹¾Àù2Yë‰ÉÁõ�åõ5[øÜ—SWu’�/�”©û�1„QO½õ%'~ödI~v–�Üá·%"—ä”Ü~.\tÑE}ñ-¿ññÇG�M¡%s³²ºã³s=”cê%Ÿƒ�zÛ˜¨½ªàø�;d#¿6LÃS±kŸ}M^_EX–a�÷“]3„g—HÒ šùU¨«Vß {Ê%1Vï¿kôdysÅ:Yz<Q"0u�ÄÖôšâ:� Ìj@z–ÜˆAý¾)³éùj$ÿŒRñK+ÖÕðˆ5QrêúpßQ}ÿ4ÛÜï@®ëŸ!¶B ¦úžäˆ\‘3rGÉ%958sê}ë­·Ò â+©srr¹¡dÏÉÊ’õ &€W²o!xŽBsžÎÆ[rî?U>:pLüÇ $}RÞâÃ†ö €©®`gŽ“;1zÛÝÓ a4ëc\žs"U^ÀsÛ;ÇLÑq#b÷_Ñ+F¯Ž¿#1èYT#›Ñ;Â±Ò�€=Ÿ9sÖóÍgÔ·“‚<ÛƒMŠÜ©qÿ!l‘ø�“yû>•?¢Þ!èmó¢ÓtÆ¤ò}¦¾æ39!7äˆ\å"j�;rH.É©íó½{÷öÁ²™ë�}ôÑ?a_¨-Ó©ÜÌÇ¡¬<YÂ™ˆ
cDxæ]¤½ÆU(ÂÐ ìûÜ€X< x~ùZÎÁ-ïr7Z¿ñ¢«Ö¿aå¼2·’3)×õÀI!‹“òÐÃöÉ£¬‡ŒÏ^¡õßñÎDy|ÖB¼V&Gl—Å‡¢An¼ø"å,ìƒ­ûä�Uá2læŒçÔƒà tÊGÜˆ1`äúmœ1Q—NLÊ×5pBnÈ¹"gäŽ’KrúE’¦ï¯~õ«‹�ýþÎ�;wÑ¢Ø!íÎÈÌÔýü ÆZ
à„ÌKPN3'ï9&O†"„¬’‰1KaHðº×š§ëèFmîÁh…½À£Á�–1šõÏ�É”±[ö#~¯�{°¿tˆýõÓ¯ÈïžyU®µ€PƒÁ@Êó\?„·%Æ£§ñyÁS«ðMË0yÿ	ÊàNôióä€rBnÈ¹g»É9$—_€z3úùÏ~»Ðˆ#žÀ·d´�œŒt9�‰^@¨÷ž(C²ô!ÀT§wÞ÷Zä–èõwwÒ±cø‚ 	Ã=ŒÛÞeËœá‰ÓQë	Êbæå‹ß’É2=äÕÐH†,È_Y/o¬Û*“vAˆI§­G‹*›+Ï:-ù	ï¼1 "B99!7Ê¹"gäŽö0ûé9õíÛ÷ìŽ~¯Á�›ÊùÇÈÞ�–‘!¡ Š–2‚9É6y÷ó%J¹wïUÞ€ŸuPÆæÝ|íóœPrÒqßië/eýJ¾ádŠŒX*KSùš
ï7¯ÎX$³ç°ý #ÁzLýg@ @.È	¹áì‡\‘3rG{?=Ïˆzÿâ¿à`|~çyX�d8²ÓÓäHz¶øÂTo2õz�eøÙ ÌE	âô�/Œ”ßû��¹ø"Qžõ›:IœÎ~Â²Kå/“gÈ¯ž|áä¸,Çª×?­˜4°Hü§ä/%à"G²À	¹!GãÇ�žœ‘;rh;ÛÃGŸ>}ÎÅRú|ü!võ>æÞ±g¦¥ÉFÌ6ü¼…ôDÁüi „žåIãðpìžþö©—å¼µ°SÌ%ézÍ´iÝÏsK€�%uòjà*ùîá”•^®Ý“<g!?Ë.�îä€\�rCŽÈŽKÈ]›oŸJzÕUW±|/ý?óÞ’Îî–šêˆKË� í¶ž›üÙƒÊ0ä›œ/÷cP½ƒæ;+Ã%²˜ƒn…Îã—XðK-Ö•j$Èºƒì«r/îÁ½¬ƒÆñªßC¾³�Ÿ:S÷¸Ôtp‘â€÷¹!GäŠœéÔóŸ=¬øuFóK‘^Ž7|—dÂ É))öÌÔ9�–%Kè….áNU¶ÄÞ×½ËRAÆs®s1ï¿kÌ{r-f5/ø.“°ä\�]Ï_G!4¿:5O^ôælGËÎ9žÂ{ù6öéêïAžžå§®~eª;9 àÜøóDrEÎ` ãýÿl/À3ÍóaŒKñÚâuø©Fö™’”œÜ�‘’,Qiyâ�–zKOöäÎ§)c7·yÕ`±õÛá/ÉíØÙ|ÅßŽ‰Ú-Ó±%ñBÎíØjø-bþïÍ"ùVÜ/:cý„!úÌòóœ/òÔ™º“rANÈ9"Wêý_ÖaÅ±¾W^y%gD—âÉÎãøÙšv|™GrrŠ„¥Š�Ç%O/"¼ËH¤îµ,ÁŒæ••åŽQ“´7üæÉÍßŽ÷z^^Î/à1ÑpŸ·~æz�?€ŽÔ•^/)Ðð™o;ž$>Nn,ŽúzÅþ/!q.Ûï§?ýéeÜ^Åï LÇÀCt§&'I|Jª¬H/â@¨Fð&½Ø ‡ó§É[Þ¬‹4Yœ˜+“°p‰ùü›X±2¿(!‡{@,Ã²_´þ3‚:ù!ùñp¸Ôäd¡›à—Ä¦“‹›~ÊÕWpø°[Á°çc„ï�Ïÿ½víÚ­˜ûJBb’�Fˆ†–¹áóÀL?GÙ"~�Õµð
q>ˆçƒœÃ5”é±þ³u¡NÔídrªP×Ä¤$;u'ä‚œ�rD®€¯äÐP„¿Ár1â],2®Ã�—û‡í©I‰r<F Q~4‚!Ã‹„Âóœ7yæ=œáHá¯(â¹/©~ÏòÔ�ºP'ê–š˜(		‰J>~®ÿ¦š×]xá…ýÉ	¹ù
É7[á±½z	,ÞÓ­Á»víJKG,ŒOH°SÀ“I)’Z ¾i0‰”¤„’hÀÏÞç<òÖý_aý”ÝiHZ�œ€Nt°x‹|èœŠx?tô'äÄsËá«7B?üc^|óã�øBr>¤8!91Ab“$4%_»HRåÎg¾÷K®?ÀeÅô6º$'$¨ƒQGêJ�©»ÅA¿ùfPÆÁ†/ÇÁ]?¼rw7v Ó8(á­íI	ñ’ ¡#“³Õ‹–P)†
…QÖä	sÝáUþÌ÷ž}ý”‘²RfÊ®:P—8èDÝ¨#žïÞM�-Ýû)ÿŽFïƒä¼Ë.»Œ‚ô¿úê«‡DFFžp!!>Þ‘'{Ó$±zqj±1‚Y…
Í›¸þÙPÂ¼`î9Ëúêõ*ëÞ¤4x}<ôˆsÐó©uCÈB]©3uWþ�‡�»ð=¨+1Ý€ŸgÙ�×180wÇÆÅuÓÇe{”ôSeK<Èàg…WÞƒhSÆ\3è©~ÊA™(dÌQY“âc…²CB¨u£Žîä›A÷ßk„Þ³�Ë®Â�üÏð·gã�h¶a� 1P$>.Ö‘+û0@sl !N%+å”Ïæœwyï¼~&z¬Ÿ ”2å©l‰qqBYcbc»ñV³PêB�0è^E©«×tókb„~ç�wÞ÷ðâW#õƒ>øäŽ;r©ºq7•JŒ�¥AdgBª„$çªò¾)E¢ä(œä05PbÍù³�ÖoÝï°íàä<ÙYbbã$16F(#e¥Ì”�:PêDÝ¨£!ÿkvX{ßçBÀ‹á-WãóUè²·Ì›7o9Þh¥R±PK÷î(K¥wÇ§HhRŽ’²ˆÆ°È÷7ð$�yoœæšg¾lÃ2vhR®ìBÛ \‰�…Lr #~	½?¼ºk�[¨u¡NÔMuüš½ ä9H/À·Â¯@¼do¸ß‘¶nÝºOñ­qAL¥âä»ã££q àp\‚lNH—ÃýœEôPËSýœd2M6¤zÊœóSÂµ‚çÙãÐFšB[q11­2PÊDÙ(#¾Ç5Œ2Svê@],�zßˆÃ‡Î8.aìÄƒiŽ¿Â�€¿�¯8�£›S<x��„Øè“0ÆI‰1cd[|ª¬MÌ”å0H öõ5d�Ìž�¬`YÞÃ{Y‡Öu¤³n¶Á¶Ø&ÛN ñ”2‡l#(#e¥Ì”�:P9ß°ÃÇ½7àçï/§Gaé®†À+/ã'ßâ�At`ÊÊœà‹$}òdwÌÉÝñ'O8âh�è9'Ã(»â’eÈŒŒO“pô–	Š�Èã¯±Ê&ò½—u°®XÔMÄà\|‚°M¶½fÍšƒøS$/S&ÊF)«»×÷@þ7ª7ôCzþìI(ø_–!~�o>Šx»¿8ž…q¢O•HÆ
%ÐqòäI{4<4æÄñîXq Ô…±0¯³l4òz/B==ŽFFÊ6ØÛdÛ”�²P&ÊF)«ñúÿœƒž¤¯¾SIüí•+°�ü/|¾
Ÿ¯>ðÀOã—f—0`¹_‹¿+ïÀ€-�L9vx ˜ÏîdóÞÿ×Þ¤&Da˜ÒŠ �’B”,²êÆ�{W¥+Ákô*½AîÐƒz/à\¸óû†)	77é<x8dÞüïù¿É03�bñv‹_±õ¡/}êÛŒÅ˜ŒÍC¬#•‡N"ìeÓ<Ïú;[
É`U/1kˆyg˜úäíÛ_MÓ|sÌï‡�×›`G	å	Ô‰ãógÕ²×¬ã�³ÚÚÆ¶bˆ%fÄ¾Ø>^éÛŒ¥%žÿ‰øeÃ´�0¼0ã( fÉpàÌI]ÅÏ}C7l�o*>ø±ÃŽ#{Õ²×¬Ó&ÚÖ]1ÅÖ‡¾ô}?èñ£¼+²¿d0çž²ìŸ³ÓøZUUéR!ÌJÚÄô5Ôi£mlSŠ!–˜-éúŠ½=I?±W>E²ž%Î¡‚>ƒÌœ!dŽ.X(µì5ë´ÑÖ6¶C,1éÃÒMŠšIèÍ´é’�¿£$‚“Ü,}FÓ]LÆ…    IEND®B`‚<?xml version="1.0" encoding="utf-8"?>
<!--suppress XmlUnusedNamespaceDeclaration -->
<Package
   xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
   xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
   xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
   xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities">
  <!-- use single quotes to avoid double quotes escaping in the publisher value  -->
  <Identity Name="${identityName}"
    ProcessorArchitecture="${arch}"
    Publisher='${publisher}'
    Version="${version}" />
  <Properties>
    <DisplayName>${displayName}</DisplayName>
    <PublisherDisplayName>${publisherDisplayName}</PublisherDisplayName>
    <Description>${description}</Description>
    <Logo>${logo}</Logo>
  </Properties>
  <Resources>
    ${resourceLanguages}
  </Resources>
  <Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14316.0" MaxVersionTested="10.0.14316.0" />
  </Dependencies>
  <Capabilities>
    <rescap:Capability Name="runFullTrust"/>
  </Capabilities>
  <Applications>
    <Application Id="${applicationId}" Executable="${executable}" EntryPoint="Windows.FullTrustApplication">
      <uap:VisualElements
       BackgroundColor="${backgroundColor}"
       DisplayName="${displayName}"
       Square150x150Logo="${square150x150Logo}"
       Square44x44Logo="${square44x44Logo}"
       Description="${description}">
        ${lockScreen}
        ${defaultTile}
        ${splashScreen}
      </uap:VisualElements>
      ${extensions}
    </Application>
  </Applications>
</Package>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<resources targetOsVersion="10.0.0" majorVersion="1">
	<packaging>
		<autoResourcePackage qualifier="Language"/>
		<autoResourcePackage qualifier="Scale"/>
		<autoResourcePackage qualifier="DXFeatureLevel"/>
	</packaging>
	<index root="\" startIndexAt="\">
		<default>
			<qualifier name="Language" value="en-US"/>
			<qualifier name="Contrast" value="standard"/>
			<qualifier name="Scale" value="100"/>
			<qualifier name="HomeRegion" value="001"/>
			<qualifier name="TargetSize" value="256"/>
			<qualifier name="LayoutDirection" value="LTR"/>
			<qualifier name="Theme" value="dark"/>
			<qualifier name="AlternateForm" value=""/>
			<qualifier name="DXFeatureLevel" value="DX9"/>
			<qualifier name="Configuration" value=""/>
			<qualifier name="DeviceFamily" value="Universal"/>
			<qualifier name="Custom" value=""/>
		</default>
		<indexer-config type="folder" foldernameAsQualifier="true" filenameAsQualifier="true" qualifierDelimiter="."/>
		<indexer-config type="resw" convertDotsToSlashes="true" initialPath=""/>
		<indexer-config type="resjson" initialPath=""/>
		<indexer-config type="PRI"/>
	</index>
</resources>"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isElectronBased = isElectronBased;

function isElectronBased(framework) {
  return framework.name === "electron";
} 
// __ts-babel@6.0.4
//# sourceMappingURL=Framework.js.map{"version":3,"sources":["../src/Framework.ts"],"names":[],"mappings":";;;;;;;AAmDM,SAAU,eAAV,CAA0B,SAA1B,EAA8C;AAClD,SAAO,SAAS,CAAC,IAAV,KAAmB,UAA1B;AACD,C","sourcesContent":["import { FileTransformer } from \"builder-util/out/fs\"\nimport { AsarIntegrity } from \"./asar/integrity\"\nimport { Platform, PlatformPackager, ElectronPlatformName, AfterPackContext } from \"./index\"\n\nexport interface Framework {\n  readonly name: string\n  readonly version: string\n  readonly distMacOsAppName: string\n  readonly macOsDefaultTargets: Array<string>\n  readonly defaultAppIdPrefix: string\n\n  readonly isNpmRebuildRequired: boolean\n\n  readonly isCopyElevateHelper: boolean\n\n  getDefaultIcon?(platform: Platform): string | null\n\n  getMainFile?(platform: Platform): string | null\n\n  getExcludedDependencies?(platform: Platform): Array<string> | null\n\n  prepareApplicationStageDirectory(options: PrepareApplicationStageDirectoryOptions): Promise<any>\n\n  beforeCopyExtraFiles?(options: BeforeCopyExtraFilesOptions): Promise<any>\n\n  afterPack?(context: AfterPackContext): Promise<any>\n\n  createTransformer?(): FileTransformer | null\n}\n\nexport interface BeforeCopyExtraFilesOptions {\n  packager: PlatformPackager<any>\n  appOutDir: string\n\n  asarIntegrity: AsarIntegrity | null\n\n  // ElectronPlatformName\n  platformName: string\n}\n\nexport interface PrepareApplicationStageDirectoryOptions {\n  readonly packager: PlatformPackager<any>\n  /**\n   * Platform doesn't process application output directory in any way. Unpack implementation must create or empty dir if need.\n   */\n  readonly appOutDir: string\n  readonly platformName: ElectronPlatformName\n  readonly arch: string\n  readonly version: string\n}\n\nexport function isElectronBased(framework: Framework) {\n  return framework.name === \"electron\"\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ProtonFramework = void 0;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("./core");

  _core = function () {
    return data;
  };

  return data;
}

function _fileTransformer() {
  const data = require("./fileTransformer");

  _fileTransformer = function () {
    return data;
  };

  return data;
}

function _LibUiFramework() {
  const data = require("./frameworks/LibUiFramework");

  _LibUiFramework = function () {
    return data;
  };

  return data;
}

function _pathManager() {
  const data = require("./util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

class ProtonFramework extends _LibUiFramework().LibUiFramework {
  constructor(version, distMacOsAppName, isUseLaunchUi) {
    super(version, distMacOsAppName, isUseLaunchUi);
    this.name = "proton"; // noinspection JSUnusedGlobalSymbols

    this.defaultAppIdPrefix = "com.proton-native.";
  }

  getDefaultIcon(platform) {
    if (platform === _core().Platform.WINDOWS) {
      return (0, _pathManager().getTemplatePath)("icons/proton-native/proton-native.ico");
    } else if (platform === _core().Platform.LINUX) {
      return (0, _pathManager().getTemplatePath)("icons/proton-native/linux");
    } else {
      return (0, _pathManager().getTemplatePath)("icons/proton-native/proton-native.icns");
    }
  }

  createTransformer() {
    let babel;
    const babelOptions = {
      ast: false,
      sourceMaps: "inline"
    };

    if (process.env.TEST_SET_BABEL_PRESET === "true") {
      babel = require("@babel/core");
      babel = testOnlyBabel(babel, babelOptions, this.version);
    } else {
      try {
        babel = require("babel-core");
      } catch (e) {
        // babel isn't installed
        _builderUtil().log.debug(null, "don't transpile source code using Babel");

        return null;
      }
    }

    _builderUtil().log.info({
      options: (0, _builderUtilRuntime().safeStringifyJson)(babelOptions, new Set(["presets"]))
    }, "transpile source code using Babel");

    return file => {
      if (!(file.endsWith(".js") || file.endsWith(".jsx")) || file.includes(_fileTransformer().NODE_MODULES_PATTERN)) {
        return null;
      }

      return new Promise((resolve, reject) => {
        return babel.transformFile(file, babelOptions, (error, result) => {
          if (error == null) {
            resolve(result.code);
          } else {
            reject(error);
          }
        });
      });
    };
  }

}

exports.ProtonFramework = ProtonFramework;

function testOnlyBabel(babel, babelOptions, nodeVersion) {
  // out test dir can be located outside of electron-builder node_modules and babel cannot resolve string names of preset
  babelOptions.presets = [[require("@babel/preset-env").default, {
    targets: {
      node: nodeVersion
    }
  }], require("@babel/preset-react")];
  babelOptions.plugins = [// stage 0
  require("@babel/plugin-proposal-function-bind").default, // stage 1
  require("@babel/plugin-proposal-export-default-from").default, require("@babel/plugin-proposal-logical-assignment-operators").default, [require("@babel/plugin-proposal-optional-chaining").default, {
    loose: false
  }], [require("@babel/plugin-proposal-pipeline-operator").default, {
    proposal: "minimal"
  }], [require("@babel/plugin-proposal-nullish-coalescing-operator").default, {
    loose: false
  }], require("@babel/plugin-proposal-do-expressions").default, // stage 2
  [require("@babel/plugin-proposal-decorators").default, {
    legacy: true
  }], require("@babel/plugin-proposal-function-sent").default, require("@babel/plugin-proposal-export-namespace-from").default, require("@babel/plugin-proposal-numeric-separator").default, require("@babel/plugin-proposal-throw-expressions").default, // stage 3
  require("@babel/plugin-syntax-dynamic-import").default, require("@babel/plugin-syntax-import-meta").default, [require("@babel/plugin-proposal-class-properties").default, {
    loose: false
  }], require("@babel/plugin-proposal-json-strings").default];
  babelOptions.babelrc = false;
  return babel;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=ProtonFramework.js.map{"version":3,"sources":["../src/ProtonFramework.ts"],"names":[],"mappings":"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","sourcesContent":["import { FileTransformer } from \"builder-util/out/fs\"\nimport { log } from \"builder-util\"\nimport { safeStringifyJson } from \"builder-util-runtime\"\nimport { Platform } from \"./core\"\nimport { NODE_MODULES_PATTERN } from \"./fileTransformer\"\nimport { LibUiFramework } from \"./frameworks/LibUiFramework\"\nimport { getTemplatePath } from \"./util/pathManager\"\n\nexport class ProtonFramework extends LibUiFramework {\n  readonly name = \"proton\"\n\n  // noinspection JSUnusedGlobalSymbols\n  readonly defaultAppIdPrefix = \"com.proton-native.\"\n\n  constructor(version: string, distMacOsAppName: string, isUseLaunchUi: boolean) {\n    super(version, distMacOsAppName, isUseLaunchUi)\n  }\n\n  getDefaultIcon(platform: Platform) {\n    if (platform === Platform.WINDOWS) {\n      return getTemplatePath(\"icons/proton-native/proton-native.ico\")\n    }\n    else if (platform === Platform.LINUX) {\n      return getTemplatePath(\"icons/proton-native/linux\")\n    }\n    else {\n      return getTemplatePath(\"icons/proton-native/proton-native.icns\")\n    }\n  }\n\n  createTransformer(): FileTransformer | null {\n    let babel: any\n    const babelOptions: any = {ast: false, sourceMaps: \"inline\"}\n    if (process.env.TEST_SET_BABEL_PRESET === \"true\") {\n      babel = require(\"@babel/core\")\n      babel = testOnlyBabel(babel, babelOptions, this.version)\n    }\n    else {\n      try {\n        babel = require(\"babel-core\")\n      }\n      catch (e) {\n        // babel isn't installed\n        log.debug(null, \"don't transpile source code using Babel\")\n        return null\n      }\n    }\n\n    log.info({options: safeStringifyJson(babelOptions, new Set<string>([\"presets\"]))}, \"transpile source code using Babel\")\n    return file => {\n      if (!(file.endsWith(\".js\") || file.endsWith(\".jsx\")) || file.includes(NODE_MODULES_PATTERN)) {\n        return null\n      }\n\n      return new Promise((resolve, reject) => {\n        return babel.transformFile(file, babelOptions, (error: Error, result: any) => {\n          if (error == null) {\n            resolve(result.code)\n          }\n          else {\n            reject(error)\n          }\n        })\n      })\n    }\n  }\n}\n\nfunction testOnlyBabel(babel: any, babelOptions: any, nodeVersion: string) {\n  // out test dir can be located outside of electron-builder node_modules and babel cannot resolve string names of preset\n  babelOptions.presets = [\n    [require(\"@babel/preset-env\").default, {targets: {node: nodeVersion}}],\n    require(\"@babel/preset-react\"),\n  ]\n  babelOptions.plugins = [\n    // stage 0\n    require(\"@babel/plugin-proposal-function-bind\").default,\n\n    // stage 1\n    require(\"@babel/plugin-proposal-export-default-from\").default,\n    require(\"@babel/plugin-proposal-logical-assignment-operators\").default,\n    [require(\"@babel/plugin-proposal-optional-chaining\").default, {loose: false}],\n    [require(\"@babel/plugin-proposal-pipeline-operator\").default, {proposal: \"minimal\"}],\n    [require(\"@babel/plugin-proposal-nullish-coalescing-operator\").default, {loose: false}],\n    require(\"@babel/plugin-proposal-do-expressions\").default,\n\n    // stage 2\n    [require(\"@babel/plugin-proposal-decorators\").default, {legacy: true}],\n    require(\"@babel/plugin-proposal-function-sent\").default,\n    require(\"@babel/plugin-proposal-export-namespace-from\").default,\n    require(\"@babel/plugin-proposal-numeric-separator\").default,\n    require(\"@babel/plugin-proposal-throw-expressions\").default,\n\n    // stage 3\n    require(\"@babel/plugin-syntax-dynamic-import\").default,\n    require(\"@babel/plugin-syntax-import-meta\").default,\n    [require(\"@babel/plugin-proposal-class-properties\").default, {loose: false}],\n    require(\"@babel/plugin-proposal-json-strings\").default,\n  ]\n  babelOptions.babelrc = false\n  return babel\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.filterCFBundleIdentifier = filterCFBundleIdentifier;
exports.smarten = smarten;
exports.AppInfo = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _sanitizeFilename() {
  const data = _interopRequireDefault(require("sanitize-filename"));

  _sanitizeFilename = function () {
    return data;
  };

  return data;
}

function _semver() {
  const data = require("semver");

  _semver = function () {
    return data;
  };

  return data;
}

function _macroExpander() {
  const data = require("./util/macroExpander");

  _macroExpander = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

class AppInfo {
  constructor(info, buildVersion, platformSpecificOptions = null) {
    this.info = info;
    this.platformSpecificOptions = platformSpecificOptions;
    this.description = smarten(this.info.metadata.description || "");
    this.version = info.metadata.version;

    if (buildVersion == null) {
      buildVersion = info.config.buildVersion;
    }

    this.buildNumber = process.env.BUILD_NUMBER || process.env.TRAVIS_BUILD_NUMBER || process.env.APPVEYOR_BUILD_NUMBER || process.env.CIRCLE_BUILD_NUM || process.env.BUILD_BUILDNUMBER || process.env.CI_PIPELINE_IID;

    if (buildVersion == null) {
      buildVersion = this.version;

      if (!(0, _builderUtil().isEmptyOrSpaces)(this.buildNumber)) {
        buildVersion += `.${this.buildNumber}`;
      }
    }

    this.buildVersion = buildVersion;
    this.productName = info.config.productName || info.metadata.productName || info.metadata.name;
    this.productFilename = (0, _sanitizeFilename().default)(this.productName);
  }

  get channel() {
    const prereleaseInfo = (0, _semver().prerelease)(this.version);

    if (prereleaseInfo != null && prereleaseInfo.length > 0) {
      return prereleaseInfo[0];
    }

    return null;
  }

  getVersionInWeirdWindowsForm(isSetBuildNumber = true) {
    const parsedVersion = new (_semver().SemVer)(this.version); // https://github.com/electron-userland/electron-builder/issues/2635#issuecomment-371792272

    let buildNumber = isSetBuildNumber ? this.buildNumber : null;

    if (buildNumber == null || !/^\d+$/.test(buildNumber)) {
      buildNumber = "0";
    }

    return `${parsedVersion.major}.${parsedVersion.minor}.${parsedVersion.patch}.${buildNumber}`;
  }

  get notNullDevMetadata() {
    return this.info.devMetadata || {};
  }

  get companyName() {
    const author = this.info.metadata.author || this.notNullDevMetadata.author;
    return author == null ? null : author.name;
  }

  get id() {
    let appId = null;

    for (const options of [this.platformSpecificOptions, this.info.config]) {
      if (options != null && appId == null) {
        appId = options.appId;
      }
    }

    const generateDefaultAppId = () => {
      const info = this.info;
      return `${info.framework.defaultAppIdPrefix}${info.metadata.name.toLowerCase()}`;
    };

    if (appId != null && (appId === "your.id" || (0, _builderUtil().isEmptyOrSpaces)(appId))) {
      const incorrectAppId = appId;
      appId = generateDefaultAppId();

      _builderUtil().log.warn(`do not use "${incorrectAppId}" as appId, "${appId}" will be used instead`);
    }

    return appId == null ? generateDefaultAppId() : appId;
  }

  get macBundleIdentifier() {
    return filterCFBundleIdentifier(this.id);
  }

  get name() {
    return this.info.metadata.name;
  }

  get linuxPackageName() {
    const name = this.name; // https://github.com/electron-userland/electron-builder/issues/2963

    return name.startsWith("@") ? this.productFilename : name;
  }

  get sanitizedName() {
    return (0, _sanitizeFilename().default)(this.name);
  }

  get updaterCacheDirName() {
    return this.sanitizedName.toLowerCase() + "-updater";
  }

  get copyright() {
    const copyright = this.info.config.copyright;

    if (copyright != null) {
      return (0, _macroExpander().expandMacro)(copyright, null, this);
    }

    return `Copyright Â© ${new Date().getFullYear()} ${this.companyName || this.productName}`;
  }

  computePackageUrl() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const url = _this.info.metadata.homepage || _this.notNullDevMetadata.homepage;

      if (url != null) {
        return url;
      }

      const info = yield _this.info.repositoryInfo;
      return info == null || info.type !== "github" ? null : `https://${info.domain}/${info.user}/${info.project}`;
    })();
  }

}
/** @internal */


exports.AppInfo = AppInfo;

function filterCFBundleIdentifier(identifier) {
  // Remove special characters and allow only alphanumeric (A-Z,a-z,0-9), hyphen (-), and period (.)
  // Apple documentation: https://developer.apple.com/library/mac/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070
  return identifier.replace(/ /g, "-").replace(/[^a-zA-Z0-9.-]/g, "");
} // fpm bug - rpm build --description is not escaped, well... decided to replace quite to smart quote
// http://leancrew.com/all-this/2010/11/smart-quotes-in-javascript/


function smarten(s) {
  // opening singles
  s = s.replace(/(^|[-\u2014\s(\["])'/g, "$1\u2018"); // closing singles & apostrophes

  s = s.replace(/'/g, "\u2019"); // opening doubles

  s = s.replace(/(^|[-\u2014/\[(\u2018\s])"/g, "$1\u201c"); // closing doubles

  s = s.replace(/"/g, "\u201d");
  return s;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=appInfo.js.map{"version":3,"sources":["../src/appInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEmptyOrSpaces, log } from \"builder-util\"\nimport sanitizeFileName from \"sanitize-filename\"\nimport { prerelease, SemVer } from \"semver\"\nimport { PlatformSpecificBuildOptions } from \"./options/PlatformSpecificBuildOptions\"\nimport { Packager } from \"./packager\"\nimport { expandMacro } from \"./util/macroExpander\"\n\nexport class AppInfo {\n  readonly description = smarten(this.info.metadata.description || \"\")\n  readonly version: string\n\n  readonly buildNumber: string | undefined\n  readonly buildVersion: string\n\n  readonly productName: string\n  readonly productFilename: string\n\n  constructor(private readonly info: Packager, buildVersion: string | null | undefined, private readonly platformSpecificOptions: PlatformSpecificBuildOptions | null = null) {\n    this.version = info.metadata.version!!\n\n    if (buildVersion == null) {\n      buildVersion = info.config.buildVersion\n    }\n\n    this.buildNumber = process.env.BUILD_NUMBER || process.env.TRAVIS_BUILD_NUMBER || process.env.APPVEYOR_BUILD_NUMBER || process.env.CIRCLE_BUILD_NUM || process.env.BUILD_BUILDNUMBER || process.env.CI_PIPELINE_IID\n    if (buildVersion == null) {\n      buildVersion = this.version\n      if (!isEmptyOrSpaces(this.buildNumber)) {\n        buildVersion += `.${this.buildNumber}`\n      }\n    }\n    this.buildVersion = buildVersion\n\n    this.productName = info.config.productName || info.metadata.productName || info.metadata.name!!\n    this.productFilename = sanitizeFileName(this.productName)\n  }\n\n  get channel(): string | null {\n    const prereleaseInfo = prerelease(this.version)\n    if (prereleaseInfo != null && prereleaseInfo.length > 0) {\n      return prereleaseInfo[0]\n    }\n    return null\n  }\n\n  getVersionInWeirdWindowsForm(isSetBuildNumber = true): string {\n    const parsedVersion = new SemVer(this.version)\n    // https://github.com/electron-userland/electron-builder/issues/2635#issuecomment-371792272\n    let buildNumber = isSetBuildNumber ? this.buildNumber : null\n    if (buildNumber == null || !/^\\d+$/.test(buildNumber)) {\n      buildNumber = \"0\"\n    }\n    return `${parsedVersion.major}.${parsedVersion.minor}.${parsedVersion.patch}.${buildNumber}`\n  }\n\n  private get notNullDevMetadata() {\n    return this.info.devMetadata || {}\n  }\n\n  get companyName(): string | null {\n    const author = this.info.metadata.author || this.notNullDevMetadata.author\n    return author == null ? null : author.name\n  }\n\n  get id(): string {\n    let appId: string | null | undefined = null\n    for (const options of [this.platformSpecificOptions, this.info.config]) {\n      if (options != null && appId == null) {\n        appId = options.appId\n      }\n    }\n\n    const generateDefaultAppId = () => {\n      const info = this.info\n      return `${info.framework.defaultAppIdPrefix}${info.metadata.name!.toLowerCase()}`\n    }\n\n    if (appId != null && (appId === \"your.id\" || isEmptyOrSpaces(appId))) {\n      const incorrectAppId = appId\n      appId = generateDefaultAppId()\n      log.warn(`do not use \"${incorrectAppId}\" as appId, \"${appId}\" will be used instead`)\n    }\n\n    return appId == null ? generateDefaultAppId() : appId\n  }\n\n  get macBundleIdentifier(): string {\n    return filterCFBundleIdentifier(this.id)\n  }\n\n  get name(): string {\n    return this.info.metadata.name!!\n  }\n\n  get linuxPackageName(): string {\n    const name = this.name\n    // https://github.com/electron-userland/electron-builder/issues/2963\n    return name.startsWith(\"@\") ? this.productFilename : name\n  }\n\n  get sanitizedName(): string {\n    return sanitizeFileName(this.name)\n  }\n\n  get updaterCacheDirName(): string {\n    return this.sanitizedName.toLowerCase() + \"-updater\"\n  }\n\n  get copyright(): string {\n    const copyright = this.info.config.copyright\n    if (copyright != null) {\n      return expandMacro(copyright, null, this)\n    }\n    return `Copyright Â© ${new Date().getFullYear()} ${this.companyName || this.productName}`\n  }\n\n  async computePackageUrl(): Promise<string | null> {\n    const url = this.info.metadata.homepage || this.notNullDevMetadata.homepage\n    if (url != null) {\n      return url\n    }\n\n    const info = await this.info.repositoryInfo\n    return info == null || info.type !== \"github\"  ? null : `https://${info.domain}/${info.user}/${info.project}`\n  }\n}\n\n/** @internal */\nexport function filterCFBundleIdentifier(identifier: string) {\n  // Remove special characters and allow only alphanumeric (A-Z,a-z,0-9), hyphen (-), and period (.)\n  // Apple documentation: https://developer.apple.com/library/mac/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070\n  return identifier.replace(/ /g, \"-\").replace(/[^a-zA-Z0-9.-]/g, \"\")\n}\n\n// fpm bug - rpm build --description is not escaped, well... decided to replace quite to smart quote\n// http://leancrew.com/all-this/2010/11/smart-quotes-in-javascript/\nexport function smarten(s: string): string {\n  // opening singles\n  s = s.replace(/(^|[-\\u2014\\s(\\[\"])'/g, \"$1\\u2018\")\n  // closing singles & apostrophes\n  s = s.replace(/'/g, \"\\u2019\")\n  // opening doubles\n  s = s.replace(/(^|[-\\u2014/\\[(\\u2018\\s])\"/g, \"$1\\u201c\")\n  // closing doubles\n  s = s.replace(/\"/g, \"\\u201d\")\n  return s\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.download = download;
exports.getBinFromUrl = getBinFromUrl;
exports.getBin = getBin;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

const versionToPromise = new Map();

function download(url, output, checksum) {
  const args = ["download", "--url", url, "--output", output];

  if (checksum != null) {
    args.push("--sha512", checksum);
  }

  return (0, _builderUtil().executeAppBuilder)(args);
}

function getBinFromUrl(name, version, checksum) {
  const dirName = `${name}-${version}`;
  let url;

  if (process.env.ELECTRON_BUILDER_BINARIES_DOWNLOAD_OVERRIDE_URL) {
    url = process.env.ELECTRON_BUILDER_BINARIES_DOWNLOAD_OVERRIDE_URL + "/" + dirName + ".7z";
  } else {
    const baseUrl = process.env.NPM_CONFIG_ELECTRON_BUILDER_BINARIES_MIRROR || process.env.npm_config_electron_builder_binaries_mirror || process.env.npm_package_config_electron_builder_binaries_mirror || process.env.ELECTRON_BUILDER_BINARIES_MIRROR || "https://github.com/electron-userland/electron-builder-binaries/releases/download/";
    const middleUrl = process.env.NPM_CONFIG_ELECTRON_BUILDER_BINARIES_CUSTOM_DIR || process.env.npm_config_electron_builder_binaries_custom_dir || process.env.npm_package_config_electron_builder_binaries_custom_dir || process.env.ELECTRON_BUILDER_BINARIES_CUSTOM_DIR || dirName;
    const urlSuffix = dirName + ".7z";
    url = `${baseUrl}${middleUrl}/${urlSuffix}`;
  }

  return getBin(dirName, url, checksum);
}

function getBin(name, url, checksum) {
  let promise = versionToPromise.get(name); // if rejected, we will try to download again

  if (promise != null) {
    return promise;
  }

  promise = doGetBin(name, url, checksum);
  versionToPromise.set(name, promise);
  return promise;
}

function doGetBin(name, url, checksum) {
  const args = ["download-artifact", "--name", name];

  if (url != null) {
    args.push("--url", url);
  }

  if (checksum != null) {
    args.push("--sha512", checksum);
  }

  return (0, _builderUtil().executeAppBuilder)(args);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=binDownload.js.map{"version":3,"sources":["../src/binDownload.ts"],"names":[],"mappings":";;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA,MAAM,gBAAgB,GAAG,IAAI,GAAJ,EAAzB;;AAEM,SAAU,QAAV,CAAmB,GAAnB,EAAgC,MAAhC,EAAgD,QAAhD,EAAwE;AAC5E,QAAM,IAAI,GAAG,CAAC,UAAD,EAAa,OAAb,EAAsB,GAAtB,EAA2B,UAA3B,EAAuC,MAAvC,CAAb;;AACA,MAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,IAAA,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,QAAtB;AACD;;AACD,SAAO,sCAAkB,IAAlB,CAAP;AACD;;AAEK,SAAU,aAAV,CAAwB,IAAxB,EAAsC,OAAtC,EAAuD,QAAvD,EAAuE;AAC3E,QAAM,OAAO,GAAG,GAAG,IAAI,IAAI,OAAO,EAAlC;AACA,MAAI,GAAJ;;AACA,MAAI,OAAO,CAAC,GAAR,CAAY,+CAAhB,EAAiE;AAC/D,IAAA,GAAG,GAAG,OAAO,CAAC,GAAR,CAAY,+CAAZ,GAA8D,GAA9D,GAAoE,OAApE,GAA8E,KAApF;AACD,GAFD,MAGK;AAEH,UAAM,OAAO,GAAG,OAAO,CAAC,GAAR,CAAY,2CAAZ,IACd,OAAO,CAAC,GAAR,CAAY,2CADE,IAEd,OAAO,CAAC,GAAR,CAAY,mDAFE,IAGd,OAAO,CAAC,GAAR,CAAY,gCAHE,IAId,mFAJF;AAKA,UAAM,SAAS,GAAG,OAAO,CAAC,GAAR,CAAY,+CAAZ,IAChB,OAAO,CAAC,GAAR,CAAY,+CADI,IAEhB,OAAO,CAAC,GAAR,CAAY,uDAFI,IAGhB,OAAO,CAAC,GAAR,CAAY,oCAHI,IAIhB,OAJF;AAKA,UAAM,SAAS,GAAG,OAAO,GAAG,KAA5B;AACA,IAAA,GAAG,GAAG,GAAG,OAAO,GAAG,SAAS,IAAI,SAAS,EAAzC;AACD;;AAED,SAAO,MAAM,CAAC,OAAD,EAAU,GAAV,EAAe,QAAf,CAAb;AACD;;AAEK,SAAU,MAAV,CAAiB,IAAjB,EAA+B,GAA/B,EAAoD,QAApD,EAA4E;AAChF,MAAI,OAAO,GAAG,gBAAgB,CAAC,GAAjB,CAAqB,IAArB,CAAd,CADgF,CAEhF;;AACA,MAAI,OAAO,IAAI,IAAf,EAAqB;AACnB,WAAO,OAAP;AACD;;AAED,EAAA,OAAO,GAAG,QAAQ,CAAC,IAAD,EAAO,GAAP,EAAY,QAAZ,CAAlB;AACA,EAAA,gBAAgB,CAAC,GAAjB,CAAqB,IAArB,EAA2B,OAA3B;AACA,SAAO,OAAP;AACD;;AAED,SAAS,QAAT,CAAkB,IAAlB,EAAgC,GAAhC,EAAgE,QAAhE,EAAmG;AACjG,QAAM,IAAI,GAAG,CAAC,mBAAD,EAAsB,QAAtB,EAAgC,IAAhC,CAAb;;AACA,MAAI,GAAG,IAAI,IAAX,EAAiB;AACf,IAAA,IAAI,CAAC,IAAL,CAAU,OAAV,EAAmB,GAAnB;AACD;;AACD,MAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,IAAA,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,QAAtB;AACD;;AACD,SAAO,sCAAkB,IAAlB,CAAP;AACD,C","sourcesContent":["import { executeAppBuilder } from \"builder-util\"\n\nconst versionToPromise = new Map<string, Promise<string>>()\n\nexport function download(url: string, output: string, checksum?: string | null): Promise<void> {\n  const args = [\"download\", \"--url\", url, \"--output\", output]\n  if (checksum != null) {\n    args.push(\"--sha512\", checksum)\n  }\n  return executeAppBuilder(args) as Promise<any>\n}\n\nexport function getBinFromUrl(name: string, version: string, checksum: string): Promise<string> {\n  const dirName = `${name}-${version}`\n  let url: string\n  if (process.env.ELECTRON_BUILDER_BINARIES_DOWNLOAD_OVERRIDE_URL) {\n    url = process.env.ELECTRON_BUILDER_BINARIES_DOWNLOAD_OVERRIDE_URL + \"/\" + dirName + \".7z\"\n  }\n  else {\n\n    const baseUrl = process.env.NPM_CONFIG_ELECTRON_BUILDER_BINARIES_MIRROR ||\n      process.env.npm_config_electron_builder_binaries_mirror ||\n      process.env.npm_package_config_electron_builder_binaries_mirror ||\n      process.env.ELECTRON_BUILDER_BINARIES_MIRROR ||\n      \"https://github.com/electron-userland/electron-builder-binaries/releases/download/\"\n    const middleUrl = process.env.NPM_CONFIG_ELECTRON_BUILDER_BINARIES_CUSTOM_DIR ||\n      process.env.npm_config_electron_builder_binaries_custom_dir ||\n      process.env.npm_package_config_electron_builder_binaries_custom_dir ||\n      process.env.ELECTRON_BUILDER_BINARIES_CUSTOM_DIR ||\n      dirName\n    const urlSuffix = dirName + \".7z\"\n    url = `${baseUrl}${middleUrl}/${urlSuffix}`\n  }\n\n  return getBin(dirName, url, checksum)\n}\n\nexport function getBin(name: string, url?: string | null, checksum?: string | null): Promise<string> {\n  let promise = versionToPromise.get(name)\n  // if rejected, we will try to download again\n  if (promise != null) {\n    return promise\n  }\n\n  promise = doGetBin(name, url, checksum)\n  versionToPromise.set(name, promise)\n  return promise\n}\n\nfunction doGetBin(name: string, url: string | undefined | null, checksum: string | null | undefined): Promise<string> {\n  const args = [\"download-artifact\", \"--name\", name]\n  if (url != null) {\n    args.push(\"--url\", url)\n  }\n  if (checksum != null) {\n    args.push(\"--sha512\", checksum)\n  }\n  return executeAppBuilder(args)\n}"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=configuration.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.DIR_TARGET = exports.DEFAULT_TARGET = exports.Target = exports.Platform = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

class Platform {
  constructor(name, buildConfigurationKey, nodeName) {
    this.name = name;
    this.buildConfigurationKey = buildConfigurationKey;
    this.nodeName = nodeName;
  }

  toString() {
    return this.name;
  }

  createTarget(type, ...archs) {
    if (type == null && (archs == null || archs.length === 0)) {
      return new Map([[this, new Map()]]);
    }

    const archToType = new Map();

    if (this === Platform.MAC) {
      archs = [_builderUtil().Arch.x64];
    }

    for (const arch of archs == null || archs.length === 0 ? [(0, _builderUtil().archFromString)(process.arch)] : archs) {
      archToType.set(arch, type == null ? [] : Array.isArray(type) ? type : [type]);
    }

    return new Map([[this, archToType]]);
  }

  static current() {
    return Platform.fromString(process.platform);
  }

  static fromString(name) {
    name = name.toLowerCase();

    switch (name) {
      case Platform.MAC.nodeName:
      case Platform.MAC.name:
        return Platform.MAC;

      case Platform.WINDOWS.nodeName:
      case Platform.WINDOWS.name:
      case Platform.WINDOWS.buildConfigurationKey:
        return Platform.WINDOWS;

      case Platform.LINUX.nodeName:
        return Platform.LINUX;

      default:
        throw new Error(`Unknown platform: ${name}`);
    }
  }

}

exports.Platform = Platform;
Platform.MAC = new Platform("mac", "mac", "darwin");
Platform.LINUX = new Platform("linux", "linux", "linux");
Platform.WINDOWS = new Platform("windows", "win", "win32");

class Target {
  constructor(name, isAsyncSupported = true) {
    this.name = name;
    this.isAsyncSupported = isAsyncSupported;
  }

  checkOptions() {// ignore

    return (0, _bluebirdLst().coroutine)(function* () {})();
  }

  finishBuild() {
    return Promise.resolve();
  }

}

exports.Target = Target;
const DEFAULT_TARGET = "default";
exports.DEFAULT_TARGET = DEFAULT_TARGET;
const DIR_TARGET = "dir"; exports.DIR_TARGET = DIR_TARGET;
// __ts-babel@6.0.4
//# sourceMappingURL=core.js.map{"version":3,"sources":["../src/core.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAiBM,MAAO,QAAP,CAAe;AAKnB,EAAA,WAAA,CAAmB,IAAnB,EAAwC,qBAAxC,EAA8E,QAA9E,EAAuG;AAApF,SAAA,IAAA,GAAA,IAAA;AAAqB,SAAA,qBAAA,GAAA,qBAAA;AAAsC,SAAA,QAAA,GAAA,QAAA;AAC7E;;AAED,EAAA,QAAQ,GAAA;AACN,WAAO,KAAK,IAAZ;AACD;;AAED,EAAA,YAAY,CAAC,IAAD,EAAuC,GAAG,KAA1C,EAA4D;AACtE,QAAI,IAAI,IAAI,IAAR,KAAiB,KAAK,IAAI,IAAT,IAAiB,KAAK,CAAC,MAAN,KAAiB,CAAnD,CAAJ,EAA2D;AACzD,aAAO,IAAI,GAAJ,CAAQ,CAAC,CAAC,IAAD,EAAO,IAAI,GAAJ,EAAP,CAAD,CAAR,CAAP;AACD;;AAED,UAAM,UAAU,GAAG,IAAI,GAAJ,EAAnB;;AACA,QAAI,SAAS,QAAQ,CAAC,GAAtB,EAA2B;AACzB,MAAA,KAAK,GAAG,CAAC,oBAAK,GAAN,CAAR;AACD;;AAED,SAAK,MAAM,IAAX,IAAoB,KAAK,IAAI,IAAT,IAAiB,KAAK,CAAC,MAAN,KAAiB,CAAlC,GAAsC,CAAC,mCAAe,OAAO,CAAC,IAAvB,CAAD,CAAtC,GAAuE,KAA3F,EAAmG;AACjG,MAAA,UAAU,CAAC,GAAX,CAAe,IAAf,EAAqB,IAAI,IAAI,IAAR,GAAe,EAAf,GAAqB,KAAK,CAAC,OAAN,CAAc,IAAd,IAAsB,IAAtB,GAA6B,CAAC,IAAD,CAAvE;AACD;;AACD,WAAO,IAAI,GAAJ,CAAQ,CAAC,CAAC,IAAD,EAAO,UAAP,CAAD,CAAR,CAAP;AACD;;AAED,SAAO,OAAP,GAAc;AACZ,WAAO,QAAQ,CAAC,UAAT,CAAoB,OAAO,CAAC,QAA5B,CAAP;AACD;;AAED,SAAO,UAAP,CAAkB,IAAlB,EAA8B;AAC5B,IAAA,IAAI,GAAG,IAAI,CAAC,WAAL,EAAP;;AACA,YAAQ,IAAR;AACE,WAAK,QAAQ,CAAC,GAAT,CAAa,QAAlB;AACA,WAAK,QAAQ,CAAC,GAAT,CAAa,IAAlB;AACE,eAAO,QAAQ,CAAC,GAAhB;;AAEF,WAAK,QAAQ,CAAC,OAAT,CAAiB,QAAtB;AACA,WAAK,QAAQ,CAAC,OAAT,CAAiB,IAAtB;AACA,WAAK,QAAQ,CAAC,OAAT,CAAiB,qBAAtB;AACE,eAAO,QAAQ,CAAC,OAAhB;;AAEF,WAAK,QAAQ,CAAC,KAAT,CAAe,QAApB;AACE,eAAO,QAAQ,CAAC,KAAhB;;AAEF;AACE,cAAM,IAAI,KAAJ,CAAU,qBAAqB,IAAI,EAAnC,CAAN;AAdJ;AAgBD;;AAlDkB;;;AACZ,QAAA,CAAA,GAAA,GAAM,IAAI,QAAJ,CAAa,KAAb,EAAoB,KAApB,EAA2B,QAA3B,CAAN;AACA,QAAA,CAAA,KAAA,GAAQ,IAAI,QAAJ,CAAa,OAAb,EAAsB,OAAtB,EAA+B,OAA/B,CAAR;AACA,QAAA,CAAA,OAAA,GAAU,IAAI,QAAJ,CAAa,SAAb,EAAwB,KAAxB,EAA+B,OAA/B,CAAV;;AAkDH,MAAgB,MAAhB,CAAsB;AAI1B,EAAA,WAAA,CAA+B,IAA/B,EAAsD,gBAAA,GAA4B,IAAlF,EAAsF;AAAvD,SAAA,IAAA,GAAA,IAAA;AAAuB,SAAA,gBAAA,GAAA,gBAAA;AACrD;;AAEK,EAAA,YAAN,GAAkB,CAChB;;AADgB;AAEjB;;AAID,EAAA,WAAW,GAAA;AACT,WAAO,OAAO,CAAC,OAAR,EAAP;AACD;;AAfyB;;;AA2BrB,MAAM,cAAc,GAAG,SAAvB;;AACA,MAAM,UAAU,GAAG,KAAnB,C","sourcesContent":["import { Arch, archFromString, ArchType } from \"builder-util\"\nimport { Publish } from \"builder-util-runtime\"\n\nexport type TargetConfigType = Array<string | TargetConfiguration> | string | TargetConfiguration | null\n\nexport interface TargetConfiguration {\n  /**\n   * The target name. e.g. `snap`.\n   */\n  readonly target: string\n\n  /**\n   * The arch or list of archs.\n   */\n  readonly arch?: Array<ArchType> | ArchType\n}\n\nexport class Platform {\n  static MAC = new Platform(\"mac\", \"mac\", \"darwin\")\n  static LINUX = new Platform(\"linux\", \"linux\", \"linux\")\n  static WINDOWS = new Platform(\"windows\", \"win\", \"win32\")\n\n  constructor(public name: string, public buildConfigurationKey: string, public nodeName: NodeJS.Platform) {\n  }\n\n  toString() {\n    return this.name\n  }\n\n  createTarget(type?: string | Array<string> | null, ...archs: Array<Arch>): Map<Platform, Map<Arch, Array<string>>> {\n    if (type == null && (archs == null || archs.length === 0)) {\n      return new Map([[this, new Map()]])\n    }\n\n    const archToType = new Map()\n    if (this === Platform.MAC) {\n      archs = [Arch.x64]\n    }\n\n    for (const arch of (archs == null || archs.length === 0 ? [archFromString(process.arch)] : archs)) {\n      archToType.set(arch, type == null ? [] : (Array.isArray(type) ? type : [type]))\n    }\n    return new Map([[this, archToType]])\n  }\n\n  static current(): Platform {\n    return Platform.fromString(process.platform)\n  }\n\n  static fromString(name: string): Platform {\n    name = name.toLowerCase()\n    switch (name) {\n      case Platform.MAC.nodeName:\n      case Platform.MAC.name:\n        return Platform.MAC\n\n      case Platform.WINDOWS.nodeName:\n      case Platform.WINDOWS.name:\n      case Platform.WINDOWS.buildConfigurationKey:\n        return Platform.WINDOWS\n\n      case Platform.LINUX.nodeName:\n        return Platform.LINUX\n\n      default:\n        throw new Error(`Unknown platform: ${name}`)\n    }\n  }\n}\n\nexport abstract class Target {\n  abstract readonly outDir: string\n  abstract readonly options: TargetSpecificOptions | null | undefined\n\n  protected constructor(readonly name: string, readonly isAsyncSupported: boolean = true) {\n  }\n\n  async checkOptions(): Promise<any> {\n    // ignore\n  }\n\n  abstract build(appOutDir: string, arch: Arch): Promise<any>\n\n  finishBuild(): Promise<any> {\n    return Promise.resolve()\n  }\n}\n\nexport interface TargetSpecificOptions {\n  /**\n   The [artifact file name template](/configuration/configuration#artifact-file-name-template).\n   */\n  readonly artifactName?: string | null\n\n  publish?: Publish\n}\n\nexport const DEFAULT_TARGET = \"default\"\nexport const DIR_TARGET = \"dir\"\n\nexport type CompressionLevel = \"store\" | \"normal\" | \"maximum\"\n\nexport interface BeforeBuildContext {\n  readonly appDir: string\n  readonly electronVersion: string\n  readonly platform: Platform\n  readonly arch: string\n}\n\nexport interface SourceRepositoryInfo {\n  type?: string\n  domain?: string\n  user: string\n  project: string\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.authorEmailIsMissed = void 0;
const authorEmailIsMissed = `Please specify author 'email' in the application package.json

See https://docs.npmjs.com/files/package.json#people-fields-author-contributors

It is required to set Linux .deb package maintainer. Or you can set maintainer in the custom linux options.
(see https://www.electron.build/configuration/linux).
`; exports.authorEmailIsMissed = authorEmailIsMissed;
// __ts-babel@6.0.4
//# sourceMappingURL=errorMessages.js.map{"version":3,"sources":["../src/errorMessages.ts"],"names":[],"mappings":";;;;;;AAAO,MAAM,mBAAmB,GAAG;;;;;;CAA5B,C","sourcesContent":["export const authorEmailIsMissed = `Please specify author 'email' in the application package.json\n\nSee https://docs.npmjs.com/files/package.json#people-fields-author-contributors\n\nIt is required to set Linux .deb package maintainer. Or you can set maintainer in the custom linux options.\n(see https://www.electron.build/configuration/linux).\n`"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getMainFileMatchers = getMainFileMatchers;
exports.getNodeModuleFileMatcher = getNodeModuleFileMatcher;
exports.getFileMatchers = getFileMatchers;
exports.copyFiles = copyFiles;
exports.FileMatcher = exports.excludedExts = exports.excludedNames = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _minimatch() {
  const data = require("minimatch");

  _minimatch = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _filter() {
  const data = require("./util/filter");

  _filter = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

// https://github.com/electron-userland/electron-builder/issues/733
const minimatchOptions = {
  dot: true
}; // noinspection SpellCheckingInspection

const excludedNames = ".git,.hg,.svn,CVS,RCS,SCCS," + "__pycache__,.DS_Store,thumbs.db,.gitignore,.gitkeep,.gitattributes,.npmignore," + ".idea,.vs,.flowconfig,.jshintrc,.eslintrc,.circleci," + ".yarn-integrity,.yarn-metadata.json,yarn-error.log,yarn.lock,package-lock.json,npm-debug.log," + "appveyor.yml,.travis.yml,circle.yml,.nyc_output";
exports.excludedNames = excludedNames;
const excludedExts = "iml,hprof,orig,pyc,pyo,rbc,swp,csproj,sln,suo,xproj,cc,d.ts";
exports.excludedExts = excludedExts;

function ensureNoEndSlash(file) {
  if (path.sep !== "/") {
    file = file.replace(/\//g, path.sep);
  }

  if (path.sep !== "\\") {
    file = file.replace(/\\/g, path.sep);
  }

  if (file.endsWith(path.sep)) {
    return file.substring(0, file.length - 1);
  } else {
    return file;
  }
}
/** @internal */


class FileMatcher {
  constructor(from, to, macroExpander, patterns) {
    this.macroExpander = macroExpander;
    this.excludePatterns = null;
    this.from = ensureNoEndSlash(macroExpander(from));
    this.to = ensureNoEndSlash(macroExpander(to));
    this.patterns = (0, _builderUtil().asArray)(patterns).map(it => this.normalizePattern(it));
    this.isSpecifiedAsEmptyArray = Array.isArray(patterns) && patterns.length === 0;
  }

  normalizePattern(pattern) {
    if (pattern.startsWith("./")) {
      pattern = pattern.substring("./".length);
    }

    return path.posix.normalize(this.macroExpander(pattern.replace(/\\/g, "/")));
  }

  addPattern(pattern) {
    this.patterns.push(this.normalizePattern(pattern));
  }

  prependPattern(pattern) {
    this.patterns.unshift(this.normalizePattern(pattern));
  }

  isEmpty() {
    return this.patterns.length === 0;
  }

  containsOnlyIgnore() {
    return !this.isEmpty() && this.patterns.find(it => !it.startsWith("!")) == null;
  }

  computeParsedPatterns(result, fromDir) {
    const relativeFrom = fromDir == null ? null : path.relative(fromDir, this.from);

    if (this.patterns.length === 0 && relativeFrom != null) {
      // file mappings, from here is a file
      result.push(new (_minimatch().Minimatch)(relativeFrom, minimatchOptions));
      return;
    }

    for (let pattern of this.patterns) {
      if (relativeFrom != null) {
        pattern = path.join(relativeFrom, pattern);
      }

      const parsedPattern = new (_minimatch().Minimatch)(pattern, minimatchOptions);
      result.push(parsedPattern); // do not add if contains dot (possibly file if has extension)

      if (!pattern.includes(".") && !(0, _filter().hasMagic)(parsedPattern)) {
        // https://github.com/electron-userland/electron-builder/issues/545
        // add **/*
        result.push(new (_minimatch().Minimatch)(`${pattern}/**/*`, minimatchOptions));
      }
    }
  }

  createFilter() {
    const parsedPatterns = [];
    this.computeParsedPatterns(parsedPatterns);
    return (0, _filter().createFilter)(this.from, parsedPatterns, this.excludePatterns);
  }

  toString() {
    return `from: ${this.from}, to: ${this.to}, patterns: ${this.patterns.join(", ")}`;
  }

}
/** @internal */


exports.FileMatcher = FileMatcher;

function getMainFileMatchers(appDir, destination, macroExpander, platformSpecificBuildOptions, platformPackager, outDir, isElectronCompile) {
  const packager = platformPackager.info;
  const buildResourceDir = path.resolve(packager.projectDir, packager.buildResourcesDir);
  let matchers = packager.isPrepackedAppAsar ? null : getFileMatchers(packager.config, "files", destination, {
    macroExpander,
    customBuildOptions: platformSpecificBuildOptions,
    globalOutDir: outDir,
    defaultSrc: appDir
  });

  if (matchers == null) {
    matchers = [new FileMatcher(appDir, destination, macroExpander)];
  }

  const matcher = matchers[0]; // add default patterns, but only if from equals to app dir

  if (matcher.from !== appDir) {
    return matchers;
  } // https://github.com/electron-userland/electron-builder/issues/1741#issuecomment-311111418 so, do not use inclusive patterns


  const patterns = matcher.patterns;
  const customFirstPatterns = []; // electron-webpack - we need to copy only package.json and node_modules from root dir (and these files are added by default), so, explicit empty array is specified

  if (!matcher.isSpecifiedAsEmptyArray && (matcher.isEmpty() || matcher.containsOnlyIgnore())) {
    customFirstPatterns.push("**/*");
  } else if (!patterns.includes("package.json")) {
    patterns.push("package.json");
  } // https://github.com/electron-userland/electron-builder/issues/1482


  const relativeBuildResourceDir = path.relative(matcher.from, buildResourceDir);

  if (relativeBuildResourceDir.length !== 0 && !relativeBuildResourceDir.startsWith(".")) {
    customFirstPatterns.push(`!${relativeBuildResourceDir}{,/**/*}`);
  }

  const relativeOutDir = matcher.normalizePattern(path.relative(packager.projectDir, outDir));

  if (!relativeOutDir.startsWith(".")) {
    customFirstPatterns.push(`!${relativeOutDir}{,/**/*}`);
  } // add our default exclusions after last user possibly defined "all"/permissive pattern


  let insertIndex = 0;

  for (let i = patterns.length - 1; i >= 0; i--) {
    if (patterns[i].startsWith("**/")) {
      insertIndex = i + 1;
      break;
    }
  }

  patterns.splice(insertIndex, 0, ...customFirstPatterns);
  patterns.push(`!**/*.{${excludedExts}${packager.config.includePdb === true ? "" : ",pdb"}`);
  patterns.push("!**/._*");
  patterns.push("!**/electron-builder.{yaml,yml,json,json5,toml}");
  patterns.push(`!**/{${excludedNames}}`);

  if (isElectronCompile) {
    patterns.push("!.cache{,/**/*}");
  } // https://github.com/electron-userland/electron-builder/issues/1969
  // exclude ony for app root, use .yarnclean to clean node_modules


  patterns.push("!.editorconfig");
  const debugLogger = packager.debugLogger;

  if (debugLogger.isEnabled) {
    //tslint:disable-next-line:no-invalid-template-strings
    debugLogger.add(`${macroExpander("${arch}")}.firstOrDefaultFilePatterns`, patterns);
  }

  return matchers;
}
/** @internal */


function getNodeModuleFileMatcher(appDir, destination, macroExpander, platformSpecificBuildOptions, packager) {
  // https://github.com/electron-userland/electron-builder/pull/2948#issuecomment-392241632
  // grab only excludes
  const matcher = new FileMatcher(appDir, destination, macroExpander);

  function addPatterns(patterns) {
    if (patterns == null) {
      return;
    } else if (!Array.isArray(patterns)) {
      if (typeof patterns === "string" && patterns.startsWith("!")) {
        matcher.addPattern(patterns);
        return;
      } // ignore object form


      return;
    }

    for (const pattern of patterns) {
      if (typeof pattern === "string") {
        if (pattern.startsWith("!")) {
          matcher.addPattern(pattern);
        }
      } else {
        const fileSet = pattern;

        if (fileSet.from == null || fileSet.from === ".") {
          for (const p of (0, _builderUtil().asArray)(fileSet.filter)) {
            matcher.addPattern(p);
          }
        }
      }
    }
  }

  addPatterns(packager.config.files);
  addPatterns(platformSpecificBuildOptions.files);

  if (!matcher.isEmpty()) {
    matcher.prependPattern("**/*");
  }

  const debugLogger = packager.debugLogger;

  if (debugLogger.isEnabled) {
    //tslint:disable-next-line:no-invalid-template-strings
    debugLogger.add(`${macroExpander("${arch}")}.nodeModuleFilePatterns`, matcher.patterns);
  }

  return matcher;
}
/** @internal */


function getFileMatchers(config, name, defaultDestination, options) {
  const defaultMatcher = new FileMatcher(options.defaultSrc, defaultDestination, options.macroExpander);
  const fileMatchers = [];

  function addPatterns(patterns) {
    if (patterns == null) {
      return;
    } else if (!Array.isArray(patterns)) {
      if (typeof patterns === "string") {
        defaultMatcher.addPattern(patterns);
        return;
      }

      patterns = [patterns];
    }

    for (const pattern of patterns) {
      if (typeof pattern === "string") {
        // use normalize to transform ./foo to foo
        defaultMatcher.addPattern(pattern);
      } else if (name === "asarUnpack") {
        throw new Error(`Advanced file copying not supported for "${name}"`);
      } else {
        const from = pattern.from == null ? options.defaultSrc : path.resolve(options.defaultSrc, pattern.from);
        const to = pattern.to == null ? defaultDestination : path.resolve(defaultDestination, pattern.to);
        fileMatchers.push(new FileMatcher(from, to, options.macroExpander, pattern.filter));
      }
    }
  }

  if (name !== "extraDistFiles") {
    addPatterns(config[name]);
  }

  addPatterns(options.customBuildOptions[name]);

  if (!defaultMatcher.isEmpty()) {
    // default matcher should be first in the array
    fileMatchers.unshift(defaultMatcher);
  } // we cannot exclude the whole out dir, because sometimes users want to use some file in the out dir in the patterns


  const relativeOutDir = defaultMatcher.normalizePattern(path.relative(options.defaultSrc, options.globalOutDir));

  if (!relativeOutDir.startsWith(".")) {
    defaultMatcher.addPattern(`!${relativeOutDir}/*-unpacked{,/**/*}`);
  }

  return fileMatchers.length === 0 ? null : fileMatchers;
}
/** @internal */


function copyFiles(matchers, transformer, isUseHardLink) {
  if (matchers == null || matchers.length === 0) {
    return Promise.resolve();
  }

  return _bluebirdLst().default.map(matchers,
  /*#__PURE__*/
  function () {
    var _ref = (0, _bluebirdLst().coroutine)(function* (matcher) {
      const fromStat = yield (0, _fs().statOrNull)(matcher.from);

      if (fromStat == null) {
        _builderUtil().log.warn({
          from: matcher.from
        }, `file source doesn't exist`);

        return;
      }

      if (fromStat.isFile()) {
        const toStat = yield (0, _fs().statOrNull)(matcher.to); // https://github.com/electron-userland/electron-builder/issues/1245

        if (toStat != null && toStat.isDirectory()) {
          return yield (0, _fs().copyOrLinkFile)(matcher.from, path.join(matcher.to, path.basename(matcher.from)), fromStat, isUseHardLink);
        }

        yield (0, _fsExtraP().ensureDir)(path.dirname(matcher.to));
        return yield (0, _fs().copyOrLinkFile)(matcher.from, matcher.to, fromStat);
      }

      if (matcher.isEmpty() || matcher.containsOnlyIgnore()) {
        matcher.prependPattern("**/*");
      }

      _builderUtil().log.debug({
        matcher
      }, "copying files using pattern");

      return yield (0, _fs().copyDir)(matcher.from, matcher.to, {
        filter: matcher.createFilter(),
        transformer,
        isUseHardLink: isUseHardLink ? _fs().USE_HARD_LINKS : null
      });
    });

    return function (_x) {
      return _ref.apply(this, arguments);
    };
  }());
} 
// __ts-babel@6.0.4
//# sourceMappingURL=fileMatcher.js.map{"version":3,"sources":["../src/fileMatcher.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { asArray, log } from \"builder-util\"\nimport { copyDir, copyOrLinkFile, Filter, statOrNull, FileTransformer, USE_HARD_LINKS } from \"builder-util/out/fs\"\nimport { ensureDir } from \"fs-extra-p\"\nimport { Minimatch } from \"minimatch\"\nimport * as path from \"path\"\nimport { Configuration, FileSet, Packager, PlatformSpecificBuildOptions } from \"./index\"\nimport { PlatformPackager } from \"./platformPackager\"\nimport { createFilter, hasMagic } from \"./util/filter\"\n\n// https://github.com/electron-userland/electron-builder/issues/733\nconst minimatchOptions = {dot: true}\n\n// noinspection SpellCheckingInspection\nexport const excludedNames = \".git,.hg,.svn,CVS,RCS,SCCS,\" +\n  \"__pycache__,.DS_Store,thumbs.db,.gitignore,.gitkeep,.gitattributes,.npmignore,\" +\n  \".idea,.vs,.flowconfig,.jshintrc,.eslintrc,.circleci,\" +\n  \".yarn-integrity,.yarn-metadata.json,yarn-error.log,yarn.lock,package-lock.json,npm-debug.log,\" +\n  \"appveyor.yml,.travis.yml,circle.yml,.nyc_output\"\n\nexport const excludedExts = \"iml,hprof,orig,pyc,pyo,rbc,swp,csproj,sln,suo,xproj,cc,d.ts\"\n\nfunction ensureNoEndSlash(file: string): string {\n  if (path.sep !== \"/\") {\n    file = file.replace(/\\//g, path.sep)\n  }\n  if (path.sep !== \"\\\\\") {\n    file = file.replace(/\\\\/g, path.sep)\n  }\n\n  if (file.endsWith(path.sep)) {\n    return file.substring(0, file.length - 1)\n  }\n  else {\n    return file\n  }\n}\n\n/** @internal */\nexport class FileMatcher {\n  readonly from: string\n  readonly to: string\n\n  readonly patterns: Array<string>\n\n  excludePatterns: Array<Minimatch> | null = null\n\n  readonly isSpecifiedAsEmptyArray: boolean\n\n  constructor(from: string, to: string, readonly macroExpander: (pattern: string) => string, patterns?: Array<string> | string | null | undefined) {\n    this.from = ensureNoEndSlash(macroExpander(from))\n    this.to = ensureNoEndSlash(macroExpander(to))\n    this.patterns = asArray(patterns).map(it => this.normalizePattern(it))\n    this.isSpecifiedAsEmptyArray = Array.isArray(patterns) && patterns.length === 0\n  }\n\n  normalizePattern(pattern: string) {\n    if (pattern.startsWith(\"./\")) {\n      pattern = pattern.substring(\"./\".length)\n    }\n    return path.posix.normalize(this.macroExpander(pattern.replace(/\\\\/g, \"/\")))\n  }\n\n  addPattern(pattern: string) {\n    this.patterns.push(this.normalizePattern(pattern))\n  }\n\n  prependPattern(pattern: string) {\n    this.patterns.unshift(this.normalizePattern(pattern))\n  }\n\n  isEmpty() {\n    return this.patterns.length === 0\n  }\n\n  containsOnlyIgnore(): boolean {\n    return !this.isEmpty() && this.patterns.find(it => !it.startsWith(\"!\")) == null\n  }\n\n  computeParsedPatterns(result: Array<Minimatch>, fromDir?: string): void {\n    const relativeFrom = fromDir == null ? null : path.relative(fromDir, this.from)\n\n    if (this.patterns.length === 0 && relativeFrom != null) {\n      // file mappings, from here is a file\n      result.push(new Minimatch(relativeFrom, minimatchOptions))\n      return\n    }\n\n    for (let pattern of this.patterns) {\n      if (relativeFrom != null) {\n        pattern = path.join(relativeFrom, pattern)\n      }\n\n      const parsedPattern = new Minimatch(pattern, minimatchOptions)\n      result.push(parsedPattern)\n\n      // do not add if contains dot (possibly file if has extension)\n      if (!pattern.includes(\".\") && !hasMagic(parsedPattern)) {\n        // https://github.com/electron-userland/electron-builder/issues/545\n        // add **/*\n        result.push(new Minimatch(`${pattern}/**/*`, minimatchOptions))\n      }\n    }\n  }\n\n  createFilter(): Filter {\n    const parsedPatterns: Array<Minimatch> = []\n    this.computeParsedPatterns(parsedPatterns)\n    return createFilter(this.from, parsedPatterns, this.excludePatterns)\n  }\n\n  toString() {\n    return `from: ${this.from}, to: ${this.to}, patterns: ${this.patterns.join(\", \")}`\n  }\n}\n\n/** @internal */\nexport function getMainFileMatchers(appDir: string, destination: string, macroExpander: (pattern: string) => string, platformSpecificBuildOptions: PlatformSpecificBuildOptions, platformPackager: PlatformPackager<any>, outDir: string, isElectronCompile: boolean): Array<FileMatcher> {\n  const packager = platformPackager.info\n  const buildResourceDir = path.resolve(packager.projectDir, packager.buildResourcesDir)\n\n  let matchers = packager.isPrepackedAppAsar ? null : getFileMatchers(packager.config, \"files\", destination, {\n    macroExpander,\n    customBuildOptions: platformSpecificBuildOptions,\n    globalOutDir: outDir,\n    defaultSrc: appDir,\n  })\n  if (matchers == null) {\n    matchers = [new FileMatcher(appDir, destination, macroExpander)]\n  }\n\n  const matcher = matchers[0]\n  // add default patterns, but only if from equals to app dir\n  if (matcher.from !== appDir) {\n    return matchers\n  }\n\n  // https://github.com/electron-userland/electron-builder/issues/1741#issuecomment-311111418 so, do not use inclusive patterns\n  const patterns = matcher.patterns\n\n  const customFirstPatterns: Array<string> = []\n  // electron-webpack - we need to copy only package.json and node_modules from root dir (and these files are added by default), so, explicit empty array is specified\n  if (!matcher.isSpecifiedAsEmptyArray && (matcher.isEmpty() || matcher.containsOnlyIgnore())) {\n    customFirstPatterns.push(\"**/*\")\n  }\n  else if (!patterns.includes(\"package.json\")) {\n    patterns.push(\"package.json\")\n  }\n\n  // https://github.com/electron-userland/electron-builder/issues/1482\n  const relativeBuildResourceDir = path.relative(matcher.from, buildResourceDir)\n  if (relativeBuildResourceDir.length !== 0 && !relativeBuildResourceDir.startsWith(\".\")) {\n    customFirstPatterns.push(`!${relativeBuildResourceDir}{,/**/*}`)\n  }\n\n  const relativeOutDir = matcher.normalizePattern(path.relative(packager.projectDir, outDir))\n  if (!relativeOutDir.startsWith(\".\")) {\n    customFirstPatterns.push(`!${relativeOutDir}{,/**/*}`)\n  }\n\n  // add our default exclusions after last user possibly defined \"all\"/permissive pattern\n  let insertIndex = 0\n  for (let i = patterns.length - 1; i >= 0; i--) {\n    if (patterns[i].startsWith(\"**/\")) {\n      insertIndex = i + 1\n      break\n    }\n  }\n  patterns.splice(insertIndex, 0, ...customFirstPatterns)\n\n  patterns.push(`!**/*.{${excludedExts}${packager.config.includePdb === true ? \"\" : \",pdb\"}`)\n  patterns.push(\"!**/._*\")\n  patterns.push(\"!**/electron-builder.{yaml,yml,json,json5,toml}\")\n  patterns.push(`!**/{${excludedNames}}`)\n\n  if (isElectronCompile) {\n    patterns.push(\"!.cache{,/**/*}\")\n  }\n\n  // https://github.com/electron-userland/electron-builder/issues/1969\n  // exclude ony for app root, use .yarnclean to clean node_modules\n  patterns.push(\"!.editorconfig\")\n\n  const debugLogger = packager.debugLogger\n  if (debugLogger.isEnabled) {\n    //tslint:disable-next-line:no-invalid-template-strings\n    debugLogger.add(`${macroExpander(\"${arch}\")}.firstOrDefaultFilePatterns`, patterns)\n  }\n  return matchers\n}\n\n/** @internal */\nexport function getNodeModuleFileMatcher(appDir: string, destination: string, macroExpander: (pattern: string) => string, platformSpecificBuildOptions: PlatformSpecificBuildOptions, packager: Packager): FileMatcher {\n  // https://github.com/electron-userland/electron-builder/pull/2948#issuecomment-392241632\n  // grab only excludes\n  const matcher = new FileMatcher(appDir, destination, macroExpander)\n\n  function addPatterns(patterns: Array<string | FileSet> | string | null | undefined | FileSet) {\n    if (patterns == null) {\n      return\n    }\n    else if (!Array.isArray(patterns)) {\n      if (typeof patterns === \"string\" && patterns.startsWith(\"!\")) {\n        matcher.addPattern(patterns)\n        return\n      }\n      // ignore object form\n      return\n    }\n\n    for (const pattern of patterns) {\n      if (typeof pattern === \"string\") {\n        if (pattern.startsWith(\"!\")) {\n          matcher.addPattern(pattern)\n        }\n      }\n      else {\n        const fileSet = (pattern as FileSet)\n        if (fileSet.from == null || fileSet.from === \".\") {\n          for (const p of asArray(fileSet.filter)) {\n            matcher.addPattern(p)\n          }\n        }\n      }\n    }\n  }\n\n  addPatterns(packager.config.files)\n  addPatterns(platformSpecificBuildOptions.files)\n\n  if (!matcher.isEmpty()) {\n    matcher.prependPattern(\"**/*\")\n  }\n\n  const debugLogger = packager.debugLogger\n  if (debugLogger.isEnabled) {\n    //tslint:disable-next-line:no-invalid-template-strings\n    debugLogger.add(`${macroExpander(\"${arch}\")}.nodeModuleFilePatterns`, matcher.patterns)\n  }\n\n  return matcher\n}\n\nexport interface GetFileMatchersOptions {\n  readonly macroExpander: (pattern: string) => string\n  readonly customBuildOptions: PlatformSpecificBuildOptions\n  readonly globalOutDir: string\n\n  readonly defaultSrc: string\n}\n\n/** @internal */\nexport function getFileMatchers(config: Configuration, name: \"files\" | \"extraFiles\" | \"extraResources\" | \"asarUnpack\" | \"extraDistFiles\", defaultDestination: string, options: GetFileMatchersOptions): Array<FileMatcher> | null {\n  const defaultMatcher = new FileMatcher(options.defaultSrc, defaultDestination, options.macroExpander)\n  const fileMatchers: Array<FileMatcher> = []\n\n  function addPatterns(patterns: Array<string | FileSet> | string | null | undefined | FileSet) {\n    if (patterns == null) {\n      return\n    }\n    else if (!Array.isArray(patterns)) {\n      if (typeof patterns === \"string\") {\n        defaultMatcher.addPattern(patterns)\n        return\n      }\n      patterns = [patterns]\n    }\n\n    for (const pattern of patterns) {\n      if (typeof pattern === \"string\") {\n        // use normalize to transform ./foo to foo\n        defaultMatcher.addPattern(pattern)\n      }\n      else if (name === \"asarUnpack\") {\n        throw new Error(`Advanced file copying not supported for \"${name}\"`)\n      }\n      else {\n        const from = pattern.from == null ? options.defaultSrc : path.resolve(options.defaultSrc, pattern.from)\n        const to = pattern.to == null ? defaultDestination : path.resolve(defaultDestination, pattern.to)\n        fileMatchers.push(new FileMatcher(from, to, options.macroExpander, pattern.filter))\n      }\n    }\n  }\n\n  if (name !== \"extraDistFiles\") {\n    addPatterns((config as any)[name])\n  }\n  addPatterns((options.customBuildOptions as any)[name])\n\n  if (!defaultMatcher.isEmpty()) {\n    // default matcher should be first in the array\n    fileMatchers.unshift(defaultMatcher)\n  }\n\n  // we cannot exclude the whole out dir, because sometimes users want to use some file in the out dir in the patterns\n  const relativeOutDir = defaultMatcher.normalizePattern(path.relative(options.defaultSrc, options.globalOutDir))\n  if (!relativeOutDir.startsWith(\".\")) {\n    defaultMatcher.addPattern(`!${relativeOutDir}/*-unpacked{,/**/*}`)\n  }\n\n  return fileMatchers.length === 0 ? null : fileMatchers\n}\n\n/** @internal */\nexport function copyFiles(matchers: Array<FileMatcher> | null, transformer: FileTransformer | null, isUseHardLink?: boolean): Promise<any> {\n  if (matchers == null || matchers.length === 0) {\n    return Promise.resolve()\n  }\n\n  return BluebirdPromise.map(matchers, async (matcher: FileMatcher) => {\n    const fromStat = await statOrNull(matcher.from)\n    if (fromStat == null) {\n      log.warn({from: matcher.from}, `file source doesn't exist`)\n      return\n    }\n\n    if (fromStat.isFile()) {\n      const toStat = await statOrNull(matcher.to)\n      // https://github.com/electron-userland/electron-builder/issues/1245\n      if (toStat != null && toStat.isDirectory()) {\n        return await copyOrLinkFile(matcher.from, path.join(matcher.to, path.basename(matcher.from)), fromStat, isUseHardLink)\n      }\n\n      await ensureDir(path.dirname(matcher.to))\n      return await copyOrLinkFile(matcher.from, matcher.to, fromStat)\n    }\n\n    if (matcher.isEmpty() || matcher.containsOnlyIgnore()) {\n      matcher.prependPattern(\"**/*\")\n    }\n    log.debug({matcher}, \"copying files using pattern\")\n    return await copyDir(matcher.from, matcher.to, {filter: matcher.createFilter(), transformer, isUseHardLink: isUseHardLink ? USE_HARD_LINKS : null})\n  })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isElectronCompileUsed = isElectronCompileUsed;
exports.hasDep = hasDep;
exports.createTransformer = createTransformer;
exports.createElectronCompilerHost = createElectronCompilerHost;
exports.NODE_MODULES_PATTERN = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/** @internal */
const NODE_MODULES_PATTERN = `${path.sep}node_modules${path.sep}`;
/** @internal */

exports.NODE_MODULES_PATTERN = NODE_MODULES_PATTERN;

function isElectronCompileUsed(info) {
  if (info.config.electronCompile != null) {
    return info.config.electronCompile;
  } // if in devDependencies - it means that babel is used for precompilation or for some reason user decided to not use electron-compile for production


  return hasDep("electron-compile", info);
}
/** @internal */


function hasDep(name, info) {
  const deps = info.metadata.dependencies;
  return deps != null && name in deps;
}
/** @internal */


function createTransformer(srcDir, configuration, extraMetadata, extraTransformer) {
  const mainPackageJson = path.join(srcDir, "package.json");
  const isRemovePackageScripts = configuration.removePackageScripts !== false;
  const packageJson = path.sep + "package.json";
  return file => {
    if (file === mainPackageJson) {
      return modifyMainPackageJson(file, extraMetadata, isRemovePackageScripts);
    }

    if (file.endsWith(packageJson) && file.includes(NODE_MODULES_PATTERN)) {
      return (0, _fsExtraP().readFile)(file, "utf-8").then(it => cleanupPackageJson(JSON.parse(it), {
        isMain: false,
        isRemovePackageScripts
      })).catch(e => _builderUtil().log.warn(e));
    } else if (extraTransformer != null) {
      return extraTransformer(file);
    } else {
      return null;
    }
  };
}
/** @internal */


function createElectronCompilerHost(projectDir, cacheDir) {
  const electronCompilePath = path.join(projectDir, "node_modules", "electron-compile", "lib");
  return require(path.join(electronCompilePath, "config-parser")).createCompilerHostFromProjectRoot(projectDir, cacheDir);
}

const ignoredPackageMetadataProperties = new Set(["dist", "gitHead", "keywords", "build", "jspm", "ava", "xo", "nyc", "eslintConfig", "contributors", "bundleDependencies", "tags"]);

function cleanupPackageJson(data, options) {
  const deps = data.dependencies; // https://github.com/electron-userland/electron-builder/issues/507#issuecomment-312772099

  const isRemoveBabel = deps != null && typeof deps === "object" && !Object.getOwnPropertyNames(deps).some(it => it.startsWith("babel"));

  try {
    let changed = false;

    for (const prop of Object.getOwnPropertyNames(data)) {
      // removing devDependencies from package.json breaks levelup in electron, so, remove it only from main package.json
      if (prop[0] === "_" || ignoredPackageMetadataProperties.has(prop) || options.isRemovePackageScripts && prop === "scripts" || options.isMain && prop === "devDependencies" || !options.isMain && prop === "bugs" || isRemoveBabel && prop === "babel") {
        delete data[prop];
        changed = true;
      }
    }

    if (changed) {
      return JSON.stringify(data, null, 2);
    }
  } catch (e) {
    (0, _builderUtil().debug)(e);
  }

  return null;
}

function modifyMainPackageJson(_x, _x2, _x3) {
  return _modifyMainPackageJson.apply(this, arguments);
} function _modifyMainPackageJson() {
  _modifyMainPackageJson = (0, _bluebirdLst().coroutine)(function* (file, extraMetadata, isRemovePackageScripts) {
    const mainPackageData = JSON.parse((yield (0, _fsExtraP().readFile)(file, "utf-8")));

    if (extraMetadata != null) {
      (0, _builderUtil().deepAssign)(mainPackageData, extraMetadata);
    } // https://github.com/electron-userland/electron-builder/issues/1212


    const serializedDataIfChanged = cleanupPackageJson(mainPackageData, {
      isMain: true,
      isRemovePackageScripts
    });

    if (serializedDataIfChanged != null) {
      return serializedDataIfChanged;
    } else if (extraMetadata != null) {
      return JSON.stringify(mainPackageData, null, 2);
    }

    return null;
  });
  return _modifyMainPackageJson.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=fileTransformer.js.map{"version":3,"sources":["../src/fileTransformer.ts"],"names":[],"mappings":"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","sourcesContent":["import { debug, log, deepAssign } from \"builder-util\"\nimport { FileTransformer } from \"builder-util/out/fs\"\nimport { readFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { Configuration } from \"./configuration\"\nimport { Packager } from \"./packager\"\n\n/** @internal */\nexport const NODE_MODULES_PATTERN = `${path.sep}node_modules${path.sep}`\n\n/** @internal */\nexport function isElectronCompileUsed(info: Packager): boolean {\n  if (info.config.electronCompile != null) {\n    return info.config.electronCompile\n  }\n\n  // if in devDependencies - it means that babel is used for precompilation or for some reason user decided to not use electron-compile for production\n  return hasDep(\"electron-compile\", info)\n}\n\n/** @internal */\nexport function hasDep(name: string, info: Packager) {\n  const deps = info.metadata.dependencies\n  return deps != null && name in deps\n}\n\n/** @internal */\nexport function createTransformer(srcDir: string, configuration: Configuration, extraMetadata: any, extraTransformer: FileTransformer | null): FileTransformer {\n  const mainPackageJson = path.join(srcDir, \"package.json\")\n  const isRemovePackageScripts = configuration.removePackageScripts !== false\n  const packageJson = path.sep + \"package.json\"\n  return file => {\n    if (file === mainPackageJson) {\n      return modifyMainPackageJson(file, extraMetadata, isRemovePackageScripts)\n    }\n\n    if (file.endsWith(packageJson) && file.includes(NODE_MODULES_PATTERN)) {\n      return readFile(file, \"utf-8\")\n        .then(it => cleanupPackageJson(JSON.parse(it), {\n          isMain: false,\n          isRemovePackageScripts,\n        }))\n        .catch(e => log.warn(e))\n    }\n    else if (extraTransformer != null) {\n      return extraTransformer(file)\n    }\n    else {\n      return null\n    }\n  }\n}\n\n/** @internal */\nexport interface CompilerHost {\n  compile(file: string): any\n\n  saveConfiguration(): Promise<any>\n}\n\n/** @internal */\nexport function createElectronCompilerHost(projectDir: string, cacheDir: string): Promise<CompilerHost> {\n  const electronCompilePath = path.join(projectDir, \"node_modules\", \"electron-compile\", \"lib\")\n  return require(path.join(electronCompilePath, \"config-parser\")).createCompilerHostFromProjectRoot(projectDir, cacheDir)\n}\n\nconst ignoredPackageMetadataProperties = new Set([\"dist\", \"gitHead\", \"keywords\", \"build\", \"jspm\", \"ava\", \"xo\", \"nyc\", \"eslintConfig\", \"contributors\", \"bundleDependencies\", \"tags\"])\n\ninterface CleanupPackageFileOptions {\n  readonly isRemovePackageScripts: boolean\n  readonly isMain: boolean\n}\n\nfunction cleanupPackageJson(data: any, options: CleanupPackageFileOptions): any {\n  const deps = data.dependencies\n  // https://github.com/electron-userland/electron-builder/issues/507#issuecomment-312772099\n  const isRemoveBabel = deps != null && typeof deps === \"object\" && !Object.getOwnPropertyNames(deps).some(it => it.startsWith(\"babel\"))\n  try {\n    let changed = false\n    for (const prop of Object.getOwnPropertyNames(data)) {\n      // removing devDependencies from package.json breaks levelup in electron, so, remove it only from main package.json\n      if (prop[0] === \"_\" ||\n        ignoredPackageMetadataProperties.has(prop) ||\n        (options.isRemovePackageScripts && prop === \"scripts\") ||\n        (options.isMain && prop === \"devDependencies\") ||\n        (!options.isMain && prop === \"bugs\") ||\n        (isRemoveBabel && prop === \"babel\")) {\n        delete data[prop]\n        changed = true\n      }\n    }\n\n    if (changed) {\n      return JSON.stringify(data, null, 2)\n    }\n  }\n  catch (e) {\n    debug(e)\n  }\n\n  return null\n}\n\nasync function modifyMainPackageJson(file: string, extraMetadata: any, isRemovePackageScripts: boolean) {\n  const mainPackageData = JSON.parse(await readFile(file, \"utf-8\"))\n  if (extraMetadata != null) {\n    deepAssign(mainPackageData, extraMetadata)\n  }\n\n  // https://github.com/electron-userland/electron-builder/issues/1212\n  const serializedDataIfChanged = cleanupPackageJson(mainPackageData, {\n    isMain: true,\n    isRemovePackageScripts,\n  })\n  if (serializedDataIfChanged != null) {\n    return serializedDataIfChanged\n  }\n  else if (extraMetadata != null) {\n    return JSON.stringify(mainPackageData, null, 2)\n  }\n  return null\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.buildForge = buildForge;

var path = _interopRequireWildcard(require("path"));

function _index() {
  const data = require("./index");

  _index = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function buildForge(forgeOptions, options) {
  const appDir = forgeOptions.dir;
  return (0, _index().build)(Object.assign({
    prepackaged: appDir,
    config: {
      directories: {
        // https://github.com/electron-userland/electron-forge/blob/master/src/makers/generic/zip.js
        output: path.resolve(appDir, "..", "make")
      }
    }
  }, options));
} 
// __ts-babel@6.0.4
//# sourceMappingURL=forge-maker.js.map{"version":3,"sources":["../src/forge-maker.ts"],"names":[],"mappings":";;;;;;;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAOM,SAAU,UAAV,CAAqB,YAArB,EAAiD,OAAjD,EAAyE;AAC7E,QAAM,MAAM,GAAG,YAAY,CAAC,GAA5B;AACA,SAAO,oBAAK,MAAA,CAAA,MAAA,CAAA;AACV,IAAA,WAAW,EAAE,MADH;AAEV,IAAA,MAAM,EAAE;AACN,MAAA,WAAW,EAAE;AACX;AACA,QAAA,MAAM,EAAE,IAAI,CAAC,OAAL,CAAa,MAAb,EAAqB,IAArB,EAA2B,MAA3B;AAFG;AADP;AAFE,GAAA,EAQP,OARO,CAAL,CAAP;AAUD,C","sourcesContent":["import * as path from \"path\"\nimport { build } from \"./index\"\nimport { PackagerOptions } from \"./packagerApi\"\n\nexport interface ForgeOptions {\n  readonly dir: string\n}\n\nexport function buildForge(forgeOptions: ForgeOptions, options: PackagerOptions) {\n  const appDir = forgeOptions.dir\n  return build({\n    prepackaged: appDir,\n    config: {\n      directories: {\n        // https://github.com/electron-userland/electron-forge/blob/master/src/makers/generic/zip.js\n        output: path.resolve(appDir, \"..\", \"make\"),\n      },\n    },\n    ...options\n  })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.checkBuildRequestOptions = checkBuildRequestOptions;
exports.build = build;
Object.defineProperty(exports, "getArchSuffix", {
  enumerable: true,
  get: function () {
    return _builderUtil().getArchSuffix;
  }
});
Object.defineProperty(exports, "Arch", {
  enumerable: true,
  get: function () {
    return _builderUtil().Arch;
  }
});
Object.defineProperty(exports, "archFromString", {
  enumerable: true,
  get: function () {
    return _builderUtil().archFromString;
  }
});
Object.defineProperty(exports, "CancellationToken", {
  enumerable: true,
  get: function () {
    return _builderUtilRuntime().CancellationToken;
  }
});
Object.defineProperty(exports, "Packager", {
  enumerable: true,
  get: function () {
    return _packager().Packager;
  }
});
Object.defineProperty(exports, "PlatformPackager", {
  enumerable: true,
  get: function () {
    return _platformPackager().PlatformPackager;
  }
});
Object.defineProperty(exports, "PublishManager", {
  enumerable: true,
  get: function () {
    return _PublishManager().PublishManager;
  }
});
Object.defineProperty(exports, "Platform", {
  enumerable: true,
  get: function () {
    return _core().Platform;
  }
});
Object.defineProperty(exports, "Target", {
  enumerable: true,
  get: function () {
    return _core().Target;
  }
});
Object.defineProperty(exports, "DIR_TARGET", {
  enumerable: true,
  get: function () {
    return _core().DIR_TARGET;
  }
});
Object.defineProperty(exports, "DEFAULT_TARGET", {
  enumerable: true,
  get: function () {
    return _core().DEFAULT_TARGET;
  }
});
Object.defineProperty(exports, "AppInfo", {
  enumerable: true,
  get: function () {
    return _appInfo().AppInfo;
  }
});
Object.defineProperty(exports, "buildForge", {
  enumerable: true,
  get: function () {
    return _forgeMaker().buildForge;
  }
});

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _packager() {
  const data = require("./packager");

  _packager = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("./platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _PublishManager() {
  const data = require("./publish/PublishManager");

  _PublishManager = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("./core");

  _core = function () {
    return data;
  };

  return data;
}

function _appInfo() {
  const data = require("./appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _forgeMaker() {
  const data = require("./forge-maker");

  _forgeMaker = function () {
    return data;
  };

  return data;
}

const expectedOptions = new Set(["publish", "targets", "mac", "win", "linux", "projectDir", "platformPackagerFactory", "config", "effectiveOptionComputed", "prepackaged"]);

function checkBuildRequestOptions(options) {
  for (const optionName of Object.keys(options)) {
    if (!expectedOptions.has(optionName) && options[optionName] !== undefined) {
      throw new (_builderUtil().InvalidConfigurationError)(`Unknown option "${optionName}"`);
    }
  }
}

function build(options, packager = new (_packager().Packager)(options)) {
  checkBuildRequestOptions(options);
  const publishManager = new (_PublishManager().PublishManager)(packager, options);

  const sigIntHandler = () => {
    _builderUtil().log.warn("cancelled by SIGINT");

    packager.cancellationToken.cancel();
    publishManager.cancelTasks();
  };

  process.once("SIGINT", sigIntHandler);
  const promise = packager.build().then(
  /*#__PURE__*/
  function () {
    var _ref = (0, _bluebirdLst().coroutine)(function* (buildResult) {
      const afterAllArtifactBuild = (0, _platformPackager().resolveFunction)(buildResult.configuration.afterAllArtifactBuild, "afterAllArtifactBuild");

      if (afterAllArtifactBuild != null) {
        const newArtifacts = (0, _builderUtilRuntime().asArray)((yield Promise.resolve(afterAllArtifactBuild(buildResult))));

        if (newArtifacts.length === 0 || !publishManager.isPublish) {
          return buildResult.artifactPaths;
        }

        const publishConfigurations = yield publishManager.getGlobalPublishConfigurations();

        if (publishConfigurations == null || publishConfigurations.length === 0) {
          return buildResult.artifactPaths;
        }

        for (const newArtifact of newArtifacts) {
          buildResult.artifactPaths.push(newArtifact);

          for (const publishConfiguration of publishConfigurations) {
            publishManager.scheduleUpload(publishConfiguration, {
              file: newArtifact,
              arch: null
            }, packager.appInfo);
          }
        }
      }

      return buildResult.artifactPaths;
    });

    return function (_x) {
      return _ref.apply(this, arguments);
    };
  }());
  return (0, _promise().executeFinally)(promise, isErrorOccurred => {
    let promise;

    if (isErrorOccurred) {
      publishManager.cancelTasks();
      promise = Promise.resolve(null);
    } else {
      promise = publishManager.awaitTasks();
    }

    return promise.then(() => process.removeListener("SIGINT", sigIntHandler));
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=index.js.map{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { executeFinally } from \"builder-util/out/promise\"\nimport { PublishOptions } from \"electron-publish/out/publisher\"\nimport { log, InvalidConfigurationError } from \"builder-util\"\nimport { asArray } from \"builder-util-runtime\"\nimport { Packager } from \"./packager\"\nimport { PackagerOptions } from \"./packagerApi\"\nimport { resolveFunction } from \"./platformPackager\"\nimport { PublishManager } from \"./publish/PublishManager\"\n\nexport { Packager, BuildResult } from \"./packager\"\nexport { PackagerOptions, ArtifactCreated, ArtifactBuildStarted } from \"./packagerApi\"\nexport { TargetConfiguration, Platform, Target, DIR_TARGET, BeforeBuildContext, SourceRepositoryInfo, TargetSpecificOptions, TargetConfigType, DEFAULT_TARGET, CompressionLevel } from \"./core\"\nexport { getArchSuffix, Arch, archFromString } from \"builder-util\"\nexport { Configuration, AfterPackContext, MetadataDirectories } from \"./configuration\"\nexport { ElectronDownloadOptions, ElectronPlatformName } from \"./electron/ElectronFramework\"\nexport { PlatformSpecificBuildOptions, AsarOptions, FileSet, Protocol, ReleaseInfo } from \"./options/PlatformSpecificBuildOptions\"\nexport { FileAssociation } from \"./options/FileAssociation\"\nexport { MacConfiguration, DmgOptions, MasConfiguration, MacOsTargetName, DmgContent, DmgWindow } from \"./options/macOptions\"\nexport { PkgOptions, PkgBackgroundOptions, BackgroundAlignment, BackgroundScaling } from \"./options/pkgOptions\"\nexport { WindowsConfiguration } from \"./options/winOptions\"\nexport { AppXOptions } from \"./options/AppXOptions\"\nexport { MsiOptions } from \"./options/MsiOptions\"\nexport { CommonWindowsInstallerConfiguration } from \"./options/CommonWindowsInstallerConfiguration\"\nexport { NsisOptions, NsisWebOptions, PortableOptions, CommonNsisOptions } from \"./targets/nsis/nsisOptions\"\nexport { LinuxConfiguration, DebOptions, CommonLinuxOptions, LinuxTargetSpecificOptions, AppImageOptions } from \"./options/linuxOptions\"\nexport { SnapOptions } from \"./options/SnapOptions\"\nexport { Metadata, AuthorMetadata, RepositoryInfo } from \"./options/metadata\"\nexport { AppInfo } from \"./appInfo\"\nexport { SquirrelWindowsOptions } from \"./options/SquirrelWindowsOptions\"\nexport { WindowsSignOptions, CustomWindowsSignTaskConfiguration, WindowsSignTaskConfiguration, CustomWindowsSign, FileCodeSigningInfo, CertificateFromStoreInfo } from \"./codeSign/windowsCodeSign\"\nexport { CancellationToken, ProgressInfo } from \"builder-util-runtime\"\nexport { PublishOptions, UploadTask } from \"electron-publish\"\nexport { PublishManager } from \"./publish/PublishManager\"\nexport { PlatformPackager } from \"./platformPackager\"\nexport { Framework, PrepareApplicationStageDirectoryOptions } from \"./Framework\"\nexport { buildForge, ForgeOptions } from \"./forge-maker\"\n\nconst expectedOptions = new Set([\"publish\", \"targets\", \"mac\", \"win\", \"linux\", \"projectDir\", \"platformPackagerFactory\", \"config\", \"effectiveOptionComputed\", \"prepackaged\"])\n\nexport function checkBuildRequestOptions(options: PackagerOptions & PublishOptions) {\n  for (const optionName of Object.keys(options)) {\n    if (!expectedOptions.has(optionName) && (options as any)[optionName] !== undefined) {\n      throw new InvalidConfigurationError(`Unknown option \"${optionName}\"`)\n    }\n  }\n}\n\nexport function build(options: PackagerOptions & PublishOptions, packager: Packager = new Packager(options)): Promise<Array<string>> {\n  checkBuildRequestOptions(options)\n\n  const publishManager = new PublishManager(packager, options)\n  const sigIntHandler = () => {\n    log.warn(\"cancelled by SIGINT\")\n    packager.cancellationToken.cancel()\n    publishManager.cancelTasks()\n  }\n  process.once(\"SIGINT\", sigIntHandler)\n\n  const promise = packager.build()\n    .then(async buildResult => {\n      const afterAllArtifactBuild = resolveFunction(buildResult.configuration.afterAllArtifactBuild, \"afterAllArtifactBuild\")\n      if (afterAllArtifactBuild != null) {\n        const newArtifacts = asArray(await Promise.resolve(afterAllArtifactBuild(buildResult)))\n        if (newArtifacts.length === 0 || !publishManager.isPublish) {\n          return buildResult.artifactPaths\n        }\n\n        const publishConfigurations = await publishManager.getGlobalPublishConfigurations()\n        if (publishConfigurations == null || publishConfigurations.length === 0) {\n          return buildResult.artifactPaths\n        }\n\n        for (const newArtifact of newArtifacts) {\n          buildResult.artifactPaths.push(newArtifact)\n          for (const publishConfiguration of publishConfigurations) {\n            publishManager.scheduleUpload(publishConfiguration, {\n              file: newArtifact,\n              arch: null\n            }, packager.appInfo)\n          }\n        }\n      }\n      return buildResult.artifactPaths\n    })\n\n  return executeFinally(promise, isErrorOccurred => {\n    let promise: Promise<any>\n    if (isErrorOccurred) {\n      publishManager.cancelTasks()\n      promise = Promise.resolve(null)\n    }\n    else {\n      promise = publishManager.awaitTasks()\n    }\n\n    return promise\n      .then(() => process.removeListener(\"SIGINT\", sigIntHandler))\n  })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.toAppImageOrSnapArch = toAppImageOrSnapArch;
exports.LinuxPackager = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _sanitizeFilename() {
  const data = _interopRequireDefault(require("sanitize-filename"));

  _sanitizeFilename = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("./core");

  _core = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("./platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _RemoteBuilder() {
  const data = require("./remoteBuilder/RemoteBuilder");

  _RemoteBuilder = function () {
    return data;
  };

  return data;
}

function _LinuxTargetHelper() {
  const data = require("./targets/LinuxTargetHelper");

  _LinuxTargetHelper = function () {
    return data;
  };

  return data;
}

function _targetFactory() {
  const data = require("./targets/targetFactory");

  _targetFactory = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

class LinuxPackager extends _platformPackager().PlatformPackager {
  constructor(info) {
    super(info, _core().Platform.LINUX);
    const executableName = this.platformSpecificBuildOptions.executableName;
    this.executableName = executableName == null ? this.appInfo.sanitizedName.toLowerCase() : (0, _sanitizeFilename().default)(executableName);
  }

  get defaultTarget() {
    // on Windows default target is only Snap - reduce build server load, and... snap in most cases is fully enough.
    return process.platform === "win32" ? ["snap"] : ["snap", "appimage"];
  }

  createTargets(targets, mapper) {
    let helper;

    const getHelper = () => {
      if (helper == null) {
        helper = new (_LinuxTargetHelper().LinuxTargetHelper)(this);
      }

      return helper;
    };

    let remoteBuilder = null;

    for (const name of targets) {
      if (name === _core().DIR_TARGET) {
        continue;
      }

      const targetClass = (() => {
        switch (name) {
          case "appimage":
            return require("./targets/AppImageTarget").default;

          case "snap":
            return require("./targets/snap").default;

          case "deb":
          case "rpm":
          case "sh":
          case "freebsd":
          case "pacman":
          case "apk":
          case "p5p":
            return require("./targets/fpm").default;

          default:
            return null;
        }
      })();

      mapper(name, outDir => {
        if (targetClass === null) {
          return (0, _targetFactory().createCommonTarget)(name, outDir, this);
        }

        const target = new targetClass(name, this, getHelper(), outDir);

        if (process.platform === "win32" || process.env._REMOTE_BUILD) {
          if (remoteBuilder == null) {
            remoteBuilder = new (_RemoteBuilder().RemoteBuilder)(this);
          } // return remoteBuilder.buildTarget(this, arch, appOutDir, this.packager)


          return new RemoteTarget(target, remoteBuilder);
        }

        return target;
      });
    }
  }

}

exports.LinuxPackager = LinuxPackager;

class RemoteTarget extends _core().Target {
  constructor(target, remoteBuilder) {
    super(target.name, true
    /* all must be scheduled in time (so, on finishBuild RemoteBuilder will have all targets added - so, we must set isAsyncSupported to true (resolved promise is returned)) */
    );
    this.target = target;
    this.remoteBuilder = remoteBuilder;
    this.buildTaskManager = new (_builderUtil().AsyncTaskManager)(this.remoteBuilder.packager.info.cancellationToken);
  }

  get options() {
    return this.target.options;
  }

  get outDir() {
    return this.target.outDir;
  }

  finishBuild() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield _this.buildTaskManager.awaitTasks();
      yield _this.remoteBuilder.build();
    })();
  }

  build(appOutDir, arch) {
    const promise = this.doBuild(appOutDir, arch);
    this.buildTaskManager.addTask(promise);
    return promise;
  }

  doBuild(appOutDir, arch) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      _builderUtil().log.info({
        target: _this2.target.name,
        arch: _builderUtil().Arch[arch]
      }, "scheduling remote build");

      yield _this2.target.checkOptions();

      _this2.remoteBuilder.scheduleBuild(_this2.target, arch, appOutDir);
    })();
  }

}

function toAppImageOrSnapArch(arch) {
  switch (arch) {
    case _builderUtil().Arch.x64:
      return "x86_64";

    case _builderUtil().Arch.ia32:
      return "i386";

    case _builderUtil().Arch.armv7l:
      return "arm";

    case _builderUtil().Arch.arm64:
      return "arm_aarch64";

    default:
      throw new Error(`Unsupported arch ${arch}`);
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=linuxPackager.js.map{"version":3,"sources":["../src/linuxPackager.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, AsyncTaskManager, log } from \"builder-util\"\nimport sanitizeFileName from \"sanitize-filename\"\nimport { DIR_TARGET, Platform, Target, TargetSpecificOptions } from \"./core\"\nimport { LinuxConfiguration } from \"./options/linuxOptions\"\nimport { Packager } from \"./packager\"\nimport { PlatformPackager } from \"./platformPackager\"\nimport { RemoteBuilder } from \"./remoteBuilder/RemoteBuilder\"\nimport AppImageTarget from \"./targets/AppImageTarget\"\nimport FpmTarget from \"./targets/fpm\"\nimport { LinuxTargetHelper } from \"./targets/LinuxTargetHelper\"\nimport SnapTarget from \"./targets/snap\"\nimport { createCommonTarget } from \"./targets/targetFactory\"\n\nexport class LinuxPackager extends PlatformPackager<LinuxConfiguration> {\n  readonly executableName: string\n\n  constructor(info: Packager) {\n    super(info, Platform.LINUX)\n\n    const executableName = this.platformSpecificBuildOptions.executableName\n    this.executableName = executableName == null ? this.appInfo.sanitizedName.toLowerCase() : sanitizeFileName(executableName)\n  }\n\n  get defaultTarget(): Array<string> {\n    // on Windows default target is only Snap - reduce build server load, and... snap in most cases is fully enough.\n    return process.platform === \"win32\" ? [\"snap\"] : [\"snap\", \"appimage\"]\n  }\n\n  createTargets(targets: Array<string>, mapper: (name: string, factory: (outDir: string) => Target) => void): void {\n    let helper: LinuxTargetHelper | null\n    const getHelper = () => {\n      if (helper == null) {\n        helper = new LinuxTargetHelper(this)\n      }\n      return helper\n    }\n\n    let remoteBuilder: RemoteBuilder | null = null\n\n    for (const name of targets) {\n      if (name === DIR_TARGET) {\n        continue\n      }\n\n      const targetClass: typeof AppImageTarget | typeof SnapTarget | typeof FpmTarget | null = (() => {\n        switch (name) {\n          case \"appimage\":\n            return require(\"./targets/AppImageTarget\").default\n          case \"snap\":\n            return require(\"./targets/snap\").default\n          case \"deb\":\n          case \"rpm\":\n          case \"sh\":\n          case \"freebsd\":\n          case \"pacman\":\n          case \"apk\":\n          case \"p5p\":\n            return require(\"./targets/fpm\").default\n          default:\n            return null\n        }\n      })()\n\n      mapper(name, outDir => {\n        if (targetClass === null) {\n          return createCommonTarget(name, outDir, this)\n        }\n\n        const target = new targetClass(name, this, getHelper(), outDir)\n        if (process.platform === \"win32\" || process.env._REMOTE_BUILD) {\n          if (remoteBuilder == null) {\n            remoteBuilder = new RemoteBuilder(this)\n          }\n          // return remoteBuilder.buildTarget(this, arch, appOutDir, this.packager)\n          return new RemoteTarget(target, remoteBuilder)\n        }\n        return target\n      })\n    }\n  }\n}\n\nclass RemoteTarget extends Target {\n  private buildTaskManager = new AsyncTaskManager(this.remoteBuilder.packager.info.cancellationToken)\n\n  get options(): TargetSpecificOptions | null | undefined {\n    return this.target.options\n  }\n\n  get outDir(): string {\n    return this.target.outDir\n  }\n\n  constructor(private readonly target: Target, private readonly remoteBuilder: RemoteBuilder) {\n    super(target.name, true /* all must be scheduled in time (so, on finishBuild RemoteBuilder will have all targets added - so, we must set isAsyncSupported to true (resolved promise is returned)) */)\n  }\n\n  async finishBuild() {\n    await this.buildTaskManager.awaitTasks()\n    await this.remoteBuilder.build()\n  }\n\n  build(appOutDir: string, arch: Arch) {\n    const promise = this.doBuild(appOutDir, arch)\n    this.buildTaskManager.addTask(promise)\n    return promise\n  }\n\n  private async doBuild(appOutDir: string, arch: Arch) {\n    log.info({target: this.target.name, arch: Arch[arch]}, \"scheduling remote build\")\n    await this.target.checkOptions()\n    this.remoteBuilder.scheduleBuild(this.target, arch, appOutDir)\n  }\n}\n\nexport function toAppImageOrSnapArch(arch: Arch): string {\n  switch (arch) {\n    case Arch.x64:\n      return \"x86_64\"\n    case Arch.ia32:\n      return \"i386\"\n    case Arch.armv7l:\n      return \"arm\"\n    case Arch.arm64:\n      return \"arm_aarch64\"\n\n    default:\n      throw new Error(`Unsupported arch ${arch}`)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _electronOsxSign() {
  const data = require("electron-osx-sign");

  _electronOsxSign = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _appInfo() {
  const data = require("./appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _macCodeSign() {
  const data = require("./codeSign/macCodeSign");

  _macCodeSign = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("./core");

  _core = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("./platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _ArchiveTarget() {
  const data = require("./targets/ArchiveTarget");

  _ArchiveTarget = function () {
    return data;
  };

  return data;
}

function _pkg() {
  const data = require("./targets/pkg");

  _pkg = function () {
    return data;
  };

  return data;
}

function _targetFactory() {
  const data = require("./targets/targetFactory");

  _targetFactory = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class MacPackager extends _platformPackager().PlatformPackager {
  constructor(info) {
    super(info, _core().Platform.MAC);
    this.codeSigningInfo = new (_lazyVal().Lazy)(() => {
      const cscLink = this.getCscLink();

      if (cscLink == null || process.platform !== "darwin") {
        return Promise.resolve({
          keychainName: process.env.CSC_KEYCHAIN || null
        });
      }

      return (0, _macCodeSign().createKeychain)({
        tmpDir: this.info.tempDirManager,
        cscLink,
        cscKeyPassword: this.getCscPassword(),
        cscILink: (0, _platformPackager().chooseNotNull)(this.platformSpecificBuildOptions.cscInstallerLink, process.env.CSC_INSTALLER_LINK),
        cscIKeyPassword: (0, _platformPackager().chooseNotNull)(this.platformSpecificBuildOptions.cscInstallerKeyPassword, process.env.CSC_INSTALLER_KEY_PASSWORD),
        currentDir: this.projectDir
      });
    });
    this._iconPath = new (_lazyVal().Lazy)(() => this.getOrConvertIcon("icns"));
  }

  get defaultTarget() {
    return this.info.framework.macOsDefaultTargets;
  }

  prepareAppInfo(appInfo) {
    return new (_appInfo().AppInfo)(this.info, this.platformSpecificBuildOptions.bundleVersion, this.platformSpecificBuildOptions);
  }

  getIconPath() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      return _this._iconPath.value;
    })();
  }

  createTargets(targets, mapper) {
    for (const name of targets) {
      switch (name) {
        case _core().DIR_TARGET:
          break;

        case "dmg":
          const {
            DmgTarget
          } = require("dmg-builder");

          mapper(name, outDir => new DmgTarget(this, outDir));
          break;

        case "zip":
          // https://github.com/electron-userland/electron-builder/issues/2313
          mapper(name, outDir => new (_ArchiveTarget().ArchiveTarget)(name, outDir, this, true));
          break;

        case "pkg":
          mapper(name, outDir => new (_pkg().PkgTarget)(this, outDir));
          break;

        default:
          mapper(name, outDir => name === "mas" || name === "mas-dev" ? new (_targetFactory().NoOpTarget)(name) : (0, _targetFactory().createCommonTarget)(name, outDir, this));
          break;
      }
    }
  }

  pack(outDir, arch, targets, taskManager) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      let nonMasPromise = null;
      const hasMas = targets.length !== 0 && targets.some(it => it.name === "mas" || it.name === "mas-dev");
      const prepackaged = _this2.packagerOptions.prepackaged;

      if (!hasMas || targets.length > 1) {
        const appPath = prepackaged == null ? path.join(_this2.computeAppOutDir(outDir, arch), `${_this2.appInfo.productFilename}.app`) : prepackaged;
        nonMasPromise = (prepackaged ? Promise.resolve() : _this2.doPack(outDir, path.dirname(appPath), _this2.platform.nodeName, arch, _this2.platformSpecificBuildOptions, targets)).then(() => _this2.packageInDistributableFormat(appPath, _builderUtil().Arch.x64, targets, taskManager));
      }

      for (const target of targets) {
        const targetName = target.name;

        if (!(targetName === "mas" || targetName === "mas-dev")) {
          continue;
        }

        const masBuildOptions = (0, _builderUtil().deepAssign)({}, _this2.platformSpecificBuildOptions, _this2.config.mas);

        if (targetName === "mas-dev") {
          (0, _builderUtil().deepAssign)(masBuildOptions, _this2.config[targetName], {
            type: "development"
          });
        }

        const targetOutDir = path.join(outDir, targetName);

        if (prepackaged == null) {
          yield _this2.doPack(outDir, targetOutDir, "mas", arch, masBuildOptions, [target]);
          yield _this2.sign(path.join(targetOutDir, `${_this2.appInfo.productFilename}.app`), targetOutDir, masBuildOptions);
        } else {
          yield _this2.sign(prepackaged, targetOutDir, masBuildOptions);
        }
      }

      if (nonMasPromise != null) {
        yield nonMasPromise;
      }
    })();
  }

  sign(appPath, outDir, masOptions) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (!(0, _macCodeSign().isSignAllowed)()) {
        return;
      }

      const isMas = masOptions != null;
      const macOptions = _this3.platformSpecificBuildOptions;
      const qualifier = (isMas ? masOptions.identity : null) || macOptions.identity;

      if (!isMas && qualifier === null) {
        if (_this3.forceCodeSigning) {
          throw new (_builderUtil().InvalidConfigurationError)("identity explicitly is set to null, but forceCodeSigning is set to true");
        }

        _builderUtil().log.info({
          reason: "identity explicitly is set to null"
        }, "skipped macOS code signing");

        return;
      }

      const keychainName = (yield _this3.codeSigningInfo.value).keychainName;
      const explicitType = isMas ? masOptions.type : macOptions.type;
      const type = explicitType || "distribution";
      const isDevelopment = type === "development";
      const certificateType = getCertificateType(isMas, isDevelopment);
      let identity = yield (0, _macCodeSign().findIdentity)(certificateType, qualifier, keychainName);

      if (identity == null) {
        if (!isMas && !isDevelopment && explicitType !== "distribution") {
          identity = yield (0, _macCodeSign().findIdentity)("Mac Developer", qualifier, keychainName);

          if (identity != null) {
            _builderUtil().log.warn("Mac Developer is used to sign app â€” it is only for development and testing, not for production");
          }
        }

        if (identity == null) {
          yield (0, _macCodeSign().reportError)(isMas, certificateType, qualifier, keychainName, _this3.forceCodeSigning);
          return;
        }
      }

      const signOptions = {
        "identity-validation": false,
        // https://github.com/electron-userland/electron-builder/issues/1699
        // kext are signed by the chipset manufacturers. You need a special certificate (only available on request) from Apple to be able to sign kext.
        ignore: file => {
          return file.endsWith(".kext") || file.startsWith("/Contents/PlugIns", appPath.length) || // https://github.com/electron-userland/electron-builder/issues/2010
          file.includes("/node_modules/puppeteer/.local-chromium");
        },
        identity: identity,
        type,
        platform: isMas ? "mas" : "darwin",
        version: _this3.config.electronVersion,
        app: appPath,
        keychain: keychainName || undefined,
        binaries: (isMas && masOptions != null ? masOptions.binaries : macOptions.binaries) || undefined,
        requirements: isMas || macOptions.requirements == null ? undefined : yield _this3.getResource(macOptions.requirements),
        // https://github.com/electron-userland/electron-osx-sign/issues/196
        // will fail on 10.14.5+ because a signed but unnotarized app is also rejected.
        "gatekeeper-assess": macOptions.gatekeeperAssess,
        "hardened-runtime": macOptions.hardenedRuntime
      };
      yield _this3.adjustSignOptions(signOptions, masOptions);

      _builderUtil().log.info({
        file: _builderUtil().log.filePath(appPath),
        identityName: identity.name,
        identityHash: identity.hash,
        provisioningProfile: signOptions["provisioning-profile"] || "none"
      }, "signing");

      yield _this3.doSign(signOptions); // https://github.com/electron-userland/electron-builder/issues/1196#issuecomment-312310209

      if (masOptions != null && !isDevelopment) {
        const certType = isDevelopment ? "Mac Developer" : "3rd Party Mac Developer Installer";
        const masInstallerIdentity = yield (0, _macCodeSign().findIdentity)(certType, masOptions.identity, keychainName);

        if (masInstallerIdentity == null) {
          throw new (_builderUtil().InvalidConfigurationError)(`Cannot find valid "${certType}" identity to sign MAS installer, please see https://electron.build/code-signing`);
        } // mas uploaded to AppStore, so, use "-" instead of space for name


        const artifactName = _this3.expandArtifactNamePattern(masOptions, "pkg");

        const artifactPath = path.join(outDir, artifactName);
        yield _this3.doFlat(appPath, artifactPath, masInstallerIdentity, keychainName);
        yield _this3.dispatchArtifactCreated(artifactPath, null, _builderUtil().Arch.x64, _this3.computeSafeArtifactName(artifactName, "pkg"));
      }
    })();
  }

  adjustSignOptions(signOptions, masOptions) {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const resourceList = yield _this4.resourceList;

      if (resourceList.includes(`entitlements.osx.plist`)) {
        throw new (_builderUtil().InvalidConfigurationError)("entitlements.osx.plist is deprecated name, please use entitlements.mac.plist");
      }

      if (resourceList.includes(`entitlements.osx.inherit.plist`)) {
        throw new (_builderUtil().InvalidConfigurationError)("entitlements.osx.inherit.plist is deprecated name, please use entitlements.mac.inherit.plist");
      }

      const customSignOptions = masOptions || _this4.platformSpecificBuildOptions;
      const entitlementsSuffix = masOptions == null ? "mac" : "mas";

      if (customSignOptions.entitlements == null) {
        const p = `entitlements.${entitlementsSuffix}.plist`;

        if (resourceList.includes(p)) {
          signOptions.entitlements = path.join(_this4.info.buildResourcesDir, p);
        }
      } else {
        signOptions.entitlements = customSignOptions.entitlements;
      }

      if (customSignOptions.entitlementsInherit == null) {
        const p = `entitlements.${entitlementsSuffix}.inherit.plist`;

        if (resourceList.includes(p)) {
          signOptions["entitlements-inherit"] = path.join(_this4.info.buildResourcesDir, p);
        }
      } else {
        signOptions["entitlements-inherit"] = customSignOptions.entitlementsInherit;
      }

      if (customSignOptions.provisioningProfile != null) {
        signOptions["provisioning-profile"] = customSignOptions.provisioningProfile;
      }
    })();
  } //noinspection JSMethodCanBeStatic


  doSign(opts) {
    return (0, _bluebirdLst().coroutine)(function* () {
      return (0, _electronOsxSign().signAsync)(opts);
    })();
  } //noinspection JSMethodCanBeStatic


  doFlat(appPath, outFile, identity, keychain) {
    return (0, _bluebirdLst().coroutine)(function* () {
      // productbuild doesn't created directory for out file
      yield (0, _fsExtraP().ensureDir)(path.dirname(outFile));
      const args = (0, _pkg().prepareProductBuildArgs)(identity, keychain);
      args.push("--component", appPath, "/Applications");
      args.push(outFile);
      return yield (0, _builderUtil().exec)("productbuild", args);
    })();
  }

  getElectronSrcDir(dist) {
    return path.resolve(this.projectDir, dist, this.info.framework.distMacOsAppName);
  }

  getElectronDestinationDir(appOutDir) {
    return path.join(appOutDir, this.info.framework.distMacOsAppName);
  } // todo fileAssociations


  applyCommonInfo(appPlist, contentsPath) {
    var _this5 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appInfo = _this5.appInfo;
      const appFilename = appInfo.productFilename; // https://github.com/electron-userland/electron-builder/issues/1278

      appPlist.CFBundleExecutable = appFilename.endsWith(" Helper") ? appFilename.substring(0, appFilename.length - " Helper".length) : appFilename;
      const icon = yield _this5.getIconPath();

      if (icon != null) {
        const oldIcon = appPlist.CFBundleIconFile;
        const resourcesPath = path.join(contentsPath, "Resources");

        if (oldIcon != null) {
          yield (0, _fs().unlinkIfExists)(path.join(resourcesPath, oldIcon));
        }

        const iconFileName = `${appFilename}.icns`;
        appPlist.CFBundleIconFile = iconFileName;
        yield (0, _fs().copyFile)(icon, path.join(resourcesPath, iconFileName));
      }

      appPlist.CFBundleName = appInfo.productName;
      appPlist.CFBundleDisplayName = appInfo.productName;
      const minimumSystemVersion = _this5.platformSpecificBuildOptions.minimumSystemVersion;

      if (minimumSystemVersion != null) {
        appPlist.LSMinimumSystemVersion = minimumSystemVersion;
      }

      appPlist.CFBundleIdentifier = appInfo.macBundleIdentifier;
      appPlist.CFBundleShortVersionString = _this5.platformSpecificBuildOptions.bundleShortVersion || appInfo.version;
      appPlist.CFBundleVersion = appInfo.buildVersion;
      (0, _builderUtil().use)(_this5.platformSpecificBuildOptions.category || _this5.config.category, it => appPlist.LSApplicationCategoryType = it);
      appPlist.NSHumanReadableCopyright = appInfo.copyright;

      if (_this5.platformSpecificBuildOptions.darkModeSupport) {
        appPlist.NSRequiresAquaSystemAppearance = false;
      }

      const extendInfo = _this5.platformSpecificBuildOptions.extendInfo;

      if (extendInfo != null) {
        Object.assign(appPlist, extendInfo);
      }
    })();
  }

  signApp(packContext, isAsar) {
    var _this6 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appFileName = `${_this6.appInfo.productFilename}.app`;
      yield _bluebirdLst().default.map((0, _fsExtraP().readdir)(packContext.appOutDir), file => {
        if (file === appFileName) {
          return _this6.sign(path.join(packContext.appOutDir, file), null, null);
        }

        return null;
      });

      if (!isAsar) {
        return;
      }

      const outResourcesDir = path.join(packContext.appOutDir, "resources", "app.asar.unpacked");
      yield _bluebirdLst().default.map((0, _promise().orIfFileNotExist)((0, _fsExtraP().readdir)(outResourcesDir), []), file => {
        if (file.endsWith(".app")) {
          return _this6.sign(path.join(outResourcesDir, file), null, null);
        } else {
          return null;
        }
      });
    })();
  }

}

exports.default = MacPackager;

function getCertificateType(isMas, isDevelopment) {
  if (isDevelopment) {
    return "Mac Developer";
  }

  return isMas ? "3rd Party Mac Developer Application" : "Developer ID Application";
} 
// __ts-babel@6.0.4
//# sourceMappingURL=macPackager.js.map{"version":3,"sources":["../src/macPackager.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { deepAssign, Arch, AsyncTaskManager, exec, InvalidConfigurationError, log, use } from \"builder-util\"\nimport { signAsync, SignOptions } from \"electron-osx-sign\"\nimport { ensureDir, readdir } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { copyFile, unlinkIfExists } from \"builder-util/out/fs\"\nimport { orIfFileNotExist } from \"builder-util/out/promise\"\nimport { AppInfo } from \"./appInfo\"\nimport { CertType, CodeSigningInfo, createKeychain, findIdentity, Identity, isSignAllowed, reportError } from \"./codeSign/macCodeSign\"\nimport { DIR_TARGET, Platform, Target } from \"./core\"\nimport { AfterPackContext, ElectronPlatformName } from \"./index\"\nimport { MacConfiguration, MasConfiguration } from \"./options/macOptions\"\nimport { Packager } from \"./packager\"\nimport { chooseNotNull, PlatformPackager } from \"./platformPackager\"\nimport { ArchiveTarget } from \"./targets/ArchiveTarget\"\nimport { PkgTarget, prepareProductBuildArgs } from \"./targets/pkg\"\nimport { createCommonTarget, NoOpTarget } from \"./targets/targetFactory\"\n\nexport default class MacPackager extends PlatformPackager<MacConfiguration> {\n  readonly codeSigningInfo = new Lazy<CodeSigningInfo>(() => {\n    const cscLink = this.getCscLink()\n    if (cscLink == null || process.platform !== \"darwin\") {\n      return Promise.resolve({keychainName: process.env.CSC_KEYCHAIN || null})\n    }\n\n    return createKeychain({\n      tmpDir: this.info.tempDirManager,\n      cscLink,\n      cscKeyPassword: this.getCscPassword(),\n      cscILink: chooseNotNull(this.platformSpecificBuildOptions.cscInstallerLink, process.env.CSC_INSTALLER_LINK),\n      cscIKeyPassword: chooseNotNull(this.platformSpecificBuildOptions.cscInstallerKeyPassword, process.env.CSC_INSTALLER_KEY_PASSWORD),\n      currentDir: this.projectDir\n    })\n  })\n\n  private _iconPath = new Lazy(() => this.getOrConvertIcon(\"icns\"))\n\n  constructor(info: Packager) {\n    super(info, Platform.MAC)\n  }\n\n  get defaultTarget(): Array<string> {\n    return this.info.framework.macOsDefaultTargets\n  }\n\n  protected prepareAppInfo(appInfo: AppInfo): AppInfo {\n    return new AppInfo(this.info, this.platformSpecificBuildOptions.bundleVersion, this.platformSpecificBuildOptions)\n  }\n\n  async getIconPath(): Promise<string | null> {\n    return this._iconPath.value\n  }\n\n  createTargets(targets: Array<string>, mapper: (name: string, factory: (outDir: string) => Target) => void): void {\n    for (const name of targets) {\n      switch (name) {\n        case DIR_TARGET:\n          break\n\n        case \"dmg\":\n          const { DmgTarget } = require(\"dmg-builder\")\n          mapper(name, outDir => new DmgTarget(this, outDir))\n          break\n\n        case \"zip\":\n          // https://github.com/electron-userland/electron-builder/issues/2313\n          mapper(name, outDir => new ArchiveTarget(name, outDir, this, true))\n          break\n\n        case \"pkg\":\n          mapper(name, outDir => new PkgTarget(this, outDir))\n          break\n\n        default:\n          mapper(name, outDir => name === \"mas\" || name === \"mas-dev\" ? new NoOpTarget(name) : createCommonTarget(name, outDir, this))\n          break\n      }\n    }\n  }\n\n  async pack(outDir: string, arch: Arch, targets: Array<Target>, taskManager: AsyncTaskManager): Promise<any> {\n    let nonMasPromise: Promise<any> | null = null\n\n    const hasMas = targets.length !== 0 && targets.some(it => it.name === \"mas\" || it.name === \"mas-dev\")\n    const prepackaged = this.packagerOptions.prepackaged\n\n    if (!hasMas || targets.length > 1) {\n      const appPath = prepackaged == null ? path.join(this.computeAppOutDir(outDir, arch), `${this.appInfo.productFilename}.app`) : prepackaged\n      nonMasPromise = (prepackaged ? Promise.resolve() : this.doPack(outDir, path.dirname(appPath), this.platform.nodeName as ElectronPlatformName, arch, this.platformSpecificBuildOptions, targets))\n        .then(() => this.packageInDistributableFormat(appPath, Arch.x64, targets, taskManager))\n    }\n\n    for (const target of targets) {\n      const targetName = target.name\n      if (!(targetName === \"mas\" || targetName === \"mas-dev\")) {\n        continue\n      }\n\n      const masBuildOptions = deepAssign({}, this.platformSpecificBuildOptions, (this.config as any).mas)\n      if (targetName === \"mas-dev\") {\n        deepAssign(masBuildOptions, (this.config as any)[targetName], {\n          type: \"development\",\n        })\n      }\n\n      const targetOutDir = path.join(outDir, targetName)\n      if (prepackaged == null) {\n        await this.doPack(outDir, targetOutDir, \"mas\", arch, masBuildOptions, [target])\n        await this.sign(path.join(targetOutDir, `${this.appInfo.productFilename}.app`), targetOutDir, masBuildOptions)\n      }\n      else {\n        await this.sign(prepackaged, targetOutDir, masBuildOptions)\n      }\n    }\n\n    if (nonMasPromise != null) {\n      await nonMasPromise\n    }\n  }\n\n  private async sign(appPath: string, outDir: string | null, masOptions: MasConfiguration | null): Promise<void> {\n    if (!isSignAllowed()) {\n      return\n    }\n\n    const isMas = masOptions != null\n    const macOptions = this.platformSpecificBuildOptions\n    const qualifier = (isMas ? masOptions!.identity : null) || macOptions.identity\n\n    if (!isMas && qualifier === null) {\n      if (this.forceCodeSigning) {\n        throw new InvalidConfigurationError(\"identity explicitly is set to null, but forceCodeSigning is set to true\")\n      }\n      log.info({reason: \"identity explicitly is set to null\"}, \"skipped macOS code signing\")\n      return\n    }\n\n    const keychainName = (await this.codeSigningInfo.value).keychainName\n    const explicitType = isMas ? masOptions!.type : macOptions.type\n    const type = explicitType || \"distribution\"\n    const isDevelopment = type === \"development\"\n    const certificateType = getCertificateType(isMas, isDevelopment)\n    let identity = await findIdentity(certificateType, qualifier, keychainName)\n    if (identity == null) {\n      if (!isMas && !isDevelopment && explicitType !== \"distribution\") {\n        identity = await findIdentity(\"Mac Developer\", qualifier, keychainName)\n        if (identity != null) {\n          log.warn(\"Mac Developer is used to sign app â€” it is only for development and testing, not for production\")\n        }\n      }\n\n      if (identity == null) {\n        await reportError(isMas, certificateType, qualifier, keychainName, this.forceCodeSigning)\n        return\n      }\n    }\n\n    const signOptions: any = {\n      \"identity-validation\": false,\n      // https://github.com/electron-userland/electron-builder/issues/1699\n      // kext are signed by the chipset manufacturers. You need a special certificate (only available on request) from Apple to be able to sign kext.\n      ignore: (file: string) => {\n        return file.endsWith(\".kext\") || file.startsWith(\"/Contents/PlugIns\", appPath.length) ||\n          // https://github.com/electron-userland/electron-builder/issues/2010\n          file.includes(\"/node_modules/puppeteer/.local-chromium\")\n      },\n      identity: identity!,\n      type,\n      platform: isMas ? \"mas\" : \"darwin\",\n      version: this.config.electronVersion,\n      app: appPath,\n      keychain: keychainName || undefined,\n      binaries: (isMas && masOptions != null ? masOptions.binaries : macOptions.binaries) || undefined,\n      requirements: isMas || macOptions.requirements == null ? undefined : await this.getResource(macOptions.requirements),\n      // https://github.com/electron-userland/electron-osx-sign/issues/196\n      // will fail on 10.14.5+ because a signed but unnotarized app is also rejected.\n      \"gatekeeper-assess\": macOptions.gatekeeperAssess,\n      \"hardened-runtime\": macOptions.hardenedRuntime,\n    }\n\n    await this.adjustSignOptions(signOptions, masOptions)\n    log.info({\n      file: log.filePath(appPath),\n      identityName: identity.name,\n      identityHash: identity.hash,\n      provisioningProfile: signOptions[\"provisioning-profile\"] || \"none\",\n    }, \"signing\")\n    await this.doSign(signOptions)\n\n    // https://github.com/electron-userland/electron-builder/issues/1196#issuecomment-312310209\n    if (masOptions != null && !isDevelopment) {\n      const certType = isDevelopment ? \"Mac Developer\" : \"3rd Party Mac Developer Installer\"\n      const masInstallerIdentity = await findIdentity(certType, masOptions.identity, keychainName)\n      if (masInstallerIdentity == null) {\n        throw new InvalidConfigurationError(`Cannot find valid \"${certType}\" identity to sign MAS installer, please see https://electron.build/code-signing`)\n      }\n\n      // mas uploaded to AppStore, so, use \"-\" instead of space for name\n      const artifactName = this.expandArtifactNamePattern(masOptions, \"pkg\")\n      const artifactPath = path.join(outDir!, artifactName)\n      await this.doFlat(appPath, artifactPath, masInstallerIdentity, keychainName)\n      await this.dispatchArtifactCreated(artifactPath, null, Arch.x64, this.computeSafeArtifactName(artifactName, \"pkg\"))\n    }\n  }\n\n  private async adjustSignOptions(signOptions: any, masOptions: MasConfiguration | null) {\n    const resourceList = await this.resourceList\n    if (resourceList.includes(`entitlements.osx.plist`)) {\n      throw new InvalidConfigurationError(\"entitlements.osx.plist is deprecated name, please use entitlements.mac.plist\")\n    }\n    if (resourceList.includes(`entitlements.osx.inherit.plist`)) {\n      throw new InvalidConfigurationError(\"entitlements.osx.inherit.plist is deprecated name, please use entitlements.mac.inherit.plist\")\n    }\n\n    const customSignOptions = masOptions || this.platformSpecificBuildOptions\n    const entitlementsSuffix = masOptions == null ? \"mac\" : \"mas\"\n    if (customSignOptions.entitlements == null) {\n      const p = `entitlements.${entitlementsSuffix}.plist`\n      if (resourceList.includes(p)) {\n        signOptions.entitlements = path.join(this.info.buildResourcesDir, p)\n      }\n    }\n    else {\n      signOptions.entitlements = customSignOptions.entitlements\n    }\n\n    if (customSignOptions.entitlementsInherit == null) {\n      const p = `entitlements.${entitlementsSuffix}.inherit.plist`\n      if (resourceList.includes(p)) {\n        signOptions[\"entitlements-inherit\"] = path.join(this.info.buildResourcesDir, p)\n      }\n    }\n    else {\n      signOptions[\"entitlements-inherit\"] = customSignOptions.entitlementsInherit\n    }\n\n    if (customSignOptions.provisioningProfile != null) {\n      signOptions[\"provisioning-profile\"] = customSignOptions.provisioningProfile\n    }\n  }\n\n  //noinspection JSMethodCanBeStatic\n  protected async doSign(opts: SignOptions): Promise<any> {\n    return signAsync(opts)\n  }\n\n  //noinspection JSMethodCanBeStatic\n  protected async doFlat(appPath: string, outFile: string, identity: Identity, keychain: string | null | undefined): Promise<any> {\n    // productbuild doesn't created directory for out file\n    await ensureDir(path.dirname(outFile))\n\n    const args = prepareProductBuildArgs(identity, keychain)\n    args.push(\"--component\", appPath, \"/Applications\")\n    args.push(outFile)\n    return await exec(\"productbuild\", args)\n  }\n\n  public getElectronSrcDir(dist: string) {\n    return path.resolve(this.projectDir, dist, this.info.framework.distMacOsAppName)\n  }\n\n  public getElectronDestinationDir(appOutDir: string) {\n    return path.join(appOutDir, this.info.framework.distMacOsAppName)\n  }\n\n  // todo fileAssociations\n  async applyCommonInfo(appPlist: any, contentsPath: string) {\n    const appInfo = this.appInfo\n    const appFilename = appInfo.productFilename\n\n    // https://github.com/electron-userland/electron-builder/issues/1278\n    appPlist.CFBundleExecutable = appFilename.endsWith(\" Helper\") ? appFilename.substring(0, appFilename.length - \" Helper\".length) : appFilename\n\n    const icon = await this.getIconPath()\n    if (icon != null) {\n      const oldIcon = appPlist.CFBundleIconFile\n      const resourcesPath = path.join(contentsPath, \"Resources\")\n      if (oldIcon != null) {\n        await unlinkIfExists(path.join(resourcesPath, oldIcon))\n      }\n      const iconFileName = `${appFilename}.icns`\n      appPlist.CFBundleIconFile = iconFileName\n      await copyFile(icon, path.join(resourcesPath, iconFileName))\n    }\n    appPlist.CFBundleName = appInfo.productName\n    appPlist.CFBundleDisplayName = appInfo.productName\n\n    const minimumSystemVersion = this.platformSpecificBuildOptions.minimumSystemVersion\n    if (minimumSystemVersion != null) {\n      appPlist.LSMinimumSystemVersion = minimumSystemVersion\n    }\n\n    appPlist.CFBundleIdentifier = appInfo.macBundleIdentifier\n\n    appPlist.CFBundleShortVersionString = this.platformSpecificBuildOptions.bundleShortVersion || appInfo.version\n    appPlist.CFBundleVersion = appInfo.buildVersion\n\n    use(this.platformSpecificBuildOptions.category || (this.config as any).category, it => appPlist.LSApplicationCategoryType = it)\n    appPlist.NSHumanReadableCopyright = appInfo.copyright\n\n    if (this.platformSpecificBuildOptions.darkModeSupport) {\n      appPlist.NSRequiresAquaSystemAppearance = false\n    }\n\n    const extendInfo = this.platformSpecificBuildOptions.extendInfo\n    if (extendInfo != null) {\n      Object.assign(appPlist, extendInfo)\n    }\n  }\n\n  protected async signApp(packContext: AfterPackContext, isAsar: boolean): Promise<any> {\n    const appFileName = `${this.appInfo.productFilename}.app`\n\n    await BluebirdPromise.map(readdir(packContext.appOutDir), (file: string): any => {\n      if (file === appFileName) {\n        return this.sign(path.join(packContext.appOutDir, file), null, null)\n      }\n      return null\n    })\n\n    if (!isAsar) {\n      return\n    }\n\n    const outResourcesDir = path.join(packContext.appOutDir, \"resources\", \"app.asar.unpacked\")\n    await BluebirdPromise.map(orIfFileNotExist(readdir(outResourcesDir), []), (file: string): any => {\n      if (file.endsWith(\".app\")) {\n        return this.sign(path.join(outResourcesDir, file), null, null)\n      }\n      else {\n        return null\n      }\n    })\n  }\n}\n\nfunction getCertificateType(isMas: boolean, isDevelopment: boolean): CertType {\n  if (isDevelopment) {\n    return \"Mac Developer\"\n  }\n  return isMas ? \"3rd Party Mac Developer Application\" : \"Developer ID Application\"\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Packager = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _events() {
  const data = require("events");

  _events = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _isCi() {
  const data = _interopRequireDefault(require("is-ci"));

  _isCi = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _appInfo() {
  const data = require("./appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _asar() {
  const data = require("./asar/asar");

  _asar = function () {
    return data;
  };

  return data;
}

function _ElectronFramework() {
  const data = require("./electron/ElectronFramework");

  _ElectronFramework = function () {
    return data;
  };

  return data;
}

function _LibUiFramework() {
  const data = require("./frameworks/LibUiFramework");

  _LibUiFramework = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("./index");

  _index = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("./platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _ProtonFramework() {
  const data = require("./ProtonFramework");

  _ProtonFramework = function () {
    return data;
  };

  return data;
}

function _targetFactory() {
  const data = require("./targets/targetFactory");

  _targetFactory = function () {
    return data;
  };

  return data;
}

function _config() {
  const data = require("./util/config");

  _config = function () {
    return data;
  };

  return data;
}

function _macroExpander() {
  const data = require("./util/macroExpander");

  _macroExpander = function () {
    return data;
  };

  return data;
}

function _packageDependencies() {
  const data = require("./util/packageDependencies");

  _packageDependencies = function () {
    return data;
  };

  return data;
}

function _packageMetadata() {
  const data = require("./util/packageMetadata");

  _packageMetadata = function () {
    return data;
  };

  return data;
}

function _repositoryInfo() {
  const data = require("./util/repositoryInfo");

  _repositoryInfo = function () {
    return data;
  };

  return data;
}

function _yarn() {
  const data = require("./util/yarn");

  _yarn = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function addHandler(emitter, event, handler) {
  emitter.on(event, handler);
}

function createFrameworkInfo(_x, _x2) {
  return _createFrameworkInfo.apply(this, arguments);
}

function _createFrameworkInfo() {
  _createFrameworkInfo = (0, _bluebirdLst().coroutine)(function* (configuration, packager) {
    let framework = configuration.framework;

    if (framework != null) {
      framework = framework.toLowerCase();
    }

    let nodeVersion = configuration.nodeVersion; // noinspection JSDeprecatedSymbols

    if (framework == null && configuration.protonNodeVersion != null) {
      framework = "proton"; // noinspection JSDeprecatedSymbols

      nodeVersion = configuration.protonNodeVersion;
    }

    if (framework === "electron" || framework == null) {
      return yield (0, _ElectronFramework().createElectronFrameworkSupport)(configuration, packager);
    }

    if (nodeVersion == null || nodeVersion === "current") {
      nodeVersion = process.versions.node;
    }

    const distMacOsName = `${packager.appInfo.productFilename}.app`;
    const isUseLaunchUi = configuration.launchUiVersion !== false;

    if (framework === "proton") {
      return new (_ProtonFramework().ProtonFramework)(nodeVersion, distMacOsName, isUseLaunchUi);
    } else if (framework === "libui") {
      return new (_LibUiFramework().LibUiFramework)(nodeVersion, distMacOsName, isUseLaunchUi);
    } else {
      throw new (_builderUtil().InvalidConfigurationError)(`Unknown framework: ${framework}`);
    }
  });
  return _createFrameworkInfo.apply(this, arguments);
}

class Packager {
  //noinspection JSUnusedGlobalSymbols
  constructor(options, cancellationToken = new (_builderUtilRuntime().CancellationToken)()) {
    this.cancellationToken = cancellationToken;
    this._metadata = null;
    this._nodeModulesHandledExternally = false;
    this._isPrepackedAppAsar = false;
    this._devMetadata = null;
    this._configuration = null;
    this.isTwoPackageJsonProjectLayoutUsed = false;
    this.eventEmitter = new (_events().EventEmitter)();
    this._appInfo = null;
    this.tempDirManager = new (_builderUtil().TmpDir)("packager");
    this._repositoryInfo = new (_lazyVal().Lazy)(() => (0, _repositoryInfo().getRepositoryInfo)(this.projectDir, this.metadata, this.devMetadata));
    this.afterPackHandlers = [];
    this.debugLogger = new (_builderUtil().DebugLogger)(_builderUtil().log.isDebugEnabled);
    this._productionDeps = null;

    this.stageDirPathCustomizer = (target, packager, arch) => {
      return path.join(target.outDir, `__${target.name}-${_builderUtil().Arch[arch]}`);
    };

    this._buildResourcesDir = null;
    this._framework = null;

    if ("devMetadata" in options) {
      throw new (_builderUtil().InvalidConfigurationError)("devMetadata in the options is deprecated, please use config instead");
    }

    if ("extraMetadata" in options) {
      throw new (_builderUtil().InvalidConfigurationError)("extraMetadata in the options is deprecated, please use config.extraMetadata instead");
    }

    const targets = options.targets || new Map();

    if (options.targets == null) {
      options.targets = targets;
    }

    function processTargets(platform, types) {
      function commonArch(currentIfNotSpecified) {
        if (platform === _index().Platform.MAC) {
          return currentIfNotSpecified ? [_builderUtil().Arch.x64] : [];
        }

        const result = Array();
        return result.length === 0 && currentIfNotSpecified ? [(0, _builderUtil().archFromString)(process.arch)] : result;
      }

      let archToType = targets.get(platform);

      if (archToType == null) {
        archToType = new Map();
        targets.set(platform, archToType);
      }

      if (types.length === 0) {
        for (const arch of commonArch(false)) {
          archToType.set(arch, []);
        }

        return;
      }

      for (const type of types) {
        const suffixPos = type.lastIndexOf(":");

        if (suffixPos > 0) {
          (0, _builderUtil().addValue)(archToType, (0, _builderUtil().archFromString)(type.substring(suffixPos + 1)), type.substring(0, suffixPos));
        } else {
          for (const arch of commonArch(true)) {
            (0, _builderUtil().addValue)(archToType, arch, type);
          }
        }
      }
    }

    if (options.mac != null) {
      processTargets(_index().Platform.MAC, options.mac);
    }

    if (options.linux != null) {
      processTargets(_index().Platform.LINUX, options.linux);
    }

    if (options.win != null) {
      processTargets(_index().Platform.WINDOWS, options.win);
    }

    this.projectDir = options.projectDir == null ? process.cwd() : path.resolve(options.projectDir);
    this._appDir = this.projectDir;
    this.options = Object.assign({}, options, {
      prepackaged: options.prepackaged == null ? null : path.resolve(this.projectDir, options.prepackaged)
    });

    try {
      _builderUtil().log.info({
        version: "20.44.4"
      }, "electron-builder");
    } catch (e) {
      // error in dev mode without babel
      if (!(e instanceof ReferenceError)) {
        throw e;
      }
    }
  }

  get appDir() {
    return this._appDir;
  }

  get metadata() {
    return this._metadata;
  }

  get areNodeModulesHandledExternally() {
    return this._nodeModulesHandledExternally;
  }

  get isPrepackedAppAsar() {
    return this._isPrepackedAppAsar;
  }

  get devMetadata() {
    return this._devMetadata;
  }

  get config() {
    return this._configuration;
  }

  get appInfo() {
    return this._appInfo;
  }

  get repositoryInfo() {
    return this._repositoryInfo.value;
  }

  get productionDeps() {
    var _this = this;

    let result = this._productionDeps;

    if (result == null) {
      // https://github.com/electron-userland/electron-builder/issues/2551
      result = new (_lazyVal().Lazy)(
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        if (_this.config.beforeBuild == null || (yield (0, _fs().exists)(path.join(_this.appDir, "node_modules")))) {
          return yield (0, _packageDependencies().getProductionDependencies)(_this.appDir);
        } else {
          return [];
        }
      }));
      this._productionDeps = result;
    }

    return result;
  }

  get buildResourcesDir() {
    let result = this._buildResourcesDir;

    if (result == null) {
      result = path.resolve(this.projectDir, this.relativeBuildResourcesDirname);
      this._buildResourcesDir = result;
    }

    return result;
  }

  get relativeBuildResourcesDirname() {
    return this.config.directories.buildResources;
  }

  get framework() {
    return this._framework;
  }

  addAfterPackHandler(handler) {
    this.afterPackHandlers.push(handler);
  }

  artifactCreated(handler) {
    addHandler(this.eventEmitter, "artifactCreated", handler);
    return this;
  }

  callArtifactBuildStarted(event, logFields) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      _builderUtil().log.info(logFields || {
        target: event.targetPresentableName,
        arch: event.arch == null ? null : _builderUtil().Arch[event.arch],
        file: _builderUtil().log.filePath(event.file)
      }, "building");

      const handler = (0, _platformPackager().resolveFunction)(_this2.config.artifactBuildStarted, "artifactBuildStarted");

      if (handler != null) {
        yield Promise.resolve(handler(event));
      }
    })();
  }
  /**
   * Only for sub artifacts (update info), for main artifacts use `callArtifactBuildCompleted`.
   */


  dispatchArtifactCreated(event) {
    this.eventEmitter.emit("artifactCreated", event);
  }

  callArtifactBuildCompleted(event) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      _this3.dispatchArtifactCreated(event);

      const handler = (0, _platformPackager().resolveFunction)(_this3.config.artifactBuildCompleted, "artifactBuildCompleted");

      if (handler != null) {
        yield Promise.resolve(handler(event));
      }
    })();
  }

  build() {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      let configPath = null;
      let configFromOptions = _this4.options.config;

      if (typeof configFromOptions === "string") {
        // it is a path to config file
        configPath = configFromOptions;
        configFromOptions = null;
      } else if (configFromOptions != null && configFromOptions.extends != null && configFromOptions.extends.includes(".")) {
        configPath = configFromOptions.extends;
        delete configFromOptions.extends;
      }

      const projectDir = _this4.projectDir;
      const devPackageFile = path.join(projectDir, "package.json");
      _this4._devMetadata = yield (0, _promise().orNullIfFileNotExist)((0, _packageMetadata().readPackageJson)(devPackageFile));
      const devMetadata = _this4.devMetadata;
      const configuration = yield (0, _config().getConfig)(projectDir, configPath, configFromOptions, new (_lazyVal().Lazy)(() => Promise.resolve(devMetadata)));

      if (_builderUtil().log.isDebugEnabled) {
        _builderUtil().log.debug({
          config: getSafeEffectiveConfig(configuration)
        }, "effective config");
      }

      _this4._appDir = yield (0, _config().computeDefaultAppDirectory)(projectDir, configuration.directories.app);
      _this4.isTwoPackageJsonProjectLayoutUsed = _this4._appDir !== projectDir;
      const appPackageFile = _this4.isTwoPackageJsonProjectLayoutUsed ? path.join(_this4.appDir, "package.json") : devPackageFile; // tslint:disable:prefer-conditional-expression

      if (_this4.devMetadata != null && !_this4.isTwoPackageJsonProjectLayoutUsed) {
        _this4._metadata = _this4.devMetadata;
      } else {
        _this4._metadata = yield _this4.readProjectMetadataIfTwoPackageStructureOrPrepacked(appPackageFile);
      }

      (0, _builderUtil().deepAssign)(_this4.metadata, configuration.extraMetadata);

      if (_this4.isTwoPackageJsonProjectLayoutUsed) {
        _builderUtil().log.debug({
          devPackageFile,
          appPackageFile
        }, "two package.json structure is used");
      }

      (0, _packageMetadata().checkMetadata)(_this4.metadata, _this4.devMetadata, appPackageFile, devPackageFile);
      return yield _this4._build(configuration, _this4._metadata, _this4._devMetadata);
    })();
  } // external caller of this method always uses isTwoPackageJsonProjectLayoutUsed=false and appDir=projectDir, no way (and need) to use another values


  _build(configuration, metadata, devMetadata, repositoryInfo) {
    var _this5 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield (0, _config().validateConfig)(configuration, _this5.debugLogger);
      _this5._configuration = configuration;
      _this5._metadata = metadata;
      _this5._devMetadata = devMetadata;

      if (repositoryInfo != null) {
        _this5._repositoryInfo.value = Promise.resolve(repositoryInfo);
      }

      _this5._appInfo = new (_appInfo().AppInfo)(_this5, null);
      _this5._framework = yield createFrameworkInfo(_this5.config, _this5);
      const commonOutDirWithoutPossibleOsMacro = path.resolve(_this5.projectDir, (0, _macroExpander().expandMacro)(configuration.directories.output, null, _this5._appInfo, {
        os: ""
      }));

      if (!_isCi().default && process.stdout.isTTY) {
        const effectiveConfigFile = path.join(commonOutDirWithoutPossibleOsMacro, "builder-effective-config.yaml");

        _builderUtil().log.info({
          file: _builderUtil().log.filePath(effectiveConfigFile)
        }, "writing effective config");

        yield (0, _fsExtraP().outputFile)(effectiveConfigFile, getSafeEffectiveConfig(configuration));
      } // because artifact event maybe dispatched several times for different publish providers


      const artifactPaths = new Set();

      _this5.artifactCreated(event => {
        if (event.file != null) {
          artifactPaths.add(event.file);
        }
      });

      const platformToTargets = yield (0, _promise().executeFinally)(_this5.doBuild(),
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        if (_this5.debugLogger.isEnabled) {
          yield _this5.debugLogger.save(path.join(commonOutDirWithoutPossibleOsMacro, "builder-debug.yml"));
        }

        yield _this5.tempDirManager.cleanup();
      }));
      return {
        outDir: commonOutDirWithoutPossibleOsMacro,
        artifactPaths: Array.from(artifactPaths),
        platformToTargets,
        configuration
      };
    })();
  }

  readProjectMetadataIfTwoPackageStructureOrPrepacked(appPackageFile) {
    var _this6 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      let data = yield (0, _promise().orNullIfFileNotExist)((0, _packageMetadata().readPackageJson)(appPackageFile));

      if (data != null) {
        return data;
      }

      data = yield (0, _promise().orNullIfFileNotExist)((0, _asar().readAsarJson)(path.join(_this6.projectDir, "app.asar"), "package.json"));

      if (data != null) {
        _this6._isPrepackedAppAsar = true;
        return data;
      }

      throw new Error(`Cannot find package.json in the ${path.dirname(appPackageFile)}`);
    })();
  }

  doBuild() {
    var _this7 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const taskManager = new (_builderUtil().AsyncTaskManager)(_this7.cancellationToken);
      const platformToTarget = new Map();
      const createdOutDirs = new Set();

      for (const [platform, archToType] of _this7.options.targets) {
        if (_this7.cancellationToken.cancelled) {
          break;
        }

        if (platform === _index().Platform.MAC && process.platform === _index().Platform.WINDOWS.nodeName) {
          throw new (_builderUtil().InvalidConfigurationError)("Build for macOS is supported only on macOS, please see https://electron.build/multi-platform-build");
        }

        const packager = _this7.createHelper(platform);

        const nameToTarget = new Map();
        platformToTarget.set(platform, nameToTarget);

        for (const [arch, targetNames] of (0, _targetFactory().computeArchToTargetNamesMap)(archToType, packager.platformSpecificBuildOptions, platform)) {
          if (_this7.cancellationToken.cancelled) {
            break;
          }

          yield _this7.installAppDependencies(platform, arch);

          if (_this7.cancellationToken.cancelled) {
            break;
          } // support os and arch macro in output value


          const outDir = path.resolve(_this7.projectDir, packager.expandMacro(_this7._configuration.directories.output, _builderUtil().Arch[arch]));
          const targetList = (0, _targetFactory().createTargets)(nameToTarget, targetNames.length === 0 ? packager.defaultTarget : targetNames, outDir, packager);
          yield createOutDirIfNeed(targetList, createdOutDirs);
          yield packager.pack(outDir, arch, targetList, taskManager);
        }

        if (_this7.cancellationToken.cancelled) {
          break;
        }

        for (const target of nameToTarget.values()) {
          taskManager.addTask(target.finishBuild());
        }
      }

      yield taskManager.awaitTasks();
      return platformToTarget;
    })();
  }

  createHelper(platform) {
    if (this.options.platformPackagerFactory != null) {
      return this.options.platformPackagerFactory(this, platform);
    }

    switch (platform) {
      case _index().Platform.MAC:
        {
          const helperClass = require("./macPackager").default;

          return new helperClass(this);
        }

      case _index().Platform.WINDOWS:
        {
          const helperClass = require("./winPackager").WinPackager;

          return new helperClass(this);
        }

      case _index().Platform.LINUX:
        return new (require("./linuxPackager").LinuxPackager)(this);

      default:
        throw new Error(`Unknown platform: ${platform}`);
    }
  }

  installAppDependencies(platform, arch) {
    var _this8 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (_this8.options.prepackaged != null || _this8.framework.isNpmRebuildRequired !== true) {
        return;
      }

      const frameworkInfo = {
        version: _this8.framework.version,
        useCustomDist: true
      };
      const config = _this8.config;

      if (config.nodeGypRebuild === true) {
        _builderUtil().log.info({
          arch: _builderUtil().Arch[arch]
        }, "executing node-gyp rebuild");

        yield (0, _builderUtil().exec)(process.platform === "win32" ? "node-gyp.cmd" : "node-gyp", ["rebuild"], {
          env: (0, _yarn().getGypEnv)(frameworkInfo, platform.nodeName, _builderUtil().Arch[arch], true)
        });
      }

      if (config.npmRebuild === false) {
        _builderUtil().log.info({
          reason: "npmRebuild is set to false"
        }, "skipped app dependencies rebuild");

        return;
      }

      const beforeBuild = (0, _platformPackager().resolveFunction)(config.beforeBuild, "beforeBuild");

      if (beforeBuild != null) {
        const performDependenciesInstallOrRebuild = yield beforeBuild({
          appDir: _this8.appDir,
          electronVersion: _this8.config.electronVersion,
          platform,
          arch: _builderUtil().Arch[arch]
        }); // If beforeBuild resolves to false, it means that handling node_modules is done outside of electron-builder.

        _this8._nodeModulesHandledExternally = !performDependenciesInstallOrRebuild;

        if (!performDependenciesInstallOrRebuild) {
          return;
        }
      }

      if (config.buildDependenciesFromSource === true && platform.nodeName !== process.platform) {
        _builderUtil().log.info({
          reason: "platform is different and buildDependenciesFromSource is set to true"
        }, "skipped app dependencies rebuild");
      } else {
        yield (0, _yarn().installOrRebuild)(config, _this8.appDir, {
          frameworkInfo,
          platform: platform.nodeName,
          arch: _builderUtil().Arch[arch],
          productionDeps: _this8.productionDeps
        });
      }
    })();
  }

  afterPack(context) {
    const afterPack = (0, _platformPackager().resolveFunction)(this.config.afterPack, "afterPack");
    const handlers = this.afterPackHandlers.slice();

    if (afterPack != null) {
      // user handler should be last
      handlers.push(afterPack);
    }

    return _bluebirdLst().default.each(handlers, it => it(context));
  }

}

exports.Packager = Packager;

function createOutDirIfNeed(targetList, createdOutDirs) {
  const ourDirs = new Set();

  for (const target of targetList) {
    // noinspection SuspiciousInstanceOfGuard
    if (target instanceof _targetFactory().NoOpTarget) {
      continue;
    }

    const outDir = target.outDir;

    if (!createdOutDirs.has(outDir)) {
      ourDirs.add(outDir);
    }
  }

  if (ourDirs.size > 0) {
    return _bluebirdLst().default.map(Array.from(ourDirs).sort(), it => {
      createdOutDirs.add(it);
      return (0, _fsExtraP().ensureDir)(it);
    });
  }

  return Promise.resolve();
}

function getSafeEffectiveConfig(configuration) {
  const o = JSON.parse((0, _builderUtil().safeStringifyJson)(configuration));

  if (o.cscLink != null) {
    o.cscLink = "<hidden by builder>";
  }

  return (0, _builderUtil().serializeToYaml)(o, true);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=packager.js.map{"version":3,"sources":["../src/packager.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { addValue, Arch, archFromString, AsyncTaskManager, DebugLogger, deepAssign, exec, InvalidConfigurationError, log, safeStringifyJson, serializeToYaml, TmpDir } from \"builder-util\"\nimport { CancellationToken } from \"builder-util-runtime\"\nimport { exists } from \"builder-util/out/fs\"\nimport { executeFinally, orNullIfFileNotExist } from \"builder-util/out/promise\"\nimport { EventEmitter } from \"events\"\nimport { ensureDir, outputFile } from \"fs-extra-p\"\nimport isCI from \"is-ci\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { AppInfo } from \"./appInfo\"\nimport { readAsarJson } from \"./asar/asar\"\nimport { createElectronFrameworkSupport } from \"./electron/ElectronFramework\"\nimport { LibUiFramework } from \"./frameworks/LibUiFramework\"\nimport { AfterPackContext, Configuration, Framework, Platform, SourceRepositoryInfo, Target } from \"./index\"\nimport MacPackager from \"./macPackager\"\nimport { Metadata } from \"./options/metadata\"\nimport { ArtifactBuildStarted, ArtifactCreated, PackagerOptions } from \"./packagerApi\"\nimport { PlatformPackager, resolveFunction } from \"./platformPackager\"\nimport { ProtonFramework } from \"./ProtonFramework\"\nimport { computeArchToTargetNamesMap, createTargets, NoOpTarget } from \"./targets/targetFactory\"\nimport { computeDefaultAppDirectory, getConfig, validateConfig } from \"./util/config\"\nimport { expandMacro } from \"./util/macroExpander\"\nimport { Dependency, getProductionDependencies } from \"./util/packageDependencies\"\nimport { checkMetadata, readPackageJson } from \"./util/packageMetadata\"\nimport { getRepositoryInfo } from \"./util/repositoryInfo\"\nimport { getGypEnv, installOrRebuild } from \"./util/yarn\"\nimport { WinPackager } from \"./winPackager\"\n\nfunction addHandler(emitter: EventEmitter, event: string, handler: (...args: Array<any>) => void) {\n  emitter.on(event, handler)\n}\n\ndeclare const PACKAGE_VERSION: string\n\nasync function createFrameworkInfo(configuration: Configuration, packager: Packager): Promise<Framework> {\n  let framework = configuration.framework\n  if (framework != null) {\n    framework = framework.toLowerCase()\n  }\n\n  let nodeVersion = configuration.nodeVersion\n  // noinspection JSDeprecatedSymbols\n  if (framework == null && configuration.protonNodeVersion != null) {\n    framework = \"proton\"\n    // noinspection JSDeprecatedSymbols\n    nodeVersion = configuration.protonNodeVersion\n  }\n\n  if (framework === \"electron\" || framework == null) {\n    return await createElectronFrameworkSupport(configuration, packager)\n  }\n\n  if (nodeVersion == null || nodeVersion === \"current\") {\n    nodeVersion = process.versions.node\n  }\n\n  const distMacOsName = `${packager.appInfo.productFilename}.app`\n  const isUseLaunchUi = configuration.launchUiVersion !== false\n  if (framework === \"proton\") {\n    return new ProtonFramework(nodeVersion, distMacOsName, isUseLaunchUi)\n  }\n  else if (framework === \"libui\") {\n    return new LibUiFramework(nodeVersion, distMacOsName, isUseLaunchUi)\n  }\n  else {\n    throw new InvalidConfigurationError(`Unknown framework: ${framework}`)\n  }\n}\n\nexport class Packager {\n  readonly projectDir: string\n\n  private _appDir: string\n  get appDir(): string {\n    return this._appDir\n  }\n\n  private _metadata: Metadata | null = null\n  get metadata(): Metadata {\n    return this._metadata!!\n  }\n\n  private _nodeModulesHandledExternally: boolean = false\n\n  get areNodeModulesHandledExternally(): boolean {\n    return this._nodeModulesHandledExternally\n  }\n\n  private _isPrepackedAppAsar: boolean = false\n\n  get isPrepackedAppAsar(): boolean {\n    return this._isPrepackedAppAsar\n  }\n\n  private _devMetadata: Metadata | null = null\n  get devMetadata(): Metadata | null {\n    return this._devMetadata\n  }\n\n  private _configuration: Configuration | null = null\n\n  get config(): Configuration {\n    return this._configuration!!\n  }\n\n  isTwoPackageJsonProjectLayoutUsed = false\n\n  readonly eventEmitter = new EventEmitter()\n\n  _appInfo: AppInfo | null = null\n  get appInfo(): AppInfo {\n    return this._appInfo!!\n  }\n\n  readonly tempDirManager = new TmpDir(\"packager\")\n\n  private _repositoryInfo = new Lazy<SourceRepositoryInfo | null>(() => getRepositoryInfo(this.projectDir, this.metadata, this.devMetadata))\n\n  private readonly afterPackHandlers: Array<(context: AfterPackContext) => Promise<any> | null> = []\n\n  readonly options: PackagerOptions\n\n  readonly debugLogger = new DebugLogger(log.isDebugEnabled)\n\n  get repositoryInfo(): Promise<SourceRepositoryInfo | null> {\n    return this._repositoryInfo.value\n  }\n\n  private _productionDeps: Lazy<Array<Dependency>> | null = null\n\n  private get productionDeps(): Lazy<Array<Dependency>> {\n    let result = this._productionDeps\n    if (result == null) {\n      // https://github.com/electron-userland/electron-builder/issues/2551\n      result = new Lazy(async () => {\n        if (this.config.beforeBuild == null || (await exists(path.join(this.appDir, \"node_modules\")))) {\n          return await getProductionDependencies(this.appDir)\n        }\n        else {\n          return []\n        }\n      })\n      this._productionDeps = result\n    }\n    return result\n  }\n\n  stageDirPathCustomizer: (target: Target, packager: PlatformPackager<any>, arch: Arch) => string = (target, packager, arch) => {\n    return path.join(target.outDir, `__${target.name}-${Arch[arch]}`)\n  }\n\n  private _buildResourcesDir: string | null = null\n\n  get buildResourcesDir(): string {\n    let result = this._buildResourcesDir\n    if (result == null) {\n      result = path.resolve(this.projectDir, this.relativeBuildResourcesDirname)\n      this._buildResourcesDir = result\n    }\n    return result\n  }\n\n  get relativeBuildResourcesDirname(): string {\n    return this.config.directories!!.buildResources!!\n  }\n\n  private _framework: Framework | null = null\n  get framework(): Framework {\n    return this._framework!!\n  }\n\n  //noinspection JSUnusedGlobalSymbols\n  constructor(options: PackagerOptions, readonly cancellationToken = new CancellationToken()) {\n    if (\"devMetadata\" in options) {\n      throw new InvalidConfigurationError(\"devMetadata in the options is deprecated, please use config instead\")\n    }\n    if (\"extraMetadata\" in options) {\n      throw new InvalidConfigurationError(\"extraMetadata in the options is deprecated, please use config.extraMetadata instead\")\n    }\n\n    const targets = options.targets || new Map<Platform, Map<Arch, Array<string>>>()\n    if (options.targets == null) {\n      options.targets = targets\n    }\n\n    function processTargets(platform: Platform, types: Array<string>) {\n      function commonArch(currentIfNotSpecified: boolean): Array<Arch> {\n        if (platform === Platform.MAC) {\n          return currentIfNotSpecified ? [Arch.x64] : []\n        }\n\n        const result = Array<Arch>()\n        return result.length === 0 && currentIfNotSpecified ? [archFromString(process.arch)] : result\n      }\n\n      let archToType = targets.get(platform)\n      if (archToType == null) {\n        archToType = new Map<Arch, Array<string>>()\n        targets.set(platform, archToType)\n      }\n\n      if (types.length === 0) {\n        for (const arch of commonArch(false)) {\n          archToType.set(arch, [])\n        }\n        return\n      }\n\n      for (const type of types) {\n        const suffixPos = type.lastIndexOf(\":\")\n        if (suffixPos > 0) {\n          addValue(archToType, archFromString(type.substring(suffixPos + 1)), type.substring(0, suffixPos))\n        }\n        else {\n          for (const arch of commonArch(true)) {\n            addValue(archToType, arch, type)\n          }\n        }\n      }\n    }\n\n    if (options.mac != null) {\n      processTargets(Platform.MAC, options.mac)\n    }\n    if (options.linux != null) {\n      processTargets(Platform.LINUX, options.linux)\n    }\n    if (options.win != null) {\n      processTargets(Platform.WINDOWS, options.win)\n    }\n\n    this.projectDir = options.projectDir == null ? process.cwd() : path.resolve(options.projectDir)\n    this._appDir = this.projectDir\n    this.options = {\n      ...options,\n      prepackaged: options.prepackaged == null ? null : path.resolve(this.projectDir, options.prepackaged)\n    }\n\n    try {\n      log.info({version: PACKAGE_VERSION}, \"electron-builder\")\n    }\n    catch (e) {\n      // error in dev mode without babel\n      if (!(e instanceof ReferenceError)) {\n        throw e\n      }\n    }\n  }\n\n  addAfterPackHandler(handler: (context: AfterPackContext) => Promise<any> | null) {\n    this.afterPackHandlers.push(handler)\n  }\n\n  artifactCreated(handler: (event: ArtifactCreated) => void): Packager {\n    addHandler(this.eventEmitter, \"artifactCreated\", handler)\n    return this\n  }\n\n  async callArtifactBuildStarted(event: ArtifactBuildStarted, logFields?: any): Promise<void> {\n    log.info(logFields || {\n      target: event.targetPresentableName,\n      arch: event.arch == null ? null : Arch[event.arch],\n      file: log.filePath(event.file),\n    }, \"building\")\n    const handler = resolveFunction(this.config.artifactBuildStarted, \"artifactBuildStarted\")\n    if (handler != null) {\n      await Promise.resolve(handler(event))\n    }\n  }\n\n  /**\n   * Only for sub artifacts (update info), for main artifacts use `callArtifactBuildCompleted`.\n   */\n  dispatchArtifactCreated(event: ArtifactCreated): void {\n    this.eventEmitter.emit(\"artifactCreated\", event)\n  }\n\n  async callArtifactBuildCompleted(event: ArtifactCreated): Promise<void> {\n    this.dispatchArtifactCreated(event)\n\n    const handler = resolveFunction(this.config.artifactBuildCompleted, \"artifactBuildCompleted\")\n    if (handler != null) {\n      await Promise.resolve(handler(event))\n    }\n  }\n\n  async build(): Promise<BuildResult> {\n    let configPath: string | null = null\n    let configFromOptions = this.options.config\n    if (typeof configFromOptions === \"string\") {\n      // it is a path to config file\n      configPath = configFromOptions\n      configFromOptions = null\n    }\n    else if (configFromOptions != null && configFromOptions.extends != null && configFromOptions.extends.includes(\".\")) {\n      configPath = configFromOptions.extends\n      delete configFromOptions.extends\n    }\n\n    const projectDir = this.projectDir\n\n    const devPackageFile = path.join(projectDir, \"package.json\")\n    this._devMetadata = await orNullIfFileNotExist(readPackageJson(devPackageFile))\n\n    const devMetadata = this.devMetadata\n    const configuration = await getConfig(projectDir, configPath, configFromOptions, new Lazy(() => Promise.resolve(devMetadata)))\n    if (log.isDebugEnabled) {\n      log.debug({config: getSafeEffectiveConfig(configuration)}, \"effective config\")\n    }\n\n    this._appDir = await computeDefaultAppDirectory(projectDir, configuration.directories!!.app)\n    this.isTwoPackageJsonProjectLayoutUsed = this._appDir !== projectDir\n\n    const appPackageFile = this.isTwoPackageJsonProjectLayoutUsed ? path.join(this.appDir, \"package.json\") : devPackageFile\n\n    // tslint:disable:prefer-conditional-expression\n    if (this.devMetadata != null && !this.isTwoPackageJsonProjectLayoutUsed) {\n      this._metadata = this.devMetadata\n    }\n    else {\n      this._metadata = await this.readProjectMetadataIfTwoPackageStructureOrPrepacked(appPackageFile)\n    }\n    deepAssign(this.metadata, configuration.extraMetadata)\n\n    if (this.isTwoPackageJsonProjectLayoutUsed) {\n      log.debug({devPackageFile, appPackageFile}, \"two package.json structure is used\")\n    }\n    checkMetadata(this.metadata, this.devMetadata, appPackageFile, devPackageFile)\n\n    return await this._build(configuration, this._metadata, this._devMetadata)\n  }\n\n  // external caller of this method always uses isTwoPackageJsonProjectLayoutUsed=false and appDir=projectDir, no way (and need) to use another values\n  async _build(configuration: Configuration, metadata: Metadata, devMetadata: Metadata | null, repositoryInfo?: SourceRepositoryInfo): Promise<BuildResult> {\n    await validateConfig(configuration, this.debugLogger)\n    this._configuration = configuration\n    this._metadata = metadata\n    this._devMetadata = devMetadata\n\n    if (repositoryInfo != null) {\n      this._repositoryInfo.value = Promise.resolve(repositoryInfo)\n    }\n\n    this._appInfo = new AppInfo(this, null)\n    this._framework = await createFrameworkInfo(this.config, this)\n\n    const commonOutDirWithoutPossibleOsMacro = path.resolve(this.projectDir, expandMacro(configuration.directories!!.output!!, null, this._appInfo, {\n      os: \"\",\n    }))\n\n    if (!isCI && (process.stdout as any).isTTY) {\n      const effectiveConfigFile = path.join(commonOutDirWithoutPossibleOsMacro, \"builder-effective-config.yaml\")\n      log.info({file: log.filePath(effectiveConfigFile)}, \"writing effective config\")\n      await outputFile(effectiveConfigFile, getSafeEffectiveConfig(configuration))\n    }\n\n    // because artifact event maybe dispatched several times for different publish providers\n    const artifactPaths = new Set<string>()\n    this.artifactCreated(event => {\n      if (event.file != null) {\n        artifactPaths.add(event.file)\n      }\n    })\n\n    const platformToTargets = await executeFinally(this.doBuild(), async () => {\n      if (this.debugLogger.isEnabled) {\n        await this.debugLogger.save(path.join(commonOutDirWithoutPossibleOsMacro, \"builder-debug.yml\"))\n      }\n      await this.tempDirManager.cleanup()\n    })\n\n    return {\n      outDir: commonOutDirWithoutPossibleOsMacro,\n      artifactPaths: Array.from(artifactPaths),\n      platformToTargets,\n      configuration,\n    }\n  }\n\n  private async readProjectMetadataIfTwoPackageStructureOrPrepacked(appPackageFile: string): Promise<Metadata> {\n    let data = await orNullIfFileNotExist(readPackageJson(appPackageFile))\n    if (data != null) {\n      return data\n    }\n\n    data = await orNullIfFileNotExist(readAsarJson(path.join(this.projectDir, \"app.asar\"), \"package.json\"))\n    if (data != null) {\n      this._isPrepackedAppAsar = true\n      return data\n    }\n\n    throw new Error(`Cannot find package.json in the ${path.dirname(appPackageFile)}`)\n  }\n\n  private async doBuild(): Promise<Map<Platform, Map<string, Target>>> {\n    const taskManager = new AsyncTaskManager(this.cancellationToken)\n\n    const platformToTarget = new Map<Platform, Map<string, Target>>()\n    const createdOutDirs = new Set<string>()\n\n    for (const [platform, archToType] of this.options.targets!) {\n      if (this.cancellationToken.cancelled) {\n        break\n      }\n\n      if (platform === Platform.MAC && process.platform === Platform.WINDOWS.nodeName) {\n        throw new InvalidConfigurationError(\"Build for macOS is supported only on macOS, please see https://electron.build/multi-platform-build\")\n      }\n\n      const packager = this.createHelper(platform)\n      const nameToTarget: Map<string, Target> = new Map()\n      platformToTarget.set(platform, nameToTarget)\n\n      for (const [arch, targetNames] of computeArchToTargetNamesMap(archToType, packager.platformSpecificBuildOptions, platform)) {\n        if (this.cancellationToken.cancelled) {\n          break\n        }\n\n        await this.installAppDependencies(platform, arch)\n\n        if (this.cancellationToken.cancelled) {\n          break\n        }\n\n        // support os and arch macro in output value\n        const outDir = path.resolve(this.projectDir, packager.expandMacro(this._configuration!!.directories!!.output!!, Arch[arch]))\n        const targetList = createTargets(nameToTarget, targetNames.length === 0 ? packager.defaultTarget : targetNames, outDir, packager)\n        await createOutDirIfNeed(targetList, createdOutDirs)\n        await packager.pack(outDir, arch, targetList, taskManager)\n      }\n\n      if (this.cancellationToken.cancelled) {\n        break\n      }\n\n      for (const target of nameToTarget.values()) {\n        taskManager.addTask(target.finishBuild())\n      }\n    }\n\n    await taskManager.awaitTasks()\n    return platformToTarget\n  }\n\n  private createHelper(platform: Platform): PlatformPackager<any> {\n    if (this.options.platformPackagerFactory != null) {\n      return this.options.platformPackagerFactory!(this, platform)\n    }\n\n    switch (platform) {\n      case Platform.MAC: {\n        const helperClass: typeof MacPackager = require(\"./macPackager\").default\n        return new helperClass(this)\n      }\n\n      case Platform.WINDOWS: {\n        const helperClass: typeof WinPackager = require(\"./winPackager\").WinPackager\n        return new helperClass(this)\n      }\n\n      case Platform.LINUX:\n        return new (require(\"./linuxPackager\").LinuxPackager)(this)\n\n      default:\n        throw new Error(`Unknown platform: ${platform}`)\n    }\n  }\n\n  private async installAppDependencies(platform: Platform, arch: Arch): Promise<any> {\n    if (this.options.prepackaged != null || this.framework.isNpmRebuildRequired !== true) {\n      return\n    }\n\n    const frameworkInfo = {version: this.framework.version, useCustomDist: true}\n    const config = this.config\n    if (config.nodeGypRebuild === true) {\n      log.info({arch: Arch[arch]}, \"executing node-gyp rebuild\")\n      await exec(process.platform === \"win32\" ? \"node-gyp.cmd\" : \"node-gyp\", [\"rebuild\"], {\n        env: getGypEnv(frameworkInfo, platform.nodeName, Arch[arch], true),\n      })\n    }\n\n    if (config.npmRebuild === false) {\n      log.info({reason: \"npmRebuild is set to false\"}, \"skipped app dependencies rebuild\")\n      return\n    }\n\n    const beforeBuild = resolveFunction(config.beforeBuild, \"beforeBuild\")\n    if (beforeBuild != null) {\n      const performDependenciesInstallOrRebuild = await beforeBuild({\n        appDir: this.appDir,\n        electronVersion: this.config.electronVersion!,\n        platform,\n        arch: Arch[arch]\n      })\n\n      // If beforeBuild resolves to false, it means that handling node_modules is done outside of electron-builder.\n      this._nodeModulesHandledExternally = !performDependenciesInstallOrRebuild\n      if (!performDependenciesInstallOrRebuild) {\n        return\n      }\n    }\n\n    if (config.buildDependenciesFromSource === true && platform.nodeName !== process.platform) {\n      log.info({reason: \"platform is different and buildDependenciesFromSource is set to true\"}, \"skipped app dependencies rebuild\")\n    }\n    else {\n      await installOrRebuild(config, this.appDir, {\n        frameworkInfo,\n        platform: platform.nodeName,\n        arch: Arch[arch],\n        productionDeps: this.productionDeps,\n      })\n    }\n  }\n\n  afterPack(context: AfterPackContext): Promise<any> {\n    const afterPack = resolveFunction(this.config.afterPack, \"afterPack\")\n    const handlers = this.afterPackHandlers.slice()\n    if (afterPack != null) {\n      // user handler should be last\n      handlers.push(afterPack)\n    }\n    return BluebirdPromise.each(handlers, it => it(context))\n  }\n}\n\nfunction createOutDirIfNeed(targetList: Array<Target>, createdOutDirs: Set<string>): Promise<any> {\n  const ourDirs = new Set<string>()\n  for (const target of targetList) {\n    // noinspection SuspiciousInstanceOfGuard\n    if (target instanceof NoOpTarget) {\n      continue\n    }\n\n    const outDir = (target as Target).outDir\n    if (!createdOutDirs.has(outDir)) {\n      ourDirs.add(outDir)\n    }\n  }\n\n  if (ourDirs.size > 0) {\n    return BluebirdPromise.map(Array.from(ourDirs).sort(), it => {\n      createdOutDirs.add(it)\n      return ensureDir(it)\n    })\n  }\n  return Promise.resolve()\n}\n\nexport interface BuildResult {\n  readonly outDir: string\n  readonly artifactPaths: Array<string>\n  readonly platformToTargets: Map<Platform, Map<string, Target>>\n  readonly configuration: Configuration\n}\n\nfunction getSafeEffectiveConfig(configuration: Configuration): string {\n  const o = JSON.parse(safeStringifyJson(configuration))\n  if (o.cscLink != null) {\n    o.cscLink = \"<hidden by builder>\"\n  }\n  return serializeToYaml(o, true)\n}"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=packagerApi.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isSafeGithubName = isSafeGithubName;
exports.normalizeExt = normalizeExt;
exports.resolveFunction = resolveFunction;
exports.chooseNotNull = chooseNotNull;
exports.PlatformPackager = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _appInfo() {
  const data = require("./appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _asarFileChecker() {
  const data = require("./asar/asarFileChecker");

  _asarFileChecker = function () {
    return data;
  };

  return data;
}

function _asarUtil() {
  const data = require("./asar/asarUtil");

  _asarUtil = function () {
    return data;
  };

  return data;
}

function _integrity() {
  const data = require("./asar/integrity");

  _integrity = function () {
    return data;
  };

  return data;
}

function _fileMatcher() {
  const data = require("./fileMatcher");

  _fileMatcher = function () {
    return data;
  };

  return data;
}

function _fileTransformer() {
  const data = require("./fileTransformer");

  _fileTransformer = function () {
    return data;
  };

  return data;
}

function _Framework() {
  const data = require("./Framework");

  _Framework = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("./index");

  _index = function () {
    return data;
  };

  return data;
}

function _appBuilder() {
  const data = require("./util/appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _appFileCopier() {
  const data = require("./util/appFileCopier");

  _appFileCopier = function () {
    return data;
  };

  return data;
}

function _macroExpander() {
  const data = require("./util/macroExpander");

  _macroExpander = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class PlatformPackager {
  constructor(info, platform) {
    this.info = info;
    this.platform = platform;
    this._resourceList = new (_lazyVal().Lazy)(() => (0, _promise().orIfFileNotExist)((0, _fsExtraP().readdir)(this.info.buildResourcesDir), []));
    this.platformSpecificBuildOptions = PlatformPackager.normalizePlatformSpecificBuildOptions(this.config[platform.buildConfigurationKey]);
    this.appInfo = this.prepareAppInfo(info.appInfo);
  }

  get packagerOptions() {
    return this.info.options;
  }

  get buildResourcesDir() {
    return this.info.buildResourcesDir;
  }

  get projectDir() {
    return this.info.projectDir;
  }

  get config() {
    return this.info.config;
  }

  get resourceList() {
    return this._resourceList.value;
  }

  get compression() {
    const compression = this.platformSpecificBuildOptions.compression; // explicitly set to null - request to use default value instead of parent (in the config)

    if (compression === null) {
      return "normal";
    }

    return compression || this.config.compression || "normal";
  }

  get debugLogger() {
    return this.info.debugLogger;
  }

  prepareAppInfo(appInfo) {
    return new (_appInfo().AppInfo)(this.info, null, this.platformSpecificBuildOptions);
  }

  static normalizePlatformSpecificBuildOptions(options) {
    return options == null ? Object.create(null) : options;
  }

  getCscPassword() {
    const password = this.doGetCscPassword();

    if ((0, _builderUtil().isEmptyOrSpaces)(password)) {
      _builderUtil().log.info({
        reason: "CSC_KEY_PASSWORD is not defined"
      }, "empty password will be used for code signing");

      return "";
    } else {
      return password.trim();
    }
  }

  getCscLink(extraEnvName) {
    // allow to specify as empty string
    const envValue = chooseNotNull(extraEnvName == null ? null : process.env[extraEnvName], process.env.CSC_LINK);
    return chooseNotNull(chooseNotNull(this.info.config.cscLink, this.platformSpecificBuildOptions.cscLink), envValue);
  }

  doGetCscPassword() {
    // allow to specify as empty string
    return chooseNotNull(chooseNotNull(this.info.config.cscKeyPassword, this.platformSpecificBuildOptions.cscKeyPassword), process.env.CSC_KEY_PASSWORD);
  }

  computeAppOutDir(outDir, arch) {
    return this.packagerOptions.prepackaged || path.join(outDir, `${this.platform.buildConfigurationKey}${(0, _builderUtil().getArchSuffix)(arch)}${this.platform === _index().Platform.MAC ? "" : "-unpacked"}`);
  }

  dispatchArtifactCreated(file, target, arch, safeArtifactName) {
    return this.info.callArtifactBuildCompleted({
      file,
      safeArtifactName,
      target,
      arch,
      packager: this
    });
  }

  pack(outDir, arch, targets, taskManager) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appOutDir = _this.computeAppOutDir(outDir, arch);

      yield _this.doPack(outDir, appOutDir, _this.platform.nodeName, arch, _this.platformSpecificBuildOptions, targets);

      _this.packageInDistributableFormat(appOutDir, arch, targets, taskManager);
    })();
  }

  packageInDistributableFormat(appOutDir, arch, targets, taskManager) {
    var _this2 = this;

    if (targets.find(it => !it.isAsyncSupported) == null) {
      PlatformPackager.buildAsyncTargets(targets, taskManager, appOutDir, arch);
      return;
    }

    taskManager.add(
    /*#__PURE__*/
    (0, _bluebirdLst().coroutine)(function* () {
      // BluebirdPromise.map doesn't invoke target.build immediately, but for RemoteTarget it is very critical to call build() before finishBuild()
      const subTaskManager = new (_builderUtil().AsyncTaskManager)(_this2.info.cancellationToken);
      PlatformPackager.buildAsyncTargets(targets, subTaskManager, appOutDir, arch);
      yield subTaskManager.awaitTasks();

      for (const target of targets) {
        if (!target.isAsyncSupported) {
          yield target.build(appOutDir, arch);
        }
      }
    }));
  }

  static buildAsyncTargets(targets, taskManager, appOutDir, arch) {
    for (const target of targets) {
      if (target.isAsyncSupported) {
        taskManager.addTask(target.build(appOutDir, arch));
      }
    }
  }

  getExtraFileMatchers(isResources, appOutDir, options) {
    const base = isResources ? this.getResourcesDir(appOutDir) : this.platform === _index().Platform.MAC ? path.join(appOutDir, `${this.appInfo.productFilename}.app`, "Contents") : appOutDir;
    return (0, _fileMatcher().getFileMatchers)(this.config, isResources ? "extraResources" : "extraFiles", base, options);
  }

  get electronDistExecutableName() {
    return "electron";
  }

  get electronDistMacOsExecutableName() {
    return "Electron";
  }

  createGetFileMatchersOptions(outDir, arch, customBuildOptions) {
    return {
      macroExpander: it => this.expandMacro(it, arch == null ? null : _builderUtil().Arch[arch], {
        "/*": "{,/**/*}"
      }),
      customBuildOptions,
      globalOutDir: outDir,
      defaultSrc: this.projectDir
    };
  }

  doPack(outDir, appOutDir, platformName, arch, platformSpecificBuildOptions, targets) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (_this3.packagerOptions.prepackaged != null) {
        return;
      }

      const framework = _this3.info.framework;

      _builderUtil().log.info({
        platform: platformName,
        arch: _builderUtil().Arch[arch],
        [`${framework.name}`]: framework.version,
        appOutDir: _builderUtil().log.filePath(appOutDir)
      }, `packaging`);

      yield framework.prepareApplicationStageDirectory({
        packager: _this3,
        appOutDir,
        platformName,
        arch: _builderUtil().Arch[arch],
        version: framework.version
      });
      const excludePatterns = [];

      const computeParsedPatterns = patterns => {
        if (patterns != null) {
          for (const pattern of patterns) {
            pattern.computeParsedPatterns(excludePatterns, _this3.info.projectDir);
          }
        }
      };

      const getFileMatchersOptions = _this3.createGetFileMatchersOptions(outDir, arch, platformSpecificBuildOptions);

      const macroExpander = getFileMatchersOptions.macroExpander;

      const extraResourceMatchers = _this3.getExtraFileMatchers(true, appOutDir, getFileMatchersOptions);

      computeParsedPatterns(extraResourceMatchers);

      const extraFileMatchers = _this3.getExtraFileMatchers(false, appOutDir, getFileMatchersOptions);

      computeParsedPatterns(extraFileMatchers);
      const packContext = {
        appOutDir,
        outDir,
        arch,
        targets,
        packager: _this3,
        electronPlatformName: platformName
      };
      const asarOptions = yield _this3.computeAsarOptions(platformSpecificBuildOptions);
      const resourcesPath = _this3.platform === _index().Platform.MAC ? path.join(appOutDir, framework.distMacOsAppName, "Contents", "Resources") : (0, _Framework().isElectronBased)(framework) ? path.join(appOutDir, "resources") : appOutDir;
      const taskManager = new (_builderUtil().AsyncTaskManager)(_this3.info.cancellationToken);

      _this3.copyAppFiles(taskManager, asarOptions, resourcesPath, path.join(resourcesPath, "app"), packContext, platformSpecificBuildOptions, excludePatterns, macroExpander);

      yield taskManager.awaitTasks();

      if (_this3.info.cancellationToken.cancelled) {
        return;
      }

      if (framework.beforeCopyExtraFiles != null) {
        yield framework.beforeCopyExtraFiles({
          packager: _this3,
          appOutDir,
          asarIntegrity: asarOptions == null ? null : yield (0, _integrity().computeData)(resourcesPath, asarOptions.externalAllowed ? {
            externalAllowed: true
          } : null),
          platformName
        });
      }

      if (_this3.info.cancellationToken.cancelled) {
        return;
      }

      const transformerForExtraFiles = _this3.createTransformerForExtraFiles(packContext);

      yield (0, _fileMatcher().copyFiles)(extraResourceMatchers, transformerForExtraFiles);
      yield (0, _fileMatcher().copyFiles)(extraFileMatchers, transformerForExtraFiles);

      if (_this3.info.cancellationToken.cancelled) {
        return;
      }

      yield _this3.info.afterPack(packContext);

      if (framework.afterPack != null) {
        yield framework.afterPack(packContext);
      }

      const isAsar = asarOptions != null;
      yield _this3.sanityCheckPackage(appOutDir, isAsar, framework);
      yield _this3.signApp(packContext, isAsar);
      const afterSign = resolveFunction(_this3.config.afterSign, "afterSign");

      if (afterSign != null) {
        yield Promise.resolve(afterSign(packContext));
      }
    })();
  }

  createTransformerForExtraFiles(packContext) {
    return null;
  }

  copyAppFiles(taskManager, asarOptions, resourcePath, defaultDestination, packContext, platformSpecificBuildOptions, excludePatterns, macroExpander) {
    var _this4 = this;

    const appDir = this.info.appDir;
    const config = this.config;
    const isElectronCompile = asarOptions != null && (0, _fileTransformer().isElectronCompileUsed)(this.info);
    const mainMatchers = (0, _fileMatcher().getMainFileMatchers)(appDir, defaultDestination, macroExpander, platformSpecificBuildOptions, this, packContext.outDir, isElectronCompile);

    if (excludePatterns.length > 0) {
      for (const matcher of mainMatchers) {
        matcher.excludePatterns = excludePatterns;
      }
    }

    const framework = this.info.framework;
    const transformer = (0, _fileTransformer().createTransformer)(appDir, config, isElectronCompile ? Object.assign({
      originalMain: this.info.metadata.main,
      main: _appFileCopier().ELECTRON_COMPILE_SHIM_FILENAME
    }, config.extraMetadata) : config.extraMetadata, framework.createTransformer == null ? null : framework.createTransformer());

    const _computeFileSets = matchers => {
      return (0, _appFileCopier().computeFileSets)(matchers, this.info.isPrepackedAppAsar ? null : transformer, this, isElectronCompile).then(
      /*#__PURE__*/
      function () {
        var _ref2 = (0, _bluebirdLst().coroutine)(function* (result) {
          if (!_this4.info.isPrepackedAppAsar && !_this4.info.areNodeModulesHandledExternally) {
            const moduleFileMatcher = (0, _fileMatcher().getNodeModuleFileMatcher)(appDir, defaultDestination, macroExpander, platformSpecificBuildOptions, _this4.info);
            result = result.concat((yield (0, _appFileCopier().computeNodeModuleFileSets)(_this4, moduleFileMatcher)));
          }

          return result.filter(it => it.files.length > 0);
        });

        return function (_x) {
          return _ref2.apply(this, arguments);
        };
      }());
    };

    if (this.info.isPrepackedAppAsar) {
      taskManager.addTask(_bluebirdLst().default.each(_computeFileSets([new (_fileMatcher().FileMatcher)(appDir, resourcePath, macroExpander)]), it => (0, _appFileCopier().copyAppFiles)(it, this.info, transformer)));
    } else if (asarOptions == null) {
      // for ASAR all asar unpacked files will be extra transformed (e.g. sign of EXE and DLL) later,
      // for prepackaged asar extra transformation not supported yet,
      // so, extra transform if asar is disabled
      const transformerForExtraFiles = this.createTransformerForExtraFiles(packContext);

      const combinedTransformer = file => {
        if (transformerForExtraFiles != null) {
          const result = transformerForExtraFiles(file);

          if (result != null) {
            return result;
          }
        }

        return transformer(file);
      };

      taskManager.addTask(_bluebirdLst().default.each(_computeFileSets(mainMatchers), it => (0, _appFileCopier().copyAppFiles)(it, this.info, combinedTransformer)));
    } else {
      const unpackPattern = (0, _fileMatcher().getFileMatchers)(config, "asarUnpack", defaultDestination, {
        macroExpander,
        customBuildOptions: platformSpecificBuildOptions,
        globalOutDir: packContext.outDir,
        defaultSrc: appDir
      });
      const fileMatcher = unpackPattern == null ? null : unpackPattern[0];
      taskManager.addTask(_computeFileSets(mainMatchers).then(
      /*#__PURE__*/
      function () {
        var _ref3 = (0, _bluebirdLst().coroutine)(function* (fileSets) {
          for (const fileSet of fileSets) {
            yield (0, _appFileCopier().transformFiles)(transformer, fileSet);
          }

          yield new (_asarUtil().AsarPackager)(appDir, resourcePath, asarOptions, fileMatcher == null ? null : fileMatcher.createFilter()).pack(fileSets, _this4);
        });

        return function (_x2) {
          return _ref3.apply(this, arguments);
        };
      }()));
    }
  }

  signApp(packContext, isAsar) {
    return Promise.resolve();
  }

  getIconPath() {
    return (0, _bluebirdLst().coroutine)(function* () {
      return null;
    })();
  }

  computeAsarOptions(customBuildOptions) {
    var _this5 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (!(0, _Framework().isElectronBased)(_this5.info.framework)) {
        return null;
      }

      function errorMessage(name) {
        return `${name} is deprecated is deprecated and not supported â€” please use asarUnpack`;
      }

      const buildMetadata = _this5.config;

      if (buildMetadata["asar-unpack"] != null) {
        throw new Error(errorMessage("asar-unpack"));
      }

      if (buildMetadata["asar-unpack-dir"] != null) {
        throw new Error(errorMessage("asar-unpack-dir"));
      }

      const platformSpecific = customBuildOptions.asar;
      const result = platformSpecific == null ? _this5.config.asar : platformSpecific;

      if (result === false) {
        const appAsarStat = yield (0, _fs().statOrNull)(path.join(_this5.info.appDir, "app.asar")); //noinspection ES6MissingAwait

        if (appAsarStat == null || !appAsarStat.isFile()) {
          _builderUtil().log.warn({
            solution: "enable asar and use asarUnpack to unpack files that must be externally available"
          }, "asar using is disabled â€” it is strongly not recommended");
        }

        return null;
      }

      if (result == null || result === true) {
        return {};
      }

      for (const name of ["unpackDir", "unpack"]) {
        if (result[name] != null) {
          throw new Error(errorMessage(`asar.${name}`));
        }
      }

      return (0, _builderUtil().deepAssign)({}, result);
    })();
  }

  getElectronSrcDir(dist) {
    return path.resolve(this.projectDir, dist);
  }

  getElectronDestinationDir(appOutDir) {
    return appOutDir;
  }

  getResourcesDir(appOutDir) {
    if (this.platform === _index().Platform.MAC) {
      return this.getMacOsResourcesDir(appOutDir);
    } else if ((0, _Framework().isElectronBased)(this.info.framework)) {
      return path.join(appOutDir, "resources");
    } else {
      return appOutDir;
    }
  }

  getMacOsResourcesDir(appOutDir) {
    return path.join(appOutDir, `${this.appInfo.productFilename}.app`, "Contents", "Resources");
  }

  checkFileInPackage(resourcesDir, file, messagePrefix, isAsar) {
    var _this6 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const relativeFile = path.relative(_this6.info.appDir, path.resolve(_this6.info.appDir, file));

      if (isAsar) {
        yield (0, _asarFileChecker().checkFileInArchive)(path.join(resourcesDir, "app.asar"), relativeFile, messagePrefix);
        return;
      }

      const pathParsed = path.parse(file); // Even when packaging to asar is disabled, it does not imply that the main file can not be inside an .asar archive.
      // This may occur when the packaging is done manually before processing with electron-builder.

      if (pathParsed.dir.includes(".asar")) {
        // The path needs to be split to the part with an asar archive which acts like a directory and the part with
        // the path to main file itself. (e.g. path/arch.asar/dir/index.js -> path/arch.asar, dir/index.js)
        // noinspection TypeScriptValidateJSTypes
        const pathSplit = pathParsed.dir.split(path.sep);
        let partWithAsarIndex = 0;
        pathSplit.some((pathPart, index) => {
          partWithAsarIndex = index;
          return pathPart.endsWith(".asar");
        });
        const asarPath = path.join.apply(path, pathSplit.slice(0, partWithAsarIndex + 1));
        let mainPath = pathSplit.length > partWithAsarIndex + 1 ? path.join.apply(pathSplit.slice(partWithAsarIndex + 1)) : "";
        mainPath += path.join(mainPath, pathParsed.base);
        yield (0, _asarFileChecker().checkFileInArchive)(path.join(resourcesDir, "app", asarPath), mainPath, messagePrefix);
      } else {
        const fullPath = path.join(resourcesDir, "app", relativeFile);
        const outStat = yield (0, _fs().statOrNull)(fullPath);

        if (outStat == null) {
          throw new Error(`${messagePrefix} "${fullPath}" does not exist. Seems like a wrong configuration.`);
        } else {
          //noinspection ES6MissingAwait
          if (!outStat.isFile()) {
            throw new Error(`${messagePrefix} "${fullPath}" is not a file. Seems like a wrong configuration.`);
          }
        }
      }
    })();
  }

  sanityCheckPackage(appOutDir, isAsar, framework) {
    var _this7 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const outStat = yield (0, _fs().statOrNull)(appOutDir);

      if (outStat == null) {
        throw new Error(`Output directory "${appOutDir}" does not exist. Seems like a wrong configuration.`);
      } else {
        //noinspection ES6MissingAwait
        if (!outStat.isDirectory()) {
          throw new Error(`Output directory "${appOutDir}" is not a directory. Seems like a wrong configuration.`);
        }
      }

      const resourcesDir = _this7.getResourcesDir(appOutDir);

      const mainFile = (framework.getMainFile == null ? null : framework.getMainFile(_this7.platform)) || _this7.info.metadata.main || "index.js";
      yield _this7.checkFileInPackage(resourcesDir, mainFile, "Application entry file", isAsar);
      yield _this7.checkFileInPackage(resourcesDir, "package.json", "Application", isAsar);
    })();
  } // tslint:disable-next-line:no-invalid-template-strings


  computeSafeArtifactName(suggestedName, ext, arch, skipArchIfX64 = true, safePattern = "${name}-${version}-${arch}.${ext}") {
    // GitHub only allows the listed characters in file names.
    if (suggestedName != null && isSafeGithubName(suggestedName)) {
      return null;
    }

    return this.computeArtifactName(safePattern, ext, skipArchIfX64 && arch === _builderUtil().Arch.x64 ? null : arch);
  }

  expandArtifactNamePattern(targetSpecificOptions, ext, arch, defaultPattern, skipArchIfX64 = true) {
    let pattern = targetSpecificOptions == null ? null : targetSpecificOptions.artifactName;

    if (pattern == null) {
      pattern = this.platformSpecificBuildOptions.artifactName || this.config.artifactName;
    }

    if (pattern == null) {
      // tslint:disable-next-line:no-invalid-template-strings
      pattern = defaultPattern || "${productName}-${version}-${arch}.${ext}";
    } else {
      // https://github.com/electron-userland/electron-builder/issues/3510
      // always respect arch in user custom artifact pattern
      skipArchIfX64 = false;
    }

    return this.computeArtifactName(pattern, ext, skipArchIfX64 && arch === _builderUtil().Arch.x64 ? null : arch);
  }

  expandArtifactBeautyNamePattern(targetSpecificOptions, ext, arch) {
    // tslint:disable-next-line:no-invalid-template-strings
    return this.expandArtifactNamePattern(targetSpecificOptions, ext, arch, "${productName} ${version} ${arch}.${ext}", true);
  }

  computeArtifactName(pattern, ext, arch) {
    let archName = arch == null ? null : _builderUtil().Arch[arch];

    if (arch === _builderUtil().Arch.x64) {
      if (ext === "AppImage" || ext === "rpm") {
        archName = "x86_64";
      } else if (ext === "deb" || ext === "snap") {
        archName = "amd64";
      }
    } else if (arch === _builderUtil().Arch.ia32) {
      if (ext === "deb" || ext === "AppImage" || ext === "snap") {
        archName = "i386";
      } else if (ext === "pacman" || ext === "rpm") {
        archName = "i686";
      }
    }

    return this.expandMacro(pattern, this.platform === _index().Platform.MAC ? null : archName, {
      ext
    });
  }

  expandMacro(pattern, arch, extra = {}, isProductNameSanitized = true) {
    return (0, _macroExpander().expandMacro)(pattern, arch, this.appInfo, Object.assign({
      os: this.platform.buildConfigurationKey
    }, extra), isProductNameSanitized);
  }

  generateName2(ext, classifier, deployment) {
    const dotExt = ext == null ? "" : `.${ext}`;
    const separator = ext === "deb" ? "_" : "-";
    return `${deployment ? this.appInfo.name : this.appInfo.productFilename}${separator}${this.appInfo.version}${classifier == null ? "" : `${separator}${classifier}`}${dotExt}`;
  }

  getTempFile(suffix) {
    return this.info.tempDirManager.getTempFile({
      suffix
    });
  }

  get fileAssociations() {
    return (0, _builderUtil().asArray)(this.config.fileAssociations).concat((0, _builderUtil().asArray)(this.platformSpecificBuildOptions.fileAssociations));
  }

  getResource(custom, ...names) {
    var _this8 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const resourcesDir = _this8.info.buildResourcesDir;

      if (custom === undefined) {
        const resourceList = yield _this8.resourceList;

        for (const name of names) {
          if (resourceList.includes(name)) {
            return path.join(resourcesDir, name);
          }
        }
      } else if (custom != null && !(0, _builderUtil().isEmptyOrSpaces)(custom)) {
        const resourceList = yield _this8.resourceList;

        if (resourceList.includes(custom)) {
          return path.join(resourcesDir, custom);
        }

        let p = path.resolve(resourcesDir, custom);

        if ((yield (0, _fs().statOrNull)(p)) == null) {
          p = path.resolve(_this8.projectDir, custom);

          if ((yield (0, _fs().statOrNull)(p)) == null) {
            throw new (_builderUtil().InvalidConfigurationError)(`cannot find specified resource "${custom}", nor relative to "${resourcesDir}", neither relative to project dir ("${_this8.projectDir}")`);
          }
        }

        return p;
      }

      return null;
    })();
  }

  get forceCodeSigning() {
    const forceCodeSigningPlatform = this.platformSpecificBuildOptions.forceCodeSigning;
    return (forceCodeSigningPlatform == null ? this.config.forceCodeSigning : forceCodeSigningPlatform) || false;
  }

  getOrConvertIcon(format) {
    var _this9 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const result = yield _this9.resolveIcon((0, _builderUtil().asArray)(_this9.platformSpecificBuildOptions.icon || _this9.config.icon), [], format);

      if (result.length === 0) {
        const framework = _this9.info.framework;

        if (framework.getDefaultIcon != null) {
          return framework.getDefaultIcon(_this9.platform);
        }

        _builderUtil().log.warn({
          reason: "application icon is not set"
        }, `default ${capitalizeFirstLetter(framework.name)} icon is used`);

        return _this9.getDefaultFrameworkIcon();
      } else {
        return result[0].file;
      }
    })();
  }

  getDefaultFrameworkIcon() {
    const framework = this.info.framework;
    return framework.getDefaultIcon == null ? null : framework.getDefaultIcon(this.platform);
  } // convert if need, validate size (it is a reason why tool is called even if file has target extension (already specified as foo.icns for example))


  resolveIcon(sources, fallbackSources, outputFormat) {
    var _this10 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const args = ["icon", "--format", outputFormat, "--root", _this10.buildResourcesDir, "--root", _this10.projectDir, "--out", path.resolve(_this10.projectDir, _this10.config.directories.output, `.icon-${outputFormat}`)];

      for (const source of sources) {
        args.push("--input", source);
      }

      for (const source of fallbackSources) {
        args.push("--fallback-input", source);
      }

      const result = yield (0, _appBuilder().executeAppBuilderAsJson)(args);
      const errorMessage = result.error;

      if (errorMessage != null) {
        throw new (_builderUtil().InvalidConfigurationError)(errorMessage, result.errorCode);
      }

      if (result.isFallback) {
        _builderUtil().log.warn({
          reason: "application icon is not set"
        }, `default ${capitalizeFirstLetter(_this10.info.framework.name)} icon is used`);
      }

      return result.icons || [];
    })();
  }

}

exports.PlatformPackager = PlatformPackager;

function isSafeGithubName(name) {
  return /^[0-9A-Za-z._-]+$/.test(name);
} // remove leading dot


function normalizeExt(ext) {
  return ext.startsWith(".") ? ext.substring(1) : ext;
}

function resolveFunction(executor, name) {
  if (executor == null || typeof executor !== "string") {
    return executor;
  }

  let p = executor;

  if (p.startsWith(".")) {
    p = path.resolve(p);
  }

  try {
    p = require.resolve(p);
  } catch (e) {
    (0, _builderUtil().debug)(e);
    p = path.resolve(p);
  }

  const m = require(p);

  const namedExport = m[name];

  if (namedExport == null) {
    return m.default || m;
  } else {
    return namedExport;
  }
}

function chooseNotNull(v1, v2) {
  return v1 == null ? v2 : v1;
}

function capitalizeFirstLetter(text) {
  return text.charAt(0).toUpperCase() + text.slice(1);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=platformPackager.js.map{"version":3,"sources":["../src/platformPackager.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, asArray, AsyncTaskManager, debug, DebugLogger, deepAssign, getArchSuffix, InvalidConfigurationError, isEmptyOrSpaces, log } from \"builder-util\"\nimport { FileTransformer, statOrNull } from \"builder-util/out/fs\"\nimport { orIfFileNotExist } from \"builder-util/out/promise\"\nimport { readdir } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport { Minimatch } from \"minimatch\"\nimport * as path from \"path\"\nimport { AppInfo } from \"./appInfo\"\nimport { checkFileInArchive } from \"./asar/asarFileChecker\"\nimport { AsarPackager } from \"./asar/asarUtil\"\nimport { computeData } from \"./asar/integrity\"\nimport { copyFiles, FileMatcher, getFileMatchers, GetFileMatchersOptions, getMainFileMatchers, getNodeModuleFileMatcher } from \"./fileMatcher\"\nimport { createTransformer, isElectronCompileUsed } from \"./fileTransformer\"\nimport { Framework, isElectronBased } from \"./Framework\"\nimport { AfterPackContext, AsarOptions, CompressionLevel, Configuration, ElectronPlatformName, FileAssociation, Packager, PackagerOptions, Platform, PlatformSpecificBuildOptions, Target, TargetSpecificOptions } from \"./index\"\nimport { executeAppBuilderAsJson } from \"./util/appBuilder\"\nimport { computeFileSets, computeNodeModuleFileSets, copyAppFiles, ELECTRON_COMPILE_SHIM_FILENAME, transformFiles } from \"./util/appFileCopier\"\nimport { expandMacro as doExpandMacro } from \"./util/macroExpander\"\n\nexport abstract class PlatformPackager<DC extends PlatformSpecificBuildOptions> {\n  get packagerOptions(): PackagerOptions {\n    return this.info.options\n  }\n\n  get buildResourcesDir(): string {\n    return this.info.buildResourcesDir\n  }\n\n  get projectDir(): string {\n    return this.info.projectDir\n  }\n\n  get config(): Configuration {\n    return this.info.config\n  }\n\n  readonly platformSpecificBuildOptions: DC\n\n  get resourceList(): Promise<Array<string>> {\n    return this._resourceList.value\n  }\n\n  private readonly _resourceList = new Lazy<Array<string>>(() => orIfFileNotExist(readdir(this.info.buildResourcesDir), []))\n\n  readonly appInfo: AppInfo\n\n  protected constructor(readonly info: Packager, readonly platform: Platform) {\n    this.platformSpecificBuildOptions = PlatformPackager.normalizePlatformSpecificBuildOptions((this.config as any)[platform.buildConfigurationKey])\n    this.appInfo = this.prepareAppInfo(info.appInfo)\n  }\n\n  get compression(): CompressionLevel {\n    const compression = this.platformSpecificBuildOptions.compression\n    // explicitly set to null - request to use default value instead of parent (in the config)\n    if (compression === null) {\n      return \"normal\"\n    }\n    return compression || this.config.compression || \"normal\"\n  }\n\n  get debugLogger(): DebugLogger {\n    return this.info.debugLogger\n  }\n\n  abstract get defaultTarget(): Array<string>\n\n  protected prepareAppInfo(appInfo: AppInfo) {\n    return new AppInfo(this.info, null, this.platformSpecificBuildOptions)\n  }\n\n  private static normalizePlatformSpecificBuildOptions(options: any | null | undefined): any {\n    return options == null ? Object.create(null) : options\n  }\n\n  abstract createTargets(targets: Array<string>, mapper: (name: string, factory: (outDir: string) => Target) => void): void\n\n  protected getCscPassword(): string {\n    const password = this.doGetCscPassword()\n    if (isEmptyOrSpaces(password)) {\n      log.info({reason: \"CSC_KEY_PASSWORD is not defined\"}, \"empty password will be used for code signing\")\n      return \"\"\n    }\n    else {\n      return password!.trim()\n    }\n  }\n\n  protected getCscLink(extraEnvName?: string | null): string | null | undefined {\n    // allow to specify as empty string\n    const envValue = chooseNotNull(extraEnvName == null ? null : process.env[extraEnvName], process.env.CSC_LINK)\n    return chooseNotNull(chooseNotNull(this.info.config.cscLink, this.platformSpecificBuildOptions.cscLink), envValue)\n  }\n\n  protected doGetCscPassword(): string | null | undefined {\n    // allow to specify as empty string\n    return chooseNotNull(chooseNotNull(this.info.config.cscKeyPassword, this.platformSpecificBuildOptions.cscKeyPassword), process.env.CSC_KEY_PASSWORD)\n  }\n\n  protected computeAppOutDir(outDir: string, arch: Arch): string {\n    return this.packagerOptions.prepackaged || path.join(outDir, `${this.platform.buildConfigurationKey}${getArchSuffix(arch)}${this.platform === Platform.MAC ? \"\" : \"-unpacked\"}`)\n  }\n\n  dispatchArtifactCreated(file: string, target: Target | null, arch: Arch | null, safeArtifactName?: string | null): Promise<void> {\n    return this.info.callArtifactBuildCompleted({\n      file, safeArtifactName, target, arch,\n      packager: this,\n    })\n  }\n\n  async pack(outDir: string, arch: Arch, targets: Array<Target>, taskManager: AsyncTaskManager): Promise<any> {\n    const appOutDir = this.computeAppOutDir(outDir, arch)\n    await this.doPack(outDir, appOutDir, this.platform.nodeName as ElectronPlatformName, arch, this.platformSpecificBuildOptions, targets)\n    this.packageInDistributableFormat(appOutDir, arch, targets, taskManager)\n  }\n\n  protected packageInDistributableFormat(appOutDir: string, arch: Arch, targets: Array<Target>, taskManager: AsyncTaskManager): void {\n    if (targets.find(it => !it.isAsyncSupported) == null) {\n      PlatformPackager.buildAsyncTargets(targets, taskManager, appOutDir, arch)\n      return\n    }\n\n    taskManager.add(async () => {\n      // BluebirdPromise.map doesn't invoke target.build immediately, but for RemoteTarget it is very critical to call build() before finishBuild()\n      const subTaskManager = new AsyncTaskManager(this.info.cancellationToken)\n      PlatformPackager.buildAsyncTargets(targets, subTaskManager, appOutDir, arch)\n      await subTaskManager.awaitTasks()\n\n      for (const target of targets) {\n        if (!target.isAsyncSupported) {\n          await target.build(appOutDir, arch)\n        }\n      }\n    })\n  }\n\n  private static buildAsyncTargets(targets: Array<Target>, taskManager: AsyncTaskManager, appOutDir: string, arch: Arch) {\n    for (const target of targets) {\n      if (target.isAsyncSupported) {\n        taskManager.addTask(target.build(appOutDir, arch))\n      }\n    }\n  }\n\n  private getExtraFileMatchers(isResources: boolean, appOutDir: string, options: GetFileMatchersOptions): Array<FileMatcher> | null {\n    const base = isResources ? this.getResourcesDir(appOutDir) : (this.platform === Platform.MAC ? path.join(appOutDir, `${this.appInfo.productFilename}.app`, \"Contents\") : appOutDir)\n    return getFileMatchers(this.config, isResources ? \"extraResources\" : \"extraFiles\", base, options)\n  }\n\n  get electronDistExecutableName() {\n    return \"electron\"\n  }\n\n  get electronDistMacOsExecutableName() {\n    return \"Electron\"\n  }\n\n  createGetFileMatchersOptions(outDir: string, arch: Arch, customBuildOptions: PlatformSpecificBuildOptions): GetFileMatchersOptions {\n    return {\n      macroExpander: it => this.expandMacro(it, arch == null ? null : Arch[arch], {\"/*\": \"{,/**/*}\"}),\n      customBuildOptions,\n      globalOutDir: outDir,\n      defaultSrc: this.projectDir,\n    }\n  }\n\n  protected async doPack(outDir: string, appOutDir: string, platformName: ElectronPlatformName, arch: Arch, platformSpecificBuildOptions: DC, targets: Array<Target>) {\n    if (this.packagerOptions.prepackaged != null) {\n      return\n    }\n\n    const framework = this.info.framework\n    log.info({\n      platform: platformName,\n      arch: Arch[arch],\n      [`${framework.name}`]: framework.version,\n      appOutDir: log.filePath(appOutDir),\n    }, `packaging`)\n\n    await framework.prepareApplicationStageDirectory({\n      packager: this,\n      appOutDir,\n      platformName,\n      arch: Arch[arch],\n      version: framework.version,\n    })\n\n    const excludePatterns: Array<Minimatch> = []\n\n    const computeParsedPatterns = (patterns: Array<FileMatcher> | null) => {\n      if (patterns != null) {\n        for (const pattern of patterns) {\n          pattern.computeParsedPatterns(excludePatterns, this.info.projectDir)\n        }\n      }\n    }\n\n    const getFileMatchersOptions = this.createGetFileMatchersOptions(outDir, arch, platformSpecificBuildOptions)\n    const macroExpander = getFileMatchersOptions.macroExpander\n    const extraResourceMatchers = this.getExtraFileMatchers(true, appOutDir, getFileMatchersOptions)\n    computeParsedPatterns(extraResourceMatchers)\n    const extraFileMatchers = this.getExtraFileMatchers(false, appOutDir, getFileMatchersOptions)\n    computeParsedPatterns(extraFileMatchers)\n\n    const packContext: AfterPackContext = {\n      appOutDir, outDir, arch, targets,\n      packager: this,\n      electronPlatformName: platformName,\n    }\n\n    const asarOptions = await this.computeAsarOptions(platformSpecificBuildOptions)\n    const resourcesPath = this.platform === Platform.MAC ? path.join(appOutDir, framework.distMacOsAppName, \"Contents\", \"Resources\") : (isElectronBased(framework) ? path.join(appOutDir, \"resources\") : appOutDir)\n    const taskManager = new AsyncTaskManager(this.info.cancellationToken)\n    this.copyAppFiles(taskManager, asarOptions, resourcesPath, path.join(resourcesPath, \"app\"), packContext, platformSpecificBuildOptions, excludePatterns, macroExpander)\n    await taskManager.awaitTasks()\n\n    if (this.info.cancellationToken.cancelled) {\n      return\n    }\n\n    if (framework.beforeCopyExtraFiles != null) {\n      await framework.beforeCopyExtraFiles({\n        packager: this,\n        appOutDir,\n        asarIntegrity: asarOptions == null ? null : await computeData(resourcesPath, asarOptions.externalAllowed ? {externalAllowed: true} : null),\n        platformName,\n      })\n    }\n\n    if (this.info.cancellationToken.cancelled) {\n      return\n    }\n\n    const transformerForExtraFiles = this.createTransformerForExtraFiles(packContext)\n    await copyFiles(extraResourceMatchers, transformerForExtraFiles)\n    await copyFiles(extraFileMatchers, transformerForExtraFiles)\n\n    if (this.info.cancellationToken.cancelled) {\n      return\n    }\n\n    await this.info.afterPack(packContext)\n\n    if (framework.afterPack != null) {\n      await framework.afterPack(packContext)\n    }\n\n    const isAsar = asarOptions != null\n    await this.sanityCheckPackage(appOutDir, isAsar, framework)\n    await this.signApp(packContext, isAsar)\n\n    const afterSign = resolveFunction(this.config.afterSign, \"afterSign\")\n    if (afterSign != null) {\n      await Promise.resolve(afterSign(packContext))\n    }\n  }\n\n  protected createTransformerForExtraFiles(packContext: AfterPackContext): FileTransformer | null {\n    return null\n  }\n\n  private copyAppFiles(taskManager: AsyncTaskManager, asarOptions: AsarOptions | null, resourcePath: string, defaultDestination: string, packContext: AfterPackContext, platformSpecificBuildOptions: DC, excludePatterns: Array<Minimatch>, macroExpander: ((it: string) => string)) {\n    const appDir = this.info.appDir\n    const config = this.config\n    const isElectronCompile = asarOptions != null && isElectronCompileUsed(this.info)\n\n    const mainMatchers = getMainFileMatchers(appDir, defaultDestination, macroExpander, platformSpecificBuildOptions, this, packContext.outDir, isElectronCompile)\n    if (excludePatterns.length > 0) {\n      for (const matcher of mainMatchers) {\n        matcher.excludePatterns = excludePatterns\n      }\n    }\n\n    const framework = this.info.framework\n    const transformer = createTransformer(appDir, config, isElectronCompile ? {\n      originalMain: this.info.metadata.main,\n      main: ELECTRON_COMPILE_SHIM_FILENAME,\n      ...config.extraMetadata\n    } : config.extraMetadata, framework.createTransformer == null ? null : framework.createTransformer())\n\n    const _computeFileSets = (matchers: Array<FileMatcher>) => {\n      return computeFileSets(matchers, this.info.isPrepackedAppAsar ? null : transformer, this, isElectronCompile)\n        .then(async result => {\n          if (!this.info.isPrepackedAppAsar && !this.info.areNodeModulesHandledExternally) {\n            const moduleFileMatcher = getNodeModuleFileMatcher(appDir, defaultDestination, macroExpander, platformSpecificBuildOptions, this.info)\n            result = result.concat(await computeNodeModuleFileSets(this, moduleFileMatcher))\n          }\n          return result.filter(it => it.files.length > 0)\n        })\n    }\n\n    if (this.info.isPrepackedAppAsar) {\n      taskManager.addTask(BluebirdPromise.each(_computeFileSets([new FileMatcher(appDir, resourcePath, macroExpander)]), it => copyAppFiles(it, this.info, transformer)))\n    }\n    else if (asarOptions == null) {\n      // for ASAR all asar unpacked files will be extra transformed (e.g. sign of EXE and DLL) later,\n      // for prepackaged asar extra transformation not supported yet,\n      // so, extra transform if asar is disabled\n      const transformerForExtraFiles = this.createTransformerForExtraFiles(packContext)\n      const combinedTransformer: FileTransformer = file => {\n        if (transformerForExtraFiles != null) {\n          const result = transformerForExtraFiles(file)\n          if (result != null) {\n            return result\n          }\n        }\n        return transformer(file)\n      }\n\n      taskManager.addTask(BluebirdPromise.each(_computeFileSets(mainMatchers), it => copyAppFiles(it, this.info, combinedTransformer)))\n    }\n    else {\n      const unpackPattern = getFileMatchers(config, \"asarUnpack\", defaultDestination, {\n        macroExpander,\n        customBuildOptions: platformSpecificBuildOptions,\n        globalOutDir: packContext.outDir,\n        defaultSrc: appDir,\n      })\n      const fileMatcher = unpackPattern == null ? null : unpackPattern[0]\n      taskManager.addTask(_computeFileSets(mainMatchers)\n        .then(async fileSets => {\n          for (const fileSet of fileSets) {\n            await transformFiles(transformer, fileSet)\n          }\n\n          await new AsarPackager(appDir, resourcePath, asarOptions, fileMatcher == null ? null : fileMatcher.createFilter())\n            .pack(fileSets, this)\n        }))\n    }\n  }\n\n  protected signApp(packContext: AfterPackContext, isAsar: boolean): Promise<any> {\n    return Promise.resolve()\n  }\n\n  async getIconPath(): Promise<string | null> {\n    return null\n  }\n\n  private async computeAsarOptions(customBuildOptions: DC): Promise<AsarOptions | null> {\n    if (!isElectronBased(this.info.framework)) {\n      return null\n    }\n\n    function errorMessage(name: string) {\n      return `${name} is deprecated is deprecated and not supported â€” please use asarUnpack`\n    }\n\n    const buildMetadata = this.config as any\n    if (buildMetadata[\"asar-unpack\"] != null) {\n      throw new Error(errorMessage(\"asar-unpack\"))\n    }\n    if (buildMetadata[\"asar-unpack-dir\"] != null) {\n      throw new Error(errorMessage(\"asar-unpack-dir\"))\n    }\n\n    const platformSpecific = customBuildOptions.asar\n    const result = platformSpecific == null ? this.config.asar : platformSpecific\n    if (result === false) {\n      const appAsarStat = await statOrNull(path.join(this.info.appDir, \"app.asar\"))\n      //noinspection ES6MissingAwait\n      if (appAsarStat == null || !appAsarStat.isFile()) {\n        log.warn({\n          solution: \"enable asar and use asarUnpack to unpack files that must be externally available\",\n        }, \"asar using is disabled â€” it is strongly not recommended\")\n      }\n      return null\n    }\n\n    if (result == null || result === true) {\n      return {}\n    }\n\n    for (const name of [\"unpackDir\", \"unpack\"]) {\n      if ((result as any)[name] != null) {\n        throw new Error(errorMessage(`asar.${name}`))\n      }\n    }\n    return deepAssign({}, result)\n  }\n\n  public getElectronSrcDir(dist: string): string {\n    return path.resolve(this.projectDir, dist)\n  }\n\n  public getElectronDestinationDir(appOutDir: string): string {\n    return appOutDir\n  }\n\n  getResourcesDir(appOutDir: string): string {\n    if (this.platform === Platform.MAC) {\n      return this.getMacOsResourcesDir(appOutDir)\n    }\n    else if (isElectronBased(this.info.framework)) {\n      return path.join(appOutDir, \"resources\")\n    }\n    else {\n      return appOutDir\n    }\n  }\n\n  public getMacOsResourcesDir(appOutDir: string): string {\n    return path.join(appOutDir, `${this.appInfo.productFilename}.app`, \"Contents\", \"Resources\")\n  }\n\n  private async checkFileInPackage(resourcesDir: string, file: string, messagePrefix: string, isAsar: boolean) {\n    const relativeFile = path.relative(this.info.appDir, path.resolve(this.info.appDir, file))\n    if (isAsar) {\n      await checkFileInArchive(path.join(resourcesDir, \"app.asar\"), relativeFile, messagePrefix)\n      return\n    }\n\n    const pathParsed = path.parse(file)\n    // Even when packaging to asar is disabled, it does not imply that the main file can not be inside an .asar archive.\n    // This may occur when the packaging is done manually before processing with electron-builder.\n    if (pathParsed.dir.includes(\".asar\")) {\n      // The path needs to be split to the part with an asar archive which acts like a directory and the part with\n      // the path to main file itself. (e.g. path/arch.asar/dir/index.js -> path/arch.asar, dir/index.js)\n      // noinspection TypeScriptValidateJSTypes\n      const pathSplit: Array<string> = pathParsed.dir.split(path.sep)\n      let partWithAsarIndex = 0\n      pathSplit.some((pathPart: string, index: number) => {\n        partWithAsarIndex = index\n        return pathPart.endsWith(\".asar\")\n      })\n      const asarPath = path.join.apply(path, pathSplit.slice(0, partWithAsarIndex + 1))\n      let mainPath = pathSplit.length > (partWithAsarIndex + 1) ? path.join.apply(pathSplit.slice(partWithAsarIndex + 1)) : \"\"\n      mainPath += path.join(mainPath, pathParsed.base)\n      await checkFileInArchive(path.join(resourcesDir, \"app\", asarPath), mainPath, messagePrefix)\n    }\n    else {\n      const fullPath = path.join(resourcesDir, \"app\", relativeFile)\n      const outStat = await statOrNull(fullPath)\n      if (outStat == null) {\n        throw new Error(`${messagePrefix} \"${fullPath}\" does not exist. Seems like a wrong configuration.`)\n      }\n      else {\n        //noinspection ES6MissingAwait\n        if (!outStat.isFile()) {\n          throw new Error(`${messagePrefix} \"${fullPath}\" is not a file. Seems like a wrong configuration.`)\n        }\n      }\n    }\n  }\n\n  private async sanityCheckPackage(appOutDir: string, isAsar: boolean, framework: Framework): Promise<any> {\n    const outStat = await statOrNull(appOutDir)\n    if (outStat == null) {\n      throw new Error(`Output directory \"${appOutDir}\" does not exist. Seems like a wrong configuration.`)\n    }\n    else {\n      //noinspection ES6MissingAwait\n      if (!outStat.isDirectory()) {\n        throw new Error(`Output directory \"${appOutDir}\" is not a directory. Seems like a wrong configuration.`)\n      }\n    }\n\n    const resourcesDir = this.getResourcesDir(appOutDir)\n    const mainFile = (framework.getMainFile == null ? null : framework.getMainFile(this.platform)) || this.info.metadata.main || \"index.js\"\n    await this.checkFileInPackage(resourcesDir, mainFile, \"Application entry file\", isAsar)\n    await this.checkFileInPackage(resourcesDir, \"package.json\", \"Application\", isAsar)\n  }\n\n  // tslint:disable-next-line:no-invalid-template-strings\n  computeSafeArtifactName(suggestedName: string | null, ext: string, arch?: Arch | null, skipArchIfX64 = true, safePattern: string = \"${name}-${version}-${arch}.${ext}\"): string | null {\n    // GitHub only allows the listed characters in file names.\n    if (suggestedName != null && isSafeGithubName(suggestedName)) {\n      return null\n    }\n\n    return this.computeArtifactName(safePattern, ext, skipArchIfX64 && arch === Arch.x64 ? null : arch)\n  }\n\n  expandArtifactNamePattern(targetSpecificOptions: TargetSpecificOptions | null | undefined, ext: string, arch?: Arch | null, defaultPattern?: string, skipArchIfX64 = true): string {\n    let pattern = targetSpecificOptions == null ? null : targetSpecificOptions.artifactName\n    if (pattern == null) {\n      pattern = this.platformSpecificBuildOptions.artifactName || this.config.artifactName\n    }\n\n    if (pattern == null) {\n      // tslint:disable-next-line:no-invalid-template-strings\n      pattern = defaultPattern || \"${productName}-${version}-${arch}.${ext}\"\n    }\n    else {\n      // https://github.com/electron-userland/electron-builder/issues/3510\n      // always respect arch in user custom artifact pattern\n      skipArchIfX64 = false\n    }\n    return this.computeArtifactName(pattern, ext, skipArchIfX64 && arch === Arch.x64 ? null : arch)\n  }\n\n  expandArtifactBeautyNamePattern(targetSpecificOptions: TargetSpecificOptions | null | undefined, ext: string, arch?: Arch | null): string {\n    // tslint:disable-next-line:no-invalid-template-strings\n    return this.expandArtifactNamePattern(targetSpecificOptions, ext, arch, \"${productName} ${version} ${arch}.${ext}\", true)\n  }\n\n  private computeArtifactName(pattern: any, ext: string, arch: Arch | null | undefined) {\n    let archName: string | null = arch == null ? null : Arch[arch]\n    if (arch === Arch.x64) {\n      if (ext === \"AppImage\" || ext === \"rpm\") {\n        archName = \"x86_64\"\n      }\n      else if (ext === \"deb\" || ext === \"snap\") {\n        archName = \"amd64\"\n      }\n    }\n    else if (arch === Arch.ia32) {\n      if (ext === \"deb\" || ext === \"AppImage\" || ext === \"snap\") {\n        archName = \"i386\"\n      }\n      else if (ext === \"pacman\" || ext === \"rpm\") {\n        archName = \"i686\"\n      }\n    }\n\n    return this.expandMacro(pattern, this.platform === Platform.MAC ? null : archName, {\n      ext\n    })\n  }\n\n  expandMacro(pattern: string, arch?: string | null, extra: any = {}, isProductNameSanitized = true): string {\n    return doExpandMacro(pattern, arch, this.appInfo, {os: this.platform.buildConfigurationKey, ...extra}, isProductNameSanitized)\n  }\n\n  generateName2(ext: string | null, classifier: string | null | undefined, deployment: boolean): string {\n    const dotExt = ext == null ? \"\" : `.${ext}`\n    const separator = ext === \"deb\" ? \"_\" : \"-\"\n    return `${deployment ? this.appInfo.name : this.appInfo.productFilename}${separator}${this.appInfo.version}${classifier == null ? \"\" : `${separator}${classifier}`}${dotExt}`\n  }\n\n  getTempFile(suffix: string): Promise<string> {\n    return this.info.tempDirManager.getTempFile({suffix})\n  }\n\n  get fileAssociations(): Array<FileAssociation> {\n    return asArray(this.config.fileAssociations).concat(asArray(this.platformSpecificBuildOptions.fileAssociations))\n  }\n\n  async getResource(custom: string | null | undefined, ...names: Array<string>): Promise<string | null> {\n    const resourcesDir = this.info.buildResourcesDir\n    if (custom === undefined) {\n      const resourceList = await this.resourceList\n      for (const name of names) {\n        if (resourceList.includes(name)) {\n          return path.join(resourcesDir, name)\n        }\n      }\n    }\n    else if (custom != null && !isEmptyOrSpaces(custom)) {\n      const resourceList = await this.resourceList\n      if (resourceList.includes(custom)) {\n        return path.join(resourcesDir, custom)\n      }\n\n      let p = path.resolve(resourcesDir, custom)\n      if (await statOrNull(p) == null) {\n        p = path.resolve(this.projectDir, custom)\n        if (await statOrNull(p) == null) {\n          throw new InvalidConfigurationError(`cannot find specified resource \"${custom}\", nor relative to \"${resourcesDir}\", neither relative to project dir (\"${this.projectDir}\")`)\n        }\n      }\n      return p\n    }\n    return null\n  }\n\n  get forceCodeSigning(): boolean {\n    const forceCodeSigningPlatform = this.platformSpecificBuildOptions.forceCodeSigning\n    return (forceCodeSigningPlatform == null ? this.config.forceCodeSigning : forceCodeSigningPlatform) || false\n  }\n\n  protected async getOrConvertIcon(format: IconFormat): Promise<string | null> {\n    const result = await this.resolveIcon(asArray(this.platformSpecificBuildOptions.icon || this.config.icon), [], format)\n    if (result.length === 0) {\n      const framework = this.info.framework\n      if (framework.getDefaultIcon != null) {\n        return framework.getDefaultIcon(this.platform)\n      }\n\n      log.warn({reason: \"application icon is not set\"}, `default ${capitalizeFirstLetter(framework.name)} icon is used`)\n      return this.getDefaultFrameworkIcon()\n    }\n    else {\n      return result[0].file\n    }\n  }\n\n  getDefaultFrameworkIcon(): string | null {\n    const framework = this.info.framework\n    return framework.getDefaultIcon == null ? null : framework.getDefaultIcon(this.platform)\n  }\n\n  // convert if need, validate size (it is a reason why tool is called even if file has target extension (already specified as foo.icns for example))\n  async resolveIcon(sources: Array<string>, fallbackSources: Array<string>, outputFormat: IconFormat): Promise<Array<IconInfo>> {\n    const args = [\n      \"icon\",\n      \"--format\", outputFormat,\n      \"--root\", this.buildResourcesDir,\n      \"--root\", this.projectDir,\n      \"--out\", path.resolve(this.projectDir, this.config.directories!!.output!!, `.icon-${outputFormat}`),\n    ]\n    for (const source of sources) {\n      args.push(\"--input\", source)\n    }\n    for (const source of fallbackSources) {\n      args.push(\"--fallback-input\", source)\n    }\n\n    const result: IconConvertResult = await executeAppBuilderAsJson(args)\n    const errorMessage = result.error\n    if (errorMessage != null) {\n      throw new InvalidConfigurationError(errorMessage, result.errorCode)\n    }\n\n    if (result.isFallback) {\n      log.warn({reason: \"application icon is not set\"}, `default ${capitalizeFirstLetter(this.info.framework.name)} icon is used`)\n    }\n\n    return result.icons || []\n  }\n}\n\nexport interface IconInfo {\n  file: string\n  size: number\n}\n\ninterface IconConvertResult {\n  icons?: Array<IconInfo>\n\n  error?: string\n  errorCode?: string\n  isFallback?: boolean\n}\n\nexport type IconFormat = \"icns\" | \"ico\" | \"set\"\n\nexport function isSafeGithubName(name: string) {\n  return /^[0-9A-Za-z._-]+$/.test(name)\n}\n\n// remove leading dot\nexport function normalizeExt(ext: string) {\n  return ext.startsWith(\".\") ? ext.substring(1) : ext\n}\n\nexport function resolveFunction<T>(executor: T | string, name: string): T {\n  if (executor == null || typeof executor !== \"string\") {\n    return executor\n  }\n\n  let p = executor as string\n  if (p.startsWith(\".\")) {\n    p = path.resolve(p)\n  }\n\n  try {\n    p = require.resolve(p)\n  }\n  catch (e) {\n    debug(e)\n    p = path.resolve(p)\n  }\n\n  const m = require(p)\n  const namedExport = m[name]\n  if (namedExport == null) {\n    return m.default || m\n  }\n  else {\n    return namedExport\n  }\n}\n\nexport function chooseNotNull(v1: string | null | undefined, v2: string | null | undefined): string | null | undefined {\n  return v1 == null ? v2 : v1\n}\n\nfunction capitalizeFirstLetter(text: string) {\n  return text.charAt(0).toUpperCase() + text.slice(1)\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.WinPackager = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _isCi() {
  const data = _interopRequireDefault(require("is-ci"));

  _isCi = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _codesign() {
  const data = require("./codeSign/codesign");

  _codesign = function () {
    return data;
  };

  return data;
}

function _windowsCodeSign() {
  const data = require("./codeSign/windowsCodeSign");

  _windowsCodeSign = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("./core");

  _core = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("./platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _NsisTarget() {
  const data = require("./targets/nsis/NsisTarget");

  _NsisTarget = function () {
    return data;
  };

  return data;
}

function _nsisUtil() {
  const data = require("./targets/nsis/nsisUtil");

  _nsisUtil = function () {
    return data;
  };

  return data;
}

function _WebInstallerTarget() {
  const data = require("./targets/nsis/WebInstallerTarget");

  _WebInstallerTarget = function () {
    return data;
  };

  return data;
}

function _targetFactory() {
  const data = require("./targets/targetFactory");

  _targetFactory = function () {
    return data;
  };

  return data;
}

function _cacheManager() {
  const data = require("./util/cacheManager");

  _cacheManager = function () {
    return data;
  };

  return data;
}

function _flags() {
  const data = require("./util/flags");

  _flags = function () {
    return data;
  };

  return data;
}

function _timer() {
  const data = require("./util/timer");

  _timer = function () {
    return data;
  };

  return data;
}

function _vm() {
  const data = require("./vm/vm");

  _vm = function () {
    return data;
  };

  return data;
}

function _wine() {
  const data = require("./wine");

  _wine = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class WinPackager extends _platformPackager().PlatformPackager {
  constructor(info) {
    var _this;

    super(info, _core().Platform.WINDOWS);
    _this = this;
    this.cscInfo = new (_lazyVal().Lazy)(() => {
      const platformSpecificBuildOptions = this.platformSpecificBuildOptions;

      if (platformSpecificBuildOptions.certificateSubjectName != null || platformSpecificBuildOptions.certificateSha1 != null) {
        return this.vm.value.then(vm => (0, _windowsCodeSign().getCertificateFromStoreInfo)(platformSpecificBuildOptions, vm)).catch(e => {
          // https://github.com/electron-userland/electron-builder/pull/2397
          if (platformSpecificBuildOptions.sign == null) {
            throw e;
          } else {
            _builderUtil().log.debug({
              error: e
            }, "getCertificateFromStoreInfo error");

            return null;
          }
        });
      }

      const certificateFile = platformSpecificBuildOptions.certificateFile;

      if (certificateFile != null) {
        const certificatePassword = this.getCscPassword();
        return Promise.resolve({
          file: certificateFile,
          password: certificatePassword == null ? null : certificatePassword.trim()
        });
      }

      const cscLink = this.getCscLink("WIN_CSC_LINK");

      if (cscLink == null) {
        return Promise.resolve(null);
      }

      return (0, _codesign().downloadCertificate)(cscLink, this.info.tempDirManager, this.projectDir) // before then
      .catch(e => {
        if (e instanceof _builderUtil().InvalidConfigurationError) {
          throw new (_builderUtil().InvalidConfigurationError)(`Env WIN_CSC_LINK is not correct, cannot resolve: ${e.message}`);
        } else {
          throw e;
        }
      }).then(path => {
        return {
          file: path,
          password: this.getCscPassword()
        };
      });
    });
    this._iconPath = new (_lazyVal().Lazy)(() => this.getOrConvertIcon("ico"));
    this.vm = new (_lazyVal().Lazy)(() => process.platform === "win32" ? Promise.resolve(new (_vm().VmManager)()) : (0, _vm().getWindowsVm)(this.debugLogger));
    this.computedPublisherName = new (_lazyVal().Lazy)(
    /*#__PURE__*/
    (0, _bluebirdLst().coroutine)(function* () {
      const publisherName = _this.platformSpecificBuildOptions.publisherName;

      if (publisherName === null) {
        return null;
      } else if (publisherName != null) {
        return (0, _builderUtil().asArray)(publisherName);
      }

      const certInfo = yield _this.lazyCertInfo.value;
      return certInfo == null ? null : [certInfo.commonName];
    }));
    this.lazyCertInfo = new (_lazyVal().Lazy)(
    /*#__PURE__*/
    (0, _bluebirdLst().coroutine)(function* () {
      const cscInfo = yield _this.cscInfo.value;

      if (cscInfo == null) {
        return null;
      }

      if ("subject" in cscInfo) {
        const bloodyMicrosoftSubjectDn = cscInfo.subject;
        return {
          commonName: (0, _builderUtilRuntime().parseDn)(bloodyMicrosoftSubjectDn).get("CN"),
          bloodyMicrosoftSubjectDn
        };
      }

      const cscFile = cscInfo.file;

      if (cscFile == null) {
        return null;
      }

      return yield (0, _windowsCodeSign().getCertInfo)(cscFile, cscInfo.password || "");
    }));
  }

  get isForceCodeSigningVerification() {
    return this.platformSpecificBuildOptions.verifyUpdateCodeSignature !== false;
  }

  get defaultTarget() {
    return ["nsis"];
  }

  doGetCscPassword() {
    return (0, _platformPackager().chooseNotNull)((0, _platformPackager().chooseNotNull)(this.platformSpecificBuildOptions.certificatePassword, process.env.WIN_CSC_KEY_PASSWORD), super.doGetCscPassword());
  }

  createTargets(targets, mapper) {
    let copyElevateHelper;

    const getCopyElevateHelper = () => {
      if (copyElevateHelper == null) {
        copyElevateHelper = new (_nsisUtil().CopyElevateHelper)();
      }

      return copyElevateHelper;
    };

    let helper;

    const getHelper = () => {
      if (helper == null) {
        helper = new (_nsisUtil().AppPackageHelper)(getCopyElevateHelper());
      }

      return helper;
    };

    for (const name of targets) {
      if (name === _core().DIR_TARGET) {
        continue;
      }

      if (name === "nsis" || name === "portable") {
        mapper(name, outDir => new (_NsisTarget().NsisTarget)(this, outDir, name, getHelper()));
      } else if (name === "nsis-web") {
        // package file format differs from nsis target
        mapper(name, outDir => new (_WebInstallerTarget().WebInstallerTarget)(this, path.join(outDir, name), name, new (_nsisUtil().AppPackageHelper)(getCopyElevateHelper())));
      } else {
        const targetClass = (() => {
          switch (name) {
            case "squirrel":
              try {
                return require("electron-builder-squirrel-windows").default;
              } catch (e) {
                throw new (_builderUtil().InvalidConfigurationError)(`Module electron-builder-squirrel-windows must be installed in addition to build Squirrel.Windows: ${e.stack || e}`);
              }

            case "appx":
              return require("./targets/AppxTarget").default;

            case "msi":
              return require("./targets/MsiTarget").default;

            default:
              return null;
          }
        })();

        mapper(name, outDir => targetClass === null ? (0, _targetFactory().createCommonTarget)(name, outDir, this) : new targetClass(this, outDir, name));
      }
    }
  }

  getIconPath() {
    return this._iconPath.value;
  }

  sign(file, logMessagePrefix) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const signOptions = {
        path: file,
        name: _this2.appInfo.productName,
        site: yield _this2.appInfo.computePackageUrl(),
        options: _this2.platformSpecificBuildOptions
      };
      const cscInfo = yield _this2.cscInfo.value;

      if (cscInfo == null) {
        if (_this2.platformSpecificBuildOptions.sign != null) {
          yield (0, _windowsCodeSign().sign)(signOptions, _this2);
        } else if (_this2.forceCodeSigning) {
          throw new (_builderUtil().InvalidConfigurationError)(`App is not signed and "forceCodeSigning" is set to true, please ensure that code signing configuration is correct, please see https://electron.build/code-signing`);
        }

        return;
      }

      if (logMessagePrefix == null) {
        logMessagePrefix = "signing";
      }

      if ("file" in cscInfo) {
        _builderUtil().log.info({
          file: _builderUtil().log.filePath(file),
          certificateFile: cscInfo.file
        }, logMessagePrefix);
      } else {
        const info = cscInfo;

        _builderUtil().log.info({
          file: _builderUtil().log.filePath(file),
          subject: info.subject,
          thumbprint: info.thumbprint,
          store: info.store,
          user: info.isLocalMachineStore ? "local machine" : "current user"
        }, logMessagePrefix);
      }

      yield _this2.doSign(Object.assign({}, signOptions, {
        cscInfo,
        options: Object.assign({}, _this2.platformSpecificBuildOptions)
      }));
    })();
  }

  doSign(options) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      for (let i = 0; i < 3; i++) {
        try {
          yield (0, _windowsCodeSign().sign)(options, _this3);
          break;
        } catch (e) {
          // https://github.com/electron-userland/electron-builder/issues/1414
          const message = e.message;

          if (message != null && message.includes("Couldn't resolve host name")) {
            _builderUtil().log.warn({
              error: message,
              attempt: i + 1
            }, `cannot sign`);

            continue;
          }

          throw e;
        }
      }
    })();
  }

  signAndEditResources(file, arch, outDir, internalName, requestedExecutionLevel) {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appInfo = _this4.appInfo;
      const files = [];
      const args = [file, "--set-version-string", "FileDescription", appInfo.productName, "--set-version-string", "ProductName", appInfo.productName, "--set-version-string", "LegalCopyright", appInfo.copyright, "--set-file-version", appInfo.buildVersion, "--set-product-version", appInfo.getVersionInWeirdWindowsForm()];

      if (internalName != null) {
        args.push("--set-version-string", "InternalName", internalName, "--set-version-string", "OriginalFilename", "");
      }

      if (requestedExecutionLevel != null && requestedExecutionLevel !== "asInvoker") {
        args.push("--set-requested-execution-level", requestedExecutionLevel);
      }

      (0, _builderUtil().use)(appInfo.companyName, it => args.push("--set-version-string", "CompanyName", it));
      (0, _builderUtil().use)(_this4.platformSpecificBuildOptions.legalTrademarks, it => args.push("--set-version-string", "LegalTrademarks", it));
      const iconPath = yield _this4.getIconPath();
      (0, _builderUtil().use)(iconPath, it => {
        files.push(it);
        args.push("--set-icon", it);
      });
      const config = _this4.config;
      const cscInfoForCacheDigest = !(0, _flags().isBuildCacheEnabled)() || _isCi().default || config.electronDist != null ? null : yield _this4.cscInfo.value;
      let buildCacheManager = null; // resources editing doesn't change executable for the same input and executed quickly - no need to complicate

      if (cscInfoForCacheDigest != null) {
        const cscFile = cscInfoForCacheDigest.file;

        if (cscFile != null) {
          files.push(cscFile);
        }

        const timer = (0, _timer().time)("executable cache");
        const hash = (0, _crypto().createHash)("sha512");
        hash.update(config.electronVersion || "no electronVersion");
        hash.update(JSON.stringify(_this4.platformSpecificBuildOptions));
        hash.update(JSON.stringify(args));
        hash.update(_this4.platformSpecificBuildOptions.certificateSha1 || "no certificateSha1");
        hash.update(_this4.platformSpecificBuildOptions.certificateSubjectName || "no subjectName");
        buildCacheManager = new (_cacheManager().BuildCacheManager)(outDir, file, arch);

        if (yield buildCacheManager.copyIfValid((yield (0, _cacheManager().digest)(hash, files)))) {
          timer.end();
          return;
        }

        timer.end();
      }

      const timer = (0, _timer().time)("wine&sign"); // rcedit crashed of executed using wine, resourcehacker works

      if (process.platform === "win32" || _this4.info.framework.name === "electron") {
        const vendorPath = yield (0, _windowsCodeSign().getSignVendorPath)();
        yield (0, _wine().execWine)(path.join(vendorPath, "rcedit-ia32.exe"), path.join(vendorPath, "rcedit-x64.exe"), args);
      }

      yield _this4.sign(file);
      timer.end();

      if (buildCacheManager != null) {
        yield buildCacheManager.save();
      }
    })();
  }

  isSignDlls() {
    return this.platformSpecificBuildOptions.signDlls === true;
  }

  createTransformerForExtraFiles(packContext) {
    if (this.platformSpecificBuildOptions.signAndEditExecutable === false) {
      return null;
    }

    return file => {
      if (file.endsWith(".exe") || this.isSignDlls() && file.endsWith(".dll")) {
        const parentDir = path.dirname(file);

        if (parentDir !== packContext.appOutDir) {
          return new (_fs().CopyFileTransformer)(file => this.sign(file));
        }
      }

      return null;
    };
  }

  signApp(packContext, isAsar) {
    var _this5 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const exeFileName = `${_this5.appInfo.productFilename}.exe`;

      if (_this5.platformSpecificBuildOptions.signAndEditExecutable === false) {
        return;
      }

      yield _bluebirdLst().default.map((0, _fsExtraP().readdir)(packContext.appOutDir), file => {
        if (file === exeFileName) {
          return _this5.signAndEditResources(path.join(packContext.appOutDir, exeFileName), packContext.arch, packContext.outDir, path.basename(exeFileName, ".exe"), _this5.platformSpecificBuildOptions.requestedExecutionLevel);
        } else if (file.endsWith(".exe") || _this5.isSignDlls() && file.endsWith(".dll")) {
          return _this5.sign(path.join(packContext.appOutDir, file));
        }

        return null;
      });

      if (!isAsar) {
        return;
      }

      const outResourcesDir = path.join(packContext.appOutDir, "resources", "app.asar.unpacked");
      yield _bluebirdLst().default.map((0, _promise().orIfFileNotExist)((0, _fsExtraP().readdir)(outResourcesDir), []), file => {
        if (file.endsWith(".exe") || file.endsWith(".dll")) {
          return _this5.sign(path.join(outResourcesDir, file));
        } else {
          return null;
        }
      });
    })();
  }

} exports.WinPackager = WinPackager;
// __ts-babel@6.0.4
//# sourceMappingURL=winPackager.js.map{"version":3,"sources":["../src/winPackager.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, asArray, InvalidConfigurationError, log, use } from \"builder-util\"\nimport { parseDn } from \"builder-util-runtime\"\nimport { CopyFileTransformer, FileTransformer } from \"builder-util/out/fs\"\nimport { orIfFileNotExist } from \"builder-util/out/promise\"\nimport { createHash } from \"crypto\"\nimport { readdir } from \"fs-extra-p\"\nimport isCI from \"is-ci\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { downloadCertificate } from \"./codeSign/codesign\"\nimport { CertificateFromStoreInfo, CertificateInfo, FileCodeSigningInfo, getCertificateFromStoreInfo, getCertInfo, getSignVendorPath, sign, WindowsSignOptions } from \"./codeSign/windowsCodeSign\"\nimport { AfterPackContext } from \"./configuration\"\nimport { DIR_TARGET, Platform, Target } from \"./core\"\nimport { RequestedExecutionLevel, WindowsConfiguration } from \"./options/winOptions\"\nimport { Packager } from \"./packager\"\nimport { chooseNotNull, PlatformPackager } from \"./platformPackager\"\nimport AppXTarget from \"./targets/AppxTarget\"\nimport { NsisTarget } from \"./targets/nsis/NsisTarget\"\nimport { AppPackageHelper, CopyElevateHelper } from \"./targets/nsis/nsisUtil\"\nimport { WebInstallerTarget } from \"./targets/nsis/WebInstallerTarget\"\nimport { createCommonTarget } from \"./targets/targetFactory\"\nimport { BuildCacheManager, digest } from \"./util/cacheManager\"\nimport { isBuildCacheEnabled } from \"./util/flags\"\nimport { time } from \"./util/timer\"\nimport { getWindowsVm, VmManager } from \"./vm/vm\"\nimport { execWine } from \"./wine\"\n\nexport class WinPackager extends PlatformPackager<WindowsConfiguration> {\n  readonly cscInfo = new Lazy<FileCodeSigningInfo | CertificateFromStoreInfo | null>(() => {\n    const platformSpecificBuildOptions = this.platformSpecificBuildOptions\n    if (platformSpecificBuildOptions.certificateSubjectName != null || platformSpecificBuildOptions.certificateSha1 != null) {\n      return this.vm.value\n        .then(vm => getCertificateFromStoreInfo(platformSpecificBuildOptions, vm))\n        .catch(e => {\n          // https://github.com/electron-userland/electron-builder/pull/2397\n          if (platformSpecificBuildOptions.sign == null) {\n            throw e\n          }\n          else {\n            log.debug({error: e}, \"getCertificateFromStoreInfo error\")\n            return null\n          }\n        })\n    }\n\n    const certificateFile = platformSpecificBuildOptions.certificateFile\n    if (certificateFile != null) {\n      const certificatePassword = this.getCscPassword()\n      return Promise.resolve({\n        file: certificateFile,\n        password: certificatePassword == null ? null : certificatePassword.trim(),\n      })\n    }\n\n    const cscLink = this.getCscLink(\"WIN_CSC_LINK\")\n    if (cscLink == null) {\n      return Promise.resolve(null)\n    }\n\n    return downloadCertificate(cscLink, this.info.tempDirManager, this.projectDir)\n      // before then\n      .catch(e => {\n        if (e instanceof InvalidConfigurationError) {\n          throw new InvalidConfigurationError(`Env WIN_CSC_LINK is not correct, cannot resolve: ${e.message}`)\n        }\n        else {\n          throw e\n        }\n      })\n      .then(path => {\n        return {\n          file: path!!,\n          password: this.getCscPassword(),\n        }\n      })\n  })\n\n  private _iconPath = new Lazy(() => this.getOrConvertIcon(\"ico\"))\n\n  readonly vm = new Lazy<VmManager>(() => process.platform === \"win32\" ? Promise.resolve(new VmManager()) : getWindowsVm(this.debugLogger))\n\n  readonly computedPublisherName = new Lazy<Array<string> | null>(async () => {\n    const publisherName = (this.platformSpecificBuildOptions as WindowsConfiguration).publisherName\n    if (publisherName === null) {\n      return null\n    }\n    else if (publisherName != null) {\n      return asArray(publisherName)\n    }\n\n    const certInfo = await this.lazyCertInfo.value\n    return certInfo == null ? null : [certInfo.commonName]\n  })\n\n  readonly lazyCertInfo = new Lazy<CertificateInfo | null>(async () => {\n    const cscInfo = await this.cscInfo.value\n    if (cscInfo == null) {\n      return null\n    }\n\n    if (\"subject\" in cscInfo) {\n      const bloodyMicrosoftSubjectDn = (cscInfo as CertificateFromStoreInfo).subject\n      return {\n        commonName: parseDn(bloodyMicrosoftSubjectDn).get(\"CN\")!!,\n        bloodyMicrosoftSubjectDn,\n      }\n    }\n\n    const cscFile = (cscInfo as FileCodeSigningInfo).file\n    if (cscFile == null) {\n      return null\n    }\n    return await getCertInfo(cscFile, (cscInfo as FileCodeSigningInfo).password || \"\")\n  })\n\n  get isForceCodeSigningVerification(): boolean {\n    return this.platformSpecificBuildOptions.verifyUpdateCodeSignature !== false\n  }\n\n  constructor(info: Packager) {\n    super(info, Platform.WINDOWS)\n  }\n\n  get defaultTarget(): Array<string> {\n    return [\"nsis\"]\n  }\n\n  protected doGetCscPassword(): string | undefined | null {\n    return chooseNotNull(chooseNotNull(this.platformSpecificBuildOptions.certificatePassword, process.env.WIN_CSC_KEY_PASSWORD), super.doGetCscPassword())\n  }\n\n  createTargets(targets: Array<string>, mapper: (name: string, factory: (outDir: string) => Target) => void): void {\n    let copyElevateHelper: CopyElevateHelper | null\n    const getCopyElevateHelper = () => {\n      if (copyElevateHelper == null) {\n        copyElevateHelper = new CopyElevateHelper()\n      }\n      return copyElevateHelper\n    }\n\n    let helper: AppPackageHelper | null\n    const getHelper = () => {\n      if (helper == null) {\n        helper = new AppPackageHelper(getCopyElevateHelper())\n      }\n      return helper\n    }\n\n    for (const name of targets) {\n      if (name === DIR_TARGET) {\n        continue\n      }\n\n      if (name === \"nsis\" || name === \"portable\") {\n        mapper(name, outDir => new NsisTarget(this, outDir, name, getHelper()))\n      }\n      else if (name === \"nsis-web\") {\n        // package file format differs from nsis target\n        mapper(name, outDir => new WebInstallerTarget(this, path.join(outDir, name), name, new AppPackageHelper(getCopyElevateHelper())))\n      }\n      else {\n        const targetClass: typeof NsisTarget | typeof AppXTarget | null = (() => {\n          switch (name) {\n            case \"squirrel\":\n              try {\n                return require(\"electron-builder-squirrel-windows\").default\n              }\n              catch (e) {\n                throw new InvalidConfigurationError(`Module electron-builder-squirrel-windows must be installed in addition to build Squirrel.Windows: ${e.stack || e}`)\n              }\n\n            case \"appx\":\n              return require(\"./targets/AppxTarget\").default\n\n            case \"msi\":\n              return require(\"./targets/MsiTarget\").default\n\n            default:\n              return null\n          }\n        })()\n\n        mapper(name, outDir => targetClass === null ? createCommonTarget(name, outDir, this) : new (targetClass as any)(this, outDir, name))\n      }\n    }\n  }\n\n  getIconPath() {\n    return this._iconPath.value\n  }\n\n  async sign(file: string, logMessagePrefix?: string): Promise<void> {\n    const signOptions: WindowsSignOptions = {\n      path: file,\n      name: this.appInfo.productName,\n      site: await this.appInfo.computePackageUrl(),\n      options: this.platformSpecificBuildOptions,\n    }\n\n    const cscInfo = await this.cscInfo.value\n    if (cscInfo == null) {\n      if (this.platformSpecificBuildOptions.sign != null) {\n        await sign(signOptions, this)\n      }\n      else if (this.forceCodeSigning) {\n        throw new InvalidConfigurationError(`App is not signed and \"forceCodeSigning\" is set to true, please ensure that code signing configuration is correct, please see https://electron.build/code-signing`)\n      }\n      return\n    }\n\n    if (logMessagePrefix == null) {\n      logMessagePrefix = \"signing\"\n    }\n\n    if (\"file\" in cscInfo) {\n      log.info({\n        file: log.filePath(file),\n        certificateFile: (cscInfo as FileCodeSigningInfo).file,\n      }, logMessagePrefix)\n    }\n    else {\n      const info = cscInfo as CertificateFromStoreInfo\n      log.info({\n        file: log.filePath(file),\n        subject: info.subject,\n        thumbprint: info.thumbprint,\n        store: info.store,\n        user: info.isLocalMachineStore ? \"local machine\" : \"current user\",\n      }, logMessagePrefix)\n    }\n\n    await this.doSign({\n      ...signOptions,\n      cscInfo,\n      options: {\n        ...this.platformSpecificBuildOptions,\n      },\n    })\n  }\n\n  private async doSign(options: WindowsSignOptions) {\n    for (let i = 0; i < 3; i++) {\n      try {\n        await sign(options, this)\n        break\n      }\n      catch (e) {\n        // https://github.com/electron-userland/electron-builder/issues/1414\n        const message = e.message\n        if (message != null && message.includes(\"Couldn't resolve host name\")) {\n          log.warn({error: message, attempt: i + 1}, `cannot sign`)\n          continue\n        }\n        throw e\n      }\n    }\n  }\n\n  async signAndEditResources(file: string, arch: Arch, outDir: string, internalName?: string | null, requestedExecutionLevel?: RequestedExecutionLevel | null) {\n    const appInfo = this.appInfo\n\n    const files: Array<string> = []\n\n    const args = [\n      file,\n      \"--set-version-string\", \"FileDescription\", appInfo.productName,\n      \"--set-version-string\", \"ProductName\", appInfo.productName,\n      \"--set-version-string\", \"LegalCopyright\", appInfo.copyright,\n      \"--set-file-version\", appInfo.buildVersion,\n      \"--set-product-version\", appInfo.getVersionInWeirdWindowsForm(),\n    ]\n\n    if (internalName != null) {\n      args.push(\n        \"--set-version-string\", \"InternalName\", internalName,\n        \"--set-version-string\", \"OriginalFilename\", \"\",\n      )\n    }\n\n    if (requestedExecutionLevel != null && requestedExecutionLevel !== \"asInvoker\") {\n      args.push(\"--set-requested-execution-level\", requestedExecutionLevel)\n    }\n\n    use(appInfo.companyName, it => args.push(\"--set-version-string\", \"CompanyName\", it!))\n    use(this.platformSpecificBuildOptions.legalTrademarks, it => args.push(\"--set-version-string\", \"LegalTrademarks\", it!))\n    const iconPath = await this.getIconPath()\n    use(iconPath, it => {\n      files.push(it)\n      args.push(\"--set-icon\", it)\n    })\n\n    const config = this.config\n    const cscInfoForCacheDigest = !isBuildCacheEnabled() || isCI || config.electronDist != null ? null : await this.cscInfo.value\n    let buildCacheManager: BuildCacheManager | null = null\n    // resources editing doesn't change executable for the same input and executed quickly - no need to complicate\n    if (cscInfoForCacheDigest != null) {\n      const cscFile = (cscInfoForCacheDigest as FileCodeSigningInfo).file\n      if (cscFile != null) {\n        files.push(cscFile)\n      }\n\n      const timer = time(\"executable cache\")\n      const hash = createHash(\"sha512\")\n      hash.update(config.electronVersion || \"no electronVersion\")\n      hash.update(JSON.stringify(this.platformSpecificBuildOptions))\n      hash.update(JSON.stringify(args))\n      hash.update(this.platformSpecificBuildOptions.certificateSha1 || \"no certificateSha1\")\n      hash.update(this.platformSpecificBuildOptions.certificateSubjectName || \"no subjectName\")\n\n      buildCacheManager = new BuildCacheManager(outDir, file, arch)\n      if (await buildCacheManager.copyIfValid(await digest(hash, files))) {\n        timer.end()\n        return\n      }\n      timer.end()\n    }\n\n    const timer = time(\"wine&sign\")\n    // rcedit crashed of executed using wine, resourcehacker works\n    if (process.platform === \"win32\" || this.info.framework.name === \"electron\") {\n      const vendorPath = await getSignVendorPath()\n      await execWine(path.join(vendorPath, \"rcedit-ia32.exe\"), path.join(vendorPath, \"rcedit-x64.exe\"), args)\n    }\n\n    await this.sign(file)\n    timer.end()\n\n    if (buildCacheManager != null) {\n      await buildCacheManager.save()\n    }\n  }\n\n  private isSignDlls(): boolean {\n    return this.platformSpecificBuildOptions.signDlls === true\n  }\n\n  protected createTransformerForExtraFiles(packContext: AfterPackContext): FileTransformer | null {\n    if (this.platformSpecificBuildOptions.signAndEditExecutable === false) {\n      return null\n    }\n\n    return file => {\n      if (file.endsWith(\".exe\") || (this.isSignDlls() && file.endsWith(\".dll\"))) {\n        const parentDir = path.dirname(file)\n        if (parentDir !== packContext.appOutDir) {\n          return new CopyFileTransformer(file => this.sign(file))\n        }\n      }\n      return null\n    }\n  }\n\n  protected async signApp(packContext: AfterPackContext, isAsar: boolean): Promise<any> {\n    const exeFileName = `${this.appInfo.productFilename}.exe`\n    if (this.platformSpecificBuildOptions.signAndEditExecutable === false) {\n      return\n    }\n\n    await BluebirdPromise.map(readdir(packContext.appOutDir), (file: string): any => {\n      if (file === exeFileName) {\n        return this.signAndEditResources(path.join(packContext.appOutDir, exeFileName), packContext.arch, packContext.outDir, path.basename(exeFileName, \".exe\"), this.platformSpecificBuildOptions.requestedExecutionLevel)\n      }\n      else if (file.endsWith(\".exe\") || (this.isSignDlls() && file.endsWith(\".dll\"))) {\n        return this.sign(path.join(packContext.appOutDir, file))\n      }\n      return null\n    })\n\n    if (!isAsar) {\n      return\n    }\n\n    const outResourcesDir = path.join(packContext.appOutDir, \"resources\", \"app.asar.unpacked\")\n    await BluebirdPromise.map(orIfFileNotExist(readdir(outResourcesDir), []), (file: string): any => {\n      if (file.endsWith(\".exe\") || file.endsWith(\".dll\")) {\n        return this.sign(path.join(outResourcesDir, file))\n      }\n      else {\n        return null\n      }\n    })\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.execWine = execWine;
exports.prepareWindowsExecutableArgs = prepareWindowsExecutableArgs;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

/** @private */
function execWine(file, file64 = null, appArgs = [], options = {}) {
  if (process.platform === "win32") {
    if (options.timeout == null) {
      // 2 minutes
      options.timeout = 120 * 1000;
    }

    return (0, _builderUtil().exec)(file, appArgs, options);
  }

  const commandArgs = ["wine", "--ia32", file];

  if (file64 != null) {
    commandArgs.push("--x64", file64);
  }

  if (appArgs.length > 0) {
    commandArgs.push("--args", JSON.stringify(appArgs));
  }

  return (0, _builderUtil().executeAppBuilder)(commandArgs, undefined, options);
}
/** @private */


function prepareWindowsExecutableArgs(args, exePath) {
  if (process.platform !== "win32") {
    args.unshift(exePath);
  }

  return args;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=wine.js.map{"version":3,"sources":["../src/wine.ts"],"names":[],"mappings":";;;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AACM,SAAU,QAAV,CAAmB,IAAnB,EAAiC,MAAA,GAAwB,IAAzD,EAA+D,OAAA,GAAyB,EAAxF,EAA4F,OAAA,GAA2B,EAAvH,EAAyH;AAC7H,MAAI,OAAO,CAAC,QAAR,KAAqB,OAAzB,EAAkC;AAChC,QAAI,OAAO,CAAC,OAAR,IAAmB,IAAvB,EAA6B;AAC3B;AACA,MAAA,OAAO,CAAC,OAAR,GAAkB,MAAM,IAAxB;AACD;;AACD,WAAO,yBAAK,IAAL,EAAW,OAAX,EAAoB,OAApB,CAAP;AACD;;AAED,QAAM,WAAW,GAAG,CAClB,MADkB,EAElB,QAFkB,EAER,IAFQ,CAApB;;AAIA,MAAI,MAAM,IAAI,IAAd,EAAoB;AAClB,IAAA,WAAW,CAAC,IAAZ,CAAiB,OAAjB,EAA0B,MAA1B;AACD;;AACD,MAAI,OAAO,CAAC,MAAR,GAAiB,CAArB,EAAwB;AACtB,IAAA,WAAW,CAAC,IAAZ,CAAiB,QAAjB,EAA2B,IAAI,CAAC,SAAL,CAAe,OAAf,CAA3B;AACD;;AACD,SAAO,sCAAkB,WAAlB,EAA+B,SAA/B,EAA0C,OAA1C,CAAP;AACD;AAED;;;AACM,SAAU,4BAAV,CAAuC,IAAvC,EAA4D,OAA5D,EAA2E;AAC/E,MAAI,OAAO,CAAC,QAAR,KAAqB,OAAzB,EAAkC;AAChC,IAAA,IAAI,CAAC,OAAL,CAAa,OAAb;AACD;;AACD,SAAO,IAAP;AACD,C","sourcesContent":["import { ExecFileOptions } from \"child_process\"\nimport { exec, executeAppBuilder } from \"builder-util\"\n\n/** @private */\nexport function execWine(file: string, file64: string | null = null, appArgs: Array<string> = [], options: ExecFileOptions = {}): Promise<string> {\n  if (process.platform === \"win32\") {\n    if (options.timeout == null) {\n      // 2 minutes\n      options.timeout = 120 * 1000\n    }\n    return exec(file, appArgs, options)\n  }\n\n  const commandArgs = [\n    \"wine\",\n    \"--ia32\", file,\n  ]\n  if (file64 != null) {\n    commandArgs.push(\"--x64\", file64)\n  }\n  if (appArgs.length > 0) {\n    commandArgs.push(\"--args\", JSON.stringify(appArgs))\n  }\n  return executeAppBuilder(commandArgs, undefined, options)\n}\n\n/** @private */\nexport function prepareWindowsExecutableArgs(args: Array<string>, exePath: string) {\n  if (process.platform !== \"win32\") {\n    args.unshift(exePath)\n  }\n  return args\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MonoVmManager = void 0;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _vm() {
  const data = require("./vm");

  _vm = function () {
    return data;
  };

  return data;
}

class MonoVmManager extends _vm().VmManager {
  constructor() {
    super();
  }

  exec(file, args, options, isLogOutIfDebug = true) {
    return (0, _builderUtil().exec)("mono", [file].concat(args), Object.assign({}, options), isLogOutIfDebug);
  }

  spawn(file, args, options, extraOptions) {
    return (0, _builderUtil().spawn)("mono", [file].concat(args), options, extraOptions);
  }

} exports.MonoVmManager = MonoVmManager;
// __ts-babel@6.0.4
//# sourceMappingURL=MonoVm.js.map{"version":3,"sources":["../../src/vm/MonoVm.ts"],"names":[],"mappings":";;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEM,MAAO,aAAP,SAA6B,eAA7B,CAAsC;AAC1C,EAAA,WAAA,GAAA;AACE;AACD;;AAED,EAAA,IAAI,CAAC,IAAD,EAAe,IAAf,EAAoC,OAApC,EAA+D,eAAe,GAAG,IAAjF,EAAqF;AACvF,WAAO,yBAAK,MAAL,EAAa,CAAC,IAAD,EAAO,MAAP,CAAc,IAAd,CAAb,EAAgC,MAAA,CAAA,MAAA,CAAA,EAAA,EAClC,OADkC,CAAhC,EAEJ,eAFI,CAAP;AAGD;;AAED,EAAA,KAAK,CAAC,IAAD,EAAe,IAAf,EAAoC,OAApC,EAA4D,YAA5D,EAA4F;AAC/F,WAAO,0BAAM,MAAN,EAAc,CAAC,IAAD,EAAO,MAAP,CAAc,IAAd,CAAd,EAAmC,OAAnC,EAA4C,YAA5C,CAAP;AACD;;AAbyC,C","sourcesContent":["import { SpawnOptions, ExecFileOptions } from \"child_process\"\nimport { exec, ExtraSpawnOptions, spawn } from \"builder-util\"\nimport { VmManager } from \"./vm\"\n\nexport class MonoVmManager extends VmManager {\n  constructor() {\n    super()\n  }\n\n  exec(file: string, args: Array<string>, options?: ExecFileOptions, isLogOutIfDebug = true): Promise<string> {\n    return exec(\"mono\", [file].concat(args), {\n      ...options,\n    }, isLogOutIfDebug)\n  }\n\n  spawn(file: string, args: Array<string>, options?: SpawnOptions, extraOptions?: ExtraSpawnOptions): Promise<any> {\n    return spawn(\"mono\", [file].concat(args), options, extraOptions)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.parseVmList = parseVmList;
exports.macPathToParallelsWindows = macPathToParallelsWindows;
exports.ParallelsVmManager = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _child_process() {
  const data = require("child_process");

  _child_process = function () {
    return data;
  };

  return data;
}

function _vm() {
  const data = require("./vm");

  _vm = function () {
    return data;
  };

  return data;
}

/** @internal */
function parseVmList(_x) {
  return _parseVmList.apply(this, arguments);
}
/** @internal */


function _parseVmList() {
  _parseVmList = (0, _bluebirdLst().coroutine)(function* (debugLogger) {
    // do not log output if debug - it is huge, logged using debugLogger
    let rawList = yield (0, _builderUtil().exec)("prlctl", ["list", "-i", "-s", "name"], undefined, false);
    debugLogger.add("parallels.list", rawList);
    rawList = rawList.substring(rawList.indexOf("ID:")); // let match: Array<string> | null

    const result = [];

    for (const info of rawList.split("\n\n").map(it => it.trim()).filter(it => it.length > 0)) {
      const vm = {};

      for (const line of info.split("\n")) {
        const meta = /^([^:("]+): (.*)$/.exec(line);

        if (meta == null) {
          continue;
        }

        const key = meta[1].toLowerCase();

        if (key === "id" || key === "os" || key === "name" || key === "state" || key === "name") {
          vm[key] = meta[2].trim();
        }
      }

      result.push(vm);
    }

    return result;
  });
  return _parseVmList.apply(this, arguments);
}

class ParallelsVmManager extends _vm().VmManager {
  constructor(vm) {
    super();
    this.vm = vm;
    this.isExitHookAdded = false;
    this.startPromise = this.doStartVm();
  }

  get pathSep() {
    return "/";
  }

  handleExecuteError(error) {
    if (error.message.includes("Unable to open new session in this virtual machine")) {
      throw new Error(`Please ensure that your are logged in "${this.vm.name}" parallels virtual machine. In the future please do not stop VM, but suspend.\n\n${error.message}`);
    }

    _builderUtil().log.warn("ensure that 'Share folders' is set to 'All Disks', see https://goo.gl/E6XphP");

    throw error;
  }

  exec(file, args, options) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield _this.ensureThatVmStarted(); // it is important to use "--current-user" to execute command under logged in user - to access certs.

      return yield (0, _builderUtil().exec)("prlctl", ["exec", _this.vm.id, "--current-user", file.startsWith("/") ? macPathToParallelsWindows(file) : file].concat(args), options).catch(error => _this.handleExecuteError(error));
    })();
  }

  spawn(file, args, options, extraOptions) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield _this2.ensureThatVmStarted();
      return yield (0, _builderUtil().spawn)("prlctl", ["exec", _this2.vm.id, file].concat(args), options, extraOptions).catch(error => _this2.handleExecuteError(error));
    })();
  }

  doStartVm() {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const vmId = _this3.vm.id;
      const state = _this3.vm.state;

      if (state === "running") {
        return;
      }

      if (!_this3.isExitHookAdded) {
        _this3.isExitHookAdded = true;

        require("async-exit-hook")(callback => {
          const stopArgs = ["suspend", vmId];

          if (callback == null) {
            (0, _child_process().execFileSync)("prlctl", stopArgs);
          } else {
            (0, _builderUtil().exec)("prlctl", stopArgs).then(callback).catch(callback);
          }
        });
      }

      yield (0, _builderUtil().exec)("prlctl", ["start", vmId]);
    })();
  }

  ensureThatVmStarted() {
    let startPromise = this.startPromise;

    if (startPromise == null) {
      startPromise = this.doStartVm();
      this.startPromise = startPromise;
    }

    return startPromise;
  }

  toVmFile(file) {
    // https://stackoverflow.com/questions/4742992/cannot-access-network-drive-in-powershell-running-as-administrator
    return macPathToParallelsWindows(file);
  }

}

exports.ParallelsVmManager = ParallelsVmManager;

function macPathToParallelsWindows(file) {
  if (file.startsWith("C:\\")) {
    return file;
  }

  return "\\\\Mac\\Host\\" + file.replace(/\//g, "\\");
} 
// __ts-babel@6.0.4
//# sourceMappingURL=ParallelsVm.js.map{"version":3,"sources":["../../src/vm/ParallelsVm.ts"],"names":[],"mappings":"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","sourcesContent":["import { exec, spawn, DebugLogger, ExtraSpawnOptions, log } from \"builder-util\"\nimport { SpawnOptions, execFileSync, ExecFileOptions } from \"child_process\"\nimport { VmManager } from \"./vm\"\n\n/** @internal */\nexport async function parseVmList(debugLogger: DebugLogger) {\n  // do not log output if debug - it is huge, logged using debugLogger\n  let rawList = await exec(\"prlctl\", [\"list\", \"-i\", \"-s\", \"name\"], undefined, false)\n  debugLogger.add(\"parallels.list\", rawList)\n\n  rawList = rawList.substring(rawList.indexOf(\"ID:\"))\n\n  // let match: Array<string> | null\n  const result: Array<ParallelsVm> = []\n  for (const info of rawList.split(\"\\n\\n\").map(it => it.trim()).filter(it => it.length > 0)) {\n    const vm: any = {}\n    for (const line of info.split(\"\\n\")) {\n      const meta = /^([^:(\"]+): (.*)$/.exec(line)\n      if (meta == null) {\n        continue\n      }\n\n      const key = meta[1].toLowerCase()\n      if (key === \"id\" || key === \"os\" || key === \"name\" || key === \"state\" || key === \"name\") {\n        vm[key] = meta[2].trim()\n      }\n    }\n    result.push(vm)\n  }\n  return result\n}\n\n/** @internal */\nexport class ParallelsVmManager extends VmManager {\n  private startPromise: Promise<any>\n\n  private isExitHookAdded = false\n\n  constructor(private readonly vm: ParallelsVm) {\n    super()\n\n    this.startPromise = this.doStartVm()\n  }\n\n  get pathSep(): string {\n    return \"/\"\n  }\n\n  private handleExecuteError(error: Error): any {\n    if (error.message.includes(\"Unable to open new session in this virtual machine\")) {\n      throw new Error(`Please ensure that your are logged in \"${this.vm.name}\" parallels virtual machine. In the future please do not stop VM, but suspend.\\n\\n${error.message}`)\n    }\n\n    log.warn(\"ensure that 'Share folders' is set to 'All Disks', see https://goo.gl/E6XphP\")\n    throw error\n  }\n\n  async exec(file: string, args: Array<string>, options?: ExecFileOptions): Promise<string> {\n    await this.ensureThatVmStarted()\n    // it is important to use \"--current-user\" to execute command under logged in user - to access certs.\n    return await exec(\"prlctl\", [\"exec\", this.vm.id, \"--current-user\", file.startsWith(\"/\") ? macPathToParallelsWindows(file) : file].concat(args), options)\n      .catch(error => this.handleExecuteError(error))\n  }\n\n  async spawn(file: string, args: Array<string>, options?: SpawnOptions, extraOptions?: ExtraSpawnOptions): Promise<any> {\n    await this.ensureThatVmStarted()\n    return await spawn(\"prlctl\", [\"exec\", this.vm.id, file].concat(args), options, extraOptions)\n      .catch(error => this.handleExecuteError(error))\n  }\n\n  private async doStartVm() {\n    const vmId = this.vm.id\n    const state = this.vm.state\n    if (state === \"running\") {\n      return\n    }\n\n    if (!this.isExitHookAdded) {\n      this.isExitHookAdded = true\n      require(\"async-exit-hook\")((callback: (() => void) | null) => {\n        const stopArgs = [\"suspend\", vmId]\n        if (callback == null) {\n          execFileSync(\"prlctl\", stopArgs)\n        }\n        else {\n          exec(\"prlctl\", stopArgs)\n            .then(callback)\n            .catch(callback)\n        }\n      })\n    }\n    await exec(\"prlctl\", [\"start\", vmId])\n  }\n\n  private ensureThatVmStarted() {\n    let startPromise = this.startPromise\n    if (startPromise == null) {\n      startPromise = this.doStartVm()\n      this.startPromise = startPromise\n    }\n    return startPromise\n  }\n\n  toVmFile(file: string): string {\n    // https://stackoverflow.com/questions/4742992/cannot-access-network-drive-in-powershell-running-as-administrator\n    return macPathToParallelsWindows(file)\n  }\n}\n\nexport function macPathToParallelsWindows(file: string) {\n  if (file.startsWith(\"C:\\\\\")) {\n    return file\n  }\n  return \"\\\\\\\\Mac\\\\Host\\\\\" + file.replace(/\\//g, \"\\\\\")\n}\n\nexport interface ParallelsVm {\n  id: string\n  name: string\n  os: \"win-10\" | \"ubuntu\" | \"elementary\"\n  state: \"running\" | \"suspended\" | \"stopped\"\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.WineVmManager = void 0;

function _wine() {
  const data = require("../wine");

  _wine = function () {
    return data;
  };

  return data;
}

function _vm() {
  const data = require("./vm");

  _vm = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class WineVmManager extends _vm().VmManager {
  constructor() {
    super();
  }

  exec(file, args, options, isLogOutIfDebug = true) {
    return (0, _wine().execWine)(file, null, args, options);
  }

  spawn(file, args, options, extraOptions) {
    throw new Error("Unsupported");
  }

  toVmFile(file) {
    return path.win32.join("Z:", file);
  }

} exports.WineVmManager = WineVmManager;
// __ts-babel@6.0.4
//# sourceMappingURL=WineVm.js.map{"version":3,"sources":["../../src/vm/WineVm.ts"],"names":[],"mappings":";;;;;;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;;;AAEM,MAAO,aAAP,SAA6B,eAA7B,CAAsC;AAC1C,EAAA,WAAA,GAAA;AACE;AACD;;AAED,EAAA,IAAI,CAAC,IAAD,EAAe,IAAf,EAAoC,OAApC,EAA+D,eAAe,GAAG,IAAjF,EAAqF;AACvF,WAAO,sBAAS,IAAT,EAAe,IAAf,EAAqB,IAArB,EAA2B,OAA3B,CAAP;AACD;;AAED,EAAA,KAAK,CAAC,IAAD,EAAe,IAAf,EAAoC,OAApC,EAA4D,YAA5D,EAA4F;AAC/F,UAAM,IAAI,KAAJ,CAAU,aAAV,CAAN;AACD;;AAED,EAAA,QAAQ,CAAC,IAAD,EAAa;AACnB,WAAO,IAAI,CAAC,KAAL,CAAW,IAAX,CAAgB,IAAhB,EAAsB,IAAtB,CAAP;AACD;;AAfyC,C","sourcesContent":["import { SpawnOptions, ExecFileOptions } from \"child_process\"\nimport { ExtraSpawnOptions } from \"builder-util\"\nimport { execWine } from \"../wine\"\nimport { VmManager } from \"./vm\"\nimport * as path from \"path\"\n\nexport class WineVmManager extends VmManager {\n  constructor() {\n    super()\n  }\n\n  exec(file: string, args: Array<string>, options?: ExecFileOptions, isLogOutIfDebug = true): Promise<string> {\n    return execWine(file, null, args, options)\n  }\n\n  spawn(file: string, args: Array<string>, options?: SpawnOptions, extraOptions?: ExtraSpawnOptions): Promise<any> {\n    throw new Error(\"Unsupported\")\n  }\n\n  toVmFile(file: string): string {\n    return path.win32.join(\"Z:\", file)\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getWindowsVm = getWindowsVm;
exports.VmManager = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _ParallelsVm() {
  const data = require("./ParallelsVm");

  _ParallelsVm = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class VmManager {
  get pathSep() {
    return path.sep;
  }

  exec(file, args, options, isLogOutIfDebug = true) {
    return (0, _builderUtil().exec)(file, args, options, isLogOutIfDebug);
  }

  spawn(file, args, options, extraOptions) {
    return (0, _builderUtil().spawn)(file, args, options, extraOptions);
  }

  toVmFile(file) {
    return file;
  }

}

exports.VmManager = VmManager;

function getWindowsVm(_x) {
  return _getWindowsVm.apply(this, arguments);
} function _getWindowsVm() {
  _getWindowsVm = (0, _bluebirdLst().coroutine)(function* (debugLogger) {
    const vmList = (yield (0, _ParallelsVm().parseVmList)(debugLogger)).filter(it => it.os === "win-10");

    if (vmList.length === 0) {
      throw new (_builderUtil().InvalidConfigurationError)("Cannot find suitable Parallels Desktop virtual machine (Windows 10 is required)");
    } // prefer running or suspended vm


    return new (_ParallelsVm().ParallelsVmManager)(vmList.find(it => it.state === "running") || vmList.find(it => it.state === "suspended") || vmList[0]);
  });
  return _getWindowsVm.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=vm.js.map{"version":3,"sources":["../../src/vm/vm.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEM,MAAO,SAAP,CAAgB;AACpB,MAAI,OAAJ,GAAW;AACT,WAAO,IAAI,CAAC,GAAZ;AACD;;AAED,EAAA,IAAI,CAAC,IAAD,EAAe,IAAf,EAAoC,OAApC,EAA+D,eAAe,GAAG,IAAjF,EAAqF;AACvF,WAAO,yBAAK,IAAL,EAAW,IAAX,EAAiB,OAAjB,EAA0B,eAA1B,CAAP;AACD;;AAED,EAAA,KAAK,CAAC,IAAD,EAAe,IAAf,EAAoC,OAApC,EAA4D,YAA5D,EAA4F;AAC/F,WAAO,0BAAM,IAAN,EAAY,IAAZ,EAAkB,OAAlB,EAA2B,YAA3B,CAAP;AACD;;AAED,EAAA,QAAQ,CAAC,IAAD,EAAa;AACnB,WAAO,IAAP;AACD;;AAfmB;;;;SAkBA,Y;;;;;;gDAAf,WAA4B,WAA5B,EAAoD;AACzD,UAAM,MAAM,GAAG,OAAO,gCAAY,WAAZ,CAAP,EAAiC,MAAjC,CAAwC,EAAE,IAAI,EAAE,CAAC,EAAH,KAAU,QAAxD,CAAf;;AACA,QAAI,MAAM,CAAC,MAAP,KAAkB,CAAtB,EAAyB;AACvB,YAAM,KAAI,wCAAJ,EAA8B,iFAA9B,CAAN;AACD,KAJwD,CAMzD;;;AACA,WAAO,KAAI,iCAAJ,EAAuB,MAAM,CAAC,IAAP,CAAY,EAAE,IAAI,EAAE,CAAC,KAAH,KAAa,SAA/B,KAA6C,MAAM,CAAC,IAAP,CAAY,EAAE,IAAI,EAAE,CAAC,KAAH,KAAa,WAA/B,CAA7C,IAA4F,MAAM,CAAC,CAAD,CAAzH,CAAP;AACD,G","sourcesContent":["import { DebugLogger, exec, ExtraSpawnOptions, InvalidConfigurationError, spawn } from \"builder-util\"\nimport { ExecFileOptions, SpawnOptions } from \"child_process\"\nimport * as path from \"path\"\nimport { ParallelsVmManager, parseVmList } from \"./ParallelsVm\"\n\nexport class VmManager {\n  get pathSep(): string {\n    return path.sep\n  }\n\n  exec(file: string, args: Array<string>, options?: ExecFileOptions, isLogOutIfDebug = true): Promise<string> {\n    return exec(file, args, options, isLogOutIfDebug)\n  }\n\n  spawn(file: string, args: Array<string>, options?: SpawnOptions, extraOptions?: ExtraSpawnOptions): Promise<any> {\n    return spawn(file, args, options, extraOptions)\n  }\n\n  toVmFile(file: string): string {\n    return file\n  }\n}\n\nexport async function getWindowsVm(debugLogger: DebugLogger): Promise<VmManager> {\n  const vmList = (await parseVmList(debugLogger)).filter(it => it.os === \"win-10\")\n  if (vmList.length === 0) {\n    throw new InvalidConfigurationError(\"Cannot find suitable Parallels Desktop virtual machine (Windows 10 is required)\")\n  }\n\n  // prefer running or suspended vm\n  return new ParallelsVmManager(vmList.find(it => it.state === \"running\") || vmList.find(it => it.state === \"suspended\") || vmList[0])\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.AppFileWalker = exports.FileCopyHelper = void 0;

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const nodeModulesSystemDependentSuffix = `${path.sep}node_modules`;

function addAllPatternIfNeed(matcher) {
  if (!matcher.isSpecifiedAsEmptyArray && (matcher.isEmpty() || matcher.containsOnlyIgnore())) {
    matcher.prependPattern("**/*");
  }

  return matcher;
}

class FileCopyHelper {
  constructor(matcher, filter, packager) {
    this.matcher = matcher;
    this.filter = filter;
    this.packager = packager;
    this.metadata = new Map();
  }

  handleFile(file, parent, fileStat) {
    if (!fileStat.isSymbolicLink()) {
      return null;
    }

    return (0, _fsExtraP().readlink)(file).then(linkTarget => {
      // http://unix.stackexchange.com/questions/105637/is-symlinks-target-relative-to-the-destinations-parent-directory-and-if-so-wh
      return this.handleSymlink(fileStat, file, parent, linkTarget);
    });
  }

  handleSymlink(fileStat, file, parent, linkTarget) {
    const resolvedLinkTarget = path.resolve(parent, linkTarget);
    const link = path.relative(this.matcher.from, resolvedLinkTarget);

    if (link.startsWith("..")) {
      // outside of project, linked module (https://github.com/electron-userland/electron-builder/issues/675)
      return (0, _fsExtraP().stat)(resolvedLinkTarget).then(targetFileStat => {
        this.metadata.set(file, targetFileStat);
        return targetFileStat;
      });
    } else {
      const s = fileStat;
      s.relativeLink = link;
      s.linkRelativeToFile = path.relative(parent, resolvedLinkTarget);
    }

    return null;
  }

}

exports.FileCopyHelper = FileCopyHelper;

function createAppFilter(matcher, packager) {
  if (packager.areNodeModulesHandledExternally) {
    return matcher.isEmpty() ? null : matcher.createFilter();
  }

  const nodeModulesFilter = (file, fileStat) => {
    return !(fileStat.isDirectory() && file.endsWith(nodeModulesSystemDependentSuffix));
  };

  if (matcher.isEmpty()) {
    return nodeModulesFilter;
  }

  const filter = matcher.createFilter();
  return (file, fileStat) => {
    if (!nodeModulesFilter(file, fileStat)) {
      return false;
    }

    return filter(file, fileStat);
  };
}
/** @internal */


class AppFileWalker extends FileCopyHelper {
  constructor(matcher, packager) {
    super(addAllPatternIfNeed(matcher), createAppFilter(matcher, packager), packager);
  } // noinspection JSUnusedGlobalSymbols


  consume(file, fileStat, parent, siblingNames) {
    if (fileStat.isDirectory()) {
      // https://github.com/electron-userland/electron-builder/issues/1539
      // but do not filter if we inside node_modules dir
      // update: solution disabled, node module resolver should support such setup
      if (file.endsWith(nodeModulesSystemDependentSuffix)) {
        return false;
      }
    } else {
      // save memory - no need to store stat for directory
      this.metadata.set(file, fileStat);
    }

    return this.handleFile(file, parent, fileStat);
  }

} exports.AppFileWalker = AppFileWalker;
// __ts-babel@6.0.4
//# sourceMappingURL=AppFileWalker.js.map{"version":3,"sources":["../../src/util/AppFileWalker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Filter, FileConsumer } from \"builder-util/out/fs\"\nimport { readlink, stat, Stats } from \"fs-extra-p\"\nimport { FileMatcher } from \"../fileMatcher\"\nimport { Packager } from \"../packager\"\nimport * as path from \"path\"\n\nconst nodeModulesSystemDependentSuffix = `${path.sep}node_modules`\n\nfunction addAllPatternIfNeed(matcher: FileMatcher) {\n  if (!matcher.isSpecifiedAsEmptyArray && (matcher.isEmpty() || matcher.containsOnlyIgnore())) {\n    matcher.prependPattern(\"**/*\")\n  }\n  return matcher\n}\n\nexport abstract class FileCopyHelper {\n  readonly metadata = new Map<string, Stats>()\n\n  protected constructor(protected readonly matcher: FileMatcher, readonly filter: Filter | null, protected readonly packager: Packager) {\n  }\n\n  protected handleFile(file: string, parent: string, fileStat: Stats): Promise<Stats | null> | null {\n    if (!fileStat.isSymbolicLink()) {\n      return null\n    }\n\n    return readlink(file)\n      .then((linkTarget): any => {\n        // http://unix.stackexchange.com/questions/105637/is-symlinks-target-relative-to-the-destinations-parent-directory-and-if-so-wh\n        return this.handleSymlink(fileStat, file, parent, linkTarget)\n      })\n  }\n\n  private handleSymlink(fileStat: Stats, file: string, parent: string, linkTarget: string): Promise<Stats> | null {\n    const resolvedLinkTarget = path.resolve(parent, linkTarget)\n    const link = path.relative(this.matcher.from, resolvedLinkTarget)\n    if (link.startsWith(\"..\")) {\n      // outside of project, linked module (https://github.com/electron-userland/electron-builder/issues/675)\n      return stat(resolvedLinkTarget)\n        .then(targetFileStat => {\n          this.metadata.set(file, targetFileStat)\n          return targetFileStat\n        })\n    }\n    else {\n      const s = (fileStat as any)\n      s.relativeLink = link\n      s.linkRelativeToFile = path.relative(parent, resolvedLinkTarget)\n    }\n    return null\n  }\n}\n\nfunction createAppFilter(matcher: FileMatcher, packager: Packager): Filter | null {\n  if (packager.areNodeModulesHandledExternally) {\n    return matcher.isEmpty() ? null : matcher.createFilter()\n  }\n\n  const nodeModulesFilter: Filter = (file, fileStat) => {\n    return !(fileStat.isDirectory() && file.endsWith(nodeModulesSystemDependentSuffix))\n  }\n\n  if (matcher.isEmpty()) {\n    return nodeModulesFilter\n  }\n\n  const filter = matcher.createFilter()\n  return (file, fileStat) => {\n    if (!nodeModulesFilter(file, fileStat)) {\n      return false\n    }\n    return filter(file, fileStat)\n  }\n}\n\n/** @internal */\nexport class AppFileWalker extends FileCopyHelper implements FileConsumer {\n  constructor(matcher: FileMatcher, packager: Packager) {\n    super(addAllPatternIfNeed(matcher), createAppFilter(matcher, packager), packager)\n  }\n\n  // noinspection JSUnusedGlobalSymbols\n  consume(file: string, fileStat: Stats, parent: string, siblingNames: Array<string>): any {\n    if (fileStat.isDirectory()) {\n      // https://github.com/electron-userland/electron-builder/issues/1539\n      // but do not filter if we inside node_modules dir\n      // update: solution disabled, node module resolver should support such setup\n      if (file.endsWith(nodeModulesSystemDependentSuffix)) {\n        return false\n      }\n    }\n    else {\n      // save memory - no need to store stat for directory\n      this.metadata.set(file, fileStat)\n    }\n\n    return this.handleFile(file, parent, fileStat)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.NodeModuleCopyHelper = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _fileMatcher() {
  const data = require("../fileMatcher");

  _fileMatcher = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("../platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _AppFileWalker() {
  const data = require("./AppFileWalker");

  _AppFileWalker = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const excludedFiles = new Set([".DS_Store", "node_modules"
/* already in the queue */
, "CHANGELOG.md", "ChangeLog", "changelog.md", "binding.gyp", ".npmignore"].concat(_fileMatcher().excludedNames.split(",")));
const topLevelExcludedFiles = new Set(["test.js", "karma.conf.js", ".coveralls.yml", "README.md", "readme.markdown", "README", "readme.md", "readme", "test", "__tests__", "tests", "powered-test", "example", "examples", ".bin"]);
/** @internal */

class NodeModuleCopyHelper extends _AppFileWalker().FileCopyHelper {
  constructor(matcher, packager) {
    super(matcher, matcher.isEmpty() ? null : matcher.createFilter(), packager);
  }

  collectNodeModules(baseDir, moduleNames, nodeModuleExcludedExts) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const filter = _this.filter;
      const metadata = _this.metadata;
      const onNodeModuleFile = (0, _platformPackager().resolveFunction)(_this.packager.config.onNodeModuleFile, "onNodeModuleFile");
      const result = [];
      const queue = [];

      for (const moduleName of moduleNames) {
        const tmpPath = baseDir + path.sep + moduleName;
        queue.length = 1; // The path should be corrected in Windows that when the moduleName is Scoped packages named.

        const depPath = path.normalize(tmpPath);
        queue[0] = depPath;

        while (queue.length > 0) {
          const dirPath = queue.pop();
          const childNames = yield (0, _fsExtraP().readdir)(dirPath);
          childNames.sort();
          const isTopLevel = dirPath === depPath;
          const dirs = []; // our handler is async, but we should add sorted files, so, we add file to result not in the mapper, but after map

          const sortedFilePaths = yield _bluebirdLst().default.map(childNames, name => {
            if (onNodeModuleFile != null) {
              onNodeModuleFile(dirPath + path.sep + name);
            }

            if (excludedFiles.has(name) || name.startsWith("._")) {
              return null;
            }

            for (const ext of nodeModuleExcludedExts) {
              if (name.endsWith(ext)) {
                return null;
              }
            } // noinspection SpellCheckingInspection


            if (isTopLevel && (topLevelExcludedFiles.has(name) || moduleName === "libui-node" && (name === "build" || name === "docs" || name === "src"))) {
              return null;
            }

            if (dirPath.endsWith("build")) {
              if (name === "gyp-mac-tool" || name === "Makefile" || name.endsWith(".mk") || name.endsWith(".gypi") || name.endsWith(".Makefile")) {
                return null;
              }
            } else if (dirPath.endsWith("Release") && (name === ".deps" || name === "obj.target")) {
              return null;
            } else if (name === "src" && (dirPath.endsWith("keytar") || dirPath.endsWith("keytar-prebuild"))) {
              return null;
            } else if (dirPath.endsWith("lzma-native") && (name === "build" || name === "deps")) {
              return null;
            }

            const filePath = dirPath + path.sep + name;
            return (0, _fsExtraP().lstat)(filePath).then(stat => {
              if (filter != null && !filter(filePath, stat)) {
                return null;
              }

              if (!stat.isDirectory()) {
                metadata.set(filePath, stat);
              }

              const consumerResult = _this.handleFile(filePath, dirPath, stat);

              if (consumerResult == null) {
                if (stat.isDirectory()) {
                  dirs.push(name);
                  return null;
                } else {
                  return filePath;
                }
              } else {
                return consumerResult.then(it => {
                  // asarUtil can return modified stat (symlink handling)
                  if ((it == null ? stat : it).isDirectory()) {
                    dirs.push(name);
                    return null;
                  } else {
                    return filePath;
                  }
                });
              }
            });
          }, _fs().CONCURRENCY);

          for (const child of sortedFilePaths) {
            if (child != null) {
              result.push(child);
            }
          }

          dirs.sort();

          for (const child of dirs) {
            queue.push(dirPath + path.sep + child);
          }
        }
      }

      return result;
    })();
  }

} exports.NodeModuleCopyHelper = NodeModuleCopyHelper;
// __ts-babel@6.0.4
//# sourceMappingURL=NodeModuleCopyHelper.js.map{"version":3,"sources":["../../src/util/NodeModuleCopyHelper.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEA,MAAM,aAAa,GAAG,IAAI,GAAJ,CAAQ,CAAC,WAAD,EAAc;AAAe;AAA7B,EAAyD,cAAzD,EAAyE,WAAzE,EAAsF,cAAtF,EAAsG,aAAtG,EAAqH,YAArH,EAAmI,MAAnI,CAA0I,6BAAc,KAAd,CAAoB,GAApB,CAA1I,CAAR,CAAtB;AACA,MAAM,qBAAqB,GAAG,IAAI,GAAJ,CAAQ,CAAC,SAAD,EAAY,eAAZ,EAA6B,gBAA7B,EAA+C,WAA/C,EAA4D,iBAA5D,EAA+E,QAA/E,EAAyF,WAAzF,EAAsG,QAAtG,EAAgH,MAAhH,EAAwH,WAAxH,EAAqI,OAArI,EAA8I,cAA9I,EAA8J,SAA9J,EAAyK,UAAzK,EAAqL,MAArL,CAAR,CAA9B;AAEA;;AACM,MAAO,oBAAP,SAAoC,+BAApC,CAAkD;AACtD,EAAA,WAAA,CAAY,OAAZ,EAAkC,QAAlC,EAAoD;AAClD,UAAM,OAAN,EAAe,OAAO,CAAC,OAAR,KAAoB,IAApB,GAA2B,OAAO,CAAC,YAAR,EAA1C,EAAkE,QAAlE;AACD;;AAEK,EAAA,kBAAN,CAAyB,OAAzB,EAA0C,WAA1C,EAAyE,sBAAzE,EAA8G;AAAA;;AAAA;AAC5G,YAAM,MAAM,GAAG,KAAI,CAAC,MAApB;AACA,YAAM,QAAQ,GAAG,KAAI,CAAC,QAAtB;AAEA,YAAM,gBAAgB,GAAG,yCAAgB,KAAI,CAAC,QAAL,CAAc,MAAd,CAAqB,gBAArC,EAAuD,kBAAvD,CAAzB;AAEA,YAAM,MAAM,GAAkB,EAA9B;AACA,YAAM,KAAK,GAAkB,EAA7B;;AACA,WAAK,MAAM,UAAX,IAAyB,WAAzB,EAAsC;AACpC,cAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,GAAf,GAAqB,UAArC;AACA,QAAA,KAAK,CAAC,MAAN,GAAe,CAAf,CAFoC,CAGpC;;AACA,cAAM,OAAO,GAAG,IAAI,CAAC,SAAL,CAAe,OAAf,CAAhB;AACA,QAAA,KAAK,CAAC,CAAD,CAAL,GAAW,OAAX;;AAEA,eAAO,KAAK,CAAC,MAAN,GAAe,CAAtB,EAAyB;AACvB,gBAAM,OAAO,GAAG,KAAK,CAAC,GAAN,EAAhB;AAEA,gBAAM,UAAU,SAAS,yBAAQ,OAAR,CAAzB;AACA,UAAA,UAAU,CAAC,IAAX;AAEA,gBAAM,UAAU,GAAG,OAAO,KAAK,OAA/B;AACA,gBAAM,IAAI,GAAkB,EAA5B,CAPuB,CAQvB;;AACA,gBAAM,eAAe,SAAS,uBAAgB,GAAhB,CAAoB,UAApB,EAAgC,IAAI,IAAG;AACnE,gBAAI,gBAAgB,IAAI,IAAxB,EAA8B;AAC5B,cAAA,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC,GAAf,GAAqB,IAAtB,CAAhB;AACD;;AAED,gBAAI,aAAa,CAAC,GAAd,CAAkB,IAAlB,KAA2B,IAAI,CAAC,UAAL,CAAgB,IAAhB,CAA/B,EAAsD;AACpD,qBAAO,IAAP;AACD;;AAED,iBAAK,MAAM,GAAX,IAAkB,sBAAlB,EAA0C;AACxC,kBAAI,IAAI,CAAC,QAAL,CAAc,GAAd,CAAJ,EAAwB;AACtB,uBAAO,IAAP;AACD;AACF,aAbkE,CAenE;;;AACA,gBAAI,UAAU,KAAK,qBAAqB,CAAC,GAAtB,CAA0B,IAA1B,KAAoC,UAAU,KAAK,YAAf,KAAgC,IAAI,KAAK,OAAT,IAAoB,IAAI,KAAK,MAA7B,IAAuC,IAAI,KAAK,KAAhF,CAAzC,CAAd,EAAiJ;AAC/I,qBAAO,IAAP;AACD;;AAED,gBAAI,OAAO,CAAC,QAAR,CAAiB,OAAjB,CAAJ,EAA+B;AAC7B,kBAAI,IAAI,KAAK,cAAT,IAA2B,IAAI,KAAK,UAApC,IAAkD,IAAI,CAAC,QAAL,CAAc,KAAd,CAAlD,IAA0E,IAAI,CAAC,QAAL,CAAc,OAAd,CAA1E,IAAoG,IAAI,CAAC,QAAL,CAAc,WAAd,CAAxG,EAAoI;AAClI,uBAAO,IAAP;AACD;AACF,aAJD,MAKK,IAAI,OAAO,CAAC,QAAR,CAAiB,SAAjB,MAAgC,IAAI,KAAK,OAAT,IAAoB,IAAI,KAAK,YAA7D,CAAJ,EAAgF;AACnF,qBAAO,IAAP;AACD,aAFI,MAGA,IAAI,IAAI,KAAK,KAAT,KAAmB,OAAO,CAAC,QAAR,CAAiB,QAAjB,KAA8B,OAAO,CAAC,QAAR,CAAiB,iBAAjB,CAAjD,CAAJ,EAA2F;AAC9F,qBAAO,IAAP;AACD,aAFI,MAGA,IAAI,OAAO,CAAC,QAAR,CAAiB,aAAjB,MAAoC,IAAI,KAAK,OAAT,IAAoB,IAAI,KAAK,MAAjE,CAAJ,EAA8E;AACjF,qBAAO,IAAP;AACD;;AAED,kBAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,GAAf,GAAqB,IAAtC;AACA,mBAAO,uBAAM,QAAN,EACJ,IADI,CACC,IAAI,IAAG;AACX,kBAAI,MAAM,IAAI,IAAV,IAAkB,CAAC,MAAM,CAAC,QAAD,EAAW,IAAX,CAA7B,EAA+C;AAC7C,uBAAO,IAAP;AACD;;AAED,kBAAI,CAAC,IAAI,CAAC,WAAL,EAAL,EAAyB;AACvB,gBAAA,QAAQ,CAAC,GAAT,CAAa,QAAb,EAAuB,IAAvB;AACD;;AACD,oBAAM,cAAc,GAAG,KAAI,CAAC,UAAL,CAAgB,QAAhB,EAA0B,OAA1B,EAAmC,IAAnC,CAAvB;;AACA,kBAAI,cAAc,IAAI,IAAtB,EAA4B;AAC1B,oBAAI,IAAI,CAAC,WAAL,EAAJ,EAAwB;AACtB,kBAAA,IAAI,CAAC,IAAL,CAAU,IAAV;AACA,yBAAO,IAAP;AACD,iBAHD,MAIK;AACH,yBAAO,QAAP;AACD;AACF,eARD,MASK;AACH,uBAAO,cAAc,CAClB,IADI,CACC,EAAE,IAAG;AACT;AACA,sBAAI,CAAC,EAAE,IAAI,IAAN,GAAa,IAAb,GAAoB,EAArB,EAAyB,WAAzB,EAAJ,EAA4C;AAC1C,oBAAA,IAAI,CAAC,IAAL,CAAU,IAAV;AACA,2BAAO,IAAP;AACD,mBAHD,MAIK;AACH,2BAAO,QAAP;AACD;AACF,iBAVI,CAAP;AAWD;AACF,aAhCI,CAAP;AAiCD,WArE6B,EAqE3B,iBArE2B,CAA9B;;AAuEA,eAAK,MAAM,KAAX,IAAoB,eAApB,EAAqC;AACnC,gBAAI,KAAK,IAAI,IAAb,EAAmB;AACjB,cAAA,MAAM,CAAC,IAAP,CAAY,KAAZ;AACD;AACF;;AAED,UAAA,IAAI,CAAC,IAAL;;AACA,eAAK,MAAM,KAAX,IAAoB,IAApB,EAA0B;AACxB,YAAA,KAAK,CAAC,IAAN,CAAW,OAAO,GAAG,IAAI,CAAC,GAAf,GAAqB,KAAhC;AACD;AACF;AACF;;AACD,aAAO,MAAP;AA3G4G;AA4G7G;;AAjHqD,C","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { CONCURRENCY } from \"builder-util/out/fs\"\nimport { lstat, readdir } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { excludedNames, FileMatcher } from \"../fileMatcher\"\nimport { Packager } from \"../packager\"\nimport { resolveFunction } from \"../platformPackager\"\nimport { FileCopyHelper } from \"./AppFileWalker\"\n\nconst excludedFiles = new Set([\".DS_Store\", \"node_modules\" /* already in the queue */, \"CHANGELOG.md\", \"ChangeLog\", \"changelog.md\", \"binding.gyp\", \".npmignore\"].concat(excludedNames.split(\",\")))\nconst topLevelExcludedFiles = new Set([\"test.js\", \"karma.conf.js\", \".coveralls.yml\", \"README.md\", \"readme.markdown\", \"README\", \"readme.md\", \"readme\", \"test\", \"__tests__\", \"tests\", \"powered-test\", \"example\", \"examples\", \".bin\"])\n\n/** @internal */\nexport class NodeModuleCopyHelper extends FileCopyHelper {\n  constructor(matcher: FileMatcher, packager: Packager) {\n    super(matcher, matcher.isEmpty() ? null : matcher.createFilter(), packager)\n  }\n\n  async collectNodeModules(baseDir: string, moduleNames: Iterable<string>, nodeModuleExcludedExts: Array<string>): Promise<Array<string>> {\n    const filter = this.filter\n    const metadata = this.metadata\n\n    const onNodeModuleFile = resolveFunction(this.packager.config.onNodeModuleFile, \"onNodeModuleFile\")\n\n    const result: Array<string> = []\n    const queue: Array<string> = []\n    for (const moduleName of moduleNames) {\n      const tmpPath = baseDir + path.sep + moduleName\n      queue.length = 1\n      // The path should be corrected in Windows that when the moduleName is Scoped packages named.\n      const depPath = path.normalize(tmpPath)\n      queue[0] = depPath\n\n      while (queue.length > 0) {\n        const dirPath = queue.pop()!\n\n        const childNames = await readdir(dirPath)\n        childNames.sort()\n\n        const isTopLevel = dirPath === depPath\n        const dirs: Array<string> = []\n        // our handler is async, but we should add sorted files, so, we add file to result not in the mapper, but after map\n        const sortedFilePaths = await BluebirdPromise.map(childNames, name => {\n          if (onNodeModuleFile != null) {\n            onNodeModuleFile(dirPath + path.sep + name)\n          }\n\n          if (excludedFiles.has(name) || name.startsWith(\"._\")) {\n            return null\n          }\n\n          for (const ext of nodeModuleExcludedExts) {\n            if (name.endsWith(ext)) {\n              return null\n            }\n          }\n\n          // noinspection SpellCheckingInspection\n          if (isTopLevel && (topLevelExcludedFiles.has(name) || (moduleName === \"libui-node\" && (name === \"build\" || name === \"docs\" || name === \"src\")))) {\n            return null\n          }\n\n          if (dirPath.endsWith(\"build\")) {\n            if (name === \"gyp-mac-tool\" || name === \"Makefile\" || name.endsWith(\".mk\") || name.endsWith(\".gypi\") || name.endsWith(\".Makefile\")) {\n              return null\n            }\n          }\n          else if (dirPath.endsWith(\"Release\") && (name === \".deps\" || name === \"obj.target\")) {\n            return null\n          }\n          else if (name === \"src\" && (dirPath.endsWith(\"keytar\") || dirPath.endsWith(\"keytar-prebuild\"))) {\n            return null\n          }\n          else if (dirPath.endsWith(\"lzma-native\") && (name === \"build\" || name === \"deps\")) {\n            return null\n          }\n\n          const filePath = dirPath + path.sep + name\n          return lstat(filePath)\n            .then(stat => {\n              if (filter != null && !filter(filePath, stat)) {\n                return null\n              }\n\n              if (!stat.isDirectory()) {\n                metadata.set(filePath, stat)\n              }\n              const consumerResult = this.handleFile(filePath, dirPath, stat)\n              if (consumerResult == null) {\n                if (stat.isDirectory()) {\n                  dirs.push(name)\n                  return null\n                }\n                else {\n                  return filePath\n                }\n              }\n              else {\n                return consumerResult\n                  .then(it => {\n                    // asarUtil can return modified stat (symlink handling)\n                    if ((it == null ? stat : it).isDirectory()) {\n                      dirs.push(name)\n                      return null\n                    }\n                    else {\n                      return filePath\n                    }\n                  })\n              }\n            })\n        }, CONCURRENCY)\n\n        for (const child of sortedFilePaths) {\n          if (child != null) {\n            result.push(child)\n          }\n        }\n\n        dirs.sort()\n        for (const child of dirs) {\n          queue.push(dirPath + path.sep + child)\n        }\n      }\n    }\n    return result\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.executeAppBuilderAsJson = executeAppBuilderAsJson;
exports.objectToArgs = objectToArgs;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function executeAppBuilderAsJson(args) {
  return (0, _builderUtil().executeAppBuilder)(args).then(rawResult => {
    try {
      return JSON.parse(rawResult);
    } catch (e) {
      throw new Error(`Cannot parse result: ${e.message}: "${rawResult}"`);
    }
  });
}

function objectToArgs(to, argNameToValue) {
  for (const name of Object.keys(argNameToValue)) {
    const value = argNameToValue[name];

    if (value != null) {
      to.push(`--${name}`, value);
    }
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=appBuilder.js.map{"version":3,"sources":["../../src/util/appBuilder.ts"],"names":[],"mappings":";;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEM,SAAU,uBAAV,CAAqC,IAArC,EAAwD;AAC5D,SAAO,sCAAkB,IAAlB,EACJ,IADI,CACC,SAAS,IAAG;AAChB,QAAI;AACF,aAAO,IAAI,CAAC,KAAL,CAAW,SAAX,CAAP;AACD,KAFD,CAGA,OAAO,CAAP,EAAU;AACR,YAAM,IAAI,KAAJ,CAAU,wBAAwB,CAAC,CAAC,OAAO,MAAM,SAAS,GAA1D,CAAN;AACD;AACF,GARI,CAAP;AASD;;AAEK,SAAU,YAAV,CAAuB,EAAvB,EAA0C,cAA1C,EAA2F;AAC/F,OAAK,MAAM,IAAX,IAAmB,MAAM,CAAC,IAAP,CAAY,cAAZ,CAAnB,EAAgD;AAC9C,UAAM,KAAK,GAAG,cAAc,CAAC,IAAD,CAA5B;;AACA,QAAI,KAAK,IAAI,IAAb,EAAmB;AACjB,MAAA,EAAE,CAAC,IAAH,CAAQ,KAAK,IAAI,EAAjB,EAAqB,KAArB;AACD;AACF;AACF,C","sourcesContent":["import { executeAppBuilder } from \"builder-util\"\n\nexport function executeAppBuilderAsJson<T>(args: Array<string>): Promise<T> {\n  return executeAppBuilder(args)\n    .then(rawResult => {\n      try {\n        return JSON.parse(rawResult) as T\n      }\n      catch (e) {\n        throw new Error(`Cannot parse result: ${e.message}: \"${rawResult}\"`)\n      }\n    })\n}\n\nexport function objectToArgs(to: Array<string>, argNameToValue: { [key: string]: string | null; }): void {\n  for (const name of Object.keys(argNameToValue)) {\n    const value = argNameToValue[name]\n    if (value != null) {\n      to.push(`--${name}`, value)\n    }\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getDestinationPath = getDestinationPath;
exports.copyAppFiles = copyAppFiles;
exports.transformFiles = transformFiles;
exports.computeFileSets = computeFileSets;
exports.computeNodeModuleFileSets = computeNodeModuleFileSets;
exports.ELECTRON_COMPILE_SHIM_FILENAME = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _unpackDetector() {
  const data = require("../asar/unpackDetector");

  _unpackDetector = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _fileMatcher() {
  const data = require("../fileMatcher");

  _fileMatcher = function () {
    return data;
  };

  return data;
}

function _fileTransformer() {
  const data = require("../fileTransformer");

  _fileTransformer = function () {
    return data;
  };

  return data;
}

function _appBuilder() {
  const data = require("./appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _AppFileWalker() {
  const data = require("./AppFileWalker");

  _AppFileWalker = function () {
    return data;
  };

  return data;
}

function _NodeModuleCopyHelper() {
  const data = require("./NodeModuleCopyHelper");

  _NodeModuleCopyHelper = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const BOWER_COMPONENTS_PATTERN = `${path.sep}bower_components${path.sep}`;
/** @internal */

const ELECTRON_COMPILE_SHIM_FILENAME = "__shim.js";
exports.ELECTRON_COMPILE_SHIM_FILENAME = ELECTRON_COMPILE_SHIM_FILENAME;

function getDestinationPath(file, fileSet) {
  if (file === fileSet.src) {
    return fileSet.destination;
  } else {
    const src = fileSet.src;
    const dest = fileSet.destination;

    if (file.length > src.length && file.startsWith(src) && file[src.length] === path.sep) {
      return dest + file.substring(src.length);
    } else {
      // hoisted node_modules
      // not lastIndexOf, to ensure that nested module (top-level module depends on) copied to parent node_modules, not to top-level directory
      // project https://github.com/angexis/punchcontrol/commit/cf929aba55c40d0d8901c54df7945e1d001ce022
      const index = file.indexOf(_fileTransformer().NODE_MODULES_PATTERN);

      if (index < 0) {
        throw new Error(`File "${file}" not under the source directory "${fileSet.src}"`);
      }

      return dest + file.substring(index + 1
      /* leading slash */
      );
    }
  }
}

function copyAppFiles(_x, _x2, _x3) {
  return _copyAppFiles.apply(this, arguments);
} // used only for ASAR, if no asar, file transformed on the fly


function _copyAppFiles() {
  _copyAppFiles = (0, _bluebirdLst().coroutine)(function* (fileSet, packager, transformer) {
    const metadata = fileSet.metadata; // search auto unpacked dir

    const taskManager = new (_builderUtil().AsyncTaskManager)(packager.cancellationToken);
    const createdParentDirs = new Set();
    const fileCopier = new (_fs().FileCopier)(file => {
      // https://github.com/electron-userland/electron-builder/issues/3038
      return !((0, _unpackDetector().isLibOrExe)(file) || file.endsWith(".node"));
    }, transformer);
    const links = [];

    for (let i = 0, n = fileSet.files.length; i < n; i++) {
      const sourceFile = fileSet.files[i];
      const stat = metadata.get(sourceFile);

      if (stat == null) {
        // dir
        continue;
      }

      const destinationFile = getDestinationPath(sourceFile, fileSet);

      if (stat.isSymbolicLink()) {
        links.push({
          file: destinationFile,
          link: yield (0, _fsExtraP().readlink)(sourceFile)
        });
        continue;
      }

      const fileParent = path.dirname(destinationFile);

      if (!createdParentDirs.has(fileParent)) {
        createdParentDirs.add(fileParent);
        yield (0, _fsExtraP().ensureDir)(fileParent);
      }

      taskManager.addTask(fileCopier.copy(sourceFile, destinationFile, stat));

      if (taskManager.tasks.length > _fs().MAX_FILE_REQUESTS) {
        yield taskManager.awaitTasks();
      }
    }

    if (taskManager.tasks.length > 0) {
      yield taskManager.awaitTasks();
    }

    if (links.length > 0) {
      yield _bluebirdLst().default.map(links, it => (0, _fsExtraP().symlink)(it.link, it.file), _fs().CONCURRENCY);
    }
  });
  return _copyAppFiles.apply(this, arguments);
}

function transformFiles(_x4, _x5) {
  return _transformFiles.apply(this, arguments);
}

function _transformFiles() {
  _transformFiles = (0, _bluebirdLst().coroutine)(function* (transformer, fileSet) {
    if (transformer == null) {
      return;
    }

    let transformedFiles = fileSet.transformedFiles;

    if (fileSet.transformedFiles == null) {
      transformedFiles = new Map();
      fileSet.transformedFiles = transformedFiles;
    }

    const metadata = fileSet.metadata;
    yield _bluebirdLst().default.filter(fileSet.files, (it, index) => {
      const fileStat = metadata.get(it);

      if (fileStat == null || !fileStat.isFile()) {
        return false;
      }

      const transformedValue = transformer(it);

      if (transformedValue == null) {
        return false;
      }

      if (typeof transformedValue === "object" && "then" in transformedValue) {
        return transformedValue.then(it => {
          if (it != null) {
            transformedFiles.set(index, it);
          }

          return false;
        });
      }

      transformedFiles.set(index, transformedValue);
      return false;
    }, _fs().CONCURRENCY);
  });
  return _transformFiles.apply(this, arguments);
}

function computeFileSets(_x6, _x7, _x8, _x9) {
  return _computeFileSets.apply(this, arguments);
}

function _computeFileSets() {
  _computeFileSets = (0, _bluebirdLst().coroutine)(function* (matchers, transformer, platformPackager, isElectronCompile) {
    const fileSets = [];
    const packager = platformPackager.info;

    for (const matcher of matchers) {
      const fileWalker = new (_AppFileWalker().AppFileWalker)(matcher, packager);
      const fromStat = yield (0, _fs().statOrNull)(matcher.from);

      if (fromStat == null) {
        _builderUtil().log.debug({
          directory: matcher.from,
          reason: "doesn't exist"
        }, `skipped copying`);

        continue;
      }

      const files = yield (0, _fs().walk)(matcher.from, fileWalker.filter, fileWalker);
      const metadata = fileWalker.metadata;
      fileSets.push(validateFileSet({
        src: matcher.from,
        files,
        metadata,
        destination: matcher.to
      }));
    }

    if (isElectronCompile) {
      // cache files should be first (better IO)
      fileSets.unshift((yield compileUsingElectronCompile(fileSets[0], packager)));
    }

    return fileSets;
  });
  return _computeFileSets.apply(this, arguments);
}

function getNodeModuleExcludedExts(platformPackager) {
  // do not exclude *.h files (https://github.com/electron-userland/electron-builder/issues/2852)
  const result = [".o", ".obj"].concat(_fileMatcher().excludedExts.split(",").map(it => `.${it}`));

  if (platformPackager.config.includePdb !== true) {
    result.push(".pdb");
  }

  if (platformPackager.platform !== _core().Platform.WINDOWS) {
    // https://github.com/electron-userland/electron-builder/issues/1738
    result.push(".dll");
    result.push(".exe");
  }

  return result;
}

function validateFileSet(fileSet) {
  if (fileSet.src == null || fileSet.src.length === 0) {
    throw new Error("fileset src is empty");
  }

  return fileSet;
}
/** @internal */


function computeNodeModuleFileSets(_x10, _x11) {
  return _computeNodeModuleFileSets.apply(this, arguments);
}

function _computeNodeModuleFileSets() {
  _computeNodeModuleFileSets = (0, _bluebirdLst().coroutine)(function* (platformPackager, mainMatcher) {
    const args = ["node-dep-tree", "--dir", platformPackager.info.appDir];

    if (platformPackager.info.framework.getExcludedDependencies != null) {
      const excludedDependencies = platformPackager.info.framework.getExcludedDependencies(platformPackager.platform);

      if (excludedDependencies != null) {
        for (const name of excludedDependencies) {
          args.push("--exclude-dep", name);
        }
      }
    }

    const deps = yield (0, _appBuilder().executeAppBuilderAsJson)(args);
    const nodeModuleExcludedExts = getNodeModuleExcludedExts(platformPackager); // mapSeries instead of map because copyNodeModules is concurrent and so, no need to increase queue/pressure

    return yield _bluebirdLst().default.mapSeries(deps,
    /*#__PURE__*/
    function () {
      var _ref = (0, _bluebirdLst().coroutine)(function* (info) {
        const source = info.dir;
        let destination;

        if (source.length > mainMatcher.from.length && source.startsWith(mainMatcher.from) && source[mainMatcher.from.length] === path.sep) {
          destination = getDestinationPath(source, {
            src: mainMatcher.from,
            destination: mainMatcher.to,
            files: [],
            metadata: null
          });
        } else {
          destination = mainMatcher.to + path.sep + "node_modules";
        } // use main matcher patterns, so, user can exclude some files in such hoisted node modules
        // source here includes node_modules, but pattern base should be without because users expect that pattern "!node_modules/loot-core/src{,/**/*}" will work


        const matcher = new (_fileMatcher().FileMatcher)(path.dirname(source), destination, mainMatcher.macroExpander, mainMatcher.patterns);
        const copier = new (_NodeModuleCopyHelper().NodeModuleCopyHelper)(matcher, platformPackager.info);
        const names = info.deps;
        const files = yield copier.collectNodeModules(source, names, nodeModuleExcludedExts);
        return validateFileSet({
          src: source,
          destination,
          files,
          metadata: copier.metadata
        });
      });

      return function (_x14) {
        return _ref.apply(this, arguments);
      };
    }());
  });
  return _computeNodeModuleFileSets.apply(this, arguments);
}

function compileUsingElectronCompile(_x12, _x13) {
  return _compileUsingElectronCompile.apply(this, arguments);
} function _compileUsingElectronCompile() {
  _compileUsingElectronCompile = (0, _bluebirdLst().coroutine)(function* (mainFileSet, packager) {
    _builderUtil().log.info("compiling using electron-compile");

    const electronCompileCache = yield packager.tempDirManager.getTempDir({
      prefix: "electron-compile-cache"
    });
    const cacheDir = path.join(electronCompileCache, ".cache"); // clear and create cache dir

    yield (0, _fsExtraP().ensureDir)(cacheDir);
    const compilerHost = yield (0, _fileTransformer().createElectronCompilerHost)(mainFileSet.src, cacheDir);
    const nextSlashIndex = mainFileSet.src.length + 1; // pre-compute electron-compile to cache dir - we need to process only subdirectories, not direct files of app dir

    yield _bluebirdLst().default.map(mainFileSet.files, file => {
      if (file.includes(_fileTransformer().NODE_MODULES_PATTERN) || file.includes(BOWER_COMPONENTS_PATTERN) || !file.includes(path.sep, nextSlashIndex) // ignore not root files
      || !mainFileSet.metadata.get(file).isFile()) {
        return null;
      }

      return compilerHost.compile(file).then(() => null);
    }, _fs().CONCURRENCY);
    yield compilerHost.saveConfiguration();
    const metadata = new Map();
    const cacheFiles = yield (0, _fs().walk)(cacheDir, file => !file.startsWith("."), {
      consume: (file, fileStat) => {
        if (fileStat.isFile()) {
          metadata.set(file, fileStat);
        }

        return null;
      }
    }); // add shim

    const shimPath = `${mainFileSet.src}${path.sep}${ELECTRON_COMPILE_SHIM_FILENAME}`;
    mainFileSet.files.push(shimPath);
    mainFileSet.metadata.set(shimPath, {
      isFile: () => true,
      isDirectory: () => false,
      isSymbolicLink: () => false
    });

    if (mainFileSet.transformedFiles == null) {
      mainFileSet.transformedFiles = new Map();
    }

    mainFileSet.transformedFiles.set(mainFileSet.files.length - 1, `
'use strict';
require('electron-compile').init(__dirname, require('path').resolve(__dirname, '${packager.metadata.main || "index"}'), true);
`);
    return {
      src: electronCompileCache,
      files: cacheFiles,
      metadata,
      destination: mainFileSet.destination
    };
  });
  return _compileUsingElectronCompile.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=appFileCopier.js.map{"version":3,"sources":["../../src/util/appFileCopier.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { AsyncTaskManager, log } from \"builder-util\"\nimport { CONCURRENCY, FileCopier, Link, MAX_FILE_REQUESTS, FileTransformer, statOrNull, walk } from \"builder-util/out/fs\"\nimport { ensureDir, readlink, Stats, symlink } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { isLibOrExe } from \"../asar/unpackDetector\"\nimport { Platform } from \"../core\"\nimport { Packager } from \"../packager\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { excludedExts, FileMatcher } from \"../fileMatcher\"\nimport { createElectronCompilerHost, NODE_MODULES_PATTERN } from \"../fileTransformer\"\nimport { executeAppBuilderAsJson } from \"./appBuilder\"\nimport { AppFileWalker } from \"./AppFileWalker\"\nimport { NodeModuleCopyHelper } from \"./NodeModuleCopyHelper\"\n\nconst BOWER_COMPONENTS_PATTERN = `${path.sep}bower_components${path.sep}`\n/** @internal */\nexport const ELECTRON_COMPILE_SHIM_FILENAME = \"__shim.js\"\n\nexport function getDestinationPath(file: string, fileSet: ResolvedFileSet) {\n  if (file === fileSet.src) {\n    return fileSet.destination\n  }\n  else {\n    const src = fileSet.src\n    const dest = fileSet.destination\n    if (file.length > src.length && file.startsWith(src) && file[src.length] === path.sep) {\n      return dest + file.substring(src.length)\n    }\n    else {\n      // hoisted node_modules\n      // not lastIndexOf, to ensure that nested module (top-level module depends on) copied to parent node_modules, not to top-level directory\n      // project https://github.com/angexis/punchcontrol/commit/cf929aba55c40d0d8901c54df7945e1d001ce022\n      const index = file.indexOf(NODE_MODULES_PATTERN)\n      if (index < 0) {\n        throw new Error(`File \"${file}\" not under the source directory \"${fileSet.src}\"`)\n      }\n      return dest + file.substring(index + 1 /* leading slash */)\n    }\n  }\n}\n\nexport async function copyAppFiles(fileSet: ResolvedFileSet, packager: Packager, transformer: FileTransformer) {\n  const metadata = fileSet.metadata\n  // search auto unpacked dir\n  const taskManager = new AsyncTaskManager(packager.cancellationToken)\n  const createdParentDirs = new Set<string>()\n\n  const fileCopier = new FileCopier(file => {\n    // https://github.com/electron-userland/electron-builder/issues/3038\n    return !(isLibOrExe(file) || file.endsWith(\".node\"))\n  }, transformer)\n  const links: Array<Link> = []\n  for (let i = 0, n = fileSet.files.length; i < n; i++) {\n    const sourceFile = fileSet.files[i]\n    const stat = metadata.get(sourceFile)\n    if (stat == null) {\n      // dir\n      continue\n    }\n\n    const destinationFile = getDestinationPath(sourceFile, fileSet)\n    if (stat.isSymbolicLink()) {\n      links.push({file: destinationFile, link: await readlink(sourceFile)})\n      continue\n    }\n\n    const fileParent = path.dirname(destinationFile)\n    if (!createdParentDirs.has(fileParent)) {\n      createdParentDirs.add(fileParent)\n      await ensureDir(fileParent)\n    }\n\n    taskManager.addTask(fileCopier.copy(sourceFile, destinationFile, stat))\n    if (taskManager.tasks.length > MAX_FILE_REQUESTS) {\n      await taskManager.awaitTasks()\n    }\n  }\n\n  if (taskManager.tasks.length > 0) {\n    await taskManager.awaitTasks()\n  }\n  if (links.length > 0) {\n    await BluebirdPromise.map(links, it => symlink(it.link, it.file), CONCURRENCY)\n  }\n}\n\n// os path separator is used\nexport interface ResolvedFileSet {\n  src: string\n  destination: string\n\n  files: Array<string>\n  metadata: Map<string, Stats>\n  transformedFiles?: Map<number, string | Buffer> | null\n}\n\n// used only for ASAR, if no asar, file transformed on the fly\nexport async function transformFiles(transformer: FileTransformer, fileSet: ResolvedFileSet): Promise<void> {\n  if (transformer == null) {\n    return\n  }\n\n  let transformedFiles = fileSet.transformedFiles\n  if (fileSet.transformedFiles == null) {\n    transformedFiles = new Map()\n    fileSet.transformedFiles = transformedFiles\n  }\n\n  const metadata = fileSet.metadata\n  await BluebirdPromise.filter(fileSet.files, (it, index) => {\n    const fileStat = metadata.get(it)\n    if (fileStat == null || !fileStat.isFile()) {\n      return false\n    }\n\n    const transformedValue = transformer(it)\n    if (transformedValue == null) {\n      return false\n    }\n\n    if (typeof transformedValue === \"object\" && \"then\" in transformedValue) {\n      return (transformedValue as Promise<any>)\n        .then(it => {\n          if (it != null) {\n            transformedFiles!!.set(index, it)\n          }\n          return false\n        })\n    }\n    transformedFiles!!.set(index, transformedValue as string | Buffer)\n    return false\n  }, CONCURRENCY)\n}\n\nexport async function computeFileSets(matchers: Array<FileMatcher>, transformer: FileTransformer | null, platformPackager: PlatformPackager<any>, isElectronCompile: boolean): Promise<Array<ResolvedFileSet>> {\n  const fileSets: Array<ResolvedFileSet> = []\n  const packager = platformPackager.info\n\n  for (const matcher of matchers) {\n    const fileWalker = new AppFileWalker(matcher, packager)\n\n    const fromStat = await statOrNull(matcher.from)\n    if (fromStat == null) {\n      log.debug({directory: matcher.from, reason: \"doesn't exist\"}, `skipped copying`)\n      continue\n    }\n\n    const files = await walk(matcher.from, fileWalker.filter, fileWalker)\n    const metadata = fileWalker.metadata\n    fileSets.push(validateFileSet({src: matcher.from, files, metadata, destination: matcher.to}))\n  }\n\n  if (isElectronCompile) {\n    // cache files should be first (better IO)\n    fileSets.unshift(await compileUsingElectronCompile(fileSets[0], packager))\n  }\n  return fileSets\n}\n\nfunction getNodeModuleExcludedExts(platformPackager: PlatformPackager<any>) {\n  // do not exclude *.h files (https://github.com/electron-userland/electron-builder/issues/2852)\n  const result = [\".o\", \".obj\"].concat(excludedExts.split(\",\").map(it => `.${it}`))\n  if (platformPackager.config.includePdb !== true) {\n    result.push(\".pdb\")\n  }\n  if (platformPackager.platform !== Platform.WINDOWS) {\n    // https://github.com/electron-userland/electron-builder/issues/1738\n    result.push(\".dll\")\n    result.push(\".exe\")\n  }\n  return result\n}\n\nfunction validateFileSet(fileSet: ResolvedFileSet): ResolvedFileSet {\n  if (fileSet.src == null || fileSet.src.length === 0) {\n    throw new Error(\"fileset src is empty\")\n  }\n  return fileSet\n}\n\n/** @internal */\nexport async function computeNodeModuleFileSets(platformPackager: PlatformPackager<any>, mainMatcher: FileMatcher): Promise<Array<ResolvedFileSet>> {\n  const args = [\"node-dep-tree\", \"--dir\", platformPackager.info.appDir]\n  if (platformPackager.info.framework.getExcludedDependencies != null) {\n    const excludedDependencies = platformPackager.info.framework.getExcludedDependencies(platformPackager.platform)\n    if (excludedDependencies != null) {\n      for (const name of excludedDependencies) {\n        args.push(\"--exclude-dep\", name)\n      }\n    }\n  }\n\n  const deps = await executeAppBuilderAsJson<Array<any>>(args)\n  const nodeModuleExcludedExts = getNodeModuleExcludedExts(platformPackager)\n  // mapSeries instead of map because copyNodeModules is concurrent and so, no need to increase queue/pressure\n  return await BluebirdPromise.mapSeries(deps, async info => {\n    const source = info.dir\n    let destination: string\n    if (source.length > mainMatcher.from.length && source.startsWith(mainMatcher.from) && source[mainMatcher.from.length] === path.sep) {\n      destination = getDestinationPath(source, {src: mainMatcher.from, destination: mainMatcher.to, files: [], metadata: null as any})\n    }\n    else {\n      destination = mainMatcher.to + path.sep + \"node_modules\"\n    }\n\n    // use main matcher patterns, so, user can exclude some files in such hoisted node modules\n    // source here includes node_modules, but pattern base should be without because users expect that pattern \"!node_modules/loot-core/src{,/**/*}\" will work\n    const matcher = new FileMatcher(path.dirname(source), destination, mainMatcher.macroExpander, mainMatcher.patterns)\n    const copier = new NodeModuleCopyHelper(matcher, platformPackager.info)\n    const names = info.deps\n    const files = await copier.collectNodeModules(source, names, nodeModuleExcludedExts)\n    return validateFileSet({src: source, destination, files, metadata: copier.metadata})\n  })\n}\n\nasync function compileUsingElectronCompile(mainFileSet: ResolvedFileSet, packager: Packager): Promise<ResolvedFileSet> {\n  log.info(\"compiling using electron-compile\")\n\n  const electronCompileCache = await packager.tempDirManager.getTempDir({prefix: \"electron-compile-cache\"})\n  const cacheDir = path.join(electronCompileCache, \".cache\")\n  // clear and create cache dir\n  await ensureDir(cacheDir)\n  const compilerHost = await createElectronCompilerHost(mainFileSet.src, cacheDir)\n  const nextSlashIndex = mainFileSet.src.length + 1\n  // pre-compute electron-compile to cache dir - we need to process only subdirectories, not direct files of app dir\n  await BluebirdPromise.map(mainFileSet.files, file => {\n    if (file.includes(NODE_MODULES_PATTERN) || file.includes(BOWER_COMPONENTS_PATTERN)\n      || !file.includes(path.sep, nextSlashIndex) // ignore not root files\n      || !mainFileSet.metadata.get(file)!.isFile()) {\n      return null\n    }\n    return compilerHost.compile(file)\n      .then(() => null)\n  }, CONCURRENCY)\n\n  await compilerHost.saveConfiguration()\n\n  const metadata = new Map<string, Stats>()\n  const cacheFiles = await walk(cacheDir, file => !file.startsWith(\".\"), {\n    consume: (file, fileStat) => {\n      if (fileStat.isFile()) {\n        metadata.set(file, fileStat)\n      }\n      return null\n    }\n  })\n\n  // add shim\n  const shimPath = `${mainFileSet.src}${path.sep}${ELECTRON_COMPILE_SHIM_FILENAME}`\n  mainFileSet.files.push(shimPath)\n  mainFileSet.metadata.set(shimPath, {isFile: () => true, isDirectory: () => false, isSymbolicLink: () => false} as any)\n  if (mainFileSet.transformedFiles == null) {\n    mainFileSet.transformedFiles = new Map()\n  }\n  mainFileSet.transformedFiles.set(mainFileSet.files.length - 1, `\n'use strict';\nrequire('electron-compile').init(__dirname, require('path').resolve(__dirname, '${packager.metadata.main || \"index\"}'), true);\n`)\n  return {src: electronCompileCache, files: cacheFiles, metadata, destination: mainFileSet.destination}\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.computeEnv = computeEnv;
exports.computeToolEnv = computeToolEnv;

function computeEnv(oldValue, newValues) {
  const parsedOldValue = oldValue ? oldValue.split(":") : [];
  return newValues.concat(parsedOldValue).filter(it => it.length > 0).join(":");
}

function computeToolEnv(libPath) {
  // noinspection SpellCheckingInspection
  return Object.assign({}, process.env, {
    DYLD_LIBRARY_PATH: computeEnv(process.env.DYLD_LIBRARY_PATH, libPath)
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=bundledTool.js.map{"version":3,"sources":["../../src/util/bundledTool.ts"],"names":[],"mappings":";;;;;;;;AAKM,SAAU,UAAV,CAAqB,QAArB,EAA0D,SAA1D,EAAkF;AACtF,QAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC,KAAT,CAAe,GAAf,CAAH,GAAyB,EAAxD;AACA,SAAO,SAAS,CAAC,MAAV,CAAiB,cAAjB,EAAiC,MAAjC,CAAwC,EAAE,IAAI,EAAE,CAAC,MAAH,GAAY,CAA1D,EAA6D,IAA7D,CAAkE,GAAlE,CAAP;AACD;;AAEK,SAAU,cAAV,CAAyB,OAAzB,EAA+C;AACnD;AACA,SAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACK,OAAO,CAAC,GADb,EACgB;AACd,IAAA,iBAAiB,EAAE,UAAU,CAAC,OAAO,CAAC,GAAR,CAAY,iBAAb,EAAgC,OAAhC;AADf,GADhB,CAAA;AAID,C","sourcesContent":["export interface ToolInfo {\n  path: string\n  env?: any\n}\n\nexport function computeEnv(oldValue: string | null | undefined, newValues: Array<string>): string {\n  const parsedOldValue = oldValue ? oldValue.split(\":\") : []\n  return newValues.concat(parsedOldValue).filter(it => it.length > 0).join(\":\")\n}\n\nexport function computeToolEnv(libPath: Array<string>): any {\n  // noinspection SpellCheckingInspection\n  return {\n    ...process.env,\n    DYLD_LIBRARY_PATH: computeEnv(process.env.DYLD_LIBRARY_PATH, libPath)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.digest = digest;
exports.BuildCacheManager = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class BuildCacheManager {
  constructor(outDir, executableFile, arch) {
    this.executableFile = executableFile;
    this.cacheInfo = null;
    this.newDigest = null;
    this.cacheDir = path.join(outDir, ".cache", _builderUtil().Arch[arch]);
    this.cacheFile = path.join(this.cacheDir, "app.exe");
    this.cacheInfoFile = path.join(this.cacheDir, "info.json");
  }

  copyIfValid(digest) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      _this.newDigest = digest;
      _this.cacheInfo = yield (0, _promise().orNullIfFileNotExist)((0, _fsExtraP().readJson)(_this.cacheInfoFile));
      const oldDigest = _this.cacheInfo == null ? null : _this.cacheInfo.executableDigest;

      if (oldDigest !== digest) {
        _builderUtil().log.debug({
          oldDigest,
          newDigest: digest
        }, "no valid cached executable found");

        return false;
      }

      _builderUtil().log.debug({
        cacheFile: _this.cacheFile,
        file: _this.executableFile
      }, `copying cached executable`);

      try {
        yield (0, _fs().copyFile)(_this.cacheFile, _this.executableFile, false);
        return true;
      } catch (e) {
        if (e.code === "ENOENT" || e.code === "ENOTDIR") {
          _builderUtil().log.debug({
            error: e.code
          }, "copy cached executable failed");
        } else {
          _builderUtil().log.warn({
            error: e.stack || e
          }, `cannot copy cached executable`);
        }
      }

      return false;
    })();
  }

  save() {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (_this2.newDigest == null) {
        throw new Error("call copyIfValid before");
      }

      if (_this2.cacheInfo == null) {
        _this2.cacheInfo = {
          executableDigest: _this2.newDigest
        };
      } else {
        _this2.cacheInfo.executableDigest = _this2.newDigest;
      }

      try {
        yield (0, _fsExtraP().ensureDir)(_this2.cacheDir);
        yield Promise.all([(0, _fsExtraP().writeJson)(_this2.cacheInfoFile, _this2.cacheInfo), (0, _fs().copyFile)(_this2.executableFile, _this2.cacheFile, false)]);
      } catch (e) {
        _builderUtil().log.warn({
          error: e.stack || e
        }, `cannot save build cache`);
      }
    })();
  }

}

exports.BuildCacheManager = BuildCacheManager;
BuildCacheManager.VERSION = "0";

function digest(_x, _x2) {
  return _digest.apply(this, arguments);
} function _digest() {
  _digest = (0, _bluebirdLst().coroutine)(function* (hash, files) {
    // do not use pipe - better do bulk file read (https://github.com/yarnpkg/yarn/commit/7a63e0d23c46a4564bc06645caf8a59690f04d01)
    for (const content of yield _bluebirdLst().default.map(files, it => (0, _fsExtraP().readFile)(it))) {
      hash.update(content);
    }

    hash.update(BuildCacheManager.VERSION);
    return hash.digest("base64");
  });
  return _digest.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=cacheManager.js.map{"version":3,"sources":["../../src/util/cacheManager.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, log } from \"builder-util\"\nimport { copyFile } from \"builder-util/out/fs\"\nimport { orNullIfFileNotExist } from \"builder-util/out/promise\"\nimport { Hash } from \"crypto\"\nimport { ensureDir, readFile, readJson, writeJson } from \"fs-extra-p\"\nimport * as path from \"path\"\n\nexport interface BuildCacheInfo {\n  executableDigest: string\n}\n\nexport class BuildCacheManager {\n  static VERSION: string = \"0\"\n\n  readonly cacheDir: string\n  readonly cacheInfoFile: string\n  readonly cacheFile: string\n\n  cacheInfo: BuildCacheInfo | null = null\n\n  private newDigest: string | null = null\n\n  constructor(outDir: string, private readonly executableFile: string, arch: Arch) {\n    this.cacheDir = path.join(outDir, \".cache\", Arch[arch])\n    this.cacheFile = path.join(this.cacheDir, \"app.exe\")\n    this.cacheInfoFile = path.join(this.cacheDir, \"info.json\")\n  }\n\n  async copyIfValid(digest: string): Promise<boolean> {\n    this.newDigest = digest\n\n    this.cacheInfo = await orNullIfFileNotExist(readJson(this.cacheInfoFile))\n    const oldDigest = this.cacheInfo == null ? null : this.cacheInfo.executableDigest\n    if (oldDigest !== digest) {\n      log.debug({oldDigest, newDigest: digest}, \"no valid cached executable found\")\n      return false\n    }\n\n    log.debug({cacheFile: this.cacheFile, file: this.executableFile}, `copying cached executable`)\n    try {\n      await copyFile(this.cacheFile, this.executableFile, false)\n      return true\n    }\n    catch (e) {\n      if (e.code === \"ENOENT\" || e.code === \"ENOTDIR\") {\n        log.debug({error: e.code}, \"copy cached executable failed\")\n      }\n      else {\n        log.warn({error: e.stack || e}, `cannot copy cached executable`)\n      }\n    }\n    return false\n  }\n\n  async save() {\n    if (this.newDigest == null) {\n      throw new Error(\"call copyIfValid before\")\n    }\n\n    if (this.cacheInfo == null) {\n      this.cacheInfo = {executableDigest: this.newDigest}\n    }\n    else {\n      this.cacheInfo.executableDigest = this.newDigest\n    }\n\n    try {\n      await ensureDir(this.cacheDir)\n      await Promise.all([writeJson(this.cacheInfoFile, this.cacheInfo), copyFile(this.executableFile, this.cacheFile, false)])\n    }\n    catch (e) {\n      log.warn({error: e.stack || e}, `cannot save build cache`)\n    }\n  }\n}\n\nexport async function digest(hash: Hash, files: Array<string>) {\n  // do not use pipe - better do bulk file read (https://github.com/yarnpkg/yarn/commit/7a63e0d23c46a4564bc06645caf8a59690f04d01)\n  for (const content of await BluebirdPromise.map(files, it => readFile(it))) {\n    hash.update(content)\n  }\n\n  hash.update(BuildCacheManager.VERSION)\n  return hash.digest(\"base64\")\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getConfig = getConfig;
exports.doMergeConfigs = doMergeConfigs;
exports.validateConfig = validateConfig;
exports.computeDefaultAppDirectory = computeDefaultAppDirectory;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _readConfigFile() {
  const data = require("read-config-file");

  _readConfigFile = function () {
    return data;
  };

  return data;
}

function _rectCra() {
  const data = require("../presets/rectCra");

  _rectCra = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

// https://github.com/electron-userland/electron-builder/issues/1847
function mergePublish(config, configFromOptions) {
  // if config from disk doesn't have publish (or object), no need to handle, it will be simply merged by deepAssign
  const publish = Array.isArray(config.publish) ? configFromOptions.publish : null;

  if (publish != null) {
    delete configFromOptions.publish;
  }

  (0, _builderUtil().deepAssign)(config, configFromOptions);

  if (publish == null) {
    return;
  }

  const listOnDisk = config.publish;

  if (listOnDisk.length === 0) {
    config.publish = publish;
  } else {
    // apply to first
    Object.assign(listOnDisk[0], publish);
  }
}

function getConfig(_x, _x2, _x3) {
  return _getConfig2.apply(this, arguments);
} // normalize for easy merge


function _getConfig2() {
  _getConfig2 = (0, _bluebirdLst().coroutine)(function* (projectDir, configPath, configFromOptions, packageMetadata = new (_lazyVal().Lazy)(() => (0, _readConfigFile().orNullIfFileNotExist)((0, _fsExtraP().readJson)(path.join(projectDir, "package.json"))))) {
    const configRequest = {
      packageKey: "build",
      configFilename: "electron-builder",
      projectDir,
      packageMetadata
    };
    const configAndEffectiveFile = yield (0, _readConfigFile().getConfig)(configRequest, configPath);
    const config = configAndEffectiveFile == null ? {} : configAndEffectiveFile.result;

    if (configFromOptions != null) {
      mergePublish(config, configFromOptions);
    }

    if (configAndEffectiveFile != null) {
      _builderUtil().log.info({
        file: configAndEffectiveFile.configFile == null ? 'package.json ("build" field)' : configAndEffectiveFile.configFile
      }, "loaded configuration");
    }

    if (config.extends == null && config.extends !== null) {
      const metadata = (yield packageMetadata.value) || {};
      const devDependencies = metadata.devDependencies;
      const dependencies = metadata.dependencies;

      if (dependencies != null && "react-scripts" in dependencies || devDependencies != null && "react-scripts" in devDependencies) {
        config.extends = "react-cra";
      } else if (devDependencies != null && "electron-webpack" in devDependencies) {
        let file = "electron-webpack/out/electron-builder.js";

        try {
          file = require.resolve(file);
        } catch (ignore) {
          file = require.resolve("electron-webpack/electron-builder.yml");
        }

        config.extends = `file:${file}`;
      }
    }

    let parentConfig;

    if (config.extends === "react-cra") {
      parentConfig = yield (0, _rectCra().reactCra)(projectDir);

      _builderUtil().log.info({
        preset: config.extends
      }, "loaded parent configuration");
    } else if (config.extends != null) {
      const parentConfigAndEffectiveFile = yield (0, _readConfigFile().loadParentConfig)(configRequest, config.extends);

      _builderUtil().log.info({
        file: parentConfigAndEffectiveFile.configFile
      }, "loaded parent configuration");

      parentConfig = parentConfigAndEffectiveFile.result;
    } else {
      parentConfig = null;
    }

    return doMergeConfigs(config, parentConfig);
  });
  return _getConfig2.apply(this, arguments);
}

function normalizeFiles(configuration, name) {
  let value = configuration[name];

  if (value == null) {
    return;
  }

  if (!Array.isArray(value)) {
    value = [value];
  }

  itemLoop: for (let i = 0; i < value.length; i++) {
    let item = value[i];

    if (typeof item === "string") {
      // merge with previous if possible
      if (i !== 0) {
        let prevItemIndex = i - 1;
        let prevItem;

        do {
          prevItem = value[prevItemIndex--];
        } while (prevItem == null);

        if (prevItem.from == null && prevItem.to == null) {
          if (prevItem.filter == null) {
            prevItem.filter = [item];
          } else {
            prevItem.filter.push(item);
          }

          value[i] = null;
          continue itemLoop;
        }
      }

      item = {
        filter: [item]
      };
      value[i] = item;
    } else if (Array.isArray(item)) {
      throw new Error(`${name} configuration is invalid, nested array not expected for index ${i}: ` + item);
    } // make sure that merge logic is not complex - unify different presentations


    if (item.from === ".") {
      item.from = undefined;
    }

    if (item.to === ".") {
      item.to = undefined;
    }

    if (item.filter != null && typeof item.filter === "string") {
      item.filter = [item.filter];
    }
  }

  configuration[name] = value.filter(it => it != null);
}

function mergeFiles(configuration, parentConfiguration, mergedConfiguration, name) {
  const list = configuration[name];
  const parentList = parentConfiguration[name];

  if (list == null || parentList == null) {
    return;
  }

  const result = list.slice();
  mergedConfiguration[name] = result;

  itemLoop: for (const item of parentConfiguration.files) {
    for (const existingItem of list) {
      if (existingItem.from === item.from && existingItem.to === item.to) {
        if (item.filter != null) {
          if (existingItem.filter == null) {
            existingItem.filter = item.filter.slice();
          } else {
            existingItem.filter = item.filter.concat(existingItem.filter);
          }
        }

        continue itemLoop;
      }
    } // existing item not found, simply add


    result.push(item);
  }
}

function doMergeConfigs(configuration, parentConfiguration) {
  normalizeFiles(configuration, "files");
  normalizeFiles(configuration, "extraFiles");
  normalizeFiles(configuration, "extraResources");

  if (parentConfiguration == null) {
    return (0, _builderUtil().deepAssign)(getDefaultConfig(), configuration);
  }

  normalizeFiles(parentConfiguration, "files");
  normalizeFiles(parentConfiguration, "extraFiles");
  normalizeFiles(parentConfiguration, "extraResources");
  const result = (0, _builderUtil().deepAssign)(getDefaultConfig(), parentConfiguration, configuration);
  mergeFiles(configuration, parentConfiguration, result, "files");
  return result;
}

function getDefaultConfig() {
  return {
    directories: {
      output: "dist",
      buildResources: "build"
    }
  };
}

const schemeDataPromise = new (_lazyVal().Lazy)(() => (0, _fsExtraP().readJson)(path.join(__dirname, "..", "..", "scheme.json")));

function validateConfig(_x4, _x5) {
  return _validateConfig2.apply(this, arguments);
}

function _validateConfig2() {
  _validateConfig2 = (0, _bluebirdLst().coroutine)(function* (config, debugLogger) {
    const extraMetadata = config.extraMetadata;

    if (extraMetadata != null) {
      if (extraMetadata.build != null) {
        throw new (_builderUtil().InvalidConfigurationError)(`--em.build is deprecated, please specify as -c"`);
      }

      if (extraMetadata.directories != null) {
        throw new (_builderUtil().InvalidConfigurationError)(`--em.directories is deprecated, please specify as -c.directories"`);
      }
    } // noinspection JSDeprecatedSymbols


    if (config.npmSkipBuildFromSource === false) {
      config.buildDependenciesFromSource = false;
    }

    yield (0, _readConfigFile().validateConfig)(config, schemeDataPromise, (message, errors) => {
      if (debugLogger.isEnabled) {
        debugLogger.add("invalidConfig", JSON.stringify(errors, null, 2));
      }

      return `${message}

How to fix:
1. Open https://electron.build/configuration/configuration
2. Search the option name on the page.
  * Not found? The option was deprecated or not exists (check spelling).
  * Found? Check that the option in the appropriate place. e.g. "title" only in the "dmg", not in the root.
`;
    });
  });
  return _validateConfig2.apply(this, arguments);
}

const DEFAULT_APP_DIR_NAMES = ["app", "www"];

function computeDefaultAppDirectory(_x6, _x7) {
  return _computeDefaultAppDirectory.apply(this, arguments);
} function _computeDefaultAppDirectory() {
  _computeDefaultAppDirectory = (0, _bluebirdLst().coroutine)(function* (projectDir, userAppDir) {
    if (userAppDir != null) {
      const absolutePath = path.resolve(projectDir, userAppDir);
      const stat = yield (0, _fs().statOrNull)(absolutePath);

      if (stat == null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Application directory ${userAppDir} doesn't exist`);
      } else if (!stat.isDirectory()) {
        throw new (_builderUtil().InvalidConfigurationError)(`Application directory ${userAppDir} is not a directory`);
      } else if (projectDir === absolutePath) {
        _builderUtil().log.warn({
          appDirectory: userAppDir
        }, `Specified application directory equals to project dir â€” superfluous or wrong configuration`);
      }

      return absolutePath;
    }

    for (const dir of DEFAULT_APP_DIR_NAMES) {
      const absolutePath = path.join(projectDir, dir);
      const packageJson = path.join(absolutePath, "package.json");
      const stat = yield (0, _fs().statOrNull)(packageJson);

      if (stat != null && stat.isFile()) {
        return absolutePath;
      }
    }

    return projectDir;
  });
  return _computeDefaultAppDirectory.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=config.js.map{"version":3,"sources":["../../src/util/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { DebugLogger, deepAssign, InvalidConfigurationError, log } from \"builder-util\"\nimport { statOrNull } from \"builder-util/out/fs\"\nimport { readJson } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { getConfig as _getConfig, loadParentConfig, orNullIfFileNotExist, ReadConfigRequest, validateConfig as _validateConfig } from \"read-config-file\"\nimport { FileSet } from \"..\"\nimport { Configuration } from \"../configuration\"\nimport { reactCra } from \"../presets/rectCra\"\n\n// https://github.com/electron-userland/electron-builder/issues/1847\nfunction mergePublish(config: Configuration, configFromOptions: Configuration) {\n  // if config from disk doesn't have publish (or object), no need to handle, it will be simply merged by deepAssign\n  const publish = Array.isArray(config.publish) ? configFromOptions.publish : null\n  if (publish != null) {\n    delete (configFromOptions as any).publish\n  }\n\n  deepAssign(config, configFromOptions)\n\n  if (publish == null) {\n    return\n  }\n\n  const listOnDisk = config.publish as Array<any>\n  if (listOnDisk.length === 0) {\n    config.publish = publish\n  }\n  else {\n    // apply to first\n    Object.assign(listOnDisk[0], publish)\n  }\n}\n\nexport async function getConfig(projectDir: string,\n                                configPath: string | null,\n                                configFromOptions: Configuration | null | undefined,\n                                packageMetadata: Lazy<{ [key: string]: any } | null> = new Lazy(() => orNullIfFileNotExist(readJson(path.join(projectDir, \"package.json\"))))): Promise<Configuration> {\n  const configRequest: ReadConfigRequest = {packageKey: \"build\", configFilename: \"electron-builder\", projectDir, packageMetadata}\n  const configAndEffectiveFile = await _getConfig<Configuration>(configRequest, configPath)\n  const config = configAndEffectiveFile == null ? {} : configAndEffectiveFile.result\n  if (configFromOptions != null) {\n    mergePublish(config, configFromOptions)\n  }\n\n  if (configAndEffectiveFile != null) {\n    log.info({file: configAndEffectiveFile.configFile == null ? 'package.json (\"build\" field)' : configAndEffectiveFile.configFile}, \"loaded configuration\")\n  }\n\n  if (config.extends == null && config.extends !== null) {\n    const metadata = await packageMetadata.value || {}\n    const devDependencies = metadata.devDependencies\n    const dependencies = metadata.dependencies\n    if ((dependencies != null && \"react-scripts\" in dependencies) || (devDependencies != null && \"react-scripts\" in devDependencies)) {\n      config.extends = \"react-cra\"\n    }\n    else if (devDependencies != null && \"electron-webpack\" in devDependencies) {\n      let file = \"electron-webpack/out/electron-builder.js\"\n      try {\n        file = require.resolve(file)\n      }\n      catch (ignore) {\n        file = require.resolve(\"electron-webpack/electron-builder.yml\")\n      }\n      config.extends = `file:${file}`\n    }\n  }\n\n  let parentConfig: Configuration | null\n  if (config.extends === \"react-cra\") {\n    parentConfig = await reactCra(projectDir)\n    log.info({preset: config.extends}, \"loaded parent configuration\")\n  }\n  else if (config.extends != null) {\n    const parentConfigAndEffectiveFile = await loadParentConfig<Configuration>(configRequest, config.extends)\n    log.info({file: parentConfigAndEffectiveFile.configFile}, \"loaded parent configuration\")\n    parentConfig = parentConfigAndEffectiveFile.result\n  }\n  else {\n    parentConfig = null\n  }\n\n  return doMergeConfigs(config, parentConfig)\n}\n\n// normalize for easy merge\nfunction normalizeFiles(configuration: Configuration, name: \"files\" | \"extraFiles\" | \"extraResources\") {\n  let value = configuration[name]\n  if (value == null) {\n    return\n  }\n\n  if (!Array.isArray(value)) {\n    value = [value]\n  }\n\n  itemLoop: for (let i = 0; i < value.length; i++) {\n    let item = value[i]\n    if (typeof item === \"string\") {\n      // merge with previous if possible\n      if (i !== 0) {\n        let prevItemIndex = i - 1\n        let prevItem: FileSet\n        do {\n          prevItem = value[prevItemIndex--] as FileSet\n        } while (prevItem == null)\n\n        if (prevItem.from == null && prevItem.to == null) {\n          if (prevItem.filter == null) {\n            prevItem.filter = [item]\n          }\n          else {\n            (prevItem.filter as Array<string>).push(item)\n          }\n          value[i] = null as any\n          continue itemLoop\n        }\n      }\n\n      item = {\n        filter: [item],\n      }\n      value[i] = item\n    }\n    else if (Array.isArray(item)) {\n      throw new Error(`${name} configuration is invalid, nested array not expected for index ${i}: ` + item)\n    }\n\n    // make sure that merge logic is not complex - unify different presentations\n    if (item.from === \".\") {\n      item.from = undefined\n    }\n\n    if (item.to === \".\") {\n      item.to = undefined\n    }\n\n    if (item.filter != null && typeof item.filter === \"string\") {\n      item.filter = [item.filter]\n    }\n  }\n\n  configuration[name] = value.filter(it => it != null)\n}\n\nfunction mergeFiles(configuration: Configuration, parentConfiguration: Configuration, mergedConfiguration: Configuration, name: \"files\" | \"extraFiles\" | \"extraResources\") {\n  const list = configuration[name] as Array<FileSet> | null\n  const parentList = parentConfiguration[name] as Array<FileSet> | null\n  if (list == null || parentList == null) {\n    return\n  }\n\n  const result = list.slice()\n  mergedConfiguration[name] = result\n\n  itemLoop: for (const item of parentConfiguration.files as Array<FileSet>) {\n    for (const existingItem of list) {\n      if (existingItem.from === item.from && existingItem.to === item.to) {\n        if (item.filter != null) {\n          if (existingItem.filter == null) {\n            existingItem.filter = item.filter.slice()\n          }\n          else {\n            existingItem.filter = (item.filter as Array<string>).concat(existingItem.filter)\n          }\n        }\n\n        continue itemLoop\n      }\n    }\n\n    // existing item not found, simply add\n    result.push(item)\n  }\n}\n\nexport function doMergeConfigs(configuration: Configuration, parentConfiguration: Configuration | null) {\n  normalizeFiles(configuration, \"files\")\n  normalizeFiles(configuration, \"extraFiles\")\n  normalizeFiles(configuration, \"extraResources\")\n\n  if (parentConfiguration == null) {\n    return deepAssign(getDefaultConfig(), configuration)\n  }\n\n  normalizeFiles(parentConfiguration, \"files\")\n  normalizeFiles(parentConfiguration, \"extraFiles\")\n  normalizeFiles(parentConfiguration, \"extraResources\")\n\n  const result = deepAssign(getDefaultConfig(), parentConfiguration, configuration)\n  mergeFiles(configuration, parentConfiguration, result, \"files\")\n  return result\n}\n\nfunction getDefaultConfig(): Configuration {\n  return {\n    directories: {\n      output: \"dist\",\n      buildResources: \"build\",\n    },\n  }\n}\n\nconst schemeDataPromise = new Lazy(() => readJson(path.join(__dirname, \"..\", \"..\", \"scheme.json\")))\n\nexport async function validateConfig(config: Configuration, debugLogger: DebugLogger) {\n  const extraMetadata = config.extraMetadata\n  if (extraMetadata != null) {\n    if (extraMetadata.build != null) {\n      throw new InvalidConfigurationError(`--em.build is deprecated, please specify as -c\"`)\n    }\n    if (extraMetadata.directories != null) {\n      throw new InvalidConfigurationError(`--em.directories is deprecated, please specify as -c.directories\"`)\n    }\n  }\n\n  // noinspection JSDeprecatedSymbols\n  if (config.npmSkipBuildFromSource === false) {\n    config.buildDependenciesFromSource = false\n  }\n\n  await _validateConfig(config, schemeDataPromise, (message, errors) => {\n    if (debugLogger.isEnabled) {\n      debugLogger.add(\"invalidConfig\", JSON.stringify(errors, null, 2))\n    }\n\n    return `${message}\n\nHow to fix:\n1. Open https://electron.build/configuration/configuration\n2. Search the option name on the page.\n  * Not found? The option was deprecated or not exists (check spelling).\n  * Found? Check that the option in the appropriate place. e.g. \"title\" only in the \"dmg\", not in the root.\n`\n  })\n}\n\nconst DEFAULT_APP_DIR_NAMES = [\"app\", \"www\"]\n\nexport async function computeDefaultAppDirectory(projectDir: string, userAppDir: string | null | undefined): Promise<string> {\n  if (userAppDir != null) {\n    const absolutePath = path.resolve(projectDir, userAppDir)\n    const stat = await statOrNull(absolutePath)\n    if (stat == null) {\n      throw new InvalidConfigurationError(`Application directory ${userAppDir} doesn't exist`)\n    }\n    else if (!stat.isDirectory()) {\n      throw new InvalidConfigurationError(`Application directory ${userAppDir} is not a directory`)\n    }\n    else if (projectDir === absolutePath) {\n      log.warn({appDirectory: userAppDir}, `Specified application directory equals to project dir â€” superfluous or wrong configuration`)\n    }\n    return absolutePath\n  }\n\n  for (const dir of DEFAULT_APP_DIR_NAMES) {\n    const absolutePath = path.join(projectDir, dir)\n    const packageJson = path.join(absolutePath, \"package.json\")\n    const stat = await statOrNull(packageJson)\n    if (stat != null && stat.isFile()) {\n      return absolutePath\n    }\n  }\n  return projectDir\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.hasMagic = hasMagic;
exports.createFilter = createFilter;

var path = _interopRequireWildcard(require("path"));

function _fileTransformer() {
  const data = require("../fileTransformer");

  _fileTransformer = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/** @internal */
function hasMagic(pattern) {
  const set = pattern.set;

  if (set.length > 1) {
    return true;
  }

  for (const i of set[0]) {
    if (typeof i !== "string") {
      return true;
    }
  }

  return false;
} // sometimes, destination may not contain path separator in the end (path to folder), but the src does. So let's ensure paths have path separators in the end


function ensureEndSlash(s) {
  return s.length === 0 || s.endsWith(path.sep) ? s : s + path.sep;
}

function getRelativePath(file, srcWithEndSlash) {
  if (!file.startsWith(srcWithEndSlash)) {
    const index = file.indexOf(_fileTransformer().NODE_MODULES_PATTERN);

    if (index < 0) {
      throw new Error(`${file} must be under ${srcWithEndSlash}`);
    } else {
      return file.substring(index + 1
      /* leading slash */
      );
    }
  }

  let relative = file.substring(srcWithEndSlash.length);

  if (path.sep === "\\") {
    if (relative.startsWith("\\")) {
      // windows problem: double backslash, the above substring call removes root path with a single slash, so here can me some leftovers
      relative = relative.substring(1);
    }

    relative = relative.replace(/\\/g, "/");
  }

  return relative;
}
/** @internal */


function createFilter(src, patterns, excludePatterns) {
  const srcWithEndSlash = ensureEndSlash(src);
  return (file, stat) => {
    if (src === file) {
      return true;
    }

    const relative = getRelativePath(file, srcWithEndSlash); // https://github.com/electron-userland/electron-builder/issues/867

    return minimatchAll(relative, patterns, stat) && (excludePatterns == null || stat.isDirectory() || !minimatchAll(relative, excludePatterns, stat));
  };
} // https://github.com/joshwnj/minimatch-all/blob/master/index.js


function minimatchAll(path, patterns, stat) {
  let match = false;

  for (const pattern of patterns) {
    // If we've got a match, only re-test for exclusions.
    // if we don't have a match, only re-test for inclusions.
    if (match !== pattern.negate) {
      continue;
    } // partial match â€” pattern: foo/bar.txt path: foo â€” we must allow foo
    // use it only for non-negate patterns: const m = new Minimatch("!node_modules/@(electron-download|electron)/**/*", {dot: true }); m.match("node_modules", true) will return false, but must be true


    match = pattern.match(path, stat.isDirectory() && !pattern.negate);
  }

  return match;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=filter.js.map{"version":3,"sources":["../../src/util/filter.ts"],"names":[],"mappings":";;;;;;;;AAGA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEA;AACM,SAAU,QAAV,CAAmB,OAAnB,EAAqC;AACzC,QAAM,GAAG,GAAG,OAAO,CAAC,GAApB;;AACA,MAAI,GAAG,CAAC,MAAJ,GAAa,CAAjB,EAAoB;AAClB,WAAO,IAAP;AACD;;AAED,OAAK,MAAM,CAAX,IAAgB,GAAG,CAAC,CAAD,CAAnB,EAAwB;AACtB,QAAI,OAAO,CAAP,KAAa,QAAjB,EAA2B;AACzB,aAAO,IAAP;AACD;AACF;;AAED,SAAO,KAAP;AACD,C,CAED;;;AACA,SAAS,cAAT,CAAwB,CAAxB,EAAiC;AAC/B,SAAO,CAAC,CAAC,MAAF,KAAa,CAAb,IAAkB,CAAC,CAAC,QAAF,CAAW,IAAI,CAAC,GAAhB,CAAlB,GAAyC,CAAzC,GAA8C,CAAC,GAAG,IAAI,CAAC,GAA9D;AACD;;AAED,SAAS,eAAT,CAAyB,IAAzB,EAAuC,eAAvC,EAA8D;AAC5D,MAAI,CAAC,IAAI,CAAC,UAAL,CAAgB,eAAhB,CAAL,EAAuC;AACrC,UAAM,KAAK,GAAG,IAAI,CAAC,OAAL,CAAa,uCAAb,CAAd;;AACA,QAAI,KAAK,GAAG,CAAZ,EAAe;AACb,YAAM,IAAI,KAAJ,CAAU,GAAG,IAAI,kBAAkB,eAAe,EAAlD,CAAN;AACD,KAFD,MAGK;AACH,aAAO,IAAI,CAAC,SAAL,CAAe,KAAK,GAAG;AAAE;AAAzB,OAAP;AACD;AACF;;AAED,MAAI,QAAQ,GAAG,IAAI,CAAC,SAAL,CAAe,eAAe,CAAC,MAA/B,CAAf;;AACA,MAAI,IAAI,CAAC,GAAL,KAAa,IAAjB,EAAuB;AACrB,QAAI,QAAQ,CAAC,UAAT,CAAoB,IAApB,CAAJ,EAA+B;AAC7B;AACA,MAAA,QAAQ,GAAG,QAAQ,CAAC,SAAT,CAAmB,CAAnB,CAAX;AACD;;AACD,IAAA,QAAQ,GAAG,QAAQ,CAAC,OAAT,CAAiB,KAAjB,EAAwB,GAAxB,CAAX;AACD;;AACD,SAAO,QAAP;AACD;AAED;;;AACM,SAAU,YAAV,CAAuB,GAAvB,EAAoC,QAApC,EAAgE,eAAhE,EAAyG;AAC7G,QAAM,eAAe,GAAG,cAAc,CAAC,GAAD,CAAtC;AACA,SAAO,CAAC,IAAD,EAAO,IAAP,KAAe;AACpB,QAAI,GAAG,KAAK,IAAZ,EAAkB;AAChB,aAAO,IAAP;AACD;;AAED,UAAM,QAAQ,GAAG,eAAe,CAAC,IAAD,EAAO,eAAP,CAAhC,CALoB,CAMpB;;AACA,WAAO,YAAY,CAAC,QAAD,EAAW,QAAX,EAAqB,IAArB,CAAZ,KAA2C,eAAe,IAAI,IAAnB,IAA2B,IAAI,CAAC,WAAL,EAA3B,IAAiD,CAAC,YAAY,CAAC,QAAD,EAAW,eAAX,EAA4B,IAA5B,CAAzG,CAAP;AACD,GARD;AASD,C,CAED;;;AACA,SAAS,YAAT,CAAsB,IAAtB,EAAoC,QAApC,EAAgE,IAAhE,EAA2E;AACzE,MAAI,KAAK,GAAG,KAAZ;;AACA,OAAK,MAAM,OAAX,IAAsB,QAAtB,EAAgC;AAC9B;AACA;AACA,QAAI,KAAK,KAAK,OAAO,CAAC,MAAtB,EAA8B;AAC5B;AACD,KAL6B,CAO9B;AACA;;;AACA,IAAA,KAAK,GAAG,OAAO,CAAC,KAAR,CAAc,IAAd,EAAoB,IAAI,CAAC,WAAL,MAAsB,CAAC,OAAO,CAAC,MAAnD,CAAR;AACD;;AACD,SAAO,KAAP;AACD,C","sourcesContent":["import { Filter } from \"builder-util/out/fs\"\nimport { Stats } from \"fs-extra-p\"\nimport { Minimatch } from \"minimatch\"\nimport * as path from \"path\"\nimport { NODE_MODULES_PATTERN } from \"../fileTransformer\"\n\n/** @internal */\nexport function hasMagic(pattern: Minimatch) {\n  const set = pattern.set\n  if (set.length > 1) {\n    return true\n  }\n\n  for (const i of set[0]) {\n    if (typeof i !== \"string\") {\n      return true\n    }\n  }\n\n  return false\n}\n\n// sometimes, destination may not contain path separator in the end (path to folder), but the src does. So let's ensure paths have path separators in the end\nfunction ensureEndSlash(s: string) {\n  return s.length === 0 || s.endsWith(path.sep) ? s : (s + path.sep)\n}\n\nfunction getRelativePath(file: string, srcWithEndSlash: string) {\n  if (!file.startsWith(srcWithEndSlash)) {\n    const index = file.indexOf(NODE_MODULES_PATTERN)\n    if (index < 0) {\n      throw new Error(`${file} must be under ${srcWithEndSlash}`)\n    }\n    else {\n      return file.substring(index + 1 /* leading slash */)\n    }\n  }\n\n  let relative = file.substring(srcWithEndSlash.length)\n  if (path.sep === \"\\\\\") {\n    if (relative.startsWith(\"\\\\\")) {\n      // windows problem: double backslash, the above substring call removes root path with a single slash, so here can me some leftovers\n      relative = relative.substring(1)\n    }\n    relative = relative.replace(/\\\\/g, \"/\")\n  }\n  return relative\n}\n\n/** @internal */\nexport function createFilter(src: string, patterns: Array<Minimatch>, excludePatterns?: Array<Minimatch> | null): Filter {\n  const srcWithEndSlash = ensureEndSlash(src)\n  return (file, stat) => {\n    if (src === file) {\n      return true\n    }\n\n    const relative = getRelativePath(file, srcWithEndSlash)\n    // https://github.com/electron-userland/electron-builder/issues/867\n    return minimatchAll(relative, patterns, stat) && (excludePatterns == null || stat.isDirectory() || !minimatchAll(relative, excludePatterns, stat))\n  }\n}\n\n// https://github.com/joshwnj/minimatch-all/blob/master/index.js\nfunction minimatchAll(path: string, patterns: Array<Minimatch>, stat: Stats): boolean {\n  let match = false\n  for (const pattern of patterns) {\n    // If we've got a match, only re-test for exclusions.\n    // if we don't have a match, only re-test for inclusions.\n    if (match !== pattern.negate) {\n      continue\n    }\n\n    // partial match â€” pattern: foo/bar.txt path: foo â€” we must allow foo\n    // use it only for non-negate patterns: const m = new Minimatch(\"!node_modules/@(electron-download|electron)/**/*\", {dot: true }); m.match(\"node_modules\", true) will return false, but must be true\n    match = pattern.match(path, stat.isDirectory() && !pattern.negate)\n  }\n  return match\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isUseSystemSigncode = isUseSystemSigncode;
exports.isBuildCacheEnabled = isBuildCacheEnabled;
exports.isAutoDiscoveryCodeSignIdentity = isAutoDiscoveryCodeSignIdentity;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function isUseSystemSigncode() {
  return (0, _builderUtil().isEnvTrue)(process.env.USE_SYSTEM_SIGNCODE);
}

function isBuildCacheEnabled() {
  return !(0, _builderUtil().isEnvTrue)(process.env.ELECTRON_BUILDER_DISABLE_BUILD_CACHE);
}

function isAutoDiscoveryCodeSignIdentity() {
  return process.env.CSC_IDENTITY_AUTO_DISCOVERY !== "false";
} 
// __ts-babel@6.0.4
//# sourceMappingURL=flags.js.map{"version":3,"sources":["../../src/util/flags.ts"],"names":[],"mappings":";;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEM,SAAU,mBAAV,GAA6B;AACjC,SAAO,8BAAU,OAAO,CAAC,GAAR,CAAY,mBAAtB,CAAP;AACD;;AAEK,SAAU,mBAAV,GAA6B;AACjC,SAAO,CAAC,8BAAU,OAAO,CAAC,GAAR,CAAY,oCAAtB,CAAR;AACD;;AAEK,SAAU,+BAAV,GAAyC;AAC7C,SAAO,OAAO,CAAC,GAAR,CAAY,2BAAZ,KAA4C,OAAnD;AACD,C","sourcesContent":["import { isEnvTrue } from \"builder-util\"\n\nexport function isUseSystemSigncode() {\n  return isEnvTrue(process.env.USE_SYSTEM_SIGNCODE)\n}\n\nexport function isBuildCacheEnabled() {\n  return !isEnvTrue(process.env.ELECTRON_BUILDER_DISABLE_BUILD_CACHE)\n}\n\nexport function isAutoDiscoveryCodeSignIdentity() {\n  return process.env.CSC_IDENTITY_AUTO_DISCOVERY !== \"false\"\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.hashFile = hashFile;

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("fs");

  _fs = function () {
    return data;
  };

  return data;
}

function hashFile(file, algorithm = "sha512", encoding = "base64", options) {
  return new Promise((resolve, reject) => {
    const hash = (0, _crypto().createHash)(algorithm);
    hash.on("error", reject).setEncoding(encoding);
    (0, _fs().createReadStream)(file, Object.assign({}, options, {
      highWaterMark: 1024 * 1024
      /* better to use more memory but hash faster */

    })).on("error", reject).on("end", () => {
      hash.end();
      resolve(hash.read());
    }).pipe(hash, {
      end: false
    });
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=hash.js.map{"version":3,"sources":["../../src/util/hash.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEM,SAAU,QAAV,CAAmB,IAAnB,EAAiC,SAAA,GAAoB,QAArD,EAA+D,QAAA,GAA6B,QAA5F,EAAsG,OAAtG,EAAmH;AACvH,SAAO,IAAI,OAAJ,CAAoB,CAAC,OAAD,EAAU,MAAV,KAAoB;AAC7C,UAAM,IAAI,GAAG,0BAAW,SAAX,CAAb;AACA,IAAA,IAAI,CACD,EADH,CACM,OADN,EACe,MADf,EAEG,WAFH,CAEe,QAFf;AAIA,gCAAiB,IAAjB,EAAqB,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,OAAN,EAAa;AAAE,MAAA,aAAa,EAAE,OAAO;AAAK;;AAA7B,KAAb,CAArB,EACG,EADH,CACM,OADN,EACe,MADf,EAEG,EAFH,CAEM,KAFN,EAEa,MAAK;AACd,MAAA,IAAI,CAAC,GAAL;AACA,MAAA,OAAO,CAAC,IAAI,CAAC,IAAL,EAAD,CAAP;AACD,KALH,EAMG,IANH,CAMQ,IANR,EAMc;AAAC,MAAA,GAAG,EAAE;AAAN,KANd;AAOD,GAbM,CAAP;AAcD,C","sourcesContent":["import { createHash } from \"crypto\"\nimport { createReadStream } from \"fs\"\n\nexport function hashFile(file: string, algorithm: string = \"sha512\", encoding: \"base64\" | \"hex\" = \"base64\", options?: any) {\n  return new Promise<string>((resolve, reject) => {\n    const hash = createHash(algorithm)\n    hash\n      .on(\"error\", reject)\n      .setEncoding(encoding)\n\n    createReadStream(file, {...options, highWaterMark: 1024 * 1024 /* better to use more memory but hash faster */})\n      .on(\"error\", reject)\n      .on(\"end\", () => {\n        hash.end()\n        resolve(hash.read() as string)\n      })\n      .pipe(hash, {end: false})\n  })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.toLangWithRegion = toLangWithRegion;
exports.langIdToName = exports.lcid = exports.bundledLanguages = void 0;
const bundledLanguages = ["en_US", "de_DE", "fr_FR", "es_ES", "zh_CN", "zh_TW", "ja_JP", "ko_KR", "it_IT", "nl_NL", "da_DK", "sv_SE", "nb_NO", "fi_FI", "ru_RU", "pt_PT", "pt_BR", "pl_PL", "uk_UA", "cs_CZ", "sk_SK", "hu_HU", "ar_SA", "tr_TR", "th_TH", "vi_VN"]; // todo "ro_RO" "el_GR" "et_EE" "ka_GE"

exports.bundledLanguages = bundledLanguages;
const langToLangWithRegion = new Map();

for (const id of bundledLanguages) {
  langToLangWithRegion.set(id.substring(0, id.indexOf("_")), id);
}

function toLangWithRegion(lang) {
  if (lang.includes("_")) {
    return lang;
  }

  lang = lang.toLowerCase();
  const result = langToLangWithRegion.get(lang);
  return result == null ? `${lang}_${lang.toUpperCase()}` : result;
}

const lcid = {
  af_ZA: 1078,
  am_ET: 1118,
  ar_AE: 14337,
  ar_BH: 15361,
  ar_DZ: 5121,
  ar_EG: 3073,
  ar_IQ: 2049,
  ar_JO: 11265,
  ar_KW: 13313,
  ar_LB: 12289,
  ar_LY: 4097,
  ar_MA: 6145,
  ar_OM: 8193,
  ar_QA: 16385,
  ar_SA: 1025,
  ar_SY: 10241,
  ar_TN: 7169,
  ar_YE: 9217,
  arn_CL: 1146,
  as_IN: 1101,
  az_AZ: 2092,
  ba_RU: 1133,
  be_BY: 1059,
  bg_BG: 1026,
  bn_IN: 1093,
  bo_BT: 2129,
  bo_CN: 1105,
  br_FR: 1150,
  bs_BA: 8218,
  ca_ES: 1027,
  co_FR: 1155,
  cs_CZ: 1029,
  cy_GB: 1106,
  da_DK: 1030,
  de_AT: 3079,
  de_CH: 2055,
  de_DE: 1031,
  de_LI: 5127,
  de_LU: 4103,
  div_MV: 1125,
  dsb_DE: 2094,
  el_GR: 1032,
  en_AU: 3081,
  en_BZ: 10249,
  en_CA: 4105,
  en_CB: 9225,
  en_GB: 2057,
  en_IE: 6153,
  en_IN: 18441,
  en_JA: 8201,
  en_MY: 17417,
  en_NZ: 5129,
  en_PH: 13321,
  en_TT: 11273,
  en_US: 1033,
  en_ZA: 7177,
  en_ZW: 12297,
  es_AR: 11274,
  es_BO: 16394,
  es_CL: 13322,
  es_CO: 9226,
  es_CR: 5130,
  es_DO: 7178,
  es_EC: 12298,
  es_ES: 3082,
  es_GT: 4106,
  es_HN: 18442,
  es_MX: 2058,
  es_NI: 19466,
  es_PA: 6154,
  es_PE: 10250,
  es_PR: 20490,
  es_PY: 15370,
  es_SV: 17418,
  es_UR: 14346,
  es_US: 21514,
  es_VE: 8202,
  et_EE: 1061,
  eu_ES: 1069,
  fa_IR: 1065,
  fi_FI: 1035,
  fil_PH: 1124,
  fo_FO: 1080,
  fr_BE: 2060,
  fr_CA: 3084,
  fr_CH: 4108,
  fr_FR: 1036,
  fr_LU: 5132,
  fr_MC: 6156,
  fy_NL: 1122,
  ga_IE: 2108,
  gbz_AF: 1164,
  gl_ES: 1110,
  gsw_FR: 1156,
  gu_IN: 1095,
  ha_NG: 1128,
  he_IL: 1037,
  hi_IN: 1081,
  hr_BA: 4122,
  hr_HR: 1050,
  hu_HU: 1038,
  hy_AM: 1067,
  id_ID: 1057,
  ii_CN: 1144,
  is_IS: 1039,
  it_CH: 2064,
  it_IT: 1040,
  iu_CA: 2141,
  ja_JP: 1041,
  ka_GE: 1079,
  kh_KH: 1107,
  kk_KZ: 1087,
  kl_GL: 1135,
  kn_IN: 1099,
  ko_KR: 1042,
  kok_IN: 1111,
  ky_KG: 1088,
  lb_LU: 1134,
  lo_LA: 1108,
  lt_LT: 1063,
  lv_LV: 1062,
  mi_NZ: 1153,
  mk_MK: 1071,
  ml_IN: 1100,
  mn_CN: 2128,
  mn_MN: 1104,
  moh_CA: 1148,
  mr_IN: 1102,
  ms_BN: 2110,
  ms_MY: 1086,
  mt_MT: 1082,
  my_MM: 1109,
  nb_NO: 1044,
  ne_NP: 1121,
  nl_BE: 2067,
  nl_NL: 1043,
  nn_NO: 2068,
  ns_ZA: 1132,
  oc_FR: 1154,
  or_IN: 1096,
  pa_IN: 1094,
  pl_PL: 1045,
  ps_AF: 1123,
  pt_BR: 1046,
  pt_PT: 2070,
  qut_GT: 1158,
  quz_BO: 1131,
  quz_EC: 2155,
  quz_PE: 3179,
  rm_CH: 1047,
  ro_RO: 1048,
  ru_RU: 1049,
  rw_RW: 1159,
  sa_IN: 1103,
  sah_RU: 1157,
  se_FI: 3131,
  se_NO: 1083,
  se_SE: 2107,
  si_LK: 1115,
  sk_SK: 1051,
  sl_SI: 1060,
  sma_NO: 6203,
  sma_SE: 7227,
  smj_NO: 4155,
  smj_SE: 5179,
  smn_FI: 9275,
  sms_FI: 8251,
  sq_AL: 1052,
  sr_BA: 7194,
  sr_SP: 3098,
  sv_FI: 2077,
  sv_SE: 1053,
  sw_KE: 1089,
  syr_SY: 1114,
  ta_IN: 1097,
  te_IN: 1098,
  tg_TJ: 1064,
  th_TH: 1054,
  tk_TM: 1090,
  tmz_DZ: 2143,
  tn_ZA: 1074,
  tr_TR: 1055,
  tt_RU: 1092,
  ug_CN: 1152,
  uk_UA: 1058,
  ur_IN: 2080,
  ur_PK: 1056,
  uz_UZ: 2115,
  vi_VN: 1066,
  wen_DE: 1070,
  wo_SN: 1160,
  xh_ZA: 1076,
  yo_NG: 1130,
  zh_CHS: 4,
  zh_CHT: 31748,
  zh_CN: 2052,
  zh_HK: 3076,
  zh_MO: 5124,
  zh_SG: 4100,
  zh_TW: 1028,
  zu_ZA: 1077
}; // noinspection SpellCheckingInspection

exports.lcid = lcid;
const langIdToName = {
  ab: "Abkhaz",
  aa: "Afar",
  af: "Afrikaans",
  ak: "Akan",
  sq: "Albanian",
  am: "Amharic",
  ar: "Arabic",
  an: "Aragonese",
  hy: "Armenian",
  as: "Assamese",
  av: "Avaric",
  ae: "Avestan",
  ay: "Aymara",
  az: "Azerbaijani",
  bm: "Bambara",
  ba: "Bashkir",
  eu: "Basque",
  be: "Belarusian",
  bn: "Bengali",
  bh: "Bihari",
  bi: "Bislama",
  bs: "Bosnian",
  br: "Breton",
  bg: "Bulgarian",
  my: "Burmese",
  ca: "Catalan",
  ch: "Chamorro",
  ce: "Chechen",
  ny: "Chichewa",
  zh: "Chinese",
  cv: "Chuvash",
  kw: "Cornish",
  co: "Corsican",
  cr: "Cree",
  hr: "Croatian",
  cs: "Czech",
  da: "Danish",
  dv: "Divehi",
  nl: "Dutch",
  dz: "Dzongkha",
  en: "English",
  eo: "Esperanto",
  et: "Estonian",
  ee: "Ewe",
  fo: "Faroese",
  fj: "Fijian",
  fi: "Finnish",
  fr: "French",
  ff: "Fula",
  gl: "Galician",
  ka: "Georgian",
  de: "German",
  el: "Greek",
  gn: "GuaranÃ­",
  gu: "Gujarati",
  ht: "Haitian",
  ha: "Hausa",
  he: "Hebrew",
  hz: "Herero",
  hi: "Hindi",
  ho: "Hiri Motu",
  hu: "Hungarian",
  ia: "Interlingua",
  id: "Indonesian",
  ie: "Interlingue",
  ga: "Irish",
  ig: "Igbo",
  ik: "Inupiaq",
  io: "Ido",
  is: "Icelandic",
  it: "Italian",
  iu: "Inuktitut",
  ja: "Japanese",
  jv: "Javanese",
  kl: "Kalaallisut",
  kn: "Kannada",
  kr: "Kanuri",
  ks: "Kashmiri",
  kk: "Kazakh",
  km: "Khmer",
  ki: "Kikuyu",
  rw: "Kinyarwanda",
  ky: "Kyrgyz",
  kv: "Komi",
  kg: "Kongo",
  ko: "Korean",
  ku: "Kurdish",
  kj: "Kwanyama",
  la: "Latin",
  lb: "Luxembourgish",
  lg: "Ganda",
  li: "Limburgish",
  ln: "Lingala",
  lo: "Lao",
  lt: "Lithuanian",
  lu: "Luba-Katanga",
  lv: "Latvian",
  gv: "Manx",
  mk: "Macedonian",
  mg: "Malagasy",
  ms: "Malay",
  ml: "Malayalam",
  mt: "Maltese",
  mi: "MÄ�ori",
  mr: "Marathi",
  mh: "Marshallese",
  mn: "Mongolian",
  na: "Nauru",
  nv: "Navajo",
  nd: "Northern Ndebele",
  ne: "Nepali",
  ng: "Ndonga",
  nb: "Norwegian BokmÃ¥l",
  nn: "Norwegian Nynorsk",
  no: "Norwegian",
  ii: "Nuosu",
  nr: "Southern Ndebele",
  oc: "Occitan",
  oj: "Ojibwe",
  cu: "Old Church Slavonic",
  om: "Oromo",
  or: "Oriya",
  os: "Ossetian",
  pa: "Panjabi",
  pi: "PÄ�li",
  fa: "Persian",
  pl: "Polish",
  ps: "Pashto",
  pt: "Portuguese",
  qu: "Quechua",
  rm: "Romansh",
  rn: "Kirundi",
  ro: "Romanian",
  ru: "Russian",
  sa: "Sanskrit",
  sc: "Sardinian",
  sd: "Sindhi",
  se: "Northern Sami",
  sm: "Samoan",
  sg: "Sango",
  sr: "Serbian",
  gd: "Gaelic",
  sn: "Shona",
  si: "Sinhala",
  sk: "Slovak",
  sl: "Slovene",
  so: "Somali",
  st: "Southern Sotho",
  es: "Spanish",
  su: "Sundanese",
  sw: "Swahili",
  ss: "Swati",
  sv: "Swedish",
  ta: "Tamil",
  te: "Telugu",
  tg: "Tajik",
  th: "Thai",
  ti: "Tigrinya",
  bo: "Tibetan Standard",
  tk: "Turkmen",
  tl: "Tagalog",
  tn: "Tswana",
  to: "Tonga",
  tr: "Turkish",
  ts: "Tsonga",
  tt: "Tatar",
  tw: "Twi",
  ty: "Tahitian",
  ug: "Uyghur",
  uk: "Ukrainian",
  ur: "Urdu",
  uz: "Uzbek",
  ve: "Venda",
  vi: "Vietnamese",
  vo: "VolapÃ¼k",
  wa: "Walloon",
  cy: "Welsh",
  wo: "Wolof",
  fy: "Western Frisian",
  xh: "Xhosa",
  yi: "Yiddish",
  yo: "Yoruba",
  za: "Zhuang",
  zu: "Zulu"
}; exports.langIdToName = langIdToName;
// __ts-babel@6.0.4
//# sourceMappingURL=langs.js.map{"version":3,"sources":["../../src/util/langs.ts"],"names":[],"mappings":"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","sourcesContent":["export const bundledLanguages = [\n  \"en_US\", \"de_DE\", \"fr_FR\", \"es_ES\", \"zh_CN\", \"zh_TW\", \"ja_JP\", \"ko_KR\", \"it_IT\", \"nl_NL\", \"da_DK\", \"sv_SE\",\n  \"nb_NO\", \"fi_FI\", \"ru_RU\", \"pt_PT\", \"pt_BR\", \"pl_PL\", \"uk_UA\", \"cs_CZ\", \"sk_SK\", \"hu_HU\", \"ar_SA\", \"tr_TR\",\n  \"th_TH\", \"vi_VN\",\n]\n\n// todo \"ro_RO\" \"el_GR\" \"et_EE\" \"ka_GE\"\n\nconst langToLangWithRegion = new Map<string, string>()\nfor (const id of bundledLanguages) {\n  langToLangWithRegion.set(id.substring(0, id.indexOf(\"_\")), id)\n}\n\nexport function toLangWithRegion(lang: string): string {\n  if (lang.includes(\"_\")) {\n    return lang\n  }\n\n  lang = lang.toLowerCase()\n\n  const result = langToLangWithRegion.get(lang)\n  return result == null ? `${lang}_${lang.toUpperCase()}` : result\n}\n\nexport const lcid: any = {\n  af_ZA: 1078,\n  am_ET: 1118,\n  ar_AE: 14337,\n  ar_BH: 15361,\n  ar_DZ: 5121,\n  ar_EG: 3073,\n  ar_IQ: 2049,\n  ar_JO: 11265,\n  ar_KW: 13313,\n  ar_LB: 12289,\n  ar_LY: 4097,\n  ar_MA: 6145,\n  ar_OM: 8193,\n  ar_QA: 16385,\n  ar_SA: 1025,\n  ar_SY: 10241,\n  ar_TN: 7169,\n  ar_YE: 9217,\n  arn_CL: 1146,\n  as_IN: 1101,\n  az_AZ: 2092,\n  ba_RU: 1133,\n  be_BY: 1059,\n  bg_BG: 1026,\n  bn_IN: 1093,\n  bo_BT: 2129,\n  bo_CN: 1105,\n  br_FR: 1150,\n  bs_BA: 8218,\n  ca_ES: 1027,\n  co_FR: 1155,\n  cs_CZ: 1029,\n  cy_GB: 1106,\n  da_DK: 1030,\n  de_AT: 3079,\n  de_CH: 2055,\n  de_DE: 1031,\n  de_LI: 5127,\n  de_LU: 4103,\n  div_MV: 1125,\n  dsb_DE: 2094,\n  el_GR: 1032,\n  en_AU: 3081,\n  en_BZ: 10249,\n  en_CA: 4105,\n  en_CB: 9225,\n  en_GB: 2057,\n  en_IE: 6153,\n  en_IN: 18441,\n  en_JA: 8201,\n  en_MY: 17417,\n  en_NZ: 5129,\n  en_PH: 13321,\n  en_TT: 11273,\n  en_US: 1033,\n  en_ZA: 7177,\n  en_ZW: 12297,\n  es_AR: 11274,\n  es_BO: 16394,\n  es_CL: 13322,\n  es_CO: 9226,\n  es_CR: 5130,\n  es_DO: 7178,\n  es_EC: 12298,\n  es_ES: 3082,\n  es_GT: 4106,\n  es_HN: 18442,\n  es_MX: 2058,\n  es_NI: 19466,\n  es_PA: 6154,\n  es_PE: 10250,\n  es_PR: 20490,\n  es_PY: 15370,\n  es_SV: 17418,\n  es_UR: 14346,\n  es_US: 21514,\n  es_VE: 8202,\n  et_EE: 1061,\n  eu_ES: 1069,\n  fa_IR: 1065,\n  fi_FI: 1035,\n  fil_PH: 1124,\n  fo_FO: 1080,\n  fr_BE: 2060,\n  fr_CA: 3084,\n  fr_CH: 4108,\n  fr_FR: 1036,\n  fr_LU: 5132,\n  fr_MC: 6156,\n  fy_NL: 1122,\n  ga_IE: 2108,\n  gbz_AF: 1164,\n  gl_ES: 1110,\n  gsw_FR: 1156,\n  gu_IN: 1095,\n  ha_NG: 1128,\n  he_IL: 1037,\n  hi_IN: 1081,\n  hr_BA: 4122,\n  hr_HR: 1050,\n  hu_HU: 1038,\n  hy_AM: 1067,\n  id_ID: 1057,\n  ii_CN: 1144,\n  is_IS: 1039,\n  it_CH: 2064,\n  it_IT: 1040,\n  iu_CA: 2141,\n  ja_JP: 1041,\n  ka_GE: 1079,\n  kh_KH: 1107,\n  kk_KZ: 1087,\n  kl_GL: 1135,\n  kn_IN: 1099,\n  ko_KR: 1042,\n  kok_IN: 1111,\n  ky_KG: 1088,\n  lb_LU: 1134,\n  lo_LA: 1108,\n  lt_LT: 1063,\n  lv_LV: 1062,\n  mi_NZ: 1153,\n  mk_MK: 1071,\n  ml_IN: 1100,\n  mn_CN: 2128,\n  mn_MN: 1104,\n  moh_CA: 1148,\n  mr_IN: 1102,\n  ms_BN: 2110,\n  ms_MY: 1086,\n  mt_MT: 1082,\n  my_MM: 1109,\n  nb_NO: 1044,\n  ne_NP: 1121,\n  nl_BE: 2067,\n  nl_NL: 1043,\n  nn_NO: 2068,\n  ns_ZA: 1132,\n  oc_FR: 1154,\n  or_IN: 1096,\n  pa_IN: 1094,\n  pl_PL: 1045,\n  ps_AF: 1123,\n  pt_BR: 1046,\n  pt_PT: 2070,\n  qut_GT: 1158,\n  quz_BO: 1131,\n  quz_EC: 2155,\n  quz_PE: 3179,\n  rm_CH: 1047,\n  ro_RO: 1048,\n  ru_RU: 1049,\n  rw_RW: 1159,\n  sa_IN: 1103,\n  sah_RU: 1157,\n  se_FI: 3131,\n  se_NO: 1083,\n  se_SE: 2107,\n  si_LK: 1115,\n  sk_SK: 1051,\n  sl_SI: 1060,\n  sma_NO: 6203,\n  sma_SE: 7227,\n  smj_NO: 4155,\n  smj_SE: 5179,\n  smn_FI: 9275,\n  sms_FI: 8251,\n  sq_AL: 1052,\n  sr_BA: 7194,\n  sr_SP: 3098,\n  sv_FI: 2077,\n  sv_SE: 1053,\n  sw_KE: 1089,\n  syr_SY: 1114,\n  ta_IN: 1097,\n  te_IN: 1098,\n  tg_TJ: 1064,\n  th_TH: 1054,\n  tk_TM: 1090,\n  tmz_DZ: 2143,\n  tn_ZA: 1074,\n  tr_TR: 1055,\n  tt_RU: 1092,\n  ug_CN: 1152,\n  uk_UA: 1058,\n  ur_IN: 2080,\n  ur_PK: 1056,\n  uz_UZ: 2115,\n  vi_VN: 1066,\n  wen_DE: 1070,\n  wo_SN: 1160,\n  xh_ZA: 1076,\n  yo_NG: 1130,\n  zh_CHS: 4,\n  zh_CHT: 31748,\n  zh_CN: 2052,\n  zh_HK: 3076,\n  zh_MO: 5124,\n  zh_SG: 4100,\n  zh_TW: 1028,\n  zu_ZA: 1077\n}\n\n// noinspection SpellCheckingInspection\nexport const langIdToName = {\n  ab: \"Abkhaz\",\n  aa: \"Afar\",\n  af: \"Afrikaans\",\n  ak: \"Akan\",\n  sq: \"Albanian\",\n  am: \"Amharic\",\n  ar: \"Arabic\",\n  an: \"Aragonese\",\n  hy: \"Armenian\",\n  as: \"Assamese\",\n  av: \"Avaric\",\n  ae: \"Avestan\",\n  ay: \"Aymara\",\n  az: \"Azerbaijani\",\n  bm: \"Bambara\",\n  ba: \"Bashkir\",\n  eu: \"Basque\",\n  be: \"Belarusian\",\n  bn: \"Bengali\",\n  bh: \"Bihari\",\n  bi: \"Bislama\",\n  bs: \"Bosnian\",\n  br: \"Breton\",\n  bg: \"Bulgarian\",\n  my: \"Burmese\",\n  ca: \"Catalan\",\n  ch: \"Chamorro\",\n  ce: \"Chechen\",\n  ny: \"Chichewa\",\n  zh: \"Chinese\",\n  cv: \"Chuvash\",\n  kw: \"Cornish\",\n  co: \"Corsican\",\n  cr: \"Cree\",\n  hr: \"Croatian\",\n  cs: \"Czech\",\n  da: \"Danish\",\n  dv: \"Divehi\",\n  nl: \"Dutch\",\n  dz: \"Dzongkha\",\n  en: \"English\",\n  eo: \"Esperanto\",\n  et: \"Estonian\",\n  ee: \"Ewe\",\n  fo: \"Faroese\",\n  fj: \"Fijian\",\n  fi: \"Finnish\",\n  fr: \"French\",\n  ff: \"Fula\",\n  gl: \"Galician\",\n  ka: \"Georgian\",\n  de: \"German\",\n  el: \"Greek\",\n  gn: \"GuaranÃ­\",\n  gu: \"Gujarati\",\n  ht: \"Haitian\",\n  ha: \"Hausa\",\n  he: \"Hebrew\",\n  hz: \"Herero\",\n  hi: \"Hindi\",\n  ho: \"Hiri Motu\",\n  hu: \"Hungarian\",\n  ia: \"Interlingua\",\n  id: \"Indonesian\",\n  ie: \"Interlingue\",\n  ga: \"Irish\",\n  ig: \"Igbo\",\n  ik: \"Inupiaq\",\n  io: \"Ido\",\n  is: \"Icelandic\",\n  it: \"Italian\",\n  iu: \"Inuktitut\",\n  ja: \"Japanese\",\n  jv: \"Javanese\",\n  kl: \"Kalaallisut\",\n  kn: \"Kannada\",\n  kr: \"Kanuri\",\n  ks: \"Kashmiri\",\n  kk: \"Kazakh\",\n  km: \"Khmer\",\n  ki: \"Kikuyu\",\n  rw: \"Kinyarwanda\",\n  ky: \"Kyrgyz\",\n  kv: \"Komi\",\n  kg: \"Kongo\",\n  ko: \"Korean\",\n  ku: \"Kurdish\",\n  kj: \"Kwanyama\",\n  la: \"Latin\",\n  lb: \"Luxembourgish\",\n  lg: \"Ganda\",\n  li: \"Limburgish\",\n  ln: \"Lingala\",\n  lo: \"Lao\",\n  lt: \"Lithuanian\",\n  lu: \"Luba-Katanga\",\n  lv: \"Latvian\",\n  gv: \"Manx\",\n  mk: \"Macedonian\",\n  mg: \"Malagasy\",\n  ms: \"Malay\",\n  ml: \"Malayalam\",\n  mt: \"Maltese\",\n  mi: \"MÄ�ori\",\n  mr: \"Marathi\",\n  mh: \"Marshallese\",\n  mn: \"Mongolian\",\n  na: \"Nauru\",\n  nv: \"Navajo\",\n  nd: \"Northern Ndebele\",\n  ne: \"Nepali\",\n  ng: \"Ndonga\",\n  nb: \"Norwegian BokmÃ¥l\",\n  nn: \"Norwegian Nynorsk\",\n  no: \"Norwegian\",\n  ii: \"Nuosu\",\n  nr: \"Southern Ndebele\",\n  oc: \"Occitan\",\n  oj: \"Ojibwe\",\n  cu: \"Old Church Slavonic\",\n  om: \"Oromo\",\n  or: \"Oriya\",\n  os: \"Ossetian\",\n  pa: \"Panjabi\",\n  pi: \"PÄ�li\",\n  fa: \"Persian\",\n  pl: \"Polish\",\n  ps: \"Pashto\",\n  pt: \"Portuguese\",\n  qu: \"Quechua\",\n  rm: \"Romansh\",\n  rn: \"Kirundi\",\n  ro: \"Romanian\",\n  ru: \"Russian\",\n  sa: \"Sanskrit\",\n  sc: \"Sardinian\",\n  sd: \"Sindhi\",\n  se: \"Northern Sami\",\n  sm: \"Samoan\",\n  sg: \"Sango\",\n  sr: \"Serbian\",\n  gd: \"Gaelic\",\n  sn: \"Shona\",\n  si: \"Sinhala\",\n  sk: \"Slovak\",\n  sl: \"Slovene\",\n  so: \"Somali\",\n  st: \"Southern Sotho\",\n  es: \"Spanish\",\n  su: \"Sundanese\",\n  sw: \"Swahili\",\n  ss: \"Swati\",\n  sv: \"Swedish\",\n  ta: \"Tamil\",\n  te: \"Telugu\",\n  tg: \"Tajik\",\n  th: \"Thai\",\n  ti: \"Tigrinya\",\n  bo: \"Tibetan Standard\",\n  tk: \"Turkmen\",\n  tl: \"Tagalog\",\n  tn: \"Tswana\",\n  to: \"Tonga\",\n  tr: \"Turkish\",\n  ts: \"Tsonga\",\n  tt: \"Tatar\",\n  tw: \"Twi\",\n  ty: \"Tahitian\",\n  ug: \"Uyghur\",\n  uk: \"Ukrainian\",\n  ur: \"Urdu\",\n  uz: \"Uzbek\",\n  ve: \"Venda\",\n  vi: \"Vietnamese\",\n  vo: \"VolapÃ¼k\",\n  wa: \"Walloon\",\n  cy: \"Welsh\",\n  wo: \"Wolof\",\n  fy: \"Western Frisian\",\n  xh: \"Xhosa\",\n  yi: \"Yiddish\",\n  yo: \"Yoruba\",\n  za: \"Zhuang\",\n  zu: \"Zulu\"\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getLicenseAssets = getLicenseAssets;
exports.getNotLocalizedLicenseFile = getNotLocalizedLicenseFile;
exports.getLicenseFiles = getLicenseFiles;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _langs() {
  const data = require("./langs");

  _langs = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function getLicenseAssets(fileNames, packager) {
  return fileNames.sort((a, b) => {
    const aW = a.includes("_en") ? 0 : 100;
    const bW = b.includes("_en") ? 0 : 100;
    return aW === bW ? a.localeCompare(b) : aW - bW;
  }).map(file => {
    let lang = file.match(/_([^.]+)\./)[1];
    let langWithRegion;

    if (lang.includes("_")) {
      langWithRegion = lang;
      lang = langWithRegion.substring(0, lang.indexOf("_"));
    } else {
      lang = lang.toLowerCase();
      langWithRegion = (0, _langs().toLangWithRegion)(lang);
    }

    return {
      file: path.join(packager.buildResourcesDir, file),
      lang,
      langWithRegion,
      langName: _langs().langIdToName[lang]
    };
  });
}

function getNotLocalizedLicenseFile(_x, _x2) {
  return _getNotLocalizedLicenseFile.apply(this, arguments);
}

function _getNotLocalizedLicenseFile() {
  _getNotLocalizedLicenseFile = (0, _bluebirdLst().coroutine)(function* (custom, packager, supportedExtension = ["rtf", "txt", "html"]) {
    const possibleFiles = [];

    for (const name of ["license", "eula"]) {
      for (const ext of supportedExtension) {
        possibleFiles.push(`${name}.${ext}`);
        possibleFiles.push(`${name.toUpperCase()}.${ext}`);
        possibleFiles.push(`${name}.${ext.toUpperCase()}`);
        possibleFiles.push(`${name.toUpperCase()}.${ext.toUpperCase()}`);
      }
    }

    return yield packager.getResource(custom, ...possibleFiles);
  });
  return _getNotLocalizedLicenseFile.apply(this, arguments);
}

function getLicenseFiles(_x3) {
  return _getLicenseFiles.apply(this, arguments);
} function _getLicenseFiles() {
  _getLicenseFiles = (0, _bluebirdLst().coroutine)(function* (packager) {
    return getLicenseAssets((yield packager.resourceList).filter(it => {
      const name = it.toLowerCase();
      return (name.startsWith("license_") || name.startsWith("eula_")) && (name.endsWith(".rtf") || name.endsWith(".txt"));
    }), packager);
  });
  return _getLicenseFiles.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=license.js.map{"version":3,"sources":["../../src/util/license.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAGM,SAAU,gBAAV,CAA2B,SAA3B,EAAqD,QAArD,EAAoF;AACxF,SAAO,SAAS,CAAC,IAAV,CAAe,CAAC,CAAD,EAAI,CAAJ,KAAS;AAC7B,UAAM,EAAE,GAAG,CAAC,CAAC,QAAF,CAAW,KAAX,IAAoB,CAApB,GAAwB,GAAnC;AACA,UAAM,EAAE,GAAG,CAAC,CAAC,QAAF,CAAW,KAAX,IAAoB,CAApB,GAAwB,GAAnC;AACA,WAAO,EAAE,KAAK,EAAP,GAAY,CAAC,CAAC,aAAF,CAAgB,CAAhB,CAAZ,GAAiC,EAAE,GAAG,EAA7C;AACD,GAJM,EAKJ,GALI,CAKA,IAAI,IAAG;AACV,QAAI,IAAI,GAAG,IAAI,CAAC,KAAL,CAAW,YAAX,EAA0B,CAA1B,CAAX;AACA,QAAI,cAAJ;;AACA,QAAI,IAAI,CAAC,QAAL,CAAc,GAAd,CAAJ,EAAwB;AACtB,MAAA,cAAc,GAAG,IAAjB;AACA,MAAA,IAAI,GAAG,cAAc,CAAC,SAAf,CAAyB,CAAzB,EAA4B,IAAI,CAAC,OAAL,CAAa,GAAb,CAA5B,CAAP;AACD,KAHD,MAIK;AACH,MAAA,IAAI,GAAG,IAAI,CAAC,WAAL,EAAP;AACA,MAAA,cAAc,GAAG,+BAAiB,IAAjB,CAAjB;AACD;;AACD,WAAO;AAAC,MAAA,IAAI,EAAE,IAAI,CAAC,IAAL,CAAU,QAAQ,CAAC,iBAAnB,EAAsC,IAAtC,CAAP;AAAoD,MAAA,IAApD;AAA0D,MAAA,cAA1D;AAA0E,MAAA,QAAQ,EAAG,sBAAqB,IAArB;AAArF,KAAP;AACD,GAjBI,CAAP;AAkBD;;SAEqB,0B;;;;;8DAAf,WAA0C,MAA1C,EAA6E,QAA7E,EAA8G,kBAAA,GAAoC,CAAC,KAAD,EAAQ,KAAR,EAAe,MAAf,CAAlJ,EAAwK;AAC7K,UAAM,aAAa,GAAkB,EAArC;;AACA,SAAK,MAAM,IAAX,IAAmB,CAAC,SAAD,EAAY,MAAZ,CAAnB,EAAwC;AACtC,WAAK,MAAM,GAAX,IAAkB,kBAAlB,EAAsC;AACpC,QAAA,aAAa,CAAC,IAAd,CAAmB,GAAG,IAAI,IAAI,GAAG,EAAjC;AACA,QAAA,aAAa,CAAC,IAAd,CAAmB,GAAG,IAAI,CAAC,WAAL,EAAkB,IAAI,GAAG,EAA/C;AACA,QAAA,aAAa,CAAC,IAAd,CAAmB,GAAG,IAAI,IAAI,GAAG,CAAC,WAAJ,EAAiB,EAA/C;AACA,QAAA,aAAa,CAAC,IAAd,CAAmB,GAAG,IAAI,CAAC,WAAL,EAAkB,IAAI,GAAG,CAAC,WAAJ,EAAiB,EAA7D;AACD;AACF;;AAED,iBAAa,QAAQ,CAAC,WAAT,CAAqB,MAArB,EAA6B,GAAG,aAAhC,CAAb;AACD,G;;;;SAEqB,e;;;;;;mDAAf,WAA+B,QAA/B,EAA8D;AACnE,WAAO,gBAAgB,CAAC,OAAO,QAAQ,CAAC,YAAhB,EACrB,MADqB,CACd,EAAE,IAAG;AACX,YAAM,IAAI,GAAG,EAAE,CAAC,WAAH,EAAb;AACA,aAAO,CAAC,IAAI,CAAC,UAAL,CAAgB,UAAhB,KAA+B,IAAI,CAAC,UAAL,CAAgB,OAAhB,CAAhC,MAA8D,IAAI,CAAC,QAAL,CAAc,MAAd,KAAyB,IAAI,CAAC,QAAL,CAAc,MAAd,CAAvF,CAAP;AACD,KAJqB,CAAD,EAIjB,QAJiB,CAAvB;AAKD,G","sourcesContent":["import * as path from \"path\"\nimport { langIdToName, toLangWithRegion } from \"./langs\"\nimport { PlatformPackager } from \"../platformPackager\"\n\nexport function getLicenseAssets(fileNames: Array<string>, packager: PlatformPackager<any>) {\n  return fileNames.sort((a, b) => {\n    const aW = a.includes(\"_en\") ? 0 : 100\n    const bW = b.includes(\"_en\") ? 0 : 100\n    return aW === bW ? a.localeCompare(b) : aW - bW\n  })\n    .map(file => {\n      let lang = file.match(/_([^.]+)\\./)![1]\n      let langWithRegion\n      if (lang.includes(\"_\")) {\n        langWithRegion = lang\n        lang = langWithRegion.substring(0, lang.indexOf(\"_\"))\n      }\n      else {\n        lang = lang.toLowerCase()\n        langWithRegion = toLangWithRegion(lang)\n      }\n      return {file: path.join(packager.buildResourcesDir, file), lang, langWithRegion, langName: (langIdToName as any)[lang]}\n    })\n}\n\nexport async function getNotLocalizedLicenseFile(custom: string | null | undefined, packager: PlatformPackager<any>, supportedExtension: Array<string> = [\"rtf\", \"txt\", \"html\"]): Promise<string | null> {\n  const possibleFiles: Array<string> = []\n  for (const name of [\"license\", \"eula\"]) {\n    for (const ext of supportedExtension) {\n      possibleFiles.push(`${name}.${ext}`)\n      possibleFiles.push(`${name.toUpperCase()}.${ext}`)\n      possibleFiles.push(`${name}.${ext.toUpperCase()}`)\n      possibleFiles.push(`${name.toUpperCase()}.${ext.toUpperCase()}`)\n    }\n  }\n\n  return await packager.getResource(custom, ...possibleFiles)\n}\n\nexport async function getLicenseFiles(packager: PlatformPackager<any>): Promise<Array<LicenseFile>> {\n  return getLicenseAssets((await packager.resourceList)\n    .filter(it => {\n      const name = it.toLowerCase()\n      return (name.startsWith(\"license_\") || name.startsWith(\"eula_\")) && (name.endsWith(\".rtf\") || name.endsWith(\".txt\"))\n    }), packager)\n}\n\nexport interface LicenseFile {\n  file: string\n  lang: string\n  langWithRegion: string\n  langName: string\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getMacOsVersion = getMacOsVersion;
exports.isMacOsSierra = isMacOsSierra;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

function semver() {
  const data = _interopRequireWildcard(require("semver"));

  semver = function () {
    return data;
  };

  return data;
}

function _log() {
  const data = require("builder-util/out/log");

  _log = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const macOsVersion = new (_lazyVal().Lazy)(
/*#__PURE__*/
(0, _bluebirdLst().coroutine)(function* () {
  const file = yield (0, _fsExtraP().readFile)("/System/Library/CoreServices/SystemVersion.plist", "utf8");
  const matches = /<key>ProductVersion<\/key>[\s\S]*<string>([\d.]+)<\/string>/.exec(file);

  if (!matches) {
    throw new Error("Couldn't find the macOS version");
  }

  _log().log.debug({
    version: matches[1]
  }, "macOS version");

  return clean(matches[1]);
}));

function clean(version) {
  return version.split(".").length === 2 ? `${version}.0` : version;
}

function isOsVersionGreaterThanOrEqualTo(_x) {
  return _isOsVersionGreaterThanOrEqualTo.apply(this, arguments);
}

function _isOsVersionGreaterThanOrEqualTo() {
  _isOsVersionGreaterThanOrEqualTo = (0, _bluebirdLst().coroutine)(function* (input) {
    return semver().gte((yield macOsVersion.value), clean(input));
  });
  return _isOsVersionGreaterThanOrEqualTo.apply(this, arguments);
}

function getMacOsVersion() {
  return macOsVersion.value;
}

function isMacOsSierra() {
  return _isMacOsSierra.apply(this, arguments);
} function _isMacOsSierra() {
  _isMacOsSierra = (0, _bluebirdLst().coroutine)(function* () {
    return process.platform === "darwin" && (yield isOsVersionGreaterThanOrEqualTo("10.12.0"));
  });
  return _isMacOsSierra.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=macosVersion.js.map{"version":3,"sources":["../../src/util/macosVersion.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEA,MAAM,YAAY,GAAG,KAAI,eAAJ;AAAA;AAAA,8BAAiB,aAAW;AAC/C,QAAM,IAAI,SAAS,0BAAS,kDAAT,EAA6D,MAA7D,CAAnB;AACA,QAAM,OAAO,GAAG,8DAA8D,IAA9D,CAAmE,IAAnE,CAAhB;;AACA,MAAI,CAAC,OAAL,EAAc;AACZ,UAAM,IAAI,KAAJ,CAAU,iCAAV,CAAN;AACD;;AACD,aAAI,KAAJ,CAAU;AAAC,IAAA,OAAO,EAAE,OAAO,CAAC,CAAD;AAAjB,GAAV,EAAiC,eAAjC;;AACA,SAAO,KAAK,CAAC,OAAO,CAAC,CAAD,CAAR,CAAZ;AACD,CARoB,EAArB;;AAUA,SAAS,KAAT,CAAe,OAAf,EAA8B;AAC5B,SAAO,OAAO,CAAC,KAAR,CAAc,GAAd,EAAmB,MAAnB,KAA8B,CAA9B,GAAkC,GAAG,OAAO,IAA5C,GAAmD,OAA1D;AACD;;SAEc,+B;;;;;mEAAf,WAA+C,KAA/C,EAA4D;AAC1D,WAAO,MAAM,GAAC,GAAP,QAAiB,YAAY,CAAC,KAA9B,GAAqC,KAAK,CAAC,KAAD,CAA1C,CAAP;AACD,G;;;;AAEK,SAAU,eAAV,GAAyB;AAC7B,SAAO,YAAY,CAAC,KAApB;AACD;;SAEqB,a;;;;;;iDAAf,aAA4B;AACjC,WAAO,OAAO,CAAC,QAAR,KAAqB,QAArB,WAAuC,+BAA+B,CAAC,SAAD,CAAtE,CAAP;AACD,G","sourcesContent":["import { readFile } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as semver from \"semver\"\nimport { log } from \"builder-util/out/log\"\n\nconst macOsVersion = new Lazy<string>(async () => {\n  const file = await readFile(\"/System/Library/CoreServices/SystemVersion.plist\", \"utf8\")\n  const matches = /<key>ProductVersion<\\/key>[\\s\\S]*<string>([\\d.]+)<\\/string>/.exec(file)\n  if (!matches) {\n    throw new Error(\"Couldn't find the macOS version\")\n  }\n  log.debug({version: matches[1]}, \"macOS version\")\n  return clean(matches[1])\n})\n\nfunction clean(version: string) {\n  return version.split(\".\").length === 2 ? `${version}.0` : version\n}\n\nasync function isOsVersionGreaterThanOrEqualTo(input: string) {\n  return semver.gte(await macOsVersion.value, clean(input))\n}\n\nexport function getMacOsVersion() {\n  return macOsVersion.value\n}\n\nexport async function isMacOsSierra() {\n  return process.platform === \"darwin\" && await isOsVersionGreaterThanOrEqualTo(\"10.12.0\")\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.expandMacro = expandMacro;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function expandMacro(pattern, arch, appInfo, extra = {}, isProductNameSanitized = true) {
  if (arch == null) {
    pattern = pattern // tslint:disable-next-line:no-invalid-template-strings
    .replace("-${arch}", "") // tslint:disable-next-line:no-invalid-template-strings
    .replace(" ${arch}", "") // tslint:disable-next-line:no-invalid-template-strings
    .replace("_${arch}", "") // tslint:disable-next-line:no-invalid-template-strings
    .replace("/${arch}", "");
  }

  return pattern.replace(/\${([_a-zA-Z./*]+)}/g, (match, p1) => {
    switch (p1) {
      case "productName":
        return isProductNameSanitized ? appInfo.productFilename : appInfo.productName;

      case "arch":
        if (arch == null) {
          // see above, we remove macro if no arch
          return "";
        }

        return arch;

      case "author":
        const companyName = appInfo.companyName;

        if (companyName == null) {
          throw new (_builderUtil().InvalidConfigurationError)(`cannot expand pattern "${pattern}": author is not specified`, "ERR_ELECTRON_BUILDER_AUTHOR_UNSPECIFIED");
        }

        return companyName;

      case "platform":
        return process.platform;

      case "channel":
        return appInfo.channel || "latest";

      default:
        if (p1 in appInfo) {
          return appInfo[p1];
        }

        if (p1.startsWith("env.")) {
          const envName = p1.substring("env.".length);
          const envValue = process.env[envName];

          if (envValue == null) {
            throw new (_builderUtil().InvalidConfigurationError)(`cannot expand pattern "${pattern}": env ${envName} is not defined`, "ERR_ELECTRON_BUILDER_ENV_NOT_DEFINED");
          }

          return envValue;
        }

        const value = extra[p1];

        if (value == null) {
          throw new (_builderUtil().InvalidConfigurationError)(`cannot expand pattern "${pattern}": macro ${p1} is not defined`, "ERR_ELECTRON_BUILDER_MACRO_NOT_DEFINED");
        } else {
          return value;
        }

    }
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=macroExpander.js.map{"version":3,"sources":["../../src/util/macroExpander.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGM,SAAU,WAAV,CAAsB,OAAtB,EAAuC,IAAvC,EAAwE,OAAxE,EAA0F,KAAA,GAAa,EAAvG,EAA2G,sBAAsB,GAAG,IAApI,EAAwI;AAC5I,MAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB,IAAA,OAAO,GAAG,OAAO,CACjB;AADiB,KAEd,OAFO,CAEC,UAFD,EAEa,EAFb,EAGR;AAHQ,KAIP,OAJO,CAIC,UAJD,EAIa,EAJb,EAKR;AALQ,KAMP,OANO,CAMC,UAND,EAMa,EANb,EAOR;AAPQ,KAQP,OARO,CAQC,UARD,EAQa,EARb,CAAV;AASD;;AAED,SAAO,OAAO,CAAC,OAAR,CAAgB,sBAAhB,EAAwC,CAAC,KAAD,EAAQ,EAAR,KAAsB;AACnE,YAAQ,EAAR;AACE,WAAK,aAAL;AACE,eAAO,sBAAsB,GAAG,OAAO,CAAC,eAAX,GAA6B,OAAO,CAAC,WAAlE;;AAEF,WAAK,MAAL;AACE,YAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB;AACA,iBAAO,EAAP;AACD;;AACD,eAAO,IAAP;;AAEF,WAAK,QAAL;AACE,cAAM,WAAW,GAAG,OAAO,CAAC,WAA5B;;AACA,YAAI,WAAW,IAAI,IAAnB,EAAyB;AACvB,gBAAM,KAAI,wCAAJ,EAA8B,0BAA0B,OAAO,4BAA/D,EAA6F,yCAA7F,CAAN;AACD;;AACD,eAAO,WAAP;;AAEF,WAAK,UAAL;AACE,eAAO,OAAO,CAAC,QAAf;;AAEF,WAAK,SAAL;AACE,eAAO,OAAO,CAAC,OAAR,IAAmB,QAA1B;;AAEF;AACE,YAAI,EAAE,IAAI,OAAV,EAAmB;AACjB,iBAAQ,OAAe,CAAC,EAAD,CAAvB;AACD;;AAED,YAAI,EAAE,CAAC,UAAH,CAAc,MAAd,CAAJ,EAA2B;AACzB,gBAAM,OAAO,GAAG,EAAE,CAAC,SAAH,CAAa,OAAO,MAApB,CAAhB;AACA,gBAAM,QAAQ,GAAG,OAAO,CAAC,GAAR,CAAY,OAAZ,CAAjB;;AACA,cAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,kBAAM,KAAI,wCAAJ,EAA8B,0BAA0B,OAAO,UAAU,OAAO,iBAAhF,EAAmG,sCAAnG,CAAN;AACD;;AACD,iBAAO,QAAP;AACD;;AAED,cAAM,KAAK,GAAG,KAAK,CAAC,EAAD,CAAnB;;AACA,YAAI,KAAK,IAAI,IAAb,EAAmB;AACjB,gBAAM,KAAI,wCAAJ,EAA8B,0BAA0B,OAAO,YAAY,EAAE,iBAA7E,EAAgG,wCAAhG,CAAN;AACD,SAFD,MAGK;AACH,iBAAO,KAAP;AACD;;AA5CL;AA8CD,GA/CM,CAAP;AAgDD,C","sourcesContent":["import { InvalidConfigurationError } from \"builder-util\"\nimport { AppInfo } from \"../appInfo\"\n\nexport function expandMacro(pattern: string, arch: string | null | undefined, appInfo: AppInfo, extra: any = {}, isProductNameSanitized = true): string {\n  if (arch == null) {\n    pattern = pattern\n    // tslint:disable-next-line:no-invalid-template-strings\n      .replace(\"-${arch}\", \"\")\n      // tslint:disable-next-line:no-invalid-template-strings\n      .replace(\" ${arch}\", \"\")\n      // tslint:disable-next-line:no-invalid-template-strings\n      .replace(\"_${arch}\", \"\")\n      // tslint:disable-next-line:no-invalid-template-strings\n      .replace(\"/${arch}\", \"\")\n  }\n\n  return pattern.replace(/\\${([_a-zA-Z./*]+)}/g, (match, p1): string => {\n    switch (p1) {\n      case \"productName\":\n        return isProductNameSanitized ? appInfo.productFilename : appInfo.productName\n\n      case \"arch\":\n        if (arch == null) {\n          // see above, we remove macro if no arch\n          return \"\"\n        }\n        return arch\n\n      case \"author\":\n        const companyName = appInfo.companyName\n        if (companyName == null) {\n          throw new InvalidConfigurationError(`cannot expand pattern \"${pattern}\": author is not specified`, \"ERR_ELECTRON_BUILDER_AUTHOR_UNSPECIFIED\")\n        }\n        return companyName\n\n      case \"platform\":\n        return process.platform\n\n      case \"channel\":\n        return appInfo.channel || \"latest\"\n\n      default:\n        if (p1 in appInfo) {\n          return (appInfo as any)[p1]\n        }\n\n        if (p1.startsWith(\"env.\")) {\n          const envName = p1.substring(\"env.\".length)\n          const envValue = process.env[envName]\n          if (envValue == null) {\n            throw new InvalidConfigurationError(`cannot expand pattern \"${pattern}\": env ${envName} is not defined`, \"ERR_ELECTRON_BUILDER_ENV_NOT_DEFINED\")\n          }\n          return envValue\n        }\n\n        const value = extra[p1]\n        if (value == null) {\n          throw new InvalidConfigurationError(`cannot expand pattern \"${pattern}\": macro ${p1} is not defined`, \"ERR_ELECTRON_BUILDER_MACRO_NOT_DEFINED\")\n        }\n        else {\n          return value\n        }\n    }\n  })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createLazyProductionDeps = createLazyProductionDeps;
exports.getProductionDependencies = getProductionDependencies;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

// noinspection SpellCheckingInspection
const knownAlwaysIgnoredDevDeps = new Set(["electron-builder-tslint-config", "electron-download", "libui-download", "electron-forge", "electron-packager", "electron-compilers", "prebuild-install", "nan", "electron-webpack", "electron-webpack-ts", "electron-webpack-vue", "@types"]); // noinspection JSUnusedGlobalSymbols

function createLazyProductionDeps(projectDir) {
  return new (_lazyVal().Lazy)(() => getProductionDependencies(projectDir));
}
/** @internal */


function getProductionDependencies(_x) {
  return _getProductionDependencies.apply(this, arguments);
}

function _getProductionDependencies() {
  _getProductionDependencies = (0, _bluebirdLst().coroutine)(function* (folder) {
    const result = [];
    computeSortedPaths((yield new Collector().collect(folder)), result, false);
    return result;
  });
  return _getProductionDependencies.apply(this, arguments);
}

const ignoredProperties = new Set(["description", "author", "bugs", "engines", "repository", "build", "main", "license", "homepage", "scripts", "maintainers", "contributors", "keywords", "devDependencies", "files", "typings", "types", "xo", "resolutions"]);

function readJson(file) {
  return (0, _fsExtraP().readFile)(file, "utf-8").then(it => JSON.parse(it, (key, value) => ignoredProperties.has(key) ? undefined : value));
}

function computeSortedPaths(parent, result, isExtraneous) {
  const dependencies = parent.dependencies;

  if (dependencies == null) {
    return;
  }

  for (const dep of dependencies.values()) {
    if (dep.extraneous === isExtraneous) {
      result.push(dep);
      computeSortedPaths(dep, result, isExtraneous);
    }
  }
}

class Collector {
  constructor() {
    this.pathToMetadata = new Map();
    this.unresolved = new Map();
  }

  collect(dir) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const rootDependency = yield readJson(path.join(dir, "package.json"));
      yield _this.readInstalled(path.join(dir, "node_modules"), rootDependency, rootDependency.name);

      _this.unmarkExtraneous(rootDependency);

      if (_this.unresolved.size > 0) {
        _builderUtil().log.debug({
          unresolved: Array.from(_this.unresolved.keys()).join(", ")
        }, "unresolved dependencies after first round");

        yield _this.resolveUnresolvedHoisted(rootDependency, dir);
      }

      return rootDependency;
    })();
  }

  resolveUnresolvedHoisted(rootDependency, dir) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      let nameToMetadata = rootDependency.dependencies;

      if (nameToMetadata == null) {
        rootDependency.dependencies = new Map();
        nameToMetadata = rootDependency.dependencies;
      }

      let parentDir = dir;

      do {
        parentDir = path.dirname(parentDir);

        if (parentDir === "" || parentDir.endsWith("/") || parentDir.endsWith("\\")) {
          // https://github.com/electron-userland/electron-builder/issues/2220
          const list = Array.from(_this2.unresolved.keys()).filter(it => !_this2.unresolved.get(it));

          if (list.length === 1 && list[0] === "proton-native") {
            // resolve in tests
            parentDir = process.cwd();
          } else {
            if (list.length !== 0) {
              const message = `Unresolved node modules: ${list.join(", ")}`;

              if ((0, _builderUtil().isEnvTrue)(process.env.ELECTRON_BUILDER_ALLOW_UNRESOLVED_DEPENDENCIES)) {
                _builderUtil().log.warn(message);
              } else {
                throw new Error(message);
              }
            }

            break;
          }
        }

        const parentNodeModulesDir = parentDir + path.sep + "node_modules";
        const dirStat = yield (0, _fs().statOrNull)(parentNodeModulesDir);

        if (dirStat == null || !dirStat.isDirectory()) {
          if (dirStat == null || !dirStat.isDirectory()) {
            continue;
          }
        } // https://github.com/electron-userland/electron-builder/issues/2222#issuecomment-339060335
        // step 1: resolve current unresolved
        // step n: try to resolve new unresolved in the same parent dir until at least something is resolved in the dir


        while (true) {
          const unresolved = Array.from(_this2.unresolved.keys());

          _this2.unresolved.clear();

          const resolved = yield _bluebirdLst().default.map(unresolved, it => {
            return _this2.readChildPackage(it, parentNodeModulesDir, rootDependency).catch(e => {
              if (e.code === "ENOENT") {
                return null;
              } else {
                throw e;
              }
            });
          }, _fs().CONCURRENCY);
          let hasResolved = false;

          for (const dep of resolved) {
            if (dep != null) {
              hasResolved = true;

              _this2.unmarkExtraneous(dep);

              nameToMetadata.set(dep.realName, dep);
            }
          }

          if (!hasResolved) {
            break;
          }

          _this2.unmarkExtraneous(rootDependency);

          if (_this2.unresolved.size === 0) {
            return;
          }
        }
      } while (_this2.unresolved.size > 0);
    })();
  }

  readInstalled(nodeModulesDir, dependency, name) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      dependency.realName = name;
      dependency.directDependencyNames = dependency.dependencies == null ? null : Object.keys(dependency.dependencies); // mark as extraneous at this point.
      // this will be un-marked in unmarkExtraneous, where we mark as not-extraneous everything that is required in some way from the root object.

      dependency.extraneous = true;
      dependency.optional = true;

      if (dependency.dependencies == null && dependency.optionalDependencies == null) {
        // package has only dev or peer dependencies - no need to check child node_module
        dependency.dependencies = null;
        return;
      }

      const childModules = yield readNodeModulesDir(nodeModulesDir);

      if (childModules == null) {
        dependency.dependencies = null;
        return;
      }

      const deps = yield _bluebirdLst().default.map(childModules, it => _this3.readChildPackage(it, nodeModulesDir, dependency), _fs().CONCURRENCY);

      if (deps.length === 0) {
        dependency.dependencies = null;
        return;
      }

      const nameToMetadata = new Map();

      for (const dep of deps) {
        if (dep != null) {
          nameToMetadata.set(dep.realName, dep);
        }
      }

      dependency.dependencies = nameToMetadata;
    })();
  }

  readChildPackage(name, nodeModulesDir, parent) {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const rawDir = path.join(nodeModulesDir, name);
      let dir = rawDir;
      const stat = yield (0, _fsExtraP().lstat)(dir);
      const isSymbolicLink = stat.isSymbolicLink();

      if (isSymbolicLink) {
        dir = yield (0, _promise().orNullIfFileNotExist)((0, _fsExtraP().realpath)(dir));

        if (dir == null) {
          _builderUtil().log.debug({
            path: rawDir
          }, "broken symlink");

          return null;
        }
      }

      const processed = _this4.pathToMetadata.get(dir);

      if (processed != null) {
        return processed;
      }

      const metadata = yield (0, _promise().orNullIfFileNotExist)(readJson(path.join(dir, "package.json")));

      if (metadata == null) {
        return null;
      }

      if (isSymbolicLink) {
        metadata.link = dir;
        metadata.stat = stat;
      } else {
        metadata.parent = parent; // overwrite if already set by project package.json

        metadata.link = undefined;
      }

      metadata.path = rawDir; // do not add root project to result

      _this4.pathToMetadata.set(dir, metadata);

      yield _this4.readInstalled(dir + path.sep + "node_modules", metadata, name);
      return metadata;
    })();
  }

  unmark(deps, obj, unsetOptional, isOptional) {
    for (const name of deps) {
      const dep = this.findDep(obj, name, isOptional);

      if (dep != null) {
        if (unsetOptional) {
          dep.optional = false;
        }

        if (dep.extraneous) {
          this.unmarkExtraneous(dep);
        }
      }
    }
  }

  unmarkExtraneous(obj) {
    // Mark all non-required deps as extraneous.
    // start from the root object and mark as non-extraneous all modules
    // that haven't been previously flagged as extraneous then propagate to all their dependencies
    obj.extraneous = false;

    if (obj.directDependencyNames != null) {
      this.unmark(obj.directDependencyNames, obj, true, false);
    }

    if (obj.peerDependencies != null) {
      this.unmark(Object.keys(obj.peerDependencies), obj, true, false);
    }

    if (obj.optionalDependencies != null) {
      this.unmark(Object.keys(obj.optionalDependencies), obj, false, true);
    }
  } // find the one that will actually be loaded by require() so we can make sure it's valid


  findDep(obj, name, isOptional) {
    if (isIgnoredDep(name)) {
      return null;
    }

    let r = obj;
    let found = null;

    while (r != null && found == null) {
      // if r is a valid choice, then use that.
      // kinda weird if a pkg depends on itself, but after the first iteration of this loop, it indicates a dep cycle.
      found = r.dependencies == null ? null : r.dependencies.get(name);

      if (found == null && r.realName === name) {
        found = r;
      }

      r = r.link == null ? r.parent : null;
    }

    if (found == null) {
      this.unresolved.set(name, isOptional);
    }

    return found;
  }

}

function isIgnoredDep(name) {
  return knownAlwaysIgnoredDevDeps.has(name) || name.startsWith("@types/");
}

function readNodeModulesDir(_x2) {
  return _readNodeModulesDir.apply(this, arguments);
} function _readNodeModulesDir() {
  _readNodeModulesDir = (0, _bluebirdLst().coroutine)(function* (dir) {
    let files;

    try {
      files = (yield (0, _fsExtraP().readdir)(dir)).filter(it => !it.startsWith(".") && !knownAlwaysIgnoredDevDeps.has(it));
    } catch (e) {
      // error indicates that nothing is installed here
      return null;
    }

    files.sort();
    const scopes = files.filter(it => it.startsWith("@"));

    if (scopes.length === 0) {
      return files;
    }

    const result = files.filter(it => !it.startsWith("@"));
    const scopeFileList = yield _bluebirdLst().default.map(scopes, it => (0, _fsExtraP().readdir)(path.join(dir, it)));

    for (let i = 0; i < scopes.length; i++) {
      const list = scopeFileList[i];
      list.sort();

      for (const file of list) {
        if (!file.startsWith(".")) {
          result.push(`${scopes[i]}/${file}`);
        }
      }
    }

    return result;
  });
  return _readNodeModulesDir.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=packageDependencies.js.map{"version":3,"sources":["../../src/util/packageDependencies.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { isEnvTrue, log } from \"builder-util\"\nimport { CONCURRENCY, statOrNull } from \"builder-util/out/fs\"\nimport { orNullIfFileNotExist } from \"builder-util/out/promise\"\nimport { lstat, readdir, readFile, realpath, Stats } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\n\nexport interface Dependency {\n  name: string\n  version: string\n  path: string\n  extraneous: boolean\n  optional: boolean\n\n  dependencies: Map<string, Dependency> | null\n  directDependencyNames: Array<string> | null\n  peerDependencies: { [key: string]: any } | null\n  optionalDependencies: { [key: string]: any } | null\n\n  realName: string\n  link?: string\n\n  parent?: Dependency\n\n  // only if link\n  stat?: Stats\n}\n\n// noinspection SpellCheckingInspection\nconst knownAlwaysIgnoredDevDeps = new Set([\n  \"electron-builder-tslint-config\", \"electron-download\", \"libui-download\",\n  \"electron-forge\", \"electron-packager\", \"electron-compilers\",\n  \"prebuild-install\", \"nan\",\n  \"electron-webpack\", \"electron-webpack-ts\", \"electron-webpack-vue\",\n  \"@types\",\n])\n\n// noinspection JSUnusedGlobalSymbols\nexport function createLazyProductionDeps(projectDir: string) {\n  return new Lazy(() => getProductionDependencies(projectDir))\n}\n\n/** @internal */\nexport async function getProductionDependencies(folder: string): Promise<Array<Dependency>> {\n  const result: Array<Dependency> = []\n  computeSortedPaths(await new Collector().collect(folder), result, false)\n  return result\n}\n\nconst ignoredProperties = new Set([\"description\", \"author\", \"bugs\", \"engines\", \"repository\", \"build\", \"main\", \"license\", \"homepage\", \"scripts\", \"maintainers\", \"contributors\", \"keywords\", \"devDependencies\", \"files\", \"typings\", \"types\", \"xo\", \"resolutions\"])\n\nfunction readJson(file: string) {\n  return readFile(file, \"utf-8\")\n    .then(it => JSON.parse(it, (key, value) => ignoredProperties.has(key) ? undefined : value))\n}\n\nfunction computeSortedPaths(parent: Dependency, result: Array<Dependency>, isExtraneous: boolean) {\n  const dependencies = parent.dependencies\n  if (dependencies == null) {\n    return\n  }\n\n  for (const dep of dependencies.values()) {\n    if (dep.extraneous === isExtraneous) {\n      result.push(dep)\n      computeSortedPaths(dep, result, isExtraneous)\n    }\n  }\n}\n\nclass Collector {\n  readonly pathToMetadata = new Map<string, Dependency>()\n  private unresolved = new Map<string, boolean>()\n\n  async collect(dir: string) {\n    const rootDependency: Dependency = await readJson(path.join(dir, \"package.json\"))\n    await this.readInstalled(path.join(dir, \"node_modules\"), rootDependency, rootDependency.name)\n    this.unmarkExtraneous(rootDependency)\n\n    if (this.unresolved.size > 0) {\n      log.debug({unresolved: Array.from(this.unresolved.keys()).join(\", \")}, \"unresolved dependencies after first round\")\n      await this.resolveUnresolvedHoisted(rootDependency, dir)\n    }\n    return rootDependency\n  }\n\n  private async resolveUnresolvedHoisted(rootDependency: Dependency, dir: string): Promise<void> {\n    let nameToMetadata = rootDependency.dependencies\n    if (nameToMetadata == null) {\n      rootDependency.dependencies = new Map<string, Dependency>()\n      nameToMetadata = rootDependency.dependencies\n    }\n\n    let parentDir = dir\n    do {\n      parentDir = path.dirname(parentDir)\n      if (parentDir === \"\" || parentDir.endsWith(\"/\") || parentDir.endsWith(\"\\\\\")) {\n        // https://github.com/electron-userland/electron-builder/issues/2220\n        const list = Array.from(this.unresolved.keys()).filter(it => !this.unresolved.get(it))\n        if (list.length === 1 && list[0] === \"proton-native\") {\n          // resolve in tests\n          parentDir = process.cwd()\n        }\n        else {\n          if (list.length !== 0) {\n            const message = `Unresolved node modules: ${list.join(\", \")}`\n            if (isEnvTrue(process.env.ELECTRON_BUILDER_ALLOW_UNRESOLVED_DEPENDENCIES)) {\n              log.warn(message)\n            }\n            else {\n              throw new Error(message)\n            }\n          }\n          break\n        }\n      }\n\n      const parentNodeModulesDir = parentDir + path.sep + \"node_modules\"\n      const dirStat = await statOrNull(parentNodeModulesDir)\n      if (dirStat == null || !dirStat.isDirectory()) {\n        if (dirStat == null || !dirStat.isDirectory()) {\n          continue\n        }\n      }\n\n      // https://github.com/electron-userland/electron-builder/issues/2222#issuecomment-339060335\n      // step 1: resolve current unresolved\n      // step n: try to resolve new unresolved in the same parent dir until at least something is resolved in the dir\n      while (true) {\n        const unresolved = Array.from(this.unresolved.keys())\n        this.unresolved.clear()\n\n        const resolved = await BluebirdPromise.map(unresolved, it => {\n          return this.readChildPackage(it, parentNodeModulesDir, rootDependency)\n            .catch(e => {\n              if ((e as NodeJS.ErrnoException).code === \"ENOENT\") {\n                return null\n              }\n              else {\n                throw e\n              }\n            })\n        }, CONCURRENCY)\n\n        let hasResolved = false\n\n        for (const dep of resolved) {\n          if (dep != null) {\n            hasResolved = true\n            this.unmarkExtraneous(dep)\n            nameToMetadata.set(dep.realName, dep)\n          }\n        }\n\n        if (!hasResolved) {\n          break\n        }\n\n        this.unmarkExtraneous(rootDependency)\n\n        if (this.unresolved.size === 0) {\n          return\n        }\n      }\n    }\n    while (this.unresolved.size > 0)\n  }\n\n  private async readInstalled(nodeModulesDir: string, dependency: Dependency, name: string): Promise<void> {\n    dependency.realName = name\n    dependency.directDependencyNames = dependency.dependencies == null ? null : Object.keys(dependency.dependencies)\n\n    // mark as extraneous at this point.\n    // this will be un-marked in unmarkExtraneous, where we mark as not-extraneous everything that is required in some way from the root object.\n    dependency.extraneous = true\n    dependency.optional = true\n\n    if (dependency.dependencies == null && dependency.optionalDependencies == null) {\n      // package has only dev or peer dependencies - no need to check child node_module\n      dependency.dependencies = null\n      return\n    }\n\n    const childModules = await readNodeModulesDir(nodeModulesDir)\n    if (childModules == null) {\n      dependency.dependencies = null\n      return\n    }\n\n    const deps = await BluebirdPromise.map(childModules, it => this.readChildPackage(it, nodeModulesDir, dependency), CONCURRENCY)\n    if (deps.length === 0) {\n      dependency.dependencies = null\n      return\n    }\n\n    const nameToMetadata = new Map<string, Dependency>()\n    for (const dep of deps) {\n      if (dep != null) {\n        nameToMetadata.set(dep.realName, dep)\n      }\n    }\n    dependency.dependencies = nameToMetadata\n  }\n\n  private async readChildPackage(name: string, nodeModulesDir: string, parent: Dependency): Promise<Dependency | null> {\n    const rawDir = path.join(nodeModulesDir, name)\n    let dir: string | null = rawDir\n    const stat = await lstat(dir)\n    const isSymbolicLink = stat.isSymbolicLink()\n    if (isSymbolicLink) {\n      dir = await orNullIfFileNotExist(realpath(dir))\n      if (dir == null) {\n        log.debug({path: rawDir}, \"broken symlink\")\n        return null\n      }\n    }\n\n    const processed = this.pathToMetadata.get(dir)\n    if (processed != null) {\n      return processed\n    }\n\n    const metadata: Dependency = await orNullIfFileNotExist(readJson(path.join(dir, \"package.json\")))\n    if (metadata == null) {\n      return null\n    }\n\n    if (isSymbolicLink) {\n      metadata.link = dir\n      metadata.stat = stat\n    }\n    else {\n      metadata.parent = parent\n\n      // overwrite if already set by project package.json\n      metadata.link = undefined\n    }\n\n    metadata.path = rawDir\n\n    // do not add root project to result\n    this.pathToMetadata.set(dir, metadata)\n\n    await this.readInstalled(dir + path.sep + \"node_modules\", metadata, name)\n    return metadata\n  }\n\n  private unmark(deps: Iterable<string>, obj: Dependency, unsetOptional: boolean, isOptional: boolean) {\n    for (const name of deps) {\n      const dep = this.findDep(obj, name, isOptional)\n      if (dep != null) {\n        if (unsetOptional) {\n          dep.optional = false\n        }\n        if (dep.extraneous) {\n          this.unmarkExtraneous(dep)\n        }\n      }\n    }\n  }\n\n  private unmarkExtraneous(obj: Dependency) {\n    // Mark all non-required deps as extraneous.\n    // start from the root object and mark as non-extraneous all modules\n    // that haven't been previously flagged as extraneous then propagate to all their dependencies\n\n    obj.extraneous = false\n\n    if (obj.directDependencyNames != null) {\n      this.unmark(obj.directDependencyNames, obj, true, false)\n    }\n\n    if (obj.peerDependencies != null) {\n      this.unmark(Object.keys(obj.peerDependencies), obj, true, false)\n    }\n\n    if (obj.optionalDependencies != null) {\n      this.unmark(Object.keys(obj.optionalDependencies), obj, false, true)\n    }\n  }\n\n  // find the one that will actually be loaded by require() so we can make sure it's valid\n  private findDep(obj: Dependency, name: string, isOptional: boolean) {\n    if (isIgnoredDep(name)) {\n      return null\n    }\n\n    let r: Dependency | null | undefined = obj\n    let found = null\n    while (r != null && found == null) {\n      // if r is a valid choice, then use that.\n      // kinda weird if a pkg depends on itself, but after the first iteration of this loop, it indicates a dep cycle.\n      found = r.dependencies == null ? null : r.dependencies.get(name)\n      if (found == null && r.realName === name) {\n        found = r\n      }\n      r = r.link == null ? r.parent : null\n    }\n\n    if (found == null) {\n      this.unresolved.set(name, isOptional)\n    }\n    return found\n  }\n}\n\nfunction isIgnoredDep(name: string) {\n  return knownAlwaysIgnoredDevDeps.has(name) || name.startsWith(\"@types/\")\n}\n\nasync function readNodeModulesDir(dir: string): Promise<Array<string> | null> {\n  let files: Array<string>\n  try {\n    files = (await readdir(dir)).filter(it => !it.startsWith(\".\") && !knownAlwaysIgnoredDevDeps.has(it))\n  }\n  catch (e) {\n    // error indicates that nothing is installed here\n    return null\n  }\n\n  files.sort()\n\n  const scopes = files.filter(it => it.startsWith(\"@\"))\n  if (scopes.length === 0) {\n    return files\n  }\n\n  const result = files.filter(it => !it.startsWith(\"@\"))\n  const scopeFileList = await BluebirdPromise.map(scopes, it => readdir(path.join(dir, it)))\n  for (let i = 0; i < scopes.length; i++) {\n    const list = scopeFileList[i]\n    list.sort()\n    for (const file of list) {\n      if (!file.startsWith(\".\")) {\n        result.push(`${scopes[i]}/${file}`)\n      }\n    }\n  }\n\n  return result\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.readPackageJson = readPackageJson;
exports.checkMetadata = checkMetadata;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function semver() {
  const data = _interopRequireWildcard(require("semver"));

  semver = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const normalizeData = require("normalize-package-data");
/** @internal */


function readPackageJson(_x) {
  return _readPackageJson.apply(this, arguments);
}

function _readPackageJson() {
  _readPackageJson = (0, _bluebirdLst().coroutine)(function* (file) {
    const data = yield (0, _fsExtraP().readJson)(file);
    yield authors(file, data);
    normalizeData(data); // remove not required fields because can be used for remote build

    delete data.scripts;
    delete data.readme;
    return data;
  });
  return _readPackageJson.apply(this, arguments);
}

function authors(_x2, _x3) {
  return _authors.apply(this, arguments);
}
/** @internal */


function _authors() {
  _authors = (0, _bluebirdLst().coroutine)(function* (file, data) {
    if (data.contributors != null) {
      return;
    }

    let authorData;

    try {
      authorData = yield (0, _fsExtraP().readFile)(path.resolve(path.dirname(file), "AUTHORS"), "utf8");
    } catch (ignored) {
      return;
    }

    data.contributors = authorData.split(/\r?\n/g).map(it => it.replace(/^\s*#.*$/, "").trim());
  });
  return _authors.apply(this, arguments);
}

function checkMetadata(metadata, devMetadata, appPackageFile, devAppPackageFile) {
  const errors = [];

  const reportError = missedFieldName => {
    errors.push(`Please specify '${missedFieldName}' in the package.json (${appPackageFile})`);
  };

  const checkNotEmpty = (name, value) => {
    if ((0, _builderUtil().isEmptyOrSpaces)(value)) {
      reportError(name);
    }
  };

  if (metadata.directories != null) {
    errors.push(`"directories" in the root is deprecated, please specify in the "build"`);
  }

  checkNotEmpty("name", metadata.name);

  if ((0, _builderUtil().isEmptyOrSpaces)(metadata.description)) {
    _builderUtil().log.warn({
      appPackageFile
    }, `description is missed in the package.json`);
  }

  if (metadata.author == null) {
    _builderUtil().log.warn({
      appPackageFile
    }, `author is missed in the package.json`);
  }

  checkNotEmpty("version", metadata.version);

  if (metadata != null) {
    checkDependencies(metadata.dependencies, errors);
  }

  if (metadata !== devMetadata) {
    if (metadata.build != null) {
      errors.push(`'build' in the application package.json (${appPackageFile}) is not supported since 3.0 anymore. Please move 'build' into the development package.json (${devAppPackageFile})`);
    }
  }

  const devDependencies = metadata.devDependencies;

  if (devDependencies != null && "electron-rebuild" in devDependencies) {
    _builderUtil().log.info('electron-rebuild not required if you use electron-builder, please consider to remove excess dependency from devDependencies\n\nTo ensure your native dependencies are always matched electron version, simply add script `"postinstall": "electron-builder install-app-deps" to your `package.json`');
  }

  if (errors.length > 0) {
    throw new (_builderUtil().InvalidConfigurationError)(errors.join("\n"));
  }
}

function versionSatisfies(version, range, loose) {
  if (version == null) {
    return false;
  }

  const coerced = semver().coerce(version);

  if (coerced == null) {
    return false;
  }

  return semver().satisfies(coerced, range, loose);
}

function checkDependencies(dependencies, errors) {
  if (dependencies == null) {
    return;
  }

  const updaterVersion = dependencies["electron-updater"];
  const requiredElectronUpdaterVersion = "4.0.0";

  if (updaterVersion != null && !versionSatisfies(updaterVersion, `>=${requiredElectronUpdaterVersion}`)) {
    errors.push(`At least electron-updater ${requiredElectronUpdaterVersion} is recommended by current electron-builder version. Please set electron-updater version to "^${requiredElectronUpdaterVersion}"`);
  }

  const swVersion = dependencies["electron-builder-squirrel-windows"];

  if (swVersion != null && !versionSatisfies(swVersion, ">=20.32.0")) {
    errors.push(`At least electron-builder-squirrel-windows 20.32.0 is required by current electron-builder version. Please set electron-builder-squirrel-windows to "^20.32.0"`);
  }

  const deps = ["electron", "electron-prebuilt", "electron-rebuild"];

  if (process.env.ALLOW_ELECTRON_BUILDER_AS_PRODUCTION_DEPENDENCY !== "true") {
    deps.push("electron-builder");
  }

  for (const name of deps) {
    if (name in dependencies) {
      errors.push(`Package "${name}" is only allowed in "devDependencies". ` + `Please remove it from the "dependencies" section in your package.json.`);
    }
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=packageMetadata.js.map{"version":3,"sources":["../../src/util/packageMetadata.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEmptyOrSpaces, log, InvalidConfigurationError } from \"builder-util\"\nimport { readFile, readJson } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport * as semver from \"semver\"\nimport { Metadata } from \"..\"\n\nconst normalizeData = require(\"normalize-package-data\")\n\n/** @internal */\nexport async function readPackageJson(file: string): Promise<any> {\n  const data = await readJson(file)\n  await authors(file, data)\n  normalizeData(data)\n  // remove not required fields because can be used for remote build\n  delete data.scripts\n  delete data.readme\n  return data\n}\n\nasync function authors(file: string, data: any) {\n  if (data.contributors != null) {\n    return\n  }\n\n  let authorData\n  try {\n    authorData = await readFile(path.resolve(path.dirname(file), \"AUTHORS\"), \"utf8\")\n  }\n  catch (ignored) {\n    return\n  }\n\n  data.contributors = authorData\n    .split(/\\r?\\n/g)\n    .map(it => it.replace(/^\\s*#.*$/, \"\").trim())\n}\n\n/** @internal */\nexport function checkMetadata(metadata: Metadata, devMetadata: any | null, appPackageFile: string, devAppPackageFile: string): void {\n  const errors: Array<string> = []\n  const reportError = (missedFieldName: string) => {\n    errors.push(`Please specify '${missedFieldName}' in the package.json (${appPackageFile})`)\n  }\n\n  const checkNotEmpty = (name: string, value: string | null | undefined) => {\n    if (isEmptyOrSpaces(value)) {\n      reportError(name)\n    }\n  }\n\n  if ((metadata as any).directories != null) {\n    errors.push(`\"directories\" in the root is deprecated, please specify in the \"build\"`)\n  }\n\n  checkNotEmpty(\"name\", metadata.name)\n\n  if (isEmptyOrSpaces(metadata.description)) {\n    log.warn({appPackageFile}, `description is missed in the package.json`)\n  }\n  if (metadata.author == null) {\n    log.warn({appPackageFile}, `author is missed in the package.json`)\n  }\n  checkNotEmpty(\"version\", metadata.version)\n\n  if (metadata != null) {\n    checkDependencies(metadata.dependencies, errors)\n  }\n  if (metadata !== devMetadata) {\n    if (metadata.build != null) {\n      errors.push(`'build' in the application package.json (${appPackageFile}) is not supported since 3.0 anymore. Please move 'build' into the development package.json (${devAppPackageFile})`)\n    }\n  }\n\n  const devDependencies = (metadata as any).devDependencies\n  if (devDependencies != null && \"electron-rebuild\" in devDependencies) {\n    log.info('electron-rebuild not required if you use electron-builder, please consider to remove excess dependency from devDependencies\\n\\nTo ensure your native dependencies are always matched electron version, simply add script `\"postinstall\": \"electron-builder install-app-deps\" to your `package.json`')\n  }\n\n  if (errors.length > 0) {\n    throw new InvalidConfigurationError(errors.join(\"\\n\"))\n  }\n}\n\nfunction versionSatisfies(version: string | semver.SemVer | null, range: string | semver.Range, loose?: boolean): boolean {\n  if (version == null) {\n    return false\n  }\n\n  const coerced = semver.coerce(version)\n  if (coerced == null) {\n    return false\n  }\n\n  return semver.satisfies(coerced, range, loose)\n}\n\nfunction checkDependencies(dependencies: { [key: string]: string } | null | undefined, errors: Array<string>) {\n  if (dependencies == null) {\n    return\n  }\n\n  const updaterVersion = dependencies[\"electron-updater\"]\n  const requiredElectronUpdaterVersion = \"4.0.0\"\n  if (updaterVersion != null && !versionSatisfies(updaterVersion, `>=${requiredElectronUpdaterVersion}`)) {\n    errors.push(`At least electron-updater ${requiredElectronUpdaterVersion} is recommended by current electron-builder version. Please set electron-updater version to \"^${requiredElectronUpdaterVersion}\"`)\n  }\n\n  const swVersion = dependencies[\"electron-builder-squirrel-windows\"]\n  if (swVersion != null && !versionSatisfies(swVersion, \">=20.32.0\")) {\n    errors.push(`At least electron-builder-squirrel-windows 20.32.0 is required by current electron-builder version. Please set electron-builder-squirrel-windows to \"^20.32.0\"`)\n  }\n\n  const deps = [\"electron\", \"electron-prebuilt\", \"electron-rebuild\"]\n  if (process.env.ALLOW_ELECTRON_BUILDER_AS_PRODUCTION_DEPENDENCY !== \"true\") {\n    deps.push(\"electron-builder\")\n  }\n  for (const name of deps) {\n    if (name in dependencies) {\n      errors.push(`Package \"${name}\" is only allowed in \"devDependencies\". `\n        + `Please remove it from the \"dependencies\" section in your package.json.`)\n    }\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getTemplatePath = getTemplatePath;
exports.getVendorPath = getVendorPath;

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const root = path.join(__dirname, "..", "..");

function getTemplatePath(file) {
  return path.join(root, "templates", file);
}

function getVendorPath(file) {
  return file == null ? path.join(root, "vendor") : path.join(root, "vendor", file);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=pathManager.js.map{"version":3,"sources":["../../src/util/pathManager.ts"],"names":[],"mappings":";;;;;;;;AAAA;;;;AAEA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAL,CAAU,SAAV,EAAqB,IAArB,EAA2B,IAA3B,CAAb;;AAEM,SAAU,eAAV,CAA0B,IAA1B,EAAsC;AAC1C,SAAO,IAAI,CAAC,IAAL,CAAU,IAAV,EAAgB,WAAhB,EAA6B,IAA7B,CAAP;AACD;;AAEK,SAAU,aAAV,CAAwB,IAAxB,EAAqC;AACzC,SAAO,IAAI,IAAI,IAAR,GAAe,IAAI,CAAC,IAAL,CAAU,IAAV,EAAgB,QAAhB,CAAf,GAA2C,IAAI,CAAC,IAAL,CAAU,IAAV,EAAgB,QAAhB,EAA0B,IAA1B,CAAlD;AACD,C","sourcesContent":["import * as path from \"path\"\n\nconst root = path.join(__dirname, \"..\", \"..\")\n\nexport function getTemplatePath(file: string) {\n  return path.join(root, \"templates\", file)\n}\n\nexport function getVendorPath(file?: string) {\n  return file == null ? path.join(root, \"vendor\") : path.join(root, \"vendor\", file)\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getRepositoryInfo = getRepositoryInfo;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _hostedGitInfo() {
  const data = require("hosted-git-info");

  _hostedGitInfo = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function getRepositoryInfo(projectDir, metadata, devMetadata) {
  return _getInfo(projectDir, (devMetadata == null ? null : devMetadata.repository) || (metadata == null ? null : metadata.repository));
}

function getGitUrlFromGitConfig(_x) {
  return _getGitUrlFromGitConfig.apply(this, arguments);
}

function _getGitUrlFromGitConfig() {
  _getGitUrlFromGitConfig = (0, _bluebirdLst().coroutine)(function* (projectDir) {
    const data = yield (0, _promise().orNullIfFileNotExist)((0, _fsExtraP().readFile)(path.join(projectDir, ".git", "config"), "utf8"));

    if (data == null) {
      return null;
    }

    const conf = data.split(/\r?\n/);
    const i = conf.indexOf('[remote "origin"]');

    if (i !== -1) {
      let u = conf[i + 1];

      if (!u.match(/^\s*url =/)) {
        u = conf[i + 2];
      }

      if (u.match(/^\s*url =/)) {
        return u.replace(/^\s*url = /, "");
      }
    }

    return null;
  });
  return _getGitUrlFromGitConfig.apply(this, arguments);
}

function _getInfo(_x2, _x3) {
  return _getInfo2.apply(this, arguments);
}

function _getInfo2() {
  _getInfo2 = (0, _bluebirdLst().coroutine)(function* (projectDir, repo) {
    if (repo != null) {
      return parseRepositoryUrl(typeof repo === "string" ? repo : repo.url);
    }

    const slug = process.env.TRAVIS_REPO_SLUG || process.env.APPVEYOR_REPO_NAME;

    if (slug != null) {
      const splitted = slug.split("/");
      return {
        user: splitted[0],
        project: splitted[1]
      };
    }

    const user = process.env.CIRCLE_PROJECT_USERNAME;
    const project = process.env.CIRCLE_PROJECT_REPONAME;

    if (user != null && project != null) {
      return {
        user,
        project
      };
    }

    const url = yield getGitUrlFromGitConfig(projectDir);
    return url == null ? null : parseRepositoryUrl(url);
  });
  return _getInfo2.apply(this, arguments);
}

function parseRepositoryUrl(url) {
  const info = (0, _hostedGitInfo().fromUrl)(url);

  if (info != null) {
    delete info.protocols;
    delete info.treepath;
    delete info.filetemplate;
    delete info.bugstemplate;
    delete info.gittemplate;
    delete info.tarballtemplate;
    delete info.sshtemplate;
    delete info.sshurltemplate;
    delete info.browsetemplate;
    delete info.docstemplate;
    delete info.httpstemplate;
    delete info.shortcuttemplate;
    delete info.pathtemplate;
    delete info.pathmatch;
    delete info.protocols_re;
    delete info.committish;
    delete info.default;
    delete info.opts;
    delete info.browsefiletemplate;
    delete info.auth;
  }

  return info;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=repositoryInfo.js.map{"version":3,"sources":["../../src/util/repositoryInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import { orNullIfFileNotExist } from \"builder-util/out/promise\"\nimport { readFile } from \"fs-extra-p\"\nimport { fromUrl, Info } from \"hosted-git-info\"\nimport * as path from \"path\"\nimport { SourceRepositoryInfo } from \"../core\"\nimport { Metadata, RepositoryInfo } from \"..\"\n\nexport function getRepositoryInfo(projectDir: string, metadata?: Metadata, devMetadata?: Metadata | null): Promise<SourceRepositoryInfo | null> {\n  return _getInfo(projectDir, (devMetadata == null ? null : devMetadata.repository) || (metadata == null ? null : metadata.repository))\n}\n\nasync function getGitUrlFromGitConfig(projectDir: string): Promise<string | null> {\n  const data = await orNullIfFileNotExist(readFile(path.join(projectDir, \".git\", \"config\"), \"utf8\"))\n  if (data == null) {\n    return null\n  }\n\n  const conf = data.split(/\\r?\\n/)\n  const i = conf.indexOf('[remote \"origin\"]')\n  if (i !== -1) {\n    let u = conf[i + 1]\n    if (!u.match(/^\\s*url =/)) {\n      u = conf[i + 2]\n    }\n\n    if (u.match(/^\\s*url =/)) {\n      return u.replace(/^\\s*url = /, \"\")\n    }\n  }\n  return null\n}\n\nasync function _getInfo(projectDir: string, repo?: RepositoryInfo | string | null): Promise<SourceRepositoryInfo | null> {\n  if (repo != null) {\n    return parseRepositoryUrl(typeof repo === \"string\" ? repo : repo.url)\n  }\n\n  const slug = process.env.TRAVIS_REPO_SLUG || process.env.APPVEYOR_REPO_NAME\n  if (slug != null) {\n    const splitted = slug.split(\"/\")\n    return {\n      user: splitted[0],\n      project: splitted[1],\n    }\n  }\n\n  const user = process.env.CIRCLE_PROJECT_USERNAME\n  const project = process.env.CIRCLE_PROJECT_REPONAME\n  if (user != null && project != null) {\n    return {\n      user,\n      project,\n    }\n  }\n\n  const url = await getGitUrlFromGitConfig(projectDir)\n  return url == null ? null : parseRepositoryUrl(url)\n}\n\nfunction parseRepositoryUrl(url: string): Info {\n  const info: any = fromUrl(url)\n  if (info != null) {\n    delete info.protocols\n    delete info.treepath\n    delete info.filetemplate\n    delete info.bugstemplate\n    delete info.gittemplate\n    delete info.tarballtemplate\n    delete info.sshtemplate\n    delete info.sshurltemplate\n    delete info.browsetemplate\n    delete info.docstemplate\n    delete info.httpstemplate\n    delete info.shortcuttemplate\n    delete info.pathtemplate\n    delete info.pathmatch\n    delete info.protocols_re\n    delete info.committish\n    delete info.default\n    delete info.opts\n    delete info.browsefiletemplate\n    delete info.auth\n  }\n  return info\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.time = time;
exports.DevTimer = void 0;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

class DevTimer {
  constructor(label) {
    this.label = label;
    this.start = process.hrtime();
  }

  endAndGet() {
    const end = process.hrtime(this.start);
    return `${end[0]}s ${Math.round(end[1] / 1000000)}ms`;
  }

  end() {
    console.info(`${this.label}: ${this.endAndGet()}`);
  }

}

exports.DevTimer = DevTimer;

class ProductionTimer {
  end() {// ignore
  }

}

function time(label) {
  return _builderUtil().debug.enabled ? new DevTimer(label) : new ProductionTimer();
} 
// __ts-babel@6.0.4
//# sourceMappingURL=timer.js.map{"version":3,"sources":["../../src/util/timer.ts"],"names":[],"mappings":";;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAMM,MAAO,QAAP,CAAe;AAGnB,EAAA,WAAA,CAA6B,KAA7B,EAA0C;AAAb,SAAA,KAAA,GAAA,KAAA;AAFrB,SAAA,KAAA,GAAQ,OAAO,CAAC,MAAR,EAAR;AAGP;;AAED,EAAA,SAAS,GAAA;AACP,UAAM,GAAG,GAAG,OAAO,CAAC,MAAR,CAAe,KAAK,KAApB,CAAZ;AACA,WAAO,GAAG,GAAG,CAAC,CAAD,CAAG,KAAK,IAAI,CAAC,KAAL,CAAW,GAAG,CAAC,CAAD,CAAH,GAAS,OAApB,CAA4B,IAAjD;AACD;;AAED,EAAA,GAAG,GAAA;AACD,IAAA,OAAO,CAAC,IAAR,CAAa,GAAG,KAAK,KAAK,KAAK,KAAK,SAAL,EAAgB,EAA/C;AACD;;AAbkB;;;;AAgBrB,MAAM,eAAN,CAAqB;AACnB,EAAA,GAAG,GAAA,CACD;AACD;;AAHkB;;AAMf,SAAU,IAAV,CAAe,KAAf,EAA4B;AAChC,SAAO,qBAAM,OAAN,GAAgB,IAAI,QAAJ,CAAa,KAAb,CAAhB,GAAsC,IAAI,eAAJ,EAA7C;AACD,C","sourcesContent":["import { debug } from \"builder-util\"\n\nexport interface Timer {\n  end(): void\n}\n\nexport class DevTimer implements Timer {\n  private start = process.hrtime()\n\n  constructor(private readonly label: string) {\n  }\n\n  endAndGet(): string {\n    const end = process.hrtime(this.start)\n    return `${end[0]}s ${Math.round(end[1] / 1000000)}ms`\n  }\n\n  end(): void {\n    console.info(`${this.label}: ${this.endAndGet()}`)\n  }\n}\n\nclass ProductionTimer implements Timer {\n  end(): void {\n    // ignore\n  }\n}\n\nexport function time(label: string): Timer {\n  return debug.enabled ? new DevTimer(label) : new ProductionTimer()\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.installOrRebuild = installOrRebuild;
exports.getGypEnv = getGypEnv;
exports.rebuild = rebuild;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _os() {
  const data = require("os");

  _os = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function installOrRebuild(_x, _x2, _x3) {
  return _installOrRebuild.apply(this, arguments);
}

function _installOrRebuild() {
  _installOrRebuild = (0, _bluebirdLst().coroutine)(function* (config, appDir, options, forceInstall = false) {
    const effectiveOptions = Object.assign({
      buildFromSource: config.buildDependenciesFromSource === true,
      additionalArgs: (0, _builderUtil().asArray)(config.npmArgs)
    }, options);

    if (forceInstall || !(yield (0, _fs().exists)(path.join(appDir, "node_modules")))) {
      yield installDependencies(appDir, effectiveOptions);
    } else {
      yield rebuild(appDir, effectiveOptions);
    }
  });
  return _installOrRebuild.apply(this, arguments);
}

function getElectronGypCacheDir() {
  return path.join((0, _os().homedir)(), ".electron-gyp");
}

function getGypEnv(frameworkInfo, platform, arch, buildFromSource) {
  const npmConfigArch = arch === "armv7l" ? "arm" : arch;
  const common = Object.assign({}, process.env, {
    npm_config_arch: npmConfigArch,
    npm_config_target_arch: npmConfigArch,
    npm_config_platform: platform,
    npm_config_build_from_source: buildFromSource,
    // required for node-pre-gyp
    npm_config_target_platform: platform,
    npm_config_update_binary: true,
    npm_config_fallback_to_build: true
  });

  if (platform === "win32") {
    common.npm_config_target_libc = "unknown";
  }

  if (!frameworkInfo.useCustomDist) {
    return common;
  } // https://github.com/nodejs/node-gyp/issues/21


  return Object.assign({}, common, {
    npm_config_disturl: "https://atom.io/download/electron",
    npm_config_target: frameworkInfo.version,
    npm_config_runtime: "electron",
    npm_config_devdir: getElectronGypCacheDir()
  });
}

function installDependencies(appDir, options) {
  const platform = options.platform || process.platform;
  const arch = options.arch || process.arch;
  const additionalArgs = options.additionalArgs;

  _builderUtil().log.info({
    platform,
    arch,
    appDir
  }, `installing production dependencies`);

  let execPath = process.env.npm_execpath || process.env.NPM_CLI_JS;
  const execArgs = ["install", "--production"];

  if (!isRunningYarn(execPath)) {
    if (process.env.NPM_NO_BIN_LINKS === "true") {
      execArgs.push("--no-bin-links");
    }

    execArgs.push("--cache-min", "999999999");
  }

  if (execPath == null) {
    execPath = getPackageToolPath();
  } else {
    execArgs.unshift(execPath);
    execPath = process.env.npm_node_execpath || process.env.NODE_EXE || "node";
  }

  if (additionalArgs != null) {
    execArgs.push(...additionalArgs);
  }

  return (0, _builderUtil().spawn)(execPath, execArgs, {
    cwd: appDir,
    env: getGypEnv(options.frameworkInfo, platform, arch, options.buildFromSource === true)
  });
}

function getPackageToolPath() {
  if (process.env.FORCE_YARN === "true") {
    return process.platform === "win32" ? "yarn.cmd" : "yarn";
  } else {
    return process.platform === "win32" ? "npm.cmd" : "npm";
  }
}

function isRunningYarn(execPath) {
  const userAgent = process.env.npm_config_user_agent;
  return process.env.FORCE_YARN === "true" || execPath != null && path.basename(execPath).startsWith("yarn") || userAgent != null && /\byarn\b/.test(userAgent);
}
/** @internal */


function rebuild(_x4, _x5) {
  return _rebuild.apply(this, arguments);
} function _rebuild() {
  _rebuild = (0, _bluebirdLst().coroutine)(function* (appDir, options) {
    const nativeDeps = yield _bluebirdLst().default.filter((yield options.productionDeps.value), it => (0, _fs().exists)(path.join(it.path, "binding.gyp")), {
      concurrency: 8
    });

    if (nativeDeps.length === 0) {
      _builderUtil().log.info("no native production dependencies");

      return;
    }

    const platform = options.platform || process.platform;
    const arch = options.arch || process.arch;
    const additionalArgs = options.additionalArgs;

    _builderUtil().log.info({
      platform,
      arch
    }, "rebuilding native production dependencies");

    let execPath = process.env.npm_execpath || process.env.NPM_CLI_JS;
    const isYarn = isRunningYarn(execPath);
    const execArgs = [];

    if (execPath == null) {
      execPath = getPackageToolPath();
    } else {
      execArgs.push(execPath);
      execPath = process.env.npm_node_execpath || process.env.NODE_EXE || "node";
    }

    const env = getGypEnv(options.frameworkInfo, platform, arch, options.buildFromSource === true);

    if (isYarn) {
      execArgs.push("run", "install");

      if (additionalArgs != null) {
        execArgs.push(...additionalArgs);
      }

      yield _bluebirdLst().default.map(nativeDeps, dep => {
        _builderUtil().log.info({
          name: dep.name
        }, `rebuilding native dependency`);

        return (0, _builderUtil().spawn)(execPath, execArgs, {
          cwd: dep.path,
          env
        }).catch(error => {
          if (dep.optional) {
            _builderUtil().log.warn({
              dep: dep.name
            }, "cannot build optional native dep");
          } else {
            throw error;
          }
        });
      }, {
        concurrency: process.platform === "win32" ? 1 : 2
      });
    } else {
      execArgs.push("rebuild");

      if (additionalArgs != null) {
        execArgs.push(...additionalArgs);
      }

      execArgs.push(...nativeDeps.map(it => `${it.name}@${it.version}`));
      yield (0, _builderUtil().spawn)(execPath, execArgs, {
        cwd: appDir,
        env
      });
    }
  });
  return _rebuild.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=yarn.js.map{"version":3,"sources":["../../src/util/yarn.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { asArray, log, spawn } from \"builder-util\"\nimport { exists } from \"builder-util/out/fs\"\nimport { Lazy } from \"lazy-val\"\nimport { homedir } from \"os\"\nimport * as path from \"path\"\nimport { Configuration } from \"../configuration\"\nimport { Dependency } from \"./packageDependencies\"\n\nexport async function installOrRebuild(config: Configuration, appDir: string, options: RebuildOptions, forceInstall: boolean = false) {\n  const effectiveOptions = {\n    buildFromSource: config.buildDependenciesFromSource === true,\n    additionalArgs: asArray(config.npmArgs), ...options\n  }\n\n  if (forceInstall || !(await exists(path.join(appDir, \"node_modules\")))) {\n    await installDependencies(appDir, effectiveOptions)\n  }\n  else {\n    await rebuild(appDir, effectiveOptions)\n  }\n}\n\nexport interface DesktopFrameworkInfo {\n  version: string\n  useCustomDist: boolean\n}\n\nfunction getElectronGypCacheDir() {\n  return path.join(homedir(), \".electron-gyp\")\n}\n\nexport function getGypEnv(frameworkInfo: DesktopFrameworkInfo, platform: NodeJS.Platform, arch: string, buildFromSource: boolean) {\n  const npmConfigArch = arch === \"armv7l\" ? \"arm\" : arch\n  const common: any = {\n    ...process.env,\n    npm_config_arch: npmConfigArch,\n    npm_config_target_arch: npmConfigArch,\n    npm_config_platform: platform,\n    npm_config_build_from_source: buildFromSource,\n    // required for node-pre-gyp\n    npm_config_target_platform: platform,\n    npm_config_update_binary: true,\n    npm_config_fallback_to_build: true,\n  }\n\n  if (platform === \"win32\") {\n    common.npm_config_target_libc = \"unknown\"\n  }\n\n  if (!frameworkInfo.useCustomDist) {\n    return common\n  }\n\n  // https://github.com/nodejs/node-gyp/issues/21\n  return {\n    ...common,\n    npm_config_disturl: \"https://atom.io/download/electron\",\n    npm_config_target: frameworkInfo.version,\n    npm_config_runtime: \"electron\",\n    npm_config_devdir: getElectronGypCacheDir(),\n  }\n}\n\nfunction installDependencies(appDir: string, options: RebuildOptions): Promise<any> {\n  const platform = options.platform || process.platform\n  const arch = options.arch || process.arch\n  const additionalArgs = options.additionalArgs\n\n  log.info({platform, arch, appDir}, `installing production dependencies`)\n  let execPath = process.env.npm_execpath || process.env.NPM_CLI_JS\n  const execArgs = [\"install\", \"--production\"]\n\n  if (!isRunningYarn(execPath)) {\n    if (process.env.NPM_NO_BIN_LINKS === \"true\") {\n      execArgs.push(\"--no-bin-links\")\n    }\n    execArgs.push(\"--cache-min\", \"999999999\")\n  }\n\n  if (execPath == null) {\n    execPath = getPackageToolPath()\n  }\n  else {\n    execArgs.unshift(execPath)\n    execPath = process.env.npm_node_execpath || process.env.NODE_EXE || \"node\"\n  }\n\n  if (additionalArgs != null) {\n    execArgs.push(...additionalArgs)\n  }\n  return spawn(execPath, execArgs, {\n    cwd: appDir,\n    env: getGypEnv(options.frameworkInfo, platform, arch, options.buildFromSource === true),\n  })\n}\n\nfunction getPackageToolPath() {\n  if (process.env.FORCE_YARN === \"true\") {\n    return process.platform === \"win32\" ? \"yarn.cmd\" : \"yarn\"\n  }\n  else {\n    return process.platform === \"win32\" ? \"npm.cmd\" : \"npm\"\n  }\n}\n\nfunction isRunningYarn(execPath: string | null | undefined) {\n  const userAgent = process.env.npm_config_user_agent\n  return process.env.FORCE_YARN === \"true\" ||\n    (execPath != null && path.basename(execPath).startsWith(\"yarn\")) ||\n    (userAgent != null && /\\byarn\\b/.test(userAgent))\n}\n\nexport interface RebuildOptions {\n  frameworkInfo: DesktopFrameworkInfo\n  productionDeps?: Lazy<Array<Dependency>>\n\n  platform?: NodeJS.Platform\n  arch?: string\n\n  buildFromSource?: boolean\n\n  additionalArgs?: Array<string> | null\n}\n\n/** @internal */\nexport async function rebuild(appDir: string, options: RebuildOptions) {\n  const nativeDeps = await BluebirdPromise.filter(await options.productionDeps!.value, it => exists(path.join(it.path, \"binding.gyp\")), {concurrency: 8})\n  if (nativeDeps.length === 0) {\n    log.info(\"no native production dependencies\")\n    return\n  }\n\n  const platform = options.platform || process.platform\n  const arch = options.arch || process.arch\n  const additionalArgs = options.additionalArgs\n\n  log.info({platform, arch}, \"rebuilding native production dependencies\")\n\n  let execPath = process.env.npm_execpath || process.env.NPM_CLI_JS\n  const isYarn = isRunningYarn(execPath)\n  const execArgs: Array<string> = []\n  if (execPath == null) {\n    execPath = getPackageToolPath()\n  }\n  else {\n    execArgs.push(execPath)\n    execPath = process.env.npm_node_execpath || process.env.NODE_EXE || \"node\"\n  }\n\n  const env = getGypEnv(options.frameworkInfo, platform, arch, options.buildFromSource === true)\n  if (isYarn) {\n    execArgs.push(\"run\", \"install\")\n    if (additionalArgs != null) {\n      execArgs.push(...additionalArgs)\n    }\n    await BluebirdPromise.map(nativeDeps, dep => {\n      log.info({name: dep.name}, `rebuilding native dependency`)\n      return spawn(execPath!, execArgs, {\n        cwd: dep.path,\n        env,\n      })\n        .catch(error => {\n          if (dep.optional) {\n            log.warn({dep: dep.name}, \"cannot build optional native dep\")\n          }\n          else {\n            throw error\n          }\n        })\n    }, {concurrency: process.platform === \"win32\" ? 1 : 2})\n  }\n  else {\n    execArgs.push(\"rebuild\")\n    if (additionalArgs != null) {\n      execArgs.push(...additionalArgs)\n    }\n    execArgs.push(...nativeDeps.map(it => `${it.name}@${it.version}`))\n    await spawn(execPath, execArgs, {\n      cwd: appDir,\n      env,\n    })\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _PublishManager() {
  const data = require("../publish/PublishManager");

  _PublishManager = function () {
    return data;
  };

  return data;
}

function _appBuilder() {
  const data = require("../util/appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _license() {
  const data = require("../util/license");

  _license = function () {
    return data;
  };

  return data;
}

function _targetUtil() {
  const data = require("./targetUtil");

  _targetUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

// https://unix.stackexchange.com/questions/375191/append-to-sub-directory-inside-squashfs-file
class AppImageTarget extends _core().Target {
  constructor(ignored, packager, helper, outDir) {
    super("appImage");
    this.packager = packager;
    this.helper = helper;
    this.outDir = outDir;
    this.options = Object.assign({}, this.packager.platformSpecificBuildOptions, this.packager.config[this.name]);
    this.desktopEntry = new (_lazyVal().Lazy)(() => helper.computeDesktopEntry(this.options, "AppRun", {
      "X-AppImage-Version": `${packager.appInfo.buildVersion}`
    }));
  }

  build(appOutDir, arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;
      const options = _this.options; // https://github.com/electron-userland/electron-builder/issues/775
      // https://github.com/electron-userland/electron-builder/issues/1726
      // tslint:disable-next-line:no-invalid-template-strings

      const artifactName = packager.expandArtifactBeautyNamePattern(options, "AppImage", arch);
      const artifactPath = path.join(_this.outDir, artifactName);
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: "AppImage",
        file: artifactPath,
        arch
      });
      const c = yield Promise.all([_this.desktopEntry.value, _this.helper.icons, (0, _PublishManager().getAppUpdatePublishConfiguration)(packager, arch, false
      /* in any case validation will be done on publish */
      ), (0, _license().getNotLocalizedLicenseFile)(options.license, _this.packager, ["txt", "html"]), (0, _targetUtil().createStageDir)(_this, packager, arch)]);
      const license = c[3];
      const stageDir = c[4];
      const publishConfig = c[2];

      if (publishConfig != null) {
        yield (0, _fsExtraP().outputFile)(path.join(packager.getResourcesDir(stageDir.dir), "app-update.yml"), (0, _builderUtil().serializeToYaml)(publishConfig));
      }

      if (_this.packager.packagerOptions.effectiveOptionComputed != null && (yield _this.packager.packagerOptions.effectiveOptionComputed({
        desktop: yield _this.desktopEntry.value
      }))) {
        return;
      }

      const args = ["appimage", "--stage", stageDir.dir, "--arch", _builderUtil().Arch[arch], "--output", artifactPath, "--app", appOutDir, "--configuration", JSON.stringify(Object.assign({
        productName: _this.packager.appInfo.productName,
        desktopEntry: c[0],
        executableName: _this.packager.executableName,
        icons: c[1],
        fileAssociations: _this.packager.fileAssociations
      }, options))];
      (0, _appBuilder().objectToArgs)(args, {
        license
      });

      if (packager.compression === "maximum") {
        args.push("--compression", "xz");
      }

      yield packager.info.callArtifactBuildCompleted({
        file: artifactPath,
        safeArtifactName: packager.computeSafeArtifactName(artifactName, "AppImage", arch, false),
        target: _this,
        arch,
        packager,
        isWriteUpdateInfo: true,
        updateInfo: yield (0, _appBuilder().executeAppBuilderAsJson)(args)
      });
    })();
  }

} exports.default = AppImageTarget;
// __ts-babel@6.0.4
//# sourceMappingURL=AppImageTarget.js.map{"version":3,"sources":["../../src/targets/AppImageTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, serializeToYaml } from \"builder-util\"\nimport { outputFile } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { AppImageOptions } from \"..\"\nimport { Target } from \"../core\"\nimport { LinuxPackager } from \"../linuxPackager\"\nimport { getAppUpdatePublishConfiguration } from \"../publish/PublishManager\"\nimport { executeAppBuilderAsJson, objectToArgs } from \"../util/appBuilder\"\nimport { getNotLocalizedLicenseFile } from \"../util/license\"\nimport { LinuxTargetHelper } from \"./LinuxTargetHelper\"\nimport { createStageDir } from \"./targetUtil\"\n\n// https://unix.stackexchange.com/questions/375191/append-to-sub-directory-inside-squashfs-file\nexport default class AppImageTarget extends Target {\n  readonly options: AppImageOptions = {...this.packager.platformSpecificBuildOptions, ...(this.packager.config as any)[this.name]}\n  private readonly desktopEntry: Lazy<string>\n\n  constructor(ignored: string, private readonly packager: LinuxPackager, private readonly helper: LinuxTargetHelper, readonly outDir: string) {\n    super(\"appImage\")\n\n    this.desktopEntry = new Lazy<string>(() => helper.computeDesktopEntry(this.options, \"AppRun\", {\n      \"X-AppImage-Version\": `${packager.appInfo.buildVersion}`,\n    }))\n  }\n\n  async build(appOutDir: string, arch: Arch): Promise<any> {\n    const packager = this.packager\n    const options = this.options\n    // https://github.com/electron-userland/electron-builder/issues/775\n    // https://github.com/electron-userland/electron-builder/issues/1726\n    // tslint:disable-next-line:no-invalid-template-strings\n    const artifactName = packager.expandArtifactBeautyNamePattern(options, \"AppImage\", arch)\n    const artifactPath = path.join(this.outDir, artifactName)\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: \"AppImage\",\n      file: artifactPath,\n      arch,\n    })\n\n    const c = await Promise.all([\n      this.desktopEntry.value,\n      this.helper.icons,\n      getAppUpdatePublishConfiguration(packager, arch, false /* in any case validation will be done on publish */),\n      getNotLocalizedLicenseFile(options.license, this.packager, [\"txt\", \"html\"]),\n      createStageDir(this, packager, arch),\n    ])\n    const license = c[3]\n    const stageDir = c[4]\n\n    const publishConfig = c[2]\n    if (publishConfig != null) {\n      await outputFile(path.join(packager.getResourcesDir(stageDir.dir), \"app-update.yml\"), serializeToYaml(publishConfig))\n    }\n\n    if (this.packager.packagerOptions.effectiveOptionComputed != null && await this.packager.packagerOptions.effectiveOptionComputed({desktop: await this.desktopEntry.value})) {\n      return\n    }\n\n    const args = [\n      \"appimage\",\n      \"--stage\", stageDir.dir,\n      \"--arch\", Arch[arch],\n      \"--output\", artifactPath,\n      \"--app\", appOutDir,\n      \"--configuration\", (JSON.stringify({\n        productName: this.packager.appInfo.productName,\n        desktopEntry: c[0],\n        executableName: this.packager.executableName,\n        icons: c[1],\n        fileAssociations: this.packager.fileAssociations,\n        ...options,\n      })),\n    ]\n    objectToArgs(args, {\n      license,\n    })\n    if (packager.compression === \"maximum\") {\n      args.push(\"--compression\", \"xz\")\n    }\n\n    await packager.info.callArtifactBuildCompleted({\n      file: artifactPath,\n      safeArtifactName: packager.computeSafeArtifactName(artifactName, \"AppImage\", arch, false),\n      target: this,\n      arch,\n      packager,\n      isWriteUpdateInfo: true,\n      updateInfo: await executeAppBuilderAsJson(args),\n    })\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _windowsCodeSign() {
  const data = require("../codeSign/windowsCodeSign");

  _windowsCodeSign = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _pathManager() {
  const data = require("../util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

function _targetUtil() {
  const data = require("./targetUtil");

  _targetUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const APPX_ASSETS_DIR_NAME = "appx";
const vendorAssetsForDefaultAssets = {
  "StoreLogo.png": "SampleAppx.50x50.png",
  "Square150x150Logo.png": "SampleAppx.150x150.png",
  "Square44x44Logo.png": "SampleAppx.44x44.png",
  "Wide310x150Logo.png": "SampleAppx.310x150.png"
};
const DEFAULT_RESOURCE_LANG = "en-US";

class AppXTarget extends _core().Target {
  constructor(packager, outDir) {
    super("appx");
    this.packager = packager;
    this.outDir = outDir;
    this.options = (0, _builderUtil().deepAssign)({}, this.packager.platformSpecificBuildOptions, this.packager.config.appx);

    if (process.platform !== "darwin" && (process.platform !== "win32" || (0, _windowsCodeSign().isOldWin6)())) {
      throw new Error("AppX is supported only on Windows 10 or Windows Server 2012 R2 (version number 6.3+)");
    }
  } // https://docs.microsoft.com/en-us/windows/uwp/packaging/create-app-package-with-makeappx-tool#mapping-files


  build(appOutDir, arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;
      const artifactName = packager.expandArtifactBeautyNamePattern(_this.options, "appx", arch);
      const artifactPath = path.join(_this.outDir, artifactName);
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: "AppX",
        file: artifactPath,
        arch
      });
      const vendorPath = yield (0, _windowsCodeSign().getSignVendorPath)();
      const vm = yield packager.vm.value;
      const stageDir = yield (0, _targetUtil().createStageDir)(_this, packager, arch);
      const mappingFile = stageDir.getTempFile("mapping.txt");
      const makeAppXArgs = ["pack", "/o"
      /* overwrite the output file if it exists */
      , "/f", vm.toVmFile(mappingFile), "/p", vm.toVmFile(artifactPath)];

      if (packager.compression === "store") {
        makeAppXArgs.push("/nc");
      }

      const mappingList = [];
      mappingList.push((yield _bluebirdLst().default.map((0, _fs().walk)(appOutDir), file => {
        let appxPath = file.substring(appOutDir.length + 1);

        if (path.sep !== "\\") {
          appxPath = appxPath.replace(/\//g, "\\");
        }

        return `"${vm.toVmFile(file)}" "app\\${appxPath}"`;
      })));
      const userAssetDir = yield _this.packager.getResource(undefined, APPX_ASSETS_DIR_NAME);
      const assetInfo = yield AppXTarget.computeUserAssets(vm, vendorPath, userAssetDir);
      const userAssets = assetInfo.userAssets;
      const manifestFile = stageDir.getTempFile("AppxManifest.xml");
      yield _this.writeManifest(manifestFile, arch, (yield _this.computePublisherName()), userAssets);
      mappingList.push(assetInfo.mappings);
      mappingList.push([`"${vm.toVmFile(manifestFile)}" "AppxManifest.xml"`]);

      if (isScaledAssetsProvided(userAssets)) {
        const outFile = vm.toVmFile(stageDir.getTempFile("resources.pri"));
        const makePriPath = vm.toVmFile(path.join(vendorPath, "windows-10", _builderUtil().Arch[arch], "makepri.exe"));
        const assetRoot = stageDir.getTempFile("appx/assets");
        yield (0, _fsExtraP().emptyDir)(assetRoot);
        yield _bluebirdLst().default.map(assetInfo.allAssets, it => (0, _fs().copyOrLinkFile)(it, path.join(assetRoot, path.basename(it))));
        yield vm.exec(makePriPath, ["new", "/Overwrite", "/Manifest", vm.toVmFile(manifestFile), "/ProjectRoot", vm.toVmFile(path.dirname(assetRoot)), "/ConfigXml", vm.toVmFile(path.join((0, _pathManager().getTemplatePath)("appx"), "priconfig.xml")), "/OutputFile", outFile]); // in addition to resources.pri, resources.scale-140.pri and other such files will be generated

        for (const resourceFile of (yield (0, _fsExtraP().readdir)(stageDir.dir)).filter(it => it.startsWith("resources.")).sort()) {
          mappingList.push([`"${vm.toVmFile(stageDir.getTempFile(resourceFile))}" "${resourceFile}"`]);
        }

        makeAppXArgs.push("/l");
      }

      let mapping = "[Files]";

      for (const list of mappingList) {
        mapping += "\r\n" + list.join("\r\n");
      }

      yield (0, _fsExtraP().writeFile)(mappingFile, mapping);
      packager.debugLogger.add("appx.mapping", mapping);

      if (_this.options.makeappxArgs != null) {
        makeAppXArgs.push(..._this.options.makeappxArgs);
      }

      yield vm.exec(vm.toVmFile(path.join(vendorPath, "windows-10", _builderUtil().Arch[arch], "makeappx.exe")), makeAppXArgs);
      yield packager.sign(artifactPath);
      yield stageDir.cleanup();
      yield packager.info.callArtifactBuildCompleted({
        file: artifactPath,
        packager,
        arch,
        safeArtifactName: packager.computeSafeArtifactName(artifactName, "appx"),
        target: _this,
        isWriteUpdateInfo: _this.options.electronUpdaterAware
      });
    })();
  }

  static computeUserAssets(vm, vendorPath, userAssetDir) {
    return (0, _bluebirdLst().coroutine)(function* () {
      const mappings = [];
      let userAssets;
      const allAssets = [];

      if (userAssetDir == null) {
        userAssets = [];
      } else {
        userAssets = (yield (0, _fsExtraP().readdir)(userAssetDir)).filter(it => !it.startsWith(".") && !it.endsWith(".db") && it.includes("."));

        for (const name of userAssets) {
          mappings.push(`"${vm.toVmFile(userAssetDir)}${vm.pathSep}${name}" "assets\\${name}"`);
          allAssets.push(path.join(userAssetDir, name));
        }
      }

      for (const defaultAsset of Object.keys(vendorAssetsForDefaultAssets)) {
        if (userAssets.length === 0 || !isDefaultAssetIncluded(userAssets, defaultAsset)) {
          const file = path.join(vendorPath, "appxAssets", vendorAssetsForDefaultAssets[defaultAsset]);
          mappings.push(`"${vm.toVmFile(file)}" "assets\\${defaultAsset}"`);
          allAssets.push(file);
        }
      } // we do not use process.arch to build path to tools, because even if you are on x64, ia32 appx tool must be used if you build appx for ia32


      return {
        userAssets,
        mappings,
        allAssets
      };
    })();
  } // https://github.com/electron-userland/electron-builder/issues/2108#issuecomment-333200711


  computePublisherName() {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if ((yield _this2.packager.cscInfo.value) == null) {
        _builderUtil().log.info({
          reason: "Windows Store only build"
        }, "AppX is not signed");

        return _this2.options.publisher || "CN=ms";
      }

      const certInfo = yield _this2.packager.lazyCertInfo.value;
      const publisher = certInfo == null ? null : certInfo.bloodyMicrosoftSubjectDn;

      if (publisher == null) {
        throw new Error("Internal error: cannot compute subject using certificate info");
      }

      return publisher;
    })();
  }

  writeManifest(outFile, arch, publisher, userAssets) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appInfo = _this3.packager.appInfo;
      const options = _this3.options;
      const executable = `app\\${appInfo.productFilename}.exe`;
      const displayName = options.displayName || appInfo.productName;
      const manifest = (yield (0, _fsExtraP().readFile)(path.join((0, _pathManager().getTemplatePath)("appx"), "appxmanifest.xml"), "utf8")).replace(/\${([a-zA-Z0-9]+)}/g, (match, p1) => {
        switch (p1) {
          case "publisher":
            return publisher;

          case "publisherDisplayName":
            const name = options.publisherDisplayName || appInfo.companyName;

            if (name == null) {
              throw new (_builderUtil().InvalidConfigurationError)(`Please specify "author" in the application package.json â€” it is required because "appx.publisherDisplayName" is not set.`);
            }

            return name;

          case "version":
            return appInfo.getVersionInWeirdWindowsForm(options.setBuildNumber === true);

          case "applicationId":
            const result = options.applicationId || options.identityName || appInfo.name;

            if (!isNaN(parseInt(result[0], 10))) {
              let message = `AppX Application.Id canâ€™t start with numbers: "${result}"`;

              if (options.applicationId == null) {
                message += `\nPlease set appx.applicationId (or correct appx.identityName or name)`;
              }

              throw new (_builderUtil().InvalidConfigurationError)(message);
            }

            return result;

          case "identityName":
            return options.identityName || appInfo.name;

          case "executable":
            return executable;

          case "displayName":
            return displayName;

          case "description":
            return appInfo.description || appInfo.productName;

          case "backgroundColor":
            return options.backgroundColor || "#464646";

          case "logo":
            return "assets\\StoreLogo.png";

          case "square150x150Logo":
            return "assets\\Square150x150Logo.png";

          case "square44x44Logo":
            return "assets\\Square44x44Logo.png";

          case "lockScreen":
            return lockScreenTag(userAssets);

          case "defaultTile":
            return defaultTileTag(userAssets, options.showNameOnTiles || false);

          case "splashScreen":
            return splashScreenTag(userAssets);

          case "arch":
            return arch === _builderUtil().Arch.ia32 ? "x86" : "x64";

          case "resourceLanguages":
            return resourceLanguageTag((0, _builderUtil().asArray)(options.languages));

          case "extensions":
            return _this3.getExtensions(executable, displayName);

          default:
            throw new Error(`Macro ${p1} is not defined`);
        }
      });
      yield (0, _fsExtraP().writeFile)(outFile, manifest);
    })();
  }

  getExtensions(executable, displayName) {
    const uriSchemes = (0, _builderUtil().asArray)(this.packager.config.protocols).concat((0, _builderUtil().asArray)(this.packager.platformSpecificBuildOptions.protocols));
    let isAddAutoLaunchExtension = this.options.addAutoLaunchExtension;

    if (isAddAutoLaunchExtension === undefined) {
      const deps = this.packager.info.metadata.dependencies;
      isAddAutoLaunchExtension = deps != null && deps["electron-winstore-auto-launch"] != null;
    }

    if (!isAddAutoLaunchExtension && uriSchemes.length === 0) {
      return "";
    }

    let extensions = "<Extensions>";

    if (isAddAutoLaunchExtension) {
      extensions += `
        <desktop:Extension Category="windows.startupTask" Executable="${executable}" EntryPoint="Windows.FullTrustApplication">
          <desktop:StartupTask TaskId="SlackStartup" Enabled="true" DisplayName="${displayName}" />
        </desktop:Extension>`;
    }

    for (const protocol of uriSchemes) {
      for (const scheme of (0, _builderUtil().asArray)(protocol.schemes)) {
        extensions += `
          <uap:Extension Category="windows.protocol">
            <uap:Protocol Name="${scheme}">
               <uap:DisplayName>${protocol.name}</uap:DisplayName>
             </uap:Protocol>
          </uap:Extension>`;
      }
    }

    extensions += "</Extensions>";
    return extensions;
  }

} // get the resource - language tag, see https://docs.microsoft.com/en-us/windows/uwp/globalizing/manage-language-and-region#specify-the-supported-languages-in-the-apps-manifest


exports.default = AppXTarget;

function resourceLanguageTag(userLanguages) {
  if (userLanguages == null || userLanguages.length === 0) {
    userLanguages = [DEFAULT_RESOURCE_LANG];
  }

  return userLanguages.map(it => `<Resource Language="${it.replace(/_/g, "-")}" />`).join("\n");
}

function lockScreenTag(userAssets) {
  if (isDefaultAssetIncluded(userAssets, "BadgeLogo.png")) {
    return '<uap:LockScreen Notification="badgeAndTileText" BadgeLogo="assets\\BadgeLogo.png" />';
  } else {
    return "";
  }
}

function defaultTileTag(userAssets, showNameOnTiles) {
  const defaultTiles = ["<uap:DefaultTile", 'Wide310x150Logo="assets\\Wide310x150Logo.png"'];

  if (isDefaultAssetIncluded(userAssets, "LargeTile.png")) {
    defaultTiles.push('Square310x310Logo="assets\\LargeTile.png"');
  }

  if (isDefaultAssetIncluded(userAssets, "SmallTile.png")) {
    defaultTiles.push('Square71x71Logo="assets\\SmallTile.png"');
  }

  if (showNameOnTiles) {
    defaultTiles.push(">");
    defaultTiles.push("<uap:ShowNameOnTiles>");
    defaultTiles.push("<uap:ShowOn", 'Tile="wide310x150Logo"', "/>");
    defaultTiles.push("<uap:ShowOn", 'Tile="square150x150Logo"', "/>");
    defaultTiles.push("</uap:ShowNameOnTiles>");
    defaultTiles.push("</uap:DefaultTile>");
  } else {
    defaultTiles.push("/>");
  }

  return defaultTiles.join(" ");
}

function splashScreenTag(userAssets) {
  if (isDefaultAssetIncluded(userAssets, "SplashScreen.png")) {
    return '<uap:SplashScreen Image="assets\\SplashScreen.png" />';
  } else {
    return "";
  }
}

function isDefaultAssetIncluded(userAssets, defaultAsset) {
  const defaultAssetName = defaultAsset.substring(0, defaultAsset.indexOf("."));
  return userAssets.some(it => it.includes(defaultAssetName));
}

function isScaledAssetsProvided(userAssets) {
  return userAssets.some(it => it.includes(".scale-") || it.includes(".targetsize-"));
} 
// __ts-babel@6.0.4
//# sourceMappingURL=AppxTarget.js.map{"version":3,"sources":["../../src/targets/AppxTarget.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEA,MAAM,oBAAoB,GAAG,MAA7B;AAEA,MAAM,4BAA4B,GAA+B;AAC/D,mBAAiB,sBAD8C;AAE/D,2BAAyB,wBAFsC;AAG/D,yBAAuB,sBAHwC;AAI/D,yBAAuB;AAJwC,CAAjE;AAOA,MAAM,qBAAqB,GAAG,OAA9B;;AAEc,MAAO,UAAP,SAA0B,cAA1B,CAAgC;AAG5C,EAAA,WAAA,CAA6B,QAA7B,EAA6D,MAA7D,EAA2E;AACzE,UAAM,MAAN;AAD2B,SAAA,QAAA,GAAA,QAAA;AAAgC,SAAA,MAAA,GAAA,MAAA;AAFpD,SAAA,OAAA,GAAuB,+BAAW,EAAX,EAAe,KAAK,QAAL,CAAc,4BAA7B,EAA2D,KAAK,QAAL,CAAc,MAAd,CAAqB,IAAhF,CAAvB;;AAKP,QAAI,OAAO,CAAC,QAAR,KAAqB,QAArB,KAAkC,OAAO,CAAC,QAAR,KAAqB,OAArB,IAAgC,mCAAlE,CAAJ,EAAoF;AAClF,YAAM,IAAI,KAAJ,CAAU,sFAAV,CAAN;AACD;AACF,GAT2C,CAW5C;;;AACM,EAAA,KAAN,CAAY,SAAZ,EAA+B,IAA/B,EAAyC;AAAA;;AAAA;AACvC,YAAM,QAAQ,GAAG,KAAI,CAAC,QAAtB;AACA,YAAM,YAAY,GAAG,QAAQ,CAAC,+BAAT,CAAyC,KAAI,CAAC,OAA9C,EAAuD,MAAvD,EAA+D,IAA/D,CAArB;AACA,YAAM,YAAY,GAAG,IAAI,CAAC,IAAL,CAAU,KAAI,CAAC,MAAf,EAAuB,YAAvB,CAArB;AACA,YAAM,QAAQ,CAAC,IAAT,CAAc,wBAAd,CAAuC;AAC3C,QAAA,qBAAqB,EAAE,MADoB;AAE3C,QAAA,IAAI,EAAE,YAFqC;AAG3C,QAAA;AAH2C,OAAvC,CAAN;AAMA,YAAM,UAAU,SAAS,2CAAzB;AACA,YAAM,EAAE,SAAS,QAAQ,CAAC,EAAT,CAAY,KAA7B;AAEA,YAAM,QAAQ,SAAS,kCAAe,KAAf,EAAqB,QAArB,EAA+B,IAA/B,CAAvB;AAEA,YAAM,WAAW,GAAG,QAAQ,CAAC,WAAT,CAAqB,aAArB,CAApB;AACA,YAAM,YAAY,GAAG,CAAC,MAAD,EAAS;AAAK;AAAd,QACnB,IADmB,EACb,EAAE,CAAC,QAAH,CAAY,WAAZ,CADa,EAEnB,IAFmB,EAEb,EAAE,CAAC,QAAH,CAAY,YAAZ,CAFa,CAArB;;AAIA,UAAI,QAAQ,CAAC,WAAT,KAAyB,OAA7B,EAAsC;AACpC,QAAA,YAAY,CAAC,IAAb,CAAkB,KAAlB;AACD;;AAED,YAAM,WAAW,GAAyB,EAA1C;AACA,MAAA,WAAW,CAAC,IAAZ,QAAuB,uBAAgB,GAAhB,CAAoB,gBAAK,SAAL,CAApB,EAAqC,IAAI,IAAG;AACjE,YAAI,QAAQ,GAAG,IAAI,CAAC,SAAL,CAAe,SAAS,CAAC,MAAV,GAAmB,CAAlC,CAAf;;AACA,YAAI,IAAI,CAAC,GAAL,KAAa,IAAjB,EAAuB;AACrB,UAAA,QAAQ,GAAG,QAAQ,CAAC,OAAT,CAAiB,KAAjB,EAAwB,IAAxB,CAAX;AACD;;AACD,eAAO,IAAI,EAAE,CAAC,QAAH,CAAY,IAAZ,CAAiB,WAAW,QAAQ,GAA/C;AACD,OANsB,CAAvB;AAQA,YAAM,YAAY,SAAS,KAAI,CAAC,QAAL,CAAc,WAAd,CAA0B,SAA1B,EAAqC,oBAArC,CAA3B;AACA,YAAM,SAAS,SAAS,UAAU,CAAC,iBAAX,CAA6B,EAA7B,EAAiC,UAAjC,EAA6C,YAA7C,CAAxB;AACA,YAAM,UAAU,GAAG,SAAS,CAAC,UAA7B;AAEA,YAAM,YAAY,GAAG,QAAQ,CAAC,WAAT,CAAqB,kBAArB,CAArB;AACA,YAAM,KAAI,CAAC,aAAL,CAAmB,YAAnB,EAAiC,IAAjC,SAA6C,KAAI,CAAC,oBAAL,EAA7C,GAA0E,UAA1E,CAAN;AACA,MAAA,WAAW,CAAC,IAAZ,CAAiB,SAAS,CAAC,QAA3B;AACA,MAAA,WAAW,CAAC,IAAZ,CAAiB,CAAC,IAAI,EAAE,CAAC,QAAH,CAAY,YAAZ,CAAyB,sBAA9B,CAAjB;;AAEA,UAAI,sBAAsB,CAAC,UAAD,CAA1B,EAAwC;AACtC,cAAM,OAAO,GAAG,EAAE,CAAC,QAAH,CAAY,QAAQ,CAAC,WAAT,CAAqB,eAArB,CAAZ,CAAhB;AACA,cAAM,WAAW,GAAG,EAAE,CAAC,QAAH,CAAY,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,YAAtB,EAAoC,oBAAK,IAAL,CAApC,EAAgD,aAAhD,CAAZ,CAApB;AAEA,cAAM,SAAS,GAAG,QAAQ,CAAC,WAAT,CAAqB,aAArB,CAAlB;AACA,cAAM,0BAAS,SAAT,CAAN;AACA,cAAM,uBAAgB,GAAhB,CAAoB,SAAS,CAAC,SAA9B,EAAyC,EAAE,IAAI,0BAAe,EAAf,EAAmB,IAAI,CAAC,IAAL,CAAU,SAAV,EAAqB,IAAI,CAAC,QAAL,CAAc,EAAd,CAArB,CAAnB,CAA/C,CAAN;AAEA,cAAM,EAAE,CAAC,IAAH,CAAQ,WAAR,EAAqB,CAAC,KAAD,EACzB,YADyB,EAEzB,WAFyB,EAEZ,EAAE,CAAC,QAAH,CAAY,YAAZ,CAFY,EAGzB,cAHyB,EAGT,EAAE,CAAC,QAAH,CAAY,IAAI,CAAC,OAAL,CAAa,SAAb,CAAZ,CAHS,EAIzB,YAJyB,EAIX,EAAE,CAAC,QAAH,CAAY,IAAI,CAAC,IAAL,CAAU,oCAAgB,MAAhB,CAAV,EAAmC,eAAnC,CAAZ,CAJW,EAKzB,aALyB,EAKV,OALU,CAArB,CAAN,CARsC,CAgBtC;;AACA,aAAK,MAAM,YAAX,IAA2B,OAAO,yBAAQ,QAAQ,CAAC,GAAjB,CAAP,EAA8B,MAA9B,CAAqC,EAAE,IAAI,EAAE,CAAC,UAAH,CAAc,YAAd,CAA3C,EAAwE,IAAxE,EAA3B,EAA2G;AACzG,UAAA,WAAW,CAAC,IAAZ,CAAiB,CAAC,IAAI,EAAE,CAAC,QAAH,CAAY,QAAQ,CAAC,WAAT,CAAqB,YAArB,CAAZ,CAA+C,MAAM,YAAY,GAAtE,CAAjB;AACD;;AACD,QAAA,YAAY,CAAC,IAAb,CAAkB,IAAlB;AACD;;AAED,UAAI,OAAO,GAAG,SAAd;;AACA,WAAK,MAAM,IAAX,IAAmB,WAAnB,EAAgC;AAC9B,QAAA,OAAO,IAAI,SAAS,IAAI,CAAC,IAAL,CAAU,MAAV,CAApB;AACD;;AACD,YAAM,2BAAU,WAAV,EAAuB,OAAvB,CAAN;AACA,MAAA,QAAQ,CAAC,WAAT,CAAqB,GAArB,CAAyB,cAAzB,EAAyC,OAAzC;;AAEA,UAAI,KAAI,CAAC,OAAL,CAAa,YAAb,IAA6B,IAAjC,EAAuC;AACrC,QAAA,YAAY,CAAC,IAAb,CAAkB,GAAG,KAAI,CAAC,OAAL,CAAa,YAAlC;AACD;;AACD,YAAM,EAAE,CAAC,IAAH,CAAQ,EAAE,CAAC,QAAH,CAAY,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,YAAtB,EAAoC,oBAAK,IAAL,CAApC,EAAgD,cAAhD,CAAZ,CAAR,EAAsF,YAAtF,CAAN;AACA,YAAM,QAAQ,CAAC,IAAT,CAAc,YAAd,CAAN;AAEA,YAAM,QAAQ,CAAC,OAAT,EAAN;AAEA,YAAM,QAAQ,CAAC,IAAT,CAAc,0BAAd,CAAyC;AAC7C,QAAA,IAAI,EAAE,YADuC;AAE7C,QAAA,QAF6C;AAG7C,QAAA,IAH6C;AAI7C,QAAA,gBAAgB,EAAE,QAAQ,CAAC,uBAAT,CAAiC,YAAjC,EAA+C,MAA/C,CAJ2B;AAK7C,QAAA,MAAM,EAAE,KALqC;AAM7C,QAAA,iBAAiB,EAAE,KAAI,CAAC,OAAL,CAAa;AANa,OAAzC,CAAN;AAhFuC;AAwFxC;;AAEO,SAAa,iBAAb,CAA+B,EAA/B,EAA8C,UAA9C,EAAkE,YAAlE,EAA6F;AAAA;AACnG,YAAM,QAAQ,GAAkB,EAAhC;AACA,UAAI,UAAJ;AACA,YAAM,SAAS,GAAkB,EAAjC;;AACA,UAAI,YAAY,IAAI,IAApB,EAA0B;AACxB,QAAA,UAAU,GAAG,EAAb;AACD,OAFD,MAGK;AACH,QAAA,UAAU,GAAG,OAAO,yBAAQ,YAAR,CAAP,EAA8B,MAA9B,CAAqC,EAAE,IAAI,CAAC,EAAE,CAAC,UAAH,CAAc,GAAd,CAAD,IAAuB,CAAC,EAAE,CAAC,QAAH,CAAY,KAAZ,CAAxB,IAA8C,EAAE,CAAC,QAAH,CAAY,GAAZ,CAAzF,CAAb;;AACA,aAAK,MAAM,IAAX,IAAmB,UAAnB,EAA+B;AAC7B,UAAA,QAAQ,CAAC,IAAT,CAAc,IAAI,EAAE,CAAC,QAAH,CAAY,YAAZ,CAAyB,GAAG,EAAE,CAAC,OAAO,GAAG,IAAI,cAAc,IAAI,GAAjF;AACA,UAAA,SAAS,CAAC,IAAV,CAAe,IAAI,CAAC,IAAL,CAAU,YAAV,EAAwB,IAAxB,CAAf;AACD;AACF;;AAED,WAAK,MAAM,YAAX,IAA2B,MAAM,CAAC,IAAP,CAAY,4BAAZ,CAA3B,EAAsE;AACpE,YAAI,UAAU,CAAC,MAAX,KAAsB,CAAtB,IAA2B,CAAC,sBAAsB,CAAC,UAAD,EAAa,YAAb,CAAtD,EAAkF;AAChF,gBAAM,IAAI,GAAG,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,YAAtB,EAAoC,4BAA4B,CAAC,YAAD,CAAhE,CAAb;AACA,UAAA,QAAQ,CAAC,IAAT,CAAc,IAAI,EAAE,CAAC,QAAH,CAAY,IAAZ,CAAiB,cAAc,YAAY,GAA7D;AACA,UAAA,SAAS,CAAC,IAAV,CAAe,IAAf;AACD;AACF,OArBkG,CAuBnG;;;AACA,aAAO;AAAC,QAAA,UAAD;AAAa,QAAA,QAAb;AAAuB,QAAA;AAAvB,OAAP;AAxBmG;AAyBpG,GA/H2C,CAiI5C;;;AACc,EAAA,oBAAN,GAA0B;AAAA;;AAAA;AAChC,UAAI,OAAM,MAAI,CAAC,QAAL,CAAc,OAAd,CAAsB,KAA5B,KAAqC,IAAzC,EAA+C;AAC7C,2BAAI,IAAJ,CAAS;AAAC,UAAA,MAAM,EAAE;AAAT,SAAT,EAA+C,oBAA/C;;AACA,eAAO,MAAI,CAAC,OAAL,CAAa,SAAb,IAA0B,OAAjC;AACD;;AAED,YAAM,QAAQ,SAAS,MAAI,CAAC,QAAL,CAAc,YAAd,CAA2B,KAAlD;AACA,YAAM,SAAS,GAAG,QAAQ,IAAI,IAAZ,GAAmB,IAAnB,GAA0B,QAAQ,CAAC,wBAArD;;AACA,UAAI,SAAS,IAAI,IAAjB,EAAuB;AACrB,cAAM,IAAI,KAAJ,CAAU,+DAAV,CAAN;AACD;;AACD,aAAO,SAAP;AAXgC;AAYjC;;AAEa,EAAA,aAAN,CAAoB,OAApB,EAAqC,IAArC,EAAiD,SAAjD,EAAoE,UAApE,EAA6F;AAAA;;AAAA;AACnG,YAAM,OAAO,GAAG,MAAI,CAAC,QAAL,CAAc,OAA9B;AACA,YAAM,OAAO,GAAG,MAAI,CAAC,OAArB;AACA,YAAM,UAAU,GAAG,QAAQ,OAAO,CAAC,eAAe,MAAlD;AACA,YAAM,WAAW,GAAG,OAAO,CAAC,WAAR,IAAuB,OAAO,CAAC,WAAnD;AACA,YAAM,QAAQ,GAAG,OAAO,0BAAS,IAAI,CAAC,IAAL,CAAU,oCAAgB,MAAhB,CAAV,EAAmC,kBAAnC,CAAT,EAAiE,MAAjE,CAAP,EACd,OADc,CACN,qBADM,EACiB,CAAC,KAAD,EAAQ,EAAR,KAAsB;AACpD,gBAAQ,EAAR;AACE,eAAK,WAAL;AACE,mBAAO,SAAP;;AAEF,eAAK,sBAAL;AACE,kBAAM,IAAI,GAAG,OAAO,CAAC,oBAAR,IAAgC,OAAO,CAAC,WAArD;;AACA,gBAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB,oBAAM,KAAI,wCAAJ,EAA8B,0HAA9B,CAAN;AACD;;AACD,mBAAO,IAAP;;AAEF,eAAK,SAAL;AACE,mBAAO,OAAO,CAAC,4BAAR,CAAqC,OAAO,CAAC,cAAR,KAA2B,IAAhE,CAAP;;AAEF,eAAK,eAAL;AACE,kBAAM,MAAM,GAAG,OAAO,CAAC,aAAR,IAAyB,OAAO,CAAC,YAAjC,IAAiD,OAAO,CAAC,IAAxE;;AACA,gBAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAD,CAAP,EAAY,EAAZ,CAAT,CAAV,EAAqC;AACnC,kBAAI,OAAO,GAAG,kDAAkD,MAAM,GAAtE;;AACA,kBAAI,OAAO,CAAC,aAAR,IAAyB,IAA7B,EAAmC;AACjC,gBAAA,OAAO,IAAI,wEAAX;AACD;;AACD,oBAAM,KAAI,wCAAJ,EAA8B,OAA9B,CAAN;AACD;;AACD,mBAAO,MAAP;;AAEF,eAAK,cAAL;AACE,mBAAO,OAAO,CAAC,YAAR,IAAyB,OAAO,CAAC,IAAxC;;AAEF,eAAK,YAAL;AACE,mBAAO,UAAP;;AAEF,eAAK,aAAL;AACE,mBAAO,WAAP;;AAEF,eAAK,aAAL;AACE,mBAAO,OAAO,CAAC,WAAR,IAAuB,OAAO,CAAC,WAAtC;;AAEF,eAAK,iBAAL;AACE,mBAAO,OAAO,CAAC,eAAR,IAA2B,SAAlC;;AAEF,eAAK,MAAL;AACE,mBAAO,uBAAP;;AAEF,eAAK,mBAAL;AACE,mBAAO,+BAAP;;AAEF,eAAK,iBAAL;AACE,mBAAO,6BAAP;;AAEF,eAAK,YAAL;AACE,mBAAO,aAAa,CAAC,UAAD,CAApB;;AAEF,eAAK,aAAL;AACE,mBAAO,cAAc,CAAC,UAAD,EAAa,OAAO,CAAC,eAAR,IAA2B,KAAxC,CAArB;;AAEF,eAAK,cAAL;AACE,mBAAO,eAAe,CAAC,UAAD,CAAtB;;AAEF,eAAK,MAAL;AACE,mBAAO,IAAI,KAAK,oBAAK,IAAd,GAAqB,KAArB,GAA6B,KAApC;;AAEF,eAAK,mBAAL;AACE,mBAAO,mBAAmB,CAAC,4BAAQ,OAAO,CAAC,SAAhB,CAAD,CAA1B;;AAEF,eAAK,YAAL;AACE,mBAAO,MAAI,CAAC,aAAL,CAAmB,UAAnB,EAA+B,WAA/B,CAAP;;AAEF;AACE,kBAAM,IAAI,KAAJ,CAAU,SAAS,EAAE,iBAArB,CAAN;AApEJ;AAsED,OAxEc,CAAjB;AAyEA,YAAM,2BAAU,OAAV,EAAmB,QAAnB,CAAN;AA9EmG;AA+EpG;;AAEO,EAAA,aAAa,CAAC,UAAD,EAAqB,WAArB,EAAwC;AAC3D,UAAM,UAAU,GAAG,4BAAQ,KAAK,QAAL,CAAc,MAAd,CAAqB,SAA7B,EAChB,MADgB,CACT,4BAAQ,KAAK,QAAL,CAAc,4BAAd,CAA2C,SAAnD,CADS,CAAnB;AAGA,QAAI,wBAAwB,GAAG,KAAK,OAAL,CAAa,sBAA5C;;AACA,QAAI,wBAAwB,KAAK,SAAjC,EAA4C;AAC1C,YAAM,IAAI,GAAG,KAAK,QAAL,CAAc,IAAd,CAAmB,QAAnB,CAA4B,YAAzC;AACA,MAAA,wBAAwB,GAAG,IAAI,IAAI,IAAR,IAAgB,IAAI,CAAC,+BAAD,CAAJ,IAAyC,IAApF;AACD;;AAED,QAAI,CAAC,wBAAD,IAA6B,UAAU,CAAC,MAAX,KAAsB,CAAvD,EAA0D;AACxD,aAAO,EAAP;AACD;;AAED,QAAI,UAAU,GAAG,cAAjB;;AAEA,QAAI,wBAAJ,EAA8B;AAC5B,MAAA,UAAU,IAAI;wEACoD,UAAU;mFACC,WAAW;6BAFxF;AAID;;AAED,SAAK,MAAM,QAAX,IAAuB,UAAvB,EAAmC;AACjC,WAAK,MAAM,MAAX,IAAqB,4BAAQ,QAAQ,CAAC,OAAjB,CAArB,EAAgD;AAC9C,QAAA,UAAU,IAAI;;kCAEY,MAAM;kCACN,QAAQ,CAAC,IAAI;;2BAHvC;AAMD;AACF;;AAED,IAAA,UAAU,IAAI,eAAd;AACA,WAAO,UAAP;AACD;;AArQ2C,C,CAwQ9C;;;;;AACA,SAAS,mBAAT,CAA6B,aAA7B,EAA4E;AAC1E,MAAI,aAAa,IAAI,IAAjB,IAAyB,aAAa,CAAC,MAAd,KAAyB,CAAtD,EAAyD;AACvD,IAAA,aAAa,GAAG,CAAC,qBAAD,CAAhB;AACD;;AACD,SAAO,aAAa,CAAC,GAAd,CAAkB,EAAE,IAAI,uBAAuB,EAAE,CAAC,OAAH,CAAW,IAAX,EAAiB,GAAjB,CAAqB,MAApE,EAA4E,IAA5E,CAAiF,IAAjF,CAAP;AACD;;AAED,SAAS,aAAT,CAAuB,UAAvB,EAAgD;AAC9C,MAAI,sBAAsB,CAAC,UAAD,EAAa,eAAb,CAA1B,EAAyD;AACvD,WAAO,sFAAP;AACD,GAFD,MAGK;AACH,WAAO,EAAP;AACD;AACF;;AAED,SAAS,cAAT,CAAwB,UAAxB,EAAmD,eAAnD,EAA2E;AACzE,QAAM,YAAY,GAAkB,CAAC,kBAAD,EAAqB,+CAArB,CAApC;;AAEA,MAAI,sBAAsB,CAAC,UAAD,EAAa,eAAb,CAA1B,EAAyD;AACvD,IAAA,YAAY,CAAC,IAAb,CAAkB,2CAAlB;AACD;;AACD,MAAI,sBAAsB,CAAC,UAAD,EAAa,eAAb,CAA1B,EAAyD;AACvD,IAAA,YAAY,CAAC,IAAb,CAAkB,yCAAlB;AACD;;AAED,MAAI,eAAJ,EAAqB;AACnB,IAAA,YAAY,CAAC,IAAb,CAAkB,GAAlB;AACA,IAAA,YAAY,CAAC,IAAb,CAAkB,uBAAlB;AACA,IAAA,YAAY,CAAC,IAAb,CAAkB,aAAlB,EAAiC,wBAAjC,EAA2D,IAA3D;AACA,IAAA,YAAY,CAAC,IAAb,CAAkB,aAAlB,EAAiC,0BAAjC,EAA6D,IAA7D;AACA,IAAA,YAAY,CAAC,IAAb,CAAkB,wBAAlB;AACA,IAAA,YAAY,CAAC,IAAb,CAAkB,oBAAlB;AACD,GAPD,MAOO;AACL,IAAA,YAAY,CAAC,IAAb,CAAkB,IAAlB;AACD;;AACD,SAAO,YAAY,CAAC,IAAb,CAAkB,GAAlB,CAAP;AACD;;AAED,SAAS,eAAT,CAAyB,UAAzB,EAAkD;AAChD,MAAI,sBAAsB,CAAC,UAAD,EAAa,kBAAb,CAA1B,EAA4D;AAC1D,WAAO,uDAAP;AACD,GAFD,MAGK;AACH,WAAO,EAAP;AACD;AACF;;AAED,SAAS,sBAAT,CAAgC,UAAhC,EAA2D,YAA3D,EAA+E;AAC7E,QAAM,gBAAgB,GAAG,YAAY,CAAC,SAAb,CAAuB,CAAvB,EAA0B,YAAY,CAAC,OAAb,CAAqB,GAArB,CAA1B,CAAzB;AACA,SAAO,UAAU,CAAC,IAAX,CAAgB,EAAE,IAAI,EAAE,CAAC,QAAH,CAAY,gBAAZ,CAAtB,CAAP;AACD;;AAED,SAAS,sBAAT,CAAgC,UAAhC,EAAyD;AACvD,SAAO,UAAU,CAAC,IAAX,CAAgB,EAAE,IAAI,EAAE,CAAC,QAAH,CAAY,SAAZ,KAA0B,EAAE,CAAC,QAAH,CAAY,cAAZ,CAAhD,CAAP;AACD,C","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, asArray, deepAssign, InvalidConfigurationError, log } from \"builder-util\"\nimport { copyOrLinkFile, walk } from \"builder-util/out/fs\"\nimport { emptyDir, readdir, readFile, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { AppXOptions } from \"../\"\nimport { getSignVendorPath, isOldWin6 } from \"../codeSign/windowsCodeSign\"\nimport { Target } from \"../core\"\nimport { getTemplatePath } from \"../util/pathManager\"\nimport { VmManager } from \"../vm/vm\"\nimport { WinPackager } from \"../winPackager\"\nimport { createStageDir } from \"./targetUtil\"\n\nconst APPX_ASSETS_DIR_NAME = \"appx\"\n\nconst vendorAssetsForDefaultAssets: { [key: string]: string; } = {\n  \"StoreLogo.png\": \"SampleAppx.50x50.png\",\n  \"Square150x150Logo.png\": \"SampleAppx.150x150.png\",\n  \"Square44x44Logo.png\": \"SampleAppx.44x44.png\",\n  \"Wide310x150Logo.png\": \"SampleAppx.310x150.png\",\n}\n\nconst DEFAULT_RESOURCE_LANG = \"en-US\"\n\nexport default class AppXTarget extends Target {\n  readonly options: AppXOptions = deepAssign({}, this.packager.platformSpecificBuildOptions, this.packager.config.appx)\n\n  constructor(private readonly packager: WinPackager, readonly outDir: string) {\n    super(\"appx\")\n\n    if (process.platform !== \"darwin\" && (process.platform !== \"win32\" || isOldWin6())) {\n      throw new Error(\"AppX is supported only on Windows 10 or Windows Server 2012 R2 (version number 6.3+)\")\n    }\n  }\n\n  // https://docs.microsoft.com/en-us/windows/uwp/packaging/create-app-package-with-makeappx-tool#mapping-files\n  async build(appOutDir: string, arch: Arch): Promise<any> {\n    const packager = this.packager\n    const artifactName = packager.expandArtifactBeautyNamePattern(this.options, \"appx\", arch)\n    const artifactPath = path.join(this.outDir, artifactName)\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: \"AppX\",\n      file: artifactPath,\n      arch,\n    })\n\n    const vendorPath = await getSignVendorPath()\n    const vm = await packager.vm.value\n\n    const stageDir = await createStageDir(this, packager, arch)\n\n    const mappingFile = stageDir.getTempFile(\"mapping.txt\")\n    const makeAppXArgs = [\"pack\", \"/o\" /* overwrite the output file if it exists */,\n      \"/f\", vm.toVmFile(mappingFile),\n      \"/p\", vm.toVmFile(artifactPath),\n    ]\n    if (packager.compression === \"store\") {\n      makeAppXArgs.push(\"/nc\")\n    }\n\n    const mappingList: Array<Array<string>> = []\n    mappingList.push(await BluebirdPromise.map(walk(appOutDir), file => {\n      let appxPath = file.substring(appOutDir.length + 1)\n      if (path.sep !== \"\\\\\") {\n        appxPath = appxPath.replace(/\\//g, \"\\\\\")\n      }\n      return `\"${vm.toVmFile(file)}\" \"app\\\\${appxPath}\"`\n    }))\n\n    const userAssetDir = await this.packager.getResource(undefined, APPX_ASSETS_DIR_NAME)\n    const assetInfo = await AppXTarget.computeUserAssets(vm, vendorPath, userAssetDir)\n    const userAssets = assetInfo.userAssets\n\n    const manifestFile = stageDir.getTempFile(\"AppxManifest.xml\")\n    await this.writeManifest(manifestFile, arch, await this.computePublisherName(), userAssets)\n    mappingList.push(assetInfo.mappings)\n    mappingList.push([`\"${vm.toVmFile(manifestFile)}\" \"AppxManifest.xml\"`])\n\n    if (isScaledAssetsProvided(userAssets)) {\n      const outFile = vm.toVmFile(stageDir.getTempFile(\"resources.pri\"))\n      const makePriPath = vm.toVmFile(path.join(vendorPath, \"windows-10\", Arch[arch], \"makepri.exe\"))\n\n      const assetRoot = stageDir.getTempFile(\"appx/assets\")\n      await emptyDir(assetRoot)\n      await BluebirdPromise.map(assetInfo.allAssets, it => copyOrLinkFile(it, path.join(assetRoot, path.basename(it))))\n\n      await vm.exec(makePriPath, [\"new\",\n        \"/Overwrite\",\n        \"/Manifest\", vm.toVmFile(manifestFile),\n        \"/ProjectRoot\", vm.toVmFile(path.dirname(assetRoot)),\n        \"/ConfigXml\", vm.toVmFile(path.join(getTemplatePath(\"appx\"), \"priconfig.xml\")),\n        \"/OutputFile\", outFile,\n      ])\n\n      // in addition to resources.pri, resources.scale-140.pri and other such files will be generated\n      for (const resourceFile of (await readdir(stageDir.dir)).filter(it => it.startsWith(\"resources.\")).sort()) {\n        mappingList.push([`\"${vm.toVmFile(stageDir.getTempFile(resourceFile))}\" \"${resourceFile}\"`])\n      }\n      makeAppXArgs.push(\"/l\")\n    }\n\n    let mapping = \"[Files]\"\n    for (const list of mappingList) {\n      mapping += \"\\r\\n\" + list.join(\"\\r\\n\")\n    }\n    await writeFile(mappingFile, mapping)\n    packager.debugLogger.add(\"appx.mapping\", mapping)\n\n    if (this.options.makeappxArgs != null) {\n      makeAppXArgs.push(...this.options.makeappxArgs)\n    }\n    await vm.exec(vm.toVmFile(path.join(vendorPath, \"windows-10\", Arch[arch], \"makeappx.exe\")), makeAppXArgs)\n    await packager.sign(artifactPath)\n\n    await stageDir.cleanup()\n\n    await packager.info.callArtifactBuildCompleted({\n      file: artifactPath,\n      packager,\n      arch,\n      safeArtifactName: packager.computeSafeArtifactName(artifactName, \"appx\"),\n      target: this,\n      isWriteUpdateInfo: this.options.electronUpdaterAware,\n    })\n  }\n\n  private static async computeUserAssets(vm: VmManager, vendorPath: string, userAssetDir: string | null) {\n    const mappings: Array<string> = []\n    let userAssets: Array<string>\n    const allAssets: Array<string> = []\n    if (userAssetDir == null) {\n      userAssets = []\n    }\n    else {\n      userAssets = (await readdir(userAssetDir)).filter(it => !it.startsWith(\".\") && !it.endsWith(\".db\") && it.includes(\".\"))\n      for (const name of userAssets) {\n        mappings.push(`\"${vm.toVmFile(userAssetDir)}${vm.pathSep}${name}\" \"assets\\\\${name}\"`)\n        allAssets.push(path.join(userAssetDir, name))\n      }\n    }\n\n    for (const defaultAsset of Object.keys(vendorAssetsForDefaultAssets)) {\n      if (userAssets.length === 0 || !isDefaultAssetIncluded(userAssets, defaultAsset)) {\n        const file = path.join(vendorPath, \"appxAssets\", vendorAssetsForDefaultAssets[defaultAsset])\n        mappings.push(`\"${vm.toVmFile(file)}\" \"assets\\\\${defaultAsset}\"`)\n        allAssets.push(file)\n      }\n    }\n\n    // we do not use process.arch to build path to tools, because even if you are on x64, ia32 appx tool must be used if you build appx for ia32\n    return {userAssets, mappings, allAssets}\n  }\n\n  // https://github.com/electron-userland/electron-builder/issues/2108#issuecomment-333200711\n  private async computePublisherName() {\n    if (await this.packager.cscInfo.value == null) {\n      log.info({reason: \"Windows Store only build\"}, \"AppX is not signed\")\n      return this.options.publisher || \"CN=ms\"\n    }\n\n    const certInfo = await this.packager.lazyCertInfo.value\n    const publisher = certInfo == null ? null : certInfo.bloodyMicrosoftSubjectDn\n    if (publisher == null) {\n      throw new Error(\"Internal error: cannot compute subject using certificate info\")\n    }\n    return publisher\n  }\n\n  private async writeManifest(outFile: string, arch: Arch, publisher: string, userAssets: Array<string>) {\n    const appInfo = this.packager.appInfo\n    const options = this.options\n    const executable = `app\\\\${appInfo.productFilename}.exe`\n    const displayName = options.displayName || appInfo.productName\n    const manifest = (await readFile(path.join(getTemplatePath(\"appx\"), \"appxmanifest.xml\"), \"utf8\"))\n      .replace(/\\${([a-zA-Z0-9]+)}/g, (match, p1): string => {\n        switch (p1) {\n          case \"publisher\":\n            return publisher\n\n          case \"publisherDisplayName\":\n            const name = options.publisherDisplayName || appInfo.companyName\n            if (name == null) {\n              throw new InvalidConfigurationError(`Please specify \"author\" in the application package.json â€” it is required because \"appx.publisherDisplayName\" is not set.`)\n            }\n            return name\n\n          case \"version\":\n            return appInfo.getVersionInWeirdWindowsForm(options.setBuildNumber === true)\n\n          case \"applicationId\":\n            const result = options.applicationId || options.identityName || appInfo.name\n            if (!isNaN(parseInt(result[0], 10))) {\n              let message = `AppX Application.Id canâ€™t start with numbers: \"${result}\"`\n              if (options.applicationId == null) {\n                message += `\\nPlease set appx.applicationId (or correct appx.identityName or name)`\n              }\n              throw new InvalidConfigurationError(message)\n            }\n            return result\n\n          case \"identityName\":\n            return options.identityName  || appInfo.name\n\n          case \"executable\":\n            return executable\n\n          case \"displayName\":\n            return displayName\n\n          case \"description\":\n            return appInfo.description || appInfo.productName\n\n          case \"backgroundColor\":\n            return options.backgroundColor || \"#464646\"\n\n          case \"logo\":\n            return \"assets\\\\StoreLogo.png\"\n\n          case \"square150x150Logo\":\n            return \"assets\\\\Square150x150Logo.png\"\n\n          case \"square44x44Logo\":\n            return \"assets\\\\Square44x44Logo.png\"\n\n          case \"lockScreen\":\n            return lockScreenTag(userAssets)\n\n          case \"defaultTile\":\n            return defaultTileTag(userAssets, options.showNameOnTiles || false)\n\n          case \"splashScreen\":\n            return splashScreenTag(userAssets)\n\n          case \"arch\":\n            return arch === Arch.ia32 ? \"x86\" : \"x64\"\n\n          case \"resourceLanguages\":\n            return resourceLanguageTag(asArray(options.languages))\n\n          case \"extensions\":\n            return this.getExtensions(executable, displayName)\n\n          default:\n            throw new Error(`Macro ${p1} is not defined`)\n        }\n      })\n    await writeFile(outFile, manifest)\n  }\n\n  private getExtensions(executable: string, displayName: string): string {\n    const uriSchemes = asArray(this.packager.config.protocols)\n      .concat(asArray(this.packager.platformSpecificBuildOptions.protocols))\n\n    let isAddAutoLaunchExtension = this.options.addAutoLaunchExtension\n    if (isAddAutoLaunchExtension === undefined) {\n      const deps = this.packager.info.metadata.dependencies\n      isAddAutoLaunchExtension = deps != null && deps[\"electron-winstore-auto-launch\"] != null\n    }\n\n    if (!isAddAutoLaunchExtension && uriSchemes.length === 0) {\n      return \"\"\n    }\n\n    let extensions = \"<Extensions>\"\n\n    if (isAddAutoLaunchExtension) {\n      extensions += `\n        <desktop:Extension Category=\"windows.startupTask\" Executable=\"${executable}\" EntryPoint=\"Windows.FullTrustApplication\">\n          <desktop:StartupTask TaskId=\"SlackStartup\" Enabled=\"true\" DisplayName=\"${displayName}\" />\n        </desktop:Extension>`\n    }\n\n    for (const protocol of uriSchemes) {\n      for (const scheme of asArray(protocol.schemes)) {\n        extensions += `\n          <uap:Extension Category=\"windows.protocol\">\n            <uap:Protocol Name=\"${scheme}\">\n               <uap:DisplayName>${protocol.name}</uap:DisplayName>\n             </uap:Protocol>\n          </uap:Extension>`\n      }\n    }\n\n    extensions += \"</Extensions>\"\n    return extensions\n  }\n}\n\n// get the resource - language tag, see https://docs.microsoft.com/en-us/windows/uwp/globalizing/manage-language-and-region#specify-the-supported-languages-in-the-apps-manifest\nfunction resourceLanguageTag(userLanguages: Array<string> | null | undefined): string {\n  if (userLanguages == null || userLanguages.length === 0) {\n    userLanguages = [DEFAULT_RESOURCE_LANG]\n  }\n  return userLanguages.map(it => `<Resource Language=\"${it.replace(/_/g, \"-\")}\" />`).join(\"\\n\")\n}\n\nfunction lockScreenTag(userAssets: Array<string>): string {\n  if (isDefaultAssetIncluded(userAssets, \"BadgeLogo.png\")) {\n    return '<uap:LockScreen Notification=\"badgeAndTileText\" BadgeLogo=\"assets\\\\BadgeLogo.png\" />'\n  }\n  else {\n    return \"\"\n  }\n}\n\nfunction defaultTileTag(userAssets: Array<string>, showNameOnTiles: boolean): string {\n  const defaultTiles: Array<string> = [\"<uap:DefaultTile\", 'Wide310x150Logo=\"assets\\\\Wide310x150Logo.png\"']\n\n  if (isDefaultAssetIncluded(userAssets, \"LargeTile.png\")) {\n    defaultTiles.push('Square310x310Logo=\"assets\\\\LargeTile.png\"')\n  }\n  if (isDefaultAssetIncluded(userAssets, \"SmallTile.png\")) {\n    defaultTiles.push('Square71x71Logo=\"assets\\\\SmallTile.png\"')\n  }\n\n  if (showNameOnTiles) {\n    defaultTiles.push(\">\")\n    defaultTiles.push(\"<uap:ShowNameOnTiles>\")\n    defaultTiles.push(\"<uap:ShowOn\", 'Tile=\"wide310x150Logo\"', \"/>\")\n    defaultTiles.push(\"<uap:ShowOn\", 'Tile=\"square150x150Logo\"', \"/>\")\n    defaultTiles.push(\"</uap:ShowNameOnTiles>\")\n    defaultTiles.push(\"</uap:DefaultTile>\")\n  } else {\n    defaultTiles.push(\"/>\")\n  }\n  return defaultTiles.join(\" \")\n}\n\nfunction splashScreenTag(userAssets: Array<string>): string {\n  if (isDefaultAssetIncluded(userAssets, \"SplashScreen.png\")) {\n    return '<uap:SplashScreen Image=\"assets\\\\SplashScreen.png\" />'\n  }\n  else {\n    return \"\"\n  }\n}\n\nfunction isDefaultAssetIncluded(userAssets: Array<string>, defaultAsset: string) {\n  const defaultAssetName = defaultAsset.substring(0, defaultAsset.indexOf(\".\"))\n  return userAssets.some(it => it.includes(defaultAssetName))\n}\n\nfunction isScaledAssetsProvided(userAssets: Array<string>) {\n  return userAssets.some(it => it.includes(\".scale-\") || it.includes(\".targetsize-\"))\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ArchiveTarget = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _fileMatcher() {
  const data = require("../fileMatcher");

  _fileMatcher = function () {
    return data;
  };

  return data;
}

function _archive() {
  const data = require("./archive");

  _archive = function () {
    return data;
  };

  return data;
}

function _differentialUpdateInfoBuilder() {
  const data = require("./differentialUpdateInfoBuilder");

  _differentialUpdateInfoBuilder = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class ArchiveTarget extends _core().Target {
  constructor(name, outDir, packager, isWriteUpdateInfo = false) {
    super(name);
    this.outDir = outDir;
    this.packager = packager;
    this.isWriteUpdateInfo = isWriteUpdateInfo;
    this.options = this.packager.config[this.name];
  }

  build(appOutDir, arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;

      const isMac = packager.platform === _core().Platform.MAC;

      const format = _this.name;
      let defaultPattern;

      if (packager.platform === _core().Platform.LINUX) {
        // tslint:disable-next-line:no-invalid-template-strings
        defaultPattern = "${name}-${version}" + (arch === _builderUtil().Arch.x64 ? "" : "-${arch}") + ".${ext}";
      } else {
        // tslint:disable-next-line:no-invalid-template-strings
        defaultPattern = "${productName}-${version}" + (arch === _builderUtil().Arch.x64 ? "" : "-${arch}") + "-${os}.${ext}";
      }

      const artifactName = packager.expandArtifactNamePattern(_this.options, format, arch, defaultPattern, false);
      const artifactPath = path.join(_this.outDir, artifactName);
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: `${isMac ? "macOS " : ""}${format}`,
        file: artifactPath,
        arch
      });
      let updateInfo = null;

      if (format.startsWith("tar.")) {
        yield (0, _archive().tar)(packager.compression, format, artifactPath, appOutDir, isMac, packager.info.tempDirManager);
      } else {
        let withoutDir = !isMac;
        let dirToArchive = appOutDir;

        if (isMac) {
          dirToArchive = path.dirname(appOutDir);
          const fileMatchers = (0, _fileMatcher().getFileMatchers)(packager.config, "extraDistFiles", dirToArchive, packager.createGetFileMatchersOptions(_this.outDir, arch, packager.platformSpecificBuildOptions));

          if (fileMatchers == null) {
            dirToArchive = appOutDir;
          } else {
            yield (0, _fileMatcher().copyFiles)(fileMatchers, null, true);
            withoutDir = true;
          }
        }

        const archiveOptions = {
          compression: packager.compression,
          withoutDir
        };
        yield (0, _archive().archive)(format, artifactPath, dirToArchive, archiveOptions);

        if (_this.isWriteUpdateInfo && format === "zip") {
          updateInfo = yield (0, _differentialUpdateInfoBuilder().appendBlockmap)(artifactPath);
        }
      }

      yield packager.info.callArtifactBuildCompleted({
        updateInfo,
        file: artifactPath,
        // tslint:disable-next-line:no-invalid-template-strings
        safeArtifactName: packager.computeSafeArtifactName(artifactName, format, arch, false, defaultPattern.replace("${productName}", "${name}")),
        target: _this,
        arch,
        packager,
        isWriteUpdateInfo: _this.isWriteUpdateInfo
      });
    })();
  }

} exports.ArchiveTarget = ArchiveTarget;
// __ts-babel@6.0.4
//# sourceMappingURL=ArchiveTarget.js.map{"version":3,"sources":["../../src/targets/ArchiveTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch } from \"builder-util\"\nimport * as path from \"path\"\nimport { Platform, Target, TargetSpecificOptions } from \"../core\"\nimport { copyFiles, getFileMatchers } from \"../fileMatcher\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { archive, tar } from \"./archive\"\nimport { appendBlockmap } from \"./differentialUpdateInfoBuilder\"\n\nexport class ArchiveTarget extends Target {\n  readonly options: TargetSpecificOptions = (this.packager.config as any)[this.name]\n\n  constructor(name: string, readonly outDir: string, private readonly packager: PlatformPackager<any>, private readonly isWriteUpdateInfo = false) {\n    super(name)\n  }\n\n  async build(appOutDir: string, arch: Arch): Promise<any> {\n    const packager = this.packager\n    const isMac = packager.platform === Platform.MAC\n    const format = this.name\n\n    let defaultPattern: string\n    if (packager.platform === Platform.LINUX) {\n      // tslint:disable-next-line:no-invalid-template-strings\n      defaultPattern = \"${name}-${version}\" + (arch === Arch.x64 ? \"\" : \"-${arch}\") + \".${ext}\"\n    }\n    else {\n      // tslint:disable-next-line:no-invalid-template-strings\n      defaultPattern = \"${productName}-${version}\" + (arch === Arch.x64 ? \"\" : \"-${arch}\") + \"-${os}.${ext}\"\n    }\n\n    const artifactName = packager.expandArtifactNamePattern(this.options, format, arch, defaultPattern, false)\n    const artifactPath = path.join(this.outDir, artifactName)\n\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: `${isMac ? \"macOS \" : \"\"}${format}`,\n      file: artifactPath,\n      arch,\n    })\n    let updateInfo: any = null\n    if (format.startsWith(\"tar.\")) {\n      await tar(packager.compression, format, artifactPath, appOutDir, isMac, packager.info.tempDirManager)\n    }\n    else {\n      let withoutDir = !isMac\n      let dirToArchive = appOutDir\n      if (isMac) {\n        dirToArchive = path.dirname(appOutDir)\n        const fileMatchers = getFileMatchers(packager.config, \"extraDistFiles\", dirToArchive, packager.createGetFileMatchersOptions(this.outDir, arch, packager.platformSpecificBuildOptions))\n        if (fileMatchers == null) {\n          dirToArchive = appOutDir\n        }\n        else {\n          await copyFiles(fileMatchers, null, true)\n          withoutDir = true\n        }\n      }\n\n      const archiveOptions = {\n        compression: packager.compression,\n        withoutDir,\n      }\n      await archive(format, artifactPath, dirToArchive, archiveOptions)\n\n      if (this.isWriteUpdateInfo && format === \"zip\") {\n        updateInfo = await appendBlockmap(artifactPath)\n      }\n    }\n\n    await packager.info.callArtifactBuildCompleted({\n      updateInfo,\n      file: artifactPath,\n      // tslint:disable-next-line:no-invalid-template-strings\n      safeArtifactName: packager.computeSafeArtifactName(artifactName, format, arch, false, defaultPattern.replace(\"${productName}\", \"${name}\")),\n      target: this,\n      arch,\n      packager,\n      isWriteUpdateInfo: this.isWriteUpdateInfo,\n    })\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.LinuxTargetHelper = exports.installPrefix = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

const installPrefix = "/opt";
exports.installPrefix = installPrefix;

class LinuxTargetHelper {
  constructor(packager) {
    this.packager = packager;
    this.iconPromise = new (_lazyVal().Lazy)(() => this.computeDesktopIcons());
    this.maxIconPath = null;
  }

  get icons() {
    return this.iconPromise.value;
  } // must be name without spaces and other special characters, but not product name used


  computeDesktopIcons() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;
      const iconDir = packager.platformSpecificBuildOptions.icon;
      const sources = iconDir == null ? [] : [iconDir];
      const commonConfiguration = packager.config;
      const icnsPath = (commonConfiguration.mac || {}).icon || commonConfiguration.icon;

      if (icnsPath != null) {
        sources.push(icnsPath);
      } // need to put here and not as default because need to resolve image size


      const result = yield packager.resolveIcon(sources, (0, _builderUtil().asArray)(packager.getDefaultFrameworkIcon()), "set");
      _this.maxIconPath = result[result.length - 1].file;
      return result;
    })();
  }

  getDescription(options) {
    return options.description || this.packager.appInfo.description;
  }

  writeDesktopEntry(targetSpecificOptions, exec, destination, extra) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const data = yield _this2.computeDesktopEntry(targetSpecificOptions, exec, extra);
      const file = destination || (yield _this2.packager.getTempFile(`${_this2.packager.appInfo.productFilename}.desktop`));
      yield (0, _fsExtraP().outputFile)(file, data);
      return file;
    })();
  }

  computeDesktopEntry(targetSpecificOptions, exec, extra) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (exec != null && exec.length === 0) {
        throw new Error("Specified exec is empty");
      } // https://github.com/electron-userland/electron-builder/issues/3418


      if (targetSpecificOptions.desktop != null && targetSpecificOptions.desktop.Exec != null) {
        throw new Error("Please specify executable name as linux.executableName instead of linux.desktop.Exec");
      }

      const packager = _this3.packager;
      const appInfo = packager.appInfo;
      const productFilename = appInfo.productFilename;
      const desktopMeta = Object.assign({
        Name: appInfo.productName,
        Comment: _this3.getDescription(targetSpecificOptions),
        Exec: exec == null ? `"${installPrefix}/${productFilename}/${packager.executableName}" %U` : exec,
        Terminal: "false",
        Type: "Application",
        Icon: packager.executableName,
        // https://askubuntu.com/questions/367396/what-represent-the-startupwmclass-field-of-a-desktop-file
        // must be set to package.json name (because it is Electron set WM_CLASS)
        // to get WM_CLASS of running window: xprop WM_CLASS
        // StartupWMClass doesn't work for unicode
        // https://github.com/electron/electron/blob/2-0-x/atom/browser/native_window_views.cc#L226
        StartupWMClass: appInfo.productName
      }, extra, targetSpecificOptions.desktop);
      const mimeTypes = (0, _builderUtil().asArray)(targetSpecificOptions.mimeTypes);

      for (const fileAssociation of packager.fileAssociations) {
        if (fileAssociation.mimeType != null) {
          mimeTypes.push(fileAssociation.mimeType);
        }
      }

      for (const protocol of (0, _builderUtil().asArray)(packager.config.protocols).concat((0, _builderUtil().asArray)(packager.platformSpecificBuildOptions.protocols))) {
        for (const scheme of (0, _builderUtil().asArray)(protocol.schemes)) {
          mimeTypes.push(`x-scheme-handler/${scheme}`);
        }
      }

      if (mimeTypes.length !== 0) {
        desktopMeta.MimeType = mimeTypes.join(";") + ";";
      }

      let category = targetSpecificOptions.category;

      if ((0, _builderUtil().isEmptyOrSpaces)(category)) {
        const macCategory = (packager.config.mac || {}).category;

        if (macCategory != null) {
          category = macToLinuxCategory[macCategory];
        }

        if (category == null) {
          // https://github.com/develar/onshape-desktop-shell/issues/48
          if (macCategory != null) {
            _builderUtil().log.warn({
              macCategory
            }, "cannot map macOS category to Linux. If possible mapping is known for you, please file issue to add it.");
          }

          _builderUtil().log.warn({
            reason: "linux.category is not set and cannot map from macOS",
            docs: "https://www.electron.build/configuration/linux"
          }, "application Linux category is set to default \"Utility\"");

          category = "Utility";
        }
      }

      desktopMeta.Categories = `${category}${category.endsWith(";") ? "" : ";"}`;
      let data = `[Desktop Entry]`;

      for (const name of Object.keys(desktopMeta)) {
        data += `\n${name}=${desktopMeta[name]}`;
      }

      data += "\n";
      return data;
    })();
  }

}

exports.LinuxTargetHelper = LinuxTargetHelper;
const macToLinuxCategory = {
  "public.app-category.graphics-design": "Graphics",
  "public.app-category.developer-tools": "Development",
  "public.app-category.education": "Education",
  "public.app-category.games": "Game",
  "public.app-category.video": "Video;AudioVideo",
  "public.app-category.utilities": "Utility",
  "public.app-category.social-networking": "Network;Chat",
  "public.app-category.finance": "Office;Finance"
}; 
// __ts-babel@6.0.4
//# sourceMappingURL=LinuxTargetHelper.js.map{"version":3,"sources":["../../src/targets/LinuxTargetHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { asArray, isEmptyOrSpaces, log } from \"builder-util\"\nimport { outputFile } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport { LinuxTargetSpecificOptions } from \"..\"\nimport { LinuxPackager } from \"../linuxPackager\"\nimport { IconInfo } from \"../platformPackager\"\n\nexport const installPrefix = \"/opt\"\n\nexport class LinuxTargetHelper {\n  private readonly iconPromise = new Lazy(() => this.computeDesktopIcons())\n\n  maxIconPath: string | null = null\n\n  constructor(private packager: LinuxPackager) {\n  }\n\n  get icons(): Promise<Array<IconInfo>> {\n    return this.iconPromise.value\n  }\n\n  // must be name without spaces and other special characters, but not product name used\n  private async computeDesktopIcons(): Promise<Array<IconInfo>> {\n    const packager = this.packager\n    const iconDir = packager.platformSpecificBuildOptions.icon\n    const sources = iconDir == null ? [] : [iconDir]\n\n    const commonConfiguration = packager.config\n    const icnsPath = (commonConfiguration.mac || {}).icon || commonConfiguration.icon\n    if (icnsPath != null) {\n      sources.push(icnsPath)\n    }\n\n    // need to put here and not as default because need to resolve image size\n    const result = await packager.resolveIcon(sources, asArray(packager.getDefaultFrameworkIcon()), \"set\")\n    this.maxIconPath = result[result.length - 1].file\n    return result\n  }\n\n  getDescription(options: LinuxTargetSpecificOptions) {\n    return options.description || this.packager.appInfo.description\n  }\n\n  async writeDesktopEntry(targetSpecificOptions: LinuxTargetSpecificOptions, exec?: string, destination?: string | null, extra?: { [key: string]: string; }): Promise<string> {\n    const data = await this.computeDesktopEntry(targetSpecificOptions, exec, extra)\n    const file = destination || await this.packager.getTempFile(`${this.packager.appInfo.productFilename}.desktop`)\n    await outputFile(file, data)\n    return file\n  }\n\n  async computeDesktopEntry(targetSpecificOptions: LinuxTargetSpecificOptions, exec?: string, extra?: { [key: string]: string; }): Promise<string> {\n    if (exec != null && exec.length === 0) {\n      throw new Error(\"Specified exec is empty\")\n    }\n    // https://github.com/electron-userland/electron-builder/issues/3418\n    if (targetSpecificOptions.desktop != null && targetSpecificOptions.desktop.Exec != null) {\n      throw new Error(\"Please specify executable name as linux.executableName instead of linux.desktop.Exec\")\n    }\n\n    const packager = this.packager\n    const appInfo = packager.appInfo\n\n    const productFilename = appInfo.productFilename\n\n    const desktopMeta: any = {\n      Name: appInfo.productName,\n      Comment: this.getDescription(targetSpecificOptions),\n      Exec: exec == null ? `\"${installPrefix}/${productFilename}/${packager.executableName}\" %U` : exec,\n      Terminal: \"false\",\n      Type: \"Application\",\n      Icon: packager.executableName,\n      // https://askubuntu.com/questions/367396/what-represent-the-startupwmclass-field-of-a-desktop-file\n      // must be set to package.json name (because it is Electron set WM_CLASS)\n      // to get WM_CLASS of running window: xprop WM_CLASS\n      // StartupWMClass doesn't work for unicode\n      // https://github.com/electron/electron/blob/2-0-x/atom/browser/native_window_views.cc#L226\n      StartupWMClass: appInfo.productName,\n      ...extra,\n      ...targetSpecificOptions.desktop,\n    }\n\n    const mimeTypes: Array<string> = asArray(targetSpecificOptions.mimeTypes)\n    for (const fileAssociation of packager.fileAssociations) {\n      if (fileAssociation.mimeType != null) {\n        mimeTypes.push(fileAssociation.mimeType)\n      }\n    }\n\n    for (const protocol of asArray(packager.config.protocols).concat(asArray(packager.platformSpecificBuildOptions.protocols))) {\n      for (const scheme of asArray(protocol.schemes)) {\n        mimeTypes.push(`x-scheme-handler/${scheme}`)\n      }\n    }\n\n    if (mimeTypes.length !== 0) {\n      desktopMeta.MimeType = mimeTypes.join(\";\") + \";\"\n    }\n\n    let category = targetSpecificOptions.category\n    if (isEmptyOrSpaces(category)) {\n      const macCategory = (packager.config.mac || {}).category\n      if (macCategory != null) {\n        category = macToLinuxCategory[macCategory]\n      }\n\n      if (category == null) {\n        // https://github.com/develar/onshape-desktop-shell/issues/48\n        if (macCategory != null) {\n          log.warn({macCategory}, \"cannot map macOS category to Linux. If possible mapping is known for you, please file issue to add it.\")\n        }\n        log.warn({\n          reason: \"linux.category is not set and cannot map from macOS\",\n          docs: \"https://www.electron.build/configuration/linux\",\n        }, \"application Linux category is set to default \\\"Utility\\\"\")\n        category = \"Utility\"\n      }\n    }\n    desktopMeta.Categories = `${category}${category.endsWith(\";\") ? \"\" : \";\"}`\n\n    let data = `[Desktop Entry]`\n    for (const name of Object.keys(desktopMeta)) {\n      data += `\\n${name}=${desktopMeta[name]}`\n    }\n    data += \"\\n\"\n    return data\n  }\n}\n\nconst macToLinuxCategory: any = {\n  \"public.app-category.graphics-design\": \"Graphics\",\n  \"public.app-category.developer-tools\": \"Development\",\n  \"public.app-category.education\": \"Education\",\n  \"public.app-category.games\": \"Game\",\n  \"public.app-category.video\": \"Video;AudioVideo\",\n  \"public.app-category.utilities\": \"Utility\",\n  \"public.app-category.social-networking\": \"Network;Chat\",\n  \"public.app-category.finance\": \"Office;Finance\",\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _binDownload() {
  const data = require("../binDownload");

  _binDownload = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

function ejs() {
  const data = _interopRequireWildcard(require("ejs"));

  ejs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _CommonWindowsInstallerConfiguration() {
  const data = require("../options/CommonWindowsInstallerConfiguration");

  _CommonWindowsInstallerConfiguration = function () {
    return data;
  };

  return data;
}

function _pathManager() {
  const data = require("../util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

function _vm() {
  const data = require("../vm/vm");

  _vm = function () {
    return data;
  };

  return data;
}

function _WineVm() {
  const data = require("../vm/WineVm");

  _WineVm = function () {
    return data;
  };

  return data;
}

function _targetUtil() {
  const data = require("./targetUtil");

  _targetUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const ELECTRON_BUILDER_UPGRADE_CODE_NS_UUID = _builderUtilRuntime().UUID.parse("d752fe43-5d44-44d5-9fc9-6dd1bf19d5cc");

const ROOT_DIR_ID = "APPLICATIONFOLDER";
const ASSISTED_UI_FILE_NAME = "WixUI_Assisted.wxs";
const projectTemplate = new (_lazyVal().Lazy)(
/*#__PURE__*/
(0, _bluebirdLst().coroutine)(function* () {
  const template = (yield (0, _fsExtraP().readFile)(path.join((0, _pathManager().getTemplatePath)("msi"), "template.xml"), "utf8")).replace(/{{/g, "<%").replace(/}}/g, "%>").replace(/\${([^}]+)}/g, "<%=$1%>");
  return ejs().compile(template);
})); // WiX doesn't support Mono, so, dontnet462 is required to be installed for wine (preinstalled in our bundled wine)

class MsiTarget extends _core().Target {
  constructor(packager, outDir) {
    super("msi");
    this.packager = packager;
    this.outDir = outDir;
    this.vm = process.platform === "win32" ? new (_vm().VmManager)() : new (_WineVm().WineVmManager)();
    this.options = (0, _builderUtil().deepAssign)(this.packager.platformSpecificBuildOptions, this.packager.config.msi);
  }

  build(appOutDir, arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;
      const artifactName = packager.expandArtifactBeautyNamePattern(_this.options, "msi", arch);
      const artifactPath = path.join(_this.outDir, artifactName);
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: "MSI",
        file: artifactPath,
        arch
      });
      const stageDir = yield (0, _targetUtil().createStageDir)(_this, packager, arch);
      const vm = _this.vm;
      const commonOptions = (0, _CommonWindowsInstallerConfiguration().getEffectiveOptions)(_this.options, _this.packager);

      if (commonOptions.isAssisted) {
        // F*** *** ***  ***  ***  ***  ***  ***  ***  ***  ***  ***  *** WiX  ***  ***  ***  ***  ***  ***  ***  ***  ***
        // cannot understand how to set MSIINSTALLPERUSER on radio box change. In any case installed per user.
        _builderUtil().log.warn(`MSI DOESN'T SUPPORT assisted installer. Please use NSIS instead.`);
      }

      const projectFile = stageDir.getTempFile("project.wxs");
      const objectFiles = ["project.wixobj"];
      const uiFile = commonOptions.isAssisted ? stageDir.getTempFile(ASSISTED_UI_FILE_NAME) : null;
      yield (0, _fsExtraP().writeFile)(projectFile, (yield _this.writeManifest(appOutDir, arch, commonOptions)));

      if (uiFile !== null) {
        yield (0, _fsExtraP().writeFile)(uiFile, (yield (0, _fsExtraP().readFile)(path.join((0, _pathManager().getTemplatePath)("msi"), ASSISTED_UI_FILE_NAME), "utf8")));
        objectFiles.push(ASSISTED_UI_FILE_NAME.replace(".wxs", ".wixobj"));
      } // noinspection SpellCheckingInspection


      const vendorPath = yield (0, _binDownload().getBinFromUrl)("wix", "4.0.0.5512.2", "/X5poahdCc3199Vt6AP7gluTlT1nxi9cbbHhZhCMEu+ngyP1LiBMn+oZX7QAZVaKeBMc2SjVp7fJqNLqsUnPNQ=="); // noinspection SpellCheckingInspection

      const candleArgs = ["-arch", arch === _builderUtil().Arch.ia32 ? "x86" : arch === _builderUtil().Arch.armv7l ? "arm" : "x64", `-dappDir=${vm.toVmFile(appOutDir)}`].concat(_this.getCommonWixArgs());
      candleArgs.push("project.wxs");

      if (uiFile !== null) {
        candleArgs.push(ASSISTED_UI_FILE_NAME);
      }

      yield vm.exec(vm.toVmFile(path.join(vendorPath, "candle.exe")), candleArgs, {
        cwd: stageDir.dir
      });
      yield _this.light(objectFiles, vm, artifactPath, appOutDir, vendorPath, stageDir.dir);
      yield stageDir.cleanup();
      yield packager.sign(artifactPath);
      yield packager.info.callArtifactBuildCompleted({
        file: artifactPath,
        packager,
        arch,
        safeArtifactName: packager.computeSafeArtifactName(artifactName, "msi"),
        target: _this,
        isWriteUpdateInfo: false
      });
    })();
  }

  light(objectFiles, vm, artifactPath, appOutDir, vendorPath, tempDir) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      // noinspection SpellCheckingInspection
      const lightArgs = ["-out", vm.toVmFile(artifactPath), "-v", // https://github.com/wixtoolset/issues/issues/5169
      "-spdb", // https://sourceforge.net/p/wix/bugs/2405/
      // error LGHT1076 : ICE61: This product should remove only older versions of itself. The Maximum version is not less than the current product. (1.1.0.42 1.1.0.42)
      "-sw1076", `-dappDir=${vm.toVmFile(appOutDir)}`].concat(_this2.getCommonWixArgs()); // http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Build-3-5-2229-0-give-me-the-following-error-error-LGHT0216-An-unexpected-Win32-exception-with-errorn-td5707443.html

      if (process.platform !== "win32") {
        // noinspection SpellCheckingInspection
        lightArgs.push("-sval");
      }

      if (_this2.options.oneClick === false) {
        lightArgs.push("-ext", "WixUIExtension");
      } // objectFiles - only filenames, we set current directory to our temp stage dir


      lightArgs.push(...objectFiles);
      yield vm.exec(vm.toVmFile(path.join(vendorPath, "light.exe")), lightArgs, {
        cwd: tempDir
      });
    })();
  }

  getCommonWixArgs() {
    const args = ["-pedantic"];

    if (this.options.warningsAsErrors !== false) {
      args.push("-wx");
    }

    return args;
  }

  writeManifest(appOutDir, arch, commonOptions) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appInfo = _this3.packager.appInfo;
      const {
        files,
        dirs
      } = yield _this3.computeFileDeclaration(appOutDir);
      const companyName = appInfo.companyName;

      if (!companyName) {
        _builderUtil().log.warn(`Manufacturer is not set for MSI â€” please set "author" in the package.json`);
      }

      const compression = _this3.packager.compression;
      const options = _this3.options;
      const iconPath = yield _this3.packager.getIconPath();
      return (yield projectTemplate.value)(Object.assign({}, commonOptions, {
        isCreateDesktopShortcut: commonOptions.isCreateDesktopShortcut !== _CommonWindowsInstallerConfiguration().DesktopShortcutCreationPolicy.NEVER,
        isRunAfterFinish: options.runAfterFinish !== false,
        iconPath: iconPath == null ? null : _this3.vm.toVmFile(iconPath),
        compressionLevel: compression === "store" ? "none" : "high",
        version: appInfo.getVersionInWeirdWindowsForm(),
        productName: appInfo.productName,
        upgradeCode: (options.upgradeCode || _builderUtilRuntime().UUID.v5(appInfo.id, ELECTRON_BUILDER_UPGRADE_CODE_NS_UUID)).toUpperCase(),
        manufacturer: companyName || appInfo.productName,
        appDescription: appInfo.description,
        // https://stackoverflow.com/questions/1929038/compilation-error-ice80-the-64bitcomponent-uses-32bitdirectory
        programFilesId: arch === _builderUtil().Arch.x64 ? "ProgramFiles64Folder" : "ProgramFilesFolder",
        // wix in the name because special wix format can be used in the name
        installationDirectoryWixName: (0, _targetUtil().getWindowsInstallationDirName)(appInfo, commonOptions.isPerMachine === true),
        dirs,
        files
      }));
    })();
  }

  computeFileDeclaration(appOutDir) {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appInfo = _this4.packager.appInfo;
      let isRootDirAddedToRemoveTable = false;
      const dirNames = new Set();
      const dirs = [];
      const fileSpace = " ".repeat(6);
      const commonOptions = (0, _CommonWindowsInstallerConfiguration().getEffectiveOptions)(_this4.options, _this4.packager);
      const files = yield _bluebirdLst().default.map((0, _fs().walk)(appOutDir), file => {
        const packagePath = file.substring(appOutDir.length + 1);
        const lastSlash = packagePath.lastIndexOf(path.sep);
        const fileName = lastSlash > 0 ? packagePath.substring(lastSlash + 1) : packagePath;
        let directoryId = null;
        let dirName = ""; // Wix Directory.FileSource doesn't work - https://stackoverflow.com/questions/21519388/wix-filesource-confusion

        if (lastSlash > 0) {
          // This Name attribute may also define multiple directories using the inline directory syntax.
          // For example, "ProgramFilesFolder:\My Company\My Product\bin" would create a reference to a Directory element with Id="ProgramFilesFolder" then create directories named "My Company" then "My Product" then "bin" nested beneath each other.
          // This syntax is a shortcut to defining each directory in an individual Directory element.
          dirName = packagePath.substring(0, lastSlash); // https://github.com/electron-userland/electron-builder/issues/3027

          directoryId = "d" + (0, _crypto().createHash)("md5").update(dirName).digest("base64").replace(/\//g, "_").replace(/\+/g, ".").replace(/=+$/, "");

          if (!dirNames.has(dirName)) {
            dirNames.add(dirName);
            dirs.push(`<Directory Id="${directoryId}" Name="${ROOT_DIR_ID}:\\${dirName.replace(/\//g, "\\")}\\"/>`);
          }
        } else if (!isRootDirAddedToRemoveTable) {
          isRootDirAddedToRemoveTable = true;
        } // since RegistryValue can be part of Component, *** *** *** *** *** *** *** *** *** wix cannot auto generate guid
        // https://stackoverflow.com/questions/1405100/change-my-component-guid-in-wix


        let result = `<Component${directoryId === null ? "" : ` Directory="${directoryId}"`}>`;
        result += `\n${fileSpace}  <File Name="${fileName}" Source="$(var.appDir)${path.sep}${packagePath}" ReadOnly="yes" KeyPath="yes"`;
        const isMainExecutable = packagePath === `${appInfo.productFilename}.exe`;

        if (isMainExecutable) {
          result += ' Id="mainExecutable"';
        } else if (directoryId === null) {
          result += ` Id="${path.basename(packagePath)}_f"`;
        }

        const isCreateDesktopShortcut = commonOptions.isCreateDesktopShortcut !== _CommonWindowsInstallerConfiguration().DesktopShortcutCreationPolicy.NEVER;

        if (isMainExecutable && (isCreateDesktopShortcut || commonOptions.isCreateStartMenuShortcut)) {
          result += `>\n`;
          const shortcutName = commonOptions.shortcutName;

          if (isCreateDesktopShortcut) {
            result += `${fileSpace}  <Shortcut Id="desktopShortcut" Directory="DesktopFolder" Name="${shortcutName}" WorkingDirectory="APPLICATIONFOLDER" Advertise="yes" Icon="icon.ico"/>\n`;
          }

          const hasMenuCategory = commonOptions.menuCategory != null;
          const startMenuShortcutDirectoryId = hasMenuCategory ? "AppProgramMenuDir" : "ProgramMenuFolder";

          if (commonOptions.isCreateStartMenuShortcut) {
            if (hasMenuCategory) {
              dirs.push(`<Directory Id="${startMenuShortcutDirectoryId}" Name="ProgramMenuFolder:\\${commonOptions.menuCategory}\\"/>`);
            }

            result += `${fileSpace}  <Shortcut Id="startMenuShortcut" Directory="${startMenuShortcutDirectoryId}" Name="${shortcutName}" WorkingDirectory="APPLICATIONFOLDER" Advertise="yes" Icon="icon.ico">\n`;
            result += `${fileSpace}    <ShortcutProperty Key="System.AppUserModel.ID" Value="${_this4.packager.appInfo.id}"/>\n`;
            result += `${fileSpace}  </Shortcut>\n`;
          }

          result += `${fileSpace}</File>`;

          if (hasMenuCategory) {
            result += `<RemoveFolder Id="${startMenuShortcutDirectoryId}" Directory="${startMenuShortcutDirectoryId}" On="uninstall"/>\n`;
          }
        } else {
          result += `/>`;
        }

        return `${result}\n${fileSpace}</Component>`;
      });
      return {
        dirs: listToString(dirs, 2),
        files: listToString(files, 3)
      };
    })();
  }

}

exports.default = MsiTarget;

function listToString(list, indentLevel) {
  const space = " ".repeat(indentLevel * 2);
  return list.join(`\n${space}`);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=MsiTarget.js.map{"version":3,"sources":["../../src/targets/MsiTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, log, deepAssign } from \"builder-util\"\nimport { UUID } from \"builder-util-runtime\"\nimport { getBinFromUrl } from \"../binDownload\"\nimport { walk } from \"builder-util/out/fs\"\nimport { createHash } from \"crypto\"\nimport * as ejs from \"ejs\"\nimport { readFile, writeFile } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { MsiOptions } from \"../\"\nimport { Target } from \"../core\"\nimport { DesktopShortcutCreationPolicy, FinalCommonWindowsInstallerOptions, getEffectiveOptions } from \"../options/CommonWindowsInstallerConfiguration\"\nimport { getTemplatePath } from \"../util/pathManager\"\nimport { VmManager } from \"../vm/vm\"\nimport { WineVmManager } from \"../vm/WineVm\"\nimport { WinPackager } from \"../winPackager\"\nimport { createStageDir, getWindowsInstallationDirName } from \"./targetUtil\"\n\nconst ELECTRON_BUILDER_UPGRADE_CODE_NS_UUID = UUID.parse(\"d752fe43-5d44-44d5-9fc9-6dd1bf19d5cc\")\nconst ROOT_DIR_ID = \"APPLICATIONFOLDER\"\n\nconst ASSISTED_UI_FILE_NAME = \"WixUI_Assisted.wxs\"\n\nconst projectTemplate = new Lazy<(data: any) => string>(async () => {\n  const template = (await readFile(path.join(getTemplatePath(\"msi\"), \"template.xml\"), \"utf8\"))\n    .replace(/{{/g, \"<%\")\n    .replace(/}}/g, \"%>\")\n    .replace(/\\${([^}]+)}/g, \"<%=$1%>\")\n  return ejs.compile(template)\n})\n\n// WiX doesn't support Mono, so, dontnet462 is required to be installed for wine (preinstalled in our bundled wine)\nexport default class MsiTarget extends Target {\n  private readonly vm = process.platform === \"win32\" ? new VmManager() : new WineVmManager()\n\n  readonly options: MsiOptions = deepAssign(this.packager.platformSpecificBuildOptions, this.packager.config.msi)\n\n  constructor(private readonly packager: WinPackager, readonly outDir: string) {\n    super(\"msi\")\n  }\n\n  async build(appOutDir: string, arch: Arch) {\n    const packager = this.packager\n    const artifactName = packager.expandArtifactBeautyNamePattern(this.options, \"msi\", arch)\n    const artifactPath = path.join(this.outDir, artifactName)\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: \"MSI\",\n      file: artifactPath,\n      arch,\n    })\n\n    const stageDir = await createStageDir(this, packager, arch)\n    const vm = this.vm\n\n    const commonOptions = getEffectiveOptions(this.options, this.packager)\n\n    if (commonOptions.isAssisted) {\n      // F*** *** ***  ***  ***  ***  ***  ***  ***  ***  ***  ***  *** WiX  ***  ***  ***  ***  ***  ***  ***  ***  ***\n      // cannot understand how to set MSIINSTALLPERUSER on radio box change. In any case installed per user.\n      log.warn(`MSI DOESN'T SUPPORT assisted installer. Please use NSIS instead.`)\n    }\n\n    const projectFile = stageDir.getTempFile(\"project.wxs\")\n    const objectFiles = [\"project.wixobj\"]\n    const uiFile = commonOptions.isAssisted ?  stageDir.getTempFile(ASSISTED_UI_FILE_NAME) : null\n    await writeFile(projectFile, await this.writeManifest(appOutDir, arch, commonOptions))\n    if (uiFile !== null) {\n      await writeFile(uiFile, await readFile(path.join(getTemplatePath(\"msi\"), ASSISTED_UI_FILE_NAME), \"utf8\"))\n      objectFiles.push(ASSISTED_UI_FILE_NAME.replace(\".wxs\", \".wixobj\"))\n    }\n\n    // noinspection SpellCheckingInspection\n    const vendorPath = await getBinFromUrl(\"wix\", \"4.0.0.5512.2\", \"/X5poahdCc3199Vt6AP7gluTlT1nxi9cbbHhZhCMEu+ngyP1LiBMn+oZX7QAZVaKeBMc2SjVp7fJqNLqsUnPNQ==\")\n\n    // noinspection SpellCheckingInspection\n    const candleArgs = [\n      \"-arch\", arch === Arch.ia32 ? \"x86\" : (arch === Arch.armv7l ? \"arm\" : \"x64\"),\n      `-dappDir=${vm.toVmFile(appOutDir)}`,\n    ].concat(this.getCommonWixArgs())\n    candleArgs.push(\"project.wxs\")\n    if (uiFile !== null) {\n      candleArgs.push(ASSISTED_UI_FILE_NAME)\n    }\n    await vm.exec(vm.toVmFile(path.join(vendorPath, \"candle.exe\")), candleArgs, {\n      cwd: stageDir.dir,\n    })\n\n    await this.light(objectFiles, vm, artifactPath, appOutDir, vendorPath, stageDir.dir)\n\n    await stageDir.cleanup()\n\n    await packager.sign(artifactPath)\n\n    await packager.info.callArtifactBuildCompleted({\n      file: artifactPath,\n      packager,\n      arch,\n      safeArtifactName: packager.computeSafeArtifactName(artifactName, \"msi\"),\n      target: this,\n      isWriteUpdateInfo: false,\n    })\n  }\n\n  private async light(objectFiles: Array<string>, vm: VmManager, artifactPath: string, appOutDir: string, vendorPath: string, tempDir: string) {\n    // noinspection SpellCheckingInspection\n    const lightArgs = [\n      \"-out\", vm.toVmFile(artifactPath),\n      \"-v\",\n      // https://github.com/wixtoolset/issues/issues/5169\n      \"-spdb\",\n      // https://sourceforge.net/p/wix/bugs/2405/\n      // error LGHT1076 : ICE61: This product should remove only older versions of itself. The Maximum version is not less than the current product. (1.1.0.42 1.1.0.42)\n      \"-sw1076\",\n      `-dappDir=${vm.toVmFile(appOutDir)}`,\n      // \"-dcl:high\",\n    ].concat(this.getCommonWixArgs())\n\n    // http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Build-3-5-2229-0-give-me-the-following-error-error-LGHT0216-An-unexpected-Win32-exception-with-errorn-td5707443.html\n    if (process.platform !== \"win32\") {\n      // noinspection SpellCheckingInspection\n      lightArgs.push(\"-sval\")\n    }\n\n    if (this.options.oneClick === false) {\n      lightArgs.push(\"-ext\", \"WixUIExtension\")\n    }\n\n    // objectFiles - only filenames, we set current directory to our temp stage dir\n    lightArgs.push(...objectFiles)\n    await vm.exec(vm.toVmFile(path.join(vendorPath, \"light.exe\")), lightArgs, {\n      cwd: tempDir,\n    })\n  }\n\n  private getCommonWixArgs() {\n    const args: Array<string> = [\"-pedantic\"]\n    if (this.options.warningsAsErrors !== false) {\n      args.push(\"-wx\")\n    }\n    return args\n  }\n\n  private async writeManifest(appOutDir: string, arch: Arch, commonOptions: FinalCommonWindowsInstallerOptions) {\n    const appInfo = this.packager.appInfo\n    const {files, dirs} = await this.computeFileDeclaration(appOutDir)\n\n    const companyName = appInfo.companyName\n    if (!companyName) {\n      log.warn(`Manufacturer is not set for MSI â€” please set \"author\" in the package.json`)\n    }\n\n    const compression = this.packager.compression\n    const options = this.options\n    const iconPath = await this.packager.getIconPath()\n    return (await projectTemplate.value)({\n      ...commonOptions,\n      isCreateDesktopShortcut: commonOptions.isCreateDesktopShortcut !== DesktopShortcutCreationPolicy.NEVER,\n      isRunAfterFinish: options.runAfterFinish !== false,\n      iconPath: iconPath == null ? null : this.vm.toVmFile(iconPath),\n      compressionLevel: compression === \"store\" ? \"none\" : \"high\",\n      version: appInfo.getVersionInWeirdWindowsForm(),\n      productName: appInfo.productName,\n      upgradeCode: (options.upgradeCode || UUID.v5(appInfo.id, ELECTRON_BUILDER_UPGRADE_CODE_NS_UUID)).toUpperCase(),\n      manufacturer: companyName || appInfo.productName,\n      appDescription: appInfo.description,\n      // https://stackoverflow.com/questions/1929038/compilation-error-ice80-the-64bitcomponent-uses-32bitdirectory\n      programFilesId: arch === Arch.x64 ? \"ProgramFiles64Folder\" : \"ProgramFilesFolder\",\n      // wix in the name because special wix format can be used in the name\n      installationDirectoryWixName: getWindowsInstallationDirName(appInfo, commonOptions.isPerMachine === true),\n      dirs,\n      files,\n    })\n  }\n\n  private async computeFileDeclaration(appOutDir: string) {\n    const appInfo = this.packager.appInfo\n    let isRootDirAddedToRemoveTable = false\n    const dirNames = new Set<string>()\n    const dirs: Array<string> = []\n    const fileSpace = \" \".repeat(6)\n    const commonOptions = getEffectiveOptions(this.options, this.packager)\n    const files = await BluebirdPromise.map(walk(appOutDir), file => {\n      const packagePath = file.substring(appOutDir.length + 1)\n\n      const lastSlash = packagePath.lastIndexOf(path.sep)\n      const fileName = lastSlash > 0 ? packagePath.substring(lastSlash + 1) : packagePath\n      let directoryId: string | null = null\n      let dirName = \"\"\n      // Wix Directory.FileSource doesn't work - https://stackoverflow.com/questions/21519388/wix-filesource-confusion\n      if (lastSlash > 0) {\n        // This Name attribute may also define multiple directories using the inline directory syntax.\n        // For example, \"ProgramFilesFolder:\\My Company\\My Product\\bin\" would create a reference to a Directory element with Id=\"ProgramFilesFolder\" then create directories named \"My Company\" then \"My Product\" then \"bin\" nested beneath each other.\n        // This syntax is a shortcut to defining each directory in an individual Directory element.\n        dirName = packagePath.substring(0, lastSlash)\n        // https://github.com/electron-userland/electron-builder/issues/3027\n        directoryId = \"d\" + createHash(\"md5\").update(dirName).digest(\"base64\").replace(/\\//g, \"_\").replace(/\\+/g, \".\").replace(/=+$/, \"\")\n        if (!dirNames.has(dirName)) {\n          dirNames.add(dirName)\n          dirs.push(`<Directory Id=\"${directoryId}\" Name=\"${ROOT_DIR_ID}:\\\\${dirName.replace(/\\//g, \"\\\\\")}\\\\\"/>`)\n        }\n      }\n      else if (!isRootDirAddedToRemoveTable) {\n        isRootDirAddedToRemoveTable = true\n      }\n\n      // since RegistryValue can be part of Component, *** *** *** *** *** *** *** *** *** wix cannot auto generate guid\n      // https://stackoverflow.com/questions/1405100/change-my-component-guid-in-wix\n      let result = `<Component${directoryId === null ? \"\" : ` Directory=\"${directoryId}\"`}>`\n      result += `\\n${fileSpace}  <File Name=\"${fileName}\" Source=\"$(var.appDir)${path.sep}${packagePath}\" ReadOnly=\"yes\" KeyPath=\"yes\"`\n      const isMainExecutable = packagePath === `${appInfo.productFilename}.exe`\n      if (isMainExecutable) {\n        result += ' Id=\"mainExecutable\"'\n      }\n      else if (directoryId === null) {\n        result += ` Id=\"${path.basename(packagePath)}_f\"`\n      }\n\n      const isCreateDesktopShortcut = commonOptions.isCreateDesktopShortcut !== DesktopShortcutCreationPolicy.NEVER\n      if (isMainExecutable && (isCreateDesktopShortcut || commonOptions.isCreateStartMenuShortcut)) {\n        result += `>\\n`\n        const shortcutName = commonOptions.shortcutName\n        if (isCreateDesktopShortcut) {\n          result += `${fileSpace}  <Shortcut Id=\"desktopShortcut\" Directory=\"DesktopFolder\" Name=\"${shortcutName}\" WorkingDirectory=\"APPLICATIONFOLDER\" Advertise=\"yes\" Icon=\"icon.ico\"/>\\n`\n        }\n\n        const hasMenuCategory = commonOptions.menuCategory != null\n        const startMenuShortcutDirectoryId = hasMenuCategory ? \"AppProgramMenuDir\" : \"ProgramMenuFolder\"\n        if (commonOptions.isCreateStartMenuShortcut) {\n          if (hasMenuCategory) {\n            dirs.push(`<Directory Id=\"${startMenuShortcutDirectoryId}\" Name=\"ProgramMenuFolder:\\\\${commonOptions.menuCategory}\\\\\"/>`)\n          }\n          result += `${fileSpace}  <Shortcut Id=\"startMenuShortcut\" Directory=\"${startMenuShortcutDirectoryId}\" Name=\"${shortcutName}\" WorkingDirectory=\"APPLICATIONFOLDER\" Advertise=\"yes\" Icon=\"icon.ico\">\\n`\n          result += `${fileSpace}    <ShortcutProperty Key=\"System.AppUserModel.ID\" Value=\"${this.packager.appInfo.id}\"/>\\n`\n          result += `${fileSpace}  </Shortcut>\\n`\n        }\n        result += `${fileSpace}</File>`\n\n        if (hasMenuCategory) {\n          result += `<RemoveFolder Id=\"${startMenuShortcutDirectoryId}\" Directory=\"${startMenuShortcutDirectoryId}\" On=\"uninstall\"/>\\n`\n        }\n      }\n      else {\n        result += `/>`\n      }\n\n      return `${result}\\n${fileSpace}</Component>`\n    })\n\n    return {dirs: listToString(dirs, 2), files: listToString(files, 3)}\n  }\n}\n\nfunction listToString(list: Array<string>, indentLevel:  number) {\n  const space = \" \".repeat(indentLevel * 2)\n  return list.join(`\\n${space}`)\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.tar = tar;
exports.compute7zCompressArgs = compute7zCompressArgs;
exports.archive = archive;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _zipBin() {
  const data = require("7zip-bin");

  _zipBin = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _tools() {
  const data = require("./tools");

  _tools = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/** @internal */
function tar(_x, _x2, _x3, _x4, _x5, _x6) {
  return _tar.apply(this, arguments);
}

function _tar() {
  _tar = (0, _bluebirdLst().coroutine)(function* (compression, format, outFile, dirToArchive, isMacApp, tempDirManager) {
    const tarFile = yield tempDirManager.getTempFile({
      suffix: ".tar"
    });
    const tarArgs = debug7zArgs("a");
    tarArgs.push(tarFile);
    tarArgs.push(path.basename(dirToArchive));
    yield Promise.all([(0, _builderUtil().exec)(_zipBin().path7za, tarArgs, {
      cwd: path.dirname(dirToArchive)
    }), // remove file before - 7z doesn't overwrite file, but update
    (0, _fs().unlinkIfExists)(outFile)]);

    if (!isMacApp) {
      yield (0, _builderUtil().exec)(_zipBin().path7za, ["rn", tarFile, path.basename(dirToArchive), path.basename(outFile, `.${format}`)]);
    }

    if (format === "tar.lz") {
      // noinspection SpellCheckingInspection
      let lzipPath = "lzip";

      if (process.platform === "darwin") {
        lzipPath = path.join((yield (0, _tools().getLinuxToolsPath)()), "bin", lzipPath);
      }

      yield (0, _builderUtil().exec)(lzipPath, [compression === "store" ? "-1" : "-9", "--keep"
      /* keep (don't delete) input files */
      , tarFile]); // bloody lzip creates file in the same dir where input file with postfix `.lz`, option --output doesn't work

      yield (0, _fsExtraP().move)(`${tarFile}.lz`, outFile);
      return;
    }

    const args = compute7zCompressArgs(format === "tar.xz" ? "xz" : format === "tar.bz2" ? "bzip2" : "gzip", {
      isRegularFile: true,
      method: "DEFAULT",
      compression
    });
    args.push(outFile, tarFile);
    yield (0, _builderUtil().exec)(_zipBin().path7za, args, {
      cwd: path.dirname(dirToArchive)
    }, _builderUtil().debug7z.enabled);
  });
  return _tar.apply(this, arguments);
}

function compute7zCompressArgs(format, options = {}) {
  let storeOnly = options.compression === "store";
  const args = debug7zArgs("a");
  let isLevelSet = false;

  if (process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL != null) {
    storeOnly = false;
    args.push(`-mx=${process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL}`);
    isLevelSet = true;
  }

  const isZip = format === "zip";

  if (!storeOnly) {
    if (isZip && options.compression === "maximum") {
      // http://superuser.com/a/742034
      args.push("-mfb=258", "-mpass=15");
    }

    if (!isLevelSet) {
      // https://github.com/electron-userland/electron-builder/pull/3032
      args.push("-mx=" + (!isZip || options.compression === "maximum" ? "9" : "7"));
    }
  }

  if (options.dictSize != null) {
    args.push(`-md=${options.dictSize}m`);
  } // https://sevenzip.osdn.jp/chm/cmdline/switches/method.htm#7Z
  // https://stackoverflow.com/questions/27136783/7zip-produces-different-output-from-identical-input
  // tc and ta are off by default, but to be sure, we explicitly set it to off
  // disable "Stores NTFS timestamps for files: Modification time, Creation time, Last access time." to produce the same archive for the same data


  if (!options.isRegularFile) {
    args.push("-mtc=off");
  }

  if (format === "7z" || format.endsWith(".7z")) {
    if (options.solid === false) {
      args.push("-ms=off");
    }

    if (options.isArchiveHeaderCompressed === false) {
      args.push("-mhc=off");
    } // args valid only for 7z
    // -mtm=off disable "Stores last Modified timestamps for files."


    args.push("-mtm=off", "-mta=off");
  }

  if (options.method != null) {
    if (options.method !== "DEFAULT") {
      args.push(`-mm=${options.method}`);
    }
  } else if (isZip || storeOnly) {
    args.push(`-mm=${storeOnly ? "Copy" : "Deflate"}`);
  }

  if (isZip) {
    // -mcu switch:  7-Zip uses UTF-8, if there are non-ASCII symbols.
    // because default mode: 7-Zip uses UTF-8, if the local code page doesn't contain required symbols.
    // but archive should be the same regardless where produced
    args.push("-mcu");
  }

  return args;
} // 7z is very fast, so, use ultra compression

/** @internal */


function archive(_x7, _x8, _x9) {
  return _archive.apply(this, arguments);
}

function _archive() {
  _archive = (0, _bluebirdLst().coroutine)(function* (format, outFile, dirToArchive, options = {}) {
    const args = compute7zCompressArgs(format, options); // remove file before - 7z doesn't overwrite file, but update

    yield (0, _fs().unlinkIfExists)(outFile);
    args.push(outFile, options.withoutDir ? "." : path.basename(dirToArchive));

    if (options.excluded != null) {
      for (const mask of options.excluded) {
        args.push(`-xr!${mask}`);
      }
    }

    try {
      yield (0, _builderUtil().exec)(_zipBin().path7za, args, {
        cwd: options.withoutDir ? dirToArchive : path.dirname(dirToArchive)
      }, _builderUtil().debug7z.enabled);
    } catch (e) {
      if (e.code === "ENOENT" && !(yield (0, _fs().exists)(dirToArchive))) {
        throw new Error(`Cannot create archive: "${dirToArchive}" doesn't exist`);
      } else {
        throw e;
      }
    }

    return outFile;
  });
  return _archive.apply(this, arguments);
}

function debug7zArgs(command) {
  const args = [command, "-bd"];

  if (_builderUtil().debug7z.enabled) {
    args.push("-bb");
  }

  return args;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=archive.js.map{"version":3,"sources":["../../src/targets/archive.ts"],"names":[],"mappings":"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","sourcesContent":["import { path7za } from \"7zip-bin\"\nimport { debug7z, exec } from \"builder-util\"\nimport { exists, unlinkIfExists } from \"builder-util/out/fs\"\nimport { move } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { TmpDir } from \"temp-file\"\nimport { CompressionLevel } from \"../core\"\nimport { getLinuxToolsPath } from \"./tools\"\n\n/** @internal */\nexport async function tar(compression: CompressionLevel | any | any, format: string, outFile: string, dirToArchive: string, isMacApp: boolean, tempDirManager: TmpDir): Promise<void> {\n  const tarFile = await tempDirManager.getTempFile({suffix: \".tar\"})\n  const tarArgs = debug7zArgs(\"a\")\n  tarArgs.push(tarFile)\n  tarArgs.push(path.basename(dirToArchive))\n\n  await Promise.all([\n    exec(path7za, tarArgs, {cwd: path.dirname(dirToArchive)}),\n    // remove file before - 7z doesn't overwrite file, but update\n    unlinkIfExists(outFile),\n  ])\n\n  if (!isMacApp) {\n    await exec(path7za, [\"rn\", tarFile, path.basename(dirToArchive), path.basename(outFile, `.${format}`)])\n  }\n\n  if (format === \"tar.lz\") {\n    // noinspection SpellCheckingInspection\n    let lzipPath = \"lzip\"\n    if (process.platform === \"darwin\") {\n      lzipPath = path.join(await getLinuxToolsPath(), \"bin\", lzipPath)\n    }\n    await exec(lzipPath, [compression === \"store\" ? \"-1\" : \"-9\", \"--keep\" /* keep (don't delete) input files */, tarFile])\n    // bloody lzip creates file in the same dir where input file with postfix `.lz`, option --output doesn't work\n    await move(`${tarFile}.lz`, outFile)\n    return\n  }\n\n  const args = compute7zCompressArgs(format === \"tar.xz\" ? \"xz\" : (format === \"tar.bz2\" ? \"bzip2\" : \"gzip\"), {\n    isRegularFile: true,\n    method: \"DEFAULT\",\n    compression,\n  })\n  args.push(outFile, tarFile)\n  await exec(path7za, args, {\n    cwd: path.dirname(dirToArchive),\n  }, debug7z.enabled)\n}\n\nexport interface ArchiveOptions {\n  compression?: CompressionLevel | null\n\n  /**\n   * @default false\n   */\n  withoutDir?: boolean\n\n  /**\n   * @default true\n   */\n  solid?: boolean\n\n  /**\n   * @default true\n   */\n  isArchiveHeaderCompressed?: boolean\n\n  dictSize?: number\n  excluded?: Array<string> | null\n\n  // DEFAULT allows to disable custom logic and do not pass method switch at all\n  method?: \"Copy\" | \"LZMA\" | \"Deflate\" | \"DEFAULT\"\n\n  isRegularFile?: boolean\n}\n\nexport function compute7zCompressArgs(format: string, options: ArchiveOptions = {}) {\n  let storeOnly = options.compression === \"store\"\n  const args = debug7zArgs(\"a\")\n\n  let isLevelSet = false\n  if (process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL != null) {\n    storeOnly = false\n    args.push(`-mx=${process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL}`)\n    isLevelSet = true\n  }\n\n  const isZip = format === \"zip\"\n  if (!storeOnly) {\n    if (isZip && options.compression === \"maximum\") {\n      // http://superuser.com/a/742034\n      args.push(\"-mfb=258\", \"-mpass=15\")\n    }\n\n    if (!isLevelSet) {\n      // https://github.com/electron-userland/electron-builder/pull/3032\n      args.push(\"-mx=\" + ((!isZip || options.compression === \"maximum\") ? \"9\" : \"7\"))\n    }\n  }\n\n  if (options.dictSize != null) {\n    args.push(`-md=${options.dictSize}m`)\n  }\n\n  // https://sevenzip.osdn.jp/chm/cmdline/switches/method.htm#7Z\n  // https://stackoverflow.com/questions/27136783/7zip-produces-different-output-from-identical-input\n  // tc and ta are off by default, but to be sure, we explicitly set it to off\n  // disable \"Stores NTFS timestamps for files: Modification time, Creation time, Last access time.\" to produce the same archive for the same data\n  if (!options.isRegularFile) {\n    args.push(\"-mtc=off\")\n  }\n\n  if (format === \"7z\" || format.endsWith(\".7z\")) {\n    if (options.solid === false) {\n      args.push(\"-ms=off\")\n    }\n\n    if (options.isArchiveHeaderCompressed === false) {\n      args.push(\"-mhc=off\")\n    }\n\n    // args valid only for 7z\n    // -mtm=off disable \"Stores last Modified timestamps for files.\"\n    args.push(\"-mtm=off\", \"-mta=off\")\n  }\n\n  if (options.method != null) {\n    if (options.method !== \"DEFAULT\") {\n      args.push(`-mm=${options.method}`)\n    }\n  }\n  else if (isZip || storeOnly) {\n    args.push(`-mm=${storeOnly ? \"Copy\" : \"Deflate\"}`)\n  }\n\n  if (isZip) {\n    // -mcu switch:  7-Zip uses UTF-8, if there are non-ASCII symbols.\n    // because default mode: 7-Zip uses UTF-8, if the local code page doesn't contain required symbols.\n    // but archive should be the same regardless where produced\n    args.push(\"-mcu\")\n  }\n  return args\n}\n\n// 7z is very fast, so, use ultra compression\n/** @internal */\nexport async function archive(format: string, outFile: string, dirToArchive: string, options: ArchiveOptions = {}): Promise<string> {\n  const args = compute7zCompressArgs(format, options)\n  // remove file before - 7z doesn't overwrite file, but update\n  await unlinkIfExists(outFile)\n\n  args.push(outFile, options.withoutDir ? \".\" : path.basename(dirToArchive))\n  if (options.excluded != null) {\n    for (const mask of options.excluded) {\n      args.push(`-xr!${mask}`)\n    }\n  }\n\n  try {\n    await exec(path7za, args, {\n      cwd: options.withoutDir ? dirToArchive : path.dirname(dirToArchive),\n    }, debug7z.enabled)\n  }\n  catch (e) {\n    if (e.code === \"ENOENT\" && !(await exists(dirToArchive))) {\n      throw new Error(`Cannot create archive: \"${dirToArchive}\" doesn't exist`)\n    }\n    else {\n      throw e\n    }\n  }\n\n  return outFile\n}\n\nfunction debug7zArgs(command: \"a\" | \"x\"): Array<string> {\n  const args = [command, \"-bd\"]\n  if (debug7z.enabled) {\n    args.push(\"-bb\")\n  }\n  return args\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createNsisWebDifferentialUpdateInfo = createNsisWebDifferentialUpdateInfo;
exports.configureDifferentialAwareArchiveOptions = configureDifferentialAwareArchiveOptions;
exports.appendBlockmap = appendBlockmap;
exports.createBlockmap = createBlockmap;
exports.BLOCK_MAP_FILE_SUFFIX = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _appBuilder() {
  const data = require("../util/appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const BLOCK_MAP_FILE_SUFFIX = ".blockmap";
exports.BLOCK_MAP_FILE_SUFFIX = BLOCK_MAP_FILE_SUFFIX;

function createNsisWebDifferentialUpdateInfo(artifactPath, packageFiles) {
  if (packageFiles == null) {
    return null;
  }

  const keys = Object.keys(packageFiles);

  if (keys.length <= 0) {
    return null;
  }

  const packages = {};

  for (const arch of keys) {
    const packageFileInfo = packageFiles[arch];
    const file = path.basename(packageFileInfo.path);
    packages[arch] = Object.assign({}, packageFileInfo, {
      path: file,
      // https://github.com/electron-userland/electron-builder/issues/2583
      file
    });
  }

  return {
    packages
  };
}

function configureDifferentialAwareArchiveOptions(archiveOptions) {
  /*
   * dict size 64 MB: Full: 33,744.88 KB, To download: 17,630.3 KB (52%)
   * dict size 16 MB: Full: 33,936.84 KB, To download: 16,175.9 KB (48%)
   * dict size  8 MB: Full: 34,187.59 KB, To download:  8,229.9 KB (24%)
   * dict size  4 MB: Full: 34,628.73 KB, To download: 3,782.97 KB (11%)
      as we can see, if file changed in one place, all block is invalidated (and update size approximately equals to dict size)
      1 MB is used:
      1MB:
      2018/01/11 11:54:41:0045 File has 59 changed blocks
   2018/01/11 11:54:41:0050 Full: 71,588.59 KB, To download: 1,243.39 KB (2%)
      4MB:
      2018/01/11 11:31:43:0440 Full: 70,303.55 KB, To download: 4,843.27 KB (7%)
   2018/01/11 11:31:43:0435 File has 234 changed blocks
      */
  archiveOptions.dictSize = 1; // solid compression leads to a lot of changed blocks

  archiveOptions.solid = false; // do not allow to change compression level to avoid different packages

  archiveOptions.compression = "normal";
  return archiveOptions;
}

function appendBlockmap(_x) {
  return _appendBlockmap.apply(this, arguments);
}

function _appendBlockmap() {
  _appendBlockmap = (0, _bluebirdLst().coroutine)(function* (file) {
    _builderUtil().log.info({
      file: _builderUtil().log.filePath(file)
    }, "building embedded block map");

    return yield (0, _appBuilder().executeAppBuilderAsJson)(["blockmap", "--input", file, "--compression", "deflate"]);
  });
  return _appendBlockmap.apply(this, arguments);
}

function createBlockmap(_x2, _x3, _x4, _x5) {
  return _createBlockmap.apply(this, arguments);
} function _createBlockmap() {
  _createBlockmap = (0, _bluebirdLst().coroutine)(function* (file, target, packager, safeArtifactName) {
    const blockMapFile = `${file}${BLOCK_MAP_FILE_SUFFIX}`;

    _builderUtil().log.info({
      blockMapFile: _builderUtil().log.filePath(blockMapFile)
    }, "building block map");

    const updateInfo = yield (0, _appBuilder().executeAppBuilderAsJson)(["blockmap", "--input", file, "--output", blockMapFile]);
    yield packager.info.callArtifactBuildCompleted({
      file: blockMapFile,
      safeArtifactName: safeArtifactName == null ? null : `${safeArtifactName}${BLOCK_MAP_FILE_SUFFIX}`,
      target,
      arch: null,
      packager,
      updateInfo
    });
    return updateInfo;
  });
  return _createBlockmap.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=differentialUpdateInfoBuilder.js.map{"version":3,"sources":["../../src/targets/differentialUpdateInfoBuilder.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAGO,MAAM,qBAAqB,GAAG,WAA9B;;;AAED,SAAU,mCAAV,CAA8C,YAA9C,EAAoE,YAApE,EAAqH;AACzH,MAAI,YAAY,IAAI,IAApB,EAA0B;AACxB,WAAO,IAAP;AACD;;AAED,QAAM,IAAI,GAAG,MAAM,CAAC,IAAP,CAAY,YAAZ,CAAb;;AACA,MAAI,IAAI,CAAC,MAAL,IAAe,CAAnB,EAAsB;AACpB,WAAO,IAAP;AACD;;AAED,QAAM,QAAQ,GAAwC,EAAtD;;AACA,OAAK,MAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,UAAM,eAAe,GAAG,YAAY,CAAC,IAAD,CAApC;AACA,UAAM,IAAI,GAAG,IAAI,CAAC,QAAL,CAAc,eAAe,CAAC,IAA9B,CAAb;AACA,IAAA,QAAQ,CAAC,IAAD,CAAR,GAAiB,MAAA,CAAA,MAAA,CAAA,EAAA,EACZ,eADY,EACG;AAClB,MAAA,IAAI,EAAE,IADY;AAElB;AACA,MAAA;AAHkB,KADH,CAAjB;AAMD;;AACD,SAAO;AAAC,IAAA;AAAD,GAAP;AACD;;AAEK,SAAU,wCAAV,CAAmD,cAAnD,EAAiF;AACrF;;;;;;;;;;;;;;AAqBA,EAAA,cAAc,CAAC,QAAf,GAA0B,CAA1B,CAtBqF,CAuBrF;;AACA,EAAA,cAAc,CAAC,KAAf,GAAuB,KAAvB,CAxBqF,CAyBrF;;AACA,EAAA,cAAc,CAAC,WAAf,GAA6B,QAA7B;AACA,SAAO,cAAP;AACD;;SAEqB,c;;;;;kDAAf,WAA8B,IAA9B,EAA0C;AAC/C,uBAAI,IAAJ,CAAS;AAAC,MAAA,IAAI,EAAE,mBAAI,QAAJ,CAAa,IAAb;AAAP,KAAT,EAAqC,6BAArC;;AACA,iBAAa,2CAA4C,CAAC,UAAD,EAAa,SAAb,EAAwB,IAAxB,EAA8B,eAA9B,EAA+C,SAA/C,CAA5C,CAAb;AACD,G;;;;SAEqB,c;;;;;;kDAAf,WAA8B,IAA9B,EAA4C,MAA5C,EAA4D,QAA5D,EAA6F,gBAA7F,EAA4H;AACjI,UAAM,YAAY,GAAG,GAAG,IAAI,GAAG,qBAAqB,EAApD;;AACA,uBAAI,IAAJ,CAAS;AAAC,MAAA,YAAY,EAAE,mBAAI,QAAJ,CAAa,YAAb;AAAf,KAAT,EAAqD,oBAArD;;AACA,UAAM,UAAU,SAAS,2CAA4C,CAAC,UAAD,EAAa,SAAb,EAAwB,IAAxB,EAA8B,UAA9B,EAA0C,YAA1C,CAA5C,CAAzB;AACA,UAAM,QAAQ,CAAC,IAAT,CAAc,0BAAd,CAAyC;AAC7C,MAAA,IAAI,EAAE,YADuC;AAE7C,MAAA,gBAAgB,EAAE,gBAAgB,IAAI,IAApB,GAA2B,IAA3B,GAAkC,GAAG,gBAAgB,GAAG,qBAAqB,EAFlD;AAG7C,MAAA,MAH6C;AAI7C,MAAA,IAAI,EAAE,IAJuC;AAK7C,MAAA,QAL6C;AAM7C,MAAA;AAN6C,KAAzC,CAAN;AAQA,WAAO,UAAP;AACD,G","sourcesContent":["import { log } from \"builder-util\"\nimport { BlockMapDataHolder, PackageFileInfo } from \"builder-util-runtime\"\nimport * as path from \"path\"\nimport { Target } from \"../core\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { executeAppBuilderAsJson } from \"../util/appBuilder\"\nimport { ArchiveOptions } from \"./archive\"\n\nexport const BLOCK_MAP_FILE_SUFFIX = \".blockmap\"\n\nexport function createNsisWebDifferentialUpdateInfo(artifactPath: string, packageFiles: { [arch: string]: PackageFileInfo }) {\n  if (packageFiles == null) {\n    return null\n  }\n\n  const keys = Object.keys(packageFiles)\n  if (keys.length <= 0) {\n    return null\n  }\n\n  const packages: { [arch: string]: PackageFileInfo } = {}\n  for (const arch of keys) {\n    const packageFileInfo = packageFiles[arch]\n    const file = path.basename(packageFileInfo.path)\n    packages[arch] = {\n      ...packageFileInfo,\n      path: file,\n      // https://github.com/electron-userland/electron-builder/issues/2583\n      file,\n    } as any\n  }\n  return {packages}\n}\n\nexport function configureDifferentialAwareArchiveOptions(archiveOptions: ArchiveOptions): ArchiveOptions {\n  /*\n   * dict size 64 MB: Full: 33,744.88 KB, To download: 17,630.3 KB (52%)\n   * dict size 16 MB: Full: 33,936.84 KB, To download: 16,175.9 KB (48%)\n   * dict size  8 MB: Full: 34,187.59 KB, To download:  8,229.9 KB (24%)\n   * dict size  4 MB: Full: 34,628.73 KB, To download: 3,782.97 KB (11%)\n\n   as we can see, if file changed in one place, all block is invalidated (and update size approximately equals to dict size)\n\n   1 MB is used:\n\n   1MB:\n\n   2018/01/11 11:54:41:0045 File has 59 changed blocks\n   2018/01/11 11:54:41:0050 Full: 71,588.59 KB, To download: 1,243.39 KB (2%)\n\n   4MB:\n\n   2018/01/11 11:31:43:0440 Full: 70,303.55 KB, To download: 4,843.27 KB (7%)\n   2018/01/11 11:31:43:0435 File has 234 changed blocks\n\n   */\n  archiveOptions.dictSize = 1\n  // solid compression leads to a lot of changed blocks\n  archiveOptions.solid = false\n  // do not allow to change compression level to avoid different packages\n  archiveOptions.compression = \"normal\"\n  return archiveOptions\n}\n\nexport async function appendBlockmap(file: string): Promise<BlockMapDataHolder> {\n  log.info({file: log.filePath(file)}, \"building embedded block map\")\n  return await executeAppBuilderAsJson<BlockMapDataHolder>([\"blockmap\", \"--input\", file, \"--compression\", \"deflate\"])\n}\n\nexport async function createBlockmap(file: string, target: Target, packager: PlatformPackager<any>, safeArtifactName: string | null): Promise<BlockMapDataHolder> {\n  const blockMapFile = `${file}${BLOCK_MAP_FILE_SUFFIX}`\n  log.info({blockMapFile: log.filePath(blockMapFile)}, \"building block map\")\n  const updateInfo = await executeAppBuilderAsJson<BlockMapDataHolder>([\"blockmap\", \"--input\", file, \"--output\", blockMapFile])\n  await packager.info.callArtifactBuildCompleted({\n    file: blockMapFile,\n    safeArtifactName: safeArtifactName == null ? null : `${safeArtifactName}${BLOCK_MAP_FILE_SUFFIX}`,\n    target,\n    arch: null,\n    packager,\n    updateInfo,\n  })\n  return updateInfo\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _zipBin() {
  const data = require("7zip-bin");

  _zipBin = function () {
    return data;
  };

  return data;
}

function _appBuilderBin() {
  const data = require("app-builder-bin");

  _appBuilderBin = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _appInfo() {
  const data = require("../appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _appBuilder() {
  const data = require("../util/appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _bundledTool() {
  const data = require("../util/bundledTool");

  _bundledTool = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function errorMessages() {
  const data = _interopRequireWildcard(require("../errorMessages"));

  errorMessages = function () {
    return data;
  };

  return data;
}

function _macosVersion() {
  const data = require("../util/macosVersion");

  _macosVersion = function () {
    return data;
  };

  return data;
}

function _pathManager() {
  const data = require("../util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

function _LinuxTargetHelper() {
  const data = require("./LinuxTargetHelper");

  _LinuxTargetHelper = function () {
    return data;
  };

  return data;
}

function _tools() {
  const data = require("./tools");

  _tools = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class FpmTarget extends _core().Target {
  constructor(name, packager, helper, outDir) {
    super(name, false);
    this.packager = packager;
    this.helper = helper;
    this.outDir = outDir;
    this.options = Object.assign({}, this.packager.platformSpecificBuildOptions, this.packager.config[this.name]);
    this.scriptFiles = this.createScripts();
  }

  createScripts() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const defaultTemplatesDir = (0, _pathManager().getTemplatePath)("linux");
      const packager = _this.packager;
      const templateOptions = Object.assign({
        // old API compatibility
        executable: packager.executableName,
        productFilename: packager.appInfo.productFilename
      }, packager.platformSpecificBuildOptions);

      function getResource(value, defaultFile) {
        if (value == null) {
          return path.join(defaultTemplatesDir, defaultFile);
        }

        return path.resolve(packager.projectDir, value);
      }

      return yield Promise.all([writeConfigFile(packager.info.tempDirManager, getResource(_this.options.afterInstall, "after-install.tpl"), templateOptions), writeConfigFile(packager.info.tempDirManager, getResource(_this.options.afterRemove, "after-remove.tpl"), templateOptions)]);
    })();
  }

  checkOptions() {
    return this.computeFpmMetaInfoOptions();
  }

  computeFpmMetaInfoOptions() {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this2.packager;
      const projectUrl = yield packager.appInfo.computePackageUrl();
      const errors = [];

      if (projectUrl == null) {
        errors.push("Please specify project homepage, see https://electron.build/configuration/configuration#Metadata-homepage");
      }

      const options = _this2.options;
      let author = options.maintainer;

      if (author == null) {
        const a = packager.info.metadata.author;

        if (a == null || a.email == null) {
          errors.push(errorMessages().authorEmailIsMissed);
        } else {
          author = `${a.name} <${a.email}>`;
        }
      }

      if (errors.length > 0) {
        throw new Error(errors.join("\n\n"));
      }

      return {
        maintainer: author,
        url: projectUrl,
        vendor: options.vendor || author
      };
    })();
  }

  build(appOutDir, arch) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const fpmMetaInfoOptions = yield _this3.computeFpmMetaInfoOptions();
      const target = _this3.name; // tslint:disable:no-invalid-template-strings

      let nameFormat = "${name}-${version}-${arch}.${ext}";
      let isUseArchIfX64 = false;

      if (target === "deb") {
        nameFormat = "${name}_${version}_${arch}.${ext}";
        isUseArchIfX64 = true;
      } else if (target === "rpm") {
        nameFormat = "${name}-${version}.${arch}.${ext}";
        isUseArchIfX64 = true;
      }

      const packager = _this3.packager;
      const artifactPath = path.join(_this3.outDir, packager.expandArtifactNamePattern(_this3.options, target, arch, nameFormat, !isUseArchIfX64));
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: target,
        file: artifactPath,
        arch
      });
      yield (0, _fs().unlinkIfExists)(artifactPath);

      if (packager.packagerOptions.prepackaged != null) {
        yield (0, _fsExtraP().ensureDir)(_this3.outDir);
      }

      const scripts = yield _this3.scriptFiles;
      const appInfo = packager.appInfo;
      const options = _this3.options;
      const synopsis = options.synopsis;
      const args = ["-s", "dir", "-t", target, "--architecture", target === "pacman" && arch === _builderUtil().Arch.ia32 ? "i686" : (0, _builderUtil().toLinuxArchString)(arch), "--name", appInfo.linuxPackageName, "--force", "--after-install", scripts[0], "--after-remove", scripts[1], "--description", (0, _appInfo().smarten)(target === "rpm" ? _this3.helper.getDescription(options) : `${synopsis || ""}\n ${_this3.helper.getDescription(options)}`), "--version", appInfo.version, "--package", artifactPath];
      (0, _appBuilder().objectToArgs)(args, fpmMetaInfoOptions);

      if (_builderUtil().debug.enabled) {
        args.push("--log", "debug", "--debug");
      }

      const packageCategory = options.packageCategory;

      if (packageCategory != null) {
        args.push("--category", packageCategory);
      }

      const compression = options.compression;

      if (target === "deb") {
        args.push("--deb-compression", compression || "xz");
        (0, _builderUtil().use)(options.priority, it => args.push("--deb-priority", it));
      } else if (target === "rpm") {
        args.push("--rpm-compression", (compression === "xz" ? "xzmt" : compression) || "xzmt");
        args.push("--rpm-os", "linux");

        if (synopsis != null) {
          args.push("--rpm-summary", (0, _appInfo().smarten)(synopsis));
        }
      } // noinspection JSDeprecatedSymbols


      let depends = options.depends || packager.platformSpecificBuildOptions.depends;

      if (depends == null) {
        if (target === "deb") {
          depends = ["gconf2", "gconf-service", "libnotify4", "libappindicator1", "libxtst6", "libnss3", "libxss1"];
        } else if (target === "pacman") {
          // noinspection SpellCheckingInspection
          depends = ["c-ares", "ffmpeg", "gtk3", "http-parser", "libevent", "libvpx", "libxslt", "libxss", "minizip", "nss", "re2", "snappy", "libnotify", "libappindicator-gtk2", "libappindicator-gtk3", "libappindicator-sharp"];
        } else if (target === "rpm") {
          // noinspection SpellCheckingInspection
          depends = ["libnotify", "libappindicator", "libXScrnSaver"];
        } else {
          depends = [];
        }
      } else if (!Array.isArray(depends)) {
        // noinspection SuspiciousTypeOfGuard
        if (typeof depends === "string") {
          depends = [depends];
        } else {
          throw new Error(`depends must be Array or String, but specified as: ${depends}`);
        }
      }

      for (const dep of depends) {
        args.push("--depends", dep);
      }

      (0, _builderUtil().use)(packager.info.metadata.license, it => args.push("--license", it));
      (0, _builderUtil().use)(appInfo.buildNumber, it => args.push("--iteration", it));
      (0, _builderUtil().use)(options.fpm, it => args.push(...it));
      args.push(`${appOutDir}/=${_LinuxTargetHelper().installPrefix}/${appInfo.productFilename}`);

      for (const icon of yield _this3.helper.icons) {
        const extWithDot = path.extname(icon.file);
        const sizeName = extWithDot === ".svg" ? "scalable" : `${icon.size}x${icon.size}`;
        args.push(`${icon.file}=/usr/share/icons/hicolor/${sizeName}/apps/${packager.executableName}${extWithDot}`);
      }

      const desktopFilePath = yield _this3.helper.writeDesktopEntry(_this3.options);
      args.push(`${desktopFilePath}=/usr/share/applications/${packager.executableName}.desktop`);

      if (packager.packagerOptions.effectiveOptionComputed != null && (yield packager.packagerOptions.effectiveOptionComputed([args, desktopFilePath]))) {
        return;
      }

      const env = Object.assign({}, process.env, {
        FPM_COMPRESS_PROGRAM: _appBuilderBin().appBuilderPath,
        SZA_PATH: _zipBin().path7za,
        SZA_COMPRESSION_LEVEL: packager.compression === "store" ? "0" : "9",
        SZA_ARCHIVE_TYPE: "xz"
      }); // rpmbuild wants directory rpm with some default config files. Even if we can use dylibbundler, path to such config files are not changed (we need to replace in the binary)
      // so, for now, brew install rpm is still required.

      if (target !== "rpm" && (yield (0, _macosVersion().isMacOsSierra)())) {
        const linuxToolsPath = yield (0, _tools().getLinuxToolsPath)();
        Object.assign(env, {
          PATH: (0, _bundledTool().computeEnv)(process.env.PATH, [path.join(linuxToolsPath, "bin")]),
          DYLD_LIBRARY_PATH: (0, _bundledTool().computeEnv)(process.env.DYLD_LIBRARY_PATH, [path.join(linuxToolsPath, "lib")])
        });
      }

      yield (0, _builderUtil().exec)((yield _tools().fpmPath.value), args, {
        env
      });
      yield packager.dispatchArtifactCreated(artifactPath, _this3, arch);
    })();
  }

}

exports.default = FpmTarget;

function writeConfigFile(_x, _x2, _x3) {
  return _writeConfigFile.apply(this, arguments);
} function _writeConfigFile() {
  _writeConfigFile = (0, _bluebirdLst().coroutine)(function* (tmpDir, templatePath, options) {
    //noinspection JSUnusedLocalSymbols
    function replacer(match, p1) {
      if (p1 in options) {
        return options[p1];
      } else {
        throw new Error(`Macro ${p1} is not defined`);
      }
    }

    const config = (yield (0, _fsExtraP().readFile)(templatePath, "utf8")).replace(/\${([a-zA-Z]+)}/g, replacer).replace(/<%=([a-zA-Z]+)%>/g, (match, p1) => {
      _builderUtil().log.warn("<%= varName %> is deprecated, please use ${varName} instead");

      return replacer(match, p1.trim());
    });
    const outputPath = yield tmpDir.getTempFile({
      suffix: path.basename(templatePath, ".tpl")
    });
    yield (0, _fsExtraP().outputFile)(outputPath, config);
    return outputPath;
  });
  return _writeConfigFile.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=fpm.js.map{"version":3,"sources":["../../src/targets/fpm.ts"],"names":[],"mappings":"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","sourcesContent":["import { path7za } from \"7zip-bin\"\nimport { appBuilderPath } from \"app-builder-bin\"\nimport { Arch, debug, exec, log, TmpDir, toLinuxArchString, use } from \"builder-util\"\nimport { smarten } from \"../appInfo\"\nimport { objectToArgs } from \"../util/appBuilder\"\nimport { computeEnv } from \"../util/bundledTool\"\nimport { unlinkIfExists } from \"builder-util/out/fs\"\nimport { ensureDir, outputFile, readFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { DebOptions, LinuxTargetSpecificOptions } from \"..\"\nimport { Target } from \"../core\"\nimport * as errorMessages from \"../errorMessages\"\nimport { LinuxPackager } from \"../linuxPackager\"\nimport { isMacOsSierra } from \"../util/macosVersion\"\nimport { getTemplatePath } from \"../util/pathManager\"\nimport { installPrefix, LinuxTargetHelper } from \"./LinuxTargetHelper\"\nimport { fpmPath, getLinuxToolsPath } from \"./tools\"\n\ninterface FpmOptions {\n  maintainer: string | undefined\n  vendor: string\n  url: string\n}\n\nexport default class FpmTarget extends Target {\n  readonly options: LinuxTargetSpecificOptions = {...this.packager.platformSpecificBuildOptions, ...(this.packager.config as any)[this.name]}\n\n  private readonly scriptFiles: Promise<Array<string>>\n\n  constructor(name: string, private readonly packager: LinuxPackager, private readonly helper: LinuxTargetHelper, readonly outDir: string) {\n    super(name, false)\n\n    this.scriptFiles = this.createScripts()\n  }\n\n  private async createScripts(): Promise<Array<string>> {\n    const defaultTemplatesDir = getTemplatePath(\"linux\")\n\n    const packager = this.packager\n    const templateOptions = {\n      // old API compatibility\n      executable: packager.executableName,\n      productFilename: packager.appInfo.productFilename, ...packager.platformSpecificBuildOptions}\n\n    function getResource(value: string | null | undefined, defaultFile: string) {\n      if (value == null) {\n        return path.join(defaultTemplatesDir, defaultFile)\n      }\n      return path.resolve(packager.projectDir, value)\n    }\n\n    return await Promise.all<string>([\n      writeConfigFile(packager.info.tempDirManager, getResource(this.options.afterInstall, \"after-install.tpl\"), templateOptions),\n      writeConfigFile(packager.info.tempDirManager, getResource(this.options.afterRemove, \"after-remove.tpl\"), templateOptions)\n    ])\n  }\n\n  checkOptions(): Promise<any> {\n    return this.computeFpmMetaInfoOptions()\n  }\n\n  private async computeFpmMetaInfoOptions(): Promise<FpmOptions> {\n    const packager = this.packager\n    const projectUrl = await packager.appInfo.computePackageUrl()\n    const errors: Array<string> = []\n    if (projectUrl == null) {\n      errors.push(\"Please specify project homepage, see https://electron.build/configuration/configuration#Metadata-homepage\")\n    }\n\n    const options = this.options\n    let author = options.maintainer\n    if (author == null) {\n      const a = packager.info.metadata.author\n      if (a == null || a.email == null) {\n        errors.push(errorMessages.authorEmailIsMissed)\n      }\n      else {\n        author = `${a.name} <${a.email}>`\n      }\n    }\n\n    if (errors.length > 0) {\n      throw new Error(errors.join(\"\\n\\n\"))\n    }\n\n    return {\n      maintainer: author!!,\n      url: projectUrl!!,\n      vendor: options.vendor || author!!,\n    }\n  }\n\n  async build(appOutDir: string, arch: Arch): Promise<any> {\n    const fpmMetaInfoOptions = await this.computeFpmMetaInfoOptions()\n\n    const target = this.name\n\n    // tslint:disable:no-invalid-template-strings\n    let nameFormat = \"${name}-${version}-${arch}.${ext}\"\n    let isUseArchIfX64 = false\n    if (target === \"deb\") {\n      nameFormat = \"${name}_${version}_${arch}.${ext}\"\n      isUseArchIfX64 = true\n    }\n    else if (target === \"rpm\") {\n      nameFormat = \"${name}-${version}.${arch}.${ext}\"\n      isUseArchIfX64 = true\n    }\n\n    const packager = this.packager\n    const artifactPath = path.join(this.outDir, packager.expandArtifactNamePattern(this.options, target, arch, nameFormat, !isUseArchIfX64))\n\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: target,\n      file: artifactPath,\n      arch,\n    })\n\n    await unlinkIfExists(artifactPath)\n    if (packager.packagerOptions.prepackaged != null) {\n      await ensureDir(this.outDir)\n    }\n\n    const scripts = await this.scriptFiles\n    const appInfo = packager.appInfo\n    const options = this.options\n    const synopsis = options.synopsis\n    const args = [\n      \"-s\", \"dir\",\n      \"-t\", target,\n      \"--architecture\", (target === \"pacman\" && arch === Arch.ia32) ? \"i686\" : toLinuxArchString(arch),\n      \"--name\", appInfo.linuxPackageName,\n      \"--force\",\n      \"--after-install\", scripts[0],\n      \"--after-remove\", scripts[1],\n      \"--description\", smarten(target === \"rpm\" ? this.helper.getDescription(options)! : `${synopsis || \"\"}\\n ${this.helper.getDescription(options)}`),\n      \"--version\", appInfo.version,\n      \"--package\", artifactPath,\n    ]\n\n    objectToArgs(args, fpmMetaInfoOptions as any)\n\n    if (debug.enabled) {\n      args.push(\n        \"--log\", \"debug\",\n        \"--debug\")\n    }\n\n    const packageCategory = options.packageCategory\n    if (packageCategory != null) {\n      args.push(\"--category\", packageCategory)\n    }\n\n    const compression = options.compression\n    if (target === \"deb\") {\n      args.push(\"--deb-compression\", compression || \"xz\")\n      use((options as DebOptions).priority, it => args.push(\"--deb-priority\", it!))\n    }\n    else if (target === \"rpm\") {\n      args.push(\"--rpm-compression\", (compression === \"xz\" ? \"xzmt\" : compression) || \"xzmt\")\n      args.push(\"--rpm-os\", \"linux\")\n\n      if (synopsis != null) {\n        args.push(\"--rpm-summary\", smarten(synopsis))\n      }\n    }\n\n    // noinspection JSDeprecatedSymbols\n    let depends = options.depends || packager.platformSpecificBuildOptions.depends\n    if (depends == null) {\n      if (target === \"deb\") {\n        depends = [\"gconf2\", \"gconf-service\", \"libnotify4\", \"libappindicator1\", \"libxtst6\", \"libnss3\", \"libxss1\"]\n      }\n      else if (target === \"pacman\") {\n        // noinspection SpellCheckingInspection\n        depends = [\"c-ares\", \"ffmpeg\", \"gtk3\", \"http-parser\", \"libevent\", \"libvpx\", \"libxslt\", \"libxss\", \"minizip\", \"nss\", \"re2\", \"snappy\", \"libnotify\", \"libappindicator-gtk2\", \"libappindicator-gtk3\", \"libappindicator-sharp\"]\n      }\n      else if (target === \"rpm\") {\n        // noinspection SpellCheckingInspection\n        depends = [\"libnotify\", \"libappindicator\", \"libXScrnSaver\"]\n      }\n      else {\n        depends = []\n      }\n    }\n    else if (!Array.isArray(depends)) {\n      // noinspection SuspiciousTypeOfGuard\n      if (typeof depends === \"string\") {\n        depends = [depends as string]\n      }\n      else {\n        throw new Error(`depends must be Array or String, but specified as: ${depends}`)\n      }\n    }\n\n    for (const dep of depends) {\n      args.push(\"--depends\", dep)\n    }\n\n    use(packager.info.metadata.license, it => args.push(\"--license\", it!))\n    use(appInfo.buildNumber, it => args.push(\"--iteration\", it!))\n\n    use(options.fpm, it => args.push(...it as any))\n\n    args.push(`${appOutDir}/=${installPrefix}/${appInfo.productFilename}`)\n    for (const icon of (await this.helper.icons)) {\n      const extWithDot = path.extname(icon.file)\n      const sizeName = extWithDot === \".svg\" ? \"scalable\" : `${icon.size}x${icon.size}`\n      args.push(`${icon.file}=/usr/share/icons/hicolor/${sizeName}/apps/${packager.executableName}${extWithDot}`)\n    }\n\n    const desktopFilePath = await this.helper.writeDesktopEntry(this.options)\n    args.push(`${desktopFilePath}=/usr/share/applications/${packager.executableName}.desktop`)\n\n    if (packager.packagerOptions.effectiveOptionComputed != null && await packager.packagerOptions.effectiveOptionComputed([args, desktopFilePath])) {\n      return\n    }\n\n    const env = {\n      ...process.env,\n      FPM_COMPRESS_PROGRAM: appBuilderPath,\n      SZA_PATH: path7za,\n      SZA_COMPRESSION_LEVEL: packager.compression === \"store\" ? \"0\" : \"9\",\n      SZA_ARCHIVE_TYPE: \"xz\",\n    }\n\n    // rpmbuild wants directory rpm with some default config files. Even if we can use dylibbundler, path to such config files are not changed (we need to replace in the binary)\n    // so, for now, brew install rpm is still required.\n    if (target !== \"rpm\" && await isMacOsSierra()) {\n      const linuxToolsPath = await getLinuxToolsPath()\n      Object.assign(env, {\n        PATH: computeEnv(process.env.PATH, [path.join(linuxToolsPath, \"bin\")]),\n        DYLD_LIBRARY_PATH: computeEnv(process.env.DYLD_LIBRARY_PATH, [path.join(linuxToolsPath, \"lib\")]),\n      })\n    }\n    await exec(await fpmPath.value, args, {env})\n\n    await packager.dispatchArtifactCreated(artifactPath, this, arch)\n  }\n}\n\nasync function writeConfigFile(tmpDir: TmpDir, templatePath: string, options: any): Promise<string> {\n  //noinspection JSUnusedLocalSymbols\n  function replacer(match: string, p1: string) {\n    if (p1 in options) {\n      return options[p1]\n    }\n    else {\n      throw new Error(`Macro ${p1} is not defined`)\n    }\n  }\n  const config = (await readFile(templatePath, \"utf8\"))\n    .replace(/\\${([a-zA-Z]+)}/g, replacer)\n    .replace(/<%=([a-zA-Z]+)%>/g, (match, p1) => {\n      log.warn(\"<%= varName %> is deprecated, please use ${varName} instead\")\n      return replacer(match, p1.trim())\n    })\n\n  const outputPath = await tmpDir.getTempFile({suffix: path.basename(templatePath, \".tpl\")})\n  await outputFile(outputPath, config)\n  return outputPath\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.prepareProductBuildArgs = prepareProductBuildArgs;
exports.PkgTarget = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _license() {
  const data = require("../util/license");

  _license = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _plist() {
  const data = require("plist");

  _plist = function () {
    return data;
  };

  return data;
}

function _appInfo() {
  const data = require("../appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _macCodeSign() {
  const data = require("../codeSign/macCodeSign");

  _macCodeSign = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const certType = "Developer ID Installer"; // http://www.shanekirk.com/2013/10/creating-flat-packages-in-osx/
// to use --scripts, we must build .app bundle separately using pkgbuild
// productbuild --scripts doesn't work (because scripts in this case not added to our package)
// https://github.com/electron-userland/electron-osx-sign/issues/96#issuecomment-274986942

class PkgTarget extends _core().Target {
  constructor(packager, outDir) {
    super("pkg");
    this.packager = packager;
    this.outDir = outDir;
    this.options = Object.assign({
      allowAnywhere: true,
      allowCurrentUserHome: true,
      allowRootDirectory: true
    }, this.packager.config.pkg);
  }

  build(appPath, arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;
      const options = _this.options;
      const appInfo = packager.appInfo; // pkg doesn't like not ASCII symbols (Could not open package to list files: /Volumes/test/t-gIjdGK/test-project-0/dist/Test App ÃŸW-1.1.0.pkg)

      const artifactName = packager.expandArtifactNamePattern(options, "pkg");
      const artifactPath = path.join(_this.outDir, artifactName);
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: "pkg",
        file: artifactPath,
        arch
      });
      const keychainName = (yield packager.codeSigningInfo.value).keychainName;
      const appOutDir = _this.outDir; // https://developer.apple.com/library/content/documentation/DeveloperTools/Reference/DistributionDefinitionRef/Chapters/Distribution_XML_Ref.html

      const distInfoFile = path.join(appOutDir, "distribution.xml");
      const innerPackageFile = path.join(appOutDir, `${(0, _appInfo().filterCFBundleIdentifier)(appInfo.id)}.pkg`);
      const componentPropertyListFile = path.join(appOutDir, `${(0, _appInfo().filterCFBundleIdentifier)(appInfo.id)}.plist`);
      const identity = (yield Promise.all([(0, _macCodeSign().findIdentity)(certType, options.identity || packager.platformSpecificBuildOptions.identity, keychainName), _this.customizeDistributionConfiguration(distInfoFile, appPath), _this.buildComponentPackage(appPath, componentPropertyListFile, innerPackageFile)]))[0];

      if (identity == null && packager.forceCodeSigning) {
        throw new Error(`Cannot find valid "${certType}" to sign standalone installer, please see https://electron.build/code-signing`);
      }

      const args = prepareProductBuildArgs(identity, keychainName);
      args.push("--distribution", distInfoFile);
      args.push(artifactPath);
      (0, _builderUtil().use)(options.productbuild, it => args.push(...it));
      yield (0, _builderUtil().exec)("productbuild", args, {
        cwd: appOutDir
      });
      yield Promise.all([(0, _fsExtraP().unlink)(innerPackageFile), (0, _fsExtraP().unlink)(distInfoFile)]);
      yield packager.dispatchArtifactCreated(artifactPath, _this, arch, packager.computeSafeArtifactName(artifactName, "pkg", arch));
    })();
  }

  customizeDistributionConfiguration(distInfoFile, appPath) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield (0, _builderUtil().exec)("productbuild", ["--synthesize", "--component", appPath, distInfoFile], {
        cwd: _this2.outDir
      });
      const options = _this2.options;
      let distInfo = yield (0, _fsExtraP().readFile)(distInfoFile, "utf-8");
      const insertIndex = distInfo.lastIndexOf("</installer-gui-script>");
      distInfo = distInfo.substring(0, insertIndex) + `    <domains enable_anywhere="${options.allowAnywhere}" enable_currentUserHome="${options.allowCurrentUserHome}" enable_localSystem="${options.allowRootDirectory}" />\n` + distInfo.substring(insertIndex);

      if (options.background != null) {
        const background = yield _this2.packager.getResource(options.background.file);

        if (background != null) {
          const alignment = options.background.alignment || "center"; // noinspection SpellCheckingInspection

          const scaling = options.background.scaling || "tofit";
          distInfo = distInfo.substring(0, insertIndex) + `    <background file="${background}" alignment="${alignment}" scaling="${scaling}"/>\n` + distInfo.substring(insertIndex);
        }
      }

      const welcome = yield _this2.packager.getResource(options.welcome);

      if (welcome != null) {
        distInfo = distInfo.substring(0, insertIndex) + `    <welcome file="${welcome}"/>\n` + distInfo.substring(insertIndex);
      }

      const license = yield (0, _license().getNotLocalizedLicenseFile)(options.license, _this2.packager);

      if (license != null) {
        distInfo = distInfo.substring(0, insertIndex) + `    <license file="${license}"/>\n` + distInfo.substring(insertIndex);
      }

      const conclusion = yield _this2.packager.getResource(options.conclusion);

      if (conclusion != null) {
        distInfo = distInfo.substring(0, insertIndex) + `    <conclusion file="${conclusion}"/>\n` + distInfo.substring(insertIndex);
      }

      (0, _builderUtil().debug)(distInfo);
      yield (0, _fsExtraP().writeFile)(distInfoFile, distInfo);
    })();
  }

  buildComponentPackage(appPath, propertyListOutputFile, packageOutputFile) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const options = _this3.options;
      const rootPath = path.dirname(appPath); // first produce a component plist template

      yield (0, _builderUtil().exec)("pkgbuild", ["--analyze", "--root", rootPath, propertyListOutputFile]); // process the template plist

      const plistInfo = (0, _plist().parse)((yield (0, _fsExtraP().readFile)(propertyListOutputFile, "utf8")));

      if (plistInfo.length > 0) {
        const packageInfo = plistInfo[0]; // ChildBundles lists all of electron binaries within the .app.
        // There is no particular reason for removing that key, except to be as close as possible to
        // the PackageInfo generated by previous versions of electron-builder.

        delete packageInfo.ChildBundles;

        if (options.isRelocatable != null) {
          packageInfo.BundleIsRelocatable = options.isRelocatable;
        }

        if (options.isVersionChecked != null) {
          packageInfo.BundleIsVersionChecked = options.isVersionChecked;
        }

        if (options.hasStrictIdentifier != null) {
          packageInfo.BundleHasStrictIdentifier = options.hasStrictIdentifier;
        }

        if (options.overwriteAction != null) {
          packageInfo.BundleOverwriteAction = options.overwriteAction;
        }

        yield (0, _fsExtraP().writeFile)(propertyListOutputFile, (0, _plist().build)(plistInfo));
      } // now build the package


      const args = ["--root", rootPath, "--component-plist", propertyListOutputFile];
      (0, _builderUtil().use)(_this3.options.installLocation || "/Applications", it => args.push("--install-location", it));

      if (options.scripts != null) {
        args.push("--scripts", path.resolve(_this3.packager.info.buildResourcesDir, options.scripts));
      } else if (options.scripts !== null) {
        const dir = path.join(_this3.packager.info.buildResourcesDir, "pkg-scripts");
        const stat = yield (0, _fs().statOrNull)(dir);

        if (stat != null && stat.isDirectory()) {
          args.push("--scripts", dir);
        }
      }

      args.push(packageOutputFile);
      yield (0, _builderUtil().exec)("pkgbuild", args);
    })();
  }

}

exports.PkgTarget = PkgTarget;

function prepareProductBuildArgs(identity, keychain) {
  const args = [];

  if (identity != null) {
    args.push("--sign", identity.hash);

    if (keychain != null) {
      args.push("--keychain", keychain);
    }
  }

  return args;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=pkg.js.map{"version":3,"sources":["../../src/targets/pkg.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, debug, exec, use } from \"builder-util\"\nimport { statOrNull } from \"builder-util/out/fs\"\nimport { getNotLocalizedLicenseFile } from \"../util/license\"\nimport { readFile, unlink, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { build as buildPlist, parse as parsePlist } from \"plist\"\nimport { PkgOptions } from \"..\"\nimport { filterCFBundleIdentifier } from \"../appInfo\"\nimport { findIdentity, Identity } from \"../codeSign/macCodeSign\"\nimport { Target } from \"../core\"\nimport MacPackager from \"../macPackager\"\n\nconst certType = \"Developer ID Installer\"\n\n// http://www.shanekirk.com/2013/10/creating-flat-packages-in-osx/\n// to use --scripts, we must build .app bundle separately using pkgbuild\n// productbuild --scripts doesn't work (because scripts in this case not added to our package)\n// https://github.com/electron-userland/electron-osx-sign/issues/96#issuecomment-274986942\nexport class PkgTarget extends Target {\n  readonly options: PkgOptions = {\n    allowAnywhere: true,\n    allowCurrentUserHome: true,\n    allowRootDirectory: true,\n    ...this.packager.config.pkg,\n  }\n\n  constructor(private readonly packager: MacPackager, readonly outDir: string) {\n    super(\"pkg\")\n  }\n\n  async build(appPath: string, arch: Arch): Promise<any> {\n    const packager = this.packager\n    const options = this.options\n    const appInfo = packager.appInfo\n\n    // pkg doesn't like not ASCII symbols (Could not open package to list files: /Volumes/test/t-gIjdGK/test-project-0/dist/Test App ÃŸW-1.1.0.pkg)\n    const artifactName = packager.expandArtifactNamePattern(options, \"pkg\")\n    const artifactPath = path.join(this.outDir, artifactName)\n\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: \"pkg\",\n      file: artifactPath,\n      arch,\n    })\n\n    const keychainName = (await packager.codeSigningInfo.value).keychainName\n\n    const appOutDir = this.outDir\n    // https://developer.apple.com/library/content/documentation/DeveloperTools/Reference/DistributionDefinitionRef/Chapters/Distribution_XML_Ref.html\n    const distInfoFile = path.join(appOutDir, \"distribution.xml\")\n\n    const innerPackageFile = path.join(appOutDir, `${filterCFBundleIdentifier(appInfo.id)}.pkg`)\n    const componentPropertyListFile = path.join(appOutDir, `${filterCFBundleIdentifier(appInfo.id)}.plist`)\n    const identity = (await Promise.all([\n      findIdentity(certType, options.identity || packager.platformSpecificBuildOptions.identity, keychainName),\n      this.customizeDistributionConfiguration(distInfoFile, appPath),\n      this.buildComponentPackage(appPath, componentPropertyListFile, innerPackageFile),\n    ]))[0]\n\n    if (identity == null && packager.forceCodeSigning) {\n      throw new Error(`Cannot find valid \"${certType}\" to sign standalone installer, please see https://electron.build/code-signing`)\n    }\n\n    const args = prepareProductBuildArgs(identity, keychainName)\n    args.push(\"--distribution\", distInfoFile)\n    args.push(artifactPath)\n    use(options.productbuild, it => args.push(...it as any))\n    await exec(\"productbuild\", args, {\n      cwd: appOutDir,\n    })\n    await Promise.all([unlink(innerPackageFile), unlink(distInfoFile)])\n\n    await packager.dispatchArtifactCreated(artifactPath, this, arch, packager.computeSafeArtifactName(artifactName, \"pkg\", arch))\n  }\n\n  private async customizeDistributionConfiguration(distInfoFile: string, appPath: string) {\n    await exec(\"productbuild\", [\"--synthesize\", \"--component\", appPath, distInfoFile], {\n      cwd: this.outDir,\n    })\n\n    const options = this.options\n    let distInfo = await readFile(distInfoFile, \"utf-8\")\n    const insertIndex = distInfo.lastIndexOf(\"</installer-gui-script>\")\n    distInfo = distInfo.substring(0, insertIndex) + `    <domains enable_anywhere=\"${options.allowAnywhere}\" enable_currentUserHome=\"${options.allowCurrentUserHome}\" enable_localSystem=\"${options.allowRootDirectory}\" />\\n` + distInfo.substring(insertIndex)\n\n    if (options.background != null) {\n      const background = await this.packager.getResource(options.background.file)\n      if (background != null) {\n        const alignment = options.background.alignment || \"center\"\n        // noinspection SpellCheckingInspection\n        const scaling = options.background.scaling || \"tofit\"\n        distInfo = distInfo.substring(0, insertIndex) + `    <background file=\"${background}\" alignment=\"${alignment}\" scaling=\"${scaling}\"/>\\n` + distInfo.substring(insertIndex)\n      }\n    }\n\n    const welcome = await this.packager.getResource(options.welcome)\n    if (welcome != null) {\n      distInfo = distInfo.substring(0, insertIndex) + `    <welcome file=\"${welcome}\"/>\\n` + distInfo.substring(insertIndex)\n    }\n\n    const license = await getNotLocalizedLicenseFile(options.license, this.packager)\n    if (license != null) {\n      distInfo = distInfo.substring(0, insertIndex) + `    <license file=\"${license}\"/>\\n` + distInfo.substring(insertIndex)\n    }\n\n    const conclusion = await this.packager.getResource(options.conclusion)\n    if (conclusion != null) {\n      distInfo = distInfo.substring(0, insertIndex) + `    <conclusion file=\"${conclusion}\"/>\\n` + distInfo.substring(insertIndex)\n    }\n\n    debug(distInfo)\n    await writeFile(distInfoFile, distInfo)\n  }\n\n  private async buildComponentPackage(appPath: string, propertyListOutputFile: string, packageOutputFile: string) {\n    const options = this.options\n    const rootPath = path.dirname(appPath)\n\n    // first produce a component plist template\n    await exec(\"pkgbuild\", [\n      \"--analyze\",\n      \"--root\", rootPath,\n      propertyListOutputFile,\n    ])\n\n    // process the template plist\n    const plistInfo = parsePlist(await readFile(propertyListOutputFile, \"utf8\"))\n    if (plistInfo.length > 0) {\n      const packageInfo = plistInfo[0]\n\n      // ChildBundles lists all of electron binaries within the .app.\n      // There is no particular reason for removing that key, except to be as close as possible to\n      // the PackageInfo generated by previous versions of electron-builder.\n      delete packageInfo.ChildBundles\n\n      if (options.isRelocatable != null) {\n        packageInfo.BundleIsRelocatable = options.isRelocatable\n      }\n\n      if (options.isVersionChecked != null) {\n        packageInfo.BundleIsVersionChecked = options.isVersionChecked\n      }\n\n      if (options.hasStrictIdentifier != null) {\n        packageInfo.BundleHasStrictIdentifier = options.hasStrictIdentifier\n      }\n\n      if (options.overwriteAction != null) {\n        packageInfo.BundleOverwriteAction = options.overwriteAction\n      }\n\n      await writeFile(propertyListOutputFile, buildPlist(plistInfo))\n    }\n\n    // now build the package\n    const args = [\n      \"--root\", rootPath,\n      \"--component-plist\", propertyListOutputFile,\n    ]\n\n    use(this.options.installLocation || \"/Applications\", it => args.push(\"--install-location\", it!))\n    if (options.scripts != null) {\n      args.push(\"--scripts\", path.resolve(this.packager.info.buildResourcesDir, options.scripts))\n    }\n    else if (options.scripts !== null) {\n      const dir = path.join(this.packager.info.buildResourcesDir, \"pkg-scripts\")\n      const stat = await statOrNull(dir)\n      if (stat != null && stat.isDirectory()) {\n        args.push(\"--scripts\", dir)\n      }\n    }\n\n    args.push(packageOutputFile)\n\n    await exec(\"pkgbuild\", args)\n  }\n}\n\nexport function prepareProductBuildArgs(identity: Identity | null, keychain: string | null | undefined): Array<string> {\n  const args: Array<string> = []\n  if (identity != null) {\n    args.push(\"--sign\", identity.hash)\n    if (keychain != null) {\n      args.push(\"--keychain\", keychain)\n    }\n  }\n  return args\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _jsYaml() {
  const data = require("js-yaml");

  _jsYaml = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function semver() {
  const data = _interopRequireWildcard(require("semver"));

  semver = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _linuxPackager() {
  const data = require("../linuxPackager");

  _linuxPackager = function () {
    return data;
  };

  return data;
}

function _pathManager() {
  const data = require("../util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

function _targetUtil() {
  const data = require("./targetUtil");

  _targetUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const defaultPlugs = ["desktop", "desktop-legacy", "home", "x11", "unity7", "browser-support", "network", "gsettings", "pulseaudio", "opengl"];

class SnapTarget extends _core().Target {
  constructor(name, packager, helper, outDir) {
    super(name);
    this.packager = packager;
    this.helper = helper;
    this.outDir = outDir;
    this.options = Object.assign({}, this.packager.platformSpecificBuildOptions, this.packager.config[this.name]);
    this.isUseTemplateApp = false;
  }

  replaceDefault(inList, defaultList) {
    const result = (0, _builderUtil().replaceDefault)(inList, defaultList);

    if (result !== defaultList) {
      this.isUseTemplateApp = false;
    }

    return result;
  }

  static getDefaultStagePackages() {
    // libxss1 - was "error while loading shared libraries: libXss.so.1" on Xubuntu 16.04
    // noinspection SpellCheckingInspection
    return ["libnspr4", "libnss3", "libxss1", "libappindicator3-1", "libsecret-1-0"];
  }

  createDescriptor(arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (!_this.isElectronVersionGreaterOrEqualThen("4.0.0")) {
        if (!_this.isElectronVersionGreaterOrEqualThen("2.0.0-beta.1")) {
          throw new (_builderUtil().InvalidConfigurationError)("Electron 2 and higher is required to build Snap");
        }

        _builderUtil().log.warn("Electron 4 and higher is highly recommended for Snap");
      }

      const appInfo = _this.packager.appInfo;

      const snapName = _this.packager.executableName.toLowerCase();

      const options = _this.options;
      const linuxArchName = (0, _linuxPackager().toAppImageOrSnapArch)(arch);
      const plugs = normalizePlugConfiguration(_this.options.plugs);

      const plugNames = _this.replaceDefault(plugs == null ? null : Object.getOwnPropertyNames(plugs), defaultPlugs);

      const buildPackages = (0, _builderUtilRuntime().asArray)(options.buildPackages);
      _this.isUseTemplateApp = _this.options.useTemplateApp !== false && arch === _builderUtil().Arch.x64 && buildPackages.length === 0;
      const appDescriptor = {
        command: "command.sh",
        plugs: plugNames,
        adapter: "none"
      };
      const snap = (0, _jsYaml().safeLoad)((yield (0, _fsExtraP().readFile)(path.join((0, _pathManager().getTemplatePath)("snap"), "snapcraft.yaml"), "utf-8")));

      if (_this.isUseTemplateApp) {
        delete appDescriptor.adapter;
      }

      if (options.grade != null) {
        snap.grade = options.grade;
      }

      if (options.confinement != null) {
        snap.confinement = options.confinement;
      }

      (0, _builderUtil().deepAssign)(snap, {
        name: snapName,
        version: appInfo.version,
        summary: options.summary || appInfo.productName,
        description: _this.helper.getDescription(options),
        architectures: [(0, _builderUtil().toLinuxArchString)(arch, true)],
        apps: {
          [snapName]: appDescriptor
        },
        parts: {
          app: {
            "stage-packages": _this.replaceDefault(options.stagePackages, SnapTarget.getDefaultStagePackages())
          }
        }
      });

      if (options.confinement === "classic") {
        delete appDescriptor.plugs;
        delete snap.plugs;
      } else {
        appDescriptor.environment = Object.assign({
          TMPDIR: "$XDG_RUNTIME_DIR",
          PATH: "$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH",
          SNAP_DESKTOP_RUNTIME: "$SNAP/gnome-platform",
          LD_LIBRARY_PATH: ["$SNAP_LIBRARY_PATH", "$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/" + linuxArchName + "-linux-gnu:$SNAP/usr/lib/" + linuxArchName + "-linux-gnu", "$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib", "$SNAP/lib/" + linuxArchName + "-linux-gnu:$SNAP/usr/lib/" + linuxArchName + "-linux-gnu"].join(":")
        }, options.environment);

        if (plugs != null) {
          for (const plugName of plugNames) {
            const plugOptions = plugs[plugName];

            if (plugOptions == null) {
              continue;
            }

            snap.plugs[plugName] = plugOptions;
          }
        }
      }

      if (buildPackages.length > 0) {
        snap.parts.app["build-packages"] = buildPackages;
      }

      if (options.after != null) {
        snap.parts.app.after = options.after;
      }

      if (options.assumes != null) {
        snap.assumes = (0, _builderUtilRuntime().asArray)(options.assumes);
      }

      return snap;
    })();
  }

  build(appOutDir, arch) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this2.packager;
      const options = _this2.options; // tslint:disable-next-line:no-invalid-template-strings

      const artifactName = packager.expandArtifactNamePattern(_this2.options, "snap", arch, "${name}_${version}_${arch}.${ext}", false);
      const artifactPath = path.join(_this2.outDir, artifactName);
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: "snap",
        file: artifactPath,
        arch
      });
      const snap = yield _this2.createDescriptor(arch);

      if (_this2.isUseTemplateApp) {
        delete snap.parts;
      }

      const stageDir = yield (0, _targetUtil().createStageDirPath)(_this2, packager, arch);
      const args = ["snap", "--app", appOutDir, "--stage", stageDir, "--arch", (0, _builderUtil().toLinuxArchString)(arch, true), "--output", artifactPath, "--executable", _this2.packager.executableName];
      yield _this2.helper.icons;

      if (_this2.helper.maxIconPath != null) {
        if (!_this2.isUseTemplateApp) {
          snap.icon = "snap/gui/icon.png";
        }

        args.push("--icon", _this2.helper.maxIconPath);
      } // snapcraft.yaml inside a snap directory


      const snapMetaDir = path.join(stageDir, _this2.isUseTemplateApp ? "meta" : "snap");
      const desktopFile = path.join(snapMetaDir, "gui", `${snap.name}.desktop`);
      yield _this2.helper.writeDesktopEntry(_this2.options, packager.executableName, desktopFile, {
        // tslint:disable:no-invalid-template-strings
        Icon: "${SNAP}/meta/gui/icon.png"
      });

      if (_this2.isElectronVersionGreaterOrEqualThen("5.0.0") && !isBrowserSandboxAllowed(snap)) {
        args.push("--extraAppArgs=--no-sandbox");

        if (_this2.isUseTemplateApp) {
          args.push("--exclude", "chrome-sandbox");
        }
      }

      if (packager.packagerOptions.effectiveOptionComputed != null && (yield packager.packagerOptions.effectiveOptionComputed({
        snap,
        desktopFile,
        args
      }))) {
        return;
      }

      yield (0, _fsExtraP().outputFile)(path.join(snapMetaDir, _this2.isUseTemplateApp ? "snap.yaml" : "snapcraft.yaml"), (0, _builderUtil().serializeToYaml)(snap));
      const hooksDir = yield packager.getResource(options.hooks, "snap-hooks");

      if (hooksDir != null) {
        args.push("--hooks", hooksDir);
      }

      if (_this2.isUseTemplateApp) {
        args.push("--template-url", "electron4");
      }

      yield (0, _builderUtil().executeAppBuilder)(args);
      yield packager.dispatchArtifactCreated(artifactPath, _this2, arch, packager.computeSafeArtifactName(artifactName, "snap", arch, false));
    })();
  }

  isElectronVersionGreaterOrEqualThen(version) {
    return semver().gte(this.packager.config.electronVersion || "5.0.3", version);
  }

}

exports.default = SnapTarget;

function normalizePlugConfiguration(raw) {
  if (raw == null) {
    return null;
  }

  const result = {};

  for (const item of Array.isArray(raw) ? raw : [raw]) {
    if (typeof item === "string") {
      result[item] = null;
    } else {
      Object.assign(result, item);
    }
  }

  return result;
}

function isBrowserSandboxAllowed(snap) {
  if (snap.plugs != null) {
    for (const plugName of Object.keys(snap.plugs)) {
      const plug = snap.plugs[plugName];

      if (plug.interface === "browser-support" && plug["allow-sandbox"] === true) {
        return true;
      }
    }
  }

  return false;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=snap.js.map{"version":3,"sources":["../../src/targets/snap.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, deepAssign, executeAppBuilder, replaceDefault as _replaceDefault, serializeToYaml, toLinuxArchString, InvalidConfigurationError, log } from \"builder-util\"\nimport { asArray } from \"builder-util-runtime\"\nimport { outputFile, readFile } from \"fs-extra-p\"\nimport { safeLoad } from \"js-yaml\"\nimport * as path from \"path\"\nimport * as semver from \"semver\"\nimport { SnapOptions } from \"..\"\nimport { Target } from \"../core\"\nimport { LinuxPackager, toAppImageOrSnapArch } from \"../linuxPackager\"\nimport { PlugDescriptor } from \"../options/SnapOptions\"\nimport { getTemplatePath } from \"../util/pathManager\"\nimport { LinuxTargetHelper } from \"./LinuxTargetHelper\"\nimport { createStageDirPath } from \"./targetUtil\"\n\nconst defaultPlugs = [\"desktop\", \"desktop-legacy\", \"home\", \"x11\", \"unity7\", \"browser-support\", \"network\", \"gsettings\", \"pulseaudio\", \"opengl\"]\n\nexport default class SnapTarget extends Target {\n  readonly options: SnapOptions = {...this.packager.platformSpecificBuildOptions, ...(this.packager.config as any)[this.name]}\n\n  public isUseTemplateApp = false\n\n  constructor(name: string, private readonly packager: LinuxPackager, private readonly helper: LinuxTargetHelper, readonly outDir: string) {\n    super(name)\n  }\n\n  private replaceDefault(inList: Array<string> | null | undefined, defaultList: Array<string>) {\n    const result = _replaceDefault(inList, defaultList)\n    if (result !== defaultList) {\n      this.isUseTemplateApp = false\n    }\n    return result\n  }\n\n  private static getDefaultStagePackages() {\n    // libxss1 - was \"error while loading shared libraries: libXss.so.1\" on Xubuntu 16.04\n    // noinspection SpellCheckingInspection\n    return [\"libnspr4\", \"libnss3\", \"libxss1\", \"libappindicator3-1\", \"libsecret-1-0\"]\n  }\n\n  private async createDescriptor(arch: Arch): Promise<any> {\n    if (!this.isElectronVersionGreaterOrEqualThen(\"4.0.0\")) {\n      if (!this.isElectronVersionGreaterOrEqualThen(\"2.0.0-beta.1\")) {\n        throw new InvalidConfigurationError(\"Electron 2 and higher is required to build Snap\")\n      }\n\n      log.warn(\"Electron 4 and higher is highly recommended for Snap\")\n    }\n\n    const appInfo = this.packager.appInfo\n    const snapName = this.packager.executableName.toLowerCase()\n    const options = this.options\n    const linuxArchName = toAppImageOrSnapArch(arch)\n\n    const plugs = normalizePlugConfiguration(this.options.plugs)\n\n    const plugNames = this.replaceDefault(plugs == null ? null : Object.getOwnPropertyNames(plugs), defaultPlugs)\n    const buildPackages = asArray(options.buildPackages)\n    this.isUseTemplateApp = this.options.useTemplateApp !== false && arch === Arch.x64 && buildPackages.length === 0\n\n    const appDescriptor: any = {\n      command: \"command.sh\",\n      plugs: plugNames,\n      adapter: \"none\",\n    }\n\n    const snap: any = safeLoad(await readFile(path.join(getTemplatePath(\"snap\"), \"snapcraft.yaml\"), \"utf-8\"))\n    if (this.isUseTemplateApp) {\n      delete appDescriptor.adapter\n    }\n    if (options.grade != null) {\n      snap.grade = options.grade\n    }\n    if (options.confinement != null) {\n      snap.confinement = options.confinement\n    }\n    deepAssign(snap, {\n      name: snapName,\n      version: appInfo.version,\n      summary: options.summary || appInfo.productName,\n      description: this.helper.getDescription(options),\n      architectures: [toLinuxArchString(arch, true)],\n      apps: {\n        [snapName]: appDescriptor\n      },\n      parts: {\n        app: {\n          \"stage-packages\": this.replaceDefault(options.stagePackages, SnapTarget.getDefaultStagePackages()),\n        }\n      },\n    })\n\n    if (options.confinement === \"classic\") {\n      delete appDescriptor.plugs\n      delete snap.plugs\n    }\n    else {\n      appDescriptor.environment = {\n        TMPDIR: \"$XDG_RUNTIME_DIR\",\n        PATH: \"$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH\",\n        SNAP_DESKTOP_RUNTIME: \"$SNAP/gnome-platform\",\n        LD_LIBRARY_PATH: [\n          \"$SNAP_LIBRARY_PATH\",\n          \"$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/\" + linuxArchName + \"-linux-gnu:$SNAP/usr/lib/\" + linuxArchName + \"-linux-gnu\",\n          \"$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib\",\n          \"$SNAP/lib/\" + linuxArchName + \"-linux-gnu:$SNAP/usr/lib/\" + linuxArchName + \"-linux-gnu\"\n        ].join(\":\"),\n        ...options.environment,\n      }\n\n      if (plugs != null) {\n        for (const plugName of plugNames) {\n          const plugOptions = plugs[plugName]\n          if (plugOptions == null) {\n            continue\n          }\n\n          snap.plugs[plugName] = plugOptions\n        }\n      }\n    }\n\n    if (buildPackages.length > 0) {\n      snap.parts.app[\"build-packages\"] = buildPackages\n    }\n    if (options.after != null) {\n      snap.parts.app.after = options.after\n    }\n\n    if (options.assumes != null) {\n      snap.assumes = asArray(options.assumes)\n    }\n\n    return snap\n  }\n\n  async build(appOutDir: string, arch: Arch): Promise<any> {\n    const packager = this.packager\n    const options = this.options\n    // tslint:disable-next-line:no-invalid-template-strings\n    const artifactName = packager.expandArtifactNamePattern(this.options, \"snap\", arch, \"${name}_${version}_${arch}.${ext}\", false)\n    const artifactPath = path.join(this.outDir, artifactName)\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: \"snap\",\n      file: artifactPath,\n      arch,\n    })\n\n    const snap = await this.createDescriptor(arch)\n    if (this.isUseTemplateApp) {\n      delete snap.parts\n    }\n\n    const stageDir = await createStageDirPath(this, packager, arch)\n    const args = [\n      \"snap\",\n      \"--app\", appOutDir,\n      \"--stage\", stageDir,\n      \"--arch\", toLinuxArchString(arch, true),\n      \"--output\", artifactPath,\n      \"--executable\", this.packager.executableName,\n    ]\n\n    await this.helper.icons\n    if (this.helper.maxIconPath != null) {\n      if (!this.isUseTemplateApp) {\n        snap.icon = \"snap/gui/icon.png\"\n      }\n      args.push(\"--icon\", this.helper.maxIconPath)\n    }\n\n    // snapcraft.yaml inside a snap directory\n    const snapMetaDir = path.join(stageDir, this.isUseTemplateApp ? \"meta\" : \"snap\")\n    const desktopFile = path.join(snapMetaDir, \"gui\", `${snap.name}.desktop`)\n    await this.helper.writeDesktopEntry(this.options, packager.executableName, desktopFile, {\n      // tslint:disable:no-invalid-template-strings\n      Icon: \"${SNAP}/meta/gui/icon.png\"\n    })\n\n    if (this.isElectronVersionGreaterOrEqualThen(\"5.0.0\") && !isBrowserSandboxAllowed(snap)) {\n      args.push(\"--extraAppArgs=--no-sandbox\")\n      if (this.isUseTemplateApp) {\n        args.push(\"--exclude\", \"chrome-sandbox\")\n      }\n    }\n\n    if (packager.packagerOptions.effectiveOptionComputed != null && await packager.packagerOptions.effectiveOptionComputed({snap, desktopFile, args})) {\n      return\n    }\n\n    await outputFile(path.join(snapMetaDir, this.isUseTemplateApp ? \"snap.yaml\" : \"snapcraft.yaml\"), serializeToYaml(snap))\n\n    const hooksDir = await packager.getResource(options.hooks, \"snap-hooks\")\n    if (hooksDir != null) {\n      args.push(\"--hooks\", hooksDir)\n    }\n\n    if (this.isUseTemplateApp) {\n      args.push(\"--template-url\", \"electron4\")\n    }\n    await executeAppBuilder(args)\n\n    await packager.dispatchArtifactCreated(artifactPath, this, arch, packager.computeSafeArtifactName(artifactName, \"snap\", arch, false))\n  }\n\n  private isElectronVersionGreaterOrEqualThen(version: string) {\n    return semver.gte(this.packager.config.electronVersion || \"5.0.3\", version)\n  }\n}\n\nfunction normalizePlugConfiguration(raw: Array<string | PlugDescriptor> | PlugDescriptor | null | undefined): { [key: string]: {[name: string]: any; } | null } | null {\n  if (raw == null) {\n    return null\n  }\n\n  const result: any = {}\n  for (const item of (Array.isArray(raw) ? raw : [raw])) {\n    if (typeof item === \"string\") {\n      result[item] = null\n    }\n    else {\n      Object.assign(result, item)\n    }\n  }\n  return result\n}\n\nfunction isBrowserSandboxAllowed(snap: any): boolean {\n  if (snap.plugs != null) {\n    for (const plugName of Object.keys(snap.plugs)) {\n      const plug = snap.plugs[plugName]\n      if (plug.interface === \"browser-support\" && plug[\"allow-sandbox\"] === true) {\n        return true\n      }\n    }\n  }\n  return false\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.computeArchToTargetNamesMap = computeArchToTargetNamesMap;
exports.createTargets = createTargets;
exports.createCommonTarget = createCommonTarget;
exports.NoOpTarget = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("../index");

  _index = function () {
    return data;
  };

  return data;
}

function _ArchiveTarget() {
  const data = require("./ArchiveTarget");

  _ArchiveTarget = function () {
    return data;
  };

  return data;
}

const archiveTargets = new Set(["zip", "7z", "tar.xz", "tar.lz", "tar.gz", "tar.bz2"]);

function computeArchToTargetNamesMap(raw, options, platform) {
  for (const targetNames of raw.values()) {
    if (targetNames.length > 0) {
      // https://github.com/electron-userland/electron-builder/issues/1355
      return raw;
    }
  }

  const defaultArchs = raw.size === 0 ? [platform === _index().Platform.MAC ? "x64" : process.arch] : Array.from(raw.keys()).map(it => _builderUtil().Arch[it]);
  const result = new Map(raw);

  for (const target of (0, _builderUtil().asArray)(options.target).map(it => typeof it === "string" ? {
    target: it
  } : it)) {
    let name = target.target;
    let archs = target.arch;
    const suffixPos = name.lastIndexOf(":");

    if (suffixPos > 0) {
      name = target.target.substring(0, suffixPos);

      if (archs == null) {
        archs = target.target.substring(suffixPos + 1);
      }
    }

    for (const arch of archs == null ? defaultArchs : (0, _builderUtil().asArray)(archs)) {
      (0, _builderUtil().addValue)(result, (0, _builderUtil().archFromString)(arch), name);
    }
  }

  if (result.size === 0) {
    for (const arch of defaultArchs) {
      result.set((0, _builderUtil().archFromString)(arch), []);
    }
  }

  return result;
}

function createTargets(nameToTarget, rawList, outDir, packager) {
  const result = [];

  const mapper = (name, factory) => {
    let target = nameToTarget.get(name);

    if (target == null) {
      target = factory(outDir);
      nameToTarget.set(name, target);
    }

    result.push(target);
  };

  const targets = normalizeTargets(rawList, packager.defaultTarget);
  packager.createTargets(targets, mapper);
  return result;
}

function normalizeTargets(targets, defaultTarget) {
  const list = [];

  for (const t of targets) {
    const name = t.toLowerCase().trim();

    if (name === _index().DEFAULT_TARGET) {
      list.push(...defaultTarget);
    } else {
      list.push(name);
    }
  }

  return list;
}

function createCommonTarget(target, outDir, packager) {
  if (archiveTargets.has(target)) {
    return new (_ArchiveTarget().ArchiveTarget)(target, outDir, packager);
  } else if (target === _index().DIR_TARGET) {
    return new NoOpTarget(_index().DIR_TARGET);
  } else {
    throw new Error(`Unknown target: ${target}`);
  }
}

class NoOpTarget extends _index().Target {
  constructor(name) {
    super(name);
    this.options = null;
  }

  get outDir() {
    throw new Error("NoOpTarget");
  }

  build(appOutDir, arch) {// no build

    return (0, _bluebirdLst().coroutine)(function* () {})();
  }

} exports.NoOpTarget = NoOpTarget;
// __ts-babel@6.0.4
//# sourceMappingURL=targetFactory.js.map{"version":3,"sources":["../../src/targets/targetFactory.ts"],"names":[],"mappings":"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","sourcesContent":["import { addValue, Arch, archFromString, ArchType, asArray } from \"builder-util\"\nimport { PlatformSpecificBuildOptions, DEFAULT_TARGET, DIR_TARGET, Platform, Target, TargetConfiguration } from \"../index\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { ArchiveTarget } from \"./ArchiveTarget\"\n\nconst archiveTargets = new Set([\"zip\", \"7z\", \"tar.xz\", \"tar.lz\", \"tar.gz\", \"tar.bz2\"])\n\nexport function computeArchToTargetNamesMap(raw: Map<Arch, Array<string>>, options: PlatformSpecificBuildOptions, platform: Platform): Map<Arch, Array<string>> {\n  for (const targetNames of raw.values()) {\n    if (targetNames.length > 0) {\n      // https://github.com/electron-userland/electron-builder/issues/1355\n      return raw\n    }\n  }\n\n  const defaultArchs: Array<ArchType> = raw.size === 0 ? [platform === Platform.MAC ? \"x64\" : process.arch as ArchType] : Array.from(raw.keys()).map(it => Arch[it] as ArchType)\n  const result = new Map(raw)\n  for (const target of asArray(options.target).map<TargetConfiguration>(it => typeof it === \"string\" ? {target: it} : it)) {\n    let name = target.target\n    let archs = target.arch\n    const suffixPos = name.lastIndexOf(\":\")\n    if (suffixPos > 0) {\n      name = target.target.substring(0, suffixPos)\n      if (archs == null) {\n        archs = target.target.substring(suffixPos + 1) as ArchType\n      }\n    }\n\n    for (const arch of archs == null ? defaultArchs : asArray(archs)) {\n      addValue(result, archFromString(arch), name)\n    }\n  }\n\n  if (result.size === 0) {\n    for (const arch of defaultArchs) {\n      result.set(archFromString(arch), [])\n    }\n  }\n\n  return result\n}\n\nexport function createTargets(nameToTarget: Map<string, Target>, rawList: Array<string>, outDir: string, packager: PlatformPackager<any>): Array<Target> {\n  const result: Array<Target> = []\n\n  const mapper = (name: string, factory: (outDir: string) => Target) => {\n    let target = nameToTarget.get(name)\n    if (target == null) {\n      target = factory(outDir)\n      nameToTarget.set(name, target)\n    }\n    result.push(target)\n  }\n\n  const targets = normalizeTargets(rawList, packager.defaultTarget)\n  packager.createTargets(targets, mapper)\n  return result\n}\n\nfunction normalizeTargets(targets: Array<string>, defaultTarget: Array<string>): Array<string> {\n  const list: Array<string> = []\n  for (const t of targets) {\n    const name = t.toLowerCase().trim()\n    if (name === DEFAULT_TARGET) {\n      list.push(...defaultTarget)\n    }\n    else {\n      list.push(name)\n    }\n  }\n  return list\n}\n\nexport function createCommonTarget(target: string, outDir: string, packager: PlatformPackager<any>): Target {\n  if (archiveTargets.has(target)) {\n    return new ArchiveTarget(target, outDir, packager)\n  }\n  else if (target === DIR_TARGET) {\n    return new NoOpTarget(DIR_TARGET)\n  }\n  else {\n    throw new Error(`Unknown target: ${target}`)\n  }\n}\n\nexport class NoOpTarget extends Target {\n  readonly options = null\n\n  constructor(name: string) {\n    super(name)\n  }\n\n  get outDir(): string {\n    throw new Error(\"NoOpTarget\")\n  }\n\n  async build(appOutDir: string, arch: Arch): Promise<any> {\n    // no build\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createStageDir = createStageDir;
exports.createStageDirPath = createStageDirPath;
exports.getWindowsInstallationDirName = getWindowsInstallationDirName;
exports.StageDir = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class StageDir {
  constructor(dir) {
    this.dir = dir;
  }

  getTempFile(name) {
    return this.dir + path.sep + name;
  }

  cleanup() {
    if (!_builderUtil().debug.enabled || process.env.ELECTRON_BUILDER_REMOVE_STAGE_EVEN_IF_DEBUG === "true") {
      return (0, _fsExtraP().remove)(this.dir);
    }

    return Promise.resolve();
  }

  toString() {
    return this.dir;
  }

}

exports.StageDir = StageDir;

function createStageDir(_x, _x2, _x3) {
  return _createStageDir.apply(this, arguments);
}

function _createStageDir() {
  _createStageDir = (0, _bluebirdLst().coroutine)(function* (target, packager, arch) {
    return new StageDir((yield createStageDirPath(target, packager, arch)));
  });
  return _createStageDir.apply(this, arguments);
}

function createStageDirPath(_x4, _x5, _x6) {
  return _createStageDirPath.apply(this, arguments);
} // https://github.com/electron-userland/electron-builder/issues/3100
// https://github.com/electron-userland/electron-builder/commit/2539cfba20dc639128e75c5b786651b652bb4b78


function _createStageDirPath() {
  _createStageDirPath = (0, _bluebirdLst().coroutine)(function* (target, packager, arch) {
    const tempDir = packager.info.stageDirPathCustomizer(target, packager, arch);
    yield (0, _fsExtraP().emptyDir)(tempDir);
    return tempDir;
  });
  return _createStageDirPath.apply(this, arguments);
}

function getWindowsInstallationDirName(appInfo, isTryToUseProductName) {
  return isTryToUseProductName && /^[-_+0-9a-zA-Z .]+$/.test(appInfo.productFilename) ? appInfo.productFilename : appInfo.sanitizedName;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=targetUtil.js.map{"version":3,"sources":["../../src/targets/targetUtil.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAGM,MAAO,QAAP,CAAe;AACnB,EAAA,WAAA,CAAqB,GAArB,EAAgC;AAAX,SAAA,GAAA,GAAA,GAAA;AACpB;;AAED,EAAA,WAAW,CAAC,IAAD,EAAa;AACtB,WAAO,KAAK,GAAL,GAAW,IAAI,CAAC,GAAhB,GAAsB,IAA7B;AACD;;AAED,EAAA,OAAO,GAAA;AACL,QAAI,CAAC,qBAAM,OAAP,IAAkB,OAAO,CAAC,GAAR,CAAY,2CAAZ,KAA4D,MAAlF,EAA0F;AACxF,aAAO,wBAAO,KAAK,GAAZ,CAAP;AACD;;AACD,WAAO,OAAO,CAAC,OAAR,EAAP;AACD;;AAED,EAAA,QAAQ,GAAA;AACN,WAAO,KAAK,GAAZ;AACD;;AAjBkB;;;;SAoBC,c;;;;;kDAAf,WAA8B,MAA9B,EAA8C,QAA9C,EAA+E,IAA/E,EAAyF;AAC9F,WAAO,IAAI,QAAJ,QAAmB,kBAAkB,CAAC,MAAD,EAAS,QAAT,EAAmB,IAAnB,CAArC,EAAP;AACD,G;;;;SAEqB,kB;;EAMtB;AACA;;;;sDAPO,WAAkC,MAAlC,EAAkD,QAAlD,EAAmF,IAAnF,EAA6F;AAClG,UAAM,OAAO,GAAG,QAAQ,CAAC,IAAT,CAAc,sBAAd,CAAqC,MAArC,EAA6C,QAA7C,EAAuD,IAAvD,CAAhB;AACA,UAAM,0BAAS,OAAT,CAAN;AACA,WAAO,OAAP;AACD,G;;;;AAIK,SAAU,6BAAV,CAAwC,OAAxC,EAA0D,qBAA1D,EAAwF;AAC5F,SAAO,qBAAqB,IAAI,sBAAsB,IAAtB,CAA2B,OAAO,CAAC,eAAnC,CAAzB,GAA+E,OAAO,CAAC,eAAvF,GAAyG,OAAO,CAAC,aAAxH;AACD,C","sourcesContent":["import { emptyDir, remove } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { Target, AppInfo } from \"../\"\nimport { Arch, debug } from \"builder-util\"\nimport { PlatformPackager } from \"../platformPackager\"\n\nexport class StageDir {\n  constructor(readonly dir: string) {\n  }\n\n  getTempFile(name: string) {\n    return this.dir + path.sep + name\n  }\n\n  cleanup() {\n    if (!debug.enabled || process.env.ELECTRON_BUILDER_REMOVE_STAGE_EVEN_IF_DEBUG === \"true\") {\n      return remove(this.dir)\n    }\n    return Promise.resolve()\n  }\n\n  toString() {\n    return this.dir\n  }\n}\n\nexport async function createStageDir(target: Target, packager: PlatformPackager<any>, arch: Arch): Promise<StageDir> {\n  return new StageDir(await createStageDirPath(target, packager, arch))\n}\n\nexport async function createStageDirPath(target: Target, packager: PlatformPackager<any>, arch: Arch): Promise<string> {\n  const tempDir = packager.info.stageDirPathCustomizer(target, packager, arch)\n  await emptyDir(tempDir)\n  return tempDir\n}\n\n// https://github.com/electron-userland/electron-builder/issues/3100\n// https://github.com/electron-userland/electron-builder/commit/2539cfba20dc639128e75c5b786651b652bb4b78\nexport function getWindowsInstallationDirName(appInfo: AppInfo, isTryToUseProductName: boolean): string {\n  return isTryToUseProductName && /^[-_+0-9a-zA-Z .]+$/.test(appInfo.productFilename) ? appInfo.productFilename : appInfo.sanitizedName\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getLinuxToolsPath = getLinuxToolsPath;
exports.prefetchBuildTools = prefetchBuildTools;
exports.fpmPath = void 0;

function _binDownload() {
  const data = require("../binDownload");

  _binDownload = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function getLinuxToolsPath() {
  //noinspection SpellCheckingInspection
  return (0, _binDownload().getBinFromUrl)("linux-tools", "mac-10.12.3", "SQ8fqIRVXuQVWnVgaMTDWyf2TLAJjJYw3tRSqQJECmgF6qdM7Kogfa6KD49RbGzzMYIFca9Uw3MdsxzOPRWcYw==");
}

const fpmPath = new (_lazyVal().Lazy)(() => {
  if (process.platform === "win32" || process.env.USE_SYSTEM_FPM === "true") {
    return Promise.resolve("fpm");
  }

  return (0, _binDownload().getBin)("fpm").then(it => path.join(it, "fpm"));
}); // noinspection JSUnusedGlobalSymbols

exports.fpmPath = fpmPath;

function prefetchBuildTools() {
  // yes, we starting to use native Promise
  return fpmPath.value;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=tools.js.map{"version":3,"sources":["../../src/targets/tools.ts"],"names":[],"mappings":";;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;;;AAEM,SAAU,iBAAV,GAA2B;AAC/B;AACA,SAAO,kCAAc,aAAd,EAA6B,aAA7B,EAA4C,0FAA5C,CAAP;AACD;;AAEM,MAAM,OAAO,GAAG,KAAI,eAAJ,EAAS,MAAK;AACnC,MAAI,OAAO,CAAC,QAAR,KAAqB,OAArB,IAAgC,OAAO,CAAC,GAAR,CAAY,cAAZ,KAA+B,MAAnE,EAA2E;AACzE,WAAO,OAAO,CAAC,OAAR,CAAgB,KAAhB,CAAP;AACD;;AAED,SAAO,2BAAO,KAAP,EACJ,IADI,CACC,EAAE,IAAI,IAAI,CAAC,IAAL,CAAU,EAAV,EAAc,KAAd,CADP,CAAP;AAED,CAPsB,CAAhB,C,CASP;;;;AACM,SAAU,kBAAV,GAA4B;AAChC;AACA,SAAO,OAAO,CAAC,KAAf;AACD,C","sourcesContent":["import { getBin, getBinFromUrl } from \"../binDownload\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\n\nexport function getLinuxToolsPath() {\n  //noinspection SpellCheckingInspection\n  return getBinFromUrl(\"linux-tools\", \"mac-10.12.3\", \"SQ8fqIRVXuQVWnVgaMTDWyf2TLAJjJYw3tRSqQJECmgF6qdM7Kogfa6KD49RbGzzMYIFca9Uw3MdsxzOPRWcYw==\")\n}\n\nexport const fpmPath = new Lazy(() => {\n  if (process.platform === \"win32\" || process.env.USE_SYSTEM_FPM === \"true\") {\n    return Promise.resolve(\"fpm\")\n  }\n\n  return getBin(\"fpm\")\n    .then(it => path.join(it, \"fpm\"))\n})\n\n// noinspection JSUnusedGlobalSymbols\nexport function prefetchBuildTools(): Promise<any> {\n  // yes, we starting to use native Promise\n  return fpmPath.value\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.NsisTarget = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _zipBin() {
  const data = require("7zip-bin");

  _zipBin = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _binDownload() {
  const data = require("../../binDownload");

  _binDownload = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _hash() {
  const data = require("../../util/hash");

  _hash = function () {
    return data;
  };

  return data;
}

var _debug2 = _interopRequireDefault(require("debug"));

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _core() {
  const data = require("../../core");

  _core = function () {
    return data;
  };

  return data;
}

function _CommonWindowsInstallerConfiguration() {
  const data = require("../../options/CommonWindowsInstallerConfiguration");

  _CommonWindowsInstallerConfiguration = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("../../platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _timer() {
  const data = require("../../util/timer");

  _timer = function () {
    return data;
  };

  return data;
}

function _wine() {
  const data = require("../../wine");

  _wine = function () {
    return data;
  };

  return data;
}

function _archive() {
  const data = require("../archive");

  _archive = function () {
    return data;
  };

  return data;
}

function _differentialUpdateInfoBuilder() {
  const data = require("../differentialUpdateInfoBuilder");

  _differentialUpdateInfoBuilder = function () {
    return data;
  };

  return data;
}

function _targetUtil() {
  const data = require("../targetUtil");

  _targetUtil = function () {
    return data;
  };

  return data;
}

function _nsisLang() {
  const data = require("./nsisLang");

  _nsisLang = function () {
    return data;
  };

  return data;
}

function _nsisLicense() {
  const data = require("./nsisLicense");

  _nsisLicense = function () {
    return data;
  };

  return data;
}

function _nsisScriptGenerator() {
  const data = require("./nsisScriptGenerator");

  _nsisScriptGenerator = function () {
    return data;
  };

  return data;
}

function _nsisUtil() {
  const data = require("./nsisUtil");

  _nsisUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const debug = (0, _debug2.default)("electron-builder:nsis"); // noinspection SpellCheckingInspection

const ELECTRON_BUILDER_NS_UUID = _builderUtilRuntime().UUID.parse("50e065bc-3134-11e6-9bab-38c9862bdaf3"); // noinspection SpellCheckingInspection


const nsisResourcePathPromise = new (_lazyVal().Lazy)(() => (0, _binDownload().getBinFromUrl)("nsis-resources", "3.3.0", "4okc98BD0v9xDcSjhPVhAkBMqos+FvD/5/H72fTTIwoHTuWd2WdD7r+1j72hxd+ZXxq1y3FRW0x6Z3jR0VfpMw=="));
const USE_NSIS_BUILT_IN_COMPRESSOR = false;

class NsisTarget extends _core().Target {
  constructor(packager, outDir, targetName, packageHelper) {
    super(targetName);
    this.packager = packager;
    this.outDir = outDir;
    this.packageHelper = packageHelper;
    /** @private */

    this.archs = new Map();
    this.packageHelper.refCount++;
    this.options = targetName === "portable" ? Object.create(null) : Object.assign({}, this.packager.config.nsis, {
      preCompressedFileExtensions: [".avi", ".mov", ".m4v", ".mp4", ".m4p", ".qt", ".mkv", ".webm", ".vmdk"]
    });

    if (targetName !== "nsis") {
      Object.assign(this.options, this.packager.config[targetName === "nsis-web" ? "nsisWeb" : targetName]);
    }

    const deps = packager.info.metadata.dependencies;

    if (deps != null && deps["electron-squirrel-startup"] != null) {
      _builderUtil().log.warn('"electron-squirrel-startup" dependency is not required for NSIS');
    }
  }

  build(appOutDir, arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      _this.archs.set(arch, appOutDir);
    })();
  }

  get isBuildDifferentialAware() {
    return !this.isPortable && this.options.differentialPackage !== false;
  }

  getPreCompressedFileExtensions() {
    const result = this.isWebInstaller ? null : this.options.preCompressedFileExtensions;
    return result == null ? null : (0, _builderUtil().asArray)(result).map(it => it.startsWith(".") ? it : `.${it}`);
  }
  /** @private */


  buildAppPackage(appOutDir, arch) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const options = _this2.options;
      const packager = _this2.packager;
      const isBuildDifferentialAware = _this2.isBuildDifferentialAware;
      const format = !isBuildDifferentialAware && options.useZip ? "zip" : "7z";
      const archiveFile = path.join(_this2.outDir, `${packager.appInfo.sanitizedName}-${packager.appInfo.version}-${_builderUtil().Arch[arch]}.nsis.${format}`);

      const preCompressedFileExtensions = _this2.getPreCompressedFileExtensions();

      const archiveOptions = {
        withoutDir: true,
        compression: packager.compression,
        excluded: preCompressedFileExtensions == null ? null : preCompressedFileExtensions.map(it => `*${it}`)
      };
      const timer = (0, _timer().time)(`nsis package, ${_builderUtil().Arch[arch]}`);
      yield (0, _archive().archive)(format, archiveFile, appOutDir, isBuildDifferentialAware ? (0, _differentialUpdateInfoBuilder().configureDifferentialAwareArchiveOptions)(archiveOptions) : archiveOptions);
      timer.end();

      if (isBuildDifferentialAware && _this2.isWebInstaller) {
        const data = yield (0, _differentialUpdateInfoBuilder().appendBlockmap)(archiveFile);
        return Object.assign({}, data, {
          path: archiveFile
        });
      } else {
        return yield createPackageFileInfo(archiveFile);
      }
    })();
  }

  finishBuild() {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      try {
        yield _this3.buildInstaller();
      } finally {
        yield _this3.packageHelper.finishBuild();
      }
    })();
  }

  get installerFilenamePattern() {
    // tslint:disable:no-invalid-template-strings
    return "${productName} " + (this.isPortable ? "" : "Setup ") + "${version}.${ext}";
  }

  get isPortable() {
    return this.name === "portable";
  }

  buildInstaller() {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this4.packager;
      const appInfo = packager.appInfo;
      const options = _this4.options;
      const installerFilename = packager.expandArtifactNamePattern(options, "exe", null, _this4.installerFilenamePattern);
      const oneClick = options.oneClick !== false;
      const installerPath = path.join(_this4.outDir, installerFilename);
      const logFields = {
        target: _this4.name,
        file: _builderUtil().log.filePath(installerPath),
        archs: Array.from(_this4.archs.keys()).map(it => _builderUtil().Arch[it]).join(", ")
      };
      const isPerMachine = options.perMachine === true;

      if (!_this4.isPortable) {
        logFields.oneClick = oneClick;
        logFields.perMachine = isPerMachine;
      }

      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: _this4.name,
        file: installerPath,
        arch: null
      }, logFields);

      const guid = options.guid || _builderUtilRuntime().UUID.v5(appInfo.id, ELECTRON_BUILDER_NS_UUID);

      const uninstallAppKey = guid.replace(/\\/g, " - ");
      const defines = {
        APP_ID: appInfo.id,
        APP_GUID: guid,
        // Windows bug - entry in Software\Microsoft\Windows\CurrentVersion\Uninstall cannot have \ symbols (dir)
        UNINSTALL_APP_KEY: uninstallAppKey,
        PRODUCT_NAME: appInfo.productName,
        PRODUCT_FILENAME: appInfo.productFilename,
        APP_FILENAME: (0, _targetUtil().getWindowsInstallationDirName)(appInfo, !oneClick || isPerMachine),
        APP_DESCRIPTION: appInfo.description,
        VERSION: appInfo.version,
        PROJECT_DIR: packager.projectDir,
        BUILD_RESOURCES_DIR: packager.info.buildResourcesDir,
        APP_PACKAGE_NAME: appInfo.name
      };

      if (uninstallAppKey !== guid) {
        defines.UNINSTALL_REGISTRY_KEY_2 = `Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${guid}`;
      }

      const commands = {
        OutFile: `"${installerPath}"`,
        VIProductVersion: appInfo.getVersionInWeirdWindowsForm(),
        VIAddVersionKey: _this4.computeVersionKey(),
        Unicode: _this4.isUnicodeEnabled
      };
      const isPortable = _this4.isPortable;
      const iconPath = (isPortable ? null : yield packager.getResource(options.installerIcon, "installerIcon.ico")) || (yield packager.getIconPath());

      if (iconPath != null) {
        if (isPortable) {
          commands.Icon = `"${iconPath}"`;
        } else {
          defines.MUI_ICON = iconPath;
          defines.MUI_UNICON = iconPath;
        }
      }

      const packageFiles = {};
      let estimatedSize = 0;

      if (_this4.isPortable && options.useZip) {
        for (const [arch, dir] of _this4.archs.entries()) {
          defines[arch === _builderUtil().Arch.x64 ? "APP_DIR_64" : "APP_DIR_32"] = dir;
        }
      } else if (USE_NSIS_BUILT_IN_COMPRESSOR && _this4.archs.size === 1) {
        defines.APP_BUILD_DIR = _this4.archs.get(_this4.archs.keys().next().value);
      } else {
        yield _bluebirdLst().default.map(_this4.archs.keys(),
        /*#__PURE__*/
        function () {
          var _ref = (0, _bluebirdLst().coroutine)(function* (arch) {
            const fileInfo = yield _this4.packageHelper.packArch(arch, _this4);
            const file = fileInfo.path;
            const defineKey = arch === _builderUtil().Arch.x64 ? "APP_64" : "APP_32";
            defines[defineKey] = file;
            defines[`${defineKey}_NAME`] = path.basename(file); // nsis expect a hexadecimal string

            defines[`${defineKey}_HASH`] = Buffer.from(fileInfo.sha512, "base64").toString("hex").toUpperCase();

            if (_this4.isWebInstaller) {
              yield packager.dispatchArtifactCreated(file, _this4, arch);
              packageFiles[_builderUtil().Arch[arch]] = fileInfo;
            }

            const archiveInfo = (yield (0, _builderUtil().exec)(_zipBin().path7za, ["l", file])).trim(); // after adding blockmap data will be "Warnings: 1" in the end of output

            const match = archiveInfo.match(/(\d+)\s+\d+\s+\d+\s+files/);

            if (match == null) {
              _builderUtil().log.warn({
                output: archiveInfo
              }, "cannot compute size of app package");
            } else {
              estimatedSize += parseInt(match[1], 10);
            }
          });

          return function (_x) {
            return _ref.apply(this, arguments);
          };
        }());
      }

      _this4.configureDefinesForAllTypeOfInstaller(defines);

      if (isPortable) {
        const portableOptions = options;
        defines.REQUEST_EXECUTION_LEVEL = portableOptions.requestExecutionLevel || "user";
        defines.UNPACK_DIR_NAME = portableOptions.unpackDirName || (yield (0, _builderUtil().executeAppBuilder)(["ksuid"]));
      } else {
        yield _this4.configureDefines(oneClick, defines);
      }

      if (estimatedSize !== 0) {
        // in kb
        defines.ESTIMATED_SIZE = Math.round(estimatedSize / 1024);
      }

      if (packager.compression === "store") {
        commands.SetCompress = "off";
      } else {
        // difference - 33.540 vs 33.601, only 61 KB (but zip is faster to decompress)
        // do not use /SOLID - "With solid compression, files are uncompressed to temporary file before they are copied to their final destination",
        // it is not good for portable installer (where built-in NSIS compression is used). http://forums.winamp.com/showpost.php?p=2982902&postcount=6
        commands.SetCompressor = "zlib";

        if (!_this4.isWebInstaller) {
          defines.COMPRESS = "auto";
        }
      }

      debug(defines);
      debug(commands);

      if (packager.packagerOptions.effectiveOptionComputed != null && (yield packager.packagerOptions.effectiveOptionComputed([defines, commands]))) {
        return;
      }

      const sharedHeader = yield _this4.computeCommonInstallerScriptHeader();
      const script = isPortable ? yield (0, _fsExtraP().readFile)(path.join(_nsisUtil().nsisTemplatesDir, "portable.nsi"), "utf8") : yield _this4.computeScriptAndSignUninstaller(defines, commands, installerPath, sharedHeader);
      yield _this4.executeMakensis(defines, commands, sharedHeader + (yield _this4.computeFinalScript(script, true)));
      yield Promise.all([packager.sign(installerPath), defines.UNINSTALLER_OUT_FILE == null ? Promise.resolve() : (0, _fsExtraP().unlink)(defines.UNINSTALLER_OUT_FILE)]);
      const safeArtifactName = (0, _platformPackager().isSafeGithubName)(installerFilename) ? installerFilename : _this4.generateGitHubInstallerName();
      let updateInfo;

      if (_this4.isWebInstaller) {
        updateInfo = (0, _differentialUpdateInfoBuilder().createNsisWebDifferentialUpdateInfo)(installerPath, packageFiles);
      } else if (_this4.isBuildDifferentialAware) {
        updateInfo = yield (0, _differentialUpdateInfoBuilder().createBlockmap)(installerPath, _this4, packager, safeArtifactName);
      }

      if (updateInfo != null && isPerMachine && oneClick) {
        updateInfo.isAdminRightsRequired = true;
      }

      yield packager.info.callArtifactBuildCompleted({
        file: installerPath,
        updateInfo,
        target: _this4,
        packager,
        arch: _this4.archs.size === 1 ? _this4.archs.keys().next().value : null,
        safeArtifactName,
        isWriteUpdateInfo: !_this4.isPortable
      });
    })();
  }

  generateGitHubInstallerName() {
    const appInfo = this.packager.appInfo;
    const classifier = appInfo.name.toLowerCase() === appInfo.name ? "setup-" : "Setup-";
    return `${appInfo.name}-${this.isPortable ? "" : classifier}${appInfo.version}.exe`;
  }

  get isUnicodeEnabled() {
    return this.options.unicode !== false;
  }

  get isWebInstaller() {
    return false;
  }

  computeScriptAndSignUninstaller(defines, commands, installerPath, sharedHeader) {
    var _this5 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this5.packager;
      const customScriptPath = yield packager.getResource(_this5.options.script, "installer.nsi");
      const script = yield (0, _fsExtraP().readFile)(customScriptPath || path.join(_nsisUtil().nsisTemplatesDir, "installer.nsi"), "utf8");

      if (customScriptPath != null) {
        _builderUtil().log.info({
          reason: "custom NSIS script is used"
        }, "uninstaller is not signed by electron-builder");

        return script;
      } // https://github.com/electron-userland/electron-builder/issues/2103
      // it is more safe and reliable to write uninstaller to our out dir


      const uninstallerPath = path.join(_this5.outDir, `.__uninstaller-${_this5.name}-${_this5.packager.appInfo.sanitizedName}.exe`);
      const isWin = process.platform === "win32";
      defines.BUILD_UNINSTALLER = null;
      defines.UNINSTALLER_OUT_FILE = isWin ? uninstallerPath : path.win32.join("Z:", uninstallerPath);
      yield _this5.executeMakensis(defines, commands, sharedHeader + (yield _this5.computeFinalScript(script, false)));
      yield (0, _wine().execWine)(installerPath);
      yield packager.sign(uninstallerPath, "  Signing NSIS uninstaller");
      delete defines.BUILD_UNINSTALLER; // platform-specific path, not wine

      defines.UNINSTALLER_OUT_FILE = uninstallerPath;
      return script;
    })();
  }

  computeVersionKey() {
    // Error: invalid VIProductVersion format, should be X.X.X.X
    // so, we must strip beta
    const localeId = this.options.language || "1033";
    const appInfo = this.packager.appInfo;
    const versionKey = [`/LANG=${localeId} ProductName "${appInfo.productName}"`, `/LANG=${localeId} ProductVersion "${appInfo.version}"`, `/LANG=${localeId} LegalCopyright "${appInfo.copyright}"`, `/LANG=${localeId} FileDescription "${appInfo.description}"`, `/LANG=${localeId} FileVersion "${appInfo.buildVersion}"`];
    (0, _builderUtil().use)(this.packager.platformSpecificBuildOptions.legalTrademarks, it => versionKey.push(`/LANG=${localeId} LegalTrademarks "${it}"`));
    (0, _builderUtil().use)(appInfo.companyName, it => versionKey.push(`/LANG=${localeId} CompanyName "${it}"`));
    return versionKey;
  }

  configureDefines(oneClick, defines) {
    const packager = this.packager;
    const options = this.options;
    const asyncTaskManager = new (_builderUtil().AsyncTaskManager)(packager.info.cancellationToken);

    if (oneClick) {
      defines.ONE_CLICK = null;

      if (options.runAfterFinish !== false) {
        defines.RUN_AFTER_FINISH = null;
      }

      asyncTaskManager.add(
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        const installerHeaderIcon = yield packager.getResource(options.installerHeaderIcon, "installerHeaderIcon.ico");

        if (installerHeaderIcon != null) {
          defines.HEADER_ICO = installerHeaderIcon;
        }
      }));
    } else {
      if (options.runAfterFinish === false) {
        defines.HIDE_RUN_AFTER_FINISH = null;
      }

      asyncTaskManager.add(
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        const installerHeader = yield packager.getResource(options.installerHeader, "installerHeader.bmp");

        if (installerHeader != null) {
          defines.MUI_HEADERIMAGE = null;
          defines.MUI_HEADERIMAGE_RIGHT = null;
          defines.MUI_HEADERIMAGE_BITMAP = installerHeader;
        }
      }));
      asyncTaskManager.add(
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        const bitmap = (yield packager.getResource(options.installerSidebar, "installerSidebar.bmp")) || "${NSISDIR}\\Contrib\\Graphics\\Wizard\\nsis3-metro.bmp";
        defines.MUI_WELCOMEFINISHPAGE_BITMAP = bitmap;
        defines.MUI_UNWELCOMEFINISHPAGE_BITMAP = (yield packager.getResource(options.uninstallerSidebar, "uninstallerSidebar.bmp")) || bitmap;
      }));

      if (options.allowElevation !== false) {
        defines.MULTIUSER_INSTALLMODE_ALLOW_ELEVATION = null;
      }
    }

    if (options.perMachine === true) {
      defines.INSTALL_MODE_PER_ALL_USERS = null;
    }

    if (!oneClick || options.perMachine === true) {
      defines.INSTALL_MODE_PER_ALL_USERS_REQUIRED = null;
    }

    if (options.allowToChangeInstallationDirectory) {
      if (oneClick) {
        throw new (_builderUtil().InvalidConfigurationError)("allowToChangeInstallationDirectory makes sense only for assisted installer (please set oneClick to false)");
      }

      defines.allowToChangeInstallationDirectory = null;
    }

    const commonOptions = (0, _CommonWindowsInstallerConfiguration().getEffectiveOptions)(options, packager);

    if (commonOptions.menuCategory != null) {
      defines.MENU_FILENAME = commonOptions.menuCategory;
    }

    defines.SHORTCUT_NAME = commonOptions.shortcutName;

    if (options.deleteAppDataOnUninstall) {
      defines.DELETE_APP_DATA_ON_UNINSTALL = null;
    }

    asyncTaskManager.add(
    /*#__PURE__*/
    (0, _bluebirdLst().coroutine)(function* () {
      const uninstallerIcon = yield packager.getResource(options.uninstallerIcon, "uninstallerIcon.ico");

      if (uninstallerIcon != null) {
        // we don't need to copy MUI_UNICON (defaults to app icon), so, we have 2 defines
        defines.UNINSTALLER_ICON = uninstallerIcon;
        defines.MUI_UNICON = uninstallerIcon;
      }
    }));
    defines.UNINSTALL_DISPLAY_NAME = packager.expandMacro(options.uninstallDisplayName || "${productName} ${version}", null, {}, false);

    if (commonOptions.isCreateDesktopShortcut === _CommonWindowsInstallerConfiguration().DesktopShortcutCreationPolicy.NEVER) {
      defines.DO_NOT_CREATE_DESKTOP_SHORTCUT = null;
    }

    if (commonOptions.isCreateDesktopShortcut === _CommonWindowsInstallerConfiguration().DesktopShortcutCreationPolicy.ALWAYS) {
      defines.RECREATE_DESKTOP_SHORTCUT = null;
    }

    if (!commonOptions.isCreateStartMenuShortcut) {
      defines.DO_NOT_CREATE_START_MENU_SHORTCUT = null;
    }

    if (options.displayLanguageSelector === true) {
      defines.DISPLAY_LANG_SELECTOR = null;
    }

    return asyncTaskManager.awaitTasks();
  }

  configureDefinesForAllTypeOfInstaller(defines) {
    const appInfo = this.packager.appInfo;
    const companyName = appInfo.companyName;

    if (companyName != null) {
      defines.COMPANY_NAME = companyName;
    } // electron uses product file name as app data, define it as well to remove on uninstall


    if (defines.APP_FILENAME !== appInfo.productFilename) {
      defines.APP_PRODUCT_FILENAME = appInfo.productFilename;
    }

    if (this.isWebInstaller) {
      defines.APP_PACKAGE_STORE_FILE = `${appInfo.updaterCacheDirName}\\${_builderUtilRuntime().CURRENT_APP_PACKAGE_FILE_NAME}`;
    } else {
      defines.APP_INSTALLER_STORE_FILE = `${appInfo.updaterCacheDirName}\\${_builderUtilRuntime().CURRENT_APP_INSTALLER_FILE_NAME}`;
    }

    if (!this.isWebInstaller && defines.APP_BUILD_DIR == null) {
      const options = this.options;

      if (options.useZip) {
        defines.ZIP_COMPRESSION = null;
      }

      defines.COMPRESSION_METHOD = options.useZip ? "zip" : "7z";
    }
  }

  executeMakensis(defines, commands, script) {
    var _this6 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const args = _this6.options.warningsAsErrors === false ? [] : ["-WX"];

      for (const name of Object.keys(defines)) {
        const value = defines[name];

        if (value == null) {
          args.push(`-D${name}`);
        } else {
          args.push(`-D${name}=${value}`);
        }
      }

      for (const name of Object.keys(commands)) {
        const value = commands[name];

        if (Array.isArray(value)) {
          for (const c of value) {
            args.push(`-X${name} ${c}`);
          }
        } else {
          args.push(`-X${name} ${value}`);
        }
      }

      args.push("-");

      if (_this6.packager.debugLogger.isEnabled) {
        _this6.packager.debugLogger.add("nsis.script", script);
      }

      const nsisPath = yield _nsisUtil().NSIS_PATH.value;
      const command = path.join(nsisPath, process.platform === "darwin" ? "mac" : process.platform === "win32" ? "Bin" : "linux", process.platform === "win32" ? "makensis.exe" : "makensis");
      yield (0, _builderUtil().spawnAndWrite)(command, args, script, {
        // we use NSIS_CONFIG_CONST_DATA_PATH=no to build makensis on Linux, but in any case it doesn't use stubs as MacOS/Windows version, so, we explicitly set NSISDIR
        env: Object.assign({}, process.env, {
          NSISDIR: nsisPath
        }),
        cwd: _nsisUtil().nsisTemplatesDir
      });
    })();
  }

  computeCommonInstallerScriptHeader() {
    var _this7 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this7.packager;
      const options = _this7.options;
      const scriptGenerator = new (_nsisScriptGenerator().NsisScriptGenerator)();
      const langConfigurator = new (_nsisLang().LangConfigurator)(options);
      scriptGenerator.include(path.join(_nsisUtil().nsisTemplatesDir, "include", "StdUtils.nsh"));
      const includeDir = path.join(_nsisUtil().nsisTemplatesDir, "include");
      scriptGenerator.addIncludeDir(includeDir);
      scriptGenerator.flags(["updated", "force-run", "keep-shortcuts", "no-desktop-shortcut", "delete-app-data", "allusers", "currentuser"]);
      (0, _nsisLang().createAddLangsMacro)(scriptGenerator, langConfigurator);
      const taskManager = new (_builderUtil().AsyncTaskManager)(packager.info.cancellationToken);
      const pluginArch = _this7.isUnicodeEnabled ? "x86-unicode" : "x86-ansi";
      taskManager.add(
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        scriptGenerator.addPluginDir(pluginArch, path.join((yield nsisResourcePathPromise.value), "plugins", pluginArch));
      }));
      taskManager.add(
      /*#__PURE__*/
      (0, _bluebirdLst().coroutine)(function* () {
        const userPluginDir = path.join(packager.info.buildResourcesDir, pluginArch);
        const stat = yield (0, _fs().statOrNull)(userPluginDir);

        if (stat != null && stat.isDirectory()) {
          scriptGenerator.addPluginDir(pluginArch, userPluginDir);
        }
      }));
      taskManager.addTask((0, _nsisLang().addCustomMessageFileInclude)("messages.yml", packager, scriptGenerator, langConfigurator));

      if (!_this7.isPortable) {
        if (options.oneClick === false) {
          taskManager.addTask((0, _nsisLang().addCustomMessageFileInclude)("assistedMessages.yml", packager, scriptGenerator, langConfigurator));
        }

        taskManager.add(
        /*#__PURE__*/
        (0, _bluebirdLst().coroutine)(function* () {
          const customInclude = yield packager.getResource(_this7.options.include, "installer.nsh");

          if (customInclude != null) {
            scriptGenerator.addIncludeDir(packager.info.buildResourcesDir);
            scriptGenerator.include(customInclude);
          }
        }));
      }

      yield taskManager.awaitTasks();
      return scriptGenerator.build();
    })();
  }

  computeFinalScript(originalScript, isInstaller) {
    var _this8 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this8.packager;
      const options = _this8.options;
      const langConfigurator = new (_nsisLang().LangConfigurator)(options);
      const scriptGenerator = new (_nsisScriptGenerator().NsisScriptGenerator)();
      const taskManager = new (_builderUtil().AsyncTaskManager)(packager.info.cancellationToken);

      if (isInstaller) {
        // http://stackoverflow.com/questions/997456/nsis-license-file-based-on-language-selection
        taskManager.add(() => (0, _nsisLicense().computeLicensePage)(packager, options, scriptGenerator, langConfigurator.langs));
      }

      yield taskManager.awaitTasks();

      if (_this8.isPortable) {
        return scriptGenerator.build() + originalScript;
      }

      const preCompressedFileExtensions = _this8.getPreCompressedFileExtensions();

      if (preCompressedFileExtensions != null && preCompressedFileExtensions.length !== 0) {
        for (const [arch, dir] of _this8.archs.entries()) {
          yield generateForPreCompressed(preCompressedFileExtensions, dir, arch, scriptGenerator);
        }
      }

      const fileAssociations = packager.fileAssociations;

      if (fileAssociations.length !== 0) {
        scriptGenerator.include(path.join(path.join(_nsisUtil().nsisTemplatesDir, "include"), "FileAssociation.nsh"));

        if (isInstaller) {
          const registerFileAssociationsScript = new (_nsisScriptGenerator().NsisScriptGenerator)();

          for (const item of fileAssociations) {
            const extensions = (0, _builderUtil().asArray)(item.ext).map(_platformPackager().normalizeExt);

            for (const ext of extensions) {
              const customIcon = yield packager.getResource((0, _builderUtil().getPlatformIconFileName)(item.icon, false), `${extensions[0]}.ico`);
              let installedIconPath = "$appExe,0";

              if (customIcon != null) {
                installedIconPath = `$INSTDIR\\resources\\${path.basename(customIcon)}`;
                registerFileAssociationsScript.file(installedIconPath, customIcon);
              }

              const icon = `"${installedIconPath}"`;
              const commandText = `"Open with ${packager.appInfo.productName}"`;
              const command = '"$appExe $\\"%1$\\""';
              registerFileAssociationsScript.insertMacro("APP_ASSOCIATE", `"${ext}" "${item.name || ext}" "${item.description || ""}" ${icon} ${commandText} ${command}`);
            }
          }

          scriptGenerator.macro("registerFileAssociations", registerFileAssociationsScript);
        } else {
          const unregisterFileAssociationsScript = new (_nsisScriptGenerator().NsisScriptGenerator)();

          for (const item of fileAssociations) {
            for (const ext of (0, _builderUtil().asArray)(item.ext)) {
              unregisterFileAssociationsScript.insertMacro("APP_UNASSOCIATE", `"${(0, _platformPackager().normalizeExt)(ext)}" "${item.name || ext}"`);
            }
          }

          scriptGenerator.macro("unregisterFileAssociations", unregisterFileAssociationsScript);
        }
      }

      return scriptGenerator.build() + originalScript;
    })();
  }

}

exports.NsisTarget = NsisTarget;

function generateForPreCompressed(_x2, _x3, _x4, _x5) {
  return _generateForPreCompressed.apply(this, arguments);
}

function _generateForPreCompressed() {
  _generateForPreCompressed = (0, _bluebirdLst().coroutine)(function* (preCompressedFileExtensions, dir, arch, scriptGenerator) {
    const resourcesDir = path.join(dir, "resources");
    const dirInfo = yield (0, _fs().statOrNull)(resourcesDir);

    if (dirInfo == null || !dirInfo.isDirectory()) {
      return;
    }

    const nodeModules = `${path.sep}node_modules`;
    const preCompressedAssets = yield (0, _fs().walk)(resourcesDir, (file, stat) => {
      if (stat.isDirectory()) {
        return !file.endsWith(nodeModules);
      } else {
        return preCompressedFileExtensions.some(it => file.endsWith(it));
      }
    });

    if (preCompressedAssets.length !== 0) {
      const macro = new (_nsisScriptGenerator().NsisScriptGenerator)();

      for (const file of preCompressedAssets) {
        macro.file(`$INSTDIR\\${path.relative(dir, file).replace(/\//g, "\\")}`, file);
      }

      scriptGenerator.macro(`customFiles_${_builderUtil().Arch[arch]}`, macro);
    }
  });
  return _generateForPreCompressed.apply(this, arguments);
}

function createPackageFileInfo(_x6) {
  return _createPackageFileInfo.apply(this, arguments);
} function _createPackageFileInfo() {
  _createPackageFileInfo = (0, _bluebirdLst().coroutine)(function* (file) {
    return {
      path: file,
      size: (yield (0, _fsExtraP().stat)(file)).size,
      sha512: yield (0, _hash().hashFile)(file)
    };
  });
  return _createPackageFileInfo.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=NsisTarget.js.map{"version":3,"sources":["../../../src/targets/nsis/NsisTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import { path7za } from \"7zip-bin\"\nimport BluebirdPromise from \"bluebird-lst\"\nimport { executeAppBuilder, Arch, asArray, AsyncTaskManager, getPlatformIconFileName, InvalidConfigurationError, log, spawnAndWrite, use, exec } from \"builder-util\"\nimport { PackageFileInfo, UUID, CURRENT_APP_PACKAGE_FILE_NAME, CURRENT_APP_INSTALLER_FILE_NAME } from \"builder-util-runtime\"\nimport { getBinFromUrl } from \"../../binDownload\"\nimport { statOrNull, walk } from \"builder-util/out/fs\"\nimport { hashFile } from \"../../util/hash\"\nimport _debug from \"debug\"\nimport { readFile, stat, unlink } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { Target } from \"../../core\"\nimport { DesktopShortcutCreationPolicy, getEffectiveOptions } from \"../../options/CommonWindowsInstallerConfiguration\"\nimport { isSafeGithubName, normalizeExt } from \"../../platformPackager\"\nimport { time } from \"../../util/timer\"\nimport { execWine } from \"../../wine\"\nimport { WinPackager } from \"../../winPackager\"\nimport { archive, ArchiveOptions } from \"../archive\"\nimport { appendBlockmap, configureDifferentialAwareArchiveOptions, createBlockmap, createNsisWebDifferentialUpdateInfo } from \"../differentialUpdateInfoBuilder\"\nimport { getWindowsInstallationDirName } from \"../targetUtil\"\nimport { addCustomMessageFileInclude, createAddLangsMacro, LangConfigurator } from \"./nsisLang\"\nimport { computeLicensePage } from \"./nsisLicense\"\nimport { NsisOptions, PortableOptions } from \"./nsisOptions\"\nimport { NsisScriptGenerator } from \"./nsisScriptGenerator\"\nimport { AppPackageHelper, NSIS_PATH, nsisTemplatesDir } from \"./nsisUtil\"\n\nconst debug = _debug(\"electron-builder:nsis\")\n\n// noinspection SpellCheckingInspection\nconst ELECTRON_BUILDER_NS_UUID = UUID.parse(\"50e065bc-3134-11e6-9bab-38c9862bdaf3\")\n\n// noinspection SpellCheckingInspection\nconst nsisResourcePathPromise = new Lazy(() => getBinFromUrl(\"nsis-resources\", \"3.3.0\", \"4okc98BD0v9xDcSjhPVhAkBMqos+FvD/5/H72fTTIwoHTuWd2WdD7r+1j72hxd+ZXxq1y3FRW0x6Z3jR0VfpMw==\"))\n\nconst USE_NSIS_BUILT_IN_COMPRESSOR = false\n\nexport class NsisTarget extends Target {\n  readonly options: NsisOptions\n\n  /** @private */\n  readonly archs: Map<Arch, string> = new Map()\n\n  constructor(readonly packager: WinPackager, readonly outDir: string, targetName: string, protected readonly packageHelper: AppPackageHelper) {\n    super(targetName)\n\n    this.packageHelper.refCount++\n\n    this.options = targetName === \"portable\" ? Object.create(null) : {\n      ...this.packager.config.nsis,\n      preCompressedFileExtensions: [\".avi\", \".mov\", \".m4v\", \".mp4\", \".m4p\", \".qt\", \".mkv\", \".webm\", \".vmdk\"],\n    }\n\n    if (targetName !== \"nsis\") {\n      Object.assign(this.options, (this.packager.config as any)[targetName === \"nsis-web\" ? \"nsisWeb\" : targetName])\n    }\n\n    const deps = packager.info.metadata.dependencies\n    if (deps != null && deps[\"electron-squirrel-startup\"] != null) {\n      log.warn('\"electron-squirrel-startup\" dependency is not required for NSIS')\n    }\n  }\n\n  async build(appOutDir: string, arch: Arch) {\n    this.archs.set(arch, appOutDir)\n  }\n\n  get isBuildDifferentialAware() {\n    return !this.isPortable && this.options.differentialPackage !== false\n  }\n\n  private getPreCompressedFileExtensions(): Array<string> | null {\n    const result = this.isWebInstaller ? null : this.options.preCompressedFileExtensions\n    return result == null ? null : asArray(result).map(it => it.startsWith(\".\") ? it : `.${it}`)\n  }\n\n  /** @private */\n  async buildAppPackage(appOutDir: string, arch: Arch): Promise<PackageFileInfo> {\n    const options = this.options\n    const packager = this.packager\n\n    const isBuildDifferentialAware = this.isBuildDifferentialAware\n    const format = !isBuildDifferentialAware && options.useZip ? \"zip\" : \"7z\"\n    const archiveFile = path.join(this.outDir, `${packager.appInfo.sanitizedName}-${packager.appInfo.version}-${Arch[arch]}.nsis.${format}`)\n    const preCompressedFileExtensions = this.getPreCompressedFileExtensions()\n    const archiveOptions: ArchiveOptions = {\n      withoutDir: true,\n      compression: packager.compression,\n      excluded: preCompressedFileExtensions == null ? null : preCompressedFileExtensions.map(it => `*${it}`)\n    }\n\n    const timer = time(`nsis package, ${Arch[arch]}`)\n    await archive(format, archiveFile, appOutDir, isBuildDifferentialAware ? configureDifferentialAwareArchiveOptions(archiveOptions) : archiveOptions)\n    timer.end()\n\n    if (isBuildDifferentialAware && this.isWebInstaller) {\n      const data = await appendBlockmap(archiveFile)\n      return {\n        ...data,\n        path: archiveFile,\n      }\n    }\n    else {\n      return await createPackageFileInfo(archiveFile)\n    }\n  }\n\n  async finishBuild(): Promise<any> {\n    try {\n      await this.buildInstaller()\n    }\n    finally {\n      await this.packageHelper.finishBuild()\n    }\n  }\n\n  protected get installerFilenamePattern(): string {\n    // tslint:disable:no-invalid-template-strings\n    return \"${productName} \" + (this.isPortable ? \"\" : \"Setup \") + \"${version}.${ext}\"\n  }\n\n  private get isPortable() {\n    return this.name === \"portable\"\n  }\n\n  private async buildInstaller(): Promise<any> {\n    const packager = this.packager\n    const appInfo = packager.appInfo\n    const options = this.options\n    const installerFilename = packager.expandArtifactNamePattern(options, \"exe\", null, this.installerFilenamePattern)\n    const oneClick = options.oneClick !== false\n    const installerPath = path.join(this.outDir, installerFilename)\n\n    const logFields: any = {\n      target: this.name,\n      file: log.filePath(installerPath),\n      archs: Array.from(this.archs.keys()).map(it => Arch[it]).join(\", \"),\n    }\n    const isPerMachine = options.perMachine === true\n    if (!this.isPortable) {\n      logFields.oneClick = oneClick\n      logFields.perMachine = isPerMachine\n    }\n\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: this.name,\n      file: installerPath,\n      arch: null,\n    }, logFields)\n\n    const guid = options.guid || UUID.v5(appInfo.id, ELECTRON_BUILDER_NS_UUID)\n    const uninstallAppKey = guid.replace(/\\\\/g, \" - \")\n    const defines: any = {\n      APP_ID: appInfo.id,\n      APP_GUID: guid,\n      // Windows bug - entry in Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall cannot have \\ symbols (dir)\n      UNINSTALL_APP_KEY: uninstallAppKey,\n      PRODUCT_NAME: appInfo.productName,\n      PRODUCT_FILENAME: appInfo.productFilename,\n      APP_FILENAME: getWindowsInstallationDirName(appInfo, !oneClick || isPerMachine),\n      APP_DESCRIPTION: appInfo.description,\n      VERSION: appInfo.version,\n\n      PROJECT_DIR: packager.projectDir,\n      BUILD_RESOURCES_DIR: packager.info.buildResourcesDir,\n\n      APP_PACKAGE_NAME: appInfo.name\n    }\n    if (uninstallAppKey !== guid) {\n      defines.UNINSTALL_REGISTRY_KEY_2 = `Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\${guid}`\n    }\n\n    const commands: any = {\n      OutFile: `\"${installerPath}\"`,\n      VIProductVersion: appInfo.getVersionInWeirdWindowsForm(),\n      VIAddVersionKey: this.computeVersionKey(),\n      Unicode: this.isUnicodeEnabled,\n    }\n\n    const isPortable = this.isPortable\n    const iconPath = (isPortable ? null : await packager.getResource(options.installerIcon, \"installerIcon.ico\")) || await packager.getIconPath()\n    if (iconPath != null) {\n      if (isPortable) {\n        commands.Icon = `\"${iconPath}\"`\n      }\n      else {\n        defines.MUI_ICON = iconPath\n        defines.MUI_UNICON = iconPath\n      }\n    }\n\n    const packageFiles: { [arch: string]: PackageFileInfo } = {}\n    let estimatedSize = 0\n    if (this.isPortable && options.useZip) {\n      for (const [arch, dir] of this.archs.entries()) {\n        defines[arch === Arch.x64 ? \"APP_DIR_64\" : \"APP_DIR_32\"] = dir\n      }\n    }\n    else if (USE_NSIS_BUILT_IN_COMPRESSOR && this.archs.size === 1) {\n      defines.APP_BUILD_DIR = this.archs.get(this.archs.keys().next().value)\n    }\n    else {\n      await BluebirdPromise.map(this.archs.keys(), async arch => {\n        const fileInfo = await this.packageHelper.packArch(arch, this)\n        const file = fileInfo.path\n        const defineKey = arch === Arch.x64 ? \"APP_64\" : \"APP_32\"\n        defines[defineKey] = file\n        defines[`${defineKey}_NAME`] = path.basename(file)\n        // nsis expect a hexadecimal string\n        defines[`${defineKey}_HASH`] = Buffer.from(fileInfo.sha512, \"base64\").toString(\"hex\").toUpperCase()\n\n        if (this.isWebInstaller) {\n          await packager.dispatchArtifactCreated(file, this, arch)\n          packageFiles[Arch[arch]] = fileInfo\n        }\n\n        const archiveInfo = (await exec(path7za, [\"l\", file])).trim()\n        // after adding blockmap data will be \"Warnings: 1\" in the end of output\n        const match = archiveInfo.match(/(\\d+)\\s+\\d+\\s+\\d+\\s+files/)\n        if (match == null) {\n          log.warn({output: archiveInfo}, \"cannot compute size of app package\")\n        }\n        else {\n          estimatedSize += parseInt(match[1], 10)\n        }\n      })\n    }\n\n    this.configureDefinesForAllTypeOfInstaller(defines)\n    if (isPortable) {\n      const portableOptions = options as PortableOptions\n      defines.REQUEST_EXECUTION_LEVEL = portableOptions.requestExecutionLevel || \"user\"\n      defines.UNPACK_DIR_NAME = portableOptions.unpackDirName || (await executeAppBuilder([\"ksuid\"]))\n    }\n    else {\n      await this.configureDefines(oneClick, defines)\n    }\n\n    if (estimatedSize !== 0) {\n      // in kb\n      defines.ESTIMATED_SIZE = Math.round(estimatedSize / 1024)\n    }\n\n    if (packager.compression === \"store\") {\n      commands.SetCompress = \"off\"\n    }\n    else {\n      // difference - 33.540 vs 33.601, only 61 KB (but zip is faster to decompress)\n      // do not use /SOLID - \"With solid compression, files are uncompressed to temporary file before they are copied to their final destination\",\n      // it is not good for portable installer (where built-in NSIS compression is used). http://forums.winamp.com/showpost.php?p=2982902&postcount=6\n      commands.SetCompressor = \"zlib\"\n      if (!this.isWebInstaller) {\n        defines.COMPRESS = \"auto\"\n      }\n    }\n\n    debug(defines)\n    debug(commands)\n\n    if (packager.packagerOptions.effectiveOptionComputed != null && await packager.packagerOptions.effectiveOptionComputed([defines, commands])) {\n      return\n    }\n\n    const sharedHeader = await this.computeCommonInstallerScriptHeader()\n    const script = isPortable ? await readFile(path.join(nsisTemplatesDir, \"portable.nsi\"), \"utf8\") : await this.computeScriptAndSignUninstaller(defines, commands, installerPath, sharedHeader)\n    await this.executeMakensis(defines, commands, sharedHeader + await this.computeFinalScript(script, true))\n    await Promise.all<any>([packager.sign(installerPath), defines.UNINSTALLER_OUT_FILE == null ? Promise.resolve() : unlink(defines.UNINSTALLER_OUT_FILE)])\n\n    const safeArtifactName = isSafeGithubName(installerFilename) ? installerFilename : this.generateGitHubInstallerName()\n\n    let updateInfo: any\n    if (this.isWebInstaller) {\n      updateInfo = createNsisWebDifferentialUpdateInfo(installerPath, packageFiles)\n    }\n    else if (this.isBuildDifferentialAware) {\n      updateInfo = await createBlockmap(installerPath, this, packager, safeArtifactName)\n    }\n\n    if (updateInfo != null && isPerMachine && oneClick) {\n      updateInfo.isAdminRightsRequired = true\n    }\n\n    await packager.info.callArtifactBuildCompleted({\n      file: installerPath,\n      updateInfo,\n      target: this,\n      packager,\n      arch: this.archs.size === 1 ? this.archs.keys().next().value : null,\n      safeArtifactName,\n      isWriteUpdateInfo: !this.isPortable,\n    })\n  }\n\n  protected generateGitHubInstallerName() {\n    const appInfo = this.packager.appInfo\n    const classifier = appInfo.name.toLowerCase() === appInfo.name ? \"setup-\" : \"Setup-\"\n    return `${appInfo.name}-${this.isPortable ? \"\" : classifier}${appInfo.version}.exe`\n  }\n\n  private get isUnicodeEnabled() {\n    return this.options.unicode !== false\n  }\n\n  get isWebInstaller(): boolean {\n    return false\n  }\n\n  private async computeScriptAndSignUninstaller(defines: any, commands: any, installerPath: string, sharedHeader: string) {\n    const packager = this.packager\n    const customScriptPath = await packager.getResource(this.options.script, \"installer.nsi\")\n    const script = await readFile(customScriptPath || path.join(nsisTemplatesDir, \"installer.nsi\"), \"utf8\")\n\n    if (customScriptPath != null) {\n      log.info({reason: \"custom NSIS script is used\"}, \"uninstaller is not signed by electron-builder\")\n      return script\n    }\n\n    // https://github.com/electron-userland/electron-builder/issues/2103\n    // it is more safe and reliable to write uninstaller to our out dir\n    const uninstallerPath = path.join(this.outDir, `.__uninstaller-${this.name}-${this.packager.appInfo.sanitizedName}.exe`)\n    const isWin = process.platform === \"win32\"\n    defines.BUILD_UNINSTALLER = null\n    defines.UNINSTALLER_OUT_FILE = isWin ? uninstallerPath : path.win32.join(\"Z:\", uninstallerPath)\n    await this.executeMakensis(defines, commands, sharedHeader + await this.computeFinalScript(script, false))\n    await execWine(installerPath)\n    await packager.sign(uninstallerPath, \"  Signing NSIS uninstaller\")\n\n    delete defines.BUILD_UNINSTALLER\n    // platform-specific path, not wine\n    defines.UNINSTALLER_OUT_FILE = uninstallerPath\n    return script\n  }\n\n  private computeVersionKey() {\n    // Error: invalid VIProductVersion format, should be X.X.X.X\n    // so, we must strip beta\n    const localeId = this.options.language || \"1033\"\n    const appInfo = this.packager.appInfo\n    const versionKey = [\n      `/LANG=${localeId} ProductName \"${appInfo.productName}\"`,\n      `/LANG=${localeId} ProductVersion \"${appInfo.version}\"`,\n      `/LANG=${localeId} LegalCopyright \"${appInfo.copyright}\"`,\n      `/LANG=${localeId} FileDescription \"${appInfo.description}\"`,\n      `/LANG=${localeId} FileVersion \"${appInfo.buildVersion}\"`,\n    ]\n    use(this.packager.platformSpecificBuildOptions.legalTrademarks, it => versionKey.push(`/LANG=${localeId} LegalTrademarks \"${it}\"`))\n    use(appInfo.companyName, it => versionKey.push(`/LANG=${localeId} CompanyName \"${it}\"`))\n    return versionKey\n  }\n\n  protected configureDefines(oneClick: boolean, defines: any): Promise<any> {\n    const packager = this.packager\n    const options = this.options\n\n    const asyncTaskManager = new AsyncTaskManager(packager.info.cancellationToken)\n\n    if (oneClick) {\n      defines.ONE_CLICK = null\n\n      if (options.runAfterFinish !== false) {\n        defines.RUN_AFTER_FINISH = null\n      }\n\n      asyncTaskManager.add(async () => {\n        const installerHeaderIcon = await packager.getResource(options.installerHeaderIcon, \"installerHeaderIcon.ico\")\n        if (installerHeaderIcon != null) {\n          defines.HEADER_ICO = installerHeaderIcon\n        }\n      })\n    }\n    else {\n      if (options.runAfterFinish === false) {\n        defines.HIDE_RUN_AFTER_FINISH = null\n      }\n\n      asyncTaskManager.add(async () => {\n        const installerHeader = await packager.getResource(options.installerHeader, \"installerHeader.bmp\")\n        if (installerHeader != null) {\n          defines.MUI_HEADERIMAGE = null\n          defines.MUI_HEADERIMAGE_RIGHT = null\n          defines.MUI_HEADERIMAGE_BITMAP = installerHeader\n        }\n      })\n\n      asyncTaskManager.add(async () => {\n        const bitmap = (await packager.getResource(options.installerSidebar, \"installerSidebar.bmp\")) || \"${NSISDIR}\\\\Contrib\\\\Graphics\\\\Wizard\\\\nsis3-metro.bmp\"\n        defines.MUI_WELCOMEFINISHPAGE_BITMAP = bitmap\n        defines.MUI_UNWELCOMEFINISHPAGE_BITMAP = (await packager.getResource(options.uninstallerSidebar, \"uninstallerSidebar.bmp\")) || bitmap\n      })\n\n      if (options.allowElevation !== false) {\n        defines.MULTIUSER_INSTALLMODE_ALLOW_ELEVATION = null\n      }\n    }\n\n    if (options.perMachine === true) {\n      defines.INSTALL_MODE_PER_ALL_USERS = null\n    }\n\n    if (!oneClick || options.perMachine === true) {\n      defines.INSTALL_MODE_PER_ALL_USERS_REQUIRED = null\n    }\n\n    if (options.allowToChangeInstallationDirectory) {\n      if (oneClick) {\n        throw new InvalidConfigurationError(\"allowToChangeInstallationDirectory makes sense only for assisted installer (please set oneClick to false)\")\n      }\n      defines.allowToChangeInstallationDirectory = null\n    }\n\n    const commonOptions = getEffectiveOptions(options, packager)\n\n    if (commonOptions.menuCategory != null) {\n      defines.MENU_FILENAME = commonOptions.menuCategory\n    }\n\n    defines.SHORTCUT_NAME = commonOptions.shortcutName\n\n    if (options.deleteAppDataOnUninstall) {\n      defines.DELETE_APP_DATA_ON_UNINSTALL = null\n    }\n\n    asyncTaskManager.add(async () => {\n      const uninstallerIcon = await packager.getResource(options.uninstallerIcon, \"uninstallerIcon.ico\")\n      if (uninstallerIcon != null) {\n        // we don't need to copy MUI_UNICON (defaults to app icon), so, we have 2 defines\n        defines.UNINSTALLER_ICON = uninstallerIcon\n        defines.MUI_UNICON = uninstallerIcon\n      }\n    })\n\n    defines.UNINSTALL_DISPLAY_NAME = packager.expandMacro(options.uninstallDisplayName || \"${productName} ${version}\", null, {}, false)\n    if (commonOptions.isCreateDesktopShortcut === DesktopShortcutCreationPolicy.NEVER) {\n      defines.DO_NOT_CREATE_DESKTOP_SHORTCUT = null\n    }\n    if (commonOptions.isCreateDesktopShortcut === DesktopShortcutCreationPolicy.ALWAYS) {\n      defines.RECREATE_DESKTOP_SHORTCUT = null\n    }\n    if (!commonOptions.isCreateStartMenuShortcut) {\n      defines.DO_NOT_CREATE_START_MENU_SHORTCUT = null\n    }\n\n    if (options.displayLanguageSelector === true) {\n      defines.DISPLAY_LANG_SELECTOR = null\n    }\n\n    return asyncTaskManager.awaitTasks()\n  }\n\n  private configureDefinesForAllTypeOfInstaller(defines: any) {\n    const appInfo = this.packager.appInfo\n    const companyName = appInfo.companyName\n    if (companyName != null) {\n      defines.COMPANY_NAME = companyName\n    }\n\n    // electron uses product file name as app data, define it as well to remove on uninstall\n    if (defines.APP_FILENAME !== appInfo.productFilename) {\n      defines.APP_PRODUCT_FILENAME = appInfo.productFilename\n    }\n\n    if (this.isWebInstaller) {\n      defines.APP_PACKAGE_STORE_FILE = `${appInfo.updaterCacheDirName}\\\\${CURRENT_APP_PACKAGE_FILE_NAME}`\n    }\n    else {\n      defines.APP_INSTALLER_STORE_FILE = `${appInfo.updaterCacheDirName}\\\\${CURRENT_APP_INSTALLER_FILE_NAME}`\n    }\n\n    if (!this.isWebInstaller && defines.APP_BUILD_DIR == null) {\n      const options = this.options\n      if (options.useZip) {\n        defines.ZIP_COMPRESSION = null\n      }\n\n      defines.COMPRESSION_METHOD = options.useZip ? \"zip\" : \"7z\"\n    }\n  }\n\n  private async executeMakensis(defines: any, commands: any, script: string) {\n    const args: Array<string> = (this.options.warningsAsErrors === false) ? [] : [\"-WX\"]\n    for (const name of Object.keys(defines)) {\n      const value = defines[name]\n      if (value == null) {\n        args.push(`-D${name}`)\n      }\n      else {\n        args.push(`-D${name}=${value}`)\n      }\n    }\n\n    for (const name of Object.keys(commands)) {\n      const value = commands[name]\n      if (Array.isArray(value)) {\n        for (const c of value) {\n          args.push(`-X${name} ${c}`)\n        }\n      }\n      else {\n        args.push(`-X${name} ${value}`)\n      }\n    }\n\n    args.push(\"-\")\n\n    if (this.packager.debugLogger.isEnabled) {\n      this.packager.debugLogger.add(\"nsis.script\", script)\n    }\n\n    const nsisPath = await NSIS_PATH.value\n    const command = path.join(nsisPath, process.platform === \"darwin\" ? \"mac\" : (process.platform === \"win32\" ? \"Bin\" : \"linux\"), process.platform === \"win32\" ? \"makensis.exe\" : \"makensis\")\n    await spawnAndWrite(command, args, script, {\n      // we use NSIS_CONFIG_CONST_DATA_PATH=no to build makensis on Linux, but in any case it doesn't use stubs as MacOS/Windows version, so, we explicitly set NSISDIR\n      env: {...process.env, NSISDIR: nsisPath},\n      cwd: nsisTemplatesDir,\n    })\n  }\n\n  private async computeCommonInstallerScriptHeader() {\n    const packager = this.packager\n    const options = this.options\n    const scriptGenerator = new NsisScriptGenerator()\n    const langConfigurator = new LangConfigurator(options)\n\n    scriptGenerator.include(path.join(nsisTemplatesDir, \"include\", \"StdUtils.nsh\"))\n\n    const includeDir = path.join(nsisTemplatesDir, \"include\")\n    scriptGenerator.addIncludeDir(includeDir)\n    scriptGenerator.flags([\"updated\", \"force-run\", \"keep-shortcuts\", \"no-desktop-shortcut\", \"delete-app-data\", \"allusers\", \"currentuser\"])\n\n    createAddLangsMacro(scriptGenerator, langConfigurator)\n\n    const taskManager = new AsyncTaskManager(packager.info.cancellationToken)\n\n    const pluginArch = this.isUnicodeEnabled ? \"x86-unicode\" : \"x86-ansi\"\n    taskManager.add(async () => {\n      scriptGenerator.addPluginDir(pluginArch, path.join(await nsisResourcePathPromise.value, \"plugins\", pluginArch))\n    })\n\n    taskManager.add(async () => {\n      const userPluginDir = path.join(packager.info.buildResourcesDir, pluginArch)\n      const stat = await statOrNull(userPluginDir)\n      if (stat != null && stat.isDirectory()) {\n        scriptGenerator.addPluginDir(pluginArch, userPluginDir)\n      }\n    })\n\n    taskManager.addTask(addCustomMessageFileInclude(\"messages.yml\", packager, scriptGenerator, langConfigurator))\n\n    if (!this.isPortable) {\n      if (options.oneClick === false) {\n        taskManager.addTask(addCustomMessageFileInclude(\"assistedMessages.yml\", packager, scriptGenerator, langConfigurator))\n      }\n\n      taskManager.add(async () => {\n        const customInclude = await packager.getResource(this.options.include, \"installer.nsh\")\n        if (customInclude != null) {\n          scriptGenerator.addIncludeDir(packager.info.buildResourcesDir)\n          scriptGenerator.include(customInclude)\n        }\n      })\n    }\n\n    await taskManager.awaitTasks()\n    return scriptGenerator.build()\n  }\n\n  private async computeFinalScript(originalScript: string, isInstaller: boolean) {\n    const packager = this.packager\n    const options = this.options\n    const langConfigurator = new LangConfigurator(options)\n\n    const scriptGenerator = new NsisScriptGenerator()\n    const taskManager = new AsyncTaskManager(packager.info.cancellationToken)\n\n    if (isInstaller) {\n      // http://stackoverflow.com/questions/997456/nsis-license-file-based-on-language-selection\n      taskManager.add(() => computeLicensePage(packager, options, scriptGenerator, langConfigurator.langs))\n    }\n\n    await taskManager.awaitTasks()\n\n    if (this.isPortable) {\n      return scriptGenerator.build() + originalScript\n    }\n\n    const preCompressedFileExtensions = this.getPreCompressedFileExtensions()\n    if (preCompressedFileExtensions != null && preCompressedFileExtensions.length !== 0) {\n      for (const [arch, dir] of this.archs.entries()) {\n        await generateForPreCompressed(preCompressedFileExtensions, dir, arch, scriptGenerator)\n      }\n    }\n\n    const fileAssociations = packager.fileAssociations\n    if (fileAssociations.length !== 0) {\n\n      scriptGenerator.include(path.join(path.join(nsisTemplatesDir, \"include\"), \"FileAssociation.nsh\"))\n      if (isInstaller) {\n        const registerFileAssociationsScript = new NsisScriptGenerator()\n        for (const item of fileAssociations) {\n          const extensions = asArray(item.ext).map(normalizeExt)\n          for (const ext of extensions) {\n            const customIcon = await packager.getResource(getPlatformIconFileName(item.icon, false), `${extensions[0]}.ico`)\n            let installedIconPath = \"$appExe,0\"\n            if (customIcon != null) {\n              installedIconPath = `$INSTDIR\\\\resources\\\\${path.basename(customIcon)}`\n              registerFileAssociationsScript.file(installedIconPath, customIcon)\n            }\n\n            const icon = `\"${installedIconPath}\"`\n            const commandText = `\"Open with ${packager.appInfo.productName}\"`\n            const command = '\"$appExe $\\\\\"%1$\\\\\"\"'\n            registerFileAssociationsScript.insertMacro(\"APP_ASSOCIATE\", `\"${ext}\" \"${item.name || ext}\" \"${item.description || \"\"}\" ${icon} ${commandText} ${command}`)\n          }\n        }\n        scriptGenerator.macro(\"registerFileAssociations\", registerFileAssociationsScript)\n      }\n      else {\n        const unregisterFileAssociationsScript = new NsisScriptGenerator()\n        for (const item of fileAssociations) {\n          for (const ext of asArray(item.ext)) {\n            unregisterFileAssociationsScript.insertMacro(\"APP_UNASSOCIATE\", `\"${normalizeExt(ext)}\" \"${item.name || ext}\"`)\n          }\n        }\n        scriptGenerator.macro(\"unregisterFileAssociations\", unregisterFileAssociationsScript)\n      }\n    }\n\n    return scriptGenerator.build() + originalScript\n  }\n}\n\nasync function generateForPreCompressed(preCompressedFileExtensions: Array<string>, dir: string, arch: Arch, scriptGenerator: NsisScriptGenerator) {\n  const resourcesDir = path.join(dir, \"resources\")\n  const dirInfo = await statOrNull(resourcesDir)\n  if (dirInfo == null || !dirInfo.isDirectory()) {\n    return\n  }\n\n  const nodeModules = `${path.sep}node_modules`\n  const preCompressedAssets = await walk(resourcesDir, (file, stat) => {\n    if (stat.isDirectory()) {\n      return !file.endsWith(nodeModules)\n    }\n    else {\n      return preCompressedFileExtensions.some(it => file.endsWith(it))\n    }\n  })\n\n  if (preCompressedAssets.length !== 0) {\n    const macro = new NsisScriptGenerator()\n    for (const file of preCompressedAssets) {\n      macro.file(`$INSTDIR\\\\${path.relative(dir, file).replace(/\\//g, \"\\\\\")}`, file)\n    }\n    scriptGenerator.macro(`customFiles_${Arch[arch]}`, macro)\n  }\n}\n\nasync function createPackageFileInfo(file: string): Promise<PackageFileInfo> {\n  return {\n    path: file,\n    size: (await stat(file)).size,\n    sha512: await hashFile(file),\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.WebInstallerTarget = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _PublishManager() {
  const data = require("../../publish/PublishManager");

  _PublishManager = function () {
    return data;
  };

  return data;
}

function _NsisTarget() {
  const data = require("./NsisTarget");

  _NsisTarget = function () {
    return data;
  };

  return data;
}

/** @private */
class WebInstallerTarget extends _NsisTarget().NsisTarget {
  constructor(packager, outDir, targetName, packageHelper) {
    super(packager, outDir, targetName, packageHelper);
  }

  get isWebInstaller() {
    return true;
  }

  configureDefines(oneClick, defines) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      //noinspection ES6MissingAwait
      yield _NsisTarget().NsisTarget.prototype.configureDefines.call(_this, oneClick, defines);
      const packager = _this.packager;
      const options = _this.options;
      let appPackageUrl = options.appPackageUrl;

      if (appPackageUrl == null) {
        const publishConfigs = yield (0, _PublishManager().getPublishConfigsForUpdateInfo)(packager, (yield (0, _PublishManager().getPublishConfigs)(packager, packager.info.config, null, false)), null);

        if (publishConfigs == null || publishConfigs.length === 0) {
          throw new Error("Cannot compute app package download URL");
        }

        appPackageUrl = (0, _PublishManager().computeDownloadUrl)(publishConfigs[0], null, packager);
        defines.APP_PACKAGE_URL_IS_INCOMLETE = null;
      }

      defines.APP_PACKAGE_URL = appPackageUrl;
    })();
  }

  get installerFilenamePattern() {
    // tslint:disable:no-invalid-template-strings
    return "${productName} Web Setup ${version}.${ext}";
  }

  generateGitHubInstallerName() {
    const appInfo = this.packager.appInfo;
    const classifier = appInfo.name.toLowerCase() === appInfo.name ? "web-setup" : "WebSetup";
    return `${appInfo.name}-${classifier}-${appInfo.version}.exe`;
  }

} exports.WebInstallerTarget = WebInstallerTarget;
// __ts-babel@6.0.4
//# sourceMappingURL=WebInstallerTarget.js.map{"version":3,"sources":["../../../src/targets/nsis/WebInstallerTarget.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AACM,MAAO,kBAAP,SAAkC,wBAAlC,CAA4C;AAChD,EAAA,WAAA,CAAY,QAAZ,EAAmC,MAAnC,EAAmD,UAAnD,EAAuE,aAAvE,EAAsG;AACpG,UAAM,QAAN,EAAgB,MAAhB,EAAwB,UAAxB,EAAoC,aAApC;AACD;;AAED,MAAI,cAAJ,GAAkB;AAChB,WAAO,IAAP;AACD;;AAEe,EAAA,gBAAN,CAAuB,QAAvB,EAA0C,OAA1C,EAAsD;AAAA;;AAAA;AAC9D;AACA,YAAO,yBAAW,SAAX,CAA4C,gBAA5C,CAA6D,IAA7D,CAAkE,KAAlE,EAAwE,QAAxE,EAAkF,OAAlF,CAAP;AAEA,YAAM,QAAQ,GAAG,KAAI,CAAC,QAAtB;AACA,YAAM,OAAO,GAAG,KAAI,CAAC,OAArB;AAEA,UAAI,aAAa,GAAG,OAAO,CAAC,aAA5B;;AACA,UAAI,aAAa,IAAI,IAArB,EAA2B;AACzB,cAAM,cAAc,SAAS,sDAA+B,QAA/B,SAA+C,yCAAkB,QAAlB,EAA4B,QAAQ,CAAC,IAAT,CAAc,MAA1C,EAAkD,IAAlD,EAAwD,KAAxD,CAA/C,GAA+G,IAA/G,CAA7B;;AACA,YAAI,cAAc,IAAI,IAAlB,IAA0B,cAAc,CAAC,MAAf,KAA0B,CAAxD,EAA2D;AACzD,gBAAM,IAAI,KAAJ,CAAU,yCAAV,CAAN;AACD;;AAED,QAAA,aAAa,GAAG,0CAAmB,cAAc,CAAC,CAAD,CAAjC,EAAsC,IAAtC,EAA4C,QAA5C,CAAhB;AAEA,QAAA,OAAO,CAAC,4BAAR,GAAuC,IAAvC;AACD;;AAED,MAAA,OAAO,CAAC,eAAR,GAA0B,aAA1B;AAnB8D;AAoB/D;;AAED,MAAc,wBAAd,GAAsC;AACpC;AACA,WAAO,4CAAP;AACD;;AAES,EAAA,2BAA2B,GAAA;AACnC,UAAM,OAAO,GAAG,KAAK,QAAL,CAAc,OAA9B;AACA,UAAM,UAAU,GAAG,OAAO,CAAC,IAAR,CAAa,WAAb,OAA+B,OAAO,CAAC,IAAvC,GAA8C,WAA9C,GAA4D,UAA/E;AACA,WAAO,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,IAAI,OAAO,CAAC,OAAO,MAAvD;AACD;;AAxC+C,C","sourcesContent":["import { computeDownloadUrl, getPublishConfigs, getPublishConfigsForUpdateInfo } from \"../../publish/PublishManager\"\nimport { WinPackager } from \"../../winPackager\"\nimport { NsisWebOptions } from \"./nsisOptions\"\nimport { NsisTarget } from \"./NsisTarget\"\nimport { AppPackageHelper } from \"./nsisUtil\"\n\n/** @private */\nexport class WebInstallerTarget extends NsisTarget {\n  constructor(packager: WinPackager, outDir: string, targetName: string, packageHelper: AppPackageHelper) {\n    super(packager, outDir, targetName, packageHelper)\n  }\n\n  get isWebInstaller(): boolean {\n    return true\n  }\n\n  protected async configureDefines(oneClick: boolean, defines: any): Promise<any> {\n    //noinspection ES6MissingAwait\n    await (NsisTarget.prototype as WebInstallerTarget).configureDefines.call(this, oneClick, defines)\n\n    const packager = this.packager\n    const options = this.options as NsisWebOptions\n\n    let appPackageUrl = options.appPackageUrl\n    if (appPackageUrl == null) {\n      const publishConfigs = await getPublishConfigsForUpdateInfo(packager, await getPublishConfigs(packager, packager.info.config, null, false), null)\n      if (publishConfigs == null || publishConfigs.length === 0) {\n        throw new Error(\"Cannot compute app package download URL\")\n      }\n\n      appPackageUrl = computeDownloadUrl(publishConfigs[0], null, packager)\n\n      defines.APP_PACKAGE_URL_IS_INCOMLETE = null\n    }\n\n    defines.APP_PACKAGE_URL = appPackageUrl\n  }\n\n  protected get installerFilenamePattern(): string {\n    // tslint:disable:no-invalid-template-strings\n    return \"${productName} Web Setup ${version}.${ext}\"\n  }\n\n  protected generateGitHubInstallerName(): string {\n    const appInfo = this.packager.appInfo\n    const classifier = appInfo.name.toLowerCase() === appInfo.name ? \"web-setup\" : \"WebSetup\"\n    return `${appInfo.name}-${classifier}-${appInfo.version}.exe`\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createAddLangsMacro = createAddLangsMacro;
exports.addCustomMessageFileInclude = addCustomMessageFileInclude;
exports.LangConfigurator = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _langs() {
  const data = require("../../util/langs");

  _langs = function () {
    return data;
  };

  return data;
}

var _debug2 = _interopRequireDefault(require("debug"));

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _jsYaml() {
  const data = require("js-yaml");

  _jsYaml = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _nsisUtil() {
  const data = require("./nsisUtil");

  _nsisUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const debug = (0, _debug2.default)("electron-builder:nsis");

class LangConfigurator {
  constructor(options) {
    const rawList = options.installerLanguages;

    if (options.unicode === false || rawList === null || Array.isArray(rawList) && rawList.length === 0) {
      this.isMultiLang = false;
    } else {
      this.isMultiLang = options.multiLanguageInstaller !== false;
    }

    if (this.isMultiLang) {
      this.langs = rawList == null ? _langs().bundledLanguages.slice() : (0, _builderUtil().asArray)(rawList).map(it => (0, _langs().toLangWithRegion)(it.replace("-", "_")));
    } else {
      this.langs = ["en_US"];
    }
  }

}

exports.LangConfigurator = LangConfigurator;

function createAddLangsMacro(scriptGenerator, langConfigurator) {
  const result = [];

  for (const langWithRegion of langConfigurator.langs) {
    let name;

    if (langWithRegion === "zh_CN") {
      name = "SimpChinese";
    } else if (langWithRegion === "zh_TW") {
      name = "TradChinese";
    } else if (langWithRegion === "nb_NO") {
      name = "Norwegian";
    } else if (langWithRegion === "pt_BR") {
      name = "PortugueseBR";
    } else {
      const lang = langWithRegion.substring(0, langWithRegion.indexOf("_"));
      name = _langs().langIdToName[lang];

      if (name == null) {
        throw new Error(`Language name is unknown for ${lang}`);
      }

      if (name === "Spanish") {
        name = "SpanishInternational";
      }
    }

    result.push(`!insertmacro MUI_LANGUAGE "${name}"`);
  }

  scriptGenerator.macro("addLangs", result);
}

function writeCustomLangFile(_x, _x2) {
  return _writeCustomLangFile.apply(this, arguments);
}

function _writeCustomLangFile() {
  _writeCustomLangFile = (0, _bluebirdLst().coroutine)(function* (data, packager) {
    const file = yield packager.getTempFile("messages.nsh");
    yield (0, _fsExtraP().outputFile)(file, data);
    return file;
  });
  return _writeCustomLangFile.apply(this, arguments);
}

function addCustomMessageFileInclude(_x3, _x4, _x5, _x6) {
  return _addCustomMessageFileInclude.apply(this, arguments);
}

function _addCustomMessageFileInclude() {
  _addCustomMessageFileInclude = (0, _bluebirdLst().coroutine)(function* (input, packager, scriptGenerator, langConfigurator) {
    const data = (0, _jsYaml().safeLoad)((yield (0, _fsExtraP().readFile)(path.join(_nsisUtil().nsisTemplatesDir, input), "utf-8")));
    const instructions = computeCustomMessageTranslations(data, langConfigurator).join("\n");
    debug(instructions);
    scriptGenerator.include((yield writeCustomLangFile(instructions, packager)));
  });
  return _addCustomMessageFileInclude.apply(this, arguments);
}

function computeCustomMessageTranslations(messages, langConfigurator) {
  const result = [];
  const includedLangs = new Set(langConfigurator.langs);

  for (const messageId of Object.keys(messages)) {
    const langToTranslations = messages[messageId];
    const unspecifiedLangs = new Set(langConfigurator.langs);

    for (const lang of Object.keys(langToTranslations)) {
      const langWithRegion = (0, _langs().toLangWithRegion)(lang);

      if (!includedLangs.has(langWithRegion)) {
        continue;
      }

      const value = langToTranslations[lang];

      if (value == null) {
        throw new Error(`${messageId} not specified for ${lang}`);
      }

      result.push(`LangString ${messageId} ${_langs().lcid[langWithRegion]} "${value.replace(/\n/g, "$\\r$\\n")}"`);
      unspecifiedLangs.delete(langWithRegion);
    }

    if (langConfigurator.isMultiLang) {
      const defaultTranslation = langToTranslations.en.replace(/\n/g, "$\\r$\\n");

      for (const langWithRegion of unspecifiedLangs) {
        result.push(`LangString ${messageId} ${_langs().lcid[langWithRegion]} "${defaultTranslation}"`);
      }
    }
  }

  return result;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=nsisLang.js.map{"version":3,"sources":["../../../src/targets/nsis/nsisLang.ts"],"names":[],"mappings":"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","sourcesContent":["import { asArray } from \"builder-util\"\nimport { bundledLanguages, langIdToName, lcid, toLangWithRegion } from \"../../util/langs\"\nimport _debug from \"debug\"\nimport { outputFile, readFile } from \"fs-extra-p\"\nimport { safeLoad } from \"js-yaml\"\nimport * as path from \"path\"\nimport { PlatformPackager } from \"../../platformPackager\"\nimport { NsisOptions } from \"./nsisOptions\"\nimport { NsisScriptGenerator } from \"./nsisScriptGenerator\"\nimport { nsisTemplatesDir } from \"./nsisUtil\"\n\nconst debug = _debug(\"electron-builder:nsis\")\n\nexport class LangConfigurator {\n  readonly isMultiLang: boolean\n  readonly langs: Array<string>\n\n  constructor(options: NsisOptions) {\n    const rawList = options.installerLanguages\n\n    if (options.unicode === false || rawList === null || (Array.isArray(rawList) && rawList.length === 0)) {\n      this.isMultiLang = false\n    }\n    else {\n      this.isMultiLang = options.multiLanguageInstaller !== false\n    }\n\n    if (this.isMultiLang) {\n      this.langs = rawList == null ? bundledLanguages.slice() : asArray(rawList)\n        .map(it => toLangWithRegion(it.replace(\"-\", \"_\")))\n    }\n    else {\n      this.langs = [\"en_US\"]\n    }\n  }\n}\n\nexport function createAddLangsMacro(scriptGenerator: NsisScriptGenerator, langConfigurator: LangConfigurator) {\n  const result: Array<string> = []\n  for (const langWithRegion of langConfigurator.langs) {\n    let name: string\n    if (langWithRegion === \"zh_CN\") {\n      name = \"SimpChinese\"\n    }\n    else if (langWithRegion === \"zh_TW\") {\n      name = \"TradChinese\"\n    }\n    else if (langWithRegion === \"nb_NO\") {\n      name = \"Norwegian\"\n    }\n    else if (langWithRegion === \"pt_BR\") {\n      name = \"PortugueseBR\"\n    }\n    else {\n      const lang = langWithRegion.substring(0, langWithRegion.indexOf(\"_\"))\n      name = (langIdToName as any)[lang]\n      if (name == null) {\n        throw new Error(`Language name is unknown for ${lang}`)\n      }\n\n      if (name === \"Spanish\") {\n        name = \"SpanishInternational\"\n      }\n    }\n    result.push(`!insertmacro MUI_LANGUAGE \"${name}\"`)\n  }\n\n  scriptGenerator.macro(\"addLangs\", result)\n}\n\nasync function writeCustomLangFile(data: string, packager: PlatformPackager<any>) {\n  const file = await packager.getTempFile(\"messages.nsh\")\n  await outputFile(file, data)\n  return file\n}\n\nexport async function addCustomMessageFileInclude(input: string, packager: PlatformPackager<any>, scriptGenerator: NsisScriptGenerator, langConfigurator: LangConfigurator) {\n  const data = safeLoad(await readFile(path.join(nsisTemplatesDir, input), \"utf-8\"))\n  const instructions = computeCustomMessageTranslations(data, langConfigurator).join(\"\\n\")\n  debug(instructions)\n  scriptGenerator.include(await writeCustomLangFile(instructions, packager))\n}\n\nfunction computeCustomMessageTranslations(messages: any, langConfigurator: LangConfigurator): Array<string> {\n  const result: Array<string> = []\n  const includedLangs = new Set(langConfigurator.langs)\n  for (const messageId of Object.keys(messages)) {\n    const langToTranslations = messages[messageId]\n    const unspecifiedLangs = new Set(langConfigurator.langs)\n    for (const lang of Object.keys(langToTranslations)) {\n      const langWithRegion = toLangWithRegion(lang)\n\n      if (!includedLangs.has(langWithRegion)) {\n        continue\n      }\n\n      const value = langToTranslations[lang]\n      if (value == null) {\n        throw new Error(`${messageId} not specified for ${lang}`)\n      }\n\n      result.push(`LangString ${messageId} ${lcid[langWithRegion]} \"${value.replace(/\\n/g, \"$\\\\r$\\\\n\")}\"`)\n      unspecifiedLangs.delete(langWithRegion)\n    }\n\n    if (langConfigurator.isMultiLang) {\n      const defaultTranslation = langToTranslations.en.replace(/\\n/g, \"$\\\\r$\\\\n\")\n      for (const langWithRegion of unspecifiedLangs) {\n        result.push(`LangString ${messageId} ${lcid[langWithRegion]} \"${defaultTranslation}\"`)\n      }\n    }\n  }\n  return result\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.computeLicensePage = computeLicensePage;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _langs() {
  const data = require("../../util/langs");

  _langs = function () {
    return data;
  };

  return data;
}

function _license() {
  const data = require("../../util/license");

  _license = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _nsisUtil() {
  const data = require("./nsisUtil");

  _nsisUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function computeLicensePage(_x, _x2, _x3, _x4) {
  return _computeLicensePage.apply(this, arguments);
} function _computeLicensePage() {
  _computeLicensePage = (0, _bluebirdLst().coroutine)(function* (packager, options, scriptGenerator, languages) {
    const license = yield (0, _license().getNotLocalizedLicenseFile)(options.license, packager);

    if (license != null) {
      let licensePage;

      if (license.endsWith(".html")) {
        licensePage = ["!define MUI_PAGE_CUSTOMFUNCTION_SHOW LicenseShow", "Function LicenseShow", "  FindWindow $R0 `#32770` `` $HWNDPARENT", "  GetDlgItem $R0 $R0 1000", "EmbedHTML::Load /replace $R0 file://$PLUGINSDIR\\license.html", "FunctionEnd", `!insertmacro MUI_PAGE_LICENSE "${path.join(_nsisUtil().nsisTemplatesDir, "empty-license.txt")}"`];
      } else {
        licensePage = [`!insertmacro MUI_PAGE_LICENSE "${license}"`];
      }

      scriptGenerator.macro("licensePage", licensePage);

      if (license.endsWith(".html")) {
        scriptGenerator.macro("addLicenseFiles", [`File /oname=$PLUGINSDIR\\license.html "${license}"`]);
      }

      return;
    }

    const licenseFiles = yield (0, _license().getLicenseFiles)(packager);

    if (licenseFiles.length === 0) {
      return;
    }

    const licensePage = [];
    const unspecifiedLangs = new Set(languages);
    let defaultFile = null;

    for (const item of licenseFiles) {
      unspecifiedLangs.delete(item.langWithRegion);

      if (defaultFile == null) {
        defaultFile = item.file;
      }

      licensePage.push(`LicenseLangString MUILicense ${_langs().lcid[item.langWithRegion] || item.lang} "${item.file}"`);
    }

    for (const l of unspecifiedLangs) {
      licensePage.push(`LicenseLangString MUILicense ${_langs().lcid[l]} "${defaultFile}"`);
    }

    licensePage.push('!insertmacro MUI_PAGE_LICENSE "$(MUILicense)"');
    scriptGenerator.macro("licensePage", licensePage);
  });
  return _computeLicensePage.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=nsisLicense.js.map{"version":3,"sources":["../../../src/targets/nsis/nsisLicense.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AAIA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;SAEsB,kB;;;;;;sDAAf,WAAkC,QAAlC,EAAyD,OAAzD,EAA+E,eAA/E,EAAqH,SAArH,EAA6I;AAClJ,UAAM,OAAO,SAAS,2CAA2B,OAAO,CAAC,OAAnC,EAA4C,QAA5C,CAAtB;;AACA,QAAI,OAAO,IAAI,IAAf,EAAqB;AACnB,UAAI,WAAJ;;AACA,UAAI,OAAO,CAAC,QAAR,CAAiB,OAAjB,CAAJ,EAA+B;AAC7B,QAAA,WAAW,GAAG,CACZ,kDADY,EAEZ,sBAFY,EAGZ,0CAHY,EAIZ,2BAJY,EAKZ,+DALY,EAMZ,aANY,EAQZ,kCAAkC,IAAI,CAAC,IAAL,CAAU,4BAAV,EAA4B,mBAA5B,CAAgD,GARtE,CAAd;AAUD,OAXD,MAYK;AACH,QAAA,WAAW,GAAG,CAAC,kCAAkC,OAAO,GAA1C,CAAd;AACD;;AAED,MAAA,eAAe,CAAC,KAAhB,CAAsB,aAAtB,EAAqC,WAArC;;AACA,UAAI,OAAO,CAAC,QAAR,CAAiB,OAAjB,CAAJ,EAA+B;AAC7B,QAAA,eAAe,CAAC,KAAhB,CAAsB,iBAAtB,EAAyC,CAAC,0CAA0C,OAAO,GAAlD,CAAzC;AACD;;AACD;AACD;;AAED,UAAM,YAAY,SAAS,gCAAgB,QAAhB,CAA3B;;AACA,QAAI,YAAY,CAAC,MAAb,KAAwB,CAA5B,EAA+B;AAC7B;AACD;;AAED,UAAM,WAAW,GAAkB,EAAnC;AACA,UAAM,gBAAgB,GAAG,IAAI,GAAJ,CAAQ,SAAR,CAAzB;AAEA,QAAI,WAAW,GAAkB,IAAjC;;AACA,SAAK,MAAM,IAAX,IAAmB,YAAnB,EAAiC;AAC/B,MAAA,gBAAgB,CAAC,MAAjB,CAAwB,IAAI,CAAC,cAA7B;;AACA,UAAI,WAAW,IAAI,IAAnB,EAAyB;AACvB,QAAA,WAAW,GAAG,IAAI,CAAC,IAAnB;AACD;;AACD,MAAA,WAAW,CAAC,IAAZ,CAAiB,gCAAgC,cAAK,IAAI,CAAC,cAAV,KAA6B,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,GAArG;AACD;;AAED,SAAK,MAAM,CAAX,IAAgB,gBAAhB,EAAkC;AAChC,MAAA,WAAW,CAAC,IAAZ,CAAiB,gCAAgC,cAAK,CAAL,CAAO,KAAK,WAAW,GAAxE;AACD;;AAED,IAAA,WAAW,CAAC,IAAZ,CAAiB,+CAAjB;AACA,IAAA,eAAe,CAAC,KAAhB,CAAsB,aAAtB,EAAqC,WAArC;AACD,G","sourcesContent":["import { lcid } from \"../../util/langs\"\nimport { getLicenseFiles, getNotLocalizedLicenseFile } from \"../../util/license\"\nimport * as path from \"path\"\nimport { WinPackager } from \"../../winPackager\"\nimport { NsisOptions } from \"./nsisOptions\"\nimport { NsisScriptGenerator } from \"./nsisScriptGenerator\"\nimport { nsisTemplatesDir } from \"./nsisUtil\"\n\nexport async function computeLicensePage(packager: WinPackager, options: NsisOptions, scriptGenerator: NsisScriptGenerator, languages: Array<string>): Promise<void> {\n  const license = await getNotLocalizedLicenseFile(options.license, packager)\n  if (license != null) {\n    let licensePage: Array<string>\n    if (license.endsWith(\".html\")) {\n      licensePage = [\n        \"!define MUI_PAGE_CUSTOMFUNCTION_SHOW LicenseShow\",\n        \"Function LicenseShow\",\n        \"  FindWindow $R0 `#32770` `` $HWNDPARENT\",\n        \"  GetDlgItem $R0 $R0 1000\",\n        \"EmbedHTML::Load /replace $R0 file://$PLUGINSDIR\\\\license.html\",\n        \"FunctionEnd\",\n\n        `!insertmacro MUI_PAGE_LICENSE \"${path.join(nsisTemplatesDir, \"empty-license.txt\")}\"`,\n      ]\n    }\n    else {\n      licensePage = [`!insertmacro MUI_PAGE_LICENSE \"${license}\"`]\n    }\n\n    scriptGenerator.macro(\"licensePage\", licensePage)\n    if (license.endsWith(\".html\")) {\n      scriptGenerator.macro(\"addLicenseFiles\", [`File /oname=$PLUGINSDIR\\\\license.html \"${license}\"`])\n    }\n    return\n  }\n\n  const licenseFiles = await getLicenseFiles(packager)\n  if (licenseFiles.length === 0) {\n    return\n  }\n\n  const licensePage: Array<string> = []\n  const unspecifiedLangs = new Set(languages)\n\n  let defaultFile: string | null = null\n  for (const item of licenseFiles) {\n    unspecifiedLangs.delete(item.langWithRegion)\n    if (defaultFile == null) {\n      defaultFile = item.file\n    }\n    licensePage.push(`LicenseLangString MUILicense ${lcid[item.langWithRegion] || item.lang} \"${item.file}\"`)\n  }\n\n  for (const l of unspecifiedLangs) {\n    licensePage.push(`LicenseLangString MUILicense ${lcid[l]} \"${defaultFile}\"`)\n  }\n\n  licensePage.push('!insertmacro MUI_PAGE_LICENSE \"$(MUILicense)\"')\n  scriptGenerator.macro(\"licensePage\", licensePage)\n}\n"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=nsisOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.NsisScriptGenerator = void 0;

class NsisScriptGenerator {
  constructor() {
    this.lines = [];
  }

  addIncludeDir(file) {
    this.lines.push(`!addincludedir "${file}"`);
  }

  addPluginDir(pluginArch, dir) {
    this.lines.push(`!addplugindir /${pluginArch} "${dir}"`);
  }

  include(file) {
    this.lines.push(`!include "${file}"`);
  }

  macro(name, lines) {
    this.lines.push(`!macro ${name}`, `  ${(Array.isArray(lines) ? lines : lines.lines).join("\n  ")}`, `!macroend\n`);
  }

  file(outputName, file) {
    this.lines.push(`File${outputName == null ? "" : ` "/oname=${outputName}"`} "${file}"`);
  }

  insertMacro(name, parameters) {
    this.lines.push(`!insertmacro ${name} ${parameters}`);
  } // without -- !!!


  flags(flags) {
    for (const flagName of flags) {
      const variableName = getVarNameForFlag(flagName).replace(/[\-]+(\w|$)/g, (m, p1) => p1.toUpperCase());
      this.lines.push(`!macro _${variableName} _a _b _t _f
  $\{StdUtils.TestParameter} $R9 "${flagName}"
  StrCmp "$R9" "true" \`$\{_t}\` \`$\{_f}\`
!macroend
!define ${variableName} \`"" ${variableName} ""\`
`);
    }
  }

  build() {
    return this.lines.join("\n") + "\n";
  }

}

exports.NsisScriptGenerator = NsisScriptGenerator;

function getVarNameForFlag(flagName) {
  if (flagName === "allusers") {
    return "isForAllUsers";
  }

  if (flagName === "currentuser") {
    return "isForCurrentUser";
  }

  return "is" + flagName[0].toUpperCase() + flagName.substring(1);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=nsisScriptGenerator.js.map{"version":3,"sources":["../../../src/targets/nsis/nsisScriptGenerator.ts"],"names":[],"mappings":";;;;;;;AAAM,MAAO,mBAAP,CAA0B;AAAhC,EAAA,WAAA,GAAA;AACmB,SAAA,KAAA,GAAuB,EAAvB;AA+ClB;;AA7CC,EAAA,aAAa,CAAC,IAAD,EAAa;AACxB,SAAK,KAAL,CAAW,IAAX,CAAgB,mBAAmB,IAAI,GAAvC;AACD;;AAED,EAAA,YAAY,CAAC,UAAD,EAAqB,GAArB,EAAgC;AAC1C,SAAK,KAAL,CAAW,IAAX,CAAgB,kBAAkB,UAAU,KAAK,GAAG,GAApD;AACD;;AAED,EAAA,OAAO,CAAC,IAAD,EAAa;AAClB,SAAK,KAAL,CAAW,IAAX,CAAgB,aAAa,IAAI,GAAjC;AACD;;AAED,EAAA,KAAK,CAAC,IAAD,EAAe,KAAf,EAAyD;AAC5D,SAAK,KAAL,CAAW,IAAX,CACE,UAAU,IAAI,EADhB,EAEE,KAAK,CAAC,KAAK,CAAC,OAAN,CAAc,KAAd,IAAuB,KAAvB,GAAgC,KAA6B,CAAC,KAA/D,EAAsE,IAAtE,CAA2E,MAA3E,CAAkF,EAFzF,EAGE,aAHF;AAKD;;AAED,EAAA,IAAI,CAAC,UAAD,EAA4B,IAA5B,EAAwC;AAC1C,SAAK,KAAL,CAAW,IAAX,CAAgB,OAAO,UAAU,IAAI,IAAd,GAAqB,EAArB,GAA0B,YAAY,UAAU,GAAG,KAAK,IAAI,GAAnF;AACD;;AAED,EAAA,WAAW,CAAC,IAAD,EAAe,UAAf,EAAiC;AAC1C,SAAK,KAAL,CAAW,IAAX,CAAgB,gBAAgB,IAAI,IAAI,UAAU,EAAlD;AACD,GA7B6B,CA+B9B;;;AACA,EAAA,KAAK,CAAC,KAAD,EAAqB;AACxB,SAAK,MAAM,QAAX,IAAuB,KAAvB,EAA8B;AAC5B,YAAM,YAAY,GAAG,iBAAiB,CAAC,QAAD,CAAjB,CAClB,OADkB,CACV,cADU,EACM,CAAC,CAAD,EAAI,EAAJ,KAAW,EAAE,CAAC,WAAH,EADjB,CAArB;AAEA,WAAK,KAAL,CAAW,IAAX,CAAgB,WAAW,YAAY;oCACT,QAAQ;;;UAGlC,YAAY,SAAS,YAAY;CAJrC;AAMD;AACF;;AAED,EAAA,KAAK,GAAA;AACH,WAAO,KAAK,KAAL,CAAW,IAAX,CAAgB,IAAhB,IAAwB,IAA/B;AACD;;AA/C6B;;;;AAkDhC,SAAS,iBAAT,CAA2B,QAA3B,EAA2C;AACzC,MAAI,QAAQ,KAAK,UAAjB,EAA6B;AAC3B,WAAO,eAAP;AACD;;AACD,MAAI,QAAQ,KAAK,aAAjB,EAAgC;AAC9B,WAAO,kBAAP;AACD;;AACD,SAAO,OAAO,QAAQ,CAAC,CAAD,CAAR,CAAY,WAAZ,EAAP,GAAmC,QAAQ,CAAC,SAAT,CAAmB,CAAnB,CAA1C;AACD,C","sourcesContent":["export class NsisScriptGenerator {\n  private readonly lines: Array<string> = []\n\n  addIncludeDir(file: string) {\n    this.lines.push(`!addincludedir \"${file}\"`)\n  }\n\n  addPluginDir(pluginArch: string, dir: string) {\n    this.lines.push(`!addplugindir /${pluginArch} \"${dir}\"`)\n  }\n\n  include(file: string) {\n    this.lines.push(`!include \"${file}\"`)\n  }\n\n  macro(name: string, lines: Array<string> | NsisScriptGenerator) {\n    this.lines.push(\n      `!macro ${name}`,\n      `  ${(Array.isArray(lines) ? lines : (lines as NsisScriptGenerator).lines).join(\"\\n  \")}`,\n      `!macroend\\n`\n    )\n  }\n\n  file(outputName: string | null, file: string) {\n    this.lines.push(`File${outputName == null ? \"\" : ` \"/oname=${outputName}\"`} \"${file}\"`)\n  }\n\n  insertMacro(name: string, parameters: string) {\n    this.lines.push(`!insertmacro ${name} ${parameters}`)\n  }\n\n  // without -- !!!\n  flags(flags: Array<string>) {\n    for (const flagName of flags) {\n      const variableName = getVarNameForFlag(flagName)\n        .replace(/[\\-]+(\\w|$)/g, (m, p1) => p1.toUpperCase())\n      this.lines.push(`!macro _${variableName} _a _b _t _f\n  $\\{StdUtils.TestParameter} $R9 \"${flagName}\"\n  StrCmp \"$R9\" \"true\" \\`$\\{_t}\\` \\`$\\{_f}\\`\n!macroend\n!define ${variableName} \\`\"\" ${variableName} \"\"\\`\n`)\n    }\n  }\n\n  build() {\n    return this.lines.join(\"\\n\") + \"\\n\"\n  }\n}\n\nfunction getVarNameForFlag(flagName: string): string {\n  if (flagName === \"allusers\") {\n    return \"isForAllUsers\"\n  }\n  if (flagName === \"currentuser\") {\n    return \"isForCurrentUser\"\n  }\n  return \"is\" + flagName[0].toUpperCase() + flagName.substring(1)\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CopyElevateHelper = exports.AppPackageHelper = exports.NSIS_PATH = exports.nsisTemplatesDir = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _binDownload() {
  const data = require("../../binDownload");

  _binDownload = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _pathManager() {
  const data = require("../../util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const nsisTemplatesDir = (0, _pathManager().getTemplatePath)("nsis");
exports.nsisTemplatesDir = nsisTemplatesDir;
const NSIS_PATH = new (_lazyVal().Lazy)(() => {
  const custom = process.env.ELECTRON_BUILDER_NSIS_DIR;

  if (custom != null && custom.length > 0) {
    return Promise.resolve(custom.trim());
  } // noinspection SpellCheckingInspection


  return (0, _binDownload().getBinFromUrl)("nsis", "3.0.3.2", "tUrlDPQtbjcooNbTrjUzLupttWlATLDNWqK57TVr+gAt3wkaxFxBS3k80AzEFJbmSeOWrUooO72FFOVGXcoxhA==");
});
exports.NSIS_PATH = NSIS_PATH;

class AppPackageHelper {
  constructor(elevateHelper) {
    this.elevateHelper = elevateHelper;
    this.archToFileInfo = new Map();
    this.infoToIsDelete = new Map();
    /** @private */

    this.refCount = 0;
  }

  packArch(arch, target) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      let infoPromise = _this.archToFileInfo.get(arch);

      if (infoPromise == null) {
        const appOutDir = target.archs.get(arch);
        infoPromise = _this.elevateHelper.copy(appOutDir, target).then(() => target.buildAppPackage(appOutDir, arch));

        _this.archToFileInfo.set(arch, infoPromise);
      }

      const info = yield infoPromise;

      if (target.isWebInstaller) {
        _this.infoToIsDelete.set(info, false);
      } else if (!_this.infoToIsDelete.has(info)) {
        _this.infoToIsDelete.set(info, true);
      }

      return info;
    })();
  }

  finishBuild() {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (--_this2.refCount > 0) {
        return;
      }

      const filesToDelete = [];

      for (const [info, isDelete] of _this2.infoToIsDelete.entries()) {
        if (isDelete) {
          filesToDelete.push(info.path);
        }
      }

      yield _bluebirdLst().default.map(filesToDelete, it => (0, _fsExtraP().unlink)(it));
    })();
  }

}

exports.AppPackageHelper = AppPackageHelper;

class CopyElevateHelper {
  constructor() {
    this.copied = new Map();
  }

  copy(appOutDir, target) {
    if (!target.packager.info.framework.isCopyElevateHelper) {
      return Promise.resolve();
    }

    let isPackElevateHelper = target.options.packElevateHelper;

    if (isPackElevateHelper === false && target.options.perMachine === true) {
      isPackElevateHelper = true;

      _builderUtil().log.warn("`packElevateHelper = false` is ignored, because `perMachine` is set to `true`");
    }

    if (isPackElevateHelper === false) {
      return Promise.resolve();
    }

    let promise = this.copied.get(appOutDir);

    if (promise != null) {
      return promise;
    }

    promise = NSIS_PATH.value.then(it => {
      const outFile = path.join(appOutDir, "resources", "elevate.exe");
      const promise = (0, _fs().copyFile)(path.join(it, "elevate.exe"), outFile, false);

      if (target.packager.platformSpecificBuildOptions.signAndEditExecutable !== false) {
        return promise.then(() => target.packager.sign(outFile));
      }

      return promise;
    });
    this.copied.set(appOutDir, promise);
    return promise;
  }

} exports.CopyElevateHelper = CopyElevateHelper;
// __ts-babel@6.0.4
//# sourceMappingURL=nsisUtil.js.map{"version":3,"sources":["../../../src/targets/nsis/nsisUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, log } from \"builder-util\"\nimport { PackageFileInfo } from \"builder-util-runtime\"\nimport { getBinFromUrl } from \"../../binDownload\"\nimport { copyFile } from \"builder-util/out/fs\"\nimport { unlink } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { getTemplatePath } from \"../../util/pathManager\"\nimport { NsisTarget } from \"./NsisTarget\"\n\nexport const nsisTemplatesDir = getTemplatePath(\"nsis\")\n\nexport const NSIS_PATH = new Lazy(() => {\n  const custom = process.env.ELECTRON_BUILDER_NSIS_DIR\n  if (custom != null && custom.length > 0) {\n    return Promise.resolve(custom.trim())\n  }\n  // noinspection SpellCheckingInspection\n  return getBinFromUrl(\"nsis\", \"3.0.3.2\", \"tUrlDPQtbjcooNbTrjUzLupttWlATLDNWqK57TVr+gAt3wkaxFxBS3k80AzEFJbmSeOWrUooO72FFOVGXcoxhA==\")\n})\n\nexport class AppPackageHelper {\n  private readonly archToFileInfo = new Map<Arch, Promise<PackageFileInfo>>()\n  private readonly infoToIsDelete = new Map<PackageFileInfo, boolean>()\n\n  /** @private */\n  refCount = 0\n\n  constructor(private readonly elevateHelper: CopyElevateHelper) {\n  }\n\n  async packArch(arch: Arch, target: NsisTarget): Promise<PackageFileInfo> {\n    let infoPromise = this.archToFileInfo.get(arch)\n    if (infoPromise == null) {\n      const appOutDir = target.archs.get(arch)!\n      infoPromise = this.elevateHelper.copy(appOutDir, target)\n        .then(() => target.buildAppPackage(appOutDir, arch))\n      this.archToFileInfo.set(arch, infoPromise)\n    }\n\n    const info = await infoPromise\n    if (target.isWebInstaller) {\n      this.infoToIsDelete.set(info, false)\n    }\n    else if (!this.infoToIsDelete.has(info)) {\n      this.infoToIsDelete.set(info, true)\n    }\n    return info\n  }\n\n  async finishBuild(): Promise<any> {\n    if (--this.refCount > 0) {\n      return\n    }\n\n    const filesToDelete: Array<string> = []\n    for (const [info, isDelete] of this.infoToIsDelete.entries()) {\n      if (isDelete) {\n        filesToDelete.push(info.path)\n      }\n    }\n\n    await BluebirdPromise.map(filesToDelete, it => unlink(it))\n  }\n}\n\nexport class CopyElevateHelper {\n  private readonly copied = new Map<string, Promise<any>>()\n\n  copy(appOutDir: string, target: NsisTarget): Promise<any> {\n    if (!target.packager.info.framework.isCopyElevateHelper) {\n      return Promise.resolve()\n    }\n\n    let isPackElevateHelper = target.options.packElevateHelper\n    if (isPackElevateHelper === false && target.options.perMachine === true) {\n      isPackElevateHelper = true\n      log.warn(\"`packElevateHelper = false` is ignored, because `perMachine` is set to `true`\")\n    }\n\n    if (isPackElevateHelper === false) {\n      return Promise.resolve()\n    }\n\n    let promise = this.copied.get(appOutDir)\n    if (promise != null) {\n      return promise\n    }\n\n    promise = NSIS_PATH.value\n      .then(it => {\n        const outFile = path.join(appOutDir, \"resources\", \"elevate.exe\")\n        const promise = copyFile(path.join(it, \"elevate.exe\"), outFile, false)\n        if (target.packager.platformSpecificBuildOptions.signAndEditExecutable !== false) {\n          return promise.then(() => target.packager.sign(outFile))\n        }\n        return promise\n      })\n    this.copied.set(appOutDir, promise)\n    return promise\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ProjectInfoManager = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class ProjectInfoManager {
  constructor(packager) {
    this.packager = packager;
    this.infoFile = new (_lazyVal().Lazy)(() => this.saveConfigurationAndMetadata());
  }

  saveConfigurationAndMetadata() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager;
      const tempDir = yield packager.tempDirManager.createTempDir({
        prefix: "remote-build-metadata"
      }); // we cannot use getTempFile because file name must be constant

      const info = {
        metadata: packager.metadata,
        configuration: packager.config,
        repositoryInfo: yield packager.repositoryInfo,
        buildResourceDirName: path.basename(packager.buildResourcesDir)
      };

      if (packager.metadata !== packager.devMetadata && packager.devMetadata != null) {
        info.devMetadata = packager.devMetadata;
      }

      const file = path.join(tempDir, "info.json");
      yield (0, _fsExtraP().outputJson)(file, info);
      return file;
    })();
  }

} exports.ProjectInfoManager = ProjectInfoManager;
// __ts-babel@6.0.4
//# sourceMappingURL=ProjectInfoManager.js.map{"version":3,"sources":["../../src/remoteBuilder/ProjectInfoManager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;;;AAGM,MAAO,kBAAP,CAAyB;AAG7B,EAAA,WAAA,CAAqB,QAArB,EAAuC;AAAlB,SAAA,QAAA,GAAA,QAAA;AAFZ,SAAA,QAAA,GAAW,KAAI,eAAJ,EAAS,MAAM,KAAK,4BAAL,EAAf,CAAX;AAGR;;AAEa,EAAA,4BAAN,GAAkC;AAAA;;AAAA;AACxC,YAAM,QAAQ,GAAG,KAAI,CAAC,QAAtB;AACA,YAAM,OAAO,SAAS,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAAsC;AAAC,QAAA,MAAM,EAAE;AAAT,OAAtC,CAAtB,CAFwC,CAGxC;;AACA,YAAM,IAAI,GAAQ;AAChB,QAAA,QAAQ,EAAE,QAAQ,CAAC,QADH;AAEhB,QAAA,aAAa,EAAE,QAAQ,CAAC,MAFR;AAGhB,QAAA,cAAc,QAAQ,QAAQ,CAAC,cAHf;AAIhB,QAAA,oBAAoB,EAAE,IAAI,CAAC,QAAL,CAAc,QAAQ,CAAC,iBAAvB;AAJN,OAAlB;;AAMA,UAAI,QAAQ,CAAC,QAAT,KAAsB,QAAQ,CAAC,WAA/B,IAA8C,QAAQ,CAAC,WAAT,IAAwB,IAA1E,EAAgF;AAC9E,QAAA,IAAI,CAAC,WAAL,GAAmB,QAAQ,CAAC,WAA5B;AACD;;AACD,YAAM,IAAI,GAAG,IAAI,CAAC,IAAL,CAAU,OAAV,EAAmB,WAAnB,CAAb;AACA,YAAM,4BAAW,IAAX,EAAiB,IAAjB,CAAN;AACA,aAAO,IAAP;AAfwC;AAgBzC;;AAtB4B,C","sourcesContent":["import { outputJson } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { Packager } from \"../packager\"\n\nexport class ProjectInfoManager {\n  readonly infoFile = new Lazy(() => this.saveConfigurationAndMetadata())\n\n  constructor(readonly packager: Packager) {\n  }\n\n  private async saveConfigurationAndMetadata() {\n    const packager = this.packager\n    const tempDir = await packager.tempDirManager.createTempDir({prefix: \"remote-build-metadata\"})\n    // we cannot use getTempFile because file name must be constant\n    const info: any = {\n      metadata: packager.metadata,\n      configuration: packager.config,\n      repositoryInfo: await packager.repositoryInfo,\n      buildResourceDirName: path.basename(packager.buildResourcesDir)\n    }\n    if (packager.metadata !== packager.devMetadata && packager.devMetadata != null) {\n      info.devMetadata = packager.devMetadata\n    }\n    const file = path.join(tempDir, \"info.json\")\n    await outputJson(file, info)\n    return file\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.RemoteBuilder = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _appBuilder() {
  const data = require("../util/appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _ProjectInfoManager() {
  const data = require("./ProjectInfoManager");

  _ProjectInfoManager = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class RemoteBuilder {
  constructor(packager) {
    this.packager = packager;
    this.toBuild = new Map();
    this.buildStarted = false;
  }

  scheduleBuild(target, arch, unpackedDirectory) {
    if (!(0, _builderUtil().isEnvTrue)(process.env._REMOTE_BUILD) && this.packager.config.remoteBuild === false) {
      throw new (_builderUtil().InvalidConfigurationError)("Target is not supported on your OS and using of Electron Build Service is disabled (\"remoteBuild\" option)");
    }

    let list = this.toBuild.get(arch);

    if (list == null) {
      list = [];
      this.toBuild.set(arch, list);
    }

    list.push({
      name: target.name,
      arch: _builderUtil().Arch[arch],
      unpackedDirectory,
      outDir: target.outDir
    });
  }

  build() {
    if (this.buildStarted) {
      return Promise.resolve();
    }

    this.buildStarted = true;
    return _bluebirdLst().default.mapSeries(Array.from(this.toBuild.keys()), arch => {
      return this._build(this.toBuild.get(arch), this.packager);
    });
  } // noinspection JSMethodCanBeStatic


  _build(targets, packager) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (_builderUtil().log.isDebugEnabled) {
        _builderUtil().log.debug({
          remoteTargets: JSON.stringify(targets, null, 2)
        }, "remote building");
      }

      const projectInfoManager = new (_ProjectInfoManager().ProjectInfoManager)(packager.info);
      const req = Buffer.from(JSON.stringify({
        targets: targets.map(it => {
          return {
            name: it.name,
            arch: it.arch,
            unpackedDirName: path.basename(it.unpackedDirectory)
          };
        }),
        platform: packager.platform.buildConfigurationKey
      })).toString("base64");
      const outDir = targets[0].outDir;
      const args = ["remote-build", "--request", req, "--output", outDir];
      args.push("--file", targets[0].unpackedDirectory);
      args.push("--file", (yield projectInfoManager.infoFile.value));
      const buildResourcesDir = packager.buildResourcesDir;

      if (buildResourcesDir === packager.projectDir) {
        throw new (_builderUtil().InvalidConfigurationError)(`Build resources dir equals to project dir and so, not sent to remote build agent. It will lead to incorrect results.\nPlease set "directories.buildResources" to separate dir or leave default ("build" directory in the project root)`);
      }

      args.push("--build-resource-dir", buildResourcesDir);
      const result = yield (0, _appBuilder().executeAppBuilderAsJson)(args);

      if (result.error != null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Remote builder error (if you think that it is not your application misconfiguration issue, please file issue to https://github.com/electron-userland/electron-builder/issues):\n\n${result.error}`, "REMOTE_BUILDER_ERROR");
      } else if (result.files != null) {
        for (const artifact of result.files) {
          const localFile = path.join(outDir, artifact.file);

          const artifactCreatedEvent = _this.artifactInfoToArtifactCreatedEvent(artifact, localFile, outDir); // PublishManager uses outDir and options, real (the same as for local build) values must be used


          yield _this.packager.info.callArtifactBuildCompleted(artifactCreatedEvent);
        }
      }
    })();
  }

  artifactInfoToArtifactCreatedEvent(artifact, localFile, outDir) {
    const target = artifact.target; // noinspection SpellCheckingInspection

    return Object.assign({}, artifact, {
      file: localFile,
      target: target == null ? null : new FakeTarget(target, outDir, this.packager.config[target]),
      packager: this.packager
    });
  }

}

exports.RemoteBuilder = RemoteBuilder;

class FakeTarget extends _core().Target {
  constructor(name, outDir, options) {
    super(name);
    this.outDir = outDir;
    this.options = options;
  }

  build(appOutDir, arch) {// no build

    return (0, _bluebirdLst().coroutine)(function* () {})();
  }

} 
// __ts-babel@6.0.4
//# sourceMappingURL=RemoteBuilder.js.map{"version":3,"sources":["../../src/remoteBuilder/RemoteBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, isEnvTrue, log, InvalidConfigurationError } from \"builder-util\"\nimport * as path from \"path\"\nimport { UploadTask } from \"electron-publish/out/publisher\"\nimport { Target, TargetSpecificOptions } from \"../core\"\nimport { ArtifactCreated } from \"../packagerApi\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { executeAppBuilderAsJson } from \"../util/appBuilder\"\nimport { ProjectInfoManager } from \"./ProjectInfoManager\"\n\ninterface TargetInfo {\n  name: string\n  arch: string\n  unpackedDirectory: string\n  outDir: string\n}\n\nexport class RemoteBuilder {\n  private readonly toBuild = new Map<Arch, Array<TargetInfo>>()\n  private buildStarted = false\n\n  constructor(readonly packager: PlatformPackager<any>) {\n  }\n\n  scheduleBuild(target: Target, arch: Arch, unpackedDirectory: string) {\n    if (!isEnvTrue(process.env._REMOTE_BUILD) && this.packager.config.remoteBuild === false) {\n      throw new InvalidConfigurationError(\"Target is not supported on your OS and using of Electron Build Service is disabled (\\\"remoteBuild\\\" option)\")\n    }\n\n    let list = this.toBuild.get(arch)\n    if (list == null) {\n      list = []\n      this.toBuild.set(arch, list)\n    }\n\n    list.push({\n      name: target.name,\n      arch: Arch[arch],\n      unpackedDirectory,\n      outDir: target.outDir,\n    })\n  }\n\n  build(): Promise<any> {\n    if (this.buildStarted) {\n      return Promise.resolve()\n    }\n\n    this.buildStarted = true\n\n    return BluebirdPromise.mapSeries(Array.from(this.toBuild.keys()), (arch: Arch) => {\n      return this._build(this.toBuild.get(arch)!!, this.packager)\n    })\n  }\n\n  // noinspection JSMethodCanBeStatic\n  private async _build(targets: Array<TargetInfo>, packager: PlatformPackager<any>): Promise<void> {\n    if (log.isDebugEnabled) {\n      log.debug({remoteTargets: JSON.stringify(targets, null, 2)}, \"remote building\")\n    }\n\n    const projectInfoManager = new ProjectInfoManager(packager.info)\n\n    const req = Buffer.from(JSON.stringify({\n      targets: targets.map(it => {\n        return {\n          name: it.name,\n          arch: it.arch,\n          unpackedDirName: path.basename(it.unpackedDirectory),\n        }\n      }),\n      platform: packager.platform.buildConfigurationKey,\n    })).toString(\"base64\")\n    const outDir = targets[0].outDir\n    const args = [\"remote-build\", \"--request\", req, \"--output\", outDir]\n\n    args.push(\"--file\", targets[0].unpackedDirectory)\n    args.push(\"--file\", await projectInfoManager.infoFile.value)\n\n    const buildResourcesDir = packager.buildResourcesDir\n    if (buildResourcesDir === packager.projectDir) {\n      throw new InvalidConfigurationError(`Build resources dir equals to project dir and so, not sent to remote build agent. It will lead to incorrect results.\\nPlease set \"directories.buildResources\" to separate dir or leave default (\"build\" directory in the project root)`)\n    }\n\n    args.push(\"--build-resource-dir\", buildResourcesDir)\n\n    const result: any = await executeAppBuilderAsJson(args)\n    if (result.error != null) {\n      throw new InvalidConfigurationError(`Remote builder error (if you think that it is not your application misconfiguration issue, please file issue to https://github.com/electron-userland/electron-builder/issues):\\n\\n${result.error}`, \"REMOTE_BUILDER_ERROR\")\n    }\n    else if (result.files != null) {\n      for (const artifact of result.files) {\n        const localFile = path.join(outDir, artifact.file)\n        const artifactCreatedEvent = this.artifactInfoToArtifactCreatedEvent(artifact, localFile, outDir)\n        // PublishManager uses outDir and options, real (the same as for local build) values must be used\n        await this.packager.info.callArtifactBuildCompleted(artifactCreatedEvent)\n      }\n    }\n  }\n\n  private artifactInfoToArtifactCreatedEvent(artifact: ArtifactInfo, localFile: string, outDir: string): ArtifactCreated {\n    const target = artifact.target\n    // noinspection SpellCheckingInspection\n    return {\n      ...artifact,\n      file: localFile,\n      target: target == null ? null : new FakeTarget(target, outDir, (this.packager.config as any)[target]),\n      packager: this.packager,\n    }\n  }\n}\n\nclass FakeTarget extends Target {\n  constructor(name: string, readonly outDir: string, readonly options: TargetSpecificOptions | null | undefined) {\n    super(name)\n  }\n\n  async build(appOutDir: string, arch: Arch) {\n    // no build\n  }\n}\n\ninterface ArtifactInfo extends UploadTask {\n  target: string | null\n\n  readonly isWriteUpdateInfo?: boolean\n  readonly updateInfo?: any\n}"],"sourceRoot":""}
"use strict";

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _() {
  const data = require("..");

  _ = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

if (process.env.BUILDER_REMOVE_STAGE_EVEN_IF_DEBUG == null) {
  process.env.BUILDER_REMOVE_STAGE_EVEN_IF_DEBUG = "true";
}

function doBuild(_x) {
  return _doBuild.apply(this, arguments);
}

function _doBuild() {
  _doBuild = (0, _bluebirdLst().coroutine)(function* (data) {
    if (process.env.APP_BUILDER_TMP_DIR == null) {
      throw new (_builderUtil().InvalidConfigurationError)("Env APP_BUILDER_TMP_DIR must be set for builder process");
    }

    const projectDir = process.env.PROJECT_DIR;

    if (projectDir == null) {
      throw new (_builderUtil().InvalidConfigurationError)("Env PROJECT_DIR must be set for builder process");
    }

    const targets = data.targets;

    if (data.platform == null) {
      throw new (_builderUtil().InvalidConfigurationError)("platform not specified");
    }

    if (targets == null) {
      throw new (_builderUtil().InvalidConfigurationError)("targets path not specified");
    }

    if (!Array.isArray(targets)) {
      throw new (_builderUtil().InvalidConfigurationError)("targets must be array of target name");
    }

    const infoFile = projectDir + path.sep + "info.json";
    const info = yield (0, _fsExtraP().readJson)(infoFile);
    const projectOutDir = process.env.PROJECT_OUT_DIR;

    if (projectDir == null) {
      throw new (_builderUtil().InvalidConfigurationError)("Env PROJECT_OUT_DIR must be set for builder process");
    } // yes, for now we expect the only target


    const prepackaged = projectDir + path.sep + targets[0].unpackedDirName; // do not use build function because we don't need to publish artifacts

    const options = {
      prepackaged,
      projectDir,
      [data.platform]: targets.map(it => it.name + ":" + it.arch),
      publish: "never"
    };
    const packager = new (_().Packager)(options);
    const artifacts = [];
    const relativePathOffset = projectOutDir.length + 1;
    packager.artifactCreated(event => {
      if (event.file == null) {
        return;
      }

      artifacts.push({
        file: event.file.substring(relativePathOffset),
        target: event.target == null ? null : event.target.name,
        arch: event.arch,
        safeArtifactName: event.safeArtifactName,
        isWriteUpdateInfo: event.isWriteUpdateInfo === true,
        updateInfo: event.updateInfo
      });
    });

    packager.stageDirPathCustomizer = (target, packager, arch) => {
      // snap creates a lot of files and so, we cannot use tmpfs to avoid out of memory error
      const parentDir = target.name === "snap" && !target.isUseTemplateApp ? projectOutDir : projectDir;
      return parentDir + path.sep + `__${target.name}-${_().Arch[arch]}`;
    }; // _build method expects final effective configuration - packager.options.config is ignored


    yield packager._build(Object.assign({}, info.configuration, {
      publish: null,
      beforeBuild: null,
      afterPack: null,
      afterSign: null,
      afterAllArtifactBuild: null,
      onNodeModuleFile: null,
      directories: {
        output: projectOutDir,
        buildResources: projectDir + path.sep + info.buildResourceDirName
      }
    }), info.metadata, info.devMetadata, info.repositoryInfo); // writeJson must be not used because it adds unwanted \n as last file symbol

    yield (0, _fsExtraP().writeFile)(path.join(process.env.APP_BUILDER_TMP_DIR, "__build-result.json"), JSON.stringify(artifacts));
  });
  return _doBuild.apply(this, arguments);
}

doBuild(JSON.parse(process.argv[2])).catch(error => {
  process.exitCode = 0;
  return (0, _fsExtraP().writeFile)(path.join(process.env.APP_BUILDER_TMP_DIR, "__build-result.json"), (error.stack || error).toString());
}); 
// __ts-babel@6.0.4
//# sourceMappingURL=builder-cli.js.map{"version":3,"sources":["../../src/remoteBuilder/builder-cli.ts"],"names":[],"mappings":"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","sourcesContent":["import { readJson, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { UploadTask, Arch, Packager, PackagerOptions, PublishOptions } from \"..\"\nimport { InvalidConfigurationError } from \"builder-util\"\nimport SnapTarget from \"../targets/snap\"\n\nif (process.env.BUILDER_REMOVE_STAGE_EVEN_IF_DEBUG == null) {\n  process.env.BUILDER_REMOVE_STAGE_EVEN_IF_DEBUG = \"true\"\n}\n\nasync function doBuild(data: BuildTask): Promise<void> {\n  if (process.env.APP_BUILDER_TMP_DIR == null) {\n    throw new InvalidConfigurationError(\"Env APP_BUILDER_TMP_DIR must be set for builder process\")\n  }\n\n  const projectDir = process.env.PROJECT_DIR\n  if (projectDir == null) {\n    throw new InvalidConfigurationError(\"Env PROJECT_DIR must be set for builder process\")\n  }\n\n  const targets = data.targets\n  if (data.platform == null) {\n    throw new InvalidConfigurationError(\"platform not specified\")\n  }\n  if (targets == null) {\n    throw new InvalidConfigurationError(\"targets path not specified\")\n  }\n  if (!Array.isArray(targets)) {\n    throw new InvalidConfigurationError(\"targets must be array of target name\")\n  }\n\n  const infoFile = projectDir + path.sep + \"info.json\"\n  const info = await readJson(infoFile)\n\n  const projectOutDir = process.env.PROJECT_OUT_DIR\n  if (projectDir == null) {\n    throw new InvalidConfigurationError(\"Env PROJECT_OUT_DIR must be set for builder process\")\n  }\n\n  // yes, for now we expect the only target\n  const prepackaged = projectDir + path.sep + targets[0].unpackedDirName\n  // do not use build function because we don't need to publish artifacts\n  const options: PackagerOptions & PublishOptions = {\n    prepackaged,\n    projectDir,\n    [data.platform]: targets.map(it => it.name + \":\" + it.arch),\n    publish: \"never\",\n  }\n  const packager = new Packager(options)\n\n  const artifacts: Array<ArtifactInfo> = []\n  const relativePathOffset = projectOutDir!!.length + 1\n  packager.artifactCreated(event => {\n    if (event.file == null) {\n      return\n    }\n\n    artifacts.push({\n      file: event.file.substring(relativePathOffset),\n      target: event.target == null ? null : event.target.name,\n      arch: event.arch,\n      safeArtifactName: event.safeArtifactName,\n      isWriteUpdateInfo: event.isWriteUpdateInfo === true,\n      updateInfo: event.updateInfo,\n    })\n  })\n\n  packager.stageDirPathCustomizer = (target, packager, arch) => {\n    // snap creates a lot of files and so, we cannot use tmpfs to avoid out of memory error\n    const parentDir = target.name === \"snap\" && !(target as SnapTarget).isUseTemplateApp ? projectOutDir : projectDir\n    return parentDir + path.sep + `__${target.name}-${Arch[arch]}`\n  }\n\n  // _build method expects final effective configuration - packager.options.config is ignored\n  await packager._build({\n    ...info.configuration,\n    publish: null,\n    beforeBuild: null,\n    afterPack: null,\n    afterSign: null,\n    afterAllArtifactBuild: null,\n    onNodeModuleFile: null,\n    directories: {\n      output: projectOutDir,\n      buildResources: projectDir + path.sep + info.buildResourceDirName\n    },\n  }, info.metadata, info.devMetadata, info.repositoryInfo)\n\n  // writeJson must be not used because it adds unwanted \\n as last file symbol\n  await writeFile(path.join(process.env.APP_BUILDER_TMP_DIR!!, \"__build-result.json\"), JSON.stringify(artifacts))\n}\n\ndoBuild(JSON.parse(process.argv[2]))\n  .catch(error => {\n    process.exitCode = 0\n    return writeFile(path.join(process.env.APP_BUILDER_TMP_DIR!!, \"__build-result.json\"), (error.stack || error).toString())\n  })\n\ninterface TargetInfo {\n  name: string\n  arch: string\n  unpackedDirName: string\n}\n\ninterface ArtifactInfo extends UploadTask {\n  target: string | null\n\n  readonly isWriteUpdateInfo?: boolean\n  readonly updateInfo?: any\n}\n\ninterface BuildTask {\n  platform: string\n  targets: Array<TargetInfo>\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ELECTRON_BUILD_SERVICE_CA_CERT = exports.ELECTRON_BUILD_SERVICE_LOCAL_CA_CERT = void 0;
// noinspection SpellCheckingInspection
const ELECTRON_BUILD_SERVICE_LOCAL_CA_CERT = Buffer.from(`-----BEGIN CERTIFICATE-----
MIIBiDCCAS+gAwIBAgIRAPHSzTRLcN2nElhQdaRP47IwCgYIKoZIzj0EAwIwJDEi
MCAGA1UEAxMZZWxlY3Ryb24uYnVpbGQubG9jYWwgcm9vdDAeFw0xNzExMTMxNzI4
NDFaFw0yNzExMTExNzI4NDFaMCQxIjAgBgNVBAMTGWVsZWN0cm9uLmJ1aWxkLmxv
Y2FsIHJvb3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQVyduuCT2acuk2QH06
yal/b6O7eTTpOHk3Ucjc+ZZta2vC2+c1IKcSAwimKbTbK+nRxWWJl9ZYx9RTwbRf
QjD6o0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
FgQUlm08vBe4CUNAOTQN5Z1RNTfJjjYwCgYIKoZIzj0EAwIDRwAwRAIgMXlT6YM8
4pQtnhUjijVMz+NlcYafS1CEbNBMaWhP87YCIGXUmu7ON9hRLanXzBNBlrtTQG+i
l/NT6REwZA64/lNy
-----END CERTIFICATE-----
`); // noinspection SpellCheckingInspection

exports.ELECTRON_BUILD_SERVICE_LOCAL_CA_CERT = ELECTRON_BUILD_SERVICE_LOCAL_CA_CERT;
const ELECTRON_BUILD_SERVICE_CA_CERT = Buffer.from(`-----BEGIN CERTIFICATE-----
MIIBfTCCASOgAwIBAgIRAIdieK1+3C4abgOvQ7pVVqAwCgYIKoZIzj0EAwIwHjEc
MBoGA1UEAxMTZWxlY3Ryb24uYnVpbGQgcm9vdDAeFw0xNzExMTMxNzI4NDFaFw0x
ODExMTMxNzI4NDFaMB4xHDAaBgNVBAMTE2VsZWN0cm9uLmJ1aWxkIHJvb3QwWTAT
BgcqhkjOPQIBBggqhkjOPQMBBwNCAAR+4b6twzizN/z27yvwrCV5kinGUrfo+W7n
L/l28ErscNe1BDSyh/IYrnMWb1rDMSLGhvkgI9Cfex1whNPHR101o0IwQDAOBgNV
HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU6Dq8kK7tQlrt
zkIYrYiTZGpHEp0wCgYIKoZIzj0EAwIDSAAwRQIgKSfjAQbYlY/S1wMLUi84r8QN
hhMnUwsOmlDan0xPalICIQDLIAXAIyArVtH38a4aizvhH8YeXrxzpJh3U8RolBZF
SA==
-----END CERTIFICATE-----
`); exports.ELECTRON_BUILD_SERVICE_CA_CERT = ELECTRON_BUILD_SERVICE_CA_CERT;
// __ts-babel@6.0.4
//# sourceMappingURL=remote-builder-certs.js.map{"version":3,"sources":["../../src/remoteBuilder/remote-builder-certs.ts"],"names":[],"mappings":";;;;;;AAAA;AACO,MAAM,oCAAoC,GAAG,MAAM,CAAC,IAAP,CAAY;;;;;;;;;;;CAAZ,CAA7C,C,CAaP;;;AACO,MAAM,8BAA8B,GAAG,MAAM,CAAC,IAAP,CAAY;;;;;;;;;;;CAAZ,CAAvC,C","sourcesContent":["// noinspection SpellCheckingInspection\nexport const ELECTRON_BUILD_SERVICE_LOCAL_CA_CERT = Buffer.from(`-----BEGIN CERTIFICATE-----\nMIIBiDCCAS+gAwIBAgIRAPHSzTRLcN2nElhQdaRP47IwCgYIKoZIzj0EAwIwJDEi\nMCAGA1UEAxMZZWxlY3Ryb24uYnVpbGQubG9jYWwgcm9vdDAeFw0xNzExMTMxNzI4\nNDFaFw0yNzExMTExNzI4NDFaMCQxIjAgBgNVBAMTGWVsZWN0cm9uLmJ1aWxkLmxv\nY2FsIHJvb3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQVyduuCT2acuk2QH06\nyal/b6O7eTTpOHk3Ucjc+ZZta2vC2+c1IKcSAwimKbTbK+nRxWWJl9ZYx9RTwbRf\nQjD6o0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\nFgQUlm08vBe4CUNAOTQN5Z1RNTfJjjYwCgYIKoZIzj0EAwIDRwAwRAIgMXlT6YM8\n4pQtnhUjijVMz+NlcYafS1CEbNBMaWhP87YCIGXUmu7ON9hRLanXzBNBlrtTQG+i\nl/NT6REwZA64/lNy\n-----END CERTIFICATE-----\n`)\n\n// noinspection SpellCheckingInspection\nexport const ELECTRON_BUILD_SERVICE_CA_CERT = Buffer.from(`-----BEGIN CERTIFICATE-----\nMIIBfTCCASOgAwIBAgIRAIdieK1+3C4abgOvQ7pVVqAwCgYIKoZIzj0EAwIwHjEc\nMBoGA1UEAxMTZWxlY3Ryb24uYnVpbGQgcm9vdDAeFw0xNzExMTMxNzI4NDFaFw0x\nODExMTMxNzI4NDFaMB4xHDAaBgNVBAMTE2VsZWN0cm9uLmJ1aWxkIHJvb3QwWTAT\nBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR+4b6twzizN/z27yvwrCV5kinGUrfo+W7n\nL/l28ErscNe1BDSyh/IYrnMWb1rDMSLGhvkgI9Cfex1whNPHR101o0IwQDAOBgNV\nHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU6Dq8kK7tQlrt\nzkIYrYiTZGpHEp0wCgYIKoZIzj0EAwIDSAAwRQIgKSfjAQbYlY/S1wMLUi84r8QN\nhhMnUwsOmlDan0xPalICIQDLIAXAIyArVtH38a4aizvhH8YeXrxzpJh3U8RolBZF\nSA==\n-----END CERTIFICATE-----\n`)"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getAppUpdatePublishConfiguration = getAppUpdatePublishConfiguration;
exports.getPublishConfigsForUpdateInfo = getPublishConfigsForUpdateInfo;
exports.createPublisher = createPublisher;
exports.computeDownloadUrl = computeDownloadUrl;
exports.getPublishConfigs = getPublishConfigs;
exports.PublishManager = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

var _debug2 = _interopRequireDefault(require("debug"));

function _electronPublish() {
  const data = require("electron-publish");

  _electronPublish = function () {
    return data;
  };

  return data;
}

function _BintrayPublisher() {
  const data = require("electron-publish/out/BintrayPublisher");

  _BintrayPublisher = function () {
    return data;
  };

  return data;
}

function _gitHubPublisher() {
  const data = require("electron-publish/out/gitHubPublisher");

  _gitHubPublisher = function () {
    return data;
  };

  return data;
}

function _multiProgress() {
  const data = require("electron-publish/out/multiProgress");

  _multiProgress = function () {
    return data;
  };

  return data;
}

function _s3Publisher() {
  const data = _interopRequireDefault(require("electron-publish/out/s3/s3Publisher"));

  _s3Publisher = function () {
    return data;
  };

  return data;
}

function _spacesPublisher() {
  const data = _interopRequireDefault(require("electron-publish/out/s3/spacesPublisher"));

  _spacesPublisher = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _isCi() {
  const data = _interopRequireDefault(require("is-ci"));

  _isCi = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function url() {
  const data = _interopRequireWildcard(require("url"));

  url = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("../index");

  _index = function () {
    return data;
  };

  return data;
}

function _macroExpander() {
  const data = require("../util/macroExpander");

  _macroExpander = function () {
    return data;
  };

  return data;
}

function _updateInfoBuilder() {
  const data = require("./updateInfoBuilder");

  _updateInfoBuilder = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const publishForPrWarning = "There are serious security concerns with PUBLISH_FOR_PULL_REQUEST=true (see the  CircleCI documentation (https://circleci.com/docs/1.0/fork-pr-builds/) for details)" + "\nIf you have SSH keys, sensitive env vars or AWS credentials stored in your project settings and untrusted forks can make pull requests against your repo, then this option isn't for you.";
const debug = (0, _debug2.default)("electron-builder:publish");

function checkOptions(publishPolicy) {
  if (publishPolicy != null && publishPolicy !== "onTag" && publishPolicy !== "onTagOrDraft" && publishPolicy !== "always" && publishPolicy !== "never") {
    if (typeof publishPolicy === "string") {
      throw new (_builderUtil().InvalidConfigurationError)(`Expected one of "onTag", "onTagOrDraft", "always", "never", but got ${JSON.stringify(publishPolicy)}.\nPlease note that publish configuration should be specified under "config"`);
    }
  }
}

class PublishManager {
  constructor(packager, publishOptions, cancellationToken = packager.cancellationToken) {
    var _this = this;

    this.packager = packager;
    this.publishOptions = publishOptions;
    this.cancellationToken = cancellationToken;
    this.nameToPublisher = new Map();
    this.isPublish = false;
    this.progress = process.stdout.isTTY ? new (_multiProgress().MultiProgress)() : null;
    this.updateFileWriteTask = [];
    checkOptions(publishOptions.publish);
    this.taskManager = new (_builderUtil().AsyncTaskManager)(cancellationToken);
    const forcePublishForPr = process.env.PUBLISH_FOR_PULL_REQUEST === "true";

    if (!(0, _builderUtil().isPullRequest)() || forcePublishForPr) {
      if (publishOptions.publish === undefined) {
        if (process.env.npm_lifecycle_event === "release") {
          publishOptions.publish = "always";
        } else {
          const tag = (0, _electronPublish().getCiTag)();

          if (tag != null) {
            _builderUtil().log.info({
              reason: "tag is defined",
              tag
            }, "artifacts will be published");

            publishOptions.publish = "onTag";
          } else if (_isCi().default) {
            _builderUtil().log.info({
              reason: "CI detected"
            }, "artifacts will be published if draft release exists");

            publishOptions.publish = "onTagOrDraft";
          }
        }
      }

      const publishPolicy = publishOptions.publish;
      this.isPublish = publishPolicy != null && publishOptions.publish !== "never" && (publishPolicy !== "onTag" || (0, _electronPublish().getCiTag)() != null);

      if (this.isPublish && forcePublishForPr) {
        _builderUtil().log.warn(publishForPrWarning);
      }
    } else if (publishOptions.publish !== "never") {
      _builderUtil().log.info({
        reason: "current build is a part of pull request",
        solution: `set env PUBLISH_FOR_PULL_REQUEST to true to force code signing\n${publishForPrWarning}`
      }, "publishing will be skipped");
    }

    packager.addAfterPackHandler(
    /*#__PURE__*/
    function () {
      var _ref = (0, _bluebirdLst().coroutine)(function* (event) {
        const packager = event.packager;

        if (event.electronPlatformName === "darwin") {
          if (!event.targets.some(it => it.name === "dmg" || it.name === "zip")) {
            return;
          }
        } else if (packager.platform === _index().Platform.WINDOWS) {
          if (!event.targets.some(it => isSuitableWindowsTarget(it))) {
            return;
          }
        } else {
          // AppImage writes data to AppImage stage dir, not to linux-unpacked
          return;
        }

        const publishConfig = yield getAppUpdatePublishConfiguration(packager, event.arch, _this.isPublish);

        if (publishConfig != null) {
          yield (0, _fsExtraP().writeFile)(path.join(packager.getResourcesDir(event.appOutDir), "app-update.yml"), (0, _builderUtil().serializeToYaml)(publishConfig));
        }
      });

      return function (_x) {
        return _ref.apply(this, arguments);
      };
    }());
    packager.artifactCreated(event => {
      const publishConfiguration = event.publishConfig;

      if (publishConfiguration == null) {
        this.taskManager.addTask(this.artifactCreatedWithoutExplicitPublishConfig(event));
      } else if (this.isPublish) {
        if (debug.enabled) {
          debug(`artifactCreated (isPublish: ${this.isPublish}): ${(0, _builderUtil().safeStringifyJson)(event, new Set(["packager"]))},\n  publishConfig: ${(0, _builderUtil().safeStringifyJson)(publishConfiguration)}`);
        }

        this.scheduleUpload(publishConfiguration, event, this.getAppInfo(event.packager));
      }
    });
  }

  getAppInfo(platformPackager) {
    return platformPackager == null ? this.packager.appInfo : platformPackager.appInfo;
  }

  getGlobalPublishConfigurations() {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const publishers = _this2.packager.config.publish;
      return yield resolvePublishConfigurations(publishers, null, _this2.packager, null, true);
    })();
  }
  /** @internal */


  scheduleUpload(publishConfig, event, appInfo) {
    if (publishConfig.provider === "generic") {
      return;
    }

    const publisher = this.getOrCreatePublisher(publishConfig, appInfo);

    if (publisher == null) {
      _builderUtil().log.debug({
        file: event.file,
        reason: "publisher is null",
        publishConfig: (0, _builderUtil().safeStringifyJson)(publishConfig)
      }, "not published");

      return;
    }

    const providerName = publisher.providerName;

    if (this.publishOptions.publish === "onTagOrDraft" && (0, _electronPublish().getCiTag)() == null && !(providerName === "GitHub" || providerName === "Bintray")) {
      _builderUtil().log.info({
        file: event.file,
        reason: "current build is not for a git tag",
        publishPolicy: "onTagOrDraft"
      }, `not published to ${providerName}`);

      return;
    }

    this.taskManager.addTask(publisher.upload(event));
  }

  artifactCreatedWithoutExplicitPublishConfig(event) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const platformPackager = event.packager;
      const target = event.target;
      const publishConfigs = yield getPublishConfigs(platformPackager, target == null ? null : target.options, event.arch, _this3.isPublish);

      if (debug.enabled) {
        debug(`artifactCreated (isPublish: ${_this3.isPublish}): ${(0, _builderUtil().safeStringifyJson)(event, new Set(["packager"]))},\n  publishConfigs: ${(0, _builderUtil().safeStringifyJson)(publishConfigs)}`);
      }

      const eventFile = event.file;

      if (publishConfigs == null) {
        if (_this3.isPublish) {
          _builderUtil().log.debug({
            file: eventFile,
            reason: "no publish configs"
          }, "not published");
        }

        return;
      }

      if (_this3.isPublish) {
        for (const publishConfig of publishConfigs) {
          if (_this3.cancellationToken.cancelled) {
            _builderUtil().log.debug({
              file: event.file,
              reason: "cancelled"
            }, "not published");

            break;
          }

          _this3.scheduleUpload(publishConfig, event, _this3.getAppInfo(platformPackager));
        }
      }

      if (event.isWriteUpdateInfo && target != null && eventFile != null && !_this3.cancellationToken.cancelled && (platformPackager.platform !== _index().Platform.WINDOWS || isSuitableWindowsTarget(target))) {
        _this3.taskManager.addTask((0, _updateInfoBuilder().createUpdateInfoTasks)(event, publishConfigs).then(it => _this3.updateFileWriteTask.push(...it)));
      }
    })();
  }

  getOrCreatePublisher(publishConfig, appInfo) {
    // to not include token into cache key
    const providerCacheKey = (0, _builderUtil().safeStringifyJson)(publishConfig);
    let publisher = this.nameToPublisher.get(providerCacheKey);

    if (publisher == null) {
      publisher = createPublisher(this, appInfo.version, publishConfig, this.publishOptions, this.packager);
      this.nameToPublisher.set(providerCacheKey, publisher);

      _builderUtil().log.info({
        publisher: publisher.toString()
      }, "publishing");
    }

    return publisher;
  } // noinspection JSUnusedGlobalSymbols


  cancelTasks() {
    this.taskManager.cancelTasks();
    this.nameToPublisher.clear();
  }

  awaitTasks() {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield _this4.taskManager.awaitTasks();
      const updateInfoFileTasks = _this4.updateFileWriteTask;

      if (_this4.cancellationToken.cancelled || updateInfoFileTasks.length === 0) {
        return;
      }

      yield (0, _updateInfoBuilder().writeUpdateInfoFiles)(updateInfoFileTasks, _this4.packager);
      yield _this4.taskManager.awaitTasks();
    })();
  }

}

exports.PublishManager = PublishManager;

function getAppUpdatePublishConfiguration(_x2, _x3, _x4) {
  return _getAppUpdatePublishConfiguration.apply(this, arguments);
}

function _getAppUpdatePublishConfiguration() {
  _getAppUpdatePublishConfiguration = (0, _bluebirdLst().coroutine)(function* (packager, arch, errorIfCannot) {
    const publishConfigs = yield getPublishConfigsForUpdateInfo(packager, (yield getPublishConfigs(packager, null, arch, errorIfCannot)), arch);

    if (publishConfigs == null || publishConfigs.length === 0) {
      return null;
    }

    const publishConfig = Object.assign({}, publishConfigs[0], {
      updaterCacheDirName: packager.appInfo.updaterCacheDirName
    });

    if (packager.platform === _index().Platform.WINDOWS && publishConfig.publisherName == null) {
      const winPackager = packager;
      const publisherName = winPackager.isForceCodeSigningVerification ? yield winPackager.computedPublisherName.value : undefined;

      if (publisherName != null) {
        publishConfig.publisherName = publisherName;
      }
    }

    return publishConfig;
  });
  return _getAppUpdatePublishConfiguration.apply(this, arguments);
}

function getPublishConfigsForUpdateInfo(_x5, _x6, _x7) {
  return _getPublishConfigsForUpdateInfo.apply(this, arguments);
}

function _getPublishConfigsForUpdateInfo() {
  _getPublishConfigsForUpdateInfo = (0, _bluebirdLst().coroutine)(function* (packager, publishConfigs, arch) {
    if (publishConfigs === null) {
      return null;
    }

    if (publishConfigs.length === 0) {
      _builderUtil().log.debug(null, "getPublishConfigsForUpdateInfo: no publishConfigs, detect using repository info"); // https://github.com/electron-userland/electron-builder/issues/925#issuecomment-261732378
      // default publish config is github, file should be generated regardless of publish state (user can test installer locally or manage the release process manually)


      const repositoryInfo = yield packager.info.repositoryInfo;
      debug(`getPublishConfigsForUpdateInfo: ${(0, _builderUtil().safeStringifyJson)(repositoryInfo)}`);

      if (repositoryInfo != null && repositoryInfo.type === "github") {
        const resolvedPublishConfig = yield getResolvedPublishConfig(packager, packager.info, {
          provider: repositoryInfo.type
        }, arch, false);

        if (resolvedPublishConfig != null) {
          debug(`getPublishConfigsForUpdateInfo: resolve to publish config ${(0, _builderUtil().safeStringifyJson)(resolvedPublishConfig)}`);
          return [resolvedPublishConfig];
        }
      }
    }

    return publishConfigs;
  });
  return _getPublishConfigsForUpdateInfo.apply(this, arguments);
}

function createPublisher(context, version, publishConfig, options, packager) {
  if (debug.enabled) {
    debug(`Create publisher: ${(0, _builderUtil().safeStringifyJson)(publishConfig)}`);
  }

  const provider = publishConfig.provider;

  switch (provider) {
    case "github":
      return new (_gitHubPublisher().GitHubPublisher)(context, publishConfig, version, options);

    case "bintray":
      return new (_BintrayPublisher().BintrayPublisher)(context, publishConfig, version, options);

    case "generic":
      return null;

    default:
      const clazz = requireProviderClass(provider, packager);
      return clazz == null ? null : new clazz(context, publishConfig);
  }
}

function requireProviderClass(provider, packager) {
  switch (provider) {
    case "github":
      return _gitHubPublisher().GitHubPublisher;

    case "bintray":
      return _BintrayPublisher().BintrayPublisher;

    case "generic":
      return null;

    case "s3":
      return _s3Publisher().default;

    case "spaces":
      return _spacesPublisher().default;

    default:
      const name = `electron-publisher-${provider}`;
      let module = null;

      try {
        module = require(path.join(packager.buildResourcesDir, name + ".js"));
      } catch (ignored) {
        console.log(ignored);
      }

      if (module == null) {
        module = require(name);
      }

      return module.default || module;
  }
}

function computeDownloadUrl(publishConfiguration, fileName, packager) {
  if (publishConfiguration.provider === "generic") {
    const baseUrlString = publishConfiguration.url;

    if (fileName == null) {
      return baseUrlString;
    }

    const baseUrl = url().parse(baseUrlString);
    return url().format(Object.assign({}, baseUrl, {
      pathname: path.posix.resolve(baseUrl.pathname || "/", encodeURI(fileName))
    }));
  }

  let baseUrl;

  if (publishConfiguration.provider === "github") {
    const gh = publishConfiguration;
    baseUrl = `${(0, _builderUtilRuntime().githubUrl)(gh)}/${gh.owner}/${gh.repo}/releases/download/${gh.vPrefixedTagName === false ? "" : "v"}${packager.appInfo.version}`;
  } else {
    baseUrl = (0, _builderUtilRuntime().getS3LikeProviderBaseUrl)(publishConfiguration);
  }

  if (fileName == null) {
    return baseUrl;
  }

  return `${baseUrl}/${encodeURI(fileName)}`;
}

function getPublishConfigs(_x8, _x9, _x10, _x11) {
  return _getPublishConfigs.apply(this, arguments);
}

function _getPublishConfigs() {
  _getPublishConfigs = (0, _bluebirdLst().coroutine)(function* (platformPackager, targetSpecificOptions, arch, errorIfCannot) {
    let publishers; // check build.nsis (target)

    if (targetSpecificOptions != null) {
      publishers = targetSpecificOptions.publish; // if explicitly set to null - do not publish

      if (publishers === null) {
        return null;
      }
    } // check build.win (platform)


    if (publishers == null) {
      publishers = platformPackager.platformSpecificBuildOptions.publish;

      if (publishers === null) {
        return null;
      }
    }

    if (publishers == null) {
      publishers = platformPackager.config.publish;

      if (publishers === null) {
        return null;
      }
    }

    return yield resolvePublishConfigurations(publishers, platformPackager, platformPackager.info, arch, errorIfCannot);
  });
  return _getPublishConfigs.apply(this, arguments);
}

function resolvePublishConfigurations(_x12, _x13, _x14, _x15, _x16) {
  return _resolvePublishConfigurations.apply(this, arguments);
}

function _resolvePublishConfigurations() {
  _resolvePublishConfigurations = (0, _bluebirdLst().coroutine)(function* (publishers, platformPackager, packager, arch, errorIfCannot) {
    if (publishers == null) {
      let serviceName = null;

      if (!(0, _builderUtil().isEmptyOrSpaces)(process.env.GH_TOKEN) || !(0, _builderUtil().isEmptyOrSpaces)(process.env.GITHUB_TOKEN)) {
        serviceName = "github";
      } else if (!(0, _builderUtil().isEmptyOrSpaces)(process.env.BT_TOKEN)) {
        serviceName = "bintray";
      }

      if (serviceName != null) {
        _builderUtil().log.debug(null, `Detect ${serviceName} as publish provider`);

        return [yield getResolvedPublishConfig(platformPackager, packager, {
          provider: serviceName
        }, arch, errorIfCannot)];
      }
    }

    if (publishers == null) {
      return [];
    }

    debug(`Explicit publish provider: ${(0, _builderUtil().safeStringifyJson)(publishers)}`);
    return yield _bluebirdLst().default.map((0, _builderUtil().asArray)(publishers), it => getResolvedPublishConfig(platformPackager, packager, typeof it === "string" ? {
      provider: it
    } : it, arch, errorIfCannot));
  });
  return _resolvePublishConfigurations.apply(this, arguments);
}

function isSuitableWindowsTarget(target) {
  if (target.name === "appx" && target.options != null && target.options.electronUpdaterAware) {
    return true;
  }

  return target.name === "nsis" || target.name.startsWith("nsis-");
}

function expandPublishConfig(options, platformPackager, packager, arch) {
  for (const name of Object.keys(options)) {
    const value = options[name];

    if (typeof value === "string") {
      const archValue = arch == null ? null : _builderUtil().Arch[arch];
      const expanded = platformPackager == null ? (0, _macroExpander().expandMacro)(value, archValue, packager.appInfo) : platformPackager.expandMacro(value, archValue);

      if (expanded !== value) {
        options[name] = expanded;
      }
    }
  }
}

function isDetectUpdateChannel(platformSpecificConfiguration, configuration) {
  const value = platformSpecificConfiguration == null ? null : platformSpecificConfiguration.detectUpdateChannel;
  return value == null ? configuration.detectUpdateChannel !== false : value;
}

function getResolvedPublishConfig(_x17, _x18, _x19, _x20, _x21) {
  return _getResolvedPublishConfig.apply(this, arguments);
} function _getResolvedPublishConfig() {
  _getResolvedPublishConfig = (0, _bluebirdLst().coroutine)(function* (platformPackager, packager, options, arch, errorIfCannot) {
    options = Object.assign({}, options);
    expandPublishConfig(options, platformPackager, packager, arch);
    let channelFromAppVersion = null;

    if (options.channel == null && isDetectUpdateChannel(platformPackager == null ? null : platformPackager.platformSpecificBuildOptions, packager.config)) {
      channelFromAppVersion = packager.appInfo.channel;
    }

    const provider = options.provider;

    if (provider === "generic") {
      const o = options;

      if (o.url == null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Please specify "url" for "generic" update server`);
      }

      if (channelFromAppVersion != null) {
        o.channel = channelFromAppVersion;
      }

      return options;
    }

    const providerClass = requireProviderClass(options.provider, packager);

    if (providerClass != null && providerClass.checkAndResolveOptions != null) {
      yield providerClass.checkAndResolveOptions(options, channelFromAppVersion, errorIfCannot);
      return options;
    }

    const isGithub = provider === "github";

    if (!isGithub && provider !== "bintray") {
      return options;
    }

    let owner = isGithub ? options.owner : options.owner;
    let project = isGithub ? options.repo : options.package;

    if (isGithub && owner == null && project != null) {
      const index = project.indexOf("/");

      if (index > 0) {
        const repo = project;
        project = repo.substring(0, index);
        owner = repo.substring(index + 1);
      }
    }

    function getInfo() {
      return _getInfo.apply(this, arguments);
    }

    function _getInfo() {
      _getInfo = (0, _bluebirdLst().coroutine)(function* () {
        const info = yield packager.repositoryInfo;

        if (info != null) {
          return info;
        }

        const message = `Cannot detect repository by .git/config. Please specify "repository" in the package.json (https://docs.npmjs.com/files/package.json#repository).\nPlease see https://electron.build/configuration/publish`;

        if (errorIfCannot) {
          throw new Error(message);
        } else {
          _builderUtil().log.warn(message);

          return null;
        }
      });
      return _getInfo.apply(this, arguments);
    }

    if (!owner || !project) {
      _builderUtil().log.debug({
        reason: "owner or project is not specified explicitly",
        provider,
        owner,
        project
      }, "calling getInfo");

      const info = yield getInfo();

      if (info == null) {
        return null;
      }

      if (!owner) {
        owner = info.user;
      }

      if (!project) {
        project = info.project;
      }
    }

    if (isGithub) {
      if (options.token != null && !options.private) {
        _builderUtil().log.warn('"token" specified in the github publish options. It should be used only for [setFeedURL](module:electron-updater/out/AppUpdater.AppUpdater+setFeedURL).');
      } //tslint:disable-next-line:no-object-literal-type-assertion


      return Object.assign({
        owner,
        repo: project
      }, options);
    } else {
      //tslint:disable-next-line:no-object-literal-type-assertion
      return Object.assign({
        owner,
        package: project
      }, options);
    }
  });
  return _getResolvedPublishConfig.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=PublishManager.js.map{"version":3,"sources":["../../src/publish/PublishManager.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, asArray, AsyncTaskManager, InvalidConfigurationError, isEmptyOrSpaces, isPullRequest, log, safeStringifyJson, serializeToYaml } from \"builder-util\"\nimport { BintrayOptions, CancellationToken, GenericServerOptions, getS3LikeProviderBaseUrl, GithubOptions, githubUrl, PublishConfiguration, PublishProvider } from \"builder-util-runtime\"\nimport _debug from \"debug\"\nimport { getCiTag, PublishContext, Publisher, PublishOptions, UploadTask } from \"electron-publish\"\nimport { BintrayPublisher } from \"electron-publish/out/BintrayPublisher\"\nimport { GitHubPublisher } from \"electron-publish/out/gitHubPublisher\"\nimport { MultiProgress } from \"electron-publish/out/multiProgress\"\nimport S3Publisher from \"electron-publish/out/s3/s3Publisher\"\nimport SpacesPublisher from \"electron-publish/out/s3/spacesPublisher\"\nimport { writeFile } from \"fs-extra-p\"\nimport isCi from \"is-ci\"\nimport * as path from \"path\"\nimport { WriteStream as TtyWriteStream } from \"tty\"\nimport * as url from \"url\"\nimport { AppInfo, ArtifactCreated, Configuration, Platform, PlatformSpecificBuildOptions, Target } from \"../index\"\nimport { Packager } from \"../packager\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { expandMacro } from \"../util/macroExpander\"\nimport { WinPackager } from \"../winPackager\"\nimport { createUpdateInfoTasks, UpdateInfoFileTask, writeUpdateInfoFiles } from \"./updateInfoBuilder\"\n\nconst publishForPrWarning = \"There are serious security concerns with PUBLISH_FOR_PULL_REQUEST=true (see the  CircleCI documentation (https://circleci.com/docs/1.0/fork-pr-builds/) for details)\" +\n  \"\\nIf you have SSH keys, sensitive env vars or AWS credentials stored in your project settings and untrusted forks can make pull requests against your repo, then this option isn't for you.\"\n\nconst debug = _debug(\"electron-builder:publish\")\n\nfunction checkOptions(publishPolicy: any) {\n  if (publishPolicy != null && publishPolicy !== \"onTag\" && publishPolicy !== \"onTagOrDraft\" && publishPolicy !== \"always\" && publishPolicy !== \"never\") {\n    if (typeof publishPolicy === \"string\") {\n      throw new InvalidConfigurationError(`Expected one of \"onTag\", \"onTagOrDraft\", \"always\", \"never\", but got ${JSON.stringify(publishPolicy)}.\\nPlease note that publish configuration should be specified under \"config\"`)\n    }\n  }\n}\n\nexport class PublishManager implements PublishContext {\n  private readonly nameToPublisher = new Map<string, Publisher | null>()\n\n  private readonly taskManager: AsyncTaskManager\n\n  readonly isPublish: boolean = false\n\n  readonly progress = (process.stdout as TtyWriteStream).isTTY ? new MultiProgress() : null\n\n  private readonly updateFileWriteTask: Array<UpdateInfoFileTask> = []\n\n  constructor(private readonly packager: Packager, private readonly publishOptions: PublishOptions, readonly cancellationToken: CancellationToken = packager.cancellationToken) {\n    checkOptions(publishOptions.publish)\n\n    this.taskManager = new AsyncTaskManager(cancellationToken)\n\n    const forcePublishForPr = process.env.PUBLISH_FOR_PULL_REQUEST === \"true\"\n    if (!isPullRequest() || forcePublishForPr) {\n      if (publishOptions.publish === undefined) {\n        if (process.env.npm_lifecycle_event === \"release\") {\n          publishOptions.publish = \"always\"\n        }\n        else {\n          const tag = getCiTag()\n          if (tag != null) {\n            log.info({reason: \"tag is defined\", tag}, \"artifacts will be published\")\n            publishOptions.publish = \"onTag\"\n          }\n          else if (isCi) {\n            log.info({reason: \"CI detected\"}, \"artifacts will be published if draft release exists\")\n            publishOptions.publish = \"onTagOrDraft\"\n          }\n        }\n      }\n\n      const publishPolicy = publishOptions.publish\n      this.isPublish = publishPolicy != null && publishOptions.publish !== \"never\" && (publishPolicy !== \"onTag\" || getCiTag() != null)\n      if (this.isPublish && forcePublishForPr) {\n        log.warn(publishForPrWarning)\n      }\n    }\n    else if (publishOptions.publish !== \"never\") {\n      log.info({\n        reason: \"current build is a part of pull request\",\n        solution: `set env PUBLISH_FOR_PULL_REQUEST to true to force code signing\\n${publishForPrWarning}`,\n      }, \"publishing will be skipped\")\n    }\n\n    packager.addAfterPackHandler(async event => {\n      const packager = event.packager\n      if (event.electronPlatformName === \"darwin\") {\n        if (!event.targets.some(it => it.name === \"dmg\" || it.name === \"zip\")) {\n          return\n        }\n      }\n      else if (packager.platform === Platform.WINDOWS) {\n        if (!event.targets.some(it => isSuitableWindowsTarget(it))) {\n          return\n        }\n      }\n      else {\n        // AppImage writes data to AppImage stage dir, not to linux-unpacked\n        return\n      }\n\n      const publishConfig = await getAppUpdatePublishConfiguration(packager, event.arch, this.isPublish)\n      if (publishConfig != null) {\n        await writeFile(path.join(packager.getResourcesDir(event.appOutDir), \"app-update.yml\"), serializeToYaml(publishConfig))\n      }\n    })\n\n    packager.artifactCreated(event => {\n      const publishConfiguration = event.publishConfig\n      if (publishConfiguration == null) {\n        this.taskManager.addTask(this.artifactCreatedWithoutExplicitPublishConfig(event))\n      }\n      else if (this.isPublish) {\n        if (debug.enabled) {\n          debug(`artifactCreated (isPublish: ${this.isPublish}): ${safeStringifyJson(event, new Set([\"packager\"]))},\\n  publishConfig: ${safeStringifyJson(publishConfiguration)}`)\n        }\n        this.scheduleUpload(publishConfiguration, event, this.getAppInfo(event.packager))\n      }\n    })\n  }\n\n  private getAppInfo(platformPackager: PlatformPackager<any> | null) {\n    return platformPackager == null ? this.packager.appInfo : platformPackager.appInfo\n  }\n\n  async getGlobalPublishConfigurations(): Promise<Array<PublishConfiguration> | null> {\n    const publishers = this.packager.config.publish\n    return await resolvePublishConfigurations(publishers, null, this.packager, null, true)\n  }\n\n  /** @internal */\n  scheduleUpload(publishConfig: PublishConfiguration, event: UploadTask, appInfo: AppInfo): void {\n    if (publishConfig.provider === \"generic\") {\n      return\n    }\n\n    const publisher = this.getOrCreatePublisher(publishConfig, appInfo)\n    if (publisher == null) {\n      log.debug({\n        file: event.file,\n        reason: \"publisher is null\",\n        publishConfig: safeStringifyJson(publishConfig),\n      }, \"not published\")\n      return\n    }\n\n    const providerName = publisher.providerName\n    if (this.publishOptions.publish === \"onTagOrDraft\" && getCiTag() == null && !(providerName === \"GitHub\" || providerName === \"Bintray\")) {\n      log.info({file: event.file, reason: \"current build is not for a git tag\", publishPolicy: \"onTagOrDraft\"}, `not published to ${providerName}`)\n      return\n    }\n\n    this.taskManager.addTask(publisher.upload(event))\n  }\n\n  private async artifactCreatedWithoutExplicitPublishConfig(event: ArtifactCreated) {\n    const platformPackager = event.packager\n    const target = event.target\n    const publishConfigs = await getPublishConfigs(platformPackager, target == null ? null : target.options, event.arch, this.isPublish)\n\n    if (debug.enabled) {\n      debug(`artifactCreated (isPublish: ${this.isPublish}): ${safeStringifyJson(event, new Set([\"packager\"]))},\\n  publishConfigs: ${safeStringifyJson(publishConfigs)}`)\n    }\n\n    const eventFile = event.file\n    if (publishConfigs == null) {\n      if (this.isPublish) {\n        log.debug({file: eventFile, reason: \"no publish configs\"}, \"not published\")\n      }\n      return\n    }\n\n    if (this.isPublish) {\n      for (const publishConfig of publishConfigs) {\n        if (this.cancellationToken.cancelled) {\n          log.debug({file: event.file, reason: \"cancelled\"}, \"not published\")\n          break\n        }\n\n        this.scheduleUpload(publishConfig, event, this.getAppInfo(platformPackager))\n      }\n    }\n\n    if (event.isWriteUpdateInfo && target != null && eventFile != null &&\n      !this.cancellationToken.cancelled &&\n      (platformPackager.platform !== Platform.WINDOWS || isSuitableWindowsTarget(target))) {\n      this.taskManager.addTask(createUpdateInfoTasks(event, publishConfigs).then(it => this.updateFileWriteTask.push(...it)))\n    }\n  }\n\n  private getOrCreatePublisher(publishConfig: PublishConfiguration, appInfo: AppInfo): Publisher | null {\n    // to not include token into cache key\n    const providerCacheKey = safeStringifyJson(publishConfig)\n    let publisher = this.nameToPublisher.get(providerCacheKey)\n    if (publisher == null) {\n      publisher = createPublisher(this, appInfo.version, publishConfig, this.publishOptions, this.packager)\n      this.nameToPublisher.set(providerCacheKey, publisher)\n      log.info({publisher: publisher!!.toString()}, \"publishing\")\n    }\n    return publisher\n  }\n\n  // noinspection JSUnusedGlobalSymbols\n  cancelTasks() {\n    this.taskManager.cancelTasks()\n    this.nameToPublisher.clear()\n  }\n\n  async awaitTasks(): Promise<void> {\n    await this.taskManager.awaitTasks()\n\n    const updateInfoFileTasks = this.updateFileWriteTask\n    if (this.cancellationToken.cancelled || updateInfoFileTasks.length === 0) {\n      return\n    }\n\n    await writeUpdateInfoFiles(updateInfoFileTasks, this.packager)\n    await this.taskManager.awaitTasks()\n  }\n}\n\nexport async function getAppUpdatePublishConfiguration(packager: PlatformPackager<any>, arch: Arch, errorIfCannot: boolean) {\n  const publishConfigs = await getPublishConfigsForUpdateInfo(packager, await getPublishConfigs(packager, null, arch, errorIfCannot), arch)\n  if (publishConfigs == null || publishConfigs.length === 0) {\n    return null\n  }\n\n  const publishConfig = {\n    ...publishConfigs[0],\n    updaterCacheDirName: packager.appInfo.updaterCacheDirName,\n  }\n\n  if (packager.platform === Platform.WINDOWS && publishConfig.publisherName == null) {\n    const winPackager = packager as WinPackager\n    const publisherName = winPackager.isForceCodeSigningVerification ? await winPackager.computedPublisherName.value : undefined\n    if (publisherName != null) {\n      publishConfig.publisherName = publisherName\n    }\n  }\n  return publishConfig\n}\n\nexport async function getPublishConfigsForUpdateInfo(packager: PlatformPackager<any>, publishConfigs: Array<PublishConfiguration> | null, arch: Arch | null): Promise<Array<PublishConfiguration> | null> {\n  if (publishConfigs === null) {\n    return null\n  }\n\n  if (publishConfigs.length === 0) {\n    log.debug(null, \"getPublishConfigsForUpdateInfo: no publishConfigs, detect using repository info\")\n    // https://github.com/electron-userland/electron-builder/issues/925#issuecomment-261732378\n    // default publish config is github, file should be generated regardless of publish state (user can test installer locally or manage the release process manually)\n    const repositoryInfo = await packager.info.repositoryInfo\n    debug(`getPublishConfigsForUpdateInfo: ${safeStringifyJson(repositoryInfo)}`)\n    if (repositoryInfo != null && repositoryInfo.type === \"github\") {\n      const resolvedPublishConfig = await getResolvedPublishConfig(packager, packager.info, {provider: repositoryInfo.type}, arch, false)\n      if (resolvedPublishConfig != null) {\n        debug(`getPublishConfigsForUpdateInfo: resolve to publish config ${safeStringifyJson(resolvedPublishConfig)}`)\n        return [resolvedPublishConfig]\n      }\n    }\n  }\n  return publishConfigs\n}\n\nexport function createPublisher(context: PublishContext, version: string, publishConfig: PublishConfiguration, options: PublishOptions, packager: Packager): Publisher | null {\n  if (debug.enabled) {\n    debug(`Create publisher: ${safeStringifyJson(publishConfig)}`)\n  }\n\n  const provider = publishConfig.provider\n  switch (provider) {\n    case \"github\":\n      return new GitHubPublisher(context, publishConfig as GithubOptions, version, options)\n\n    case \"bintray\":\n      return new BintrayPublisher(context, publishConfig as BintrayOptions, version, options)\n\n    case \"generic\":\n      return null\n\n    default:\n      const clazz = requireProviderClass(provider, packager)\n      return clazz == null ? null : new clazz(context, publishConfig)\n  }\n}\n\nfunction requireProviderClass(provider: string, packager: Packager): any | null {\n  switch (provider) {\n    case \"github\":\n      return GitHubPublisher\n\n    case \"bintray\":\n      return BintrayPublisher\n\n    case \"generic\":\n      return null\n\n    case \"s3\":\n      return S3Publisher\n\n    case \"spaces\":\n      return SpacesPublisher\n\n    default:\n      const name = `electron-publisher-${provider}`\n      let module: any = null\n      try {\n        module = require(path.join(packager.buildResourcesDir, name + \".js\"))\n      }\n      catch (ignored) {\n        console.log(ignored)\n      }\n\n      if (module == null) {\n        module = require(name)\n      }\n      return module.default || module\n  }\n}\n\nexport function computeDownloadUrl(publishConfiguration: PublishConfiguration, fileName: string | null, packager: PlatformPackager<any>) {\n  if (publishConfiguration.provider === \"generic\") {\n    const baseUrlString = (publishConfiguration as GenericServerOptions).url\n    if (fileName == null) {\n      return baseUrlString\n    }\n\n    const baseUrl = url.parse(baseUrlString)\n    return url.format({...baseUrl as url.UrlObject, pathname: path.posix.resolve(baseUrl.pathname || \"/\", encodeURI(fileName))})\n  }\n\n  let baseUrl\n  if (publishConfiguration.provider === \"github\") {\n    const gh = publishConfiguration as GithubOptions\n    baseUrl = `${githubUrl(gh)}/${gh.owner}/${gh.repo}/releases/download/${gh.vPrefixedTagName === false ? \"\" : \"v\"}${packager.appInfo.version}`\n  }\n  else {\n    baseUrl = getS3LikeProviderBaseUrl(publishConfiguration)\n  }\n\n  if (fileName == null) {\n    return baseUrl\n  }\n  return `${baseUrl}/${encodeURI(fileName)}`\n}\n\nexport async function getPublishConfigs(platformPackager: PlatformPackager<any>, targetSpecificOptions: PlatformSpecificBuildOptions | null | undefined, arch: Arch | null, errorIfCannot: boolean): Promise<Array<PublishConfiguration> | null> {\n  let publishers\n\n  // check build.nsis (target)\n  if (targetSpecificOptions != null) {\n    publishers = targetSpecificOptions.publish\n    // if explicitly set to null - do not publish\n    if (publishers === null) {\n      return null\n    }\n  }\n\n  // check build.win (platform)\n  if (publishers == null) {\n    publishers = platformPackager.platformSpecificBuildOptions.publish\n    if (publishers === null) {\n      return null\n    }\n  }\n\n  if (publishers == null) {\n    publishers = platformPackager.config.publish\n    if (publishers === null) {\n      return null\n    }\n  }\n  return await resolvePublishConfigurations(publishers, platformPackager, platformPackager.info, arch, errorIfCannot)\n}\n\nasync function resolvePublishConfigurations(publishers: any, platformPackager: PlatformPackager<any> | null, packager: Packager, arch: Arch | null, errorIfCannot: boolean): Promise<Array<PublishConfiguration> | null> {\n  if (publishers == null) {\n    let serviceName: PublishProvider | null = null\n    if (!isEmptyOrSpaces(process.env.GH_TOKEN) || !isEmptyOrSpaces(process.env.GITHUB_TOKEN)) {\n      serviceName = \"github\"\n    }\n    else if (!isEmptyOrSpaces(process.env.BT_TOKEN)) {\n      serviceName = \"bintray\"\n    }\n\n    if (serviceName != null) {\n      log.debug(null, `Detect ${serviceName} as publish provider`)\n      return [(await getResolvedPublishConfig(platformPackager, packager, {provider: serviceName}, arch, errorIfCannot))!]\n    }\n  }\n\n  if (publishers == null) {\n    return []\n  }\n\n  debug(`Explicit publish provider: ${safeStringifyJson(publishers)}`)\n  return await (BluebirdPromise.map(asArray(publishers), it => getResolvedPublishConfig(platformPackager, packager, typeof it === \"string\" ? {provider: it} : it, arch, errorIfCannot)) as Promise<Array<PublishConfiguration>>)\n}\n\nfunction isSuitableWindowsTarget(target: Target) {\n  if (target.name === \"appx\" && target.options != null && (target.options as any).electronUpdaterAware) {\n    return true\n  }\n  return target.name === \"nsis\" || target.name.startsWith(\"nsis-\")\n}\n\nfunction expandPublishConfig(options: any, platformPackager: PlatformPackager<any> | null, packager: Packager, arch: Arch | null): void {\n  for (const name of Object.keys(options)) {\n    const value = options[name]\n    if (typeof value === \"string\") {\n      const archValue = arch == null ? null : Arch[arch]\n      const expanded = platformPackager == null ? expandMacro(value, archValue, packager.appInfo) : platformPackager.expandMacro(value, archValue)\n      if (expanded !== value) {\n        options[name] = expanded\n      }\n    }\n  }\n}\n\nfunction isDetectUpdateChannel(platformSpecificConfiguration: PlatformSpecificBuildOptions | null, configuration: Configuration) {\n  const value = platformSpecificConfiguration == null ? null : platformSpecificConfiguration.detectUpdateChannel\n  return value == null ? configuration.detectUpdateChannel !== false : value\n}\n\nasync function getResolvedPublishConfig(platformPackager: PlatformPackager<any> | null, packager: Packager, options: PublishConfiguration, arch: Arch | null, errorIfCannot: boolean): Promise<PublishConfiguration | GithubOptions | BintrayOptions | null> {\n  options = {...options}\n  expandPublishConfig(options, platformPackager, packager, arch)\n\n  let channelFromAppVersion: string | null = null\n  if ((options as GenericServerOptions).channel == null && isDetectUpdateChannel(platformPackager == null ? null : platformPackager.platformSpecificBuildOptions, packager.config)) {\n    channelFromAppVersion = packager.appInfo.channel\n  }\n\n  const provider = options.provider\n  if (provider === \"generic\") {\n    const o = options as GenericServerOptions\n    if (o.url == null) {\n      throw new InvalidConfigurationError(`Please specify \"url\" for \"generic\" update server`)\n    }\n\n    if (channelFromAppVersion != null) {\n      (o as any).channel = channelFromAppVersion\n    }\n    return options\n  }\n\n  const providerClass = requireProviderClass(options.provider, packager)\n  if (providerClass != null && providerClass.checkAndResolveOptions != null) {\n    await providerClass.checkAndResolveOptions(options, channelFromAppVersion, errorIfCannot)\n    return options\n  }\n\n  const isGithub = provider === \"github\"\n  if (!isGithub && provider !== \"bintray\") {\n    return options\n  }\n\n  let owner = isGithub ? (options as GithubOptions).owner : (options as BintrayOptions).owner\n  let project = isGithub ? (options as GithubOptions).repo : (options as BintrayOptions).package\n\n  if (isGithub && owner == null && project != null) {\n    const index = project.indexOf(\"/\")\n    if (index > 0) {\n      const repo = project\n      project = repo.substring(0, index)\n      owner = repo.substring(index + 1)\n    }\n  }\n\n  async function getInfo() {\n    const info = await packager.repositoryInfo\n    if (info != null) {\n      return info\n    }\n\n    const message = `Cannot detect repository by .git/config. Please specify \"repository\" in the package.json (https://docs.npmjs.com/files/package.json#repository).\\nPlease see https://electron.build/configuration/publish`\n    if (errorIfCannot) {\n      throw new Error(message)\n    }\n    else {\n      log.warn(message)\n      return null\n    }\n  }\n\n  if (!owner || !project) {\n    log.debug({reason: \"owner or project is not specified explicitly\", provider, owner, project}, \"calling getInfo\")\n    const info = await getInfo()\n    if (info == null) {\n      return null\n    }\n\n    if (!owner) {\n      owner = info.user\n    }\n    if (!project) {\n      project = info.project\n    }\n  }\n\n  if (isGithub) {\n    if ((options as GithubOptions).token != null && !(options as GithubOptions).private) {\n      log.warn('\"token\" specified in the github publish options. It should be used only for [setFeedURL](module:electron-updater/out/AppUpdater.AppUpdater+setFeedURL).')\n    }\n    //tslint:disable-next-line:no-object-literal-type-assertion\n    return {owner, repo: project, ...options} as GithubOptions\n  }\n  else {\n    //tslint:disable-next-line:no-object-literal-type-assertion\n    return {owner, package: project, ...options} as BintrayOptions\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createUpdateInfoTasks = createUpdateInfoTasks;
exports.writeUpdateInfoFiles = writeUpdateInfoFiles;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function semver() {
  const data = _interopRequireWildcard(require("semver"));

  semver = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _hash() {
  const data = require("../util/hash");

  _hash = function () {
    return data;
  };

  return data;
}

function _PublishManager() {
  const data = require("./PublishManager");

  _PublishManager = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function getReleaseInfo(_x) {
  return _getReleaseInfo.apply(this, arguments);
}

function _getReleaseInfo() {
  _getReleaseInfo = (0, _bluebirdLst().coroutine)(function* (packager) {
    const releaseInfo = Object.assign({}, packager.platformSpecificBuildOptions.releaseInfo || packager.config.releaseInfo);

    if (releaseInfo.releaseNotes == null) {
      const releaseNotesFile = yield packager.getResource(releaseInfo.releaseNotesFile, `release-notes-${packager.platform.buildConfigurationKey}.md`, `release-notes-${packager.platform.name}.md`, `release-notes-${packager.platform.nodeName}.md`, "release-notes.md");
      const releaseNotes = releaseNotesFile == null ? null : yield (0, _fsExtraP().readFile)(releaseNotesFile, "utf-8"); // to avoid undefined in the file, check for null

      if (releaseNotes != null) {
        releaseInfo.releaseNotes = releaseNotes;
      }
    }

    delete releaseInfo.releaseNotesFile;
    return releaseInfo;
  });
  return _getReleaseInfo.apply(this, arguments);
}

function isGenerateUpdatesFilesForAllChannels(packager) {
  const value = packager.platformSpecificBuildOptions.generateUpdatesFilesForAllChannels;
  return value == null ? packager.config.generateUpdatesFilesForAllChannels : value;
}
/**
 if this is an "alpha" version, we need to generate only the "alpha" .yml file
 if this is a "beta" version, we need to generate both the "alpha" and "beta" .yml file
 if this is a "stable" version, we need to generate all the "alpha", "beta" and "stable" .yml file
 */


function computeChannelNames(packager, publishConfig) {
  const currentChannel = publishConfig.channel || "latest"; // for GitHub should be pre-release way be used

  if (currentChannel === "alpha" || publishConfig.provider === "github" || !isGenerateUpdatesFilesForAllChannels(packager)) {
    return [currentChannel];
  }

  switch (currentChannel) {
    case "beta":
      return [currentChannel, "alpha"];

    case "latest":
      return [currentChannel, "alpha", "beta"];

    default:
      return [currentChannel];
  }
}

function getUpdateInfoFileName(channel, packager, arch) {
  const osSuffix = packager.platform === _core().Platform.WINDOWS ? "" : `-${packager.platform.buildConfigurationKey}`;
  return `${channel}${osSuffix}${getArchPrefixForUpdateFile(arch, packager)}.yml`;
}

function getArchPrefixForUpdateFile(arch, packager) {
  if (arch == null || arch === _builderUtil().Arch.x64 || packager.platform !== _core().Platform.LINUX) {
    return "";
  }

  return arch === _builderUtil().Arch.armv7l ? "-arm" : `-${_builderUtil().Arch[arch]}`;
}

function computeIsisElectronUpdater1xCompatibility(updaterCompatibility, publishConfiguration, packager) {
  if (updaterCompatibility != null) {
    return semver().satisfies("1.0.0", updaterCompatibility);
  } // spaces is a new publish provider, no need to keep backward compatibility


  if (publishConfiguration.provider === "spaces") {
    return false;
  }

  const updaterVersion = packager.metadata.dependencies == null ? null : packager.metadata.dependencies["electron-updater"];
  return updaterVersion == null || semver().lt(updaterVersion, "4.0.0");
}
/** @internal */


function createUpdateInfoTasks(_x2, _x3) {
  return _createUpdateInfoTasks.apply(this, arguments);
}

function _createUpdateInfoTasks() {
  _createUpdateInfoTasks = (0, _bluebirdLst().coroutine)(function* (event, _publishConfigs) {
    const packager = event.packager;
    const publishConfigs = yield (0, _PublishManager().getPublishConfigsForUpdateInfo)(packager, _publishConfigs, event.arch);

    if (publishConfigs == null || publishConfigs.length === 0) {
      return [];
    }

    const outDir = event.target.outDir;
    const version = packager.appInfo.version;
    const sha2 = new (_lazyVal().Lazy)(() => (0, _hash().hashFile)(event.file, "sha256", "hex"));

    const isMac = packager.platform === _core().Platform.MAC;

    const createdFiles = new Set();
    const sharedInfo = yield createUpdateInfo(version, event, (yield getReleaseInfo(packager)));
    const tasks = [];
    const electronUpdaterCompatibility = packager.platformSpecificBuildOptions.electronUpdaterCompatibility || packager.config.electronUpdaterCompatibility || ">=2.15";

    for (const publishConfiguration of publishConfigs) {
      const isBintray = publishConfiguration.provider === "bintray";
      let dir = outDir; // Bintray uses different variant of channel file info, better to generate it to a separate dir by always

      if (isBintray || publishConfigs.length > 1 && publishConfiguration !== publishConfigs[0]) {
        dir = path.join(outDir, publishConfiguration.provider);
      }

      let isElectronUpdater1xCompatibility = computeIsisElectronUpdater1xCompatibility(electronUpdaterCompatibility, publishConfiguration, packager.info);
      let info = sharedInfo; // noinspection JSDeprecatedSymbols

      if (isElectronUpdater1xCompatibility && packager.platform === _core().Platform.WINDOWS) {
        info = Object.assign({}, info); // noinspection JSDeprecatedSymbols

        info.sha2 = yield sha2.value;
      }

      if (event.safeArtifactName != null && publishConfiguration.provider === "github") {
        const newFiles = info.files.slice();
        newFiles[0].url = event.safeArtifactName;
        info = Object.assign({}, info, {
          files: newFiles,
          path: event.safeArtifactName
        });
      }

      for (const channel of computeChannelNames(packager, publishConfiguration)) {
        if (isMac && isElectronUpdater1xCompatibility && event.file.endsWith(".zip")) {
          // write only for first channel (generateUpdatesFilesForAllChannels is a new functionality, no need to generate old mac update info file)
          isElectronUpdater1xCompatibility = false;
          yield writeOldMacInfo(publishConfiguration, outDir, dir, channel, createdFiles, version, packager);
        }

        const updateInfoFile = path.join(dir, (isBintray ? `${version}_` : "") + getUpdateInfoFileName(channel, packager, event.arch));

        if (createdFiles.has(updateInfoFile)) {
          continue;
        }

        createdFiles.add(updateInfoFile); // artifact should be uploaded only to designated publish provider

        tasks.push({
          file: updateInfoFile,
          info,
          publishConfiguration,
          packager
        });
      }
    }

    return tasks;
  });
  return _createUpdateInfoTasks.apply(this, arguments);
}

function createUpdateInfo(_x4, _x5, _x6) {
  return _createUpdateInfo.apply(this, arguments);
}

function _createUpdateInfo() {
  _createUpdateInfo = (0, _bluebirdLst().coroutine)(function* (version, event, releaseInfo) {
    const customUpdateInfo = event.updateInfo;
    const url = path.basename(event.file);
    const sha512 = (customUpdateInfo == null ? null : customUpdateInfo.sha512) || (yield (0, _hash().hashFile)(event.file));
    const files = [{
      url,
      sha512
    }];
    const result = Object.assign({
      version,
      files,
      path: url
      /* backward compatibility, electron-updater 1.x - electron-updater 2.15.0 */
      ,
      sha512
      /* backward compatibility, electron-updater 1.x - electron-updater 2.15.0 */

    }, releaseInfo);

    if (customUpdateInfo != null) {
      // file info or nsis web installer packages info
      Object.assign("sha512" in customUpdateInfo ? files[0] : result, customUpdateInfo);
    }

    return result;
  });
  return _createUpdateInfo.apply(this, arguments);
}

function writeUpdateInfoFiles(_x7, _x8) {
  return _writeUpdateInfoFiles.apply(this, arguments);
} // backward compatibility - write json file


function _writeUpdateInfoFiles() {
  _writeUpdateInfoFiles = (0, _bluebirdLst().coroutine)(function* (updateInfoFileTasks, packager) {
    // zip must be first and zip info must be used for old path/sha512 properties in the update info
    updateInfoFileTasks.sort((a, b) => (a.info.files[0].url.endsWith(".zip") ? 0 : 100) - (b.info.files[0].url.endsWith(".zip") ? 0 : 100));
    const updateChannelFileToInfo = new Map();

    for (const task of updateInfoFileTasks) {
      // https://github.com/electron-userland/electron-builder/pull/2994
      const key = `${task.file}@${(0, _builderUtil().safeStringifyJson)(task.publishConfiguration, new Set(["releaseType"]))}`;
      const existingTask = updateChannelFileToInfo.get(key);

      if (existingTask == null) {
        updateChannelFileToInfo.set(key, task);
        continue;
      }

      existingTask.info.files.push(...task.info.files);
    }

    const releaseDate = new Date().toISOString();
    yield _bluebirdLst().default.map(updateChannelFileToInfo.values(),
    /*#__PURE__*/
    function () {
      var _ref = (0, _bluebirdLst().coroutine)(function* (task) {
        const publishConfig = task.publishConfiguration;

        if (publishConfig.publishAutoUpdate === false) {
          _builderUtil().log.debug({
            provider: publishConfig.provider,
            reason: "publishAutoUpdate is set to false"
          }, "auto update metadata file not published");

          return;
        }

        if (task.info.releaseDate == null) {
          task.info.releaseDate = releaseDate;
        }

        const fileContent = Buffer.from((0, _builderUtil().serializeToYaml)(task.info, false, true));
        yield (0, _fsExtraP().outputFile)(task.file, fileContent);
        packager.dispatchArtifactCreated({
          file: task.file,
          fileContent,
          arch: null,
          packager: task.packager,
          target: null,
          publishConfig
        });
      });

      return function (_x16) {
        return _ref.apply(this, arguments);
      };
    }(), {
      concurrency: 4
    });
  });
  return _writeUpdateInfoFiles.apply(this, arguments);
}

function writeOldMacInfo(_x9, _x10, _x11, _x12, _x13, _x14, _x15) {
  return _writeOldMacInfo.apply(this, arguments);
} function _writeOldMacInfo() {
  _writeOldMacInfo = (0, _bluebirdLst().coroutine)(function* (publishConfig, outDir, dir, channel, createdFiles, version, packager) {
    const isGitHub = publishConfig.provider === "github";
    const updateInfoFile = isGitHub && outDir === dir ? path.join(dir, "github", `${channel}-mac.json`) : path.join(dir, `${channel}-mac.json`);

    if (!createdFiles.has(updateInfoFile)) {
      createdFiles.add(updateInfoFile);
      yield (0, _fsExtraP().outputJson)(updateInfoFile, {
        version,
        releaseDate: new Date().toISOString(),
        url: (0, _PublishManager().computeDownloadUrl)(publishConfig, packager.generateName2("zip", "mac", isGitHub), packager)
      }, {
        spaces: 2
      });
      packager.info.dispatchArtifactCreated({
        file: updateInfoFile,
        arch: null,
        packager,
        target: null,
        publishConfig
      });
    }
  });
  return _writeOldMacInfo.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=updateInfoBuilder.js.map{"version":3,"sources":["../../src/publish/updateInfoBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { Arch, log, safeStringifyJson, serializeToYaml } from \"builder-util\"\nimport { GenericServerOptions, PublishConfiguration, UpdateInfo, WindowsUpdateInfo } from \"builder-util-runtime\"\nimport { outputFile, outputJson, readFile } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport * as semver from \"semver\"\nimport { ReleaseInfo } from \"..\"\nimport { Platform } from \"../core\"\nimport { Packager } from \"../packager\"\nimport { ArtifactCreated } from \"../packagerApi\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { hashFile } from \"../util/hash\"\nimport { computeDownloadUrl, getPublishConfigsForUpdateInfo } from \"./PublishManager\"\n\nasync function getReleaseInfo(packager: PlatformPackager<any>) {\n  const releaseInfo: ReleaseInfo = {...(packager.platformSpecificBuildOptions.releaseInfo || packager.config.releaseInfo)}\n  if (releaseInfo.releaseNotes == null) {\n    const releaseNotesFile = await packager.getResource(releaseInfo.releaseNotesFile, `release-notes-${packager.platform.buildConfigurationKey}.md`, `release-notes-${packager.platform.name}.md`, `release-notes-${packager.platform.nodeName}.md`, \"release-notes.md\")\n    const releaseNotes = releaseNotesFile == null ? null : await readFile(releaseNotesFile, \"utf-8\")\n    // to avoid undefined in the file, check for null\n    if (releaseNotes != null) {\n      releaseInfo.releaseNotes = releaseNotes\n    }\n  }\n  delete releaseInfo.releaseNotesFile\n  return releaseInfo\n}\n\nfunction isGenerateUpdatesFilesForAllChannels(packager: PlatformPackager<any>) {\n  const value = packager.platformSpecificBuildOptions.generateUpdatesFilesForAllChannels\n  return value == null ? packager.config.generateUpdatesFilesForAllChannels : value\n}\n\n/**\n if this is an \"alpha\" version, we need to generate only the \"alpha\" .yml file\n if this is a \"beta\" version, we need to generate both the \"alpha\" and \"beta\" .yml file\n if this is a \"stable\" version, we need to generate all the \"alpha\", \"beta\" and \"stable\" .yml file\n */\nfunction computeChannelNames(packager: PlatformPackager<any>, publishConfig: PublishConfiguration): Array<string> {\n  const currentChannel: string = (publishConfig as GenericServerOptions).channel || \"latest\"\n  // for GitHub should be pre-release way be used\n  if (currentChannel === \"alpha\" || publishConfig.provider === \"github\" || !isGenerateUpdatesFilesForAllChannels(packager)) {\n    return [currentChannel]\n  }\n\n  switch (currentChannel) {\n    case \"beta\":\n      return [currentChannel, \"alpha\"]\n\n    case \"latest\":\n      return [currentChannel, \"alpha\", \"beta\"]\n\n    default:\n      return [currentChannel]\n  }\n}\n\nfunction getUpdateInfoFileName(channel: string, packager: PlatformPackager<any>, arch: Arch | null): string {\n  const osSuffix = packager.platform === Platform.WINDOWS ? \"\" : `-${packager.platform.buildConfigurationKey}`\n  return `${channel}${osSuffix}${getArchPrefixForUpdateFile(arch, packager)}.yml`\n}\n\nfunction getArchPrefixForUpdateFile(arch: Arch | null, packager: PlatformPackager<any>) {\n  if (arch == null || arch === Arch.x64 || packager.platform !== Platform.LINUX) {\n    return \"\"\n  }\n  return arch === Arch.armv7l ? \"-arm\" : `-${Arch[arch]}`\n}\n\nexport interface UpdateInfoFileTask {\n  readonly file: string\n  readonly info: UpdateInfo\n  readonly publishConfiguration: PublishConfiguration\n\n  readonly packager: PlatformPackager<any>\n}\n\nfunction computeIsisElectronUpdater1xCompatibility(updaterCompatibility: string | null, publishConfiguration: PublishConfiguration, packager: Packager) {\n  if (updaterCompatibility != null) {\n    return semver.satisfies(\"1.0.0\", updaterCompatibility)\n  }\n\n  // spaces is a new publish provider, no need to keep backward compatibility\n  if (publishConfiguration.provider === \"spaces\") {\n    return false\n  }\n\n  const updaterVersion = packager.metadata.dependencies == null ? null : packager.metadata.dependencies[\"electron-updater\"]\n  return updaterVersion == null || semver.lt(updaterVersion, \"4.0.0\")\n}\n\n/** @internal */\nexport async function createUpdateInfoTasks(event: ArtifactCreated, _publishConfigs: Array<PublishConfiguration>): Promise<Array<UpdateInfoFileTask>> {\n  const packager = event.packager\n  const publishConfigs = await getPublishConfigsForUpdateInfo(packager, _publishConfigs, event.arch)\n  if (publishConfigs == null || publishConfigs.length === 0) {\n    return []\n  }\n\n  const outDir = event.target!.outDir\n  const version = packager.appInfo.version\n  const sha2 = new Lazy<string>(() => hashFile(event.file!, \"sha256\", \"hex\"))\n  const isMac = packager.platform === Platform.MAC\n  const createdFiles = new Set<string>()\n  const sharedInfo = await createUpdateInfo(version, event, await getReleaseInfo(packager))\n  const tasks: Array<UpdateInfoFileTask> = []\n  const electronUpdaterCompatibility = packager.platformSpecificBuildOptions.electronUpdaterCompatibility || packager.config.electronUpdaterCompatibility || \">=2.15\"\n  for (const publishConfiguration of publishConfigs) {\n    const isBintray = publishConfiguration.provider === \"bintray\"\n    let dir = outDir\n    // Bintray uses different variant of channel file info, better to generate it to a separate dir by always\n    if (isBintray || (publishConfigs.length > 1 && publishConfiguration !== publishConfigs[0])) {\n      dir = path.join(outDir, publishConfiguration.provider)\n    }\n\n    let isElectronUpdater1xCompatibility = computeIsisElectronUpdater1xCompatibility(electronUpdaterCompatibility, publishConfiguration, packager.info)\n\n    let info = sharedInfo\n    // noinspection JSDeprecatedSymbols\n    if (isElectronUpdater1xCompatibility && packager.platform === Platform.WINDOWS) {\n      info = {\n        ...info,\n      };\n      // noinspection JSDeprecatedSymbols\n      (info as WindowsUpdateInfo).sha2 = await sha2.value\n    }\n\n    if (event.safeArtifactName != null && publishConfiguration.provider === \"github\") {\n      const newFiles = info.files.slice()\n      newFiles[0].url = event.safeArtifactName\n      info = {\n        ...info,\n        files: newFiles,\n        path: event.safeArtifactName,\n      }\n    }\n\n    for (const channel of computeChannelNames(packager, publishConfiguration)) {\n      if (isMac && isElectronUpdater1xCompatibility && event.file.endsWith(\".zip\")) {\n        // write only for first channel (generateUpdatesFilesForAllChannels is a new functionality, no need to generate old mac update info file)\n        isElectronUpdater1xCompatibility = false\n        await writeOldMacInfo(publishConfiguration, outDir, dir, channel, createdFiles, version, packager)\n      }\n\n      const updateInfoFile = path.join(dir, (isBintray ? `${version}_` : \"\") + getUpdateInfoFileName(channel, packager, event.arch))\n      if (createdFiles.has(updateInfoFile)) {\n        continue\n      }\n\n      createdFiles.add(updateInfoFile)\n\n      // artifact should be uploaded only to designated publish provider\n      tasks.push({\n        file: updateInfoFile,\n        info,\n        publishConfiguration,\n        packager,\n      })\n    }\n  }\n  return tasks\n}\n\nasync function createUpdateInfo(version: string, event: ArtifactCreated, releaseInfo: ReleaseInfo): Promise<UpdateInfo> {\n  const customUpdateInfo = event.updateInfo\n  const url = path.basename(event.file!)\n  const sha512 = (customUpdateInfo == null ? null : customUpdateInfo.sha512) || await hashFile(event.file!)\n  const files = [{url, sha512}]\n  const result: UpdateInfo = {\n    version,\n    files,\n    path: url /* backward compatibility, electron-updater 1.x - electron-updater 2.15.0 */,\n    sha512 /* backward compatibility, electron-updater 1.x - electron-updater 2.15.0 */,\n    ...releaseInfo as UpdateInfo,\n  }\n\n  if (customUpdateInfo != null) {\n    // file info or nsis web installer packages info\n    Object.assign(\"sha512\" in customUpdateInfo ? files[0] : result, customUpdateInfo)\n  }\n  return result\n}\n\nexport async function writeUpdateInfoFiles(updateInfoFileTasks: Array<UpdateInfoFileTask>, packager: Packager) {\n  // zip must be first and zip info must be used for old path/sha512 properties in the update info\n  updateInfoFileTasks.sort((a, b) => (a.info.files[0].url.endsWith(\".zip\") ? 0 : 100) - (b.info.files[0].url.endsWith(\".zip\") ? 0 : 100))\n\n  const updateChannelFileToInfo = new Map<string, UpdateInfoFileTask>()\n  for (const task of updateInfoFileTasks) {\n    // https://github.com/electron-userland/electron-builder/pull/2994\n    const key = `${task.file}@${safeStringifyJson(task.publishConfiguration, new Set([\"releaseType\"]))}`\n    const existingTask = updateChannelFileToInfo.get(key)\n    if (existingTask == null) {\n      updateChannelFileToInfo.set(key, task)\n      continue\n    }\n\n    existingTask.info.files.push(...task.info.files)\n  }\n\n  const releaseDate = new Date().toISOString()\n  await BluebirdPromise.map(updateChannelFileToInfo.values(), async task => {\n    const publishConfig = task.publishConfiguration\n    if (publishConfig.publishAutoUpdate === false) {\n      log.debug({\n        provider: publishConfig.provider,\n        reason: \"publishAutoUpdate is set to false\"\n      }, \"auto update metadata file not published\")\n      return\n    }\n\n    if (task.info.releaseDate == null) {\n      task.info.releaseDate = releaseDate\n    }\n\n    const fileContent = Buffer.from(serializeToYaml(task.info, false, true))\n    await outputFile(task.file, fileContent)\n    packager.dispatchArtifactCreated({\n      file: task.file,\n      fileContent,\n      arch: null,\n      packager: task.packager,\n      target: null,\n      publishConfig,\n    })\n  }, {concurrency: 4})\n}\n\n// backward compatibility - write json file\nasync function writeOldMacInfo(publishConfig: PublishConfiguration, outDir: string, dir: string, channel: string, createdFiles: Set<string>, version: string, packager: PlatformPackager<any>) {\n  const isGitHub = publishConfig.provider === \"github\"\n  const updateInfoFile = (isGitHub && outDir === dir) ? path.join(dir, \"github\", `${channel}-mac.json`) : path.join(dir, `${channel}-mac.json`)\n  if (!createdFiles.has(updateInfoFile)) {\n    createdFiles.add(updateInfoFile)\n    await outputJson(updateInfoFile, {\n      version,\n      releaseDate: new Date().toISOString(),\n      url: computeDownloadUrl(publishConfig, packager.generateName2(\"zip\", \"mac\", isGitHub), packager),\n    }, {spaces: 2})\n\n    packager.info.dispatchArtifactCreated({\n      file: updateInfoFile,\n      arch: null,\n      packager,\n      target: null,\n      publishConfig,\n    })\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.reactCra = reactCra;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/** @internal */
function reactCra(_x) {
  return _reactCra.apply(this, arguments);
} function _reactCra() {
  _reactCra = (0, _bluebirdLst().coroutine)(function* (projectDir) {
    if ((yield (0, _fs().statOrNull)(path.join(projectDir, "public", "electron.js"))) == null) {
      // noinspection SpellCheckingInspection
      _builderUtil().log.warn("public/electron.js not found. Please see https://medium.com/@kitze/%EF%B8%8F-from-react-to-an-electron-app-ready-for-production-a0468ecb1da3");
    }

    return {
      directories: {
        buildResources: "assets"
      },
      files: ["build/**/*"],
      extraMetadata: {
        main: "build/electron.js"
      }
    };
  });
  return _reactCra.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=rectCra.js.map{"version":3,"sources":["../../src/presets/rectCra.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;;;AAGA;SACsB,Q;;;;;;4CAAf,WAAwB,UAAxB,EAA0C;AAC/C,QAAI,OAAO,sBAAW,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,QAAtB,EAAgC,aAAhC,CAAX,CAAP,KAAsE,IAA1E,EAAgF;AAC9E;AACA,yBAAI,IAAJ,CAAS,8IAAT;AACD;;AAED,WAAO;AACL,MAAA,WAAW,EAAE;AACX,QAAA,cAAc,EAAE;AADL,OADR;AAIL,MAAA,KAAK,EAAE,CAAC,YAAD,CAJF;AAKL,MAAA,aAAa,EAAE;AACb,QAAA,IAAI,EAAE;AADO;AALV,KAAP;AAQE,G","sourcesContent":["import { log } from \"builder-util\"\nimport { statOrNull } from \"builder-util/out/fs\"\nimport * as path from \"path\"\nimport { Configuration } from \"../configuration\"\n\n/** @internal */\nexport async function reactCra(projectDir: string): Promise<Configuration> {\n  if ((await statOrNull(path.join(projectDir, \"public\", \"electron.js\"))) == null) {\n    // noinspection SpellCheckingInspection\n    log.warn(\"public/electron.js not found. Please see https://medium.com/@kitze/%EF%B8%8F-from-react-to-an-electron-app-ready-for-production-a0468ecb1da3\")\n  }\n\n  return {\n    directories: {\n      buildResources: \"assets\"\n    },\n    files: [\"build/**/*\"],\n    extraMetadata: {\n      main: \"build/electron.js\"\n    }\n  }}"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=AppXOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getEffectiveOptions = getEffectiveOptions;
exports.DesktopShortcutCreationPolicy = void 0;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _sanitizeFilename() {
  const data = _interopRequireDefault(require("sanitize-filename"));

  _sanitizeFilename = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function getEffectiveOptions(options, packager) {
  const appInfo = packager.appInfo;
  let menuCategory = null;

  if (options.menuCategory != null && options.menuCategory !== false) {
    if (options.menuCategory === true) {
      const companyName = packager.appInfo.companyName;

      if (companyName == null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Please specify "author" in the application package.json â€” it is required because "menuCategory" is set to true.`);
      }

      menuCategory = (0, _sanitizeFilename().default)(companyName);
    } else {
      menuCategory = options.menuCategory.split(/[\/\\]/).map(it => (0, _sanitizeFilename().default)(it)).join("\\");
    }
  }

  return {
    isPerMachine: options.perMachine === true,
    isAssisted: options.oneClick === false,
    shortcutName: (0, _builderUtil().isEmptyOrSpaces)(options.shortcutName) ? appInfo.productFilename : packager.expandMacro(options.shortcutName),
    isCreateDesktopShortcut: convertToDesktopShortcutCreationPolicy(options.createDesktopShortcut),
    isCreateStartMenuShortcut: options.createStartMenuShortcut !== false,
    menuCategory
  };
}

function convertToDesktopShortcutCreationPolicy(value) {
  if (value === false) {
    return DesktopShortcutCreationPolicy.NEVER;
  } else if (value === "always") {
    return DesktopShortcutCreationPolicy.ALWAYS;
  } else {
    return DesktopShortcutCreationPolicy.FRESH_INSTALL;
  }
}

var DesktopShortcutCreationPolicy;
exports.DesktopShortcutCreationPolicy = DesktopShortcutCreationPolicy;

(function (DesktopShortcutCreationPolicy) {
  DesktopShortcutCreationPolicy[DesktopShortcutCreationPolicy["FRESH_INSTALL"] = 0] = "FRESH_INSTALL";
  DesktopShortcutCreationPolicy[DesktopShortcutCreationPolicy["ALWAYS"] = 1] = "ALWAYS";
  DesktopShortcutCreationPolicy[DesktopShortcutCreationPolicy["NEVER"] = 2] = "NEVER";
})(DesktopShortcutCreationPolicy || (exports.DesktopShortcutCreationPolicy = DesktopShortcutCreationPolicy = {})); 
// __ts-babel@6.0.4
//# sourceMappingURL=CommonWindowsInstallerConfiguration.js.map{"version":3,"sources":["../../src/options/CommonWindowsInstallerConfiguration.ts"],"names":[],"mappings":";;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAqDM,SAAU,mBAAV,CAA8B,OAA9B,EAA4E,QAA5E,EAAiG;AACrG,QAAM,OAAO,GAAG,QAAQ,CAAC,OAAzB;AAEA,MAAI,YAAY,GAAkB,IAAlC;;AACA,MAAI,OAAO,CAAC,YAAR,IAAwB,IAAxB,IAAgC,OAAO,CAAC,YAAR,KAAyB,KAA7D,EAAoE;AAClE,QAAI,OAAO,CAAC,YAAR,KAAyB,IAA7B,EAAmC;AACjC,YAAM,WAAW,GAAG,QAAQ,CAAC,OAAT,CAAiB,WAArC;;AACA,UAAI,WAAW,IAAI,IAAnB,EAAyB;AACvB,cAAM,KAAI,wCAAJ,EAA8B,iHAA9B,CAAN;AACD;;AACD,MAAA,YAAY,GAAG,iCAAiB,WAAjB,CAAf;AACD,KAND,MAOK;AACH,MAAA,YAAY,GAAI,OAAO,CAAC,YAAR,CAAgC,KAAhC,CAAsC,QAAtC,EAAgD,GAAhD,CAAoD,EAAE,IAAI,iCAAiB,EAAjB,CAA1D,EAAgF,IAAhF,CAAqF,IAArF,CAAhB;AACD;AACF;;AAED,SAAO;AACL,IAAA,YAAY,EAAE,OAAO,CAAC,UAAR,KAAuB,IADhC;AAEL,IAAA,UAAU,EAAE,OAAO,CAAC,QAAR,KAAqB,KAF5B;AAIL,IAAA,YAAY,EAAE,oCAAgB,OAAO,CAAC,YAAxB,IAAwC,OAAO,CAAC,eAAhD,GAAkE,QAAQ,CAAC,WAAT,CAAqB,OAAO,CAAC,YAA7B,CAJ3E;AAKL,IAAA,uBAAuB,EAAE,sCAAsC,CAAC,OAAO,CAAC,qBAAT,CAL1D;AAML,IAAA,yBAAyB,EAAE,OAAO,CAAC,uBAAR,KAAoC,KAN1D;AAOL,IAAA;AAPK,GAAP;AASD;;AAED,SAAS,sCAAT,CAAgD,KAAhD,EAAmF;AACjF,MAAI,KAAK,KAAK,KAAd,EAAqB;AACnB,WAAO,6BAA6B,CAAC,KAArC;AACD,GAFD,MAGK,IAAI,KAAK,KAAK,QAAd,EAAwB;AAC3B,WAAO,6BAA6B,CAAC,MAArC;AACD,GAFI,MAGA;AACH,WAAO,6BAA6B,CAAC,aAArC;AACD;AACF;;AAED,IAAY,6BAAZ;;;AAAA,CAAA,UAAY,6BAAZ,EAAyC;AACvC,EAAA,6BAAA,CAAA,6BAAA,CAAA,eAAA,CAAA,GAAA,CAAA,CAAA,GAAA,eAAA;AAAe,EAAA,6BAAA,CAAA,6BAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AAAQ,EAAA,6BAAA,CAAA,6BAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACxB,CAFD,EAAY,6BAA6B,6CAA7B,6BAA6B,GAAA,EAAA,CAAzC,E","sourcesContent":["import { InvalidConfigurationError, isEmptyOrSpaces } from \"builder-util\"\nimport sanitizeFileName from \"sanitize-filename\"\nimport { WinPackager } from \"../winPackager\"\n\nexport interface CommonWindowsInstallerConfiguration {\n  readonly oneClick?: boolean\n\n  /**\n   * Whether to install per all users (per-machine).\n   * @default false\n   */\n  readonly perMachine?: boolean\n\n  /**\n   * Whether to run the installed application after finish. For assisted installer corresponding checkbox will be removed.\n   * @default true\n   */\n  readonly runAfterFinish?: boolean\n\n  /**\n   * Whether to create desktop shortcut. Set to `always` if to recreate also on reinstall (even if removed by user).\n   * @default true\n   */\n  readonly createDesktopShortcut?: boolean | \"always\"\n\n  /**\n   * Whether to create start menu shortcut.\n   * @default true\n   */\n  readonly createStartMenuShortcut?: boolean\n\n  /**\n   * Whether to create submenu for start menu shortcut and program files directory. If `true`, company name will be used. Or string value.\n   * @default false\n   */\n  readonly menuCategory?: boolean | string\n\n  /**\n   * The name that will be used for all shortcuts. Defaults to the application name.\n   */\n  readonly shortcutName?: string | null\n}\n\nexport interface FinalCommonWindowsInstallerOptions {\n  isAssisted: boolean\n  isPerMachine: boolean\n\n  shortcutName: string\n  menuCategory: string | null\n\n  isCreateDesktopShortcut: DesktopShortcutCreationPolicy\n  isCreateStartMenuShortcut: boolean\n}\n\nexport function getEffectiveOptions(options: CommonWindowsInstallerConfiguration, packager: WinPackager): FinalCommonWindowsInstallerOptions {\n  const appInfo = packager.appInfo\n\n  let menuCategory: string | null = null\n  if (options.menuCategory != null && options.menuCategory !== false) {\n    if (options.menuCategory === true) {\n      const companyName = packager.appInfo.companyName\n      if (companyName == null) {\n        throw new InvalidConfigurationError(`Please specify \"author\" in the application package.json â€” it is required because \"menuCategory\" is set to true.`)\n      }\n      menuCategory = sanitizeFileName(companyName)\n    }\n    else {\n      menuCategory = (options.menuCategory as string).split(/[\\/\\\\]/).map(it => sanitizeFileName(it)).join(\"\\\\\")\n    }\n  }\n\n  return {\n    isPerMachine: options.perMachine === true,\n    isAssisted: options.oneClick === false,\n\n    shortcutName: isEmptyOrSpaces(options.shortcutName) ? appInfo.productFilename : packager.expandMacro(options.shortcutName!!),\n    isCreateDesktopShortcut: convertToDesktopShortcutCreationPolicy(options.createDesktopShortcut),\n    isCreateStartMenuShortcut: options.createStartMenuShortcut !== false,\n    menuCategory,\n  }\n}\n\nfunction convertToDesktopShortcutCreationPolicy(value: boolean | undefined | string): DesktopShortcutCreationPolicy {\n  if (value === false) {\n    return DesktopShortcutCreationPolicy.NEVER\n  }\n  else if (value === \"always\") {\n    return DesktopShortcutCreationPolicy.ALWAYS\n  }\n  else {\n    return DesktopShortcutCreationPolicy.FRESH_INSTALL\n  }\n}\n\nexport enum DesktopShortcutCreationPolicy {\n  FRESH_INSTALL, ALWAYS, NEVER\n}"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=FileAssociation.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=MsiOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=PlatformSpecificBuildOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=SnapOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=SquirrelWindowsOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=linuxOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=macOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=metadata.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=pkgOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=winOptions.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.LibUiFramework = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _plist() {
  const data = require("plist");

  _plist = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _core() {
  const data = require("../core");

  _core = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class LibUiFramework {
  constructor(version, distMacOsAppName, isUseLaunchUi) {
    this.version = version;
    this.distMacOsAppName = distMacOsAppName;
    this.isUseLaunchUi = isUseLaunchUi;
    this.name = "libui"; // noinspection JSUnusedGlobalSymbols

    this.macOsDefaultTargets = ["dmg"];
    this.defaultAppIdPrefix = "com.libui."; // noinspection JSUnusedGlobalSymbols

    this.isCopyElevateHelper = false; // noinspection JSUnusedGlobalSymbols

    this.isNpmRebuildRequired = false;
  }

  prepareApplicationStageDirectory(options) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      yield (0, _fsExtraP().emptyDir)(options.appOutDir);
      const packager = options.packager;
      const platform = packager.platform;

      if (_this.isUseLaunchUiForPlatform(platform)) {
        const appOutDir = options.appOutDir;
        yield (0, _builderUtil().executeAppBuilder)(["proton-native", "--node-version", _this.version, "--use-launch-ui", "--platform", platform.nodeName, "--arch", options.arch, "--stage", appOutDir, "--executable", `${packager.appInfo.productFilename}${platform === _core().Platform.WINDOWS ? ".exe" : ""}`]);
        return;
      }

      if (platform === _core().Platform.MAC) {
        yield _this.prepareMacosApplicationStageDirectory(packager, options);
      } else if (platform === _core().Platform.LINUX) {
        yield _this.prepareLinuxApplicationStageDirectory(options);
      }
    })();
  }

  prepareMacosApplicationStageDirectory(packager, options) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appContentsDir = path.join(options.appOutDir, _this2.distMacOsAppName, "Contents");
      yield (0, _fsExtraP().ensureDir)(path.join(appContentsDir, "Resources"));
      yield (0, _fsExtraP().ensureDir)(path.join(appContentsDir, "MacOS"));
      yield (0, _builderUtil().executeAppBuilder)(["proton-native", "--node-version", _this2.version, "--platform", "darwin", "--stage", path.join(appContentsDir, "MacOS")]);
      const appPlist = {
        // https://github.com/albe-rosado/create-proton-app/issues/13
        NSHighResolutionCapable: true
      };
      yield packager.applyCommonInfo(appPlist, appContentsDir);
      yield Promise.all([(0, _fsExtraP().writeFile)(path.join(appContentsDir, "Info.plist"), (0, _plist().build)(appPlist)), writeExecutableMain(path.join(appContentsDir, "MacOS", appPlist.CFBundleExecutable), `#!/bin/sh
  DIR=$(dirname "$0")
  "$DIR/node" "$DIR/../Resources/app/${options.packager.info.metadata.main || "index.js"}"
  `)]);
    })();
  }

  prepareLinuxApplicationStageDirectory(options) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const appOutDir = options.appOutDir;
      yield (0, _builderUtil().executeAppBuilder)(["proton-native", "--node-version", _this3.version, "--platform", "linux", "--arch", options.arch, "--stage", appOutDir]);
      const mainPath = path.join(appOutDir, options.packager.executableName);
      yield writeExecutableMain(mainPath, `#!/bin/sh
  DIR=$(dirname "$0")
  "$DIR/node" "$DIR/app/${options.packager.info.metadata.main || "index.js"}"
  `);
    })();
  }

  afterPack(context) {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = context.packager;

      if (!_this4.isUseLaunchUiForPlatform(packager.platform)) {
        return;
      } // LaunchUI requires main.js, rename if need


      const userMain = packager.info.metadata.main || "index.js";

      if (userMain === "main.js") {
        return;
      }

      yield (0, _fsExtraP().rename)(path.join(context.appOutDir, "app", userMain), path.join(context.appOutDir, "app", "main.js"));
    })();
  }

  getMainFile(platform) {
    return this.isUseLaunchUiForPlatform(platform) ? "main.js" : null;
  }

  isUseLaunchUiForPlatform(platform) {
    return platform === _core().Platform.WINDOWS || this.isUseLaunchUi && platform === _core().Platform.LINUX;
  }

  getExcludedDependencies(platform) {
    // part of launchui
    return this.isUseLaunchUiForPlatform(platform) ? ["libui-node"] : null;
  }

}

exports.LibUiFramework = LibUiFramework;

function writeExecutableMain(_x, _x2) {
  return _writeExecutableMain.apply(this, arguments);
} function _writeExecutableMain() {
  _writeExecutableMain = (0, _bluebirdLst().coroutine)(function* (file, content) {
    yield (0, _fsExtraP().writeFile)(file, content, {
      mode: 0o755
    });
    yield (0, _fsExtraP().chmod)(file, 0o755);
  });
  return _writeExecutableMain.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=LibUiFramework.js.map{"version":3,"sources":["../../src/frameworks/LibUiFramework.ts"],"names":[],"mappings":"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","sourcesContent":["import { chmod, emptyDir, ensureDir, rename, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { build as buildPlist } from \"plist\"\nimport { executeAppBuilder } from \"builder-util\"\nimport { AfterPackContext } from \"../configuration\"\nimport { Platform } from \"../core\"\nimport { Framework, PrepareApplicationStageDirectoryOptions } from \"../Framework\"\nimport { LinuxPackager } from \"../linuxPackager\"\nimport MacPackager from \"../macPackager\"\n\nexport class LibUiFramework implements Framework {\n  readonly name: string = \"libui\"\n  // noinspection JSUnusedGlobalSymbols\n  readonly macOsDefaultTargets = [\"dmg\"]\n\n  readonly defaultAppIdPrefix: string = \"com.libui.\"\n\n  // noinspection JSUnusedGlobalSymbols\n  readonly isCopyElevateHelper = false\n\n  // noinspection JSUnusedGlobalSymbols\n  readonly isNpmRebuildRequired = false\n\n  constructor(readonly version: string, readonly distMacOsAppName: string, protected readonly isUseLaunchUi: boolean) {\n  }\n\n  async prepareApplicationStageDirectory(options: PrepareApplicationStageDirectoryOptions) {\n    await emptyDir(options.appOutDir)\n\n    const packager = options.packager\n    const platform = packager.platform\n\n    if (this.isUseLaunchUiForPlatform(platform)) {\n      const appOutDir = options.appOutDir\n      await executeAppBuilder([\"proton-native\",\n        \"--node-version\", this.version,\n        \"--use-launch-ui\",\n        \"--platform\", platform.nodeName,\n        \"--arch\", options.arch,\n        \"--stage\", appOutDir,\n        \"--executable\", `${packager.appInfo.productFilename}${platform === Platform.WINDOWS ? \".exe\" : \"\"}`,\n      ])\n      return\n    }\n\n    if (platform === Platform.MAC) {\n      await this.prepareMacosApplicationStageDirectory(packager as MacPackager, options)\n    }\n    else if (platform === Platform.LINUX) {\n      await this.prepareLinuxApplicationStageDirectory(options)\n    }\n  }\n\n  private async prepareMacosApplicationStageDirectory(packager: MacPackager, options: PrepareApplicationStageDirectoryOptions) {\n    const appContentsDir = path.join(options.appOutDir, this.distMacOsAppName, \"Contents\")\n    await ensureDir(path.join(appContentsDir, \"Resources\"))\n    await ensureDir(path.join(appContentsDir, \"MacOS\"))\n    await executeAppBuilder([\"proton-native\", \"--node-version\", this.version, \"--platform\", \"darwin\", \"--stage\", path.join(appContentsDir, \"MacOS\")])\n\n    const appPlist: any = {\n      // https://github.com/albe-rosado/create-proton-app/issues/13\n      NSHighResolutionCapable: true,\n    }\n    await packager.applyCommonInfo(appPlist, appContentsDir)\n    await Promise.all([\n      writeFile(path.join(appContentsDir, \"Info.plist\"), buildPlist(appPlist)),\n      writeExecutableMain(path.join(appContentsDir, \"MacOS\", appPlist.CFBundleExecutable), `#!/bin/sh\n  DIR=$(dirname \"$0\")\n  \"$DIR/node\" \"$DIR/../Resources/app/${options.packager.info.metadata.main || \"index.js\"}\"\n  `),\n    ])\n  }\n\n  private async prepareLinuxApplicationStageDirectory(options: PrepareApplicationStageDirectoryOptions) {\n    const appOutDir = options.appOutDir\n    await executeAppBuilder([\"proton-native\", \"--node-version\", this.version, \"--platform\", \"linux\", \"--arch\", options.arch, \"--stage\", appOutDir])\n    const mainPath = path.join(appOutDir, (options.packager as LinuxPackager).executableName)\n    await writeExecutableMain(mainPath, `#!/bin/sh\n  DIR=$(dirname \"$0\")\n  \"$DIR/node\" \"$DIR/app/${options.packager.info.metadata.main || \"index.js\"}\"\n  `)\n  }\n\n  async afterPack(context: AfterPackContext) {\n    const packager = context.packager\n    if (!this.isUseLaunchUiForPlatform(packager.platform)) {\n      return\n    }\n\n    // LaunchUI requires main.js, rename if need\n    const userMain = packager.info.metadata.main || \"index.js\"\n    if (userMain === \"main.js\") {\n      return\n    }\n\n    await rename(path.join(context.appOutDir, \"app\", userMain), path.join(context.appOutDir, \"app\", \"main.js\"))\n  }\n\n  getMainFile(platform: Platform): string | null {\n    return this.isUseLaunchUiForPlatform(platform) ? \"main.js\" : null\n  }\n\n  private isUseLaunchUiForPlatform(platform: Platform) {\n    return platform === Platform.WINDOWS || (this.isUseLaunchUi && platform === Platform.LINUX)\n  }\n\n  getExcludedDependencies(platform: Platform): Array<string> | null {\n    // part of launchui\n    return this.isUseLaunchUiForPlatform(platform) ? [\"libui-node\"] : null\n  }\n}\n\nasync function writeExecutableMain(file: string, content: string) {\n  await writeFile(file, content, {mode: 0o755})\n  await chmod(file, 0o755)\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createElectronFrameworkSupport = createElectronFrameworkSupport;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _index() {
  const data = require("../index");

  _index = function () {
    return data;
  };

  return data;
}

function _pathManager() {
  const data = require("../util/pathManager");

  _pathManager = function () {
    return data;
  };

  return data;
}

function _electronMac() {
  const data = require("./electronMac");

  _electronMac = function () {
    return data;
  };

  return data;
}

function _electronVersion() {
  const data = require("./electronVersion");

  _electronVersion = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function createDownloadOpts(opts, platform, arch, electronVersion) {
  return Object.assign({
    platform,
    arch,
    version: electronVersion
  }, opts.electronDownload);
}

function beforeCopyExtraFiles(_x) {
  return _beforeCopyExtraFiles.apply(this, arguments);
}

function _beforeCopyExtraFiles() {
  _beforeCopyExtraFiles = (0, _bluebirdLst().coroutine)(function* (options) {
    const packager = options.packager;
    const appOutDir = options.appOutDir;

    if (packager.platform === _index().Platform.LINUX) {
      const linuxPackager = packager;
      const executable = path.join(appOutDir, linuxPackager.executableName);
      yield (0, _fsExtraP().rename)(path.join(appOutDir, packager.electronDistExecutableName), executable);
    } else if (packager.platform === _index().Platform.WINDOWS) {
      const executable = path.join(appOutDir, `${packager.appInfo.productFilename}.exe`);
      yield (0, _fsExtraP().rename)(path.join(appOutDir, `${packager.electronDistExecutableName}.exe`), executable);
    } else {
      yield (0, _electronMac().createMacApp)(packager, appOutDir, options.asarIntegrity, options.platformName === "mas");
      const wantedLanguages = (0, _builderUtil().asArray)(packager.platformSpecificBuildOptions.electronLanguages);

      if (wantedLanguages.length === 0) {
        return;
      } // noinspection SpellCheckingInspection


      const langFileExt = ".lproj";
      const resourcesDir = packager.getResourcesDir(appOutDir);
      yield _bluebirdLst().default.map((0, _fsExtraP().readdir)(resourcesDir), file => {
        if (!file.endsWith(langFileExt)) {
          return;
        }

        const language = file.substring(0, file.length - langFileExt.length);

        if (!wantedLanguages.includes(language)) {
          return (0, _fsExtraP().remove)(path.join(resourcesDir, file));
        }

        return;
      }, _fs().CONCURRENCY);
    }
  });
  return _beforeCopyExtraFiles.apply(this, arguments);
}

class ElectronFramework {
  constructor(name, version, distMacOsAppName) {
    this.name = name;
    this.version = version;
    this.distMacOsAppName = distMacOsAppName; // noinspection JSUnusedGlobalSymbols

    this.macOsDefaultTargets = ["zip", "dmg"]; // noinspection JSUnusedGlobalSymbols

    this.defaultAppIdPrefix = "com.electron."; // noinspection JSUnusedGlobalSymbols

    this.isCopyElevateHelper = true; // noinspection JSUnusedGlobalSymbols

    this.isNpmRebuildRequired = true;
  }

  getDefaultIcon(platform) {
    if (platform === _index().Platform.LINUX) {
      return path.join((0, _pathManager().getTemplatePath)("icons"), "electron-linux");
    } else {
      // default icon is embedded into app skeleton
      return null;
    }
  }

  prepareApplicationStageDirectory(options) {
    return unpack(options, createDownloadOpts(options.packager.config, options.platformName, options.arch, this.version), this.distMacOsAppName);
  }

  beforeCopyExtraFiles(options) {
    return beforeCopyExtraFiles(options);
  }

}

function createElectronFrameworkSupport(_x2, _x3) {
  return _createElectronFrameworkSupport.apply(this, arguments);
}

function _createElectronFrameworkSupport() {
  _createElectronFrameworkSupport = (0, _bluebirdLst().coroutine)(function* (configuration, packager) {
    let version = configuration.electronVersion;

    if (version == null) {
      // for prepacked app asar no dev deps in the app.asar
      if (packager.isPrepackedAppAsar) {
        version = yield (0, _electronVersion().getElectronVersionFromInstalled)(packager.projectDir);

        if (version == null) {
          throw new Error(`Cannot compute electron version for prepacked asar`);
        }
      } else {
        version = yield (0, _electronVersion().computeElectronVersion)(packager.projectDir, new (_lazyVal().Lazy)(() => Promise.resolve(packager.metadata)));
      }

      configuration.electronVersion = version;
    }

    return new ElectronFramework("electron", version, "Electron.app");
  });
  return _createElectronFrameworkSupport.apply(this, arguments);
}

function unpack(_x4, _x5, _x6) {
  return _unpack.apply(this, arguments);
}

function _unpack() {
  _unpack = (0, _bluebirdLst().coroutine)(function* (prepareOptions, options, distMacOsAppName) {
    const packager = prepareOptions.packager;
    const out = prepareOptions.appOutDir;
    let dist = packager.config.electronDist;

    if (dist != null) {
      const zipFile = `electron-v${options.version}-${prepareOptions.platformName}-${options.arch}.zip`;
      const resolvedDist = path.resolve(packager.projectDir, dist);

      if ((yield (0, _fs().statOrNull)(path.join(resolvedDist, zipFile))) != null) {
        options.cache = resolvedDist;
        dist = null;
      }
    }

    let isFullCleanup = false;

    if (dist == null) {
      yield (0, _builderUtil().executeAppBuilder)(["unpack-electron", "--configuration", JSON.stringify([options]), "--output", out, "--distMacOsAppName", distMacOsAppName]);
    } else {
      isFullCleanup = true;
      const source = packager.getElectronSrcDir(dist);
      const destination = packager.getElectronDestinationDir(out);

      _builderUtil().log.info({
        source,
        destination
      }, "copying Electron");

      yield (0, _fsExtraP().emptyDir)(out);
      yield (0, _fs().copyDir)(source, destination, {
        isUseHardLink: _fs().DO_NOT_USE_HARD_LINKS
      });
    }

    yield cleanupAfterUnpack(prepareOptions, distMacOsAppName, isFullCleanup);
  });
  return _unpack.apply(this, arguments);
}

function cleanupAfterUnpack(prepareOptions, distMacOsAppName, isFullCleanup) {
  const out = prepareOptions.appOutDir;

  const isMac = prepareOptions.packager.platform === _index().Platform.MAC;

  const resourcesPath = isMac ? path.join(out, distMacOsAppName, "Contents", "Resources") : path.join(out, "resources");
  return Promise.all([isFullCleanup ? (0, _fs().unlinkIfExists)(path.join(resourcesPath, "default_app.asar")) : Promise.resolve(), isFullCleanup ? (0, _fs().unlinkIfExists)(path.join(out, "version")) : Promise.resolve(), isMac ? Promise.resolve() : (0, _fsExtraP().rename)(path.join(out, "LICENSE"), path.join(out, "LICENSE.electron.txt")).catch(() => {})]);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=ElectronFramework.js.map{"version":3,"sources":["../../src/electron/ElectronFramework.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { asArray, executeAppBuilder, log } from \"builder-util\"\nimport { CONCURRENCY, copyDir, DO_NOT_USE_HARD_LINKS, statOrNull, unlinkIfExists } from \"builder-util/out/fs\"\nimport { emptyDir, readdir, remove, rename } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { Configuration } from \"../configuration\"\nimport { BeforeCopyExtraFilesOptions, Framework, PrepareApplicationStageDirectoryOptions } from \"../Framework\"\nimport { ElectronPlatformName, Packager, Platform } from \"../index\"\nimport { LinuxPackager } from \"../linuxPackager\"\nimport MacPackager from \"../macPackager\"\nimport { getTemplatePath } from \"../util/pathManager\"\nimport { createMacApp } from \"./electronMac\"\nimport { computeElectronVersion, getElectronVersionFromInstalled } from \"./electronVersion\"\n\nexport type ElectronPlatformName = \"darwin\" | \"linux\" | \"win32\" | \"mas\"\n\nexport interface ElectronDownloadOptions {\n  // https://github.com/electron-userland/electron-builder/issues/3077\n  // must be optional\n  version?: string\n\n  /**\n   * The [cache location](https://github.com/electron-userland/electron-download#cache-location).\n   */\n  cache?: string | null\n\n  /**\n   * The mirror.\n   */\n  mirror?: string | null\n\n  /** @private */\n  customDir?: string | null\n  /** @private */\n  customFilename?: string | null\n\n  strictSSL?: boolean\n  isVerifyChecksum?: boolean\n\n  platform?: ElectronPlatformName\n  arch?: string\n}\n\nfunction createDownloadOpts(opts: Configuration, platform: ElectronPlatformName, arch: string, electronVersion: string): ElectronDownloadOptions {\n  return {\n    platform,\n    arch,\n    version: electronVersion,\n    ...opts.electronDownload,\n  }\n}\n\nasync function beforeCopyExtraFiles(options: BeforeCopyExtraFilesOptions) {\n  const packager = options.packager\n  const appOutDir = options.appOutDir\n  if (packager.platform === Platform.LINUX) {\n    const linuxPackager = (packager as LinuxPackager)\n    const executable = path.join(appOutDir, linuxPackager.executableName)\n    await rename(path.join(appOutDir, packager.electronDistExecutableName), executable)\n  }\n  else if (packager.platform === Platform.WINDOWS) {\n    const executable = path.join(appOutDir, `${packager.appInfo.productFilename}.exe`)\n    await rename(path.join(appOutDir, `${packager.electronDistExecutableName}.exe`), executable)\n  }\n  else {\n    await createMacApp(packager as MacPackager, appOutDir, options.asarIntegrity, (options.platformName as ElectronPlatformName) === \"mas\")\n\n    const wantedLanguages = asArray(packager.platformSpecificBuildOptions.electronLanguages)\n    if (wantedLanguages.length === 0) {\n      return\n    }\n\n    // noinspection SpellCheckingInspection\n    const langFileExt = \".lproj\"\n    const resourcesDir = packager.getResourcesDir(appOutDir)\n    await BluebirdPromise.map(readdir(resourcesDir), file => {\n      if (!file.endsWith(langFileExt)) {\n        return\n      }\n\n      const language = file.substring(0, file.length - langFileExt.length)\n      if (!wantedLanguages.includes(language)) {\n        return remove(path.join(resourcesDir, file))\n      }\n      return\n    }, CONCURRENCY)\n  }\n}\n\nclass ElectronFramework implements Framework {\n  // noinspection JSUnusedGlobalSymbols\n  readonly macOsDefaultTargets = [\"zip\", \"dmg\"]\n  // noinspection JSUnusedGlobalSymbols\n  readonly defaultAppIdPrefix = \"com.electron.\"\n  // noinspection JSUnusedGlobalSymbols\n  readonly isCopyElevateHelper = true\n  // noinspection JSUnusedGlobalSymbols\n  readonly isNpmRebuildRequired = true\n\n  constructor(readonly name: string, readonly version: string, readonly distMacOsAppName: string) {\n  }\n\n  getDefaultIcon(platform: Platform) {\n    if (platform === Platform.LINUX) {\n      return path.join(getTemplatePath(\"icons\"), \"electron-linux\")\n    }\n    else {\n      // default icon is embedded into app skeleton\n      return null\n    }\n  }\n\n  prepareApplicationStageDirectory(options: PrepareApplicationStageDirectoryOptions) {\n    return unpack(options, createDownloadOpts(options.packager.config, options.platformName, options.arch, this.version), this.distMacOsAppName)\n  }\n\n  beforeCopyExtraFiles(options: BeforeCopyExtraFilesOptions) {\n    return beforeCopyExtraFiles(options)\n  }\n}\n\nexport async function createElectronFrameworkSupport(configuration: Configuration, packager: Packager): Promise<Framework> {\n  let version = configuration.electronVersion\n  if (version == null) {\n    // for prepacked app asar no dev deps in the app.asar\n    if (packager.isPrepackedAppAsar) {\n      version = await getElectronVersionFromInstalled(packager.projectDir)\n      if (version == null) {\n        throw new Error(`Cannot compute electron version for prepacked asar`)\n      }\n    }\n    else {\n      version = await computeElectronVersion(packager.projectDir, new Lazy(() => Promise.resolve(packager.metadata)))\n    }\n    configuration.electronVersion = version\n  }\n\n  return new ElectronFramework(\"electron\", version, \"Electron.app\")\n}\n\nasync function unpack(prepareOptions: PrepareApplicationStageDirectoryOptions, options: ElectronDownloadOptions, distMacOsAppName: string) {\n  const packager = prepareOptions.packager\n  const out = prepareOptions.appOutDir\n\n  let dist: string | null | undefined = packager.config.electronDist\n  if (dist != null) {\n    const zipFile = `electron-v${options.version}-${prepareOptions.platformName}-${options.arch}.zip`\n    const resolvedDist = path.resolve(packager.projectDir, dist)\n    if ((await statOrNull(path.join(resolvedDist, zipFile))) != null) {\n      options.cache = resolvedDist\n      dist = null\n    }\n  }\n\n  let isFullCleanup = false\n  if (dist == null) {\n    await executeAppBuilder([\"unpack-electron\", \"--configuration\", JSON.stringify([options]), \"--output\", out, \"--distMacOsAppName\", distMacOsAppName])\n  }\n  else {\n    isFullCleanup = true\n    const source = packager.getElectronSrcDir(dist)\n    const destination = packager.getElectronDestinationDir(out)\n    log.info({source, destination}, \"copying Electron\")\n    await emptyDir(out)\n    await copyDir(source, destination, {\n      isUseHardLink: DO_NOT_USE_HARD_LINKS,\n    })\n  }\n\n  await cleanupAfterUnpack(prepareOptions, distMacOsAppName, isFullCleanup)\n}\n\nfunction cleanupAfterUnpack(prepareOptions: PrepareApplicationStageDirectoryOptions, distMacOsAppName: string, isFullCleanup: boolean) {\n  const out = prepareOptions.appOutDir\n  const isMac = prepareOptions.packager.platform === Platform.MAC\n  const resourcesPath = isMac ? path.join(out, distMacOsAppName, \"Contents\", \"Resources\") : path.join(out, \"resources\")\n\n  return Promise.all([\n    isFullCleanup ? unlinkIfExists(path.join(resourcesPath, \"default_app.asar\")) : Promise.resolve(),\n    isFullCleanup ? unlinkIfExists(path.join(out, \"version\")) : Promise.resolve(),\n    isMac ? Promise.resolve() : rename(path.join(out, \"LICENSE\"), path.join(out, \"LICENSE.electron.txt\")).catch(() => {/* ignore */}),\n  ])\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createMacApp = createMacApp;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _plist() {
  const data = require("plist");

  _plist = function () {
    return data;
  };

  return data;
}

function _appInfo() {
  const data = require("../appInfo");

  _appInfo = function () {
    return data;
  };

  return data;
}

function _platformPackager() {
  const data = require("../platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function doRename(basePath, oldName, newName) {
  return (0, _fsExtraP().rename)(path.join(basePath, oldName), path.join(basePath, newName));
}

function moveHelpers(helperSuffixes, frameworksPath, appName, prefix) {
  return _bluebirdLst().default.map(helperSuffixes, suffix => {
    const executableBasePath = path.join(frameworksPath, `${prefix}${suffix}.app`, "Contents", "MacOS");
    return doRename(executableBasePath, `${prefix}${suffix}`, appName + suffix).then(() => doRename(frameworksPath, `${prefix}${suffix}.app`, `${appName}${suffix}.app`));
  });
}

function getAvailableHelperSuffixes(helperEHPlist, helperNPPlist) {
  const result = [" Helper"];

  if (helperEHPlist != null) {
    result.push(" Helper EH");
  }

  if (helperNPPlist != null) {
    result.push(" Helper NP");
  }

  return result;
}
/** @internal */


function createMacApp(_x, _x2, _x3, _x4) {
  return _createMacApp.apply(this, arguments);
}

function _createMacApp() {
  _createMacApp = (0, _bluebirdLst().coroutine)(function* (packager, appOutDir, asarIntegrity, isMas) {
    const appInfo = packager.appInfo;
    const appFilename = appInfo.productFilename;
    const contentsPath = path.join(appOutDir, packager.info.framework.distMacOsAppName, "Contents");
    const frameworksPath = path.join(contentsPath, "Frameworks");
    const loginItemPath = path.join(contentsPath, "Library", "LoginItems");
    const appPlistFilename = path.join(contentsPath, "Info.plist");
    const helperPlistFilename = path.join(frameworksPath, `${packager.electronDistMacOsExecutableName} Helper.app`, "Contents", "Info.plist");
    const helperEHPlistFilename = path.join(frameworksPath, `${packager.electronDistMacOsExecutableName} Helper EH.app`, "Contents", "Info.plist");
    const helperNPPlistFilename = path.join(frameworksPath, `${packager.electronDistMacOsExecutableName} Helper NP.app`, "Contents", "Info.plist");
    const helperLoginPlistFilename = path.join(loginItemPath, `${packager.electronDistMacOsExecutableName} Login Helper.app`, "Contents", "Info.plist");
    const buildMetadata = packager.config;
    const fileContents = yield _bluebirdLst().default.map([appPlistFilename, helperPlistFilename, helperEHPlistFilename, helperNPPlistFilename, helperLoginPlistFilename, buildMetadata["extend-info"]], it => it == null ? it : (0, _promise().orIfFileNotExist)((0, _fsExtraP().readFile)(it, "utf8"), null));
    const appPlist = (0, _plist().parse)(fileContents[0]);
    const helperPlist = (0, _plist().parse)(fileContents[1]);
    const helperEHPlist = fileContents[2] == null ? null : (0, _plist().parse)(fileContents[2]);
    const helperNPPlist = fileContents[3] == null ? null : (0, _plist().parse)(fileContents[3]);
    const helperLoginPlist = fileContents[4] == null ? null : (0, _plist().parse)(fileContents[4]); // if an extend-info file was supplied, copy its contents in first

    if (fileContents[5] != null) {
      Object.assign(appPlist, (0, _plist().parse)(fileContents[5]));
    }

    const oldHelperBundleId = buildMetadata["helper-bundle-id"];

    if (oldHelperBundleId != null) {
      _builderUtil().log.warn("build.helper-bundle-id is deprecated, please set as build.mac.helperBundleId");
    }

    const helperBundleIdentifier = (0, _appInfo().filterCFBundleIdentifier)(packager.platformSpecificBuildOptions.helperBundleId || oldHelperBundleId || `${appInfo.macBundleIdentifier}.helper`);
    yield packager.applyCommonInfo(appPlist, contentsPath); // required for electron-updater proxy

    if (!isMas) {
      configureLocalhostAts(appPlist);
    }

    helperPlist.CFBundleExecutable = `${appFilename} Helper`;
    helperPlist.CFBundleDisplayName = `${appInfo.productName} Helper`;
    helperPlist.CFBundleIdentifier = helperBundleIdentifier;
    helperPlist.CFBundleVersion = appPlist.CFBundleVersion;

    function configureHelper(helper, postfix) {
      helper.CFBundleExecutable = `${appFilename} Helper ${postfix}`;
      helper.CFBundleDisplayName = `${appInfo.productName} Helper ${postfix}`;
      helper.CFBundleIdentifier = `${helperBundleIdentifier}.${postfix}`;
      helper.CFBundleVersion = appPlist.CFBundleVersion;
    }

    if (helperEHPlist != null) {
      configureHelper(helperEHPlist, "EH");
    }

    if (helperNPPlist != null) {
      configureHelper(helperNPPlist, "NP");
    }

    if (helperLoginPlist != null) {
      helperLoginPlist.CFBundleExecutable = `${appFilename} Login Helper`;
      helperLoginPlist.CFBundleDisplayName = `${appInfo.productName} Login Helper`; // noinspection SpellCheckingInspection

      helperLoginPlist.CFBundleIdentifier = `${appInfo.macBundleIdentifier}.loginhelper`;
      helperLoginPlist.CFBundleVersion = appPlist.CFBundleVersion;
    }

    const protocols = (0, _builderUtil().asArray)(buildMetadata.protocols).concat((0, _builderUtil().asArray)(packager.platformSpecificBuildOptions.protocols));

    if (protocols.length > 0) {
      appPlist.CFBundleURLTypes = protocols.map(protocol => {
        const schemes = (0, _builderUtil().asArray)(protocol.schemes);

        if (schemes.length === 0) {
          throw new (_builderUtil().InvalidConfigurationError)(`Protocol "${protocol.name}": must be at least one scheme specified`);
        }

        return {
          CFBundleURLName: protocol.name,
          CFBundleTypeRole: protocol.role || "Editor",
          CFBundleURLSchemes: schemes.slice()
        };
      });
    }

    const fileAssociations = packager.fileAssociations;

    if (fileAssociations.length > 0) {
      appPlist.CFBundleDocumentTypes = yield _bluebirdLst().default.map(fileAssociations,
      /*#__PURE__*/
      function () {
        var _ref = (0, _bluebirdLst().coroutine)(function* (fileAssociation) {
          const extensions = (0, _builderUtil().asArray)(fileAssociation.ext).map(_platformPackager().normalizeExt);
          const customIcon = yield packager.getResource((0, _builderUtil().getPlatformIconFileName)(fileAssociation.icon, true), `${extensions[0]}.icns`);
          let iconFile = appPlist.CFBundleIconFile;

          if (customIcon != null) {
            iconFile = path.basename(customIcon);
            yield (0, _fs().copyOrLinkFile)(customIcon, path.join(path.join(contentsPath, "Resources"), iconFile));
          }

          const result = {
            CFBundleTypeExtensions: extensions,
            CFBundleTypeName: fileAssociation.name || extensions[0],
            CFBundleTypeRole: fileAssociation.role || "Editor",
            CFBundleTypeIconFile: iconFile
          };

          if (fileAssociation.isPackage) {
            result.LSTypeIsPackage = true;
          }

          return result;
        });

        return function (_x5) {
          return _ref.apply(this, arguments);
        };
      }());
    }

    if (asarIntegrity != null) {
      appPlist.AsarIntegrity = JSON.stringify(asarIntegrity);
    }

    yield Promise.all([(0, _fsExtraP().writeFile)(appPlistFilename, (0, _plist().build)(appPlist)), (0, _fsExtraP().writeFile)(helperPlistFilename, (0, _plist().build)(helperPlist)), helperEHPlist == null ? Promise.resolve() : (0, _fsExtraP().writeFile)(helperEHPlistFilename, (0, _plist().build)(helperEHPlist)), helperNPPlist == null ? Promise.resolve() : (0, _fsExtraP().writeFile)(helperNPPlistFilename, (0, _plist().build)(helperNPPlist)), helperLoginPlist == null ? Promise.resolve() : (0, _fsExtraP().writeFile)(helperLoginPlistFilename, (0, _plist().build)(helperLoginPlist)), doRename(path.join(contentsPath, "MacOS"), packager.electronDistMacOsExecutableName, appPlist.CFBundleExecutable), (0, _fs().unlinkIfExists)(path.join(appOutDir, "LICENSE")), (0, _fs().unlinkIfExists)(path.join(appOutDir, "LICENSES.chromium.html"))]);
    yield moveHelpers(getAvailableHelperSuffixes(helperEHPlist, helperNPPlist), frameworksPath, appFilename, packager.electronDistMacOsExecutableName);

    if (helperLoginPlist != null) {
      const prefix = packager.electronDistMacOsExecutableName;
      const suffix = " Login Helper";
      const executableBasePath = path.join(loginItemPath, `${prefix}${suffix}.app`, "Contents", "MacOS");
      yield doRename(executableBasePath, `${prefix}${suffix}`, appFilename + suffix).then(() => doRename(loginItemPath, `${prefix}${suffix}.app`, `${appFilename}${suffix}.app`));
    }

    const appPath = path.join(appOutDir, `${appFilename}.app`);
    yield (0, _fsExtraP().rename)(path.dirname(contentsPath), appPath); // https://github.com/electron-userland/electron-builder/issues/840

    const now = Date.now() / 1000;
    yield (0, _fsExtraP().utimes)(appPath, now, now);
  });
  return _createMacApp.apply(this, arguments);
}

function configureLocalhostAts(appPlist) {
  // https://bencoding.com/2015/07/20/app-transport-security-and-localhost/
  let ats = appPlist.NSAppTransportSecurity;

  if (ats == null) {
    ats = {};
    appPlist.NSAppTransportSecurity = ats;
  }

  ats.NSAllowsLocalNetworking = true; // https://github.com/electron-userland/electron-builder/issues/3377#issuecomment-446035814

  ats.NSAllowsArbitraryLoads = true;
  let exceptionDomains = ats.NSExceptionDomains;

  if (exceptionDomains == null) {
    exceptionDomains = {};
    ats.NSExceptionDomains = exceptionDomains;
  }

  if (exceptionDomains.localhost == null) {
    const allowHttp = {
      NSTemporaryExceptionAllowsInsecureHTTPSLoads: false,
      NSIncludesSubdomains: false,
      NSTemporaryExceptionAllowsInsecureHTTPLoads: true,
      NSTemporaryExceptionMinimumTLSVersion: "1.0",
      NSTemporaryExceptionRequiresForwardSecrecy: false
    };
    exceptionDomains.localhost = allowHttp;
    exceptionDomains["127.0.0.1"] = allowHttp;
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=electronMac.js.map{"version":3,"sources":["../../src/electron/electronMac.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { asArray, getPlatformIconFileName, InvalidConfigurationError, log } from \"builder-util\"\nimport { copyOrLinkFile, unlinkIfExists } from \"builder-util/out/fs\"\nimport { orIfFileNotExist } from \"builder-util/out/promise\"\nimport { readFile, rename, utimes, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { build as buildPlist, parse as parsePlist } from \"plist\"\nimport { filterCFBundleIdentifier } from \"../appInfo\"\nimport { AsarIntegrity } from \"../asar/integrity\"\nimport MacPackager from \"../macPackager\"\nimport { normalizeExt } from \"../platformPackager\"\n\nfunction doRename(basePath: string, oldName: string, newName: string) {\n  return rename(path.join(basePath, oldName), path.join(basePath, newName))\n}\n\nfunction moveHelpers(helperSuffixes: Array<string>, frameworksPath: string, appName: string, prefix: string): Promise<any> {\n  return BluebirdPromise.map(helperSuffixes, suffix => {\n    const executableBasePath = path.join(frameworksPath, `${prefix}${suffix}.app`, \"Contents\", \"MacOS\")\n    return doRename(executableBasePath, `${prefix}${suffix}`, appName + suffix)\n      .then(() => doRename(frameworksPath, `${prefix}${suffix}.app`, `${appName}${suffix}.app`))\n  })\n}\n\nfunction getAvailableHelperSuffixes(helperEHPlist: string | null, helperNPPlist: string | null) {\n  const result = [\" Helper\"]\n  if (helperEHPlist != null) {\n    result.push(\" Helper EH\")\n  }\n  if (helperNPPlist != null) {\n    result.push(\" Helper NP\")\n  }\n  return result\n}\n\n/** @internal */\nexport async function createMacApp(packager: MacPackager, appOutDir: string, asarIntegrity: AsarIntegrity | null, isMas: boolean) {\n  const appInfo = packager.appInfo\n  const appFilename = appInfo.productFilename\n\n  const contentsPath = path.join(appOutDir, packager.info.framework.distMacOsAppName, \"Contents\")\n  const frameworksPath = path.join(contentsPath, \"Frameworks\")\n  const loginItemPath = path.join(contentsPath, \"Library\", \"LoginItems\")\n\n  const appPlistFilename = path.join(contentsPath, \"Info.plist\")\n  const helperPlistFilename = path.join(frameworksPath, `${packager.electronDistMacOsExecutableName} Helper.app`, \"Contents\", \"Info.plist\")\n  const helperEHPlistFilename = path.join(frameworksPath, `${packager.electronDistMacOsExecutableName} Helper EH.app`, \"Contents\", \"Info.plist\")\n  const helperNPPlistFilename = path.join(frameworksPath, `${packager.electronDistMacOsExecutableName} Helper NP.app`, \"Contents\", \"Info.plist\")\n  const helperLoginPlistFilename = path.join(loginItemPath, `${packager.electronDistMacOsExecutableName} Login Helper.app`, \"Contents\", \"Info.plist\")\n\n  const buildMetadata = packager.config!\n  const fileContents: Array<string | null> = await BluebirdPromise.map([\n    appPlistFilename,\n    helperPlistFilename,\n    helperEHPlistFilename,\n    helperNPPlistFilename,\n    helperLoginPlistFilename,\n    (buildMetadata as any)[\"extend-info\"]\n  ], it => it == null ? it : orIfFileNotExist(readFile(it, \"utf8\"), null))\n  const appPlist = parsePlist(fileContents[0]!!)\n  const helperPlist = parsePlist(fileContents[1]!!)\n  const helperEHPlist = fileContents[2] == null ? null : parsePlist(fileContents[2]!!)\n  const helperNPPlist = fileContents[3] == null ? null : parsePlist(fileContents[3]!!)\n  const helperLoginPlist = fileContents[4] == null ? null : parsePlist(fileContents[4]!!)\n\n  // if an extend-info file was supplied, copy its contents in first\n  if (fileContents[5] != null) {\n    Object.assign(appPlist, parsePlist(fileContents[5]!!))\n  }\n\n  const oldHelperBundleId = (buildMetadata as any)[\"helper-bundle-id\"]\n  if (oldHelperBundleId != null) {\n    log.warn(\"build.helper-bundle-id is deprecated, please set as build.mac.helperBundleId\")\n  }\n  const helperBundleIdentifier = filterCFBundleIdentifier(packager.platformSpecificBuildOptions.helperBundleId || oldHelperBundleId || `${appInfo.macBundleIdentifier}.helper`)\n\n  await packager.applyCommonInfo(appPlist, contentsPath)\n\n  // required for electron-updater proxy\n  if (!isMas) {\n    configureLocalhostAts(appPlist)\n  }\n\n  helperPlist.CFBundleExecutable = `${appFilename} Helper`\n  helperPlist.CFBundleDisplayName = `${appInfo.productName} Helper`\n  helperPlist.CFBundleIdentifier = helperBundleIdentifier\n  helperPlist.CFBundleVersion = appPlist.CFBundleVersion\n\n  function configureHelper(helper: any, postfix: string) {\n    helper.CFBundleExecutable = `${appFilename} Helper ${postfix}`\n    helper.CFBundleDisplayName = `${appInfo.productName} Helper ${postfix}`\n    helper.CFBundleIdentifier = `${helperBundleIdentifier}.${postfix}`\n    helper.CFBundleVersion = appPlist.CFBundleVersion\n  }\n\n  if (helperEHPlist != null) {\n    configureHelper(helperEHPlist, \"EH\")\n  }\n  if (helperNPPlist != null) {\n    configureHelper(helperNPPlist, \"NP\")\n  }\n  if (helperLoginPlist != null) {\n    helperLoginPlist.CFBundleExecutable = `${appFilename} Login Helper`\n    helperLoginPlist.CFBundleDisplayName = `${appInfo.productName} Login Helper`\n    // noinspection SpellCheckingInspection\n    helperLoginPlist.CFBundleIdentifier = `${appInfo.macBundleIdentifier}.loginhelper`\n    helperLoginPlist.CFBundleVersion = appPlist.CFBundleVersion\n  }\n\n  const protocols = asArray(buildMetadata.protocols).concat(asArray(packager.platformSpecificBuildOptions.protocols))\n  if (protocols.length > 0) {\n    appPlist.CFBundleURLTypes = protocols.map(protocol => {\n      const schemes = asArray(protocol.schemes)\n      if (schemes.length === 0) {\n        throw new InvalidConfigurationError(`Protocol \"${protocol.name}\": must be at least one scheme specified`)\n      }\n      return {\n        CFBundleURLName: protocol.name,\n        CFBundleTypeRole: protocol.role || \"Editor\",\n        CFBundleURLSchemes: schemes.slice()\n      }\n    })\n  }\n\n  const fileAssociations = packager.fileAssociations\n  if (fileAssociations.length > 0) {\n    appPlist.CFBundleDocumentTypes = await BluebirdPromise.map(fileAssociations, async fileAssociation => {\n      const extensions = asArray(fileAssociation.ext).map(normalizeExt)\n      const customIcon = await packager.getResource(getPlatformIconFileName(fileAssociation.icon, true), `${extensions[0]}.icns`)\n      let iconFile = appPlist.CFBundleIconFile\n      if (customIcon != null) {\n        iconFile = path.basename(customIcon)\n        await copyOrLinkFile(customIcon, path.join(path.join(contentsPath, \"Resources\"), iconFile))\n      }\n\n      const result = {\n        CFBundleTypeExtensions: extensions,\n        CFBundleTypeName: fileAssociation.name || extensions[0],\n        CFBundleTypeRole: fileAssociation.role || \"Editor\",\n        CFBundleTypeIconFile: iconFile\n      } as any\n\n      if (fileAssociation.isPackage) {\n        result.LSTypeIsPackage = true\n      }\n      return result\n    })\n  }\n\n  if (asarIntegrity != null) {\n    appPlist.AsarIntegrity = JSON.stringify(asarIntegrity)\n  }\n\n  await Promise.all([\n    writeFile(appPlistFilename, buildPlist(appPlist)),\n    writeFile(helperPlistFilename, buildPlist(helperPlist)),\n    helperEHPlist == null ? Promise.resolve() : writeFile(helperEHPlistFilename, buildPlist(helperEHPlist)),\n    helperNPPlist == null ? Promise.resolve() : writeFile(helperNPPlistFilename, buildPlist(helperNPPlist)),\n    helperLoginPlist == null ? Promise.resolve() : writeFile(helperLoginPlistFilename, buildPlist(helperLoginPlist)),\n    doRename(path.join(contentsPath, \"MacOS\"), packager.electronDistMacOsExecutableName, appPlist.CFBundleExecutable),\n    unlinkIfExists(path.join(appOutDir, \"LICENSE\")),\n    unlinkIfExists(path.join(appOutDir, \"LICENSES.chromium.html\")),\n  ])\n\n  await moveHelpers(getAvailableHelperSuffixes(helperEHPlist, helperNPPlist), frameworksPath, appFilename, packager.electronDistMacOsExecutableName)\n\n  if (helperLoginPlist != null) {\n    const prefix = packager.electronDistMacOsExecutableName\n    const suffix = \" Login Helper\"\n    const executableBasePath = path.join(loginItemPath, `${prefix}${suffix}.app`, \"Contents\", \"MacOS\")\n    await doRename(executableBasePath, `${prefix}${suffix}`, appFilename + suffix)\n      .then(() => doRename(loginItemPath, `${prefix}${suffix}.app`, `${appFilename}${suffix}.app`))\n  }\n\n  const appPath = path.join(appOutDir, `${appFilename}.app`)\n  await rename(path.dirname(contentsPath), appPath)\n  // https://github.com/electron-userland/electron-builder/issues/840\n  const now = Date.now() / 1000\n  await utimes(appPath, now, now)\n}\n\nfunction configureLocalhostAts(appPlist: any) {\n  // https://bencoding.com/2015/07/20/app-transport-security-and-localhost/\n  let ats = appPlist.NSAppTransportSecurity\n  if (ats == null) {\n    ats = {}\n    appPlist.NSAppTransportSecurity = ats\n  }\n\n  ats.NSAllowsLocalNetworking = true\n  // https://github.com/electron-userland/electron-builder/issues/3377#issuecomment-446035814\n  ats.NSAllowsArbitraryLoads = true\n\n  let exceptionDomains = ats.NSExceptionDomains\n  if (exceptionDomains == null) {\n    exceptionDomains = {}\n    ats.NSExceptionDomains = exceptionDomains\n  }\n\n  if (exceptionDomains.localhost == null) {\n    const allowHttp = {\n      NSTemporaryExceptionAllowsInsecureHTTPSLoads: false,\n      NSIncludesSubdomains: false,\n      NSTemporaryExceptionAllowsInsecureHTTPLoads: true,\n      NSTemporaryExceptionMinimumTLSVersion: \"1.0\",\n      NSTemporaryExceptionRequiresForwardSecrecy: false\n    }\n    exceptionDomains.localhost = allowHttp\n    exceptionDomains[\"127.0.0.1\"] = allowHttp\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getElectronVersion = getElectronVersion;
exports.getElectronVersionFromInstalled = getElectronVersionFromInstalled;
exports.computeElectronVersion = computeElectronVersion;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _nodeHttpExecutor() {
  const data = require("builder-util/out/nodeHttpExecutor");

  _nodeHttpExecutor = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function semver() {
  const data = _interopRequireWildcard(require("semver"));

  semver = function () {
    return data;
  };

  return data;
}

function _readConfigFile() {
  const data = require("read-config-file");

  _readConfigFile = function () {
    return data;
  };

  return data;
}

function _config() {
  const data = require("../util/config");

  _config = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function getElectronVersion(_x, _x2) {
  return _getElectronVersion.apply(this, arguments);
}

function _getElectronVersion() {
  _getElectronVersion = (0, _bluebirdLst().coroutine)(function* (projectDir, config, projectMetadata = new (_lazyVal().Lazy)(() => (0, _readConfigFile().orNullIfFileNotExist)((0, _fsExtraP().readJson)(path.join(projectDir, "package.json"))))) {
    if (config == null) {
      config = yield (0, _config().getConfig)(projectDir, null, null);
    }

    if (config.electronVersion != null) {
      return config.electronVersion;
    }

    return yield computeElectronVersion(projectDir, projectMetadata);
  });
  return _getElectronVersion.apply(this, arguments);
}

function getElectronVersionFromInstalled(_x3) {
  return _getElectronVersionFromInstalled.apply(this, arguments);
}
/** @internal */


function _getElectronVersionFromInstalled() {
  _getElectronVersionFromInstalled = (0, _bluebirdLst().coroutine)(function* (projectDir) {
    for (const name of ["electron", "electron-prebuilt", "electron-prebuilt-compile"]) {
      try {
        return (yield (0, _fsExtraP().readJson)(path.join(projectDir, "node_modules", name, "package.json"))).version;
      } catch (e) {
        if (e.code !== "ENOENT") {
          _builderUtil().log.warn({
            name,
            error: e
          }, `cannot read electron version package.json`);
        }
      }
    }

    return null;
  });
  return _getElectronVersionFromInstalled.apply(this, arguments);
}

function computeElectronVersion(_x4, _x5) {
  return _computeElectronVersion.apply(this, arguments);
}

function _computeElectronVersion() {
  _computeElectronVersion = (0, _bluebirdLst().coroutine)(function* (projectDir, projectMetadata) {
    const result = yield getElectronVersionFromInstalled(projectDir);

    if (result != null) {
      return result;
    }

    const electronPrebuiltDep = findFromElectronPrebuilt((yield projectMetadata.value));

    if (electronPrebuiltDep == null || electronPrebuiltDep === "latest") {
      try {
        const releaseInfo = JSON.parse((yield _nodeHttpExecutor().httpExecutor.request({
          hostname: "github.com",
          path: "/electron/electron/releases/latest",
          headers: {
            accept: "application/json"
          }
        })));
        return releaseInfo.tag_name.startsWith("v") ? releaseInfo.tag_name.substring(1) : releaseInfo.tag_name;
      } catch (e) {
        _builderUtil().log.warn(e);
      }

      throw new Error(`Cannot find electron dependency to get electron version in the '${path.join(projectDir, "package.json")}'`);
    }

    const version = semver().coerce(electronPrebuiltDep);

    if (version == null) {
      throw new Error("cannot compute electron version");
    }

    return version.toString();
  });
  return _computeElectronVersion.apply(this, arguments);
}

function findFromElectronPrebuilt(packageData) {
  for (const name of ["electron", "electron-prebuilt", "electron-prebuilt-compile"]) {
    const devDependencies = packageData.devDependencies;
    let dep = devDependencies == null ? null : devDependencies[name];

    if (dep == null) {
      const dependencies = packageData.dependencies;
      dep = dependencies == null ? null : dependencies[name];
    }

    if (dep != null) {
      return dep;
    }
  }

  return null;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=electronVersion.js.map{"version":3,"sources":["../../src/electron/electronVersion.ts"],"names":[],"mappings":"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","sourcesContent":["import { log } from \"builder-util\"\nimport { httpExecutor } from \"builder-util/out/nodeHttpExecutor\"\nimport { readJson } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport * as semver from \"semver\"\nimport { orNullIfFileNotExist } from \"read-config-file\"\nimport { Configuration } from \"../configuration\"\nimport { getConfig } from \"../util/config\"\n\nexport type MetadataValue = Lazy<{ [key: string]: any } | null>\n\nexport async function getElectronVersion(projectDir: string, config?: Configuration, projectMetadata: MetadataValue = new Lazy(() => orNullIfFileNotExist(readJson(path.join(projectDir, \"package.json\"))))): Promise<string> {\n  if (config == null) {\n    config = await getConfig(projectDir, null, null)\n  }\n  if (config.electronVersion != null) {\n    return config.electronVersion\n  }\n  return await computeElectronVersion(projectDir, projectMetadata)\n}\n\nexport async function getElectronVersionFromInstalled(projectDir: string) {\n  for (const name of [\"electron\", \"electron-prebuilt\", \"electron-prebuilt-compile\"]) {\n    try {\n      return (await readJson(path.join(projectDir, \"node_modules\", name, \"package.json\"))).version\n    }\n    catch (e) {\n      if (e.code !== \"ENOENT\") {\n        log.warn({name, error: e}, `cannot read electron version package.json`)\n      }\n    }\n  }\n  return null\n}\n\n/** @internal */\nexport async function computeElectronVersion(projectDir: string, projectMetadata: MetadataValue): Promise<string> {\n  const result = await getElectronVersionFromInstalled(projectDir)\n  if (result != null) {\n    return result\n  }\n\n  const electronPrebuiltDep = findFromElectronPrebuilt(await projectMetadata!!.value)\n  if (electronPrebuiltDep == null || electronPrebuiltDep === \"latest\") {\n    try {\n      const releaseInfo = JSON.parse((await httpExecutor.request({\n        hostname: \"github.com\",\n        path: \"/electron/electron/releases/latest\",\n        headers: {\n          accept: \"application/json\",\n        },\n      }))!!)\n      return (releaseInfo.tag_name.startsWith(\"v\")) ? releaseInfo.tag_name.substring(1) : releaseInfo.tag_name\n    }\n    catch (e) {\n      log.warn(e)\n    }\n\n    throw new Error(`Cannot find electron dependency to get electron version in the '${path.join(projectDir, \"package.json\")}'`)\n  }\n\n  const version = semver.coerce(electronPrebuiltDep)\n  if (version == null) {\n    throw new Error(\"cannot compute electron version\")\n  }\n  return version.toString()\n}\n\nfunction findFromElectronPrebuilt(packageData: any): any {\n  for (const name of [\"electron\", \"electron-prebuilt\", \"electron-prebuilt-compile\"]) {\n    const devDependencies = packageData.devDependencies\n    let dep = devDependencies == null ? null : devDependencies[name]\n    if (dep == null) {\n      const dependencies = packageData.dependencies\n      dep = dependencies == null ? null : dependencies[name]\n    }\n    if (dep != null) {\n      return dep\n    }\n  }\n  return null\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.downloadCertificate = downloadCertificate;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _os() {
  const data = require("os");

  _os = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _binDownload() {
  const data = require("../binDownload");

  _binDownload = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/** @private */
function downloadCertificate(_x, _x2, _x3) {
  return _downloadCertificate.apply(this, arguments);
} function _downloadCertificate() {
  _downloadCertificate = (0, _bluebirdLst().coroutine)(function* (urlOrBase64, tmpDir, currentDir) {
    urlOrBase64 = urlOrBase64.trim();
    let file = null;

    if (urlOrBase64.length > 3 && urlOrBase64[1] === ":" || urlOrBase64.startsWith("/") || urlOrBase64.startsWith(".")) {
      file = urlOrBase64;
    } else if (urlOrBase64.startsWith("file://")) {
      file = urlOrBase64.substring("file://".length);
    } else if (urlOrBase64.startsWith("~/")) {
      file = path.join((0, _os().homedir)(), urlOrBase64.substring("~/".length));
    } else {
      const isUrl = urlOrBase64.startsWith("https://");

      if (isUrl || urlOrBase64.length > 2048 || urlOrBase64.endsWith("=")) {
        const tempFile = yield tmpDir.getTempFile({
          suffix: ".p12"
        });

        if (isUrl) {
          yield (0, _binDownload().download)(urlOrBase64, tempFile);
        } else {
          yield (0, _fsExtraP().outputFile)(tempFile, Buffer.from(urlOrBase64, "base64"));
        }

        return tempFile;
      } else {
        file = urlOrBase64;
      }
    }

    file = path.resolve(currentDir, file);
    const stat = yield (0, _fs().statOrNull)(file);

    if (stat == null) {
      throw new (_builderUtil().InvalidConfigurationError)(`${file} doesn't exist`);
    } else if (!stat.isFile()) {
      throw new (_builderUtil().InvalidConfigurationError)(`${file} not a file`);
    } else {
      return file;
    }
  });
  return _downloadCertificate.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=codesign.js.map{"version":3,"sources":["../../src/codeSign/codesign.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEA;SACsB,mB;;;;;;uDAAf,WAAmC,WAAnC,EAAwD,MAAxD,EAAwE,UAAxE,EAA0F;AAC/F,IAAA,WAAW,GAAG,WAAW,CAAC,IAAZ,EAAd;AAEA,QAAI,IAAI,GAAkB,IAA1B;;AACA,QAAK,WAAW,CAAC,MAAZ,GAAqB,CAArB,IAA0B,WAAW,CAAC,CAAD,CAAX,KAAmB,GAA9C,IAAsD,WAAW,CAAC,UAAZ,CAAuB,GAAvB,CAAtD,IAAqF,WAAW,CAAC,UAAZ,CAAuB,GAAvB,CAAzF,EAAsH;AACpH,MAAA,IAAI,GAAG,WAAP;AACD,KAFD,MAGK,IAAI,WAAW,CAAC,UAAZ,CAAuB,SAAvB,CAAJ,EAAuC;AAC1C,MAAA,IAAI,GAAG,WAAW,CAAC,SAAZ,CAAsB,UAAU,MAAhC,CAAP;AACD,KAFI,MAGA,IAAI,WAAW,CAAC,UAAZ,CAAuB,IAAvB,CAAJ,EAAkC;AACrC,MAAA,IAAI,GAAG,IAAI,CAAC,IAAL,CAAU,oBAAV,EAAqB,WAAW,CAAC,SAAZ,CAAsB,KAAK,MAA3B,CAArB,CAAP;AACD,KAFI,MAGA;AACH,YAAM,KAAK,GAAG,WAAW,CAAC,UAAZ,CAAuB,UAAvB,CAAd;;AACA,UAAI,KAAK,IAAI,WAAW,CAAC,MAAZ,GAAqB,IAA9B,IAAsC,WAAW,CAAC,QAAZ,CAAqB,GAArB,CAA1C,EAAqE;AACnE,cAAM,QAAQ,SAAS,MAAM,CAAC,WAAP,CAAmB;AAAC,UAAA,MAAM,EAAE;AAAT,SAAnB,CAAvB;;AACA,YAAI,KAAJ,EAAW;AACT,gBAAM,6BAAS,WAAT,EAAsB,QAAtB,CAAN;AACD,SAFD,MAGK;AACH,gBAAM,4BAAW,QAAX,EAAqB,MAAM,CAAC,IAAP,CAAY,WAAZ,EAAyB,QAAzB,CAArB,CAAN;AACD;;AACD,eAAO,QAAP;AACD,OATD,MAUK;AACH,QAAA,IAAI,GAAG,WAAP;AACD;AACF;;AAED,IAAA,IAAI,GAAG,IAAI,CAAC,OAAL,CAAa,UAAb,EAAyB,IAAzB,CAAP;AACA,UAAM,IAAI,SAAS,sBAAW,IAAX,CAAnB;;AACA,QAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB,YAAM,KAAI,wCAAJ,EAA8B,GAAG,IAAI,gBAArC,CAAN;AACD,KAFD,MAGK,IAAI,CAAC,IAAI,CAAC,MAAL,EAAL,EAAoB;AACvB,YAAM,KAAI,wCAAJ,EAA8B,GAAG,IAAI,aAArC,CAAN;AACD,KAFI,MAGA;AACH,aAAO,IAAP;AACD;AACF,G","sourcesContent":["import { outputFile } from \"fs-extra-p\"\nimport { homedir } from \"os\"\nimport * as path from \"path\"\nimport { TmpDir } from \"temp-file\"\nimport { InvalidConfigurationError } from \"builder-util\"\nimport { statOrNull } from \"builder-util/out/fs\"\nimport { download } from \"../binDownload\"\n\n/** @private */\nexport async function downloadCertificate(urlOrBase64: string, tmpDir: TmpDir, currentDir: string): Promise<string> {\n  urlOrBase64 = urlOrBase64.trim()\n\n  let file: string | null = null\n  if ((urlOrBase64.length > 3 && urlOrBase64[1] === \":\") || urlOrBase64.startsWith(\"/\") || urlOrBase64.startsWith(\".\")) {\n    file = urlOrBase64\n  }\n  else if (urlOrBase64.startsWith(\"file://\")) {\n    file = urlOrBase64.substring(\"file://\".length)\n  }\n  else if (urlOrBase64.startsWith(\"~/\")) {\n    file = path.join(homedir(), urlOrBase64.substring(\"~/\".length))\n  }\n  else {\n    const isUrl = urlOrBase64.startsWith(\"https://\")\n    if (isUrl || urlOrBase64.length > 2048 || urlOrBase64.endsWith(\"=\")) {\n      const tempFile = await tmpDir.getTempFile({suffix: \".p12\"})\n      if (isUrl) {\n        await download(urlOrBase64, tempFile)\n      }\n      else {\n        await outputFile(tempFile, Buffer.from(urlOrBase64, \"base64\"))\n      }\n      return tempFile\n    }\n    else {\n      file = urlOrBase64\n    }\n  }\n\n  file = path.resolve(currentDir, file)\n  const stat = await statOrNull(file)\n  if (stat == null) {\n    throw new InvalidConfigurationError(`${file} doesn't exist`)\n  }\n  else if (!stat.isFile()) {\n    throw new InvalidConfigurationError(`${file} not a file`)\n  }\n  else {\n    return file\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isSignAllowed = isSignAllowed;
exports.reportError = reportError;
exports.createKeychain = createKeychain;
exports.sign = sign;
exports.findIdentity = findIdentity;
exports.findIdentityRawResult = exports.appleCertificatePrefixes = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _util() {
  const data = require("builder-util/out/util");

  _util = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _log() {
  const data = require("builder-util/out/log");

  _log = function () {
    return data;
  };

  return data;
}

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

function _os() {
  const data = require("os");

  _os = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _tempFile() {
  const data = require("temp-file");

  _tempFile = function () {
    return data;
  };

  return data;
}

function _flags() {
  const data = require("../util/flags");

  _flags = function () {
    return data;
  };

  return data;
}

function _macosVersion() {
  const data = require("../util/macosVersion");

  _macosVersion = function () {
    return data;
  };

  return data;
}

function _codesign() {
  const data = require("./codesign");

  _codesign = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const appleCertificatePrefixes = ["Developer ID Application:", "Developer ID Installer:", "3rd Party Mac Developer Application:", "3rd Party Mac Developer Installer:"];
exports.appleCertificatePrefixes = appleCertificatePrefixes;

function isSignAllowed(isPrintWarn = true) {
  if (process.platform !== "darwin") {
    if (isPrintWarn) {
      _util().log.warn({
        reason: "supported only on macOS"
      }, "skipped macOS application code signing");
    }

    return false;
  }

  const buildForPrWarning = "There are serious security concerns with CSC_FOR_PULL_REQUEST=true (see the  CircleCI documentation (https://circleci.com/docs/1.0/fork-pr-builds/) for details)" + "\nIf you have SSH keys, sensitive env vars or AWS credentials stored in your project settings and untrusted forks can make pull requests against your repo, then this option isn't for you.";

  if ((0, _util().isPullRequest)()) {
    if ((0, _util().isEnvTrue)(process.env.CSC_FOR_PULL_REQUEST)) {
      if (isPrintWarn) {
        _util().log.warn(buildForPrWarning);
      }
    } else {
      if (isPrintWarn) {
        // https://github.com/electron-userland/electron-builder/issues/1524
        _util().log.warn("Current build is a part of pull request, code signing will be skipped." + "\nSet env CSC_FOR_PULL_REQUEST to true to force code signing." + `\n${buildForPrWarning}`);
      }

      return false;
    }
  }

  return true;
}

function reportError(_x, _x2, _x3, _x4, _x5) {
  return _reportError.apply(this, arguments);
} // "Note that filename will not be searched to resolve the signing identity's certificate chain unless it is also on the user's keychain search list."
// but "security list-keychains" doesn't support add - we should 1) get current list 2) set new list - it is very bad http://stackoverflow.com/questions/10538942/add-a-keychain-to-search-list
// "overly complicated and introduces a race condition."
// https://github.com/electron-userland/electron-builder/issues/398


function _reportError() {
  _reportError = (0, _bluebirdLst().coroutine)(function* (isMas, certificateType, qualifier, keychainName, isForceCodeSigning) {
    const logFields = {};

    if (qualifier == null) {
      logFields.reason = "";

      if ((0, _flags().isAutoDiscoveryCodeSignIdentity)()) {
        logFields.reason += `cannot find valid "${certificateType}" identity${isMas ? "" : ` or custom non-Apple code signing certificate`}`;
      }

      logFields.reason += ", see https://electron.build/code-signing";

      if (!(0, _flags().isAutoDiscoveryCodeSignIdentity)()) {
        logFields.CSC_IDENTITY_AUTO_DISCOVERY = false;
      }
    } else {
      logFields.reason = "Identity name is specified, but no valid identity with this name in the keychain";
      logFields.identity = qualifier;
    }

    const args = ["find-identity"];

    if (keychainName != null) {
      args.push(keychainName);
    }

    if (qualifier != null || (0, _flags().isAutoDiscoveryCodeSignIdentity)()) {
      logFields.allIdentities = (yield (0, _util().exec)("security", args)).trim().split("\n").filter(it => !(it.includes("Policy: X.509 Basic") || it.includes("Matching identities"))).join("\n");
    }

    if (isMas || isForceCodeSigning) {
      throw new Error(_log().Logger.createMessage("skipped macOS application code signing", logFields, "error", it => it));
    } else {
      _util().log.warn(logFields, "skipped macOS application code signing");
    }
  });
  return _reportError.apply(this, arguments);
}

const bundledCertKeychainAdded = new (_lazyVal().Lazy)(
/*#__PURE__*/
(0, _bluebirdLst().coroutine)(function* () {
  // copy to temp and then atomic rename to final path
  const cacheDir = getCacheDirectory();
  const tmpKeychainPath = path.join(cacheDir, (0, _tempFile().getTempName)("electron-builder-root-certs"));
  const keychainPath = path.join(cacheDir, "electron-builder-root-certs.keychain");
  const results = yield Promise.all([listUserKeychains(), (0, _fs().copyFile)(path.join(__dirname, "..", "..", "certs", "root_certs.keychain"), tmpKeychainPath).then(() => (0, _fsExtraP().rename)(tmpKeychainPath, keychainPath))]);
  const list = results[0];

  if (!list.includes(keychainPath)) {
    yield (0, _util().exec)("security", ["list-keychains", "-d", "user", "-s", keychainPath].concat(list));
  }
}));

function getCacheDirectory() {
  const env = process.env.ELECTRON_BUILDER_CACHE;
  return (0, _util().isEmptyOrSpaces)(env) ? path.join((0, _os().homedir)(), "Library", "Caches", "electron-builder") : path.resolve(env);
}

function listUserKeychains() {
  return (0, _util().exec)("security", ["list-keychains", "-d", "user"]).then(it => it.split("\n").map(it => {
    const r = it.trim();
    return r.substring(1, r.length - 1);
  }).filter(it => it.length > 0));
}

function removeKeychain(_x6) {
  return _removeKeychain.apply(this, arguments);
}

function _removeKeychain() {
  _removeKeychain = (0, _bluebirdLst().coroutine)(function* (keychainFile) {
    try {
      yield (0, _util().exec)("security", ["delete-keychain", keychainFile]);
    } catch (e) {
      console.warn(`Cannot delete keychain ${keychainFile}: ${e.stack || e}`);
      yield (0, _fs().unlinkIfExists)(keychainFile);
    }
  });
  return _removeKeychain.apply(this, arguments);
}

function createKeychain(_x7) {
  return _createKeychain.apply(this, arguments);
}

function _createKeychain() {
  _createKeychain = (0, _bluebirdLst().coroutine)(function* ({
    tmpDir,
    cscLink,
    cscKeyPassword,
    cscILink,
    cscIKeyPassword,
    currentDir
  }) {
    // travis has correct AppleWWDRCA cert
    if (process.env.TRAVIS !== "true") {
      yield bundledCertKeychainAdded.value;
    }

    const keychainFile = yield tmpDir.getTempFile({
      suffix: ".keychain",
      disposer: removeKeychain
    });
    const certLinks = [cscLink];

    if (cscILink != null) {
      certLinks.push(cscILink);
    }

    const certPaths = new Array(certLinks.length);
    const keychainPassword = (0, _crypto().randomBytes)(8).toString("base64");
    const securityCommands = [["create-keychain", "-p", keychainPassword, keychainFile], ["unlock-keychain", "-p", keychainPassword, keychainFile], ["set-keychain-settings", keychainFile]]; // https://stackoverflow.com/questions/42484678/codesign-keychain-gets-ignored
    // https://github.com/electron-userland/electron-builder/issues/1457

    const list = yield listUserKeychains();

    if (!list.includes(keychainFile)) {
      securityCommands.push(["list-keychains", "-d", "user", "-s", keychainFile].concat(list));
    }

    yield Promise.all([// we do not clear downloaded files - will be removed on tmpDir cleanup automatically. not a security issue since in any case data is available as env variables and protected by password.
    _bluebirdLst().default.map(certLinks, (link, i) => (0, _codesign().downloadCertificate)(link, tmpDir, currentDir).then(it => certPaths[i] = it)), _bluebirdLst().default.mapSeries(securityCommands, it => (0, _util().exec)("security", it))]);
    return yield importCerts(keychainFile, certPaths, [cscKeyPassword, cscIKeyPassword].filter(it => it != null));
  });
  return _createKeychain.apply(this, arguments);
}

function importCerts(_x8, _x9, _x10) {
  return _importCerts.apply(this, arguments);
}
/** @private */


function _importCerts() {
  _importCerts = (0, _bluebirdLst().coroutine)(function* (keychainName, paths, keyPasswords) {
    for (let i = 0; i < paths.length; i++) {
      const password = keyPasswords[i];
      yield (0, _util().exec)("security", ["import", paths[i], "-k", keychainName, "-T", "/usr/bin/codesign", "-T", "/usr/bin/productbuild", "-P", password]); // https://stackoverflow.com/questions/39868578/security-codesign-in-sierra-keychain-ignores-access-control-settings-and-ui-p
      // https://github.com/electron-userland/electron-packager/issues/701#issuecomment-322315996

      if (yield (0, _macosVersion().isMacOsSierra)()) {
        yield (0, _util().exec)("security", ["set-key-partition-list", "-S", "apple-tool:,apple:", "-s", "-k", password, keychainName]);
      }
    }

    return {
      keychainName
    };
  });
  return _importCerts.apply(this, arguments);
}

function sign(path, name, keychain) {
  const args = ["--deep", "--force", "--sign", name, path];

  if (keychain != null) {
    args.push("--keychain", keychain);
  }

  return (0, _util().exec)("codesign", args);
}

let findIdentityRawResult = null;
exports.findIdentityRawResult = findIdentityRawResult;

function getValidIdentities(_x11) {
  return _getValidIdentities.apply(this, arguments);
}

function _getValidIdentities() {
  _getValidIdentities = (0, _bluebirdLst().coroutine)(function* (keychain) {
    function addKeychain(args) {
      if (keychain != null) {
        args.push(keychain);
      }

      return args;
    }

    let result = findIdentityRawResult;

    if (result == null || keychain != null) {
      // https://github.com/electron-userland/electron-builder/issues/481
      // https://github.com/electron-userland/electron-builder/issues/535
      result = Promise.all([(0, _util().exec)("security", addKeychain(["find-identity", "-v"])).then(it => it.trim().split("\n").filter(it => {
        for (const prefix of appleCertificatePrefixes) {
          if (it.includes(prefix)) {
            return true;
          }
        }

        return false;
      })), (0, _util().exec)("security", addKeychain(["find-identity", "-v", "-p", "codesigning"])).then(it => it.trim().split("\n"))]).then(it => {
        const array = it[0].concat(it[1]).filter(it => !it.includes("(Missing required extension)") && !it.includes("valid identities found") && !it.includes("iPhone ") && !it.includes("com.apple.idms.appleid.prd.")) // remove 1)
        .map(it => it.substring(it.indexOf(")") + 1).trim());
        return Array.from(new Set(array));
      });

      if (keychain == null) {
        exports.findIdentityRawResult = findIdentityRawResult = result;
      }
    }

    return result;
  });
  return _getValidIdentities.apply(this, arguments);
}

function _findIdentity(_x12, _x13, _x14) {
  return _findIdentity2.apply(this, arguments);
}

function _findIdentity2() {
  _findIdentity2 = (0, _bluebirdLst().coroutine)(function* (type, qualifier, keychain) {
    // https://github.com/electron-userland/electron-builder/issues/484
    //noinspection SpellCheckingInspection
    const lines = yield getValidIdentities(keychain);
    const namePrefix = `${type}:`;

    for (const line of lines) {
      if (qualifier != null && !line.includes(qualifier)) {
        continue;
      }

      if (line.includes(namePrefix)) {
        return parseIdentity(line);
      }
    }

    if (type === "Developer ID Application") {
      // find non-Apple certificate
      // https://github.com/electron-userland/electron-builder/issues/458
      l: for (const line of lines) {
        if (qualifier != null && !line.includes(qualifier)) {
          continue;
        }

        if (line.includes("Mac Developer:")) {
          continue;
        }

        for (const prefix of appleCertificatePrefixes) {
          if (line.includes(prefix)) {
            continue l;
          }
        }

        return parseIdentity(line);
      }
    }

    return null;
  });
  return _findIdentity2.apply(this, arguments);
}

const _Identity = require("electron-osx-sign/util-identities").Identity;

function parseIdentity(line) {
  const firstQuoteIndex = line.indexOf('"');
  const name = line.substring(firstQuoteIndex + 1, line.lastIndexOf('"'));
  const hash = line.substring(0, firstQuoteIndex - 1);
  return new _Identity(name, hash);
}

function findIdentity(certType, qualifier, keychain) {
  let identity = qualifier || process.env.CSC_NAME;

  if ((0, _util().isEmptyOrSpaces)(identity)) {
    if ((0, _flags().isAutoDiscoveryCodeSignIdentity)()) {
      return _findIdentity(certType, null, keychain);
    } else {
      return Promise.resolve(null);
    }
  } else {
    identity = identity.trim();

    for (const prefix of appleCertificatePrefixes) {
      checkPrefix(identity, prefix);
    }

    return _findIdentity(certType, identity, keychain);
  }
}

function checkPrefix(name, prefix) {
  if (name.startsWith(prefix)) {
    throw new (_util().InvalidConfigurationError)(`Please remove prefix "${prefix}" from the specified name â€” appropriate certificate will be chosen automatically`);
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=macCodeSign.js.map{"version":3,"sources":["../../src/codeSign/macCodeSign.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { exec, InvalidConfigurationError, isEmptyOrSpaces, isEnvTrue, isPullRequest, log, TmpDir } from \"builder-util/out/util\"\nimport { copyFile, unlinkIfExists } from \"builder-util/out/fs\"\nimport { Fields, Logger } from \"builder-util/out/log\"\nimport { randomBytes } from \"crypto\"\nimport { rename } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport { homedir } from \"os\"\nimport * as path from \"path\"\nimport { getTempName } from \"temp-file\"\nimport { isAutoDiscoveryCodeSignIdentity } from \"../util/flags\"\nimport { isMacOsSierra } from \"../util/macosVersion\"\nimport { downloadCertificate } from \"./codesign\"\n\nexport const appleCertificatePrefixes = [\"Developer ID Application:\", \"Developer ID Installer:\", \"3rd Party Mac Developer Application:\", \"3rd Party Mac Developer Installer:\"]\n\nexport type CertType = \"Developer ID Application\" | \"Developer ID Installer\" | \"3rd Party Mac Developer Application\" | \"3rd Party Mac Developer Installer\" | \"Mac Developer\"\n\nexport interface CodeSigningInfo {\n  keychainName?: string | null\n}\n\nexport function isSignAllowed(isPrintWarn = true): boolean {\n  if (process.platform !== \"darwin\") {\n    if (isPrintWarn) {\n      log.warn({reason: \"supported only on macOS\"}, \"skipped macOS application code signing\")\n    }\n    return false\n  }\n\n  const buildForPrWarning = \"There are serious security concerns with CSC_FOR_PULL_REQUEST=true (see the  CircleCI documentation (https://circleci.com/docs/1.0/fork-pr-builds/) for details)\" +\n    \"\\nIf you have SSH keys, sensitive env vars or AWS credentials stored in your project settings and untrusted forks can make pull requests against your repo, then this option isn't for you.\"\n\n  if (isPullRequest()) {\n    if (isEnvTrue(process.env.CSC_FOR_PULL_REQUEST)) {\n      if (isPrintWarn) {\n        log.warn(buildForPrWarning)\n      }\n    }\n    else {\n      if (isPrintWarn) {\n        // https://github.com/electron-userland/electron-builder/issues/1524\n        log.warn(\"Current build is a part of pull request, code signing will be skipped.\" +\n          \"\\nSet env CSC_FOR_PULL_REQUEST to true to force code signing.\" +\n          `\\n${buildForPrWarning}`)\n      }\n      return false\n    }\n  }\n  return true\n}\n\nexport async function reportError(isMas: boolean, certificateType: CertType, qualifier: string | null | undefined, keychainName: string | null | undefined, isForceCodeSigning: boolean) {\n  const logFields: Fields = {}\n  if (qualifier == null) {\n    logFields.reason = \"\"\n    if (isAutoDiscoveryCodeSignIdentity()) {\n      logFields.reason += `cannot find valid \"${certificateType}\" identity${(isMas ? \"\" : ` or custom non-Apple code signing certificate`)}`\n    }\n    logFields.reason += \", see https://electron.build/code-signing\"\n    if (!isAutoDiscoveryCodeSignIdentity()) {\n      logFields.CSC_IDENTITY_AUTO_DISCOVERY = false\n    }\n  }\n  else {\n    logFields.reason = \"Identity name is specified, but no valid identity with this name in the keychain\"\n    logFields.identity = qualifier\n  }\n\n  const args = [\"find-identity\"]\n  if (keychainName != null) {\n    args.push(keychainName)\n  }\n\n  if (qualifier != null || isAutoDiscoveryCodeSignIdentity()) {\n    logFields.allIdentities = (await exec(\"security\", args))\n      .trim()\n      .split(\"\\n\")\n      .filter(it => !(it.includes(\"Policy: X.509 Basic\") || it.includes(\"Matching identities\")))\n      .join(\"\\n\")\n  }\n\n  if (isMas || isForceCodeSigning) {\n    throw new Error(Logger.createMessage(\"skipped macOS application code signing\", logFields, \"error\", it => it))\n  }\n  else {\n    log.warn(logFields, \"skipped macOS application code signing\")\n  }\n}\n\n// \"Note that filename will not be searched to resolve the signing identity's certificate chain unless it is also on the user's keychain search list.\"\n// but \"security list-keychains\" doesn't support add - we should 1) get current list 2) set new list - it is very bad http://stackoverflow.com/questions/10538942/add-a-keychain-to-search-list\n// \"overly complicated and introduces a race condition.\"\n// https://github.com/electron-userland/electron-builder/issues/398\nconst bundledCertKeychainAdded = new Lazy<void>(async () => {\n  // copy to temp and then atomic rename to final path\n  const cacheDir = getCacheDirectory()\n  const tmpKeychainPath = path.join(cacheDir, getTempName(\"electron-builder-root-certs\"))\n  const keychainPath = path.join(cacheDir, \"electron-builder-root-certs.keychain\")\n  const results = await Promise.all<any>([\n    listUserKeychains(),\n    copyFile(path.join(__dirname, \"..\", \"..\", \"certs\", \"root_certs.keychain\"), tmpKeychainPath)\n      .then(() => rename(tmpKeychainPath, keychainPath)),\n  ])\n  const list = results[0]\n  if (!list.includes(keychainPath)) {\n    await exec(\"security\", [\"list-keychains\", \"-d\", \"user\", \"-s\", keychainPath].concat(list))\n  }\n})\n\nfunction getCacheDirectory(): string {\n  const env = process.env.ELECTRON_BUILDER_CACHE\n  return isEmptyOrSpaces(env) ? path.join(homedir(), \"Library\", \"Caches\", \"electron-builder\") : path.resolve(env!!)\n}\n\nfunction listUserKeychains(): Promise<Array<string>> {\n  return exec(\"security\", [\"list-keychains\", \"-d\", \"user\"])\n    .then(it => it\n      .split(\"\\n\")\n      .map(it => {\n        const r = it.trim()\n        return r.substring(1, r.length - 1)\n      })\n      .filter(it => it.length > 0))\n}\n\nexport interface CreateKeychainOptions {\n  tmpDir: TmpDir\n  cscLink: string\n  cscKeyPassword: string\n  cscILink?: string | null\n  cscIKeyPassword?: string | null\n  currentDir: string\n}\n\nasync function removeKeychain(keychainFile: string) {\n  try {\n    await exec(\"security\", [\"delete-keychain\", keychainFile])\n  }\n  catch (e) {\n    console.warn(`Cannot delete keychain ${keychainFile}: ${e.stack || e}`)\n    await unlinkIfExists(keychainFile)\n  }\n}\n\nexport async function createKeychain({tmpDir, cscLink, cscKeyPassword, cscILink, cscIKeyPassword, currentDir}: CreateKeychainOptions): Promise<CodeSigningInfo> {\n  // travis has correct AppleWWDRCA cert\n  if (process.env.TRAVIS !== \"true\") {\n    await bundledCertKeychainAdded.value\n  }\n\n  const keychainFile = await tmpDir.getTempFile({suffix: \".keychain\", disposer: removeKeychain})\n\n  const certLinks = [cscLink]\n  if (cscILink != null) {\n    certLinks.push(cscILink)\n  }\n\n  const certPaths = new Array(certLinks.length)\n  const keychainPassword = randomBytes(8).toString(\"base64\")\n  const securityCommands = [\n    [\"create-keychain\", \"-p\", keychainPassword, keychainFile],\n    [\"unlock-keychain\", \"-p\", keychainPassword, keychainFile],\n    [\"set-keychain-settings\", keychainFile]\n  ]\n\n  // https://stackoverflow.com/questions/42484678/codesign-keychain-gets-ignored\n  // https://github.com/electron-userland/electron-builder/issues/1457\n  const list = await listUserKeychains()\n  if (!list.includes(keychainFile)) {\n    securityCommands.push([\"list-keychains\", \"-d\", \"user\", \"-s\", keychainFile].concat(list))\n  }\n\n  await Promise.all([\n    // we do not clear downloaded files - will be removed on tmpDir cleanup automatically. not a security issue since in any case data is available as env variables and protected by password.\n    BluebirdPromise.map(certLinks, (link, i) => downloadCertificate(link, tmpDir, currentDir).then(it => certPaths[i] = it)),\n    BluebirdPromise.mapSeries(securityCommands, it => exec(\"security\", it))\n  ])\n  return await importCerts(keychainFile, certPaths, [cscKeyPassword, cscIKeyPassword].filter(it => it != null) as Array<string>)\n}\n\nasync function importCerts(keychainName: string, paths: Array<string>, keyPasswords: Array<string>): Promise<CodeSigningInfo> {\n  for (let i = 0; i < paths.length; i++) {\n    const password = keyPasswords[i]\n    await exec(\"security\", [\"import\", paths[i], \"-k\", keychainName, \"-T\", \"/usr/bin/codesign\", \"-T\", \"/usr/bin/productbuild\", \"-P\", password])\n\n    // https://stackoverflow.com/questions/39868578/security-codesign-in-sierra-keychain-ignores-access-control-settings-and-ui-p\n    // https://github.com/electron-userland/electron-packager/issues/701#issuecomment-322315996\n    if (await isMacOsSierra()) {\n      await exec(\"security\", [\"set-key-partition-list\", \"-S\", \"apple-tool:,apple:\", \"-s\", \"-k\", password, keychainName])\n    }\n  }\n\n  return {\n    keychainName,\n  }\n}\n\n/** @private */\nexport function sign(path: string, name: string, keychain: string): Promise<any> {\n  const args = [\"--deep\", \"--force\", \"--sign\", name, path]\n  if (keychain != null) {\n    args.push(\"--keychain\", keychain)\n  }\n  return exec(\"codesign\", args)\n}\n\nexport let findIdentityRawResult: Promise<Array<string>> | null = null\n\nasync function getValidIdentities(keychain?: string | null): Promise<Array<string>> {\n  function addKeychain(args: Array<string>) {\n    if (keychain != null) {\n      args.push(keychain)\n    }\n    return args\n  }\n\n  let result = findIdentityRawResult\n  if (result == null || keychain != null) {\n    // https://github.com/electron-userland/electron-builder/issues/481\n    // https://github.com/electron-userland/electron-builder/issues/535\n    result = Promise.all<Array<string>>([\n      exec(\"security\", addKeychain([\"find-identity\", \"-v\"]))\n        .then(it => it.trim().split(\"\\n\").filter(it => {\n          for (const prefix of appleCertificatePrefixes) {\n            if (it.includes(prefix)) {\n              return true\n            }\n          }\n          return false\n        })),\n      exec(\"security\", addKeychain([\"find-identity\", \"-v\", \"-p\", \"codesigning\"]))\n        .then(it => it.trim().split((\"\\n\"))),\n    ])\n      .then(it => {\n        const array = it[0].concat(it[1])\n          .filter(it => !it.includes(\"(Missing required extension)\") && !it.includes(\"valid identities found\") && !it.includes(\"iPhone \") && !it.includes(\"com.apple.idms.appleid.prd.\"))\n          // remove 1)\n          .map(it => it.substring(it.indexOf(\")\") + 1).trim())\n        return Array.from(new Set(array))\n      })\n\n    if (keychain == null) {\n      findIdentityRawResult = result\n    }\n  }\n  return result\n}\n\nasync function _findIdentity(type: CertType, qualifier?: string | null, keychain?: string | null): Promise<Identity | null> {\n  // https://github.com/electron-userland/electron-builder/issues/484\n  //noinspection SpellCheckingInspection\n  const lines = await getValidIdentities(keychain)\n  const namePrefix = `${type}:`\n  for (const line of lines) {\n    if (qualifier != null && !line.includes(qualifier)) {\n      continue\n    }\n\n    if (line.includes(namePrefix)) {\n      return parseIdentity(line)\n    }\n  }\n\n  if (type === \"Developer ID Application\") {\n    // find non-Apple certificate\n    // https://github.com/electron-userland/electron-builder/issues/458\n    l: for (const line of lines) {\n      if (qualifier != null && !line.includes(qualifier)) {\n        continue\n      }\n\n      if (line.includes(\"Mac Developer:\")) {\n        continue\n      }\n\n      for (const prefix of appleCertificatePrefixes) {\n        if (line.includes(prefix)) {\n          continue l\n        }\n      }\n\n      return parseIdentity(line)\n    }\n  }\n  return null\n}\n\nexport declare class Identity {\n  readonly name: string\n  readonly hash: string\n\n  constructor(name: string, hash: string)\n}\n\nconst _Identity = require(\"electron-osx-sign/util-identities\").Identity\n\nfunction parseIdentity(line: string): Identity {\n  const firstQuoteIndex = line.indexOf('\"')\n  const name = line.substring(firstQuoteIndex + 1, line.lastIndexOf('\"'))\n  const hash = line.substring(0, firstQuoteIndex - 1)\n  return new _Identity(name, hash)\n}\n\nexport function findIdentity(certType: CertType, qualifier?: string | null, keychain?: string | null): Promise<Identity | null> {\n  let identity = qualifier || process.env.CSC_NAME\n  if (isEmptyOrSpaces(identity)) {\n    if (isAutoDiscoveryCodeSignIdentity()) {\n      return _findIdentity(certType, null, keychain)\n    }\n    else {\n      return Promise.resolve(null)\n    }\n  }\n  else {\n    identity = identity!.trim()\n    for (const prefix of appleCertificatePrefixes) {\n      checkPrefix(identity, prefix)\n    }\n    return _findIdentity(certType, identity, keychain)\n  }\n}\n\nfunction checkPrefix(name: string, prefix: string) {\n  if (name.startsWith(prefix)) {\n    throw new InvalidConfigurationError(`Please remove prefix \"${prefix}\" from the specified name â€” appropriate certificate will be chosen automatically`)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getSignVendorPath = getSignVendorPath;
exports.sign = sign;
exports.getCertInfo = getCertInfo;
exports.getCertificateFromStoreInfo = getCertificateFromStoreInfo;
exports.isOldWin6 = isOldWin6;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _util() {
  const data = require("builder-util/out/util");

  _util = function () {
    return data;
  };

  return data;
}

function _binDownload() {
  const data = require("../binDownload");

  _binDownload = function () {
    return data;
  };

  return data;
}

function _appBuilder() {
  const data = require("../util/appBuilder");

  _appBuilder = function () {
    return data;
  };

  return data;
}

function _bundledTool() {
  const data = require("../util/bundledTool");

  _bundledTool = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function os() {
  const data = _interopRequireWildcard(require("os"));

  os = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _platformPackager() {
  const data = require("../platformPackager");

  _platformPackager = function () {
    return data;
  };

  return data;
}

function _flags() {
  const data = require("../util/flags");

  _flags = function () {
    return data;
  };

  return data;
}

function _vm() {
  const data = require("../vm/vm");

  _vm = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function getSignVendorPath() {
  return (0, _binDownload().getBin)("winCodeSign");
}

function sign(_x, _x2) {
  return _sign.apply(this, arguments);
}

function _sign() {
  _sign = (0, _bluebirdLst().coroutine)(function* (options, packager) {
    let hashes = options.options.signingHashAlgorithms; // msi does not support dual-signing

    if (options.path.endsWith(".msi")) {
      hashes = [hashes != null && !hashes.includes("sha1") ? "sha256" : "sha1"];
    } else if (options.path.endsWith(".appx")) {
      hashes = ["sha256"];
    } else if (hashes == null) {
      hashes = ["sha1", "sha256"];
    } else {
      hashes = Array.isArray(hashes) ? hashes : [hashes];
    }

    function defaultExecutor(configuration) {
      return doSign(configuration, packager);
    }

    const executor = (0, _platformPackager().resolveFunction)(options.options.sign, "sign") || defaultExecutor;
    let isNest = false;

    for (const hash of hashes) {
      const taskConfiguration = Object.assign({}, options, {
        hash,
        isNest
      });
      yield executor(Object.assign({}, taskConfiguration, {
        computeSignToolArgs: isWin => computeSignToolArgs(taskConfiguration, isWin)
      }));
      isNest = true;

      if (taskConfiguration.resultOutputPath != null) {
        yield (0, _fsExtraP().rename)(taskConfiguration.resultOutputPath, options.path);
      }
    }
  });
  return _sign.apply(this, arguments);
}

function getCertInfo(_x3, _x4) {
  return _getCertInfo.apply(this, arguments);
}

function _getCertInfo() {
  _getCertInfo = (0, _bluebirdLst().coroutine)(function* (file, password) {
    let result = null;

    try {
      result = yield (0, _appBuilder().executeAppBuilderAsJson)(["certificate-info", "--input", file, "--password", password]);
    } catch (e) {
      throw new Error(`Cannot extract publisher name from code signing certificate, please file issue. As workaround, set win.publisherName: ${e.stack || e}`);
    }

    if (result.error != null) {
      // noinspection ExceptionCaughtLocallyJS
      throw new (_util().InvalidConfigurationError)(`Cannot extract publisher name from code signing certificate: ${result.error}`);
    }

    return result;
  });
  return _getCertInfo.apply(this, arguments);
}

function getCertificateFromStoreInfo(_x5, _x6) {
  return _getCertificateFromStoreInfo.apply(this, arguments);
}

function _getCertificateFromStoreInfo() {
  _getCertificateFromStoreInfo = (0, _bluebirdLst().coroutine)(function* (options, vm) {
    const certificateSubjectName = options.certificateSubjectName;
    const certificateSha1 = options.certificateSha1; // ExcludeProperty doesn't work, so, we cannot exclude RawData, it is ok
    // powershell can return object if the only item

    const rawResult = yield vm.exec("powershell.exe", ["Get-ChildItem -Recurse Cert: -CodeSigningCert | Select-Object -Property Subject,PSParentPath,Thumbprint | ConvertTo-Json -Compress"]);
    const certList = rawResult.length === 0 ? [] : (0, _util().asArray)(JSON.parse(rawResult));

    for (const certInfo of certList) {
      if (certificateSubjectName != null) {
        if (!certInfo.Subject.includes(certificateSubjectName)) {
          continue;
        }
      } else if (certInfo.Thumbprint !== certificateSha1) {
        continue;
      }

      const parentPath = certInfo.PSParentPath;
      const store = parentPath.substring(parentPath.lastIndexOf("\\") + 1);

      _util().log.debug({
        store,
        PSParentPath: parentPath
      }, "auto-detect certificate store"); // https://github.com/electron-userland/electron-builder/issues/1717


      const isLocalMachineStore = parentPath.includes("Certificate::LocalMachine");

      _util().log.debug(null, "auto-detect using of LocalMachine store");

      return {
        thumbprint: certInfo.Thumbprint,
        subject: certInfo.Subject,
        store,
        isLocalMachineStore
      };
    }

    throw new Error(`Cannot find certificate ${certificateSubjectName || certificateSha1}, all certs: ${rawResult}`);
  });
  return _getCertificateFromStoreInfo.apply(this, arguments);
}

function doSign(_x7, _x8) {
  return _doSign.apply(this, arguments);
} // on windows be aware of http://stackoverflow.com/a/32640183/1910191


function _doSign() {
  _doSign = (0, _bluebirdLst().coroutine)(function* (configuration, packager) {
    // https://github.com/electron-userland/electron-builder/pull/1944
    const timeout = parseInt(process.env.SIGNTOOL_TIMEOUT, 10) || 10 * 60 * 1000;
    let tool;
    let args;
    let env = process.env;
    let vm;

    if (configuration.path.endsWith(".appx") || !("file" in configuration.cscInfo)
    /* certificateSubjectName and other such options */
    ) {
        vm = yield packager.vm.value;
        tool = getWinSignTool((yield getSignVendorPath()));
        args = computeSignToolArgs(configuration, true, vm);
      } else {
      vm = new (_vm().VmManager)();
      const toolInfo = yield getToolPath();
      tool = toolInfo.path;
      args = configuration.computeSignToolArgs(process.platform === "win32");

      if (toolInfo.env != null) {
        env = toolInfo.env;
      }
    }

    try {
      yield vm.exec(tool, args, {
        timeout,
        env
      });
    } catch (e) {
      if (e.message.includes("The file is being used by another process") || e.message.includes("The specified timestamp server either could not be reached")) {
        _util().log.warn(`First attempt to code sign failed, another attempt will be made in 2 seconds: ${e.message}`);

        yield new Promise((resolve, reject) => {
          setTimeout(() => {
            vm.exec(tool, args, {
              timeout,
              env
            }).then(resolve).catch(reject);
          }, 2000);
        });
      }

      throw e;
    }
  });
  return _doSign.apply(this, arguments);
}

function computeSignToolArgs(options, isWin, vm = new (_vm().VmManager)()) {
  const inputFile = vm.toVmFile(options.path);
  const outputPath = isWin ? inputFile : getOutputPath(inputFile, options.hash);

  if (!isWin) {
    options.resultOutputPath = outputPath;
  }

  const args = isWin ? ["sign"] : ["-in", inputFile, "-out", outputPath];

  if (process.env.ELECTRON_BUILDER_OFFLINE !== "true") {
    const timestampingServiceUrl = options.options.timeStampServer || "http://timestamp.digicert.com";

    if (isWin) {
      args.push(options.isNest || options.hash === "sha256" ? "/tr" : "/t", options.isNest || options.hash === "sha256" ? options.options.rfc3161TimeStampServer || "http://timestamp.comodoca.com/rfc3161" : timestampingServiceUrl);
    } else {
      args.push("-t", timestampingServiceUrl);
    }
  }

  const certificateFile = options.cscInfo.file;

  if (certificateFile == null) {
    const cscInfo = options.cscInfo;
    const subjectName = cscInfo.thumbprint;

    if (!isWin) {
      throw new Error(`${subjectName == null ? "certificateSha1" : "certificateSubjectName"} supported only on Windows`);
    }

    args.push("/sha1", cscInfo.thumbprint);
    args.push("/s", cscInfo.store);

    if (cscInfo.isLocalMachineStore) {
      args.push("/sm");
    }
  } else {
    const certExtension = path.extname(certificateFile);

    if (certExtension === ".p12" || certExtension === ".pfx") {
      args.push(isWin ? "/f" : "-pkcs12", vm.toVmFile(certificateFile));
    } else {
      throw new Error(`Please specify pkcs12 (.p12/.pfx) file, ${certificateFile} is not correct`);
    }
  }

  if (!isWin || options.hash !== "sha1") {
    args.push(isWin ? "/fd" : "-h", options.hash);

    if (isWin && process.env.ELECTRON_BUILDER_OFFLINE !== "true") {
      args.push("/td", "sha256");
    }
  }

  if (options.name) {
    args.push(isWin ? "/d" : "-n", options.name);
  }

  if (options.site) {
    args.push(isWin ? "/du" : "-i", options.site);
  } // msi does not support dual-signing


  if (options.isNest) {
    args.push(isWin ? "/as" : "-nest");
  }

  const password = options.cscInfo == null ? null : options.cscInfo.password;

  if (password) {
    args.push(isWin ? "/p" : "-pass", password);
  }

  if (options.options.additionalCertificateFile) {
    args.push(isWin ? "/ac" : "-ac", vm.toVmFile(options.options.additionalCertificateFile));
  }

  const httpsProxyFromEnv = process.env.HTTPS_PROXY;

  if (!isWin && httpsProxyFromEnv != null && httpsProxyFromEnv.length) {
    args.push("-p", httpsProxyFromEnv);
  }

  if (isWin) {
    // https://github.com/electron-userland/electron-builder/issues/2875#issuecomment-387233610
    args.push("/debug"); // must be last argument

    args.push(inputFile);
  }

  return args;
}

function getOutputPath(inputPath, hash) {
  const extension = path.extname(inputPath);
  return path.join(path.dirname(inputPath), `${path.basename(inputPath, extension)}-signed-${hash}${extension}`);
}
/** @internal */


function isOldWin6() {
  const winVersion = os().release();
  return winVersion.startsWith("6.") && !winVersion.startsWith("6.3");
}

function getWinSignTool(vendorPath) {
  // use modern signtool on Windows Server 2012 R2 to be able to sign AppX
  if (isOldWin6()) {
    return path.join(vendorPath, "windows-6", "signtool.exe");
  } else {
    return path.join(vendorPath, "windows-10", process.arch, "signtool.exe");
  }
}

function getToolPath() {
  return _getToolPath.apply(this, arguments);
} function _getToolPath() {
  _getToolPath = (0, _bluebirdLst().coroutine)(function* () {
    if ((0, _flags().isUseSystemSigncode)()) {
      return {
        path: "osslsigncode"
      };
    }

    const result = process.env.SIGNTOOL_PATH;

    if (result) {
      return {
        path: result
      };
    }

    const vendorPath = yield getSignVendorPath();

    if (process.platform === "win32") {
      // use modern signtool on Windows Server 2012 R2 to be able to sign AppX
      return {
        path: getWinSignTool(vendorPath)
      };
    } else if (process.platform === "darwin") {
      const toolDirPath = path.join(vendorPath, process.platform, "10.12");
      return {
        path: path.join(toolDirPath, "osslsigncode"),
        env: (0, _bundledTool().computeToolEnv)([path.join(toolDirPath, "lib")])
      };
    } else {
      return {
        path: path.join(vendorPath, process.platform, "osslsigncode")
      };
    }
  });
  return _getToolPath.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=windowsCodeSign.js.map{"version":3,"sources":["../../src/codeSign/windowsCodeSign.ts"],"names":[],"mappings":"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","sourcesContent":["import { InvalidConfigurationError, asArray, log } from \"builder-util/out/util\"\nimport { getBin } from \"../binDownload\"\nimport { executeAppBuilderAsJson } from \"../util/appBuilder\"\nimport { computeToolEnv, ToolInfo } from \"../util/bundledTool\"\nimport { rename } from \"fs-extra-p\"\nimport * as os from \"os\"\nimport * as path from \"path\"\nimport { WindowsConfiguration } from \"..\"\nimport { resolveFunction } from \"../platformPackager\"\nimport { isUseSystemSigncode } from \"../util/flags\"\nimport { VmManager } from \"../vm/vm\"\nimport { WinPackager } from \"../winPackager\"\n\nexport function getSignVendorPath() {\n  return getBin(\"winCodeSign\")\n}\n\nexport type CustomWindowsSign = (configuration: CustomWindowsSignTaskConfiguration) => Promise<any>\n\nexport interface WindowsSignOptions {\n  readonly path: string\n\n  readonly name?: string | null\n  readonly cscInfo?: FileCodeSigningInfo | CertificateFromStoreInfo | null\n  readonly site?: string | null\n\n  readonly options: WindowsConfiguration\n}\n\nexport interface WindowsSignTaskConfiguration extends WindowsSignOptions {\n  // set if output path differs from input (e.g. osslsigncode cannot sign file inplace)\n  resultOutputPath?: string\n\n  hash: string\n  isNest: boolean\n}\n\nexport interface CustomWindowsSignTaskConfiguration extends WindowsSignTaskConfiguration {\n  computeSignToolArgs(isWin: boolean): Array<string>\n}\n\nexport async function sign(options: WindowsSignOptions, packager: WinPackager) {\n  let hashes = options.options.signingHashAlgorithms\n  // msi does not support dual-signing\n  if (options.path.endsWith(\".msi\")) {\n    hashes = [hashes != null && !hashes.includes(\"sha1\") ? \"sha256\" : \"sha1\"]\n  }\n  else if (options.path.endsWith(\".appx\")) {\n    hashes = [\"sha256\"]\n  }\n  else if (hashes == null) {\n    hashes = [\"sha1\", \"sha256\"]\n  }\n  else {\n    hashes = Array.isArray(hashes) ? hashes : [hashes]\n  }\n\n  function defaultExecutor(configuration: CustomWindowsSignTaskConfiguration) {\n    return doSign(configuration, packager)\n  }\n\n  const executor = resolveFunction(options.options.sign, \"sign\") || defaultExecutor\n  let isNest = false\n  for (const hash of hashes) {\n    const taskConfiguration: WindowsSignTaskConfiguration = {...options, hash, isNest}\n    await executor({\n      ...taskConfiguration,\n      computeSignToolArgs: isWin => computeSignToolArgs(taskConfiguration, isWin)\n    })\n    isNest = true\n    if (taskConfiguration.resultOutputPath != null) {\n      await rename(taskConfiguration.resultOutputPath, options.path)\n    }\n  }\n}\n\nexport interface FileCodeSigningInfo {\n  readonly file: string\n  readonly password: string | null\n}\n\nexport async function getCertInfo(file: string, password: string): Promise<CertificateInfo> {\n  let result: any = null\n  try {\n    result = await executeAppBuilderAsJson<any>([\"certificate-info\", \"--input\", file, \"--password\", password])\n  }\n  catch (e) {\n    throw new Error(`Cannot extract publisher name from code signing certificate, please file issue. As workaround, set win.publisherName: ${e.stack || e}`)\n  }\n\n  if (result.error != null) {\n    // noinspection ExceptionCaughtLocallyJS\n    throw new InvalidConfigurationError(`Cannot extract publisher name from code signing certificate: ${result.error}`)\n  }\n  return result\n}\n\nexport interface CertificateInfo {\n  readonly commonName: string\n  readonly bloodyMicrosoftSubjectDn: string\n}\n\nexport interface CertificateFromStoreInfo {\n  thumbprint: string\n  subject: string\n  store: string\n  isLocalMachineStore: boolean\n}\n\nexport async function getCertificateFromStoreInfo(options: WindowsConfiguration, vm: VmManager): Promise<CertificateFromStoreInfo> {\n  const certificateSubjectName = options.certificateSubjectName\n  const certificateSha1 = options.certificateSha1\n  // ExcludeProperty doesn't work, so, we cannot exclude RawData, it is ok\n  // powershell can return object if the only item\n  const rawResult = await vm.exec(\"powershell.exe\", [\"Get-ChildItem -Recurse Cert: -CodeSigningCert | Select-Object -Property Subject,PSParentPath,Thumbprint | ConvertTo-Json -Compress\"])\n  const certList = rawResult.length === 0 ? [] : asArray<CertInfo>(JSON.parse(rawResult))\n  for (const certInfo of certList) {\n    if (certificateSubjectName != null) {\n      if (!certInfo.Subject.includes(certificateSubjectName)) {\n        continue\n      }\n    }\n    else if (certInfo.Thumbprint !== certificateSha1) {\n      continue\n    }\n\n    const parentPath = certInfo.PSParentPath\n    const store = parentPath.substring(parentPath.lastIndexOf(\"\\\\\") + 1)\n    log.debug({store, PSParentPath: parentPath}, \"auto-detect certificate store\")\n    // https://github.com/electron-userland/electron-builder/issues/1717\n    const isLocalMachineStore = (parentPath.includes(\"Certificate::LocalMachine\"))\n    log.debug(null, \"auto-detect using of LocalMachine store\")\n    return {\n      thumbprint: certInfo.Thumbprint,\n      subject: certInfo.Subject,\n      store,\n      isLocalMachineStore\n    }\n  }\n\n  throw new Error(`Cannot find certificate ${certificateSubjectName || certificateSha1}, all certs: ${rawResult}`)\n}\n\nasync function doSign(configuration: CustomWindowsSignTaskConfiguration, packager: WinPackager) {\n  // https://github.com/electron-userland/electron-builder/pull/1944\n  const timeout = parseInt(process.env.SIGNTOOL_TIMEOUT as any, 10) || 10 * 60 * 1000\n\n  let tool: string\n  let args: Array<string>\n  let env = process.env\n  let vm: VmManager\n  if (configuration.path.endsWith(\".appx\") || !(\"file\" in configuration.cscInfo!!) /* certificateSubjectName and other such options */) {\n    vm = await packager.vm.value\n    tool = getWinSignTool(await getSignVendorPath())\n    args = computeSignToolArgs(configuration, true, vm)\n  }\n  else {\n    vm = new VmManager()\n    const toolInfo = await getToolPath()\n    tool = toolInfo.path\n    args = configuration.computeSignToolArgs(process.platform === \"win32\")\n    if (toolInfo.env != null) {\n      env = toolInfo.env\n    }\n  }\n\n  try {\n    await vm.exec(tool, args, {timeout, env})\n  }\n  catch (e) {\n    if (e.message.includes(\"The file is being used by another process\") || e.message.includes(\"The specified timestamp server either could not be reached\")) {\n      log.warn(`First attempt to code sign failed, another attempt will be made in 2 seconds: ${e.message}`)\n      await new Promise((resolve, reject) => {\n        setTimeout(() => {\n          vm.exec(tool, args, {timeout, env})\n            .then(resolve)\n            .catch(reject)\n        }, 2000)\n      })\n    }\n    throw e\n  }\n}\n\ninterface CertInfo {\n  Subject: string\n  Thumbprint: string\n  PSParentPath: string\n}\n\n// on windows be aware of http://stackoverflow.com/a/32640183/1910191\nfunction computeSignToolArgs(options: WindowsSignTaskConfiguration, isWin: boolean, vm: VmManager = new VmManager()): Array<string> {\n  const inputFile = vm.toVmFile(options.path)\n  const outputPath = isWin ? inputFile : getOutputPath(inputFile, options.hash)\n  if (!isWin) {\n    options.resultOutputPath = outputPath\n  }\n\n  const args = isWin ? [\"sign\"] : [\"-in\", inputFile, \"-out\", outputPath]\n\n  if (process.env.ELECTRON_BUILDER_OFFLINE !== \"true\") {\n    const timestampingServiceUrl = options.options.timeStampServer || \"http://timestamp.digicert.com\"\n    if (isWin) {\n      args.push(options.isNest || options.hash === \"sha256\" ? \"/tr\" : \"/t\", options.isNest || options.hash === \"sha256\" ? (options.options.rfc3161TimeStampServer || \"http://timestamp.comodoca.com/rfc3161\") : timestampingServiceUrl)\n    }\n    else {\n      args.push(\"-t\", timestampingServiceUrl)\n    }\n  }\n\n  const certificateFile = (options.cscInfo as FileCodeSigningInfo).file\n  if (certificateFile == null) {\n    const cscInfo = (options.cscInfo as CertificateFromStoreInfo)\n    const subjectName = cscInfo.thumbprint\n    if (!isWin) {\n      throw new Error(`${subjectName == null ? \"certificateSha1\" : \"certificateSubjectName\"} supported only on Windows`)\n    }\n\n    args.push(\"/sha1\", cscInfo.thumbprint)\n    args.push(\"/s\", cscInfo.store)\n    if (cscInfo.isLocalMachineStore) {\n      args.push(\"/sm\")\n    }\n  }\n  else {\n    const certExtension = path.extname(certificateFile)\n    if (certExtension === \".p12\" || certExtension === \".pfx\") {\n      args.push(isWin ? \"/f\" : \"-pkcs12\", vm.toVmFile(certificateFile))\n    }\n    else {\n      throw new Error(`Please specify pkcs12 (.p12/.pfx) file, ${certificateFile} is not correct`)\n    }\n  }\n\n  if (!isWin || options.hash !== \"sha1\") {\n    args.push(isWin ? \"/fd\" : \"-h\", options.hash)\n    if (isWin && process.env.ELECTRON_BUILDER_OFFLINE !== \"true\") {\n      args.push(\"/td\", \"sha256\")\n    }\n  }\n\n  if (options.name) {\n    args.push(isWin ? \"/d\" : \"-n\", options.name)\n  }\n\n  if (options.site) {\n    args.push(isWin ? \"/du\" : \"-i\", options.site)\n  }\n\n  // msi does not support dual-signing\n  if (options.isNest) {\n    args.push(isWin ? \"/as\" : \"-nest\")\n  }\n\n  const password = options.cscInfo == null ? null : (options.cscInfo as FileCodeSigningInfo).password\n  if (password) {\n    args.push(isWin ? \"/p\" : \"-pass\", password)\n  }\n\n  if (options.options.additionalCertificateFile) {\n    args.push(isWin ? \"/ac\" : \"-ac\", vm.toVmFile(options.options.additionalCertificateFile))\n  }\n\n  const httpsProxyFromEnv = process.env.HTTPS_PROXY\n  if (!isWin && httpsProxyFromEnv != null && httpsProxyFromEnv.length) {\n    args.push(\"-p\", httpsProxyFromEnv)\n  }\n\n  if (isWin) {\n    // https://github.com/electron-userland/electron-builder/issues/2875#issuecomment-387233610\n    args.push(\"/debug\")\n    // must be last argument\n    args.push(inputFile)\n  }\n\n  return args\n}\n\nfunction getOutputPath(inputPath: string, hash: string) {\n  const extension = path.extname(inputPath)\n  return path.join(path.dirname(inputPath), `${path.basename(inputPath, extension)}-signed-${hash}${extension}`)\n}\n\n/** @internal */\nexport function isOldWin6() {\n  const winVersion = os.release()\n  return winVersion.startsWith(\"6.\") && !winVersion.startsWith(\"6.3\")\n}\n\nfunction getWinSignTool(vendorPath: string): string {\n  // use modern signtool on Windows Server 2012 R2 to be able to sign AppX\n  if (isOldWin6()) {\n    return path.join(vendorPath, \"windows-6\", \"signtool.exe\")\n  }\n  else {\n    return path.join(vendorPath, \"windows-10\", process.arch, \"signtool.exe\")\n  }\n}\n\nasync function getToolPath(): Promise<ToolInfo> {\n  if (isUseSystemSigncode()) {\n    return {path: \"osslsigncode\"}\n  }\n\n  const result = process.env.SIGNTOOL_PATH\n  if (result) {\n    return {path: result}\n  }\n\n  const vendorPath = await getSignVendorPath()\n  if (process.platform === \"win32\") {\n    // use modern signtool on Windows Server 2012 R2 to be able to sign AppX\n    return {path: getWinSignTool(vendorPath)}\n  }\n  else if (process.platform === \"darwin\") {\n    const toolDirPath = path.join(vendorPath, process.platform, \"10.12\")\n    return {\n      path: path.join(toolDirPath, \"osslsigncode\"),\n      env: computeToolEnv([path.join(toolDirPath, \"lib\")]),\n    }\n  }\n  else {\n    return {path: path.join(vendorPath, process.platform, \"osslsigncode\")}\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.readAsar = readAsar;
exports.readAsarJson = readAsarJson;
exports.AsarFilesystem = exports.Node = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _chromiumPickleJs() {
  const data = require("chromium-pickle-js");

  _chromiumPickleJs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/** @internal */
class Node {}
/** @internal */


exports.Node = Node;

class AsarFilesystem {
  constructor(src, header = new Node(), headerSize = -1) {
    this.src = src;
    this.header = header;
    this.headerSize = headerSize;
    this.offset = 0;

    if (this.header.files == null) {
      this.header.files = {};
    }
  }

  searchNodeFromDirectory(p, isCreate) {
    let node = this.header;

    for (const dir of p.split(path.sep)) {
      if (dir !== ".") {
        let child = node.files[dir];

        if (child == null) {
          if (!isCreate) {
            return null;
          }

          child = new Node();
          child.files = {};
          node.files[dir] = child;
        }

        node = child;
      }
    }

    return node;
  }

  getOrCreateNode(p) {
    if (p == null || p.length === 0) {
      return this.header;
    }

    const name = path.basename(p);
    const dirNode = this.searchNodeFromDirectory(path.dirname(p), true);

    if (dirNode.files == null) {
      dirNode.files = {};
    }

    let result = dirNode.files[name];

    if (result == null) {
      result = new Node();
      dirNode.files[name] = result;
    }

    return result;
  }

  addFileNode(file, dirNode, size, unpacked, stat) {
    if (size > 4294967295) {
      throw new Error(`${file}: file size cannot be larger than 4.2GB`);
    }

    const node = new Node();
    node.size = size;

    if (unpacked) {
      node.unpacked = true;
    } else {
      // electron expects string
      node.offset = this.offset.toString();

      if (process.platform !== "win32" && stat.mode & 0o100) {
        node.executable = true;
      }

      this.offset += node.size;
    }

    let children = dirNode.files;

    if (children == null) {
      children = {};
      dirNode.files = children;
    }

    children[path.basename(file)] = node;
    return node;
  }

  getNode(p) {
    const node = this.searchNodeFromDirectory(path.dirname(p), false);
    return node.files[path.basename(p)];
  }

  getFile(p, followLinks = true) {
    const info = this.getNode(p); // if followLinks is false we don't resolve symlinks

    return followLinks && info.link != null ? this.getFile(info.link) : info;
  }

  readJson(file) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      return JSON.parse((yield _this.readFile(file)).toString());
    })();
  }

  readFile(file) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      return yield readFileFromAsar(_this2, file, _this2.getFile(file));
    })();
  }

}

exports.AsarFilesystem = AsarFilesystem;

function readAsar(_x) {
  return _readAsar.apply(this, arguments);
}

function _readAsar() {
  _readAsar = (0, _bluebirdLst().coroutine)(function* (archive) {
    const fd = yield (0, _fsExtraP().open)(archive, "r");
    let size;
    let headerBuf;

    try {
      const sizeBuf = Buffer.allocUnsafe(8);

      if ((yield (0, _fsExtraP().read)(fd, sizeBuf, 0, 8, null)) !== 8) {
        throw new Error("Unable to read header size");
      }

      const sizePickle = (0, _chromiumPickleJs().createFromBuffer)(sizeBuf);
      size = sizePickle.createIterator().readUInt32();
      headerBuf = Buffer.allocUnsafe(size);

      if ((yield (0, _fsExtraP().read)(fd, headerBuf, 0, size, null)) !== size) {
        throw new Error("Unable to read header");
      }
    } finally {
      yield (0, _fsExtraP().close)(fd);
    }

    const headerPickle = (0, _chromiumPickleJs().createFromBuffer)(headerBuf);
    const header = headerPickle.createIterator().readString();
    return new AsarFilesystem(archive, JSON.parse(header), size);
  });
  return _readAsar.apply(this, arguments);
}

function readAsarJson(_x2, _x3) {
  return _readAsarJson.apply(this, arguments);
}

function _readAsarJson() {
  _readAsarJson = (0, _bluebirdLst().coroutine)(function* (archive, file) {
    const fs = yield readAsar(archive);
    return yield fs.readJson(file);
  });
  return _readAsarJson.apply(this, arguments);
}

function readFileFromAsar(_x4, _x5, _x6) {
  return _readFileFromAsar.apply(this, arguments);
} function _readFileFromAsar() {
  _readFileFromAsar = (0, _bluebirdLst().coroutine)(function* (filesystem, filename, info) {
    const size = info.size;
    const buffer = Buffer.allocUnsafe(size);

    if (size <= 0) {
      return buffer;
    }

    if (info.unpacked) {
      return yield (0, _fsExtraP().readFile)(path.join(`${filesystem.src}.unpacked`, filename));
    }

    const fd = yield (0, _fsExtraP().open)(filesystem.src, "r");

    try {
      const offset = 8 + filesystem.headerSize + parseInt(info.offset, 10);
      yield (0, _fsExtraP().read)(fd, buffer, 0, size, offset);
    } finally {
      yield (0, _fsExtraP().close)(fd);
    }

    return buffer;
  });
  return _readFileFromAsar.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=asar.js.map{"version":3,"sources":["../../src/asar/asar.ts"],"names":[],"mappings":"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","sourcesContent":["import { createFromBuffer } from \"chromium-pickle-js\"\nimport { close, open, read, readFile, Stats } from \"fs-extra-p\"\nimport * as path from \"path\"\n\n/** @internal */\nexport class Node {\n  // we don't use Map because later it will be stringified\n  files?: { [key: string]: Node }\n\n  unpacked?: boolean\n\n  size?: number\n  // electron expects string\n  offset?: string\n\n  executable?: boolean\n\n  link?: string\n}\n\n/** @internal */\nexport class AsarFilesystem {\n  private offset = 0\n\n  constructor(readonly src: string, readonly header = new Node(), readonly headerSize: number = -1) {\n    if (this.header.files == null) {\n      this.header.files = {}\n    }\n  }\n\n  searchNodeFromDirectory(p: string, isCreate: boolean): Node | null {\n    let node = this.header\n    for (const dir of p.split(path.sep)) {\n      if (dir !== \".\") {\n        let child = node.files![dir]\n        if (child == null) {\n          if (!isCreate) {\n            return null\n          }\n          child = new Node()\n          child.files = {}\n          node.files![dir] = child\n        }\n        node = child\n      }\n    }\n    return node\n  }\n\n  getOrCreateNode(p: string): Node {\n    if (p == null || p.length === 0) {\n      return this.header\n    }\n\n    const name = path.basename(p)\n    const dirNode = this.searchNodeFromDirectory(path.dirname(p), true)!\n    if (dirNode.files == null) {\n      dirNode.files = {}\n    }\n\n    let result = dirNode.files[name]\n    if (result == null) {\n      result = new Node()\n      dirNode.files[name] = result\n    }\n    return result\n  }\n\n  addFileNode(file: string, dirNode: Node, size: number, unpacked: boolean, stat: Stats): Node {\n    if (size > 4294967295) {\n      throw new Error(`${file}: file size cannot be larger than 4.2GB`)\n    }\n\n    const node = new Node()\n    node.size = size\n    if (unpacked) {\n      node.unpacked = true\n    }\n    else {\n      // electron expects string\n      node.offset = this.offset.toString()\n      if (process.platform !== \"win32\" && (stat.mode & 0o100)) {\n        node.executable = true\n      }\n      this.offset += node.size\n    }\n\n    let children = dirNode.files\n    if (children == null) {\n      children = {}\n      dirNode.files = children\n    }\n    children[path.basename(file)] = node\n\n    return node\n  }\n\n  getNode(p: string) {\n    const node = this.searchNodeFromDirectory(path.dirname(p), false)!\n    return node.files![path.basename(p)]\n  }\n\n  getFile(p: string, followLinks: boolean = true): Node {\n    const info = this.getNode(p)!\n    // if followLinks is false we don't resolve symlinks\n    return followLinks && info.link != null ? this.getFile(info.link) : info\n  }\n\n  async readJson(file: string): Promise<any> {\n    return JSON.parse((await this.readFile(file)).toString())\n  }\n\n  async readFile(file: string): Promise<Buffer> {\n    return await readFileFromAsar(this, file, this.getFile(file))\n  }\n}\n\nexport async function readAsar(archive: string): Promise<AsarFilesystem> {\n  const fd = await open(archive, \"r\")\n  let size\n  let headerBuf\n  try {\n    const sizeBuf = Buffer.allocUnsafe(8)\n    if (await read(fd, sizeBuf, 0, 8, null as any) !== 8) {\n      throw new Error(\"Unable to read header size\")\n    }\n\n    const sizePickle = createFromBuffer(sizeBuf)\n    size = sizePickle.createIterator().readUInt32()\n    headerBuf = Buffer.allocUnsafe(size)\n    if (await read(fd, headerBuf, 0, size, null as any) !== size) {\n      throw new Error(\"Unable to read header\")\n    }\n  }\n  finally {\n    await close(fd)\n  }\n\n  const headerPickle = createFromBuffer(headerBuf!)\n  const header = headerPickle.createIterator().readString()\n  return new AsarFilesystem(archive, JSON.parse(header), size)\n}\n\nexport async function readAsarJson(archive: string, file: string): Promise<any> {\n  const fs = await readAsar(archive)\n  return await fs.readJson(file)\n}\n\nasync function readFileFromAsar(filesystem: AsarFilesystem, filename: string, info: Node): Promise<Buffer> {\n  const size = info.size!!\n  const buffer = Buffer.allocUnsafe(size)\n  if (size <= 0) {\n    return buffer\n  }\n\n  if (info.unpacked) {\n    return await readFile(path.join(`${filesystem.src}.unpacked`, filename))\n  }\n\n  const fd = await open(filesystem.src, \"r\")\n  try {\n    const offset = 8 + filesystem.headerSize + parseInt(info.offset!!, 10)\n    await read(fd, buffer, 0, size, offset)\n  }\n  finally {\n    await close(fd)\n  }\n  return buffer\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.checkFileInArchive = checkFileInArchive;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _asar() {
  const data = require("./asar");

  _asar = function () {
    return data;
  };

  return data;
}

/** @internal */
function checkFileInArchive(_x, _x2, _x3) {
  return _checkFileInArchive.apply(this, arguments);
} function _checkFileInArchive() {
  _checkFileInArchive = (0, _bluebirdLst().coroutine)(function* (asarFile, relativeFile, messagePrefix) {
    function error(text) {
      return new Error(`${messagePrefix} "${relativeFile}" in the "${asarFile}" ${text}`);
    }

    let fs;

    try {
      fs = yield (0, _asar().readAsar)(asarFile);
    } catch (e) {
      throw error(`is corrupted: ${e}`);
    }

    let stat;

    try {
      stat = fs.getFile(relativeFile);
    } catch (e) {
      const fileStat = yield (0, _fs().statOrNull)(asarFile);

      if (fileStat == null) {
        throw error(`does not exist. Seems like a wrong configuration.`);
      } // asar throws error on access to undefined object (info.link)


      stat = null;
    }

    if (stat == null) {
      throw error(`does not exist. Seems like a wrong configuration.`);
    }

    if (stat.size === 0) {
      throw error(`is corrupted: size 0`);
    }
  });
  return _checkFileInArchive.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=asarFileChecker.js.map{"version":3,"sources":["../../src/asar/asarFileChecker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;SACsB,kB;;;;;;sDAAf,WAAkC,QAAlC,EAAoD,YAApD,EAA0E,aAA1E,EAA+F;AACpG,aAAS,KAAT,CAAe,IAAf,EAA2B;AACzB,aAAO,IAAI,KAAJ,CAAU,GAAG,aAAa,KAAK,YAAY,aAAa,QAAQ,KAAK,IAAI,EAAzE,CAAP;AACD;;AAED,QAAI,EAAJ;;AACA,QAAI;AACF,MAAA,EAAE,SAAS,sBAAS,QAAT,CAAX;AACD,KAFD,CAGA,OAAO,CAAP,EAAU;AACR,YAAM,KAAK,CAAC,iBAAiB,CAAC,EAAnB,CAAX;AACD;;AAED,QAAI,IAAJ;;AACA,QAAI;AACF,MAAA,IAAI,GAAG,EAAE,CAAC,OAAH,CAAW,YAAX,CAAP;AACD,KAFD,CAGA,OAAO,CAAP,EAAU;AACR,YAAM,QAAQ,SAAS,sBAAW,QAAX,CAAvB;;AACA,UAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,cAAM,KAAK,CAAC,mDAAD,CAAX;AACD,OAJO,CAMR;;;AACA,MAAA,IAAI,GAAG,IAAP;AACD;;AAED,QAAI,IAAI,IAAI,IAAZ,EAAkB;AAChB,YAAM,KAAK,CAAC,mDAAD,CAAX;AACD;;AACD,QAAI,IAAI,CAAC,IAAL,KAAc,CAAlB,EAAqB;AACnB,YAAM,KAAK,CAAC,sBAAD,CAAX;AACD;AACF,G","sourcesContent":["import { statOrNull } from \"builder-util/out/fs\"\nimport { Node, readAsar } from \"./asar\"\n\n/** @internal */\nexport async function checkFileInArchive(asarFile: string, relativeFile: string, messagePrefix: string) {\n  function error(text: string) {\n    return new Error(`${messagePrefix} \"${relativeFile}\" in the \"${asarFile}\" ${text}`)\n  }\n\n  let fs\n  try {\n    fs = await readAsar(asarFile)\n  }\n  catch (e) {\n    throw error(`is corrupted: ${e}`)\n  }\n\n  let stat: Node | null\n  try {\n    stat = fs.getFile(relativeFile)\n  }\n  catch (e) {\n    const fileStat = await statOrNull(asarFile)\n    if (fileStat == null) {\n      throw error(`does not exist. Seems like a wrong configuration.`)\n    }\n\n    // asar throws error on access to undefined object (info.link)\n    stat = null\n  }\n\n  if (stat == null) {\n    throw error(`does not exist. Seems like a wrong configuration.`)\n  }\n  if (stat.size === 0) {\n    throw error(`is corrupted: size 0`)\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.AsarPackager = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fs2() {
  const data = require("fs");

  _fs2 = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _appFileCopier() {
  const data = require("../util/appFileCopier");

  _appFileCopier = function () {
    return data;
  };

  return data;
}

function _asar() {
  const data = require("./asar");

  _asar = function () {
    return data;
  };

  return data;
}

function _unpackDetector() {
  const data = require("./unpackDetector");

  _unpackDetector = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const pickle = require("chromium-pickle-js");
/** @internal */


class AsarPackager {
  constructor(src, destination, options, unpackPattern) {
    this.src = src;
    this.destination = destination;
    this.options = options;
    this.unpackPattern = unpackPattern;
    this.fs = new (_asar().AsarFilesystem)(this.src);
    this.outFile = path.join(destination, "app.asar");
    this.unpackedDest = `${this.outFile}.unpacked`;
  } // sort files to minimize file change (i.e. asar file is not changed dramatically on small change)


  pack(fileSets, packager) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (_this.options.ordering != null) {
        // ordering doesn't support transformed files, but ordering is not used functionality - wait user report to fix it
        yield order(fileSets[0].files, _this.options.ordering, fileSets[0].src);
      }

      yield (0, _fsExtraP().ensureDir)(path.dirname(_this.outFile));
      const unpackedFileIndexMap = new Map();

      for (const fileSet of fileSets) {
        unpackedFileIndexMap.set(fileSet, (yield _this.createPackageFromFiles(fileSet, packager.info)));
      }

      yield _this.writeAsarFile(fileSets, unpackedFileIndexMap);
    })();
  }

  createPackageFromFiles(fileSet, packager) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const metadata = fileSet.metadata; // search auto unpacked dir

      const unpackedDirs = new Set();
      const rootForAppFilesWithoutAsar = path.join(_this2.destination, "app");

      if (_this2.options.smartUnpack !== false) {
        yield (0, _unpackDetector().detectUnpackedDirs)(fileSet, unpackedDirs, _this2.unpackedDest, rootForAppFilesWithoutAsar);
      }

      const dirToCreateForUnpackedFiles = new Set(unpackedDirs);

      const correctDirNodeUnpackedFlag =
      /*#__PURE__*/
      function () {
        var _ref = (0, _bluebirdLst().coroutine)(function* (filePathInArchive, dirNode) {
          for (const dir of unpackedDirs) {
            if (filePathInArchive.length > dir.length + 2 && filePathInArchive[dir.length] === path.sep && filePathInArchive.startsWith(dir)) {
              dirNode.unpacked = true;
              unpackedDirs.add(filePathInArchive); // not all dirs marked as unpacked after first iteration - because node module dir can be marked as unpacked after processing node module dir content
              // e.g. node-notifier/example/advanced.js processed, but only on process vendor/terminal-notifier.app module will be marked as unpacked

              yield (0, _fsExtraP().ensureDir)(path.join(_this2.unpackedDest, filePathInArchive));
              break;
            }
          }
        });

        return function correctDirNodeUnpackedFlag(_x, _x2) {
          return _ref.apply(this, arguments);
        };
      }();

      const transformedFiles = fileSet.transformedFiles;
      const taskManager = new (_builderUtil().AsyncTaskManager)(packager.cancellationToken);
      const fileCopier = new (_fs().FileCopier)();
      let currentDirNode = null;
      let currentDirPath = null;
      const unpackedFileIndexSet = new Set();

      for (let i = 0, n = fileSet.files.length; i < n; i++) {
        const file = fileSet.files[i];
        const stat = metadata.get(file);

        if (stat == null) {
          continue;
        }

        const pathInArchive = path.relative(rootForAppFilesWithoutAsar, (0, _appFileCopier().getDestinationPath)(file, fileSet));

        if (stat.isSymbolicLink()) {
          const s = stat;
          _this2.fs.getOrCreateNode(pathInArchive).link = s.relativeLink;
          s.pathInArchive = pathInArchive;
          unpackedFileIndexSet.add(i);
          continue;
        }

        let fileParent = path.dirname(pathInArchive);

        if (fileParent === ".") {
          fileParent = "";
        }

        if (currentDirPath !== fileParent) {
          if (fileParent.startsWith("..")) {
            throw new Error(`Internal error: path must not start with "..": ${fileParent}`);
          }

          currentDirPath = fileParent;
          currentDirNode = _this2.fs.getOrCreateNode(fileParent); // do not check for root

          if (fileParent !== "" && !currentDirNode.unpacked) {
            if (unpackedDirs.has(fileParent)) {
              currentDirNode.unpacked = true;
            } else {
              yield correctDirNodeUnpackedFlag(fileParent, currentDirNode);
            }
          }
        }

        const dirNode = currentDirNode;
        const newData = transformedFiles == null ? null : transformedFiles.get(i);

        const isUnpacked = dirNode.unpacked || _this2.unpackPattern != null && _this2.unpackPattern(file, stat);

        _this2.fs.addFileNode(file, dirNode, newData == null ? stat.size : Buffer.byteLength(newData), isUnpacked, stat);

        if (isUnpacked) {
          if (!dirNode.unpacked && !dirToCreateForUnpackedFiles.has(fileParent)) {
            dirToCreateForUnpackedFiles.add(fileParent);
            yield (0, _fsExtraP().ensureDir)(path.join(_this2.unpackedDest, fileParent));
          }

          const unpackedFile = path.join(_this2.unpackedDest, pathInArchive);
          taskManager.addTask(copyFileOrData(fileCopier, newData, file, unpackedFile, stat));

          if (taskManager.tasks.length > _fs().MAX_FILE_REQUESTS) {
            yield taskManager.awaitTasks();
          }

          unpackedFileIndexSet.add(i);
        }
      }

      if (taskManager.tasks.length > 0) {
        yield taskManager.awaitTasks();
      }

      return unpackedFileIndexSet;
    })();
  }

  writeAsarFile(fileSets, unpackedFileIndexMap) {
    return new Promise((resolve, reject) => {
      const headerPickle = pickle.createEmpty();
      headerPickle.writeString(JSON.stringify(this.fs.header));
      const headerBuf = headerPickle.toBuffer();
      const sizePickle = pickle.createEmpty();
      sizePickle.writeUInt32(headerBuf.length);
      const sizeBuf = sizePickle.toBuffer();
      const writeStream = (0, _fsExtraP().createWriteStream)(this.outFile);
      writeStream.on("error", reject);
      writeStream.on("close", resolve);
      writeStream.write(sizeBuf);
      let fileSetIndex = 0;
      let files = fileSets[0].files;
      let metadata = fileSets[0].metadata;
      let transformedFiles = fileSets[0].transformedFiles;
      let unpackedFileIndexSet = unpackedFileIndexMap.get(fileSets[0]);

      const w = index => {
        while (true) {
          if (index >= files.length) {
            if (++fileSetIndex >= fileSets.length) {
              writeStream.end();
              return;
            } else {
              files = fileSets[fileSetIndex].files;
              metadata = fileSets[fileSetIndex].metadata;
              transformedFiles = fileSets[fileSetIndex].transformedFiles;
              unpackedFileIndexSet = unpackedFileIndexMap.get(fileSets[fileSetIndex]);
              index = 0;
            }
          }

          if (!unpackedFileIndexSet.has(index)) {
            break;
          } else {
            const stat = metadata.get(files[index]);

            if (stat != null && stat.isSymbolicLink()) {
              (0, _fs2().symlink)(stat.linkRelativeToFile, path.join(this.unpackedDest, stat.pathInArchive), () => w(index + 1));
              return;
            }
          }

          index++;
        }

        const data = transformedFiles == null ? null : transformedFiles.get(index);
        const file = files[index];

        if (data !== null && data !== undefined) {
          writeStream.write(data, () => w(index + 1));
          return;
        } // https://github.com/yarnpkg/yarn/pull/3539


        const stat = metadata.get(file);

        if (stat != null && stat.size < 2 * 1024 * 1024) {
          (0, _fsExtraP().readFile)(file).then(it => {
            writeStream.write(it, () => w(index + 1));
          }).catch(e => reject(`Cannot read file ${file}: ${e.stack || e}`));
        } else {
          const readStream = (0, _fsExtraP().createReadStream)(file);
          readStream.on("error", reject);
          readStream.once("end", () => w(index + 1));
          readStream.pipe(writeStream, {
            end: false
          });
        }
      };

      writeStream.write(headerBuf, () => w(0));
    });
  }

}

exports.AsarPackager = AsarPackager;

function order(_x3, _x4, _x5) {
  return _order.apply(this, arguments);
}

function _order() {
  _order = (0, _bluebirdLst().coroutine)(function* (filenames, orderingFile, src) {
    const orderingFiles = (yield (0, _fsExtraP().readFile)(orderingFile, "utf8")).split("\n").map(line => {
      if (line.indexOf(":") !== -1) {
        line = line.split(":").pop();
      }

      line = line.trim();

      if (line[0] === "/") {
        line = line.slice(1);
      }

      return line;
    });
    const ordering = [];

    for (const file of orderingFiles) {
      const pathComponents = file.split(path.sep);

      for (const pathComponent of pathComponents) {
        ordering.push(path.join(src, pathComponent));
      }
    }

    const sortedFiles = [];
    let missing = 0;
    const total = filenames.length;

    for (const file of ordering) {
      if (!sortedFiles.includes(file) && filenames.includes(file)) {
        sortedFiles.push(file);
      }
    }

    for (const file of filenames) {
      if (!sortedFiles.includes(file)) {
        sortedFiles.push(file);
        missing += 1;
      }
    }

    _builderUtil().log.info({
      coverage: (total - missing) / total * 100
    }, "ordering files in ASAR archive");

    return sortedFiles;
  });
  return _order.apply(this, arguments);
}

function copyFileOrData(fileCopier, data, source, destination, stats) {
  if (data == null) {
    return fileCopier.copy(source, destination, stats);
  } else {
    return (0, _fsExtraP().writeFile)(destination, data);
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=asarUtil.js.map{"version":3,"sources":["../../src/asar/asarUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncTaskManager, log } from \"builder-util\"\nimport { FileCopier, Filter, MAX_FILE_REQUESTS } from \"builder-util/out/fs\"\nimport { symlink } from \"fs\"\nimport { createReadStream, createWriteStream, ensureDir, readFile, Stats, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { AsarOptions } from \"..\"\nimport { Packager } from \"../packager\"\nimport { PlatformPackager } from \"../platformPackager\"\nimport { getDestinationPath, ResolvedFileSet } from \"../util/appFileCopier\"\nimport { AsarFilesystem, Node } from \"./asar\"\nimport { detectUnpackedDirs } from \"./unpackDetector\"\n\nconst pickle = require(\"chromium-pickle-js\")\n\n/** @internal */\nexport class AsarPackager {\n  private readonly fs = new AsarFilesystem(this.src)\n  private readonly outFile: string\n  private readonly unpackedDest: string\n\n  constructor(private readonly src: string, private readonly destination: string, private readonly options: AsarOptions, private readonly unpackPattern: Filter | null) {\n    this.outFile = path.join(destination, \"app.asar\")\n    this.unpackedDest = `${this.outFile}.unpacked`\n  }\n\n  // sort files to minimize file change (i.e. asar file is not changed dramatically on small change)\n  async pack(fileSets: Array<ResolvedFileSet>, packager: PlatformPackager<any>) {\n    if (this.options.ordering != null) {\n      // ordering doesn't support transformed files, but ordering is not used functionality - wait user report to fix it\n      await order(fileSets[0].files, this.options.ordering, fileSets[0].src)\n    }\n    await ensureDir(path.dirname(this.outFile))\n    const unpackedFileIndexMap = new Map<ResolvedFileSet, Set<number>>()\n    for (const fileSet of fileSets) {\n      unpackedFileIndexMap.set(fileSet, await this.createPackageFromFiles(fileSet, packager.info))\n    }\n    await this.writeAsarFile(fileSets, unpackedFileIndexMap)\n  }\n\n  private async createPackageFromFiles(fileSet: ResolvedFileSet, packager: Packager) {\n    const metadata = fileSet.metadata\n    // search auto unpacked dir\n    const unpackedDirs = new Set<string>()\n    const rootForAppFilesWithoutAsar = path.join(this.destination, \"app\")\n\n    if (this.options.smartUnpack !== false) {\n      await detectUnpackedDirs(fileSet, unpackedDirs, this.unpackedDest, rootForAppFilesWithoutAsar)\n    }\n\n    const dirToCreateForUnpackedFiles = new Set<string>(unpackedDirs)\n\n    const correctDirNodeUnpackedFlag = async (filePathInArchive: string, dirNode: Node) => {\n      for (const dir of unpackedDirs) {\n        if (filePathInArchive.length > (dir.length + 2) && filePathInArchive[dir.length] === path.sep && filePathInArchive.startsWith(dir)) {\n          dirNode.unpacked = true\n          unpackedDirs.add(filePathInArchive)\n          // not all dirs marked as unpacked after first iteration - because node module dir can be marked as unpacked after processing node module dir content\n          // e.g. node-notifier/example/advanced.js processed, but only on process vendor/terminal-notifier.app module will be marked as unpacked\n          await ensureDir(path.join(this.unpackedDest, filePathInArchive))\n          break\n        }\n      }\n    }\n\n    const transformedFiles = fileSet.transformedFiles\n    const taskManager = new AsyncTaskManager(packager.cancellationToken)\n    const fileCopier = new FileCopier()\n\n    let currentDirNode: Node | null = null\n    let currentDirPath: string | null = null\n\n    const unpackedFileIndexSet = new Set<number>()\n\n    for (let i = 0, n = fileSet.files.length; i < n; i++) {\n      const file = fileSet.files[i]\n      const stat = metadata.get(file)\n      if (stat == null) {\n        continue\n      }\n\n      const pathInArchive = path.relative(rootForAppFilesWithoutAsar, getDestinationPath(file, fileSet))\n\n      if (stat.isSymbolicLink()) {\n        const s = (stat as any)\n        this.fs.getOrCreateNode(pathInArchive).link = s.relativeLink\n        s.pathInArchive = pathInArchive\n        unpackedFileIndexSet.add(i)\n        continue\n      }\n\n      let fileParent = path.dirname(pathInArchive)\n      if (fileParent === \".\") {\n        fileParent = \"\"\n      }\n\n      if (currentDirPath !== fileParent) {\n        if (fileParent.startsWith(\"..\")) {\n          throw new Error(`Internal error: path must not start with \"..\": ${fileParent}`)\n        }\n\n        currentDirPath = fileParent\n        currentDirNode = this.fs.getOrCreateNode(fileParent)\n        // do not check for root\n        if (fileParent !== \"\" && !currentDirNode.unpacked) {\n          if (unpackedDirs.has(fileParent)) {\n            currentDirNode.unpacked = true\n          }\n          else {\n            await correctDirNodeUnpackedFlag(fileParent, currentDirNode)\n          }\n        }\n      }\n\n      const dirNode = currentDirNode!\n      const newData = transformedFiles == null ? null : transformedFiles.get(i)\n      const isUnpacked = dirNode.unpacked || (this.unpackPattern != null && this.unpackPattern(file, stat))\n      this.fs.addFileNode(file, dirNode, newData == null ? stat.size : Buffer.byteLength(newData), isUnpacked, stat)\n      if (isUnpacked) {\n        if (!dirNode.unpacked && !dirToCreateForUnpackedFiles.has(fileParent)) {\n          dirToCreateForUnpackedFiles.add(fileParent)\n          await ensureDir(path.join(this.unpackedDest, fileParent))\n        }\n\n        const unpackedFile = path.join(this.unpackedDest, pathInArchive)\n        taskManager.addTask(copyFileOrData(fileCopier, newData, file, unpackedFile, stat))\n        if (taskManager.tasks.length > MAX_FILE_REQUESTS) {\n          await taskManager.awaitTasks()\n        }\n\n        unpackedFileIndexSet.add(i)\n      }\n    }\n\n    if (taskManager.tasks.length > 0) {\n      await taskManager.awaitTasks()\n    }\n\n    return unpackedFileIndexSet\n  }\n\n  private writeAsarFile(fileSets: Array<ResolvedFileSet>, unpackedFileIndexMap: Map<ResolvedFileSet, Set<number>>): Promise<any> {\n    return new Promise((resolve, reject) => {\n      const headerPickle = pickle.createEmpty()\n      headerPickle.writeString(JSON.stringify(this.fs.header))\n      const headerBuf = headerPickle.toBuffer()\n\n      const sizePickle = pickle.createEmpty()\n      sizePickle.writeUInt32(headerBuf.length)\n\n      const sizeBuf = sizePickle.toBuffer()\n      const writeStream = createWriteStream(this.outFile)\n      writeStream.on(\"error\", reject)\n      writeStream.on(\"close\", resolve)\n      writeStream.write(sizeBuf)\n\n      let fileSetIndex = 0\n\n      let files = fileSets[0].files\n      let metadata = fileSets[0].metadata\n      let transformedFiles = fileSets[0].transformedFiles\n      let unpackedFileIndexSet = unpackedFileIndexMap.get(fileSets[0])!!\n      const w = (index: number) => {\n        while (true) {\n          if (index >= files.length) {\n            if (++fileSetIndex >= fileSets.length) {\n              writeStream.end()\n              return\n            }\n            else {\n              files = fileSets[fileSetIndex].files\n              metadata = fileSets[fileSetIndex].metadata\n              transformedFiles = fileSets[fileSetIndex].transformedFiles\n              unpackedFileIndexSet = unpackedFileIndexMap.get(fileSets[fileSetIndex])!!\n              index = 0\n            }\n          }\n\n          if (!unpackedFileIndexSet.has(index)) {\n            break\n          }\n          else {\n            const stat = metadata.get(files[index])\n            if (stat != null && stat.isSymbolicLink()) {\n              symlink((stat as any).linkRelativeToFile, path.join(this.unpackedDest, (stat as any).pathInArchive), () => w(index + 1))\n              return\n            }\n          }\n          index++\n        }\n\n        const data = transformedFiles == null ? null : transformedFiles.get(index)\n        const file = files[index]\n        if (data !== null && data !== undefined) {\n          writeStream.write(data, () => w(index + 1))\n          return\n        }\n\n        // https://github.com/yarnpkg/yarn/pull/3539\n        const stat = metadata.get(file)\n        if (stat != null && stat.size < (2 * 1024 * 1024)) {\n          readFile(file)\n            .then(it => {\n              writeStream.write(it, () => w(index + 1))\n            })\n            .catch(e => reject(`Cannot read file ${file}: ${e.stack || e}`))\n        }\n        else {\n          const readStream = createReadStream(file)\n          readStream.on(\"error\", reject)\n          readStream.once(\"end\", () => w(index + 1))\n          readStream.pipe(writeStream, {\n            end: false\n          })\n        }\n      }\n\n      writeStream.write(headerBuf, () => w(0))\n    })\n  }\n}\n\nasync function order(filenames: Array<string>, orderingFile: string, src: string) {\n  const orderingFiles = (await readFile(orderingFile, \"utf8\")).split(\"\\n\").map(line => {\n    if (line.indexOf(\":\") !== -1) {\n      line = line.split(\":\").pop()!\n    }\n    line = line.trim()\n    if (line[0] === \"/\") {\n      line = line.slice(1)\n    }\n    return line\n  })\n\n  const ordering: Array<string> = []\n  for (const file of orderingFiles) {\n    const pathComponents = file.split(path.sep)\n    for (const pathComponent of pathComponents) {\n      ordering.push(path.join(src, pathComponent))\n    }\n  }\n\n  const sortedFiles: Array<string> = []\n  let missing = 0\n  const total = filenames.length\n  for (const file of ordering) {\n    if (!sortedFiles.includes(file) && filenames.includes(file)) {\n      sortedFiles.push(file)\n    }\n  }\n  for (const file of filenames) {\n    if (!sortedFiles.includes(file)) {\n      sortedFiles.push(file)\n      missing += 1\n    }\n  }\n  log.info({coverage: ((total - missing) / total * 100)}, \"ordering files in ASAR archive\")\n  return sortedFiles\n}\n\nfunction copyFileOrData(fileCopier: FileCopier, data: string | Buffer | undefined | null, source: string, destination: string, stats: Stats) {\n  if (data == null) {\n    return fileCopier.copy(source, destination, stats)\n  }\n  else {\n    return writeFile(destination, data)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.computeData = computeData;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function computeData(_x, _x2) {
  return _computeData.apply(this, arguments);
}

function _computeData() {
  _computeData = (0, _bluebirdLst().coroutine)(function* (resourcesPath, options) {
    // sort to produce constant result
    const names = (yield (0, _fsExtraP().readdir)(resourcesPath)).filter(it => it.endsWith(".asar")).sort();
    const checksums = yield _bluebirdLst().default.map(names, it => hashFile(path.join(resourcesPath, it)));
    const result = {};

    for (let i = 0; i < names.length; i++) {
      result[names[i]] = checksums[i];
    }

    return Object.assign({
      checksums: result
    }, options);
  });
  return _computeData.apply(this, arguments);
}

function hashFile(file, algorithm = "sha512", encoding = "base64") {
  return new Promise((resolve, reject) => {
    const hash = (0, _crypto().createHash)(algorithm);
    hash.on("error", reject).setEncoding(encoding);
    (0, _fs().createReadStream)(file).on("error", reject).on("end", () => {
      hash.end();
      resolve(hash.read());
    }).pipe(hash, {
      end: false
    });
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=integrity.js.map{"version":3,"sources":["../../src/asar/integrity.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;;;SAesB,W;;;;;+CAAf,WAA2B,aAA3B,EAAkD,OAAlD,EAAuF;AAC5F;AACA,UAAM,KAAK,GAAG,OAAO,yBAAQ,aAAR,CAAP,EAA+B,MAA/B,CAAsC,EAAE,IAAI,EAAE,CAAC,QAAH,CAAY,OAAZ,CAA5C,EAAkE,IAAlE,EAAd;AACA,UAAM,SAAS,SAAS,uBAAgB,GAAhB,CAAoB,KAApB,EAA2B,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAL,CAAU,aAAV,EAAyB,EAAzB,CAAD,CAAzC,CAAxB;AAEA,UAAM,MAAM,GAA+B,EAA3C;;AACA,SAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,KAAK,CAAC,MAA1B,EAAkC,CAAC,EAAnC,EAAuC;AACrC,MAAA,MAAM,CAAC,KAAK,CAAC,CAAD,CAAN,CAAN,GAAmB,SAAS,CAAC,CAAD,CAA5B;AACD;;AACD,WAAA,MAAA,CAAA,MAAA,CAAA;AAAQ,MAAA,SAAS,EAAE;AAAnB,KAAA,EAA8B,OAA9B,CAAA;AACD,G;;;;AAED,SAAS,QAAT,CAAkB,IAAlB,EAAgC,SAAA,GAAoB,QAApD,EAA8D,QAAA,GAAwC,QAAtG,EAA8G;AAC5G,SAAO,IAAI,OAAJ,CAAoB,CAAC,OAAD,EAAU,MAAV,KAAoB;AAC7C,UAAM,IAAI,GAAG,0BAAW,SAAX,CAAb;AACA,IAAA,IAAI,CACD,EADH,CACM,OADN,EACe,MADf,EAEG,WAFH,CAEe,QAFf;AAIA,gCAAiB,IAAjB,EACG,EADH,CACM,OADN,EACe,MADf,EAEG,EAFH,CAEM,KAFN,EAEa,MAAK;AACd,MAAA,IAAI,CAAC,GAAL;AACA,MAAA,OAAO,CAAC,IAAI,CAAC,IAAL,EAAD,CAAP;AACD,KALH,EAMG,IANH,CAMQ,IANR,EAMc;AAAC,MAAA,GAAG,EAAE;AAAN,KANd;AAOD,GAbM,CAAP;AAcD,C","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { createHash } from \"crypto\"\nimport { createReadStream } from \"fs\"\nimport { readdir } from \"fs-extra-p\"\nimport * as path from \"path\"\n\nexport interface AsarIntegrityOptions {\n  /**\n   * Allows external asar files.\n   *\n   * @default false\n   */\n  readonly externalAllowed?: boolean\n}\n\nexport interface AsarIntegrity extends AsarIntegrityOptions {\n  checksums: { [key: string]: string; }\n}\n\nexport async function computeData(resourcesPath: string, options?: AsarIntegrityOptions | null): Promise<AsarIntegrity> {\n  // sort to produce constant result\n  const names = (await readdir(resourcesPath)).filter(it => it.endsWith(\".asar\")).sort()\n  const checksums = await BluebirdPromise.map(names, it => hashFile(path.join(resourcesPath, it)))\n\n  const result: { [key: string]: string; } = {}\n  for (let i = 0; i < names.length; i++) {\n    result[names[i]] = checksums[i]\n  }\n  return {checksums: result, ...options}\n}\n\nfunction hashFile(file: string, algorithm: string = \"sha512\", encoding: \"hex\" | \"base64\" | \"latin1\" = \"base64\") {\n  return new Promise<string>((resolve, reject) => {\n    const hash = createHash(algorithm)\n    hash\n      .on(\"error\", reject)\n      .setEncoding(encoding)\n\n    createReadStream(file)\n      .on(\"error\", reject)\n      .on(\"end\", () => {\n        hash.end()\n        resolve(hash.read() as string)\n      })\n      .pipe(hash, {end: false})\n  })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isLibOrExe = isLibOrExe;
exports.detectUnpackedDirs = detectUnpackedDirs;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _isbinaryfile() {
  const data = require("isbinaryfile");

  _isbinaryfile = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _fileTransformer() {
  const data = require("../fileTransformer");

  _fileTransformer = function () {
    return data;
  };

  return data;
}

function _appFileCopier() {
  const data = require("../util/appFileCopier");

  _appFileCopier = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function addValue(map, key, value) {
  let list = map.get(key);

  if (list == null) {
    list = [value];
    map.set(key, list);
  } else {
    list.push(value);
  }
}

function isLibOrExe(file) {
  return file.endsWith(".dll") || file.endsWith(".exe") || file.endsWith(".dylib") || file.endsWith(".so");
}
/** @internal */


function detectUnpackedDirs(_x, _x2, _x3, _x4) {
  return _detectUnpackedDirs.apply(this, arguments);
} function _detectUnpackedDirs() {
  _detectUnpackedDirs = (0, _bluebirdLst().coroutine)(function* (fileSet, autoUnpackDirs, unpackedDest, rootForAppFilesWithoutAsar) {
    const dirToCreate = new Map();
    const metadata = fileSet.metadata;

    function addParents(child, root) {
      child = path.dirname(child);

      if (autoUnpackDirs.has(child)) {
        return;
      }

      do {
        autoUnpackDirs.add(child);
        const p = path.dirname(child); // create parent dir to be able to copy file later without directory existence check

        addValue(dirToCreate, p, path.basename(child));

        if (child === root || p === root || autoUnpackDirs.has(p)) {
          break;
        }

        child = p;
      } while (true);

      autoUnpackDirs.add(root);
    }

    for (let i = 0, n = fileSet.files.length; i < n; i++) {
      const file = fileSet.files[i];
      const index = file.lastIndexOf(_fileTransformer().NODE_MODULES_PATTERN);

      if (index < 0) {
        continue;
      }

      let nextSlashIndex = file.indexOf(path.sep, index + _fileTransformer().NODE_MODULES_PATTERN.length + 1);

      if (nextSlashIndex < 0) {
        continue;
      }

      if (file[index + _fileTransformer().NODE_MODULES_PATTERN.length] === "@") {
        nextSlashIndex = file.indexOf(path.sep, nextSlashIndex + 1);
      }

      if (!metadata.get(file).isFile()) {
        continue;
      }

      const packageDir = file.substring(0, nextSlashIndex);
      const packageDirPathInArchive = path.relative(rootForAppFilesWithoutAsar, (0, _appFileCopier().getDestinationPath)(packageDir, fileSet));
      const pathInArchive = path.relative(rootForAppFilesWithoutAsar, (0, _appFileCopier().getDestinationPath)(file, fileSet));

      if (autoUnpackDirs.has(packageDirPathInArchive)) {
        // if package dir is unpacked, any file also unpacked
        addParents(pathInArchive, packageDirPathInArchive);
        continue;
      } // https://github.com/electron-userland/electron-builder/issues/2679


      let shouldUnpack = false; // ffprobe-static and ffmpeg-static are known packages to always unpack

      const moduleName = path.basename(packageDir);

      if (moduleName === "ffprobe-static" || moduleName === "ffmpeg-static" || isLibOrExe(file)) {
        shouldUnpack = true;
      } else if (!file.includes(".", nextSlashIndex) && path.extname(file) === "") {
        shouldUnpack = yield (0, _isbinaryfile().isBinaryFile)(file);
      }

      if (!shouldUnpack) {
        continue;
      }

      if (_builderUtil().log.isDebugEnabled) {
        _builderUtil().log.debug({
          file: pathInArchive,
          reason: "contains executable code"
        }, "not packed into asar archive");
      }

      addParents(pathInArchive, packageDirPathInArchive);
    }

    if (dirToCreate.size > 0) {
      yield (0, _fsExtraP().ensureDir)(unpackedDest + path.sep + "node_modules"); // child directories should be not created asynchronously - parent directories should be created first

      yield _bluebirdLst().default.map(dirToCreate.keys(),
      /*#__PURE__*/
      function () {
        var _ref = (0, _bluebirdLst().coroutine)(function* (parentDir) {
          const base = unpackedDest + path.sep + parentDir;
          yield (0, _fsExtraP().ensureDir)(base);
          yield _bluebirdLst().default.each(dirToCreate.get(parentDir), it => {
            if (dirToCreate.has(parentDir + path.sep + it)) {
              // already created
              return null;
            } else {
              return (0, _fsExtraP().ensureDir)(base + path.sep + it);
            }
          });
        });

        return function (_x5) {
          return _ref.apply(this, arguments);
        };
      }(), _fs().CONCURRENCY);
    }
  });
  return _detectUnpackedDirs.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=unpackDetector.js.map{"version":3,"sources":["../../src/asar/unpackDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { log } from \"builder-util\"\nimport { CONCURRENCY } from \"builder-util/out/fs\"\nimport { ensureDir } from \"fs-extra-p\"\nimport { isBinaryFile } from \"isbinaryfile\"\nimport * as path from \"path\"\nimport { NODE_MODULES_PATTERN } from \"../fileTransformer\"\nimport { getDestinationPath, ResolvedFileSet } from \"../util/appFileCopier\"\n\nfunction addValue(map: Map<string, Array<string>>, key: string, value: string) {\n  let list = map.get(key)\n  if (list == null) {\n    list = [value]\n    map.set(key, list)\n  }\n  else {\n    list.push(value)\n  }\n}\n\nexport function isLibOrExe(file: string): boolean {\n  return file.endsWith(\".dll\") || file.endsWith(\".exe\") || file.endsWith(\".dylib\") || file.endsWith(\".so\")\n}\n\n/** @internal */\nexport async function detectUnpackedDirs(fileSet: ResolvedFileSet, autoUnpackDirs: Set<string>, unpackedDest: string, rootForAppFilesWithoutAsar: string) {\n  const dirToCreate = new Map<string, Array<string>>()\n  const metadata = fileSet.metadata\n\n  function addParents(child: string, root: string) {\n    child = path.dirname(child)\n    if (autoUnpackDirs.has(child)) {\n      return\n    }\n\n    do {\n      autoUnpackDirs.add(child)\n      const p = path.dirname(child)\n      // create parent dir to be able to copy file later without directory existence check\n      addValue(dirToCreate, p, path.basename(child))\n\n      if (child === root || p === root || autoUnpackDirs.has(p)) {\n        break\n      }\n      child = p\n    }\n    while (true)\n\n    autoUnpackDirs.add(root)\n  }\n\n  for (let i = 0, n = fileSet.files.length; i < n; i++) {\n    const file = fileSet.files[i]\n    const index = file.lastIndexOf(NODE_MODULES_PATTERN)\n    if (index < 0) {\n      continue\n    }\n\n    let nextSlashIndex = file.indexOf(path.sep, index + NODE_MODULES_PATTERN.length + 1)\n    if (nextSlashIndex < 0) {\n      continue\n    }\n\n    if (file[index + NODE_MODULES_PATTERN.length] === \"@\") {\n      nextSlashIndex = file.indexOf(path.sep, nextSlashIndex + 1)\n    }\n\n    if (!metadata.get(file)!.isFile()) {\n      continue\n    }\n\n    const packageDir = file.substring(0, nextSlashIndex)\n    const packageDirPathInArchive = path.relative(rootForAppFilesWithoutAsar, getDestinationPath(packageDir, fileSet))\n    const pathInArchive = path.relative(rootForAppFilesWithoutAsar, getDestinationPath(file, fileSet))\n    if (autoUnpackDirs.has(packageDirPathInArchive)) {\n      // if package dir is unpacked, any file also unpacked\n      addParents(pathInArchive, packageDirPathInArchive)\n      continue\n    }\n\n    // https://github.com/electron-userland/electron-builder/issues/2679\n    let shouldUnpack = false\n    // ffprobe-static and ffmpeg-static are known packages to always unpack\n    const moduleName = path.basename(packageDir)\n    if (moduleName ===  \"ffprobe-static\" || moduleName === \"ffmpeg-static\" || isLibOrExe(file)) {\n      shouldUnpack = true\n    }\n    else if (!file.includes(\".\", nextSlashIndex) && path.extname(file) === \"\") {\n      shouldUnpack = await isBinaryFile(file)\n    }\n\n    if (!shouldUnpack) {\n      continue\n    }\n\n    if (log.isDebugEnabled) {\n      log.debug({file: pathInArchive, reason: \"contains executable code\"}, \"not packed into asar archive\")\n    }\n\n    addParents(pathInArchive, packageDirPathInArchive)\n  }\n\n  if (dirToCreate.size > 0) {\n    await ensureDir(unpackedDest + path.sep + \"node_modules\")\n    // child directories should be not created asynchronously - parent directories should be created first\n    await BluebirdPromise.map(dirToCreate.keys(), async parentDir => {\n      const base = unpackedDest + path.sep + parentDir\n      await ensureDir(base)\n      await BluebirdPromise.each(dirToCreate.get(parentDir)!, (it): any => {\n        if (dirToCreate.has(parentDir + path.sep + it)) {\n          // already created\n          return null\n        }\n        else {\n          return ensureDir(base + path.sep + it)\n        }\n      })\n    }, CONCURRENCY)\n  }\n}"],"sourceRoot":""}
kych               _`      8  d  p  Mè  N  Oˆ  Q   Rx  Rø  T  TØ  ^x  ,          L  $          L   Œ   Ð    \  „  ¬  Ô    H  �  Ø   @                      !   %       CSSM_DL_DB_SCHEMA_INFO     D                     !   %      CSSM_DL_DB_SCHEMA_ATTRIBUTES   D                     !   %      CSSM_DL_DB_SCHEMA_INDEXES      H                     !   %       CSSM_DL_DB_SCHEMA_PARSING_MODULE   (                     !   %€          (                     !   %€         (                     !   %€         0                     !   %€ €    DBBlob     D                     !   %      CSSM_DL_DB_RECORD_PUBLIC_KEY   H   	                  !   %      CSSM_DL_DB_RECORD_PRIVATE_KEY      H   
                  !   %      CSSM_DL_DB_RECORD_SYMMETRIC_KEY    L                     !   %€     "CSSM_DL_DB_RECORD_X509_CERTIFICATE                 Z  „         Z  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä  	  	D  	„  	Ä  
  
D  
„  
Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä    D  „  Ä   @                      -   1   5   9   =€       acct          @                     -   1   5   9   =€       svce          @                     -   1   5   9   =€      acct         @                     -   1   5   9   =€      svce         @                     -   1   5   9   =€      acct          @                     -   1   5   9   =€      vlme          @                     -   1   5   9   =€      addr          @                     -   1   5   9   =€      ssig          @                     -   1   5   9   =€     acct         @   	                  -   1   5   9   =€     vlme         @   
                  -   1   5   9   =€     addr         @                     -   1   5   9   =€     ssig         @                     -   1   5   9   =€      acct          @                     -   1   5   9   =€      sdmn          @                     -   1   5   9   =€      srvr          @                     -   1   5   9   =€      ptcl          @                     -   1   5   9   =€      atyp          @                     -   1   5   9   =€      port          @                     -   1   5   9   =€      path          @                     -   1   5   9   =€     acct         @                     -   1   5   9   =€     	sdmn         @                     -   1   5   9   =€     
srvr         @                     -   1   5   9   =€     ptcl         @                     -   1   5   9   =€     atyp         @                     -   1   5   9   =€     port         @                     -   1   5   9   =€     path         @                     -   1   5   9   =                    @                     -   1   5   9   =                    @                     -   1   5   9   =                    @                     -   1   5   9   =          	          @                     -   1   5   9   =          
          @                     -   1   5   9   =                    @                      -   1   5   9   =                    @   !                  -   1   5   9   =                    @   "                  -   1   5   9   =                  @   #                  -   1   5   9   =                  @   $                  -   1   5   9   =                  @   %                  -   1   5   9   =                  @   &                  -   1   5   9   =                  @   '                  -   1   5   9   =                  @   (                  -   1   5   9   =                  @   )                  -   1   5   9   =                  @   *                  -   1   5   9   =      	            @   +                  -   1   5   9   =      
            @   ,                  -   1   5   9   =                    @   -                  -   1   5   9   =                    @   .                  -   1   5   9   =                    @   /                  -   1   5   9   =          	          @   0                  -   1   5   9   =          
          @   1                  -   1   5   9   =                    @   2                  -   1   5   9   =                    @   3                  -   1   5   9   =                    @   4                  -   1   5   9   =                  @   5                  -   1   5   9   =                  @   6                  -   1   5   9   =                  @   7                  -   1   5   9   =                  @   8                  -   1   5   9   =                  @   9                  -   1   5   9   =                  @   :                  -   1   5   9   =                  @   ;                  -   1   5   9   =                  @   <                  -   1   5   9   =      	            @   =                  -   1   5   9   =      
            @   >                  -   1   5   9   =                    @   ?                  -   1   5   9   =                    @   @                  -   1   5   9   =                    @   A                  -   1   5   9   =          	          @   B                  -   1   5   9   =          
          @   C                  -   1   5   9   =                    @   D                  -   1   5   9   =                    @   E                  -   1   5   9   =                    @   F                  -   1   5   9   =                  @   G                  -   1   5   9   =                  @   H                  -   1   5   9   =                  @   I                  -   1   5   9   =                  @   J                  -   1   5   9   =                  @   K                  -   1   5   9   =                  @   L                  -   1   5   9   =                  @   M                  -   1   5   9   =                  @   N                  -   1   5   9   =      	            @   O                  -   1   5   9   =      
            @   P                  -   1   5   9   =€      ctyp          @   Q                  -   1   5   9   =€      issu          @   R                  -   1   5   9   =€      snbr          @   S                  -   1   5   9   =€     ctyp         @   T                  -   1   5   9   =€     alis         @   U                  -   1   5   9   =€     subj         @   V                  -   1   5   9   =€     issu         @   W                  -   1   5   9   =€     snbr         @   X                  -   1   5   9   =€     skid         @   Y                  -   1   5   9   =€     hpky               2x      ¤  ¬  2p       ¤  ¬  ü  L  œ  ì  D  ˜  ì  @  �  Ü  ,  |  Ô  $  t  À    X  ¬  ì  	,  	l  	¬  	ì  
,  
l  
¼    H  ˆ  È    H  ˆ  È    H  ˆ  È    H  ˆ  Ø  $  d  ¤  ä  $  d  ¤  ä  $  d  ¤  ä  $  d  ¤  ä  $  d  ´     @  €  À     @  €  À     @  €  À    \  ¨  ø  D  ”  à  4  „  Ð  $  x  È    d  ¸    \  ¨  ô  @  ˆ  Ô  $  x  À    X  ¨  ô   D   �   à  !,  !€  !Ð  "  "p  "Ä  #  #`  #°  $  $T  $¨  $ô  %@  %Œ  %Ô  &   &p  &Ä  '  'X  '¤  'ô  (@  (�  (Ü  ),  )x  )Ì  *  *h  *¼  +  +`  +¬  +ü  ,P  ,   ,ô  -@  -Œ  -Ø  .   .l  .¼  /  /X  /¤  /ð  0@  0�  0Ü  1(  1t  1Ä  2   P                      1   5   9   =       M               
RelationID        P                     1   5   9   =       M              RelationName       P                     1   5   9   =       M              
RelationID        P                     1   5   9   =       M             AttributeID       X                     1   5   9   =       U             AttributeNameFormat       T                     1   5   9   =       Q             AttributeName          T                     1   5   9   =       Q             AttributeNameID       T                     1   5   9   =       Q             AttributeFormat       P                     1   5   9   =       M              
RelationID        L   	                  1   5   9   =       I             IndexID       P   
                  1   5   9   =       M             AttributeID       P                     1   5   9   =       M             	IndexType         X                     1   5   9   =       U             IndexedDataLocation       P                     1   5   9   =       M              
RelationID        P                     1   5   9   =       M             AttributeID       L                     1   5   9   =       I             ModuleID      P                     1   5   9   =       M             AddinVersion       H                     1   5   9   =       E             SSID      T                     1   5   9   =       Q             SubserviceType        @                     1   5   9           =€   cdat         @                     1   5   9           =€   mdat         @                     1   5   9           =€   desc         @                     1   5   9           =€   icmt         @                     1   5   9           =€   crtr         @                     1   5   9           =€   type         @                     1   5   9           =€   scrp         P                     1   5   9   =       M€             	PrintName         L                     1   5   9   =       I€             Alias         @                     1   5   9           =€   invi         @                     1   5   9           =€   nega         @                     1   5   9           =€   cusi         @                     1   5   9           =€   prot         @                      1   5   9           =€   acct         @   !                  1   5   9           =€   svce         @   "                  1   5   9           =€   gena         @   #                  1   5   9           =€  cdat         @   $                  1   5   9           =€  mdat         @   %                  1   5   9           =€  desc         @   &                  1   5   9           =€  icmt         @   '                  1   5   9           =€  crtr         @   (                  1   5   9           =€  type         @   )                  1   5   9           =€  scrp         P   *                  1   5   9   =       M€            	PrintName         L   +                  1   5   9   =       I€            Alias         @   ,                  1   5   9           =€  invi         @   -                  1   5   9           =€  nega         @   .                  1   5   9           =€  cusi         @   /                  1   5   9           =€  prot         @   0                  1   5   9           =€  acct         @   1                  1   5   9           =€  vlme         @   2                  1   5   9           =€  srvr         @   3                  1   5   9           =€  ptcl         @   4                  1   5   9           =€  addr         @   5                  1   5   9           =€  ssig         @   6                  1   5   9           =€  cdat         @   7                  1   5   9           =€  mdat         @   8                  1   5   9           =€  desc         @   9                  1   5   9           =€  icmt         @   :                  1   5   9           =€  crtr         @   ;                  1   5   9           =€  type         @   <                  1   5   9           =€  scrp         P   =                  1   5   9   =       M€            	PrintName         L   >                  1   5   9   =       I€            Alias         @   ?                  1   5   9           =€  invi         @   @                  1   5   9           =€  nega         @   A                  1   5   9           =€  cusi         @   B                  1   5   9           =€  prot         @   C                  1   5   9           =€  acct         @   D                  1   5   9           =€  sdmn         @   E                  1   5   9           =€  srvr         @   F                  1   5   9           =€  ptcl         @   G                  1   5   9           =€  atyp         @   H                  1   5   9           =€  port         @   I                  1   5   9           =€  path         L   J                  1   5   9   =       I             KeyClass      P   K                  1   5   9   =       M            	PrintName         L   L                  1   5   9   =       I            Alias         P   M                  1   5   9   =       M            	Permanent         L   N                  1   5   9   =       I            Private       P   O                  1   5   9   =       M            
Modifiable        L   P                  1   5   9   =       I            Label         T   Q                  1   5   9   =       Q            ApplicationTag        P   R                  1   5   9   =       M            
KeyCreator        L   S                  1   5   9   =       I      	      KeyType       T   T                  1   5   9   =       Q      
      KeySizeInBits         T   U                  1   5   9   =       Q            EffectiveKeySize      P   V                  1   5   9   =       M            	StartDate         L   W                  1   5   9   =       I            EndDate       P   X                  1   5   9   =       M            	Sensitive         T   Y                  1   5   9   =       Q            AlwaysSensitive       P   Z                  1   5   9   =       M            Extractable       T   [                  1   5   9   =       Q            NeverExtractable      L   \                  1   5   9   =       I            Encrypt       L   ]                  1   5   9   =       I            Decrypt       L   ^                  1   5   9   =       I            Derive        H   _                  1   5   9   =       E            Sign      L   `                  1   5   9   =       I            Verify        P   a                  1   5   9   =       M            SignRecover       T   b                  1   5   9   =       Q            VerifyRecover         H   c                  1   5   9   =       E            Wrap      L   d                  1   5   9   =       I            Unwrap        L   e                  1   5   9   =       I             KeyClass      P   f                  1   5   9   =       M            	PrintName         L   g                  1   5   9   =       I            Alias         P   h                  1   5   9   =       M            	Permanent         L   i                  1   5   9   =       I            Private       P   j                  1   5   9   =       M            
Modifiable        L   k                  1   5   9   =       I            Label         T   l                  1   5   9   =       Q            ApplicationTag        P   m                  1   5   9   =       M            
KeyCreator        L   n                  1   5   9   =       I      	      KeyType       T   o                  1   5   9   =       Q      
      KeySizeInBits         T   p                  1   5   9   =       Q            EffectiveKeySize      P   q                  1   5   9   =       M            	StartDate         L   r                  1   5   9   =       I            EndDate       P   s                  1   5   9   =       M            	Sensitive         T   t                  1   5   9   =       Q            AlwaysSensitive       P   u                  1   5   9   =       M            Extractable       T   v                  1   5   9   =       Q            NeverExtractable      L   w                  1   5   9   =       I            Encrypt       L   x                  1   5   9   =       I            Decrypt       L   y                  1   5   9   =       I            Derive        H   z                  1   5   9   =       E            Sign      L   {                  1   5   9   =       I            Verify        P   |                  1   5   9   =       M            SignRecover       T   }                  1   5   9   =       Q            VerifyRecover         H   ~                  1   5   9   =       E            Wrap      L                     1   5   9   =       I            Unwrap        L   €                  1   5   9   =       I             KeyClass      P   �                  1   5   9   =       M            	PrintName         L   ‚                  1   5   9   =       I            Alias         P   ƒ                  1   5   9   =       M            	Permanent         L   „                  1   5   9   =       I            Private       P   …                  1   5   9   =       M            
Modifiable        L   †                  1   5   9   =       I            Label         T   ‡                  1   5   9   =       Q            ApplicationTag        P   ˆ                  1   5   9   =       M            
KeyCreator        L   ‰                  1   5   9   =       I      	      KeyType       T   Š                  1   5   9   =       Q      
      KeySizeInBits         T   ‹                  1   5   9   =       Q            EffectiveKeySize      P   Œ                  1   5   9   =       M            	StartDate         L   �                  1   5   9   =       I            EndDate       P   Ž                  1   5   9   =       M            	Sensitive         T   �                  1   5   9   =       Q            AlwaysSensitive       P   �                  1   5   9   =       M            Extractable       T   ‘                  1   5   9   =       Q            NeverExtractable      L   ’                  1   5   9   =       I            Encrypt       L   “                  1   5   9   =       I            Decrypt       L   ”                  1   5   9   =       I            Derive        H   •                  1   5   9   =       E            Sign      L   –                  1   5   9   =       I            Verify        P   —                  1   5   9   =       M            SignRecover       T   ˜                  1   5   9   =       Q            VerifyRecover         H   ™                  1   5   9   =       E            Wrap      L   š                  1   5   9   =       I            Unwrap        L   ›                  1   5   9   =       I€  ctyp      CertType      P   œ                  1   5   9   =       M€  cenc      CertEncoding      P   �                  1   5   9   =       M€  labl      	PrintName         L   ž                  1   5   9   =       I€  alis      Alias         L   Ÿ                  1   5   9   =       I€  subj      Subject       L                      1   5   9   =       I€  issu      Issuer        P   ¡                  1   5   9   =       M€  snbr      SerialNumber      X   ¢                  1   5   9   =       U€  skid      SubjectKeyIdentifier      T   £                  1   5   9   =       Q€  hpky      PublicKeyHash                (                                  x                           X      T   ˆ       ¸   Ð   è       0  H  `   4                      	   
                                                                                                                                                                                   	                    
                x                           X      T   ˆ       ¸   Ð   è       0  H  `   4                      	   
                                                                                                                                                                                   	                    
                x                           X      T   ˆ       ¸   Ð   è       0  H  `   4                      	   
                                                                                                                                                                                   	                    
                 €€                            `      4   P   h             acctsvce                 acct                 svce       €                                 H   x   �   ¨   À   Ø   ð     0          acctsdmnsrvrptclatypportpath                 acct          	       sdmn          
       srvr                 ptcl                 atyp                 port                 path       À€                                  <   `   x   �   ¨   $          acctvlmeaddrssig                 acct                 vlme                 addr                 ssig      	 €           P             0             &      e  i  m  ­  í  �  õ    0‚"0‚
 Þ¼Ä9m 0	*†H†÷ 0b10	UUS10U

Apple Inc.1&0$UApple Certification Authority10UApple Root CA0130207214847Z230207214847Z0�–10	UUS10U

Apple Inc.1,0*U#Apple Worldwide Developer Relations1D0BU;Apple Worldwide Developer Relations Certification Authority0‚"0	*†H†÷ ‚ 0‚
‚ Ê8T¦ËVªÈ$9HéŒîì_¸&‘¼4SzÎ|c€awd^¥#¶9þP-VXp-~ÄnÁJ…>/ðÞ„¡WÉ¯{ÿjúI¬ªÛ*2í–chR=ŒŠì¿k•à¬}—gÎ…•7jí	¶®gÍQdŸÆ\Ñ¼Wng5€v6¤‡�n8�Ø+N{%ØZ¿NƒÁ�Ò“Õqµ`œ�3NUùX†¸ÁåwE�PHº+-ä”…áèÄ�Æh¥°£üg~pºYKwB‘9¹õÍáLïÀ;HŒ¦å!]ýjj»§5`Òæ­óF)ÉèÃ‹éyÀjag²ðýåh¼b_nÏ™Ýïcþ’e« £�¦0�£0Uˆ'	©¶`‹ìëºöGYÅRT£·0Uÿ0ÿ0U#0€+ÐiG”v	þôk�.@¦÷GM^0.U'0%0# ! †http://crl.apple.com/root.crl0Uÿ†0
*†H†÷cd 0	*†H†÷ ‚ OÏïY¾,õ²l/�î‡2è5¨n‹}Éi¹Ù¼w,Ôgâýšm:Y\ßƒ½²®*ar±¯ÍÃE0�£ƒÎG´ñ“Š£t›¤Ã˜r‡;>¯E’T¹2»�Sk
N¶ÙPl!€
‰NWŒk[<=¦ýÞ÷#J&‡?º‘’L¤mWõzX‡{hŠä†ŒJëâIª¥ÝU ©®»K0®á ±¼)€æ	wå¾4¢ÊÜâ
æ;¸»ìºb•ócA‚Í;L•¤Û«ùÉ•éOäMç&™�é¼ù´)Òzfá.Œö!ŠÅøxá�®¿Ó��©­ó¯ý8–g0Q¥\ìqŠ‚´l           ;Apple Worldwide Developer Relations Certification Authority    ;Apple Worldwide Developer Relations Certification Authority    ™0�–10	UUS10U

Apple Inc.1,0*U#Apple Worldwide Developer Relations1D0BU;Apple Worldwide Developer Relations Certification Authority      d0b10	UUS10U

APPLE INC.1&0$UAPPLE CERTIFICATION AUTHORITY10UAPPLE ROOT CA   Þ¼Ä9m    ˆ'	©¶`‹ìëºöGYÅRT£·   ˆ'	©¶`‹ìëºöGYÅRT£·  P     x    D  ¨  l  ø  	(  	d   ¤          ctypissusnbr             x      d0b10	UUS10U

APPLE INC.1&0$UAPPLE CERTIFICATION AUTHORITY10UAPPLE ROOT CA   Þ¼Ä9m    (          ctyp     <             d          alis     d       @   ;Apple Worldwide Developer Relations Certification Authority    Ä          subj     È           ™0�–10	UUS10U

Apple Inc.1,0*U#Apple Worldwide Developer Relations1D0BU;Apple Worldwide Developer Relations Certification Authority      Œ          issu     Œ       h   d0b10	UUS10U

APPLE INC.1&0$UAPPLE CERTIFICATION AUTHORITY10UAPPLE ROOT CA   0          snbr     	          Þ¼Ä9m    <          skid     	H          ˆ'	©¶`‹ìëºöGYÅRT£·   <          hpky     	„          ˆ'	©¶`‹ìëºöGYÅRT£·   è€ €           à              À             ¨    úÞ      x   ¨’ž8ºâX‡¬*½êHþ5    ÿÿÿ   ßa #åuÁ]rþöÄ‚¥1ÒíËð<®¶{Í´p�ÀªƒûL¥±Ž‹«1]\®=                  ser   ½!ãÓfÒ¡sßIŸ%bÃ¬TKuG²£‘—ß€xR†'	ûÃç#u'ƒvÉ          (The MIT License)

Copyright (C) 2012 by Vitaly Puzrin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'use strict';

module.exports = require('./lib/argparse');
{
  "dependencies": {
    "sprintf-js": "~1.0.2"
  },
  "deprecated": false,
  "description": "Very powerful CLI arguments parser. Native port of argparse - python's options parsing library",
  "devDependencies": {
    "eslint": "^2.13.1",
    "istanbul": "^0.4.5",
    "mocha": "^3.1.0",
    "ndoc": "^5.0.1"
  },
  "files": [
    "index.js",
    "lib/"
  ],
  "homepage": "https://github.com/nodeca/argparse#readme",
  "license": "MIT",
  "name": "argparse",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/nodeca/argparse.git"
  },
  "version": "1.0.10"
}/**
 * class Action
 *
 * Base class for all actions
 * Do not call in your code, use this class only for inherits your own action
 *
 * Information about how to convert command line strings to Javascript objects.
 * Action objects are used by an ArgumentParser to represent the information
 * needed to parse a single argument from one or more strings from the command
 * line. The keyword arguments to the Action constructor are also all attributes
 * of Action instances.
 *
 * ##### Allowed keywords:
 *
 * - `store`
 * - `storeConstant`
 * - `storeTrue`
 * - `storeFalse`
 * - `append`
 * - `appendConstant`
 * - `count`
 * - `help`
 * - `version`
 *
 * Information about action options see [[Action.new]]
 *
 * See also [original guide](http://docs.python.org/dev/library/argparse.html#action)
 *
 **/

'use strict';


// Constants
var c = require('./const');


/**
 * new Action(options)
 *
 * Base class for all actions. Used only for inherits
 *
 *
 * ##### Options:
 *
 * - `optionStrings`  A list of command-line option strings for the action.
 * - `dest`  Attribute to hold the created object(s)
 * - `nargs`  The number of command-line arguments that should be consumed.
 * By default, one argument will be consumed and a single value will be
 * produced.
 * - `constant`  Default value for an action with no value.
 * - `defaultValue`  The value to be produced if the option is not specified.
 * - `type`  Cast to 'string'|'int'|'float'|'complex'|function (string). If
 * None, 'string'.
 * - `choices`  The choices available.
 * - `required`  True if the action must always be specified at the command
 * line.
 * - `help`  The help describing the argument.
 * - `metavar`  The name to be used for the option's argument with the help
 * string. If None, the 'dest' value will be used as the name.
 *
 * ##### nargs supported values:
 *
 * - `N` (an integer) consumes N arguments (and produces a list)
 * - `?`  consumes zero or one arguments
 * - `*` consumes zero or more arguments (and produces a list)
 * - `+` consumes one or more arguments (and produces a list)
 *
 * Note: that the difference between the default and nargs=1 is that with the
 * default, a single value will be produced, while with nargs=1, a list
 * containing a single value will be produced.
 **/
var Action = module.exports = function Action(options) {
  options = options || {};
  this.optionStrings = options.optionStrings || [];
  this.dest = options.dest;
  this.nargs = typeof options.nargs !== 'undefined' ? options.nargs : null;
  this.constant = typeof options.constant !== 'undefined' ? options.constant : null;
  this.defaultValue = options.defaultValue;
  this.type = typeof options.type !== 'undefined' ? options.type : null;
  this.choices = typeof options.choices !== 'undefined' ? options.choices : null;
  this.required = typeof options.required !== 'undefined' ? options.required : false;
  this.help = typeof options.help !== 'undefined' ? options.help : null;
  this.metavar = typeof options.metavar !== 'undefined' ? options.metavar : null;

  if (!(this.optionStrings instanceof Array)) {
    throw new Error('optionStrings should be an array');
  }
  if (typeof this.required !== 'undefined' && typeof this.required !== 'boolean') {
    throw new Error('required should be a boolean');
  }
};

/**
 * Action#getName -> String
 *
 * Tells action name
 **/
Action.prototype.getName = function () {
  if (this.optionStrings.length > 0) {
    return this.optionStrings.join('/');
  } else if (this.metavar !== null && this.metavar !== c.SUPPRESS) {
    return this.metavar;
  } else if (typeof this.dest !== 'undefined' && this.dest !== c.SUPPRESS) {
    return this.dest;
  }
  return null;
};

/**
 * Action#isOptional -> Boolean
 *
 * Return true if optional
 **/
Action.prototype.isOptional = function () {
  return !this.isPositional();
};

/**
 * Action#isPositional -> Boolean
 *
 * Return true if positional
 **/
Action.prototype.isPositional = function () {
  return (this.optionStrings.length === 0);
};

/**
 * Action#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Should be implemented in inherited classes
 *
 * ##### Example
 *
 *      ActionCount.prototype.call = function (parser, namespace, values, optionString) {
 *        namespace.set(this.dest, (namespace[this.dest] || 0) + 1);
 *      };
 *
 **/
Action.prototype.call = function () {
  throw new Error('.call() not defined');// Not Implemented error
};
/** internal
 * class ActionContainer
 *
 * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]]
 **/

'use strict';

var format = require('util').format;

// Constants
var c = require('./const');

var $$ = require('./utils');

//Actions
var ActionHelp = require('./action/help');
var ActionAppend = require('./action/append');
var ActionAppendConstant = require('./action/append/constant');
var ActionCount = require('./action/count');
var ActionStore = require('./action/store');
var ActionStoreConstant = require('./action/store/constant');
var ActionStoreTrue = require('./action/store/true');
var ActionStoreFalse = require('./action/store/false');
var ActionVersion = require('./action/version');
var ActionSubparsers = require('./action/subparsers');

// Errors
var argumentErrorHelper = require('./argument/error');

/**
 * new ActionContainer(options)
 *
 * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]]
 *
 * ##### Options:
 *
 * - `description` -- A description of what the program does
 * - `prefixChars`  -- Characters that prefix optional arguments
 * - `argumentDefault`  -- The default value for all arguments
 * - `conflictHandler` -- The conflict handler to use for duplicate arguments
 **/
var ActionContainer = module.exports = function ActionContainer(options) {
  options = options || {};

  this.description = options.description;
  this.argumentDefault = options.argumentDefault;
  this.prefixChars = options.prefixChars || '';
  this.conflictHandler = options.conflictHandler;

  // set up registries
  this._registries = {};

  // register actions
  this.register('action', null, ActionStore);
  this.register('action', 'store', ActionStore);
  this.register('action', 'storeConst', ActionStoreConstant);
  this.register('action', 'storeTrue', ActionStoreTrue);
  this.register('action', 'storeFalse', ActionStoreFalse);
  this.register('action', 'append', ActionAppend);
  this.register('action', 'appendConst', ActionAppendConstant);
  this.register('action', 'count', ActionCount);
  this.register('action', 'help', ActionHelp);
  this.register('action', 'version', ActionVersion);
  this.register('action', 'parsers', ActionSubparsers);

  // raise an exception if the conflict handler is invalid
  this._getHandler();

  // action storage
  this._actions = [];
  this._optionStringActions = {};

  // groups
  this._actionGroups = [];
  this._mutuallyExclusiveGroups = [];

  // defaults storage
  this._defaults = {};

  // determines whether an "option" looks like a negative number
  // -1, -1.5 -5e+4
  this._regexpNegativeNumber = new RegExp('^[-]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$');

  // whether or not there are any optionals that look like negative
  // numbers -- uses a list so it can be shared and edited
  this._hasNegativeNumberOptionals = [];
};

// Groups must be required, then ActionContainer already defined
var ArgumentGroup = require('./argument/group');
var MutuallyExclusiveGroup = require('./argument/exclusive');

//
// Registration methods
//

/**
 * ActionContainer#register(registryName, value, object) -> Void
 * - registryName (String) : object type action|type
 * - value (string) : keyword
 * - object (Object|Function) : handler
 *
 *  Register handlers
 **/
ActionContainer.prototype.register = function (registryName, value, object) {
  this._registries[registryName] = this._registries[registryName] || {};
  this._registries[registryName][value] = object;
};

ActionContainer.prototype._registryGet = function (registryName, value, defaultValue) {
  if (arguments.length < 3) {
    defaultValue = null;
  }
  return this._registries[registryName][value] || defaultValue;
};

//
// Namespace default accessor methods
//

/**
 * ActionContainer#setDefaults(options) -> Void
 * - options (object):hash of options see [[Action.new]]
 *
 * Set defaults
 **/
ActionContainer.prototype.setDefaults = function (options) {
  options = options || {};
  for (var property in options) {
    if ($$.has(options, property)) {
      this._defaults[property] = options[property];
    }
  }

  // if these defaults match any existing arguments, replace the previous
  // default on the object with the new one
  this._actions.forEach(function (action) {
    if ($$.has(options, action.dest)) {
      action.defaultValue = options[action.dest];
    }
  });
};

/**
 * ActionContainer#getDefault(dest) -> Mixed
 * - dest (string): action destination
 *
 * Return action default value
 **/
ActionContainer.prototype.getDefault = function (dest) {
  var result = $$.has(this._defaults, dest) ? this._defaults[dest] : null;

  this._actions.forEach(function (action) {
    if (action.dest === dest && $$.has(action, 'defaultValue')) {
      result = action.defaultValue;
    }
  });

  return result;
};
//
// Adding argument actions
//

/**
 * ActionContainer#addArgument(args, options) -> Object
 * - args (String|Array): argument key, or array of argument keys
 * - options (Object): action objects see [[Action.new]]
 *
 * #### Examples
 * - addArgument([ '-f', '--foo' ], { action: 'store', defaultValue: 1, ... })
 * - addArgument([ 'bar' ], { action: 'store', nargs: 1, ... })
 * - addArgument('--baz', { action: 'store', nargs: 1, ... })
 **/
ActionContainer.prototype.addArgument = function (args, options) {
  args = args;
  options = options || {};

  if (typeof args === 'string') {
    args = [ args ];
  }
  if (!Array.isArray(args)) {
    throw new TypeError('addArgument first argument should be a string or an array');
  }
  if (typeof options !== 'object' || Array.isArray(options)) {
    throw new TypeError('addArgument second argument should be a hash');
  }

  // if no positional args are supplied or only one is supplied and
  // it doesn't look like an option string, parse a positional argument
  if (!args || args.length === 1 && this.prefixChars.indexOf(args[0][0]) < 0) {
    if (args && !!options.dest) {
      throw new Error('dest supplied twice for positional argument');
    }
    options = this._getPositional(args, options);

    // otherwise, we're adding an optional argument
  } else {
    options = this._getOptional(args, options);
  }

  // if no default was supplied, use the parser-level default
  if (typeof options.defaultValue === 'undefined') {
    var dest = options.dest;
    if ($$.has(this._defaults, dest)) {
      options.defaultValue = this._defaults[dest];
    } else if (typeof this.argumentDefault !== 'undefined') {
      options.defaultValue = this.argumentDefault;
    }
  }

  // create the action object, and add it to the parser
  var ActionClass = this._popActionClass(options);
  if (typeof ActionClass !== 'function') {
    throw new Error(format('Unknown action "%s".', ActionClass));
  }
  var action = new ActionClass(options);

  // throw an error if the action type is not callable
  var typeFunction = this._registryGet('type', action.type, action.type);
  if (typeof typeFunction !== 'function') {
    throw new Error(format('"%s" is not callable', typeFunction));
  }

  return this._addAction(action);
};

/**
 * ActionContainer#addArgumentGroup(options) -> ArgumentGroup
 * - options (Object): hash of options see [[ArgumentGroup.new]]
 *
 * Create new arguments groups
 **/
ActionContainer.prototype.addArgumentGroup = function (options) {
  var group = new ArgumentGroup(this, options);
  this._actionGroups.push(group);
  return group;
};

/**
 * ActionContainer#addMutuallyExclusiveGroup(options) -> ArgumentGroup
 * - options (Object): {required: false}
 *
 * Create new mutual exclusive groups
 **/
ActionContainer.prototype.addMutuallyExclusiveGroup = function (options) {
  var group = new MutuallyExclusiveGroup(this, options);
  this._mutuallyExclusiveGroups.push(group);
  return group;
};

ActionContainer.prototype._addAction = function (action) {
  var self = this;

  // resolve any conflicts
  this._checkConflict(action);

  // add to actions list
  this._actions.push(action);
  action.container = this;

  // index the action by any option strings it has
  action.optionStrings.forEach(function (optionString) {
    self._optionStringActions[optionString] = action;
  });

  // set the flag if any option strings look like negative numbers
  action.optionStrings.forEach(function (optionString) {
    if (optionString.match(self._regexpNegativeNumber)) {
      if (!self._hasNegativeNumberOptionals.some(Boolean)) {
        self._hasNegativeNumberOptionals.push(true);
      }
    }
  });

  // return the created action
  return action;
};

ActionContainer.prototype._removeAction = function (action) {
  var actionIndex = this._actions.indexOf(action);
  if (actionIndex >= 0) {
    this._actions.splice(actionIndex, 1);
  }
};

ActionContainer.prototype._addContainerActions = function (container) {
  // collect groups by titles
  var titleGroupMap = {};
  this._actionGroups.forEach(function (group) {
    if (titleGroupMap[group.title]) {
      throw new Error(format('Cannot merge actions - two groups are named "%s".', group.title));
    }
    titleGroupMap[group.title] = group;
  });

  // map each action to its group
  var groupMap = {};
  function actionHash(action) {
    // unique (hopefully?) string suitable as dictionary key
    return action.getName();
  }
  container._actionGroups.forEach(function (group) {
    // if a group with the title exists, use that, otherwise
    // create a new group matching the container's group
    if (!titleGroupMap[group.title]) {
      titleGroupMap[group.title] = this.addArgumentGroup({
        title: group.title,
        description: group.description
      });
    }

    // map the actions to their new group
    group._groupActions.forEach(function (action) {
      groupMap[actionHash(action)] = titleGroupMap[group.title];
    });
  }, this);

  // add container's mutually exclusive groups
  // NOTE: if add_mutually_exclusive_group ever gains title= and
  // description= then this code will need to be expanded as above
  var mutexGroup;
  container._mutuallyExclusiveGroups.forEach(function (group) {
    mutexGroup = this.addMutuallyExclusiveGroup({
      required: group.required
    });
    // map the actions to their new mutex group
    group._groupActions.forEach(function (action) {
      groupMap[actionHash(action)] = mutexGroup;
    });
  }, this);  // forEach takes a 'this' argument

  // add all actions to this container or their group
  container._actions.forEach(function (action) {
    var key = actionHash(action);
    if (groupMap[key]) {
      groupMap[key]._addAction(action);
    } else {
      this._addAction(action);
    }
  });
};

ActionContainer.prototype._getPositional = function (dest, options) {
  if (Array.isArray(dest)) {
    dest = dest[0];
  }
  // make sure required is not specified
  if (options.required) {
    throw new Error('"required" is an invalid argument for positionals.');
  }

  // mark positional arguments as required if at least one is
  // always required
  if (options.nargs !== c.OPTIONAL && options.nargs !== c.ZERO_OR_MORE) {
    options.required = true;
  }
  if (options.nargs === c.ZERO_OR_MORE && typeof options.defaultValue === 'undefined') {
    options.required = true;
  }

  // return the keyword arguments with no option strings
  options.dest = dest;
  options.optionStrings = [];
  return options;
};

ActionContainer.prototype._getOptional = function (args, options) {
  var prefixChars = this.prefixChars;
  var optionStrings = [];
  var optionStringsLong = [];

  // determine short and long option strings
  args.forEach(function (optionString) {
    // error on strings that don't start with an appropriate prefix
    if (prefixChars.indexOf(optionString[0]) < 0) {
      throw new Error(format('Invalid option string "%s": must start with a "%s".',
        optionString,
        prefixChars
      ));
    }

    // strings starting with two prefix characters are long options
    optionStrings.push(optionString);
    if (optionString.length > 1 && prefixChars.indexOf(optionString[1]) >= 0) {
      optionStringsLong.push(optionString);
    }
  });

  // infer dest, '--foo-bar' -> 'foo_bar' and '-x' -> 'x'
  var dest = options.dest || null;
  delete options.dest;

  if (!dest) {
    var optionStringDest = optionStringsLong.length ? optionStringsLong[0] : optionStrings[0];
    dest = $$.trimChars(optionStringDest, this.prefixChars);

    if (dest.length === 0) {
      throw new Error(
        format('dest= is required for options like "%s"', optionStrings.join(', '))
      );
    }
    dest = dest.replace(/-/g, '_');
  }

  // return the updated keyword arguments
  options.dest = dest;
  options.optionStrings = optionStrings;

  return options;
};

ActionContainer.prototype._popActionClass = function (options, defaultValue) {
  defaultValue = defaultValue || null;

  var action = (options.action || defaultValue);
  delete options.action;

  var actionClass = this._registryGet('action', action, action);
  return actionClass;
};

ActionContainer.prototype._getHandler = function () {
  var handlerString = this.conflictHandler;
  var handlerFuncName = '_handleConflict' + $$.capitalize(handlerString);
  var func = this[handlerFuncName];
  if (typeof func === 'undefined') {
    var msg = 'invalid conflict resolution value: ' + handlerString;
    throw new Error(msg);
  } else {
    return func;
  }
};

ActionContainer.prototype._checkConflict = function (action) {
  var optionStringActions = this._optionStringActions;
  var conflictOptionals = [];

  // find all options that conflict with this option
  // collect pairs, the string, and an existing action that it conflicts with
  action.optionStrings.forEach(function (optionString) {
    var conflOptional = optionStringActions[optionString];
    if (typeof conflOptional !== 'undefined') {
      conflictOptionals.push([ optionString, conflOptional ]);
    }
  });

  if (conflictOptionals.length > 0) {
    var conflictHandler = this._getHandler();
    conflictHandler.call(this, action, conflictOptionals);
  }
};

ActionContainer.prototype._handleConflictError = function (action, conflOptionals) {
  var conflicts = conflOptionals.map(function (pair) { return pair[0]; });
  conflicts = conflicts.join(', ');
  throw argumentErrorHelper(
    action,
    format('Conflicting option string(s): %s', conflicts)
  );
};

ActionContainer.prototype._handleConflictResolve = function (action, conflOptionals) {
  // remove all conflicting options
  var self = this;
  conflOptionals.forEach(function (pair) {
    var optionString = pair[0];
    var conflictingAction = pair[1];
    // remove the conflicting option string
    var i = conflictingAction.optionStrings.indexOf(optionString);
    if (i >= 0) {
      conflictingAction.optionStrings.splice(i, 1);
    }
    delete self._optionStringActions[optionString];
    // if the option now has no option string, remove it from the
    // container holding it
    if (conflictingAction.optionStrings.length === 0) {
      conflictingAction.container._removeAction(conflictingAction);
    }
  });
};
'use strict';

module.exports.ArgumentParser = require('./argument_parser.js');
module.exports.Namespace = require('./namespace');
module.exports.Action = require('./action');
module.exports.HelpFormatter = require('./help/formatter.js');
module.exports.Const = require('./const.js');

module.exports.ArgumentDefaultsHelpFormatter =
  require('./help/added_formatters.js').ArgumentDefaultsHelpFormatter;
module.exports.RawDescriptionHelpFormatter =
  require('./help/added_formatters.js').RawDescriptionHelpFormatter;
module.exports.RawTextHelpFormatter =
  require('./help/added_formatters.js').RawTextHelpFormatter;
/**
 * class ArgumentParser
 *
 * Object for parsing command line strings into js objects.
 *
 * Inherited from [[ActionContainer]]
 **/
'use strict';

var util    = require('util');
var format  = require('util').format;
var Path    = require('path');
var sprintf = require('sprintf-js').sprintf;

// Constants
var c = require('./const');

var $$ = require('./utils');

var ActionContainer = require('./action_container');

// Errors
var argumentErrorHelper = require('./argument/error');

var HelpFormatter = require('./help/formatter');

var Namespace = require('./namespace');


/**
 * new ArgumentParser(options)
 *
 * Create a new ArgumentParser object.
 *
 * ##### Options:
 * - `prog`  The name of the program (default: Path.basename(process.argv[1]))
 * - `usage`  A usage message (default: auto-generated from arguments)
 * - `description`  A description of what the program does
 * - `epilog`  Text following the argument descriptions
 * - `parents`  Parsers whose arguments should be copied into this one
 * - `formatterClass`  HelpFormatter class for printing help messages
 * - `prefixChars`  Characters that prefix optional arguments
 * - `fromfilePrefixChars` Characters that prefix files containing additional arguments
 * - `argumentDefault`  The default value for all arguments
 * - `addHelp`  Add a -h/-help option
 * - `conflictHandler`  Specifies how to handle conflicting argument names
 * - `debug`  Enable debug mode. Argument errors throw exception in
 *   debug mode and process.exit in normal. Used for development and
 *   testing (default: false)
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#argumentparser-objects
 **/
function ArgumentParser(options) {
  if (!(this instanceof ArgumentParser)) {
    return new ArgumentParser(options);
  }
  var self = this;
  options = options || {};

  options.description = (options.description || null);
  options.argumentDefault = (options.argumentDefault || null);
  options.prefixChars = (options.prefixChars || '-');
  options.conflictHandler = (options.conflictHandler || 'error');
  ActionContainer.call(this, options);

  options.addHelp = typeof options.addHelp === 'undefined' || !!options.addHelp;
  options.parents = options.parents || [];
  // default program name
  options.prog = (options.prog || Path.basename(process.argv[1]));
  this.prog = options.prog;
  this.usage = options.usage;
  this.epilog = options.epilog;
  this.version = options.version;

  this.debug = (options.debug === true);

  this.formatterClass = (options.formatterClass || HelpFormatter);
  this.fromfilePrefixChars = options.fromfilePrefixChars || null;
  this._positionals = this.addArgumentGroup({ title: 'Positional arguments' });
  this._optionals = this.addArgumentGroup({ title: 'Optional arguments' });
  this._subparsers = null;

  // register types
  function FUNCTION_IDENTITY(o) {
    return o;
  }
  this.register('type', 'auto', FUNCTION_IDENTITY);
  this.register('type', null, FUNCTION_IDENTITY);
  this.register('type', 'int', function (x) {
    var result = parseInt(x, 10);
    if (isNaN(result)) {
      throw new Error(x + ' is not a valid integer.');
    }
    return result;
  });
  this.register('type', 'float', function (x) {
    var result = parseFloat(x);
    if (isNaN(result)) {
      throw new Error(x + ' is not a valid float.');
    }
    return result;
  });
  this.register('type', 'string', function (x) {
    return '' + x;
  });

  // add help and version arguments if necessary
  var defaultPrefix = (this.prefixChars.indexOf('-') > -1) ? '-' : this.prefixChars[0];
  if (options.addHelp) {
    this.addArgument(
      [ defaultPrefix + 'h', defaultPrefix + defaultPrefix + 'help' ],
      {
        action: 'help',
        defaultValue: c.SUPPRESS,
        help: 'Show this help message and exit.'
      }
    );
  }
  if (typeof this.version !== 'undefined') {
    this.addArgument(
      [ defaultPrefix + 'v', defaultPrefix + defaultPrefix + 'version' ],
      {
        action: 'version',
        version: this.version,
        defaultValue: c.SUPPRESS,
        help: "Show program's version number and exit."
      }
    );
  }

  // add parent arguments and defaults
  options.parents.forEach(function (parent) {
    self._addContainerActions(parent);
    if (typeof parent._defaults !== 'undefined') {
      for (var defaultKey in parent._defaults) {
        if (parent._defaults.hasOwnProperty(defaultKey)) {
          self._defaults[defaultKey] = parent._defaults[defaultKey];
        }
      }
    }
  });
}

util.inherits(ArgumentParser, ActionContainer);

/**
 * ArgumentParser#addSubparsers(options) -> [[ActionSubparsers]]
 * - options (object): hash of options see [[ActionSubparsers.new]]
 *
 * See also [subcommands][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#sub-commands
 **/
ArgumentParser.prototype.addSubparsers = function (options) {
  if (this._subparsers) {
    this.error('Cannot have multiple subparser arguments.');
  }

  options = options || {};
  options.debug = (this.debug === true);
  options.optionStrings = [];
  options.parserClass = (options.parserClass || ArgumentParser);


  if (!!options.title || !!options.description) {

    this._subparsers = this.addArgumentGroup({
      title: (options.title || 'subcommands'),
      description: options.description
    });
    delete options.title;
    delete options.description;

  } else {
    this._subparsers = this._positionals;
  }

  // prog defaults to the usage message of this parser, skipping
  // optional arguments and with no "usage:" prefix
  if (!options.prog) {
    var formatter = this._getFormatter();
    var positionals = this._getPositionalActions();
    var groups = this._mutuallyExclusiveGroups;
    formatter.addUsage(this.usage, positionals, groups, '');
    options.prog = formatter.formatHelp().trim();
  }

  // create the parsers action and add it to the positionals list
  var ParsersClass = this._popActionClass(options, 'parsers');
  var action = new ParsersClass(options);
  this._subparsers._addAction(action);

  // return the created parsers action
  return action;
};

ArgumentParser.prototype._addAction = function (action) {
  if (action.isOptional()) {
    this._optionals._addAction(action);
  } else {
    this._positionals._addAction(action);
  }
  return action;
};

ArgumentParser.prototype._getOptionalActions = function () {
  return this._actions.filter(function (action) {
    return action.isOptional();
  });
};

ArgumentParser.prototype._getPositionalActions = function () {
  return this._actions.filter(function (action) {
    return action.isPositional();
  });
};


/**
 * ArgumentParser#parseArgs(args, namespace) -> Namespace|Object
 * - args (array): input elements
 * - namespace (Namespace|Object): result object
 *
 * Parsed args and throws error if some arguments are not recognized
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#the-parse-args-method
 **/
ArgumentParser.prototype.parseArgs = function (args, namespace) {
  var argv;
  var result = this.parseKnownArgs(args, namespace);

  args = result[0];
  argv = result[1];
  if (argv && argv.length > 0) {
    this.error(
      format('Unrecognized arguments: %s.', argv.join(' '))
    );
  }
  return args;
};

/**
 * ArgumentParser#parseKnownArgs(args, namespace) -> array
 * - args (array): input options
 * - namespace (Namespace|Object): result object
 *
 * Parse known arguments and return tuple of result object
 * and unknown args
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#partial-parsing
 **/
ArgumentParser.prototype.parseKnownArgs = function (args, namespace) {
  var self = this;

  // args default to the system args
  args = args || process.argv.slice(2);

  // default Namespace built from parser defaults
  namespace = namespace || new Namespace();

  self._actions.forEach(function (action) {
    if (action.dest !== c.SUPPRESS) {
      if (!$$.has(namespace, action.dest)) {
        if (action.defaultValue !== c.SUPPRESS) {
          var defaultValue = action.defaultValue;
          if (typeof action.defaultValue === 'string') {
            defaultValue = self._getValue(action, defaultValue);
          }
          namespace[action.dest] = defaultValue;
        }
      }
    }
  });

  Object.keys(self._defaults).forEach(function (dest) {
    namespace[dest] = self._defaults[dest];
  });

  // parse the arguments and exit if there are any errors
  try {
    var res = this._parseKnownArgs(args, namespace);

    namespace = res[0];
    args = res[1];
    if ($$.has(namespace, c._UNRECOGNIZED_ARGS_ATTR)) {
      args = $$.arrayUnion(args, namespace[c._UNRECOGNIZED_ARGS_ATTR]);
      delete namespace[c._UNRECOGNIZED_ARGS_ATTR];
    }
    return [ namespace, args ];
  } catch (e) {
    this.error(e);
  }
};

ArgumentParser.prototype._parseKnownArgs = function (argStrings, namespace) {
  var self = this;

  var extras = [];

  // replace arg strings that are file references
  if (this.fromfilePrefixChars !== null) {
    argStrings = this._readArgsFromFiles(argStrings);
  }
  // map all mutually exclusive arguments to the other arguments
  // they can't occur with
  // Python has 'conflicts = action_conflicts.setdefault(mutex_action, [])'
  // though I can't conceive of a way in which an action could be a member
  // of two different mutually exclusive groups.

  function actionHash(action) {
    // some sort of hashable key for this action
    // action itself cannot be a key in actionConflicts
    // I think getName() (join of optionStrings) is unique enough
    return action.getName();
  }

  var conflicts, key;
  var actionConflicts = {};

  this._mutuallyExclusiveGroups.forEach(function (mutexGroup) {
    mutexGroup._groupActions.forEach(function (mutexAction, i, groupActions) {
      key = actionHash(mutexAction);
      if (!$$.has(actionConflicts, key)) {
        actionConflicts[key] = [];
      }
      conflicts = actionConflicts[key];
      conflicts.push.apply(conflicts, groupActions.slice(0, i));
      conflicts.push.apply(conflicts, groupActions.slice(i + 1));
    });
  });

  // find all option indices, and determine the arg_string_pattern
  // which has an 'O' if there is an option at an index,
  // an 'A' if there is an argument, or a '-' if there is a '--'
  var optionStringIndices = {};

  var argStringPatternParts = [];

  argStrings.forEach(function (argString, argStringIndex) {
    if (argString === '--') {
      argStringPatternParts.push('-');
      while (argStringIndex < argStrings.length) {
        argStringPatternParts.push('A');
        argStringIndex++;
      }
    } else {
      // otherwise, add the arg to the arg strings
      // and note the index if it was an option
      var pattern;
      var optionTuple = self._parseOptional(argString);
      if (!optionTuple) {
        pattern = 'A';
      } else {
        optionStringIndices[argStringIndex] = optionTuple;
        pattern = 'O';
      }
      argStringPatternParts.push(pattern);
    }
  });
  var argStringsPattern = argStringPatternParts.join('');

  var seenActions = [];
  var seenNonDefaultActions = [];


  function takeAction(action, argumentStrings, optionString) {
    seenActions.push(action);
    var argumentValues = self._getValues(action, argumentStrings);

    // error if this argument is not allowed with other previously
    // seen arguments, assuming that actions that use the default
    // value don't really count as "present"
    if (argumentValues !== action.defaultValue) {
      seenNonDefaultActions.push(action);
      if (actionConflicts[actionHash(action)]) {
        actionConflicts[actionHash(action)].forEach(function (actionConflict) {
          if (seenNonDefaultActions.indexOf(actionConflict) >= 0) {
            throw argumentErrorHelper(
              action,
              format('Not allowed with argument "%s".', actionConflict.getName())
            );
          }
        });
      }
    }

    if (argumentValues !== c.SUPPRESS) {
      action.call(self, namespace, argumentValues, optionString);
    }
  }

  function consumeOptional(startIndex) {
    // get the optional identified at this index
    var optionTuple = optionStringIndices[startIndex];
    var action = optionTuple[0];
    var optionString = optionTuple[1];
    var explicitArg = optionTuple[2];

    // identify additional optionals in the same arg string
    // (e.g. -xyz is the same as -x -y -z if no args are required)
    var actionTuples = [];

    var args, argCount, start, stop;

    for (;;) {
      if (!action) {
        extras.push(argStrings[startIndex]);
        return startIndex + 1;
      }
      if (explicitArg) {
        argCount = self._matchArgument(action, 'A');

        // if the action is a single-dash option and takes no
        // arguments, try to parse more single-dash options out
        // of the tail of the option string
        var chars = self.prefixChars;
        if (argCount === 0 && chars.indexOf(optionString[1]) < 0) {
          actionTuples.push([ action, [], optionString ]);
          optionString = optionString[0] + explicitArg[0];
          var newExplicitArg = explicitArg.slice(1) || null;
          var optionalsMap = self._optionStringActions;

          if (Object.keys(optionalsMap).indexOf(optionString) >= 0) {
            action = optionalsMap[optionString];
            explicitArg = newExplicitArg;
          } else {
            throw argumentErrorHelper(action, sprintf('ignored explicit argument %r', explicitArg));
          }
        } else if (argCount === 1) {
          // if the action expect exactly one argument, we've
          // successfully matched the option; exit the loop
          stop = startIndex + 1;
          args = [ explicitArg ];
          actionTuples.push([ action, args, optionString ]);
          break;
        } else {
          // error if a double-dash option did not use the
          // explicit argument
          throw argumentErrorHelper(action, sprintf('ignored explicit argument %r', explicitArg));
        }
      } else {
        // if there is no explicit argument, try to match the
        // optional's string arguments with the following strings
        // if successful, exit the loop

        start = startIndex + 1;
        var selectedPatterns = argStringsPattern.substr(start);

        argCount = self._matchArgument(action, selectedPatterns);
        stop = start + argCount;


        args = argStrings.slice(start, stop);

        actionTuples.push([ action, args, optionString ]);
        break;
      }

    }

    // add the Optional to the list and return the index at which
    // the Optional's string args stopped
    if (actionTuples.length < 1) {
      throw new Error('length should be > 0');
    }
    for (var i = 0; i < actionTuples.length; i++) {
      takeAction.apply(self, actionTuples[i]);
    }
    return stop;
  }

  // the list of Positionals left to be parsed; this is modified
  // by consume_positionals()
  var positionals = self._getPositionalActions();

  function consumePositionals(startIndex) {
    // match as many Positionals as possible
    var selectedPattern = argStringsPattern.substr(startIndex);
    var argCounts = self._matchArgumentsPartial(positionals, selectedPattern);

    // slice off the appropriate arg strings for each Positional
    // and add the Positional and its args to the list
    for (var i = 0; i < positionals.length; i++) {
      var action = positionals[i];
      var argCount = argCounts[i];
      if (typeof argCount === 'undefined') {
        continue;
      }
      var args = argStrings.slice(startIndex, startIndex + argCount);

      startIndex += argCount;
      takeAction(action, args);
    }

    // slice off the Positionals that we just parsed and return the
    // index at which the Positionals' string args stopped
    positionals = positionals.slice(argCounts.length);
    return startIndex;
  }

  // consume Positionals and Optionals alternately, until we have
  // passed the last option string
  var startIndex = 0;
  var position;

  var maxOptionStringIndex = -1;

  Object.keys(optionStringIndices).forEach(function (position) {
    maxOptionStringIndex = Math.max(maxOptionStringIndex, parseInt(position, 10));
  });

  var positionalsEndIndex, nextOptionStringIndex;

  while (startIndex <= maxOptionStringIndex) {
    // consume any Positionals preceding the next option
    nextOptionStringIndex = null;
    for (position in optionStringIndices) {
      if (!optionStringIndices.hasOwnProperty(position)) { continue; }

      position = parseInt(position, 10);
      if (position >= startIndex) {
        if (nextOptionStringIndex !== null) {
          nextOptionStringIndex = Math.min(nextOptionStringIndex, position);
        } else {
          nextOptionStringIndex = position;
        }
      }
    }

    if (startIndex !== nextOptionStringIndex) {
      positionalsEndIndex = consumePositionals(startIndex);
      // only try to parse the next optional if we didn't consume
      // the option string during the positionals parsing
      if (positionalsEndIndex > startIndex) {
        startIndex = positionalsEndIndex;
        continue;
      } else {
        startIndex = positionalsEndIndex;
      }
    }

    // if we consumed all the positionals we could and we're not
    // at the index of an option string, there were extra arguments
    if (!optionStringIndices[startIndex]) {
      var strings = argStrings.slice(startIndex, nextOptionStringIndex);
      extras = extras.concat(strings);
      startIndex = nextOptionStringIndex;
    }
    // consume the next optional and any arguments for it
    startIndex = consumeOptional(startIndex);
  }

  // consume any positionals following the last Optional
  var stopIndex = consumePositionals(startIndex);

  // if we didn't consume all the argument strings, there were extras
  extras = extras.concat(argStrings.slice(stopIndex));

  // if we didn't use all the Positional objects, there were too few
  // arg strings supplied.
  if (positionals.length > 0) {
    self.error('too few arguments');
  }

  // make sure all required actions were present
  self._actions.forEach(function (action) {
    if (action.required) {
      if (seenActions.indexOf(action) < 0) {
        self.error(format('Argument "%s" is required', action.getName()));
      }
    }
  });

  // make sure all required groups have one option present
  var actionUsed = false;
  self._mutuallyExclusiveGroups.forEach(function (group) {
    if (group.required) {
      actionUsed = group._groupActions.some(function (action) {
        return seenNonDefaultActions.indexOf(action) !== -1;
      });

      // if no actions were used, report the error
      if (!actionUsed) {
        var names = [];
        group._groupActions.forEach(function (action) {
          if (action.help !== c.SUPPRESS) {
            names.push(action.getName());
          }
        });
        names = names.join(' ');
        var msg = 'one of the arguments ' + names + ' is required';
        self.error(msg);
      }
    }
  });

  // return the updated namespace and the extra arguments
  return [ namespace, extras ];
};

ArgumentParser.prototype._readArgsFromFiles = function (argStrings) {
  // expand arguments referencing files
  var self = this;
  var fs = require('fs');
  var newArgStrings = [];
  argStrings.forEach(function (argString) {
    if (self.fromfilePrefixChars.indexOf(argString[0]) < 0) {
      // for regular arguments, just add them back into the list
      newArgStrings.push(argString);
    } else {
      // replace arguments referencing files with the file content
      try {
        var argstrs = [];
        var filename = argString.slice(1);
        var content = fs.readFileSync(filename, 'utf8');
        content = content.trim().split('\n');
        content.forEach(function (argLine) {
          self.convertArgLineToArgs(argLine).forEach(function (arg) {
            argstrs.push(arg);
          });
          argstrs = self._readArgsFromFiles(argstrs);
        });
        newArgStrings.push.apply(newArgStrings, argstrs);
      } catch (error) {
        return self.error(error.message);
      }
    }
  });
  return newArgStrings;
};

ArgumentParser.prototype.convertArgLineToArgs = function (argLine) {
  return [ argLine ];
};

ArgumentParser.prototype._matchArgument = function (action, regexpArgStrings) {

  // match the pattern for this action to the arg strings
  var regexpNargs = new RegExp('^' + this._getNargsPattern(action));
  var matches = regexpArgStrings.match(regexpNargs);
  var message;

  // throw an exception if we weren't able to find a match
  if (!matches) {
    switch (action.nargs) {
      /*eslint-disable no-undefined*/
      case undefined:
      case null:
        message = 'Expected one argument.';
        break;
      case c.OPTIONAL:
        message = 'Expected at most one argument.';
        break;
      case c.ONE_OR_MORE:
        message = 'Expected at least one argument.';
        break;
      default:
        message = 'Expected %s argument(s)';
    }

    throw argumentErrorHelper(
      action,
      format(message, action.nargs)
    );
  }
  // return the number of arguments matched
  return matches[1].length;
};

ArgumentParser.prototype._matchArgumentsPartial = function (actions, regexpArgStrings) {
  // progressively shorten the actions list by slicing off the
  // final actions until we find a match
  var self = this;
  var result = [];
  var actionSlice, pattern, matches;
  var i, j;

  function getLength(string) {
    return string.length;
  }

  for (i = actions.length; i > 0; i--) {
    pattern = '';
    actionSlice = actions.slice(0, i);
    for (j = 0; j < actionSlice.length; j++) {
      pattern += self._getNargsPattern(actionSlice[j]);
    }

    pattern = new RegExp('^' + pattern);
    matches = regexpArgStrings.match(pattern);

    if (matches && matches.length > 0) {
      // need only groups
      matches = matches.splice(1);
      result = result.concat(matches.map(getLength));
      break;
    }
  }

  // return the list of arg string counts
  return result;
};

ArgumentParser.prototype._parseOptional = function (argString) {
  var action, optionString, argExplicit, optionTuples;

  // if it's an empty string, it was meant to be a positional
  if (!argString) {
    return null;
  }

  // if it doesn't start with a prefix, it was meant to be positional
  if (this.prefixChars.indexOf(argString[0]) < 0) {
    return null;
  }

  // if the option string is present in the parser, return the action
  if (this._optionStringActions[argString]) {
    return [ this._optionStringActions[argString], argString, null ];
  }

  // if it's just a single character, it was meant to be positional
  if (argString.length === 1) {
    return null;
  }

  // if the option string before the "=" is present, return the action
  if (argString.indexOf('=') >= 0) {
    optionString = argString.split('=', 1)[0];
    argExplicit = argString.slice(optionString.length + 1);

    if (this._optionStringActions[optionString]) {
      action = this._optionStringActions[optionString];
      return [ action, optionString, argExplicit ];
    }
  }

  // search through all possible prefixes of the option string
  // and all actions in the parser for possible interpretations
  optionTuples = this._getOptionTuples(argString);

  // if multiple actions match, the option string was ambiguous
  if (optionTuples.length > 1) {
    var optionStrings = optionTuples.map(function (optionTuple) {
      return optionTuple[1];
    });
    this.error(format(
          'Ambiguous option: "%s" could match %s.',
          argString, optionStrings.join(', ')
    ));
  // if exactly one action matched, this segmentation is good,
  // so return the parsed action
  } else if (optionTuples.length === 1) {
    return optionTuples[0];
  }

  // if it was not found as an option, but it looks like a negative
  // number, it was meant to be positional
  // unless there are negative-number-like options
  if (argString.match(this._regexpNegativeNumber)) {
    if (!this._hasNegativeNumberOptionals.some(Boolean)) {
      return null;
    }
  }
  // if it contains a space, it was meant to be a positional
  if (argString.search(' ') >= 0) {
    return null;
  }

  // it was meant to be an optional but there is no such option
  // in this parser (though it might be a valid option in a subparser)
  return [ null, argString, null ];
};

ArgumentParser.prototype._getOptionTuples = function (optionString) {
  var result = [];
  var chars = this.prefixChars;
  var optionPrefix;
  var argExplicit;
  var action;
  var actionOptionString;

  // option strings starting with two prefix characters are only split at
  // the '='
  if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) >= 0) {
    if (optionString.indexOf('=') >= 0) {
      var optionStringSplit = optionString.split('=', 1);

      optionPrefix = optionStringSplit[0];
      argExplicit = optionStringSplit[1];
    } else {
      optionPrefix = optionString;
      argExplicit = null;
    }

    for (actionOptionString in this._optionStringActions) {
      if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) {
        action = this._optionStringActions[actionOptionString];
        result.push([ action, actionOptionString, argExplicit ]);
      }
    }

  // single character options can be concatenated with their arguments
  // but multiple character options always have to have their argument
  // separate
  } else if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) < 0) {
    optionPrefix = optionString;
    argExplicit = null;
    var optionPrefixShort = optionString.substr(0, 2);
    var argExplicitShort = optionString.substr(2);

    for (actionOptionString in this._optionStringActions) {
      if (!$$.has(this._optionStringActions, actionOptionString)) continue;

      action = this._optionStringActions[actionOptionString];
      if (actionOptionString === optionPrefixShort) {
        result.push([ action, actionOptionString, argExplicitShort ]);
      } else if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) {
        result.push([ action, actionOptionString, argExplicit ]);
      }
    }

  // shouldn't ever get here
  } else {
    throw new Error(format('Unexpected option string: %s.', optionString));
  }
  // return the collected option tuples
  return result;
};

ArgumentParser.prototype._getNargsPattern = function (action) {
  // in all examples below, we have to allow for '--' args
  // which are represented as '-' in the pattern
  var regexpNargs;

  switch (action.nargs) {
    // the default (null) is assumed to be a single argument
    case undefined:
    case null:
      regexpNargs = '(-*A-*)';
      break;
    // allow zero or more arguments
    case c.OPTIONAL:
      regexpNargs = '(-*A?-*)';
      break;
    // allow zero or more arguments
    case c.ZERO_OR_MORE:
      regexpNargs = '(-*[A-]*)';
      break;
    // allow one or more arguments
    case c.ONE_OR_MORE:
      regexpNargs = '(-*A[A-]*)';
      break;
    // allow any number of options or arguments
    case c.REMAINDER:
      regexpNargs = '([-AO]*)';
      break;
    // allow one argument followed by any number of options or arguments
    case c.PARSER:
      regexpNargs = '(-*A[-AO]*)';
      break;
    // all others should be integers
    default:
      regexpNargs = '(-*' + $$.repeat('-*A', action.nargs) + '-*)';
  }

  // if this is an optional action, -- is not allowed
  if (action.isOptional()) {
    regexpNargs = regexpNargs.replace(/-\*/g, '');
    regexpNargs = regexpNargs.replace(/-/g, '');
  }

  // return the pattern
  return regexpNargs;
};

//
// Value conversion methods
//

ArgumentParser.prototype._getValues = function (action, argStrings) {
  var self = this;

  // for everything but PARSER args, strip out '--'
  if (action.nargs !== c.PARSER && action.nargs !== c.REMAINDER) {
    argStrings = argStrings.filter(function (arrayElement) {
      return arrayElement !== '--';
    });
  }

  var value, argString;

  // optional argument produces a default when not present
  if (argStrings.length === 0 && action.nargs === c.OPTIONAL) {

    value = (action.isOptional()) ? action.constant : action.defaultValue;

    if (typeof (value) === 'string') {
      value = this._getValue(action, value);
      this._checkValue(action, value);
    }

  // when nargs='*' on a positional, if there were no command-line
  // args, use the default if it is anything other than None
  } else if (argStrings.length === 0 && action.nargs === c.ZERO_OR_MORE &&
    action.optionStrings.length === 0) {

    value = (action.defaultValue || argStrings);
    this._checkValue(action, value);

  // single argument or optional argument produces a single value
  } else if (argStrings.length === 1 &&
        (!action.nargs || action.nargs === c.OPTIONAL)) {

    argString = argStrings[0];
    value = this._getValue(action, argString);
    this._checkValue(action, value);

  // REMAINDER arguments convert all values, checking none
  } else if (action.nargs === c.REMAINDER) {
    value = argStrings.map(function (v) {
      return self._getValue(action, v);
    });

  // PARSER arguments convert all values, but check only the first
  } else if (action.nargs === c.PARSER) {
    value = argStrings.map(function (v) {
      return self._getValue(action, v);
    });
    this._checkValue(action, value[0]);

  // all other types of nargs produce a list
  } else {
    value = argStrings.map(function (v) {
      return self._getValue(action, v);
    });
    value.forEach(function (v) {
      self._checkValue(action, v);
    });
  }

  // return the converted value
  return value;
};

ArgumentParser.prototype._getValue = function (action, argString) {
  var result;

  var typeFunction = this._registryGet('type', action.type, action.type);
  if (typeof typeFunction !== 'function') {
    var message = format('%s is not callable', typeFunction);
    throw argumentErrorHelper(action, message);
  }

  // convert the value to the appropriate type
  try {
    result = typeFunction(argString);

    // ArgumentTypeErrors indicate errors
    // If action.type is not a registered string, it is a function
    // Try to deduce its name for inclusion in the error message
    // Failing that, include the error message it raised.
  } catch (e) {
    var name = null;
    if (typeof action.type === 'string') {
      name = action.type;
    } else {
      name = action.type.name || action.type.displayName || '<function>';
    }
    var msg = format('Invalid %s value: %s', name, argString);
    if (name === '<function>') { msg += '\n' + e.message; }
    throw argumentErrorHelper(action, msg);
  }
  // return the converted value
  return result;
};

ArgumentParser.prototype._checkValue = function (action, value) {
  // converted value must be one of the choices (if specified)
  var choices = action.choices;
  if (choices) {
    // choise for argument can by array or string
    if ((typeof choices === 'string' || Array.isArray(choices)) &&
        choices.indexOf(value) !== -1) {
      return;
    }
    // choise for subparsers can by only hash
    if (typeof choices === 'object' && !Array.isArray(choices) && choices[value]) {
      return;
    }

    if (typeof choices === 'string') {
      choices = choices.split('').join(', ');
    } else if (Array.isArray(choices)) {
      choices =  choices.join(', ');
    } else {
      choices =  Object.keys(choices).join(', ');
    }
    var message = format('Invalid choice: %s (choose from [%s])', value, choices);
    throw argumentErrorHelper(action, message);
  }
};

//
// Help formatting methods
//

/**
 * ArgumentParser#formatUsage -> string
 *
 * Return usage string
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
 **/
ArgumentParser.prototype.formatUsage = function () {
  var formatter = this._getFormatter();
  formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups);
  return formatter.formatHelp();
};

/**
 * ArgumentParser#formatHelp -> string
 *
 * Return help
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
 **/
ArgumentParser.prototype.formatHelp = function () {
  var formatter = this._getFormatter();

  // usage
  formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups);

  // description
  formatter.addText(this.description);

  // positionals, optionals and user-defined groups
  this._actionGroups.forEach(function (actionGroup) {
    formatter.startSection(actionGroup.title);
    formatter.addText(actionGroup.description);
    formatter.addArguments(actionGroup._groupActions);
    formatter.endSection();
  });

  // epilog
  formatter.addText(this.epilog);

  // determine help from format above
  return formatter.formatHelp();
};

ArgumentParser.prototype._getFormatter = function () {
  var FormatterClass = this.formatterClass;
  var formatter = new FormatterClass({ prog: this.prog });
  return formatter;
};

//
//  Print functions
//

/**
 * ArgumentParser#printUsage() -> Void
 *
 * Print usage
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
 **/
ArgumentParser.prototype.printUsage = function () {
  this._printMessage(this.formatUsage());
};

/**
 * ArgumentParser#printHelp() -> Void
 *
 * Print help
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
 **/
ArgumentParser.prototype.printHelp = function () {
  this._printMessage(this.formatHelp());
};

ArgumentParser.prototype._printMessage = function (message, stream) {
  if (!stream) {
    stream = process.stdout;
  }
  if (message) {
    stream.write('' + message);
  }
};

//
//  Exit functions
//

/**
 * ArgumentParser#exit(status=0, message) -> Void
 * - status (int): exit status
 * - message (string): message
 *
 * Print message in stderr/stdout and exit program
 **/
ArgumentParser.prototype.exit = function (status, message) {
  if (message) {
    if (status === 0) {
      this._printMessage(message);
    } else {
      this._printMessage(message, process.stderr);
    }
  }

  process.exit(status);
};

/**
 * ArgumentParser#error(message) -> Void
 * - err (Error|string): message
 *
 * Error method Prints a usage message incorporating the message to stderr and
 * exits. If you override this in a subclass,
 * it should not return -- it should
 * either exit or throw an exception.
 *
 **/
ArgumentParser.prototype.error = function (err) {
  var message;
  if (err instanceof Error) {
    if (this.debug === true) {
      throw err;
    }
    message = err.message;
  } else {
    message = err;
  }
  var msg = format('%s: error: %s', this.prog, message) + c.EOL;

  if (this.debug === true) {
    throw new Error(msg);
  }

  this.printUsage(process.stderr);

  return this.exit(2, msg);
};

module.exports = ArgumentParser;
//
// Constants
//

'use strict';

module.exports.EOL = '\n';

module.exports.SUPPRESS = '==SUPPRESS==';

module.exports.OPTIONAL = '?';

module.exports.ZERO_OR_MORE = '*';

module.exports.ONE_OR_MORE = '+';

module.exports.PARSER = 'A...';

module.exports.REMAINDER = '...';

module.exports._UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args';
/**
 * class Namespace
 *
 * Simple object for storing attributes. Implements equality by attribute names
 * and values, and provides a simple string representation.
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#the-namespace-object
 **/
'use strict';

var $$ = require('./utils');

/**
 * new Namespace(options)
 * - options(object): predefined propertis for result object
 *
 **/
var Namespace = module.exports = function Namespace(options) {
  $$.extend(this, options);
};

/**
 * Namespace#isset(key) -> Boolean
 * - key (string|number): property name
 *
 * Tells whenever `namespace` contains given `key` or not.
 **/
Namespace.prototype.isset = function (key) {
  return $$.has(this, key);
};

/**
 * Namespace#set(key, value) -> self
 * -key (string|number|object): propery name
 * -value (mixed): new property value
 *
 * Set the property named key with value.
 * If key object then set all key properties to namespace object
 **/
Namespace.prototype.set = function (key, value) {
  if (typeof (key) === 'object') {
    $$.extend(this, key);
  } else {
    this[key] = value;
  }
  return this;
};

/**
 * Namespace#get(key, defaultValue) -> mixed
 * - key (string|number): property name
 * - defaultValue (mixed): default value
 *
 * Return the property key or defaulValue if not set
 **/
Namespace.prototype.get = function (key, defaultValue) {
  return !this[key] ? defaultValue : this[key];
};

/**
 * Namespace#unset(key, defaultValue) -> mixed
 * - key (string|number): property name
 * - defaultValue (mixed): default value
 *
 * Return data[key](and delete it) or defaultValue
 **/
Namespace.prototype.unset = function (key, defaultValue) {
  var value = this[key];
  if (value !== null) {
    delete this[key];
    return value;
  }
  return defaultValue;
};
'use strict';

exports.repeat = function (str, num) {
  var result = '';
  for (var i = 0; i < num; i++) { result += str; }
  return result;
};

exports.arrayEqual = function (a, b) {
  if (a.length !== b.length) { return false; }
  for (var i = 0; i < a.length; i++) {
    if (a[i] !== b[i]) { return false; }
  }
  return true;
};

exports.trimChars = function (str, chars) {
  var start = 0;
  var end = str.length - 1;
  while (chars.indexOf(str.charAt(start)) >= 0) { start++; }
  while (chars.indexOf(str.charAt(end)) >= 0) { end--; }
  return str.slice(start, end + 1);
};

exports.capitalize = function (str) {
  return str.charAt(0).toUpperCase() + str.slice(1);
};

exports.arrayUnion = function () {
  var result = [];
  for (var i = 0, values = {}; i < arguments.length; i++) {
    var arr = arguments[i];
    for (var j = 0; j < arr.length; j++) {
      if (!values[arr[j]]) {
        values[arr[j]] = true;
        result.push(arr[j]);
      }
    }
  }
  return result;
};

function has(obj, key) {
  return Object.prototype.hasOwnProperty.call(obj, key);
}

exports.has = has;

exports.extend = function (dest, src) {
  for (var i in src) {
    if (has(src, i)) { dest[i] = src[i]; }
  }
};

exports.trimEnd = function (str) {
  return str.replace(/\s+$/g, '');
};
'use strict';

var util    = require('util');

// Constants
var c = require('../const');

var $$ = require('../utils');
var HelpFormatter = require('./formatter.js');

/**
 * new RawDescriptionHelpFormatter(options)
 * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...})
 *
 * Help message formatter which adds default values to argument help.
 *
 * Only the name of this class is considered a public API. All the methods
 * provided by the class are considered an implementation detail.
 **/

function ArgumentDefaultsHelpFormatter(options) {
  HelpFormatter.call(this, options);
}

util.inherits(ArgumentDefaultsHelpFormatter, HelpFormatter);

ArgumentDefaultsHelpFormatter.prototype._getHelpString = function (action) {
  var help = action.help;
  if (action.help.indexOf('%(defaultValue)s') === -1) {
    if (action.defaultValue !== c.SUPPRESS) {
      var defaulting_nargs = [ c.OPTIONAL, c.ZERO_OR_MORE ];
      if (action.isOptional() || (defaulting_nargs.indexOf(action.nargs) >= 0)) {
        help += ' (default: %(defaultValue)s)';
      }
    }
  }
  return help;
};

module.exports.ArgumentDefaultsHelpFormatter = ArgumentDefaultsHelpFormatter;

/**
 * new RawDescriptionHelpFormatter(options)
 * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...})
 *
 * Help message formatter which retains any formatting in descriptions.
 *
 * Only the name of this class is considered a public API. All the methods
 * provided by the class are considered an implementation detail.
 **/

function RawDescriptionHelpFormatter(options) {
  HelpFormatter.call(this, options);
}

util.inherits(RawDescriptionHelpFormatter, HelpFormatter);

RawDescriptionHelpFormatter.prototype._fillText = function (text, width, indent) {
  var lines = text.split('\n');
  lines = lines.map(function (line) {
    return $$.trimEnd(indent + line);
  });
  return lines.join('\n');
};
module.exports.RawDescriptionHelpFormatter = RawDescriptionHelpFormatter;

/**
 * new RawTextHelpFormatter(options)
 * new ArgumentParser({formatterClass: argparse.RawTextHelpFormatter, ...})
 *
 * Help message formatter which retains formatting of all help text.
 *
 * Only the name of this class is considered a public API. All the methods
 * provided by the class are considered an implementation detail.
 **/

function RawTextHelpFormatter(options) {
  RawDescriptionHelpFormatter.call(this, options);
}

util.inherits(RawTextHelpFormatter, RawDescriptionHelpFormatter);

RawTextHelpFormatter.prototype._splitLines = function (text) {
  return text.split('\n');
};

module.exports.RawTextHelpFormatter = RawTextHelpFormatter;
/**
 * class HelpFormatter
 *
 * Formatter for generating usage messages and argument help strings. Only the
 * name of this class is considered a public API. All the methods provided by
 * the class are considered an implementation detail.
 *
 * Do not call in your code, use this class only for inherits your own forvatter
 *
 * ToDo add [additonal formatters][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#formatter-class
 **/
'use strict';

var sprintf = require('sprintf-js').sprintf;

// Constants
var c = require('../const');

var $$ = require('../utils');


/*:nodoc:* internal
 * new Support(parent, heding)
 * - parent (object): parent section
 * - heading (string): header string
 *
 **/
function Section(parent, heading) {
  this._parent = parent;
  this._heading = heading;
  this._items = [];
}

/*:nodoc:* internal
 * Section#addItem(callback) -> Void
 * - callback (array): tuple with function and args
 *
 * Add function for single element
 **/
Section.prototype.addItem = function (callback) {
  this._items.push(callback);
};

/*:nodoc:* internal
 * Section#formatHelp(formatter) -> string
 * - formatter (HelpFormatter): current formatter
 *
 * Form help section string
 *
 **/
Section.prototype.formatHelp = function (formatter) {
  var itemHelp, heading;

  // format the indented section
  if (this._parent) {
    formatter._indent();
  }

  itemHelp = this._items.map(function (item) {
    var obj, func, args;

    obj = formatter;
    func = item[0];
    args = item[1];
    return func.apply(obj, args);
  });
  itemHelp = formatter._joinParts(itemHelp);

  if (this._parent) {
    formatter._dedent();
  }

  // return nothing if the section was empty
  if (!itemHelp) {
    return '';
  }

  // add the heading if the section was non-empty
  heading = '';
  if (this._heading && this._heading !== c.SUPPRESS) {
    var currentIndent = formatter.currentIndent;
    heading = $$.repeat(' ', currentIndent) + this._heading + ':' + c.EOL;
  }

  // join the section-initialize newline, the heading and the help
  return formatter._joinParts([ c.EOL, heading, itemHelp, c.EOL ]);
};

/**
 * new HelpFormatter(options)
 *
 * #### Options:
 * - `prog`: program name
 * - `indentIncriment`: indent step, default value 2
 * - `maxHelpPosition`: max help position, default value = 24
 * - `width`: line width
 *
 **/
var HelpFormatter = module.exports = function HelpFormatter(options) {
  options = options || {};

  this._prog = options.prog;

  this._maxHelpPosition = options.maxHelpPosition || 24;
  this._width = (options.width || ((process.env.COLUMNS || 80) - 2));

  this._currentIndent = 0;
  this._indentIncriment = options.indentIncriment || 2;
  this._level = 0;
  this._actionMaxLength = 0;

  this._rootSection = new Section(null);
  this._currentSection = this._rootSection;

  this._whitespaceMatcher = new RegExp('\\s+', 'g');
  this._longBreakMatcher = new RegExp(c.EOL + c.EOL + c.EOL + '+', 'g');
};

HelpFormatter.prototype._indent = function () {
  this._currentIndent += this._indentIncriment;
  this._level += 1;
};

HelpFormatter.prototype._dedent = function () {
  this._currentIndent -= this._indentIncriment;
  this._level -= 1;
  if (this._currentIndent < 0) {
    throw new Error('Indent decreased below 0.');
  }
};

HelpFormatter.prototype._addItem = function (func, args) {
  this._currentSection.addItem([ func, args ]);
};

//
// Message building methods
//

/**
 * HelpFormatter#startSection(heading) -> Void
 * - heading (string): header string
 *
 * Start new help section
 *
 * See alse [code example][1]
 *
 * ##### Example
 *
 *      formatter.startSection(actionGroup.title);
 *      formatter.addText(actionGroup.description);
 *      formatter.addArguments(actionGroup._groupActions);
 *      formatter.endSection();
 *
 **/
HelpFormatter.prototype.startSection = function (heading) {
  this._indent();
  var section = new Section(this._currentSection, heading);
  var func = section.formatHelp.bind(section);
  this._addItem(func, [ this ]);
  this._currentSection = section;
};

/**
 * HelpFormatter#endSection -> Void
 *
 * End help section
 *
 * ##### Example
 *
 *      formatter.startSection(actionGroup.title);
 *      formatter.addText(actionGroup.description);
 *      formatter.addArguments(actionGroup._groupActions);
 *      formatter.endSection();
 **/
HelpFormatter.prototype.endSection = function () {
  this._currentSection = this._currentSection._parent;
  this._dedent();
};

/**
 * HelpFormatter#addText(text) -> Void
 * - text (string): plain text
 *
 * Add plain text into current section
 *
 * ##### Example
 *
 *      formatter.startSection(actionGroup.title);
 *      formatter.addText(actionGroup.description);
 *      formatter.addArguments(actionGroup._groupActions);
 *      formatter.endSection();
 *
 **/
HelpFormatter.prototype.addText = function (text) {
  if (text && text !== c.SUPPRESS) {
    this._addItem(this._formatText, [ text ]);
  }
};

/**
 * HelpFormatter#addUsage(usage, actions, groups, prefix) -> Void
 * - usage (string): usage text
 * - actions (array): actions list
 * - groups (array): groups list
 * - prefix (string): usage prefix
 *
 * Add usage data into current section
 *
 * ##### Example
 *
 *      formatter.addUsage(this.usage, this._actions, []);
 *      return formatter.formatHelp();
 *
 **/
HelpFormatter.prototype.addUsage = function (usage, actions, groups, prefix) {
  if (usage !== c.SUPPRESS) {
    this._addItem(this._formatUsage, [ usage, actions, groups, prefix ]);
  }
};

/**
 * HelpFormatter#addArgument(action) -> Void
 * - action (object): action
 *
 * Add argument into current section
 *
 * Single variant of [[HelpFormatter#addArguments]]
 **/
HelpFormatter.prototype.addArgument = function (action) {
  if (action.help !== c.SUPPRESS) {
    var self = this;

    // find all invocations
    var invocations = [ this._formatActionInvocation(action) ];
    var invocationLength = invocations[0].length;

    var actionLength;

    if (action._getSubactions) {
      this._indent();
      action._getSubactions().forEach(function (subaction) {

        var invocationNew = self._formatActionInvocation(subaction);
        invocations.push(invocationNew);
        invocationLength = Math.max(invocationLength, invocationNew.length);

      });
      this._dedent();
    }

    // update the maximum item length
    actionLength = invocationLength + this._currentIndent;
    this._actionMaxLength = Math.max(this._actionMaxLength, actionLength);

    // add the item to the list
    this._addItem(this._formatAction, [ action ]);
  }
};

/**
 * HelpFormatter#addArguments(actions) -> Void
 * - actions (array): actions list
 *
 * Mass add arguments into current section
 *
 * ##### Example
 *
 *      formatter.startSection(actionGroup.title);
 *      formatter.addText(actionGroup.description);
 *      formatter.addArguments(actionGroup._groupActions);
 *      formatter.endSection();
 *
 **/
HelpFormatter.prototype.addArguments = function (actions) {
  var self = this;
  actions.forEach(function (action) {
    self.addArgument(action);
  });
};

//
// Help-formatting methods
//

/**
 * HelpFormatter#formatHelp -> string
 *
 * Format help
 *
 * ##### Example
 *
 *      formatter.addText(this.epilog);
 *      return formatter.formatHelp();
 *
 **/
HelpFormatter.prototype.formatHelp = function () {
  var help = this._rootSection.formatHelp(this);
  if (help) {
    help = help.replace(this._longBreakMatcher, c.EOL + c.EOL);
    help = $$.trimChars(help, c.EOL) + c.EOL;
  }
  return help;
};

HelpFormatter.prototype._joinParts = function (partStrings) {
  return partStrings.filter(function (part) {
    return (part && part !== c.SUPPRESS);
  }).join('');
};

HelpFormatter.prototype._formatUsage = function (usage, actions, groups, prefix) {
  if (!prefix && typeof prefix !== 'string') {
    prefix = 'usage: ';
  }

  actions = actions || [];
  groups = groups || [];


  // if usage is specified, use that
  if (usage) {
    usage = sprintf(usage, { prog: this._prog });

    // if no optionals or positionals are available, usage is just prog
  } else if (!usage && actions.length === 0) {
    usage = this._prog;

    // if optionals and positionals are available, calculate usage
  } else if (!usage) {
    var prog = this._prog;
    var optionals = [];
    var positionals = [];
    var actionUsage;
    var textWidth;

    // split optionals from positionals
    actions.forEach(function (action) {
      if (action.isOptional()) {
        optionals.push(action);
      } else {
        positionals.push(action);
      }
    });

    // build full usage string
    actionUsage = this._formatActionsUsage([].concat(optionals, positionals), groups);
    usage = [ prog, actionUsage ].join(' ');

    // wrap the usage parts if it's too long
    textWidth = this._width - this._currentIndent;
    if ((prefix.length + usage.length) > textWidth) {

      // break usage into wrappable parts
      var regexpPart = new RegExp('\\(.*?\\)+|\\[.*?\\]+|\\S+', 'g');
      var optionalUsage = this._formatActionsUsage(optionals, groups);
      var positionalUsage = this._formatActionsUsage(positionals, groups);


      var optionalParts = optionalUsage.match(regexpPart);
      var positionalParts = positionalUsage.match(regexpPart) || [];

      if (optionalParts.join(' ') !== optionalUsage) {
        throw new Error('assert "optionalParts.join(\' \') === optionalUsage"');
      }
      if (positionalParts.join(' ') !== positionalUsage) {
        throw new Error('assert "positionalParts.join(\' \') === positionalUsage"');
      }

      // helper for wrapping lines
      /*eslint-disable func-style*/ // node 0.10 compat
      var _getLines = function (parts, indent, prefix) {
        var lines = [];
        var line = [];

        var lineLength = prefix ? prefix.length - 1 : indent.length - 1;

        parts.forEach(function (part) {
          if (lineLength + 1 + part.length > textWidth) {
            lines.push(indent + line.join(' '));
            line = [];
            lineLength = indent.length - 1;
          }
          line.push(part);
          lineLength += part.length + 1;
        });

        if (line) {
          lines.push(indent + line.join(' '));
        }
        if (prefix) {
          lines[0] = lines[0].substr(indent.length);
        }
        return lines;
      };

      var lines, indent, parts;
      // if prog is short, follow it with optionals or positionals
      if (prefix.length + prog.length <= 0.75 * textWidth) {
        indent = $$.repeat(' ', (prefix.length + prog.length + 1));
        if (optionalParts) {
          lines = [].concat(
            _getLines([ prog ].concat(optionalParts), indent, prefix),
            _getLines(positionalParts, indent)
          );
        } else if (positionalParts) {
          lines = _getLines([ prog ].concat(positionalParts), indent, prefix);
        } else {
          lines = [ prog ];
        }

        // if prog is long, put it on its own line
      } else {
        indent = $$.repeat(' ', prefix.length);
        parts = optionalParts.concat(positionalParts);
        lines = _getLines(parts, indent);
        if (lines.length > 1) {
          lines = [].concat(
            _getLines(optionalParts, indent),
            _getLines(positionalParts, indent)
          );
        }
        lines = [ prog ].concat(lines);
      }
      // join lines into usage
      usage = lines.join(c.EOL);
    }
  }

  // prefix with 'usage:'
  return prefix + usage + c.EOL + c.EOL;
};

HelpFormatter.prototype._formatActionsUsage = function (actions, groups) {
  // find group indices and identify actions in groups
  var groupActions = [];
  var inserts = [];
  var self = this;

  groups.forEach(function (group) {
    var end;
    var i;

    var start = actions.indexOf(group._groupActions[0]);
    if (start >= 0) {
      end = start + group._groupActions.length;

      //if (actions.slice(start, end) === group._groupActions) {
      if ($$.arrayEqual(actions.slice(start, end), group._groupActions)) {
        group._groupActions.forEach(function (action) {
          groupActions.push(action);
        });

        if (!group.required) {
          if (inserts[start]) {
            inserts[start] += ' [';
          } else {
            inserts[start] = '[';
          }
          inserts[end] = ']';
        } else {
          if (inserts[start]) {
            inserts[start] += ' (';
          } else {
            inserts[start] = '(';
          }
          inserts[end] = ')';
        }
        for (i = start + 1; i < end; i += 1) {
          inserts[i] = '|';
        }
      }
    }
  });

  // collect all actions format strings
  var parts = [];

  actions.forEach(function (action, actionIndex) {
    var part;
    var optionString;
    var argsDefault;
    var argsString;

    // suppressed arguments are marked with None
    // remove | separators for suppressed arguments
    if (action.help === c.SUPPRESS) {
      parts.push(null);
      if (inserts[actionIndex] === '|') {
        inserts.splice(actionIndex, actionIndex);
      } else if (inserts[actionIndex + 1] === '|') {
        inserts.splice(actionIndex + 1, actionIndex + 1);
      }

      // produce all arg strings
    } else if (!action.isOptional()) {
      part = self._formatArgs(action, action.dest);

      // if it's in a group, strip the outer []
      if (groupActions.indexOf(action) >= 0) {
        if (part[0] === '[' && part[part.length - 1] === ']') {
          part = part.slice(1, -1);
        }
      }
      // add the action string to the list
      parts.push(part);

    // produce the first way to invoke the option in brackets
    } else {
      optionString = action.optionStrings[0];

      // if the Optional doesn't take a value, format is: -s or --long
      if (action.nargs === 0) {
        part = '' + optionString;

      // if the Optional takes a value, format is: -s ARGS or --long ARGS
      } else {
        argsDefault = action.dest.toUpperCase();
        argsString = self._formatArgs(action, argsDefault);
        part = optionString + ' ' + argsString;
      }
      // make it look optional if it's not required or in a group
      if (!action.required && groupActions.indexOf(action) < 0) {
        part = '[' + part + ']';
      }
      // add the action string to the list
      parts.push(part);
    }
  });

  // insert things at the necessary indices
  for (var i = inserts.length - 1; i >= 0; --i) {
    if (inserts[i] !== null) {
      parts.splice(i, 0, inserts[i]);
    }
  }

  // join all the action items with spaces
  var text = parts.filter(function (part) {
    return !!part;
  }).join(' ');

  // clean up separators for mutually exclusive groups
  text = text.replace(/([\[(]) /g, '$1'); // remove spaces
  text = text.replace(/ ([\])])/g, '$1');
  text = text.replace(/\[ *\]/g, ''); // remove empty groups
  text = text.replace(/\( *\)/g, '');
  text = text.replace(/\(([^|]*)\)/g, '$1'); // remove () from single action groups

  text = text.trim();

  // return the text
  return text;
};

HelpFormatter.prototype._formatText = function (text) {
  text = sprintf(text, { prog: this._prog });
  var textWidth = this._width - this._currentIndent;
  var indentIncriment = $$.repeat(' ', this._currentIndent);
  return this._fillText(text, textWidth, indentIncriment) + c.EOL + c.EOL;
};

HelpFormatter.prototype._formatAction = function (action) {
  var self = this;

  var helpText;
  var helpLines;
  var parts;
  var indentFirst;

  // determine the required width and the entry label
  var helpPosition = Math.min(this._actionMaxLength + 2, this._maxHelpPosition);
  var helpWidth = this._width - helpPosition;
  var actionWidth = helpPosition - this._currentIndent - 2;
  var actionHeader = this._formatActionInvocation(action);

  // no help; start on same line and add a final newline
  if (!action.help) {
    actionHeader = $$.repeat(' ', this._currentIndent) + actionHeader + c.EOL;

  // short action name; start on the same line and pad two spaces
  } else if (actionHeader.length <= actionWidth) {
    actionHeader = $$.repeat(' ', this._currentIndent) +
        actionHeader +
        '  ' +
        $$.repeat(' ', actionWidth - actionHeader.length);
    indentFirst = 0;

  // long action name; start on the next line
  } else {
    actionHeader = $$.repeat(' ', this._currentIndent) + actionHeader + c.EOL;
    indentFirst = helpPosition;
  }

  // collect the pieces of the action help
  parts = [ actionHeader ];

  // if there was help for the action, add lines of help text
  if (action.help) {
    helpText = this._expandHelp(action);
    helpLines = this._splitLines(helpText, helpWidth);
    parts.push($$.repeat(' ', indentFirst) + helpLines[0] + c.EOL);
    helpLines.slice(1).forEach(function (line) {
      parts.push($$.repeat(' ', helpPosition) + line + c.EOL);
    });

  // or add a newline if the description doesn't end with one
  } else if (actionHeader.charAt(actionHeader.length - 1) !== c.EOL) {
    parts.push(c.EOL);
  }
  // if there are any sub-actions, add their help as well
  if (action._getSubactions) {
    this._indent();
    action._getSubactions().forEach(function (subaction) {
      parts.push(self._formatAction(subaction));
    });
    this._dedent();
  }
  // return a single string
  return this._joinParts(parts);
};

HelpFormatter.prototype._formatActionInvocation = function (action) {
  if (!action.isOptional()) {
    var format_func = this._metavarFormatter(action, action.dest);
    var metavars = format_func(1);
    return metavars[0];
  }

  var parts = [];
  var argsDefault;
  var argsString;

  // if the Optional doesn't take a value, format is: -s, --long
  if (action.nargs === 0) {
    parts = parts.concat(action.optionStrings);

  // if the Optional takes a value, format is: -s ARGS, --long ARGS
  } else {
    argsDefault = action.dest.toUpperCase();
    argsString = this._formatArgs(action, argsDefault);
    action.optionStrings.forEach(function (optionString) {
      parts.push(optionString + ' ' + argsString);
    });
  }
  return parts.join(', ');
};

HelpFormatter.prototype._metavarFormatter = function (action, metavarDefault) {
  var result;

  if (action.metavar || action.metavar === '') {
    result = action.metavar;
  } else if (action.choices) {
    var choices = action.choices;

    if (typeof choices === 'string') {
      choices = choices.split('').join(', ');
    } else if (Array.isArray(choices)) {
      choices = choices.join(',');
    } else {
      choices = Object.keys(choices).join(',');
    }
    result = '{' + choices + '}';
  } else {
    result = metavarDefault;
  }

  return function (size) {
    if (Array.isArray(result)) {
      return result;
    }

    var metavars = [];
    for (var i = 0; i < size; i += 1) {
      metavars.push(result);
    }
    return metavars;
  };
};

HelpFormatter.prototype._formatArgs = function (action, metavarDefault) {
  var result;
  var metavars;

  var buildMetavar = this._metavarFormatter(action, metavarDefault);

  switch (action.nargs) {
    /*eslint-disable no-undefined*/
    case undefined:
    case null:
      metavars = buildMetavar(1);
      result = '' + metavars[0];
      break;
    case c.OPTIONAL:
      metavars = buildMetavar(1);
      result = '[' + metavars[0] + ']';
      break;
    case c.ZERO_OR_MORE:
      metavars = buildMetavar(2);
      result = '[' + metavars[0] + ' [' + metavars[1] + ' ...]]';
      break;
    case c.ONE_OR_MORE:
      metavars = buildMetavar(2);
      result = '' + metavars[0] + ' [' + metavars[1] + ' ...]';
      break;
    case c.REMAINDER:
      result = '...';
      break;
    case c.PARSER:
      metavars = buildMetavar(1);
      result = metavars[0] + ' ...';
      break;
    default:
      metavars = buildMetavar(action.nargs);
      result = metavars.join(' ');
  }
  return result;
};

HelpFormatter.prototype._expandHelp = function (action) {
  var params = { prog: this._prog };

  Object.keys(action).forEach(function (actionProperty) {
    var actionValue = action[actionProperty];

    if (actionValue !== c.SUPPRESS) {
      params[actionProperty] = actionValue;
    }
  });

  if (params.choices) {
    if (typeof params.choices === 'string') {
      params.choices = params.choices.split('').join(', ');
    } else if (Array.isArray(params.choices)) {
      params.choices = params.choices.join(', ');
    } else {
      params.choices = Object.keys(params.choices).join(', ');
    }
  }

  return sprintf(this._getHelpString(action), params);
};

HelpFormatter.prototype._splitLines = function (text, width) {
  var lines = [];
  var delimiters = [ ' ', '.', ',', '!', '?' ];
  var re = new RegExp('[' + delimiters.join('') + '][^' + delimiters.join('') + ']*$');

  text = text.replace(/[\n\|\t]/g, ' ');

  text = text.trim();
  text = text.replace(this._whitespaceMatcher, ' ');

  // Wraps the single paragraph in text (a string) so every line
  // is at most width characters long.
  text.split(c.EOL).forEach(function (line) {
    if (width >= line.length) {
      lines.push(line);
      return;
    }

    var wrapStart = 0;
    var wrapEnd = width;
    var delimiterIndex = 0;
    while (wrapEnd <= line.length) {
      if (wrapEnd !== line.length && delimiters.indexOf(line[wrapEnd] < -1)) {
        delimiterIndex = (re.exec(line.substring(wrapStart, wrapEnd)) || {}).index;
        wrapEnd = wrapStart + delimiterIndex + 1;
      }
      lines.push(line.substring(wrapStart, wrapEnd));
      wrapStart = wrapEnd;
      wrapEnd += width;
    }
    if (wrapStart < line.length) {
      lines.push(line.substring(wrapStart, wrapEnd));
    }
  });

  return lines;
};

HelpFormatter.prototype._fillText = function (text, width, indent) {
  var lines = this._splitLines(text, width);
  lines = lines.map(function (line) {
    return indent + line;
  });
  return lines.join(c.EOL);
};

HelpFormatter.prototype._getHelpString = function (action) {
  return action.help;
};
'use strict';


var format  = require('util').format;


var ERR_CODE = 'ARGError';

/*:nodoc:*
 * argumentError(argument, message) -> TypeError
 * - argument (Object): action with broken argument
 * - message (String): error message
 *
 * Error format helper. An error from creating or using an argument
 * (optional or positional). The string value of this exception
 * is the message, augmented with information
 * about the argument that caused it.
 *
 * #####Example
 *
 *      var argumentErrorHelper = require('./argument/error');
 *      if (conflictOptionals.length > 0) {
 *        throw argumentErrorHelper(
 *          action,
 *          format('Conflicting option string(s): %s', conflictOptionals.join(', '))
 *        );
 *      }
 *
 **/
module.exports = function (argument, message) {
  var argumentName = null;
  var errMessage;
  var err;

  if (argument.getName) {
    argumentName = argument.getName();
  } else {
    argumentName = '' + argument;
  }

  if (!argumentName) {
    errMessage = message;
  } else {
    errMessage = format('argument "%s": %s', argumentName, message);
  }

  err = new TypeError(errMessage);
  err.code = ERR_CODE;
  return err;
};
/** internal
 * class MutuallyExclusiveGroup
 *
 * Group arguments.
 * By default, ArgumentParser groups command-line arguments
 * into â€œpositional argumentsâ€� and â€œoptional argumentsâ€�
 * when displaying help messages. When there is a better
 * conceptual grouping of arguments than this default one,
 * appropriate groups can be created using the addArgumentGroup() method
 *
 * This class inherited from [[ArgumentContainer]]
 **/
'use strict';

var util = require('util');

var ArgumentGroup = require('./group');

/**
 * new MutuallyExclusiveGroup(container, options)
 * - container (object): main container
 * - options (object): options.required -> true/false
 *
 * `required` could be an argument itself, but making it a property of
 * the options argument is more consistent with the JS adaptation of the Python)
 **/
var MutuallyExclusiveGroup = module.exports = function MutuallyExclusiveGroup(container, options) {
  var required;
  options = options || {};
  required = options.required || false;
  ArgumentGroup.call(this, container);
  this.required = required;

};
util.inherits(MutuallyExclusiveGroup, ArgumentGroup);


MutuallyExclusiveGroup.prototype._addAction = function (action) {
  var msg;
  if (action.required) {
    msg = 'mutually exclusive arguments must be optional';
    throw new Error(msg);
  }
  action = this._container._addAction(action);
  this._groupActions.push(action);
  return action;
};


MutuallyExclusiveGroup.prototype._removeAction = function (action) {
  this._container._removeAction(action);
  this._groupActions.remove(action);
};

/** internal
 * class ArgumentGroup
 *
 * Group arguments.
 * By default, ArgumentParser groups command-line arguments
 * into â€œpositional argumentsâ€� and â€œoptional argumentsâ€�
 * when displaying help messages. When there is a better
 * conceptual grouping of arguments than this default one,
 * appropriate groups can be created using the addArgumentGroup() method
 *
 * This class inherited from [[ArgumentContainer]]
 **/
'use strict';

var util = require('util');

var ActionContainer = require('../action_container');


/**
 * new ArgumentGroup(container, options)
 * - container (object): main container
 * - options (object): hash of group options
 *
 * #### options
 * - **prefixChars**  group name prefix
 * - **argumentDefault**  default argument value
 * - **title**  group title
 * - **description** group description
 *
 **/
var ArgumentGroup = module.exports = function ArgumentGroup(container, options) {

  options = options || {};

  // add any missing keyword arguments by checking the container
  options.conflictHandler = (options.conflictHandler || container.conflictHandler);
  options.prefixChars = (options.prefixChars || container.prefixChars);
  options.argumentDefault = (options.argumentDefault || container.argumentDefault);

  ActionContainer.call(this, options);

  // group attributes
  this.title = options.title;
  this._groupActions = [];

  // share most attributes with the container
  this._container = container;
  this._registries = container._registries;
  this._actions = container._actions;
  this._optionStringActions = container._optionStringActions;
  this._defaults = container._defaults;
  this._hasNegativeNumberOptionals = container._hasNegativeNumberOptionals;
  this._mutuallyExclusiveGroups = container._mutuallyExclusiveGroups;
};
util.inherits(ArgumentGroup, ActionContainer);


ArgumentGroup.prototype._addAction = function (action) {
  // Parent add action
  action = ActionContainer.prototype._addAction.call(this, action);
  this._groupActions.push(action);
  return action;
};


ArgumentGroup.prototype._removeAction = function (action) {
  // Parent remove action
  ActionContainer.prototype._removeAction.call(this, action);
  var actionIndex = this._groupActions.indexOf(action);
  if (actionIndex >= 0) {
    this._groupActions.splice(actionIndex, 1);
  }
};

/*:nodoc:*
 * class ActionAppend
 *
 * This action stores a list, and appends each argument value to the list.
 * This is useful to allow an option to be specified multiple times.
 * This class inherided from [[Action]]
 *
 **/

'use strict';

var util = require('util');

var Action = require('../action');

// Constants
var c = require('../const');

/*:nodoc:*
 * new ActionAppend(options)
 * - options (object): options hash see [[Action.new]]
 *
 * Note: options.nargs should be optional for constants
 * and more then zero for other
 **/
var ActionAppend = module.exports = function ActionAppend(options) {
  options = options || {};
  if (this.nargs <= 0) {
    throw new Error('nargs for append actions must be > 0; if arg ' +
        'strings are not supplying the value to append, ' +
        'the append const action may be more appropriate');
  }
  if (!!this.constant && this.nargs !== c.OPTIONAL) {
    throw new Error('nargs must be OPTIONAL to supply const');
  }
  Action.call(this, options);
};
util.inherits(ActionAppend, Action);

/*:nodoc:*
 * ActionAppend#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionAppend.prototype.call = function (parser, namespace, values) {
  var items = (namespace[this.dest] || []).slice();
  items.push(values);
  namespace.set(this.dest, items);
};
/*:nodoc:*
 * class ActionCount
 *
 * This counts the number of times a keyword argument occurs.
 * For example, this is useful for increasing verbosity levels
 *
 * This class inherided from [[Action]]
 *
 **/
'use strict';

var util = require('util');

var Action = require('../action');

/*:nodoc:*
 * new ActionCount(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionCount = module.exports = function ActionCount(options) {
  options = options || {};
  options.nargs = 0;

  Action.call(this, options);
};
util.inherits(ActionCount, Action);

/*:nodoc:*
 * ActionCount#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionCount.prototype.call = function (parser, namespace) {
  namespace.set(this.dest, (namespace[this.dest] || 0) + 1);
};
/*:nodoc:*
 * class ActionHelp
 *
 * Support action for printing help
 * This class inherided from [[Action]]
 **/
'use strict';

var util = require('util');

var Action = require('../action');

// Constants
var c  = require('../const');

/*:nodoc:*
 * new ActionHelp(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionHelp = module.exports = function ActionHelp(options) {
  options = options || {};
  if (options.defaultValue !== null) {
    options.defaultValue = options.defaultValue;
  } else {
    options.defaultValue = c.SUPPRESS;
  }
  options.dest = (options.dest !== null ? options.dest : c.SUPPRESS);
  options.nargs = 0;
  Action.call(this, options);

};
util.inherits(ActionHelp, Action);

/*:nodoc:*
 * ActionHelp#call(parser, namespace, values, optionString)
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Print help and exit
 **/
ActionHelp.prototype.call = function (parser) {
  parser.printHelp();
  parser.exit();
};
/*:nodoc:*
 * class ActionStore
 *
 * This action just stores the argumentâ€™s value. This is the default action.
 *
 * This class inherited from [[Action]]
 *
 **/
'use strict';

var util = require('util');

var Action = require('../action');

// Constants
var c = require('../const');


/*:nodoc:*
 * new ActionStore(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionStore = module.exports = function ActionStore(options) {
  options = options || {};
  if (this.nargs <= 0) {
    throw new Error('nargs for store actions must be > 0; if you ' +
        'have nothing to store, actions such as store ' +
        'true or store const may be more appropriate');

  }
  if (typeof this.constant !== 'undefined' && this.nargs !== c.OPTIONAL) {
    throw new Error('nargs must be OPTIONAL to supply const');
  }
  Action.call(this, options);
};
util.inherits(ActionStore, Action);

/*:nodoc:*
 * ActionStore#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionStore.prototype.call = function (parser, namespace, values) {
  namespace.set(this.dest, values);
};
/** internal
 * class ActionSubparsers
 *
 * Support the creation of such sub-commands with the addSubparsers()
 *
 * This class inherited from [[Action]]
 **/
'use strict';

var util    = require('util');
var format  = require('util').format;


var Action = require('../action');

// Constants
var c = require('../const');

// Errors
var argumentErrorHelper = require('../argument/error');


/*:nodoc:*
 * new ChoicesPseudoAction(name, help)
 *
 * Create pseudo action for correct help text
 *
 **/
function ChoicesPseudoAction(name, help) {
  var options = {
    optionStrings: [],
    dest: name,
    help: help
  };

  Action.call(this, options);
}

util.inherits(ChoicesPseudoAction, Action);

/**
 * new ActionSubparsers(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
function ActionSubparsers(options) {
  options = options || {};
  options.dest = options.dest || c.SUPPRESS;
  options.nargs = c.PARSER;

  this.debug = (options.debug === true);

  this._progPrefix = options.prog;
  this._parserClass = options.parserClass;
  this._nameParserMap = {};
  this._choicesActions = [];

  options.choices = this._nameParserMap;
  Action.call(this, options);
}

util.inherits(ActionSubparsers, Action);

/*:nodoc:*
 * ActionSubparsers#addParser(name, options) -> ArgumentParser
 * - name (string): sub-command name
 * - options (object): see [[ArgumentParser.new]]
 *
 *  Note:
 *  addParser supports an additional aliases option,
 *  which allows multiple strings to refer to the same subparser.
 *  This example, like svn, aliases co as a shorthand for checkout
 *
 **/
ActionSubparsers.prototype.addParser = function (name, options) {
  var parser;

  var self = this;

  options = options || {};

  options.debug = (this.debug === true);

  // set program from the existing prefix
  if (!options.prog) {
    options.prog = this._progPrefix + ' ' + name;
  }

  var aliases = options.aliases || [];

  // create a pseudo-action to hold the choice help
  if (!!options.help || typeof options.help === 'string') {
    var help = options.help;
    delete options.help;

    var choiceAction = new ChoicesPseudoAction(name, help);
    this._choicesActions.push(choiceAction);
  }

  // create the parser and add it to the map
  parser = new this._parserClass(options);
  this._nameParserMap[name] = parser;

  // make parser available under aliases also
  aliases.forEach(function (alias) {
    self._nameParserMap[alias] = parser;
  });

  return parser;
};

ActionSubparsers.prototype._getSubactions = function () {
  return this._choicesActions;
};

/*:nodoc:*
 * ActionSubparsers#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Parse input aguments
 **/
ActionSubparsers.prototype.call = function (parser, namespace, values) {
  var parserName = values[0];
  var argStrings = values.slice(1);

  // set the parser name if requested
  if (this.dest !== c.SUPPRESS) {
    namespace[this.dest] = parserName;
  }

  // select the parser
  if (this._nameParserMap[parserName]) {
    parser = this._nameParserMap[parserName];
  } else {
    throw argumentErrorHelper(format(
      'Unknown parser "%s" (choices: [%s]).',
        parserName,
        Object.keys(this._nameParserMap).join(', ')
    ));
  }

  // parse all the remaining options into the namespace
  parser.parseArgs(argStrings, namespace);
};

module.exports = ActionSubparsers;
/*:nodoc:*
 * class ActionVersion
 *
 * Support action for printing program version
 * This class inherited from [[Action]]
 **/
'use strict';

var util = require('util');

var Action = require('../action');

//
// Constants
//
var c = require('../const');

/*:nodoc:*
 * new ActionVersion(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionVersion = module.exports = function ActionVersion(options) {
  options = options || {};
  options.defaultValue = (options.defaultValue ? options.defaultValue : c.SUPPRESS);
  options.dest = (options.dest || c.SUPPRESS);
  options.nargs = 0;
  this.version = options.version;
  Action.call(this, options);
};
util.inherits(ActionVersion, Action);

/*:nodoc:*
 * ActionVersion#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Print version and exit
 **/
ActionVersion.prototype.call = function (parser) {
  var version = this.version || parser.version;
  var formatter = parser._getFormatter();
  formatter.addText(version);
  parser.exit(0, formatter.formatHelp());
};
/*:nodoc:*
 * class ActionStoreConstant
 *
 * This action stores the value specified by the const keyword argument.
 * (Note that the const keyword argument defaults to the rather unhelpful null.)
 * The 'store_const' action is most commonly used with optional
 * arguments that specify some sort of flag.
 *
 * This class inherited from [[Action]]
 **/
'use strict';

var util = require('util');

var Action = require('../../action');

/*:nodoc:*
 * new ActionStoreConstant(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionStoreConstant = module.exports = function ActionStoreConstant(options) {
  options = options || {};
  options.nargs = 0;
  if (typeof options.constant === 'undefined') {
    throw new Error('constant option is required for storeAction');
  }
  Action.call(this, options);
};
util.inherits(ActionStoreConstant, Action);

/*:nodoc:*
 * ActionStoreConstant#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionStoreConstant.prototype.call = function (parser, namespace) {
  namespace.set(this.dest, this.constant);
};
/*:nodoc:*
 * class ActionStoreFalse
 *
 * This action store the values False respectively.
 * This is special cases of 'storeConst'
 *
 * This class inherited from [[Action]]
 **/

'use strict';

var util = require('util');

var ActionStoreConstant = require('./constant');

/*:nodoc:*
 * new ActionStoreFalse(options)
 * - options (object): hash of options see [[Action.new]]
 *
 **/
var ActionStoreFalse = module.exports = function ActionStoreFalse(options) {
  options = options || {};
  options.constant = false;
  options.defaultValue = options.defaultValue !== null ? options.defaultValue : true;
  ActionStoreConstant.call(this, options);
};
util.inherits(ActionStoreFalse, ActionStoreConstant);
/*:nodoc:*
 * class ActionStoreTrue
 *
 * This action store the values True respectively.
 * This isspecial cases of 'storeConst'
 *
 * This class inherited from [[Action]]
 **/
'use strict';

var util = require('util');

var ActionStoreConstant = require('./constant');

/*:nodoc:*
 * new ActionStoreTrue(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionStoreTrue = module.exports = function ActionStoreTrue(options) {
  options = options || {};
  options.constant = true;
  options.defaultValue = options.defaultValue !== null ? options.defaultValue : false;
  ActionStoreConstant.call(this, options);
};
util.inherits(ActionStoreTrue, ActionStoreConstant);
/*:nodoc:*
 * class ActionAppendConstant
 *
 * This stores a list, and appends the value specified by
 * the const keyword argument to the list.
 * (Note that the const keyword argument defaults to null.)
 * The 'appendConst' action is typically useful when multiple
 * arguments need to store constants to the same list.
 *
 * This class inherited from [[Action]]
 **/

'use strict';

var util = require('util');

var Action = require('../../action');

/*:nodoc:*
 * new ActionAppendConstant(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionAppendConstant = module.exports = function ActionAppendConstant(options) {
  options = options || {};
  options.nargs = 0;
  if (typeof options.constant === 'undefined') {
    throw new Error('constant option is required for appendAction');
  }
  Action.call(this, options);
};
util.inherits(ActionAppendConstant, Action);

/*:nodoc:*
 * ActionAppendConstant#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionAppendConstant.prototype.call = function (parser, namespace) {
  var items = [].concat(namespace[this.dest] || []);
  items.push(this.constant);
  namespace.set(this.dest, items);
};
'use strict';
module.exports = function (arr, predicate, ctx) {
	if (typeof Array.prototype.findIndex === 'function') {
		return arr.findIndex(predicate, ctx);
	}

	if (typeof predicate !== 'function') {
		throw new TypeError('predicate must be a function');
	}

	var list = Object(arr);
	var len = list.length;

	if (len === 0) {
		return -1;
	}

	for (var i = 0; i < len; i++) {
		if (predicate.call(ctx, list[i], i, list)) {
			return i;
		}
	}

	return -1;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "ES2015 `Array#findIndex()` ponyfill",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/array-find-index#readme",
  "license": "MIT",
  "name": "array-find-index",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/array-find-index.git"
  },
  "version": "1.0.2"
}'use strict';
module.exports = function(val) {
  return Array.isArray(val) ? val : [val];
};
{
  "author": {
    "name": "Steve Mao",
    "email": "maochenyan@gmail.com",
    "url": "https://github.com/stevemao"
  },
  "deprecated": false,
  "description": "Turn anything into an array",
  "devDependencies": {
    "coveralls": "^2.11.2",
    "istanbul": "^0.3.8",
    "jscs": "^1.11.3",
    "jshint": "^2.6.3",
    "mocha": "*"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/stevemao/array-ify",
  "license": "MIT",
  "name": "array-ify",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/stevemao/array-ify.git"
  },
  "version": "1.0.0"
}Copyright (c) 2011 Mark Cavage, All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE
{
  "author": {
    "name": "Joyent",
    "url": "joyent.com"
  },
  "dependencies": {
    "safer-buffer": "~2.1.0"
  },
  "deprecated": false,
  "description": "Contains parsers and serializers for ASN.1 (currently BER only)",
  "devDependencies": {
    "eslint": "2.13.1",
    "eslint-plugin-joyent": "~1.3.0",
    "faucet": "0.0.1",
    "istanbul": "^0.3.6",
    "tape": "^3.5.0"
  },
  "homepage": "https://github.com/joyent/node-asn1#readme",
  "license": "MIT",
  "main": "lib/index.js",
  "name": "asn1",
  "repository": {
    "type": "git",
    "url": "git://github.com/joyent/node-asn1.git"
  },
  "version": "0.2.4"
}// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.

// If you have no idea what ASN.1 or BER is, see this:
// ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc

var Ber = require('./ber/index');



// --- Exported API

module.exports = {

  Ber: Ber,

  BerReader: Ber.Reader,

  BerWriter: Ber.Writer

};
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.


module.exports = {

  newInvalidAsn1Error: function (msg) {
    var e = new Error();
    e.name = 'InvalidAsn1Error';
    e.message = msg || '';
    return e;
  }

};
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.

var errors = require('./errors');
var types = require('./types');

var Reader = require('./reader');
var Writer = require('./writer');


// --- Exports

module.exports = {

  Reader: Reader,

  Writer: Writer

};

for (var t in types) {
  if (types.hasOwnProperty(t))
    module.exports[t] = types[t];
}
for (var e in errors) {
  if (errors.hasOwnProperty(e))
    module.exports[e] = errors[e];
}
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.

var assert = require('assert');
var Buffer = require('safer-buffer').Buffer;

var ASN1 = require('./types');
var errors = require('./errors');


// --- Globals

var newInvalidAsn1Error = errors.newInvalidAsn1Error;



// --- API

function Reader(data) {
  if (!data || !Buffer.isBuffer(data))
    throw new TypeError('data must be a node Buffer');

  this._buf = data;
  this._size = data.length;

  // These hold the "current" state
  this._len = 0;
  this._offset = 0;
}

Object.defineProperty(Reader.prototype, 'length', {
  enumerable: true,
  get: function () { return (this._len); }
});

Object.defineProperty(Reader.prototype, 'offset', {
  enumerable: true,
  get: function () { return (this._offset); }
});

Object.defineProperty(Reader.prototype, 'remain', {
  get: function () { return (this._size - this._offset); }
});

Object.defineProperty(Reader.prototype, 'buffer', {
  get: function () { return (this._buf.slice(this._offset)); }
});


/**
 * Reads a single byte and advances offset; you can pass in `true` to make this
 * a "peek" operation (i.e., get the byte, but don't advance the offset).
 *
 * @param {Boolean} peek true means don't move offset.
 * @return {Number} the next byte, null if not enough data.
 */
Reader.prototype.readByte = function (peek) {
  if (this._size - this._offset < 1)
    return null;

  var b = this._buf[this._offset] & 0xff;

  if (!peek)
    this._offset += 1;

  return b;
};


Reader.prototype.peek = function () {
  return this.readByte(true);
};


/**
 * Reads a (potentially) variable length off the BER buffer.  This call is
 * not really meant to be called directly, as callers have to manipulate
 * the internal buffer afterwards.
 *
 * As a result of this call, you can call `Reader.length`, until the
 * next thing called that does a readLength.
 *
 * @return {Number} the amount of offset to advance the buffer.
 * @throws {InvalidAsn1Error} on bad ASN.1
 */
Reader.prototype.readLength = function (offset) {
  if (offset === undefined)
    offset = this._offset;

  if (offset >= this._size)
    return null;

  var lenB = this._buf[offset++] & 0xff;
  if (lenB === null)
    return null;

  if ((lenB & 0x80) === 0x80) {
    lenB &= 0x7f;

    if (lenB === 0)
      throw newInvalidAsn1Error('Indefinite length not supported');

    if (lenB > 4)
      throw newInvalidAsn1Error('encoding too long');

    if (this._size - offset < lenB)
      return null;

    this._len = 0;
    for (var i = 0; i < lenB; i++)
      this._len = (this._len << 8) + (this._buf[offset++] & 0xff);

  } else {
    // Wasn't a variable length
    this._len = lenB;
  }

  return offset;
};


/**
 * Parses the next sequence in this BER buffer.
 *
 * To get the length of the sequence, call `Reader.length`.
 *
 * @return {Number} the sequence's tag.
 */
Reader.prototype.readSequence = function (tag) {
  var seq = this.peek();
  if (seq === null)
    return null;
  if (tag !== undefined && tag !== seq)
    throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +
                              ': got 0x' + seq.toString(16));

  var o = this.readLength(this._offset + 1); // stored in `length`
  if (o === null)
    return null;

  this._offset = o;
  return seq;
};


Reader.prototype.readInt = function () {
  return this._readTag(ASN1.Integer);
};


Reader.prototype.readBoolean = function () {
  return (this._readTag(ASN1.Boolean) === 0 ? false : true);
};


Reader.prototype.readEnumeration = function () {
  return this._readTag(ASN1.Enumeration);
};


Reader.prototype.readString = function (tag, retbuf) {
  if (!tag)
    tag = ASN1.OctetString;

  var b = this.peek();
  if (b === null)
    return null;

  if (b !== tag)
    throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +
                              ': got 0x' + b.toString(16));

  var o = this.readLength(this._offset + 1); // stored in `length`

  if (o === null)
    return null;

  if (this.length > this._size - o)
    return null;

  this._offset = o;

  if (this.length === 0)
    return retbuf ? Buffer.alloc(0) : '';

  var str = this._buf.slice(this._offset, this._offset + this.length);
  this._offset += this.length;

  return retbuf ? str : str.toString('utf8');
};

Reader.prototype.readOID = function (tag) {
  if (!tag)
    tag = ASN1.OID;

  var b = this.readString(tag, true);
  if (b === null)
    return null;

  var values = [];
  var value = 0;

  for (var i = 0; i < b.length; i++) {
    var byte = b[i] & 0xff;

    value <<= 7;
    value += byte & 0x7f;
    if ((byte & 0x80) === 0) {
      values.push(value);
      value = 0;
    }
  }

  value = values.shift();
  values.unshift(value % 40);
  values.unshift((value / 40) >> 0);

  return values.join('.');
};


Reader.prototype._readTag = function (tag) {
  assert.ok(tag !== undefined);

  var b = this.peek();

  if (b === null)
    return null;

  if (b !== tag)
    throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +
                              ': got 0x' + b.toString(16));

  var o = this.readLength(this._offset + 1); // stored in `length`
  if (o === null)
    return null;

  if (this.length > 4)
    throw newInvalidAsn1Error('Integer too long: ' + this.length);

  if (this.length > this._size - o)
    return null;
  this._offset = o;

  var fb = this._buf[this._offset];
  var value = 0;

  for (var i = 0; i < this.length; i++) {
    value <<= 8;
    value |= (this._buf[this._offset++] & 0xff);
  }

  if ((fb & 0x80) === 0x80 && i !== 4)
    value -= (1 << (i * 8));

  return value >> 0;
};



// --- Exported API

module.exports = Reader;
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.


module.exports = {
  EOC: 0,
  Boolean: 1,
  Integer: 2,
  BitString: 3,
  OctetString: 4,
  Null: 5,
  OID: 6,
  ObjectDescriptor: 7,
  External: 8,
  Real: 9, // float
  Enumeration: 10,
  PDV: 11,
  Utf8String: 12,
  RelativeOID: 13,
  Sequence: 16,
  Set: 17,
  NumericString: 18,
  PrintableString: 19,
  T61String: 20,
  VideotexString: 21,
  IA5String: 22,
  UTCTime: 23,
  GeneralizedTime: 24,
  GraphicString: 25,
  VisibleString: 26,
  GeneralString: 28,
  UniversalString: 29,
  CharacterString: 30,
  BMPString: 31,
  Constructor: 32,
  Context: 128
};
// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.

var assert = require('assert');
var Buffer = require('safer-buffer').Buffer;
var ASN1 = require('./types');
var errors = require('./errors');


// --- Globals

var newInvalidAsn1Error = errors.newInvalidAsn1Error;

var DEFAULT_OPTS = {
  size: 1024,
  growthFactor: 8
};


// --- Helpers

function merge(from, to) {
  assert.ok(from);
  assert.equal(typeof (from), 'object');
  assert.ok(to);
  assert.equal(typeof (to), 'object');

  var keys = Object.getOwnPropertyNames(from);
  keys.forEach(function (key) {
    if (to[key])
      return;

    var value = Object.getOwnPropertyDescriptor(from, key);
    Object.defineProperty(to, key, value);
  });

  return to;
}



// --- API

function Writer(options) {
  options = merge(DEFAULT_OPTS, options || {});

  this._buf = Buffer.alloc(options.size || 1024);
  this._size = this._buf.length;
  this._offset = 0;
  this._options = options;

  // A list of offsets in the buffer where we need to insert
  // sequence tag/len pairs.
  this._seq = [];
}

Object.defineProperty(Writer.prototype, 'buffer', {
  get: function () {
    if (this._seq.length)
      throw newInvalidAsn1Error(this._seq.length + ' unended sequence(s)');

    return (this._buf.slice(0, this._offset));
  }
});

Writer.prototype.writeByte = function (b) {
  if (typeof (b) !== 'number')
    throw new TypeError('argument must be a Number');

  this._ensure(1);
  this._buf[this._offset++] = b;
};


Writer.prototype.writeInt = function (i, tag) {
  if (typeof (i) !== 'number')
    throw new TypeError('argument must be a Number');
  if (typeof (tag) !== 'number')
    tag = ASN1.Integer;

  var sz = 4;

  while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000 >> 0)) &&
        (sz > 1)) {
    sz--;
    i <<= 8;
  }

  if (sz > 4)
    throw newInvalidAsn1Error('BER ints cannot be > 0xffffffff');

  this._ensure(2 + sz);
  this._buf[this._offset++] = tag;
  this._buf[this._offset++] = sz;

  while (sz-- > 0) {
    this._buf[this._offset++] = ((i & 0xff000000) >>> 24);
    i <<= 8;
  }

};


Writer.prototype.writeNull = function () {
  this.writeByte(ASN1.Null);
  this.writeByte(0x00);
};


Writer.prototype.writeEnumeration = function (i, tag) {
  if (typeof (i) !== 'number')
    throw new TypeError('argument must be a Number');
  if (typeof (tag) !== 'number')
    tag = ASN1.Enumeration;

  return this.writeInt(i, tag);
};


Writer.prototype.writeBoolean = function (b, tag) {
  if (typeof (b) !== 'boolean')
    throw new TypeError('argument must be a Boolean');
  if (typeof (tag) !== 'number')
    tag = ASN1.Boolean;

  this._ensure(3);
  this._buf[this._offset++] = tag;
  this._buf[this._offset++] = 0x01;
  this._buf[this._offset++] = b ? 0xff : 0x00;
};


Writer.prototype.writeString = function (s, tag) {
  if (typeof (s) !== 'string')
    throw new TypeError('argument must be a string (was: ' + typeof (s) + ')');
  if (typeof (tag) !== 'number')
    tag = ASN1.OctetString;

  var len = Buffer.byteLength(s);
  this.writeByte(tag);
  this.writeLength(len);
  if (len) {
    this._ensure(len);
    this._buf.write(s, this._offset);
    this._offset += len;
  }
};


Writer.prototype.writeBuffer = function (buf, tag) {
  if (typeof (tag) !== 'number')
    throw new TypeError('tag must be a number');
  if (!Buffer.isBuffer(buf))
    throw new TypeError('argument must be a buffer');

  this.writeByte(tag);
  this.writeLength(buf.length);
  this._ensure(buf.length);
  buf.copy(this._buf, this._offset, 0, buf.length);
  this._offset += buf.length;
};


Writer.prototype.writeStringArray = function (strings) {
  if ((!strings instanceof Array))
    throw new TypeError('argument must be an Array[String]');

  var self = this;
  strings.forEach(function (s) {
    self.writeString(s);
  });
};

// This is really to solve DER cases, but whatever for now
Writer.prototype.writeOID = function (s, tag) {
  if (typeof (s) !== 'string')
    throw new TypeError('argument must be a string');
  if (typeof (tag) !== 'number')
    tag = ASN1.OID;

  if (!/^([0-9]+\.){3,}[0-9]+$/.test(s))
    throw new Error('argument is not a valid OID string');

  function encodeOctet(bytes, octet) {
    if (octet < 128) {
        bytes.push(octet);
    } else if (octet < 16384) {
        bytes.push((octet >>> 7) | 0x80);
        bytes.push(octet & 0x7F);
    } else if (octet < 2097152) {
      bytes.push((octet >>> 14) | 0x80);
      bytes.push(((octet >>> 7) | 0x80) & 0xFF);
      bytes.push(octet & 0x7F);
    } else if (octet < 268435456) {
      bytes.push((octet >>> 21) | 0x80);
      bytes.push(((octet >>> 14) | 0x80) & 0xFF);
      bytes.push(((octet >>> 7) | 0x80) & 0xFF);
      bytes.push(octet & 0x7F);
    } else {
      bytes.push(((octet >>> 28) | 0x80) & 0xFF);
      bytes.push(((octet >>> 21) | 0x80) & 0xFF);
      bytes.push(((octet >>> 14) | 0x80) & 0xFF);
      bytes.push(((octet >>> 7) | 0x80) & 0xFF);
      bytes.push(octet & 0x7F);
    }
  }

  var tmp = s.split('.');
  var bytes = [];
  bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10));
  tmp.slice(2).forEach(function (b) {
    encodeOctet(bytes, parseInt(b, 10));
  });

  var self = this;
  this._ensure(2 + bytes.length);
  this.writeByte(tag);
  this.writeLength(bytes.length);
  bytes.forEach(function (b) {
    self.writeByte(b);
  });
};


Writer.prototype.writeLength = function (len) {
  if (typeof (len) !== 'number')
    throw new TypeError('argument must be a Number');

  this._ensure(4);

  if (len <= 0x7f) {
    this._buf[this._offset++] = len;
  } else if (len <= 0xff) {
    this._buf[this._offset++] = 0x81;
    this._buf[this._offset++] = len;
  } else if (len <= 0xffff) {
    this._buf[this._offset++] = 0x82;
    this._buf[this._offset++] = len >> 8;
    this._buf[this._offset++] = len;
  } else if (len <= 0xffffff) {
    this._buf[this._offset++] = 0x83;
    this._buf[this._offset++] = len >> 16;
    this._buf[this._offset++] = len >> 8;
    this._buf[this._offset++] = len;
  } else {
    throw newInvalidAsn1Error('Length too long (> 4 bytes)');
  }
};

Writer.prototype.startSequence = function (tag) {
  if (typeof (tag) !== 'number')
    tag = ASN1.Sequence | ASN1.Constructor;

  this.writeByte(tag);
  this._seq.push(this._offset);
  this._ensure(3);
  this._offset += 3;
};


Writer.prototype.endSequence = function () {
  var seq = this._seq.pop();
  var start = seq + 3;
  var len = this._offset - start;

  if (len <= 0x7f) {
    this._shift(start, len, -2);
    this._buf[seq] = len;
  } else if (len <= 0xff) {
    this._shift(start, len, -1);
    this._buf[seq] = 0x81;
    this._buf[seq + 1] = len;
  } else if (len <= 0xffff) {
    this._buf[seq] = 0x82;
    this._buf[seq + 1] = len >> 8;
    this._buf[seq + 2] = len;
  } else if (len <= 0xffffff) {
    this._shift(start, len, 1);
    this._buf[seq] = 0x83;
    this._buf[seq + 1] = len >> 16;
    this._buf[seq + 2] = len >> 8;
    this._buf[seq + 3] = len;
  } else {
    throw newInvalidAsn1Error('Sequence too long');
  }
};


Writer.prototype._shift = function (start, len, shift) {
  assert.ok(start !== undefined);
  assert.ok(len !== undefined);
  assert.ok(shift);

  this._buf.copy(this._buf, start + shift, start, start + len);
  this._offset += shift;
};

Writer.prototype._ensure = function (len) {
  assert.ok(len);

  if (this._size - this._offset < len) {
    var sz = this._size * this._options.growthFactor;
    if (sz - this._offset < len)
      sz += len;

    var buf = Buffer.alloc(sz);

    this._buf.copy(buf, 0, 0, this._offset);
    this._buf = buf;
    this._size = sz;
  }
};



// --- Exported API

module.exports = Writer;
Dave Eddy <dave@daveeddy.com>
Fred Kuo <fred.kuo@joyent.com>
Lars-Magnus Skog <ralphtheninja@riseup.net>
Mark Cavage <mcavage@gmail.com>
Patrick Mooney <pmooney@pfmooney.com>
Rob Gulewich <robert.gulewich@joyent.com>
# assert-plus Changelog

## 1.0.0

- *BREAKING* assert.number (and derivatives) now accept Infinity as valid input
- Add assert.finite check.  Previous assert.number callers should use this if
  they expect Infinity inputs to throw.

## 0.2.0

- Fix `assert.object(null)` so it throws
- Fix optional/arrayOf exports for non-type-of asserts
- Add optiona/arrayOf exports for Stream/Date/Regex/uuid
- Add basic unit test coverage
// Copyright (c) 2012, Mark Cavage. All rights reserved.
// Copyright 2015 Joyent, Inc.

var assert = require('assert');
var Stream = require('stream').Stream;
var util = require('util');


///--- Globals

/* JSSTYLED */
var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;


///--- Internal

function _capitalize(str) {
    return (str.charAt(0).toUpperCase() + str.slice(1));
}

function _toss(name, expected, oper, arg, actual) {
    throw new assert.AssertionError({
        message: util.format('%s (%s) is required', name, expected),
        actual: (actual === undefined) ? typeof (arg) : actual(arg),
        expected: expected,
        operator: oper || '===',
        stackStartFunction: _toss.caller
    });
}

function _getClass(arg) {
    return (Object.prototype.toString.call(arg).slice(8, -1));
}

function noop() {
    // Why even bother with asserts?
}


///--- Exports

var types = {
    bool: {
        check: function (arg) { return typeof (arg) === 'boolean'; }
    },
    func: {
        check: function (arg) { return typeof (arg) === 'function'; }
    },
    string: {
        check: function (arg) { return typeof (arg) === 'string'; }
    },
    object: {
        check: function (arg) {
            return typeof (arg) === 'object' && arg !== null;
        }
    },
    number: {
        check: function (arg) {
            return typeof (arg) === 'number' && !isNaN(arg);
        }
    },
    finite: {
        check: function (arg) {
            return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg);
        }
    },
    buffer: {
        check: function (arg) { return Buffer.isBuffer(arg); },
        operator: 'Buffer.isBuffer'
    },
    array: {
        check: function (arg) { return Array.isArray(arg); },
        operator: 'Array.isArray'
    },
    stream: {
        check: function (arg) { return arg instanceof Stream; },
        operator: 'instanceof',
        actual: _getClass
    },
    date: {
        check: function (arg) { return arg instanceof Date; },
        operator: 'instanceof',
        actual: _getClass
    },
    regexp: {
        check: function (arg) { return arg instanceof RegExp; },
        operator: 'instanceof',
        actual: _getClass
    },
    uuid: {
        check: function (arg) {
            return typeof (arg) === 'string' && UUID_REGEXP.test(arg);
        },
        operator: 'isUUID'
    }
};

function _setExports(ndebug) {
    var keys = Object.keys(types);
    var out;

    /* re-export standard assert */
    if (process.env.NODE_NDEBUG) {
        out = noop;
    } else {
        out = function (arg, msg) {
            if (!arg) {
                _toss(msg, 'true', arg);
            }
        };
    }

    /* standard checks */
    keys.forEach(function (k) {
        if (ndebug) {
            out[k] = noop;
            return;
        }
        var type = types[k];
        out[k] = function (arg, msg) {
            if (!type.check(arg)) {
                _toss(msg, k, type.operator, arg, type.actual);
            }
        };
    });

    /* optional checks */
    keys.forEach(function (k) {
        var name = 'optional' + _capitalize(k);
        if (ndebug) {
            out[name] = noop;
            return;
        }
        var type = types[k];
        out[name] = function (arg, msg) {
            if (arg === undefined || arg === null) {
                return;
            }
            if (!type.check(arg)) {
                _toss(msg, k, type.operator, arg, type.actual);
            }
        };
    });

    /* arrayOf checks */
    keys.forEach(function (k) {
        var name = 'arrayOf' + _capitalize(k);
        if (ndebug) {
            out[name] = noop;
            return;
        }
        var type = types[k];
        var expected = '[' + k + ']';
        out[name] = function (arg, msg) {
            if (!Array.isArray(arg)) {
                _toss(msg, expected, type.operator, arg, type.actual);
            }
            var i;
            for (i = 0; i < arg.length; i++) {
                if (!type.check(arg[i])) {
                    _toss(msg, expected, type.operator, arg, type.actual);
                }
            }
        };
    });

    /* optionalArrayOf checks */
    keys.forEach(function (k) {
        var name = 'optionalArrayOf' + _capitalize(k);
        if (ndebug) {
            out[name] = noop;
            return;
        }
        var type = types[k];
        var expected = '[' + k + ']';
        out[name] = function (arg, msg) {
            if (arg === undefined || arg === null) {
                return;
            }
            if (!Array.isArray(arg)) {
                _toss(msg, expected, type.operator, arg, type.actual);
            }
            var i;
            for (i = 0; i < arg.length; i++) {
                if (!type.check(arg[i])) {
                    _toss(msg, expected, type.operator, arg, type.actual);
                }
            }
        };
    });

    /* re-export built-in assertions */
    Object.keys(assert).forEach(function (k) {
        if (k === 'AssertionError') {
            out[k] = assert[k];
            return;
        }
        if (ndebug) {
            out[k] = noop;
            return;
        }
        out[k] = assert[k];
    });

    /* export ourselves (for unit tests _only_) */
    out._setExports = _setExports;

    return out;
}

module.exports = _setExports(process.env.NODE_NDEBUG);
{
  "author": {
    "name": "Mark Cavage",
    "email": "mcavage@gmail.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Extra assertions on top of node's assert module",
  "devDependencies": {
    "faucet": "0.0.1",
    "tape": "4.2.2"
  },
  "engines": {
    "node": ">=0.8"
  },
  "homepage": "https://github.com/mcavage/node-assert-plus#readme",
  "license": "MIT",
  "main": "./assert.js",
  "name": "assert-plus",
  "optionalDependencies": {},
  "repository": {
    "type": "git",
    "url": "git+https://github.com/mcavage/node-assert-plus.git"
  },
  "version": "1.0.0"
}'use strict';

const hooks = [];
const errHooks = [];
let called = false;
let waitingFor = 0;
let asyncTimeoutMs = 10000;

const events = {};
const filters = {};

function exit(exit, code, err) {
	// Helper functions
	let doExitDone = false;

	function doExit() {
		if (doExitDone) {
			return;
		}
		doExitDone = true;

		if (exit === true) {
			// All handlers should be called even if the exit-hook handler was registered first
			process.nextTick(process.exit.bind(null, code));
		}
	}

	// Async hook callback, decrements waiting counter
	function stepTowardExit() {
		process.nextTick(() => {
			if (--waitingFor === 0) {
				doExit();
			}
		});
	}

	// Runs a single hook
	function runHook(syncArgCount, err, hook) {
		// Cannot perform async hooks in `exit` event
		if (exit && hook.length > syncArgCount) {
			// Hook is async, expects a finish callback
			waitingFor++;

			if (err) {
				// Pass error, calling uncaught exception handlers
				return hook(err, stepTowardExit);
			}
			return hook(stepTowardExit);
		}

		// Hook is synchronous
		if (err) {
			// Pass error, calling uncaught exception handlers
			return hook(err);
		}
		return hook();
	}

	// Only execute hooks once
	if (called) {
		return;
	}

	called = true;

	// Run hooks
	if (err) {
		// Uncaught exception, run error hooks
		errHooks.map(runHook.bind(null, 1, err));
	}
	hooks.map(runHook.bind(null, 0, null));

	if (waitingFor) {
		// Force exit after x ms (10000 by default), even if async hooks in progress
		setTimeout(() => {
			doExit();
		}, asyncTimeoutMs);
	} else {
		// No asynchronous hooks, exit immediately
		doExit();
	}
}

// Add a hook
function add(hook) {
	hooks.push(hook);

	if (hooks.length === 1) {
		add.hookEvent('exit');
		add.hookEvent('beforeExit', 0);
		add.hookEvent('SIGHUP', 128 + 1);
		add.hookEvent('SIGINT', 128 + 2);
		add.hookEvent('SIGTERM', 128 + 15);
		add.hookEvent('SIGBREAK', 128 + 21);

		// PM2 Cluster shutdown message. Caught to support async handlers with pm2, needed because
		// explicitly calling process.exit() doesn't trigger the beforeExit event, and the exit
		// event cannot support async handlers, since the event loop is never called after it.
		add.hookEvent('message', 0, function (msg) { // eslint-disable-line prefer-arrow-callback
			if (msg !== 'shutdown') {
				return true;
			}
		});
	}
}

// New signal / event to hook
add.hookEvent = function (event, code, filter) {
	events[event] = function () {
		const eventFilters = filters[event];
		for (let i = 0; i < eventFilters.length; i++) {
			if (eventFilters[i].apply(this, arguments)) {
				return;
			}
		}
		exit(code !== undefined && code !== null, code);
	};

	if (!filters[event]) {
		filters[event] = [];
	}

	if (filter) {
		filters[event].push(filter);
	}
	process.on(event, events[event]);
};

// Unhook signal / event
add.unhookEvent = function (event) {
	process.removeListener(event, events[event]);
	delete events[event];
	delete filters[event];
};

// List hooked events
add.hookedEvents = function () {
	const ret = [];
	for (const name in events) {
		if ({}.hasOwnProperty.call(events, name)) {
			ret.push(name);
		}
	}
	return ret;
};

// Add an uncaught exception handler
add.uncaughtExceptionHandler = function (hook) {
	errHooks.push(hook);

	if (errHooks.length === 1) {
		process.once('uncaughtException', exit.bind(null, true, 1));
	}
};

// Add an unhandled rejection handler
add.unhandledRejectionHandler = function (hook) {
	errHooks.push(hook);

	if (errHooks.length === 1) {
		process.once('unhandledRejection', exit.bind(null, true, 1));
	}
};

// Configure async force exit timeout
add.forceExitTimeout = function (ms) {
	asyncTimeoutMs = ms;
};

// Export
module.exports = add;
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Tapani Moilanen",
    "email": "moilanen.tapani@gmail.com",
    "url": "https://github.com/tapppi"
  },
  "deprecated": false,
  "description": "Run some code when the process exits (supports async hooks and pm2 clustering)",
  "devDependencies": {
    "ava": "^0.21.0",
    "coveralls": "^2.11.14",
    "nyc": "^10.3.2",
    "standard-version": "^4.2.0",
    "xo": "^0.18.2"
  },
  "engines": {
    "node": ">=0.12.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/tapppi/async-exit-hook#readme",
  "license": "MIT",
  "name": "async-exit-hook",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/tapppi/async-exit-hook.git"
  },
  "version": "2.0.1"
}The MIT License (MIT)

Copyright (c) 2016 Alex Indigo

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
/* eslint no-console: "off" */

var asynckit = require('./')
  , async    = require('async')
  , assert   = require('assert')
  , expected = 0
  ;

var Benchmark = require('benchmark');
var suite = new Benchmark.Suite;

var source = [];
for (var z = 1; z < 100; z++)
{
  source.push(z);
  expected += z;
}

suite
// add tests

.add('async.map', function(deferred)
{
  var total = 0;

  async.map(source,
  function(i, cb)
  {
    setImmediate(function()
    {
      total += i;
      cb(null, total);
    });
  },
  function(err, result)
  {
    assert.ifError(err);
    assert.equal(result[result.length - 1], expected);
    deferred.resolve();
  });
}, {'defer': true})


.add('asynckit.parallel', function(deferred)
{
  var total = 0;

  asynckit.parallel(source,
  function(i, cb)
  {
    setImmediate(function()
    {
      total += i;
      cb(null, total);
    });
  },
  function(err, result)
  {
    assert.ifError(err);
    assert.equal(result[result.length - 1], expected);
    deferred.resolve();
  });
}, {'defer': true})


// add listeners
.on('cycle', function(ev)
{
  console.log(String(ev.target));
})
.on('complete', function()
{
  console.log('Fastest is ' + this.filter('fastest').map('name'));
})
// run async
.run({ 'async': true });
module.exports =
{
  parallel      : require('./parallel.js'),
  serial        : require('./serial.js'),
  serialOrdered : require('./serialOrdered.js')
};
{
  "author": {
    "name": "Alex Indigo",
    "email": "iam@alexindigo.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Minimal async jobs utility library, with streams support",
  "devDependencies": {
    "browserify": "^13.0.0",
    "browserify-istanbul": "^2.0.0",
    "coveralls": "^2.11.9",
    "eslint": "^2.9.0",
    "istanbul": "^0.4.3",
    "obake": "^0.1.2",
    "phantomjs-prebuilt": "^2.1.7",
    "pre-commit": "^1.1.3",
    "reamde": "^1.1.0",
    "rimraf": "^2.5.2",
    "size-table": "^0.2.0",
    "tap-spec": "^4.1.1",
    "tape": "^4.5.1"
  },
  "homepage": "https://github.com/alexindigo/asynckit#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "asynckit",
  "pre-commit": [
    "clean",
    "lint",
    "test",
    "browser",
    "report",
    "size"
  ],
  "repository": {
    "type": "git",
    "url": "git+https://github.com/alexindigo/asynckit.git"
  },
  "version": "0.4.0"
}var iterate    = require('./lib/iterate.js')
  , initState  = require('./lib/state.js')
  , terminator = require('./lib/terminator.js')
  ;

// Public API
module.exports = parallel;

/**
 * Runs iterator over provided array elements in parallel
 *
 * @param   {array|object} list - array or object (named list) to iterate over
 * @param   {function} iterator - iterator to run
 * @param   {function} callback - invoked when all elements processed
 * @returns {function} - jobs terminator
 */
function parallel(list, iterator, callback)
{
  var state = initState(list);

  while (state.index < (state['keyedList'] || list).length)
  {
    iterate(list, iterator, state, function(error, result)
    {
      if (error)
      {
        callback(error, result);
        return;
      }

      // looks like it's the last one
      if (Object.keys(state.jobs).length === 0)
      {
        callback(null, state.results);
        return;
      }
    });

    state.index++;
  }

  return terminator.bind(state, callback);
}
var serialOrdered = require('./serialOrdered.js');

// Public API
module.exports = serial;

/**
 * Runs iterator over provided array elements in series
 *
 * @param   {array|object} list - array or object (named list) to iterate over
 * @param   {function} iterator - iterator to run
 * @param   {function} callback - invoked when all elements processed
 * @returns {function} - jobs terminator
 */
function serial(list, iterator, callback)
{
  return serialOrdered(list, iterator, null, callback);
}
var iterate    = require('./lib/iterate.js')
  , initState  = require('./lib/state.js')
  , terminator = require('./lib/terminator.js')
  ;

// Public API
module.exports = serialOrdered;
// sorting helpers
module.exports.ascending  = ascending;
module.exports.descending = descending;

/**
 * Runs iterator over provided sorted array elements in series
 *
 * @param   {array|object} list - array or object (named list) to iterate over
 * @param   {function} iterator - iterator to run
 * @param   {function} sortMethod - custom sort function
 * @param   {function} callback - invoked when all elements processed
 * @returns {function} - jobs terminator
 */
function serialOrdered(list, iterator, sortMethod, callback)
{
  var state = initState(list, sortMethod);

  iterate(list, iterator, state, function iteratorHandler(error, result)
  {
    if (error)
    {
      callback(error, result);
      return;
    }

    state.index++;

    // are we there yet?
    if (state.index < (state['keyedList'] || list).length)
    {
      iterate(list, iterator, state, iteratorHandler);
      return;
    }

    // done here
    callback(null, state.results);
  });

  return terminator.bind(state, callback);
}

/*
 * -- Sort methods
 */

/**
 * sort helper to sort array elements in ascending order
 *
 * @param   {mixed} a - an item to compare
 * @param   {mixed} b - an item to compare
 * @returns {number} - comparison result
 */
function ascending(a, b)
{
  return a < b ? -1 : a > b ? 1 : 0;
}

/**
 * sort helper to sort array elements in descending order
 *
 * @param   {mixed} a - an item to compare
 * @param   {mixed} b - an item to compare
 * @returns {number} - comparison result
 */
function descending(a, b)
{
  return -1 * ascending(a, b);
}
var inherits              = require('util').inherits
  , Readable              = require('stream').Readable
  , ReadableAsyncKit      = require('./lib/readable_asynckit.js')
  , ReadableParallel      = require('./lib/readable_parallel.js')
  , ReadableSerial        = require('./lib/readable_serial.js')
  , ReadableSerialOrdered = require('./lib/readable_serial_ordered.js')
  ;

// API
module.exports =
{
  parallel      : ReadableParallel,
  serial        : ReadableSerial,
  serialOrdered : ReadableSerialOrdered, 
};

inherits(ReadableAsyncKit, Readable);

inherits(ReadableParallel, ReadableAsyncKit);
inherits(ReadableSerial, ReadableAsyncKit);
inherits(ReadableSerialOrdered, ReadableAsyncKit);
// API
module.exports = abort;

/**
 * Aborts leftover active jobs
 *
 * @param {object} state - current state object
 */
function abort(state)
{
  Object.keys(state.jobs).forEach(clean.bind(state));

  // reset leftover jobs
  state.jobs = {};
}

/**
 * Cleans up leftover job by invoking abort function for the provided job id
 *
 * @this  state
 * @param {string|number} key - job id to abort
 */
function clean(key)
{
  if (typeof this.jobs[key] == 'function')
  {
    this.jobs[key]();
  }
}
var defer = require('./defer.js');

// API
module.exports = async;

/**
 * Runs provided callback asynchronously
 * even if callback itself is not
 *
 * @param   {function} callback - callback to invoke
 * @returns {function} - augmented callback
 */
function async(callback)
{
  var isAsync = false;

  // check if async happened
  defer(function() { isAsync = true; });

  return function async_callback(err, result)
  {
    if (isAsync)
    {
      callback(err, result);
    }
    else
    {
      defer(function nextTick_callback()
      {
        callback(err, result);
      });
    }
  };
}
module.exports = defer;

/**
 * Runs provided function on next iteration of the event loop
 *
 * @param {function} fn - function to run
 */
function defer(fn)
{
  var nextTick = typeof setImmediate == 'function'
    ? setImmediate
    : (
      typeof process == 'object' && typeof process.nextTick == 'function'
      ? process.nextTick
      : null
    );

  if (nextTick)
  {
    nextTick(fn);
  }
  else
  {
    setTimeout(fn, 0);
  }
}
var async = require('./async.js')
  , abort = require('./abort.js')
  ;

// API
module.exports = iterate;

/**
 * Iterates over each job object
 *
 * @param {array|object} list - array or object (named list) to iterate over
 * @param {function} iterator - iterator to run
 * @param {object} state - current job status
 * @param {function} callback - invoked when all elements processed
 */
function iterate(list, iterator, state, callback)
{
  // store current index
  var key = state['keyedList'] ? state['keyedList'][state.index] : state.index;

  state.jobs[key] = runJob(iterator, key, list[key], function(error, output)
  {
    // don't repeat yourself
    // skip secondary callbacks
    if (!(key in state.jobs))
    {
      return;
    }

    // clean up jobs
    delete state.jobs[key];

    if (error)
    {
      // don't process rest of the results
      // stop still active jobs
      // and reset the list
      abort(state);
    }
    else
    {
      state.results[key] = output;
    }

    // return salvaged results
    callback(error, state.results);
  });
}

/**
 * Runs iterator over provided job element
 *
 * @param   {function} iterator - iterator to invoke
 * @param   {string|number} key - key/index of the element in the list of jobs
 * @param   {mixed} item - job description
 * @param   {function} callback - invoked after iterator is done with the job
 * @returns {function|mixed} - job abort function or something else
 */
function runJob(iterator, key, item, callback)
{
  var aborter;

  // allow shortcut if iterator expects only two arguments
  if (iterator.length == 2)
  {
    aborter = iterator(item, async(callback));
  }
  // otherwise go with full three arguments
  else
  {
    aborter = iterator(item, key, async(callback));
  }

  return aborter;
}
var streamify = require('./streamify.js')
  , defer     = require('./defer.js')
  ;

// API
module.exports = ReadableAsyncKit;

/**
 * Base constructor for all streams
 * used to hold properties/methods
 */
function ReadableAsyncKit()
{
  ReadableAsyncKit.super_.apply(this, arguments);

  // list of active jobs
  this.jobs = {};

  // add stream methods
  this.destroy = destroy;
  this._start  = _start;
  this._read   = _read;
}

/**
 * Destroys readable stream,
 * by aborting outstanding jobs
 *
 * @returns {void}
 */
function destroy()
{
  if (this.destroyed)
  {
    return;
  }

  this.destroyed = true;

  if (typeof this.terminator == 'function')
  {
    this.terminator();
  }
}

/**
 * Starts provided jobs in async manner
 *
 * @private
 */
function _start()
{
  // first argument â€“ runner function
  var runner = arguments[0]
    // take away first argument
    , args   = Array.prototype.slice.call(arguments, 1)
      // second argument - input data
    , input  = args[0]
      // last argument - result callback
    , endCb  = streamify.callback.call(this, args[args.length - 1])
    ;

  args[args.length - 1] = endCb;
  // third argument - iterator
  args[1] = streamify.iterator.call(this, args[1]);

  // allow time for proper setup
  defer(function()
  {
    if (!this.destroyed)
    {
      this.terminator = runner.apply(null, args);
    }
    else
    {
      endCb(null, Array.isArray(input) ? [] : {});
    }
  }.bind(this));
}


/**
 * Implement _read to comply with Readable streams
 * Doesn't really make sense for flowing object mode
 *
 * @private
 */
function _read()
{

}
var parallel = require('../parallel.js');

// API
module.exports = ReadableParallel;

/**
 * Streaming wrapper to `asynckit.parallel`
 *
 * @param   {array|object} list - array or object (named list) to iterate over
 * @param   {function} iterator - iterator to run
 * @param   {function} callback - invoked when all elements processed
 * @returns {stream.Readable#}
 */
function ReadableParallel(list, iterator, callback)
{
  if (!(this instanceof ReadableParallel))
  {
    return new ReadableParallel(list, iterator, callback);
  }

  // turn on object mode
  ReadableParallel.super_.call(this, {objectMode: true});

  this._start(parallel, list, iterator, callback);
}
var serial = require('../serial.js');

// API
module.exports = ReadableSerial;

/**
 * Streaming wrapper to `asynckit.serial`
 *
 * @param   {array|object} list - array or object (named list) to iterate over
 * @param   {function} iterator - iterator to run
 * @param   {function} callback - invoked when all elements processed
 * @returns {stream.Readable#}
 */
function ReadableSerial(list, iterator, callback)
{
  if (!(this instanceof ReadableSerial))
  {
    return new ReadableSerial(list, iterator, callback);
  }

  // turn on object mode
  ReadableSerial.super_.call(this, {objectMode: true});

  this._start(serial, list, iterator, callback);
}
var serialOrdered = require('../serialOrdered.js');

// API
module.exports = ReadableSerialOrdered;
// expose sort helpers
module.exports.ascending  = serialOrdered.ascending;
module.exports.descending = serialOrdered.descending;

/**
 * Streaming wrapper to `asynckit.serialOrdered`
 *
 * @param   {array|object} list - array or object (named list) to iterate over
 * @param   {function} iterator - iterator to run
 * @param   {function} sortMethod - custom sort function
 * @param   {function} callback - invoked when all elements processed
 * @returns {stream.Readable#}
 */
function ReadableSerialOrdered(list, iterator, sortMethod, callback)
{
  if (!(this instanceof ReadableSerialOrdered))
  {
    return new ReadableSerialOrdered(list, iterator, sortMethod, callback);
  }

  // turn on object mode
  ReadableSerialOrdered.super_.call(this, {objectMode: true});

  this._start(serialOrdered, list, iterator, sortMethod, callback);
}
// API
module.exports = state;

/**
 * Creates initial state object
 * for iteration over list
 *
 * @param   {array|object} list - list to iterate over
 * @param   {function|null} sortMethod - function to use for keys sort,
 *                                     or `null` to keep them as is
 * @returns {object} - initial state object
 */
function state(list, sortMethod)
{
  var isNamedList = !Array.isArray(list)
    , initState =
    {
      index    : 0,
      keyedList: isNamedList || sortMethod ? Object.keys(list) : null,
      jobs     : {},
      results  : isNamedList ? {} : [],
      size     : isNamedList ? Object.keys(list).length : list.length
    }
    ;

  if (sortMethod)
  {
    // sort array keys based on it's values
    // sort object's keys just on own merit
    initState.keyedList.sort(isNamedList ? sortMethod : function(a, b)
    {
      return sortMethod(list[a], list[b]);
    });
  }

  return initState;
}
var async = require('./async.js');

// API
module.exports = {
  iterator: wrapIterator,
  callback: wrapCallback
};

/**
 * Wraps iterators with long signature
 *
 * @this    ReadableAsyncKit#
 * @param   {function} iterator - function to wrap
 * @returns {function} - wrapped function
 */
function wrapIterator(iterator)
{
  var stream = this;

  return function(item, key, cb)
  {
    var aborter
      , wrappedCb = async(wrapIteratorCallback.call(stream, cb, key))
      ;

    stream.jobs[key] = wrappedCb;

    // it's either shortcut (item, cb)
    if (iterator.length == 2)
    {
      aborter = iterator(item, wrappedCb);
    }
    // or long format (item, key, cb)
    else
    {
      aborter = iterator(item, key, wrappedCb);
    }

    return aborter;
  };
}

/**
 * Wraps provided callback function
 * allowing to execute snitch function before
 * real callback
 *
 * @this    ReadableAsyncKit#
 * @param   {function} callback - function to wrap
 * @returns {function} - wrapped function
 */
function wrapCallback(callback)
{
  var stream = this;

  var wrapped = function(error, result)
  {
    return finisher.call(stream, error, result, callback);
  };

  return wrapped;
}

/**
 * Wraps provided iterator callback function
 * makes sure snitch only called once,
 * but passes secondary calls to the original callback
 *
 * @this    ReadableAsyncKit#
 * @param   {function} callback - callback to wrap
 * @param   {number|string} key - iteration key
 * @returns {function} wrapped callback
 */
function wrapIteratorCallback(callback, key)
{
  var stream = this;

  return function(error, output)
  {
    // don't repeat yourself
    if (!(key in stream.jobs))
    {
      callback(error, output);
      return;
    }

    // clean up jobs
    delete stream.jobs[key];

    return streamer.call(stream, error, {key: key, value: output}, callback);
  };
}

/**
 * Stream wrapper for iterator callback
 *
 * @this  ReadableAsyncKit#
 * @param {mixed} error - error response
 * @param {mixed} output - iterator output
 * @param {function} callback - callback that expects iterator results
 */
function streamer(error, output, callback)
{
  if (error && !this.error)
  {
    this.error = error;
    this.pause();
    this.emit('error', error);
    // send back value only, as expected
    callback(error, output && output.value);
    return;
  }

  // stream stuff
  this.push(output);

  // back to original track
  // send back value only, as expected
  callback(error, output && output.value);
}

/**
 * Stream wrapper for finishing callback
 *
 * @this  ReadableAsyncKit#
 * @param {mixed} error - error response
 * @param {mixed} output - iterator output
 * @param {function} callback - callback that expects final results
 */
function finisher(error, output, callback)
{
  // signal end of the stream
  // only for successfully finished streams
  if (!error)
  {
    this.push(null);
  }

  // back to original track
  callback(error, output);
}
var abort = require('./abort.js')
  , async = require('./async.js')
  ;

// API
module.exports = terminator;

/**
 * Terminates jobs in the attached state context
 *
 * @this  AsyncKitState#
 * @param {function} callback - final callback to invoke after termination
 */
function terminator(callback)
{
  if (!Object.keys(this.jobs).length)
  {
    return;
  }

  // fast forward iteration index
  this.index = this.size;

  // abort jobs
  abort(this);

  // send back results we have so far
  async(callback)(null, this.results);
}
Apache License

Version 2.0, January 2004

http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

You must give any other recipients of the Work or Derivative Works a copy of this License; and

You must cause any modified files to carry prominent notices stating that You changed the files; and

You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS
/*!
 *  Copyright 2010 LearnBoost <dev@learnboost.com>
 *
 * 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.
 */

/**
 * Module dependencies.
 */

var crypto = require('crypto')
  , parse = require('url').parse
  ;

/**
 * Valid keys.
 */

var keys = 
  [ 'acl'
  , 'location'
  , 'logging'
  , 'notification'
  , 'partNumber'
  , 'policy'
  , 'requestPayment'
  , 'torrent'
  , 'uploadId'
  , 'uploads'
  , 'versionId'
  , 'versioning'
  , 'versions'
  , 'website'
  ]

/**
 * Return an "Authorization" header value with the given `options`
 * in the form of "AWS <key>:<signature>"
 *
 * @param {Object} options
 * @return {String}
 * @api private
 */

function authorization (options) {
  return 'AWS ' + options.key + ':' + sign(options)
}

module.exports = authorization
module.exports.authorization = authorization

/**
 * Simple HMAC-SHA1 Wrapper
 *
 * @param {Object} options
 * @return {String}
 * @api private
 */ 

function hmacSha1 (options) {
  return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64')
}

module.exports.hmacSha1 = hmacSha1

/**
 * Create a base64 sha1 HMAC for `options`. 
 * 
 * @param {Object} options
 * @return {String}
 * @api private
 */

function sign (options) {
  options.message = stringToSign(options)
  return hmacSha1(options)
}
module.exports.sign = sign

/**
 * Create a base64 sha1 HMAC for `options`. 
 *
 * Specifically to be used with S3 presigned URLs
 * 
 * @param {Object} options
 * @return {String}
 * @api private
 */

function signQuery (options) {
  options.message = queryStringToSign(options)
  return hmacSha1(options)
}
module.exports.signQuery= signQuery

/**
 * Return a string for sign() with the given `options`.
 *
 * Spec:
 * 
 *    <verb>\n
 *    <md5>\n
 *    <content-type>\n
 *    <date>\n
 *    [headers\n]
 *    <resource>
 *
 * @param {Object} options
 * @return {String}
 * @api private
 */

function stringToSign (options) {
  var headers = options.amazonHeaders || ''
  if (headers) headers += '\n'
  var r = 
    [ options.verb
    , options.md5
    , options.contentType
    , options.date ? options.date.toUTCString() : ''
    , headers + options.resource
    ]
  return r.join('\n')
}
module.exports.stringToSign = stringToSign

/**
 * Return a string for sign() with the given `options`, but is meant exclusively
 * for S3 presigned URLs
 *
 * Spec:
 * 
 *    <date>\n
 *    <resource>
 *
 * @param {Object} options
 * @return {String}
 * @api private
 */

function queryStringToSign (options){
  return 'GET\n\n\n' + options.date + '\n' + options.resource
}
module.exports.queryStringToSign = queryStringToSign

/**
 * Perform the following:
 *
 *  - ignore non-amazon headers
 *  - lowercase fields
 *  - sort lexicographically
 *  - trim whitespace between ":"
 *  - join with newline
 *
 * @param {Object} headers
 * @return {String}
 * @api private
 */

function canonicalizeHeaders (headers) {
  var buf = []
    , fields = Object.keys(headers)
    ;
  for (var i = 0, len = fields.length; i < len; ++i) {
    var field = fields[i]
      , val = headers[field]
      , field = field.toLowerCase()
      ;
    if (0 !== field.indexOf('x-amz')) continue
    buf.push(field + ':' + val)
  }
  return buf.sort().join('\n')
}
module.exports.canonicalizeHeaders = canonicalizeHeaders

/**
 * Perform the following:
 *
 *  - ignore non sub-resources
 *  - sort lexicographically
 *
 * @param {String} resource
 * @return {String}
 * @api private
 */

function canonicalizeResource (resource) {
  var url = parse(resource, true)
    , path = url.pathname
    , buf = []
    ;

  Object.keys(url.query).forEach(function(key){
    if (!~keys.indexOf(key)) return
    var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key])
    buf.push(key + val)
  })

  return path + (buf.length ? '?' + buf.sort().join('&') : '')
}
module.exports.canonicalizeResource = canonicalizeResource
{
  "author": {
    "name": "Mikeal Rogers",
    "email": "mikeal.rogers@gmail.com",
    "url": "http://www.futurealoof.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module.",
  "devDependencies": {},
  "engines": {
    "node": "*"
  },
  "homepage": "https://github.com/mikeal/aws-sign#readme",
  "license": "Apache-2.0",
  "main": "index.js",
  "name": "aws-sign2",
  "optionalDependencies": {},
  "repository": {
    "url": "git+https://github.com/mikeal/aws-sign.git"
  },
  "version": "0.7.0"
}Copyright 2013 Michael Hart (michael.hart.au@gmail.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var aws4 = exports,
    url = require('url'),
    querystring = require('querystring'),
    crypto = require('crypto'),
    lru = require('./lru'),
    credentialsCache = lru(1000)

// http://docs.amazonwebservices.com/general/latest/gr/signature-version-4.html

function hmac(key, string, encoding) {
  return crypto.createHmac('sha256', key).update(string, 'utf8').digest(encoding)
}

function hash(string, encoding) {
  return crypto.createHash('sha256').update(string, 'utf8').digest(encoding)
}

// This function assumes the string has already been percent encoded
function encodeRfc3986(urlEncodedString) {
  return urlEncodedString.replace(/[!'()*]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16).toUpperCase()
  })
}

function encodeRfc3986Full(str) {
  return encodeRfc3986(encodeURIComponent(str))
}

// request: { path | body, [host], [method], [headers], [service], [region] }
// credentials: { accessKeyId, secretAccessKey, [sessionToken] }
function RequestSigner(request, credentials) {

  if (typeof request === 'string') request = url.parse(request)

  var headers = request.headers = (request.headers || {}),
      hostParts = (!this.service || !this.region) && this.matchHost(request.hostname || request.host || headers.Host || headers.host)

  this.request = request
  this.credentials = credentials || this.defaultCredentials()

  this.service = request.service || hostParts[0] || ''
  this.region = request.region || hostParts[1] || 'us-east-1'

  // SES uses a different domain from the service name
  if (this.service === 'email') this.service = 'ses'

  if (!request.method && request.body)
    request.method = 'POST'

  if (!headers.Host && !headers.host) {
    headers.Host = request.hostname || request.host || this.createHost()

    // If a port is specified explicitly, use it as is
    if (request.port)
      headers.Host += ':' + request.port
  }
  if (!request.hostname && !request.host)
    request.hostname = headers.Host || headers.host

  this.isCodeCommitGit = this.service === 'codecommit' && request.method === 'GIT'
}

RequestSigner.prototype.matchHost = function(host) {
  var match = (host || '').match(/([^\.]+)\.(?:([^\.]*)\.)?amazonaws\.com(\.cn)?$/)
  var hostParts = (match || []).slice(1, 3)

  // ES's hostParts are sometimes the other way round, if the value that is expected
  // to be region equals â€˜esâ€™ switch them back
  // e.g. search-cluster-name-aaaa00aaaa0aaa0aaaaaaa0aaa.us-east-1.es.amazonaws.com
  if (hostParts[1] === 'es')
    hostParts = hostParts.reverse()

  if (hostParts[1] == 's3') {
    hostParts[0] = 's3'
    hostParts[1] = 'us-east-1'
  } else {
    for (var i = 0; i < 2; i++) {
      if (/^s3-/.test(hostParts[i])) {
        hostParts[1] = hostParts[i].slice(3)
        hostParts[0] = 's3'
        break
      }
    }
  }

  return hostParts
}

// http://docs.aws.amazon.com/general/latest/gr/rande.html
RequestSigner.prototype.isSingleRegion = function() {
  // Special case for S3 and SimpleDB in us-east-1
  if (['s3', 'sdb'].indexOf(this.service) >= 0 && this.region === 'us-east-1') return true

  return ['cloudfront', 'ls', 'route53', 'iam', 'importexport', 'sts']
    .indexOf(this.service) >= 0
}

RequestSigner.prototype.createHost = function() {
  var region = this.isSingleRegion() ? '' : '.' + this.region,
      subdomain = this.service === 'ses' ? 'email' : this.service
  return subdomain + region + '.amazonaws.com'
}

RequestSigner.prototype.prepareRequest = function() {
  this.parsePath()

  var request = this.request, headers = request.headers, query

  if (request.signQuery) {

    this.parsedPath.query = query = this.parsedPath.query || {}

    if (this.credentials.sessionToken)
      query['X-Amz-Security-Token'] = this.credentials.sessionToken

    if (this.service === 's3' && !query['X-Amz-Expires'])
      query['X-Amz-Expires'] = 86400

    if (query['X-Amz-Date'])
      this.datetime = query['X-Amz-Date']
    else
      query['X-Amz-Date'] = this.getDateTime()

    query['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256'
    query['X-Amz-Credential'] = this.credentials.accessKeyId + '/' + this.credentialString()
    query['X-Amz-SignedHeaders'] = this.signedHeaders()

  } else {

    if (!request.doNotModifyHeaders && !this.isCodeCommitGit) {
      if (request.body && !headers['Content-Type'] && !headers['content-type'])
        headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'

      if (request.body && !headers['Content-Length'] && !headers['content-length'])
        headers['Content-Length'] = Buffer.byteLength(request.body)

      if (this.credentials.sessionToken && !headers['X-Amz-Security-Token'] && !headers['x-amz-security-token'])
        headers['X-Amz-Security-Token'] = this.credentials.sessionToken

      if (this.service === 's3' && !headers['X-Amz-Content-Sha256'] && !headers['x-amz-content-sha256'])
        headers['X-Amz-Content-Sha256'] = hash(this.request.body || '', 'hex')

      if (headers['X-Amz-Date'] || headers['x-amz-date'])
        this.datetime = headers['X-Amz-Date'] || headers['x-amz-date']
      else
        headers['X-Amz-Date'] = this.getDateTime()
    }

    delete headers.Authorization
    delete headers.authorization
  }
}

RequestSigner.prototype.sign = function() {
  if (!this.parsedPath) this.prepareRequest()

  if (this.request.signQuery) {
    this.parsedPath.query['X-Amz-Signature'] = this.signature()
  } else {
    this.request.headers.Authorization = this.authHeader()
  }

  this.request.path = this.formatPath()

  return this.request
}

RequestSigner.prototype.getDateTime = function() {
  if (!this.datetime) {
    var headers = this.request.headers,
      date = new Date(headers.Date || headers.date || new Date)

    this.datetime = date.toISOString().replace(/[:\-]|\.\d{3}/g, '')

    // Remove the trailing 'Z' on the timestamp string for CodeCommit git access
    if (this.isCodeCommitGit) this.datetime = this.datetime.slice(0, -1)
  }
  return this.datetime
}

RequestSigner.prototype.getDate = function() {
  return this.getDateTime().substr(0, 8)
}

RequestSigner.prototype.authHeader = function() {
  return [
    'AWS4-HMAC-SHA256 Credential=' + this.credentials.accessKeyId + '/' + this.credentialString(),
    'SignedHeaders=' + this.signedHeaders(),
    'Signature=' + this.signature(),
  ].join(', ')
}

RequestSigner.prototype.signature = function() {
  var date = this.getDate(),
      cacheKey = [this.credentials.secretAccessKey, date, this.region, this.service].join(),
      kDate, kRegion, kService, kCredentials = credentialsCache.get(cacheKey)
  if (!kCredentials) {
    kDate = hmac('AWS4' + this.credentials.secretAccessKey, date)
    kRegion = hmac(kDate, this.region)
    kService = hmac(kRegion, this.service)
    kCredentials = hmac(kService, 'aws4_request')
    credentialsCache.set(cacheKey, kCredentials)
  }
  return hmac(kCredentials, this.stringToSign(), 'hex')
}

RequestSigner.prototype.stringToSign = function() {
  return [
    'AWS4-HMAC-SHA256',
    this.getDateTime(),
    this.credentialString(),
    hash(this.canonicalString(), 'hex'),
  ].join('\n')
}

RequestSigner.prototype.canonicalString = function() {
  if (!this.parsedPath) this.prepareRequest()

  var pathStr = this.parsedPath.path,
      query = this.parsedPath.query,
      headers = this.request.headers,
      queryStr = '',
      normalizePath = this.service !== 's3',
      decodePath = this.service === 's3' || this.request.doNotEncodePath,
      decodeSlashesInPath = this.service === 's3',
      firstValOnly = this.service === 's3',
      bodyHash

  if (this.service === 's3' && this.request.signQuery) {
    bodyHash = 'UNSIGNED-PAYLOAD'
  } else if (this.isCodeCommitGit) {
    bodyHash = ''
  } else {
    bodyHash = headers['X-Amz-Content-Sha256'] || headers['x-amz-content-sha256'] ||
      hash(this.request.body || '', 'hex')
  }

  if (query) {
    var reducedQuery = Object.keys(query).reduce(function(obj, key) {
      if (!key) return obj
      obj[encodeRfc3986Full(key)] = !Array.isArray(query[key]) ? query[key] :
        (firstValOnly ? query[key][0] : query[key])
      return obj
    }, {})
    var encodedQueryPieces = []
    Object.keys(reducedQuery).sort().forEach(function(key) {
      if (!Array.isArray(reducedQuery[key])) {
        encodedQueryPieces.push(key + '=' + encodeRfc3986Full(reducedQuery[key]))
      } else {
        reducedQuery[key].map(encodeRfc3986Full).sort()
          .forEach(function(val) { encodedQueryPieces.push(key + '=' + val) })
      }
    })
    queryStr = encodedQueryPieces.join('&')
  }
  if (pathStr !== '/') {
    if (normalizePath) pathStr = pathStr.replace(/\/{2,}/g, '/')
    pathStr = pathStr.split('/').reduce(function(path, piece) {
      if (normalizePath && piece === '..') {
        path.pop()
      } else if (!normalizePath || piece !== '.') {
        if (decodePath) piece = decodeURIComponent(piece.replace(/\+/g, ' '))
        path.push(encodeRfc3986Full(piece))
      }
      return path
    }, []).join('/')
    if (pathStr[0] !== '/') pathStr = '/' + pathStr
    if (decodeSlashesInPath) pathStr = pathStr.replace(/%2F/g, '/')
  }

  return [
    this.request.method || 'GET',
    pathStr,
    queryStr,
    this.canonicalHeaders() + '\n',
    this.signedHeaders(),
    bodyHash,
  ].join('\n')
}

RequestSigner.prototype.canonicalHeaders = function() {
  var headers = this.request.headers
  function trimAll(header) {
    return header.toString().trim().replace(/\s+/g, ' ')
  }
  return Object.keys(headers)
    .sort(function(a, b) { return a.toLowerCase() < b.toLowerCase() ? -1 : 1 })
    .map(function(key) { return key.toLowerCase() + ':' + trimAll(headers[key]) })
    .join('\n')
}

RequestSigner.prototype.signedHeaders = function() {
  return Object.keys(this.request.headers)
    .map(function(key) { return key.toLowerCase() })
    .sort()
    .join(';')
}

RequestSigner.prototype.credentialString = function() {
  return [
    this.getDate(),
    this.region,
    this.service,
    'aws4_request',
  ].join('/')
}

RequestSigner.prototype.defaultCredentials = function() {
  var env = process.env
  return {
    accessKeyId: env.AWS_ACCESS_KEY_ID || env.AWS_ACCESS_KEY,
    secretAccessKey: env.AWS_SECRET_ACCESS_KEY || env.AWS_SECRET_KEY,
    sessionToken: env.AWS_SESSION_TOKEN,
  }
}

RequestSigner.prototype.parsePath = function() {
  var path = this.request.path || '/'

  // S3 doesn't always encode characters > 127 correctly and
  // all services don't encode characters > 255 correctly
  // So if there are non-reserved chars (and it's not already all % encoded), just encode them all
  if (/[^0-9A-Za-z;,/?:@&=+$\-_.!~*'()#%]/.test(path)) {
    path = encodeURI(decodeURI(path))
  }

  var queryIx = path.indexOf('?'),
      query = null

  if (queryIx >= 0) {
    query = querystring.parse(path.slice(queryIx + 1))
    path = path.slice(0, queryIx)
  }

  this.parsedPath = {
    path: path,
    query: query,
  }
}

RequestSigner.prototype.formatPath = function() {
  var path = this.parsedPath.path,
      query = this.parsedPath.query

  if (!query) return path

  // Services don't support empty query string keys
  if (query[''] != null) delete query['']

  return path + '?' + encodeRfc3986(querystring.stringify(query))
}

aws4.RequestSigner = RequestSigner

aws4.sign = function(request, credentials) {
  return new RequestSigner(request, credentials).sign()
}
module.exports = function(size) {
  return new LruCache(size)
}

function LruCache(size) {
  this.capacity = size | 0
  this.map = Object.create(null)
  this.list = new DoublyLinkedList()
}

LruCache.prototype.get = function(key) {
  var node = this.map[key]
  if (node == null) return undefined
  this.used(node)
  return node.val
}

LruCache.prototype.set = function(key, val) {
  var node = this.map[key]
  if (node != null) {
    node.val = val
  } else {
    if (!this.capacity) this.prune()
    if (!this.capacity) return false
    node = new DoublyLinkedNode(key, val)
    this.map[key] = node
    this.capacity--
  }
  this.used(node)
  return true
}

LruCache.prototype.used = function(node) {
  this.list.moveToFront(node)
}

LruCache.prototype.prune = function() {
  var node = this.list.pop()
  if (node != null) {
    delete this.map[node.key]
    this.capacity++
  }
}


function DoublyLinkedList() {
  this.firstNode = null
  this.lastNode = null
}

DoublyLinkedList.prototype.moveToFront = function(node) {
  if (this.firstNode == node) return

  this.remove(node)

  if (this.firstNode == null) {
    this.firstNode = node
    this.lastNode = node
    node.prev = null
    node.next = null
  } else {
    node.prev = null
    node.next = this.firstNode
    node.next.prev = node
    this.firstNode = node
  }
}

DoublyLinkedList.prototype.pop = function() {
  var lastNode = this.lastNode
  if (lastNode != null) {
    this.remove(lastNode)
  }
  return lastNode
}

DoublyLinkedList.prototype.remove = function(node) {
  if (this.firstNode == node) {
    this.firstNode = node.next
  } else if (node.prev != null) {
    node.prev.next = node.next
  }
  if (this.lastNode == node) {
    this.lastNode = node.prev
  } else if (node.next != null) {
    node.next.prev = node.prev
  }
}


function DoublyLinkedNode(key, val) {
  this.key = key
  this.val = val
  this.prev = null
  this.next = null
}
{
  "author": {
    "name": "Michael Hart",
    "email": "michael.hart.au@gmail.com",
    "url": "https://github.com/mhart"
  },
  "deprecated": false,
  "description": "Signs and prepares requests using AWS Signature Version 4",
  "devDependencies": {
    "mocha": "^2.5.3",
    "should": "^8.4.0"
  },
  "homepage": "https://github.com/mhart/aws4#readme",
  "license": "MIT",
  "main": "aws4.js",
  "name": "aws4",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/mhart/aws4.git"
  },
  "version": "1.10.1"
}# These are supported funding model platforms

github: mhart
(MIT)

Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';
module.exports = balanced;
function balanced(a, b, str) {
  if (a instanceof RegExp) a = maybeMatch(a, str);
  if (b instanceof RegExp) b = maybeMatch(b, str);

  var r = range(a, b, str);

  return r && {
    start: r[0],
    end: r[1],
    pre: str.slice(0, r[0]),
    body: str.slice(r[0] + a.length, r[1]),
    post: str.slice(r[1] + b.length)
  };
}

function maybeMatch(reg, str) {
  var m = str.match(reg);
  return m ? m[0] : null;
}

balanced.range = range;
function range(a, b, str) {
  var begs, beg, left, right, result;
  var ai = str.indexOf(a);
  var bi = str.indexOf(b, ai + 1);
  var i = ai;

  if (ai >= 0 && bi > 0) {
    begs = [];
    left = str.length;

    while (i >= 0 && !result) {
      if (i == ai) {
        begs.push(i);
        ai = str.indexOf(a, i + 1);
      } else if (begs.length == 1) {
        result = [ begs.pop(), bi ];
      } else {
        beg = begs.pop();
        if (beg < left) {
          left = beg;
          right = bi;
        }

        bi = str.indexOf(b, i + 1);
      }

      i = ai < bi && ai >= 0 ? ai : bi;
    }

    if (begs.length) {
      result = [ left, right ];
    }
  }

  return result;
}
{
  "author": {
    "name": "Julian Gruber",
    "email": "mail@juliangruber.com",
    "url": "http://juliangruber.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Match balanced character pairs, like \"{\" and \"}\"",
  "devDependencies": {
    "matcha": "^0.7.0",
    "tape": "^4.6.0"
  },
  "homepage": "https://github.com/juliangruber/balanced-match",
  "license": "MIT",
  "main": "index.js",
  "name": "balanced-match",
  "repository": {
    "type": "git",
    "url": "git://github.com/juliangruber/balanced-match.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/8..latest",
      "firefox/20..latest",
      "firefox/nightly",
      "chrome/25..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  },
  "version": "1.0.0"
}The MIT License (MIT)

Copyright (c) 2014 Jameson Little

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
(function(r){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=r()}else if(typeof define==="function"&&define.amd){define([],r)}else{var e;if(typeof window!=="undefined"){e=window}else if(typeof global!=="undefined"){e=global}else if(typeof self!=="undefined"){e=self}else{e=this}e.base64js=r()}})(function(){var r,e,n;return function(){function d(a,f,i){function u(n,r){if(!f[n]){if(!a[n]){var e="function"==typeof require&&require;if(!r&&e)return e(n,!0);if(v)return v(n,!0);var t=new Error("Cannot find module '"+n+"'");throw t.code="MODULE_NOT_FOUND",t}var o=f[n]={exports:{}};a[n][0].call(o.exports,function(r){var e=a[n][1][r];return u(e||r)},o,o.exports,d,a,f,i)}return f[n].exports}for(var v="function"==typeof require&&require,r=0;r<i.length;r++)u(i[r]);return u}return d}()({"/":[function(r,e,n){"use strict";n.byteLength=f;n.toByteArray=i;n.fromByteArray=p;var u=[];var v=[];var d=typeof Uint8Array!=="undefined"?Uint8Array:Array;var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(var o=0,a=t.length;o<a;++o){u[o]=t[o];v[t.charCodeAt(o)]=o}v["-".charCodeAt(0)]=62;v["_".charCodeAt(0)]=63;function c(r){var e=r.length;if(e%4>0){throw new Error("Invalid string. Length must be a multiple of 4")}var n=r.indexOf("=");if(n===-1)n=e;var t=n===e?0:4-n%4;return[n,t]}function f(r){var e=c(r);var n=e[0];var t=e[1];return(n+t)*3/4-t}function h(r,e,n){return(e+n)*3/4-n}function i(r){var e;var n=c(r);var t=n[0];var o=n[1];var a=new d(h(r,t,o));var f=0;var i=o>0?t-4:t;var u;for(u=0;u<i;u+=4){e=v[r.charCodeAt(u)]<<18|v[r.charCodeAt(u+1)]<<12|v[r.charCodeAt(u+2)]<<6|v[r.charCodeAt(u+3)];a[f++]=e>>16&255;a[f++]=e>>8&255;a[f++]=e&255}if(o===2){e=v[r.charCodeAt(u)]<<2|v[r.charCodeAt(u+1)]>>4;a[f++]=e&255}if(o===1){e=v[r.charCodeAt(u)]<<10|v[r.charCodeAt(u+1)]<<4|v[r.charCodeAt(u+2)]>>2;a[f++]=e>>8&255;a[f++]=e&255}return a}function s(r){return u[r>>18&63]+u[r>>12&63]+u[r>>6&63]+u[r&63]}function l(r,e,n){var t;var o=[];for(var a=e;a<n;a+=3){t=(r[a]<<16&16711680)+(r[a+1]<<8&65280)+(r[a+2]&255);o.push(s(t))}return o.join("")}function p(r){var e;var n=r.length;var t=n%3;var o=[];var a=16383;for(var f=0,i=n-t;f<i;f+=a){o.push(l(r,f,f+a>i?i:f+a))}if(t===1){e=r[n-1];o.push(u[e>>2]+u[e<<4&63]+"==")}else if(t===2){e=(r[n-2]<<8)+r[n-1];o.push(u[e>>10]+u[e>>4&63]+u[e<<2&63]+"=")}return o.join("")}},{}]},{},[])("/")});
'use strict'

exports.byteLength = byteLength
exports.toByteArray = toByteArray
exports.fromByteArray = fromByteArray

var lookup = []
var revLookup = []
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array

var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, len = code.length; i < len; ++i) {
  lookup[i] = code[i]
  revLookup[code.charCodeAt(i)] = i
}

// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
revLookup['-'.charCodeAt(0)] = 62
revLookup['_'.charCodeAt(0)] = 63

function getLens (b64) {
  var len = b64.length

  if (len % 4 > 0) {
    throw new Error('Invalid string. Length must be a multiple of 4')
  }

  // Trim off extra bytes after placeholder bytes are found
  // See: https://github.com/beatgammit/base64-js/issues/42
  var validLen = b64.indexOf('=')
  if (validLen === -1) validLen = len

  var placeHoldersLen = validLen === len
    ? 0
    : 4 - (validLen % 4)

  return [validLen, placeHoldersLen]
}

// base64 is 4/3 + up to two characters of the original data
function byteLength (b64) {
  var lens = getLens(b64)
  var validLen = lens[0]
  var placeHoldersLen = lens[1]
  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}

function _byteLength (b64, validLen, placeHoldersLen) {
  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}

function toByteArray (b64) {
  var tmp
  var lens = getLens(b64)
  var validLen = lens[0]
  var placeHoldersLen = lens[1]

  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))

  var curByte = 0

  // if there are placeholders, only get up to the last complete 4 chars
  var len = placeHoldersLen > 0
    ? validLen - 4
    : validLen

  var i
  for (i = 0; i < len; i += 4) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 18) |
      (revLookup[b64.charCodeAt(i + 1)] << 12) |
      (revLookup[b64.charCodeAt(i + 2)] << 6) |
      revLookup[b64.charCodeAt(i + 3)]
    arr[curByte++] = (tmp >> 16) & 0xFF
    arr[curByte++] = (tmp >> 8) & 0xFF
    arr[curByte++] = tmp & 0xFF
  }

  if (placeHoldersLen === 2) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 2) |
      (revLookup[b64.charCodeAt(i + 1)] >> 4)
    arr[curByte++] = tmp & 0xFF
  }

  if (placeHoldersLen === 1) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 10) |
      (revLookup[b64.charCodeAt(i + 1)] << 4) |
      (revLookup[b64.charCodeAt(i + 2)] >> 2)
    arr[curByte++] = (tmp >> 8) & 0xFF
    arr[curByte++] = tmp & 0xFF
  }

  return arr
}

function tripletToBase64 (num) {
  return lookup[num >> 18 & 0x3F] +
    lookup[num >> 12 & 0x3F] +
    lookup[num >> 6 & 0x3F] +
    lookup[num & 0x3F]
}

function encodeChunk (uint8, start, end) {
  var tmp
  var output = []
  for (var i = start; i < end; i += 3) {
    tmp =
      ((uint8[i] << 16) & 0xFF0000) +
      ((uint8[i + 1] << 8) & 0xFF00) +
      (uint8[i + 2] & 0xFF)
    output.push(tripletToBase64(tmp))
  }
  return output.join('')
}

function fromByteArray (uint8) {
  var tmp
  var len = uint8.length
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  var parts = []
  var maxChunkLength = 16383 // must be multiple of 3

  // go through the array every three bytes, we'll deal with trailing stuff later
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
    parts.push(encodeChunk(
      uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)
    ))
  }

  // pad the end with zeros, but make sure to not forget the extra bytes
  if (extraBytes === 1) {
    tmp = uint8[len - 1]
    parts.push(
      lookup[tmp >> 2] +
      lookup[(tmp << 4) & 0x3F] +
      '=='
    )
  } else if (extraBytes === 2) {
    tmp = (uint8[len - 2] << 8) + uint8[len - 1]
    parts.push(
      lookup[tmp >> 10] +
      lookup[(tmp >> 4) & 0x3F] +
      lookup[(tmp << 2) & 0x3F] +
      '='
    )
  }

  return parts.join('')
}
{
  "author": {
    "name": "T. Jameson Little",
    "email": "t.jameson.little@gmail.com"
  },
  "deprecated": false,
  "description": "Base64 encoding/decoding in pure JS",
  "devDependencies": {
    "benchmark": "^2.1.4",
    "browserify": "^16.3.0",
    "standard": "*",
    "tape": "4.x",
    "uglify-js": "^3.6.0"
  },
  "homepage": "https://github.com/beatgammit/base64-js",
  "license": "MIT",
  "main": "index.js",
  "name": "base64-js",
  "repository": {
    "type": "git",
    "url": "git://github.com/beatgammit/base64-js.git"
  },
  "version": "1.3.1"
}# Contributing

This repository uses [cr.joyent.us](https://cr.joyent.us) (Gerrit) for new
changes. Anyone can submit changes. To get started, see the [cr.joyent.us user
guide](https://github.com/joyent/joyent-gerrit/blob/master/docs/user/README.md).
This repo does not use GitHub pull requests.

See the [Joyent Engineering
Guidelines](https://github.com/joyent/eng/blob/master/docs/index.md) for general
best practices expected in this repository.

If you're changing something non-trivial or user-facing, you may want to submit
an issue first.
The Blowfish portions are under the following license:

Blowfish block cipher for OpenBSD
Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
All rights reserved.

Implementation advice by David Mazieres <dm@lcs.mit.edu>.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
   derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.



The bcrypt_pbkdf portions are under the following license:

Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>

Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.



Performance improvements (Javascript-specific):

Copyright 2016, Joyent Inc
Author: Alex Wilson <alex.wilson@joyent.com>

Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
'use strict';

var crypto_hash_sha512 = require('tweetnacl').lowlevel.crypto_hash;

/*
 * This file is a 1:1 port from the OpenBSD blowfish.c and bcrypt_pbkdf.c. As a
 * result, it retains the original copyright and license. The two files are
 * under slightly different (but compatible) licenses, and are here combined in
 * one file.
 *
 * Credit for the actual porting work goes to:
 *  Devi Mandiri <me@devi.web.id>
 */

/*
 * The Blowfish portions are under the following license:
 *
 * Blowfish block cipher for OpenBSD
 * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
 * All rights reserved.
 *
 * Implementation advice by David Mazieres <dm@lcs.mit.edu>.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * The bcrypt_pbkdf portions are under the following license:
 *
 * Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * Performance improvements (Javascript-specific):
 *
 * Copyright 2016, Joyent Inc
 * Author: Alex Wilson <alex.wilson@joyent.com>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

// Ported from OpenBSD bcrypt_pbkdf.c v1.9

var BLF_J = 0;

var Blowfish = function() {
  this.S = [
    new Uint32Array([
      0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
      0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
      0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
      0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
      0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
      0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
      0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
      0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
      0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
      0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
      0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
      0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
      0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
      0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
      0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
      0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
      0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
      0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
      0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
      0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
      0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
      0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
      0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
      0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
      0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
      0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
      0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
      0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
      0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
      0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
      0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
      0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
      0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
      0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
      0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
      0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
      0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
      0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
      0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
      0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
      0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
      0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
      0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
      0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
      0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
      0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
      0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
      0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
      0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
      0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
      0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
      0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
      0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
      0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
      0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
      0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
      0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
      0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
      0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
      0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
      0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
      0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
      0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
      0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a]),
    new Uint32Array([
      0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
      0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
      0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
      0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
      0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
      0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
      0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
      0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
      0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
      0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
      0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
      0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
      0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
      0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
      0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
      0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
      0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
      0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
      0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
      0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
      0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
      0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
      0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
      0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
      0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
      0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
      0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
      0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
      0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
      0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
      0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
      0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
      0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
      0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
      0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
      0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
      0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
      0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
      0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
      0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
      0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
      0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
      0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
      0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
      0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
      0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
      0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
      0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
      0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
      0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
      0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
      0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
      0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
      0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
      0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
      0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
      0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
      0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
      0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
      0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
      0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
      0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
      0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
      0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7]),
    new Uint32Array([
      0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
      0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
      0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
      0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
      0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
      0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
      0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
      0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
      0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
      0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
      0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
      0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
      0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
      0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
      0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
      0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
      0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
      0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
      0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
      0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
      0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
      0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
      0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
      0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
      0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
      0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
      0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
      0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
      0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
      0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
      0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
      0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
      0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
      0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
      0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
      0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
      0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
      0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
      0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
      0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
      0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
      0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
      0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
      0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
      0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
      0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
      0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
      0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
      0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
      0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
      0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
      0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
      0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
      0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
      0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
      0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
      0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
      0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
      0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
      0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
      0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
      0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
      0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
      0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0]),
    new Uint32Array([
      0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
      0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
      0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
      0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
      0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
      0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
      0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
      0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
      0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
      0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
      0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
      0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
      0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
      0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
      0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
      0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
      0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
      0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
      0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
      0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
      0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
      0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
      0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
      0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
      0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
      0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
      0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
      0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
      0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
      0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
      0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
      0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
      0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
      0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
      0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
      0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
      0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
      0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
      0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
      0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
      0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
      0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
      0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
      0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
      0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
      0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
      0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
      0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
      0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
      0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
      0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
      0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
      0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
      0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
      0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
      0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
      0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
      0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
      0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
      0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
      0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
      0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
      0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
      0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6])
    ];
  this.P = new Uint32Array([
    0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
    0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
    0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
    0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
    0x9216d5d9, 0x8979fb1b]);
};

function F(S, x8, i) {
  return (((S[0][x8[i+3]] +
            S[1][x8[i+2]]) ^
            S[2][x8[i+1]]) +
            S[3][x8[i]]);
};

Blowfish.prototype.encipher = function(x, x8) {
  if (x8 === undefined) {
    x8 = new Uint8Array(x.buffer);
    if (x.byteOffset !== 0)
      x8 = x8.subarray(x.byteOffset);
  }
  x[0] ^= this.P[0];
  for (var i = 1; i < 16; i += 2) {
    x[1] ^= F(this.S, x8, 0) ^ this.P[i];
    x[0] ^= F(this.S, x8, 4) ^ this.P[i+1];
  }
  var t = x[0];
  x[0] = x[1] ^ this.P[17];
  x[1] = t;
};

Blowfish.prototype.decipher = function(x) {
  var x8 = new Uint8Array(x.buffer);
  if (x.byteOffset !== 0)
    x8 = x8.subarray(x.byteOffset);
  x[0] ^= this.P[17];
  for (var i = 16; i > 0; i -= 2) {
    x[1] ^= F(this.S, x8, 0) ^ this.P[i];
    x[0] ^= F(this.S, x8, 4) ^ this.P[i-1];
  }
  var t = x[0];
  x[0] = x[1] ^ this.P[0];
  x[1] = t;
};

function stream2word(data, databytes){
  var i, temp = 0;
  for (i = 0; i < 4; i++, BLF_J++) {
    if (BLF_J >= databytes) BLF_J = 0;
    temp = (temp << 8) | data[BLF_J];
  }
  return temp;
};

Blowfish.prototype.expand0state = function(key, keybytes) {
  var d = new Uint32Array(2), i, k;
  var d8 = new Uint8Array(d.buffer);

  for (i = 0, BLF_J = 0; i < 18; i++) {
    this.P[i] ^= stream2word(key, keybytes);
  }
  BLF_J = 0;

  for (i = 0; i < 18; i += 2) {
    this.encipher(d, d8);
    this.P[i]   = d[0];
    this.P[i+1] = d[1];
  }

  for (i = 0; i < 4; i++) {
    for (k = 0; k < 256; k += 2) {
      this.encipher(d, d8);
      this.S[i][k]   = d[0];
      this.S[i][k+1] = d[1];
    }
  }
};

Blowfish.prototype.expandstate = function(data, databytes, key, keybytes) {
  var d = new Uint32Array(2), i, k;

  for (i = 0, BLF_J = 0; i < 18; i++) {
    this.P[i] ^= stream2word(key, keybytes);
  }

  for (i = 0, BLF_J = 0; i < 18; i += 2) {
    d[0] ^= stream2word(data, databytes);
    d[1] ^= stream2word(data, databytes);
    this.encipher(d);
    this.P[i]   = d[0];
    this.P[i+1] = d[1];
  }

  for (i = 0; i < 4; i++) {
    for (k = 0; k < 256; k += 2) {
      d[0] ^= stream2word(data, databytes);
      d[1] ^= stream2word(data, databytes);
      this.encipher(d);
      this.S[i][k]   = d[0];
      this.S[i][k+1] = d[1];
    }
  }
  BLF_J = 0;
};

Blowfish.prototype.enc = function(data, blocks) {
  for (var i = 0; i < blocks; i++) {
    this.encipher(data.subarray(i*2));
  }
};

Blowfish.prototype.dec = function(data, blocks) {
  for (var i = 0; i < blocks; i++) {
    this.decipher(data.subarray(i*2));
  }
};

var BCRYPT_BLOCKS = 8,
    BCRYPT_HASHSIZE = 32;

function bcrypt_hash(sha2pass, sha2salt, out) {
  var state = new Blowfish(),
      cdata = new Uint32Array(BCRYPT_BLOCKS), i,
      ciphertext = new Uint8Array([79,120,121,99,104,114,111,109,97,116,105,
            99,66,108,111,119,102,105,115,104,83,119,97,116,68,121,110,97,109,
            105,116,101]); //"OxychromaticBlowfishSwatDynamite"

  state.expandstate(sha2salt, 64, sha2pass, 64);
  for (i = 0; i < 64; i++) {
    state.expand0state(sha2salt, 64);
    state.expand0state(sha2pass, 64);
  }

  for (i = 0; i < BCRYPT_BLOCKS; i++)
    cdata[i] = stream2word(ciphertext, ciphertext.byteLength);
  for (i = 0; i < 64; i++)
    state.enc(cdata, cdata.byteLength / 8);

  for (i = 0; i < BCRYPT_BLOCKS; i++) {
    out[4*i+3] = cdata[i] >>> 24;
    out[4*i+2] = cdata[i] >>> 16;
    out[4*i+1] = cdata[i] >>> 8;
    out[4*i+0] = cdata[i];
  }
};

function bcrypt_pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds) {
  var sha2pass = new Uint8Array(64),
      sha2salt = new Uint8Array(64),
      out = new Uint8Array(BCRYPT_HASHSIZE),
      tmpout = new Uint8Array(BCRYPT_HASHSIZE),
      countsalt = new Uint8Array(saltlen+4),
      i, j, amt, stride, dest, count,
      origkeylen = keylen;

  if (rounds < 1)
    return -1;
  if (passlen === 0 || saltlen === 0 || keylen === 0 ||
      keylen > (out.byteLength * out.byteLength) || saltlen > (1<<20))
    return -1;

  stride = Math.floor((keylen + out.byteLength - 1) / out.byteLength);
  amt = Math.floor((keylen + stride - 1) / stride);

  for (i = 0; i < saltlen; i++)
    countsalt[i] = salt[i];

  crypto_hash_sha512(sha2pass, pass, passlen);

  for (count = 1; keylen > 0; count++) {
    countsalt[saltlen+0] = count >>> 24;
    countsalt[saltlen+1] = count >>> 16;
    countsalt[saltlen+2] = count >>>  8;
    countsalt[saltlen+3] = count;

    crypto_hash_sha512(sha2salt, countsalt, saltlen + 4);
    bcrypt_hash(sha2pass, sha2salt, tmpout);
    for (i = out.byteLength; i--;)
      out[i] = tmpout[i];

    for (i = 1; i < rounds; i++) {
      crypto_hash_sha512(sha2salt, tmpout, tmpout.byteLength);
      bcrypt_hash(sha2pass, sha2salt, tmpout);
      for (j = 0; j < out.byteLength; j++)
        out[j] ^= tmpout[j];
    }

    amt = Math.min(amt, keylen);
    for (i = 0; i < amt; i++) {
      dest = i * stride + (count - 1);
      if (dest >= origkeylen)
        break;
      key[dest] = out[i];
    }
    keylen -= i;
  }

  return 0;
};

module.exports = {
      BLOCKS: BCRYPT_BLOCKS,
      HASHSIZE: BCRYPT_HASHSIZE,
      hash: bcrypt_hash,
      pbkdf: bcrypt_pbkdf
};
{
  "dependencies": {
    "tweetnacl": "^0.14.3"
  },
  "deprecated": false,
  "description": "Port of the OpenBSD bcrypt_pbkdf function to pure JS",
  "devDependencies": {},
  "homepage": "https://github.com/joyent/node-bcrypt-pbkdf#readme",
  "license": "BSD-3-Clause",
  "main": "index.js",
  "name": "bcrypt-pbkdf",
  "repository": {
    "type": "git",
    "url": "git://github.com/joyent/node-bcrypt-pbkdf.git"
  },
  "version": "1.0.2"
}var bigInt = (function (undefined) {
    "use strict";

    var BASE = 1e7,
        LOG_BASE = 7,
        MAX_INT = 9007199254740992,
        MAX_INT_ARR = smallToArray(MAX_INT),
        DEFAULT_ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyz";

    var supportsNativeBigInt = typeof BigInt === "function";

    function Integer(v, radix, alphabet, caseSensitive) {
        if (typeof v === "undefined") return Integer[0];
        if (typeof radix !== "undefined") return +radix === 10 && !alphabet ? parseValue(v) : parseBase(v, radix, alphabet, caseSensitive);
        return parseValue(v);
    }

    function BigInteger(value, sign) {
        this.value = value;
        this.sign = sign;
        this.isSmall = false;
    }
    BigInteger.prototype = Object.create(Integer.prototype);

    function SmallInteger(value) {
        this.value = value;
        this.sign = value < 0;
        this.isSmall = true;
    }
    SmallInteger.prototype = Object.create(Integer.prototype);

    function NativeBigInt(value) {
        this.value = value;
    }
    NativeBigInt.prototype = Object.create(Integer.prototype);

    function isPrecise(n) {
        return -MAX_INT < n && n < MAX_INT;
    }

    function smallToArray(n) { // For performance reasons doesn't reference BASE, need to change this function if BASE changes
        if (n < 1e7)
            return [n];
        if (n < 1e14)
            return [n % 1e7, Math.floor(n / 1e7)];
        return [n % 1e7, Math.floor(n / 1e7) % 1e7, Math.floor(n / 1e14)];
    }

    function arrayToSmall(arr) { // If BASE changes this function may need to change
        trim(arr);
        var length = arr.length;
        if (length < 4 && compareAbs(arr, MAX_INT_ARR) < 0) {
            switch (length) {
                case 0: return 0;
                case 1: return arr[0];
                case 2: return arr[0] + arr[1] * BASE;
                default: return arr[0] + (arr[1] + arr[2] * BASE) * BASE;
            }
        }
        return arr;
    }

    function trim(v) {
        var i = v.length;
        while (v[--i] === 0);
        v.length = i + 1;
    }

    function createArray(length) { // function shamelessly stolen from Yaffle's library https://github.com/Yaffle/BigInteger
        var x = new Array(length);
        var i = -1;
        while (++i < length) {
            x[i] = 0;
        }
        return x;
    }

    function truncate(n) {
        if (n > 0) return Math.floor(n);
        return Math.ceil(n);
    }

    function add(a, b) { // assumes a and b are arrays with a.length >= b.length
        var l_a = a.length,
            l_b = b.length,
            r = new Array(l_a),
            carry = 0,
            base = BASE,
            sum, i;
        for (i = 0; i < l_b; i++) {
            sum = a[i] + b[i] + carry;
            carry = sum >= base ? 1 : 0;
            r[i] = sum - carry * base;
        }
        while (i < l_a) {
            sum = a[i] + carry;
            carry = sum === base ? 1 : 0;
            r[i++] = sum - carry * base;
        }
        if (carry > 0) r.push(carry);
        return r;
    }

    function addAny(a, b) {
        if (a.length >= b.length) return add(a, b);
        return add(b, a);
    }

    function addSmall(a, carry) { // assumes a is array, carry is number with 0 <= carry < MAX_INT
        var l = a.length,
            r = new Array(l),
            base = BASE,
            sum, i;
        for (i = 0; i < l; i++) {
            sum = a[i] - base + carry;
            carry = Math.floor(sum / base);
            r[i] = sum - carry * base;
            carry += 1;
        }
        while (carry > 0) {
            r[i++] = carry % base;
            carry = Math.floor(carry / base);
        }
        return r;
    }

    BigInteger.prototype.add = function (v) {
        var n = parseValue(v);
        if (this.sign !== n.sign) {
            return this.subtract(n.negate());
        }
        var a = this.value, b = n.value;
        if (n.isSmall) {
            return new BigInteger(addSmall(a, Math.abs(b)), this.sign);
        }
        return new BigInteger(addAny(a, b), this.sign);
    };
    BigInteger.prototype.plus = BigInteger.prototype.add;

    SmallInteger.prototype.add = function (v) {
        var n = parseValue(v);
        var a = this.value;
        if (a < 0 !== n.sign) {
            return this.subtract(n.negate());
        }
        var b = n.value;
        if (n.isSmall) {
            if (isPrecise(a + b)) return new SmallInteger(a + b);
            b = smallToArray(Math.abs(b));
        }
        return new BigInteger(addSmall(b, Math.abs(a)), a < 0);
    };
    SmallInteger.prototype.plus = SmallInteger.prototype.add;

    NativeBigInt.prototype.add = function (v) {
        return new NativeBigInt(this.value + parseValue(v).value);
    }
    NativeBigInt.prototype.plus = NativeBigInt.prototype.add;

    function subtract(a, b) { // assumes a and b are arrays with a >= b
        var a_l = a.length,
            b_l = b.length,
            r = new Array(a_l),
            borrow = 0,
            base = BASE,
            i, difference;
        for (i = 0; i < b_l; i++) {
            difference = a[i] - borrow - b[i];
            if (difference < 0) {
                difference += base;
                borrow = 1;
            } else borrow = 0;
            r[i] = difference;
        }
        for (i = b_l; i < a_l; i++) {
            difference = a[i] - borrow;
            if (difference < 0) difference += base;
            else {
                r[i++] = difference;
                break;
            }
            r[i] = difference;
        }
        for (; i < a_l; i++) {
            r[i] = a[i];
        }
        trim(r);
        return r;
    }

    function subtractAny(a, b, sign) {
        var value;
        if (compareAbs(a, b) >= 0) {
            value = subtract(a, b);
        } else {
            value = subtract(b, a);
            sign = !sign;
        }
        value = arrayToSmall(value);
        if (typeof value === "number") {
            if (sign) value = -value;
            return new SmallInteger(value);
        }
        return new BigInteger(value, sign);
    }

    function subtractSmall(a, b, sign) { // assumes a is array, b is number with 0 <= b < MAX_INT
        var l = a.length,
            r = new Array(l),
            carry = -b,
            base = BASE,
            i, difference;
        for (i = 0; i < l; i++) {
            difference = a[i] + carry;
            carry = Math.floor(difference / base);
            difference %= base;
            r[i] = difference < 0 ? difference + base : difference;
        }
        r = arrayToSmall(r);
        if (typeof r === "number") {
            if (sign) r = -r;
            return new SmallInteger(r);
        } return new BigInteger(r, sign);
    }

    BigInteger.prototype.subtract = function (v) {
        var n = parseValue(v);
        if (this.sign !== n.sign) {
            return this.add(n.negate());
        }
        var a = this.value, b = n.value;
        if (n.isSmall)
            return subtractSmall(a, Math.abs(b), this.sign);
        return subtractAny(a, b, this.sign);
    };
    BigInteger.prototype.minus = BigInteger.prototype.subtract;

    SmallInteger.prototype.subtract = function (v) {
        var n = parseValue(v);
        var a = this.value;
        if (a < 0 !== n.sign) {
            return this.add(n.negate());
        }
        var b = n.value;
        if (n.isSmall) {
            return new SmallInteger(a - b);
        }
        return subtractSmall(b, Math.abs(a), a >= 0);
    };
    SmallInteger.prototype.minus = SmallInteger.prototype.subtract;

    NativeBigInt.prototype.subtract = function (v) {
        return new NativeBigInt(this.value - parseValue(v).value);
    }
    NativeBigInt.prototype.minus = NativeBigInt.prototype.subtract;

    BigInteger.prototype.negate = function () {
        return new BigInteger(this.value, !this.sign);
    };
    SmallInteger.prototype.negate = function () {
        var sign = this.sign;
        var small = new SmallInteger(-this.value);
        small.sign = !sign;
        return small;
    };
    NativeBigInt.prototype.negate = function () {
        return new NativeBigInt(-this.value);
    }

    BigInteger.prototype.abs = function () {
        return new BigInteger(this.value, false);
    };
    SmallInteger.prototype.abs = function () {
        return new SmallInteger(Math.abs(this.value));
    };
    NativeBigInt.prototype.abs = function () {
        return new NativeBigInt(this.value >= 0 ? this.value : -this.value);
    }


    function multiplyLong(a, b) {
        var a_l = a.length,
            b_l = b.length,
            l = a_l + b_l,
            r = createArray(l),
            base = BASE,
            product, carry, i, a_i, b_j;
        for (i = 0; i < a_l; ++i) {
            a_i = a[i];
            for (var j = 0; j < b_l; ++j) {
                b_j = b[j];
                product = a_i * b_j + r[i + j];
                carry = Math.floor(product / base);
                r[i + j] = product - carry * base;
                r[i + j + 1] += carry;
            }
        }
        trim(r);
        return r;
    }

    function multiplySmall(a, b) { // assumes a is array, b is number with |b| < BASE
        var l = a.length,
            r = new Array(l),
            base = BASE,
            carry = 0,
            product, i;
        for (i = 0; i < l; i++) {
            product = a[i] * b + carry;
            carry = Math.floor(product / base);
            r[i] = product - carry * base;
        }
        while (carry > 0) {
            r[i++] = carry % base;
            carry = Math.floor(carry / base);
        }
        return r;
    }

    function shiftLeft(x, n) {
        var r = [];
        while (n-- > 0) r.push(0);
        return r.concat(x);
    }

    function multiplyKaratsuba(x, y) {
        var n = Math.max(x.length, y.length);

        if (n <= 30) return multiplyLong(x, y);
        n = Math.ceil(n / 2);

        var b = x.slice(n),
            a = x.slice(0, n),
            d = y.slice(n),
            c = y.slice(0, n);

        var ac = multiplyKaratsuba(a, c),
            bd = multiplyKaratsuba(b, d),
            abcd = multiplyKaratsuba(addAny(a, b), addAny(c, d));

        var product = addAny(addAny(ac, shiftLeft(subtract(subtract(abcd, ac), bd), n)), shiftLeft(bd, 2 * n));
        trim(product);
        return product;
    }

    // The following function is derived from a surface fit of a graph plotting the performance difference
    // between long multiplication and karatsuba multiplication versus the lengths of the two arrays.
    function useKaratsuba(l1, l2) {
        return -0.012 * l1 - 0.012 * l2 + 0.000015 * l1 * l2 > 0;
    }

    BigInteger.prototype.multiply = function (v) {
        var n = parseValue(v),
            a = this.value, b = n.value,
            sign = this.sign !== n.sign,
            abs;
        if (n.isSmall) {
            if (b === 0) return Integer[0];
            if (b === 1) return this;
            if (b === -1) return this.negate();
            abs = Math.abs(b);
            if (abs < BASE) {
                return new BigInteger(multiplySmall(a, abs), sign);
            }
            b = smallToArray(abs);
        }
        if (useKaratsuba(a.length, b.length)) // Karatsuba is only faster for certain array sizes
            return new BigInteger(multiplyKaratsuba(a, b), sign);
        return new BigInteger(multiplyLong(a, b), sign);
    };

    BigInteger.prototype.times = BigInteger.prototype.multiply;

    function multiplySmallAndArray(a, b, sign) { // a >= 0
        if (a < BASE) {
            return new BigInteger(multiplySmall(b, a), sign);
        }
        return new BigInteger(multiplyLong(b, smallToArray(a)), sign);
    }
    SmallInteger.prototype._multiplyBySmall = function (a) {
        if (isPrecise(a.value * this.value)) {
            return new SmallInteger(a.value * this.value);
        }
        return multiplySmallAndArray(Math.abs(a.value), smallToArray(Math.abs(this.value)), this.sign !== a.sign);
    };
    BigInteger.prototype._multiplyBySmall = function (a) {
        if (a.value === 0) return Integer[0];
        if (a.value === 1) return this;
        if (a.value === -1) return this.negate();
        return multiplySmallAndArray(Math.abs(a.value), this.value, this.sign !== a.sign);
    };
    SmallInteger.prototype.multiply = function (v) {
        return parseValue(v)._multiplyBySmall(this);
    };
    SmallInteger.prototype.times = SmallInteger.prototype.multiply;

    NativeBigInt.prototype.multiply = function (v) {
        return new NativeBigInt(this.value * parseValue(v).value);
    }
    NativeBigInt.prototype.times = NativeBigInt.prototype.multiply;

    function square(a) {
        //console.assert(2 * BASE * BASE < MAX_INT);
        var l = a.length,
            r = createArray(l + l),
            base = BASE,
            product, carry, i, a_i, a_j;
        for (i = 0; i < l; i++) {
            a_i = a[i];
            carry = 0 - a_i * a_i;
            for (var j = i; j < l; j++) {
                a_j = a[j];
                product = 2 * (a_i * a_j) + r[i + j] + carry;
                carry = Math.floor(product / base);
                r[i + j] = product - carry * base;
            }
            r[i + l] = carry;
        }
        trim(r);
        return r;
    }

    BigInteger.prototype.square = function () {
        return new BigInteger(square(this.value), false);
    };

    SmallInteger.prototype.square = function () {
        var value = this.value * this.value;
        if (isPrecise(value)) return new SmallInteger(value);
        return new BigInteger(square(smallToArray(Math.abs(this.value))), false);
    };

    NativeBigInt.prototype.square = function (v) {
        return new NativeBigInt(this.value * this.value);
    }

    function divMod1(a, b) { // Left over from previous version. Performs faster than divMod2 on smaller input sizes.
        var a_l = a.length,
            b_l = b.length,
            base = BASE,
            result = createArray(b.length),
            divisorMostSignificantDigit = b[b_l - 1],
            // normalization
            lambda = Math.ceil(base / (2 * divisorMostSignificantDigit)),
            remainder = multiplySmall(a, lambda),
            divisor = multiplySmall(b, lambda),
            quotientDigit, shift, carry, borrow, i, l, q;
        if (remainder.length <= a_l) remainder.push(0);
        divisor.push(0);
        divisorMostSignificantDigit = divisor[b_l - 1];
        for (shift = a_l - b_l; shift >= 0; shift--) {
            quotientDigit = base - 1;
            if (remainder[shift + b_l] !== divisorMostSignificantDigit) {
                quotientDigit = Math.floor((remainder[shift + b_l] * base + remainder[shift + b_l - 1]) / divisorMostSignificantDigit);
            }
            // quotientDigit <= base - 1
            carry = 0;
            borrow = 0;
            l = divisor.length;
            for (i = 0; i < l; i++) {
                carry += quotientDigit * divisor[i];
                q = Math.floor(carry / base);
                borrow += remainder[shift + i] - (carry - q * base);
                carry = q;
                if (borrow < 0) {
                    remainder[shift + i] = borrow + base;
                    borrow = -1;
                } else {
                    remainder[shift + i] = borrow;
                    borrow = 0;
                }
            }
            while (borrow !== 0) {
                quotientDigit -= 1;
                carry = 0;
                for (i = 0; i < l; i++) {
                    carry += remainder[shift + i] - base + divisor[i];
                    if (carry < 0) {
                        remainder[shift + i] = carry + base;
                        carry = 0;
                    } else {
                        remainder[shift + i] = carry;
                        carry = 1;
                    }
                }
                borrow += carry;
            }
            result[shift] = quotientDigit;
        }
        // denormalization
        remainder = divModSmall(remainder, lambda)[0];
        return [arrayToSmall(result), arrayToSmall(remainder)];
    }

    function divMod2(a, b) { // Implementation idea shamelessly stolen from Silent Matt's library http://silentmatt.com/biginteger/
        // Performs faster than divMod1 on larger input sizes.
        var a_l = a.length,
            b_l = b.length,
            result = [],
            part = [],
            base = BASE,
            guess, xlen, highx, highy, check;
        while (a_l) {
            part.unshift(a[--a_l]);
            trim(part);
            if (compareAbs(part, b) < 0) {
                result.push(0);
                continue;
            }
            xlen = part.length;
            highx = part[xlen - 1] * base + part[xlen - 2];
            highy = b[b_l - 1] * base + b[b_l - 2];
            if (xlen > b_l) {
                highx = (highx + 1) * base;
            }
            guess = Math.ceil(highx / highy);
            do {
                check = multiplySmall(b, guess);
                if (compareAbs(check, part) <= 0) break;
                guess--;
            } while (guess);
            result.push(guess);
            part = subtract(part, check);
        }
        result.reverse();
        return [arrayToSmall(result), arrayToSmall(part)];
    }

    function divModSmall(value, lambda) {
        var length = value.length,
            quotient = createArray(length),
            base = BASE,
            i, q, remainder, divisor;
        remainder = 0;
        for (i = length - 1; i >= 0; --i) {
            divisor = remainder * base + value[i];
            q = truncate(divisor / lambda);
            remainder = divisor - q * lambda;
            quotient[i] = q | 0;
        }
        return [quotient, remainder | 0];
    }

    function divModAny(self, v) {
        var value, n = parseValue(v);
        if (supportsNativeBigInt) {
            return [new NativeBigInt(self.value / n.value), new NativeBigInt(self.value % n.value)];
        }
        var a = self.value, b = n.value;
        var quotient;
        if (b === 0) throw new Error("Cannot divide by zero");
        if (self.isSmall) {
            if (n.isSmall) {
                return [new SmallInteger(truncate(a / b)), new SmallInteger(a % b)];
            }
            return [Integer[0], self];
        }
        if (n.isSmall) {
            if (b === 1) return [self, Integer[0]];
            if (b == -1) return [self.negate(), Integer[0]];
            var abs = Math.abs(b);
            if (abs < BASE) {
                value = divModSmall(a, abs);
                quotient = arrayToSmall(value[0]);
                var remainder = value[1];
                if (self.sign) remainder = -remainder;
                if (typeof quotient === "number") {
                    if (self.sign !== n.sign) quotient = -quotient;
                    return [new SmallInteger(quotient), new SmallInteger(remainder)];
                }
                return [new BigInteger(quotient, self.sign !== n.sign), new SmallInteger(remainder)];
            }
            b = smallToArray(abs);
        }
        var comparison = compareAbs(a, b);
        if (comparison === -1) return [Integer[0], self];
        if (comparison === 0) return [Integer[self.sign === n.sign ? 1 : -1], Integer[0]];

        // divMod1 is faster on smaller input sizes
        if (a.length + b.length <= 200)
            value = divMod1(a, b);
        else value = divMod2(a, b);

        quotient = value[0];
        var qSign = self.sign !== n.sign,
            mod = value[1],
            mSign = self.sign;
        if (typeof quotient === "number") {
            if (qSign) quotient = -quotient;
            quotient = new SmallInteger(quotient);
        } else quotient = new BigInteger(quotient, qSign);
        if (typeof mod === "number") {
            if (mSign) mod = -mod;
            mod = new SmallInteger(mod);
        } else mod = new BigInteger(mod, mSign);
        return [quotient, mod];
    }

    BigInteger.prototype.divmod = function (v) {
        var result = divModAny(this, v);
        return {
            quotient: result[0],
            remainder: result[1]
        };
    };
    NativeBigInt.prototype.divmod = SmallInteger.prototype.divmod = BigInteger.prototype.divmod;


    BigInteger.prototype.divide = function (v) {
        return divModAny(this, v)[0];
    };
    NativeBigInt.prototype.over = NativeBigInt.prototype.divide = function (v) {
        return new NativeBigInt(this.value / parseValue(v).value);
    };
    SmallInteger.prototype.over = SmallInteger.prototype.divide = BigInteger.prototype.over = BigInteger.prototype.divide;

    BigInteger.prototype.mod = function (v) {
        return divModAny(this, v)[1];
    };
    NativeBigInt.prototype.mod = NativeBigInt.prototype.remainder = function (v) {
        return new NativeBigInt(this.value % parseValue(v).value);
    };
    SmallInteger.prototype.remainder = SmallInteger.prototype.mod = BigInteger.prototype.remainder = BigInteger.prototype.mod;

    BigInteger.prototype.pow = function (v) {
        var n = parseValue(v),
            a = this.value,
            b = n.value,
            value, x, y;
        if (b === 0) return Integer[1];
        if (a === 0) return Integer[0];
        if (a === 1) return Integer[1];
        if (a === -1) return n.isEven() ? Integer[1] : Integer[-1];
        if (n.sign) {
            return Integer[0];
        }
        if (!n.isSmall) throw new Error("The exponent " + n.toString() + " is too large.");
        if (this.isSmall) {
            if (isPrecise(value = Math.pow(a, b)))
                return new SmallInteger(truncate(value));
        }
        x = this;
        y = Integer[1];
        while (true) {
            if (b & 1 === 1) {
                y = y.times(x);
                --b;
            }
            if (b === 0) break;
            b /= 2;
            x = x.square();
        }
        return y;
    };
    SmallInteger.prototype.pow = BigInteger.prototype.pow;

    NativeBigInt.prototype.pow = function (v) {
        var n = parseValue(v);
        var a = this.value, b = n.value;
        var _0 = BigInt(0), _1 = BigInt(1), _2 = BigInt(2);
        if (b === _0) return Integer[1];
        if (a === _0) return Integer[0];
        if (a === _1) return Integer[1];
        if (a === BigInt(-1)) return n.isEven() ? Integer[1] : Integer[-1];
        if (n.isNegative()) return new NativeBigInt(_0);
        var x = this;
        var y = Integer[1];
        while (true) {
            if ((b & _1) === _1) {
                y = y.times(x);
                --b;
            }
            if (b === _0) break;
            b /= _2;
            x = x.square();
        }
        return y;
    }

    BigInteger.prototype.modPow = function (exp, mod) {
        exp = parseValue(exp);
        mod = parseValue(mod);
        if (mod.isZero()) throw new Error("Cannot take modPow with modulus 0");
        var r = Integer[1],
            base = this.mod(mod);
        if (exp.isNegative()) {
            exp = exp.multiply(Integer[-1]);
            base = base.modInv(mod);
        }
        while (exp.isPositive()) {
            if (base.isZero()) return Integer[0];
            if (exp.isOdd()) r = r.multiply(base).mod(mod);
            exp = exp.divide(2);
            base = base.square().mod(mod);
        }
        return r;
    };
    NativeBigInt.prototype.modPow = SmallInteger.prototype.modPow = BigInteger.prototype.modPow;

    function compareAbs(a, b) {
        if (a.length !== b.length) {
            return a.length > b.length ? 1 : -1;
        }
        for (var i = a.length - 1; i >= 0; i--) {
            if (a[i] !== b[i]) return a[i] > b[i] ? 1 : -1;
        }
        return 0;
    }

    BigInteger.prototype.compareAbs = function (v) {
        var n = parseValue(v),
            a = this.value,
            b = n.value;
        if (n.isSmall) return 1;
        return compareAbs(a, b);
    };
    SmallInteger.prototype.compareAbs = function (v) {
        var n = parseValue(v),
            a = Math.abs(this.value),
            b = n.value;
        if (n.isSmall) {
            b = Math.abs(b);
            return a === b ? 0 : a > b ? 1 : -1;
        }
        return -1;
    };
    NativeBigInt.prototype.compareAbs = function (v) {
        var a = this.value;
        var b = parseValue(v).value;
        a = a >= 0 ? a : -a;
        b = b >= 0 ? b : -b;
        return a === b ? 0 : a > b ? 1 : -1;
    }

    BigInteger.prototype.compare = function (v) {
        // See discussion about comparison with Infinity:
        // https://github.com/peterolson/BigInteger.js/issues/61
        if (v === Infinity) {
            return -1;
        }
        if (v === -Infinity) {
            return 1;
        }

        var n = parseValue(v),
            a = this.value,
            b = n.value;
        if (this.sign !== n.sign) {
            return n.sign ? 1 : -1;
        }
        if (n.isSmall) {
            return this.sign ? -1 : 1;
        }
        return compareAbs(a, b) * (this.sign ? -1 : 1);
    };
    BigInteger.prototype.compareTo = BigInteger.prototype.compare;

    SmallInteger.prototype.compare = function (v) {
        if (v === Infinity) {
            return -1;
        }
        if (v === -Infinity) {
            return 1;
        }

        var n = parseValue(v),
            a = this.value,
            b = n.value;
        if (n.isSmall) {
            return a == b ? 0 : a > b ? 1 : -1;
        }
        if (a < 0 !== n.sign) {
            return a < 0 ? -1 : 1;
        }
        return a < 0 ? 1 : -1;
    };
    SmallInteger.prototype.compareTo = SmallInteger.prototype.compare;

    NativeBigInt.prototype.compare = function (v) {
        if (v === Infinity) {
            return -1;
        }
        if (v === -Infinity) {
            return 1;
        }
        var a = this.value;
        var b = parseValue(v).value;
        return a === b ? 0 : a > b ? 1 : -1;
    }
    NativeBigInt.prototype.compareTo = NativeBigInt.prototype.compare;

    BigInteger.prototype.equals = function (v) {
        return this.compare(v) === 0;
    };
    NativeBigInt.prototype.eq = NativeBigInt.prototype.equals = SmallInteger.prototype.eq = SmallInteger.prototype.equals = BigInteger.prototype.eq = BigInteger.prototype.equals;

    BigInteger.prototype.notEquals = function (v) {
        return this.compare(v) !== 0;
    };
    NativeBigInt.prototype.neq = NativeBigInt.prototype.notEquals = SmallInteger.prototype.neq = SmallInteger.prototype.notEquals = BigInteger.prototype.neq = BigInteger.prototype.notEquals;

    BigInteger.prototype.greater = function (v) {
        return this.compare(v) > 0;
    };
    NativeBigInt.prototype.gt = NativeBigInt.prototype.greater = SmallInteger.prototype.gt = SmallInteger.prototype.greater = BigInteger.prototype.gt = BigInteger.prototype.greater;

    BigInteger.prototype.lesser = function (v) {
        return this.compare(v) < 0;
    };
    NativeBigInt.prototype.lt = NativeBigInt.prototype.lesser = SmallInteger.prototype.lt = SmallInteger.prototype.lesser = BigInteger.prototype.lt = BigInteger.prototype.lesser;

    BigInteger.prototype.greaterOrEquals = function (v) {
        return this.compare(v) >= 0;
    };
    NativeBigInt.prototype.geq = NativeBigInt.prototype.greaterOrEquals = SmallInteger.prototype.geq = SmallInteger.prototype.greaterOrEquals = BigInteger.prototype.geq = BigInteger.prototype.greaterOrEquals;

    BigInteger.prototype.lesserOrEquals = function (v) {
        return this.compare(v) <= 0;
    };
    NativeBigInt.prototype.leq = NativeBigInt.prototype.lesserOrEquals = SmallInteger.prototype.leq = SmallInteger.prototype.lesserOrEquals = BigInteger.prototype.leq = BigInteger.prototype.lesserOrEquals;

    BigInteger.prototype.isEven = function () {
        return (this.value[0] & 1) === 0;
    };
    SmallInteger.prototype.isEven = function () {
        return (this.value & 1) === 0;
    };
    NativeBigInt.prototype.isEven = function () {
        return (this.value & BigInt(1)) === BigInt(0);
    }

    BigInteger.prototype.isOdd = function () {
        return (this.value[0] & 1) === 1;
    };
    SmallInteger.prototype.isOdd = function () {
        return (this.value & 1) === 1;
    };
    NativeBigInt.prototype.isOdd = function () {
        return (this.value & BigInt(1)) === BigInt(1);
    }

    BigInteger.prototype.isPositive = function () {
        return !this.sign;
    };
    SmallInteger.prototype.isPositive = function () {
        return this.value > 0;
    };
    NativeBigInt.prototype.isPositive = SmallInteger.prototype.isPositive;

    BigInteger.prototype.isNegative = function () {
        return this.sign;
    };
    SmallInteger.prototype.isNegative = function () {
        return this.value < 0;
    };
    NativeBigInt.prototype.isNegative = SmallInteger.prototype.isNegative;

    BigInteger.prototype.isUnit = function () {
        return false;
    };
    SmallInteger.prototype.isUnit = function () {
        return Math.abs(this.value) === 1;
    };
    NativeBigInt.prototype.isUnit = function () {
        return this.abs().value === BigInt(1);
    }

    BigInteger.prototype.isZero = function () {
        return false;
    };
    SmallInteger.prototype.isZero = function () {
        return this.value === 0;
    };
    NativeBigInt.prototype.isZero = function () {
        return this.value === BigInt(0);
    }

    BigInteger.prototype.isDivisibleBy = function (v) {
        var n = parseValue(v);
        if (n.isZero()) return false;
        if (n.isUnit()) return true;
        if (n.compareAbs(2) === 0) return this.isEven();
        return this.mod(n).isZero();
    };
    NativeBigInt.prototype.isDivisibleBy = SmallInteger.prototype.isDivisibleBy = BigInteger.prototype.isDivisibleBy;

    function isBasicPrime(v) {
        var n = v.abs();
        if (n.isUnit()) return false;
        if (n.equals(2) || n.equals(3) || n.equals(5)) return true;
        if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5)) return false;
        if (n.lesser(49)) return true;
        // we don't know if it's prime: let the other functions figure it out
    }

    function millerRabinTest(n, a) {
        var nPrev = n.prev(),
            b = nPrev,
            r = 0,
            d, t, i, x;
        while (b.isEven()) b = b.divide(2), r++;
        next: for (i = 0; i < a.length; i++) {
            if (n.lesser(a[i])) continue;
            x = bigInt(a[i]).modPow(b, n);
            if (x.isUnit() || x.equals(nPrev)) continue;
            for (d = r - 1; d != 0; d--) {
                x = x.square().mod(n);
                if (x.isUnit()) return false;
                if (x.equals(nPrev)) continue next;
            }
            return false;
        }
        return true;
    }

    // Set "strict" to true to force GRH-supported lower bound of 2*log(N)^2
    BigInteger.prototype.isPrime = function (strict) {
        var isPrime = isBasicPrime(this);
        if (isPrime !== undefined) return isPrime;
        var n = this.abs();
        var bits = n.bitLength();
        if (bits <= 64)
            return millerRabinTest(n, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]);
        var logN = Math.log(2) * bits.toJSNumber();
        var t = Math.ceil((strict === true) ? (2 * Math.pow(logN, 2)) : logN);
        for (var a = [], i = 0; i < t; i++) {
            a.push(bigInt(i + 2));
        }
        return millerRabinTest(n, a);
    };
    NativeBigInt.prototype.isPrime = SmallInteger.prototype.isPrime = BigInteger.prototype.isPrime;

    BigInteger.prototype.isProbablePrime = function (iterations, rng) {
        var isPrime = isBasicPrime(this);
        if (isPrime !== undefined) return isPrime;
        var n = this.abs();
        var t = iterations === undefined ? 5 : iterations;
        for (var a = [], i = 0; i < t; i++) {
            a.push(bigInt.randBetween(2, n.minus(2), rng));
        }
        return millerRabinTest(n, a);
    };
    NativeBigInt.prototype.isProbablePrime = SmallInteger.prototype.isProbablePrime = BigInteger.prototype.isProbablePrime;

    BigInteger.prototype.modInv = function (n) {
        var t = bigInt.zero, newT = bigInt.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR;
        while (!newR.isZero()) {
            q = r.divide(newR);
            lastT = t;
            lastR = r;
            t = newT;
            r = newR;
            newT = lastT.subtract(q.multiply(newT));
            newR = lastR.subtract(q.multiply(newR));
        }
        if (!r.isUnit()) throw new Error(this.toString() + " and " + n.toString() + " are not co-prime");
        if (t.compare(0) === -1) {
            t = t.add(n);
        }
        if (this.isNegative()) {
            return t.negate();
        }
        return t;
    };

    NativeBigInt.prototype.modInv = SmallInteger.prototype.modInv = BigInteger.prototype.modInv;

    BigInteger.prototype.next = function () {
        var value = this.value;
        if (this.sign) {
            return subtractSmall(value, 1, this.sign);
        }
        return new BigInteger(addSmall(value, 1), this.sign);
    };
    SmallInteger.prototype.next = function () {
        var value = this.value;
        if (value + 1 < MAX_INT) return new SmallInteger(value + 1);
        return new BigInteger(MAX_INT_ARR, false);
    };
    NativeBigInt.prototype.next = function () {
        return new NativeBigInt(this.value + BigInt(1));
    }

    BigInteger.prototype.prev = function () {
        var value = this.value;
        if (this.sign) {
            return new BigInteger(addSmall(value, 1), true);
        }
        return subtractSmall(value, 1, this.sign);
    };
    SmallInteger.prototype.prev = function () {
        var value = this.value;
        if (value - 1 > -MAX_INT) return new SmallInteger(value - 1);
        return new BigInteger(MAX_INT_ARR, true);
    };
    NativeBigInt.prototype.prev = function () {
        return new NativeBigInt(this.value - BigInt(1));
    }

    var powersOfTwo = [1];
    while (2 * powersOfTwo[powersOfTwo.length - 1] <= BASE) powersOfTwo.push(2 * powersOfTwo[powersOfTwo.length - 1]);
    var powers2Length = powersOfTwo.length, highestPower2 = powersOfTwo[powers2Length - 1];

    function shift_isSmall(n) {
        return Math.abs(n) <= BASE;
    }

    BigInteger.prototype.shiftLeft = function (v) {
        var n = parseValue(v).toJSNumber();
        if (!shift_isSmall(n)) {
            throw new Error(String(n) + " is too large for shifting.");
        }
        if (n < 0) return this.shiftRight(-n);
        var result = this;
        if (result.isZero()) return result;
        while (n >= powers2Length) {
            result = result.multiply(highestPower2);
            n -= powers2Length - 1;
        }
        return result.multiply(powersOfTwo[n]);
    };
    NativeBigInt.prototype.shiftLeft = SmallInteger.prototype.shiftLeft = BigInteger.prototype.shiftLeft;

    BigInteger.prototype.shiftRight = function (v) {
        var remQuo;
        var n = parseValue(v).toJSNumber();
        if (!shift_isSmall(n)) {
            throw new Error(String(n) + " is too large for shifting.");
        }
        if (n < 0) return this.shiftLeft(-n);
        var result = this;
        while (n >= powers2Length) {
            if (result.isZero() || (result.isNegative() && result.isUnit())) return result;
            remQuo = divModAny(result, highestPower2);
            result = remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];
            n -= powers2Length - 1;
        }
        remQuo = divModAny(result, powersOfTwo[n]);
        return remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];
    };
    NativeBigInt.prototype.shiftRight = SmallInteger.prototype.shiftRight = BigInteger.prototype.shiftRight;

    function bitwise(x, y, fn) {
        y = parseValue(y);
        var xSign = x.isNegative(), ySign = y.isNegative();
        var xRem = xSign ? x.not() : x,
            yRem = ySign ? y.not() : y;
        var xDigit = 0, yDigit = 0;
        var xDivMod = null, yDivMod = null;
        var result = [];
        while (!xRem.isZero() || !yRem.isZero()) {
            xDivMod = divModAny(xRem, highestPower2);
            xDigit = xDivMod[1].toJSNumber();
            if (xSign) {
                xDigit = highestPower2 - 1 - xDigit; // two's complement for negative numbers
            }

            yDivMod = divModAny(yRem, highestPower2);
            yDigit = yDivMod[1].toJSNumber();
            if (ySign) {
                yDigit = highestPower2 - 1 - yDigit; // two's complement for negative numbers
            }

            xRem = xDivMod[0];
            yRem = yDivMod[0];
            result.push(fn(xDigit, yDigit));
        }
        var sum = fn(xSign ? 1 : 0, ySign ? 1 : 0) !== 0 ? bigInt(-1) : bigInt(0);
        for (var i = result.length - 1; i >= 0; i -= 1) {
            sum = sum.multiply(highestPower2).add(bigInt(result[i]));
        }
        return sum;
    }

    BigInteger.prototype.not = function () {
        return this.negate().prev();
    };
    NativeBigInt.prototype.not = SmallInteger.prototype.not = BigInteger.prototype.not;

    BigInteger.prototype.and = function (n) {
        return bitwise(this, n, function (a, b) { return a & b; });
    };
    NativeBigInt.prototype.and = SmallInteger.prototype.and = BigInteger.prototype.and;

    BigInteger.prototype.or = function (n) {
        return bitwise(this, n, function (a, b) { return a | b; });
    };
    NativeBigInt.prototype.or = SmallInteger.prototype.or = BigInteger.prototype.or;

    BigInteger.prototype.xor = function (n) {
        return bitwise(this, n, function (a, b) { return a ^ b; });
    };
    NativeBigInt.prototype.xor = SmallInteger.prototype.xor = BigInteger.prototype.xor;

    var LOBMASK_I = 1 << 30, LOBMASK_BI = (BASE & -BASE) * (BASE & -BASE) | LOBMASK_I;
    function roughLOB(n) { // get lowestOneBit (rough)
        // SmallInteger: return Min(lowestOneBit(n), 1 << 30)
        // BigInteger: return Min(lowestOneBit(n), 1 << 14) [BASE=1e7]
        var v = n.value,
            x = typeof v === "number" ? v | LOBMASK_I :
                typeof v === "bigint" ? v | BigInt(LOBMASK_I) :
                    v[0] + v[1] * BASE | LOBMASK_BI;
        return x & -x;
    }

    function integerLogarithm(value, base) {
        if (base.compareTo(value) <= 0) {
            var tmp = integerLogarithm(value, base.square(base));
            var p = tmp.p;
            var e = tmp.e;
            var t = p.multiply(base);
            return t.compareTo(value) <= 0 ? { p: t, e: e * 2 + 1 } : { p: p, e: e * 2 };
        }
        return { p: bigInt(1), e: 0 };
    }

    BigInteger.prototype.bitLength = function () {
        var n = this;
        if (n.compareTo(bigInt(0)) < 0) {
            n = n.negate().subtract(bigInt(1));
        }
        if (n.compareTo(bigInt(0)) === 0) {
            return bigInt(0);
        }
        return bigInt(integerLogarithm(n, bigInt(2)).e).add(bigInt(1));
    }
    NativeBigInt.prototype.bitLength = SmallInteger.prototype.bitLength = BigInteger.prototype.bitLength;

    function max(a, b) {
        a = parseValue(a);
        b = parseValue(b);
        return a.greater(b) ? a : b;
    }
    function min(a, b) {
        a = parseValue(a);
        b = parseValue(b);
        return a.lesser(b) ? a : b;
    }
    function gcd(a, b) {
        a = parseValue(a).abs();
        b = parseValue(b).abs();
        if (a.equals(b)) return a;
        if (a.isZero()) return b;
        if (b.isZero()) return a;
        var c = Integer[1], d, t;
        while (a.isEven() && b.isEven()) {
            d = min(roughLOB(a), roughLOB(b));
            a = a.divide(d);
            b = b.divide(d);
            c = c.multiply(d);
        }
        while (a.isEven()) {
            a = a.divide(roughLOB(a));
        }
        do {
            while (b.isEven()) {
                b = b.divide(roughLOB(b));
            }
            if (a.greater(b)) {
                t = b; b = a; a = t;
            }
            b = b.subtract(a);
        } while (!b.isZero());
        return c.isUnit() ? a : a.multiply(c);
    }
    function lcm(a, b) {
        a = parseValue(a).abs();
        b = parseValue(b).abs();
        return a.divide(gcd(a, b)).multiply(b);
    }
    function randBetween(a, b, rng) {
        a = parseValue(a);
        b = parseValue(b);
        var usedRNG = rng || Math.random;
        var low = min(a, b), high = max(a, b);
        var range = high.subtract(low).add(1);
        if (range.isSmall) return low.add(Math.floor(usedRNG() * range));
        var digits = toBase(range, BASE).value;
        var result = [], restricted = true;
        for (var i = 0; i < digits.length; i++) {
            var top = restricted ? digits[i] : BASE;
            var digit = truncate(usedRNG() * top);
            result.push(digit);
            if (digit < top) restricted = false;
        }
        return low.add(Integer.fromArray(result, BASE, false));
    }

    var parseBase = function (text, base, alphabet, caseSensitive) {
        alphabet = alphabet || DEFAULT_ALPHABET;
        text = String(text);
        if (!caseSensitive) {
            text = text.toLowerCase();
            alphabet = alphabet.toLowerCase();
        }
        var length = text.length;
        var i;
        var absBase = Math.abs(base);
        var alphabetValues = {};
        for (i = 0; i < alphabet.length; i++) {
            alphabetValues[alphabet[i]] = i;
        }
        for (i = 0; i < length; i++) {
            var c = text[i];
            if (c === "-") continue;
            if (c in alphabetValues) {
                if (alphabetValues[c] >= absBase) {
                    if (c === "1" && absBase === 1) continue;
                    throw new Error(c + " is not a valid digit in base " + base + ".");
                }
            }
        }
        base = parseValue(base);
        var digits = [];
        var isNegative = text[0] === "-";
        for (i = isNegative ? 1 : 0; i < text.length; i++) {
            var c = text[i];
            if (c in alphabetValues) digits.push(parseValue(alphabetValues[c]));
            else if (c === "<") {
                var start = i;
                do { i++; } while (text[i] !== ">" && i < text.length);
                digits.push(parseValue(text.slice(start + 1, i)));
            }
            else throw new Error(c + " is not a valid character");
        }
        return parseBaseFromArray(digits, base, isNegative);
    };

    function parseBaseFromArray(digits, base, isNegative) {
        var val = Integer[0], pow = Integer[1], i;
        for (i = digits.length - 1; i >= 0; i--) {
            val = val.add(digits[i].times(pow));
            pow = pow.times(base);
        }
        return isNegative ? val.negate() : val;
    }

    function stringify(digit, alphabet) {
        alphabet = alphabet || DEFAULT_ALPHABET;
        if (digit < alphabet.length) {
            return alphabet[digit];
        }
        return "<" + digit + ">";
    }

    function toBase(n, base) {
        base = bigInt(base);
        if (base.isZero()) {
            if (n.isZero()) return { value: [0], isNegative: false };
            throw new Error("Cannot convert nonzero numbers to base 0.");
        }
        if (base.equals(-1)) {
            if (n.isZero()) return { value: [0], isNegative: false };
            if (n.isNegative())
                return {
                    value: [].concat.apply([], Array.apply(null, Array(-n.toJSNumber()))
                        .map(Array.prototype.valueOf, [1, 0])
                    ),
                    isNegative: false
                };

            var arr = Array.apply(null, Array(n.toJSNumber() - 1))
                .map(Array.prototype.valueOf, [0, 1]);
            arr.unshift([1]);
            return {
                value: [].concat.apply([], arr),
                isNegative: false
            };
        }

        var neg = false;
        if (n.isNegative() && base.isPositive()) {
            neg = true;
            n = n.abs();
        }
        if (base.isUnit()) {
            if (n.isZero()) return { value: [0], isNegative: false };

            return {
                value: Array.apply(null, Array(n.toJSNumber()))
                    .map(Number.prototype.valueOf, 1),
                isNegative: neg
            };
        }
        var out = [];
        var left = n, divmod;
        while (left.isNegative() || left.compareAbs(base) >= 0) {
            divmod = left.divmod(base);
            left = divmod.quotient;
            var digit = divmod.remainder;
            if (digit.isNegative()) {
                digit = base.minus(digit).abs();
                left = left.next();
            }
            out.push(digit.toJSNumber());
        }
        out.push(left.toJSNumber());
        return { value: out.reverse(), isNegative: neg };
    }

    function toBaseString(n, base, alphabet) {
        var arr = toBase(n, base);
        return (arr.isNegative ? "-" : "") + arr.value.map(function (x) {
            return stringify(x, alphabet);
        }).join('');
    }

    BigInteger.prototype.toArray = function (radix) {
        return toBase(this, radix);
    };

    SmallInteger.prototype.toArray = function (radix) {
        return toBase(this, radix);
    };

    NativeBigInt.prototype.toArray = function (radix) {
        return toBase(this, radix);
    };

    BigInteger.prototype.toString = function (radix, alphabet) {
        if (radix === undefined) radix = 10;
        if (radix !== 10) return toBaseString(this, radix, alphabet);
        var v = this.value, l = v.length, str = String(v[--l]), zeros = "0000000", digit;
        while (--l >= 0) {
            digit = String(v[l]);
            str += zeros.slice(digit.length) + digit;
        }
        var sign = this.sign ? "-" : "";
        return sign + str;
    };

    SmallInteger.prototype.toString = function (radix, alphabet) {
        if (radix === undefined) radix = 10;
        if (radix != 10) return toBaseString(this, radix, alphabet);
        return String(this.value);
    };

    NativeBigInt.prototype.toString = SmallInteger.prototype.toString;

    NativeBigInt.prototype.toJSON = BigInteger.prototype.toJSON = SmallInteger.prototype.toJSON = function () { return this.toString(); }

    BigInteger.prototype.valueOf = function () {
        return parseInt(this.toString(), 10);
    };
    BigInteger.prototype.toJSNumber = BigInteger.prototype.valueOf;

    SmallInteger.prototype.valueOf = function () {
        return this.value;
    };
    SmallInteger.prototype.toJSNumber = SmallInteger.prototype.valueOf;
    NativeBigInt.prototype.valueOf = NativeBigInt.prototype.toJSNumber = function () {
        return parseInt(this.toString(), 10);
    }

    function parseStringValue(v) {
        if (isPrecise(+v)) {
            var x = +v;
            if (x === truncate(x))
                return supportsNativeBigInt ? new NativeBigInt(BigInt(x)) : new SmallInteger(x);
            throw new Error("Invalid integer: " + v);
        }
        var sign = v[0] === "-";
        if (sign) v = v.slice(1);
        var split = v.split(/e/i);
        if (split.length > 2) throw new Error("Invalid integer: " + split.join("e"));
        if (split.length === 2) {
            var exp = split[1];
            if (exp[0] === "+") exp = exp.slice(1);
            exp = +exp;
            if (exp !== truncate(exp) || !isPrecise(exp)) throw new Error("Invalid integer: " + exp + " is not a valid exponent.");
            var text = split[0];
            var decimalPlace = text.indexOf(".");
            if (decimalPlace >= 0) {
                exp -= text.length - decimalPlace - 1;
                text = text.slice(0, decimalPlace) + text.slice(decimalPlace + 1);
            }
            if (exp < 0) throw new Error("Cannot include negative exponent part for integers");
            text += (new Array(exp + 1)).join("0");
            v = text;
        }
        var isValid = /^([0-9][0-9]*)$/.test(v);
        if (!isValid) throw new Error("Invalid integer: " + v);
        if (supportsNativeBigInt) {
            return new NativeBigInt(BigInt(sign ? "-" + v : v));
        }
        var r = [], max = v.length, l = LOG_BASE, min = max - l;
        while (max > 0) {
            r.push(+v.slice(min, max));
            min -= l;
            if (min < 0) min = 0;
            max -= l;
        }
        trim(r);
        return new BigInteger(r, sign);
    }

    function parseNumberValue(v) {
        if (supportsNativeBigInt) {
            return new NativeBigInt(BigInt(v));
        }
        if (isPrecise(v)) {
            if (v !== truncate(v)) throw new Error(v + " is not an integer.");
            return new SmallInteger(v);
        }
        return parseStringValue(v.toString());
    }

    function parseValue(v) {
        if (typeof v === "number") {
            return parseNumberValue(v);
        }
        if (typeof v === "string") {
            return parseStringValue(v);
        }
        if (typeof v === "bigint") {
            return new NativeBigInt(v);
        }
        return v;
    }
    // Pre-define numbers in range [-999,999]
    for (var i = 0; i < 1000; i++) {
        Integer[i] = parseValue(i);
        if (i > 0) Integer[-i] = parseValue(-i);
    }
    // Backwards compatibility
    Integer.one = Integer[1];
    Integer.zero = Integer[0];
    Integer.minusOne = Integer[-1];
    Integer.max = max;
    Integer.min = min;
    Integer.gcd = gcd;
    Integer.lcm = lcm;
    Integer.isInstance = function (x) { return x instanceof BigInteger || x instanceof SmallInteger || x instanceof NativeBigInt; };
    Integer.randBetween = randBetween;

    Integer.fromArray = function (digits, base, isNegative) {
        return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative);
    };

    return Integer;
})();

// Node.js check
if (typeof module !== "undefined" && module.hasOwnProperty("exports")) {
    module.exports = bigInt;
}

//amd check
if (typeof define === "function" && define.amd) {
    define( function () {
        return bigInt;
    });
}
var bigInt=function(undefined){"use strict";var BASE=1e7,LOG_BASE=7,MAX_INT=9007199254740992,MAX_INT_ARR=smallToArray(MAX_INT),DEFAULT_ALPHABET="0123456789abcdefghijklmnopqrstuvwxyz";var supportsNativeBigInt=typeof BigInt==="function";function Integer(v,radix,alphabet,caseSensitive){if(typeof v==="undefined")return Integer[0];if(typeof radix!=="undefined")return+radix===10&&!alphabet?parseValue(v):parseBase(v,radix,alphabet,caseSensitive);return parseValue(v)}function BigInteger(value,sign){this.value=value;this.sign=sign;this.isSmall=false}BigInteger.prototype=Object.create(Integer.prototype);function SmallInteger(value){this.value=value;this.sign=value<0;this.isSmall=true}SmallInteger.prototype=Object.create(Integer.prototype);function NativeBigInt(value){this.value=value}NativeBigInt.prototype=Object.create(Integer.prototype);function isPrecise(n){return-MAX_INT<n&&n<MAX_INT}function smallToArray(n){if(n<1e7)return[n];if(n<1e14)return[n%1e7,Math.floor(n/1e7)];return[n%1e7,Math.floor(n/1e7)%1e7,Math.floor(n/1e14)]}function arrayToSmall(arr){trim(arr);var length=arr.length;if(length<4&&compareAbs(arr,MAX_INT_ARR)<0){switch(length){case 0:return 0;case 1:return arr[0];case 2:return arr[0]+arr[1]*BASE;default:return arr[0]+(arr[1]+arr[2]*BASE)*BASE}}return arr}function trim(v){var i=v.length;while(v[--i]===0);v.length=i+1}function createArray(length){var x=new Array(length);var i=-1;while(++i<length){x[i]=0}return x}function truncate(n){if(n>0)return Math.floor(n);return Math.ceil(n)}function add(a,b){var l_a=a.length,l_b=b.length,r=new Array(l_a),carry=0,base=BASE,sum,i;for(i=0;i<l_b;i++){sum=a[i]+b[i]+carry;carry=sum>=base?1:0;r[i]=sum-carry*base}while(i<l_a){sum=a[i]+carry;carry=sum===base?1:0;r[i++]=sum-carry*base}if(carry>0)r.push(carry);return r}function addAny(a,b){if(a.length>=b.length)return add(a,b);return add(b,a)}function addSmall(a,carry){var l=a.length,r=new Array(l),base=BASE,sum,i;for(i=0;i<l;i++){sum=a[i]-base+carry;carry=Math.floor(sum/base);r[i]=sum-carry*base;carry+=1}while(carry>0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}BigInteger.prototype.add=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.subtract(n.negate())}var a=this.value,b=n.value;if(n.isSmall){return new BigInteger(addSmall(a,Math.abs(b)),this.sign)}return new BigInteger(addAny(a,b),this.sign)};BigInteger.prototype.plus=BigInteger.prototype.add;SmallInteger.prototype.add=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.subtract(n.negate())}var b=n.value;if(n.isSmall){if(isPrecise(a+b))return new SmallInteger(a+b);b=smallToArray(Math.abs(b))}return new BigInteger(addSmall(b,Math.abs(a)),a<0)};SmallInteger.prototype.plus=SmallInteger.prototype.add;NativeBigInt.prototype.add=function(v){return new NativeBigInt(this.value+parseValue(v).value)};NativeBigInt.prototype.plus=NativeBigInt.prototype.add;function subtract(a,b){var a_l=a.length,b_l=b.length,r=new Array(a_l),borrow=0,base=BASE,i,difference;for(i=0;i<b_l;i++){difference=a[i]-borrow-b[i];if(difference<0){difference+=base;borrow=1}else borrow=0;r[i]=difference}for(i=b_l;i<a_l;i++){difference=a[i]-borrow;if(difference<0)difference+=base;else{r[i++]=difference;break}r[i]=difference}for(;i<a_l;i++){r[i]=a[i]}trim(r);return r}function subtractAny(a,b,sign){var value;if(compareAbs(a,b)>=0){value=subtract(a,b)}else{value=subtract(b,a);sign=!sign}value=arrayToSmall(value);if(typeof value==="number"){if(sign)value=-value;return new SmallInteger(value)}return new BigInteger(value,sign)}function subtractSmall(a,b,sign){var l=a.length,r=new Array(l),carry=-b,base=BASE,i,difference;for(i=0;i<l;i++){difference=a[i]+carry;carry=Math.floor(difference/base);difference%=base;r[i]=difference<0?difference+base:difference}r=arrayToSmall(r);if(typeof r==="number"){if(sign)r=-r;return new SmallInteger(r)}return new BigInteger(r,sign)}BigInteger.prototype.subtract=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.add(n.negate())}var a=this.value,b=n.value;if(n.isSmall)return subtractSmall(a,Math.abs(b),this.sign);return subtractAny(a,b,this.sign)};BigInteger.prototype.minus=BigInteger.prototype.subtract;SmallInteger.prototype.subtract=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.add(n.negate())}var b=n.value;if(n.isSmall){return new SmallInteger(a-b)}return subtractSmall(b,Math.abs(a),a>=0)};SmallInteger.prototype.minus=SmallInteger.prototype.subtract;NativeBigInt.prototype.subtract=function(v){return new NativeBigInt(this.value-parseValue(v).value)};NativeBigInt.prototype.minus=NativeBigInt.prototype.subtract;BigInteger.prototype.negate=function(){return new BigInteger(this.value,!this.sign)};SmallInteger.prototype.negate=function(){var sign=this.sign;var small=new SmallInteger(-this.value);small.sign=!sign;return small};NativeBigInt.prototype.negate=function(){return new NativeBigInt(-this.value)};BigInteger.prototype.abs=function(){return new BigInteger(this.value,false)};SmallInteger.prototype.abs=function(){return new SmallInteger(Math.abs(this.value))};NativeBigInt.prototype.abs=function(){return new NativeBigInt(this.value>=0?this.value:-this.value)};function multiplyLong(a,b){var a_l=a.length,b_l=b.length,l=a_l+b_l,r=createArray(l),base=BASE,product,carry,i,a_i,b_j;for(i=0;i<a_l;++i){a_i=a[i];for(var j=0;j<b_l;++j){b_j=b[j];product=a_i*b_j+r[i+j];carry=Math.floor(product/base);r[i+j]=product-carry*base;r[i+j+1]+=carry}}trim(r);return r}function multiplySmall(a,b){var l=a.length,r=new Array(l),base=BASE,carry=0,product,i;for(i=0;i<l;i++){product=a[i]*b+carry;carry=Math.floor(product/base);r[i]=product-carry*base}while(carry>0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}function shiftLeft(x,n){var r=[];while(n-- >0)r.push(0);return r.concat(x)}function multiplyKaratsuba(x,y){var n=Math.max(x.length,y.length);if(n<=30)return multiplyLong(x,y);n=Math.ceil(n/2);var b=x.slice(n),a=x.slice(0,n),d=y.slice(n),c=y.slice(0,n);var ac=multiplyKaratsuba(a,c),bd=multiplyKaratsuba(b,d),abcd=multiplyKaratsuba(addAny(a,b),addAny(c,d));var product=addAny(addAny(ac,shiftLeft(subtract(subtract(abcd,ac),bd),n)),shiftLeft(bd,2*n));trim(product);return product}function useKaratsuba(l1,l2){return-.012*l1-.012*l2+15e-6*l1*l2>0}BigInteger.prototype.multiply=function(v){var n=parseValue(v),a=this.value,b=n.value,sign=this.sign!==n.sign,abs;if(n.isSmall){if(b===0)return Integer[0];if(b===1)return this;if(b===-1)return this.negate();abs=Math.abs(b);if(abs<BASE){return new BigInteger(multiplySmall(a,abs),sign)}b=smallToArray(abs)}if(useKaratsuba(a.length,b.length))return new BigInteger(multiplyKaratsuba(a,b),sign);return new BigInteger(multiplyLong(a,b),sign)};BigInteger.prototype.times=BigInteger.prototype.multiply;function multiplySmallAndArray(a,b,sign){if(a<BASE){return new BigInteger(multiplySmall(b,a),sign)}return new BigInteger(multiplyLong(b,smallToArray(a)),sign)}SmallInteger.prototype._multiplyBySmall=function(a){if(isPrecise(a.value*this.value)){return new SmallInteger(a.value*this.value)}return multiplySmallAndArray(Math.abs(a.value),smallToArray(Math.abs(this.value)),this.sign!==a.sign)};BigInteger.prototype._multiplyBySmall=function(a){if(a.value===0)return Integer[0];if(a.value===1)return this;if(a.value===-1)return this.negate();return multiplySmallAndArray(Math.abs(a.value),this.value,this.sign!==a.sign)};SmallInteger.prototype.multiply=function(v){return parseValue(v)._multiplyBySmall(this)};SmallInteger.prototype.times=SmallInteger.prototype.multiply;NativeBigInt.prototype.multiply=function(v){return new NativeBigInt(this.value*parseValue(v).value)};NativeBigInt.prototype.times=NativeBigInt.prototype.multiply;function square(a){var l=a.length,r=createArray(l+l),base=BASE,product,carry,i,a_i,a_j;for(i=0;i<l;i++){a_i=a[i];carry=0-a_i*a_i;for(var j=i;j<l;j++){a_j=a[j];product=2*(a_i*a_j)+r[i+j]+carry;carry=Math.floor(product/base);r[i+j]=product-carry*base}r[i+l]=carry}trim(r);return r}BigInteger.prototype.square=function(){return new BigInteger(square(this.value),false)};SmallInteger.prototype.square=function(){var value=this.value*this.value;if(isPrecise(value))return new SmallInteger(value);return new BigInteger(square(smallToArray(Math.abs(this.value))),false)};NativeBigInt.prototype.square=function(v){return new NativeBigInt(this.value*this.value)};function divMod1(a,b){var a_l=a.length,b_l=b.length,base=BASE,result=createArray(b.length),divisorMostSignificantDigit=b[b_l-1],lambda=Math.ceil(base/(2*divisorMostSignificantDigit)),remainder=multiplySmall(a,lambda),divisor=multiplySmall(b,lambda),quotientDigit,shift,carry,borrow,i,l,q;if(remainder.length<=a_l)remainder.push(0);divisor.push(0);divisorMostSignificantDigit=divisor[b_l-1];for(shift=a_l-b_l;shift>=0;shift--){quotientDigit=base-1;if(remainder[shift+b_l]!==divisorMostSignificantDigit){quotientDigit=Math.floor((remainder[shift+b_l]*base+remainder[shift+b_l-1])/divisorMostSignificantDigit)}carry=0;borrow=0;l=divisor.length;for(i=0;i<l;i++){carry+=quotientDigit*divisor[i];q=Math.floor(carry/base);borrow+=remainder[shift+i]-(carry-q*base);carry=q;if(borrow<0){remainder[shift+i]=borrow+base;borrow=-1}else{remainder[shift+i]=borrow;borrow=0}}while(borrow!==0){quotientDigit-=1;carry=0;for(i=0;i<l;i++){carry+=remainder[shift+i]-base+divisor[i];if(carry<0){remainder[shift+i]=carry+base;carry=0}else{remainder[shift+i]=carry;carry=1}}borrow+=carry}result[shift]=quotientDigit}remainder=divModSmall(remainder,lambda)[0];return[arrayToSmall(result),arrayToSmall(remainder)]}function divMod2(a,b){var a_l=a.length,b_l=b.length,result=[],part=[],base=BASE,guess,xlen,highx,highy,check;while(a_l){part.unshift(a[--a_l]);trim(part);if(compareAbs(part,b)<0){result.push(0);continue}xlen=part.length;highx=part[xlen-1]*base+part[xlen-2];highy=b[b_l-1]*base+b[b_l-2];if(xlen>b_l){highx=(highx+1)*base}guess=Math.ceil(highx/highy);do{check=multiplySmall(b,guess);if(compareAbs(check,part)<=0)break;guess--}while(guess);result.push(guess);part=subtract(part,check)}result.reverse();return[arrayToSmall(result),arrayToSmall(part)]}function divModSmall(value,lambda){var length=value.length,quotient=createArray(length),base=BASE,i,q,remainder,divisor;remainder=0;for(i=length-1;i>=0;--i){divisor=remainder*base+value[i];q=truncate(divisor/lambda);remainder=divisor-q*lambda;quotient[i]=q|0}return[quotient,remainder|0]}function divModAny(self,v){var value,n=parseValue(v);if(supportsNativeBigInt){return[new NativeBigInt(self.value/n.value),new NativeBigInt(self.value%n.value)]}var a=self.value,b=n.value;var quotient;if(b===0)throw new Error("Cannot divide by zero");if(self.isSmall){if(n.isSmall){return[new SmallInteger(truncate(a/b)),new SmallInteger(a%b)]}return[Integer[0],self]}if(n.isSmall){if(b===1)return[self,Integer[0]];if(b==-1)return[self.negate(),Integer[0]];var abs=Math.abs(b);if(abs<BASE){value=divModSmall(a,abs);quotient=arrayToSmall(value[0]);var remainder=value[1];if(self.sign)remainder=-remainder;if(typeof quotient==="number"){if(self.sign!==n.sign)quotient=-quotient;return[new SmallInteger(quotient),new SmallInteger(remainder)]}return[new BigInteger(quotient,self.sign!==n.sign),new SmallInteger(remainder)]}b=smallToArray(abs)}var comparison=compareAbs(a,b);if(comparison===-1)return[Integer[0],self];if(comparison===0)return[Integer[self.sign===n.sign?1:-1],Integer[0]];if(a.length+b.length<=200)value=divMod1(a,b);else value=divMod2(a,b);quotient=value[0];var qSign=self.sign!==n.sign,mod=value[1],mSign=self.sign;if(typeof quotient==="number"){if(qSign)quotient=-quotient;quotient=new SmallInteger(quotient)}else quotient=new BigInteger(quotient,qSign);if(typeof mod==="number"){if(mSign)mod=-mod;mod=new SmallInteger(mod)}else mod=new BigInteger(mod,mSign);return[quotient,mod]}BigInteger.prototype.divmod=function(v){var result=divModAny(this,v);return{quotient:result[0],remainder:result[1]}};NativeBigInt.prototype.divmod=SmallInteger.prototype.divmod=BigInteger.prototype.divmod;BigInteger.prototype.divide=function(v){return divModAny(this,v)[0]};NativeBigInt.prototype.over=NativeBigInt.prototype.divide=function(v){return new NativeBigInt(this.value/parseValue(v).value)};SmallInteger.prototype.over=SmallInteger.prototype.divide=BigInteger.prototype.over=BigInteger.prototype.divide;BigInteger.prototype.mod=function(v){return divModAny(this,v)[1]};NativeBigInt.prototype.mod=NativeBigInt.prototype.remainder=function(v){return new NativeBigInt(this.value%parseValue(v).value)};SmallInteger.prototype.remainder=SmallInteger.prototype.mod=BigInteger.prototype.remainder=BigInteger.prototype.mod;BigInteger.prototype.pow=function(v){var n=parseValue(v),a=this.value,b=n.value,value,x,y;if(b===0)return Integer[1];if(a===0)return Integer[0];if(a===1)return Integer[1];if(a===-1)return n.isEven()?Integer[1]:Integer[-1];if(n.sign){return Integer[0]}if(!n.isSmall)throw new Error("The exponent "+n.toString()+" is too large.");if(this.isSmall){if(isPrecise(value=Math.pow(a,b)))return new SmallInteger(truncate(value))}x=this;y=Integer[1];while(true){if(b&1===1){y=y.times(x);--b}if(b===0)break;b/=2;x=x.square()}return y};SmallInteger.prototype.pow=BigInteger.prototype.pow;NativeBigInt.prototype.pow=function(v){var n=parseValue(v);var a=this.value,b=n.value;var _0=BigInt(0),_1=BigInt(1),_2=BigInt(2);if(b===_0)return Integer[1];if(a===_0)return Integer[0];if(a===_1)return Integer[1];if(a===BigInt(-1))return n.isEven()?Integer[1]:Integer[-1];if(n.isNegative())return new NativeBigInt(_0);var x=this;var y=Integer[1];while(true){if((b&_1)===_1){y=y.times(x);--b}if(b===_0)break;b/=_2;x=x.square()}return y};BigInteger.prototype.modPow=function(exp,mod){exp=parseValue(exp);mod=parseValue(mod);if(mod.isZero())throw new Error("Cannot take modPow with modulus 0");var r=Integer[1],base=this.mod(mod);if(exp.isNegative()){exp=exp.multiply(Integer[-1]);base=base.modInv(mod)}while(exp.isPositive()){if(base.isZero())return Integer[0];if(exp.isOdd())r=r.multiply(base).mod(mod);exp=exp.divide(2);base=base.square().mod(mod)}return r};NativeBigInt.prototype.modPow=SmallInteger.prototype.modPow=BigInteger.prototype.modPow;function compareAbs(a,b){if(a.length!==b.length){return a.length>b.length?1:-1}for(var i=a.length-1;i>=0;i--){if(a[i]!==b[i])return a[i]>b[i]?1:-1}return 0}BigInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall)return 1;return compareAbs(a,b)};SmallInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=Math.abs(this.value),b=n.value;if(n.isSmall){b=Math.abs(b);return a===b?0:a>b?1:-1}return-1};NativeBigInt.prototype.compareAbs=function(v){var a=this.value;var b=parseValue(v).value;a=a>=0?a:-a;b=b>=0?b:-b;return a===b?0:a>b?1:-1};BigInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(this.sign!==n.sign){return n.sign?1:-1}if(n.isSmall){return this.sign?-1:1}return compareAbs(a,b)*(this.sign?-1:1)};BigInteger.prototype.compareTo=BigInteger.prototype.compare;SmallInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall){return a==b?0:a>b?1:-1}if(a<0!==n.sign){return a<0?-1:1}return a<0?1:-1};SmallInteger.prototype.compareTo=SmallInteger.prototype.compare;NativeBigInt.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var a=this.value;var b=parseValue(v).value;return a===b?0:a>b?1:-1};NativeBigInt.prototype.compareTo=NativeBigInt.prototype.compare;BigInteger.prototype.equals=function(v){return this.compare(v)===0};NativeBigInt.prototype.eq=NativeBigInt.prototype.equals=SmallInteger.prototype.eq=SmallInteger.prototype.equals=BigInteger.prototype.eq=BigInteger.prototype.equals;BigInteger.prototype.notEquals=function(v){return this.compare(v)!==0};NativeBigInt.prototype.neq=NativeBigInt.prototype.notEquals=SmallInteger.prototype.neq=SmallInteger.prototype.notEquals=BigInteger.prototype.neq=BigInteger.prototype.notEquals;BigInteger.prototype.greater=function(v){return this.compare(v)>0};NativeBigInt.prototype.gt=NativeBigInt.prototype.greater=SmallInteger.prototype.gt=SmallInteger.prototype.greater=BigInteger.prototype.gt=BigInteger.prototype.greater;BigInteger.prototype.lesser=function(v){return this.compare(v)<0};NativeBigInt.prototype.lt=NativeBigInt.prototype.lesser=SmallInteger.prototype.lt=SmallInteger.prototype.lesser=BigInteger.prototype.lt=BigInteger.prototype.lesser;BigInteger.prototype.greaterOrEquals=function(v){return this.compare(v)>=0};NativeBigInt.prototype.geq=NativeBigInt.prototype.greaterOrEquals=SmallInteger.prototype.geq=SmallInteger.prototype.greaterOrEquals=BigInteger.prototype.geq=BigInteger.prototype.greaterOrEquals;BigInteger.prototype.lesserOrEquals=function(v){return this.compare(v)<=0};NativeBigInt.prototype.leq=NativeBigInt.prototype.lesserOrEquals=SmallInteger.prototype.leq=SmallInteger.prototype.lesserOrEquals=BigInteger.prototype.leq=BigInteger.prototype.lesserOrEquals;BigInteger.prototype.isEven=function(){return(this.value[0]&1)===0};SmallInteger.prototype.isEven=function(){return(this.value&1)===0};NativeBigInt.prototype.isEven=function(){return(this.value&BigInt(1))===BigInt(0)};BigInteger.prototype.isOdd=function(){return(this.value[0]&1)===1};SmallInteger.prototype.isOdd=function(){return(this.value&1)===1};NativeBigInt.prototype.isOdd=function(){return(this.value&BigInt(1))===BigInt(1)};BigInteger.prototype.isPositive=function(){return!this.sign};SmallInteger.prototype.isPositive=function(){return this.value>0};NativeBigInt.prototype.isPositive=SmallInteger.prototype.isPositive;BigInteger.prototype.isNegative=function(){return this.sign};SmallInteger.prototype.isNegative=function(){return this.value<0};NativeBigInt.prototype.isNegative=SmallInteger.prototype.isNegative;BigInteger.prototype.isUnit=function(){return false};SmallInteger.prototype.isUnit=function(){return Math.abs(this.value)===1};NativeBigInt.prototype.isUnit=function(){return this.abs().value===BigInt(1)};BigInteger.prototype.isZero=function(){return false};SmallInteger.prototype.isZero=function(){return this.value===0};NativeBigInt.prototype.isZero=function(){return this.value===BigInt(0)};BigInteger.prototype.isDivisibleBy=function(v){var n=parseValue(v);if(n.isZero())return false;if(n.isUnit())return true;if(n.compareAbs(2)===0)return this.isEven();return this.mod(n).isZero()};NativeBigInt.prototype.isDivisibleBy=SmallInteger.prototype.isDivisibleBy=BigInteger.prototype.isDivisibleBy;function isBasicPrime(v){var n=v.abs();if(n.isUnit())return false;if(n.equals(2)||n.equals(3)||n.equals(5))return true;if(n.isEven()||n.isDivisibleBy(3)||n.isDivisibleBy(5))return false;if(n.lesser(49))return true}function millerRabinTest(n,a){var nPrev=n.prev(),b=nPrev,r=0,d,t,i,x;while(b.isEven())b=b.divide(2),r++;next:for(i=0;i<a.length;i++){if(n.lesser(a[i]))continue;x=bigInt(a[i]).modPow(b,n);if(x.isUnit()||x.equals(nPrev))continue;for(d=r-1;d!=0;d--){x=x.square().mod(n);if(x.isUnit())return false;if(x.equals(nPrev))continue next}return false}return true}BigInteger.prototype.isPrime=function(strict){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs();var bits=n.bitLength();if(bits<=64)return millerRabinTest(n,[2,3,5,7,11,13,17,19,23,29,31,37]);var logN=Math.log(2)*bits.toJSNumber();var t=Math.ceil(strict===true?2*Math.pow(logN,2):logN);for(var a=[],i=0;i<t;i++){a.push(bigInt(i+2))}return millerRabinTest(n,a)};NativeBigInt.prototype.isPrime=SmallInteger.prototype.isPrime=BigInteger.prototype.isPrime;BigInteger.prototype.isProbablePrime=function(iterations,rng){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs();var t=iterations===undefined?5:iterations;for(var a=[],i=0;i<t;i++){a.push(bigInt.randBetween(2,n.minus(2),rng))}return millerRabinTest(n,a)};NativeBigInt.prototype.isProbablePrime=SmallInteger.prototype.isProbablePrime=BigInteger.prototype.isProbablePrime;BigInteger.prototype.modInv=function(n){var t=bigInt.zero,newT=bigInt.one,r=parseValue(n),newR=this.abs(),q,lastT,lastR;while(!newR.isZero()){q=r.divide(newR);lastT=t;lastR=r;t=newT;r=newR;newT=lastT.subtract(q.multiply(newT));newR=lastR.subtract(q.multiply(newR))}if(!r.isUnit())throw new Error(this.toString()+" and "+n.toString()+" are not co-prime");if(t.compare(0)===-1){t=t.add(n)}if(this.isNegative()){return t.negate()}return t};NativeBigInt.prototype.modInv=SmallInteger.prototype.modInv=BigInteger.prototype.modInv;BigInteger.prototype.next=function(){var value=this.value;if(this.sign){return subtractSmall(value,1,this.sign)}return new BigInteger(addSmall(value,1),this.sign)};SmallInteger.prototype.next=function(){var value=this.value;if(value+1<MAX_INT)return new SmallInteger(value+1);return new BigInteger(MAX_INT_ARR,false)};NativeBigInt.prototype.next=function(){return new NativeBigInt(this.value+BigInt(1))};BigInteger.prototype.prev=function(){var value=this.value;if(this.sign){return new BigInteger(addSmall(value,1),true)}return subtractSmall(value,1,this.sign)};SmallInteger.prototype.prev=function(){var value=this.value;if(value-1>-MAX_INT)return new SmallInteger(value-1);return new BigInteger(MAX_INT_ARR,true)};NativeBigInt.prototype.prev=function(){return new NativeBigInt(this.value-BigInt(1))};var powersOfTwo=[1];while(2*powersOfTwo[powersOfTwo.length-1]<=BASE)powersOfTwo.push(2*powersOfTwo[powersOfTwo.length-1]);var powers2Length=powersOfTwo.length,highestPower2=powersOfTwo[powers2Length-1];function shift_isSmall(n){return Math.abs(n)<=BASE}BigInteger.prototype.shiftLeft=function(v){var n=parseValue(v).toJSNumber();if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}if(n<0)return this.shiftRight(-n);var result=this;if(result.isZero())return result;while(n>=powers2Length){result=result.multiply(highestPower2);n-=powers2Length-1}return result.multiply(powersOfTwo[n])};NativeBigInt.prototype.shiftLeft=SmallInteger.prototype.shiftLeft=BigInteger.prototype.shiftLeft;BigInteger.prototype.shiftRight=function(v){var remQuo;var n=parseValue(v).toJSNumber();if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}if(n<0)return this.shiftLeft(-n);var result=this;while(n>=powers2Length){if(result.isZero()||result.isNegative()&&result.isUnit())return result;remQuo=divModAny(result,highestPower2);result=remQuo[1].isNegative()?remQuo[0].prev():remQuo[0];n-=powers2Length-1}remQuo=divModAny(result,powersOfTwo[n]);return remQuo[1].isNegative()?remQuo[0].prev():remQuo[0]};NativeBigInt.prototype.shiftRight=SmallInteger.prototype.shiftRight=BigInteger.prototype.shiftRight;function bitwise(x,y,fn){y=parseValue(y);var xSign=x.isNegative(),ySign=y.isNegative();var xRem=xSign?x.not():x,yRem=ySign?y.not():y;var xDigit=0,yDigit=0;var xDivMod=null,yDivMod=null;var result=[];while(!xRem.isZero()||!yRem.isZero()){xDivMod=divModAny(xRem,highestPower2);xDigit=xDivMod[1].toJSNumber();if(xSign){xDigit=highestPower2-1-xDigit}yDivMod=divModAny(yRem,highestPower2);yDigit=yDivMod[1].toJSNumber();if(ySign){yDigit=highestPower2-1-yDigit}xRem=xDivMod[0];yRem=yDivMod[0];result.push(fn(xDigit,yDigit))}var sum=fn(xSign?1:0,ySign?1:0)!==0?bigInt(-1):bigInt(0);for(var i=result.length-1;i>=0;i-=1){sum=sum.multiply(highestPower2).add(bigInt(result[i]))}return sum}BigInteger.prototype.not=function(){return this.negate().prev()};NativeBigInt.prototype.not=SmallInteger.prototype.not=BigInteger.prototype.not;BigInteger.prototype.and=function(n){return bitwise(this,n,function(a,b){return a&b})};NativeBigInt.prototype.and=SmallInteger.prototype.and=BigInteger.prototype.and;BigInteger.prototype.or=function(n){return bitwise(this,n,function(a,b){return a|b})};NativeBigInt.prototype.or=SmallInteger.prototype.or=BigInteger.prototype.or;BigInteger.prototype.xor=function(n){return bitwise(this,n,function(a,b){return a^b})};NativeBigInt.prototype.xor=SmallInteger.prototype.xor=BigInteger.prototype.xor;var LOBMASK_I=1<<30,LOBMASK_BI=(BASE&-BASE)*(BASE&-BASE)|LOBMASK_I;function roughLOB(n){var v=n.value,x=typeof v==="number"?v|LOBMASK_I:typeof v==="bigint"?v|BigInt(LOBMASK_I):v[0]+v[1]*BASE|LOBMASK_BI;return x&-x}function integerLogarithm(value,base){if(base.compareTo(value)<=0){var tmp=integerLogarithm(value,base.square(base));var p=tmp.p;var e=tmp.e;var t=p.multiply(base);return t.compareTo(value)<=0?{p:t,e:e*2+1}:{p:p,e:e*2}}return{p:bigInt(1),e:0}}BigInteger.prototype.bitLength=function(){var n=this;if(n.compareTo(bigInt(0))<0){n=n.negate().subtract(bigInt(1))}if(n.compareTo(bigInt(0))===0){return bigInt(0)}return bigInt(integerLogarithm(n,bigInt(2)).e).add(bigInt(1))};NativeBigInt.prototype.bitLength=SmallInteger.prototype.bitLength=BigInteger.prototype.bitLength;function max(a,b){a=parseValue(a);b=parseValue(b);return a.greater(b)?a:b}function min(a,b){a=parseValue(a);b=parseValue(b);return a.lesser(b)?a:b}function gcd(a,b){a=parseValue(a).abs();b=parseValue(b).abs();if(a.equals(b))return a;if(a.isZero())return b;if(b.isZero())return a;var c=Integer[1],d,t;while(a.isEven()&&b.isEven()){d=min(roughLOB(a),roughLOB(b));a=a.divide(d);b=b.divide(d);c=c.multiply(d)}while(a.isEven()){a=a.divide(roughLOB(a))}do{while(b.isEven()){b=b.divide(roughLOB(b))}if(a.greater(b)){t=b;b=a;a=t}b=b.subtract(a)}while(!b.isZero());return c.isUnit()?a:a.multiply(c)}function lcm(a,b){a=parseValue(a).abs();b=parseValue(b).abs();return a.divide(gcd(a,b)).multiply(b)}function randBetween(a,b,rng){a=parseValue(a);b=parseValue(b);var usedRNG=rng||Math.random;var low=min(a,b),high=max(a,b);var range=high.subtract(low).add(1);if(range.isSmall)return low.add(Math.floor(usedRNG()*range));var digits=toBase(range,BASE).value;var result=[],restricted=true;for(var i=0;i<digits.length;i++){var top=restricted?digits[i]:BASE;var digit=truncate(usedRNG()*top);result.push(digit);if(digit<top)restricted=false}return low.add(Integer.fromArray(result,BASE,false))}var parseBase=function(text,base,alphabet,caseSensitive){alphabet=alphabet||DEFAULT_ALPHABET;text=String(text);if(!caseSensitive){text=text.toLowerCase();alphabet=alphabet.toLowerCase()}var length=text.length;var i;var absBase=Math.abs(base);var alphabetValues={};for(i=0;i<alphabet.length;i++){alphabetValues[alphabet[i]]=i}for(i=0;i<length;i++){var c=text[i];if(c==="-")continue;if(c in alphabetValues){if(alphabetValues[c]>=absBase){if(c==="1"&&absBase===1)continue;throw new Error(c+" is not a valid digit in base "+base+".")}}}base=parseValue(base);var digits=[];var isNegative=text[0]==="-";for(i=isNegative?1:0;i<text.length;i++){var c=text[i];if(c in alphabetValues)digits.push(parseValue(alphabetValues[c]));else if(c==="<"){var start=i;do{i++}while(text[i]!==">"&&i<text.length);digits.push(parseValue(text.slice(start+1,i)))}else throw new Error(c+" is not a valid character")}return parseBaseFromArray(digits,base,isNegative)};function parseBaseFromArray(digits,base,isNegative){var val=Integer[0],pow=Integer[1],i;for(i=digits.length-1;i>=0;i--){val=val.add(digits[i].times(pow));pow=pow.times(base)}return isNegative?val.negate():val}function stringify(digit,alphabet){alphabet=alphabet||DEFAULT_ALPHABET;if(digit<alphabet.length){return alphabet[digit]}return"<"+digit+">"}function toBase(n,base){base=bigInt(base);if(base.isZero()){if(n.isZero())return{value:[0],isNegative:false};throw new Error("Cannot convert nonzero numbers to base 0.")}if(base.equals(-1)){if(n.isZero())return{value:[0],isNegative:false};if(n.isNegative())return{value:[].concat.apply([],Array.apply(null,Array(-n.toJSNumber())).map(Array.prototype.valueOf,[1,0])),isNegative:false};var arr=Array.apply(null,Array(n.toJSNumber()-1)).map(Array.prototype.valueOf,[0,1]);arr.unshift([1]);return{value:[].concat.apply([],arr),isNegative:false}}var neg=false;if(n.isNegative()&&base.isPositive()){neg=true;n=n.abs()}if(base.isUnit()){if(n.isZero())return{value:[0],isNegative:false};return{value:Array.apply(null,Array(n.toJSNumber())).map(Number.prototype.valueOf,1),isNegative:neg}}var out=[];var left=n,divmod;while(left.isNegative()||left.compareAbs(base)>=0){divmod=left.divmod(base);left=divmod.quotient;var digit=divmod.remainder;if(digit.isNegative()){digit=base.minus(digit).abs();left=left.next()}out.push(digit.toJSNumber())}out.push(left.toJSNumber());return{value:out.reverse(),isNegative:neg}}function toBaseString(n,base,alphabet){var arr=toBase(n,base);return(arr.isNegative?"-":"")+arr.value.map(function(x){return stringify(x,alphabet)}).join("")}BigInteger.prototype.toArray=function(radix){return toBase(this,radix)};SmallInteger.prototype.toArray=function(radix){return toBase(this,radix)};NativeBigInt.prototype.toArray=function(radix){return toBase(this,radix)};BigInteger.prototype.toString=function(radix,alphabet){if(radix===undefined)radix=10;if(radix!==10)return toBaseString(this,radix,alphabet);var v=this.value,l=v.length,str=String(v[--l]),zeros="0000000",digit;while(--l>=0){digit=String(v[l]);str+=zeros.slice(digit.length)+digit}var sign=this.sign?"-":"";return sign+str};SmallInteger.prototype.toString=function(radix,alphabet){if(radix===undefined)radix=10;if(radix!=10)return toBaseString(this,radix,alphabet);return String(this.value)};NativeBigInt.prototype.toString=SmallInteger.prototype.toString;NativeBigInt.prototype.toJSON=BigInteger.prototype.toJSON=SmallInteger.prototype.toJSON=function(){return this.toString()};BigInteger.prototype.valueOf=function(){return parseInt(this.toString(),10)};BigInteger.prototype.toJSNumber=BigInteger.prototype.valueOf;SmallInteger.prototype.valueOf=function(){return this.value};SmallInteger.prototype.toJSNumber=SmallInteger.prototype.valueOf;NativeBigInt.prototype.valueOf=NativeBigInt.prototype.toJSNumber=function(){return parseInt(this.toString(),10)};function parseStringValue(v){if(isPrecise(+v)){var x=+v;if(x===truncate(x))return supportsNativeBigInt?new NativeBigInt(BigInt(x)):new SmallInteger(x);throw new Error("Invalid integer: "+v)}var sign=v[0]==="-";if(sign)v=v.slice(1);var split=v.split(/e/i);if(split.length>2)throw new Error("Invalid integer: "+split.join("e"));if(split.length===2){var exp=split[1];if(exp[0]==="+")exp=exp.slice(1);exp=+exp;if(exp!==truncate(exp)||!isPrecise(exp))throw new Error("Invalid integer: "+exp+" is not a valid exponent.");var text=split[0];var decimalPlace=text.indexOf(".");if(decimalPlace>=0){exp-=text.length-decimalPlace-1;text=text.slice(0,decimalPlace)+text.slice(decimalPlace+1)}if(exp<0)throw new Error("Cannot include negative exponent part for integers");text+=new Array(exp+1).join("0");v=text}var isValid=/^([0-9][0-9]*)$/.test(v);if(!isValid)throw new Error("Invalid integer: "+v);if(supportsNativeBigInt){return new NativeBigInt(BigInt(sign?"-"+v:v))}var r=[],max=v.length,l=LOG_BASE,min=max-l;while(max>0){r.push(+v.slice(min,max));min-=l;if(min<0)min=0;max-=l}trim(r);return new BigInteger(r,sign)}function parseNumberValue(v){if(supportsNativeBigInt){return new NativeBigInt(BigInt(v))}if(isPrecise(v)){if(v!==truncate(v))throw new Error(v+" is not an integer.");return new SmallInteger(v)}return parseStringValue(v.toString())}function parseValue(v){if(typeof v==="number"){return parseNumberValue(v)}if(typeof v==="string"){return parseStringValue(v)}if(typeof v==="bigint"){return new NativeBigInt(v)}return v}for(var i=0;i<1e3;i++){Integer[i]=parseValue(i);if(i>0)Integer[-i]=parseValue(-i)}Integer.one=Integer[1];Integer.zero=Integer[0];Integer.minusOne=Integer[-1];Integer.max=max;Integer.min=min;Integer.gcd=gcd;Integer.lcm=lcm;Integer.isInstance=function(x){return x instanceof BigInteger||x instanceof SmallInteger||x instanceof NativeBigInt};Integer.randBetween=randBetween;Integer.fromArray=function(digits,base,isNegative){return parseBaseFromArray(digits.map(parseValue),parseValue(base||10),isNegative)};return Integer}();if(typeof module!=="undefined"&&module.hasOwnProperty("exports")){module.exports=bigInt}if(typeof define==="function"&&define.amd){define(function(){return bigInt})}This is free and unencumbered software released into the public domain.

Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.

In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

For more information, please refer to <http://unlicense.org>
{
  "name": "big-integer",
  "description": "An arbitrary length integer library for Javascript",
  "main": "./BigInteger.js",
  "authors": [
    "Peter Olson"
  ],
  "license": "Unlicense",
  "keywords": [
    "math",
    "big",
    "bignum",
    "bigint",
    "biginteger",
    "integer",
    "arbitrary",
    "precision",
    "arithmetic"
  ],
  "homepage": "https://github.com/peterolson/BigInteger.js",
  "ignore": [
    "**/.*",
    "node_modules",
    "bower_components",
    "test",
    "coverage",
    "tests"
  ]
}
{
  "author": {
    "name": "Peter Olson",
    "email": "peter.e.c.olson+npm@gmail.com"
  },
  "deprecated": false,
  "description": "An arbitrary length integer library for Javascript",
  "devDependencies": {
    "@types/lodash": "^4.14.118",
    "@types/node": "^7.10.2",
    "coveralls": "^3.0.6",
    "jasmine": "3.5.0",
    "jasmine-core": "^3.5.0",
    "karma": "^4.3.0",
    "karma-cli": "^2.0.0",
    "karma-coverage": "^2.0.1",
    "karma-jasmine": "^2.0.1",
    "karma-phantomjs-launcher": "^1.0.4",
    "lodash": "^4.17.11",
    "typescript": "^3.6.3",
    "uglifyjs": "^2.4.10"
  },
  "engines": {
    "node": ">=0.6"
  },
  "homepage": "https://github.com/peterolson/BigInteger.js#readme",
  "license": "Unlicense",
  "main": "./BigInteger",
  "name": "big-integer",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/peterolson/BigInteger.js.git"
  },
  "typings": "./BigInteger.d.ts",
  "version": "1.6.48"
}{
    "compilerOptions": {
        "target": "esnext",
        "module": "commonjs",
        "lib": [
            "es6"
        ],
        "noImplicitAny": true,
        "noImplicitThis": true,
        "strictNullChecks": false,
        "baseUrl": "./",
        "moduleResolution": "node",
        "allowJs": true,
        "typeRoots": [
            "./"
        ],
        "types": [
            "node"
        ],
        "forceConsistentCasingInFileNames": true
    },
    "files": [
        "BigInteger.d.ts",
        "spec/tsDefinitions.ts"
    ]
}
The MIT License (MIT)

Copyright (c) 2013-2018 Petka Antonov

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Petka Antonov",
    "email": "petka_antonov@hotmail.com",
    "url": "http://github.com/petkaantonov/"
  },
  "browser": "./js/browser/bluebird.js",
  "deprecated": false,
  "description": "Full featured Promises/A+ implementation with exceptionally good performance",
  "devDependencies": {
    "acorn": "^6.0.2",
    "acorn-walk": "^6.1.0",
    "baconjs": "^0.7.43",
    "bluebird": "^2.9.2",
    "body-parser": "^1.10.2",
    "browserify": "^8.1.1",
    "cli-table": "~0.3.1",
    "co": "^4.2.0",
    "cross-spawn": "^0.2.3",
    "glob": "^4.3.2",
    "grunt-saucelabs": "~8.4.1",
    "highland": "^2.3.0",
    "istanbul": "^0.3.5",
    "jshint": "^2.6.0",
    "jshint-stylish": "~0.2.0",
    "kefir": "^2.4.1",
    "mkdirp": "~0.5.0",
    "mocha": "~2.1",
    "open": "~0.0.5",
    "optimist": "~0.6.1",
    "rimraf": "~2.2.6",
    "rx": "^2.3.25",
    "serve-static": "^1.7.1",
    "sinon": "~1.7.3",
    "uglify-js": "~2.4.16"
  },
  "files": [
    "js/browser",
    "js/release",
    "LICENSE"
  ],
  "homepage": "https://github.com/petkaantonov/bluebird",
  "license": "MIT",
  "main": "./js/release/bluebird.js",
  "name": "bluebird",
  "repository": {
    "type": "git",
    "url": "git://github.com/petkaantonov/bluebird.git"
  },
  "version": "3.7.2",
  "webpack": "./js/release/bluebird.js"
}"use strict";
module.exports = function(Promise) {
var SomePromiseArray = Promise._SomePromiseArray;
function any(promises) {
    var ret = new SomePromiseArray(promises);
    var promise = ret.promise();
    ret.setHowMany(1);
    ret.setUnwrap();
    ret.init();
    return promise;
}

Promise.any = function (promises) {
    return any(promises);
};

Promise.prototype.any = function () {
    return any(this);
};

};
"use strict";
module.exports = (function(){
var AssertionError = (function() {
    function AssertionError(a) {
        this.constructor$(a);
        this.message = a;
        this.name = "AssertionError";
    }
    AssertionError.prototype = new Error();
    AssertionError.prototype.constructor = AssertionError;
    AssertionError.prototype.constructor$ = Error;
    return AssertionError;
})();

function getParams(args) {
    var params = [];
    for (var i = 0; i < args.length; ++i) params.push("arg" + i);
    return params;
}

function nativeAssert(callName, args, expect) {
    try {
        var params = getParams(args);
        var constructorArgs = params;
        constructorArgs.push("return " +
                callName + "("+ params.join(",") + ");");
        var fn = Function.apply(null, constructorArgs);
        return fn.apply(null, args);
    } catch (e) {
        if (!(e instanceof SyntaxError)) {
            throw e;
        } else {
            return expect;
        }
    }
}

return function assert(boolExpr, message) {
    if (boolExpr === true) return;

    if (typeof boolExpr === "string" &&
        boolExpr.charAt(0) === "%") {
        var nativeCallName = boolExpr;
        var $_len = arguments.length;var args = new Array(Math.max($_len - 2, 0)); for(var $_i = 2; $_i < $_len; ++$_i) {args[$_i - 2] = arguments[$_i];};
        if (nativeAssert(nativeCallName, args, message) === message) return;
        message = (nativeCallName + " !== " + message);
    }

    var ret = new AssertionError(message);
    if (Error.captureStackTrace) {
        Error.captureStackTrace(ret, assert);
    }
    throw ret;
};
})();
"use strict";
var firstLineError;
try {throw new Error(); } catch (e) {firstLineError = e;}
var schedule = require("./schedule");
var Queue = require("./queue");

function Async() {
    this._customScheduler = false;
    this._isTickUsed = false;
    this._lateQueue = new Queue(16);
    this._normalQueue = new Queue(16);
    this._haveDrainedQueues = false;
    var self = this;
    this.drainQueues = function () {
        self._drainQueues();
    };
    this._schedule = schedule;
}

Async.prototype.setScheduler = function(fn) {
    var prev = this._schedule;
    this._schedule = fn;
    this._customScheduler = true;
    return prev;
};

Async.prototype.hasCustomScheduler = function() {
    return this._customScheduler;
};

Async.prototype.haveItemsQueued = function () {
    return this._isTickUsed || this._haveDrainedQueues;
};


Async.prototype.fatalError = function(e, isNode) {
    if (isNode) {
        process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) +
            "\n");
        process.exit(2);
    } else {
        this.throwLater(e);
    }
};

Async.prototype.throwLater = function(fn, arg) {
    if (arguments.length === 1) {
        arg = fn;
        fn = function () { throw arg; };
    }
    if (typeof setTimeout !== "undefined") {
        setTimeout(function() {
            fn(arg);
        }, 0);
    } else try {
        this._schedule(function() {
            fn(arg);
        });
    } catch (e) {
        throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
};

function AsyncInvokeLater(fn, receiver, arg) {
    this._lateQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncInvoke(fn, receiver, arg) {
    this._normalQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncSettlePromises(promise) {
    this._normalQueue._pushOne(promise);
    this._queueTick();
}

Async.prototype.invokeLater = AsyncInvokeLater;
Async.prototype.invoke = AsyncInvoke;
Async.prototype.settlePromises = AsyncSettlePromises;


function _drainQueue(queue) {
    while (queue.length() > 0) {
        _drainQueueStep(queue);
    }
}

function _drainQueueStep(queue) {
    var fn = queue.shift();
    if (typeof fn !== "function") {
        fn._settlePromises();
    } else {
        var receiver = queue.shift();
        var arg = queue.shift();
        fn.call(receiver, arg);
    }
}

Async.prototype._drainQueues = function () {
    _drainQueue(this._normalQueue);
    this._reset();
    this._haveDrainedQueues = true;
    _drainQueue(this._lateQueue);
};

Async.prototype._queueTick = function () {
    if (!this._isTickUsed) {
        this._isTickUsed = true;
        this._schedule(this.drainQueues);
    }
};

Async.prototype._reset = function () {
    this._isTickUsed = false;
};

module.exports = Async;
module.exports.firstLineError = firstLineError;
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {
var calledBind = false;
var rejectThis = function(_, e) {
    this._reject(e);
};

var targetRejected = function(e, context) {
    context.promiseRejectionQueued = true;
    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
};

var bindingResolved = function(thisArg, context) {
    if (((this._bitField & 50397184) === 0)) {
        this._resolveCallback(context.target);
    }
};

var bindingRejected = function(e, context) {
    if (!context.promiseRejectionQueued) this._reject(e);
};

Promise.prototype.bind = function (thisArg) {
    if (!calledBind) {
        calledBind = true;
        Promise.prototype._propagateFrom = debug.propagateFromFunction();
        Promise.prototype._boundValue = debug.boundValueFunction();
    }
    var maybePromise = tryConvertToPromise(thisArg);
    var ret = new Promise(INTERNAL);
    ret._propagateFrom(this, 1);
    var target = this._target();
    ret._setBoundTo(maybePromise);
    if (maybePromise instanceof Promise) {
        var context = {
            promiseRejectionQueued: false,
            promise: ret,
            target: target,
            bindingPromise: maybePromise
        };
        target._then(INTERNAL, targetRejected, undefined, ret, context);
        maybePromise._then(
            bindingResolved, bindingRejected, undefined, ret, context);
        ret._setOnCancel(maybePromise);
    } else {
        ret._resolveCallback(target);
    }
    return ret;
};

Promise.prototype._setBoundTo = function (obj) {
    if (obj !== undefined) {
        this._bitField = this._bitField | 2097152;
        this._boundTo = obj;
    } else {
        this._bitField = this._bitField & (~2097152);
    }
};

Promise.prototype._isBound = function () {
    return (this._bitField & 2097152) === 2097152;
};

Promise.bind = function (thisArg, value) {
    return Promise.resolve(value).bind(thisArg);
};
};
"use strict";
var old;
if (typeof Promise !== "undefined") old = Promise;
function noConflict() {
    try { if (Promise === bluebird) Promise = old; }
    catch (e) {}
    return bluebird;
}
var bluebird = require("./promise")();
bluebird.noConflict = noConflict;
module.exports = bluebird;
"use strict";
var cr = Object.create;
if (cr) {
    var callerCache = cr(null);
    var getterCache = cr(null);
    callerCache[" size"] = getterCache[" size"] = 0;
}

module.exports = function(Promise) {
var util = require("./util");
var canEvaluate = util.canEvaluate;
var isIdentifier = util.isIdentifier;

var getMethodCaller;
var getGetter;
if (!false) {
var makeMethodCaller = function (methodName) {
    return new Function("ensureMethod", "                                    \n\
        return function(obj) {                                               \n\
            'use strict'                                                     \n\
            var len = this.length;                                           \n\
            ensureMethod(obj, 'methodName');                                 \n\
            switch(len) {                                                    \n\
                case 1: return obj.methodName(this[0]);                      \n\
                case 2: return obj.methodName(this[0], this[1]);             \n\
                case 3: return obj.methodName(this[0], this[1], this[2]);    \n\
                case 0: return obj.methodName();                             \n\
                default:                                                     \n\
                    return obj.methodName.apply(obj, this);                  \n\
            }                                                                \n\
        };                                                                   \n\
        ".replace(/methodName/g, methodName))(ensureMethod);
};

var makeGetter = function (propertyName) {
    return new Function("obj", "                                             \n\
        'use strict';                                                        \n\
        return obj.propertyName;                                             \n\
        ".replace("propertyName", propertyName));
};

var getCompiled = function(name, compiler, cache) {
    var ret = cache[name];
    if (typeof ret !== "function") {
        if (!isIdentifier(name)) {
            return null;
        }
        ret = compiler(name);
        cache[name] = ret;
        cache[" size"]++;
        if (cache[" size"] > 512) {
            var keys = Object.keys(cache);
            for (var i = 0; i < 256; ++i) delete cache[keys[i]];
            cache[" size"] = keys.length - 256;
        }
    }
    return ret;
};

getMethodCaller = function(name) {
    return getCompiled(name, makeMethodCaller, callerCache);
};

getGetter = function(name) {
    return getCompiled(name, makeGetter, getterCache);
};
}

function ensureMethod(obj, methodName) {
    var fn;
    if (obj != null) fn = obj[methodName];
    if (typeof fn !== "function") {
        var message = "Object " + util.classString(obj) + " has no method '" +
            util.toString(methodName) + "'";
        throw new Promise.TypeError(message);
    }
    return fn;
}

function caller(obj) {
    var methodName = this.pop();
    var fn = ensureMethod(obj, methodName);
    return fn.apply(obj, this);
}
Promise.prototype.call = function (methodName) {
    var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};
    if (!false) {
        if (canEvaluate) {
            var maybeCaller = getMethodCaller(methodName);
            if (maybeCaller !== null) {
                return this._then(
                    maybeCaller, undefined, undefined, args, undefined);
            }
        }
    }
    args.push(methodName);
    return this._then(caller, undefined, undefined, args, undefined);
};

function namedGetter(obj) {
    return obj[this];
}
function indexedGetter(obj) {
    var index = +this;
    if (index < 0) index = Math.max(0, index + obj.length);
    return obj[index];
}
Promise.prototype.get = function (propertyName) {
    var isIndex = (typeof propertyName === "number");
    var getter;
    if (!isIndex) {
        if (canEvaluate) {
            var maybeGetter = getGetter(propertyName);
            getter = maybeGetter !== null ? maybeGetter : namedGetter;
        } else {
            getter = namedGetter;
        }
    } else {
        getter = indexedGetter;
    }
    return this._then(getter, undefined, undefined, propertyName, undefined);
};
};
"use strict";
module.exports = function(Promise, PromiseArray, apiRejection, debug) {
var util = require("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

Promise.prototype["break"] = Promise.prototype.cancel = function() {
    if (!debug.cancellation()) return this._warn("cancellation is disabled");

    var promise = this;
    var child = promise;
    while (promise._isCancellable()) {
        if (!promise._cancelBy(child)) {
            if (child._isFollowing()) {
                child._followee().cancel();
            } else {
                child._cancelBranched();
            }
            break;
        }

        var parent = promise._cancellationParent;
        if (parent == null || !parent._isCancellable()) {
            if (promise._isFollowing()) {
                promise._followee().cancel();
            } else {
                promise._cancelBranched();
            }
            break;
        } else {
            if (promise._isFollowing()) promise._followee().cancel();
            promise._setWillBeCancelled();
            child = promise;
            promise = parent;
        }
    }
};

Promise.prototype._branchHasCancelled = function() {
    this._branchesRemainingToCancel--;
};

Promise.prototype._enoughBranchesHaveCancelled = function() {
    return this._branchesRemainingToCancel === undefined ||
           this._branchesRemainingToCancel <= 0;
};

Promise.prototype._cancelBy = function(canceller) {
    if (canceller === this) {
        this._branchesRemainingToCancel = 0;
        this._invokeOnCancel();
        return true;
    } else {
        this._branchHasCancelled();
        if (this._enoughBranchesHaveCancelled()) {
            this._invokeOnCancel();
            return true;
        }
    }
    return false;
};

Promise.prototype._cancelBranched = function() {
    if (this._enoughBranchesHaveCancelled()) {
        this._cancel();
    }
};

Promise.prototype._cancel = function() {
    if (!this._isCancellable()) return;
    this._setCancelled();
    async.invoke(this._cancelPromises, this, undefined);
};

Promise.prototype._cancelPromises = function() {
    if (this._length() > 0) this._settlePromises();
};

Promise.prototype._unsetOnCancel = function() {
    this._onCancelField = undefined;
};

Promise.prototype._isCancellable = function() {
    return this.isPending() && !this._isCancelled();
};

Promise.prototype.isCancellable = function() {
    return this.isPending() && !this.isCancelled();
};

Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {
    if (util.isArray(onCancelCallback)) {
        for (var i = 0; i < onCancelCallback.length; ++i) {
            this._doInvokeOnCancel(onCancelCallback[i], internalOnly);
        }
    } else if (onCancelCallback !== undefined) {
        if (typeof onCancelCallback === "function") {
            if (!internalOnly) {
                var e = tryCatch(onCancelCallback).call(this._boundValue());
                if (e === errorObj) {
                    this._attachExtraTrace(e.e);
                    async.throwLater(e.e);
                }
            }
        } else {
            onCancelCallback._resultCancelled(this);
        }
    }
};

Promise.prototype._invokeOnCancel = function() {
    var onCancelCallback = this._onCancel();
    this._unsetOnCancel();
    async.invoke(this._doInvokeOnCancel, this, onCancelCallback);
};

Promise.prototype._invokeInternalOnCancel = function() {
    if (this._isCancellable()) {
        this._doInvokeOnCancel(this._onCancel(), true);
        this._unsetOnCancel();
    }
};

Promise.prototype._resultCancelled = function() {
    this.cancel();
};

};
"use strict";
module.exports = function(NEXT_FILTER) {
var util = require("./util");
var getKeys = require("./es5").keys;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function catchFilter(instances, cb, promise) {
    return function(e) {
        var boundTo = promise._boundValue();
        predicateLoop: for (var i = 0; i < instances.length; ++i) {
            var item = instances[i];

            if (item === Error ||
                (item != null && item.prototype instanceof Error)) {
                if (e instanceof item) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (typeof item === "function") {
                var matchesPredicate = tryCatch(item).call(boundTo, e);
                if (matchesPredicate === errorObj) {
                    return matchesPredicate;
                } else if (matchesPredicate) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (util.isObject(e)) {
                var keys = getKeys(item);
                for (var j = 0; j < keys.length; ++j) {
                    var key = keys[j];
                    if (item[key] != e[key]) {
                        continue predicateLoop;
                    }
                }
                return tryCatch(cb).call(boundTo, e);
            }
        }
        return NEXT_FILTER;
    };
}

return catchFilter;
};
"use strict";
module.exports = function(Promise) {
var longStackTraces = false;
var contextStack = [];

Promise.prototype._promiseCreated = function() {};
Promise.prototype._pushContext = function() {};
Promise.prototype._popContext = function() {return null;};
Promise._peekContext = Promise.prototype._peekContext = function() {};

function Context() {
    this._trace = new Context.CapturedTrace(peekContext());
}
Context.prototype._pushContext = function () {
    if (this._trace !== undefined) {
        this._trace._promiseCreated = null;
        contextStack.push(this._trace);
    }
};

Context.prototype._popContext = function () {
    if (this._trace !== undefined) {
        var trace = contextStack.pop();
        var ret = trace._promiseCreated;
        trace._promiseCreated = null;
        return ret;
    }
    return null;
};

function createContext() {
    if (longStackTraces) return new Context();
}

function peekContext() {
    var lastIndex = contextStack.length - 1;
    if (lastIndex >= 0) {
        return contextStack[lastIndex];
    }
    return undefined;
}
Context.CapturedTrace = null;
Context.create = createContext;
Context.deactivateLongStackTraces = function() {};
Context.activateLongStackTraces = function() {
    var Promise_pushContext = Promise.prototype._pushContext;
    var Promise_popContext = Promise.prototype._popContext;
    var Promise_PeekContext = Promise._peekContext;
    var Promise_peekContext = Promise.prototype._peekContext;
    var Promise_promiseCreated = Promise.prototype._promiseCreated;
    Context.deactivateLongStackTraces = function() {
        Promise.prototype._pushContext = Promise_pushContext;
        Promise.prototype._popContext = Promise_popContext;
        Promise._peekContext = Promise_PeekContext;
        Promise.prototype._peekContext = Promise_peekContext;
        Promise.prototype._promiseCreated = Promise_promiseCreated;
        longStackTraces = false;
    };
    longStackTraces = true;
    Promise.prototype._pushContext = Context.prototype._pushContext;
    Promise.prototype._popContext = Context.prototype._popContext;
    Promise._peekContext = Promise.prototype._peekContext = peekContext;
    Promise.prototype._promiseCreated = function() {
        var ctx = this._peekContext();
        if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;
    };
};
return Context;
};
"use strict";
module.exports = function(Promise, Context,
    enableAsyncHooks, disableAsyncHooks) {
var async = Promise._async;
var Warning = require("./errors").Warning;
var util = require("./util");
var es5 = require("./es5");
var canAttachTrace = util.canAttachTrace;
var unhandledRejectionHandled;
var possiblyUnhandledRejection;
var bluebirdFramePattern =
    /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/;
var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/;
var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/;
var stackFramePattern = null;
var formatStack = null;
var indentStackFrames = false;
var printWarning;
var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 &&
                        (false ||
                         util.env("BLUEBIRD_DEBUG") ||
                         util.env("NODE_ENV") === "development"));

var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 &&
    (debugging || util.env("BLUEBIRD_WARNINGS")));

var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 &&
    (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));

var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 &&
    (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));

var deferUnhandledRejectionCheck;
(function() {
    var promises = [];

    function unhandledRejectionCheck() {
        for (var i = 0; i < promises.length; ++i) {
            promises[i]._notifyUnhandledRejection();
        }
        unhandledRejectionClear();
    }

    function unhandledRejectionClear() {
        promises.length = 0;
    }

    deferUnhandledRejectionCheck = function(promise) {
        promises.push(promise);
        setTimeout(unhandledRejectionCheck, 1);
    };

    es5.defineProperty(Promise, "_unhandledRejectionCheck", {
        value: unhandledRejectionCheck
    });
    es5.defineProperty(Promise, "_unhandledRejectionClear", {
        value: unhandledRejectionClear
    });
})();

Promise.prototype.suppressUnhandledRejections = function() {
    var target = this._target();
    target._bitField = ((target._bitField & (~1048576)) |
                      524288);
};

Promise.prototype._ensurePossibleRejectionHandled = function () {
    if ((this._bitField & 524288) !== 0) return;
    this._setRejectionIsUnhandled();
    deferUnhandledRejectionCheck(this);
};

Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
    fireRejectionEvent("rejectionHandled",
                                  unhandledRejectionHandled, undefined, this);
};

Promise.prototype._setReturnedNonUndefined = function() {
    this._bitField = this._bitField | 268435456;
};

Promise.prototype._returnedNonUndefined = function() {
    return (this._bitField & 268435456) !== 0;
};

Promise.prototype._notifyUnhandledRejection = function () {
    if (this._isRejectionUnhandled()) {
        var reason = this._settledValue();
        this._setUnhandledRejectionIsNotified();
        fireRejectionEvent("unhandledRejection",
                                      possiblyUnhandledRejection, reason, this);
    }
};

Promise.prototype._setUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField | 262144;
};

Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField & (~262144);
};

Promise.prototype._isUnhandledRejectionNotified = function () {
    return (this._bitField & 262144) > 0;
};

Promise.prototype._setRejectionIsUnhandled = function () {
    this._bitField = this._bitField | 1048576;
};

Promise.prototype._unsetRejectionIsUnhandled = function () {
    this._bitField = this._bitField & (~1048576);
    if (this._isUnhandledRejectionNotified()) {
        this._unsetUnhandledRejectionIsNotified();
        this._notifyUnhandledRejectionIsHandled();
    }
};

Promise.prototype._isRejectionUnhandled = function () {
    return (this._bitField & 1048576) > 0;
};

Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) {
    return warn(message, shouldUseOwnTrace, promise || this);
};

Promise.onPossiblyUnhandledRejection = function (fn) {
    var context = Promise._getContext();
    possiblyUnhandledRejection = util.contextBind(context, fn);
};

Promise.onUnhandledRejectionHandled = function (fn) {
    var context = Promise._getContext();
    unhandledRejectionHandled = util.contextBind(context, fn);
};

var disableLongStackTraces = function() {};
Promise.longStackTraces = function () {
    if (async.haveItemsQueued() && !config.longStackTraces) {
        throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (!config.longStackTraces && longStackTracesIsSupported()) {
        var Promise_captureStackTrace = Promise.prototype._captureStackTrace;
        var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;
        var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace;
        config.longStackTraces = true;
        disableLongStackTraces = function() {
            if (async.haveItemsQueued() && !config.longStackTraces) {
                throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
            }
            Promise.prototype._captureStackTrace = Promise_captureStackTrace;
            Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;
            Promise.prototype._dereferenceTrace = Promise_dereferenceTrace;
            Context.deactivateLongStackTraces();
            config.longStackTraces = false;
        };
        Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;
        Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;
        Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace;
        Context.activateLongStackTraces();
    }
};

Promise.hasLongStackTraces = function () {
    return config.longStackTraces && longStackTracesIsSupported();
};


var legacyHandlers = {
    unhandledrejection: {
        before: function() {
            var ret = util.global.onunhandledrejection;
            util.global.onunhandledrejection = null;
            return ret;
        },
        after: function(fn) {
            util.global.onunhandledrejection = fn;
        }
    },
    rejectionhandled: {
        before: function() {
            var ret = util.global.onrejectionhandled;
            util.global.onrejectionhandled = null;
            return ret;
        },
        after: function(fn) {
            util.global.onrejectionhandled = fn;
        }
    }
};

var fireDomEvent = (function() {
    var dispatch = function(legacy, e) {
        if (legacy) {
            var fn;
            try {
                fn = legacy.before();
                return !util.global.dispatchEvent(e);
            } finally {
                legacy.after(fn);
            }
        } else {
            return !util.global.dispatchEvent(e);
        }
    };
    try {
        if (typeof CustomEvent === "function") {
            var event = new CustomEvent("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var eventData = {
                    detail: event,
                    cancelable: true
                };
                var domEvent = new CustomEvent(name, eventData);
                es5.defineProperty(
                    domEvent, "promise", {value: event.promise});
                es5.defineProperty(
                    domEvent, "reason", {value: event.reason});

                return dispatch(legacyHandlers[name], domEvent);
            };
        } else if (typeof Event === "function") {
            var event = new Event("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = new Event(name, {
                    cancelable: true
                });
                domEvent.detail = event;
                es5.defineProperty(domEvent, "promise", {value: event.promise});
                es5.defineProperty(domEvent, "reason", {value: event.reason});
                return dispatch(legacyHandlers[name], domEvent);
            };
        } else {
            var event = document.createEvent("CustomEvent");
            event.initCustomEvent("testingtheevent", false, true, {});
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = document.createEvent("CustomEvent");
                domEvent.initCustomEvent(name, false, true,
                    event);
                return dispatch(legacyHandlers[name], domEvent);
            };
        }
    } catch (e) {}
    return function() {
        return false;
    };
})();

var fireGlobalEvent = (function() {
    if (util.isNode) {
        return function() {
            return process.emit.apply(process, arguments);
        };
    } else {
        if (!util.global) {
            return function() {
                return false;
            };
        }
        return function(name) {
            var methodName = "on" + name.toLowerCase();
            var method = util.global[methodName];
            if (!method) return false;
            method.apply(util.global, [].slice.call(arguments, 1));
            return true;
        };
    }
})();

function generatePromiseLifecycleEventObject(name, promise) {
    return {promise: promise};
}

var eventToObjectGenerator = {
    promiseCreated: generatePromiseLifecycleEventObject,
    promiseFulfilled: generatePromiseLifecycleEventObject,
    promiseRejected: generatePromiseLifecycleEventObject,
    promiseResolved: generatePromiseLifecycleEventObject,
    promiseCancelled: generatePromiseLifecycleEventObject,
    promiseChained: function(name, promise, child) {
        return {promise: promise, child: child};
    },
    warning: function(name, warning) {
        return {warning: warning};
    },
    unhandledRejection: function (name, reason, promise) {
        return {reason: reason, promise: promise};
    },
    rejectionHandled: generatePromiseLifecycleEventObject
};

var activeFireEvent = function (name) {
    var globalEventFired = false;
    try {
        globalEventFired = fireGlobalEvent.apply(null, arguments);
    } catch (e) {
        async.throwLater(e);
        globalEventFired = true;
    }

    var domEventFired = false;
    try {
        domEventFired = fireDomEvent(name,
                    eventToObjectGenerator[name].apply(null, arguments));
    } catch (e) {
        async.throwLater(e);
        domEventFired = true;
    }

    return domEventFired || globalEventFired;
};

Promise.config = function(opts) {
    opts = Object(opts);
    if ("longStackTraces" in opts) {
        if (opts.longStackTraces) {
            Promise.longStackTraces();
        } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
            disableLongStackTraces();
        }
    }
    if ("warnings" in opts) {
        var warningsOption = opts.warnings;
        config.warnings = !!warningsOption;
        wForgottenReturn = config.warnings;

        if (util.isObject(warningsOption)) {
            if ("wForgottenReturn" in warningsOption) {
                wForgottenReturn = !!warningsOption.wForgottenReturn;
            }
        }
    }
    if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
        if (async.haveItemsQueued()) {
            throw new Error(
                "cannot enable cancellation after promises are in use");
        }
        Promise.prototype._clearCancellationData =
            cancellationClearCancellationData;
        Promise.prototype._propagateFrom = cancellationPropagateFrom;
        Promise.prototype._onCancel = cancellationOnCancel;
        Promise.prototype._setOnCancel = cancellationSetOnCancel;
        Promise.prototype._attachCancellationCallback =
            cancellationAttachCancellationCallback;
        Promise.prototype._execute = cancellationExecute;
        propagateFromFunction = cancellationPropagateFrom;
        config.cancellation = true;
    }
    if ("monitoring" in opts) {
        if (opts.monitoring && !config.monitoring) {
            config.monitoring = true;
            Promise.prototype._fireEvent = activeFireEvent;
        } else if (!opts.monitoring && config.monitoring) {
            config.monitoring = false;
            Promise.prototype._fireEvent = defaultFireEvent;
        }
    }
    if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) {
        var prev = config.asyncHooks;
        var cur = !!opts.asyncHooks;
        if (prev !== cur) {
            config.asyncHooks = cur;
            if (cur) {
                enableAsyncHooks();
            } else {
                disableAsyncHooks();
            }
        }
    }
    return Promise;
};

function defaultFireEvent() { return false; }

Promise.prototype._fireEvent = defaultFireEvent;
Promise.prototype._execute = function(executor, resolve, reject) {
    try {
        executor(resolve, reject);
    } catch (e) {
        return e;
    }
};
Promise.prototype._onCancel = function () {};
Promise.prototype._setOnCancel = function (handler) { ; };
Promise.prototype._attachCancellationCallback = function(onCancel) {
    ;
};
Promise.prototype._captureStackTrace = function () {};
Promise.prototype._attachExtraTrace = function () {};
Promise.prototype._dereferenceTrace = function () {};
Promise.prototype._clearCancellationData = function() {};
Promise.prototype._propagateFrom = function (parent, flags) {
    ;
    ;
};

function cancellationExecute(executor, resolve, reject) {
    var promise = this;
    try {
        executor(resolve, reject, function(onCancel) {
            if (typeof onCancel !== "function") {
                throw new TypeError("onCancel must be a function, got: " +
                                    util.toString(onCancel));
            }
            promise._attachCancellationCallback(onCancel);
        });
    } catch (e) {
        return e;
    }
}

function cancellationAttachCancellationCallback(onCancel) {
    if (!this._isCancellable()) return this;

    var previousOnCancel = this._onCancel();
    if (previousOnCancel !== undefined) {
        if (util.isArray(previousOnCancel)) {
            previousOnCancel.push(onCancel);
        } else {
            this._setOnCancel([previousOnCancel, onCancel]);
        }
    } else {
        this._setOnCancel(onCancel);
    }
}

function cancellationOnCancel() {
    return this._onCancelField;
}

function cancellationSetOnCancel(onCancel) {
    this._onCancelField = onCancel;
}

function cancellationClearCancellationData() {
    this._cancellationParent = undefined;
    this._onCancelField = undefined;
}

function cancellationPropagateFrom(parent, flags) {
    if ((flags & 1) !== 0) {
        this._cancellationParent = parent;
        var branchesRemainingToCancel = parent._branchesRemainingToCancel;
        if (branchesRemainingToCancel === undefined) {
            branchesRemainingToCancel = 0;
        }
        parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;
    }
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}

function bindingPropagateFrom(parent, flags) {
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}
var propagateFromFunction = bindingPropagateFrom;

function boundValueFunction() {
    var ret = this._boundTo;
    if (ret !== undefined) {
        if (ret instanceof Promise) {
            if (ret.isFulfilled()) {
                return ret.value();
            } else {
                return undefined;
            }
        }
    }
    return ret;
}

function longStackTracesCaptureStackTrace() {
    this._trace = new CapturedTrace(this._peekContext());
}

function longStackTracesAttachExtraTrace(error, ignoreSelf) {
    if (canAttachTrace(error)) {
        var trace = this._trace;
        if (trace !== undefined) {
            if (ignoreSelf) trace = trace._parent;
        }
        if (trace !== undefined) {
            trace.attachExtraTrace(error);
        } else if (!error.__stackCleaned__) {
            var parsed = parseStackAndMessage(error);
            util.notEnumerableProp(error, "stack",
                parsed.message + "\n" + parsed.stack.join("\n"));
            util.notEnumerableProp(error, "__stackCleaned__", true);
        }
    }
}

function longStackTracesDereferenceTrace() {
    this._trace = undefined;
}

function checkForgottenReturns(returnValue, promiseCreated, name, promise,
                               parent) {
    if (returnValue === undefined && promiseCreated !== null &&
        wForgottenReturn) {
        if (parent !== undefined && parent._returnedNonUndefined()) return;
        if ((promise._bitField & 65535) === 0) return;

        if (name) name = name + " ";
        var handlerLine = "";
        var creatorLine = "";
        if (promiseCreated._trace) {
            var traceLines = promiseCreated._trace.stack.split("\n");
            var stack = cleanStack(traceLines);
            for (var i = stack.length - 1; i >= 0; --i) {
                var line = stack[i];
                if (!nodeFramePattern.test(line)) {
                    var lineMatches = line.match(parseLinePattern);
                    if (lineMatches) {
                        handlerLine  = "at " + lineMatches[1] +
                            ":" + lineMatches[2] + ":" + lineMatches[3] + " ";
                    }
                    break;
                }
            }

            if (stack.length > 0) {
                var firstUserLine = stack[0];
                for (var i = 0; i < traceLines.length; ++i) {

                    if (traceLines[i] === firstUserLine) {
                        if (i > 0) {
                            creatorLine = "\n" + traceLines[i - 1];
                        }
                        break;
                    }
                }

            }
        }
        var msg = "a promise was created in a " + name +
            "handler " + handlerLine + "but was not returned from it, " +
            "see http://goo.gl/rRqMUw" +
            creatorLine;
        promise._warn(msg, true, promiseCreated);
    }
}

function deprecated(name, replacement) {
    var message = name +
        " is deprecated and will be removed in a future version.";
    if (replacement) message += " Use " + replacement + " instead.";
    return warn(message);
}

function warn(message, shouldUseOwnTrace, promise) {
    if (!config.warnings) return;
    var warning = new Warning(message);
    var ctx;
    if (shouldUseOwnTrace) {
        promise._attachExtraTrace(warning);
    } else if (config.longStackTraces && (ctx = Promise._peekContext())) {
        ctx.attachExtraTrace(warning);
    } else {
        var parsed = parseStackAndMessage(warning);
        warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
    }

    if (!activeFireEvent("warning", warning)) {
        formatAndLogError(warning, "", true);
    }
}

function reconstructStack(message, stacks) {
    for (var i = 0; i < stacks.length - 1; ++i) {
        stacks[i].push("From previous event:");
        stacks[i] = stacks[i].join("\n");
    }
    if (i < stacks.length) {
        stacks[i] = stacks[i].join("\n");
    }
    return message + "\n" + stacks.join("\n");
}

function removeDuplicateOrEmptyJumps(stacks) {
    for (var i = 0; i < stacks.length; ++i) {
        if (stacks[i].length === 0 ||
            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {
            stacks.splice(i, 1);
            i--;
        }
    }
}

function removeCommonRoots(stacks) {
    var current = stacks[0];
    for (var i = 1; i < stacks.length; ++i) {
        var prev = stacks[i];
        var currentLastIndex = current.length - 1;
        var currentLastLine = current[currentLastIndex];
        var commonRootMeetPoint = -1;

        for (var j = prev.length - 1; j >= 0; --j) {
            if (prev[j] === currentLastLine) {
                commonRootMeetPoint = j;
                break;
            }
        }

        for (var j = commonRootMeetPoint; j >= 0; --j) {
            var line = prev[j];
            if (current[currentLastIndex] === line) {
                current.pop();
                currentLastIndex--;
            } else {
                break;
            }
        }
        current = prev;
    }
}

function cleanStack(stack) {
    var ret = [];
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        var isTraceLine = "    (No stack trace)" === line ||
            stackFramePattern.test(line);
        var isInternalFrame = isTraceLine && shouldIgnore(line);
        if (isTraceLine && !isInternalFrame) {
            if (indentStackFrames && line.charAt(0) !== " ") {
                line = "    " + line;
            }
            ret.push(line);
        }
    }
    return ret;
}

function stackFramesAsArray(error) {
    var stack = error.stack.replace(/\s+$/g, "").split("\n");
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        if ("    (No stack trace)" === line || stackFramePattern.test(line)) {
            break;
        }
    }
    if (i > 0 && error.name != "SyntaxError") {
        stack = stack.slice(i);
    }
    return stack;
}

function parseStackAndMessage(error) {
    var stack = error.stack;
    var message = error.toString();
    stack = typeof stack === "string" && stack.length > 0
                ? stackFramesAsArray(error) : ["    (No stack trace)"];
    return {
        message: message,
        stack: error.name == "SyntaxError" ? stack : cleanStack(stack)
    };
}

function formatAndLogError(error, title, isSoft) {
    if (typeof console !== "undefined") {
        var message;
        if (util.isObject(error)) {
            var stack = error.stack;
            message = title + formatStack(stack, error);
        } else {
            message = title + String(error);
        }
        if (typeof printWarning === "function") {
            printWarning(message, isSoft);
        } else if (typeof console.log === "function" ||
            typeof console.log === "object") {
            console.log(message);
        }
    }
}

function fireRejectionEvent(name, localHandler, reason, promise) {
    var localEventFired = false;
    try {
        if (typeof localHandler === "function") {
            localEventFired = true;
            if (name === "rejectionHandled") {
                localHandler(promise);
            } else {
                localHandler(reason, promise);
            }
        }
    } catch (e) {
        async.throwLater(e);
    }

    if (name === "unhandledRejection") {
        if (!activeFireEvent(name, reason, promise) && !localEventFired) {
            formatAndLogError(reason, "Unhandled rejection ");
        }
    } else {
        activeFireEvent(name, promise);
    }
}

function formatNonError(obj) {
    var str;
    if (typeof obj === "function") {
        str = "[function " +
            (obj.name || "anonymous") +
            "]";
    } else {
        str = obj && typeof obj.toString === "function"
            ? obj.toString() : util.toString(obj);
        var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
        if (ruselessToString.test(str)) {
            try {
                var newStr = JSON.stringify(obj);
                str = newStr;
            }
            catch(e) {

            }
        }
        if (str.length === 0) {
            str = "(empty array)";
        }
    }
    return ("(<" + snip(str) + ">, no stack trace)");
}

function snip(str) {
    var maxChars = 41;
    if (str.length < maxChars) {
        return str;
    }
    return str.substr(0, maxChars - 3) + "...";
}

function longStackTracesIsSupported() {
    return typeof captureStackTrace === "function";
}

var shouldIgnore = function() { return false; };
var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
function parseLineInfo(line) {
    var matches = line.match(parseLineInfoRegex);
    if (matches) {
        return {
            fileName: matches[1],
            line: parseInt(matches[2], 10)
        };
    }
}

function setBounds(firstLineError, lastLineError) {
    if (!longStackTracesIsSupported()) return;
    var firstStackLines = (firstLineError.stack || "").split("\n");
    var lastStackLines = (lastLineError.stack || "").split("\n");
    var firstIndex = -1;
    var lastIndex = -1;
    var firstFileName;
    var lastFileName;
    for (var i = 0; i < firstStackLines.length; ++i) {
        var result = parseLineInfo(firstStackLines[i]);
        if (result) {
            firstFileName = result.fileName;
            firstIndex = result.line;
            break;
        }
    }
    for (var i = 0; i < lastStackLines.length; ++i) {
        var result = parseLineInfo(lastStackLines[i]);
        if (result) {
            lastFileName = result.fileName;
            lastIndex = result.line;
            break;
        }
    }
    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||
        firstFileName !== lastFileName || firstIndex >= lastIndex) {
        return;
    }

    shouldIgnore = function(line) {
        if (bluebirdFramePattern.test(line)) return true;
        var info = parseLineInfo(line);
        if (info) {
            if (info.fileName === firstFileName &&
                (firstIndex <= info.line && info.line <= lastIndex)) {
                return true;
            }
        }
        return false;
    };
}

function CapturedTrace(parent) {
    this._parent = parent;
    this._promisesCreated = 0;
    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
    captureStackTrace(this, CapturedTrace);
    if (length > 32) this.uncycle();
}
util.inherits(CapturedTrace, Error);
Context.CapturedTrace = CapturedTrace;

CapturedTrace.prototype.uncycle = function() {
    var length = this._length;
    if (length < 2) return;
    var nodes = [];
    var stackToIndex = {};

    for (var i = 0, node = this; node !== undefined; ++i) {
        nodes.push(node);
        node = node._parent;
    }
    length = this._length = i;
    for (var i = length - 1; i >= 0; --i) {
        var stack = nodes[i].stack;
        if (stackToIndex[stack] === undefined) {
            stackToIndex[stack] = i;
        }
    }
    for (var i = 0; i < length; ++i) {
        var currentStack = nodes[i].stack;
        var index = stackToIndex[currentStack];
        if (index !== undefined && index !== i) {
            if (index > 0) {
                nodes[index - 1]._parent = undefined;
                nodes[index - 1]._length = 1;
            }
            nodes[i]._parent = undefined;
            nodes[i]._length = 1;
            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;

            if (index < length - 1) {
                cycleEdgeNode._parent = nodes[index + 1];
                cycleEdgeNode._parent.uncycle();
                cycleEdgeNode._length =
                    cycleEdgeNode._parent._length + 1;
            } else {
                cycleEdgeNode._parent = undefined;
                cycleEdgeNode._length = 1;
            }
            var currentChildLength = cycleEdgeNode._length + 1;
            for (var j = i - 2; j >= 0; --j) {
                nodes[j]._length = currentChildLength;
                currentChildLength++;
            }
            return;
        }
    }
};

CapturedTrace.prototype.attachExtraTrace = function(error) {
    if (error.__stackCleaned__) return;
    this.uncycle();
    var parsed = parseStackAndMessage(error);
    var message = parsed.message;
    var stacks = [parsed.stack];

    var trace = this;
    while (trace !== undefined) {
        stacks.push(cleanStack(trace.stack.split("\n")));
        trace = trace._parent;
    }
    removeCommonRoots(stacks);
    removeDuplicateOrEmptyJumps(stacks);
    util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
    util.notEnumerableProp(error, "__stackCleaned__", true);
};

var captureStackTrace = (function stackDetection() {
    var v8stackFramePattern = /^\s*at\s*/;
    var v8stackFormatter = function(stack, error) {
        if (typeof stack === "string") return stack;

        if (error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    if (typeof Error.stackTraceLimit === "number" &&
        typeof Error.captureStackTrace === "function") {
        Error.stackTraceLimit += 6;
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        var captureStackTrace = Error.captureStackTrace;

        shouldIgnore = function(line) {
            return bluebirdFramePattern.test(line);
        };
        return function(receiver, ignoreUntil) {
            Error.stackTraceLimit += 6;
            captureStackTrace(receiver, ignoreUntil);
            Error.stackTraceLimit -= 6;
        };
    }
    var err = new Error();

    if (typeof err.stack === "string" &&
        err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
        stackFramePattern = /@/;
        formatStack = v8stackFormatter;
        indentStackFrames = true;
        return function captureStackTrace(o) {
            o.stack = new Error().stack;
        };
    }

    var hasStackAfterThrow;
    try { throw new Error(); }
    catch(e) {
        hasStackAfterThrow = ("stack" in e);
    }
    if (!("stack" in err) && hasStackAfterThrow &&
        typeof Error.stackTraceLimit === "number") {
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        return function captureStackTrace(o) {
            Error.stackTraceLimit += 6;
            try { throw new Error(); }
            catch(e) { o.stack = e.stack; }
            Error.stackTraceLimit -= 6;
        };
    }

    formatStack = function(stack, error) {
        if (typeof stack === "string") return stack;

        if ((typeof error === "object" ||
            typeof error === "function") &&
            error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    return null;

})([]);

if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
    printWarning = function (message) {
        console.warn(message);
    };
    if (util.isNode && process.stderr.isTTY) {
        printWarning = function(message, isSoft) {
            var color = isSoft ? "\u001b[33m" : "\u001b[31m";
            console.warn(color + message + "\u001b[0m\n");
        };
    } else if (!util.isNode && typeof (new Error().stack) === "string") {
        printWarning = function(message, isSoft) {
            console.warn("%c" + message,
                        isSoft ? "color: darkorange" : "color: red");
        };
    }
}

var config = {
    warnings: warnings,
    longStackTraces: false,
    cancellation: false,
    monitoring: false,
    asyncHooks: false
};

if (longStackTraces) Promise.longStackTraces();

return {
    asyncHooks: function() {
        return config.asyncHooks;
    },
    longStackTraces: function() {
        return config.longStackTraces;
    },
    warnings: function() {
        return config.warnings;
    },
    cancellation: function() {
        return config.cancellation;
    },
    monitoring: function() {
        return config.monitoring;
    },
    propagateFromFunction: function() {
        return propagateFromFunction;
    },
    boundValueFunction: function() {
        return boundValueFunction;
    },
    checkForgottenReturns: checkForgottenReturns,
    setBounds: setBounds,
    warn: warn,
    deprecated: deprecated,
    CapturedTrace: CapturedTrace,
    fireDomEvent: fireDomEvent,
    fireGlobalEvent: fireGlobalEvent
};
};
"use strict";
module.exports = function(Promise) {
function returner() {
    return this.value;
}
function thrower() {
    throw this.reason;
}

Promise.prototype["return"] =
Promise.prototype.thenReturn = function (value) {
    if (value instanceof Promise) value.suppressUnhandledRejections();
    return this._then(
        returner, undefined, undefined, {value: value}, undefined);
};

Promise.prototype["throw"] =
Promise.prototype.thenThrow = function (reason) {
    return this._then(
        thrower, undefined, undefined, {reason: reason}, undefined);
};

Promise.prototype.catchThrow = function (reason) {
    if (arguments.length <= 1) {
        return this._then(
            undefined, thrower, undefined, {reason: reason}, undefined);
    } else {
        var _reason = arguments[1];
        var handler = function() {throw _reason;};
        return this.caught(reason, handler);
    }
};

Promise.prototype.catchReturn = function (value) {
    if (arguments.length <= 1) {
        if (value instanceof Promise) value.suppressUnhandledRejections();
        return this._then(
            undefined, returner, undefined, {value: value}, undefined);
    } else {
        var _value = arguments[1];
        if (_value instanceof Promise) _value.suppressUnhandledRejections();
        var handler = function() {return _value;};
        return this.caught(value, handler);
    }
};
};
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseReduce = Promise.reduce;
var PromiseAll = Promise.all;

function promiseAllThis() {
    return PromiseAll(this);
}

function PromiseMapSeries(promises, fn) {
    return PromiseReduce(promises, fn, INTERNAL, INTERNAL);
}

Promise.prototype.each = function (fn) {
    return PromiseReduce(this, fn, INTERNAL, 0)
              ._then(promiseAllThis, undefined, undefined, this, undefined);
};

Promise.prototype.mapSeries = function (fn) {
    return PromiseReduce(this, fn, INTERNAL, INTERNAL);
};

Promise.each = function (promises, fn) {
    return PromiseReduce(promises, fn, INTERNAL, 0)
              ._then(promiseAllThis, undefined, undefined, promises, undefined);
};

Promise.mapSeries = PromiseMapSeries;
};

"use strict";
var es5 = require("./es5");
var Objectfreeze = es5.freeze;
var util = require("./util");
var inherits = util.inherits;
var notEnumerableProp = util.notEnumerableProp;

function subError(nameProperty, defaultMessage) {
    function SubError(message) {
        if (!(this instanceof SubError)) return new SubError(message);
        notEnumerableProp(this, "message",
            typeof message === "string" ? message : defaultMessage);
        notEnumerableProp(this, "name", nameProperty);
        if (Error.captureStackTrace) {
            Error.captureStackTrace(this, this.constructor);
        } else {
            Error.call(this);
        }
    }
    inherits(SubError, Error);
    return SubError;
}

var _TypeError, _RangeError;
var Warning = subError("Warning", "warning");
var CancellationError = subError("CancellationError", "cancellation error");
var TimeoutError = subError("TimeoutError", "timeout error");
var AggregateError = subError("AggregateError", "aggregate error");
try {
    _TypeError = TypeError;
    _RangeError = RangeError;
} catch(e) {
    _TypeError = subError("TypeError", "type error");
    _RangeError = subError("RangeError", "range error");
}

var methods = ("join pop push shift unshift slice filter forEach some " +
    "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" ");

for (var i = 0; i < methods.length; ++i) {
    if (typeof Array.prototype[methods[i]] === "function") {
        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];
    }
}

es5.defineProperty(AggregateError.prototype, "length", {
    value: 0,
    configurable: false,
    writable: true,
    enumerable: true
});
AggregateError.prototype["isOperational"] = true;
var level = 0;
AggregateError.prototype.toString = function() {
    var indent = Array(level * 4 + 1).join(" ");
    var ret = "\n" + indent + "AggregateError of:" + "\n";
    level++;
    indent = Array(level * 4 + 1).join(" ");
    for (var i = 0; i < this.length; ++i) {
        var str = this[i] === this ? "[Circular AggregateError]" : this[i] + "";
        var lines = str.split("\n");
        for (var j = 0; j < lines.length; ++j) {
            lines[j] = indent + lines[j];
        }
        str = lines.join("\n");
        ret += str + "\n";
    }
    level--;
    return ret;
};

function OperationalError(message) {
    if (!(this instanceof OperationalError))
        return new OperationalError(message);
    notEnumerableProp(this, "name", "OperationalError");
    notEnumerableProp(this, "message", message);
    this.cause = message;
    this["isOperational"] = true;

    if (message instanceof Error) {
        notEnumerableProp(this, "message", message.message);
        notEnumerableProp(this, "stack", message.stack);
    } else if (Error.captureStackTrace) {
        Error.captureStackTrace(this, this.constructor);
    }

}
inherits(OperationalError, Error);

var errorTypes = Error["__BluebirdErrorTypes__"];
if (!errorTypes) {
    errorTypes = Objectfreeze({
        CancellationError: CancellationError,
        TimeoutError: TimeoutError,
        OperationalError: OperationalError,
        RejectionError: OperationalError,
        AggregateError: AggregateError
    });
    es5.defineProperty(Error, "__BluebirdErrorTypes__", {
        value: errorTypes,
        writable: false,
        enumerable: false,
        configurable: false
    });
}

module.exports = {
    Error: Error,
    TypeError: _TypeError,
    RangeError: _RangeError,
    CancellationError: errorTypes.CancellationError,
    OperationalError: errorTypes.OperationalError,
    TimeoutError: errorTypes.TimeoutError,
    AggregateError: errorTypes.AggregateError,
    Warning: Warning
};
var isES5 = (function(){
    "use strict";
    return this === undefined;
})();

if (isES5) {
    module.exports = {
        freeze: Object.freeze,
        defineProperty: Object.defineProperty,
        getDescriptor: Object.getOwnPropertyDescriptor,
        keys: Object.keys,
        names: Object.getOwnPropertyNames,
        getPrototypeOf: Object.getPrototypeOf,
        isArray: Array.isArray,
        isES5: isES5,
        propertyIsWritable: function(obj, prop) {
            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
            return !!(!descriptor || descriptor.writable || descriptor.set);
        }
    };
} else {
    var has = {}.hasOwnProperty;
    var str = {}.toString;
    var proto = {}.constructor.prototype;

    var ObjectKeys = function (o) {
        var ret = [];
        for (var key in o) {
            if (has.call(o, key)) {
                ret.push(key);
            }
        }
        return ret;
    };

    var ObjectGetDescriptor = function(o, key) {
        return {value: o[key]};
    };

    var ObjectDefineProperty = function (o, key, desc) {
        o[key] = desc.value;
        return o;
    };

    var ObjectFreeze = function (obj) {
        return obj;
    };

    var ObjectGetPrototypeOf = function (obj) {
        try {
            return Object(obj).constructor.prototype;
        }
        catch (e) {
            return proto;
        }
    };

    var ArrayIsArray = function (obj) {
        try {
            return str.call(obj) === "[object Array]";
        }
        catch(e) {
            return false;
        }
    };

    module.exports = {
        isArray: ArrayIsArray,
        keys: ObjectKeys,
        names: ObjectKeys,
        defineProperty: ObjectDefineProperty,
        getDescriptor: ObjectGetDescriptor,
        freeze: ObjectFreeze,
        getPrototypeOf: ObjectGetPrototypeOf,
        isES5: isES5,
        propertyIsWritable: function() {
            return true;
        }
    };
}
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseMap = Promise.map;

Promise.prototype.filter = function (fn, options) {
    return PromiseMap(this, fn, options, INTERNAL);
};

Promise.filter = function (promises, fn, options) {
    return PromiseMap(promises, fn, options, INTERNAL);
};
};
"use strict";
module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) {
var util = require("./util");
var CancellationError = Promise.CancellationError;
var errorObj = util.errorObj;
var catchFilter = require("./catch_filter")(NEXT_FILTER);

function PassThroughHandlerContext(promise, type, handler) {
    this.promise = promise;
    this.type = type;
    this.handler = handler;
    this.called = false;
    this.cancelPromise = null;
}

PassThroughHandlerContext.prototype.isFinallyHandler = function() {
    return this.type === 0;
};

function FinallyHandlerCancelReaction(finallyHandler) {
    this.finallyHandler = finallyHandler;
}

FinallyHandlerCancelReaction.prototype._resultCancelled = function() {
    checkCancel(this.finallyHandler);
};

function checkCancel(ctx, reason) {
    if (ctx.cancelPromise != null) {
        if (arguments.length > 1) {
            ctx.cancelPromise._reject(reason);
        } else {
            ctx.cancelPromise._cancel();
        }
        ctx.cancelPromise = null;
        return true;
    }
    return false;
}

function succeed() {
    return finallyHandler.call(this, this.promise._target()._settledValue());
}
function fail(reason) {
    if (checkCancel(this, reason)) return;
    errorObj.e = reason;
    return errorObj;
}
function finallyHandler(reasonOrValue) {
    var promise = this.promise;
    var handler = this.handler;

    if (!this.called) {
        this.called = true;
        var ret = this.isFinallyHandler()
            ? handler.call(promise._boundValue())
            : handler.call(promise._boundValue(), reasonOrValue);
        if (ret === NEXT_FILTER) {
            return ret;
        } else if (ret !== undefined) {
            promise._setReturnedNonUndefined();
            var maybePromise = tryConvertToPromise(ret, promise);
            if (maybePromise instanceof Promise) {
                if (this.cancelPromise != null) {
                    if (maybePromise._isCancelled()) {
                        var reason =
                            new CancellationError("late cancellation observer");
                        promise._attachExtraTrace(reason);
                        errorObj.e = reason;
                        return errorObj;
                    } else if (maybePromise.isPending()) {
                        maybePromise._attachCancellationCallback(
                            new FinallyHandlerCancelReaction(this));
                    }
                }
                return maybePromise._then(
                    succeed, fail, undefined, this, undefined);
            }
        }
    }

    if (promise.isRejected()) {
        checkCancel(this);
        errorObj.e = reasonOrValue;
        return errorObj;
    } else {
        checkCancel(this);
        return reasonOrValue;
    }
}

Promise.prototype._passThrough = function(handler, type, success, fail) {
    if (typeof handler !== "function") return this.then();
    return this._then(success,
                      fail,
                      undefined,
                      new PassThroughHandlerContext(this, type, handler),
                      undefined);
};

Promise.prototype.lastly =
Promise.prototype["finally"] = function (handler) {
    return this._passThrough(handler,
                             0,
                             finallyHandler,
                             finallyHandler);
};


Promise.prototype.tap = function (handler) {
    return this._passThrough(handler, 1, finallyHandler);
};

Promise.prototype.tapCatch = function (handlerOrPredicate) {
    var len = arguments.length;
    if(len === 1) {
        return this._passThrough(handlerOrPredicate,
                                 1,
                                 undefined,
                                 finallyHandler);
    } else {
         var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return Promise.reject(new TypeError(
                    "tapCatch statement predicate: "
                    + "expecting an object but got " + util.classString(item)
                ));
            }
        }
        catchInstances.length = j;
        var handler = arguments[i];
        return this._passThrough(catchFilter(catchInstances, handler, this),
                                 1,
                                 undefined,
                                 finallyHandler);
    }

};

return PassThroughHandlerContext;
};
"use strict";
module.exports = function(Promise,
                          apiRejection,
                          INTERNAL,
                          tryConvertToPromise,
                          Proxyable,
                          debug) {
var errors = require("./errors");
var TypeError = errors.TypeError;
var util = require("./util");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
var yieldHandlers = [];

function promiseFromYieldHandler(value, yieldHandlers, traceParent) {
    for (var i = 0; i < yieldHandlers.length; ++i) {
        traceParent._pushContext();
        var result = tryCatch(yieldHandlers[i])(value);
        traceParent._popContext();
        if (result === errorObj) {
            traceParent._pushContext();
            var ret = Promise.reject(errorObj.e);
            traceParent._popContext();
            return ret;
        }
        var maybePromise = tryConvertToPromise(result, traceParent);
        if (maybePromise instanceof Promise) return maybePromise;
    }
    return null;
}

function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
    if (debug.cancellation()) {
        var internal = new Promise(INTERNAL);
        var _finallyPromise = this._finallyPromise = new Promise(INTERNAL);
        this._promise = internal.lastly(function() {
            return _finallyPromise;
        });
        internal._captureStackTrace();
        internal._setOnCancel(this);
    } else {
        var promise = this._promise = new Promise(INTERNAL);
        promise._captureStackTrace();
    }
    this._stack = stack;
    this._generatorFunction = generatorFunction;
    this._receiver = receiver;
    this._generator = undefined;
    this._yieldHandlers = typeof yieldHandler === "function"
        ? [yieldHandler].concat(yieldHandlers)
        : yieldHandlers;
    this._yieldedPromise = null;
    this._cancellationPhase = false;
}
util.inherits(PromiseSpawn, Proxyable);

PromiseSpawn.prototype._isResolved = function() {
    return this._promise === null;
};

PromiseSpawn.prototype._cleanup = function() {
    this._promise = this._generator = null;
    if (debug.cancellation() && this._finallyPromise !== null) {
        this._finallyPromise._fulfill();
        this._finallyPromise = null;
    }
};

PromiseSpawn.prototype._promiseCancelled = function() {
    if (this._isResolved()) return;
    var implementsReturn = typeof this._generator["return"] !== "undefined";

    var result;
    if (!implementsReturn) {
        var reason = new Promise.CancellationError(
            "generator .return() sentinel");
        Promise.coroutine.returnSentinel = reason;
        this._promise._attachExtraTrace(reason);
        this._promise._pushContext();
        result = tryCatch(this._generator["throw"]).call(this._generator,
                                                         reason);
        this._promise._popContext();
    } else {
        this._promise._pushContext();
        result = tryCatch(this._generator["return"]).call(this._generator,
                                                          undefined);
        this._promise._popContext();
    }
    this._cancellationPhase = true;
    this._yieldedPromise = null;
    this._continue(result);
};

PromiseSpawn.prototype._promiseFulfilled = function(value) {
    this._yieldedPromise = null;
    this._promise._pushContext();
    var result = tryCatch(this._generator.next).call(this._generator, value);
    this._promise._popContext();
    this._continue(result);
};

PromiseSpawn.prototype._promiseRejected = function(reason) {
    this._yieldedPromise = null;
    this._promise._attachExtraTrace(reason);
    this._promise._pushContext();
    var result = tryCatch(this._generator["throw"])
        .call(this._generator, reason);
    this._promise._popContext();
    this._continue(result);
};

PromiseSpawn.prototype._resultCancelled = function() {
    if (this._yieldedPromise instanceof Promise) {
        var promise = this._yieldedPromise;
        this._yieldedPromise = null;
        promise.cancel();
    }
};

PromiseSpawn.prototype.promise = function () {
    return this._promise;
};

PromiseSpawn.prototype._run = function () {
    this._generator = this._generatorFunction.call(this._receiver);
    this._receiver =
        this._generatorFunction = undefined;
    this._promiseFulfilled(undefined);
};

PromiseSpawn.prototype._continue = function (result) {
    var promise = this._promise;
    if (result === errorObj) {
        this._cleanup();
        if (this._cancellationPhase) {
            return promise.cancel();
        } else {
            return promise._rejectCallback(result.e, false);
        }
    }

    var value = result.value;
    if (result.done === true) {
        this._cleanup();
        if (this._cancellationPhase) {
            return promise.cancel();
        } else {
            return promise._resolveCallback(value);
        }
    } else {
        var maybePromise = tryConvertToPromise(value, this._promise);
        if (!(maybePromise instanceof Promise)) {
            maybePromise =
                promiseFromYieldHandler(maybePromise,
                                        this._yieldHandlers,
                                        this._promise);
            if (maybePromise === null) {
                this._promiseRejected(
                    new TypeError(
                        "A value %s was yielded that could not be treated as a promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", String(value)) +
                        "From coroutine:\u000a" +
                        this._stack.split("\n").slice(1, -7).join("\n")
                    )
                );
                return;
            }
        }
        maybePromise = maybePromise._target();
        var bitField = maybePromise._bitField;
        ;
        if (((bitField & 50397184) === 0)) {
            this._yieldedPromise = maybePromise;
            maybePromise._proxy(this, null);
        } else if (((bitField & 33554432) !== 0)) {
            Promise._async.invoke(
                this._promiseFulfilled, this, maybePromise._value()
            );
        } else if (((bitField & 16777216) !== 0)) {
            Promise._async.invoke(
                this._promiseRejected, this, maybePromise._reason()
            );
        } else {
            this._promiseCancelled();
        }
    }
};

Promise.coroutine = function (generatorFunction, options) {
    if (typeof generatorFunction !== "function") {
        throw new TypeError("generatorFunction must be a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var yieldHandler = Object(options).yieldHandler;
    var PromiseSpawn$ = PromiseSpawn;
    var stack = new Error().stack;
    return function () {
        var generator = generatorFunction.apply(this, arguments);
        var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,
                                      stack);
        var ret = spawn.promise();
        spawn._generator = generator;
        spawn._promiseFulfilled(undefined);
        return ret;
    };
};

Promise.coroutine.addYieldHandler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    yieldHandlers.push(fn);
};

Promise.spawn = function (generatorFunction) {
    debug.deprecated("Promise.spawn()", "Promise.coroutine()");
    if (typeof generatorFunction !== "function") {
        return apiRejection("generatorFunction must be a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var spawn = new PromiseSpawn(generatorFunction, this);
    var ret = spawn.promise();
    spawn._run(Promise.spawn);
    return ret;
};
};
"use strict";
module.exports =
function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) {
var util = require("./util");
var canEvaluate = util.canEvaluate;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var reject;

if (!false) {
if (canEvaluate) {
    var thenCallback = function(i) {
        return new Function("value", "holder", "                             \n\
            'use strict';                                                    \n\
            holder.pIndex = value;                                           \n\
            holder.checkFulfillment(this);                                   \n\
            ".replace(/Index/g, i));
    };

    var promiseSetter = function(i) {
        return new Function("promise", "holder", "                           \n\
            'use strict';                                                    \n\
            holder.pIndex = promise;                                         \n\
            ".replace(/Index/g, i));
    };

    var generateHolderClass = function(total) {
        var props = new Array(total);
        for (var i = 0; i < props.length; ++i) {
            props[i] = "this.p" + (i+1);
        }
        var assignment = props.join(" = ") + " = null;";
        var cancellationCode= "var promise;\n" + props.map(function(prop) {
            return "                                                         \n\
                promise = " + prop + ";                                      \n\
                if (promise instanceof Promise) {                            \n\
                    promise.cancel();                                        \n\
                }                                                            \n\
            ";
        }).join("\n");
        var passedArguments = props.join(", ");
        var name = "Holder$" + total;


        var code = "return function(tryCatch, errorObj, Promise, async) {    \n\
            'use strict';                                                    \n\
            function [TheName](fn) {                                         \n\
                [TheProperties]                                              \n\
                this.fn = fn;                                                \n\
                this.asyncNeeded = true;                                     \n\
                this.now = 0;                                                \n\
            }                                                                \n\
                                                                             \n\
            [TheName].prototype._callFunction = function(promise) {          \n\
                promise._pushContext();                                      \n\
                var ret = tryCatch(this.fn)([ThePassedArguments]);           \n\
                promise._popContext();                                       \n\
                if (ret === errorObj) {                                      \n\
                    promise._rejectCallback(ret.e, false);                   \n\
                } else {                                                     \n\
                    promise._resolveCallback(ret);                           \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype.checkFulfillment = function(promise) {       \n\
                var now = ++this.now;                                        \n\
                if (now === [TheTotal]) {                                    \n\
                    if (this.asyncNeeded) {                                  \n\
                        async.invoke(this._callFunction, this, promise);     \n\
                    } else {                                                 \n\
                        this._callFunction(promise);                         \n\
                    }                                                        \n\
                                                                             \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype._resultCancelled = function() {              \n\
                [CancellationCode]                                           \n\
            };                                                               \n\
                                                                             \n\
            return [TheName];                                                \n\
        }(tryCatch, errorObj, Promise, async);                               \n\
        ";

        code = code.replace(/\[TheName\]/g, name)
            .replace(/\[TheTotal\]/g, total)
            .replace(/\[ThePassedArguments\]/g, passedArguments)
            .replace(/\[TheProperties\]/g, assignment)
            .replace(/\[CancellationCode\]/g, cancellationCode);

        return new Function("tryCatch", "errorObj", "Promise", "async", code)
                           (tryCatch, errorObj, Promise, async);
    };

    var holderClasses = [];
    var thenCallbacks = [];
    var promiseSetters = [];

    for (var i = 0; i < 8; ++i) {
        holderClasses.push(generateHolderClass(i + 1));
        thenCallbacks.push(thenCallback(i + 1));
        promiseSetters.push(promiseSetter(i + 1));
    }

    reject = function (reason) {
        this._reject(reason);
    };
}}

Promise.join = function () {
    var last = arguments.length - 1;
    var fn;
    if (last > 0 && typeof arguments[last] === "function") {
        fn = arguments[last];
        if (!false) {
            if (last <= 8 && canEvaluate) {
                var ret = new Promise(INTERNAL);
                ret._captureStackTrace();
                var HolderClass = holderClasses[last - 1];
                var holder = new HolderClass(fn);
                var callbacks = thenCallbacks;

                for (var i = 0; i < last; ++i) {
                    var maybePromise = tryConvertToPromise(arguments[i], ret);
                    if (maybePromise instanceof Promise) {
                        maybePromise = maybePromise._target();
                        var bitField = maybePromise._bitField;
                        ;
                        if (((bitField & 50397184) === 0)) {
                            maybePromise._then(callbacks[i], reject,
                                               undefined, ret, holder);
                            promiseSetters[i](maybePromise, holder);
                            holder.asyncNeeded = false;
                        } else if (((bitField & 33554432) !== 0)) {
                            callbacks[i].call(ret,
                                              maybePromise._value(), holder);
                        } else if (((bitField & 16777216) !== 0)) {
                            ret._reject(maybePromise._reason());
                        } else {
                            ret._cancel();
                        }
                    } else {
                        callbacks[i].call(ret, maybePromise, holder);
                    }
                }

                if (!ret._isFateSealed()) {
                    if (holder.asyncNeeded) {
                        var context = Promise._getContext();
                        holder.fn = util.contextBind(context, holder.fn);
                    }
                    ret._setAsyncGuaranteed();
                    ret._setOnCancel(holder);
                }
                return ret;
            }
        }
    }
    var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len ; ++$_i) {args[$_i] = arguments[$_i ];};
    if (fn) args.pop();
    var ret = new PromiseArray(args).promise();
    return fn !== undefined ? ret.spread(fn) : ret;
};

};
"use strict";
module.exports = function(Promise,
                          PromiseArray,
                          apiRejection,
                          tryConvertToPromise,
                          INTERNAL,
                          debug) {
var util = require("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

function MappingPromiseArray(promises, fn, limit, _filter) {
    this.constructor$(promises);
    this._promise._captureStackTrace();
    var context = Promise._getContext();
    this._callback = util.contextBind(context, fn);
    this._preservedValues = _filter === INTERNAL
        ? new Array(this.length())
        : null;
    this._limit = limit;
    this._inFlight = 0;
    this._queue = [];
    async.invoke(this._asyncInit, this, undefined);
    if (util.isArray(promises)) {
        for (var i = 0; i < promises.length; ++i) {
            var maybePromise = promises[i];
            if (maybePromise instanceof Promise) {
                maybePromise.suppressUnhandledRejections();
            }
        }
    }
}
util.inherits(MappingPromiseArray, PromiseArray);

MappingPromiseArray.prototype._asyncInit = function() {
    this._init$(undefined, -2);
};

MappingPromiseArray.prototype._init = function () {};

MappingPromiseArray.prototype._promiseFulfilled = function (value, index) {
    var values = this._values;
    var length = this.length();
    var preservedValues = this._preservedValues;
    var limit = this._limit;

    if (index < 0) {
        index = (index * -1) - 1;
        values[index] = value;
        if (limit >= 1) {
            this._inFlight--;
            this._drainQueue();
            if (this._isResolved()) return true;
        }
    } else {
        if (limit >= 1 && this._inFlight >= limit) {
            values[index] = value;
            this._queue.push(index);
            return false;
        }
        if (preservedValues !== null) preservedValues[index] = value;

        var promise = this._promise;
        var callback = this._callback;
        var receiver = promise._boundValue();
        promise._pushContext();
        var ret = tryCatch(callback).call(receiver, value, index, length);
        var promiseCreated = promise._popContext();
        debug.checkForgottenReturns(
            ret,
            promiseCreated,
            preservedValues !== null ? "Promise.filter" : "Promise.map",
            promise
        );
        if (ret === errorObj) {
            this._reject(ret.e);
            return true;
        }

        var maybePromise = tryConvertToPromise(ret, this._promise);
        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            var bitField = maybePromise._bitField;
            ;
            if (((bitField & 50397184) === 0)) {
                if (limit >= 1) this._inFlight++;
                values[index] = maybePromise;
                maybePromise._proxy(this, (index + 1) * -1);
                return false;
            } else if (((bitField & 33554432) !== 0)) {
                ret = maybePromise._value();
            } else if (((bitField & 16777216) !== 0)) {
                this._reject(maybePromise._reason());
                return true;
            } else {
                this._cancel();
                return true;
            }
        }
        values[index] = ret;
    }
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= length) {
        if (preservedValues !== null) {
            this._filter(values, preservedValues);
        } else {
            this._resolve(values);
        }
        return true;
    }
    return false;
};

MappingPromiseArray.prototype._drainQueue = function () {
    var queue = this._queue;
    var limit = this._limit;
    var values = this._values;
    while (queue.length > 0 && this._inFlight < limit) {
        if (this._isResolved()) return;
        var index = queue.pop();
        this._promiseFulfilled(values[index], index);
    }
};

MappingPromiseArray.prototype._filter = function (booleans, values) {
    var len = values.length;
    var ret = new Array(len);
    var j = 0;
    for (var i = 0; i < len; ++i) {
        if (booleans[i]) ret[j++] = values[i];
    }
    ret.length = j;
    this._resolve(ret);
};

MappingPromiseArray.prototype.preservedValues = function () {
    return this._preservedValues;
};

function map(promises, fn, options, _filter) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }

    var limit = 0;
    if (options !== undefined) {
        if (typeof options === "object" && options !== null) {
            if (typeof options.concurrency !== "number") {
                return Promise.reject(
                    new TypeError("'concurrency' must be a number but it is " +
                                    util.classString(options.concurrency)));
            }
            limit = options.concurrency;
        } else {
            return Promise.reject(new TypeError(
                            "options argument must be an object but it is " +
                             util.classString(options)));
        }
    }
    limit = typeof limit === "number" &&
        isFinite(limit) && limit >= 1 ? limit : 0;
    return new MappingPromiseArray(promises, fn, limit, _filter).promise();
}

Promise.prototype.map = function (fn, options) {
    return map(this, fn, options, null);
};

Promise.map = function (promises, fn, options, _filter) {
    return map(promises, fn, options, _filter);
};


};
"use strict";
module.exports =
function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {
var util = require("./util");
var tryCatch = util.tryCatch;

Promise.method = function (fn) {
    if (typeof fn !== "function") {
        throw new Promise.TypeError("expecting a function but got " + util.classString(fn));
    }
    return function () {
        var ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._pushContext();
        var value = tryCatch(fn).apply(this, arguments);
        var promiseCreated = ret._popContext();
        debug.checkForgottenReturns(
            value, promiseCreated, "Promise.method", ret);
        ret._resolveFromSyncValue(value);
        return ret;
    };
};

Promise.attempt = Promise["try"] = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._pushContext();
    var value;
    if (arguments.length > 1) {
        debug.deprecated("calling Promise.try with more than 1 argument");
        var arg = arguments[1];
        var ctx = arguments[2];
        value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg)
                                  : tryCatch(fn).call(ctx, arg);
    } else {
        value = tryCatch(fn)();
    }
    var promiseCreated = ret._popContext();
    debug.checkForgottenReturns(
        value, promiseCreated, "Promise.try", ret);
    ret._resolveFromSyncValue(value);
    return ret;
};

Promise.prototype._resolveFromSyncValue = function (value) {
    if (value === util.errorObj) {
        this._rejectCallback(value.e, false);
    } else {
        this._resolveCallback(value, true);
    }
};
};
"use strict";
var util = require("./util");
var maybeWrapAsError = util.maybeWrapAsError;
var errors = require("./errors");
var OperationalError = errors.OperationalError;
var es5 = require("./es5");

function isUntypedError(obj) {
    return obj instanceof Error &&
        es5.getPrototypeOf(obj) === Error.prototype;
}

var rErrorKey = /^(?:name|message|stack|cause)$/;
function wrapAsOperationalError(obj) {
    var ret;
    if (isUntypedError(obj)) {
        ret = new OperationalError(obj);
        ret.name = obj.name;
        ret.message = obj.message;
        ret.stack = obj.stack;
        var keys = es5.keys(obj);
        for (var i = 0; i < keys.length; ++i) {
            var key = keys[i];
            if (!rErrorKey.test(key)) {
                ret[key] = obj[key];
            }
        }
        return ret;
    }
    util.markAsOriginatingFromRejection(obj);
    return obj;
}

function nodebackForPromise(promise, multiArgs) {
    return function(err, value) {
        if (promise === null) return;
        if (err) {
            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));
            promise._attachExtraTrace(wrapped);
            promise._reject(wrapped);
        } else if (!multiArgs) {
            promise._fulfill(value);
        } else {
            var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};
            promise._fulfill(args);
        }
        promise = null;
    };
}

module.exports = nodebackForPromise;
"use strict";
module.exports = function(Promise) {
var util = require("./util");
var async = Promise._async;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function spreadAdapter(val, nodeback) {
    var promise = this;
    if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);
    var ret =
        tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}

function successAdapter(val, nodeback) {
    var promise = this;
    var receiver = promise._boundValue();
    var ret = val === undefined
        ? tryCatch(nodeback).call(receiver, null)
        : tryCatch(nodeback).call(receiver, null, val);
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}
function errorAdapter(reason, nodeback) {
    var promise = this;
    if (!reason) {
        var newReason = new Error(reason + "");
        newReason.cause = reason;
        reason = newReason;
    }
    var ret = tryCatch(nodeback).call(promise._boundValue(), reason);
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}

Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback,
                                                                     options) {
    if (typeof nodeback == "function") {
        var adapter = successAdapter;
        if (options !== undefined && Object(options).spread) {
            adapter = spreadAdapter;
        }
        this._then(
            adapter,
            errorAdapter,
            undefined,
            this,
            nodeback
        );
    }
    return this;
};
};
"use strict";
module.exports = function() {
var makeSelfResolutionError = function () {
    return new TypeError("circular promise resolution chain\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var reflectHandler = function() {
    return new Promise.PromiseInspection(this._target());
};
var apiRejection = function(msg) {
    return Promise.reject(new TypeError(msg));
};
function Proxyable() {}
var UNDEFINED_BINDING = {};
var util = require("./util");
util.setReflectHandler(reflectHandler);

var getDomain = function() {
    var domain = process.domain;
    if (domain === undefined) {
        return null;
    }
    return domain;
};
var getContextDefault = function() {
    return null;
};
var getContextDomain = function() {
    return {
        domain: getDomain(),
        async: null
    };
};
var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ?
    require("async_hooks").AsyncResource : null;
var getContextAsyncHooks = function() {
    return {
        domain: getDomain(),
        async: new AsyncResource("Bluebird::Promise")
    };
};
var getContext = util.isNode ? getContextDomain : getContextDefault;
util.notEnumerableProp(Promise, "_getContext", getContext);
var enableAsyncHooks = function() {
    getContext = getContextAsyncHooks;
    util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks);
};
var disableAsyncHooks = function() {
    getContext = getContextDomain;
    util.notEnumerableProp(Promise, "_getContext", getContextDomain);
};

var es5 = require("./es5");
var Async = require("./async");
var async = new Async();
es5.defineProperty(Promise, "_async", {value: async});
var errors = require("./errors");
var TypeError = Promise.TypeError = errors.TypeError;
Promise.RangeError = errors.RangeError;
var CancellationError = Promise.CancellationError = errors.CancellationError;
Promise.TimeoutError = errors.TimeoutError;
Promise.OperationalError = errors.OperationalError;
Promise.RejectionError = errors.OperationalError;
Promise.AggregateError = errors.AggregateError;
var INTERNAL = function(){};
var APPLY = {};
var NEXT_FILTER = {};
var tryConvertToPromise = require("./thenables")(Promise, INTERNAL);
var PromiseArray =
    require("./promise_array")(Promise, INTERNAL,
                               tryConvertToPromise, apiRejection, Proxyable);
var Context = require("./context")(Promise);
 /*jshint unused:false*/
var createContext = Context.create;

var debug = require("./debuggability")(Promise, Context,
    enableAsyncHooks, disableAsyncHooks);
var CapturedTrace = debug.CapturedTrace;
var PassThroughHandlerContext =
    require("./finally")(Promise, tryConvertToPromise, NEXT_FILTER);
var catchFilter = require("./catch_filter")(NEXT_FILTER);
var nodebackForPromise = require("./nodeback");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
function check(self, executor) {
    if (self == null || self.constructor !== Promise) {
        throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (typeof executor !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(executor));
    }

}

function Promise(executor) {
    if (executor !== INTERNAL) {
        check(this, executor);
    }
    this._bitField = 0;
    this._fulfillmentHandler0 = undefined;
    this._rejectionHandler0 = undefined;
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._resolveFromExecutor(executor);
    this._promiseCreated();
    this._fireEvent("promiseCreated", this);
}

Promise.prototype.toString = function () {
    return "[object Promise]";
};

Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {
    var len = arguments.length;
    if (len > 1) {
        var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return apiRejection("Catch statement predicate: " +
                    "expecting an object but got " + util.classString(item));
            }
        }
        catchInstances.length = j;
        fn = arguments[i];

        if (typeof fn !== "function") {
            throw new TypeError("The last argument to .catch() " +
                "must be a function, got " + util.toString(fn));
        }
        return this.then(undefined, catchFilter(catchInstances, fn, this));
    }
    return this.then(undefined, fn);
};

Promise.prototype.reflect = function () {
    return this._then(reflectHandler,
        reflectHandler, undefined, this, undefined);
};

Promise.prototype.then = function (didFulfill, didReject) {
    if (debug.warnings() && arguments.length > 0 &&
        typeof didFulfill !== "function" &&
        typeof didReject !== "function") {
        var msg = ".then() only accepts functions but was passed: " +
                util.classString(didFulfill);
        if (arguments.length > 1) {
            msg += ", " + util.classString(didReject);
        }
        this._warn(msg);
    }
    return this._then(didFulfill, didReject, undefined, undefined, undefined);
};

Promise.prototype.done = function (didFulfill, didReject) {
    var promise =
        this._then(didFulfill, didReject, undefined, undefined, undefined);
    promise._setIsFinal();
};

Promise.prototype.spread = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    return this.all()._then(fn, undefined, undefined, APPLY, undefined);
};

Promise.prototype.toJSON = function () {
    var ret = {
        isFulfilled: false,
        isRejected: false,
        fulfillmentValue: undefined,
        rejectionReason: undefined
    };
    if (this.isFulfilled()) {
        ret.fulfillmentValue = this.value();
        ret.isFulfilled = true;
    } else if (this.isRejected()) {
        ret.rejectionReason = this.reason();
        ret.isRejected = true;
    }
    return ret;
};

Promise.prototype.all = function () {
    if (arguments.length > 0) {
        this._warn(".all() was passed arguments but it does not take any");
    }
    return new PromiseArray(this).promise();
};

Promise.prototype.error = function (fn) {
    return this.caught(util.originatesFromRejection, fn);
};

Promise.getNewLibraryCopy = module.exports;

Promise.is = function (val) {
    return val instanceof Promise;
};

Promise.fromNode = Promise.fromCallback = function(fn) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs
                                         : false;
    var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));
    if (result === errorObj) {
        ret._rejectCallback(result.e, true);
    }
    if (!ret._isFateSealed()) ret._setAsyncGuaranteed();
    return ret;
};

Promise.all = function (promises) {
    return new PromiseArray(promises).promise();
};

Promise.cast = function (obj) {
    var ret = tryConvertToPromise(obj);
    if (!(ret instanceof Promise)) {
        ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._setFulfilled();
        ret._rejectionHandler0 = obj;
    }
    return ret;
};

Promise.resolve = Promise.fulfilled = Promise.cast;

Promise.reject = Promise.rejected = function (reason) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._rejectCallback(reason, true);
    return ret;
};

Promise.setScheduler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    return async.setScheduler(fn);
};

Promise.prototype._then = function (
    didFulfill,
    didReject,
    _,    receiver,
    internalData
) {
    var haveInternalData = internalData !== undefined;
    var promise = haveInternalData ? internalData : new Promise(INTERNAL);
    var target = this._target();
    var bitField = target._bitField;

    if (!haveInternalData) {
        promise._propagateFrom(this, 3);
        promise._captureStackTrace();
        if (receiver === undefined &&
            ((this._bitField & 2097152) !== 0)) {
            if (!((bitField & 50397184) === 0)) {
                receiver = this._boundValue();
            } else {
                receiver = target === this ? undefined : this._boundTo;
            }
        }
        this._fireEvent("promiseChained", this, promise);
    }

    var context = getContext();
    if (!((bitField & 50397184) === 0)) {
        var handler, value, settler = target._settlePromiseCtx;
        if (((bitField & 33554432) !== 0)) {
            value = target._rejectionHandler0;
            handler = didFulfill;
        } else if (((bitField & 16777216) !== 0)) {
            value = target._fulfillmentHandler0;
            handler = didReject;
            target._unsetRejectionIsUnhandled();
        } else {
            settler = target._settlePromiseLateCancellationObserver;
            value = new CancellationError("late cancellation observer");
            target._attachExtraTrace(value);
            handler = didReject;
        }

        async.invoke(settler, target, {
            handler: util.contextBind(context, handler),
            promise: promise,
            receiver: receiver,
            value: value
        });
    } else {
        target._addCallbacks(didFulfill, didReject, promise,
                receiver, context);
    }

    return promise;
};

Promise.prototype._length = function () {
    return this._bitField & 65535;
};

Promise.prototype._isFateSealed = function () {
    return (this._bitField & 117506048) !== 0;
};

Promise.prototype._isFollowing = function () {
    return (this._bitField & 67108864) === 67108864;
};

Promise.prototype._setLength = function (len) {
    this._bitField = (this._bitField & -65536) |
        (len & 65535);
};

Promise.prototype._setFulfilled = function () {
    this._bitField = this._bitField | 33554432;
    this._fireEvent("promiseFulfilled", this);
};

Promise.prototype._setRejected = function () {
    this._bitField = this._bitField | 16777216;
    this._fireEvent("promiseRejected", this);
};

Promise.prototype._setFollowing = function () {
    this._bitField = this._bitField | 67108864;
    this._fireEvent("promiseResolved", this);
};

Promise.prototype._setIsFinal = function () {
    this._bitField = this._bitField | 4194304;
};

Promise.prototype._isFinal = function () {
    return (this._bitField & 4194304) > 0;
};

Promise.prototype._unsetCancelled = function() {
    this._bitField = this._bitField & (~65536);
};

Promise.prototype._setCancelled = function() {
    this._bitField = this._bitField | 65536;
    this._fireEvent("promiseCancelled", this);
};

Promise.prototype._setWillBeCancelled = function() {
    this._bitField = this._bitField | 8388608;
};

Promise.prototype._setAsyncGuaranteed = function() {
    if (async.hasCustomScheduler()) return;
    var bitField = this._bitField;
    this._bitField = bitField |
        (((bitField & 536870912) >> 2) ^
        134217728);
};

Promise.prototype._setNoAsyncGuarantee = function() {
    this._bitField = (this._bitField | 536870912) &
        (~134217728);
};

Promise.prototype._receiverAt = function (index) {
    var ret = index === 0 ? this._receiver0 : this[
            index * 4 - 4 + 3];
    if (ret === UNDEFINED_BINDING) {
        return undefined;
    } else if (ret === undefined && this._isBound()) {
        return this._boundValue();
    }
    return ret;
};

Promise.prototype._promiseAt = function (index) {
    return this[
            index * 4 - 4 + 2];
};

Promise.prototype._fulfillmentHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 0];
};

Promise.prototype._rejectionHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 1];
};

Promise.prototype._boundValue = function() {};

Promise.prototype._migrateCallback0 = function (follower) {
    var bitField = follower._bitField;
    var fulfill = follower._fulfillmentHandler0;
    var reject = follower._rejectionHandler0;
    var promise = follower._promise0;
    var receiver = follower._receiverAt(0);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._migrateCallbackAt = function (follower, index) {
    var fulfill = follower._fulfillmentHandlerAt(index);
    var reject = follower._rejectionHandlerAt(index);
    var promise = follower._promiseAt(index);
    var receiver = follower._receiverAt(index);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._addCallbacks = function (
    fulfill,
    reject,
    promise,
    receiver,
    context
) {
    var index = this._length();

    if (index >= 65535 - 4) {
        index = 0;
        this._setLength(0);
    }

    if (index === 0) {
        this._promise0 = promise;
        this._receiver0 = receiver;
        if (typeof fulfill === "function") {
            this._fulfillmentHandler0 = util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this._rejectionHandler0 = util.contextBind(context, reject);
        }
    } else {
        var base = index * 4 - 4;
        this[base + 2] = promise;
        this[base + 3] = receiver;
        if (typeof fulfill === "function") {
            this[base + 0] =
                util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this[base + 1] =
                util.contextBind(context, reject);
        }
    }
    this._setLength(index + 1);
    return index;
};

Promise.prototype._proxy = function (proxyable, arg) {
    this._addCallbacks(undefined, undefined, arg, proxyable, null);
};

Promise.prototype._resolveCallback = function(value, shouldBind) {
    if (((this._bitField & 117506048) !== 0)) return;
    if (value === this)
        return this._rejectCallback(makeSelfResolutionError(), false);
    var maybePromise = tryConvertToPromise(value, this);
    if (!(maybePromise instanceof Promise)) return this._fulfill(value);

    if (shouldBind) this._propagateFrom(maybePromise, 2);


    var promise = maybePromise._target();

    if (promise === this) {
        this._reject(makeSelfResolutionError());
        return;
    }

    var bitField = promise._bitField;
    if (((bitField & 50397184) === 0)) {
        var len = this._length();
        if (len > 0) promise._migrateCallback0(this);
        for (var i = 1; i < len; ++i) {
            promise._migrateCallbackAt(this, i);
        }
        this._setFollowing();
        this._setLength(0);
        this._setFollowee(maybePromise);
    } else if (((bitField & 33554432) !== 0)) {
        this._fulfill(promise._value());
    } else if (((bitField & 16777216) !== 0)) {
        this._reject(promise._reason());
    } else {
        var reason = new CancellationError("late cancellation observer");
        promise._attachExtraTrace(reason);
        this._reject(reason);
    }
};

Promise.prototype._rejectCallback =
function(reason, synchronous, ignoreNonErrorWarnings) {
    var trace = util.ensureErrorObject(reason);
    var hasStack = trace === reason;
    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {
        var message = "a promise was rejected with a non-error: " +
            util.classString(reason);
        this._warn(message, true);
    }
    this._attachExtraTrace(trace, synchronous ? hasStack : false);
    this._reject(reason);
};

Promise.prototype._resolveFromExecutor = function (executor) {
    if (executor === INTERNAL) return;
    var promise = this;
    this._captureStackTrace();
    this._pushContext();
    var synchronous = true;
    var r = this._execute(executor, function(value) {
        promise._resolveCallback(value);
    }, function (reason) {
        promise._rejectCallback(reason, synchronous);
    });
    synchronous = false;
    this._popContext();

    if (r !== undefined) {
        promise._rejectCallback(r, true);
    }
};

Promise.prototype._settlePromiseFromHandler = function (
    handler, receiver, value, promise
) {
    var bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;
    promise._pushContext();
    var x;
    if (receiver === APPLY) {
        if (!value || typeof value.length !== "number") {
            x = errorObj;
            x.e = new TypeError("cannot .spread() a non-array: " +
                                    util.classString(value));
        } else {
            x = tryCatch(handler).apply(this._boundValue(), value);
        }
    } else {
        x = tryCatch(handler).call(receiver, value);
    }
    var promiseCreated = promise._popContext();
    bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;

    if (x === NEXT_FILTER) {
        promise._reject(value);
    } else if (x === errorObj) {
        promise._rejectCallback(x.e, false);
    } else {
        debug.checkForgottenReturns(x, promiseCreated, "",  promise, this);
        promise._resolveCallback(x);
    }
};

Promise.prototype._target = function() {
    var ret = this;
    while (ret._isFollowing()) ret = ret._followee();
    return ret;
};

Promise.prototype._followee = function() {
    return this._rejectionHandler0;
};

Promise.prototype._setFollowee = function(promise) {
    this._rejectionHandler0 = promise;
};

Promise.prototype._settlePromise = function(promise, handler, receiver, value) {
    var isPromise = promise instanceof Promise;
    var bitField = this._bitField;
    var asyncGuaranteed = ((bitField & 134217728) !== 0);
    if (((bitField & 65536) !== 0)) {
        if (isPromise) promise._invokeInternalOnCancel();

        if (receiver instanceof PassThroughHandlerContext &&
            receiver.isFinallyHandler()) {
            receiver.cancelPromise = promise;
            if (tryCatch(handler).call(receiver, value) === errorObj) {
                promise._reject(errorObj.e);
            }
        } else if (handler === reflectHandler) {
            promise._fulfill(reflectHandler.call(receiver));
        } else if (receiver instanceof Proxyable) {
            receiver._promiseCancelled(promise);
        } else if (isPromise || promise instanceof PromiseArray) {
            promise._cancel();
        } else {
            receiver.cancel();
        }
    } else if (typeof handler === "function") {
        if (!isPromise) {
            handler.call(receiver, value, promise);
        } else {
            if (asyncGuaranteed) promise._setAsyncGuaranteed();
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (receiver instanceof Proxyable) {
        if (!receiver._isResolved()) {
            if (((bitField & 33554432) !== 0)) {
                receiver._promiseFulfilled(value, promise);
            } else {
                receiver._promiseRejected(value, promise);
            }
        }
    } else if (isPromise) {
        if (asyncGuaranteed) promise._setAsyncGuaranteed();
        if (((bitField & 33554432) !== 0)) {
            promise._fulfill(value);
        } else {
            promise._reject(value);
        }
    }
};

Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) {
    var handler = ctx.handler;
    var promise = ctx.promise;
    var receiver = ctx.receiver;
    var value = ctx.value;
    if (typeof handler === "function") {
        if (!(promise instanceof Promise)) {
            handler.call(receiver, value, promise);
        } else {
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (promise instanceof Promise) {
        promise._reject(value);
    }
};

Promise.prototype._settlePromiseCtx = function(ctx) {
    this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);
};

Promise.prototype._settlePromise0 = function(handler, value, bitField) {
    var promise = this._promise0;
    var receiver = this._receiverAt(0);
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._settlePromise(promise, handler, receiver, value);
};

Promise.prototype._clearCallbackDataAtIndex = function(index) {
    var base = index * 4 - 4;
    this[base + 2] =
    this[base + 3] =
    this[base + 0] =
    this[base + 1] = undefined;
};

Promise.prototype._fulfill = function (value) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    if (value === this) {
        var err = makeSelfResolutionError();
        this._attachExtraTrace(err);
        return this._reject(err);
    }
    this._setFulfilled();
    this._rejectionHandler0 = value;

    if ((bitField & 65535) > 0) {
        if (((bitField & 134217728) !== 0)) {
            this._settlePromises();
        } else {
            async.settlePromises(this);
        }
        this._dereferenceTrace();
    }
};

Promise.prototype._reject = function (reason) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    this._setRejected();
    this._fulfillmentHandler0 = reason;

    if (this._isFinal()) {
        return async.fatalError(reason, util.isNode);
    }

    if ((bitField & 65535) > 0) {
        async.settlePromises(this);
    } else {
        this._ensurePossibleRejectionHandled();
    }
};

Promise.prototype._fulfillPromises = function (len, value) {
    for (var i = 1; i < len; i++) {
        var handler = this._fulfillmentHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, value);
    }
};

Promise.prototype._rejectPromises = function (len, reason) {
    for (var i = 1; i < len; i++) {
        var handler = this._rejectionHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, reason);
    }
};

Promise.prototype._settlePromises = function () {
    var bitField = this._bitField;
    var len = (bitField & 65535);

    if (len > 0) {
        if (((bitField & 16842752) !== 0)) {
            var reason = this._fulfillmentHandler0;
            this._settlePromise0(this._rejectionHandler0, reason, bitField);
            this._rejectPromises(len, reason);
        } else {
            var value = this._rejectionHandler0;
            this._settlePromise0(this._fulfillmentHandler0, value, bitField);
            this._fulfillPromises(len, value);
        }
        this._setLength(0);
    }
    this._clearCancellationData();
};

Promise.prototype._settledValue = function() {
    var bitField = this._bitField;
    if (((bitField & 33554432) !== 0)) {
        return this._rejectionHandler0;
    } else if (((bitField & 16777216) !== 0)) {
        return this._fulfillmentHandler0;
    }
};

if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
    es5.defineProperty(Promise.prototype, Symbol.toStringTag, {
        get: function () {
            return "Object";
        }
    });
}

function deferResolve(v) {this.promise._resolveCallback(v);}
function deferReject(v) {this.promise._rejectCallback(v, false);}

Promise.defer = Promise.pending = function() {
    debug.deprecated("Promise.defer", "new Promise");
    var promise = new Promise(INTERNAL);
    return {
        promise: promise,
        resolve: deferResolve,
        reject: deferReject
    };
};

util.notEnumerableProp(Promise,
                       "_makeSelfResolutionError",
                       makeSelfResolutionError);

require("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection,
    debug);
require("./bind")(Promise, INTERNAL, tryConvertToPromise, debug);
require("./cancel")(Promise, PromiseArray, apiRejection, debug);
require("./direct_resolve")(Promise);
require("./synchronous_inspection")(Promise);
require("./join")(
    Promise, PromiseArray, tryConvertToPromise, INTERNAL, async);
Promise.Promise = Promise;
Promise.version = "3.7.2";
require('./call_get.js')(Promise);
require('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);
require('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
require('./nodeify.js')(Promise);
require('./promisify.js')(Promise, INTERNAL);
require('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);
require('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);
require('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
require('./settle.js')(Promise, PromiseArray, debug);
require('./some.js')(Promise, PromiseArray, apiRejection);
require('./timers.js')(Promise, INTERNAL, debug);
require('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);
require('./any.js')(Promise);
require('./each.js')(Promise, INTERNAL);
require('./filter.js')(Promise, INTERNAL);
                                                         
    util.toFastProperties(Promise);                                          
    util.toFastProperties(Promise.prototype);                                
    function fillTypes(value) {                                              
        var p = new Promise(INTERNAL);                                       
        p._fulfillmentHandler0 = value;                                      
        p._rejectionHandler0 = value;                                        
        p._promise0 = value;                                                 
        p._receiver0 = value;                                                
    }                                                                        
    // Complete slack tracking, opt out of field-type tracking and           
    // stabilize map                                                         
    fillTypes({a: 1});                                                       
    fillTypes({b: 2});                                                       
    fillTypes({c: 3});                                                       
    fillTypes(1);                                                            
    fillTypes(function(){});                                                 
    fillTypes(undefined);                                                    
    fillTypes(false);                                                        
    fillTypes(new Promise(INTERNAL));                                        
    debug.setBounds(Async.firstLineError, util.lastLineError);               
    return Promise;                                                          

};
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise,
    apiRejection, Proxyable) {
var util = require("./util");
var isArray = util.isArray;

function toResolutionValue(val) {
    switch(val) {
    case -2: return [];
    case -3: return {};
    case -6: return new Map();
    }
}

function PromiseArray(values) {
    var promise = this._promise = new Promise(INTERNAL);
    if (values instanceof Promise) {
        promise._propagateFrom(values, 3);
        values.suppressUnhandledRejections();
    }
    promise._setOnCancel(this);
    this._values = values;
    this._length = 0;
    this._totalResolved = 0;
    this._init(undefined, -2);
}
util.inherits(PromiseArray, Proxyable);

PromiseArray.prototype.length = function () {
    return this._length;
};

PromiseArray.prototype.promise = function () {
    return this._promise;
};

PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {
    var values = tryConvertToPromise(this._values, this._promise);
    if (values instanceof Promise) {
        values = values._target();
        var bitField = values._bitField;
        ;
        this._values = values;

        if (((bitField & 50397184) === 0)) {
            this._promise._setAsyncGuaranteed();
            return values._then(
                init,
                this._reject,
                undefined,
                this,
                resolveValueIfEmpty
           );
        } else if (((bitField & 33554432) !== 0)) {
            values = values._value();
        } else if (((bitField & 16777216) !== 0)) {
            return this._reject(values._reason());
        } else {
            return this._cancel();
        }
    }
    values = util.asArray(values);
    if (values === null) {
        var err = apiRejection(
            "expecting an array or an iterable object but got " + util.classString(values)).reason();
        this._promise._rejectCallback(err, false);
        return;
    }

    if (values.length === 0) {
        if (resolveValueIfEmpty === -5) {
            this._resolveEmptyArray();
        }
        else {
            this._resolve(toResolutionValue(resolveValueIfEmpty));
        }
        return;
    }
    this._iterate(values);
};

PromiseArray.prototype._iterate = function(values) {
    var len = this.getActualLength(values.length);
    this._length = len;
    this._values = this.shouldCopyValues() ? new Array(len) : this._values;
    var result = this._promise;
    var isResolved = false;
    var bitField = null;
    for (var i = 0; i < len; ++i) {
        var maybePromise = tryConvertToPromise(values[i], result);

        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            bitField = maybePromise._bitField;
        } else {
            bitField = null;
        }

        if (isResolved) {
            if (bitField !== null) {
                maybePromise.suppressUnhandledRejections();
            }
        } else if (bitField !== null) {
            if (((bitField & 50397184) === 0)) {
                maybePromise._proxy(this, i);
                this._values[i] = maybePromise;
            } else if (((bitField & 33554432) !== 0)) {
                isResolved = this._promiseFulfilled(maybePromise._value(), i);
            } else if (((bitField & 16777216) !== 0)) {
                isResolved = this._promiseRejected(maybePromise._reason(), i);
            } else {
                isResolved = this._promiseCancelled(i);
            }
        } else {
            isResolved = this._promiseFulfilled(maybePromise, i);
        }
    }
    if (!isResolved) result._setAsyncGuaranteed();
};

PromiseArray.prototype._isResolved = function () {
    return this._values === null;
};

PromiseArray.prototype._resolve = function (value) {
    this._values = null;
    this._promise._fulfill(value);
};

PromiseArray.prototype._cancel = function() {
    if (this._isResolved() || !this._promise._isCancellable()) return;
    this._values = null;
    this._promise._cancel();
};

PromiseArray.prototype._reject = function (reason) {
    this._values = null;
    this._promise._rejectCallback(reason, false);
};

PromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

PromiseArray.prototype._promiseCancelled = function() {
    this._cancel();
    return true;
};

PromiseArray.prototype._promiseRejected = function (reason) {
    this._totalResolved++;
    this._reject(reason);
    return true;
};

PromiseArray.prototype._resultCancelled = function() {
    if (this._isResolved()) return;
    var values = this._values;
    this._cancel();
    if (values instanceof Promise) {
        values.cancel();
    } else {
        for (var i = 0; i < values.length; ++i) {
            if (values[i] instanceof Promise) {
                values[i].cancel();
            }
        }
    }
};

PromiseArray.prototype.shouldCopyValues = function () {
    return true;
};

PromiseArray.prototype.getActualLength = function (len) {
    return len;
};

return PromiseArray;
};
"use strict";
module.exports = function(Promise, INTERNAL) {
var THIS = {};
var util = require("./util");
var nodebackForPromise = require("./nodeback");
var withAppended = util.withAppended;
var maybeWrapAsError = util.maybeWrapAsError;
var canEvaluate = util.canEvaluate;
var TypeError = require("./errors").TypeError;
var defaultSuffix = "Async";
var defaultPromisified = {__isPromisified__: true};
var noCopyProps = [
    "arity",    "length",
    "name",
    "arguments",
    "caller",
    "callee",
    "prototype",
    "__isPromisified__"
];
var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$");

var defaultFilter = function(name) {
    return util.isIdentifier(name) &&
        name.charAt(0) !== "_" &&
        name !== "constructor";
};

function propsFilter(key) {
    return !noCopyPropsPattern.test(key);
}

function isPromisified(fn) {
    try {
        return fn.__isPromisified__ === true;
    }
    catch (e) {
        return false;
    }
}

function hasPromisified(obj, key, suffix) {
    var val = util.getDataPropertyOrDefault(obj, key + suffix,
                                            defaultPromisified);
    return val ? isPromisified(val) : false;
}
function checkValid(ret, suffix, suffixRegexp) {
    for (var i = 0; i < ret.length; i += 2) {
        var key = ret[i];
        if (suffixRegexp.test(key)) {
            var keyWithoutAsyncSuffix = key.replace(suffixRegexp, "");
            for (var j = 0; j < ret.length; j += 2) {
                if (ret[j] === keyWithoutAsyncSuffix) {
                    throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a    See http://goo.gl/MqrFmX\u000a"
                        .replace("%s", suffix));
                }
            }
        }
    }
}

function promisifiableMethods(obj, suffix, suffixRegexp, filter) {
    var keys = util.inheritedDataKeys(obj);
    var ret = [];
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var value = obj[key];
        var passesDefaultFilter = filter === defaultFilter
            ? true : defaultFilter(key, value, obj);
        if (typeof value === "function" &&
            !isPromisified(value) &&
            !hasPromisified(obj, key, suffix) &&
            filter(key, value, obj, passesDefaultFilter)) {
            ret.push(key, value);
        }
    }
    checkValid(ret, suffix, suffixRegexp);
    return ret;
}

var escapeIdentRegex = function(str) {
    return str.replace(/([$])/, "\\$");
};

var makeNodePromisifiedEval;
if (!false) {
var switchCaseArgumentOrder = function(likelyArgumentCount) {
    var ret = [likelyArgumentCount];
    var min = Math.max(0, likelyArgumentCount - 1 - 3);
    for(var i = likelyArgumentCount - 1; i >= min; --i) {
        ret.push(i);
    }
    for(var i = likelyArgumentCount + 1; i <= 3; ++i) {
        ret.push(i);
    }
    return ret;
};

var argumentSequence = function(argumentCount) {
    return util.filledRange(argumentCount, "_arg", "");
};

var parameterDeclaration = function(parameterCount) {
    return util.filledRange(
        Math.max(parameterCount, 3), "_arg", "");
};

var parameterCount = function(fn) {
    if (typeof fn.length === "number") {
        return Math.max(Math.min(fn.length, 1023 + 1), 0);
    }
    return 0;
};

makeNodePromisifiedEval =
function(callback, receiver, originalName, fn, _, multiArgs) {
    var newParameterCount = Math.max(0, parameterCount(fn) - 1);
    var argumentOrder = switchCaseArgumentOrder(newParameterCount);
    var shouldProxyThis = typeof callback === "string" || receiver === THIS;

    function generateCallForArgumentCount(count) {
        var args = argumentSequence(count).join(", ");
        var comma = count > 0 ? ", " : "";
        var ret;
        if (shouldProxyThis) {
            ret = "ret = callback.call(this, {{args}}, nodeback); break;\n";
        } else {
            ret = receiver === undefined
                ? "ret = callback({{args}}, nodeback); break;\n"
                : "ret = callback.call(receiver, {{args}}, nodeback); break;\n";
        }
        return ret.replace("{{args}}", args).replace(", ", comma);
    }

    function generateArgumentSwitchCase() {
        var ret = "";
        for (var i = 0; i < argumentOrder.length; ++i) {
            ret += "case " + argumentOrder[i] +":" +
                generateCallForArgumentCount(argumentOrder[i]);
        }

        ret += "                                                             \n\
        default:                                                             \n\
            var args = new Array(len + 1);                                   \n\
            var i = 0;                                                       \n\
            for (var i = 0; i < len; ++i) {                                  \n\
               args[i] = arguments[i];                                       \n\
            }                                                                \n\
            args[i] = nodeback;                                              \n\
            [CodeForCall]                                                    \n\
            break;                                                           \n\
        ".replace("[CodeForCall]", (shouldProxyThis
                                ? "ret = callback.apply(this, args);\n"
                                : "ret = callback.apply(receiver, args);\n"));
        return ret;
    }

    var getFunctionCode = typeof callback === "string"
                                ? ("this != null ? this['"+callback+"'] : fn")
                                : "fn";
    var body = "'use strict';                                                \n\
        var ret = function (Parameters) {                                    \n\
            'use strict';                                                    \n\
            var len = arguments.length;                                      \n\
            var promise = new Promise(INTERNAL);                             \n\
            promise._captureStackTrace();                                    \n\
            var nodeback = nodebackForPromise(promise, " + multiArgs + ");   \n\
            var ret;                                                         \n\
            var callback = tryCatch([GetFunctionCode]);                      \n\
            switch(len) {                                                    \n\
                [CodeForSwitchCase]                                          \n\
            }                                                                \n\
            if (ret === errorObj) {                                          \n\
                promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\
            }                                                                \n\
            if (!promise._isFateSealed()) promise._setAsyncGuaranteed();     \n\
            return promise;                                                  \n\
        };                                                                   \n\
        notEnumerableProp(ret, '__isPromisified__', true);                   \n\
        return ret;                                                          \n\
    ".replace("[CodeForSwitchCase]", generateArgumentSwitchCase())
        .replace("[GetFunctionCode]", getFunctionCode);
    body = body.replace("Parameters", parameterDeclaration(newParameterCount));
    return new Function("Promise",
                        "fn",
                        "receiver",
                        "withAppended",
                        "maybeWrapAsError",
                        "nodebackForPromise",
                        "tryCatch",
                        "errorObj",
                        "notEnumerableProp",
                        "INTERNAL",
                        body)(
                    Promise,
                    fn,
                    receiver,
                    withAppended,
                    maybeWrapAsError,
                    nodebackForPromise,
                    util.tryCatch,
                    util.errorObj,
                    util.notEnumerableProp,
                    INTERNAL);
};
}

function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) {
    var defaultThis = (function() {return this;})();
    var method = callback;
    if (typeof method === "string") {
        callback = fn;
    }
    function promisified() {
        var _receiver = receiver;
        if (receiver === THIS) _receiver = this;
        var promise = new Promise(INTERNAL);
        promise._captureStackTrace();
        var cb = typeof method === "string" && this !== defaultThis
            ? this[method] : callback;
        var fn = nodebackForPromise(promise, multiArgs);
        try {
            cb.apply(_receiver, withAppended(arguments, fn));
        } catch(e) {
            promise._rejectCallback(maybeWrapAsError(e), true, true);
        }
        if (!promise._isFateSealed()) promise._setAsyncGuaranteed();
        return promise;
    }
    util.notEnumerableProp(promisified, "__isPromisified__", true);
    return promisified;
}

var makeNodePromisified = canEvaluate
    ? makeNodePromisifiedEval
    : makeNodePromisifiedClosure;

function promisifyAll(obj, suffix, filter, promisifier, multiArgs) {
    var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$");
    var methods =
        promisifiableMethods(obj, suffix, suffixRegexp, filter);

    for (var i = 0, len = methods.length; i < len; i+= 2) {
        var key = methods[i];
        var fn = methods[i+1];
        var promisifiedKey = key + suffix;
        if (promisifier === makeNodePromisified) {
            obj[promisifiedKey] =
                makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);
        } else {
            var promisified = promisifier(fn, function() {
                return makeNodePromisified(key, THIS, key,
                                           fn, suffix, multiArgs);
            });
            util.notEnumerableProp(promisified, "__isPromisified__", true);
            obj[promisifiedKey] = promisified;
        }
    }
    util.toFastProperties(obj);
    return obj;
}

function promisify(callback, receiver, multiArgs) {
    return makeNodePromisified(callback, receiver, undefined,
                                callback, null, multiArgs);
}

Promise.promisify = function (fn, options) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    if (isPromisified(fn)) {
        return fn;
    }
    options = Object(options);
    var receiver = options.context === undefined ? THIS : options.context;
    var multiArgs = !!options.multiArgs;
    var ret = promisify(fn, receiver, multiArgs);
    util.copyDescriptors(fn, ret, propsFilter);
    return ret;
};

Promise.promisifyAll = function (target, options) {
    if (typeof target !== "function" && typeof target !== "object") {
        throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    options = Object(options);
    var multiArgs = !!options.multiArgs;
    var suffix = options.suffix;
    if (typeof suffix !== "string") suffix = defaultSuffix;
    var filter = options.filter;
    if (typeof filter !== "function") filter = defaultFilter;
    var promisifier = options.promisifier;
    if (typeof promisifier !== "function") promisifier = makeNodePromisified;

    if (!util.isIdentifier(suffix)) {
        throw new RangeError("suffix must be a valid identifier\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }

    var keys = util.inheritedDataKeys(target);
    for (var i = 0; i < keys.length; ++i) {
        var value = target[keys[i]];
        if (keys[i] !== "constructor" &&
            util.isClass(value)) {
            promisifyAll(value.prototype, suffix, filter, promisifier,
                multiArgs);
            promisifyAll(value, suffix, filter, promisifier, multiArgs);
        }
    }

    return promisifyAll(target, suffix, filter, promisifier, multiArgs);
};
};

"use strict";
module.exports = function(
    Promise, PromiseArray, tryConvertToPromise, apiRejection) {
var util = require("./util");
var isObject = util.isObject;
var es5 = require("./es5");
var Es6Map;
if (typeof Map === "function") Es6Map = Map;

var mapToEntries = (function() {
    var index = 0;
    var size = 0;

    function extractEntry(value, key) {
        this[index] = value;
        this[index + size] = key;
        index++;
    }

    return function mapToEntries(map) {
        size = map.size;
        index = 0;
        var ret = new Array(map.size * 2);
        map.forEach(extractEntry, ret);
        return ret;
    };
})();

var entriesToMap = function(entries) {
    var ret = new Es6Map();
    var length = entries.length / 2 | 0;
    for (var i = 0; i < length; ++i) {
        var key = entries[length + i];
        var value = entries[i];
        ret.set(key, value);
    }
    return ret;
};

function PropertiesPromiseArray(obj) {
    var isMap = false;
    var entries;
    if (Es6Map !== undefined && obj instanceof Es6Map) {
        entries = mapToEntries(obj);
        isMap = true;
    } else {
        var keys = es5.keys(obj);
        var len = keys.length;
        entries = new Array(len * 2);
        for (var i = 0; i < len; ++i) {
            var key = keys[i];
            entries[i] = obj[key];
            entries[i + len] = key;
        }
    }
    this.constructor$(entries);
    this._isMap = isMap;
    this._init$(undefined, isMap ? -6 : -3);
}
util.inherits(PropertiesPromiseArray, PromiseArray);

PropertiesPromiseArray.prototype._init = function () {};

PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        var val;
        if (this._isMap) {
            val = entriesToMap(this._values);
        } else {
            val = {};
            var keyOffset = this.length();
            for (var i = 0, len = this.length(); i < len; ++i) {
                val[this._values[i + keyOffset]] = this._values[i];
            }
        }
        this._resolve(val);
        return true;
    }
    return false;
};

PropertiesPromiseArray.prototype.shouldCopyValues = function () {
    return false;
};

PropertiesPromiseArray.prototype.getActualLength = function (len) {
    return len >> 1;
};

function props(promises) {
    var ret;
    var castValue = tryConvertToPromise(promises);

    if (!isObject(castValue)) {
        return apiRejection("cannot await properties of a non-object\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    } else if (castValue instanceof Promise) {
        ret = castValue._then(
            Promise.props, undefined, undefined, undefined, undefined);
    } else {
        ret = new PropertiesPromiseArray(castValue).promise();
    }

    if (castValue instanceof Promise) {
        ret._propagateFrom(castValue, 2);
    }
    return ret;
}

Promise.prototype.props = function () {
    return props(this);
};

Promise.props = function (promises) {
    return props(promises);
};
};
"use strict";
function arrayMove(src, srcIndex, dst, dstIndex, len) {
    for (var j = 0; j < len; ++j) {
        dst[j + dstIndex] = src[j + srcIndex];
        src[j + srcIndex] = void 0;
    }
}

function Queue(capacity) {
    this._capacity = capacity;
    this._length = 0;
    this._front = 0;
}

Queue.prototype._willBeOverCapacity = function (size) {
    return this._capacity < size;
};

Queue.prototype._pushOne = function (arg) {
    var length = this.length();
    this._checkCapacity(length + 1);
    var i = (this._front + length) & (this._capacity - 1);
    this[i] = arg;
    this._length = length + 1;
};

Queue.prototype.push = function (fn, receiver, arg) {
    var length = this.length() + 3;
    if (this._willBeOverCapacity(length)) {
        this._pushOne(fn);
        this._pushOne(receiver);
        this._pushOne(arg);
        return;
    }
    var j = this._front + length - 3;
    this._checkCapacity(length);
    var wrapMask = this._capacity - 1;
    this[(j + 0) & wrapMask] = fn;
    this[(j + 1) & wrapMask] = receiver;
    this[(j + 2) & wrapMask] = arg;
    this._length = length;
};

Queue.prototype.shift = function () {
    var front = this._front,
        ret = this[front];

    this[front] = undefined;
    this._front = (front + 1) & (this._capacity - 1);
    this._length--;
    return ret;
};

Queue.prototype.length = function () {
    return this._length;
};

Queue.prototype._checkCapacity = function (size) {
    if (this._capacity < size) {
        this._resizeTo(this._capacity << 1);
    }
};

Queue.prototype._resizeTo = function (capacity) {
    var oldCapacity = this._capacity;
    this._capacity = capacity;
    var front = this._front;
    var length = this._length;
    var moveItemsCount = (front + length) & (oldCapacity - 1);
    arrayMove(this, 0, this, oldCapacity, moveItemsCount);
};

module.exports = Queue;
"use strict";
module.exports = function(
    Promise, INTERNAL, tryConvertToPromise, apiRejection) {
var util = require("./util");

var raceLater = function (promise) {
    return promise.then(function(array) {
        return race(array, promise);
    });
};

function race(promises, parent) {
    var maybePromise = tryConvertToPromise(promises);

    if (maybePromise instanceof Promise) {
        return raceLater(maybePromise);
    } else {
        promises = util.asArray(promises);
        if (promises === null)
            return apiRejection("expecting an array or an iterable object but got " + util.classString(promises));
    }

    var ret = new Promise(INTERNAL);
    if (parent !== undefined) {
        ret._propagateFrom(parent, 3);
    }
    var fulfill = ret._fulfill;
    var reject = ret._reject;
    for (var i = 0, len = promises.length; i < len; ++i) {
        var val = promises[i];

        if (val === undefined && !(i in promises)) {
            continue;
        }

        Promise.cast(val)._then(fulfill, reject, undefined, ret, null);
    }
    return ret;
}

Promise.race = function (promises) {
    return race(promises, undefined);
};

Promise.prototype.race = function () {
    return race(this, undefined);
};

};
"use strict";
module.exports = function(Promise,
                          PromiseArray,
                          apiRejection,
                          tryConvertToPromise,
                          INTERNAL,
                          debug) {
var util = require("./util");
var tryCatch = util.tryCatch;

function ReductionPromiseArray(promises, fn, initialValue, _each) {
    this.constructor$(promises);
    var context = Promise._getContext();
    this._fn = util.contextBind(context, fn);
    if (initialValue !== undefined) {
        initialValue = Promise.resolve(initialValue);
        initialValue._attachCancellationCallback(this);
    }
    this._initialValue = initialValue;
    this._currentCancellable = null;
    if(_each === INTERNAL) {
        this._eachValues = Array(this._length);
    } else if (_each === 0) {
        this._eachValues = null;
    } else {
        this._eachValues = undefined;
    }
    this._promise._captureStackTrace();
    this._init$(undefined, -5);
}
util.inherits(ReductionPromiseArray, PromiseArray);

ReductionPromiseArray.prototype._gotAccum = function(accum) {
    if (this._eachValues !== undefined &&
        this._eachValues !== null &&
        accum !== INTERNAL) {
        this._eachValues.push(accum);
    }
};

ReductionPromiseArray.prototype._eachComplete = function(value) {
    if (this._eachValues !== null) {
        this._eachValues.push(value);
    }
    return this._eachValues;
};

ReductionPromiseArray.prototype._init = function() {};

ReductionPromiseArray.prototype._resolveEmptyArray = function() {
    this._resolve(this._eachValues !== undefined ? this._eachValues
                                                 : this._initialValue);
};

ReductionPromiseArray.prototype.shouldCopyValues = function () {
    return false;
};

ReductionPromiseArray.prototype._resolve = function(value) {
    this._promise._resolveCallback(value);
    this._values = null;
};

ReductionPromiseArray.prototype._resultCancelled = function(sender) {
    if (sender === this._initialValue) return this._cancel();
    if (this._isResolved()) return;
    this._resultCancelled$();
    if (this._currentCancellable instanceof Promise) {
        this._currentCancellable.cancel();
    }
    if (this._initialValue instanceof Promise) {
        this._initialValue.cancel();
    }
};

ReductionPromiseArray.prototype._iterate = function (values) {
    this._values = values;
    var value;
    var i;
    var length = values.length;
    if (this._initialValue !== undefined) {
        value = this._initialValue;
        i = 0;
    } else {
        value = Promise.resolve(values[0]);
        i = 1;
    }

    this._currentCancellable = value;

    for (var j = i; j < length; ++j) {
        var maybePromise = values[j];
        if (maybePromise instanceof Promise) {
            maybePromise.suppressUnhandledRejections();
        }
    }

    if (!value.isRejected()) {
        for (; i < length; ++i) {
            var ctx = {
                accum: null,
                value: values[i],
                index: i,
                length: length,
                array: this
            };

            value = value._then(gotAccum, undefined, undefined, ctx, undefined);

            if ((i & 127) === 0) {
                value._setNoAsyncGuarantee();
            }
        }
    }

    if (this._eachValues !== undefined) {
        value = value
            ._then(this._eachComplete, undefined, undefined, this, undefined);
    }
    value._then(completed, completed, undefined, value, this);
};

Promise.prototype.reduce = function (fn, initialValue) {
    return reduce(this, fn, initialValue, null);
};

Promise.reduce = function (promises, fn, initialValue, _each) {
    return reduce(promises, fn, initialValue, _each);
};

function completed(valueOrReason, array) {
    if (this.isFulfilled()) {
        array._resolve(valueOrReason);
    } else {
        array._reject(valueOrReason);
    }
}

function reduce(promises, fn, initialValue, _each) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var array = new ReductionPromiseArray(promises, fn, initialValue, _each);
    return array.promise();
}

function gotAccum(accum) {
    this.accum = accum;
    this.array._gotAccum(accum);
    var value = tryConvertToPromise(this.value, this.array._promise);
    if (value instanceof Promise) {
        this.array._currentCancellable = value;
        return value._then(gotValue, undefined, undefined, this, undefined);
    } else {
        return gotValue.call(this, value);
    }
}

function gotValue(value) {
    var array = this.array;
    var promise = array._promise;
    var fn = tryCatch(array._fn);
    promise._pushContext();
    var ret;
    if (array._eachValues !== undefined) {
        ret = fn.call(promise._boundValue(), value, this.index, this.length);
    } else {
        ret = fn.call(promise._boundValue(),
                              this.accum, value, this.index, this.length);
    }
    if (ret instanceof Promise) {
        array._currentCancellable = ret;
    }
    var promiseCreated = promise._popContext();
    debug.checkForgottenReturns(
        ret,
        promiseCreated,
        array._eachValues !== undefined ? "Promise.each" : "Promise.reduce",
        promise
    );
    return ret;
}
};
"use strict";
var util = require("./util");
var schedule;
var noAsyncScheduler = function() {
    throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var NativePromise = util.getNativePromise();
if (util.isNode && typeof MutationObserver === "undefined") {
    var GlobalSetImmediate = global.setImmediate;
    var ProcessNextTick = process.nextTick;
    schedule = util.isRecentNode
                ? function(fn) { GlobalSetImmediate.call(global, fn); }
                : function(fn) { ProcessNextTick.call(process, fn); };
} else if (typeof NativePromise === "function" &&
           typeof NativePromise.resolve === "function") {
    var nativePromise = NativePromise.resolve();
    schedule = function(fn) {
        nativePromise.then(fn);
    };
} else if ((typeof MutationObserver !== "undefined") &&
          !(typeof window !== "undefined" &&
            window.navigator &&
            (window.navigator.standalone || window.cordova)) &&
          ("classList" in document.documentElement)) {
    schedule = (function() {
        var div = document.createElement("div");
        var opts = {attributes: true};
        var toggleScheduled = false;
        var div2 = document.createElement("div");
        var o2 = new MutationObserver(function() {
            div.classList.toggle("foo");
            toggleScheduled = false;
        });
        o2.observe(div2, opts);

        var scheduleToggle = function() {
            if (toggleScheduled) return;
            toggleScheduled = true;
            div2.classList.toggle("foo");
        };

        return function schedule(fn) {
            var o = new MutationObserver(function() {
                o.disconnect();
                fn();
            });
            o.observe(div, opts);
            scheduleToggle();
        };
    })();
} else if (typeof setImmediate !== "undefined") {
    schedule = function (fn) {
        setImmediate(fn);
    };
} else if (typeof setTimeout !== "undefined") {
    schedule = function (fn) {
        setTimeout(fn, 0);
    };
} else {
    schedule = noAsyncScheduler;
}
module.exports = schedule;
"use strict";
module.exports =
    function(Promise, PromiseArray, debug) {
var PromiseInspection = Promise.PromiseInspection;
var util = require("./util");

function SettledPromiseArray(values) {
    this.constructor$(values);
}
util.inherits(SettledPromiseArray, PromiseArray);

SettledPromiseArray.prototype._promiseResolved = function (index, inspection) {
    this._values[index] = inspection;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

SettledPromiseArray.prototype._promiseFulfilled = function (value, index) {
    var ret = new PromiseInspection();
    ret._bitField = 33554432;
    ret._settledValueField = value;
    return this._promiseResolved(index, ret);
};
SettledPromiseArray.prototype._promiseRejected = function (reason, index) {
    var ret = new PromiseInspection();
    ret._bitField = 16777216;
    ret._settledValueField = reason;
    return this._promiseResolved(index, ret);
};

Promise.settle = function (promises) {
    debug.deprecated(".settle()", ".reflect()");
    return new SettledPromiseArray(promises).promise();
};

Promise.allSettled = function (promises) {
    return new SettledPromiseArray(promises).promise();
};

Promise.prototype.settle = function () {
    return Promise.settle(this);
};
};
"use strict";
module.exports =
function(Promise, PromiseArray, apiRejection) {
var util = require("./util");
var RangeError = require("./errors").RangeError;
var AggregateError = require("./errors").AggregateError;
var isArray = util.isArray;
var CANCELLATION = {};


function SomePromiseArray(values) {
    this.constructor$(values);
    this._howMany = 0;
    this._unwrap = false;
    this._initialized = false;
}
util.inherits(SomePromiseArray, PromiseArray);

SomePromiseArray.prototype._init = function () {
    if (!this._initialized) {
        return;
    }
    if (this._howMany === 0) {
        this._resolve([]);
        return;
    }
    this._init$(undefined, -5);
    var isArrayResolved = isArray(this._values);
    if (!this._isResolved() &&
        isArrayResolved &&
        this._howMany > this._canPossiblyFulfill()) {
        this._reject(this._getRangeError(this.length()));
    }
};

SomePromiseArray.prototype.init = function () {
    this._initialized = true;
    this._init();
};

SomePromiseArray.prototype.setUnwrap = function () {
    this._unwrap = true;
};

SomePromiseArray.prototype.howMany = function () {
    return this._howMany;
};

SomePromiseArray.prototype.setHowMany = function (count) {
    this._howMany = count;
};

SomePromiseArray.prototype._promiseFulfilled = function (value) {
    this._addFulfilled(value);
    if (this._fulfilled() === this.howMany()) {
        this._values.length = this.howMany();
        if (this.howMany() === 1 && this._unwrap) {
            this._resolve(this._values[0]);
        } else {
            this._resolve(this._values);
        }
        return true;
    }
    return false;

};
SomePromiseArray.prototype._promiseRejected = function (reason) {
    this._addRejected(reason);
    return this._checkOutcome();
};

SomePromiseArray.prototype._promiseCancelled = function () {
    if (this._values instanceof Promise || this._values == null) {
        return this._cancel();
    }
    this._addRejected(CANCELLATION);
    return this._checkOutcome();
};

SomePromiseArray.prototype._checkOutcome = function() {
    if (this.howMany() > this._canPossiblyFulfill()) {
        var e = new AggregateError();
        for (var i = this.length(); i < this._values.length; ++i) {
            if (this._values[i] !== CANCELLATION) {
                e.push(this._values[i]);
            }
        }
        if (e.length > 0) {
            this._reject(e);
        } else {
            this._cancel();
        }
        return true;
    }
    return false;
};

SomePromiseArray.prototype._fulfilled = function () {
    return this._totalResolved;
};

SomePromiseArray.prototype._rejected = function () {
    return this._values.length - this.length();
};

SomePromiseArray.prototype._addRejected = function (reason) {
    this._values.push(reason);
};

SomePromiseArray.prototype._addFulfilled = function (value) {
    this._values[this._totalResolved++] = value;
};

SomePromiseArray.prototype._canPossiblyFulfill = function () {
    return this.length() - this._rejected();
};

SomePromiseArray.prototype._getRangeError = function (count) {
    var message = "Input array must contain at least " +
            this._howMany + " items but contains only " + count + " items";
    return new RangeError(message);
};

SomePromiseArray.prototype._resolveEmptyArray = function () {
    this._reject(this._getRangeError(0));
};

function some(promises, howMany) {
    if ((howMany | 0) !== howMany || howMany < 0) {
        return apiRejection("expecting a positive integer\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var ret = new SomePromiseArray(promises);
    var promise = ret.promise();
    ret.setHowMany(howMany);
    ret.init();
    return promise;
}

Promise.some = function (promises, howMany) {
    return some(promises, howMany);
};

Promise.prototype.some = function (howMany) {
    return some(this, howMany);
};

Promise._SomePromiseArray = SomePromiseArray;
};
"use strict";
module.exports = function(Promise) {
function PromiseInspection(promise) {
    if (promise !== undefined) {
        promise = promise._target();
        this._bitField = promise._bitField;
        this._settledValueField = promise._isFateSealed()
            ? promise._settledValue() : undefined;
    }
    else {
        this._bitField = 0;
        this._settledValueField = undefined;
    }
}

PromiseInspection.prototype._settledValue = function() {
    return this._settledValueField;
};

var value = PromiseInspection.prototype.value = function () {
    if (!this.isFulfilled()) {
        throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var reason = PromiseInspection.prototype.error =
PromiseInspection.prototype.reason = function () {
    if (!this.isRejected()) {
        throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var isFulfilled = PromiseInspection.prototype.isFulfilled = function() {
    return (this._bitField & 33554432) !== 0;
};

var isRejected = PromiseInspection.prototype.isRejected = function () {
    return (this._bitField & 16777216) !== 0;
};

var isPending = PromiseInspection.prototype.isPending = function () {
    return (this._bitField & 50397184) === 0;
};

var isResolved = PromiseInspection.prototype.isResolved = function () {
    return (this._bitField & 50331648) !== 0;
};

PromiseInspection.prototype.isCancelled = function() {
    return (this._bitField & 8454144) !== 0;
};

Promise.prototype.__isCancelled = function() {
    return (this._bitField & 65536) === 65536;
};

Promise.prototype._isCancelled = function() {
    return this._target().__isCancelled();
};

Promise.prototype.isCancelled = function() {
    return (this._target()._bitField & 8454144) !== 0;
};

Promise.prototype.isPending = function() {
    return isPending.call(this._target());
};

Promise.prototype.isRejected = function() {
    return isRejected.call(this._target());
};

Promise.prototype.isFulfilled = function() {
    return isFulfilled.call(this._target());
};

Promise.prototype.isResolved = function() {
    return isResolved.call(this._target());
};

Promise.prototype.value = function() {
    return value.call(this._target());
};

Promise.prototype.reason = function() {
    var target = this._target();
    target._unsetRejectionIsUnhandled();
    return reason.call(target);
};

Promise.prototype._value = function() {
    return this._settledValue();
};

Promise.prototype._reason = function() {
    this._unsetRejectionIsUnhandled();
    return this._settledValue();
};

Promise.PromiseInspection = PromiseInspection;
};
"use strict";
module.exports = function(Promise, INTERNAL) {
var util = require("./util");
var errorObj = util.errorObj;
var isObject = util.isObject;

function tryConvertToPromise(obj, context) {
    if (isObject(obj)) {
        if (obj instanceof Promise) return obj;
        var then = getThen(obj);
        if (then === errorObj) {
            if (context) context._pushContext();
            var ret = Promise.reject(then.e);
            if (context) context._popContext();
            return ret;
        } else if (typeof then === "function") {
            if (isAnyBluebirdPromise(obj)) {
                var ret = new Promise(INTERNAL);
                obj._then(
                    ret._fulfill,
                    ret._reject,
                    undefined,
                    ret,
                    null
                );
                return ret;
            }
            return doThenable(obj, then, context);
        }
    }
    return obj;
}

function doGetThen(obj) {
    return obj.then;
}

function getThen(obj) {
    try {
        return doGetThen(obj);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}

var hasProp = {}.hasOwnProperty;
function isAnyBluebirdPromise(obj) {
    try {
        return hasProp.call(obj, "_promise0");
    } catch (e) {
        return false;
    }
}

function doThenable(x, then, context) {
    var promise = new Promise(INTERNAL);
    var ret = promise;
    if (context) context._pushContext();
    promise._captureStackTrace();
    if (context) context._popContext();
    var synchronous = true;
    var result = util.tryCatch(then).call(x, resolve, reject);
    synchronous = false;

    if (promise && result === errorObj) {
        promise._rejectCallback(result.e, true, true);
        promise = null;
    }

    function resolve(value) {
        if (!promise) return;
        promise._resolveCallback(value);
        promise = null;
    }

    function reject(reason) {
        if (!promise) return;
        promise._rejectCallback(reason, synchronous, true);
        promise = null;
    }
    return ret;
}

return tryConvertToPromise;
};
"use strict";
module.exports = function(Promise, INTERNAL, debug) {
var util = require("./util");
var TimeoutError = Promise.TimeoutError;

function HandleWrapper(handle)  {
    this.handle = handle;
}

HandleWrapper.prototype._resultCancelled = function() {
    clearTimeout(this.handle);
};

var afterValue = function(value) { return delay(+this).thenReturn(value); };
var delay = Promise.delay = function (ms, value) {
    var ret;
    var handle;
    if (value !== undefined) {
        ret = Promise.resolve(value)
                ._then(afterValue, null, null, ms, undefined);
        if (debug.cancellation() && value instanceof Promise) {
            ret._setOnCancel(value);
        }
    } else {
        ret = new Promise(INTERNAL);
        handle = setTimeout(function() { ret._fulfill(); }, +ms);
        if (debug.cancellation()) {
            ret._setOnCancel(new HandleWrapper(handle));
        }
        ret._captureStackTrace();
    }
    ret._setAsyncGuaranteed();
    return ret;
};

Promise.prototype.delay = function (ms) {
    return delay(ms, this);
};

var afterTimeout = function (promise, message, parent) {
    var err;
    if (typeof message !== "string") {
        if (message instanceof Error) {
            err = message;
        } else {
            err = new TimeoutError("operation timed out");
        }
    } else {
        err = new TimeoutError(message);
    }
    util.markAsOriginatingFromRejection(err);
    promise._attachExtraTrace(err);
    promise._reject(err);

    if (parent != null) {
        parent.cancel();
    }
};

function successClear(value) {
    clearTimeout(this.handle);
    return value;
}

function failureClear(reason) {
    clearTimeout(this.handle);
    throw reason;
}

Promise.prototype.timeout = function (ms, message) {
    ms = +ms;
    var ret, parent;

    var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {
        if (ret.isPending()) {
            afterTimeout(ret, message, parent);
        }
    }, ms));

    if (debug.cancellation()) {
        parent = this.then();
        ret = parent._then(successClear, failureClear,
                            undefined, handleWrapper, undefined);
        ret._setOnCancel(handleWrapper);
    } else {
        ret = this._then(successClear, failureClear,
                            undefined, handleWrapper, undefined);
    }

    return ret;
};

};
"use strict";
module.exports = function (Promise, apiRejection, tryConvertToPromise,
    createContext, INTERNAL, debug) {
    var util = require("./util");
    var TypeError = require("./errors").TypeError;
    var inherits = require("./util").inherits;
    var errorObj = util.errorObj;
    var tryCatch = util.tryCatch;
    var NULL = {};

    function thrower(e) {
        setTimeout(function(){throw e;}, 0);
    }

    function castPreservingDisposable(thenable) {
        var maybePromise = tryConvertToPromise(thenable);
        if (maybePromise !== thenable &&
            typeof thenable._isDisposable === "function" &&
            typeof thenable._getDisposer === "function" &&
            thenable._isDisposable()) {
            maybePromise._setDisposable(thenable._getDisposer());
        }
        return maybePromise;
    }
    function dispose(resources, inspection) {
        var i = 0;
        var len = resources.length;
        var ret = new Promise(INTERNAL);
        function iterator() {
            if (i >= len) return ret._fulfill();
            var maybePromise = castPreservingDisposable(resources[i++]);
            if (maybePromise instanceof Promise &&
                maybePromise._isDisposable()) {
                try {
                    maybePromise = tryConvertToPromise(
                        maybePromise._getDisposer().tryDispose(inspection),
                        resources.promise);
                } catch (e) {
                    return thrower(e);
                }
                if (maybePromise instanceof Promise) {
                    return maybePromise._then(iterator, thrower,
                                              null, null, null);
                }
            }
            iterator();
        }
        iterator();
        return ret;
    }

    function Disposer(data, promise, context) {
        this._data = data;
        this._promise = promise;
        this._context = context;
    }

    Disposer.prototype.data = function () {
        return this._data;
    };

    Disposer.prototype.promise = function () {
        return this._promise;
    };

    Disposer.prototype.resource = function () {
        if (this.promise().isFulfilled()) {
            return this.promise().value();
        }
        return NULL;
    };

    Disposer.prototype.tryDispose = function(inspection) {
        var resource = this.resource();
        var context = this._context;
        if (context !== undefined) context._pushContext();
        var ret = resource !== NULL
            ? this.doDispose(resource, inspection) : null;
        if (context !== undefined) context._popContext();
        this._promise._unsetDisposable();
        this._data = null;
        return ret;
    };

    Disposer.isDisposer = function (d) {
        return (d != null &&
                typeof d.resource === "function" &&
                typeof d.tryDispose === "function");
    };

    function FunctionDisposer(fn, promise, context) {
        this.constructor$(fn, promise, context);
    }
    inherits(FunctionDisposer, Disposer);

    FunctionDisposer.prototype.doDispose = function (resource, inspection) {
        var fn = this.data();
        return fn.call(resource, resource, inspection);
    };

    function maybeUnwrapDisposer(value) {
        if (Disposer.isDisposer(value)) {
            this.resources[this.index]._setDisposable(value);
            return value.promise();
        }
        return value;
    }

    function ResourceList(length) {
        this.length = length;
        this.promise = null;
        this[length-1] = null;
    }

    ResourceList.prototype._resultCancelled = function() {
        var len = this.length;
        for (var i = 0; i < len; ++i) {
            var item = this[i];
            if (item instanceof Promise) {
                item.cancel();
            }
        }
    };

    Promise.using = function () {
        var len = arguments.length;
        if (len < 2) return apiRejection(
                        "you must pass at least 2 arguments to Promise.using");
        var fn = arguments[len - 1];
        if (typeof fn !== "function") {
            return apiRejection("expecting a function but got " + util.classString(fn));
        }
        var input;
        var spreadArgs = true;
        if (len === 2 && Array.isArray(arguments[0])) {
            input = arguments[0];
            len = input.length;
            spreadArgs = false;
        } else {
            input = arguments;
            len--;
        }
        var resources = new ResourceList(len);
        for (var i = 0; i < len; ++i) {
            var resource = input[i];
            if (Disposer.isDisposer(resource)) {
                var disposer = resource;
                resource = resource.promise();
                resource._setDisposable(disposer);
            } else {
                var maybePromise = tryConvertToPromise(resource);
                if (maybePromise instanceof Promise) {
                    resource =
                        maybePromise._then(maybeUnwrapDisposer, null, null, {
                            resources: resources,
                            index: i
                    }, undefined);
                }
            }
            resources[i] = resource;
        }

        var reflectedResources = new Array(resources.length);
        for (var i = 0; i < reflectedResources.length; ++i) {
            reflectedResources[i] = Promise.resolve(resources[i]).reflect();
        }

        var resultPromise = Promise.all(reflectedResources)
            .then(function(inspections) {
                for (var i = 0; i < inspections.length; ++i) {
                    var inspection = inspections[i];
                    if (inspection.isRejected()) {
                        errorObj.e = inspection.error();
                        return errorObj;
                    } else if (!inspection.isFulfilled()) {
                        resultPromise.cancel();
                        return;
                    }
                    inspections[i] = inspection.value();
                }
                promise._pushContext();

                fn = tryCatch(fn);
                var ret = spreadArgs
                    ? fn.apply(undefined, inspections) : fn(inspections);
                var promiseCreated = promise._popContext();
                debug.checkForgottenReturns(
                    ret, promiseCreated, "Promise.using", promise);
                return ret;
            });

        var promise = resultPromise.lastly(function() {
            var inspection = new Promise.PromiseInspection(resultPromise);
            return dispose(resources, inspection);
        });
        resources.promise = promise;
        promise._setOnCancel(resources);
        return promise;
    };

    Promise.prototype._setDisposable = function (disposer) {
        this._bitField = this._bitField | 131072;
        this._disposer = disposer;
    };

    Promise.prototype._isDisposable = function () {
        return (this._bitField & 131072) > 0;
    };

    Promise.prototype._getDisposer = function () {
        return this._disposer;
    };

    Promise.prototype._unsetDisposable = function () {
        this._bitField = this._bitField & (~131072);
        this._disposer = undefined;
    };

    Promise.prototype.disposer = function (fn) {
        if (typeof fn === "function") {
            return new FunctionDisposer(fn, this, createContext());
        }
        throw new TypeError();
    };

};
"use strict";
var es5 = require("./es5");
var canEvaluate = typeof navigator == "undefined";

var errorObj = {e: {}};
var tryCatchTarget;
var globalObject = typeof self !== "undefined" ? self :
    typeof window !== "undefined" ? window :
    typeof global !== "undefined" ? global :
    this !== undefined ? this : null;

function tryCatcher() {
    try {
        var target = tryCatchTarget;
        tryCatchTarget = null;
        return target.apply(this, arguments);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}
function tryCatch(fn) {
    tryCatchTarget = fn;
    return tryCatcher;
}

var inherits = function(Child, Parent) {
    var hasProp = {}.hasOwnProperty;

    function T() {
        this.constructor = Child;
        this.constructor$ = Parent;
        for (var propertyName in Parent.prototype) {
            if (hasProp.call(Parent.prototype, propertyName) &&
                propertyName.charAt(propertyName.length-1) !== "$"
           ) {
                this[propertyName + "$"] = Parent.prototype[propertyName];
            }
        }
    }
    T.prototype = Parent.prototype;
    Child.prototype = new T();
    return Child.prototype;
};


function isPrimitive(val) {
    return val == null || val === true || val === false ||
        typeof val === "string" || typeof val === "number";

}

function isObject(value) {
    return typeof value === "function" ||
           typeof value === "object" && value !== null;
}

function maybeWrapAsError(maybeError) {
    if (!isPrimitive(maybeError)) return maybeError;

    return new Error(safeToString(maybeError));
}

function withAppended(target, appendee) {
    var len = target.length;
    var ret = new Array(len + 1);
    var i;
    for (i = 0; i < len; ++i) {
        ret[i] = target[i];
    }
    ret[i] = appendee;
    return ret;
}

function getDataPropertyOrDefault(obj, key, defaultValue) {
    if (es5.isES5) {
        var desc = Object.getOwnPropertyDescriptor(obj, key);

        if (desc != null) {
            return desc.get == null && desc.set == null
                    ? desc.value
                    : defaultValue;
        }
    } else {
        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;
    }
}

function notEnumerableProp(obj, name, value) {
    if (isPrimitive(obj)) return obj;
    var descriptor = {
        value: value,
        configurable: true,
        enumerable: false,
        writable: true
    };
    es5.defineProperty(obj, name, descriptor);
    return obj;
}

function thrower(r) {
    throw r;
}

var inheritedDataKeys = (function() {
    var excludedPrototypes = [
        Array.prototype,
        Object.prototype,
        Function.prototype
    ];

    var isExcludedProto = function(val) {
        for (var i = 0; i < excludedPrototypes.length; ++i) {
            if (excludedPrototypes[i] === val) {
                return true;
            }
        }
        return false;
    };

    if (es5.isES5) {
        var getKeys = Object.getOwnPropertyNames;
        return function(obj) {
            var ret = [];
            var visitedKeys = Object.create(null);
            while (obj != null && !isExcludedProto(obj)) {
                var keys;
                try {
                    keys = getKeys(obj);
                } catch (e) {
                    return ret;
                }
                for (var i = 0; i < keys.length; ++i) {
                    var key = keys[i];
                    if (visitedKeys[key]) continue;
                    visitedKeys[key] = true;
                    var desc = Object.getOwnPropertyDescriptor(obj, key);
                    if (desc != null && desc.get == null && desc.set == null) {
                        ret.push(key);
                    }
                }
                obj = es5.getPrototypeOf(obj);
            }
            return ret;
        };
    } else {
        var hasProp = {}.hasOwnProperty;
        return function(obj) {
            if (isExcludedProto(obj)) return [];
            var ret = [];

            /*jshint forin:false */
            enumeration: for (var key in obj) {
                if (hasProp.call(obj, key)) {
                    ret.push(key);
                } else {
                    for (var i = 0; i < excludedPrototypes.length; ++i) {
                        if (hasProp.call(excludedPrototypes[i], key)) {
                            continue enumeration;
                        }
                    }
                    ret.push(key);
                }
            }
            return ret;
        };
    }

})();

var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/;
function isClass(fn) {
    try {
        if (typeof fn === "function") {
            var keys = es5.names(fn.prototype);

            var hasMethods = es5.isES5 && keys.length > 1;
            var hasMethodsOtherThanConstructor = keys.length > 0 &&
                !(keys.length === 1 && keys[0] === "constructor");
            var hasThisAssignmentAndStaticMethods =
                thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0;

            if (hasMethods || hasMethodsOtherThanConstructor ||
                hasThisAssignmentAndStaticMethods) {
                return true;
            }
        }
        return false;
    } catch (e) {
        return false;
    }
}

function toFastProperties(obj) {
    /*jshint -W027,-W055,-W031*/
    function FakeConstructor() {}
    FakeConstructor.prototype = obj;
    var receiver = new FakeConstructor();
    function ic() {
        return typeof receiver.foo;
    }
    ic();
    ic();
    return obj;
    eval(obj);
}

var rident = /^[a-z$_][a-z$_0-9]*$/i;
function isIdentifier(str) {
    return rident.test(str);
}

function filledRange(count, prefix, suffix) {
    var ret = new Array(count);
    for(var i = 0; i < count; ++i) {
        ret[i] = prefix + i + suffix;
    }
    return ret;
}

function safeToString(obj) {
    try {
        return obj + "";
    } catch (e) {
        return "[no string representation]";
    }
}

function isError(obj) {
    return obj instanceof Error ||
        (obj !== null &&
           typeof obj === "object" &&
           typeof obj.message === "string" &&
           typeof obj.name === "string");
}

function markAsOriginatingFromRejection(e) {
    try {
        notEnumerableProp(e, "isOperational", true);
    }
    catch(ignore) {}
}

function originatesFromRejection(e) {
    if (e == null) return false;
    return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) ||
        e["isOperational"] === true);
}

function canAttachTrace(obj) {
    return isError(obj) && es5.propertyIsWritable(obj, "stack");
}

var ensureErrorObject = (function() {
    if (!("stack" in new Error())) {
        return function(value) {
            if (canAttachTrace(value)) return value;
            try {throw new Error(safeToString(value));}
            catch(err) {return err;}
        };
    } else {
        return function(value) {
            if (canAttachTrace(value)) return value;
            return new Error(safeToString(value));
        };
    }
})();

function classString(obj) {
    return {}.toString.call(obj);
}

function copyDescriptors(from, to, filter) {
    var keys = es5.names(from);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        if (filter(key)) {
            try {
                es5.defineProperty(to, key, es5.getDescriptor(from, key));
            } catch (ignore) {}
        }
    }
}

var asArray = function(v) {
    if (es5.isArray(v)) {
        return v;
    }
    return null;
};

if (typeof Symbol !== "undefined" && Symbol.iterator) {
    var ArrayFrom = typeof Array.from === "function" ? function(v) {
        return Array.from(v);
    } : function(v) {
        var ret = [];
        var it = v[Symbol.iterator]();
        var itResult;
        while (!((itResult = it.next()).done)) {
            ret.push(itResult.value);
        }
        return ret;
    };

    asArray = function(v) {
        if (es5.isArray(v)) {
            return v;
        } else if (v != null && typeof v[Symbol.iterator] === "function") {
            return ArrayFrom(v);
        }
        return null;
    };
}

var isNode = typeof process !== "undefined" &&
        classString(process).toLowerCase() === "[object process]";

var hasEnvVariables = typeof process !== "undefined" &&
    typeof process.env !== "undefined";

function env(key) {
    return hasEnvVariables ? process.env[key] : undefined;
}

function getNativePromise() {
    if (typeof Promise === "function") {
        try {
            var promise = new Promise(function(){});
            if (classString(promise) === "[object Promise]") {
                return Promise;
            }
        } catch (e) {}
    }
}

var reflectHandler;
function contextBind(ctx, cb) {
    if (ctx === null ||
        typeof cb !== "function" ||
        cb === reflectHandler) {
        return cb;
    }

    if (ctx.domain !== null) {
        cb = ctx.domain.bind(cb);
    }

    var async = ctx.async;
    if (async !== null) {
        var old = cb;
        cb = function() {
            var $_len = arguments.length + 2;var args = new Array($_len); for(var $_i = 2; $_i < $_len ; ++$_i) {args[$_i] = arguments[$_i  - 2];};
            args[0] = old;
            args[1] = this;
            return async.runInAsyncScope.apply(async, args);
        };
    }
    return cb;
}

var ret = {
    setReflectHandler: function(fn) {
        reflectHandler = fn;
    },
    isClass: isClass,
    isIdentifier: isIdentifier,
    inheritedDataKeys: inheritedDataKeys,
    getDataPropertyOrDefault: getDataPropertyOrDefault,
    thrower: thrower,
    isArray: es5.isArray,
    asArray: asArray,
    notEnumerableProp: notEnumerableProp,
    isPrimitive: isPrimitive,
    isObject: isObject,
    isError: isError,
    canEvaluate: canEvaluate,
    errorObj: errorObj,
    tryCatch: tryCatch,
    inherits: inherits,
    withAppended: withAppended,
    maybeWrapAsError: maybeWrapAsError,
    toFastProperties: toFastProperties,
    filledRange: filledRange,
    toString: safeToString,
    canAttachTrace: canAttachTrace,
    ensureErrorObject: ensureErrorObject,
    originatesFromRejection: originatesFromRejection,
    markAsOriginatingFromRejection: markAsOriginatingFromRejection,
    classString: classString,
    copyDescriptors: copyDescriptors,
    isNode: isNode,
    hasEnvVariables: hasEnvVariables,
    env: env,
    global: globalObject,
    getNativePromise: getNativePromise,
    contextBind: contextBind
};
ret.isRecentNode = ret.isNode && (function() {
    var version;
    if (process.versions && process.versions.node) {
        version = process.versions.node.split(".").map(Number);
    } else if (process.version) {
        version = process.version.split(".").map(Number);
    }
    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);
})();
ret.nodeSupportsAsyncResource = ret.isNode && (function() {
    var supportsAsync = false;
    try {
        var res = require("async_hooks").AsyncResource;
        supportsAsync = typeof res.prototype.runInAsyncScope === "function";
    } catch (e) {
        supportsAsync = false;
    }
    return supportsAsync;
})();

if (ret.isNode) ret.toFastProperties(process);

try {throw new Error(); } catch (e) {ret.lastLineError = e;}
module.exports = ret;
/* @preserve
 * The MIT License (MIT)
 * 
 * Copyright (c) 2013-2018 Petka Antonov
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * 
 */
/**
 * bluebird build version 3.7.2
 * Features enabled: core
 * Features disabled: race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Promise=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
"use strict";
var firstLineError;
try {throw new Error(); } catch (e) {firstLineError = e;}
var schedule = _dereq_("./schedule");
var Queue = _dereq_("./queue");

function Async() {
    this._customScheduler = false;
    this._isTickUsed = false;
    this._lateQueue = new Queue(16);
    this._normalQueue = new Queue(16);
    this._haveDrainedQueues = false;
    var self = this;
    this.drainQueues = function () {
        self._drainQueues();
    };
    this._schedule = schedule;
}

Async.prototype.setScheduler = function(fn) {
    var prev = this._schedule;
    this._schedule = fn;
    this._customScheduler = true;
    return prev;
};

Async.prototype.hasCustomScheduler = function() {
    return this._customScheduler;
};

Async.prototype.haveItemsQueued = function () {
    return this._isTickUsed || this._haveDrainedQueues;
};


Async.prototype.fatalError = function(e, isNode) {
    if (isNode) {
        process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) +
            "\n");
        process.exit(2);
    } else {
        this.throwLater(e);
    }
};

Async.prototype.throwLater = function(fn, arg) {
    if (arguments.length === 1) {
        arg = fn;
        fn = function () { throw arg; };
    }
    if (typeof setTimeout !== "undefined") {
        setTimeout(function() {
            fn(arg);
        }, 0);
    } else try {
        this._schedule(function() {
            fn(arg);
        });
    } catch (e) {
        throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
};

function AsyncInvokeLater(fn, receiver, arg) {
    this._lateQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncInvoke(fn, receiver, arg) {
    this._normalQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncSettlePromises(promise) {
    this._normalQueue._pushOne(promise);
    this._queueTick();
}

Async.prototype.invokeLater = AsyncInvokeLater;
Async.prototype.invoke = AsyncInvoke;
Async.prototype.settlePromises = AsyncSettlePromises;


function _drainQueue(queue) {
    while (queue.length() > 0) {
        _drainQueueStep(queue);
    }
}

function _drainQueueStep(queue) {
    var fn = queue.shift();
    if (typeof fn !== "function") {
        fn._settlePromises();
    } else {
        var receiver = queue.shift();
        var arg = queue.shift();
        fn.call(receiver, arg);
    }
}

Async.prototype._drainQueues = function () {
    _drainQueue(this._normalQueue);
    this._reset();
    this._haveDrainedQueues = true;
    _drainQueue(this._lateQueue);
};

Async.prototype._queueTick = function () {
    if (!this._isTickUsed) {
        this._isTickUsed = true;
        this._schedule(this.drainQueues);
    }
};

Async.prototype._reset = function () {
    this._isTickUsed = false;
};

module.exports = Async;
module.exports.firstLineError = firstLineError;

},{"./queue":17,"./schedule":18}],2:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {
var calledBind = false;
var rejectThis = function(_, e) {
    this._reject(e);
};

var targetRejected = function(e, context) {
    context.promiseRejectionQueued = true;
    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
};

var bindingResolved = function(thisArg, context) {
    if (((this._bitField & 50397184) === 0)) {
        this._resolveCallback(context.target);
    }
};

var bindingRejected = function(e, context) {
    if (!context.promiseRejectionQueued) this._reject(e);
};

Promise.prototype.bind = function (thisArg) {
    if (!calledBind) {
        calledBind = true;
        Promise.prototype._propagateFrom = debug.propagateFromFunction();
        Promise.prototype._boundValue = debug.boundValueFunction();
    }
    var maybePromise = tryConvertToPromise(thisArg);
    var ret = new Promise(INTERNAL);
    ret._propagateFrom(this, 1);
    var target = this._target();
    ret._setBoundTo(maybePromise);
    if (maybePromise instanceof Promise) {
        var context = {
            promiseRejectionQueued: false,
            promise: ret,
            target: target,
            bindingPromise: maybePromise
        };
        target._then(INTERNAL, targetRejected, undefined, ret, context);
        maybePromise._then(
            bindingResolved, bindingRejected, undefined, ret, context);
        ret._setOnCancel(maybePromise);
    } else {
        ret._resolveCallback(target);
    }
    return ret;
};

Promise.prototype._setBoundTo = function (obj) {
    if (obj !== undefined) {
        this._bitField = this._bitField | 2097152;
        this._boundTo = obj;
    } else {
        this._bitField = this._bitField & (~2097152);
    }
};

Promise.prototype._isBound = function () {
    return (this._bitField & 2097152) === 2097152;
};

Promise.bind = function (thisArg, value) {
    return Promise.resolve(value).bind(thisArg);
};
};

},{}],3:[function(_dereq_,module,exports){
"use strict";
var old;
if (typeof Promise !== "undefined") old = Promise;
function noConflict() {
    try { if (Promise === bluebird) Promise = old; }
    catch (e) {}
    return bluebird;
}
var bluebird = _dereq_("./promise")();
bluebird.noConflict = noConflict;
module.exports = bluebird;

},{"./promise":15}],4:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, PromiseArray, apiRejection, debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

Promise.prototype["break"] = Promise.prototype.cancel = function() {
    if (!debug.cancellation()) return this._warn("cancellation is disabled");

    var promise = this;
    var child = promise;
    while (promise._isCancellable()) {
        if (!promise._cancelBy(child)) {
            if (child._isFollowing()) {
                child._followee().cancel();
            } else {
                child._cancelBranched();
            }
            break;
        }

        var parent = promise._cancellationParent;
        if (parent == null || !parent._isCancellable()) {
            if (promise._isFollowing()) {
                promise._followee().cancel();
            } else {
                promise._cancelBranched();
            }
            break;
        } else {
            if (promise._isFollowing()) promise._followee().cancel();
            promise._setWillBeCancelled();
            child = promise;
            promise = parent;
        }
    }
};

Promise.prototype._branchHasCancelled = function() {
    this._branchesRemainingToCancel--;
};

Promise.prototype._enoughBranchesHaveCancelled = function() {
    return this._branchesRemainingToCancel === undefined ||
           this._branchesRemainingToCancel <= 0;
};

Promise.prototype._cancelBy = function(canceller) {
    if (canceller === this) {
        this._branchesRemainingToCancel = 0;
        this._invokeOnCancel();
        return true;
    } else {
        this._branchHasCancelled();
        if (this._enoughBranchesHaveCancelled()) {
            this._invokeOnCancel();
            return true;
        }
    }
    return false;
};

Promise.prototype._cancelBranched = function() {
    if (this._enoughBranchesHaveCancelled()) {
        this._cancel();
    }
};

Promise.prototype._cancel = function() {
    if (!this._isCancellable()) return;
    this._setCancelled();
    async.invoke(this._cancelPromises, this, undefined);
};

Promise.prototype._cancelPromises = function() {
    if (this._length() > 0) this._settlePromises();
};

Promise.prototype._unsetOnCancel = function() {
    this._onCancelField = undefined;
};

Promise.prototype._isCancellable = function() {
    return this.isPending() && !this._isCancelled();
};

Promise.prototype.isCancellable = function() {
    return this.isPending() && !this.isCancelled();
};

Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {
    if (util.isArray(onCancelCallback)) {
        for (var i = 0; i < onCancelCallback.length; ++i) {
            this._doInvokeOnCancel(onCancelCallback[i], internalOnly);
        }
    } else if (onCancelCallback !== undefined) {
        if (typeof onCancelCallback === "function") {
            if (!internalOnly) {
                var e = tryCatch(onCancelCallback).call(this._boundValue());
                if (e === errorObj) {
                    this._attachExtraTrace(e.e);
                    async.throwLater(e.e);
                }
            }
        } else {
            onCancelCallback._resultCancelled(this);
        }
    }
};

Promise.prototype._invokeOnCancel = function() {
    var onCancelCallback = this._onCancel();
    this._unsetOnCancel();
    async.invoke(this._doInvokeOnCancel, this, onCancelCallback);
};

Promise.prototype._invokeInternalOnCancel = function() {
    if (this._isCancellable()) {
        this._doInvokeOnCancel(this._onCancel(), true);
        this._unsetOnCancel();
    }
};

Promise.prototype._resultCancelled = function() {
    this.cancel();
};

};

},{"./util":21}],5:[function(_dereq_,module,exports){
"use strict";
module.exports = function(NEXT_FILTER) {
var util = _dereq_("./util");
var getKeys = _dereq_("./es5").keys;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function catchFilter(instances, cb, promise) {
    return function(e) {
        var boundTo = promise._boundValue();
        predicateLoop: for (var i = 0; i < instances.length; ++i) {
            var item = instances[i];

            if (item === Error ||
                (item != null && item.prototype instanceof Error)) {
                if (e instanceof item) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (typeof item === "function") {
                var matchesPredicate = tryCatch(item).call(boundTo, e);
                if (matchesPredicate === errorObj) {
                    return matchesPredicate;
                } else if (matchesPredicate) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (util.isObject(e)) {
                var keys = getKeys(item);
                for (var j = 0; j < keys.length; ++j) {
                    var key = keys[j];
                    if (item[key] != e[key]) {
                        continue predicateLoop;
                    }
                }
                return tryCatch(cb).call(boundTo, e);
            }
        }
        return NEXT_FILTER;
    };
}

return catchFilter;
};

},{"./es5":10,"./util":21}],6:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
var longStackTraces = false;
var contextStack = [];

Promise.prototype._promiseCreated = function() {};
Promise.prototype._pushContext = function() {};
Promise.prototype._popContext = function() {return null;};
Promise._peekContext = Promise.prototype._peekContext = function() {};

function Context() {
    this._trace = new Context.CapturedTrace(peekContext());
}
Context.prototype._pushContext = function () {
    if (this._trace !== undefined) {
        this._trace._promiseCreated = null;
        contextStack.push(this._trace);
    }
};

Context.prototype._popContext = function () {
    if (this._trace !== undefined) {
        var trace = contextStack.pop();
        var ret = trace._promiseCreated;
        trace._promiseCreated = null;
        return ret;
    }
    return null;
};

function createContext() {
    if (longStackTraces) return new Context();
}

function peekContext() {
    var lastIndex = contextStack.length - 1;
    if (lastIndex >= 0) {
        return contextStack[lastIndex];
    }
    return undefined;
}
Context.CapturedTrace = null;
Context.create = createContext;
Context.deactivateLongStackTraces = function() {};
Context.activateLongStackTraces = function() {
    var Promise_pushContext = Promise.prototype._pushContext;
    var Promise_popContext = Promise.prototype._popContext;
    var Promise_PeekContext = Promise._peekContext;
    var Promise_peekContext = Promise.prototype._peekContext;
    var Promise_promiseCreated = Promise.prototype._promiseCreated;
    Context.deactivateLongStackTraces = function() {
        Promise.prototype._pushContext = Promise_pushContext;
        Promise.prototype._popContext = Promise_popContext;
        Promise._peekContext = Promise_PeekContext;
        Promise.prototype._peekContext = Promise_peekContext;
        Promise.prototype._promiseCreated = Promise_promiseCreated;
        longStackTraces = false;
    };
    longStackTraces = true;
    Promise.prototype._pushContext = Context.prototype._pushContext;
    Promise.prototype._popContext = Context.prototype._popContext;
    Promise._peekContext = Promise.prototype._peekContext = peekContext;
    Promise.prototype._promiseCreated = function() {
        var ctx = this._peekContext();
        if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;
    };
};
return Context;
};

},{}],7:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, Context,
    enableAsyncHooks, disableAsyncHooks) {
var async = Promise._async;
var Warning = _dereq_("./errors").Warning;
var util = _dereq_("./util");
var es5 = _dereq_("./es5");
var canAttachTrace = util.canAttachTrace;
var unhandledRejectionHandled;
var possiblyUnhandledRejection;
var bluebirdFramePattern =
    /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/;
var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/;
var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/;
var stackFramePattern = null;
var formatStack = null;
var indentStackFrames = false;
var printWarning;
var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 &&
                        (true ||
                         util.env("BLUEBIRD_DEBUG") ||
                         util.env("NODE_ENV") === "development"));

var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 &&
    (debugging || util.env("BLUEBIRD_WARNINGS")));

var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 &&
    (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));

var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 &&
    (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));

var deferUnhandledRejectionCheck;
(function() {
    var promises = [];

    function unhandledRejectionCheck() {
        for (var i = 0; i < promises.length; ++i) {
            promises[i]._notifyUnhandledRejection();
        }
        unhandledRejectionClear();
    }

    function unhandledRejectionClear() {
        promises.length = 0;
    }

    deferUnhandledRejectionCheck = function(promise) {
        promises.push(promise);
        setTimeout(unhandledRejectionCheck, 1);
    };

    es5.defineProperty(Promise, "_unhandledRejectionCheck", {
        value: unhandledRejectionCheck
    });
    es5.defineProperty(Promise, "_unhandledRejectionClear", {
        value: unhandledRejectionClear
    });
})();

Promise.prototype.suppressUnhandledRejections = function() {
    var target = this._target();
    target._bitField = ((target._bitField & (~1048576)) |
                      524288);
};

Promise.prototype._ensurePossibleRejectionHandled = function () {
    if ((this._bitField & 524288) !== 0) return;
    this._setRejectionIsUnhandled();
    deferUnhandledRejectionCheck(this);
};

Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
    fireRejectionEvent("rejectionHandled",
                                  unhandledRejectionHandled, undefined, this);
};

Promise.prototype._setReturnedNonUndefined = function() {
    this._bitField = this._bitField | 268435456;
};

Promise.prototype._returnedNonUndefined = function() {
    return (this._bitField & 268435456) !== 0;
};

Promise.prototype._notifyUnhandledRejection = function () {
    if (this._isRejectionUnhandled()) {
        var reason = this._settledValue();
        this._setUnhandledRejectionIsNotified();
        fireRejectionEvent("unhandledRejection",
                                      possiblyUnhandledRejection, reason, this);
    }
};

Promise.prototype._setUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField | 262144;
};

Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField & (~262144);
};

Promise.prototype._isUnhandledRejectionNotified = function () {
    return (this._bitField & 262144) > 0;
};

Promise.prototype._setRejectionIsUnhandled = function () {
    this._bitField = this._bitField | 1048576;
};

Promise.prototype._unsetRejectionIsUnhandled = function () {
    this._bitField = this._bitField & (~1048576);
    if (this._isUnhandledRejectionNotified()) {
        this._unsetUnhandledRejectionIsNotified();
        this._notifyUnhandledRejectionIsHandled();
    }
};

Promise.prototype._isRejectionUnhandled = function () {
    return (this._bitField & 1048576) > 0;
};

Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) {
    return warn(message, shouldUseOwnTrace, promise || this);
};

Promise.onPossiblyUnhandledRejection = function (fn) {
    var context = Promise._getContext();
    possiblyUnhandledRejection = util.contextBind(context, fn);
};

Promise.onUnhandledRejectionHandled = function (fn) {
    var context = Promise._getContext();
    unhandledRejectionHandled = util.contextBind(context, fn);
};

var disableLongStackTraces = function() {};
Promise.longStackTraces = function () {
    if (async.haveItemsQueued() && !config.longStackTraces) {
        throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (!config.longStackTraces && longStackTracesIsSupported()) {
        var Promise_captureStackTrace = Promise.prototype._captureStackTrace;
        var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;
        var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace;
        config.longStackTraces = true;
        disableLongStackTraces = function() {
            if (async.haveItemsQueued() && !config.longStackTraces) {
                throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
            }
            Promise.prototype._captureStackTrace = Promise_captureStackTrace;
            Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;
            Promise.prototype._dereferenceTrace = Promise_dereferenceTrace;
            Context.deactivateLongStackTraces();
            config.longStackTraces = false;
        };
        Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;
        Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;
        Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace;
        Context.activateLongStackTraces();
    }
};

Promise.hasLongStackTraces = function () {
    return config.longStackTraces && longStackTracesIsSupported();
};


var legacyHandlers = {
    unhandledrejection: {
        before: function() {
            var ret = util.global.onunhandledrejection;
            util.global.onunhandledrejection = null;
            return ret;
        },
        after: function(fn) {
            util.global.onunhandledrejection = fn;
        }
    },
    rejectionhandled: {
        before: function() {
            var ret = util.global.onrejectionhandled;
            util.global.onrejectionhandled = null;
            return ret;
        },
        after: function(fn) {
            util.global.onrejectionhandled = fn;
        }
    }
};

var fireDomEvent = (function() {
    var dispatch = function(legacy, e) {
        if (legacy) {
            var fn;
            try {
                fn = legacy.before();
                return !util.global.dispatchEvent(e);
            } finally {
                legacy.after(fn);
            }
        } else {
            return !util.global.dispatchEvent(e);
        }
    };
    try {
        if (typeof CustomEvent === "function") {
            var event = new CustomEvent("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var eventData = {
                    detail: event,
                    cancelable: true
                };
                var domEvent = new CustomEvent(name, eventData);
                es5.defineProperty(
                    domEvent, "promise", {value: event.promise});
                es5.defineProperty(
                    domEvent, "reason", {value: event.reason});

                return dispatch(legacyHandlers[name], domEvent);
            };
        } else if (typeof Event === "function") {
            var event = new Event("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = new Event(name, {
                    cancelable: true
                });
                domEvent.detail = event;
                es5.defineProperty(domEvent, "promise", {value: event.promise});
                es5.defineProperty(domEvent, "reason", {value: event.reason});
                return dispatch(legacyHandlers[name], domEvent);
            };
        } else {
            var event = document.createEvent("CustomEvent");
            event.initCustomEvent("testingtheevent", false, true, {});
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = document.createEvent("CustomEvent");
                domEvent.initCustomEvent(name, false, true,
                    event);
                return dispatch(legacyHandlers[name], domEvent);
            };
        }
    } catch (e) {}
    return function() {
        return false;
    };
})();

var fireGlobalEvent = (function() {
    if (util.isNode) {
        return function() {
            return process.emit.apply(process, arguments);
        };
    } else {
        if (!util.global) {
            return function() {
                return false;
            };
        }
        return function(name) {
            var methodName = "on" + name.toLowerCase();
            var method = util.global[methodName];
            if (!method) return false;
            method.apply(util.global, [].slice.call(arguments, 1));
            return true;
        };
    }
})();

function generatePromiseLifecycleEventObject(name, promise) {
    return {promise: promise};
}

var eventToObjectGenerator = {
    promiseCreated: generatePromiseLifecycleEventObject,
    promiseFulfilled: generatePromiseLifecycleEventObject,
    promiseRejected: generatePromiseLifecycleEventObject,
    promiseResolved: generatePromiseLifecycleEventObject,
    promiseCancelled: generatePromiseLifecycleEventObject,
    promiseChained: function(name, promise, child) {
        return {promise: promise, child: child};
    },
    warning: function(name, warning) {
        return {warning: warning};
    },
    unhandledRejection: function (name, reason, promise) {
        return {reason: reason, promise: promise};
    },
    rejectionHandled: generatePromiseLifecycleEventObject
};

var activeFireEvent = function (name) {
    var globalEventFired = false;
    try {
        globalEventFired = fireGlobalEvent.apply(null, arguments);
    } catch (e) {
        async.throwLater(e);
        globalEventFired = true;
    }

    var domEventFired = false;
    try {
        domEventFired = fireDomEvent(name,
                    eventToObjectGenerator[name].apply(null, arguments));
    } catch (e) {
        async.throwLater(e);
        domEventFired = true;
    }

    return domEventFired || globalEventFired;
};

Promise.config = function(opts) {
    opts = Object(opts);
    if ("longStackTraces" in opts) {
        if (opts.longStackTraces) {
            Promise.longStackTraces();
        } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
            disableLongStackTraces();
        }
    }
    if ("warnings" in opts) {
        var warningsOption = opts.warnings;
        config.warnings = !!warningsOption;
        wForgottenReturn = config.warnings;

        if (util.isObject(warningsOption)) {
            if ("wForgottenReturn" in warningsOption) {
                wForgottenReturn = !!warningsOption.wForgottenReturn;
            }
        }
    }
    if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
        if (async.haveItemsQueued()) {
            throw new Error(
                "cannot enable cancellation after promises are in use");
        }
        Promise.prototype._clearCancellationData =
            cancellationClearCancellationData;
        Promise.prototype._propagateFrom = cancellationPropagateFrom;
        Promise.prototype._onCancel = cancellationOnCancel;
        Promise.prototype._setOnCancel = cancellationSetOnCancel;
        Promise.prototype._attachCancellationCallback =
            cancellationAttachCancellationCallback;
        Promise.prototype._execute = cancellationExecute;
        propagateFromFunction = cancellationPropagateFrom;
        config.cancellation = true;
    }
    if ("monitoring" in opts) {
        if (opts.monitoring && !config.monitoring) {
            config.monitoring = true;
            Promise.prototype._fireEvent = activeFireEvent;
        } else if (!opts.monitoring && config.monitoring) {
            config.monitoring = false;
            Promise.prototype._fireEvent = defaultFireEvent;
        }
    }
    if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) {
        var prev = config.asyncHooks;
        var cur = !!opts.asyncHooks;
        if (prev !== cur) {
            config.asyncHooks = cur;
            if (cur) {
                enableAsyncHooks();
            } else {
                disableAsyncHooks();
            }
        }
    }
    return Promise;
};

function defaultFireEvent() { return false; }

Promise.prototype._fireEvent = defaultFireEvent;
Promise.prototype._execute = function(executor, resolve, reject) {
    try {
        executor(resolve, reject);
    } catch (e) {
        return e;
    }
};
Promise.prototype._onCancel = function () {};
Promise.prototype._setOnCancel = function (handler) { ; };
Promise.prototype._attachCancellationCallback = function(onCancel) {
    ;
};
Promise.prototype._captureStackTrace = function () {};
Promise.prototype._attachExtraTrace = function () {};
Promise.prototype._dereferenceTrace = function () {};
Promise.prototype._clearCancellationData = function() {};
Promise.prototype._propagateFrom = function (parent, flags) {
    ;
    ;
};

function cancellationExecute(executor, resolve, reject) {
    var promise = this;
    try {
        executor(resolve, reject, function(onCancel) {
            if (typeof onCancel !== "function") {
                throw new TypeError("onCancel must be a function, got: " +
                                    util.toString(onCancel));
            }
            promise._attachCancellationCallback(onCancel);
        });
    } catch (e) {
        return e;
    }
}

function cancellationAttachCancellationCallback(onCancel) {
    if (!this._isCancellable()) return this;

    var previousOnCancel = this._onCancel();
    if (previousOnCancel !== undefined) {
        if (util.isArray(previousOnCancel)) {
            previousOnCancel.push(onCancel);
        } else {
            this._setOnCancel([previousOnCancel, onCancel]);
        }
    } else {
        this._setOnCancel(onCancel);
    }
}

function cancellationOnCancel() {
    return this._onCancelField;
}

function cancellationSetOnCancel(onCancel) {
    this._onCancelField = onCancel;
}

function cancellationClearCancellationData() {
    this._cancellationParent = undefined;
    this._onCancelField = undefined;
}

function cancellationPropagateFrom(parent, flags) {
    if ((flags & 1) !== 0) {
        this._cancellationParent = parent;
        var branchesRemainingToCancel = parent._branchesRemainingToCancel;
        if (branchesRemainingToCancel === undefined) {
            branchesRemainingToCancel = 0;
        }
        parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;
    }
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}

function bindingPropagateFrom(parent, flags) {
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}
var propagateFromFunction = bindingPropagateFrom;

function boundValueFunction() {
    var ret = this._boundTo;
    if (ret !== undefined) {
        if (ret instanceof Promise) {
            if (ret.isFulfilled()) {
                return ret.value();
            } else {
                return undefined;
            }
        }
    }
    return ret;
}

function longStackTracesCaptureStackTrace() {
    this._trace = new CapturedTrace(this._peekContext());
}

function longStackTracesAttachExtraTrace(error, ignoreSelf) {
    if (canAttachTrace(error)) {
        var trace = this._trace;
        if (trace !== undefined) {
            if (ignoreSelf) trace = trace._parent;
        }
        if (trace !== undefined) {
            trace.attachExtraTrace(error);
        } else if (!error.__stackCleaned__) {
            var parsed = parseStackAndMessage(error);
            util.notEnumerableProp(error, "stack",
                parsed.message + "\n" + parsed.stack.join("\n"));
            util.notEnumerableProp(error, "__stackCleaned__", true);
        }
    }
}

function longStackTracesDereferenceTrace() {
    this._trace = undefined;
}

function checkForgottenReturns(returnValue, promiseCreated, name, promise,
                               parent) {
    if (returnValue === undefined && promiseCreated !== null &&
        wForgottenReturn) {
        if (parent !== undefined && parent._returnedNonUndefined()) return;
        if ((promise._bitField & 65535) === 0) return;

        if (name) name = name + " ";
        var handlerLine = "";
        var creatorLine = "";
        if (promiseCreated._trace) {
            var traceLines = promiseCreated._trace.stack.split("\n");
            var stack = cleanStack(traceLines);
            for (var i = stack.length - 1; i >= 0; --i) {
                var line = stack[i];
                if (!nodeFramePattern.test(line)) {
                    var lineMatches = line.match(parseLinePattern);
                    if (lineMatches) {
                        handlerLine  = "at " + lineMatches[1] +
                            ":" + lineMatches[2] + ":" + lineMatches[3] + " ";
                    }
                    break;
                }
            }

            if (stack.length > 0) {
                var firstUserLine = stack[0];
                for (var i = 0; i < traceLines.length; ++i) {

                    if (traceLines[i] === firstUserLine) {
                        if (i > 0) {
                            creatorLine = "\n" + traceLines[i - 1];
                        }
                        break;
                    }
                }

            }
        }
        var msg = "a promise was created in a " + name +
            "handler " + handlerLine + "but was not returned from it, " +
            "see http://goo.gl/rRqMUw" +
            creatorLine;
        promise._warn(msg, true, promiseCreated);
    }
}

function deprecated(name, replacement) {
    var message = name +
        " is deprecated and will be removed in a future version.";
    if (replacement) message += " Use " + replacement + " instead.";
    return warn(message);
}

function warn(message, shouldUseOwnTrace, promise) {
    if (!config.warnings) return;
    var warning = new Warning(message);
    var ctx;
    if (shouldUseOwnTrace) {
        promise._attachExtraTrace(warning);
    } else if (config.longStackTraces && (ctx = Promise._peekContext())) {
        ctx.attachExtraTrace(warning);
    } else {
        var parsed = parseStackAndMessage(warning);
        warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
    }

    if (!activeFireEvent("warning", warning)) {
        formatAndLogError(warning, "", true);
    }
}

function reconstructStack(message, stacks) {
    for (var i = 0; i < stacks.length - 1; ++i) {
        stacks[i].push("From previous event:");
        stacks[i] = stacks[i].join("\n");
    }
    if (i < stacks.length) {
        stacks[i] = stacks[i].join("\n");
    }
    return message + "\n" + stacks.join("\n");
}

function removeDuplicateOrEmptyJumps(stacks) {
    for (var i = 0; i < stacks.length; ++i) {
        if (stacks[i].length === 0 ||
            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {
            stacks.splice(i, 1);
            i--;
        }
    }
}

function removeCommonRoots(stacks) {
    var current = stacks[0];
    for (var i = 1; i < stacks.length; ++i) {
        var prev = stacks[i];
        var currentLastIndex = current.length - 1;
        var currentLastLine = current[currentLastIndex];
        var commonRootMeetPoint = -1;

        for (var j = prev.length - 1; j >= 0; --j) {
            if (prev[j] === currentLastLine) {
                commonRootMeetPoint = j;
                break;
            }
        }

        for (var j = commonRootMeetPoint; j >= 0; --j) {
            var line = prev[j];
            if (current[currentLastIndex] === line) {
                current.pop();
                currentLastIndex--;
            } else {
                break;
            }
        }
        current = prev;
    }
}

function cleanStack(stack) {
    var ret = [];
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        var isTraceLine = "    (No stack trace)" === line ||
            stackFramePattern.test(line);
        var isInternalFrame = isTraceLine && shouldIgnore(line);
        if (isTraceLine && !isInternalFrame) {
            if (indentStackFrames && line.charAt(0) !== " ") {
                line = "    " + line;
            }
            ret.push(line);
        }
    }
    return ret;
}

function stackFramesAsArray(error) {
    var stack = error.stack.replace(/\s+$/g, "").split("\n");
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        if ("    (No stack trace)" === line || stackFramePattern.test(line)) {
            break;
        }
    }
    if (i > 0 && error.name != "SyntaxError") {
        stack = stack.slice(i);
    }
    return stack;
}

function parseStackAndMessage(error) {
    var stack = error.stack;
    var message = error.toString();
    stack = typeof stack === "string" && stack.length > 0
                ? stackFramesAsArray(error) : ["    (No stack trace)"];
    return {
        message: message,
        stack: error.name == "SyntaxError" ? stack : cleanStack(stack)
    };
}

function formatAndLogError(error, title, isSoft) {
    if (typeof console !== "undefined") {
        var message;
        if (util.isObject(error)) {
            var stack = error.stack;
            message = title + formatStack(stack, error);
        } else {
            message = title + String(error);
        }
        if (typeof printWarning === "function") {
            printWarning(message, isSoft);
        } else if (typeof console.log === "function" ||
            typeof console.log === "object") {
            console.log(message);
        }
    }
}

function fireRejectionEvent(name, localHandler, reason, promise) {
    var localEventFired = false;
    try {
        if (typeof localHandler === "function") {
            localEventFired = true;
            if (name === "rejectionHandled") {
                localHandler(promise);
            } else {
                localHandler(reason, promise);
            }
        }
    } catch (e) {
        async.throwLater(e);
    }

    if (name === "unhandledRejection") {
        if (!activeFireEvent(name, reason, promise) && !localEventFired) {
            formatAndLogError(reason, "Unhandled rejection ");
        }
    } else {
        activeFireEvent(name, promise);
    }
}

function formatNonError(obj) {
    var str;
    if (typeof obj === "function") {
        str = "[function " +
            (obj.name || "anonymous") +
            "]";
    } else {
        str = obj && typeof obj.toString === "function"
            ? obj.toString() : util.toString(obj);
        var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
        if (ruselessToString.test(str)) {
            try {
                var newStr = JSON.stringify(obj);
                str = newStr;
            }
            catch(e) {

            }
        }
        if (str.length === 0) {
            str = "(empty array)";
        }
    }
    return ("(<" + snip(str) + ">, no stack trace)");
}

function snip(str) {
    var maxChars = 41;
    if (str.length < maxChars) {
        return str;
    }
    return str.substr(0, maxChars - 3) + "...";
}

function longStackTracesIsSupported() {
    return typeof captureStackTrace === "function";
}

var shouldIgnore = function() { return false; };
var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
function parseLineInfo(line) {
    var matches = line.match(parseLineInfoRegex);
    if (matches) {
        return {
            fileName: matches[1],
            line: parseInt(matches[2], 10)
        };
    }
}

function setBounds(firstLineError, lastLineError) {
    if (!longStackTracesIsSupported()) return;
    var firstStackLines = (firstLineError.stack || "").split("\n");
    var lastStackLines = (lastLineError.stack || "").split("\n");
    var firstIndex = -1;
    var lastIndex = -1;
    var firstFileName;
    var lastFileName;
    for (var i = 0; i < firstStackLines.length; ++i) {
        var result = parseLineInfo(firstStackLines[i]);
        if (result) {
            firstFileName = result.fileName;
            firstIndex = result.line;
            break;
        }
    }
    for (var i = 0; i < lastStackLines.length; ++i) {
        var result = parseLineInfo(lastStackLines[i]);
        if (result) {
            lastFileName = result.fileName;
            lastIndex = result.line;
            break;
        }
    }
    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||
        firstFileName !== lastFileName || firstIndex >= lastIndex) {
        return;
    }

    shouldIgnore = function(line) {
        if (bluebirdFramePattern.test(line)) return true;
        var info = parseLineInfo(line);
        if (info) {
            if (info.fileName === firstFileName &&
                (firstIndex <= info.line && info.line <= lastIndex)) {
                return true;
            }
        }
        return false;
    };
}

function CapturedTrace(parent) {
    this._parent = parent;
    this._promisesCreated = 0;
    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
    captureStackTrace(this, CapturedTrace);
    if (length > 32) this.uncycle();
}
util.inherits(CapturedTrace, Error);
Context.CapturedTrace = CapturedTrace;

CapturedTrace.prototype.uncycle = function() {
    var length = this._length;
    if (length < 2) return;
    var nodes = [];
    var stackToIndex = {};

    for (var i = 0, node = this; node !== undefined; ++i) {
        nodes.push(node);
        node = node._parent;
    }
    length = this._length = i;
    for (var i = length - 1; i >= 0; --i) {
        var stack = nodes[i].stack;
        if (stackToIndex[stack] === undefined) {
            stackToIndex[stack] = i;
        }
    }
    for (var i = 0; i < length; ++i) {
        var currentStack = nodes[i].stack;
        var index = stackToIndex[currentStack];
        if (index !== undefined && index !== i) {
            if (index > 0) {
                nodes[index - 1]._parent = undefined;
                nodes[index - 1]._length = 1;
            }
            nodes[i]._parent = undefined;
            nodes[i]._length = 1;
            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;

            if (index < length - 1) {
                cycleEdgeNode._parent = nodes[index + 1];
                cycleEdgeNode._parent.uncycle();
                cycleEdgeNode._length =
                    cycleEdgeNode._parent._length + 1;
            } else {
                cycleEdgeNode._parent = undefined;
                cycleEdgeNode._length = 1;
            }
            var currentChildLength = cycleEdgeNode._length + 1;
            for (var j = i - 2; j >= 0; --j) {
                nodes[j]._length = currentChildLength;
                currentChildLength++;
            }
            return;
        }
    }
};

CapturedTrace.prototype.attachExtraTrace = function(error) {
    if (error.__stackCleaned__) return;
    this.uncycle();
    var parsed = parseStackAndMessage(error);
    var message = parsed.message;
    var stacks = [parsed.stack];

    var trace = this;
    while (trace !== undefined) {
        stacks.push(cleanStack(trace.stack.split("\n")));
        trace = trace._parent;
    }
    removeCommonRoots(stacks);
    removeDuplicateOrEmptyJumps(stacks);
    util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
    util.notEnumerableProp(error, "__stackCleaned__", true);
};

var captureStackTrace = (function stackDetection() {
    var v8stackFramePattern = /^\s*at\s*/;
    var v8stackFormatter = function(stack, error) {
        if (typeof stack === "string") return stack;

        if (error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    if (typeof Error.stackTraceLimit === "number" &&
        typeof Error.captureStackTrace === "function") {
        Error.stackTraceLimit += 6;
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        var captureStackTrace = Error.captureStackTrace;

        shouldIgnore = function(line) {
            return bluebirdFramePattern.test(line);
        };
        return function(receiver, ignoreUntil) {
            Error.stackTraceLimit += 6;
            captureStackTrace(receiver, ignoreUntil);
            Error.stackTraceLimit -= 6;
        };
    }
    var err = new Error();

    if (typeof err.stack === "string" &&
        err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
        stackFramePattern = /@/;
        formatStack = v8stackFormatter;
        indentStackFrames = true;
        return function captureStackTrace(o) {
            o.stack = new Error().stack;
        };
    }

    var hasStackAfterThrow;
    try { throw new Error(); }
    catch(e) {
        hasStackAfterThrow = ("stack" in e);
    }
    if (!("stack" in err) && hasStackAfterThrow &&
        typeof Error.stackTraceLimit === "number") {
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        return function captureStackTrace(o) {
            Error.stackTraceLimit += 6;
            try { throw new Error(); }
            catch(e) { o.stack = e.stack; }
            Error.stackTraceLimit -= 6;
        };
    }

    formatStack = function(stack, error) {
        if (typeof stack === "string") return stack;

        if ((typeof error === "object" ||
            typeof error === "function") &&
            error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    return null;

})([]);

if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
    printWarning = function (message) {
        console.warn(message);
    };
    if (util.isNode && process.stderr.isTTY) {
        printWarning = function(message, isSoft) {
            var color = isSoft ? "\u001b[33m" : "\u001b[31m";
            console.warn(color + message + "\u001b[0m\n");
        };
    } else if (!util.isNode && typeof (new Error().stack) === "string") {
        printWarning = function(message, isSoft) {
            console.warn("%c" + message,
                        isSoft ? "color: darkorange" : "color: red");
        };
    }
}

var config = {
    warnings: warnings,
    longStackTraces: false,
    cancellation: false,
    monitoring: false,
    asyncHooks: false
};

if (longStackTraces) Promise.longStackTraces();

return {
    asyncHooks: function() {
        return config.asyncHooks;
    },
    longStackTraces: function() {
        return config.longStackTraces;
    },
    warnings: function() {
        return config.warnings;
    },
    cancellation: function() {
        return config.cancellation;
    },
    monitoring: function() {
        return config.monitoring;
    },
    propagateFromFunction: function() {
        return propagateFromFunction;
    },
    boundValueFunction: function() {
        return boundValueFunction;
    },
    checkForgottenReturns: checkForgottenReturns,
    setBounds: setBounds,
    warn: warn,
    deprecated: deprecated,
    CapturedTrace: CapturedTrace,
    fireDomEvent: fireDomEvent,
    fireGlobalEvent: fireGlobalEvent
};
};

},{"./errors":9,"./es5":10,"./util":21}],8:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
function returner() {
    return this.value;
}
function thrower() {
    throw this.reason;
}

Promise.prototype["return"] =
Promise.prototype.thenReturn = function (value) {
    if (value instanceof Promise) value.suppressUnhandledRejections();
    return this._then(
        returner, undefined, undefined, {value: value}, undefined);
};

Promise.prototype["throw"] =
Promise.prototype.thenThrow = function (reason) {
    return this._then(
        thrower, undefined, undefined, {reason: reason}, undefined);
};

Promise.prototype.catchThrow = function (reason) {
    if (arguments.length <= 1) {
        return this._then(
            undefined, thrower, undefined, {reason: reason}, undefined);
    } else {
        var _reason = arguments[1];
        var handler = function() {throw _reason;};
        return this.caught(reason, handler);
    }
};

Promise.prototype.catchReturn = function (value) {
    if (arguments.length <= 1) {
        if (value instanceof Promise) value.suppressUnhandledRejections();
        return this._then(
            undefined, returner, undefined, {value: value}, undefined);
    } else {
        var _value = arguments[1];
        if (_value instanceof Promise) _value.suppressUnhandledRejections();
        var handler = function() {return _value;};
        return this.caught(value, handler);
    }
};
};

},{}],9:[function(_dereq_,module,exports){
"use strict";
var es5 = _dereq_("./es5");
var Objectfreeze = es5.freeze;
var util = _dereq_("./util");
var inherits = util.inherits;
var notEnumerableProp = util.notEnumerableProp;

function subError(nameProperty, defaultMessage) {
    function SubError(message) {
        if (!(this instanceof SubError)) return new SubError(message);
        notEnumerableProp(this, "message",
            typeof message === "string" ? message : defaultMessage);
        notEnumerableProp(this, "name", nameProperty);
        if (Error.captureStackTrace) {
            Error.captureStackTrace(this, this.constructor);
        } else {
            Error.call(this);
        }
    }
    inherits(SubError, Error);
    return SubError;
}

var _TypeError, _RangeError;
var Warning = subError("Warning", "warning");
var CancellationError = subError("CancellationError", "cancellation error");
var TimeoutError = subError("TimeoutError", "timeout error");
var AggregateError = subError("AggregateError", "aggregate error");
try {
    _TypeError = TypeError;
    _RangeError = RangeError;
} catch(e) {
    _TypeError = subError("TypeError", "type error");
    _RangeError = subError("RangeError", "range error");
}

var methods = ("join pop push shift unshift slice filter forEach some " +
    "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" ");

for (var i = 0; i < methods.length; ++i) {
    if (typeof Array.prototype[methods[i]] === "function") {
        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];
    }
}

es5.defineProperty(AggregateError.prototype, "length", {
    value: 0,
    configurable: false,
    writable: true,
    enumerable: true
});
AggregateError.prototype["isOperational"] = true;
var level = 0;
AggregateError.prototype.toString = function() {
    var indent = Array(level * 4 + 1).join(" ");
    var ret = "\n" + indent + "AggregateError of:" + "\n";
    level++;
    indent = Array(level * 4 + 1).join(" ");
    for (var i = 0; i < this.length; ++i) {
        var str = this[i] === this ? "[Circular AggregateError]" : this[i] + "";
        var lines = str.split("\n");
        for (var j = 0; j < lines.length; ++j) {
            lines[j] = indent + lines[j];
        }
        str = lines.join("\n");
        ret += str + "\n";
    }
    level--;
    return ret;
};

function OperationalError(message) {
    if (!(this instanceof OperationalError))
        return new OperationalError(message);
    notEnumerableProp(this, "name", "OperationalError");
    notEnumerableProp(this, "message", message);
    this.cause = message;
    this["isOperational"] = true;

    if (message instanceof Error) {
        notEnumerableProp(this, "message", message.message);
        notEnumerableProp(this, "stack", message.stack);
    } else if (Error.captureStackTrace) {
        Error.captureStackTrace(this, this.constructor);
    }

}
inherits(OperationalError, Error);

var errorTypes = Error["__BluebirdErrorTypes__"];
if (!errorTypes) {
    errorTypes = Objectfreeze({
        CancellationError: CancellationError,
        TimeoutError: TimeoutError,
        OperationalError: OperationalError,
        RejectionError: OperationalError,
        AggregateError: AggregateError
    });
    es5.defineProperty(Error, "__BluebirdErrorTypes__", {
        value: errorTypes,
        writable: false,
        enumerable: false,
        configurable: false
    });
}

module.exports = {
    Error: Error,
    TypeError: _TypeError,
    RangeError: _RangeError,
    CancellationError: errorTypes.CancellationError,
    OperationalError: errorTypes.OperationalError,
    TimeoutError: errorTypes.TimeoutError,
    AggregateError: errorTypes.AggregateError,
    Warning: Warning
};

},{"./es5":10,"./util":21}],10:[function(_dereq_,module,exports){
var isES5 = (function(){
    "use strict";
    return this === undefined;
})();

if (isES5) {
    module.exports = {
        freeze: Object.freeze,
        defineProperty: Object.defineProperty,
        getDescriptor: Object.getOwnPropertyDescriptor,
        keys: Object.keys,
        names: Object.getOwnPropertyNames,
        getPrototypeOf: Object.getPrototypeOf,
        isArray: Array.isArray,
        isES5: isES5,
        propertyIsWritable: function(obj, prop) {
            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
            return !!(!descriptor || descriptor.writable || descriptor.set);
        }
    };
} else {
    var has = {}.hasOwnProperty;
    var str = {}.toString;
    var proto = {}.constructor.prototype;

    var ObjectKeys = function (o) {
        var ret = [];
        for (var key in o) {
            if (has.call(o, key)) {
                ret.push(key);
            }
        }
        return ret;
    };

    var ObjectGetDescriptor = function(o, key) {
        return {value: o[key]};
    };

    var ObjectDefineProperty = function (o, key, desc) {
        o[key] = desc.value;
        return o;
    };

    var ObjectFreeze = function (obj) {
        return obj;
    };

    var ObjectGetPrototypeOf = function (obj) {
        try {
            return Object(obj).constructor.prototype;
        }
        catch (e) {
            return proto;
        }
    };

    var ArrayIsArray = function (obj) {
        try {
            return str.call(obj) === "[object Array]";
        }
        catch(e) {
            return false;
        }
    };

    module.exports = {
        isArray: ArrayIsArray,
        keys: ObjectKeys,
        names: ObjectKeys,
        defineProperty: ObjectDefineProperty,
        getDescriptor: ObjectGetDescriptor,
        freeze: ObjectFreeze,
        getPrototypeOf: ObjectGetPrototypeOf,
        isES5: isES5,
        propertyIsWritable: function() {
            return true;
        }
    };
}

},{}],11:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) {
var util = _dereq_("./util");
var CancellationError = Promise.CancellationError;
var errorObj = util.errorObj;
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);

function PassThroughHandlerContext(promise, type, handler) {
    this.promise = promise;
    this.type = type;
    this.handler = handler;
    this.called = false;
    this.cancelPromise = null;
}

PassThroughHandlerContext.prototype.isFinallyHandler = function() {
    return this.type === 0;
};

function FinallyHandlerCancelReaction(finallyHandler) {
    this.finallyHandler = finallyHandler;
}

FinallyHandlerCancelReaction.prototype._resultCancelled = function() {
    checkCancel(this.finallyHandler);
};

function checkCancel(ctx, reason) {
    if (ctx.cancelPromise != null) {
        if (arguments.length > 1) {
            ctx.cancelPromise._reject(reason);
        } else {
            ctx.cancelPromise._cancel();
        }
        ctx.cancelPromise = null;
        return true;
    }
    return false;
}

function succeed() {
    return finallyHandler.call(this, this.promise._target()._settledValue());
}
function fail(reason) {
    if (checkCancel(this, reason)) return;
    errorObj.e = reason;
    return errorObj;
}
function finallyHandler(reasonOrValue) {
    var promise = this.promise;
    var handler = this.handler;

    if (!this.called) {
        this.called = true;
        var ret = this.isFinallyHandler()
            ? handler.call(promise._boundValue())
            : handler.call(promise._boundValue(), reasonOrValue);
        if (ret === NEXT_FILTER) {
            return ret;
        } else if (ret !== undefined) {
            promise._setReturnedNonUndefined();
            var maybePromise = tryConvertToPromise(ret, promise);
            if (maybePromise instanceof Promise) {
                if (this.cancelPromise != null) {
                    if (maybePromise._isCancelled()) {
                        var reason =
                            new CancellationError("late cancellation observer");
                        promise._attachExtraTrace(reason);
                        errorObj.e = reason;
                        return errorObj;
                    } else if (maybePromise.isPending()) {
                        maybePromise._attachCancellationCallback(
                            new FinallyHandlerCancelReaction(this));
                    }
                }
                return maybePromise._then(
                    succeed, fail, undefined, this, undefined);
            }
        }
    }

    if (promise.isRejected()) {
        checkCancel(this);
        errorObj.e = reasonOrValue;
        return errorObj;
    } else {
        checkCancel(this);
        return reasonOrValue;
    }
}

Promise.prototype._passThrough = function(handler, type, success, fail) {
    if (typeof handler !== "function") return this.then();
    return this._then(success,
                      fail,
                      undefined,
                      new PassThroughHandlerContext(this, type, handler),
                      undefined);
};

Promise.prototype.lastly =
Promise.prototype["finally"] = function (handler) {
    return this._passThrough(handler,
                             0,
                             finallyHandler,
                             finallyHandler);
};


Promise.prototype.tap = function (handler) {
    return this._passThrough(handler, 1, finallyHandler);
};

Promise.prototype.tapCatch = function (handlerOrPredicate) {
    var len = arguments.length;
    if(len === 1) {
        return this._passThrough(handlerOrPredicate,
                                 1,
                                 undefined,
                                 finallyHandler);
    } else {
         var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return Promise.reject(new TypeError(
                    "tapCatch statement predicate: "
                    + "expecting an object but got " + util.classString(item)
                ));
            }
        }
        catchInstances.length = j;
        var handler = arguments[i];
        return this._passThrough(catchFilter(catchInstances, handler, this),
                                 1,
                                 undefined,
                                 finallyHandler);
    }

};

return PassThroughHandlerContext;
};

},{"./catch_filter":5,"./util":21}],12:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) {
var util = _dereq_("./util");
var canEvaluate = util.canEvaluate;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var reject;

if (!true) {
if (canEvaluate) {
    var thenCallback = function(i) {
        return new Function("value", "holder", "                             \n\
            'use strict';                                                    \n\
            holder.pIndex = value;                                           \n\
            holder.checkFulfillment(this);                                   \n\
            ".replace(/Index/g, i));
    };

    var promiseSetter = function(i) {
        return new Function("promise", "holder", "                           \n\
            'use strict';                                                    \n\
            holder.pIndex = promise;                                         \n\
            ".replace(/Index/g, i));
    };

    var generateHolderClass = function(total) {
        var props = new Array(total);
        for (var i = 0; i < props.length; ++i) {
            props[i] = "this.p" + (i+1);
        }
        var assignment = props.join(" = ") + " = null;";
        var cancellationCode= "var promise;\n" + props.map(function(prop) {
            return "                                                         \n\
                promise = " + prop + ";                                      \n\
                if (promise instanceof Promise) {                            \n\
                    promise.cancel();                                        \n\
                }                                                            \n\
            ";
        }).join("\n");
        var passedArguments = props.join(", ");
        var name = "Holder$" + total;


        var code = "return function(tryCatch, errorObj, Promise, async) {    \n\
            'use strict';                                                    \n\
            function [TheName](fn) {                                         \n\
                [TheProperties]                                              \n\
                this.fn = fn;                                                \n\
                this.asyncNeeded = true;                                     \n\
                this.now = 0;                                                \n\
            }                                                                \n\
                                                                             \n\
            [TheName].prototype._callFunction = function(promise) {          \n\
                promise._pushContext();                                      \n\
                var ret = tryCatch(this.fn)([ThePassedArguments]);           \n\
                promise._popContext();                                       \n\
                if (ret === errorObj) {                                      \n\
                    promise._rejectCallback(ret.e, false);                   \n\
                } else {                                                     \n\
                    promise._resolveCallback(ret);                           \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype.checkFulfillment = function(promise) {       \n\
                var now = ++this.now;                                        \n\
                if (now === [TheTotal]) {                                    \n\
                    if (this.asyncNeeded) {                                  \n\
                        async.invoke(this._callFunction, this, promise);     \n\
                    } else {                                                 \n\
                        this._callFunction(promise);                         \n\
                    }                                                        \n\
                                                                             \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype._resultCancelled = function() {              \n\
                [CancellationCode]                                           \n\
            };                                                               \n\
                                                                             \n\
            return [TheName];                                                \n\
        }(tryCatch, errorObj, Promise, async);                               \n\
        ";

        code = code.replace(/\[TheName\]/g, name)
            .replace(/\[TheTotal\]/g, total)
            .replace(/\[ThePassedArguments\]/g, passedArguments)
            .replace(/\[TheProperties\]/g, assignment)
            .replace(/\[CancellationCode\]/g, cancellationCode);

        return new Function("tryCatch", "errorObj", "Promise", "async", code)
                           (tryCatch, errorObj, Promise, async);
    };

    var holderClasses = [];
    var thenCallbacks = [];
    var promiseSetters = [];

    for (var i = 0; i < 8; ++i) {
        holderClasses.push(generateHolderClass(i + 1));
        thenCallbacks.push(thenCallback(i + 1));
        promiseSetters.push(promiseSetter(i + 1));
    }

    reject = function (reason) {
        this._reject(reason);
    };
}}

Promise.join = function () {
    var last = arguments.length - 1;
    var fn;
    if (last > 0 && typeof arguments[last] === "function") {
        fn = arguments[last];
        if (!true) {
            if (last <= 8 && canEvaluate) {
                var ret = new Promise(INTERNAL);
                ret._captureStackTrace();
                var HolderClass = holderClasses[last - 1];
                var holder = new HolderClass(fn);
                var callbacks = thenCallbacks;

                for (var i = 0; i < last; ++i) {
                    var maybePromise = tryConvertToPromise(arguments[i], ret);
                    if (maybePromise instanceof Promise) {
                        maybePromise = maybePromise._target();
                        var bitField = maybePromise._bitField;
                        ;
                        if (((bitField & 50397184) === 0)) {
                            maybePromise._then(callbacks[i], reject,
                                               undefined, ret, holder);
                            promiseSetters[i](maybePromise, holder);
                            holder.asyncNeeded = false;
                        } else if (((bitField & 33554432) !== 0)) {
                            callbacks[i].call(ret,
                                              maybePromise._value(), holder);
                        } else if (((bitField & 16777216) !== 0)) {
                            ret._reject(maybePromise._reason());
                        } else {
                            ret._cancel();
                        }
                    } else {
                        callbacks[i].call(ret, maybePromise, holder);
                    }
                }

                if (!ret._isFateSealed()) {
                    if (holder.asyncNeeded) {
                        var context = Promise._getContext();
                        holder.fn = util.contextBind(context, holder.fn);
                    }
                    ret._setAsyncGuaranteed();
                    ret._setOnCancel(holder);
                }
                return ret;
            }
        }
    }
    var args = [].slice.call(arguments);;
    if (fn) args.pop();
    var ret = new PromiseArray(args).promise();
    return fn !== undefined ? ret.spread(fn) : ret;
};

};

},{"./util":21}],13:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;

Promise.method = function (fn) {
    if (typeof fn !== "function") {
        throw new Promise.TypeError("expecting a function but got " + util.classString(fn));
    }
    return function () {
        var ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._pushContext();
        var value = tryCatch(fn).apply(this, arguments);
        var promiseCreated = ret._popContext();
        debug.checkForgottenReturns(
            value, promiseCreated, "Promise.method", ret);
        ret._resolveFromSyncValue(value);
        return ret;
    };
};

Promise.attempt = Promise["try"] = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._pushContext();
    var value;
    if (arguments.length > 1) {
        debug.deprecated("calling Promise.try with more than 1 argument");
        var arg = arguments[1];
        var ctx = arguments[2];
        value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg)
                                  : tryCatch(fn).call(ctx, arg);
    } else {
        value = tryCatch(fn)();
    }
    var promiseCreated = ret._popContext();
    debug.checkForgottenReturns(
        value, promiseCreated, "Promise.try", ret);
    ret._resolveFromSyncValue(value);
    return ret;
};

Promise.prototype._resolveFromSyncValue = function (value) {
    if (value === util.errorObj) {
        this._rejectCallback(value.e, false);
    } else {
        this._resolveCallback(value, true);
    }
};
};

},{"./util":21}],14:[function(_dereq_,module,exports){
"use strict";
var util = _dereq_("./util");
var maybeWrapAsError = util.maybeWrapAsError;
var errors = _dereq_("./errors");
var OperationalError = errors.OperationalError;
var es5 = _dereq_("./es5");

function isUntypedError(obj) {
    return obj instanceof Error &&
        es5.getPrototypeOf(obj) === Error.prototype;
}

var rErrorKey = /^(?:name|message|stack|cause)$/;
function wrapAsOperationalError(obj) {
    var ret;
    if (isUntypedError(obj)) {
        ret = new OperationalError(obj);
        ret.name = obj.name;
        ret.message = obj.message;
        ret.stack = obj.stack;
        var keys = es5.keys(obj);
        for (var i = 0; i < keys.length; ++i) {
            var key = keys[i];
            if (!rErrorKey.test(key)) {
                ret[key] = obj[key];
            }
        }
        return ret;
    }
    util.markAsOriginatingFromRejection(obj);
    return obj;
}

function nodebackForPromise(promise, multiArgs) {
    return function(err, value) {
        if (promise === null) return;
        if (err) {
            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));
            promise._attachExtraTrace(wrapped);
            promise._reject(wrapped);
        } else if (!multiArgs) {
            promise._fulfill(value);
        } else {
            var args = [].slice.call(arguments, 1);;
            promise._fulfill(args);
        }
        promise = null;
    };
}

module.exports = nodebackForPromise;

},{"./errors":9,"./es5":10,"./util":21}],15:[function(_dereq_,module,exports){
"use strict";
module.exports = function() {
var makeSelfResolutionError = function () {
    return new TypeError("circular promise resolution chain\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var reflectHandler = function() {
    return new Promise.PromiseInspection(this._target());
};
var apiRejection = function(msg) {
    return Promise.reject(new TypeError(msg));
};
function Proxyable() {}
var UNDEFINED_BINDING = {};
var util = _dereq_("./util");
util.setReflectHandler(reflectHandler);

var getDomain = function() {
    var domain = process.domain;
    if (domain === undefined) {
        return null;
    }
    return domain;
};
var getContextDefault = function() {
    return null;
};
var getContextDomain = function() {
    return {
        domain: getDomain(),
        async: null
    };
};
var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ?
    _dereq_("async_hooks").AsyncResource : null;
var getContextAsyncHooks = function() {
    return {
        domain: getDomain(),
        async: new AsyncResource("Bluebird::Promise")
    };
};
var getContext = util.isNode ? getContextDomain : getContextDefault;
util.notEnumerableProp(Promise, "_getContext", getContext);
var enableAsyncHooks = function() {
    getContext = getContextAsyncHooks;
    util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks);
};
var disableAsyncHooks = function() {
    getContext = getContextDomain;
    util.notEnumerableProp(Promise, "_getContext", getContextDomain);
};

var es5 = _dereq_("./es5");
var Async = _dereq_("./async");
var async = new Async();
es5.defineProperty(Promise, "_async", {value: async});
var errors = _dereq_("./errors");
var TypeError = Promise.TypeError = errors.TypeError;
Promise.RangeError = errors.RangeError;
var CancellationError = Promise.CancellationError = errors.CancellationError;
Promise.TimeoutError = errors.TimeoutError;
Promise.OperationalError = errors.OperationalError;
Promise.RejectionError = errors.OperationalError;
Promise.AggregateError = errors.AggregateError;
var INTERNAL = function(){};
var APPLY = {};
var NEXT_FILTER = {};
var tryConvertToPromise = _dereq_("./thenables")(Promise, INTERNAL);
var PromiseArray =
    _dereq_("./promise_array")(Promise, INTERNAL,
                               tryConvertToPromise, apiRejection, Proxyable);
var Context = _dereq_("./context")(Promise);
 /*jshint unused:false*/
var createContext = Context.create;

var debug = _dereq_("./debuggability")(Promise, Context,
    enableAsyncHooks, disableAsyncHooks);
var CapturedTrace = debug.CapturedTrace;
var PassThroughHandlerContext =
    _dereq_("./finally")(Promise, tryConvertToPromise, NEXT_FILTER);
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);
var nodebackForPromise = _dereq_("./nodeback");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
function check(self, executor) {
    if (self == null || self.constructor !== Promise) {
        throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (typeof executor !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(executor));
    }

}

function Promise(executor) {
    if (executor !== INTERNAL) {
        check(this, executor);
    }
    this._bitField = 0;
    this._fulfillmentHandler0 = undefined;
    this._rejectionHandler0 = undefined;
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._resolveFromExecutor(executor);
    this._promiseCreated();
    this._fireEvent("promiseCreated", this);
}

Promise.prototype.toString = function () {
    return "[object Promise]";
};

Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {
    var len = arguments.length;
    if (len > 1) {
        var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return apiRejection("Catch statement predicate: " +
                    "expecting an object but got " + util.classString(item));
            }
        }
        catchInstances.length = j;
        fn = arguments[i];

        if (typeof fn !== "function") {
            throw new TypeError("The last argument to .catch() " +
                "must be a function, got " + util.toString(fn));
        }
        return this.then(undefined, catchFilter(catchInstances, fn, this));
    }
    return this.then(undefined, fn);
};

Promise.prototype.reflect = function () {
    return this._then(reflectHandler,
        reflectHandler, undefined, this, undefined);
};

Promise.prototype.then = function (didFulfill, didReject) {
    if (debug.warnings() && arguments.length > 0 &&
        typeof didFulfill !== "function" &&
        typeof didReject !== "function") {
        var msg = ".then() only accepts functions but was passed: " +
                util.classString(didFulfill);
        if (arguments.length > 1) {
            msg += ", " + util.classString(didReject);
        }
        this._warn(msg);
    }
    return this._then(didFulfill, didReject, undefined, undefined, undefined);
};

Promise.prototype.done = function (didFulfill, didReject) {
    var promise =
        this._then(didFulfill, didReject, undefined, undefined, undefined);
    promise._setIsFinal();
};

Promise.prototype.spread = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    return this.all()._then(fn, undefined, undefined, APPLY, undefined);
};

Promise.prototype.toJSON = function () {
    var ret = {
        isFulfilled: false,
        isRejected: false,
        fulfillmentValue: undefined,
        rejectionReason: undefined
    };
    if (this.isFulfilled()) {
        ret.fulfillmentValue = this.value();
        ret.isFulfilled = true;
    } else if (this.isRejected()) {
        ret.rejectionReason = this.reason();
        ret.isRejected = true;
    }
    return ret;
};

Promise.prototype.all = function () {
    if (arguments.length > 0) {
        this._warn(".all() was passed arguments but it does not take any");
    }
    return new PromiseArray(this).promise();
};

Promise.prototype.error = function (fn) {
    return this.caught(util.originatesFromRejection, fn);
};

Promise.getNewLibraryCopy = module.exports;

Promise.is = function (val) {
    return val instanceof Promise;
};

Promise.fromNode = Promise.fromCallback = function(fn) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs
                                         : false;
    var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));
    if (result === errorObj) {
        ret._rejectCallback(result.e, true);
    }
    if (!ret._isFateSealed()) ret._setAsyncGuaranteed();
    return ret;
};

Promise.all = function (promises) {
    return new PromiseArray(promises).promise();
};

Promise.cast = function (obj) {
    var ret = tryConvertToPromise(obj);
    if (!(ret instanceof Promise)) {
        ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._setFulfilled();
        ret._rejectionHandler0 = obj;
    }
    return ret;
};

Promise.resolve = Promise.fulfilled = Promise.cast;

Promise.reject = Promise.rejected = function (reason) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._rejectCallback(reason, true);
    return ret;
};

Promise.setScheduler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    return async.setScheduler(fn);
};

Promise.prototype._then = function (
    didFulfill,
    didReject,
    _,    receiver,
    internalData
) {
    var haveInternalData = internalData !== undefined;
    var promise = haveInternalData ? internalData : new Promise(INTERNAL);
    var target = this._target();
    var bitField = target._bitField;

    if (!haveInternalData) {
        promise._propagateFrom(this, 3);
        promise._captureStackTrace();
        if (receiver === undefined &&
            ((this._bitField & 2097152) !== 0)) {
            if (!((bitField & 50397184) === 0)) {
                receiver = this._boundValue();
            } else {
                receiver = target === this ? undefined : this._boundTo;
            }
        }
        this._fireEvent("promiseChained", this, promise);
    }

    var context = getContext();
    if (!((bitField & 50397184) === 0)) {
        var handler, value, settler = target._settlePromiseCtx;
        if (((bitField & 33554432) !== 0)) {
            value = target._rejectionHandler0;
            handler = didFulfill;
        } else if (((bitField & 16777216) !== 0)) {
            value = target._fulfillmentHandler0;
            handler = didReject;
            target._unsetRejectionIsUnhandled();
        } else {
            settler = target._settlePromiseLateCancellationObserver;
            value = new CancellationError("late cancellation observer");
            target._attachExtraTrace(value);
            handler = didReject;
        }

        async.invoke(settler, target, {
            handler: util.contextBind(context, handler),
            promise: promise,
            receiver: receiver,
            value: value
        });
    } else {
        target._addCallbacks(didFulfill, didReject, promise,
                receiver, context);
    }

    return promise;
};

Promise.prototype._length = function () {
    return this._bitField & 65535;
};

Promise.prototype._isFateSealed = function () {
    return (this._bitField & 117506048) !== 0;
};

Promise.prototype._isFollowing = function () {
    return (this._bitField & 67108864) === 67108864;
};

Promise.prototype._setLength = function (len) {
    this._bitField = (this._bitField & -65536) |
        (len & 65535);
};

Promise.prototype._setFulfilled = function () {
    this._bitField = this._bitField | 33554432;
    this._fireEvent("promiseFulfilled", this);
};

Promise.prototype._setRejected = function () {
    this._bitField = this._bitField | 16777216;
    this._fireEvent("promiseRejected", this);
};

Promise.prototype._setFollowing = function () {
    this._bitField = this._bitField | 67108864;
    this._fireEvent("promiseResolved", this);
};

Promise.prototype._setIsFinal = function () {
    this._bitField = this._bitField | 4194304;
};

Promise.prototype._isFinal = function () {
    return (this._bitField & 4194304) > 0;
};

Promise.prototype._unsetCancelled = function() {
    this._bitField = this._bitField & (~65536);
};

Promise.prototype._setCancelled = function() {
    this._bitField = this._bitField | 65536;
    this._fireEvent("promiseCancelled", this);
};

Promise.prototype._setWillBeCancelled = function() {
    this._bitField = this._bitField | 8388608;
};

Promise.prototype._setAsyncGuaranteed = function() {
    if (async.hasCustomScheduler()) return;
    var bitField = this._bitField;
    this._bitField = bitField |
        (((bitField & 536870912) >> 2) ^
        134217728);
};

Promise.prototype._setNoAsyncGuarantee = function() {
    this._bitField = (this._bitField | 536870912) &
        (~134217728);
};

Promise.prototype._receiverAt = function (index) {
    var ret = index === 0 ? this._receiver0 : this[
            index * 4 - 4 + 3];
    if (ret === UNDEFINED_BINDING) {
        return undefined;
    } else if (ret === undefined && this._isBound()) {
        return this._boundValue();
    }
    return ret;
};

Promise.prototype._promiseAt = function (index) {
    return this[
            index * 4 - 4 + 2];
};

Promise.prototype._fulfillmentHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 0];
};

Promise.prototype._rejectionHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 1];
};

Promise.prototype._boundValue = function() {};

Promise.prototype._migrateCallback0 = function (follower) {
    var bitField = follower._bitField;
    var fulfill = follower._fulfillmentHandler0;
    var reject = follower._rejectionHandler0;
    var promise = follower._promise0;
    var receiver = follower._receiverAt(0);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._migrateCallbackAt = function (follower, index) {
    var fulfill = follower._fulfillmentHandlerAt(index);
    var reject = follower._rejectionHandlerAt(index);
    var promise = follower._promiseAt(index);
    var receiver = follower._receiverAt(index);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._addCallbacks = function (
    fulfill,
    reject,
    promise,
    receiver,
    context
) {
    var index = this._length();

    if (index >= 65535 - 4) {
        index = 0;
        this._setLength(0);
    }

    if (index === 0) {
        this._promise0 = promise;
        this._receiver0 = receiver;
        if (typeof fulfill === "function") {
            this._fulfillmentHandler0 = util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this._rejectionHandler0 = util.contextBind(context, reject);
        }
    } else {
        var base = index * 4 - 4;
        this[base + 2] = promise;
        this[base + 3] = receiver;
        if (typeof fulfill === "function") {
            this[base + 0] =
                util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this[base + 1] =
                util.contextBind(context, reject);
        }
    }
    this._setLength(index + 1);
    return index;
};

Promise.prototype._proxy = function (proxyable, arg) {
    this._addCallbacks(undefined, undefined, arg, proxyable, null);
};

Promise.prototype._resolveCallback = function(value, shouldBind) {
    if (((this._bitField & 117506048) !== 0)) return;
    if (value === this)
        return this._rejectCallback(makeSelfResolutionError(), false);
    var maybePromise = tryConvertToPromise(value, this);
    if (!(maybePromise instanceof Promise)) return this._fulfill(value);

    if (shouldBind) this._propagateFrom(maybePromise, 2);


    var promise = maybePromise._target();

    if (promise === this) {
        this._reject(makeSelfResolutionError());
        return;
    }

    var bitField = promise._bitField;
    if (((bitField & 50397184) === 0)) {
        var len = this._length();
        if (len > 0) promise._migrateCallback0(this);
        for (var i = 1; i < len; ++i) {
            promise._migrateCallbackAt(this, i);
        }
        this._setFollowing();
        this._setLength(0);
        this._setFollowee(maybePromise);
    } else if (((bitField & 33554432) !== 0)) {
        this._fulfill(promise._value());
    } else if (((bitField & 16777216) !== 0)) {
        this._reject(promise._reason());
    } else {
        var reason = new CancellationError("late cancellation observer");
        promise._attachExtraTrace(reason);
        this._reject(reason);
    }
};

Promise.prototype._rejectCallback =
function(reason, synchronous, ignoreNonErrorWarnings) {
    var trace = util.ensureErrorObject(reason);
    var hasStack = trace === reason;
    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {
        var message = "a promise was rejected with a non-error: " +
            util.classString(reason);
        this._warn(message, true);
    }
    this._attachExtraTrace(trace, synchronous ? hasStack : false);
    this._reject(reason);
};

Promise.prototype._resolveFromExecutor = function (executor) {
    if (executor === INTERNAL) return;
    var promise = this;
    this._captureStackTrace();
    this._pushContext();
    var synchronous = true;
    var r = this._execute(executor, function(value) {
        promise._resolveCallback(value);
    }, function (reason) {
        promise._rejectCallback(reason, synchronous);
    });
    synchronous = false;
    this._popContext();

    if (r !== undefined) {
        promise._rejectCallback(r, true);
    }
};

Promise.prototype._settlePromiseFromHandler = function (
    handler, receiver, value, promise
) {
    var bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;
    promise._pushContext();
    var x;
    if (receiver === APPLY) {
        if (!value || typeof value.length !== "number") {
            x = errorObj;
            x.e = new TypeError("cannot .spread() a non-array: " +
                                    util.classString(value));
        } else {
            x = tryCatch(handler).apply(this._boundValue(), value);
        }
    } else {
        x = tryCatch(handler).call(receiver, value);
    }
    var promiseCreated = promise._popContext();
    bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;

    if (x === NEXT_FILTER) {
        promise._reject(value);
    } else if (x === errorObj) {
        promise._rejectCallback(x.e, false);
    } else {
        debug.checkForgottenReturns(x, promiseCreated, "",  promise, this);
        promise._resolveCallback(x);
    }
};

Promise.prototype._target = function() {
    var ret = this;
    while (ret._isFollowing()) ret = ret._followee();
    return ret;
};

Promise.prototype._followee = function() {
    return this._rejectionHandler0;
};

Promise.prototype._setFollowee = function(promise) {
    this._rejectionHandler0 = promise;
};

Promise.prototype._settlePromise = function(promise, handler, receiver, value) {
    var isPromise = promise instanceof Promise;
    var bitField = this._bitField;
    var asyncGuaranteed = ((bitField & 134217728) !== 0);
    if (((bitField & 65536) !== 0)) {
        if (isPromise) promise._invokeInternalOnCancel();

        if (receiver instanceof PassThroughHandlerContext &&
            receiver.isFinallyHandler()) {
            receiver.cancelPromise = promise;
            if (tryCatch(handler).call(receiver, value) === errorObj) {
                promise._reject(errorObj.e);
            }
        } else if (handler === reflectHandler) {
            promise._fulfill(reflectHandler.call(receiver));
        } else if (receiver instanceof Proxyable) {
            receiver._promiseCancelled(promise);
        } else if (isPromise || promise instanceof PromiseArray) {
            promise._cancel();
        } else {
            receiver.cancel();
        }
    } else if (typeof handler === "function") {
        if (!isPromise) {
            handler.call(receiver, value, promise);
        } else {
            if (asyncGuaranteed) promise._setAsyncGuaranteed();
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (receiver instanceof Proxyable) {
        if (!receiver._isResolved()) {
            if (((bitField & 33554432) !== 0)) {
                receiver._promiseFulfilled(value, promise);
            } else {
                receiver._promiseRejected(value, promise);
            }
        }
    } else if (isPromise) {
        if (asyncGuaranteed) promise._setAsyncGuaranteed();
        if (((bitField & 33554432) !== 0)) {
            promise._fulfill(value);
        } else {
            promise._reject(value);
        }
    }
};

Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) {
    var handler = ctx.handler;
    var promise = ctx.promise;
    var receiver = ctx.receiver;
    var value = ctx.value;
    if (typeof handler === "function") {
        if (!(promise instanceof Promise)) {
            handler.call(receiver, value, promise);
        } else {
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (promise instanceof Promise) {
        promise._reject(value);
    }
};

Promise.prototype._settlePromiseCtx = function(ctx) {
    this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);
};

Promise.prototype._settlePromise0 = function(handler, value, bitField) {
    var promise = this._promise0;
    var receiver = this._receiverAt(0);
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._settlePromise(promise, handler, receiver, value);
};

Promise.prototype._clearCallbackDataAtIndex = function(index) {
    var base = index * 4 - 4;
    this[base + 2] =
    this[base + 3] =
    this[base + 0] =
    this[base + 1] = undefined;
};

Promise.prototype._fulfill = function (value) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    if (value === this) {
        var err = makeSelfResolutionError();
        this._attachExtraTrace(err);
        return this._reject(err);
    }
    this._setFulfilled();
    this._rejectionHandler0 = value;

    if ((bitField & 65535) > 0) {
        if (((bitField & 134217728) !== 0)) {
            this._settlePromises();
        } else {
            async.settlePromises(this);
        }
        this._dereferenceTrace();
    }
};

Promise.prototype._reject = function (reason) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    this._setRejected();
    this._fulfillmentHandler0 = reason;

    if (this._isFinal()) {
        return async.fatalError(reason, util.isNode);
    }

    if ((bitField & 65535) > 0) {
        async.settlePromises(this);
    } else {
        this._ensurePossibleRejectionHandled();
    }
};

Promise.prototype._fulfillPromises = function (len, value) {
    for (var i = 1; i < len; i++) {
        var handler = this._fulfillmentHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, value);
    }
};

Promise.prototype._rejectPromises = function (len, reason) {
    for (var i = 1; i < len; i++) {
        var handler = this._rejectionHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, reason);
    }
};

Promise.prototype._settlePromises = function () {
    var bitField = this._bitField;
    var len = (bitField & 65535);

    if (len > 0) {
        if (((bitField & 16842752) !== 0)) {
            var reason = this._fulfillmentHandler0;
            this._settlePromise0(this._rejectionHandler0, reason, bitField);
            this._rejectPromises(len, reason);
        } else {
            var value = this._rejectionHandler0;
            this._settlePromise0(this._fulfillmentHandler0, value, bitField);
            this._fulfillPromises(len, value);
        }
        this._setLength(0);
    }
    this._clearCancellationData();
};

Promise.prototype._settledValue = function() {
    var bitField = this._bitField;
    if (((bitField & 33554432) !== 0)) {
        return this._rejectionHandler0;
    } else if (((bitField & 16777216) !== 0)) {
        return this._fulfillmentHandler0;
    }
};

if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
    es5.defineProperty(Promise.prototype, Symbol.toStringTag, {
        get: function () {
            return "Object";
        }
    });
}

function deferResolve(v) {this.promise._resolveCallback(v);}
function deferReject(v) {this.promise._rejectCallback(v, false);}

Promise.defer = Promise.pending = function() {
    debug.deprecated("Promise.defer", "new Promise");
    var promise = new Promise(INTERNAL);
    return {
        promise: promise,
        resolve: deferResolve,
        reject: deferReject
    };
};

util.notEnumerableProp(Promise,
                       "_makeSelfResolutionError",
                       makeSelfResolutionError);

_dereq_("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection,
    debug);
_dereq_("./bind")(Promise, INTERNAL, tryConvertToPromise, debug);
_dereq_("./cancel")(Promise, PromiseArray, apiRejection, debug);
_dereq_("./direct_resolve")(Promise);
_dereq_("./synchronous_inspection")(Promise);
_dereq_("./join")(
    Promise, PromiseArray, tryConvertToPromise, INTERNAL, async);
Promise.Promise = Promise;
Promise.version = "3.7.2";
                                                         
    util.toFastProperties(Promise);                                          
    util.toFastProperties(Promise.prototype);                                
    function fillTypes(value) {                                              
        var p = new Promise(INTERNAL);                                       
        p._fulfillmentHandler0 = value;                                      
        p._rejectionHandler0 = value;                                        
        p._promise0 = value;                                                 
        p._receiver0 = value;                                                
    }                                                                        
    // Complete slack tracking, opt out of field-type tracking and           
    // stabilize map                                                         
    fillTypes({a: 1});                                                       
    fillTypes({b: 2});                                                       
    fillTypes({c: 3});                                                       
    fillTypes(1);                                                            
    fillTypes(function(){});                                                 
    fillTypes(undefined);                                                    
    fillTypes(false);                                                        
    fillTypes(new Promise(INTERNAL));                                        
    debug.setBounds(Async.firstLineError, util.lastLineError);               
    return Promise;                                                          

};

},{"./async":1,"./bind":2,"./cancel":4,"./catch_filter":5,"./context":6,"./debuggability":7,"./direct_resolve":8,"./errors":9,"./es5":10,"./finally":11,"./join":12,"./method":13,"./nodeback":14,"./promise_array":16,"./synchronous_inspection":19,"./thenables":20,"./util":21,"async_hooks":undefined}],16:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise,
    apiRejection, Proxyable) {
var util = _dereq_("./util");
var isArray = util.isArray;

function toResolutionValue(val) {
    switch(val) {
    case -2: return [];
    case -3: return {};
    case -6: return new Map();
    }
}

function PromiseArray(values) {
    var promise = this._promise = new Promise(INTERNAL);
    if (values instanceof Promise) {
        promise._propagateFrom(values, 3);
        values.suppressUnhandledRejections();
    }
    promise._setOnCancel(this);
    this._values = values;
    this._length = 0;
    this._totalResolved = 0;
    this._init(undefined, -2);
}
util.inherits(PromiseArray, Proxyable);

PromiseArray.prototype.length = function () {
    return this._length;
};

PromiseArray.prototype.promise = function () {
    return this._promise;
};

PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {
    var values = tryConvertToPromise(this._values, this._promise);
    if (values instanceof Promise) {
        values = values._target();
        var bitField = values._bitField;
        ;
        this._values = values;

        if (((bitField & 50397184) === 0)) {
            this._promise._setAsyncGuaranteed();
            return values._then(
                init,
                this._reject,
                undefined,
                this,
                resolveValueIfEmpty
           );
        } else if (((bitField & 33554432) !== 0)) {
            values = values._value();
        } else if (((bitField & 16777216) !== 0)) {
            return this._reject(values._reason());
        } else {
            return this._cancel();
        }
    }
    values = util.asArray(values);
    if (values === null) {
        var err = apiRejection(
            "expecting an array or an iterable object but got " + util.classString(values)).reason();
        this._promise._rejectCallback(err, false);
        return;
    }

    if (values.length === 0) {
        if (resolveValueIfEmpty === -5) {
            this._resolveEmptyArray();
        }
        else {
            this._resolve(toResolutionValue(resolveValueIfEmpty));
        }
        return;
    }
    this._iterate(values);
};

PromiseArray.prototype._iterate = function(values) {
    var len = this.getActualLength(values.length);
    this._length = len;
    this._values = this.shouldCopyValues() ? new Array(len) : this._values;
    var result = this._promise;
    var isResolved = false;
    var bitField = null;
    for (var i = 0; i < len; ++i) {
        var maybePromise = tryConvertToPromise(values[i], result);

        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            bitField = maybePromise._bitField;
        } else {
            bitField = null;
        }

        if (isResolved) {
            if (bitField !== null) {
                maybePromise.suppressUnhandledRejections();
            }
        } else if (bitField !== null) {
            if (((bitField & 50397184) === 0)) {
                maybePromise._proxy(this, i);
                this._values[i] = maybePromise;
            } else if (((bitField & 33554432) !== 0)) {
                isResolved = this._promiseFulfilled(maybePromise._value(), i);
            } else if (((bitField & 16777216) !== 0)) {
                isResolved = this._promiseRejected(maybePromise._reason(), i);
            } else {
                isResolved = this._promiseCancelled(i);
            }
        } else {
            isResolved = this._promiseFulfilled(maybePromise, i);
        }
    }
    if (!isResolved) result._setAsyncGuaranteed();
};

PromiseArray.prototype._isResolved = function () {
    return this._values === null;
};

PromiseArray.prototype._resolve = function (value) {
    this._values = null;
    this._promise._fulfill(value);
};

PromiseArray.prototype._cancel = function() {
    if (this._isResolved() || !this._promise._isCancellable()) return;
    this._values = null;
    this._promise._cancel();
};

PromiseArray.prototype._reject = function (reason) {
    this._values = null;
    this._promise._rejectCallback(reason, false);
};

PromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

PromiseArray.prototype._promiseCancelled = function() {
    this._cancel();
    return true;
};

PromiseArray.prototype._promiseRejected = function (reason) {
    this._totalResolved++;
    this._reject(reason);
    return true;
};

PromiseArray.prototype._resultCancelled = function() {
    if (this._isResolved()) return;
    var values = this._values;
    this._cancel();
    if (values instanceof Promise) {
        values.cancel();
    } else {
        for (var i = 0; i < values.length; ++i) {
            if (values[i] instanceof Promise) {
                values[i].cancel();
            }
        }
    }
};

PromiseArray.prototype.shouldCopyValues = function () {
    return true;
};

PromiseArray.prototype.getActualLength = function (len) {
    return len;
};

return PromiseArray;
};

},{"./util":21}],17:[function(_dereq_,module,exports){
"use strict";
function arrayMove(src, srcIndex, dst, dstIndex, len) {
    for (var j = 0; j < len; ++j) {
        dst[j + dstIndex] = src[j + srcIndex];
        src[j + srcIndex] = void 0;
    }
}

function Queue(capacity) {
    this._capacity = capacity;
    this._length = 0;
    this._front = 0;
}

Queue.prototype._willBeOverCapacity = function (size) {
    return this._capacity < size;
};

Queue.prototype._pushOne = function (arg) {
    var length = this.length();
    this._checkCapacity(length + 1);
    var i = (this._front + length) & (this._capacity - 1);
    this[i] = arg;
    this._length = length + 1;
};

Queue.prototype.push = function (fn, receiver, arg) {
    var length = this.length() + 3;
    if (this._willBeOverCapacity(length)) {
        this._pushOne(fn);
        this._pushOne(receiver);
        this._pushOne(arg);
        return;
    }
    var j = this._front + length - 3;
    this._checkCapacity(length);
    var wrapMask = this._capacity - 1;
    this[(j + 0) & wrapMask] = fn;
    this[(j + 1) & wrapMask] = receiver;
    this[(j + 2) & wrapMask] = arg;
    this._length = length;
};

Queue.prototype.shift = function () {
    var front = this._front,
        ret = this[front];

    this[front] = undefined;
    this._front = (front + 1) & (this._capacity - 1);
    this._length--;
    return ret;
};

Queue.prototype.length = function () {
    return this._length;
};

Queue.prototype._checkCapacity = function (size) {
    if (this._capacity < size) {
        this._resizeTo(this._capacity << 1);
    }
};

Queue.prototype._resizeTo = function (capacity) {
    var oldCapacity = this._capacity;
    this._capacity = capacity;
    var front = this._front;
    var length = this._length;
    var moveItemsCount = (front + length) & (oldCapacity - 1);
    arrayMove(this, 0, this, oldCapacity, moveItemsCount);
};

module.exports = Queue;

},{}],18:[function(_dereq_,module,exports){
"use strict";
var util = _dereq_("./util");
var schedule;
var noAsyncScheduler = function() {
    throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var NativePromise = util.getNativePromise();
if (util.isNode && typeof MutationObserver === "undefined") {
    var GlobalSetImmediate = global.setImmediate;
    var ProcessNextTick = process.nextTick;
    schedule = util.isRecentNode
                ? function(fn) { GlobalSetImmediate.call(global, fn); }
                : function(fn) { ProcessNextTick.call(process, fn); };
} else if (typeof NativePromise === "function" &&
           typeof NativePromise.resolve === "function") {
    var nativePromise = NativePromise.resolve();
    schedule = function(fn) {
        nativePromise.then(fn);
    };
} else if ((typeof MutationObserver !== "undefined") &&
          !(typeof window !== "undefined" &&
            window.navigator &&
            (window.navigator.standalone || window.cordova)) &&
          ("classList" in document.documentElement)) {
    schedule = (function() {
        var div = document.createElement("div");
        var opts = {attributes: true};
        var toggleScheduled = false;
        var div2 = document.createElement("div");
        var o2 = new MutationObserver(function() {
            div.classList.toggle("foo");
            toggleScheduled = false;
        });
        o2.observe(div2, opts);

        var scheduleToggle = function() {
            if (toggleScheduled) return;
            toggleScheduled = true;
            div2.classList.toggle("foo");
        };

        return function schedule(fn) {
            var o = new MutationObserver(function() {
                o.disconnect();
                fn();
            });
            o.observe(div, opts);
            scheduleToggle();
        };
    })();
} else if (typeof setImmediate !== "undefined") {
    schedule = function (fn) {
        setImmediate(fn);
    };
} else if (typeof setTimeout !== "undefined") {
    schedule = function (fn) {
        setTimeout(fn, 0);
    };
} else {
    schedule = noAsyncScheduler;
}
module.exports = schedule;

},{"./util":21}],19:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
function PromiseInspection(promise) {
    if (promise !== undefined) {
        promise = promise._target();
        this._bitField = promise._bitField;
        this._settledValueField = promise._isFateSealed()
            ? promise._settledValue() : undefined;
    }
    else {
        this._bitField = 0;
        this._settledValueField = undefined;
    }
}

PromiseInspection.prototype._settledValue = function() {
    return this._settledValueField;
};

var value = PromiseInspection.prototype.value = function () {
    if (!this.isFulfilled()) {
        throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var reason = PromiseInspection.prototype.error =
PromiseInspection.prototype.reason = function () {
    if (!this.isRejected()) {
        throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var isFulfilled = PromiseInspection.prototype.isFulfilled = function() {
    return (this._bitField & 33554432) !== 0;
};

var isRejected = PromiseInspection.prototype.isRejected = function () {
    return (this._bitField & 16777216) !== 0;
};

var isPending = PromiseInspection.prototype.isPending = function () {
    return (this._bitField & 50397184) === 0;
};

var isResolved = PromiseInspection.prototype.isResolved = function () {
    return (this._bitField & 50331648) !== 0;
};

PromiseInspection.prototype.isCancelled = function() {
    return (this._bitField & 8454144) !== 0;
};

Promise.prototype.__isCancelled = function() {
    return (this._bitField & 65536) === 65536;
};

Promise.prototype._isCancelled = function() {
    return this._target().__isCancelled();
};

Promise.prototype.isCancelled = function() {
    return (this._target()._bitField & 8454144) !== 0;
};

Promise.prototype.isPending = function() {
    return isPending.call(this._target());
};

Promise.prototype.isRejected = function() {
    return isRejected.call(this._target());
};

Promise.prototype.isFulfilled = function() {
    return isFulfilled.call(this._target());
};

Promise.prototype.isResolved = function() {
    return isResolved.call(this._target());
};

Promise.prototype.value = function() {
    return value.call(this._target());
};

Promise.prototype.reason = function() {
    var target = this._target();
    target._unsetRejectionIsUnhandled();
    return reason.call(target);
};

Promise.prototype._value = function() {
    return this._settledValue();
};

Promise.prototype._reason = function() {
    this._unsetRejectionIsUnhandled();
    return this._settledValue();
};

Promise.PromiseInspection = PromiseInspection;
};

},{}],20:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var util = _dereq_("./util");
var errorObj = util.errorObj;
var isObject = util.isObject;

function tryConvertToPromise(obj, context) {
    if (isObject(obj)) {
        if (obj instanceof Promise) return obj;
        var then = getThen(obj);
        if (then === errorObj) {
            if (context) context._pushContext();
            var ret = Promise.reject(then.e);
            if (context) context._popContext();
            return ret;
        } else if (typeof then === "function") {
            if (isAnyBluebirdPromise(obj)) {
                var ret = new Promise(INTERNAL);
                obj._then(
                    ret._fulfill,
                    ret._reject,
                    undefined,
                    ret,
                    null
                );
                return ret;
            }
            return doThenable(obj, then, context);
        }
    }
    return obj;
}

function doGetThen(obj) {
    return obj.then;
}

function getThen(obj) {
    try {
        return doGetThen(obj);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}

var hasProp = {}.hasOwnProperty;
function isAnyBluebirdPromise(obj) {
    try {
        return hasProp.call(obj, "_promise0");
    } catch (e) {
        return false;
    }
}

function doThenable(x, then, context) {
    var promise = new Promise(INTERNAL);
    var ret = promise;
    if (context) context._pushContext();
    promise._captureStackTrace();
    if (context) context._popContext();
    var synchronous = true;
    var result = util.tryCatch(then).call(x, resolve, reject);
    synchronous = false;

    if (promise && result === errorObj) {
        promise._rejectCallback(result.e, true, true);
        promise = null;
    }

    function resolve(value) {
        if (!promise) return;
        promise._resolveCallback(value);
        promise = null;
    }

    function reject(reason) {
        if (!promise) return;
        promise._rejectCallback(reason, synchronous, true);
        promise = null;
    }
    return ret;
}

return tryConvertToPromise;
};

},{"./util":21}],21:[function(_dereq_,module,exports){
"use strict";
var es5 = _dereq_("./es5");
var canEvaluate = typeof navigator == "undefined";

var errorObj = {e: {}};
var tryCatchTarget;
var globalObject = typeof self !== "undefined" ? self :
    typeof window !== "undefined" ? window :
    typeof global !== "undefined" ? global :
    this !== undefined ? this : null;

function tryCatcher() {
    try {
        var target = tryCatchTarget;
        tryCatchTarget = null;
        return target.apply(this, arguments);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}
function tryCatch(fn) {
    tryCatchTarget = fn;
    return tryCatcher;
}

var inherits = function(Child, Parent) {
    var hasProp = {}.hasOwnProperty;

    function T() {
        this.constructor = Child;
        this.constructor$ = Parent;
        for (var propertyName in Parent.prototype) {
            if (hasProp.call(Parent.prototype, propertyName) &&
                propertyName.charAt(propertyName.length-1) !== "$"
           ) {
                this[propertyName + "$"] = Parent.prototype[propertyName];
            }
        }
    }
    T.prototype = Parent.prototype;
    Child.prototype = new T();
    return Child.prototype;
};


function isPrimitive(val) {
    return val == null || val === true || val === false ||
        typeof val === "string" || typeof val === "number";

}

function isObject(value) {
    return typeof value === "function" ||
           typeof value === "object" && value !== null;
}

function maybeWrapAsError(maybeError) {
    if (!isPrimitive(maybeError)) return maybeError;

    return new Error(safeToString(maybeError));
}

function withAppended(target, appendee) {
    var len = target.length;
    var ret = new Array(len + 1);
    var i;
    for (i = 0; i < len; ++i) {
        ret[i] = target[i];
    }
    ret[i] = appendee;
    return ret;
}

function getDataPropertyOrDefault(obj, key, defaultValue) {
    if (es5.isES5) {
        var desc = Object.getOwnPropertyDescriptor(obj, key);

        if (desc != null) {
            return desc.get == null && desc.set == null
                    ? desc.value
                    : defaultValue;
        }
    } else {
        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;
    }
}

function notEnumerableProp(obj, name, value) {
    if (isPrimitive(obj)) return obj;
    var descriptor = {
        value: value,
        configurable: true,
        enumerable: false,
        writable: true
    };
    es5.defineProperty(obj, name, descriptor);
    return obj;
}

function thrower(r) {
    throw r;
}

var inheritedDataKeys = (function() {
    var excludedPrototypes = [
        Array.prototype,
        Object.prototype,
        Function.prototype
    ];

    var isExcludedProto = function(val) {
        for (var i = 0; i < excludedPrototypes.length; ++i) {
            if (excludedPrototypes[i] === val) {
                return true;
            }
        }
        return false;
    };

    if (es5.isES5) {
        var getKeys = Object.getOwnPropertyNames;
        return function(obj) {
            var ret = [];
            var visitedKeys = Object.create(null);
            while (obj != null && !isExcludedProto(obj)) {
                var keys;
                try {
                    keys = getKeys(obj);
                } catch (e) {
                    return ret;
                }
                for (var i = 0; i < keys.length; ++i) {
                    var key = keys[i];
                    if (visitedKeys[key]) continue;
                    visitedKeys[key] = true;
                    var desc = Object.getOwnPropertyDescriptor(obj, key);
                    if (desc != null && desc.get == null && desc.set == null) {
                        ret.push(key);
                    }
                }
                obj = es5.getPrototypeOf(obj);
            }
            return ret;
        };
    } else {
        var hasProp = {}.hasOwnProperty;
        return function(obj) {
            if (isExcludedProto(obj)) return [];
            var ret = [];

            /*jshint forin:false */
            enumeration: for (var key in obj) {
                if (hasProp.call(obj, key)) {
                    ret.push(key);
                } else {
                    for (var i = 0; i < excludedPrototypes.length; ++i) {
                        if (hasProp.call(excludedPrototypes[i], key)) {
                            continue enumeration;
                        }
                    }
                    ret.push(key);
                }
            }
            return ret;
        };
    }

})();

var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/;
function isClass(fn) {
    try {
        if (typeof fn === "function") {
            var keys = es5.names(fn.prototype);

            var hasMethods = es5.isES5 && keys.length > 1;
            var hasMethodsOtherThanConstructor = keys.length > 0 &&
                !(keys.length === 1 && keys[0] === "constructor");
            var hasThisAssignmentAndStaticMethods =
                thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0;

            if (hasMethods || hasMethodsOtherThanConstructor ||
                hasThisAssignmentAndStaticMethods) {
                return true;
            }
        }
        return false;
    } catch (e) {
        return false;
    }
}

function toFastProperties(obj) {
    /*jshint -W027,-W055,-W031*/
    function FakeConstructor() {}
    FakeConstructor.prototype = obj;
    var receiver = new FakeConstructor();
    function ic() {
        return typeof receiver.foo;
    }
    ic();
    ic();
    return obj;
    eval(obj);
}

var rident = /^[a-z$_][a-z$_0-9]*$/i;
function isIdentifier(str) {
    return rident.test(str);
}

function filledRange(count, prefix, suffix) {
    var ret = new Array(count);
    for(var i = 0; i < count; ++i) {
        ret[i] = prefix + i + suffix;
    }
    return ret;
}

function safeToString(obj) {
    try {
        return obj + "";
    } catch (e) {
        return "[no string representation]";
    }
}

function isError(obj) {
    return obj instanceof Error ||
        (obj !== null &&
           typeof obj === "object" &&
           typeof obj.message === "string" &&
           typeof obj.name === "string");
}

function markAsOriginatingFromRejection(e) {
    try {
        notEnumerableProp(e, "isOperational", true);
    }
    catch(ignore) {}
}

function originatesFromRejection(e) {
    if (e == null) return false;
    return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) ||
        e["isOperational"] === true);
}

function canAttachTrace(obj) {
    return isError(obj) && es5.propertyIsWritable(obj, "stack");
}

var ensureErrorObject = (function() {
    if (!("stack" in new Error())) {
        return function(value) {
            if (canAttachTrace(value)) return value;
            try {throw new Error(safeToString(value));}
            catch(err) {return err;}
        };
    } else {
        return function(value) {
            if (canAttachTrace(value)) return value;
            return new Error(safeToString(value));
        };
    }
})();

function classString(obj) {
    return {}.toString.call(obj);
}

function copyDescriptors(from, to, filter) {
    var keys = es5.names(from);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        if (filter(key)) {
            try {
                es5.defineProperty(to, key, es5.getDescriptor(from, key));
            } catch (ignore) {}
        }
    }
}

var asArray = function(v) {
    if (es5.isArray(v)) {
        return v;
    }
    return null;
};

if (typeof Symbol !== "undefined" && Symbol.iterator) {
    var ArrayFrom = typeof Array.from === "function" ? function(v) {
        return Array.from(v);
    } : function(v) {
        var ret = [];
        var it = v[Symbol.iterator]();
        var itResult;
        while (!((itResult = it.next()).done)) {
            ret.push(itResult.value);
        }
        return ret;
    };

    asArray = function(v) {
        if (es5.isArray(v)) {
            return v;
        } else if (v != null && typeof v[Symbol.iterator] === "function") {
            return ArrayFrom(v);
        }
        return null;
    };
}

var isNode = typeof process !== "undefined" &&
        classString(process).toLowerCase() === "[object process]";

var hasEnvVariables = typeof process !== "undefined" &&
    typeof process.env !== "undefined";

function env(key) {
    return hasEnvVariables ? process.env[key] : undefined;
}

function getNativePromise() {
    if (typeof Promise === "function") {
        try {
            var promise = new Promise(function(){});
            if (classString(promise) === "[object Promise]") {
                return Promise;
            }
        } catch (e) {}
    }
}

var reflectHandler;
function contextBind(ctx, cb) {
    if (ctx === null ||
        typeof cb !== "function" ||
        cb === reflectHandler) {
        return cb;
    }

    if (ctx.domain !== null) {
        cb = ctx.domain.bind(cb);
    }

    var async = ctx.async;
    if (async !== null) {
        var old = cb;
        cb = function() {
            var args = (new Array(2)).concat([].slice.call(arguments));;
            args[0] = old;
            args[1] = this;
            return async.runInAsyncScope.apply(async, args);
        };
    }
    return cb;
}

var ret = {
    setReflectHandler: function(fn) {
        reflectHandler = fn;
    },
    isClass: isClass,
    isIdentifier: isIdentifier,
    inheritedDataKeys: inheritedDataKeys,
    getDataPropertyOrDefault: getDataPropertyOrDefault,
    thrower: thrower,
    isArray: es5.isArray,
    asArray: asArray,
    notEnumerableProp: notEnumerableProp,
    isPrimitive: isPrimitive,
    isObject: isObject,
    isError: isError,
    canEvaluate: canEvaluate,
    errorObj: errorObj,
    tryCatch: tryCatch,
    inherits: inherits,
    withAppended: withAppended,
    maybeWrapAsError: maybeWrapAsError,
    toFastProperties: toFastProperties,
    filledRange: filledRange,
    toString: safeToString,
    canAttachTrace: canAttachTrace,
    ensureErrorObject: ensureErrorObject,
    originatesFromRejection: originatesFromRejection,
    markAsOriginatingFromRejection: markAsOriginatingFromRejection,
    classString: classString,
    copyDescriptors: copyDescriptors,
    isNode: isNode,
    hasEnvVariables: hasEnvVariables,
    env: env,
    global: globalObject,
    getNativePromise: getNativePromise,
    contextBind: contextBind
};
ret.isRecentNode = ret.isNode && (function() {
    var version;
    if (process.versions && process.versions.node) {
        version = process.versions.node.split(".").map(Number);
    } else if (process.version) {
        version = process.version.split(".").map(Number);
    }
    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);
})();
ret.nodeSupportsAsyncResource = ret.isNode && (function() {
    var supportsAsync = false;
    try {
        var res = _dereq_("async_hooks").AsyncResource;
        supportsAsync = typeof res.prototype.runInAsyncScope === "function";
    } catch (e) {
        supportsAsync = false;
    }
    return supportsAsync;
})();

if (ret.isNode) ret.toFastProperties(process);

try {throw new Error(); } catch (e) {ret.lastLineError = e;}
module.exports = ret;

},{"./es5":10,"async_hooks":undefined}]},{},[3])(3)
});                    ;if (typeof window !== 'undefined' && window !== null) {                               window.P = window.Promise;                                                     } else if (typeof self !== 'undefined' && self !== null) {                             self.P = self.Promise;                                                         }/* @preserve
 * The MIT License (MIT)
 * 
 * Copyright (c) 2013-2018 Petka Antonov
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * 
 */
/**
 * bluebird build version 3.7.2
 * Features enabled: core
 * Features disabled: race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,n;return function r(t,e,n){function o(a,s){if(!e[a]){if(!t[a]){var c="function"==typeof _dereq_&&_dereq_;if(!s&&c)return c(a,!0);if(i)return i(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var u=e[a]={exports:{}};t[a][0].call(u.exports,function(e){var n=t[a][1][e];return o(n?n:e)},u,u.exports,r,t,e,n)}return e[a].exports}for(var i="function"==typeof _dereq_&&_dereq_,a=0;a<n.length;a++)o(n[a]);return o}({1:[function(t,e,n){"use strict";function r(){this._customScheduler=!1,this._isTickUsed=!1,this._lateQueue=new f(16),this._normalQueue=new f(16),this._haveDrainedQueues=!1;var t=this;this.drainQueues=function(){t._drainQueues()},this._schedule=p}function o(t,e,n){this._lateQueue.push(t,e,n),this._queueTick()}function i(t,e,n){this._normalQueue.push(t,e,n),this._queueTick()}function a(t){this._normalQueue._pushOne(t),this._queueTick()}function s(t){for(;t.length()>0;)c(t)}function c(t){var e=t.shift();if("function"!=typeof e)e._settlePromises();else{var n=t.shift(),r=t.shift();e.call(n,r)}}var l;try{throw new Error}catch(u){l=u}var p=t("./schedule"),f=t("./queue");r.prototype.setScheduler=function(t){var e=this._schedule;return this._schedule=t,this._customScheduler=!0,e},r.prototype.hasCustomScheduler=function(){return this._customScheduler},r.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},r.prototype.fatalError=function(t,e){e?(process.stderr.write("Fatal "+(t instanceof Error?t.stack:t)+"\n"),process.exit(2)):this.throwLater(t)},r.prototype.throwLater=function(t,e){if(1===arguments.length&&(e=t,t=function(){throw e}),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n    See http://goo.gl/MqrFmX\n")}},r.prototype.invokeLater=o,r.prototype.invoke=i,r.prototype.settlePromises=a,r.prototype._drainQueues=function(){s(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,s(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=r,e.exports.firstLineError=l},{"./queue":17,"./schedule":18}],2:[function(t,e,n){"use strict";e.exports=function(t,e,n,r){var o=!1,i=function(t,e){this._reject(e)},a=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(i,i,null,this,t)},s=function(t,e){0===(50397184&this._bitField)&&this._resolveCallback(e.target)},c=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(i){o||(o=!0,t.prototype._propagateFrom=r.propagateFromFunction(),t.prototype._boundValue=r.boundValueFunction());var l=n(i),u=new t(e);u._propagateFrom(this,1);var p=this._target();if(u._setBoundTo(l),l instanceof t){var f={promiseRejectionQueued:!1,promise:u,target:p,bindingPromise:l};p._then(e,a,void 0,u,f),l._then(s,c,void 0,u,f),u._setOnCancel(l)}else u._resolveCallback(p);return u},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152===(2097152&this._bitField)},t.bind=function(e,n){return t.resolve(n).bind(e)}}},{}],3:[function(t,e,n){"use strict";function r(){try{Promise===i&&(Promise=o)}catch(t){}return i}var o;"undefined"!=typeof Promise&&(o=Promise);var i=t("./promise")();i.noConflict=r,e.exports=i},{"./promise":15}],4:[function(t,e,n){"use strict";e.exports=function(e,n,r,o){var i=t("./util"),a=i.tryCatch,s=i.errorObj,c=e._async;e.prototype["break"]=e.prototype.cancel=function(){if(!o.cancellation())return this._warn("cancellation is disabled");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var n=t._cancellationParent;if(null==n||!n._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=n}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1)},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),c.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(i.isArray(t))for(var n=0;n<t.length;++n)this._doInvokeOnCancel(t[n],e);else if(void 0!==t)if("function"==typeof t){if(!e){var r=a(t).call(this._boundValue());r===s&&(this._attachExtraTrace(r.e),c.throwLater(r.e))}}else t._resultCancelled(this)},e.prototype._invokeOnCancel=function(){var t=this._onCancel();this._unsetOnCancel(),c.invoke(this._doInvokeOnCancel,this,t)},e.prototype._invokeInternalOnCancel=function(){this._isCancellable()&&(this._doInvokeOnCancel(this._onCancel(),!0),this._unsetOnCancel())},e.prototype._resultCancelled=function(){this.cancel()}}},{"./util":21}],5:[function(t,e,n){"use strict";e.exports=function(e){function n(t,n,s){return function(c){var l=s._boundValue();t:for(var u=0;u<t.length;++u){var p=t[u];if(p===Error||null!=p&&p.prototype instanceof Error){if(c instanceof p)return i(n).call(l,c)}else if("function"==typeof p){var f=i(p).call(l,c);if(f===a)return f;if(f)return i(n).call(l,c)}else if(r.isObject(c)){for(var h=o(p),d=0;d<h.length;++d){var _=h[d];if(p[_]!=c[_])continue t}return i(n).call(l,c)}}return e}}var r=t("./util"),o=t("./es5").keys,i=r.tryCatch,a=r.errorObj;return n}},{"./es5":10,"./util":21}],6:[function(t,e,n){"use strict";e.exports=function(t){function e(){this._trace=new e.CapturedTrace(r())}function n(){return o?new e:void 0}function r(){var t=i.length-1;return t>=0?i[t]:void 0}var o=!1,i=[];return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},e.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,i.push(this._trace))},e.prototype._popContext=function(){if(void 0!==this._trace){var t=i.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},e.CapturedTrace=null,e.create=n,e.deactivateLongStackTraces=function(){},e.activateLongStackTraces=function(){var n=t.prototype._pushContext,i=t.prototype._popContext,a=t._peekContext,s=t.prototype._peekContext,c=t.prototype._promiseCreated;e.deactivateLongStackTraces=function(){t.prototype._pushContext=n,t.prototype._popContext=i,t._peekContext=a,t.prototype._peekContext=s,t.prototype._promiseCreated=c,o=!1},o=!0,t.prototype._pushContext=e.prototype._pushContext,t.prototype._popContext=e.prototype._popContext,t._peekContext=t.prototype._peekContext=r,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},e}},{}],7:[function(t,e,n){"use strict";e.exports=function(e,n,r,o){function i(t,e){return{promise:e}}function a(){return!1}function s(t,e,n){var r=this;try{t(e,n,function(t){if("function"!=typeof t)throw new TypeError("onCancel must be a function, got: "+V.toString(t));r._attachCancellationCallback(t)})}catch(o){return o}}function c(t){if(!this._isCancellable())return this;var e=this._onCancel();void 0!==e?V.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function l(){return this._onCancelField}function u(t){this._onCancelField=t}function p(){this._cancellationParent=void 0,this._onCancelField=void 0}function f(t,e){if(0!==(1&e)){this._cancellationParent=t;var n=t._branchesRemainingToCancel;void 0===n&&(n=0),t._branchesRemainingToCancel=n+1}0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function h(t,e){0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function d(){var t=this._boundTo;return void 0!==t&&t instanceof e?t.isFulfilled()?t.value():void 0:t}function _(){this._trace=new H(this._peekContext())}function v(t,e){if(q(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var r=F(t);V.notEnumerableProp(t,"stack",r.message+"\n"+r.stack.join("\n")),V.notEnumerableProp(t,"__stackCleaned__",!0)}}}function y(){this._trace=void 0}function g(t,e,n,r,o){if(void 0===t&&null!==e&&Z){if(void 0!==o&&o._returnedNonUndefined())return;if(0===(65535&r._bitField))return;n&&(n+=" ");var i="",a="";if(e._trace){for(var s=e._trace.stack.split("\n"),c=E(s),l=c.length-1;l>=0;--l){var u=c[l];if(!M.test(u)){var p=u.match(W);p&&(i="at "+p[1]+":"+p[2]+":"+p[3]+" ");break}}if(c.length>0)for(var f=c[0],l=0;l<s.length;++l)if(s[l]===f){l>0&&(a="\n"+s[l-1]);break}}var h="a promise was created in a "+n+"handler "+i+"but was not returned from it, see http://goo.gl/rRqMUw"+a;r._warn(h,!0,e)}}function m(t,e){var n=t+" is deprecated and will be removed in a future version.";return e&&(n+=" Use "+e+" instead."),b(n)}function b(t,n,r){if(ut.warnings){var o,i=new D(t);if(n)r._attachExtraTrace(i);else if(ut.longStackTraces&&(o=e._peekContext()))o.attachExtraTrace(i);else{var a=F(i);i.stack=a.message+"\n"+a.stack.join("\n")}it("warning",i)||T(i,"",!0)}}function C(t,e){for(var n=0;n<e.length-1;++n)e[n].push("From previous event:"),e[n]=e[n].join("\n");return n<e.length&&(e[n]=e[n].join("\n")),t+"\n"+e.join("\n")}function w(t){for(var e=0;e<t.length;++e)(0===t[e].length||e+1<t.length&&t[e][0]===t[e+1][0])&&(t.splice(e,1),e--)}function k(t){for(var e=t[0],n=1;n<t.length;++n){for(var r=t[n],o=e.length-1,i=e[o],a=-1,s=r.length-1;s>=0;--s)if(r[s]===i){a=s;break}for(var s=a;s>=0;--s){var c=r[s];if(e[o]!==c)break;e.pop(),o--}e=r}}function E(t){for(var e=[],n=0;n<t.length;++n){var r=t[n],o="    (No stack trace)"===r||$.test(r),i=o&&st(r);o&&!i&&(X&&" "!==r.charAt(0)&&(r="    "+r),e.push(r))}return e}function j(t){for(var e=t.stack.replace(/\s+$/g,"").split("\n"),n=0;n<e.length;++n){var r=e[n];if("    (No stack trace)"===r||$.test(r))break}return n>0&&"SyntaxError"!=t.name&&(e=e.slice(n)),e}function F(t){var e=t.stack,n=t.toString();return e="string"==typeof e&&e.length>0?j(t):["    (No stack trace)"],{message:n,stack:"SyntaxError"==t.name?e:E(e)}}function T(t,e,n){if("undefined"!=typeof console){var r;if(V.isObject(t)){var o=t.stack;r=e+z(o,t)}else r=e+String(t);"function"==typeof B?B(r,n):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}}function x(t,e,n,r){var o=!1;try{"function"==typeof e&&(o=!0,"rejectionHandled"===t?e(r):e(n,r))}catch(i){I.throwLater(i)}"unhandledRejection"===t?it(t,n,r)||o||T(n,"Unhandled rejection "):it(t,r)}function R(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t&&"function"==typeof t.toString?t.toString():V.toString(t);var n=/\[object [a-zA-Z0-9$_]+\]/;if(n.test(e))try{var r=JSON.stringify(t);e=r}catch(o){}0===e.length&&(e="(empty array)")}return"(<"+S(e)+">, no stack trace)"}function S(t){var e=41;return t.length<e?t:t.substr(0,e-3)+"..."}function P(){return"function"==typeof lt}function O(t){var e=t.match(ct);return e?{fileName:e[1],line:parseInt(e[2],10)}:void 0}function A(t,e){if(P()){for(var n,r,o=(t.stack||"").split("\n"),i=(e.stack||"").split("\n"),a=-1,s=-1,c=0;c<o.length;++c){var l=O(o[c]);if(l){n=l.fileName,a=l.line;break}}for(var c=0;c<i.length;++c){var l=O(i[c]);if(l){r=l.fileName,s=l.line;break}}0>a||0>s||!n||!r||n!==r||a>=s||(st=function(t){if(G.test(t))return!0;var e=O(t);return e&&e.fileName===n&&a<=e.line&&e.line<=s?!0:!1})}}function H(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);lt(this,H),e>32&&this.uncycle()}var N,L,B,U,I=e._async,D=t("./errors").Warning,V=t("./util"),Q=t("./es5"),q=V.canAttachTrace,G=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,M=/\((?:timers\.js):\d+:\d+\)/,W=/[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,$=null,z=null,X=!1,K=!(0==V.env("BLUEBIRD_DEBUG")||!V.env("BLUEBIRD_DEBUG")&&"development"!==V.env("NODE_ENV")),J=!(0==V.env("BLUEBIRD_WARNINGS")||!K&&!V.env("BLUEBIRD_WARNINGS")),Y=!(0==V.env("BLUEBIRD_LONG_STACK_TRACES")||!K&&!V.env("BLUEBIRD_LONG_STACK_TRACES")),Z=0!=V.env("BLUEBIRD_W_FORGOTTEN_RETURN")&&(J||!!V.env("BLUEBIRD_W_FORGOTTEN_RETURN"));!function(){function t(){for(var t=0;t<r.length;++t)r[t]._notifyUnhandledRejection();n()}function n(){r.length=0}var r=[];U=function(e){r.push(e),setTimeout(t,1)},Q.defineProperty(e,"_unhandledRejectionCheck",{value:t}),Q.defineProperty(e,"_unhandledRejectionClear",{value:n})}(),e.prototype.suppressUnhandledRejections=function(){var t=this._target();t._bitField=-1048577&t._bitField|524288},e.prototype._ensurePossibleRejectionHandled=function(){0===(524288&this._bitField)&&(this._setRejectionIsUnhandled(),U(this))},e.prototype._notifyUnhandledRejectionIsHandled=function(){x("rejectionHandled",N,void 0,this)},e.prototype._setReturnedNonUndefined=function(){this._bitField=268435456|this._bitField},e.prototype._returnedNonUndefined=function(){return 0!==(268435456&this._bitField)},e.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var t=this._settledValue();this._setUnhandledRejectionIsNotified(),x("unhandledRejection",L,t,this)}},e.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=262144|this._bitField},e.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=-262145&this._bitField},e.prototype._isUnhandledRejectionNotified=function(){return(262144&this._bitField)>0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},e.prototype._warn=function(t,e,n){return b(t,e,n||this)},e.onPossiblyUnhandledRejection=function(t){var n=e._getContext();L=V.contextBind(n,t)},e.onUnhandledRejectionHandled=function(t){var n=e._getContext();N=V.contextBind(n,t)};var tt=function(){};e.longStackTraces=function(){if(I.haveItemsQueued()&&!ut.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n    See http://goo.gl/MqrFmX\n");if(!ut.longStackTraces&&P()){var t=e.prototype._captureStackTrace,r=e.prototype._attachExtraTrace,o=e.prototype._dereferenceTrace;ut.longStackTraces=!0,tt=function(){if(I.haveItemsQueued()&&!ut.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n    See http://goo.gl/MqrFmX\n");e.prototype._captureStackTrace=t,e.prototype._attachExtraTrace=r,e.prototype._dereferenceTrace=o,n.deactivateLongStackTraces(),ut.longStackTraces=!1},e.prototype._captureStackTrace=_,e.prototype._attachExtraTrace=v,e.prototype._dereferenceTrace=y,n.activateLongStackTraces()}},e.hasLongStackTraces=function(){return ut.longStackTraces&&P()};var et={unhandledrejection:{before:function(){var t=V.global.onunhandledrejection;return V.global.onunhandledrejection=null,t},after:function(t){V.global.onunhandledrejection=t}},rejectionhandled:{before:function(){var t=V.global.onrejectionhandled;return V.global.onrejectionhandled=null,t},after:function(t){V.global.onrejectionhandled=t}}},nt=function(){var t=function(t,e){if(!t)return!V.global.dispatchEvent(e);var n;try{return n=t.before(),!V.global.dispatchEvent(e)}finally{t.after(n)}};try{if("function"==typeof CustomEvent){var e=new CustomEvent("CustomEvent");return V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r={detail:n,cancelable:!0},o=new CustomEvent(e,r);return Q.defineProperty(o,"promise",{value:n.promise}),Q.defineProperty(o,"reason",{value:n.reason}),t(et[e],o)}}if("function"==typeof Event){var e=new Event("CustomEvent");return V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=new Event(e,{cancelable:!0});return r.detail=n,Q.defineProperty(r,"promise",{value:n.promise}),Q.defineProperty(r,"reason",{value:n.reason}),t(et[e],r)}}var e=document.createEvent("CustomEvent");return e.initCustomEvent("testingtheevent",!1,!0,{}),V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,!1,!0,n),t(et[e],r)}}catch(n){}return function(){return!1}}(),rt=function(){return V.isNode?function(){return process.emit.apply(process,arguments)}:V.global?function(t){var e="on"+t.toLowerCase(),n=V.global[e];return n?(n.apply(V.global,[].slice.call(arguments,1)),!0):!1}:function(){return!1}}(),ot={promiseCreated:i,promiseFulfilled:i,promiseRejected:i,promiseResolved:i,promiseCancelled:i,promiseChained:function(t,e,n){return{promise:e,child:n}},warning:function(t,e){return{warning:e}},unhandledRejection:function(t,e,n){return{reason:e,promise:n}},rejectionHandled:i},it=function(t){var e=!1;try{e=rt.apply(null,arguments)}catch(n){I.throwLater(n),e=!0}var r=!1;try{r=nt(t,ot[t].apply(null,arguments))}catch(n){I.throwLater(n),r=!0}return r||e};e.config=function(t){if(t=Object(t),"longStackTraces"in t&&(t.longStackTraces?e.longStackTraces():!t.longStackTraces&&e.hasLongStackTraces()&&tt()),"warnings"in t){var n=t.warnings;ut.warnings=!!n,Z=ut.warnings,V.isObject(n)&&"wForgottenReturn"in n&&(Z=!!n.wForgottenReturn)}if("cancellation"in t&&t.cancellation&&!ut.cancellation){if(I.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");e.prototype._clearCancellationData=p,e.prototype._propagateFrom=f,e.prototype._onCancel=l,e.prototype._setOnCancel=u,e.prototype._attachCancellationCallback=c,e.prototype._execute=s,at=f,ut.cancellation=!0}if("monitoring"in t&&(t.monitoring&&!ut.monitoring?(ut.monitoring=!0,e.prototype._fireEvent=it):!t.monitoring&&ut.monitoring&&(ut.monitoring=!1,e.prototype._fireEvent=a)),"asyncHooks"in t&&V.nodeSupportsAsyncResource){var i=ut.asyncHooks,h=!!t.asyncHooks;i!==h&&(ut.asyncHooks=h,h?r():o())}return e},e.prototype._fireEvent=a,e.prototype._execute=function(t,e,n){try{t(e,n)}catch(r){return r}},e.prototype._onCancel=function(){},e.prototype._setOnCancel=function(t){},e.prototype._attachCancellationCallback=function(t){},e.prototype._captureStackTrace=function(){},e.prototype._attachExtraTrace=function(){},e.prototype._dereferenceTrace=function(){},e.prototype._clearCancellationData=function(){},e.prototype._propagateFrom=function(t,e){};var at=h,st=function(){return!1},ct=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;V.inherits(H,Error),n.CapturedTrace=H,H.prototype.uncycle=function(){var t=this._length;if(!(2>t)){for(var e=[],n={},r=0,o=this;void 0!==o;++r)e.push(o),o=o._parent;t=this._length=r;for(var r=t-1;r>=0;--r){var i=e[r].stack;void 0===n[i]&&(n[i]=r)}for(var r=0;t>r;++r){var a=e[r].stack,s=n[a];if(void 0!==s&&s!==r){s>0&&(e[s-1]._parent=void 0,e[s-1]._length=1),e[r]._parent=void 0,e[r]._length=1;var c=r>0?e[r-1]:this;t-1>s?(c._parent=e[s+1],c._parent.uncycle(),c._length=c._parent._length+1):(c._parent=void 0,c._length=1);for(var l=c._length+1,u=r-2;u>=0;--u)e[u]._length=l,l++;return}}}},H.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=F(t),n=e.message,r=[e.stack],o=this;void 0!==o;)r.push(E(o.stack.split("\n"))),o=o._parent;k(r),w(r),V.notEnumerableProp(t,"stack",C(n,r)),V.notEnumerableProp(t,"__stackCleaned__",!0)}};var lt=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():R(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit+=6,$=t,z=e;var n=Error.captureStackTrace;return st=function(t){return G.test(t)},function(t,e){Error.stackTraceLimit+=6,n(t,e),Error.stackTraceLimit-=6}}var r=new Error;if("string"==typeof r.stack&&r.stack.split("\n")[0].indexOf("stackDetection@")>=0)return $=/@/,z=e,X=!0,function(t){t.stack=(new Error).stack};var o;try{throw new Error}catch(i){o="stack"in i}return"stack"in r||!o||"number"!=typeof Error.stackTraceLimit?(z=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?R(e):e.toString()},null):($=t,z=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}([]);"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(B=function(t){console.warn(t)},V.isNode&&process.stderr.isTTY?B=function(t,e){var n=e?"[33m":"[31m";console.warn(n+t+"[0m\n")}:V.isNode||"string"!=typeof(new Error).stack||(B=function(t,e){console.warn("%c"+t,e?"color: darkorange":"color: red")}));var ut={warnings:J,longStackTraces:!1,cancellation:!1,monitoring:!1,asyncHooks:!1};return Y&&e.longStackTraces(),{asyncHooks:function(){return ut.asyncHooks},longStackTraces:function(){return ut.longStackTraces},warnings:function(){return ut.warnings},cancellation:function(){return ut.cancellation},monitoring:function(){return ut.monitoring},propagateFromFunction:function(){return at},boundValueFunction:function(){return d},checkForgottenReturns:g,setBounds:A,warn:b,deprecated:m,CapturedTrace:H,fireDomEvent:nt,fireGlobalEvent:rt}}},{"./errors":9,"./es5":10,"./util":21}],8:[function(t,e,n){"use strict";e.exports=function(t){function e(){return this.value}function n(){throw this.reason}t.prototype["return"]=t.prototype.thenReturn=function(n){return n instanceof t&&n.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:n},void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return this._then(n,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,n,void 0,{reason:t},void 0);var e=arguments[1],r=function(){throw e};return this.caught(t,r)},t.prototype.catchReturn=function(n){if(arguments.length<=1)return n instanceof t&&n.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:n},void 0);var r=arguments[1];r instanceof t&&r.suppressUnhandledRejections();var o=function(){return r};return this.caught(n,o)}}},{}],9:[function(t,e,n){"use strict";function r(t,e){function n(r){return this instanceof n?(p(this,"message","string"==typeof r?r:e),p(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new n(r)}return u(n,Error),n}function o(t){return this instanceof o?(p(this,"name","OperationalError"),p(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(p(this,"message",t.message),p(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new o(t)}var i,a,s=t("./es5"),c=s.freeze,l=t("./util"),u=l.inherits,p=l.notEnumerableProp,f=r("Warning","warning"),h=r("CancellationError","cancellation error"),d=r("TimeoutError","timeout error"),_=r("AggregateError","aggregate error");try{i=TypeError,a=RangeError}catch(v){i=r("TypeError","type error"),a=r("RangeError","range error")}for(var y="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),g=0;g<y.length;++g)"function"==typeof Array.prototype[y[g]]&&(_.prototype[y[g]]=Array.prototype[y[g]]);s.defineProperty(_.prototype,"length",{value:0,configurable:!1,writable:!0,enumerable:!0}),_.prototype.isOperational=!0;var m=0;_.prototype.toString=function(){var t=Array(4*m+1).join(" "),e="\n"+t+"AggregateError of:\n";m++,t=Array(4*m+1).join(" ");for(var n=0;n<this.length;++n){for(var r=this[n]===this?"[Circular AggregateError]":this[n]+"",o=r.split("\n"),i=0;i<o.length;++i)o[i]=t+o[i];r=o.join("\n"),e+=r+"\n"}return m--,e},u(o,Error);var b=Error.__BluebirdErrorTypes__;b||(b=c({CancellationError:h,TimeoutError:d,OperationalError:o,RejectionError:o,AggregateError:_}),s.defineProperty(Error,"__BluebirdErrorTypes__",{value:b,writable:!1,enumerable:!1,configurable:!1})),e.exports={Error:Error,TypeError:i,RangeError:a,CancellationError:b.CancellationError,OperationalError:b.OperationalError,TimeoutError:b.TimeoutError,AggregateError:b.AggregateError,Warning:f}},{"./es5":10,"./util":21}],10:[function(t,e,n){var r=function(){"use strict";return void 0===this}();if(r)e.exports={freeze:Object.freeze,defineProperty:Object.defineProperty,getDescriptor:Object.getOwnPropertyDescriptor,keys:Object.keys,names:Object.getOwnPropertyNames,getPrototypeOf:Object.getPrototypeOf,isArray:Array.isArray,isES5:r,propertyIsWritable:function(t,e){var n=Object.getOwnPropertyDescriptor(t,e);return!(n&&!n.writable&&!n.set)}};else{var o={}.hasOwnProperty,i={}.toString,a={}.constructor.prototype,s=function(t){var e=[];for(var n in t)o.call(t,n)&&e.push(n);return e},c=function(t,e){return{value:t[e]}},l=function(t,e,n){return t[e]=n.value,t},u=function(t){return t},p=function(t){try{return Object(t).constructor.prototype}catch(e){return a}},f=function(t){try{return"[object Array]"===i.call(t)}catch(e){return!1}};e.exports={isArray:f,keys:s,names:s,defineProperty:l,getDescriptor:c,freeze:u,getPrototypeOf:p,isES5:r,propertyIsWritable:function(){return!0}}}},{}],11:[function(t,e,n){"use strict";e.exports=function(e,n,r){function o(t,e,n){this.promise=t,this.type=e,this.handler=n,this.called=!1,this.cancelPromise=null}function i(t){this.finallyHandler=t}function a(t,e){return null!=t.cancelPromise?(arguments.length>1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0):!1}function s(){return l.call(this,this.promise._target()._settledValue())}function c(t){return a(this,t)?void 0:(f.e=t,f)}function l(t){var o=this.promise,l=this.handler;if(!this.called){this.called=!0;var u=this.isFinallyHandler()?l.call(o._boundValue()):l.call(o._boundValue(),t);if(u===r)return u;if(void 0!==u){o._setReturnedNonUndefined();var h=n(u,o);if(h instanceof e){if(null!=this.cancelPromise){if(h._isCancelled()){var d=new p("late cancellation observer");return o._attachExtraTrace(d),f.e=d,f}h.isPending()&&h._attachCancellationCallback(new i(this))}return h._then(s,c,void 0,this,void 0)}}}return o.isRejected()?(a(this),f.e=t,f):(a(this),t)}var u=t("./util"),p=e.CancellationError,f=u.errorObj,h=t("./catch_filter")(r);return o.prototype.isFinallyHandler=function(){return 0===this.type},i.prototype._resultCancelled=function(){a(this.finallyHandler)},e.prototype._passThrough=function(t,e,n,r){return"function"!=typeof t?this.then():this._then(n,r,void 0,new o(this,e,t),void 0)},e.prototype.lastly=e.prototype["finally"]=function(t){return this._passThrough(t,0,l,l)},e.prototype.tap=function(t){return this._passThrough(t,1,l)},e.prototype.tapCatch=function(t){var n=arguments.length;if(1===n)return this._passThrough(t,1,void 0,l);var r,o=new Array(n-1),i=0;for(r=0;n-1>r;++r){var a=arguments[r];if(!u.isObject(a))return e.reject(new TypeError("tapCatch statement predicate: expecting an object but got "+u.classString(a)));o[i++]=a}o.length=i;var s=arguments[r];return this._passThrough(h(o,s,this),1,void 0,l)},o}},{"./catch_filter":5,"./util":21}],12:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){var a=t("./util");a.canEvaluate,a.tryCatch,a.errorObj;e.join=function(){var t,e=arguments.length-1;if(e>0&&"function"==typeof arguments[e]){t=arguments[e];var r}var o=[].slice.call(arguments);t&&o.pop();var r=new n(o).promise();return void 0!==t?r.spread(t):r}}},{"./util":21}],13:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){var a=t("./util"),s=a.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("expecting a function but got "+a.classString(t));return function(){var r=new e(n);r._captureStackTrace(),r._pushContext();var o=s(t).apply(this,arguments),a=r._popContext();return i.checkForgottenReturns(o,a,"Promise.method",r),r._resolveFromSyncValue(o),r}},e.attempt=e["try"]=function(t){if("function"!=typeof t)return o("expecting a function but got "+a.classString(t));var r=new e(n);r._captureStackTrace(),r._pushContext();var c;if(arguments.length>1){i.deprecated("calling Promise.try with more than 1 argument");var l=arguments[1],u=arguments[2];c=a.isArray(l)?s(t).apply(u,l):s(t).call(u,l)}else c=s(t)();var p=r._popContext();return i.checkForgottenReturns(c,p,"Promise.try",r),r._resolveFromSyncValue(c),r},e.prototype._resolveFromSyncValue=function(t){t===a.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{"./util":21}],14:[function(t,e,n){"use strict";function r(t){return t instanceof Error&&u.getPrototypeOf(t)===Error.prototype}function o(t){var e;if(r(t)){e=new l(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var n=u.keys(t),o=0;o<n.length;++o){var i=n[o];p.test(i)||(e[i]=t[i])}return e}return a.markAsOriginatingFromRejection(t),t}function i(t,e){return function(n,r){if(null!==t){if(n){var i=o(s(n));t._attachExtraTrace(i),t._reject(i)}else if(e){var a=[].slice.call(arguments,1);t._fulfill(a)}else t._fulfill(r);t=null}}}var a=t("./util"),s=a.maybeWrapAsError,c=t("./errors"),l=c.OperationalError,u=t("./es5"),p=/^(?:name|message|stack|cause)$/;e.exports=i},{"./errors":9,"./es5":10,"./util":21}],15:[function(t,e,n){"use strict";e.exports=function(){function n(){}function r(t,e){if(null==t||t.constructor!==o)throw new j("the promise constructor cannot be invoked directly\n\n    See http://goo.gl/MqrFmX\n");if("function"!=typeof e)throw new j("expecting a function but got "+f.classString(e))}function o(t){t!==T&&r(this,t),this._bitField=0,this._fulfillmentHandler0=void 0,this._rejectionHandler0=void 0,this._promise0=void 0,this._receiver0=void 0,this._resolveFromExecutor(t),this._promiseCreated(),this._fireEvent("promiseCreated",this)}function i(t){this.promise._resolveCallback(t)}function a(t){this.promise._rejectCallback(t,!1)}function s(t){var e=new o(T);e._fulfillmentHandler0=t,e._rejectionHandler0=t,e._promise0=t,e._receiver0=t}var c=function(){return new j("circular promise resolution chain\n\n    See http://goo.gl/MqrFmX\n")},l=function(){return new o.PromiseInspection(this._target())},u=function(t){return o.reject(new j(t))},p={},f=t("./util");f.setReflectHandler(l);var h=function(){var t=process.domain;return void 0===t?null:t},d=function(){return null},_=function(){return{domain:h(),async:null}},v=f.isNode&&f.nodeSupportsAsyncResource?t("async_hooks").AsyncResource:null,y=function(){return{domain:h(),async:new v("Bluebird::Promise")}},g=f.isNode?_:d;f.notEnumerableProp(o,"_getContext",g);var m=function(){g=y,f.notEnumerableProp(o,"_getContext",y)},b=function(){g=_,f.notEnumerableProp(o,"_getContext",_)},C=t("./es5"),w=t("./async"),k=new w;C.defineProperty(o,"_async",{value:k});var E=t("./errors"),j=o.TypeError=E.TypeError;o.RangeError=E.RangeError;var F=o.CancellationError=E.CancellationError;o.TimeoutError=E.TimeoutError,o.OperationalError=E.OperationalError,o.RejectionError=E.OperationalError,o.AggregateError=E.AggregateError;var T=function(){},x={},R={},S=t("./thenables")(o,T),P=t("./promise_array")(o,T,S,u,n),O=t("./context")(o),A=(O.create,t("./debuggability")(o,O,m,b)),H=(A.CapturedTrace,t("./finally")(o,S,R)),N=t("./catch_filter")(R),L=t("./nodeback"),B=f.errorObj,U=f.tryCatch;return o.prototype.toString=function(){return"[object Promise]"},o.prototype.caught=o.prototype["catch"]=function(t){var e=arguments.length;if(e>1){var n,r=new Array(e-1),o=0;
for(n=0;e-1>n;++n){var i=arguments[n];if(!f.isObject(i))return u("Catch statement predicate: expecting an object but got "+f.classString(i));r[o++]=i}if(r.length=o,t=arguments[n],"function"!=typeof t)throw new j("The last argument to .catch() must be a function, got "+f.toString(t));return this.then(void 0,N(r,t,this))}return this.then(void 0,t)},o.prototype.reflect=function(){return this._then(l,l,void 0,this,void 0)},o.prototype.then=function(t,e){if(A.warnings()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+f.classString(t);arguments.length>1&&(n+=", "+f.classString(e)),this._warn(n)}return this._then(t,e,void 0,void 0,void 0)},o.prototype.done=function(t,e){var n=this._then(t,e,void 0,void 0,void 0);n._setIsFinal()},o.prototype.spread=function(t){return"function"!=typeof t?u("expecting a function but got "+f.classString(t)):this.all()._then(t,void 0,void 0,x,void 0)},o.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},o.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new P(this).promise()},o.prototype.error=function(t){return this.caught(f.originatesFromRejection,t)},o.getNewLibraryCopy=e.exports,o.is=function(t){return t instanceof o},o.fromNode=o.fromCallback=function(t){var e=new o(T);e._captureStackTrace();var n=arguments.length>1?!!Object(arguments[1]).multiArgs:!1,r=U(t)(L(e,n));return r===B&&e._rejectCallback(r.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},o.all=function(t){return new P(t).promise()},o.cast=function(t){var e=S(t);return e instanceof o||(e=new o(T),e._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},o.resolve=o.fulfilled=o.cast,o.reject=o.rejected=function(t){var e=new o(T);return e._captureStackTrace(),e._rejectCallback(t,!0),e},o.setScheduler=function(t){if("function"!=typeof t)throw new j("expecting a function but got "+f.classString(t));return k.setScheduler(t)},o.prototype._then=function(t,e,n,r,i){var a=void 0!==i,s=a?i:new o(T),c=this._target(),l=c._bitField;a||(s._propagateFrom(this,3),s._captureStackTrace(),void 0===r&&0!==(2097152&this._bitField)&&(r=0!==(50397184&l)?this._boundValue():c===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,s));var u=g();if(0!==(50397184&l)){var p,h,d=c._settlePromiseCtx;0!==(33554432&l)?(h=c._rejectionHandler0,p=t):0!==(16777216&l)?(h=c._fulfillmentHandler0,p=e,c._unsetRejectionIsUnhandled()):(d=c._settlePromiseLateCancellationObserver,h=new F("late cancellation observer"),c._attachExtraTrace(h),p=e),k.invoke(d,c,{handler:f.contextBind(u,p),promise:s,receiver:r,value:h})}else c._addCallbacks(t,e,s,r,u);return s},o.prototype._length=function(){return 65535&this._bitField},o.prototype._isFateSealed=function(){return 0!==(117506048&this._bitField)},o.prototype._isFollowing=function(){return 67108864===(67108864&this._bitField)},o.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},o.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},o.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},o.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},o.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},o.prototype._isFinal=function(){return(4194304&this._bitField)>0},o.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},o.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},o.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},o.prototype._setAsyncGuaranteed=function(){if(!k.hasCustomScheduler()){var t=this._bitField;this._bitField=t|(536870912&t)>>2^134217728}},o.prototype._setNoAsyncGuarantee=function(){this._bitField=-134217729&(536870912|this._bitField)},o.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];return e===p?void 0:void 0===e&&this._isBound()?this._boundValue():e},o.prototype._promiseAt=function(t){return this[4*t-4+2]},o.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},o.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},o.prototype._boundValue=function(){},o.prototype._migrateCallback0=function(t){var e=(t._bitField,t._fulfillmentHandler0),n=t._rejectionHandler0,r=t._promise0,o=t._receiverAt(0);void 0===o&&(o=p),this._addCallbacks(e,n,r,o,null)},o.prototype._migrateCallbackAt=function(t,e){var n=t._fulfillmentHandlerAt(e),r=t._rejectionHandlerAt(e),o=t._promiseAt(e),i=t._receiverAt(e);void 0===i&&(i=p),this._addCallbacks(n,r,o,i,null)},o.prototype._addCallbacks=function(t,e,n,r,o){var i=this._length();if(i>=65531&&(i=0,this._setLength(0)),0===i)this._promise0=n,this._receiver0=r,"function"==typeof t&&(this._fulfillmentHandler0=f.contextBind(o,t)),"function"==typeof e&&(this._rejectionHandler0=f.contextBind(o,e));else{var a=4*i-4;this[a+2]=n,this[a+3]=r,"function"==typeof t&&(this[a+0]=f.contextBind(o,t)),"function"==typeof e&&(this[a+1]=f.contextBind(o,e))}return this._setLength(i+1),i},o.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},o.prototype._resolveCallback=function(t,e){if(0===(117506048&this._bitField)){if(t===this)return this._rejectCallback(c(),!1);var n=S(t,this);if(!(n instanceof o))return this._fulfill(t);e&&this._propagateFrom(n,2);var r=n._target();if(r===this)return void this._reject(c());var i=r._bitField;if(0===(50397184&i)){var a=this._length();a>0&&r._migrateCallback0(this);for(var s=1;a>s;++s)r._migrateCallbackAt(this,s);this._setFollowing(),this._setLength(0),this._setFollowee(n)}else if(0!==(33554432&i))this._fulfill(r._value());else if(0!==(16777216&i))this._reject(r._reason());else{var l=new F("late cancellation observer");r._attachExtraTrace(l),this._reject(l)}}},o.prototype._rejectCallback=function(t,e,n){var r=f.ensureErrorObject(t),o=r===t;if(!o&&!n&&A.warnings()){var i="a promise was rejected with a non-error: "+f.classString(t);this._warn(i,!0)}this._attachExtraTrace(r,e?o:!1),this._reject(t)},o.prototype._resolveFromExecutor=function(t){if(t!==T){var e=this;this._captureStackTrace(),this._pushContext();var n=!0,r=this._execute(t,function(t){e._resolveCallback(t)},function(t){e._rejectCallback(t,n)});n=!1,this._popContext(),void 0!==r&&e._rejectCallback(r,!0)}},o.prototype._settlePromiseFromHandler=function(t,e,n,r){var o=r._bitField;if(0===(65536&o)){r._pushContext();var i;e===x?n&&"number"==typeof n.length?i=U(t).apply(this._boundValue(),n):(i=B,i.e=new j("cannot .spread() a non-array: "+f.classString(n))):i=U(t).call(e,n);var a=r._popContext();o=r._bitField,0===(65536&o)&&(i===R?r._reject(n):i===B?r._rejectCallback(i.e,!1):(A.checkForgottenReturns(i,a,"",r,this),r._resolveCallback(i)))}},o.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},o.prototype._followee=function(){return this._rejectionHandler0},o.prototype._setFollowee=function(t){this._rejectionHandler0=t},o.prototype._settlePromise=function(t,e,r,i){var a=t instanceof o,s=this._bitField,c=0!==(134217728&s);0!==(65536&s)?(a&&t._invokeInternalOnCancel(),r instanceof H&&r.isFinallyHandler()?(r.cancelPromise=t,U(e).call(r,i)===B&&t._reject(B.e)):e===l?t._fulfill(l.call(r)):r instanceof n?r._promiseCancelled(t):a||t instanceof P?t._cancel():r.cancel()):"function"==typeof e?a?(c&&t._setAsyncGuaranteed(),this._settlePromiseFromHandler(e,r,i,t)):e.call(r,i,t):r instanceof n?r._isResolved()||(0!==(33554432&s)?r._promiseFulfilled(i,t):r._promiseRejected(i,t)):a&&(c&&t._setAsyncGuaranteed(),0!==(33554432&s)?t._fulfill(i):t._reject(i))},o.prototype._settlePromiseLateCancellationObserver=function(t){var e=t.handler,n=t.promise,r=t.receiver,i=t.value;"function"==typeof e?n instanceof o?this._settlePromiseFromHandler(e,r,i,n):e.call(r,i,n):n instanceof o&&n._reject(i)},o.prototype._settlePromiseCtx=function(t){this._settlePromise(t.promise,t.handler,t.receiver,t.value)},o.prototype._settlePromise0=function(t,e,n){var r=this._promise0,o=this._receiverAt(0);this._promise0=void 0,this._receiver0=void 0,this._settlePromise(r,t,o,e)},o.prototype._clearCallbackDataAtIndex=function(t){var e=4*t-4;this[e+2]=this[e+3]=this[e+0]=this[e+1]=void 0},o.prototype._fulfill=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(t===this){var n=c();return this._attachExtraTrace(n),this._reject(n)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!==(134217728&e)?this._settlePromises():k.settlePromises(this),this._dereferenceTrace())}},o.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16))return this._setRejected(),this._fulfillmentHandler0=t,this._isFinal()?k.fatalError(t,f.isNode):void((65535&e)>0?k.settlePromises(this):this._ensurePossibleRejectionHandled())},o.prototype._fulfillPromises=function(t,e){for(var n=1;t>n;n++){var r=this._fulfillmentHandlerAt(n),o=this._promiseAt(n),i=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(o,r,i,e)}},o.prototype._rejectPromises=function(t,e){for(var n=1;t>n;n++){var r=this._rejectionHandlerAt(n),o=this._promiseAt(n),i=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(o,r,i,e)}},o.prototype._settlePromises=function(){var t=this._bitField,e=65535&t;if(e>0){if(0!==(16842752&t)){var n=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,n,t),this._rejectPromises(e,n)}else{var r=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,r,t),this._fulfillPromises(e,r)}this._setLength(0)}this._clearCancellationData()},o.prototype._settledValue=function(){var t=this._bitField;return 0!==(33554432&t)?this._rejectionHandler0:0!==(16777216&t)?this._fulfillmentHandler0:void 0},"undefined"!=typeof Symbol&&Symbol.toStringTag&&C.defineProperty(o.prototype,Symbol.toStringTag,{get:function(){return"Object"}}),o.defer=o.pending=function(){A.deprecated("Promise.defer","new Promise");var t=new o(T);return{promise:t,resolve:i,reject:a}},f.notEnumerableProp(o,"_makeSelfResolutionError",c),t("./method")(o,T,S,u,A),t("./bind")(o,T,S,A),t("./cancel")(o,P,u,A),t("./direct_resolve")(o),t("./synchronous_inspection")(o),t("./join")(o,P,S,T,k),o.Promise=o,o.version="3.7.2",f.toFastProperties(o),f.toFastProperties(o.prototype),s({a:1}),s({b:2}),s({c:3}),s(1),s(function(){}),s(void 0),s(!1),s(new o(T)),A.setBounds(w.firstLineError,f.lastLineError),o}},{"./async":1,"./bind":2,"./cancel":4,"./catch_filter":5,"./context":6,"./debuggability":7,"./direct_resolve":8,"./errors":9,"./es5":10,"./finally":11,"./join":12,"./method":13,"./nodeback":14,"./promise_array":16,"./synchronous_inspection":19,"./thenables":20,"./util":21,async_hooks:void 0}],16:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){function a(t){switch(t){case-2:return[];case-3:return{};case-6:return new Map}}function s(t){var r=this._promise=new e(n);t instanceof e&&(r._propagateFrom(t,3),t.suppressUnhandledRejections()),r._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var c=t("./util");c.isArray;return c.inherits(s,i),s.prototype.length=function(){return this._length},s.prototype.promise=function(){return this._promise},s.prototype._init=function l(t,n){var i=r(this._values,this._promise);if(i instanceof e){i=i._target();var s=i._bitField;if(this._values=i,0===(50397184&s))return this._promise._setAsyncGuaranteed(),i._then(l,this._reject,void 0,this,n);if(0===(33554432&s))return 0!==(16777216&s)?this._reject(i._reason()):this._cancel();i=i._value()}if(i=c.asArray(i),null===i){var u=o("expecting an array or an iterable object but got "+c.classString(i)).reason();return void this._promise._rejectCallback(u,!1)}return 0===i.length?void(-5===n?this._resolveEmptyArray():this._resolve(a(n))):void this._iterate(i)},s.prototype._iterate=function(t){var n=this.getActualLength(t.length);this._length=n,this._values=this.shouldCopyValues()?new Array(n):this._values;for(var o=this._promise,i=!1,a=null,s=0;n>s;++s){var c=r(t[s],o);c instanceof e?(c=c._target(),a=c._bitField):a=null,i?null!==a&&c.suppressUnhandledRejections():null!==a?0===(50397184&a)?(c._proxy(this,s),this._values[s]=c):i=0!==(33554432&a)?this._promiseFulfilled(c._value(),s):0!==(16777216&a)?this._promiseRejected(c._reason(),s):this._promiseCancelled(s):i=this._promiseFulfilled(c,s)}i||o._setAsyncGuaranteed()},s.prototype._isResolved=function(){return null===this._values},s.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},s.prototype._cancel=function(){!this._isResolved()&&this._promise._isCancellable()&&(this._values=null,this._promise._cancel())},s.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1)},s.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},s.prototype._promiseCancelled=function(){return this._cancel(),!0},s.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},s.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var n=0;n<t.length;++n)t[n]instanceof e&&t[n].cancel()}},s.prototype.shouldCopyValues=function(){return!0},s.prototype.getActualLength=function(t){return t},s}},{"./util":21}],17:[function(t,e,n){"use strict";function r(t,e,n,r,o){for(var i=0;o>i;++i)n[i+r]=t[i+e],t[i+e]=void 0}function o(t){this._capacity=t,this._length=0,this._front=0}o.prototype._willBeOverCapacity=function(t){return this._capacity<t},o.prototype._pushOne=function(t){var e=this.length();this._checkCapacity(e+1);var n=this._front+e&this._capacity-1;this[n]=t,this._length=e+1},o.prototype.push=function(t,e,n){var r=this.length()+3;if(this._willBeOverCapacity(r))return this._pushOne(t),this._pushOne(e),void this._pushOne(n);var o=this._front+r-3;this._checkCapacity(r);var i=this._capacity-1;this[o+0&i]=t,this[o+1&i]=e,this[o+2&i]=n,this._length=r},o.prototype.shift=function(){var t=this._front,e=this[t];return this[t]=void 0,this._front=t+1&this._capacity-1,this._length--,e},o.prototype.length=function(){return this._length},o.prototype._checkCapacity=function(t){this._capacity<t&&this._resizeTo(this._capacity<<1)},o.prototype._resizeTo=function(t){var e=this._capacity;this._capacity=t;var n=this._front,o=this._length,i=n+o&e-1;r(this,0,this,e,i)},e.exports=o},{}],18:[function(t,e,n){"use strict";var r,o=t("./util"),i=function(){throw new Error("No async scheduler available\n\n    See http://goo.gl/MqrFmX\n")},a=o.getNativePromise();if(o.isNode&&"undefined"==typeof MutationObserver){var s=global.setImmediate,c=process.nextTick;r=o.isRecentNode?function(t){s.call(global,t)}:function(t){c.call(process,t)}}else if("function"==typeof a&&"function"==typeof a.resolve){var l=a.resolve();r=function(t){l.then(t)}}else r="undefined"!=typeof MutationObserver&&("undefined"==typeof window||!window.navigator||!window.navigator.standalone&&!window.cordova)&&"classList"in document.documentElement?function(){var t=document.createElement("div"),e={attributes:!0},n=!1,r=document.createElement("div"),o=new MutationObserver(function(){t.classList.toggle("foo"),n=!1});o.observe(r,e);var i=function(){n||(n=!0,r.classList.toggle("foo"))};return function(n){var r=new MutationObserver(function(){r.disconnect(),n()});r.observe(t,e),i()}}():"undefined"!=typeof setImmediate?function(t){setImmediate(t)}:"undefined"!=typeof setTimeout?function(t){setTimeout(t,0)}:i;e.exports=r},{"./util":21}],19:[function(t,e,n){"use strict";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValueField=t._isFateSealed()?t._settledValue():void 0):(this._bitField=0,this._settledValueField=void 0)}e.prototype._settledValue=function(){return this._settledValueField};var n=e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n    See http://goo.gl/MqrFmX\n");return this._settledValue()},r=e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n    See http://goo.gl/MqrFmX\n");return this._settledValue()},o=e.prototype.isFulfilled=function(){return 0!==(33554432&this._bitField)},i=e.prototype.isRejected=function(){return 0!==(16777216&this._bitField)},a=e.prototype.isPending=function(){return 0===(50397184&this._bitField)},s=e.prototype.isResolved=function(){return 0!==(50331648&this._bitField)};e.prototype.isCancelled=function(){return 0!==(8454144&this._bitField)},t.prototype.__isCancelled=function(){return 65536===(65536&this._bitField)},t.prototype._isCancelled=function(){return this._target().__isCancelled()},t.prototype.isCancelled=function(){return 0!==(8454144&this._target()._bitField)},t.prototype.isPending=function(){return a.call(this._target())},t.prototype.isRejected=function(){return i.call(this._target())},t.prototype.isFulfilled=function(){return o.call(this._target())},t.prototype.isResolved=function(){return s.call(this._target())},t.prototype.value=function(){return n.call(this._target())},t.prototype.reason=function(){var t=this._target();return t._unsetRejectionIsUnhandled(),r.call(t)},t.prototype._value=function(){return this._settledValue()},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue()},t.PromiseInspection=e}},{}],20:[function(t,e,n){"use strict";e.exports=function(e,n){function r(t,r){if(u(t)){if(t instanceof e)return t;var o=i(t);if(o===l){r&&r._pushContext();var c=e.reject(o.e);return r&&r._popContext(),c}if("function"==typeof o){if(a(t)){var c=new e(n);return t._then(c._fulfill,c._reject,void 0,c,null),c}return s(t,o,r)}}return t}function o(t){return t.then}function i(t){try{return o(t)}catch(e){return l.e=e,l}}function a(t){try{return p.call(t,"_promise0")}catch(e){return!1}}function s(t,r,o){function i(t){s&&(s._resolveCallback(t),s=null)}function a(t){s&&(s._rejectCallback(t,p,!0),s=null)}var s=new e(n),u=s;o&&o._pushContext(),s._captureStackTrace(),o&&o._popContext();var p=!0,f=c.tryCatch(r).call(t,i,a);return p=!1,s&&f===l&&(s._rejectCallback(f.e,!0,!0),s=null),u}var c=t("./util"),l=c.errorObj,u=c.isObject,p={}.hasOwnProperty;return r}},{"./util":21}],21:[function(t,e,n){"use strict";function r(){try{var t=R;return R=null,t.apply(this,arguments)}catch(e){return x.e=e,x}}function o(t){return R=t,r}function i(t){return null==t||t===!0||t===!1||"string"==typeof t||"number"==typeof t}function a(t){return"function"==typeof t||"object"==typeof t&&null!==t}function s(t){return i(t)?new Error(v(t)):t}function c(t,e){var n,r=t.length,o=new Array(r+1);for(n=0;r>n;++n)o[n]=t[n];return o[n]=e,o}function l(t,e,n){if(!F.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var r=Object.getOwnPropertyDescriptor(t,e);return null!=r?null==r.get&&null==r.set?r.value:n:void 0}function u(t,e,n){if(i(t))return t;var r={value:n,configurable:!0,enumerable:!1,writable:!0};return F.defineProperty(t,e,r),t}function p(t){throw t}function f(t){try{if("function"==typeof t){var e=F.names(t.prototype),n=F.isES5&&e.length>1,r=e.length>0&&!(1===e.length&&"constructor"===e[0]),o=A.test(t+"")&&F.names(t).length>0;if(n||r||o)return!0}return!1}catch(i){return!1}}function h(t){function e(){}function n(){return typeof r.foo}e.prototype=t;var r=new e;return n(),n(),t}function d(t){return H.test(t)}function _(t,e,n){for(var r=new Array(t),o=0;t>o;++o)r[o]=e+o+n;return r}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){return t instanceof Error||null!==t&&"object"==typeof t&&"string"==typeof t.message&&"string"==typeof t.name}function g(t){try{u(t,"isOperational",!0)}catch(e){}}function m(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function b(t){return y(t)&&F.propertyIsWritable(t,"stack")}function C(t){return{}.toString.call(t)}function w(t,e,n){for(var r=F.names(t),o=0;o<r.length;++o){var i=r[o];if(n(i))try{F.defineProperty(e,i,F.getDescriptor(t,i))}catch(a){}}}function k(t){return I?process.env[t]:void 0}function E(){if("function"==typeof Promise)try{var t=new Promise(function(){});if("[object Promise]"===C(t))return Promise}catch(e){}}function j(t,e){if(null===t||"function"!=typeof e||e===D)return e;null!==t.domain&&(e=t.domain.bind(e));var n=t.async;if(null!==n){var r=e;e=function(){var t=new Array(2).concat([].slice.call(arguments));return t[0]=r,t[1]=this,n.runInAsyncScope.apply(n,t)}}return e}var F=t("./es5"),T="undefined"==typeof navigator,x={e:{}},R,S="undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0!==this?this:null,P=function(t,e){function n(){this.constructor=t,this.constructor$=e;for(var n in e.prototype)r.call(e.prototype,n)&&"$"!==n.charAt(n.length-1)&&(this[n+"$"]=e.prototype[n])}var r={}.hasOwnProperty;return n.prototype=e.prototype,t.prototype=new n,t.prototype},O=function(){var t=[Array.prototype,Object.prototype,Function.prototype],e=function(e){for(var n=0;n<t.length;++n)if(t[n]===e)return!0;return!1};if(F.isES5){var n=Object.getOwnPropertyNames;return function(t){for(var r=[],o=Object.create(null);null!=t&&!e(t);){var i;try{i=n(t)}catch(a){return r}for(var s=0;s<i.length;++s){var c=i[s];if(!o[c]){o[c]=!0;var l=Object.getOwnPropertyDescriptor(t,c);null!=l&&null==l.get&&null==l.set&&r.push(c)}}t=F.getPrototypeOf(t)}return r}}var r={}.hasOwnProperty;return function(n){if(e(n))return[];var o=[];t:for(var i in n)if(r.call(n,i))o.push(i);else{for(var a=0;a<t.length;++a)if(r.call(t[a],i))continue t;o.push(i)}return o}}(),A=/this\s*\.\s*\S+\s*=/,H=/^[a-z$_][a-z$_0-9]*$/i,N=function(){return"stack"in new Error?function(t){return b(t)?t:new Error(v(t))}:function(t){if(b(t))return t;try{throw new Error(v(t))}catch(e){return e}}}(),L=function(t){return F.isArray(t)?t:null};if("undefined"!=typeof Symbol&&Symbol.iterator){var B="function"==typeof Array.from?function(t){return Array.from(t)}:function(t){for(var e,n=[],r=t[Symbol.iterator]();!(e=r.next()).done;)n.push(e.value);return n};L=function(t){return F.isArray(t)?t:null!=t&&"function"==typeof t[Symbol.iterator]?B(t):null}}var U="undefined"!=typeof process&&"[object process]"===C(process).toLowerCase(),I="undefined"!=typeof process&&"undefined"!=typeof process.env,D,V={setReflectHandler:function(t){D=t},isClass:f,isIdentifier:d,inheritedDataKeys:O,getDataPropertyOrDefault:l,thrower:p,isArray:F.isArray,asArray:L,notEnumerableProp:u,isPrimitive:i,isObject:a,isError:y,canEvaluate:T,errorObj:x,tryCatch:o,inherits:P,withAppended:c,maybeWrapAsError:s,toFastProperties:h,filledRange:_,toString:v,canAttachTrace:b,ensureErrorObject:N,originatesFromRejection:m,markAsOriginatingFromRejection:g,classString:C,copyDescriptors:w,isNode:U,hasEnvVariables:I,env:k,global:S,getNativePromise:E,contextBind:j};V.isRecentNode=V.isNode&&function(){var t;return process.versions&&process.versions.node?t=process.versions.node.split(".").map(Number):process.version&&(t=process.version.split(".").map(Number)),0===t[0]&&t[1]>10||t[0]>0}(),V.nodeSupportsAsyncResource=V.isNode&&function(){var e=!1;try{var n=t("async_hooks").AsyncResource;e="function"==typeof n.prototype.runInAsyncScope}catch(r){e=!1}return e}(),V.isNode&&V.toFastProperties(process);try{throw new Error}catch(Q){V.lastLineError=Q}e.exports=V},{"./es5":10,async_hooks:void 0}]},{},[3])(3)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise);/* @preserve
 * The MIT License (MIT)
 * 
 * Copyright (c) 2013-2018 Petka Antonov
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * 
 */
/**
 * bluebird build version 3.7.2
 * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Promise=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
var SomePromiseArray = Promise._SomePromiseArray;
function any(promises) {
    var ret = new SomePromiseArray(promises);
    var promise = ret.promise();
    ret.setHowMany(1);
    ret.setUnwrap();
    ret.init();
    return promise;
}

Promise.any = function (promises) {
    return any(promises);
};

Promise.prototype.any = function () {
    return any(this);
};

};

},{}],2:[function(_dereq_,module,exports){
"use strict";
var firstLineError;
try {throw new Error(); } catch (e) {firstLineError = e;}
var schedule = _dereq_("./schedule");
var Queue = _dereq_("./queue");

function Async() {
    this._customScheduler = false;
    this._isTickUsed = false;
    this._lateQueue = new Queue(16);
    this._normalQueue = new Queue(16);
    this._haveDrainedQueues = false;
    var self = this;
    this.drainQueues = function () {
        self._drainQueues();
    };
    this._schedule = schedule;
}

Async.prototype.setScheduler = function(fn) {
    var prev = this._schedule;
    this._schedule = fn;
    this._customScheduler = true;
    return prev;
};

Async.prototype.hasCustomScheduler = function() {
    return this._customScheduler;
};

Async.prototype.haveItemsQueued = function () {
    return this._isTickUsed || this._haveDrainedQueues;
};


Async.prototype.fatalError = function(e, isNode) {
    if (isNode) {
        process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) +
            "\n");
        process.exit(2);
    } else {
        this.throwLater(e);
    }
};

Async.prototype.throwLater = function(fn, arg) {
    if (arguments.length === 1) {
        arg = fn;
        fn = function () { throw arg; };
    }
    if (typeof setTimeout !== "undefined") {
        setTimeout(function() {
            fn(arg);
        }, 0);
    } else try {
        this._schedule(function() {
            fn(arg);
        });
    } catch (e) {
        throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
};

function AsyncInvokeLater(fn, receiver, arg) {
    this._lateQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncInvoke(fn, receiver, arg) {
    this._normalQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncSettlePromises(promise) {
    this._normalQueue._pushOne(promise);
    this._queueTick();
}

Async.prototype.invokeLater = AsyncInvokeLater;
Async.prototype.invoke = AsyncInvoke;
Async.prototype.settlePromises = AsyncSettlePromises;


function _drainQueue(queue) {
    while (queue.length() > 0) {
        _drainQueueStep(queue);
    }
}

function _drainQueueStep(queue) {
    var fn = queue.shift();
    if (typeof fn !== "function") {
        fn._settlePromises();
    } else {
        var receiver = queue.shift();
        var arg = queue.shift();
        fn.call(receiver, arg);
    }
}

Async.prototype._drainQueues = function () {
    _drainQueue(this._normalQueue);
    this._reset();
    this._haveDrainedQueues = true;
    _drainQueue(this._lateQueue);
};

Async.prototype._queueTick = function () {
    if (!this._isTickUsed) {
        this._isTickUsed = true;
        this._schedule(this.drainQueues);
    }
};

Async.prototype._reset = function () {
    this._isTickUsed = false;
};

module.exports = Async;
module.exports.firstLineError = firstLineError;

},{"./queue":26,"./schedule":29}],3:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {
var calledBind = false;
var rejectThis = function(_, e) {
    this._reject(e);
};

var targetRejected = function(e, context) {
    context.promiseRejectionQueued = true;
    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
};

var bindingResolved = function(thisArg, context) {
    if (((this._bitField & 50397184) === 0)) {
        this._resolveCallback(context.target);
    }
};

var bindingRejected = function(e, context) {
    if (!context.promiseRejectionQueued) this._reject(e);
};

Promise.prototype.bind = function (thisArg) {
    if (!calledBind) {
        calledBind = true;
        Promise.prototype._propagateFrom = debug.propagateFromFunction();
        Promise.prototype._boundValue = debug.boundValueFunction();
    }
    var maybePromise = tryConvertToPromise(thisArg);
    var ret = new Promise(INTERNAL);
    ret._propagateFrom(this, 1);
    var target = this._target();
    ret._setBoundTo(maybePromise);
    if (maybePromise instanceof Promise) {
        var context = {
            promiseRejectionQueued: false,
            promise: ret,
            target: target,
            bindingPromise: maybePromise
        };
        target._then(INTERNAL, targetRejected, undefined, ret, context);
        maybePromise._then(
            bindingResolved, bindingRejected, undefined, ret, context);
        ret._setOnCancel(maybePromise);
    } else {
        ret._resolveCallback(target);
    }
    return ret;
};

Promise.prototype._setBoundTo = function (obj) {
    if (obj !== undefined) {
        this._bitField = this._bitField | 2097152;
        this._boundTo = obj;
    } else {
        this._bitField = this._bitField & (~2097152);
    }
};

Promise.prototype._isBound = function () {
    return (this._bitField & 2097152) === 2097152;
};

Promise.bind = function (thisArg, value) {
    return Promise.resolve(value).bind(thisArg);
};
};

},{}],4:[function(_dereq_,module,exports){
"use strict";
var old;
if (typeof Promise !== "undefined") old = Promise;
function noConflict() {
    try { if (Promise === bluebird) Promise = old; }
    catch (e) {}
    return bluebird;
}
var bluebird = _dereq_("./promise")();
bluebird.noConflict = noConflict;
module.exports = bluebird;

},{"./promise":22}],5:[function(_dereq_,module,exports){
"use strict";
var cr = Object.create;
if (cr) {
    var callerCache = cr(null);
    var getterCache = cr(null);
    callerCache[" size"] = getterCache[" size"] = 0;
}

module.exports = function(Promise) {
var util = _dereq_("./util");
var canEvaluate = util.canEvaluate;
var isIdentifier = util.isIdentifier;

var getMethodCaller;
var getGetter;
if (!true) {
var makeMethodCaller = function (methodName) {
    return new Function("ensureMethod", "                                    \n\
        return function(obj) {                                               \n\
            'use strict'                                                     \n\
            var len = this.length;                                           \n\
            ensureMethod(obj, 'methodName');                                 \n\
            switch(len) {                                                    \n\
                case 1: return obj.methodName(this[0]);                      \n\
                case 2: return obj.methodName(this[0], this[1]);             \n\
                case 3: return obj.methodName(this[0], this[1], this[2]);    \n\
                case 0: return obj.methodName();                             \n\
                default:                                                     \n\
                    return obj.methodName.apply(obj, this);                  \n\
            }                                                                \n\
        };                                                                   \n\
        ".replace(/methodName/g, methodName))(ensureMethod);
};

var makeGetter = function (propertyName) {
    return new Function("obj", "                                             \n\
        'use strict';                                                        \n\
        return obj.propertyName;                                             \n\
        ".replace("propertyName", propertyName));
};

var getCompiled = function(name, compiler, cache) {
    var ret = cache[name];
    if (typeof ret !== "function") {
        if (!isIdentifier(name)) {
            return null;
        }
        ret = compiler(name);
        cache[name] = ret;
        cache[" size"]++;
        if (cache[" size"] > 512) {
            var keys = Object.keys(cache);
            for (var i = 0; i < 256; ++i) delete cache[keys[i]];
            cache[" size"] = keys.length - 256;
        }
    }
    return ret;
};

getMethodCaller = function(name) {
    return getCompiled(name, makeMethodCaller, callerCache);
};

getGetter = function(name) {
    return getCompiled(name, makeGetter, getterCache);
};
}

function ensureMethod(obj, methodName) {
    var fn;
    if (obj != null) fn = obj[methodName];
    if (typeof fn !== "function") {
        var message = "Object " + util.classString(obj) + " has no method '" +
            util.toString(methodName) + "'";
        throw new Promise.TypeError(message);
    }
    return fn;
}

function caller(obj) {
    var methodName = this.pop();
    var fn = ensureMethod(obj, methodName);
    return fn.apply(obj, this);
}
Promise.prototype.call = function (methodName) {
    var args = [].slice.call(arguments, 1);;
    if (!true) {
        if (canEvaluate) {
            var maybeCaller = getMethodCaller(methodName);
            if (maybeCaller !== null) {
                return this._then(
                    maybeCaller, undefined, undefined, args, undefined);
            }
        }
    }
    args.push(methodName);
    return this._then(caller, undefined, undefined, args, undefined);
};

function namedGetter(obj) {
    return obj[this];
}
function indexedGetter(obj) {
    var index = +this;
    if (index < 0) index = Math.max(0, index + obj.length);
    return obj[index];
}
Promise.prototype.get = function (propertyName) {
    var isIndex = (typeof propertyName === "number");
    var getter;
    if (!isIndex) {
        if (canEvaluate) {
            var maybeGetter = getGetter(propertyName);
            getter = maybeGetter !== null ? maybeGetter : namedGetter;
        } else {
            getter = namedGetter;
        }
    } else {
        getter = indexedGetter;
    }
    return this._then(getter, undefined, undefined, propertyName, undefined);
};
};

},{"./util":36}],6:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, PromiseArray, apiRejection, debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

Promise.prototype["break"] = Promise.prototype.cancel = function() {
    if (!debug.cancellation()) return this._warn("cancellation is disabled");

    var promise = this;
    var child = promise;
    while (promise._isCancellable()) {
        if (!promise._cancelBy(child)) {
            if (child._isFollowing()) {
                child._followee().cancel();
            } else {
                child._cancelBranched();
            }
            break;
        }

        var parent = promise._cancellationParent;
        if (parent == null || !parent._isCancellable()) {
            if (promise._isFollowing()) {
                promise._followee().cancel();
            } else {
                promise._cancelBranched();
            }
            break;
        } else {
            if (promise._isFollowing()) promise._followee().cancel();
            promise._setWillBeCancelled();
            child = promise;
            promise = parent;
        }
    }
};

Promise.prototype._branchHasCancelled = function() {
    this._branchesRemainingToCancel--;
};

Promise.prototype._enoughBranchesHaveCancelled = function() {
    return this._branchesRemainingToCancel === undefined ||
           this._branchesRemainingToCancel <= 0;
};

Promise.prototype._cancelBy = function(canceller) {
    if (canceller === this) {
        this._branchesRemainingToCancel = 0;
        this._invokeOnCancel();
        return true;
    } else {
        this._branchHasCancelled();
        if (this._enoughBranchesHaveCancelled()) {
            this._invokeOnCancel();
            return true;
        }
    }
    return false;
};

Promise.prototype._cancelBranched = function() {
    if (this._enoughBranchesHaveCancelled()) {
        this._cancel();
    }
};

Promise.prototype._cancel = function() {
    if (!this._isCancellable()) return;
    this._setCancelled();
    async.invoke(this._cancelPromises, this, undefined);
};

Promise.prototype._cancelPromises = function() {
    if (this._length() > 0) this._settlePromises();
};

Promise.prototype._unsetOnCancel = function() {
    this._onCancelField = undefined;
};

Promise.prototype._isCancellable = function() {
    return this.isPending() && !this._isCancelled();
};

Promise.prototype.isCancellable = function() {
    return this.isPending() && !this.isCancelled();
};

Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {
    if (util.isArray(onCancelCallback)) {
        for (var i = 0; i < onCancelCallback.length; ++i) {
            this._doInvokeOnCancel(onCancelCallback[i], internalOnly);
        }
    } else if (onCancelCallback !== undefined) {
        if (typeof onCancelCallback === "function") {
            if (!internalOnly) {
                var e = tryCatch(onCancelCallback).call(this._boundValue());
                if (e === errorObj) {
                    this._attachExtraTrace(e.e);
                    async.throwLater(e.e);
                }
            }
        } else {
            onCancelCallback._resultCancelled(this);
        }
    }
};

Promise.prototype._invokeOnCancel = function() {
    var onCancelCallback = this._onCancel();
    this._unsetOnCancel();
    async.invoke(this._doInvokeOnCancel, this, onCancelCallback);
};

Promise.prototype._invokeInternalOnCancel = function() {
    if (this._isCancellable()) {
        this._doInvokeOnCancel(this._onCancel(), true);
        this._unsetOnCancel();
    }
};

Promise.prototype._resultCancelled = function() {
    this.cancel();
};

};

},{"./util":36}],7:[function(_dereq_,module,exports){
"use strict";
module.exports = function(NEXT_FILTER) {
var util = _dereq_("./util");
var getKeys = _dereq_("./es5").keys;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function catchFilter(instances, cb, promise) {
    return function(e) {
        var boundTo = promise._boundValue();
        predicateLoop: for (var i = 0; i < instances.length; ++i) {
            var item = instances[i];

            if (item === Error ||
                (item != null && item.prototype instanceof Error)) {
                if (e instanceof item) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (typeof item === "function") {
                var matchesPredicate = tryCatch(item).call(boundTo, e);
                if (matchesPredicate === errorObj) {
                    return matchesPredicate;
                } else if (matchesPredicate) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (util.isObject(e)) {
                var keys = getKeys(item);
                for (var j = 0; j < keys.length; ++j) {
                    var key = keys[j];
                    if (item[key] != e[key]) {
                        continue predicateLoop;
                    }
                }
                return tryCatch(cb).call(boundTo, e);
            }
        }
        return NEXT_FILTER;
    };
}

return catchFilter;
};

},{"./es5":13,"./util":36}],8:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
var longStackTraces = false;
var contextStack = [];

Promise.prototype._promiseCreated = function() {};
Promise.prototype._pushContext = function() {};
Promise.prototype._popContext = function() {return null;};
Promise._peekContext = Promise.prototype._peekContext = function() {};

function Context() {
    this._trace = new Context.CapturedTrace(peekContext());
}
Context.prototype._pushContext = function () {
    if (this._trace !== undefined) {
        this._trace._promiseCreated = null;
        contextStack.push(this._trace);
    }
};

Context.prototype._popContext = function () {
    if (this._trace !== undefined) {
        var trace = contextStack.pop();
        var ret = trace._promiseCreated;
        trace._promiseCreated = null;
        return ret;
    }
    return null;
};

function createContext() {
    if (longStackTraces) return new Context();
}

function peekContext() {
    var lastIndex = contextStack.length - 1;
    if (lastIndex >= 0) {
        return contextStack[lastIndex];
    }
    return undefined;
}
Context.CapturedTrace = null;
Context.create = createContext;
Context.deactivateLongStackTraces = function() {};
Context.activateLongStackTraces = function() {
    var Promise_pushContext = Promise.prototype._pushContext;
    var Promise_popContext = Promise.prototype._popContext;
    var Promise_PeekContext = Promise._peekContext;
    var Promise_peekContext = Promise.prototype._peekContext;
    var Promise_promiseCreated = Promise.prototype._promiseCreated;
    Context.deactivateLongStackTraces = function() {
        Promise.prototype._pushContext = Promise_pushContext;
        Promise.prototype._popContext = Promise_popContext;
        Promise._peekContext = Promise_PeekContext;
        Promise.prototype._peekContext = Promise_peekContext;
        Promise.prototype._promiseCreated = Promise_promiseCreated;
        longStackTraces = false;
    };
    longStackTraces = true;
    Promise.prototype._pushContext = Context.prototype._pushContext;
    Promise.prototype._popContext = Context.prototype._popContext;
    Promise._peekContext = Promise.prototype._peekContext = peekContext;
    Promise.prototype._promiseCreated = function() {
        var ctx = this._peekContext();
        if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;
    };
};
return Context;
};

},{}],9:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, Context,
    enableAsyncHooks, disableAsyncHooks) {
var async = Promise._async;
var Warning = _dereq_("./errors").Warning;
var util = _dereq_("./util");
var es5 = _dereq_("./es5");
var canAttachTrace = util.canAttachTrace;
var unhandledRejectionHandled;
var possiblyUnhandledRejection;
var bluebirdFramePattern =
    /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/;
var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/;
var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/;
var stackFramePattern = null;
var formatStack = null;
var indentStackFrames = false;
var printWarning;
var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 &&
                        (true ||
                         util.env("BLUEBIRD_DEBUG") ||
                         util.env("NODE_ENV") === "development"));

var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 &&
    (debugging || util.env("BLUEBIRD_WARNINGS")));

var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 &&
    (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));

var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 &&
    (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));

var deferUnhandledRejectionCheck;
(function() {
    var promises = [];

    function unhandledRejectionCheck() {
        for (var i = 0; i < promises.length; ++i) {
            promises[i]._notifyUnhandledRejection();
        }
        unhandledRejectionClear();
    }

    function unhandledRejectionClear() {
        promises.length = 0;
    }

    deferUnhandledRejectionCheck = function(promise) {
        promises.push(promise);
        setTimeout(unhandledRejectionCheck, 1);
    };

    es5.defineProperty(Promise, "_unhandledRejectionCheck", {
        value: unhandledRejectionCheck
    });
    es5.defineProperty(Promise, "_unhandledRejectionClear", {
        value: unhandledRejectionClear
    });
})();

Promise.prototype.suppressUnhandledRejections = function() {
    var target = this._target();
    target._bitField = ((target._bitField & (~1048576)) |
                      524288);
};

Promise.prototype._ensurePossibleRejectionHandled = function () {
    if ((this._bitField & 524288) !== 0) return;
    this._setRejectionIsUnhandled();
    deferUnhandledRejectionCheck(this);
};

Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
    fireRejectionEvent("rejectionHandled",
                                  unhandledRejectionHandled, undefined, this);
};

Promise.prototype._setReturnedNonUndefined = function() {
    this._bitField = this._bitField | 268435456;
};

Promise.prototype._returnedNonUndefined = function() {
    return (this._bitField & 268435456) !== 0;
};

Promise.prototype._notifyUnhandledRejection = function () {
    if (this._isRejectionUnhandled()) {
        var reason = this._settledValue();
        this._setUnhandledRejectionIsNotified();
        fireRejectionEvent("unhandledRejection",
                                      possiblyUnhandledRejection, reason, this);
    }
};

Promise.prototype._setUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField | 262144;
};

Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField & (~262144);
};

Promise.prototype._isUnhandledRejectionNotified = function () {
    return (this._bitField & 262144) > 0;
};

Promise.prototype._setRejectionIsUnhandled = function () {
    this._bitField = this._bitField | 1048576;
};

Promise.prototype._unsetRejectionIsUnhandled = function () {
    this._bitField = this._bitField & (~1048576);
    if (this._isUnhandledRejectionNotified()) {
        this._unsetUnhandledRejectionIsNotified();
        this._notifyUnhandledRejectionIsHandled();
    }
};

Promise.prototype._isRejectionUnhandled = function () {
    return (this._bitField & 1048576) > 0;
};

Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) {
    return warn(message, shouldUseOwnTrace, promise || this);
};

Promise.onPossiblyUnhandledRejection = function (fn) {
    var context = Promise._getContext();
    possiblyUnhandledRejection = util.contextBind(context, fn);
};

Promise.onUnhandledRejectionHandled = function (fn) {
    var context = Promise._getContext();
    unhandledRejectionHandled = util.contextBind(context, fn);
};

var disableLongStackTraces = function() {};
Promise.longStackTraces = function () {
    if (async.haveItemsQueued() && !config.longStackTraces) {
        throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (!config.longStackTraces && longStackTracesIsSupported()) {
        var Promise_captureStackTrace = Promise.prototype._captureStackTrace;
        var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;
        var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace;
        config.longStackTraces = true;
        disableLongStackTraces = function() {
            if (async.haveItemsQueued() && !config.longStackTraces) {
                throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
            }
            Promise.prototype._captureStackTrace = Promise_captureStackTrace;
            Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;
            Promise.prototype._dereferenceTrace = Promise_dereferenceTrace;
            Context.deactivateLongStackTraces();
            config.longStackTraces = false;
        };
        Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;
        Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;
        Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace;
        Context.activateLongStackTraces();
    }
};

Promise.hasLongStackTraces = function () {
    return config.longStackTraces && longStackTracesIsSupported();
};


var legacyHandlers = {
    unhandledrejection: {
        before: function() {
            var ret = util.global.onunhandledrejection;
            util.global.onunhandledrejection = null;
            return ret;
        },
        after: function(fn) {
            util.global.onunhandledrejection = fn;
        }
    },
    rejectionhandled: {
        before: function() {
            var ret = util.global.onrejectionhandled;
            util.global.onrejectionhandled = null;
            return ret;
        },
        after: function(fn) {
            util.global.onrejectionhandled = fn;
        }
    }
};

var fireDomEvent = (function() {
    var dispatch = function(legacy, e) {
        if (legacy) {
            var fn;
            try {
                fn = legacy.before();
                return !util.global.dispatchEvent(e);
            } finally {
                legacy.after(fn);
            }
        } else {
            return !util.global.dispatchEvent(e);
        }
    };
    try {
        if (typeof CustomEvent === "function") {
            var event = new CustomEvent("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var eventData = {
                    detail: event,
                    cancelable: true
                };
                var domEvent = new CustomEvent(name, eventData);
                es5.defineProperty(
                    domEvent, "promise", {value: event.promise});
                es5.defineProperty(
                    domEvent, "reason", {value: event.reason});

                return dispatch(legacyHandlers[name], domEvent);
            };
        } else if (typeof Event === "function") {
            var event = new Event("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = new Event(name, {
                    cancelable: true
                });
                domEvent.detail = event;
                es5.defineProperty(domEvent, "promise", {value: event.promise});
                es5.defineProperty(domEvent, "reason", {value: event.reason});
                return dispatch(legacyHandlers[name], domEvent);
            };
        } else {
            var event = document.createEvent("CustomEvent");
            event.initCustomEvent("testingtheevent", false, true, {});
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = document.createEvent("CustomEvent");
                domEvent.initCustomEvent(name, false, true,
                    event);
                return dispatch(legacyHandlers[name], domEvent);
            };
        }
    } catch (e) {}
    return function() {
        return false;
    };
})();

var fireGlobalEvent = (function() {
    if (util.isNode) {
        return function() {
            return process.emit.apply(process, arguments);
        };
    } else {
        if (!util.global) {
            return function() {
                return false;
            };
        }
        return function(name) {
            var methodName = "on" + name.toLowerCase();
            var method = util.global[methodName];
            if (!method) return false;
            method.apply(util.global, [].slice.call(arguments, 1));
            return true;
        };
    }
})();

function generatePromiseLifecycleEventObject(name, promise) {
    return {promise: promise};
}

var eventToObjectGenerator = {
    promiseCreated: generatePromiseLifecycleEventObject,
    promiseFulfilled: generatePromiseLifecycleEventObject,
    promiseRejected: generatePromiseLifecycleEventObject,
    promiseResolved: generatePromiseLifecycleEventObject,
    promiseCancelled: generatePromiseLifecycleEventObject,
    promiseChained: function(name, promise, child) {
        return {promise: promise, child: child};
    },
    warning: function(name, warning) {
        return {warning: warning};
    },
    unhandledRejection: function (name, reason, promise) {
        return {reason: reason, promise: promise};
    },
    rejectionHandled: generatePromiseLifecycleEventObject
};

var activeFireEvent = function (name) {
    var globalEventFired = false;
    try {
        globalEventFired = fireGlobalEvent.apply(null, arguments);
    } catch (e) {
        async.throwLater(e);
        globalEventFired = true;
    }

    var domEventFired = false;
    try {
        domEventFired = fireDomEvent(name,
                    eventToObjectGenerator[name].apply(null, arguments));
    } catch (e) {
        async.throwLater(e);
        domEventFired = true;
    }

    return domEventFired || globalEventFired;
};

Promise.config = function(opts) {
    opts = Object(opts);
    if ("longStackTraces" in opts) {
        if (opts.longStackTraces) {
            Promise.longStackTraces();
        } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
            disableLongStackTraces();
        }
    }
    if ("warnings" in opts) {
        var warningsOption = opts.warnings;
        config.warnings = !!warningsOption;
        wForgottenReturn = config.warnings;

        if (util.isObject(warningsOption)) {
            if ("wForgottenReturn" in warningsOption) {
                wForgottenReturn = !!warningsOption.wForgottenReturn;
            }
        }
    }
    if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
        if (async.haveItemsQueued()) {
            throw new Error(
                "cannot enable cancellation after promises are in use");
        }
        Promise.prototype._clearCancellationData =
            cancellationClearCancellationData;
        Promise.prototype._propagateFrom = cancellationPropagateFrom;
        Promise.prototype._onCancel = cancellationOnCancel;
        Promise.prototype._setOnCancel = cancellationSetOnCancel;
        Promise.prototype._attachCancellationCallback =
            cancellationAttachCancellationCallback;
        Promise.prototype._execute = cancellationExecute;
        propagateFromFunction = cancellationPropagateFrom;
        config.cancellation = true;
    }
    if ("monitoring" in opts) {
        if (opts.monitoring && !config.monitoring) {
            config.monitoring = true;
            Promise.prototype._fireEvent = activeFireEvent;
        } else if (!opts.monitoring && config.monitoring) {
            config.monitoring = false;
            Promise.prototype._fireEvent = defaultFireEvent;
        }
    }
    if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) {
        var prev = config.asyncHooks;
        var cur = !!opts.asyncHooks;
        if (prev !== cur) {
            config.asyncHooks = cur;
            if (cur) {
                enableAsyncHooks();
            } else {
                disableAsyncHooks();
            }
        }
    }
    return Promise;
};

function defaultFireEvent() { return false; }

Promise.prototype._fireEvent = defaultFireEvent;
Promise.prototype._execute = function(executor, resolve, reject) {
    try {
        executor(resolve, reject);
    } catch (e) {
        return e;
    }
};
Promise.prototype._onCancel = function () {};
Promise.prototype._setOnCancel = function (handler) { ; };
Promise.prototype._attachCancellationCallback = function(onCancel) {
    ;
};
Promise.prototype._captureStackTrace = function () {};
Promise.prototype._attachExtraTrace = function () {};
Promise.prototype._dereferenceTrace = function () {};
Promise.prototype._clearCancellationData = function() {};
Promise.prototype._propagateFrom = function (parent, flags) {
    ;
    ;
};

function cancellationExecute(executor, resolve, reject) {
    var promise = this;
    try {
        executor(resolve, reject, function(onCancel) {
            if (typeof onCancel !== "function") {
                throw new TypeError("onCancel must be a function, got: " +
                                    util.toString(onCancel));
            }
            promise._attachCancellationCallback(onCancel);
        });
    } catch (e) {
        return e;
    }
}

function cancellationAttachCancellationCallback(onCancel) {
    if (!this._isCancellable()) return this;

    var previousOnCancel = this._onCancel();
    if (previousOnCancel !== undefined) {
        if (util.isArray(previousOnCancel)) {
            previousOnCancel.push(onCancel);
        } else {
            this._setOnCancel([previousOnCancel, onCancel]);
        }
    } else {
        this._setOnCancel(onCancel);
    }
}

function cancellationOnCancel() {
    return this._onCancelField;
}

function cancellationSetOnCancel(onCancel) {
    this._onCancelField = onCancel;
}

function cancellationClearCancellationData() {
    this._cancellationParent = undefined;
    this._onCancelField = undefined;
}

function cancellationPropagateFrom(parent, flags) {
    if ((flags & 1) !== 0) {
        this._cancellationParent = parent;
        var branchesRemainingToCancel = parent._branchesRemainingToCancel;
        if (branchesRemainingToCancel === undefined) {
            branchesRemainingToCancel = 0;
        }
        parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;
    }
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}

function bindingPropagateFrom(parent, flags) {
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}
var propagateFromFunction = bindingPropagateFrom;

function boundValueFunction() {
    var ret = this._boundTo;
    if (ret !== undefined) {
        if (ret instanceof Promise) {
            if (ret.isFulfilled()) {
                return ret.value();
            } else {
                return undefined;
            }
        }
    }
    return ret;
}

function longStackTracesCaptureStackTrace() {
    this._trace = new CapturedTrace(this._peekContext());
}

function longStackTracesAttachExtraTrace(error, ignoreSelf) {
    if (canAttachTrace(error)) {
        var trace = this._trace;
        if (trace !== undefined) {
            if (ignoreSelf) trace = trace._parent;
        }
        if (trace !== undefined) {
            trace.attachExtraTrace(error);
        } else if (!error.__stackCleaned__) {
            var parsed = parseStackAndMessage(error);
            util.notEnumerableProp(error, "stack",
                parsed.message + "\n" + parsed.stack.join("\n"));
            util.notEnumerableProp(error, "__stackCleaned__", true);
        }
    }
}

function longStackTracesDereferenceTrace() {
    this._trace = undefined;
}

function checkForgottenReturns(returnValue, promiseCreated, name, promise,
                               parent) {
    if (returnValue === undefined && promiseCreated !== null &&
        wForgottenReturn) {
        if (parent !== undefined && parent._returnedNonUndefined()) return;
        if ((promise._bitField & 65535) === 0) return;

        if (name) name = name + " ";
        var handlerLine = "";
        var creatorLine = "";
        if (promiseCreated._trace) {
            var traceLines = promiseCreated._trace.stack.split("\n");
            var stack = cleanStack(traceLines);
            for (var i = stack.length - 1; i >= 0; --i) {
                var line = stack[i];
                if (!nodeFramePattern.test(line)) {
                    var lineMatches = line.match(parseLinePattern);
                    if (lineMatches) {
                        handlerLine  = "at " + lineMatches[1] +
                            ":" + lineMatches[2] + ":" + lineMatches[3] + " ";
                    }
                    break;
                }
            }

            if (stack.length > 0) {
                var firstUserLine = stack[0];
                for (var i = 0; i < traceLines.length; ++i) {

                    if (traceLines[i] === firstUserLine) {
                        if (i > 0) {
                            creatorLine = "\n" + traceLines[i - 1];
                        }
                        break;
                    }
                }

            }
        }
        var msg = "a promise was created in a " + name +
            "handler " + handlerLine + "but was not returned from it, " +
            "see http://goo.gl/rRqMUw" +
            creatorLine;
        promise._warn(msg, true, promiseCreated);
    }
}

function deprecated(name, replacement) {
    var message = name +
        " is deprecated and will be removed in a future version.";
    if (replacement) message += " Use " + replacement + " instead.";
    return warn(message);
}

function warn(message, shouldUseOwnTrace, promise) {
    if (!config.warnings) return;
    var warning = new Warning(message);
    var ctx;
    if (shouldUseOwnTrace) {
        promise._attachExtraTrace(warning);
    } else if (config.longStackTraces && (ctx = Promise._peekContext())) {
        ctx.attachExtraTrace(warning);
    } else {
        var parsed = parseStackAndMessage(warning);
        warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
    }

    if (!activeFireEvent("warning", warning)) {
        formatAndLogError(warning, "", true);
    }
}

function reconstructStack(message, stacks) {
    for (var i = 0; i < stacks.length - 1; ++i) {
        stacks[i].push("From previous event:");
        stacks[i] = stacks[i].join("\n");
    }
    if (i < stacks.length) {
        stacks[i] = stacks[i].join("\n");
    }
    return message + "\n" + stacks.join("\n");
}

function removeDuplicateOrEmptyJumps(stacks) {
    for (var i = 0; i < stacks.length; ++i) {
        if (stacks[i].length === 0 ||
            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {
            stacks.splice(i, 1);
            i--;
        }
    }
}

function removeCommonRoots(stacks) {
    var current = stacks[0];
    for (var i = 1; i < stacks.length; ++i) {
        var prev = stacks[i];
        var currentLastIndex = current.length - 1;
        var currentLastLine = current[currentLastIndex];
        var commonRootMeetPoint = -1;

        for (var j = prev.length - 1; j >= 0; --j) {
            if (prev[j] === currentLastLine) {
                commonRootMeetPoint = j;
                break;
            }
        }

        for (var j = commonRootMeetPoint; j >= 0; --j) {
            var line = prev[j];
            if (current[currentLastIndex] === line) {
                current.pop();
                currentLastIndex--;
            } else {
                break;
            }
        }
        current = prev;
    }
}

function cleanStack(stack) {
    var ret = [];
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        var isTraceLine = "    (No stack trace)" === line ||
            stackFramePattern.test(line);
        var isInternalFrame = isTraceLine && shouldIgnore(line);
        if (isTraceLine && !isInternalFrame) {
            if (indentStackFrames && line.charAt(0) !== " ") {
                line = "    " + line;
            }
            ret.push(line);
        }
    }
    return ret;
}

function stackFramesAsArray(error) {
    var stack = error.stack.replace(/\s+$/g, "").split("\n");
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        if ("    (No stack trace)" === line || stackFramePattern.test(line)) {
            break;
        }
    }
    if (i > 0 && error.name != "SyntaxError") {
        stack = stack.slice(i);
    }
    return stack;
}

function parseStackAndMessage(error) {
    var stack = error.stack;
    var message = error.toString();
    stack = typeof stack === "string" && stack.length > 0
                ? stackFramesAsArray(error) : ["    (No stack trace)"];
    return {
        message: message,
        stack: error.name == "SyntaxError" ? stack : cleanStack(stack)
    };
}

function formatAndLogError(error, title, isSoft) {
    if (typeof console !== "undefined") {
        var message;
        if (util.isObject(error)) {
            var stack = error.stack;
            message = title + formatStack(stack, error);
        } else {
            message = title + String(error);
        }
        if (typeof printWarning === "function") {
            printWarning(message, isSoft);
        } else if (typeof console.log === "function" ||
            typeof console.log === "object") {
            console.log(message);
        }
    }
}

function fireRejectionEvent(name, localHandler, reason, promise) {
    var localEventFired = false;
    try {
        if (typeof localHandler === "function") {
            localEventFired = true;
            if (name === "rejectionHandled") {
                localHandler(promise);
            } else {
                localHandler(reason, promise);
            }
        }
    } catch (e) {
        async.throwLater(e);
    }

    if (name === "unhandledRejection") {
        if (!activeFireEvent(name, reason, promise) && !localEventFired) {
            formatAndLogError(reason, "Unhandled rejection ");
        }
    } else {
        activeFireEvent(name, promise);
    }
}

function formatNonError(obj) {
    var str;
    if (typeof obj === "function") {
        str = "[function " +
            (obj.name || "anonymous") +
            "]";
    } else {
        str = obj && typeof obj.toString === "function"
            ? obj.toString() : util.toString(obj);
        var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
        if (ruselessToString.test(str)) {
            try {
                var newStr = JSON.stringify(obj);
                str = newStr;
            }
            catch(e) {

            }
        }
        if (str.length === 0) {
            str = "(empty array)";
        }
    }
    return ("(<" + snip(str) + ">, no stack trace)");
}

function snip(str) {
    var maxChars = 41;
    if (str.length < maxChars) {
        return str;
    }
    return str.substr(0, maxChars - 3) + "...";
}

function longStackTracesIsSupported() {
    return typeof captureStackTrace === "function";
}

var shouldIgnore = function() { return false; };
var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
function parseLineInfo(line) {
    var matches = line.match(parseLineInfoRegex);
    if (matches) {
        return {
            fileName: matches[1],
            line: parseInt(matches[2], 10)
        };
    }
}

function setBounds(firstLineError, lastLineError) {
    if (!longStackTracesIsSupported()) return;
    var firstStackLines = (firstLineError.stack || "").split("\n");
    var lastStackLines = (lastLineError.stack || "").split("\n");
    var firstIndex = -1;
    var lastIndex = -1;
    var firstFileName;
    var lastFileName;
    for (var i = 0; i < firstStackLines.length; ++i) {
        var result = parseLineInfo(firstStackLines[i]);
        if (result) {
            firstFileName = result.fileName;
            firstIndex = result.line;
            break;
        }
    }
    for (var i = 0; i < lastStackLines.length; ++i) {
        var result = parseLineInfo(lastStackLines[i]);
        if (result) {
            lastFileName = result.fileName;
            lastIndex = result.line;
            break;
        }
    }
    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||
        firstFileName !== lastFileName || firstIndex >= lastIndex) {
        return;
    }

    shouldIgnore = function(line) {
        if (bluebirdFramePattern.test(line)) return true;
        var info = parseLineInfo(line);
        if (info) {
            if (info.fileName === firstFileName &&
                (firstIndex <= info.line && info.line <= lastIndex)) {
                return true;
            }
        }
        return false;
    };
}

function CapturedTrace(parent) {
    this._parent = parent;
    this._promisesCreated = 0;
    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
    captureStackTrace(this, CapturedTrace);
    if (length > 32) this.uncycle();
}
util.inherits(CapturedTrace, Error);
Context.CapturedTrace = CapturedTrace;

CapturedTrace.prototype.uncycle = function() {
    var length = this._length;
    if (length < 2) return;
    var nodes = [];
    var stackToIndex = {};

    for (var i = 0, node = this; node !== undefined; ++i) {
        nodes.push(node);
        node = node._parent;
    }
    length = this._length = i;
    for (var i = length - 1; i >= 0; --i) {
        var stack = nodes[i].stack;
        if (stackToIndex[stack] === undefined) {
            stackToIndex[stack] = i;
        }
    }
    for (var i = 0; i < length; ++i) {
        var currentStack = nodes[i].stack;
        var index = stackToIndex[currentStack];
        if (index !== undefined && index !== i) {
            if (index > 0) {
                nodes[index - 1]._parent = undefined;
                nodes[index - 1]._length = 1;
            }
            nodes[i]._parent = undefined;
            nodes[i]._length = 1;
            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;

            if (index < length - 1) {
                cycleEdgeNode._parent = nodes[index + 1];
                cycleEdgeNode._parent.uncycle();
                cycleEdgeNode._length =
                    cycleEdgeNode._parent._length + 1;
            } else {
                cycleEdgeNode._parent = undefined;
                cycleEdgeNode._length = 1;
            }
            var currentChildLength = cycleEdgeNode._length + 1;
            for (var j = i - 2; j >= 0; --j) {
                nodes[j]._length = currentChildLength;
                currentChildLength++;
            }
            return;
        }
    }
};

CapturedTrace.prototype.attachExtraTrace = function(error) {
    if (error.__stackCleaned__) return;
    this.uncycle();
    var parsed = parseStackAndMessage(error);
    var message = parsed.message;
    var stacks = [parsed.stack];

    var trace = this;
    while (trace !== undefined) {
        stacks.push(cleanStack(trace.stack.split("\n")));
        trace = trace._parent;
    }
    removeCommonRoots(stacks);
    removeDuplicateOrEmptyJumps(stacks);
    util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
    util.notEnumerableProp(error, "__stackCleaned__", true);
};

var captureStackTrace = (function stackDetection() {
    var v8stackFramePattern = /^\s*at\s*/;
    var v8stackFormatter = function(stack, error) {
        if (typeof stack === "string") return stack;

        if (error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    if (typeof Error.stackTraceLimit === "number" &&
        typeof Error.captureStackTrace === "function") {
        Error.stackTraceLimit += 6;
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        var captureStackTrace = Error.captureStackTrace;

        shouldIgnore = function(line) {
            return bluebirdFramePattern.test(line);
        };
        return function(receiver, ignoreUntil) {
            Error.stackTraceLimit += 6;
            captureStackTrace(receiver, ignoreUntil);
            Error.stackTraceLimit -= 6;
        };
    }
    var err = new Error();

    if (typeof err.stack === "string" &&
        err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
        stackFramePattern = /@/;
        formatStack = v8stackFormatter;
        indentStackFrames = true;
        return function captureStackTrace(o) {
            o.stack = new Error().stack;
        };
    }

    var hasStackAfterThrow;
    try { throw new Error(); }
    catch(e) {
        hasStackAfterThrow = ("stack" in e);
    }
    if (!("stack" in err) && hasStackAfterThrow &&
        typeof Error.stackTraceLimit === "number") {
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        return function captureStackTrace(o) {
            Error.stackTraceLimit += 6;
            try { throw new Error(); }
            catch(e) { o.stack = e.stack; }
            Error.stackTraceLimit -= 6;
        };
    }

    formatStack = function(stack, error) {
        if (typeof stack === "string") return stack;

        if ((typeof error === "object" ||
            typeof error === "function") &&
            error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    return null;

})([]);

if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
    printWarning = function (message) {
        console.warn(message);
    };
    if (util.isNode && process.stderr.isTTY) {
        printWarning = function(message, isSoft) {
            var color = isSoft ? "\u001b[33m" : "\u001b[31m";
            console.warn(color + message + "\u001b[0m\n");
        };
    } else if (!util.isNode && typeof (new Error().stack) === "string") {
        printWarning = function(message, isSoft) {
            console.warn("%c" + message,
                        isSoft ? "color: darkorange" : "color: red");
        };
    }
}

var config = {
    warnings: warnings,
    longStackTraces: false,
    cancellation: false,
    monitoring: false,
    asyncHooks: false
};

if (longStackTraces) Promise.longStackTraces();

return {
    asyncHooks: function() {
        return config.asyncHooks;
    },
    longStackTraces: function() {
        return config.longStackTraces;
    },
    warnings: function() {
        return config.warnings;
    },
    cancellation: function() {
        return config.cancellation;
    },
    monitoring: function() {
        return config.monitoring;
    },
    propagateFromFunction: function() {
        return propagateFromFunction;
    },
    boundValueFunction: function() {
        return boundValueFunction;
    },
    checkForgottenReturns: checkForgottenReturns,
    setBounds: setBounds,
    warn: warn,
    deprecated: deprecated,
    CapturedTrace: CapturedTrace,
    fireDomEvent: fireDomEvent,
    fireGlobalEvent: fireGlobalEvent
};
};

},{"./errors":12,"./es5":13,"./util":36}],10:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
function returner() {
    return this.value;
}
function thrower() {
    throw this.reason;
}

Promise.prototype["return"] =
Promise.prototype.thenReturn = function (value) {
    if (value instanceof Promise) value.suppressUnhandledRejections();
    return this._then(
        returner, undefined, undefined, {value: value}, undefined);
};

Promise.prototype["throw"] =
Promise.prototype.thenThrow = function (reason) {
    return this._then(
        thrower, undefined, undefined, {reason: reason}, undefined);
};

Promise.prototype.catchThrow = function (reason) {
    if (arguments.length <= 1) {
        return this._then(
            undefined, thrower, undefined, {reason: reason}, undefined);
    } else {
        var _reason = arguments[1];
        var handler = function() {throw _reason;};
        return this.caught(reason, handler);
    }
};

Promise.prototype.catchReturn = function (value) {
    if (arguments.length <= 1) {
        if (value instanceof Promise) value.suppressUnhandledRejections();
        return this._then(
            undefined, returner, undefined, {value: value}, undefined);
    } else {
        var _value = arguments[1];
        if (_value instanceof Promise) _value.suppressUnhandledRejections();
        var handler = function() {return _value;};
        return this.caught(value, handler);
    }
};
};

},{}],11:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseReduce = Promise.reduce;
var PromiseAll = Promise.all;

function promiseAllThis() {
    return PromiseAll(this);
}

function PromiseMapSeries(promises, fn) {
    return PromiseReduce(promises, fn, INTERNAL, INTERNAL);
}

Promise.prototype.each = function (fn) {
    return PromiseReduce(this, fn, INTERNAL, 0)
              ._then(promiseAllThis, undefined, undefined, this, undefined);
};

Promise.prototype.mapSeries = function (fn) {
    return PromiseReduce(this, fn, INTERNAL, INTERNAL);
};

Promise.each = function (promises, fn) {
    return PromiseReduce(promises, fn, INTERNAL, 0)
              ._then(promiseAllThis, undefined, undefined, promises, undefined);
};

Promise.mapSeries = PromiseMapSeries;
};


},{}],12:[function(_dereq_,module,exports){
"use strict";
var es5 = _dereq_("./es5");
var Objectfreeze = es5.freeze;
var util = _dereq_("./util");
var inherits = util.inherits;
var notEnumerableProp = util.notEnumerableProp;

function subError(nameProperty, defaultMessage) {
    function SubError(message) {
        if (!(this instanceof SubError)) return new SubError(message);
        notEnumerableProp(this, "message",
            typeof message === "string" ? message : defaultMessage);
        notEnumerableProp(this, "name", nameProperty);
        if (Error.captureStackTrace) {
            Error.captureStackTrace(this, this.constructor);
        } else {
            Error.call(this);
        }
    }
    inherits(SubError, Error);
    return SubError;
}

var _TypeError, _RangeError;
var Warning = subError("Warning", "warning");
var CancellationError = subError("CancellationError", "cancellation error");
var TimeoutError = subError("TimeoutError", "timeout error");
var AggregateError = subError("AggregateError", "aggregate error");
try {
    _TypeError = TypeError;
    _RangeError = RangeError;
} catch(e) {
    _TypeError = subError("TypeError", "type error");
    _RangeError = subError("RangeError", "range error");
}

var methods = ("join pop push shift unshift slice filter forEach some " +
    "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" ");

for (var i = 0; i < methods.length; ++i) {
    if (typeof Array.prototype[methods[i]] === "function") {
        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];
    }
}

es5.defineProperty(AggregateError.prototype, "length", {
    value: 0,
    configurable: false,
    writable: true,
    enumerable: true
});
AggregateError.prototype["isOperational"] = true;
var level = 0;
AggregateError.prototype.toString = function() {
    var indent = Array(level * 4 + 1).join(" ");
    var ret = "\n" + indent + "AggregateError of:" + "\n";
    level++;
    indent = Array(level * 4 + 1).join(" ");
    for (var i = 0; i < this.length; ++i) {
        var str = this[i] === this ? "[Circular AggregateError]" : this[i] + "";
        var lines = str.split("\n");
        for (var j = 0; j < lines.length; ++j) {
            lines[j] = indent + lines[j];
        }
        str = lines.join("\n");
        ret += str + "\n";
    }
    level--;
    return ret;
};

function OperationalError(message) {
    if (!(this instanceof OperationalError))
        return new OperationalError(message);
    notEnumerableProp(this, "name", "OperationalError");
    notEnumerableProp(this, "message", message);
    this.cause = message;
    this["isOperational"] = true;

    if (message instanceof Error) {
        notEnumerableProp(this, "message", message.message);
        notEnumerableProp(this, "stack", message.stack);
    } else if (Error.captureStackTrace) {
        Error.captureStackTrace(this, this.constructor);
    }

}
inherits(OperationalError, Error);

var errorTypes = Error["__BluebirdErrorTypes__"];
if (!errorTypes) {
    errorTypes = Objectfreeze({
        CancellationError: CancellationError,
        TimeoutError: TimeoutError,
        OperationalError: OperationalError,
        RejectionError: OperationalError,
        AggregateError: AggregateError
    });
    es5.defineProperty(Error, "__BluebirdErrorTypes__", {
        value: errorTypes,
        writable: false,
        enumerable: false,
        configurable: false
    });
}

module.exports = {
    Error: Error,
    TypeError: _TypeError,
    RangeError: _RangeError,
    CancellationError: errorTypes.CancellationError,
    OperationalError: errorTypes.OperationalError,
    TimeoutError: errorTypes.TimeoutError,
    AggregateError: errorTypes.AggregateError,
    Warning: Warning
};

},{"./es5":13,"./util":36}],13:[function(_dereq_,module,exports){
var isES5 = (function(){
    "use strict";
    return this === undefined;
})();

if (isES5) {
    module.exports = {
        freeze: Object.freeze,
        defineProperty: Object.defineProperty,
        getDescriptor: Object.getOwnPropertyDescriptor,
        keys: Object.keys,
        names: Object.getOwnPropertyNames,
        getPrototypeOf: Object.getPrototypeOf,
        isArray: Array.isArray,
        isES5: isES5,
        propertyIsWritable: function(obj, prop) {
            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
            return !!(!descriptor || descriptor.writable || descriptor.set);
        }
    };
} else {
    var has = {}.hasOwnProperty;
    var str = {}.toString;
    var proto = {}.constructor.prototype;

    var ObjectKeys = function (o) {
        var ret = [];
        for (var key in o) {
            if (has.call(o, key)) {
                ret.push(key);
            }
        }
        return ret;
    };

    var ObjectGetDescriptor = function(o, key) {
        return {value: o[key]};
    };

    var ObjectDefineProperty = function (o, key, desc) {
        o[key] = desc.value;
        return o;
    };

    var ObjectFreeze = function (obj) {
        return obj;
    };

    var ObjectGetPrototypeOf = function (obj) {
        try {
            return Object(obj).constructor.prototype;
        }
        catch (e) {
            return proto;
        }
    };

    var ArrayIsArray = function (obj) {
        try {
            return str.call(obj) === "[object Array]";
        }
        catch(e) {
            return false;
        }
    };

    module.exports = {
        isArray: ArrayIsArray,
        keys: ObjectKeys,
        names: ObjectKeys,
        defineProperty: ObjectDefineProperty,
        getDescriptor: ObjectGetDescriptor,
        freeze: ObjectFreeze,
        getPrototypeOf: ObjectGetPrototypeOf,
        isES5: isES5,
        propertyIsWritable: function() {
            return true;
        }
    };
}

},{}],14:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseMap = Promise.map;

Promise.prototype.filter = function (fn, options) {
    return PromiseMap(this, fn, options, INTERNAL);
};

Promise.filter = function (promises, fn, options) {
    return PromiseMap(promises, fn, options, INTERNAL);
};
};

},{}],15:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) {
var util = _dereq_("./util");
var CancellationError = Promise.CancellationError;
var errorObj = util.errorObj;
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);

function PassThroughHandlerContext(promise, type, handler) {
    this.promise = promise;
    this.type = type;
    this.handler = handler;
    this.called = false;
    this.cancelPromise = null;
}

PassThroughHandlerContext.prototype.isFinallyHandler = function() {
    return this.type === 0;
};

function FinallyHandlerCancelReaction(finallyHandler) {
    this.finallyHandler = finallyHandler;
}

FinallyHandlerCancelReaction.prototype._resultCancelled = function() {
    checkCancel(this.finallyHandler);
};

function checkCancel(ctx, reason) {
    if (ctx.cancelPromise != null) {
        if (arguments.length > 1) {
            ctx.cancelPromise._reject(reason);
        } else {
            ctx.cancelPromise._cancel();
        }
        ctx.cancelPromise = null;
        return true;
    }
    return false;
}

function succeed() {
    return finallyHandler.call(this, this.promise._target()._settledValue());
}
function fail(reason) {
    if (checkCancel(this, reason)) return;
    errorObj.e = reason;
    return errorObj;
}
function finallyHandler(reasonOrValue) {
    var promise = this.promise;
    var handler = this.handler;

    if (!this.called) {
        this.called = true;
        var ret = this.isFinallyHandler()
            ? handler.call(promise._boundValue())
            : handler.call(promise._boundValue(), reasonOrValue);
        if (ret === NEXT_FILTER) {
            return ret;
        } else if (ret !== undefined) {
            promise._setReturnedNonUndefined();
            var maybePromise = tryConvertToPromise(ret, promise);
            if (maybePromise instanceof Promise) {
                if (this.cancelPromise != null) {
                    if (maybePromise._isCancelled()) {
                        var reason =
                            new CancellationError("late cancellation observer");
                        promise._attachExtraTrace(reason);
                        errorObj.e = reason;
                        return errorObj;
                    } else if (maybePromise.isPending()) {
                        maybePromise._attachCancellationCallback(
                            new FinallyHandlerCancelReaction(this));
                    }
                }
                return maybePromise._then(
                    succeed, fail, undefined, this, undefined);
            }
        }
    }

    if (promise.isRejected()) {
        checkCancel(this);
        errorObj.e = reasonOrValue;
        return errorObj;
    } else {
        checkCancel(this);
        return reasonOrValue;
    }
}

Promise.prototype._passThrough = function(handler, type, success, fail) {
    if (typeof handler !== "function") return this.then();
    return this._then(success,
                      fail,
                      undefined,
                      new PassThroughHandlerContext(this, type, handler),
                      undefined);
};

Promise.prototype.lastly =
Promise.prototype["finally"] = function (handler) {
    return this._passThrough(handler,
                             0,
                             finallyHandler,
                             finallyHandler);
};


Promise.prototype.tap = function (handler) {
    return this._passThrough(handler, 1, finallyHandler);
};

Promise.prototype.tapCatch = function (handlerOrPredicate) {
    var len = arguments.length;
    if(len === 1) {
        return this._passThrough(handlerOrPredicate,
                                 1,
                                 undefined,
                                 finallyHandler);
    } else {
         var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return Promise.reject(new TypeError(
                    "tapCatch statement predicate: "
                    + "expecting an object but got " + util.classString(item)
                ));
            }
        }
        catchInstances.length = j;
        var handler = arguments[i];
        return this._passThrough(catchFilter(catchInstances, handler, this),
                                 1,
                                 undefined,
                                 finallyHandler);
    }

};

return PassThroughHandlerContext;
};

},{"./catch_filter":7,"./util":36}],16:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise,
                          apiRejection,
                          INTERNAL,
                          tryConvertToPromise,
                          Proxyable,
                          debug) {
var errors = _dereq_("./errors");
var TypeError = errors.TypeError;
var util = _dereq_("./util");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
var yieldHandlers = [];

function promiseFromYieldHandler(value, yieldHandlers, traceParent) {
    for (var i = 0; i < yieldHandlers.length; ++i) {
        traceParent._pushContext();
        var result = tryCatch(yieldHandlers[i])(value);
        traceParent._popContext();
        if (result === errorObj) {
            traceParent._pushContext();
            var ret = Promise.reject(errorObj.e);
            traceParent._popContext();
            return ret;
        }
        var maybePromise = tryConvertToPromise(result, traceParent);
        if (maybePromise instanceof Promise) return maybePromise;
    }
    return null;
}

function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
    if (debug.cancellation()) {
        var internal = new Promise(INTERNAL);
        var _finallyPromise = this._finallyPromise = new Promise(INTERNAL);
        this._promise = internal.lastly(function() {
            return _finallyPromise;
        });
        internal._captureStackTrace();
        internal._setOnCancel(this);
    } else {
        var promise = this._promise = new Promise(INTERNAL);
        promise._captureStackTrace();
    }
    this._stack = stack;
    this._generatorFunction = generatorFunction;
    this._receiver = receiver;
    this._generator = undefined;
    this._yieldHandlers = typeof yieldHandler === "function"
        ? [yieldHandler].concat(yieldHandlers)
        : yieldHandlers;
    this._yieldedPromise = null;
    this._cancellationPhase = false;
}
util.inherits(PromiseSpawn, Proxyable);

PromiseSpawn.prototype._isResolved = function() {
    return this._promise === null;
};

PromiseSpawn.prototype._cleanup = function() {
    this._promise = this._generator = null;
    if (debug.cancellation() && this._finallyPromise !== null) {
        this._finallyPromise._fulfill();
        this._finallyPromise = null;
    }
};

PromiseSpawn.prototype._promiseCancelled = function() {
    if (this._isResolved()) return;
    var implementsReturn = typeof this._generator["return"] !== "undefined";

    var result;
    if (!implementsReturn) {
        var reason = new Promise.CancellationError(
            "generator .return() sentinel");
        Promise.coroutine.returnSentinel = reason;
        this._promise._attachExtraTrace(reason);
        this._promise._pushContext();
        result = tryCatch(this._generator["throw"]).call(this._generator,
                                                         reason);
        this._promise._popContext();
    } else {
        this._promise._pushContext();
        result = tryCatch(this._generator["return"]).call(this._generator,
                                                          undefined);
        this._promise._popContext();
    }
    this._cancellationPhase = true;
    this._yieldedPromise = null;
    this._continue(result);
};

PromiseSpawn.prototype._promiseFulfilled = function(value) {
    this._yieldedPromise = null;
    this._promise._pushContext();
    var result = tryCatch(this._generator.next).call(this._generator, value);
    this._promise._popContext();
    this._continue(result);
};

PromiseSpawn.prototype._promiseRejected = function(reason) {
    this._yieldedPromise = null;
    this._promise._attachExtraTrace(reason);
    this._promise._pushContext();
    var result = tryCatch(this._generator["throw"])
        .call(this._generator, reason);
    this._promise._popContext();
    this._continue(result);
};

PromiseSpawn.prototype._resultCancelled = function() {
    if (this._yieldedPromise instanceof Promise) {
        var promise = this._yieldedPromise;
        this._yieldedPromise = null;
        promise.cancel();
    }
};

PromiseSpawn.prototype.promise = function () {
    return this._promise;
};

PromiseSpawn.prototype._run = function () {
    this._generator = this._generatorFunction.call(this._receiver);
    this._receiver =
        this._generatorFunction = undefined;
    this._promiseFulfilled(undefined);
};

PromiseSpawn.prototype._continue = function (result) {
    var promise = this._promise;
    if (result === errorObj) {
        this._cleanup();
        if (this._cancellationPhase) {
            return promise.cancel();
        } else {
            return promise._rejectCallback(result.e, false);
        }
    }

    var value = result.value;
    if (result.done === true) {
        this._cleanup();
        if (this._cancellationPhase) {
            return promise.cancel();
        } else {
            return promise._resolveCallback(value);
        }
    } else {
        var maybePromise = tryConvertToPromise(value, this._promise);
        if (!(maybePromise instanceof Promise)) {
            maybePromise =
                promiseFromYieldHandler(maybePromise,
                                        this._yieldHandlers,
                                        this._promise);
            if (maybePromise === null) {
                this._promiseRejected(
                    new TypeError(
                        "A value %s was yielded that could not be treated as a promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", String(value)) +
                        "From coroutine:\u000a" +
                        this._stack.split("\n").slice(1, -7).join("\n")
                    )
                );
                return;
            }
        }
        maybePromise = maybePromise._target();
        var bitField = maybePromise._bitField;
        ;
        if (((bitField & 50397184) === 0)) {
            this._yieldedPromise = maybePromise;
            maybePromise._proxy(this, null);
        } else if (((bitField & 33554432) !== 0)) {
            Promise._async.invoke(
                this._promiseFulfilled, this, maybePromise._value()
            );
        } else if (((bitField & 16777216) !== 0)) {
            Promise._async.invoke(
                this._promiseRejected, this, maybePromise._reason()
            );
        } else {
            this._promiseCancelled();
        }
    }
};

Promise.coroutine = function (generatorFunction, options) {
    if (typeof generatorFunction !== "function") {
        throw new TypeError("generatorFunction must be a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var yieldHandler = Object(options).yieldHandler;
    var PromiseSpawn$ = PromiseSpawn;
    var stack = new Error().stack;
    return function () {
        var generator = generatorFunction.apply(this, arguments);
        var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,
                                      stack);
        var ret = spawn.promise();
        spawn._generator = generator;
        spawn._promiseFulfilled(undefined);
        return ret;
    };
};

Promise.coroutine.addYieldHandler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    yieldHandlers.push(fn);
};

Promise.spawn = function (generatorFunction) {
    debug.deprecated("Promise.spawn()", "Promise.coroutine()");
    if (typeof generatorFunction !== "function") {
        return apiRejection("generatorFunction must be a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var spawn = new PromiseSpawn(generatorFunction, this);
    var ret = spawn.promise();
    spawn._run(Promise.spawn);
    return ret;
};
};

},{"./errors":12,"./util":36}],17:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) {
var util = _dereq_("./util");
var canEvaluate = util.canEvaluate;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var reject;

if (!true) {
if (canEvaluate) {
    var thenCallback = function(i) {
        return new Function("value", "holder", "                             \n\
            'use strict';                                                    \n\
            holder.pIndex = value;                                           \n\
            holder.checkFulfillment(this);                                   \n\
            ".replace(/Index/g, i));
    };

    var promiseSetter = function(i) {
        return new Function("promise", "holder", "                           \n\
            'use strict';                                                    \n\
            holder.pIndex = promise;                                         \n\
            ".replace(/Index/g, i));
    };

    var generateHolderClass = function(total) {
        var props = new Array(total);
        for (var i = 0; i < props.length; ++i) {
            props[i] = "this.p" + (i+1);
        }
        var assignment = props.join(" = ") + " = null;";
        var cancellationCode= "var promise;\n" + props.map(function(prop) {
            return "                                                         \n\
                promise = " + prop + ";                                      \n\
                if (promise instanceof Promise) {                            \n\
                    promise.cancel();                                        \n\
                }                                                            \n\
            ";
        }).join("\n");
        var passedArguments = props.join(", ");
        var name = "Holder$" + total;


        var code = "return function(tryCatch, errorObj, Promise, async) {    \n\
            'use strict';                                                    \n\
            function [TheName](fn) {                                         \n\
                [TheProperties]                                              \n\
                this.fn = fn;                                                \n\
                this.asyncNeeded = true;                                     \n\
                this.now = 0;                                                \n\
            }                                                                \n\
                                                                             \n\
            [TheName].prototype._callFunction = function(promise) {          \n\
                promise._pushContext();                                      \n\
                var ret = tryCatch(this.fn)([ThePassedArguments]);           \n\
                promise._popContext();                                       \n\
                if (ret === errorObj) {                                      \n\
                    promise._rejectCallback(ret.e, false);                   \n\
                } else {                                                     \n\
                    promise._resolveCallback(ret);                           \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype.checkFulfillment = function(promise) {       \n\
                var now = ++this.now;                                        \n\
                if (now === [TheTotal]) {                                    \n\
                    if (this.asyncNeeded) {                                  \n\
                        async.invoke(this._callFunction, this, promise);     \n\
                    } else {                                                 \n\
                        this._callFunction(promise);                         \n\
                    }                                                        \n\
                                                                             \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype._resultCancelled = function() {              \n\
                [CancellationCode]                                           \n\
            };                                                               \n\
                                                                             \n\
            return [TheName];                                                \n\
        }(tryCatch, errorObj, Promise, async);                               \n\
        ";

        code = code.replace(/\[TheName\]/g, name)
            .replace(/\[TheTotal\]/g, total)
            .replace(/\[ThePassedArguments\]/g, passedArguments)
            .replace(/\[TheProperties\]/g, assignment)
            .replace(/\[CancellationCode\]/g, cancellationCode);

        return new Function("tryCatch", "errorObj", "Promise", "async", code)
                           (tryCatch, errorObj, Promise, async);
    };

    var holderClasses = [];
    var thenCallbacks = [];
    var promiseSetters = [];

    for (var i = 0; i < 8; ++i) {
        holderClasses.push(generateHolderClass(i + 1));
        thenCallbacks.push(thenCallback(i + 1));
        promiseSetters.push(promiseSetter(i + 1));
    }

    reject = function (reason) {
        this._reject(reason);
    };
}}

Promise.join = function () {
    var last = arguments.length - 1;
    var fn;
    if (last > 0 && typeof arguments[last] === "function") {
        fn = arguments[last];
        if (!true) {
            if (last <= 8 && canEvaluate) {
                var ret = new Promise(INTERNAL);
                ret._captureStackTrace();
                var HolderClass = holderClasses[last - 1];
                var holder = new HolderClass(fn);
                var callbacks = thenCallbacks;

                for (var i = 0; i < last; ++i) {
                    var maybePromise = tryConvertToPromise(arguments[i], ret);
                    if (maybePromise instanceof Promise) {
                        maybePromise = maybePromise._target();
                        var bitField = maybePromise._bitField;
                        ;
                        if (((bitField & 50397184) === 0)) {
                            maybePromise._then(callbacks[i], reject,
                                               undefined, ret, holder);
                            promiseSetters[i](maybePromise, holder);
                            holder.asyncNeeded = false;
                        } else if (((bitField & 33554432) !== 0)) {
                            callbacks[i].call(ret,
                                              maybePromise._value(), holder);
                        } else if (((bitField & 16777216) !== 0)) {
                            ret._reject(maybePromise._reason());
                        } else {
                            ret._cancel();
                        }
                    } else {
                        callbacks[i].call(ret, maybePromise, holder);
                    }
                }

                if (!ret._isFateSealed()) {
                    if (holder.asyncNeeded) {
                        var context = Promise._getContext();
                        holder.fn = util.contextBind(context, holder.fn);
                    }
                    ret._setAsyncGuaranteed();
                    ret._setOnCancel(holder);
                }
                return ret;
            }
        }
    }
    var args = [].slice.call(arguments);;
    if (fn) args.pop();
    var ret = new PromiseArray(args).promise();
    return fn !== undefined ? ret.spread(fn) : ret;
};

};

},{"./util":36}],18:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise,
                          PromiseArray,
                          apiRejection,
                          tryConvertToPromise,
                          INTERNAL,
                          debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

function MappingPromiseArray(promises, fn, limit, _filter) {
    this.constructor$(promises);
    this._promise._captureStackTrace();
    var context = Promise._getContext();
    this._callback = util.contextBind(context, fn);
    this._preservedValues = _filter === INTERNAL
        ? new Array(this.length())
        : null;
    this._limit = limit;
    this._inFlight = 0;
    this._queue = [];
    async.invoke(this._asyncInit, this, undefined);
    if (util.isArray(promises)) {
        for (var i = 0; i < promises.length; ++i) {
            var maybePromise = promises[i];
            if (maybePromise instanceof Promise) {
                maybePromise.suppressUnhandledRejections();
            }
        }
    }
}
util.inherits(MappingPromiseArray, PromiseArray);

MappingPromiseArray.prototype._asyncInit = function() {
    this._init$(undefined, -2);
};

MappingPromiseArray.prototype._init = function () {};

MappingPromiseArray.prototype._promiseFulfilled = function (value, index) {
    var values = this._values;
    var length = this.length();
    var preservedValues = this._preservedValues;
    var limit = this._limit;

    if (index < 0) {
        index = (index * -1) - 1;
        values[index] = value;
        if (limit >= 1) {
            this._inFlight--;
            this._drainQueue();
            if (this._isResolved()) return true;
        }
    } else {
        if (limit >= 1 && this._inFlight >= limit) {
            values[index] = value;
            this._queue.push(index);
            return false;
        }
        if (preservedValues !== null) preservedValues[index] = value;

        var promise = this._promise;
        var callback = this._callback;
        var receiver = promise._boundValue();
        promise._pushContext();
        var ret = tryCatch(callback).call(receiver, value, index, length);
        var promiseCreated = promise._popContext();
        debug.checkForgottenReturns(
            ret,
            promiseCreated,
            preservedValues !== null ? "Promise.filter" : "Promise.map",
            promise
        );
        if (ret === errorObj) {
            this._reject(ret.e);
            return true;
        }

        var maybePromise = tryConvertToPromise(ret, this._promise);
        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            var bitField = maybePromise._bitField;
            ;
            if (((bitField & 50397184) === 0)) {
                if (limit >= 1) this._inFlight++;
                values[index] = maybePromise;
                maybePromise._proxy(this, (index + 1) * -1);
                return false;
            } else if (((bitField & 33554432) !== 0)) {
                ret = maybePromise._value();
            } else if (((bitField & 16777216) !== 0)) {
                this._reject(maybePromise._reason());
                return true;
            } else {
                this._cancel();
                return true;
            }
        }
        values[index] = ret;
    }
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= length) {
        if (preservedValues !== null) {
            this._filter(values, preservedValues);
        } else {
            this._resolve(values);
        }
        return true;
    }
    return false;
};

MappingPromiseArray.prototype._drainQueue = function () {
    var queue = this._queue;
    var limit = this._limit;
    var values = this._values;
    while (queue.length > 0 && this._inFlight < limit) {
        if (this._isResolved()) return;
        var index = queue.pop();
        this._promiseFulfilled(values[index], index);
    }
};

MappingPromiseArray.prototype._filter = function (booleans, values) {
    var len = values.length;
    var ret = new Array(len);
    var j = 0;
    for (var i = 0; i < len; ++i) {
        if (booleans[i]) ret[j++] = values[i];
    }
    ret.length = j;
    this._resolve(ret);
};

MappingPromiseArray.prototype.preservedValues = function () {
    return this._preservedValues;
};

function map(promises, fn, options, _filter) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }

    var limit = 0;
    if (options !== undefined) {
        if (typeof options === "object" && options !== null) {
            if (typeof options.concurrency !== "number") {
                return Promise.reject(
                    new TypeError("'concurrency' must be a number but it is " +
                                    util.classString(options.concurrency)));
            }
            limit = options.concurrency;
        } else {
            return Promise.reject(new TypeError(
                            "options argument must be an object but it is " +
                             util.classString(options)));
        }
    }
    limit = typeof limit === "number" &&
        isFinite(limit) && limit >= 1 ? limit : 0;
    return new MappingPromiseArray(promises, fn, limit, _filter).promise();
}

Promise.prototype.map = function (fn, options) {
    return map(this, fn, options, null);
};

Promise.map = function (promises, fn, options, _filter) {
    return map(promises, fn, options, _filter);
};


};

},{"./util":36}],19:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;

Promise.method = function (fn) {
    if (typeof fn !== "function") {
        throw new Promise.TypeError("expecting a function but got " + util.classString(fn));
    }
    return function () {
        var ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._pushContext();
        var value = tryCatch(fn).apply(this, arguments);
        var promiseCreated = ret._popContext();
        debug.checkForgottenReturns(
            value, promiseCreated, "Promise.method", ret);
        ret._resolveFromSyncValue(value);
        return ret;
    };
};

Promise.attempt = Promise["try"] = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._pushContext();
    var value;
    if (arguments.length > 1) {
        debug.deprecated("calling Promise.try with more than 1 argument");
        var arg = arguments[1];
        var ctx = arguments[2];
        value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg)
                                  : tryCatch(fn).call(ctx, arg);
    } else {
        value = tryCatch(fn)();
    }
    var promiseCreated = ret._popContext();
    debug.checkForgottenReturns(
        value, promiseCreated, "Promise.try", ret);
    ret._resolveFromSyncValue(value);
    return ret;
};

Promise.prototype._resolveFromSyncValue = function (value) {
    if (value === util.errorObj) {
        this._rejectCallback(value.e, false);
    } else {
        this._resolveCallback(value, true);
    }
};
};

},{"./util":36}],20:[function(_dereq_,module,exports){
"use strict";
var util = _dereq_("./util");
var maybeWrapAsError = util.maybeWrapAsError;
var errors = _dereq_("./errors");
var OperationalError = errors.OperationalError;
var es5 = _dereq_("./es5");

function isUntypedError(obj) {
    return obj instanceof Error &&
        es5.getPrototypeOf(obj) === Error.prototype;
}

var rErrorKey = /^(?:name|message|stack|cause)$/;
function wrapAsOperationalError(obj) {
    var ret;
    if (isUntypedError(obj)) {
        ret = new OperationalError(obj);
        ret.name = obj.name;
        ret.message = obj.message;
        ret.stack = obj.stack;
        var keys = es5.keys(obj);
        for (var i = 0; i < keys.length; ++i) {
            var key = keys[i];
            if (!rErrorKey.test(key)) {
                ret[key] = obj[key];
            }
        }
        return ret;
    }
    util.markAsOriginatingFromRejection(obj);
    return obj;
}

function nodebackForPromise(promise, multiArgs) {
    return function(err, value) {
        if (promise === null) return;
        if (err) {
            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));
            promise._attachExtraTrace(wrapped);
            promise._reject(wrapped);
        } else if (!multiArgs) {
            promise._fulfill(value);
        } else {
            var args = [].slice.call(arguments, 1);;
            promise._fulfill(args);
        }
        promise = null;
    };
}

module.exports = nodebackForPromise;

},{"./errors":12,"./es5":13,"./util":36}],21:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
var util = _dereq_("./util");
var async = Promise._async;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function spreadAdapter(val, nodeback) {
    var promise = this;
    if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);
    var ret =
        tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}

function successAdapter(val, nodeback) {
    var promise = this;
    var receiver = promise._boundValue();
    var ret = val === undefined
        ? tryCatch(nodeback).call(receiver, null)
        : tryCatch(nodeback).call(receiver, null, val);
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}
function errorAdapter(reason, nodeback) {
    var promise = this;
    if (!reason) {
        var newReason = new Error(reason + "");
        newReason.cause = reason;
        reason = newReason;
    }
    var ret = tryCatch(nodeback).call(promise._boundValue(), reason);
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}

Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback,
                                                                     options) {
    if (typeof nodeback == "function") {
        var adapter = successAdapter;
        if (options !== undefined && Object(options).spread) {
            adapter = spreadAdapter;
        }
        this._then(
            adapter,
            errorAdapter,
            undefined,
            this,
            nodeback
        );
    }
    return this;
};
};

},{"./util":36}],22:[function(_dereq_,module,exports){
"use strict";
module.exports = function() {
var makeSelfResolutionError = function () {
    return new TypeError("circular promise resolution chain\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var reflectHandler = function() {
    return new Promise.PromiseInspection(this._target());
};
var apiRejection = function(msg) {
    return Promise.reject(new TypeError(msg));
};
function Proxyable() {}
var UNDEFINED_BINDING = {};
var util = _dereq_("./util");
util.setReflectHandler(reflectHandler);

var getDomain = function() {
    var domain = process.domain;
    if (domain === undefined) {
        return null;
    }
    return domain;
};
var getContextDefault = function() {
    return null;
};
var getContextDomain = function() {
    return {
        domain: getDomain(),
        async: null
    };
};
var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ?
    _dereq_("async_hooks").AsyncResource : null;
var getContextAsyncHooks = function() {
    return {
        domain: getDomain(),
        async: new AsyncResource("Bluebird::Promise")
    };
};
var getContext = util.isNode ? getContextDomain : getContextDefault;
util.notEnumerableProp(Promise, "_getContext", getContext);
var enableAsyncHooks = function() {
    getContext = getContextAsyncHooks;
    util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks);
};
var disableAsyncHooks = function() {
    getContext = getContextDomain;
    util.notEnumerableProp(Promise, "_getContext", getContextDomain);
};

var es5 = _dereq_("./es5");
var Async = _dereq_("./async");
var async = new Async();
es5.defineProperty(Promise, "_async", {value: async});
var errors = _dereq_("./errors");
var TypeError = Promise.TypeError = errors.TypeError;
Promise.RangeError = errors.RangeError;
var CancellationError = Promise.CancellationError = errors.CancellationError;
Promise.TimeoutError = errors.TimeoutError;
Promise.OperationalError = errors.OperationalError;
Promise.RejectionError = errors.OperationalError;
Promise.AggregateError = errors.AggregateError;
var INTERNAL = function(){};
var APPLY = {};
var NEXT_FILTER = {};
var tryConvertToPromise = _dereq_("./thenables")(Promise, INTERNAL);
var PromiseArray =
    _dereq_("./promise_array")(Promise, INTERNAL,
                               tryConvertToPromise, apiRejection, Proxyable);
var Context = _dereq_("./context")(Promise);
 /*jshint unused:false*/
var createContext = Context.create;

var debug = _dereq_("./debuggability")(Promise, Context,
    enableAsyncHooks, disableAsyncHooks);
var CapturedTrace = debug.CapturedTrace;
var PassThroughHandlerContext =
    _dereq_("./finally")(Promise, tryConvertToPromise, NEXT_FILTER);
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);
var nodebackForPromise = _dereq_("./nodeback");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
function check(self, executor) {
    if (self == null || self.constructor !== Promise) {
        throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (typeof executor !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(executor));
    }

}

function Promise(executor) {
    if (executor !== INTERNAL) {
        check(this, executor);
    }
    this._bitField = 0;
    this._fulfillmentHandler0 = undefined;
    this._rejectionHandler0 = undefined;
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._resolveFromExecutor(executor);
    this._promiseCreated();
    this._fireEvent("promiseCreated", this);
}

Promise.prototype.toString = function () {
    return "[object Promise]";
};

Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {
    var len = arguments.length;
    if (len > 1) {
        var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return apiRejection("Catch statement predicate: " +
                    "expecting an object but got " + util.classString(item));
            }
        }
        catchInstances.length = j;
        fn = arguments[i];

        if (typeof fn !== "function") {
            throw new TypeError("The last argument to .catch() " +
                "must be a function, got " + util.toString(fn));
        }
        return this.then(undefined, catchFilter(catchInstances, fn, this));
    }
    return this.then(undefined, fn);
};

Promise.prototype.reflect = function () {
    return this._then(reflectHandler,
        reflectHandler, undefined, this, undefined);
};

Promise.prototype.then = function (didFulfill, didReject) {
    if (debug.warnings() && arguments.length > 0 &&
        typeof didFulfill !== "function" &&
        typeof didReject !== "function") {
        var msg = ".then() only accepts functions but was passed: " +
                util.classString(didFulfill);
        if (arguments.length > 1) {
            msg += ", " + util.classString(didReject);
        }
        this._warn(msg);
    }
    return this._then(didFulfill, didReject, undefined, undefined, undefined);
};

Promise.prototype.done = function (didFulfill, didReject) {
    var promise =
        this._then(didFulfill, didReject, undefined, undefined, undefined);
    promise._setIsFinal();
};

Promise.prototype.spread = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    return this.all()._then(fn, undefined, undefined, APPLY, undefined);
};

Promise.prototype.toJSON = function () {
    var ret = {
        isFulfilled: false,
        isRejected: false,
        fulfillmentValue: undefined,
        rejectionReason: undefined
    };
    if (this.isFulfilled()) {
        ret.fulfillmentValue = this.value();
        ret.isFulfilled = true;
    } else if (this.isRejected()) {
        ret.rejectionReason = this.reason();
        ret.isRejected = true;
    }
    return ret;
};

Promise.prototype.all = function () {
    if (arguments.length > 0) {
        this._warn(".all() was passed arguments but it does not take any");
    }
    return new PromiseArray(this).promise();
};

Promise.prototype.error = function (fn) {
    return this.caught(util.originatesFromRejection, fn);
};

Promise.getNewLibraryCopy = module.exports;

Promise.is = function (val) {
    return val instanceof Promise;
};

Promise.fromNode = Promise.fromCallback = function(fn) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs
                                         : false;
    var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));
    if (result === errorObj) {
        ret._rejectCallback(result.e, true);
    }
    if (!ret._isFateSealed()) ret._setAsyncGuaranteed();
    return ret;
};

Promise.all = function (promises) {
    return new PromiseArray(promises).promise();
};

Promise.cast = function (obj) {
    var ret = tryConvertToPromise(obj);
    if (!(ret instanceof Promise)) {
        ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._setFulfilled();
        ret._rejectionHandler0 = obj;
    }
    return ret;
};

Promise.resolve = Promise.fulfilled = Promise.cast;

Promise.reject = Promise.rejected = function (reason) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._rejectCallback(reason, true);
    return ret;
};

Promise.setScheduler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    return async.setScheduler(fn);
};

Promise.prototype._then = function (
    didFulfill,
    didReject,
    _,    receiver,
    internalData
) {
    var haveInternalData = internalData !== undefined;
    var promise = haveInternalData ? internalData : new Promise(INTERNAL);
    var target = this._target();
    var bitField = target._bitField;

    if (!haveInternalData) {
        promise._propagateFrom(this, 3);
        promise._captureStackTrace();
        if (receiver === undefined &&
            ((this._bitField & 2097152) !== 0)) {
            if (!((bitField & 50397184) === 0)) {
                receiver = this._boundValue();
            } else {
                receiver = target === this ? undefined : this._boundTo;
            }
        }
        this._fireEvent("promiseChained", this, promise);
    }

    var context = getContext();
    if (!((bitField & 50397184) === 0)) {
        var handler, value, settler = target._settlePromiseCtx;
        if (((bitField & 33554432) !== 0)) {
            value = target._rejectionHandler0;
            handler = didFulfill;
        } else if (((bitField & 16777216) !== 0)) {
            value = target._fulfillmentHandler0;
            handler = didReject;
            target._unsetRejectionIsUnhandled();
        } else {
            settler = target._settlePromiseLateCancellationObserver;
            value = new CancellationError("late cancellation observer");
            target._attachExtraTrace(value);
            handler = didReject;
        }

        async.invoke(settler, target, {
            handler: util.contextBind(context, handler),
            promise: promise,
            receiver: receiver,
            value: value
        });
    } else {
        target._addCallbacks(didFulfill, didReject, promise,
                receiver, context);
    }

    return promise;
};

Promise.prototype._length = function () {
    return this._bitField & 65535;
};

Promise.prototype._isFateSealed = function () {
    return (this._bitField & 117506048) !== 0;
};

Promise.prototype._isFollowing = function () {
    return (this._bitField & 67108864) === 67108864;
};

Promise.prototype._setLength = function (len) {
    this._bitField = (this._bitField & -65536) |
        (len & 65535);
};

Promise.prototype._setFulfilled = function () {
    this._bitField = this._bitField | 33554432;
    this._fireEvent("promiseFulfilled", this);
};

Promise.prototype._setRejected = function () {
    this._bitField = this._bitField | 16777216;
    this._fireEvent("promiseRejected", this);
};

Promise.prototype._setFollowing = function () {
    this._bitField = this._bitField | 67108864;
    this._fireEvent("promiseResolved", this);
};

Promise.prototype._setIsFinal = function () {
    this._bitField = this._bitField | 4194304;
};

Promise.prototype._isFinal = function () {
    return (this._bitField & 4194304) > 0;
};

Promise.prototype._unsetCancelled = function() {
    this._bitField = this._bitField & (~65536);
};

Promise.prototype._setCancelled = function() {
    this._bitField = this._bitField | 65536;
    this._fireEvent("promiseCancelled", this);
};

Promise.prototype._setWillBeCancelled = function() {
    this._bitField = this._bitField | 8388608;
};

Promise.prototype._setAsyncGuaranteed = function() {
    if (async.hasCustomScheduler()) return;
    var bitField = this._bitField;
    this._bitField = bitField |
        (((bitField & 536870912) >> 2) ^
        134217728);
};

Promise.prototype._setNoAsyncGuarantee = function() {
    this._bitField = (this._bitField | 536870912) &
        (~134217728);
};

Promise.prototype._receiverAt = function (index) {
    var ret = index === 0 ? this._receiver0 : this[
            index * 4 - 4 + 3];
    if (ret === UNDEFINED_BINDING) {
        return undefined;
    } else if (ret === undefined && this._isBound()) {
        return this._boundValue();
    }
    return ret;
};

Promise.prototype._promiseAt = function (index) {
    return this[
            index * 4 - 4 + 2];
};

Promise.prototype._fulfillmentHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 0];
};

Promise.prototype._rejectionHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 1];
};

Promise.prototype._boundValue = function() {};

Promise.prototype._migrateCallback0 = function (follower) {
    var bitField = follower._bitField;
    var fulfill = follower._fulfillmentHandler0;
    var reject = follower._rejectionHandler0;
    var promise = follower._promise0;
    var receiver = follower._receiverAt(0);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._migrateCallbackAt = function (follower, index) {
    var fulfill = follower._fulfillmentHandlerAt(index);
    var reject = follower._rejectionHandlerAt(index);
    var promise = follower._promiseAt(index);
    var receiver = follower._receiverAt(index);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._addCallbacks = function (
    fulfill,
    reject,
    promise,
    receiver,
    context
) {
    var index = this._length();

    if (index >= 65535 - 4) {
        index = 0;
        this._setLength(0);
    }

    if (index === 0) {
        this._promise0 = promise;
        this._receiver0 = receiver;
        if (typeof fulfill === "function") {
            this._fulfillmentHandler0 = util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this._rejectionHandler0 = util.contextBind(context, reject);
        }
    } else {
        var base = index * 4 - 4;
        this[base + 2] = promise;
        this[base + 3] = receiver;
        if (typeof fulfill === "function") {
            this[base + 0] =
                util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this[base + 1] =
                util.contextBind(context, reject);
        }
    }
    this._setLength(index + 1);
    return index;
};

Promise.prototype._proxy = function (proxyable, arg) {
    this._addCallbacks(undefined, undefined, arg, proxyable, null);
};

Promise.prototype._resolveCallback = function(value, shouldBind) {
    if (((this._bitField & 117506048) !== 0)) return;
    if (value === this)
        return this._rejectCallback(makeSelfResolutionError(), false);
    var maybePromise = tryConvertToPromise(value, this);
    if (!(maybePromise instanceof Promise)) return this._fulfill(value);

    if (shouldBind) this._propagateFrom(maybePromise, 2);


    var promise = maybePromise._target();

    if (promise === this) {
        this._reject(makeSelfResolutionError());
        return;
    }

    var bitField = promise._bitField;
    if (((bitField & 50397184) === 0)) {
        var len = this._length();
        if (len > 0) promise._migrateCallback0(this);
        for (var i = 1; i < len; ++i) {
            promise._migrateCallbackAt(this, i);
        }
        this._setFollowing();
        this._setLength(0);
        this._setFollowee(maybePromise);
    } else if (((bitField & 33554432) !== 0)) {
        this._fulfill(promise._value());
    } else if (((bitField & 16777216) !== 0)) {
        this._reject(promise._reason());
    } else {
        var reason = new CancellationError("late cancellation observer");
        promise._attachExtraTrace(reason);
        this._reject(reason);
    }
};

Promise.prototype._rejectCallback =
function(reason, synchronous, ignoreNonErrorWarnings) {
    var trace = util.ensureErrorObject(reason);
    var hasStack = trace === reason;
    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {
        var message = "a promise was rejected with a non-error: " +
            util.classString(reason);
        this._warn(message, true);
    }
    this._attachExtraTrace(trace, synchronous ? hasStack : false);
    this._reject(reason);
};

Promise.prototype._resolveFromExecutor = function (executor) {
    if (executor === INTERNAL) return;
    var promise = this;
    this._captureStackTrace();
    this._pushContext();
    var synchronous = true;
    var r = this._execute(executor, function(value) {
        promise._resolveCallback(value);
    }, function (reason) {
        promise._rejectCallback(reason, synchronous);
    });
    synchronous = false;
    this._popContext();

    if (r !== undefined) {
        promise._rejectCallback(r, true);
    }
};

Promise.prototype._settlePromiseFromHandler = function (
    handler, receiver, value, promise
) {
    var bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;
    promise._pushContext();
    var x;
    if (receiver === APPLY) {
        if (!value || typeof value.length !== "number") {
            x = errorObj;
            x.e = new TypeError("cannot .spread() a non-array: " +
                                    util.classString(value));
        } else {
            x = tryCatch(handler).apply(this._boundValue(), value);
        }
    } else {
        x = tryCatch(handler).call(receiver, value);
    }
    var promiseCreated = promise._popContext();
    bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;

    if (x === NEXT_FILTER) {
        promise._reject(value);
    } else if (x === errorObj) {
        promise._rejectCallback(x.e, false);
    } else {
        debug.checkForgottenReturns(x, promiseCreated, "",  promise, this);
        promise._resolveCallback(x);
    }
};

Promise.prototype._target = function() {
    var ret = this;
    while (ret._isFollowing()) ret = ret._followee();
    return ret;
};

Promise.prototype._followee = function() {
    return this._rejectionHandler0;
};

Promise.prototype._setFollowee = function(promise) {
    this._rejectionHandler0 = promise;
};

Promise.prototype._settlePromise = function(promise, handler, receiver, value) {
    var isPromise = promise instanceof Promise;
    var bitField = this._bitField;
    var asyncGuaranteed = ((bitField & 134217728) !== 0);
    if (((bitField & 65536) !== 0)) {
        if (isPromise) promise._invokeInternalOnCancel();

        if (receiver instanceof PassThroughHandlerContext &&
            receiver.isFinallyHandler()) {
            receiver.cancelPromise = promise;
            if (tryCatch(handler).call(receiver, value) === errorObj) {
                promise._reject(errorObj.e);
            }
        } else if (handler === reflectHandler) {
            promise._fulfill(reflectHandler.call(receiver));
        } else if (receiver instanceof Proxyable) {
            receiver._promiseCancelled(promise);
        } else if (isPromise || promise instanceof PromiseArray) {
            promise._cancel();
        } else {
            receiver.cancel();
        }
    } else if (typeof handler === "function") {
        if (!isPromise) {
            handler.call(receiver, value, promise);
        } else {
            if (asyncGuaranteed) promise._setAsyncGuaranteed();
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (receiver instanceof Proxyable) {
        if (!receiver._isResolved()) {
            if (((bitField & 33554432) !== 0)) {
                receiver._promiseFulfilled(value, promise);
            } else {
                receiver._promiseRejected(value, promise);
            }
        }
    } else if (isPromise) {
        if (asyncGuaranteed) promise._setAsyncGuaranteed();
        if (((bitField & 33554432) !== 0)) {
            promise._fulfill(value);
        } else {
            promise._reject(value);
        }
    }
};

Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) {
    var handler = ctx.handler;
    var promise = ctx.promise;
    var receiver = ctx.receiver;
    var value = ctx.value;
    if (typeof handler === "function") {
        if (!(promise instanceof Promise)) {
            handler.call(receiver, value, promise);
        } else {
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (promise instanceof Promise) {
        promise._reject(value);
    }
};

Promise.prototype._settlePromiseCtx = function(ctx) {
    this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);
};

Promise.prototype._settlePromise0 = function(handler, value, bitField) {
    var promise = this._promise0;
    var receiver = this._receiverAt(0);
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._settlePromise(promise, handler, receiver, value);
};

Promise.prototype._clearCallbackDataAtIndex = function(index) {
    var base = index * 4 - 4;
    this[base + 2] =
    this[base + 3] =
    this[base + 0] =
    this[base + 1] = undefined;
};

Promise.prototype._fulfill = function (value) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    if (value === this) {
        var err = makeSelfResolutionError();
        this._attachExtraTrace(err);
        return this._reject(err);
    }
    this._setFulfilled();
    this._rejectionHandler0 = value;

    if ((bitField & 65535) > 0) {
        if (((bitField & 134217728) !== 0)) {
            this._settlePromises();
        } else {
            async.settlePromises(this);
        }
        this._dereferenceTrace();
    }
};

Promise.prototype._reject = function (reason) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    this._setRejected();
    this._fulfillmentHandler0 = reason;

    if (this._isFinal()) {
        return async.fatalError(reason, util.isNode);
    }

    if ((bitField & 65535) > 0) {
        async.settlePromises(this);
    } else {
        this._ensurePossibleRejectionHandled();
    }
};

Promise.prototype._fulfillPromises = function (len, value) {
    for (var i = 1; i < len; i++) {
        var handler = this._fulfillmentHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, value);
    }
};

Promise.prototype._rejectPromises = function (len, reason) {
    for (var i = 1; i < len; i++) {
        var handler = this._rejectionHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, reason);
    }
};

Promise.prototype._settlePromises = function () {
    var bitField = this._bitField;
    var len = (bitField & 65535);

    if (len > 0) {
        if (((bitField & 16842752) !== 0)) {
            var reason = this._fulfillmentHandler0;
            this._settlePromise0(this._rejectionHandler0, reason, bitField);
            this._rejectPromises(len, reason);
        } else {
            var value = this._rejectionHandler0;
            this._settlePromise0(this._fulfillmentHandler0, value, bitField);
            this._fulfillPromises(len, value);
        }
        this._setLength(0);
    }
    this._clearCancellationData();
};

Promise.prototype._settledValue = function() {
    var bitField = this._bitField;
    if (((bitField & 33554432) !== 0)) {
        return this._rejectionHandler0;
    } else if (((bitField & 16777216) !== 0)) {
        return this._fulfillmentHandler0;
    }
};

if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
    es5.defineProperty(Promise.prototype, Symbol.toStringTag, {
        get: function () {
            return "Object";
        }
    });
}

function deferResolve(v) {this.promise._resolveCallback(v);}
function deferReject(v) {this.promise._rejectCallback(v, false);}

Promise.defer = Promise.pending = function() {
    debug.deprecated("Promise.defer", "new Promise");
    var promise = new Promise(INTERNAL);
    return {
        promise: promise,
        resolve: deferResolve,
        reject: deferReject
    };
};

util.notEnumerableProp(Promise,
                       "_makeSelfResolutionError",
                       makeSelfResolutionError);

_dereq_("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection,
    debug);
_dereq_("./bind")(Promise, INTERNAL, tryConvertToPromise, debug);
_dereq_("./cancel")(Promise, PromiseArray, apiRejection, debug);
_dereq_("./direct_resolve")(Promise);
_dereq_("./synchronous_inspection")(Promise);
_dereq_("./join")(
    Promise, PromiseArray, tryConvertToPromise, INTERNAL, async);
Promise.Promise = Promise;
Promise.version = "3.7.2";
_dereq_('./call_get.js')(Promise);
_dereq_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);
_dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
_dereq_('./nodeify.js')(Promise);
_dereq_('./promisify.js')(Promise, INTERNAL);
_dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);
_dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);
_dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
_dereq_('./settle.js')(Promise, PromiseArray, debug);
_dereq_('./some.js')(Promise, PromiseArray, apiRejection);
_dereq_('./timers.js')(Promise, INTERNAL, debug);
_dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);
_dereq_('./any.js')(Promise);
_dereq_('./each.js')(Promise, INTERNAL);
_dereq_('./filter.js')(Promise, INTERNAL);
                                                         
    util.toFastProperties(Promise);                                          
    util.toFastProperties(Promise.prototype);                                
    function fillTypes(value) {                                              
        var p = new Promise(INTERNAL);                                       
        p._fulfillmentHandler0 = value;                                      
        p._rejectionHandler0 = value;                                        
        p._promise0 = value;                                                 
        p._receiver0 = value;                                                
    }                                                                        
    // Complete slack tracking, opt out of field-type tracking and           
    // stabilize map                                                         
    fillTypes({a: 1});                                                       
    fillTypes({b: 2});                                                       
    fillTypes({c: 3});                                                       
    fillTypes(1);                                                            
    fillTypes(function(){});                                                 
    fillTypes(undefined);                                                    
    fillTypes(false);                                                        
    fillTypes(new Promise(INTERNAL));                                        
    debug.setBounds(Async.firstLineError, util.lastLineError);               
    return Promise;                                                          

};

},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36,"async_hooks":undefined}],23:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise,
    apiRejection, Proxyable) {
var util = _dereq_("./util");
var isArray = util.isArray;

function toResolutionValue(val) {
    switch(val) {
    case -2: return [];
    case -3: return {};
    case -6: return new Map();
    }
}

function PromiseArray(values) {
    var promise = this._promise = new Promise(INTERNAL);
    if (values instanceof Promise) {
        promise._propagateFrom(values, 3);
        values.suppressUnhandledRejections();
    }
    promise._setOnCancel(this);
    this._values = values;
    this._length = 0;
    this._totalResolved = 0;
    this._init(undefined, -2);
}
util.inherits(PromiseArray, Proxyable);

PromiseArray.prototype.length = function () {
    return this._length;
};

PromiseArray.prototype.promise = function () {
    return this._promise;
};

PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {
    var values = tryConvertToPromise(this._values, this._promise);
    if (values instanceof Promise) {
        values = values._target();
        var bitField = values._bitField;
        ;
        this._values = values;

        if (((bitField & 50397184) === 0)) {
            this._promise._setAsyncGuaranteed();
            return values._then(
                init,
                this._reject,
                undefined,
                this,
                resolveValueIfEmpty
           );
        } else if (((bitField & 33554432) !== 0)) {
            values = values._value();
        } else if (((bitField & 16777216) !== 0)) {
            return this._reject(values._reason());
        } else {
            return this._cancel();
        }
    }
    values = util.asArray(values);
    if (values === null) {
        var err = apiRejection(
            "expecting an array or an iterable object but got " + util.classString(values)).reason();
        this._promise._rejectCallback(err, false);
        return;
    }

    if (values.length === 0) {
        if (resolveValueIfEmpty === -5) {
            this._resolveEmptyArray();
        }
        else {
            this._resolve(toResolutionValue(resolveValueIfEmpty));
        }
        return;
    }
    this._iterate(values);
};

PromiseArray.prototype._iterate = function(values) {
    var len = this.getActualLength(values.length);
    this._length = len;
    this._values = this.shouldCopyValues() ? new Array(len) : this._values;
    var result = this._promise;
    var isResolved = false;
    var bitField = null;
    for (var i = 0; i < len; ++i) {
        var maybePromise = tryConvertToPromise(values[i], result);

        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            bitField = maybePromise._bitField;
        } else {
            bitField = null;
        }

        if (isResolved) {
            if (bitField !== null) {
                maybePromise.suppressUnhandledRejections();
            }
        } else if (bitField !== null) {
            if (((bitField & 50397184) === 0)) {
                maybePromise._proxy(this, i);
                this._values[i] = maybePromise;
            } else if (((bitField & 33554432) !== 0)) {
                isResolved = this._promiseFulfilled(maybePromise._value(), i);
            } else if (((bitField & 16777216) !== 0)) {
                isResolved = this._promiseRejected(maybePromise._reason(), i);
            } else {
                isResolved = this._promiseCancelled(i);
            }
        } else {
            isResolved = this._promiseFulfilled(maybePromise, i);
        }
    }
    if (!isResolved) result._setAsyncGuaranteed();
};

PromiseArray.prototype._isResolved = function () {
    return this._values === null;
};

PromiseArray.prototype._resolve = function (value) {
    this._values = null;
    this._promise._fulfill(value);
};

PromiseArray.prototype._cancel = function() {
    if (this._isResolved() || !this._promise._isCancellable()) return;
    this._values = null;
    this._promise._cancel();
};

PromiseArray.prototype._reject = function (reason) {
    this._values = null;
    this._promise._rejectCallback(reason, false);
};

PromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

PromiseArray.prototype._promiseCancelled = function() {
    this._cancel();
    return true;
};

PromiseArray.prototype._promiseRejected = function (reason) {
    this._totalResolved++;
    this._reject(reason);
    return true;
};

PromiseArray.prototype._resultCancelled = function() {
    if (this._isResolved()) return;
    var values = this._values;
    this._cancel();
    if (values instanceof Promise) {
        values.cancel();
    } else {
        for (var i = 0; i < values.length; ++i) {
            if (values[i] instanceof Promise) {
                values[i].cancel();
            }
        }
    }
};

PromiseArray.prototype.shouldCopyValues = function () {
    return true;
};

PromiseArray.prototype.getActualLength = function (len) {
    return len;
};

return PromiseArray;
};

},{"./util":36}],24:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var THIS = {};
var util = _dereq_("./util");
var nodebackForPromise = _dereq_("./nodeback");
var withAppended = util.withAppended;
var maybeWrapAsError = util.maybeWrapAsError;
var canEvaluate = util.canEvaluate;
var TypeError = _dereq_("./errors").TypeError;
var defaultSuffix = "Async";
var defaultPromisified = {__isPromisified__: true};
var noCopyProps = [
    "arity",    "length",
    "name",
    "arguments",
    "caller",
    "callee",
    "prototype",
    "__isPromisified__"
];
var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$");

var defaultFilter = function(name) {
    return util.isIdentifier(name) &&
        name.charAt(0) !== "_" &&
        name !== "constructor";
};

function propsFilter(key) {
    return !noCopyPropsPattern.test(key);
}

function isPromisified(fn) {
    try {
        return fn.__isPromisified__ === true;
    }
    catch (e) {
        return false;
    }
}

function hasPromisified(obj, key, suffix) {
    var val = util.getDataPropertyOrDefault(obj, key + suffix,
                                            defaultPromisified);
    return val ? isPromisified(val) : false;
}
function checkValid(ret, suffix, suffixRegexp) {
    for (var i = 0; i < ret.length; i += 2) {
        var key = ret[i];
        if (suffixRegexp.test(key)) {
            var keyWithoutAsyncSuffix = key.replace(suffixRegexp, "");
            for (var j = 0; j < ret.length; j += 2) {
                if (ret[j] === keyWithoutAsyncSuffix) {
                    throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a    See http://goo.gl/MqrFmX\u000a"
                        .replace("%s", suffix));
                }
            }
        }
    }
}

function promisifiableMethods(obj, suffix, suffixRegexp, filter) {
    var keys = util.inheritedDataKeys(obj);
    var ret = [];
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var value = obj[key];
        var passesDefaultFilter = filter === defaultFilter
            ? true : defaultFilter(key, value, obj);
        if (typeof value === "function" &&
            !isPromisified(value) &&
            !hasPromisified(obj, key, suffix) &&
            filter(key, value, obj, passesDefaultFilter)) {
            ret.push(key, value);
        }
    }
    checkValid(ret, suffix, suffixRegexp);
    return ret;
}

var escapeIdentRegex = function(str) {
    return str.replace(/([$])/, "\\$");
};

var makeNodePromisifiedEval;
if (!true) {
var switchCaseArgumentOrder = function(likelyArgumentCount) {
    var ret = [likelyArgumentCount];
    var min = Math.max(0, likelyArgumentCount - 1 - 3);
    for(var i = likelyArgumentCount - 1; i >= min; --i) {
        ret.push(i);
    }
    for(var i = likelyArgumentCount + 1; i <= 3; ++i) {
        ret.push(i);
    }
    return ret;
};

var argumentSequence = function(argumentCount) {
    return util.filledRange(argumentCount, "_arg", "");
};

var parameterDeclaration = function(parameterCount) {
    return util.filledRange(
        Math.max(parameterCount, 3), "_arg", "");
};

var parameterCount = function(fn) {
    if (typeof fn.length === "number") {
        return Math.max(Math.min(fn.length, 1023 + 1), 0);
    }
    return 0;
};

makeNodePromisifiedEval =
function(callback, receiver, originalName, fn, _, multiArgs) {
    var newParameterCount = Math.max(0, parameterCount(fn) - 1);
    var argumentOrder = switchCaseArgumentOrder(newParameterCount);
    var shouldProxyThis = typeof callback === "string" || receiver === THIS;

    function generateCallForArgumentCount(count) {
        var args = argumentSequence(count).join(", ");
        var comma = count > 0 ? ", " : "";
        var ret;
        if (shouldProxyThis) {
            ret = "ret = callback.call(this, {{args}}, nodeback); break;\n";
        } else {
            ret = receiver === undefined
                ? "ret = callback({{args}}, nodeback); break;\n"
                : "ret = callback.call(receiver, {{args}}, nodeback); break;\n";
        }
        return ret.replace("{{args}}", args).replace(", ", comma);
    }

    function generateArgumentSwitchCase() {
        var ret = "";
        for (var i = 0; i < argumentOrder.length; ++i) {
            ret += "case " + argumentOrder[i] +":" +
                generateCallForArgumentCount(argumentOrder[i]);
        }

        ret += "                                                             \n\
        default:                                                             \n\
            var args = new Array(len + 1);                                   \n\
            var i = 0;                                                       \n\
            for (var i = 0; i < len; ++i) {                                  \n\
               args[i] = arguments[i];                                       \n\
            }                                                                \n\
            args[i] = nodeback;                                              \n\
            [CodeForCall]                                                    \n\
            break;                                                           \n\
        ".replace("[CodeForCall]", (shouldProxyThis
                                ? "ret = callback.apply(this, args);\n"
                                : "ret = callback.apply(receiver, args);\n"));
        return ret;
    }

    var getFunctionCode = typeof callback === "string"
                                ? ("this != null ? this['"+callback+"'] : fn")
                                : "fn";
    var body = "'use strict';                                                \n\
        var ret = function (Parameters) {                                    \n\
            'use strict';                                                    \n\
            var len = arguments.length;                                      \n\
            var promise = new Promise(INTERNAL);                             \n\
            promise._captureStackTrace();                                    \n\
            var nodeback = nodebackForPromise(promise, " + multiArgs + ");   \n\
            var ret;                                                         \n\
            var callback = tryCatch([GetFunctionCode]);                      \n\
            switch(len) {                                                    \n\
                [CodeForSwitchCase]                                          \n\
            }                                                                \n\
            if (ret === errorObj) {                                          \n\
                promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\
            }                                                                \n\
            if (!promise._isFateSealed()) promise._setAsyncGuaranteed();     \n\
            return promise;                                                  \n\
        };                                                                   \n\
        notEnumerableProp(ret, '__isPromisified__', true);                   \n\
        return ret;                                                          \n\
    ".replace("[CodeForSwitchCase]", generateArgumentSwitchCase())
        .replace("[GetFunctionCode]", getFunctionCode);
    body = body.replace("Parameters", parameterDeclaration(newParameterCount));
    return new Function("Promise",
                        "fn",
                        "receiver",
                        "withAppended",
                        "maybeWrapAsError",
                        "nodebackForPromise",
                        "tryCatch",
                        "errorObj",
                        "notEnumerableProp",
                        "INTERNAL",
                        body)(
                    Promise,
                    fn,
                    receiver,
                    withAppended,
                    maybeWrapAsError,
                    nodebackForPromise,
                    util.tryCatch,
                    util.errorObj,
                    util.notEnumerableProp,
                    INTERNAL);
};
}

function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) {
    var defaultThis = (function() {return this;})();
    var method = callback;
    if (typeof method === "string") {
        callback = fn;
    }
    function promisified() {
        var _receiver = receiver;
        if (receiver === THIS) _receiver = this;
        var promise = new Promise(INTERNAL);
        promise._captureStackTrace();
        var cb = typeof method === "string" && this !== defaultThis
            ? this[method] : callback;
        var fn = nodebackForPromise(promise, multiArgs);
        try {
            cb.apply(_receiver, withAppended(arguments, fn));
        } catch(e) {
            promise._rejectCallback(maybeWrapAsError(e), true, true);
        }
        if (!promise._isFateSealed()) promise._setAsyncGuaranteed();
        return promise;
    }
    util.notEnumerableProp(promisified, "__isPromisified__", true);
    return promisified;
}

var makeNodePromisified = canEvaluate
    ? makeNodePromisifiedEval
    : makeNodePromisifiedClosure;

function promisifyAll(obj, suffix, filter, promisifier, multiArgs) {
    var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$");
    var methods =
        promisifiableMethods(obj, suffix, suffixRegexp, filter);

    for (var i = 0, len = methods.length; i < len; i+= 2) {
        var key = methods[i];
        var fn = methods[i+1];
        var promisifiedKey = key + suffix;
        if (promisifier === makeNodePromisified) {
            obj[promisifiedKey] =
                makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);
        } else {
            var promisified = promisifier(fn, function() {
                return makeNodePromisified(key, THIS, key,
                                           fn, suffix, multiArgs);
            });
            util.notEnumerableProp(promisified, "__isPromisified__", true);
            obj[promisifiedKey] = promisified;
        }
    }
    util.toFastProperties(obj);
    return obj;
}

function promisify(callback, receiver, multiArgs) {
    return makeNodePromisified(callback, receiver, undefined,
                                callback, null, multiArgs);
}

Promise.promisify = function (fn, options) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    if (isPromisified(fn)) {
        return fn;
    }
    options = Object(options);
    var receiver = options.context === undefined ? THIS : options.context;
    var multiArgs = !!options.multiArgs;
    var ret = promisify(fn, receiver, multiArgs);
    util.copyDescriptors(fn, ret, propsFilter);
    return ret;
};

Promise.promisifyAll = function (target, options) {
    if (typeof target !== "function" && typeof target !== "object") {
        throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    options = Object(options);
    var multiArgs = !!options.multiArgs;
    var suffix = options.suffix;
    if (typeof suffix !== "string") suffix = defaultSuffix;
    var filter = options.filter;
    if (typeof filter !== "function") filter = defaultFilter;
    var promisifier = options.promisifier;
    if (typeof promisifier !== "function") promisifier = makeNodePromisified;

    if (!util.isIdentifier(suffix)) {
        throw new RangeError("suffix must be a valid identifier\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }

    var keys = util.inheritedDataKeys(target);
    for (var i = 0; i < keys.length; ++i) {
        var value = target[keys[i]];
        if (keys[i] !== "constructor" &&
            util.isClass(value)) {
            promisifyAll(value.prototype, suffix, filter, promisifier,
                multiArgs);
            promisifyAll(value, suffix, filter, promisifier, multiArgs);
        }
    }

    return promisifyAll(target, suffix, filter, promisifier, multiArgs);
};
};


},{"./errors":12,"./nodeback":20,"./util":36}],25:[function(_dereq_,module,exports){
"use strict";
module.exports = function(
    Promise, PromiseArray, tryConvertToPromise, apiRejection) {
var util = _dereq_("./util");
var isObject = util.isObject;
var es5 = _dereq_("./es5");
var Es6Map;
if (typeof Map === "function") Es6Map = Map;

var mapToEntries = (function() {
    var index = 0;
    var size = 0;

    function extractEntry(value, key) {
        this[index] = value;
        this[index + size] = key;
        index++;
    }

    return function mapToEntries(map) {
        size = map.size;
        index = 0;
        var ret = new Array(map.size * 2);
        map.forEach(extractEntry, ret);
        return ret;
    };
})();

var entriesToMap = function(entries) {
    var ret = new Es6Map();
    var length = entries.length / 2 | 0;
    for (var i = 0; i < length; ++i) {
        var key = entries[length + i];
        var value = entries[i];
        ret.set(key, value);
    }
    return ret;
};

function PropertiesPromiseArray(obj) {
    var isMap = false;
    var entries;
    if (Es6Map !== undefined && obj instanceof Es6Map) {
        entries = mapToEntries(obj);
        isMap = true;
    } else {
        var keys = es5.keys(obj);
        var len = keys.length;
        entries = new Array(len * 2);
        for (var i = 0; i < len; ++i) {
            var key = keys[i];
            entries[i] = obj[key];
            entries[i + len] = key;
        }
    }
    this.constructor$(entries);
    this._isMap = isMap;
    this._init$(undefined, isMap ? -6 : -3);
}
util.inherits(PropertiesPromiseArray, PromiseArray);

PropertiesPromiseArray.prototype._init = function () {};

PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        var val;
        if (this._isMap) {
            val = entriesToMap(this._values);
        } else {
            val = {};
            var keyOffset = this.length();
            for (var i = 0, len = this.length(); i < len; ++i) {
                val[this._values[i + keyOffset]] = this._values[i];
            }
        }
        this._resolve(val);
        return true;
    }
    return false;
};

PropertiesPromiseArray.prototype.shouldCopyValues = function () {
    return false;
};

PropertiesPromiseArray.prototype.getActualLength = function (len) {
    return len >> 1;
};

function props(promises) {
    var ret;
    var castValue = tryConvertToPromise(promises);

    if (!isObject(castValue)) {
        return apiRejection("cannot await properties of a non-object\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    } else if (castValue instanceof Promise) {
        ret = castValue._then(
            Promise.props, undefined, undefined, undefined, undefined);
    } else {
        ret = new PropertiesPromiseArray(castValue).promise();
    }

    if (castValue instanceof Promise) {
        ret._propagateFrom(castValue, 2);
    }
    return ret;
}

Promise.prototype.props = function () {
    return props(this);
};

Promise.props = function (promises) {
    return props(promises);
};
};

},{"./es5":13,"./util":36}],26:[function(_dereq_,module,exports){
"use strict";
function arrayMove(src, srcIndex, dst, dstIndex, len) {
    for (var j = 0; j < len; ++j) {
        dst[j + dstIndex] = src[j + srcIndex];
        src[j + srcIndex] = void 0;
    }
}

function Queue(capacity) {
    this._capacity = capacity;
    this._length = 0;
    this._front = 0;
}

Queue.prototype._willBeOverCapacity = function (size) {
    return this._capacity < size;
};

Queue.prototype._pushOne = function (arg) {
    var length = this.length();
    this._checkCapacity(length + 1);
    var i = (this._front + length) & (this._capacity - 1);
    this[i] = arg;
    this._length = length + 1;
};

Queue.prototype.push = function (fn, receiver, arg) {
    var length = this.length() + 3;
    if (this._willBeOverCapacity(length)) {
        this._pushOne(fn);
        this._pushOne(receiver);
        this._pushOne(arg);
        return;
    }
    var j = this._front + length - 3;
    this._checkCapacity(length);
    var wrapMask = this._capacity - 1;
    this[(j + 0) & wrapMask] = fn;
    this[(j + 1) & wrapMask] = receiver;
    this[(j + 2) & wrapMask] = arg;
    this._length = length;
};

Queue.prototype.shift = function () {
    var front = this._front,
        ret = this[front];

    this[front] = undefined;
    this._front = (front + 1) & (this._capacity - 1);
    this._length--;
    return ret;
};

Queue.prototype.length = function () {
    return this._length;
};

Queue.prototype._checkCapacity = function (size) {
    if (this._capacity < size) {
        this._resizeTo(this._capacity << 1);
    }
};

Queue.prototype._resizeTo = function (capacity) {
    var oldCapacity = this._capacity;
    this._capacity = capacity;
    var front = this._front;
    var length = this._length;
    var moveItemsCount = (front + length) & (oldCapacity - 1);
    arrayMove(this, 0, this, oldCapacity, moveItemsCount);
};

module.exports = Queue;

},{}],27:[function(_dereq_,module,exports){
"use strict";
module.exports = function(
    Promise, INTERNAL, tryConvertToPromise, apiRejection) {
var util = _dereq_("./util");

var raceLater = function (promise) {
    return promise.then(function(array) {
        return race(array, promise);
    });
};

function race(promises, parent) {
    var maybePromise = tryConvertToPromise(promises);

    if (maybePromise instanceof Promise) {
        return raceLater(maybePromise);
    } else {
        promises = util.asArray(promises);
        if (promises === null)
            return apiRejection("expecting an array or an iterable object but got " + util.classString(promises));
    }

    var ret = new Promise(INTERNAL);
    if (parent !== undefined) {
        ret._propagateFrom(parent, 3);
    }
    var fulfill = ret._fulfill;
    var reject = ret._reject;
    for (var i = 0, len = promises.length; i < len; ++i) {
        var val = promises[i];

        if (val === undefined && !(i in promises)) {
            continue;
        }

        Promise.cast(val)._then(fulfill, reject, undefined, ret, null);
    }
    return ret;
}

Promise.race = function (promises) {
    return race(promises, undefined);
};

Promise.prototype.race = function () {
    return race(this, undefined);
};

};

},{"./util":36}],28:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise,
                          PromiseArray,
                          apiRejection,
                          tryConvertToPromise,
                          INTERNAL,
                          debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;

function ReductionPromiseArray(promises, fn, initialValue, _each) {
    this.constructor$(promises);
    var context = Promise._getContext();
    this._fn = util.contextBind(context, fn);
    if (initialValue !== undefined) {
        initialValue = Promise.resolve(initialValue);
        initialValue._attachCancellationCallback(this);
    }
    this._initialValue = initialValue;
    this._currentCancellable = null;
    if(_each === INTERNAL) {
        this._eachValues = Array(this._length);
    } else if (_each === 0) {
        this._eachValues = null;
    } else {
        this._eachValues = undefined;
    }
    this._promise._captureStackTrace();
    this._init$(undefined, -5);
}
util.inherits(ReductionPromiseArray, PromiseArray);

ReductionPromiseArray.prototype._gotAccum = function(accum) {
    if (this._eachValues !== undefined &&
        this._eachValues !== null &&
        accum !== INTERNAL) {
        this._eachValues.push(accum);
    }
};

ReductionPromiseArray.prototype._eachComplete = function(value) {
    if (this._eachValues !== null) {
        this._eachValues.push(value);
    }
    return this._eachValues;
};

ReductionPromiseArray.prototype._init = function() {};

ReductionPromiseArray.prototype._resolveEmptyArray = function() {
    this._resolve(this._eachValues !== undefined ? this._eachValues
                                                 : this._initialValue);
};

ReductionPromiseArray.prototype.shouldCopyValues = function () {
    return false;
};

ReductionPromiseArray.prototype._resolve = function(value) {
    this._promise._resolveCallback(value);
    this._values = null;
};

ReductionPromiseArray.prototype._resultCancelled = function(sender) {
    if (sender === this._initialValue) return this._cancel();
    if (this._isResolved()) return;
    this._resultCancelled$();
    if (this._currentCancellable instanceof Promise) {
        this._currentCancellable.cancel();
    }
    if (this._initialValue instanceof Promise) {
        this._initialValue.cancel();
    }
};

ReductionPromiseArray.prototype._iterate = function (values) {
    this._values = values;
    var value;
    var i;
    var length = values.length;
    if (this._initialValue !== undefined) {
        value = this._initialValue;
        i = 0;
    } else {
        value = Promise.resolve(values[0]);
        i = 1;
    }

    this._currentCancellable = value;

    for (var j = i; j < length; ++j) {
        var maybePromise = values[j];
        if (maybePromise instanceof Promise) {
            maybePromise.suppressUnhandledRejections();
        }
    }

    if (!value.isRejected()) {
        for (; i < length; ++i) {
            var ctx = {
                accum: null,
                value: values[i],
                index: i,
                length: length,
                array: this
            };

            value = value._then(gotAccum, undefined, undefined, ctx, undefined);

            if ((i & 127) === 0) {
                value._setNoAsyncGuarantee();
            }
        }
    }

    if (this._eachValues !== undefined) {
        value = value
            ._then(this._eachComplete, undefined, undefined, this, undefined);
    }
    value._then(completed, completed, undefined, value, this);
};

Promise.prototype.reduce = function (fn, initialValue) {
    return reduce(this, fn, initialValue, null);
};

Promise.reduce = function (promises, fn, initialValue, _each) {
    return reduce(promises, fn, initialValue, _each);
};

function completed(valueOrReason, array) {
    if (this.isFulfilled()) {
        array._resolve(valueOrReason);
    } else {
        array._reject(valueOrReason);
    }
}

function reduce(promises, fn, initialValue, _each) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var array = new ReductionPromiseArray(promises, fn, initialValue, _each);
    return array.promise();
}

function gotAccum(accum) {
    this.accum = accum;
    this.array._gotAccum(accum);
    var value = tryConvertToPromise(this.value, this.array._promise);
    if (value instanceof Promise) {
        this.array._currentCancellable = value;
        return value._then(gotValue, undefined, undefined, this, undefined);
    } else {
        return gotValue.call(this, value);
    }
}

function gotValue(value) {
    var array = this.array;
    var promise = array._promise;
    var fn = tryCatch(array._fn);
    promise._pushContext();
    var ret;
    if (array._eachValues !== undefined) {
        ret = fn.call(promise._boundValue(), value, this.index, this.length);
    } else {
        ret = fn.call(promise._boundValue(),
                              this.accum, value, this.index, this.length);
    }
    if (ret instanceof Promise) {
        array._currentCancellable = ret;
    }
    var promiseCreated = promise._popContext();
    debug.checkForgottenReturns(
        ret,
        promiseCreated,
        array._eachValues !== undefined ? "Promise.each" : "Promise.reduce",
        promise
    );
    return ret;
}
};

},{"./util":36}],29:[function(_dereq_,module,exports){
"use strict";
var util = _dereq_("./util");
var schedule;
var noAsyncScheduler = function() {
    throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var NativePromise = util.getNativePromise();
if (util.isNode && typeof MutationObserver === "undefined") {
    var GlobalSetImmediate = global.setImmediate;
    var ProcessNextTick = process.nextTick;
    schedule = util.isRecentNode
                ? function(fn) { GlobalSetImmediate.call(global, fn); }
                : function(fn) { ProcessNextTick.call(process, fn); };
} else if (typeof NativePromise === "function" &&
           typeof NativePromise.resolve === "function") {
    var nativePromise = NativePromise.resolve();
    schedule = function(fn) {
        nativePromise.then(fn);
    };
} else if ((typeof MutationObserver !== "undefined") &&
          !(typeof window !== "undefined" &&
            window.navigator &&
            (window.navigator.standalone || window.cordova)) &&
          ("classList" in document.documentElement)) {
    schedule = (function() {
        var div = document.createElement("div");
        var opts = {attributes: true};
        var toggleScheduled = false;
        var div2 = document.createElement("div");
        var o2 = new MutationObserver(function() {
            div.classList.toggle("foo");
            toggleScheduled = false;
        });
        o2.observe(div2, opts);

        var scheduleToggle = function() {
            if (toggleScheduled) return;
            toggleScheduled = true;
            div2.classList.toggle("foo");
        };

        return function schedule(fn) {
            var o = new MutationObserver(function() {
                o.disconnect();
                fn();
            });
            o.observe(div, opts);
            scheduleToggle();
        };
    })();
} else if (typeof setImmediate !== "undefined") {
    schedule = function (fn) {
        setImmediate(fn);
    };
} else if (typeof setTimeout !== "undefined") {
    schedule = function (fn) {
        setTimeout(fn, 0);
    };
} else {
    schedule = noAsyncScheduler;
}
module.exports = schedule;

},{"./util":36}],30:[function(_dereq_,module,exports){
"use strict";
module.exports =
    function(Promise, PromiseArray, debug) {
var PromiseInspection = Promise.PromiseInspection;
var util = _dereq_("./util");

function SettledPromiseArray(values) {
    this.constructor$(values);
}
util.inherits(SettledPromiseArray, PromiseArray);

SettledPromiseArray.prototype._promiseResolved = function (index, inspection) {
    this._values[index] = inspection;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

SettledPromiseArray.prototype._promiseFulfilled = function (value, index) {
    var ret = new PromiseInspection();
    ret._bitField = 33554432;
    ret._settledValueField = value;
    return this._promiseResolved(index, ret);
};
SettledPromiseArray.prototype._promiseRejected = function (reason, index) {
    var ret = new PromiseInspection();
    ret._bitField = 16777216;
    ret._settledValueField = reason;
    return this._promiseResolved(index, ret);
};

Promise.settle = function (promises) {
    debug.deprecated(".settle()", ".reflect()");
    return new SettledPromiseArray(promises).promise();
};

Promise.allSettled = function (promises) {
    return new SettledPromiseArray(promises).promise();
};

Promise.prototype.settle = function () {
    return Promise.settle(this);
};
};

},{"./util":36}],31:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, PromiseArray, apiRejection) {
var util = _dereq_("./util");
var RangeError = _dereq_("./errors").RangeError;
var AggregateError = _dereq_("./errors").AggregateError;
var isArray = util.isArray;
var CANCELLATION = {};


function SomePromiseArray(values) {
    this.constructor$(values);
    this._howMany = 0;
    this._unwrap = false;
    this._initialized = false;
}
util.inherits(SomePromiseArray, PromiseArray);

SomePromiseArray.prototype._init = function () {
    if (!this._initialized) {
        return;
    }
    if (this._howMany === 0) {
        this._resolve([]);
        return;
    }
    this._init$(undefined, -5);
    var isArrayResolved = isArray(this._values);
    if (!this._isResolved() &&
        isArrayResolved &&
        this._howMany > this._canPossiblyFulfill()) {
        this._reject(this._getRangeError(this.length()));
    }
};

SomePromiseArray.prototype.init = function () {
    this._initialized = true;
    this._init();
};

SomePromiseArray.prototype.setUnwrap = function () {
    this._unwrap = true;
};

SomePromiseArray.prototype.howMany = function () {
    return this._howMany;
};

SomePromiseArray.prototype.setHowMany = function (count) {
    this._howMany = count;
};

SomePromiseArray.prototype._promiseFulfilled = function (value) {
    this._addFulfilled(value);
    if (this._fulfilled() === this.howMany()) {
        this._values.length = this.howMany();
        if (this.howMany() === 1 && this._unwrap) {
            this._resolve(this._values[0]);
        } else {
            this._resolve(this._values);
        }
        return true;
    }
    return false;

};
SomePromiseArray.prototype._promiseRejected = function (reason) {
    this._addRejected(reason);
    return this._checkOutcome();
};

SomePromiseArray.prototype._promiseCancelled = function () {
    if (this._values instanceof Promise || this._values == null) {
        return this._cancel();
    }
    this._addRejected(CANCELLATION);
    return this._checkOutcome();
};

SomePromiseArray.prototype._checkOutcome = function() {
    if (this.howMany() > this._canPossiblyFulfill()) {
        var e = new AggregateError();
        for (var i = this.length(); i < this._values.length; ++i) {
            if (this._values[i] !== CANCELLATION) {
                e.push(this._values[i]);
            }
        }
        if (e.length > 0) {
            this._reject(e);
        } else {
            this._cancel();
        }
        return true;
    }
    return false;
};

SomePromiseArray.prototype._fulfilled = function () {
    return this._totalResolved;
};

SomePromiseArray.prototype._rejected = function () {
    return this._values.length - this.length();
};

SomePromiseArray.prototype._addRejected = function (reason) {
    this._values.push(reason);
};

SomePromiseArray.prototype._addFulfilled = function (value) {
    this._values[this._totalResolved++] = value;
};

SomePromiseArray.prototype._canPossiblyFulfill = function () {
    return this.length() - this._rejected();
};

SomePromiseArray.prototype._getRangeError = function (count) {
    var message = "Input array must contain at least " +
            this._howMany + " items but contains only " + count + " items";
    return new RangeError(message);
};

SomePromiseArray.prototype._resolveEmptyArray = function () {
    this._reject(this._getRangeError(0));
};

function some(promises, howMany) {
    if ((howMany | 0) !== howMany || howMany < 0) {
        return apiRejection("expecting a positive integer\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var ret = new SomePromiseArray(promises);
    var promise = ret.promise();
    ret.setHowMany(howMany);
    ret.init();
    return promise;
}

Promise.some = function (promises, howMany) {
    return some(promises, howMany);
};

Promise.prototype.some = function (howMany) {
    return some(this, howMany);
};

Promise._SomePromiseArray = SomePromiseArray;
};

},{"./errors":12,"./util":36}],32:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
function PromiseInspection(promise) {
    if (promise !== undefined) {
        promise = promise._target();
        this._bitField = promise._bitField;
        this._settledValueField = promise._isFateSealed()
            ? promise._settledValue() : undefined;
    }
    else {
        this._bitField = 0;
        this._settledValueField = undefined;
    }
}

PromiseInspection.prototype._settledValue = function() {
    return this._settledValueField;
};

var value = PromiseInspection.prototype.value = function () {
    if (!this.isFulfilled()) {
        throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var reason = PromiseInspection.prototype.error =
PromiseInspection.prototype.reason = function () {
    if (!this.isRejected()) {
        throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var isFulfilled = PromiseInspection.prototype.isFulfilled = function() {
    return (this._bitField & 33554432) !== 0;
};

var isRejected = PromiseInspection.prototype.isRejected = function () {
    return (this._bitField & 16777216) !== 0;
};

var isPending = PromiseInspection.prototype.isPending = function () {
    return (this._bitField & 50397184) === 0;
};

var isResolved = PromiseInspection.prototype.isResolved = function () {
    return (this._bitField & 50331648) !== 0;
};

PromiseInspection.prototype.isCancelled = function() {
    return (this._bitField & 8454144) !== 0;
};

Promise.prototype.__isCancelled = function() {
    return (this._bitField & 65536) === 65536;
};

Promise.prototype._isCancelled = function() {
    return this._target().__isCancelled();
};

Promise.prototype.isCancelled = function() {
    return (this._target()._bitField & 8454144) !== 0;
};

Promise.prototype.isPending = function() {
    return isPending.call(this._target());
};

Promise.prototype.isRejected = function() {
    return isRejected.call(this._target());
};

Promise.prototype.isFulfilled = function() {
    return isFulfilled.call(this._target());
};

Promise.prototype.isResolved = function() {
    return isResolved.call(this._target());
};

Promise.prototype.value = function() {
    return value.call(this._target());
};

Promise.prototype.reason = function() {
    var target = this._target();
    target._unsetRejectionIsUnhandled();
    return reason.call(target);
};

Promise.prototype._value = function() {
    return this._settledValue();
};

Promise.prototype._reason = function() {
    this._unsetRejectionIsUnhandled();
    return this._settledValue();
};

Promise.PromiseInspection = PromiseInspection;
};

},{}],33:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var util = _dereq_("./util");
var errorObj = util.errorObj;
var isObject = util.isObject;

function tryConvertToPromise(obj, context) {
    if (isObject(obj)) {
        if (obj instanceof Promise) return obj;
        var then = getThen(obj);
        if (then === errorObj) {
            if (context) context._pushContext();
            var ret = Promise.reject(then.e);
            if (context) context._popContext();
            return ret;
        } else if (typeof then === "function") {
            if (isAnyBluebirdPromise(obj)) {
                var ret = new Promise(INTERNAL);
                obj._then(
                    ret._fulfill,
                    ret._reject,
                    undefined,
                    ret,
                    null
                );
                return ret;
            }
            return doThenable(obj, then, context);
        }
    }
    return obj;
}

function doGetThen(obj) {
    return obj.then;
}

function getThen(obj) {
    try {
        return doGetThen(obj);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}

var hasProp = {}.hasOwnProperty;
function isAnyBluebirdPromise(obj) {
    try {
        return hasProp.call(obj, "_promise0");
    } catch (e) {
        return false;
    }
}

function doThenable(x, then, context) {
    var promise = new Promise(INTERNAL);
    var ret = promise;
    if (context) context._pushContext();
    promise._captureStackTrace();
    if (context) context._popContext();
    var synchronous = true;
    var result = util.tryCatch(then).call(x, resolve, reject);
    synchronous = false;

    if (promise && result === errorObj) {
        promise._rejectCallback(result.e, true, true);
        promise = null;
    }

    function resolve(value) {
        if (!promise) return;
        promise._resolveCallback(value);
        promise = null;
    }

    function reject(reason) {
        if (!promise) return;
        promise._rejectCallback(reason, synchronous, true);
        promise = null;
    }
    return ret;
}

return tryConvertToPromise;
};

},{"./util":36}],34:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, debug) {
var util = _dereq_("./util");
var TimeoutError = Promise.TimeoutError;

function HandleWrapper(handle)  {
    this.handle = handle;
}

HandleWrapper.prototype._resultCancelled = function() {
    clearTimeout(this.handle);
};

var afterValue = function(value) { return delay(+this).thenReturn(value); };
var delay = Promise.delay = function (ms, value) {
    var ret;
    var handle;
    if (value !== undefined) {
        ret = Promise.resolve(value)
                ._then(afterValue, null, null, ms, undefined);
        if (debug.cancellation() && value instanceof Promise) {
            ret._setOnCancel(value);
        }
    } else {
        ret = new Promise(INTERNAL);
        handle = setTimeout(function() { ret._fulfill(); }, +ms);
        if (debug.cancellation()) {
            ret._setOnCancel(new HandleWrapper(handle));
        }
        ret._captureStackTrace();
    }
    ret._setAsyncGuaranteed();
    return ret;
};

Promise.prototype.delay = function (ms) {
    return delay(ms, this);
};

var afterTimeout = function (promise, message, parent) {
    var err;
    if (typeof message !== "string") {
        if (message instanceof Error) {
            err = message;
        } else {
            err = new TimeoutError("operation timed out");
        }
    } else {
        err = new TimeoutError(message);
    }
    util.markAsOriginatingFromRejection(err);
    promise._attachExtraTrace(err);
    promise._reject(err);

    if (parent != null) {
        parent.cancel();
    }
};

function successClear(value) {
    clearTimeout(this.handle);
    return value;
}

function failureClear(reason) {
    clearTimeout(this.handle);
    throw reason;
}

Promise.prototype.timeout = function (ms, message) {
    ms = +ms;
    var ret, parent;

    var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {
        if (ret.isPending()) {
            afterTimeout(ret, message, parent);
        }
    }, ms));

    if (debug.cancellation()) {
        parent = this.then();
        ret = parent._then(successClear, failureClear,
                            undefined, handleWrapper, undefined);
        ret._setOnCancel(handleWrapper);
    } else {
        ret = this._then(successClear, failureClear,
                            undefined, handleWrapper, undefined);
    }

    return ret;
};

};

},{"./util":36}],35:[function(_dereq_,module,exports){
"use strict";
module.exports = function (Promise, apiRejection, tryConvertToPromise,
    createContext, INTERNAL, debug) {
    var util = _dereq_("./util");
    var TypeError = _dereq_("./errors").TypeError;
    var inherits = _dereq_("./util").inherits;
    var errorObj = util.errorObj;
    var tryCatch = util.tryCatch;
    var NULL = {};

    function thrower(e) {
        setTimeout(function(){throw e;}, 0);
    }

    function castPreservingDisposable(thenable) {
        var maybePromise = tryConvertToPromise(thenable);
        if (maybePromise !== thenable &&
            typeof thenable._isDisposable === "function" &&
            typeof thenable._getDisposer === "function" &&
            thenable._isDisposable()) {
            maybePromise._setDisposable(thenable._getDisposer());
        }
        return maybePromise;
    }
    function dispose(resources, inspection) {
        var i = 0;
        var len = resources.length;
        var ret = new Promise(INTERNAL);
        function iterator() {
            if (i >= len) return ret._fulfill();
            var maybePromise = castPreservingDisposable(resources[i++]);
            if (maybePromise instanceof Promise &&
                maybePromise._isDisposable()) {
                try {
                    maybePromise = tryConvertToPromise(
                        maybePromise._getDisposer().tryDispose(inspection),
                        resources.promise);
                } catch (e) {
                    return thrower(e);
                }
                if (maybePromise instanceof Promise) {
                    return maybePromise._then(iterator, thrower,
                                              null, null, null);
                }
            }
            iterator();
        }
        iterator();
        return ret;
    }

    function Disposer(data, promise, context) {
        this._data = data;
        this._promise = promise;
        this._context = context;
    }

    Disposer.prototype.data = function () {
        return this._data;
    };

    Disposer.prototype.promise = function () {
        return this._promise;
    };

    Disposer.prototype.resource = function () {
        if (this.promise().isFulfilled()) {
            return this.promise().value();
        }
        return NULL;
    };

    Disposer.prototype.tryDispose = function(inspection) {
        var resource = this.resource();
        var context = this._context;
        if (context !== undefined) context._pushContext();
        var ret = resource !== NULL
            ? this.doDispose(resource, inspection) : null;
        if (context !== undefined) context._popContext();
        this._promise._unsetDisposable();
        this._data = null;
        return ret;
    };

    Disposer.isDisposer = function (d) {
        return (d != null &&
                typeof d.resource === "function" &&
                typeof d.tryDispose === "function");
    };

    function FunctionDisposer(fn, promise, context) {
        this.constructor$(fn, promise, context);
    }
    inherits(FunctionDisposer, Disposer);

    FunctionDisposer.prototype.doDispose = function (resource, inspection) {
        var fn = this.data();
        return fn.call(resource, resource, inspection);
    };

    function maybeUnwrapDisposer(value) {
        if (Disposer.isDisposer(value)) {
            this.resources[this.index]._setDisposable(value);
            return value.promise();
        }
        return value;
    }

    function ResourceList(length) {
        this.length = length;
        this.promise = null;
        this[length-1] = null;
    }

    ResourceList.prototype._resultCancelled = function() {
        var len = this.length;
        for (var i = 0; i < len; ++i) {
            var item = this[i];
            if (item instanceof Promise) {
                item.cancel();
            }
        }
    };

    Promise.using = function () {
        var len = arguments.length;
        if (len < 2) return apiRejection(
                        "you must pass at least 2 arguments to Promise.using");
        var fn = arguments[len - 1];
        if (typeof fn !== "function") {
            return apiRejection("expecting a function but got " + util.classString(fn));
        }
        var input;
        var spreadArgs = true;
        if (len === 2 && Array.isArray(arguments[0])) {
            input = arguments[0];
            len = input.length;
            spreadArgs = false;
        } else {
            input = arguments;
            len--;
        }
        var resources = new ResourceList(len);
        for (var i = 0; i < len; ++i) {
            var resource = input[i];
            if (Disposer.isDisposer(resource)) {
                var disposer = resource;
                resource = resource.promise();
                resource._setDisposable(disposer);
            } else {
                var maybePromise = tryConvertToPromise(resource);
                if (maybePromise instanceof Promise) {
                    resource =
                        maybePromise._then(maybeUnwrapDisposer, null, null, {
                            resources: resources,
                            index: i
                    }, undefined);
                }
            }
            resources[i] = resource;
        }

        var reflectedResources = new Array(resources.length);
        for (var i = 0; i < reflectedResources.length; ++i) {
            reflectedResources[i] = Promise.resolve(resources[i]).reflect();
        }

        var resultPromise = Promise.all(reflectedResources)
            .then(function(inspections) {
                for (var i = 0; i < inspections.length; ++i) {
                    var inspection = inspections[i];
                    if (inspection.isRejected()) {
                        errorObj.e = inspection.error();
                        return errorObj;
                    } else if (!inspection.isFulfilled()) {
                        resultPromise.cancel();
                        return;
                    }
                    inspections[i] = inspection.value();
                }
                promise._pushContext();

                fn = tryCatch(fn);
                var ret = spreadArgs
                    ? fn.apply(undefined, inspections) : fn(inspections);
                var promiseCreated = promise._popContext();
                debug.checkForgottenReturns(
                    ret, promiseCreated, "Promise.using", promise);
                return ret;
            });

        var promise = resultPromise.lastly(function() {
            var inspection = new Promise.PromiseInspection(resultPromise);
            return dispose(resources, inspection);
        });
        resources.promise = promise;
        promise._setOnCancel(resources);
        return promise;
    };

    Promise.prototype._setDisposable = function (disposer) {
        this._bitField = this._bitField | 131072;
        this._disposer = disposer;
    };

    Promise.prototype._isDisposable = function () {
        return (this._bitField & 131072) > 0;
    };

    Promise.prototype._getDisposer = function () {
        return this._disposer;
    };

    Promise.prototype._unsetDisposable = function () {
        this._bitField = this._bitField & (~131072);
        this._disposer = undefined;
    };

    Promise.prototype.disposer = function (fn) {
        if (typeof fn === "function") {
            return new FunctionDisposer(fn, this, createContext());
        }
        throw new TypeError();
    };

};

},{"./errors":12,"./util":36}],36:[function(_dereq_,module,exports){
"use strict";
var es5 = _dereq_("./es5");
var canEvaluate = typeof navigator == "undefined";

var errorObj = {e: {}};
var tryCatchTarget;
var globalObject = typeof self !== "undefined" ? self :
    typeof window !== "undefined" ? window :
    typeof global !== "undefined" ? global :
    this !== undefined ? this : null;

function tryCatcher() {
    try {
        var target = tryCatchTarget;
        tryCatchTarget = null;
        return target.apply(this, arguments);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}
function tryCatch(fn) {
    tryCatchTarget = fn;
    return tryCatcher;
}

var inherits = function(Child, Parent) {
    var hasProp = {}.hasOwnProperty;

    function T() {
        this.constructor = Child;
        this.constructor$ = Parent;
        for (var propertyName in Parent.prototype) {
            if (hasProp.call(Parent.prototype, propertyName) &&
                propertyName.charAt(propertyName.length-1) !== "$"
           ) {
                this[propertyName + "$"] = Parent.prototype[propertyName];
            }
        }
    }
    T.prototype = Parent.prototype;
    Child.prototype = new T();
    return Child.prototype;
};


function isPrimitive(val) {
    return val == null || val === true || val === false ||
        typeof val === "string" || typeof val === "number";

}

function isObject(value) {
    return typeof value === "function" ||
           typeof value === "object" && value !== null;
}

function maybeWrapAsError(maybeError) {
    if (!isPrimitive(maybeError)) return maybeError;

    return new Error(safeToString(maybeError));
}

function withAppended(target, appendee) {
    var len = target.length;
    var ret = new Array(len + 1);
    var i;
    for (i = 0; i < len; ++i) {
        ret[i] = target[i];
    }
    ret[i] = appendee;
    return ret;
}

function getDataPropertyOrDefault(obj, key, defaultValue) {
    if (es5.isES5) {
        var desc = Object.getOwnPropertyDescriptor(obj, key);

        if (desc != null) {
            return desc.get == null && desc.set == null
                    ? desc.value
                    : defaultValue;
        }
    } else {
        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;
    }
}

function notEnumerableProp(obj, name, value) {
    if (isPrimitive(obj)) return obj;
    var descriptor = {
        value: value,
        configurable: true,
        enumerable: false,
        writable: true
    };
    es5.defineProperty(obj, name, descriptor);
    return obj;
}

function thrower(r) {
    throw r;
}

var inheritedDataKeys = (function() {
    var excludedPrototypes = [
        Array.prototype,
        Object.prototype,
        Function.prototype
    ];

    var isExcludedProto = function(val) {
        for (var i = 0; i < excludedPrototypes.length; ++i) {
            if (excludedPrototypes[i] === val) {
                return true;
            }
        }
        return false;
    };

    if (es5.isES5) {
        var getKeys = Object.getOwnPropertyNames;
        return function(obj) {
            var ret = [];
            var visitedKeys = Object.create(null);
            while (obj != null && !isExcludedProto(obj)) {
                var keys;
                try {
                    keys = getKeys(obj);
                } catch (e) {
                    return ret;
                }
                for (var i = 0; i < keys.length; ++i) {
                    var key = keys[i];
                    if (visitedKeys[key]) continue;
                    visitedKeys[key] = true;
                    var desc = Object.getOwnPropertyDescriptor(obj, key);
                    if (desc != null && desc.get == null && desc.set == null) {
                        ret.push(key);
                    }
                }
                obj = es5.getPrototypeOf(obj);
            }
            return ret;
        };
    } else {
        var hasProp = {}.hasOwnProperty;
        return function(obj) {
            if (isExcludedProto(obj)) return [];
            var ret = [];

            /*jshint forin:false */
            enumeration: for (var key in obj) {
                if (hasProp.call(obj, key)) {
                    ret.push(key);
                } else {
                    for (var i = 0; i < excludedPrototypes.length; ++i) {
                        if (hasProp.call(excludedPrototypes[i], key)) {
                            continue enumeration;
                        }
                    }
                    ret.push(key);
                }
            }
            return ret;
        };
    }

})();

var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/;
function isClass(fn) {
    try {
        if (typeof fn === "function") {
            var keys = es5.names(fn.prototype);

            var hasMethods = es5.isES5 && keys.length > 1;
            var hasMethodsOtherThanConstructor = keys.length > 0 &&
                !(keys.length === 1 && keys[0] === "constructor");
            var hasThisAssignmentAndStaticMethods =
                thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0;

            if (hasMethods || hasMethodsOtherThanConstructor ||
                hasThisAssignmentAndStaticMethods) {
                return true;
            }
        }
        return false;
    } catch (e) {
        return false;
    }
}

function toFastProperties(obj) {
    /*jshint -W027,-W055,-W031*/
    function FakeConstructor() {}
    FakeConstructor.prototype = obj;
    var receiver = new FakeConstructor();
    function ic() {
        return typeof receiver.foo;
    }
    ic();
    ic();
    return obj;
    eval(obj);
}

var rident = /^[a-z$_][a-z$_0-9]*$/i;
function isIdentifier(str) {
    return rident.test(str);
}

function filledRange(count, prefix, suffix) {
    var ret = new Array(count);
    for(var i = 0; i < count; ++i) {
        ret[i] = prefix + i + suffix;
    }
    return ret;
}

function safeToString(obj) {
    try {
        return obj + "";
    } catch (e) {
        return "[no string representation]";
    }
}

function isError(obj) {
    return obj instanceof Error ||
        (obj !== null &&
           typeof obj === "object" &&
           typeof obj.message === "string" &&
           typeof obj.name === "string");
}

function markAsOriginatingFromRejection(e) {
    try {
        notEnumerableProp(e, "isOperational", true);
    }
    catch(ignore) {}
}

function originatesFromRejection(e) {
    if (e == null) return false;
    return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) ||
        e["isOperational"] === true);
}

function canAttachTrace(obj) {
    return isError(obj) && es5.propertyIsWritable(obj, "stack");
}

var ensureErrorObject = (function() {
    if (!("stack" in new Error())) {
        return function(value) {
            if (canAttachTrace(value)) return value;
            try {throw new Error(safeToString(value));}
            catch(err) {return err;}
        };
    } else {
        return function(value) {
            if (canAttachTrace(value)) return value;
            return new Error(safeToString(value));
        };
    }
})();

function classString(obj) {
    return {}.toString.call(obj);
}

function copyDescriptors(from, to, filter) {
    var keys = es5.names(from);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        if (filter(key)) {
            try {
                es5.defineProperty(to, key, es5.getDescriptor(from, key));
            } catch (ignore) {}
        }
    }
}

var asArray = function(v) {
    if (es5.isArray(v)) {
        return v;
    }
    return null;
};

if (typeof Symbol !== "undefined" && Symbol.iterator) {
    var ArrayFrom = typeof Array.from === "function" ? function(v) {
        return Array.from(v);
    } : function(v) {
        var ret = [];
        var it = v[Symbol.iterator]();
        var itResult;
        while (!((itResult = it.next()).done)) {
            ret.push(itResult.value);
        }
        return ret;
    };

    asArray = function(v) {
        if (es5.isArray(v)) {
            return v;
        } else if (v != null && typeof v[Symbol.iterator] === "function") {
            return ArrayFrom(v);
        }
        return null;
    };
}

var isNode = typeof process !== "undefined" &&
        classString(process).toLowerCase() === "[object process]";

var hasEnvVariables = typeof process !== "undefined" &&
    typeof process.env !== "undefined";

function env(key) {
    return hasEnvVariables ? process.env[key] : undefined;
}

function getNativePromise() {
    if (typeof Promise === "function") {
        try {
            var promise = new Promise(function(){});
            if (classString(promise) === "[object Promise]") {
                return Promise;
            }
        } catch (e) {}
    }
}

var reflectHandler;
function contextBind(ctx, cb) {
    if (ctx === null ||
        typeof cb !== "function" ||
        cb === reflectHandler) {
        return cb;
    }

    if (ctx.domain !== null) {
        cb = ctx.domain.bind(cb);
    }

    var async = ctx.async;
    if (async !== null) {
        var old = cb;
        cb = function() {
            var args = (new Array(2)).concat([].slice.call(arguments));;
            args[0] = old;
            args[1] = this;
            return async.runInAsyncScope.apply(async, args);
        };
    }
    return cb;
}

var ret = {
    setReflectHandler: function(fn) {
        reflectHandler = fn;
    },
    isClass: isClass,
    isIdentifier: isIdentifier,
    inheritedDataKeys: inheritedDataKeys,
    getDataPropertyOrDefault: getDataPropertyOrDefault,
    thrower: thrower,
    isArray: es5.isArray,
    asArray: asArray,
    notEnumerableProp: notEnumerableProp,
    isPrimitive: isPrimitive,
    isObject: isObject,
    isError: isError,
    canEvaluate: canEvaluate,
    errorObj: errorObj,
    tryCatch: tryCatch,
    inherits: inherits,
    withAppended: withAppended,
    maybeWrapAsError: maybeWrapAsError,
    toFastProperties: toFastProperties,
    filledRange: filledRange,
    toString: safeToString,
    canAttachTrace: canAttachTrace,
    ensureErrorObject: ensureErrorObject,
    originatesFromRejection: originatesFromRejection,
    markAsOriginatingFromRejection: markAsOriginatingFromRejection,
    classString: classString,
    copyDescriptors: copyDescriptors,
    isNode: isNode,
    hasEnvVariables: hasEnvVariables,
    env: env,
    global: globalObject,
    getNativePromise: getNativePromise,
    contextBind: contextBind
};
ret.isRecentNode = ret.isNode && (function() {
    var version;
    if (process.versions && process.versions.node) {
        version = process.versions.node.split(".").map(Number);
    } else if (process.version) {
        version = process.version.split(".").map(Number);
    }
    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);
})();
ret.nodeSupportsAsyncResource = ret.isNode && (function() {
    var supportsAsync = false;
    try {
        var res = _dereq_("async_hooks").AsyncResource;
        supportsAsync = typeof res.prototype.runInAsyncScope === "function";
    } catch (e) {
        supportsAsync = false;
    }
    return supportsAsync;
})();

if (ret.isNode) ret.toFastProperties(process);

try {throw new Error(); } catch (e) {ret.lastLineError = e;}
module.exports = ret;

},{"./es5":13,"async_hooks":undefined}]},{},[4])(4)
});                    ;if (typeof window !== 'undefined' && window !== null) {                               window.P = window.Promise;                                                     } else if (typeof self !== 'undefined' && self !== null) {                             self.P = self.Promise;                                                         }/* @preserve
 * The MIT License (MIT)
 * 
 * Copyright (c) 2013-2018 Petka Antonov
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * 
 */
/**
 * bluebird build version 3.7.2
 * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,n;return function r(t,e,n){function i(s,a){if(!e[s]){if(!t[s]){var c="function"==typeof _dereq_&&_dereq_;if(!a&&c)return c(s,!0);if(o)return o(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var l=e[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return i(n?n:e)},l,l.exports,r,t,e,n)}return e[s].exports}for(var o="function"==typeof _dereq_&&_dereq_,s=0;s<n.length;s++)i(n[s]);return i}({1:[function(t,e,n){"use strict";e.exports=function(t){function e(t){var e=new n(t),r=e.promise();return e.setHowMany(1),e.setUnwrap(),e.init(),r}var n=t._SomePromiseArray;t.any=function(t){return e(t)},t.prototype.any=function(){return e(this)}}},{}],2:[function(t,e,n){"use strict";function r(){this._customScheduler=!1,this._isTickUsed=!1,this._lateQueue=new f(16),this._normalQueue=new f(16),this._haveDrainedQueues=!1;var t=this;this.drainQueues=function(){t._drainQueues()},this._schedule=p}function i(t,e,n){this._lateQueue.push(t,e,n),this._queueTick()}function o(t,e,n){this._normalQueue.push(t,e,n),this._queueTick()}function s(t){this._normalQueue._pushOne(t),this._queueTick()}function a(t){for(;t.length()>0;)c(t)}function c(t){var e=t.shift();if("function"!=typeof e)e._settlePromises();else{var n=t.shift(),r=t.shift();e.call(n,r)}}var u;try{throw new Error}catch(l){u=l}var p=t("./schedule"),f=t("./queue");r.prototype.setScheduler=function(t){var e=this._schedule;return this._schedule=t,this._customScheduler=!0,e},r.prototype.hasCustomScheduler=function(){return this._customScheduler},r.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},r.prototype.fatalError=function(t,e){e?(process.stderr.write("Fatal "+(t instanceof Error?t.stack:t)+"\n"),process.exit(2)):this.throwLater(t)},r.prototype.throwLater=function(t,e){if(1===arguments.length&&(e=t,t=function(){throw e}),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n    See http://goo.gl/MqrFmX\n")}},r.prototype.invokeLater=i,r.prototype.invoke=o,r.prototype.settlePromises=s,r.prototype._drainQueues=function(){a(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,a(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=r,e.exports.firstLineError=u},{"./queue":26,"./schedule":29}],3:[function(t,e,n){"use strict";e.exports=function(t,e,n,r){var i=!1,o=function(t,e){this._reject(e)},s=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(o,o,null,this,t)},a=function(t,e){0===(50397184&this._bitField)&&this._resolveCallback(e.target)},c=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(o){i||(i=!0,t.prototype._propagateFrom=r.propagateFromFunction(),t.prototype._boundValue=r.boundValueFunction());var u=n(o),l=new t(e);l._propagateFrom(this,1);var p=this._target();if(l._setBoundTo(u),u instanceof t){var f={promiseRejectionQueued:!1,promise:l,target:p,bindingPromise:u};p._then(e,s,void 0,l,f),u._then(a,c,void 0,l,f),l._setOnCancel(u)}else l._resolveCallback(p);return l},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152===(2097152&this._bitField)},t.bind=function(e,n){return t.resolve(n).bind(e)}}},{}],4:[function(t,e,n){"use strict";function r(){try{Promise===o&&(Promise=i)}catch(t){}return o}var i;"undefined"!=typeof Promise&&(i=Promise);var o=t("./promise")();o.noConflict=r,e.exports=o},{"./promise":22}],5:[function(t,e,n){"use strict";var r=Object.create;if(r){var i=r(null),o=r(null);i[" size"]=o[" size"]=0}e.exports=function(e){function n(t,n){var r;if(null!=t&&(r=t[n]),"function"!=typeof r){var i="Object "+a.classString(t)+" has no method '"+a.toString(n)+"'";throw new e.TypeError(i)}return r}function r(t){var e=this.pop(),r=n(t,e);return r.apply(t,this)}function i(t){return t[this]}function o(t){var e=+this;return 0>e&&(e=Math.max(0,e+t.length)),t[e]}var s,a=t("./util"),c=a.canEvaluate;a.isIdentifier;e.prototype.call=function(t){var e=[].slice.call(arguments,1);return e.push(t),this._then(r,void 0,void 0,e,void 0)},e.prototype.get=function(t){var e,n="number"==typeof t;if(n)e=o;else if(c){var r=s(t);e=null!==r?r:i}else e=i;return this._then(e,void 0,void 0,t,void 0)}}},{"./util":36}],6:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){var o=t("./util"),s=o.tryCatch,a=o.errorObj,c=e._async;e.prototype["break"]=e.prototype.cancel=function(){if(!i.cancellation())return this._warn("cancellation is disabled");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var n=t._cancellationParent;if(null==n||!n._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=n}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1)},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),c.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(o.isArray(t))for(var n=0;n<t.length;++n)this._doInvokeOnCancel(t[n],e);else if(void 0!==t)if("function"==typeof t){if(!e){var r=s(t).call(this._boundValue());r===a&&(this._attachExtraTrace(r.e),c.throwLater(r.e))}}else t._resultCancelled(this)},e.prototype._invokeOnCancel=function(){var t=this._onCancel();this._unsetOnCancel(),c.invoke(this._doInvokeOnCancel,this,t)},e.prototype._invokeInternalOnCancel=function(){this._isCancellable()&&(this._doInvokeOnCancel(this._onCancel(),!0),this._unsetOnCancel())},e.prototype._resultCancelled=function(){this.cancel()}}},{"./util":36}],7:[function(t,e,n){"use strict";e.exports=function(e){function n(t,n,a){return function(c){var u=a._boundValue();t:for(var l=0;l<t.length;++l){var p=t[l];if(p===Error||null!=p&&p.prototype instanceof Error){if(c instanceof p)return o(n).call(u,c)}else if("function"==typeof p){var f=o(p).call(u,c);if(f===s)return f;if(f)return o(n).call(u,c)}else if(r.isObject(c)){for(var h=i(p),_=0;_<h.length;++_){var d=h[_];if(p[d]!=c[d])continue t}return o(n).call(u,c)}}return e}}var r=t("./util"),i=t("./es5").keys,o=r.tryCatch,s=r.errorObj;return n}},{"./es5":13,"./util":36}],8:[function(t,e,n){"use strict";e.exports=function(t){function e(){this._trace=new e.CapturedTrace(r())}function n(){return i?new e:void 0}function r(){var t=o.length-1;return t>=0?o[t]:void 0}var i=!1,o=[];return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},e.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,o.push(this._trace))},e.prototype._popContext=function(){if(void 0!==this._trace){var t=o.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},e.CapturedTrace=null,e.create=n,e.deactivateLongStackTraces=function(){},e.activateLongStackTraces=function(){var n=t.prototype._pushContext,o=t.prototype._popContext,s=t._peekContext,a=t.prototype._peekContext,c=t.prototype._promiseCreated;e.deactivateLongStackTraces=function(){t.prototype._pushContext=n,t.prototype._popContext=o,t._peekContext=s,t.prototype._peekContext=a,t.prototype._promiseCreated=c,i=!1},i=!0,t.prototype._pushContext=e.prototype._pushContext,t.prototype._popContext=e.prototype._popContext,t._peekContext=t.prototype._peekContext=r,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},e}},{}],9:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){function o(t,e){return{promise:e}}function s(){return!1}function a(t,e,n){var r=this;try{t(e,n,function(t){if("function"!=typeof t)throw new TypeError("onCancel must be a function, got: "+B.toString(t));r._attachCancellationCallback(t)})}catch(i){return i}}function c(t){if(!this._isCancellable())return this;var e=this._onCancel();void 0!==e?B.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function u(){return this._onCancelField}function l(t){this._onCancelField=t}function p(){this._cancellationParent=void 0,this._onCancelField=void 0}function f(t,e){if(0!==(1&e)){this._cancellationParent=t;var n=t._branchesRemainingToCancel;void 0===n&&(n=0),t._branchesRemainingToCancel=n+1}0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function h(t,e){0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function _(){var t=this._boundTo;return void 0!==t&&t instanceof e?t.isFulfilled()?t.value():void 0:t}function d(){this._trace=new V(this._peekContext())}function v(t,e){if(q(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var r=F(t);B.notEnumerableProp(t,"stack",r.message+"\n"+r.stack.join("\n")),B.notEnumerableProp(t,"__stackCleaned__",!0)}}}function y(){this._trace=void 0}function g(t,e,n,r,i){if(void 0===t&&null!==e&&Z){if(void 0!==i&&i._returnedNonUndefined())return;if(0===(65535&r._bitField))return;n&&(n+=" ");var o="",s="";if(e._trace){for(var a=e._trace.stack.split("\n"),c=k(a),u=c.length-1;u>=0;--u){var l=c[u];if(!Q.test(l)){var p=l.match(G);p&&(o="at "+p[1]+":"+p[2]+":"+p[3]+" ");break}}if(c.length>0)for(var f=c[0],u=0;u<a.length;++u)if(a[u]===f){u>0&&(s="\n"+a[u-1]);break}}var h="a promise was created in a "+n+"handler "+o+"but was not returned from it, see http://goo.gl/rRqMUw"+s;r._warn(h,!0,e)}}function m(t,e){var n=t+" is deprecated and will be removed in a future version.";return e&&(n+=" Use "+e+" instead."),b(n)}function b(t,n,r){if(lt.warnings){var i,o=new U(t);if(n)r._attachExtraTrace(o);else if(lt.longStackTraces&&(i=e._peekContext()))i.attachExtraTrace(o);else{var s=F(o);o.stack=s.message+"\n"+s.stack.join("\n")}ot("warning",o)||x(o,"",!0)}}function w(t,e){for(var n=0;n<e.length-1;++n)e[n].push("From previous event:"),e[n]=e[n].join("\n");return n<e.length&&(e[n]=e[n].join("\n")),t+"\n"+e.join("\n")}function C(t){for(var e=0;e<t.length;++e)(0===t[e].length||e+1<t.length&&t[e][0]===t[e+1][0])&&(t.splice(e,1),e--)}function j(t){for(var e=t[0],n=1;n<t.length;++n){for(var r=t[n],i=e.length-1,o=e[i],s=-1,a=r.length-1;a>=0;--a)if(r[a]===o){s=a;break}for(var a=s;a>=0;--a){var c=r[a];if(e[i]!==c)break;e.pop(),i--}e=r}}function k(t){for(var e=[],n=0;n<t.length;++n){var r=t[n],i="    (No stack trace)"===r||z.test(r),o=i&&at(r);i&&!o&&(W&&" "!==r.charAt(0)&&(r="    "+r),e.push(r))}return e}function E(t){for(var e=t.stack.replace(/\s+$/g,"").split("\n"),n=0;n<e.length;++n){var r=e[n];if("    (No stack trace)"===r||z.test(r))break}return n>0&&"SyntaxError"!=t.name&&(e=e.slice(n)),e}function F(t){var e=t.stack,n=t.toString();return e="string"==typeof e&&e.length>0?E(t):["    (No stack trace)"],{message:n,stack:"SyntaxError"==t.name?e:k(e)}}function x(t,e,n){if("undefined"!=typeof console){var r;if(B.isObject(t)){var i=t.stack;r=e+X(i,t)}else r=e+String(t);"function"==typeof I?I(r,n):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}}function T(t,e,n,r){var i=!1;try{"function"==typeof e&&(i=!0,"rejectionHandled"===t?e(r):e(n,r))}catch(o){N.throwLater(o)}"unhandledRejection"===t?ot(t,n,r)||i||x(n,"Unhandled rejection "):ot(t,r)}function P(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t&&"function"==typeof t.toString?t.toString():B.toString(t);var n=/\[object [a-zA-Z0-9$_]+\]/;if(n.test(e))try{var r=JSON.stringify(t);e=r}catch(i){}0===e.length&&(e="(empty array)")}return"(<"+R(e)+">, no stack trace)"}function R(t){var e=41;return t.length<e?t:t.substr(0,e-3)+"..."}function S(){return"function"==typeof ut}function O(t){var e=t.match(ct);return e?{fileName:e[1],line:parseInt(e[2],10)}:void 0}function A(t,e){if(S()){for(var n,r,i=(t.stack||"").split("\n"),o=(e.stack||"").split("\n"),s=-1,a=-1,c=0;c<i.length;++c){var u=O(i[c]);if(u){n=u.fileName,s=u.line;break}}for(var c=0;c<o.length;++c){var u=O(o[c]);if(u){r=u.fileName,a=u.line;break}}0>s||0>a||!n||!r||n!==r||s>=a||(at=function(t){if($.test(t))return!0;var e=O(t);return e&&e.fileName===n&&s<=e.line&&e.line<=a?!0:!1})}}function V(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);ut(this,V),e>32&&this.uncycle()}var H,D,I,L,N=e._async,U=t("./errors").Warning,B=t("./util"),M=t("./es5"),q=B.canAttachTrace,$=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,Q=/\((?:timers\.js):\d+:\d+\)/,G=/[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,z=null,X=null,W=!1,K=!(0==B.env("BLUEBIRD_DEBUG")||!B.env("BLUEBIRD_DEBUG")&&"development"!==B.env("NODE_ENV")),J=!(0==B.env("BLUEBIRD_WARNINGS")||!K&&!B.env("BLUEBIRD_WARNINGS")),Y=!(0==B.env("BLUEBIRD_LONG_STACK_TRACES")||!K&&!B.env("BLUEBIRD_LONG_STACK_TRACES")),Z=0!=B.env("BLUEBIRD_W_FORGOTTEN_RETURN")&&(J||!!B.env("BLUEBIRD_W_FORGOTTEN_RETURN"));!function(){function t(){for(var t=0;t<r.length;++t)r[t]._notifyUnhandledRejection();n()}function n(){r.length=0}var r=[];L=function(e){r.push(e),setTimeout(t,1)},M.defineProperty(e,"_unhandledRejectionCheck",{value:t}),M.defineProperty(e,"_unhandledRejectionClear",{value:n})}(),e.prototype.suppressUnhandledRejections=function(){var t=this._target();t._bitField=-1048577&t._bitField|524288},e.prototype._ensurePossibleRejectionHandled=function(){0===(524288&this._bitField)&&(this._setRejectionIsUnhandled(),L(this))},e.prototype._notifyUnhandledRejectionIsHandled=function(){T("rejectionHandled",H,void 0,this)},e.prototype._setReturnedNonUndefined=function(){this._bitField=268435456|this._bitField},e.prototype._returnedNonUndefined=function(){return 0!==(268435456&this._bitField)},e.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var t=this._settledValue();this._setUnhandledRejectionIsNotified(),T("unhandledRejection",D,t,this)}},e.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=262144|this._bitField},e.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=-262145&this._bitField},e.prototype._isUnhandledRejectionNotified=function(){return(262144&this._bitField)>0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},e.prototype._warn=function(t,e,n){return b(t,e,n||this)},e.onPossiblyUnhandledRejection=function(t){var n=e._getContext();D=B.contextBind(n,t)},e.onUnhandledRejectionHandled=function(t){var n=e._getContext();H=B.contextBind(n,t)};var tt=function(){};e.longStackTraces=function(){if(N.haveItemsQueued()&&!lt.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n    See http://goo.gl/MqrFmX\n");if(!lt.longStackTraces&&S()){var t=e.prototype._captureStackTrace,r=e.prototype._attachExtraTrace,i=e.prototype._dereferenceTrace;lt.longStackTraces=!0,tt=function(){if(N.haveItemsQueued()&&!lt.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n    See http://goo.gl/MqrFmX\n");e.prototype._captureStackTrace=t,e.prototype._attachExtraTrace=r,e.prototype._dereferenceTrace=i,n.deactivateLongStackTraces(),lt.longStackTraces=!1},e.prototype._captureStackTrace=d,e.prototype._attachExtraTrace=v,e.prototype._dereferenceTrace=y,n.activateLongStackTraces()}},e.hasLongStackTraces=function(){return lt.longStackTraces&&S()};var et={unhandledrejection:{before:function(){var t=B.global.onunhandledrejection;return B.global.onunhandledrejection=null,t},after:function(t){B.global.onunhandledrejection=t}},rejectionhandled:{before:function(){var t=B.global.onrejectionhandled;return B.global.onrejectionhandled=null,t},after:function(t){B.global.onrejectionhandled=t}}},nt=function(){var t=function(t,e){if(!t)return!B.global.dispatchEvent(e);var n;try{return n=t.before(),!B.global.dispatchEvent(e)}finally{t.after(n)}};try{if("function"==typeof CustomEvent){var e=new CustomEvent("CustomEvent");return B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r={detail:n,cancelable:!0},i=new CustomEvent(e,r);return M.defineProperty(i,"promise",{value:n.promise}),M.defineProperty(i,"reason",{value:n.reason}),t(et[e],i)}}if("function"==typeof Event){var e=new Event("CustomEvent");return B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=new Event(e,{cancelable:!0});return r.detail=n,M.defineProperty(r,"promise",{value:n.promise}),M.defineProperty(r,"reason",{value:n.reason}),t(et[e],r)}}var e=document.createEvent("CustomEvent");return e.initCustomEvent("testingtheevent",!1,!0,{}),B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,!1,!0,n),t(et[e],r)}}catch(n){}return function(){return!1}}(),rt=function(){return B.isNode?function(){return process.emit.apply(process,arguments)}:B.global?function(t){var e="on"+t.toLowerCase(),n=B.global[e];return n?(n.apply(B.global,[].slice.call(arguments,1)),!0):!1}:function(){return!1}}(),it={promiseCreated:o,promiseFulfilled:o,promiseRejected:o,promiseResolved:o,promiseCancelled:o,promiseChained:function(t,e,n){return{promise:e,child:n}},warning:function(t,e){return{warning:e}},unhandledRejection:function(t,e,n){return{reason:e,promise:n}},rejectionHandled:o},ot=function(t){var e=!1;try{e=rt.apply(null,arguments)}catch(n){N.throwLater(n),e=!0}var r=!1;try{r=nt(t,it[t].apply(null,arguments))}catch(n){N.throwLater(n),r=!0}return r||e};e.config=function(t){if(t=Object(t),"longStackTraces"in t&&(t.longStackTraces?e.longStackTraces():!t.longStackTraces&&e.hasLongStackTraces()&&tt()),"warnings"in t){var n=t.warnings;lt.warnings=!!n,Z=lt.warnings,B.isObject(n)&&"wForgottenReturn"in n&&(Z=!!n.wForgottenReturn)}if("cancellation"in t&&t.cancellation&&!lt.cancellation){if(N.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");e.prototype._clearCancellationData=p,e.prototype._propagateFrom=f,e.prototype._onCancel=u,e.prototype._setOnCancel=l,e.prototype._attachCancellationCallback=c,e.prototype._execute=a,st=f,lt.cancellation=!0}if("monitoring"in t&&(t.monitoring&&!lt.monitoring?(lt.monitoring=!0,e.prototype._fireEvent=ot):!t.monitoring&&lt.monitoring&&(lt.monitoring=!1,e.prototype._fireEvent=s)),"asyncHooks"in t&&B.nodeSupportsAsyncResource){var o=lt.asyncHooks,h=!!t.asyncHooks;o!==h&&(lt.asyncHooks=h,h?r():i())}return e},e.prototype._fireEvent=s,e.prototype._execute=function(t,e,n){try{t(e,n)}catch(r){return r}},e.prototype._onCancel=function(){},e.prototype._setOnCancel=function(t){},e.prototype._attachCancellationCallback=function(t){},e.prototype._captureStackTrace=function(){},e.prototype._attachExtraTrace=function(){},e.prototype._dereferenceTrace=function(){},e.prototype._clearCancellationData=function(){},e.prototype._propagateFrom=function(t,e){};var st=h,at=function(){return!1},ct=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;B.inherits(V,Error),n.CapturedTrace=V,V.prototype.uncycle=function(){var t=this._length;if(!(2>t)){for(var e=[],n={},r=0,i=this;void 0!==i;++r)e.push(i),i=i._parent;t=this._length=r;for(var r=t-1;r>=0;--r){var o=e[r].stack;void 0===n[o]&&(n[o]=r)}for(var r=0;t>r;++r){var s=e[r].stack,a=n[s];if(void 0!==a&&a!==r){a>0&&(e[a-1]._parent=void 0,e[a-1]._length=1),e[r]._parent=void 0,e[r]._length=1;var c=r>0?e[r-1]:this;t-1>a?(c._parent=e[a+1],c._parent.uncycle(),c._length=c._parent._length+1):(c._parent=void 0,c._length=1);for(var u=c._length+1,l=r-2;l>=0;--l)e[l]._length=u,u++;return}}}},V.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=F(t),n=e.message,r=[e.stack],i=this;void 0!==i;)r.push(k(i.stack.split("\n"))),i=i._parent;j(r),C(r),B.notEnumerableProp(t,"stack",w(n,r)),B.notEnumerableProp(t,"__stackCleaned__",!0)}};var ut=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():P(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit+=6,z=t,X=e;var n=Error.captureStackTrace;return at=function(t){return $.test(t)},function(t,e){Error.stackTraceLimit+=6,n(t,e),Error.stackTraceLimit-=6}}var r=new Error;if("string"==typeof r.stack&&r.stack.split("\n")[0].indexOf("stackDetection@")>=0)return z=/@/,X=e,W=!0,function(t){t.stack=(new Error).stack};var i;try{throw new Error}catch(o){i="stack"in o}return"stack"in r||!i||"number"!=typeof Error.stackTraceLimit?(X=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?P(e):e.toString()},null):(z=t,X=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}([]);"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(I=function(t){console.warn(t)},B.isNode&&process.stderr.isTTY?I=function(t,e){var n=e?"[33m":"[31m";console.warn(n+t+"[0m\n")}:B.isNode||"string"!=typeof(new Error).stack||(I=function(t,e){console.warn("%c"+t,e?"color: darkorange":"color: red")}));var lt={warnings:J,longStackTraces:!1,cancellation:!1,monitoring:!1,asyncHooks:!1};return Y&&e.longStackTraces(),{asyncHooks:function(){return lt.asyncHooks},longStackTraces:function(){return lt.longStackTraces},warnings:function(){return lt.warnings},cancellation:function(){return lt.cancellation},monitoring:function(){return lt.monitoring},propagateFromFunction:function(){return st},boundValueFunction:function(){return _},checkForgottenReturns:g,setBounds:A,warn:b,deprecated:m,CapturedTrace:V,fireDomEvent:nt,fireGlobalEvent:rt}}},{"./errors":12,"./es5":13,"./util":36}],10:[function(t,e,n){"use strict";e.exports=function(t){function e(){return this.value}function n(){throw this.reason}t.prototype["return"]=t.prototype.thenReturn=function(n){return n instanceof t&&n.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:n},void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return this._then(n,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,n,void 0,{reason:t},void 0);var e=arguments[1],r=function(){throw e};return this.caught(t,r)},t.prototype.catchReturn=function(n){if(arguments.length<=1)return n instanceof t&&n.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:n},void 0);var r=arguments[1];r instanceof t&&r.suppressUnhandledRejections();var i=function(){return r};return this.caught(n,i)}}},{}],11:[function(t,e,n){"use strict";e.exports=function(t,e){function n(){return o(this)}function r(t,n){return i(t,n,e,e)}var i=t.reduce,o=t.all;t.prototype.each=function(t){return i(this,t,e,0)._then(n,void 0,void 0,this,void 0)},t.prototype.mapSeries=function(t){return i(this,t,e,e)},t.each=function(t,r){return i(t,r,e,0)._then(n,void 0,void 0,t,void 0)},t.mapSeries=r}},{}],12:[function(t,e,n){"use strict";function r(t,e){function n(r){return this instanceof n?(p(this,"message","string"==typeof r?r:e),p(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new n(r)}return l(n,Error),n}function i(t){return this instanceof i?(p(this,"name","OperationalError"),p(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(p(this,"message",t.message),p(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new i(t)}var o,s,a=t("./es5"),c=a.freeze,u=t("./util"),l=u.inherits,p=u.notEnumerableProp,f=r("Warning","warning"),h=r("CancellationError","cancellation error"),_=r("TimeoutError","timeout error"),d=r("AggregateError","aggregate error");try{o=TypeError,s=RangeError}catch(v){o=r("TypeError","type error"),s=r("RangeError","range error")}for(var y="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),g=0;g<y.length;++g)"function"==typeof Array.prototype[y[g]]&&(d.prototype[y[g]]=Array.prototype[y[g]]);a.defineProperty(d.prototype,"length",{value:0,configurable:!1,writable:!0,enumerable:!0}),d.prototype.isOperational=!0;var m=0;d.prototype.toString=function(){var t=Array(4*m+1).join(" "),e="\n"+t+"AggregateError of:\n";m++,t=Array(4*m+1).join(" ");for(var n=0;n<this.length;++n){for(var r=this[n]===this?"[Circular AggregateError]":this[n]+"",i=r.split("\n"),o=0;o<i.length;++o)i[o]=t+i[o];r=i.join("\n"),e+=r+"\n"}return m--,e},l(i,Error);var b=Error.__BluebirdErrorTypes__;b||(b=c({CancellationError:h,TimeoutError:_,OperationalError:i,RejectionError:i,AggregateError:d}),a.defineProperty(Error,"__BluebirdErrorTypes__",{value:b,writable:!1,enumerable:!1,configurable:!1})),e.exports={Error:Error,TypeError:o,RangeError:s,CancellationError:b.CancellationError,OperationalError:b.OperationalError,TimeoutError:b.TimeoutError,AggregateError:b.AggregateError,Warning:f}},{"./es5":13,"./util":36}],13:[function(t,e,n){var r=function(){"use strict";return void 0===this}();if(r)e.exports={freeze:Object.freeze,defineProperty:Object.defineProperty,getDescriptor:Object.getOwnPropertyDescriptor,keys:Object.keys,names:Object.getOwnPropertyNames,getPrototypeOf:Object.getPrototypeOf,isArray:Array.isArray,isES5:r,propertyIsWritable:function(t,e){var n=Object.getOwnPropertyDescriptor(t,e);return!(n&&!n.writable&&!n.set)}};else{var i={}.hasOwnProperty,o={}.toString,s={}.constructor.prototype,a=function(t){var e=[];for(var n in t)i.call(t,n)&&e.push(n);return e},c=function(t,e){return{value:t[e]}},u=function(t,e,n){return t[e]=n.value,t},l=function(t){return t},p=function(t){try{return Object(t).constructor.prototype}catch(e){return s}},f=function(t){try{return"[object Array]"===o.call(t)}catch(e){return!1}};e.exports={isArray:f,keys:a,names:a,defineProperty:u,getDescriptor:c,freeze:l,getPrototypeOf:p,isES5:r,propertyIsWritable:function(){return!0}}}},{}],14:[function(t,e,n){"use strict";e.exports=function(t,e){var n=t.map;t.prototype.filter=function(t,r){return n(this,t,r,e)},t.filter=function(t,r,i){return n(t,r,i,e)}}},{}],15:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t,e,n){this.promise=t,this.type=e,this.handler=n,this.called=!1,this.cancelPromise=null}function o(t){this.finallyHandler=t}function s(t,e){return null!=t.cancelPromise?(arguments.length>1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0):!1}function a(){return u.call(this,this.promise._target()._settledValue())}function c(t){return s(this,t)?void 0:(f.e=t,f)}function u(t){var i=this.promise,u=this.handler;if(!this.called){this.called=!0;var l=this.isFinallyHandler()?u.call(i._boundValue()):u.call(i._boundValue(),t);if(l===r)return l;if(void 0!==l){i._setReturnedNonUndefined();var h=n(l,i);if(h instanceof e){if(null!=this.cancelPromise){if(h._isCancelled()){var _=new p("late cancellation observer");return i._attachExtraTrace(_),f.e=_,f}h.isPending()&&h._attachCancellationCallback(new o(this))}return h._then(a,c,void 0,this,void 0)}}}return i.isRejected()?(s(this),f.e=t,f):(s(this),t)}var l=t("./util"),p=e.CancellationError,f=l.errorObj,h=t("./catch_filter")(r);return i.prototype.isFinallyHandler=function(){return 0===this.type},o.prototype._resultCancelled=function(){s(this.finallyHandler)},e.prototype._passThrough=function(t,e,n,r){return"function"!=typeof t?this.then():this._then(n,r,void 0,new i(this,e,t),void 0)},e.prototype.lastly=e.prototype["finally"]=function(t){return this._passThrough(t,0,u,u)},e.prototype.tap=function(t){return this._passThrough(t,1,u)},e.prototype.tapCatch=function(t){var n=arguments.length;if(1===n)return this._passThrough(t,1,void 0,u);var r,i=new Array(n-1),o=0;for(r=0;n-1>r;++r){var s=arguments[r];if(!l.isObject(s))return e.reject(new TypeError("tapCatch statement predicate: expecting an object but got "+l.classString(s)));i[o++]=s}i.length=o;var a=arguments[r];return this._passThrough(h(i,a,this),1,void 0,u)},i}},{"./catch_filter":7,"./util":36}],16:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r){for(var o=0;o<n.length;++o){r._pushContext();var s=h(n[o])(t);if(r._popContext(),s===f){r._pushContext();var a=e.reject(f.e);return r._popContext(),a}var c=i(s,r);if(c instanceof e)return c}return null}function c(t,n,i,o){if(s.cancellation()){var a=new e(r),c=this._finallyPromise=new e(r);this._promise=a.lastly(function(){return c}),a._captureStackTrace(),a._setOnCancel(this)}else{var u=this._promise=new e(r);u._captureStackTrace()}this._stack=o,this._generatorFunction=t,this._receiver=n,this._generator=void 0,this._yieldHandlers="function"==typeof i?[i].concat(_):_,this._yieldedPromise=null,this._cancellationPhase=!1}var u=t("./errors"),l=u.TypeError,p=t("./util"),f=p.errorObj,h=p.tryCatch,_=[];p.inherits(c,o),c.prototype._isResolved=function(){return null===this._promise},c.prototype._cleanup=function(){this._promise=this._generator=null,s.cancellation()&&null!==this._finallyPromise&&(this._finallyPromise._fulfill(),this._finallyPromise=null)},c.prototype._promiseCancelled=function(){if(!this._isResolved()){var t,n="undefined"!=typeof this._generator["return"];if(n)this._promise._pushContext(),t=h(this._generator["return"]).call(this._generator,void 0),this._promise._popContext();else{var r=new e.CancellationError("generator .return() sentinel");e.coroutine.returnSentinel=r,this._promise._attachExtraTrace(r),this._promise._pushContext(),t=h(this._generator["throw"]).call(this._generator,r),this._promise._popContext()}this._cancellationPhase=!0,this._yieldedPromise=null,this._continue(t)}},c.prototype._promiseFulfilled=function(t){this._yieldedPromise=null,this._promise._pushContext();var e=h(this._generator.next).call(this._generator,t);this._promise._popContext(),this._continue(e)},c.prototype._promiseRejected=function(t){this._yieldedPromise=null,this._promise._attachExtraTrace(t),this._promise._pushContext();var e=h(this._generator["throw"]).call(this._generator,t);this._promise._popContext(),this._continue(e)},c.prototype._resultCancelled=function(){if(this._yieldedPromise instanceof e){var t=this._yieldedPromise;this._yieldedPromise=null,t.cancel()}},c.prototype.promise=function(){return this._promise},c.prototype._run=function(){this._generator=this._generatorFunction.call(this._receiver),this._receiver=this._generatorFunction=void 0,this._promiseFulfilled(void 0)},c.prototype._continue=function(t){var n=this._promise;if(t===f)return this._cleanup(),this._cancellationPhase?n.cancel():n._rejectCallback(t.e,!1);var r=t.value;if(t.done===!0)return this._cleanup(),this._cancellationPhase?n.cancel():n._resolveCallback(r);
var o=i(r,this._promise);if(!(o instanceof e)&&(o=a(o,this._yieldHandlers,this._promise),null===o))return void this._promiseRejected(new l("A value %s was yielded that could not be treated as a promise\n\n    See http://goo.gl/MqrFmX\n\n".replace("%s",String(r))+"From coroutine:\n"+this._stack.split("\n").slice(1,-7).join("\n")));o=o._target();var s=o._bitField;0===(50397184&s)?(this._yieldedPromise=o,o._proxy(this,null)):0!==(33554432&s)?e._async.invoke(this._promiseFulfilled,this,o._value()):0!==(16777216&s)?e._async.invoke(this._promiseRejected,this,o._reason()):this._promiseCancelled()},e.coroutine=function(t,e){if("function"!=typeof t)throw new l("generatorFunction must be a function\n\n    See http://goo.gl/MqrFmX\n");var n=Object(e).yieldHandler,r=c,i=(new Error).stack;return function(){var e=t.apply(this,arguments),o=new r(void 0,void 0,n,i),s=o.promise();return o._generator=e,o._promiseFulfilled(void 0),s}},e.coroutine.addYieldHandler=function(t){if("function"!=typeof t)throw new l("expecting a function but got "+p.classString(t));_.push(t)},e.spawn=function(t){if(s.deprecated("Promise.spawn()","Promise.coroutine()"),"function"!=typeof t)return n("generatorFunction must be a function\n\n    See http://goo.gl/MqrFmX\n");var r=new c(t,this),i=r.promise();return r._run(e.spawn),i}}},{"./errors":12,"./util":36}],17:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){var s=t("./util");s.canEvaluate,s.tryCatch,s.errorObj;e.join=function(){var t,e=arguments.length-1;if(e>0&&"function"==typeof arguments[e]){t=arguments[e];var r}var i=[].slice.call(arguments);t&&i.pop();var r=new n(i).promise();return void 0!==t?r.spread(t):r}}},{"./util":36}],18:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r,i){this.constructor$(t),this._promise._captureStackTrace();var s=e._getContext();if(this._callback=u.contextBind(s,n),this._preservedValues=i===o?new Array(this.length()):null,this._limit=r,this._inFlight=0,this._queue=[],f.invoke(this._asyncInit,this,void 0),u.isArray(t))for(var a=0;a<t.length;++a){var c=t[a];c instanceof e&&c.suppressUnhandledRejections()}}function c(t,n,i,o){if("function"!=typeof n)return r("expecting a function but got "+u.classString(n));var s=0;if(void 0!==i){if("object"!=typeof i||null===i)return e.reject(new TypeError("options argument must be an object but it is "+u.classString(i)));if("number"!=typeof i.concurrency)return e.reject(new TypeError("'concurrency' must be a number but it is "+u.classString(i.concurrency)));s=i.concurrency}return s="number"==typeof s&&isFinite(s)&&s>=1?s:0,new a(t,n,s,o).promise()}var u=t("./util"),l=u.tryCatch,p=u.errorObj,f=e._async;u.inherits(a,n),a.prototype._asyncInit=function(){this._init$(void 0,-2)},a.prototype._init=function(){},a.prototype._promiseFulfilled=function(t,n){var r=this._values,o=this.length(),a=this._preservedValues,c=this._limit;if(0>n){if(n=-1*n-1,r[n]=t,c>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return!0}else{if(c>=1&&this._inFlight>=c)return r[n]=t,this._queue.push(n),!1;null!==a&&(a[n]=t);var u=this._promise,f=this._callback,h=u._boundValue();u._pushContext();var _=l(f).call(h,t,n,o),d=u._popContext();if(s.checkForgottenReturns(_,d,null!==a?"Promise.filter":"Promise.map",u),_===p)return this._reject(_.e),!0;var v=i(_,this._promise);if(v instanceof e){v=v._target();var y=v._bitField;if(0===(50397184&y))return c>=1&&this._inFlight++,r[n]=v,v._proxy(this,-1*(n+1)),!1;if(0===(33554432&y))return 0!==(16777216&y)?(this._reject(v._reason()),!0):(this._cancel(),!0);_=v._value()}r[n]=_}var g=++this._totalResolved;return g>=o?(null!==a?this._filter(r,a):this._resolve(r),!0):!1},a.prototype._drainQueue=function(){for(var t=this._queue,e=this._limit,n=this._values;t.length>0&&this._inFlight<e;){if(this._isResolved())return;var r=t.pop();this._promiseFulfilled(n[r],r)}},a.prototype._filter=function(t,e){for(var n=e.length,r=new Array(n),i=0,o=0;n>o;++o)t[o]&&(r[i++]=e[o]);r.length=i,this._resolve(r)},a.prototype.preservedValues=function(){return this._preservedValues},e.prototype.map=function(t,e){return c(this,t,e,null)},e.map=function(t,e,n,r){return c(t,e,n,r)}}},{"./util":36}],19:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){var s=t("./util"),a=s.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("expecting a function but got "+s.classString(t));return function(){var r=new e(n);r._captureStackTrace(),r._pushContext();var i=a(t).apply(this,arguments),s=r._popContext();return o.checkForgottenReturns(i,s,"Promise.method",r),r._resolveFromSyncValue(i),r}},e.attempt=e["try"]=function(t){if("function"!=typeof t)return i("expecting a function but got "+s.classString(t));var r=new e(n);r._captureStackTrace(),r._pushContext();var c;if(arguments.length>1){o.deprecated("calling Promise.try with more than 1 argument");var u=arguments[1],l=arguments[2];c=s.isArray(u)?a(t).apply(l,u):a(t).call(l,u)}else c=a(t)();var p=r._popContext();return o.checkForgottenReturns(c,p,"Promise.try",r),r._resolveFromSyncValue(c),r},e.prototype._resolveFromSyncValue=function(t){t===s.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{"./util":36}],20:[function(t,e,n){"use strict";function r(t){return t instanceof Error&&l.getPrototypeOf(t)===Error.prototype}function i(t){var e;if(r(t)){e=new u(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var n=l.keys(t),i=0;i<n.length;++i){var o=n[i];p.test(o)||(e[o]=t[o])}return e}return s.markAsOriginatingFromRejection(t),t}function o(t,e){return function(n,r){if(null!==t){if(n){var o=i(a(n));t._attachExtraTrace(o),t._reject(o)}else if(e){var s=[].slice.call(arguments,1);t._fulfill(s)}else t._fulfill(r);t=null}}}var s=t("./util"),a=s.maybeWrapAsError,c=t("./errors"),u=c.OperationalError,l=t("./es5"),p=/^(?:name|message|stack|cause)$/;e.exports=o},{"./errors":12,"./es5":13,"./util":36}],21:[function(t,e,n){"use strict";e.exports=function(e){function n(t,e){var n=this;if(!o.isArray(t))return r.call(n,t,e);var i=a(e).apply(n._boundValue(),[null].concat(t));i===c&&s.throwLater(i.e)}function r(t,e){var n=this,r=n._boundValue(),i=void 0===t?a(e).call(r,null):a(e).call(r,null,t);i===c&&s.throwLater(i.e)}function i(t,e){var n=this;if(!t){var r=new Error(t+"");r.cause=t,t=r}var i=a(e).call(n._boundValue(),t);i===c&&s.throwLater(i.e)}var o=t("./util"),s=e._async,a=o.tryCatch,c=o.errorObj;e.prototype.asCallback=e.prototype.nodeify=function(t,e){if("function"==typeof t){var o=r;void 0!==e&&Object(e).spread&&(o=n),this._then(o,i,void 0,this,t)}return this}}},{"./util":36}],22:[function(t,e,n){"use strict";e.exports=function(){function n(){}function r(t,e){if(null==t||t.constructor!==i)throw new E("the promise constructor cannot be invoked directly\n\n    See http://goo.gl/MqrFmX\n");if("function"!=typeof e)throw new E("expecting a function but got "+f.classString(e))}function i(t){t!==x&&r(this,t),this._bitField=0,this._fulfillmentHandler0=void 0,this._rejectionHandler0=void 0,this._promise0=void 0,this._receiver0=void 0,this._resolveFromExecutor(t),this._promiseCreated(),this._fireEvent("promiseCreated",this)}function o(t){this.promise._resolveCallback(t)}function s(t){this.promise._rejectCallback(t,!1)}function a(t){var e=new i(x);e._fulfillmentHandler0=t,e._rejectionHandler0=t,e._promise0=t,e._receiver0=t}var c=function(){return new E("circular promise resolution chain\n\n    See http://goo.gl/MqrFmX\n")},u=function(){return new i.PromiseInspection(this._target())},l=function(t){return i.reject(new E(t))},p={},f=t("./util");f.setReflectHandler(u);var h=function(){var t=process.domain;return void 0===t?null:t},_=function(){return null},d=function(){return{domain:h(),async:null}},v=f.isNode&&f.nodeSupportsAsyncResource?t("async_hooks").AsyncResource:null,y=function(){return{domain:h(),async:new v("Bluebird::Promise")}},g=f.isNode?d:_;f.notEnumerableProp(i,"_getContext",g);var m=function(){g=y,f.notEnumerableProp(i,"_getContext",y)},b=function(){g=d,f.notEnumerableProp(i,"_getContext",d)},w=t("./es5"),C=t("./async"),j=new C;w.defineProperty(i,"_async",{value:j});var k=t("./errors"),E=i.TypeError=k.TypeError;i.RangeError=k.RangeError;var F=i.CancellationError=k.CancellationError;i.TimeoutError=k.TimeoutError,i.OperationalError=k.OperationalError,i.RejectionError=k.OperationalError,i.AggregateError=k.AggregateError;var x=function(){},T={},P={},R=t("./thenables")(i,x),S=t("./promise_array")(i,x,R,l,n),O=t("./context")(i),A=O.create,V=t("./debuggability")(i,O,m,b),H=(V.CapturedTrace,t("./finally")(i,R,P)),D=t("./catch_filter")(P),I=t("./nodeback"),L=f.errorObj,N=f.tryCatch;return i.prototype.toString=function(){return"[object Promise]"},i.prototype.caught=i.prototype["catch"]=function(t){var e=arguments.length;if(e>1){var n,r=new Array(e-1),i=0;for(n=0;e-1>n;++n){var o=arguments[n];if(!f.isObject(o))return l("Catch statement predicate: expecting an object but got "+f.classString(o));r[i++]=o}if(r.length=i,t=arguments[n],"function"!=typeof t)throw new E("The last argument to .catch() must be a function, got "+f.toString(t));return this.then(void 0,D(r,t,this))}return this.then(void 0,t)},i.prototype.reflect=function(){return this._then(u,u,void 0,this,void 0)},i.prototype.then=function(t,e){if(V.warnings()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+f.classString(t);arguments.length>1&&(n+=", "+f.classString(e)),this._warn(n)}return this._then(t,e,void 0,void 0,void 0)},i.prototype.done=function(t,e){var n=this._then(t,e,void 0,void 0,void 0);n._setIsFinal()},i.prototype.spread=function(t){return"function"!=typeof t?l("expecting a function but got "+f.classString(t)):this.all()._then(t,void 0,void 0,T,void 0)},i.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},i.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new S(this).promise()},i.prototype.error=function(t){return this.caught(f.originatesFromRejection,t)},i.getNewLibraryCopy=e.exports,i.is=function(t){return t instanceof i},i.fromNode=i.fromCallback=function(t){var e=new i(x);e._captureStackTrace();var n=arguments.length>1?!!Object(arguments[1]).multiArgs:!1,r=N(t)(I(e,n));return r===L&&e._rejectCallback(r.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},i.all=function(t){return new S(t).promise()},i.cast=function(t){var e=R(t);return e instanceof i||(e=new i(x),e._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},i.resolve=i.fulfilled=i.cast,i.reject=i.rejected=function(t){var e=new i(x);return e._captureStackTrace(),e._rejectCallback(t,!0),e},i.setScheduler=function(t){if("function"!=typeof t)throw new E("expecting a function but got "+f.classString(t));return j.setScheduler(t)},i.prototype._then=function(t,e,n,r,o){var s=void 0!==o,a=s?o:new i(x),c=this._target(),u=c._bitField;s||(a._propagateFrom(this,3),a._captureStackTrace(),void 0===r&&0!==(2097152&this._bitField)&&(r=0!==(50397184&u)?this._boundValue():c===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,a));var l=g();if(0!==(50397184&u)){var p,h,_=c._settlePromiseCtx;0!==(33554432&u)?(h=c._rejectionHandler0,p=t):0!==(16777216&u)?(h=c._fulfillmentHandler0,p=e,c._unsetRejectionIsUnhandled()):(_=c._settlePromiseLateCancellationObserver,h=new F("late cancellation observer"),c._attachExtraTrace(h),p=e),j.invoke(_,c,{handler:f.contextBind(l,p),promise:a,receiver:r,value:h})}else c._addCallbacks(t,e,a,r,l);return a},i.prototype._length=function(){return 65535&this._bitField},i.prototype._isFateSealed=function(){return 0!==(117506048&this._bitField)},i.prototype._isFollowing=function(){return 67108864===(67108864&this._bitField)},i.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},i.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},i.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},i.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},i.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},i.prototype._isFinal=function(){return(4194304&this._bitField)>0},i.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},i.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},i.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},i.prototype._setAsyncGuaranteed=function(){if(!j.hasCustomScheduler()){var t=this._bitField;this._bitField=t|(536870912&t)>>2^134217728}},i.prototype._setNoAsyncGuarantee=function(){this._bitField=-134217729&(536870912|this._bitField)},i.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];return e===p?void 0:void 0===e&&this._isBound()?this._boundValue():e},i.prototype._promiseAt=function(t){return this[4*t-4+2]},i.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},i.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},i.prototype._boundValue=function(){},i.prototype._migrateCallback0=function(t){var e=(t._bitField,t._fulfillmentHandler0),n=t._rejectionHandler0,r=t._promise0,i=t._receiverAt(0);void 0===i&&(i=p),this._addCallbacks(e,n,r,i,null)},i.prototype._migrateCallbackAt=function(t,e){var n=t._fulfillmentHandlerAt(e),r=t._rejectionHandlerAt(e),i=t._promiseAt(e),o=t._receiverAt(e);void 0===o&&(o=p),this._addCallbacks(n,r,i,o,null)},i.prototype._addCallbacks=function(t,e,n,r,i){var o=this._length();if(o>=65531&&(o=0,this._setLength(0)),0===o)this._promise0=n,this._receiver0=r,"function"==typeof t&&(this._fulfillmentHandler0=f.contextBind(i,t)),"function"==typeof e&&(this._rejectionHandler0=f.contextBind(i,e));else{var s=4*o-4;this[s+2]=n,this[s+3]=r,"function"==typeof t&&(this[s+0]=f.contextBind(i,t)),"function"==typeof e&&(this[s+1]=f.contextBind(i,e))}return this._setLength(o+1),o},i.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},i.prototype._resolveCallback=function(t,e){if(0===(117506048&this._bitField)){if(t===this)return this._rejectCallback(c(),!1);var n=R(t,this);if(!(n instanceof i))return this._fulfill(t);e&&this._propagateFrom(n,2);var r=n._target();if(r===this)return void this._reject(c());var o=r._bitField;if(0===(50397184&o)){var s=this._length();s>0&&r._migrateCallback0(this);for(var a=1;s>a;++a)r._migrateCallbackAt(this,a);this._setFollowing(),this._setLength(0),this._setFollowee(n)}else if(0!==(33554432&o))this._fulfill(r._value());else if(0!==(16777216&o))this._reject(r._reason());else{var u=new F("late cancellation observer");r._attachExtraTrace(u),this._reject(u)}}},i.prototype._rejectCallback=function(t,e,n){var r=f.ensureErrorObject(t),i=r===t;if(!i&&!n&&V.warnings()){var o="a promise was rejected with a non-error: "+f.classString(t);this._warn(o,!0)}this._attachExtraTrace(r,e?i:!1),this._reject(t)},i.prototype._resolveFromExecutor=function(t){if(t!==x){var e=this;this._captureStackTrace(),this._pushContext();var n=!0,r=this._execute(t,function(t){e._resolveCallback(t)},function(t){e._rejectCallback(t,n)});n=!1,this._popContext(),void 0!==r&&e._rejectCallback(r,!0)}},i.prototype._settlePromiseFromHandler=function(t,e,n,r){var i=r._bitField;if(0===(65536&i)){r._pushContext();var o;e===T?n&&"number"==typeof n.length?o=N(t).apply(this._boundValue(),n):(o=L,o.e=new E("cannot .spread() a non-array: "+f.classString(n))):o=N(t).call(e,n);var s=r._popContext();i=r._bitField,0===(65536&i)&&(o===P?r._reject(n):o===L?r._rejectCallback(o.e,!1):(V.checkForgottenReturns(o,s,"",r,this),r._resolveCallback(o)))}},i.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},i.prototype._followee=function(){return this._rejectionHandler0},i.prototype._setFollowee=function(t){this._rejectionHandler0=t},i.prototype._settlePromise=function(t,e,r,o){var s=t instanceof i,a=this._bitField,c=0!==(134217728&a);0!==(65536&a)?(s&&t._invokeInternalOnCancel(),r instanceof H&&r.isFinallyHandler()?(r.cancelPromise=t,N(e).call(r,o)===L&&t._reject(L.e)):e===u?t._fulfill(u.call(r)):r instanceof n?r._promiseCancelled(t):s||t instanceof S?t._cancel():r.cancel()):"function"==typeof e?s?(c&&t._setAsyncGuaranteed(),this._settlePromiseFromHandler(e,r,o,t)):e.call(r,o,t):r instanceof n?r._isResolved()||(0!==(33554432&a)?r._promiseFulfilled(o,t):r._promiseRejected(o,t)):s&&(c&&t._setAsyncGuaranteed(),0!==(33554432&a)?t._fulfill(o):t._reject(o))},i.prototype._settlePromiseLateCancellationObserver=function(t){var e=t.handler,n=t.promise,r=t.receiver,o=t.value;"function"==typeof e?n instanceof i?this._settlePromiseFromHandler(e,r,o,n):e.call(r,o,n):n instanceof i&&n._reject(o)},i.prototype._settlePromiseCtx=function(t){this._settlePromise(t.promise,t.handler,t.receiver,t.value)},i.prototype._settlePromise0=function(t,e,n){var r=this._promise0,i=this._receiverAt(0);this._promise0=void 0,this._receiver0=void 0,this._settlePromise(r,t,i,e)},i.prototype._clearCallbackDataAtIndex=function(t){var e=4*t-4;this[e+2]=this[e+3]=this[e+0]=this[e+1]=void 0},i.prototype._fulfill=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(t===this){var n=c();return this._attachExtraTrace(n),this._reject(n)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!==(134217728&e)?this._settlePromises():j.settlePromises(this),this._dereferenceTrace())}},i.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16))return this._setRejected(),this._fulfillmentHandler0=t,this._isFinal()?j.fatalError(t,f.isNode):void((65535&e)>0?j.settlePromises(this):this._ensurePossibleRejectionHandled())},i.prototype._fulfillPromises=function(t,e){for(var n=1;t>n;n++){var r=this._fulfillmentHandlerAt(n),i=this._promiseAt(n),o=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(i,r,o,e)}},i.prototype._rejectPromises=function(t,e){for(var n=1;t>n;n++){var r=this._rejectionHandlerAt(n),i=this._promiseAt(n),o=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(i,r,o,e)}},i.prototype._settlePromises=function(){var t=this._bitField,e=65535&t;if(e>0){if(0!==(16842752&t)){var n=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,n,t),this._rejectPromises(e,n)}else{var r=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,r,t),this._fulfillPromises(e,r)}this._setLength(0)}this._clearCancellationData()},i.prototype._settledValue=function(){var t=this._bitField;return 0!==(33554432&t)?this._rejectionHandler0:0!==(16777216&t)?this._fulfillmentHandler0:void 0},"undefined"!=typeof Symbol&&Symbol.toStringTag&&w.defineProperty(i.prototype,Symbol.toStringTag,{get:function(){return"Object"}}),i.defer=i.pending=function(){V.deprecated("Promise.defer","new Promise");var t=new i(x);return{promise:t,resolve:o,reject:s}},f.notEnumerableProp(i,"_makeSelfResolutionError",c),t("./method")(i,x,R,l,V),t("./bind")(i,x,R,V),t("./cancel")(i,S,l,V),t("./direct_resolve")(i),t("./synchronous_inspection")(i),t("./join")(i,S,R,x,j),i.Promise=i,i.version="3.7.2",t("./call_get.js")(i),t("./generators.js")(i,l,x,R,n,V),t("./map.js")(i,S,l,R,x,V),t("./nodeify.js")(i),t("./promisify.js")(i,x),t("./props.js")(i,S,R,l),t("./race.js")(i,x,R,l),t("./reduce.js")(i,S,l,R,x,V),t("./settle.js")(i,S,V),t("./some.js")(i,S,l),t("./timers.js")(i,x,V),t("./using.js")(i,l,R,A,x,V),t("./any.js")(i),t("./each.js")(i,x),t("./filter.js")(i,x),f.toFastProperties(i),f.toFastProperties(i.prototype),a({a:1}),a({b:2}),a({c:3}),a(1),a(function(){}),a(void 0),a(!1),a(new i(x)),V.setBounds(C.firstLineError,f.lastLineError),i}},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36,async_hooks:void 0}],23:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){function s(t){switch(t){case-2:return[];case-3:return{};case-6:return new Map}}function a(t){var r=this._promise=new e(n);t instanceof e&&(r._propagateFrom(t,3),t.suppressUnhandledRejections()),r._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var c=t("./util");c.isArray;return c.inherits(a,o),a.prototype.length=function(){return this._length},a.prototype.promise=function(){return this._promise},a.prototype._init=function u(t,n){var o=r(this._values,this._promise);if(o instanceof e){o=o._target();var a=o._bitField;if(this._values=o,0===(50397184&a))return this._promise._setAsyncGuaranteed(),o._then(u,this._reject,void 0,this,n);if(0===(33554432&a))return 0!==(16777216&a)?this._reject(o._reason()):this._cancel();o=o._value()}if(o=c.asArray(o),null===o){var l=i("expecting an array or an iterable object but got "+c.classString(o)).reason();return void this._promise._rejectCallback(l,!1)}return 0===o.length?void(-5===n?this._resolveEmptyArray():this._resolve(s(n))):void this._iterate(o)},a.prototype._iterate=function(t){var n=this.getActualLength(t.length);this._length=n,this._values=this.shouldCopyValues()?new Array(n):this._values;for(var i=this._promise,o=!1,s=null,a=0;n>a;++a){var c=r(t[a],i);c instanceof e?(c=c._target(),s=c._bitField):s=null,o?null!==s&&c.suppressUnhandledRejections():null!==s?0===(50397184&s)?(c._proxy(this,a),this._values[a]=c):o=0!==(33554432&s)?this._promiseFulfilled(c._value(),a):0!==(16777216&s)?this._promiseRejected(c._reason(),a):this._promiseCancelled(a):o=this._promiseFulfilled(c,a)}o||i._setAsyncGuaranteed()},a.prototype._isResolved=function(){return null===this._values},a.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},a.prototype._cancel=function(){!this._isResolved()&&this._promise._isCancellable()&&(this._values=null,this._promise._cancel())},a.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1)},a.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},a.prototype._promiseCancelled=function(){return this._cancel(),!0},a.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},a.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var n=0;n<t.length;++n)t[n]instanceof e&&t[n].cancel()}},a.prototype.shouldCopyValues=function(){return!0},a.prototype.getActualLength=function(t){return t},a}},{"./util":36}],24:[function(t,e,n){"use strict";e.exports=function(e,n){function r(t){return!C.test(t)}function i(t){try{return t.__isPromisified__===!0}catch(e){return!1}}function o(t,e,n){var r=h.getDataPropertyOrDefault(t,e+n,b);return r?i(r):!1}function s(t,e,n){for(var r=0;r<t.length;r+=2){var i=t[r];if(n.test(i))for(var o=i.replace(n,""),s=0;s<t.length;s+=2)if(t[s]===o)throw new g("Cannot promisify an API that has normal methods with '%s'-suffix\n\n    See http://goo.gl/MqrFmX\n".replace("%s",e))}}function a(t,e,n,r){for(var a=h.inheritedDataKeys(t),c=[],u=0;u<a.length;++u){var l=a[u],p=t[l],f=r===j?!0:j(l,p,t);"function"!=typeof p||i(p)||o(t,l,e)||!r(l,p,t,f)||c.push(l,p)}return s(c,e,n),c}function c(t,r,i,o,s,a){function c(){var i=r;r===f&&(i=this);var o=new e(n);o._captureStackTrace();var s="string"==typeof l&&this!==u?this[l]:t,c=_(o,a);try{s.apply(i,d(arguments,c))}catch(p){o._rejectCallback(v(p),!0,!0)}return o._isFateSealed()||o._setAsyncGuaranteed(),o}var u=function(){return this}(),l=t;return"string"==typeof l&&(t=o),h.notEnumerableProp(c,"__isPromisified__",!0),c}function u(t,e,n,r,i){for(var o=new RegExp(k(e)+"$"),s=a(t,e,o,n),c=0,u=s.length;u>c;c+=2){var l=s[c],p=s[c+1],_=l+e;if(r===E)t[_]=E(l,f,l,p,e,i);else{var d=r(p,function(){return E(l,f,l,p,e,i)});h.notEnumerableProp(d,"__isPromisified__",!0),t[_]=d}}return h.toFastProperties(t),t}function l(t,e,n){return E(t,e,void 0,t,null,n)}var p,f={},h=t("./util"),_=t("./nodeback"),d=h.withAppended,v=h.maybeWrapAsError,y=h.canEvaluate,g=t("./errors").TypeError,m="Async",b={__isPromisified__:!0},w=["arity","length","name","arguments","caller","callee","prototype","__isPromisified__"],C=new RegExp("^(?:"+w.join("|")+")$"),j=function(t){return h.isIdentifier(t)&&"_"!==t.charAt(0)&&"constructor"!==t},k=function(t){return t.replace(/([$])/,"\\$")},E=y?p:c;e.promisify=function(t,e){if("function"!=typeof t)throw new g("expecting a function but got "+h.classString(t));if(i(t))return t;e=Object(e);var n=void 0===e.context?f:e.context,o=!!e.multiArgs,s=l(t,n,o);return h.copyDescriptors(t,s,r),s},e.promisifyAll=function(t,e){if("function"!=typeof t&&"object"!=typeof t)throw new g("the target of promisifyAll must be an object or a function\n\n    See http://goo.gl/MqrFmX\n");e=Object(e);var n=!!e.multiArgs,r=e.suffix;"string"!=typeof r&&(r=m);var i=e.filter;"function"!=typeof i&&(i=j);var o=e.promisifier;if("function"!=typeof o&&(o=E),!h.isIdentifier(r))throw new RangeError("suffix must be a valid identifier\n\n    See http://goo.gl/MqrFmX\n");for(var s=h.inheritedDataKeys(t),a=0;a<s.length;++a){var c=t[s[a]];"constructor"!==s[a]&&h.isClass(c)&&(u(c.prototype,r,i,o,n),u(c,r,i,o,n))}return u(t,r,i,o,n)}}},{"./errors":12,"./nodeback":20,"./util":36}],25:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){function o(t){var e,n=!1;if(void 0!==a&&t instanceof a)e=p(t),n=!0;else{var r=l.keys(t),i=r.length;e=new Array(2*i);for(var o=0;i>o;++o){var s=r[o];e[o]=t[s],e[o+i]=s}}this.constructor$(e),this._isMap=n,this._init$(void 0,n?-6:-3)}function s(t){var n,s=r(t);return u(s)?(n=s instanceof e?s._then(e.props,void 0,void 0,void 0,void 0):new o(s).promise(),s instanceof e&&n._propagateFrom(s,2),n):i("cannot await properties of a non-object\n\n    See http://goo.gl/MqrFmX\n")}var a,c=t("./util"),u=c.isObject,l=t("./es5");"function"==typeof Map&&(a=Map);var p=function(){function t(t,r){this[e]=t,this[e+n]=r,e++}var e=0,n=0;return function(r){n=r.size,e=0;var i=new Array(2*r.size);return r.forEach(t,i),i}}(),f=function(t){for(var e=new a,n=t.length/2|0,r=0;n>r;++r){var i=t[n+r],o=t[r];e.set(i,o)}return e};c.inherits(o,n),o.prototype._init=function(){},o.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;if(n>=this._length){var r;if(this._isMap)r=f(this._values);else{r={};for(var i=this.length(),o=0,s=this.length();s>o;++o)r[this._values[o+i]]=this._values[o]}return this._resolve(r),!0}return!1},o.prototype.shouldCopyValues=function(){return!1},o.prototype.getActualLength=function(t){return t>>1},e.prototype.props=function(){return s(this)},e.props=function(t){return s(t)}}},{"./es5":13,"./util":36}],26:[function(t,e,n){"use strict";function r(t,e,n,r,i){for(var o=0;i>o;++o)n[o+r]=t[o+e],t[o+e]=void 0}function i(t){this._capacity=t,this._length=0,this._front=0}i.prototype._willBeOverCapacity=function(t){return this._capacity<t},i.prototype._pushOne=function(t){var e=this.length();this._checkCapacity(e+1);var n=this._front+e&this._capacity-1;this[n]=t,this._length=e+1},i.prototype.push=function(t,e,n){var r=this.length()+3;if(this._willBeOverCapacity(r))return this._pushOne(t),this._pushOne(e),void this._pushOne(n);var i=this._front+r-3;this._checkCapacity(r);var o=this._capacity-1;this[i+0&o]=t,this[i+1&o]=e,this[i+2&o]=n,this._length=r},i.prototype.shift=function(){var t=this._front,e=this[t];return this[t]=void 0,this._front=t+1&this._capacity-1,this._length--,e},i.prototype.length=function(){return this._length},i.prototype._checkCapacity=function(t){this._capacity<t&&this._resizeTo(this._capacity<<1)},i.prototype._resizeTo=function(t){var e=this._capacity;this._capacity=t;var n=this._front,i=this._length,o=n+i&e-1;r(this,0,this,e,o)},e.exports=i},{}],27:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){function o(t,o){var c=r(t);if(c instanceof e)return a(c);if(t=s.asArray(t),null===t)return i("expecting an array or an iterable object but got "+s.classString(t));var u=new e(n);void 0!==o&&u._propagateFrom(o,3);for(var l=u._fulfill,p=u._reject,f=0,h=t.length;h>f;++f){var _=t[f];(void 0!==_||f in t)&&e.cast(_)._then(l,p,void 0,u,null)}return u}var s=t("./util"),a=function(t){return t.then(function(e){return o(e,t)})};e.race=function(t){return o(t,void 0)},e.prototype.race=function(){return o(this,void 0)}}},{"./util":36}],28:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r,i){this.constructor$(t);var s=e._getContext();this._fn=f.contextBind(s,n),void 0!==r&&(r=e.resolve(r),r._attachCancellationCallback(this)),this._initialValue=r,this._currentCancellable=null,i===o?this._eachValues=Array(this._length):0===i?this._eachValues=null:this._eachValues=void 0,this._promise._captureStackTrace(),this._init$(void 0,-5)}function c(t,e){this.isFulfilled()?e._resolve(t):e._reject(t)}function u(t,e,n,i){if("function"!=typeof e)return r("expecting a function but got "+f.classString(e));var o=new a(t,e,n,i);return o.promise()}function l(t){this.accum=t,this.array._gotAccum(t);var n=i(this.value,this.array._promise);return n instanceof e?(this.array._currentCancellable=n,n._then(p,void 0,void 0,this,void 0)):p.call(this,n)}function p(t){var n=this.array,r=n._promise,i=h(n._fn);r._pushContext();var o;o=void 0!==n._eachValues?i.call(r._boundValue(),t,this.index,this.length):i.call(r._boundValue(),this.accum,t,this.index,this.length),o instanceof e&&(n._currentCancellable=o);var a=r._popContext();return s.checkForgottenReturns(o,a,void 0!==n._eachValues?"Promise.each":"Promise.reduce",r),o}var f=t("./util"),h=f.tryCatch;f.inherits(a,n),a.prototype._gotAccum=function(t){void 0!==this._eachValues&&null!==this._eachValues&&t!==o&&this._eachValues.push(t)},a.prototype._eachComplete=function(t){return null!==this._eachValues&&this._eachValues.push(t),this._eachValues},a.prototype._init=function(){},a.prototype._resolveEmptyArray=function(){this._resolve(void 0!==this._eachValues?this._eachValues:this._initialValue)},a.prototype.shouldCopyValues=function(){return!1},a.prototype._resolve=function(t){this._promise._resolveCallback(t),this._values=null},a.prototype._resultCancelled=function(t){return t===this._initialValue?this._cancel():void(this._isResolved()||(this._resultCancelled$(),this._currentCancellable instanceof e&&this._currentCancellable.cancel(),this._initialValue instanceof e&&this._initialValue.cancel()))},a.prototype._iterate=function(t){this._values=t;var n,r,i=t.length;void 0!==this._initialValue?(n=this._initialValue,r=0):(n=e.resolve(t[0]),r=1),this._currentCancellable=n;for(var o=r;i>o;++o){var s=t[o];s instanceof e&&s.suppressUnhandledRejections()}if(!n.isRejected())for(;i>r;++r){var a={accum:null,value:t[r],index:r,length:i,array:this};n=n._then(l,void 0,void 0,a,void 0),0===(127&r)&&n._setNoAsyncGuarantee()}void 0!==this._eachValues&&(n=n._then(this._eachComplete,void 0,void 0,this,void 0)),n._then(c,c,void 0,n,this)},e.prototype.reduce=function(t,e){return u(this,t,e,null)},e.reduce=function(t,e,n,r){return u(t,e,n,r)}}},{"./util":36}],29:[function(t,e,n){"use strict";var r,i=t("./util"),o=function(){throw new Error("No async scheduler available\n\n    See http://goo.gl/MqrFmX\n")},s=i.getNativePromise();if(i.isNode&&"undefined"==typeof MutationObserver){var a=global.setImmediate,c=process.nextTick;r=i.isRecentNode?function(t){a.call(global,t)}:function(t){c.call(process,t)}}else if("function"==typeof s&&"function"==typeof s.resolve){
var u=s.resolve();r=function(t){u.then(t)}}else r="undefined"!=typeof MutationObserver&&("undefined"==typeof window||!window.navigator||!window.navigator.standalone&&!window.cordova)&&"classList"in document.documentElement?function(){var t=document.createElement("div"),e={attributes:!0},n=!1,r=document.createElement("div"),i=new MutationObserver(function(){t.classList.toggle("foo"),n=!1});i.observe(r,e);var o=function(){n||(n=!0,r.classList.toggle("foo"))};return function(n){var r=new MutationObserver(function(){r.disconnect(),n()});r.observe(t,e),o()}}():"undefined"!=typeof setImmediate?function(t){setImmediate(t)}:"undefined"!=typeof setTimeout?function(t){setTimeout(t,0)}:o;e.exports=r},{"./util":36}],30:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.constructor$(t)}var o=e.PromiseInspection,s=t("./util");s.inherits(i,n),i.prototype._promiseResolved=function(t,e){this._values[t]=e;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},i.prototype._promiseFulfilled=function(t,e){var n=new o;return n._bitField=33554432,n._settledValueField=t,this._promiseResolved(e,n)},i.prototype._promiseRejected=function(t,e){var n=new o;return n._bitField=16777216,n._settledValueField=t,this._promiseResolved(e,n)},e.settle=function(t){return r.deprecated(".settle()",".reflect()"),new i(t).promise()},e.allSettled=function(t){return new i(t).promise()},e.prototype.settle=function(){return e.settle(this)}}},{"./util":36}],31:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.constructor$(t),this._howMany=0,this._unwrap=!1,this._initialized=!1}function o(t,e){if((0|e)!==e||0>e)return r("expecting a positive integer\n\n    See http://goo.gl/MqrFmX\n");var n=new i(t),o=n.promise();return n.setHowMany(e),n.init(),o}var s=t("./util"),a=t("./errors").RangeError,c=t("./errors").AggregateError,u=s.isArray,l={};s.inherits(i,n),i.prototype._init=function(){if(this._initialized){if(0===this._howMany)return void this._resolve([]);this._init$(void 0,-5);var t=u(this._values);!this._isResolved()&&t&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}},i.prototype.init=function(){this._initialized=!0,this._init()},i.prototype.setUnwrap=function(){this._unwrap=!0},i.prototype.howMany=function(){return this._howMany},i.prototype.setHowMany=function(t){this._howMany=t},i.prototype._promiseFulfilled=function(t){return this._addFulfilled(t),this._fulfilled()===this.howMany()?(this._values.length=this.howMany(),1===this.howMany()&&this._unwrap?this._resolve(this._values[0]):this._resolve(this._values),!0):!1},i.prototype._promiseRejected=function(t){return this._addRejected(t),this._checkOutcome()},i.prototype._promiseCancelled=function(){return this._values instanceof e||null==this._values?this._cancel():(this._addRejected(l),this._checkOutcome())},i.prototype._checkOutcome=function(){if(this.howMany()>this._canPossiblyFulfill()){for(var t=new c,e=this.length();e<this._values.length;++e)this._values[e]!==l&&t.push(this._values[e]);return t.length>0?this._reject(t):this._cancel(),!0}return!1},i.prototype._fulfilled=function(){return this._totalResolved},i.prototype._rejected=function(){return this._values.length-this.length()},i.prototype._addRejected=function(t){this._values.push(t)},i.prototype._addFulfilled=function(t){this._values[this._totalResolved++]=t},i.prototype._canPossiblyFulfill=function(){return this.length()-this._rejected()},i.prototype._getRangeError=function(t){var e="Input array must contain at least "+this._howMany+" items but contains only "+t+" items";return new a(e)},i.prototype._resolveEmptyArray=function(){this._reject(this._getRangeError(0))},e.some=function(t,e){return o(t,e)},e.prototype.some=function(t){return o(this,t)},e._SomePromiseArray=i}},{"./errors":12,"./util":36}],32:[function(t,e,n){"use strict";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValueField=t._isFateSealed()?t._settledValue():void 0):(this._bitField=0,this._settledValueField=void 0)}e.prototype._settledValue=function(){return this._settledValueField};var n=e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n    See http://goo.gl/MqrFmX\n");return this._settledValue()},r=e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n    See http://goo.gl/MqrFmX\n");return this._settledValue()},i=e.prototype.isFulfilled=function(){return 0!==(33554432&this._bitField)},o=e.prototype.isRejected=function(){return 0!==(16777216&this._bitField)},s=e.prototype.isPending=function(){return 0===(50397184&this._bitField)},a=e.prototype.isResolved=function(){return 0!==(50331648&this._bitField)};e.prototype.isCancelled=function(){return 0!==(8454144&this._bitField)},t.prototype.__isCancelled=function(){return 65536===(65536&this._bitField)},t.prototype._isCancelled=function(){return this._target().__isCancelled()},t.prototype.isCancelled=function(){return 0!==(8454144&this._target()._bitField)},t.prototype.isPending=function(){return s.call(this._target())},t.prototype.isRejected=function(){return o.call(this._target())},t.prototype.isFulfilled=function(){return i.call(this._target())},t.prototype.isResolved=function(){return a.call(this._target())},t.prototype.value=function(){return n.call(this._target())},t.prototype.reason=function(){var t=this._target();return t._unsetRejectionIsUnhandled(),r.call(t)},t.prototype._value=function(){return this._settledValue()},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue()},t.PromiseInspection=e}},{}],33:[function(t,e,n){"use strict";e.exports=function(e,n){function r(t,r){if(l(t)){if(t instanceof e)return t;var i=o(t);if(i===u){r&&r._pushContext();var c=e.reject(i.e);return r&&r._popContext(),c}if("function"==typeof i){if(s(t)){var c=new e(n);return t._then(c._fulfill,c._reject,void 0,c,null),c}return a(t,i,r)}}return t}function i(t){return t.then}function o(t){try{return i(t)}catch(e){return u.e=e,u}}function s(t){try{return p.call(t,"_promise0")}catch(e){return!1}}function a(t,r,i){function o(t){a&&(a._resolveCallback(t),a=null)}function s(t){a&&(a._rejectCallback(t,p,!0),a=null)}var a=new e(n),l=a;i&&i._pushContext(),a._captureStackTrace(),i&&i._popContext();var p=!0,f=c.tryCatch(r).call(t,o,s);return p=!1,a&&f===u&&(a._rejectCallback(f.e,!0,!0),a=null),l}var c=t("./util"),u=c.errorObj,l=c.isObject,p={}.hasOwnProperty;return r}},{"./util":36}],34:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.handle=t}function o(t){return clearTimeout(this.handle),t}function s(t){throw clearTimeout(this.handle),t}var a=t("./util"),c=e.TimeoutError;i.prototype._resultCancelled=function(){clearTimeout(this.handle)};var u=function(t){return l(+this).thenReturn(t)},l=e.delay=function(t,o){var s,a;return void 0!==o?(s=e.resolve(o)._then(u,null,null,t,void 0),r.cancellation()&&o instanceof e&&s._setOnCancel(o)):(s=new e(n),a=setTimeout(function(){s._fulfill()},+t),r.cancellation()&&s._setOnCancel(new i(a)),s._captureStackTrace()),s._setAsyncGuaranteed(),s};e.prototype.delay=function(t){return l(t,this)};var p=function(t,e,n){var r;r="string"!=typeof e?e instanceof Error?e:new c("operation timed out"):new c(e),a.markAsOriginatingFromRejection(r),t._attachExtraTrace(r),t._reject(r),null!=n&&n.cancel()};e.prototype.timeout=function(t,e){t=+t;var n,a,c=new i(setTimeout(function(){n.isPending()&&p(n,e,a)},t));return r.cancellation()?(a=this.then(),n=a._then(o,s,void 0,c,void 0),n._setOnCancel(c)):n=this._then(o,s,void 0,c,void 0),n}}},{"./util":36}],35:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t){setTimeout(function(){throw t},0)}function c(t){var e=r(t);return e!==t&&"function"==typeof t._isDisposable&&"function"==typeof t._getDisposer&&t._isDisposable()&&e._setDisposable(t._getDisposer()),e}function u(t,n){function i(){if(s>=u)return l._fulfill();var o=c(t[s++]);if(o instanceof e&&o._isDisposable()){try{o=r(o._getDisposer().tryDispose(n),t.promise)}catch(p){return a(p)}if(o instanceof e)return o._then(i,a,null,null,null)}i()}var s=0,u=t.length,l=new e(o);return i(),l}function l(t,e,n){this._data=t,this._promise=e,this._context=n}function p(t,e,n){this.constructor$(t,e,n)}function f(t){return l.isDisposer(t)?(this.resources[this.index]._setDisposable(t),t.promise()):t}function h(t){this.length=t,this.promise=null,this[t-1]=null}var _=t("./util"),d=t("./errors").TypeError,v=t("./util").inherits,y=_.errorObj,g=_.tryCatch,m={};l.prototype.data=function(){return this._data},l.prototype.promise=function(){return this._promise},l.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():m},l.prototype.tryDispose=function(t){var e=this.resource(),n=this._context;void 0!==n&&n._pushContext();var r=e!==m?this.doDispose(e,t):null;return void 0!==n&&n._popContext(),this._promise._unsetDisposable(),this._data=null,r},l.isDisposer=function(t){return null!=t&&"function"==typeof t.resource&&"function"==typeof t.tryDispose},v(p,l),p.prototype.doDispose=function(t,e){var n=this.data();return n.call(t,t,e)},h.prototype._resultCancelled=function(){for(var t=this.length,n=0;t>n;++n){var r=this[n];r instanceof e&&r.cancel()}},e.using=function(){var t=arguments.length;if(2>t)return n("you must pass at least 2 arguments to Promise.using");var i=arguments[t-1];if("function"!=typeof i)return n("expecting a function but got "+_.classString(i));var o,a=!0;2===t&&Array.isArray(arguments[0])?(o=arguments[0],t=o.length,a=!1):(o=arguments,t--);for(var c=new h(t),p=0;t>p;++p){var d=o[p];if(l.isDisposer(d)){var v=d;d=d.promise(),d._setDisposable(v)}else{var m=r(d);m instanceof e&&(d=m._then(f,null,null,{resources:c,index:p},void 0))}c[p]=d}for(var b=new Array(c.length),p=0;p<b.length;++p)b[p]=e.resolve(c[p]).reflect();var w=e.all(b).then(function(t){for(var e=0;e<t.length;++e){var n=t[e];if(n.isRejected())return y.e=n.error(),y;if(!n.isFulfilled())return void w.cancel();t[e]=n.value()}C._pushContext(),i=g(i);var r=a?i.apply(void 0,t):i(t),o=C._popContext();return s.checkForgottenReturns(r,o,"Promise.using",C),r}),C=w.lastly(function(){var t=new e.PromiseInspection(w);return u(c,t)});return c.promise=C,C._setOnCancel(c),C},e.prototype._setDisposable=function(t){this._bitField=131072|this._bitField,this._disposer=t},e.prototype._isDisposable=function(){return(131072&this._bitField)>0},e.prototype._getDisposer=function(){return this._disposer},e.prototype._unsetDisposable=function(){this._bitField=-131073&this._bitField,this._disposer=void 0},e.prototype.disposer=function(t){if("function"==typeof t)return new p(t,this,i());throw new d}}},{"./errors":12,"./util":36}],36:[function(t,e,n){"use strict";function r(){try{var t=P;return P=null,t.apply(this,arguments)}catch(e){return T.e=e,T}}function i(t){return P=t,r}function o(t){return null==t||t===!0||t===!1||"string"==typeof t||"number"==typeof t}function s(t){return"function"==typeof t||"object"==typeof t&&null!==t}function a(t){return o(t)?new Error(v(t)):t}function c(t,e){var n,r=t.length,i=new Array(r+1);for(n=0;r>n;++n)i[n]=t[n];return i[n]=e,i}function u(t,e,n){if(!F.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var r=Object.getOwnPropertyDescriptor(t,e);return null!=r?null==r.get&&null==r.set?r.value:n:void 0}function l(t,e,n){if(o(t))return t;var r={value:n,configurable:!0,enumerable:!1,writable:!0};return F.defineProperty(t,e,r),t}function p(t){throw t}function f(t){try{if("function"==typeof t){var e=F.names(t.prototype),n=F.isES5&&e.length>1,r=e.length>0&&!(1===e.length&&"constructor"===e[0]),i=A.test(t+"")&&F.names(t).length>0;if(n||r||i)return!0}return!1}catch(o){return!1}}function h(t){function e(){}function n(){return typeof r.foo}e.prototype=t;var r=new e;return n(),n(),t}function _(t){return V.test(t)}function d(t,e,n){for(var r=new Array(t),i=0;t>i;++i)r[i]=e+i+n;return r}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){return t instanceof Error||null!==t&&"object"==typeof t&&"string"==typeof t.message&&"string"==typeof t.name}function g(t){try{l(t,"isOperational",!0)}catch(e){}}function m(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function b(t){return y(t)&&F.propertyIsWritable(t,"stack")}function w(t){return{}.toString.call(t)}function C(t,e,n){for(var r=F.names(t),i=0;i<r.length;++i){var o=r[i];if(n(o))try{F.defineProperty(e,o,F.getDescriptor(t,o))}catch(s){}}}function j(t){return N?process.env[t]:void 0}function k(){if("function"==typeof Promise)try{var t=new Promise(function(){});if("[object Promise]"===w(t))return Promise}catch(e){}}function E(t,e){if(null===t||"function"!=typeof e||e===U)return e;null!==t.domain&&(e=t.domain.bind(e));var n=t.async;if(null!==n){var r=e;e=function(){var t=new Array(2).concat([].slice.call(arguments));return t[0]=r,t[1]=this,n.runInAsyncScope.apply(n,t)}}return e}var F=t("./es5"),x="undefined"==typeof navigator,T={e:{}},P,R="undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0!==this?this:null,S=function(t,e){function n(){this.constructor=t,this.constructor$=e;for(var n in e.prototype)r.call(e.prototype,n)&&"$"!==n.charAt(n.length-1)&&(this[n+"$"]=e.prototype[n])}var r={}.hasOwnProperty;return n.prototype=e.prototype,t.prototype=new n,t.prototype},O=function(){var t=[Array.prototype,Object.prototype,Function.prototype],e=function(e){for(var n=0;n<t.length;++n)if(t[n]===e)return!0;return!1};if(F.isES5){var n=Object.getOwnPropertyNames;return function(t){for(var r=[],i=Object.create(null);null!=t&&!e(t);){var o;try{o=n(t)}catch(s){return r}for(var a=0;a<o.length;++a){var c=o[a];if(!i[c]){i[c]=!0;var u=Object.getOwnPropertyDescriptor(t,c);null!=u&&null==u.get&&null==u.set&&r.push(c)}}t=F.getPrototypeOf(t)}return r}}var r={}.hasOwnProperty;return function(n){if(e(n))return[];var i=[];t:for(var o in n)if(r.call(n,o))i.push(o);else{for(var s=0;s<t.length;++s)if(r.call(t[s],o))continue t;i.push(o)}return i}}(),A=/this\s*\.\s*\S+\s*=/,V=/^[a-z$_][a-z$_0-9]*$/i,H=function(){return"stack"in new Error?function(t){return b(t)?t:new Error(v(t))}:function(t){if(b(t))return t;try{throw new Error(v(t))}catch(e){return e}}}(),D=function(t){return F.isArray(t)?t:null};if("undefined"!=typeof Symbol&&Symbol.iterator){var I="function"==typeof Array.from?function(t){return Array.from(t)}:function(t){for(var e,n=[],r=t[Symbol.iterator]();!(e=r.next()).done;)n.push(e.value);return n};D=function(t){return F.isArray(t)?t:null!=t&&"function"==typeof t[Symbol.iterator]?I(t):null}}var L="undefined"!=typeof process&&"[object process]"===w(process).toLowerCase(),N="undefined"!=typeof process&&"undefined"!=typeof process.env,U,B={setReflectHandler:function(t){U=t},isClass:f,isIdentifier:_,inheritedDataKeys:O,getDataPropertyOrDefault:u,thrower:p,isArray:F.isArray,asArray:D,notEnumerableProp:l,isPrimitive:o,isObject:s,isError:y,canEvaluate:x,errorObj:T,tryCatch:i,inherits:S,withAppended:c,maybeWrapAsError:a,toFastProperties:h,filledRange:d,toString:v,canAttachTrace:b,ensureErrorObject:H,originatesFromRejection:m,markAsOriginatingFromRejection:g,classString:w,copyDescriptors:C,isNode:L,hasEnvVariables:N,env:j,global:R,getNativePromise:k,contextBind:E};B.isRecentNode=B.isNode&&function(){var t;return process.versions&&process.versions.node?t=process.versions.node.split(".").map(Number):process.version&&(t=process.version.split(".").map(Number)),0===t[0]&&t[1]>10||t[0]>0}(),B.nodeSupportsAsyncResource=B.isNode&&function(){var e=!1;try{var n=t("async_hooks").AsyncResource;e="function"==typeof n.prototype.runInAsyncScope}catch(r){e=!1}return e}(),B.isNode&&B.toFastProperties(process);try{throw new Error}catch(M){B.lastLineError=M}e.exports=B},{"./es5":13,async_hooks:void 0}]},{},[4])(4)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise);const BluebirdPromise = require("bluebird/js/release/promise")()
BluebirdPromise.config({
  longStackTraces: true,
})
BluebirdPromise.default = BluebirdPromise
module.exports = BluebirdPromise{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "bluebird": "^3.5.5"
  },
  "deprecated": false,
  "description": "Bluebird â€” longStackTraces: true, cancellation: true",
  "files": [
    "index.*"
  ],
  "homepage": "https://github.com/develar/fs-extra-p",
  "license": "MIT",
  "name": "bluebird-lst",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/develar/fs-extra-p.git"
  },
  "typings": "./index.d.ts",
  "version": "1.0.9"
}'use strict';
const stringWidth = require('string-width');
const chalk = require('chalk');
const widestLine = require('widest-line');
const cliBoxes = require('cli-boxes');
const camelCase = require('camelcase');
const ansiAlign = require('ansi-align');
const termSize = require('term-size');

const getObject = detail => {
	let obj;

	if (typeof detail === 'number') {
		obj = {
			top: detail,
			right: detail * 3,
			bottom: detail,
			left: detail * 3
		};
	} else {
		obj = Object.assign({
			top: 0,
			right: 0,
			bottom: 0,
			left: 0
		}, detail);
	}

	return obj;
};

const getBorderChars = borderStyle => {
	const sides = [
		'topLeft',
		'topRight',
		'bottomRight',
		'bottomLeft',
		'vertical',
		'horizontal'
	];

	let chars;

	if (typeof borderStyle === 'string') {
		chars = cliBoxes[borderStyle];

		if (!chars) {
			throw new TypeError(`Invalid border style: ${borderStyle}`);
		}
	} else {
		sides.forEach(key => {
			if (!borderStyle[key] || typeof borderStyle[key] !== 'string') {
				throw new TypeError(`Invalid border style: ${key}`);
			}
		});

		chars = borderStyle;
	}

	return chars;
};

const isHex = color => color.match(/^#[0-f]{3}(?:[0-f]{3})?$/i);
const isColorValid = color => typeof color === 'string' && ((chalk[color]) || isHex(color));
const getColorFn = color => isHex(color) ? chalk.hex(color) : chalk[color];
const getBGColorFn = color => isHex(color) ? chalk.bgHex(color) : chalk[camelCase(['bg', color])];

const boxen = (text, opts) => {
	opts = Object.assign({
		padding: 0,
		borderStyle: 'single',
		dimBorder: false,
		align: 'left',
		float: 'left'
	}, opts);

	if (opts.borderColor && !isColorValid(opts.borderColor)) {
		throw new Error(`${opts.borderColor} is not a valid borderColor`);
	}

	if (opts.backgroundColor && !isColorValid(opts.backgroundColor)) {
		throw new Error(`${opts.backgroundColor} is not a valid backgroundColor`);
	}

	const chars = getBorderChars(opts.borderStyle);
	const padding = getObject(opts.padding);
	const margin = getObject(opts.margin);

	const colorizeBorder = x => {
		const ret = opts.borderColor ? getColorFn(opts.borderColor)(x) : x;
		return opts.dimBorder ? chalk.dim(ret) : ret;
	};

	const colorizeContent = x => opts.backgroundColor ? getBGColorFn(opts.backgroundColor)(x) : x;

	text = ansiAlign(text, {align: opts.align});

	const NL = '\n';
	const PAD = ' ';

	let lines = text.split(NL);

	if (padding.top > 0) {
		lines = new Array(padding.top).fill('').concat(lines);
	}

	if (padding.bottom > 0) {
		lines = lines.concat(new Array(padding.bottom).fill(''));
	}

	const contentWidth = widestLine(text) + padding.left + padding.right;
	const paddingLeft = PAD.repeat(padding.left);
	const {columns} = termSize();
	let marginLeft = PAD.repeat(margin.left);

	if (opts.float === 'center') {
		const padWidth = Math.max((columns - contentWidth) / 2, 0);
		marginLeft = PAD.repeat(padWidth);
	} else if (opts.float === 'right') {
		const padWidth = Math.max(columns - contentWidth - margin.right - 2, 0);
		marginLeft = PAD.repeat(padWidth);
	}

	const horizontal = chars.horizontal.repeat(contentWidth);
	const top = colorizeBorder(NL.repeat(margin.top) + marginLeft + chars.topLeft + horizontal + chars.topRight);
	const bottom = colorizeBorder(marginLeft + chars.bottomLeft + horizontal + chars.bottomRight + NL.repeat(margin.bottom));
	const side = colorizeBorder(chars.vertical);

	const middle = lines.map(line => {
		const paddingRight = PAD.repeat(contentWidth - stringWidth(line) - padding.left);
		return marginLeft + side + colorizeContent(paddingLeft + line + paddingRight) + side;
	}).join(NL);

	return top + NL + middle + NL + bottom;
};

module.exports = boxen;
// TODO: Remove this for the next major release
module.exports.default = boxen;

module.exports._borderStyles = cliBoxes;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "ansi-align": "^3.0.0",
    "camelcase": "^5.3.1",
    "chalk": "^2.4.2",
    "cli-boxes": "^2.2.0",
    "string-width": "^3.0.0",
    "term-size": "^1.2.0",
    "type-fest": "^0.3.0",
    "widest-line": "^2.0.0"
  },
  "deprecated": false,
  "description": "Create boxes in the terminal",
  "devDependencies": {
    "ava": "^1.4.1",
    "nyc": "^13.3.0",
    "tsd": "^0.7.2",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/sindresorhus/boxen#readme",
  "license": "MIT",
  "name": "boxen",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/boxen.git"
  },
  "version": "3.2.0"
}'use strict';

// adapted from http://code.google.com/p/plist/source/browse/trunk/src/com/dd/plist/BinaryPropertyListParser.java

var fs = require('fs');
var bigInt = require("big-integer");
var debug = false;

exports.maxObjectSize = 100 * 1000 * 1000; // 100Meg
exports.maxObjectCount = 32768;

// EPOCH = new SimpleDateFormat("yyyy MM dd zzz").parse("2001 01 01 GMT").getTime();
// ...but that's annoying in a static initializer because it can throw exceptions, ick.
// So we just hardcode the correct value.
var EPOCH = 978307200000;

// UID object definition
var UID = exports.UID = function(id) {
  this.UID = id;
}

var parseFile = exports.parseFile = function (fileNameOrBuffer, callback) {
  function tryParseBuffer(buffer) {
    var err = null;
    var result;
    try {
      result = parseBuffer(buffer);
    } catch (ex) {
      err = ex;
    }
    callback(err, result);
  }

  if (Buffer.isBuffer(fileNameOrBuffer)) {
    return tryParseBuffer(fileNameOrBuffer);
  } else {
    fs.readFile(fileNameOrBuffer, function (err, data) {
      if (err) { return callback(err); }
      tryParseBuffer(data);
    });
  }
};

var parseBuffer = exports.parseBuffer = function (buffer) {
  var result = {};

  // check header
  var header = buffer.slice(0, 'bplist'.length).toString('utf8');
  if (header !== 'bplist') {
    throw new Error("Invalid binary plist. Expected 'bplist' at offset 0.");
  }

  // Handle trailer, last 32 bytes of the file
  var trailer = buffer.slice(buffer.length - 32, buffer.length);
  // 6 null bytes (index 0 to 5)
  var offsetSize = trailer.readUInt8(6);
  if (debug) {
    console.log("offsetSize: " + offsetSize);
  }
  var objectRefSize = trailer.readUInt8(7);
  if (debug) {
    console.log("objectRefSize: " + objectRefSize);
  }
  var numObjects = readUInt64BE(trailer, 8);
  if (debug) {
    console.log("numObjects: " + numObjects);
  }
  var topObject = readUInt64BE(trailer, 16);
  if (debug) {
    console.log("topObject: " + topObject);
  }
  var offsetTableOffset = readUInt64BE(trailer, 24);
  if (debug) {
    console.log("offsetTableOffset: " + offsetTableOffset);
  }

  if (numObjects > exports.maxObjectCount) {
    throw new Error("maxObjectCount exceeded");
  }

  // Handle offset table
  var offsetTable = [];

  for (var i = 0; i < numObjects; i++) {
    var offsetBytes = buffer.slice(offsetTableOffset + i * offsetSize, offsetTableOffset + (i + 1) * offsetSize);
    offsetTable[i] = readUInt(offsetBytes, 0);
    if (debug) {
      console.log("Offset for Object #" + i + " is " + offsetTable[i] + " [" + offsetTable[i].toString(16) + "]");
    }
  }

  // Parses an object inside the currently parsed binary property list.
  // For the format specification check
  // <a href="http://www.opensource.apple.com/source/CF/CF-635/CFBinaryPList.c">
  // Apple's binary property list parser implementation</a>.
  function parseObject(tableOffset) {
    var offset = offsetTable[tableOffset];
    var type = buffer[offset];
    var objType = (type & 0xF0) >> 4; //First  4 bits
    var objInfo = (type & 0x0F);      //Second 4 bits
    switch (objType) {
    case 0x0:
      return parseSimple();
    case 0x1:
      return parseInteger();
    case 0x8:
      return parseUID();
    case 0x2:
      return parseReal();
    case 0x3:
      return parseDate();
    case 0x4:
      return parseData();
    case 0x5: // ASCII
      return parsePlistString();
    case 0x6: // UTF-16
      return parsePlistString(true);
    case 0xA:
      return parseArray();
    case 0xD:
      return parseDictionary();
    default:
      throw new Error("Unhandled type 0x" + objType.toString(16));
    }

    function parseSimple() {
      //Simple
      switch (objInfo) {
      case 0x0: // null
        return null;
      case 0x8: // false
        return false;
      case 0x9: // true
        return true;
      case 0xF: // filler byte
        return null;
      default:
        throw new Error("Unhandled simple type 0x" + objType.toString(16));
      }
    }

    function bufferToHexString(buffer) {
      var str = '';
      var i;
      for (i = 0; i < buffer.length; i++) {
        if (buffer[i] != 0x00) {
          break;
        }
      }
      for (; i < buffer.length; i++) {
        var part = '00' + buffer[i].toString(16);
        str += part.substr(part.length - 2);
      }
      return str;
    }

    function parseInteger() {
      var length = Math.pow(2, objInfo);
      if (length > 4) {
        var data = buffer.slice(offset + 1, offset + 1 + length);
        var str = bufferToHexString(data);
        return bigInt(str, 16);
      } if (length < exports.maxObjectSize) {
        return readUInt(buffer.slice(offset + 1, offset + 1 + length));
      } else {
        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
      }
    }

    function parseUID() {
      var length = objInfo + 1;
      if (length < exports.maxObjectSize) {
        return new UID(readUInt(buffer.slice(offset + 1, offset + 1 + length)));
      } else {
        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
      }
    }

    function parseReal() {
      var length = Math.pow(2, objInfo);
      if (length < exports.maxObjectSize) {
        var realBuffer = buffer.slice(offset + 1, offset + 1 + length);
        if (length === 4) {
          return realBuffer.readFloatBE(0);
        }
        else if (length === 8) {
          return realBuffer.readDoubleBE(0);
        }
      } else {
        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
      }
    }

    function parseDate() {
      if (objInfo != 0x3) {
        console.error("Unknown date type :" + objInfo + ". Parsing anyway...");
      }
      var dateBuffer = buffer.slice(offset + 1, offset + 9);
      return new Date(EPOCH + (1000 * dateBuffer.readDoubleBE(0)));
    }

    function parseData() {
      var dataoffset = 1;
      var length = objInfo;
      if (objInfo == 0xF) {
        var int_type = buffer[offset + 1];
        var intType = (int_type & 0xF0) / 0x10;
        if (intType != 0x1) {
          console.error("0x4: UNEXPECTED LENGTH-INT TYPE! " + intType);
        }
        var intInfo = int_type & 0x0F;
        var intLength = Math.pow(2, intInfo);
        dataoffset = 2 + intLength;
        if (intLength < 3) {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        } else {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        }
      }
      if (length < exports.maxObjectSize) {
        return buffer.slice(offset + dataoffset, offset + dataoffset + length);
      } else {
        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
      }
    }

    function parsePlistString (isUtf16) {
      isUtf16 = isUtf16 || 0;
      var enc = "utf8";
      var length = objInfo;
      var stroffset = 1;
      if (objInfo == 0xF) {
        var int_type = buffer[offset + 1];
        var intType = (int_type & 0xF0) / 0x10;
        if (intType != 0x1) {
          console.err("UNEXPECTED LENGTH-INT TYPE! " + intType);
        }
        var intInfo = int_type & 0x0F;
        var intLength = Math.pow(2, intInfo);
        var stroffset = 2 + intLength;
        if (intLength < 3) {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        } else {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        }
      }
      // length is String length -> to get byte length multiply by 2, as 1 character takes 2 bytes in UTF-16
      length *= (isUtf16 + 1);
      if (length < exports.maxObjectSize) {
        var plistString = new Buffer(buffer.slice(offset + stroffset, offset + stroffset + length));
        if (isUtf16) {
          plistString = swapBytes(plistString);
          enc = "ucs2";
        }
        return plistString.toString(enc);
      } else {
        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
      }
    }

    function parseArray() {
      var length = objInfo;
      var arrayoffset = 1;
      if (objInfo == 0xF) {
        var int_type = buffer[offset + 1];
        var intType = (int_type & 0xF0) / 0x10;
        if (intType != 0x1) {
          console.error("0xa: UNEXPECTED LENGTH-INT TYPE! " + intType);
        }
        var intInfo = int_type & 0x0F;
        var intLength = Math.pow(2, intInfo);
        arrayoffset = 2 + intLength;
        if (intLength < 3) {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        } else {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        }
      }
      if (length * objectRefSize > exports.maxObjectSize) {
        throw new Error("To little heap space available!");
      }
      var array = [];
      for (var i = 0; i < length; i++) {
        var objRef = readUInt(buffer.slice(offset + arrayoffset + i * objectRefSize, offset + arrayoffset + (i + 1) * objectRefSize));
        array[i] = parseObject(objRef);
      }
      return array;
    }

    function parseDictionary() {
      var length = objInfo;
      var dictoffset = 1;
      if (objInfo == 0xF) {
        var int_type = buffer[offset + 1];
        var intType = (int_type & 0xF0) / 0x10;
        if (intType != 0x1) {
          console.error("0xD: UNEXPECTED LENGTH-INT TYPE! " + intType);
        }
        var intInfo = int_type & 0x0F;
        var intLength = Math.pow(2, intInfo);
        dictoffset = 2 + intLength;
        if (intLength < 3) {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        } else {
          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
        }
      }
      if (length * 2 * objectRefSize > exports.maxObjectSize) {
        throw new Error("To little heap space available!");
      }
      if (debug) {
        console.log("Parsing dictionary #" + tableOffset);
      }
      var dict = {};
      for (var i = 0; i < length; i++) {
        var keyRef = readUInt(buffer.slice(offset + dictoffset + i * objectRefSize, offset + dictoffset + (i + 1) * objectRefSize));
        var valRef = readUInt(buffer.slice(offset + dictoffset + (length * objectRefSize) + i * objectRefSize, offset + dictoffset + (length * objectRefSize) + (i + 1) * objectRefSize));
        var key = parseObject(keyRef);
        var val = parseObject(valRef);
        if (debug) {
          console.log("  DICT #" + tableOffset + ": Mapped " + key + " to " + val);
        }
        dict[key] = val;
      }
      return dict;
    }
  }

  return [ parseObject(topObject) ];
};

function readUInt(buffer, start) {
  start = start || 0;

  var l = 0;
  for (var i = start; i < buffer.length; i++) {
    l <<= 8;
    l |= buffer[i] & 0xFF;
  }
  return l;
}

// we're just going to toss the high order bits because javascript doesn't have 64-bit ints
function readUInt64BE(buffer, start) {
  var data = buffer.slice(start, start + 8);
  return data.readUInt32BE(4, 8);
}

function swapBytes(buffer) {
  var len = buffer.length;
  for (var i = 0; i < len; i += 2) {
    var a = buffer[i];
    buffer[i] = buffer[i+1];
    buffer[i+1] = a;
  }
  return buffer;
}
{
  "author": {
    "name": "Joe Ferner",
    "email": "joe.ferner@nearinfinity.com"
  },
  "dependencies": {
    "big-integer": "^1.6.7"
  },
  "deprecated": false,
  "description": "Binary plist parser.",
  "devDependencies": {
    "nodeunit": "~0.9.1"
  },
  "homepage": "https://github.com/nearinfinity/node-bplist-parser#readme",
  "license": "MIT",
  "main": "bplistParser.js",
  "name": "bplist-parser",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/nearinfinity/node-bplist-parser.git"
  },
  "version": "0.1.1"
}MIT License

Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var concatMap = require('concat-map');
var balanced = require('balanced-match');

module.exports = expandTop;

var escSlash = '\0SLASH'+Math.random()+'\0';
var escOpen = '\0OPEN'+Math.random()+'\0';
var escClose = '\0CLOSE'+Math.random()+'\0';
var escComma = '\0COMMA'+Math.random()+'\0';
var escPeriod = '\0PERIOD'+Math.random()+'\0';

function numeric(str) {
  return parseInt(str, 10) == str
    ? parseInt(str, 10)
    : str.charCodeAt(0);
}

function escapeBraces(str) {
  return str.split('\\\\').join(escSlash)
            .split('\\{').join(escOpen)
            .split('\\}').join(escClose)
            .split('\\,').join(escComma)
            .split('\\.').join(escPeriod);
}

function unescapeBraces(str) {
  return str.split(escSlash).join('\\')
            .split(escOpen).join('{')
            .split(escClose).join('}')
            .split(escComma).join(',')
            .split(escPeriod).join('.');
}


// Basically just str.split(","), but handling cases
// where we have nested braced sections, which should be
// treated as individual members, like {a,{b,c},d}
function parseCommaParts(str) {
  if (!str)
    return [''];

  var parts = [];
  var m = balanced('{', '}', str);

  if (!m)
    return str.split(',');

  var pre = m.pre;
  var body = m.body;
  var post = m.post;
  var p = pre.split(',');

  p[p.length-1] += '{' + body + '}';
  var postParts = parseCommaParts(post);
  if (post.length) {
    p[p.length-1] += postParts.shift();
    p.push.apply(p, postParts);
  }

  parts.push.apply(parts, p);

  return parts;
}

function expandTop(str) {
  if (!str)
    return [];

  // I don't know why Bash 4.3 does this, but it does.
  // Anything starting with {} will have the first two bytes preserved
  // but *only* at the top level, so {},a}b will not expand to anything,
  // but a{},b}c will be expanded to [a}c,abc].
  // One could argue that this is a bug in Bash, but since the goal of
  // this module is to match Bash's rules, we escape a leading {}
  if (str.substr(0, 2) === '{}') {
    str = '\\{\\}' + str.substr(2);
  }

  return expand(escapeBraces(str), true).map(unescapeBraces);
}

function identity(e) {
  return e;
}

function embrace(str) {
  return '{' + str + '}';
}
function isPadded(el) {
  return /^-?0\d/.test(el);
}

function lte(i, y) {
  return i <= y;
}
function gte(i, y) {
  return i >= y;
}

function expand(str, isTop) {
  var expansions = [];

  var m = balanced('{', '}', str);
  if (!m || /\$$/.test(m.pre)) return [str];

  var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
  var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
  var isSequence = isNumericSequence || isAlphaSequence;
  var isOptions = m.body.indexOf(',') >= 0;
  if (!isSequence && !isOptions) {
    // {a},b}
    if (m.post.match(/,.*\}/)) {
      str = m.pre + '{' + m.body + escClose + m.post;
      return expand(str);
    }
    return [str];
  }

  var n;
  if (isSequence) {
    n = m.body.split(/\.\./);
  } else {
    n = parseCommaParts(m.body);
    if (n.length === 1) {
      // x{{a,b}}y ==> x{a}y x{b}y
      n = expand(n[0], false).map(embrace);
      if (n.length === 1) {
        var post = m.post.length
          ? expand(m.post, false)
          : [''];
        return post.map(function(p) {
          return m.pre + n[0] + p;
        });
      }
    }
  }

  // at this point, n is the parts, and we know it's not a comma set
  // with a single entry.

  // no need to expand pre, since it is guaranteed to be free of brace-sets
  var pre = m.pre;
  var post = m.post.length
    ? expand(m.post, false)
    : [''];

  var N;

  if (isSequence) {
    var x = numeric(n[0]);
    var y = numeric(n[1]);
    var width = Math.max(n[0].length, n[1].length)
    var incr = n.length == 3
      ? Math.abs(numeric(n[2]))
      : 1;
    var test = lte;
    var reverse = y < x;
    if (reverse) {
      incr *= -1;
      test = gte;
    }
    var pad = n.some(isPadded);

    N = [];

    for (var i = x; test(i, y); i += incr) {
      var c;
      if (isAlphaSequence) {
        c = String.fromCharCode(i);
        if (c === '\\')
          c = '';
      } else {
        c = String(i);
        if (pad) {
          var need = width - c.length;
          if (need > 0) {
            var z = new Array(need + 1).join('0');
            if (i < 0)
              c = '-' + z + c.slice(1);
            else
              c = z + c;
          }
        }
      }
      N.push(c);
    }
  } else {
    N = concatMap(n, function(el) { return expand(el, false) });
  }

  for (var j = 0; j < N.length; j++) {
    for (var k = 0; k < post.length; k++) {
      var expansion = pre + N[j] + post[k];
      if (!isTop || isSequence || expansion)
        expansions.push(expansion);
    }
  }

  return expansions;
}

{
  "author": {
    "name": "Julian Gruber",
    "email": "mail@juliangruber.com",
    "url": "http://juliangruber.com"
  },
  "dependencies": {
    "balanced-match": "^1.0.0",
    "concat-map": "0.0.1"
  },
  "deprecated": false,
  "description": "Brace expansion as known from sh/bash",
  "devDependencies": {
    "matcha": "^0.7.0",
    "tape": "^4.6.0"
  },
  "homepage": "https://github.com/juliangruber/brace-expansion",
  "license": "MIT",
  "main": "index.js",
  "name": "brace-expansion",
  "repository": {
    "type": "git",
    "url": "git://github.com/juliangruber/brace-expansion.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/8..latest",
      "firefox/20..latest",
      "firefox/nightly",
      "chrome/25..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  },
  "version": "1.1.11"
}var bufferFill = require('buffer-fill')
var allocUnsafe = require('buffer-alloc-unsafe')

module.exports = function alloc (size, fill, encoding) {
  if (typeof size !== 'number') {
    throw new TypeError('"size" argument must be a number')
  }

  if (size < 0) {
    throw new RangeError('"size" argument must not be negative')
  }

  if (Buffer.alloc) {
    return Buffer.alloc(size, fill, encoding)
  }

  var buffer = allocUnsafe(size)

  if (size === 0) {
    return buffer
  }

  if (fill === undefined) {
    return bufferFill(buffer, 0)
  }

  if (typeof encoding !== 'string') {
    encoding = undefined
  }

  return bufferFill(buffer, fill, encoding)
}
{
  "dependencies": {
    "buffer-alloc-unsafe": "^1.1.0",
    "buffer-fill": "^1.0.0"
  },
  "deprecated": false,
  "description": "A [ponyfill](https://ponyfill.com) for `Buffer.alloc`.",
  "devDependencies": {
    "standard": "^7.1.2"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/LinusU/buffer-alloc#readme",
  "license": "MIT",
  "name": "buffer-alloc",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/LinusU/buffer-alloc.git"
  },
  "version": "1.2.0"
}function allocUnsafe (size) {
  if (typeof size !== 'number') {
    throw new TypeError('"size" argument must be a number')
  }

  if (size < 0) {
    throw new RangeError('"size" argument must not be negative')
  }

  if (Buffer.allocUnsafe) {
    return Buffer.allocUnsafe(size)
  } else {
    return new Buffer(size)
  }
}

module.exports = allocUnsafe
{
  "deprecated": false,
  "description": "A [ponyfill](https://ponyfill.com) for `Buffer.allocUnsafe`.",
  "devDependencies": {
    "standard": "^7.1.2"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/LinusU/buffer-alloc-unsafe#readme",
  "license": "MIT",
  "name": "buffer-alloc-unsafe",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/LinusU/buffer-alloc-unsafe.git"
  },
  "version": "1.1.0"
}The MIT License

Copyright (c) 2013 Brian J. Brennan

Permission is hereby granted, free of charge, to any person obtaining a copy 
of this software and associated documentation files (the "Software"), to deal in 
the Software without restriction, including without limitation the rights to use, 
copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 
Software, and to permit persons to whom the Software is furnished to do so, 
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all 
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
var Buffer = require('buffer').Buffer;

var CRC_TABLE = [
  0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
  0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
  0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
  0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
  0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
  0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
  0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
  0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
  0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
  0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
  0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
  0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
  0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
  0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
  0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
  0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
  0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
  0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
  0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
  0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
  0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
  0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
  0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
  0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
  0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
  0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
  0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
  0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
  0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
  0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
  0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
  0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
  0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
  0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
  0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
  0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
  0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
  0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
  0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
  0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
  0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
  0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
  0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
  0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
  0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
  0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
  0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
  0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
  0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
  0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
  0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
  0x2d02ef8d
];

if (typeof Int32Array !== 'undefined') {
  CRC_TABLE = new Int32Array(CRC_TABLE);
}

function ensureBuffer(input) {
  if (Buffer.isBuffer(input)) {
    return input;
  }

  var hasNewBufferAPI =
      typeof Buffer.alloc === "function" &&
      typeof Buffer.from === "function";

  if (typeof input === "number") {
    return hasNewBufferAPI ? Buffer.alloc(input) : new Buffer(input);
  }
  else if (typeof input === "string") {
    return hasNewBufferAPI ? Buffer.from(input) : new Buffer(input);
  }
  else {
    throw new Error("input must be buffer, number, or string, received " +
                    typeof input);
  }
}

function bufferizeInt(num) {
  var tmp = ensureBuffer(4);
  tmp.writeInt32BE(num, 0);
  return tmp;
}

function _crc32(buf, previous) {
  buf = ensureBuffer(buf);
  if (Buffer.isBuffer(previous)) {
    previous = previous.readUInt32BE(0);
  }
  var crc = ~~previous ^ -1;
  for (var n = 0; n < buf.length; n++) {
    crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8);
  }
  return (crc ^ -1);
}

function crc32() {
  return bufferizeInt(_crc32.apply(null, arguments));
}
crc32.signed = function () {
  return _crc32.apply(null, arguments);
};
crc32.unsigned = function () {
  return _crc32.apply(null, arguments) >>> 0;
};

module.exports = crc32;
{
  "author": {
    "name": "Brian J. Brennan",
    "email": "brianloveswords@gmail.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "A pure javascript CRC32 algorithm that plays nice with binary data",
  "devDependencies": {
    "tap": "~0.2.5"
  },
  "engines": {
    "node": "*"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/brianloveswords/buffer-crc32",
  "license": "MIT",
  "licenses": [
    {
      "type": "MIT",
      "url": "https://github.com/brianloveswords/buffer-crc32/raw/master/LICENSE"
    }
  ],
  "main": "index.js",
  "name": "buffer-crc32",
  "optionalDependencies": {},
  "repository": {
    "type": "git",
    "url": "git://github.com/brianloveswords/buffer-crc32.git"
  },
  "version": "0.2.13"
}/* Node.js 6.4.0 and up has full support */
var hasFullSupport = (function () {
  try {
    if (!Buffer.isEncoding('latin1')) {
      return false
    }

    var buf = Buffer.alloc ? Buffer.alloc(4) : new Buffer(4)

    buf.fill('ab', 'ucs2')

    return (buf.toString('hex') === '61006200')
  } catch (_) {
    return false
  }
}())

function isSingleByte (val) {
  return (val.length === 1 && val.charCodeAt(0) < 256)
}

function fillWithNumber (buffer, val, start, end) {
  if (start < 0 || end > buffer.length) {
    throw new RangeError('Out of range index')
  }

  start = start >>> 0
  end = end === undefined ? buffer.length : end >>> 0

  if (end > start) {
    buffer.fill(val, start, end)
  }

  return buffer
}

function fillWithBuffer (buffer, val, start, end) {
  if (start < 0 || end > buffer.length) {
    throw new RangeError('Out of range index')
  }

  if (end <= start) {
    return buffer
  }

  start = start >>> 0
  end = end === undefined ? buffer.length : end >>> 0

  var pos = start
  var len = val.length
  while (pos <= (end - len)) {
    val.copy(buffer, pos)
    pos += len
  }

  if (pos !== end) {
    val.copy(buffer, pos, 0, end - pos)
  }

  return buffer
}

function fill (buffer, val, start, end, encoding) {
  if (hasFullSupport) {
    return buffer.fill(val, start, end, encoding)
  }

  if (typeof val === 'number') {
    return fillWithNumber(buffer, val, start, end)
  }

  if (typeof val === 'string') {
    if (typeof start === 'string') {
      encoding = start
      start = 0
      end = buffer.length
    } else if (typeof end === 'string') {
      encoding = end
      end = buffer.length
    }

    if (encoding !== undefined && typeof encoding !== 'string') {
      throw new TypeError('encoding must be a string')
    }

    if (encoding === 'latin1') {
      encoding = 'binary'
    }

    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
      throw new TypeError('Unknown encoding: ' + encoding)
    }

    if (val === '') {
      return fillWithNumber(buffer, 0, start, end)
    }

    if (isSingleByte(val)) {
      return fillWithNumber(buffer, val.charCodeAt(0), start, end)
    }

    val = new Buffer(val, encoding)
  }

  if (Buffer.isBuffer(val)) {
    return fillWithBuffer(buffer, val, start, end)
  }

  // Other values (e.g. undefined, boolean, object) results in zero-fill
  return fillWithNumber(buffer, 0, start, end)
}

module.exports = fill
{
  "deprecated": false,
  "description": "A [ponyfill](https://ponyfill.com) for `Buffer.fill`.",
  "devDependencies": {
    "buffer-alloc-unsafe": "^1.1.0",
    "standard": "^7.1.2"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/LinusU/buffer-fill#readme",
  "license": "MIT",
  "name": "buffer-fill",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/LinusU/buffer-fill.git"
  },
  "version": "1.0.0"
}MIT License

Copyright (c) 2016, 2018 Linus UnnebÃ¤ck

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var toString = Object.prototype.toString

var isModern = (
  typeof Buffer.alloc === 'function' &&
  typeof Buffer.allocUnsafe === 'function' &&
  typeof Buffer.from === 'function'
)

function isArrayBuffer (input) {
  return toString.call(input).slice(8, -1) === 'ArrayBuffer'
}

function fromArrayBuffer (obj, byteOffset, length) {
  byteOffset >>>= 0

  var maxLength = obj.byteLength - byteOffset

  if (maxLength < 0) {
    throw new RangeError("'offset' is out of bounds")
  }

  if (length === undefined) {
    length = maxLength
  } else {
    length >>>= 0

    if (length > maxLength) {
      throw new RangeError("'length' is out of bounds")
    }
  }

  return isModern
    ? Buffer.from(obj.slice(byteOffset, byteOffset + length))
    : new Buffer(new Uint8Array(obj.slice(byteOffset, byteOffset + length)))
}

function fromString (string, encoding) {
  if (typeof encoding !== 'string' || encoding === '') {
    encoding = 'utf8'
  }

  if (!Buffer.isEncoding(encoding)) {
    throw new TypeError('"encoding" must be a valid string encoding')
  }

  return isModern
    ? Buffer.from(string, encoding)
    : new Buffer(string, encoding)
}

function bufferFrom (value, encodingOrOffset, length) {
  if (typeof value === 'number') {
    throw new TypeError('"value" argument must not be a number')
  }

  if (isArrayBuffer(value)) {
    return fromArrayBuffer(value, encodingOrOffset, length)
  }

  if (typeof value === 'string') {
    return fromString(value, encodingOrOffset)
  }

  return isModern
    ? Buffer.from(value)
    : new Buffer(value)
}

module.exports = bufferFrom
{
  "deprecated": false,
  "description": "A [ponyfill](https://ponyfill.com) for `Buffer.from`, uses native implementation if available.",
  "devDependencies": {
    "standard": "^7.1.2"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/LinusU/buffer-from#readme",
  "license": "MIT",
  "name": "buffer-from",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/LinusU/buffer-from.git"
  },
  "version": "1.1.1"
}{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "7zip-bin": "~4.1.0",
    "@types/debug": "^4.1.4",
    "app-builder-bin": "2.7.1",
    "bluebird-lst": "^1.0.9",
    "builder-util-runtime": "^8.2.5",
    "chalk": "^2.4.2",
    "debug": "^4.1.1",
    "fs-extra-p": "^8.0.2",
    "is-ci": "^2.0.0",
    "js-yaml": "^3.13.1",
    "source-map-support": "^0.5.12",
    "stat-mode": "^0.3.0",
    "temp-file": "^3.3.3"
  },
  "deprecated": false,
  "description": "Various utilities. Used by [electron-builder](https://github.com/electron-userland/electron-builder).",
  "files": [
    "out"
  ],
  "homepage": "https://github.com/electron-userland/electron-builder",
  "license": "MIT",
  "main": "out/util.js",
  "name": "builder-util",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-builder.git"
  },
  "typings": "./out/util.d.ts",
  "version": "10.1.2"
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.DebugLogger = void 0;

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _util() {
  const data = require("./util");

  _util = function () {
    return data;
  };

  return data;
}

class DebugLogger {
  constructor(isEnabled = true) {
    this.isEnabled = isEnabled;
    this.data = {};
  }

  add(key, value) {
    if (!this.isEnabled) {
      return;
    }

    const dataPath = key.split(".");
    let o = this.data;
    let lastName = null;

    for (const p of dataPath) {
      if (p === dataPath[dataPath.length - 1]) {
        lastName = p;
        break;
      } else {
        if (o[p] == null) {
          o[p] = Object.create(null);
        } else if (typeof o[p] === "string") {
          o[p] = [o[p]];
        }

        o = o[p];
      }
    }

    if (Array.isArray(o[lastName])) {
      o[lastName].push(value);
    } else {
      o[lastName] = value;
    }
  }

  save(file) {
    // toml and json doesn't correctly output multiline string as multiline
    if (this.isEnabled && Object.keys(this.data).length > 0) {
      return (0, _fsExtraP().outputFile)(file, (0, _util().serializeToYaml)(this.data));
    } else {
      return Promise.resolve();
    }
  }

} exports.DebugLogger = DebugLogger;
// __ts-babel@6.0.4
//# sourceMappingURL=DebugLogger.js.map{"version":3,"sources":["../src/DebugLogger.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEM,MAAO,WAAP,CAAkB;AAGtB,EAAA,WAAA,CAAqB,SAAA,GAAY,IAAjC,EAAqC;AAAhB,SAAA,SAAA,GAAA,SAAA;AAFZ,SAAA,IAAA,GAAY,EAAZ;AAGR;;AAED,EAAA,GAAG,CAAC,GAAD,EAAc,KAAd,EAAwB;AACzB,QAAI,CAAC,KAAK,SAAV,EAAqB;AACnB;AACD;;AAED,UAAM,QAAQ,GAAG,GAAG,CAAC,KAAJ,CAAU,GAAV,CAAjB;AACA,QAAI,CAAC,GAAG,KAAK,IAAb;AACA,QAAI,QAAQ,GAAkB,IAA9B;;AACA,SAAK,MAAM,CAAX,IAAgB,QAAhB,EAA0B;AACxB,UAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,MAAT,GAAkB,CAAnB,CAAlB,EAAyC;AACvC,QAAA,QAAQ,GAAG,CAAX;AACA;AACD,OAHD,MAIK;AACH,YAAI,CAAC,CAAC,CAAD,CAAD,IAAQ,IAAZ,EAAkB;AAChB,UAAA,CAAC,CAAC,CAAD,CAAD,GAAO,MAAM,CAAC,MAAP,CAAc,IAAd,CAAP;AACD,SAFD,MAGK,IAAI,OAAO,CAAC,CAAC,CAAD,CAAR,KAAgB,QAApB,EAA8B;AACjC,UAAA,CAAC,CAAC,CAAD,CAAD,GAAO,CAAC,CAAC,CAAC,CAAD,CAAF,CAAP;AACD;;AACD,QAAA,CAAC,GAAG,CAAC,CAAC,CAAD,CAAL;AACD;AACF;;AAED,QAAI,KAAK,CAAC,OAAN,CAAc,CAAC,CAAC,QAAD,CAAf,CAAJ,EAAkC;AAChC,MAAA,CAAC,CAAC,QAAD,CAAD,CAAc,IAAd,CAAmB,KAAnB;AACD,KAFD,MAGK;AACH,MAAA,CAAC,CAAC,QAAD,CAAD,GAAgB,KAAhB;AACD;AACF;;AAED,EAAA,IAAI,CAAC,IAAD,EAAa;AACf;AACA,QAAI,KAAK,SAAL,IAAkB,MAAM,CAAC,IAAP,CAAY,KAAK,IAAjB,EAAuB,MAAvB,GAAgC,CAAtD,EAAyD;AACvD,aAAO,4BAAW,IAAX,EAAiB,6BAAgB,KAAK,IAArB,CAAjB,CAAP;AACD,KAFD,MAGK;AACH,aAAO,OAAO,CAAC,OAAR,EAAP;AACD;AACF;;AA9CqB,C","sourcesContent":["import { outputFile } from \"fs-extra-p\"\nimport { serializeToYaml } from \"./util\"\n\nexport class DebugLogger {\n  readonly data: any = {}\n\n  constructor(readonly isEnabled = true) {\n  }\n\n  add(key: string, value: any) {\n    if (!this.isEnabled) {\n      return\n    }\n\n    const dataPath = key.split(\".\")\n    let o = this.data\n    let lastName: string | null = null\n    for (const p of dataPath) {\n      if (p === dataPath[dataPath.length - 1]) {\n        lastName = p\n        break\n      }\n      else {\n        if (o[p] == null) {\n          o[p] = Object.create(null)\n        }\n        else if (typeof o[p] === \"string\") {\n          o[p] = [o[p]]\n        }\n        o = o[p]\n      }\n    }\n\n    if (Array.isArray(o[lastName!!])) {\n      o[lastName!!].push(value)\n    }\n    else {\n      o[lastName!!] = value\n    }\n  }\n\n  save(file: string) {\n    // toml and json doesn't correctly output multiline string as multiline\n    if (this.isEnabled && Object.keys(this.data).length > 0) {\n      return outputFile(file, serializeToYaml(this.data))\n    }\n    else {\n      return Promise.resolve()\n    }\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.toLinuxArchString = toLinuxArchString;
exports.getArchCliNames = getArchCliNames;
exports.getArchSuffix = getArchSuffix;
exports.archFromString = archFromString;
exports.Arch = void 0;
var Arch;
exports.Arch = Arch;

(function (Arch) {
  Arch[Arch["ia32"] = 0] = "ia32";
  Arch[Arch["x64"] = 1] = "x64";
  Arch[Arch["armv7l"] = 2] = "armv7l";
  Arch[Arch["arm64"] = 3] = "arm64";
})(Arch || (exports.Arch = Arch = {}));

function toLinuxArchString(arch, isSnap = false) {
  switch (arch) {
    case Arch.x64:
      return "amd64";

    case Arch.ia32:
      return "i386";

    case Arch.armv7l:
      return isSnap ? "armhf" : "armv7l";

    case Arch.arm64:
      return "arm64";

    default:
      throw new Error(`Unsupported arch ${arch}`);
  }
}

function getArchCliNames() {
  return [Arch[Arch.ia32], Arch[Arch.x64], Arch[Arch.armv7l], Arch[Arch.arm64]];
}

function getArchSuffix(arch) {
  return arch === Arch.x64 ? "" : `-${Arch[arch]}`;
}

function archFromString(name) {
  switch (name) {
    case "x64":
      return Arch.x64;

    case "ia32":
      return Arch.ia32;

    case "arm64":
      return Arch.arm64;

    case "armv7l":
      return Arch.armv7l;

    default:
      throw new Error(`Unsupported arch ${name}`);
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=arch.js.map{"version":3,"sources":["../src/arch.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,IAAY,IAAZ;;;AAAA,CAAA,UAAY,IAAZ,EAAgB;AACd,EAAA,IAAA,CAAA,IAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AAAM,EAAA,IAAA,CAAA,IAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAA;AAAK,EAAA,IAAA,CAAA,IAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AAAQ,EAAA,IAAA,CAAA,IAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACpB,CAFD,EAAY,IAAI,oBAAJ,IAAI,GAAA,EAAA,CAAhB;;AAMM,SAAU,iBAAV,CAA4B,IAA5B,EAAwC,MAAA,GAAkB,KAA1D,EAA+D;AACnE,UAAQ,IAAR;AACE,SAAK,IAAI,CAAC,GAAV;AACE,aAAO,OAAP;;AACF,SAAK,IAAI,CAAC,IAAV;AACE,aAAO,MAAP;;AACF,SAAK,IAAI,CAAC,MAAV;AACE,aAAO,MAAM,GAAG,OAAH,GAAa,QAA1B;;AACF,SAAK,IAAI,CAAC,KAAV;AACE,aAAO,OAAP;;AAEF;AACE,YAAM,IAAI,KAAJ,CAAU,oBAAoB,IAAI,EAAlC,CAAN;AAXJ;AAaD;;AAEK,SAAU,eAAV,GAAyB;AAC7B,SAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAN,CAAL,EAAkB,IAAI,CAAC,IAAI,CAAC,GAAN,CAAtB,EAAkC,IAAI,CAAC,IAAI,CAAC,MAAN,CAAtC,EAAqD,IAAI,CAAC,IAAI,CAAC,KAAN,CAAzD,CAAP;AACD;;AAEK,SAAU,aAAV,CAAwB,IAAxB,EAAkC;AACtC,SAAO,IAAI,KAAK,IAAI,CAAC,GAAd,GAAoB,EAApB,GAAyB,IAAI,IAAI,CAAC,IAAD,CAAM,EAA9C;AACD;;AAEK,SAAU,cAAV,CAAyB,IAAzB,EAAqC;AACzC,UAAQ,IAAR;AACE,SAAK,KAAL;AACE,aAAO,IAAI,CAAC,GAAZ;;AACF,SAAK,MAAL;AACE,aAAO,IAAI,CAAC,IAAZ;;AACF,SAAK,OAAL;AACE,aAAO,IAAI,CAAC,KAAZ;;AACF,SAAK,QAAL;AACE,aAAO,IAAI,CAAC,MAAZ;;AAEF;AACE,YAAM,IAAI,KAAJ,CAAU,oBAAoB,IAAI,EAAlC,CAAN;AAXJ;AAaD,C","sourcesContent":["export enum Arch {\n  ia32, x64, armv7l, arm64\n}\n\nexport type ArchType = \"x64\" | \"ia32\" | \"armv7l\" | \"arm64\"\n\nexport function toLinuxArchString(arch: Arch, isSnap: boolean = false): string {\n  switch (arch) {\n    case Arch.x64:\n      return \"amd64\"\n    case Arch.ia32:\n      return \"i386\"\n    case Arch.armv7l:\n      return isSnap ? \"armhf\" : \"armv7l\"\n    case Arch.arm64:\n      return \"arm64\"\n\n    default:\n      throw new Error(`Unsupported arch ${arch}`)\n  }\n}\n\nexport function getArchCliNames(): Array<string> {\n  return [Arch[Arch.ia32], Arch[Arch.x64], Arch[Arch.armv7l], Arch[Arch.arm64]]\n}\n\nexport function getArchSuffix(arch: Arch): string {\n  return arch === Arch.x64 ? \"\" : `-${Arch[arch]}`\n}\n\nexport function archFromString(name: string): Arch {\n  switch (name) {\n    case \"x64\":\n      return Arch.x64\n    case \"ia32\":\n      return Arch.ia32\n    case \"arm64\":\n      return Arch.arm64\n    case \"armv7l\":\n      return Arch.armv7l\n\n    default:\n      throw new Error(`Unsupported arch ${name}`)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.AsyncTaskManager = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _log() {
  const data = require("./log");

  _log = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("./promise");

  _promise = function () {
    return data;
  };

  return data;
}

class AsyncTaskManager {
  constructor(cancellationToken) {
    this.cancellationToken = cancellationToken;
    this.tasks = [];
    this.errors = [];
  }

  add(task) {
    if (this.cancellationToken == null || !this.cancellationToken.cancelled) {
      this.addTask(task());
    }
  }

  addTask(promise) {
    if (this.cancellationToken.cancelled) {
      _log().log.debug({
        reason: "cancelled",
        stack: new Error().stack
      }, "async task not added");

      if ("cancel" in promise) {
        promise.cancel();
      }

      return;
    }

    this.tasks.push(promise.catch(it => {
      _log().log.debug({
        error: it.message || it.toString()
      }, "async task error");

      this.errors.push(it);
      return Promise.resolve(null);
    }));
  }

  cancelTasks() {
    for (const task of this.tasks) {
      if ("cancel" in task) {
        task.cancel();
      }
    }

    this.tasks.length = 0;
  }

  awaitTasks() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (_this.cancellationToken.cancelled) {
        _this.cancelTasks();

        return [];
      }

      const checkErrors = () => {
        if (_this.errors.length > 0) {
          _this.cancelTasks();

          throwError(_this.errors);
          return;
        }
      };

      checkErrors();
      let result = null;
      const tasks = _this.tasks;
      let list = tasks.slice();
      tasks.length = 0;

      while (list.length > 0) {
        const subResult = yield Promise.all(list);
        result = result == null ? subResult : result.concat(subResult);
        checkErrors();

        if (tasks.length === 0) {
          break;
        } else {
          if (_this.cancellationToken.cancelled) {
            _this.cancelTasks();

            return [];
          }

          list = tasks.slice();
          tasks.length = 0;
        }
      }

      return result || [];
    })();
  }

}

exports.AsyncTaskManager = AsyncTaskManager;

function throwError(errors) {
  if (errors.length === 1) {
    throw errors[0];
  } else if (errors.length > 1) {
    throw new (_promise().NestedError)(errors, "Cannot cleanup: ");
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=asyncTaskManager.js.map{"version":3,"sources":["../src/asyncTaskManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { CancellationToken } from \"builder-util-runtime\"\nimport { log } from \"./log\"\nimport { NestedError } from \"./promise\"\n\nexport class AsyncTaskManager {\n  readonly tasks: Array<Promise<any>> = []\n  private readonly errors: Array<Error> = []\n\n  constructor(private readonly cancellationToken: CancellationToken) {\n  }\n\n  add(task: () => Promise<any>) {\n    if (this.cancellationToken == null || !this.cancellationToken.cancelled) {\n      this.addTask(task())\n    }\n  }\n\n  addTask(promise: Promise<any>) {\n    if (this.cancellationToken.cancelled) {\n      log.debug({reason: \"cancelled\", stack: new Error().stack}, \"async task not added\")\n      if (\"cancel\" in promise) {\n        (promise as any).cancel()\n      }\n      return\n    }\n\n    this.tasks.push(promise\n      .catch(it => {\n        log.debug({error: it.message || it.toString()}, \"async task error\")\n        this.errors.push(it)\n        return Promise.resolve(null)\n      }))\n  }\n\n  cancelTasks() {\n    for (const task of this.tasks) {\n      if (\"cancel\" in task) {\n        (task as any).cancel()\n      }\n    }\n    this.tasks.length = 0\n  }\n\n  async awaitTasks(): Promise<Array<any>> {\n    if (this.cancellationToken.cancelled) {\n      this.cancelTasks()\n      return []\n    }\n\n    const checkErrors = () => {\n      if (this.errors.length > 0) {\n        this.cancelTasks()\n        throwError(this.errors)\n        return\n      }\n    }\n\n    checkErrors()\n\n    let result: Array<any> | null = null\n    const tasks = this.tasks\n    let list = tasks.slice()\n    tasks.length = 0\n    while (list.length > 0) {\n      const subResult = await Promise.all(list)\n      result = result == null ? subResult : result.concat(subResult)\n      checkErrors()\n      if (tasks.length === 0) {\n        break\n      }\n      else {\n        if (this.cancellationToken.cancelled) {\n          this.cancelTasks()\n          return []\n        }\n\n        list = tasks.slice()\n        tasks.length = 0\n      }\n    }\n    return result || []\n  }\n}\n\nfunction throwError(errors: Array<Error>) {\n  if (errors.length === 1) {\n    throw errors[0]\n  }\n  else if (errors.length > 1) {\n    throw new NestedError(errors, \"Cannot cleanup: \")\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.deepAssign = deepAssign;

function isObject(x) {
  if (Array.isArray(x)) {
    return false;
  }

  const type = typeof x;
  return type === "object" || type === "function";
}

function assignKey(target, from, key) {
  const value = from[key]; // https://github.com/electron-userland/electron-builder/pull/562

  if (value === undefined) {
    return;
  }

  const prevValue = target[key];

  if (prevValue == null || value == null || !isObject(prevValue) || !isObject(value)) {
    target[key] = value;
  } else {
    target[key] = assign(prevValue, value);
  }
}

function assign(to, from) {
  if (to !== from) {
    for (const key of Object.getOwnPropertyNames(from)) {
      assignKey(to, from, key);
    }
  }

  return to;
}

function deepAssign(target, ...objects) {
  for (const o of objects) {
    if (o != null) {
      assign(target, o);
    }
  }

  return target;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=deepAssign.js.map{"version":3,"sources":["../src/deepAssign.ts"],"names":[],"mappings":";;;;;;;AAAA,SAAS,QAAT,CAAkB,CAAlB,EAAwB;AACtB,MAAI,KAAK,CAAC,OAAN,CAAc,CAAd,CAAJ,EAAsB;AACpB,WAAO,KAAP;AACD;;AAED,QAAM,IAAI,GAAG,OAAO,CAApB;AACA,SAAO,IAAI,KAAK,QAAT,IAAqB,IAAI,KAAK,UAArC;AACD;;AAED,SAAS,SAAT,CAAmB,MAAnB,EAAgC,IAAhC,EAA2C,GAA3C,EAAsD;AACpD,QAAM,KAAK,GAAG,IAAI,CAAC,GAAD,CAAlB,CADoD,CAEpD;;AACA,MAAI,KAAK,KAAK,SAAd,EAAyB;AACvB;AACD;;AAED,QAAM,SAAS,GAAG,MAAM,CAAC,GAAD,CAAxB;;AACA,MAAI,SAAS,IAAI,IAAb,IAAqB,KAAK,IAAI,IAA9B,IAAsC,CAAC,QAAQ,CAAC,SAAD,CAA/C,IAA8D,CAAC,QAAQ,CAAC,KAAD,CAA3E,EAAoF;AAClF,IAAA,MAAM,CAAC,GAAD,CAAN,GAAc,KAAd;AACD,GAFD,MAGK;AACH,IAAA,MAAM,CAAC,GAAD,CAAN,GAAc,MAAM,CAAC,SAAD,EAAY,KAAZ,CAApB;AACD;AACF;;AAED,SAAS,MAAT,CAAgB,EAAhB,EAAyB,IAAzB,EAAkC;AAChC,MAAI,EAAE,KAAK,IAAX,EAAiB;AACf,SAAK,MAAM,GAAX,IAAkB,MAAM,CAAC,mBAAP,CAA2B,IAA3B,CAAlB,EAAoD;AAClD,MAAA,SAAS,CAAC,EAAD,EAAK,IAAL,EAAW,GAAX,CAAT;AACD;AACF;;AACD,SAAO,EAAP;AACD;;AAEK,SAAU,UAAV,CAAwB,MAAxB,EAAmC,GAAG,OAAtC,EAAyD;AAC7D,OAAK,MAAM,CAAX,IAAgB,OAAhB,EAAyB;AACvB,QAAI,CAAC,IAAI,IAAT,EAAe;AACb,MAAA,MAAM,CAAC,MAAD,EAAS,CAAT,CAAN;AACD;AACF;;AACD,SAAO,MAAP;AACD,C","sourcesContent":["function isObject(x: any) {\n  if (Array.isArray(x)) {\n    return false\n  }\n\n  const type = typeof x\n  return type === \"object\" || type === \"function\"\n}\n\nfunction assignKey(target: any, from: any, key: string) {\n  const value = from[key]\n  // https://github.com/electron-userland/electron-builder/pull/562\n  if (value === undefined) {\n    return\n  }\n\n  const prevValue = target[key]\n  if (prevValue == null || value == null || !isObject(prevValue) || !isObject(value)) {\n    target[key] = value\n  }\n  else {\n    target[key] = assign(prevValue, value)\n  }\n}\n\nfunction assign(to: any, from: any) {\n  if (to !== from) {\n    for (const key of Object.getOwnPropertyNames(from)) {\n      assignKey(to, from, key)\n    }\n  }\n  return to\n}\n\nexport function deepAssign<T>(target: T, ...objects: Array<any>): T {\n  for (const o of objects) {\n    if (o != null) {\n      assign(target, o)\n    }\n  }\n  return target\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.unlinkIfExists = unlinkIfExists;
exports.statOrNull = statOrNull;
exports.exists = exists;
exports.walk = walk;
exports.copyFile = copyFile;
exports.copyOrLinkFile = copyOrLinkFile;
exports.copyDir = copyDir;
exports.USE_HARD_LINKS = exports.DO_NOT_USE_HARD_LINKS = exports.FileCopier = exports.CopyFileTransformer = exports.CONCURRENCY = exports.MAX_FILE_REQUESTS = void 0;

function _bluebirdLst() {
  const data = _interopRequireWildcard(require("bluebird-lst"));

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _statMode() {
  const data = _interopRequireDefault(require("stat-mode"));

  _statMode = function () {
    return data;
  };

  return data;
}

function _log() {
  const data = require("./log");

  _log = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("./promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const MAX_FILE_REQUESTS = 8;
exports.MAX_FILE_REQUESTS = MAX_FILE_REQUESTS;
const CONCURRENCY = {
  concurrency: MAX_FILE_REQUESTS
};
exports.CONCURRENCY = CONCURRENCY;

class CopyFileTransformer {
  constructor(afterCopyTransformer) {
    this.afterCopyTransformer = afterCopyTransformer;
  }

}

exports.CopyFileTransformer = CopyFileTransformer;

function unlinkIfExists(file) {
  return (0, _fsExtraP().unlink)(file).catch(() => {});
}

function statOrNull(_x) {
  return _statOrNull.apply(this, arguments);
}

function _statOrNull() {
  _statOrNull = (0, _bluebirdLst().coroutine)(function* (file) {
    return (0, _promise().orNullIfFileNotExist)((0, _fsExtraP().stat)(file));
  });
  return _statOrNull.apply(this, arguments);
}

function exists(_x2) {
  return _exists.apply(this, arguments);
}
/**
 * Returns list of file paths (system-dependent file separator)
 */


function _exists() {
  _exists = (0, _bluebirdLst().coroutine)(function* (file) {
    try {
      yield (0, _fsExtraP().access)(file);
      return true;
    } catch (e) {
      return false;
    }
  });
  return _exists.apply(this, arguments);
}

function walk(_x3, _x4, _x5) {
  return _walk.apply(this, arguments);
}

function _walk() {
  _walk = (0, _bluebirdLst().coroutine)(function* (initialDirPath, filter, consumer) {
    let result = [];
    const queue = [initialDirPath];
    let addDirToResult = false;
    const isIncludeDir = consumer == null ? false : consumer.isIncludeDir === true;

    while (queue.length > 0) {
      const dirPath = queue.pop();

      if (isIncludeDir) {
        if (addDirToResult) {
          result.push(dirPath);
        } else {
          addDirToResult = true;
        }
      }

      const childNames = yield (0, _fsExtraP().readdir)(dirPath);
      childNames.sort();
      let nodeModuleContent = null;
      const dirs = []; // our handler is async, but we should add sorted files, so, we add file to result not in the mapper, but after map

      const sortedFilePaths = yield _bluebirdLst().default.map(childNames, name => {
        if (name === ".DS_Store" || name === ".gitkeep") {
          return null;
        }

        const filePath = dirPath + path.sep + name;
        return (0, _fsExtraP().lstat)(filePath).then(stat => {
          if (filter != null && !filter(filePath, stat)) {
            return null;
          }

          const consumerResult = consumer == null ? null : consumer.consume(filePath, stat, dirPath, childNames);

          if (consumerResult === false) {
            return null;
          } else if (consumerResult == null || !("then" in consumerResult)) {
            if (stat.isDirectory()) {
              dirs.push(name);
              return null;
            } else {
              return filePath;
            }
          } else {
            return consumerResult.then(it => {
              if (it != null && Array.isArray(it)) {
                nodeModuleContent = it;
                return null;
              } // asarUtil can return modified stat (symlink handling)


              if ((it != null && "isDirectory" in it ? it : stat).isDirectory()) {
                dirs.push(name);
                return null;
              } else {
                return filePath;
              }
            });
          }
        });
      }, CONCURRENCY);

      for (const child of sortedFilePaths) {
        if (child != null) {
          result.push(child);
        }
      }

      dirs.sort();

      for (const child of dirs) {
        queue.push(dirPath + path.sep + child);
      }

      if (nodeModuleContent != null) {
        result = result.concat(nodeModuleContent);
      }
    }

    return result;
  });
  return _walk.apply(this, arguments);
}

const _isUseHardLink = process.platform !== "win32" && process.env.USE_HARD_LINKS !== "false" && (require("is-ci") || process.env.USE_HARD_LINKS === "true");

function copyFile(src, dest, isEnsureDir = true) {
  return (isEnsureDir ? (0, _fsExtraP().ensureDir)(path.dirname(dest)) : Promise.resolve()).then(() => copyOrLinkFile(src, dest, null, false));
}
/**
 * Hard links is used if supported and allowed.
 * File permission is fixed â€” allow execute for all if owner can, allow read for all if owner can.
 *
 * ensureDir is not called, dest parent dir must exists
 */


function copyOrLinkFile(src, dest, stats, isUseHardLink, exDevErrorHandler) {
  if (isUseHardLink === undefined) {
    isUseHardLink = _isUseHardLink;
  }

  if (stats != null) {
    const originalModeNumber = stats.mode;
    const mode = new (_statMode().default)(stats);

    if (mode.owner.execute) {
      mode.group.execute = true;
      mode.others.execute = true;
    }

    mode.group.read = true;
    mode.others.read = true;
    mode.setuid = false;
    mode.setgid = false;

    if (originalModeNumber !== stats.mode) {
      if (_log().log.isDebugEnabled) {
        const oldMode = new (_statMode().default)({
          mode: originalModeNumber
        });

        _log().log.debug({
          file: dest,
          oldMode,
          mode
        }, "permissions fixed from");
      } // https://helgeklein.com/blog/2009/05/hard-links-and-permissions-acls/
      // Permissions on all hard links to the same data on disk are always identical. The same applies to attributes.
      // That means if you change the permissions/owner/attributes on one hard link, you will immediately see the changes on all other hard links.


      if (isUseHardLink) {
        isUseHardLink = false;

        _log().log.debug({
          dest
        }, "copied, but not linked, because file permissions need to be fixed");
      }
    }
  }

  if (isUseHardLink) {
    return (0, _fsExtraP().link)(src, dest).catch(e => {
      if (e.code === "EXDEV") {
        const isLog = exDevErrorHandler == null ? true : exDevErrorHandler();

        if (isLog && _log().log.isDebugEnabled) {
          _log().log.debug({
            error: e.message
          }, "cannot copy using hard link");
        }

        return doCopyFile(src, dest, stats);
      } else {
        throw e;
      }
    });
  }

  return doCopyFile(src, dest, stats);
}

function doCopyFile(src, dest, stats) {
  if (_fsExtraP().copyFile == null) {
    return new Promise((resolve, reject) => {
      const reader = (0, _fsExtraP().createReadStream)(src);
      const writer = (0, _fsExtraP().createWriteStream)(dest, stats == null ? undefined : {
        mode: stats.mode
      });
      reader.on("error", reject);
      writer.on("error", reject);
      writer.on("open", () => {
        reader.pipe(writer);
      });
      writer.once("close", resolve);
    });
  } // node 8.5.0+


  const promise = (0, _fsExtraP().copyFile)(src, dest);

  if (stats == null) {
    return promise;
  }

  return promise.then(() => (0, _fsExtraP().chmod)(dest, stats.mode));
}

class FileCopier {
  constructor(isUseHardLinkFunction, transformer) {
    this.isUseHardLinkFunction = isUseHardLinkFunction;
    this.transformer = transformer;

    if (isUseHardLinkFunction === USE_HARD_LINKS) {
      this.isUseHardLink = true;
    } else {
      this.isUseHardLink = _isUseHardLink && isUseHardLinkFunction !== DO_NOT_USE_HARD_LINKS;
    }
  }

  copy(src, dest, stat) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      let afterCopyTransformer = null;

      if (_this.transformer != null && stat != null && stat.isFile()) {
        let data = _this.transformer(src);

        if (data != null) {
          if (typeof data === "object" && "then" in data) {
            data = yield data;
          }

          if (data != null) {
            if (data instanceof CopyFileTransformer) {
              afterCopyTransformer = data.afterCopyTransformer;
            } else {
              yield (0, _fsExtraP().writeFile)(dest, data);
              return;
            }
          }
        }
      }

      const isUseHardLink = afterCopyTransformer == null && (!_this.isUseHardLink || _this.isUseHardLinkFunction == null ? _this.isUseHardLink : _this.isUseHardLinkFunction(dest));
      yield copyOrLinkFile(src, dest, stat, isUseHardLink, isUseHardLink ? () => {
        // files are copied concurrently, so, we must not check here currentIsUseHardLink â€” our code can be executed after that other handler will set currentIsUseHardLink to false
        if (_this.isUseHardLink) {
          _this.isUseHardLink = false;
          return true;
        } else {
          return false;
        }
      } : null);

      if (afterCopyTransformer != null) {
        yield afterCopyTransformer(dest);
      }
    })();
  }

}
/**
 * Empty directories is never created.
 * Hard links is used if supported and allowed.
 */


exports.FileCopier = FileCopier;

function copyDir(src, destination, options = {}) {
  const fileCopier = new FileCopier(options.isUseHardLink, options.transformer);

  if (_log().log.isDebugEnabled) {
    _log().log.debug({
      src,
      destination
    }, `copying${fileCopier.isUseHardLink ? " using hard links" : ""}`);
  }

  const createdSourceDirs = new Set();
  const links = [];
  return walk(src, options.filter, {
    consume: function () {
      var _ref = (0, _bluebirdLst().coroutine)(function* (file, stat, parent) {
        if (!stat.isFile() && !stat.isSymbolicLink()) {
          return;
        }

        if (!createdSourceDirs.has(parent)) {
          yield (0, _fsExtraP().ensureDir)(parent.replace(src, destination));
          createdSourceDirs.add(parent);
        }

        const destFile = file.replace(src, destination);

        if (stat.isFile()) {
          yield fileCopier.copy(file, destFile, stat);
        } else {
          links.push({
            file: destFile,
            link: yield (0, _fsExtraP().readlink)(file)
          });
        }
      });

      return function consume(_x6, _x7, _x8) {
        return _ref.apply(this, arguments);
      };
    }()
  }).then(() => _bluebirdLst().default.map(links, it => (0, _fsExtraP().symlink)(it.link, it.file), CONCURRENCY));
}

const DO_NOT_USE_HARD_LINKS = file => false;

exports.DO_NOT_USE_HARD_LINKS = DO_NOT_USE_HARD_LINKS;

const USE_HARD_LINKS = file => true; exports.USE_HARD_LINKS = USE_HARD_LINKS;
// __ts-babel@6.0.4
//# sourceMappingURL=fs.js.map{"version":3,"sources":["../src/fs.ts"],"names":[],"mappings":"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","sourcesContent":["import BluebirdPromise from \"bluebird-lst\"\nimport { access, chmod, copyFile as _nodeCopyFile, createReadStream, createWriteStream, ensureDir, link, lstat, readdir, readlink, stat, Stats, symlink, unlink, writeFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport Mode from \"stat-mode\"\nimport { log } from \"./log\"\nimport { orNullIfFileNotExist } from \"./promise\"\n\nexport const MAX_FILE_REQUESTS = 8\nexport const CONCURRENCY = {concurrency: MAX_FILE_REQUESTS}\n\nexport type AfterCopyFileTransformer = (file: string) => Promise<void>\n\nexport class CopyFileTransformer {\n  constructor(public readonly afterCopyTransformer: AfterCopyFileTransformer) {\n  }\n}\n\nexport type FileTransformer = (file: string) => Promise<null | string | Buffer | CopyFileTransformer> | null | string | Buffer | CopyFileTransformer\nexport type Filter = (file: string, stat: Stats) => boolean\n\nexport function unlinkIfExists(file: string) {\n  return unlink(file)\n    .catch(() => {/* ignore */})\n}\n\nexport async function statOrNull(file: string): Promise<Stats | null> {\n  return orNullIfFileNotExist(stat(file))\n}\n\nexport async function exists(file: string): Promise<boolean> {\n  try {\n    await access(file)\n    return true\n  }\n  catch (e) {\n    return false\n  }\n}\n\nexport interface FileConsumer {\n  consume(file: string, fileStat: Stats, parent: string, siblingNames: Array<string>): any\n\n  /**\n   * @default false\n   */\n  isIncludeDir?: boolean\n}\n\n/**\n * Returns list of file paths (system-dependent file separator)\n */\nexport async function walk(initialDirPath: string, filter?: Filter | null, consumer?: FileConsumer): Promise<Array<string>> {\n  let result: Array<string> = []\n  const queue: Array<string> = [initialDirPath]\n  let addDirToResult = false\n  const isIncludeDir = consumer == null ? false : consumer.isIncludeDir === true\n  while (queue.length > 0) {\n    const dirPath = queue.pop()!\n    if (isIncludeDir) {\n      if (addDirToResult) {\n        result.push(dirPath)\n      }\n      else {\n        addDirToResult = true\n      }\n    }\n\n    const childNames = await readdir(dirPath)\n    childNames.sort()\n\n    let nodeModuleContent: Array<string> | null = null\n\n    const dirs: Array<string> = []\n    // our handler is async, but we should add sorted files, so, we add file to result not in the mapper, but after map\n    const sortedFilePaths = await BluebirdPromise.map(childNames, name => {\n      if (name === \".DS_Store\" || name === \".gitkeep\") {\n        return null\n      }\n\n      const filePath = dirPath + path.sep + name\n      return lstat(filePath)\n        .then(stat => {\n          if (filter != null && !filter(filePath, stat)) {\n            return null\n          }\n\n          const consumerResult = consumer == null ? null : consumer.consume(filePath, stat, dirPath, childNames)\n          if (consumerResult === false) {\n            return null\n          }\n          else if (consumerResult == null || !(\"then\" in consumerResult)) {\n            if (stat.isDirectory()) {\n              dirs.push(name)\n              return null\n            }\n            else {\n              return filePath\n            }\n          }\n          else {\n            return (consumerResult as Promise<any>)\n              .then((it): any => {\n                if (it != null && Array.isArray(it)) {\n                  nodeModuleContent = it\n                  return null\n                }\n\n                // asarUtil can return modified stat (symlink handling)\n                if ((it != null && \"isDirectory\" in it ? (it as Stats) : stat).isDirectory()) {\n                  dirs.push(name)\n                  return null\n                }\n                else {\n                  return filePath\n                }\n              })\n          }\n        })\n    }, CONCURRENCY)\n\n    for (const child of sortedFilePaths) {\n      if (child != null) {\n        result.push(child)\n      }\n    }\n\n    dirs.sort()\n    for (const child of dirs) {\n      queue.push(dirPath + path.sep + child)\n    }\n\n    if (nodeModuleContent != null) {\n      result = result.concat(nodeModuleContent)\n    }\n  }\n\n  return result\n}\n\nconst _isUseHardLink = process.platform !== \"win32\" && process.env.USE_HARD_LINKS !== \"false\" && (require(\"is-ci\") || process.env.USE_HARD_LINKS === \"true\")\n\nexport function copyFile(src: string, dest: string, isEnsureDir = true) {\n  return (isEnsureDir ? ensureDir(path.dirname(dest)) : Promise.resolve())\n    .then(() => copyOrLinkFile(src, dest, null, false))\n}\n\n/**\n * Hard links is used if supported and allowed.\n * File permission is fixed â€” allow execute for all if owner can, allow read for all if owner can.\n *\n * ensureDir is not called, dest parent dir must exists\n */\nexport function copyOrLinkFile(src: string, dest: string, stats?: Stats | null, isUseHardLink?: boolean, exDevErrorHandler?: (() => boolean) | null): Promise<any> {\n  if (isUseHardLink === undefined) {\n    isUseHardLink = _isUseHardLink\n  }\n\n  if (stats != null) {\n    const originalModeNumber = stats.mode\n    const mode = new Mode(stats)\n    if (mode.owner.execute) {\n      mode.group.execute = true\n      mode.others.execute = true\n    }\n\n    mode.group.read = true\n    mode.others.read = true\n\n    mode.setuid = false\n    mode.setgid = false\n\n    if (originalModeNumber !== stats.mode) {\n      if (log.isDebugEnabled) {\n        const oldMode = new Mode({mode: originalModeNumber})\n        log.debug({file: dest, oldMode, mode}, \"permissions fixed from\")\n      }\n\n      // https://helgeklein.com/blog/2009/05/hard-links-and-permissions-acls/\n      // Permissions on all hard links to the same data on disk are always identical. The same applies to attributes.\n      // That means if you change the permissions/owner/attributes on one hard link, you will immediately see the changes on all other hard links.\n      if (isUseHardLink) {\n        isUseHardLink = false\n        log.debug({dest}, \"copied, but not linked, because file permissions need to be fixed\")\n      }\n    }\n  }\n\n  if (isUseHardLink) {\n    return link(src, dest)\n      .catch(e => {\n        if (e.code === \"EXDEV\") {\n          const isLog = exDevErrorHandler == null ? true : exDevErrorHandler()\n          if (isLog && log.isDebugEnabled) {\n            log.debug({error: e.message}, \"cannot copy using hard link\")\n          }\n          return doCopyFile(src, dest, stats)\n        }\n        else {\n          throw e\n        }\n      })\n  }\n  return doCopyFile(src, dest, stats)\n}\n\nfunction doCopyFile(src: string, dest: string, stats: Stats | null | undefined): Promise<any> {\n  if (_nodeCopyFile == null) {\n    return new Promise((resolve, reject) => {\n      const reader = createReadStream(src)\n      const writer = createWriteStream(dest, stats == null ? undefined : {mode: stats!!.mode})\n      reader.on(\"error\", reject)\n      writer.on(\"error\", reject)\n      writer.on(\"open\", () => {\n        reader.pipe(writer)\n      })\n      writer.once(\"close\", resolve)\n    })\n  }\n\n  // node 8.5.0+\n  const promise = _nodeCopyFile(src, dest)\n  if (stats == null) {\n    return promise\n  }\n\n  return promise\n    .then(() => chmod(dest, stats.mode))\n}\n\nexport class FileCopier {\n  isUseHardLink: boolean\n\n  constructor(private readonly isUseHardLinkFunction?: ((file: string) => boolean) | null, private readonly transformer?: FileTransformer | null) {\n    if (isUseHardLinkFunction === USE_HARD_LINKS) {\n      this.isUseHardLink = true\n    }\n    else {\n      this.isUseHardLink = _isUseHardLink && isUseHardLinkFunction !== DO_NOT_USE_HARD_LINKS\n    }\n  }\n\n  async copy(src: string, dest: string, stat: Stats | undefined) {\n    let afterCopyTransformer: AfterCopyFileTransformer | null = null\n    if (this.transformer != null && stat != null && stat.isFile()) {\n      let data = this.transformer(src)\n      if (data != null) {\n        if (typeof data === \"object\" && \"then\" in data) {\n          data = await data\n        }\n\n        if (data != null) {\n          if (data instanceof CopyFileTransformer) {\n            afterCopyTransformer = data.afterCopyTransformer\n          }\n          else {\n            await writeFile(dest, data)\n            return\n          }\n        }\n      }\n    }\n\n    const isUseHardLink = afterCopyTransformer == null && ((!this.isUseHardLink || this.isUseHardLinkFunction == null) ? this.isUseHardLink : this.isUseHardLinkFunction(dest))\n    await copyOrLinkFile(src, dest, stat, isUseHardLink, isUseHardLink ? () => {\n      // files are copied concurrently, so, we must not check here currentIsUseHardLink â€” our code can be executed after that other handler will set currentIsUseHardLink to false\n      if (this.isUseHardLink) {\n        this.isUseHardLink = false\n        return true\n      }\n      else {\n        return false\n      }\n    } : null)\n\n    if (afterCopyTransformer != null) {\n      await afterCopyTransformer(dest)\n    }\n  }\n}\n\nexport interface CopyDirOptions {\n  filter?: Filter | null\n  transformer?: FileTransformer | null\n  isUseHardLink?: ((file: string) => boolean) | null\n}\n\n/**\n * Empty directories is never created.\n * Hard links is used if supported and allowed.\n */\nexport function copyDir(src: string, destination: string, options: CopyDirOptions = {}): Promise<any> {\n  const fileCopier = new FileCopier(options.isUseHardLink, options.transformer)\n\n  if (log.isDebugEnabled) {\n    log.debug({src, destination}, `copying${fileCopier.isUseHardLink ? \" using hard links\" : \"\"}`)\n  }\n\n  const createdSourceDirs = new Set<string>()\n  const links: Array<Link> = []\n  return walk(src, options.filter, {\n    consume: async (file, stat, parent) => {\n      if (!stat.isFile() && !stat.isSymbolicLink()) {\n        return\n      }\n\n      if (!createdSourceDirs.has(parent)) {\n        await ensureDir(parent.replace(src, destination))\n        createdSourceDirs.add(parent)\n      }\n\n      const destFile = file.replace(src, destination)\n      if (stat.isFile()) {\n        await fileCopier.copy(file, destFile, stat)\n      }\n      else {\n        links.push({file: destFile, link: await readlink(file)})\n      }\n    }\n  })\n    .then(() => BluebirdPromise.map(links, it => symlink(it.link, it.file), CONCURRENCY))\n}\n\nexport const DO_NOT_USE_HARD_LINKS = (file: string) => false\nexport const USE_HARD_LINKS = (file: string) => true\n\nexport interface Link {\n  readonly link: string,\n  readonly file: string\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.setPrinter = setPrinter;
exports.log = exports.Logger = exports.PADDING = exports.debug = void 0;

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

var _debug2 = _interopRequireDefault(require("debug"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

let printer = null;
const debug = (0, _debug2.default)("electron-builder");
exports.debug = debug;

function setPrinter(value) {
  printer = value;
}

const PADDING = 2;
exports.PADDING = PADDING;

class Logger {
  constructor(stream) {
    this.stream = stream;

    this.messageTransformer = it => it;
  }

  filePath(file) {
    const cwd = process.cwd();
    return file.startsWith(cwd) ? file.substring(cwd.length + 1) : file;
  } // noinspection JSMethodCanBeStatic


  get isDebugEnabled() {
    return debug.enabled;
  }

  info(messageOrFields, message) {
    this.doLog(message, messageOrFields, "info");
  }

  notice(messageOrFields, message) {
    this.doLog(message, messageOrFields, "notice");
  }

  warn(messageOrFields, message) {
    this.doLog(message, messageOrFields, "warn");
  }

  debug(fields, message) {
    if (debug.enabled) {
      this._doLog(message, fields, "debug");
    }
  }

  doLog(message, messageOrFields, level) {
    if (message === undefined) {
      this._doLog(messageOrFields, null, level);
    } else {
      this._doLog(message, messageOrFields, level);
    }
  }

  _doLog(message, fields, level) {
    // noinspection SuspiciousInstanceOfGuard
    if (message instanceof Error) {
      message = message.stack || message.toString();
    } else {
      message = message.toString();
    }

    const levelIndicator = level === "error" ? "â¨¯" : "â€¢";
    const color = LEVEL_TO_COLOR[level];
    this.stream.write(`${" ".repeat(PADDING)}${color(levelIndicator)} `);
    this.stream.write(Logger.createMessage(this.messageTransformer(message, level), fields, level, color, PADDING + 2
    /* level indicator and space */
    ));
    this.stream.write("\n");
  }

  static createMessage(message, fields, level, color, messagePadding = 0) {
    if (fields == null) {
      return message;
    }

    const fieldPadding = " ".repeat(Math.max(1, 16 - message.length));
    let text = message + fieldPadding;
    const fieldNames = Object.keys(fields);
    let counter = 0;

    for (const name of fieldNames) {
      let fieldValue = fields[name];
      let valuePadding = null;

      if (fieldValue != null && typeof fieldValue === "string" && fieldValue.includes("\n")) {
        valuePadding = " ".repeat(messagePadding + message.length + fieldPadding.length + 2);
        fieldValue = "\n" + valuePadding + fieldValue.replace(/\n/g, `\n${valuePadding}`);
      } else if (Array.isArray(fieldValue)) {
        fieldValue = JSON.stringify(fieldValue);
      } else if (Array.isArray(fieldValue)) {
        fieldValue = JSON.stringify(fieldValue);
      } else if (typeof fieldValue === "object") {// fieldValue = safeStringifyJson(fieldValue)
      }

      text += `${color(name)}=${fieldValue}`;

      if (++counter !== fieldNames.length) {
        if (valuePadding == null) {
          text += " ";
        } else {
          text += "\n" + valuePadding;
        }
      }
    }

    return text;
  }

  log(message) {
    if (printer == null) {
      this.stream.write(`${message}\n`);
    } else {
      printer(message);
    }
  }

}

exports.Logger = Logger;
const LEVEL_TO_COLOR = {
  info: _chalk().default.blue,
  notice: _chalk().default.yellow,
  warn: _chalk().default.yellow,
  debug: _chalk().default.white
};
const log = new Logger(process.stdout); exports.log = log;
// __ts-babel@6.0.4
//# sourceMappingURL=log.js.map{"version":3,"sources":["../src/log.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk, { Chalk } from \"chalk\"\nimport _debug from \"debug\"\nimport WritableStream = NodeJS.WritableStream\n\nlet printer: ((message: string) => void) | null = null\n\nexport const debug = _debug(\"electron-builder\")\n\nexport interface Fields {\n  [index: string]: any\n}\n\nexport function setPrinter(value: ((message: string) => void) | null) {\n  printer = value\n}\n\nexport type LogLevel = \"info\" | \"warn\" | \"debug\" | \"notice\" | \"error\"\n\nexport const PADDING = 2\n\nexport class Logger {\n  constructor(protected readonly stream: WritableStream) {\n  }\n\n  messageTransformer: ((message: string, level: LogLevel) => string) = it => it\n\n  filePath(file: string) {\n    const cwd = process.cwd()\n    return file.startsWith(cwd) ? file.substring(cwd.length + 1) : file\n  }\n\n  // noinspection JSMethodCanBeStatic\n  get isDebugEnabled() {\n    return debug.enabled\n  }\n\n  info(messageOrFields: Fields | null | string, message?: string) {\n    this.doLog(message, messageOrFields, \"info\")\n  }\n\n  notice(messageOrFields: Fields | null | string, message?: string): void {\n    this.doLog(message, messageOrFields, \"notice\")\n  }\n\n  warn(messageOrFields: Fields | null | string, message?: string): void {\n    this.doLog(message, messageOrFields, \"warn\")\n  }\n\n  debug(fields: Fields | null, message: string) {\n    if (debug.enabled) {\n      this._doLog(message, fields, \"debug\")\n    }\n  }\n\n  private doLog(message: string | undefined | Error, messageOrFields: Fields | null | string, level: LogLevel) {\n    if (message === undefined) {\n      this._doLog(messageOrFields as string, null, level)\n    }\n    else {\n      this._doLog(message, messageOrFields as Fields | null, level)\n    }\n  }\n\n  private _doLog(message: string | Error, fields: Fields | null, level: LogLevel) {\n    // noinspection SuspiciousInstanceOfGuard\n    if (message instanceof Error) {\n      message = message.stack || message.toString()\n    }\n    else {\n      message = message.toString()\n    }\n\n    const levelIndicator = level === \"error\" ? \"â¨¯\" : \"â€¢\"\n    const color = LEVEL_TO_COLOR[level]\n    this.stream.write(`${\" \".repeat(PADDING)}${color(levelIndicator)} `)\n    this.stream.write(Logger.createMessage(this.messageTransformer(message, level), fields, level, color, PADDING + 2 /* level indicator and space */))\n    this.stream.write(\"\\n\")\n  }\n\n  static createMessage(message: string, fields: Fields | null, level: LogLevel, color: (it: string) => string, messagePadding = 0): string {\n    if (fields == null) {\n      return message\n    }\n\n    const fieldPadding = \" \".repeat(Math.max(1, 16 - message.length))\n    let text = message + fieldPadding\n    const fieldNames = Object.keys(fields)\n    let counter = 0\n    for (const name of fieldNames) {\n      let fieldValue = fields[name]\n      let valuePadding: string | null = null\n      if (fieldValue != null && typeof fieldValue === \"string\" && fieldValue.includes(\"\\n\")) {\n        valuePadding = \" \".repeat(messagePadding + message.length + fieldPadding.length + 2)\n        fieldValue = \"\\n\" + valuePadding + fieldValue.replace(/\\n/g, `\\n${valuePadding}`)\n      }\n      else if (Array.isArray(fieldValue)) {\n        fieldValue = JSON.stringify(fieldValue)\n      }\n      else if (Array.isArray(fieldValue)) {\n        fieldValue = JSON.stringify(fieldValue)\n      }\n      else if (typeof fieldValue === \"object\") {\n        // fieldValue = safeStringifyJson(fieldValue)\n      }\n\n      text += `${color(name)}=${fieldValue}`\n      if (++counter !== fieldNames.length) {\n        if (valuePadding == null) {\n          text += \" \"\n        }\n        else {\n          text += \"\\n\" + valuePadding\n        }\n      }\n    }\n    return text\n  }\n\n  log(message: string): void {\n    if (printer == null) {\n      this.stream.write(`${message}\\n`)\n    }\n    else {\n      printer(message)\n    }\n  }\n}\n\nconst LEVEL_TO_COLOR: { [index: string]: Chalk } = {\n  info: chalk.blue,\n  notice: chalk.yellow,\n  warn: chalk.yellow,\n  debug: chalk.white,\n}\n\nexport const log = new Logger(process.stdout)"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.httpExecutor = exports.NodeHttpExecutor = void 0;

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _http() {
  const data = require("http");

  _http = function () {
    return data;
  };

  return data;
}

function https() {
  const data = _interopRequireWildcard(require("https"));

  https = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class NodeHttpExecutor extends _builderUtilRuntime().HttpExecutor {
  // noinspection JSMethodCanBeStatic
  // noinspection JSUnusedGlobalSymbols
  createRequest(options, callback) {
    return (options.protocol === "http:" ? _http().request : https().request)(options, callback);
  }

}

exports.NodeHttpExecutor = NodeHttpExecutor;
const httpExecutor = new NodeHttpExecutor(); exports.httpExecutor = httpExecutor;
// __ts-babel@6.0.4
//# sourceMappingURL=nodeHttpExecutor.js.map{"version":3,"sources":["../src/nodeHttpExecutor.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEM,MAAO,gBAAP,SAAgC,kCAAhC,CAA2D;AAC/D;AACA;AACA,EAAA,aAAa,CAAC,OAAD,EAAe,QAAf,EAAgD;AAC3D,WAAO,CAAC,OAAO,CAAC,QAAR,KAAqB,OAArB,GAA+B,eAA/B,GAA6C,KAAK,GAAC,OAApD,EAA6D,OAA7D,EAAsE,QAAtE,CAAP;AACD;;AAL8D;;;AAQ1D,MAAM,YAAY,GAAG,IAAI,gBAAJ,EAArB,C","sourcesContent":["import { HttpExecutor } from \"builder-util-runtime\"\nimport { ClientRequest, request as httpRequest } from \"http\"\nimport * as https from \"https\"\n\nexport class NodeHttpExecutor extends HttpExecutor<ClientRequest> {\n  // noinspection JSMethodCanBeStatic\n  // noinspection JSUnusedGlobalSymbols\n  createRequest(options: any, callback: (response: any) => void): any {\n    return (options.protocol === \"http:\" ? httpRequest : https.request)(options, callback)\n  }\n}\n\nexport const httpExecutor = new NodeHttpExecutor()"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.printErrorAndExit = printErrorAndExit;
exports.executeFinally = executeFinally;
exports.orNullIfFileNotExist = orNullIfFileNotExist;
exports.orIfFileNotExist = orIfFileNotExist;
exports.NestedError = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function printErrorAndExit(error) {
  console.error(_chalk().default.red((error.stack || error).toString()));
  process.exit(1);
} // you don't need to handle error in your task - it is passed only indicate status of promise


function executeFinally(_x, _x2) {
  return _executeFinally.apply(this, arguments);
}

function _executeFinally() {
  _executeFinally = (0, _bluebirdLst().coroutine)(function* (promise, task) {
    let result = null;

    try {
      result = yield promise;
    } catch (originalError) {
      try {
        yield task(true);
      } catch (taskError) {
        throw new NestedError([originalError, taskError]);
      }

      throw originalError;
    }

    yield task(false);
    return result;
  });
  return _executeFinally.apply(this, arguments);
}

class NestedError extends Error {
  constructor(errors, message = "Compound error: ") {
    let m = message;
    let i = 1;

    for (const error of errors) {
      const prefix = `Error #${i++} `;
      m += "\n\n" + prefix + "-".repeat(80) + "\n" + error.stack;
    }

    super(m);
  }

}

exports.NestedError = NestedError;

function orNullIfFileNotExist(promise) {
  return orIfFileNotExist(promise, null);
}

function orIfFileNotExist(promise, fallbackValue) {
  return promise.catch(e => {
    if (e.code === "ENOENT" || e.code === "ENOTDIR") {
      return fallbackValue;
    }

    throw e;
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=promise.js.map{"version":3,"sources":["../src/promise.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;AAEM,SAAU,iBAAV,CAA4B,KAA5B,EAAwC;AAC5C,EAAA,OAAO,CAAC,KAAR,CAAc,iBAAM,GAAN,CAAU,CAAC,KAAK,CAAC,KAAN,IAAe,KAAhB,EAAuB,QAAvB,EAAV,CAAd;AACA,EAAA,OAAO,CAAC,IAAR,CAAa,CAAb;AACD,C,CAED;;;SACsB,c;;;;;kDAAf,WAAiC,OAAjC,EAAsD,IAAtD,EAAsG;AAC3G,QAAI,MAAM,GAAa,IAAvB;;AACA,QAAI;AACF,MAAA,MAAM,SAAS,OAAf;AACD,KAFD,CAGA,OAAO,aAAP,EAAsB;AACpB,UAAI;AACF,cAAM,IAAI,CAAC,IAAD,CAAV;AACD,OAFD,CAGA,OAAO,SAAP,EAAkB;AAChB,cAAM,IAAI,WAAJ,CAAgB,CAAC,aAAD,EAAgB,SAAhB,CAAhB,CAAN;AACD;;AAED,YAAM,aAAN;AACD;;AAED,UAAM,IAAI,CAAC,KAAD,CAAV;AACA,WAAO,MAAP;AACD,G;;;;AAEK,MAAO,WAAP,SAA2B,KAA3B,CAAgC;AACpC,EAAA,WAAA,CAAY,MAAZ,EAAkC,OAAA,GAAkB,kBAApD,EAAsE;AACpE,QAAI,CAAC,GAAG,OAAR;AACA,QAAI,CAAC,GAAG,CAAR;;AACA,SAAK,MAAM,KAAX,IAAoB,MAApB,EAA4B;AAC1B,YAAM,MAAM,GAAG,UAAU,CAAC,EAAE,GAA5B;AACA,MAAA,CAAC,IAAI,SAAS,MAAT,GAAkB,IAAI,MAAJ,CAAW,EAAX,CAAlB,GAAmC,IAAnC,GAA0C,KAAM,CAAC,KAAtD;AACD;;AACD,UAAM,CAAN;AACD;;AATmC;;;;AAYhC,SAAU,oBAAV,CAAkC,OAAlC,EAAqD;AACzD,SAAO,gBAAgB,CAAC,OAAD,EAAU,IAAV,CAAvB;AACD;;AAEK,SAAU,gBAAV,CAA8B,OAA9B,EAAmD,aAAnD,EAAmE;AACvE,SAAO,OAAO,CACX,KADI,CACE,CAAC,IAAG;AACT,QAAI,CAAC,CAAC,IAAF,KAAW,QAAX,IAAuB,CAAC,CAAC,IAAF,KAAW,SAAtC,EAAiD;AAC/C,aAAO,aAAP;AACD;;AACD,UAAM,CAAN;AACD,GANI,CAAP;AAOD,C","sourcesContent":["import chalk from \"chalk\"\n\nexport function printErrorAndExit(error: Error) {\n  console.error(chalk.red((error.stack || error).toString()))\n  process.exit(1)\n}\n\n// you don't need to handle error in your task - it is passed only indicate status of promise\nexport async function executeFinally<T>(promise: Promise<T>, task: (isErrorOccurred: boolean) => Promise<any>): Promise<T> {\n  let result: T | null = null\n  try {\n    result = await promise\n  }\n  catch (originalError) {\n    try {\n      await task(true)\n    }\n    catch (taskError) {\n      throw new NestedError([originalError, taskError])\n    }\n\n    throw originalError\n  }\n\n  await task(false)\n  return result\n}\n\nexport class NestedError extends Error {\n  constructor(errors: Array<Error>, message: string = \"Compound error: \") {\n    let m = message\n    let i = 1\n    for (const error of errors) {\n      const prefix = `Error #${i++} `\n      m += \"\\n\\n\" + prefix + \"-\".repeat(80) + \"\\n\" + error!.stack\n    }\n    super(m)\n  }\n}\n\nexport function orNullIfFileNotExist<T>(promise: Promise<T>): Promise<T | null> {\n  return orIfFileNotExist(promise, null)\n}\n\nexport function orIfFileNotExist<T>(promise: Promise<T>, fallbackValue: T): Promise<T> {\n  return promise\n    .catch(e => {\n      if (e.code === \"ENOENT\" || e.code === \"ENOTDIR\") {\n        return fallbackValue\n      }\n      throw e\n    })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.serializeToYaml = serializeToYaml;
exports.removePassword = removePassword;
exports.exec = exec;
exports.doSpawn = doSpawn;
exports.spawnAndWrite = spawnAndWrite;
exports.spawn = spawn;
exports.use = use;
exports.isEmptyOrSpaces = isEmptyOrSpaces;
exports.isTokenCharValid = isTokenCharValid;
exports.addValue = addValue;
exports.replaceDefault = replaceDefault;
exports.getPlatformIconFileName = getPlatformIconFileName;
exports.isPullRequest = isPullRequest;
exports.isEnvTrue = isEnvTrue;
exports.executeAppBuilder = executeAppBuilder;
Object.defineProperty(exports, "safeStringifyJson", {
  enumerable: true,
  get: function () {
    return _builderUtilRuntime().safeStringifyJson;
  }
});
Object.defineProperty(exports, "asArray", {
  enumerable: true,
  get: function () {
    return _builderUtilRuntime().asArray;
  }
});
Object.defineProperty(exports, "log", {
  enumerable: true,
  get: function () {
    return _log().log;
  }
});
Object.defineProperty(exports, "debug", {
  enumerable: true,
  get: function () {
    return _log().debug;
  }
});
Object.defineProperty(exports, "TmpDir", {
  enumerable: true,
  get: function () {
    return _tempFile().TmpDir;
  }
});
Object.defineProperty(exports, "Arch", {
  enumerable: true,
  get: function () {
    return _arch().Arch;
  }
});
Object.defineProperty(exports, "getArchCliNames", {
  enumerable: true,
  get: function () {
    return _arch().getArchCliNames;
  }
});
Object.defineProperty(exports, "toLinuxArchString", {
  enumerable: true,
  get: function () {
    return _arch().toLinuxArchString;
  }
});
Object.defineProperty(exports, "getArchSuffix", {
  enumerable: true,
  get: function () {
    return _arch().getArchSuffix;
  }
});
Object.defineProperty(exports, "archFromString", {
  enumerable: true,
  get: function () {
    return _arch().archFromString;
  }
});
Object.defineProperty(exports, "AsyncTaskManager", {
  enumerable: true,
  get: function () {
    return _asyncTaskManager().AsyncTaskManager;
  }
});
Object.defineProperty(exports, "DebugLogger", {
  enumerable: true,
  get: function () {
    return _DebugLogger().DebugLogger;
  }
});
Object.defineProperty(exports, "copyFile", {
  enumerable: true,
  get: function () {
    return _fs().copyFile;
  }
});
Object.defineProperty(exports, "deepAssign", {
  enumerable: true,
  get: function () {
    return _deepAssign().deepAssign;
  }
});
exports.InvalidConfigurationError = exports.debug7z = void 0;

function _zipBin() {
  const data = require("7zip-bin");

  _zipBin = function () {
    return data;
  };

  return data;
}

function _appBuilderBin() {
  const data = require("app-builder-bin");

  _appBuilderBin = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

function _child_process() {
  const data = require("child_process");

  _child_process = function () {
    return data;
  };

  return data;
}

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

var _debug2 = _interopRequireDefault(require("debug"));

function _jsYaml() {
  const data = require("js-yaml");

  _jsYaml = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

require("source-map-support/register");

function _log() {
  const data = require("./log");

  _log = function () {
    return data;
  };

  return data;
}

function _isCi() {
  const data = _interopRequireDefault(require("is-ci"));

  _isCi = function () {
    return data;
  };

  return data;
}

function _tempFile() {
  const data = require("temp-file");

  _tempFile = function () {
    return data;
  };

  return data;
}

function _arch() {
  const data = require("./arch");

  _arch = function () {
    return data;
  };

  return data;
}

function _asyncTaskManager() {
  const data = require("./asyncTaskManager");

  _asyncTaskManager = function () {
    return data;
  };

  return data;
}

function _DebugLogger() {
  const data = require("./DebugLogger");

  _DebugLogger = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("./fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _deepAssign() {
  const data = require("./deepAssign");

  _deepAssign = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const debug7z = (0, _debug2.default)("electron-builder:7z");
exports.debug7z = debug7z;

function serializeToYaml(object, skipInvalid = false, noRefs = false) {
  return (0, _jsYaml().safeDump)(object, {
    lineWidth: 8000,
    skipInvalid,
    noRefs
  });
}

function removePassword(input) {
  return input.replace(/(-String |-P |pass:| \/p |-pass |--secretKey |--accessKey )([^ ]+)/g, (match, p1, p2) => {
    if (p1.trim() === "/p" && p2.startsWith("\\\\Mac\\Host\\\\")) {
      // appx /p
      return `${p1}${p2}`;
    }

    return `${p1}${(0, _crypto().createHash)("sha256").update(p2).digest("hex")} (sha256 hash)`;
  });
}

function getProcessEnv(env) {
  if (process.platform === "win32") {
    return env == null ? undefined : env;
  }

  const finalEnv = Object.assign({}, env || process.env); // without LC_CTYPE dpkg can returns encoded unicode symbols
  // set LC_CTYPE to avoid crash https://github.com/electron-userland/electron-builder/issues/503 Even "en_DE.UTF-8" leads to error.

  const locale = process.platform === "linux" ? process.env.LANG || "C.UTF-8" : "en_US.UTF-8";
  finalEnv.LANG = locale;
  finalEnv.LC_CTYPE = locale;
  finalEnv.LC_ALL = locale;
  return finalEnv;
}

function exec(file, args, options, isLogOutIfDebug = true) {
  if (_log().log.isDebugEnabled) {
    const logFields = {
      file,
      args: args == null ? "" : removePassword(args.join(" "))
    };

    if (options != null) {
      if (options.cwd != null) {
        logFields.cwd = options.cwd;
      }

      if (options.env != null) {
        const diffEnv = Object.assign({}, options.env);

        for (const name of Object.keys(process.env)) {
          if (process.env[name] === options.env[name]) {
            delete diffEnv[name];
          }
        }

        logFields.env = (0, _builderUtilRuntime().safeStringifyJson)(diffEnv);
      }
    }

    _log().log.debug(logFields, "executing");
  }

  return new Promise((resolve, reject) => {
    (0, _child_process().execFile)(file, args, Object.assign({}, options, {
      maxBuffer: 1000 * 1024 * 1024,
      env: getProcessEnv(options == null ? null : options.env)
    }), (error, stdout, stderr) => {
      if (error == null) {
        if (isLogOutIfDebug && _log().log.isDebugEnabled) {
          const logFields = {
            file
          };

          if (stdout.length > 0) {
            logFields.stdout = stdout;
          }

          if (stderr.length > 0) {
            logFields.stderr = stderr;
          }

          _log().log.debug(logFields, "executed");
        }

        resolve(stdout.toString());
      } else {
        let message = _chalk().default.red(removePassword(`Exit code: ${error.code}. ${error.message}`));

        if (stdout.length !== 0) {
          if (file.endsWith("wine")) {
            stdout = stdout.toString();
          }

          message += `\n${_chalk().default.yellow(stdout.toString())}`;
        }

        if (stderr.length !== 0) {
          if (file.endsWith("wine")) {
            stderr = stderr.toString();
          }

          message += `\n${_chalk().default.red(stderr.toString())}`;
        }

        reject(new Error(message));
      }
    });
  });
}

function logSpawn(command, args, options) {
  // use general debug.enabled to log spawn, because it doesn't produce a lot of output (the only line), but important in any case
  if (!_log().log.isDebugEnabled) {
    return;
  }

  const argsString = removePassword(args.join(" "));
  const logFields = {
    command: command + " " + (command === "docker" ? argsString : removePassword(argsString))
  };

  if (options != null && options.cwd != null) {
    logFields.cwd = options.cwd;
  }

  _log().log.debug(logFields, "spawning");
}

function doSpawn(command, args, options, extraOptions) {
  if (options == null) {
    options = {};
  }

  options.env = getProcessEnv(options.env);

  if (options.stdio == null) {
    const isDebugEnabled = _log().debug.enabled; // do not ignore stdout/stderr if not debug, because in this case we will read into buffer and print on error


    options.stdio = [extraOptions != null && extraOptions.isPipeInput ? "pipe" : "ignore", isDebugEnabled ? "inherit" : "pipe", isDebugEnabled ? "inherit" : "pipe"];
  }

  logSpawn(command, args, options);

  try {
    return (0, _child_process().spawn)(command, args, options);
  } catch (e) {
    throw new Error(`Cannot spawn ${command}: ${e.stack || e}`);
  }
}

function spawnAndWrite(command, args, data, options) {
  const childProcess = doSpawn(command, args, options, {
    isPipeInput: true
  });
  const timeout = setTimeout(() => childProcess.kill(), 4 * 60 * 1000);
  return new Promise((resolve, reject) => {
    handleProcess("close", childProcess, command, () => {
      try {
        clearTimeout(timeout);
      } finally {
        resolve();
      }
    }, error => {
      try {
        clearTimeout(timeout);
      } finally {
        reject(error.stack || error.toString());
      }
    });
    childProcess.stdin.end(data);
  });
}

function spawn(command, args, options, extraOptions) {
  return new Promise((resolve, reject) => {
    handleProcess("close", doSpawn(command, args || [], options, extraOptions), command, resolve, reject);
  });
}

function handleProcess(event, childProcess, command, resolve, reject) {
  childProcess.on("error", reject);
  let out = "";

  if (childProcess.stdout != null) {
    childProcess.stdout.on("data", data => {
      out += data;
    });
  }

  let errorOut = "";

  if (childProcess.stderr != null) {
    childProcess.stderr.on("data", data => {
      errorOut += data;
    });
  }

  childProcess.once(event, code => {
    if (_log().log.isDebugEnabled) {
      const fields = {
        command: path.basename(command),
        code,
        pid: childProcess.pid
      };

      if (out.length > 0) {
        fields.out = out;
      }

      _log().log.debug(fields, "exited");
    }

    if (code === 0) {
      if (resolve != null) {
        resolve(out);
      }
    } else {
      function formatOut(text, title) {
        return text.length === 0 ? "" : `\n${title}:\n${text}`;
      }

      reject(new Error(`${command} exited with code ${code}${formatOut(out, "Output")}${formatOut(errorOut, "Error output")}`));
    }
  });
}

function use(value, task) {
  return value == null ? null : task(value);
}

function isEmptyOrSpaces(s) {
  return s == null || s.trim().length === 0;
}

function isTokenCharValid(token) {
  return /^[\w\/=+-]+$/.test(token);
}

function addValue(map, key, value) {
  const list = map.get(key);

  if (list == null) {
    map.set(key, [value]);
  } else if (!list.includes(value)) {
    list.push(value);
  }
}

function replaceDefault(inList, defaultList) {
  if (inList == null || inList.length === 1 && inList[0] === "default") {
    return defaultList;
  }

  const index = inList.indexOf("default");

  if (index >= 0) {
    const list = inList.slice(0, index);
    list.push(...defaultList);

    if (index !== inList.length - 1) {
      list.push(...inList.slice(index + 1));
    }

    inList = list;
  }

  return inList;
}

function getPlatformIconFileName(value, isMac) {
  if (value === undefined) {
    return undefined;
  }

  if (value === null) {
    return null;
  }

  if (!value.includes(".")) {
    return `${value}.${isMac ? "icns" : "ico"}`;
  }

  return value.replace(isMac ? ".ico" : ".icns", isMac ? ".icns" : ".ico");
}

function isPullRequest() {
  // TRAVIS_PULL_REQUEST is set to the pull request number if the current job is a pull request build, or false if itâ€™s not.
  function isSet(value) {
    // value can be or null, or empty string
    return value && value !== "false";
  }

  return isSet(process.env.TRAVIS_PULL_REQUEST) || isSet(process.env.CI_PULL_REQUEST) || isSet(process.env.CI_PULL_REQUESTS) || isSet(process.env.BITRISE_PULL_REQUEST) || isSet(process.env.APPVEYOR_PULL_REQUEST_NUMBER);
}

function isEnvTrue(value) {
  if (value != null) {
    value = value.trim();
  }

  return value === "true" || value === "" || value === "1";
}

class InvalidConfigurationError extends Error {
  constructor(message, code = "ERR_ELECTRON_BUILDER_INVALID_CONFIGURATION") {
    super(message);
    this.code = code;
  }

}

exports.InvalidConfigurationError = InvalidConfigurationError;

function executeAppBuilder(args, childProcessConsumer, extraOptions = {}) {
  return new Promise((resolve, reject) => {
    const command = _appBuilderBin().appBuilderPath;

    const env = Object.assign({
      // before process.env to allow customize by user
      SNAP_USE_HARD_LINKS_IF_POSSIBLE: _isCi().default.toString()
    }, process.env, {
      SZA_PATH: _zipBin().path7za,
      FORCE_COLOR: _chalk().default.enabled ? "1" : "0"
    });
    const cacheEnv = process.env.ELECTRON_BUILDER_CACHE;

    if (cacheEnv != null && cacheEnv.length > 0) {
      env.ELECTRON_BUILDER_CACHE = path.resolve(cacheEnv);
    }

    if (extraOptions.env != null) {
      Object.assign(env, extraOptions.env);
    }

    const childProcess = doSpawn(command, args, Object.assign({}, extraOptions, {
      env,
      stdio: ["ignore", "pipe", process.stdout]
    }));

    if (childProcessConsumer != null) {
      childProcessConsumer(childProcess);
    }

    handleProcess("close", childProcess, command, resolve, reject);
  });
} 
// __ts-babel@6.0.4
//# sourceMappingURL=util.js.map{"version":3,"sources":["../src/util.ts"],"names":[],"mappings":"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","sourcesContent":["import { path7za } from \"7zip-bin\"\nimport { appBuilderPath } from \"app-builder-bin\"\nimport { safeStringifyJson } from \"builder-util-runtime\"\nimport chalk from \"chalk\"\nimport { ChildProcess, execFile, ExecFileOptions, spawn as _spawn, SpawnOptions } from \"child_process\"\nimport { createHash } from \"crypto\"\nimport _debug from \"debug\"\nimport { safeDump } from \"js-yaml\"\nimport * as path from \"path\"\nimport \"source-map-support/register\"\nimport { debug, log } from \"./log\"\nimport isCI from \"is-ci\"\n\nexport { safeStringifyJson } from \"builder-util-runtime\"\nexport { TmpDir } from \"temp-file\"\nexport { log, debug } from \"./log\"\nexport { Arch, getArchCliNames, toLinuxArchString, getArchSuffix, ArchType, archFromString } from \"./arch\"\nexport { AsyncTaskManager } from \"./asyncTaskManager\"\nexport { DebugLogger } from \"./DebugLogger\"\n\nexport { copyFile } from \"./fs\"\nexport { asArray } from \"builder-util-runtime\"\n\nexport { deepAssign } from \"./deepAssign\"\n\nexport const debug7z = _debug(\"electron-builder:7z\")\n\nexport function serializeToYaml(object: object, skipInvalid = false, noRefs = false) {\n  return safeDump(object, {\n    lineWidth: 8000,\n    skipInvalid,\n    noRefs,\n  })\n}\n\nexport function removePassword(input: string) {\n  return input.replace(/(-String |-P |pass:| \\/p |-pass |--secretKey |--accessKey )([^ ]+)/g, (match, p1, p2) => {\n    if (p1.trim() === \"/p\" && p2.startsWith(\"\\\\\\\\Mac\\\\Host\\\\\\\\\")) {\n      // appx /p\n      return `${p1}${p2}`\n    }\n    return `${p1}${createHash(\"sha256\").update(p2).digest(\"hex\")} (sha256 hash)`\n  })\n}\n\nfunction getProcessEnv(env: { [key: string]: string | undefined } | undefined | null): NodeJS.ProcessEnv | undefined {\n  if (process.platform === \"win32\") {\n    return env == null ? undefined : env\n  }\n\n  const finalEnv = {\n    ...(env || process.env)\n  }\n\n  // without LC_CTYPE dpkg can returns encoded unicode symbols\n  // set LC_CTYPE to avoid crash https://github.com/electron-userland/electron-builder/issues/503 Even \"en_DE.UTF-8\" leads to error.\n  const locale = process.platform === \"linux\" ? (process.env.LANG || \"C.UTF-8\") : \"en_US.UTF-8\"\n  finalEnv.LANG = locale\n  finalEnv.LC_CTYPE = locale\n  finalEnv.LC_ALL = locale\n  return finalEnv\n}\n\nexport function exec(file: string, args?: Array<string> | null, options?: ExecFileOptions, isLogOutIfDebug = true): Promise<string> {\n  if (log.isDebugEnabled) {\n    const logFields: any = {\n      file,\n      args: args == null ? \"\" : removePassword(args.join(\" \")),\n    }\n    if (options != null) {\n      if (options.cwd != null) {\n        logFields.cwd = options.cwd\n      }\n\n      if (options.env != null) {\n        const diffEnv = {...options.env}\n        for (const name of Object.keys(process.env)) {\n          if (process.env[name] === options.env[name]) {\n            delete diffEnv[name]\n          }\n        }\n        logFields.env = safeStringifyJson(diffEnv)\n      }\n    }\n\n    log.debug(logFields, \"executing\")\n  }\n\n  return new Promise<string>((resolve, reject) => {\n    execFile(file, args, {\n    ...options,\n    maxBuffer: 1000 * 1024 * 1024,\n    env: getProcessEnv(options == null ? null : options.env),\n  }, (error, stdout, stderr) => {\n      if (error == null) {\n        if (isLogOutIfDebug && log.isDebugEnabled) {\n          const logFields: any = {\n            file,\n          }\n          if (stdout.length > 0) {\n            logFields.stdout = stdout\n          }\n          if (stderr.length > 0) {\n            logFields.stderr = stderr\n          }\n\n          log.debug(logFields, \"executed\")\n        }\n        resolve(stdout.toString())\n      }\n      else {\n        let message = chalk.red(removePassword(`Exit code: ${(error as any).code}. ${error.message}`))\n        if (stdout.length !== 0) {\n          if (file.endsWith(\"wine\")) {\n            stdout = stdout.toString()\n          }\n          message += `\\n${chalk.yellow(stdout.toString())}`\n        }\n        if (stderr.length !== 0) {\n          if (file.endsWith(\"wine\")) {\n            stderr = stderr.toString()\n          }\n          message += `\\n${chalk.red(stderr.toString())}`\n        }\n\n        reject(new Error(message))\n      }\n    })\n  })\n}\n\nexport interface ExtraSpawnOptions {\n  isPipeInput?: boolean\n}\n\nfunction logSpawn(command: string, args: Array<string>, options: SpawnOptions) {\n  // use general debug.enabled to log spawn, because it doesn't produce a lot of output (the only line), but important in any case\n  if (!log.isDebugEnabled) {\n    return\n  }\n\n  const argsString = removePassword(args.join(\" \"))\n  const logFields: any = {\n    command: command + \" \" + (command === \"docker\" ? argsString : removePassword(argsString)),\n  }\n  if (options != null && options.cwd != null) {\n    logFields.cwd = options.cwd\n  }\n  log.debug(logFields, \"spawning\")\n}\n\nexport function doSpawn(command: string, args: Array<string>, options?: SpawnOptions, extraOptions?: ExtraSpawnOptions): ChildProcess {\n  if (options == null) {\n    options = {}\n  }\n\n  options.env = getProcessEnv(options.env)\n\n  if (options.stdio == null) {\n    const isDebugEnabled = debug.enabled\n    // do not ignore stdout/stderr if not debug, because in this case we will read into buffer and print on error\n    options.stdio = [extraOptions != null && extraOptions.isPipeInput ? \"pipe\" : \"ignore\", isDebugEnabled ? \"inherit\" : \"pipe\", isDebugEnabled ? \"inherit\" : \"pipe\"] as any\n  }\n\n  logSpawn(command, args, options)\n  try {\n    return _spawn(command, args, options)\n  }\n  catch (e) {\n    throw new Error(`Cannot spawn ${command}: ${e.stack || e}`)\n  }\n}\n\nexport function spawnAndWrite(command: string, args: Array<string>, data: string, options?: SpawnOptions) {\n  const childProcess = doSpawn(command, args, options, {isPipeInput: true})\n  const timeout = setTimeout(() => childProcess.kill(), 4 * 60 * 1000)\n  return new Promise<any>((resolve, reject) => {\n    handleProcess(\"close\", childProcess, command, () => {\n      try {\n        clearTimeout(timeout)\n      }\n      finally {\n        resolve()\n      }\n    }, error => {\n      try {\n        clearTimeout(timeout)\n      }\n      finally {\n        reject(error.stack || error.toString())\n      }\n    })\n\n    childProcess.stdin!!.end(data)\n  })\n}\n\nexport function spawn(command: string, args?: Array<string> | null, options?: SpawnOptions, extraOptions?: ExtraSpawnOptions): Promise<any> {\n  return new Promise<any>((resolve, reject) => {\n    handleProcess(\"close\", doSpawn(command, args || [], options, extraOptions), command, resolve, reject)\n  })\n}\n\nfunction handleProcess(event: string, childProcess: ChildProcess, command: string, resolve: ((value?: any) => void) | null, reject: (reason?: any) => void) {\n  childProcess.on(\"error\", reject)\n\n  let out = \"\"\n  if (childProcess.stdout != null) {\n    childProcess.stdout.on(\"data\", (data: string) => {\n      out += data\n    })\n  }\n\n  let errorOut = \"\"\n  if (childProcess.stderr != null) {\n    childProcess.stderr.on(\"data\", (data: string) => {\n      errorOut += data\n    })\n  }\n\n  childProcess.once(event, (code: number) => {\n    if (log.isDebugEnabled) {\n      const fields: any = {\n        command: path.basename(command),\n        code,\n        pid: childProcess.pid,\n      }\n      if (out.length > 0) {\n        fields.out = out\n      }\n      log.debug(fields, \"exited\")\n    }\n\n    if (code === 0) {\n      if (resolve != null) {\n        resolve(out)\n      }\n    }\n    else {\n      function formatOut(text: string, title: string) {\n        return text.length === 0 ? \"\" : `\\n${title}:\\n${text}`\n      }\n\n      reject(new Error(`${command} exited with code ${code}${formatOut(out, \"Output\")}${formatOut(errorOut, \"Error output\")}`))\n    }\n  })\n}\n\nexport function use<T, R>(value: T | null, task: (it: T) => R): R | null {\n  return value == null ? null : task(value)\n}\n\nexport function isEmptyOrSpaces(s: string | null | undefined): s is \"\" | null | undefined {\n  return s == null || s.trim().length === 0\n}\n\nexport function isTokenCharValid(token: string) {\n  return /^[\\w\\/=+-]+$/.test(token)\n}\n\nexport function addValue<K, T>(map: Map<K, Array<T>>, key: K, value: T) {\n  const list = map.get(key)\n  if (list == null) {\n    map.set(key, [value])\n  }\n  else if (!list.includes(value)) {\n    list.push(value)\n  }\n}\n\nexport function replaceDefault(inList: Array<string> | null | undefined, defaultList: Array<string>): Array<string> {\n  if (inList == null || (inList.length === 1 && inList[0] === \"default\")) {\n    return defaultList\n  }\n\n  const index = inList.indexOf(\"default\")\n  if (index >= 0) {\n    const list = inList.slice(0, index)\n    list.push(...defaultList)\n    if (index !== (inList.length - 1)) {\n      list.push(...inList.slice(index + 1))\n    }\n    inList = list\n  }\n  return inList\n}\n\nexport function getPlatformIconFileName(value: string | null | undefined, isMac: boolean) {\n  if (value === undefined) {\n    return undefined\n  }\n  if (value === null) {\n    return null\n  }\n\n  if (!value.includes(\".\")) {\n    return `${value}.${isMac ? \"icns\" : \"ico\"}`\n  }\n\n  return value.replace(isMac ? \".ico\" : \".icns\", isMac ? \".icns\" : \".ico\")\n}\n\nexport function isPullRequest() {\n  // TRAVIS_PULL_REQUEST is set to the pull request number if the current job is a pull request build, or false if itâ€™s not.\n  function isSet(value: string | undefined) {\n    // value can be or null, or empty string\n    return value && value !== \"false\"\n  }\n\n  return isSet(process.env.TRAVIS_PULL_REQUEST) || isSet(process.env.CI_PULL_REQUEST) || isSet(process.env.CI_PULL_REQUESTS) || isSet(process.env.BITRISE_PULL_REQUEST) || isSet(process.env.APPVEYOR_PULL_REQUEST_NUMBER)\n}\n\nexport function isEnvTrue(value: string | null | undefined) {\n  if (value != null) {\n    value = value.trim()\n  }\n  return value === \"true\" || value === \"\" || value === \"1\"\n}\n\nexport class InvalidConfigurationError extends Error {\n  constructor(message: string, code: string = \"ERR_ELECTRON_BUILDER_INVALID_CONFIGURATION\") {\n    super(message);\n\n    (this as NodeJS.ErrnoException).code = code\n  }\n}\n\nexport function executeAppBuilder(args: Array<string>, childProcessConsumer?: (childProcess: ChildProcess) => void, extraOptions: ExecFileOptions = {}): Promise<string> {\n  return new Promise<string>((resolve, reject) => {\n    const command = appBuilderPath\n    const env: any = {\n      // before process.env to allow customize by user\n      SNAP_USE_HARD_LINKS_IF_POSSIBLE: isCI.toString(),\n      ...process.env,\n      SZA_PATH: path7za,\n      FORCE_COLOR: chalk.enabled ? \"1\" : \"0\",\n    }\n    const cacheEnv = process.env.ELECTRON_BUILDER_CACHE\n    if (cacheEnv != null && cacheEnv.length > 0) {\n      env.ELECTRON_BUILDER_CACHE = path.resolve(cacheEnv)\n    }\n\n    if (extraOptions.env != null) {\n      Object.assign(env, extraOptions.env)\n    }\n\n    const childProcess = doSpawn(command, args, {\n      ...extraOptions,\n      env,\n      stdio: [\"ignore\", \"pipe\", process.stdout]\n    })\n    if (childProcessConsumer != null) {\n      childProcessConsumer(childProcess)\n    }\n    handleProcess(\"close\", childProcess, command, resolve, reject)\n  })\n}\n"],"sourceRoot":""}
{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "bluebird-lst": "^1.0.9",
    "debug": "^4.1.1",
    "fs-extra-p": "^8.0.2",
    "sax": "^1.2.4"
  },
  "deprecated": false,
  "description": "HTTP utilities. Used by [electron-builder](https://github.com/electron-userland/electron-builder).",
  "engines": {
    "node": ">=6.0.0"
  },
  "files": [
    "out"
  ],
  "homepage": "https://github.com/electron-userland/electron-builder",
  "license": "MIT",
  "main": "out/index.js",
  "name": "builder-util-runtime",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-builder.git"
  },
  "types": "./out/index.d.ts",
  "version": "8.2.5"
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CancellationError = exports.CancellationToken = void 0;

function _events() {
  const data = require("events");

  _events = function () {
    return data;
  };

  return data;
}

class CancellationToken extends _events().EventEmitter {
  // babel cannot compile ... correctly for super calls
  constructor(parent) {
    super();
    this.parentCancelHandler = null;
    this._parent = null;
    this._cancelled = false;

    if (parent != null) {
      this.parent = parent;
    }
  }

  get cancelled() {
    return this._cancelled || this._parent != null && this._parent.cancelled;
  }

  set parent(value) {
    this.removeParentCancelHandler();
    this._parent = value;

    this.parentCancelHandler = () => this.cancel();

    this._parent.onCancel(this.parentCancelHandler);
  }

  cancel() {
    this._cancelled = true;
    this.emit("cancel");
  }

  onCancel(handler) {
    if (this.cancelled) {
      handler();
    } else {
      this.once("cancel", handler);
    }
  }

  createPromise(callback) {
    if (this.cancelled) {
      return Promise.reject(new CancellationError());
    }

    const finallyHandler = () => {
      if (cancelHandler != null) {
        try {
          this.removeListener("cancel", cancelHandler);
          cancelHandler = null;
        } catch (ignore) {// ignore
        }
      }
    };

    let cancelHandler = null;
    return new Promise((resolve, reject) => {
      let addedCancelHandler = null;

      cancelHandler = () => {
        try {
          if (addedCancelHandler != null) {
            addedCancelHandler();
            addedCancelHandler = null;
          }
        } finally {
          reject(new CancellationError());
        }
      };

      if (this.cancelled) {
        cancelHandler();
        return;
      }

      this.onCancel(cancelHandler);
      callback(resolve, reject, callback => {
        addedCancelHandler = callback;
      });
    }).then(it => {
      finallyHandler();
      return it;
    }).catch(e => {
      finallyHandler();
      throw e;
    });
  }

  removeParentCancelHandler() {
    const parent = this._parent;

    if (parent != null && this.parentCancelHandler != null) {
      parent.removeListener("cancel", this.parentCancelHandler);
      this.parentCancelHandler = null;
    }
  }

  dispose() {
    try {
      this.removeParentCancelHandler();
    } finally {
      this.removeAllListeners();
      this._parent = null;
    }
  }

}

exports.CancellationToken = CancellationToken;

class CancellationError extends Error {
  constructor() {
    super("Cancelled");
  }

} exports.CancellationError = CancellationError;
// __ts-babel@6.0.4
//# sourceMappingURL=CancellationToken.js.map{"version":3,"sources":["../src/CancellationToken.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from \"events\"\n\nexport class CancellationToken extends EventEmitter {\n  private parentCancelHandler: (() => any) | null = null\n\n  private _cancelled: boolean\n  get cancelled(): boolean {\n    return this._cancelled || (this._parent != null && this._parent.cancelled)\n  }\n\n  private _parent: CancellationToken | null = null\n  set parent(value: CancellationToken) {\n    this.removeParentCancelHandler()\n\n    this._parent = value\n    this.parentCancelHandler = () => this.cancel()\n    this._parent.onCancel(this.parentCancelHandler)\n  }\n\n  // babel cannot compile ... correctly for super calls\n  constructor(parent?: CancellationToken) {\n    super()\n\n    this._cancelled = false\n    if (parent != null) {\n      this.parent = parent\n    }\n  }\n\n  cancel() {\n    this._cancelled = true\n    this.emit(\"cancel\")\n  }\n\n  private onCancel(handler: () => any) {\n    if (this.cancelled) {\n      handler()\n    }\n    else {\n      this.once(\"cancel\", handler)\n    }\n  }\n\n  createPromise<R>(callback: (resolve: (thenableOrResult?: R) => void, reject: (error: Error) => void, onCancel: (callback: () => void) => void) => void): Promise<R> {\n    if (this.cancelled) {\n      return Promise.reject<R>(new CancellationError())\n    }\n\n    const finallyHandler = () => {\n      if (cancelHandler != null) {\n        try {\n          this.removeListener(\"cancel\", cancelHandler)\n          cancelHandler = null\n        }\n        catch (ignore) {\n          // ignore\n        }\n      }\n    }\n\n    let cancelHandler: (() => void) | null = null\n    return new Promise<R>((resolve, reject) => {\n      let addedCancelHandler: (() => void) | null = null\n\n      cancelHandler = () => {\n        try {\n          if (addedCancelHandler != null) {\n            addedCancelHandler()\n            addedCancelHandler = null\n          }\n        }\n        finally {\n          reject(new CancellationError())\n        }\n      }\n\n      if (this.cancelled) {\n        cancelHandler()\n        return\n      }\n\n      this.onCancel(cancelHandler)\n\n      callback(resolve, reject, (callback: () => void) => {\n        addedCancelHandler = callback\n      })\n    })\n      .then(it => {\n        finallyHandler()\n        return it\n      })\n      .catch(e => {\n        finallyHandler()\n        throw e\n      })\n  }\n\n  private removeParentCancelHandler() {\n    const parent = this._parent\n    if (parent != null && this.parentCancelHandler != null) {\n      parent.removeListener(\"cancel\", this.parentCancelHandler)\n      this.parentCancelHandler = null\n    }\n  }\n\n  dispose() {\n    try {\n      this.removeParentCancelHandler()\n    }\n    finally {\n      this.removeAllListeners()\n      this._parent = null\n    }\n  }\n}\n\nexport class CancellationError extends Error {\n  constructor() {\n    super(\"Cancelled\")\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ProgressCallbackTransform = void 0;

function _stream() {
  const data = require("stream");

  _stream = function () {
    return data;
  };

  return data;
}

class ProgressCallbackTransform extends _stream().Transform {
  constructor(total, cancellationToken, onProgress) {
    super();
    this.total = total;
    this.cancellationToken = cancellationToken;
    this.onProgress = onProgress;
    this.start = Date.now();
    this.transferred = 0;
    this.delta = 0;
    this.nextUpdate = this.start + 1000;
  }

  _transform(chunk, encoding, callback) {
    if (this.cancellationToken.cancelled) {
      callback(new Error("Cancelled"), null);
      return;
    }

    this.transferred += chunk.length;
    this.delta += chunk.length;
    const now = Date.now();

    if (now >= this.nextUpdate && this.transferred !== this.total
    /* will be emitted on _flush */
    ) {
        this.nextUpdate = now + 1000;
        this.onProgress({
          total: this.total,
          delta: this.delta,
          transferred: this.transferred,
          percent: this.transferred / this.total * 100,
          bytesPerSecond: Math.round(this.transferred / ((now - this.start) / 1000))
        });
        this.delta = 0;
      }

    callback(null, chunk);
  }

  _flush(callback) {
    if (this.cancellationToken.cancelled) {
      callback(new Error("Cancelled"));
      return;
    }

    this.onProgress({
      total: this.total,
      delta: this.delta,
      transferred: this.total,
      percent: 100,
      bytesPerSecond: Math.round(this.transferred / ((Date.now() - this.start) / 1000))
    });
    this.delta = 0;
    callback(null);
  }

} exports.ProgressCallbackTransform = ProgressCallbackTransform;
// __ts-babel@6.0.4
//# sourceMappingURL=ProgressCallbackTransform.js.map{"version":3,"sources":["../src/ProgressCallbackTransform.ts"],"names":[],"mappings":";;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAWM,MAAO,yBAAP,SAAyC,mBAAzC,CAAkD;AAOtD,EAAA,WAAA,CAA6B,KAA7B,EAA6D,iBAA7D,EAAoH,UAApH,EAA2J;AACzJ;AAD2B,SAAA,KAAA,GAAA,KAAA;AAAgC,SAAA,iBAAA,GAAA,iBAAA;AAAuD,SAAA,UAAA,GAAA,UAAA;AAN5G,SAAA,KAAA,GAAQ,IAAI,CAAC,GAAL,EAAR;AACA,SAAA,WAAA,GAAc,CAAd;AACA,SAAA,KAAA,GAAQ,CAAR;AAEA,SAAA,UAAA,GAAa,KAAK,KAAL,GAAa,IAA1B;AAIP;;AAED,EAAA,UAAU,CAAC,KAAD,EAAa,QAAb,EAA+B,QAA/B,EAA4C;AACpD,QAAI,KAAK,iBAAL,CAAuB,SAA3B,EAAsC;AACpC,MAAA,QAAQ,CAAC,IAAI,KAAJ,CAAU,WAAV,CAAD,EAAyB,IAAzB,CAAR;AACA;AACD;;AAED,SAAK,WAAL,IAAoB,KAAK,CAAC,MAA1B;AACA,SAAK,KAAL,IAAc,KAAK,CAAC,MAApB;AAEA,UAAM,GAAG,GAAG,IAAI,CAAC,GAAL,EAAZ;;AACA,QAAI,GAAG,IAAI,KAAK,UAAZ,IAA0B,KAAK,WAAL,KAAqB,KAAK;AAAM;AAA9D,MAA+F;AAC7F,aAAK,UAAL,GAAkB,GAAG,GAAG,IAAxB;AAEA,aAAK,UAAL,CAAgB;AACd,UAAA,KAAK,EAAE,KAAK,KADE;AAEd,UAAA,KAAK,EAAE,KAAK,KAFE;AAGd,UAAA,WAAW,EAAE,KAAK,WAHJ;AAId,UAAA,OAAO,EAAG,KAAK,WAAL,GAAmB,KAAK,KAAzB,GAAkC,GAJ7B;AAKd,UAAA,cAAc,EAAE,IAAI,CAAC,KAAL,CAAW,KAAK,WAAL,IAAoB,CAAC,GAAG,GAAG,KAAK,KAAZ,IAAqB,IAAzC,CAAX;AALF,SAAhB;AAOA,aAAK,KAAL,GAAa,CAAb;AACD;;AAED,IAAA,QAAQ,CAAC,IAAD,EAAO,KAAP,CAAR;AACD;;AAED,EAAA,MAAM,CAAC,QAAD,EAAc;AAClB,QAAI,KAAK,iBAAL,CAAuB,SAA3B,EAAsC;AACpC,MAAA,QAAQ,CAAC,IAAI,KAAJ,CAAU,WAAV,CAAD,CAAR;AACA;AACD;;AAED,SAAK,UAAL,CAAgB;AACd,MAAA,KAAK,EAAE,KAAK,KADE;AAEd,MAAA,KAAK,EAAE,KAAK,KAFE;AAGd,MAAA,WAAW,EAAE,KAAK,KAHJ;AAId,MAAA,OAAO,EAAE,GAJK;AAKd,MAAA,cAAc,EAAE,IAAI,CAAC,KAAL,CAAW,KAAK,WAAL,IAAoB,CAAC,IAAI,CAAC,GAAL,KAAa,KAAK,KAAnB,IAA4B,IAAhD,CAAX;AALF,KAAhB;AAOA,SAAK,KAAL,GAAa,CAAb;AAEA,IAAA,QAAQ,CAAC,IAAD,CAAR;AACD;;AArDqD,C","sourcesContent":["import { Transform } from \"stream\"\nimport { CancellationToken } from \"./CancellationToken\"\n\nexport interface ProgressInfo {\n  total: number\n  delta: number\n  transferred: number\n  percent: number\n  bytesPerSecond: number\n}\n\nexport class ProgressCallbackTransform extends Transform {\n  private start = Date.now()\n  private transferred = 0\n  private delta = 0\n\n  private nextUpdate = this.start + 1000\n\n  constructor(private readonly total: number, private readonly cancellationToken: CancellationToken, private readonly onProgress: (info: ProgressInfo) => any) {\n    super()\n  }\n\n  _transform(chunk: any, encoding: string, callback: any) {\n    if (this.cancellationToken.cancelled) {\n      callback(new Error(\"Cancelled\"), null)\n      return\n    }\n\n    this.transferred += chunk.length\n    this.delta += chunk.length\n\n    const now = Date.now()\n    if (now >= this.nextUpdate && this.transferred !== this.total /* will be emitted on _flush */) {\n      this.nextUpdate = now + 1000\n\n      this.onProgress({\n        total: this.total,\n        delta: this.delta,\n        transferred: this.transferred,\n        percent: (this.transferred / this.total) * 100,\n        bytesPerSecond: Math.round(this.transferred / ((now - this.start) / 1000))\n      })\n      this.delta = 0\n    }\n\n    callback(null, chunk)\n  }\n\n  _flush(callback: any): void {\n    if (this.cancellationToken.cancelled) {\n      callback(new Error(\"Cancelled\"))\n      return\n    }\n\n    this.onProgress({\n      total: this.total,\n      delta: this.delta,\n      transferred: this.total,\n      percent: 100,\n      bytesPerSecond: Math.round(this.transferred / ((Date.now() - this.start) / 1000))\n    })\n    this.delta = 0\n\n    callback(null)\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.BintrayClient = void 0;

function _httpExecutor() {
  const data = require("./httpExecutor");

  _httpExecutor = function () {
    return data;
  };

  return data;
}

class BintrayClient {
  constructor(options, httpExecutor, cancellationToken, apiKey) {
    this.httpExecutor = httpExecutor;
    this.cancellationToken = cancellationToken;
    this.requestHeaders = null;

    if (options.owner == null) {
      throw new Error("owner is not specified");
    }

    if (options.package == null) {
      throw new Error("package is not specified");
    }

    this.repo = options.repo || "generic";
    this.packageName = options.package;
    this.owner = options.owner;
    this.user = options.user || options.owner;
    this.component = options.component || null;
    this.distribution = options.distribution || "stable";
    this.auth = apiKey == null ? null : `Basic ${Buffer.from(`${this.user}:${apiKey}`).toString("base64")}`;
    this.basePath = `/packages/${this.owner}/${this.repo}/${this.packageName}`;
  }

  setRequestHeaders(value) {
    this.requestHeaders = value;
  }

  bintrayRequest(path, auth, data = null, cancellationToken, method) {
    return (0, _httpExecutor().parseJson)(this.httpExecutor.request((0, _httpExecutor().configureRequestOptions)({
      hostname: "api.bintray.com",
      path,
      headers: this.requestHeaders || undefined
    }, auth, method), cancellationToken, data));
  }

  getVersion(version) {
    return this.bintrayRequest(`${this.basePath}/versions/${version}`, this.auth, null, this.cancellationToken);
  }

  getVersionFiles(version) {
    return this.bintrayRequest(`${this.basePath}/versions/${version}/files`, this.auth, null, this.cancellationToken);
  }

  createVersion(version) {
    return this.bintrayRequest(`${this.basePath}/versions`, this.auth, {
      name: version
    }, this.cancellationToken);
  }

  deleteVersion(version) {
    return this.bintrayRequest(`${this.basePath}/versions/${version}`, this.auth, null, this.cancellationToken, "DELETE");
  }

} exports.BintrayClient = BintrayClient;
// __ts-babel@6.0.4
//# sourceMappingURL=bintray.js.map{"version":3,"sources":["../src/bintray.ts"],"names":[],"mappings":";;;;;;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAiBM,MAAO,aAAP,CAAoB;AAiBxB,EAAA,WAAA,CAAY,OAAZ,EAAsD,YAAtD,EAAwG,iBAAxG,EAA8I,MAA9I,EAAoK;AAA9G,SAAA,YAAA,GAAA,YAAA;AAAkD,SAAA,iBAAA,GAAA,iBAAA;AANhG,SAAA,cAAA,GAAwC,IAAxC;;AAON,QAAI,OAAO,CAAC,KAAR,IAAiB,IAArB,EAA2B;AACzB,YAAM,IAAI,KAAJ,CAAU,wBAAV,CAAN;AACD;;AACD,QAAI,OAAO,CAAC,OAAR,IAAmB,IAAvB,EAA6B;AAC3B,YAAM,IAAI,KAAJ,CAAU,0BAAV,CAAN;AACD;;AAED,SAAK,IAAL,GAAY,OAAO,CAAC,IAAR,IAAgB,SAA5B;AACA,SAAK,WAAL,GAAmB,OAAO,CAAC,OAA3B;AACA,SAAK,KAAL,GAAa,OAAO,CAAC,KAArB;AACA,SAAK,IAAL,GAAY,OAAO,CAAC,IAAR,IAAgB,OAAO,CAAC,KAApC;AACA,SAAK,SAAL,GAAiB,OAAO,CAAC,SAAR,IAAqB,IAAtC;AACA,SAAK,YAAL,GAAoB,OAAO,CAAC,YAAR,IAAwB,QAA5C;AACA,SAAK,IAAL,GAAY,MAAM,IAAI,IAAV,GAAiB,IAAjB,GAAwB,SAAS,MAAM,CAAC,IAAP,CAAY,GAAG,KAAK,IAAI,IAAI,MAAM,EAAlC,EAAsC,QAAtC,CAA+C,QAA/C,CAAwD,EAArG;AACA,SAAK,QAAL,GAAgB,aAAa,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,KAAK,WAAW,EAAxE;AACD;;AApBD,EAAA,iBAAiB,CAAC,KAAD,EAA6B;AAC5C,SAAK,cAAL,GAAsB,KAAtB;AACD;;AAoBO,EAAA,cAAc,CAAI,IAAJ,EAAkB,IAAlB,EAAuC,IAAA,GAAuC,IAA9E,EAAoF,iBAApF,EAA0H,MAA1H,EAA2J;AAC/K,WAAO,+BAAU,KAAK,YAAL,CAAkB,OAAlB,CAA0B,6CAAwB;AAAC,MAAA,QAAQ,EAAE,iBAAX;AAA8B,MAAA,IAA9B;AAAoC,MAAA,OAAO,EAAE,KAAK,cAAL,IAAuB;AAApE,KAAxB,EAAwG,IAAxG,EAA8G,MAA9G,CAA1B,EAAiJ,iBAAjJ,EAAoK,IAApK,CAAV,CAAP;AACD;;AAED,EAAA,UAAU,CAAC,OAAD,EAAgB;AACxB,WAAO,KAAK,cAAL,CAAoB,GAAG,KAAK,QAAQ,aAAa,OAAO,EAAxD,EAA4D,KAAK,IAAjE,EAAuE,IAAvE,EAA6E,KAAK,iBAAlF,CAAP;AACD;;AAED,EAAA,eAAe,CAAC,OAAD,EAAgB;AAC7B,WAAO,KAAK,cAAL,CAAiC,GAAG,KAAK,QAAQ,aAAa,OAAO,QAArE,EAA+E,KAAK,IAApF,EAA0F,IAA1F,EAAgG,KAAK,iBAArG,CAAP;AACD;;AAED,EAAA,aAAa,CAAC,OAAD,EAAgB;AAC3B,WAAO,KAAK,cAAL,CAA6B,GAAG,KAAK,QAAQ,WAA7C,EAA0D,KAAK,IAA/D,EAAqE;AAC1E,MAAA,IAAI,EAAE;AADoE,KAArE,EAEJ,KAAK,iBAFD,CAAP;AAGD;;AAED,EAAA,aAAa,CAAC,OAAD,EAAgB;AAC3B,WAAO,KAAK,cAAL,CAAoB,GAAG,KAAK,QAAQ,aAAa,OAAO,EAAxD,EAA4D,KAAK,IAAjE,EAAuE,IAAvE,EAA6E,KAAK,iBAAlF,EAAqG,QAArG,CAAP;AACD;;AAvDuB,C","sourcesContent":["import { CancellationToken } from \"./CancellationToken\"\nimport { configureRequestOptions, HttpExecutor, parseJson, RequestHeaders } from \"./httpExecutor\"\nimport { BintrayOptions } from \"./publishOptions\"\n\nexport interface Version {\n  readonly name: string\n  //noinspection ReservedWordAsName\n  readonly package: string\n}\n\nexport interface File {\n  name: string\n  path: string\n\n  sha1: string\n  sha256: string\n}\n\nexport class BintrayClient {\n  private readonly basePath: string\n  readonly auth: string | null\n  readonly repo: string\n\n  readonly owner: string\n  readonly user: string\n  readonly component: string | null\n  readonly distribution: string | null\n  readonly packageName: string\n\n  private requestHeaders: RequestHeaders | null = null\n\n  setRequestHeaders(value: RequestHeaders | null) {\n    this.requestHeaders = value\n  }\n\n  constructor(options: BintrayOptions, private readonly httpExecutor: HttpExecutor<any>, private readonly cancellationToken: CancellationToken, apiKey?: string | null) {\n    if (options.owner == null) {\n      throw new Error(\"owner is not specified\")\n    }\n    if (options.package == null) {\n      throw new Error(\"package is not specified\")\n    }\n\n    this.repo = options.repo || \"generic\"\n    this.packageName = options.package\n    this.owner = options.owner\n    this.user = options.user || options.owner\n    this.component = options.component || null\n    this.distribution = options.distribution || \"stable\"\n    this.auth = apiKey == null ? null : `Basic ${Buffer.from(`${this.user}:${apiKey}`).toString(\"base64\")}`\n    this.basePath = `/packages/${this.owner}/${this.repo}/${this.packageName}`\n  }\n\n  private bintrayRequest<T>(path: string, auth: string | null, data: {[name: string]: any; } | null = null, cancellationToken: CancellationToken, method?: \"GET\" | \"DELETE\" | \"PUT\"): Promise<T> {\n    return parseJson(this.httpExecutor.request(configureRequestOptions({hostname: \"api.bintray.com\", path, headers: this.requestHeaders || undefined}, auth, method), cancellationToken, data))\n  }\n\n  getVersion(version: string): Promise<Version> {\n    return this.bintrayRequest(`${this.basePath}/versions/${version}`, this.auth, null, this.cancellationToken)\n  }\n\n  getVersionFiles(version: string): Promise<Array<File>> {\n    return this.bintrayRequest<Array<File>>(`${this.basePath}/versions/${version}/files`, this.auth, null, this.cancellationToken)\n  }\n\n  createVersion(version: string): Promise<any> {\n    return this.bintrayRequest<Version>(`${this.basePath}/versions`, this.auth, {\n      name: version,\n    }, this.cancellationToken)\n  }\n\n  deleteVersion(version: string): Promise<any> {\n    return this.bintrayRequest(`${this.basePath}/versions/${version}`, this.auth, null, this.cancellationToken, \"DELETE\")\n  }\n}"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=blockMapApi.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createHttpError = createHttpError;
exports.parseJson = parseJson;
exports.configureRequestOptionsFromUrl = configureRequestOptionsFromUrl;
exports.configureRequestUrl = configureRequestUrl;
exports.safeGetHeader = safeGetHeader;
exports.configureRequestOptions = configureRequestOptions;
exports.safeStringifyJson = safeStringifyJson;
exports.DigestTransform = exports.HttpExecutor = exports.HttpError = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

var _debug2 = _interopRequireDefault(require("debug"));

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _stream() {
  const data = require("stream");

  _stream = function () {
    return data;
  };

  return data;
}

function _url() {
  const data = require("url");

  _url = function () {
    return data;
  };

  return data;
}

function _CancellationToken() {
  const data = require("./CancellationToken");

  _CancellationToken = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("./index");

  _index = function () {
    return data;
  };

  return data;
}

function _ProgressCallbackTransform() {
  const data = require("./ProgressCallbackTransform");

  _ProgressCallbackTransform = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const debug = (0, _debug2.default)("electron-builder");

function createHttpError(response, description = null) {
  return new HttpError(response.statusCode || -1, `${response.statusCode} ${response.statusMessage}` + (description == null ? "" : "\n" + JSON.stringify(description, null, "  ")) + "\nHeaders: " + safeStringifyJson(response.headers), description);
}

const HTTP_STATUS_CODES = new Map([[429, "Too many requests"], [400, "Bad request"], [403, "Forbidden"], [404, "Not found"], [405, "Method not allowed"], [406, "Not acceptable"], [408, "Request timeout"], [413, "Request entity too large"], [500, "Internal server error"], [502, "Bad gateway"], [503, "Service unavailable"], [504, "Gateway timeout"], [505, "HTTP version not supported"]]);

class HttpError extends Error {
  constructor(statusCode, message = `HTTP error: ${HTTP_STATUS_CODES.get(statusCode) || statusCode}`, description = null) {
    super(message);
    this.statusCode = statusCode;
    this.description = description;
    this.name = "HttpError";
  }

}

exports.HttpError = HttpError;

function parseJson(result) {
  return result.then(it => it == null || it.length === 0 ? null : JSON.parse(it));
}

class HttpExecutor {
  constructor() {
    this.maxRedirects = 10;
  }

  request(options, cancellationToken = new (_CancellationToken().CancellationToken)(), data) {
    configureRequestOptions(options);
    const encodedData = data == null ? undefined : Buffer.from(JSON.stringify(data));

    if (encodedData != null) {
      options.method = "post";
      options.headers["Content-Type"] = "application/json";
      options.headers["Content-Length"] = encodedData.length;
    }

    return this.doApiRequest(options, cancellationToken, it => {
      it.end(encodedData);
    });
  }

  doApiRequest(options, cancellationToken, requestProcessor, redirectCount = 0) {
    if (debug.enabled) {
      debug(`Request: ${safeStringifyJson(options)}`);
    }

    return cancellationToken.createPromise((resolve, reject, onCancel) => {
      const request = this.createRequest(options, response => {
        try {
          this.handleResponse(response, options, cancellationToken, resolve, reject, redirectCount, requestProcessor);
        } catch (e) {
          reject(e);
        }
      });
      this.addErrorAndTimeoutHandlers(request, reject);
      this.addRedirectHandlers(request, options, reject, redirectCount, options => {
        this.doApiRequest(options, cancellationToken, requestProcessor, redirectCount).then(resolve).catch(reject);
      });
      requestProcessor(request, reject);
      onCancel(() => request.abort());
    });
  } // noinspection JSUnusedLocalSymbols


  addRedirectHandlers(request, options, reject, redirectCount, handler) {// not required for NodeJS
  }

  addErrorAndTimeoutHandlers(request, reject) {
    this.addTimeOutHandler(request, reject);
    request.on("error", reject);
    request.on("aborted", () => {
      reject(new Error("Request has been aborted by the server"));
    });
  }

  handleResponse(response, options, cancellationToken, resolve, reject, redirectCount, requestProcessor) {
    if (debug.enabled) {
      debug(`Response: ${response.statusCode} ${response.statusMessage}, request options: ${safeStringifyJson(options)}`);
    } // we handle any other >= 400 error on request end (read detailed message in the response body)


    if (response.statusCode === 404) {
      // error is clear, we don't need to read detailed error description
      reject(createHttpError(response, `method: ${options.method || "GET"} url: ${options.protocol || "https:"}//${options.hostname}${options.port ? `:${options.port}` : ""}${options.path}

Please double check that your authentication token is correct. Due to security reasons actual status maybe not reported, but 404.
`));
      return;
    } else if (response.statusCode === 204) {
      // on DELETE request
      resolve();
      return;
    }

    const redirectUrl = safeGetHeader(response, "location");

    if (redirectUrl != null) {
      if (redirectCount > this.maxRedirects) {
        reject(this.createMaxRedirectError());
        return;
      }

      this.doApiRequest(HttpExecutor.prepareRedirectUrlOptions(redirectUrl, options), cancellationToken, requestProcessor, redirectCount).then(resolve).catch(reject);
      return;
    }

    response.setEncoding("utf8");
    let data = "";
    response.on("data", chunk => data += chunk);
    response.on("end", () => {
      try {
        if (response.statusCode != null && response.statusCode >= 400) {
          const contentType = safeGetHeader(response, "content-type");
          const isJson = contentType != null && (Array.isArray(contentType) ? contentType.find(it => it.includes("json")) != null : contentType.includes("json"));
          reject(createHttpError(response, isJson ? JSON.parse(data) : data));
        } else {
          resolve(data.length === 0 ? null : data);
        }
      } catch (e) {
        reject(e);
      }
    });
  }

  downloadToBuffer(url, options) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      return yield options.cancellationToken.createPromise((resolve, reject, onCancel) => {
        let result = null;
        const requestOptions = {
          headers: options.headers || undefined,
          // because PrivateGitHubProvider requires HttpExecutor.prepareRedirectUrlOptions logic, so, we need to redirect manually
          redirect: "manual"
        };
        configureRequestUrl(url, requestOptions);
        configureRequestOptions(requestOptions);

        _this.doDownload(requestOptions, {
          destination: null,
          options,
          onCancel,
          callback: error => {
            if (error == null) {
              resolve(result);
            } else {
              reject(error);
            }
          },
          responseHandler: (response, callback) => {
            const contentLength = safeGetHeader(response, "content-length");
            let position = -1;

            if (contentLength != null) {
              const size = parseInt(contentLength, 10);

              if (size > 0) {
                if (size > 5242880) {
                  callback(new Error("Maximum allowed size is 5 MB"));
                  return;
                }

                result = Buffer.alloc(size);
                position = 0;
              }
            }

            response.on("data", chunk => {
              if (position !== -1) {
                chunk.copy(result, position);
                position += chunk.length;
              } else if (result == null) {
                result = chunk;
              } else {
                if (result.length > 5242880) {
                  callback(new Error("Maximum allowed size is 5 MB"));
                  return;
                }

                result = Buffer.concat([result, chunk]);
              }
            });
            response.on("end", () => {
              if (result != null && position !== -1 && position !== result.length) {
                callback(new Error(`Received data length ${position} is not equal to expected ${result.length}`));
              } else {
                callback(null);
              }
            });
          }
        }, 0);
      });
    })();
  }

  doDownload(requestOptions, options, redirectCount) {
    const request = this.createRequest(requestOptions, response => {
      if (response.statusCode >= 400) {
        options.callback(new Error(`Cannot download "${requestOptions.protocol || "https:"}//${requestOptions.hostname}${requestOptions.path}", status ${response.statusCode}: ${response.statusMessage}`));
        return;
      } // this code not relevant for Electron (redirect event instead handled)


      const redirectUrl = safeGetHeader(response, "location");

      if (redirectUrl != null) {
        if (redirectCount < this.maxRedirects) {
          this.doDownload(HttpExecutor.prepareRedirectUrlOptions(redirectUrl, requestOptions), options, redirectCount++);
        } else {
          options.callback(this.createMaxRedirectError());
        }

        return;
      }

      if (options.responseHandler == null) {
        configurePipes(options, response);
      } else {
        options.responseHandler(response, options.callback);
      }
    });
    this.addErrorAndTimeoutHandlers(request, options.callback);
    this.addRedirectHandlers(request, requestOptions, options.callback, redirectCount, requestOptions => {
      this.doDownload(requestOptions, options, redirectCount++);
    });
    request.end();
  }

  createMaxRedirectError() {
    return new Error(`Too many redirects (> ${this.maxRedirects})`);
  }

  addTimeOutHandler(request, callback) {
    request.on("socket", socket => {
      socket.setTimeout(60 * 1000, () => {
        request.abort();
        callback(new Error("Request timed out"));
      });
    });
  }

  static prepareRedirectUrlOptions(redirectUrl, options) {
    const newOptions = configureRequestOptionsFromUrl(redirectUrl, Object.assign({}, options));
    const headers = newOptions.headers;

    if (headers != null && headers.authorization != null && headers.authorization.startsWith("token")) {
      const parsedNewUrl = new (_url().URL)(redirectUrl);

      if (parsedNewUrl.hostname.endsWith(".amazonaws.com")) {
        delete headers.authorization;
      }
    }

    return newOptions;
  }

}

exports.HttpExecutor = HttpExecutor;

function configureRequestOptionsFromUrl(url, options) {
  const result = configureRequestOptions(options);
  configureRequestUrl(new (_url().URL)(url), result);
  return result;
}

function configureRequestUrl(url, options) {
  options.protocol = url.protocol;
  options.hostname = url.hostname;

  if (url.port) {
    options.port = url.port;
  } else if (options.port) {
    delete options.port;
  }

  options.path = url.pathname + url.search;
}

class DigestTransform extends _stream().Transform {
  constructor(expected, algorithm = "sha512", encoding = "base64") {
    super();
    this.expected = expected;
    this.algorithm = algorithm;
    this.encoding = encoding;
    this._actual = null;
    this.isValidateOnEnd = true;
    this.digester = (0, _crypto().createHash)(algorithm);
  } // noinspection JSUnusedGlobalSymbols


  get actual() {
    return this._actual;
  } // noinspection JSUnusedGlobalSymbols


  _transform(chunk, encoding, callback) {
    this.digester.update(chunk);
    callback(null, chunk);
  } // noinspection JSUnusedGlobalSymbols


  _flush(callback) {
    this._actual = this.digester.digest(this.encoding);

    if (this.isValidateOnEnd) {
      try {
        this.validate();
      } catch (e) {
        callback(e);
        return;
      }
    }

    callback(null);
  }

  validate() {
    if (this._actual == null) {
      throw (0, _index().newError)("Not finished yet", "ERR_STREAM_NOT_FINISHED");
    }

    if (this._actual !== this.expected) {
      throw (0, _index().newError)(`${this.algorithm} checksum mismatch, expected ${this.expected}, got ${this._actual}`, "ERR_CHECKSUM_MISMATCH");
    }

    return null;
  }

}

exports.DigestTransform = DigestTransform;

function checkSha2(sha2Header, sha2, callback) {
  if (sha2Header != null && sha2 != null && sha2Header !== sha2) {
    callback(new Error(`checksum mismatch: expected ${sha2} but got ${sha2Header} (X-Checksum-Sha2 header)`));
    return false;
  }

  return true;
}

function safeGetHeader(response, headerKey) {
  const value = response.headers[headerKey];

  if (value == null) {
    return null;
  } else if (Array.isArray(value)) {
    // electron API
    return value.length === 0 ? null : value[value.length - 1];
  } else {
    return value;
  }
}

function configurePipes(options, response) {
  if (!checkSha2(safeGetHeader(response, "X-Checksum-Sha2"), options.options.sha2, options.callback)) {
    return;
  }

  const streams = [];

  if (options.options.onProgress != null) {
    const contentLength = safeGetHeader(response, "content-length");

    if (contentLength != null) {
      streams.push(new (_ProgressCallbackTransform().ProgressCallbackTransform)(parseInt(contentLength, 10), options.options.cancellationToken, options.options.onProgress));
    }
  }

  const sha512 = options.options.sha512;

  if (sha512 != null) {
    streams.push(new DigestTransform(sha512, "sha512", sha512.length === 128 && !sha512.includes("+") && !sha512.includes("Z") && !sha512.includes("=") ? "hex" : "base64"));
  } else if (options.options.sha2 != null) {
    streams.push(new DigestTransform(options.options.sha2, "sha256", "hex"));
  }

  const fileOut = (0, _fsExtraP().createWriteStream)(options.destination);
  streams.push(fileOut);
  let lastStream = response;

  for (const stream of streams) {
    stream.on("error", error => {
      if (!options.options.cancellationToken.cancelled) {
        options.callback(error);
      }
    });
    lastStream = lastStream.pipe(stream);
  }

  fileOut.on("finish", () => {
    fileOut.close(options.callback);
  });
}

function configureRequestOptions(options, token, method) {
  if (method != null) {
    options.method = method;
  }

  let headers = options.headers;

  if (headers == null) {
    headers = {};
    options.headers = headers;
  }

  if (token != null) {
    headers.authorization = token.startsWith("Basic") ? token : `token ${token}`;
  }

  if (headers["User-Agent"] == null) {
    headers["User-Agent"] = "electron-builder";
  }

  if (method == null || method === "GET" || headers["Cache-Control"] == null) {
    headers["Cache-Control"] = "no-cache";
  } // do not specify for node (in any case we use https module)


  if (options.protocol == null && process.versions.electron != null) {
    options.protocol = "https:";
  }

  return options;
}

function safeStringifyJson(data, skippedNames) {
  return JSON.stringify(data, (name, value) => {
    if (name.endsWith("authorization") || name.endsWith("Password") || name.endsWith("PASSWORD") || name.endsWith("Token") || name.includes("password") || name.includes("token") || skippedNames != null && skippedNames.has(name)) {
      return "<stripped sensitive data>";
    }

    return value;
  }, 2);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=httpExecutor.js.map{"version":3,"sources":["../src/httpExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, Hash } from \"crypto\"\nimport _debug from \"debug\"\nimport { createWriteStream } from \"fs-extra-p\"\nimport { IncomingMessage, OutgoingHttpHeaders, RequestOptions } from \"http\"\nimport { Socket } from \"net\"\nimport { Transform } from \"stream\"\nimport { URL } from \"url\"\nimport { CancellationToken } from \"./CancellationToken\"\nimport { newError } from \"./index\"\nimport { ProgressCallbackTransform, ProgressInfo } from \"./ProgressCallbackTransform\"\n\nconst debug = _debug(\"electron-builder\")\n\nexport interface RequestHeaders extends OutgoingHttpHeaders {\n  [key: string]: string\n}\n\nexport interface DownloadOptions {\n  readonly headers?: OutgoingHttpHeaders | null\n  readonly sha2?: string | null\n  readonly sha512?: string | null\n\n  readonly cancellationToken: CancellationToken\n\n  // noinspection JSUnusedLocalSymbols\n  onProgress?(progress: ProgressInfo): void\n}\n\nexport function createHttpError(response: IncomingMessage, description: any | null = null) {\n  return new HttpError(response.statusCode || -1, `${response.statusCode} ${response.statusMessage}` + (description == null ? \"\" : (\"\\n\" + JSON.stringify(description, null, \"  \"))) + \"\\nHeaders: \" + safeStringifyJson(response.headers), description)\n}\n\nconst HTTP_STATUS_CODES = new Map<number, string>([\n  [429, \"Too many requests\"],\n  [400, \"Bad request\"],\n  [403, \"Forbidden\"],\n  [404, \"Not found\"],\n  [405, \"Method not allowed\"],\n  [406, \"Not acceptable\"],\n  [408, \"Request timeout\"],\n  [413, \"Request entity too large\"],\n  [500, \"Internal server error\"],\n  [502, \"Bad gateway\"],\n  [503, \"Service unavailable\"],\n  [504, \"Gateway timeout\"],\n  [505, \"HTTP version not supported\"],\n])\n\nexport class HttpError extends Error {\n  constructor(readonly statusCode: number, message: string = `HTTP error: ${HTTP_STATUS_CODES.get(statusCode) || statusCode}`, readonly description: any | null = null) {\n    super(message)\n\n    this.name = \"HttpError\"\n  }\n}\n\nexport function parseJson(result: Promise<string | null>) {\n  return result.then(it => it == null || it.length === 0 ? null : JSON.parse(it))\n}\n\nexport abstract class HttpExecutor<REQUEST> {\n  protected readonly maxRedirects = 10\n\n  request(options: RequestOptions, cancellationToken: CancellationToken = new CancellationToken(), data?: { [name: string]: any; } | null): Promise<string | null> {\n    configureRequestOptions(options)\n    const encodedData = data == null ? undefined : Buffer.from(JSON.stringify(data))\n    if (encodedData != null) {\n      options.method = \"post\"\n      options.headers![\"Content-Type\"] = \"application/json\"\n      options.headers![\"Content-Length\"] = encodedData.length\n    }\n    return this.doApiRequest(options, cancellationToken, it => {\n      (it as any).end(encodedData)\n    })\n  }\n\n  doApiRequest(options: RequestOptions, cancellationToken: CancellationToken, requestProcessor: (request: REQUEST, reject: (error: Error) => void) => void, redirectCount: number = 0): Promise<string> {\n    if (debug.enabled) {\n      debug(`Request: ${safeStringifyJson(options)}`)\n    }\n\n    return cancellationToken.createPromise<string>((resolve, reject, onCancel) => {\n      const request = this.createRequest(options, (response: any) => {\n        try {\n          this.handleResponse(response, options, cancellationToken, resolve, reject, redirectCount, requestProcessor)\n        }\n        catch (e) {\n          reject(e)\n        }\n      })\n      this.addErrorAndTimeoutHandlers(request, reject)\n      this.addRedirectHandlers(request, options, reject, redirectCount, options => {\n        this.doApiRequest(options, cancellationToken, requestProcessor, redirectCount)\n          .then(resolve)\n          .catch(reject)\n      })\n      requestProcessor(request, reject)\n      onCancel(() => request.abort())\n    })\n  }\n\n  // noinspection JSUnusedLocalSymbols\n  protected addRedirectHandlers(request: any, options: RequestOptions, reject: (error: Error) => void, redirectCount: number, handler: (options: RequestOptions) => void) {\n    // not required for NodeJS\n  }\n\n  addErrorAndTimeoutHandlers(request: any, reject: (error: Error) => void) {\n    this.addTimeOutHandler(request, reject)\n    request.on(\"error\", reject)\n    request.on(\"aborted\", () => {\n      reject(new Error(\"Request has been aborted by the server\"))\n    })\n  }\n\n  private handleResponse(response: IncomingMessage,\n                         options: RequestOptions,\n                         cancellationToken: CancellationToken,\n                         resolve: (data?: any) => void,\n                         reject: (error: Error) => void,\n                         redirectCount: number,\n                         requestProcessor: (request: REQUEST, reject: (error: Error) => void) => void) {\n    if (debug.enabled) {\n      debug(`Response: ${response.statusCode} ${response.statusMessage}, request options: ${safeStringifyJson(options)}`)\n    }\n\n    // we handle any other >= 400 error on request end (read detailed message in the response body)\n    if (response.statusCode === 404) {\n      // error is clear, we don't need to read detailed error description\n      reject(createHttpError(response, `method: ${options.method || \"GET\"} url: ${options.protocol || \"https:\"}//${options.hostname}${options.port ? `:${options.port}` : \"\"}${options.path}\n\nPlease double check that your authentication token is correct. Due to security reasons actual status maybe not reported, but 404.\n`))\n      return\n    }\n    else if (response.statusCode === 204) {\n      // on DELETE request\n      resolve()\n      return\n    }\n\n    const redirectUrl = safeGetHeader(response, \"location\")\n    if (redirectUrl != null) {\n      if (redirectCount > this.maxRedirects) {\n        reject(this.createMaxRedirectError())\n        return\n      }\n\n      this.doApiRequest(HttpExecutor.prepareRedirectUrlOptions(redirectUrl, options), cancellationToken, requestProcessor, redirectCount)\n        .then(resolve)\n        .catch(reject)\n      return\n    }\n\n    response.setEncoding(\"utf8\")\n\n    let data = \"\"\n    response.on(\"data\", (chunk: string) => data += chunk)\n    response.on(\"end\", () => {\n      try {\n        if (response.statusCode != null && response.statusCode >= 400) {\n          const contentType = safeGetHeader(response, \"content-type\")\n          const isJson = contentType != null && (Array.isArray(contentType) ? contentType.find(it => it.includes(\"json\")) != null : contentType.includes(\"json\"))\n          reject(createHttpError(response, isJson ? JSON.parse(data) : data))\n        }\n        else {\n          resolve(data.length === 0 ? null : data)\n        }\n      }\n      catch (e) {\n        reject(e)\n      }\n    })\n  }\n\n  // noinspection JSUnusedLocalSymbols\n  abstract createRequest(options: any, callback: (response: any) => void): any\n\n  async downloadToBuffer(url: URL, options: DownloadOptions): Promise<Buffer> {\n    return await options.cancellationToken.createPromise<Buffer>((resolve, reject, onCancel) => {\n      let result: Buffer | null = null\n      const requestOptions = {\n        headers: options.headers || undefined,\n        // because PrivateGitHubProvider requires HttpExecutor.prepareRedirectUrlOptions logic, so, we need to redirect manually\n        redirect: \"manual\",\n      }\n      configureRequestUrl(url, requestOptions)\n      configureRequestOptions(requestOptions)\n      this.doDownload(requestOptions, {\n        destination: null,\n        options,\n        onCancel,\n        callback: error => {\n          if (error == null) {\n            resolve(result!!)\n          }\n          else {\n            reject(error)\n          }\n        },\n        responseHandler: (response, callback) => {\n          const contentLength = safeGetHeader(response, \"content-length\")\n          let position = -1\n          if (contentLength != null) {\n            const size = parseInt(contentLength, 10)\n            if (size > 0) {\n              if (size > 5242880) {\n                callback(new Error(\"Maximum allowed size is 5 MB\"))\n                return\n              }\n\n              result = Buffer.alloc(size)\n              position = 0\n            }\n          }\n          response.on(\"data\", (chunk: Buffer) => {\n            if (position !== -1) {\n              chunk.copy(result!!, position)\n              position += chunk.length\n            }\n            else if (result == null) {\n              result = chunk\n            }\n            else {\n              if (result.length > 5242880) {\n                callback(new Error(\"Maximum allowed size is 5 MB\"))\n                return\n              }\n              result = Buffer.concat([result, chunk])\n            }\n          })\n          response.on(\"end\", () => {\n            if (result != null && position !== -1 && position !== result.length) {\n              callback(new Error(`Received data length ${position} is not equal to expected ${result.length}`))\n            }\n            else {\n              callback(null)\n            }\n          })\n        },\n      }, 0)\n    })\n  }\n\n  protected doDownload(requestOptions: any, options: DownloadCallOptions, redirectCount: number) {\n    const request = this.createRequest(requestOptions, (response: IncomingMessage) => {\n      if (response.statusCode! >= 400) {\n        options.callback(new Error(`Cannot download \"${requestOptions.protocol || \"https:\"}//${requestOptions.hostname}${requestOptions.path}\", status ${response.statusCode}: ${response.statusMessage}`))\n        return\n      }\n\n      // this code not relevant for Electron (redirect event instead handled)\n      const redirectUrl = safeGetHeader(response, \"location\")\n      if (redirectUrl != null) {\n        if (redirectCount < this.maxRedirects) {\n          this.doDownload(HttpExecutor.prepareRedirectUrlOptions(redirectUrl, requestOptions), options, redirectCount++)\n        }\n        else {\n          options.callback(this.createMaxRedirectError())\n        }\n        return\n      }\n\n      if (options.responseHandler == null) {\n        configurePipes(options, response)\n      }\n      else {\n        options.responseHandler(response, options.callback)\n      }\n    })\n    this.addErrorAndTimeoutHandlers(request, options.callback)\n    this.addRedirectHandlers(request, requestOptions, options.callback, redirectCount, requestOptions => {\n      this.doDownload(requestOptions, options, redirectCount++)\n    })\n    request.end()\n  }\n\n  protected createMaxRedirectError() {\n    return new Error(`Too many redirects (> ${this.maxRedirects})`)\n  }\n\n  private addTimeOutHandler(request: any, callback: (error: Error) => void) {\n    request.on(\"socket\", (socket: Socket) => {\n      socket.setTimeout(60 * 1000, () => {\n        request.abort()\n        callback(new Error(\"Request timed out\"))\n      })\n    })\n  }\n\n  static prepareRedirectUrlOptions(redirectUrl: string, options: RequestOptions): RequestOptions {\n    const newOptions = configureRequestOptionsFromUrl(redirectUrl, {...options})\n    const headers = newOptions.headers\n    if (headers != null && headers.authorization != null && (headers.authorization as string).startsWith(\"token\")) {\n      const parsedNewUrl = new URL(redirectUrl)\n      if (parsedNewUrl.hostname.endsWith(\".amazonaws.com\")) {\n        delete headers.authorization\n      }\n    }\n    return newOptions\n  }\n}\n\nexport interface DownloadCallOptions {\n  responseHandler: ((response: IncomingMessage, callback: (error: Error | null) => void) => void) | null\n  onCancel: (callback: () => void) => void\n  callback: (error: Error | null) => void\n\n  options: DownloadOptions\n\n  destination: string | null\n}\n\nexport function configureRequestOptionsFromUrl(url: string, options: RequestOptions) {\n  const result = configureRequestOptions(options)\n  configureRequestUrl(new URL(url), result)\n  return result\n}\n\nexport function configureRequestUrl(url: URL, options: RequestOptions): void {\n  options.protocol = url.protocol\n  options.hostname = url.hostname\n  if (url.port) {\n    options.port = url.port\n  }\n  else if (options.port) {\n    delete options.port\n  }\n  options.path = url.pathname + url.search\n}\n\nexport class DigestTransform extends Transform {\n  private readonly digester: Hash\n\n  private _actual: string | null = null\n\n  // noinspection JSUnusedGlobalSymbols\n  get actual() {\n    return this._actual\n  }\n\n  isValidateOnEnd: boolean = true\n\n  constructor(readonly expected: string, private readonly algorithm: string = \"sha512\", private readonly encoding: \"hex\" | \"base64\" | \"latin1\" = \"base64\") {\n    super()\n\n    this.digester = createHash(algorithm)\n  }\n\n  // noinspection JSUnusedGlobalSymbols\n  _transform(chunk: Buffer, encoding: string, callback: any) {\n    this.digester.update(chunk)\n    callback(null, chunk)\n  }\n\n  // noinspection JSUnusedGlobalSymbols\n  _flush(callback: any): void {\n    this._actual = this.digester.digest(this.encoding)\n\n    if (this.isValidateOnEnd) {\n      try {\n        this.validate()\n      }\n      catch (e) {\n        callback(e)\n        return\n      }\n    }\n\n    callback(null)\n  }\n\n  validate() {\n    if (this._actual == null) {\n      throw newError(\"Not finished yet\", \"ERR_STREAM_NOT_FINISHED\")\n    }\n\n    if (this._actual !== this.expected) {\n      throw newError(`${this.algorithm} checksum mismatch, expected ${this.expected}, got ${this._actual}`, \"ERR_CHECKSUM_MISMATCH\")\n    }\n\n    return null\n  }\n}\n\nfunction checkSha2(sha2Header: string | null | undefined, sha2: string | null | undefined, callback: (error: Error | null) => void): boolean {\n  if (sha2Header != null && sha2 != null && sha2Header !== sha2) {\n    callback(new Error(`checksum mismatch: expected ${sha2} but got ${sha2Header} (X-Checksum-Sha2 header)`))\n    return false\n  }\n  return true\n}\n\nexport function safeGetHeader(response: any, headerKey: string) {\n  const value = response.headers[headerKey]\n  if (value == null) {\n    return null\n  }\n  else if (Array.isArray(value)) {\n    // electron API\n    return value.length === 0 ? null : value[value.length - 1]\n  }\n  else {\n    return value\n  }\n}\n\nfunction configurePipes(options: DownloadCallOptions, response: IncomingMessage) {\n  if (!checkSha2(safeGetHeader(response, \"X-Checksum-Sha2\"), options.options.sha2, options.callback)) {\n    return\n  }\n\n  const streams: Array<any> = []\n  if (options.options.onProgress != null) {\n    const contentLength = safeGetHeader(response, \"content-length\")\n    if (contentLength != null) {\n      streams.push(new ProgressCallbackTransform(parseInt(contentLength, 10), options.options.cancellationToken, options.options.onProgress))\n    }\n  }\n\n  const sha512 = options.options.sha512\n  if (sha512 != null) {\n    streams.push(new DigestTransform(sha512, \"sha512\", sha512.length === 128 && !sha512.includes(\"+\") && !sha512.includes(\"Z\") && !sha512.includes(\"=\") ? \"hex\" : \"base64\"))\n  }\n  else if (options.options.sha2 != null) {\n    streams.push(new DigestTransform(options.options.sha2, \"sha256\", \"hex\"))\n  }\n\n  const fileOut = createWriteStream(options.destination!!)\n  streams.push(fileOut)\n\n  let lastStream = response\n  for (const stream of streams) {\n    stream.on(\"error\", (error: Error) => {\n      if (!options.options.cancellationToken.cancelled) {\n        options.callback(error)\n      }\n    })\n    lastStream = lastStream.pipe(stream)\n  }\n\n  fileOut.on(\"finish\", () => {\n    (fileOut.close as any)(options.callback)\n  })\n}\n\nexport function configureRequestOptions(options: RequestOptions, token?: string | null, method?: \"GET\" | \"DELETE\" | \"PUT\"): RequestOptions {\n  if (method != null) {\n    options.method = method\n  }\n\n  let headers = options.headers\n  if (headers == null) {\n    headers = {}\n    options.headers = headers\n  }\n  if (token != null) {\n    (headers as any).authorization = token.startsWith(\"Basic\") ? token : `token ${token}`\n  }\n  if (headers[\"User-Agent\"] == null) {\n    headers[\"User-Agent\"] = \"electron-builder\"\n  }\n\n  if ((method == null || method === \"GET\") || headers[\"Cache-Control\"] == null) {\n    headers[\"Cache-Control\"] = \"no-cache\"\n  }\n\n  // do not specify for node (in any case we use https module)\n  if (options.protocol == null && (process.versions as any).electron != null) {\n    options.protocol = \"https:\"\n  }\n  return options\n}\n\nexport function safeStringifyJson(data: any, skippedNames?: Set<string>) {\n  return JSON.stringify(data, (name, value) => {\n    if (name.endsWith(\"authorization\") || name.endsWith(\"Password\") || name.endsWith(\"PASSWORD\") || name.endsWith(\"Token\") || name.includes(\"password\") || name.includes(\"token\") || (skippedNames != null && skippedNames.has(name))) {\n      return \"<stripped sensitive data>\"\n    }\n    return value\n  }, 2)\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.asArray = asArray;
exports.newError = newError;
Object.defineProperty(exports, "CancellationToken", {
  enumerable: true,
  get: function () {
    return _CancellationToken().CancellationToken;
  }
});
Object.defineProperty(exports, "CancellationError", {
  enumerable: true,
  get: function () {
    return _CancellationToken().CancellationError;
  }
});
Object.defineProperty(exports, "HttpError", {
  enumerable: true,
  get: function () {
    return _httpExecutor().HttpError;
  }
});
Object.defineProperty(exports, "createHttpError", {
  enumerable: true,
  get: function () {
    return _httpExecutor().createHttpError;
  }
});
Object.defineProperty(exports, "HttpExecutor", {
  enumerable: true,
  get: function () {
    return _httpExecutor().HttpExecutor;
  }
});
Object.defineProperty(exports, "DigestTransform", {
  enumerable: true,
  get: function () {
    return _httpExecutor().DigestTransform;
  }
});
Object.defineProperty(exports, "safeGetHeader", {
  enumerable: true,
  get: function () {
    return _httpExecutor().safeGetHeader;
  }
});
Object.defineProperty(exports, "configureRequestOptions", {
  enumerable: true,
  get: function () {
    return _httpExecutor().configureRequestOptions;
  }
});
Object.defineProperty(exports, "configureRequestOptionsFromUrl", {
  enumerable: true,
  get: function () {
    return _httpExecutor().configureRequestOptionsFromUrl;
  }
});
Object.defineProperty(exports, "safeStringifyJson", {
  enumerable: true,
  get: function () {
    return _httpExecutor().safeStringifyJson;
  }
});
Object.defineProperty(exports, "parseJson", {
  enumerable: true,
  get: function () {
    return _httpExecutor().parseJson;
  }
});
Object.defineProperty(exports, "configureRequestUrl", {
  enumerable: true,
  get: function () {
    return _httpExecutor().configureRequestUrl;
  }
});
Object.defineProperty(exports, "getS3LikeProviderBaseUrl", {
  enumerable: true,
  get: function () {
    return _publishOptions().getS3LikeProviderBaseUrl;
  }
});
Object.defineProperty(exports, "githubUrl", {
  enumerable: true,
  get: function () {
    return _publishOptions().githubUrl;
  }
});
Object.defineProperty(exports, "parseDn", {
  enumerable: true,
  get: function () {
    return _rfc2253Parser().parseDn;
  }
});
Object.defineProperty(exports, "UUID", {
  enumerable: true,
  get: function () {
    return _uuid().UUID;
  }
});
Object.defineProperty(exports, "ProgressCallbackTransform", {
  enumerable: true,
  get: function () {
    return _ProgressCallbackTransform().ProgressCallbackTransform;
  }
});
Object.defineProperty(exports, "parseXml", {
  enumerable: true,
  get: function () {
    return _xml().parseXml;
  }
});
Object.defineProperty(exports, "XElement", {
  enumerable: true,
  get: function () {
    return _xml().XElement;
  }
});
exports.CURRENT_APP_PACKAGE_FILE_NAME = exports.CURRENT_APP_INSTALLER_FILE_NAME = void 0;

function _CancellationToken() {
  const data = require("./CancellationToken");

  _CancellationToken = function () {
    return data;
  };

  return data;
}

function _httpExecutor() {
  const data = require("./httpExecutor");

  _httpExecutor = function () {
    return data;
  };

  return data;
}

function _publishOptions() {
  const data = require("./publishOptions");

  _publishOptions = function () {
    return data;
  };

  return data;
}

function _rfc2253Parser() {
  const data = require("./rfc2253Parser");

  _rfc2253Parser = function () {
    return data;
  };

  return data;
}

function _uuid() {
  const data = require("./uuid");

  _uuid = function () {
    return data;
  };

  return data;
}

function _ProgressCallbackTransform() {
  const data = require("./ProgressCallbackTransform");

  _ProgressCallbackTransform = function () {
    return data;
  };

  return data;
}

function _xml() {
  const data = require("./xml");

  _xml = function () {
    return data;
  };

  return data;
}

// nsis
const CURRENT_APP_INSTALLER_FILE_NAME = "installer.exe"; // nsis-web

exports.CURRENT_APP_INSTALLER_FILE_NAME = CURRENT_APP_INSTALLER_FILE_NAME;
const CURRENT_APP_PACKAGE_FILE_NAME = "package.7z";
exports.CURRENT_APP_PACKAGE_FILE_NAME = CURRENT_APP_PACKAGE_FILE_NAME;

function asArray(v) {
  if (v == null) {
    return [];
  } else if (Array.isArray(v)) {
    return v;
  } else {
    return [v];
  }
}

function newError(message, code) {
  const error = new Error(message);
  error.code = code;
  return error;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=index.js.map{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AACO,MAAM,+BAA+B,GAAG,eAAxC,C,CACP;;;AACO,MAAM,6BAA6B,GAAG,YAAtC;;;AAED,SAAU,OAAV,CAAqB,CAArB,EAAuD;AAC3D,MAAI,CAAC,IAAI,IAAT,EAAe;AACb,WAAO,EAAP;AACD,GAFD,MAGK,IAAI,KAAK,CAAC,OAAN,CAAc,CAAd,CAAJ,EAAsB;AACzB,WAAO,CAAP;AACD,GAFI,MAGA;AACH,WAAO,CAAC,CAAD,CAAP;AACD;AACF;;AAEK,SAAU,QAAV,CAAmB,OAAnB,EAAoC,IAApC,EAAgD;AACpD,QAAM,KAAK,GAAG,IAAI,KAAJ,CAAU,OAAV,CAAd;AACC,EAAA,KAA+B,CAAC,IAAhC,GAAuC,IAAvC;AACD,SAAO,KAAP;AACD,C","sourcesContent":["export { CancellationToken, CancellationError } from \"./CancellationToken\"\nexport { HttpError, createHttpError, HttpExecutor, DownloadOptions, DigestTransform, RequestHeaders, safeGetHeader, configureRequestOptions, configureRequestOptionsFromUrl, safeStringifyJson, parseJson, configureRequestUrl } from \"./httpExecutor\"\nexport { BintrayOptions, GenericServerOptions, GithubOptions, PublishConfiguration, S3Options, SpacesOptions, BaseS3Options, getS3LikeProviderBaseUrl, Publish, githubUrl, PublishProvider, AllPublishOptions } from \"./publishOptions\"\nexport { UpdateInfo, UpdateFileInfo, WindowsUpdateInfo, BlockMapDataHolder, PackageFileInfo, ReleaseNoteInfo } from \"./updateInfo\"\nexport { parseDn } from \"./rfc2253Parser\"\nexport { UUID } from \"./uuid\"\nexport { ProgressCallbackTransform, ProgressInfo } from \"./ProgressCallbackTransform\"\nexport { parseXml, XElement } from \"./xml\"\nexport { BlockMap } from \"./blockMapApi\"\n\n// nsis\nexport const CURRENT_APP_INSTALLER_FILE_NAME = \"installer.exe\"\n// nsis-web\nexport const CURRENT_APP_PACKAGE_FILE_NAME = \"package.7z\"\n\nexport function asArray<T>(v: null | undefined | T | Array<T>): Array<T> {\n  if (v == null) {\n    return []\n  }\n  else if (Array.isArray(v)) {\n    return v\n  }\n  else {\n    return [v]\n  }\n}\n\nexport function newError(message: string, code: string) {\n  const error = new Error(message);\n  (error as NodeJS.ErrnoException).code = code\n  return error\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.githubUrl = githubUrl;
exports.getS3LikeProviderBaseUrl = getS3LikeProviderBaseUrl;

/** @private */
function githubUrl(options, defaultHost = "github.com") {
  return `${options.protocol || "https"}://${options.host || defaultHost}`;
}

function getS3LikeProviderBaseUrl(configuration) {
  const provider = configuration.provider;

  if (provider === "s3") {
    return s3Url(configuration);
  }

  if (provider === "spaces") {
    return spacesUrl(configuration);
  }

  throw new Error(`Not supported provider: ${provider}`);
}

function s3Url(options) {
  let url;

  if (options.endpoint != null) {
    url = `${options.endpoint}/${options.bucket}`;
  } else if (options.bucket.includes(".")) {
    if (options.region == null) {
      throw new Error(`Bucket name "${options.bucket}" includes a dot, but S3 region is missing`);
    } // special case, see http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro


    if (options.region === "us-east-1") {
      url = `https://s3.amazonaws.com/${options.bucket}`;
    } else {
      url = `https://s3-${options.region}.amazonaws.com/${options.bucket}`;
    }
  } else if (options.region === "cn-north-1") {
    url = `https://${options.bucket}.s3.${options.region}.amazonaws.com.cn`;
  } else {
    url = `https://${options.bucket}.s3.amazonaws.com`;
  }

  return appendPath(url, options.path);
}

function appendPath(url, p) {
  if (p != null && p.length > 0) {
    if (!p.startsWith("/")) {
      url += "/";
    }

    url += p;
  }

  return url;
}

function spacesUrl(options) {
  if (options.name == null) {
    throw new Error(`name is missing`);
  }

  if (options.region == null) {
    throw new Error(`region is missing`);
  }

  return appendPath(`https://${options.name}.${options.region}.digitaloceanspaces.com`, options.path);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=publishOptions.js.map{"version":3,"sources":["../src/publishOptions.ts"],"names":[],"mappings":";;;;;;;;AAoGA;AACM,SAAU,SAAV,CAAoB,OAApB,EAA4C,WAAA,GAAsB,YAAlE,EAA8E;AAClF,SAAO,GAAG,OAAO,CAAC,QAAR,IAAoB,OAAO,MAAM,OAAO,CAAC,IAAR,IAAgB,WAAW,EAAtE;AACD;;AAkHK,SAAU,wBAAV,CAAmC,aAAnC,EAAsE;AAC1E,QAAM,QAAQ,GAAG,aAAa,CAAC,QAA/B;;AACA,MAAI,QAAQ,KAAK,IAAjB,EAAuB;AACrB,WAAO,KAAK,CAAE,aAAF,CAAZ;AACD;;AACD,MAAI,QAAQ,KAAK,QAAjB,EAA2B;AACzB,WAAO,SAAS,CAAE,aAAF,CAAhB;AACD;;AACD,QAAM,IAAI,KAAJ,CAAU,2BAA2B,QAAQ,EAA7C,CAAN;AACD;;AAED,SAAS,KAAT,CAAe,OAAf,EAAiC;AAC/B,MAAI,GAAJ;;AACA,MAAI,OAAO,CAAC,QAAR,IAAoB,IAAxB,EAA8B;AAC5B,IAAA,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,EAA3C;AACD,GAFD,MAGK,IAAI,OAAO,CAAC,MAAR,CAAe,QAAf,CAAwB,GAAxB,CAAJ,EAAkC;AACrC,QAAI,OAAO,CAAC,MAAR,IAAkB,IAAtB,EAA4B;AAC1B,YAAM,IAAI,KAAJ,CAAU,gBAAgB,OAAO,CAAC,MAAM,4CAAxC,CAAN;AACD,KAHoC,CAKrC;;;AACA,QAAI,OAAO,CAAC,MAAR,KAAmB,WAAvB,EAAoC;AAClC,MAAA,GAAG,GAAG,4BAA4B,OAAO,CAAC,MAAM,EAAhD;AACD,KAFD,MAGK;AACH,MAAA,GAAG,GAAG,cAAc,OAAO,CAAC,MAAM,kBAAkB,OAAO,CAAC,MAAM,EAAlE;AACD;AACF,GAZI,MAaA,IAAI,OAAO,CAAC,MAAR,KAAmB,YAAvB,EAAqC;AACxC,IAAA,GAAG,GAAG,WAAW,OAAO,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,mBAApD;AACD,GAFI,MAGA;AACH,IAAA,GAAG,GAAG,WAAW,OAAO,CAAC,MAAM,mBAA/B;AACD;;AACD,SAAO,UAAU,CAAC,GAAD,EAAM,OAAO,CAAC,IAAd,CAAjB;AACD;;AAED,SAAS,UAAT,CAAoB,GAApB,EAAiC,CAAjC,EAA6D;AAC3D,MAAI,CAAC,IAAI,IAAL,IAAa,CAAC,CAAC,MAAF,GAAW,CAA5B,EAA+B;AAC7B,QAAI,CAAC,CAAC,CAAC,UAAF,CAAa,GAAb,CAAL,EAAwB;AACtB,MAAA,GAAG,IAAI,GAAP;AACD;;AACD,IAAA,GAAG,IAAI,CAAP;AACD;;AACD,SAAO,GAAP;AACD;;AAED,SAAS,SAAT,CAAmB,OAAnB,EAAyC;AACvC,MAAI,OAAO,CAAC,IAAR,IAAgB,IAApB,EAA0B;AACxB,UAAM,IAAI,KAAJ,CAAU,iBAAV,CAAN;AACD;;AACD,MAAI,OAAO,CAAC,MAAR,IAAkB,IAAtB,EAA4B;AAC1B,UAAM,IAAI,KAAJ,CAAU,mBAAV,CAAN;AACD;;AACD,SAAO,UAAU,CAAC,WAAW,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,yBAA1C,EAAqE,OAAO,CAAC,IAA7E,CAAjB;AACD,C","sourcesContent":["export type PublishProvider = \"github\" | \"bintray\" | \"s3\" | \"spaces\" | \"generic\" | \"custom\"\n\n// typescript-json-schema generates only PublishConfiguration if it is specified in the list, so, it is not added here\nexport type AllPublishOptions = string | GithubOptions | S3Options | SpacesOptions | GenericServerOptions | BintrayOptions | CustomPublishOptions\n// https://github.com/YousefED/typescript-json-schema/issues/80\nexport type Publish = AllPublishOptions | Array<AllPublishOptions> | null\n\nexport interface PublishConfiguration {\n  /**\n   * The provider.\n   */\n  readonly provider: PublishProvider\n\n  /**\n   * @private\n   * win-only\n   */\n  publisherName?: Array<string> | null\n\n  /**\n   * @private\n   * win-only\n   */\n  readonly updaterCacheDirName?: string | null\n\n  /**\n   * Whether to publish auto update info files.\n   *\n   * Auto update relies only on the first provider in the list (you can specify several publishers).\n   * Thus, probably, there`s no need to upload the metadata files for the other configured providers. But by default will be uploaded.\n   *\n   * @default true\n   */\n  readonly publishAutoUpdate?: boolean\n}\n\n// https://github.com/electron-userland/electron-builder/issues/3261\nexport interface CustomPublishOptions extends PublishConfiguration {\n  [index: string]: any\n}\n\n/**\n * [GitHub](https://help.github.com/articles/about-releases/) options.\n *\n * GitHub [personal access token](https://help.github.com/articles/creating-an-access-token-for-command-line-use/) is required. You can generate by going to [https://github.com/settings/tokens/new](https://github.com/settings/tokens/new). The access token should have the repo scope/permission.\n * Define `GH_TOKEN` environment variable.\n */\nexport interface GithubOptions extends PublishConfiguration {\n  /**\n   * The provider. Must be `github`.\n   */\n  readonly provider: \"github\"\n\n  /**\n   * The repository name. [Detected automatically](#github-repository-and-bintray-package).\n   */\n  readonly repo?: string | null\n\n  /**\n   * The owner.\n   */\n  readonly owner?: string | null\n\n  /**\n   * Whether to use `v`-prefixed tag name.\n   * @default true\n   */\n  readonly vPrefixedTagName?: boolean\n\n  /**\n   * The host (including the port if need).\n   * @default github.com\n   */\n  readonly host?: string | null\n\n  /**\n   * The protocol. GitHub Publisher supports only `https`.\n   * @default https\n   */\n  readonly protocol?: \"https\" | \"http\" | null\n\n  /**\n   * The access token to support auto-update from private github repositories. Never specify it in the configuration files. Only for [setFeedURL](/auto-update#appupdatersetfeedurloptions).\n   */\n  readonly token?: string | null\n\n  /**\n   * Whether to use private github auto-update provider if `GH_TOKEN` environment variable is defined. See [Private GitHub Update Repo](/auto-update#private-github-update-repo).\n   */\n  readonly private?: boolean | null\n\n  /**\n   * The type of release. By default `draft` release will be created.\n   *\n   * Also you can set release type using environment variable. If `EP_DRAFT`is set to `true` â€” `draft`, if `EP_PRE_RELEASE`is set to `true` â€” `prerelease`.\n   * @default draft\n   */\n  releaseType?: \"draft\" | \"prerelease\" | \"release\" | null\n}\n\n/** @private */\nexport function githubUrl(options: GithubOptions, defaultHost: string = \"github.com\") {\n  return `${options.protocol || \"https\"}://${options.host || defaultHost}`\n}\n\n/**\n * Generic (any HTTP(S) server) options.\n * In all publish options [File Macros](/file-patterns#file-macros) are supported.\n */\nexport interface GenericServerOptions extends PublishConfiguration {\n  /**\n   * The provider. Must be `generic`.\n   */\n  readonly provider: \"generic\"\n\n  /**\n   * The base url. e.g. `https://bucket_name.s3.amazonaws.com`.\n   */\n  readonly url: string\n\n  /**\n   * The channel.\n   * @default latest\n   */\n  readonly channel?: string | null\n\n  /**\n   * Whether to use multiple range requests for differential update. Defaults to `true` if `url` doesn't contain `s3.amazonaws.com`.\n   */\n  readonly useMultipleRangeRequest?: boolean\n}\n\nexport interface BaseS3Options extends PublishConfiguration {\n  /**\n   * The update channel.\n   * @default latest\n   */\n  channel?: string | null\n\n  /**\n   * The directory path.\n   * @default /\n   */\n  readonly path?: string | null\n\n  /**\n   * The ACL. Set to `null` to not [add](https://github.com/electron-userland/electron-builder/issues/1822).\n   *\n   * @default public-read\n   */\n  readonly acl?: \"private\" | \"public-read\" | null\n}\n\nexport interface S3Options extends BaseS3Options {\n  /**\n   * The provider. Must be `s3`.\n   */\n  readonly provider: \"s3\"\n\n  /**\n   * The bucket name.\n   */\n  readonly bucket: string\n\n  /**\n   * The region. Is determined and set automatically when publishing.\n   */\n  region?: string | null\n\n  /**\n   * The ACL. Set to `null` to not [add](https://github.com/electron-userland/electron-builder/issues/1822).\n   *\n   * Please see [required permissions for the S3 provider](https://github.com/electron-userland/electron-builder/issues/1618#issuecomment-314679128).\n   *\n   * @default public-read\n   */\n  readonly acl?: \"private\" | \"public-read\" | null\n\n  /**\n   * The type of storage to use for the object.\n   * @default STANDARD\n   */\n  readonly storageClass?: \"STANDARD\" | \"REDUCED_REDUNDANCY\" | \"STANDARD_IA\" | null\n\n  /**\n   * Server-side encryption algorithm to use for the object.\n   */\n  readonly encryption?: \"AES256\" | \"aws:kms\" | null\n\n  /**\n   * The endpoint URI to send requests to. The default endpoint is built from the configured region.\n   * The endpoint should be a string like `https://{service}.{region}.amazonaws.com`.\n   */\n  readonly endpoint?: string | null\n}\n\n/**\n * [DigitalOcean Spaces](https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-spaces) options.\n * Access key is required, define `DO_KEY_ID` and `DO_SECRET_KEY` environment variables.\n */\nexport interface SpacesOptions extends BaseS3Options {\n  /**\n   * The provider. Must be `spaces`.\n   */\n  readonly provider: \"spaces\"\n\n  /**\n   * The space name.\n   */\n  readonly name: string\n\n  /**\n   * The region (e.g. `nyc3`).\n   */\n  readonly region: string\n}\n\nexport function getS3LikeProviderBaseUrl(configuration: PublishConfiguration) {\n  const provider = configuration.provider\n  if (provider === \"s3\") {\n    return s3Url((configuration as S3Options))\n  }\n  if (provider === \"spaces\") {\n    return spacesUrl((configuration as SpacesOptions))\n  }\n  throw new Error(`Not supported provider: ${provider}`)\n}\n\nfunction s3Url(options: S3Options) {\n  let url: string\n  if (options.endpoint != null) {\n    url = `${options.endpoint}/${options.bucket}`\n  }\n  else if (options.bucket.includes(\".\")) {\n    if (options.region == null) {\n      throw new Error(`Bucket name \"${options.bucket}\" includes a dot, but S3 region is missing`)\n    }\n\n    // special case, see http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n    if (options.region === \"us-east-1\") {\n      url = `https://s3.amazonaws.com/${options.bucket}`\n    }\n    else {\n      url = `https://s3-${options.region}.amazonaws.com/${options.bucket}`\n    }\n  }\n  else if (options.region === \"cn-north-1\") {\n    url = `https://${options.bucket}.s3.${options.region}.amazonaws.com.cn`\n  }\n  else {\n    url = `https://${options.bucket}.s3.amazonaws.com`\n  }\n  return appendPath(url, options.path)\n}\n\nfunction appendPath(url: string, p: string | null | undefined): string {\n  if (p != null && p.length > 0) {\n    if (!p.startsWith(\"/\")) {\n      url += \"/\"\n    }\n    url += p\n  }\n  return url\n}\n\nfunction spacesUrl(options: SpacesOptions) {\n  if (options.name == null) {\n    throw new Error(`name is missing`)\n  }\n  if (options.region == null) {\n    throw new Error(`region is missing`)\n  }\n  return appendPath(`https://${options.name}.${options.region}.digitaloceanspaces.com`, options.path)\n}\n\n/**\n * [Bintray](https://bintray.com/) options. Requires an API key. An API key can be obtained from the user [profile](https://bintray.com/profile/edit) page (\"Edit Your Profile\" -> API Key).\n * Define `BT_TOKEN` environment variable.\n */\nexport interface BintrayOptions extends PublishConfiguration {\n  /**\n   * The provider. Must be `bintray`.\n   */\n  readonly provider: \"bintray\"\n\n  /**\n   * The Bintray package name.\n   */\n  readonly package?: string | null\n\n  /**\n   * The Bintray repository name.\n   * @default generic\n   */\n  readonly repo?: string | null\n\n  /**\n   * The owner.\n   */\n  readonly owner?: string | null\n\n  /**\n   * The Bintray component (Debian only).\n   */\n  readonly component?: string | null\n\n  /**\n   * The Bintray distribution (Debian only).\n   * @default stable\n   */\n  readonly distribution?: string | null\n\n  /**\n   * The Bintray user account. Used in cases where the owner is an organization.\n   */\n  readonly user?: string | null\n\n  readonly token?: string | null\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.parseDn = parseDn;

function parseDn(seq) {
  let quoted = false;
  let key = null;
  let token = "";
  let nextNonSpace = 0;
  seq = seq.trim();
  const result = new Map();

  for (let i = 0; i <= seq.length; i++) {
    if (i === seq.length) {
      if (key !== null) {
        result.set(key, token);
      }

      break;
    }

    const ch = seq[i];

    if (quoted) {
      if (ch === '"') {
        quoted = false;
        continue;
      }
    } else {
      if (ch === '"') {
        quoted = true;
        continue;
      }

      if (ch === "\\") {
        i++;
        const ord = parseInt(seq.slice(i, i + 2), 16);

        if (Number.isNaN(ord)) {
          token += seq[i];
        } else {
          i++;
          token += String.fromCharCode(ord);
        }

        continue;
      }

      if (key === null && ch === "=") {
        key = token;
        token = "";
        continue;
      }

      if (ch === "," || ch === ";" || ch === "+") {
        if (key !== null) {
          result.set(key, token);
        }

        key = null;
        token = "";
        continue;
      }
    }

    if (ch === " " && !quoted) {
      if (token.length === 0) {
        continue;
      }

      if (i > nextNonSpace) {
        let j = i;

        while (seq[j] === " ") {
          j++;
        }

        nextNonSpace = j;
      }

      if (nextNonSpace >= seq.length || seq[nextNonSpace] === "," || seq[nextNonSpace] === ";" || key === null && seq[nextNonSpace] === "=" || key !== null && seq[nextNonSpace] === "+") {
        i = nextNonSpace - 1;
        continue;
      }
    }

    token += ch;
  }

  return result;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=rfc2253Parser.js.map{"version":3,"sources":["../src/rfc2253Parser.ts"],"names":[],"mappings":";;;;;;;AAAM,SAAU,OAAV,CAAkB,GAAlB,EAA6B;AACjC,MAAI,MAAM,GAAG,KAAb;AACA,MAAI,GAAG,GAAkB,IAAzB;AACA,MAAI,KAAK,GAAG,EAAZ;AACA,MAAI,YAAY,GAAG,CAAnB;AAEA,EAAA,GAAG,GAAG,GAAG,CAAC,IAAJ,EAAN;AACA,QAAM,MAAM,GAAG,IAAI,GAAJ,EAAf;;AACA,OAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,IAAI,GAAG,CAAC,MAAzB,EAAiC,CAAC,EAAlC,EAAsC;AACpC,QAAI,CAAC,KAAK,GAAG,CAAC,MAAd,EAAsB;AACpB,UAAI,GAAG,KAAK,IAAZ,EAAkB;AAChB,QAAA,MAAM,CAAC,GAAP,CAAW,GAAX,EAAgB,KAAhB;AACD;;AACD;AACD;;AAED,UAAM,EAAE,GAAG,GAAG,CAAC,CAAD,CAAd;;AACA,QAAI,MAAJ,EAAY;AACV,UAAI,EAAE,KAAK,GAAX,EAAgB;AACd,QAAA,MAAM,GAAG,KAAT;AACA;AACD;AACF,KALD,MAMK;AACH,UAAI,EAAE,KAAK,GAAX,EAAgB;AACd,QAAA,MAAM,GAAG,IAAT;AACA;AACD;;AAED,UAAI,EAAE,KAAK,IAAX,EAAiB;AACf,QAAA,CAAC;AACD,cAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAJ,CAAU,CAAV,EAAa,CAAC,GAAG,CAAjB,CAAD,EAAsB,EAAtB,CAApB;;AACA,YAAI,MAAM,CAAC,KAAP,CAAa,GAAb,CAAJ,EAAuB;AACrB,UAAA,KAAK,IAAI,GAAG,CAAC,CAAD,CAAZ;AACD,SAFD,MAGK;AACH,UAAA,CAAC;AACD,UAAA,KAAK,IAAI,MAAM,CAAC,YAAP,CAAoB,GAApB,CAAT;AACD;;AACD;AACD;;AAED,UAAI,GAAG,KAAK,IAAR,IAAgB,EAAE,KAAK,GAA3B,EAAgC;AAC9B,QAAA,GAAG,GAAG,KAAN;AACA,QAAA,KAAK,GAAG,EAAR;AACA;AACD;;AAED,UAAI,EAAE,KAAK,GAAP,IAAc,EAAE,KAAK,GAArB,IAA4B,EAAE,KAAK,GAAvC,EAA4C;AAC1C,YAAI,GAAG,KAAK,IAAZ,EAAkB;AAChB,UAAA,MAAM,CAAC,GAAP,CAAW,GAAX,EAAgB,KAAhB;AACD;;AACD,QAAA,GAAG,GAAG,IAAN;AACA,QAAA,KAAK,GAAG,EAAR;AACA;AACD;AACF;;AAED,QAAI,EAAE,KAAK,GAAP,IAAc,CAAC,MAAnB,EAA2B;AACzB,UAAI,KAAK,CAAC,MAAN,KAAiB,CAArB,EAAwB;AACtB;AACD;;AAED,UAAI,CAAC,GAAG,YAAR,EAAsB;AACpB,YAAI,CAAC,GAAG,CAAR;;AACA,eAAO,GAAG,CAAC,CAAD,CAAH,KAAW,GAAlB,EAAuB;AACrB,UAAA,CAAC;AACF;;AACD,QAAA,YAAY,GAAG,CAAf;AACD;;AAED,UAAI,YAAY,IAAI,GAAG,CAAC,MAApB,IACC,GAAG,CAAC,YAAD,CAAH,KAAsB,GADvB,IAEC,GAAG,CAAC,YAAD,CAAH,KAAsB,GAFvB,IAGE,GAAG,KAAK,IAAR,IAAgB,GAAG,CAAC,YAAD,CAAH,KAAsB,GAHxC,IAIE,GAAG,KAAK,IAAR,IAAgB,GAAG,CAAC,YAAD,CAAH,KAAsB,GAJ5C,EAKE;AACA,QAAA,CAAC,GAAG,YAAY,GAAG,CAAnB;AACA;AACD;AACF;;AAED,IAAA,KAAK,IAAI,EAAT;AACD;;AAED,SAAO,MAAP;AACD,C","sourcesContent":["export function parseDn(seq: string): Map<string, string> {\n  let quoted = false\n  let key: string | null = null\n  let token = \"\"\n  let nextNonSpace = 0\n\n  seq = seq.trim()\n  const result = new Map<string, string>()\n  for (let i = 0; i <= seq.length; i++) {\n    if (i === seq.length) {\n      if (key !== null) {\n        result.set(key, token)\n      }\n      break\n    }\n\n    const ch = seq[i]\n    if (quoted) {\n      if (ch === '\"') {\n        quoted = false\n        continue\n      }\n    }\n    else {\n      if (ch === '\"') {\n        quoted = true\n        continue\n      }\n\n      if (ch === \"\\\\\") {\n        i++\n        const ord = parseInt(seq.slice(i, i + 2), 16)\n        if (Number.isNaN(ord)) {\n          token += seq[i]\n        }\n        else {\n          i++\n          token += String.fromCharCode(ord)\n        }\n        continue\n      }\n\n      if (key === null && ch === \"=\") {\n        key = token\n        token = \"\"\n        continue\n      }\n\n      if (ch === \",\" || ch === \";\" || ch === \"+\") {\n        if (key !== null) {\n          result.set(key, token)\n        }\n        key = null\n        token = \"\"\n        continue\n      }\n    }\n\n    if (ch === \" \" && !quoted) {\n      if (token.length === 0) {\n        continue\n      }\n\n      if (i > nextNonSpace) {\n        let j = i\n        while (seq[j] === \" \") {\n          j++\n        }\n        nextNonSpace = j\n      }\n\n      if (nextNonSpace >= seq.length\n        || seq[nextNonSpace] === \",\"\n        || seq[nextNonSpace] === \";\"\n        || (key === null && seq[nextNonSpace] === \"=\")\n        || (key !== null && seq[nextNonSpace] === \"+\")\n      ) {\n        i = nextNonSpace - 1\n        continue\n      }\n    }\n\n    token += ch\n  }\n\n  return result\n}"],"sourceRoot":""}
"use strict";
// __ts-babel@6.0.4
//# sourceMappingURL=updateInfo.js.map{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.nil = exports.UUID = void 0;

function _crypto() {
  const data = require("crypto");

  _crypto = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("./index");

  _index = function () {
    return data;
  };

  return data;
}

const invalidName = "options.name must be either a string or a Buffer"; // Node ID according to rfc4122#section-4.5

const randomHost = (0, _crypto().randomBytes)(16);
randomHost[0] = randomHost[0] | 0x01; // lookup table hex to byte

const hex2byte = {}; // lookup table byte to hex

const byte2hex = []; // populate lookup tables

for (let i = 0; i < 256; i++) {
  const hex = (i + 0x100).toString(16).substr(1);
  hex2byte[hex] = i;
  byte2hex[i] = hex;
} // UUID class


class UUID {
  constructor(uuid) {
    this.ascii = null;
    this.binary = null;
    const check = UUID.check(uuid);

    if (!check) {
      throw new Error("not a UUID");
    }

    this.version = check.version;

    if (check.format === "ascii") {
      this.ascii = uuid;
    } else {
      this.binary = uuid;
    }
  }

  static v5(name, namespace) {
    return uuidNamed(name, "sha1", 0x50, namespace);
  }

  toString() {
    if (this.ascii == null) {
      this.ascii = stringify(this.binary);
    }

    return this.ascii;
  }

  inspect() {
    return `UUID v${this.version} ${this.toString()}`;
  }

  static check(uuid, offset = 0) {
    if (typeof uuid === "string") {
      uuid = uuid.toLowerCase();

      if (!/^[a-f0-9]{8}(-[a-f0-9]{4}){3}-([a-f0-9]{12})$/.test(uuid)) {
        return false;
      }

      if (uuid === "00000000-0000-0000-0000-000000000000") {
        return {
          version: undefined,
          variant: "nil",
          format: "ascii"
        };
      }

      return {
        version: (hex2byte[uuid[14] + uuid[15]] & 0xf0) >> 4,
        variant: getVariant((hex2byte[uuid[19] + uuid[20]] & 0xe0) >> 5),
        format: "ascii"
      };
    }

    if (Buffer.isBuffer(uuid)) {
      if (uuid.length < offset + 16) {
        return false;
      }

      let i = 0;

      for (; i < 16; i++) {
        if (uuid[offset + i] !== 0) {
          break;
        }
      }

      if (i === 16) {
        return {
          version: undefined,
          variant: "nil",
          format: "binary"
        };
      }

      return {
        version: (uuid[offset + 6] & 0xf0) >> 4,
        variant: getVariant((uuid[offset + 8] & 0xe0) >> 5),
        format: "binary"
      };
    }

    throw (0, _index().newError)("Unknown type of uuid", "ERR_UNKNOWN_UUID_TYPE");
  } // read stringified uuid into a Buffer


  static parse(input) {
    const buffer = Buffer.allocUnsafe(16);
    let j = 0;

    for (let i = 0; i < 16; i++) {
      buffer[i] = hex2byte[input[j++] + input[j++]];

      if (i === 3 || i === 5 || i === 7 || i === 9) {
        j += 1;
      }
    }

    return buffer;
  }

} // from rfc4122#appendix-C


exports.UUID = UUID;
UUID.OID = UUID.parse("6ba7b812-9dad-11d1-80b4-00c04fd430c8"); // according to rfc4122#section-4.1.1

function getVariant(bits) {
  switch (bits) {
    case 0:
    case 1:
    case 3:
      return "ncs";

    case 4:
    case 5:
      return "rfc4122";

    case 6:
      return "microsoft";

    default:
      return "future";
  }
}

var UuidEncoding;

(function (UuidEncoding) {
  UuidEncoding[UuidEncoding["ASCII"] = 0] = "ASCII";
  UuidEncoding[UuidEncoding["BINARY"] = 1] = "BINARY";
  UuidEncoding[UuidEncoding["OBJECT"] = 2] = "OBJECT";
})(UuidEncoding || (UuidEncoding = {})); // v3 + v5


function uuidNamed(name, hashMethod, version, namespace, encoding = UuidEncoding.ASCII) {
  const hash = (0, _crypto().createHash)(hashMethod);
  const nameIsNotAString = typeof name !== "string";

  if (nameIsNotAString && !Buffer.isBuffer(name)) {
    throw (0, _index().newError)(invalidName, "ERR_INVALID_UUID_NAME");
  }

  hash.update(namespace);
  hash.update(name);
  const buffer = hash.digest();
  let result;

  switch (encoding) {
    case UuidEncoding.BINARY:
      buffer[6] = buffer[6] & 0x0f | version;
      buffer[8] = buffer[8] & 0x3f | 0x80;
      result = buffer;
      break;

    case UuidEncoding.OBJECT:
      buffer[6] = buffer[6] & 0x0f | version;
      buffer[8] = buffer[8] & 0x3f | 0x80;
      result = new UUID(buffer);
      break;

    default:
      result = byte2hex[buffer[0]] + byte2hex[buffer[1]] + byte2hex[buffer[2]] + byte2hex[buffer[3]] + "-" + byte2hex[buffer[4]] + byte2hex[buffer[5]] + "-" + byte2hex[buffer[6] & 0x0f | version] + byte2hex[buffer[7]] + "-" + byte2hex[buffer[8] & 0x3f | 0x80] + byte2hex[buffer[9]] + "-" + byte2hex[buffer[10]] + byte2hex[buffer[11]] + byte2hex[buffer[12]] + byte2hex[buffer[13]] + byte2hex[buffer[14]] + byte2hex[buffer[15]];
      break;
  }

  return result;
}

function stringify(buffer) {
  return byte2hex[buffer[0]] + byte2hex[buffer[1]] + byte2hex[buffer[2]] + byte2hex[buffer[3]] + "-" + byte2hex[buffer[4]] + byte2hex[buffer[5]] + "-" + byte2hex[buffer[6]] + byte2hex[buffer[7]] + "-" + byte2hex[buffer[8]] + byte2hex[buffer[9]] + "-" + byte2hex[buffer[10]] + byte2hex[buffer[11]] + byte2hex[buffer[12]] + byte2hex[buffer[13]] + byte2hex[buffer[14]] + byte2hex[buffer[15]];
} // according to rfc4122#section-4.1.7


const nil = new UUID("00000000-0000-0000-0000-000000000000"); // UUID.v4 = uuidRandom
// UUID.v4fast = uuidRandomFast
// UUID.v3 = function(options, callback) {
//     return uuidNamed("md5", 0x30, options, callback)
// }
exports.nil = nil;
// __ts-babel@6.0.4
//# sourceMappingURL=uuid.js.map{"version":3,"sources":["../src/uuid.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from \"crypto\"\nimport { newError } from \"./index\"\n\nconst invalidName = \"options.name must be either a string or a Buffer\"\n\n// Node ID according to rfc4122#section-4.5\nconst randomHost = randomBytes(16)\nrandomHost[0] = randomHost[0] | 0x01\n\n// lookup table hex to byte\nconst hex2byte: any = {}\n\n// lookup table byte to hex\nconst byte2hex: Array<string> = []\n// populate lookup tables\nfor (let i = 0; i < 256; i++) {\n    const hex = (i + 0x100).toString(16).substr(1)\n    hex2byte[hex] = i\n    byte2hex[i] = hex\n}\n\n// UUID class\nexport class UUID {\n  private ascii: string | null = null\n  private readonly binary: Buffer | null = null\n  private readonly version: number\n\n  // from rfc4122#appendix-C\n  static readonly OID = UUID.parse(\"6ba7b812-9dad-11d1-80b4-00c04fd430c8\")\n\n  constructor(uuid: Buffer | string) {\n    const check = UUID.check(uuid)\n    if (!check) {\n      throw new Error(\"not a UUID\")\n    }\n\n    this.version = check.version!!\n\n    if (check.format === \"ascii\") {\n      this.ascii = uuid as string\n    }\n    else {\n      this.binary = uuid as Buffer\n    }\n  }\n\n  static v5(name: string | Buffer, namespace: Buffer) {\n    return uuidNamed(name, \"sha1\", 0x50, namespace)\n  }\n\n  toString() {\n    if (this.ascii == null) {\n      this.ascii = stringify(this.binary!!)\n    }\n    return this.ascii\n  }\n\n  inspect() {\n    return `UUID v${this.version} ${this.toString()}`\n  }\n\n  static check(uuid: Buffer | string, offset: number = 0) {\n    if (typeof uuid === \"string\") {\n      uuid = uuid.toLowerCase()\n\n      if (!/^[a-f0-9]{8}(-[a-f0-9]{4}){3}-([a-f0-9]{12})$/.test(uuid)) {\n        return false\n      }\n\n      if (uuid === \"00000000-0000-0000-0000-000000000000\") {\n        return {version: undefined, variant: \"nil\", format: \"ascii\"}\n      }\n\n      return {\n        version: (hex2byte[uuid[14] + uuid[15]] & 0xf0) >> 4,\n        variant: getVariant((hex2byte[uuid[19] + uuid[20]] & 0xe0) >> 5),\n        format: \"ascii\"\n      }\n    }\n\n    if (Buffer.isBuffer(uuid)) {\n      if (uuid.length < offset + 16) {\n        return false\n      }\n\n      let i = 0\n      for (; i < 16; i++) {\n        if (uuid[offset + i] !== 0) {\n          break\n        }\n      }\n      if (i === 16) {\n        return {version: undefined, variant: \"nil\", format: \"binary\"}\n      }\n\n      return {\n        version: (uuid[offset + 6] & 0xf0) >> 4,\n        variant: getVariant((uuid[offset + 8] & 0xe0) >> 5),\n        format: \"binary\"\n      }\n    }\n\n    throw newError(\"Unknown type of uuid\", \"ERR_UNKNOWN_UUID_TYPE\")\n  }\n\n  // read stringified uuid into a Buffer\n  static parse(input: string) {\n    const buffer = Buffer.allocUnsafe(16)\n    let j = 0\n    for (let i = 0; i < 16; i++) {\n      buffer[i] = hex2byte[input[j++] + input[j++]]\n      if (i === 3 || i === 5 || i === 7 || i === 9) {\n        j += 1\n      }\n    }\n    return buffer\n  }\n}\n\n// according to rfc4122#section-4.1.1\nfunction getVariant(bits: number) {\n  switch (bits) {\n    case 0:\n    case 1:\n    case 3:\n      return \"ncs\"\n    case 4:\n    case 5:\n      return \"rfc4122\"\n    case 6:\n      return \"microsoft\"\n    default:\n      return \"future\"\n  }\n}\n\nenum UuidEncoding {\n  ASCII, BINARY, OBJECT\n}\n\n// v3 + v5\nfunction uuidNamed(name: string | Buffer, hashMethod: string, version: number, namespace: Buffer, encoding: UuidEncoding = UuidEncoding.ASCII) {\n  const hash = createHash(hashMethod)\n\n  const nameIsNotAString = typeof name !== \"string\"\n  if (nameIsNotAString && !Buffer.isBuffer(name)) {\n    throw newError(invalidName, \"ERR_INVALID_UUID_NAME\")\n  }\n\n  hash.update(namespace)\n  hash.update(name)\n\n  const buffer = hash.digest()\n  let result: any\n  switch (encoding) {\n    case UuidEncoding.BINARY:\n      buffer[6] = (buffer[6] & 0x0f) | version\n      buffer[8] = (buffer[8] & 0x3f) | 0x80\n      result = buffer\n      break\n    case UuidEncoding.OBJECT:\n      buffer[6] = (buffer[6] & 0x0f) | version\n      buffer[8] = (buffer[8] & 0x3f) | 0x80\n      result = new UUID(buffer)\n      break\n    default:\n      result = byte2hex[buffer[0]] + byte2hex[buffer[1]] +\n        byte2hex[buffer[2]] + byte2hex[buffer[3]] + \"-\" +\n        byte2hex[buffer[4]] + byte2hex[buffer[5]] + \"-\" +\n        byte2hex[(buffer[6] & 0x0f) | version] +\n        byte2hex[buffer[7]] + \"-\" +\n        byte2hex[(buffer[8] & 0x3f) | 0x80] +\n        byte2hex[buffer[9]] + \"-\" +\n        byte2hex[buffer[10]] + byte2hex[buffer[11]] +\n        byte2hex[buffer[12]] + byte2hex[buffer[13]] +\n        byte2hex[buffer[14]] + byte2hex[buffer[15]]\n      break\n  }\n  return result\n}\n\nfunction stringify(buffer: Buffer) {\n  return byte2hex[buffer[0]] + byte2hex[buffer[1]] +\n    byte2hex[buffer[2]] + byte2hex[buffer[3]] + \"-\" +\n    byte2hex[buffer[4]] + byte2hex[buffer[5]] + \"-\" +\n    byte2hex[buffer[6]] + byte2hex[buffer[7]] + \"-\" +\n    byte2hex[buffer[8]] + byte2hex[buffer[9]] + \"-\" +\n    byte2hex[buffer[10]] + byte2hex[buffer[11]] +\n    byte2hex[buffer[12]] + byte2hex[buffer[13]] +\n    byte2hex[buffer[14]] + byte2hex[buffer[15]]\n}\n\n// according to rfc4122#section-4.1.7\nexport const nil = new UUID(\"00000000-0000-0000-0000-000000000000\")\n\n// UUID.v4 = uuidRandom\n\n// UUID.v4fast = uuidRandomFast\n\n// UUID.v3 = function(options, callback) {\n//     return uuidNamed(\"md5\", 0x30, options, callback)\n// }"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.parseXml = parseXml;
exports.XElement = void 0;

function sax() {
  const data = _interopRequireWildcard(require("sax"));

  sax = function () {
    return data;
  };

  return data;
}

function _index() {
  const data = require("./index");

  _index = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class XElement {
  constructor(name) {
    this.name = name;
    this.value = "";
    this.attributes = null;
    this.isCData = false;
    this.elements = null;

    if (!name) {
      throw (0, _index().newError)("Element name cannot be empty", "ERR_XML_ELEMENT_NAME_EMPTY");
    }

    if (!isValidName(name)) {
      throw (0, _index().newError)(`Invalid element name: ${name}`, "ERR_XML_ELEMENT_INVALID_NAME");
    }
  }

  attribute(name) {
    const result = this.attributes === null ? null : this.attributes[name];

    if (result == null) {
      throw (0, _index().newError)(`No attribute "${name}"`, "ERR_XML_MISSED_ATTRIBUTE");
    }

    return result;
  }

  removeAttribute(name) {
    if (this.attributes !== null) {
      delete this.attributes[name];
    }
  }

  element(name, ignoreCase = false, errorIfMissed = null) {
    const result = this.elementOrNull(name, ignoreCase);

    if (result === null) {
      throw (0, _index().newError)(errorIfMissed || `No element "${name}"`, "ERR_XML_MISSED_ELEMENT");
    }

    return result;
  }

  elementOrNull(name, ignoreCase = false) {
    if (this.elements === null) {
      return null;
    }

    for (const element of this.elements) {
      if (isNameEquals(element, name, ignoreCase)) {
        return element;
      }
    }

    return null;
  }

  getElements(name, ignoreCase = false) {
    if (this.elements === null) {
      return [];
    }

    return this.elements.filter(it => isNameEquals(it, name, ignoreCase));
  }

  elementValueOrEmpty(name, ignoreCase = false) {
    const element = this.elementOrNull(name, ignoreCase);
    return element === null ? "" : element.value;
  }

}

exports.XElement = XElement;
const NAME_REG_EXP = new RegExp(/^[A-Za-z_][:A-Za-z0-9_-]*$/i);

function isValidName(name) {
  return NAME_REG_EXP.test(name);
}

function isNameEquals(element, name, ignoreCase) {
  const elementName = element.name;
  return elementName === name || ignoreCase === true && elementName.length === name.length && elementName.toLowerCase() === name.toLowerCase();
}

function parseXml(data) {
  let rootElement = null;
  const parser = sax().parser(true, {});
  const elements = [];

  parser.onopentag = saxElement => {
    const element = new XElement(saxElement.name);
    element.attributes = saxElement.attributes;

    if (rootElement === null) {
      rootElement = element;
    } else {
      const parent = elements[elements.length - 1];

      if (parent.elements == null) {
        parent.elements = [];
      }

      parent.elements.push(element);
    }

    elements.push(element);
  };

  parser.onclosetag = () => {
    elements.pop();
  };

  parser.ontext = text => {
    if (elements.length > 0) {
      elements[elements.length - 1].value = text;
    }
  };

  parser.oncdata = cdata => {
    const element = elements[elements.length - 1];
    element.value = cdata;
    element.isCData = true;
  };

  parser.onerror = err => {
    throw err;
  };

  parser.write(data);
  return rootElement;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=xml.js.map{"version":3,"sources":["../src/xml.ts"],"names":[],"mappings":"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","sourcesContent":["import * as sax from \"sax\"\nimport { newError } from \"./index\"\n\nexport class XElement {\n  value = \"\"\n  attributes: { [key: string]: string } | null = null\n  isCData = false\n  elements: Array<XElement> | null = null\n\n  constructor(readonly name: string) {\n    if (!name) {\n      throw newError(\"Element name cannot be empty\", \"ERR_XML_ELEMENT_NAME_EMPTY\")\n    }\n    if (!isValidName(name)) {\n      throw newError(`Invalid element name: ${name}`, \"ERR_XML_ELEMENT_INVALID_NAME\")\n    }\n  }\n\n  attribute(name: string): string {\n    const result = this.attributes === null ? null : this.attributes[name]\n    if (result == null) {\n      throw newError(`No attribute \"${name}\"`, \"ERR_XML_MISSED_ATTRIBUTE\")\n    }\n    return result\n  }\n\n  removeAttribute(name: string): void {\n    if (this.attributes !== null) {\n      delete this.attributes[name]\n    }\n  }\n\n  element(name: string, ignoreCase = false, errorIfMissed: string | null = null): XElement {\n    const result = this.elementOrNull(name, ignoreCase)\n    if (result === null) {\n      throw newError(errorIfMissed || `No element \"${name}\"`, \"ERR_XML_MISSED_ELEMENT\")\n    }\n    return result\n  }\n\n  elementOrNull(name: string, ignoreCase = false): XElement | null {\n    if (this.elements === null) {\n      return null\n    }\n\n    for (const element of this.elements) {\n      if (isNameEquals(element, name, ignoreCase)) {\n        return element\n      }\n    }\n\n    return null\n  }\n\n  getElements(name: string, ignoreCase = false) {\n    if (this.elements === null) {\n      return []\n    }\n    return this.elements.filter(it => isNameEquals(it, name, ignoreCase))\n  }\n\n  elementValueOrEmpty(name: string, ignoreCase = false): string {\n    const element = this.elementOrNull(name, ignoreCase)\n    return element === null ? \"\" : element.value\n  }\n}\n\nconst NAME_REG_EXP = new RegExp(/^[A-Za-z_][:A-Za-z0-9_-]*$/i)\n\nfunction isValidName(name: string) {\n  return (NAME_REG_EXP.test(name))\n}\n\nfunction isNameEquals(element: XElement, name: string, ignoreCase: boolean) {\n  const elementName = element.name\n  return elementName === name || (ignoreCase === true && elementName.length === name.length && elementName.toLowerCase() === name.toLowerCase())\n}\n\nexport function parseXml(data: string): XElement {\n  let rootElement: XElement | null = null\n  const parser = sax.parser(true, {})\n  const elements: Array<XElement> = []\n\n  parser.onopentag = saxElement => {\n    const element = new XElement(saxElement.name)\n    element.attributes = saxElement.attributes as { [key: string]: string }\n\n    if (rootElement === null) {\n      rootElement = element\n    }\n    else {\n      const parent = elements[elements.length - 1]\n      if (parent.elements == null) {\n        parent.elements = []\n      }\n      parent.elements.push(element)\n    }\n    elements.push(element)\n  }\n\n  parser.onclosetag = () => {\n    elements.pop()\n  }\n\n  parser.ontext = text => {\n    if (elements.length > 0) {\n      elements[elements.length - 1].value = text\n    }\n  }\n\n  parser.oncdata = cdata => {\n    const element = elements[elements.length - 1]\n    element.value = cdata\n    element.isCData = true\n  }\n\n  parser.onerror = err => {\n    throw err\n  }\n\n  parser.write(data)\n  return rootElement!!\n}"],"sourceRoot":""}
MIT License

Copyright (c) 2017 Luke Childs

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "author": {
    "name": "Luke Childs",
    "email": "lukechilds123@gmail.com",
    "url": "http://lukechilds.co.uk"
  },
  "dependencies": {
    "clone-response": "^1.0.2",
    "get-stream": "^5.1.0",
    "http-cache-semantics": "^4.0.0",
    "keyv": "^3.0.0",
    "lowercase-keys": "^2.0.0",
    "normalize-url": "^4.1.0",
    "responselike": "^1.0.2"
  },
  "deprecated": false,
  "description": "Wrap native HTTP requests with RFC compliant cache support",
  "devDependencies": {
    "@keyv/sqlite": "^2.0.0",
    "ava": "^1.1.0",
    "coveralls": "^3.0.0",
    "create-test-server": "3.0.0",
    "delay": "^4.0.0",
    "eslint-config-xo-lukechilds": "^1.0.0",
    "nyc": "^14.1.1",
    "pify": "^4.0.0",
    "sqlite3": "^4.0.2",
    "this": "^1.0.2",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "src"
  ],
  "homepage": "https://github.com/lukechilds/cacheable-request#readme",
  "license": "MIT",
  "main": "src/index.js",
  "name": "cacheable-request",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/lukechilds/cacheable-request.git"
  },
  "version": "6.1.0"
}'use strict';

const EventEmitter = require('events');
const urlLib = require('url');
const normalizeUrl = require('normalize-url');
const getStream = require('get-stream');
const CachePolicy = require('http-cache-semantics');
const Response = require('responselike');
const lowercaseKeys = require('lowercase-keys');
const cloneResponse = require('clone-response');
const Keyv = require('keyv');

class CacheableRequest {
	constructor(request, cacheAdapter) {
		if (typeof request !== 'function') {
			throw new TypeError('Parameter `request` must be a function');
		}

		this.cache = new Keyv({
			uri: typeof cacheAdapter === 'string' && cacheAdapter,
			store: typeof cacheAdapter !== 'string' && cacheAdapter,
			namespace: 'cacheable-request'
		});

		return this.createCacheableRequest(request);
	}

	createCacheableRequest(request) {
		return (opts, cb) => {
			let url;
			if (typeof opts === 'string') {
				url = normalizeUrlObject(urlLib.parse(opts));
				opts = {};
			} else if (opts instanceof urlLib.URL) {
				url = normalizeUrlObject(urlLib.parse(opts.toString()));
				opts = {};
			} else {
				const [pathname, ...searchParts] = (opts.path || '').split('?');
				const search = searchParts.length > 0 ?
					`?${searchParts.join('?')}` :
					'';
				url = normalizeUrlObject({ ...opts, pathname, search });
			}

			opts = {
				headers: {},
				method: 'GET',
				cache: true,
				strictTtl: false,
				automaticFailover: false,
				...opts,
				...urlObjectToRequestOptions(url)
			};
			opts.headers = lowercaseKeys(opts.headers);

			const ee = new EventEmitter();
			const normalizedUrlString = normalizeUrl(
				urlLib.format(url),
				{
					stripWWW: false,
					removeTrailingSlash: false,
					stripAuthentication: false
				}
			);
			const key = `${opts.method}:${normalizedUrlString}`;
			let revalidate = false;
			let madeRequest = false;

			const makeRequest = opts => {
				madeRequest = true;
				let requestErrored = false;
				let requestErrorCallback;

				const requestErrorPromise = new Promise(resolve => {
					requestErrorCallback = () => {
						if (!requestErrored) {
							requestErrored = true;
							resolve();
						}
					};
				});

				const handler = response => {
					if (revalidate && !opts.forceRefresh) {
						response.status = response.statusCode;
						const revalidatedPolicy = CachePolicy.fromObject(revalidate.cachePolicy).revalidatedPolicy(opts, response);
						if (!revalidatedPolicy.modified) {
							const headers = revalidatedPolicy.policy.responseHeaders();
							response = new Response(revalidate.statusCode, headers, revalidate.body, revalidate.url);
							response.cachePolicy = revalidatedPolicy.policy;
							response.fromCache = true;
						}
					}

					if (!response.fromCache) {
						response.cachePolicy = new CachePolicy(opts, response, opts);
						response.fromCache = false;
					}

					let clonedResponse;
					if (opts.cache && response.cachePolicy.storable()) {
						clonedResponse = cloneResponse(response);

						(async () => {
							try {
								const bodyPromise = getStream.buffer(response);

								await Promise.race([
									requestErrorPromise,
									new Promise(resolve => response.once('end', resolve))
								]);

								if (requestErrored) {
									return;
								}

								const body = await bodyPromise;

								const value = {
									cachePolicy: response.cachePolicy.toObject(),
									url: response.url,
									statusCode: response.fromCache ? revalidate.statusCode : response.statusCode,
									body
								};

								let ttl = opts.strictTtl ? response.cachePolicy.timeToLive() : undefined;
								if (opts.maxTtl) {
									ttl = ttl ? Math.min(ttl, opts.maxTtl) : opts.maxTtl;
								}

								await this.cache.set(key, value, ttl);
							} catch (error) {
								ee.emit('error', new CacheableRequest.CacheError(error));
							}
						})();
					} else if (opts.cache && revalidate) {
						(async () => {
							try {
								await this.cache.delete(key);
							} catch (error) {
								ee.emit('error', new CacheableRequest.CacheError(error));
							}
						})();
					}

					ee.emit('response', clonedResponse || response);
					if (typeof cb === 'function') {
						cb(clonedResponse || response);
					}
				};

				try {
					const req = request(opts, handler);
					req.once('error', requestErrorCallback);
					req.once('abort', requestErrorCallback);
					ee.emit('request', req);
				} catch (error) {
					ee.emit('error', new CacheableRequest.RequestError(error));
				}
			};

			(async () => {
				const get = async opts => {
					await Promise.resolve();

					const cacheEntry = opts.cache ? await this.cache.get(key) : undefined;
					if (typeof cacheEntry === 'undefined') {
						return makeRequest(opts);
					}

					const policy = CachePolicy.fromObject(cacheEntry.cachePolicy);
					if (policy.satisfiesWithoutRevalidation(opts) && !opts.forceRefresh) {
						const headers = policy.responseHeaders();
						const response = new Response(cacheEntry.statusCode, headers, cacheEntry.body, cacheEntry.url);
						response.cachePolicy = policy;
						response.fromCache = true;

						ee.emit('response', response);
						if (typeof cb === 'function') {
							cb(response);
						}
					} else {
						revalidate = cacheEntry;
						opts.headers = policy.revalidationHeaders(opts);
						makeRequest(opts);
					}
				};

				const errorHandler = error => ee.emit('error', new CacheableRequest.CacheError(error));
				this.cache.once('error', errorHandler);
				ee.on('response', () => this.cache.removeListener('error', errorHandler));

				try {
					await get(opts);
				} catch (error) {
					if (opts.automaticFailover && !madeRequest) {
						makeRequest(opts);
					}

					ee.emit('error', new CacheableRequest.CacheError(error));
				}
			})();

			return ee;
		};
	}
}

function urlObjectToRequestOptions(url) {
	const options = { ...url };
	options.path = `${url.pathname || '/'}${url.search || ''}`;
	delete options.pathname;
	delete options.search;
	return options;
}

function normalizeUrlObject(url) {
	// If url was parsed by url.parse or new URL:
	// - hostname will be set
	// - host will be hostname[:port]
	// - port will be set if it was explicit in the parsed string
	// Otherwise, url was from request options:
	// - hostname or host may be set
	// - host shall not have port encoded
	return {
		protocol: url.protocol,
		auth: url.auth,
		hostname: url.hostname || url.host || 'localhost',
		port: url.port,
		pathname: url.pathname,
		search: url.search
	};
}

CacheableRequest.RequestError = class extends Error {
	constructor(error) {
		super(error.message);
		this.name = 'RequestError';
		Object.assign(this, error);
	}
};

CacheableRequest.CacheError = class extends Error {
	constructor(error) {
		super(error.message);
		this.name = 'CacheError';
		Object.assign(this, error);
	}
};

module.exports = CacheableRequest;
'use strict';

function preserveCamelCase(str) {
	var isLastCharLower = false;

	for (var i = 0; i < str.length; i++) {
		var c = str.charAt(i);

		if (isLastCharLower && (/[a-zA-Z]/).test(c) && c.toUpperCase() === c) {
			str = str.substr(0, i) + '-' + str.substr(i);
			isLastCharLower = false;
			i++;
		} else {
			isLastCharLower = (c.toLowerCase() === c);
		}
	}

	return str;
}

module.exports = function () {
	var str = [].map.call(arguments, function (str) {
		return str.trim();
	}).filter(function (str) {
		return str.length;
	}).join('-');

	if (!str.length) {
		return '';
	}

	if (str.length === 1) {
		return str;
	}

	if (!(/[_.\- ]+/).test(str)) {
		if (str === str.toUpperCase()) {
			return str.toLowerCase();
		}

		if (str[0] !== str[0].toLowerCase()) {
			return str[0].toLowerCase() + str.slice(1);
		}

		return str;
	}

	str = preserveCamelCase(str);

	return str
	.replace(/^[_.\- ]+/, '')
	.toLowerCase()
	.replace(/[_.\- ]+(\w|$)/g, function (m, p1) {
		return p1.toUpperCase();
	});
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "http://sindresorhus.com"
  },
  "deprecated": false,
  "description": "Convert a dash/dot/underscore/space separated string to camelCase: foo-bar â†’ fooBar",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/camelcase#readme",
  "license": "MIT",
  "name": "camelcase",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/camelcase.git"
  },
  "version": "2.1.1"
}'use strict';
var mapObj = require('map-obj');
var camelCase = require('camelcase');

module.exports = function (input, options) {
	options = options || {};
	var exclude = options.exclude || [];
	return mapObj(input, function (key, val) {
		key = exclude.indexOf(key) === -1 ? camelCase(key) : key;
		return [key, val];
	});
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "http://sindresorhus.com"
  },
  "dependencies": {
    "camelcase": "^2.0.0",
    "map-obj": "^1.0.0"
  },
  "deprecated": false,
  "description": "Convert object keys to camelCase",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/camelcase-keys#readme",
  "license": "MIT",
  "name": "camelcase-keys",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/camelcase-keys.git"
  },
  "version": "2.1.0"
}Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
You must give any other recipients of the Work or Derivative Works a copy of this License; and
You must cause any modified files to carry prominent notices stating that You changed the files; and
You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONSfunction Caseless (dict) {
  this.dict = dict || {}
}
Caseless.prototype.set = function (name, value, clobber) {
  if (typeof name === 'object') {
    for (var i in name) {
      this.set(i, name[i], value)
    }
  } else {
    if (typeof clobber === 'undefined') clobber = true
    var has = this.has(name)

    if (!clobber && has) this.dict[has] = this.dict[has] + ',' + value
    else this.dict[has || name] = value
    return has
  }
}
Caseless.prototype.has = function (name) {
  var keys = Object.keys(this.dict)
    , name = name.toLowerCase()
    ;
  for (var i=0;i<keys.length;i++) {
    if (keys[i].toLowerCase() === name) return keys[i]
  }
  return false
}
Caseless.prototype.get = function (name) {
  name = name.toLowerCase()
  var result, _key
  var headers = this.dict
  Object.keys(headers).forEach(function (key) {
    _key = key.toLowerCase()
    if (name === _key) result = headers[key]
  })
  return result
}
Caseless.prototype.swap = function (name) {
  var has = this.has(name)
  if (has === name) return
  if (!has) throw new Error('There is no header than matches "'+name+'"')
  this.dict[name] = this.dict[has]
  delete this.dict[has]
}
Caseless.prototype.del = function (name) {
  var has = this.has(name)
  return delete this.dict[has || name]
}

module.exports = function (dict) {return new Caseless(dict)}
module.exports.httpify = function (resp, headers) {
  var c = new Caseless(headers)
  resp.setHeader = function (key, value, clobber) {
    if (typeof value === 'undefined') return
    return c.set(key, value, clobber)
  }
  resp.hasHeader = function (key) {
    return c.has(key)
  }
  resp.getHeader = function (key) {
    return c.get(key)
  }
  resp.removeHeader = function (key) {
    return c.del(key)
  }
  resp.headers = c.dict
  return c
}
{
  "author": {
    "name": "Mikeal Rogers",
    "email": "mikeal.rogers@gmail.com"
  },
  "deprecated": false,
  "description": "Caseless object set/get/has, very useful when working with HTTP headers.",
  "devDependencies": {
    "tape": "^2.10.2"
  },
  "homepage": "https://github.com/mikeal/caseless#readme",
  "license": "Apache-2.0",
  "main": "index.js",
  "name": "caseless",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/mikeal/caseless.git"
  },
  "test": "node test.js",
  "version": "0.12.0"
}'use strict';
const escapeStringRegexp = require('escape-string-regexp');
const ansiStyles = require('ansi-styles');
const stdoutColor = require('supports-color').stdout;

const template = require('./templates.js');

const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm');

// `supportsColor.level` â†’ `ansiStyles.color[name]` mapping
const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m'];

// `color-convert` models to exclude from the Chalk API due to conflicts and such
const skipModels = new Set(['gray']);

const styles = Object.create(null);

function applyOptions(obj, options) {
	options = options || {};

	// Detect level if not set manually
	const scLevel = stdoutColor ? stdoutColor.level : 0;
	obj.level = options.level === undefined ? scLevel : options.level;
	obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0;
}

function Chalk(options) {
	// We check for this.template here since calling `chalk.constructor()`
	// by itself will have a `this` of a previously constructed chalk object
	if (!this || !(this instanceof Chalk) || this.template) {
		const chalk = {};
		applyOptions(chalk, options);

		chalk.template = function () {
			const args = [].slice.call(arguments);
			return chalkTag.apply(null, [chalk.template].concat(args));
		};

		Object.setPrototypeOf(chalk, Chalk.prototype);
		Object.setPrototypeOf(chalk.template, chalk);

		chalk.template.constructor = Chalk;

		return chalk.template;
	}

	applyOptions(this, options);
}

// Use bright blue on Windows as the normal blue color is illegible
if (isSimpleWindowsTerm) {
	ansiStyles.blue.open = '\u001B[94m';
}

for (const key of Object.keys(ansiStyles)) {
	ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');

	styles[key] = {
		get() {
			const codes = ansiStyles[key];
			return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key);
		}
	};
}

styles.visible = {
	get() {
		return build.call(this, this._styles || [], true, 'visible');
	}
};

ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g');
for (const model of Object.keys(ansiStyles.color.ansi)) {
	if (skipModels.has(model)) {
		continue;
	}

	styles[model] = {
		get() {
			const level = this.level;
			return function () {
				const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments);
				const codes = {
					open,
					close: ansiStyles.color.close,
					closeRe: ansiStyles.color.closeRe
				};
				return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
			};
		}
	};
}

ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g');
for (const model of Object.keys(ansiStyles.bgColor.ansi)) {
	if (skipModels.has(model)) {
		continue;
	}

	const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);
	styles[bgModel] = {
		get() {
			const level = this.level;
			return function () {
				const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments);
				const codes = {
					open,
					close: ansiStyles.bgColor.close,
					closeRe: ansiStyles.bgColor.closeRe
				};
				return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
			};
		}
	};
}

const proto = Object.defineProperties(() => {}, styles);

function build(_styles, _empty, key) {
	const builder = function () {
		return applyStyle.apply(builder, arguments);
	};

	builder._styles = _styles;
	builder._empty = _empty;

	const self = this;

	Object.defineProperty(builder, 'level', {
		enumerable: true,
		get() {
			return self.level;
		},
		set(level) {
			self.level = level;
		}
	});

	Object.defineProperty(builder, 'enabled', {
		enumerable: true,
		get() {
			return self.enabled;
		},
		set(enabled) {
			self.enabled = enabled;
		}
	});

	// See below for fix regarding invisible grey/dim combination on Windows
	builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey';

	// `__proto__` is used because we must return a function, but there is
	// no way to create a function with a different prototype
	builder.__proto__ = proto; // eslint-disable-line no-proto

	return builder;
}

function applyStyle() {
	// Support varags, but simply cast to string in case there's only one arg
	const args = arguments;
	const argsLen = args.length;
	let str = String(arguments[0]);

	if (argsLen === 0) {
		return '';
	}

	if (argsLen > 1) {
		// Don't slice `arguments`, it prevents V8 optimizations
		for (let a = 1; a < argsLen; a++) {
			str += ' ' + args[a];
		}
	}

	if (!this.enabled || this.level <= 0 || !str) {
		return this._empty ? '' : str;
	}

	// Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,
	// see https://github.com/chalk/chalk/issues/58
	// If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.
	const originalDim = ansiStyles.dim.open;
	if (isSimpleWindowsTerm && this.hasGrey) {
		ansiStyles.dim.open = '';
	}

	for (const code of this._styles.slice().reverse()) {
		// Replace any instances already present with a re-opening code
		// otherwise only the part of the string until said closing code
		// will be colored, and the rest will simply be 'plain'.
		str = code.open + str.replace(code.closeRe, code.open) + code.close;

		// Close the styling before a linebreak and reopen
		// after next line to fix a bleed issue on macOS
		// https://github.com/chalk/chalk/pull/92
		str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`);
	}

	// Reset the original `dim` if we changed it to work around the Windows dimmed gray issue
	ansiStyles.dim.open = originalDim;

	return str;
}

function chalkTag(chalk, strings) {
	if (!Array.isArray(strings)) {
		// If chalk() was called by itself or with a string,
		// return the string itself as a string.
		return [].slice.call(arguments, 1).join(' ');
	}

	const args = [].slice.call(arguments, 2);
	const parts = [strings.raw[0]];

	for (let i = 1; i < strings.length; i++) {
		parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&'));
		parts.push(String(strings.raw[i]));
	}

	return template(chalk, parts.join(''));
}

Object.defineProperties(Chalk.prototype, styles);

module.exports = Chalk(); // eslint-disable-line new-cap
module.exports.supportsColor = stdoutColor;
module.exports.default = module.exports; // For TypeScript
// @flow strict

type TemplateStringsArray = $ReadOnlyArray<string>;

export type Level = $Values<{
	None: 0,
	Basic: 1,
	Ansi256: 2,
	TrueColor: 3
}>;

export type ChalkOptions = {|
	enabled?: boolean,
	level?: Level
|};

export type ColorSupport = {|
	level: Level,
	hasBasic: boolean,
	has256: boolean,
	has16m: boolean
|};

export interface Chalk {
	(...text: string[]): string,
	(text: TemplateStringsArray, ...placeholders: string[]): string,
	constructor(options?: ChalkOptions): Chalk,
	enabled: boolean,
	level: Level,
	rgb(r: number, g: number, b: number): Chalk,
	hsl(h: number, s: number, l: number): Chalk,
	hsv(h: number, s: number, v: number): Chalk,
	hwb(h: number, w: number, b: number): Chalk,
	bgHex(color: string): Chalk,
	bgKeyword(color: string): Chalk,
	bgRgb(r: number, g: number, b: number): Chalk,
	bgHsl(h: number, s: number, l: number): Chalk,
	bgHsv(h: number, s: number, v: number): Chalk,
	bgHwb(h: number, w: number, b: number): Chalk,
	hex(color: string): Chalk,
	keyword(color: string): Chalk,

	+reset: Chalk,
	+bold: Chalk,
	+dim: Chalk,
	+italic: Chalk,
	+underline: Chalk,
	+inverse: Chalk,
	+hidden: Chalk,
	+strikethrough: Chalk,

	+visible: Chalk,

	+black: Chalk,
	+red: Chalk,
	+green: Chalk,
	+yellow: Chalk,
	+blue: Chalk,
	+magenta: Chalk,
	+cyan: Chalk,
	+white: Chalk,
	+gray: Chalk,
	+grey: Chalk,
	+blackBright: Chalk,
	+redBright: Chalk,
	+greenBright: Chalk,
	+yellowBright: Chalk,
	+blueBright: Chalk,
	+magentaBright: Chalk,
	+cyanBright: Chalk,
	+whiteBright: Chalk,

	+bgBlack: Chalk,
	+bgRed: Chalk,
	+bgGreen: Chalk,
	+bgYellow: Chalk,
	+bgBlue: Chalk,
	+bgMagenta: Chalk,
	+bgCyan: Chalk,
	+bgWhite: Chalk,
	+bgBlackBright: Chalk,
	+bgRedBright: Chalk,
	+bgGreenBright: Chalk,
	+bgYellowBright: Chalk,
	+bgBlueBright: Chalk,
	+bgMagentaBright: Chalk,
	+bgCyanBright: Chalk,
	+bgWhiteBrigh: Chalk,

	supportsColor: ColorSupport
};

declare module.exports: Chalk;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "dependencies": {
    "ansi-styles": "^3.2.1",
    "escape-string-regexp": "^1.0.5",
    "supports-color": "^5.3.0"
  },
  "deprecated": false,
  "description": "Terminal string styling done right",
  "devDependencies": {
    "ava": "*",
    "coveralls": "^3.0.0",
    "execa": "^0.9.0",
    "flow-bin": "^0.68.0",
    "import-fresh": "^2.0.0",
    "matcha": "^0.7.0",
    "nyc": "^11.0.2",
    "resolve-from": "^4.0.0",
    "typescript": "^2.5.3",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js",
    "templates.js",
    "types/index.d.ts",
    "index.js.flow"
  ],
  "homepage": "https://github.com/chalk/chalk#readme",
  "license": "MIT",
  "name": "chalk",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/chalk.git"
  },
  "types": "types/index.d.ts",
  "version": "2.4.2"
}'use strict';
const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi;

const ESCAPES = new Map([
	['n', '\n'],
	['r', '\r'],
	['t', '\t'],
	['b', '\b'],
	['f', '\f'],
	['v', '\v'],
	['0', '\0'],
	['\\', '\\'],
	['e', '\u001B'],
	['a', '\u0007']
]);

function unescape(c) {
	if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) {
		return String.fromCharCode(parseInt(c.slice(1), 16));
	}

	return ESCAPES.get(c) || c;
}

function parseArguments(name, args) {
	const results = [];
	const chunks = args.trim().split(/\s*,\s*/g);
	let matches;

	for (const chunk of chunks) {
		if (!isNaN(chunk)) {
			results.push(Number(chunk));
		} else if ((matches = chunk.match(STRING_REGEX))) {
			results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr));
		} else {
			throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);
		}
	}

	return results;
}

function parseStyle(style) {
	STYLE_REGEX.lastIndex = 0;

	const results = [];
	let matches;

	while ((matches = STYLE_REGEX.exec(style)) !== null) {
		const name = matches[1];

		if (matches[2]) {
			const args = parseArguments(name, matches[2]);
			results.push([name].concat(args));
		} else {
			results.push([name]);
		}
	}

	return results;
}

function buildStyle(chalk, styles) {
	const enabled = {};

	for (const layer of styles) {
		for (const style of layer.styles) {
			enabled[style[0]] = layer.inverse ? null : style.slice(1);
		}
	}

	let current = chalk;
	for (const styleName of Object.keys(enabled)) {
		if (Array.isArray(enabled[styleName])) {
			if (!(styleName in current)) {
				throw new Error(`Unknown Chalk style: ${styleName}`);
			}

			if (enabled[styleName].length > 0) {
				current = current[styleName].apply(current, enabled[styleName]);
			} else {
				current = current[styleName];
			}
		}
	}

	return current;
}

module.exports = (chalk, tmp) => {
	const styles = [];
	const chunks = [];
	let chunk = [];

	// eslint-disable-next-line max-params
	tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => {
		if (escapeChar) {
			chunk.push(unescape(escapeChar));
		} else if (style) {
			const str = chunk.join('');
			chunk = [];
			chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str));
			styles.push({inverse, styles: parseStyle(style)});
		} else if (close) {
			if (styles.length === 0) {
				throw new Error('Found extraneous } in Chalk template literal');
			}

			chunks.push(buildStyle(chalk, styles)(chunk.join('')));
			chunk = [];
			styles.pop();
		} else {
			chunk.push(chr);
		}
	});

	chunks.push(chunk.join(''));

	if (styles.length > 0) {
		const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`;
		throw new Error(errMsg);
	}

	return chunks.join('');
};
{
  "deprecated": false,
  "description": "Binary value packing and unpacking",
  "devDependencies": {
    "mocha": "^3.0.2",
    "standard": "^8.0.0"
  },
  "homepage": "https://github.com/electron/node-chromium-pickle-js#readme",
  "license": "MIT",
  "main": "./lib/exports.js",
  "name": "chromium-pickle-js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron/node-chromium-pickle-js.git"
  },
  "version": "0.2.0"
}var Pickle = require('./pickle')

module.exports = {
  createEmpty: function () {
    return new Pickle()
  },

  createFromBuffer: function (buffer) {
    return new Pickle(buffer)
  }
}
// sizeof(T).
var SIZE_INT32 = 4
var SIZE_UINT32 = 4
var SIZE_INT64 = 8
var SIZE_UINT64 = 8
var SIZE_FLOAT = 4
var SIZE_DOUBLE = 8

// The allocation granularity of the payload.
var PAYLOAD_UNIT = 64

// Largest JS number.
var CAPACITY_READ_ONLY = 9007199254740992

// Aligns 'i' by rounding it up to the next multiple of 'alignment'.
var alignInt = function (i, alignment) {
  return i + (alignment - (i % alignment)) % alignment
}

// PickleIterator reads data from a Pickle. The Pickle object must remain valid
// while the PickleIterator object is in use.
var PickleIterator = (function () {
  function PickleIterator (pickle) {
    this.payload = pickle.header
    this.payloadOffset = pickle.headerSize
    this.readIndex = 0
    this.endIndex = pickle.getPayloadSize()
  }

  PickleIterator.prototype.readBool = function () {
    return this.readInt() !== 0
  }

  PickleIterator.prototype.readInt = function () {
    return this.readBytes(SIZE_INT32, Buffer.prototype.readInt32LE)
  }

  PickleIterator.prototype.readUInt32 = function () {
    return this.readBytes(SIZE_UINT32, Buffer.prototype.readUInt32LE)
  }

  PickleIterator.prototype.readInt64 = function () {
    return this.readBytes(SIZE_INT64, Buffer.prototype.readInt64LE)
  }

  PickleIterator.prototype.readUInt64 = function () {
    return this.readBytes(SIZE_UINT64, Buffer.prototype.readUInt64LE)
  }

  PickleIterator.prototype.readFloat = function () {
    return this.readBytes(SIZE_FLOAT, Buffer.prototype.readFloatLE)
  }

  PickleIterator.prototype.readDouble = function () {
    return this.readBytes(SIZE_DOUBLE, Buffer.prototype.readDoubleLE)
  }

  PickleIterator.prototype.readString = function () {
    return this.readBytes(this.readInt()).toString()
  }

  PickleIterator.prototype.readBytes = function (length, method) {
    var readPayloadOffset = this.getReadPayloadOffsetAndAdvance(length)
    if (method != null) {
      return method.call(this.payload, readPayloadOffset, length)
    } else {
      return this.payload.slice(readPayloadOffset, readPayloadOffset + length)
    }
  }

  PickleIterator.prototype.getReadPayloadOffsetAndAdvance = function (length) {
    if (length > this.endIndex - this.readIndex) {
      this.readIndex = this.endIndex
      throw new Error('Failed to read data with length of ' + length)
    }
    var readPayloadOffset = this.payloadOffset + this.readIndex
    this.advance(length)
    return readPayloadOffset
  }

  PickleIterator.prototype.advance = function (size) {
    var alignedSize = alignInt(size, SIZE_UINT32)
    if (this.endIndex - this.readIndex < alignedSize) {
      this.readIndex = this.endIndex
    } else {
      this.readIndex += alignedSize
    }
  }

  return PickleIterator
})()

// This class provides facilities for basic binary value packing and unpacking.
//
// The Pickle class supports appending primitive values (ints, strings, etc.)
// to a pickle instance.  The Pickle instance grows its internal memory buffer
// dynamically to hold the sequence of primitive values.   The internal memory
// buffer is exposed as the "data" of the Pickle.  This "data" can be passed
// to a Pickle object to initialize it for reading.
//
// When reading from a Pickle object, it is important for the consumer to know
// what value types to read and in what order to read them as the Pickle does
// not keep track of the type of data written to it.
//
// The Pickle's data has a header which contains the size of the Pickle's
// payload.  It can optionally support additional space in the header.  That
// space is controlled by the header_size parameter passed to the Pickle
// constructor.
var Pickle = (function () {
  function Pickle (buffer) {
    if (buffer) {
      this.initFromBuffer(buffer)
    } else {
      this.initEmpty()
    }
  }

  Pickle.prototype.initEmpty = function () {
    this.header = new Buffer(0)
    this.headerSize = SIZE_UINT32
    this.capacityAfterHeader = 0
    this.writeOffset = 0
    this.resize(PAYLOAD_UNIT)
    this.setPayloadSize(0)
  }

  Pickle.prototype.initFromBuffer = function (buffer) {
    this.header = buffer
    this.headerSize = buffer.length - this.getPayloadSize()
    this.capacityAfterHeader = CAPACITY_READ_ONLY
    this.writeOffset = 0
    if (this.headerSize > buffer.length) {
      this.headerSize = 0
    }
    if (this.headerSize !== alignInt(this.headerSize, SIZE_UINT32)) {
      this.headerSize = 0
    }
    if (this.headerSize === 0) {
      this.header = new Buffer(0)
    }
  }

  Pickle.prototype.createIterator = function () {
    return new PickleIterator(this)
  }

  Pickle.prototype.toBuffer = function () {
    return this.header.slice(0, this.headerSize + this.getPayloadSize())
  }

  Pickle.prototype.writeBool = function (value) {
    return this.writeInt(value ? 1 : 0)
  }

  Pickle.prototype.writeInt = function (value) {
    return this.writeBytes(value, SIZE_INT32, Buffer.prototype.writeInt32LE)
  }

  Pickle.prototype.writeUInt32 = function (value) {
    return this.writeBytes(value, SIZE_UINT32, Buffer.prototype.writeUInt32LE)
  }

  Pickle.prototype.writeInt64 = function (value) {
    return this.writeBytes(value, SIZE_INT64, Buffer.prototype.writeInt64LE)
  }

  Pickle.prototype.writeUInt64 = function (value) {
    return this.writeBytes(value, SIZE_UINT64, Buffer.prototype.writeUInt64LE)
  }

  Pickle.prototype.writeFloat = function (value) {
    return this.writeBytes(value, SIZE_FLOAT, Buffer.prototype.writeFloatLE)
  }

  Pickle.prototype.writeDouble = function (value) {
    return this.writeBytes(value, SIZE_DOUBLE, Buffer.prototype.writeDoubleLE)
  }

  Pickle.prototype.writeString = function (value) {
    var length = Buffer.byteLength(value, 'utf8')
    if (!this.writeInt(length)) {
      return false
    }
    return this.writeBytes(value, length)
  }

  Pickle.prototype.setPayloadSize = function (payloadSize) {
    return this.header.writeUInt32LE(payloadSize, 0)
  }

  Pickle.prototype.getPayloadSize = function () {
    return this.header.readUInt32LE(0)
  }

  Pickle.prototype.writeBytes = function (data, length, method) {
    var dataLength = alignInt(length, SIZE_UINT32)
    var newSize = this.writeOffset + dataLength
    if (newSize > this.capacityAfterHeader) {
      this.resize(Math.max(this.capacityAfterHeader * 2, newSize))
    }
    if (method != null) {
      method.call(this.header, data, this.headerSize + this.writeOffset)
    } else {
      this.header.write(data, this.headerSize + this.writeOffset, length)
    }
    var endOffset = this.headerSize + this.writeOffset + length
    this.header.fill(0, endOffset, endOffset + dataLength - length)
    this.setPayloadSize(newSize)
    this.writeOffset = newSize
    return true
  }

  Pickle.prototype.resize = function (newCapacity) {
    newCapacity = alignInt(newCapacity, PAYLOAD_UNIT)
    this.header = Buffer.concat([this.header, new Buffer(newCapacity)])
    this.capacityAfterHeader = newCapacity
  }

  return Pickle
})()

module.exports = Pickle
The MIT License (MIT)

Copyright (c) 2016-2018 Thomas Watson Steen

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict'

var vendors = require('./vendors.json')

var env = process.env

// Used for testing only
Object.defineProperty(exports, '_vendors', {
  value: vendors.map(function (v) { return v.constant })
})

exports.name = null
exports.isPR = null

vendors.forEach(function (vendor) {
  var envs = Array.isArray(vendor.env) ? vendor.env : [vendor.env]
  var isCI = envs.every(function (obj) {
    return checkEnv(obj)
  })

  exports[vendor.constant] = isCI

  if (isCI) {
    exports.name = vendor.name

    switch (typeof vendor.pr) {
      case 'string':
        // "pr": "CIRRUS_PR"
        exports.isPR = !!env[vendor.pr]
        break
      case 'object':
        if ('env' in vendor.pr) {
          // "pr": { "env": "BUILDKITE_PULL_REQUEST", "ne": "false" }
          exports.isPR = vendor.pr.env in env && env[vendor.pr.env] !== vendor.pr.ne
        } else if ('any' in vendor.pr) {
          // "pr": { "any": ["ghprbPullId", "CHANGE_ID"] }
          exports.isPR = vendor.pr.any.some(function (key) {
            return !!env[key]
          })
        } else {
          // "pr": { "DRONE_BUILD_EVENT": "pull_request" }
          exports.isPR = checkEnv(vendor.pr)
        }
        break
      default:
        // PR detection not supported for this vendor
        exports.isPR = null
    }
  }
})

exports.isCI = !!(
  env.CI || // Travis CI, CircleCI, Cirrus CI, Gitlab CI, Appveyor, CodeShip, dsari
  env.CONTINUOUS_INTEGRATION || // Travis CI, Cirrus CI
  env.BUILD_NUMBER || // Jenkins, TeamCity
  env.RUN_ID || // TaskCluster, dsari
  exports.name ||
  false
)

function checkEnv (obj) {
  if (typeof obj === 'string') return !!env[obj]
  return Object.keys(obj).every(function (k) {
    return env[k] === obj[k]
  })
}
{
  "author": {
    "name": "Thomas Watson Steen",
    "email": "w@tson.dk",
    "url": "https://twitter.com/wa7son"
  },
  "coordinates": [
    55.778231,
    12.593179
  ],
  "dependencies": {},
  "deprecated": false,
  "description": "Get details about the current Continuous Integration environment",
  "devDependencies": {
    "clear-require": "^1.0.1",
    "standard": "^12.0.1",
    "tape": "^4.9.1"
  },
  "homepage": "https://github.com/watson/ci-info",
  "license": "MIT",
  "main": "index.js",
  "name": "ci-info",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/watson/ci-info.git"
  },
  "version": "2.0.0"
}[
  {
    "name": "AppVeyor",
    "constant": "APPVEYOR",
    "env": "APPVEYOR",
    "pr": "APPVEYOR_PULL_REQUEST_NUMBER"
  },
  {
    "name": "Azure Pipelines",
    "constant": "AZURE_PIPELINES",
    "env": "SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",
    "pr": "SYSTEM_PULLREQUEST_PULLREQUESTID"
  },
  {
    "name": "Bamboo",
    "constant": "BAMBOO",
    "env": "bamboo_planKey"
  },
  {
    "name": "Bitbucket Pipelines",
    "constant": "BITBUCKET",
    "env": "BITBUCKET_COMMIT",
    "pr": "BITBUCKET_PR_ID"
  },
  {
    "name": "Bitrise",
    "constant": "BITRISE",
    "env": "BITRISE_IO",
    "pr": "BITRISE_PULL_REQUEST"
  },
  {
    "name": "Buddy",
    "constant": "BUDDY",
    "env": "BUDDY_WORKSPACE_ID",
    "pr": "BUDDY_EXECUTION_PULL_REQUEST_ID"
  },
  {
    "name": "Buildkite",
    "constant": "BUILDKITE",
    "env": "BUILDKITE",
    "pr": { "env": "BUILDKITE_PULL_REQUEST", "ne": "false" }
  },
  {
    "name": "CircleCI",
    "constant": "CIRCLE",
    "env": "CIRCLECI",
    "pr": "CIRCLE_PULL_REQUEST"
  },
  {
    "name": "Cirrus CI",
    "constant": "CIRRUS",
    "env": "CIRRUS_CI",
    "pr": "CIRRUS_PR"
  },
  {
    "name": "AWS CodeBuild",
    "constant": "CODEBUILD",
    "env": "CODEBUILD_BUILD_ARN"
  },
  {
    "name": "Codeship",
    "constant": "CODESHIP",
    "env": { "CI_NAME": "codeship" }
  },
  {
    "name": "Drone",
    "constant": "DRONE",
    "env": "DRONE",
    "pr": { "DRONE_BUILD_EVENT": "pull_request" }
  },
  {
    "name": "dsari",
    "constant": "DSARI",
    "env": "DSARI"
  },
  {
    "name": "GitLab CI",
    "constant": "GITLAB",
    "env": "GITLAB_CI"
  },
  {
    "name": "GoCD",
    "constant": "GOCD",
    "env": "GO_PIPELINE_LABEL"
  },
  {
    "name": "Hudson",
    "constant": "HUDSON",
    "env": "HUDSON_URL"
  },
  {
    "name": "Jenkins",
    "constant": "JENKINS",
    "env": ["JENKINS_URL", "BUILD_ID"],
    "pr": { "any": ["ghprbPullId", "CHANGE_ID"] }
  },
  {
    "name": "Magnum CI",
    "constant": "MAGNUM",
    "env": "MAGNUM"
  },
  {
    "name": "Netlify CI",
    "constant": "NETLIFY",
    "env": "NETLIFY_BUILD_BASE",
    "pr": { "env": "PULL_REQUEST", "ne": "false" }
  },
  {
    "name": "Sail CI",
    "constant": "SAIL",
    "env": "SAILCI",
    "pr": "SAIL_PULL_REQUEST_NUMBER"
  },
  {
    "name": "Semaphore",
    "constant": "SEMAPHORE",
    "env": "SEMAPHORE",
    "pr": "PULL_REQUEST_NUMBER"
  },
  {
    "name": "Shippable",
    "constant": "SHIPPABLE",
    "env": "SHIPPABLE",
    "pr": { "IS_PULL_REQUEST": "true" }
  },
  {
    "name": "Solano CI",
    "constant": "SOLANO",
    "env": "TDDIUM",
    "pr": "TDDIUM_PR_ID"
  },
  {
    "name": "Strider CD",
    "constant": "STRIDER",
    "env": "STRIDER"
  },
  {
    "name": "TaskCluster",
    "constant": "TASKCLUSTER",
    "env": ["TASK_ID", "RUN_ID"]
  },
  {
    "name": "TeamCity",
    "constant": "TEAMCITY",
    "env": "TEAMCITY_VERSION"
  },
  {
    "name": "Travis CI",
    "constant": "TRAVIS",
    "env": "TRAVIS",
    "pr": { "env": "TRAVIS_PULL_REQUEST", "ne": "false" }
  }
]
{
	"single": {
		"topLeft": "â”Œ",
		"topRight": "â”�",
		"bottomRight": "â”˜",
		"bottomLeft": "â””",
		"vertical": "â”‚",
		"horizontal": "â”€"
	},
	"double": {
		"topLeft": "â•”",
		"topRight": "â•—",
		"bottomRight": "â•�",
		"bottomLeft": "â•š",
		"vertical": "â•‘",
		"horizontal": "â•�"
	},
	"round": {
		"topLeft": "â•­",
		"topRight": "â•®",
		"bottomRight": "â•¯",
		"bottomLeft": "â•°",
		"vertical": "â”‚",
		"horizontal": "â”€"
	},
	"bold": {
		"topLeft": "â”�",
		"topRight": "â”“",
		"bottomRight": "â”›",
		"bottomLeft": "â”—",
		"vertical": "â”ƒ",
		"horizontal": "â”�"
	},
	"singleDouble": {
		"topLeft": "â•“",
		"topRight": "â•–",
		"bottomRight": "â•œ",
		"bottomLeft": "â•™",
		"vertical": "â•‘",
		"horizontal": "â”€"
	},
	"doubleSingle": {
		"topLeft": "â•’",
		"topRight": "â••",
		"bottomRight": "â•›",
		"bottomLeft": "â•˜",
		"vertical": "â”‚",
		"horizontal": "â•�"
	},
	"classic": {
		"topLeft": "+",
		"topRight": "+",
		"bottomRight": "+",
		"bottomLeft": "+",
		"vertical": "|",
		"horizontal": "-"
	}
}
'use strict';
const cliBoxes = require('./boxes.json');

module.exports = cliBoxes;
// TODO: Remove this for the next major release
module.exports.default = cliBoxes;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "https://sindresorhus.com"
  },
  "deprecated": false,
  "description": "Boxes for use in the terminal",
  "devDependencies": {
    "ava": "^1.4.1",
    "tsd": "^0.7.2",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts",
    "boxes.json"
  ],
  "funding": "https://github.com/sponsors/sindresorhus",
  "homepage": "https://github.com/sindresorhus/cli-boxes#readme",
  "license": "MIT",
  "name": "cli-boxes",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/cli-boxes.git"
  },
  "version": "2.2.1"
}Copyright (c) 2015, Contributors

Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice
appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
var stringWidth = require('string-width')
var stripAnsi = require('strip-ansi')
var wrap = require('wrap-ansi')
var align = {
  right: alignRight,
  center: alignCenter
}
var top = 0
var right = 1
var bottom = 2
var left = 3

function UI (opts) {
  this.width = opts.width
  this.wrap = opts.wrap
  this.rows = []
}

UI.prototype.span = function () {
  var cols = this.div.apply(this, arguments)
  cols.span = true
}

UI.prototype.resetOutput = function () {
  this.rows = []
}

UI.prototype.div = function () {
  if (arguments.length === 0) this.div('')
  if (this.wrap && this._shouldApplyLayoutDSL.apply(this, arguments)) {
    return this._applyLayoutDSL(arguments[0])
  }

  var cols = []

  for (var i = 0, arg; (arg = arguments[i]) !== undefined; i++) {
    if (typeof arg === 'string') cols.push(this._colFromString(arg))
    else cols.push(arg)
  }

  this.rows.push(cols)
  return cols
}

UI.prototype._shouldApplyLayoutDSL = function () {
  return arguments.length === 1 && typeof arguments[0] === 'string' &&
    /[\t\n]/.test(arguments[0])
}

UI.prototype._applyLayoutDSL = function (str) {
  var _this = this
  var rows = str.split('\n')
  var leftColumnWidth = 0

  // simple heuristic for layout, make sure the
  // second column lines up along the left-hand.
  // don't allow the first column to take up more
  // than 50% of the screen.
  rows.forEach(function (row) {
    var columns = row.split('\t')
    if (columns.length > 1 && stringWidth(columns[0]) > leftColumnWidth) {
      leftColumnWidth = Math.min(
        Math.floor(_this.width * 0.5),
        stringWidth(columns[0])
      )
    }
  })

  // generate a table:
  //  replacing ' ' with padding calculations.
  //  using the algorithmically generated width.
  rows.forEach(function (row) {
    var columns = row.split('\t')
    _this.div.apply(_this, columns.map(function (r, i) {
      return {
        text: r.trim(),
        padding: _this._measurePadding(r),
        width: (i === 0 && columns.length > 1) ? leftColumnWidth : undefined
      }
    }))
  })

  return this.rows[this.rows.length - 1]
}

UI.prototype._colFromString = function (str) {
  return {
    text: str,
    padding: this._measurePadding(str)
  }
}

UI.prototype._measurePadding = function (str) {
  // measure padding without ansi escape codes
  var noAnsi = stripAnsi(str)
  return [0, noAnsi.match(/\s*$/)[0].length, 0, noAnsi.match(/^\s*/)[0].length]
}

UI.prototype.toString = function () {
  var _this = this
  var lines = []

  _this.rows.forEach(function (row, i) {
    _this.rowToString(row, lines)
  })

  // don't display any lines with the
  // hidden flag set.
  lines = lines.filter(function (line) {
    return !line.hidden
  })

  return lines.map(function (line) {
    return line.text
  }).join('\n')
}

UI.prototype.rowToString = function (row, lines) {
  var _this = this
  var padding
  var rrows = this._rasterize(row)
  var str = ''
  var ts
  var width
  var wrapWidth

  rrows.forEach(function (rrow, r) {
    str = ''
    rrow.forEach(function (col, c) {
      ts = '' // temporary string used during alignment/padding.
      width = row[c].width // the width with padding.
      wrapWidth = _this._negatePadding(row[c]) // the width without padding.

      ts += col

      for (var i = 0; i < wrapWidth - stringWidth(col); i++) {
        ts += ' '
      }

      // align the string within its column.
      if (row[c].align && row[c].align !== 'left' && _this.wrap) {
        ts = align[row[c].align](ts, wrapWidth)
        if (stringWidth(ts) < wrapWidth) ts += new Array(width - stringWidth(ts)).join(' ')
      }

      // apply border and padding to string.
      padding = row[c].padding || [0, 0, 0, 0]
      if (padding[left]) str += new Array(padding[left] + 1).join(' ')
      str += addBorder(row[c], ts, '| ')
      str += ts
      str += addBorder(row[c], ts, ' |')
      if (padding[right]) str += new Array(padding[right] + 1).join(' ')

      // if prior row is span, try to render the
      // current row on the prior line.
      if (r === 0 && lines.length > 0) {
        str = _this._renderInline(str, lines[lines.length - 1])
      }
    })

    // remove trailing whitespace.
    lines.push({
      text: str.replace(/ +$/, ''),
      span: row.span
    })
  })

  return lines
}

function addBorder (col, ts, style) {
  if (col.border) {
    if (/[.']-+[.']/.test(ts)) return ''
    else if (ts.trim().length) return style
    else return '  '
  }
  return ''
}

// if the full 'source' can render in
// the target line, do so.
UI.prototype._renderInline = function (source, previousLine) {
  var leadingWhitespace = source.match(/^ */)[0].length
  var target = previousLine.text
  var targetTextWidth = stringWidth(target.trimRight())

  if (!previousLine.span) return source

  // if we're not applying wrapping logic,
  // just always append to the span.
  if (!this.wrap) {
    previousLine.hidden = true
    return target + source
  }

  if (leadingWhitespace < targetTextWidth) return source

  previousLine.hidden = true

  return target.trimRight() + new Array(leadingWhitespace - targetTextWidth + 1).join(' ') + source.trimLeft()
}

UI.prototype._rasterize = function (row) {
  var _this = this
  var i
  var rrow
  var rrows = []
  var widths = this._columnWidths(row)
  var wrapped

  // word wrap all columns, and create
  // a data-structure that is easy to rasterize.
  row.forEach(function (col, c) {
    // leave room for left and right padding.
    col.width = widths[c]
    if (_this.wrap) wrapped = wrap(col.text, _this._negatePadding(col), { hard: true }).split('\n')
    else wrapped = col.text.split('\n')

    if (col.border) {
      wrapped.unshift('.' + new Array(_this._negatePadding(col) + 3).join('-') + '.')
      wrapped.push("'" + new Array(_this._negatePadding(col) + 3).join('-') + "'")
    }

    // add top and bottom padding.
    if (col.padding) {
      for (i = 0; i < (col.padding[top] || 0); i++) wrapped.unshift('')
      for (i = 0; i < (col.padding[bottom] || 0); i++) wrapped.push('')
    }

    wrapped.forEach(function (str, r) {
      if (!rrows[r]) rrows.push([])

      rrow = rrows[r]

      for (var i = 0; i < c; i++) {
        if (rrow[i] === undefined) rrow.push('')
      }
      rrow.push(str)
    })
  })

  return rrows
}

UI.prototype._negatePadding = function (col) {
  var wrapWidth = col.width
  if (col.padding) wrapWidth -= (col.padding[left] || 0) + (col.padding[right] || 0)
  if (col.border) wrapWidth -= 4
  return wrapWidth
}

UI.prototype._columnWidths = function (row) {
  var _this = this
  var widths = []
  var unset = row.length
  var unsetWidth
  var remainingWidth = this.width

  // column widths can be set in config.
  row.forEach(function (col, i) {
    if (col.width) {
      unset--
      widths[i] = col.width
      remainingWidth -= col.width
    } else {
      widths[i] = undefined
    }
  })

  // any unset widths should be calculated.
  if (unset) unsetWidth = Math.floor(remainingWidth / unset)
  widths.forEach(function (w, i) {
    if (!_this.wrap) widths[i] = row[i].width || stringWidth(row[i].text)
    else if (w === undefined) widths[i] = Math.max(unsetWidth, _minWidth(row[i]))
  })

  return widths
}

// calculates the minimum width of
// a column, based on padding preferences.
function _minWidth (col) {
  var padding = col.padding || []
  var minWidth = 1 + (padding[left] || 0) + (padding[right] || 0)
  if (col.border) minWidth += 4
  return minWidth
}

function getWindowWidth () {
  if (typeof process === 'object' && process.stdout && process.stdout.columns) return process.stdout.columns
}

function alignRight (str, width) {
  str = str.trim()
  var padding = ''
  var strWidth = stringWidth(str)

  if (strWidth < width) {
    padding = new Array(width - strWidth + 1).join(' ')
  }

  return padding + str
}

function alignCenter (str, width) {
  str = str.trim()
  var padding = ''
  var strWidth = stringWidth(str.trim())

  if (strWidth < width) {
    padding = new Array(parseInt((width - strWidth) / 2, 10) + 1).join(' ')
  }

  return padding + str
}

module.exports = function (opts) {
  opts = opts || {}

  return new UI({
    width: (opts || {}).width || getWindowWidth() || 80,
    wrap: typeof opts.wrap === 'boolean' ? opts.wrap : true
  })
}
{
  "author": {
    "name": "Ben Coe",
    "email": "ben@npmjs.com"
  },
  "config": {
    "blanket": {
      "pattern": [
        "index.js"
      ],
      "data-cover-never": [
        "node_modules",
        "test"
      ],
      "output-reporter": "spec"
    }
  },
  "dependencies": {
    "string-width": "^3.1.0",
    "strip-ansi": "^5.2.0",
    "wrap-ansi": "^5.1.0"
  },
  "deprecated": false,
  "description": "easily create complex multi-column command-line-interfaces",
  "devDependencies": {
    "chai": "^4.2.0",
    "chalk": "^2.4.2",
    "coveralls": "^3.0.3",
    "mocha": "^6.0.2",
    "nyc": "^13.3.0",
    "standard": "^12.0.1",
    "standard-version": "^5.0.2"
  },
  "engine": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/yargs/cliui#readme",
  "license": "ISC",
  "main": "index.js",
  "name": "cliui",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/yargs/cliui.git"
  },
  "standard": {
    "ignore": [
      "**/example/**"
    ],
    "globals": [
      "it"
    ]
  },
  "version": "5.0.0"
}MIT License

Copyright (c) 2017 Luke Childs

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "author": {
    "name": "Luke Childs",
    "email": "lukechilds123@gmail.com",
    "url": "http://lukechilds.co.uk"
  },
  "dependencies": {
    "mimic-response": "^1.0.0"
  },
  "deprecated": false,
  "description": "Clone a Node.js HTTP response stream",
  "devDependencies": {
    "ava": "^0.22.0",
    "coveralls": "^2.13.1",
    "create-test-server": "^2.0.1",
    "eslint-config-xo-lukechilds": "^1.0.0",
    "get-stream": "^3.0.0",
    "nyc": "^11.0.2",
    "pify": "^3.0.0",
    "xo": "^0.19.0"
  },
  "homepage": "https://github.com/lukechilds/clone-response",
  "license": "MIT",
  "main": "src/index.js",
  "name": "clone-response",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/lukechilds/clone-response.git"
  },
  "version": "1.0.2"
}'use strict';

const PassThrough = require('stream').PassThrough;
const mimicResponse = require('mimic-response');

const cloneResponse = response => {
	if (!(response && response.pipe)) {
		throw new TypeError('Parameter `response` must be a response stream.');
	}

	const clone = new PassThrough();
	mimicResponse(response, clone);

	return response.pipe(clone);
};

module.exports = cloneResponse;
/* eslint-disable babel/new-cap, xo/throw-new-error */
'use strict';
module.exports = function (str, pos) {
	if (str === null || str === undefined) {
		throw TypeError();
	}

	str = String(str);

	var size = str.length;
	var i = pos ? Number(pos) : 0;

	if (Number.isNaN(i)) {
		i = 0;
	}

	if (i < 0 || i >= size) {
		return undefined;
	}

	var first = str.charCodeAt(i);

	if (first >= 0xD800 && first <= 0xDBFF && size > i + 1) {
		var second = str.charCodeAt(i + 1);

		if (second >= 0xDC00 && second <= 0xDFFF) {
			return ((first - 0xD800) * 0x400) + second - 0xDC00 + 0x10000;
		}
	}

	return first;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "ES2015 `String#codePointAt()` ponyfill",
  "devDependencies": {
    "ava": "*",
    "xo": "^0.16.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/code-point-at#readme",
  "license": "MIT",
  "name": "code-point-at",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/code-point-at.git"
  },
  "version": "1.1.0"
}Copyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

/* MIT license */
var cssKeywords = require('color-name');

// NOTE: conversions should only return primitive values (i.e. arrays, or
//       values that give correct `typeof` results).
//       do not use box values types (i.e. Number(), String(), etc.)

var reverseKeywords = {};
for (var key in cssKeywords) {
	if (cssKeywords.hasOwnProperty(key)) {
		reverseKeywords[cssKeywords[key]] = key;
	}
}

var convert = module.exports = {
	rgb: {channels: 3, labels: 'rgb'},
	hsl: {channels: 3, labels: 'hsl'},
	hsv: {channels: 3, labels: 'hsv'},
	hwb: {channels: 3, labels: 'hwb'},
	cmyk: {channels: 4, labels: 'cmyk'},
	xyz: {channels: 3, labels: 'xyz'},
	lab: {channels: 3, labels: 'lab'},
	lch: {channels: 3, labels: 'lch'},
	hex: {channels: 1, labels: ['hex']},
	keyword: {channels: 1, labels: ['keyword']},
	ansi16: {channels: 1, labels: ['ansi16']},
	ansi256: {channels: 1, labels: ['ansi256']},
	hcg: {channels: 3, labels: ['h', 'c', 'g']},
	apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
	gray: {channels: 1, labels: ['gray']}
};

// hide .channels and .labels properties
for (var model in convert) {
	if (convert.hasOwnProperty(model)) {
		if (!('channels' in convert[model])) {
			throw new Error('missing channels property: ' + model);
		}

		if (!('labels' in convert[model])) {
			throw new Error('missing channel labels property: ' + model);
		}

		if (convert[model].labels.length !== convert[model].channels) {
			throw new Error('channel and label counts mismatch: ' + model);
		}

		var channels = convert[model].channels;
		var labels = convert[model].labels;
		delete convert[model].channels;
		delete convert[model].labels;
		Object.defineProperty(convert[model], 'channels', {value: channels});
		Object.defineProperty(convert[model], 'labels', {value: labels});
	}
}

convert.rgb.hsl = function (rgb) {
	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;
	var min = Math.min(r, g, b);
	var max = Math.max(r, g, b);
	var delta = max - min;
	var h;
	var s;
	var l;

	if (max === min) {
		h = 0;
	} else if (r === max) {
		h = (g - b) / delta;
	} else if (g === max) {
		h = 2 + (b - r) / delta;
	} else if (b === max) {
		h = 4 + (r - g) / delta;
	}

	h = Math.min(h * 60, 360);

	if (h < 0) {
		h += 360;
	}

	l = (min + max) / 2;

	if (max === min) {
		s = 0;
	} else if (l <= 0.5) {
		s = delta / (max + min);
	} else {
		s = delta / (2 - max - min);
	}

	return [h, s * 100, l * 100];
};

convert.rgb.hsv = function (rgb) {
	var rdif;
	var gdif;
	var bdif;
	var h;
	var s;

	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;
	var v = Math.max(r, g, b);
	var diff = v - Math.min(r, g, b);
	var diffc = function (c) {
		return (v - c) / 6 / diff + 1 / 2;
	};

	if (diff === 0) {
		h = s = 0;
	} else {
		s = diff / v;
		rdif = diffc(r);
		gdif = diffc(g);
		bdif = diffc(b);

		if (r === v) {
			h = bdif - gdif;
		} else if (g === v) {
			h = (1 / 3) + rdif - bdif;
		} else if (b === v) {
			h = (2 / 3) + gdif - rdif;
		}
		if (h < 0) {
			h += 1;
		} else if (h > 1) {
			h -= 1;
		}
	}

	return [
		h * 360,
		s * 100,
		v * 100
	];
};

convert.rgb.hwb = function (rgb) {
	var r = rgb[0];
	var g = rgb[1];
	var b = rgb[2];
	var h = convert.rgb.hsl(rgb)[0];
	var w = 1 / 255 * Math.min(r, Math.min(g, b));

	b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));

	return [h, w * 100, b * 100];
};

convert.rgb.cmyk = function (rgb) {
	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;
	var c;
	var m;
	var y;
	var k;

	k = Math.min(1 - r, 1 - g, 1 - b);
	c = (1 - r - k) / (1 - k) || 0;
	m = (1 - g - k) / (1 - k) || 0;
	y = (1 - b - k) / (1 - k) || 0;

	return [c * 100, m * 100, y * 100, k * 100];
};

/**
 * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
 * */
function comparativeDistance(x, y) {
	return (
		Math.pow(x[0] - y[0], 2) +
		Math.pow(x[1] - y[1], 2) +
		Math.pow(x[2] - y[2], 2)
	);
}

convert.rgb.keyword = function (rgb) {
	var reversed = reverseKeywords[rgb];
	if (reversed) {
		return reversed;
	}

	var currentClosestDistance = Infinity;
	var currentClosestKeyword;

	for (var keyword in cssKeywords) {
		if (cssKeywords.hasOwnProperty(keyword)) {
			var value = cssKeywords[keyword];

			// Compute comparative distance
			var distance = comparativeDistance(rgb, value);

			// Check if its less, if so set as closest
			if (distance < currentClosestDistance) {
				currentClosestDistance = distance;
				currentClosestKeyword = keyword;
			}
		}
	}

	return currentClosestKeyword;
};

convert.keyword.rgb = function (keyword) {
	return cssKeywords[keyword];
};

convert.rgb.xyz = function (rgb) {
	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;

	// assume sRGB
	r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
	g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
	b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);

	var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
	var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
	var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);

	return [x * 100, y * 100, z * 100];
};

convert.rgb.lab = function (rgb) {
	var xyz = convert.rgb.xyz(rgb);
	var x = xyz[0];
	var y = xyz[1];
	var z = xyz[2];
	var l;
	var a;
	var b;

	x /= 95.047;
	y /= 100;
	z /= 108.883;

	x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
	y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
	z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);

	l = (116 * y) - 16;
	a = 500 * (x - y);
	b = 200 * (y - z);

	return [l, a, b];
};

convert.hsl.rgb = function (hsl) {
	var h = hsl[0] / 360;
	var s = hsl[1] / 100;
	var l = hsl[2] / 100;
	var t1;
	var t2;
	var t3;
	var rgb;
	var val;

	if (s === 0) {
		val = l * 255;
		return [val, val, val];
	}

	if (l < 0.5) {
		t2 = l * (1 + s);
	} else {
		t2 = l + s - l * s;
	}

	t1 = 2 * l - t2;

	rgb = [0, 0, 0];
	for (var i = 0; i < 3; i++) {
		t3 = h + 1 / 3 * -(i - 1);
		if (t3 < 0) {
			t3++;
		}
		if (t3 > 1) {
			t3--;
		}

		if (6 * t3 < 1) {
			val = t1 + (t2 - t1) * 6 * t3;
		} else if (2 * t3 < 1) {
			val = t2;
		} else if (3 * t3 < 2) {
			val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
		} else {
			val = t1;
		}

		rgb[i] = val * 255;
	}

	return rgb;
};

convert.hsl.hsv = function (hsl) {
	var h = hsl[0];
	var s = hsl[1] / 100;
	var l = hsl[2] / 100;
	var smin = s;
	var lmin = Math.max(l, 0.01);
	var sv;
	var v;

	l *= 2;
	s *= (l <= 1) ? l : 2 - l;
	smin *= lmin <= 1 ? lmin : 2 - lmin;
	v = (l + s) / 2;
	sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);

	return [h, sv * 100, v * 100];
};

convert.hsv.rgb = function (hsv) {
	var h = hsv[0] / 60;
	var s = hsv[1] / 100;
	var v = hsv[2] / 100;
	var hi = Math.floor(h) % 6;

	var f = h - Math.floor(h);
	var p = 255 * v * (1 - s);
	var q = 255 * v * (1 - (s * f));
	var t = 255 * v * (1 - (s * (1 - f)));
	v *= 255;

	switch (hi) {
		case 0:
			return [v, t, p];
		case 1:
			return [q, v, p];
		case 2:
			return [p, v, t];
		case 3:
			return [p, q, v];
		case 4:
			return [t, p, v];
		case 5:
			return [v, p, q];
	}
};

convert.hsv.hsl = function (hsv) {
	var h = hsv[0];
	var s = hsv[1] / 100;
	var v = hsv[2] / 100;
	var vmin = Math.max(v, 0.01);
	var lmin;
	var sl;
	var l;

	l = (2 - s) * v;
	lmin = (2 - s) * vmin;
	sl = s * vmin;
	sl /= (lmin <= 1) ? lmin : 2 - lmin;
	sl = sl || 0;
	l /= 2;

	return [h, sl * 100, l * 100];
};

// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
convert.hwb.rgb = function (hwb) {
	var h = hwb[0] / 360;
	var wh = hwb[1] / 100;
	var bl = hwb[2] / 100;
	var ratio = wh + bl;
	var i;
	var v;
	var f;
	var n;

	// wh + bl cant be > 1
	if (ratio > 1) {
		wh /= ratio;
		bl /= ratio;
	}

	i = Math.floor(6 * h);
	v = 1 - bl;
	f = 6 * h - i;

	if ((i & 0x01) !== 0) {
		f = 1 - f;
	}

	n = wh + f * (v - wh); // linear interpolation

	var r;
	var g;
	var b;
	switch (i) {
		default:
		case 6:
		case 0: r = v; g = n; b = wh; break;
		case 1: r = n; g = v; b = wh; break;
		case 2: r = wh; g = v; b = n; break;
		case 3: r = wh; g = n; b = v; break;
		case 4: r = n; g = wh; b = v; break;
		case 5: r = v; g = wh; b = n; break;
	}

	return [r * 255, g * 255, b * 255];
};

convert.cmyk.rgb = function (cmyk) {
	var c = cmyk[0] / 100;
	var m = cmyk[1] / 100;
	var y = cmyk[2] / 100;
	var k = cmyk[3] / 100;
	var r;
	var g;
	var b;

	r = 1 - Math.min(1, c * (1 - k) + k);
	g = 1 - Math.min(1, m * (1 - k) + k);
	b = 1 - Math.min(1, y * (1 - k) + k);

	return [r * 255, g * 255, b * 255];
};

convert.xyz.rgb = function (xyz) {
	var x = xyz[0] / 100;
	var y = xyz[1] / 100;
	var z = xyz[2] / 100;
	var r;
	var g;
	var b;

	r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
	g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
	b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);

	// assume sRGB
	r = r > 0.0031308
		? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
		: r * 12.92;

	g = g > 0.0031308
		? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
		: g * 12.92;

	b = b > 0.0031308
		? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
		: b * 12.92;

	r = Math.min(Math.max(0, r), 1);
	g = Math.min(Math.max(0, g), 1);
	b = Math.min(Math.max(0, b), 1);

	return [r * 255, g * 255, b * 255];
};

convert.xyz.lab = function (xyz) {
	var x = xyz[0];
	var y = xyz[1];
	var z = xyz[2];
	var l;
	var a;
	var b;

	x /= 95.047;
	y /= 100;
	z /= 108.883;

	x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
	y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
	z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);

	l = (116 * y) - 16;
	a = 500 * (x - y);
	b = 200 * (y - z);

	return [l, a, b];
};

convert.lab.xyz = function (lab) {
	var l = lab[0];
	var a = lab[1];
	var b = lab[2];
	var x;
	var y;
	var z;

	y = (l + 16) / 116;
	x = a / 500 + y;
	z = y - b / 200;

	var y2 = Math.pow(y, 3);
	var x2 = Math.pow(x, 3);
	var z2 = Math.pow(z, 3);
	y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
	x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
	z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;

	x *= 95.047;
	y *= 100;
	z *= 108.883;

	return [x, y, z];
};

convert.lab.lch = function (lab) {
	var l = lab[0];
	var a = lab[1];
	var b = lab[2];
	var hr;
	var h;
	var c;

	hr = Math.atan2(b, a);
	h = hr * 360 / 2 / Math.PI;

	if (h < 0) {
		h += 360;
	}

	c = Math.sqrt(a * a + b * b);

	return [l, c, h];
};

convert.lch.lab = function (lch) {
	var l = lch[0];
	var c = lch[1];
	var h = lch[2];
	var a;
	var b;
	var hr;

	hr = h / 360 * 2 * Math.PI;
	a = c * Math.cos(hr);
	b = c * Math.sin(hr);

	return [l, a, b];
};

convert.rgb.ansi16 = function (args) {
	var r = args[0];
	var g = args[1];
	var b = args[2];
	var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization

	value = Math.round(value / 50);

	if (value === 0) {
		return 30;
	}

	var ansi = 30
		+ ((Math.round(b / 255) << 2)
		| (Math.round(g / 255) << 1)
		| Math.round(r / 255));

	if (value === 2) {
		ansi += 60;
	}

	return ansi;
};

convert.hsv.ansi16 = function (args) {
	// optimization here; we already know the value and don't need to get
	// it converted for us.
	return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
};

convert.rgb.ansi256 = function (args) {
	var r = args[0];
	var g = args[1];
	var b = args[2];

	// we use the extended greyscale palette here, with the exception of
	// black and white. normal palette only has 4 greyscale shades.
	if (r === g && g === b) {
		if (r < 8) {
			return 16;
		}

		if (r > 248) {
			return 231;
		}

		return Math.round(((r - 8) / 247) * 24) + 232;
	}

	var ansi = 16
		+ (36 * Math.round(r / 255 * 5))
		+ (6 * Math.round(g / 255 * 5))
		+ Math.round(b / 255 * 5);

	return ansi;
};

convert.ansi16.rgb = function (args) {
	var color = args % 10;

	// handle greyscale
	if (color === 0 || color === 7) {
		if (args > 50) {
			color += 3.5;
		}

		color = color / 10.5 * 255;

		return [color, color, color];
	}

	var mult = (~~(args > 50) + 1) * 0.5;
	var r = ((color & 1) * mult) * 255;
	var g = (((color >> 1) & 1) * mult) * 255;
	var b = (((color >> 2) & 1) * mult) * 255;

	return [r, g, b];
};

convert.ansi256.rgb = function (args) {
	// handle greyscale
	if (args >= 232) {
		var c = (args - 232) * 10 + 8;
		return [c, c, c];
	}

	args -= 16;

	var rem;
	var r = Math.floor(args / 36) / 5 * 255;
	var g = Math.floor((rem = args % 36) / 6) / 5 * 255;
	var b = (rem % 6) / 5 * 255;

	return [r, g, b];
};

convert.rgb.hex = function (args) {
	var integer = ((Math.round(args[0]) & 0xFF) << 16)
		+ ((Math.round(args[1]) & 0xFF) << 8)
		+ (Math.round(args[2]) & 0xFF);

	var string = integer.toString(16).toUpperCase();
	return '000000'.substring(string.length) + string;
};

convert.hex.rgb = function (args) {
	var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
	if (!match) {
		return [0, 0, 0];
	}

	var colorString = match[0];

	if (match[0].length === 3) {
		colorString = colorString.split('').map(function (char) {
			return char + char;
		}).join('');
	}

	var integer = parseInt(colorString, 16);
	var r = (integer >> 16) & 0xFF;
	var g = (integer >> 8) & 0xFF;
	var b = integer & 0xFF;

	return [r, g, b];
};

convert.rgb.hcg = function (rgb) {
	var r = rgb[0] / 255;
	var g = rgb[1] / 255;
	var b = rgb[2] / 255;
	var max = Math.max(Math.max(r, g), b);
	var min = Math.min(Math.min(r, g), b);
	var chroma = (max - min);
	var grayscale;
	var hue;

	if (chroma < 1) {
		grayscale = min / (1 - chroma);
	} else {
		grayscale = 0;
	}

	if (chroma <= 0) {
		hue = 0;
	} else
	if (max === r) {
		hue = ((g - b) / chroma) % 6;
	} else
	if (max === g) {
		hue = 2 + (b - r) / chroma;
	} else {
		hue = 4 + (r - g) / chroma + 4;
	}

	hue /= 6;
	hue %= 1;

	return [hue * 360, chroma * 100, grayscale * 100];
};

convert.hsl.hcg = function (hsl) {
	var s = hsl[1] / 100;
	var l = hsl[2] / 100;
	var c = 1;
	var f = 0;

	if (l < 0.5) {
		c = 2.0 * s * l;
	} else {
		c = 2.0 * s * (1.0 - l);
	}

	if (c < 1.0) {
		f = (l - 0.5 * c) / (1.0 - c);
	}

	return [hsl[0], c * 100, f * 100];
};

convert.hsv.hcg = function (hsv) {
	var s = hsv[1] / 100;
	var v = hsv[2] / 100;

	var c = s * v;
	var f = 0;

	if (c < 1.0) {
		f = (v - c) / (1 - c);
	}

	return [hsv[0], c * 100, f * 100];
};

convert.hcg.rgb = function (hcg) {
	var h = hcg[0] / 360;
	var c = hcg[1] / 100;
	var g = hcg[2] / 100;

	if (c === 0.0) {
		return [g * 255, g * 255, g * 255];
	}

	var pure = [0, 0, 0];
	var hi = (h % 1) * 6;
	var v = hi % 1;
	var w = 1 - v;
	var mg = 0;

	switch (Math.floor(hi)) {
		case 0:
			pure[0] = 1; pure[1] = v; pure[2] = 0; break;
		case 1:
			pure[0] = w; pure[1] = 1; pure[2] = 0; break;
		case 2:
			pure[0] = 0; pure[1] = 1; pure[2] = v; break;
		case 3:
			pure[0] = 0; pure[1] = w; pure[2] = 1; break;
		case 4:
			pure[0] = v; pure[1] = 0; pure[2] = 1; break;
		default:
			pure[0] = 1; pure[1] = 0; pure[2] = w;
	}

	mg = (1.0 - c) * g;

	return [
		(c * pure[0] + mg) * 255,
		(c * pure[1] + mg) * 255,
		(c * pure[2] + mg) * 255
	];
};

convert.hcg.hsv = function (hcg) {
	var c = hcg[1] / 100;
	var g = hcg[2] / 100;

	var v = c + g * (1.0 - c);
	var f = 0;

	if (v > 0.0) {
		f = c / v;
	}

	return [hcg[0], f * 100, v * 100];
};

convert.hcg.hsl = function (hcg) {
	var c = hcg[1] / 100;
	var g = hcg[2] / 100;

	var l = g * (1.0 - c) + 0.5 * c;
	var s = 0;

	if (l > 0.0 && l < 0.5) {
		s = c / (2 * l);
	} else
	if (l >= 0.5 && l < 1.0) {
		s = c / (2 * (1 - l));
	}

	return [hcg[0], s * 100, l * 100];
};

convert.hcg.hwb = function (hcg) {
	var c = hcg[1] / 100;
	var g = hcg[2] / 100;
	var v = c + g * (1.0 - c);
	return [hcg[0], (v - c) * 100, (1 - v) * 100];
};

convert.hwb.hcg = function (hwb) {
	var w = hwb[1] / 100;
	var b = hwb[2] / 100;
	var v = 1 - b;
	var c = v - w;
	var g = 0;

	if (c < 1) {
		g = (v - c) / (1 - c);
	}

	return [hwb[0], c * 100, g * 100];
};

convert.apple.rgb = function (apple) {
	return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
};

convert.rgb.apple = function (rgb) {
	return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
};

convert.gray.rgb = function (args) {
	return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
};

convert.gray.hsl = convert.gray.hsv = function (args) {
	return [0, 0, args[0]];
};

convert.gray.hwb = function (gray) {
	return [0, 100, gray[0]];
};

convert.gray.cmyk = function (gray) {
	return [0, 0, 0, gray[0]];
};

convert.gray.lab = function (gray) {
	return [gray[0], 0, 0];
};

convert.gray.hex = function (gray) {
	var val = Math.round(gray[0] / 100 * 255) & 0xFF;
	var integer = (val << 16) + (val << 8) + val;

	var string = integer.toString(16).toUpperCase();
	return '000000'.substring(string.length) + string;
};

convert.rgb.gray = function (rgb) {
	var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
	return [val / 255 * 100];
};
var conversions = require('./conversions');
var route = require('./route');

var convert = {};

var models = Object.keys(conversions);

function wrapRaw(fn) {
	var wrappedFn = function (args) {
		if (args === undefined || args === null) {
			return args;
		}

		if (arguments.length > 1) {
			args = Array.prototype.slice.call(arguments);
		}

		return fn(args);
	};

	// preserve .conversion property if there is one
	if ('conversion' in fn) {
		wrappedFn.conversion = fn.conversion;
	}

	return wrappedFn;
}

function wrapRounded(fn) {
	var wrappedFn = function (args) {
		if (args === undefined || args === null) {
			return args;
		}

		if (arguments.length > 1) {
			args = Array.prototype.slice.call(arguments);
		}

		var result = fn(args);

		// we're assuming the result is an array here.
		// see notice in conversions.js; don't use box types
		// in conversion functions.
		if (typeof result === 'object') {
			for (var len = result.length, i = 0; i < len; i++) {
				result[i] = Math.round(result[i]);
			}
		}

		return result;
	};

	// preserve .conversion property if there is one
	if ('conversion' in fn) {
		wrappedFn.conversion = fn.conversion;
	}

	return wrappedFn;
}

models.forEach(function (fromModel) {
	convert[fromModel] = {};

	Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
	Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});

	var routes = route(fromModel);
	var routeModels = Object.keys(routes);

	routeModels.forEach(function (toModel) {
		var fn = routes[toModel];

		convert[fromModel][toModel] = wrapRounded(fn);
		convert[fromModel][toModel].raw = wrapRaw(fn);
	});
});

module.exports = convert;
{
  "author": {
    "name": "Heather Arthur",
    "email": "fayearthur@gmail.com"
  },
  "dependencies": {
    "color-name": "1.1.3"
  },
  "deprecated": false,
  "description": "Plain color conversion functions",
  "devDependencies": {
    "chalk": "1.1.1",
    "xo": "0.11.2"
  },
  "files": [
    "index.js",
    "conversions.js",
    "css-keywords.js",
    "route.js"
  ],
  "homepage": "https://github.com/Qix-/color-convert#readme",
  "license": "MIT",
  "name": "color-convert",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/Qix-/color-convert.git"
  },
  "version": "1.9.3"
}var conversions = require('./conversions');

/*
	this function routes a model to all other models.

	all functions that are routed have a property `.conversion` attached
	to the returned synthetic function. This property is an array
	of strings, each with the steps in between the 'from' and 'to'
	color models (inclusive).

	conversions that are not possible simply are not included.
*/

function buildGraph() {
	var graph = {};
	// https://jsperf.com/object-keys-vs-for-in-with-closure/3
	var models = Object.keys(conversions);

	for (var len = models.length, i = 0; i < len; i++) {
		graph[models[i]] = {
			// http://jsperf.com/1-vs-infinity
			// micro-opt, but this is simple.
			distance: -1,
			parent: null
		};
	}

	return graph;
}

// https://en.wikipedia.org/wiki/Breadth-first_search
function deriveBFS(fromModel) {
	var graph = buildGraph();
	var queue = [fromModel]; // unshift -> queue -> pop

	graph[fromModel].distance = 0;

	while (queue.length) {
		var current = queue.pop();
		var adjacents = Object.keys(conversions[current]);

		for (var len = adjacents.length, i = 0; i < len; i++) {
			var adjacent = adjacents[i];
			var node = graph[adjacent];

			if (node.distance === -1) {
				node.distance = graph[current].distance + 1;
				node.parent = current;
				queue.unshift(adjacent);
			}
		}
	}

	return graph;
}

function link(from, to) {
	return function (args) {
		return to(from(args));
	};
}

function wrapConversion(toModel, graph) {
	var path = [graph[toModel].parent, toModel];
	var fn = conversions[graph[toModel].parent][toModel];

	var cur = graph[toModel].parent;
	while (graph[cur].parent) {
		path.unshift(graph[cur].parent);
		fn = link(conversions[graph[cur].parent][cur], fn);
		cur = graph[cur].parent;
	}

	fn.conversion = path;
	return fn;
}

module.exports = function (fromModel) {
	var graph = deriveBFS(fromModel);
	var conversion = {};

	var models = Object.keys(graph);
	for (var len = models.length, i = 0; i < len; i++) {
		var toModel = models[i];
		var node = graph[toModel];

		if (node.parent === null) {
			// no possible conversion, or this node is the source model.
			continue;
		}

		conversion[toModel] = wrapConversion(toModel, graph);
	}

	return conversion;
};

{
    "env": {
        "browser": true,
        "node": true,
        "commonjs": true,
        "es6": true
    },
    "extends": "eslint:recommended",
    "rules": {
        "strict": 2,
        "indent": 0,
        "linebreak-style": 0,
        "quotes": 0,
        "semi": 0,
        "no-cond-assign": 1,
        "no-constant-condition": 1,
        "no-duplicate-case": 1,
        "no-empty": 1,
        "no-ex-assign": 1,
        "no-extra-boolean-cast": 1,
        "no-extra-semi": 1,
        "no-fallthrough": 1,
        "no-func-assign": 1,
        "no-global-assign": 1,
        "no-implicit-globals": 2,
        "no-inner-declarations": ["error", "functions"],
        "no-irregular-whitespace": 2,
        "no-loop-func": 1,
        "no-multi-str": 1,
        "no-mixed-spaces-and-tabs": 1,
        "no-proto": 1,
        "no-sequences": 1,
        "no-throw-literal": 1,
        "no-unmodified-loop-condition": 1,
        "no-useless-call": 1,
        "no-void": 1,
        "no-with": 2,
        "wrap-iife": 1,
        "no-redeclare": 1,
        "no-unused-vars": ["error", { "vars": "all", "args": "none" }],
        "no-sparse-arrays": 1
    }
}
The MIT License (MIT)
Copyright (c) 2015 Dmitry Ivanov

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.'use strict'

module.exports = {
	"aliceblue": [240, 248, 255],
	"antiquewhite": [250, 235, 215],
	"aqua": [0, 255, 255],
	"aquamarine": [127, 255, 212],
	"azure": [240, 255, 255],
	"beige": [245, 245, 220],
	"bisque": [255, 228, 196],
	"black": [0, 0, 0],
	"blanchedalmond": [255, 235, 205],
	"blue": [0, 0, 255],
	"blueviolet": [138, 43, 226],
	"brown": [165, 42, 42],
	"burlywood": [222, 184, 135],
	"cadetblue": [95, 158, 160],
	"chartreuse": [127, 255, 0],
	"chocolate": [210, 105, 30],
	"coral": [255, 127, 80],
	"cornflowerblue": [100, 149, 237],
	"cornsilk": [255, 248, 220],
	"crimson": [220, 20, 60],
	"cyan": [0, 255, 255],
	"darkblue": [0, 0, 139],
	"darkcyan": [0, 139, 139],
	"darkgoldenrod": [184, 134, 11],
	"darkgray": [169, 169, 169],
	"darkgreen": [0, 100, 0],
	"darkgrey": [169, 169, 169],
	"darkkhaki": [189, 183, 107],
	"darkmagenta": [139, 0, 139],
	"darkolivegreen": [85, 107, 47],
	"darkorange": [255, 140, 0],
	"darkorchid": [153, 50, 204],
	"darkred": [139, 0, 0],
	"darksalmon": [233, 150, 122],
	"darkseagreen": [143, 188, 143],
	"darkslateblue": [72, 61, 139],
	"darkslategray": [47, 79, 79],
	"darkslategrey": [47, 79, 79],
	"darkturquoise": [0, 206, 209],
	"darkviolet": [148, 0, 211],
	"deeppink": [255, 20, 147],
	"deepskyblue": [0, 191, 255],
	"dimgray": [105, 105, 105],
	"dimgrey": [105, 105, 105],
	"dodgerblue": [30, 144, 255],
	"firebrick": [178, 34, 34],
	"floralwhite": [255, 250, 240],
	"forestgreen": [34, 139, 34],
	"fuchsia": [255, 0, 255],
	"gainsboro": [220, 220, 220],
	"ghostwhite": [248, 248, 255],
	"gold": [255, 215, 0],
	"goldenrod": [218, 165, 32],
	"gray": [128, 128, 128],
	"green": [0, 128, 0],
	"greenyellow": [173, 255, 47],
	"grey": [128, 128, 128],
	"honeydew": [240, 255, 240],
	"hotpink": [255, 105, 180],
	"indianred": [205, 92, 92],
	"indigo": [75, 0, 130],
	"ivory": [255, 255, 240],
	"khaki": [240, 230, 140],
	"lavender": [230, 230, 250],
	"lavenderblush": [255, 240, 245],
	"lawngreen": [124, 252, 0],
	"lemonchiffon": [255, 250, 205],
	"lightblue": [173, 216, 230],
	"lightcoral": [240, 128, 128],
	"lightcyan": [224, 255, 255],
	"lightgoldenrodyellow": [250, 250, 210],
	"lightgray": [211, 211, 211],
	"lightgreen": [144, 238, 144],
	"lightgrey": [211, 211, 211],
	"lightpink": [255, 182, 193],
	"lightsalmon": [255, 160, 122],
	"lightseagreen": [32, 178, 170],
	"lightskyblue": [135, 206, 250],
	"lightslategray": [119, 136, 153],
	"lightslategrey": [119, 136, 153],
	"lightsteelblue": [176, 196, 222],
	"lightyellow": [255, 255, 224],
	"lime": [0, 255, 0],
	"limegreen": [50, 205, 50],
	"linen": [250, 240, 230],
	"magenta": [255, 0, 255],
	"maroon": [128, 0, 0],
	"mediumaquamarine": [102, 205, 170],
	"mediumblue": [0, 0, 205],
	"mediumorchid": [186, 85, 211],
	"mediumpurple": [147, 112, 219],
	"mediumseagreen": [60, 179, 113],
	"mediumslateblue": [123, 104, 238],
	"mediumspringgreen": [0, 250, 154],
	"mediumturquoise": [72, 209, 204],
	"mediumvioletred": [199, 21, 133],
	"midnightblue": [25, 25, 112],
	"mintcream": [245, 255, 250],
	"mistyrose": [255, 228, 225],
	"moccasin": [255, 228, 181],
	"navajowhite": [255, 222, 173],
	"navy": [0, 0, 128],
	"oldlace": [253, 245, 230],
	"olive": [128, 128, 0],
	"olivedrab": [107, 142, 35],
	"orange": [255, 165, 0],
	"orangered": [255, 69, 0],
	"orchid": [218, 112, 214],
	"palegoldenrod": [238, 232, 170],
	"palegreen": [152, 251, 152],
	"paleturquoise": [175, 238, 238],
	"palevioletred": [219, 112, 147],
	"papayawhip": [255, 239, 213],
	"peachpuff": [255, 218, 185],
	"peru": [205, 133, 63],
	"pink": [255, 192, 203],
	"plum": [221, 160, 221],
	"powderblue": [176, 224, 230],
	"purple": [128, 0, 128],
	"rebeccapurple": [102, 51, 153],
	"red": [255, 0, 0],
	"rosybrown": [188, 143, 143],
	"royalblue": [65, 105, 225],
	"saddlebrown": [139, 69, 19],
	"salmon": [250, 128, 114],
	"sandybrown": [244, 164, 96],
	"seagreen": [46, 139, 87],
	"seashell": [255, 245, 238],
	"sienna": [160, 82, 45],
	"silver": [192, 192, 192],
	"skyblue": [135, 206, 235],
	"slateblue": [106, 90, 205],
	"slategray": [112, 128, 144],
	"slategrey": [112, 128, 144],
	"snow": [255, 250, 250],
	"springgreen": [0, 255, 127],
	"steelblue": [70, 130, 180],
	"tan": [210, 180, 140],
	"teal": [0, 128, 128],
	"thistle": [216, 191, 216],
	"tomato": [255, 99, 71],
	"turquoise": [64, 224, 208],
	"violet": [238, 130, 238],
	"wheat": [245, 222, 179],
	"white": [255, 255, 255],
	"whitesmoke": [245, 245, 245],
	"yellow": [255, 255, 0],
	"yellowgreen": [154, 205, 50]
};
{
  "author": {
    "name": "DY",
    "email": "dfcreative@gmail.com"
  },
  "deprecated": false,
  "description": "A list of color names and its values",
  "homepage": "https://github.com/dfcreative/color-name",
  "license": "MIT",
  "main": "index.js",
  "name": "color-name",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/dfcreative/color-name.git"
  },
  "version": "1.1.3"
}Copyright (c) 2011 Debuggable Limited <felix@debuggable.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
# combined-stream

A stream that emits multiple other streams one after another.

**NB** Currently `combined-stream` works with streams version 1 only. There is ongoing effort to switch this library to streams version 2. Any help is welcome. :) Meanwhile you can explore other libraries that provide streams2 support with more or less compatibility with `combined-stream`.

- [combined-stream2](https://www.npmjs.com/package/combined-stream2): A drop-in streams2-compatible replacement for the combined-stream module.

- [multistream](https://www.npmjs.com/package/multistream): A stream that emits multiple other streams one after another.

## Installation

``` bash
npm install combined-stream
```

## Usage

Here is a simple example that shows how you can use combined-stream to combine
two files into one:

``` javascript
var CombinedStream = require('combined-stream');
var fs = require('fs');

var combinedStream = CombinedStream.create();
combinedStream.append(fs.createReadStream('file1.txt'));
combinedStream.append(fs.createReadStream('file2.txt'));

combinedStream.pipe(fs.createWriteStream('combined.txt'));
```

While the example above works great, it will pause all source streams until
they are needed. If you don't want that to happen, you can set `pauseStreams`
to `false`:

``` javascript
var CombinedStream = require('combined-stream');
var fs = require('fs');

var combinedStream = CombinedStream.create({pauseStreams: false});
combinedStream.append(fs.createReadStream('file1.txt'));
combinedStream.append(fs.createReadStream('file2.txt'));

combinedStream.pipe(fs.createWriteStream('combined.txt'));
```

However, what if you don't have all the source streams yet, or you don't want
to allocate the resources (file descriptors, memory, etc.) for them right away?
Well, in that case you can simply provide a callback that supplies the stream
by calling a `next()` function:

``` javascript
var CombinedStream = require('combined-stream');
var fs = require('fs');

var combinedStream = CombinedStream.create();
combinedStream.append(function(next) {
  next(fs.createReadStream('file1.txt'));
});
combinedStream.append(function(next) {
  next(fs.createReadStream('file2.txt'));
});

combinedStream.pipe(fs.createWriteStream('combined.txt'));
```

## API

### CombinedStream.create([options])

Returns a new combined stream object. Available options are:

* `maxDataSize`
* `pauseStreams`

The effect of those options is described below.

### combinedStream.pauseStreams = `true`

Whether to apply back pressure to the underlaying streams. If set to `false`,
the underlaying streams will never be paused. If set to `true`, the
underlaying streams will be paused right after being appended, as well as when
`delayedStream.pipe()` wants to throttle.

### combinedStream.maxDataSize = `2 * 1024 * 1024`

The maximum amount of bytes (or characters) to buffer for all source streams.
If this value is exceeded, `combinedStream` emits an `'error'` event.

### combinedStream.dataSize = `0`

The amount of bytes (or characters) currently buffered by `combinedStream`.

### combinedStream.append(stream)

Appends the given `stream` to the combinedStream object. If `pauseStreams` is
set to `true, this stream will also be paused right away.

`streams` can also be a function that takes one parameter called `next`. `next`
is a function that must be invoked in order to provide the `next` stream, see
example above.

Regardless of how the `stream` is appended, combined-stream always attaches an
`'error'` listener to it, so you don't have to do that manually.

Special case: `stream` can also be a String or Buffer.

### combinedStream.write(data)

You should not call this, `combinedStream` takes care of piping the appended
streams into itself for you.

### combinedStream.resume()

Causes `combinedStream` to start drain the streams it manages. The function is
idempotent, and also emits a `'resume'` event each time which usually goes to
the stream that is currently being drained.

### combinedStream.pause();

If `combinedStream.pauseStreams` is set to `false`, this does nothing.
Otherwise a `'pause'` event is emitted, this goes to the stream that is
currently being drained, so you can use it to apply back pressure.

### combinedStream.end();

Sets `combinedStream.writable` to false, emits an `'end'` event, and removes
all streams from the queue.

### combinedStream.destroy();

Same as `combinedStream.end()`, except it emits a `'close'` event instead of
`'end'`.

## License

combined-stream is licensed under the MIT license.
{
  "author": {
    "name": "Felix GeisendÃ¶rfer",
    "email": "felix@debuggable.com",
    "url": "http://debuggable.com/"
  },
  "dependencies": {
    "delayed-stream": "~1.0.0"
  },
  "deprecated": false,
  "description": "A stream that emits multiple other streams one after another.",
  "devDependencies": {
    "far": "~0.0.7"
  },
  "engines": {
    "node": ">= 0.8"
  },
  "homepage": "https://github.com/felixge/node-combined-stream",
  "license": "MIT",
  "main": "./lib/combined_stream",
  "name": "combined-stream",
  "repository": {
    "type": "git",
    "url": "git://github.com/felixge/node-combined-stream.git"
  },
  "version": "1.0.8"
}var util = require('util');
var Stream = require('stream').Stream;
var DelayedStream = require('delayed-stream');

module.exports = CombinedStream;
function CombinedStream() {
  this.writable = false;
  this.readable = true;
  this.dataSize = 0;
  this.maxDataSize = 2 * 1024 * 1024;
  this.pauseStreams = true;

  this._released = false;
  this._streams = [];
  this._currentStream = null;
  this._insideLoop = false;
  this._pendingNext = false;
}
util.inherits(CombinedStream, Stream);

CombinedStream.create = function(options) {
  var combinedStream = new this();

  options = options || {};
  for (var option in options) {
    combinedStream[option] = options[option];
  }

  return combinedStream;
};

CombinedStream.isStreamLike = function(stream) {
  return (typeof stream !== 'function')
    && (typeof stream !== 'string')
    && (typeof stream !== 'boolean')
    && (typeof stream !== 'number')
    && (!Buffer.isBuffer(stream));
};

CombinedStream.prototype.append = function(stream) {
  var isStreamLike = CombinedStream.isStreamLike(stream);

  if (isStreamLike) {
    if (!(stream instanceof DelayedStream)) {
      var newStream = DelayedStream.create(stream, {
        maxDataSize: Infinity,
        pauseStream: this.pauseStreams,
      });
      stream.on('data', this._checkDataSize.bind(this));
      stream = newStream;
    }

    this._handleErrors(stream);

    if (this.pauseStreams) {
      stream.pause();
    }
  }

  this._streams.push(stream);
  return this;
};

CombinedStream.prototype.pipe = function(dest, options) {
  Stream.prototype.pipe.call(this, dest, options);
  this.resume();
  return dest;
};

CombinedStream.prototype._getNext = function() {
  this._currentStream = null;

  if (this._insideLoop) {
    this._pendingNext = true;
    return; // defer call
  }

  this._insideLoop = true;
  try {
    do {
      this._pendingNext = false;
      this._realGetNext();
    } while (this._pendingNext);
  } finally {
    this._insideLoop = false;
  }
};

CombinedStream.prototype._realGetNext = function() {
  var stream = this._streams.shift();


  if (typeof stream == 'undefined') {
    this.end();
    return;
  }

  if (typeof stream !== 'function') {
    this._pipeNext(stream);
    return;
  }

  var getStream = stream;
  getStream(function(stream) {
    var isStreamLike = CombinedStream.isStreamLike(stream);
    if (isStreamLike) {
      stream.on('data', this._checkDataSize.bind(this));
      this._handleErrors(stream);
    }

    this._pipeNext(stream);
  }.bind(this));
};

CombinedStream.prototype._pipeNext = function(stream) {
  this._currentStream = stream;

  var isStreamLike = CombinedStream.isStreamLike(stream);
  if (isStreamLike) {
    stream.on('end', this._getNext.bind(this));
    stream.pipe(this, {end: false});
    return;
  }

  var value = stream;
  this.write(value);
  this._getNext();
};

CombinedStream.prototype._handleErrors = function(stream) {
  var self = this;
  stream.on('error', function(err) {
    self._emitError(err);
  });
};

CombinedStream.prototype.write = function(data) {
  this.emit('data', data);
};

CombinedStream.prototype.pause = function() {
  if (!this.pauseStreams) {
    return;
  }

  if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause();
  this.emit('pause');
};

CombinedStream.prototype.resume = function() {
  if (!this._released) {
    this._released = true;
    this.writable = true;
    this._getNext();
  }

  if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume();
  this.emit('resume');
};

CombinedStream.prototype.end = function() {
  this._reset();
  this.emit('end');
};

CombinedStream.prototype.destroy = function() {
  this._reset();
  this.emit('close');
};

CombinedStream.prototype._reset = function() {
  this.writable = false;
  this._streams = [];
  this._currentStream = null;
};

CombinedStream.prototype._checkDataSize = function() {
  this._updateDataSize();
  if (this.dataSize <= this.maxDataSize) {
    return;
  }

  var message =
    'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.';
  this._emitError(new Error(message));
};

CombinedStream.prototype._updateDataSize = function() {
  this.dataSize = 0;

  var self = this;
  this._streams.forEach(function(stream) {
    if (!stream.dataSize) {
      return;
    }

    self.dataSize += stream.dataSize;
  });

  if (this._currentStream && this._currentStream.dataSize) {
    this.dataSize += this._currentStream.dataSize;
  }
};

CombinedStream.prototype._emitError = function(err) {
  this._reset();
  this.emit('error', err);
};
The MIT License (MIT)

Copyright (c) 2015 Steve Mao

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';
var arrayify = require('array-ify');
var dotPropGet = require('dot-prop').get;

function compareFunc(prop) {
  return function(a, b) {
    var ret = 0;

    arrayify(prop).some(function(el) {
      var x;
      var y;

      if (typeof el === 'function') {
        x = el(a);
        y = el(b);
      } else if (typeof el === 'string') {
        x = dotPropGet(a, el);
        y = dotPropGet(b, el);
      } else {
        x = a;
        y = b;
      }

      if (x === y) {
        ret = 0;
        return;
      }

      if (typeof x === 'string' && typeof y === 'string') {
        ret = x.localeCompare(y);
        return ret !== 0;
      }

      ret = x < y ? -1 : 1;
      return true;
    });

    return ret;
  };
}

module.exports = compareFunc;
{
  "author": {
    "name": "Steve Mao",
    "email": "maochenyan@gmail.com",
    "url": "https://github.com/stevemao"
  },
  "dependencies": {
    "array-ify": "^1.0.0",
    "dot-prop": "^3.0.0"
  },
  "deprecated": false,
  "description": "Get a compare function for array to sort",
  "devDependencies": {
    "coveralls": "^2.11.2",
    "istanbul": "^0.4.4",
    "jscs": "^3.0.5",
    "jshint": "^2.7.0",
    "mocha": "^2.5.1"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/stevemao/compare-func",
  "license": "MIT",
  "name": "compare-func",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/stevemao/compare-func.git"
  },
  "version": "1.3.4"
}'use strict';

/**
 * Compare semver version numbers
 *
 * @param {String} a
 * @param {String} b
 * @api public
 */

module.exports = function(a, b) {
    var i;
    var len;

    if (typeof a + typeof b !== 'stringstring') {
        return false;
    }

    a = a.split('.');
    b = b.split('.');
    i = 0;
    len = Math.max(a.length, b.length);

    for (; i < len; i++) {
        if ((a[i] && !b[i] && parseInt(a[i]) > 0) || (parseInt(a[i]) > parseInt(b[i]))) {
            return 1;
        } else if ((b[i] && !a[i] && parseInt(b[i]) > 0) || (parseInt(a[i]) < parseInt(b[i]))) {
            return -1;
        }
    }

    return 0;
};
{
  "author": {
    "name": "Kevin MÃ¥rtensson",
    "email": "kevinmartensson@gmail.com",
    "url": "https://github.com/kevva"
  },
  "deprecated": false,
  "description": "Compare semver version numbers",
  "devDependencies": {
    "browserify": "^3.44.2",
    "mocha": "^1.18.2"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/kevva/compare-version#readme",
  "license": "MIT",
  "name": "compare-version",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/kevva/compare-version.git"
  },
  "version": "0.1.2"
}This software is released under the MIT license:

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
concat-map
==========

Concatenative mapdashery.

[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map)

[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map)

example
=======

``` js
var concatMap = require('concat-map');
var xs = [ 1, 2, 3, 4, 5, 6 ];
var ys = concatMap(xs, function (x) {
    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
});
console.dir(ys);
```

***

```
[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]
```

methods
=======

``` js
var concatMap = require('concat-map')
```

concatMap(xs, fn)
-----------------

Return an array of concatenated elements by calling `fn(x, i)` for each element
`x` and each index `i` in the array `xs`.

When `fn(x, i)` returns an array, its result will be concatenated with the
result array. If `fn(x, i)` returns anything else, that value will be pushed
onto the end of the result array.

install
=======

With [npm](http://npmjs.org) do:

```
npm install concat-map
```

license
=======

MIT

notes
=====

This module was written while sitting high above the ground in a tree.
module.exports = function (xs, fn) {
    var res = [];
    for (var i = 0; i < xs.length; i++) {
        var x = fn(xs[i], i);
        if (isArray(x)) res.push.apply(res, x);
        else res.push(x);
    }
    return res;
};

var isArray = Array.isArray || function (xs) {
    return Object.prototype.toString.call(xs) === '[object Array]';
};
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "deprecated": false,
  "description": "concatenative mapdashery",
  "devDependencies": {
    "tape": "~2.4.0"
  },
  "directories": {
    "example": "example",
    "test": "test"
  },
  "homepage": "https://github.com/substack/node-concat-map#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "concat-map",
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/node-concat-map.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": {
      "ie": [
        6,
        7,
        8,
        9
      ],
      "ff": [
        3.5,
        10,
        15
      ],
      "chrome": [
        10,
        22
      ],
      "safari": [
        5.1
      ],
      "opera": [
        12
      ]
    }
  },
  "version": "0.0.1"
}The MIT License

Copyright (c) 2013 Max Ogden

Permission is hereby granted, free of charge, 
to any person obtaining a copy of this software and 
associated documentation files (the "Software"), to 
deal in the Software without restriction, including 
without limitation the rights to use, copy, modify, 
merge, publish, distribute, sublicense, and/or sell 
copies of the Software, and to permit persons to whom 
the Software is furnished to do so, 
subject to the following conditions:

The above copyright notice and this permission notice 
shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR 
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.var Writable = require('readable-stream').Writable
var inherits = require('inherits')
var bufferFrom = require('buffer-from')

if (typeof Uint8Array === 'undefined') {
  var U8 = require('typedarray').Uint8Array
} else {
  var U8 = Uint8Array
}

function ConcatStream(opts, cb) {
  if (!(this instanceof ConcatStream)) return new ConcatStream(opts, cb)

  if (typeof opts === 'function') {
    cb = opts
    opts = {}
  }
  if (!opts) opts = {}

  var encoding = opts.encoding
  var shouldInferEncoding = false

  if (!encoding) {
    shouldInferEncoding = true
  } else {
    encoding =  String(encoding).toLowerCase()
    if (encoding === 'u8' || encoding === 'uint8') {
      encoding = 'uint8array'
    }
  }

  Writable.call(this, { objectMode: true })

  this.encoding = encoding
  this.shouldInferEncoding = shouldInferEncoding

  if (cb) this.on('finish', function () { cb(this.getBody()) })
  this.body = []
}

module.exports = ConcatStream
inherits(ConcatStream, Writable)

ConcatStream.prototype._write = function(chunk, enc, next) {
  this.body.push(chunk)
  next()
}

ConcatStream.prototype.inferEncoding = function (buff) {
  var firstBuffer = buff === undefined ? this.body[0] : buff;
  if (Buffer.isBuffer(firstBuffer)) return 'buffer'
  if (typeof Uint8Array !== 'undefined' && firstBuffer instanceof Uint8Array) return 'uint8array'
  if (Array.isArray(firstBuffer)) return 'array'
  if (typeof firstBuffer === 'string') return 'string'
  if (Object.prototype.toString.call(firstBuffer) === "[object Object]") return 'object'
  return 'buffer'
}

ConcatStream.prototype.getBody = function () {
  if (!this.encoding && this.body.length === 0) return []
  if (this.shouldInferEncoding) this.encoding = this.inferEncoding()
  if (this.encoding === 'array') return arrayConcat(this.body)
  if (this.encoding === 'string') return stringConcat(this.body)
  if (this.encoding === 'buffer') return bufferConcat(this.body)
  if (this.encoding === 'uint8array') return u8Concat(this.body)
  return this.body
}

var isArray = Array.isArray || function (arr) {
  return Object.prototype.toString.call(arr) == '[object Array]'
}

function isArrayish (arr) {
  return /Array\]$/.test(Object.prototype.toString.call(arr))
}

function isBufferish (p) {
  return typeof p === 'string' || isArrayish(p) || (p && typeof p.subarray === 'function')
}

function stringConcat (parts) {
  var strings = []
  var needsToString = false
  for (var i = 0; i < parts.length; i++) {
    var p = parts[i]
    if (typeof p === 'string') {
      strings.push(p)
    } else if (Buffer.isBuffer(p)) {
      strings.push(p)
    } else if (isBufferish(p)) {
      strings.push(bufferFrom(p))
    } else {
      strings.push(bufferFrom(String(p)))
    }
  }
  if (Buffer.isBuffer(parts[0])) {
    strings = Buffer.concat(strings)
    strings = strings.toString('utf8')
  } else {
    strings = strings.join('')
  }
  return strings
}

function bufferConcat (parts) {
  var bufs = []
  for (var i = 0; i < parts.length; i++) {
    var p = parts[i]
    if (Buffer.isBuffer(p)) {
      bufs.push(p)
    } else if (isBufferish(p)) {
      bufs.push(bufferFrom(p))
    } else {
      bufs.push(bufferFrom(String(p)))
    }
  }
  return Buffer.concat(bufs)
}

function arrayConcat (parts) {
  var res = []
  for (var i = 0; i < parts.length; i++) {
    res.push.apply(res, parts[i])
  }
  return res
}

function u8Concat (parts) {
  var len = 0
  for (var i = 0; i < parts.length; i++) {
    if (typeof parts[i] === 'string') {
      parts[i] = bufferFrom(parts[i])
    }
    len += parts[i].length
  }
  var u8 = new U8(len)
  for (var i = 0, offset = 0; i < parts.length; i++) {
    var part = parts[i]
    for (var j = 0; j < part.length; j++) {
      u8[offset++] = part[j]
    }
  }
  return u8
}
{
  "author": {
    "name": "Max Ogden",
    "email": "max@maxogden.com"
  },
  "dependencies": {
    "buffer-from": "^1.0.0",
    "inherits": "^2.0.3",
    "readable-stream": "^2.2.2",
    "typedarray": "^0.0.6"
  },
  "deprecated": false,
  "description": "writable stream that concatenates strings or binary data and calls a callback with the result",
  "devDependencies": {
    "tape": "^4.6.3"
  },
  "engines": [
    "node >= 0.8"
  ],
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/maxogden/concat-stream#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "concat-stream",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/maxogden/concat-stream.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/8..latest",
      "firefox/17..latest",
      "firefox/nightly",
      "chrome/22..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  },
  "version": "1.6.2"
}'use strict';
const path = require('path');
const os = require('os');
const fs = require('graceful-fs');
const makeDir = require('make-dir');
const xdgBasedir = require('xdg-basedir');
const writeFileAtomic = require('write-file-atomic');
const dotProp = require('dot-prop');
const uniqueString = require('unique-string');

const configDir = xdgBasedir.config || path.join(os.tmpdir(), uniqueString());
const permissionError = 'You don\'t have access to this file.';
const makeDirOptions = {mode: 0o0700};
const writeFileOptions = {mode: 0o0600};

class Configstore {
	constructor(id, defaults, options = {}) {
		const pathPrefix = options.globalConfigPath ?
			path.join(id, 'config.json') :
			path.join('configstore', `${id}.json`);

		this.path = options.configPath || path.join(configDir, pathPrefix);

		if (defaults) {
			this.all = Object.assign({}, defaults, this.all);
		}
	}

	get all() {
		try {
			return JSON.parse(fs.readFileSync(this.path, 'utf8'));
		} catch (error) {
			// Create directory if it doesn't exist
			if (error.code === 'ENOENT') {
				return {};
			}

			// Improve the message of permission errors
			if (error.code === 'EACCES') {
				error.message = `${error.message}\n${permissionError}\n`;
			}

			// Empty the file if it encounters invalid JSON
			if (error.name === 'SyntaxError') {
				writeFileAtomic.sync(this.path, '', writeFileOptions);
				return {};
			}

			throw error;
		}
	}

	set all(value) {
		try {
			// Make sure the folder exists as it could have been deleted in the meantime
			makeDir.sync(path.dirname(this.path), makeDirOptions);

			writeFileAtomic.sync(this.path, JSON.stringify(value, null, '\t'), writeFileOptions);
		} catch (error) {
			// Improve the message of permission errors
			if (error.code === 'EACCES') {
				error.message = `${error.message}\n${permissionError}\n`;
			}

			throw error;
		}
	}

	get size() {
		return Object.keys(this.all || {}).length;
	}

	get(key) {
		return dotProp.get(this.all, key);
	}

	set(key, value) {
		const config = this.all;

		if (arguments.length === 1) {
			for (const k of Object.keys(key)) {
				dotProp.set(config, k, key[k]);
			}
		} else {
			dotProp.set(config, key, value);
		}

		this.all = config;
	}

	has(key) {
		return dotProp.has(this.all, key);
	}

	delete(key) {
		const config = this.all;
		dotProp.delete(config, key);
		this.all = config;
	}

	clear() {
		this.all = {};
	}
}

module.exports = Configstore;
BSD 2-Clause License

Copyright (c) Google
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "dot-prop": "^4.1.0",
    "graceful-fs": "^4.1.2",
    "make-dir": "^1.0.0",
    "unique-string": "^1.0.0",
    "write-file-atomic": "^2.0.0",
    "xdg-basedir": "^3.0.0"
  },
  "deprecated": false,
  "description": "Easily load and save config without having to think about where and how",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/yeoman/configstore#readme",
  "license": "BSD-2-Clause",
  "name": "configstore",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/yeoman/configstore.git"
  },
  "version": "4.0.0"
}spec/fixtures/*
root: true
extends: semistandard
rules:
  indent:
    - error
    - 4
  camelcase: off
  no-unused-vars:
    - error
    - args: after-used
fixtures
coverage
jasmine.json
appveyor.yml
package-lock.json
<!--
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#
-->
# Cordova-common Release Notes

### 3.2.1 (Oct 28, 2019)

* [GH-78](https://github.com/apache/cordova-common/pull/78) (windows) Add `.jsproj` as file extension for XML files ([GH-62](https://github.com/apache/cordova-common/pull/62))
* [GH-89](https://github.com/apache/cordova-common/pull/89) revert: ([GH-24](https://github.com/apache/cordova-common/pull/24)) [CB-14108](https://issues.apache.org/jira/browse/CB-14108) fix incorrect count in `config_munge`
* [GH-82](https://github.com/apache/cordova-common/pull/82) General cleanup with eslint updates
* [GH-86](https://github.com/apache/cordova-common/pull/86) eslint cleanup fixes: `operator-linebreak`
* [GH-81](https://github.com/apache/cordova-common/pull/81) remove `no-throw-literal` lint exception not needed
* [GH-83](https://github.com/apache/cordova-common/pull/83) Fix ESLint violations where applicable
* [GH-80](https://github.com/apache/cordova-common/pull/80) Update to jasmine 3.4 & fix resulting spec failures
* [GH-79](https://github.com/apache/cordova-common/pull/79) Promise handling cleanup in specs
* [GH-77](https://github.com/apache/cordova-common/pull/77) Do not ignore AppVeyor failures on Node.js 12

### 3.2.0 (Jun 12, 2019)
* (ios) plist document not indented with tabs ([#69](https://github.com/apache/cordova-common/pull/69))
* Update fs-extra to v8 ([#70](https://github.com/apache/cordova-common/pull/70))
* Add example usage of podspec declarations ([#67](https://github.com/apache/cordova-common/pull/67))
* implement setPreference and setPlatformPreference ([#63](https://github.com/apache/cordova-common/pull/63))
* Catch leaked exceptions in superspawn and convert them to rejections ([#66](https://github.com/apache/cordova-common/pull/66))

### 3.1.0 (Dec 24, 2018)
* Update Cordova events into a real singleton class ([#60](https://github.com/apache/cordova-common/pull/60))
* Refactor CordovaLogger to singleton class ([#53](https://github.com/apache/cordova-common/pull/53))

### 3.0.0 (Nov 05, 2018)
* [CB-14166](https://issues.apache.org/jira/browse/CB-14166) Use `cross-spawn` for platform-independent spawning
* add `PluginInfo.getPodSpecs` method
* [CB-13496](https://issues.apache.org/jira/browse/CB-13496) Fix greedy regex in plist-helpers
* [CB-14108](https://issues.apache.org/jira/browse/CB-14108) fix incorrect count in config_munge in ios.json and android.json
* [CB-13685](https://issues.apache.org/jira/browse/CB-13685) **Android**: Update ConfigParser for Adaptive Icons
* [CB-10071](https://issues.apache.org/jira/browse/CB-10071) Add BridgingHeader type attributes for header-file
* [CB-12016](https://issues.apache.org/jira/browse/CB-12016) Removed cordova-registry-mapper dependency
* [CB-14099](https://issues.apache.org/jira/browse/CB-14099) **osx**: Fixed Resolve Config Path for OSX
* [CB-14140](https://issues.apache.org/jira/browse/CB-14140) Replace shelljs calls with fs-extra & which

### 2.2.2 (May 30, 2018)
* [CB-13979](https://issues.apache.org/jira/browse/CB-13979) More consistency for `config.xml` lookups
* [CB-14064](https://issues.apache.org/jira/browse/CB-14064) Remove Node 4 from CI matrix
* [CB-14088](https://issues.apache.org/jira/browse/CB-14088) Update dependencies
* [CB-11691](https://issues.apache.org/jira/browse/CB-11691) Fix for modifying binary plists
* [CB-13770](https://issues.apache.org/jira/browse/CB-13770) Warn when <edit-config> or <config-file> not found
* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) Fix tests and path issues for **Windows**
* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) added unit test for config file provider
* [CB-13744](https://issues.apache.org/jira/browse/CB-13744) Recognize storyboards as XML files
* [CB-13674](https://issues.apache.org/jira/browse/CB-13674) Incremented package version to -dev

### 2.2.1 (Dec 14, 2017)
* [CB-13674](https://issues.apache.org/jira/browse/CB-13674): updated dependencies

### 2.2.0 (Nov 22, 2017)
* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) File Provider fix belongs in cordova-common
* [CB-11244](https://issues.apache.org/jira/browse/CB-11244) Spot fix for upcoming `cordova-android@7` changes. https://github.com/apache/cordova-android/pull/389

### 2.1.1 (Oct 04, 2017)
* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added `getFrameworks` to unit tests
* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added variable replacing to framework tag

### 2.1.0 (August 30, 2017)
* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added variable replacing to `framework` tag
* [CB-13211](https://issues.apache.org/jira/browse/CB-13211) Add `allows-arbitrary-loads-for-media` attribute parsing for `getAccesses`
* [CB-11968](https://issues.apache.org/jira/browse/CB-11968) Added support for `<config-file>` in `config.xml`
* [CB-12895](https://issues.apache.org/jira/browse/CB-12895) set up `eslint` and removed `jshint`
* [CB-12785](https://issues.apache.org/jira/browse/CB-12785) added `.gitignore`, `travis`, and `appveyor` support
* [CB-12250](https://issues.apache.org/jira/browse/CB-12250) & [CB-12409](https://issues.apache.org/jira/browse/CB-12409) *iOS*: Fix bug with escaping properties from `plist` file
* [CB-12762](https://issues.apache.org/jira/browse/CB-12762) updated `common`, `fetch`, and `serve` `pkgJson` to point `pkgJson` repo items to github mirrors
* [CB-12766](https://issues.apache.org/jira/browse/CB-12766) Consistently write `JSON` with 2 spaces indentation

### 2.0.3 (May 02, 2017)
* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Add option to get `resource-file` from `root`
* [CB-11908](https://issues.apache.org/jira/browse/CB-11908) Add tests for `edit-config` in `config.xml`
* [CB-12665](https://issues.apache.org/jira/browse/CB-12665) removed `enginestrict` since it is deprecated

### 2.0.2 (Apr 14, 2017)
* [CB-11233](https://issues.apache.org/jira/browse/CB-11233) - Support installing frameworks into 'Embedded Binaries' section of the Xcode project
* [CB-10438](https://issues.apache.org/jira/browse/CB-10438) - Install correct dependency version. Removed shell.remove, added pkg.json to dependency tests 1-3, and updated install.js (.replace) to fix tests in uninstall.spec.js and update to workw with jasmine 2.0
* [CB-11120](https://issues.apache.org/jira/browse/CB-11120) - Allow short/display name in config.xml
* [CB-11346](https://issues.apache.org/jira/browse/CB-11346) - Remove known platforms check
* [CB-11977](https://issues.apache.org/jira/browse/CB-11977) - updated engines and enginescript for common, fetch, and serve

### 2.0.1 (Mar 09, 2017)
* [CB-12557](https://issues.apache.org/jira/browse/CB-12557) add both stdout and stderr properties to the error object passed to superspawn reject handler.

### 2.0.0 (Jan 17, 2017)
* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Add `resource-file` parsing to `config.xml`
* [CB-12018](https://issues.apache.org/jira/browse/CB-12018): updated `jshint` and updated tests to work with `jasmine@2` instead of `jasmine-node`
* [CB-12163](https://issues.apache.org/jira/browse/CB-12163) Add reference attrib to `resource-file` for **Windows**
* Move windows-specific logic to `cordova-windows`
* [CB-12189](https://issues.apache.org/jira/browse/CB-12189) Add implementation attribute to framework

### 1.5.1 (Oct 12, 2016)
* [CB-12002](https://issues.apache.org/jira/browse/CB-12002) Add `getAllowIntents()` to `ConfigParser`
* [CB-11998](https://issues.apache.org/jira/browse/CB-11998) `cordova platform add` error with `cordova-common@1.5.0`

### 1.5.0 (Oct 06, 2016)
* [CB-11776](https://issues.apache.org/jira/browse/CB-11776) Add test case for different `edit-config` targets
* [CB-11908](https://issues.apache.org/jira/browse/CB-11908) Add `edit-config` to `config.xml`
* [CB-11936](https://issues.apache.org/jira/browse/CB-11936) Support four new **App Transport Security (ATS)** keys
* update `config.xml` location if it is a **Android Studio** project.
* use `array` methods and `object.keys` for iterating. avoiding `for-in` loops
* [CB-11517](https://issues.apache.org/jira/browse/CB-11517) Allow `.folder` matches
* [CB-11776](https://issues.apache.org/jira/browse/CB-11776) check `edit-config` target exists

### 1.4.1 (Aug 09, 2016)
* Add general purpose `ConfigParser.getAttribute` API
* [CB-11653](https://issues.apache.org/jira/browse/CB-11653) moved `findProjectRoot` from `cordova-lib` to `cordova-common`
* [CB-11636](https://issues.apache.org/jira/browse/CB-11636) Handle attributes with quotes correctly
* [CB-11645](https://issues.apache.org/jira/browse/CB-11645) added check to see if `getEditConfig` exists before trying to use it
* [CB-9825](https://issues.apache.org/jira/browse/CB-9825) framework tag spec parsing

### 1.4.0 (Jul 12, 2016)
* [CB-11023](https://issues.apache.org/jira/browse/CB-11023) Add edit-config functionality

### 1.3.0 (May 12, 2016)
* [CB-11259](https://issues.apache.org/jira/browse/CB-11259): Improving prepare and build logging
* [CB-11194](https://issues.apache.org/jira/browse/CB-11194) Improve cordova load time
* [CB-1117](https://issues.apache.org/jira/browse/CB-1117) Add `FileUpdater` module to `cordova-common`.
* [CB-11131](https://issues.apache.org/jira/browse/CB-11131) Fix `TypeError: message.toUpperCase` is not a function in `CordovaLogger`

### 1.2.0 (Apr 18, 2016)
* [CB-11022](https://issues.apache.org/jira/browse/CB-11022) Save modulesMetadata to both www and platform_www when necessary
* [CB-10833](https://issues.apache.org/jira/browse/CB-10833) Deduplicate common logic for plugin installation/uninstallation
* [CB-10822](https://issues.apache.org/jira/browse/CB-10822) Manage plugins/modules metadata using PlatformJson
* [CB-10940](https://issues.apache.org/jira/browse/CB-10940) Can't add Android platform from path
* [CB-10965](https://issues.apache.org/jira/browse/CB-10965) xml helper allows multiple instances to be merge in config.xml

### 1.1.1 (Mar 18, 2016)
* [CB-10694](https://issues.apache.org/jira/browse/CB-10694) Update test to reflect merging of [CB-9264](https://issues.apache.org/jira/browse/CB-9264) fix
* [CB-10694](https://issues.apache.org/jira/browse/CB-10694) Platform-specific configuration preferences don't override global settings
* [CB-9264](https://issues.apache.org/jira/browse/CB-9264) Duplicate entries in `config.xml`
* [CB-10791](https://issues.apache.org/jira/browse/CB-10791) Add `adjustLoggerLevel` to `cordova-common.CordovaLogger`
* [CB-10662](https://issues.apache.org/jira/browse/CB-10662) Add tests for `ConfigParser.getStaticResources`
* [CB-10622](https://issues.apache.org/jira/browse/CB-10622) fix target attribute being ignored for images in `config.xml`.
* [CB-10583](https://issues.apache.org/jira/browse/CB-10583) Protect plugin preferences from adding extra Array properties.

### 1.1.0 (Feb 16, 2016)
* [CB-10482](https://issues.apache.org/jira/browse/CB-10482) Remove references to windows8 from cordova-lib/cli
* [CB-10430](https://issues.apache.org/jira/browse/CB-10430) Adds forwardEvents method to easily connect two EventEmitters
* [CB-10176](https://issues.apache.org/jira/browse/CB-10176) Adds CordovaLogger class, based on logger module from cordova-cli
* [CB-10052](https://issues.apache.org/jira/browse/CB-10052) Expose child process' io streams via promise progress notification
* [CB-10497](https://issues.apache.org/jira/browse/CB-10497) Prefer .bat over .cmd on windows platform
* [CB-9984](https://issues.apache.org/jira/browse/CB-9984) Bumps plist version and fixes failing cordova-common test

### 1.0.0 (Oct 29, 2015)

* [CB-9890](https://issues.apache.org/jira/browse/CB-9890) Documents cordova-common
* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Correct cordova-lib -> cordova-common in README
* Pick ConfigParser changes from apache@0c3614e
* [CB-9743](https://issues.apache.org/jira/browse/CB-9743) Removes system frameworks handling from ConfigChanges
* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Cleans out code which has been moved to `cordova-common`
* Pick ConfigParser changes from apache@ddb027b
* Picking CordovaError changes from apache@a3b1fca
* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Adds tests and fixtures based on existing cordova-lib ones
* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Initial implementation for cordova-common

/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

var addProperty = require('./src/util/addProperty');

module.exports = { };

addProperty(module, 'events', './src/events');
addProperty(module, 'superspawn', './src/superspawn');

addProperty(module, 'ActionStack', './src/ActionStack');
addProperty(module, 'CordovaError', './src/CordovaError/CordovaError');
addProperty(module, 'CordovaLogger', './src/CordovaLogger');
addProperty(module, 'CordovaCheck', './src/CordovaCheck');
addProperty(module, 'CordovaExternalToolErrorContext', './src/CordovaError/CordovaExternalToolErrorContext');
addProperty(module, 'PlatformJson', './src/PlatformJson');
addProperty(module, 'ConfigParser', './src/ConfigParser/ConfigParser');
addProperty(module, 'FileUpdater', './src/FileUpdater');

addProperty(module, 'PluginInfo', './src/PluginInfo/PluginInfo');
addProperty(module, 'PluginInfoProvider', './src/PluginInfo/PluginInfoProvider');

addProperty(module, 'PluginManager', './src/PluginManager');

addProperty(module, 'ConfigChanges', './src/ConfigChanges/ConfigChanges');
addProperty(module, 'ConfigKeeper', './src/ConfigChanges/ConfigKeeper');
addProperty(module, 'ConfigFile', './src/ConfigChanges/ConfigFile');
addProperty(module, 'mungeUtil', './src/ConfigChanges/munge-util');

addProperty(module, 'xmlHelpers', './src/util/xml-helpers');

{
  "author": {
    "name": "Apache Software Foundation"
  },
  "dependencies": {
    "ansi": "^0.3.1",
    "bplist-parser": "^0.1.0",
    "cross-spawn": "^6.0.5",
    "elementtree": "0.1.7",
    "endent": "^1.1.1",
    "fs-extra": "^8.0.0",
    "glob": "^7.1.2",
    "minimatch": "^3.0.0",
    "plist": "^3.0.1",
    "q": "^1.4.1",
    "strip-bom": "^3.0.0",
    "underscore": "^1.8.3",
    "which": "^1.3.0"
  },
  "deprecated": false,
  "description": "Apache Cordova tools and platforms shared routines",
  "devDependencies": {
    "eslint": "^5.0.0",
    "eslint-config-semistandard": "^14.0.0",
    "eslint-config-standard": "^13.0.1",
    "eslint-plugin-import": "^2.14.0",
    "eslint-plugin-node": "^8.0.0",
    "eslint-plugin-promise": "^4.0.0",
    "eslint-plugin-standard": "^4.0.0",
    "istanbul": "^0.4.5",
    "jasmine": "^3.4.0",
    "jasmine-spec-reporter": "^4.2.1",
    "osenv": "^0.1.3",
    "promise-matchers": "^0.9.6",
    "rewire": "^4.0.1"
  },
  "engines": {
    "node": ">=6.0.0"
  },
  "homepage": "https://github.com/apache/cordova-common#readme",
  "license": "Apache-2.0",
  "main": "cordova-common.js",
  "name": "cordova-common",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/apache/cordova-common.git"
  },
  "version": "3.2.1"
}/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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 quotmark:false */

var events = require('./events');
var Q = require('q');

function ActionStack () {
    this.stack = [];
    this.completed = [];
}

ActionStack.prototype = {
    createAction: function (handler, action_params, reverter, revert_params) {
        return {
            handler: {
                run: handler,
                params: action_params
            },
            reverter: {
                run: reverter,
                params: revert_params
            }
        };
    },
    push: function (tx) {
        this.stack.push(tx);
    },
    // Returns a promise.
    process: function (platform) {
        events.emit('verbose', 'Beginning processing of action stack for ' + platform + ' project...');

        while (this.stack.length) {
            var action = this.stack.shift();
            var handler = action.handler.run;
            var action_params = action.handler.params;

            try {
                handler.apply(null, action_params);
            } catch (e) {
                events.emit('warn', 'Error during processing of action! Attempting to revert...');
                this.stack.unshift(action);
                var issue = 'Uh oh!\n';
                // revert completed tasks
                while (this.completed.length) {
                    var undo = this.completed.shift();
                    var revert = undo.reverter.run;
                    var revert_params = undo.reverter.params;

                    try {
                        revert.apply(null, revert_params);
                    } catch (err) {
                        events.emit('warn', 'Error during reversion of action! We probably really messed up your project now, sorry! D:');
                        issue += 'A reversion action failed: ' + err.message + '\n';
                    }
                }
                e.message = issue + e.message;
                return Q.reject(e);
            }
            this.completed.push(action);
        }
        events.emit('verbose', 'Action stack processing complete.');

        return Q();
    }
};

module.exports = ActionStack;
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

var fs = require('fs-extra');
var path = require('path');

function isRootDir (dir) {
    if (fs.existsSync(path.join(dir, 'www'))) {
        if (fs.existsSync(path.join(dir, 'config.xml'))) {
            // For sure is.
            if (fs.existsSync(path.join(dir, 'platforms'))) {
                return 2;
            } else {
                return 1;
            }
        }
        // Might be (or may be under platforms/).
        if (fs.existsSync(path.join(dir, 'www', 'config.xml'))) {
            return 1;
        }
    }
    return 0;
}

// Runs up the directory chain looking for a .cordova directory.
// IF it is found we are in a Cordova project.
// Omit argument to use CWD.
function isCordova (dir) {
    if (!dir) {
        // Prefer PWD over cwd so that symlinked dirs within your PWD work correctly (CB-5687).
        var pwd = process.env.PWD;
        var cwd = process.cwd();
        if (pwd && pwd !== cwd && pwd !== 'undefined') {
            return isCordova(pwd) || isCordova(cwd);
        }
        return isCordova(cwd);
    }
    var bestReturnValueSoFar = false;
    for (var i = 0; i < 1000; ++i) {
        var result = isRootDir(dir);
        if (result === 2) {
            return dir;
        }
        if (result === 1) {
            bestReturnValueSoFar = dir;
        }
        var parentDir = path.normalize(path.join(dir, '..'));
        // Detect fs root.
        if (parentDir === dir) {
            return bestReturnValueSoFar;
        }
        dir = parentDir;
    }
    console.error('Hit an unhandled case in CordovaCheck.isCordova');
    return false;
}

module.exports = {
    findProjectRoot: isCordova
};
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
 */

const ansi = require('ansi');
const EventEmitter = require('events').EventEmitter;
const EOL = require('os').EOL;
const formatError = require('./util/formatError');

const INSTANCE_KEY = Symbol.for('org.apache.cordova.common.CordovaLogger');

/**
 * @typedef {'verbose'|'normal'|'warn'|'info'|'error'|'results'} CordovaLoggerLevel
 */

/**
 * Implements logging facility that anybody could use.
 *
 * Should not be instantiated directly! `CordovaLogger.get()` method should be
 * used instead to acquire the logger instance.
 */
class CordovaLogger {
    // Encapsulate the default logging level values with constants:
    static get VERBOSE () { return 'verbose'; }

    static get NORMAL () { return 'normal'; }

    static get WARN () { return 'warn'; }

    static get INFO () { return 'info'; }

    static get ERROR () { return 'error'; }

    static get RESULTS () { return 'results'; }

    /**
     * Static method to create new or acquire existing instance.
     *
     * @returns {CordovaLogger} Logger instance
     */
    static get () {
        // This singleton instance pattern is based on the ideas from
        // https://derickbailey.com/2016/03/09/creating-a-true-singleton-in-node-js-with-es6-symbols/
        if (Object.getOwnPropertySymbols(global).indexOf(INSTANCE_KEY) === -1) {
            global[INSTANCE_KEY] = new CordovaLogger();
        }
        return global[INSTANCE_KEY];
    }

    constructor () {
        /** @private */
        this.levels = {};
        /** @private */
        this.colors = {};
        /** @private */
        this.stdout = process.stdout;
        /** @private */
        this.stderr = process.stderr;

        /** @private */
        this.stdoutCursor = ansi(this.stdout);
        /** @private */
        this.stderrCursor = ansi(this.stderr);

        this.addLevel(CordovaLogger.VERBOSE, 1000, 'grey');
        this.addLevel(CordovaLogger.NORMAL, 2000);
        this.addLevel(CordovaLogger.WARN, 2000, 'yellow');
        this.addLevel(CordovaLogger.INFO, 3000, 'blue');
        this.addLevel(CordovaLogger.ERROR, 5000, 'red');
        this.addLevel(CordovaLogger.RESULTS, 10000);

        this.setLevel(CordovaLogger.NORMAL);
    }

    /**
     * Emits log message to process' stdout/stderr depending on message's
     * severity and current log level. If severity is less than current
     * logger's level, then the message is ignored.
     *
     * @param {CordovaLoggerLevel} logLevel - The message's log level. The
     *   logger should have corresponding level added (via logger.addLevel),
     *   otherwise `CordovaLogger.NORMAL` level will be used.
     *
     * @param {string} message - The message, that should be logged to
     *   process's stdio.
     *
     * @returns {CordovaLogger} Return the current instance, to allow chaining.
     */
    log (logLevel, message) {
        // if there is no such logLevel defined, or provided level has
        // less severity than active level, then just ignore this call and return
        if (!this.levels[logLevel] || this.levels[logLevel] < this.levels[this.logLevel]) {
            // return instance to allow to chain calls
            return this;
        }

        var isVerbose = this.logLevel === CordovaLogger.VERBOSE;
        var cursor = this.stdoutCursor;

        if (message instanceof Error || logLevel === CordovaLogger.ERROR) {
            message = formatError(message, isVerbose);
            cursor = this.stderrCursor;
        }

        var color = this.colors[logLevel];
        if (color) {
            cursor.bold().fg[color]();
        }

        cursor.write(message).reset().write(EOL);

        return this;
    }

    /**
     * Adds a new level to logger instance.
     *
     * This method also creates a shortcut method to log events with the level
     * provided.
     * (i.e. after adding new level 'debug', the method `logger.debug(message)`
     * will exist, equal to `logger.log('debug', message)`)
     *
     * @param {CordovaLoggerLevel} level - A log level name. The levels with
     *   the following names are added by default to every instance: 'verbose',
     *   'normal', 'warn', 'info', 'error', 'results'.
     *
     * @param {number} severity - A number that represents level's severity.
     *
     * @param {string} color - A valid color name, that will be used to log
     *   messages with this level. Any CSS color code or RGB value is allowed
     *   (according to ansi documentation:
     *   https://github.com/TooTallNate/ansi.js#features).
     *
     * @returns {CordovaLogger} Return the current instance, to allow chaining.
     */
    addLevel (level, severity, color) {
        this.levels[level] = severity;

        if (color) {
            this.colors[level] = color;
        }

        // Define own method with corresponding name
        if (!this[level]) {
            Object.defineProperty(this, level, {
                get () { return this.log.bind(this, level); }
            });
        }

        return this;
    }

    /**
     * Sets the current logger level to provided value.
     *
     * If logger doesn't have level with this name, `CordovaLogger.NORMAL` will
     * be used.
     *
     * @param {CordovaLoggerLevel} logLevel - Level name. The level with this
     *   name should be added to logger before.
     *
     * @returns {CordovaLogger} Current instance, to allow chaining.
     */
    setLevel (logLevel) {
        this.logLevel = this.levels[logLevel] ? logLevel : CordovaLogger.NORMAL;

        return this;
    }

    /**
     * Adjusts the current logger level according to the passed options.
     *
     * @param {Object|Array<string>} opts - An object or args array with
     *   options.
     *
     * @returns {CordovaLogger} Current instance, to allow chaining.
     */
    adjustLevel (opts) {
        if (opts.verbose || (Array.isArray(opts) && opts.includes('--verbose'))) {
            this.setLevel('verbose');
        } else if (opts.silent || (Array.isArray(opts) && opts.includes('--silent'))) {
            this.setLevel('error');
        }

        return this;
    }

    /**
     * Attaches logger to EventEmitter instance provided.
     *
     * @param {EventEmitter} eventEmitter - An EventEmitter instance to attach
     *   the logger to.
     *
     * @returns {CordovaLogger} Current instance, to allow chaining.
     */
    subscribe (eventEmitter) {
        if (!(eventEmitter instanceof EventEmitter)) {
            throw new Error('Subscribe method only accepts an EventEmitter instance as argument');
        }

        eventEmitter.on('verbose', this.verbose)
            .on('log', this.normal)
            .on('info', this.info)
            .on('warn', this.warn)
            .on('warning', this.warn)
            // Set up event handlers for logging and results emitted as events.
            .on('results', this.results);

        return this;
    }
}

module.exports = CordovaLogger;
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

'use strict';

var fs = require('fs-extra');
var path = require('path');
var minimatch = require('minimatch');

/**
 * Logging callback used in the FileUpdater methods.
 * @callback loggingCallback
 * @param {string} message A message describing a single file update operation.
 */

/**
 * Updates a target file or directory with a source file or directory. (Directory updates are
 * not recursive.) Stats for target and source items must be passed in. This is an internal
 * helper function used by other methods in this module.
 *
 * @param {?string} sourcePath Source file or directory to be used to update the
 *     destination. If the source is null, then the destination is deleted if it exists.
 * @param {?fs.Stats} sourceStats An instance of fs.Stats for the source path, or null if
 *     the source does not exist.
 * @param {string} targetPath Required destination file or directory to be updated. If it does
 *     not exist, it will be created.
 * @param {?fs.Stats} targetStats An instance of fs.Stats for the target path, or null if
 *     the target does not exist.
 * @param {Object} [options] Optional additional parameters for the update.
 * @param {string} [options.rootDir] Optional root directory (such as a project) to which target
 *     and source path parameters are relative; may be omitted if the paths are absolute. The
 *     rootDir is always omitted from any logged paths, to make the logs easier to read.
 * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
 *     Otherwise, a file is copied if the source's last-modified time is greather than or
 *     equal to the target's last-modified time, or if the file sizes are different.
 * @param {loggingCallback} [log] Optional logging callback that takes a string message
 *     describing any file operations that are performed.
 * @return {boolean} true if any changes were made, or false if the force flag is not set
 *     and everything was up to date
 */
function updatePathWithStats (sourcePath, sourceStats, targetPath, targetStats, options, log) {
    var updated = false;

    var rootDir = (options && options.rootDir) || '';
    var copyAll = (options && options.all) || false;

    var targetFullPath = path.join(rootDir || '', targetPath);

    if (sourceStats) {
        var sourceFullPath = path.join(rootDir || '', sourcePath);

        if (targetStats && (targetStats.isDirectory() !== sourceStats.isDirectory())) {
            // The target exists. But if the directory status doesn't match the source, delete it.
            log('delete ' + targetPath);
            fs.removeSync(targetFullPath);
            targetStats = null;
            updated = true;
        }

        if (!targetStats) {
            if (sourceStats.isDirectory()) {
                // The target directory does not exist, so it should be created.
                log('mkdir ' + targetPath);
                fs.ensureDirSync(targetFullPath);
                updated = true;
            } else if (sourceStats.isFile()) {
                // The target file does not exist, so it should be copied from the source.
                log('copy  ' + sourcePath + ' ' + targetPath + (copyAll ? '' : ' (new file)'));
                fs.copySync(sourceFullPath, targetFullPath);
                updated = true;
            }
        } else if (sourceStats.isFile() && targetStats.isFile()) {
            // The source and target paths both exist and are files.
            if (copyAll) {
                // The caller specified all files should be copied.
                log('copy  ' + sourcePath + ' ' + targetPath);
                fs.copySync(sourceFullPath, targetFullPath);
                updated = true;
            } else {
                // Copy if the source has been modified since it was copied to the target, or if
                // the file sizes are different. (The latter catches most cases in which something
                // was done to the file after copying.) Comparison is >= rather than > to allow
                // for timestamps lacking sub-second precision in some filesystems.
                if (sourceStats.mtime.getTime() >= targetStats.mtime.getTime() ||
                        sourceStats.size !== targetStats.size) {
                    log('copy  ' + sourcePath + ' ' + targetPath + ' (updated file)');
                    fs.copySync(sourceFullPath, targetFullPath);
                    updated = true;
                }
            }
        }
    } else if (targetStats) {
        // The target exists but the source is null, so the target should be deleted.
        log('delete ' + targetPath + (copyAll ? '' : ' (no source)'));
        fs.removeSync(targetFullPath);
        updated = true;
    }

    return updated;
}

/**
 * Helper for updatePath and updatePaths functions. Queries stats for source and target
 * and ensures target directory exists before copying a file.
 */
function updatePathInternal (sourcePath, targetPath, options, log) {
    var rootDir = (options && options.rootDir) || '';
    var targetFullPath = path.join(rootDir, targetPath);
    var targetStats = fs.existsSync(targetFullPath) ? fs.statSync(targetFullPath) : null;
    var sourceStats = null;

    if (sourcePath) {
        // A non-null source path was specified. It should exist.
        var sourceFullPath = path.join(rootDir, sourcePath);
        if (!fs.existsSync(sourceFullPath)) {
            throw new Error('Source path does not exist: ' + sourcePath);
        }

        sourceStats = fs.statSync(sourceFullPath);

        // Create the target's parent directory if it doesn't exist.
        var parentDir = path.dirname(targetFullPath);
        if (!fs.existsSync(parentDir)) {
            fs.ensureDirSync(parentDir);
        }
    }

    return updatePathWithStats(sourcePath, sourceStats, targetPath, targetStats, options, log);
}

/**
 * Updates a target file or directory with a source file or directory. (Directory updates are
 * not recursive.)
 *
 * @param {?string} sourcePath Source file or directory to be used to update the
 *     destination. If the source is null, then the destination is deleted if it exists.
 * @param {string} targetPath Required destination file or directory to be updated. If it does
 *     not exist, it will be created.
 * @param {Object} [options] Optional additional parameters for the update.
 * @param {string} [options.rootDir] Optional root directory (such as a project) to which target
 *     and source path parameters are relative; may be omitted if the paths are absolute. The
 *     rootDir is always omitted from any logged paths, to make the logs easier to read.
 * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
 *     Otherwise, a file is copied if the source's last-modified time is greather than or
 *     equal to the target's last-modified time, or if the file sizes are different.
 * @param {loggingCallback} [log] Optional logging callback that takes a string message
 *     describing any file operations that are performed.
 * @return {boolean} true if any changes were made, or false if the force flag is not set
 *     and everything was up to date
 */
function updatePath (sourcePath, targetPath, options, log) {
    if (sourcePath !== null && typeof sourcePath !== 'string') {
        throw new Error('A source path (or null) is required.');
    }

    if (!targetPath || typeof targetPath !== 'string') {
        throw new Error('A target path is required.');
    }

    log = log || function () { };

    return updatePathInternal(sourcePath, targetPath, options, log);
}

/**
 * Updates files and directories based on a mapping from target paths to source paths. Targets
 * with null sources in the map are deleted.
 *
 * @param {Object} pathMap A dictionary mapping from target paths to source paths.
 * @param {Object} [options] Optional additional parameters for the update.
 * @param {string} [options.rootDir] Optional root directory (such as a project) to which target
 *     and source path parameters are relative; may be omitted if the paths are absolute. The
 *     rootDir is always omitted from any logged paths, to make the logs easier to read.
 * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
 *     Otherwise, a file is copied if the source's last-modified time is greather than or
 *     equal to the target's last-modified time, or if the file sizes are different.
 * @param {loggingCallback} [log] Optional logging callback that takes a string message
 *     describing any file operations that are performed.
 * @return {boolean} true if any changes were made, or false if the force flag is not set
 *     and everything was up to date
 */
function updatePaths (pathMap, options, log) {
    if (!pathMap || typeof pathMap !== 'object' || Array.isArray(pathMap)) {
        throw new Error('An object mapping from target paths to source paths is required.');
    }

    log = log || function () { };

    var updated = false;

    // Iterate in sorted order to ensure directories are created before files under them.
    Object.keys(pathMap).sort().forEach(function (targetPath) {
        var sourcePath = pathMap[targetPath];
        updated = updatePathInternal(sourcePath, targetPath, options, log) || updated;
    });

    return updated;
}

/**
 * Updates a target directory with merged files and subdirectories from source directories.
 *
 * @param {string|string[]} sourceDirs Required source directory or array of source directories
 *     to be merged into the target. The directories are listed in order of precedence; files in
 *     directories later in the array supersede files in directories earlier in the array
 *     (regardless of timestamps).
 * @param {string} targetDir Required destination directory to be updated. If it does not exist,
 *     it will be created. If it exists, newer files from source directories will be copied over,
 *     and files missing in the source directories will be deleted.
 * @param {Object} [options] Optional additional parameters for the update.
 * @param {string} [options.rootDir] Optional root directory (such as a project) to which target
 *     and source path parameters are relative; may be omitted if the paths are absolute. The
 *     rootDir is always omitted from any logged paths, to make the logs easier to read.
 * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
 *     Otherwise, a file is copied if the source's last-modified time is greather than or
 *     equal to the target's last-modified time, or if the file sizes are different.
 * @param {string|string[]} [options.include] Optional glob string or array of glob strings that
 *     are tested against both target and source relative paths to determine if they are included
 *     in the merge-and-update. If unspecified, all items are included.
 * @param {string|string[]} [options.exclude] Optional glob string or array of glob strings that
 *     are tested against both target and source relative paths to determine if they are excluded
 *     from the merge-and-update. Exclusions override inclusions. If unspecified, no items are
 *     excluded.
 * @param {loggingCallback} [log] Optional logging callback that takes a string message
 *     describing any file operations that are performed.
 * @return {boolean} true if any changes were made, or false if the force flag is not set
 *     and everything was up to date
 */
function mergeAndUpdateDir (sourceDirs, targetDir, options, log) {
    if (sourceDirs && typeof sourceDirs === 'string') {
        sourceDirs = [sourceDirs];
    } else if (!Array.isArray(sourceDirs)) {
        throw new Error('A source directory path or array of paths is required.');
    }

    if (!targetDir || typeof targetDir !== 'string') {
        throw new Error('A target directory path is required.');
    }

    log = log || function () { };

    var rootDir = (options && options.rootDir) || '';

    var include = (options && options.include) || ['**'];
    if (typeof include === 'string') {
        include = [include];
    } else if (!Array.isArray(include)) {
        throw new Error('Include parameter must be a glob string or array of glob strings.');
    }

    var exclude = (options && options.exclude) || [];
    if (typeof exclude === 'string') {
        exclude = [exclude];
    } else if (!Array.isArray(exclude)) {
        throw new Error('Exclude parameter must be a glob string or array of glob strings.');
    }

    // Scan the files in each of the source directories.
    var sourceMaps = sourceDirs.map(function (sourceDir) {
        return path.join(rootDir, sourceDir);
    }).map(function (sourcePath) {
        if (!fs.existsSync(sourcePath)) {
            throw new Error('Source directory does not exist: ' + sourcePath);
        }
        return mapDirectory(rootDir, path.relative(rootDir, sourcePath), include, exclude);
    });

    // Scan the files in the target directory, if it exists.
    var targetMap = {};
    var targetFullPath = path.join(rootDir, targetDir);
    if (fs.existsSync(targetFullPath)) {
        targetMap = mapDirectory(rootDir, targetDir, include, exclude);
    }

    var pathMap = mergePathMaps(sourceMaps, targetMap, targetDir);

    var updated = false;

    // Iterate in sorted order to ensure directories are created before files under them.
    Object.keys(pathMap).sort().forEach(function (subPath) {
        var entry = pathMap[subPath];
        updated = updatePathWithStats(
            entry.sourcePath,
            entry.sourceStats,
            entry.targetPath,
            entry.targetStats,
            options,
            log) || updated;
    });

    return updated;
}

/**
 * Creates a dictionary map of all files and directories under a path.
 */
function mapDirectory (rootDir, subDir, include, exclude) {
    var dirMap = { '': { subDir: subDir, stats: fs.statSync(path.join(rootDir, subDir)) } };
    mapSubdirectory(rootDir, subDir, '', include, exclude, dirMap);
    return dirMap;

    function mapSubdirectory (rootDir, subDir, relativeDir, include, exclude, dirMap) {
        var itemMapped = false;
        var items = fs.readdirSync(path.join(rootDir, subDir, relativeDir));

        items.forEach(function (item) {
            var relativePath = path.join(relativeDir, item);
            if (!matchGlobArray(relativePath, exclude)) {
                // Stats obtained here (required at least to know where to recurse in directories)
                // are saved for later, where the modified times may also be used. This minimizes
                // the number of file I/O operations performed.
                var fullPath = path.join(rootDir, subDir, relativePath);
                var stats = fs.statSync(fullPath);

                if (stats.isDirectory()) {
                    // Directories are included if either something under them is included or they
                    // match an include glob.
                    if (mapSubdirectory(rootDir, subDir, relativePath, include, exclude, dirMap) ||
                            matchGlobArray(relativePath, include)) {
                        dirMap[relativePath] = { subDir: subDir, stats: stats };
                        itemMapped = true;
                    }
                } else if (stats.isFile()) {
                    // Files are included only if they match an include glob.
                    if (matchGlobArray(relativePath, include)) {
                        dirMap[relativePath] = { subDir: subDir, stats: stats };
                        itemMapped = true;
                    }
                }
            }
        });
        return itemMapped;
    }

    function matchGlobArray (path, globs) {
        return globs.some(function (elem) {
            return minimatch(path, elem, { dot: true });
        });
    }
}

/**
 * Merges together multiple source maps and a target map into a single mapping from
 * relative paths to objects with target and source paths and stats.
 */
function mergePathMaps (sourceMaps, targetMap, targetDir) {
    // Merge multiple source maps together, along with target path info.
    // Entries in later source maps override those in earlier source maps.
    // Target stats will be filled in below for targets that exist.
    var pathMap = {};
    sourceMaps.forEach(function (sourceMap) {
        Object.keys(sourceMap).forEach(function (sourceSubPath) {
            var sourceEntry = sourceMap[sourceSubPath];
            pathMap[sourceSubPath] = {
                targetPath: path.join(targetDir, sourceSubPath),
                targetStats: null,
                sourcePath: path.join(sourceEntry.subDir, sourceSubPath),
                sourceStats: sourceEntry.stats
            };
        });
    });

    // Fill in target stats for targets that exist, and create entries
    // for targets that don't have any corresponding sources.
    Object.keys(targetMap).forEach(function (subPath) {
        var entry = pathMap[subPath];
        if (entry) {
            entry.targetStats = targetMap[subPath].stats;
        } else {
            pathMap[subPath] = {
                targetPath: path.join(targetDir, subPath),
                targetStats: targetMap[subPath].stats,
                sourcePath: null,
                sourceStats: null
            };
        }
    });

    return pathMap;
}

module.exports = {
    updatePath: updatePath,
    updatePaths: updatePaths,
    mergeAndUpdateDir: mergeAndUpdateDir
};
/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var fs = require('fs-extra');
var path = require('path');
var endent = require('endent');
var mungeutil = require('./ConfigChanges/munge-util');

function PlatformJson (filePath, platform, root) {
    this.filePath = filePath;
    this.platform = platform;
    this.root = fix_munge(root || {});
}

PlatformJson.load = function (plugins_dir, platform) {
    var filePath = path.join(plugins_dir, platform + '.json');
    var root = null;
    if (fs.existsSync(filePath)) {
        root = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
    }
    return new PlatformJson(filePath, platform, root);
};

PlatformJson.prototype.save = function () {
    fs.outputJsonSync(this.filePath, this.root, { spaces: 2 });
};

/**
 * Indicates whether the specified plugin is installed as a top-level (not as
 *  dependency to others)
 * @method function
 * @param  {String} pluginId A plugin id to check for.
 * @return {Boolean} true if plugin installed as top-level, otherwise false.
 */
PlatformJson.prototype.isPluginTopLevel = function (pluginId) {
    return this.root.installed_plugins[pluginId];
};

/**
 * Indicates whether the specified plugin is installed as a dependency to other
 *  plugin.
 * @method function
 * @param  {String} pluginId A plugin id to check for.
 * @return {Boolean} true if plugin installed as a dependency, otherwise false.
 */
PlatformJson.prototype.isPluginDependent = function (pluginId) {
    return this.root.dependent_plugins[pluginId];
};

/**
 * Indicates whether plugin is installed either as top-level or as dependency.
 * @method function
 * @param  {String} pluginId A plugin id to check for.
 * @return {Boolean} true if plugin installed, otherwise false.
 */
PlatformJson.prototype.isPluginInstalled = function (pluginId) {
    return this.isPluginTopLevel(pluginId) ||
        this.isPluginDependent(pluginId);
};

PlatformJson.prototype.addPlugin = function (pluginId, variables, isTopLevel) {
    var pluginsList = isTopLevel
        ? this.root.installed_plugins
        : this.root.dependent_plugins;

    pluginsList[pluginId] = variables;

    return this;
};

/**
 * @chaining
 * Generates and adds metadata for provided plugin into associated <platform>.json file
 *
 * @param   {PluginInfo}  pluginInfo  A pluginInfo instance to add metadata from
 * @returns {this} Current PlatformJson instance to allow calls chaining
 */
PlatformJson.prototype.addPluginMetadata = function (pluginInfo) {
    var installedModules = this.root.modules || [];

    var installedPaths = installedModules.map(function (installedModule) {
        return installedModule.file;
    });

    var modulesToInstall = pluginInfo.getJsModules(this.platform)
        .map(function (module) {
            return new ModuleMetadata(pluginInfo.id, module);
        })
        .filter(function (metadata) {
            // Filter out modules which are already added to metadata
            return !installedPaths.includes(metadata.file);
        });

    this.root.modules = installedModules.concat(modulesToInstall);

    this.root.plugin_metadata = this.root.plugin_metadata || {};
    this.root.plugin_metadata[pluginInfo.id] = pluginInfo.version;

    return this;
};

PlatformJson.prototype.removePlugin = function (pluginId, isTopLevel) {
    var pluginsList = isTopLevel
        ? this.root.installed_plugins
        : this.root.dependent_plugins;

    delete pluginsList[pluginId];

    return this;
};

/**
 * @chaining
 * Removes metadata for provided plugin from associated file
 *
 * @param   {PluginInfo}  pluginInfo A PluginInfo instance to which modules' metadata
 *   we need to remove
 *
 * @returns {this} Current PlatformJson instance to allow calls chaining
 */
PlatformJson.prototype.removePluginMetadata = function (pluginInfo) {
    var modulesToRemove = pluginInfo.getJsModules(this.platform)
        .map(function (jsModule) {
            return ['plugins', pluginInfo.id, jsModule.src].join('/');
        });

    var installedModules = this.root.modules || [];
    this.root.modules = installedModules
        .filter(function (installedModule) {
            // Leave only those metadatas which 'file' is not in removed modules
            return !modulesToRemove.includes(installedModule.file);
        });

    if (this.root.plugin_metadata) {
        delete this.root.plugin_metadata[pluginInfo.id];
    }

    return this;
};

PlatformJson.prototype.addInstalledPluginToPrepareQueue = function (pluginDirName, vars, is_top_level, force) {
    this.root.prepare_queue.installed.push({ plugin: pluginDirName, vars: vars, topLevel: is_top_level, force: force });
};

PlatformJson.prototype.addUninstalledPluginToPrepareQueue = function (pluginId, is_top_level) {
    this.root.prepare_queue.uninstalled.push({ plugin: pluginId, id: pluginId, topLevel: is_top_level });
};

/**
 * Moves plugin, specified by id to top-level plugins. If plugin is top-level
 *  already, then does nothing.
 * @method function
 * @param  {String} pluginId A plugin id to make top-level.
 * @return {PlatformJson} PlatformJson instance.
 */
PlatformJson.prototype.makeTopLevel = function (pluginId) {
    var plugin = this.root.dependent_plugins[pluginId];
    if (plugin) {
        delete this.root.dependent_plugins[pluginId];
        this.root.installed_plugins[pluginId] = plugin;
    }
    return this;
};

/**
 * Generates a metadata for all installed plugins and js modules. The resultant
 *   string is ready to be written to 'cordova_plugins.js'
 *
 * @returns {String} cordova_plugins.js contents
 */
PlatformJson.prototype.generateMetadata = function () {
    const stringify = o => JSON.stringify(o, null, 2);
    return endent`
        cordova.define('cordova/plugin_list', function(require, exports, module) {
          module.exports = ${stringify(this.root.modules)};
          module.exports.metadata = ${stringify(this.root.plugin_metadata)};
        });
    `;
};

/**
 * @chaining
 * Generates and then saves metadata to specified file. Doesn't check if file exists.
 *
 * @param {String} destination  File metadata will be written to
 * @return {PlatformJson} PlatformJson instance
 */
PlatformJson.prototype.generateAndSaveMetadata = function (destination) {
    fs.outputFileSync(destination, this.generateMetadata());

    return this;
};

// convert a munge from the old format ([file][parent][xml] = count) to the current one
function fix_munge (root) {
    root.prepare_queue = root.prepare_queue || { installed: [], uninstalled: [] };
    root.config_munge = root.config_munge || { files: {} };
    root.installed_plugins = root.installed_plugins || {};
    root.dependent_plugins = root.dependent_plugins || {};

    var munge = root.config_munge;
    if (!munge.files) {
        var new_munge = { files: {} };
        for (var file in munge) {
            for (var selector in munge[file]) {
                for (var xml_child in munge[file][selector]) {
                    var val = parseInt(munge[file][selector][xml_child]);
                    for (var i = 0; i < val; i++) {
                        mungeutil.deep_add(new_munge, [file, selector, { xml: xml_child, count: val }]);
                    }
                }
            }
        }
        root.config_munge = new_munge;
    }

    return root;
}

/**
 * @constructor
 * @class ModuleMetadata
 *
 * Creates a ModuleMetadata object that represents module entry in 'cordova_plugins.js'
 *   file at run time
 *
 * @param {String}  pluginId  Plugin id where this module installed from
 * @param (JsModule|Object)  jsModule  A js-module entry from PluginInfo class to generate metadata for
 */
function ModuleMetadata (pluginId, jsModule) {
    if (!pluginId) throw new TypeError('pluginId argument must be a valid plugin id');
    if (!jsModule.src && !jsModule.name) throw new TypeError('jsModule argument must contain src or/and name properties');

    this.id = pluginId + '.' + (jsModule.name || jsModule.src.match(/([^/]+)\.js/)[1]);
    this.file = ['plugins', pluginId, jsModule.src].join('/');
    this.pluginId = pluginId;

    if (jsModule.clobbers && jsModule.clobbers.length > 0) {
        this.clobbers = jsModule.clobbers.map(function (o) { return o.target; });
    }
    if (jsModule.merges && jsModule.merges.length > 0) {
        this.merges = jsModule.merges.map(function (o) { return o.target; });
    }
    if (jsModule.runs) {
        this.runs = true;
    }
}

module.exports = PlatformJson;
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
*/

var Q = require('q');
var fs = require('fs-extra');
var path = require('path');

var ActionStack = require('./ActionStack');
var PlatformJson = require('./PlatformJson');
var CordovaError = require('./CordovaError/CordovaError');
var PlatformMunger = require('./ConfigChanges/ConfigChanges').PlatformMunger;
var PluginInfoProvider = require('./PluginInfo/PluginInfoProvider');

/**
 * @constructor
 * @class PluginManager
 * Represents an entity for adding/removing plugins for platforms
 *
 * @param {String} platform Platform name
 * @param {Object} locations - Platform files and directories
 * @param {IDEProject} ideProject The IDE project to add/remove plugin changes to/from
 */
function PluginManager (platform, locations, ideProject) {
    this.platform = platform;
    this.locations = locations;
    this.project = ideProject;

    var platformJson = PlatformJson.load(locations.root, platform);
    this.munger = new PlatformMunger(platform, locations.root, platformJson, new PluginInfoProvider());
}

/**
 * @constructs PluginManager
 * A convenience shortcut to new PluginManager(...)
 *
 * @param {String} platform Platform name
 * @param {Object} locations - Platform files and directories
 * @param {IDEProject} ideProject The IDE project to add/remove plugin changes to/from
 * @returns new PluginManager instance
 */
PluginManager.get = function (platform, locations, ideProject) {
    return new PluginManager(platform, locations, ideProject);
};

PluginManager.INSTALL = 'install';
PluginManager.UNINSTALL = 'uninstall';

module.exports = PluginManager;

/**
 * Describes and implements common plugin installation/uninstallation routine. The flow is the following:
 *  * Validate and set defaults for options. Note that options are empty by default. Everything
 *    needed for platform IDE project must be passed from outside. Plugin variables (which
 *    are the part of the options) also must be already populated with 'PACKAGE_NAME' variable.
 *  * Collect all plugin's native and web files, get installers/uninstallers and process
 *    all these via ActionStack.
 *  * Save the IDE project, so the changes made by installers are persisted.
 *  * Generate config changes munge for plugin and apply it to all required files
 *  * Generate metadata for plugin and plugin modules and save it to 'cordova_plugins.js'
 *
 * @param {PluginInfo} plugin A PluginInfo structure representing plugin to install
 * @param {Object} [options={}] An installation options. It is expected but is not necessary
 *   that options would contain 'variables' inner object with 'PACKAGE_NAME' field set by caller.
 *
 * @returns {Promise} Returns a Q promise, either resolved in case of success, rejected otherwise.
 */
PluginManager.prototype.doOperation = function (operation, plugin, options) {
    if (operation !== PluginManager.INSTALL && operation !== PluginManager.UNINSTALL) { return Q.reject(new CordovaError('The parameter is incorrect. The opeation must be either "add" or "remove"')); }

    if (!plugin || plugin.constructor.name !== 'PluginInfo') { return Q.reject(new CordovaError('The parameter is incorrect. The first parameter should be a PluginInfo instance')); }

    // Set default to empty object to play safe when accesing properties
    options = options || {};

    var self = this;
    var actions = new ActionStack();

    // gather all files need to be handled during operation ...
    plugin.getFilesAndFrameworks(this.platform, options)
        .concat(plugin.getAssets(this.platform))
        .concat(plugin.getJsModules(this.platform))
        // ... put them into stack ...
        .forEach(function (item) {
            var installer = self.project.getInstaller(item.itemType);
            var uninstaller = self.project.getUninstaller(item.itemType);
            var actionArgs = [item, plugin, self.project, options];

            var action;
            if (operation === PluginManager.INSTALL) {
                action = actions.createAction(installer, actionArgs, uninstaller, actionArgs);
            } else /* op === PluginManager.UNINSTALL */{
                action = actions.createAction(uninstaller, actionArgs, installer, actionArgs);
            }
            actions.push(action);
        });

    // ... and run through the action stack
    return actions.process(this.platform)
        .then(function () {
            if (self.project.write) {
                self.project.write();
            }

            if (operation === PluginManager.INSTALL) {
                // Ignore passed `is_top_level` option since platform itself doesn't know
                // anything about managing dependencies - it's responsibility of caller.
                self.munger.add_plugin_changes(plugin, options.variables, /* is_top_level= */true, /* should_increment= */true, options.force);
                self.munger.platformJson.addPluginMetadata(plugin);
            } else {
                self.munger.remove_plugin_changes(plugin, /* is_top_level= */true);
                self.munger.platformJson.removePluginMetadata(plugin);
            }

            // Save everything (munge and plugin/modules metadata)
            self.munger.save_all();

            var metadata = self.munger.platformJson.generateMetadata();
            fs.writeFileSync(path.join(self.locations.www, 'cordova_plugins.js'), metadata, 'utf-8');

            // CB-11022 save plugin metadata to both www and platform_www if options.usePlatformWww is specified
            if (options.usePlatformWww) {
                fs.writeFileSync(path.join(self.locations.platformWww, 'cordova_plugins.js'), metadata, 'utf-8');
            }
        });
};

PluginManager.prototype.addPlugin = function (plugin, installOptions) {
    return this.doOperation(PluginManager.INSTALL, plugin, installOptions);
};

PluginManager.prototype.removePlugin = function (plugin, uninstallOptions) {
    return this.doOperation(PluginManager.UNINSTALL, plugin, uninstallOptions);
};
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const EventEmitter = require('events').EventEmitter;

const MAX_LISTENERS = 20;

const INSTANCE_KEY = Symbol.for('org.apache.cordova.common.CordovaEvents');

let EVENTS_RECEIVER = null;

class CordovaEventEmitter extends EventEmitter {
    /**
     * Sets up current instance to forward emitted events to another EventEmitter
     *   instance.
     *
     * @param   {EventEmitter}  [eventEmitter]  The emitter instance to forward
     *   events to. Falsy value, when passed, disables forwarding.
     */
    forwardEventsTo (eventEmitter) {
        // If no argument is specified disable events forwarding
        if (!eventEmitter) {
            EVENTS_RECEIVER = undefined;
            return;
        }

        if (!(eventEmitter instanceof EventEmitter)) {
            throw new Error('Cordova events can be redirected to another EventEmitter instance only');
        }

        // CB-10940 Skipping forwarding to self to avoid infinite recursion.
        // This is the case when the modules are npm-linked.
        if (this !== eventEmitter) {
            EVENTS_RECEIVER = eventEmitter;
        } else {
            // Reset forwarding if we are subscribing to self
            EVENTS_RECEIVER = undefined;
        }
    }

    /**
     * Sets up current instance to forward emitted events to another EventEmitter
     *   instance.
     *
     * @param   {EventEmitter}  [eventEmitter]  The emitter instance to forward
     *   events to. Falsy value, when passed, disables forwarding.
     */
    emit (eventName, ...args) {
        if (EVENTS_RECEIVER) {
            EVENTS_RECEIVER.emit(eventName, ...args);
        }

        return super.emit(eventName, ...args);
    }
}

// This singleton instance pattern is based on the ideas from
// https://derickbailey.com/2016/03/09/creating-a-true-singleton-in-node-js-with-es6-symbols/
if (Object.getOwnPropertySymbols(global).indexOf(INSTANCE_KEY) === -1) {
    const events = new CordovaEventEmitter();
    events.setMaxListeners(MAX_LISTENERS);
    global[INSTANCE_KEY] = events;
}

module.exports = global[INSTANCE_KEY];
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

var crossSpawn = require('cross-spawn');
var fs = require('fs-extra');
var _ = require('underscore');
var Q = require('q');
var events = require('./events');
var iswin32 = process.platform === 'win32';

/**
 * A special implementation for child_process.spawn that handles
 *   Windows-specific issues with batch files and spaces in paths. Returns a
 *   promise that succeeds only for return code 0. It is also possible to
 *   subscribe on spawned process' stdout and stderr streams using progress
 *   handler for resultant promise.
 *
 * @example spawn('mycommand', [], {stdio: 'pipe'}) .progress(function (stdio){
 *   if (stdio.stderr) { console.error(stdio.stderr); } })
 *   .then(function(result){ // do other stuff })
 *
 * @param   {String}   cmd       A command to spawn
 * @param   {String[]} [args=[]]  An array of arguments, passed to spawned
 *   process
 * @param   {Object}   [opts={}]  A configuration object
 * @param   {String|String[]|Object} opts.stdio Property that configures how
 *   spawned process' stdio will behave. Has the same meaning and possible
 *   values as 'stdio' options for child_process.spawn method
 *   (https://nodejs.org/api/child_process.html#child_process_options_stdio).
 * @param {Object}     [env={}]  A map of extra environment variables
 * @param {String}     [cwd=process.cwd()]  Working directory for the command
 * @param {Boolean}    [chmod=false]  If truthy, will attempt to set the execute
 *   bit before executing on non-Windows platforms
 *
 * @return  {Promise}        A promise that is either fulfilled if the spawned
 *   process is exited with zero error code or rejected otherwise. If the
 *   'stdio' option set to 'default' or 'pipe', the promise also emits progress
 *   messages with the following contents:
 *   {
 *       'stdout': ...,
 *       'stderr': ...
 *   }
 */
exports.spawn = function (cmd, args, opts) {
    args = args || [];
    opts = opts || {};
    var spawnOpts = {};
    var d = Q.defer();

    if (opts.stdio !== 'default') {
        // Ignore 'default' value for stdio because it corresponds to child_process's default 'pipe' option
        spawnOpts.stdio = opts.stdio;
    }

    if (opts.cwd) {
        spawnOpts.cwd = opts.cwd;
    }

    if (opts.env) {
        spawnOpts.env = _.extend(_.extend({}, process.env), opts.env);
    }

    if (opts.chmod && !iswin32) {
        try {
            // This fails when module is installed in a system directory (e.g. via sudo npm install)
            fs.chmodSync(cmd, '755');
        } catch (e) {
            // If the perms weren't set right, then this will come as an error upon execution.
        }
    }

    events.emit(opts.printCommand ? 'log' : 'verbose', 'Running command: ' + cmd + ' ' + args.join(' '));

    // At least until Node.js 8, child_process.spawn will throw exceptions
    // instead of emitting error events in certain cases (like EACCES), Thus we
    // have to wrap the execution in try/catch to convert them into rejections.
    try {
        var child = crossSpawn.spawn(cmd, args, spawnOpts);
    } catch (e) {
        whenDone(e);
        return d.promise;
    }
    var capturedOut = '';
    var capturedErr = '';

    if (child.stdout) {
        child.stdout.setEncoding('utf8');
        child.stdout.on('data', function (data) {
            capturedOut += data;
            d.notify({ stdout: data });
        });
    }

    if (child.stderr) {
        child.stderr.setEncoding('utf8');
        child.stderr.on('data', function (data) {
            capturedErr += data;
            d.notify({ stderr: data });
        });
    }

    child.on('close', whenDone);
    child.on('error', whenDone);
    function whenDone (arg) {
        if (child) {
            child.removeListener('close', whenDone);
            child.removeListener('error', whenDone);
        }
        var code = typeof arg === 'number' ? arg : arg && arg.code;

        events.emit('verbose', 'Command finished with error code ' + code + ': ' + cmd + ' ' + args);
        if (code === 0) {
            d.resolve(capturedOut.trim());
        } else {
            var errMsg = cmd + ': Command failed with exit code ' + code;
            if (capturedErr) {
                errMsg += ' Error output:\n' + capturedErr.trim();
            }
            var err = new Error(errMsg);
            if (capturedErr) {
                err.stderr = capturedErr;
            }
            if (capturedOut) {
                err.stdout = capturedOut;
            }
            err.code = code;
            d.reject(err);
        }
    }

    return d.promise;
};

exports.maybeSpawn = function (cmd, args, opts) {
    if (fs.existsSync(cmd)) {
        return exports.spawn(cmd, args, opts);
    }
    return Q(null);
};
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
*/

module.exports = function addProperty (module, property, modulePath, obj) {
    obj = obj || module.exports;
    // Add properties as getter to delay load the modules on first invocation
    Object.defineProperty(obj, property, {
        configurable: true,
        get: function () {
            var delayLoadedModule = module.require(modulePath);
            obj[property] = delayLoadedModule;
            return delayLoadedModule;
        }
    });
};
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
*/

const CordovaError = require('../CordovaError/CordovaError');

/**
 * Formats an error for logging.
 *
 * @param {Error} error - The error to be formatted.
 * @param {boolean} isVerbose - Whether the include additional debugging
 *   information when formatting the error.
 *
 * @returns {string} The formatted error message.
 */
module.exports = function formatError (error, isVerbose) {
    var message = '';

    if (error instanceof CordovaError) {
        message = error.toString(isVerbose);
    } else if (error instanceof Error) {
        if (isVerbose) {
            message = error.stack;
        } else {
            message = error.message;
        }
    } else {
        // Plain text error message
        message = error;
    }

    if (typeof message === 'string' && !message.toUpperCase().startsWith('ERROR:')) {
        // Needed for backward compatibility with external tools
        message = 'Error: ' + message;
    }

    return message;
};
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

// contains PLIST utility functions
var __ = require('underscore');
var plist = require('plist');

// adds node to doc at selector
module.exports.graftPLIST = graftPLIST;
function graftPLIST (doc, xml, selector) {
    var obj = plist.parse('<plist>' + xml + '</plist>');

    var node = doc[selector];
    if (node && Array.isArray(node) && Array.isArray(obj)) {
        node = node.concat(obj);
        for (var i = 0; i < node.length; i++) {
            for (var j = i + 1; j < node.length; ++j) {
                if (nodeEqual(node[i], node[j])) { node.splice(j--, 1); }
            }
        }
        doc[selector] = node;
    } else {
        // plist uses objects for <dict>. If we have two dicts we merge them instead of
        // overriding the old one. See CB-6472
        if (node && __.isObject(node) && __.isObject(obj) && !__.isDate(node) && !__.isDate(obj)) { // arrays checked above
            __.extend(obj, node);
        }
        doc[selector] = obj;
    }

    return true;
}

// removes node from doc at selector
module.exports.prunePLIST = prunePLIST;
function prunePLIST (doc, xml, selector) {
    var obj = plist.parse('<plist>' + xml + '</plist>');

    pruneOBJECT(doc, selector, obj);

    return true;
}

function pruneOBJECT (doc, selector, fragment) {
    if (Array.isArray(fragment) && Array.isArray(doc[selector])) {
        var empty = true;
        for (var i in fragment) {
            for (var j in doc[selector]) {
                empty = pruneOBJECT(doc[selector], j, fragment[i]) && empty;
            }
        }
        if (empty) {
            delete doc[selector];
            return true;
        }
    } else if (nodeEqual(doc[selector], fragment)) {
        delete doc[selector];
        return true;
    }

    return false;
}

function nodeEqual (node1, node2) {
    if (typeof node1 !== typeof node2) { return false; } else if (typeof node1 === 'string') {
        node2 = escapeRE(node2).replace(/\\\$\(\S+\)/gm, '(.*?)');
        return new RegExp('^' + node2 + '$').test(node1);
    } else {
        for (var key in node2) {
            if (!nodeEqual(node1[key], node2[key])) return false;
        }
        return true;
    }
}

// escape string for use in regex
function escapeRE (str) {
    return str.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&');
}
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

/**
 * contains XML utility functions, some of which are specific to elementtree
 */

var fs = require('fs-extra');
var path = require('path');
var _ = require('underscore');
var et = require('elementtree');
var stripBom = require('strip-bom');

var ROOT = /^\/([^/]*)/;
var ABSOLUTE = /^\/([^/]*)\/(.*)/;

module.exports = {
    // compare two et.XML nodes, see if they match
    // compares tagName, text, attributes and children (recursively)
    equalNodes: function (one, two) {
        if (one.tag !== two.tag) {
            return false;
        } else if (one.text.trim() !== two.text.trim()) {
            return false;
        } else if (one._children.length !== two._children.length) {
            return false;
        }

        if (!attribMatch(one, two)) return false;

        for (var i = 0; i < one._children.length; i++) {
            if (!module.exports.equalNodes(one._children[i], two._children[i])) {
                return false;
            }
        }

        return true;
    },

    // adds node to doc at selector, creating parent if it doesn't exist
    graftXML: function (doc, nodes, selector, after) {
        var parent = module.exports.resolveParent(doc, selector);
        if (!parent) {
            // Try to create the parent recursively if necessary
            try {
                var parentToCreate = et.XML('<' + path.basename(selector) + '/>');
                var parentSelector = path.dirname(selector);

                this.graftXML(doc, [parentToCreate], parentSelector);
            } catch (e) {
                return false;
            }
            parent = module.exports.resolveParent(doc, selector);
            if (!parent) return false;
        }

        nodes.forEach(function (node) {
            // check if child is unique first
            if (uniqueChild(node, parent)) {
                var children = parent.getchildren();
                var insertIdx = after ? findInsertIdx(children, after) : children.length;

                // TODO: replace with parent.insert after the bug in ElementTree is fixed
                parent.getchildren().splice(insertIdx, 0, node);
            }
        });

        return true;
    },

    // adds new attributes to doc at selector
    // Will only merge if attribute has not been modified already or --force is used
    graftXMLMerge: function (doc, nodes, selector, xml) {
        var target = module.exports.resolveParent(doc, selector);
        if (!target) return false;

        // saves the attributes of the original xml before making changes
        xml.oldAttrib = _.extend({}, target.attrib);

        nodes.forEach(function (node) {
            var attributes = node.attrib;
            for (var attribute in attributes) {
                target.attrib[attribute] = node.attrib[attribute];
            }
        });

        return true;
    },

    // overwrite all attributes to doc at selector with new attributes
    // Will only overwrite if attribute has not been modified already or --force is used
    graftXMLOverwrite: function (doc, nodes, selector, xml) {
        var target = module.exports.resolveParent(doc, selector);
        if (!target) return false;

        // saves the attributes of the original xml before making changes
        xml.oldAttrib = _.extend({}, target.attrib);

        // remove old attributes from target
        var targetAttributes = target.attrib;
        for (var targetAttribute in targetAttributes) {
            delete targetAttributes[targetAttribute];
        }

        // add new attributes to target
        nodes.forEach(function (node) {
            var attributes = node.attrib;
            for (var attribute in attributes) {
                target.attrib[attribute] = node.attrib[attribute];
            }
        });

        return true;
    },

    // removes node from doc at selector
    pruneXML: function (doc, nodes, selector) {
        var parent = module.exports.resolveParent(doc, selector);
        if (!parent) return false;

        nodes.forEach(function (node) {
            var matchingKid = findChild(node, parent);
            if (matchingKid !== undefined) {
                // stupid elementtree takes an index argument it doesn't use
                // and does not conform to the python lib
                parent.remove(matchingKid);
            }
        });

        return true;
    },

    // restores attributes from doc at selector
    pruneXMLRestore: function (doc, selector, xml) {
        var target = module.exports.resolveParent(doc, selector);
        if (!target) return false;

        if (xml.oldAttrib) {
            target.attrib = _.extend({}, xml.oldAttrib);
        }

        return true;
    },

    pruneXMLRemove: function (doc, selector, nodes) {
        var target = module.exports.resolveParent(doc, selector);
        if (!target) return false;

        nodes.forEach(function (node) {
            var attributes = node.attrib;
            for (var attribute in attributes) {
                if (target.attrib[attribute]) {
                    delete target.attrib[attribute];
                }
            }
        });

        return true;
    },

    parseElementtreeSync: function (filename) {
        var contents = stripBom(fs.readFileSync(filename, 'utf-8'));
        return new et.ElementTree(et.XML(contents));
    },

    resolveParent: function (doc, selector) {
        var parent, tagName, subSelector;

        // handle absolute selector (which elementtree doesn't like)
        if (ROOT.test(selector)) {
            tagName = selector.match(ROOT)[1];
            // test for wildcard "any-tag" root selector
            if (tagName === '*' || tagName === doc._root.tag) {
                parent = doc._root;

                // could be an absolute path, but not selecting the root
                if (ABSOLUTE.test(selector)) {
                    subSelector = selector.match(ABSOLUTE)[2];
                    parent = parent.find(subSelector);
                }
            } else {
                return false;
            }
        } else {
            parent = doc.find(selector);
        }
        return parent;
    }
};

function findChild (node, parent) {
    const matches = parent.findall(node.tag);
    return matches.find(m => module.exports.equalNodes(node, m));
}

function uniqueChild (node, parent) {
    return !findChild(node, parent);
}

// Find the index at which to insert an entry. After is a ;-separated priority list
// of tags after which the insertion should be made. E.g. If we need to
// insert an element C, and the rule is that the order of children has to be
// As, Bs, Cs. After will be equal to "C;B;A".
function findInsertIdx (children, after) {
    var childrenTags = children.map(function (child) { return child.tag; });
    var afters = after.split(';');
    var afterIndexes = afters.map(function (current) { return childrenTags.lastIndexOf(current); });
    var foundIndex = _.find(afterIndexes, function (index) { return index !== -1; });

    // add to the beginning if no matching nodes are found
    return typeof foundIndex === 'undefined' ? 0 : foundIndex + 1;
}

var BLACKLIST = ['platform', 'feature', 'plugin', 'engine'];
var SINGLETONS = ['content', 'author', 'name'];
function mergeXml (src, dest, platform, clobber) {
    // Do nothing for blacklisted tags.
    if (BLACKLIST.includes(src.tag)) return;

    // Handle attributes
    Object.getOwnPropertyNames(src.attrib).forEach(function (attribute) {
        if (clobber || !dest.attrib[attribute]) {
            dest.attrib[attribute] = src.attrib[attribute];
        }
    });
    // Handle text
    if (src.text && (clobber || !dest.text)) {
        dest.text = src.text;
    }
    // Handle children
    src.getchildren().forEach(mergeChild);

    // Handle platform
    if (platform) {
        src.findall('platform[@name="' + platform + '"]').forEach(function (platformElement) {
            platformElement.getchildren().forEach(mergeChild);
        });
    }

    // Handle duplicate preference tags (by name attribute)
    removeDuplicatePreferences(dest);

    function mergeChild (srcChild) {
        var srcTag = srcChild.tag;
        var destChild = new et.Element(srcTag);
        var foundChild;
        var query = srcTag + '';
        var shouldMerge = true;

        if (BLACKLIST.includes(srcTag)) return;

        if (SINGLETONS.includes(srcTag)) {
            foundChild = dest.find(query);
            if (foundChild) {
                destChild = foundChild;
                dest.remove(destChild);
            }
        } else {
            // Check for an exact match and if you find one don't add
            var mergeCandidates = dest.findall(query)
                .filter(function (foundChild) {
                    return foundChild && textMatch(srcChild, foundChild) && attribMatch(srcChild, foundChild);
                });

            if (mergeCandidates.length > 0) {
                destChild = mergeCandidates[0];
                dest.remove(destChild);
                shouldMerge = false;
            }
        }

        mergeXml(srcChild, destChild, platform, clobber && shouldMerge);
        dest.append(destChild);
    }

    function removeDuplicatePreferences (xml) {
        // reduce preference tags to a hashtable to remove dupes
        var prefHash = xml.findall('preference[@name][@value]').reduce(function (previousValue, currentValue) {
            previousValue[currentValue.attrib.name] = currentValue.attrib.value;
            return previousValue;
        }, {});

        // remove all preferences
        xml.findall('preference[@name][@value]').forEach(function (pref) {
            xml.remove(pref);
        });

        // write new preferences
        Object.keys(prefHash).forEach(function (key) {
            var element = et.SubElement(xml, 'preference');
            element.set('name', key);
            element.set('value', this[key]);
        }, prefHash);
    }
}

// Expose for testing.
module.exports.mergeXml = mergeXml;

function textMatch (elm1, elm2) {
    var text1 = elm1.text ? elm1.text.replace(/\s+/, '') : '';
    var text2 = elm2.text ? elm2.text.replace(/\s+/, '') : '';
    return (text1 === '' || text1 === text2);
}

function attribMatch (one, two) {
    var oneAttribKeys = Object.keys(one.attrib);
    var twoAttribKeys = Object.keys(two.attrib);

    if (oneAttribKeys.length !== twoAttribKeys.length) {
        return false;
    }

    for (var i = 0; i < oneAttribKeys.length; i++) {
        var attribName = oneAttribKeys[i];

        if (one.attrib[attribName] !== two.attrib[attribName]) {
            return false;
        }
    }

    return true;
}
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

/*
A class for holidng the information currently stored in plugin.xml
It should also be able to answer questions like whether the plugin
is compatible with a given engine version.

TODO (kamrik): refactor this to not use sync functions and return promises.
*/

var path = require('path');
var fs = require('fs-extra');
var xml_helpers = require('../util/xml-helpers');
var CordovaError = require('../CordovaError/CordovaError');

function PluginInfo (dirname) {
    var self = this;

    // METHODS
    // Defined inside the constructor to avoid the "this" binding problems.

    // <preference> tag
    // Example: <preference name="API_KEY" />
    // Used to require a variable to be specified via --variable when installing the plugin.
    // returns { key : default | null}
    self.getPreferences = getPreferences;
    function getPreferences (platform) {
        return _getTags(self._et, 'preference', platform, _parsePreference)
            .reduce(function (preferences, pref) {
                preferences[pref.preference] = pref.default;
                return preferences;
            }, {});
    }

    function _parsePreference (prefTag) {
        var name = prefTag.attrib.name.toUpperCase();
        var def = prefTag.attrib.default || null;
        return { preference: name, default: def };
    }

    // <asset>
    self.getAssets = getAssets;
    function getAssets (platform) {
        var assets = _getTags(self._et, 'asset', platform, _parseAsset);
        return assets;
    }

    function _parseAsset (tag) {
        var src = tag.attrib.src;
        var target = tag.attrib.target;

        if (!src || !target) {
            var msg =
                'Malformed <asset> tag. Both "src" and "target" attributes' +
                'must be specified in\n' +
                self.filepath
                ;
            throw new Error(msg);
        }

        var asset = {
            itemType: 'asset',
            src: src,
            target: target
        };
        return asset;
    }

    // <dependency>
    // Example:
    // <dependency id="com.plugin.id"
    //     url="https://github.com/myuser/someplugin"
    //     commit="428931ada3891801"
    //     subdir="some/path/here" />
    self.getDependencies = getDependencies;
    function getDependencies (platform) {
        var deps = _getTags(
            self._et,
            'dependency',
            platform,
            _parseDependency
        );
        return deps;
    }

    function _parseDependency (tag) {
        var dep =
            { id: tag.attrib.id,
                version: tag.attrib.version || '',
                url: tag.attrib.url || '',
                subdir: tag.attrib.subdir || '',
                commit: tag.attrib.commit
            };

        dep.git_ref = dep.commit;

        if (!dep.id) {
            var msg =
                '<dependency> tag is missing id attribute in ' +
                self.filepath
                ;
            throw new CordovaError(msg);
        }
        return dep;
    }

    // <config-file> tag
    self.getConfigFiles = getConfigFiles;
    function getConfigFiles (platform) {
        var configFiles = _getTags(self._et, 'config-file', platform, _parseConfigFile);
        return configFiles;
    }

    function _parseConfigFile (tag) {
        var configFile =
            { target: tag.attrib['target'],
                parent: tag.attrib['parent'],
                after: tag.attrib['after'],
                xmls: tag.getchildren(),
                // To support demuxing via versions
                versions: tag.attrib['versions'],
                deviceTarget: tag.attrib['device-target']
            };
        return configFile;
    }

    self.getEditConfigs = getEditConfigs;
    function getEditConfigs (platform) {
        var editConfigs = _getTags(self._et, 'edit-config', platform, _parseEditConfigs);
        return editConfigs;
    }

    function _parseEditConfigs (tag) {
        var editConfig =
            { file: tag.attrib['file'],
                target: tag.attrib['target'],
                mode: tag.attrib['mode'],
                xmls: tag.getchildren()
            };
        return editConfig;
    }

    // <info> tags, both global and within a <platform>
    // TODO (kamrik): Do we ever use <info> under <platform>? Example wanted.
    self.getInfo = getInfo;
    function getInfo (platform) {
        var infos = _getTags(
            self._et,
            'info',
            platform,
            function (elem) { return elem.text; }
        );
        // Filter out any undefined or empty strings.
        infos = infos.filter(Boolean);
        return infos;
    }

    // <source-file>
    // Examples:
    // <source-file src="src/ios/someLib.a" framework="true" />
    // <source-file src="src/ios/someLib.a" compiler-flags="-fno-objc-arc" />
    self.getSourceFiles = getSourceFiles;
    function getSourceFiles (platform) {
        var sourceFiles = _getTagsInPlatform(self._et, 'source-file', platform, _parseSourceFile);
        return sourceFiles;
    }

    function _parseSourceFile (tag) {
        return {
            itemType: 'source-file',
            src: tag.attrib.src,
            framework: isStrTrue(tag.attrib.framework),
            weak: isStrTrue(tag.attrib.weak),
            compilerFlags: tag.attrib['compiler-flags'],
            targetDir: tag.attrib['target-dir']
        };
    }

    // <header-file>
    // Example:
    // <header-file src="CDVFoo.h" />
    self.getHeaderFiles = getHeaderFiles;
    function getHeaderFiles (platform) {
        var headerFiles = _getTagsInPlatform(self._et, 'header-file', platform, function (tag) {
            return {
                itemType: 'header-file',
                src: tag.attrib.src,
                targetDir: tag.attrib['target-dir'],
                type: tag.attrib['type']
            };
        });
        return headerFiles;
    }

    // <resource-file>
    // Example:
    // <resource-file src="FooPluginStrings.xml" target="res/values/FooPluginStrings.xml" device-target="win" arch="x86" versions="&gt;=8.1" />
    self.getResourceFiles = getResourceFiles;
    function getResourceFiles (platform) {
        var resourceFiles = _getTagsInPlatform(self._et, 'resource-file', platform, function (tag) {
            return {
                itemType: 'resource-file',
                src: tag.attrib.src,
                target: tag.attrib.target,
                versions: tag.attrib.versions,
                deviceTarget: tag.attrib['device-target'],
                arch: tag.attrib.arch,
                reference: tag.attrib.reference
            };
        });
        return resourceFiles;
    }

    // <lib-file>
    // Example:
    // <lib-file src="src/BlackBerry10/native/device/libfoo.so" arch="device" />
    self.getLibFiles = getLibFiles;
    function getLibFiles (platform) {
        var libFiles = _getTagsInPlatform(self._et, 'lib-file', platform, function (tag) {
            return {
                itemType: 'lib-file',
                src: tag.attrib.src,
                arch: tag.attrib.arch,
                Include: tag.attrib.Include,
                versions: tag.attrib.versions,
                deviceTarget: tag.attrib['device-target'] || tag.attrib.target
            };
        });
        return libFiles;
    }

    // <podspec>
    // Example:
    // <podspec>
    //   <config>
    //     <source url="https://github.com/brightcove/BrightcoveSpecs.git" />
    //     <source url="https://github.com/CocoaPods/Specs.git"/>
    //   </config>
    //   <pods use-frameworks="true" inhibit-all-warnings="true">
    //     <pod name="PromiseKit" />
    //     <pod name="Foobar1" spec="~> 2.0.0" />
    //     <pod name="Foobar2" git="git@github.com:hoge/foobar1.git" />
    //     <pod name="Foobar3" git="git@github.com:hoge/foobar2.git" branch="next" />
    //     <pod name="Foobar4" swift-version="4.1" />
    //     <pod name="Foobar5" swift-version="3.0" />
    //   </pods>
    // </podspec>
    self.getPodSpecs = getPodSpecs;
    function getPodSpecs (platform) {
        var podSpecs = _getTagsInPlatform(self._et, 'podspec', platform, function (tag) {
            var declarations = null;
            var sources = null;
            var libraries = null;
            var config = tag.find('config');
            var pods = tag.find('pods');
            if (config != null) {
                sources = config.findall('source').map(function (t) {
                    return {
                        url: t.attrib.url
                    };
                }).reduce(function (acc, val) {
                    return Object.assign({}, acc, { [val.url]: { source: val.url } });
                }, {});
            }
            if (pods != null) {
                declarations = Object.keys(pods.attrib).reduce(function (acc, key) {
                    return pods.attrib[key] === undefined ? acc : Object.assign({}, acc, { [key]: pods.attrib[key] });
                }, {});
                libraries = pods.findall('pod').map(function (t) {
                    return Object.keys(t.attrib).reduce(function (acc, key) {
                        return t.attrib[key] === undefined ? acc : Object.assign({}, acc, { [key]: t.attrib[key] });
                    }, {});
                }).reduce(function (acc, val) {
                    return Object.assign({}, acc, { [val.name]: val });
                }, {});
            }
            return {
                declarations: declarations,
                sources: sources,
                libraries: libraries
            };
        });
        return podSpecs;
    }

    // <hook>
    // Example:
    // <hook type="before_build" src="scripts/beforeBuild.js" />
    self.getHookScripts = getHookScripts;
    function getHookScripts (hook, platforms) {
        var scriptElements = self._et.findall('./hook');

        if (platforms) {
            platforms.forEach(function (platform) {
                scriptElements = scriptElements.concat(self._et.findall('./platform[@name="' + platform + '"]/hook'));
            });
        }

        function filterScriptByHookType (el) {
            return el.attrib.src && el.attrib.type && el.attrib.type.toLowerCase() === hook;
        }

        return scriptElements.filter(filterScriptByHookType);
    }

    self.getJsModules = getJsModules;
    function getJsModules (platform) {
        var modules = _getTags(self._et, 'js-module', platform, _parseJsModule);
        return modules;
    }

    function _parseJsModule (tag) {
        var ret = {
            itemType: 'js-module',
            name: tag.attrib.name,
            src: tag.attrib.src,
            clobbers: tag.findall('clobbers').map(function (tag) { return { target: tag.attrib.target }; }),
            merges: tag.findall('merges').map(function (tag) { return { target: tag.attrib.target }; }),
            runs: tag.findall('runs').length > 0
        };

        return ret;
    }

    self.getEngines = function () {
        return self._et.findall('engines/engine').map(function (n) {
            return {
                name: n.attrib.name,
                version: n.attrib.version,
                platform: n.attrib.platform,
                scriptSrc: n.attrib.scriptSrc
            };
        });
    };

    self.getPlatforms = function () {
        return self._et.findall('platform').map(function (n) {
            return { name: n.attrib.name };
        });
    };

    self.getPlatformsArray = function () {
        return self._et.findall('platform').map(function (n) {
            return n.attrib.name;
        });
    };

    self.getFrameworks = function (platform, options) {
        return _getTags(self._et, 'framework', platform, function (el) {
            var src = el.attrib.src;
            if (options) {
                var vars = options.cli_variables || {};

                if (Object.keys(vars).length === 0) {
                    // get variable defaults from plugin.xml for removal
                    vars = self.getPreferences(platform);
                }
                var regExp;
                // Iterate over plugin variables.
                // Replace them in framework src if they exist
                Object.keys(vars).forEach(function (name) {
                    if (vars[name]) {
                        regExp = new RegExp('\\$' + name, 'g');
                        src = src.replace(regExp, vars[name]);
                    }
                });
            }
            var ret = {
                itemType: 'framework',
                type: el.attrib.type,
                parent: el.attrib.parent,
                custom: isStrTrue(el.attrib.custom),
                embed: isStrTrue(el.attrib.embed),
                src: src,
                spec: el.attrib.spec,
                weak: isStrTrue(el.attrib.weak),
                versions: el.attrib.versions,
                targetDir: el.attrib['target-dir'],
                deviceTarget: el.attrib['device-target'] || el.attrib.target,
                arch: el.attrib.arch,
                implementation: el.attrib.implementation
            };
            return ret;
        });
    };

    self.getFilesAndFrameworks = getFilesAndFrameworks;
    function getFilesAndFrameworks (platform, options) {
        // Please avoid changing the order of the calls below, files will be
        // installed in this order.
        var items = [].concat(
            self.getSourceFiles(platform),
            self.getHeaderFiles(platform),
            self.getResourceFiles(platform),
            self.getFrameworks(platform, options),
            self.getLibFiles(platform)
        );
        return items;
    }
    /// // End of PluginInfo methods /////

    /// // PluginInfo Constructor logic  /////
    self.filepath = path.join(dirname, 'plugin.xml');
    if (!fs.existsSync(self.filepath)) {
        throw new CordovaError('Cannot find plugin.xml for plugin "' + path.basename(dirname) + '". Please try adding it again.');
    }

    self.dir = dirname;
    var et = self._et = xml_helpers.parseElementtreeSync(self.filepath);
    var pelem = et.getroot();
    self.id = pelem.attrib.id;
    self.version = pelem.attrib.version;

    // Optional fields
    self.name = pelem.findtext('name');
    self.description = pelem.findtext('description');
    self.license = pelem.findtext('license');
    self.repo = pelem.findtext('repo');
    self.issue = pelem.findtext('issue');
    self.keywords = pelem.findtext('keywords');
    self.info = pelem.findtext('info');
    if (self.keywords) {
        self.keywords = self.keywords.split(',').map(function (s) { return s.trim(); });
    }
    self.getKeywordsAndPlatforms = function () {
        var ret = self.keywords || [];
        return ret.concat('ecosystem:cordova').concat(addCordova(self.getPlatformsArray()));
    };
} // End of PluginInfo constructor.

// Helper function used to prefix every element of an array with cordova-
// Useful when we want to modify platforms to be cordova-platform
function addCordova (someArray) {
    var newArray = someArray.map(function (element) {
        return 'cordova-' + element;
    });
    return newArray;
}

// Helper function used by most of the getSomething methods of PluginInfo.
// Get all elements of a given name. Both in root and in platform sections
// for the given platform. If transform is given and is a function, it is
// applied to each element.
function _getTags (pelem, tag, platform, transform) {
    var platformTag = pelem.find('./platform[@name="' + platform + '"]');
    var tagsInRoot = pelem.findall(tag);
    tagsInRoot = tagsInRoot || [];
    var tagsInPlatform = platformTag ? platformTag.findall(tag) : [];
    var tags = tagsInRoot.concat(tagsInPlatform);
    if (typeof transform === 'function') {
        tags = tags.map(transform);
    }
    return tags;
}

// Same as _getTags() but only looks inside a platform section.
function _getTagsInPlatform (pelem, tag, platform, transform) {
    var platformTag = pelem.find('./platform[@name="' + platform + '"]');
    var tags = platformTag ? platformTag.findall(tag) : [];
    if (typeof transform === 'function') {
        tags = tags.map(transform);
    }
    return tags;
}

// Check if x is a string 'true'.
function isStrTrue (x) {
    return String(x).toLowerCase() === 'true';
}

module.exports = PluginInfo;
// Backwards compat:
PluginInfo.PluginInfo = PluginInfo;
PluginInfo.loadPluginsDir = function (dir) {
    var PluginInfoProvider = require('./PluginInfoProvider');
    return new PluginInfoProvider().getAllWithinSearchPath(dir);
};
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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 sub:true, laxcomma:true, laxbreak:true */

var fs = require('fs-extra');
var path = require('path');
var PluginInfo = require('./PluginInfo');
var events = require('../events');

function PluginInfoProvider () {
    this._cache = {};
    this._getAllCache = {};
}

PluginInfoProvider.prototype.get = function (dirName) {
    var absPath = path.resolve(dirName);
    if (!this._cache[absPath]) {
        this._cache[absPath] = new PluginInfo(dirName);
    }
    return this._cache[absPath];
};

// Normally you don't need to put() entries, but it's used
// when copying plugins, and in unit tests.
PluginInfoProvider.prototype.put = function (pluginInfo) {
    var absPath = path.resolve(pluginInfo.dir);
    this._cache[absPath] = pluginInfo;
};

// Used for plugin search path processing.
// Given a dir containing multiple plugins, create a PluginInfo object for
// each of them and return as array.
// Should load them all in parallel and return a promise, but not yet.
PluginInfoProvider.prototype.getAllWithinSearchPath = function (dirName) {
    var absPath = path.resolve(dirName);
    if (!this._getAllCache[absPath]) {
        this._getAllCache[absPath] = getAllHelper(absPath, this);
    }
    return this._getAllCache[absPath];
};

function getAllHelper (absPath, provider) {
    if (!fs.existsSync(absPath)) {
        return [];
    }
    // If dir itself is a plugin, return it in an array with one element.
    if (fs.existsSync(path.join(absPath, 'plugin.xml'))) {
        return [provider.get(absPath)];
    }
    var subdirs = fs.readdirSync(absPath);
    var plugins = [];
    subdirs.forEach(function (subdir) {
        var d = path.join(absPath, subdir);
        if (fs.existsSync(path.join(d, 'plugin.xml'))) {
            try {
                plugins.push(provider.get(d));
            } catch (e) {
                events.emit('warn', 'Error parsing ' + path.join(d, 'plugin.xml.\n' + e.stack));
            }
        }
    });
    return plugins;
}

module.exports = PluginInfoProvider;
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

var EOL = require('os').EOL;

/**
 * A derived exception class. See usage example in cli.js
 * Based on:
 * stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/8460753#8460753
 * @param {String} message Error message
 * @param {Number} [code=0] Error code
 * @param {CordovaExternalToolErrorContext} [context] External tool error context object
 * @constructor
 */
function CordovaError (message, code, context) {
    Error.captureStackTrace(this, this.constructor);
    this.name = this.constructor.name;
    this.message = message;
    this.code = code || CordovaError.UNKNOWN_ERROR;
    this.context = context;
}

// FIXME __proto__ property has been deprecated as of ECMAScript 3.1
// eslint-disable-next-line no-proto
CordovaError.prototype.__proto__ = Error.prototype;

// TODO: Extend error codes according the projects specifics
CordovaError.UNKNOWN_ERROR = 0;
CordovaError.EXTERNAL_TOOL_ERROR = 1;

/**
 * Translates instance's error code number into error code name, e.g. 0 -> UNKNOWN_ERROR
 * @returns {string} Error code string name
 */
CordovaError.prototype.getErrorCodeName = function () {
    for (const key of Object.keys(CordovaError)) {
        if (CordovaError[key] === this.code) {
            return key;
        }
    }
};

/**
 * Converts CordovaError instance to string representation
 * @param   {Boolean}  [isVerbose]  Set up verbose mode. Used to provide more
 *   details including information about error code name and context
 * @return  {String}              Stringified error representation
 */
CordovaError.prototype.toString = function (isVerbose) {
    var message = '';
    var codePrefix = '';

    if (this.code !== CordovaError.UNKNOWN_ERROR) {
        codePrefix = 'code: ' + this.code + (isVerbose ? (' (' + this.getErrorCodeName() + ')') : '') + ' ';
    }

    if (this.code === CordovaError.EXTERNAL_TOOL_ERROR) {
        if (typeof this.context !== 'undefined') {
            if (isVerbose) {
                message = codePrefix + EOL + this.context.toString(isVerbose) + '\n failed with an error: ' +
                    this.message + EOL + 'Stack trace: ' + this.stack;
            } else {
                message = codePrefix + '\'' + this.context.toString(isVerbose) + '\' ' + this.message;
            }
        } else {
            message = 'External tool failed with an error: ' + this.message;
        }
    } else {
        message = isVerbose ? codePrefix + this.stack : codePrefix + this.message;
    }

    return message;
};

module.exports = CordovaError;
/**
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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 proto:true */

var path = require('path');

/**
 * @param {String} cmd Command full path
 * @param {String[]} args Command args
 * @param {String} [cwd] Command working directory
 * @constructor
 */
function CordovaExternalToolErrorContext (cmd, args, cwd) {
    this.cmd = cmd;
    // Helper field for readability
    this.cmdShortName = path.basename(cmd);
    this.args = args;
    this.cwd = cwd;
}

CordovaExternalToolErrorContext.prototype.toString = function (isVerbose) {
    if (isVerbose) {
        return 'External tool \'' + this.cmdShortName + '\'' +
            '\nCommand full path: ' + this.cmd + '\nCommand args: ' + this.args +
            (typeof this.cwd !== 'undefined' ? '\nCommand cwd: ' + this.cwd : '');
    }

    return this.cmdShortName;
};

module.exports = CordovaExternalToolErrorContext;
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

var et = require('elementtree');
var xml = require('../util/xml-helpers');
var CordovaError = require('../CordovaError/CordovaError');
var fs = require('fs-extra');
var events = require('../events');

/** Wraps a config.xml file */
function ConfigParser (path) {
    this.path = path;
    try {
        this.doc = xml.parseElementtreeSync(path);
        this.cdvNamespacePrefix = getCordovaNamespacePrefix(this.doc);
        et.register_namespace(this.cdvNamespacePrefix, 'http://cordova.apache.org/ns/1.0');
    } catch (e) {
        events.emit('error', 'Parsing ' + path + ' failed');
        throw e;
    }
    var r = this.doc.getroot();
    if (r.tag !== 'widget') {
        throw new CordovaError(path + ' has incorrect root node name (expected "widget", was "' + r.tag + '")');
    }
}

function getNodeTextSafe (el) {
    return el && el.text && el.text.trim();
}

function findOrCreate (doc, name) {
    var ret = doc.find(name);
    if (!ret) {
        ret = new et.Element(name);
        doc.getroot().append(ret);
    }
    return ret;
}

function getCordovaNamespacePrefix (doc) {
    var rootAtribs = Object.getOwnPropertyNames(doc.getroot().attrib);
    var prefix = 'cdv';
    for (var j = 0; j < rootAtribs.length; j++) {
        if (rootAtribs[j].startsWith('xmlns:') &&
            doc.getroot().attrib[rootAtribs[j]] === 'http://cordova.apache.org/ns/1.0') {
            var strings = rootAtribs[j].split(':');
            prefix = strings[1];
            break;
        }
    }
    return prefix;
}

/**
 * Finds the value of an element's attribute
 * @param  {String} attributeName Name of the attribute to search for
 * @param  {Array}  elems         An array of ElementTree nodes
 * @return {String}
 */
function findElementAttributeValue (attributeName, elems) {
    elems = Array.isArray(elems) ? elems : [elems];

    var value = elems.filter(function (elem) {
        return elem.attrib.name.toLowerCase() === attributeName.toLowerCase();
    }).map(function (filteredElems) {
        return filteredElems.attrib.value;
    }).pop();

    return value || '';
}

function removeChildren (el, selector) {
    const matches = el.findall(selector);
    matches.forEach(child => el.remove(child));
}

ConfigParser.prototype = {
    getAttribute: function (attr) {
        return this.doc.getroot().attrib[attr];
    },

    packageName: function () {
        return this.getAttribute('id');
    },
    setPackageName: function (id) {
        this.doc.getroot().attrib['id'] = id;
    },
    android_packageName: function () {
        return this.getAttribute('android-packageName');
    },
    android_activityName: function () {
        return this.getAttribute('android-activityName');
    },
    ios_CFBundleIdentifier: function () {
        return this.getAttribute('ios-CFBundleIdentifier');
    },
    name: function () {
        return getNodeTextSafe(this.doc.find('name'));
    },
    setName: function (name) {
        var el = findOrCreate(this.doc, 'name');
        el.text = name;
    },
    shortName: function () {
        return this.doc.find('name').attrib['short'] || this.name();
    },
    setShortName: function (shortname) {
        var el = findOrCreate(this.doc, 'name');
        if (!el.text) {
            el.text = shortname;
        }
        el.attrib['short'] = shortname;
    },
    description: function () {
        return getNodeTextSafe(this.doc.find('description'));
    },
    setDescription: function (text) {
        var el = findOrCreate(this.doc, 'description');
        el.text = text;
    },
    version: function () {
        return this.getAttribute('version');
    },
    windows_packageVersion: function () {
        return this.getAttribute('windows-packageVersion');
    },
    android_versionCode: function () {
        return this.getAttribute('android-versionCode');
    },
    ios_CFBundleVersion: function () {
        return this.getAttribute('ios-CFBundleVersion');
    },
    setVersion: function (value) {
        this.doc.getroot().attrib['version'] = value;
    },
    author: function () {
        return getNodeTextSafe(this.doc.find('author'));
    },
    getGlobalPreference: function (name) {
        return findElementAttributeValue(name, this.doc.findall('preference'));
    },
    setGlobalPreference: function (name, value) {
        var pref = this.doc.find('preference[@name="' + name + '"]');
        if (!pref) {
            pref = new et.Element('preference');
            pref.attrib.name = name;
            this.doc.getroot().append(pref);
        }
        pref.attrib.value = value;
    },
    getPlatformPreference: function (name, platform) {
        return findElementAttributeValue(name, this.doc.findall('./platform[@name="' + platform + '"]/preference'));
    },
    setPlatformPreference: function (name, platform, value) {
        const platformEl = this.doc.find('./platform[@name="' + platform + '"]');
        if (!platformEl) {
            throw new CordovaError('platform does not exist (received platform: ' + platform + ')');
        }
        const elems = this.doc.findall('./platform[@name="' + platform + '"]/preference');
        let pref = elems.filter(function (elem) {
            return elem.attrib.name.toLowerCase() === name.toLowerCase();
        }).pop();

        if (!pref) {
            pref = new et.Element('preference');
            pref.attrib.name = name;
            platformEl.append(pref);
        }
        pref.attrib.value = value;
    },
    getPreference: function (name, platform) {
        var platformPreference = '';

        if (platform) {
            platformPreference = this.getPlatformPreference(name, platform);
        }

        return platformPreference || this.getGlobalPreference(name);
    },
    setPreference: function (name, platform, value) {
        if (!value) {
            value = platform;
            platform = undefined;
        }

        if (platform) {
            this.setPlatformPreference(name, platform, value);
        } else {
            this.setGlobalPreference(name, value);
        }
    },
    /**
     * Returns all resources for the platform specified.
     * @param  {String} platform     The platform.
     * @param {string}  resourceName Type of static resources to return.
     *                               "icon" and "splash" currently supported.
     * @return {Array}               Resources for the platform specified.
     */
    getStaticResources: function (platform, resourceName) {
        var ret = [];
        var staticResources = [];
        if (platform) { // platform specific icons
            this.doc.findall('./platform[@name="' + platform + '"]/' + resourceName).forEach(function (elt) {
                elt.platform = platform; // mark as platform specific resource
                staticResources.push(elt);
            });
        }
        // root level resources
        staticResources = staticResources.concat(this.doc.findall(resourceName));
        // parse resource elements
        var that = this;
        staticResources.forEach(function (elt) {
            var res = {};
            res.src = elt.attrib.src;
            res.target = elt.attrib.target || undefined;
            res.density = elt.attrib['density'] || elt.attrib[that.cdvNamespacePrefix + ':density'] || elt.attrib['gap:density'];
            res.platform = elt.platform || null; // null means icon represents default icon (shared between platforms)
            res.width = +elt.attrib.width || undefined;
            res.height = +elt.attrib.height || undefined;
            res.background = elt.attrib.background || undefined;
            res.foreground = elt.attrib.foreground || undefined;

            // default icon
            if (!res.width && !res.height && !res.density) {
                ret.defaultResource = res;
            }
            ret.push(res);
        });

        /**
         * Returns resource with specified width and/or height.
         * @param  {number} width Width of resource.
         * @param  {number} height Height of resource.
         * @return {Resource} Resource object or null if not found.
         */
        ret.getBySize = function (width, height) {
            return ret.filter(function (res) {
                if (!res.width && !res.height) {
                    return false;
                }
                return ((!res.width || (width === res.width)) &&
                    (!res.height || (height === res.height)));
            })[0] || null;
        };

        /**
         * Returns resource with specified density.
         * @param  {string} density Density of resource.
         * @return {Resource}       Resource object or null if not found.
         */
        ret.getByDensity = function (density) {
            return ret.filter(function (res) {
                return res.density === density;
            })[0] || null;
        };

        /** Returns default icons */
        ret.getDefault = function () {
            return ret.defaultResource;
        };

        return ret;
    },

    /**
     * Returns all icons for specific platform.
     * @param  {string} platform Platform name
     * @return {Resource[]}      Array of icon objects.
     */
    getIcons: function (platform) {
        return this.getStaticResources(platform, 'icon');
    },

    /**
     * Returns all splash images for specific platform.
     * @param  {string} platform Platform name
     * @return {Resource[]}      Array of Splash objects.
     */
    getSplashScreens: function (platform) {
        return this.getStaticResources(platform, 'splash');
    },

    /**
     * Returns all resource-files for a specific platform.
     * @param  {string} platform Platform name
     * @param  {boolean} includeGlobal Whether to return resource-files at the
     *                                 root level.
     * @return {Resource[]}      Array of resource file objects.
     */
    getFileResources: function (platform, includeGlobal) {
        var fileResources = [];

        if (platform) { // platform specific resources
            fileResources = this.doc.findall('./platform[@name="' + platform + '"]/resource-file').map(function (tag) {
                return {
                    platform: platform,
                    src: tag.attrib.src,
                    target: tag.attrib.target,
                    versions: tag.attrib.versions,
                    deviceTarget: tag.attrib['device-target'],
                    arch: tag.attrib.arch
                };
            });
        }

        if (includeGlobal) {
            this.doc.findall('resource-file').forEach(function (tag) {
                fileResources.push({
                    platform: platform || null,
                    src: tag.attrib.src,
                    target: tag.attrib.target,
                    versions: tag.attrib.versions,
                    deviceTarget: tag.attrib['device-target'],
                    arch: tag.attrib.arch
                });
            });
        }

        return fileResources;
    },

    /**
     * Returns all hook scripts for the hook type specified.
     * @param  {String} hook     The hook type.
     * @param {Array}  platforms Platforms to look for scripts into (root scripts will be included as well).
     * @return {Array}               Script elements.
     */
    getHookScripts: function (hook, platforms) {
        var self = this;
        var scriptElements = self.doc.findall('./hook');

        if (platforms) {
            platforms.forEach(function (platform) {
                scriptElements = scriptElements.concat(self.doc.findall('./platform[@name="' + platform + '"]/hook'));
            });
        }

        function filterScriptByHookType (el) {
            return el.attrib.src && el.attrib.type && el.attrib.type.toLowerCase() === hook;
        }

        return scriptElements.filter(filterScriptByHookType);
    },
    /**
    * Returns a list of plugin (IDs).
    *
    * This function also returns any plugin's that
    * were defined using the legacy <feature> tags.
    * @return {string[]} Array of plugin IDs
    */
    getPluginIdList: function () {
        var plugins = this.doc.findall('plugin');
        var result = plugins.map(function (plugin) {
            return plugin.attrib.name;
        });
        var features = this.doc.findall('feature');
        features.forEach(function (element) {
            var idTag = element.find('./param[@name="id"]');
            if (idTag) {
                result.push(idTag.attrib.value);
            }
        });
        return result;
    },
    getPlugins: function () {
        return this.getPluginIdList().map(function (pluginId) {
            return this.getPlugin(pluginId);
        }, this);
    },
    /**
     * Adds a plugin element. Does not check for duplicates.
     * @name addPlugin
     * @function
     * @param {object} attributes name and spec are supported
     * @param {Array|object} variables name, value or arbitary object
     */
    addPlugin: function (attributes, variables) {
        if (!attributes && !attributes.name) return;
        var el = new et.Element('plugin');
        el.attrib.name = attributes.name;
        if (attributes.spec) {
            el.attrib.spec = attributes.spec;
        }

        // support arbitrary object as variables source
        if (variables && typeof variables === 'object' && !Array.isArray(variables)) {
            variables = Object.keys(variables)
                .map(function (variableName) {
                    return { name: variableName, value: variables[variableName] };
                });
        }

        if (variables) {
            variables.forEach(function (variable) {
                el.append(new et.Element('variable', { name: variable.name, value: variable.value }));
            });
        }
        this.doc.getroot().append(el);
    },
    /**
     * Retrives the plugin with the given id or null if not found.
     *
     * This function also returns any plugin's that
     * were defined using the legacy <feature> tags.
     * @name getPlugin
     * @function
     * @param {String} id
     * @returns {object} plugin including any variables
     */
    getPlugin: function (id) {
        if (!id) {
            return undefined;
        }
        var pluginElement = this.doc.find('./plugin/[@name="' + id + '"]');
        if (pluginElement === null) {
            var legacyFeature = this.doc.find('./feature/param[@name="id"][@value="' + id + '"]/..');
            if (legacyFeature) {
                events.emit('log', 'Found deprecated feature entry for ' + id + ' in config.xml.');
                return featureToPlugin(legacyFeature);
            }
            return undefined;
        }
        var plugin = {};

        plugin.name = pluginElement.attrib.name;
        plugin.spec = pluginElement.attrib.spec || pluginElement.attrib.src || pluginElement.attrib.version;
        plugin.variables = {};
        var variableElements = pluginElement.findall('variable');
        variableElements.forEach(function (varElement) {
            var name = varElement.attrib.name;
            var value = varElement.attrib.value;
            if (name) {
                plugin.variables[name] = value;
            }
        });
        return plugin;
    },
    /**
     * Remove the plugin entry with give name (id).
     *
     * This function also operates on any plugin's that
     * were defined using the legacy <feature> tags.
     * @name removePlugin
     * @function
     * @param id name of the plugin
     */
    removePlugin: function (id) {
        if (!id) return;
        const root = this.doc.getroot();
        removeChildren(root, `./plugin/[@name="${id}"]`);
        removeChildren(root, `./feature/param[@name="id"][@value="${id}"]/..`);
    },

    // Add any element to the root
    addElement: function (name, attributes) {
        var el = et.Element(name);
        for (var a in attributes) {
            el.attrib[a] = attributes[a];
        }
        this.doc.getroot().append(el);
    },

    /**
     * Adds an engine. Does not check for duplicates.
     * @param  {String} name the engine name
     * @param  {String} spec engine source location or version (optional)
     */
    addEngine: function (name, spec) {
        if (!name) return;
        var el = et.Element('engine');
        el.attrib.name = name;
        if (spec) {
            el.attrib.spec = spec;
        }
        this.doc.getroot().append(el);
    },
    /**
     * Removes all the engines with given name
     * @param  {String} name the engine name.
     */
    removeEngine: function (name) {
        removeChildren(this.doc.getroot(), `./engine/[@name="${name}"]`);
    },
    getEngines: function () {
        var engines = this.doc.findall('./engine');
        return engines.map(function (engine) {
            var spec = engine.attrib.spec || engine.attrib.version;
            return {
                name: engine.attrib.name,
                spec: spec || null
            };
        });
    },
    /* Get all the access tags */
    getAccesses: function () {
        var accesses = this.doc.findall('./access');
        return accesses.map(function (access) {
            var minimum_tls_version = access.attrib['minimum-tls-version']; /* String */
            var requires_forward_secrecy = access.attrib['requires-forward-secrecy']; /* Boolean */
            var requires_certificate_transparency = access.attrib['requires-certificate-transparency']; /* Boolean */
            var allows_arbitrary_loads_in_web_content = access.attrib['allows-arbitrary-loads-in-web-content']; /* Boolean */
            var allows_arbitrary_loads_in_media = access.attrib['allows-arbitrary-loads-in-media']; /* Boolean (DEPRECATED) */
            var allows_arbitrary_loads_for_media = access.attrib['allows-arbitrary-loads-for-media']; /* Boolean */
            var allows_local_networking = access.attrib['allows-local-networking']; /* Boolean */

            return {
                origin: access.attrib.origin,
                minimum_tls_version: minimum_tls_version,
                requires_forward_secrecy: requires_forward_secrecy,
                requires_certificate_transparency: requires_certificate_transparency,
                allows_arbitrary_loads_in_web_content: allows_arbitrary_loads_in_web_content,
                allows_arbitrary_loads_in_media: allows_arbitrary_loads_in_media,
                allows_arbitrary_loads_for_media: allows_arbitrary_loads_for_media,
                allows_local_networking: allows_local_networking
            };
        });
    },
    /* Get all the allow-navigation tags */
    getAllowNavigations: function () {
        var allow_navigations = this.doc.findall('./allow-navigation');
        return allow_navigations.map(function (allow_navigation) {
            var minimum_tls_version = allow_navigation.attrib['minimum-tls-version']; /* String */
            var requires_forward_secrecy = allow_navigation.attrib['requires-forward-secrecy']; /* Boolean */
            var requires_certificate_transparency = allow_navigation.attrib['requires-certificate-transparency']; /* Boolean */

            return {
                href: allow_navigation.attrib.href,
                minimum_tls_version: minimum_tls_version,
                requires_forward_secrecy: requires_forward_secrecy,
                requires_certificate_transparency: requires_certificate_transparency
            };
        });
    },
    /* Get all the allow-intent tags */
    getAllowIntents: function () {
        var allow_intents = this.doc.findall('./allow-intent');
        return allow_intents.map(function (allow_intent) {
            return {
                href: allow_intent.attrib.href
            };
        });
    },
    /* Get all edit-config tags */
    getEditConfigs: function (platform) {
        var platform_edit_configs = this.doc.findall('./platform[@name="' + platform + '"]/edit-config');
        var edit_configs = this.doc.findall('edit-config').concat(platform_edit_configs);

        return edit_configs.map(function (tag) {
            var editConfig =
                {
                    file: tag.attrib['file'],
                    target: tag.attrib['target'],
                    mode: tag.attrib['mode'],
                    id: 'config.xml',
                    xmls: tag.getchildren()
                };
            return editConfig;
        });
    },

    /* Get all config-file tags */
    getConfigFiles: function (platform) {
        var platform_config_files = this.doc.findall('./platform[@name="' + platform + '"]/config-file');
        var config_files = this.doc.findall('config-file').concat(platform_config_files);

        return config_files.map(function (tag) {
            var configFile =
                {
                    target: tag.attrib['target'],
                    parent: tag.attrib['parent'],
                    after: tag.attrib['after'],
                    xmls: tag.getchildren(),
                    // To support demuxing via versions
                    versions: tag.attrib['versions'],
                    deviceTarget: tag.attrib['device-target']
                };
            return configFile;
        });
    },

    write: function () {
        fs.writeFileSync(this.path, this.doc.write({ indent: 4 }), 'utf-8');
    }
};

function featureToPlugin (featureElement) {
    var plugin = {};
    plugin.variables = [];
    var pluginVersion,
        pluginSrc;

    var nodes = featureElement.findall('param');
    nodes.forEach(function (element) {
        var n = element.attrib.name;
        var v = element.attrib.value;
        if (n === 'id') {
            plugin.name = v;
        } else if (n === 'version') {
            pluginVersion = v;
        } else if (n === 'url' || n === 'installPath') {
            pluginSrc = v;
        } else {
            plugin.variables[n] = v;
        }
    });

    var spec = pluginSrc || pluginVersion;
    if (spec) {
        plugin.spec = spec;
    }

    return plugin;
}
module.exports = ConfigParser;
/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

/*
 * This module deals with shared configuration / dependency "stuff". That is:
 * - XML configuration files such as config.xml, AndroidManifest.xml or WMAppManifest.xml.
 * - plist files in iOS
 * Essentially, any type of shared resources that we need to handle with awareness
 * of how potentially multiple plugins depend on a single shared resource, should be
 * handled in this module.
 *
 * The implementation uses an object as a hash table, with "leaves" of the table tracking
 * reference counts.
 */

var path = require('path');
var et = require('elementtree');
var ConfigKeeper = require('./ConfigKeeper');
var events = require('../events');

var mungeutil = require('./munge-util');
var xml_helpers = require('../util/xml-helpers');

exports.PlatformMunger = PlatformMunger;

exports.process = function (plugins_dir, project_dir, platform, platformJson, pluginInfoProvider) {
    var munger = new PlatformMunger(platform, project_dir, platformJson, pluginInfoProvider);
    munger.process(plugins_dir);
    munger.save_all();
};

/******************************************************************************
* PlatformMunger class
*
* Can deal with config file of a single project.
* Parsed config files are cached in a ConfigKeeper object.
******************************************************************************/
function PlatformMunger (platform, project_dir, platformJson, pluginInfoProvider) {
    this.platform = platform;
    this.project_dir = project_dir;
    this.config_keeper = new ConfigKeeper(project_dir);
    this.platformJson = platformJson;
    this.pluginInfoProvider = pluginInfoProvider;
}

// Write out all unsaved files.
PlatformMunger.prototype.save_all = PlatformMunger_save_all;
function PlatformMunger_save_all () {
    this.config_keeper.save_all();
    this.platformJson.save();
}

// Apply a munge object to a single config file.
// The remove parameter tells whether to add the change or remove it.
PlatformMunger.prototype.apply_file_munge = PlatformMunger_apply_file_munge;
function PlatformMunger_apply_file_munge (file, munge, remove) {
    var self = this;

    for (var selector in munge.parents) {
        for (var xml_child in munge.parents[selector]) {
            // this xml child is new, graft it (only if config file exists)
            var config_file = self.config_keeper.get(self.project_dir, self.platform, file);
            if (config_file.exists) {
                if (remove) config_file.prune_child(selector, munge.parents[selector][xml_child]);
                else config_file.graft_child(selector, munge.parents[selector][xml_child]);
            } else {
                events.emit('warn', 'config file ' + file + ' requested for changes not found at ' + config_file.filepath + ', ignoring');
            }
        }
    }
}

PlatformMunger.prototype.remove_plugin_changes = remove_plugin_changes;
function remove_plugin_changes (pluginInfo, is_top_level) {
    var self = this;
    var platform_config = self.platformJson.root;
    var plugin_vars = is_top_level
        ? platform_config.installed_plugins[pluginInfo.id]
        : platform_config.dependent_plugins[pluginInfo.id];
    var edit_config_changes = null;
    if (pluginInfo.getEditConfigs) {
        edit_config_changes = pluginInfo.getEditConfigs(self.platform);
    }

    // get config munge, aka how did this plugin change various config files
    var config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes);
    // global munge looks at all plugins' changes to config files
    var global_munge = platform_config.config_munge;
    var munge = mungeutil.decrement_munge(global_munge, config_munge);

    for (var file in munge.files) {
        self.apply_file_munge(file, munge.files[file], /* remove = */ true);
    }

    // Remove from installed_plugins
    self.platformJson.removePlugin(pluginInfo.id, is_top_level);
    return self;
}

PlatformMunger.prototype.add_plugin_changes = add_plugin_changes;
function add_plugin_changes (pluginInfo, plugin_vars, is_top_level, should_increment, plugin_force) {
    var self = this;
    var platform_config = self.platformJson.root;

    var edit_config_changes = null;
    if (pluginInfo.getEditConfigs) {
        edit_config_changes = pluginInfo.getEditConfigs(self.platform);
    }

    var config_munge;

    if (!edit_config_changes || edit_config_changes.length === 0) {
        // get config munge, aka how should this plugin change various config files
        config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars);
    } else {
        var isConflictingInfo = is_conflicting(edit_config_changes, platform_config.config_munge, self, plugin_force);

        if (isConflictingInfo.conflictWithConfigxml) {
            throw new Error(pluginInfo.id +
                ' cannot be added. <edit-config> changes in this plugin conflicts with <edit-config> changes in config.xml. Conflicts must be resolved before plugin can be added.');
        }
        if (plugin_force) {
            events.emit('warn', '--force is used. edit-config will overwrite conflicts if any. Conflicting plugins may not work as expected.');

            // remove conflicting munges
            var conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.conflictingMunge);
            for (var conflict_file in conflict_munge.files) {
                self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true);
            }

            // force add new munges
            config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes);
        } else if (isConflictingInfo.conflictFound) {
            throw new Error('There was a conflict trying to modify attributes with <edit-config> in plugin ' + pluginInfo.id +
            '. The conflicting plugin, ' + isConflictingInfo.conflictingPlugin + ', already modified the same attributes. The conflict must be resolved before ' +
            pluginInfo.id + ' can be added. You may use --force to add the plugin and overwrite the conflicting attributes.');
        } else {
            // no conflicts, will handle edit-config
            config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes);
        }
    }

    self = munge_helper(should_increment, self, platform_config, config_munge);

    // Move to installed/dependent_plugins
    self.platformJson.addPlugin(pluginInfo.id, plugin_vars || {}, is_top_level);
    return self;
}

// Handle edit-config changes from config.xml
PlatformMunger.prototype.add_config_changes = add_config_changes;
function add_config_changes (config, should_increment) {
    var self = this;
    var platform_config = self.platformJson.root;

    var config_munge;
    var changes = [];

    if (config.getEditConfigs) {
        var edit_config_changes = config.getEditConfigs(self.platform);
        if (edit_config_changes) {
            changes = changes.concat(edit_config_changes);
        }
    }

    if (config.getConfigFiles) {
        var config_files_changes = config.getConfigFiles(self.platform);
        if (config_files_changes) {
            changes = changes.concat(config_files_changes);
        }
    }

    if (changes && changes.length > 0) {
        var isConflictingInfo = is_conflicting(changes, platform_config.config_munge, self, true /* always force overwrite other edit-config */);
        if (isConflictingInfo.conflictFound) {
            var conflict_munge;
            var conflict_file;

            if (Object.keys(isConflictingInfo.configxmlMunge.files).length !== 0) {
                // silently remove conflicting config.xml munges so new munges can be added
                conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.configxmlMunge);
                for (conflict_file in conflict_munge.files) {
                    self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true);
                }
            }
            if (Object.keys(isConflictingInfo.conflictingMunge.files).length !== 0) {
                events.emit('warn', 'Conflict found, edit-config changes from config.xml will overwrite plugin.xml changes');

                // remove conflicting plugin.xml munges
                conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.conflictingMunge);
                for (conflict_file in conflict_munge.files) {
                    self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true);
                }
            }
        }
    }

    // Add config.xml edit-config and config-file munges
    config_munge = self.generate_config_xml_munge(config, changes, 'config.xml');
    self = munge_helper(should_increment, self, platform_config, config_munge);

    // Move to installed/dependent_plugins
    return self;
}

function munge_helper (should_increment, self, platform_config, config_munge) {
    // global munge looks at all changes to config files

    // TODO: The should_increment param is only used by cordova-cli and is going away soon.
    // If should_increment is set to false, avoid modifying the global_munge (use clone)
    // and apply the entire config_munge because it's already a proper subset of the global_munge.
    var munge, global_munge;
    if (should_increment) {
        global_munge = platform_config.config_munge;
        munge = mungeutil.increment_munge(global_munge, config_munge);
    } else {
        global_munge = mungeutil.clone_munge(platform_config.config_munge);
        munge = config_munge;
    }

    for (var file in munge.files) {
        self.apply_file_munge(file, munge.files[file]);
    }

    return self;
}

// Load the global munge from platform json and apply all of it.
// Used by cordova prepare to re-generate some config file from platform
// defaults and the global munge.
PlatformMunger.prototype.reapply_global_munge = reapply_global_munge;
function reapply_global_munge () {
    var self = this;

    var platform_config = self.platformJson.root;
    var global_munge = platform_config.config_munge;
    for (var file in global_munge.files) {
        self.apply_file_munge(file, global_munge.files[file]);
    }

    return self;
}

// generate_plugin_config_munge
// Generate the munge object from config.xml
PlatformMunger.prototype.generate_config_xml_munge = generate_config_xml_munge;
function generate_config_xml_munge (config, config_changes, type) {
    var munge = { files: {} };
    var id;

    if (!config_changes) {
        return munge;
    }

    if (type === 'config.xml') {
        id = type;
    } else {
        id = config.id;
    }

    config_changes.forEach(function (change) {
        change.xmls.forEach(function (xml) {
            // 1. stringify each xml
            var stringified = (new et.ElementTree(xml)).write({ xml_declaration: false });
            // 2. add into munge
            if (change.mode) {
                mungeutil.deep_add(munge, change.file, change.target, { xml: stringified, count: 1, mode: change.mode, id: id });
            } else {
                mungeutil.deep_add(munge, change.target, change.parent, { xml: stringified, count: 1, after: change.after });
            }
        });
    });
    return munge;
}

// generate_plugin_config_munge
// Generate the munge object from plugin.xml + vars
PlatformMunger.prototype.generate_plugin_config_munge = generate_plugin_config_munge;
function generate_plugin_config_munge (pluginInfo, vars, edit_config_changes) {
    var self = this;

    vars = vars || {};
    var munge = { files: {} };
    var changes = pluginInfo.getConfigFiles(self.platform);

    if (edit_config_changes) {
        Array.prototype.push.apply(changes, edit_config_changes);
    }

    changes.forEach(function (change) {
        change.xmls.forEach(function (xml) {
            // 1. stringify each xml
            var stringified = (new et.ElementTree(xml)).write({ xml_declaration: false });
            // interp vars
            if (vars) {
                Object.keys(vars).forEach(function (key) {
                    var regExp = new RegExp('\\$' + key, 'g');
                    stringified = stringified.replace(regExp, vars[key]);
                });
            }
            // 2. add into munge
            if (change.mode) {
                if (change.mode !== 'remove') {
                    mungeutil.deep_add(munge, change.file, change.target, { xml: stringified, count: 1, mode: change.mode, plugin: pluginInfo.id });
                }
            } else {
                mungeutil.deep_add(munge, change.target, change.parent, { xml: stringified, count: 1, after: change.after });
            }
        });
    });
    return munge;
}

function is_conflicting (editchanges, config_munge, self, force) {
    var files = config_munge.files;
    var conflictFound = false;
    var conflictWithConfigxml = false;
    var conflictingMunge = { files: {} };
    var configxmlMunge = { files: {} };
    var conflictingParent;
    var conflictingPlugin;

    editchanges.forEach(function (editchange) {
        if (files[editchange.file]) {
            var parents = files[editchange.file].parents;
            var target = parents[editchange.target];

            // Check if the edit target will resolve to an existing target
            if (!target || target.length === 0) {
                var file_xml = self.config_keeper.get(self.project_dir, self.platform, editchange.file).data;
                var resolveEditTarget = xml_helpers.resolveParent(file_xml, editchange.target);
                var resolveTarget;

                if (resolveEditTarget) {
                    for (var parent in parents) {
                        resolveTarget = xml_helpers.resolveParent(file_xml, parent);
                        if (resolveEditTarget === resolveTarget) {
                            conflictingParent = parent;
                            target = parents[parent];
                            break;
                        }
                    }
                }
            } else {
                conflictingParent = editchange.target;
            }

            if (target && target.length !== 0) {
                // conflict has been found
                conflictFound = true;

                if (editchange.id === 'config.xml') {
                    if (target[0].id === 'config.xml') {
                        // Keep track of config.xml/config.xml edit-config conflicts
                        mungeutil.deep_add(configxmlMunge, editchange.file, conflictingParent, target[0]);
                    } else {
                        // Keep track of config.xml x plugin.xml edit-config conflicts
                        mungeutil.deep_add(conflictingMunge, editchange.file, conflictingParent, target[0]);
                    }
                } else {
                    if (target[0].id === 'config.xml') {
                        // plugin.xml cannot overwrite config.xml changes even if --force is used
                        conflictWithConfigxml = true;
                        return;
                    }

                    if (force) {
                        // Need to find all conflicts when --force is used, track conflicting munges
                        mungeutil.deep_add(conflictingMunge, editchange.file, conflictingParent, target[0]);
                    } else {
                        // plugin cannot overwrite other plugin changes without --force
                        conflictingPlugin = target[0].plugin;
                    }
                }
            }
        }
    });

    return { conflictFound: conflictFound,
        conflictingPlugin: conflictingPlugin,
        conflictingMunge: conflictingMunge,
        configxmlMunge: configxmlMunge,
        conflictWithConfigxml: conflictWithConfigxml
    };
}

// Go over the prepare queue and apply the config munges for each plugin
// that has been (un)installed.
PlatformMunger.prototype.process = PlatformMunger_process;
function PlatformMunger_process (plugins_dir) {
    var self = this;
    var platform_config = self.platformJson.root;

    // Uninstallation first
    platform_config.prepare_queue.uninstalled.forEach(function (u) {
        var pluginInfo = self.pluginInfoProvider.get(path.join(plugins_dir, u.plugin));
        self.remove_plugin_changes(pluginInfo, u.topLevel);
    });

    // Now handle installation
    platform_config.prepare_queue.installed.forEach(function (u) {
        var pluginInfo = self.pluginInfoProvider.get(path.join(plugins_dir, u.plugin));
        self.add_plugin_changes(pluginInfo, u.vars, u.topLevel, true, u.force);
    });

    // Empty out installed/ uninstalled queues.
    platform_config.prepare_queue.uninstalled = [];
    platform_config.prepare_queue.installed = [];
}
/** ** END of PlatformMunger ****/
/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var fs = require('fs-extra');
var path = require('path');

var modules = {};
var addProperty = require('../util/addProperty');

// Use delay loading to ensure plist and other node modules to not get loaded
// on Android, Windows platforms
addProperty(module, 'bplist', 'bplist-parser', modules);
addProperty(module, 'et', 'elementtree', modules);
addProperty(module, 'glob', 'glob', modules);
addProperty(module, 'plist', 'plist', modules);
addProperty(module, 'plist_helpers', '../util/plist-helpers', modules);
addProperty(module, 'xml_helpers', '../util/xml-helpers', modules);

/******************************************************************************
* ConfigFile class
*
* Can load and keep various types of config files. Provides some functionality
* specific to some file types such as grafting XML children. In most cases it
* should be instantiated by ConfigKeeper.
*
* For plugin.xml files use as:
* plugin_config = self.config_keeper.get(plugin_dir, '', 'plugin.xml');
*
* TODO: Consider moving it out to a separate file and maybe partially with
* overrides in platform handlers.
******************************************************************************/
function ConfigFile (project_dir, platform, file_tag) {
    this.project_dir = project_dir;
    this.platform = platform;
    this.file_tag = file_tag;
    this.is_changed = false;

    this.load();
}

// ConfigFile.load()
ConfigFile.prototype.load = ConfigFile_load;
function ConfigFile_load () {
    var self = this;

    // config file may be in a place not exactly specified in the target
    var filepath = self.filepath = resolveConfigFilePath(self.project_dir, self.platform, self.file_tag);

    if (!filepath || !fs.existsSync(filepath)) {
        self.exists = false;
        return;
    }
    self.exists = true;
    self.mtime = fs.statSync(self.filepath).mtime;

    var ext = path.extname(filepath);
    // Windows8 uses an appxmanifest, and wp8 will likely use
    // the same in a future release
    if (ext === '.xml' || ext === '.appxmanifest' || ext === '.storyboard' || ext === '.jsproj') {
        self.type = 'xml';
        self.data = modules.xml_helpers.parseElementtreeSync(filepath);
    } else {
        // plist file
        self.type = 'plist';
        // TODO: isBinaryPlist() reads the file and then parse re-reads it again.
        //       We always write out text plist, not binary.
        //       Do we still need to support binary plist?
        //       If yes, use plist.parseStringSync() and read the file once.
        self.data = isBinaryPlist(filepath)
            ? modules.bplist.parseBuffer(fs.readFileSync(filepath))[0]
            : modules.plist.parse(fs.readFileSync(filepath, 'utf8'));
    }
}

ConfigFile.prototype.save = function ConfigFile_save () {
    var self = this;
    if (self.type === 'xml') {
        fs.writeFileSync(self.filepath, self.data.write({ indent: 4 }), 'utf-8');
    } else {
        // plist
        var regExp = /<string>[ \t\r\n]+?<\/string>/g;
        fs.writeFileSync(self.filepath, modules.plist.build(self.data, { indent: '\t', offset: -1 }).replace(regExp, '<string></string>'));
    }
    self.is_changed = false;
};

ConfigFile.prototype.graft_child = function ConfigFile_graft_child (selector, xml_child) {
    var self = this;
    var filepath = self.filepath;
    var result;
    if (self.type === 'xml') {
        var xml_to_graft = [modules.et.XML(xml_child.xml)];
        switch (xml_child.mode) {
        case 'merge':
            result = modules.xml_helpers.graftXMLMerge(self.data, xml_to_graft, selector, xml_child);
            break;
        case 'overwrite':
            result = modules.xml_helpers.graftXMLOverwrite(self.data, xml_to_graft, selector, xml_child);
            break;
        case 'remove':
            result = modules.xml_helpers.pruneXMLRemove(self.data, selector, xml_to_graft);
            break;
        default:
            result = modules.xml_helpers.graftXML(self.data, xml_to_graft, selector, xml_child.after);
        }
        if (!result) {
            throw new Error('Unable to graft xml at selector "' + selector + '" from "' + filepath + '" during config install');
        }
    } else {
        // plist file
        result = modules.plist_helpers.graftPLIST(self.data, xml_child.xml, selector);
        if (!result) {
            throw new Error('Unable to graft plist "' + filepath + '" during config install');
        }
    }
    self.is_changed = true;
};

ConfigFile.prototype.prune_child = function ConfigFile_prune_child (selector, xml_child) {
    var self = this;
    var filepath = self.filepath;
    var result;
    if (self.type === 'xml') {
        var xml_to_graft = [modules.et.XML(xml_child.xml)];
        switch (xml_child.mode) {
        case 'merge':
        case 'overwrite':
            result = modules.xml_helpers.pruneXMLRestore(self.data, selector, xml_child);
            break;
        case 'remove':
            result = modules.xml_helpers.pruneXMLRemove(self.data, selector, xml_to_graft);
            break;
        default:
            result = modules.xml_helpers.pruneXML(self.data, xml_to_graft, selector);
        }
    } else {
        // plist file
        result = modules.plist_helpers.prunePLIST(self.data, xml_child.xml, selector);
    }
    if (!result) {
        var err_msg = 'Pruning at selector "' + selector + '" from "' + filepath + '" went bad.';
        throw new Error(err_msg);
    }
    self.is_changed = true;
};

// Some config-file target attributes are not qualified with a full leading directory, or contain wildcards.
// Resolve to a real path in this function.
// TODO: getIOSProjectname is slow because of glob, try to avoid calling it several times per project.
function resolveConfigFilePath (project_dir, platform, file) {
    var filepath = path.join(project_dir, file);
    var matches;

    file = path.normalize(file);

    if (file.includes('*')) {
        // handle wildcards in targets using glob.
        matches = modules.glob.sync(path.join(project_dir, '**', file));
        if (matches.length) filepath = matches[0];

        // [CB-5989] multiple Info.plist files may exist. default to $PROJECT_NAME-Info.plist
        if (matches.length > 1 && file.includes('-Info.plist')) {
            var plistName = getIOSProjectname(project_dir) + '-Info.plist';
            for (var i = 0; i < matches.length; i++) {
                if (matches[i].includes(plistName)) {
                    filepath = matches[i];
                    break;
                }
            }
        }
        return filepath;
    }

    // XXX this checks for android studio projects
    // only if none of the options above are satisfied does this get called
    // TODO: Move this out of cordova-common and into the platforms somehow
    if (platform === 'android' && !fs.existsSync(filepath)) {
        var config_file;

        if (file === 'AndroidManifest.xml') {
            filepath = path.join(project_dir, 'app', 'src', 'main', 'AndroidManifest.xml');
        } else if (file.endsWith('config.xml')) {
            filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'xml', 'config.xml');
        } else if (file.endsWith('strings.xml')) {
            // Plugins really shouldn't mess with strings.xml, since it's able to be localized
            filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'values', 'strings.xml');
        } else if (file.includes(path.join('res', 'values'))) {
            config_file = path.basename(file);
            filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'values', config_file);
        } else if (file.includes(path.join('res', 'xml'))) {
            // Catch-all for all other stored XML configuration in legacy plugins
            config_file = path.basename(file);
            filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'xml', config_file);
        }
        return filepath;
    }

    // special-case config.xml target that is just "config.xml" for other platforms. This should
    // be resolved to the real location of the file.
    // TODO: Move this out of cordova-common into platforms
    if (file === 'config.xml') {
        if (platform === 'ubuntu') {
            filepath = path.join(project_dir, 'config.xml');
        } else if (platform === 'ios' || platform === 'osx') {
            filepath = path.join(
                project_dir,
                module.exports.getIOSProjectname(project_dir),
                'config.xml'
            );
        } else {
            matches = modules.glob.sync(path.join(project_dir, '**', 'config.xml'));
            if (matches.length) filepath = matches[0];
        }
        return filepath;
    }

    // None of the special cases matched, returning project_dir/file.
    return filepath;
}

// Find out the real name of an iOS or OSX project
// TODO: glob is slow, need a better way or caching, or avoid using more than once.
function getIOSProjectname (project_dir) {
    var matches = modules.glob.sync(path.join(project_dir, '*.xcodeproj'));
    var iospath;
    if (matches.length === 1) {
        iospath = path.basename(matches[0], '.xcodeproj');
    } else {
        var msg;
        if (matches.length === 0) {
            msg = 'Does not appear to be an xcode project, no xcode project file in ' + project_dir;
        } else {
            msg = 'There are multiple *.xcodeproj dirs in ' + project_dir;
        }
        throw new Error(msg);
    }
    return iospath;
}

// determine if a plist file is binary
function isBinaryPlist (filename) {
    // I wish there was a synchronous way to read only the first 6 bytes of a
    // file. This is wasteful :/
    var buf = '' + fs.readFileSync(filename, 'utf8');
    // binary plists start with a magic header, "bplist"
    return buf.substring(0, 6) === 'bplist';
}

module.exports = ConfigFile;
module.exports.isBinaryPlist = isBinaryPlist;
module.exports.getIOSProjectname = getIOSProjectname;
module.exports.resolveConfigFilePath = resolveConfigFilePath;
/*
 * 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 sub:true */

var path = require('path');
var ConfigFile = require('./ConfigFile');

/******************************************************************************
* ConfigKeeper class
*
* Used to load and store config files to avoid re-parsing and writing them out
* multiple times.
*
* The config files are referred to by a fake path constructed as
* project_dir/platform/file
* where file is the name used for the file in config munges.
******************************************************************************/
function ConfigKeeper (project_dir, plugins_dir) {
    this.project_dir = project_dir;
    this.plugins_dir = plugins_dir;
    this._cached = {};
}

ConfigKeeper.prototype.get = function ConfigKeeper_get (project_dir, platform, file) {
    var self = this;

    // This fixes a bug with older plugins - when specifying config xml instead of res/xml/config.xml
    // https://issues.apache.org/jira/browse/CB-6414
    if (file === 'config.xml' && platform === 'android') {
        file = 'res/xml/config.xml';
    }
    var fake_path = path.join(project_dir, platform, file);

    if (self._cached[fake_path]) {
        return self._cached[fake_path];
    }
    // File was not cached, need to load.
    var config_file = new ConfigFile(project_dir, platform, file);
    self._cached[fake_path] = config_file;
    return config_file;
};

ConfigKeeper.prototype.save_all = function ConfigKeeper_save_all () {
    var self = this;
    Object.keys(self._cached).forEach(function (fake_path) {
        var config_file = self._cached[fake_path];
        if (config_file.is_changed) config_file.save();
    });
};

module.exports = ConfigKeeper;
/*
 * 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 sub:true  */

var _ = require('underscore');

// add the count of [key1][key2]...[keyN] to obj
// return true if it didn't exist before
exports.deep_add = function deep_add (obj, keys /* or key1, key2 .... */) {
    if (!Array.isArray(keys)) {
        keys = Array.prototype.slice.call(arguments, 1);
    }

    return exports.process_munge(obj, true/* createParents */, function (parentArray, k) {
        var found = _.find(parentArray, function (element) {
            return element.xml === k.xml;
        });
        if (found) {
            found.after = found.after || k.after;
            found.count += k.count;
        } else {
            parentArray.push(k);
        }
        return !found;
    }, keys);
};

// decrement the count of [key1][key2]...[keyN] from obj and remove if it reaches 0
// return true if it was removed or not found
exports.deep_remove = function deep_remove (obj, keys /* or key1, key2 .... */) {
    if (!Array.isArray(keys)) {
        keys = Array.prototype.slice.call(arguments, 1);
    }

    var result = exports.process_munge(obj, false/* createParents */, function (parentArray, k) {
        var index = -1;
        var found = _.find(parentArray, function (element) {
            index++;
            return element.xml === k.xml;
        });
        if (found) {
            if (parentArray[index].oldAttrib) {
                k.oldAttrib = _.extend({}, parentArray[index].oldAttrib);
            }
            found.count -= k.count;
            if (found.count > 0) {
                return false;
            } else {
                parentArray.splice(index, 1);
            }
        }
        return undefined;
    }, keys);

    return typeof result === 'undefined' ? true : result;
};

// search for [key1][key2]...[keyN]
// return the object or undefined if not found
exports.deep_find = function deep_find (obj, keys /* or key1, key2 .... */) {
    if (!Array.isArray(keys)) {
        keys = Array.prototype.slice.call(arguments, 1);
    }

    return exports.process_munge(obj, false/* createParents? */, function (parentArray, k) {
        return _.find(parentArray, function (element) {
            return element.xml === (k.xml || k);
        });
    }, keys);
};

// Execute func passing it the parent array and the xmlChild key.
// When createParents is true, add the file and parent items  they are missing
// When createParents is false, stop and return undefined if the file and/or parent items are missing

exports.process_munge = function process_munge (obj, createParents, func, keys /* or key1, key2 .... */) {
    if (!Array.isArray(keys)) {
        keys = Array.prototype.slice.call(arguments, 1);
    }
    var k = keys[0];
    if (keys.length === 1) {
        return func(obj, k);
    } else if (keys.length === 2) {
        if (!obj.parents[k] && !createParents) {
            return undefined;
        }
        obj.parents[k] = obj.parents[k] || [];
        return exports.process_munge(obj.parents[k], createParents, func, keys.slice(1));
    } else if (keys.length === 3) {
        if (!obj.files[k] && !createParents) {
            return undefined;
        }
        obj.files[k] = obj.files[k] || { parents: {} };
        return exports.process_munge(obj.files[k], createParents, func, keys.slice(1));
    } else {
        throw new Error('Invalid key format. Must contain at most 3 elements (file, parent, xmlChild).');
    }
};

// All values from munge are added to base as
// base[file][selector][child] += munge[file][selector][child]
// Returns a munge object containing values that exist in munge
// but not in base.
exports.increment_munge = function increment_munge (base, munge) {
    var diff = { files: {} };

    for (var file in munge.files) {
        for (var selector in munge.files[file].parents) {
            for (var xml_child in munge.files[file].parents[selector]) {
                var val = munge.files[file].parents[selector][xml_child];
                // if node not in base, add it to diff and base
                // else increment it's value in base without adding to diff
                var newlyAdded = exports.deep_add(base, [file, selector, val]);
                if (newlyAdded) {
                    exports.deep_add(diff, file, selector, val);
                }
            }
        }
    }
    return diff;
};

// Update the base munge object as
// base[file][selector][child] -= munge[file][selector][child]
// nodes that reached zero value are removed from base and added to the returned munge
// object.
exports.decrement_munge = function decrement_munge (base, munge) {
    var zeroed = { files: {} };

    for (var file in munge.files) {
        for (var selector in munge.files[file].parents) {
            for (var xml_child in munge.files[file].parents[selector]) {
                var val = munge.files[file].parents[selector][xml_child];
                // if node not in base, add it to diff and base
                // else increment it's value in base without adding to diff
                var removed = exports.deep_remove(base, [file, selector, val]);
                if (removed) {
                    exports.deep_add(zeroed, file, selector, val);
                }
            }
        }
    }
    return zeroed;
};

// For better readability where used
exports.clone_munge = function clone_munge (munge) {
    return exports.increment_munge({}, munge);
};
<!--
Please have a look at the issue templates you get when you click "New issue" in the GitHub UI.
We very much prefer issues created by using one of these templates.
-->

### Issue Type
<!-- Please check the boxes by putting an x in the [ ] like so: [x] -->

- [ ] Bug Report
- [ ] Feature Request
- [ ] Support Question

## Description

## Information
<!-- Include all relevant information that might help understand and reproduce the problem -->

### Command or Code
<!-- What command or code is needed to reproduce the problem? -->

### Environment, Platform, Device
<!-- In what environment, on what platform or on which device are you experiencing the issue? -->



### Version information
<!-- 
What are relevant versions you are using?
For example:
Cordova: Cordova CLI, Cordova Platforms, Cordova Plugins 
Other Frameworks: Ionic Framework and CLI version
Operating System, Android Studio, Xcode etc.
-->



## Checklist
<!-- Please check the boxes by putting an `x` in the `[ ]` like so: `[x]` -->

- [ ] I searched for already existing GitHub issues about this
- [ ] I updated all Cordova tooling to their most recent version
- [ ] I included all the necessary information above
<!--
Please make sure the checklist boxes are all checked before submitting the PR. The checklist is intended as a quick reference, for complete details please see our Contributor Guidelines:

http://cordova.apache.org/contribute/contribute_guidelines.html

Thanks!
-->

### Platforms affected



### Motivation and Context
<!-- Why is this change required? What problem does it solve? -->
<!-- If it fixes an open issue, please link to the issue here. -->



### Description
<!-- Describe your changes in detail -->



### Testing
<!-- Please describe in detail how you tested your changes. -->



### Checklist

- [ ] I've run the tests to see all new and existing tests pass
- [ ] I added automated test coverage as appropriate for this change
- [ ] Commit is prefixed with `(platform)` if this change only applies to one platform (e.g. `(android)`)
- [ ] If this Pull Request resolves an issue, I linked to the issue in the text above (and used the correct [keyword to close issues using keywords](https://help.github.com/articles/closing-issues-using-keywords/))
- [ ] I've updated the documentation if necessary
---
name: ðŸ�› Bug Report
about: If something isn't working as expected.

---

# Bug Report

## Problem

### What is expected to happen?



### What does actually happen?



## Information
<!-- Include all relevant information that might help understand and reproduce the problem -->



### Command or Code
<!-- What command or code is needed to reproduce the problem? -->



### Environment, Platform, Device
<!-- In what environment, on what platform or on which device are you experiencing the issue? -->



### Version information
<!-- 
What are relevant versions you are using?
For example:
Cordova: Cordova CLI, Cordova Platforms, Cordova Plugins 
Other Frameworks: Ionic Framework and CLI version
Operating System, Android Studio, Xcode etc.
-->



## Checklist
<!-- Please check the boxes by putting an x in the [ ] like so: [x] -->

- [ ] I searched for existing GitHub issues
- [ ] I updated all Cordova tooling to most recent version
- [ ] I included all the necessary information above
---
name: ðŸš€ Feature Request
about: A suggestion for a new functionality

---

# Feature Request

## Motivation Behind Feature
<!-- Why should this feature be implemented? What problem does it solve? -->



## Feature Description
<!-- 
Describe your feature request in detail
Please provide any code examples or screenshots of what this feature would look like
Are there any drawbacks? Will this break anything for existing users? 
-->



## Alternatives or Workarounds
<!-- 
Describe alternatives or workarounds you are currently using 
Are there ways to do this with existing functionality?
-->


---
name: ðŸ’¬ Support Question
about: If you have a question, please check out our Slack or StackOverflow!

---

<!------------^ Click "Preview" for a nicer view! -->

Apache Cordova uses GitHub Issues as a feature request and bug tracker _only_.
For usage and support questions, please check out the resources below. Thanks!

---

You can get answers to your usage and support questions about **Apache Cordova** on:

* Slack Community Chat: https://cordova.slack.com (you can sign-up at http://slack.cordova.io/)
* StackOverflow: https://stackoverflow.com/questions/tagged/cordova using the tag `cordova`

---

If you are using a tool that uses Cordova internally, like e.g. Ionic, check their support channels:

* **Ionic Framework**
  * [Ionic Community Forum](https://forum.ionicframework.com/)
  * [Ionic Worldwide Slack](https://ionicworldwide.herokuapp.com/)
* **PhoneGap**
  * [PhoneGap Developer Community](https://forums.adobe.com/community/phonegap)
<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
-->

# Contributing to Apache Cordova

Anyone can contribute to Cordova. And we need your contributions.

There are multiple ways to contribute: report bugs, improve the docs, and
contribute code.

For instructions on this, start with the 
[contribution overview](http://cordova.apache.org/#contribute).

The details are explained there, but the important items are:
 - Sign and submit an Apache ICLA (Contributor License Agreement).
 - Have a Jira issue open that corresponds to your contribution.
 - Run the tests so your patch doesn't break existing functionality.

We look forward to your contributions!
<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
-->

# Cordova Electron

Electron is a framework that uses web technologies (HTML, CSS, and JS) to build cross-platform desktop applications.

- [Cordova Electron](#cordova-electron)
  - [System Requirements](#system-requirements)
    - [Linux](#linux)
    - [Mac](#mac)
    - [Windows](#windows)
  - [Quick Start](#quick-start)
    - [Create a Project](#create-a-project)
    - [Preview a Project](#preview-a-project)
    - [Build a Project](#build-a-project)
  - [Customizing the Application's Icon](#customizing-the-applications-icon)
  - [Customizing the Application's Window Options](#customizing-the-applications-window-options)
    - [How to Set the Window's Default Size](#how-to-set-the-windows-default-size)
    - [How to Disable the Window From Being Resizable](#how-to-disable-the-window-from-being-resizable)
    - [How to Make the Window Fullscreen](#how-to-make-the-window-fullscreen)
    - [How to Support Node.js and Electron APIs](#how-to-support-nodejs-and-electron-apis)
  - [Customizing the Electron's Main Process](#customizing-the-electrons-main-process)
  - [Bundling Node Modules](#bundling-node-modules)
    - [Cordova Package Handling](#cordova-package-handling)
  - [DevTools](#devtools)
  - [Build Configurations](#build-configurations)
    - [Default Build Configurations](#default-build-configurations)
    - [Customizing Build Configurations](#customizing-build-configurations)
      - [Adding a `package`](#adding-a-package)
      - [Setting the Package `arch`](#setting-the-package-arch)
    - [Multi-Platform Build Support](#multi-platform-build-support)
  - [Signing Configurations](#signing-configurations)
    - [macOS Signing](#macos-signing)
    - [Windows Signing](#windows-signing)
    - [Linux Signing](#linux-signing)
  - [Plugins](#plugins)

## System Requirements

### Linux

- **Python** version 2.7.x. It is recommended to check your Python version since some distributions like CentOS 6.x still use Python 2.6.x.

### Mac

- **Python** version 2.7.x with support for TLS 1.2.
- **Xcode**, the IDE for macOS, comes bundled with necessary software development tools to code signing and compiling native code for macOS. Version 8.2.1 or higher.
- **RedHat Build Support**
  - **Homebrew**, one of the available macOS package managers, is used for installing additional tools and dependencies. Homebrew is needed to install RPM packaging dependencies. [**Brew Install Step**](https://brew.sh/)
  - **RPM**, a standard package manager for multiple Linux distributions, is the tool used for creating the Linux RPM package. To install this tool, use the following [**Homebrew**](https://brew.sh/) command:

    ```bash
    brew install rpm
    ```

### Windows

- **Python** version 2.7.10 or higher.
- **PowerShell**, for Windows 7 users, must be at version 3.0 or greater for [app signing](https://www.electron.build/code-signing#windows).
- **[Debugging Tools for Windows](https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/)** is a toolkit for enhancing debug capabilities. It is recommended to install with the **Windows SDK 10.0.15063.468**.

## Quick Start

### Create a Project

```bash
npm i -g cordova
cordova create sampleApp
cd sampleApp
cordova platform add electron
```

_Notice: If using Cordova CLI prior to version 9.x, you will need to use the `cordova-electron` argument instead of `electron` for any command that requires the platform's name. For example:_

```bash
cordova platform add cordova-electron
cordova run cordova-electron
```

### Preview a Project

It is not necessary to build the Electron application for previewing. Since the building process can be slow, it is recommended to pass in the `--nobuild` flag to disable the build process when previewing.

```bash
cordova run electron --nobuild
```

### Build a Project

**Debug Builds**

```bash
cordova build electron
cordova build electron --debug
```

**Release Builds**

```bash
cordova build electron --release
```

## Customizing the Application's Icon

Customized icon(s) can be declared with the `<icon>` element(s) in the `config.xml` file. There are two types of icons that can be defined, the application icon and the package installer icon. These icons should be defined in the Electron's platform node `<platform name="electron">`.

One icon can be used for the application and installer, but this icon should be at least **512x512** pixels to work across all operating systems.

_Notice: If a customized icon is not provided, the Apache Cordova default icons are used._

_Notice: macOS does not display custom icons when using `cordova run`. It defaults to the Electron's icon._

```xml
<platform name="electron">
    <icon src="res/electron/icon.png" />
</platform>
```

You can supply unique icons for the application and installer by setting the `target` attribute. As mentioned above, the installer image should be **512x512** pixels to work across all platforms.

```xml
<platform name="electron">
    <icon src="res/electron/app.png" target="app" />
    <icon src="res/electron/installer.png" target="installer" />
</platform>
```

For devices that support high-DPI resolutions, such as Apple's Retina display, you can create a set of images with the same base filename but suffix with its multiplier.

For example, if the base image's filename `icon.png` and is the standard resolution, then `icon@2x.png` will be treated as a high-resolution image that with a DPI doubled from the base.

- icon.png (256px x 256px)
- icon@2x.png (512px x 512px)

If you want to support displays with different DPI densities at the same time, you can put images with different sizes in the same folder and use the filename without DPI suffixes. For example:

```xml
<platform name="electron">
    <icon src="res/electron/icon.png" />
    <icon src="res/electron/icon@1.5x.png" />
    <icon src="res/electron/icon@2x.png" />
    <icon src="res/electron/icon@4x.png" target="installer" />
</platform>
```

## Customizing the Application's Window Options

Electron provides many options to manipulate the [`BrowserWindow`](https://electronjs.org/docs/api/browser-window). This section will cover how to configure a few basic options. For a full list of options, please see the [Electron's Docs - BrowserWindow Options](https://electronjs.org/docs/api/browser-window#new-browserwindowoptions).

Working with a Cordova project, it is recommended to create an Electron settings file within the project's root directory, and set its the relative path in the preference option `ElectronSettingsFilePath`, in the `config.xml` file.

**Example `config.xml`:**

```xml
<platform name="electron">
    <preference name="ElectronSettingsFilePath" value="res/electron/settings.json" />
</platform>
```

To override or set any BrowserWindow options, in this file the options are added to the  `browserWindow` property.

**Example `res/electron/settings.json`:**

```json
{
    "browserWindow": { ... }
}
```

### How to Set the Window's Default Size

By default, the `width` is set to **800** and the `height` set to **600**. This can be overridden by setting the `width` and `height` property.

**Example:**

```json
{
    "browserWindow": {
        "width": 1024,
        "height": 768
    }
}
```

### How to Disable the Window From Being Resizable

Setting the `resizable` flag property, you can disable the user's ability to resize your application's window.

**Example:**

```json
{
    "browserWindow": {
        "resizable": false
    }
}
```

### How to Make the Window Fullscreen

Using the `fullscreen` flag property, you can force the application to launch in fullscreen.

**Example:**

```json
{
    "browserWindow": {
        "fullscreen": true
    }
}
```

### How to Support Node.js and Electron APIs

Set the `nodeIntegration` flag property to `true`.  By default, this property flag is set to `false` to support popular libraries that insert symbols with the same names that Node.js and Electron already uses.

> You can read more about this at Electron docs: [I can not use jQuery/RequireJS/Meteor/AngularJS in Electron](https://electronjs.org/docs/faq#i-can-not-use-jqueryrequirejsmeteorangularjs-in-electron).

 **Example:**

```json
{
    "browserWindow": {
        "webPreferences": {
            "nodeIntegration": false
        }
    }
}
```

## Customizing the Electron's Main Process

If it is necessary to customize the Electron's main process beyond the scope of the Electron's configuration settings, chances can be added directly to the `cdv-electron-main.js` file located in `{PROJECT_ROOT_DIR}/platform/electron/platform_www/`. This is the application's main process.

> &#10071; However, it is not recommended to modify this file as the upgrade process for `cordova-electron` is to remove the old platform before adding the new version.

## Bundling Node Modules

Supporting node modules with your application is possible by bundling them with your app. Installing modules, with npm, as a dependency of the Cordova project will automatically bundle them with your app.

Below, is example instructions on how to bundle and enable the use of `lodash`.

1. Create a project using the steps from "[Create a Project](#create-a-project)".
2. Install `lodash`

   ```bash
   npm i -S loash
   ```

3. Enable Node.js support by following the "[How to Support Node.js and Electron APIs](#how-to-support-nodejs-and-electron-apis)"
4. Import `lodash` in your application using `require`

    ```javascript
    const _ = require('lodash');
    ```

### Cordova Package Handling

By default, all Cordova packages are currently installed as `dependencies` of the project.

It is recommended that all Cordova packages are defined as `devDependencies` in the `package.json` file. It is safe to move them manually.
Packages defined as a dependency will be bundled with the application and can increase the built application's size.

## DevTools

The `--release` and `--debug` flags control the visibility of the DevTools. DevTools are shown by default on **Debug Builds** (`without a flag` or with `--debug`). If you want to hide the DevTools pass in the `--release` flag when building or running the application.

> Note: DevTools can be closed or opened manually with the debug build.

## Build Configurations

### Default Build Configurations

By default, with no additional configuration, `cordova build electron` will build default packages for the host operating system (OS) that triggers the command. Below, are the list of default packages for each OS.

**Linux**

| Package | Arch  |
| ------- | :---: |
| tar.gz  |  x64  |

**Mac**

| Package | Arch  |
| ------- | :---: |
| dmg     |  x64  |
| zip     |  x64  |

**Windows**

| Package | Arch  |
| ------- | :---: |
| nsis    |  x64  |

### Customizing Build Configurations

If for any reason you would like to customize the build configurations, modifications are placed within the `build.json` file located in the project's root directory. E.g. `{PROJECT_ROOT_DIR}/build.json`. This file contains all build configurations for all platforms (Android, Electron, iOS, Windows).

**Example Config Structure**

```json
{
    "electron": {}
}
```

Since the Electron framework is for creating cross-platform applications, multiple configurations are required for each OS build. The `electron` node, in the `build.json` file, contains three properties that separate the build configurations for each OS.

**Example Config Structure with Each Platform**

```json
{
    "electron": {
        "linux": {},
        "mac": {},
        "windows": {}
    }
}
```

Each OS node contains properties that are used to identify what package to generate and how to sign.

**OS Properties:**

- `package` is an array of package formats that will be generated.
- `arch` is an array of architectures that each package is built for.
- `signing` is an object that contains signing information. See [Signing Configurations](#signing-configurations) for more information.

Any properties that are undefined will fallback to default values.

#### Adding a `package`

The `package` property is an array list of packages to be outputted. If the property is defined, the default packages are not used unless added. The order of the packages has no importance.

The configuration example below will generate `tar.gz`, `dmg` and `zip` packages for macOS.

```json
{
    "electron": {
        "mac": {
            "package": [
                "dmg",
                "tar.gz",
                "zip"
            ]
        }
    }
}
```

**Available Packages by Operating System**

| Package Type |  Linux  |      macOS       |          Windows           |
| ------------ | :-----: | :--------------: | :------------------------: |
| default      |    -    | `dmg`<br />`zip` |             -              |
| dmg          |    -    |     &#9989;      |             -              |
| mas          |    -    |     &#9989;      |             -              |
| mas-dev      | &#9989; |        -         |             -              |
| pkg          |    -    |     &#9989;      |             -              |
| 7z           | &#9989; |     &#9989;      |          &#9989;           |
| zip          | &#9989; |     &#9989;      |          &#9989;           |
| tar.xz       | &#9989; |     &#9989;      |          &#9989;           |
| tar.lz       | &#9989; |     &#9989;      |          &#9989;           |
| tar.gz       | &#9989; |     &#9989;      |          &#9989;           |
| tar.bz2      | &#9989; |     &#9989;      |          &#9989;           |
| dir          | &#9989; |     &#9989;      |          &#9989;           |
| nsis         |    -    |        -         |          &#9989;           |
| nsis-web     |    -    |        -         |          &#9989;           |
| portable     |    -    |        -         |          &#9989;           |
| appx         |    -    |        -         | &#9989; <sup>**[1]**</sup> |
| msi          |    -    |        -         |          &#9989;           |
| AppImage     | &#9989; |        -         |             -              |
| snap         | &#9989; |        -         |             -              |
| deb          | &#9989; |        -         |             -              |
| rpm          | &#9989; |        -         |             -              |
| freebsd      | &#9989; |        -         |             -              |
| pacman       | &#9989; |        -         |             -              |
| p5p          | &#9989; |        -         |             -              |
| apk          | &#9989; |        -         |             -              |

- **[1]** Only Window 10 can build AppX packages.

#### Setting the Package `arch`

The `arch` property is an array list of architectures that each package is built for. When the property is defined, the default arch is not used unless added.

> &#10071;  Not all architectures are available for every operating system. Please review the [Electron Releases](https://github.com/electron/electron/releases/) to identify valid combinations. For example, macOS (Darwin) only supports x64.

**Available Arch**

- ia32
- x64
- armv71
- arm64

The example above will generate an `x64` `dmg` package.

```json
{
    "electron": {
        "mac": {
            "package": [ "dmg" ],
            "arch": [ "x64" ]
        }
    }
}
```

### Multi-Platform Build Support

> &#10071; Not all platforms support this feature and may have limitations.

Building for multiple platforms on a single operating system may possible but has limitations. It is recommended that the builder's operating system (host OS) matches with the platform that is being built.

The matrix below shows each host OS and for which platforms they are capable of building applications.

| Host <sup>**[1]**</sup> |  Linux  |   Mac   |           Window            |
| ----------------------- | :-----: | :-----: | :-------------------------: |
| Linux                   | &#9989; |         | &#10071; <sup>**[2]**</sup> |
| Mac <sup>**[3]**</sup>  | &#9989; | &#9989; | &#10071; <sup>**[2]**</sup> |
| Window                  |         |         |           &#9989;           |

**Limitations:**

- **[1]** If the app contains native dependency, it can only be compiled on the targeted platform.
- **[2]** Linux and macOS are unable to build Windows Appx packages for Windows Store.
- **[3]** [All required system dependencies, except rpm, will be downloaded automatically on demand. RPM can be installed with brew. (macOS Sierra 10.12+)](https://www.electron.build/multi-platform-build#macos)

The example below enables multi-platform build for all OS and uses the default build configurations.

```json
{
    "electron": {
        "linux": {},
        "mac": {},
        "windows": {}
    }
}
```

## Signing Configurations

### macOS Signing

There are three types of signing targets. (`debug`, `release`, and `store`). Each section has the following properties:

| key                                                                                                                                                 | description                                                                                                                      |
| --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| entitlements                                                                                                                                        | String path value to entitlements file.                                                                                          |
| entitlementsInherit                                                                                                                                 | String path value to the entitlements file which inherits the security settings.                                                 |
| identity                                                                                                                                            | String value of the name of the certificate.                                                                                     |
| [requirements](https://developer.apple.com/library/archive/documentation/Security/Conceptual/CodeSigningGuide/RequirementLang/RequirementLang.html) | String path value of requirements file. <br /><br />&#10071; This is not available for the `mas` (store) signing configurations. |
| provisioningProfile                                                                                                                                 | String path value of the provisioning profile.                                                                                   |

**Example Config:**

```json
{
    "electron": {
        "mac": {
            "package": [
                "dmg",
                "mas",
                "mas-dev"
            ],
            "signing": {
                "release": {
                    "identity": "APACHE CORDOVA (TEAMID)",
                    "provisioningProfile": "release.mobileprovision"
                }
            }
        }
    }
}
```

For macOS signing, there are a few exceptions to how the signing information is used.
By default, all packages with the exception of `mas` and `mas-dev`, use the `debug` and `release` signing configurations.

Using the example config above, let's go over some use cases to better understand the exceptions.

**Use Case 1:**

```bash
cordova build electron --debug
```

The command above will:

- Generate a `dmg` build and `mas-dev` build using the `debug` signing configurations.
- Ignore the `mas` target package.

*Use Case 2:*

```bash
cordova build electron --release
```

The command above will:

- Generate a `dmg` build using the `release` config.
- Generate a `mas` build using the `store` config.
- Ignore the `mas-dev` target package.

### Windows Signing

The signing information is comprised of two types. (`debug`, `release`). Each section has the following properties:

| key                       | description                                                                                                                                          |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| certificateFile           | String path to the certificate file.                                                                                                                 |
| certificatePassword       | String value of the certificate file's password.<br /><br />**Alternative**: The password can be set on the environment variable `CSC_KEY_PASSWORD`. |
| certificateSubjectName    | String value of the signing certificate's subject.<br /><br />&#10071; Required for EV Code Signing and requires Windows                             |
| certificateSha1           | String value of the SHA1 hash of the signing certificate.<br /><br />&#10071; Requires Windows                                                       |
| signingHashAlgorithms     | Collection of singing algorithms to be used. (`sha1`, `sha256`)<br /><br />&#10071; AppX builds only support `sha256`                                |
| additionalCertificateFile | String path to the additional certificate files.                                                                                                     |

**Example Config:**

```json
{
    "electron": {
        "windows": {
            "package": [ "nsis" ],
            "signing": {
                "release": {
                    "certificateFile": "path_to_files",
                    "certificatePassword": "password"
                }
            }
        }
    }
}
```

### Linux Signing

There are not signing requirements for Linux builds.

## Plugins

All browser-based plugins are usable with the Electron platform.

When adding a plugin, if the plugin supports both the `electron` and `browser` platform, the `electron` portion will be used. If the plugin misses `electron` but contains the `browser` implementation, it will fall back on the `browser` implementation.

Internally, Electron is using Chromium (Chrome) as its web view. Some plugins may have conditions written specifically for each different browser. In this case, it may affect the behavior of what is intended. Since Electron may support feature that the browser does not, these plugins would possibly need to be updated for the `electron` platform.

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

 ADDITIONAL LICENSES:

================================================================================
node_modules/adm-zip
================================================================================

Copyright (c) 2012 Another-D-Mention Software and other contributors,
http://www.another-d-mention.ro/

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

================================================================================
node_modules/shelljs
================================================================================

Copyright (c) 2012, Artur Adib <aadib@mozilla.com>
All rights reserved.

You may use this project under the terms of the New BSD license as follows:

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
    * Neither the name of Artur Adib nor the
      names of the contributors may be used to endorse or promote products
      derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

================================================================================
node_modules/nopt
================================================================================

Copyright 2009, 2010, 2011 Isaac Z. Schlueter.
All rights reserved.

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

================================================================================
node_modules/nopt/node_modules/abbrev
================================================================================

Copyright 2009, 2010, 2011 Isaac Z. Schlueter.
All rights reserved.

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
Apache Cordova
Copyright 2012-2018 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
-->

## Release Notes for Cordova Electron

### 1.1.1 (Aug 20, 2019)

* [GH-94](https://github.com/apache/cordova-electron/pull/94) chore: rebuilt `package-lock.json` for audit fix
* [GH-79](https://github.com/apache/cordova-electron/pull/79) fix: filter icons only matching requirements
* [GH-89](https://github.com/apache/cordova-electron/pull/89) fix: prepare missing dependencies failure
* [GH-86](https://github.com/apache/cordova-electron/pull/86) refactor: improve create test spec speed
* [GH-85](https://github.com/apache/cordova-electron/pull/85) fix: use `spyOn` for process global var

### 1.1.0 (Jun 28, 2019)

* [GH-77](https://github.com/apache/cordova-electron/pull/77) fix: display correct package version in CLI
* [GH-76](https://github.com/apache/cordova-electron/pull/76) Append Overridable/Top-Level per Platform Options
* [GH-75](https://github.com/apache/cordova-electron/pull/75) fix: Typo in Build: `Singning` -> `Signing`
* [GH-71](https://github.com/apache/cordova-electron/pull/71) Update `devDependencies`
* [GH-66](https://github.com/apache/cordova-electron/pull/66) Bump dependency `fs-extra@^8.0.1`
* [GH-70](https://github.com/apache/cordova-electron/pull/70) Bump `cordova-common@^3.2.0`
* [GH-65](https://github.com/apache/cordova-electron/pull/65) Fixed `package.json` version to `1.1.0-dev`
* [GH-62](https://github.com/apache/cordova-electron/pull/62) Fix Bundle Feature's Project Path Issue & Warning Output
* [GH-58](https://github.com/apache/cordova-electron/pull/58) Set Author Name and Email to `package.json`
* [GH-54](https://github.com/apache/cordova-electron/pull/54) Added Bundle Node Module Support
* [GH-57](https://github.com/apache/cordova-electron/pull/57) Remove Maintainer Option from Linux Build JSON
* [GH-59](https://github.com/apache/cordova-electron/pull/59) Allow Users to Set Linux App Category
* [GH-51](https://github.com/apache/cordova-electron/pull/51) Append package top-level key options
* [GH-48](https://github.com/apache/cordova-electron/pull/48) Implement Splash Screen handling
* [GH-61](https://github.com/apache/cordova-electron/pull/61) Updated `DOCUMENTATION.md`
* [GH-53](https://github.com/apache/cordova-electron/pull/53) Add Node.js 12 to CI Services
* [GH-42](https://github.com/apache/cordova-electron/pull/42) Update the `config.xml` path in the XHR load eventListener
* [GH-45](https://github.com/apache/cordova-electron/pull/45) Append Installer Icon to User Build Settings for Custom Builds
* [GH-43](https://github.com/apache/cordova-electron/pull/43) Update `README`.md
* [GH-41](https://github.com/apache/cordova-electron/pull/41) Update System Requirements in `DOCUMENTATION.md`

### 1.0.2 (Mar 15, 2019)

* [GH-40](https://github.com/apache/cordova-electron/pull/40) Remove `temp` Dir After `create.spec.js` Test
* [GH-39](https://github.com/apache/cordova-electron/pull/39) Added Missing License Header in `util.js`
* [GH-38](https://github.com/apache/cordova-electron/pull/38) Support User Defined **Electron** Settings
* [GH-37](https://github.com/apache/cordova-electron/pull/37) Remove `nodeIntegration` Warning by Setting Default to `false`
* [GH-36](https://github.com/apache/cordova-electron/pull/36) Rename **Electron** Main Entry File
* [GH-35](https://github.com/apache/cordova-electron/pull/35) Refactor `build.js` and Include Test Coverage
* [GH-32](https://github.com/apache/cordova-electron/pull/32) Improve `temp` Folder Cleanup in `Api.spec.js`
* [GH-33](https://github.com/apache/cordova-electron/pull/33) Update `cordova run` to Work with Pre-Cordova 9.x CLI

### 1.0.1 (Mar 04, 2019)

Version bump with no change.

### 1.0.0 (Feb 25, 2019)

* [GH-30](https://github.com/apache/cordova-electron/pull/30) Asset Install Fix from Mobilespec Report
* [GH-29](https://github.com/apache/cordova-electron/pull/29) Correct File Header Licenses for Cordova JS Compile CMD
* [GH-28](https://github.com/apache/cordova-electron/pull/28) Fix Scope Issue with Code Refactor
* [GH-27](https://github.com/apache/cordova-electron/pull/27) Build Script Improvements
* [GH-24](https://github.com/apache/cordova-electron/pull/24) Remove Unused and Unreachable Code
* [GH-21](https://github.com/apache/cordova-electron/pull/21) Apply Missing Apache License Header
* [GH-25](https://github.com/apache/cordova-electron/pull/25) Updated `Api.spec.js` Async Tests to Return Promise
* [GH-22](https://github.com/apache/cordova-electron/pull/22) Add tests to `Api.spec.js`
* [GH-23](https://github.com/apache/cordova-electron/pull/23) Test `module.exports.prepare`
* [GH-19](https://github.com/apache/cordova-electron/pull/19) Adding New Test Specs
* [GH-20](https://github.com/apache/cordova-electron/pull/20) Fix Audit Report For High Severity Vulnerability
* [GH-18](https://github.com/apache/cordova-electron/pull/18) Refactor `prepare.js` and Increase Test Coverage
* [GH-17](https://github.com/apache/cordova-electron/pull/17) Unit Test Improvements & Refactor (Create, Api, Handler, Parser)
* [GH-16](https://github.com/apache/cordova-electron/pull/16) Prepare & Enable Travis CI Testing
* [GH-15](https://github.com/apache/cordova-electron/pull/15) Implement SettingsJson Class Tests and Update Documentation
* [GH-13](https://github.com/apache/cordova-electron/pull/13) Implement Electron Custom App Icons Functionality
* [GH-10](https://github.com/apache/cordova-electron/pull/10) Added NPM Ignore
* [GH-11](https://github.com/apache/cordova-electron/pull/11) Updated `README.md`
* [GH-9](https://github.com/apache/cordova-electron/pull/9) Electron Build Improvements
* [GH-8](https://github.com/apache/cordova-electron/pull/8) Create CDV Electron Settings JSON
* [GH-7](https://github.com/apache/cordova-electron/pull/7) Electron Platform Release Preparation (Cordova 9)
* [GH-6](https://github.com/apache/cordova-electron/pull/6) Cleanup Bin Files
* [GH-5](https://github.com/apache/cordova-electron/pull/5) Updated Correct Version Information
* [GH-4](https://github.com/apache/cordova-electron/pull/4) Electron Major Improvements & Feature Support
* [GH-1](https://github.com/apache/cordova-electron/pull/1) First Draft Release
* Add GitHub Pull Request Template
* Added NPM Install Step
* Added Run Command Support
1.1.1
{
  "author": {
    "name": "Apache Software Foundation"
  },
  "bin": {
    "cordova-electron": "bin/create"
  },
  "dependencies": {
    "cordova-common": "^3.2.0",
    "electron": "^4.0.1",
    "electron-builder": "^20.38.4",
    "fs-extra": "^8.0.1",
    "nopt": "^4.0.1",
    "shelljs": "^0.5.3"
  },
  "deprecated": false,
  "description": "electron apps as a target for cordova developers",
  "devDependencies": {
    "eslint": "^5.16.0",
    "eslint-config-semistandard": "^13.0.0",
    "eslint-config-standard": "^12.0.0",
    "eslint-plugin-import": "^2.17.3",
    "eslint-plugin-node": "^8.0.1",
    "eslint-plugin-promise": "^4.1.1",
    "eslint-plugin-standard": "^4.0.0",
    "jasmine": "^3.4.0",
    "nyc": "^14.1.1",
    "rewire": "^4.0.1",
    "tmp": "^0.0.33"
  },
  "engines": {
    "node": ">=6.0.0"
  },
  "homepage": "https://github.com/apache/cordova-electron#readme",
  "kewords": [
    "cordova",
    "electron",
    "apache"
  ],
  "license": "Apache-2.0",
  "main": "bin/templates/cordova/Api.js",
  "name": "cordova-electron",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/apache/cordova-electron.git"
  },
  "version": "1.1.1"
}// Platform: electron
// 74fdba8b327b2a13b4366dd141b52def96d4cb56
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
*/
;(function() {
var PLATFORM_VERSION_BUILD_LABEL = '1.1.1';
// file: src/scripts/require.js
var require;
var define;

(function () {
    var modules = {};
    // Stack of moduleIds currently being built.
    var requireStack = [];
    // Map of module ID -> index into requireStack of modules currently being built.
    var inProgressModules = {};
    var SEPARATOR = '.';

    function build (module) {
        var factory = module.factory;
        var localRequire = function (id) {
            var resultantId = id;
            // Its a relative path, so lop off the last portion and add the id (minus "./")
            if (id.charAt(0) === '.') {
                resultantId = module.id.slice(0, module.id.lastIndexOf(SEPARATOR)) + SEPARATOR + id.slice(2);
            }
            return require(resultantId);
        };
        module.exports = {};
        delete module.factory;
        factory(localRequire, module.exports, module);
        return module.exports;
    }

    require = function (id) {
        if (!modules[id]) {
            throw 'module ' + id + ' not found';
        } else if (id in inProgressModules) {
            var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id;
            throw 'Cycle in require graph: ' + cycle;
        }
        if (modules[id].factory) {
            try {
                inProgressModules[id] = requireStack.length;
                requireStack.push(id);
                return build(modules[id]);
            } finally {
                delete inProgressModules[id];
                requireStack.pop();
            }
        }
        return modules[id].exports;
    };

    define = function (id, factory) {
        if (Object.prototype.hasOwnProperty.call(modules, id)) {
            throw 'module ' + id + ' already defined';
        }

        modules[id] = {
            id: id,
            factory: factory
        };
    };

    define.remove = function (id) {
        delete modules[id];
    };

    define.moduleMap = modules;
})();

// Export for use in node
if (typeof module === 'object' && typeof require === 'function') {
    module.exports.require = require;
    module.exports.define = define;
}

// file: src/cordova.js
define("cordova", function(require, exports, module) {

// Workaround for Windows 10 in hosted environment case
// http://www.w3.org/html/wg/drafts/html/master/browsers.html#named-access-on-the-window-object
if (window.cordova && !(window.cordova instanceof HTMLElement)) { // eslint-disable-line no-undef
    throw new Error('cordova already defined');
}

var channel = require('cordova/channel');
var platform = require('cordova/platform');

/**
 * Intercept calls to addEventListener + removeEventListener and handle deviceready,
 * resume, and pause events.
 */
var m_document_addEventListener = document.addEventListener;
var m_document_removeEventListener = document.removeEventListener;
var m_window_addEventListener = window.addEventListener;
var m_window_removeEventListener = window.removeEventListener;

/**
 * Houses custom event handlers to intercept on document + window event listeners.
 */
var documentEventHandlers = {};
var windowEventHandlers = {};

document.addEventListener = function (evt, handler, capture) {
    var e = evt.toLowerCase();
    if (typeof documentEventHandlers[e] !== 'undefined') {
        documentEventHandlers[e].subscribe(handler);
    } else {
        m_document_addEventListener.call(document, evt, handler, capture);
    }
};

window.addEventListener = function (evt, handler, capture) {
    var e = evt.toLowerCase();
    if (typeof windowEventHandlers[e] !== 'undefined') {
        windowEventHandlers[e].subscribe(handler);
    } else {
        m_window_addEventListener.call(window, evt, handler, capture);
    }
};

document.removeEventListener = function (evt, handler, capture) {
    var e = evt.toLowerCase();
    // If unsubscribing from an event that is handled by a plugin
    if (typeof documentEventHandlers[e] !== 'undefined') {
        documentEventHandlers[e].unsubscribe(handler);
    } else {
        m_document_removeEventListener.call(document, evt, handler, capture);
    }
};

window.removeEventListener = function (evt, handler, capture) {
    var e = evt.toLowerCase();
    // If unsubscribing from an event that is handled by a plugin
    if (typeof windowEventHandlers[e] !== 'undefined') {
        windowEventHandlers[e].unsubscribe(handler);
    } else {
        m_window_removeEventListener.call(window, evt, handler, capture);
    }
};

function createEvent (type, data) {
    var event = document.createEvent('Events');
    event.initEvent(type, false, false);
    if (data) {
        for (var i in data) {
            if (data.hasOwnProperty(i)) {
                event[i] = data[i];
            }
        }
    }
    return event;
}

/* eslint-disable no-undef */
var cordova = {
    define: define,
    require: require,
    version: PLATFORM_VERSION_BUILD_LABEL,
    platformVersion: PLATFORM_VERSION_BUILD_LABEL,
    platformId: platform.id,

    /* eslint-enable no-undef */

    /**
     * Methods to add/remove your own addEventListener hijacking on document + window.
     */
    addWindowEventHandler: function (event) {
        return (windowEventHandlers[event] = channel.create(event));
    },
    addStickyDocumentEventHandler: function (event) {
        return (documentEventHandlers[event] = channel.createSticky(event));
    },
    addDocumentEventHandler: function (event) {
        return (documentEventHandlers[event] = channel.create(event));
    },
    removeWindowEventHandler: function (event) {
        delete windowEventHandlers[event];
    },
    removeDocumentEventHandler: function (event) {
        delete documentEventHandlers[event];
    },
    /**
     * Retrieve original event handlers that were replaced by Cordova
     *
     * @return object
     */
    getOriginalHandlers: function () {
        return { 'document': { 'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener },
            'window': { 'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener } };
    },
    /**
     * Method to fire event from native code
     * bNoDetach is required for events which cause an exception which needs to be caught in native code
     */
    fireDocumentEvent: function (type, data, bNoDetach) {
        var evt = createEvent(type, data);
        if (typeof documentEventHandlers[type] !== 'undefined') {
            if (bNoDetach) {
                documentEventHandlers[type].fire(evt);
            } else {
                setTimeout(function () {
                    // Fire deviceready on listeners that were registered before cordova.js was loaded.
                    if (type === 'deviceready') {
                        document.dispatchEvent(evt);
                    }
                    documentEventHandlers[type].fire(evt);
                }, 0);
            }
        } else {
            document.dispatchEvent(evt);
        }
    },
    fireWindowEvent: function (type, data) {
        var evt = createEvent(type, data);
        if (typeof windowEventHandlers[type] !== 'undefined') {
            setTimeout(function () {
                windowEventHandlers[type].fire(evt);
            }, 0);
        } else {
            window.dispatchEvent(evt);
        }
    },

    /**
     * Plugin callback mechanism.
     */
    // Randomize the starting callbackId to avoid collisions after refreshing or navigating.
    // This way, it's very unlikely that any new callback would get the same callbackId as an old callback.
    callbackId: Math.floor(Math.random() * 2000000000),
    callbacks: {},
    callbackStatus: {
        NO_RESULT: 0,
        OK: 1,
        CLASS_NOT_FOUND_EXCEPTION: 2,
        ILLEGAL_ACCESS_EXCEPTION: 3,
        INSTANTIATION_EXCEPTION: 4,
        MALFORMED_URL_EXCEPTION: 5,
        IO_EXCEPTION: 6,
        INVALID_ACTION: 7,
        JSON_EXCEPTION: 8,
        ERROR: 9
    },

    /**
     * Called by native code when returning successful result from an action.
     */
    callbackSuccess: function (callbackId, args) {
        cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback);
    },

    /**
     * Called by native code when returning error result from an action.
     */
    callbackError: function (callbackId, args) {
        // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative.
        // Derive success from status.
        cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback);
    },

    /**
     * Called by native code when returning the result from an action.
     */
    callbackFromNative: function (callbackId, isSuccess, status, args, keepCallback) {
        try {
            var callback = cordova.callbacks[callbackId];
            if (callback) {
                if (isSuccess && status === cordova.callbackStatus.OK) {
                    callback.success && callback.success.apply(null, args);
                } else if (!isSuccess) {
                    callback.fail && callback.fail.apply(null, args);
                }
                /*
                else
                    Note, this case is intentionally not caught.
                    this can happen if isSuccess is true, but callbackStatus is NO_RESULT
                    which is used to remove a callback from the list without calling the callbacks
                    typically keepCallback is false in this case
                */
                // Clear callback if not expecting any more results
                if (!keepCallback) {
                    delete cordova.callbacks[callbackId];
                }
            }
        } catch (err) {
            var msg = 'Error in ' + (isSuccess ? 'Success' : 'Error') + ' callbackId: ' + callbackId + ' : ' + err;
            console && console.log && console.log(msg);
            console && console.log && err.stack && console.log(err.stack);
            cordova.fireWindowEvent('cordovacallbackerror', { 'message': msg });
            throw err;
        }
    },
    addConstructor: function (func) {
        channel.onCordovaReady.subscribe(function () {
            try {
                func();
            } catch (e) {
                console.log('Failed to run constructor: ' + e);
            }
        });
    }
};

module.exports = cordova;

});

// file: src/common/argscheck.js
define("cordova/argscheck", function(require, exports, module) {

var utils = require('cordova/utils');

var moduleExports = module.exports;

var typeMap = {
    'A': 'Array',
    'D': 'Date',
    'N': 'Number',
    'S': 'String',
    'F': 'Function',
    'O': 'Object'
};

function extractParamName (callee, argIndex) {
    return (/\(\s*([^)]*?)\s*\)/).exec(callee)[1].split(/\s*,\s*/)[argIndex];
}

/**
 * Checks the given arguments' types and throws if they are not as expected.
 *
 * `spec` is a string where each character stands for the required type of the
 * argument at the same position. In other words: the character at `spec[i]`
 * specifies the required type for `args[i]`. The characters in `spec` are the
 * first letter of the required type's name. The supported types are:
 *
 *     Array, Date, Number, String, Function, Object
 *
 * Lowercase characters specify arguments that must not be `null` or `undefined`
 * while uppercase characters allow those values to be passed.
 *
 * Finally, `*` can be used to allow any type at the corresponding position.
 *
 * @example
 * function foo (arr, opts) {
 *     // require `arr` to be an Array and `opts` an Object, null or undefined
 *     checkArgs('aO', 'my.package.foo', arguments);
 *     // ...
 * }
 * @param {String} spec - the type specification for `args` as described above
 * @param {String} functionName - full name of the callee.
 * Used in the error message
 * @param {Array|arguments} args - the arguments to be checked against `spec`
 * @param {Function} [opt_callee=args.callee] - the recipient of `args`.
 * Used to extract parameter names for the error message
 * @throws {TypeError} if args do not satisfy spec
 */
function checkArgs (spec, functionName, args, opt_callee) {
    if (!moduleExports.enableChecks) {
        return;
    }
    var errMsg = null;
    var typeName;
    for (var i = 0; i < spec.length; ++i) {
        var c = spec.charAt(i);
        var cUpper = c.toUpperCase();
        var arg = args[i];
        // Asterix means allow anything.
        if (c === '*') {
            continue;
        }
        typeName = utils.typeName(arg);
        if ((arg === null || arg === undefined) && c === cUpper) {
            continue;
        }
        if (typeName !== typeMap[cUpper]) {
            errMsg = 'Expected ' + typeMap[cUpper];
            break;
        }
    }
    if (errMsg) {
        errMsg += ', but got ' + typeName + '.';
        errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg;
        // Don't log when running unit tests.
        if (typeof jasmine === 'undefined') {
            console.error(errMsg);
        }
        throw TypeError(errMsg);
    }
}

function getValue (value, defaultValue) {
    return value === undefined ? defaultValue : value;
}

moduleExports.checkArgs = checkArgs;
moduleExports.getValue = getValue;
moduleExports.enableChecks = true;

});

// file: src/common/base64.js
define("cordova/base64", function(require, exports, module) {

var base64 = exports;

base64.fromArrayBuffer = function (arrayBuffer) {
    var array = new Uint8Array(arrayBuffer);
    return uint8ToBase64(array);
};

base64.toArrayBuffer = function (str) {
    var decodedStr = typeof atob !== 'undefined' ? atob(str) : Buffer.from(str, 'base64').toString('binary'); // eslint-disable-line no-undef
    var arrayBuffer = new ArrayBuffer(decodedStr.length);
    var array = new Uint8Array(arrayBuffer);
    for (var i = 0, len = decodedStr.length; i < len; i++) {
        array[i] = decodedStr.charCodeAt(i);
    }
    return arrayBuffer;
};

// ------------------------------------------------------------------------------

/* This code is based on the performance tests at http://jsperf.com/b64tests
 * This 12-bit-at-a-time algorithm was the best performing version on all
 * platforms tested.
 */

var b64_6bit = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var b64_12bit;

var b64_12bitTable = function () {
    b64_12bit = [];
    for (var i = 0; i < 64; i++) {
        for (var j = 0; j < 64; j++) {
            b64_12bit[i * 64 + j] = b64_6bit[i] + b64_6bit[j];
        }
    }
    b64_12bitTable = function () { return b64_12bit; };
    return b64_12bit;
};

function uint8ToBase64 (rawData) {
    var numBytes = rawData.byteLength;
    var output = '';
    var segment;
    var table = b64_12bitTable();
    for (var i = 0; i < numBytes - 2; i += 3) {
        segment = (rawData[i] << 16) + (rawData[i + 1] << 8) + rawData[i + 2];
        output += table[segment >> 12];
        output += table[segment & 0xfff];
    }
    if (numBytes - i === 2) {
        segment = (rawData[i] << 16) + (rawData[i + 1] << 8);
        output += table[segment >> 12];
        output += b64_6bit[(segment & 0xfff) >> 6];
        output += '=';
    } else if (numBytes - i === 1) {
        segment = (rawData[i] << 16);
        output += table[segment >> 12];
        output += '==';
    }
    return output;
}

});

// file: src/common/builder.js
define("cordova/builder", function(require, exports, module) {

var utils = require('cordova/utils');

function each (objects, func, context) {
    for (var prop in objects) {
        if (objects.hasOwnProperty(prop)) {
            func.apply(context, [objects[prop], prop]);
        }
    }
}

function clobber (obj, key, value) {
    exports.replaceHookForTesting(obj, key);
    var needsProperty = false;
    try {
        obj[key] = value;
    } catch (e) {
        needsProperty = true;
    }
    // Getters can only be overridden by getters.
    if (needsProperty || obj[key] !== value) {
        utils.defineGetter(obj, key, function () {
            return value;
        });
    }
}

function assignOrWrapInDeprecateGetter (obj, key, value, message) {
    if (message) {
        utils.defineGetter(obj, key, function () {
            console.log(message);
            delete obj[key];
            clobber(obj, key, value);
            return value;
        });
    } else {
        clobber(obj, key, value);
    }
}

function include (parent, objects, clobber, merge) {
    each(objects, function (obj, key) {
        try {
            var result = obj.path ? require(obj.path) : {};

            if (clobber) {
                // Clobber if it doesn't exist.
                if (typeof parent[key] === 'undefined') {
                    assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
                } else if (typeof obj.path !== 'undefined') {
                    // If merging, merge properties onto parent, otherwise, clobber.
                    if (merge) {
                        recursiveMerge(parent[key], result);
                    } else {
                        assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
                    }
                }
                result = parent[key];
            } else {
                // Overwrite if not currently defined.
                if (typeof parent[key] === 'undefined') {
                    assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
                } else {
                    // Set result to what already exists, so we can build children into it if they exist.
                    result = parent[key];
                }
            }

            if (obj.children) {
                include(result, obj.children, clobber, merge);
            }
        } catch (e) {
            utils.alert('Exception building Cordova JS globals: ' + e + ' for key "' + key + '"');
        }
    });
}

/**
 * Merge properties from one object onto another recursively.  Properties from
 * the src object will overwrite existing target property.
 *
 * @param target Object to merge properties into.
 * @param src Object to merge properties from.
 */
function recursiveMerge (target, src) {
    for (var prop in src) {
        if (src.hasOwnProperty(prop)) {
            if (target.prototype && target.prototype.constructor === target) {
                // If the target object is a constructor override off prototype.
                clobber(target.prototype, prop, src[prop]);
            } else {
                if (typeof src[prop] === 'object' && typeof target[prop] === 'object') {
                    recursiveMerge(target[prop], src[prop]);
                } else {
                    clobber(target, prop, src[prop]);
                }
            }
        }
    }
}

exports.buildIntoButDoNotClobber = function (objects, target) {
    include(target, objects, false, false);
};
exports.buildIntoAndClobber = function (objects, target) {
    include(target, objects, true, false);
};
exports.buildIntoAndMerge = function (objects, target) {
    include(target, objects, true, true);
};
exports.recursiveMerge = recursiveMerge;
exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter;
exports.replaceHookForTesting = function () {};

});

// file: src/common/channel.js
define("cordova/channel", function(require, exports, module) {

var utils = require('cordova/utils');
var nextGuid = 1;

/**
 * Custom pub-sub "channel" that can have functions subscribed to it
 * This object is used to define and control firing of events for
 * cordova initialization, as well as for custom events thereafter.
 *
 * The order of events during page load and Cordova startup is as follows:
 *
 * onDOMContentLoaded*         Internal event that is received when the web page is loaded and parsed.
 * onNativeReady*              Internal event that indicates the Cordova native side is ready.
 * onCordovaReady*             Internal event fired when all Cordova JavaScript objects have been created.
 * onDeviceReady*              User event fired to indicate that Cordova is ready
 * onResume                    User event fired to indicate a start/resume lifecycle event
 * onPause                     User event fired to indicate a pause lifecycle event
 *
 * The events marked with an * are sticky. Once they have fired, they will stay in the fired state.
 * All listeners that subscribe after the event is fired will be executed right away.
 *
 * The only Cordova events that user code should register for are:
 *      deviceready           Cordova native code is initialized and Cordova APIs can be called from JavaScript
 *      pause                 App has moved to background
 *      resume                App has returned to foreground
 *
 * Listeners can be registered as:
 *      document.addEventListener("deviceready", myDeviceReadyListener, false);
 *      document.addEventListener("resume", myResumeListener, false);
 *      document.addEventListener("pause", myPauseListener, false);
 *
 * The DOM lifecycle events should be used for saving and restoring state
 *      window.onload
 *      window.onunload
 *
 */

/**
 * Channel
 * @constructor
 * @param type  String the channel name
 */
var Channel = function (type, sticky) {
    this.type = type;
    // Map of guid -> function.
    this.handlers = {};
    // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired.
    this.state = sticky ? 1 : 0;
    // Used in sticky mode to remember args passed to fire().
    this.fireArgs = null;
    // Used by onHasSubscribersChange to know if there are any listeners.
    this.numHandlers = 0;
    // Function that is called when the first listener is subscribed, or when
    // the last listener is unsubscribed.
    this.onHasSubscribersChange = null;
};
var channel = {
    /**
     * Calls the provided function only after all of the channels specified
     * have been fired. All channels must be sticky channels.
     */
    join: function (h, c) {
        var len = c.length;
        var i = len;
        var f = function () {
            if (!(--i)) h();
        };
        for (var j = 0; j < len; j++) {
            if (c[j].state === 0) {
                throw Error('Can only use join with sticky channels.');
            }
            c[j].subscribe(f);
        }
        if (!len) h();
    },
    /* eslint-disable no-return-assign */
    create: function (type) {
        return channel[type] = new Channel(type, false);
    },
    createSticky: function (type) {
        return channel[type] = new Channel(type, true);
    },
    /* eslint-enable no-return-assign */
    /**
     * cordova Channels that must fire before "deviceready" is fired.
     */
    deviceReadyChannelsArray: [],
    deviceReadyChannelsMap: {},

    /**
     * Indicate that a feature needs to be initialized before it is ready to be used.
     * This holds up Cordova's "deviceready" event until the feature has been initialized
     * and Cordova.initComplete(feature) is called.
     *
     * @param feature {String}     The unique feature name
     */
    waitForInitialization: function (feature) {
        if (feature) {
            var c = channel[feature] || this.createSticky(feature);
            this.deviceReadyChannelsMap[feature] = c;
            this.deviceReadyChannelsArray.push(c);
        }
    },

    /**
     * Indicate that initialization code has completed and the feature is ready to be used.
     *
     * @param feature {String}     The unique feature name
     */
    initializationComplete: function (feature) {
        var c = this.deviceReadyChannelsMap[feature];
        if (c) {
            c.fire();
        }
    }
};

function checkSubscriptionArgument (argument) {
    if (typeof argument !== 'function' && typeof argument.handleEvent !== 'function') {
        throw new Error(
            'Must provide a function or an EventListener object ' +
                'implementing the handleEvent interface.'
        );
    }
}

/**
 * Subscribes the given function to the channel. Any time that
 * Channel.fire is called so too will the function.
 * Optionally specify an execution context for the function
 * and a guid that can be used to stop subscribing to the channel.
 * Returns the guid.
 */
Channel.prototype.subscribe = function (eventListenerOrFunction, eventListener) {
    checkSubscriptionArgument(eventListenerOrFunction);
    var handleEvent, guid;

    if (eventListenerOrFunction && typeof eventListenerOrFunction === 'object') {
        // Received an EventListener object implementing the handleEvent interface
        handleEvent = eventListenerOrFunction.handleEvent;
        eventListener = eventListenerOrFunction;
    } else {
        // Received a function to handle event
        handleEvent = eventListenerOrFunction;
    }

    if (this.state === 2) {
        handleEvent.apply(eventListener || this, this.fireArgs);
        return;
    }

    guid = eventListenerOrFunction.observer_guid;
    if (typeof eventListener === 'object') {
        handleEvent = utils.close(eventListener, handleEvent);
    }

    if (!guid) {
        // First time any channel has seen this subscriber
        guid = '' + nextGuid++;
    }
    handleEvent.observer_guid = guid;
    eventListenerOrFunction.observer_guid = guid;

    // Don't add the same handler more than once.
    if (!this.handlers[guid]) {
        this.handlers[guid] = handleEvent;
        this.numHandlers++;
        if (this.numHandlers === 1) {
            this.onHasSubscribersChange && this.onHasSubscribersChange();
        }
    }
};

/**
 * Unsubscribes the function with the given guid from the channel.
 */
Channel.prototype.unsubscribe = function (eventListenerOrFunction) {
    checkSubscriptionArgument(eventListenerOrFunction);
    var handleEvent, guid, handler;

    if (eventListenerOrFunction && typeof eventListenerOrFunction === 'object') {
        // Received an EventListener object implementing the handleEvent interface
        handleEvent = eventListenerOrFunction.handleEvent;
    } else {
        // Received a function to handle event
        handleEvent = eventListenerOrFunction;
    }

    guid = handleEvent.observer_guid;
    handler = this.handlers[guid];
    if (handler) {
        delete this.handlers[guid];
        this.numHandlers--;
        if (this.numHandlers === 0) {
            this.onHasSubscribersChange && this.onHasSubscribersChange();
        }
    }
};

/**
 * Calls all functions subscribed to this channel.
 */
Channel.prototype.fire = function (e) {
    var fail = false; // eslint-disable-line no-unused-vars
    var fireArgs = Array.prototype.slice.call(arguments);
    // Apply stickiness.
    if (this.state === 1) {
        this.state = 2;
        this.fireArgs = fireArgs;
    }
    if (this.numHandlers) {
        // Copy the values first so that it is safe to modify it from within
        // callbacks.
        var toCall = [];
        for (var item in this.handlers) {
            toCall.push(this.handlers[item]);
        }
        for (var i = 0; i < toCall.length; ++i) {
            toCall[i].apply(this, fireArgs);
        }
        if (this.state === 2 && this.numHandlers) {
            this.numHandlers = 0;
            this.handlers = {};
            this.onHasSubscribersChange && this.onHasSubscribersChange();
        }
    }
};

// defining them here so they are ready super fast!
// DOM event that is received when the web page is loaded and parsed.
channel.createSticky('onDOMContentLoaded');

// Event to indicate the Cordova native side is ready.
channel.createSticky('onNativeReady');

// Event to indicate that all Cordova JavaScript objects have been created
// and it's time to run plugin constructors.
channel.createSticky('onCordovaReady');

// Event to indicate that all automatically loaded JS plugins are loaded and ready.
// FIXME remove this
channel.createSticky('onPluginsReady');

// Event to indicate that Cordova is ready
channel.createSticky('onDeviceReady');

// Event to indicate a resume lifecycle event
channel.create('onResume');

// Event to indicate a pause lifecycle event
channel.create('onPause');

// Channels that must fire before "deviceready" is fired.
channel.waitForInitialization('onCordovaReady');
channel.waitForInitialization('onDOMContentLoaded');

module.exports = channel;

});

// file: ../cordova-electron/cordova-js-src/confighelper.js
define("cordova/confighelper", function(require, exports, module) {

let config;

function Config (xhr) {
    function loadPreferences (xhr) {
        let parser = new DOMParser();
        let doc = parser.parseFromString(xhr.responseText, 'application/xml');
        let preferences = doc.getElementsByTagName('preference');

        return Array.prototype.slice.call(preferences);
    }

    this.xhr = xhr;
    this.preferences = loadPreferences(this.xhr);
}

function readConfig (success, error) {
    var xhr;

    if (typeof config != 'undefined') {
        success(config);
    }

    function fail (msg) {
        console.error(msg);

        if (error) {
            error(msg);
        }
    }

    var xhrStatusChangeHandler = function () {
        if (xhr.readyState === 4) {
            if (xhr.status === 200 || xhr.status === 304 || xhr.status === 0 /* file:// */) {
                config = new Config(xhr);
                success(config);
            } else {
                fail('[Electron][cordova.js][xhrStatusChangeHandler] Could not XHR config.xml: ' + xhr.statusText);
            }
        }
    };

    xhr = new XMLHttpRequest();
    xhr.addEventListener('load', xhrStatusChangeHandler);

    try {
        xhr.open('get', 'config.xml', true);
        xhr.send();
    } catch (e) {
        fail('[Electron][cordova.js][readConfig] Could not XHR config.xml: ' + JSON.stringify(e));
    }
}

/**
 * Reads a preference value from config.xml.
 * Returns preference value or undefined if it does not exist.
 * @param {String} preferenceName Preference name to read */
Config.prototype.getPreferenceValue = function getPreferenceValue (preferenceName) {
    var preferenceItem = this.preferences && this.preferences.filter(function (item) {
        return item.attributes.name && item.attributes.name.value === preferenceName;
    });

    if (preferenceItem && preferenceItem[0] && preferenceItem[0].attributes && preferenceItem[0].attributes.value) {
        return preferenceItem[0].attributes.value.value;
    }
};

exports.readConfig = readConfig;

});

// file: ../cordova-electron/cordova-js-src/exec.js
define("cordova/exec", function(require, exports, module) {

/* global require, module, console */

const cordova = require('cordova');
const execProxy = require('cordova/exec/proxy');

/**
 * Execute a cordova command.  It is up to the native side whether this action
 * is synchronous or asynchronous.  The native side can return:
 *      Synchronous: PluginResult object as a JSON string
 *      Asynchronous: Empty string ""
 * If async, the native side will cordova.callbackSuccess or cordova.callbackError,
 * depending upon the result of the action.
 *
 * @param {Function} success    The success callback
 * @param {Function} fail       The fail callback
 * @param {String} service      The name of the service to use
 * @param {String} action       Action to be run in cordova
 * @param {String[]} [args]     Zero or more arguments to pass to the method
 */
module.exports = function (success, fail, service, action, args) {

    var proxy = execProxy.get(service, action);

    args = args || [];

    if (proxy) {

        var callbackId = service + cordova.callbackId++;

        if (typeof success === 'function' || typeof fail === 'function') {
            cordova.callbacks[callbackId] = { success: success, fail: fail };
        }
        try {
            // callbackOptions param represents additional optional parameters command could pass back, like keepCallback or
            // custom callbackId, for example {callbackId: id, keepCallback: true, status: cordova.callbackStatus.JSON_EXCEPTION }
            var onSuccess = function (result, callbackOptions) {
                callbackOptions = callbackOptions || {};
                var callbackStatus;
                // covering both undefined and null.
                // strict null comparison was causing callbackStatus to be undefined
                // and then no callback was called because of the check in cordova.callbackFromNative
                // see CB-8996 Mobilespec app hang on windows
                if (callbackOptions.status !== undefined && callbackOptions.status !== null) {
                    callbackStatus = callbackOptions.status;
                } else {
                    callbackStatus = cordova.callbackStatus.OK;
                }
                cordova.callbackSuccess(callbackOptions.callbackId || callbackId,
                    {
                        status: callbackStatus,
                        message: result,
                        keepCallback: callbackOptions.keepCallback || false
                    });
            };
            var onError = function (err, callbackOptions) {
                callbackOptions = callbackOptions || {};
                var callbackStatus;
                // covering both undefined and null.
                // strict null comparison was causing callbackStatus to be undefined
                // and then no callback was called because of the check in cordova.callbackFromNative
                // note: status can be 0
                if (callbackOptions.status !== undefined && callbackOptions.status !== null) {
                    callbackStatus = callbackOptions.status;
                } else {
                    callbackStatus = cordova.callbackStatus.OK;
                }
                cordova.callbackError(callbackOptions.callbackId || callbackId, {
                    status: callbackStatus,
                    message: err,
                    keepCallback: callbackOptions.keepCallback || false
                });
            };
            proxy(onSuccess, onError, args);

        } catch (e) {
            console.log('Exception calling native with command :: ' + service + ' :: ' + action + ' ::exception=' + e);
        }
    } else {

        console.log('Error: exec proxy not found for :: ' + service + ' :: ' + action);

        if (typeof fail === 'function') {
            fail('Missing Command Error');
        }
    }
};

});

// file: src/common/exec/proxy.js
define("cordova/exec/proxy", function(require, exports, module) {

// internal map of proxy function
var CommandProxyMap = {};

module.exports = {

    // example: cordova.commandProxy.add("Accelerometer",{getCurrentAcceleration: function(successCallback, errorCallback, options) {...},...);
    add: function (id, proxyObj) {
        console.log('adding proxy for ' + id);
        CommandProxyMap[id] = proxyObj;
        return proxyObj;
    },

    // cordova.commandProxy.remove("Accelerometer");
    remove: function (id) {
        var proxy = CommandProxyMap[id];
        delete CommandProxyMap[id];
        CommandProxyMap[id] = null;
        return proxy;
    },

    get: function (service, action) {
        return (CommandProxyMap[service] ? CommandProxyMap[service][action] : null);
    }
};

});

// file: src/common/init.js
define("cordova/init", function(require, exports, module) {

var channel = require('cordova/channel');
var cordova = require('cordova');
var modulemapper = require('cordova/modulemapper');
var platform = require('cordova/platform');
var pluginloader = require('cordova/pluginloader');
var utils = require('cordova/utils');

var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady];

function logUnfiredChannels (arr) {
    for (var i = 0; i < arr.length; ++i) {
        if (arr[i].state !== 2) {
            console.log('Channel not fired: ' + arr[i].type);
        }
    }
}

window.setTimeout(function () {
    if (channel.onDeviceReady.state !== 2) {
        console.log('deviceready has not fired after 5 seconds.');
        logUnfiredChannels(platformInitChannelsArray);
        logUnfiredChannels(channel.deviceReadyChannelsArray);
    }
}, 5000);

// Replace navigator before any modules are required(), to ensure it happens as soon as possible.
// We replace it so that properties that can't be clobbered can instead be overridden.
function replaceNavigator (origNavigator) {
    var CordovaNavigator = function () {};
    CordovaNavigator.prototype = origNavigator;
    var newNavigator = new CordovaNavigator();
    // This work-around really only applies to new APIs that are newer than Function.bind.
    // Without it, APIs such as getGamepads() break.
    if (CordovaNavigator.bind) {
        for (var key in origNavigator) {
            if (typeof origNavigator[key] === 'function') {
                newNavigator[key] = origNavigator[key].bind(origNavigator);
            } else {
                (function (k) {
                    utils.defineGetterSetter(newNavigator, key, function () {
                        return origNavigator[k];
                    });
                })(key);
            }
        }
    }
    return newNavigator;
}

if (window.navigator) {
    window.navigator = replaceNavigator(window.navigator);
}

if (!window.console) {
    window.console = {
        log: function () {}
    };
}
if (!window.console.warn) {
    window.console.warn = function (msg) {
        this.log('warn: ' + msg);
    };
}

// Register pause, resume and deviceready channels as events on document.
channel.onPause = cordova.addDocumentEventHandler('pause');
channel.onResume = cordova.addDocumentEventHandler('resume');
channel.onActivated = cordova.addDocumentEventHandler('activated');
channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready');

// Listen for DOMContentLoaded and notify our channel subscribers.
if (document.readyState === 'complete' || document.readyState === 'interactive') {
    channel.onDOMContentLoaded.fire();
} else {
    document.addEventListener('DOMContentLoaded', function () {
        channel.onDOMContentLoaded.fire();
    }, false);
}

// _nativeReady is global variable that the native side can set
// to signify that the native code is ready. It is a global since
// it may be called before any cordova JS is ready.
if (window._nativeReady) {
    channel.onNativeReady.fire();
}

modulemapper.clobbers('cordova', 'cordova');
modulemapper.clobbers('cordova/exec', 'cordova.exec');
modulemapper.clobbers('cordova/exec', 'Cordova.exec');

// Call the platform-specific initialization.
platform.bootstrap && platform.bootstrap();

// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js.
// The delay allows the attached modules to be defined before the plugin loader looks for them.
setTimeout(function () {
    pluginloader.load(function () {
        channel.onPluginsReady.fire();
    });
}, 0);

/**
 * Create all cordova objects once native side is ready.
 */
channel.join(function () {
    modulemapper.mapModules(window);

    platform.initialize && platform.initialize();

    // Fire event to notify that all objects are created
    channel.onCordovaReady.fire();

    // Fire onDeviceReady event once page has fully loaded, all
    // constructors have run and cordova info has been received from native
    // side.
    channel.join(function () {
        require('cordova').fireDocumentEvent('deviceready');
    }, channel.deviceReadyChannelsArray);

}, platformInitChannelsArray);

});

// file: src/common/modulemapper.js
define("cordova/modulemapper", function(require, exports, module) {

var builder = require('cordova/builder');
var moduleMap = define.moduleMap; // eslint-disable-line no-undef
var symbolList;
var deprecationMap;

exports.reset = function () {
    symbolList = [];
    deprecationMap = {};
};

function addEntry (strategy, moduleName, symbolPath, opt_deprecationMessage) {
    if (!(moduleName in moduleMap)) {
        throw new Error('Module ' + moduleName + ' does not exist.');
    }
    symbolList.push(strategy, moduleName, symbolPath);
    if (opt_deprecationMessage) {
        deprecationMap[symbolPath] = opt_deprecationMessage;
    }
}

// Note: Android 2.3 does have Function.bind().
exports.clobbers = function (moduleName, symbolPath, opt_deprecationMessage) {
    addEntry('c', moduleName, symbolPath, opt_deprecationMessage);
};

exports.merges = function (moduleName, symbolPath, opt_deprecationMessage) {
    addEntry('m', moduleName, symbolPath, opt_deprecationMessage);
};

exports.defaults = function (moduleName, symbolPath, opt_deprecationMessage) {
    addEntry('d', moduleName, symbolPath, opt_deprecationMessage);
};

exports.runs = function (moduleName) {
    addEntry('r', moduleName, null);
};

function prepareNamespace (symbolPath, context) {
    if (!symbolPath) {
        return context;
    }
    var parts = symbolPath.split('.');
    var cur = context;
    for (var i = 0, part; part = parts[i]; ++i) { // eslint-disable-line no-cond-assign
        cur = cur[part] = cur[part] || {};
    }
    return cur;
}

exports.mapModules = function (context) {
    var origSymbols = {};
    context.CDV_origSymbols = origSymbols;
    for (var i = 0, len = symbolList.length; i < len; i += 3) {
        var strategy = symbolList[i];
        var moduleName = symbolList[i + 1];
        var module = require(moduleName);
        // <runs/>
        if (strategy === 'r') {
            continue;
        }
        var symbolPath = symbolList[i + 2];
        var lastDot = symbolPath.lastIndexOf('.');
        var namespace = symbolPath.substr(0, lastDot);
        var lastName = symbolPath.substr(lastDot + 1);

        var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null;
        var parentObj = prepareNamespace(namespace, context);
        var target = parentObj[lastName];

        if (strategy === 'm' && target) {
            builder.recursiveMerge(target, module);
        } else if ((strategy === 'd' && !target) || (strategy !== 'd')) {
            if (!(symbolPath in origSymbols)) {
                origSymbols[symbolPath] = target;
            }
            builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg);
        }
    }
};

exports.getOriginalSymbol = function (context, symbolPath) {
    var origSymbols = context.CDV_origSymbols;
    if (origSymbols && (symbolPath in origSymbols)) {
        return origSymbols[symbolPath];
    }
    var parts = symbolPath.split('.');
    var obj = context;
    for (var i = 0; i < parts.length; ++i) {
        obj = obj && obj[parts[i]];
    }
    return obj;
};

exports.reset();

});

// file: ../cordova-electron/cordova-js-src/platform.js
define("cordova/platform", function(require, exports, module) {

module.exports = {
    id: 'electron',
    cordovaVersion: '4.2.0', // cordova-js

    bootstrap: function () {

        var modulemapper = require('cordova/modulemapper');
        var channel = require('cordova/channel');

        modulemapper.clobbers('cordova/exec/proxy', 'cordova.commandProxy');

        channel.onNativeReady.fire();

        document.addEventListener('visibilitychange', function () {
            if (document.hidden) {
                channel.onPause.fire();
            } else {
                channel.onResume.fire();
            }
        });

    // End of bootstrap
    }
};

});

// file: src/common/pluginloader.js
define("cordova/pluginloader", function(require, exports, module) {

var modulemapper = require('cordova/modulemapper');

// Helper function to inject a <script> tag.
// Exported for testing.
exports.injectScript = function (url, onload, onerror) {
    var script = document.createElement('script');
    // onload fires even when script fails loads with an error.
    script.onload = onload;
    // onerror fires for malformed URLs.
    script.onerror = onerror;
    script.src = url;
    document.head.appendChild(script);
};

function injectIfNecessary (id, url, onload, onerror) {
    onerror = onerror || onload;
    if (id in define.moduleMap) { // eslint-disable-line no-undef
        onload();
    } else {
        exports.injectScript(url, function () {
            if (id in define.moduleMap) { // eslint-disable-line no-undef
                onload();
            } else {
                onerror();
            }
        }, onerror);
    }
}

function onScriptLoadingComplete (moduleList, finishPluginLoading) {
    // Loop through all the plugins and then through their clobbers and merges.
    for (var i = 0, module; module = moduleList[i]; i++) { // eslint-disable-line no-cond-assign
        if (module.clobbers && module.clobbers.length) {
            for (var j = 0; j < module.clobbers.length; j++) {
                modulemapper.clobbers(module.id, module.clobbers[j]);
            }
        }

        if (module.merges && module.merges.length) {
            for (var k = 0; k < module.merges.length; k++) {
                modulemapper.merges(module.id, module.merges[k]);
            }
        }

        // Finally, if runs is truthy we want to simply require() the module.
        if (module.runs) {
            modulemapper.runs(module.id);
        }
    }

    finishPluginLoading();
}

// Handler for the cordova_plugins.js content.
// See plugman's plugin_loader.js for the details of this object.
// This function is only called if the really is a plugins array that isn't empty.
// Otherwise the onerror response handler will just call finishPluginLoading().
function handlePluginsObject (path, moduleList, finishPluginLoading) {
    // Now inject the scripts.
    var scriptCounter = moduleList.length;

    if (!scriptCounter) {
        finishPluginLoading();
        return;
    }
    function scriptLoadedCallback () {
        if (!--scriptCounter) {
            onScriptLoadingComplete(moduleList, finishPluginLoading);
        }
    }

    for (var i = 0; i < moduleList.length; i++) {
        injectIfNecessary(moduleList[i].id, path + moduleList[i].file, scriptLoadedCallback);
    }
}

function findCordovaPath () {
    var path = null;
    var scripts = document.getElementsByTagName('script');
    var term = '/cordova.js';
    for (var n = scripts.length - 1; n > -1; n--) {
        var src = scripts[n].src.replace(/\?.*$/, ''); // Strip any query param (CB-6007).
        if (src.indexOf(term) === (src.length - term.length)) {
            path = src.substring(0, src.length - term.length) + '/';
            break;
        }
    }
    return path;
}

// Tries to load all plugins' js-modules.
// This is an async process, but onDeviceReady is blocked on onPluginsReady.
// onPluginsReady is fired when there are no plugins to load, or they are all done.
exports.load = function (callback) {
    var pathPrefix = findCordovaPath();
    if (pathPrefix === null) {
        console.log('Could not find cordova.js script tag. Plugin loading may fail.');
        pathPrefix = '';
    }
    injectIfNecessary('cordova/plugin_list', pathPrefix + 'cordova_plugins.js', function () {
        var moduleList = require('cordova/plugin_list');
        handlePluginsObject(pathPrefix, moduleList, callback);
    }, callback);
};

});

// file: src/common/urlutil.js
define("cordova/urlutil", function(require, exports, module) {

/**
 * For already absolute URLs, returns what is passed in.
 * For relative URLs, converts them to absolute ones.
 */
exports.makeAbsolute = function makeAbsolute (url) {
    var anchorEl = document.createElement('a');
    anchorEl.href = url;
    return anchorEl.href;
};

});

// file: src/common/utils.js
define("cordova/utils", function(require, exports, module) {

var utils = exports;

/**
 * Defines a property getter / setter for obj[key].
 */
utils.defineGetterSetter = function (obj, key, getFunc, opt_setFunc) {
    if (Object.defineProperty) {
        var desc = {
            get: getFunc,
            configurable: true
        };
        if (opt_setFunc) {
            desc.set = opt_setFunc;
        }
        Object.defineProperty(obj, key, desc);
    } else {
        obj.__defineGetter__(key, getFunc);
        if (opt_setFunc) {
            obj.__defineSetter__(key, opt_setFunc);
        }
    }
};

/**
 * Defines a property getter for obj[key].
 */
utils.defineGetter = utils.defineGetterSetter;

utils.arrayIndexOf = function (a, item) {
    if (a.indexOf) {
        return a.indexOf(item);
    }
    var len = a.length;
    for (var i = 0; i < len; ++i) {
        if (a[i] === item) {
            return i;
        }
    }
    return -1;
};

/**
 * Returns whether the item was found in the array.
 */
utils.arrayRemove = function (a, item) {
    var index = utils.arrayIndexOf(a, item);
    if (index !== -1) {
        a.splice(index, 1);
    }
    return index !== -1;
};

utils.typeName = function (val) {
    return Object.prototype.toString.call(val).slice(8, -1);
};

/**
 * Returns an indication of whether the argument is an array or not
 */
utils.isArray = Array.isArray ||
                function (a) { return utils.typeName(a) === 'Array'; };

/**
 * Returns an indication of whether the argument is a Date or not
 */
utils.isDate = function (d) {
    return (d instanceof Date);
};

/**
 * Does a deep clone of the object.
 */
utils.clone = function (obj) {
    if (!obj || typeof obj === 'function' || utils.isDate(obj) || typeof obj !== 'object') {
        return obj;
    }

    var retVal, i;

    if (utils.isArray(obj)) {
        retVal = [];
        for (i = 0; i < obj.length; ++i) {
            retVal.push(utils.clone(obj[i]));
        }
        return retVal;
    }

    retVal = {};
    for (i in obj) {
        // https://issues.apache.org/jira/browse/CB-11522 'unknown' type may be returned in
        // custom protocol activation case on Windows Phone 8.1 causing "No such interface supported" exception
        // on cloning.
        if ((!(i in retVal) || retVal[i] !== obj[i]) && typeof obj[i] !== 'undefined' && typeof obj[i] !== 'unknown') { // eslint-disable-line valid-typeof
            retVal[i] = utils.clone(obj[i]);
        }
    }
    return retVal;
};

/**
 * Returns a wrapped version of the function
 */
utils.close = function (context, func, params) {
    return function () {
        var args = params || arguments;
        return func.apply(context, args);
    };
};

// ------------------------------------------------------------------------------
function UUIDcreatePart (length) {
    var uuidpart = '';
    for (var i = 0; i < length; i++) {
        var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
        if (uuidchar.length === 1) {
            uuidchar = '0' + uuidchar;
        }
        uuidpart += uuidchar;
    }
    return uuidpart;
}

/**
 * Create a UUID
 */
utils.createUUID = function () {
    return UUIDcreatePart(4) + '-' +
        UUIDcreatePart(2) + '-' +
        UUIDcreatePart(2) + '-' +
        UUIDcreatePart(2) + '-' +
        UUIDcreatePart(6);
};

/**
 * Extends a child object from a parent object using classical inheritance
 * pattern.
 */
utils.extend = (function () {
    // proxy used to establish prototype chain
    var F = function () {};
    // extend Child from Parent
    return function (Child, Parent) {

        F.prototype = Parent.prototype;
        Child.prototype = new F();
        Child.__super__ = Parent.prototype;
        Child.prototype.constructor = Child;
    };
}());

/**
 * Alerts a message in any available way: alert or console.log.
 */
utils.alert = function (msg) {
    if (window.alert) {
        window.alert(msg);
    } else if (console && console.log) {
        console.log(msg);
    }
};

});

window.cordova = require('cordova');
// file: src/scripts/bootstrap.js
require('cordova/init');

})();
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

let config;

function Config (xhr) {
    function loadPreferences (xhr) {
        let parser = new DOMParser();
        let doc = parser.parseFromString(xhr.responseText, 'application/xml');
        let preferences = doc.getElementsByTagName('preference');

        return Array.prototype.slice.call(preferences);
    }

    this.xhr = xhr;
    this.preferences = loadPreferences(this.xhr);
}

function readConfig (success, error) {
    var xhr;

    if (typeof config != 'undefined') {
        success(config);
    }

    function fail (msg) {
        console.error(msg);

        if (error) {
            error(msg);
        }
    }

    var xhrStatusChangeHandler = function () {
        if (xhr.readyState === 4) {
            if (xhr.status === 200 || xhr.status === 304 || xhr.status === 0 /* file:// */) {
                config = new Config(xhr);
                success(config);
            } else {
                fail('[Electron][cordova.js][xhrStatusChangeHandler] Could not XHR config.xml: ' + xhr.statusText);
            }
        }
    };

    xhr = new XMLHttpRequest();
    xhr.addEventListener('load', xhrStatusChangeHandler);

    try {
        xhr.open('get', 'config.xml', true);
        xhr.send();
    } catch (e) {
        fail('[Electron][cordova.js][readConfig] Could not XHR config.xml: ' + JSON.stringify(e));
    }
}

/**
 * Reads a preference value from config.xml.
 * Returns preference value or undefined if it does not exist.
 * @param {String} preferenceName Preference name to read */
Config.prototype.getPreferenceValue = function getPreferenceValue (preferenceName) {
    var preferenceItem = this.preferences && this.preferences.filter(function (item) {
        return item.attributes.name && item.attributes.name.value === preferenceName;
    });

    if (preferenceItem && preferenceItem[0] && preferenceItem[0].attributes && preferenceItem[0].attributes.value) {
        return preferenceItem[0].attributes.value.value;
    }
};

exports.readConfig = readConfig;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/* global require, module, console */

const cordova = require('cordova');
const execProxy = require('cordova/exec/proxy');

/**
 * Execute a cordova command.  It is up to the native side whether this action
 * is synchronous or asynchronous.  The native side can return:
 *      Synchronous: PluginResult object as a JSON string
 *      Asynchronous: Empty string ""
 * If async, the native side will cordova.callbackSuccess or cordova.callbackError,
 * depending upon the result of the action.
 *
 * @param {Function} success    The success callback
 * @param {Function} fail       The fail callback
 * @param {String} service      The name of the service to use
 * @param {String} action       Action to be run in cordova
 * @param {String[]} [args]     Zero or more arguments to pass to the method
 */
module.exports = function (success, fail, service, action, args) {

    var proxy = execProxy.get(service, action);

    args = args || [];

    if (proxy) {

        var callbackId = service + cordova.callbackId++;

        if (typeof success === 'function' || typeof fail === 'function') {
            cordova.callbacks[callbackId] = { success: success, fail: fail };
        }
        try {
            // callbackOptions param represents additional optional parameters command could pass back, like keepCallback or
            // custom callbackId, for example {callbackId: id, keepCallback: true, status: cordova.callbackStatus.JSON_EXCEPTION }
            var onSuccess = function (result, callbackOptions) {
                callbackOptions = callbackOptions || {};
                var callbackStatus;
                // covering both undefined and null.
                // strict null comparison was causing callbackStatus to be undefined
                // and then no callback was called because of the check in cordova.callbackFromNative
                // see CB-8996 Mobilespec app hang on windows
                if (callbackOptions.status !== undefined && callbackOptions.status !== null) {
                    callbackStatus = callbackOptions.status;
                } else {
                    callbackStatus = cordova.callbackStatus.OK;
                }
                cordova.callbackSuccess(callbackOptions.callbackId || callbackId,
                    {
                        status: callbackStatus,
                        message: result,
                        keepCallback: callbackOptions.keepCallback || false
                    });
            };
            var onError = function (err, callbackOptions) {
                callbackOptions = callbackOptions || {};
                var callbackStatus;
                // covering both undefined and null.
                // strict null comparison was causing callbackStatus to be undefined
                // and then no callback was called because of the check in cordova.callbackFromNative
                // note: status can be 0
                if (callbackOptions.status !== undefined && callbackOptions.status !== null) {
                    callbackStatus = callbackOptions.status;
                } else {
                    callbackStatus = cordova.callbackStatus.OK;
                }
                cordova.callbackError(callbackOptions.callbackId || callbackId, {
                    status: callbackStatus,
                    message: err,
                    keepCallback: callbackOptions.keepCallback || false
                });
            };
            proxy(onSuccess, onError, args);

        } catch (e) {
            console.log('Exception calling native with command :: ' + service + ' :: ' + action + ' ::exception=' + e);
        }
    } else {

        console.log('Error: exec proxy not found for :: ' + service + ' :: ' + action);

        if (typeof fail === 'function') {
            fail('Missing Command Error');
        }
    }
};
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

module.exports = {
    id: 'electron',
    cordovaVersion: '4.2.0', // cordova-js

    bootstrap: function () {

        var modulemapper = require('cordova/modulemapper');
        var channel = require('cordova/channel');

        modulemapper.clobbers('cordova/exec/proxy', 'cordova.commandProxy');

        channel.onNativeReady.fire();

        document.addEventListener('visibilitychange', function () {
            if (document.hidden) {
                channel.onPause.fire();
            } else {
                channel.onResume.fire();
            }
        });

    // End of bootstrap
    }
};
#!/usr/bin/env node

/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

/*
 * create a Cordova project
 *
 * USAGE
 *   ./create <path_to_new_project> <package_name> <project_name>
 *
 * EXAMPLE
 *  ./create ~/Desktop/radness org.apache.cordova.radness Radness
 */

const path = require('path');
const ConfigParser = require('cordova-common').ConfigParser;
const Api = require('./templates/cordova/Api');

const argv = require('nopt')({
    help: Boolean,
    cli: Boolean,
    shared: Boolean, // alias for --link
    link: Boolean
}, { d: '--verbose' });

const projectPath = argv.argv.remain[0];

if (argv.help || !projectPath) {
    console.log('Usage: $0 [--link] [--cli] <path_to_new_project> <package_name> <project_name> [<project_template_dir>]');
    console.log('   --link (optional): Link directly against the shared copy of the CordovaLib instead of a copy of it.');
    console.log('   --cli (optional): Use the CLI-project template.');
    console.log('   <path_to_new_project>: Path to your new Cordova iOS project');
    console.log('   <package_name>: Package name, following reverse-domain style convention');
    console.log('   <project_name>: Project name');
    console.log('   <project_template_dir>: Path to project template (override).');
    process.exit(0);
} else {
    const configPath = path.resolve(__dirname, 'templates/project/config.xml');
    const config = new ConfigParser(configPath);

    // apply overrides (package and project names
    if (argv.argv.remain[1]) {
        config.setPackageName(argv.argv.remain[1]);
    }
    if (argv.argv.remain[2]) {
        config.setName(argv.argv.remain[2]);
    }

    const options = {
        cli: argv.cli,
        link: argv.link || argv.shared,
        customTemplate: argv.argv.remain[3]
    };

    Api.createPlatform(projectPath, config, options);
}
:: Licensed to the Apache Software Foundation (ASF) under one
:: or more contributor license agreements.  See the NOTICE file
:: distributed with this work for additional information
:: regarding copyright ownership.  The ASF licenses this file
:: to you 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.

@ECHO OFF
SET script_path="%~dp0create"
IF EXIST %script_path% (
    node %script_path% %*
) ELSE (
    ECHO.
    ECHO ERROR: Could not find 'create' script in 'bin' folder, aborting...>&2
    EXIT /B 1
)#!/usr/bin/env node

/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const update = require('./lib/update');

// check for help flag
if (['--help', '/?', '-h', 'help', '-help', '/help'].indexOf(process.argv[2]) > -1) {
    update.help();
} else {
    update.run(process.argv).then(function () {
        console.log('Successfully updated electron project.'); // won't happen .. it's not supported
    }, function (err) {
        console.error('Update failed due to', err);
        process.exit(2);
    });
}
:: Licensed to the Apache Software Foundation (ASF) under one
:: or more contributor license agreements.  See the NOTICE file
:: distributed with this work for additional information
:: regarding copyright ownership.  The ASF licenses this file
:: to you 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.

@ECHO OFF
SET script_path="%~dp0update"
IF EXIST %script_path% (
    node %script_path% %*
) ELSE (
    ECHO.
    ECHO ERROR: Could not find 'update' script in 'bin' folder, aborting...>&2
    EXIT /B 1
)
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const fs = require('fs');
// Module to control application life, browser window and tray.
const { app, BrowserWindow } = require('electron');
// Electron settings from .json file.
const cdvElectronSettings = require('./cdv-electron-settings.json');

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let mainWindow;

function createWindow () {
    // Create the browser window.
    let appIcon;
    if (fs.existsSync(`${__dirname}/img/app.png`)) {
        appIcon = `${__dirname}/img/app.png`;
    } else if (fs.existsSync(`${__dirname}/img/icon.png`)) {
        appIcon = `${__dirname}/img/icon.png`;
    } else {
        appIcon = `${__dirname}/img/logo.png`;
    }

    const browserWindowOpts = Object.assign({}, cdvElectronSettings.browserWindow, { icon: appIcon });
    mainWindow = new BrowserWindow(browserWindowOpts);

    // and load the index.html of the app.
    // TODO: possibly get this data from config.xml
    mainWindow.loadURL(`file://${__dirname}/index.html`);
    mainWindow.webContents.on('did-finish-load', function () {
        mainWindow.webContents.send('window-id', mainWindow.id);
    });

    // Open the DevTools.
    if (cdvElectronSettings.browserWindow.webPreferences.devTools) {
        mainWindow.webContents.openDevTools();
    }

    // Emitted when the window is closed.
    mainWindow.on('closed', () => {
    // Dereference the window object, usually you would store windows
    // in an array if your app supports multi windows, this is the time
    // when you should delete the corresponding element.
        mainWindow = null;
    });
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow);

// Quit when all windows are closed.
app.on('window-all-closed', () => {
    // On OS X it is common for applications and their menu bar
    // to stay active until the user quits explicitly with Cmd + Q
    if (process.platform !== 'darwin') {
        app.quit();
    }
});

app.on('activate', () => {
    // On OS X it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (mainWindow === null) {
        createWindow();
    }
});

// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.
{
    "browserWindow": {
        "height": 600,
        "webPreferences":{
            "devTools": true,
            "nodeIntegration": false
        },
        "width": 800
    }
}<?xml version="1.0" encoding="UTF-8"?>
<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
-->
<widget xmlns="http://www.w3.org/ns/widgets">

</widget><!DOCTYPE html>
<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
-->
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="format-detection" content="telephone=no" />
        <meta name="theme-color" content="#2196F3"/>
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
        <link rel="stylesheet" type="text/css" href="css/index.css" />
        <link rel="manifest" href="manifest.json">
        <title>Hello World</title>
    </head>
    <body>
        <div class="app">
            <h1>Apache Cordova</h1>
            <div id="deviceready" class="blink">
                <p class="event listening">Connecting to Device</p>
                <p class="event received">Device is Ready</p>
            </div>
        </div>
        <script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript" src="js/index.js"></script>
        <script type="text/javascript">
            app.initialize();
        </script>
    </body>
</html>
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/
const app = {
    // Application Constructor
    initialize: () => {
        this.bindEvents();
    },
    // Bind Event Listeners
    //
    // Bind any events that are required on startup. Common events are:
    // 'load', 'deviceready', 'offline', and 'online'.
    bindEvents: () => {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    // deviceready Event Handler
    //
    // The scope of 'this' is the event. In order to call the 'receivedEvent'
    // function, we must explicity call 'app.receivedEvent(...);'
    onDeviceReady: () => {
        app.receivedEvent('deviceready');
    },
    // Update DOM on a Received Event
    receivedEvent: (id) => {
        const parentElement = document.getElementById(id);
        const listeningElement = parentElement.querySelector('.listening');
        const receivedElement = parentElement.querySelector('.received');

        listeningElement.setAttribute('style', 'display:none;');
        receivedElement.setAttribute('style', 'display:block;');

        console.log(`Received Event: ${id}`);
    }
};
‰PNG

   IHDR   À   À   RÜl    IDATxœí½y�%ÉyöË¬ªw¿>¦çZ`±X,¸À.v�…0(;dŠHG�š¶ì ©0­�í�>ÃGPdˆ”a)¨ BbP¦$ƒdPIð0 ‚¨%	Ò¢IáÞÅîÌt÷Ìô\ÝÓ3}¿~¯ŽÌÏdfUV½ªzUï˜�YÌ·Ûó*³²ò¨úîü2x�á1<†ÇðÃcx�á1<†ÇðÃcx�á1<†ÇðÃcx�áM¬Na"ZT?æ‘ˆ~‘$­å}�öÞ¬Ïæ•/~Æ|U†±äS=³ÈïÃáäääçƒÁ?·ûó°Á³Ï>[¹ì›† „?EÑß‘ˆ‘¥
¢˜ëlÙªˆž½®K@yå‰¤•beêÁlß��1B„£N§ó–åååý*[(4�Êek@†µ;ó €sþ”ˆÄÕHDÜæ–Y„4×†›å•�ôl^zR×MëÌTR>D H)Ñíviiié9ç3Õµ(p§rÙZAíÎ,ôý}"úŽ<nþ ·¬Þy´U'¯,Ò½IÀƒ” ¾=Š¢?BL]×¢à�ï|gå²oè¯Að!
õäiy–g§!‚ñ<Ê
‚‡‚ôó7|ß; zØ$Á;ÞñŽÊei ¢Žb[ÑŸ„oÌ#ý°ÁqœŸ¼xñâ�N]É‚ Ž�þH€”òç¢(úëRÊBÃ÷1,†Œ½Ôëõžåœ¯OUÉ‚ ßïW.ûÈ }KEªõÑì½Âôc› Þ½2ÐŽ‚?�¢è_�FSÕ±xþùç+—}d	@qIñ. >‚=&‚z÷&Aÿ‘çyÿÌó¼©ë˜'\¸p¡rÙG’ ¤”?*„øÛeªO^Þc"X!N.^¼ø¤çy‡SU0gx³Û O!6¤”|V„zìªw¯ì×u™sþWySK )åËBˆo3éG‘æ‘~Øˆ  ¢(úîápø{yvÙƒ„÷¼ç=•Ë>b@?(„üÅì~LeeDQ´ÕjµžéõzoèìX·Û­\öQ"€ž”ò†”r%¯/�"¼Ùl!úýþÿ¾²²ò?ÖzpÎð¦´ˆèŸ
!~$“—-SšžTæ±a\ï^Iùç¤”—Þ(Uèé§Ÿ®\öQ!€¿(¥ü—u}þyéIeA½{YÐ±B6�¾å�Â—7]8´”r�ˆÞYÔ‡y#Ë›‰@„1ËaÁD ¥„çyãÂ…?Wù¡9Â›J"¢ÿIJùã“úòf°	æ‘~c"‚ã8þÒÒÒœó¾n ÝnW.û°ÀÓRÊ«U?Öc"ˆs
"�Rþªâß}Ðaôï~÷»+—}¨	€ˆþ€ˆþrYÛ�‰ ZºN^Yþ¤{60ÆàûþwsÎ¯Î"•YáÉ'Ÿ¬\öa&€’RþB•ö�oV›àA�”rëâÅ‹O»®ûÀ�çÍ`ôˆè­TéÃ<�eR™ÇDPïž]Æó¼�¹®û?L,<'X[[«\öa%€_ ¢ªóQ²¼™ˆ ôà¼CD„(Š^‡¯>zÔC!þ}¾J›‚ógÓo„M0Ÿq¾q†1cAü«V«õÍu<4ÓÂòòrå²Ñ€gª¶ý�BóH¿‘D „ÀÊÊÊÚï÷¶´ààQ¶þ"ú_ë¶ÿ˜ª§ßH" à3ÆÞ*¥¼?©à,ð¨z�ž°1©�Y>Ö¼‰âQU‡¦µ¡&åOº§Ã$>9À^Ì4ox×»ÞU¹ìÃD  à/WikšX´u!»²Œˆ&î.—}Þ”[÷6×Œ±±�½Ìµ“—××ô8¥.™¼ÉW–?éž”®ë~èüùóŸ[>¹®[¹ìÃB ?à«¶WWbŒMØ-Œ€©7B–šÀôí¬Ï„ô?Œ`ˆÂa�!ß<‰@J	Î9šÍFAŸjÖmþaÉP%F#Œ)äÁ4D@Dp]÷Îêêê“œs9©ži`a[#.ˆ ú nèÕi³êËçœ#Š"Üºy÷ööáºŽFž±‡RyY®:¦8C! IE.\ÀùsgÇ$A–C[;«Ž%/Íç÷ïïaëÆMH¡t"X÷Í­ñúÕ¯ˆB,¯,ã™§Ÿ&ò¤üIÏÑÿ!„øï±Ýf�hÐê²bqð3(@~ Xœ—q'óŒQŽ��ðÛÿâóøúå«èvÚ RR"ò%Á�D’O
ÁµJÀôµ$€H€`DRàæ�»ø/þãÆÛŸz‚ #žl«ì`—GÍfQáïÿì/`cë6Vû=H’ ¨1�ŒÚG”š½‚$ Í.ÓPc@ÜG	!T[Ãá�Vÿ‡ï{áÝØÛ?ŒûZöŠ½ìÆØEÑÇ]×}õ�Üiú�&€oƒRJaš—œÜ“¸´~×oßC§ÝçF’1H$”
$A’ cdÑê‘Ñ— Žj“ Æ\¸p@9AÖgöÆ¢H`íÌ\8»†W._ÃrO!·Æg(<V:‘–Zº‘ÑyH�‹¤Teô;h4›¸rý6>ó¹Ïãý/>Îy%ÛbšïCDð<ïã/^üàƒŒÊÂM ÿ¤jÁº/Ùpÿ½û÷ñêk Z­FÌÑ‡CJÍ)%PF2WÈA¢h"°%‚$#BF8v«+Õ'_fs³ÙÀ[ž¸€V³�f£¡ï‰I-©tŸerOI	"¦~õsê= ‰gŸ~~ý·þùžoÃ{žÿ&ìïÂÖ”çE:ï‡‡‡ÓuÝ4Ó‹šÞHøß�3áUu^²òú.]ÙÄÖí»è´[Q�*k¼ÆÐÕ5Ù‰â¾è_?qæÌ
–—ÒÛñMÃõ«¤�Îž]Õ¶‡ÕÕÔ`$8 ©°øÞ †~·�Í[÷ñŸ}/>ÿ.8Ž!Ò6Ë<‰`8þ]!Ä/‡Ã{oÄÊ7Š Þ	àžæÁ:/ù`o¯¼¾!	-—CŠ<`J—§TZÛPD’k4«laˆ3+ËXY^•|ÀIêM•4Áõ<\<wÖ®xlPÆ86ùêWE†nÀÀ9 Eb=ùÄ~í³/ã#ÿÖ·ãÅ÷<‹ýýÃ±ñÏ‹8çí(ŠþÏ^¯÷Ñ&‘…7Š ~~–‡'½d¦±öµËJ÷ï4¡|ÞÉ§OÕÁ¬|™Ev¦ÿWê@ÒEB`mmUéèz‹vÑ�q�PÞòÊæ¥A„3«+XêuE®ÃÇ‰ÓÆpÎŒî3V†;!s£ÛnáÕõëøõßú}¼ïÅwƒ;,vØ¥çAúúß^YYùžn·û;¹-Þøk þ�Y+™äÚß»�¯½¾I€ë8ˆ"¥Àâ¦ú	$ÎpJt›1Õ()Î(©G
‰³k«ê‘xb©˜£—A•qJ)±²¼Œåå>�Nà:Í¸ÃãÝMdA’¥å@Î¸L�ðÔÅsøäg_ÆG¿÷;ðâóïÂþÁa¾´™xž‡£££�ƒ·ÑÝSèAÀ
€¹<e/ùµ+›Øº}Ýv3)[ò<Óÿ(.Ï@Z/Jè�éïŸ®%ŠÎŸUñçö­i‰ Ä`Tí	‰³k+X]êáîý=tZÍ¸ÿdÊfíƒÜz5!d©Fkq½^¯^¹Ž_ûôïã¥žçÊi0©UòóîÑ… >6ÿÛi<hø ªoÛUòTŽÃý=|ýõMéó¢´:œ¶C8ÖñÉfÿ¹ü¦Æ„”hµ8£=@EjM¶¯ÙP@{–ôìk’è÷{8·¶Š¯_¹–o3F¤´Ÿ¸%!Œ�a*’êU<uñ>ù™—ñýß÷]xïóïÂýƒ0÷o6ÁÓï÷ÿé™3g^µßÍ"áAÀ·ø¡ETœ}‘¯]ÞÀÖí»èvšˆu3ÝŸçQŠ½BöXÊC~«8€0±¼ÔÇ…óÊ(M¶·9[:=nPSÜÅìÚX¸Žë¢ßëáâ…s¢°pL)…(M	ö�ƒ_ÏiØ}êwÛxõò5üú§?‡—^|Ž–ªÍù�Yù¸ã8|PÇ.=Høø"+7Üâ`_y~ˆ ×á©ïž¨AÅˆmß5ÈgBlo…À¹µ3 ’ØÝ½‹ÓÓ8OBæ›&Ò³·*ì¨xÖØ”M�èvÚèuÚpxñ[%kãT#%áé·žÇ¯~ú_àû?ü!¼÷ùgqï@;æOŒ1Að�ííí¿)¥üGâ ¾E ?àéÑÐë—7pcû:]Ë¥–’¤yz,K¹Ó(C‰-��\�V#ßÇÏüÜ/!5ƒ RMšII H=‰¬'�HêÙ[ýŸ¤dBNO¶Å×¤	fÖV!¥ë:�œ[]V:�°-…üÜ²sÇP¿ÀfFG²žèö:Ø¼tŸüÔïá}/¼[ÍX:º™cH½Í‰€1ö÷‚ øe)å½E«A"îY —§y°.ìáWówqíÎ.úÝNŒ4Œ1ˆ(Bz¶4áºD‡>?§š=¤Ž30åÍÌ©	¡B@ÄTØ…$�ù‰Tˆ‚~NÂ" Óiˆƒ @à6@‡[Ët¨r$"Î  …�žñ%ì0Ý�"ÐÂa!Á^³ý $€Óá£ Ä?ÿ™ŸÀK/<‡ûûcï¾(Ü!ÊðÈú6ÿÏÅ‹?2M˜D¢y`&ŸxíÒnlï¢ÛnYº3¥¼9†Cæ¸ÅØº`�±Al?¢RœspÆÐl6µÔ� ÉbdFŠpô‡OqzÄù)$%ˆk$‡@Ž	€3ŒF#ø£ £Ð‡éˆJF‰~ŸgÇd'Äb{‡%’$þ# ßiáÚÍ»øµO/½ðœr+gÔ“ØåäääÃžç}
˜šùN„EÀ� ø‹n€Òý_}}×q 2ºs¬ãn�ôÔèu9ç&çŠ£¦ŠæL#3Ë¼ŽÿI¸w¶Ó2“KF?À9g<nŠì1d‘_Oˆ±ŒºRÅ4BÙ¿ö[/ã£ßû�xéÅç°p¤úœµ±æ@&ïäääg£(úíÑh4ÿ˜i‹$€e ?½ÀúSðú•ÜÜ¹�N«¥tI¤½6ä‡Æä!kÂMåZÆMJ²ÊÇe�±Ðˆô¼ƒAPfâ7ÇŒðtŒFÚ4'�Èœ³xþ"_N�çW¥õÚm¼²q¿þ™ßÇK/&óYn2OIÀ{‚ˆ>Öétþë:‹\êÀ"	 4Îžpx°‡W_S~îp�iÍª…cÈÈ”ÊC±›ÏªÆþÆ,A^¦T fä…¨fÝˆ/‹4‰'íŸ‡-ÄL?™&¡åLp§ûÅµá¯Ãæ˜Böx,Ì´£®%I<õ–søäo½Œïÿ¾ïÄû^x>^/Pá§!}ÿ¿Z[[û'�Nç•ÂB3À¢àÛ üª{”î�v[+Õ‰Ba�ÂH•gñFíâŒ‘ÓRbD7)/ 	7Ö•Ã¨ë°ÔÛS¢—×dªJ0ÕX †bAw›biÄÁÁ‡´#˜öûëòö4@%Y ß¡²Ö×q·ÝÂW/_Ã'?õ9¼ÿ½ÏƒóôÄ^j4sòé0‰_8==ý×a,‚ €ÿkõæÂáÁ^y}Çq”žYH£Ñ~’_ ­.$9Ê–™2I*V»c\7‹Æm†ÚB„ld`z%—n�%1ž1B3Æ	$KˆJoÜ úáÌ¬š‰‰ÂVÍ&Cd©®ïxò>ñ©Ïáßùð‡ðþŸÃ½½ƒxö:k˜éYˆ@Ûï‡ÿÙh4ú‡Q�•™A ?àí¨7¾þú:nmï¢Ûé€HæÄëä½ìÀVlŒ„­¯�§R�2ŠY÷’e‘ß&§‘cÆfáLYÎÀ™ÀØ‰E:�ÉGÊt{ Ù÷ÈÐï´±±u¿ü¿�¿ð¾÷(‡Clë¤‰0ý"ì¬êD`Íüýn·û«ËËË;¹]Ÿæ=ßü. kÎuÂÑÁ^½´	bOóx–ùMÜ;0x0«c.´áœçNf™„Á3Êà'™
Œ6‘"–­)¶-²Mrfõ#&&-kbäàI�LÍE×ºv­fñô}+Rˆ$žyò~åSŸÃ¿ú*VV—3ÄÄrí­,ùêóòõ8Ýf«ù�»Ý.º�.:�Ná_˜·øøœë+…¯_ÞÀ­�{èv:ùÜ.�ËÈL¤×dônXEc/�¶5Sº2x¬úÄ*¬g-oTVí1BÇ‹�ï”¯;•£Ä3–Òœ·àuŒ�A|‰dðÙÎèw:ØÜÚÁ¯üÆïâ/¼ô¢’©y�ñNÎjsÎáûþ_¹}ûö‡]×�ÛÜÀ<%À_ÇòùÚóóú&À8–è»y¿)DÆªX1BYlx2ËA²ÛÂp0–å÷‰:ÃŒŠ¢{˜úŒ©Ž3Hc„Æ8Å �*¥¥žÃù8×Í\ðœñó±Î§Áv~¥ºE„w>yŸøÔïáK_ý:VW–�}U¹~I ¿ÎÏº®ë6ýÕ�yÀõù	÷ïµ[ l|JŒÎ1DÏÍE:w\wÊ/g¥ÈRi
yRJë‰§\%-+ô_|iÙqy?˜Ò^XºFäb=Ký“ôMéŠyö¡ßmãöÝ{øåßüm008W)@ žð}ÿ§–––°ººšûWæE ? žò5ìïáë¯oÀÄ¦Û0ÆÃ)O³ÖŸ:—BX‚.ÌÊ¶tÛ±Úl¢³UkâLÍ[DBF.Œ³î”¶•Dep]ƒÖÿÁôŒ°Ž%–}Ò½V‹XÞÉ{1#Z%Þù¶·à¿þ»øâW_ÁÊJ?Ž‰²¿‰Jg†˜Ó~U"`ŒA’üÏƒÁûOOO1ÆþêÀ<à» üÀê©¯]ZÇ��ûèhî?¦pSFÍˆõX�„¶:�ké²Ø‘ÂRœ;¹6È7f#èþØÕ&r"Ã½3âB§YÃ0D�øå“rŒ«]ã’ÖÆÈ*Ýï$†°RÖùÃERÿª�º^§…Û»÷ñ+¿ñ;€–ù0Ny†ªDÀÇÁáÁÏa0àèè(õWf% àŸÍXG-Øß»�¯_Þ¬�>&¤Ö9yN¿¬N?öòóõ'uÁb™0V�ì¶™Õ'dñÝ¨@¶!.52¦-f–gZš‰éƒ™¨c`me|ú–PÏlÌÛ[B�„Š†}æmÚøÊ«XYî'³ë9âužÞ!Îø{9çÿe»ÝF¿ßOýÕ�Y	à' TßŒ}ðúåÜ¹{íV+'ž€e³ØÅßJy\Š ý®-ªð¡ôL°šÍb›ÅÅ1N()¢§«Db” ¥EÄ<#‘bÜŸ`p6v·0ô:mÜº»�_ùÍßXzâEç£Ñèï:Žs±×ëÁþ«7‚�q;½àËµZ›öîßÃ¯üæoãÎ½}ô:í$F Ì™”‹�ÈÚ:P@êØ};ßl˜ŒO¯búy]Fm—¨×�Žù×xž«Yo¢¹ÈT{jON™Ú«SšÐ/‘Qq>�ŽóLù%UœC„ð ƒ”ªNÅÞ…Úç3®©q"î³úŽ&b–LLx…ãÅ[CÆRTêùp‘ÈUµv˜08"’„_úÙ¿ƒ¼ô^çNh)`PÛRf>nÎäÜ¤õRJ4›ÍO7�Û÷ë‘TkÀž†fŒý½:ÏÎ†òoÝ¹‹ÓQˆg×ÔÎo” ¼�ä¥¥g$IJ)Ì�˜;¥Ÿ1?q,‘6fÉ<g�3~Nµã9gñVŠD¦Q%ÆyÀø5òkµFÑOÜ®AR
µ»ªN¢Ñh`÷Þ¶nÝQë’I×dê”zdÖ%Ø¯qZu�€ãyj¿TC´q_Éò�&cj·ÛøÒ××ñ;Ÿû|Ë?0vÃ8"ó¸Ìzã<°U«˜P•ø¾½½½ïbŒ}®ðá¨E CH)õVÓ4]cp]Aàc©ß…ç5ÆôÛ<af{?Ìê¬±’c^“b±˜pDëBÇç8ÌIëØ¤¸# @¦×"gHV—Mˆ™âbH8£4ú> "‰HJ¥š1Às]Ü»·‡ÑÈk‰hÍ–ŠqEJJÅN%˜C>ÇØ" µƒ¶Ág#©$:í§ƒcìïï§Ô{õ]:/õFSP$Aì|ÆôÂ ßoO»tr–™à?�¢è»yÔ�ã6s]RÅÈòzT¬ƒÒ¡ØÈÀªG‹bR›oÅqH± ÉH+?D3®Õ-Ó€š¨N–Ã$ ÈHÄñ7Íf[»{¸´¾	îp„A¨C¥	–ôÐj‡’0,/zêžV±­*2– †ó�#±R¥$O\<‡Ñh„ÓÓÓ'²ËO³Ïæ¾ïœrEõ0ÆBÎùÔªx-899 t¯F£q¥Ñh Ò§¢,C·ÓA³ÕÀÉ©oms^µ6Ë¸À•+RÆ6QHbñé-2C æ[Ùa¤uç˜ÓÇ*K�_ëñqbÍI«Yf;w`ëÖ-Gú½.â�qUt†¥²ðÄ@Ö¡Ä¤fŠ'Š‹ÙŒƒ3½IWª”õ‡’ƒ¡éº8·vŒñ”!œ‡´ÙtöÚ&ž<Ib@J	Çqn·Ûí›“ÖA-0g/Ç½äºsRJµ%¸ëa?8�[sß˜Ø­þÀØóé[F;×uÃBxÃñí²­áuÛ²+ˆb®×o·hÔ# BJHAh4\ìãæÍm4šõFöª"ÛF’1©z)î—âðZ À±l"£ÄÙÿ’”è´X]^†ˆD¼ÁWB–I�*Ä’MK)7¢(šR¶×$€L¤ÝÕP�oãŸ;pî€9jG6‘YnXªrˆX‡N= F`ÍÆa¤ƒZ¸Î´?³Xõ±Ôû×Ô­4Ñ°d³+CD�B@JgnÝ¾ƒƒãc,u;)äO+ÙB‹–„(z+«3€’”V¾é¿…øÖû�œ]]F¯Û†úµßäU)“S×•ÓÓÓ±²U¡A_3Æ¶cw öÔÔ­××uââÕõZ%{BÉøýZ[ÿ“Ð�QUTyIÚ(¥MŒ4ˆŸ¤¤îø#Úê’Õ¸­ó›:™&(!%8cŽN±uû<—ÇK3)V�€Xá3+»HÆýRÞ!Á“öo¡Ì=	Ä+Ñl>¾éÌÛÐëuéõëUTŸiß¤ÇYŸå„™Z�nˆ  „ ô`Ñï¨=kHFõõ¯RÃ°ÙÝØË–6÷ƒu­°Z‚[Y¬:S]ý“¯YF:ÅflRÞªS‰F»‰7ï`wwOM
–r}‚Ù�Î´)%Òƒ�Õ¦)ÀòBÙÓxi8=áì™%,õº8>>ÎsD|;O±9‹Z‹ lÿ.cRÊËŒ±ož  `œ£ÕÔÇ¥¥ódˆÇ¢ÛöÇ{4áÂH®ƒ¸.³‡³–5Ž#»qÉÆÄjìºÉ&”¤‚ !CÜ¼yGŠ ‘H+i«S–ÏßH/i�Õº2vG #ù›C�µÕU4^<?‘ÿ^ç‡øÖ\À•ÒÎM€Z`¨ˆgá®xž7vìç¢€�Áó0¨Óy-¢+qƒjv;†¬ö}¤‘!ÁÍ‰ ÁÍ„“Åµ³uŽsz6þÁSÏ¥Ÿ—p]Žû÷pçî.ZMOÍZë*eü<Ós–Z–B~›ÐÌXt@DÊýZüF0‡áÜÚª†éEòu‘>ï~QZJyt||¼1žÊd:ÁgXüDXÜ&€V«·á "°:ºŸ-1,3`|ò¦û¡q$6…’Ù\R§Fš%Èpb³ë„eB’iËž ¢Bâ²óU(ƒ‹ÛÛ;ðýz�.$(ñv‚®pµ(¡ ¤€¤PwÖ¨j¶”aqßdf1ü$à`8»¶
Î«#|Þ½ªˆoåoº®{šu—Ö�©½@šÊ7qÐq�çÝNífƒ�¯ƒW®!cÀ¥_n<å `j©#ãIÔ%IÅ±•Å›ÒË%&ÀÓœŸbIò¡U“l2ÏZe ç‡‡'¸½½‹F£¡“{gä:`í.¸×„ŒÀ\êz`§`PÄí#VÉ’ú¡«ªœ1œ=³j¶~Ãì€:÷rÊ\™õ\±©½@ À9»à`õbP§" ázp9‡@uºoÍè µÌ,,ÓÜØá€ã€¼˜Š+:PjB�1r’&€,Â¦�à©ŽoÆe©#ñ$˜õ¬A,bp]Ž»»»8> Õné|µ¡ËX«Ö[_:ç{¿8:Aôå/@ºžš‹Â8ˆ0‰×NÞ…™Ð«
Aa¹×ÁR¿‡PŸW0­ºSg^€1!ÄÆ¬Û¤ÌàcC)å€÷ÏÔ‹ª Ô.xžaüÔŸS?ãRß\sD� †ó7Ûà^áù‹ Ü;Ûˆ‘õL‚¤œ’`;¥® N§¹¿¥êXÜØ¤Ç¤�ÎæzSÜÛ;»j=pìÞ æ€¹X·Þ[…÷½FûC/A`ôK=øòG`¡ò}PiUÈ"]ùÎ®­ ×ëÂ÷Ã1 ýêI€	` °1ëA3€†+Rˆ÷Ëô°ª@P;…õºmH©fi ÛŠÿ‰õï$;A2r] Ñ€Ûh"|û3|Ëû ] ûg¯Á»r	a3E�rÃcŒ´À”
dŒA«áTÙHË<—2NU]·��Ý]ì¢é54!+¯8Z-°VôâK8óo¾„÷9À—¾ó/#Üº	Ž€“°ÀQÏEú:„0ùX[YÁÊR¾?*EüªDQUâœ_žçf‰Uá	­–šˆx §y\—£×m+$*ûP™w=þ¢-Ä)µƒs0æ ^áÊÄÏã9O½¤+/>ÿ ìNÎ     IDAT â¤ÌZ ƒÈ’Yõëx››Û\žâ,Ûc”Ô5þD¡Äí»÷@B‚< ù€; FÔ]éE¼Ð>$�cÜ¢…½Þv{ÔhìÄD>Ï~`mu	Ýn™s…øéåÉÉÉ•Y` ®pÓÀ!œóuµÉÔÔ}¨É@Yì�*vÙ•<_vmÔ8à6á?ñ¼uÕÃp	u6ÞúV4ww!ø@©8‘5S³ã§1$(^L“Ve&üfÔ%sÏó<âþÞ<×ÑÈ�$æÇápšmÐùXzò"¾‰ÏpàÀÓ ¾þö·Áï­€7wqc¬Ëú‹À2 %aíÌ
8w
Ç4ñ½O(“wMD[Žãl?PèvÒ<êÉ°õ(
A´8"°_C»Õ‚ërD"Êœ“Uò2­‹X¹Hqa Œ�qÔì gÏà- Îp9ðV W×Î êô@ƒH¦%@lƒ&»4Ä*NV�Ñm—Áæ™,8DØÙ½�á(@«áÅ^+©Õæ6€FòÜy¬.wpÀ2WÄû€þÙUŒVÎ€m7×|óV
HE"Â¹³gàp}¸Ç”FïöÁz³Ù¬ÞÑ˜É Œ±u½`uîèŸ÷2%z½ZÍŽ§`^zuQòÈ¸H²Õ‡O^¦Q8àzÝ.ÚýVôà 8 Óïâ°×ƒ³çABo¥.-SÜ
6HnÉ	bÛ±ø–Qœ"ˆ¤ÿç8±»¿¯N†×,iD wÏÜèÜ9œi«4™RËÖXZîâîÙ5P£8J£’1ð#�ógÏÀq\‘–È•¤®Ý®Íè2†tö€Íy¢7³ÌÛ–Rn16¿qË&N¤�h6ð\a(àfú”O úbl†Òpj©�—10Î º=tÚ–4 ìË>�Ãýþ8w 9‘ÔvˆµM¸Õnlkd8¿¡IHß�™–®ëboƒ“<W!Zšq;€ã^�•VÕ_èþ/Xjly	ä6À\Äy‰ÝV�ˆžëbeeI½‹Äµ¯‹¤Ä•'{ocN—yx�$€+Bˆ·Ï¢�•!½}Ÿ˜zéžë¨…Ú1.P
ù�‘ÉŒš`:#¢	 ƒ`J…q!;´j§/G§M@×ÐmCrÄ˜ZK+!¥rÄªÕ˜D©2)UÉúÐ&ÍC0ò±³{_Š™¿°Ë1€;¨Õ�Ûëa	@[÷ÛÐ%`Éœ%E pôLqTAâìê–z=ø¾ŸþN%*Mª©
†rÁó—ªõ²fòÊm·Û›œsL#’&!¾]Æüzž‡N«…H5¤îÆ“YñµÉ×ÏâW�&L˜kÄ˜j5Ñã@ÓR‘›ÐGÜ·Û\©@ê4F³»‹ÏÖ\�Hož›Qsb¢H»>Ç|ÿ’Ðh4°p€Ã£c¸ž)â0Î˜32Æ@ÜkµàvÛè2Åù´˜ê;ëõ ·¸å3èUU ß±¶¶Š••eøÁäI°:Ò`Ò=ß÷×çƒ6³à[ê9ê ~6Ïó<,-uE(Þé0l?æð°‘Ël• §ºofuõÞ–5h p­9h@ÓCäz ã�R©dñÂzÛ˜…ÑÑUë)H…[RÉÎfè‘Ø½¿!„ö~e¥…1r]ÈF�fm¤W)5	hà­ày`ÜÑqB¹o=~w“`8³ÒÇr¿To!LUïOÁ½=ÎùP¼‡PU¨çêvÇò´'èJ†…>…,T‰EùDÇuÐj5ABBD2¥{ˆwªˆŸ‘–Š“AFÒ GKî O€Õ¾�T®Á9Ìù`f."Y±¥!å Õ„ 5uÆÂ'e#¨L{Žãâøäû‡‡pW�¬;ÛÌÑªy8ž‹Òà1 E€×ô0r\(g&-P0i8¢PàÌê
š‡GÃ150ûí²×ÓÜ#"€aÓkxÇ˜Ìì ÆØóŠ`ZŽŸŸOð\œ3!ôYU*?á¸æ ;²�$aÏlTÝZ}@ÇqàBéÏ8RqWÀjs,ãJ8?‹£-m[ Y�kåÇ¶Š!ž´qÂÞþ!|?@³ÑÐ\ßÝ&zS¨£ƒ¡¤—ëpÕO«ïp‡'È_Ê©ªQ@8{fÜM…¤Í¶P®ß�Ý·Ë1°k·÷�ó0‚Á»!„ØgÀØÞÔóD|"‚Òáè÷»ðD‘€ë:1'#½ßˆY•èÛVœ{Fý "0Wç1—s8H#‡B$îhÐÏ%>nÄ2TÍ–Ä%*�!V¤Óê�rŒ|û‡ÊÓÅ,ƒÚ´%e¼[4��qÇáp3}g¤T8Ç„HÇŒªªÌÎ‡Qââù54<R&öß¬ú}©°1(0' Ø€)åíÜªž�IùÙ´$`©×A«áá`äÃlÁ�E¼Dè^š‰*is`ŠýùŒ´SÇap�F®ÓÄÔ6(ŒÔîfË@Š›¶Ú5�Ñˆ¯¤·eøš(NËP7õxžƒƒýcŒ†C¸ž§úIˆŸI©{@‚Ø9øÌLßcÕgvî)	ˆÂgÏ¬Âuyj`�ˆo`. `^ @u®Ýn_cŒ}p’e^]Í)++á8<×A…jQ¸�vø�Ú\ËQÈž#Hp©6‚²�kJõa’ „Œ]±1'&ÄÈ#êgã€�à³¶8S.ÆÃƒCMPibtÀ‘ÕI™Œi%Æ¤™^Ó€‚÷
p‰Ô’É"ˆ"�V·�¥¥>Â0R»TäØÕUU�¢t¶ÆXìzXæ¬I'³0ÄO8|³é¡Õj"ÒûÐÄ·,uLÆÜ–�ƒqi©Fº¬YÜ"ÕnfAºÀ8I¨Ý(¸ ’‰aïÃc YÝÚýÊH m;®‹ããNà8nÊ~ r¢5	
±¥€aºcn3 "¨�sSä1=EBàÜÊV–ú�FÈªSóäø™ë€s~}^‘Çµ lõ]9‹æ�øÙ{RJ4M,õ;Â-!Óå(QEÆWž˜M¡) ö8åR‚¤@¨‘(K @$ÒCJ%¬°†D�É×ïÕ†³™u¹„ÌµÚ÷çèøB�:ýR*•®°0B
„H@   Â,Róq Ä”xd&ÁÎœYI9Gˆøæòºã8wÞ˜°úæJÖTÉë¸E‰ÔÌnÃsÑëvEaÊa«
†ÃÆzy¤ÐZRz£)ÎÀý „Â!¬}u *F‘ï~ø   ´×‰@ÉQE1Â“e#¤¥`MÈé2Üa}žœÂuxÂù¥" AÂÒzñ1_-ta£‚ ÀØ_*$ûŽ|DþbäC>ú*ú5Mæ—¢ ÂòÒ2zÝNL EÈ_Å3TÕm*¥ÜŠ¢(|C lõclK h,
ñ3íé™6Àb4JëØ” ‘1XÓÒA°ÍAQòD¡ÀH!Q`ü%‚ }ˆ(EQ²' îi#Ó´­º”èò”ôQÌ�;.Ž'ˆÂM×Õg	#ƒ€(ÙQ ÖúGˆü§„VÀ€ú 0Pz„^Ð#Ç½)å3Å D!ÖVWàº£Qî7³É*J…¼g-Ø˜e#¬,Ì�  ÜbŒ]áÙÔÆ²ŒœI÷óê zÝ—#ˆ¢˜[Æ_súTX‚zØR�ôµ” .@‘ ¢A`ˆäìu !€À ýˆ"¥ÿGöÂLãÕ`Åí$ ýÁMŸÀQûa€ã“A|ô«4ì˜fæÓzÁfY£à£üãœàFñDÆÀ	âèˆ|@DÚsTäš,N‡#<q~­fG‡‡cßÇ¾žñóžaŒ]šu¤µ ì>"ŠÍÆsØ³d¥Öý²g+åÙù’$V––Ðò<ý júGéîÆ%¤_´­£Ç\Ø¨$B€…¡R§hµÁà‡/�¢Ó!È�¢"Š�Þ#pDjëõ–0ˆ'èLW�jä9NO†F¸“·\1ï�è±†!0"8:Á€�îwµ*ìÈÄÑ±ZØ/Æ>PMð‡>ÎŸ[C³Ñ€ˆDN¤m-®^™H„ë“˜h¨E “ô.¬á;«"ÿ4ªRL R¢ÝnÀk88>�àºNŠË'¡ÆyÅ¶(™8þÑ`€#	-F3bÀ!á` æŸB„J� ½¹•’8&˜òÉ	“t<æ«Æýš#Aàäd 	ªqxSyQ Žíb?Ž=ÅÇ$èà ,ô�0&¹«Kïà8X^VaÐBï$QU�Ÿå]{Ã Õj•Þ'’—…HÒârÓ#¾�v=ÍFaª3ºRjŽ5³JÉJ-¥¦¨üÄ#¤x`QˆŽNpèÇ¥úp '8€ðèn(ý_HH)RêMÄ¸Ú–?+ú-5(e¨[àÇép„áh¤flÇ^†AX†ô<¯Î�"ˆÐ¿»ƒûàþŠRÙNì8:8vïBŠ@ëý”S2õæC	ô{m,//!‚”šS‡ËOA0»Æ:/"¨E ÂOã¹€<˜Ö8ÎÓ)¥äè´Úè÷úðG7Ðj4svÃåí�h3�ª9³‘DÚ$ T   îïápàã~§	Ÿ”*½`ïT‚îíA>D*UBª0„X2�@\/´Ôž´ JJsµ^›;8=…$Ê?û ì{K€ÂP©fÛ;Ø»w€Û++Ø—À1·p´³ìCõ¶( &ZÐf
¬,õqvm#½Ê�{¢DD[Dt8Vh˜åˆ¤<¸n^FÙÉEyÙü	î0´Z-¬ô»ðý ‰Ý‘pöøå1ÈÄ(ŽÝ¢2S.Àý!èà>ö�°}îŽ¤
‹ÞaÀýƒÈû» Ñ)¤ïÇ�„0¸+ÔŒsŠ ÔÂa	Àü£N=•�Úøƒ £¡ŸÏýÍ˜Œ!-ãŠ€¢4»wp|í.½sï�À16# Xß�€ü¡ZCåq&H#¯��ËýV——ôi•	ä}³:ú¾�Î©k³¸ÇÓÁ\m  ×c»Œ±sÀbßÎw†V»	B$„�VNZˆmÖÄ[œKË60ÿa1Â9ØÇhë6ž=‡k <R¢íôÖð{÷ ‡CÈ(Šwd–¡%$8Ô~ýœdLt\ãRl£˜Ö¥Šû9Œ‰ñ%ž™Q#­ˆÀF°Áð¯¾ˆK|/°¬Ô [›û`_ûØp øCK�*Õåñ÷?ŠB<µÜG³ÙDF¹›áÆu”|×²u¿yu0Æ.Í{ï©Z0é$":l6›[ ÎUAbûÞt\èv:p9C
pG¿PiAªÔ˜^ÀnK  A|ÔA6:;=í5l¾÷9¼|¾ÀëÇ ^}8=B4 " Ù Ø f�$@ u–°î«0í˜–õÆ€0ˆ0Õv»Î¤v%•Á|xñú+ØûÌïá«ÿÞ‡ú~úÓ íˆN�À¢HK>Aâ€Èwa‡>ÎŸ=‹f£�ÁÉø™ÀêÛLV{òTÛ¢: @J9W0ßy  > ÔçöEÏä•1œ`uežëh—¤µ7Mì2Þ!…¦±îo4qË†häƒN�áÜ¸ŠÓ?ücüé|8ÄþKàÊ%„§ÇJý	EB<¦EI`œÀ9Ymê{ñ¥åÀ8‡ïÃH¿ß2£´ ˜:3™…äÉà8}ö·nn‚CÈëë `:=‹"uŒ^…OÉÀ�î­‚ÁÉÏ¯¡Óia/õ=ŠÚ¤¼ŠóÆª@jæµˆè2�¿iÕ4jNÙóBJô{]¸®‡‘ï£ÉÍ²D£ç3™žˆ=4Ö©)*LY€Â ìä‚q°ÿïÿøÊW O� Ž�”±)ÍQ¢�d)ÕÞ›±+@Á!Ãp8€šDw‘ÀH�¾ _×¨ ½ÑPmÕØ:…øã; ÎÀ]1:ù@å“2ÍI‘9HX;³¬v¨�2µµ|nÏçc û ®Vì|e˜·Îùzv±Â<8~nš€f³‰V³�Áé DŽææ
™Á\Ï�‰¨Œ~3Uµˆ !	\D )59€?øœ2–[ÈÑ)hx
"V©d\‰6µêEŠþâFÌ	Œ†ñJ¨Ãµƒ0ÀhäàÖÿ"˜ ")cXE¤šI’`‘@rdREà|,TBJ‚Ûjai©¯×dK0K3¨«úLJ[×·Ü¬ÞùjP‹ *ê_1•Ö‡Ùü
:!Ú­&zÝ6nÞÙ�ç90KI˜µrK½VÜY²­¸”‰AJ:
4
)ƒ‘;Š@O E‰$Ÿ²ªÀGÖïÄNE†a¨fgNÆ‘âòRä“«¤ýÄ…%c�BÆ“K)Ðí¶°¶zaŽ}ãªö@]»ð ‹±6c>€f]=°jÐ‘‘R¢ßíbe©�Óá½NK!£vor®ýô”øå5³Ž¨S¢¿h½Úˆ& LTiÕ›h>R?Çâ˜{¶Wè~ç®_e@$B„Q€9ÆvY�}gõ	L-"RÛÆH©¾½ÝVgÏ®Æ'Bæ°&Òu•û¤tÔ¹­³¡ŒtÔß¸å8Î- Ï˜Œi$@"B ÙðÐïu ¢R(�^…0˜í¿ã:õ™¸cmP:ˆÎ„('Çˆš…ïÖÑëº¼r‘t‘Rø—gH2Æ’•TÙTu>u2æ€Ya�a¡ßï¢ßé ÓaÐ6d‰¢î÷Îæ1°õ9)‹P�J\=3//PÑóf'Šn·ÆB)5Ç`\o#¢'ÈRñÿDñ†¶DI}j£«D_11þ	>Ë¤œ‘I§R3Ï“�@Zý™ÏÝE Së3­=„ü0ÄÓgVÑh6„ùgÏñ­ôú?ÀTP‹ šÍf¥rRÊËDô]¶{¨�øUU£•åe¸ŽFñ\€d¤‘Ÿ,$6jb#ÖpúX: Î~Œ‹Û4è�¨L†€`árñ×âœ!Š"Jtë‡ˆÀ9çR€qœœqáÜYt»îÏMÍÉË³ÓRÊ«3�¥ æ=lÊ¤În­ê«R~ìy gV–á8¡ˆàAm˜lt{Â+^¥/ÂEìµQ3µ¦b¤7mÚçŠI­þpXÒ¥*.›jÉLo4ÁÔbyÀø8¿¶Šn»…{»*¦hJ¯N�òŽã¬Ï6˜|˜w0œ�«À‚?Öë%Úí<Ï…ï`OïÚ–xƒTy¨4$íƒ¬™ÒíÉx†`•×uÄêKÜ¨&æºp¦§KAà…Û><ÀÀÀG
’bpKK=¢(Jm”°¨ïÍÛ$¢Jh]¨E U¹clƒÅ[ÖCì¢t™O¹Ýn¡ßëàäx ÏqÀµ�ŽÙµMéì‰.{„Ìj*ˆÌÎm†RnM²;Pé]dA‚éM¤(ß;ô�à0®N•‘^³�ÕÕD.,’ÑJ¥ž×6(Y˜ç¢x68çD´bgÎJÙ|"B$$–û}¬.õ±¾±…FÃƒçè­Ó)m±ÉŠ1ÀL’Åö�x€²}AØñ”‘šÁ6›t=ô@p¦ì–P¢ÕtqþìY˜@êØ “Ê1>Îù†§7›7Ì}&XÃ:&h$¯êM R[%v:-,÷{8õ¬¤¢1cÝ°$�J‘æøš,¶ŸÞØ6ÕŸtöÀ Rh}¦ÚÜ@‡k3Æ!´´=³Ò�™á<¤{YZÃ•¼Ìy@-ð<or!D´M uÏ�­Ã%¤”ð\G�boNkÑÑŸD¶Î®¶@�‰‚”’ÄóÇÿèYL j�oå¡—‚��†ê“æ¸ˆ¢@­Ãnµ¸@‘&¢¹íš…¹ì�œó+Ul€ißN3Æ°²¼{!	€5lÔiqx#t:®2V™”ÔxøMÕÅAEŒüÏ¼}íN{l/ Tù)¿cAZDQtÙ0ÒyÃÜÝ lØ‰2#¶¬\ØF±ÙÎüÜ¹UpÎ!Ép³\ñ¯½#›ú×&–ð2kÆÍ‚—ù@ÞŒð#JÇ©âìÙ3Xî÷powY¤œñKÊl1Æî.êöZ`Îç­Œ±u;XÊ†<¯ŽÉ/Ë+z –»=¸^¤Ø¸œµhÂ×·WˆoòL$§Ië‘”Ž³<jŠ�œ¡ œYé£á¹-‡È,^ 
xpežû eaQ^ 0ÆÖ‰H‘“:<®¦[¬HR�Rª˜ Vý^R’Z‘%¬ÐgÀÄ)'“b È&S_<‚Êc­�4	Àk6°´´¤¶…Ï±íæŒø�RÂuÝM×uâd`Àuè˜ DàØ‹Ë¾x!%–—— æàÕõ-¬-÷21ø‰LPñìªžTC �ÌÇ°8„] S›ä�{p{gÎœg,÷; õ‘|’† ¥¼b4ÎmÃ:cì!ÄT“be×v:Bœ[[Ã÷|Ç_Â;žÞÂj¿—¨8 HíÑ‰sbõ'Õ²þµtÚÄ4eŸƒÙe¨Feå&ìàPÚ§ª¸SZáødˆ÷½ðF£ÑØŠ¿y¸;ó¥”òŠïû1€�Å…B±a§³÷‹Òuï‰(ãÿÉøï£Ýîè2�€Öc±1JÖurs¬Œõ“eŠ°âf(S+©»I�æ°­±™>dû“ê¥“™{¶ÙSØÿÌ%iq¶<À¸ƒ£ÃCìÜ½3ÃE!¾!ÄÂæ €Åª@€öÙÞ‚ªÞ l^Þsvž‡‡‡8<<ŒÕ›ïíX}•N¼ Özá"ÄŒí–~Öz>)—_?òÊ$EÇž‰K�	æËëVºmëÑñ{)�—¤'�;ÛGsR™þ_%mò&àÔçüFY�Y¡<õÔSµ*?==½rûöm óAüI®SÖœ._U­Ú�ªnÛl�UŸ¯jTNûÜ¬e'íþ0'ÄWœž·¾¶¶6xh¼@ûØÇjUþÂ/\ùæoþf�½°Y9~Q¹l~ÕêÊö›´ó³Pfš{eÏ—�]6¯Ý*ýŸÔ^‘n�×Î,:¿É«ªExž‡ápxíŸø|ßŸüÀ”°P¿Üòòr÷k_ûÚõ ÖÌ ¦á´‹à~U$R�çóîMkçLÛ�i‘rÚç§•†e`Ê]¸pŸúÔ§~â'ò'ÿV¥§„EÃ VWWŒ±"Z›ôó¸e�8é/ñ§EöE ~Ýû³Ö7OÄ7 íŒ…À@�2ê€ápˆíííkÍf3õá²&ß@!ä¥³udïå•�Ô‡ªíäµ•­£Ê8ª<W4Žluê©ÓßIõe�ˆPÕwŸW'c£ÑÛÛÛ—MÖÄŠ¦„ENÇ°��üÉŸüÉÆÊÊJ¥™}iÓ"W¯[WQ_Ëê˜Ô·ªmM"´:õ”¥‹îeïWy/“ ¬�Œ1ÿå—_¶=@!‚E¨@©Žv:�ËlÂÌaG³óÊîU¹¶ûP·�YúZ•kÖm«jŸ«¦«ö+¯L¤¯ÚO"‚ëº×Z­Ö�J•Î ó&€1*=>>¾bf‚³ëA"¾�WôQ§Eè²:ÊúVu{ð<˜'âO“6yóD|ZÚ
Õ¾1©[À|Cjç©åŠ¨O~ò“×÷÷÷}ÐT¦(ûÙòeõLRŠêÏ¶UÔö¤¾Nê[¶þ²:òú<©/‹HÛyUT�ªýÌæ///ã«_ýêúúzîFsU…ê€Ñh´íyÞõÁ`ð®2.jsÄªÜhR}UîUyv?/]TO�:«´3/n_t/ªô³(ßq0Æöç!üÜ$Á¼ �*¢»wï^ï÷ûï
ÃpbmD¨Š Ó"ç<�{š~ÔEüYúT%mòª"}YUË@†ØÙÙ¹œ{3�¹Á< L$±ÍÍMúÂ¾°ù‘�|ÇÇÇñ�y#Œ¹ÖSèh6›¹Á{j}Æ5kþNOO±··‡¼Øóy#þ,uÌÒ'_�µµµ1Ft||Œ(Šâ}Je¦þI³±ó@|"µòÌ÷}|þóŸß*mpN°hˆ N§“ZÕ³Nl~=ÏÃññ1¶®oÁq] 	5ˆÐl¶°½}gkww÷
€ž®fôÄO<óüóÏ¿m8Öîç4cª[ç¬íêÝø¾/>ó™Ï|‰ˆB"âÐ'Á>óÌ;?è5<O³Ž:y¯Œs¬,/å†MÌñí{D×uwšÍ¦q�–qú™¥À¬PÊýÍÅ­[·âC3¦Aê:ešÍ&®]»Ž?þã?F»ÓI}4Î9–––ðÓÿà§?~ëÆ�OxÊ°óÑ�~ô‡¿õ[¿õo\¿~}l u$PÝçêÞŸÅh·ÛØÝÝÝÿ±û±Ÿp uŽÞà‡ÿÚ�üÔsÏ=÷þ£££Ô¾ïãÜÙ³xÛ“oÅ`0¨Õ�iò=ÏÃÁÁÁ�ÝÝÝ}+{îÞ³x�ª ?€Ï~ö³×†Ãaa¸ƒýRó^p^™<Ý”HíÔjµ°¼¼ŒN»�N§ÿ---a8ù»;;÷ ¼À[¡ˆà™f³é%Ûn^{y}ÎöeRÓÜ/j'¯/yiß÷G ÎxJ�ÿi Ëwwîlt{]´ZM´šÉ_Ãó°¼´„F£16ùWÔÎ´ù Ðëõ°¾¾~õêÕ«@zëì"|›É+4­¨ÄùÍ5cì†ëº;DtÁÜ˜ÄÍ§QxžÇqÆc5›lmm]‚à @€ÅÚAp'Þó¦ŽºQe“ÊVcYÙ²2Žã`0œB½–¦þu ô®_¿~-ðÕ9Å‘e;Ì®lDÓŸÿ<éžžç™ C “œZBÌ;Â¦ÁSÓP  ùIDATÖ¸î[·nímooßh·Ûé+r¸[•ëIåÇ�ã8cF°ç5°uýú&€ @Š < ­û÷ï‡£ÑœóÊmå�a²VáöUÚ-«¿(í8ŽŽŽÌ&³MküË—¯\¾½¿¿?p3›Ÿ¼†›’Þu¤À¤{yeoÜ¸aÀàÐ$)0é^!LC ur.]º„×_ýj¿ßPñMÚ¾.C2!\×…ë:©{œs��­­ë[ ºPÞÕ¿­Û·o£Ñ(ÊS�òÚµÛ®¢zLª§Îóê+{P Î9ö÷÷äwt¥GwïÞ½–=B¡á5 ¢\¯Ú¼HÖ4üùŸÿ¹1ÄlÄ¯Bµ¡.TÕûÇ$A«ÕZÏã€U‘½*’WŸã¸)¡èº.�ý×^{í”úã@}|@c{{;:==Ç©�€“ú”w¯Î˜ÊÒeõ™<ƒ¸Œ1©#)•lÆß nÞØºîdö~b \w\šæµ_Ö�* ¥÷¨ÕjhV�ž„üµ‰cQ*��f píÚµ�*"´Œ£MâvÉ5ƒë¹�ÖžnÍV;;Û7‚ Ø‡rîçð„8==([·IÛ†`â\âOâøv_…üQa0øPo€y½ë×¯m�†Cp½ç¿BH®ëB�,m¯,¿*xž‡ýýý[·nÝš:7Uh^0føfÿè�þðZÞƒUˆ¢ì9sm#&ç®ëÁ>v×uÜ¼yã”ßÛp?[Âééé¨H…j×A|“_4¾y¥‹âtÂ0Ä`0�æþŽþë^¾|ùîááá©§¥€æÈð\"C|�N[[[×.]º ­ÿçá×\`P¤úØp÷&ç<>åcVi`®ó“3††ç‚4˜ÙÅ«W¯nè ýá( ££#?{âIU¤›$ŠÆ4kº¬¯6ïÖþþ~ %Ì;0„Ð‘RnoooµZ-S)\7q(¹ˆç	œs³•Ž‹fŠjêPµöæQ	òUŸTúÊ•+×wvvn›…*ˆRv¯Œ#3ÎáZ*¸®‹£££ÑåK—v À|xÇºÆáá¡ïºn%5'EHYtÖ´�_%2“1† xH3 J*È›7oÞä\m{"¡Çó\Ø™óFzŽã`kkËÁ9È7~ç*f%€‰ª�þõ^yå•ÑÕ«W¯w»ÝÊjCç+C4ãíðÜ„ š­&vv¶okÿ¿! Ž4ÐÁÁA*l;¯Ov›U&†æ�èEõ×Y}¥Î%qïÞ½@�×ŒŸ[×íkW¯ÞõNlDp]Üqjí;-pÎñµ¯}íšN¦4Lf²Óµ9‡:ÊTûåÂuÝx‘ó$$«Šøùj…ò‘Í™ƒ[7oÝ �L~e‰€ÆÛQ&…Š/ï™²{U½hÌ“À.Ç9Çh4ò#Œ«€† Ú››»‡3ùåêxªqª%c�FÃv�–1Uä\×†E…BdË8 põêÕkEc€qÎVUÊÞBÆ“a€2þ6¯nÞ‚B~›0ÍàûÙpS¯]ªH®¼ú²ã)«OJ9óBóÓÓSß÷}B¢^dßC[ˆèh{gûv«¥TÕFÃ+Ý3i^ =@ûëëë70ÎHÇlÊÌõÔ0hÒdE<ðgögWóÎÈ"L6/¯Ì¤{*BÙG‡£�õõ»P³¿†ë™~™_÷ààÀ�¢(µïeÇ­‚¸eãœÄñë¨9“êÔa	$Òoì �w”´ÔÀƒc¹†­V;;;×_{íµ]$Œ
¨ÇhkÃ¬±@“l€Õæíó8I-°ËLâ¤¤”àŽÆ8ZÍ®]½º=� üÿ¦?¶‘Å8ûûûA†àœCQÚ—*éiž/o•Éækð¡ÜÀæ»g ð677nù¾Š‡j6ú ìÅQd÷—1¶©û×Åx�¹6�È»®M¥³„B½“o8‹ùs_yå•ë»»»ûÙÈÂ"N7IÕÉ^Çi)Ñð<ÍÉnÝºyêÅæyâþÞ»wÏ‚ òîÓrÿ¼´É+2¬³PU*™<Î¹™Ž�|Ì»h_»vu÷à`àx.<OÙRuvŸTûµM�4ÀVÓLç
óvƒ–ý6¿ò•¯ìÝ¾};ö3×Ññ‹ÊfŸTüŠã8p]QáêÕÍÛGú1ƒýîÝ»�ïû©/=â×I›¼Yôû²zMžã8899ñ¡ezu#Š¢Ã»;;wš^Y¯Ø¢Àó<\¾|ÙÀYFe Hó˜š0¦%€²ŽÙz¥}í8°i8J®^D¥@‹ëv§�½ý=c}cJÿÏ{Y±ˆ=>>OOOÇ\¡eíL›6y‹@|“o€1!ƒÁéñÛÚ’[Ü¼yã–ã*&bp²(Ðm×­¬<o¢ÝÏ¼Õîä,ÁpU]Sf lnn^ÏÛ*Ñ@ÕëIjçÝn;;;Fÿo˜¢9ã" Ì÷ýÐ‡(êßƒDüìØËê-Ë×q@Òzsâo¹¹¹y;Š"xZ]]$¨@ÅC±¾¾~Éð$»ˆ	×‚El�˜§jÄm½òÊ+×…‹“ÔUuk»Æš�&®]¿~€�ô‡ÏþIý|8ç"Šú:/¯N•²v¢(Âáá¡Yð,‘ aœÚ×¯]Ý>:8<í÷º Z¼þ¿··wóË_þò.€–uË¶Uò¼Œ“˜ïD˜Æ”¥Î*~Ú¸¼”r«Ûíbee@¹¨ñËÊè	ìbýò¥[Hlã-È~x0
‚€ÖÖÖ`/Ž)j¯JÚÎ3„YF eeíñÙåÊê‡m6›8>>A!¿!€,0ùžbïèèðî¹sçŸ ÂÂÔ ~¿�ÃÃÃ] {P3õFí±í í	š‹Q²¨EñEg÷_øÂÆç?ÿù×…^EL#}\Þ¾ÖéT=™´yvŒ#ôz=|éK_<ºqã†Y c#|Ìõ‘¼l _úÒ—v.\¸Ð¾wïˆˆ1ÆÈjºÍ±×åÊE“m“òÊòsî æº.qÎqûöícŒ3€"‚`_ùÊ—¿øÅ/|¡…a˜eydÒµ�Žó———ñÅ/~ñˆÈDêÆ}°þb[­à:/=ê’´	•L©5V'íIûÏL¼¸°¸ÒÑˆöŸ—síYÏxÏe§÷	ê…±š7œý³å}™¨�ª>?+wËC4Ó¾c‘�VúT?'2‘þ B+Zy¡•å\G™z"¨ïj·#‘ß¯<5H�¥Ìs_ IÆ‰ùu¡—½WdøynòÍ­<‰$Æ%BÚÞÉã0e�7®:0Í³ó&Ó�2È‚µ~:[¦H…´¡ì[æImãï;›ž‹ÚcÃ´6@Õ{yˆË�^‘T$ò¤AÇÏr[âdÚô�cœ �sMVšròªÂÜ?\Ieˆb#°Igó³×H}Bšyå�­NÚïÖŽ:ÍjffÚHó,
®çJ³H€<¤AIÞ¤gŠ �Óä‰î")’-Ë­òy«Ž&yÂ‰æ 6¡"s�'¤•—åîYÕ#û'P,ªH‡¢þ—áM¶Îì=;]}@FžÈ›y+‹èæš[÷ì6ò>†�üF:dgE‘ó[6¾‡ò�¤è�–©Ay„`tóID’g×…<È¾žZ„0ÈCà¼�•'Ží2Æ‘¿HL#ç×†‡ñm(BŽ<‰0‰lŽŸ½ÎJƒ:RaÈ“rÙûµÚXôæ¸Ù—�—o§%Òf_0·Ò†sµgž·¹½ƒ4·/R}Ê$Õ›� ªAÖûbK�<b°Ëgïµ—íO•qÌ~@††<"0é¼Ï¬k{BÄüãIH·ñm"šdôfë}”�¾ª0`œƒç©BYi�ç¶™çóìŒl¿²}Y8òó% ƒxæ·¬\•?[ß·÷ÏJûYÛ6(ò÷#ç9×&�ý qØý+R²ˆo~mÈþÙyÒ ŠÿÞ–e}Êß<Ô¨,JäQr‘›�þ¶¹¾�ðö1^ÆÝf¸vÅ“�ìöœ@™±UÓºCu¢ì»ØÌ&û}l®.¬¼<(R“(SG^;eªP™7h*XäùÎMº×·‰À.çdê4o¹yÈŸ%€<Ä�zQPEò]¤ež¡"•(‹üY[ HA^ê {mÂ˜d©³¨#Y©`#|•ù�ì2oO²ä!?� |–óçýæÁ£H“�a	�ý-òåÙÙ¿"µ¨¨ß�
”Uì´ÍùÍ �„»ùˆgsžl[¶KÓVul®Ÿã»=MYùEªÍ£DeHb#ZÖ¶‘™ë"B°7;/�GE¶AžT)"¸¢qåáJe˜† Êtß<¢ÈF‘ºc^T^�ù¹um@‘ÊSOŽ’<ä½Y a²„P$²ˆZD YbÈ#ÊÔUáç"	fU�òˆ¡L¤Ú.Î¬d°³ê�p~ù‚›x[Õa9×y\>�(Þ¬0I5µÓ¶1lçg¹´í÷7¿ysÙ	³"CÓecªu	 HíÉvÂF2›ÃŽ]Vw–ãØÜßüÚ>Ïsdîã\Þ&Êä}£A‘`®Ëì‚"BÈ““þòÔ û7ÛŸlÿ³×•aZ	0I²‘ßVSŠ^¤�¨ \‘‘[äãÏêúEê�ù-Ï›²Œ+±&©DEúz‘·(‹àE!¦½²þ”õ»ÌÃ°‘ÛVaì|;Ï\ÛÈ]4 £öäéùeÈ�œk;¯á¿QˆÀ–|ejEBæ¹Hó~‹¸z‘:”}¶ˆûç9J¦VƒæåÊrü<ÕÈDV2jLvA‹­ÆØÒ$«æLŠí!ŒCöúòT¡¬:Š‚ë<Ä­*&@^ûÙ>�¡ÌK*#Y5Èä™gì{vÙ,Â×áúU½<ßˆ„�‡(eH•w-s®ËÔ£¬d(Bò2¢+êûT0/#Ø¾ÎŠW;/ËÅík›L:ÄV7®§ˆÛgûü�J ö·Š,«ƒgU¢<"(“2§|îŸíÛÔ0‹�GÀ8âËL9›£iD¦œk;/«ÙXùöý<ÂÌ¦ËàQ'Ž2)“y*lö7O’ÙE*RÞ3EùÙë¢¾U†yÇÙ//kç�M6—7ƒÌãööÜA‘‘kCuçQGòi *G-"‚"‚ÈKýÙ’dR~öº¨µ`VÀn4«VäuÊÜ³}ú¦ŒQoìçËT�¬JS„èov?+LBœ<+“uÈ—“Ú(êOm¨ûñ'!™}¿(äxB—¹EmNÒõËà1T/Sf”I„".^¥LQzR¿*Á¬`òŠ¸m‘‘j§ËÊL"¢¢6‹àÙ«À¢$BY¹y"Q^.Ì‹ ²×u9¶mÌRA™IÏÖéç$°Õ°7ÔOá²ên¶\Õ_s=‰PòÒ“êÍ+7þR Q0¿b    IEND®B`‚‰PNG

   IHDR         ôxÔú    IDATxœì½É�$I–æ÷‰¨­¾¯™[Fdf$*"3Š�á$ÄÌ‘p	ðÂ¯¼ò?à‘gÞ¼’Óè¥ª«*këénPèb=5µefDÆæ¾Ú¦ªòx�EEt±ÍÍÝÍ]ß¯;ÒÕdSQu/{Ÿ<y""þäOþ„À0Ã0L­�WÝ†a†a. Ã0SCX 0Ã0LaÀ0Ã05„ Ã0ÃÔ Ã0SCX 0Ã0LaÀ0Ã05„ Ã0ÃÔ Ã0SCX 0Ã0LaÀ0Ã05„ Ã0ÃÔ Ã0SCX 0Ã0LaÀ0Ã05„ Ã0ÃÔ Ã0SCX 0Ã0LaÀ0Ã05„ Ã0ÃÔ Ã0SCX 0Ã0LaÀ0Ã05„ Ã0ÃÔ Ã0SCX 0Ã0LaÀ0Ã05„ Ã0ÃÔ Ã0SCX 0Ã0LaÀ0Ã05„ Ã0ÃÔ Ã0SCX 0Ã0LaÀ0Ã05„ Ã0ÃÔ Ã0SCX 0Ã0LaÀ0Ã05„ Ã0ÃÔ Ã0SCX 0Ã0Li!®ºÃ0Ã\2ì`†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Â€a†aj †a†©!, †a¦†° `†a˜Ò¸ê0Ì¢xúô)>ûì3(¥æªODsåÍR~–vf½çEµ·¨~,úy	áôô¿úÕ¯Ðëõ®º;s)° `n»»»øì³ÏJ�Ì´ió¤W±¨öç%‹3ÓÔ™¦ÍE½Ã‹¢ÑhàÞ½{øÍo~3·ˆd˜ë æÚ#¥Ä_| •_Ü)‘¾À¦—å!@D•umþ¸ö§)3m_/!öööðöí[\Ú}æª`À\{=z„���±£6ßøŒK›7(«YÒgmcš¼iqY{Uœ7Ú2ùò—->|ˆ££#$Iri÷e˜«€ƒ ™kÍÚÚšsý„•F¦,}–²ãÒÕÖ¢ï;oÞ¸{]¶˜U4œ—N§ƒû÷ï_ê=æ*`À\kž<y‚v»]ý³˜.oÞ:7]Üºu›››—zO†¹lX 0×–;wîàîÝ»c]ÝÓ¦ßt0O�óÝë,¤”¸ÿ>¤ä¯HææÂÝÌµ¤ÓéàéÓ§Ë±ÈÒy:`6677qëÖ­K»Ã\6, ˜kÉãÇ�±ººê\ÿ‹2Æ7YLÊ›·ÎM÷ïßG§Ó¹´û1ÌeÂ€¹vìîîâÑ£G…ei,¦Ë›§N]§�>þøãK�A`˜Ë€ s­°kþ¥”3/ec�¥ótÀôììì`ooïRîÅ0—	 æZñÉ'Ÿ`oooâšÿYóê&&åÍ[ç&Š )%îÝ»‡V«uá÷b˜Ë„ smX__ÇãÇ�ÝÈÑ†¯Ž"`ž:uœXYYÁ�;w.ü>s™° `®RJ|ï{ß+¬ù?�ËzÚô›,x:`znß¾����¿Ã\, ˜kÁíÛ·q÷îÝ™iapþ¼yëÜ4 ¥ÄÇÌ{07þKf–žV«…/¿üòBŒ‹€Éðt@ÆÆÆnß¾}¡÷`˜Ë‚ ³ô|ï{ßskþ/Êe=múM<0wîÜA·Û½Ð{0ÌeÀ€YjöööððáÃÊSòf�EÀùóæ­s“D@«ÕÂƒ.¬}†¹,X 0KKExúôiåšÿ*x:à|÷Ohöööxo æÚÃ€YZ>|ˆýýýÊ|ž¸ØûòtÀx<xÀ{0× ÌR²ººŠ'Ožœk¯ÿq°8Þ¼unŠèv»¼7 s­aÀ,B|ùå—…ÑÕeº¬YL†§xo æzÃ€Y:îÞ½‹Û·o—®ù¿l—õ´é7Yðt@5¼7 s�á¿Zf©èt:xòäÉØ/ÔeÉÖMLÊ›·ÎM¼7 s]aÀ,�?ÆúúúÄr<p1ý™”7O�:LÜ¹s+++o—a. ÌÒ°··‡Ï>ûÌ}žä&æé€‹éÏ¤:<P¤ÕjáÞ½{<À\+ø¯•Y
¤”øâ‹/ „¸”5ÿ‹l¯n"`RÞ¼u®»ØÛÛÃöööBÛd˜‹„ ³|úé§ØÛÛ+5þ‹0³Ôa0]Þ<unòt€>D£ÑXX›s‘° `®œõõu<~üxìÈŸ§–Oðt@‘N§ƒû÷ï/¬=†¹HX 0WÎÓ§OÑív/ttÈÓsßIyóÖ¹Î"àÖ­[ØÜÜ\X{sQ° `®”»wïâÞ½{îóe†Yê°˜.ož:7u:@J‰û÷ïs@ ³ôð_(set»]|ñÅ ¸ÿ§1òËä²ž6ý&‹ žÙÜÜÄ­[·ÒÃ\, ˜+Ã®ùŸ'ðoË0’­›˜”7o�ë*îß¿�N§³�¶æ"`À\	»»»øä“O&þ�ƒ§–SÌSç&N4<|øp¡ñ³HX 0—Ž”Ïž=CEËòtÀbï»¨þLªÃÓšíímìíí�»†¹X 0—Ž]ó,þK{Öú<p1÷�”7o�ë&¤”¸wï^ádK†YX 0—Êúú:>ÿüó m_Ú<°œ"`ž:7m:`eewîÜ9Ws° `.)%ž>}Zµ(°L.ëiÓo²àé ÍíÛ·±±±q®6fÑ° `.��>úwïÞ­Ìçé€óµ±È¶x:à|eóH)ññÇóÞ ÌRÁ�Ì¥ÐjµðìÙ³KùÒæé€åóÔ¹IÓ¸}ûöÜõfÑ° `.…'Ož`uuuª²<p¾6ÙOœ¯lž;wî ÛíÎ]Ÿa	 æÂÙßßÇ'Ÿ|²ð/YžXì}ÕŸóäÍ[çºˆ€V«…ÌU—a æB‰¢OŸ>ukþ/[ðtÀrŠ€yêÜ”é€½½=Þ€Y
X 0Ê£G�ðÁiW!–Ée=múMuŸxðàïÀ\9, ˜cuuOŸ>-Íãé€éÒo²˜”7o�ë ºÝ.ïÀ\9, ˜A�ïÿûcG9W=0éóyûÅ"`º¼yêÜÀ{0WMãª;ÀÜLîÝ»7Õ’'!ÄØ�f-;©ŒÍO’q#Žã Rûãò«òf©#„@Eh4h4Î°T=×¬é‹jK¥”{�išV>Ó¤t“‰ÊÜ	y(µ½Â½Ãª3'ñ÷4oY Ûà×¿þ5”RS×c˜EÁ€Y8�NOž<™ê°àòE€R
'''888ÀÙÙY®¬¶&Õõ	UYÅ:dÚ£ e\=)$V×V±·»‡µµÕ`d¹l"@)…ããc¼yûƒÁÀ{ Ò[fÙUTYw\�²<)$677°¿¿�v»]¹ÏU‹ »7ÀóçÏ§®Ã0‹‚ ³p>ÿüó™]›—)†Ã!Ž�Žð¯ÿÍßã·ü‘ÎîØ:¤vÜI¤�pÆß}Òå)3^ œ1³í@Ê¦)€  €ˆR•"M¤øÿûÿ
ßÿò	’$qýžud]–žO;O›ÍFI’âÿü¿þ¿úõ¿E»ÕÌÊ�5Îp#x]7Ÿ—½!]ÎäÛ÷äý4¿�°N¾=“�|tëü¯ÿËÿŒ÷îŒa_µ¸sçÞ¿�^¯7u†Y, ˜…²··‡Ï>ûl®º—!Ò4E¯×ÃwoÞàÅ›w:Me.f' ˆ@¤4Ð–[B€H�H�(•3v
 á~*ÓŽ ¥Å@^ �5X
‚ …4Õ@ˆ~¸?Õ{˜ö]ÌZwªt!°±±†­õG#DRD‘-ªŸ×}(æ™tû9«T
 *ûlÛTøãó—øåßý
�ÜÅ$ûUŠ€V«…{÷îá7¿ùO0—
2CJ‰gÏž�k¿ó‹‡8;=ÁïþøqCTþ“BêkèÏÒ\KA¥e¥�€ ¤ËæŸ„R
óSfËÖÜò5ý¯Óé`{sÓ�Å²È C"ÂJw»;[æ9üçæ�Øë,]H”[Ä?)dpû~ô‹¿Ã‹WoÐlLë\e`àÞÞ¶··§.Ï0‹€ ³0>ýôÓ…lprQ" MSû}|ûò5^¾=Ô†W˜P¿<MÏð—eV54±« >ØÛA£UÆLË"Þã¸t!@„�­-t;m7â-}'ÅÆ|ÊBôí…ýÿò:·k·šøã·ßá'¿ø;d>ž	½º" „ÀÃ‡Ñ˜B¨0Ì¢`À,„õõu|þùçkï"DÀh4Âáñ1¾yþ
Ãá‘ÈþüÆ%ßæ8;_VÔÕ/ÛœFzE\4{J„Ý�íR/Ê<KÍfa.O€¶67Ðmw@D™ñ”¶#ÂøH÷Î„UWåw5ÿ-Q%åÚÍ&þìG¿Ä«7Æ+³¼›u:Ü¿êvæ¼° `Â_|±ðCNù%›¦)úý>^¾~ƒç¯ÞBÊÖå^ÙÎd° Âñ2)ÂþÎ¤”•sð¥­,è]ÍÒ¾N“ØÚ\G·Û†RcFÙAýð—yæÕ:©%%^¾zƒ¿øÉ/Ñh62/Å’Š€[·nasssêvæ<4.zTÁÜ|îÞ½‹{÷î]HÛ‹
¼²‘ÿøúFq‚HF: /?
Í·	a‚ø²”ly_y}aVTÎ€(WÑ\*¥°¿¿36Žbïd‘Kw¶7Ñi·37û„w:e‘©K�+nC+þêg‹öÿÜ¹ý!oÏ‚±ÍMñž(¥Äýû÷ñÿðÈ\8ì`ÎE·ÛÅ_|q¡÷8ïHËFþ¿4‘ÿ.ZÝÖÑ'LÝW�R�;ºÚyàú%*J�iBJ‰½�mWgöùteÇ¥ÏR‡ˆ°µ±�ÕÕ®ŽÚ^€y'ÕÓ bª‘¾°møS&æù)‡2�ž¿x�ýüoÌý2/À2z677qëÖ­©Ûd˜yaÀœ‹Ç�c}}ýÂïsž/YùÿÛ?¼À0I]1ËèÈO`èÇôËZ®)<ãD„4M±¾¾†Õ•—fûZ^÷êE€2Ò¢E
	AÓüž¦û/È3I&Ö‚á¯~þ·øö»×…@»e÷îÝC§Ó™ºM†™ ÌÜìîîâ“O>¹´ûÍó%ë"ÿ¿{…Wï�¹Î�ÿ«ï³ ;4…ùÐSDØÞÜ@§Û.¸Š—UØQô»»ˆ¦^þ™¹È}¼¸8  è´šøÃ·ßáÇ?ÿ[½ÉÓŒK,.[4|üñÇøÉÔ Ì\Ø5ÿÓn÷»(fý’�F8<:Ä×Ï_a0Š�‘*F÷	 Teì*]Õ™ûY�#ÓK=ÓY¾Ù³Ø�•RØ\_GÇDÔ—=OÕsž§ì¸ôiêHHìîl#Š¢ll_òN
Ó"¹Ôª·o
”‹áZÒ÷¢|ž©Ój6ð?ù^¾~YX‘°|ÓÛÛÛYVË0U° `æbQkþçaÚ/Ù,òÿ /^½C$ŒXåÆ¦jÞ¾ºÄø¬b{YzÞ¼€4UØÞZÇJ·S ¶l" Š"@
|°·mÊxOVáH	¦Š7ªìCÐZNhMCExñê~ðU¸" ¼ýòˆ )%îÝ»7öDM†9, ˜™Yôšÿy˜æKv8âøø¿ÿúFI‘ÿk?‡{5P¹ÑŒêOÕ&)…­Í­‰^•eBì›Í‹€	q—J¹*ûáÏþß¾x9Õî€¥­^¢èv»øè£�¦n‹af� 3RJ<yòd)”Æ}qºÈÿWoðâí»l~º°dÏü7?x­ˆÐÉÕÃýÀ�Ë&¯ ÀÚi Ò{Âom­›Ï´�(ýYËŽK¯Ê“B`¥ÛÁÖúFp:/åÞI¸ÒB„ž˜±q Ó­°÷ª*+ 0úöÅküègfE@…`™<·oßžùp-†™ ÌLÜ¾}ûÂÖüÏCÕ§‹üÿãs$±‰ü}•±w/S—riÈ/ß=]æÈÝ‡H¯ÿ_év°µ®¨¸"@4šM|°¿¥”gø3üÅãÂï&˜]»²0—bj–U&¸•	Zœ@~øÓ¿Åó—oÆn½»,"@J‰œëŒ†)ƒÿ¢˜©iµZxöìÙÒE&çûã"ÿ_¼Â«ƒCm¤EÎrWlÔS@ãJL—•Ïöý ú„N§S:Ò[v ¥D«ÙÄîÎVq^½Dßñ¤„ÒL@¹úŒ€?|û?úùßèç8tá²DÀÆÆïÀ,>y‚™š'Ož`mmíª»QŠÙ.k£ÑPGþ¿x…á0ÖëŒ™£d÷í«*ãeé¤ÞPdä²8 ¡7Æ!ÿ>EˆJºÝ¶66Ç#Ã‚aò�ÉõRäw˜óÓ¨àå®2xÓ¤—õ‰ˆÇ1¶77‚�JŸÖiþË4óÓ0z*¤ÔS?–*qg›i·šøó¿ú9þÙòbogì®ˆö9+ï%.gÇÀ;wîàýû÷è÷ûSµÃ0“`ÀLÅþþ>=ztÕÝ‹I’ ßëáåë·xñú-¢H;¹Æê¹0F·{`n¿P)¯²ö0 ";µ@hµšHÓþøõâÑ¨¸RÀ…Rƒ^eèËÓÉNÖ»<2é¹² à~~Ðï„‘”èvÛß_ùû�ÓwÜ€/%J$�—I‰¯Þà/~òüËÿæ¿Äp4ßæ~" ÕjáþýûøÇüÇ©Ú`˜I° `&Ež>}zékþça4áèè¿ûúF±B….|?mòµ<»l¿yE"c\€µç´ZM¼|õÿÛÿþ@©¤ Ò�¬!ÖÚ]]×m“ç}WÆ–7¶Ü	 +ŒD§)S®sÊ¶oêÂµåý'	Úí–þlžo*á•{Iã‚õª„ŽáúWU¹ÐLðÃŸþ5þùúOÝç�¸h°··‡ƒƒ¼}ûvî~2Œ… 3‘G�aÿª»1ùÿêÍ|÷ö=¢H_ú…5Œ½Èý¼B„#áÿr[˜³3$œ5Ô†hŒ«}4Œ¡<CŸåùÀ7ÞÖ@Ã}ë© ÏP®�ÊD ¨ñ ÊÒ]™
ñ'‰÷ÜžÁÍßÍ‡ïAhÑ$è•T9ì÷Z,yï àŸ¹”=…Nl4øæ»×øáOÿÿÃý_@{eÆ’ä¿¯ª2-îß¿�ããcŒ&x-fÈŒeuuOž<¹ênLEùoöüwF¡ê§!të›´\@Vn[±‘RÆ€9cë–hY’_þ¦û"t,�÷pKÖôµ‰x4ËáŠÿ¤�zÏ~! ÜOÿ_1MÊ\™/c?‡ï©r?€à½Šàr‘[ß„,” 	íúáÏþß~÷Ò­8oôÿEv»]Ü¹sgêúS{ ˜J„xöìÙµØ‰,Ûóÿ¥Žü÷#ì	€uû¾ã™f¢ËÈÅLGè§hãÚÐ£]DQäÄ…2±d—±eónJ@™²™§ÀþÇz�]›ÏÂwß›X é=òá*¸5ýÙÉ‰d¼p“ñ¾‡BŽ$ìz¿8‰õ¼úþÓÅ„q“‹;€×º_Q_·[Müá›çøÑÏþÿÝ¿øÏÝþ³ŒÒËo±ž€[·náàà ÇÇÇs÷‘aØÀTr÷î]Ü¾}ûª»1.òÿù+G‰6¬eÌ`¹l´	˜QvuÝ²Q}0úa‘â*·|+"÷CÀï�È+�‚piÆjÃ'œ$WÖÎ4fÈN™”Ý×5é¼þÓeï$ûç<ÓŠËž¡p4pþ�
¿ïìºÕjáÏþêç…3&-ƒ¼JO ïÀ,þëaJét:xòäÉµüKÓÔ‹ü?@MáØÊÏ—E÷å)±þ÷÷ø-psª ê^vØ�¢±-69Îh
×¹â	½ž\X¡`k…#æ,~ÀÆ Ø -Lh…#s;1™)Æþ¼ïD$ž¿|…?ÿñÏÑl6s±	Ë;°±±qm:³œ° `JyüøñµÙ~t8âðè¿ýúâDÍ=g\>ÿ\ó–\U·U]{¦ŽU¶Plº;”–+«ZøèSþŸþaã&÷-s�û¸˜8€Ð�¦‡×Z,ýà«¿Æ7Ï¿+œp^r‘"à£�>B·Û�«_Ã€)°··‡Ï>ûìª»1.òÿõ¼zû¾äLú, Î|ëJ·ÙUG¾1*s	Àm=[tS—ÜÈf”Nngní¼ÿ`“$¼ÿT=V(kÌ=õ<‰×�²„)ëFÎ¦˜óNÊ…Ñ$q•½0ûÊŠ%lßQ9PvÝjê3~ðÕ¿66±±¤Ó­V÷îÝã© f.ø¯†	�RâË/¿¼6_(aä¿‰Ë\úå_íåŠÞÆò^–?€&/¯ ·t¯l\íú<î¶žJtÎ$1ß ×s�C ^ Ê/ƒ÷Z¸åT�˜ô aÑÊ,! Ïøë`E@¡Ì¸æ¯Hìíía{{{êzc¹ßòÌ¥ñé§Ÿbooïª»1þžÿ¯]z6OÍŽlõ|Eo™4êwm—úã6áhà
lŽ´ö §é‘�g×5”nWÎ¤ÏbPÆeR¾ŒYQ?•§äª lõÃÿZÍ&~oV¸x‡Ë8 „ÀÇ<ö`#†)ƒ ãX__ÇãÇ�¯ºSc#ÿÿøâ%†±Žü¯Æsd‹rc—Í#7J3—n§òñ YóE/@®�Â´�ðÝ^À¿ @$\»68 ¬_Ä—;f·�â¹Sá4@ø ù		Ó?€QHá�zï„Œÿ>x«þ³zï,èš0-Le…IÂïxp»|× „^ø§?üiaE@Ø�å›èt:KuJ's=`À8ž>}zmŠ\äÿ«·xùúÝØÕ
Ó9ùs¹Ó¸Ès#ÄüF8SÝ.ŸN62(Ý½F zË¼â2?»G€_ùª”ÝÂeÙ 7OQœ~×”‘1WÃü´G~C~´‚—b>‹ªÓExß\!)%^¼|�?ûÑÏÐj5K½ ÀrNÜºu›››S×a  ½æÿ:� läÿï¾yŽ8�?ò@¥µÏ§
!rkÜ¤ò˜¤Ü>Ú#0…A0?ËÖãÌªÈ®C“W5=á üvYÕ0Ø?û(ŠÍÑº¨j1å/6ï¥˜©RîZüàÇ�¯¿}‰V³Y]{É¦¢(â€@f&ø/…A·ÛÅ_|qÕÝ˜š òÿàÐ‹üŸ4/=~Íy~DYUÈ7h�WÜ)–¼W Jr„§ú=*³žÂÿ¡§6ük¿˜÷Aä<"°ô¾É�èó÷'a„‚ ¥T(¨·.Æ'dï/÷ž*ì±.>ëdDÉ•Ÿ[ý·Ðl4ðÍ‹ïð—_ýv‹ãª¿©e›ØÚÚÂ­[·¦.ÏÔ ?~Œõõõ«îÆÔ‘ÿ©u‡ÃúåQíZ¸¢7ašIß¹¥ž€ñ•Æ�Ü­ñ&Êæï+ßþ/è‡¿æ ß·r|·yXÒö6?àõÆ
Þ
Û¢€÷;©ºÿl¸'Ì;c*o�Ÿ¸(û[ñÄ�Ð‚HH�~õK|û¢|E@p‹%›¸ÿ>:�ÎÔå™úÂ æìîîâ“O>¹ênL��üÿæÅ+¼yäF·•Sì(?W{¥ó•gÊ¶†iÚyüNèz™û=˜~öGñ(
ÿºÂäy·šìU(M
²¦1Z2'EÆ�ÊËrDEŸ\{¢øLÙTJUBÕß‚O«ÕÂï¿~�þô—úŒsF@e¯—h: ÑhàáÃ‡çîsóaPc¤”xöìÙµØî×b#ÿ¿yñ£Q	™m2ãYBgÆYJßwî'ç;�_BPfC+òcVâvö*ßãj·Ï%”)Dá4A $L5ï#Hèä5YöþØ¿Ü†ˆ|—ž÷r{’`•â*{U†{Úa¿{o%ÿ
é¢âh7›øÓü/_¿q+Æ¹õ—i:`{{ûÚ,çe® 5æF–5ø    IDAT:­ùÂÈÿïÞ˜È�‚=÷�[ÕèxrôyÞ(å�u6‹<ÆFVŽ€«ïìGÙ…óòÖý^Ø*¨8Ó4c½à¢$�¼Ûä½¥NrOTøb¥-oÒíRÀÊ½Ê*™ËqK§e’‡d\¾Œ$ž¿|�?ý«ŸÎ¨|‚%™�RâÞ½{×â$Oæê`PSÖ××ñùçŸ_u7fÂEþýIåžÿ“œËÞÖÀ¾Ggs ýäU£Þ²‘³ûQP'c\Î‘7Ýá|½pª ¢9ÿEšEWB®ò"+ò¿“`-ýÏÉ˜äò²Óž×nÞï_þø—øúÛÁ×a:`eewîÜ9W_˜›€"¥Ä“'O®U �‹üõ¯ß"Šü?]käªÇùÙ÷eÞ7àÏ—ZÇJ»UéS¡èÏZ	<ßÂû’/T*·¥þ*€07SVÀü,[ÝïzTb»³é–Ütƒóý‡oÅ.IÏ(>Öâ�¶×%¢dÿ„Š­Fß¾øùÕ/‘?#à:LÜ¾}ûÚêÅ\>, jÈíÛ·¯ÕšÀDþŸœà·_?G’¦%%&³§B”ŠIèªö­á	æ˜²Â{9—¼g\}÷»_Ãßñ¯zzƒr6Òü7XhTMžäï�K›sÃœ|?'qþÀ¶²úÕ®	»ð/ò|3ÅŠ€|Ý‹ÌŸ¦Œ”ü1ïÀ”Â5£ÕjáÙ³g×*B8MS}|óâ%ÞCˆðÏvºcggcš£�'z´�Ž¨%–\e#él[Êÿœ¿Î†×V0dûzf[TÚì Y�*W;e
A^W¤(~Í”¯È¼ä>VyXfÿÏfú3Z­þðõüð«lE@ØŸåžØØØÀíÛ·ÏÕæfÂ f<yòkkkWÝ�™�†xxˆo^¼Ö‘ÿ6ª¼l0Š\šÅnZãm^“M�WHc�¦;8WÑ]åüÝ^}û8Ù¦<Ùƒ”�%àO8·z>ØÏü¹gã•UUrîaík·¶ÚÌ;(Û$!„”Açý£�«�rN Tþü£�sÓVU:0D1�L+¹´v³‰õƒ¯ðòõÛRƒ»ìÓwîÜ¹6Û|3—€±¿¿�G�]u7fÂ�üõöÀÌý—Sçù½9`á[Æ°Ì$ŠÆ:Ÿ"¦Éò²µ?¾+Þ¤{�–Ö“3Ñö¹³u‚Þýý÷¢¯%_ÅŠ"[ŸDÖ<™(³9‘äÛ~o²ìä<ó3rÏW¥~lßË¼3â«¤àwž·òSX}'À2xñò5þô‡_�=# ²[W<ÐjµðàÁƒ‰m0õ‚@Mˆ¢OŸ>½Vkþ�,òÿ÷ß<G¢Æí˜¿¸)�I£þio?ïÑÀ„œÛÞw‹A‹Ó¸°ý–EîgUÔ@a?„¼p(›WÈwÎëØXs9î]Ÿû×ZÑ¡y&àÛïÐl–Ç,ótÀÞÞÞµZöË\<, jÂ£G�°¿¿ÕÝ˜‰ òÿàP÷[b3 Þ—`1¯h³Jƒÿí²¸8ä¿`Ç÷ÃòA¼WÒwäû}÷]Ÿ_‹_í²/^ç]ú¡×¤8 Jßp®?¤Ü=Üsy+"…oÆe	x³Ù{ù®—½W“3Á&ï¦Ìã/B)T(+²7Ðl4ðõó—ø‹ÿ¢4®!ëÛòN<xð€÷`, jÀêê*ž<yrÕÝ˜™,òÿ[$©ï¿ž}ç›ßŠ¯æê6'Ü¬lÑÀØïé’òÁ}üÐ~ `™¬ ¥eÄXÃæŽÃ5}(U† ”·Z ðž‹°$Š�ªG®Èó&Åx­ˆÒOå÷vÏ;a
B)þâ'?Ç7Ï¿Ck†ùv.2\™n·Ë{0 7!ž={víTš¦˜Èÿƒ÷'²dKÞW{å@µÂ^å“®¹åª¿`=ã1Ù1�%‰¢qÒÓËþ(|’iÅ7µ�=¿°sùíø«çÃ”ˆáGèœ¼ùt=Â�˜'Å=š×cî×«ÿ¯è*°ï³Õlâ÷|Ž|õË¼Þ)éÿrNðÞ Œ…ÀçîÝ»×r	PÇ8::Æ7/^aÇ�n˜iàåŽÿ±“•÷¯öä
Ù6*
Wïq.~cZÈ}ÊîÆøÊveÜx>— 4À@åštùY€ õ((2½¡ïÞ:2Ê½$3ÄLo<}ÙVþ7£ÿnfSíVÿ÷_þXŸ åD—ÿEMÌïÀXæóa1×‚n·‹'Ož\»À?"‚JS¼;Ä«ƒ÷h4›(:¦ÇY“Iå„ I�ÔVJTŒŽ…þeÓÜÁÈOB@!3pdJÉ,RÜA’q�+"k8‰ ¼]¤”æË93TÊ�à³r2‘úäúääY	SÏ”÷üÿd»iD’È-˜ÐíÞDzä ˆ H@	B$#@fú� ¥,ˆ’iª¼ù}]F@zG	( Ó÷Éé­�œ€)�çŒ¨ýÝMó—3ŽF#Âw¯Þà_ýà+üOÿò¿E¿?˜»­²¥™³Ô0¶~U™ÍÍMÜ¾}ÏŸ?ŸëÞÌÍ€À¦Ýn£Ùl¢×ëÍý%súý’4ÅÆú�‹0¥<ëéÒÇ×š^‚Ll(w?‚Þ?ß�93Nùª„’Îp­Ž-C~Š¬s�B?‹mƒq’äÚÑoIH�A€ÿçW¿FªÎt '(+Cº¾3ÎÞ}É	$ÏóQ’æª˜ÛW�(jäÊåßå_­÷è”.-U
ÿî÷_£Ùh Ÿëw¡Æ„ÿí�3ä³¸ú§¶\¯×›Ø.sóapƒ‡8::šú$³e�ˆ0Ž@*…¢izq}WJM.t^œAô>–_h#(Dh„ŠÅ@áïU–Éÿ LÎZCk½
¡…ï¥ŒÇ&{Ô¬°ToÞ¼Å›·ædÀÌ@g†Ì‚gû„F;/ü{e¯×Ý{ÙHËÅB^”´ïµ˜õÍ\«4Å»Û899ÁÑÑqáï¨ìoÓ¦Í[oR[�`‹c‡Ã‰÷fn6, n0I’ ×ëammírÝ‚BÏ+) ˆ´ëø‚pKØ.¢íð?Såô¼z–t—Ó”O+ÆÝÏ¬Î7®þ,+l�t~’*=qåüîëo¡R’Þè½Ôè›{×>‘r®'\—ÉÍÌ7=á?¿ö È$+ˆà¾Ð·1ªËCÆÓ!Üƒ˜õA�ý½G1F£‘ûßW•žÕ`OSþ<÷B ŽãÊû3õ€À&I¬¯¯_«½ÿ¨Ôl4Ñˆ$FÉE
€‹õŒŒ3ô¥ 3ìd®XÞ¸i¡^@!9?=Pbüs=
¢\_APŠ!e¹”ïÞãýû#½Šcâ«.Íç.¾
ŠçšsØ5YX ŽípS9¾½÷VfPÐBöYJ‰ýÝ�R.`Ï
ƒ æ}å]ðù´YËŸ÷^D„ÑhT¸?S/X Ü`ˆèÚºù¤”h6›h6›&Ã™×ýOGh¸Û²F8ã)��âcÊP1]§I¨¼!WY ¼šÓ5ü#@	/Q�¤…2£d! R&Ï·‡�€R™Ás#ê,²_—5f×u›t=÷Epýõ·/�¦©> {@sI®¯ù7¤äˆù,2·�Ä{ïC(3Á/ Fy1nÄEû»ÛHUªcà¦Ÿf„¿ƒí/{  7œÁ`þå«¦Ýj Ûiãø´o‚ÇMY�×bÉlf~„”Ò‰”Y7ŽþUÐYm½TV ³šÀ¾*å¨ü’Êå“—´î™rŽŠ=1�Z/�÷œRJ�àíÁ{7òöç ³Gð­ª¹~kà³Ù;qMW
Ye�Ýá\†ß"…ÄÞÎ6’$¦×.Âh/Êèû$I‚´ôXm¦N° ¸á‡Cç.¼N�€€ÞzµÙˆ T
!.f%Àb_IÕ—o1/Fó¯œ³Û7–~ÿ…Ÿ)_'KÓN‡¼îdŠû†8Ë'ÿÑiJA)—ëxùê-Îz}DQ»14Ðá;ÈFù^ìµßÙ\~øŽò¿_ØL2þEAXndÖ×V±¶¶
¥Ò1å¦7Ü³´±ˆ{�F£k÷}À, 7œÁ`€4M¯Ý^ Â,…³Â…–4ˆÑš=1æË4ÿEkøõáï”Ìé†®Lñ`!ßnÛ˜`üA@
·ÿOà’7Ÿm‚¾	Á;,P{<W ¯CøŒg½>^¾~“›�öo
#"OXoƒ×ïPèT-¼ ò\ Þ;(<1P*&LVJøpR £4½6£~?�ÝÿÀàÆ3�$	�ÆµRüBÈ(B£éUtŸE	íŸÎ@iþÈZ@€ü½€ J�»/ìmÜ�mN€¼­vô¦Bþp»lDl7R¦=@o^ä»:@¥©4÷“RàÝûC#’™ç©Ô½ï~êÊ¾a÷ÁÄQ ƒÌga6š0êÏi¨‰ÿ;IIáƒ½mH)KŸ)Ï²} ÀàÆÇ1’$¹ênÌ…­VB
\L¬žo	ÏÑJf]
­ç‡•aå
geÜ’6*”ôåšÈŒ©ŸOY«A@]~”›Šp¹œB¶M¢v¨gŸmÛ¾‘I•Â·/¾3÷7©	}˜?­ð¾Æÿà-™$·ûbö€ç6þ€>û{;7à¹jWÿ¸gá pS£u†@X[[»ênÌŒ��vQ$1JÓ)6çŸƒì?Qõ–õJ•çù†.ûÞØO³Óäãs% Ó	žAf}<¬1çðýmƒíLCæzW�Ç%XâG€�|°]LSï…ÀÑÑ	Þ½;„4G�Qñ¹+Fþ6-´é¾pÉ2­— B Ì[Õ}Ï ò§'²•“PJáƒÝÈ1q5‹6èç]=àç 2 X Ô‚³³3ìïï_u7æbµÛA³ÑÀ`8‚¼ 0ë´ˆò¢ß‹y%_ðú&¹ÏaùQ®5Š"¿ÀØ(Ê,¶&�Ÿ^w‚†Æ)¯~~*ƒòÿuÿÑít|‘n1’¾}ñ‰R�B/U7ê¯NóžÜ^{†ßWYùìB¿È_ý ;Sxºào`òß‘ÂÞî6ôÊÉÙW \Ö’Áª¼$I®ÕÆ`ÌÅÁ \ç}¿[­")´eº€ÃËª½*
{?¨$=KËö¶×9Ùçâ‘4Ù(6kA íHÕµ)Ü¨Dú3™¶È»KI?}£\¶oÌJ€ÀèúÆš@ö!pzvŠƒ÷‡°î’R÷~ÁÐ#ìshÑK�¿gÿÃ§ô„ !¿ùPø¼óÄÄÚ­67ÖÍHå{ Tµ?­á^”«¿ì~q³ ` ° ¨ý~ÀùN»
ôJ a¶vûº,òÖ»OÓ!x±äÒ ›ä €þ�v¤?&èÐnÄcòI—wÖ‹tÃzëÜlh®„Ý ˆL’ùlð<Ï€þ¬´à ›§ ®¬‹3°š >3¥{o•ƒÿ„~iªGÚ²áÕ›ôú}H!+Gù”¹¼W™/ç‰ûŽs>|ãðò²ëlZÆË<ÇßQªv¶·°Òí �aÀU�úý´4MY 0 X Ô‚^¯w-ÿ/„@Eh6ô!2êÄËL ë‚÷ë(ßžxW¹ôìs6ú÷óB$
Y³þh?0˜v ë»£AnÝOòs2Ñ`žAù½SáSÚ9|+t¾R&�¤úƒ!^¿}§Ec‚ÿ }d°±Ðúˆd3]àö(ÈNi71Ò�ù×Y^Î; €:÷¨ß'MSìl­£Ói#UÙ<úUöM“n¯¯kP0³xX Ô€4M1Ðét®º+3a÷h·ZÈ»oFI›coCÅüÀÍ]‘VÖw¿L8 &7˜¶È»Âmey�èÈµ™Ý×7 ^\3å£s»P›=}PÈºÁ%Þ�àèè2Šœ8ñûîFóB¸¡9	©E€-¥U Ì–ÂÊîvà	§°såÆß|P¹¸‘óþ	)•bks+�”R¥S —¹)Ð´eýÏ, 4u_ ° ¨Dúüïn·{í¦ "a¥Û�ÞÊ~ñ}/øEÈš›rß€ ?F^(³Ö\X¿ÝÝ_×ö#ìAÆ•.lPž€©m¥>pF‘2æÒêõÞû^,�0§áÜÎ~‚Â©kpE™!¶Ÿ|×~A�„Â ‚²€IA™ß‰"‚JR|÷òUØ&|1CÆÐ@HP2"	’QvŸ4R¤	�&¦
&â0üEQÐÃ²lXGÃ¢Ôcª¶77Ðé´0æ6þ—=ê÷?³ `,, jB¿ß¿žŠWl¬­2P4aô|•Û�@ù§ô  @H3Eæš'#ììr;
ZÓåŒûÚe+g
mCÞµÈòTÎ*ÊäJÉÈ?ygsþyƒéÜ÷¾·ÁÔ!ÒÏsÚëáýá¡‰3ñz`Ä™÷CBQ4[ fh4@�†y_JS qŠ‡@l¼™ô)xDò£~ÿ×·hÑ˜&
[ëh·Z8;ë™÷³ÜFßOOÓ” ã`PÎÎÎ®ºsÓi·J·Î]U§–~)‡ÿÑiR G¶�Ò¸µáŒ”qe›¥rvÈïîMþkÁˆ¼íÝ„î:[îÏÍ•‡v³ÄÀ—<{Þ`ƒm²}†ß½F’¤né¢_KÿÚ‹a�»tº@§!"H"�€ž^Aý¾¾ƒ¯ŒK£Òø£ðÙ8ÐhDØÞÚ„”Qià2¹úËÒ•R, €š`W\7l€>N~‘�ŒÞ¼s>G)¨œåÈ\ùfSQY?sAÈªÑ d!µñRD@šB$	ˆRPªÌ�3Oƒž2ÐAovR@XcçŒž 	ï?ÿx_w°�g·†ÓZ@žÚ?®·hà³ :Y·�ùÞ#„@¯×ÃûÃ#gp}¡d§?„€ˆ€¨j·A+«ÀÚ:D§‹ÁGáø“OÐ~ÿëÿîwÀÉ1é¯&²âIï6¢±#ÿ‹Ýn[[kH’dásÿ5ê÷©Z¹ÀÔ 5!Žãk¹ûWEf%@ƒÑ÷/·Ä¾)p¥[T`aLi‚Ù¤6lªÙš-�@
"U TAÉ!€‘®«âÀ¸+Ï¨)Ïížc—�í«í²*½æ³«é_;SôføÆ__úåò‚Açh ñöà=zý„”°Küˆ‚R !ô\«©Gþk�ë›è?üüçÿÎno!(ìÿ›¿Ç­_üÔhêßAš I’‰žêðW/˜]´á·(EX_í`{cišTÞoÙŒ¾ŸÎ£Æ‡@MH’Ãá�NçÚ� �Z­ÔÙ¢¼¡1ÏS¢¤
å>[ �[»Ñj#Y_ÇÙ½;@’`õù+ÈÓc�4sãJölw¯¬?þµôÖ7À)ßÐ‡‚þþÂms}ãï½ÿÚ'þ´´·b0àí»wPDˆ¼Qð,‚ôTI#5;@wX_G²ÿ^ÿGÿ«má“ÐoJ<ÿ¾�•÷GØøõ¯¡’( £!Ç %Á3O3ê_ä_º"B·ÓÁÖÖF© ª•}›²ì"ïÃ‡ 1>, jBÇ×n%€”�F++mÐAj�ïçÇyÍsÓ
&Ê_äÊúã�� H=úo6A­Ðé"ÝÜÂ›/Ÿ`´­Ï^8ûðöþþÿ…<:Ôy*ÒmD„Y¯OÂ8Û•ž/w¿¦œá7I(AO�ˆ;<n?Xé6ü!á¦'²½~(èi³¹�ˆÇ'§8:>E$ým‹s›úˆÈ€&ÐÑî¹¶�ÓOaåÁ-ü“¸} ¿nÿîßû«/_iÃÖšP4"©½vêÃ=Å˜‘ÿÿÔUªÐí´±½¹�$¿À¸¼ËÚ9°,� ãÃ &(¥0¯ºsE6ÖV¡A.j;à¼+Ù¸ÈmZ~c¥L°@‘1lí°²†£‡ÑÜZÃ‡Æ>l¯áøÑClþã¿©Hb �D¢�¬¢lY¡²FM™•o& ÎyïZøé¨ô¸ž…¾ç�Ül„�t ì¡‹�l T"ðúÍ�^¶hþq�Êâ:F�&¨ÕVVoí ÷øS|¿)ðï¸#€3 -ÞïmãøÁl½‡teèŸƒK¿û%Ï]Æâ ‘ÂJ·ƒÍ�5œžžUn®µlFŸ÷ `ª`P#ƒÁUwa.„Ð+ˆBÃ6ü(fæÜÈU%˜{uËþ$ z9[«�dkêÃ=|BÀF¨¼"à·îcøú-ÃÐÑ�±%»¶s®s)­�v{õÂŽ×íÚ~Â\Süç=´3õäÝÀ>�Ë˜îä®]�`•‚ö~ôû}¼;<Òž¯LNŠè3D¤ßS»¬¬ ÙÝÅê­]|NÀ'Q& F
øMøÿîÜBú›ØjQSïàg^º'K [ëh5›•ñ4ÓïiÊž§nY:¯ `ò° ¨ƒÁ Bˆkx&€„R÷{æÚTre?P˜ž3^:M;™ý=ù)‚1þ‘ÞÐ¦Ù„hwÐûð|Ø¸+�Œ�jpÚxýáXôu=!uaJÞ¨ÙvKH)…ÙÈÛrX�:]Œ¢Ê¶%¤Ìn}º!/~?ùo*ç6Wr÷öÎ(€È/%Ô^Exõö­6(¹ÈÿPT 5@æ=¡ÝÅÙÝ�ðqSâ#©ÅÒž V¼SÀ ¿ÝßÁpw�÷ fÔlj/‚� º#Éû{»S/ÿ[–Q¿¥*n�©/, jÄp8Dš¦K½!PÙTEh4"4"‰QœN¹¶;ð�—‡2oB1ÍºÆƒþY×¼Ô†�&Òî
äæö�1Û3}T ö%ðvsiw¢w¦ëD23¸i~¿þ¤×Ôg¡ÿ^©ÐÍO¸�¨ûrÁ=Hæ=0™a›žÈ	ó…‘6ê½~‡‡G%�…™0Þ)�†Ô±m+±»�ýØÀ&€4	Ø–À‡)Ð]_EsC/lu€¦MúÅ ä—WÁb!Šö÷v�ÚU×Àèûé<ÿÏäaP#†Ã!’$A³Ù¼ê®”Rõ& ´Úm´Z-GãŽ6®ø²/ÙÃî«ËøiÖ¦Ùãò„I¡çÿM66Ðm·±	`Àºi·OÚÀuÛmô66Ð=<t;ß‘Û@ˆr#q{3ÿp ˜ž¨šó¯
î�½iüà^þ
€üs‡ï 	aÐº#ŠK�?HÇ H©×õGM ÑF²º†•õìK`ÀŠ ºæµ®ØÀn[à›Í½aP³ŠŒ`Ö �Ex	�BâÃý]¤Iñ4½«4üÓ¦³û?„ˆ–z0t° ¨ƒÁ I’ Õj-•+pR_„”è4›h·›8:U�¥+|Ã“O7›á”T	«ç¿˜³Bîš$ ÉŒl@Cï�®­ ÛXžAƒ¾^Ðm	œ¬¯‚¨ÑÔkâÍ®yÚÝîmãÇ·úÄæøFÞ7êDö‚ÜnvžÐÃ¿Â) ³¯@Þ …Ó¦ÜpãÝá1R•Â+æŒ¶[¡é—Œô–¿Í&d³�ÁÎÖºml°&�Ž Zfå®ÐÞ€=~·»ƒ´ÛEÔl¡Õ ®Îþ#Š$öww�ä¦ –yÔïÃ &€¡”Âh4ÂÊÊÊUwefÒn·°Úé MRmt�PøF±�®ŠéÊ³Qy<„?bö¯!É,—“ i²i·!;¬`…€¶ ¬�¥ KÚ#ð¶ÛAÒîè�#	Ð' �T¶M°ý)Ü9ZÄø£u¿K€*¬TÈO äíçFôëkQ‘î5‚„ÄÙYG'§zÃ#»C_Î ½%ZÂ8€Ù(i´¾ŽÕV› VÌ;jBoÜ…ölPkPí¤ Q¤w”Òìx¹H)±·³åb æ5Ò!¦©7c. 5£ßïckkëJû0�÷!Š"4›³áŒg˜Ã†‹ée³Mjrý	Öß“ÛüÆµCÖ­­›�FíÐí`z4Û@¤›BSè´5 èt·;hEJDî»øÎiëÐ@ã`wÊ |�pmžË‘g¯¡(hÂš~ù\›¦p
…ƒ÷ï¡”‚”™()[y Ò; ºÍ’¬ ÓÁjÙû‚ØGÐž€®ñš´WÚ@«mV4tB¥ *ã RX[]Áêê
Ò9·¾¨Ñþ4÷RJU.[dê€šqvvveó^ç™vÐEÚœ?ñÎÝ z>½`í‹ž�¬/¹•n³“§L¢1:ÎŽJè‘­”HÚ-4ÛM=ú—Ú EÆûÝ4�®d§‰¸Ý‰†«ëGêNcü…Ònô\Ÿ«¼öšJÓ�‰×s7… +?ÜyžG¶}�f0âðèÒN9xå}É ß‘‰qˆô	€z%@Ñj°¢€2±A¶^€ÕVƒnGÿF¤= ‘Y=¡f	<?¤û»;�B"¹dã¿ˆ�†Ò´·À0, jF¯§ƒè.k)à¼÷ðë	! #‰V³)%”7Ÿ�«…ÂÆ~Æ Š <ã˜;Þ—ÈH}ôo#¨���Ú+@Bê½ï£Ôh Ù”h“6ø‘MU7 —vh6%FÍ&ÒÈžhGÐd¢éÍÚ~}wˆÌýà­7�ÝíÁ3¯ý2VÎ�?r÷ÞUv§@ H)qðî=â$ñ‚ÿÂ`ÄP@JJ³c¢Œ·»+¬©Ð[Ó§Œ Àj$p²¾Žvd–[º¸‰ì‚þÄ•Rø`oR
(¥®…Ñ÷Óy	 S€šq™§Îó…S¹@HtÚmDR"V	@y#`ehê³¹ébZ�4Ç    IDAT>Çt 0–”+eçíõœ¼ÉT§�Ž4sÙÆøÛ^Hho@K  Çí¶Ž°í@:cKnwB»ÉO8úöÅŒïÐAx¾8ÈÍý—”qûüåÄDÖf¶¼O� !0�pt|¢¥V.Œ¿ça¬�HÛmÈV]¡GûMG�÷®š¤ÅAW ñJ×¸ÿÍÜ¿�R¸d>ü`¯T8/“«¿*�O,R÷  €Ú1Ç1¢(š\xN1êÏ#„ÀJ§ƒ¨!1ˆõ™ f‹[ éÍp¼´ð³»‘3„RfÛËêé}3þVÙ5nÀyÌò6Š$ÒV[�þ¥ÍJá	 cÐZÐSªÓF5L@›6&‚¬q×FW)Ò6N”ð÷¦!òÂ$çö·Ï–™Û÷PÁî{È?¥�@‘ÄáÉ)úƒ¡ùâôîYbü]ºfã£"j m5Ðh5Ñ%-–= ´(°ï+í´�ëß ”Óq/Êä¥Öà	€ËÚ`÷â%€L, j¡×ëaccc¡#‚‹0ú~"ÂÚÚ
ZÍ&NO{9ÃnÝç¾A£BüÜ¦Gv¾Á"%œi#s"�Ÿjè\@(A5›�1ó¥•„à m6�ÊÒ�íµA!•:÷< sÞA�>°Ç>�ÿ„þ(�àmðc½ ¹wã}
FûžåöÄƒW@ÄIŒ£ãcü'³Š¾±§ 8/‡”zã#©ã ¢(BÙûòÍ¹ Mh ZÍlî?’3Žþ3‰r^ˆöv¶ P0pÞÑúyÖõÏÒ6Ïÿ3e° ¨¾ Xd›Q>_®Ýj¡E EPC�síûsà³ôÏf ×ôFÄÞÈ×š7g)Ép£�‘’T3rÁlùeêvTÛ€6jª�¤0ýÁ6º®ùüû°#}À®Ø+^ûeüþk¡xýN²çÌO1Hôz}œžœAÊìfñ
ÞûîgžÑ¼3H ÍM©�¼½%¶´4S&-ˆf#›ûwîÿËuÝ’"´›-lm¬C)ªŒpåÏéê_tÙ4My	 S
€Òï÷2ÿµÈ9þIå„R"jD (•‹Þ'oÉžNÈ	‚ÜÈ—H[B!›@°g¾×AOPÌÜ·1¡‘ 5"D¤³#Š 	mÐ"4@QJFˆ¬Ã_!3žDžH!3×nGÛvŸ o+JÈê
‚�Âæd ‚>}0ï óœYt Ù©�@	ðþð©Jµ6PÒLKP…·Áý‰é=ôj€F¤€õ–xšÌyK¬`ÒÀ®˜�aÀ¤¿¥9 Tª°µµ�N§�$L·L£~û™ˆX 0¥° ¨!gggsÕ»H7ÿ¤rBH)Ðn5�¿Ðˆ„lÄ^üì®Iè%®L‰ñwÕH(²Æ_�DSˆ(r£ÿ|Œº@8 ¢J½‰Ž5ôD@ª ·�gDÓ|ŸŠûÐ‡éÅë,ÉOwoÃnücâFqŒ£ãSw™ìLŒä—Z’eÂÍÙ“YýI A™Ç¤à0ïª!ôî{ÎàK�Ùúù@ªRlom ÓnC¥¹‰§íÏš>Í , ˜2X Ô�ápxanûyêL*gó…�èv:&­º�I_’Ù%Yxf]~IŸý×7)z£!…ÉæÔÖ Ù© !õ&B¾!um¹Q»w#QÖƒÌðB¥ðùœœ±÷š,,)4¤8<:F’$ž×¨ä�yÏ\&ô£˜weâøªôù"@
o3!`¦ ÀE¡TŠíí-t»í±U¥_VÙªº<ÿÏTÁ †$I‚8ŽÑh4¦6¾³²xã/Eëk«z>o	šŽÌÏåê»=õzú €=(WJ÷Æ'…ïÒ	€4s¿&�ÀíE¥Æßâ{Ð0ëÿ½è="PªïMö~æÚ?ÐwÏ»ƒðœs„l™Dne€=Ú	â]Û<¸Á?â8Áñé)ˆÈEÿ—¦ìíD	o_ê)” ÿ]év÷?Sú
–n%Ja{sÝN½ÞY©A]¶Q¿ŸÎ+ ˜*X Ô�$I0°¶¶Vš¿,F?�[k�ˆ•™<‡µ‰™Ë @ç‡kçÍHNÂµc�Ç%síÚ·FTEúfv·AeÎí1v)ÑôÝüG�”„·÷>é3‘½Qx2`ê]›~øÓßeýÎ+ÏûF[yu•ÿ¾(˜ˆ„ÀñÉ)†Ã¤WD˜nû/ºøÞí”ŠY1a¯ó6<ï1qUÖsç"L	ÍTºš4UØÚ\G«ÕÂÉÉIÖþ} L, jˆ ëëëS©Œã¢¿Ÿßi·�,qÅúÆ/×fyL +VV6p±c¬•±~ÆŽGF¥Î˜Ì
+HÌìœ¿ù\Òµà9UnTŽðÉÝ³,(JÊ{ï%'žâ$ÅéÙTšBJ³aQÁ½ïµWÒ×+çœ]!Q„­ÍD3ì8.ï¼+f, ˜*X Ô"Âp8,¤ÍÛÖe•±�€ÍF„Ápåñ„€9QO¸A£=WÛXr£ð,PNB��š÷ä¬ñ7f”ŒñæÚŽ¬‰ ³AXO ªG´™‹Þ;ùOév(M�e7†de‚í!ˆîwÑ÷„ì¸ãìZ9oˆuÛ{¦Þ^»)}³¤Oow�Á`¨ÏŽ�^|Bðt”=Ó$ìïW™ß‡ÈFèä½'ò~ú}µâhvƒ~>@PèvÚØÚXG’$¥Át‹˜ãŸ¶ü¬÷â Ì8X Ô”Á` àâFü‹*ã—B Ñh ÕjA�œe”sÙ²)Z
ŽÀõáu›ByÞÛF&².š#w•2®sý/5PÁ­èûîjkoAJ¤×/�(Õ9^ô¿nNeu)×—áœùíÃksggCý¶²ûe÷òŸ—p|rŠ$M „,z¬Ã5Uñ»´†Ê¥ôêËª÷eß¥"ý¾`b$ÎkÌçA)ÂÚj[ˆÍHz{ ÌRþ<cÒžL½aPSƒ”R3
tU†ßbÀÊJê�7—L™qË×+sçû×d]ð&ÑßKÀâÙ92iÊ3#8ŽfËŒšý§òm«l*€ÜM<ck¯×»¿RÀ¿›7Böž5ÿ~üzÖ¹a?ØÏišâøä$güs}rÕª~ŸÎý’ýS„D©DðÞòï*5ÿ(UÞ‡”½ÀK‚a¥ÛÅöÖæÄu®ÚÕ_ŸÀŒƒ@M‡HÓtª• ÀÕÀ[	°ÒuçÑë²Ù>ùA]7"Áµ› ©G¤çú&¶AÐF@ P"ÕÆˆt€ R
JRˆâ™¶?únÚ¨¥R¦K`ÎjJ�Öí¼þh\ÁÛÁÏµÛMy¹¹KÏ_#3¨^‰\” €“ãã:ÎÅ7Lmüm½JŠ@IŠT±Ðï£ì�Ùw�&fjÄc—	aµÛÅÖæ:â¸\ ,:&`Qžÿg&Á ¦$I‚F£úO`Œ~>¯5°¹±¥R Ò«CA¹`´Ÿ£så•^cnŒ_æpwuiÒ”Hi'5¥
iª R…„¤s[ûÚQ
 ! !™Tšê˜e–¹s	 ;Ðõ£øÉ_˜å]W¥{“
á :ïY  RÂñYDÖË2Ë¨?lÛ�ÚÓP)�ÄˆÓ1"7ÊWÐ+(ü‘`@Å±®gë+Ò*m�^«q¤iŠN§�Í�œœœ@Q¹®þ""ú§­_•ÎóÿÌ8X Ô”8Ž+GËdøóùRJt;mØ §2wfûóAt®¤çRNõÜØß»Ö®ñDGñ�ÀhÄ	’$EªŒÑ* ‰"È$�J ŽA£�ÑP‹�¼€28±Ðõß8%ÆŸ¼ÿy‚ÏA›ú=K)Ðë÷1�`Gÿù_�~ï
I—<­ÿà©>Èg4âD<B2Š1ŠS!6Ú 9Á”�ý	H#Ä£�ô;�t{£áT"àÜ[^`c}íVG*�z€iÓ/Êð[ØÀŒƒ@�ÉïpÙ± “Ê•Å @èeY�¨�T¥^YÈçEô"åsûé7<áŽ€Þ\xvM DÚ¨‘ñ(•¦H’±Ð>ØfGµ	ô¨6‰S4R¡R�JÌèV{\€¡'<„ Hqå\ÙÂ»6ÏoŸ3°²v’^> èÑíYo�M±”÷`“°£¥ô>UqŒ4N0-Ä(Š&ô?$ £Ø½#ýîÓr•uADRbowIºø iü3OØù< ÌÍ†@�éõz –kÄ?©�HFh¶šh6õbÄè×÷÷ÎwÛúÀ_z—í�¯�¥I*Ž ÝF:f5�Hõ‰>i
òþ%IŠ¡µ¦"´O6¢=0„ÞY/JS¨85í(çÒ¶��YŸ	$•é‡S'%ÛËÜ!?ÁŠ r©¡÷ {yB £8F¿ßÞkÕïdòØšô³)m¼Eš ŠG 8FÚÈ[Ï‰í­ C ƒDš©K„ËR D@EØßÝqÆÿ¢ûÎ[¶,-MË=caPc¬ ÇU¹ú«ò	„v«…N§�ãÓSs6}™a3uªg.-p‹›²2²rŠÜh*Ò4Š1‚á£( œQ Å	(M@*õÚñ½©
A¤Ð" èwþÙÂwç÷ÛžÜË,{Ã8;í!MÕBN‹„ó@h@*E£7@Üà›ÀÌóoA»ÿG úôÐ<>%±‰°bi–>œg¬§Dn}¸¯c6–ØÕ_–Î+ ˜I° ¨1V T-<¯Áž¶ì,"C‰v»…•Nišê pïüüµÙ0ÆÛ-óË7úÜ´�Í7ç�Ú]oÜÿHSP’‚†1úð€¹7�ÍýÇÐ#ZŽŒHM;Æ@fjÁ7ô�ÔQû p%€½™ÏAÄ?²{g‘9Þ+·+R¥pÖëÆ¿úw3Åï^)íºOM_š 0ìpbÞÇÈxMì¸>†vý÷8KR4NO½ú&pp>û�(ŠðÁÞ’ŠÑôe-ç›¥¼Mã= ˜I° ¨1ý~¿ð¥¶,FÜ—f·ÓÁÚê
”"�´›ýÃf]ù@æÖÏí}Ž²á�öýûz£m×ŽÙ¼Ç~¤)(N ú}œ	m¸Ï Ùr¶!g�½ÇP©0S ™ ë�€22éÞ³‘›È€÷ˆáuÞ�¬Œ>Ï@ × �Êh'T¦™ÐëþR Ž!ââ^')p&µ«?1-¥0£ §èFh‡@I¢€wç²ìÓ#¥ÀÞÎ6’Ä�7Y^£ïÃîf, jLš¦èt:K3Ç_UÆOk6è´[zý½oüs#ûÀˆ{nÿòÑ°M/KC&R¥ƒ÷ÒHbP2�õpJÀ@dóÚö¶	<£F õú:¢=IŒkÛ3ª%ÿYí{­ï•®óÏâ^Zf&É/•':»gábÜÿöf?¥ŸÉ8ëátD8éôI¿(92£ÿ# £ÓZÃ¡®“ÆÞèvÃ6�\PDXYYÁÚê
F£ÑTËÿáºŸ5½ª, f, j¡ßï£ÛíN,7m{çicš/=· Ù0Qê&8K„÷ÁVŒ ¾£ã³ˆz»¬Ð^ëv<‡»ŽCPž[;!�p6"ôZC˜ìÌ-í¨¶GÀÙˆ�Ž†Îè»ýÿI/«Ë¢øM÷Üù‘9ì k·ÒÐ—½Ë	ùBHôû}Ä£QÙë/�²Ã&•3óÿPÚ@qŒöázÃGÝzÐÞ‘ú_À	€w ï!½L2ñ h*ÇCÖ‘{aSÖ#…ýÝ åëé—qÔoQJñ ÌDX Ôœ^¯‡���Bú2ý<RHtÛmDR M­#¼|ä_¶SAA�]g÷¿÷Ï°£q¿M[Îî$âDÿ0ŽpÒi£OY,€@Ðv"€þ0õPqeÛìJ€ ¡¬ 4ô"…–íy#Z²³þyÁã‹ïsðnmšB¯?€"šzô¯›˜¢,AGî')�@ñí÷‡8ép°ÙÂ1´Ñ 8#àHo Þ#ô@£XO¤&¦`ëtd6”ÒÀ�‘Yf£Ÿ÷D°€™€šS¶`Ó‹põ�Ë[]YA³Ñ@2ÓæFìÈÜäž!·#zaü¹`?„iY8€—f÷Èläƒ8FtzuÚÃáf=èà¶ÚL	è8�žž!:=ÓS qÄz5 (u}ÍúáÌµö:ˆlKA‡íûyY=ïí¹:¤éM¡Ãáb]ÿîÆ'zMÿhÑ?Ãàð¯?ÜÀ¡ÔS#=èÇ¼Àû^
Ÿ ƒ¾ñ x1 3œÄ8J>ü`Ò€euõçó¬ñgÀL‚@Íé÷ûîzYGýùt!%ÖÖWÐl6‘žžAHiô¦¼®#P&<ÞFÌƒ$u>!ÛŸv2 32�ÀNTª b=‡Oñ²w†Áiïh[�ô¡ Á¸´	8 0:9ÃÊÙR# (MLL�ßÏ�Û~(‚fŠ@C®DVvú f™€5ô"³~Ê[à68Ò#þÁp4ûÜÿ´Ö”`¶ 6óÿƒ0è¡óü;¼üôÞ x/�®ÐÓ$<ÀèÝ!ZÀpGF $ö—;}?-böi ¥>Üßƒbaû ÌS~–6|O¯ `&Á æÄq<Õ\áUý|ÞÆÚZÍ&”"DPA¼M+ý3ö£úMCnýÌKPåYÏPRé¥��@Ã!Ä°�øè1pØÔ#Ú3h;{Jz>û]$G§À°uÝd¤£ãí³™îFû
!Í‡þŠäúÊÅÇYÃï}ôŠû*”B¿?˜cô?ƒHÍž	£0èƒzgh¿x‰—§C|½ÙÆ=¥uË€o	ø£F/_cõý{¨AÏm%ìö˜šC öw·ÍßN¹A�Å`_ÔtAYYžÿg¦�@ÍIÓÃáív»4ÿª]ýUùíV­fD

23žÎpzînß�Û=ì-È•Öu�ÐKÿKÄ€"½#`š‚âh4‡h½=Àa„WÍÖÿßÞ™îJŽ¤çù2·sj9UÕÕ3jy,A‚õÃ`À° ¾Ý¡¾ ý`°-hKÏ¢žžž·Ú]]]UgÉ•ÿ`3+É\ù>@V1cgf~K|�$ðr[ïƒ¾ða¾Âä»w(—K”ËE%7¤Ü >XH·òRdšå+µræûÆ''åž˜6*‹%Ê¢ˆèÓ‰/Z•/+~µ–àé£¾Çæ·ÿÿðêOðYÜgÕÀ?Jà7L¿þ=äÓ=0ŸW^€ÍºµðÔÆÇûŸ‡sÈRb2ãÅ‹ç�åþ|ú!…|lº¯ €�³^¯�KÏÉê×ó…È�a:W›ã”;_	î]\@3&@¨£4EAªŠR@-\nçýš`RHu®oåÆ_. Œß�ï?|Âï^¼ÅO$0É«&¿)�ß¸ÿð	¯ß¿G¹X@.–ëu½— Ê¢kì'·ã[ Øz4*ª#‰)v›ø(åFh÷¬é;[v'çÕ4Érµl”‹cû=D•»³ Ö• O�Þãög¿ÀÏÿô'˜ÜŒñ“b« àéëßãÕ×¿AùôñôX)õgÕV	hK(Ëw/_`6›ì	Ó®ÂüPÊƒžÆù€�S–%–Ëeýþ\…¾Ž"¸½¹©>v›×(W¾šËoºÓ%„A4¶ÊÙ–)«ªò¥¦4”uªœÌJÈÍb½®„Óüòñ“_ÿÿôÅ[|–U1  ðUü“Æ_ýx¼‡œ?«Eµ@QìäQ=FµÚ *"¥Ì¡H›î�ÆÑ¾¨c´$cZc÷®V+¬×›öÁ±Õ YTkù—Kàñr2Ãí—¿ÂýÿþøÛ¿øw¸+·û(|\à�ÿûÿ„üøâþ°xªbÊ5€²Ý€í ¤cÇK›¢Ä«»;ÜLgõ–º‡XÐ§Ð×¡@b @jàÂ¿OÁ¯ÒUðÚÝ‹çU _¹sÝ7ê*÷¾¬ß y%`SU¥fœ@ÝŽ%­äfSM,—ÀÓ¸yÀìëßàÛ?ý—ø»Ÿ¼Å÷ÛSX¿Ê�wÿü~ü›¯Q<> �Û€Íª
ÜžqïvãÈÔ>¶=Ž×åßÌX.WõgÙŽ ”Ûi€%0ÆŸ 3�Ïÿæo°çøá_ý1ò‡¾ø›ÿ†é—¿‚|ø<ÝW
–Z‘Ð§eÑ{•E‰7¯_a6›báðåbŽß—Î $* ¤V lgœjŽß—že²<ÃÝË—@&PnÔ2:�Ýº}Z`+…¨æÒu¡®y	ô©ÕŸr�ëÓ @Y–Õ6ÀË%ähÜ?@ˆ/úøêõÂ?ßŒ!Ìçk|ñwÿÙ»ïP>|æ•K[®´m€5Á_¹üku öH@îö–{Z‚EhlïÉ†›M�ÕzÝJøÇÙÐ�ÁU/50ª¤qY@¬VøÉù¯˜ñ¦> ÿðåj	<ÞO[÷ÿz×F„È }ª^Š²Ä›Ww¸¹™áñá!(PÏÁêWy<€ÄB€`¹\6pç(ô÷Ó�×w/¶sàÊm^	‰†û;7¹9¤ÐvøSµá"WµvB¶lXÞ[×üö¢r½��Yˆxó‹Ÿãs!ñÍ_ü9 àÇû?póóŸWÖÿ§{ÈÅ| ¸ÞîhZý¦[_jÙÃVÔw`µn±ô¯eY	ýõ‹*­(€år<ÁÍwßB ”e%ôë×j·ëbBM-“P¼º{�Ùd‚OŽ€ºsú:´þI,T ‹6›F£Q+A}\Á¿K¿½¹Až�P.·«î• Õ„¢né#7…þÎÒÞÕ÷+»kY®�¶Áe(K”«%nÿþïñ'ÿçg Äü	Åb	¹x‚xz„\n€rƒú@mº¢N•åÆfÕÉ=YgùI<==_PH	ÈMu:’”ÕôÇj	ŒÆÕÆLÀv·¿Õv—Åuµ|°ÇqºN¾4Éów/_4ö hÞJÿ‚»¯ø®  ±P X.—µàãœ„–eÈ³³é÷�R ë~gVK)!³Yõ¦¸;·þö}ýF			©ÎØN1ÔBW–€Ì åÕêY/Ä|Ü� Èjzb½VKÈíò¿Ý@šRß›ÐÆ¨mç+Ñ˜þ®×ò«åír÷Þ‡€Àr½îAø·ðHl÷Ð®óÈ²]{r{ÔrYV‘ÿRyIŒ õ¨³:¸Ò9L)q3›âåËçØl6NEÐ—–šÞ×ß–š $* RJ¬V+Ìf3k^LZLž/?5]�|”áÙíß½«–ç© ¯ý¶¬…ÈNø;A¯¹à¥¾ìÏX6fÆl7æ‘å�eåÒ_®�<‡Ì¶ÂªPmwÿÛl¶BPsEoÇ²ë£^¼W�sWÎ’¦Ç€q+°^mª™…c¹ÿëÎ·ãTú%°Ù®]Ô×'–ÚwVßPOc�¸ç²,q{{‹W/ïPëœz×ßq›àØØ:T H,T €jàåË—õûsüzþh”WVš>—]éêÈ—e@!t%`›/´¾”û]YÕBM Q¯¾’ÊÓ°æ+6€XBf¹fÐn]ÝeYúS–ÕyÊÃ hûc×·RUt«_·òõ©‚HÙ(°ÙØÅvgÁS µmyµe�6ŒÏ¥„¥ ,%nofxóê%ÖëÍ^þ¹¸ú]ã`  ‰…
 P
¤„è9}%Àh4ÆëÏQl
äyVÏÍï„ëncŸÝþ÷€²¢k[»aYC‹ÊßW ÔF;ê?)¶
ÀÖµ-•¶¡·Wù«,Z¹+vmÕ½7n¿€¨�¯Ê¥�Ûú×9¹€R¿;EQàöö¯_Ý5€s¶ú\@R @ 4R´ú}>Ð|yyžãÕ«—¨6ëÙ†#wÇïæÎ·sø¥>ï_—jNèiW
i[ýb'ÐQM˜ÊCmÕë¾DS–‡ƒúº<Ü‹Rb³ÞœVøŸ"Ë*¯Œ)%f³î^¾ÀÇ�­.õsúz ’  þTÀSXû¶teÅ>»½­»´9~3@ˆ¬²ÖéÆÿÛ7;ï».Œ5ÏÁ67°m·NÓ-zM	€Ù&šy�©	ûýw}°o6›z›ä!Œ}ÀËÏ0�°Ù4§ ººú­Sø“¨  Ønëßæ¬~•.„@–e�G˜NF˜/WªPŠÆzÿ¼>
¦n¤øPéZš¬[Úºý�_n§ôé„º†q]ù¶Ö™¬}õx„Þ�Þ¯Ôßk÷íüÄÜ¨!­×ÄàÅ‚ 2Ñ8Q'Ï2¼}ýEQDí�ÑUð÷Y‡€$* @õ0™ÏçxþüycqŸ‚½oï L§ÌfS<<-�ebk‘+×úÖÏPßYÜÿ»r[Q­Å¨XýÈàmZZÝ’Åêß	þmÅZ)h´³ËmxLoÆ®Åt
º†5Äv9à¦J%QM-}öÙç Ày	}=�
 I�
 ÐT bÅ±\ý¾:Àl6Ãí³[”ïÞCˆ¼ÔûK£á¿óõkeµC°-Öpùïªj±u£ZšïwE°71ÿß…Í†›ÃìÛ8 ‹7DJdY†?øñ[–Ï,VhÛ#¦®©ä‘¨ �àÛ-íÔV¿ž.„Àíl†—Ïža³Ù ªe}euÀ�,Kˆ<¯ö�Q« êg¾¶'@õ_u­Êé¥ô4ðW¯:Ô®õkŸ¾!ø…&è…ÑÝŽl¼ïJY–(Êe�    IDAT¢·ö.	‘‰zúÅÌË³?~û¶ö Ô9'˜ãO©'%7"iP 5¶• Ày	}=­ŠÖžâÅ³[”E‰2Gío/Ëj5@.ä6âÛnõ£!ð!�(ÿm•†¥¯Gï9¬~gÛÍÌƒZýŠ¢Øô©O\BdÛ‰Ì/ ZbúöÍk¬·;&ú” WZ(ï#ô �T¨ �šÕjµ—v®~ßûñh„Û›”(õC�PÉæLÛI§éþß¹ò€:MæûËõk]øk¢Â“×l3ôt¡²
ù¿� „€ù©—RâööÏžÝ`¹X]øwù{£ð'©P 5›Í«Õ
Y–õ*øÛÔ‹yØŠí|:›b”å• ÓŒºj³;¡ô‰ZA�êè` õÿZ>t±¬n\ËZ¹�Ûôz¤Z°+ÍüCRJµ¢€*€Ižå(�ƒsJ	|öúvuçlõëÐýOR¡@j6›–Ë%ž={µàÐ´˜r™ÈðüöãñËÕª:¥wÌ'óíÏ[ó˜þÞÆ>^ë^ŸÐÓë‘5‚üNeõë”EAÑï@dù^š,K¼ýì„QîÿPÞ1c•N€¤B€ÔE�Õj…gÏžÕi}¹1S„)ý¾|ñÓÉËù�åÛ2b»¬O½×…óÎP§ì¦Sú´�ÜOß5¹3 å5Rô>ç„ý!ö^¥,ñãÿÈ’~>®~W: ’Êèè'‚‘³FÅôiÑt™ã�iãîåL&cEÙ°v3!¶.p%¬5_îëÚ;PÏ Èúº.o¤7âT9•gŽÝ<º÷�ˆjí=fbEäYuBã–Bøƒ}fõ ˜œƒÕoÂç9I� Ò`¹\Fe_þ!…~Ãê‘/_¾Àl2Á¦,1Úžr'„€€¬â©j©ÊÍi =Mo[6¯w‰šü–¯‚ž·7pGøC³þ)¼äYŽ²\×ÇËBâí›×€Ã¥~ªà×P:Ï  m @,—K ¨- }Y?}XMÇcÜÌfÛ| �"‡”ê½ö4÷~mïË†¼Ö:ÙÉjí¼¾FysJÁ”öæ0�ýp¦,ˆ£^ˆê;�Ç¸{ùÂ:}rHË½k
Ò* ¤ÁjµBQ­Îèjõ·y0@–	<»½iXí"Ë·¢_hÂ_ÔÂ\Ê­‡ €=š»*@+¯õÂ:ýzW ‘&ëù‚ã ¡v>¤ùBdY5P(K©M'í6:W«ŸK IW¨ �Ëå›Íãñ¸‘~.Bß¶"ÃËÏ«^4×wu&@U¾:ˆ§éêßŸ
Ðæógù7‡c–=åƒ™!
!�‰…,P”^ÝÝáf:«NN4<`ÇšÛoS‡€¤T HƒÍfƒ¢(jà�« újC xýê®
ú+Ê­÷BÔy�%Àýóèÿ²Øž€jÊëÍëW¸™Í°1ö8FDÿ¡òqA€ì±\.1›ÍÎÖê×Ó³,ƒØnÝ*„@)äùxwø�¾¼¯úÏHßµ¿/üe³|3IU¦ð¿d$ D!Š¢Àg¯_áæfŠûûû*ûŒ­~=�ß;i ²Ç|>Ç«W¯iç$ôM„xóú%�	R"y½�_½1 ¡YþõµÖœÐ¬{uŽ�Äî}#OSêÉ-w/‰<Ï°É€MQlc &(6›³ú‹-Kˆ* d�Åb ÝJ€Cºú�m”%žÝÞ`:c±Xîöx×„¿Ü%ì¬vÝÒ×ÊÃ’×ˆø÷æ“KCÅ‘äyŽWwÏ‘eb·‡‚Æ©¿+Ÿ« H[¨ �=”pÎV¿ž.²Yžãù³|øô°Ý°tÏ÷7¢ú÷ßWÍ*‚’ôB+«Fà>6ùdp#˜d$€,Ë«“%Ÿ?O
 <õ
�P!>¨ �=l›ÍÍ!ƒÛ¤çù/^<‡øö{ Û `æØ–©·ôÛ]7ùúX(p¯‚,ÃíÍw/_ XW;žRèÇuÎÿ“®d§ 9?Š¢Àr¹¬÷0]Œ‡^Û¾^v”�ðæî5 …’ßá¯yúu7¾u: î	rW�.×kDÏnŸáõëWX[< €û{¥wý�‡Êð·HÚB ÙCJ‰Åb�ñx|¶V¿ž–e¦Ó1~ô£7(Ê²±-ªW	°þFWgáOGQ”xþâÞ¾y�õf½—ê)€”2„ÄB€XY,¸»»kìˆ¦sèéÔàÀ››üÉý&Ó	¦Ó	ê}þ4Ë²!ê÷…ÿîÍ¹þ¦ò@®!~ôö-Þ¾yƒoÿß·­,ôS}z£H¨ +‹ÅÂë¾´ÑU˜w)+%ðçÿáßã?ÿÅÄÍÍÄÞ\}m¦.Á{ä¯´^Ð#õ�É®ÏÊ=ŒP_½	˜˜ÏG>³Ä¾bÛ(e‰§‡¬V«^~÷]òbëS ] @¬,‹½óÒÏÍê7ÓÊ²@Yd˜?=YÛ÷õ�:®.uÚÖo#0Ú
™]š¢”)ËŠ–¾£4ÙìÇ¬ïêk›b–Ù5'mÝy!‰Í¦¨·ÂÞË=#«?¶BBP VÊ²Äf»Ê¡,ø”ò1iEQXÞ®ò)ãê³n›ô.e£qL%¯mŸç^'¶…>é* ÄÊ|>GQÈ²,J JðÛÒ�ÙWlÿ)ýCÀ¶&‡TTÌ¼sú}÷Ó_ÛúY–a>Ÿ#Ë¸˜‹´ƒ¿beµZAÑx¸¤xú²úûþ¾9ÓPÙ.uCcí£l—i‡®}…>›K°^S¾ß˜¼˜û•ñåM§S<>>zÛ'Ä= ÄÊx<Æf³±z €ÓºúSû:„«ÿØtß®þC}W‡n£ï:Çê?¥LŠ"7�N£Êbƒ âäë¯¿Þ{ÀôaýÅZÇ}õÕ¶lWÁí»Ï”Ï$Ôß!?Wù®^—6ƒ¶Ör›ô>û�-ë)QåV«Ýÿ¤üõ�úCèW¿ú^¾|¹—n–÷µJSíÆ©¾”ŒPÙ¾·k¬]ËšcuÕMº}´Ñå{ôåµœmyŸý§ô™bõÕ¾OOO�Ý:	I…S ÄÉÍÍÖëuc) Ð�Ðo[÷PeÕOmb¬)åOÑFßuŽÕŸõCeÕ2]½œàaP$* ¤Æ|ÐL§Ó:Ð–ï«{ˆ´¾Òû¨}|&±é‡üL\é±÷w,ÁÛ¦Þ1”…”2©Ö¾SàS	 )P  ì›étZ»'SŠ§´äSÊví§ëg’Òö9[ý§¶º�%à�eõÇö£æÿéþ'ma ±¢0?ýéOqss³—g*6EÁ¥<œ²l×~|
Ql_Çë)î-u}×é³�P^_õÛô3›Íðí·ßzÛ$$= ÄûÐyxx@žçÞr®_Û´¾ÒmB ïº±õ5Î¾Òcï/µ¯¾ë´i¯ïþcËôÑ†«L–eÎ Rr€ÄA€xñ¹û|‡*{Å%µ¯˜²‡T2RÛHß¹
ë¾Œ>ëwí§(Š=ÏœY�J 	A`à„B*ÒX­è"ˆ%HÍ´>é©•“c�+e|m,ßc	ðkú:EQ`6›Û¡@|P01s™QL‡\¶¼¾•Œs�’èÚWjz_¶­›ü^…P^l™Cºú}eF#>¾I78Pb-–¢(ðáÃk}›ÐˆIs�!TÖ'¤ºÔõ¥ùÊÆ¦›i)ŸI×¾Ú¶[?TÇW¾Í8SÇvh«ÿÂ6›áw¿û]T½Ø¿s2L¨B’ Ÿ>}Âë×¯QÅ^^ß|JÛ}¤CYÕ}{&úWJ}Zámê´Þ‡ú1R1P‡ ½}û6z,œ
 6¨ /yžc½^ï¥ÒMmËëâ¢>”ÐŒmûPŸImòs8T{§°öûj£�2eYâÙ³gÁ6	A`€¤ºÍCGŽiI›é‡T<hõ_¦ÕßUp÷añ÷1Ž”vnoo£Ç¥êÐ@L¨ ŒÔšïÐ
ýÓ[û}ôymBÿXnþ˜²}N(–Ë¥w	 !±0p@¤ZþŠ¯¿þÚº`l©e»(6�[¶M}ÕmSÞu®±¥ÞojŸ¡öRÒÛ¶#�ûþ±}õÑŽ^v:�âË/¿Ü; +¶>!:ô � “É«Õ
ÀåXýê½m£î5Àú	kzžš)Ëòä‚?%ýÔV÷!,x›+[}§mÛ=g«ß,7�£ê¹ÚâT QP Af³‹²,CY–uú¹
}ý}QVÁàjs³ÙÔ÷h*
@9�(ô[ÔéÚÇjµòþ^Æã1 Ð( î~Í#uSÇ—R¦¯r“É$ªBBPmÜê9›Í°^¯ë�GúxÀ÷mEÛ„Á—_~‰_þò—Q¦!�ç9~ñ‹_ÔÇ ëƒ²,1�NñâÅüå_þ%>~üØz¬]ïÍ—w¡|¬~tïËÃÃþú¯ÿY–Õ[ß¥r2™ ËsüáX{«mí7Ž|4Â¿ý7ÿ Šmìøú.[Ny ÚZóô€ÐeîOÊêTÀ÷ïßã‹/¾°?\ÏÈê7Ç­{|(!“çùž0Ð)%ÆãqÃB«ÿðS Ëå²1%ìOïE�õzmæf‹RJÜLÆ¸»»ÃÃÃÃÞoäØ‚?¦¬eY6Z
sÒ* WN[á¯ê•e‰<Ïñ³Ÿýög†ù|ÞY¸JØéyRJŒF#ŒF#§u§3™LðÍ7ßÔû¨M�Ôœ¿0eYÖyÇ¶¾cúëÛroS§Ï>Ëå²þ.ô³)t¾›Í¦Vüê¶ýM'“=aâØBßD­È1•èT%€Š¨ �\Ç�*Bê˜®l¥ ¤<ä1›ÍPE-ôõ—R Ô¾úÎˆ]§0úhãÔÖþ!ë(€ž'„¨“ê»X¯×˜N§Î¾tÆ“)d¹û~Ï1À¤,Ë=§-T€+¦«õ¯×Wq ¦àsõÓE wšRÊÚUšç¹uc�,Ë°\.kë_Õ×…Y–B`½^×ŸCê¸úHïËêïÛSÐ·Õ¯çeY†ù|^{rÔgoÆ¨r777Áï¨æÒ%dÐCtj«_¡î7ÏóÆtH!N%`ØP \§Ùl†ÍfcÝÈU÷ØBßd4ÕÖ’ï!—ç9~øá »U .%`³Ù`¹\b:�ö~¿®¼!
}!‹E�¯¶© äyŽûûOøüóÏƒ
€”“ñ¸!HcÇ™R¦MYê^mq*ä$nt¥t}àèõË²¬çÈmKàÌ‡¨ï¡ªŠò�eYpÚ¨ª P»ùÕKWŠ¢Àjµª—DÆŒ!ö~}åmå\´h)ß—/=¦Ÿ”þB<>>61S1Sÿ/ËÚ[B_NçÚ"õ^låúþ£Ñ÷÷÷Î±ôÕT ®�>]ÿúû_ÿú×{›�ÂêïCy�R"Ïó( (
l6¯ðWÁëõóù¼á†íêÑ°åõ¡<„êøÆÔ&Ý×…AG) æw£¿Š¢@žçx||ŒúÞÇš Eð§ÿ>�Çx||ì½O*Ã…S €ßŠPizP�iñûÚl“Öµ¬”»åz!ër³ÙÔ«”kÕ´2U«Õ
Ö©…>„~—ú1uÚÔë+½m~–e¸¿¿o|? ¬®ðñx‚÷ïßãîîÎ; ¥Äd2®•¾.ãm[6•¢(êC€l¿=Æ�T¨ �$bÖJwò}´¡h1› -—Kgä¿¾Ö_E`?==@R<D›{ë[ø÷)Èû¬*£V^¨ï@	~=øo ÌçOÁ~²,Cže�²á+º,KÌf³ƒ÷C†€+£o éP‚5eç´cYýfzY–�Ç^ËFm dºûmJ€r3Û6¥‰—-oV[ÁTJ–Ú@½ô õ@@¤©‚Í­«õ¾Æã1²<GQVë÷\¬~…òTM§Sïßž¾?B*ô* WD×‘O8)á§¬ßP¿1‚.¥~Jº~�ç¹÷¡6�ðáÃ‡úÁiSL/€š.Ð7d‰½¿cYÛmê�‹Ð×óÕÒ>õÙ›–?€:-Ë²í–Õc<<Üãõë7N`4Ê!D†²Ø$�¹MÙ>˜L&øýï�Ï>û›Í¦ƒMqé¢�aÁ @ ^˜<<<x#¦]i±ý¦ZÖfyóÚwpŠEQ`>ŸhÎû›mëÊÀb±ˆï)„¿kL}¥Çô"vüÊ +eªŒ-N£ø�• tô1��åY£½|ŸÉ!™N§õRÕ˜ß!1Ðp%´yø~¶¼,Ë°Z­p{{{ÖV¿Žo7@\–e™wý?Ð<X÷ ÄÜ­þø2f¾¾	�z»øÝ# ÒÕjW „ú] ¥ìoÀC"¥ÄÍÍ�3ÏØÆ +^äú¡@¢ÑwÌS˜c
ýØ¾tåÅ8™LðîÝ»z~ÕeUšæÓÓ“ÓµÜæ¾Î½Î±…¾Ž¢¡ ¨ï@Ÿ�RÖóýJ™[,æX[ÎPåÇã1ò,÷uj¡¯S–eCh#Ü	1¡pt±þSòò<Ç|>OþÇüfžR ÌÃSôüÇÇÇ½ùÿÐK?)öÞNm¹÷]'”×W}µ	�òÐèèŠ€þªÌr¹Är±ÀÍvÙœÑ1F£1 Ú}WÇFmA}{{»wþ„Oya@ 	Á€§ëÃ*Eˆ!ðÍ7ßìÍ«Û”�PzÌXRÇgËs­ÐƒËÔ&@¦¥on
dó ˜
Gª@q)R®¶BŸ�¯ŸÔô6y±eb•!Dýy»<2¶½ÔîŽ¹cC Ñ8G&ìÞ�sc<ã›o¾Át:užÃáûÝ�ã=‘ó€
 qbn«Õ**°Kº™Ö¥MsçBEžçøôéS=_¬— QýÜßßï�‹�"Äcî9¦Nlz×ï(f|]îÁW¦Úßÿ¾^æg~' ö” åøðá2Ë�”ã|\ÇÄŒë”¨½'\ž7BÚBà‚iû ˆ±Láìæ!Ÿžž¬[­úGLºK(†Æç«¯Î0Ë+Ñ&ôm«Ôý«Mi\{´±|cb×ô˜<ßB´¹‡Ø6–Ëe£Ûwc*RJ,sûÿvƒ(%ü/ýð©C}‡}Ô!—€�á{ˆ„,eYb:�bµZ5 Ÿ0òµçKKb!Áfó¨}tÐ\fØ—–e‰ÇÇÇ½=ÚZï.RômÛj“[&VðÛÊ©¹o5ÿož`SØô2Y–áþãGdYÞh7ÏsŒòËR ”Â¢ˆýt½¿Kù|H;¨  v‹ß|0+àÓ§O{g’ëucÓmÖ\Ûº®òBˆ=@	–‡‡«Ø6§¬ �àÁ®ŸC—z±ŸC×:¶üPý�b£`¬×k¬×ëÆw¢êëß‡©¨©Uß¿ÿãÉîû—R"Ï2ŒÆùÅ7uÈ‘iû»!$* J›?ø®u¤¬¢êùË_î­I	_Z—º1yJYÑY.—X­V{‚#t�ºÖ7D²�#%Ý7öÔô¶uBãå§¡˜~TµžßüleÍï+Ë2<=>A«²,C>:Ô¶Æ]æÿmŸ[›úäú 0@lB5tmn„£Ö×‡QJß©ucÊÛ< Y–áÓ§OuSÈ›þ¦•Y–ean™èSð¶U$RÓc­õÔ>SÛ1ÛR[ûêK Uæt�þRy›Í¥,±XTÇ7«²Y–a4]„`S{T aÅÙ'è»*ä:á> È¡þˆc�étZGÁÇôc}S�Føþûï÷\øJx °ºœu”àú>N-ôCtñôÙ—òÔ¨ÏY_Û®¾/}@=O Þßßã³ÏÞÖsèyžcœ�P”îã‚Ï	)eÃ‹¥âTžÍåJ'D‡€�Ð—P¦Ó)Öëu00d±¤Ôm[^=<jþ_jdó Øþ7ÓÚL„ÆÙ&=ÕãÐU ÇXñ±åBe„X­V�eš.‹×üŽ” ìWÕ@)Ë¨{95eY6~Ã]¹„{&Ç�
À…Ñæ�7Õ5è²Ø•[u2™àãÇ�Ið±­~ÝbÔÝ½jý–e{Qà6�â:ª[Ÿ)cï3=T§«@>–Õ¯cÆjèãÔ=6*ÝŒÝØl6X.µ2P)„ò<Çfsþ1 Y–ÕGëŸ™~ßæg`»¶½O�JÃuB€Xq)eYb2™à«¯¾jìhš.+Õ%XS¬ÝØ43`<ãÝ»wáa(¶1ëZµB¯ï·kœ1ŸM›Ï'T'¶LL}õe–QÂÏ¶ü-ö·£–l®×ëÚ�ç9F£Ê˜�Çøðá€æïìî}*×€caÚ®Õf8¶ÈäaJÓÓSÊ»úÔƒõT Ÿ>‡ìºOß½,¬×kk^h<®tßç�RÇ×Ol™¡[®Kuô²Kð›iz[êµZ­°ÔŽpÎóÑžBw®H)­‹¶¿;Ûµ­=BT .ˆ6¼¾‡d¨ýÚ\­Ž`5ã RÆÞFHÚÒBRMè'ËéîÛúj×V¥—e‰Åb±77ÛV�§¤‡êtÈ±¿³®JF¨Œ”²±ã¢O	°á¬çºÿ„<Ë „Àd2¹ˆM€T¼Êl6kŒ×÷9˜ïS‹!Îý3#iP AKB	Q]øéeR¬ø�eï*k
àPzù,«æ|Õ¾ò«ÕÊzV|¬R¤>sö˜{jó9t©[&¦�¾úŠ-S–e½°­®«]³L–eøáýûê\ ŒÇ£FÙsf½^c:�z§¦l×1\Âý“ÃB`à„„¿í}Y–UpÕré\
“J�Ió�W¥	!jKÝ<XÆ¬ïë×üæó¹3:;ÕB�Î)ýÄ–‰µS”ƒ®eÊËóÝ¸Ò”àœÏç(6d"Ãx<©ÓÏy©Üh4ÂÇ�ës lŸCìß,!6¨ \mþ˜}Î6m¨kµ-îãã£5ÞÕFLzŠòà+¯Pk¦ó<GQ• Ð¬ÿËÊÖgQõ^ 1cm+ÄÛ(±eb]•Œ6ý©—éð	A3Mÿ½
!ê•+ãñø"„ãl6Ã·ß~»X´ÿN}è§Uº¸„Ï�ntåÄZ´¦…ãZ\.—u„}¬+òÖ¾/MÅ*ŒF£zÿ3ø«�¢¤Ç ô-ØSëôY?¶lŸÊƒ­œòÒ,´à=•Ó–^N­£ÿþ{|þùç˜LÆIžˆS!¥Ü;@¡oäÚÈu­¿?g9<ô \ ]¬ÿC 8‹Å¢Þ8Ôï1\ý®4¥ Ìçsç1¾©Eaõ€¸Æé¯/=Ô^_õSÚékÊ 46›Ð%ì!¥Ät2=èßG!Pf³Y}°°¯¨›¤Þ×¹=[Èq¡``ÄXž>k^Y#yžãññ±~¸ªræ¶¬ªÝÚÐbºåbkÃVÞl×¼=MÍÿ«Sm1¶Ï"T®,K|øðÁjYéc÷�-”j¯¯ú1íÄä·)ç›úüõ }«ß˜ÏQ_M[Û¸Y°s®¨s¦Óic#ß÷cù»ê�aBà
éKC7­Sð¾{÷Ÿþy}XIh}Xû1åÌ¼Ñh„‡‡¼{÷ÎYNG¹ŸméªÍ<ÏñÝwßáþþóùÜÛ›1Çp,7}ßîþ˜²j`µe³©ºê¸P¿Ño¿ýßÿ>zœ§b<ãÓ§Oõ@ ^°§Ò¦-*×�ø«¿ú+úsÎœ.n=ŸU×®mEm;åé/µ!�™¦êª÷ê¥—1óÍ²¾|uíKÓû2ûÕï-tì¯ù™èïÕ>¦»ûT®ÙS“bõ›S'f]ÝrWïMÏŽžf¾WígÛµÿê»ÒË™yê½-]Ï³½W}™/[Û®~Ìë,ËêÝ6õ|ó~Í4Ûµëû‰Q¬\P¸|è8sÚÛ}f[±VŸkÎQ]O&«`—²Š”WRmd¢o"¤?Üu×®™ Q¨ˆzšî¶¹ï]y®zª/ó½®`¸Úo+È/Mˆ™ZÑIY†g
ÿ�òàÂfµú	ó+Ü]/ÕŽÚ™2¤H¨Ï)tò_ì}û¦Ìè&T ®�.ÂÃõ w	5—µ­¾ËZ7Û6­óå*o³ÚuËÝLsÝ³ª¯ß¿~mZú6Ëß×¶ù¹…ÍéŸŠ>ø)q>áïò¨2¾8ý·iÆ•¨4ýw¡”MS´ýþtåÆ,¯ÒLo†~m*Ê ã´)ºÄ¤T ˆK˜ûšË«àkÛÕfÈåîj·á§?ÔCå|
�Þ–ÙžÍÊ²¥ÛêÆŽÿÜ	�Ó—ïrKû\Ø:}Z¦)VýFM…Ò•ÓF¶þl}_Êo‡* gL�gs×÷Ñ†¹‰OqðM˜ub{è¾\®û¢(¬BÜ5]`ó˜õÍé½®í~Bük~0·d.Áï›ÓÖ­~_ù�R#D]'—2bStÍßŠMð‡~§f¾×=¹î�* Æ&”Ík—õk«ïk'eL.¥ äÆ·å›.W[Ü�«¬ïëZŽh
™Ð}é�kÁëy1Ê€íÚ5àSBãÚYõmHî.¥…�„ 0pR<>a«L¸ÚèÃ½ïB·¶|.}=Í÷5->³��€wµwM´<.€/Ï5—�¯¯˜ö ·€Õ•Ø6Ö¶¯Ý¶Ê !6¨ \>a+è}V½t®}ÉmAy¶vSÜø©ØÜþzž
¦²¹ðmOÓUë²îmSzºOAÂCÚ%€CBÊ&¨}S *Ý´ðc…Øï!Ö2ÜÊ€™nþÆÌß¢~�¦"«úÆšÚÂï�4¡p¦œ“U¨ÆbºÏÍ|[�>ñ¹ùM—©råëÂÞæV5Ý÷.ï€M�û\ýfyŸå:dl[)Çz L¡årûÛâ|é>eAý.\[@‡ðÍõ»ÞÛÒõ1˜¿á¶´ñÐËpÙP(m]þ*ýT
ŠK	ð•³]Ç<`m^÷
˜é§¦�ïäØ÷ë‚Oõ ØÊê×¾ò§VÖBÊ£"fzŠšø 0 û|óz  SIDAT\V³¾FYpØ¶ÁmÓWL\@,6‹Üö t=Í¢KØ›®_ÿ¾ð)¸´½ÏÒ�)ãú_á[àjË×o¨NÌ¿��ÐoÓwÛ˜r½P IØ„ú±„žÍÕ¯Ïƒšü
sÎ_•óM'˜iªÍÐ€kê€„		V×4€-ß¼½ 46ÿ±µ×õ»¤�%ç€+¡/!
àë«?— u¹í}}êÂßTT=—@]ë÷ís«šc±¹i}VÖÐI€¡¹x[Ÿàºv¥¹ú1Ç{O©Â?&p¯o¨¤* $ŠcZù>÷»þ@6½ ¦€¹qÍ€,³_×~õº§ÁÖ‡ë³J){-ô%]Aw!aíþzšM�›i>ïA_tÀ§ÞT.* ähøÜî.�€é¾×…½žgN˜}šÂÜÜÛ]W(T¾.tt‹ßÞöaxMŠ@aª#¨õ4Ÿ…ïJS¿-}jÀ7>›¢{?©ålP “¶P(±y]“KàÇ”7]í¦åíìšPk§õýÌòê½k™UlAì½—põ•µ	[] »ö0ó]V½^.ÖÓ`{ºŸØÕ$1SÇš. —€+ÃyïJ?¶õisñë¸-_§ùpÕ¹í$6Õžmû^½/W¡íkK7óI>!åS|.[š)üÍýBÊ€ï:v_ƒCc[íbË¥‘ë†
À•cyÃš÷¹ùmsöºe®—uYY¶Ýüt÷¿ºÖ¾êW4)%ò<¯ÓlÁ�Š�RÅ‡h{B¿-=Ö2�µþ]é®—9ÆØ´˜ûs•ë2ÕÄß'QP ­ðYì*Ø·D|.~ÛÃÍ¬£»i­›±ºÀ×Ë˜m™ÿë÷¤pEü»î™ô‡OXšy.EÀøúµK »Þ»®mJ‡­¼ï¾bî��>¡@¼˜sj= <W:¶W½ô2æÃÝT\ßlÛ\je›Bñ¹Rõr¤B‚/äŠwy  ÷æ@¶é =Í%üõÿCÛÛ”€®Ê•Ò* $
›ï*g
[Ób¶EöëB@ÃÍ¯?`•�Vóý® =ÓÝoŽÝ¦œØVø”[9Ò�¶
€zïR \ÛæÐË¨÷¶òfü€^Þæ	SØÝô¾Ï„J i€+áóû>¡o³¨móùf³ž»-ÏvmŽK±·á�Íúwd¤+	¶ez9œ÷?±–°­œméžÍŠ÷ml
s½œKÈ»Ú
y*Ì¶}÷f«›šïƒqÃ�
À•²ÌÍ2®õõ}ôeó ¸”ÓÅnÐ
[àŸéú×­xÝ�çyÃÅo*6×¿þ¿Zþ‡£/@oË%Ìõ÷¾àÀPW?¶ÿCi¾ÏÄ'¤}mÅ~¦dP¸rR…»^ÏeÍ‡¬tý¡f³�]eUÛ¶€>åò×-{}JÀ|àëiú €Æ}¹}Jô(�¤“âò¶•�µÊ}–=`wé‡–Æ(1›…>‡ÐçÓ>6T H›Â [è¶h~[žÍ
1#ìmV¼^N/ã²ôt«?ø§Ú6]ý6kÊè‚
@´qo»”ÓƒäÊ·†ºép½ô2:6EÂv?©^Bb¡p%¸æËÛ¶£·`¾·]Ûíö§#ôžnõ»\ý¶ûwþ™}Û"ÿÍÏÁö>Tž´çP
@È+`*)‚Ýç0±íNºw]±>”ð§R1<¨ �=\‚Ý´î]ñzžÍk §ëÂ]Õ³Íõ+\®~ŸÐ÷EþÇ\›ý‘Ó‘"üm×6�€ËàüªŒ)ümifßf_®>C÷ekƒ�T¨  nA­ˆ‰È7Ë™–¿JW˜½ßÆ>¶%‚úXÌù~—£�×wíú,Èñð	¹X@½·Yý.�ã0óÍ¾BKC÷‘rï¡ò„èP(>a¯Rl
�Þ¾.¸õ|½®Ëêwmìczl‘ÿ¶ûÕÿ7Ó}×®¶Èñ8´ ¿w	uÛ†@¦µS^á‹ð�)`¶c‚}.„ T �Mx‡„¿iÑ›õLA¯_ûæ\§ò¹¬z…îâ×_¾{qü™el×6RãHwÚX¸> v S�ëi)¯”zf¿®1Íß¶ëóp)„(¨ \	1Ö|¨>àöøòM/�i�¸Þë×¦•okÓlË6N=–@7àßéÏ¼S–
B1–i¬õ²z]V¿í}ŒwåÙ”×{ó×µë¾Bžƒè%T ŽOqð	aSPûù«z€=HÐŒdÖOñSž ý½þ2×õëc°ú™ÂÝöpìª ¸<%©íõE—ø©—•o›ZJm+F0ÿ�Q €øÓmÛÛÆäö¾=lŠqL=
þaB` Ø„¶Ë’W×¶%{>%@=Äôuûºe¯/é3ºÂ¶…¯MÈ‡„¾M]ûÒBÐÚï—6)ÖJö) ®ùüXo€y˜�™îÛgÀ�ë~bÓ]PØ âôØ„¼-°ûkþ¯Ÿú§×±õ«odS\ã7¯©Á~è—…ëwäzï³²CJ@ŠgÀü?díû„»9~Ÿ ÷yú†
ÅåBàŠp	òP}�}ªÅ¼@sY_žç%À…î)°µ	4·ôÕƒ”`?* ×AŸ
€M@»„¾^×§èÞ ½O½ÍP€¢ë>]¤
f
òáAà
	).!ªcáÛ„/Ðô¨ƒylGöšBßtë»æñm'ù¥
ý”rä<ð	õ˜r6Áêsýëi¶2¶}l§
šÛ‡ú3ï%¦^ès0ÓŽå1 ç eõöÀ7ŸgÀtÁ›õlý(�DÈÓ }×¶Àm [>�ó#Æâ÷å§(€ÛCàÚÁÏõ2ëØú²µ{±Ÿ! €«Ã&�}ålïS½ À¾€·âc
a[@ yâŸ9.U×å°),¾kT ÎŸC+ ê½)´må}V¿­NŒbáè)y®4T†€3%$ÀÑfÈŠW¨2æÆ=6%@	kÛCËìKþº¥¯—õ)z¾y­¿�ù\pž´p>÷¸O1ˆÖúµÏ+ ÷á
<´Õwµa»§X/APi¸l¨ \16�ïR|_YÛ	6…À¬oStËßìK¯£êÙ<¶q˜y1-* ç‡ï{KµrS„fH‡„¿Ï{àºöy\ã•õÕ§ &T LHApâãs÷»¢öMÁkZúº07-õ¿éêWÁ„¶1™¤Xÿ¾r±JéŽM)õ•�mÓVÞ%„mù¾%ƒêý¥§™ù¶z¾6]i¡{"ÄÆˆ?’ó¥­€	Õ³¹ß]õlV¹¼ºpÎó¼±ÛŸëÁmN	˜‚ß,§®õÿm}„|_
@Ûr$�T¡žRÖå™2ó\i.…À'äc„yHÐÇôk¦¥Üo*”—= ¤�iEÛÜë.…Áv˜�Ï#`K7ÇâÚ¿ßTlÖ¿kªÃ…Oiñ�‘Ÿ®Þ€O€­œK	íØk_:!áï»'BT ®Ó}S6&ß&hõ4ß‰~f{fæ4‚îö÷E÷‡7çý¯�®
€*çš1Ö´K ÛòBÿ§”µMÃ™ãÝ;!T Îœ¶Ó ¡6|íÚ­+@aÎÕÛ\û®Õ ÀnùŸm|æÃÎæ•ð�'öaGA¤( ¾:6!ä	0ßû\÷±Â?¶¯Øûê*—€+&Õ²wYõ±åM…ÁœïW˜iJið­ ðÅ)˜méí»”×çaƒŠÁy’"€b,â>½æ{—`·µåûíömÙSˆ* ¡�'Á&ä•«^½×ñ-Ã‹ƒMàëy
³_Y“�€^‡œm„W¨Ž¾:Å¬ã%Ð½^.ßåÒwµ§�Ík(ô‰‚
ÀÀ±	ì�'ÀœPy®M||}ºÆ`òz?:¡À?==ôðK$çC×¿-/Æ¹áC'ší¹Ê»Úy|ÞŒP™ø7qP¸ ÚXï)u}e\y.ÅÁ—®°EñëyÀî�¨+6W¿ÞOh¼f®û%×IHðûÒc­W=—`µãzï+ó¦ð' €Aàs­ûÊëïu×¿/Íî¡i  ×ÐXà£Þ–éµ°Ý..ÅTÏs½·¥™Ó>ao^û¢÷]‚>fŒ6ø»'&T .„.^ ½~ÈBöÛÙŽû5ÓÌ‡«Ù¯ë¡k>@õ ®ñØ¬z—²óðã\ÿå“"äb´­ŽþÛVÄ¬Ë�UÌöT~_–=¢ 0@ºN) á8S‡V˜Bß–n#FØ»<®{#×EÌ|xl]]û\þ¶6bª…Ÿ¢¸bBà‚èêHíÃ5oîø¶)UÎ'Ð}«ôýlÁ~6Ï…>[»®42\Ì#¨MLAkópùÊÇN%˜ù¾@Zß{ßXºÀ¿›ë‚
À€°	ä˜é •fø¶)U×¥H˜Ê€­m[Ä¿OòÍ«† ëÿúHT>{ÈrwÅ ØÆš0Óm¿e
ÒT Hg|Ó®ôPP`¨¾+?eú€\/±î}_phŠKÝT bÚ
yºZþ„„ paô!Ôlóó1}…½k
Àç–·¹òm»êãñ¦Îëº\¬äò	Å‚ø¬~®iÓ³æsÝ«v\ãy!Bi®|ZÿÄ€äØJ ŽPØV
¨t³NÌŠ ³?ÛC2u]?—“”©!Ÿ Ž±æm×©mºêSð“ë†
À€1•  ¼O¾/.À,«	\ŸE¯çÇL¸ Ð':±¿�Áì*“[Ðv<)ã"DAàBék~;µß¼©ËK ol¶e¶¡%ü*Ï pYŒ¸n\Ñ7�åËwõaZu•³q3æTáß—2@¥âz¡@ö\ìê:TÞ,gS&TYßR>ß4æ¡L÷'ÑéK˜úÒC±zžmÃ PÛ1êwÏ¿¡ë†
ÀÓ—ÀÖ^Û¶c§tbË†ÆÔe¼„(º¸ýmåSSSú;”Õßw[ä<¡páô­¤¶íø1�z®)€˜þÚæ»6!j�‡§�`Wß{[_)V·+Ø5eL}•áï‘¤Bà
èS	0Ýû.w¿¯ž­lÌÔà?ê74>4¯�c~?mæØû
àë”xˆÏˆÃ€
 qâ
ø‹Q6b<)í¤ÀÀ>’J_Vyj½.
Ä¡„4…ÿp p%j* eù_l}3ÏFêÚþ”|BúÄæýêKè»ÊSø“> pE¤XèmÛVí÷aÉwÙÀ‡�S�ê)èÓkpháLá?<¨ �dºL˜íèÄÚ r@ú¢‹ ì*DO!ø�Õ9?¨ \!‡\ ÷ÄoœÒ¦"uƒ¢¾ 2q™œJˆrÃ
rH¨ \)‡œ°õ£÷ÕE�»ÚN…ËûH
ÇþÎûÚkàPã Ã€
 éW\@j¼@ßc!äè30°ø7B¨ \9Çòøúµ]+èn'×ŠÏÊOÝt¨o(ü	@`0#.ÀÕ¯í:õHE�œ]—òQð“s€
À€8•7ÀW �sæÑü§æÇDN€r*o€�ÐºŸÂÀ94—þû»„1’ãC` œ"0/•>ƒ¦ÎõÉñéC^‚@½„1’ÓB€œ¥G oø0$C�¿uKøìJ2RO6#„œü&)Ð@\ÂÔ !d…>i âäœVBšPð“®p
€áƒ†�ó�Óu¤/è Qðx^BN…=9T Hk/@Èa Ð'Ç€
 é*„tƒBŸ* ¤wB2*dhP¸“s„
 9:|BÈéá* B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€P „B B!d€ü+¬VmÏ_,ó    IEND®B`‚‰PNG

   IHDR         ôxÔú   tEXtSoftware Adobe ImageReadyqÉe<  hiTXtXML:com.adobe.xmp     <?xpacket begin="ï»¿" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c061 64.140949, 2010/12/07-10:57:01        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:DAF197C98B216811A4A3D9917A0A7E70" xmpMM:DocumentID="xmp.did:5010A0F0664111E195908AA158F732A6" xmpMM:InstanceID="xmp.iid:5010A0EF664111E195908AA158F732A6" xmp:CreatorTool="Adobe Photoshop CS5.1 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:2DF2AC0635226811A4A3D9917A0A7E70" stRef:documentID="xmp.did:DAF197C98B216811A4A3D9917A0A7E70"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>¢!4ž  —ÄIDATxÚì½[¬$ÙY.¸Væ¾ï]·½wUõ<Ç‡�¶�>Á xõ°�§á…WÒŒfæ	i°��æiFYB²b^@‚ÃÕŒ�92f$Îccwu»ÜÕ]]]U]]Õ]—]»víK^cM¬ˆµ"WD¬µbÅ-3"òûº³vfÆ%##"×÷ýÿú/”1F     X.P     €                          €                          €                          €                          €                   €                          €                          €                          €                  €                          €                          €                          €                          €                   €                          €                          €        ‘�ç/ïyÌ³¾ëº.ëÍsJ)éõzüïgýÇ_'·)sïUqß–ÝÇ¢�ŸUçqwq,âßi<“Ñhôßyž÷71ãxé¥—p  Ú/  Œä¿ã¿|Ã_÷e¾~•ß¹ìòº�a^"¥ªuyßvUðïã?™L&ïù/ÀcÔ„ h
Vp
*TS>éåÀò¬ïº®ËzóX‡/ã¿ÅÉŸ‚üQ5‰V!êüŒyß"„BSE@ƒÄËü·à?þgŒ” < ô À�²þ?å¿ü†¿¼?�N%D D@GDÀÔü;ÿñmŒœð 4=œ‚z<u­ïº®Ëzu¬£�ßù{œüM–¿ëçdCÙåuÆ<ŽoÞëÔuß]¿ªmkFð›  " ["@qýÿªÿø´:ï¿H…€h>-~ °xžÂ@9TˆÖæé IþþƒÏwòÀ¿nýç�þÇt iÕ:uÝ·E×¯jÛÁy@à{Ë>~b
  x:â	P¬ÿ/šÈž xà	 <3æ‹ ˆ€Nˆ Åúÿ¬ÿòó.Þˆ ˆ€%Ÿ÷ŸÅè@ @´Z(äÏ-›/É÷!  ¬ø’ð   D@;E@2ç_þÕM²-²6  ,†“XEÎ_—)rþýõƒœÿdÅ¿ºïˆÀÀym[–º6 ‚ á€' Åž NþDÉoÖ•û…' ž xŒ@m   " }"@™ûÿUŸô?m«õ  `j ‹á!L”Ç<Ý‘M™pÍù¯â³ò,Çt ¦æµmÅXÊÚ ˜€`é¬ù.xÔœÿ±“§©<ðÀ�j  Í
ùG9ÿ®å~!  Œàµ~£)07ÞÂ@µèút€"¸Åò†šö—÷ó0€é€Eþ&ªÜ¶Bð) >p¼ã%¦ à€' �ž ž¿ü²)ðž xà	(SóÛIx à	h”'@	ü‹rþ³ZýÂ O <¹±4µà€ ž€–xÄ{¹ò–á	€' ž€Üà¿­? ¨ @ @4A(sÿ±œÿ&D D@‡DÀ§üÇ¯cjå(LÔ�¶OÈQÍù¯£ÜoUë`:€´j�:ïÛyÿþ*Fçk`
  xÚã	ø¢Žü›f]Â O@G<<Óæw1‚ Jàßg}Òÿ|Ýå~!  bø9‚Ú @]¼„)€ù¢mÓ‚üƒœÿñò¼ÊýVµ¦H«Ö©ê¾mÂï¯Bt¶6 ¦ à€' ¡ž ¥â_”ó_ÕçÂ O <Î@m   xæç	PÈŸG#9ÿMúƒ' ž€%ðt²6 < ð ÀÐ\O€1ç¿mÖ%<ð´Ü€Ú   D@ý^¯×“ëóåŸ^t¹_ˆ ˆ ˆ€ ¨ TËA˜X<š6 sþýu£œÿ²ûÄtÀ|>Ó�ŸèTm LÀ Ö O€šóOÂ<äÖYŽðÀÐaO j  ÕxJ¹ß ç¿êc€€€¨¨ TÃ;˜h9 æüûË^Îõïº¦æó˜èôt@'j`
   ž åùoqò¯ÓJƒ' ž xJµ x à	¨ÆêÖÿ§üçßðßê›öO <ð4ÆÐúÚ ð À ,ØáiDÉù·`ðÀ O@c<¨ @ @T2àýªOüŸ®rßµµ€â÷)¦ š�:Ý‘b âó‰¼ÙÏoöSõqa:`~ÇW÷ñ7q�¼¿‘N´¶6 ¦ à d‰$sþe,@ÕÇO <ðÔ
Ô    
mûYÿñùºSˆ ˆ ˆ€Z�Ú @þ{S íBUîH1(9ÿÄÐê··*¦æw|u×©ë¾­ú÷WZW S ð  ‹³D~ËDþðÀ O@ë<¨ À O€xô°5çž xà	h�' Uµà€ ˜¿5á”óO <ð´Î€Ú   D€u»_õÿ|º®Ï‚€€X¨@m Àí>Ä@û‘çúO�óïo³“wÛ¼ëc: úåu¦:3ÐŠÚ ˜€ ˜¯'à‹’üë¶zà	€' ž€…yP € €ˆ­óYŸü??Ï" " "`a" µ û½‡)€nÁ’ÒäüëZýfm[Åú˜¨~yÝŸ�é€NL4º6 ¦ à æã	ø-ùÃ O <�ô 6  À2{ü�åSþë çÑV<ðÀ0wO@ckÀ  P¯' Êùo‚ÕO <ðÌÝ€Ú  À2Š žóï[Ÿ.²-D D D@gD j éûS �F,ç¿0�L´ëzÖuß]¿ªm5h\m LÀ Ô‡/ú��yZ"ðÀ O@c=¨ @ ,	>ë?>¿ˆA" " " ±" µ€Ù½…)€N"Èù'á@ótGb: Óm»žuÝ·‹øýYÐ˜Ú ˜€ ¨¿¥#xà	€' ž ‚Ú  < ��öÍÌù‡' ž x–ÚÐˆÚ ð À Tçœxà	€'`©=¨ �œ‚NáWý‡sÎ?HŠZy·Í³¾º.ÿëy^ðÐmß&ëRÜ½^OÖhp>?e—×ýê2y­’×¬‰V¾ëý¨>ñ›¨r[²6Àï`è\N`
 ;rþI ˜M�˜L&d4‘Á`ü�N§µgÝëpâ_[[#ëëëÁ_)òì¿éÓüš�Çãàšñ¿ÉkÖ¶é õš­®®j¯Ù<5�…ÖÀ < @5øbòoª'€¯ÃÉäùóçäÙ³gäììÌ* šf9êöÃ	dgg‡\¼x‘¬¬¬�~¿?W+½îÏàïñ¿V‡‡‡äää¤°hkŠà×h{{›œ?^ë¹é€'@Öøy¡ @;Ëùï‚àÄÁ­H. n¼u‹|ûú[„…£5aš�;xü/§fëRþnø„k0®'×WþŠ5Â÷äg©Ÿ¼ÃRÂ¢EL�_øœ(Ûð?›úß‡Eûýïéß“Ïüè�ÌÕz/2}’w9-Iò[¯¿Aþø¯¾_Os¾õ×TY&¯�zmcçW¹Þ$þœEŸ{?†ÔqÍ®´ºÙoþ/¿F~ä‡>Vh«"@Öø2†Òå‚ Û®à¿TÅŽšÈ3î>>==¬ÉÛ<(õó’‹¨ËAê7ÎX=yÉ±ùÅ«W´–dMí`_³¼ËåwâVó•Ë{ùÎõîYç›ÇÇ?üÓ¿Dâ&�hêïOƒß%=ˆ  °8sþÛ*¸õ?òí{ÈéÙÀm{ªÆ«pêÓœkêHO¾÷‚ M ¼:D  ßóâUwâO}†þBÚöWÕi1íæÛß¹A¾ûæÛÆ5ß¨  ´<Š÷h’UUvÀS­>p÷þ£\¬'	ª—T¿]ü¹�&fN‚Ä÷ˆ}§Ùó­­M²í?æ�y¦!r°³½í×³G&qfiqÅUv£ÙñPû®¿ü÷ÿTÈÕÞ"ðëbL  €†Ã9ç¿M" iý+Ö?ÍaêÙV£&"¢9¸„æ='áß®ìÇÄNS®[U"@Mu¼²¿g'~êæKÉ{êÃCŸdáõèX¨Û¥þ××¾K®ß¸;v°N j@  -A®œÿ6ˆ€”õÿÞ#­ÿž:ž³ÛÀùíXî¾mMª1ÿ}\ÞßkìU•àä€½ÝÌK>CióÞ›3%�iík¯cøøË¿ûz¬FEE€¬ @  Ÿ¯ûßš@
UnËÇHëÿŽoýŸœ�Uð,d3Ç@@‰Ý‹¬Ö��€ó¨(ÉŸ¯·{éb¾s½€{4¯2ü×kq/@ÞÏo‰ømRa\  T‹Â9ÿMÒúçQÿÜú¿ýÞÃÄ@LÝöOûŠ:
ŒkRBSŒ«—÷k'á¦ˆ€+û—ÊjßZ\  \ö÷�1/@E€¬ @  Céœÿ&Š uîÿNù?,ÌÀn�€º§yuNªS6±½\Þß]8É×)ÔTÀ}Ý@ž@ÀBâ­Þ@@Žo]{ƒ¼þÝ7c^€Š Y €  ‚Êrþ›$’yÿwbÖ¿fnQ  SVãŸyU	ìj!þ>÷ ¼ Ô(hZiÞ�€É¾ü÷ÿwÊÐA€Ú  @ƒPiÎSD@Òú?y—ŠˆB™&pa�€¬@  ÀÖæfð¨Š¨›.¶··Ò©€v'ŒqŸ‹d±ÿ¾ùÚu­ c" µ  €† –œÿE‹€´õÿ(5È—žÚ]`EÀˆÖ«±m"@N^€ýý|çz÷dQ7�ÉÐ1€Ú  À‚QkÎÿ"E@Òú?Ò&71ç„k�¥²`°ü®çäšê>äü¿. k"@fìw4�ã›¯}Çèè�@m  `Á¨=ç" eýßTndÎ´ìóf¬½"`’ö.]ª�¨›$TÀþîâ‹Üž®�€.^€‰ Ô€  „¹åüÏ[$óþeä?ÍöÛX�¯vÅ¡PWD€LÜß½�Mü5Æ>©’Š€é²¼ ¨  , sÍùŸ—Póþ�Ö>cÌr,‹©ÈoÉ)€®‹ éþç­ß¹M�€–/ öè°@m  `ÎXHÎÿ<D€:÷÷Þûät0´›êe'w˜ ƒ+¢PÝÅxš"øãjÂëÑµ@ÀÀpí:y-ÃÐ€Ú  Àœ°Ðœÿ:’äÜÿ;÷æ†ç[°L  S·•.€®5ä» x* ÿÞ]”øO—íèˆ@m  `XxÎ]I,òÿÝd�´þ™ò $Ý¨L  ›o  jýIk«PU/ u8ß�ÔÝ“Êƒ{^ã­L/@D j@  5£19ÿU$IëÿvÂú�¾íT‰À4Þe §._ÞÕê¯&Òdºf�@@ùÖ_}õëÚkßA€Ú  @Mh\Î•I2ïÿ,²þ“&ÖÌô·¸óg—Ìf� Ë–ØEO¼ät¾è~Í™á1[öÍkß	b\@ËE jt+8�C#sþ‹$ê@˜²þï=tßW`=ÒT`]öFú×É]…�ûX6ã3–Þ8Ãú< {³"@\éÂFy—åÝË“ëðïÉS=w/]HYÑ™çº¢{®ºârÈõÕ$ŸøÁï„�K¬GžãÍûÝÊœ‡mem€ßÁ� TƒFçü—HâÖÿ}r6‡õ£±Ë€ç8Žg–û~Â5÷÷wÉh4
ZO&“L‚."\‚ÐÊlëzŒrœ?øõ¾°³��øS‹†½!Ro™÷—W+¹_túRfüÐ+ÿµ³ÞbÀcþÔ¼‡¡ (�ÆçüH¸%³þeÍ1Šä�ä+`r=éPƒ[@}J�MˆlïÎœñÁ{s�<yò$øî\•µ°‹yÛæüÁ¯ûùsÛ™×0y¾uç9¿xr±€È¼-#½ y]ü-²6ÀÏcè†  Ê¡59ÿE¯úwŸ†#;�fXx³õÜFwj°Õ]ÄˆHÝ&‹}Ë“ƒæÿþ» dŸþŸ²èoDžRÎþKä§�ðÿô_ùùDóùLsŒ$Z]y?¹�Ügtòû±4‘˜ˆß‰áÓ+¹	ñIZgBxÑ±dìP+•md, ÷pÈé€ŽŠ YàËÂÛ6­ËùÏƒdÕ?nýë²©Ñgÿe[M®-f�’*2”��žŽ^§®›’:êåPj!Ë¬ôÇ2ëƒ¦^ÿåWÿ1&ÎòLä!æ¼D^Æ‹gj@  %ÐÊœWÄ«þùÖÿhTl*2ÐSóëyTœHÂB�¬oñžø›|Ÿºe§ØI±ýç©” m’ÓÆŠ€9v+½ j]€‹ Ôh!‚,œ†…£Õ9ÿ®Öÿ,ïÿ‘.ÓÏî`zØu�ÒšqsÛ‹f|ïØš›k|T|Aª?¦H˜ÄCb�¬ïBm”Ÿò@”±¾iú<n.…Wäs·eæ×ùÕ¯¥¦h:,P …@ÀbÑ‰œWëÿö»ï‘³Á(ÆþÑü»˜˜çõ“lÆÌ#sáHïì@@Û–Y�€ý~?bkþýú½>éõiÄÜŸDä@cëÊùsš˜kOzÔ9üÈË œºT|@tš™ú‚([+äÌ‚ã¢J€ºŸÔúlöÁ3~·�L'Â».˜x2”÷Ak55*bÃR>Ÿo¾�PÛ%w0&@Öøwüg�¡½€`±èLÎ¿‹õ¯vüËjù-Í²òr˜zmL™Æ‡A�v›q–®”™9JÅgÓI1¦¦§"bÓÌÝ’<ÏQìŸB€¤ÃUüåß~M›]ÑQO€¬ @  è\Î–õ?Žóûe™{“æšÔø.b%ñ×i>Ÿ&|ÕÔvI‚!!˜²‹XƒÁƒÓ£=ë‰mvE@Ózú`“o¼úc§ÀŽŠ€ß&Žg‚  ªB'sþ]¬ÿ2hD `�púX
\‹Uýû`�# ·ö°Ç¾SÅ=®#ŸBà_Ûczòhgkàüøƒ £"@Ö    :�óŸ¶þï‡Ö•¼…åÜ]>§x  ózÔdÚgoŸ�D)„y¿�ÕúÖˆÆR.žŸù}×Ø-÷!ùú›/@GE€¬ @  …ü¥.Á”õÿàaÆ ÜµíX1kž�©ûˆNò·Ö\Ñl+œ–úvî{±}ªñ*PG/ˆ)ØŒR·óÝÈÖÀ9F~æ_|åkÖJ‹¨  hÐéœ�õ?Nr[U±u2²H½�€yØÇ¡5°Þ¯	yf+
Ñ|“ŠW N=[ `Aå×Ô@ÀÀpÍîè @m   �Nçük­ÿÄÜ¡9|ö&õ2ÝÛ4ý9ÔJƒT[æ€ÙÜ \MsºŸZÎ!¾#K“mÏNž]
”°ÅtT 6   Ðùœ�õÏkþ§:È©ƒ K×¦g©ç^yA$KJVtFÊJâ¬¯Û§K#‹)*’ø(ÍèŽ@j
Ôôz‰C©qýhà¡´ å?"Ó	Û²�o|ûuòz† c"@Öèô˜ ¸ Ó9ÿzëÿa­Ÿ×¦@À ¼“J ‰¿3E@ÁØÌ› føÛz*ÄÏZ��€éïžÜ¦GûNç»º@@Zïýæx
ÿì+ÿ9}^º-P `éÑùœ­õ?çw©2¶S’'°�€,Y1Žê¨[î)àZ0vªI>¶MA0í•t"˜Ú‹jU�€ß|õ:yíú�LÐ1€Ú  K�Nçü›¬ÿ,÷nT®°Ý•X«Ñ�€ÌÂfºeö~s&º6ŽR¨‡ZŠJÏS:&¤?‘êc§Á”û¤Ò2šªÓž:#/Àßüç¨Cà’ˆ Ô€ XZt>ç_gýÇ“z>¨‰5…zfYñ9Ûœ^�WÁn˜ó{2–îSdò8˜Þvìs-\_  ™[ `èøyí;7rÕùï€@m €¥CçsþõÖÿµ$E-~—±y>�€L³‡`8š?ŸßX.XcþSª£nVÌÉÅ+O‚gÞO¯Wµ¾&UTñ§_ù¿r7ïé€@m €¥BçsþuÖÿh<%æ™æ<ý]‰(g  +bì•”q ¹¢Þ-¯éo)A¤]ÄÌâ€j¼‰I‘\,°çt¾›¨NÅí½J3§mf�}õ;äšðÈé€%¨ °4è|Î¿ÞúXÎR¦³aœQš7†°Œ?AãÈ&L×@Àð\¥ãóŒÑûÖt¿éëºx¨‹”2î�j] ³ãcJ‹äÔà“v»˜=4ùôK•Ž·Ì¬ˆ˜~ñgŠ`‰D j@ tK‘ó¯·þ'9-c“M�Ü‰£˜W `² „ië Ø8–9üÍö“œr –sSrî=h$= uRêvF*	,¦N¾™ð¸’kËE@ßßµ  :�Îçüë¬ÿ»ÒúO2’ö9ÍÎG3Å¯UXÎòs”Ï˜Ú‡jçd¾¿‰õ-Å¨þô9ÍðÛzÐlQ¡ß³.¯-°BGPæIÔ¥^Z_Ïö•HU\ð)á	   :‡¥ÈùO[ÿïÅ"ÿm)t•Ž×-
d	6OÑ"Õ—Ž‹ÊðÄNJ¦€ÀØ´‰×*êa0�š¬87SWÀ*Y¾¾@@Zzëo~ûzÊ°$"à·EL  Ð)t>ç_gýÇjþS³ñžeäç$1Št¶ó¸™îéb™æ)#jÖ=µš›ÌÎ�Ôð‘6‹ÕáDS›!L5»¤ñûÄ¶Cç@@%Yc `¦ÑïpzM�?Õx–@ 6 @ç°9ÿ)ëÿî{"ò¿¼µ”®˜¯5på�€$Û=íÈržm¨¿]2¥„„C_€È¯ó.�$ÓSãw‰:ëå`!ŠT*à’‹`	DÀÏ=xð µ  :�¥Èù×Zÿl}IB™ýïcg:h€.0°°¦I,÷˜¡ž$	ƒ6p±]©™ÝÓ×Ã5ò?Ã�Ã˜ùû…�€Ôêiq;=õfyf´)4ËöŸ=þôoþÁØ)°ã"àw}€Ú  ­ÇRäüë¬ÿ±ÅúÏvÉÖcÂ5­" há“ê÷câNR¨¡%y·Š½�Í�¥ 3š
Åd…>P�h| `®{#_MG]FÀ’ˆ Ô€ h=–"ç_ký¿ÿ¨Ü [Åx½ð@À<'�ØKúÛÒ ™}ÀMPó@�»Œ€Ã,xEµîË²|SUüG‹ ã"à×<x€Ú  ­ÄÒäüç±þMƒ@]ýßçHr&«âeìQ{H~LÐ”«À”—¢gš?ªŸæä`ª|é,9O `êÕB[çÖ—Vük† Ã"€��à‹ Ô€ h–"ç_kýó¹–¨uSÊ¶^´S—*•,Ýë227'pöÕ(5yêD'4}žç›&Î©<wÔè’úÇrœºä”s †T*`N�K  s µN÷Çoƒôºÿñ¯ÿÞêè°à Ô€ h–&ç_gýO&ÓêvNgYYÖ[›³(8;0½ÏÌãÌÓ†Á =Ò<G�5nÔŠH¬í�€4ûÎ+Z0î¸N^»þ¦ÕÐaðÛ<@m €Ö`)rþuÖÿÝ(ò_GN	R³DøSgvÊÏÐÔyê¶Û²­�Ñ“K¦ño
ÔKv÷ÓÊ&¢TÄ»)¹_Çø†ïâ›z ¨³§ÅF,õfDòS[Í»ë ™Að'ÿéïÒj9D j@ ´K“ó¯³þÇÎÖYÛñÊîË� «ð8héCI±gŽ‡çþiŠX0¦Zè:«#aVÃG¡Vu  ­†¸*¹y
@Æd	€ŽŠ Ô€ h<–&ç_gýßyð0UõÍdï‹=Ÿ§* û0Ü´Š€é°~—þd§@f9GÅ8‹jŽÁþI4ï'²Yñc›{œZ÷ò’ê³|TUTTòå¯F—P 6 @£±49ÿzëß+a,QçUtî`×yù¹²|v`TŸ¹)š�4ÔÅÎ§zÏ½uçJÔMÿ$Z;±YSOî<+fê‡‚U|óÚ¬:`UäÚ"€Ú  �ÅÒäü›¬Ý°[6^Ž:�¬.ö]þÑ}¾�€æ ¸XÃ—4@eþ€Q÷i
FÝ-TûW¤ùNIÅ�€i2©)�ºßŸ´Ä}˜„ôTI®-¨ Ð8,UÎ¿ÎúŸ$­�O?WJ µžƒÙZSEÀzã'…æ’O’SÛ«AyjZ¥í\²déÛt@Ÿ­¡Ô#TWÆÙp¦â�€ù+VÈµÙ×ÙÅoï´uŽ!üæ«ñU|KD j@ 4K“ó/­ÿÉd¢Dþ?$ùlG5è,Íò”º¶¨Ë¶‚¤¥—kJ'Î—ó98‚Éq}Ù]} ^Rd–÷“U�’Û$=ûsžRÝîiZot"0ûÓ\³þúÇùoc¿Ç%¨ Ð,UÎ¿p¸û0�ÛïÞ·ÌýTi�G^e  5<-¨³��¡ Z£?¾Íl¨œ-j¬Sþ©`st"MU>d‰ód¾T<°é�€eïâ"ŸÖ¸xH(¥•|KD j@ 4K“ó¯à|
€?îÞ8×Ï¦1“Fs±Î†ve�€RÉYÐNFÌ¸±­RŸÝS�XÈØšfGJ-šÑ �€îëþñ_}5& –L 6@�XÁ)pÃÙÙÙOóÕó¼¥ùÎœø¹ë4‘çÏêBŒ-æX<oÚüÆŒ/¢wzþ=”,}ËÔõ™né7ãÅÌ“±>Kl“ÚcÚoÃ4}~“kSÿšM•ß‹ÿ£¼ÇÈÍ[wÈ­;w•†G,õ\w<êgÆŸ'Î¬fKž*åõXùŸ••UÛŠ)k2Íõbš;€9¬“¸“é„¼ùömÿóW‚±'«B éZäýuy×çãÏÁÁÁO¾øâ‹ !€Åa8ÞðÀg\€] < ðøƒO8e¿˜ïÞ,À8Ÿé�ã ¯»ì›±$=0ƒhÈÙäo&,u=j	úã™ø÷�7õ2ÉŸÛí»ïúBs#SŽWû\=?W1ò·Š‚$Ù'¿ôl™Çh‚ì™ùš3ÍâDþñsë1/(·ý¡—^qùoQþ‹�lÙqkžŸ+½�<þÈÇ0À¢ÉðºS~Fªðe ÿ®|Àá?DÂ£~wÖÏ+&fEñ(é÷HµÀ´³iÊºNËöhX¾Ç ¿n6òçxïÁäùñi‚ä$©�ìT>ÛÅêO.Ó�ä2BzLOþLcÞ[‰ž±L«?I„Wö.€{âxLŽÎY'9Ù¾âã� € X8–î&¤Â]Ýï÷ÉÊJŸx£)YíC4\¨%Q×u˜‘,	Û@.F©¡µè™^ÖMúL[“ %Øl0÷˜æïÝ¹wŸ$]þŒeXýÄÍåo²úãú€=Z—¿ÎëQ‘Õ¯ûnW¯ì	²ãÄ/qô°p –°%bA)V{}2dçÁ£r^ð9w"ø¬) 1mÿ.L»[f :ËÝä|(îú×æLþLx�ø6žæ<Ì¶9|vDŸeZý&—RLäuùÇE�™ü™vZ…Ecžòç¸²¿—šû_â—Ëá€ X8n.ã—æäÏëkäøl¸h
^Ü§2óñ°Ë‹[ž¦ííî}ô˜Ž¤¨‘èuDU’üS¶— çôžïúÖ¿ÎêW×¬&ÐÏÁê7ælÑ3ç@¿<Dº¿w)Zf‹Aª‹øë wGâ_ê± y`ä?Ö–Éú—€Í�uÂèq8 -àX<oñ^—|^ =9Ò„@L¦ŸËÏ³>3XÜf·µ¬Ad›÷§Æ\;Ï¯�Ó¨>§ýàƒ‡sôc†@?½ˆb³´Fã¹«ÖåŸÄÕË{Ä{Ôaâç˜B @ ,{{{£'Ožðñ•eúÞRœßÞò��“&ìÒÀ…ÜMÞŠ¸€éì˜Áò'De¯®OS<”R™1‚xí–?‹1µ‘¿2˜3¦÷ˆ¼ûÞûA–@Sý²Süêô³a÷’Öú¯˜h›Fü7~ø‡x‚ h„À'ÃW–1`ƒ{ ¼iXàt!1 s£y‡c`Çgr^Ü±Ÿ3ø�1w@u„¥—©ëœ"ŒØÒû¤@s>Ä²{ï=ˆŽ¿©�~³?Þ\­~‰í­-rng;ð–ÌÕR¿\ë 1XÊL€(øQ�—ÄË¡0˜a½¬}$IÉjº'çòi†(0�¿)çßôç¹ý›ó�ïÎ3 ˜>HðƒG�ÉÙpXC ŸÁ²wôÓ[ýºóV} Ÿ	/^¹ýæŠN´”ø—vÌ… h¶`é¾´,CÊ«Ø-ª@­ÊE€‘ðL¦¾a»XEŒ˜ô�Y9ÿ”¸óåH÷Ó‰—9ÿ„…�¬Ý ’uügîsµúÓ–}¦Õo${f=çæóXM Ÿ	Wöw#ò_2â�Æ\Ð@Sðš´Š—e
 V`µç€ÅÔ¨û|3y; §ø A+Ü4îå´è-V=cf!¢Hcj`æüuFºŸ–¬S€³eÇ'§äéá3«Õ¯ÛŸYdYö­~å=–Óå¯-™Pà¾ze7S$u”øcc. Ð,¥;JŠ€µÕU2Œƒ†8ó@uÖ(·Ž-ÍÏ ¨[Ç1‹•¯{ß1ê_¨æ9ÎûK2¦¦““YÕ/>¨§ƒùËwß»_Èê·z´d_0ÐOwÊsúUEþ¡`?.¦Düue$ÖÁ@�C;@ìíí<yòäÀº»Lß[ÖØ\_%Ïž³¸E47À<öÏJXÿÙi�Œ$H'£ð�ëÜÄÙ®Å~2ƒþ˜³åŸüêÂ×@¸ÇÚci"æ¥¥¼ÿ° Ë¿î@?—(ÿú­~—÷.eæÿw”ø9>ýéO€yàhšà3ËdýKÀÖæ¦ÿã<l]  cÙ^„"À6÷ovÇó†@œ)¨ÑšO½¥@,~Á)EÍfùÛ-\æPÖWFp�Ì@txÝÿ¨C`Óý,ç�Fl�~u�?ÇÕËûµÿiRMË:°þ! ‡ë¼+à²ÅDµ R}äçEâe;™¹ˆ€Š€ÆúÊ©çJ/£€ŽåÓdKl–*!Äž&5f4Ì~>”/É;ÙÍÒÅ»¾ xïþû9­þ´eŸiõ'½ýâ"Œ9[ýU‘?Ç¾âX"â—ïC @ 4Ò°tˆj0¶þ¯€üËZÿn‘ÿúèþ¹3&,J�õO©€ù§ìÁdù»ºý™Y`)ÕUr~òô�œ�è—KHÕhõKloo’_tË uL4”ø#ctÐ8°lM�ÔZ Üqí-  ÇJ¶6Û9ztË™cð_’Œ¨GyYí2Å)n�HF÷ç³hÓF«"ñš[ûSæÅNÆ½ûrUôKÕñ×’}•�~æÔÉxöoýäÏÁÝÿr¿U—n8ñ/µ±Ðl,mS 0*ÎY”ü8›•Ÿ'�¯¬õ<¥²5�—Ýú÷´Äf®	@�–?s¨ µ©0‹[xxò�Ó³!9xzh%k ŸüDÊÂç,ñœ1+ñ›E”ÙêÏnöSñÏÀ^åóÿ-!~T„ h´ Xº¦@²ÀÚjŸŒ'Ó¹{?J	›õÏ´nµòYž´?¦ug¯—q|&×?M˜»Ukd+’çOl]Ã6ÀŒÌb î=x�/ÐO¨ŒÙóïNgê)˜fPM´’øÃ<çºý™ë(bk^äo jÉ;—m•÷Ð yXæ¦@²Àñé°öÁ/�€9nÏ¬î}÷e¦é×6¿Ô'® €èªøe¸«™ÙŠ5Õ°Zõ.‘ý:oGÊËAã»7k.4�NÉç@?*=%B%õ„ Á�˜èà…;ñhèàç5È2 $6�¢{.Óâ�ÑBVo\Ùß‹{h–ƒø%nüè�þ(š Õ<ªB ô,[S ¨ÀÆ!‡ÏçÞ�Y8øXF§=jò0û~˜Žìõ®øxð�­“åúgé:¶™µé“ëdÖ¤§yæüuë¨“2�øäÿ˜L&Ól«_1â	'ÿ­~þ\üDU¾oPpÀô¼ YU0÷ = �ÇÀ«$Ð�Î‘øg`×:ÿßQâ�ÆXÐ< MÅR§¨µ ¶·Ö’hx\D@– �‘^4AD³'$5§o,ÍÊŒÖ¿<JIA«”åš÷O~¶éœ2ÝwJ(›Tì%Æ`<�V¸úýï»úQš ÿ>!}þœÿíÖãÏ{$Ê”`ÂÚŸN	ã#ðLgG"<FÁf´úu"a¾ä/= :òï8ñËå „ h´`©¾°vv"ã®Î‹Àå8ŒîSÂñË 3’OdöÑ8�F_\I]‹Ìxsy`]* ÉÊ6’Óì ,m$�³Î˜¦¬mÚª§9¢ýg‚AcÅ“Ððæ/�ž““Ó3»Õ¯î�Ÿû¿>é¯pâ_%lÕ¦úáƒqA §89úäO&cÝ	!ãq"0aòEµJúyó÷ô]€²m€[Füð @ 4K×H~_^@F™ë@F`Þ">á«�ìgäßóÌ=ABâÁ¢\Ê^á³œ5‘è&²¦¬—†´A¦qUdý!ÿä»ŒeÇ7Pù‡¢,´Äyå?3ù'É@?~8Ñ¯¬ùä¿JÈšÏ­ùBÀde5¼fDtôIŸ 6âÓÅ¡w€OD×‹Ò¨<a™r¾óüÛ[³ ÜP¤`K‰?6Æ MÄÒ¹§ÔZ |ü�èÚ×.Â #9í¸®”Ô1=p-‡ÄÃ¸ËY’¿LÙSÝÜê¢Üù²iºwNfé^5ËÑ-3“Æœ>³“x‘<Û4 3;2ÿ?ŽÈÓÃC·Š~<¥�
çî~Ÿü9é“õÂÖ7	á±'kk¡(è‡â‰L'!ù„á5TŠÍ„š[ Ÿ½¢ß|…þÕ«ûµÌÿ·€ø—vŒ… h	–¹) +þß ¨kN –Eò@å/æ†%éP1¿Ü[ñÉ§Î;÷Dð™$ì)'”éì˜<&ª"…�h,åaÆ¢@�EG‰[¾¿Kªš®ÄoIò×ÊÅþ¡ÚnD¸­|ðÐÿžŒ8Uô“j,˜ë÷Ï=wûû–?ÛØ"dk;|ø"àÉ�ü0yø#Ÿ$«'§äÒõäÒ«×9;õ¯ÕIx<"& ¸NS_Ô‹ÿ*úÁ•ÝjK ·ˆøù²ƒû±C €Æ{–ª)�¬°ÊÛ�'õ’ÌTu�XI6µ”iEÀûtfýû¤Ãø<3'îfî‡" ˜
 ‚è9±ð€3¾~àz&AE¿(â\(Ó‘yü <¦fy
l¯©‰ü3Üþî-}MÄ¯;·LÉPô-×‰G>xô˜h+úéRùÜ?óûü¬®…–?'þ�ó„œ;Gý7Ÿ&ïê‡‚-&››äô¿ý	29¿C.ÿË7f^� 00 l2	§¼°~ Ó@hù€+ûËHü°þ! Zƒ¥l
ÔX[%ÞÉY0‡^ßw7•ÈÕ‹[š 6•/Šú—sÎÜê\çœ}òáÏ½õuröâ¤7‘�‡¤ï?�rÑeº×-MO�§·wñë±d  s³ü‰š:¨_GWå�f’¿Žìç]]‡s±"ÿóø§kâVÇ?¨è'®ÁJ?œë_Û dÓlïvþ<|ø{ÉŸüÙó?÷‚ø2‡þ¶ü½sþµY¿}G´aüñtü=â•®è7ï_¸ìXtþ¿.â/Z	0ç±@ @ ´Â°T�µ ¶øÀ|ðl�€æ¾ôV‚��ó	²“•äÄœ¿H1ãV?ãÄÏƒ×Ö}ËòyüC#Óµ°àcïßŽÈþ«ß!ý£g"^@XÚ2}Ê­WoF6³Z÷<ªœRš˜SO¿Èãö·Íù3GË_>¥Ú2ÆéèÝ:wÿ¿ÿÐÐºWWÇ¿7Ë¾¼0|îŸ_‹-Â¶¶Ù9G>øÔ'È‡û”|Ä_õ’ OýÍßö·»ÿ£?B>rp(‚‡„}òúWü×“0¥0P,2î¢ˆÕ?g�·
`$�wÛºŽÅ_†&@ Í ËÔH­°³½–zÍèNV­0y òWøc”Îòþ99¬ðyÿ•0Èl}ƒx›ÛäñÇ_!cÿõºXuä?ô‰WÈ•o]½ý<Ò|*æ›y0]ÍA�Y�Ž˜êý‡B„Yˆ½4ù“ìª&ò—Gm÷˜=~"Rÿ\Z÷†^˜(õ¯/ÜÿÜ°±IÈö92xée²öÂ>ù¨ÏåÿÖì	ðÄßwüŸî]$§úÙúŸ98‡ƒ03 7›ŒÝ`ùIl
 O
`‡ˆ €Ö`éòT¥¸xng~jþËGþÑ{r¾¾OÃ€³^èþÒÍ|pü½"½Íuò²¿Ú¦ØöÔþØïù÷~˜œç�0ÿ|Ê§dÀàÔ�é=šyüùÚRÔ¨cÀ3�šËò77ã!MŽfäþàƒGDè§Q�%žö×sýåµØä _Œ}ÿ¿!ÿÆ_ôñØ˜ó^†Á=7?ú}äå÷îû¢á„°õõp‡‹:Ð91 ˆlQØA€¶.€$þ¥[! Ú) –ª)�ÄúúZôÃ-=ˆ2ûÊœ¦eÚAL-ø#"ÿë¿¿x 8á_¹L¾Ç_|Ål‹ÕO„µùîÕËdË'8:ö©§ï€ÕqmìGT¢#Q\CcY{¨G3òÓ™Úð/›ü5]uil.9þ™äoãñ˜XRÿÒ�ÙÌýOûQ  ŸŠaÄÛÙ!ý«»ä%ÿÔ¾,ûâš¬ùÏOý¿ïû»¸}e—xçÏz|Õö5èÍê:xí µ@‘ -&~BÐ X¶¦@òÇªNL=¯œcT×nV+4�~¶ò¿¦à´˜;Cƒ¨0GÖBâ9¾z•ìú–èeŸ/øãœ ›ç$ä�SÙÉ‹WÈöÙ™¿ÍÐ—€+a¶€œÇ…g"'º)ŠŸæy4î-p©Y«MÏ¬.ms4Ñ¯‰ÈÏgù'_?|tUÍ‹O‚ ‰ÈÝ—îÿ`
À'ÿÁ§ N^z‘\Yí×‚»þwÅƒˆëñT5¾Îó—^ ç/YY•Ãë#¯ó¼ÆÿÖx `ðýrÖ h9ñKÜøñÿq4‚ h‡ ËM�tßiV€’qá† ,‡À\µÍtÊ�ƒ%Jc:«-/IÇ'Žá¥óäA2œpv¤µé?|[Ÿù¯ï\¼@¶¹›yº™™R3`ÖãO-B£ñÖzº!€±¾rÎßêöOˆ6ù“Y¹Þ4‘ÈŸÚÅ þ{øä‘ÿ×S\þš2ÁÊôD8 ®Ã
÷ÆË�{™Ö6Èó«ûäÃâz\ôç•kÂY‚g\Ëï_¹LÎqò—•ù¾Väµé‰>tÎ5¬ócïRem€ë þšKÃú‡ h:¬bú¡ÆjøìÙp”Y¢×ÕÀ2�‡æ iIíC)ËDáŸ ýÏ'òéÖÙÜ\Håœò�$z*gÃ_g¼µMVNOC’é…Mk˜ÚáÇS¿K‘ß¬%p1ò'9-¦mçkÙFìç%ÞI¬óôé32M²­~ù'øþJ@OÌÙ"€O¬“Þ…sñóé˜-‹-qšÏX(ÎÐ¿x.œ:*®Fõf×¥L9ßù‰†k 44‡¿ì~ Ð*@ç‰_'x[àgG¢úZa‹ÊÖ�-AôÔ^X‡h-Lw±+yÿLf ôB×3'ò3ß²¿è¿¿%ˆ† nŠËËûËHòÙñ¿óSî8|šõCsTÊ6°lYª2`<PÔ—7Å‘Ýò×Ïß;4õÉé¯™�!�?I§2‹„) 2“× XS2§¾ÈÚÙZD×Ž¸&<+c]|êO|ÝÉæ¶¿‹pQUÁ¾ð$â Êÿ¾ ¸åÿÏƒ¨BüÑ˜
Z™(@9t¢)Pžc—µ ¶77D¹‡ž Åz´óü¦Á7«µ¯ÎÒUÉVNôdá™0`t~'"ùñ�d3æ¯IHBÜ}ÿ‚¿.V“Åkä<³lTë¨ŸçïyÙäŸ´Ó£fÏ@ÕýrÄ¨Gwz6 ÏONIXÀÓ�½FÈK"¯E_Äd¬„Å˜ÎövÉÿ|žç�_>³*kM‚mÿ/_ç¼¿îáþ.ÙyÿAX×¡¿UtŒj74Ÿÿc5 cËBürš ÁÐ´Ú]•W´$k8~H±g/ 4ó¸³òÞgMxÄœ3í‡íeûaà•Íµ�üIHükT!.X¸Œ{V7ÖDö€$A2¬§´Nˆ–,¤Kã¾›Û?ÍŸ;Çßt¾™mŽžX¢÷ã/=z¢·ò�B€Ìš-ñ¿A&9ež^:dc®q]VyÙqÚøµÙ`áõØÓ5÷/] Û< H”m„ÕæNí‹XâïÄ˜
°DhkS 2Þ
µ€ç1ÇTÀ,W?32¥ôl† È A�žtÑËyç�p&[[dÃ'ðˆüÅ�cEù¡¬Še\úlø„5ö·é?ä/ÜÙÁqF-g1)Oº$=O&zò§ßËh¥“"9þ”Óütí�ÅŸÉdBž>{–ÑQëÀÅXè=¥€…€wœîlÖ}Dþâ!ªþÏùu’¢ŒW§˜žÛ:†1 +Šû¿? m8.ïíj= M$þŠ~â'~M€  ZçhES *§)x-€]”˜`Ž BŠ¹þ“ëÄOÂùúˆúdè“Í%áö,�$›¾°>¹ X‚žìì�mÞð¦/š	E#“ô<b�×g$Óò÷2"ÁUKŸ’‚~¢5¼¤JÉˆ	¿ç“§‡Ä›zÑr£ËŸh¦B¤ ÊÈè‡Ý¹Gfc-°ì7Ä9—×„&¯‰¸\(ðmfÖ¢«#m~ ¬0+kÜâ‡õÐZ4¾)PUÇ•¬Ð÷‰ÏO�çøY�e,6q¯�üO7Þ!é¹oJ¢N}‘¥.E€O8Ã­�Èò_?N0=Y4�Í<rî™o³µ"¦"³B¼üá%HX9TJY®ò¾Y‘ü^’üuç735�‚øÒW˜‰)•Ç�âBÐhõ+ä/½1ÑuÞ˜~HÞ¼àÚÖz`Ù«sÿÁ5Q€ôÐÐ°¾µlKU÷¿Tñþ4ô·zeßhùw˜ø!   ZíX
â—��€«>ùñ¦k$³'�®t¬ÞÂ4{”2§u 8´º•ƒO4’¤Ð]ÐTÔý_óþ+ks�‰¿œGx®zo%Œ# b€ôbig³4ÉtQ�ôr�V0_uÁ~ºkE,$ÃÑÑ1ŽÆ„¸Xýqã_dvPqz¡'EœËÑÎ¶Oè4°ì×UA¦\“ž"äÔßfìo»&‚
CïŒ" Š:æ¤.ï]Š®·K@Gˆ_®ƒ&@ í Mk
TñKë_
€5Ÿ4OÎ†Aå7f'Ë—ò¥ÌuÞß"h˜zÆÔ6ÀB ô6VÂ9f´ =ÙHÂá"€[�}›iOI1ÒI¤ˆ˜ÒXç§”iÎA¾ê~:ÀƒýòFú3Á?’Ö¿CEÃôQÓÙ žážÛ	rû×¤W††ƒ•ËßØªX/þóƒsçÈZT01Ðð€«Wöcóÿ‹.à3ç&Dð @ ´�É[­“øu"`sm�<eÏE'<f&¢ó˜Þ7� ¾`ÜJÕŠ³£ž‘MèRõûûdê[òk\Ð(D#­µ„L_ü`V"O@/Ø¶OÃ 3&çÅ©ø,é÷ÌO‰…ü�rü‹¼Öy_,óýIË_<‡äøô$Fþ³2À«?ºèr
€*^ ÅLÖ×ƒ¹ÿ5õ�¿È²ŒD™j+ŠW†o3á-�ûý´ûŸª’®™à5 –�ø7–.	@5`¡M�æEü‘å%< ;[aÙ×d¾²« #8�%D‡Öª7¼Ž‰*ˆKZärÎYÏØ'õßŸ¤
)¸w`…Í„Àpc#8aa!Q˜{ý=ÕºgZ‚gŒÙEKvô«¦›Ÿ[šŸ!¥OyïñÁSmš£soé¡¢‘�Ž}_£$v]úškÒW„Ùšã@ ¨®ù(Îÿóòí%= eˆ¶EÄÏßG x Z‰‘¸qçÞhÞÄ¯1ÿ»½½mŸ²TS£'Ó6óÑ¯¯[—æ²‚Rív9Ù¬.sh”º7Y[ÒÍdŽ¹t÷'­Í>›‘�t;ŸøÛ®Jò'"¸PnÈâÕ “Ñþ„¦�Ÿj¾Or‚ÅFþ,…˜öd½•ü•?¼ÔÓgG	÷œèã†tQ£ð|õfçKfeø¯½µÕt@¦F ô ù¶±ÚªûŸ6; ™èÚ ,A×U Ç¶7~ò'M€  Úé˜gS EŒ¤ÄÀ%^{�ç³³Ù2¦5þMe{™Óú¡ÇØKpÓ¿Ö¼TÏ"òéL\PA>MVWB�ˆŸ˜= TYÎÅÂØßvƒ*äÏ¨ð4ˆ{�yZAP5£i²×ºýí1 ñs™,”–qñE�Áz&òçxzø,HSKu+4t0LË½žâ	è)ñ" rm%
Æt +B”Ñµ•ù÷h<@^û†fð @YxIˆ_õ¤ íBÐÖ•Òóú¬EìÃ´Íïˆ'"Ý™¥ÈOjó®ÿH0jÄÜ' ¶œ+én–>LWú‘+YM3KÚŠªËY>¦+¡ûŸõ¤  "@(†<ÿTSÛ±“|Á~:ò§ZO ›M‘è¼†M‘û?NôŒe´3Ž�8£2VBÆMÂæi|ù+sÿ:QxgèL)€1÷¿jý77`k3¬0¢ K@üò= B ´Ú°4Ä/³‚¶ÀýN&ÂÚ%¦P½túŸkð_äu`ù;ÚÉz‚x“õùE àÔ'Œ›Í1÷H<Úœ$Þ§â‡Ã·ñxãÚ‹\ÔP’¨%ÚŸR­ðq#ÿäùµû1­'@ù¬„¥NãoGKŽOOÉp4Jª…„Aãò�Íÿ«îx%3CÄeôVû±¹�€�xv†¬ÓÀ·•Ó;Z÷‘ßêÉ E‰¶eÄ @ë= µ4jñÇ^¸²ºB†ƒ¡6��rÿ¬©z2÷<F
7ºa½8ñ%æê©/bdê_Ÿ˜ÓÅ¥ÑÚ›ý£èuA0átƒtí{³^¼†T?êbùgåðWQÜGãògDïÊòäYL4¨e‹	Ó[ýú8e:Fž?a±Ó~?Eü:�Œ*ÌdZ í+eElF)òŸöÅü¿©`G‰_M€  Z‹ÊÜW‹šßÏ³�êX_[%Ç‚ì˜Îh2Fç›[Ôê^'‡–§ðOÃ‹æ}™R¯_µ •PLîfÕKÀŸó²µLØ¢³4C6›¶às¹–4À*üä«üg'“õ>�ÉñÉ	Ñev0áe1OhÞW,óàµS¼ÊdŸ¤c2l"@®ßï%,þ^¤_¿àêåýÊÉ½Ä_ù
@ ÌâQ¸)Pˆ6È³Y-€õ‘@í‘ø9­—t#sÐ_Œ5eì˜šA�Øm`qúdÓ#ñÜ“ HZ�T¤ 2Jâí†Uo15ý™}HÖ¹ÊæslÄ£÷XÊö&þ>KS Ÿ!;À8M¤Xé´O£¹ùÇD •å›nÿ†záê~®À!þ`üü©Ÿú)4‚ h½ wS 6¿Š¨ÀÎ–œî¶–²5~K’.Ð¯Çò[þ,Æ^¢´ðlÎ™*½â)±§‹§<}Nð½h!õÿC÷¶’¹` w'í–©ìgx]ÄêWßãÇ|ÈSÿ˜�Ô-…Ÿ4ä?»&²N¿˜à‹åofÁeí«jô³î�çÙ6ÐâG`€.!WS ¶hLÑÈp>¨Àœ,§ü}C,€>'ÚLþñ—^˜^æÑ´,ªû$óþMd3;R ôd‚B¢*¡Hô¦„YRº²Ík¾ßdù«güðè(Èÿ':¢¸‚ŠÎƒ&GŸß[I1æ"zD)¥Zü%­ÿy$^ÙÛÕ¦ v˜ø!   ÚÅ%~Ãuý¶RÈZ Œi™å  ‡ÁÄc	C2ªÝCÀX_¸Û½Ùú�ÒÖ¨Â..Åb#RÁ€a|"�u,”m u‚&IîK?žªž$ª'c±Ÿ4›3-ÉÛÁáá‘ÙêgDÓÚrÝM÷5.ƒHNÏ�N\ÿ—÷/i-ÿd<�I  ÚkS ®A-€@yæÒ¥†b@ÌRÊ6õ£ÛZ\æ’¥ƒ=$|.ù:ÊáwCÊÝïÅò†S J3 ˜el;æøù	�@ÓÔFºó%&ò�Iòw´úåggƒ0õ�¥§"ò4€jjËìE» ¶¶6ÈöÖ‡…¹®SÖ;YS/x   Zï¸Ù$‹¿îõÕºk«+äL\ió_O„˜²ˆc–½…ìc–¿|êÍró“´œfšùd‹µswKË›ª)€â)2[ófWî³uòc¶f>,U MþÿS¢q³î�Ëß¹ïCÖ=ÆÞXª\&Fbq“±ïÀÑw¤”Þ†Ò¿ÃzÀ•ý½è{›æÿ;Hü¨ ÐzÄšu•øUÑ#W}p:µ\žÁ#‹üCï½fÜR; ¶ˆR‘“/ÉÉ“~ûpÀeq‚q¡‚è!ÉW’½ôˆ2ÀáûžÁ’'Î}²Úø²gçOñKQ)“uÿ§äøøØ°-oõ«sHòÁI�ô3ÚL§¯G0É3�VDúóÃ¾Rx^õÿ@ühÐ	M�üü•Eð™ñ« Nþý~Ÿ¬ói€çÇb¹¹&¿–äŒ¤·âqqû',ÿè5›Êç,±oƒ%i³6rdJ’Ÿ¬ýÏßå‘íÞŠÁ~Vb/9ßŸxïðÙsÑÜÐ²ŸÂä¯£ñ�¤0ó,âŒi™û.1Ö3nÔ€%!~‰?ýÓ?�&@ í†¸ÁK7j:ñ«�1ÛÛ›Ä{˜0º
Ìû[Û(âÂÉíO”¹î¨0…y¼Øþ¼À'@Índ›µ©Æ=DXü<$„‘Û4†ã”€EÄÎAÉ›Hœ{NŽž?'ysû�ï3ÕêWÞÄ#Óµ¾/°â@eÉkÁ×„ÃÄ‹ßŒ•MÔ‡®\®½pÑmë4„õÐzâçn» m©DS 6¿„œ8·µÚz˜g¦üÙˆÐóôë$	QWÒ–ÎºòÅÄ„ž˜ožû4€J6ÑÃc¢+žÜ§Ò˜ñºï¤~Ÿ|Å}lóý6Ï@òuÿONÈ4p©HïËu³‘˜ûß›z!™;z äzÁ6SqÎYª;QƒÀ¾q
`Ä_‡Á°€ ��5 +Ä/­ù÷ÜÎV`•1µæ=K;‰ÓÅk²ŠÙ°¸¥çèöO‘_D,Ê>¼™Pñ|ÓqÚiû"ý.‘t Ã‰[œS	ŸÍšÿ$¼)ñ¢õ~XÎ‡Qè¤YÞ}¾_/6ÔõžWoõ«V¹ê¦�‚&}"œLÉÄwbIò�ÖŸLÃ}z†Ïh 'àòþn¡ÈÿTí«:µ €ö{D&Àõ<Û´‘øÕõdÀîÅÂŠVÑ²oçà=õu�™]ãÉ9ÿ˜¡ËI¥¶þõ¼™'€ç4|>á@!•l¨†p˜´49áH‹? |oæð”>	Òq­ì—w¾Ÿ-ü<îûÙ{Ãáˆ†£ú¬~µx€ô”01E3“±8Ïòa ê:|¾­º¯ð9Ñö¥¨ó÷”< ª2À-!~	4‚ èŽ`ˆ?é	ØX_+Þæ/]Ø¤ˆ]é§ã‘±Ù��£ó|Š‚ÿù¦þªOj>I0n)úå>õ
’Ômˆ\ÿ,´6ye¼	o‡Ì÷5ößáÇÉóå'>	þ
!<±|E´vñ„äù�zéŽŽ�S„Í,Ý§þwõøt�z½� ùßÕUÿºŒ‚sþ“éhBÆ,$ô	›yg´×ƒ…ëðuù6Á¶\¨ûýÇ ü+BÔÙî{k“× Ø$ƒÁ šR\âG€® ÕBÛ¨îâ=‹ ~uPäWW×ÈD`Î–¿3Ùy$îM×Xù&ò�ºòI‹ŸD…‹¤…(ÝÍ^ÂÚ4‘¿\'Øf<[3o–öÇÂ» ½I�ðáó+îóýúf;ö(ÿ<.	.lNOÏòYý,×Í—È¥.{¤9i5)´ÏŒúqžr-øº|¾mdù{JüG|.)¿·¢¦f—÷÷#â/R¸¥ÄŒ—?ó3?ƒ&@ð tÎð™.Ü�y[àÓ³³ØvÙsÞi‚Óó)ƒ6Ó‘Ÿ±­øWx ¢ô<ßâ��?àN'^dmNYT%Ø8ß<e3Â™rËŸÚþ¾‚üs¾ïiHW,šwöÌ­z{|Ðïi¿{Þù~×@?�‡ y¥�Õ´Ng—?ËG‘ñË‡<—S²2d>"$�dr¹\ŸoK§Óø>ÕéŸBæ­­™Ðå½‹ÆèÿŽ¿³Ç€ h®“9t\4ñKË_
€Í�rpx”È¸2Ïg¦£ß-S²hOŒ³Ì.p–´tièjYZæ
1x“IäjžR³µ™´89Ùpï�'@,Å0JbWRuß—Éð†|õüó5ò1x,e|ŸŸœh—W;®¦þ©"€€!
‹>ŠÎ5US¦þ�ÅõàÛðmå~H"î£xJ@}€+j Ì“økè ÐHOÌ3_Xg�þºˆ?¹>ÿ¾;Û³T@Ïô–ô-cÝ2Û|wŒ¬V«'Žu*‚õ¦q²!#! H:ê\=$�ÅÉ·e
Ù°©s?3…xtÖ=åë=Ïð½Mdo?&AàhõËeÜõÏ=Å‹úõï‰/ÈÖŽŽÉ™ ô›‰ OáaO%®Ë·áÛò}�©F”,5àÅ«Wœk t„ø1ÿÐ-ò—D(oê¬TÀ.?‡ô œ?·‘Ô‡d÷1,³YÃ¹ÉŸ‰ý"/*	ö”ôF£€<¤ÐÅ¨Ñæ…tz£¡pý‹©6›sŽ‚ÿtS Q™b¥ˆ�«Ë¿d”¿ùr‡ËžŸ´üsÞ§Þ,e2zÒ€¿h „Ÿ¢™Ð¸0“bl,<|]¾M  ¤˜P÷­fg4‡ÿÉW/GùÿEÈxŽUûª"~	 €n�VS ®¿9òÁkl¦D¼kë°¬:öÌi™ÉåŸ"ÿèMAÈ^ Çbè| }"¬Ê(fŒ*†ª2÷XœüûÛV¿B6‘ VzXGðÂ�QÈÈèõ0¾GÒ]û2¬~y™xô|Ðõ¯Èýš×ò'	ÀÏátdfô†r2“³þjJœÉÏQÅX`ýsÁàosŽg_LÄ¾T ~fƒpyï’1ú¿£Ä/�  �C¬)PÛ‰ßåG-k¯©C	úÉtógE¿kˆ.ËòWE®æ© ÿ� ¸õ¾rzX�C2K;“Ö&IX›2Ýl(,Îµ““h:�)dÃb†ïê)V«¨°ON—¿z‰ONÎŠß‡…* *YS90\øÃÓ!9Ý\§Èl@ òZðuNùs›sÜýÏ÷!÷7õ]
øòÞnª`Ç‰_^> €Îa$nìWšDüUê<›ëA-€©Ë×ºWÈŸ2KÚ›.ØO·LVõãõá{ÓÐ]/¬L&¢rê[�Ì'�%ã ¼á„îfFÖ}Â”ûaÒêäB ø9÷¬™ÞP¿–§¶¯qŒòO½g ú”'@Oü¡aA&›Q²Yúd�œ·�À§>™Ÿìî„–=›MÈJÒý?Öÿ	¿÷üm¤€ Š0‹>§ŠF]ž<ËãgŠÖ h!ñKÜð×A €Îz^©“øQjØTH=®­¯‘ñé@¤Ü‘áç�ógAê•—‘ãoöÄòôd o6_÷Ø'ë±? �ÉÙöZäný|3é#²>Ež„�ø½Ù÷§^‘ÉO˜H sœïw­åol‚§�àÁ^Î9±Ï§¶‰D€" üëÁ‹õ¬>#Ï_Þ#'BpÉlŠ†ˆçRŒñužû¯ù6A¡¾) Ø4Ö¢L0pOV(®^Þ+T ÅÄ5NM@ t
" P·.™ m&~�àµ N|kšR¦LÄ‰,Mlúea?’+ØO%Yoiçÿß�7ç‘„-¢ÅÇÃ9ÛZÈÄp&çþO¹PŽÃÊwaõGV¬D[¿ ùzê± Xaa«ŸdöÉ"~íÊó……ƒ¼&ÒuÏ	|<"›OÈû¯È1Ï7]#^éjˆe|�#ÿÁ·	ªÿñ}HO@Ô�©<qË{»*ìíæ›ÿï ñG 0@' fˆ@@k&@Wˆ_ ý~Ÿlom�'‡QA·�9ºýc$èÑ™H’¿ºŸ,òÎ¸7aÊ"’ÈŸ—ñõÉ‚žœ‘“K;Á\ò@±öcîf±Œ·8ÉñYXw>(,\þ^øa  h@”QÙ�Þ	j
y¬~ù›E¿Î¼îÿÄµŒ¯ùNÈ¿¾¨•g†¥™¥ XúŒ<OÉ‘o‹¿¡ ~Bfsÿ’üùºž>S€ÌPê2”Ìå7M¨÷ ì§:hvœøå{ð @ t‡üÏ¯wÙâO®#�Û>ç´”f8ÌR¿_OŠr€"ã{4ÃòÏ1À�'˜N˜DV?Qjø¯?;"'/_Ž,Mé	�”¥š)óÍëÏžÛ²(è,œwfþg„e�§	æÐ§ù1™ªXq-Wò¬ÿ³AÙ_Bq×c‰ ÀqX³8 gG§äpýyNÂs~&„ ‡¼|Ù!ß_÷ÂPÔû—û‘û­(�jÏ{qð@[€¿|Š&@ ÝÒÐuâ—àäÏEÀ…ó;ÜÎ2âÙçümîA6AÐ^Èœæ—°úÍ Li$„€°4#â�Èšo9>÷—÷iMÎ]üŠ»y,ÉŸ[œþãÈ_—[¨žlü3‘A€ÓDd¿2`ªçÏ½%=–«°OV¿ÄÔ?æÑ¨d<VÑ"@Á_/dÁc$øÎÈúÃÇäÉþ¹€àŸÏË†ØüX¼÷Ô<á‚Ì_—om/÷7�Îâ2ª÷R%àÊ¬€ÍÐ!â—À @g5ª«Äoˆ_µþùƒ $Å‹íxÌbùÛÚÝÆžS#ÁÇ-è8©èCQ¦›y"J?t53Èç[ÀÇÃ9^Y½ Š`dVeNZœ'ƒ¹p:ðI?ì8LˆÈ6•¥�•ã±6óñHÏë•nß[„ü9fMænÿÇõxÓH��}2ßyïyôßG{”<¥¡¥/­gD�¿¿é#ÿ†ãë ðaæ%ŠU€*Ã y# µP�ÿ"¼	†íäø@ tÓ@”¦@]$~�¸táüÌÒÊ¨ßŸÝÔG³Ž‘þ‰e,Þ^/œbºóqB�äÎÿKwóøÙ	9ÜZæ“w³¿ÍºòÌù<3Ihä¯Ë·a²½¬:cÞ8r93µ1g0ŸÜ¢~@Î.K Ÿ±Æ?Ñº˜¼vþâ$À¬2#·ÖÅü¿ «Ož�Ç‡'äý½ò¾¿ÚyoÖø‘ÿú}ñ8ô×yÑ_7 Q€Ì¨nÞ¾JÀ•ýKÖ€Ž¿\ë ›Ä/¦ øË )PU%�›JüêwjðïË-šØ€Ùò7vô#½4é™,‹G Vd‡[å´Eœ‡S œl|Þ'�ÍGäà…]rHÂ ²cÿ2®‰Íešÿ€G›?zB<N4Cá�îfOvL’¿%¿ßK=ÊH®€’V¿Ä@ÓÂyÞü?«(E ¿&¾(áÝ%OOÈúý÷ÉÝK%—ièþ?·Æc“»âÁ×!'Çá6|ÛñhFþžW© ~Ý”•ÞåÆÆ&ÙÞÚôù,U¨nâ¯K48~&š A tÎâO>·¦v�øUë_>66VÉóãÉ¬ä:³‘¿aþ¿G"òÔ–õ%$áÚ×{b×Evs2 ú¡'€[ìÁ|1÷ÈÆ�'?ðrÐë®å,ˆCp(ˆŸÏ5?žxäÂÑÀ]ÍL‰¦ ØŒt\Zø†äï•¯åo°üm×ôl0¬êWPœü¥ ˜Lc€äì„÷%&¿û&¹ýý!h?Øä‰ø(þ÷¦¿Ù�ñ”|Ÿ¿N( NÄÀpvM¼:*–ŸàÖ‘à¿46‚5  :Gþê{¦TÀ.l8”µ 66È³ãÓ™wÀ�óoÞë‘™‹•*Ö=UÈ�*ëSå¸¨z’Ï©¨º7õ‚~ñAú_læ[ÁgBONÈèñ!yÿÅ=²GBks$¬Í§þfï{¡»yôè)é‡S þ¶Á>Æ¡ëŸïŸNåôŽ9ù�)‹õƒ^ñZþˆŸƒ×ýŸ–NýKXÆ…E€â×$°æ}Rï?yLÎ¿ñ6ùîÇ¿?Hý»$>ˆ²wüÍø2¾NäfA€Þ´²
€±C¦½x–Gìï^J‘ÿ"ˆ¿®Ž�–e  �7»jñ›ÈŸîln‘‡ìI@~ó´–k*Š?áÂ÷¼• àŠµ²1šÊ²X3"ù>wÝò >é>A€ãAän¾pëy÷ê9ï“OÏ?»=ðŸßóïrÂ¹ó.ñN9Ùœ
KSz¢ ‰¨Öê�IFIoŽV¿D5sÿ(€(·NÄgLC�L`Í¯®ú£TŸì}ã›äÖ‡_"×Îí�ñ9<`íù1ùy~è_¬çá6|[¾¾/&ºÐªèåwxåò•èZ™¦ :Fü±±‘5´7 P¢¦@‹®Õ_æ³\ö%c Â¶À[¡7ÛcJŸ=ø�Å;Ò÷fY[†úöú`?Ãû$ÙrWœéM[s&ô¯R( VßŸœ=|BÞöEÀØgå‹Óp3üw—Ç<}F.Ü{�°ÓÓ s ðŒÂ€ÂÐ \ÎaC§.~á|²GLå|ËúéÀ	gÄ�»)
@uÈŠð¬œð<SÒó¿Ó‡ÿúoÉíŸÿ,9ÞÚ
/ÿ|èo¾Jz�SüúÛ€áþ¯¦ PZôJÏSñ}¼øÂ¾1 °‰©|íM€  ºïð	1Ö¨nâ¯Zdä2ðâ…ó>ÿ+iMšb=*1¦ÈŸ{tyü)Òsó¤óÁ=ß€óÍã¾/8†Á Y=­Íï¼Aîìÿ9ñ­¼ó‚7žéfŒ|ï·_÷­Í£ÀÒdágý ¦³²³æ G’"vÆÊ“žëËûTzÏ—ûÁUÂ”TÀ~@üÓŠ Í5ŸÜ?ú{ÿ'9üøÇ|ò?#çÞz‹P.Ä¡x<2Ã³D
 «±`¹8€«W¯¤b :Lüòé2+æ@ t�üÓ ¯è2ºBü!gÓ¨Ðùs;"~�BÀFþº, >ÿïéÐ(
É_>çÆ&-iXv–õ|ï¯„Ãü#X½{—ì½~‰<þÄ+ä±rÌû¾0X½s‡°cŸü�Å|3 ¾%ÍÆ²û›µN½¡¤/�nYÖ}ä”þ�ª¾ñ«‘²Oƒz|²O€/ z'Çd÷ÑÃðý©(,ƒGƒÙüÿtZYý#ýóû¥DÅ•ÝKÖ*€#~uL  ºGüš×©L€ªÈ¸	Ä¯ñz�Ý‹fîl�éSøl‘û„Æ‚ýˆñ9IÌ÷'š
%ƒèT‹[†}NóJ?< +ºN,°æ/þ?ÿ/¯�Cž|òÁ»»ß~�\¼öZøÇç™wóÙ,@Ôˆºæ-âÓcµ[ýÜõß¸ùW¦4��¤*/	?§2; /<R"`4«0V¯‡Wy
`•€+—÷j­Ð0âW= ˜ÿ‡ è&ñkÜ]1æi³Ú6âW=[›þøÜ÷Ç`™
èÚ²7,ÿËãxLOz.óýLSz˜$ƒƒZüÕD”¦b0ÝÍ�5¿¾N.ü—ÿBÎÿËÿ'È&ÌRÿ¸•É…ÀP™oæËáãieöM8i-}`ÑAôÔ/UFÿW/¦áå+¯e…@. ­ÖúŸˆ*Œ%÷Z#ñËûÝÜð+›þï„ÿVx†ªk 4”øårx   º/
„E|=Ï@ÝVâ—ä/›>yq‹Œy1+œÅ'íµõú=¦iT8@ÙGj:`d|¢²ý^Ô�†�Îü_Çjhm=¤:«òyÿÀýF­³©šû¯Ë ™ï±š‰?Óf“¿ü;Ñ—Ò3Ð›„×"°þ –ù�¬~¥ùOÝ–fÁª€û{»Â‰áUV áÄ/Ÿ¢	ÀÒ€ÈÐUâW!·67É³££p€cŒØÝøL†÷è=*Ö§‰u©âò§‰ã¢	/ UÈ_YÆ-·`÷^�*Ædºl<ìG„ê…�XÂBJ¿ù ¯@Øö—$½ÍQ/•è]Þ#ñï�:ÿÅ#ÚÃÈÚà_¯CtmDgIþ’®Jã‚!*ôã%‚þêÿž”O‘ü=ö*¬PG¹Þˆ?æ  :Iü	DM�ºLüIÀÎöf¼Íˆ3ù‚‰ÑXõ<kU?Ó|¿ÎåoôLÃ–Ã‚<" wé÷úá2É!žÒI�×û÷¼Y[aÏ›Å;0ƒË?OaŸ,¹ýx<iú�hfUó ~xg"òî’bZIïLYüs™g.&2®ìïG×¤h€–¿: �&þdÀgºJüÉõ‚Z çwÈ”……€</Ãí/È.˜K¥,Ê ˆ8IÚ4q<”(Å}”±žj¢þ#€Jþ!©Ö»À¾'âhofqÊÏuþò÷fîgÅw(S4NôÑq¨ç‚ZˆŸj®AIƒ6ˆü§­øE)–>#ñ
R@’�+:_n _ôzùã ^záò2ÊúG @gÉ?±ìº?H|&+°íÄ/ÉŸ?v/œÒ›J§ÉòWJûrÒíeXþ¦ç)K?;(0(}÷Ò’3$�0ÅÒê˜0áò—¢!²>"ÿçè§/ýÛ²W¾÷:èð¢¨�:Jü×Aü K%xÀ¼ˆŽ?dm ¬páÂ91H‡¤Ê¢úY� ò´Ù¦@¿ÁÛÈ>%ä[‘óŒH÷3	ÜÎÚ~^²`‹(YÌÒÄ¯­óôÓa;²v8 ZÊ§‹¼|q —÷w#@V€¶2+
€ X& í
ØFâÏU@¸ß£q1£Š_ß˜Öçå¯¼s�`|¦mÏËâ¯)µ·ï5e3XÞÓŸºù�`ý�ÆøAÖ% h~Yuyo¯t€¿V À ÐYâ—dè?nªƒDW‰_y~s¿ß'ÓÑ8
Ì²‘{xn¨XÕ±¤¯)ðÏ@þÌ@æÑë˜ð†¼«Eï^Î·Ì Ÿœd¦ž‡f� O= ^`{kƒœ��åN,JüU�)%Ç4‚ è¼Å¯»éGþ²µºÜïM ~u ä�íõu2Žƒ9ò¬¨þt*Ÿþ¹©ª Ö# �ÐYþÂ Îÿ¡Û 1.ÿ˜õ?™àÇY»po¼¿»«uýýÍÖMü�KS‚ X&â—Ë2›ÍK�Ïãsd àæö&ñž‘0³Ï³òáÞO×¥è|¿Í#�Ü/‹íÅÉêÏô,0ÐO·o^ü‡`ö¿^À3F<Wp)òÌ”éÐâ�¦B	š A ,ùËù=Nn\ øVqª)P—ˆ_z äßs;ÛAUÿp�#k^aÍ¨^€-Ê_%ø´(`‰•Ý­~3ù³,¿ÁV¿ÄÖÿÜ< ®¸,z þkñKÜ\Äý@ ,T¨óÞôm!~¹ŽŒ{à€Ï‡–?Q[›[žÎê¸ÍýÛ–éíÂ ·ÕOÒÓ ‹ôÓ€)~”s îq /¾pÕJþ#~	Ô € X.O@Ñô—¶¿
9péÂQa�)…rÒsû<…*Xš,ì#y–&ùŠüh
ÅÈž*DN. ªx$2ö(V>Õ½ÖœÝûsðÈóšÿò|óñ0–íqyáêe­ h@�þ:÷sÄ°Ä¯.ã®>Ÿ¯K+¡«Ä¯ZAü±ç N‹‘«Ó`½SªZÉéyû”¥Ÿ;Êß=Ð/áOh¥Ë?) €9
€ªKgáêþn,°ãÄ/—£	ÀÒ
ƒ]&þäû\ \ºVâ 5ÚÕ¨þÀjŠy4ì2ß‹T‰ÚLÚÑºN.’ìkP ŸM|ó <Þ'»Þä×¦ê6À%~§1€ è²G@Û¨kÄ¯
 ^`ee…œ�FAO �%O‰®w‹{”¿)ª?í!pIñ34ñqÎíoñK`î€»³2â øïbg{K[ £Ä¯Žÿ]  ó$þ¤þL—‰?x*àÙp˜²úIäþçMXúj;_sk_¦LÖ³Øä½$~š zÓkIê4í	‹&Hž¬þê[÷–ÁÔ[Üg/3z½>™NÍq ²°Jþ&þ”õâ‡ X*âW–_'‰®€m#~—ýò‡ÜÞØ$O¼ÃX—ÖØ>ú=÷H~[aŸ†Yý‹èøÜ?¨A^ ^Àâ|ÙÛ½Xzþ¿EÄ�} ~€¥jO ]ªPˆ_õ ð¯ÀÛQüL¦ÆÝûaî´fzÀ@þ¹É=w ŸŽÔÛáòW�¹ÿÅz l¸²¿om Ô1âW‹  ËéHÖ˜ç¹Ì>ŠŸ<0l˜&Ùë]vÓ­.Ê_GîÌûB­
ôËœÀ"< õ ^0Ô èñg5jÊo€ ¨•øÕYm
ÔUâŸYAa[à½K|kt*J³X¿·b [û^{à_f“£EßÎ@?¦SXÿ÷ô{dj¨ÀøR¢@Ç‰_â&ˆ`iHßô#à}xS ®¿jq°ë€ %°pÄ¬õÀýo+Þc_Æ(1öaj�·ègë'¬|š yj ÿõq¶þQø§^ >  WD`ùè8ñš” À¿\ÇØ¨íÄoJÜ»x!ì¬X<QÍyJåû
Á&-ýº;øµ8ÐO{<˜ûoŒÀÔöfïÒÅLò_D'Ï÷�&@M¾Wq
j¶Èâ®¾›rŽ0¹<k¶há<µú]·Íú\—Ïæ}Ï×VWg„¹í{Ácæò$«öIºñ™\sFîI²�¯› vMÝþ2.ÿ&Z4¬¬†x zÚæ@ü÷À›d™2 ÊþÞº�›e� €V{Ôž *ù/JÁ×™w,—I¡³µµINÏ³rÀÂBb¢ø?sÊßO.“ÿÒD ÍÈã^‡ÈG.‰_ŸÛßŸúýhCï9øþ›ãè“é$nåËÀ$�vÌâO¾… @€y¨îÅ~·nÝr"\×t˜¶4 Š@ÀsÛäñõ/£þxùßˆàÑÿ„dúeuð+è§{¿éƒRÿ6õÒ€d væ›ç>¬€‹·!Jà˜Ë�£Çñoöëê@‰_µþƒ¶Àç/ødz?˜Ÿ–^€•ú$óþ“sýª0H¦÷Eb “èI<› òƒÕß>òšéHâÊþ,À$Ø˜Ã_v�×ðû� Xza DÀ�yþPçMüÉe� ¸p> ÜÀàIÅßÓ|}�~1‘Ãêoùc€m @ÄDÁ¯>®^½b$ÿ?Š A €øˆšu™ø%ùs²¿²º=‹ßi5¬ ±äcô^ ·_÷ž] tÃê‡ h®@�xù…Ë¹çÿ[Lüêx4õÅ)¨nÎ‘Sj?¶2¢e²ŠnŸ\&Ýÿüqéâ6üaaÑ_Jãÿû²X”¿ù³�Ï¬|–¨÷¯Ë ù5{q —÷ö¢ùS+à¼¿ÛyDý—Xçî]x –Ùâ�Àð½p@àq ŸIVl»ÅŸü„ªÿÉi�>QâúƒVQ?¿ñÓñ+µÂ‚L}�&tš°ú©�øiâû –¨¼ÆX‘——÷/ã oÖÔ‹¿ïÄu?< ðÄkÜ�Ù‹ß¶ÎÖæ&Y_]Y{¢_zd²+ÙüšÜ~•ü•Ò Äè—pù³ŽZý@K< J=€­�²½µéÔpÑ™Ú"	ÜH®‹ß< KéPz”®ÐD‹_·ŽÌØÙÞ"'ggA‰T–ìÒ§	Ò#$O¿¢i€!~¸+šma‰8€ÝÝKÁk“ë¿#J €ð! –šø“ïûo–ÝGÓ‰?üd-€sÛäƒGOHuÅPØ'VÔ_ª!uý{iâ§«¿=E}€î ß_ñÀ˜ì]ºTK ¦	2¬w ÀR¿ºœ«ÿ~¿Ï¼6öšË>êþñÖ)*fµ Î®>ÿoì+jõëÖé¸å´ÆÀÁ› åéØrâç˜”†  ñ§–M�|r|¥‹Ä¯«¸{ñ"¡LôI÷˜�ìã,í^åÏDþ ~`ñâ H�¼ðÂÕÈ¨³Ð<Óý2Ö×6Âï`éEQºZú4Žøón+S/ïïÊ;¤åJï#Ùý:VÎè¨`¥O^E€ŠLïµŒøÕ1¿= ¿º<™	P•K°IÄ/¿'ÿ••òâÕËÁü4ÖØâòÏ,ô«hú½òòK/Ï“A€$~Õ€ß ˆ_BÖ�™ ÉZ ó¶êÚVí¸¾¾N>òáºÒÏ°úíä«h³àå®�ñxÔ¨€šˆ_®‡ @ �r‘
x½l7°&¿êà€K—.’?ù½ÿ@¶¶¶ÈêêjªR’®šà›t,];žºö=‘Wô3ø½Î…ÿÉÉ‰ÿ8&“É¤Ö€¿|úØ â@ó/¬ë
X§›žÄ¯ù¾ÁÀwzzTG›¹U=À9Ö:b—më Ò²$[ÇöU×=	~ï‡C2
wlñKÜ¨ûž   ZãHÈ9ð_M�ºLü¼ô)øF£QíÄ–gÛººIÞ™EÞ[u‘kB¥î}¨ËÕèÿyý.€ø9¬M€@ü KIüªELÂ*YŸY9Ï‹øÕ÷lnÏ6É²kÄ_W!¬yÿ¢÷± â·Zÿ ~€¥%~Í2mS 6ÿ¼j
€øÛKü‹lvÕâ_PKÞy¿Äu? �Á¤ÿ¦,•ëšâñƒøAü&~¹î›.NÀâ�n€¿K‡/þ÷£ý(å�€üµKWÀ¦uý«ëxªÞvQ�ç¹mß±Žï²È.—óØGËç½Nç@ßÈ¹ñ¹Ï}M6à€ÅozÏÿ‘Üä)r‹°°—ÝâoRÁ¤EXüm)#]µõÛ&‹¿Ë¼Îý&Ç¶:öÀÐzoÀþàÊøþýû7ýuF°ø³-¨ª,þº¬Ù¶Yüó¼wyµÑâ¯Ë2ÏslED…ÚèÑ£G� øüç?O«ð(  ­'~•ü9~ög6h
´hâÏK²u‘w�¤¸Ä_æ|ƒø»Iü®„^””ÛÝøµ_ûµÈ°‘" ÄßL`
 "â/¸NÔpÞîÚepƒã;ÂÕ_ç~ZÐ’·Òý:nw³ªÏàh=ùKåûÊ+¯èÜa±@ÀyZüË`ã;Ââo³Åß¤À¾Û¥j üÂ/ü! –OÈ‹Žü9&“É›IPWT7H±úHø:¢è»FüYçÄßâàyÞÛº÷!š	LÌÙ# ‚7RÓ ‹î{^ýµmÇÒ´(ú®¹úÛ)¿�ùjÇÔõ}ðZ]ŸÀÐ
‹_…Éúç7ÊDæÖaÍ-‹Å_ÆÃR¥…ÝU‹ÑVô<,þ.æð—=–Ñhdl$½ „ è<ñ»(ÜO~ò“Æ¦ó&w?ˆÄâ/¹þÁ/ÿò/Àê‡ €(ðûØÇ\æ½n€ø»Gü&Ïˆ¿^Âñ/„øµc™¿ø‹¿ˆX €î{ÉŸ#3 Äß>â¯’œÊÔ Xâ_¤0 ñÏÆ2—}A4¬€ôË`:��3tÍ3šÜWGÐ\—‚ûšÖ §ì¾‹|§®µÓEp_þ&@`x –9¬ÿ € uYõU¤º5Á®¢º`JÏÃÃ2O‹¿Ê=MòÀâÏ·>oäº>¼ ð tÒðñ�<×�Ígôû}’Õ>s™­a´ä]œ· +-yañ×¿¾K �@T @û‰¿(xS øÃ#kó˜AüÝ'þE–ëm
ñÏ“Ô—•ø¦�?¾I€V�v%-CWNwxýõ×£çy­‰7n¼>�N_™L& ~?ˆÄß&â—¸î[ô/jCµÙˆƒ (Lþâæ{›7â"Æó<‡‰z@ü#þh+c¿L@ ,+DS ßeâ_†’Ä þv]Ýâ¯yÿ7  ë?¿úåÑ³2°k¤âñ/#ñ/¸%ïÜ=
$l\Æ’‡  •Ö{™ÍÆ�Çß]YY)•	 âoÏwñƒø;DüF£Ñë r€¥Ã'>ñ‰ÒÑ‡ÏŸ?¿±±±1×‚9 ~?ˆ¿:"\Vâ—Û�œœT1 ñ0g  ü[É¶o¼ñÆ£Éd²ë’	 âñƒøAüM ~�ƒ_ú¥_ºœ\¥ÄØ8wRB °HáÀã xIà_RlÚœz×ˆ¿Mîs«‰_¾÷¦Æz‡5°T$^j?þ�ˆ7Òøq[ ˆÄâ¯–Ô—)•¯FAr½bÒ‡x€ X.áÀUt¯×ÓNe€øAü ~‰? ÷^‚È! `ý—ØÏx<~“.*pÄÿOÿôOÆÂG.�FO¾ð…/üOâ<öÄ_ª¼&êû_ûÚ×þC¿ß_ñ/ñO§Óñç>÷¹ÿQÈÎSÞ“ï³ÿõ7óÿX[[Û³Ñ–íH¸ˆÿøÇ^	þfÝÛM%þ¼ÛðŽ¦5�>ÄÃ€n€ó%j!³›ê°ÎNquîÏeŸr -u!nˆ{¸/þ&±÷ýùH÷™utÏ«sßMëˆW¦Ã_Ýße0Ùî‰äûOŸ>-Í¾ººJ.^¼HÖ××K}§*Ö¯»c b¼Üœ÷x	@ ´]8¨¯éW¿úÕ·ýß¨Ž�²iÄ/×áƒeÜ»wï».Ä/þ@u¢\ªBh-3ñ7}ggg'yî‘÷ø=UÂîÜØXÈŸ{ EüE,þQðÓþç~;9ž�È! `ý»í'xþ…/|a”¬§]Æ‚2mÛâ—(ëøÖ·¾uÃÑº§§§ÇêñÔALó&~WkoÙˆ_®3Nm÷Dòžùö«¯Z= Y4¹º²šº¿:Jüro~éK_™Æµ�¹€ˆ˜Ï�èºíMß:ýAA¹˜ëºE÷çºß¬myõÃ¢‡·nÝ:Tïäü?M>Ž��O‚‹‘3Ð²ÎóP×¹Ÿ×>ÊÞ_UîC·ÎÉÉÉsq?0ÍCrº\NÞñï)~oùVün‘û’[ÿe\ðu®_v;Ó˜•cD™`x –^8U²¦±5Êc…—±¦æ‡Pf
ààààMƒÕoœã=:::åç6hY—E_Ö{SÆj«{Mµø“8===#Ž1"òµo½Qô¾ä÷4?Ž<Á­m²ø“Ðd `*  Ö‘}r�$¨.¿D™)€»wï¾™°þ3]¼Ïž=;q™ÿ/sª˜¶i;ñWüWÕ:þ5?&nSDÑ=tïÞ½›EïË<÷t›‰_ o/j¼  Úlý§ÖßMz ºHüªµT¯¾úê›ÊÀí2°Ó§OŸž6-¢¿‹Ä_7©çùN¾ 8%ñi!›P–_»öê›Å@¶ Ä/!š ÑŠÆ@  ³Öf€Ì�7Þ’ Jâ·Yd‹ ~¹¼h Ÿ£}ç�w‰=¸+õxøðá ¯‡¥ÉÄ_&¡ëÄ/ñäÉ“AÞûäöíÛA@‘{sumÍúí
ñKøçê­¢ã¼  ]&šwÝ_ù•_9ð¸Uä]Å¶E= þ ~ÓbõS‹ 8uõ°´�øË@ˆ¿ª,Óúþ½rêàJy?~œ"6—O_[�€yæãÏ“ø¾ð…/ï   –E8¸ÆÈž ov�ø#k©  ¸sçÎM’ŽøÏÜ<xpâoñWIj:1á‹¾3Gâ�e�Ü»wïí"÷¦:Ðaâ'‰±Š–÷ €ÎYÿy]aTùQ½.ÝÔ]%þ²àÕW_½Iìn\m\À;ï¼sRt ñ7Ÿøuð‰\W¨Oìñ ½k×®
äA€Óé´s®~Ãç7ÏØF0Ð8 Àb…CjÝÑht‹ç»öÈZ>Ï~y·åÕÒ\j¦«‡OïÜ¹s¨�|2ß_µæT‘Û;::òÆãñ$yß×Õ ÎÞ®û¨b?mmÉëñäøøØ÷€'îOùÝ©½d- ¾lz÷îðÔÿ-^r¶¦D3/Wë¿!yü…áŸß·cË1þ!¿ Xÿò9o
¤z šdñ—Mïª"ðÑ£G·V%ú4/šð¯e5À¬ó‹¿YyþEÖ×:udÜ3‘÷È¿×rydýÿ,ÐV‹?	>Vãà€ €p0¬{ppp«ŽTµºòÓ‹“|/o&ÀÝ»woû<®u~×·Ï²¬ö2åzAü‹'~¹ž(D‹Þ/÷îÝ»•çÞ\[]%eï­6¿ÄÑÑÑ­ºÆA  ËÖ?5­ó‡ø‡<øhT5ñWmÉ–%~‰¼q ×®]{Û`å;eøàT—
Øö=ó þyø©âûŸ��ÙR M÷Lôþk¯]Ë¸"ª ©ÏÑ&â}å+_yÛ2Öå	„  ³Â!Ïûô�þè�ŒM�ºDüEÀ`08¼sçÎÑÏ÷'­9ªyôž?~¦
 ³òü«üþ¢÷ƒñ^ÐÜ7±{éîÝ»Güž>Ãáx×××b€Ž¿<Æ·}02�c�‘ @+¬ÿ\ÿ²Þó<ï–JP]$þ"àñãÇ·ˆƒ›ßâ GGG±T@÷ˆ_ Ã2÷
<zôÈÙÀ;–iÔâWÇ¨¼ãZ‰1^ €Æ’?)àê²¹Ì¨®)Ý`žÛêÚŸº�Kž ßú— Oô�~Y</<0�Û6¿k¬Á2¿„¡°)0ù~ðÞ»ï¾ûŽëñ¯­¯Í­Ú_À›º±«àØ×”± ¨õæsr��F£·8Añ´¢¦Ùýåñ \»víIGÿ›ÚÿjÅ€/ ÎLäßâoú>š@üŠ 8³�¾-}4Êxýõ×œy@AŽ�%~‰Édr«ÈØ"oP Ö¿úš[©7Î�;¦$k€)²¬È¶erž] Ÿ‹½{÷îs’=ÿŸÔU¡KEmøÌ:esøËžç¶í#Ïy©ú<š¶ÞÕ:UkÈ¼ÿd- µn y÷ÝwŸó{o}cãb¦ X[uJì|qu�Äë)¨cÓ<'9×)2ö¢¦ < í¶þ…¥ûfÓªöUÝ}P.s�xôèÑmGò7"an÷™- p^�ù`ñWoñ'·988PË 'ï×ûˆ>zôÐÉ uÑâOâ­·Þz³Ì/ À2YÿÔq�àñ¿ñOýÁâi—‰?oC ;wî¼ã8h[ø÷ßØå–¼ þ?~<tˆVp÷î»w\Žam5Ý
¸kÄ/¾ÓÓßù�ßyšð¶e�…H„ €ppÝ/³Yg5ÀEd59
€k×®½“Ãò§¦Ç»ï¾d¸¤¶‰øç™£ßtâ—¸ÿþ™í^põ¼þúkN�€¼ª¥œè"ñKøßñ­E�‹ @§­ùz2™|'¸@½^'‰?ºE? ƒÁ3Ÿ¸�È?3°‹×†÷Ïí¤kÄ?Roñ=9==õÊÜ+òù½{÷x=€gÖ�TÜÇ¼PžÞ- o$Æ5x   r®oÝ�²Í[±®IÄŸÇ"Íò<|øð6Énú£[Nƒç¼@Ùj€ þf¿ÄÉÉÉYòº“´Û?I^F‘ððáV/ ïÀ‰¿Hà¶Á›Þªz¼‘C tÙú'y¬þð­—·\+Ö5‘øól›% îÜ¹sÛb¹étÓ<oðœ“C2`ëô/‚øËÊq]W Uö2HÞ$$ƒeïfÄ¬fôèÎÎÎÞÒ�Y%Æ?x  –Âú§.±<xGÐš@ü¶Á»¡de\»ví±çû»¾î÷ãããAÖ¹í2ñWM¶uˆ‰2Ç"< �8ìå¼w¢÷^ý5« à)€Ë" ?~üŽÃx—§8ˆ`)¬› öü÷ÿ÷yWÀÜM�ê$þ:ˆ)k
€Ï½ò9Xâæþ·YqÑ9>::*TÄ_ï>«<! ¨ÃýÐ#Ó ï½÷ž5€êràŸ‚ÑŸÿùŸß²�]Ç@x  –Âú'?úõ¯}¬öè"ñËe6ÀÃ‡ïÀ‰mÝgÏžt1 ËHüy]òM'~E 3D!É+ ?øàƒÛ¦cYÉÙÕ²­ðÏ÷­o|ãcbì«’àAä �E•/±ü�x°Mæ4@›‰_Âæ¸}ûö’áÒ·ˆ¢ìy�˜¤ XVâ¯š˜Mü‡‡‡g¢'Ž÷NÊðî»wïš>o}m9< ê˜ä2†-Ø @ T¦(ë°þuî³èùh4º™ì	Ð%â�¬'‹àµ×^»�q¾²‚“÷ Œ¤  ñ/Žøëò>pø×x¨¹gH†•ß³üéw^ÝèX]’ _ Ü´�Y$_Z`ÓÆl `®Ö¿õ3ƒÁ[U¤6•ø³:ž��Ý»wï9q�ÖÖø©åƒªˆr^-y»Hüu­/< ƒ"÷†M\¾÷Þ{Ïù=©û¼e‰‡·*$px  :iý»ÞäÄ0 Ï=zôf™TÀ¦d=¦ >|x—¤Ý±É�Ùe@��[ÿ¼ótüÿÙ;—¹�%»ýÿ—Þzë�„ïxaÍÅèÊW×$XÛFÐ£-5sº•¦šÊŒWF&“ä	@êî*V‹ÅâùâddäšÂ_+ŒGþócî ïFÈN%(XN!<÷Èº §Y G €»ãúO&ó÷\ûà  v—ýOŠ/‚øÅùá‡]^Øö&üç(9 ‹ñîbþE¶Æ|wñÿÉ®áß¦ðç\’O«>JSp¥Z’/~òäÉÓÜ>œ öÜhÏñÓO?=2&25×Jˆ7 `ÓÙ¿õuî}�¾þúëW···/5¼Z«xá—€üÊ\”sYw1ú¼Í³gÏÞyÞwÍ
þ¾ÛÿöÛoï2ß-	º%÷èT�ípî¸gà´Ð·ß~ûŠäéG½†  îâ¿ìcî àQM¶_+Î5­oµû–+t<�µžæ^“În” àÞs¼yóæö¯¿þºÅ’¼ûþS|üøñöîü¹eÎDfÏ»çÏŸÿï²àtîžÎá½ÀÝû{¤Èê#Š!Ø €Í¹5'sÑv¼ªÖö­o!LÑnÂÒXŒÿ[³’²“×¯_¿kÙ Â¿Þöë ¨Ï‹ðâÅ‹_—Ùÿyà=À‡’0s) i  †·ŽzdÿÓ§Løñe†¼¦ð×.„Sz|n&ÀÅøhöþýÔØ
Uþ±…ÿoß¾}¯8wÜ.À²ÀQÖ¸¹¹yd¸Îµr0  ØUöOŒ`�V®ûårÀšÂï�îñ\7À<€É�ýŸâ Q½  üëoùÙzÏá<;×Ü€£¬ðúõë_r×¨Šk\  Àî\köÏÞöôéÓÇçqò…ßs—º^Œÿk„_»ÀÒ½ÛïÀê¦V€zÎÑ‡ðëw 7FÑá‚/þ^Ö¥À‹/‰¬ºn‘o¥@dó €¡„¼Æ²š*^çóÏo¾ùæ ö*üç¸¾¾þüûÅø¿ö[Äÿïß[¯ áï/üçxûöí�ã{;¾Ç÷ê Ž°ÀéôÝwß=6|ç¬	’÷ºp  lÚ)˜¸ÑÏ?ÿüñööö±E`·$üçû.€Ç�kìË±ý"^¾|Ùd=€£¿µ½o¤ðŸãÓ: ®ó‚Ÿ{çâÓ‹~ GX`žçÇ>ü(@ÓDÈì ;õ.Sÿ–÷}øðá?\Àšsøk…ÿsuQð_…¹Ö$ÏåVÇy wÀÂïe¯ð·t´�;/÷ðý/
Ú?þñÿçèÖøøñãÈ6N?j1 â@ ÐÚ6jVüwù…9UßææÊïAø— ðiüÿuPF‘Ý…ÓüñGu@”kÐ*Ëee¾ÞûõêÕ«›ËÏ:øzr®ø¼.Àj N“1¾¥b@€€® â*þ»|Ž»ŒæßçluoÂ¿€OãÿÚ/.ç$îïO­b]5 kÿÚ;ªðŸãåË—ï-ç‚á<»ç:€#¬ðæÍ›_µ	ÙŠ €M¸½
U¾ør=yòä_wÙÆ©Çî„ÿ¼ÍõõõßeÆÿÕY=sûpïîÀŠÞ¿ß]ø[-ƒ{tá?ÇŸþùŽýôýü\pw¥ßÿýïïç^ãvþ[Ýµ×[  šyÔsDÙÿÒb7ôý÷ßÿ2šð×6ZnóÕW_Ý>{öì!3þo~qûÓz ç×iž?„Ÿª³éÅ: îsDŠSÀóçÏÞÜÜÜî](~üñÇ_´×+Â0ÀvDr/¶UÆÊ�èe]ù�³¼4-m—ÿ®2¿_Þv½¸ÿjñûÕâöëÂ}—ÿ4ÛxþM™¿sï!÷¾‰¾\íOlÙJr•òdül£.,G¹ ¥Àí’ÆÙ)l›2÷§Ì}Ü¿™¹íò¾ÛÅýób»è·ÊmJ¯Ÿ¿çÞÃò=ÎŠã•;¶$Ü§ùl¹ßÝçæÞ{8”â+0P‘6·ÿI?¶FJ1$Å}Úý,µÞÕŽ£NÊ/êäØ&e^cy[*ìKrž'	_¡Ðãa¹è§‚hhn‹üì¦Ìs•n›¿�DÆ–Æ…ëWÊüÎÝ–‚�Yé9­·# [µÿ½Ù¦vÊ�´|®¶Ï¾æñ-ª÷sžI9ÑŸ„íˆ¹(¥
 (èŽ‡õ6Iè“RüKŽAôõ)-¾7ÉùÝ›
Ï1	÷QAÜµ¢šíÉø^a�}€€UádRÜ&eòÚE9HÈ,¬/EBb„_“åK·iîã„l
:GŽ”á{ï³$…;ñÞ8!œ„s­Ì5�Ÿ„}ÊÁuÉÈ‰Î)@  víxšÿÔì‹Æ9�Ñ™„û´¯OÎ÷èÒœØsÙ‹Eð%±Ÿ5U¾ÿ#eü–Çxœ .Ë× 	ðPsíà²÷¤€vî»�s&E&/‰·EÜ%X¯ÍÈ €î`àíýoYÈFÛtC*ˆÓ¸ä
PÅóHY¼”½OLÖŸ”YLZ<¶t{	’ñ| \”B @Z’HkÄŸnK=�FT9‡@šï}*\'ñÖþÄwä0 Æû «dòšçˆr
4…:5Ï#eZ‘oy|•ÇässcŽD6ë•üÄW�PašQ¼ ÍÌ‰~"}e:Z§¡&sµ~5µ Rq¢E¼'ç÷��ê   › �šØÚL<Z ­¯IŠL_ªèç„Rdûš‹�æÂÆ]ð5Ÿ/²”8 H†Ç$Ãmšiiš‚@Ïþy…É
ë•j4cûÖÚdô €Ý¸¹/ªç¹½+ÝyãÐ^T¢[xj,ÆDú£ÒÅ&)³nè@ã ¤NçÕ3� ­	�f$‡{ ¹¿ö8xê¤kA` EÍ%D\s €.`à­f¯YM+'Ä“ðSz^«Ð×ÌÛ×fÿÜOmÆ±þXÇü“ãsÄ©N“s{í”@"yH€s´Ó£fXÀ T˜«ðO™¿KY?WP+Ì5ý  €æn@�ÕmŽ{<œ‡{ß
IìTÈàO�Ç®„p€7ão‘ÕŒà*¤A_§ÖHBö¾ÿ™ÎMÐÔD‚�¥‚¿äÔŠ¶vxAû~ZÖ  "Þ#ï§v¾>Þj¯ —ªø¥J}OÖ_º°$å{Ôv
ä.ÌÒg2ªPîÙÐÀ@2üÔŒÿÏ7@šjh…›šëŽ4¦-à“šmEœp ÚH�¥n­Ò�ìWo½h—DV[Ø§É<ÒÂ	°|ys6&¡`4Qn¼#^=Ýµãù\f?;²}íP)à¡õù¡ÍÎs¢o}> vïH€QúQŽCTöŸ»�•Šö¤Ìž{3ñ}Ë­Ù¿VôSçóèhn@ds mw@"ý í¢7$ÜGÄO/låxöj¶ã…€ €M‚AË~÷bÞsŸ¤éyÜ6ÒØ~)ûçj–ân±ý5–¿TÄ¸Ö9±wá�,ÌeâR‘à¬�¥c@äkHÔK£fD_ßP Ø½SP-÷?)³èIñ{)ãöÍôe?®Ú¿ÔÓÜ"ú7  >ÛÓdÈVK^kók—¿åÉÁˆ,lÑŒ§§Cð ÃŠ|‹ÀÚm<ÙzIÐKÛ•*ù9Á'’W
;gÿ5û¯]ˆ»½fi_¬þ7(Dpâm�€™ÉìkÖ!°F!h¦å¶h	8  À=èøüšL~.jÜÜüsX¬�ÛÀ-¼|mÍ¤Ö�A >Bßr� �8{êf…C@dï9-î½„B Ø´ÈŽ¶ÿVK_“±sUüÜœýåíRÆ¯u rÓü,ãþÉ(Þši‹ˆñÀ¡G=€eH`é hz� ¹}³8 -‡¶.î‡…8 û •D¾©kÚ9ýÒß¥ùÒW…Œÿü÷åíWÂþ]ÄYú»FøÓ Ÿ÷²þÖ  -$FÄçÌýsÆXþÍ¹š÷e�€5>dý  ;é¦üygh§½iøj*¤/«óKÓýJÀåÏé–û7g²|nìŸ«l!ü5µˆºãµN ‘}‘ 9’À5²JïÇLÞì_3­½   »ÍÆ×ž"èMG¾Ò0ÀT¸M…LŸ.Ä~ù“H7ÏÙÒWÛŽ´ä\xÎ¬ÖéƒÚ‚@mÑ^"ÛÌ€™ä)…€h~náœŒZ.®  +¬Ñi/Rì5ýÒß“paâD¿d÷_îÏ¥ µž
s™¿w9`íýˆ±@@#�V×‹ë˜«˜Ð6²î§5ë_¬Û@è »rJÙ¹å1\×;©˜¯d§Ý·ú“ð¼SFô‰�ƒ¥íŸs 4ãý¹÷Î­pæù\qÑ<}õ­n@)#/eùTÿ”��«0_å v  €ðâÇ	µ”ñh­üÜEŽëº'üå«ýµ¶n	ä‰ÊË—r]Í´ŽVÛxÚëZ×ðö(ý=“¾îÀÚ„ˆ{?Ò1oÑ¥ À�äÅi,N�”sNAÉö?_˜®‰/ü[^–…}9û?g÷s¶Nøs?¹ì_tTìï´Ý-  âËì?)�€œÐÎ‚Ã`™9`þˆp 
  D¥¨kÀ@Z‰O3÷_Ê6&FðK™?eD™ùsv¿”ý—„ßbù[gm ö %ÁJŽï‰Ö	ÐÀÀÌ �Öm� !)²}Ëñ†à Ù»gr
>Qy€kæ³üÜ8¿d÷_2ÿ\Æ¿ûR¥¿VÜÇË2¼RÖoufÒÌ$x€Äžãá"   «Dt;]‹ÐK½ù¥¾úR†Ãuîã.jž9þ—b¿ŒK  h2MÑŸæ3ž=‡ â±ÏW3àq4ÙúL|÷@K¯ IÜ5@ �oëåšmµß;À  yf.mï±ñ#Ÿ	­à/E>ç,«÷‰ò�|rÙ?÷¯Dåö¾“Bøaû&< `q¼Â¯È¹3ñ3Jn)ÞƒEŒkíÿTñyÁi  ì <?¿¼®¸¬>)¶%rÅ~\‹ßX*þ½™‹¥–ãºžeƒ5bi]Ø''öD¶z �`mqckW Ø¥KÐÓ	(AAiv WõÌ�ý—  Tì—sˆÊÓý¤1"ÞÊe¬@±îEßSP3±|°f½ íó[¡¥wæ8   2÷IÅ|ÜzÛ¥†<ÙÆö9«¿–b¿ó{º"¾Ëß$dùÒý#€ b}°°Ž]k³åHí~¥âÀ’+ ™-@ä+ÔÜFä+$„ˆ ‘é×¾·H�4ïŸˆ_¢7
Kq×Ìëç¦ú�Þ^lOÌŠl_›ýGŒûöå&D÷ð´¶¬Hñ'âkJÂN¤›>HŠçXCì €]Á…¦ÃŸ¥¥mR‚‚u^ÿ¥¥¿û’õÏûå¬ÿDöÂ?dÿˆZ@ïê�Úâ@kÓ )Ó¯×·v„H  èŽÇ”\€ÒÁR[ßšÛJY>gû•­©ê_šòWvdÿˆµ] ²kk- ~Ü«­/ÝFôH …¬ pX(àÚójj¸½Rv/‰úRÌ¥Jÿ¥èsÖ?Qye?iÎ?Q\ñD0PãpbO¤oÄ9Ú¡ Í0€fØ@jA¬í(èY›ë
  6Ÿ½K�×ûi3~RºDü‚8Òj}š"¿Ò8ÿÒú'º_�+ü+Á@Mö_»\3€`_‚¯šš‰ø†9sAü´ËÉCZ0ÐÎ\Ð¸"GÀóÙ¤†ç Ð,�{ˆÊ‹Ýp?s«óIâÏ-Ñ›
¢ù·4Å/gýÏ‘¿¼�Ëþ-  îH �0Ž¸G: €áäši—Ž®˜…eUAÍq‰ø|!ê €Ý¸V·Àò³Ë%zkD*¸9 âÛý&cö/µò­u  òûƒƒˆ9î’ØI?¹‚ÀKQç²~é‰|bßR¬!ü €Mˆ»dÛç2rIìÉá“ñ—€L…msÛœßÏ-ù
ÿÈ˜ýK€å3ÜºØO¾Gqj–Ð%&ã/eÛG@[¨íH$X²­ý¯ÿG£  Àn2}kç¾x] n(€°zÍ?)ãŸ„Ì^;Ý¯Vø­Ÿ+�í‰»e{Kú$ˆœF0#Ö°ˆ„µïY:¹•pCô Ã‚BTÛ_­@…L_#ìW±ÏUø_öõçºüq¿ 8ño¹ÊDþXp ~I%€ÈÞ.x	–™V—€{möhv À&ÄÞ#òD¶Î~5‚Ú‹£”õG6÷±ÚÿÂ¿¦¨(ÆÍâ’ño‹ eþÔ:³óq5Ù¿Åþ·~F€ €+“ný8M&/	A*†Åà
‰tcù¥Œ_Ó×.ˆ~RÀ€ÇÐmÄç	ß?@´h¤]4ˆH_�Ëú-Ž€4íPÊðµÙ¿FèSÃÌup V‰(±º %ñJñ·ô]öånË� œ ¬Ù?Zý"Z	Et«`Iô‰b‹µ-†Ixî9 û_à €î0 �ÎG$7î)=ÎKÑÏA€wŒ?jIßˆìŸ{²z„UÜµÛz] É°¶&âk<õš×–@ÇRýosˆ> `(Ðtô®@Tî¨¦ÂmË1þI Rüî™æçéò ÑÊ°¸ Z °Ö	hjroNè¥†GÞco™q�  ¬šé×>§Ç(m?‘Ü
¸$þDyk¹ï—¢Ïý-% ðfÿp µ€×Ð €fiakã m�_Iü¹}ä Å
4­³xÀ  ‰x×h—ïÕ¸ 9A»,âËMÌ‰?-2û\–O”÷×Nó‹ìò‡ìÑC,"[×tŒ˜2¨™îWr
,…‚–c^»lpíjƒˆåE2¥}Çišj/úVÒ.\#Yáš1ôåmWÎûsM{ˆ¹_º�˜,r+î¸c¡DO@+>žEƒˆìóí=3´Ë“ó~Kö_*ˆÔ+Ëqw�{ÑÁ£; -¬üˆ×ç\ ÏP@É˜.² iúáåÇùKˆ)9ë¹}R €tŸFÔ[uDl_ì#� OÇÀÈÁRÖ¯… í2ÀVë¿Eö¿ö¹`Àž] Êdï¥Û¥ìýJù8"[COæoíóoqˆ<Â#îV'€˜L^ãHÙ¿Õ�2x®Æ@ZApWÙÿ'  ¢» ñi¦.Ÿ™×¿Ê8‰øyþ9G  $Ñ�ÌæýH× r(€ÈW$¨±æ5cû^ø(½‡-dÿ‡8 u€Ç�ÓâôØ†È7¿ß:·?"ëÇ ˆø˜È¢@2ˆ¼$¸7 Å6šý¦€ì  @ ½!€´h†´@T°Z÷Ï³°O”í/mQGÔÂBMa $öD¶þûVg ²–À"$8šãÑMü  € Ðº ^‘µ
üU…«`�"ÿ¢>­*þˆZ§ õÌ )3¶ŠlÄ¢CD¶Ž~^ñ·;   `U ˆt,YtÔng)û�Èú½óüˆq·:–&ADþÂ’×Žå[Š%÷¢Eö   „À.@+ðnkmçÛ£ÒâŽè	5ZÐdûAo%þ[Íþ ;€h@³àŒ§¯½§˜N“á[²|‹Ð×TùKÛ[³x  b— bÍ X×Ðº‡€‰¿%û�€{�   j] 	´Eq5 eøZ�²ø)Hü­àñGŒÑk”„U#î±¶ÖXÄ?w;w›ö87Ëþ  €5\ /”²{�³`"Ûê}½Äßûù!Í$¬«z…_ÚLßó>ÖÌþ  €]€–Ðò1œ‹¡}¯=Ä¢�è	ð¢v:�Uø#)þ]³    …`Æ ²ÍË·Œç{‹û¦ ã¹–è&ö�ÁG>¯'[µhÅWqíO¯ø[Agˆì °_ XÛhZA÷t'ä²}Í±ˆhò£=¶rDk�o½„mRl§S·vÝóöêo-þÝ³   À* 5C’˜zZ/·©™¶çÍ±™Ž51"@D6òjí´B¯Ë Ý/­óáq   €¦  ¹ ÐÞî™r•Õ·hêcB	=E ]î•€ Vìj…·Ö-ðìƒåvíqK­Î À~`ÀšŒ¼vš¡VØ'åýµ¢ïýÌ êˆµ`!9Ÿ«Æö¶«eŠ¡÷6K†_ký7Ëþ  €.€U@#Ü +XÀÄûž­ŸD±8ˆX@H#ø50V�·Š×ì ° j3pÏðBÔ½žñþQšû ,�Å÷x=ÏúÞ–¸–lÝ:„@T?ŸHñ   jD£x2/TX?’ Úˆ=Â„WÜ<õ5bíéÝßCü  € Ø2Ôw­¥ßËî�¬@ z‹ÍtAÏ°€Eô#€ÀÛË`xñ   j!À’åzmõÚÌ?,‚ßªÂ €ØJöï¶Öu^'ÀêNXÞ§Å   \ 0‚ Q«iåOÎ}õãVÛ"k@@Í¶Öá �øÖ¿‘âß-û   Ö†€Z¡öÎ4ð¼Gì±ªÀà›^=}Nóü©ò5F   `hˆp´ !ö5 ql›ŸFÐ®Ýgè#¼f¤€FB�§þÀ’õ)þ   @kèá”¶©úÈ&>SÇÏ�j„.jæ@IÌ£ó¤€÷Ÿ:~& €ƒÀˆ™¡·Ã�Êô±¨bÏ.C
z�Z+�ò�ˆ„Ÿ´Öç 8 ljAÀÑ™ÿpqL‘eß¢� �è{„â   ´’ˆÂ¹–cö½Wê›ø¬ˆ52úN€FÀ{¿×¡    ºÀšàÞÈ¬½¶²kY? ¾'7@Øˆb<ÏóZ&�ð9 Ž [€ kÆ^Öýoq|!Öˆ=BE
~�Z;Þ²}MGÄ¡Å   è	‘ Ð< ÐC°ˆ½;)èöž�àþ¡Ä   h)0­Ä´e]uÚgðŸ)·¯ï-   @w XZ‰êÈE}¨@ì![o±/kö€•4êç   ô…– P+ê½Šù ºÀHüsµ²êGþ°ç   F€€– à}_èà‡@Œ‘ÓS‡ç^ü  €5„­´x®h(A  ì±Â9þ>¢ð‡??   °–hÕdØ[Èè!üD;aìéŒ üM^   X[Àzƒ€å±£‹8 1¤°¬°©Ñó§AŽ]“×   F˜©ñý-Þ/�è/n©ÃkŽ"üM_   Mä"2óiÐã `@@Ð×½QO<–   Àæ„+²ÉÎ4Ø># „1^'¶Ï]_   Ø´Ü–ßÄ^D»Çþ¥Áßw·×   ¶$LÓ`Û#ˆñr�ƒM€   °ÕìtZa¿Äø"˜VxÍÍ‰?   °¨Ý�iÇÇ�Ø“°G?gÚñq   -ö	BŽ@ìG ÓŽß    Xaß 	Ä˜˜ú¾   €À†ö�€xïSè‡ÞW    ¢AF  žÜw    bŠ÷†@@øÞ    ˆ%Žá>à±    vq@(    qÑ    qPá    q0Ñ    q@Ñ    q0Á    q@Á    b�     B 8NüŸ  ¤‘Õª#�    IEND®B`‚/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

* {
    -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */
}

body {
    -webkit-touch-callout: none;                /* prevent callout to copy image, etc when tap to hold */
    -webkit-text-size-adjust: none;             /* prevent webkit from resizing text to fit */
    -webkit-user-select: none;                  /* prevent copy paste, to allow, change 'none' to 'text' */
    background-color:#E4E4E4;
    background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
    background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
    background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
    background-image:-webkit-gradient(
        linear,
        left top,
        left bottom,
        color-stop(0, #A7A7A7),
        color-stop(0.51, #E4E4E4)
    );
    background-attachment:fixed;
    font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif;
    font-size:12px;
    height:100%;
    margin:0px;
    padding:0px;
    text-transform:uppercase;
    width:100%;
}

/* Portrait layout (default) */
.app {
    background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */
    position:absolute;             /* position in the center of the screen */
    left:50%;
    top:50%;
    height:50px;                   /* text area height */
    width:225px;                   /* text area width */
    text-align:center;
    padding:180px 0px 0px 0px;     /* image height is 200px (bottom 20px are overlapped with text) */
    margin:-115px 0px 0px -112px;  /* offset vertical: half of image height and text area height */
                                   /* offset horizontal: half of text area width */
}

/* Landscape layout (with min-width) */
@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) {
    .app {
        background-position:left center;
        padding:75px 0px 75px 170px;  /* padding-top + padding-bottom + text area = image height */
        margin:-90px 0px 0px -198px;  /* offset vertical: half of image height */
                                      /* offset horizontal: half of image width and text area width */
    }
}

h1 {
    font-size:24px;
    font-weight:normal;
    margin:0px;
    overflow:visible;
    padding:0px;
    text-align:center;
}

.event {
    border-radius:4px;
    -webkit-border-radius:4px;
    color:#FFFFFF;
    font-size:12px;
    margin:0px 30px;
    padding:2px 0px;
}

.event.listening {
    background-color:#333333;
    display:block;
}

.event.received {
    background-color:#4B946A;
    display:none;
}

@keyframes fade {
    from { opacity: 1.0; }
    50% { opacity: 0.4; }
    to { opacity: 1.0; }
}
 
@-webkit-keyframes fade {
    from { opacity: 1.0; }
    50% { opacity: 0.4; }
    to { opacity: 1.0; }
}
 
.blink {
    animation:fade 3000ms infinite;
    -webkit-animation:fade 3000ms infinite;
}
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

/*
    this file is found by cordova-lib when you attempt to
    'cordova platform add PATH' where path is this repo.
*/
const path = require('path');
const fs = require('fs-extra');
const CordovaCommon = require('cordova-common');
const CordovaLogger = CordovaCommon.CordovaLogger;
// const ConfigParser = CordovaCommon.ConfigParser;
const ActionStack = CordovaCommon.ActionStack;
const selfEvents = CordovaCommon.events;
// const xmlHelpers = CordovaCommon.xmlHelpers;
const PlatformJson = CordovaCommon.PlatformJson;
const PlatformMunger = CordovaCommon.ConfigChanges.PlatformMunger;
const PluginInfoProvider = CordovaCommon.PluginInfoProvider;

const Parser = require('./parser');

function setupEvents (externalEventEmitter) {
    if (externalEventEmitter) {
        // This will make the platform internal events visible outside
        selfEvents.forwardEventsTo(externalEventEmitter);
        return externalEventEmitter;
    }

    // There is no logger if external emitter is not present,
    // so attach a console logger
    CordovaLogger.get().subscribe(selfEvents);
    return selfEvents;
}

class Api {
    constructor (platform, platformRootDir, events) {
        this.platform = 'electron';

        // MyApp/platforms/electron
        this.root = platformRootDir || path.resolve(__dirname, '..');
        this.events = setupEvents(events);
        this.parser = new Parser(this.root);
        this.handler = require('./handler');

        this.locations = {
            platformRootDir: platformRootDir,
            root: this.root,
            www: path.join(this.root, 'www'),
            res: path.join(this.root, 'res'),
            platformWww: path.join(this.root, 'platform_www'),
            configXml: path.join(this.root, 'config.xml'),
            defaultConfigXml: path.join(this.root, 'cordova/defaults.xml'),
            build: path.join(this.root, 'build'),
            buildRes: path.join(this.root, 'build-res'),
            cache: path.join(this.root, 'cache'),
            // NOTE: Due to platformApi spec we need to return relative paths here
            cordovaJs: 'bin/templates/project/assets/www/cordova.js',
            cordovaJsSrc: 'cordova-js-src'
        };

        this._platformJson = PlatformJson.load(this.root, this.platform);
        this._pluginInfoProvider = new PluginInfoProvider();
        this._munger = new PlatformMunger(this.platform, this.root, this._platformJson, this._pluginInfoProvider);
    }

    getPlatformInfo () {
        return {
            locations: this.locations,
            root: this.root,
            name: this.platform,
            version: require('./version'),
            projectConfig: this.config
        };
    }

    prepare (cordovaProject, options) {
        return require('./lib/prepare').prepare.call(this, cordovaProject, options);
    }

    addPlugin (pluginInfo, installOptions) {
        if (!pluginInfo) {
            return Promise.reject(new Error('The parameter is incorrect. The first parameter should be valid PluginInfo instance'));
        }

        installOptions = installOptions || {};
        installOptions.variables = installOptions.variables || {};
        // CB-10108 platformVersion option is required for proper plugin installation
        installOptions.platformVersion = installOptions.platformVersion ||
            this.getPlatformInfo().version;

        const actions = new ActionStack();

        let platform = this.platform;
        if (!pluginInfo.getPlatformsArray().includes(platform)) { // if `cordova-electron` is not defined in plugin.xml, `browser` is used instead.
            platform = 'browser';
        }

        // gather all files needs to be handled during install
        pluginInfo.getFilesAndFrameworks(platform)
            .concat(pluginInfo.getAssets(platform))
            .concat(pluginInfo.getJsModules(platform))
            .forEach((item) => {
                actions.push(actions.createAction(
                    this._getInstaller(item.itemType),
                    [item, pluginInfo.dir, pluginInfo.id, installOptions],
                    this._getUninstaller(item.itemType),
                    [item, pluginInfo.dir, pluginInfo.id, installOptions]));
            });

        // run through the action stack
        return actions.process(platform, this.root)
            .then(() => {
                // Add PACKAGE_NAME variable into vars
                if (!installOptions.variables.PACKAGE_NAME) {
                    installOptions.variables.PACKAGE_NAME = this.handler.package_name(this.root);
                }

                this._munger
                    // Ignore passed `is_top_level` option since platform itself doesn't know
                    // anything about managing dependencies - it's responsibility of caller.
                    .add_plugin_changes(pluginInfo, installOptions.variables, /* is_top_level= */true, /* should_increment= */true)
                    .save_all();

                const targetDir = installOptions.usePlatformWww ? this.getPlatformInfo().locations.platformWww : this.getPlatformInfo().locations.www;

                this._addModulesInfo(platform, pluginInfo, targetDir);
            });
    }

    removePlugin (plugin, uninstallOptions) {
        uninstallOptions = uninstallOptions || {};
        // CB-10108 platformVersion option is required for proper plugin installation
        uninstallOptions.platformVersion = uninstallOptions.platformVersion || this.getPlatformInfo().version;

        const actions = new ActionStack();

        let platform = this.platform;
        if (!plugin.getPlatformsArray().includes(platform)) { // if `cordova-electron` is not defined in plugin.xml, `browser` is used instead.
            platform = 'browser';
        }

        // queue up plugin files
        plugin.getFilesAndFrameworks(platform)
            .concat(plugin.getAssets(platform))
            .concat(plugin.getJsModules(platform))
            .forEach((item) => {
                actions.push(actions.createAction(
                    this._getUninstaller(item.itemType), [item, plugin.dir, plugin.id, uninstallOptions],
                    this._getInstaller(item.itemType), [item, plugin.dir, plugin.id, uninstallOptions]));
            });

        // run through the action stack
        return actions.process(platform, this.root)
            .then(() => {
                this._munger
                    // Ignore passed `is_top_level` option since platform itself doesn't know
                    // anything about managing dependencies - it's responsibility of caller.
                    .remove_plugin_changes(plugin, /* is_top_level= */true)
                    .save_all();

                var targetDir = uninstallOptions.usePlatformWww ?
                    this.getPlatformInfo().locations.platformWww :
                    this.getPlatformInfo().locations.www;

                this._removeModulesInfo(plugin, targetDir);
                // Remove stale plugin directory
                // @todo this should be done by plugin files uninstaller
                fs.removeSync(path.resolve(this.root, 'Plugins', plugin.id));
            });
    }

    _getInstaller (type) {
        return (item, plugin_dir, plugin_id, options, project) => {
            const installer = this.handler[type];

            if (!installer) {
                this.events.emit('warn', `Unrecognized type "${type}"`);
            } else {
                const wwwDest = options.usePlatformWww ?
                    this.getPlatformInfo().locations.platformWww :
                    this.handler.www_dir(this.root);
                if (type === 'asset') {
                    installer.install(item, plugin_dir, wwwDest);
                } else if (type === 'js-module') {
                    installer.install(item, plugin_dir, plugin_id, wwwDest);
                } else {
                    installer.install(item, plugin_dir, this.root, plugin_id, options, project);
                }
            }
        };
    }

    _getUninstaller (type) {
        return (item, plugin_dir, plugin_id, options, project) => {
            const installer = this.handler[type];

            if (!installer) {
                this.events.emit('warn', `electron plugin uninstall: unrecognized type, skipping : ${type}`);
            } else {
                const wwwDest = options.usePlatformWww ?
                    this.getPlatformInfo().locations.platformWww :
                    this.handler.www_dir(this.root);

                if (['asset', 'js-module'].indexOf(type) > -1) {
                    return installer.uninstall(item, wwwDest, plugin_id);
                } else {
                    return installer.uninstall(item, this.root, plugin_id, options, project);
                }

            }
        };
    }

    /**
     * Removes the specified modules from list of installed modules and updates
     *   platform_json and cordova_plugins.js on disk.
     *
     * @param   {PluginInfo}  plugin  PluginInfo instance for plugin, which modules
     *   needs to be added.
     * @param   {String}  targetDir  The directory, where updated cordova_plugins.js
     *   should be written to.
     */
    _addModulesInfo (platform, plugin, targetDir) {
        let installedModules = this._platformJson.root.modules || [];

        const installedPaths = installedModules.map((installedModule) => installedModule.file);

        let modulesToInstall = plugin.getJsModules(platform)
            .filter((moduleToInstall) => installedPaths.indexOf(moduleToInstall.file) === -1)
            .map((moduleToInstall) => {
                const moduleName = plugin.id + '.' + (moduleToInstall.name || moduleToInstall.src.match(/([^\/]+)\.js/)[1]);
                let obj = {
                    file: ['plugins', plugin.id, moduleToInstall.src].join('/'),
                    id: moduleName,
                    pluginId: plugin.id
                };

                if (moduleToInstall.clobbers.length > 0) {
                    obj.clobbers = moduleToInstall.clobbers.map((o) => o.target);
                }

                if (moduleToInstall.merges.length > 0) {
                    obj.merges = moduleToInstall.merges.map((o) => o.target);
                }

                if (moduleToInstall.runs) {
                    obj.runs = true;
                }

                return obj;
            });

        this._platformJson.root.modules = installedModules.concat(modulesToInstall);
        if (!this._platformJson.root.plugin_metadata) {
            this._platformJson.root.plugin_metadata = {};
        }

        this._platformJson.root.plugin_metadata[plugin.id] = plugin.version;
        this._writePluginModules(targetDir);
        this._platformJson.save();
    }

    /**
     * Fetches all installed modules, generates cordova_plugins contents and writes
     *   it to file.
     *
     * @param   {String}  targetDir  Directory, where write cordova_plugins.js to.
     *   Ususally it is either <platform>/www or <platform>/platform_www
     *   directories.
     */
    _writePluginModules (targetDir) {
        // Write out moduleObjects as JSON wrapped in a cordova module to cordova_plugins.js
        const final_contents = `cordova.define('cordova/plugin_list', function (require, exports, module) {
            module.exports = ${JSON.stringify(this._platformJson.root.modules, null, '    ')};

            module.exports.metadata =
            // TOP OF METADATA
            ${JSON.stringify(this._platformJson.root.plugin_metadata || {}, null, '    ')}
            // BOTTOM OF METADATA
        });`;

        fs.ensureDirSync(targetDir);
        fs.writeFileSync(path.join(targetDir, 'cordova_plugins.js'), final_contents, 'utf-8');
    }

    /**
     * Removes the specified modules from list of installed modules and updates
     *   platform_json and cordova_plugins.js on disk.
     *
     * @param   {PluginInfo}  plugin  PluginInfo instance for plugin, which modules
     *   needs to be removed.
     * @param   {String}  targetDir  The directory, where updated cordova_plugins.js
     *   should be written to.
     */
    _removeModulesInfo (plugin, targetDir) {
        const installedModules = this._platformJson.root.modules || [];
        const modulesToRemove = plugin.getJsModules(this.platform)
            .map((jsModule) => ['plugins', plugin.id, jsModule.src].join('/')); /* eslint no-useless-escape : 0 */

        const updatedModules = installedModules
            .filter((installedModule) => modulesToRemove.indexOf(installedModule.file) === -1);

        this._platformJson.root.modules = updatedModules;

        if (this._platformJson.root.plugin_metadata) {
            delete this._platformJson.root.plugin_metadata[plugin.id];
        }

        this._writePluginModules(targetDir);
        this._platformJson.save();
    }

    build (buildOptions) {
        return require('./lib/build').run.call(this, buildOptions, this);
    }

    run (runOptions) {
        return require('./lib/run').run(runOptions);
    }

    clean (cleanOptions) {
        return require('./lib/clean').run(cleanOptions);
    }

    requirements () {
        return require('./lib/check_reqs').run();
    }
}
// @todo create projectInstance and fulfill promise with it.
Api.updatePlatform = () => Promise.resolve();

Api.createPlatform = function (dest, config, options, events) {
    events = setupEvents(events);

    let name = config ? config.name() : 'HelloCordova';
    let id = config ? config.packageName() : 'io.cordova.hellocordova';

    try {
        // we create the project using our scripts in this platform
        return require('../../lib/create').createProject(dest, id, name, options).then(() => new Api(null, dest, events));
    } catch (e) {
        events.emit('error', 'createPlatform is not callable from the electron project API.');
    }
};

module.exports = Api;
#!/usr/bin/env node

/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const argv = require('nopt')({
    help: Boolean
}, {
    help: ['/?', '-h', 'help', '-help', '--help', '/help']
});

argv.binPath = process.argv[1];

const build = require('./lib/build');

if (argv.help) {
    build.help(argv);
    process.exit(0);
}

build.run(argv);
:: Licensed to the Apache Software Foundation (ASF) under one
:: or more contributor license agreements.  See the NOTICE file
:: distributed with this work for additional information
:: regarding copyright ownership.  The ASF licenses this file
:: to you 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.

@ECHO OFF
SET script_path="%~dp0build"
IF EXIST %script_path% (
        node %script_path% %*
) ELSE (
    ECHO.
    ECHO ERROR: Could not find 'build' script in 'cordova' folder, aborting...>&2
    EXIT /B 1
)
#!/usr/bin/env node

/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const argv = require('nopt')({
    help: Boolean
}, {
    help: ['/?', '-h', 'help', '-help', '--help', '/help']
});

argv.binPath = process.argv[1];

const clean = require('./lib/clean');

if (argv.help) {
    clean.help(argv);
    process.exit(0);
}

clean.run(argv);
:: Licensed to the Apache Software Foundation (ASF) under one
:: or more contributor license agreements.  See the NOTICE file
:: distributed with this work for additional information
:: regarding copyright ownership.  The ASF licenses this file
:: to you 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.

@ECHO OFF
SET script_path="%~dp0clean"
IF EXIST %script_path% (
        node %script_path% %*
) ELSE (
    ECHO.
    ECHO ERROR: Could not find 'clean' script in 'cordova' folder, aborting...>&2
    EXIT /B 1
)
<?xml version='1.0' encoding='utf-8'?>
<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
-->
<widget id="io.cordova.hellocordova" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
</widget>
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const path = require('path');
const fs = require('fs-extra');
const events = require('cordova-common').events;

module.exports = {
    www_dir: (project_dir) => path.join(project_dir, 'www'),
    package_name: (project_dir) => {
        // this method should the id from root config.xml => <widget id=xxx
        // return common.package_name(project_dir, this.www_dir(project_dir));
        // console.log('package_name called with ' + project_dir);
        let pkgName = 'io.cordova.hellocordova';
        const widget_id_regex = /(?:<widget\s+id=['"])(\S+)(?:['"])/;
        const configPath = path.join(project_dir, 'config.xml');

        if (fs.existsSync(configPath)) {
            const configStr = fs.readFileSync(configPath, 'utf8');
            const res = configStr.match(widget_id_regex);

            if (res && res.length > 1) {
                pkgName = res[1];
            }
        }

        return pkgName;
    },
    'js-module': {
        install: (jsModule, plugin_dir, plugin_id, www_dir) => {
            // Copy the plugin's files into the www directory.
            const moduleSource = path.resolve(plugin_dir, jsModule.src);
            // Get module name based on existing 'name' attribute or filename
            // Must use path.extname/path.basename instead of path.parse due to CB-9981
            const moduleName = plugin_id + '.' + (jsModule.name || path.basename(jsModule.src, path.extname(jsModule.src)));

            // Read in the file, prepend the cordova.define, and write it back out.
            let scriptContent = fs.readFileSync(moduleSource, 'utf-8').replace(/^\ufeff/, ''); // Window BOM

            if (moduleSource.match(/.*\.json$/)) {
                scriptContent = `module.exports =  + ${scriptContent}`;
            }

            scriptContent = `cordova.define('${moduleName}', function (require, exports, module) {
                ${scriptContent}
            });`;

            const moduleDestination = path.resolve(www_dir, 'plugins', plugin_id, jsModule.src);

            fs.ensureDirSync(path.dirname(moduleDestination));
            fs.writeFileSync(moduleDestination, scriptContent, 'utf-8');
        },
        uninstall: (jsModule, www_dir, plugin_id) => {
            fs.removeSync(path.join(www_dir, 'plugins', plugin_id));
            const pluginRelativePath = path.join('plugins', plugin_id, jsModule.src);
            // common.removeFileAndParents(www_dir, pluginRelativePath);
            events.emit('verbose', `js-module uninstall called : ${pluginRelativePath}`);
        }
    },
    'source-file': {
        install: (obj, plugin_dir, project_dir, plugin_id, options) => {
            // var dest = path.join(obj.targetDir, path.basename(obj.src));
            // common.copyFile(plugin_dir, obj.src, project_dir, dest);
            events.emit('verbose', 'source-file.install is currently not supported for electron');
        },
        uninstall: (obj, project_dir, plugin_id, options) => {
            // var dest = path.join(obj.targetDir, path.basename(obj.src));
            // common.removeFile(project_dir, dest);
            events.emit('verbose', 'source-file.uninstall is currently not supported for electron');
        }
    },
    'header-file': {
        install: (obj, plugin_dir, project_dir, plugin_id, options) => {
            events.emit('verbose', 'header-file.install is not supported for electron');
        },
        uninstall: (obj, project_dir, plugin_id, options) => {
            events.emit('verbose', 'header-file.uninstall is not supported for electron');
        }
    },
    'resource-file': {
        install: (obj, plugin_dir, project_dir, plugin_id, options) => {
            events.emit('verbose', 'resource-file.install is not supported for electron');
        },
        uninstall: (obj, project_dir, plugin_id, options) => {
            events.emit('verbose', 'resource-file.uninstall is not supported for electron');
        }
    },
    'framework': {
        install: (obj, plugin_dir, project_dir, plugin_id, options) => {
            events.emit('verbose', 'framework.install is not supported for electron');
        },
        uninstall: (obj, project_dir, plugin_id, options) => {
            events.emit('verbose', 'framework.uninstall is not supported for electron');
        }
    },
    'lib-file': {
        install: (obj, plugin_dir, project_dir, plugin_id, options) => {
            events.emit('verbose', 'lib-file.install is not supported for electron');
        },
        uninstall: (obj, project_dir, plugin_id, options) => {
            events.emit('verbose', 'lib-file.uninstall is not supported for electron');
        }
    },
    asset: {
        install: (asset, plugin_dir, wwwDest) => {
            const src = path.join(plugin_dir, asset.src);
            const dest = path.join(wwwDest, asset.target);
            const destDir = path.parse(dest).dir;

            if (destDir) fs.ensureDirSync(destDir);
            fs.copySync(src, dest);
        },
        uninstall: (asset, wwwDest, plugin_id) => {
            fs.removeSync(path.join(wwwDest, asset.target));
            fs.removeSync(path.join(wwwDest, 'plugins', plugin_id));
        }
    }
};
#!/usr/bin/env node

/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

console.log('cordova/log');
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const fs = require('fs-extra');
const path = require('path');
const CordovaError = require('cordova-common').CordovaError;
const events = require('cordova-common').events;
const FileUpdater = require('cordova-common').FileUpdater;

function dirExists (dir) {
    return fs.existsSync(dir) && fs.statSync(dir).isDirectory();
}

class Parser {
    constructor (project) {
        if (!dirExists(project) || !dirExists(path.join(project, 'cordova'))) {
            throw new CordovaError(`The provided path "${project}" is not a valid electron project.`);
        }

        this.path = project;
    }

    update_from_config () {
        return Promise.resolve();
    }

    www_dir () {
        return path.join(this.path, 'www');
    }

    // Used for creating platform_www in projects created by older versions.
    // cordovajs_path (libDir) {
    //     return path.resolve(path.join(libDir, 'cordova-lib', 'cordova.js'));
    // }

    // cordovajs_src_path (libDir) {
    //     return path.resolve(path.join(libDir, 'cordova-js-src'));
    // }

    // Replace the www dir with contents of platform_www and app www.
    update_www (cordovaProject, opts) {
        const platform_www = path.join(this.path, 'platform_www');
        const my_www = this.www_dir();
        // add cordova www and platform_www to sourceDirs
        let sourceDirs = [
            path.relative(cordovaProject.root, cordovaProject.locations.www),
            path.relative(cordovaProject.root, platform_www)
        ];

        // If project contains 'merges' for our platform, use them as another overrides
        const merges_path = path.join(cordovaProject.root, 'merges', 'electron');
        if (fs.existsSync(merges_path)) {
            events.emit('verbose', 'Found "merges/electron" folder. Copying its contents into the electron project.');
            // add merges/electron to sourceDirs
            sourceDirs.push(path.join('merges', 'electron'));
        }

        // targetDir points to electron/www
        const targetDir = path.relative(cordovaProject.root, my_www);
        events.emit('verbose', `Merging and updating files from [${sourceDirs.join(', ')}] to ${targetDir}`);
        FileUpdater.mergeAndUpdateDir(sourceDirs, targetDir, { rootDir: cordovaProject.root }, logFileOp);
    }

    // update_overrides () {}

    config_xml () {
        return path.join(this.path, 'config.xml');
    }

    update_project (cfg) {
        return this.update_from_config()
            .then(
                // Copy munged config.xml to platform www dir
                () => fs.copySync(path.join(this.www_dir(), '..', 'config.xml'), path.join(this.www_dir(), 'config.xml'))
            );
    }
}

module.exports = function (project) {
    return new Parser(project);
};

/**
 * Logs all file operations via the verbose event stream, indented.
 */
function logFileOp (message) {
    events.emit('verbose', '  ' + message);
}
#!/usr/bin/env node

/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const argv = require('nopt')({
    help: Boolean,
    target: String,
    port: Number
}, {
    help: ['/?', '-h', 'help', '-help', '--help', '/help']
});

argv.binPath = process.argv[1];

const runForrest = require('./lib/run');

if (argv.help) {
    runForrest.help(argv);
    process.exit(0);
}

runForrest.run(argv);
:: Licensed to the Apache Software Foundation (ASF) under one
:: or more contributor license agreements.  See the NOTICE file
:: distributed with this work for additional information
:: regarding copyright ownership.  The ASF licenses this file
:: to you 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.

@ECHO OFF
SET script_path="%~dp0run"
IF EXIST %script_path% (
        node %script_path% %*
) ELSE (
    ECHO.
    ECHO ERROR: Could not find 'run' script in 'cordova' folder, aborting...>&2
    EXIT /B 1
)
#!/usr/bin/env node

/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

let VERSION = 'version undefined';

try {
    const platformPkgPath = require.resolve('cordova-electron/package.json');
    const platformPkg = require(platformPkgPath) || null;
    VERSION = platformPkg.version || VERSION;
} catch (e) {
    // Do nothing.
}

module.exports.version = VERSION;

if (!module.parent) console.log(VERSION);
:: Licensed to the Apache Software Foundation (ASF) under one
:: or more contributor license agreements.  See the NOTICE file
:: distributed with this work for additional information
:: regarding copyright ownership.  The ASF licenses this file
:: to you 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.

@ECHO OFF
SET script_path="%~dp0version"
IF EXIST %script_path% (
        node %script_path% %*
) ELSE (
    ECHO.
    ECHO ERROR: Could not find 'version' script in 'cordova' folder, aborting...>&2
    EXIT /B 1
)
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const fs = require('fs-extra');
const path = require('path');

class ManifestJsonParser {
    constructor (wwwDir) {
        this.path = path.join(wwwDir, 'manifest.json');
        this.www = wwwDir;
        this.manifest = {
            background_color: '#FFF',
            display: 'standalone',
            orientation: 'any',
            start_url: 'index.html'
        };
    }

    configureIcons (config) {
        /**
        * given a tag like this :
        * <icon src="res/ios/icon.png" width="57" height="57" density="mdpi" />
        *
        * configParser returns icons that look like this :
        * {
        *      src: 'res/ios/icon.png',
        *      target: undefined,
        *      density: 'mdpi',
        *      platform: null,
        *      width: 57,
        *      height: 57
        * }
        *
        * manifest expects them to be like this :
        * {
        *      "src": "images/touch/icon-128x128.png",
        *      "type": "image/png",
        *      "sizes": "128x128"
        * }
        */
        const icons = config.getStaticResources(this.platform, 'icon')
            .map((icon) => ({
                src: icon.src,
                type: 'image/png',
                sizes: `${icon.width}x${icon.height}`
            }));

        if (icons) this.manifest.icons = icons;

        return this;
    }

    configureOrientation (config) {
        // orientation
        // <preference name="Orientation" value="landscape" />
        const oriPref = config.getGlobalPreference('Orientation');
        if (oriPref === 'landscape' || oriPref === 'portrait') {
            this.manifest.orientation = oriPref;
        }

        return this;
    }

    configureStartUrl (config) {
        // get start_url
        const contentNode = config.doc.find('content');
        if (contentNode) this.manifest.start_url = contentNode.attrib.src;

        return this;
    }

    configureThemeColor (config) {
        if (this.manifest.start_url) {
            const startUrlPath = path.join(this.www, this.manifest.start_url);

            if (fs.existsSync(startUrlPath)) {
                // fetch start url file content and parse for theme-color.
                const contents = fs.readFileSync(startUrlPath, 'utf-8');
                const result = /<meta(?=[^>]*name="theme-color")\s[^>]*content="([^>]*)"/i.exec(contents);

                // If theme-color exists, the value is in index 1.
                if (result && result.length >= 2) this.manifest.theme_color = result[1];
            }
        }

        if (this.manifest.start_url && !this.manifest.theme_color) {
            const themeColor = config.getGlobalPreference('StatusBarBackgroundColor');
            if (themeColor) this.manifest.theme_color = themeColor;
        }

        return this;
    }

    configure (config) {
        if (config) {
            if (config.name()) this.manifest.name = config.name();
            if (config.shortName()) this.manifest.short_name = config.shortName();
            if (config.packageName()) this.manifest.version = config.packageName();
            if (config.description()) this.manifest.description = config.description();
            if (config.author()) this.manifest.author = config.author();

            this.configureIcons(config)
                .configureOrientation(config)
                .configureStartUrl(config)
                .configureThemeColor(config);
        }

        return this;
    }

    write () {
        fs.writeFileSync(this.path, JSON.stringify(this.manifest, null, 2), 'utf8');
    }
}

module.exports = ManifestJsonParser;
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const fs = require('fs-extra');
const path = require('path');
const { events } = require('cordova-common');

class PackageJsonParser {
    constructor (wwwDir) {
        this.path = path.join(wwwDir, 'package.json');
        this.www = wwwDir;
        this.package = {
            main: 'cdv-electron-main.js'
        };
    }

    configure (config, projectPackageJson) {
        if (config) {
            this.package.name = config.packageName() || 'io.cordova.hellocordova';
            this.package.displayName = config.name() || 'HelloCordova';
            this.package.version = config.version() || '1.0.0';
            this.package.description = config.description() || 'A sample Apache Cordova application that responds to the deviceready event.';

            if (projectPackageJson.dependencies) {
                const cordovaDependencies = Object.keys(projectPackageJson.dependencies)
                    .filter((npmPackage) => /^cordova(?!-plugin)-/.test(npmPackage));

                // If Cordova dependencies are detected in "dependencies" of "package.json" warn for potential app package bloating
                if (cordovaDependencies.length) {
                    events.emit('warn', '[Cordova Electron] The built package size may be larger than necessary. Please run with --verbose for more details.');

                    events.emit('verbose', `[Cordova Electron] The following Cordova package(s) were detected as "dependencies" in the projects "package.json" file.
\t- ${cordovaDependencies.join('\n\t- ')}

It is recommended that all Cordova packages are defined as "devDependencies" in the "package.json" file. It is safe to move them manually.
Packages defined as a dependency will be bundled with the application and can increase the built application's size.
`);
                }

                this.package.dependencies = projectPackageJson.dependencies;
            }

            this.configureHomepage(config);
            this.configureLicense(config);

            if (config.doc.find('author').attrib.email) {
                this.package.author = {
                    name: config.author() || 'Apache Cordova Team',
                    email: config.doc.find('author').attrib.email
                };
            } else {
                this.package.author = config.author() || 'Apache Cordova Team';
            }
        }

        return this;
    }

    configureHomepage (config) {
        this.package.homepage = (config.doc.find('author') && config.doc.find('author').attrib['href']) || 'https://cordova.io';
    }

    configureLicense (config) {
        this.package.license = (config.doc.find('license') && config.doc.find('license').text && config.doc.find('license').text.trim()) || 'Apache-2.0';
    }

    write () {
        fs.writeFileSync(this.path, JSON.stringify(this.package, null, 2), 'utf8');
    }
}

module.exports = PackageJsonParser;
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const fs = require('fs-extra');
const path = require('path');
const { deepMerge } = require('./util');

class SettingJsonParser {
    constructor (wwwDir) {
        this.path = path.join(wwwDir, 'cdv-electron-settings.json');
        this.package = require(this.path);
    }

    configure (config, userElectronSettingsPath) {
        // Apply user settings ontop of defaults.
        if (userElectronSettingsPath) {
            const userElectronSettings = require(userElectronSettingsPath);
            this.package = deepMerge(this.package, userElectronSettings);
        }

        if (config) {
            this.package.browserWindow.webPreferences.devTools = !config.release;
        }

        return this;
    }

    write () {
        fs.writeFileSync(this.path, JSON.stringify(this.package, null, 2), 'utf8');
    }
}

module.exports = SettingJsonParser;
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const fs = require('fs-extra');
const path = require('path');
const events = require('cordova-common').events;
const { deepMerge } = require('./util');

const PLATFORM_MAPPING = {
    linux: 'linux',
    mac: 'darwin',
    windows: 'win32',
    win: 'win32'
};

class ElectronBuilder {
    constructor (buildOptions, api) {
        this.api = api;
        this.isDevelopment = buildOptions.debug;
        this.buildConfig = buildOptions && buildOptions.buildConfig && fs.existsSync(buildOptions.buildConfig) ? require(buildOptions.buildConfig) : false;
    }

    configure () {
        this.buildSettings = this.configureUserBuildSettings()
            .configureBuildSettings();

        // Replace the templated placeholders with the project defined settings into the buildSettings.
        this.injectProjectConfigToBuildSettings();

        return this;
    }

    configureUserBuildSettings () {
        if (this.buildConfig && this.buildConfig.electron) {
            let userBuildSettings = {};

            for (const platform in this.buildConfig.electron) {
                if (platform !== 'mac' && platform !== 'linux' && platform !== 'windows') continue;

                const platformConfigs = this.buildConfig.electron[platform];
                /**
                 * In this scenario, the user has added a valid platform to build for but has not provided any custom build configurations.
                 * This will fetch thew platform's default build configuration.
                 * Each platform's default build configurations are located in the "./build/" directory.
                 */
                if (Object.keys(platformConfigs).length === 0) {
                    userBuildSettings = deepMerge(userBuildSettings, this.fetchPlatformDefaults(PLATFORM_MAPPING[platform]));
                    continue;
                }

                /**
                 * Validate that the platform configuration properties provided are valid.
                 * Any invalid property will be warned and iggnored.
                 * If there is there are no valid properties
                 */
                if (!this.__validateUserPlatformBuildSettings(platformConfigs)) {
                    throw Error(`The platform "${platform}" contains an invalid property. Valid properties are: package, arch, signing`);
                }

                // Electron uses "win" as it's key, not "windows", so we will update here. We use windows in our settings for clarity.
                this.__formatAppendUserSettings(
                    (platform === 'windows' ? 'win' : platform),
                    platformConfigs,
                    userBuildSettings
                );

                this.___overridablePerPlatformOptions(
                    (platform === 'windows' ? 'win' : platform),
                    platformConfigs,
                    userBuildSettings
                );
            }

            this.userBuildSettings = userBuildSettings;
        }

        return this;
    }

    __formatAppendUserSettings (platform, platformConfigs, userBuildSettings) {
        // Add the platform at the root level to trigger build.
        userBuildSettings[platform] = [];

        // Add the config placeholder for build configurations (only add once if missing)
        if (!userBuildSettings.config) userBuildSettings.config = {};

        userBuildSettings.config[platform] = {
            target: []
        };

        // Apply custom app installer icon when the user is using a custom build configuration
        // eslint-disable-next-line no-template-curly-in-string
        userBuildSettings.config[platform].icon = '${APP_INSTALLER_ICON}';

        // Only macOS has a build type distinction. (development or distribution)
        // eslint-disable-next-line no-template-curly-in-string
        if (platform === 'mac') userBuildSettings.config[platform].type = '${BUILD_TYPE}';

        if (platformConfigs.package) {
            platformConfigs.package.forEach((target) => {
                if (target === 'mas') {
                    userBuildSettings.config['mas'] = {};
                }

                if (typeof target === 'object' && Object.keys(target).length !== 0) {
                    const targetKey = Object.keys(target)[0];
                    userBuildSettings.config[targetKey] = target[targetKey];
                    target = targetKey;
                }

                /**
                 * The target of arch values are not validated as electron-builder will handle this.
                 * If the arch value is missing, 64-bit will be defaulted.
                 */
                userBuildSettings.config[platform].target.push({
                    target,
                    arch: platformConfigs.arch || ['x64']
                });
            });
        } else {
            /**
             * We will fetch and use the defaults when a package type is not identified.
             * If the arch value is identified, we will update each default package with the correct arch.
             */
            const platformDefaults = this.fetchPlatformDefaults(PLATFORM_MAPPING[platform]);
            let platformTargetPackages = platformDefaults.config[platform].target;

            if (platformConfigs.arch) {
                platformTargetPackages.forEach((pkg, i) => {
                    platformTargetPackages[i].arch = platformConfigs.arch;
                });
            }

            userBuildSettings.config[platform].target = platformTargetPackages;
        }

        if (platformConfigs.signing) {
            this.__appendUserSigning(platform, platformConfigs.signing, userBuildSettings);
        }
    }

    ___overridablePerPlatformOptions (platform, platformConfigs, userBuildSettings) {
        const PLATFORM_TOP_LEVEL_OPTIONS = {
            allPlatforms: [
                'appId',
                'artifactName',
                'asar',
                'compression',
                'detectUpdateChannel',
                'electronUpdaterCompatibility',
                'extraFiles',
                'extraResources',
                'fileAssociations',
                'files',
                'forceCodeSigning',
                'generateUpdatesFilesForAllChannels',
                'icon',
                'publish'
            ],
            linux: [
                'category',
                'description',
                'desktop',
                'executableName',
                'maintainer',
                'mimeTypes',
                'synopsis',
                'vendor'
            ],
            mac: [
                'binaries',
                'bundleShortVersion',
                'bundleVersion',
                'category',
                'darkModeSupport',
                'electronLanguages',
                'extendInfo',
                'extraDistFiles',
                'helperBundleId',
                'minimumSystemVersion'
            ],
            win: [
                'legalTrademarks',
                'publisherName',
                'requestedExecutionLevel',
                'rfc3161TimeStampServer',
                'signAndEditExecutable',
                'signDlls',
                'timeStampServer',
                'verifyUpdateCodeSignature'
            ]
        };

        for (let option in platformConfigs) {
            if (
                PLATFORM_TOP_LEVEL_OPTIONS['allPlatforms'].includes(option)
                || PLATFORM_TOP_LEVEL_OPTIONS[platform].includes(option)
            ) {
                userBuildSettings.config[platform][option] = platformConfigs[option];
            }
        }
    }

    __appendUserSigning (platform, signingConfigs, userBuildSettings) {
        if (platform === 'linux') {
            events.emit('warn', `The provided signing information for the Linux platform is ignored. Linux does not support signing.`);
            return this;
        }

        const config = this.isDevelopment ? signingConfigs.debug : signingConfigs.release;
        if (platform === 'mac' && config) {
            this.__appendMacUserSigning(config, userBuildSettings.config.mac);
        }

        const masConfig = this.isDevelopment ? null : (signingConfigs.store || null);
        if (platform === 'mac' && masConfig) {
            // Requirements is not available for mas.
            if (masConfig.requirements) delete masConfig.requirements;
            this.__appendMacUserSigning(masConfig, userBuildSettings.config.mas);
        }

        if (platform === 'win' && config) {
            this.__appendWindowsUserSigning(config, userBuildSettings.config.win);
        }
    }

    __validateUserPlatformBuildSettings (platformConfigs) {
        return !!(
            platformConfigs.package
            || platformConfigs.arch
            || platformConfigs.signing
        );
    }

    __appendMacUserSigning (config, buildConfigs) {
        if (config.identity || process.env.CSC_LINK || process.env.CSC_NAME) buildConfigs.identity = config.identity || process.env.CSC_LINK || process.env.CSC_NAME;

        const entitlements = config.entitlements;
        if (entitlements && fs.existsSync(entitlements)) {
            buildConfigs.entitlements = entitlements;
        } else if (entitlements) {
            events.emit('warn', `The provided entitlements file does not exist in the given path => ${entitlements}`);
        }

        const entitlementsInherit = config.entitlementsInherit;
        if (entitlementsInherit && fs.existsSync(entitlementsInherit)) {
            buildConfigs.entitlementsInherit = entitlementsInherit;
        } else if (entitlementsInherit) {
            events.emit('warn', `The provided entitlements inherit file does not exist in the given path => ${entitlementsInherit}`);
        }

        const requirements = config.requirements;
        if (requirements && fs.existsSync(requirements)) {
            buildConfigs.requirements = requirements;
        } else if (requirements) {
            events.emit('warn', `The provided requirements file does not exist in the given path => ${requirements}`);
        }

        const provisioningProfile = config.provisioningProfile;
        if (provisioningProfile && fs.existsSync(provisioningProfile)) {
            buildConfigs.provisioningProfile = provisioningProfile;
        } else if (provisioningProfile) {
            events.emit('warn', `The provided provisioning profile does not exist in the given path => ${provisioningProfile}`);
        }
    }

    __appendWindowsUserSigning (config, buildConfigs) {
        const certificateFile = config.certificateFile;
        if (certificateFile && fs.existsSync(certificateFile)) {
            buildConfigs.certificateFile = certificateFile;

            if (config.certificatePassword || process.env.CSC_KEY_PASSWORD) buildConfigs.certificatePassword = config.certificatePassword || process.env.CSC_KEY_PASSWORD;
        } else if (certificateFile) {
            events.emit('warn', `The provided certificate file does not exist in the given path => ${certificateFile}`);
        }

        if (config.certificateSubjectName) buildConfigs.certificateSubjectName = config.certificateSubjectName;
        if (config.certificateSha1) buildConfigs.certificateSha1 = config.certificateSha1;
        if (config.signingHashAlgorithms) buildConfigs.signingHashAlgorithms = config.signingHashAlgorithms;

        const additionalCertificateFile = config.additionalCertificateFile;
        if (additionalCertificateFile && fs.existsSync(additionalCertificateFile)) {
            buildConfigs.additionalCertificateFile = additionalCertificateFile;
        } else if (additionalCertificateFile) {
            events.emit('warn', `The provided addition certificate file does not exist in the given path => ${additionalCertificateFile}`);
        }
    }

    configureBuildSettings () {
        const baseConfig = require(path.resolve(__dirname, './build/base.json'));
        const platformConfig = this.userBuildSettings || this.fetchPlatformDefaults(process.platform);

        return deepMerge(baseConfig, platformConfig);
    }

    injectProjectConfigToBuildSettings () {
        // const isDevelopment = false;
        const packageJson = require(path.join(this.api.locations.www, 'package.json'));
        const userConfig = {
            APP_ID: packageJson.name,
            APP_TITLE: packageJson.displayName,
            APP_INSTALLER_ICON: 'installer.png',
            APP_BUILD_DIR: this.api.locations.build,
            APP_BUILD_RES_DIR: this.api.locations.buildRes,
            APP_WWW_DIR: this.api.locations.www,
            BUILD_TYPE: this.isDevelopment ? 'development' : 'distribution'
        };

        // convert to string for string replacement
        let buildSettingsString = JSON.stringify(this.buildSettings);

        Object.keys(userConfig).forEach((key) => {
            const regex = new RegExp(`\\$\\{${key}\\}`, 'g');
            const value = userConfig[key].replace(/\\/g, `\\\\`);
            buildSettingsString = buildSettingsString.replace(regex, value);
        });

        // update build settings with formated data
        this.buildSettings = JSON.parse(buildSettingsString);

        return this;
    }

    fetchPlatformDefaults (platform) {
        const platformFile = path.resolve(__dirname, `./build/${platform}.json`);

        if (!fs.existsSync(platformFile)) {
            throw Error(`Your platform "${platform}" is not supported as a default target platform for Electron.`);
        }

        return require(platformFile);
    }

    build () {
        return require('electron-builder').build(this.buildSettings);
    }
}

module.exports.run = (buildOptions, api) => require('./check_reqs')
    .run()
    .then(() => (new ElectronBuilder(buildOptions, api))
        .configure()
        .build()
    )
    .catch((error) => {
        console.log(error);
    });

module.exports.help = (argv) => {
    const binPath = path.relative(process.cwd(), argv.binPath);
    console.log(`Usage: ${binPath} [flags]
Flags:
    '--debug': will build project in debug mode (default)
    '--release': will build project for release
    '--nobuild': will skip build process (useful when using run command)`);
};
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

// add methods as we determine what are the requirements

module.exports.run = () => Promise.resolve([]);
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const fs = require('fs-extra');
const path = require('path');
const check_reqs = require('./check_reqs');
const platformBuildDir = path.join('platforms', 'electron', 'www');

module.exports.run = () => {
    // TODO: everything calls check_reqs ... why?
    // Check that requirements are (still) met
    if (!check_reqs.run()) {
        console.error('Please make sure you meet the software requirements in order to clean an electron cordova project');
        process.exit(2);
    }

    try {
        if (fs.existsSync(platformBuildDir)) {
            fs.removeSync(platformBuildDir);
        }
    } catch (err) {
        console.log(`could not remove ${platformBuildDir} : ${err.message}`);
    }
};

// just on the off chance something is still calling cleanProject, we will leave this here for a while
module.exports.cleanProject = () => {
    console.log('lib/clean will soon only export a `run` command, please update to not call `cleanProject`.');
    return module.exports.run();
};

module.exports.help = (argv) => {
    const binPath = path.relative(process.cwd(), argv.binPath);
    console.log(`Usage: ${binPath}`);
};
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const fs = require('fs-extra');
const path = require('path');
const shell = require('shelljs');
const { ConfigParser, xmlHelpers, events, CordovaError } = require('cordova-common');
const ManifestJsonParser = require('./ManifestJsonParser');
const PackageJsonParser = require('./PackageJsonParser');
const SettingJsonParser = require('./SettingJsonParser');

module.exports.prepare = function (cordovaProject, options) {
    // First cleanup current config and merge project's one into own
    const defaultConfigPath = path.join(this.locations.platformRootDir, 'cordova', 'defaults.xml');
    const ownConfigPath = this.locations.configXml;
    const sourceCfg = cordovaProject.projectConfig;

    // If defaults.xml is present, overwrite platform config.xml with it.
    // Otherwise save whatever is there as defaults so it can be
    // restored or copy project config into platform if none exists.
    if (fs.existsSync(defaultConfigPath)) {
        this.events.emit('verbose', `Generating config.xml from defaults for platform "${this.platform}"`);
        fs.copySync(defaultConfigPath, ownConfigPath);
    } else if (fs.existsSync(ownConfigPath)) {
        this.events.emit('verbose', `Generating defaults.xml from own config.xml for platform "${this.platform}"`);
        fs.copySync(ownConfigPath, defaultConfigPath);
    } else {
        this.events.emit('verbose', `case 3 "${this.platform}"`);
        fs.copySync(sourceCfg.path, ownConfigPath);
    }

    // merge our configs
    this.config = new ConfigParser(ownConfigPath);
    xmlHelpers.mergeXml(sourceCfg.doc.getroot(), this.config.doc.getroot(), this.platform, true);
    this.config.write();

    // Update own www dir with project's www assets and plugins' assets and js-files
    this.parser.update_www(cordovaProject, this.locations);
    // Update icons
    updateIcons(cordovaProject, this.locations);
    // Update splash screens
    updateSplashScreens(cordovaProject, this.config, this.locations);

    // Copy or Create manifest.json
    const srcManifestPath = path.join(cordovaProject.locations.www, 'manifest.json');
    if (fs.existsSync(srcManifestPath)) {
        // just blindly copy it to our output/www
        // todo: validate it? ensure all properties we expect exist?
        const manifestPath = path.join(this.locations.www, 'manifest.json');
        this.events.emit('verbose', `Copying ${srcManifestPath} => ${manifestPath}`);
        fs.copySync(srcManifestPath, manifestPath);
    } else {
        this.events.emit('verbose', `Creating new manifest file in => ${this.path}`);

        (new ManifestJsonParser(this.locations.www))
            .configure(this.config)
            .write();
    }

    const projectPackageJson = JSON.parse(fs.readFileSync(path.join(cordovaProject.root, 'package.json'), 'utf8'));

    (new PackageJsonParser(this.locations.www))
        .configure(this.config, projectPackageJson)
        .write();

    const userElectronSettings = cordovaProject.projectConfig.getPlatformPreference('ElectronSettingsFilePath', 'electron');
    const userElectronSettingsPath = userElectronSettings && fs.existsSync(path.resolve(cordovaProject.root, userElectronSettings))
        ? path.resolve(cordovaProject.root, userElectronSettings)
        : undefined;

    // update Electron settings in .json file
    (new SettingJsonParser(this.locations.www))
        .configure(options.options, userElectronSettingsPath)
        .write();

    // update project according to config.xml changes.
    return this.parser.update_project(this.config, options);
};

/**
 * Update Electron Splash Screen image.
 */
function updateSplashScreens (cordovaProject, config, locations) {
    const splashScreens = cordovaProject.projectConfig.getSplashScreens('electron');

    // Skip if there are no splash screens defined in config.xml
    if (!splashScreens.length) {
        events.emit('verbose', 'This app does not have splash screens defined.');
        return;
    }

    const splashScreen = prepareSplashScreens(splashScreens);
    const resourceMap = createResourceMap(cordovaProject, locations, splashScreen);

    updatePathToSplashScreen(config, locations, resourceMap);

    events.emit('verbose', 'Updating splash screens');
    copyResources(cordovaProject.root, resourceMap);
}

/**
 *  Get splashScreen image. Choose only one image, if the user provided multiple.
 */
function prepareSplashScreens (splashScreens) {
    let splashScreen;
    // choose one icon for a target
    const chooseOne = (defaultSplash, splash) => {
        events.emit('verbose', `Found extra splash screen image: ${defaultSplash.src} and ignoring in favor of ${splash.src}.`);

        defaultSplash = splash;

        return defaultSplash;
    };

    // iterate over remaining icon elements to find the icons for the app and installer
    for (let i = 0; i < splashScreens.length; i++) {
        let image = splashScreens[i];
        image.extension = path.extname(image.src);

        splashScreen = splashScreen ? chooseOne(splashScreen, image) : image;
    }

    return { splashScreen };
}

/**
 *  Update path to Splash Screen in the config.xml
 */
function updatePathToSplashScreen (config, locations, resourceMap) {
    const elementKeys = Object.keys(resourceMap[0]);
    const splashScreenPath = resourceMap[0][elementKeys];

    const splash = config.doc.find('splash');
    const preferences = config.doc.findall('preference');

    splash.attrib.src = path.relative(locations.www, splashScreenPath);
    for (let i = 0; i < preferences.length; i++) {
        if (preferences[i].attrib.name === 'SplashScreen') {
            preferences[i].attrib.value = splash.attrib.src;
        }
    }
    config.write();
}

/**
 * Update Electron App and Installer icons.
 */
function updateIcons (cordovaProject, locations) {
    const icons = cordovaProject.projectConfig.getIcons('electron');

    // Skip if there are no app defined icons in config.xml
    if (!icons.length) {
        events.emit('verbose', 'This app does not have icons defined');
        return;
    }

    const filteredIcons = icons.filter(icon => checkIconsAttributes(icon));

    if (!filteredIcons.length) {
        throw new CordovaError('No icon match the required size. Please ensure that ".png" icon is at least 512x512 and has a src attribute.');
    }

    const chosenIcons = prepareIcons(filteredIcons);
    const resourceMap = createResourceMap(cordovaProject, locations, chosenIcons);

    events.emit('verbose', 'Updating icons');
    copyResources(cordovaProject.root, resourceMap);
}

/**
 * Check if all required attributes are set.
 */
function checkIconsAttributes (icon) {
    if (((icon.height && icon.width) >= 512 || (icon.height && icon.width) === undefined) && icon.src) return true;

    events.emit('info', `The following${icon.target ? ' ' + icon.target : ''} icon with a size of width=${icon.width} height=${icon.height} does not meet the requirements and will be ignored.`);
    return false;
}

/**
 *  Find and select icons for the app and installer.
 *  Also, set high resolution icons, if provided by a user.
 */
function prepareIcons (icons) {
    let customIcon;
    let appIcon;
    let installerIcon;

    // choose one icon for a target
    const chooseOne = (defaultIcon, icon) => {
        events.emit('verbose', `Found extra icon for target ${icon.target}: ${defaultIcon.src} and ignoring in favor of ${icon.src}.`);

        defaultIcon = icon;

        return defaultIcon;
    };

    // find if there is high resolution images that has DPI suffix
    const highResAndRemainingIcons = findHighResIcons(icons);

    const highResIcons = highResAndRemainingIcons.highResIcons;
    const remainingIcons = highResAndRemainingIcons.remainingIcons;

    // iterate over remaining icon elements to find the icons for the app and installer
    for (let i = 0; i < remainingIcons.length; i++) {
        // if (fs.existsSync(icons[i].src)) {
        let icon = remainingIcons[i];
        const size = icon.width || icon.height;
        icon.extension = path.extname(icon.src);

        switch (icon.target) {
        case 'app':
            appIcon = appIcon ? chooseOne(appIcon, icon) : icon;
            break;
        case 'installer':
            installerIcon = installerIcon ? chooseOne(installerIcon, icon) : icon;
            break;
        case undefined:
            if ((size >= 512 || size === undefined) && !Object.keys(highResIcons).length) {
                customIcon = customIcon ? chooseOne(customIcon, icon) : icon;
            }
            break;
        }
    }

    return { customIcon, appIcon, installerIcon, highResIcons };
}

/**
 *  Find and high resolution icons and return remaining icons,
 *  unless an icon has a specified target.
 */
function findHighResIcons (icons) {
    // find icons that are not in the highResIcons, unless they have a target set
    const findRemainingIcons = (icons, highResIcons) => icons.filter(
        (icon) => (icon.target || (!icon.target && !highResIcons.includes(icon)))
            ? Object.assign(icon)
            : false
    );

    let highResIcons = icons.filter(icon => {
        if (icon.src.includes('@')) {
            const extension = path.extname(icon.src);
            const suffix = icon.src.split('@').pop().slice(0, -extension.length);

            return Object.assign(icon, { suffix, extension });
        }
    });

    let remainingIcons = findRemainingIcons(icons, highResIcons);
    // set normal image that has standard resolution
    const has1x = highResIcons.find(obj => obj.suffix === '1x');
    if (!has1x && Object.keys(highResIcons).length) {
        const highResIcon = highResIcons[Object.keys(highResIcons)[0]];
        let baseIcon = remainingIcons.find(obj => obj.src === highResIcon.src.split('@')[0] + highResIcon.extension);

        if (!baseIcon) {
            throw new CordovaError('Base icon for high resolution images was not found.');
        }

        const extension = path.extname(baseIcon.src);
        const suffix = '1x';

        baseIcon = Object.assign(baseIcon, { suffix, extension });

        highResIcons.push(baseIcon);

        remainingIcons = findRemainingIcons(icons, highResIcons);
    }

    return { highResIcons, remainingIcons };
}

/**
 * Map resources to the appropriate target directory and name.
 */
function createResourceMap (cordovaProject, locations, resources) {
    let resourceMap = [];

    for (const key in resources) {
        const resource = resources[key];

        if (!resource) {
            continue;
        }

        let targetPath;
        switch (key) {
        case 'customIcon':
            // Copy icon for the App
            targetPath = path.join(locations.www, 'img', `app${resource.extension}`);
            resourceMap.push(mapResources(cordovaProject.root, resource.src, targetPath));
            // Copy icon for the Installer
            targetPath = path.join(locations.buildRes, `installer${resource.extension}`);
            resourceMap.push(mapResources(cordovaProject.root, resource.src, targetPath));
            break;
        case 'appIcon':
            targetPath = path.join(locations.www, 'img', `app${resource.extension}`);
            resourceMap.push(mapResources(cordovaProject.root, resource.src, targetPath));
            break;
        case 'installerIcon':
            targetPath = path.join(locations.buildRes, `installer${resource.extension}`);
            resourceMap.push(mapResources(cordovaProject.root, resource.src, targetPath));
            break;
        case 'highResIcons':
            for (const key in resource) {
                const highResIcon = resource[key];
                targetPath = path.join(locations.www, 'img', 'icon');
                targetPath += highResIcon.suffix === '1x' ? highResIcon.extension : `@${highResIcon.suffix}${highResIcon.extension}`;
                resourceMap.push(mapResources(cordovaProject.root, highResIcon.src, targetPath));
            }
            break;
        case 'splashScreen':
            targetPath = path.join(locations.www, `.cdv`, `splashScreen${resource.extension}`);
            resourceMap.push(mapResources(cordovaProject.root, resource.src, targetPath));
            break;
        }
    }
    return resourceMap;
}

/**
 * Get a map containing resources of a specified name (or directory) to the target directory.
 */
function mapResources (rootDir, sourcePath, targetPath) {
    let pathMap = {};
    shell.ls(path.join(rootDir, sourcePath)).forEach(() => {
        pathMap[sourcePath] = targetPath;
    });
    return pathMap;
}

/**
 * Copy resources to the target destination according to the resource map.
 */
function copyResources (rootDir, resourceMap) {
    resourceMap.forEach(element => {
        const elementKeys = Object.keys(element);

        if (elementKeys.length) {
            const value = elementKeys.map((e) => element[e])[0];
            fs.copySync(path.join(rootDir, elementKeys[0]), value);
        }
    });
}
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const electron = require('electron');
const proc = require('child_process');
const path = require('path');

module.exports.run = (args) => {
    const pathToMain = path.resolve(__dirname, '..', '..', 'www', 'cdv-electron-main.js');
    const child = proc.spawn(electron, [pathToMain]);

    child.on('close', (code) => {
        process.exit(code);
    });
};

module.exports.help = (argv) => {
    const binPath = path.relative(process.cwd(), argv.binPath);
    console.log(`Usage: ${binPath} [flags]
Flags:
    '--nobuild': will skip build process (useful when using run command)`);
};
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

module.exports.deepMerge = function (mergeTo, mergeWith) {
    for (const property in mergeWith) {
        if (Object.prototype.toString.call(mergeWith[property]) === '[object Object]') {
            mergeTo[property] = module.exports.deepMerge((mergeTo[property] || {}), mergeWith[property]);
        } else if (Object.prototype.toString.call(mergeWith[property]) === '[object Array]') {
            mergeTo[property] = [].concat((mergeTo[property] || []), mergeWith[property]);
        } else {
            mergeTo[property] = mergeWith[property];
        }
    }

    return mergeTo;
};
{
  "config": {
    "appId": "${APP_ID}",
    "productName": "${APP_TITLE}",

    "directories": {
      "app": "${APP_WWW_DIR}",
      "buildResources": "${APP_BUILD_RES_DIR}",
      "output": "${APP_BUILD_DIR}"
    },
    "electronVersion": "4.0.1",

    "electronDownload": {
      "version": "4.0.1"
    }
  }
}{
  "mac": [],
  "config": {
    "mac": {
      "type": "${BUILD_TYPE}",
      "icon": "${APP_INSTALLER_ICON}",
      "target": [
        {
          "target": "dmg",
          "arch": [
            "x64"
          ]
        },
        {
          "target": "zip",
          "arch": [
            "x64"
          ]
        }
      ]
    }
  }
}
{
  "linux": [],
  "config": {
    "linux": {
      "icon": "${APP_INSTALLER_ICON}",
      "target": [
        {
          "target": "tar.gz",
          "arch": [
            "x64"
          ]
        }
      ]
    }
  }
}
{
  "win": [],
  "config": {
    "win": {
      "icon": "${APP_INSTALLER_ICON}",
      "target": [
        {
          "target": "nsis",
          "arch": [
            "x64"
          ]
        }
      ]
    }
  }
}
‰PNG

   IHDR         ôxÔú   tEXtSoftware Adobe ImageReadyqÉe<  hiTXtXML:com.adobe.xmp     <?xpacket begin="ï»¿" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c061 64.140949, 2010/12/07-10:57:01        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:DAF197C98B216811A4A3D9917A0A7E70" xmpMM:DocumentID="xmp.did:5010A0F0664111E195908AA158F732A6" xmpMM:InstanceID="xmp.iid:5010A0EF664111E195908AA158F732A6" xmp:CreatorTool="Adobe Photoshop CS5.1 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:2DF2AC0635226811A4A3D9917A0A7E70" stRef:documentID="xmp.did:DAF197C98B216811A4A3D9917A0A7E70"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>¢!4ž  —ÄIDATxÚì½[¬$ÙY.¸Væ¾ï]·½wUõ<Ç‡�¶�>Á xõ°�§á…WÒŒfæ	i°��æiFYB²b^@‚ÃÕŒ�92f$Îccwu»ÜÕ]]]U]]Õ]—]»víK^cM¬ˆµ"WD¬µbÅ-3"òûº³vfÆ%##"×÷ýÿú/”1F     X.P     €                          €                          €                          €                          €                   €                          €                          €                          €                  €                          €                          €                          €                          €                   €                          €                          €        ‘�ç/ïyÌ³¾ëº.ëÍsJ)éõzüïgýÇ_'·)sïUqß–ÝÇ¢�ŸUçqwq,âßi<“Ñhôßyž÷71ãxé¥—p  Ú/  Œä¿ã¿|Ã_÷e¾~•ß¹ìòº�a^"¥ªuyßvUðïã?™L&ïù/ÀcÔ„ h
Vp
*TS>éåÀò¬ïº®ËzóX‡/ã¿ÅÉŸ‚üQ5‰V!êüŒyß"„BSE@ƒÄËü·à?þgŒ” < ô À�²þ?å¿ü†¿¼?�N%D D@GDÀÔü;ÿñmŒœð 4=œ‚z<u­ïº®Ëzu¬£�ßù{œüM–¿ëçdCÙåuÆ<ŽoÞëÔuß]¿ªmkFð›  " ["@qýÿªÿø´:ï¿H…€h>-~ °xžÂ@9TˆÖæé IþþƒÏwòÀ¿nýç�þÇt iÕ:uÝ·E×¯jÛÁy@à{Ë>~b
  x:â	P¬ÿ/šÈž xà	 <3æ‹ ˆ€Nˆ Åúÿ¬ÿòó.Þˆ ˆ€%Ÿ÷ŸÅè@ @´Z(äÏ-›/É÷!  ¬ø’ð   D@;E@2ç_þÕM²-²6  ,†“XEÎ_—)rþýõƒœÿdÅ¿ºïˆÀÀym[–º6 ‚ á€' Åž NþDÉoÖ•û…' ž xŒ@m   " }"@™ûÿUŸô?m«õ  `j ‹á!L”Ç<Ý‘M™pÍù¯â³ò,Çt ¦æµmÅXÊÚ ˜€`é¬ù.xÔœÿ±“§©<ðÀ�j  Í
ùG9ÿ®å~!  Œàµ~£)07ÞÂ@µèút€"¸Åò†šö—÷ó0€é€Eþ&ªÜ¶Bð) >p¼ã%¦ à€' �ž ž¿ü²)ðž xà	(SóÛIx à	h”'@	ü‹rþ³ZýÂ O <¹±4µà€ ž€–xÄ{¹ò–á	€' ž€Üà¿­? ¨ @ @4A(sÿ±œÿ&D D@‡DÀ§üÇ¯cjå(LÔ�¶OÈQÍù¯£ÜoUë`:€´j�:ïÛyÿþ*Fçk`
  xÚã	ø¢Žü›f]Â O@G<<Óæw1‚ Jàßg}Òÿ|Ýå~!  bø9‚Ú @]¼„)€ù¢mÓ‚üƒœÿñò¼ÊýVµ¦H«Ö©ê¾mÂï¯Bt¶6 ¦ à€' ¡ž ¥â_”ó_ÕçÂ O <Î@m   xæç	PÈŸG#9ÿMúƒ' ž€%ðt²6 < ð ÀÐ\O€1ç¿mÖ%<ð´Ü€Ú   D@ý^¯×“ëóåŸ^t¹_ˆ ˆ ˆ€ ¨ TËA˜X<š6 sþýu£œÿ²ûÄtÀ|>Ó�ŸèTm LÀ Ö O€šóOÂ<äÖYŽðÀÐaO j  ÕxJ¹ß ç¿êc€€€¨¨ TÃ;˜h9 æüûË^Îõïº¦æó˜èôt@'j`
   ž åùoqò¯ÓJƒ' ž xJµ x à	¨ÆêÖÿ§üçßðßê›öO <ð4ÆÐúÚ ð À ,ØáiDÉù·`ðÀ O@c<¨ @ @T2àýªOüŸ®rßµµ€â÷)¦ š�:Ý‘b âó‰¼ÙÏoöSõqa:`~ÇW÷ñ7q�¼¿‘N´¶6 ¦ à d‰$sþe,@ÕÇO <ðÔ
Ô    
mûYÿñùºSˆ ˆ ˆ€Z�Ú @þ{S íBUîH1(9ÿÄÐê··*¦æw|u×©ë¾­ú÷WZW S ð  ‹³D~ËDþðÀ O@ë<¨ À O€xô°5çž xà	h�' Uµà€ ˜¿5á”óO <ð´Î€Ú   D€u»_õÿ|º®Ï‚€€X¨@m Àí>Ä@û‘çúO�óïo³“wÛ¼ëc: úåu¦:3ÐŠÚ ˜€ ˜¯'à‹’üë¶zà	€' ž€…yP € €ˆ­óYŸü??Ï" " "`a" µ û½‡)€nÁ’ÒäüëZýfm[Åú˜¨~yÝŸ�é€NL4º6 ¦ à æã	ø-ùÃ O <�ô 6  À2{ü�åSþë çÑV<ðÀ0wO@ckÀ  P¯' Êùo‚ÕO <ðÌÝ€Ú  À2Š žóï[Ÿ.²-D D D@gD j éûS �F,ç¿0�L´ëzÖuß]¿ªm5h\m LÀ Ô‡/ú��yZ"ðÀ O@c=¨ @ ,	>ë?>¿ˆA" " " ±" µ€Ù½…)€N"Èù'á@ótGb: Óm»žuÝ·‹øýYÐ˜Ú ˜€ ¨¿¥#xà	€' ž ‚Ú  < ��öÍÌù‡' ž x–ÚÐˆÚ ð À Tçœxà	€'`©=¨ �œ‚NáWý‡sÎ?HŠZy·Í³¾º.ÿëy^ðÐmß&ëRÜ½^OÖhp>?e—×ýê2y­’×¬‰V¾ëý¨>ñ›¨r[²6Àï`è\N`
 ;rþI ˜M�˜L&d4‘Á`ü�N§µgÝëpâ_[[#ëëëÁ_)òì¿éÓüš�Çãàšñ¿ÉkÖ¶é õš­®®j¯Ù<5�…ÖÀ < @5øbòoª'€¯ÃÉäùóçäÙ³gäììÌ* šf9êöÃ	dgg‡\¼x‘¬¬¬�~¿?W+½îÏàïñ¿V‡‡‡äää¤°hkŠà×h{{›œ?^ë¹é€'@Öøy¡ @;Ëùï‚àÄÁ­H. n¼u‹|ûú[„…£5aš�;xü/§fëRþnø„k0®'×WþŠ5Â÷äg©Ÿ¼ÃRÂ¢EL�_øœ(Ûð?›úß‡Eûýïéß“Ïüè�ÌÕz/2}’w9-Iò[¯¿Aþø¯¾_Os¾õ×TY&¯�zmcçW¹Þ$þœEŸ{?†ÔqÍ®´ºÙoþ/¿F~ä‡>Vh«"@Öø2†Òå‚ Û®à¿TÅŽšÈ3î>>==¬ÉÛ<(õó’‹¨ËAê7ÎX=yÉ±ùÅ«W´–dMí`_³¼ËåwâVó•Ë{ùÎõîYç›ÇÇ?üÓ¿Dâ&�hêïOƒß%=ˆ  °8sþÛ*¸õ?òí{ÈéÙÀm{ªÆ«pêÓœkêHO¾÷‚ M ¼:D  ßóâUwâO}†þBÚöWÕi1íæÛß¹A¾ûæÛÆ5ß¨  ´<Š÷h’UUvÀS­>p÷þ£\¬'	ª—T¿]ü¹�&fN‚Ä÷ˆ}§Ùó­­M²í?æ�y¦!r°³½í×³G&qfiqÅUv£ÙñPû®¿ü÷ÿTÈÕÞ"ðëbL  €†Ã9ç¿M" iý+Ö?ÍaêÙV£&"¢9¸„æ='áß®ìÇÄNS®[U"@Mu¼²¿g'~êæKÉ{êÃCŸdáõèX¨Û¥þ××¾K®ß¸;v°N j@  -A®œÿ6ˆ€”õÿÞ#­ÿž:ž³ÛÀùíXî¾mMª1ÿ}\ÞßkìU•àä€½ÝÌK>CióÞ›3%�iík¯cøøË¿ûz¬FEE€¬ @  Ÿ¯ûßš@
UnËÇHëÿŽoýŸœ�Uð,d3Ç@@‰Ý‹¬Ö��€ó¨(ÉŸ¯·{éb¾s½€{4¯2ü×kq/@ÞÏo‰ømRa\  T‹Â9ÿMÒúçQÿÜú¿ýÞÃÄ@LÝöOûŠ:
ŒkRBSŒ«—÷k'á¦ˆ€+û—ÊjßZ\  \ö÷�1/@E€¬ @  Céœÿ&Š uîÿNù?,ÌÀn�€º§yuNªS6±½\Þß]8É×)ÔTÀ}Ý@ž@ÀBâ­Þ@@Žo]{ƒ¼þÝ7c^€Š Y €  ‚Êrþ›$’yÿwbÖ¿fnQ  SVãŸyU	ìj!þ>÷ ¼ Ô(hZiÞ�€É¾ü÷ÿwÊÐA€Ú  @ƒPiÎSD@Òú?y—ŠˆB™&pa�€¬@  ÀÖæfð¨Š¨›.¶··Ò©€v'ŒqŸ‹d±ÿ¾ùÚu­ c" µ  €† –œÿE‹€´õÿ(5È—žÚ]`EÀˆÖ«±m"@N^€ýý|çz÷dQ7�ÉÐ1€Ú  À‚QkÎÿ"E@Òú?Ò&71ç„k�¥²`°ü®çäšê>äü¿. k"@fìw4�ã›¯}Çèè�@m  `Á¨=ç" eýßTndÎ´ìóf¬½"`’ö.]ª�¨›$TÀþîâ‹Üž®�€.^€‰ Ô€  „¹åüÏ[$óþeä?ÍöÛX�¯vÅ¡PWD€LÜß½�Mü5Æ>©’Š€é²¼ ¨  , sÍùŸ—Póþ�Ö>cÌr,‹©ÈoÉ)€®‹ éþç­ß¹M�€–/ öè°@m  `ÎXHÎÿ<D€:÷÷Þûät0´›êe'w˜ ƒ+¢PÝÅxš"øãjÂëÑµ@ÀÀpí:y-ÃÐ€Ú  Àœ°Ðœÿ:’äÜÿ;÷æ†ç[°L  S·•.€®5ä» x* ÿÞ]”øO—íèˆ@m  `XxÎ]I,òÿÝd�´þ™ò $Ý¨L  ›o  jýIk«PU/ u8ß�ÔÝ“Êƒ{^ã­L/@D j@  5£19ÿU$IëÿvÂú�¾íT‰À4Þe §._ÞÕê¯&Òdºf�@@ùÖ_}õëÚkßA€Ú  @Mh\Î•I2ïÿ,²þ“&ÖÌô·¸óg—Ìf� Ë–ØEO¼ät¾è~Í™á1[öÍkß	b\@ËE jt+8�C#sþ‹$ê@˜²þï=tßW`=ÒT`]öFú×É]…�ûX6ã3–Þ8Ãú< {³"@\éÂFy—åÝË“ëðïÉS=w/]HYÑ™çº¢{®ºârÈõÕ$ŸøÁï„�K¬GžãÍûÝÊœ‡mem€ßÁ� TƒFçü—HâÖÿ}r6‡õ£±Ë€ç8Žg–û~Â5÷÷wÉh4
ZO&“L‚."\‚ÐÊlëzŒrœ?øõ¾°³��øS‹†½!Ro™÷—W+¹_túRfüÐ+ÿµ³ÞbÀcþÔ¼‡¡ (�ÆçüH¸%³þeÍ1Šä�ä+`r=éPƒ[@}J�MˆlïÎœñÁ{s�<yò$øî\•µ°‹yÛæüÁ¯ûùsÛ™×0y¾uç9¿xr±€È¼-#½ y]ü-²6ÀÏcè†  Ê¡59ÿE¯úwŸ†#;�fXx³õÜFwj°Õ]ÄˆHÝ&‹}Ë“ƒæÿþ» dŸþŸ²èoDžRÎþKä§�ðÿô_ùùDóùLsŒ$Z]y?¹�Ügtòû±4‘˜ˆß‰áÓ+¹	ñIZgBxÑ±dìP+•md, ÷pÈé€ŽŠ YàËÂÛ6­ËùÏƒdÕ?nýë²©Ñgÿe[M®-f�’*2”��žŽ^§®›’:êåPj!Ë¬ôÇ2ëƒ¦^ÿåWÿ1&ÎòLä!æ¼D^Æ‹gj@  %ÐÊœWÄ«þùÖÿhTl*2ÐSóëyTœHÂB�¬oñžø›|Ÿºe§ØI±ýç©” m’ÓÆŠ€9v+½ j]€‹ Ôh!‚,œ†…£Õ9ÿ®Öÿ,ïÿ‘.ÓÏî`zØu�ÒšqsÛ‹f|ïØš›k|T|Aª?¦H˜ÄCb�¬ïBm”Ÿò@”±¾iú<n.…Wäs·eæ×ùÕ¯¥¦h:,P …@ÀbÑ‰œWëÿö»ï‘³Á(ÆþÑü»˜˜çõ“lÆÌ#sáHïì@@Û–Y�€ý~?bkþýú½>éõiÄÜŸDä@cëÊùsš˜kOzÔ9üÈË œºT|@tš™ú‚([+äÌ‚ã¢J€ºŸÔúlöÁ3~·�L'Â».˜x2”÷Ak55*bÃR>Ÿo¾�PÛ%w0&@Öøwüg�¡½€`±èLÎ¿‹õ¯vüËjù-Í²òr˜zmL™Æ‡A�v›q–®”™9JÅgÓI1¦¦§"bÓÌÝ’<ÏQìŸB€¤ÃUüåß~M›]ÑQO€¬ @  è\Î–õ?Žóûe™{“æšÔø.b%ñ×i>Ÿ&|ÕÔvI‚!!˜²‹XƒÁƒÓ£=ë‰mvE@Ózú`“o¼úc§ÀŽŠ€ß&Žg‚  ªB'sþ]¬ÿ2hD `�púX
\‹Uýû`�# ·ö°Ç¾SÅ=®#ŸBà_Ûczòhgkàüøƒ £"@Ö    :�óŸ¶þï‡Ö•¼…åÜ]>§x  ózÔdÚgoŸ�D)„y¿�ÕúÖˆÆR.žŸù}×Ø-÷!ùú›/@GE€¬ @  …ü¥.Á”õÿàaÆ ÜµíX1kž�©ûˆNò·Ö\Ñl+œ–úvî{±}ªñ*PG/ˆ)ØŒR·óÝÈÖÀ9F~æ_|åkÖJ‹¨  hÐéœ�õ?Nr[U±u2²H½�€yØÇ¡5°Þ¯	yf+
Ñ|“ŠW N=[ `Aå×Ô@ÀÀpÍîè @m   �Nçük­ÿÄÜ¡9|ö&õ2ÝÛ4ý9ÔJƒT[æ€ÙÜ \MsºŸZÎ!¾#K“mÏNž]
”°ÅtT 6   Ðùœ�õÏkþ§:È©ƒ K×¦g©ç^yA$KJVtFÊJâ¬¯Û§K#‹)*’ø(ÍèŽ@j
Ôôz‰C©qýhà¡´ å?"Ó	Û²�o|ûuòz† c"@Öèô˜ ¸ Ó9ÿzëÿa­Ÿ×¦@À ¼“J ‰¿3E@ÁØÌ› føÛz*ÄÏZ��€éïžÜ¦GûNç»º@@Zïýæx
ÿì+ÿ9}^º-P `éÑùœ­õ?çw©2¶S’'°�€,Y1Žê¨[î)àZ0vªI>¶MA0í•t"˜Ú‹jU�€ß|õ:yíú�LÐ1€Ú  K�Nçü›¬ÿ,÷nT®°Ý•X«Ñ�€ÌÂfºeö~s&º6ŽR¨‡ZŠJÏS:&¤?‘êc§Á”û¤Ò2šªÓž:#/Àßüç¨Cà’ˆ Ô€ XZt>ç_gýÇ“z>¨‰5…zfYñ9Ûœ^�WÁn˜ó{2–îSdò8˜Þvìs-\_  ™[ `èøyí;7rÕùï€@m €¥CçsþõÖÿµ$E-~—±y>�€L³‡`8š?ŸßX.XcþSª£nVÌÉÅ+O‚gÞO¯Wµ¾&UTñ§_ù¿r7ïé€@m €¥BçsþuÖÿh<%æ™æ<ý]‰(g  +bì•”q ¹¢Þ-¯éo)A¤]ÄÌâ€j¼‰I‘\,°çt¾›¨NÅí½J3§mf�}õ;äšðÈé€%¨ °4è|Î¿ÞúXÎR¦³aœQš7†°Œ?AãÈ&L×@Àð\¥ãóŒÑûÖt¿éëºx¨‹”2î�j] ³ãcJ‹äÔà“v»˜=4ùôK•Ž·Ì¬ˆ˜~ñgŠ`‰D j@ tK‘ó¯·þ'9-c“M�Ü‰£˜W `² „ië Ø8–9üÍö“œr –sSrî=h$= uRêvF*	,¦N¾™ð¸’kËE@ßßµ  :�Îçüë¬ÿ»ÒúO2’ö9ÍÎG3Å¯UXÎòs”Ï˜Ú‡jçd¾¿‰õ-Å¨þô9ÍðÛzÐlQ¡ß³.¯-°BGPæIÔ¥^Z_Ïö•HU\ð)á	   :‡¥ÈùO[ÿïÅ"ÿm)t•Ž×-
d	6OÑ"Õ—Ž‹ÊðÄNJ¦€ÀØ´‰×*êa0�š¬87SWÀ*Y¾¾@@Zzëo~ûzÊ°$"à·EL  Ð)t>ç_gýÇjþS³ñžeäç$1Št¶ó¸™îéb™æ)#jÖ=µš›ÌÎ�Ôð‘6‹ÕáDS›!L5»¤ñûÄ¶Cç@@%Yc `¦ÑïpzM�?Õx–@ 6 @ç°9ÿ)ëÿî{"ò¿¼µ”®˜¯5på�€$Û=íÈržm¨¿]2¥„„C_€È¯ó.�$ÓSãw‰:ëå`!ŠT*à’‹`	DÀÏ=xð µ  :�¥Èù×Zÿl}IB™ýïcg:h€.0°°¦I,÷˜¡ž$	ƒ6p±]©™ÝÓ×Ã5ò?Ã�Ã˜ùû…�€Ôêiq;=õfyf´)4ËöŸ=þôoþÁØ)°ã"àw}€Ú  ­ÇRäüë¬ÿ±ÅúÏvÉÖcÂ5­" há“ê÷câNR¨¡%y·Š½�Í�¥ 3š
Åd…>P�h| `®{#_MG]FÀ’ˆ Ô€ h=–"ç_ký¿ÿ¨Ü [Åx½ð@À<'�ØKúÛÒ ™}ÀMPó@�»Œ€Ã,xEµîË²|SUüG‹ ã"à×<x€Ú  ­ÄÒäüç±þMƒ@]ýßçHr&«âeìQ{H~LÐ”«À”—¢gš?ªŸæä`ª|é,9O `êÕB[çÖ—Vük† Ã"€��à‹ Ô€ h–"ç_kýó¹–¨uSÊ¶^´S—*•,Ýë227'pöÕ(5yêD'4}žç›&Î©<wÔè’úÇrœºä”s †T*`N�K  s µN÷Çoƒôºÿñ¯ÿÞêè°à Ô€ h–&ç_gýO&ÓêvNgYYÖ[›³(8;0½ÏÌãÌÓ†Á =Ò<G�5nÔŠH¬í�€4ûÎ+Z0î¸N^»þ¦ÕÐaðÛ<@m €Ö`)rþuÖÿÝ(ò_GN	R³DøSgvÊÏÐÔyê¶Û²­�Ñ“K¦ño
ÔKv÷ÓÊ&¢TÄ»)¹_Çø†ïâ›z ¨³§ÅF,õfDòS[Í»ë ™Að'ÿéïÒj9D j@ ´K“ó¯³þÇÎÖYÛñÊîË� «ð8héCI±gŽ‡çþiŠX0¦Zè:«#aVÃG¡Vu  ­†¸*¹y
@Æd	€ŽŠ Ô€ h<–&ç_gýßyð0UõÍdï‹=Ÿ§* û0Ü´Š€é°~—þd§@f9GÅ8‹jŽÁþI4ï'²Yñc›{œZ÷ò’ê³|TUTTòå¯F—P 6 @£±49ÿzëß+a,QçUtî`×yù¹²|v`TŸ¹)š�4ÔÅÎ§zÏ½uçJÔMÿ$Z;±YSOî<+fê‡‚U|óÚ¬:`UäÚ"€Ú  �ÅÒäü›¬Ý°[6^Ž:�¬.ö]þÑ}¾�€æ ¸XÃ—4@eþ€Q÷i
FÝ-TûW¤ùNIÅ�€i2©)�ºßŸ´Ä}˜„ôTI®-¨ Ð8,UÎ¿ÎúŸ$­�O?WJ µžƒÙZSEÀzã'…æ’O’SÛ«AyjZ¥í\²déÛt@Ÿ­¡Ô#TWÆÙp¦â�€ù+VÈµÙ×ÙÅoï´uŽ!üæ«ñU|KD j@ 4K“ó/­ÿÉd¢Dþ?$ùlG5è,Íò”º¶¨Ë¶‚¤¥—kJ'Î—ó98‚Éq}Ù]} ^Rd–÷“U�’Û$=ûsžRÝîiZot"0ûÓ\³þúÇùoc¿Ç%¨ Ð,UÎ¿p¸û0�ÛïÞ·ÌýTi�G^e  5<-¨³��¡ Z£?¾Íl¨œ-j¬Sþ©`st"MU>d‰ód¾T<°é�€eïâ"ŸÖ¸xH(¥•|KD j@ 4K“ó¯à|
€?îÞ8×Ï¦1“Fs±Î†ve�€RÉYÐNFÌ¸±­RŸÝS�XÈØšfGJ-šÑ �€îëþñ_}5& –L 6@�XÁ)pÃÙÙÙOóÕó¼¥ùÎœø¹ë4‘çÏêBŒ-æX<oÚüÆŒ/¢wzþ=”,}ËÔõ™né7ãÅÌ“±>Kl“ÚcÚoÃ4}~“kSÿšM•ß‹ÿ£¼ÇÈÍ[wÈ­;w•†G,õ\w<êgÆŸ'Î¬fKž*åõXùŸ••UÛŠ)k2Íõbš;€9¬“¸“é„¼ùömÿóW‚±'«B éZäýuy×çãÏÁÁÁO¾øâ‹ !€Åa8ÞðÀg\€] < ðøƒO8e¿˜ïÞ,À8Ÿé�ã ¯»ì›±$=0ƒhÈÙäo&,u=j	úã™ø÷�7õ2ÉŸÛí»ïúBs#SŽWû\=?W1ò·Š‚$Ù'¿ôl™Çh‚ì™ùš3ÍâDþñsë1/(·ý¡—^qùoQþ‹�lÙqkžŸ+½�<þÈÇ0À¢ÉðºS~Fªðe ÿ®|Àá?DÂ£~wÖÏ+&fEñ(é÷HµÀ´³iÊºNËöhX¾Ç ¿n6òçxïÁäùñi‚ä$©�ìT>ÛÅêO.Ó�ä2BzLOþLcÞ[‰ž±L«?I„Wö.€{âxLŽÎY'9Ù¾âã� € X8–î&¤Â]Ýï÷ÉÊJŸx£)YíC4\¨%Q×u˜‘,	Û@.F©¡µè™^ÖMúL[“ %Øl0÷˜æïÝ¹wŸ$]þŒeXýÄÍåo²úãú€=Z—¿ÎëQ‘Õ¯ûnW¯ì	²ãÄ/qô°p –°%bA)V{}2dçÁ£r^ð9w"ø¬) 1mÿ.L»[f :ËÝä|(îú×æLþLx�ø6žæ<Ì¶9|vDŸeZý&—RLäuùÇE�™ü™vZ…Ecžòç¸²¿—šû_â—Ëá€ X8n.ã—æäÏëkäøl¸h
^Ü§2óñ°Ë‹[ž¦ííî}ô˜Ž¤¨‘èuDU’üS¶— çôžïúÖ¿ÎêW×¬&ÐÏÁê7ælÑ3ç@¿<Dº¿w)Zf‹Aª‹øë wGâ_ê± y`ä?Ö–Éú—€Í�uÂèq8 -àX<oñ^—|^ =9Ò„@L¦ŸËÏ³>3XÜf·µ¬Ad›÷§Æ\;Ï¯�Ó¨>§ýàƒ‡sôc†@?½ˆb³´Fã¹«ÖåŸÄÕË{Ä{Ôaâç˜B @ ,{{{£'Ožðñ•eúÞRœßÞò��“&ìÒÀ…ÜMÞŠ¸€éì˜Áò'De¯®OS<”R™1‚xí–?‹1µ‘¿2˜3¦÷ˆ¼ûÞûA–@Sý²Süêô³a÷’Öú¯˜h›Fü7~ø‡x‚ h„À'ÃW–1`ƒ{ ¼iXàt!1 s£y‡c`Çgr^Ü±Ÿ3ø�1w@u„¥—©ëœ"ŒØÒû¤@s>Ä²{ï=ˆŽ¿©�~³?Þ\­~‰í­-rng;ð–ÌÕR¿\ë 1XÊL€(øQ�—ÄË¡0˜a½¬}$IÉjº'çòi†(0�¿)çßôç¹ý›ó�ïÎ3 ˜>HðƒG�ÉÙpXC ŸÁ²wôÓ[ýºóV} Ÿ	/^¹ýæŠN´”ø—vÌ… h¶`é¾´,CÊ«Ø-ª@­ÊE€‘ðL¦¾a»XEŒ˜ô�Y9ÿ”¸óåH÷Ó‰—9ÿ„…�¬Ý ’uügîsµúÓ–}¦Õo${f=çæóXM Ÿ	Wöw#ò_2â�Æ\Ð@Sðš´Š—e
 V`µç€ÅÔ¨û|3y; §ø A+Ü4îå´è-V=cf!¢Hcj`æüuFºŸ–¬S€³eÇ'§äéá3«Õ¯ÛŸYdYö­~å=–Óå¯-™Pà¾ze7S$u”øcc. Ð,¥;JŠ€µÕU2Œƒ†8ó@uÖ(·Ž-ÍÏ ¨[Ç1‹•¯{ß1ê_¨æ9ÎûK2¦¦““YÕ/>¨§ƒùËwß»_Èê·z´d_0ÐOwÊsúUEþ¡`?.¦Düue$ÖÁ@�C;@ìíí<yòäÀº»Lß[ÖØ\_%Ïž³¸E47À<öÏJXÿÙi�Œ$H'£ð�ëÜÄÙ®Å~2ƒþ˜³åŸüêÂ×@¸ÇÚci"æ¥¥¼ÿ° Ë¿î@?—(ÿú­~—÷.eæÿw”ø9>ýéO€yàhšà3ËdýKÀÖæ¦ÿã<l]  cÙ^„"À6÷ovÇó†@œ)¨ÑšO½¥@,~Á)EÍfùÛ-\æPÖWFp�Ì@txÝÿ¨C`Óý,ç�Fl�~u�?ÇÕËûµÿiRMË:°þ! ‡ë¼+à²ÅDµ R}äçEâe;™¹ˆ€Š€ÆúÊ©çJ/£€ŽåÓdKl–*!Äž&5f4Ì~>”/É;ÙÍÒÅ»¾ xïþû9­þ´eŸiõ'½ýâ"Œ9[ýU‘?Ç¾âX"â—ïC @ 4Ò°tˆj0¶þ¯€üËZÿn‘ÿúèþ¹3&,J�õO©€ù§ìÁdù»ºý™Y`)ÕUr~òô�œ�è—KHÕhõKloo’_tË uL4”ø#ctÐ8°lM�ÔZ Üqí-  ÇJ¶6Û9ztË™cð_’Œ¨GyYí2Å)n�HF÷ç³hÓF«"ñš[ûSæÅNÆ½ûrUôKÕñ×’}•�~æÔÉxöoýäÏÁÝÿr¿U—n8ñ/µ±Ðl,mS 0*ÎY”ü8›•Ÿ'�¯¬õ<¥²5�—Ýú÷´Äf®	@�–?s¨ µ©0‹[xxò�Ó³!9xzh%k ŸüDÊÂç,ñœ1+ñ›E”ÙêÏnöSñÏÀ^åóÿ-!~T„ h´ Xº¦@²ÀÚjŸŒ'Ó¹{?J	›õÏ´nµòYž´?¦ug¯—q|&×?M˜»Ukd+’çOl]Ã6ÀŒÌb î=x�/ÐO¨ŒÙóïNgê)˜fPM´’øÃ<çºý™ë(bk^äo jÉ;—m•÷Ð yXæ¦@²Àñé°öÁ/�€9nÏ¬î}÷e¦é×6¿Ô'® €èªøe¸«™ÙŠ5Õ°Zõ.‘ý:oGÊËAã»7k.4�NÉç@?*=%B%õ„ Á�˜èà…;ñhèàç5È2 $6�¢{.Óâ�ÑBVo\Ùß‹{h–ƒø%nüè�þ(š Õ<ªB ô,[S ¨ÀÆ!‡ÏçÞ�Y8øXF§=jò0û~˜Žìõ®øxð�­“åúgé:¶™µé“ëdÖ¤§yæüuë¨“2�øäÿ˜L&Ól«_1â	'ÿ­~þ\üDU¾oPpÀô¼ YU0÷ = �ÇÀ«$Ð�Î‘øg`×:ÿßQâ�ÆXÐ< MÅR§¨µ ¶·Ö’hx\D@– �‘^4AD³'$5§o,ÍÊŒÖ¿<JIA«”åš÷O~¶éœ2ÝwJ(›Tì%Æ`<�V¸úýï»úQš ÿ>!}þœÿíÖãÏ{$Ê”`ÂÚŸN	ã#ðLgG"<FÁf´úu"a¾ä/= :òï8ñËå „ h´`©¾°vv"ã®Î‹Àå8ŒîSÂñË 3’OdöÑ8�F_\I]‹Ìxsy`]* ÉÊ6’Óì ,m$�³Î˜¦¬mÚª§9¢ýg‚AcÅ“Ððæ/�ž““Ó3»Õ¯î�Ÿû¿>é¯pâ_%lÕ¦úáƒqA §89úäO&cÝ	!ãq"0aòEµJúyó÷ô]€²m€[Füð @ 4K×H~_^@F™ë@F`Þ">á«�ìgäßóÌ=ABâÁ¢\Ê^á³œ5‘è&²¦¬—†´A¦qUdý!ÿä»ŒeÇ7Pù‡¢,´Äyå?3ù'É@?~8Ñ¯¬ùä¿JÈšÏ­ùBÀde5¼fDtôIŸ 6âÓÅ¡w€OD×‹Ò¨<a™r¾óüÛ[³ ÜP¤`K‰?6Æ MÄÒ¹§ÔZ |ü�èÚ×.Â #9í¸®”Ô1=p-‡ÄÃ¸ËY’¿LÙSÝÜê¢Üù²iºwNfé^5ËÑ-3“Æœ>³“x‘<Û4 3;2ÿ?ŽÈÓÃC·Š~<¥�
çî~Ÿü9é“õÂÖ7	á±'kk¡(è‡â‰L'!ù„á5TŠÍ„š[ Ÿ½¢ß|…þÕ«ûµÌÿ·€ø—vŒ… h	–¹) +þß ¨kN –Eò@å/æ†%éP1¿Ü[ñÉ§Î;÷Dð™$ì)'”éì˜<&ª"…�h,åaÆ¢@�EG‰[¾¿Kªš®ÄoIò×ÊÅþ¡ÚnD¸­|ðÐÿžŒ8Uô“j,˜ë÷Ï=wûû–?ÛØ"dk;|ø"àÉ�ü0yø#Ÿ$«'§äÒõäÒ«×9;õ¯ÕIx<"& ¸NS_Ô‹ÿ*úÁ•ÝjK ·ˆøù²ƒû±C €Æ{–ª)�¬°ÊÛ�'õ’ÌTu�XI6µ”iEÀûtfýû¤Ãø<3'îfî‡" ˜
 ‚è9±ð€3¾~àz&AE¿(â\(Ó‘yü <¦fy
l¯©‰ü3Üþî-}MÄ¯;·LÉPô-×‰G>xô˜h+úéRùÜ?óûü¬®…–?'þ�ó„œ;Gý7Ÿ&ïê‡‚-&››äô¿ý	29¿C.ÿË7f^� 00 l2	§¼°~ Ó@hù€+ûËHü°þ! Zƒ¥l
ÔX[%ÞÉY0‡^ßw7•ÈÕ‹[š 6•/Šú—sÎÜê\çœ}òáÏ½õuröâ¤7‘�‡¤ï?�rÑeº×-MO�§·wñë±d  s³ü‰š:¨_GWå�f’¿Žìç]]‡s±"ÿóø§kâVÇ?¨è'®ÁJ?œë_Û dÓlïvþ<|ø{ÉŸüÙó?÷‚ø2‡þ¶ü½sþµY¿}G´aüñtü=â•®è7ï_¸ìXtþ¿.â/Z	0ç±@ @ ´Â°T�µ ¶øÀ|ðl�€æ¾ôV‚��ó	²“•äÄœ¿H1ãV?ãÄÏƒ×Ö}ËòyüC#Óµ°àcïßŽÈþ«ß!ý£g"^@XÚ2}Ê­WoF6³Z÷<ªœRš˜SO¿Èãö·Íù3GË_>¥Ú2ÆéèÝ:wÿ¿ÿÐÐºWWÇ¿7Ë¾¼0|îŸ_‹-Â¶¶Ù9G>øÔ'È‡û”|Ä_õ’ OýÍßö·»ÿ£?B>rp(‚‡„}òúWü×“0¥0P,2î¢ˆÕ?g�·
`$�wÛºŽÅ_†&@ Í ËÔH­°³½–zÍèNV­0y òWøc”Îòþ99¬ðyÿ•0Èl}ƒx›ÛäñÇ_!cÿõºXuä?ô‰WÈ•o]½ý<Ò|*æ›y0]ÍA�Y�Ž˜êý‡B„Yˆ½4ù“ìª&ò—Gm÷˜=~"Rÿ\Z÷†^˜(õ¯/ÜÿÜ°±IÈö92xée²öÂ>ù¨ÏåÿÖì	ðÄßwüŸî]$§úÙúŸ98‡ƒ03 7›ŒÝ`ùIl
 O
`‡ˆ €Ö`éòT¥¸xng~jþËGþÑ{r¾¾OÃ€³^èþÒÍ|pü½"½Íuò²¿Ú¦ØöÔþØïù÷~˜œç�0ÿ|Ê§dÀàÔ�é=šyüùÚRÔ¨cÀ3�šËò77ã!MŽfäþàƒGDè§Q�%žö×sýåµØä _Œ}ÿ¿!ÿÆ_ôñØ˜ó^†Á=7?ú}äå÷îû¢á„°õõp‡‹:Ð91 ˆlQØA€¶.€$þ¥[! Ú) –ª)�ÄúúZôÃ-=ˆ2ûÊœ¦eÚAL-ø#"ÿë¿¿x 8á_¹L¾Ç_|Ål‹ÕO„µùîÕËdË'8:ö©§ï€ÕqmìGT¢#Q\CcY{¨G3òÓ™Úð/›ü5]uil.9þ™äoãñ˜XRÿÒ�ÙÌýOûQ  ŸŠaÄÛÙ!ý«»ä%ÿÔ¾,ûâš¬ùÏOý¿ïû»¸}e—xçÏz|Õö5èÍê:xí µ@‘ -&~BÐ X¶¦@òÇªNL=¯œcT×nV+4�~¶ò¿¦à´˜;Cƒ¨0GÖBâ9¾z•ìú–èeŸ/øãœ ›ç$ä�SÙÉ‹WÈöÙ™¿ÍÐ—€+a¶€œÇ…g"'º)ŠŸæy4î-p©Y«MÏ¬.ms4Ñ¯‰ÈÏgù'_?|tUÍ‹O‚ ‰ÈÝ—îÿ`
À'ÿÁ§ N^z‘\Yí×‚»þwÅƒˆëñT5¾Îó—^ ç/YY•Ãë#¯ó¼ÆÿÖx `ðýrÖ h9ñKÜøñÿq4‚ h‡ ËM�tßiV€’qá† ,‡À\µÍtÊ�ƒ%Jc:«-/IÇ'Žá¥óäA2œpv¤µé?|[Ÿù¯ï\¼@¶¹›yº™™R3`ÖãO-B£ñÖzº!€±¾rÎßêöOˆ6ù“Y¹Þ4‘ÈŸÚÅ þ{øä‘ÿ×S\þš2ÁÊôD8 ®Ã
÷ÆË�{™Ö6Èó«ûäÃâz\ôç•kÂY‚g\Ëï_¹LÎqò—•ù¾Väµé‰>tÎ5¬ócïRem€ë þšKÃú‡ h:¬bú¡ÆjøìÙp”Y¢×ÕÀ2�‡æ iIíC)ËDáŸ ýÏ'òéÖÙÜ\Håœò�$z*gÃ_g¼µMVNOC’é…Mk˜ÚáÇS¿K‘ß¬%p1ò'9-¦mçkÙFìç%ÞI¬óôé32M²­~ù'øþJ@OÌÙ"€O¬“Þ…sñóé˜-‹-qšÏX(ÎÐ¿x.œ:*®Fõf×¥L9ßù‰†k 44‡¿ì~ Ð*@ç‰_'x[àgG¢úZa‹ÊÖ�-AôÔ^X‡h-Lw±+yÿLf ôB×3'ò3ß²¿è¿¿%ˆ† nŠËËûËHòÙñ¿óSî8|šõCsTÊ6°lYª2`<PÔ—7Å‘Ýò×Ïß;4õÉé¯™�!�?I§2‹„) 2“× XS2§¾ÈÚÙZD×Ž¸&<+c]|êO|ÝÉæ¶¿‹pQUÁ¾ð$â Êÿ¾ ¸åÿÏƒ¨BüÑ˜
Z™(@9t¢)Pžc—µ ¶77D¹‡ž Åz´óü¦Á7«µ¯ÎÒUÉVNôdá™0`t~'"ùñ�d3æ¯IHBÜ}ÿ‚¿.V“Åkä<³lTë¨ŸçïyÙäŸ´Ó£fÏ@ÕýrÄ¨Gwz6 ÏONIXÀÓ�½FÈK"¯E_Äd¬„Å˜ÎövÉÿ|žç�_>³*kM‚mÿ/_ç¼¿îáþ.ÙyÿAX×¡¿UtŒj74Ÿÿc5 cËBürš ÁÐ´Ú]•W´$k8~H±g/ 4ó¸³òÞgMxÄœ3í‡íeûaà•Íµ�üIHükT!.X¸Œ{V7ÖDö€$A2¬§´Nˆ–,¤Kã¾›Û?ÍŸ;Çßt¾™mŽžX¢÷ã/=z¢·ò�B€Ìš-ñ¿A&9ež^:dc®q]VyÙqÚøµÙ`áõØÓ5÷/] Û< H”m„ÕæNí‹XâïÄ˜
°DhkS 2Þ
µ€ç1ÇTÀ,W?32¥ôl† È A�žtÑËyç�p&[[dÃ'ðˆüÅ�cEù¡¬Še\úlø„5ö·é?ä/ÜÙÁqF-g1)Oº$=O&zò§ßËh¥“"9þ”Óütí�ÅŸÉdBž>{–ÑQëÀÅXè=¥€…€wœîlÖ}Dþâ!ªþÏùu’¢ŒW§˜žÛ:†1 +Šû¿? m8.ïíj= M$þŠ~â'~M€  ZçhES *§)x-€]”˜`Ž BŠ¹þ“ëÄOÂùúˆúdè“Í%áö,�$›¾°>¹ X‚žìì�mÞð¦/š	E#“ô<b�×g$Óò÷2"ÁUKŸ’‚~¢5¼¤JÉˆ	¿ç“§‡Ä›zÑr£ËŸh¦B¤ ÊÈè‡Ý¹Gfc-°ì7Ä9—×„&¯‰¸\(ðmfÖ¢«#m~ ¬0+kÜâ‡õÐZ4¾)PUÇ•¬Ð÷‰ÏO�çøY�e,6q¯�üO7Þ!é¹oJ¢N}‘¥.E€O8Ã­�Èò_?N0=Y4�Í<rî™o³µ"¦"³B¼üá%HX9TJY®ò¾Y‘ü^’üuç735�‚øÒW˜‰)•Ç�âBÐhõ+ä/½1ÑuÞ˜~HÞ¼àÚÖz`Ù«sÿÁ5Q€ôÐÐ°¾µlKU÷¿Tñþ4ô·zeßhùw˜ø!   ZíX
â—��€«>ùñ¦k$³'�®t¬ÞÂ4{”2§u 8´º•ƒO4’¤Ð]ÐTÔý_óþ+ks�‰¿œGx®zo%Œ# b€ôbig³4ÉtQ�ôr�V0_uÁ~ºkE,$ÃÑÑ1ŽÆ„¸Xýqã_dvPqz¡'EœËÑÎ¶Oè4°ì×UA¦\“ž"äÔßfìo»&‚
CïŒ" Š:æ¤.ï]Š®·K@Gˆ_®ƒ&@ í Mk
TñKë_
€5Ÿ4OÎ†Aå7f'Ë—ò¥ÌuÞß"h˜zÆÔ6ÀB ô6VÂ9f´ =ÙHÂá"€[�}›iOI1ÒI¤ˆ˜ÒXç§”iÎA¾ê~:ÀƒýòFú3Á?’Ö¿CEÃôQÓÙ žážÛ	rû×¤W††ƒ•ËßØªX/þóƒsçÈZT01Ðð€«Wöcóÿ‹.à3ç&Dð @ ´�É[­“øu"`sm�<eÏE'<f&¢ó˜Þ7� ¾`ÜJÕŠ³£ž‘MèRõûûdê[òk\Ð(D#­µ„L_ü`V"O@/Ø¶OÃ 3&çÅ©ø,é÷ÌO‰…ü�rü‹¼Öy_,óýIË_<‡äøô$Fþ³2À«?ºèr
€*^ ÅLÖ×ƒ¹ÿ5õ�¿È²ŒD™j+ŠW†o3á-�ûý´ûŸª’®™à5 –�ø7–.	@5`¡M�æEü‘å%< ;[aÙ×d¾²« #8�%D‡Öª7¼Ž‰*ˆKZärÎYÏØ'õßŸ¤
)¸w`…Í„Àpc#8aa!Q˜{ý=ÕºgZ‚gŒÙEKvô«¦›Ÿ[šŸ!¥OyïñÁSmš£soé¡¢‘�Ž}_£$v]úškÒW„Ùšã@ ¨®ù(Îÿóòí%= eˆ¶EÄÏßG x Z‰‘¸qçÞhÞÄ¯1ÿ»½½mŸ²TS£'Ó6óÑ¯¯[—æ²‚Rív9Ù¬.sh”º7Y[ÒÍdŽ¹t÷'­Í>›‘�t;ŸøÛ®Jò'"¸PnÈâÕ “Ñþ„¦�Ÿj¾Or‚ÅFþ,…˜öd½•ü•?¼ÔÓgG	÷œèã†tQ£ð|õfçKfeø¯½µÕt@¦F ô ù¶±ÚªûŸ6; ™èÚ ,A×U Ç¶7~ò'M€  Úé˜gS EŒ¤ÄÀ%^{�ç³³Ù2¦5þMe{™Óú¡ÇØKpÓ¿Ö¼TÏ"òéL\PA>MVWB�ˆŸ˜= TYÎÅÂØßvƒ*äÏ¨ð4ˆ{�yZAP5£i²×ºýí1 ñs™,”–qñE�Áz&òçxzø,HSKu+4t0LË½žâ	è)ñ" rm%
Æt +B”Ñµ•ù÷h<@^û†fð @YxIˆ_õ¤ íBÐÖ•Òóú¬EìÃ´Íïˆ'"Ý™¥ÈOjó®ÿH0jÄÜ' ¶œ+én–>LWú‘+YM3KÚŠªËY>¦+¡ûŸõ¤  "@(†<ÿTSÛ±“|Á~:ò§ZO ›M‘è¼†M‘û?NôŒe´3Ž�8£2VBÆMÂæi|ù+sÿ:QxgèL)€1÷¿jý77`k3¬0¢ K@üò= B ´Ú°4Ä/³‚¶ÀýN&ÂÚ%¦P½túŸkð_äu`ù;ÚÉz‚x“õùE àÔ'Œ›Í1÷H<Úœ$Þ§â‡Ã·ñxãÚ‹\ÔP’¨%ÚŸR­ðq#ÿäùµû1­'@ù¬„¥NãoGKŽOOÉp4Jª…„Aãò�Íÿ«îx%3CÄeôVû±¹�€�xv†¬ÓÀ·•Ó;Z÷‘ßêÉ E‰¶eÄ @ë= µ4jñÇ^¸²ºB†ƒ¡6��rÿ¬©z2÷<F
7ºa½8ñ%æê©/bdê_Ÿ˜ÓÅ¥ÑÚ›ý£èuA0átƒtí{³^¼†T?êbùgåðWQÜGãògDïÊòäYL4¨e‹	Ó[ýú8e:Fž?a±Ó~?Eü:�Œ*ÌdZ í+eElF)òŸöÅü¿©`G‰_M€  Z‹ÊÜW‹šßÏ³�êX_[%Ç‚ì˜Îh2Fç›[Ôê^'‡–§ðOÃ‹æ}™R¯_µ •PLîfÕKÀŸó²µLØ¢³4C6›¶às¹–4À*üä«üg'“õ>�ÉñÉ	Ñev0áe1OhÞW,óàµS¼ÊdŸ¤c2l"@®ßï%,þ^¤_¿àêåýÊÉ½Ä_ù
@ ÌâQ¸)Pˆ6È³Y-€õ‘@í‘ø9­—t#sÐ_Œ5eì˜šA�Øm`qúdÓ#ñÜ“ HZ�T¤ 2Jâí†Uo15ý™}HÖ¹ÊæslÄ£÷XÊö&þ>KS Ÿ!;À8M¤Xé´O£¹ùÇD •å›nÿ†záê~®À!þ`üü©Ÿú)4‚ h½ wS 6¿Š¨ÀÎ–œî¶–²5~K’.Ð¯Çò[þ,Æ^¢´ðlÎ™*½â)±§‹§<}Nð½h!õÿC÷¶’¹` w'í–©ìgx]ÄêWßãÇ|ÈSÿ˜�Ô-…Ÿ4ä?»&²N¿˜à‹åofÁeí«jô³î�çÙ6ÐâG`€.!WS ¶hLÑÈp>¨Àœ,§ü}C,€>'ÚLþñ—^˜^æÑ´,ªû$óþMd3;R ôd‚B¢*¡Hô¦„YRº²Ík¾ßdù«güðè(Èÿ':¢¸‚ŠÎƒ&GŸß[I1æ"zD)¥Zü%­ÿy$^ÙÛÕ¦ v˜ø!   ÚÅ%~Ãuý¶RÈZ Œi™å  ‡ÁÄc	C2ªÝCÀX_¸Û½Ùú�ÒÖ¨Â..Åb#RÁ€a|"�u,”m u‚&IîK?žªž$ª'c±Ÿ4›3-ÉÛÁáá‘ÙêgDÓÚrÝM÷5.ƒHNÏ�N\ÿ—÷/i-ÿd<�I  ÚkS ®A-€@yæÒ¥†b@ÌRÊ6õ£ÛZ\æ’¥ƒ=$|.ù:ÊáwCÊÝïÅò†S J3 ˜el;æøù	�@ÓÔFºó%&ò�Iòw´úåggƒ0õ�¥§"ò4€jjËìE» ¶¶6ÈöÖ‡…¹®SÖ;YS/x   Zï¸Ù$‹¿îõÕºk«+äL\ió_O„˜²ˆc–½…ìc–¿|êÍró“´œfšùd‹µswKË›ª)€â)2[ófWî³uòc¶f>,U MþÿS¢q³î�Ëß¹ïCÖ=ÆÞXª\&Fbq“±ïÀÑw¤”Þ†Ò¿ÃzÀ•ý½è{›æÿ;Hü¨ ÐzÄšu•øUÑ#W}p:µ\žÁ#‹üCï½fÜR; ¶ˆR‘“/ÉÉ“~ûpÀeq‚q¡‚è!ÉW’½ôˆ2ÀáûžÁ’'Î}²Úø²gçOñKQ)“uÿ§äøøØ°-oõ«sHòÁI�ô3ÚL§¯G0É3�VDúóÃ¾Rx^õÿ@ühÐ	M�üü•Eð™ñ« Nþý~Ÿ¬ói€çÇb¹¹&¿–äŒ¤·âqqû',ÿè5›Êç,±oƒ%i³6rdJ’Ÿ¬ýÏßå‘íÞŠÁ~Vb/9ßŸxïðÙsÑÜÐ²ŸÂä¯£ñ�¤0ó,âŒi™û.1Ö3nÔ€%!~‰?ýÓ?�&@ í†¸ÁK7j:ñ«�1ÛÛ›Ä{˜0º
Ìû[Û(âÂÉíO”¹î¨0…y¼Øþ¼À'@Índ›µ©Æ=DXü<$„‘Û4†ã”€EÄÎAÉ›Hœ{NŽž?'ysû�ï3ÕêWÞÄ#Óµ¾/°â@eÉkÁ×„ÃÄ‹ßŒ•MÔ‡®\®½pÑmë4„õÐzâçn» m©DS 6¿„œ8·µÚz˜g¦üÙˆÐóôë$	QWÒ–ÎºòÅÄ„ž˜ožû4€J6ÑÃc¢+žÜ§Ò˜ñºï¤~Ÿ|Å}lóý6Ï@òuÿONÈ4p©HïËu³‘˜ûß›z!™;z äzÁ6SqÎYª;QƒÀ¾q
`Ä_‡Á°€ ��5 +Ä/­ù÷ÜÎV`•1µæ=K;‰ÓÅk²ŠÙ°¸¥çèöO‘_D,Ê>¼™Pñ|ÓqÚiû"ý.‘t Ã‰[œS	ŸÍšÿ$¼)ñ¢õ~XÎ‡Qè¤YÞ}¾_/6ÔõžWoõ«V¹ê¦�‚&}"œLÉÄwbIò�ÖŸLÃ}z†Ïh 'àòþn¡ÈÿTí«:µ €ö{D&Àõ<Û´‘øÕõdÀîÅÂŠVÑ²oçà=õu�™]ãÉ9ÿ˜¡ËI¥¶þõ¼™'€ç4|>á@!•l¨†p˜´49áH‹? |oæð”>	Òq­ì—w¾Ÿ-ü<îûÙ{Ãáˆ†£ú¬~µx€ô”01E3“±8Ïòa ê:|¾­º¯ð9Ñö¥¨ó÷”< ª2À-!~	4‚ èŽ`ˆ?é	ØX_+Þæ/]Ø¤ˆ]é§ã‘±Ù��£ó|Š‚ÿù¦þªOj>I0n)úå>õ
’Ômˆ\ÿ,´6ye¼	o‡Ì÷5ößáÇÉóå'>	þ
!<±|E´vñ„äù�zéŽŽ�S„Í,Ý§þwõøt�z½� ùßÕUÿºŒ‚sþ“éhBÆ,$ô	›yg´×ƒ…ëðuù6Á¶\¨ûýÇ ü+BÔÙî{k“× Ø$ƒÁ šR\âG€® ÕBÛ¨îâ=‹ ~uPäWW×ÈD`Î–¿3Ùy$îM×Xù&ò�ºòI‹ŸD…‹¤…(ÝÍ^ÂÚ4‘¿\'Øf<[3o–öÇÂ» ½I�ðáó+îóýúf;ö(ÿ<.	.lNOÏòYý,×Í—È¥.{¤9i5)´ÏŒúqžr-øº|¾mdù{JüG|.)¿·¢¦f—÷÷#â/R¸¥ÄŒ—?ó3?ƒ&@ð tÎð™.Ü�y[àÓ³³ØvÙsÞi‚Óó)ƒ6Ó‘Ÿ±­øWx ¢ô<ßâ��?àN'^dmNYT%Ø8ß<e3Â™rËŸÚþ¾‚üs¾ïiHW,šwöÌ­z{|Ðïi¿{Þù~×@?�‡ y¥�Õ´Ng—?ËG‘ñË‡<—S²2d>"$�dr¹\ŸoK§Óø>ÕéŸBæ­­™Ðå½‹ÆèÿŽ¿³Ç€ h®“9t\4ñKË_
€Í�rpx”È¸2Ïg¦£ß-S²hOŒ³Ì.p–´tièjYZæ
1x“IäjžR³µ™´89Ùpï�'@,Å0JbWRuß—Éð†|õüó5ò1x,e|ŸŸœh—W;®¦þ©"€€!
‹>ŠÎ5US¦þ�ÅõàÛðmå~H"î£xJ@}€+j Ì“økè ÐHOÌ3_Xg�þºˆ?¹>ÿ¾;Û³T@Ïô–ô-cÝ2Û|wŒ¬V«'Žu*‚õ¦q²!#! H:ê\=$�ÅÉ·e
Ù°©s?3…xtÖ=åë=Ïð½Mdo?&AàhõËeÜõÏ=Å‹úõï‰/ÈÖŽŽÉ™ ô›‰ OáaO%®Ë·áÛò}�©F”,5àÅ«Wœk t„ø1ÿÐ-ò—D(oê¬TÀ.?‡ô œ?·‘Ô‡d÷1,³YÃ¹ÉŸ‰ý"/*	ö”ôF£€<¤ÐÅ¨Ñæ…tz£¡pý‹©6›sŽ‚ÿtS Q™b¥ˆ�«Ë¿d”¿ùr‡ËžŸ´üsÞ§Þ,e2zÒ€¿h „Ÿ¢™Ð¸0“bl,<|]¾M  ¤˜P÷­fg4‡ÿÉW/GùÿEÈxŽUûª"~	 €n�VS ®¿9òÁkl¦D¼kë°¬:öÌi™ÉåŸ"ÿèMAÈ^ Çbè| }"¬Ê(fŒ*†ª2÷XœüûÛV¿B6‘ VzXGðÂ�QÈÈèõ0¾GÒ]û2¬~y™xô|Ðõ¯Èýš×ò'	ÀÏátdfô†r2“³þjJœÉÏQÅX`ýsÁàosŽg_LÄ¾T ~fƒpyï’1ú¿£Ä/�  �C¬)PÛ‰ßåG-k¯©C	úÉtógE¿kˆ.ËòWE®æ© ÿ� ¸õ¾rzX�C2K;“Ö&IX›2Ýl(,Îµ““h:�)dÃb†ïê)V«¨°ON—¿z‰ONÎŠß‡…* *YS90\øÃÓ!9Ý\§Èl@ òZðuNùs›sÜýÏ÷!÷7õ]
øòÞnª`Ç‰_^> €Îa$nìWšDüUê<›ëA-€©Ë×ºWÈŸ2KÚ›.ØO·LVõãõá{ÓÐ]/¬L&¢rê[�Ì'�%ã ¼á„îfFÖ}Â”ûaÒêäB ø9÷¬™ÞP¿–§¶¯qŒòO½g ú”'@Oü¡aA&›Q²Yúd�œ·�À§>™Ÿìî„–=›MÈJÒý?Öÿ	¿÷üm¤€ Š0‹>§ŠF]ž<ËãgŠÖ h!ñKÜð×A €Îz^©“øQjØTH=®­¯‘ñé@¤Ü‘áç�ógAê•—‘ãoöÄòôd o6_÷Ø'ë±? �ÉÙöZäný|3é#²>Ež„�ø½Ù÷§^‘ÉO˜H sœïw­åol‚§�àÁ^Î9±Ï§¶‰D€" üëÁ‹õ¬>#Ï_Þ#'BpÉlŠ†ˆçRŒñužû¯ù6A¡¾) Ø4Ö¢L0pOV(®^Þ+T ÅÄ5NM@ t
" P·.™ m&~�àµ N|kšR¦LÄ‰,Mlúea?’+ØO%Yoiçÿß�7ç‘„-¢ÅÇÃ9ÛZÈÄp&çþO¹PŽÃÊwaõGV¬D[¿ ùzê± Xaa«ŸdöÉ"~íÊó……ƒ¼&ÒuÏ	|<"›OÈû¯È1Ï7]#^éjˆe|�#ÿÁ·	ªÿñ}HO@Ô�©<qË{»*ìíæ›ÿï ñG 0@' fˆ@@k&@Wˆ_ ý~Ÿlom�'‡QA·�9ºýc$èÑ™H’¿ºŸ,òÎ¸7aÊ"’ÈŸ—ñõÉ‚žœ‘“K;Á\ò@±öcîf±Œ·8ÉñYXw>(,\þ^øa  h@”QÙ�Þ	j
y¬~ù›E¿Î¼îÿÄµŒ¯ùNÈ¿¾¨•g†¥™¥ XúŒ<OÉ‘o‹¿¡ ~Bfsÿ’üùºž>S€ÌPê2”Ìå7M¨÷ ì§:hvœøå{ð @ t‡üÏ¯wÙâO®#�Û>ç´”f8ÌR¿_OŠr€"ã{4ÃòÏ1À�'˜N˜DV?Qjø¯?;"'/_Ž,Mé	�”¥š)óÍëÏžÛ²(è,œwfþg„e�§	æÐ§ù1™ªXq-Wò¬ÿ³AÙ_Bq×c‰ ÀqX³8 gG§äpýyNÂs~&„ ‡¼|Ù!ß_÷ÂPÔû—û‘û­(�jÏ{qð@[€¿|Š&@ ÝÒÐuâ—àäÏEÀ…ó;ÜÎ2âÙçümîA6AÐ^Èœæ—°úÍ Li$„€°4#â�Èšo9>÷—÷iMÎ]üŠ»y,ÉŸ[œþãÈ_—[¨žlü3‘A€ÓDd¿2`ªçÏ½%=–«°OV¿ÄÔ?æÑ¨d<VÑ"@Á_/dÁc$øÎÈúÃÇäÉþ¹€àŸÏË†ØüX¼÷Ô<á‚Ì_—om/÷7�Îâ2ª÷R%àÊ¬€ÍÐ!â—À @g5ª«Äoˆ_µþùƒ $Å‹íxÌbùÛÚÝÆžS#ÁÇ-è8©èCQ¦›y"J?t53Èç[ÀÇÃ9^Y½ Š`dVeNZœ'ƒ¹p:ðI?ì8LˆÈ6•¥�•ã±6óñHÏë•nß[„ü9fMænÿÇõxÓH��}2ßyïyôßG{”<¥¡¥/­gD�¿¿é#ÿ†ãë ðaæ%ŠU€*Ã y# µP�ÿ"¼	†íäø@ tÓ@”¦@]$~�¸táüÌÒÊ¨ßŸÝÔG³Ž‘þ‰e,Þ^/œbºóqB�äÎÿKwóøÙ	9ÜZæ“w³¿ÍºòÌù<3Ihä¯Ë·a²½¬:cÞ8r93µ1g0ŸÜ¢~@Î.K Ÿ±Æ?Ñº˜¼vþâ$À¬2#·ÖÅü¿ «Ož�Ç‡'äý½ò¾¿ÚyoÖø‘ÿú}ñ8ô×yÑ_7 Q€Ì¨nÞ¾JÀ•ýKÖ€Ž¿\ë ›Ä/¦ øË )PU%�›JüêwjðïË-šØ€Ùò7vô#½4é™,‹G Vd‡[å´Eœ‡S œl|Þ'�ÍGäà…]rHÂ ²cÿ2®‰Íešÿ€G›?zB<N4Cá�îfOvL’¿%¿ßK=ÊH®€’V¿Ä@ÓÂyÞü?«(E ¿&¾(áÝ%OOÈúý÷ÉÝK%—ièþ?·Æc“»âÁ×!'Çá6|ÛñhFþžW© ~Ý”•ÞåÆÆ&ÙÞÚôù,U¨nâ¯K48~&š A tÎâO>·¦v�øUë_>66VÉóãÉ¬ä:³‘¿aþ¿G"òÔ–õ%$áÚ×{b×Evs2 ú¡'€[ìÁ|1÷ÈÆ�'?ðrÐë®å,ˆCp(ˆŸÏ5?žxäÂÑÀ]ÍL‰¦ ØŒt\Zø†äï•¯åo°üm×ôl0¬êWPœü¥ ˜Lc€äì„÷%&¿û&¹ýý!h?Øä‰ø(þ÷¦¿Ù�ñ”|Ÿ¿N( NÄÀpvM¼:*–ŸàÖ‘à¿46‚5  :Gþê{¦TÀ.l8”µ 66È³ãÓ™wÀ�óoÞë‘™‹•*Ö=UÈ�*ëSå¸¨z’Ï©¨º7õ‚~ñAú_læ[ÁgBONÈèñ!yÿÅ=²GBks$¬Í§þfï{¡»yôè)é‡S þ¶Á>Æ¡ëŸïŸNåôŽ9ù�)‹õƒ^ñZþˆŸƒ×ýŸ–NýKXÆ…E€â×$°æ}Rï?yLÎ¿ñ6ùîÇ¿?Hý»$>ˆ²wüÍø2¾NäfA€Þ´²
€±C¦½x–Gìï^J‘ÿ"ˆ¿®Ž�–e  �7»jñ›ÈŸîln‘‡ìI@~ó´–k*Š?áÂ÷¼• àŠµ²1šÊ²X3"ù>wÝò >é>A€ãAän¾pëy÷ê9ï“OÏ?»=ðŸßóïrÂ¹ó.ñN9Ùœ
KSz¢ ‰¨Öê�IFIoŽV¿D5sÿ(€(·NÄgLC�L`Í¯®ú£TŸì}ã›äÖ‡_"×Îí�ñ9<`íù1ùy~è_¬çá6|[¾¾/&ºÐªèåwxåò•èZ™¦ :Fü±±‘5´7 P¢¦@‹®Õ_æ³\ö%c Â¶À[¡7ÛcJŸ=ø�Å;Ò÷fY[†úöú`?Ãû$ÙrWœéM[s&ô¯R( VßŸœ=|BÞöEÀØgå‹Óp3üw—Ç<}F.Ü{�°ÓÓ s ðŒÂ€ÂÐ \ÎaC§.~á|²GLå|ËúéÀ	gÄ�»)
@uÈŠð¬œð<SÒó¿Ó‡ÿúoÉíŸÿ,9ÞÚ
/ÿ|èo¾Jz�SüúÛ€áþ¯¦ PZôJÏSñ}¼øÂ¾1 °‰©|íM€  ºïð	1Ö¨nâ¯Zdä2ðâ…ó>ÿ+iMšb=*1¦ÈŸ{tyü)Òsó¤óÁ=ß€óÍã¾/8†Á Y=­Íï¼Aîìÿ9ñ­¼ó‚7žéfŒ|ï·_÷­Í£ÀÒdágý ¦³²³æ G’"vÆÊ“žëËûTzÏ—ûÁUÂ”TÀ~@üÓŠ Í5ŸÜ?ú{ÿ'9üøÇ|ò?#çÞz‹P.Ä¡x<2Ã³D
 «±`¹8€«W¯¤b :Lüòé2+æ@ t�üÓ ¯è2ºBü!gÓ¨Ðùs;"~�BÀFþº, >ÿïéÐ(
É_>çÆ&-iXv–õ|ï¯„Ãü#X½{—ì½~‰<þÄ+ä±rÌû¾0X½s‡°cŸü�Å|3 ¾%ÍÆ²û›µN½¡¤/�nYÖ}ä”þ�ª¾ñ«‘²Oƒz|²O€/ z'Çd÷ÑÃðý©(,ƒGƒÙüÿtZYý#ýóû¥DÅ•ÝKÖ*€#~uL  ºGüš×©L€ªÈ¸	Ä¯ñz�Ý‹fîl�éSøl‘û„Æ‚ýˆñ9IÌ÷'š
%ƒèT‹[†}NóJ?< +ºN,°æ/þ?ÿ/¯�Cž|òÁ»»ß~�\¼öZøÇç™wóÙ,@Ôˆºæ-âÓcµ[ýÜõß¸ùW¦4��¤*/	?§2; /<R"`4«0V¯‡Wy
`•€+—÷j­Ð0âW= ˜ÿ‡ è&ñkÜ]1æi³Ú6âW=[›þøÜ÷Ç`™
èÚ²7,ÿËãxLOz.óýLSz˜$ƒƒZüÕD”¦b0ÝÍ�5¿¾N.ü—ÿBÎÿËÿ'È&ÌRÿ¸•É…ÀP™oæËáãieöM8i-}`ÑAôÔ/UFÿW/¦áå+¯e…@. ­ÖúŸˆ*Œ%÷Z#ñËûÝÜð+›þï„ÿVx†ªk 4”øårx   º/
„E|=Ï@ÝVâ—ä/›>yq‹Œy1+œÅ'íµõú=¦iT8@ÙGj:`d|¢²ý^Ô�†�Îü_Çjhm=¤:«òyÿÀýF­³©šû¯Ë ™ï±š‰?Óf“¿ü;Ñ—Ò3Ð›„×"°þ –ù�¬~¥ùOÝ–fÁª€û{»Â‰áUV áÄ/Ÿ¢	ÀÒ€ÈÐUâW!·67É³££p€cŒØÝøL†÷è=*Ö§‰u©âò§‰ã¢	/ UÈ_YÆ-·`÷^�*Ædºl<ìG„ê…�XÂBJ¿ù ¯@Øö—$½ÍQ/•è]Þ#ñï�:ÿÅ#ÚÃÈÚà_¯CtmDgIþ’®Jã‚!*ôã%‚þêÿž”O‘ü=ö*¬PG¹Þˆ?æ  :Iü	DM�ºLüIÀÎöf¼Íˆ3ù‚‰ÑXõ<kU?Ó|¿ÎåoôLÃ–Ã‚<" wé÷úá2É!žÒI�×û÷¼Y[aÏ›Å;0ƒË?OaŸ,¹ýx<iú�hfUó ~xg"òî’bZIïLYüs™g.&2®ìïG×¤h€–¿: �&þdÀgºJüÉõ‚Z çwÈ”……€</Ãí/È.˜K¥,Ê ˆ8IÚ4q<”(Å}”±žj¢þ#€Jþ!©Ö»À¾'âhofqÊÏuþò÷fîgÅw(S4NôÑq¨ç‚ZˆŸj®AIƒ6ˆü§­øE)–>#ñ
R@’�+:_n _ôzùã ^záò2ÊúG @gÉ?±ìº?H|&+°íÄ/ÉŸ?v/œÒ›J§ÉòWJûrÒíeXþ¦ç)K?;(0(}÷Ò’3$�0ÅÒê˜0áò—¢!²>"ÿçè§/ýÛ²W¾÷:èð¢¨�:Jü×Aü K%xÀ¼ˆŽ?dm ¬páÂ91H‡¤Ê¢úY� ò´Ù¦@¿ÁÛÈ>%ä[‘óŒH÷3	ÜÎÚ~^²`‹(YÌÒÄ¯­óôÓa;²v8 ZÊ§‹¼|q —÷w#@V€¶2+
€ X& í
ØFâÏU@¸ß£q1£Š_ß˜Öçå¯¼s�`|¦mÏËâ¯)µ·ï5e3XÞÓŸºù�`ý�ÆøAÖ% h~Yuyo¯t€¿V À ÐYâ—dè?nªƒDW‰_y~s¿ß'ÓÑ8
Ì²‘{xn¨XÕ±¤¯)ðÏ@þÌ@æÑë˜ð†¼«Eï^Î·Ì Ÿœd¦ž‡f� O= ^`{kƒœ��åN,JüU�)%Ç4‚ è¼Å¯»éGþ²µºÜïM ~u ä�íõu2Žƒ9ò¬¨þt*Ÿþ¹©ª Ö# �ÐYþÂ Îÿ¡Û 1.ÿ˜õ?™àÇY»po¼¿»«uýýÍÖMü�KS‚ X&â—Ë2›ÍK�Ïãsd àæö&ñž‘0³Ï³òáÞO×¥è|¿Í#�Ü/‹íÅÉêÏô,0ÐO·o^ü‡`ö¿^À3F<Wp)òÌ”éÐâ�¦B	š A ,ùËù=Nn\ øVqª)P—ˆ_z äßs;ÛAUÿp�#k^aÍ¨^€-Ê_%ø´(`‰•Ý­~3ù³,¿ÁV¿ÄÖÿÜ< ®¸,z þkñKÜ\Äý@ ,T¨óÞôm!~¹ŽŒ{à€Ï‡–?Q[›[žÎê¸ÍýÛ–éíÂ ·ÕOÒÓ ‹ôÓ€)~”s îq /¾pÕJþ#~	Ô € X.O@Ñô—¶¿
9péÂQa�)…rÒsû<…*Xš,ì#y–&ùŠüh
ÅÈž*DN. ªx$2ö(V>Õ½ÖœÝûsðÈóšÿò|óñ0–íqyáêe­ h@�þ:÷sÄ°Ä¯.ã®>Ÿ¯K+¡«Ä¯ZAü±ç N‹‘«Ó`½SªZÉéyû”¥Ÿ;Êß=Ð/áOh¥Ë?) €9
€ªKgáêþn,°ãÄ/—£	ÀÒ
ƒ]&þäû\ \ºVâ 5ÚÕ¨þÀjŠy4ì2ß‹T‰ÚLÚÑºN.’ìkP ŸM|ó <Þ'»Þä×¦ê6À%~§1€ è²G@Û¨kÄ¯
 ^`ee…œ�FAO �%O‰®w‹{”¿)ª?í!pIñ34ñqÎíoñK`î€»³2â øïbg{K[ £Ä¯Žÿ]  ó$þ¤þL—‰?x*àÙp˜²úIäþçMXúj;_sk_¦LÖ³Øä½$~š zÓkIê4í	‹&Hž¬þê[÷–ÁÔ[Üg/3z½>™NÍq ²°Jþ&þ”õâ‡ X*âW–_'‰®€m#~—ýò‡ÜÞØ$O¼ÃX—ÖØ>ú=÷H~[aŸ†Yý‹èøÜ?¨A^ ^Àâ|ÙÛ½Xzþ¿EÄ�} ~€¥jO ]ªPˆ_õ ð¯ÀÛQüL¦ÆÝûaî´fzÀ@þ¹É=w ŸŽÔÛáòW�¹ÿÅz l¸²¿om Ô1âW‹  ËéHÖ˜ç¹Ì>ŠŸ<0l˜&Ùë]vÓ­.Ê_GîÌûB­
ôËœÀ"< õ ^0Ô èñg5jÊo€ ¨•øÕYm
ÔUâŸYAa[à½K|kt*J³X¿·b [û^{à_f“£EßÎ@?¦SXÿ÷ô{dj¨ÀøR¢@Ç‰_â&ˆ`iHßô#à}xS ®¿jq°ë€ %°pÄ¬õÀýo+Þc_Æ(1öaj�·ègë'¬|š yj ÿõq¶þQø§^ >  WD`ùè8ñš” À¿\ÇØ¨íÄoJÜ»x!ì¬X<QÍyJåû
Á&-ýº;øµ8ÐO{<˜ûoŒÀÔöfïÒÅLò_D'Ï÷�&@M¾Wq
j¶Èâ®¾›rŽ0¹<k¶há<µú]·Íú\—Ïæ}Ï×VWg„¹í{Ácæò$«öIºñ™\sFîI²�¯› vMÝþ2.ÿ&Z4¬¬†x zÚæ@ü÷À›d™2 ÊþÞº�›e� €V{Ôž *ù/JÁ×™w,—I¡³µµINÏ³rÀÂBb¢ø?sÊßO.“ÿÒD ÍÈã^‡ÈG.‰_ŸÛßŸúýhCï9øþ›ãè“é$nåËÀ$�vÌâO¾… @€y¨îÅ~·nÝr"\×t˜¶4 Š@ÀsÛäñõ/£þxùßˆàÑÿ„dúeuð+è§{¿éƒRÿ6õÒ€d væ›ç>¬€‹·!Jà˜Ë�£Çñoöëê@‰_µþƒ¶Àç/ødz?˜Ÿ–^€•ú$óþ“sýª0H¦÷Eb “èI<› òƒÕß>òšéHâÊþ,À$Ø˜Ã_v�×ðû� Xza DÀ�yþPçMüÉe� ¸p> ÜÀàIÅßÓ|}�~1‘Ãêoùc€m @ÄDÁ¯>®^½b$ÿ?Š A €øˆšu™ø%ùs²¿²º=‹ßi5¬ ±äcô^ ·_÷ž] tÃê‡ h®@�xù…Ë¹çÿ[Lüêx4õÅ)¨nÎ‘Sj?¶2¢e²ŠnŸ\&Ýÿüqéâ6üaaÑ_Jãÿû²X”¿ù³�Ï¬|–¨÷¯Ë ù5{q —÷ö¢ùS+à¼¿ÛyDý—Xçî]x –Ùâ�Àð½p@àq ŸIVl»ÅŸü„ªÿÉi�>QâúƒVQ?¿ñÓñ+µÂ‚L}�&tš°ú©�øiâû –¨¼ÆX‘——÷/ã oÖÔ‹¿ïÄu?< ðÄkÜ�Ù‹ß¶ÎÖæ&Y_]Y{¢_zd²+ÙüšÜ~•ü•Ò Äè—pù³ŽZý@K< J=€­�²½µéÔpÑ™Ú"	ÜH®‹ß< KéPz”®ÐD‹_·ŽÌØÙÞ"'ggA‰T–ìÒ§	Ò#$O¿¢i€!~¸+šma‰8€ÝÝKÁk“ë¿#J €ð! –šø“ïûo–ÝGÓ‰?üd-€sÛäƒGOHuÅPØ'VÔ_ª!uý{iâ§«¿=E}€î ß_ñÀ˜ì]ºTK ¦	2¬w ÀR¿ºœ«ÿ~¿Ï¼6öšË>êþñÖ)*fµ Î®>ÿoì+jõëÖé¸å´ÆÀÁ› åéØrâç˜”†  ñ§–M�|r|¥‹Ä¯«¸{ñ"¡LôI÷˜�ìã,í^åÏDþ ~`ñâ H�¼ðÂÕÈ¨³Ð<Óý2Ö×6Âï`éEQºZú4Žøón+S/ïïÊ;¤åJï#Ùý:VÎè¨`¥O^E€ŠLïµŒøÕ1¿= ¿º<™	P•K°IÄ/¿'ÿ••òâÕËÁü4ÖØâòÏ,ô«hú½òòK/Ï“A€$~Õ€ß ˆ_BÖ�™ ÉZ ó¶êÚVí¸¾¾N>òáºÒÏ°úíä«h³àå®�ñxÔ¨€šˆ_®‡ @ �r‘
x½l7°&¿êà€K—.’?ù½ÿ@¶¶¶ÈêêjªR’®šà›t,];žºö=‘Wô3ø½Î…ÿÉÉ‰ÿ8&“É¤Ö€¿|úØ â@ó/¬ë
X§›žÄ¯ù¾ÁÀwzzTG›¹U=À9Ö:b—më Ò²$[ÇöU×=	~ï‡C2
wlñKÜ¨ûž   ZãHÈ9ð_M�ºLü¼ô)øF£QíÄ–gÛººIÞ™EÞ[u‘kB¥î}¨ËÕèÿyý.€ø9¬M€@ü KIüªELÂ*YŸY9Ï‹øÕ÷lnÏ6É²kÄ_W!¬yÿ¢÷± â·Zÿ ~€¥%~Í2mS 6ÿ¼j
€øÛKü‹lvÕâ_PKÞy¿Äu? �Á¤ÿ¦,•ëšâñƒøAü&~¹î›.NÀâ�n€¿K‡/þ÷£ý(å�€üµKWÀ¦uý«ëxªÞvQ�ç¹mß±Žï²È.—óØGËç½Nç@ßÈ¹ñ¹Ï}M6à€ÅozÏÿ‘Üä)r‹°°—ÝâoRÁ¤EXüm)#]µõÛ&‹¿Ë¼Îý&Ç¶:öÀÐzoÀþàÊøþýû7ýuF°ø³-¨ª,þº¬Ù¶Yüó¼wyµÑâ¯Ë2ÏslED…ÚèÑ£G� øüç?O«ð(  ­'~•ü9~ög6h
´hâÏK²u‘w�¤¸Ä_æ|ƒø»Iü®„^””ÛÝøµ_ûµÈ°‘" ÄßL`
 "â/¸NÔpÞîÚepƒã;ÂÕ_ç~ZÐ’·Òý:nw³ªÏàh=ùKåûÊ+¯èÜa±@ÀyZüË`ã;Ââo³Åß¤À¾Û¥j üÂ/ü! –OÈ‹Žü9&“É›IPWT7H±úHø:¢è»FüYçÄßâàyÞÛº÷!š	LÌÙ# ‚7RÓ ‹î{^ýµmÇÒ´(ú®¹úÛ)¿�ùjÇÔõ}ðZ]ŸÀÐ
‹_…Éúç7ÊDæÖaÍ-‹Å_ÆÃR¥…ÝU‹ÑVô<,þ.æð—=–Ñhdl$½ „ è<ñ»(ÜO~ò“Æ¦ó&w?ˆÄâ/¹þÁ/ÿò/Àê‡ €(ðûØÇ\æ½n€ø»Gü&Ïˆ¿^Âñ/„øµc™¿ø‹¿ˆX €î{ÉŸ#3 Äß>â¯’œÊÔ Xâ_¤0 ñÏÆ2—}A4¬€ôË`:��3tÍ3šÜWGÐ\—‚ûšÖ §ì¾‹|§®µÓEp_þ&@`x –9¬ÿ € uYõU¤º5Á®¢º`JÏÃÃ2O‹¿Ê=MòÀâÏ·>oäº>¼ ð tÒðñ�<×�Ígôû}’Õ>s™­a´ä]œ· +-yañ×¿¾K �@T @û‰¿(xS øÃ#kó˜AüÝ'þE–ëm
ñÏ“Ô—•ø¦�?¾I€V�v%-CWNwxýõ×£çy­‰7n¼>�N_™L& ~?ˆÄß&â—¸î[ô/jCµÙˆƒ (Lþâæ{›7â"Æó<‡‰z@ü#þh+c¿L@ ,+DS ßeâ_†’Ä þv]Ýâ¯yÿ7  ë?¿úåÑ³2°k¤âñ/#ñ/¸%ïÜ=
$l\Æ’‡  •Ö{™ÍÆ�Çß]YY)•	 âoÏwñƒø;DüF£Ñë r€¥Ã'>ñ‰ÒÑ‡ÏŸ?¿±±±1×‚9 ~?ˆ¿:"\Vâ—Û�œœT1 ñ0g  ü[É¶o¼ñÆ£Éd²ë’	 âñƒøAüM ~�ƒ_ú¥_ºœ\¥ÄØ8wRB °HáÀã xIà_RlÚœz×ˆ¿Mîs«‰_¾÷¦Æz‡5°T$^j?þ�ˆ7Òøq[ ˆÄâ¯–Ô—)•¯FAr½bÒ‡x€ X.áÀUt¯×ÓNe€øAü ~‰? ÷^‚È! `ý—ØÏx<~“.*pÄÿOÿôOÆÂG.�FO¾ð…/üOâ<öÄ_ª¼&êû_ûÚ×þC¿ß_ñ/ñO§Óñç>÷¹ÿQÈÎSÞ“ï³ÿõ7óÿX[[Û³Ñ–íH¸ˆÿøÇ^	þfÝÛM%þ¼ÛðŽ¦5�>ÄÃ€n€ó%j!³›ê°ÎNquîÏeŸr -u!nˆ{¸/þ&±÷ýùH÷™utÏ«sßMëˆW¦Ã_Ýße0Ùî‰äûOŸ>-Í¾ººJ.^¼HÖ××K}§*Ö¯»c b¼Üœ÷x	@ ´]8¨¯éW¿úÕ·ýß¨Ž�²iÄ/×áƒeÜ»wï».Ä/þ@u¢\ªBh-3ñ7}ggg'yî‘÷ø=UÂîÜØXÈŸ{ EüE,þQðÓþç~;9ž�È! `ý»í'xþ…/|a”¬§]Æ‚2mÛâ—(ëøÖ·¾uÃÑº§§§ÇêñÔALó&~WkoÙˆ_®3Nm÷Dòžùö«¯Z= Y4¹º²šº¿:Jüro~éK_™Æµ�¹€ˆ˜Ï�èºíMß:ýAA¹˜ëºE÷çºß¬myõÃ¢‡·nÝ:Tïäü?M>Ž��O‚‹‘3Ð²ÎóP×¹Ÿ×>ÊÞ_UîC·ÎÉÉÉsq?0ÍCrº\NÞñï)~oùVün‘û’[ÿe\ðu®_v;Ó˜•cD™`x –^8U²¦±5Êc…—±¦æ‡Pf
ààààMƒÕoœã=:::åç6hY—E_Ö{SÆj«{Mµø“8===#Ž1"òµo½Qô¾ä÷4?Ž<Á­m²ø“Ðd `*  Ö‘}r�$¨.¿D™)€»wï¾™°þ3]¼Ïž=;q™ÿ/sª˜¶i;ñWüWÕ:þ5?&nSDÑ=tïÞ½›EïË<÷t›‰_ o/j¼  Úlý§ÖßMz ºHüªµT¯¾úê›ÊÀí2°Ó§OŸž6-¢¿‹Ä_7©çùN¾ 8%ñi!›P–_»öê›Å@¶ Ä/!š ÑŠÆ@  ³Öf€Ì�7Þ’ Jâ·Yd‹ ~¹¼h Ÿ£}ç�w‰=¸+õxøðá ¯‡¥ÉÄ_&¡ëÄ/ñäÉ“AÞûäöíÛA@‘{sumÍúí
ñKøçê­¢ã¼  ]&šwÝ_ù•_9ð¸Uä]Å¶E= þ ~ÓbõS‹ 8uõ°´�øË@ˆ¿ª,Óúþ½rêàJy?~œ"6—O_[�€yæãÏ“ø¾ð…/ï   –E8¸ÆÈž ov�ø#k©  ¸sçÎM’ŽøÏÜ<xpâoñWIj:1á‹¾3Gâ�e�Ü»wïí"÷¦:Ðaâ'‰±Š–÷ €ÎYÿy]aTùQ½.ÝÔ]%þ²àÕW_½Iìn\m\À;ï¼sRt ñ7Ÿøuð‰\W¨Oìñ ½k×®
äA€Óé´s®~Ãç7ÏØF0Ð8 Àb…CjÝÑht‹ç»öÈZ>Ï~y·åÕÒ\j¦«‡OïÜ¹s¨�|2ß_µæT‘Û;::òÆãñ$yß×Õ ÎÞ®û¨b?mmÉëñäøøØ÷€'îOùÝ©½d- ¾lz÷îðÔÿ-^r¶¦D3/Wë¿!yü…áŸß·cË1þ!¿ Xÿò9o
¤z šdñ—Mïª"ðÑ£G·V%ú4/šð¯e5À¬ó‹¿YyþEÖ×:udÜ3‘÷È¿×rydýÿ,ÐV‹?	>Vãà€ €p0¬{ppp«ŽTµºòÓ‹“|/o&ÀÝ»woû<®u~×·Ï²¬ö2åzAü‹'~¹ž(D‹Þ/÷îÝ»•çÞ\[]%eï­6¿ÄÑÑÑ­ºÆA  ËÖ?5­ó‡ø‡<øhT5ñWmÉ–%~‰¼q ×®]{Û`å;eøàT—
Øö=ó þyø©âûŸ��ÙR M÷Lôþk¯]Ë¸"ª ©ÏÑ&â}å+_yÛ2Öå	„  ³Â!Ïûô�þè�ŒM�ºDüEÀ`08¼sçÎÑÏ÷'­9ªyôž?~¦
 ³òü«üþ¢÷ƒñ^ÐÜ7±{éîÝ»Güž>Ãáx×××b€Ž¿<Æ·}02�c�‘ @+¬ÿ\ÿ²Þó<ï–JP]$þ"àñãÇ·ˆƒ›ßâ GGG±T@÷ˆ_ Ã2÷
<zôÈÙÀ;–iÔâWÇ¨¼ãZ‰1^ €Æ’?)àê²¹Ì¨®)Ý`žÛêÚŸº�Kž ßú— Oô�~Y</<0�Û6¿k¬Á2¿„¡°)0ù~ðÞ»ï¾ûŽëñ¯­¯Í­Ú_À›º±«àØ×”± ¨õæsr��F£·8Añ´¢¦Ùýåñ \»víIGÿ›ÚÿjÅ€/ ÎLäßâoú>š@üŠ 8³�¾-}4Êxýõ×œy@AŽ�%~‰Édr«ÈØ"oP Ö¿úš[©7Î�;¦$k€)²¬È¶erž] Ÿ‹½{÷îs’=ÿŸÔU¡KEmøÌ:esøËžç¶í#Ïy©ú<š¶ÞÕ:UkÈ¼ÿd- µn y÷ÝwŸó{o}cãb¦ X[uJì|qu�Äë)¨cÓ<'9×)2ö¢¦ < í¶þ…¥ûfÓªöUÝ}P.s�xôèÑmGò7"an÷™- p^�ù`ñWoñ'·988PË 'ï×ûˆ>zôÐÉ uÑâOâ­·Þz³Ì/ À2YÿÔq�àñ¿ñOýÁâi—‰?oC ;wî¼ã8h[ø÷ßØå–¼ þ?~<tˆVp÷î»w\Žam5Ý
¸kÄ/¾ÓÓßù�ßyšð¶e�…H„ €ppÝ/³Yg5ÀEd59
€k×®½“Ãò§¦Ç»ï¾d¸¤¶‰øç™£ßtâ—¸ÿþ™í^põ¼þúkN�€¼ª¥œè"ñKøßñ­E�‹ @§­ùz2™|'¸@½^'‰?ºE? ƒÁ3Ÿ¸�È?3°‹×†÷Ïí¤kÄ?Roñ=9==õÊÜ+òù½{÷x=€gÖ�TÜÇ¼PžÞ- o$Æ5x   r®oÝ�²Í[±®IÄŸÇ"Íò<|øð6Énú£[Nƒç¼@Ùj€ þf¿ÄÉÉÉYòº“´Û?I^F‘ððáV/ ïÀ‰¿Hà¶Á›Þªz¼‘C tÙú'y¬þð­—·\+Ö5‘øól›% îÜ¹sÛb¹étÓ<oðœ“C2`ëô/‚øËÊq]W Uö2HÞ$$ƒeïfÄ¬fôèÎÎÎÞÒ�Y%Æ?x  –Âú§.±<xGÐš@ü¶Á»¡de\»ví±çû»¾î÷ãããAÖ¹í2ñWM¶uˆ‰2Ç"< �8ìå¼w¢÷^ý5« à)€Ë" ?~üŽÃx—§8ˆ`)¬› öü÷ÿ÷yWÀÜM�ê$þ:ˆ)k
€Ï½ò9Xâæþ·YqÑ9>::*TÄ_ï>«<! ¨ÃýÐ#Ó ï½÷ž5€êràŸ‚ÑŸÿùŸß²�]Ç@x  –Âú'?úõ¯}¬öè"ñËe6ÀÃ‡ïÀ‰mÝgÏžt1 ËHüy]òM'~E 3D!É+ ?øàƒÛ¦cYÉÙÕ²­ðÏ÷­o|ãcbì«’àAä �E•/±ü�x°Mæ4@›‰_Âæ¸}ûö’áÒ·ˆ¢ìy�˜¤ XVâ¯š˜Mü‡‡‡g¢'Ž÷NÊðî»wïš>o}m9< ê˜ä2†-Ø @ T¦(ë°þuî³èùh4º™ì	Ð%â�¬'‹àµ×^»�q¾²‚“÷ Œ¤  ñ/Žøëò>pø×x¨¹gH†•ß³üéw^ÝèX]’ _ Ü´�Y$_Z`ÓÆl `®Ö¿õ3ƒÁ[U¤6•ø³:ž��Ý»wï9q�ÖÖø©åƒªˆr^-y»Hüu­/< ƒ"÷†M\¾÷Þ{Ïù=©û¼e‰‡·*$px  :iý»ÞäÄ0 Ï=zôf™TÀ¦d=¦ >|x—¤Ý±É�Ùe@��[ÿ¼ótüÿÙ;—¹�%»ýÿ—Þzë�„ïxaÍÅèÊW×$XÛFÐ£-5sº•¦šÊŒWF&“ä	@êî*V‹ÅâùâddäšÂ_+ŒGþócî ïFÈN%(XN!<÷Èº §Y G €»ãúO&ó÷\ûà  v—ýOŠ/‚øÅùá‡]^Øö&üç(9 ‹ñîbþE¶Æ|wñÿÉ®áß¦ðç\’O«>JSp¥Z’/~òäÉÓÜ>œ öÜhÏñÓO?=2&25×Jˆ7 `ÓÙ¿õuî}�¾þúëW···/5¼Z«xá—€üÊ\”sYw1ú¼Í³gÏÞyÞwÍ
þ¾ÛÿöÛoï2ß-	º%÷èT�ípî¸gà´Ð·ß~ûŠäéG½†  îâ¿ìcî àQM¶_+Î5­oµû–+t<�µžæ^“În” àÞs¼yóæö¯¿þºÅ’¼ûþS|üøñöîü¹eÎDfÏ»çÏŸÿï²àtîžÎá½ÀÝû{¤Èê#Š!Ø €Í¹5'sÑv¼ªÖö­o!LÑnÂÒXŒÿ[³’²“×¯_¿kÙ Â¿Þöë ¨Ï‹ðâÅ‹_—Ùÿyà=À‡’0s) i  †·ŽzdÿÓ§Løñe†¼¦ð×.„Sz|n&ÀÅøhöþýÔØ
Uþ±…ÿoß¾}¯8wÜ.À²ÀQÖ¸¹¹yd¸Îµr0  ØUöOŒ`�V®ûårÀšÂï�îñ\7À<€É�ýŸâ Q½  üëoùÙzÏá<;×Ü€£¬ðúõë_r×¨Šk\  Àî\köÏÞöôéÓÇçqò…ßs—º^Œÿk„_»ÀÒ½ÛïÀê¦V€zÎÑ‡ðëw 7FÑá‚/þ^Ö¥À‹/‰¬ºn‘o¥@dó €¡„¼Æ²š*^çóÏo¾ùæ ö*üç¸¾¾þüûÅø¿ö[Äÿïß[¯ áï/üçxûöí�ã{;¾Ç÷ê Ž°ÀéôÝwß=6|ç¬	’÷ºp  lÚ)˜¸ÑÏ?ÿüñööö±E`·$üçû.€Ç�kìË±ý"^¾|Ùd=€£¿µ½o¤ðŸãÓ: ®ó‚Ÿ{çâÓ‹~ GX`žçÇ>ü(@ÓDÈì ;õ.Sÿ–÷}øðá?\Àšsøk…ÿsuQð_…¹Ö$ÏåVÇy wÀÂïe¯ð·t´�;/÷ðý/
Ú?þñÿçèÖøøñãÈ6N?j1 â@ ÐÚ6jVüwù…9UßææÊïAø— ðiüÿuPF‘Ý…ÓüñGu@”kÐ*Ëee¾ÞûõêÕ«›ËÏ:øzr®ø¼.Àj N“1¾¥b@€€® â*þ»|Ž»ŒæßçluoÂ¿€OãÿÚ/.ç$îïO­b]5 kÿÚ;ªðŸãåË—ï-ç‚á<»ç:€#¬ðæÍ›_µ	ÙŠ €M¸½
U¾ør=yòä_wÙÆ©Çî„ÿ¼ÍõõõßeÆÿÕY=sûpïîÀŠÞ¿ß]ø[-ƒ{tá?ÇŸþùŽýôýü\pw¥ßÿýïïç^ãvþ[Ýµ×[  šyÔsDÙÿÒb7ôý÷ßÿ2šð×6ZnóÕW_Ý>{öì!3þo~qûÓz ç×iž?„Ÿª³éÅ: îsDŠSÀóçÏÞÜÜÜî](~üñÇ_´×+Â0ÀvDr/¶UÆÊ�èe]ù�³¼4-m—ÿ®2¿_Þv½¸ÿjñûÕâöëÂ}—ÿ4ÛxþM™¿sï!÷¾‰¾\íOlÙJr•òdül£.,G¹ ¥Àí’ÆÙ)l›2÷§Ì}Ü¿™¹íò¾ÛÅýób»è·ÊmJ¯Ÿ¿çÞÃò=ÎŠã•;¶$Ü§ùl¹ßÝçæÞ{8”â+0P‘6·ÿI?¶FJ1$Å}Úý,µÞÕŽ£NÊ/êäØ&e^cy[*ìKrž'	_¡Ðãa¹è§‚hhn‹üì¦Ìs•n›¿�DÆ–Æ…ëWÊüÎÝ–‚�Yé9­·# [µÿ½Ù¦vÊ�´|®¶Ï¾æñ-ª÷sžI9ÑŸ„íˆ¹(¥
 (èŽ‡õ6Iè“RüKŽAôõ)-¾7ÉùÝ›
Ï1	÷QAÜµ¢šíÉø^a�}€€UádRÜ&eòÚE9HÈ,¬/EBb„_“åK·iîã„l
:GŽ”á{ï³$…;ñÞ8!œ„s­Ì5�Ÿ„}ÊÁuÉÈ‰Î)@  víxšÿÔì‹Æ9�Ñ™„û´¯OÎ÷èÒœØsÙ‹Eð%±Ÿ5U¾ÿ#eü–Çxœ .Ë× 	ðPsíà²÷¤€vî»�s&E&/‰·EÜ%X¯ÍÈ €î`àíýoYÈFÛtC*ˆÓ¸ä
PÅóHY¼”½OLÖŸ”YLZ<¶t{	’ñ| \”B @Z’HkÄŸnK=�FT9‡@šï}*\'ñÖþÄwä0 Æû «dòšçˆr
4…:5Ï#eZ‘oy|•ÇässcŽD6ë•üÄW�PašQ¼ ÍÌ‰~"}e:Z§¡&sµ~5µ Rq¢E¼'ç÷��ê   › �šØÚL<Z ­¯IŠL_ªèç„Rdûš‹�æÂÆ]ð5Ÿ/²”8 H†Ç$Ãmšiiš‚@Ïþy…É
ë•j4cûÖÚdô €Ý¸¹/ªç¹½+ÝyãÐ^T¢[xj,ÆDú£ÒÅ&)³nè@ã ¤NçÕ3� ­	�f$‡{ ¹¿ö8xê¤kA` EÍ%D\s €.`à­f¯YM+'Ä“ðSz^«Ð×ÌÛ×fÿÜOmÆ±þXÇü“ãsÄ©N“s{í”@"yH€s´Ó£fXÀ T˜«ðO™¿KY?WP+Ì5ý  €æn@�ÕmŽ{<œ‡{ß
IìTÈàO�Ç®„p€7ão‘ÕŒà*¤A_§ÖHBö¾ÿ™ÎMÐÔD‚�¥‚¿äÔŠ¶vxAû~ZÖ  "Þ#ï§v¾>Þj¯ —ªø¥J}OÖ_º°$å{Ôv
ä.ÌÒg2ªPîÙÐÀ@2üÔŒÿÏ7@šjh…›šëŽ4¦-à“šmEœp ÚH�¥n­Ò�ìWo½h—DV[Ø§É<ÒÂ	°|ys6&¡`4Qn¼#^=Ýµãù\f?;²}íP)à¡õù¡ÍÎs¢o}> vïH€QúQŽCTöŸ»�•Šö¤Ìž{3ñ}Ë­Ù¿VôSçóèhn@ds mw@"ý í¢7$ÜGÄO/låxöj¶ã…€ €M‚AË~÷bÞsŸ¤éyÜ6ÒØ~)ûçj–ân±ý5–¿TÄ¸Ö9±wá�,ÌeâR‘à¬�¥c@äkHÔK£fD_ßP Ø½SP-÷?)³èIñ{)ãöÍôe?®Ú¿ÔÓÜ"ú7  >ÛÓdÈVK^kók—¿åÉÁˆ,lÑŒ§§Cð ÃŠ|‹ÀÚm<ÙzIÐKÛ•*ù9Á'’W
;gÿ5û¯]ˆ»½fi_¬þ7(Dpâm�€™ÉìkÖ!°F!h¦å¶h	8  À=èøüšL~.jÜÜüsX¬�ÛÀ-¼|mÍ¤Ö�A >Bßr� �8{êf…C@dï9-î½„B Ø´ÈŽ¶ÿVK_“±sUüÜœýåíRÆ¯u rÓü,ãþÉ(Þši‹ˆñÀ¡G=€eH`é hz� ¹}³8 -‡¶.î‡…8 û •D¾©kÚ9ýÒß¥ùÒW…Œÿü÷åíWÂþ]ÄYú»FøÓ Ÿ÷²þÖ  -$FÄçÌýsÆXþÍ¹š÷e�€5>dý  ;é¦üygh§½iøj*¤/«óKÓýJÀåÏé–û7g²|nìŸ«l!ü5µˆºãµN ‘}‘ 9’À5²JïÇLÞì_3­½   »ÍÆ×ž"èMG¾Ò0ÀT¸M…LŸ.Ä~ù“H7ÏÙÒWÛŽ´ä\xÎ¬ÖéƒÚ‚@mÑ^"ÛÌ€™ä)…€h~náœŒZ.®  +¬Ñi/Rì5ýÒß“paâD¿d÷_îÏ¥ µž
s™¿w9`íýˆ±@@#�V×‹ë˜«˜Ð6²î§5ë_¬Û@è »rJÙ¹å1\×;©˜¯d§Ý·ú“ð¼SFô‰�ƒ¥íŸs 4ãý¹÷Î­pæù\qÑ<}õ­n@)#/eùTÿ”��«0_å v  €ðâÇ	µ”ñh­üÜEŽëº'üå«ýµ¶n	ä‰ÊË—r]Í´ŽVÛxÚëZ×ðö(ý=“¾îÀÚ„ˆ{?Ò1oÑ¥ À�äÅi,N�”sNAÉö?_˜®‰/ü[^–…}9û?g÷s¶Nøs?¹ì_tTìï´Ý-  âËì?)�€œÐÎ‚Ã`™9`þˆp 
  D¥¨kÀ@Z‰O3÷_Ê6&FðK™?eD™ùsv¿”ý—„ßbù[gm ö %ÁJŽï‰Ö	ÐÀÀÌ �Öm� !)²}Ëñ†à Ù»gr
>Qy€kæ³üÜ8¿d÷_2ÿ\Æ¿ûR¥¿VÜÇË2¼RÖoufÒÌ$x€Äžãá"   «Dt;]‹ÐK½ù¥¾úR†Ãuîã.jž9þ—b¿ŒK  h2MÑŸæ3ž=‡ â±ÏW3àq4ÙúL|÷@K¯ IÜ5@ �oëåšmµß;À  yf.mï±ñ#Ÿ	­à/E>ç,«÷‰ò�|rÙ?÷¯Dåö¾“Bøaû&< `q¼Â¯È¹3ñ3Jn)ÞƒEŒkíÿTñyÁi  ì <?¿¼®¸¬>)¶%rÅ~\‹ßX*þ½™‹¥–ãºžeƒ5bi]Ø''öD¶z �`mqckW Ø¥KÐÓ	(AAiv WõÌ�ý—  Tì—sˆÊÓý¤1"ÞÊe¬@±îEßSP3±|°f½ íó[¡¥wæ8   2÷IÅ|ÜzÛ¥†<ÙÆö9«¿–b¿ó{º"¾Ëß$dùÒý#€ b}°°Ž]k³åHí~¥âÀ’+ ™-@ä+ÔÜFä+$„ˆ ‘é×¾·H�4ïŸˆ_¢7
Kq×Ìëç¦ú�Þ^lOÌŠl_›ýGŒûöå&D÷ð´¶¬Hñ'âkJÂN¤›>HŠçXCì €]Á…¦ÃŸ¥¥mR‚‚u^ÿ¥¥¿û’õÏûå¬ÿDöÂ?dÿˆZ@ïê�Úâ@kÓ )Ó¯×·v„H  èŽÇ”\€ÒÁR[ßšÛJY>gû•­©ê_šòWvdÿˆµ] ²kk- ~Ü«­/ÝFôH …¬ pX(àÚójj¸½Rv/‰úRÌ¥Jÿ¥èsÖ?Qye?iÎ?Q\ñD0PãpbO¤oÄ9Ú¡ Í0€fØ@jA¬í(èY›ë
  6Ÿ½K�×ûi3~RºDü‚8Òj}š"¿Ò8ÿÒú'º_�+ü+Á@Mö_»\3€`_‚¯šš‰ø†9sAü´ËÉCZ0ÐÎ\Ð¸"GÀóÙ¤†ç Ð,�{ˆÊ‹Ýp?s«óIâÏ-Ñ›
¢ù·4Å/gýÏ‘¿¼�Ëþ-  îH �0Ž¸G: €áäši—Ž®˜…eUAÍq‰ø|!ê €Ý¸V·Àò³Ë%zkD*¸9 âÛý&cö/µò­u  òûƒƒˆ9î’ØI?¹‚ÀKQç²~é‰|bßR¬!ü €Mˆ»dÛç2rIìÉá“ñ—€L…msÛœßÏ-ù
ÿÈ˜ýK€å3ÜºØO¾Gqj–Ð%&ã/eÛG@[¨íH$X²­ý¯ÿG£  Àn2}kç¾x] n(€°zÍ?)ãŸ„Ì^;Ý¯Vø­Ÿ+�í‰»e{Kú$ˆœF0#Ö°ˆ„µïY:¹•pCô Ã‚BTÛ_­@…L_#ìW±ÏUø_öõçºüq¿ 8ño¹ÊDþXp ~I%€ÈÞ.x	–™V—€{möhv À&ÄÞ#òD¶Î~5‚Ú‹£”õG6÷±ÚÿÂ¿¦¨(ÆÍâ’ño‹ eþÔ:³óq5Ù¿Åþ·~F€ €+“ný8M&/	A*†Åà
‰tcù¥Œ_Ó×.ˆ~RÀ€ÇÐmÄç	ß?@´h¤]4ˆH_�Ëú-Ž€4íPÊðµÙ¿FèSÃÌup V‰(±º %ñJñ·ô]öånË� œ ¬Ù?Zý"Z	Et«`Iô‰b‹µ-†Ixî9 û_à €î0 �ÎG$7î)=ÎKÑÏA€wŒ?jIßˆìŸ{²z„UÜµÛz] É°¶&âk<õš×–@ÇRýosˆ> `(Ðtô®@Tî¨¦ÂmË1þI Rüî™æçéò ÑÊ°¸ Z °Ö	hjroNè¥†GÞco™q�  ¬šé×>§Ç(m?‘Ü
¸$þDyk¹ï—¢Ïý-% ðfÿp µ€×Ð €fiakã m�_Iü¹}ä Å
4­³xÀ  ‰x×h—ïÕ¸ 9A»,âËMÌ‰?-2û\–O”÷×Nó‹ìò‡ìÑC,"[×tŒ˜2¨™îWr
,…‚–c^»lpíjƒˆåE2¥}Çišj/úVÒ.\#Yáš1ôåmWÎûsM{ˆ¹_º�˜,r+î¸c¡DO@+>žEƒˆìóí=3´Ë“ó~Kö_*ˆÔ+Ëqw�{ÑÁ£; -¬üˆ×ç\ ÏP@É˜.² iúáåÇùKˆ)9ë¹}R €tŸFÔ[uDl_ì#� OÇÀÈÁRÖ¯… í2ÀVë¿Eö¿ö¹`Àž] Êdï¥Û¥ìýJù8"[COæoíóoqˆ<Â#îV'€˜L^ãHÙ¿Õ�2x®Æ@ZApWÙÿ'  ¢» ñi¦.Ÿ™×¿Ê8‰øyþ9G  $Ñ�ÌæýH× r(€ÈW$¨±æ5cû^ø(½‡-dÿ‡8 u€Ç�ÓâôØ†È7¿ß:·?"ëÇ ˆø˜È¢@2ˆ¼$¸7 Å6šý¦€ì  @ ½!€´h†´@T°Z÷Ï³°O”í/mQGÔÂBMa $öD¶þûVg ²–À"$8šãÑMü  € Ðº ^‘µ
üU…«`�"ÿ¢>­*þˆZ§ õÌ )3¶ŠlÄ¢CD¶Ž~^ñ·;   `U ˆt,YtÔng)û�Èú½óüˆq·:–&ADþÂ’×Žå[Š%÷¢Eö   „À.@+ðnkmçÛ£ÒâŽè	5ZÐdûAo%þ[Íþ ;€h@³àŒ§¯½§˜N“á[²|‹Ð×TùKÛ[³x  b— bÍ X×Ðº‡€‰¿%û�€{�   j] 	´Eq5 eøZ�²ø)Hü­àñGŒÑk”„U#î±¶ÖXÄ?w;w›ö87Ëþ  €5\ /”²{�³`"Ûê}½Äßûù!Í$¬«z…_ÚLßó>ÖÌþ  €]€–Ðò1œ‹¡}¯=Ä¢�è	ð¢v:�Uø#)þ]³    …`Æ ²ÍË·Œç{‹û¦ ã¹–è&ö�ÁG>¯'[µhÅWqíO¯ø[Agˆì °_ XÛhZA÷t'ä²}Í±ˆhò£=¶rDk�o½„mRl§S·vÝóöêo-þÝ³   À* 5C’˜zZ/·©™¶çÍ±™Ž51"@D6òjí´B¯Ë Ý/­óáq   €¦  ¹ ÐÞî™r•Õ·hêcB	=E ]î•€ Vìj…·Ö-ðìƒåvíqK­Î À~`ÀšŒ¼vš¡VØ'åýµ¢ïýÌ êˆµ`!9Ÿ«Æö¶«eŠ¡÷6K†_ký7Ëþ  €.€U@#Ü +XÀÄûž­ŸD±8ˆX@H#ø50V�·Š×ì ° j3pÏðBÔ½žñþQšû ,�Å÷x=ÏúÞ–¸–lÝ:„@T?ŸHñ   jD£x2/TX?’ Úˆ=Â„WÜ<õ5bíéÝßCü  € Ø2Ôw­¥ßËî�¬@ z‹ÍtAÏ°€Eô#€ÀÛË`xñ   j!À’åzmõÚÌ?,‚ßªÂ €ØJöï¶Öu^'ÀêNXÞ§Å   \ 0‚ Q«iåOÎ}õãVÛ"k@@Í¶Öá �øÖ¿‘âß-û   Ö†€Z¡öÎ4ð¼Gì±ªÀà›^=}Nóü©ò5F   `hˆp´ !ö5 ql›ŸFÐ®Ýgè#¼f¤€FB�§þÀ’õ)þ   @kèá”¶©úÈ&>SÇÏ�j„.jæ@IÌ£ó¤€÷Ÿ:~& €ƒÀˆ™¡·Ã�Êô±¨bÏ.C
z�Z+�ò�ˆ„Ÿ´Öç 8 ljAÀÑ™ÿpqL‘eß¢� �è{„â   ´’ˆÂ¹–cö½Wê›ø¬ˆ52úN€FÀ{¿×¡    ºÀšàÞÈ¬½¶²kY? ¾'7@Øˆb<ÏóZ&�ð9 Ž [€ kÆ^Öýoq|!Öˆ=BE
~�Z;Þ²}MGÄ¡Å   è	‘ Ð< ÐC°ˆ½;)èöž�àþ¡Ä   h)0­Ä´e]uÚgðŸ)·¯ï-   @w XZ‰êÈE}¨@ì![o±/kö€•4êç   ô…– P+ê½Šù ºÀHüsµ²êGþ°ç   F€€– à}_èà‡@Œ‘ÓS‡ç^ü  €5„­´x®h(A  ì±Â9þ>¢ð‡??   °–hÕdØ[Èè!üD;aìéŒ üM^   X[Àzƒ€å±£‹8 1¤°¬°©Ñó§AŽ]“×   F˜©ñý-Þ/�è/n©ÃkŽ"üM_   Mä"2óiÐã `@@Ð×½QO<–   Àæ„+²ÉÎ4Ø># „1^'¶Ï]_   Ø´Ü–ßÄ^D»Çþ¥Áßw·×   ¶$LÓ`Û#ˆñr�ƒM€   °ÕìtZa¿Äø"˜VxÍÍ‰?   °¨Ý�iÇÇ�Ø“°G?gÚñq   -ö	BŽ@ìG ÓŽß    Xaß 	Ä˜˜ú¾   €À†ö�€xïSè‡ÞW    ¢AF  žÜw    bŠ÷†@@øÞ    ˆ%Žá>à±    vq@(    qÑ    qPá    q0Ñ    q@Ñ    q0Á    q@Á    b�     B 8NüŸ  ¤‘Õª#�    IEND®B`‚#!/usr/bin/env node

/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

const fs = require('fs-extra');
const path = require('path');
const ROOT = path.join(__dirname, '..', '..');
const events = require('cordova-common').events;
const check_reqs = require('./../templates/cordova/lib/check_reqs.js');

// exported method to create a project, returns a promise that resolves with null
module.exports.createProject = (project_path, package_name, project_name, options) => {
/*
    // create the dest and the standard place for our api to live
    // platforms/platformName/cordova/Api.js
*/

    events.emit('log', 'Creating Cordova project for cordova-electron:');
    events.emit('log', '\tPath: ' + project_path);
    events.emit('log', '\tName: ' + project_name);

    // Set default values for path, package and name
    project_path = project_path || 'CordovaExample';

    // Check if project already exists
    if (fs.existsSync(project_path)) {
        events.emit('error', 'Oops, destination already exists! Delete it and try again');
    }

    // Check that requirements are met and proper targets are installed
    if (!check_reqs.run()) {
        // TODO: use events.emit
        events.emit('error', 'Please make sure you meet the software requirements in order to build a cordova electron project');
    }

    // Make sure that the platform directory is created if missing.
    fs.ensureDirSync(project_path);

    // copy templates/build-res directory ( recursive )
    fs.copySync(path.join(ROOT, 'bin/templates/build-res'), path.join(project_path, 'build-res'), { overwrite: false });

    // copy templates/cordova directory ( recursive )
    fs.copySync(path.join(ROOT, 'bin/templates/cordova'), path.join(project_path, 'cordova'), { overwrite: false });

    // copy templates/www directory ( recursive )
    fs.copySync(path.join(ROOT, 'bin/templates/project/www'), path.join(project_path, 'www'), { overwrite: false });

    // recreate our node_modules structure in the new project
    if (fs.existsSync(path.join(ROOT, 'node_modules'))) {
        fs.copySync(path.join(ROOT, 'node_modules'), path.join(project_path, 'cordova', 'node_modules'), { overwrite: false });
    }

    const platform_www = path.join(project_path, 'platform_www');

    fs.ensureDirSync(platform_www);

    // copy cordova-js-src directory
    fs.copySync(path.join(ROOT, 'cordova-js-src'), path.join(platform_www, 'cordova-js-src'), { overwrite: false });

    // copy cordova js file to platform_www
    fs.copySync(path.join(ROOT, 'cordova-lib', 'cordova.js'), path.join(platform_www, 'cordova.js'), { overwrite: false });

    // copy cdv-electron-main.js
    fs.copySync(path.join(ROOT, 'bin/templates/project/cdv-electron-main.js'), path.join(platform_www, 'cdv-electron-main.js'), { overwrite: false });

    // copy cdv-electron-settings.json
    fs.copySync(path.join(ROOT, 'bin/templates/project/cdv-electron-settings.json'), path.join(platform_www, 'cdv-electron-settings.json'), { overwrite: false });

    return Promise.resolve();
};
/*
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

module.exports.help = () => {
    console.log('WARNING : Electron does not support updating. Remove and then re-Add the platform to get the latest.');
};

module.exports.run = () => Promise.reject(new Error('Update not supported'));
asset-test.txt
<!--
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#
-->

# Contributing to Apache Cordova

Anyone can contribute to Cordova. And we need your contributions.

There are multiple ways to contribute: report bugs, improve the docs, and
contribute code.

For instructions on this, start with the 
[contribution overview](http://cordova.apache.org/contribute/).

The details are explained there, but the important items are:
 - Sign and submit an Apache ICLA (Contributor License Agreement).
 - Have a Jira issue open that corresponds to your contribution.
 - Run the tests so your patch doesn't break existing functionality.

We look forward to your contributions!

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.Apache Cordova
Copyright 2012 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
<!--
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#
-->
# Release Notes

### 6.0.2 (Jun 27, 2019)

-   fix: manually fix line endings of some files that were using CRLF ([`e8e06c3`](https://github.com/apache/cordova-plugin-file/commit/e8e06c3))
-   chore: fix repo and issue urls and license in package.json and plugin.xml ([`1bca166`](https://github.com/apache/cordova-plugin-file/commit/1bca166))
-   docs: remove outdated translations ([`a898b85`](https://github.com/apache/cordova-plugin-file/commit/a898b85))
-   build: add `.gitattributes` to force LF (instead of possible CRLF on Windows) ([`d691a04`](https://github.com/apache/cordova-plugin-file/commit/d691a04))
-   build: add `.npmignore` to remove unneeded files from npm package ([`a255202`](https://github.com/apache/cordova-plugin-file/commit/a255202))
-   ci(travis): Update Travis CI configuration for new paramedic ([#314](https://github.com/apache/cordova-plugin-file/issues/314)) ([`2b93a67`](https://github.com/apache/cordova-plugin-file/commit/2b93a67))
-   fix(browser): support safari private browsing mode by using base64 text instead of blob ([#301](https://github.com/apache/cordova-plugin-file/issues/301)) ([`c609ff6`](https://github.com/apache/cordova-plugin-file/commit/c609ff6))
-   chore(github): Add or update GitHub pull request and issue template ([`b762743`](https://github.com/apache/cordova-plugin-file/commit/b762743))
-   fix(types): CB-13569: fix inverted LocalFileSystem enum ([#274](https://github.com/apache/cordova-plugin-file/issues/274)) ([`d135cd0`](https://github.com/apache/cordova-plugin-file/commit/d135cd0))
-   docs: remove JIRA link ([`341fa9c`](https://github.com/apache/cordova-plugin-file/commit/341fa9c))
-   fix(types): CB-13850: Fix spelling in typed-file: property name filesystem (wrongâ€¦ ([#229](https://github.com/apache/cordova-plugin-file/issues/229)) ([`4642fde`](https://github.com/apache/cordova-plugin-file/commit/4642fde))
-   fix(types): CB-13960: fix FileWriter.write argument type definition for typescript ([#231](https://github.com/apache/cordova-plugin-file/issues/231)) ([`5353b84`](https://github.com/apache/cordova-plugin-file/commit/5353b84))
-   ci(travis): also accept terms for android sdk `android-27` ([`6e7871b`](https://github.com/apache/cordova-plugin-file/commit/6e7871b))
-   docs: add details for `applicationDirectory` on android ([#234](https://github.com/apache/cordova-plugin-file/issues/234)) ([`c2f5216`](https://github.com/apache/cordova-plugin-file/commit/c2f5216))
-   fix: require FileReader in FileWriter to fix 'write' exec not being called ([#237](https://github.com/apache/cordova-plugin-file/issues/237)) ([`4a92bbb`](https://github.com/apache/cordova-plugin-file/commit/4a92bbb))
-   fix(android): CB-14181: (android) Fix bug - Cannot read property 'filesystemName' of null ([#235](https://github.com/apache/cordova-plugin-file/issues/235)) ([`cc3aedb`](https://github.com/apache/cordova-plugin-file/commit/cc3aedb))
-   ci(travis): CB-13753: Add build-tools-26.0.2 to travis ([#228](https://github.com/apache/cordova-plugin-file/issues/228)) ([`d8cc0fd`](https://github.com/apache/cordova-plugin-file/commit/d8cc0fd), [`5e12b5e`](https://github.com/apache/cordova-plugin-file/commit/5e12b5e))
-   chore: Fix release notes ([#227](https://github.com/apache/cordova-plugin-file/issues/227)) ([`c248827`](https://github.com/apache/cordova-plugin-file/commit/c248827))


### 6.0.1 (Dec 27, 2017)
* [CB-13704](https://issues.apache.org/jira/browse/CB-13704) Fix to allow 6.0.0 version install

### 6.0.0 (Dec 15, 2017)
* [CB-13668](https://issues.apache.org/jira/browse/CB-13668) Remove deprecated platforms

### 5.0.0 (Nov 06, 2017)
* [CB-13481](https://issues.apache.org/jira/browse/CB-13481) (android) Don't ask for permission to read `file:///android_asset/`
* [CB-13518](https://issues.apache.org/jira/browse/CB-13518) Add 'protective' entry to `cordovaDependencies`
* [CB-13472](https://issues.apache.org/jira/browse/CB-13472) (CI) Fixed Travis **Android** builds again
* [CB-13294](https://issues.apache.org/jira/browse/CB-13294) Remove `cordova-plugin-compat`
* fixing `README` in use of `window.resolveLocalFileSystemURL`
* [CB-12895](https://issues.apache.org/jira/browse/CB-12895) setup `eslint` and took out `jshint`
* [CB-13028](https://issues.apache.org/jira/browse/CB-13028) (CI) **Browser** builds on Travis
* [CB-13000](https://issues.apache.org/jira/browse/CB-13000) (CI) Speed up **Android** builds
* [CB-12355](https://issues.apache.org/jira/browse/CB-12355) (iOS) add desciption about the `mimeTypeForFileAtPath` method
* [CB-12355](https://issues.apache.org/jira/browse/CB-12355) (iOS) fix `FileEntry.file.type`
* [CB-12847](https://issues.apache.org/jira/browse/CB-12847) added `bugs` entry to `package.json`.

### 4.3.3 (Apr 27, 2017)
* [CB-12622](https://issues.apache.org/jira/browse/CB-12622) Added **Android 6.0** build badge to `README`
* [CB-12685](https://issues.apache.org/jira/browse/CB-12685) added `package.json` to tests folder

### 4.3.2 (Feb 28, 2017)
* [CB-12353](https://issues.apache.org/jira/browse/CB-12353) Corrected merges usage in `plugin.xml`
* [CB-12369](https://issues.apache.org/jira/browse/CB-12369) Add plugin typings from `DefinitelyTyped`
* [CB-12363](https://issues.apache.org/jira/browse/CB-12363) Added build badges for **iOS 9.3** and **iOS 10.0**
* [CB-12230](https://issues.apache.org/jira/browse/CB-12230) Removed **Windows 8.1** build badges

### 4.3.1 (Dec 07, 2016)
* [CB-12224](https://issues.apache.org/jira/browse/CB-12224) Updated version and RELEASENOTES.md for release 4.3.1
* [CB-12112](https://issues.apache.org/jira/browse/CB-12112) windows: Make available to move folder trees
* fix ENCODING_ERR for applicationDirectory
* [CB-11848](https://issues.apache.org/jira/browse/CB-11848) windows: Remove duplicate slash after file system path
* [CB-11917](https://issues.apache.org/jira/browse/CB-11917) - Remove pull request template checklist item: "iCLA has been submittedâ€¦"
* [CB-11947](https://issues.apache.org/jira/browse/CB-11947) fixed typo that occurs when adding file-transfer plugin
* [CB-11832](https://issues.apache.org/jira/browse/CB-11832) Incremented plugin version.

### 4.3.0 (Sep 08, 2016)
* [CB-11795](https://issues.apache.org/jira/browse/CB-11795) Add 'protective' entry to cordovaDependencies
* Add handling for `SecurityException`
* [CB-11368](https://issues.apache.org/jira/browse/CB-11368) **android**: Resolve content `URLs` produced by contacts plugin
* Plugin uses `Android Log class` and not `Cordova LOG class`
* [CB-11693](https://issues.apache.org/jira/browse/CB-11693) **ios**: Run copy and move operations in the background thread
* [CB-11699](https://issues.apache.org/jira/browse/CB-11699) Read files as Data URLs properly
* [CB-11305](https://issues.apache.org/jira/browse/CB-11305) Enable `cdvfile: assets fs root` for `DOM` requests
* [CB-11385](https://issues.apache.org/jira/browse/CB-11385) android: Import java.nio.charset.Charset in LocalFileSystem class
* Add badges for paramedic builds on Jenkins
* [CB-11407](https://issues.apache.org/jira/browse/CB-11407) ios: added extern keyword to constants to fix phonegap-webview-ios template issue.
* [CB-11385](https://issues.apache.org/jira/browse/CB-11385) **android**: Does not pass sonarqube scan
* Add pull request template.
* Minor edits to the `README.md`
* [CB-11142](https://issues.apache.org/jira/browse/CB-11142) Fix the `NeedPermission` code for the case when external media is not mounted in Android
* [CB-11003](https://issues.apache.org/jira/browse/CB-11003) Adding samples to Readme.
* [CB-10996](https://issues.apache.org/jira/browse/CB-10996) Adding front matter to README.md
* [CB-11115](https://issues.apache.org/jira/browse/CB-11115) **android**: Removing dependency on FileDescriptor toString in content provider tests

### 4.2.0 (Apr 15, 2016)
* [CB-10960](https://issues.apache.org/jira/browse/CB-10960) Uncaught `#<FileError>` in `write()` when `readyState != WRITING ?`
* Replace `PermissionHelper.java` with `cordova-plugin-compat`
* [CB-10977](https://issues.apache.org/jira/browse/CB-10977) **Android** Removing global state used for permission requests
* CB-10798, [CB-10384](https://issues.apache.org/jira/browse/CB-10384) Fixing permissions for **Marshmallow**.
* Fix test failure on **WP 8.1**
* [CB-10577](https://issues.apache.org/jira/browse/CB-10577) **Windows** `resolveLocalFileSystemURL` should omit trailing slash for file
* [CB-7862](https://issues.apache.org/jira/browse/CB-7862) `FileReader` reads large files in chunks with progress.
* [CB-10577](https://issues.apache.org/jira/browse/CB-10577) **Android** `resolveLocalFileSystemURL` should detect directory vs file.
* [CB-9753](https://issues.apache.org/jira/browse/CB-9753) index out of bounds on `requestFileSystem`.
* Remove `warning` emoji, as it doesn't correctly display in the docs website: cordova.apache.org/docs/en/dev/cordova-plugin-file/index.html. This closes #166
* [CB-10636](https://issues.apache.org/jira/browse/CB-10636) Add `JSHint` for plugins
* [CB-10411](https://issues.apache.org/jira/browse/CB-10411) Error in `file.spec.129` of `cordova-plugin-file`

### 4.1.1 (Feb 09, 2016)
* Edit package.json license to match SPDX id
* [CB-10419](https://issues.apache.org/jira/browse/CB-10419) cordova-plugin-file 4.0.0 error with browserify workflow

### 4.1.0 (Jan 15, 2016)
* added `.ratignore` file
* [CB-10319](https://issues.apache.org/jira/browse/CB-10319) **android** Adding reflective helper methods for permission requests
* [CB-10023](https://issues.apache.org/jira/browse/CB-10023) Fix `proxy not found error` on Chrome.
* [CB-8863](https://issues.apache.org/jira/browse/CB-8863) **ios** Fix block usage of self

### 4.0.0 (Nov 18, 2015)
* [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Updated `RELEASENOTES` to be newest to oldest
* [CB-8497](https://issues.apache.org/jira/browse/CB-8497) Fix handling of file paths with `#` character
* Do not inject default `AndroidPersistentFileLocation` into `config.xml`
* [CB-9891](https://issues.apache.org/jira/browse/CB-9891): Fix permission errors due to `URI encoding` inconsistency on **Android**
* Fixed `NullPointer Exception` in **Android 5** and above due to invalid column name on cursor
* Fix default persistent file location
* fix `applicationDirectory` to use `ms-appx:///`
* Add **Windows** paths to `cordova.file` object
* [CB-9851](https://issues.apache.org/jira/browse/CB-9851) Document `cdvfile` protocol quirk - using `cdvfile://` in the `DOM` is not supported on **Windows**
* [CB-9752](https://issues.apache.org/jira/browse/CB-9752) `getDirectory` fails on valid directory with assets filesystem
* [CB-7253](https://issues.apache.org/jira/browse/CB-7253) `requestFileSystem` fails when no external storage is present
* Adding permissions for **Marshmallow**. Now supports **Anrdoid 6.0**
* Fixing contribute link.
* always use setters to fix memory issues without `ARC` for **iOS**
* [CB-9331](https://issues.apache.org/jira/browse/CB-9331) `getFreeDiskSpace` **iOS**.
* override `resolveLocalFileSystemURL` by `webkitResolveLocalFileSystemURL` for **browser** platform add `.project` into git ignore list
* Fail with `FileError.ENCODING_ERR` on encoding exception.
* [CB-9544](https://issues.apache.org/jira/browse/CB-9544) Add file plugin for **OSX**
* [CB-9539](https://issues.apache.org/jira/browse/CB-9539) Fixed test failure on **Android** emulator
* Added docs on `CSP` rules needed for using `cdvfile` in DOM src. This closes #120
* Added `cdvfile` protocol purpose description and examples

### 3.0.0 (Aug 18, 2015)
* Make Android default persistent file location internal
* Fixed issue with file paths not existing when using browserify
* [CB-9251](https://issues.apache.org/jira/browse/CB-9251): Changed from Intents to Preferences object as per the issue
* [CB-9215](https://issues.apache.org/jira/browse/CB-9215) Add cordova-plugin-file manual test for windows platform

### 2.1.0 (Jun 17, 2015)
* added missing license header
* [CB-9128](https://issues.apache.org/jira/browse/CB-9128) cordova-plugin-file documentation translation: cordova-plugin-file
* fix npm md
* [CB-8844](https://issues.apache.org/jira/browse/CB-8844) Increased timeout for asset tests
* Updated resolveFileSystem.js so it can be parsed by uglifyJS
* [CB-8860](https://issues.apache.org/jira/browse/CB-8860) cordova-plugin-file documentation translation: cordova-plugin-file
* [CB-8792](https://issues.apache.org/jira/browse/CB-8792) Fixes reading of json files using readAsText

### 2.0.0 (Apr 15, 2015)
* [CB-8849](https://issues.apache.org/jira/browse/CB-8849) Fixed ReadAsArrayBuffer to return ArrayBuffer and not Array on WP8
* [CB-8819](https://issues.apache.org/jira/browse/CB-8819) Fixed FileReader's readAsBinaryString on wp8
* [CB-8746](https://issues.apache.org/jira/browse/CB-8746) gave plugin major version bump
* [CB-8683](https://issues.apache.org/jira/browse/CB-8683) android: Fix broken unit tests from plugin rename
* [CB-8683](https://issues.apache.org/jira/browse/CB-8683) changed plugin-id to pacakge-name
* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) properly updated translated docs to use new id
* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) updated translated docs to use new id
* Use TRAVIS_BUILD_DIR, install paramedic by npm
* docs: added Windows to supported platforms
* [CB-8699](https://issues.apache.org/jira/browse/CB-8699) [CB-6428](https://issues.apache.org/jira/browse/CB-6428) Fix uncompressed assets being copied as zero length files
* [CB-6428](https://issues.apache.org/jira/browse/CB-6428) android: Fix assets FileEntry having size of -1
* android: Move URLforFullPath into base class (and rename to localUrlforFullPath)
* [CB-6428](https://issues.apache.org/jira/browse/CB-6428) Mention build-extras.gradle in README
* [CB-7109](https://issues.apache.org/jira/browse/CB-7109) android: Parse arguments off of the main thread (close #97)
* [CB-8695](https://issues.apache.org/jira/browse/CB-8695) ios: Fix `blob.slice()` for `asset-library` URLs (close #105)
* Tweak build-extras.gradle to just read/write to main `assets/` instead of `build/`
* [CB-8689](https://issues.apache.org/jira/browse/CB-8689) Fix NPE in makeEntryForNativeUri (was affecting file-transfer)
* [CB-8675](https://issues.apache.org/jira/browse/CB-8675) Revert "CB-8351 ios: Use base64EncodedStringWithOptions instead of CordovaLib's class extension"
* [CB-8653](https://issues.apache.org/jira/browse/CB-8653) Updated Readme
* [CB-8659](https://issues.apache.org/jira/browse/CB-8659): ios: 4.0.x Compatibility: Remove use of initWebView method
* Add a cache to speed up AssetFilesystem directory listings
* [CB-8663](https://issues.apache.org/jira/browse/CB-8663) android: Don't notify MediaScanner of private files
* Don't log stacktrace for normal exceptions (e.g. file not found)
* android: Don't use LimitedInputStream when reading entire file (optimization)
* [CB-6428](https://issues.apache.org/jira/browse/CB-6428) android: Add support for directory copies from assets -> filesystem
* android: Add `listChildren()`: Java-consumable version of `readEntriesAtLocalURL()`
* [CB-6428](https://issues.apache.org/jira/browse/CB-6428) android: Add support for file:///android_asset URLs
* [CB-8642](https://issues.apache.org/jira/browse/CB-8642) android: Fix content URIs not working with resolve / copy
* Tweak tests to fail if deleteEntry fails (rather than time out)
* android: Ensure LocalFilesystemURL can only be created with "cdvfile" URLs
* android: Move CordovaResourceApi into Filesystem base class
* android: Use `CordovaResourceApi.mapUriToFile()` rather than own custom logic in ContentFilesystem
* android: Use Uri.parse rather than manual parsing in resolveLocalFileSystemURI
* Tweak test case that failed twice on error rather than just once
* android: Delete invalid JavaDoc (lint errors)
* android: Use CordovaResourceApi rather than FileHelper
* [CB-8032](https://issues.apache.org/jira/browse/CB-8032) - File Plugin - Add nativeURL external method support for CDVFileSystem->makeEntryForPath:isDirectory: (closes #96)
* [CB-8567](https://issues.apache.org/jira/browse/CB-8567) Integrate TravisCI
* [CB-8438](https://issues.apache.org/jira/browse/CB-8438) cordova-plugin-file documentation translation: cordova-plugin-file
* [CB-8538](https://issues.apache.org/jira/browse/CB-8538) Added package.json file
* [CB-7956](https://issues.apache.org/jira/browse/CB-7956) Add cordova-plugin-file support for browser platform
* [CB-8423](https://issues.apache.org/jira/browse/CB-8423) Corrected usage of done() in async tests
* [CB-8459](https://issues.apache.org/jira/browse/CB-8459) Fixes spec 111 failure due to incorrect relative paths handling
* Code cleanup, whitespace
* Added nativeURL property to FileEntry, implemented readAsArrayBuffer and readAsBinaryString

### 1.3.3 (Feb 04, 2015)
* [CB-7927](https://issues.apache.org/jira/browse/CB-7927) Encoding data to bytes instead of chars when writing a file.
* ios: Fix compile warning about implicit int conversion
* [CB-8351](https://issues.apache.org/jira/browse/CB-8351) ios: Use base64EncodedStringWithOptions instead of CordovaLib's class extension
* [CB-8351](https://issues.apache.org/jira/browse/CB-8351) ios: Use argumentForIndex rather than NSArray extension
* [CB-8351](https://issues.apache.org/jira/browse/CB-8351) ios: Use a local copy of valueForKeyIsNumber rather than CordovaLib's version
* windows: Handle url's containing absolute windows path starting with drive letter and colon (encoded as %3A) through root FS
* windows: Rework to use normal url form
* android: refactor: Make Filesystem base class store its own name, rootUri, and rootEntry
* android: Simplify code a bit by making makeEntryForPath not throw JSONException
* [CB-6431](https://issues.apache.org/jira/browse/CB-6431) android: Fix plugin breaking content: URLs
* [CB-7375](https://issues.apache.org/jira/browse/CB-7375) Never create new FileSystem instances (except on windows since they don't implement requestAllFileSystems())

### 1.3.2 (Dec 02, 2014)
* Gets rid of thread block error in File plugin
* [CB-7917](https://issues.apache.org/jira/browse/CB-7917) Made tests file.spec.114 - 116 pass for **Windows** platform
* [CB-7977](https://issues.apache.org/jira/browse/CB-7977) Mention `deviceready` in plugin docs
* [CB-7602](https://issues.apache.org/jira/browse/CB-7602): Fix `isCopyOnItself` logic
* [CB-7700](https://issues.apache.org/jira/browse/CB-7700) cordova-plugin-file documentation translation: cordova-plugin-file
* Use one proxy for both **Windows** and **Windows8** platforms
* [CB-6994](https://issues.apache.org/jira/browse/CB-6994) Fixes result, returned by proxy's write method
* [fxos] update `__format__` to match `pathsPrefix`
* [CB-6994](https://issues.apache.org/jira/browse/CB-6994) Improves merged code to be able to write a File
* Optimize `FileProxy` for **Windows** platforms
* Synchronize changes with **Windows** platform
* Fix function write for big files on **Windows 8**
* Write file in background
* [CB-7487](https://issues.apache.org/jira/browse/CB-7487) **Android** Broadcast file write This allows MTP USB shares to show the file immediately without reboot/manual refresh using 3rd party app.
* [CB-7700](https://issues.apache.org/jira/browse/CB-7700) cordova-plugin-file documentation translation: cordova-plugin-file
* [CB-7571](https://issues.apache.org/jira/browse/CB-7571) Bump version of nested plugin to match parent plugin

### 1.3.1 (Sep 17, 2014)
* [CB-7471](https://issues.apache.org/jira/browse/CB-7471) cordova-plugin-file documentation translation
* [CB-7272](https://issues.apache.org/jira/browse/CB-7272) Replace confusing "r/o" abbreviation with just "r"
* [CB-7423](https://issues.apache.org/jira/browse/CB-7423) encode path before attempting to resolve
* [CB-7375](https://issues.apache.org/jira/browse/CB-7375) Fix the filesystem name in resolveLocalFileSystemUri
* [CB-7445](https://issues.apache.org/jira/browse/CB-7445) [BlackBerry10] resolveLocalFileSystemURI - change DEFAULT_SIZE to MAX_SIZE
* [CB-7458](https://issues.apache.org/jira/browse/CB-7458) [BlackBerry10] resolveLocalFileSystemURL - add filesystem property
* [CB-7445](https://issues.apache.org/jira/browse/CB-7445) [BlackBerry10] Add default file system size to prevent quota exceeded error on initial install
* [CB-7431](https://issues.apache.org/jira/browse/CB-7431) Avoid calling done() twice in file.spec.109 test
* [CB-7413](https://issues.apache.org/jira/browse/CB-7413) Adds support of 'ms-appdata://' URIs
* [CB-7422](https://issues.apache.org/jira/browse/CB-7422) [File Tests] Use proper fileSystem to create fullPath
* [CB-7375](https://issues.apache.org/jira/browse/CB-7375) [Entry] get proper filesystem in Entry
* Amazon related changes.
* [CB-7375](https://issues.apache.org/jira/browse/CB-7375) Remove leading slash statement from condition
* Refactored much of the logic in FileMetadata constructor.  Directory.size will return 0
* [CB-7419](https://issues.apache.org/jira/browse/CB-7419) [WP8] Added support to get metada from dir
* [CB-7418](https://issues.apache.org/jira/browse/CB-7418) [DirectoryEntry] Added fullPath variable as part of condition
* [CB-7417](https://issues.apache.org/jira/browse/CB-7417) [File tests] added proper matcher to compare fullPath property
* [CB-7375](https://issues.apache.org/jira/browse/CB-7375) Partial revert to resolve WP8 failures
* Overwrite existing file on getFile when create is true
* [CB-7375](https://issues.apache.org/jira/browse/CB-7375) [CB-6148](https://issues.apache.org/jira/browse/CB-6148): Ensure that return values from copy and move operations reference the correct filesystem
* [CB-6724](https://issues.apache.org/jira/browse/CB-6724) changed style detail on documentation
* Added new js files to amazon-fireos platform.
* Adds Windows platform
* Fixes multiple mobilespec tests errors
* Removed test/tests.js module from main plugin.xml
* [CB-7094](https://issues.apache.org/jira/browse/CB-7094) renamed folder to tests + added nested plugin.xml
* added documentation for manual tests
* [CB-6923](https://issues.apache.org/jira/browse/CB-6923) Adding support to handle relative paths
* Style improvements on Manual tests
* [CB-7094](https://issues.apache.org/jira/browse/CB-7094) Ported File manual tests

### 1.3.0 (Aug 06, 2014)
* **FFOS** Remove unsupported paths from requestAllPaths
* **FFOS** Support for resolve URI, request all paths and local app directory.
* [CB-4263](https://issues.apache.org/jira/browse/CB-4263) set ready state to done before onload
* [CB-7167](https://issues.apache.org/jira/browse/CB-7167) [BlackBerry10] copyTo - return wrapped entry rather than native
* [CB-7167](https://issues.apache.org/jira/browse/CB-7167) [BlackBerry10] Add directory support to getFileMetadata
* [CB-7167](https://issues.apache.org/jira/browse/CB-7167) [BlackBerry10] Fix tests detection of blob support (window.Blob is BlobConstructor object)
* [CB-7161](https://issues.apache.org/jira/browse/CB-7161) [BlackBerry10] Add file system directory paths
* [CB-7093](https://issues.apache.org/jira/browse/CB-7093) Create separate plugin.xml for new-style tests
* [CB-7057](https://issues.apache.org/jira/browse/CB-7057) Docs update: elaborate on what directories are for
* [CB-7093](https://issues.apache.org/jira/browse/CB-7093): Undo the effects of an old bad S&R command
* [CB-7093](https://issues.apache.org/jira/browse/CB-7093): Remove a bunch of unneeded log messages
* [CB-7093](https://issues.apache.org/jira/browse/CB-7093): Add JS module to plugin.xml file for auto-tests
* [CB-7093](https://issues.apache.org/jira/browse/CB-7093) Ported automated file tests
* **WINDOWS** remove extra function closure, not    needed
* **WINDOWS** remove check for undefined fail(), it is defined by the proxy and always exists
* **WINDOWS** re-apply readAsBinaryString and readAsArrayBuffer
* **WINDOWS** Moved similar calls to be the same calls, aliased long namespaced functions
* [CB-6127](https://issues.apache.org/jira/browse/CB-6127) Updated translations for docs.
* [CB-6571](https://issues.apache.org/jira/browse/CB-6571) Fix getParentForLocalURL to work correctly with directories with trailing '/' (This closes #58)
* UTTypeCopyPreferredTagWithClass returns nil mimetype for css when there is no network
* updated spec links in docs ( en only )
* [CB-6571](https://issues.apache.org/jira/browse/CB-6571) add trailing space it is missing in DirectoryEnty constructor.
* [CB-6980](https://issues.apache.org/jira/browse/CB-6980) Fixing filesystem:null property in Entry
* Add win8 support for readAsBinaryString and readAsArrayBuffer
* [FFOS] Update FileProxy.js
* [CB-6940](https://issues.apache.org/jira/browse/CB-6940): Fixing up commit from dzeims
* [CB-6940](https://issues.apache.org/jira/browse/CB-6940): Android: cleanup try/catch exception handling
* [CB-6940](https://issues.apache.org/jira/browse/CB-6940): `context.getExternal*` methods return null if sdcard isn't in mounted state, causing exceptions that prevent startup from reaching readystate
* Fix mis-handling of filesystem reference in Entry.moveTo ('this' used in closure).
* [CB-6902](https://issues.apache.org/jira/browse/CB-6902): Use File.lastModified rather than .lastModifiedDate
* [CB-6922](https://issues.apache.org/jira/browse/CB-6922): Remove unused getMetadata native code
* [CB-6922](https://issues.apache.org/jira/browse/CB-6922): Use getFileMetadata consistently to get metadata
* changed fullPath to self.rootDocsPath
* [CB-6890](https://issues.apache.org/jira/browse/CB-6890): Fix pluginManager access for 4.0.x branch

### 1.2.1
* [CB-6922](https://issues.apache.org/jira/browse/CB-6922) Fix inconsistent handling of lastModifiedDate and modificationTime
* [CB-285](https://issues.apache.org/jira/browse/CB-285): Document filesystem root properties

### 1.2.0 (Jun 05, 2014)
* [CB-6127](https://issues.apache.org/jira/browse/CB-6127) Spanish and French Translations added. Github close #31
* updated this reference to window
* Add missing semicolon (copy & paste error)
* Fix compiler warning about symbol in interface not matching implementation
* Fix sorting order in supported platforms
* ubuntu: increase quota value
* ubuntu: Change FS URL scheme to 'cdvfile'
* ubuntu: Return size with Entry.getMetadata() method
* [CB-6803](https://issues.apache.org/jira/browse/CB-6803) Add license
* Initial implementation for Firefox OS
* Small wording tweaks
* Fixed toURL() toInternalURL() information in the doku
* ios: Don't fail a write of zero-length payload.
* [CB-285](https://issues.apache.org/jira/browse/CB-285) Docs for cordova.file.\*Directory properties
* [CB-285](https://issues.apache.org/jira/browse/CB-285) Add cordova.file.\*Directory properties for iOS & Android
* [CB-3440](https://issues.apache.org/jira/browse/CB-3440) [BlackBerry10] Proxy based implementation
* Fix typo in docs "app-bundle" -> "bundle"
* [CB-6583](https://issues.apache.org/jira/browse/CB-6583) ios: Fix failing to create entry when space in parent path
* [CB-6571](https://issues.apache.org/jira/browse/CB-6571) android: Make DirectoryEntry.toURL() have a trailing /
* [CB-6491](https://issues.apache.org/jira/browse/CB-6491) add CONTRIBUTING.md
* [CB-6525](https://issues.apache.org/jira/browse/CB-6525) android, ios: Allow file: URLs in all APIs. Fixes FileTransfer.download not being called.
* fix the Windows 8  implementation of the getFile method
* Update File.js for typo: lastModifiedData --> lastModifiedDate (closes #38)
* Add error codes.
* [CB-5980](https://issues.apache.org/jira/browse/CB-5980) Updated version and RELEASENOTES.md for release 1.0.0
* Add NOTICE file
* [CB-6114](https://issues.apache.org/jira/browse/CB-6114) Updated version and RELEASENOTES.md for release 1.0.1
* [CB-5980](https://issues.apache.org/jira/browse/CB-5980) Updated version and RELEASENOTES.md for release 1.0.0

### 1.1.0 (Apr 17, 2014)
* [CB-4965](https://issues.apache.org/jira/browse/CB-4965): Remove tests from file plugin
* Android: Allow file:/ URLs
* [CB-6422](https://issues.apache.org/jira/browse/CB-6422): [windows8] use cordova/exec/proxy
* [CB-6249](https://issues.apache.org/jira/browse/CB-6249): [android] Opportunistically resolve content urls to file
* [CB-6394](https://issues.apache.org/jira/browse/CB-6394): [ios, android] Add extra filesystem roots
* [CB-6394](https://issues.apache.org/jira/browse/CB-6394): [ios, android] Fix file resolution for the device root case
* [CB-6394](https://issues.apache.org/jira/browse/CB-6394): [ios] Return ENCODING_ERR when fs name is not valid
* [CB-6393](https://issues.apache.org/jira/browse/CB-6393): Change behaviour of toURL and toNativeURL
* ios: Style: plugin initialization
* ios: Fix handling of file URLs with encoded spaces
* Always use Android's recommended temp file location for temporary file system
* [CB-6352](https://issues.apache.org/jira/browse/CB-6352): Allow FileSystem objects to be serialized to JSON
* [CB-5959](https://issues.apache.org/jira/browse/CB-5959): size is explicitly 0 if not set, file.spec.46&47 are testing the type of size
* [CB-6242](https://issues.apache.org/jira/browse/CB-6242): [BlackBerry10] Add deprecated version of resolveLocalFileSystemURI
* [CB-6242](https://issues.apache.org/jira/browse/CB-6242): [BlackBerry10] add file:/// prefix for toURI / toURL
* [CB-6242](https://issues.apache.org/jira/browse/CB-6242): [BlackBerry10] Polyfill window.requestAnimationFrame for OS < 10.2
* [CB-6242](https://issues.apache.org/jira/browse/CB-6242): [BlackBerry10] Override window.resolveLocalFileSystemURL
* [CB-6212](https://issues.apache.org/jira/browse/CB-6212): [iOS] fix warnings compiled under arm64 64-bit
* ios: Don't cache responses from CDVFile's URLProtocol
* [CB-6199](https://issues.apache.org/jira/browse/CB-6199): [iOS] Fix toNativeURL() not escaping characters properly
* [CB-6148](https://issues.apache.org/jira/browse/CB-6148): Fix cross-filesystem copy and move
* fixed setMetadata() to use the formatted fullPath
* corrected typo which leads to a "comma expression"
* [CB-4952](https://issues.apache.org/jira/browse/CB-4952): ios: Resolve symlinks in file:// URLs
* Add docs about the extraFileSystems preference
* [CB-6460](https://issues.apache.org/jira/browse/CB-6460): Update license headers

### 1.0.1 (Feb 28, 2014)
* [CB-6116](https://issues.apache.org/jira/browse/CB-6116) Fix error where resolveLocalFileSystemURL would fail
* [CB-6106](https://issues.apache.org/jira/browse/CB-6106) Add support for nativeURL attribute on Entry objects
* [CB-6110](https://issues.apache.org/jira/browse/CB-6110) iOS: Fix typo in filesystemPathForURL: method
* Android: Use most specific FS match when resolving file: URIs
* iOS: Update fileSystemURLforLocalPath: to return the most match url.
* Allow third-party plugin registration, and the total count of fs type is not limited to just 4.
* [CB-6097](https://issues.apache.org/jira/browse/CB-6097) Added missing files for amazon-fireos platform. Added onLoad flag to true.
* [CB-6087](https://issues.apache.org/jira/browse/CB-6087) Android, iOS: Load file plugin on startup
* [CB-6013](https://issues.apache.org/jira/browse/CB-6013) BlackBerry10: wrap webkit prefixed called in requestAnimationFrame
* Update plugin writers' documentation
* [CB-6080](https://issues.apache.org/jira/browse/CB-6080) Fix file copy when src and dst are on different local file systems
* [CB-6057](https://issues.apache.org/jira/browse/CB-6057) Add methods for plugins to convert between URLs and paths
* [CB-6050](https://issues.apache.org/jira/browse/CB-6050) Public method for returning a FileEntry from a device file path
* [CB-2432](https://issues.apache.org/jira/browse/CB-2432) [CB-3185](https://issues.apache.org/jira/browse/CB-3185), [CB-5975](https://issues.apache.org/jira/browse/CB-5975): Fix Android handling of content:// URLs
* [CB-6022](https://issues.apache.org/jira/browse/CB-6022) Add upgrade notes to doc
* [CB-5233](https://issues.apache.org/jira/browse/CB-5233) Make asset-library urls work properly on iOS
* [CB-6012](https://issues.apache.org/jira/browse/CB-6012) Preserve query strings on cdvfile:// URLs where necessary
* [CB-6010](https://issues.apache.org/jira/browse/CB-6010) Test properly for presence of URLforFilesystemPath method
* [CB-5959](https://issues.apache.org/jira/browse/CB-5959) Entry.getMetadata should return size attribute

### 1.0.0 (Feb 05, 2014)
* [CB-5974](https://issues.apache.org/jira/browse/CB-5974): Use safe 'Compatibilty' mode by default
* [CB-5915](https://issues.apache.org/jira/browse/CB-5915): [CB-5916](https://issues.apache.org/jira/browse/CB-5916): Reorganize preference code to make defaults possible
* [CB-5974](https://issues.apache.org/jira/browse/CB-5974): Android: Don't allow File operations to continue when not configured
* [CB-5960](https://issues.apache.org/jira/browse/CB-5960): ios: android: Properly handle parent references in getFile/getDirectory
* [ubuntu] adopt to recent changes
* Add default FS root to new FS objects
* [CB-5899](https://issues.apache.org/jira/browse/CB-5899): Make DirectoryReader.readEntries return properly formatted Entry objects
* Add constuctor params to FileUploadResult related to [CB-2421](https://issues.apache.org/jira/browse/CB-2421)
* Fill out filesystem attribute of entities returned from resolveLocalFileSystemURL
* [CB-5916](https://issues.apache.org/jira/browse/CB-5916): Create documents directories if they don't exist
* [CB-5915](https://issues.apache.org/jira/browse/CB-5915): Create documents directories if they don't exist
* [CB-5916](https://issues.apache.org/jira/browse/CB-5916): Android: Fix unfortunate NPE in config check
* [CB-5916](https://issues.apache.org/jira/browse/CB-5916): Android: Add "/files/" to persistent files path
* [CB-5915](https://issues.apache.org/jira/browse/CB-5915): ios: Update config preference (and docs) to match issue
* [CB-5916](https://issues.apache.org/jira/browse/CB-5916): Android: Add config preference for Android persistent storage location
* iOS: Add config preference for iOS persistent storage location
* iOS: Android: Allow third-party plugin registration
* Android: Expose filePlugin getter so that other plugins can register filesystems
* Fix typos in deprecation message
* Add backwards-compatibility shim for file-transfer
* Android: Allow third-party plugin registration
* [CB-5810](https://issues.apache.org/jira/browse/CB-5810) [BlackBerry10] resolve local:/// paths (application assets)
* [CB-5774](https://issues.apache.org/jira/browse/CB-5774): create DirectoryEntry instead of FileEntry
* Initial fix for [CB-5747](https://issues.apache.org/jira/browse/CB-5747)
* Change default FS URL scheme to "cdvfile"
* Android: Properly format content urls
* Android, iOS: Replace "filesystem" protocol string with constant
* Android: Allow absolute paths on Entry.getFile / Entry.getDirectory
* Android: Make clear that getFile takes a path, not just a filename
* [CB-5008](https://issues.apache.org/jira/browse/CB-5008): Rename resolveLocalFileSystemURI to resolveLocalFileSystemURL; deprecate original
* Remove old file reference from plugin.xml
* Android: Refactor File API
* [CB-4899](https://issues.apache.org/jira/browse/CB-4899) [BlackBerry10] Fix resolve directories
* [CB-5602](https://issues.apache.org/jira/browse/CB-5602) Windows8. Fix File Api mobile spec tests
* Android: Better support for content urls and cross-filesystem copy/move ops
* [CB-5699](https://issues.apache.org/jira/browse/CB-5699) [BlackBerry10] Update resolveLocalFileSystemURI implementation
* [CB-5658](https://issues.apache.org/jira/browse/CB-5658) Update license comment formatting of doc/index.md
* [CB-5658](https://issues.apache.org/jira/browse/CB-5658) Add doc.index.md for File plugin.
* [CB-5658](https://issues.apache.org/jira/browse/CB-5658) Delete stale snapshot of plugin docs
* [CB-5403](https://issues.apache.org/jira/browse/CB-5403): Backwards-compatibility with file:// urls where possible
* [CB-5407](https://issues.apache.org/jira/browse/CB-5407): Fixes for ContentFilesystem
* Android: Add method for testing backwards-compatibility of filetransfer plugin
* iOS: Add method for testing backwards-compatiblity of filetransfer plugin
* Android: Updates to allow FileTransfer to continue to work
* Android: Clean up unclosed file objects
* [CB-5407](https://issues.apache.org/jira/browse/CB-5407): Cleanup
* [CB-5407](https://issues.apache.org/jira/browse/CB-5407): Add new Android source files to plugin.xml
* [CB-5407](https://issues.apache.org/jira/browse/CB-5407): Move read, write and truncate methods into modules
* [CB-5407](https://issues.apache.org/jira/browse/CB-5407): Move copy/move methods into FS modules
* [CB-5407](https://issues.apache.org/jira/browse/CB-5407): Move getParent into FS modules
* [CB-5407](https://issues.apache.org/jira/browse/CB-5407): Move getmetadata methods into FS modules
* [CB-5407](https://issues.apache.org/jira/browse/CB-5407): Move readdir methods into FS modules
* [CB-5407](https://issues.apache.org/jira/browse/CB-5407): Move remove methods into FS modules
* [CB-5407](https://issues.apache.org/jira/browse/CB-5407): Move getFile into FS modules
* [CB-5407](https://issues.apache.org/jira/browse/CB-5407): Start refactoring android code: Modular filesystems, rfs, rlfsurl
* [CB-5407](https://issues.apache.org/jira/browse/CB-5407): Update android JS to use FS urls
* [CB-5405](https://issues.apache.org/jira/browse/CB-5405): Use URL formatting for Entry.toURL
* [CB-5532](https://issues.apache.org/jira/browse/CB-5532) Fix
* Log file path for File exceptions.
* Partial fix for iOS File compatibility with previous fileTransfer plugin
* [CB-5532](https://issues.apache.org/jira/browse/CB-5532) WP8. Add binary data support to FileWriter
* [CB-5531](https://issues.apache.org/jira/browse/CB-5531) WP8. File Api readAsText incorrectly handles position args
* Added ubuntu platform support
* Added amazon-fireos platform support
* [CB-5118](https://issues.apache.org/jira/browse/CB-5118) [BlackBerry10] Add check for undefined error handler
* [CB-5406](https://issues.apache.org/jira/browse/CB-5406): Extend public API for dependent plugins
* [CB-5403](https://issues.apache.org/jira/browse/CB-5403): Bump File plugin major version
* [CB-5406](https://issues.apache.org/jira/browse/CB-5406): Split iOS file plugin into modules
* [CB-5406](https://issues.apache.org/jira/browse/CB-5406): Factor out filesystem providers in iOS
* [CB-5408](https://issues.apache.org/jira/browse/CB-5408): Add handler for filesystem:// urls
* [CB-5406](https://issues.apache.org/jira/browse/CB-5406): Update iOS native code to use filesystem URLs internally
* [CB-5405](https://issues.apache.org/jira/browse/CB-5405): Update JS code to use URLs exclusively
* [CB-4816](https://issues.apache.org/jira/browse/CB-4816) Fix file creation outside sandbox for BB10

### 0.2.5 (Oct 28, 2013)
* [CB-5129](https://issues.apache.org/jira/browse/CB-5129): Add a consistent filesystem attribute to FileEntry and DirectoryEntry objects
* [CB-5128](https://issues.apache.org/jira/browse/CB-5128): added repo + issue tag to plugin.xml for file plugin
* [CB-5015](https://issues.apache.org/jira/browse/CB-5015) [BlackBerry10] Add missing dependency for File.slice
* [CB-5010](https://issues.apache.org/jira/browse/CB-5010) Incremented plugin version on dev branch.

### 0.2.4 (Oct 9, 2013)
* [CB-5020](https://issues.apache.org/jira/browse/CB-5020) - File plugin should execute on a separate thread
* [CB-4915](https://issues.apache.org/jira/browse/CB-4915) Incremented plugin version on dev branch.
* [CB-4504](https://issues.apache.org/jira/browse/CB-4504): Updating FileUtils.java to compensate for Java porting failures in the Android SDK. This fails because Java knows nothing about android_asset not being an actual filesystem

### 0.2.3 (Sept 25, 2013)
* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) bumping&resetting version
* [CB-4903](https://issues.apache.org/jira/browse/CB-4903) File Plugin not loading Windows8
* [CB-4903](https://issues.apache.org/jira/browse/CB-4903) File Plugin not loading Windows8
* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) renaming references
* [CB-4889](https://issues.apache.org/jira/browse/CB-4889) renaming org.apache.cordova.core.file to org.apache.cordova.file
* Rename CHANGELOG.md -> RELEASENOTES.md
* [CB-4771](https://issues.apache.org/jira/browse/CB-4771) Expose TEMPORARY and PERSISTENT constants on window.
* Fix compiler/lint warnings
* [CB-4764](https://issues.apache.org/jira/browse/CB-4764) Move DirectoryManager.java into file plugin
* [CB-4763](https://issues.apache.org/jira/browse/CB-4763) Copy FileHelper.java into the plugin.
* [CB-2901](https://issues.apache.org/jira/browse/CB-2901) [BlackBerry10] Automatically unsandbox filesystem if path is not in app sandbox
* [CB-4752](https://issues.apache.org/jira/browse/CB-4752) Incremented plugin version on dev branch.

### 0.2.1 (Sept 5, 2013)
* [CB-4656](https://issues.apache.org/jira/browse/CB-4656) Don't add newlines in data urls within readAsDataUrl.
* [CB-4514](https://issues.apache.org/jira/browse/CB-4514) Making DirectoryCopy Recursive
* [iOS] Simplify the code in resolveLocalFileSystemURI
{
  "author": {
    "name": "Apache Software Foundation"
  },
  "cordova": {
    "id": "cordova-plugin-file",
    "platforms": [
      "android",
      "browser",
      "ios",
      "osx",
      "windows"
    ]
  },
  "deprecated": false,
  "description": "Cordova File Plugin",
  "devDependencies": {
    "eslint": "^3.19.0",
    "eslint-config-semistandard": "^11.0.0",
    "eslint-config-standard": "^10.2.1",
    "eslint-plugin-import": "^2.3.0",
    "eslint-plugin-node": "^5.0.0",
    "eslint-plugin-promise": "^3.5.0",
    "eslint-plugin-standard": "^3.0.1"
  },
  "engines": {
    "cordovaDependencies": {
      "5.0.0": {
        "cordova-android": ">=6.3.0"
      },
      "7.0.0": {
        "cordova": ">100"
      }
    }
  },
  "homepage": "https://github.com/apache/cordova-plugin-file#readme",
  "license": "Apache-2.0",
  "name": "cordova-plugin-file",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/apache/cordova-plugin-file.git"
  },
  "types": "./types/index.d.ts",
  "version": "6.0.2"
}<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you 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.
-->

<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android"
           id="cordova-plugin-file"
      version="6.0.2">
    <name>File</name>
    <description>Cordova File Plugin</description>
    <license>Apache 2.0</license>
    <keywords>cordova,file</keywords>
    <repo>https://github.com/apache/cordova-plugin-file</repo>
    <issue>https://github.com/apache/cordova-plugin-file/issues</issue>

    <engines>
        <engine name="cordova-android" version=">=6.3.0" />
    </engines>

    <js-module src="www/DirectoryEntry.js" name="DirectoryEntry">
        <clobbers target="window.DirectoryEntry" />
    </js-module>

    <js-module src="www/DirectoryReader.js" name="DirectoryReader">
        <clobbers target="window.DirectoryReader" />
    </js-module>

    <js-module src="www/Entry.js" name="Entry">
        <clobbers target="window.Entry" />
    </js-module>

    <js-module src="www/File.js" name="File">
        <clobbers target="window.File" />
    </js-module>

    <js-module src="www/FileEntry.js" name="FileEntry">
        <clobbers target="window.FileEntry" />
    </js-module>

    <js-module src="www/FileError.js" name="FileError">
        <clobbers target="window.FileError" />
    </js-module>

    <js-module src="www/FileReader.js" name="FileReader">
        <clobbers target="window.FileReader" />
    </js-module>

    <js-module src="www/FileSystem.js" name="FileSystem">
        <clobbers target="window.FileSystem" />
    </js-module>

    <js-module src="www/FileUploadOptions.js" name="FileUploadOptions">
        <clobbers target="window.FileUploadOptions" />
    </js-module>

    <js-module src="www/FileUploadResult.js" name="FileUploadResult">
        <clobbers target="window.FileUploadResult" />
    </js-module>

    <js-module src="www/FileWriter.js" name="FileWriter">
        <clobbers target="window.FileWriter" />
    </js-module>

    <js-module src="www/Flags.js" name="Flags">
        <clobbers target="window.Flags" />
    </js-module>

    <js-module src="www/LocalFileSystem.js" name="LocalFileSystem">
        <!-- Non-standards way -->
        <clobbers target="window.LocalFileSystem" />
        <!-- Standards-compliant way -->
        <merges target="window" />
    </js-module>

    <js-module src="www/Metadata.js" name="Metadata">
        <clobbers target="window.Metadata" />
    </js-module>

    <js-module src="www/ProgressEvent.js" name="ProgressEvent">
        <clobbers target="window.ProgressEvent" />
    </js-module>

    <js-module src="www/fileSystems.js" name="fileSystems" />

    <js-module src="www/requestFileSystem.js" name="requestFileSystem">
        <clobbers target="window.requestFileSystem" />
    </js-module>

    <js-module src="www/resolveLocalFileSystemURI.js" name="resolveLocalFileSystemURI">
        <merges target="window" />
    </js-module>

    <!-- Required for browserify: we always link module below as there is conditional reference
    to this module from requestFileSystem and resolveLocalFileSystemURI modules. -->
    <js-module src="www/browser/isChrome.js" name="isChrome">
        <runs />
    </js-module>

    <!-- android -->
    <platform name="android">
        <info>
The Android Persistent storage location now defaults to "Internal". Please check this plugin's README to see if your application needs any changes in its config.xml.

If this is a new application no changes are required.

If this is an update to an existing application that did not specify an "AndroidPersistentFileLocation" you may need to add:

      "&lt;preference name="AndroidPersistentFileLocation" value="Compatibility" /&gt;"

to config.xml in order for the application to find previously stored files.
        </info>
        <config-file target="res/xml/config.xml" parent="/*">
            <feature name="File" >
                <param name="android-package" value="org.apache.cordova.file.FileUtils"/>
                <param name="onload" value="true" />
            </feature>
            <allow-navigation href="cdvfile:*" />
        </config-file>

        <config-file target="AndroidManifest.xml" parent="/*">
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        </config-file>

        <source-file src="src/android/EncodingException.java" target-dir="src/org/apache/cordova/file" />
        <source-file src="src/android/FileExistsException.java" target-dir="src/org/apache/cordova/file" />
        <source-file src="src/android/InvalidModificationException.java" target-dir="src/org/apache/cordova/file" />
        <source-file src="src/android/NoModificationAllowedException.java" target-dir="src/org/apache/cordova/file" />
        <source-file src="src/android/TypeMismatchException.java" target-dir="src/org/apache/cordova/file" />
        <source-file src="src/android/FileUtils.java" target-dir="src/org/apache/cordova/file" />
        <source-file src="src/android/DirectoryManager.java" target-dir="src/org/apache/cordova/file" />
        <source-file src="src/android/LocalFilesystemURL.java" target-dir="src/org/apache/cordova/file" />
        <source-file src="src/android/Filesystem.java" target-dir="src/org/apache/cordova/file" />
        <source-file src="src/android/LocalFilesystem.java" target-dir="src/org/apache/cordova/file" />
        <source-file src="src/android/ContentFilesystem.java" target-dir="src/org/apache/cordova/file" />
        <source-file src="src/android/AssetFilesystem.java" target-dir="src/org/apache/cordova/file" />
        <source-file src="src/android/PendingRequests.java" target-dir="src/org/apache/cordova/file" />

        <!-- android specific file apis -->
        <js-module src="www/android/FileSystem.js" name="androidFileSystem">
            <merges target="FileSystem" />
        </js-module>
        <js-module src="www/fileSystems-roots.js" name="fileSystems-roots">
            <runs/>
        </js-module>
        <js-module src="www/fileSystemPaths.js" name="fileSystemPaths">
            <merges target="cordova" />
            <runs/>
        </js-module>
    </platform>

    <!-- ios -->
    <platform name="ios">
        <config-file target="config.xml" parent="/*">
            <feature name="File">
                <param name="ios-package" value="CDVFile" />
                <param name="onload" value="true" />
            </feature>
        </config-file>
        <header-file src="src/ios/CDVFile.h" />
        <source-file src="src/ios/CDVFile.m" />
        <header-file src="src/ios/CDVLocalFilesystem.h" />
        <source-file src="src/ios/CDVLocalFilesystem.m" />
        <header-file src="src/ios/CDVAssetLibraryFilesystem.h" />
        <source-file src="src/ios/CDVAssetLibraryFilesystem.m" />

        <!-- ios specific file apis -->
        <js-module src="www/ios/FileSystem.js" name="iosFileSystem">
            <merges target="FileSystem" />
        </js-module>

        <js-module src="www/fileSystems-roots.js" name="fileSystems-roots">
            <runs/>
        </js-module>

        <js-module src="www/fileSystemPaths.js" name="fileSystemPaths">
            <merges target="cordova" />
            <runs/>
        </js-module>

        <framework src="AssetsLibrary.framework" />
        <framework src="MobileCoreServices.framework" />
    </platform>

    <!-- osx -->
    <platform name="osx">
        <config-file target="config.xml" parent="/*">
            <feature name="File">
                <param name="ios-package" value="CDVFile" />
                <param name="onload" value="true" />
            </feature>
        </config-file>
        <header-file src="src/osx/CDVFile.h" />
        <source-file src="src/osx/CDVFile.m" />
        <header-file src="src/osx/CDVLocalFilesystem.h" />
        <source-file src="src/osx/CDVLocalFilesystem.m" />

        <!-- osx specific file apis -->
        <js-module src="www/osx/FileSystem.js" name="osxFileSystem">
            <merges target="FileSystem" />
        </js-module>

        <js-module src="www/fileSystems-roots.js" name="fileSystems-roots">
            <runs/>
        </js-module>

        <js-module src="www/fileSystemPaths.js" name="fileSystemPaths">
            <merges target="cordova" />
            <runs/>
        </js-module>
    </platform>

    <!-- windows -->
    <platform name="windows">
        <js-module src="src/windows/FileProxy.js" name="FileProxy">
            <runs />
        </js-module>

        <js-module src="www/fileSystemPaths.js" name="fileSystemPaths">
            <merges target="cordova" />
            <runs/>
        </js-module>
    </platform>

    <platform name="browser">
        <!-- File for Chrome -->
        <js-module src="www/browser/Preparing.js" name="Preparing">
            <runs />
        </js-module>

        <js-module src="src/browser/FileProxy.js" name="browserFileProxy">
            <runs />
        </js-module>

        <js-module src="www/fileSystemPaths.js" name="fileSystemPaths">
            <merges target="cordova" />
            <runs />
        </js-module>

        <js-module src="www/browser/FileSystem.js" name="firefoxFileSystem">
            <merges target="window.FileSystem" />
        </js-module>
    </platform>

</plugin>
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var argscheck = require('cordova/argscheck');
var utils = require('cordova/utils');
var exec = require('cordova/exec');
var Entry = require('./Entry');
var FileError = require('./FileError');
var DirectoryReader = require('./DirectoryReader');

/**
 * An interface representing a directory on the file system.
 *
 * {boolean} isFile always false (readonly)
 * {boolean} isDirectory always true (readonly)
 * {DOMString} name of the directory, excluding the path leading to it (readonly)
 * {DOMString} fullPath the absolute full path to the directory (readonly)
 * {FileSystem} filesystem on which the directory resides (readonly)
 */
var DirectoryEntry = function (name, fullPath, fileSystem, nativeURL) {

    // add trailing slash if it is missing
    if ((fullPath) && !/\/$/.test(fullPath)) {
        fullPath += '/';
    }
    // add trailing slash if it is missing
    if (nativeURL && !/\/$/.test(nativeURL)) {
        nativeURL += '/';
    }
    DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath, fileSystem, nativeURL);
};

utils.extend(DirectoryEntry, Entry);

/**
 * Creates a new DirectoryReader to read entries from this directory
 */
DirectoryEntry.prototype.createReader = function () {
    return new DirectoryReader(this.toInternalURL());
};

/**
 * Creates or looks up a directory
 *
 * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory
 * @param {Flags} options to create or exclusively create the directory
 * @param {Function} successCallback is called with the new entry
 * @param {Function} errorCallback is called with a FileError
 */
DirectoryEntry.prototype.getDirectory = function (path, options, successCallback, errorCallback) {
    argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments);
    var fs = this.filesystem;
    var win = successCallback && function (result) {
        var entry = new DirectoryEntry(result.name, result.fullPath, fs, result.nativeURL);
        successCallback(entry);
    };
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(win, fail, 'File', 'getDirectory', [this.toInternalURL(), path, options]);
};

/**
 * Deletes a directory and all of it's contents
 *
 * @param {Function} successCallback is called with no parameters
 * @param {Function} errorCallback is called with a FileError
 */
DirectoryEntry.prototype.removeRecursively = function (successCallback, errorCallback) {
    argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments);
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(successCallback, fail, 'File', 'removeRecursively', [this.toInternalURL()]);
};

/**
 * Creates or looks up a file
 *
 * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file
 * @param {Flags} options to create or exclusively create the file
 * @param {Function} successCallback is called with the new entry
 * @param {Function} errorCallback is called with a FileError
 */
DirectoryEntry.prototype.getFile = function (path, options, successCallback, errorCallback) {
    argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments);
    var fs = this.filesystem;
    var win = successCallback && function (result) {
        var FileEntry = require('./FileEntry');
        var entry = new FileEntry(result.name, result.fullPath, fs, result.nativeURL);
        successCallback(entry);
    };
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(win, fail, 'File', 'getFile', [this.toInternalURL(), path, options]);
};

module.exports = DirectoryEntry;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var exec = require('cordova/exec');
var FileError = require('./FileError');

/**
 * An interface that lists the files and directories in a directory.
 */
function DirectoryReader (localURL) {
    this.localURL = localURL || null;
    this.hasReadEntries = false;
}

/**
 * Returns a list of entries from a directory.
 *
 * @param {Function} successCallback is called with a list of entries
 * @param {Function} errorCallback is called with a FileError
 */
DirectoryReader.prototype.readEntries = function (successCallback, errorCallback) {
    // If we've already read and passed on this directory's entries, return an empty list.
    if (this.hasReadEntries) {
        successCallback([]);
        return;
    }
    var reader = this;
    var win = typeof successCallback !== 'function' ? null : function (result) {
        var retVal = [];
        for (var i = 0; i < result.length; i++) {
            var entry = null;
            if (result[i].isDirectory) {
                entry = new (require('./DirectoryEntry'))();
            } else if (result[i].isFile) {
                entry = new (require('./FileEntry'))();
            }
            entry.isDirectory = result[i].isDirectory;
            entry.isFile = result[i].isFile;
            entry.name = result[i].name;
            entry.fullPath = result[i].fullPath;
            entry.filesystem = new (require('./FileSystem'))(result[i].filesystemName);
            entry.nativeURL = result[i].nativeURL;
            retVal.push(entry);
        }
        reader.hasReadEntries = true;
        successCallback(retVal);
    };
    var fail = typeof errorCallback !== 'function' ? null : function (code) {
        errorCallback(new FileError(code));
    };
    exec(win, fail, 'File', 'readEntries', [this.localURL]);
};

module.exports = DirectoryReader;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var argscheck = require('cordova/argscheck');
var exec = require('cordova/exec');
var FileError = require('./FileError');
var Metadata = require('./Metadata');

/**
 * Represents a file or directory on the local file system.
 *
 * @param isFile
 *            {boolean} true if Entry is a file (readonly)
 * @param isDirectory
 *            {boolean} true if Entry is a directory (readonly)
 * @param name
 *            {DOMString} name of the file or directory, excluding the path
 *            leading to it (readonly)
 * @param fullPath
 *            {DOMString} the absolute full path to the file or directory
 *            (readonly)
 * @param fileSystem
 *            {FileSystem} the filesystem on which this entry resides
 *            (readonly)
 * @param nativeURL
 *            {DOMString} an alternate URL which can be used by native
 *            webview controls, for example media players.
 *            (optional, readonly)
 */
function Entry (isFile, isDirectory, name, fullPath, fileSystem, nativeURL) {
    this.isFile = !!isFile;
    this.isDirectory = !!isDirectory;
    this.name = name || '';
    this.fullPath = fullPath || '';
    this.filesystem = fileSystem || null;
    this.nativeURL = nativeURL || null;
}

/**
 * Look up the metadata of the entry.
 *
 * @param successCallback
 *            {Function} is called with a Metadata object
 * @param errorCallback
 *            {Function} is called with a FileError
 */
Entry.prototype.getMetadata = function (successCallback, errorCallback) {
    argscheck.checkArgs('FF', 'Entry.getMetadata', arguments);
    var success = successCallback && function (entryMetadata) {
        var metadata = new Metadata({
            size: entryMetadata.size,
            modificationTime: entryMetadata.lastModifiedDate
        });
        successCallback(metadata);
    };
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(success, fail, 'File', 'getFileMetadata', [this.toInternalURL()]);
};

/**
 * Set the metadata of the entry.
 *
 * @param successCallback
 *            {Function} is called with a Metadata object
 * @param errorCallback
 *            {Function} is called with a FileError
 * @param metadataObject
 *            {Object} keys and values to set
 */
Entry.prototype.setMetadata = function (successCallback, errorCallback, metadataObject) {
    argscheck.checkArgs('FFO', 'Entry.setMetadata', arguments);
    exec(successCallback, errorCallback, 'File', 'setMetadata', [this.toInternalURL(), metadataObject]);
};

/**
 * Move a file or directory to a new location.
 *
 * @param parent
 *            {DirectoryEntry} the directory to which to move this entry
 * @param newName
 *            {DOMString} new name of the entry, defaults to the current name
 * @param successCallback
 *            {Function} called with the new DirectoryEntry object
 * @param errorCallback
 *            {Function} called with a FileError
 */
Entry.prototype.moveTo = function (parent, newName, successCallback, errorCallback) {
    argscheck.checkArgs('oSFF', 'Entry.moveTo', arguments);
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    var srcURL = this.toInternalURL();
    // entry name
    var name = newName || this.name;
    var success = function (entry) {
        if (entry) {
            if (successCallback) {
                // create appropriate Entry object
                var newFSName = entry.filesystemName || (entry.filesystem && entry.filesystem.name);
                var fs = newFSName ? new FileSystem(newFSName, { name: '', fullPath: '/' }) : new FileSystem(parent.filesystem.name, { name: '', fullPath: '/' }); // eslint-disable-line no-undef
                var result = (entry.isDirectory) ? new (require('./DirectoryEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL) : new (require('cordova-plugin-file.FileEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL);
                successCallback(result);
            }
        } else {
            // no Entry object returned
            if (fail) {
                fail(FileError.NOT_FOUND_ERR);
            }
        }
    };

    // copy
    exec(success, fail, 'File', 'moveTo', [srcURL, parent.toInternalURL(), name]);
};

/**
 * Copy a directory to a different location.
 *
 * @param parent
 *            {DirectoryEntry} the directory to which to copy the entry
 * @param newName
 *            {DOMString} new name of the entry, defaults to the current name
 * @param successCallback
 *            {Function} called with the new Entry object
 * @param errorCallback
 *            {Function} called with a FileError
 */
Entry.prototype.copyTo = function (parent, newName, successCallback, errorCallback) {
    argscheck.checkArgs('oSFF', 'Entry.copyTo', arguments);
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    var srcURL = this.toInternalURL();
        // entry name
    var name = newName || this.name;
    // success callback
    var success = function (entry) {
        if (entry) {
            if (successCallback) {
                // create appropriate Entry object
                var newFSName = entry.filesystemName || (entry.filesystem && entry.filesystem.name);
                var fs = newFSName ? new FileSystem(newFSName, { name: '', fullPath: '/' }) : new FileSystem(parent.filesystem.name, { name: '', fullPath: '/' }); // eslint-disable-line no-undef
                var result = (entry.isDirectory) ? new (require('./DirectoryEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL) : new (require('cordova-plugin-file.FileEntry'))(entry.name, entry.fullPath, fs, entry.nativeURL);
                successCallback(result);
            }
        } else {
            // no Entry object returned
            if (fail) {
                fail(FileError.NOT_FOUND_ERR);
            }
        }
    };

    // copy
    exec(success, fail, 'File', 'copyTo', [srcURL, parent.toInternalURL(), name]);
};

/**
 * Return a URL that can be passed across the bridge to identify this entry.
 */
Entry.prototype.toInternalURL = function () {
    if (this.filesystem && this.filesystem.__format__) {
        return this.filesystem.__format__(this.fullPath, this.nativeURL);
    }
};

/**
 * Return a URL that can be used to identify this entry.
 * Use a URL that can be used to as the src attribute of a <video> or
 * <audio> tag. If that is not possible, construct a cdvfile:// URL.
 */
Entry.prototype.toURL = function () {
    if (this.nativeURL) {
        return this.nativeURL;
    }
    // fullPath attribute may contain the full URL in the case that
    // toInternalURL fails.
    return this.toInternalURL() || 'file://localhost' + this.fullPath;
};

/**
 * Backwards-compatibility: In v1.0.0 - 1.0.2, .toURL would only return a
 * cdvfile:// URL, and this method was necessary to obtain URLs usable by the
 * webview.
 * See CB-6051, CB-6106, CB-6117, CB-6152, CB-6199, CB-6201, CB-6243, CB-6249,
 * and CB-6300.
 */
Entry.prototype.toNativeURL = function () {
    console.log("DEPRECATED: Update your code to use 'toURL'");
    return this.toURL();
};

/**
 * Returns a URI that can be used to identify this entry.
 *
 * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI.
 * @return uri
 */
Entry.prototype.toURI = function (mimeType) {
    console.log("DEPRECATED: Update your code to use 'toURL'");
    return this.toURL();
};

/**
 * Remove a file or directory. It is an error to attempt to delete a
 * directory that is not empty. It is an error to attempt to delete a
 * root directory of a file system.
 *
 * @param successCallback {Function} called with no parameters
 * @param errorCallback {Function} called with a FileError
 */
Entry.prototype.remove = function (successCallback, errorCallback) {
    argscheck.checkArgs('FF', 'Entry.remove', arguments);
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(successCallback, fail, 'File', 'remove', [this.toInternalURL()]);
};

/**
 * Look up the parent DirectoryEntry of this entry.
 *
 * @param successCallback {Function} called with the parent DirectoryEntry object
 * @param errorCallback {Function} called with a FileError
 */
Entry.prototype.getParent = function (successCallback, errorCallback) {
    argscheck.checkArgs('FF', 'Entry.getParent', arguments);
    var fs = this.filesystem;
    var win = successCallback && function (result) {
        var DirectoryEntry = require('./DirectoryEntry');
        var entry = new DirectoryEntry(result.name, result.fullPath, fs, result.nativeURL);
        successCallback(entry);
    };
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(win, fail, 'File', 'getParent', [this.toInternalURL()]);
};

module.exports = Entry;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/**
 * Constructor.
 * name {DOMString} name of the file, without path information
 * fullPath {DOMString} the full path of the file, including the name
 * type {DOMString} mime type
 * lastModifiedDate {Date} last modified date
 * size {Number} size of the file in bytes
 */

var File = function (name, localURL, type, lastModifiedDate, size) {
    this.name = name || '';
    this.localURL = localURL || null;
    this.type = type || null;
    this.lastModified = lastModifiedDate || null;
    // For backwards compatibility, store the timestamp in lastModifiedDate as well
    this.lastModifiedDate = lastModifiedDate || null;
    this.size = size || 0;

    // These store the absolute start and end for slicing the file.
    this.start = 0;
    this.end = this.size;
};

/**
 * Returns a "slice" of the file. Since Cordova Files don't contain the actual
 * content, this really returns a File with adjusted start and end.
 * Slices of slices are supported.
 * start {Number} The index at which to start the slice (inclusive).
 * end {Number} The index at which to end the slice (exclusive).
 */
File.prototype.slice = function (start, end) {
    var size = this.end - this.start;
    var newStart = 0;
    var newEnd = size;
    if (arguments.length) {
        if (start < 0) {
            newStart = Math.max(size + start, 0);
        } else {
            newStart = Math.min(size, start);
        }
    }

    if (arguments.length >= 2) {
        if (end < 0) {
            newEnd = Math.max(size + end, 0);
        } else {
            newEnd = Math.min(end, size);
        }
    }

    var newFile = new File(this.name, this.localURL, this.type, this.lastModified, this.size);
    newFile.start = this.start + newStart;
    newFile.end = this.start + newEnd;
    return newFile;
};

module.exports = File;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var utils = require('cordova/utils');
var exec = require('cordova/exec');
var Entry = require('./Entry');
var FileWriter = require('./FileWriter');
var File = require('./File');
var FileError = require('./FileError');

/**
 * An interface representing a file on the file system.
 *
 * {boolean} isFile always true (readonly)
 * {boolean} isDirectory always false (readonly)
 * {DOMString} name of the file, excluding the path leading to it (readonly)
 * {DOMString} fullPath the absolute full path to the file (readonly)
 * {FileSystem} filesystem on which the file resides (readonly)
 */
var FileEntry = function (name, fullPath, fileSystem, nativeURL) {
    // remove trailing slash if it is present
    if (fullPath && /\/$/.test(fullPath)) {
        fullPath = fullPath.substring(0, fullPath.length - 1);
    }
    if (nativeURL && /\/$/.test(nativeURL)) {
        nativeURL = nativeURL.substring(0, nativeURL.length - 1);
    }

    FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath, fileSystem, nativeURL]);
};

utils.extend(FileEntry, Entry);

/**
 * Creates a new FileWriter associated with the file that this FileEntry represents.
 *
 * @param {Function} successCallback is called with the new FileWriter
 * @param {Function} errorCallback is called with a FileError
 */
FileEntry.prototype.createWriter = function (successCallback, errorCallback) {
    this.file(function (filePointer) {
        var writer = new FileWriter(filePointer);

        if (writer.localURL === null || writer.localURL === '') {
            if (errorCallback) {
                errorCallback(new FileError(FileError.INVALID_STATE_ERR));
            }
        } else {
            if (successCallback) {
                successCallback(writer);
            }
        }
    }, errorCallback);
};

/**
 * Returns a File that represents the current state of the file that this FileEntry represents.
 *
 * @param {Function} successCallback is called with the new File object
 * @param {Function} errorCallback is called with a FileError
 */
FileEntry.prototype.file = function (successCallback, errorCallback) {
    var localURL = this.toInternalURL();
    var win = successCallback && function (f) {
        var file = new File(f.name, localURL, f.type, f.lastModifiedDate, f.size);
        successCallback(file);
    };
    var fail = errorCallback && function (code) {
        errorCallback(new FileError(code));
    };
    exec(win, fail, 'File', 'getFileMetadata', [localURL]);
};

module.exports = FileEntry;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/**
 * FileError
 */
function FileError (error) {
    this.code = error || null;
}

// File error codes
// Found in DOMException
FileError.NOT_FOUND_ERR = 1;
FileError.SECURITY_ERR = 2;
FileError.ABORT_ERR = 3;

// Added by File API specification
FileError.NOT_READABLE_ERR = 4;
FileError.ENCODING_ERR = 5;
FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
FileError.INVALID_STATE_ERR = 7;
FileError.SYNTAX_ERR = 8;
FileError.INVALID_MODIFICATION_ERR = 9;
FileError.QUOTA_EXCEEDED_ERR = 10;
FileError.TYPE_MISMATCH_ERR = 11;
FileError.PATH_EXISTS_ERR = 12;

module.exports = FileError;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var exec = require('cordova/exec');
var modulemapper = require('cordova/modulemapper');
var utils = require('cordova/utils');
var FileError = require('./FileError');
var ProgressEvent = require('./ProgressEvent');
var origFileReader = modulemapper.getOriginalSymbol(window, 'FileReader');

/**
 * This class reads the mobile device file system.
 *
 * For Android:
 *      The root directory is the root of the file system.
 *      To read from the SD card, the file name is "sdcard/my_file.txt"
 * @constructor
 */
var FileReader = function () {
    this._readyState = 0;
    this._error = null;
    this._result = null;
    this._progress = null;
    this._localURL = '';
    this._realReader = origFileReader ? new origFileReader() : {}; // eslint-disable-line new-cap
};

/**
 * Defines the maximum size to read at a time via the native API. The default value is a compromise between
 * minimizing the overhead of many exec() calls while still reporting progress frequently enough for large files.
 * (Note attempts to allocate more than a few MB of contiguous memory on the native side are likely to cause
 * OOM exceptions, while the JS engine seems to have fewer problems managing large strings or ArrayBuffers.)
 */
FileReader.READ_CHUNK_SIZE = 256 * 1024;

// States
FileReader.EMPTY = 0;
FileReader.LOADING = 1;
FileReader.DONE = 2;

utils.defineGetter(FileReader.prototype, 'readyState', function () {
    return this._localURL ? this._readyState : this._realReader.readyState;
});

utils.defineGetter(FileReader.prototype, 'error', function () {
    return this._localURL ? this._error : this._realReader.error;
});

utils.defineGetter(FileReader.prototype, 'result', function () {
    return this._localURL ? this._result : this._realReader.result;
});

function defineEvent (eventName) {
    utils.defineGetterSetter(FileReader.prototype, eventName, function () {
        return this._realReader[eventName] || null;
    }, function (value) {
        this._realReader[eventName] = value;
    });
}
defineEvent('onloadstart');    // When the read starts.
defineEvent('onprogress');     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total)
defineEvent('onload');         // When the read has successfully completed.
defineEvent('onerror');        // When the read has failed (see errors).
defineEvent('onloadend');      // When the request has completed (either in success or failure).
defineEvent('onabort');        // When the read has been aborted. For instance, by invoking the abort() method.

function initRead (reader, file) {
    // Already loading something
    if (reader.readyState === FileReader.LOADING) {
        throw new FileError(FileError.INVALID_STATE_ERR);
    }

    reader._result = null;
    reader._error = null;
    reader._progress = 0;
    reader._readyState = FileReader.LOADING;

    if (typeof file.localURL === 'string') {
        reader._localURL = file.localURL;
    } else {
        reader._localURL = '';
        return true;
    }

    if (reader.onloadstart) {
        reader.onloadstart(new ProgressEvent('loadstart', {target: reader}));
    }
}

/**
 * Callback used by the following read* functions to handle incremental or final success.
 * Must be bound to the FileReader's this along with all but the last parameter,
 * e.g. readSuccessCallback.bind(this, "readAsText", "UTF-8", offset, totalSize, accumulate)
 * @param readType The name of the read function to call.
 * @param encoding Text encoding, or null if this is not a text type read.
 * @param offset Starting offset of the read.
 * @param totalSize Total number of bytes or chars to read.
 * @param accumulate A function that takes the callback result and accumulates it in this._result.
 * @param r Callback result returned by the last read exec() call, or null to begin reading.
 */
function readSuccessCallback (readType, encoding, offset, totalSize, accumulate, r) {
    if (this._readyState === FileReader.DONE) {
        return;
    }

    var CHUNK_SIZE = FileReader.READ_CHUNK_SIZE;
    if (readType === 'readAsDataURL') {
        // Windows proxy does not support reading file slices as Data URLs
        // so read the whole file at once.
        CHUNK_SIZE = cordova.platformId === 'windows' ? totalSize : // eslint-disable-line no-undef
            // Calculate new chunk size for data URLs to be multiply of 3
            // Otherwise concatenated base64 chunks won't be valid base64 data
            FileReader.READ_CHUNK_SIZE - (FileReader.READ_CHUNK_SIZE % 3) + 3;
    }

    if (typeof r !== 'undefined') {
        accumulate(r);
        this._progress = Math.min(this._progress + CHUNK_SIZE, totalSize);

        if (typeof this.onprogress === 'function') {
            this.onprogress(new ProgressEvent('progress', {loaded: this._progress, total: totalSize}));
        }
    }

    if (typeof r === 'undefined' || this._progress < totalSize) {
        var execArgs = [
            this._localURL,
            offset + this._progress,
            offset + this._progress + Math.min(totalSize - this._progress, CHUNK_SIZE)];
        if (encoding) {
            execArgs.splice(1, 0, encoding);
        }
        exec(
            readSuccessCallback.bind(this, readType, encoding, offset, totalSize, accumulate),
            readFailureCallback.bind(this),
            'File', readType, execArgs);
    } else {
        this._readyState = FileReader.DONE;

        if (typeof this.onload === 'function') {
            this.onload(new ProgressEvent('load', {target: this}));
        }

        if (typeof this.onloadend === 'function') {
            this.onloadend(new ProgressEvent('loadend', {target: this}));
        }
    }
}

/**
 * Callback used by the following read* functions to handle errors.
 * Must be bound to the FileReader's this, e.g. readFailureCallback.bind(this)
 */
function readFailureCallback (e) {
    if (this._readyState === FileReader.DONE) {
        return;
    }

    this._readyState = FileReader.DONE;
    this._result = null;
    this._error = new FileError(e);

    if (typeof this.onerror === 'function') {
        this.onerror(new ProgressEvent('error', {target: this}));
    }

    if (typeof this.onloadend === 'function') {
        this.onloadend(new ProgressEvent('loadend', {target: this}));
    }
}

/**
 * Abort reading file.
 */
FileReader.prototype.abort = function () {
    if (origFileReader && !this._localURL) {
        return this._realReader.abort();
    }
    this._result = null;

    if (this._readyState === FileReader.DONE || this._readyState === FileReader.EMPTY) {
        return;
    }

    this._readyState = FileReader.DONE;

    // If abort callback
    if (typeof this.onabort === 'function') {
        this.onabort(new ProgressEvent('abort', {target: this}));
    }
    // If load end callback
    if (typeof this.onloadend === 'function') {
        this.onloadend(new ProgressEvent('loadend', {target: this}));
    }
};

/**
 * Read text file.
 *
 * @param file          {File} File object containing file properties
 * @param encoding      [Optional] (see http://www.iana.org/assignments/character-sets)
 */
FileReader.prototype.readAsText = function (file, encoding) {
    if (initRead(this, file)) {
        return this._realReader.readAsText(file, encoding);
    }

    // Default encoding is UTF-8
    var enc = encoding || 'UTF-8';

    var totalSize = file.end - file.start;
    readSuccessCallback.bind(this)('readAsText', enc, file.start, totalSize, function (r) {
        if (this._progress === 0) {
            this._result = '';
        }
        this._result += r;
    }.bind(this));
};

/**
 * Read file and return data as a base64 encoded data url.
 * A data url is of the form:
 *      data:[<mediatype>][;base64],<data>
 *
 * @param file          {File} File object containing file properties
 */
FileReader.prototype.readAsDataURL = function (file) {
    if (initRead(this, file)) {
        return this._realReader.readAsDataURL(file);
    }

    var totalSize = file.end - file.start;
    readSuccessCallback.bind(this)('readAsDataURL', null, file.start, totalSize, function (r) {
        var commaIndex = r.indexOf(',');
        if (this._progress === 0) {
            this._result = r;
        } else {
            this._result += r.substring(commaIndex + 1);
        }
    }.bind(this));
};

/**
 * Read file and return data as a binary data.
 *
 * @param file          {File} File object containing file properties
 */
FileReader.prototype.readAsBinaryString = function (file) {
    if (initRead(this, file)) {
        return this._realReader.readAsBinaryString(file);
    }

    var totalSize = file.end - file.start;
    readSuccessCallback.bind(this)('readAsBinaryString', null, file.start, totalSize, function (r) {
        if (this._progress === 0) {
            this._result = '';
        }
        this._result += r;
    }.bind(this));
};

/**
 * Read file and return data as a binary data.
 *
 * @param file          {File} File object containing file properties
 */
FileReader.prototype.readAsArrayBuffer = function (file) {
    if (initRead(this, file)) {
        return this._realReader.readAsArrayBuffer(file);
    }

    var totalSize = file.end - file.start;
    readSuccessCallback.bind(this)('readAsArrayBuffer', null, file.start, totalSize, function (r) {
        var resultArray = (this._progress === 0 ? new Uint8Array(totalSize) : new Uint8Array(this._result));
        resultArray.set(new Uint8Array(r), this._progress);
        this._result = resultArray.buffer;
    }.bind(this));
};

module.exports = FileReader;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var DirectoryEntry = require('./DirectoryEntry');

/**
 * An interface representing a file system
 *
 * @constructor
 * {DOMString} name the unique name of the file system (readonly)
 * {DirectoryEntry} root directory of the file system (readonly)
 */
var FileSystem = function (name, root) {
    this.name = name;
    if (root) {
        this.root = new DirectoryEntry(root.name, root.fullPath, this, root.nativeURL);
    } else {
        this.root = new DirectoryEntry(this.name, '/', this);
    }
};

FileSystem.prototype.__format__ = function (fullPath, nativeUrl) {
    return fullPath;
};

FileSystem.prototype.toJSON = function () {
    return '<FileSystem: ' + this.name + '>';
};

// Use instead of encodeURI() when encoding just the path part of a URI rather than an entire URI.
FileSystem.encodeURIPath = function (path) {
    // Because # is a valid filename character, it must be encoded to prevent part of the
    // path from being parsed as a URI fragment.
    return encodeURI(path).replace(/#/g, '%23');
};

module.exports = FileSystem;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/**
 * Options to customize the HTTP request used to upload files.
 * @constructor
 * @param fileKey {String}   Name of file request parameter.
 * @param fileName {String}  Filename to be used by the server. Defaults to image.jpg.
 * @param mimeType {String}  Mimetype of the uploaded file. Defaults to image/jpeg.
 * @param params {Object}    Object with key: value params to send to the server.
 * @param headers {Object}   Keys are header names, values are header values. Multiple
 *                           headers of the same name are not supported.
 */
var FileUploadOptions = function (fileKey, fileName, mimeType, params, headers, httpMethod) {
    this.fileKey = fileKey || null;
    this.fileName = fileName || null;
    this.mimeType = mimeType || null;
    this.params = params || null;
    this.headers = headers || null;
    this.httpMethod = httpMethod || null;
};

module.exports = FileUploadOptions;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/**
 * FileUploadResult
 * @constructor
 */
module.exports = function FileUploadResult (size, code, content) {
    this.bytesSent = size;
    this.responseCode = code;
    this.response = content;
};
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var exec = require('cordova/exec');
var FileError = require('./FileError');
var FileReader = require('./FileReader');
var ProgressEvent = require('./ProgressEvent');

/**
 * This class writes to the mobile device file system.
 *
 * For Android:
 *      The root directory is the root of the file system.
 *      To write to the SD card, the file name is "sdcard/my_file.txt"
 *
 * @constructor
 * @param file {File} File object containing file properties
 * @param append if true write to the end of the file, otherwise overwrite the file
 */
var FileWriter = function (file) {
    this.fileName = '';
    this.length = 0;
    if (file) {
        this.localURL = file.localURL || file;
        this.length = file.size || 0;
    }
    // default is to write at the beginning of the file
    this.position = 0;

    this.readyState = 0; // EMPTY

    this.result = null;

    // Error
    this.error = null;

    // Event handlers
    this.onwritestart = null;   // When writing starts
    this.onprogress = null;     // While writing the file, and reporting partial file data
    this.onwrite = null;        // When the write has successfully completed.
    this.onwriteend = null;     // When the request has completed (either in success or failure).
    this.onabort = null;        // When the write has been aborted. For instance, by invoking the abort() method.
    this.onerror = null;        // When the write has failed (see errors).
};

// States
FileWriter.INIT = 0;
FileWriter.WRITING = 1;
FileWriter.DONE = 2;

/**
 * Abort writing file.
 */
FileWriter.prototype.abort = function () {
    // check for invalid state
    if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) {
        throw new FileError(FileError.INVALID_STATE_ERR);
    }

    // set error
    this.error = new FileError(FileError.ABORT_ERR);

    this.readyState = FileWriter.DONE;

    // If abort callback
    if (typeof this.onabort === 'function') {
        this.onabort(new ProgressEvent('abort', {'target': this}));
    }

    // If write end callback
    if (typeof this.onwriteend === 'function') {
        this.onwriteend(new ProgressEvent('writeend', {'target': this}));
    }
};

/**
 * Writes data to the file
 *
 * @param data text or blob to be written
 * @param isPendingBlobReadResult {Boolean} true if the data is the pending blob read operation result
 */
FileWriter.prototype.write = function (data, isPendingBlobReadResult) {

    var that = this;
    var supportsBinary = (typeof window.Blob !== 'undefined' && typeof window.ArrayBuffer !== 'undefined');
    /* eslint-disable no-undef */
    var isProxySupportBlobNatively = (cordova.platformId === 'windows8' || cordova.platformId === 'windows');
    var isBinary;

    // Check to see if the incoming data is a blob
    if (data instanceof File || (!isProxySupportBlobNatively && supportsBinary && data instanceof Blob)) {
        var fileReader = new FileReader();
        /* eslint-enable no-undef */
        fileReader.onload = function () {
            // Call this method again, with the arraybuffer as argument
            FileWriter.prototype.write.call(that, this.result, true /* isPendingBlobReadResult */);
        };
        fileReader.onerror = function () {
            // DONE state
            that.readyState = FileWriter.DONE;

            // Save error
            that.error = this.error;

            // If onerror callback
            if (typeof that.onerror === 'function') {
                that.onerror(new ProgressEvent('error', {'target': that}));
            }

            // If onwriteend callback
            if (typeof that.onwriteend === 'function') {
                that.onwriteend(new ProgressEvent('writeend', {'target': that}));
            }
        };

        // WRITING state
        this.readyState = FileWriter.WRITING;

        if (supportsBinary) {
            fileReader.readAsArrayBuffer(data);
        } else {
            fileReader.readAsText(data);
        }
        return;
    }

    // Mark data type for safer transport over the binary bridge
    isBinary = supportsBinary && (data instanceof ArrayBuffer);
    if (isBinary && cordova.platformId === 'windowsphone') { // eslint-disable-line no-undef
        // create a plain array, using the keys from the Uint8Array view so that we can serialize it
        data = Array.apply(null, new Uint8Array(data));
    }

    // Throw an exception if we are already writing a file
    if (this.readyState === FileWriter.WRITING && !isPendingBlobReadResult) {
        throw new FileError(FileError.INVALID_STATE_ERR);
    }

    // WRITING state
    this.readyState = FileWriter.WRITING;

    var me = this;

    // If onwritestart callback
    if (typeof me.onwritestart === 'function') {
        me.onwritestart(new ProgressEvent('writestart', {'target': me}));
    }

    // Write file
    exec(
        // Success callback
        function (r) {
            // If DONE (cancelled), then don't do anything
            if (me.readyState === FileWriter.DONE) {
                return;
            }

            // position always increases by bytes written because file would be extended
            me.position += r;
            // The length of the file is now where we are done writing.

            me.length = me.position;

            // DONE state
            me.readyState = FileWriter.DONE;

            // If onwrite callback
            if (typeof me.onwrite === 'function') {
                me.onwrite(new ProgressEvent('write', {'target': me}));
            }

            // If onwriteend callback
            if (typeof me.onwriteend === 'function') {
                me.onwriteend(new ProgressEvent('writeend', {'target': me}));
            }
        },
        // Error callback
        function (e) {
            // If DONE (cancelled), then don't do anything
            if (me.readyState === FileWriter.DONE) {
                return;
            }

            // DONE state
            me.readyState = FileWriter.DONE;

            // Save error
            me.error = new FileError(e);

            // If onerror callback
            if (typeof me.onerror === 'function') {
                me.onerror(new ProgressEvent('error', {'target': me}));
            }

            // If onwriteend callback
            if (typeof me.onwriteend === 'function') {
                me.onwriteend(new ProgressEvent('writeend', {'target': me}));
            }
        }, 'File', 'write', [this.localURL, data, this.position, isBinary]);
};

/**
 * Moves the file pointer to the location specified.
 *
 * If the offset is a negative number the position of the file
 * pointer is rewound.  If the offset is greater than the file
 * size the position is set to the end of the file.
 *
 * @param offset is the location to move the file pointer to.
 */
FileWriter.prototype.seek = function (offset) {
    // Throw an exception if we are already writing a file
    if (this.readyState === FileWriter.WRITING) {
        throw new FileError(FileError.INVALID_STATE_ERR);
    }

    if (!offset && offset !== 0) {
        return;
    }

    // See back from end of file.
    if (offset < 0) {
        this.position = Math.max(offset + this.length, 0);
    // Offset is bigger than file size so set position
    // to the end of the file.
    } else if (offset > this.length) {
        this.position = this.length;
    // Offset is between 0 and file size so set the position
    // to start writing.
    } else {
        this.position = offset;
    }
};

/**
 * Truncates the file to the size specified.
 *
 * @param size to chop the file at.
 */
FileWriter.prototype.truncate = function (size) {
    // Throw an exception if we are already writing a file
    if (this.readyState === FileWriter.WRITING) {
        throw new FileError(FileError.INVALID_STATE_ERR);
    }

    // WRITING state
    this.readyState = FileWriter.WRITING;

    var me = this;

    // If onwritestart callback
    if (typeof me.onwritestart === 'function') {
        me.onwritestart(new ProgressEvent('writestart', {'target': this}));
    }

    // Write file
    exec(
        // Success callback
        function (r) {
            // If DONE (cancelled), then don't do anything
            if (me.readyState === FileWriter.DONE) {
                return;
            }

            // DONE state
            me.readyState = FileWriter.DONE;

            // Update the length of the file
            me.length = r;
            me.position = Math.min(me.position, r);

            // If onwrite callback
            if (typeof me.onwrite === 'function') {
                me.onwrite(new ProgressEvent('write', {'target': me}));
            }

            // If onwriteend callback
            if (typeof me.onwriteend === 'function') {
                me.onwriteend(new ProgressEvent('writeend', {'target': me}));
            }
        },
        // Error callback
        function (e) {
            // If DONE (cancelled), then don't do anything
            if (me.readyState === FileWriter.DONE) {
                return;
            }

            // DONE state
            me.readyState = FileWriter.DONE;

            // Save error
            me.error = new FileError(e);

            // If onerror callback
            if (typeof me.onerror === 'function') {
                me.onerror(new ProgressEvent('error', {'target': me}));
            }

            // If onwriteend callback
            if (typeof me.onwriteend === 'function') {
                me.onwriteend(new ProgressEvent('writeend', {'target': me}));
            }
        }, 'File', 'truncate', [this.localURL, size]);
};

module.exports = FileWriter;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/**
 * Supplies arguments to methods that lookup or create files and directories.
 *
 * @param create
 *            {boolean} file or directory if it doesn't exist
 * @param exclusive
 *            {boolean} used with create; if true the command will fail if
 *            target path exists
 */
function Flags (create, exclusive) {
    this.create = create || false;
    this.exclusive = exclusive || false;
}

module.exports = Flags;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

exports.TEMPORARY = 0;
exports.PERSISTENT = 1;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/**
 * Information about the state of the file or directory
 *
 * {Date} modificationTime (readonly)
 */
var Metadata = function (metadata) {
    if (typeof metadata === 'object') {
        this.modificationTime = new Date(metadata.modificationTime);
        this.size = metadata.size || 0;
    } else if (typeof metadata === 'undefined') {
        this.modificationTime = null;
        this.size = 0;
    } else {
        /* Backwards compatiblity with platforms that only return a timestamp */
        this.modificationTime = new Date(metadata);
    }
};

module.exports = Metadata;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill
// Feature test: See if we can instantiate a native ProgressEvent;
// if so, use that approach,
// otherwise fill-in with our own implementation.
//
// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.
var ProgressEvent = (function () {
    /*
    var createEvent = function(data) {
        var event = document.createEvent('Events');
        event.initEvent('ProgressEvent', false, false);
        if (data) {
            for (var i in data) {
                if (data.hasOwnProperty(i)) {
                    event[i] = data[i];
                }
            }
            if (data.target) {
                // TODO: cannot call <some_custom_object>.dispatchEvent
                // need to first figure out how to implement EventTarget
            }
        }
        return event;
    };
    try {
        var ev = createEvent({type:"abort",target:document});
        return function ProgressEvent(type, data) {
            data.type = type;
            return createEvent(data);
        };
    } catch(e){
    */
    return function ProgressEvent (type, dict) {
        this.type = type;
        this.bubbles = false;
        this.cancelBubble = false;
        this.cancelable = false;
        this.lengthComputable = false;
        this.loaded = dict && dict.loaded ? dict.loaded : 0;
        this.total = dict && dict.total ? dict.total : 0;
        this.target = dict && dict.target ? dict.target : null;
    };
    // }
})();

module.exports = ProgressEvent;
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

var exec = require('cordova/exec');
var channel = require('cordova/channel');

exports.file = {
    // Read-only directory where the application is installed.
    applicationDirectory: null,
    // Root of app's private writable storage
    applicationStorageDirectory: null,
    // Where to put app-specific data files.
    dataDirectory: null,
    // Cached files that should survive app restarts.
    // Apps should not rely on the OS to delete files in here.
    cacheDirectory: null,
    // Android: the application space on external storage.
    externalApplicationStorageDirectory: null,
    // Android: Where to put app-specific data files on external storage.
    externalDataDirectory: null,
    // Android: the application cache on external storage.
    externalCacheDirectory: null,
    // Android: the external storage (SD card) root.
    externalRootDirectory: null,
    // iOS: Temp directory that the OS can clear at will.
    tempDirectory: null,
    // iOS: Holds app-specific files that should be synced (e.g. to iCloud).
    syncedDataDirectory: null,
    // iOS: Files private to the app, but that are meaningful to other applications (e.g. Office files)
    documentsDirectory: null,
    // BlackBerry10: Files globally available to all apps
    sharedDirectory: null
};

channel.waitForInitialization('onFileSystemPathsReady');
channel.onCordovaReady.subscribe(function () {
    function after (paths) {
        for (var k in paths) {
            exports.file[k] = paths[k];
        }
        channel.initializationComplete('onFileSystemPathsReady');
    }
    exec(after, null, 'File', 'requestAllPaths', []);
});
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

// Map of fsName -> FileSystem.
var fsMap = null;
var FileSystem = require('./FileSystem');
var exec = require('cordova/exec');

// Overridden by Android, BlackBerry 10 and iOS to populate fsMap.
require('./fileSystems').getFs = function (name, callback) {
    function success (response) {
        fsMap = {};
        for (var i = 0; i < response.length; ++i) {
            var fsRoot = response[i];
            if (fsRoot) {
                var fs = new FileSystem(fsRoot.filesystemName, fsRoot);
                fsMap[fs.name] = fs;
            }
        }
        callback(fsMap[name]);
    }

    if (fsMap) {
        callback(fsMap[name]);
    } else {
        exec(success, null, 'File', 'requestAllFileSystems', []);
    }
};
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

// Overridden by Android, BlackBerry 10 and iOS to populate fsMap.
module.exports.getFs = function (name, callback) {
    callback(null);
};
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

(function () {
    // For browser platform: not all browsers use this file.
    function checkBrowser () {
        if (cordova.platformId === 'browser' && require('./isChrome')()) { // eslint-disable-line no-undef
            module.exports = window.requestFileSystem || window.webkitRequestFileSystem;
            return true;
        }
        return false;
    }
    if (checkBrowser()) {
        return;
    }

    var argscheck = require('cordova/argscheck');
    var FileError = require('./FileError');
    var FileSystem = require('./FileSystem');
    var exec = require('cordova/exec');
    var fileSystems = require('./fileSystems');

    /**
     * Request a file system in which to store application data.
     * @param type  local file system type
     * @param size  indicates how much storage space, in bytes, the application expects to need
     * @param successCallback  invoked with a FileSystem object
     * @param errorCallback  invoked if error occurs retrieving file system
     */
    var requestFileSystem = function (type, size, successCallback, errorCallback) {
        argscheck.checkArgs('nnFF', 'requestFileSystem', arguments);
        var fail = function (code) {
            if (errorCallback) {
                errorCallback(new FileError(code));
            }
        };

        if (type < 0) {
            fail(FileError.SYNTAX_ERR);
        } else {
            // if successful, return a FileSystem object
            var success = function (file_system) {
                if (file_system) {
                    if (successCallback) {
                        fileSystems.getFs(file_system.name, function (fs) {
                            // This should happen only on platforms that haven't implemented requestAllFileSystems (windows)
                            if (!fs) {
                                fs = new FileSystem(file_system.name, file_system.root);
                            }
                            successCallback(fs);
                        });
                    }
                } else {
                    // no FileSystem object returned
                    fail(FileError.NOT_FOUND_ERR);
                }
            };
            exec(success, fail, 'File', 'requestFileSystem', [type, size]);
        }
    };

    module.exports = requestFileSystem;
})();
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/
(function () {
    // For browser platform: not all browsers use overrided `resolveLocalFileSystemURL`.
    function checkBrowser () {
        if (cordova.platformId === 'browser' && require('./isChrome')()) { // eslint-disable-line no-undef
            module.exports.resolveLocalFileSystemURL = window.resolveLocalFileSystemURL || window.webkitResolveLocalFileSystemURL;
            return true;
        }
        return false;
    }
    if (checkBrowser()) {
        return;
    }

    var argscheck = require('cordova/argscheck');
    var DirectoryEntry = require('./DirectoryEntry');
    var FileEntry = require('./FileEntry');
    var FileError = require('./FileError');
    var exec = require('cordova/exec');
    var fileSystems = require('./fileSystems');

    /**
     * Look up file system Entry referred to by local URI.
     * @param {DOMString} uri  URI referring to a local file or directory
     * @param successCallback  invoked with Entry object corresponding to URI
     * @param errorCallback    invoked if error occurs retrieving file system entry
     */
    module.exports.resolveLocalFileSystemURL = module.exports.resolveLocalFileSystemURL || function (uri, successCallback, errorCallback) {
        argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments);
        // error callback
        var fail = function (error) {
            if (errorCallback) {
                errorCallback(new FileError(error));
            }
        };
        // sanity check for 'not:valid:filename' or '/not:valid:filename'
        // file.spec.12 window.resolveLocalFileSystemURI should error (ENCODING_ERR) when resolving invalid URI with leading /.
        if (!uri || uri.split(':').length > 2) {
            setTimeout(function () {
                fail(FileError.ENCODING_ERR);
            }, 0);
            return;
        }
        // if successful, return either a file or directory entry
        var success = function (entry) {
            if (entry) {
                if (successCallback) {
                    // create appropriate Entry object
                    var fsName = entry.filesystemName || (entry.filesystem && entry.filesystem.name) || (entry.filesystem === window.PERSISTENT ? 'persistent' : 'temporary'); // eslint-disable-line no-undef
                    fileSystems.getFs(fsName, function (fs) {
                        // This should happen only on platforms that haven't implemented requestAllFileSystems (windows)
                        if (!fs) {
                            fs = new FileSystem(fsName, {name: '', fullPath: '/'}); // eslint-disable-line no-undef
                        }
                        var result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath, fs, entry.nativeURL) : new FileEntry(entry.name, entry.fullPath, fs, entry.nativeURL);
                        successCallback(result);
                    });
                }
            } else {
                // no Entry object returned
                fail(FileError.NOT_FOUND_ERR);
            }
        };

        exec(success, fail, 'File', 'resolveLocalFileSystemURI', [uri]);
    };

    module.exports.resolveLocalFileSystemURI = function () {
        console.log('resolveLocalFileSystemURI is deprecated. Please call resolveLocalFileSystemURL instead.');
        module.exports.resolveLocalFileSystemURL.apply(this, arguments);
    };
})();
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/
/* eslint no-undef : 0 */
FILESYSTEM_PROTOCOL = 'cdvfile';

module.exports = {
    __format__: function (fullPath) {
        var path = ('/' + this.name + (fullPath[0] === '/' ? '' : '/') + FileSystem.encodeURIPath(fullPath)).replace('//', '/');
        return FILESYSTEM_PROTOCOL + '://localhost' + path;
    }
};
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/
/* eslint no-undef : 0 */
FILESYSTEM_PROTOCOL = 'cdvfile';

module.exports = {
    __format__: function (fullPath) {
        var path = ('/' + this.name + (fullPath[0] === '/' ? '' : '/') + FileSystem.encodeURIPath(fullPath)).replace('//', '/');
        return FILESYSTEM_PROTOCOL + '://localhost' + path;
    }
};
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/* global FILESYSTEM_PREFIX: true, module */

FILESYSTEM_PREFIX = 'file:///';

module.exports = {
    __format__: function (fullPath) {
        return (FILESYSTEM_PREFIX + this.name + (fullPath[0] === '/' ? '' : '/') + FileSystem.encodeURIPath(fullPath)); // eslint-disable-line no-undef
    }
};
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

(function () {
    /* global require */

    // Only Chrome uses this file.
    if (!require('./isChrome')()) {
        return;
    }

    var channel = require('cordova/channel');
    var FileError = require('./FileError');
    var PERSISTENT_FS_QUOTA = 5 * 1024 * 1024;
    var filePluginIsReadyEvent = new Event('filePluginIsReady'); // eslint-disable-line no-undef

    var entryFunctionsCreated = false;
    var quotaWasRequested = false;
    var eventWasThrown = false;

    if (!window.requestFileSystem) {
        window.requestFileSystem = function (type, size, win, fail) {
            if (fail) {
                fail('Not supported');
            }
        };
    } else {
        window.requestFileSystem(window.TEMPORARY, 1, createFileEntryFunctions, function () {});
    }

    if (!window.resolveLocalFileSystemURL) {
        window.resolveLocalFileSystemURL = function (url, win, fail) {
            if (fail) {
                fail('Not supported');
            }
        };
    }

    // Resolves a filesystem entry by its path - which is passed either in standard (filesystem:file://) or
    // Cordova-specific (cdvfile://) universal way.
    // Aligns with specification: http://www.w3.org/TR/2011/WD-file-system-api-20110419/#widl-LocalFileSystem-resolveLocalFileSystemURL
    var nativeResolveLocalFileSystemURL = window.resolveLocalFileSystemURL || window.webkitResolveLocalFileSystemURL;
    window.resolveLocalFileSystemURL = function (url, win, fail) {
        /* If url starts with `cdvfile` then we need convert it to Chrome real url first:
          cdvfile://localhost/persistent/path/to/file -> filesystem:file://persistent/path/to/file */
        if (url.trim().substr(0, 7) === 'cdvfile') {
            /* Quirk:
            Plugin supports cdvfile://localhost (local resources) only.
            I.e. external resources are not supported via cdvfile. */
            if (url.indexOf('cdvfile://localhost') !== -1) {
                // Browser supports temporary and persistent only
                var indexPersistent = url.indexOf('persistent');
                var indexTemporary = url.indexOf('temporary');

                /* Chrome urls start with 'filesystem:' prefix. See quirk:
                   toURL function in Chrome returns filesystem:-prefixed path depending on application host.
                   For example, filesystem:file:///persistent/somefile.txt,
                   filesystem:http://localhost:8080/persistent/somefile.txt. */
                var prefix = 'filesystem:file:///';
                if (location.protocol !== 'file:') { // eslint-disable-line no-undef
                    prefix = 'filesystem:' + location.origin + '/'; // eslint-disable-line no-undef
                }

                var result;
                if (indexPersistent !== -1) {
                    // cdvfile://localhost/persistent/path/to/file -> filesystem:file://persistent/path/to/file
                    // or filesystem:http://localhost:8080/persistent/path/to/file
                    result = prefix + 'persistent' + url.substr(indexPersistent + 10);
                    nativeResolveLocalFileSystemURL(result, win, fail);
                    return;
                }

                if (indexTemporary !== -1) {
                    // cdvfile://localhost/temporary/path/to/file -> filesystem:file://temporary/path/to/file
                    // or filesystem:http://localhost:8080/temporary/path/to/file
                    result = prefix + 'temporary' + url.substr(indexTemporary + 9);
                    nativeResolveLocalFileSystemURL(result, win, fail);
                    return;
                }
            }

            // cdvfile other than local file resource is not supported
            if (fail) {
                fail(new FileError(FileError.ENCODING_ERR));
            }
        } else {
            nativeResolveLocalFileSystemURL(url, win, fail);
        }
    };

    function createFileEntryFunctions (fs) {
        fs.root.getFile('todelete_658674_833_4_cdv', {create: true}, function (fileEntry) {
            var fileEntryType = Object.getPrototypeOf(fileEntry);
            var entryType = Object.getPrototypeOf(fileEntryType);

            // Save the original method
            var origToURL = entryType.toURL;
            entryType.toURL = function () {
                var origURL = origToURL.call(this);
                if (this.isDirectory && origURL.substr(-1) !== '/') {
                    return origURL + '/';
                }
                return origURL;
            };

            entryType.toNativeURL = function () {
                console.warn("DEPRECATED: Update your code to use 'toURL'");
                return this.toURL();
            };

            entryType.toInternalURL = function () {
                if (this.toURL().indexOf('persistent') > -1) {
                    return 'cdvfile://localhost/persistent' + this.fullPath;
                }

                if (this.toURL().indexOf('temporary') > -1) {
                    return 'cdvfile://localhost/temporary' + this.fullPath;
                }
            };

            entryType.setMetadata = function (win, fail /*, metadata */) {
                if (fail) {
                    fail('Not supported');
                }
            };

            fileEntry.createWriter(function (writer) {
                var originalWrite = writer.write;
                var writerProto = Object.getPrototypeOf(writer);
                writerProto.write = function (blob) {
                    if (blob instanceof Blob) { // eslint-disable-line no-undef
                        originalWrite.apply(this, [blob]);
                    } else {
                        var realBlob = new Blob([blob]); // eslint-disable-line no-undef
                        originalWrite.apply(this, [realBlob]);
                    }
                };

                fileEntry.remove(function () { entryFunctionsCreated = true; }, function () { /* empty callback */ });
            });
        });
    }

    window.initPersistentFileSystem = function (size, win, fail) {
        if (navigator.webkitPersistentStorage) {
            navigator.webkitPersistentStorage.requestQuota(size, win, fail);
            return;
        }

        fail('This browser does not support this function');
    };

    window.isFilePluginReadyRaised = function () { return eventWasThrown; };

    window.initPersistentFileSystem(PERSISTENT_FS_QUOTA, function () {
        console.log('Persistent fs quota granted');
        quotaWasRequested = true;
    }, function (e) {
        console.log('Error occured while trying to request Persistent fs quota: ' + JSON.stringify(e));
    });

    channel.onCordovaReady.subscribe(function () {
        function dispatchEventIfReady () {
            if (entryFunctionsCreated && quotaWasRequested) {
                window.dispatchEvent(filePluginIsReadyEvent);
                eventWasThrown = true;
            } else {
                setTimeout(dispatchEventIfReady, 100);
            }
        }

        dispatchEventIfReady();
    }, false);
})();
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
 */

module.exports = function () {
    // window.webkitRequestFileSystem and window.webkitResolveLocalFileSystemURL are available only in Chrome and
    // possibly a good flag to indicate that we're running in Chrome
    return window.webkitRequestFileSystem && window.webkitResolveLocalFileSystemURL;
};
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

FILESYSTEM_PROTOCOL = 'cdvfile'; // eslint-disable-line no-undef

module.exports = {
    __format__: function (fullPath, nativeUrl) {
        var path;
        var contentUrlMatch = /^content:\/\//.exec(nativeUrl);
        if (contentUrlMatch) {
            // When available, use the path from a native content URL, which was already encoded by Android.
            // This is necessary because JavaScript's encodeURI() does not encode as many characters as
            // Android, which can result in permission exceptions when the encoding of a content URI
            // doesn't match the string for which permission was originally granted.
            path = nativeUrl.substring(contentUrlMatch[0].length - 1);
        } else {
            path = FileSystem.encodeURIPath(fullPath); // eslint-disable-line no-undef
            if (!/^\//.test(path)) {
                path = '/' + path;
            }

            var m = /\?.*/.exec(nativeUrl);
            if (m) {
                path += m[0];
            }
        }

        return FILESYSTEM_PROTOCOL + '://localhost/' + this.name + path; // eslint-disable-line no-undef
    }
};
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/* global Windows, WinJS, MSApp */

var File = require('./File');
var FileError = require('./FileError');
var Flags = require('./Flags');
var FileSystem = require('./FileSystem');
var LocalFileSystem = require('./LocalFileSystem');
var utils = require('cordova/utils');

function Entry (isFile, isDirectory, name, fullPath, filesystemName, nativeURL) {
    this.isFile = !!isFile;
    this.isDirectory = !!isDirectory;
    this.name = name || '';
    this.fullPath = fullPath || '';
    this.filesystemName = filesystemName || null;
    this.nativeURL = nativeURL || null;
}

var FileEntry = function (name, fullPath, filesystemName, nativeURL) {
    FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath, filesystemName, nativeURL]);
};

utils.extend(FileEntry, Entry);

var DirectoryEntry = function (name, fullPath, filesystemName, nativeURL) {
    DirectoryEntry.__super__.constructor.call(this, false, true, name, fullPath, filesystemName, nativeURL);
};

utils.extend(DirectoryEntry, Entry);

var getFolderFromPathAsync = Windows.Storage.StorageFolder.getFolderFromPathAsync;
var getFileFromPathAsync = Windows.Storage.StorageFile.getFileFromPathAsync;

function writeBytesAsync (storageFile, data, position) {
    return storageFile.openAsync(Windows.Storage.FileAccessMode.readWrite)
    .then(function (output) {
        output.seek(position);
        var dataWriter = new Windows.Storage.Streams.DataWriter(output);
        dataWriter.writeBytes(data);
        return dataWriter.storeAsync().then(function (size) {
            output.size = position + size;
            return dataWriter.flushAsync().then(function () {
                output.close();
                return size;
            });
        });
    });
}

function writeTextAsync (storageFile, data, position) {
    return storageFile.openAsync(Windows.Storage.FileAccessMode.readWrite)
    .then(function (output) {
        output.seek(position);
        var dataWriter = new Windows.Storage.Streams.DataWriter(output);
        dataWriter.writeString(data);
        return dataWriter.storeAsync().then(function (size) {
            output.size = position + size;
            return dataWriter.flushAsync().then(function () {
                output.close();
                return size;
            });
        });
    });
}

function writeBlobAsync (storageFile, data, position) {
    return storageFile.openAsync(Windows.Storage.FileAccessMode.readWrite)
    .then(function (output) {
        output.seek(position);
        var dataSize = data.size;
        var input = (data.detachStream || data.msDetachStream).call(data);

        // Copy the stream from the blob to the File stream
        return Windows.Storage.Streams.RandomAccessStream.copyAsync(input, output)
        .then(function () {
            output.size = position + dataSize;
            return output.flushAsync().then(function () {
                input.close();
                output.close();

                return dataSize;
            });
        });
    });
}

function writeArrayBufferAsync (storageFile, data, position) {
    return writeBlobAsync(storageFile, new Blob([data]), position); // eslint-disable-line no-undef
}

function cordovaPathToNative (path) {
    // turn / into \\
    var cleanPath = path.replace(/\//g, '\\');
    // turn  \\ into \
    cleanPath = cleanPath.replace(/\\+/g, '\\');
    return cleanPath;
}

function nativePathToCordova (path) {
    var cleanPath = path.replace(/\\/g, '/');
    return cleanPath;
}

var driveRE = new RegExp('^[/]*([A-Z]:)');
var invalidNameRE = /[\\?*|"<>:]/;
function validName (name) {
    return !invalidNameRE.test(name.replace(driveRE, ''));
}

function sanitize (path) {
    var slashesRE = new RegExp('/{2,}', 'g');
    var components = path.replace(slashesRE, '/').split(/\/+/);
    // Remove double dots, use old school array iteration instead of RegExp
    // since it is impossible to debug them
    for (var index = 0; index < components.length; ++index) {
        if (components[index] === '..') {
            components.splice(index, 1);
            if (index > 0) {
                // if we're not in the start of array then remove preceeding path component,
                // In case if relative path points above the root directory, just ignore double dots
                // See file.spec.111 should not traverse above above the root directory for test case
                components.splice(index - 1, 1);
                --index;
            }
        }
    }
    return components.join('/');
}

var WinFS = function (name, root) {
    this.winpath = root.winpath;
    if (this.winpath && !/\/$/.test(this.winpath)) {
        this.winpath += '/';
    }
    this.makeNativeURL = function (path) {
        // CB-11848: This RE supposed to match all leading slashes in sanitized path.
        // Removing leading slash to avoid duplicating because this.root.nativeURL already has trailing slash
        var regLeadingSlashes = /^\/*/;
        var sanitizedPath = sanitize(path.replace(':', '%3A')).replace(regLeadingSlashes, '');
        return FileSystem.encodeURIPath(this.root.nativeURL + sanitizedPath);
    };
    root.fullPath = '/';
    if (!root.nativeURL) { root.nativeURL = 'file://' + sanitize(this.winpath + root.fullPath).replace(':', '%3A'); }
    WinFS.__super__.constructor.call(this, name, root);
};

utils.extend(WinFS, FileSystem);

WinFS.prototype.__format__ = function (fullPath) {
    var path = sanitize('/' + this.name + (fullPath[0] === '/' ? '' : '/') + FileSystem.encodeURIPath(fullPath));
    return 'cdvfile://localhost' + path;
};

var windowsPaths = {
    dataDirectory: 'ms-appdata:///local/',
    cacheDirectory: 'ms-appdata:///temp/',
    tempDirectory: 'ms-appdata:///temp/',
    syncedDataDirectory: 'ms-appdata:///roaming/',
    applicationDirectory: 'ms-appx:///',
    applicationStorageDirectory: 'ms-appx:///'
};

var AllFileSystems;

function getAllFS () {
    if (!AllFileSystems) {
        AllFileSystems = {
            'persistent':
            Object.freeze(new WinFS('persistent', {
                name: 'persistent',
                nativeURL: 'ms-appdata:///local',
                winpath: nativePathToCordova(Windows.Storage.ApplicationData.current.localFolder.path)
            })),
            'temporary':
            Object.freeze(new WinFS('temporary', {
                name: 'temporary',
                nativeURL: 'ms-appdata:///temp',
                winpath: nativePathToCordova(Windows.Storage.ApplicationData.current.temporaryFolder.path)
            })),
            'application':
            Object.freeze(new WinFS('application', {
                name: 'application',
                nativeURL: 'ms-appx:///',
                winpath: nativePathToCordova(Windows.ApplicationModel.Package.current.installedLocation.path)
            })),
            'root':
            Object.freeze(new WinFS('root', {
                name: 'root',
                // nativeURL: 'file:///'
                winpath: ''
            }))
        };
    }
    return AllFileSystems;
}

function getFS (name) {
    return getAllFS()[name];
}

FileSystem.prototype.__format__ = function (fullPath) {
    return getFS(this.name).__format__(fullPath);
};

require('./fileSystems').getFs = function (name, callback) {
    setTimeout(function () { callback(getFS(name)); });
};

function getFilesystemFromPath (path) {
    var res;
    var allfs = getAllFS();
    Object.keys(allfs).some(function (fsn) {
        var fs = allfs[fsn];
        if (path.indexOf(fs.winpath) === 0) { res = fs; }
        return res;
    });
    return res;
}

var msapplhRE = new RegExp('^ms-appdata://localhost/');
function pathFromURL (url) {
    url = url.replace(msapplhRE, 'ms-appdata:///');
    var path = decodeURIComponent(url);
    // support for file name with parameters
    if (/\?/g.test(path)) {
        path = String(path).split('?')[0];
    }
    if (path.indexOf('file:/') === 0) {
        if (path.indexOf('file://') !== 0) {
            url = 'file:///' + url.substr(6);
        }
    }

    ['file://', 'ms-appdata:///', 'ms-appx://', 'cdvfile://localhost/'].every(function (p) {
        if (path.indexOf(p) !== 0) { return true; }
        var thirdSlash = path.indexOf('/', p.length);
        if (thirdSlash < 0) {
            path = '';
        } else {
            path = sanitize(path.substr(thirdSlash));
        }
    });

    return path.replace(driveRE, '$1');
}

function getFilesystemFromURL (url) {
    url = url.replace(msapplhRE, 'ms-appdata:///');
    var res;
    if (url.indexOf('file:/') === 0) { res = getFilesystemFromPath(pathFromURL(url)); } else {
        var allfs = getAllFS();
        Object.keys(allfs).every(function (fsn) {
            var fs = allfs[fsn];
            if (url.indexOf(fs.root.nativeURL) === 0 ||
                url.indexOf('cdvfile://localhost/' + fs.name + '/') === 0) {
                res = fs;
                return false;
            }
            return true;
        });
    }
    return res;
}

function getFsPathForWinPath (fs, wpath) {
    var path = nativePathToCordova(wpath);
    if (path.indexOf(fs.winpath) !== 0) { return null; }
    return path.replace(fs.winpath, '/');
}

var WinError = {
    invalidArgument: -2147024809,
    fileNotFound: -2147024894,
    accessDenied: -2147024891
};

function openPath (path, ops) {
    ops = ops || {};
    return new WinJS.Promise(function (complete, failed) {
        getFileFromPathAsync(path).done(
            function (file) {
                complete({file: file});
            },
            function (err) {
                if (err.number !== WinError.fileNotFound && err.number !== WinError.invalidArgument) { failed(FileError.NOT_READABLE_ERR); }
                getFolderFromPathAsync(path)
                .done(
                    function (dir) {
                        if (!ops.getContent) { complete({folder: dir}); } else {
                            WinJS.Promise.join({
                                files: dir.getFilesAsync(),
                                folders: dir.getFoldersAsync()
                            }).done(
                                function (a) {
                                    complete({
                                        folder: dir,
                                        files: a.files,
                                        folders: a.folders
                                    });
                                },
                                function (err) {  // eslint-disable-line handle-callback-err
                                    failed(FileError.NOT_READABLE_ERR);
                                }
                            );
                        }
                    },
                    function (err) {
                        if (err.number === WinError.fileNotFound || err.number === WinError.invalidArgument) { complete({}); } else { failed(FileError.NOT_READABLE_ERR); }
                    }
                );
            }
        );
    });
}

function copyFolder (src, dst, name) {
    name = name || src.name;
    return new WinJS.Promise(function (complete, failed) {
        WinJS.Promise.join({
            fld: dst.createFolderAsync(name, Windows.Storage.CreationCollisionOption.openIfExists),
            files: src.getFilesAsync(),
            folders: src.getFoldersAsync()
        }).done(
            function (the) {
                if (!(the.files.length || the.folders.length)) {
                    complete();
                    return;
                }
                var todo = the.files.length;
                var copyfolders = function () {
                    if (!(todo--)) {
                        complete();
                        return;
                    }
                    copyFolder(the.folders[todo], dst)
                    .done(function () { copyfolders(); }, failed);
                };
                var copyfiles = function () {
                    if (!(todo--)) {
                        todo = the.folders.length;
                        copyfolders();
                        return;
                    }
                    the.files[todo].copyAsync(the.fld)
                    .done(function () { copyfiles(); }, failed);
                };
                copyfiles();
            },
            failed
        );
    });
}

function moveFolder (src, dst, name) {
    name = name || src.name;
    return new WinJS.Promise(function (complete, failed) {
        WinJS.Promise.join({
            fld: dst.createFolderAsync(name, Windows.Storage.CreationCollisionOption.openIfExists),
            files: src.getFilesAsync(),
            folders: src.getFoldersAsync()
        }).done(
            function (the) {
                if (!(the.files.length || the.folders.length)) {
                    complete();
                    return;
                }
                var todo = the.files.length;
                var movefolders = function () {
                    if (!(todo--)) {
                        src.deleteAsync().done(complete, failed);
                        return;
                    }
                    moveFolder(the.folders[todo], the.fld)
                    .done(movefolders, failed);
                };
                var movefiles = function () {
                    if (!(todo--)) {
                        todo = the.folders.length;
                        movefolders();
                        return;
                    }
                    the.files[todo].moveAsync(the.fld)
                    .done(function () { movefiles(); }, failed);
                };
                movefiles();
            },
            failed
        );
    });
}

function transport (success, fail, args, ops) { // ["fullPath","parent", "newName"]
    var src = args[0];
    var parent = args[1];
    var name = args[2];

    var srcFS = getFilesystemFromURL(src);
    var dstFS = getFilesystemFromURL(parent);
    var srcPath = pathFromURL(src);
    var dstPath = pathFromURL(parent);
    if (!(srcFS && dstFS && validName(name))) {
        fail(FileError.ENCODING_ERR);
        return;
    }

    var srcWinPath = cordovaPathToNative(sanitize(srcFS.winpath + srcPath));
    var dstWinPath = cordovaPathToNative(sanitize(dstFS.winpath + dstPath));
    var tgtFsPath = sanitize(dstPath + '/' + name);
    var tgtWinPath = cordovaPathToNative(sanitize(dstFS.winpath + dstPath + '/' + name));
    if (srcWinPath === dstWinPath || srcWinPath === tgtWinPath) {
        fail(FileError.INVALID_MODIFICATION_ERR);
        return;
    }

    WinJS.Promise.join({
        src: openPath(srcWinPath),
        dst: openPath(dstWinPath),
        tgt: openPath(tgtWinPath, {getContent: true})
    })
    .done(
        function (the) {
            if ((!the.dst.folder) || !(the.src.folder || the.src.file)) {
                fail(FileError.NOT_FOUND_ERR);
                return;
            }
            if ((the.src.folder && the.tgt.file) ||
                (the.src.file && the.tgt.folder) ||
                (the.tgt.folder && (the.tgt.files.length || the.tgt.folders.length))) {
                fail(FileError.INVALID_MODIFICATION_ERR);
                return;
            }
            if (the.src.file) {
                ops.fileOp(the.src.file, the.dst.folder, name, Windows.Storage.NameCollisionOption.replaceExisting)
                .done(
                    function (storageFile) {
                        success(new FileEntry(
                            name,
                            tgtFsPath,
                            dstFS.name,
                            dstFS.makeNativeURL(tgtFsPath)
                        ));
                    },
                    function (err) {  // eslint-disable-line handle-callback-err
                        fail(FileError.INVALID_MODIFICATION_ERR);
                    }
                );
            } else {
                ops.folderOp(the.src.folder, the.dst.folder, name).done(
                    function () {
                        success(new DirectoryEntry(
                            name,
                            tgtFsPath,
                            dstFS.name,
                            dstFS.makeNativeURL(tgtFsPath)
                        ));
                    },
                    function () {
                        fail(FileError.INVALID_MODIFICATION_ERR);
                    }
                );
            }
        },
        function (err) {  // eslint-disable-line handle-callback-err
            fail(FileError.INVALID_MODIFICATION_ERR);
        }
    );
}

module.exports = {
    requestAllFileSystems: function () {
        return getAllFS();
    },
    requestAllPaths: function (success) {
        success(windowsPaths);
    },
    getFileMetadata: function (success, fail, args) {
        module.exports.getMetadata(success, fail, args);
    },

    getMetadata: function (success, fail, args) {
        var fs = getFilesystemFromURL(args[0]);
        var path = pathFromURL(args[0]);
        if (!fs || !validName(path)) {
            fail(FileError.ENCODING_ERR);
            return;
        }
        var fullPath = cordovaPathToNative(fs.winpath + path);

        var getMetadataForFile = function (storageFile) {
            storageFile.getBasicPropertiesAsync().then(
                function (basicProperties) {
                    success(new File(storageFile.name, storageFile.path, storageFile.fileType, basicProperties.dateModified, basicProperties.size));
                }, function () {
                fail(FileError.NOT_READABLE_ERR);
            }
            );
        };

        var getMetadataForFolder = function (storageFolder) {
            storageFolder.getBasicPropertiesAsync().then(
                function (basicProperties) {
                    var metadata = {
                        size: basicProperties.size,
                        lastModifiedDate: basicProperties.dateModified
                    };
                    success(metadata);
                },
                function () {
                    fail(FileError.NOT_READABLE_ERR);
                }
            );
        };

        getFileFromPathAsync(fullPath).then(getMetadataForFile,
            function () {
                getFolderFromPathAsync(fullPath).then(getMetadataForFolder,
                    function () {
                        fail(FileError.NOT_FOUND_ERR);
                    }
                );
            }
        );
    },

    getParent: function (win, fail, args) { // ["fullPath"]
        var fs = getFilesystemFromURL(args[0]);
        var path = pathFromURL(args[0]);
        if (!fs || !validName(path)) {
            fail(FileError.ENCODING_ERR);
            return;
        }
        if (!path || (new RegExp('/[^/]*/?$')).test(path)) {
            win(new DirectoryEntry(fs.root.name, fs.root.fullPath, fs.name, fs.makeNativeURL(fs.root.fullPath)));
            return;
        }

        var parpath = path.replace(new RegExp('/[^/]+/?$', 'g'), '');
        var parname = path.substr(parpath.length);
        var fullPath = cordovaPathToNative(fs.winpath + parpath);

        var result = new DirectoryEntry(parname, parpath, fs.name, fs.makeNativeURL(parpath));
        getFolderFromPathAsync(fullPath).done(
            function () { win(result); },
            function () { fail(FileError.INVALID_STATE_ERR); }
        );
    },

    readAsText: function (win, fail, args) {

        var url = args[0];
        var enc = args[1];
        var startPos = args[2];
        var endPos = args[3];

        var fs = getFilesystemFromURL(url);
        var path = pathFromURL(url);
        if (!fs) {
            fail(FileError.ENCODING_ERR);
            return;
        }
        var wpath = cordovaPathToNative(sanitize(fs.winpath + path));

        var encoding = Windows.Storage.Streams.UnicodeEncoding.utf8;
        if (enc === 'Utf16LE' || enc === 'utf16LE') {
            encoding = Windows.Storage.Streams.UnicodeEncoding.utf16LE;
        } else if (enc === 'Utf16BE' || enc === 'utf16BE') {
            encoding = Windows.Storage.Streams.UnicodeEncoding.utf16BE;
        }

        getFileFromPathAsync(wpath).then(function (file) {
            return file.openReadAsync();
        }).then(function (stream) {
            startPos = (startPos < 0) ? Math.max(stream.size + startPos, 0) : Math.min(stream.size, startPos);
            endPos = (endPos < 0) ? Math.max(endPos + stream.size, 0) : Math.min(stream.size, endPos);
            stream.seek(startPos);

            var readSize = endPos - startPos;
            var buffer = new Windows.Storage.Streams.Buffer(readSize);

            return stream.readAsync(buffer, readSize, Windows.Storage.Streams.InputStreamOptions.none);
        }).done(function (buffer) {
            try {
                win(Windows.Security.Cryptography.CryptographicBuffer.convertBinaryToString(encoding, buffer));
            } catch (e) {
                fail(FileError.ENCODING_ERR);
            }
        }, function () {
            fail(FileError.NOT_FOUND_ERR);
        });
    },

    readAsBinaryString: function (win, fail, args) {
        var url = args[0];
        var startPos = args[1];
        var endPos = args[2];

        var fs = getFilesystemFromURL(url);
        var path = pathFromURL(url);
        if (!fs) {
            fail(FileError.ENCODING_ERR);
            return;
        }
        var wpath = cordovaPathToNative(sanitize(fs.winpath + path));

        getFileFromPathAsync(wpath).then(
            function (storageFile) {
                Windows.Storage.FileIO.readBufferAsync(storageFile).done(
                    function (buffer) {
                        var dataReader = Windows.Storage.Streams.DataReader.fromBuffer(buffer);
                        // var fileContent = dataReader.readString(buffer.length);
                        var byteArray = new Uint8Array(buffer.length);
                        var byteString = '';
                        dataReader.readBytes(byteArray);
                        dataReader.close();
                        for (var i = 0; i < byteArray.length; i++) {
                            var charByte = byteArray[i];
                            // var charRepresentation = charByte <= 127 ? String.fromCharCode(charByte) : charByte.toString(16);
                            var charRepresentation = String.fromCharCode(charByte);
                            byteString += charRepresentation;
                        }
                        win(byteString.slice(startPos, endPos));
                    }
                );
            }, function () {
            fail(FileError.NOT_FOUND_ERR);
        }
        );
    },

    readAsArrayBuffer: function (win, fail, args) {
        var url = args[0];
        var fs = getFilesystemFromURL(url);
        var path = pathFromURL(url);
        if (!fs) {
            fail(FileError.ENCODING_ERR);
            return;
        }
        var wpath = cordovaPathToNative(sanitize(fs.winpath + path));

        getFileFromPathAsync(wpath).then(
            function (storageFile) {
                var blob = MSApp.createFileFromStorageFile(storageFile);
                var url = URL.createObjectURL(blob, { oneTimeOnly: true }); // eslint-disable-line no-undef
                var xhr = new XMLHttpRequest(); // eslint-disable-line no-undef
                xhr.open('GET', url, true);
                xhr.responseType = 'arraybuffer';
                xhr.onload = function () {
                    var resultArrayBuffer = xhr.response;
                    // get start and end position of bytes in buffer to be returned
                    var startPos = args[1] || 0;
                    var endPos = args[2] || resultArrayBuffer.length;
                    // if any of them is specified, we'll slice output array
                    if (startPos !== 0 || endPos !== resultArrayBuffer.length) {
                        // slice method supported only on Windows 8.1, so we need to check if it's available
                        // see http://msdn.microsoft.com/en-us/library/ie/dn641192(v=vs.94).aspx
                        if (resultArrayBuffer.slice) {
                            resultArrayBuffer = resultArrayBuffer.slice(startPos, endPos);
                        } else {
                            // if slice isn't available, we'll use workaround method
                            var tempArray = new Uint8Array(resultArrayBuffer);
                            var resBuffer = new ArrayBuffer(endPos - startPos);
                            var resArray = new Uint8Array(resBuffer);

                            for (var i = 0; i < resArray.length; i++) {
                                resArray[i] = tempArray[i + startPos];
                            }
                            resultArrayBuffer = resBuffer;
                        }
                    }
                    win(resultArrayBuffer);
                };
                xhr.send();
            }, function () {
            fail(FileError.NOT_FOUND_ERR);
        }
        );
    },

    readAsDataURL: function (win, fail, args) {
        var url = args[0];
        var fs = getFilesystemFromURL(url);
        var path = pathFromURL(url);
        if (!fs) {
            fail(FileError.ENCODING_ERR);
            return;
        }
        var wpath = cordovaPathToNative(sanitize(fs.winpath + path));

        getFileFromPathAsync(wpath).then(
            function (storageFile) {
                Windows.Storage.FileIO.readBufferAsync(storageFile).done(
                    function (buffer) {
                        var strBase64 = Windows.Security.Cryptography.CryptographicBuffer.encodeToBase64String(buffer);
                        // the method encodeToBase64String will add "77u/" as a prefix, so we should remove it
                        if (String(strBase64).substr(0, 4) === '77u/') {
                            strBase64 = strBase64.substr(4);
                        }
                        var mediaType = storageFile.contentType;
                        var result = 'data:' + mediaType + ';base64,' + strBase64;
                        win(result);
                    }
                );
            }, function () {
            fail(FileError.NOT_FOUND_ERR);
        }
        );
    },

    getDirectory: function (win, fail, args) {
        var dirurl = args[0];
        var path = args[1];
        var options = args[2];

        var fs = getFilesystemFromURL(dirurl);
        var dirpath = pathFromURL(dirurl);
        if (!fs || !validName(path)) {
            fail(FileError.ENCODING_ERR);
            return;
        }
        var fspath = sanitize(dirpath + '/' + path);
        var completePath = sanitize(fs.winpath + fspath);

        var name = completePath.substring(completePath.lastIndexOf('/') + 1);

        var wpath = cordovaPathToNative(completePath.substring(0, completePath.lastIndexOf('/')));

        var flag = '';
        if (options) {
            flag = new Flags(options.create, options.exclusive);
        } else {
            flag = new Flags(false, false);
        }

        getFolderFromPathAsync(wpath).done(
            function (storageFolder) {
                if (flag.create === true && flag.exclusive === true) {
                    storageFolder.createFolderAsync(name, Windows.Storage.CreationCollisionOption.failIfExists).done(
                        function (storageFolder) {
                            win(new DirectoryEntry(storageFolder.name, fspath, fs.name, fs.makeNativeURL(fspath)));
                        }, function (err) {  // eslint-disable-line handle-callback-err
                        fail(FileError.PATH_EXISTS_ERR);
                    }
                    );
                } else if (flag.create === true && flag.exclusive === false) {
                    storageFolder.createFolderAsync(name, Windows.Storage.CreationCollisionOption.openIfExists).done(
                        function (storageFolder) {
                            win(new DirectoryEntry(storageFolder.name, fspath, fs.name, fs.makeNativeURL(fspath)));
                        }, function () {
                        fail(FileError.INVALID_MODIFICATION_ERR);
                    }
                    );
                } else if (flag.create === false) {
                    storageFolder.getFolderAsync(name).done(
                        function (storageFolder) {
                            win(new DirectoryEntry(storageFolder.name, fspath, fs.name, fs.makeNativeURL(fspath)));
                        },
                        function () {
                            // check if path actually points to a file
                            storageFolder.getFileAsync(name).done(
                                function () {
                                    fail(FileError.TYPE_MISMATCH_ERR);
                                }, function () {
                                fail(FileError.NOT_FOUND_ERR);
                            }
                            );
                        }
                    );
                }
            }, function () {
            fail(FileError.NOT_FOUND_ERR);
        }
        );
    },

    remove: function (win, fail, args) {
        var fs = getFilesystemFromURL(args[0]);
        var path = pathFromURL(args[0]);
        if (!fs || !validName(path)) {
            fail(FileError.ENCODING_ERR);
            return;
        }

        // FileSystem root can't be removed!
        if (!path || path === '/') {
            fail(FileError.NO_MODIFICATION_ALLOWED_ERR);
            return;
        }
        var fullPath = cordovaPathToNative(fs.winpath + path);

        getFileFromPathAsync(fullPath).then(
            function (storageFile) {
                storageFile.deleteAsync().done(win, function () {
                    fail(FileError.INVALID_MODIFICATION_ERR);
                });
            },
            function () {
                getFolderFromPathAsync(fullPath).done(
                    function (sFolder) {
                        sFolder.getFilesAsync()
                        // check for files
                        .then(function (fileList) {
                            if (fileList) {
                                if (fileList.length === 0) {
                                    return sFolder.getFoldersAsync();
                                } else {
                                    fail(FileError.INVALID_MODIFICATION_ERR);
                                }
                            }
                        })
                        // check for folders
                        .done(function (folderList) {
                            if (folderList) {
                                if (folderList.length === 0) {
                                    sFolder.deleteAsync().done(
                                        win,
                                        function () {
                                            fail(FileError.INVALID_MODIFICATION_ERR);
                                        }
                                    );
                                } else {
                                    fail(FileError.INVALID_MODIFICATION_ERR);
                                }
                            }
                        });
                    },
                    function () {
                        fail(FileError.NOT_FOUND_ERR);
                    }
                );
            }
        );
    },

    removeRecursively: function (successCallback, fail, args) {

        var fs = getFilesystemFromURL(args[0]);
        var path = pathFromURL(args[0]);
        if (!fs || !validName(path)) {
            fail(FileError.ENCODING_ERR);
            return;
        }

        // FileSystem root can't be removed!
        if (!path || path === '/') {
            fail(FileError.NO_MODIFICATION_ALLOWED_ERR);
            return;
        }
        var fullPath = cordovaPathToNative(fs.winpath + path);

        getFolderFromPathAsync(fullPath).done(function (storageFolder) {
            storageFolder.deleteAsync().done(function (res) {
                successCallback(res);
            }, function (err) {
                fail(err);
            });

        }, function () {
            fail(FileError.FILE_NOT_FOUND_ERR);
        });
    },

    getFile: function (win, fail, args) {

        var dirurl = args[0];
        var path = args[1];
        var options = args[2];

        var fs = getFilesystemFromURL(dirurl);
        var dirpath = pathFromURL(dirurl);
        if (!fs || !validName(path)) {
            fail(FileError.ENCODING_ERR);
            return;
        }
        var fspath = sanitize(dirpath + '/' + path);
        var completePath = sanitize(fs.winpath + fspath);

        var fileName = completePath.substring(completePath.lastIndexOf('/') + 1);

        var wpath = cordovaPathToNative(completePath.substring(0, completePath.lastIndexOf('/')));

        var flag = '';
        if (options !== null) {
            flag = new Flags(options.create, options.exclusive);
        } else {
            flag = new Flags(false, false);
        }

        getFolderFromPathAsync(wpath).done(
            function (storageFolder) {
                if (flag.create === true && flag.exclusive === true) {
                    storageFolder.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.failIfExists).done(
                        function (storageFile) {
                            win(new FileEntry(storageFile.name, fspath, fs.name, fs.makeNativeURL(fspath)));
                        }, function () {
                        fail(FileError.PATH_EXISTS_ERR);
                    }
                    );
                } else if (flag.create === true && flag.exclusive === false) {
                    storageFolder.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.openIfExists).done(
                        function (storageFile) {
                            win(new FileEntry(storageFile.name, fspath, fs.name, fs.makeNativeURL(fspath)));
                        }, function () {
                        fail(FileError.INVALID_MODIFICATION_ERR);
                    }
                    );
                } else if (flag.create === false) {
                    storageFolder.getFileAsync(fileName).done(
                        function (storageFile) {
                            win(new FileEntry(storageFile.name, fspath, fs.name, fs.makeNativeURL(fspath)));
                        }, function () {
                            // check if path actually points to a folder
                        storageFolder.getFolderAsync(fileName).done(
                                function () {
                                    fail(FileError.TYPE_MISMATCH_ERR);
                                }, function () {
                            fail(FileError.NOT_FOUND_ERR);
                        });
                    }
                    );
                }
            }, function (err) {
            fail(
                    err.number === WinError.accessDenied ?
                    FileError.SECURITY_ERR :
                    FileError.NOT_FOUND_ERR
                );
        }
        );
    },

    readEntries: function (win, fail, args) { // ["fullPath"]
        var fs = getFilesystemFromURL(args[0]);
        var path = pathFromURL(args[0]);
        if (!fs || !validName(path)) {
            fail(FileError.ENCODING_ERR);
            return;
        }
        var fullPath = cordovaPathToNative(fs.winpath + path);

        var result = [];

        getFolderFromPathAsync(fullPath).done(function (storageFolder) {
            var promiseArr = [];
            var index = 0;
            promiseArr[index++] = storageFolder.getFilesAsync().then(function (fileList) {
                if (fileList !== null) {
                    for (var i = 0; i < fileList.length; i++) {
                        var fspath = getFsPathForWinPath(fs, fileList[i].path);
                        if (!fspath) {
                            fail(FileError.NOT_FOUND_ERR);
                            return;
                        }
                        result.push(new FileEntry(fileList[i].name, fspath, fs.name, fs.makeNativeURL(fspath)));
                    }
                }
            });
            promiseArr[index++] = storageFolder.getFoldersAsync().then(function (folderList) {
                if (folderList !== null) {
                    for (var j = 0; j < folderList.length; j++) {
                        var fspath = getFsPathForWinPath(fs, folderList[j].path);
                        if (!fspath) {
                            fail(FileError.NOT_FOUND_ERR);
                            return;
                        }
                        result.push(new DirectoryEntry(folderList[j].name, fspath, fs.name, fs.makeNativeURL(fspath)));
                    }
                }
            });
            WinJS.Promise.join(promiseArr).then(function () {
                win(result);
            });

        }, function () { fail(FileError.NOT_FOUND_ERR); });
    },

    write: function (win, fail, args) {

        var url = args[0];
        var data = args[1];
        var position = args[2];
        var isBinary = args[3];

        var fs = getFilesystemFromURL(url);
        var path = pathFromURL(url);
        if (!fs) {
            fail(FileError.ENCODING_ERR);
            return;
        }
        var completePath = sanitize(fs.winpath + path);
        var fileName = completePath.substring(completePath.lastIndexOf('/') + 1);
        var dirpath = completePath.substring(0, completePath.lastIndexOf('/'));
        var wpath = cordovaPathToNative(dirpath);

        function getWriteMethodForData (data, isBinary) {

            if (data instanceof Blob) {  // eslint-disable-line no-undef
                return writeBlobAsync;
            }

            if (data instanceof ArrayBuffer) {
                return writeArrayBufferAsync;
            }

            if (isBinary) {
                return writeBytesAsync;
            }

            if (typeof data === 'string') {
                return writeTextAsync;
            }

            throw new Error('Unsupported data type for write method');
        }

        var writePromise = getWriteMethodForData(data, isBinary);

        getFolderFromPathAsync(wpath).done(
            function (storageFolder) {
                storageFolder.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.openIfExists).done(
                    function (storageFile) {
                        writePromise(storageFile, data, position).done(
                            function (bytesWritten) {
                                var written = bytesWritten || data.length;
                                win(written);
                            },
                            function () {
                                fail(FileError.INVALID_MODIFICATION_ERR);
                            }
                        );
                    },
                    function () {
                        fail(FileError.INVALID_MODIFICATION_ERR);
                    }
                );

            },
            function () {
                fail(FileError.NOT_FOUND_ERR);
            }
        );
    },

    truncate: function (win, fail, args) { // ["fileName","size"]
        var url = args[0];
        var size = args[1];

        var fs = getFilesystemFromURL(url);
        var path = pathFromURL(url);
        if (!fs) {
            fail(FileError.ENCODING_ERR);
            return;
        }
        var completePath = sanitize(fs.winpath + path);
        var wpath = cordovaPathToNative(completePath);
        var dirwpath = cordovaPathToNative(completePath.substring(0, completePath.lastIndexOf('/')));

        getFileFromPathAsync(wpath).done(function (storageFile) {
            // the current length of the file.
            var leng = 0;

            storageFile.getBasicPropertiesAsync().then(function (basicProperties) {
                leng = basicProperties.size;
                if (Number(size) >= leng) {
                    win(this.length);
                    return;
                }
                if (Number(size) >= 0) {
                    Windows.Storage.FileIO.readTextAsync(storageFile, Windows.Storage.Streams.UnicodeEncoding.utf8).then(function (fileContent) {
                        fileContent = fileContent.substr(0, size);
                        var name = storageFile.name;
                        storageFile.deleteAsync().then(function () {
                            return getFolderFromPathAsync(dirwpath);
                        }).done(function (storageFolder) {
                            storageFolder.createFileAsync(name).then(function (newStorageFile) {
                                Windows.Storage.FileIO.writeTextAsync(newStorageFile, fileContent).done(function () {
                                    win(String(fileContent).length);
                                }, function () {
                                    fail(FileError.NO_MODIFICATION_ALLOWED_ERR);
                                });
                            }, function () {
                                fail(FileError.NO_MODIFICATION_ALLOWED_ERR);
                            });
                        });
                    }, function () { fail(FileError.NOT_FOUND_ERR); });
                }
            });
        }, function () { fail(FileError.NOT_FOUND_ERR); });
    },

    copyTo: function (success, fail, args) { // ["fullPath","parent", "newName"]
        transport(success, fail, args,
            {
                fileOp: function (file, folder, name, coll) {
                    return file.copyAsync(folder, name, coll);
                },
                folderOp: function (src, dst, name) {
                    return copyFolder(src, dst, name);
                }}
        );
    },

    moveTo: function (success, fail, args) {
        transport(success, fail, args,
            {
                fileOp: function (file, folder, name, coll) {
                    return file.moveAsync(folder, name, coll);
                },
                folderOp: function (src, dst, name) {
                    return moveFolder(src, dst, name);
                }}
        );
    },
    tempFileSystem: null,

    persistentFileSystem: null,

    requestFileSystem: function (win, fail, args) {

        var type = args[0];
        var size = args[1];
        var MAX_SIZE = 10000000000;
        if (size > MAX_SIZE) {
            fail(FileError.QUOTA_EXCEEDED_ERR);
            return;
        }

        var fs;
        switch (type) {
        case LocalFileSystem.TEMPORARY:
            fs = getFS('temporary');
            break;
        case LocalFileSystem.PERSISTENT:
            fs = getFS('persistent');
            break;
        }
        if (fs) { win(fs); } else { fail(FileError.NOT_FOUND_ERR); }
    },

    resolveLocalFileSystemURI: function (success, fail, args) {

        var uri = args[0];

        var path = pathFromURL(uri);
        var fs = getFilesystemFromURL(uri);
        if (!fs || !validName(path)) {
            fail(FileError.ENCODING_ERR);
            return;
        }
        if (path.indexOf(fs.winpath) === 0) { path = path.substr(fs.winpath.length); }
        var abspath = cordovaPathToNative(fs.winpath + path);

        getFileFromPathAsync(abspath).done(
            function (storageFile) {
                success(new FileEntry(storageFile.name, path, fs.name, fs.makeNativeURL(path)));
            }, function () {
            getFolderFromPathAsync(abspath).done(
                    function (storageFolder) {
                        success(new DirectoryEntry(storageFolder.name, path, fs.name, fs.makeNativeURL(path)));
                    }, function () {
                fail(FileError.NOT_FOUND_ERR);
            }
                );
        }
        );
    }

};

require('cordova/exec/proxy').add('File', module.exports);
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
 */

#import <Foundation/Foundation.h>
#import <Cordova/CDVPlugin.h>

NSString* const kCDVFilesystemURLPrefix;

/**
* The default filesystems if non are specified.
*/
#define CDV_FILESYSTEMS_DEFAULT @"documents,cache,bundle,root"

/**
* Preference name of the extra filesystems to be "mounted". the following are supported:
* 'bundle'    - mounts the application directory
* 'documents' - mounts the users Documents directory (~/Documents)
* 'root'      - mounts the root file system
* 'cache'     - mounts the caches directory (~/Library/Caches/<bundle-id/)
*/
#define CDV_PREF_EXTRA_FILESYSTEM @"osxextrafilesystems"

enum CDVFileError {
    NO_ERROR = 0,
    NOT_FOUND_ERR = 1,
    SECURITY_ERR = 2,
    ABORT_ERR = 3,
    NOT_READABLE_ERR = 4,
    ENCODING_ERR = 5,
    NO_MODIFICATION_ALLOWED_ERR = 6,
    INVALID_STATE_ERR = 7,
    SYNTAX_ERR = 8,
    INVALID_MODIFICATION_ERR = 9,
    QUOTA_EXCEEDED_ERR = 10,
    TYPE_MISMATCH_ERR = 11,
    PATH_EXISTS_ERR = 12
};
typedef int CDVFileError;

@interface CDVFilesystemURL : NSObject  {
    NSURL *_url;
    NSString *_fileSystemName;
    NSString *_fullPath;
}

- (id) initWithString:(NSString*)strURL;
- (id) initWithURL:(NSURL*)URL;
+ (CDVFilesystemURL *)fileSystemURLWithString:(NSString *)strURL;
+ (CDVFilesystemURL *)fileSystemURLWithURL:(NSURL *)URL;

- (NSString *)absoluteURL;

@property (atomic) NSURL *url;
@property (atomic) NSString *fileSystemName;
@property (atomic) NSString *fullPath;

@end

@interface CDVFilesystemURLProtocol : NSURLProtocol
@end

@protocol CDVFileSystem
- (CDVPluginResult *)entryForLocalURI:(CDVFilesystemURL *)url;
- (CDVPluginResult *)getFileForURL:(CDVFilesystemURL *)baseURI requestedPath:(NSString *)requestedPath options:(NSDictionary *)options;
- (CDVPluginResult *)getParentForURL:(CDVFilesystemURL *)localURI;
- (CDVPluginResult *)setMetadataForURL:(CDVFilesystemURL *)localURI withObject:(NSDictionary *)options;
- (CDVPluginResult *)removeFileAtURL:(CDVFilesystemURL *)localURI;
- (CDVPluginResult *)recursiveRemoveFileAtURL:(CDVFilesystemURL *)localURI;
- (CDVPluginResult *)readEntriesAtURL:(CDVFilesystemURL *)localURI;
- (CDVPluginResult *)truncateFileAtURL:(CDVFilesystemURL *)localURI atPosition:(unsigned long long)pos;
- (CDVPluginResult *)writeToFileAtURL:(CDVFilesystemURL *)localURL withData:(NSData*)encData append:(BOOL)shouldAppend;
- (void)copyFileToURL:(CDVFilesystemURL *)destURL withName:(NSString *)newName fromFileSystem:(NSObject<CDVFileSystem> *)srcFs atURL:(CDVFilesystemURL *)srcURL copy:(BOOL)bCopy callback:(void (^)(CDVPluginResult *))callback;
- (void)readFileAtURL:(CDVFilesystemURL *)localURL start:(NSInteger)start end:(NSInteger)end callback:(void (^)(NSData*, NSString* mimeType, CDVFileError))callback;
- (void)getFileMetadataForURL:(CDVFilesystemURL *)localURL callback:(void (^)(CDVPluginResult *))callback;

- (NSDictionary *)makeEntryForLocalURL:(CDVFilesystemURL *)url;
- (NSDictionary*)makeEntryForPath:(NSString*)fullPath isDirectory:(BOOL)isDir;

@property (nonatomic,strong) NSString *name;
@property (nonatomic, copy) NSURL*(^urlTransformer)(NSURL*);

@optional
- (NSString *)filesystemPathForURL:(CDVFilesystemURL *)localURI;
- (CDVFilesystemURL *)URLforFilesystemPath:(NSString *)path;

@end

@interface CDVFile : CDVPlugin {
    NSString* rootDocsPath;
    NSString* appDocsPath;
    NSString* appLibraryPath;
    NSString* appTempPath;

    NSMutableArray* fileSystems_;
    BOOL userHasAllowed;
}

- (NSNumber*)checkFreeDiskSpace:(NSString*)appPath;
- (NSDictionary*)makeEntryForPath:(NSString*)fullPath fileSystemName:(NSString *)fsName isDirectory:(BOOL)isDir;
- (NSDictionary *)makeEntryForURL:(NSURL *)URL;
- (CDVFilesystemURL *)fileSystemURLforLocalPath:(NSString *)localPath;

- (NSObject<CDVFileSystem> *)filesystemForURL:(CDVFilesystemURL *)localURL;

/* Native Registration API */
- (void)registerFilesystem:(NSObject<CDVFileSystem> *)fs;
- (NSObject<CDVFileSystem> *)fileSystemByName:(NSString *)fsName;

/* Exec API */
- (void)requestFileSystem:(CDVInvokedUrlCommand*)command;
- (void)resolveLocalFileSystemURI:(CDVInvokedUrlCommand*)command;
- (void)getDirectory:(CDVInvokedUrlCommand*)command;
- (void)getFile:(CDVInvokedUrlCommand*)command;
- (void)getParent:(CDVInvokedUrlCommand*)command;
- (void)removeRecursively:(CDVInvokedUrlCommand*)command;
- (void)remove:(CDVInvokedUrlCommand*)command;
- (void)copyTo:(CDVInvokedUrlCommand*)command;
- (void)moveTo:(CDVInvokedUrlCommand*)command;
- (void)getFileMetadata:(CDVInvokedUrlCommand*)command;
- (void)readEntries:(CDVInvokedUrlCommand*)command;
- (void)readAsText:(CDVInvokedUrlCommand*)command;
- (void)readAsDataURL:(CDVInvokedUrlCommand*)command;
- (void)readAsArrayBuffer:(CDVInvokedUrlCommand*)command;
- (void)write:(CDVInvokedUrlCommand*)command;
- (void)testFileExists:(CDVInvokedUrlCommand*)command;
- (void)testDirectoryExists:(CDVInvokedUrlCommand*)command;
- (void)getFreeDiskSpace:(CDVInvokedUrlCommand*)command;
- (void)truncate:(CDVInvokedUrlCommand*)command;
- (void)doCopyMove:(CDVInvokedUrlCommand*)command isCopy:(BOOL)bCopy;

/* Compatibilty with older File API */
- (NSString*)getMimeTypeFromPath:(NSString*)fullPath;
- (NSDictionary *)getDirectoryEntry:(NSString *)target isDirectory:(BOOL)bDirRequest;

/* Conversion between filesystem paths and URLs */
- (NSString *)filesystemPathForURL:(CDVFilesystemURL *)URL;

/* Internal methods for testing */
- (void)_getLocalFilesystemPath:(CDVInvokedUrlCommand*)command;

/**
 * local path of the 'documents' file system (~/Documents)
 */
@property (nonatomic, strong) NSString* appDocsPath;

/**
* local path of the 'applicationStorageDirectory' file system (~/Library/Application Support/<bundle-id>)
*/
@property (nonatomic, strong) NSString* appSupportPath;

/**
* local path of the 'persistent' file system (~/Library/Application Support/<bundle-id>/files)
*/
@property (nonatomic, strong) NSString* appDataPath;

/**
* local path of the 'documents' file system (~/Documents)
*/
@property (nonatomic, strong) NSString* appTempPath;

/**
* local path of the 'cache' file system (~/Library/Caches/<bundle-id>)
*/
@property (nonatomic, strong) NSString* appCachePath;

/**
 * registered file systems
 */
@property (nonatomic, strong) NSMutableArray* fileSystems;

@property BOOL userHasAllowed;

@end
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
 */

#import "CDVFile.h"
#import "CDVLocalFilesystem.h"
#import <objc/message.h>

static NSString* toBase64(NSData* data) {
    SEL s1 = NSSelectorFromString(@"cdv_base64EncodedString");
    SEL s2 = NSSelectorFromString(@"base64EncodedString");
    SEL s3 = NSSelectorFromString(@"base64EncodedStringWithOptions:");

    if ([data respondsToSelector:s1]) {
        NSString* (*func)(id, SEL) = (void *)[data methodForSelector:s1];
        return func(data, s1);
    } else if ([data respondsToSelector:s2]) {
        NSString* (*func)(id, SEL) = (void *)[data methodForSelector:s2];
        return func(data, s2);
    } else if ([data respondsToSelector:s3]) {
        NSString* (*func)(id, SEL, NSUInteger) = (void *)[data methodForSelector:s3];
        return func(data, s3, 0);
    } else {
        return nil;
    }
}

CDVFile *filePlugin = nil;

extern NSString * const NSURLIsExcludedFromBackupKey __attribute__((weak_import));

#ifndef __IPHONE_5_1
    NSString* const NSURLIsExcludedFromBackupKey = @"NSURLIsExcludedFromBackupKey";
#endif

NSString* const kCDVFilesystemURLPrefix = @"cdvfile";

@implementation CDVFilesystemURL
@synthesize url=_url;
@synthesize fileSystemName=_fileSystemName;
@synthesize fullPath=_fullPath;

- (id) initWithString:(NSString *)strURL
{
    if ( self = [super init] ) {
        NSURL *decodedURL = [NSURL URLWithString:strURL];
        return [self initWithURL:decodedURL];
    }
    return nil;
}

-(id) initWithURL:(NSURL *)URL
{
    if ( self = [super init] ) {
        _url = URL;
        _fileSystemName = [self filesystemNameForLocalURI:URL];
        _fullPath = [self fullPathForLocalURI:URL];
    }
    return self;
}

/*
 * IN
 *  NSString localURI
 * OUT
 *  NSString FileSystem Name for this URI, or nil if it is not recognized.
 */
- (NSString *)filesystemNameForLocalURI:(NSURL *)uri
{
    if ([[uri scheme] isEqualToString:kCDVFilesystemURLPrefix] && [[uri host] isEqualToString:@"localhost"]) {
        NSArray *pathComponents = [uri pathComponents];
        if (pathComponents != nil && pathComponents.count > 1) {
            return [pathComponents objectAtIndex:1];
        }
    }
    return nil;
}

/*
 * IN
 *  NSString localURI
 * OUT
 *  NSString fullPath component suitable for an Entry object.
 * The incoming URI should be properly escaped. The returned fullPath is unescaped.
 */
- (NSString *)fullPathForLocalURI:(NSURL *)uri
{
    if ([[uri scheme] isEqualToString:kCDVFilesystemURLPrefix] && [[uri host] isEqualToString:@"localhost"]) {
        NSString *path = [uri path];
        if ([uri query]) {
            path = [NSString stringWithFormat:@"%@?%@", path, [uri query]];
        }
        NSRange slashRange = [path rangeOfString:@"/" options:0 range:NSMakeRange(1, path.length-1)];
        if (slashRange.location == NSNotFound) {
            return @"";
        }
        return [path substringFromIndex:slashRange.location];
    }
    return nil;
}

+ (CDVFilesystemURL *)fileSystemURLWithString:(NSString *)strURL
{
    return [[CDVFilesystemURL alloc] initWithString:strURL];
}

+ (CDVFilesystemURL *)fileSystemURLWithURL:(NSURL *)URL
{
    return [[CDVFilesystemURL alloc] initWithURL:URL];
}

- (NSString *)absoluteURL
{
    return [NSString stringWithFormat:@"cdvfile://localhost/%@%@", self.fileSystemName, self.fullPath];
}

@end

@implementation CDVFilesystemURLProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest*)request
{
    NSURL* url = [request URL];
    return [[url scheme] isEqualToString:kCDVFilesystemURLPrefix];
}

+ (NSURLRequest*)canonicalRequestForRequest:(NSURLRequest*)request
{
    return request;
}

+ (BOOL)requestIsCacheEquivalent:(NSURLRequest*)requestA toRequest:(NSURLRequest*)requestB
{
    return [[[requestA URL] resourceSpecifier] isEqualToString:[[requestB URL] resourceSpecifier]];
}

- (void)startLoading
{
    CDVFilesystemURL* url = [CDVFilesystemURL fileSystemURLWithURL:[[self request] URL]];
    NSObject<CDVFileSystem> *fs = [filePlugin filesystemForURL:url];
    [fs readFileAtURL:url start:0 end:-1 callback:^void(NSData *data, NSString *mimetype, CDVFileError error) {
        NSMutableDictionary* responseHeaders = [[NSMutableDictionary alloc] init];
        responseHeaders[@"Cache-Control"] = @"no-cache";

        if (!error) {
            responseHeaders[@"Content-Type"] = mimetype;
            NSURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:url.url statusCode:200 HTTPVersion:@"HTTP/1.1"headerFields:responseHeaders];
            [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
            [[self client] URLProtocol:self didLoadData:data];
            [[self client] URLProtocolDidFinishLoading:self];
        } else {
            NSURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:url.url statusCode:404 HTTPVersion:@"HTTP/1.1"headerFields:responseHeaders];
            [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
            [[self client] URLProtocolDidFinishLoading:self];
        }
    }];
}

- (void)stopLoading
{}

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
                  willCacheResponse:(NSCachedURLResponse*)cachedResponse {
    return nil;
}

@end


@implementation CDVFile

@synthesize appDocsPath, appDataPath, appSupportPath, appTempPath, appCachePath, userHasAllowed, fileSystems=fileSystems_;

- (void)registerFilesystem:(NSObject<CDVFileSystem> *)fs {
    __weak CDVFile* weakSelf = self;
    SEL sel = NSSelectorFromString(@"urlTransformer");
    // for backwards compatibility - we check if this property is there
    // we create a wrapper block because the urlTransformer property
    // on the commandDelegate might be set dynamically at a future time
    // (and not dependent on plugin loading order)
    if ([self.commandDelegate respondsToSelector:sel]) {
        fs.urlTransformer = ^NSURL*(NSURL* urlToTransform) {
            // grab the block from the commandDelegate
            NSURL* (^urlTransformer)(NSURL*) = ((id(*)(id, SEL))objc_msgSend)(weakSelf.commandDelegate, sel);
            // if block is not null, we call it
            if (urlTransformer) {
                return urlTransformer(urlToTransform);
            } else { // else we return the same url
                return urlToTransform;
            }
        };
    }
    [fileSystems_ addObject:fs];
}

- (NSObject<CDVFileSystem> *)fileSystemByName:(NSString *)fsName
{
    if (self.fileSystems != nil) {
        for (NSObject<CDVFileSystem> *fs in self.fileSystems) {
            if ([fs.name isEqualToString:fsName]) {
                return fs;
            }
        }
    }
    return nil;

}

- (NSObject<CDVFileSystem> *)filesystemForURL:(CDVFilesystemURL *)localURL {
    if (localURL.fileSystemName == nil) return nil;
    @try {
        return [self fileSystemByName:localURL.fileSystemName];
    }
    @catch (NSException *e) {
        return nil;
    }
}

- (NSArray *)getExtraFileSystemsPreference:(NSWindowController *)vc
{
    NSString *filesystemsStr = nil;
    if([self.viewController isKindOfClass:[CDVViewController class]]) {
        CDVViewController *vc = self.viewController;
        NSDictionary *settings = [vc settings];
        filesystemsStr = [settings[CDV_PREF_EXTRA_FILESYSTEM] lowercaseString];
    }
    if (!filesystemsStr) {
        filesystemsStr = CDV_FILESYSTEMS_DEFAULT;
    }
    return [filesystemsStr componentsSeparatedByString:@","];
}

- (void)makeNonSyncable:(NSString*)path {
    [[NSFileManager defaultManager] createDirectoryAtPath:path
              withIntermediateDirectories:YES
                               attributes:nil
                                    error:nil];
    NSURL* url = [NSURL fileURLWithPath:path];
    [url setResourceValue: [NSNumber numberWithBool: YES]
                   forKey: NSURLIsExcludedFromBackupKey error:nil];

}

- (void)registerExtraFileSystems:(NSArray *)filesystems fromAvailableSet:(NSDictionary *)availableFileSystems
{
    NSMutableSet *installedFilesystems = [[NSMutableSet alloc] initWithCapacity:7];

    /* Register filesystems in order */
    for (NSString *fsName in filesystems) {
        if (![installedFilesystems containsObject:fsName]) {
            NSString *fsRoot = availableFileSystems[fsName];
            if (fsRoot) {
                [filePlugin registerFilesystem:[[CDVLocalFilesystem alloc] initWithName:fsName root:fsRoot]];
                [installedFilesystems addObject:fsName];
            } else {
                NSLog(@"Unrecognized extra filesystem identifier: %@", fsName);
            }
        }
    }
}

- (NSDictionary *)getAvailableFileSystems
{
    return @{
        @"documents": self.appDocsPath,
        @"cache": self.appCachePath,
        @"bundle": [[NSBundle mainBundle] bundlePath],
        @"root": @"/"
    };
}

- (void)pluginInitialize
{   filePlugin = self;
    [NSURLProtocol registerClass:[CDVFilesystemURLProtocol class]];

    fileSystems_ = [[NSMutableArray alloc] initWithCapacity:3];

    // Get the Temporary directory path
    self.appTempPath = [NSTemporaryDirectory()stringByStandardizingPath];   // remove trailing slash from NSTemporaryDirectory()
    [self registerFilesystem:[[CDVLocalFilesystem alloc] initWithName:@"temporary" root:self.appTempPath]];

    // ~/Library/Application Support/<bundle-id>
    self.appSupportPath = [self getSupportDirectoryFor:NSApplicationSupportDirectory pathComponents:nil];

    // ~/Library/Application Support/<bundle-id>/files
    self.appDataPath = [self getSupportDirectoryFor:NSApplicationSupportDirectory pathComponents:@[@"files"]];
    [self registerFilesystem:[[CDVLocalFilesystem alloc] initWithName:@"persistent" root:self.appDataPath]];

    // ~/Documents/
    self.appDocsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

    // ~/Library/Caches/<bundle-id>/files
    self.appCachePath = [self getSupportDirectoryFor:NSCachesDirectory pathComponents:nil];

    [self registerExtraFileSystems:[self getExtraFileSystemsPreference:self.viewController]
                  fromAvailableSet:[self getAvailableFileSystems]];
}

- (NSString*) getSupportDirectoryFor: (NSSearchPathDirectory) directory pathComponents: (NSArray*) components  {
    NSError* error;
    NSFileManager* fm = [NSFileManager defaultManager];
    NSURL* supportDir = [fm URLForDirectory:directory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error];
    if (supportDir == nil) {
        NSLog(@"unable to get support directory: %@", error);
        return nil;
    }

    NSString* bundleID = [[NSBundle mainBundle] bundleIdentifier];
    NSURL *dirPath = [supportDir URLByAppendingPathComponent:bundleID];
    for (NSString* pathComponent in components) {
        dirPath = [dirPath URLByAppendingPathComponent:pathComponent];
    }

    if (![fm fileExistsAtPath:dirPath.path]) {
        if (![fm createDirectoryAtURL:dirPath withIntermediateDirectories:YES attributes:nil error:&error]) {
            NSLog(@"unable to create support directory: %@", error);
            return nil;
        }
    }
    return dirPath.path;
}


- (CDVFilesystemURL *)fileSystemURLforArg:(NSString *)urlArg
{
    CDVFilesystemURL* ret = nil;
    if ([urlArg hasPrefix:@"file://"]) {
        /* This looks like a file url. Get the path, and see if any handlers recognize it. */
        NSURL *fileURL = [NSURL URLWithString:urlArg];
        NSURL *resolvedFileURL = [fileURL URLByResolvingSymlinksInPath];
        NSString *path = [resolvedFileURL path];
        ret = [self fileSystemURLforLocalPath:path];
    } else {
        ret = [CDVFilesystemURL fileSystemURLWithString:urlArg];
    }
    return ret;
}

- (CDVFilesystemURL *)fileSystemURLforLocalPath:(NSString *)localPath
{
    CDVFilesystemURL *localURL = nil;
    NSUInteger shortestFullPath = 0;

    // Try all installed filesystems, in order. Return the most match url.
    for (id object in self.fileSystems) {
        if ([object respondsToSelector:@selector(URLforFilesystemPath:)]) {
            CDVFilesystemURL *url = [object URLforFilesystemPath:localPath];
            if (url){
                // A shorter fullPath would imply that the filesystem is a better match for the local path
                if (!localURL || ([[url fullPath] length] < shortestFullPath)) {
                    localURL = url;
                    shortestFullPath = [[url fullPath] length];
                }
            }
        }
    }
    return localURL;
}

- (NSNumber*)checkFreeDiskSpace:(NSString*)appPath
{
    NSFileManager* fMgr = [[NSFileManager alloc] init];

    NSError* __autoreleasing pError = nil;

    NSDictionary* pDict = [fMgr attributesOfFileSystemForPath:appPath error:&pError];
    NSNumber* pNumAvail = (NSNumber*)[pDict objectForKey:NSFileSystemFreeSize];

    return pNumAvail;
}

/* Request the File System info
 *
 * IN:
 * arguments[0] - type (number as string)
 *	TEMPORARY = 0, PERSISTENT = 1;
 * arguments[1] - size
 *
 * OUT:
 *	Dictionary representing FileSystem object
 *		name - the human readable directory name
 *		root = DirectoryEntry object
 *			bool isDirectory
 *			bool isFile
 *			string name
 *			string fullPath
 *			fileSystem = FileSystem object - !! ignored because creates circular reference !!
 */

- (void)requestFileSystem:(CDVInvokedUrlCommand*)command
{
    // arguments
    NSString* strType = [command argumentAtIndex:0];
    unsigned long long size = [[command argumentAtIndex:1] longLongValue];

    int type = [strType intValue];
    CDVPluginResult* result = nil;

    if (type > self.fileSystems.count) {
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:NOT_FOUND_ERR];
        NSLog(@"No filesystem of type requested");
    } else {
        NSString* fullPath = @"/";
        // check for avail space for size request
        NSNumber* pNumAvail = [self checkFreeDiskSpace:self.appSupportPath];
        // NSLog(@"Free space: %@", [NSString stringWithFormat:@"%qu", [ pNumAvail unsignedLongLongValue ]]);
        if (pNumAvail && ([pNumAvail unsignedLongLongValue] < size)) {
            result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:QUOTA_EXCEEDED_ERR];
        } else {
            NSObject<CDVFileSystem> *rootFs = [self.fileSystems objectAtIndex:type];
            if (rootFs == nil) {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:NOT_FOUND_ERR];
                NSLog(@"No filesystem of type requested");
            } else {
                NSMutableDictionary* fileSystem = [NSMutableDictionary dictionaryWithCapacity:2];
                [fileSystem setObject:rootFs.name forKey:@"name"];
                NSDictionary* dirEntry = [self makeEntryForPath:fullPath fileSystemName:rootFs.name isDirectory:YES];
                [fileSystem setObject:dirEntry forKey:@"root"];
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:fileSystem];
            }
        }
    }
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}


- (void)requestAllFileSystems:(CDVInvokedUrlCommand*)command
{
    NSMutableArray* ret = [[NSMutableArray alloc] init];
    for (NSObject<CDVFileSystem>* root in fileSystems_) {
        [ret addObject:[self makeEntryForPath:@"/" fileSystemName:root.name isDirectory:YES]];
    }
    CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray:ret];
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

- (void)requestAllPaths:(CDVInvokedUrlCommand*)command
{
    NSDictionary* ret = @{
        @"applicationDirectory": [[NSURL fileURLWithPath:[[NSBundle mainBundle] resourcePath]] absoluteString],
        @"applicationStorageDirectory": [[NSURL fileURLWithPath:self.appSupportPath] absoluteString],
        @"dataDirectory": [[NSURL fileURLWithPath:self.appDataPath] absoluteString],
        @"documentsDirectory": [[NSURL fileURLWithPath:self.appDocsPath] absoluteString],
        @"cacheDirectory": [[NSURL fileURLWithPath:self.appCachePath] absoluteString],
        @"tempDirectory":[[NSURL fileURLWithPath:self.appTempPath] absoluteString],
        @"rootDirectory": @"file:///",
    };

    CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:ret];
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/* Creates and returns a dictionary representing an Entry Object
 *
 * IN:
 * NSString* fullPath of the entry
 * int fsType - FileSystem type
 * BOOL isDirectory - YES if this is a directory, NO if is a file
 * OUT:
 * NSDictionary* Entry object
 *		bool as NSNumber isDirectory
 *		bool as NSNumber isFile
 *		NSString*  name - last part of path
 *		NSString* fullPath
 *		NSString* filesystemName - FileSystem name -- actual filesystem will be created on the JS side if necessary, to avoid
 *         creating circular reference (FileSystem contains DirectoryEntry which contains FileSystem.....!!)
 */
- (NSDictionary*)makeEntryForPath:(NSString*)fullPath fileSystemName:(NSString *)fsName isDirectory:(BOOL)isDir
{
    NSObject<CDVFileSystem> *fs = [self fileSystemByName:fsName];
    return [fs makeEntryForPath:fullPath isDirectory:isDir];
}

- (NSDictionary *)makeEntryForLocalURL:(CDVFilesystemURL *)localURL
{
    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURL];
    return [fs makeEntryForLocalURL:localURL];
}

- (NSDictionary *)makeEntryForURL:(NSURL *)URL
{
    CDVFilesystemURL* fsURL = [self fileSystemURLforArg:[URL absoluteString]];
    return [self makeEntryForLocalURL:fsURL];
}

/*
 * Given a URI determine the File System information associated with it and return an appropriate W3C entry object
 * IN
 *	NSString* localURI: Should be an escaped local filesystem URI
 * OUT
 *	Entry object
 *		bool isDirectory
 *		bool isFile
 *		string name
 *		string fullPath
 *		fileSystem = FileSystem object - !! ignored because creates circular reference FileSystem contains DirectoryEntry which contains FileSystem.....!!
 */
- (void)resolveLocalFileSystemURI:(CDVInvokedUrlCommand*)command
{
    // arguments
    NSString* localURIstr = [command argumentAtIndex:0];
    CDVPluginResult* result;

    localURIstr = [self encodePath:localURIstr]; //encode path before resolving
    CDVFilesystemURL* inputURI = [self fileSystemURLforArg:localURIstr];

    if (inputURI == nil || inputURI.fileSystemName == nil) {
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:ENCODING_ERR];
    } else {
        NSObject<CDVFileSystem> *fs = [self filesystemForURL:inputURI];
        if (fs == nil) {
            result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:ENCODING_ERR];
        } else {
            result = [fs entryForLocalURI:inputURI];
        }
    }
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

//encode path with percent escapes
-(NSString *)encodePath:(NSString *)path
{
    NSString *decodedPath = [path stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //decode incase it's already encoded to avoid encoding twice
    return [decodedPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}


/* Part of DirectoryEntry interface,  creates or returns the specified directory
 * IN:
 *	NSString* localURI - local filesystem URI for this directory
 *	NSString* path - directory to be created/returned; may be full path or relative path
 *	NSDictionary* - Flags object
 *		boolean as NSNumber create -
 *			if create is true and directory does not exist, create dir and return directory entry
 *			if create is true and exclusive is true and directory does exist, return error
 *			if create is false and directory does not exist, return error
 *			if create is false and the path represents a file, return error
 *		boolean as NSNumber exclusive - used in conjunction with create
 *			if exclusive is true and create is true - specifies failure if directory already exists
 *
 *
 */
- (void)getDirectory:(CDVInvokedUrlCommand*)command
{
    NSMutableArray* arguments = [NSMutableArray arrayWithArray:command.arguments];
    NSMutableDictionary* options = nil;

    if ([arguments count] >= 3) {
        options = [command argumentAtIndex:2 withDefault:nil];
    }
    // add getDir to options and call getFile()
    if (options != nil) {
        options = [NSMutableDictionary dictionaryWithDictionary:options];
    } else {
        options = [NSMutableDictionary dictionaryWithCapacity:1];
    }
    [options setObject:[NSNumber numberWithInt:1] forKey:@"getDir"];
    if ([arguments count] >= 3) {
        [arguments replaceObjectAtIndex:2 withObject:options];
    } else {
        [arguments addObject:options];
    }
    CDVInvokedUrlCommand* subCommand =
        [[CDVInvokedUrlCommand alloc] initWithArguments:arguments
                                             callbackId:command.callbackId
                                              className:command.className
                                             methodName:command.methodName];

    [self getFile:subCommand];
}

/* Part of DirectoryEntry interface,  creates or returns the specified file
 * IN:
 *	NSString* baseURI - local filesytem URI for the base directory to search
 *	NSString* requestedPath - file to be created/returned; may be absolute path or relative path
 *	NSDictionary* options - Flags object
 *		boolean as NSNumber create -
 *			if create is true and file does not exist, create file and return File entry
 *			if create is true and exclusive is true and file does exist, return error
 *			if create is false and file does not exist, return error
 *			if create is false and the path represents a directory, return error
 *		boolean as NSNumber exclusive - used in conjunction with create
 *			if exclusive is true and create is true - specifies failure if file already exists
 */
- (void)getFile:(CDVInvokedUrlCommand*)command
{
    NSString* baseURIstr = [command argumentAtIndex:0];
    CDVFilesystemURL* baseURI = [self fileSystemURLforArg:baseURIstr];
    NSString* requestedPath = [command argumentAtIndex:1];
    NSDictionary* options = [command argumentAtIndex:2 withDefault:nil];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:baseURI];
    CDVPluginResult* result = [fs getFileForURL:baseURI requestedPath:requestedPath options:options];


    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/*
 * Look up the parent Entry containing this Entry.
 * If this Entry is the root of its filesystem, its parent is itself.
 * IN:
 * NSArray* arguments
 *	0 - NSString* localURI
 * NSMutableDictionary* options
 *	empty
 */
- (void)getParent:(CDVInvokedUrlCommand*)command
{
    // arguments are URL encoded
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];
    CDVPluginResult* result = [fs getParentForURL:localURI];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/*
 * set MetaData of entry
 * Currently we only support "com.apple.MobileBackup" (boolean)
 */
- (void)setMetadata:(CDVInvokedUrlCommand*)command
{
    // arguments
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSDictionary* options = [command argumentAtIndex:1 withDefault:nil];
    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];
    CDVPluginResult* result = [fs setMetadataForURL:localURI withObject:options];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/* removes the directory or file entry
 * IN:
 * NSArray* arguments
 *	0 - NSString* localURI
 *
 * returns NO_MODIFICATION_ALLOWED_ERR  if is top level directory or no permission to delete dir
 * returns INVALID_MODIFICATION_ERR if is non-empty dir or asset library file
 * returns NOT_FOUND_ERR if file or dir is not found
*/
- (void)remove:(CDVInvokedUrlCommand*)command
{
    // arguments
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    CDVPluginResult* result = nil;

    if ([localURI.fullPath isEqualToString:@""]) {
        // error if try to remove top level (documents or tmp) dir
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NO_MODIFICATION_ALLOWED_ERR];
    } else {
        NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];
        result = [fs removeFileAtURL:localURI];
    }
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/* recursively removes the directory
 * IN:
 * NSArray* arguments
 *	0 - NSString* localURI
 *
 * returns NO_MODIFICATION_ALLOWED_ERR  if is top level directory or no permission to delete dir
 * returns NOT_FOUND_ERR if file or dir is not found
 */
- (void)removeRecursively:(CDVInvokedUrlCommand*)command
{
    // arguments
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    CDVPluginResult* result = nil;

    if ([localURI.fullPath isEqualToString:@""]) {
        // error if try to remove top level (documents or tmp) dir
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NO_MODIFICATION_ALLOWED_ERR];
    } else {
        NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];
        result = [fs recursiveRemoveFileAtURL:localURI];
    }
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

- (void)copyTo:(CDVInvokedUrlCommand*)command
{
    [self doCopyMove:command isCopy:YES];
}

- (void)moveTo:(CDVInvokedUrlCommand*)command
{
    [self doCopyMove:command isCopy:NO];
}

/* Copy/move a file or directory to a new location
 * IN:
 * NSArray* arguments
 *	0 - NSString* URL of entry to copy
 *  1 - NSString* URL of the directory into which to copy/move the entry
 *  2 - Optionally, the new name of the entry, defaults to the current name
 *	BOOL - bCopy YES if copy, NO if move
 */
- (void)doCopyMove:(CDVInvokedUrlCommand*)command isCopy:(BOOL)bCopy
{
    NSArray* arguments = command.arguments;

    // arguments
    NSString* srcURLstr = [command argumentAtIndex:0];
    NSString* destURLstr = [command argumentAtIndex:1];

    CDVPluginResult *result;

    if (!srcURLstr || !destURLstr) {
        // either no source or no destination provided
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_FOUND_ERR];
        [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        return;
    }

    CDVFilesystemURL* srcURL = [self fileSystemURLforArg:srcURLstr];
    CDVFilesystemURL* destURL = [self fileSystemURLforArg:destURLstr];

    NSObject<CDVFileSystem> *srcFs = [self filesystemForURL:srcURL];
    NSObject<CDVFileSystem> *destFs = [self filesystemForURL:destURL];

    // optional argument; use last component from srcFullPath if new name not provided
    NSString* newName = ([arguments count] > 2) ? [command argumentAtIndex:2] : [srcURL.url lastPathComponent];
    if ([newName rangeOfString:@":"].location != NSNotFound) {
        // invalid chars in new name
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:ENCODING_ERR];
        [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        return;
    }

    [destFs copyFileToURL:destURL withName:newName fromFileSystem:srcFs atURL:srcURL copy:bCopy callback:^(CDVPluginResult* result) {
        [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
    }];

}

- (void)getFileMetadata:(CDVInvokedUrlCommand*)command
{
    // arguments
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];

    [fs getFileMetadataForURL:localURI callback:^(CDVPluginResult* result) {
        [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
    }];
}

- (void)readEntries:(CDVInvokedUrlCommand*)command
{
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];
    CDVPluginResult *result = [fs readEntriesAtURL:localURI];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/* read and return file data
 * IN:
 * NSArray* arguments
 *	0 - NSString* fullPath
 *	1 - NSString* encoding
 *	2 - NSString* start
 *	3 - NSString* end
 */
- (void)readAsText:(CDVInvokedUrlCommand*)command
{
    // arguments
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSString* encoding = [command argumentAtIndex:1];
    NSInteger start = [[command argumentAtIndex:2] integerValue];
    NSInteger end = [[command argumentAtIndex:3] integerValue];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];

    if (fs == nil) {
        CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_FOUND_ERR];
        [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        return;
    }

    // TODO: implement
    if ([@"UTF-8" caseInsensitiveCompare : encoding] != NSOrderedSame) {
        NSLog(@"Only UTF-8 encodings are currently supported by readAsText");
        CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:ENCODING_ERR];
        [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        return;
    }

    [self.commandDelegate runInBackground:^ {
        [fs readFileAtURL:localURI start:start end:end callback:^(NSData* data, NSString* mimeType, CDVFileError errorCode) {
            CDVPluginResult* result = nil;
            if (data != nil) {
                NSString* str = [[NSString alloc] initWithBytesNoCopy:(void*)[data bytes] length:[data length] encoding:NSUTF8StringEncoding freeWhenDone:NO];
                // Check that UTF8 conversion did not fail.
                if (str != nil) {
                    result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:str];
                    result.associatedObject = data;
                } else {
                    errorCode = ENCODING_ERR;
                }
            }
            if (result == nil) {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
            }

            [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        }];
    }];
}

/* Read content of text file and return as base64 encoded data url.
 * IN:
 * NSArray* arguments
 *	0 - NSString* fullPath
 *	1 - NSString* start
 *	2 - NSString* end
 *
 * Determines the mime type from the file extension, returns ENCODING_ERR if mimetype can not be determined.
 */

- (void)readAsDataURL:(CDVInvokedUrlCommand*)command
{
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSInteger start = [[command argumentAtIndex:1] integerValue];
    NSInteger end = [[command argumentAtIndex:2] integerValue];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];

    [self.commandDelegate runInBackground:^ {
        [fs readFileAtURL:localURI start:start end:end callback:^(NSData* data, NSString* mimeType, CDVFileError errorCode) {
            CDVPluginResult* result = nil;
            if (data != nil) {
                NSString* b64Str = toBase64(data);
                NSString* output = [NSString stringWithFormat:@"data:%@;base64,%@", mimeType, b64Str];
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:output];
            } else {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
            }

            [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        }];
    }];
}

/* Read content of text file and return as an arraybuffer
 * IN:
 * NSArray* arguments
 *	0 - NSString* fullPath
 *	1 - NSString* start
 *	2 - NSString* end
 */

- (void)readAsArrayBuffer:(CDVInvokedUrlCommand*)command
{
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSInteger start = [[command argumentAtIndex:1] integerValue];
    NSInteger end = [[command argumentAtIndex:2] integerValue];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];

    [self.commandDelegate runInBackground:^ {
        [fs readFileAtURL:localURI start:start end:end callback:^(NSData* data, NSString* mimeType, CDVFileError errorCode) {
            CDVPluginResult* result = nil;
            if (data != nil) {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArrayBuffer:data];
            } else {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
            }

            [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        }];
    }];
}

- (void)readAsBinaryString:(CDVInvokedUrlCommand*)command
{
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSInteger start = [[command argumentAtIndex:1] integerValue];
    NSInteger end = [[command argumentAtIndex:2] integerValue];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];

    [self.commandDelegate runInBackground:^ {
        [fs readFileAtURL:localURI start:start end:end callback:^(NSData* data, NSString* mimeType, CDVFileError errorCode) {
            CDVPluginResult* result = nil;
            if (data != nil) {
                NSString* payload = [[NSString alloc] initWithBytesNoCopy:(void*)[data bytes] length:[data length] encoding:NSASCIIStringEncoding freeWhenDone:NO];
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:payload];
                result.associatedObject = data;
            } else {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
            }

            [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        }];
    }];
}


- (void)truncate:(CDVInvokedUrlCommand*)command
{
    // arguments
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    unsigned long long pos = (unsigned long long)[[command argumentAtIndex:1] longLongValue];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];
    CDVPluginResult *result = [fs truncateFileAtURL:localURI atPosition:pos];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/* write
 * IN:
 * NSArray* arguments
 *  0 - NSString* localURI of file to write to
 *  1 - NSString* or NSData* data to write
 *  2 - NSNumber* position to begin writing
 */
- (void)write:(CDVInvokedUrlCommand*)command
{
    [self.commandDelegate runInBackground:^ {
        NSString* callbackId = command.callbackId;

        // arguments
        CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
        id argData = [command argumentAtIndex:1];
        unsigned long long pos = (unsigned long long)[[command argumentAtIndex:2] longLongValue];

        NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];


        [fs truncateFileAtURL:localURI atPosition:pos];
        CDVPluginResult *result;
        if ([argData isKindOfClass:[NSString class]]) {
            NSData *encData = [argData dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
            result = [fs writeToFileAtURL:localURI withData:encData append:YES];
        } else if ([argData isKindOfClass:[NSData class]]) {
            result = [fs writeToFileAtURL:localURI withData:argData append:YES];
        } else {
            result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Invalid parameter type"];
        }
        [self.commandDelegate sendPluginResult:result callbackId:callbackId];
    }];
}

#pragma mark Methods for converting between URLs and paths

- (NSString *)filesystemPathForURL:(CDVFilesystemURL *)localURL
{
    for (NSObject<CDVFileSystem> *fs in self.fileSystems) {
        if ([fs.name isEqualToString:localURL.fileSystemName]) {
            if ([fs respondsToSelector:@selector(filesystemPathForURL:)]) {
                return [fs filesystemPathForURL:localURL];
            }
        }
    }
    return nil;
}

#pragma mark Undocumented Filesystem API

- (void)testFileExists:(CDVInvokedUrlCommand*)command
{
    // arguments
    NSString* argPath = [command argumentAtIndex:0];

    // Get the file manager
    NSFileManager* fMgr = [NSFileManager defaultManager];
    NSString* appFile = argPath; // [ self getFullPath: argPath];

    BOOL bExists = [fMgr fileExistsAtPath:appFile];
    CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:(bExists ? 1 : 0)];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

- (void)testDirectoryExists:(CDVInvokedUrlCommand*)command
{
    // arguments
    NSString* argPath = [command argumentAtIndex:0];

    // Get the file manager
    NSFileManager* fMgr = [[NSFileManager alloc] init];
    NSString* appFile = argPath; // [self getFullPath: argPath];
    BOOL bIsDir = NO;
    BOOL bExists = [fMgr fileExistsAtPath:appFile isDirectory:&bIsDir];

    CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:((bExists && bIsDir) ? 1 : 0)];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

// Returns number of bytes available via callback
- (void)getFreeDiskSpace:(CDVInvokedUrlCommand*)command
{
    // no arguments

    NSNumber* pNumAvail = [self checkFreeDiskSpace:self.appDocsPath];

    NSString* strFreeSpace = [NSString stringWithFormat:@"%qu", [pNumAvail unsignedLongLongValue]];
    // NSLog(@"Free space is %@", strFreeSpace );

    CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:strFreeSpace];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

#pragma mark Compatibility with older File API

- (NSString*)getMimeTypeFromPath:(NSString*)fullPath
{
    return [CDVLocalFilesystem getMimeTypeFromPath:fullPath];
}

- (NSDictionary *)getDirectoryEntry:(NSString *)localPath isDirectory:(BOOL)bDirRequest
{
    CDVFilesystemURL *localURL = [self fileSystemURLforLocalPath:localPath];
    return [self makeEntryForPath:localURL.fullPath fileSystemName:localURL.fileSystemName isDirectory:bDirRequest];
}

#pragma mark Internal methods for testing
// Internal methods for testing: Get the on-disk location of a local filesystem url.
// [Currently used for testing file-transfer]

- (void)_getLocalFilesystemPath:(CDVInvokedUrlCommand*)command
{
    CDVFilesystemURL* localURL = [self fileSystemURLforArg:command.arguments[0]];

    NSString* fsPath = [self filesystemPathForURL:localURL];
    CDVPluginResult* result;
    if (fsPath) {
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:fsPath];
    } else {
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Cannot resolve URL to a file"];
    }
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

@end
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
 */

#import "CDVFile.h"

@interface CDVLocalFilesystem : NSObject<CDVFileSystem> {
    NSString *_name;
    NSString *_fsRoot;
}

- (id) initWithName:(NSString *)name root:(NSString *)fsRoot;
+ (NSString*)getMimeTypeFromPath:(NSString*)fullPath;

@property (nonatomic,strong) NSString *fsRoot;

@end
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
 */

#import "CDVFile.h"
#import "CDVLocalFilesystem.h"
#import <sys/xattr.h>

@implementation CDVLocalFilesystem
@synthesize name=_name, fsRoot=_fsRoot, urlTransformer;

- (id) initWithName:(NSString *)name root:(NSString *)fsRoot
{
    if (self) {
        _name = name;
        _fsRoot = fsRoot;
    }
    return self;
}

/*
 * IN
 *  NSString localURI
 * OUT
 *  CDVPluginResult result containing a file or directoryEntry for the localURI, or an error if the
 *   URI represents a non-existent path, or is unrecognized or otherwise malformed.
 */
- (CDVPluginResult *)entryForLocalURI:(CDVFilesystemURL *)url
{
    CDVPluginResult* result = nil;
    NSDictionary* entry = [self makeEntryForLocalURL:url];
    if (entry) {
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:entry];
    } else {
        // return NOT_FOUND_ERR
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_FOUND_ERR];
    }
    return result;
}
- (NSDictionary *)makeEntryForLocalURL:(CDVFilesystemURL *)url {
    NSString *path = [self filesystemPathForURL:url];
    NSFileManager* fileMgr = [[NSFileManager alloc] init];
    BOOL isDir = NO;
    // see if exists and is file or dir
    BOOL bExists = [fileMgr fileExistsAtPath:path isDirectory:&isDir];
    if (bExists) {
        return [self makeEntryForPath:url.fullPath isDirectory:isDir];
    } else {
        return nil;
    }
}
- (NSDictionary*)makeEntryForPath:(NSString*)fullPath isDirectory:(BOOL)isDir
{
    NSMutableDictionary* dirEntry = [NSMutableDictionary dictionaryWithCapacity:5];
    NSString* lastPart = [[self stripQueryParametersFromPath:fullPath] lastPathComponent];
    if (isDir && ![fullPath hasSuffix:@"/"]) {
        fullPath = [fullPath stringByAppendingString:@"/"];
    }
    [dirEntry setObject:[NSNumber numberWithBool:!isDir]  forKey:@"isFile"];
    [dirEntry setObject:[NSNumber numberWithBool:isDir]  forKey:@"isDirectory"];
    [dirEntry setObject:fullPath forKey:@"fullPath"];
    [dirEntry setObject:lastPart forKey:@"name"];
    [dirEntry setObject:self.name forKey: @"filesystemName"];

    NSURL* nativeURL = [NSURL fileURLWithPath:[self filesystemPathForFullPath:fullPath]];
    if (self.urlTransformer) {
        nativeURL = self.urlTransformer(nativeURL);
    }

    dirEntry[@"nativeURL"] = [nativeURL absoluteString];

    return dirEntry;
}

- (NSString *)stripQueryParametersFromPath:(NSString *)fullPath
{
    NSRange questionMark = [fullPath rangeOfString:@"?"];
    if (questionMark.location != NSNotFound) {
        return [fullPath substringWithRange:NSMakeRange(0,questionMark.location)];
    }
    return fullPath;
}

- (NSString *)filesystemPathForFullPath:(NSString *)fullPath
{
    NSString *path = nil;
    NSString *strippedFullPath = [self stripQueryParametersFromPath:fullPath];
    path = [NSString stringWithFormat:@"%@%@", self.fsRoot, strippedFullPath];
    if ([path length] > 1 && [path hasSuffix:@"/"]) {
      path = [path substringToIndex:([path length]-1)];
    }
    return path;
}
/*
 * IN
 *  NSString localURI
 * OUT
 *  NSString full local filesystem path for the represented file or directory, or nil if no such path is possible
 *  The file or directory does not necessarily have to exist. nil is returned if the filesystem type is not recognized,
 *  or if the URL is malformed.
 * The incoming URI should be properly escaped (no raw spaces, etc. URI percent-encoding is expected).
 */
- (NSString *)filesystemPathForURL:(CDVFilesystemURL *)url
{
    return [self filesystemPathForFullPath:url.fullPath];
}

- (CDVFilesystemURL *)URLforFullPath:(NSString *)fullPath
{
    if (fullPath) {
        NSString* escapedPath = [fullPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        if ([fullPath hasPrefix:@"/"]) {
            return [CDVFilesystemURL fileSystemURLWithString:[NSString stringWithFormat:@"%@://localhost/%@%@", kCDVFilesystemURLPrefix, self.name, escapedPath]];
        }
        return [CDVFilesystemURL fileSystemURLWithString:[NSString stringWithFormat:@"%@://localhost/%@/%@", kCDVFilesystemURLPrefix, self.name, escapedPath]];
    }
    return nil;
}

- (CDVFilesystemURL *)URLforFilesystemPath:(NSString *)path
{
    return [self URLforFullPath:[self fullPathForFileSystemPath:path]];

}

- (NSString *)normalizePath:(NSString *)rawPath
{
    // If this is an absolute path, the first path component will be '/'. Skip it if that's the case
    BOOL isAbsolutePath = [rawPath hasPrefix:@"/"];
    if (isAbsolutePath) {
        rawPath = [rawPath substringFromIndex:1];
    }
    NSMutableArray *components = [NSMutableArray arrayWithArray:[rawPath pathComponents]];
    for (int index = 0; index < [components count]; ++index) {
        if ([[components objectAtIndex:index] isEqualToString:@".."]) {
            [components removeObjectAtIndex:index];
            if (index > 0) {
                [components removeObjectAtIndex:index-1];
                --index;
            }
        }
    }

    if (isAbsolutePath) {
        return [NSString stringWithFormat:@"/%@", [components componentsJoinedByString:@"/"]];
    } else {
        return [components componentsJoinedByString:@"/"];
    }


}

- (BOOL)valueForKeyIsNumber:(NSDictionary*)dict key:(NSString*)key
{
    BOOL bNumber = NO;
    NSObject* value = dict[key];
    if (value) {
        bNumber = [value isKindOfClass:[NSNumber class]];
    }
    return bNumber;
}

- (CDVPluginResult *)getFileForURL:(CDVFilesystemURL *)baseURI requestedPath:(NSString *)requestedPath options:(NSDictionary *)options
{
    CDVPluginResult* result = nil;
    BOOL bDirRequest = NO;
    BOOL create = NO;
    BOOL exclusive = NO;
    int errorCode = 0;  // !!! risky - no error code currently defined for 0

    if ([self valueForKeyIsNumber:options key:@"create"]) {
        create = [(NSNumber*)[options valueForKey:@"create"] boolValue];
    }
    if ([self valueForKeyIsNumber:options key:@"exclusive"]) {
        exclusive = [(NSNumber*)[options valueForKey:@"exclusive"] boolValue];
    }
    if ([self valueForKeyIsNumber:options key:@"getDir"]) {
        // this will not exist for calls directly to getFile but will have been set by getDirectory before calling this method
        bDirRequest = [(NSNumber*)[options valueForKey:@"getDir"] boolValue];
    }
    // see if the requested path has invalid characters - should we be checking for  more than just ":"?
    if ([requestedPath rangeOfString:@":"].location != NSNotFound) {
        errorCode = ENCODING_ERR;
    } else {
        // Build new fullPath for the requested resource.
        // We concatenate the two paths together, and then scan the resulting string to remove
        // parent ("..") references. Any parent references at the beginning of the string are
        // silently removed.
        NSString *combinedPath = [baseURI.fullPath stringByAppendingPathComponent:requestedPath];
        combinedPath = [self normalizePath:combinedPath];
        CDVFilesystemURL* requestedURL = [self URLforFullPath:combinedPath];

        NSFileManager* fileMgr = [[NSFileManager alloc] init];
        BOOL bIsDir;
        BOOL bExists = [fileMgr fileExistsAtPath:[self filesystemPathForURL:requestedURL] isDirectory:&bIsDir];
        if (bExists && (create == NO) && (bIsDir == !bDirRequest)) {
            // path exists and is not of requested type  - return TYPE_MISMATCH_ERR
            errorCode = TYPE_MISMATCH_ERR;
        } else if (!bExists && (create == NO)) {
            // path does not exist and create is false - return NOT_FOUND_ERR
            errorCode = NOT_FOUND_ERR;
        } else if (bExists && (create == YES) && (exclusive == YES)) {
            // file/dir already exists and exclusive and create are both true - return PATH_EXISTS_ERR
            errorCode = PATH_EXISTS_ERR;
        } else {
            // if bExists and create == YES - just return data
            // if bExists and create == NO  - just return data
            // if !bExists and create == YES - create and return data
            BOOL bSuccess = YES;
            NSError __autoreleasing* pError = nil;
            if (!bExists && (create == YES)) {
                if (bDirRequest) {
                    // create the dir
                    bSuccess = [fileMgr createDirectoryAtPath:[self filesystemPathForURL:requestedURL] withIntermediateDirectories:NO attributes:nil error:&pError];
                } else {
                    // create the empty file
                    bSuccess = [fileMgr createFileAtPath:[self filesystemPathForURL:requestedURL] contents:nil attributes:nil];
                }
            }
            if (!bSuccess) {
                errorCode = ABORT_ERR;
                if (pError) {
                    NSLog(@"error creating directory: %@", [pError localizedDescription]);
                }
            } else {
                // NSLog(@"newly created file/dir (%@) exists: %d", reqFullPath, [fileMgr fileExistsAtPath:reqFullPath]);
                // file existed or was created
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:[self makeEntryForPath:requestedURL.fullPath isDirectory:bDirRequest]];
            }
        } // are all possible conditions met?
    }

    if (errorCode > 0) {
        // create error callback
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
    }
    return result;

}

- (CDVPluginResult*)getParentForURL:(CDVFilesystemURL *)localURI
{
    CDVPluginResult* result = nil;
    CDVFilesystemURL *newURI = nil;
    if ([localURI.fullPath isEqualToString:@""]) {
        // return self
        newURI = localURI;
    } else {
        newURI = [CDVFilesystemURL fileSystemURLWithURL:[localURI.url URLByDeletingLastPathComponent]]; /* TODO: UGLY - FIX */
    }
    NSFileManager* fileMgr = [[NSFileManager alloc] init];
    BOOL bIsDir;
    BOOL bExists = [fileMgr fileExistsAtPath:[self filesystemPathForURL:newURI] isDirectory:&bIsDir];
    if (bExists) {
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:[self makeEntryForPath:newURI.fullPath isDirectory:bIsDir]];
    } else {
        // invalid path or file does not exist
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_FOUND_ERR];
    }
    return result;
}

- (CDVPluginResult*)setMetadataForURL:(CDVFilesystemURL *)localURI withObject:(NSDictionary *)options
{
    BOOL ok = NO;

    NSString* filePath = [self filesystemPathForURL:localURI];
    // we only care about this iCloud key for now.
    // set to 1/true to skip backup, set to 0/false to back it up (effectively removing the attribute)
    NSString* iCloudBackupExtendedAttributeKey = @"com.apple.MobileBackup";
    id iCloudBackupExtendedAttributeValue = [options objectForKey:iCloudBackupExtendedAttributeKey];

    if ((iCloudBackupExtendedAttributeValue != nil) && [iCloudBackupExtendedAttributeValue isKindOfClass:[NSNumber class]]) {
// todo: fix me
//        if (IsAtLeastiOSVersion(@"5.1")) {
//            NSURL* url = [NSURL fileURLWithPath:filePath];
//            NSError* __autoreleasing error = nil;
//
//            ok = [url setResourceValue:[NSNumber numberWithBool:[iCloudBackupExtendedAttributeValue boolValue]] forKey:NSURLIsExcludedFromBackupKey error:&error];
//        } else { // below 5.1 (deprecated - only really supported in 5.01)
//            u_int8_t value = [iCloudBackupExtendedAttributeValue intValue];
//            if (value == 0) { // remove the attribute (allow backup, the default)
//                ok = (removexattr([filePath fileSystemRepresentation], [iCloudBackupExtendedAttributeKey cStringUsingEncoding:NSUTF8StringEncoding], 0) == 0);
//            } else { // set the attribute (skip backup)
//                ok = (setxattr([filePath fileSystemRepresentation], [iCloudBackupExtendedAttributeKey cStringUsingEncoding:NSUTF8StringEncoding], &value, sizeof(value), 0, 0) == 0);
//            }
//        }
    }

    if (ok) {
        return [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
    } else {
        return [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
    }
}

/* remove the file or directory (recursively)
 * IN:
 * NSString* fullPath - the full path to the file or directory to be removed
 * NSString* callbackId
 * called from remove and removeRecursively - check all pubic api specific error conditions (dir not empty, etc) before calling
 */

- (CDVPluginResult*)doRemove:(NSString*)fullPath
{
    CDVPluginResult* result = nil;
    BOOL bSuccess = NO;
    NSError* __autoreleasing pError = nil;
    NSFileManager* fileMgr = [[NSFileManager alloc] init];

    @try {
        bSuccess = [fileMgr removeItemAtPath:fullPath error:&pError];
        if (bSuccess) {
            result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
        } else {
            // see if we can give a useful error
            CDVFileError errorCode = ABORT_ERR;
            NSLog(@"error removing filesystem entry at %@: %@", fullPath, [pError localizedDescription]);
            if ([pError code] == NSFileNoSuchFileError) {
                errorCode = NOT_FOUND_ERR;
            } else if ([pError code] == NSFileWriteNoPermissionError) {
                errorCode = NO_MODIFICATION_ALLOWED_ERR;
            }

            result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
        }
    } @catch(NSException* e) {  // NSInvalidArgumentException if path is . or ..
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:SYNTAX_ERR];
    }

    return result;
}

- (CDVPluginResult *)removeFileAtURL:(CDVFilesystemURL *)localURI
{
    NSString *fileSystemPath = [self filesystemPathForURL:localURI];

    NSFileManager* fileMgr = [[NSFileManager alloc] init];
    BOOL bIsDir = NO;
    BOOL bExists = [fileMgr fileExistsAtPath:fileSystemPath isDirectory:&bIsDir];
    if (!bExists) {
        return [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_FOUND_ERR];
    }
    if (bIsDir && ([[fileMgr contentsOfDirectoryAtPath:fileSystemPath error:nil] count] != 0)) {
        // dir is not empty
        return [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:INVALID_MODIFICATION_ERR];
    }
    return [self doRemove:fileSystemPath];
}

- (CDVPluginResult *)recursiveRemoveFileAtURL:(CDVFilesystemURL *)localURI
{
    NSString *fileSystemPath = [self filesystemPathForURL:localURI];
    return [self doRemove:fileSystemPath];
}

/*
 * IN
 *  NSString localURI
 * OUT
 *  NSString full local filesystem path for the represented file or directory, or nil if no such path is possible
 *  The file or directory does not necessarily have to exist. nil is returned if the filesystem type is not recognized,
 *  or if the URL is malformed.
 * The incoming URI should be properly escaped (no raw spaces, etc. URI percent-encoding is expected).
 */
- (NSString *)fullPathForFileSystemPath:(NSString *)fsPath
{
    if ([fsPath hasPrefix:self.fsRoot]) {
        return [fsPath substringFromIndex:[self.fsRoot length]];
    }
    return nil;
}


- (CDVPluginResult *)readEntriesAtURL:(CDVFilesystemURL *)localURI
{
    NSFileManager* fileMgr = [[NSFileManager alloc] init];
    NSError* __autoreleasing error = nil;
    NSString *fileSystemPath = [self filesystemPathForURL:localURI];

    NSArray* contents = [fileMgr contentsOfDirectoryAtPath:fileSystemPath error:&error];

    if (contents) {
        NSMutableArray* entries = [NSMutableArray arrayWithCapacity:1];
        if ([contents count] > 0) {
            // create an Entry (as JSON) for each file/dir
            for (NSString* name in contents) {
                // see if is dir or file
                NSString* entryPath = [fileSystemPath stringByAppendingPathComponent:name];
                BOOL bIsDir = NO;
                [fileMgr fileExistsAtPath:entryPath isDirectory:&bIsDir];
                NSDictionary* entryDict = [self makeEntryForPath:[self fullPathForFileSystemPath:entryPath] isDirectory:bIsDir];
                [entries addObject:entryDict];
            }
        }
        return [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray:entries];
    } else {
        // assume not found but could check error for more specific error conditions
        return [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_FOUND_ERR];
    }
}

- (unsigned long long)truncateFile:(NSString*)filePath atPosition:(unsigned long long)pos
{
    unsigned long long newPos = 0UL;

    NSFileHandle* file = [NSFileHandle fileHandleForWritingAtPath:filePath];

    if (file) {
        [file truncateFileAtOffset:(unsigned long long)pos];
        newPos = [file offsetInFile];
        [file synchronizeFile];
        [file closeFile];
    }
    return newPos;
}

- (CDVPluginResult *)truncateFileAtURL:(CDVFilesystemURL *)localURI atPosition:(unsigned long long)pos
{
    unsigned long long newPos = [self truncateFile:[self filesystemPathForURL:localURI] atPosition:pos];
    return [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:(int)newPos];
}

- (CDVPluginResult *)writeToFileAtURL:(CDVFilesystemURL *)localURL withData:(NSData*)encData append:(BOOL)shouldAppend
{
    NSString *filePath = [self filesystemPathForURL:localURL];

    CDVPluginResult* result = nil;
    CDVFileError errCode = INVALID_MODIFICATION_ERR;
    int bytesWritten = 0;

    if (filePath) {
        NSOutputStream* fileStream = [NSOutputStream outputStreamToFileAtPath:filePath append:shouldAppend];
        if (fileStream) {
            NSUInteger len = [encData length];
            if (len == 0) {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:(double)len];
            } else {
                [fileStream open];

                bytesWritten = (int)[fileStream write:[encData bytes] maxLength:len];

                [fileStream close];
                if (bytesWritten > 0) {
                    result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:bytesWritten];
                    // } else {
                    // can probably get more detailed error info via [fileStream streamError]
                    // errCode already set to INVALID_MODIFICATION_ERR;
                    // bytesWritten = 0; // may be set to -1 on error
                }
            }
        } // else fileStream not created return INVALID_MODIFICATION_ERR
    } else {
        // invalid filePath
        errCode = NOT_FOUND_ERR;
    }
    if (!result) {
        // was an error
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errCode];
    }
    return result;
}

/**
 * Helper function to check to see if the user attempted to copy an entry into its parent without changing its name,
 * or attempted to copy a directory into a directory that it contains directly or indirectly.
 *
 * IN:
 *  NSString* srcDir
 *  NSString* destinationDir
 * OUT:
 *  YES copy/ move is allows
 *  NO move is onto itself
 */
- (BOOL)canCopyMoveSrc:(NSString*)src ToDestination:(NSString*)dest
{
    // This weird test is to determine if we are copying or moving a directory into itself.
    // Copy /Documents/myDir to /Documents/myDir-backup is okay but
    // Copy /Documents/myDir to /Documents/myDir/backup not okay
    BOOL copyOK = YES;
    NSRange range = [dest rangeOfString:src];

    if (range.location != NSNotFound) {
        NSRange testRange = {range.length - 1, ([dest length] - range.length)};
        NSRange resultRange = [dest rangeOfString:@"/" options:0 range:testRange];
        if (resultRange.location != NSNotFound) {
            copyOK = NO;
        }
    }
    return copyOK;
}

- (void)copyFileToURL:(CDVFilesystemURL *)destURL withName:(NSString *)newName fromFileSystem:(NSObject<CDVFileSystem> *)srcFs atURL:(CDVFilesystemURL *)srcURL copy:(BOOL)bCopy callback:(void (^)(CDVPluginResult *))callback
{
    NSFileManager *fileMgr = [[NSFileManager alloc] init];
    NSString *destRootPath = [self filesystemPathForURL:destURL];
    BOOL bDestIsDir = NO;
    BOOL bDestExists = [fileMgr fileExistsAtPath:destRootPath isDirectory:&bDestIsDir];

    NSString *newFileSystemPath = [destRootPath stringByAppendingPathComponent:newName];
    NSString *newFullPath = [self fullPathForFileSystemPath:newFileSystemPath];

    BOOL bNewIsDir = NO;
    BOOL bNewExists = [fileMgr fileExistsAtPath:newFileSystemPath isDirectory:&bNewIsDir];

    CDVPluginResult *result = nil;
    int errCode = 0;

    if (!bDestExists) {
        // the destination root does not exist
        errCode = NOT_FOUND_ERR;
    }

    else if ([srcFs isKindOfClass:[CDVLocalFilesystem class]]) {
        /* Same FS, we can shortcut with NSFileManager operations */
        NSString *srcFullPath = [srcFs filesystemPathForURL:srcURL];

        BOOL bSrcIsDir = NO;
        BOOL bSrcExists = [fileMgr fileExistsAtPath:srcFullPath isDirectory:&bSrcIsDir];

        if (!bSrcExists) {
            // the source does not exist
            errCode = NOT_FOUND_ERR;
        } else if ([newFileSystemPath isEqualToString:srcFullPath]) {
            // source and destination can not be the same
            errCode = INVALID_MODIFICATION_ERR;
        } else if (bSrcIsDir && (bNewExists && !bNewIsDir)) {
            // can't copy/move dir to file
            errCode = INVALID_MODIFICATION_ERR;
        } else { // no errors yet
            NSError* __autoreleasing error = nil;
            BOOL bSuccess = NO;
            if (bCopy) {
                if (bSrcIsDir && ![self canCopyMoveSrc:srcFullPath ToDestination:newFileSystemPath]) {
                    // can't copy dir into self
                    errCode = INVALID_MODIFICATION_ERR;
                } else if (bNewExists) {
                    // the full destination should NOT already exist if a copy
                    errCode = PATH_EXISTS_ERR;
                } else {
                    bSuccess = [fileMgr copyItemAtPath:srcFullPath toPath:newFileSystemPath error:&error];
                }
            } else { // move
                // iOS requires that destination must not exist before calling moveTo
                // is W3C INVALID_MODIFICATION_ERR error if destination dir exists and has contents
                //
                if (!bSrcIsDir && (bNewExists && bNewIsDir)) {
                    // can't move a file to directory
                    errCode = INVALID_MODIFICATION_ERR;
                } else if (bSrcIsDir && ![self canCopyMoveSrc:srcFullPath ToDestination:newFileSystemPath]) {
                    // can't move a dir into itself
                    errCode = INVALID_MODIFICATION_ERR;
                } else if (bNewExists) {
                    if (bNewIsDir && ([[fileMgr contentsOfDirectoryAtPath:newFileSystemPath error:NULL] count] != 0)) {
                        // can't move dir to a dir that is not empty
                        errCode = INVALID_MODIFICATION_ERR;
                        newFileSystemPath = nil;  // so we won't try to move
                    } else {
                        // remove destination so can perform the moveItemAtPath
                        bSuccess = [fileMgr removeItemAtPath:newFileSystemPath error:NULL];
                        if (!bSuccess) {
                            errCode = INVALID_MODIFICATION_ERR; // is this the correct error?
                            newFileSystemPath = nil;
                        }
                    }
                } else if (bNewIsDir && [newFileSystemPath hasPrefix:srcFullPath]) {
                    // can't move a directory inside itself or to any child at any depth;
                    errCode = INVALID_MODIFICATION_ERR;
                    newFileSystemPath = nil;
                }

                if (newFileSystemPath != nil) {
                    bSuccess = [fileMgr moveItemAtPath:srcFullPath toPath:newFileSystemPath error:&error];
                }
            }
            if (bSuccess) {
                // should verify it is there and of the correct type???
                NSDictionary* newEntry = [self makeEntryForPath:newFullPath isDirectory:bSrcIsDir];
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:newEntry];
            } else {
                if (error) {
                    if (([error code] == NSFileReadUnknownError) || ([error code] == NSFileReadTooLargeError)) {
                        errCode = NOT_READABLE_ERR;
                    } else if ([error code] == NSFileWriteOutOfSpaceError) {
                        errCode = QUOTA_EXCEEDED_ERR;
                    } else if ([error code] == NSFileWriteNoPermissionError) {
                        errCode = NO_MODIFICATION_ALLOWED_ERR;
                    }
                }
            }
        }
    } else {
        // Need to copy the hard way
        [srcFs readFileAtURL:srcURL start:0 end:-1 callback:^(NSData* data, NSString* mimeType, CDVFileError errorCode) {
            CDVPluginResult* result = nil;
            if (data != nil) {
                BOOL bSuccess = [data writeToFile:newFileSystemPath atomically:YES];
                if (bSuccess) {
                    // should verify it is there and of the correct type???
                    NSDictionary* newEntry = [self makeEntryForPath:newFullPath isDirectory:NO];
                    result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:newEntry];
                } else {
                    result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:ABORT_ERR];
                }
            } else {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
            }
            callback(result);
        }];
        return; // Async IO; return without callback.
    }
    if (result == nil) {
        if (!errCode) {
            errCode = INVALID_MODIFICATION_ERR; // Catch-all default
        }
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errCode];
    }
    callback(result);
}

/* helper function to get the mimeType from the file extension
 * IN:
 *	NSString* fullPath - filename (may include path)
 * OUT:
 *	NSString* the mime type as type/subtype.  nil if not able to determine
 */
+ (NSString*)getMimeTypeFromPath:(NSString*)fullPath
{
    NSString* mimeType = nil;

    if (fullPath) {
        CFStringRef typeId = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)[fullPath pathExtension], NULL);
        if (typeId) {
            mimeType = (__bridge_transfer NSString*)UTTypeCopyPreferredTagWithClass(typeId, kUTTagClassMIMEType);
            if (!mimeType) {
                // special case for m4a
                if ([(__bridge NSString*)typeId rangeOfString : @"m4a-audio"].location != NSNotFound) {
                    mimeType = @"audio/mp4";
                } else if ([[fullPath pathExtension] rangeOfString:@"wav"].location != NSNotFound) {
                    mimeType = @"audio/wav";
                } else if ([[fullPath pathExtension] rangeOfString:@"css"].location != NSNotFound) {
                    mimeType = @"text/css";
                }
            }
            CFRelease(typeId);
        }
    }
    return mimeType;
}

- (void)readFileAtURL:(CDVFilesystemURL *)localURL start:(NSInteger)start end:(NSInteger)end callback:(void (^)(NSData*, NSString* mimeType, CDVFileError))callback
{
    NSString *path = [self filesystemPathForURL:localURL];

    NSString* mimeType = [CDVLocalFilesystem getMimeTypeFromPath:path];
    if (mimeType == nil) {
        mimeType = @"*/*";
    }
    NSFileHandle* file = [NSFileHandle fileHandleForReadingAtPath:path];
    if (start > 0) {
        [file seekToFileOffset:start];
    }

    NSData* readData;
    if (end < 0) {
        readData = [file readDataToEndOfFile];
    } else {
        readData = [file readDataOfLength:(end - start)];
    }
    [file closeFile];

    callback(readData, mimeType, readData != nil ? NO_ERROR : NOT_FOUND_ERR);
}

- (void)getFileMetadataForURL:(CDVFilesystemURL *)localURL callback:(void (^)(CDVPluginResult *))callback
{
    NSString *path = [self filesystemPathForURL:localURL];
    CDVPluginResult *result;
    NSFileManager* fileMgr = [[NSFileManager alloc] init];

    NSError* __autoreleasing error = nil;
    NSDictionary* fileAttrs = [fileMgr attributesOfItemAtPath:path error:&error];

    if (fileAttrs) {

        // create dictionary of file info
        NSMutableDictionary* fileInfo = [NSMutableDictionary dictionaryWithCapacity:5];

        [fileInfo setObject:localURL.fullPath forKey:@"fullPath"];
        [fileInfo setObject:@"" forKey:@"type"];  // can't easily get the mimetype unless create URL, send request and read response so skipping
        [fileInfo setObject:[path lastPathComponent] forKey:@"name"];

        // Ensure that directories (and other non-regular files) report size of 0
        unsigned long long size = ([fileAttrs fileType] == NSFileTypeRegular ? [fileAttrs fileSize] : 0);
        [fileInfo setObject:[NSNumber numberWithUnsignedLongLong:size] forKey:@"size"];

        NSDate* modDate = [fileAttrs fileModificationDate];
        if (modDate) {
            [fileInfo setObject:[NSNumber numberWithDouble:[modDate timeIntervalSince1970] * 1000] forKey:@"lastModifiedDate"];
        }

        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:fileInfo];

    } else {
        // didn't get fileAttribs
        CDVFileError errorCode = ABORT_ERR;
        NSLog(@"error getting metadata: %@", [error localizedDescription]);
        if ([error code] == NSFileNoSuchFileError || [error code] == NSFileReadNoSuchFileError) {
            errorCode = NOT_FOUND_ERR;
        }
        // log [NSNumber numberWithDouble: theMessage] objCtype to see what it returns
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errorCode];
    }

    callback(result);
}

@end
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
 */

#import "CDVFile.h"

extern NSString* const kCDVAssetsLibraryPrefix;
extern NSString* const kCDVAssetsLibraryScheme;

@interface CDVAssetLibraryFilesystem : NSObject<CDVFileSystem> {
}

- (id) initWithName:(NSString *)name;

@end
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
 */

#import "CDVFile.h"
#import "CDVAssetLibraryFilesystem.h"
#import <Cordova/CDV.h>
#import <AssetsLibrary/ALAsset.h>
#import <AssetsLibrary/ALAssetRepresentation.h>
#import <AssetsLibrary/ALAssetsLibrary.h>
#import <MobileCoreServices/MobileCoreServices.h>

NSString* const kCDVAssetsLibraryPrefix = @"assets-library://";
NSString* const kCDVAssetsLibraryScheme = @"assets-library";

@implementation CDVAssetLibraryFilesystem
@synthesize name=_name, urlTransformer;


/*
 The CDVAssetLibraryFilesystem works with resources which are identified
 by iOS as
   asset-library://<path>
 and represents them internally as URLs of the form
   cdvfile://localhost/assets-library/<path>
 */

- (NSURL *)assetLibraryURLForLocalURL:(CDVFilesystemURL *)url
{
    if ([url.url.scheme isEqualToString:kCDVFilesystemURLPrefix]) {
        NSString *path = [[url.url absoluteString] substringFromIndex:[@"cdvfile://localhost/assets-library" length]];
        return [NSURL URLWithString:[NSString stringWithFormat:@"assets-library:/%@", path]];
    }
    return url.url;
}

- (CDVPluginResult *)entryForLocalURI:(CDVFilesystemURL *)url
{
    NSDictionary* entry = [self makeEntryForLocalURL:url];
    return [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:entry];
}

- (NSDictionary *)makeEntryForLocalURL:(CDVFilesystemURL *)url {
    return [self makeEntryForPath:url.fullPath isDirectory:NO];
}

- (NSDictionary*)makeEntryForPath:(NSString*)fullPath isDirectory:(BOOL)isDir
{
    NSMutableDictionary* dirEntry = [NSMutableDictionary dictionaryWithCapacity:5];
    NSString* lastPart = [fullPath lastPathComponent];
    if (isDir && ![fullPath hasSuffix:@"/"]) {
        fullPath = [fullPath stringByAppendingString:@"/"];
    }
    [dirEntry setObject:[NSNumber numberWithBool:!isDir]  forKey:@"isFile"];
    [dirEntry setObject:[NSNumber numberWithBool:isDir]  forKey:@"isDirectory"];
    [dirEntry setObject:fullPath forKey:@"fullPath"];
    [dirEntry setObject:lastPart forKey:@"name"];
    [dirEntry setObject:self.name forKey: @"filesystemName"];

    NSURL* nativeURL = [NSURL URLWithString:[NSString stringWithFormat:@"assets-library:/%@",fullPath]];
    if (self.urlTransformer) {
        nativeURL = self.urlTransformer(nativeURL);
    }
    dirEntry[@"nativeURL"] = [nativeURL absoluteString];

    return dirEntry;
}

/* helper function to get the mimeType from the file extension
 * IN:
 *	NSString* fullPath - filename (may include path)
 * OUT:
 *	NSString* the mime type as type/subtype.  nil if not able to determine
 */
+ (NSString*)getMimeTypeFromPath:(NSString*)fullPath
{
    NSString* mimeType = nil;

    if (fullPath) {
        CFStringRef typeId = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)[fullPath pathExtension], NULL);
        if (typeId) {
            mimeType = (__bridge_transfer NSString*)UTTypeCopyPreferredTagWithClass(typeId, kUTTagClassMIMEType);
            if (!mimeType) {
                // special case for m4a
                if ([(__bridge NSString*)typeId rangeOfString : @"m4a-audio"].location != NSNotFound) {
                    mimeType = @"audio/mp4";
                } else if ([[fullPath pathExtension] rangeOfString:@"wav"].location != NSNotFound) {
                    mimeType = @"audio/wav";
                } else if ([[fullPath pathExtension] rangeOfString:@"css"].location != NSNotFound) {
                    mimeType = @"text/css";
                }
            }
            CFRelease(typeId);
        }
    }
    return mimeType;
}

- (id)initWithName:(NSString *)name
{
    if (self) {
        self.name = name;
    }
    return self;
}

- (CDVPluginResult *)getFileForURL:(CDVFilesystemURL *)baseURI requestedPath:(NSString *)requestedPath options:(NSDictionary *)options
{
    // return unsupported result for assets-library URLs
   return [CDVPluginResult resultWithStatus:CDVCommandStatus_MALFORMED_URL_EXCEPTION messageAsString:@"getFile not supported for assets-library URLs."];
}

- (CDVPluginResult*)getParentForURL:(CDVFilesystemURL *)localURI
{
    // we don't (yet?) support getting the parent of an asset
    return [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_READABLE_ERR];
}

- (CDVPluginResult*)setMetadataForURL:(CDVFilesystemURL *)localURI withObject:(NSDictionary *)options
{
    // setMetadata doesn't make sense for asset library files
    return [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
}

- (CDVPluginResult *)removeFileAtURL:(CDVFilesystemURL *)localURI
{
    // return error for assets-library URLs
    return [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:INVALID_MODIFICATION_ERR];
}

- (CDVPluginResult *)recursiveRemoveFileAtURL:(CDVFilesystemURL *)localURI
{
    // return error for assets-library URLs
    return [CDVPluginResult resultWithStatus:CDVCommandStatus_MALFORMED_URL_EXCEPTION messageAsString:@"removeRecursively not supported for assets-library URLs."];
}

- (CDVPluginResult *)readEntriesAtURL:(CDVFilesystemURL *)localURI
{
    // return unsupported result for assets-library URLs
    return [CDVPluginResult resultWithStatus:CDVCommandStatus_MALFORMED_URL_EXCEPTION messageAsString:@"readEntries not supported for assets-library URLs."];
}

- (CDVPluginResult *)truncateFileAtURL:(CDVFilesystemURL *)localURI atPosition:(unsigned long long)pos
{
    // assets-library files can't be truncated
    return [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NO_MODIFICATION_ALLOWED_ERR];
}

- (CDVPluginResult *)writeToFileAtURL:(CDVFilesystemURL *)localURL withData:(NSData*)encData append:(BOOL)shouldAppend
{
    // text can't be written into assets-library files
    return [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NO_MODIFICATION_ALLOWED_ERR];
}

- (void)copyFileToURL:(CDVFilesystemURL *)destURL withName:(NSString *)newName fromFileSystem:(NSObject<CDVFileSystem> *)srcFs atURL:(CDVFilesystemURL *)srcURL copy:(BOOL)bCopy callback:(void (^)(CDVPluginResult *))callback
{
    // Copying to an assets library file is not doable, since we can't write it.
    CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:INVALID_MODIFICATION_ERR];
    callback(result);
}

- (NSString *)filesystemPathForURL:(CDVFilesystemURL *)url
{
    NSString *path = nil;
    if ([[url.url scheme] isEqualToString:kCDVAssetsLibraryScheme]) {
        path = [url.url path];
    } else {
       path = url.fullPath;
    }
    if ([path hasSuffix:@"/"]) {
      path = [path substringToIndex:([path length]-1)];
    }
    return path;
}

- (void)readFileAtURL:(CDVFilesystemURL *)localURL start:(NSInteger)start end:(NSInteger)end callback:(void (^)(NSData*, NSString* mimeType, CDVFileError))callback
{
    ALAssetsLibraryAssetForURLResultBlock resultBlock = ^(ALAsset* asset) {
        if (asset) {
            // We have the asset!  Get the data and send it off.
            ALAssetRepresentation* assetRepresentation = [asset defaultRepresentation];
            NSUInteger size = (end > start) ? (end - start) : [assetRepresentation size];
            Byte* buffer = (Byte*)malloc(size);
            NSUInteger bufferSize = [assetRepresentation getBytes:buffer fromOffset:start length:size error:nil];
            NSData* data = [NSData dataWithBytesNoCopy:buffer length:bufferSize freeWhenDone:YES];
            NSString* MIMEType = (__bridge_transfer NSString*)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)[assetRepresentation UTI], kUTTagClassMIMEType);

            callback(data, MIMEType, NO_ERROR);
        } else {
            callback(nil, nil, NOT_FOUND_ERR);
        }
    };

    ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError* error) {
        // Retrieving the asset failed for some reason.  Send the appropriate error.
        NSLog(@"Error: %@", error);
        callback(nil, nil, SECURITY_ERR);
    };

    ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc] init];
    [assetsLibrary assetForURL:[self assetLibraryURLForLocalURL:localURL] resultBlock:resultBlock failureBlock:failureBlock];
}

- (void)getFileMetadataForURL:(CDVFilesystemURL *)localURL callback:(void (^)(CDVPluginResult *))callback
{
    // In this case, we need to use an asynchronous method to retrieve the file.
    // Because of this, we can't just assign to `result` and send it at the end of the method.
    // Instead, we return after calling the asynchronous method and send `result` in each of the blocks.
    ALAssetsLibraryAssetForURLResultBlock resultBlock = ^(ALAsset* asset) {
        if (asset) {
            // We have the asset!  Populate the dictionary and send it off.
            NSMutableDictionary* fileInfo = [NSMutableDictionary dictionaryWithCapacity:5];
            ALAssetRepresentation* assetRepresentation = [asset defaultRepresentation];
            [fileInfo setObject:[NSNumber numberWithUnsignedLongLong:[assetRepresentation size]] forKey:@"size"];
            [fileInfo setObject:localURL.fullPath forKey:@"fullPath"];
            NSString* filename = [assetRepresentation filename];
            [fileInfo setObject:filename forKey:@"name"];
            [fileInfo setObject:[CDVAssetLibraryFilesystem getMimeTypeFromPath:filename] forKey:@"type"];
            NSDate* creationDate = [asset valueForProperty:ALAssetPropertyDate];
            NSNumber* msDate = [NSNumber numberWithDouble:[creationDate timeIntervalSince1970] * 1000];
            [fileInfo setObject:msDate forKey:@"lastModifiedDate"];

            callback([CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:fileInfo]);
        } else {
            // We couldn't find the asset.  Send the appropriate error.
            callback([CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_FOUND_ERR]);
        }
    };
    ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError* error) {
        // Retrieving the asset failed for some reason.  Send the appropriate error.
        callback([CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsString:[error localizedDescription]]);
    };

    ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc] init];
    [assetsLibrary assetForURL:[self assetLibraryURLForLocalURL:localURL] resultBlock:resultBlock failureBlock:failureBlock];
    return;
}
@end
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
 */

#import <Foundation/Foundation.h>
#import <Cordova/CDVPlugin.h>

extern NSString* const kCDVAssetsLibraryPrefix;
extern NSString* const kCDVFilesystemURLPrefix;

enum CDVFileError {
    NO_ERROR = 0,
    NOT_FOUND_ERR = 1,
    SECURITY_ERR = 2,
    ABORT_ERR = 3,
    NOT_READABLE_ERR = 4,
    ENCODING_ERR = 5,
    NO_MODIFICATION_ALLOWED_ERR = 6,
    INVALID_STATE_ERR = 7,
    SYNTAX_ERR = 8,
    INVALID_MODIFICATION_ERR = 9,
    QUOTA_EXCEEDED_ERR = 10,
    TYPE_MISMATCH_ERR = 11,
    PATH_EXISTS_ERR = 12
};
typedef int CDVFileError;

@interface CDVFilesystemURL : NSObject  {
    NSURL *_url;
    NSString *_fileSystemName;
    NSString *_fullPath;
}

- (id) initWithString:(NSString*)strURL;
- (id) initWithURL:(NSURL*)URL;
+ (CDVFilesystemURL *)fileSystemURLWithString:(NSString *)strURL;
+ (CDVFilesystemURL *)fileSystemURLWithURL:(NSURL *)URL;

- (NSString *)absoluteURL;

@property (atomic) NSURL *url;
@property (atomic) NSString *fileSystemName;
@property (atomic) NSString *fullPath;

@end

@interface CDVFilesystemURLProtocol : NSURLProtocol
@end

@protocol CDVFileSystem
- (CDVPluginResult *)entryForLocalURI:(CDVFilesystemURL *)url;
- (CDVPluginResult *)getFileForURL:(CDVFilesystemURL *)baseURI requestedPath:(NSString *)requestedPath options:(NSDictionary *)options;
- (CDVPluginResult *)getParentForURL:(CDVFilesystemURL *)localURI;
- (CDVPluginResult *)setMetadataForURL:(CDVFilesystemURL *)localURI withObject:(NSDictionary *)options;
- (CDVPluginResult *)removeFileAtURL:(CDVFilesystemURL *)localURI;
- (CDVPluginResult *)recursiveRemoveFileAtURL:(CDVFilesystemURL *)localURI;
- (CDVPluginResult *)readEntriesAtURL:(CDVFilesystemURL *)localURI;
- (CDVPluginResult *)truncateFileAtURL:(CDVFilesystemURL *)localURI atPosition:(unsigned long long)pos;
- (CDVPluginResult *)writeToFileAtURL:(CDVFilesystemURL *)localURL withData:(NSData*)encData append:(BOOL)shouldAppend;
- (void)copyFileToURL:(CDVFilesystemURL *)destURL withName:(NSString *)newName fromFileSystem:(NSObject<CDVFileSystem> *)srcFs atURL:(CDVFilesystemURL *)srcURL copy:(BOOL)bCopy callback:(void (^)(CDVPluginResult *))callback;
- (void)readFileAtURL:(CDVFilesystemURL *)localURL start:(NSInteger)start end:(NSInteger)end callback:(void (^)(NSData*, NSString* mimeType, CDVFileError))callback;
- (void)getFileMetadataForURL:(CDVFilesystemURL *)localURL callback:(void (^)(CDVPluginResult *))callback;

- (NSDictionary *)makeEntryForLocalURL:(CDVFilesystemURL *)url;
- (NSDictionary*)makeEntryForPath:(NSString*)fullPath isDirectory:(BOOL)isDir;

@property (nonatomic,strong) NSString *name;
@property (nonatomic, copy) NSURL*(^urlTransformer)(NSURL*);

@optional
- (NSString *)filesystemPathForURL:(CDVFilesystemURL *)localURI;
- (CDVFilesystemURL *)URLforFilesystemPath:(NSString *)path;

@end

@interface CDVFile : CDVPlugin {
    NSString* rootDocsPath;
    NSString* appDocsPath;
    NSString* appLibraryPath;
    NSString* appTempPath;

    NSMutableArray* fileSystems_;
    BOOL userHasAllowed;
}

- (NSNumber*)checkFreeDiskSpace:(NSString*)appPath;
- (NSDictionary*)makeEntryForPath:(NSString*)fullPath fileSystemName:(NSString *)fsName isDirectory:(BOOL)isDir;
- (NSDictionary *)makeEntryForURL:(NSURL *)URL;
- (CDVFilesystemURL *)fileSystemURLforLocalPath:(NSString *)localPath;

- (NSObject<CDVFileSystem> *)filesystemForURL:(CDVFilesystemURL *)localURL;

/* Native Registration API */
- (void)registerFilesystem:(NSObject<CDVFileSystem> *)fs;
- (NSObject<CDVFileSystem> *)fileSystemByName:(NSString *)fsName;

/* Exec API */
- (void)requestFileSystem:(CDVInvokedUrlCommand*)command;
- (void)resolveLocalFileSystemURI:(CDVInvokedUrlCommand*)command;
- (void)getDirectory:(CDVInvokedUrlCommand*)command;
- (void)getFile:(CDVInvokedUrlCommand*)command;
- (void)getParent:(CDVInvokedUrlCommand*)command;
- (void)removeRecursively:(CDVInvokedUrlCommand*)command;
- (void)remove:(CDVInvokedUrlCommand*)command;
- (void)copyTo:(CDVInvokedUrlCommand*)command;
- (void)moveTo:(CDVInvokedUrlCommand*)command;
- (void)getFileMetadata:(CDVInvokedUrlCommand*)command;
- (void)readEntries:(CDVInvokedUrlCommand*)command;
- (void)readAsText:(CDVInvokedUrlCommand*)command;
- (void)readAsDataURL:(CDVInvokedUrlCommand*)command;
- (void)readAsArrayBuffer:(CDVInvokedUrlCommand*)command;
- (void)write:(CDVInvokedUrlCommand*)command;
- (void)testFileExists:(CDVInvokedUrlCommand*)command;
- (void)testDirectoryExists:(CDVInvokedUrlCommand*)command;
- (void)getFreeDiskSpace:(CDVInvokedUrlCommand*)command;
- (void)truncate:(CDVInvokedUrlCommand*)command;
- (void)doCopyMove:(CDVInvokedUrlCommand*)command isCopy:(BOOL)bCopy;

/* Compatibilty with older File API */
- (NSString*)getMimeTypeFromPath:(NSString*)fullPath;
- (NSDictionary *)getDirectoryEntry:(NSString *)target isDirectory:(BOOL)bDirRequest;

/* Conversion between filesystem paths and URLs */
- (NSString *)filesystemPathForURL:(CDVFilesystemURL *)URL;

/* Internal methods for testing */
- (void)_getLocalFilesystemPath:(CDVInvokedUrlCommand*)command;

@property (nonatomic, strong) NSString* rootDocsPath;
@property (nonatomic, strong) NSString* appDocsPath;
@property (nonatomic, strong) NSString* appLibraryPath;
@property (nonatomic, strong) NSString* appTempPath;
@property (nonatomic, strong) NSString* persistentPath;
@property (nonatomic, strong) NSString* temporaryPath;
@property (nonatomic, strong) NSMutableArray* fileSystems;

@property BOOL userHasAllowed;

@end

#define kW3FileTemporary @"temporary"
#define kW3FilePersistent @"persistent"
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
 */

#import <Cordova/CDV.h>
#import "CDVFile.h"
#import "CDVLocalFilesystem.h"
#import "CDVAssetLibraryFilesystem.h"
#import <objc/message.h>

static NSString* toBase64(NSData* data) {
    SEL s1 = NSSelectorFromString(@"cdv_base64EncodedString");
    SEL s2 = NSSelectorFromString(@"base64EncodedString");
    SEL s3 = NSSelectorFromString(@"base64EncodedStringWithOptions:");
    
    if ([data respondsToSelector:s1]) {
        NSString* (*func)(id, SEL) = (void *)[data methodForSelector:s1];
        return func(data, s1);
    } else if ([data respondsToSelector:s2]) {
        NSString* (*func)(id, SEL) = (void *)[data methodForSelector:s2];
        return func(data, s2);
    } else if ([data respondsToSelector:s3]) {
        NSString* (*func)(id, SEL, NSUInteger) = (void *)[data methodForSelector:s3];
        return func(data, s3, 0);
    } else {
        return nil;
    }
}

CDVFile *filePlugin = nil;

extern NSString * const NSURLIsExcludedFromBackupKey __attribute__((weak_import));

#ifndef __IPHONE_5_1
    NSString* const NSURLIsExcludedFromBackupKey = @"NSURLIsExcludedFromBackupKey";
#endif

NSString* const kCDVFilesystemURLPrefix = @"cdvfile";

@implementation CDVFilesystemURL
@synthesize url=_url;
@synthesize fileSystemName=_fileSystemName;
@synthesize fullPath=_fullPath;

- (id) initWithString:(NSString *)strURL
{
    if ( self = [super init] ) {
        NSURL *decodedURL = [NSURL URLWithString:strURL];
        return [self initWithURL:decodedURL];
    }
    return nil;
}

-(id) initWithURL:(NSURL *)URL
{
    if ( self = [super init] ) {
        self.url = URL;
        self.fileSystemName = [self filesystemNameForLocalURI:URL];
        self.fullPath = [self fullPathForLocalURI:URL];
    }
    return self;
}

/*
 * IN
 *  NSString localURI
 * OUT
 *  NSString FileSystem Name for this URI, or nil if it is not recognized.
 */
- (NSString *)filesystemNameForLocalURI:(NSURL *)uri
{
    if ([[uri scheme] isEqualToString:kCDVFilesystemURLPrefix] && [[uri host] isEqualToString:@"localhost"]) {
        NSArray *pathComponents = [uri pathComponents];
        if (pathComponents != nil && pathComponents.count > 1) {
            return [pathComponents objectAtIndex:1];
        }
    } else if ([[uri scheme] isEqualToString:kCDVAssetsLibraryScheme]) {
        return @"assets-library";
    }
    return nil;
}

/*
 * IN
 *  NSString localURI
 * OUT
 *  NSString fullPath component suitable for an Entry object.
 * The incoming URI should be properly escaped. The returned fullPath is unescaped.
 */
- (NSString *)fullPathForLocalURI:(NSURL *)uri
{
    if ([[uri scheme] isEqualToString:kCDVFilesystemURLPrefix] && [[uri host] isEqualToString:@"localhost"]) {
        NSString *path = [uri path];
        if ([uri query]) {
            path = [NSString stringWithFormat:@"%@?%@", path, [uri query]];
        }
        NSRange slashRange = [path rangeOfString:@"/" options:0 range:NSMakeRange(1, path.length-1)];
        if (slashRange.location == NSNotFound) {
            return @"";
        }
        return [path substringFromIndex:slashRange.location];
    } else if ([[uri scheme] isEqualToString:kCDVAssetsLibraryScheme]) {
        return [[uri absoluteString] substringFromIndex:[kCDVAssetsLibraryScheme length]+2];
    }
    return nil;
}

+ (CDVFilesystemURL *)fileSystemURLWithString:(NSString *)strURL
{
    return [[CDVFilesystemURL alloc] initWithString:strURL];
}

+ (CDVFilesystemURL *)fileSystemURLWithURL:(NSURL *)URL
{
    return [[CDVFilesystemURL alloc] initWithURL:URL];
}

- (NSString *)absoluteURL
{
    return [NSString stringWithFormat:@"cdvfile://localhost/%@%@", self.fileSystemName, self.fullPath];
}

@end

@implementation CDVFilesystemURLProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest*)request
{
    NSURL* url = [request URL];
    return [[url scheme] isEqualToString:kCDVFilesystemURLPrefix];
}

+ (NSURLRequest*)canonicalRequestForRequest:(NSURLRequest*)request
{
    return request;
}

+ (BOOL)requestIsCacheEquivalent:(NSURLRequest*)requestA toRequest:(NSURLRequest*)requestB
{
    return [[[requestA URL] resourceSpecifier] isEqualToString:[[requestB URL] resourceSpecifier]];
}

- (void)startLoading
{
    CDVFilesystemURL* url = [CDVFilesystemURL fileSystemURLWithURL:[[self request] URL]];
    NSObject<CDVFileSystem> *fs = [filePlugin filesystemForURL:url];
    __weak CDVFilesystemURLProtocol* weakSelf = self;
    
    [fs readFileAtURL:url start:0 end:-1 callback:^void(NSData *data, NSString *mimetype, CDVFileError error) {
        NSMutableDictionary* responseHeaders = [[NSMutableDictionary alloc] init];
        responseHeaders[@"Cache-Control"] = @"no-cache";

        if (!error) {
            responseHeaders[@"Content-Type"] = mimetype;
            NSURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:url.url statusCode:200 HTTPVersion:@"HTTP/1.1"headerFields:responseHeaders];
            [[weakSelf client] URLProtocol:weakSelf didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
            [[weakSelf client] URLProtocol:weakSelf didLoadData:data];
            [[weakSelf client] URLProtocolDidFinishLoading:weakSelf];
        } else {
            NSURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:url.url statusCode:404 HTTPVersion:@"HTTP/1.1"headerFields:responseHeaders];
            [[weakSelf client] URLProtocol:weakSelf didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
            [[weakSelf client] URLProtocolDidFinishLoading:weakSelf];
        }
    }];
}

- (void)stopLoading
{}

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
                  willCacheResponse:(NSCachedURLResponse*)cachedResponse {
    return nil;
}

@end


@implementation CDVFile

@synthesize rootDocsPath, appDocsPath, appLibraryPath, appTempPath, userHasAllowed, fileSystems=fileSystems_;

- (void)registerFilesystem:(NSObject<CDVFileSystem> *)fs {
    __weak CDVFile* weakSelf = self;
    SEL sel = NSSelectorFromString(@"urlTransformer");
    // for backwards compatibility - we check if this property is there
    // we create a wrapper block because the urlTransformer property
    // on the commandDelegate might be set dynamically at a future time
    // (and not dependent on plugin loading order)
    if ([self.commandDelegate respondsToSelector:sel]) {
        fs.urlTransformer = ^NSURL*(NSURL* urlToTransform) {
            // grab the block from the commandDelegate
            NSURL* (^urlTransformer)(NSURL*) = ((id(*)(id, SEL))objc_msgSend)(weakSelf.commandDelegate, sel);
            // if block is not null, we call it
            if (urlTransformer) {
                return urlTransformer(urlToTransform);
            } else { // else we return the same url
                return urlToTransform;
            }
        };
    }
    [fileSystems_ addObject:fs];
}

- (NSObject<CDVFileSystem> *)fileSystemByName:(NSString *)fsName
{
    if (self.fileSystems != nil) {
        for (NSObject<CDVFileSystem> *fs in self.fileSystems) {
            if ([fs.name isEqualToString:fsName]) {
                return fs;
            }
        }
    }
    return nil;
}

- (NSObject<CDVFileSystem> *)filesystemForURL:(CDVFilesystemURL *)localURL {
    if (localURL.fileSystemName == nil) return nil;
    @try {
        return [self fileSystemByName:localURL.fileSystemName];
    }
    @catch (NSException *e) {
        return nil;
    }
}

- (NSArray *)getExtraFileSystemsPreference:(UIViewController *)vc
{
    NSString *filesystemsStr = nil;
    if([self.viewController isKindOfClass:[CDVViewController class]]) {
        CDVViewController *vc = (CDVViewController *)self.viewController;
        NSDictionary *settings = [vc settings];
        filesystemsStr = [settings[@"iosextrafilesystems"] lowercaseString];
    }
    if (!filesystemsStr) {
        filesystemsStr = @"library,library-nosync,documents,documents-nosync,cache,bundle,root";
    }
    return [filesystemsStr componentsSeparatedByString:@","];
}

- (void)makeNonSyncable:(NSString*)path {
    [[NSFileManager defaultManager] createDirectoryAtPath:path
              withIntermediateDirectories:YES
                               attributes:nil
                                    error:nil];
    NSURL* url = [NSURL fileURLWithPath:path];
    [url setResourceValue: [NSNumber numberWithBool: YES]
                   forKey: NSURLIsExcludedFromBackupKey error:nil];

}

- (void)registerExtraFileSystems:(NSArray *)filesystems fromAvailableSet:(NSDictionary *)availableFileSystems
{
    NSMutableSet *installedFilesystems = [[NSMutableSet alloc] initWithCapacity:7];

    /* Build non-syncable directories as necessary */
    for (NSString *nonSyncFS in @[@"library-nosync", @"documents-nosync"]) {
        if ([filesystems containsObject:nonSyncFS]) {
            [self makeNonSyncable:availableFileSystems[nonSyncFS]];
        }
    }

    /* Register filesystems in order */
    for (NSString *fsName in filesystems) {
        if (![installedFilesystems containsObject:fsName]) {
            NSString *fsRoot = availableFileSystems[fsName];
            if (fsRoot) {
                [filePlugin registerFilesystem:[[CDVLocalFilesystem alloc] initWithName:fsName root:fsRoot]];
                [installedFilesystems addObject:fsName];
            } else {
                NSLog(@"Unrecognized extra filesystem identifier: %@", fsName);
            }
        }
    }
}

- (NSDictionary *)getAvailableFileSystems
{
    NSString *libPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    return @{
        @"library": libPath,
        @"library-nosync": [libPath stringByAppendingPathComponent:@"NoCloud"],
        @"documents": docPath,
        @"documents-nosync": [docPath stringByAppendingPathComponent:@"NoCloud"],
        @"cache": [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0],
        @"bundle": [[NSBundle mainBundle] bundlePath],
        @"root": @"/"
    };
}

- (void)pluginInitialize
{
    filePlugin = self;
    [NSURLProtocol registerClass:[CDVFilesystemURLProtocol class]];

    fileSystems_ = [[NSMutableArray alloc] initWithCapacity:3];

    // Get the Library directory path
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    self.appLibraryPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"files"];

    // Get the Temporary directory path
    self.appTempPath = [NSTemporaryDirectory()stringByStandardizingPath];   // remove trailing slash from NSTemporaryDirectory()

    // Get the Documents directory path
    paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    self.rootDocsPath = [paths objectAtIndex:0];
    self.appDocsPath = [self.rootDocsPath stringByAppendingPathComponent:@"files"];


    NSString *location = nil;
    if([self.viewController isKindOfClass:[CDVViewController class]]) {
        CDVViewController *vc = (CDVViewController *)self.viewController;
        NSMutableDictionary *settings = vc.settings;
        location = [[settings objectForKey:@"iospersistentfilelocation"] lowercaseString];
    }
    if (location == nil) {
        // Compatibilty by default (if the config preference is not set, or
        // if we're not embedded in a CDVViewController somehow.)
        location = @"compatibility";
    }

    NSError *error;
    if ([[NSFileManager defaultManager] createDirectoryAtPath:self.appTempPath
                                  withIntermediateDirectories:YES
                                                   attributes:nil
                                                        error:&error]) {
        [self registerFilesystem:[[CDVLocalFilesystem alloc] initWithName:@"temporary" root:self.appTempPath]];
    } else {
        NSLog(@"Unable to create temporary directory: %@", error);
    }
    if ([location isEqualToString:@"library"]) {
        if ([[NSFileManager defaultManager] createDirectoryAtPath:self.appLibraryPath
                                      withIntermediateDirectories:YES
                                                       attributes:nil
                                                            error:&error]) {
            [self registerFilesystem:[[CDVLocalFilesystem alloc] initWithName:@"persistent" root:self.appLibraryPath]];
        } else {
            NSLog(@"Unable to create library directory: %@", error);
        }
    } else if ([location isEqualToString:@"compatibility"]) {
        /*
         *  Fall-back to compatibility mode -- this is the logic implemented in
         *  earlier versions of this plugin, and should be maintained here so
         *  that apps which were originally deployed with older versions of the
         *  plugin can continue to provide access to files stored under those
         *  versions.
         */
        [self registerFilesystem:[[CDVLocalFilesystem alloc] initWithName:@"persistent" root:self.rootDocsPath]];
    } else {
        NSAssert(false,
            @"File plugin configuration error: Please set iosPersistentFileLocation in config.xml to one of \"library\" (for new applications) or \"compatibility\" (for compatibility with previous versions)");
    }
    [self registerFilesystem:[[CDVAssetLibraryFilesystem alloc] initWithName:@"assets-library"]];

    [self registerExtraFileSystems:[self getExtraFileSystemsPreference:self.viewController]
                  fromAvailableSet:[self getAvailableFileSystems]];

}

- (CDVFilesystemURL *)fileSystemURLforArg:(NSString *)urlArg
{
    CDVFilesystemURL* ret = nil;
    if ([urlArg hasPrefix:@"file://"]) {
        /* This looks like a file url. Get the path, and see if any handlers recognize it. */
        NSURL *fileURL = [NSURL URLWithString:urlArg];
        NSURL *resolvedFileURL = [fileURL URLByResolvingSymlinksInPath];
        NSString *path = [resolvedFileURL path];
        ret = [self fileSystemURLforLocalPath:path];
    } else {
        ret = [CDVFilesystemURL fileSystemURLWithString:urlArg];
    }
    return ret;
}

- (CDVFilesystemURL *)fileSystemURLforLocalPath:(NSString *)localPath
{
    CDVFilesystemURL *localURL = nil;
    NSUInteger shortestFullPath = 0;

    // Try all installed filesystems, in order. Return the most match url.
    for (id object in self.fileSystems) {
        if ([object respondsToSelector:@selector(URLforFilesystemPath:)]) {
            CDVFilesystemURL *url = [object URLforFilesystemPath:localPath];
            if (url){
                // A shorter fullPath would imply that the filesystem is a better match for the local path
                if (!localURL || ([[url fullPath] length] < shortestFullPath)) {
                    localURL = url;
                    shortestFullPath = [[url fullPath] length];
                }
            }
        }
    }
    return localURL;
}

- (NSNumber*)checkFreeDiskSpace:(NSString*)appPath
{
    NSFileManager* fMgr = [[NSFileManager alloc] init];

    NSError* __autoreleasing pError = nil;

    NSDictionary* pDict = [fMgr attributesOfFileSystemForPath:appPath error:&pError];
    NSNumber* pNumAvail = (NSNumber*)[pDict objectForKey:NSFileSystemFreeSize];

    return pNumAvail;
}

/* Request the File System info
 *
 * IN:
 * arguments[0] - type (number as string)
 *	TEMPORARY = 0, PERSISTENT = 1;
 * arguments[1] - size
 *
 * OUT:
 *	Dictionary representing FileSystem object
 *		name - the human readable directory name
 *		root = DirectoryEntry object
 *			bool isDirectory
 *			bool isFile
 *			string name
 *			string fullPath
 *			fileSystem = FileSystem object - !! ignored because creates circular reference !!
 */

- (void)requestFileSystem:(CDVInvokedUrlCommand*)command
{
    // arguments
    NSString* strType = [command argumentAtIndex:0];
    unsigned long long size = [[command argumentAtIndex:1] longLongValue];

    int type = [strType intValue];
    CDVPluginResult* result = nil;

    if (type >= self.fileSystems.count) {
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:NOT_FOUND_ERR];
        NSLog(@"No filesystem of type requested");
    } else {
        NSString* fullPath = @"/";
        // check for avail space for size request
        NSNumber* pNumAvail = [self checkFreeDiskSpace:self.rootDocsPath];
        // NSLog(@"Free space: %@", [NSString stringWithFormat:@"%qu", [ pNumAvail unsignedLongLongValue ]]);
        if (pNumAvail && ([pNumAvail unsignedLongLongValue] < size)) {
            result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:QUOTA_EXCEEDED_ERR];
        } else {
            NSObject<CDVFileSystem> *rootFs = [self.fileSystems objectAtIndex:type];
            if (rootFs == nil) {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:NOT_FOUND_ERR];
                NSLog(@"No filesystem of type requested");
            } else {
                NSMutableDictionary* fileSystem = [NSMutableDictionary dictionaryWithCapacity:2];
                [fileSystem setObject:rootFs.name forKey:@"name"];
                NSDictionary* dirEntry = [self makeEntryForPath:fullPath fileSystemName:rootFs.name isDirectory:YES];
                [fileSystem setObject:dirEntry forKey:@"root"];
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:fileSystem];
            }
        }
    }
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}


- (void)requestAllFileSystems:(CDVInvokedUrlCommand*)command
{
    NSMutableArray* ret = [[NSMutableArray alloc] init];
    for (NSObject<CDVFileSystem>* root in fileSystems_) {
        [ret addObject:[self makeEntryForPath:@"/" fileSystemName:root.name isDirectory:YES]];
    }
    CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray:ret];
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

- (void)requestAllPaths:(CDVInvokedUrlCommand*)command
{
    NSString* libPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0];
    NSString* libPathSync = [libPath stringByAppendingPathComponent:@"Cloud"];
    NSString* libPathNoSync = [libPath stringByAppendingPathComponent:@"NoCloud"];
    NSString* docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString* storagePath = [libPath stringByDeletingLastPathComponent];
    NSString* cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];

    // Create the directories if necessary.
    [[NSFileManager defaultManager] createDirectoryAtPath:libPathSync withIntermediateDirectories:YES attributes:nil error:nil];
    [[NSFileManager defaultManager] createDirectoryAtPath:libPathNoSync withIntermediateDirectories:YES attributes:nil error:nil];
    // Mark NoSync as non-iCloud.
    [[NSURL fileURLWithPath:libPathNoSync] setResourceValue: [NSNumber numberWithBool: YES]
                                                     forKey: NSURLIsExcludedFromBackupKey error:nil];

    NSDictionary* ret = @{
        @"applicationDirectory": [[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]] absoluteString],
        @"applicationStorageDirectory": [[NSURL fileURLWithPath:storagePath] absoluteString],
        @"dataDirectory": [[NSURL fileURLWithPath:libPathNoSync] absoluteString],
        @"syncedDataDirectory": [[NSURL fileURLWithPath:libPathSync] absoluteString],
        @"documentsDirectory": [[NSURL fileURLWithPath:docPath] absoluteString],
        @"cacheDirectory": [[NSURL fileURLWithPath:cachePath] absoluteString],
        @"tempDirectory": [[NSURL fileURLWithPath:NSTemporaryDirectory()] absoluteString]
    };

    CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:ret];
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/* Creates and returns a dictionary representing an Entry Object
 *
 * IN:
 * NSString* fullPath of the entry
 * int fsType - FileSystem type
 * BOOL isDirectory - YES if this is a directory, NO if is a file
 * OUT:
 * NSDictionary* Entry object
 *		bool as NSNumber isDirectory
 *		bool as NSNumber isFile
 *		NSString*  name - last part of path
 *		NSString* fullPath
 *		NSString* filesystemName - FileSystem name -- actual filesystem will be created on the JS side if necessary, to avoid
 *         creating circular reference (FileSystem contains DirectoryEntry which contains FileSystem.....!!)
 */
- (NSDictionary*)makeEntryForPath:(NSString*)fullPath fileSystemName:(NSString *)fsName isDirectory:(BOOL)isDir
{
    NSObject<CDVFileSystem> *fs = [self fileSystemByName:fsName];
    return [fs makeEntryForPath:fullPath isDirectory:isDir];
}

- (NSDictionary *)makeEntryForLocalURL:(CDVFilesystemURL *)localURL
{
    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURL];
    return [fs makeEntryForLocalURL:localURL];
}

- (NSDictionary *)makeEntryForURL:(NSURL *)URL
{
    CDVFilesystemURL* fsURL = [self fileSystemURLforArg:[URL absoluteString]];
    return [self makeEntryForLocalURL:fsURL];
}

/*
 * Given a URI determine the File System information associated with it and return an appropriate W3C entry object
 * IN
 *	NSString* localURI: Should be an escaped local filesystem URI
 * OUT
 *	Entry object
 *		bool isDirectory
 *		bool isFile
 *		string name
 *		string fullPath
 *		fileSystem = FileSystem object - !! ignored because creates circular reference FileSystem contains DirectoryEntry which contains FileSystem.....!!
 */
- (void)resolveLocalFileSystemURI:(CDVInvokedUrlCommand*)command
{
    // arguments
    NSString* localURIstr = [command argumentAtIndex:0];
    CDVPluginResult* result;

    localURIstr = [self encodePath:localURIstr]; //encode path before resolving
    CDVFilesystemURL* inputURI = [self fileSystemURLforArg:localURIstr];

    if (inputURI == nil || inputURI.fileSystemName == nil) {
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:ENCODING_ERR];
    } else {
        NSObject<CDVFileSystem> *fs = [self filesystemForURL:inputURI];
        if (fs == nil) {
            result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:ENCODING_ERR];
        } else {
            result = [fs entryForLocalURI:inputURI];
        }
    }
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

//encode path with percent escapes
-(NSString *)encodePath:(NSString *)path
{
    NSString *decodedPath = [path stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //decode incase it's already encoded to avoid encoding twice
    return [decodedPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}


/* Part of DirectoryEntry interface,  creates or returns the specified directory
 * IN:
 *	NSString* localURI - local filesystem URI for this directory
 *	NSString* path - directory to be created/returned; may be full path or relative path
 *	NSDictionary* - Flags object
 *		boolean as NSNumber create -
 *			if create is true and directory does not exist, create dir and return directory entry
 *			if create is true and exclusive is true and directory does exist, return error
 *			if create is false and directory does not exist, return error
 *			if create is false and the path represents a file, return error
 *		boolean as NSNumber exclusive - used in conjunction with create
 *			if exclusive is true and create is true - specifies failure if directory already exists
 *
 *
 */
- (void)getDirectory:(CDVInvokedUrlCommand*)command
{
    NSMutableArray* arguments = [NSMutableArray arrayWithArray:command.arguments];
    NSMutableDictionary* options = nil;

    if ([arguments count] >= 3) {
        options = [command argumentAtIndex:2 withDefault:nil];
    }
    // add getDir to options and call getFile()
    if (options != nil) {
        options = [NSMutableDictionary dictionaryWithDictionary:options];
    } else {
        options = [NSMutableDictionary dictionaryWithCapacity:1];
    }
    [options setObject:[NSNumber numberWithInt:1] forKey:@"getDir"];
    if ([arguments count] >= 3) {
        [arguments replaceObjectAtIndex:2 withObject:options];
    } else {
        [arguments addObject:options];
    }
    CDVInvokedUrlCommand* subCommand =
        [[CDVInvokedUrlCommand alloc] initWithArguments:arguments
                                             callbackId:command.callbackId
                                              className:command.className
                                             methodName:command.methodName];

    [self getFile:subCommand];
}

/* Part of DirectoryEntry interface,  creates or returns the specified file
 * IN:
 *	NSString* baseURI - local filesytem URI for the base directory to search
 *	NSString* requestedPath - file to be created/returned; may be absolute path or relative path
 *	NSDictionary* options - Flags object
 *		boolean as NSNumber create -
 *			if create is true and file does not exist, create file and return File entry
 *			if create is true and exclusive is true and file does exist, return error
 *			if create is false and file does not exist, return error
 *			if create is false and the path represents a directory, return error
 *		boolean as NSNumber exclusive - used in conjunction with create
 *			if exclusive is true and create is true - specifies failure if file already exists
 */
- (void)getFile:(CDVInvokedUrlCommand*)command
{
    NSString* baseURIstr = [command argumentAtIndex:0];
    CDVFilesystemURL* baseURI = [self fileSystemURLforArg:baseURIstr];
    NSString* requestedPath = [command argumentAtIndex:1];
    NSDictionary* options = [command argumentAtIndex:2 withDefault:nil];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:baseURI];
    CDVPluginResult* result = [fs getFileForURL:baseURI requestedPath:requestedPath options:options];


    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/*
 * Look up the parent Entry containing this Entry.
 * If this Entry is the root of its filesystem, its parent is itself.
 * IN:
 * NSArray* arguments
 *	0 - NSString* localURI
 * NSMutableDictionary* options
 *	empty
 */
- (void)getParent:(CDVInvokedUrlCommand*)command
{
    // arguments are URL encoded
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];
    CDVPluginResult* result = [fs getParentForURL:localURI];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/*
 * set MetaData of entry
 * Currently we only support "com.apple.MobileBackup" (boolean)
 */
- (void)setMetadata:(CDVInvokedUrlCommand*)command
{
    // arguments
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSDictionary* options = [command argumentAtIndex:1 withDefault:nil];
    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];
    CDVPluginResult* result = [fs setMetadataForURL:localURI withObject:options];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/* removes the directory or file entry
 * IN:
 * NSArray* arguments
 *	0 - NSString* localURI
 *
 * returns NO_MODIFICATION_ALLOWED_ERR  if is top level directory or no permission to delete dir
 * returns INVALID_MODIFICATION_ERR if is non-empty dir or asset library file
 * returns NOT_FOUND_ERR if file or dir is not found
*/
- (void)remove:(CDVInvokedUrlCommand*)command
{
    // arguments
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    CDVPluginResult* result = nil;

    if ([localURI.fullPath isEqualToString:@""]) {
        // error if try to remove top level (documents or tmp) dir
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NO_MODIFICATION_ALLOWED_ERR];
    } else {
        NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];
        result = [fs removeFileAtURL:localURI];
    }
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/* recursively removes the directory
 * IN:
 * NSArray* arguments
 *	0 - NSString* localURI
 *
 * returns NO_MODIFICATION_ALLOWED_ERR  if is top level directory or no permission to delete dir
 * returns NOT_FOUND_ERR if file or dir is not found
 */
- (void)removeRecursively:(CDVInvokedUrlCommand*)command
{
    // arguments
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    CDVPluginResult* result = nil;

    if ([localURI.fullPath isEqualToString:@""]) {
        // error if try to remove top level (documents or tmp) dir
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NO_MODIFICATION_ALLOWED_ERR];
    } else {
        NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];
        result = [fs recursiveRemoveFileAtURL:localURI];
    }
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

- (void)copyTo:(CDVInvokedUrlCommand*)command
{
    [self doCopyMove:command isCopy:YES];
}

- (void)moveTo:(CDVInvokedUrlCommand*)command
{
    [self doCopyMove:command isCopy:NO];
}

/* Copy/move a file or directory to a new location
 * IN:
 * NSArray* arguments
 *	0 - NSString* URL of entry to copy
 *  1 - NSString* URL of the directory into which to copy/move the entry
 *  2 - Optionally, the new name of the entry, defaults to the current name
 *	BOOL - bCopy YES if copy, NO if move
 */
- (void)doCopyMove:(CDVInvokedUrlCommand*)command isCopy:(BOOL)bCopy
{
    NSArray* arguments = command.arguments;

    // arguments
    NSString* srcURLstr = [command argumentAtIndex:0];
    NSString* destURLstr = [command argumentAtIndex:1];

    CDVPluginResult *result;

    if (!srcURLstr || !destURLstr) {
        // either no source or no destination provided
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_FOUND_ERR];
        [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        return;
    }

    CDVFilesystemURL* srcURL = [self fileSystemURLforArg:srcURLstr];
    CDVFilesystemURL* destURL = [self fileSystemURLforArg:destURLstr];

    NSObject<CDVFileSystem> *srcFs = [self filesystemForURL:srcURL];
    NSObject<CDVFileSystem> *destFs = [self filesystemForURL:destURL];

    // optional argument; use last component from srcFullPath if new name not provided
    NSString* newName = ([arguments count] > 2) ? [command argumentAtIndex:2] : [srcURL.url lastPathComponent];
    if ([newName rangeOfString:@":"].location != NSNotFound) {
        // invalid chars in new name
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:ENCODING_ERR];
        [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        return;
    }

    __weak CDVFile* weakSelf = self;
    [self.commandDelegate runInBackground:^ {
        [destFs copyFileToURL:destURL withName:newName fromFileSystem:srcFs atURL:srcURL copy:bCopy callback:^(CDVPluginResult* result) {
            [weakSelf.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        }];
    }];

}

- (void)getFileMetadata:(CDVInvokedUrlCommand*)command
{
    // arguments
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];
    __weak CDVFile* weakSelf = self;
    [fs getFileMetadataForURL:localURI callback:^(CDVPluginResult* result) {
        [weakSelf.commandDelegate sendPluginResult:result callbackId:command.callbackId];
    }];
}

- (void)readEntries:(CDVInvokedUrlCommand*)command
{
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];
    CDVPluginResult *result = [fs readEntriesAtURL:localURI];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/* read and return file data
 * IN:
 * NSArray* arguments
 *	0 - NSString* fullPath
 *	1 - NSString* encoding
 *	2 - NSString* start
 *	3 - NSString* end
 */
- (void)readAsText:(CDVInvokedUrlCommand*)command
{
    // arguments
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSString* encoding = [command argumentAtIndex:1];
    NSInteger start = [[command argumentAtIndex:2] integerValue];
    NSInteger end = [[command argumentAtIndex:3] integerValue];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];

    if (fs == nil) {
        CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_FOUND_ERR];
        [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        return;
    }

    // TODO: implement
    if ([@"UTF-8" caseInsensitiveCompare : encoding] != NSOrderedSame) {
        NSLog(@"Only UTF-8 encodings are currently supported by readAsText");
        CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:ENCODING_ERR];
        [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        return;
    }

    __weak CDVFile* weakSelf = self;

    [self.commandDelegate runInBackground:^ {
        [fs readFileAtURL:localURI start:start end:end callback:^(NSData* data, NSString* mimeType, CDVFileError errorCode) {
            CDVPluginResult* result = nil;
            if (data != nil) {
                NSString* str = [[NSString alloc] initWithBytesNoCopy:(void*)[data bytes] length:[data length] encoding:NSUTF8StringEncoding freeWhenDone:NO];
                // Check that UTF8 conversion did not fail.
                if (str != nil) {
                    result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:str];
                    result.associatedObject = data;
                } else {
                    errorCode = ENCODING_ERR;
                }
            }
            if (result == nil) {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
            }

            [weakSelf.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        }];
    }];
}

/* Read content of text file and return as base64 encoded data url.
 * IN:
 * NSArray* arguments
 *	0 - NSString* fullPath
 *	1 - NSString* start
 *	2 - NSString* end
 *
 * Determines the mime type from the file extension, returns ENCODING_ERR if mimetype can not be determined.
 */

- (void)readAsDataURL:(CDVInvokedUrlCommand*)command
{
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSInteger start = [[command argumentAtIndex:1] integerValue];
    NSInteger end = [[command argumentAtIndex:2] integerValue];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];

    __weak CDVFile* weakSelf = self;
    [self.commandDelegate runInBackground:^ {
        [fs readFileAtURL:localURI start:start end:end callback:^(NSData* data, NSString* mimeType, CDVFileError errorCode) {
            CDVPluginResult* result = nil;
            if (data != nil) {
                NSString* b64Str = toBase64(data);
                NSString* output = [NSString stringWithFormat:@"data:%@;base64,%@", mimeType, b64Str];
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:output];
            } else {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
            }

            [weakSelf.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        }];
    }];
}

/* Read content of text file and return as an arraybuffer
 * IN:
 * NSArray* arguments
 *	0 - NSString* fullPath
 *	1 - NSString* start
 *	2 - NSString* end
 */

- (void)readAsArrayBuffer:(CDVInvokedUrlCommand*)command
{
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSInteger start = [[command argumentAtIndex:1] integerValue];
    NSInteger end = [[command argumentAtIndex:2] integerValue];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];

    __weak CDVFile* weakSelf = self;

    [self.commandDelegate runInBackground:^ {
        [fs readFileAtURL:localURI start:start end:end callback:^(NSData* data, NSString* mimeType, CDVFileError errorCode) {
            CDVPluginResult* result = nil;
            if (data != nil) {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArrayBuffer:data];
            } else {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
            }

            [weakSelf.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        }];
    }];
}

- (void)readAsBinaryString:(CDVInvokedUrlCommand*)command
{
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    NSInteger start = [[command argumentAtIndex:1] integerValue];
    NSInteger end = [[command argumentAtIndex:2] integerValue];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];

    __weak CDVFile* weakSelf = self;

    [self.commandDelegate runInBackground:^ {
        [fs readFileAtURL:localURI start:start end:end callback:^(NSData* data, NSString* mimeType, CDVFileError errorCode) {
            CDVPluginResult* result = nil;
            if (data != nil) {
                NSString* payload = [[NSString alloc] initWithBytesNoCopy:(void*)[data bytes] length:[data length] encoding:NSASCIIStringEncoding freeWhenDone:NO];
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:payload];
                result.associatedObject = data;
            } else {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
            }

            [weakSelf.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        }];
    }];
}


- (void)truncate:(CDVInvokedUrlCommand*)command
{
    // arguments
    CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
    unsigned long long pos = (unsigned long long)[[command argumentAtIndex:1] longLongValue];

    NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];
    CDVPluginResult *result = [fs truncateFileAtURL:localURI atPosition:pos];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

/* write
 * IN:
 * NSArray* arguments
 *  0 - NSString* localURI of file to write to
 *  1 - NSString* or NSData* data to write
 *  2 - NSNumber* position to begin writing
 */
- (void)write:(CDVInvokedUrlCommand*)command
{
    __weak CDVFile* weakSelf = self;

    [self.commandDelegate runInBackground:^ {
        NSString* callbackId = command.callbackId;

        // arguments
        CDVFilesystemURL* localURI = [self fileSystemURLforArg:command.arguments[0]];
        id argData = [command argumentAtIndex:1];
        unsigned long long pos = (unsigned long long)[[command argumentAtIndex:2] longLongValue];

        NSObject<CDVFileSystem> *fs = [self filesystemForURL:localURI];


        [fs truncateFileAtURL:localURI atPosition:pos];
        CDVPluginResult *result;
        if ([argData isKindOfClass:[NSString class]]) {
            NSData *encData = [argData dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
            result = [fs writeToFileAtURL:localURI withData:encData append:YES];
        } else if ([argData isKindOfClass:[NSData class]]) {
            result = [fs writeToFileAtURL:localURI withData:argData append:YES];
        } else {
            result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Invalid parameter type"];
        }
        [weakSelf.commandDelegate sendPluginResult:result callbackId:callbackId];
    }];
}

#pragma mark Methods for converting between URLs and paths

- (NSString *)filesystemPathForURL:(CDVFilesystemURL *)localURL
{
    for (NSObject<CDVFileSystem> *fs in self.fileSystems) {
        if ([fs.name isEqualToString:localURL.fileSystemName]) {
            if ([fs respondsToSelector:@selector(filesystemPathForURL:)]) {
                return [fs filesystemPathForURL:localURL];
            }
        }
    }
    return nil;
}

#pragma mark Undocumented Filesystem API

- (void)testFileExists:(CDVInvokedUrlCommand*)command
{
    // arguments
    NSString* argPath = [command argumentAtIndex:0];

    // Get the file manager
    NSFileManager* fMgr = [NSFileManager defaultManager];
    NSString* appFile = argPath; // [ self getFullPath: argPath];

    BOOL bExists = [fMgr fileExistsAtPath:appFile];
    CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:(bExists ? 1 : 0)];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

- (void)testDirectoryExists:(CDVInvokedUrlCommand*)command
{
    // arguments
    NSString* argPath = [command argumentAtIndex:0];

    // Get the file manager
    NSFileManager* fMgr = [[NSFileManager alloc] init];
    NSString* appFile = argPath; // [self getFullPath: argPath];
    BOOL bIsDir = NO;
    BOOL bExists = [fMgr fileExistsAtPath:appFile isDirectory:&bIsDir];

    CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:((bExists && bIsDir) ? 1 : 0)];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

// Returns number of bytes available via callback
- (void)getFreeDiskSpace:(CDVInvokedUrlCommand*)command
{
    // no arguments
    
    NSNumber* pNumAvail = [self checkFreeDiskSpace:self.rootDocsPath];

    NSString* strFreeSpace = [NSString stringWithFormat:@"%qu", [pNumAvail unsignedLongLongValue]];
    // NSLog(@"Free space is %@", strFreeSpace );

    CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:strFreeSpace];

    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

#pragma mark Compatibility with older File API

- (NSString*)getMimeTypeFromPath:(NSString*)fullPath
{
    return [CDVLocalFilesystem getMimeTypeFromPath:fullPath];
}

- (NSDictionary *)getDirectoryEntry:(NSString *)localPath isDirectory:(BOOL)bDirRequest
{
    CDVFilesystemURL *localURL = [self fileSystemURLforLocalPath:localPath];
    return [self makeEntryForPath:localURL.fullPath fileSystemName:localURL.fileSystemName isDirectory:bDirRequest];
}

#pragma mark Internal methods for testing
// Internal methods for testing: Get the on-disk location of a local filesystem url.
// [Currently used for testing file-transfer]

- (void)_getLocalFilesystemPath:(CDVInvokedUrlCommand*)command
{
    CDVFilesystemURL* localURL = [self fileSystemURLforArg:command.arguments[0]];

    NSString* fsPath = [self filesystemPathForURL:localURL];
    CDVPluginResult* result;
    if (fsPath) {
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:fsPath];
    } else {
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Cannot resolve URL to a file"];
    }
    [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}

@end
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
 */

#import "CDVFile.h"

@interface CDVLocalFilesystem : NSObject<CDVFileSystem> {
    NSString *_name;
    NSString *_fsRoot;
}

- (id) initWithName:(NSString *)name root:(NSString *)fsRoot;
+ (NSString*)getMimeTypeFromPath:(NSString*)fullPath;

@property (nonatomic,strong) NSString *fsRoot;

@end
/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
 */

#import "CDVFile.h"
#import "CDVLocalFilesystem.h"
#import <Cordova/CDV.h>
#import <MobileCoreServices/MobileCoreServices.h>
#import <sys/xattr.h>

@implementation CDVLocalFilesystem
@synthesize name=_name, fsRoot=_fsRoot, urlTransformer;

- (id) initWithName:(NSString *)name root:(NSString *)fsRoot
{
    if (self) {
        self.name = name;
        self.fsRoot = fsRoot;
    }
    return self;
}

/*
 * IN
 *  NSString localURI
 * OUT
 *  CDVPluginResult result containing a file or directoryEntry for the localURI, or an error if the
 *   URI represents a non-existent path, or is unrecognized or otherwise malformed.
 */
- (CDVPluginResult *)entryForLocalURI:(CDVFilesystemURL *)url
{
    CDVPluginResult* result = nil;
    NSDictionary* entry = [self makeEntryForLocalURL:url];
    if (entry) {
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:entry];
    } else {
        // return NOT_FOUND_ERR
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_FOUND_ERR];
    }
    return result;
}
- (NSDictionary *)makeEntryForLocalURL:(CDVFilesystemURL *)url {
    NSString *path = [self filesystemPathForURL:url];
    NSFileManager* fileMgr = [[NSFileManager alloc] init];
    BOOL isDir = NO;
    // see if exists and is file or dir
    BOOL bExists = [fileMgr fileExistsAtPath:path isDirectory:&isDir];
    if (bExists) {
        return [self makeEntryForPath:url.fullPath isDirectory:isDir];
    } else {
        return nil;
    }
}
- (NSDictionary*)makeEntryForPath:(NSString*)fullPath isDirectory:(BOOL)isDir
{
    NSMutableDictionary* dirEntry = [NSMutableDictionary dictionaryWithCapacity:5];
    NSString* lastPart = [[self stripQueryParametersFromPath:fullPath] lastPathComponent];
    if (isDir && ![fullPath hasSuffix:@"/"]) {
        fullPath = [fullPath stringByAppendingString:@"/"];
    }
    [dirEntry setObject:[NSNumber numberWithBool:!isDir]  forKey:@"isFile"];
    [dirEntry setObject:[NSNumber numberWithBool:isDir]  forKey:@"isDirectory"];
    [dirEntry setObject:fullPath forKey:@"fullPath"];
    [dirEntry setObject:lastPart forKey:@"name"];
    [dirEntry setObject:self.name forKey: @"filesystemName"];

    NSURL* nativeURL = [NSURL fileURLWithPath:[self filesystemPathForFullPath:fullPath]];
    if (self.urlTransformer) {
        nativeURL = self.urlTransformer(nativeURL);
    }

    dirEntry[@"nativeURL"] = [nativeURL absoluteString];

    return dirEntry;
}

- (NSString *)stripQueryParametersFromPath:(NSString *)fullPath
{
    NSRange questionMark = [fullPath rangeOfString:@"?"];
    if (questionMark.location != NSNotFound) {
        return [fullPath substringWithRange:NSMakeRange(0,questionMark.location)];
    }
    return fullPath;
}

- (NSString *)filesystemPathForFullPath:(NSString *)fullPath
{
    NSString *path = nil;
    NSString *strippedFullPath = [self stripQueryParametersFromPath:fullPath];
    path = [NSString stringWithFormat:@"%@%@", self.fsRoot, strippedFullPath];
    if ([path length] > 1 && [path hasSuffix:@"/"]) {
      path = [path substringToIndex:([path length]-1)];
    }
    return path;
}
/*
 * IN
 *  NSString localURI
 * OUT
 *  NSString full local filesystem path for the represented file or directory, or nil if no such path is possible
 *  The file or directory does not necessarily have to exist. nil is returned if the filesystem type is not recognized,
 *  or if the URL is malformed.
 * The incoming URI should be properly escaped (no raw spaces, etc. URI percent-encoding is expected).
 */
- (NSString *)filesystemPathForURL:(CDVFilesystemURL *)url
{
    return [self filesystemPathForFullPath:url.fullPath];
}

- (CDVFilesystemURL *)URLforFullPath:(NSString *)fullPath
{
    if (fullPath) {
        NSString* escapedPath = [fullPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        if ([fullPath hasPrefix:@"/"]) {
            return [CDVFilesystemURL fileSystemURLWithString:[NSString stringWithFormat:@"%@://localhost/%@%@", kCDVFilesystemURLPrefix, self.name, escapedPath]];
        }
        return [CDVFilesystemURL fileSystemURLWithString:[NSString stringWithFormat:@"%@://localhost/%@/%@", kCDVFilesystemURLPrefix, self.name, escapedPath]];
    }
    return nil;
}

- (CDVFilesystemURL *)URLforFilesystemPath:(NSString *)path
{
    return [self URLforFullPath:[self fullPathForFileSystemPath:path]];

}

- (NSString *)normalizePath:(NSString *)rawPath
{
    // If this is an absolute path, the first path component will be '/'. Skip it if that's the case
    BOOL isAbsolutePath = [rawPath hasPrefix:@"/"];
    if (isAbsolutePath) {
        rawPath = [rawPath substringFromIndex:1];
    }
    NSMutableArray *components = [NSMutableArray arrayWithArray:[rawPath pathComponents]];
    for (int index = 0; index < [components count]; ++index) {
        if ([[components objectAtIndex:index] isEqualToString:@".."]) {
            [components removeObjectAtIndex:index];
            if (index > 0) {
                [components removeObjectAtIndex:index-1];
                --index;
            }
        }
    }

    if (isAbsolutePath) {
        return [NSString stringWithFormat:@"/%@", [components componentsJoinedByString:@"/"]];
    } else {
        return [components componentsJoinedByString:@"/"];
    }


}

- (BOOL)valueForKeyIsNumber:(NSDictionary*)dict key:(NSString*)key
{
    BOOL bNumber = NO;
    NSObject* value = dict[key];
    if (value) {
        bNumber = [value isKindOfClass:[NSNumber class]];
    }
    return bNumber;
}

- (CDVPluginResult *)getFileForURL:(CDVFilesystemURL *)baseURI requestedPath:(NSString *)requestedPath options:(NSDictionary *)options
{
    CDVPluginResult* result = nil;
    BOOL bDirRequest = NO;
    BOOL create = NO;
    BOOL exclusive = NO;
    int errorCode = 0;  // !!! risky - no error code currently defined for 0

    if ([self valueForKeyIsNumber:options key:@"create"]) {
        create = [(NSNumber*)[options valueForKey:@"create"] boolValue];
    }
    if ([self valueForKeyIsNumber:options key:@"exclusive"]) {
        exclusive = [(NSNumber*)[options valueForKey:@"exclusive"] boolValue];
    }
    if ([self valueForKeyIsNumber:options key:@"getDir"]) {
        // this will not exist for calls directly to getFile but will have been set by getDirectory before calling this method
        bDirRequest = [(NSNumber*)[options valueForKey:@"getDir"] boolValue];
    }
    // see if the requested path has invalid characters - should we be checking for  more than just ":"?
    if ([requestedPath rangeOfString:@":"].location != NSNotFound) {
        errorCode = ENCODING_ERR;
    } else {
        // Build new fullPath for the requested resource.
        // We concatenate the two paths together, and then scan the resulting string to remove
        // parent ("..") references. Any parent references at the beginning of the string are
        // silently removed.
        NSString *combinedPath = [baseURI.fullPath stringByAppendingPathComponent:requestedPath];
        combinedPath = [self normalizePath:combinedPath];
        CDVFilesystemURL* requestedURL = [self URLforFullPath:combinedPath];

        NSFileManager* fileMgr = [[NSFileManager alloc] init];
        BOOL bIsDir;
        BOOL bExists = [fileMgr fileExistsAtPath:[self filesystemPathForURL:requestedURL] isDirectory:&bIsDir];
        if (bExists && (create == NO) && (bIsDir == !bDirRequest)) {
            // path exists and is not of requested type  - return TYPE_MISMATCH_ERR
            errorCode = TYPE_MISMATCH_ERR;
        } else if (!bExists && (create == NO)) {
            // path does not exist and create is false - return NOT_FOUND_ERR
            errorCode = NOT_FOUND_ERR;
        } else if (bExists && (create == YES) && (exclusive == YES)) {
            // file/dir already exists and exclusive and create are both true - return PATH_EXISTS_ERR
            errorCode = PATH_EXISTS_ERR;
        } else {
            // if bExists and create == YES - just return data
            // if bExists and create == NO  - just return data
            // if !bExists and create == YES - create and return data
            BOOL bSuccess = YES;
            NSError __autoreleasing* pError = nil;
            if (!bExists && (create == YES)) {
                if (bDirRequest) {
                    // create the dir
                    bSuccess = [fileMgr createDirectoryAtPath:[self filesystemPathForURL:requestedURL] withIntermediateDirectories:NO attributes:nil error:&pError];
                } else {
                    // create the empty file
                    bSuccess = [fileMgr createFileAtPath:[self filesystemPathForURL:requestedURL] contents:nil attributes:nil];
                }
            }
            if (!bSuccess) {
                errorCode = ABORT_ERR;
                if (pError) {
                    NSLog(@"error creating directory: %@", [pError localizedDescription]);
                }
            } else {
                // NSLog(@"newly created file/dir (%@) exists: %d", reqFullPath, [fileMgr fileExistsAtPath:reqFullPath]);
                // file existed or was created
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:[self makeEntryForPath:requestedURL.fullPath isDirectory:bDirRequest]];
            }
        } // are all possible conditions met?
    }

    if (errorCode > 0) {
        // create error callback
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
    }
    return result;

}

- (CDVPluginResult*)getParentForURL:(CDVFilesystemURL *)localURI
{
    CDVPluginResult* result = nil;
    CDVFilesystemURL *newURI = nil;
    if ([localURI.fullPath isEqualToString:@""]) {
        // return self
        newURI = localURI;
    } else {
        newURI = [CDVFilesystemURL fileSystemURLWithURL:[localURI.url URLByDeletingLastPathComponent]]; /* TODO: UGLY - FIX */
    }
    NSFileManager* fileMgr = [[NSFileManager alloc] init];
    BOOL bIsDir;
    BOOL bExists = [fileMgr fileExistsAtPath:[self filesystemPathForURL:newURI] isDirectory:&bIsDir];
    if (bExists) {
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:[self makeEntryForPath:newURI.fullPath isDirectory:bIsDir]];
    } else {
        // invalid path or file does not exist
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_FOUND_ERR];
    }
    return result;
}

- (CDVPluginResult*)setMetadataForURL:(CDVFilesystemURL *)localURI withObject:(NSDictionary *)options
{
    BOOL ok = NO;

    NSString* filePath = [self filesystemPathForURL:localURI];
    // we only care about this iCloud key for now.
    // set to 1/true to skip backup, set to 0/false to back it up (effectively removing the attribute)
    NSString* iCloudBackupExtendedAttributeKey = @"com.apple.MobileBackup";
    id iCloudBackupExtendedAttributeValue = [options objectForKey:iCloudBackupExtendedAttributeKey];

    if ((iCloudBackupExtendedAttributeValue != nil) && [iCloudBackupExtendedAttributeValue isKindOfClass:[NSNumber class]]) {
        if (IsAtLeastiOSVersion(@"5.1")) {
            NSURL* url = [NSURL fileURLWithPath:filePath];
            NSError* __autoreleasing error = nil;

            ok = [url setResourceValue:[NSNumber numberWithBool:[iCloudBackupExtendedAttributeValue boolValue]] forKey:NSURLIsExcludedFromBackupKey error:&error];
        } else { // below 5.1 (deprecated - only really supported in 5.01)
            u_int8_t value = [iCloudBackupExtendedAttributeValue intValue];
            if (value == 0) { // remove the attribute (allow backup, the default)
                ok = (removexattr([filePath fileSystemRepresentation], [iCloudBackupExtendedAttributeKey cStringUsingEncoding:NSUTF8StringEncoding], 0) == 0);
            } else { // set the attribute (skip backup)
                ok = (setxattr([filePath fileSystemRepresentation], [iCloudBackupExtendedAttributeKey cStringUsingEncoding:NSUTF8StringEncoding], &value, sizeof(value), 0, 0) == 0);
            }
        }
    }

    if (ok) {
        return [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
    } else {
        return [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
    }
}

/* remove the file or directory (recursively)
 * IN:
 * NSString* fullPath - the full path to the file or directory to be removed
 * NSString* callbackId
 * called from remove and removeRecursively - check all pubic api specific error conditions (dir not empty, etc) before calling
 */

- (CDVPluginResult*)doRemove:(NSString*)fullPath
{
    CDVPluginResult* result = nil;
    BOOL bSuccess = NO;
    NSError* __autoreleasing pError = nil;
    NSFileManager* fileMgr = [[NSFileManager alloc] init];

    @try {
        bSuccess = [fileMgr removeItemAtPath:fullPath error:&pError];
        if (bSuccess) {
            result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
        } else {
            // see if we can give a useful error
            CDVFileError errorCode = ABORT_ERR;
            NSLog(@"error removing filesystem entry at %@: %@", fullPath, [pError localizedDescription]);
            if ([pError code] == NSFileNoSuchFileError) {
                errorCode = NOT_FOUND_ERR;
            } else if ([pError code] == NSFileWriteNoPermissionError) {
                errorCode = NO_MODIFICATION_ALLOWED_ERR;
            }

            result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
        }
    } @catch(NSException* e) {  // NSInvalidArgumentException if path is . or ..
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:SYNTAX_ERR];
    }

    return result;
}

- (CDVPluginResult *)removeFileAtURL:(CDVFilesystemURL *)localURI
{
    NSString *fileSystemPath = [self filesystemPathForURL:localURI];

    NSFileManager* fileMgr = [[NSFileManager alloc] init];
    BOOL bIsDir = NO;
    BOOL bExists = [fileMgr fileExistsAtPath:fileSystemPath isDirectory:&bIsDir];
    if (!bExists) {
        return [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_FOUND_ERR];
    }
    if (bIsDir && ([[fileMgr contentsOfDirectoryAtPath:fileSystemPath error:nil] count] != 0)) {
        // dir is not empty
        return [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:INVALID_MODIFICATION_ERR];
    }
    return [self doRemove:fileSystemPath];
}

- (CDVPluginResult *)recursiveRemoveFileAtURL:(CDVFilesystemURL *)localURI
{
    NSString *fileSystemPath = [self filesystemPathForURL:localURI];
    return [self doRemove:fileSystemPath];
}

/*
 * IN
 *  NSString localURI
 * OUT
 *  NSString full local filesystem path for the represented file or directory, or nil if no such path is possible
 *  The file or directory does not necessarily have to exist. nil is returned if the filesystem type is not recognized,
 *  or if the URL is malformed.
 * The incoming URI should be properly escaped (no raw spaces, etc. URI percent-encoding is expected).
 */
- (NSString *)fullPathForFileSystemPath:(NSString *)fsPath
{
    if ([fsPath hasPrefix:self.fsRoot]) {
        return [fsPath substringFromIndex:[self.fsRoot length]];
    }
    return nil;
}


- (CDVPluginResult *)readEntriesAtURL:(CDVFilesystemURL *)localURI
{
    NSFileManager* fileMgr = [[NSFileManager alloc] init];
    NSError* __autoreleasing error = nil;
    NSString *fileSystemPath = [self filesystemPathForURL:localURI];

    NSArray* contents = [fileMgr contentsOfDirectoryAtPath:fileSystemPath error:&error];

    if (contents) {
        NSMutableArray* entries = [NSMutableArray arrayWithCapacity:1];
        if ([contents count] > 0) {
            // create an Entry (as JSON) for each file/dir
            for (NSString* name in contents) {
                // see if is dir or file
                NSString* entryPath = [fileSystemPath stringByAppendingPathComponent:name];
                BOOL bIsDir = NO;
                [fileMgr fileExistsAtPath:entryPath isDirectory:&bIsDir];
                NSDictionary* entryDict = [self makeEntryForPath:[self fullPathForFileSystemPath:entryPath] isDirectory:bIsDir];
                [entries addObject:entryDict];
            }
        }
        return [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray:entries];
    } else {
        // assume not found but could check error for more specific error conditions
        return [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:NOT_FOUND_ERR];
    }
}

- (unsigned long long)truncateFile:(NSString*)filePath atPosition:(unsigned long long)pos
{
    unsigned long long newPos = 0UL;

    NSFileHandle* file = [NSFileHandle fileHandleForWritingAtPath:filePath];

    if (file) {
        [file truncateFileAtOffset:(unsigned long long)pos];
        newPos = [file offsetInFile];
        [file synchronizeFile];
        [file closeFile];
    }
    return newPos;
}

- (CDVPluginResult *)truncateFileAtURL:(CDVFilesystemURL *)localURI atPosition:(unsigned long long)pos
{
    unsigned long long newPos = [self truncateFile:[self filesystemPathForURL:localURI] atPosition:pos];
    return [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:(int)newPos];
}

- (CDVPluginResult *)writeToFileAtURL:(CDVFilesystemURL *)localURL withData:(NSData*)encData append:(BOOL)shouldAppend
{
    NSString *filePath = [self filesystemPathForURL:localURL];

    CDVPluginResult* result = nil;
    CDVFileError errCode = INVALID_MODIFICATION_ERR;
    int bytesWritten = 0;

    if (filePath) {
        NSOutputStream* fileStream = [NSOutputStream outputStreamToFileAtPath:filePath append:shouldAppend];
        if (fileStream) {
            NSUInteger len = [encData length];
            if (len == 0) {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:(double)len];
            } else {
                [fileStream open];

                bytesWritten = (int)[fileStream write:[encData bytes] maxLength:len];

                [fileStream close];
                if (bytesWritten > 0) {
                    result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:bytesWritten];
                    // } else {
                    // can probably get more detailed error info via [fileStream streamError]
                    // errCode already set to INVALID_MODIFICATION_ERR;
                    // bytesWritten = 0; // may be set to -1 on error
                }
            }
        } // else fileStream not created return INVALID_MODIFICATION_ERR
    } else {
        // invalid filePath
        errCode = NOT_FOUND_ERR;
    }
    if (!result) {
        // was an error
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errCode];
    }
    return result;
}

/**
 * Helper function to check to see if the user attempted to copy an entry into its parent without changing its name,
 * or attempted to copy a directory into a directory that it contains directly or indirectly.
 *
 * IN:
 *  NSString* srcDir
 *  NSString* destinationDir
 * OUT:
 *  YES copy/ move is allows
 *  NO move is onto itself
 */
- (BOOL)canCopyMoveSrc:(NSString*)src ToDestination:(NSString*)dest
{
    // This weird test is to determine if we are copying or moving a directory into itself.
    // Copy /Documents/myDir to /Documents/myDir-backup is okay but
    // Copy /Documents/myDir to /Documents/myDir/backup not okay
    BOOL copyOK = YES;
    NSRange range = [dest rangeOfString:src];

    if (range.location != NSNotFound) {
        NSRange testRange = {range.length - 1, ([dest length] - range.length)};
        NSRange resultRange = [dest rangeOfString:@"/" options:0 range:testRange];
        if (resultRange.location != NSNotFound) {
            copyOK = NO;
        }
    }
    return copyOK;
}

- (void)copyFileToURL:(CDVFilesystemURL *)destURL withName:(NSString *)newName fromFileSystem:(NSObject<CDVFileSystem> *)srcFs atURL:(CDVFilesystemURL *)srcURL copy:(BOOL)bCopy callback:(void (^)(CDVPluginResult *))callback
{
    NSFileManager *fileMgr = [[NSFileManager alloc] init];
    NSString *destRootPath = [self filesystemPathForURL:destURL];
    BOOL bDestIsDir = NO;
    BOOL bDestExists = [fileMgr fileExistsAtPath:destRootPath isDirectory:&bDestIsDir];

    NSString *newFileSystemPath = [destRootPath stringByAppendingPathComponent:newName];
    NSString *newFullPath = [self fullPathForFileSystemPath:newFileSystemPath];

    BOOL bNewIsDir = NO;
    BOOL bNewExists = [fileMgr fileExistsAtPath:newFileSystemPath isDirectory:&bNewIsDir];

    CDVPluginResult *result = nil;
    int errCode = 0;

    if (!bDestExists) {
        // the destination root does not exist
        errCode = NOT_FOUND_ERR;
    }

    else if ([srcFs isKindOfClass:[CDVLocalFilesystem class]]) {
        /* Same FS, we can shortcut with NSFileManager operations */
        NSString *srcFullPath = [srcFs filesystemPathForURL:srcURL];

        BOOL bSrcIsDir = NO;
        BOOL bSrcExists = [fileMgr fileExistsAtPath:srcFullPath isDirectory:&bSrcIsDir];

        if (!bSrcExists) {
            // the source does not exist
            errCode = NOT_FOUND_ERR;
        } else if ([newFileSystemPath isEqualToString:srcFullPath]) {
            // source and destination can not be the same
            errCode = INVALID_MODIFICATION_ERR;
        } else if (bSrcIsDir && (bNewExists && !bNewIsDir)) {
            // can't copy/move dir to file
            errCode = INVALID_MODIFICATION_ERR;
        } else { // no errors yet
            NSError* __autoreleasing error = nil;
            BOOL bSuccess = NO;
            if (bCopy) {
                if (bSrcIsDir && ![self canCopyMoveSrc:srcFullPath ToDestination:newFileSystemPath]) {
                    // can't copy dir into self
                    errCode = INVALID_MODIFICATION_ERR;
                } else if (bNewExists) {
                    // the full destination should NOT already exist if a copy
                    errCode = PATH_EXISTS_ERR;
                } else {
                    bSuccess = [fileMgr copyItemAtPath:srcFullPath toPath:newFileSystemPath error:&error];
                }
            } else { // move
                // iOS requires that destination must not exist before calling moveTo
                // is W3C INVALID_MODIFICATION_ERR error if destination dir exists and has contents
                //
                if (!bSrcIsDir && (bNewExists && bNewIsDir)) {
                    // can't move a file to directory
                    errCode = INVALID_MODIFICATION_ERR;
                } else if (bSrcIsDir && ![self canCopyMoveSrc:srcFullPath ToDestination:newFileSystemPath]) {
                    // can't move a dir into itself
                    errCode = INVALID_MODIFICATION_ERR;
                } else if (bNewExists) {
                    if (bNewIsDir && ([[fileMgr contentsOfDirectoryAtPath:newFileSystemPath error:NULL] count] != 0)) {
                        // can't move dir to a dir that is not empty
                        errCode = INVALID_MODIFICATION_ERR;
                        newFileSystemPath = nil;  // so we won't try to move
                    } else {
                        // remove destination so can perform the moveItemAtPath
                        bSuccess = [fileMgr removeItemAtPath:newFileSystemPath error:NULL];
                        if (!bSuccess) {
                            errCode = INVALID_MODIFICATION_ERR; // is this the correct error?
                            newFileSystemPath = nil;
                        }
                    }
                } else if (bNewIsDir && [newFileSystemPath hasPrefix:srcFullPath]) {
                    // can't move a directory inside itself or to any child at any depth;
                    errCode = INVALID_MODIFICATION_ERR;
                    newFileSystemPath = nil;
                }

                if (newFileSystemPath != nil) {
                    bSuccess = [fileMgr moveItemAtPath:srcFullPath toPath:newFileSystemPath error:&error];
                }
            }
            if (bSuccess) {
                // should verify it is there and of the correct type???
                NSDictionary* newEntry = [self makeEntryForPath:newFullPath isDirectory:bSrcIsDir];
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:newEntry];
            } else {
                if (error) {
                    if (([error code] == NSFileReadUnknownError) || ([error code] == NSFileReadTooLargeError)) {
                        errCode = NOT_READABLE_ERR;
                    } else if ([error code] == NSFileWriteOutOfSpaceError) {
                        errCode = QUOTA_EXCEEDED_ERR;
                    } else if ([error code] == NSFileWriteNoPermissionError) {
                        errCode = NO_MODIFICATION_ALLOWED_ERR;
                    }
                }
            }
        }
    } else {
        // Need to copy the hard way
        [srcFs readFileAtURL:srcURL start:0 end:-1 callback:^(NSData* data, NSString* mimeType, CDVFileError errorCode) {
            CDVPluginResult* result = nil;
            if (data != nil) {
                BOOL bSuccess = [data writeToFile:newFileSystemPath atomically:YES];
                if (bSuccess) {
                    // should verify it is there and of the correct type???
                    NSDictionary* newEntry = [self makeEntryForPath:newFullPath isDirectory:NO];
                    result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:newEntry];
                } else {
                    result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:ABORT_ERR];
                }
            } else {
                result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errorCode];
            }
            callback(result);
        }];
        return; // Async IO; return without callback.
    }
    if (result == nil) {
        if (!errCode) {
            errCode = INVALID_MODIFICATION_ERR; // Catch-all default
        }
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsInt:errCode];
    }
    callback(result);
}

/* helper function to get the mimeType from the file extension
 * IN:
 *	NSString* fullPath - filename (may include path)
 * OUT:
 *	NSString* the mime type as type/subtype.  nil if not able to determine
 */
+ (NSString*)getMimeTypeFromPath:(NSString*)fullPath
{
    NSString* mimeType = nil;

    if (fullPath) {
        CFStringRef typeId = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)[fullPath pathExtension], NULL);
        if (typeId) {
            mimeType = (__bridge_transfer NSString*)UTTypeCopyPreferredTagWithClass(typeId, kUTTagClassMIMEType);
            if (!mimeType) {
                // special case for m4a
                if ([(__bridge NSString*)typeId rangeOfString : @"m4a-audio"].location != NSNotFound) {
                    mimeType = @"audio/mp4";
                } else if ([[fullPath pathExtension] rangeOfString:@"wav"].location != NSNotFound) {
                    mimeType = @"audio/wav";
                } else if ([[fullPath pathExtension] rangeOfString:@"css"].location != NSNotFound) {
                    mimeType = @"text/css";
                }
            }
            CFRelease(typeId);
        }
    }
    return mimeType;
}

- (void)readFileAtURL:(CDVFilesystemURL *)localURL start:(NSInteger)start end:(NSInteger)end callback:(void (^)(NSData*, NSString* mimeType, CDVFileError))callback
{
    NSString *path = [self filesystemPathForURL:localURL];

    NSString* mimeType = [CDVLocalFilesystem getMimeTypeFromPath:path];
    if (mimeType == nil) {
        mimeType = @"*/*";
    }
    NSFileHandle* file = [NSFileHandle fileHandleForReadingAtPath:path];
    if (start > 0) {
        [file seekToFileOffset:start];
    }

    NSData* readData;
    if (end < 0) {
        readData = [file readDataToEndOfFile];
    } else {
        readData = [file readDataOfLength:(end - start)];
    }
    [file closeFile];

    callback(readData, mimeType, readData != nil ? NO_ERROR : NOT_FOUND_ERR);
}

- (void)getFileMetadataForURL:(CDVFilesystemURL *)localURL callback:(void (^)(CDVPluginResult *))callback
{
    NSString *path = [self filesystemPathForURL:localURL];
    CDVPluginResult *result;
    NSFileManager* fileMgr = [[NSFileManager alloc] init];

    NSError* __autoreleasing error = nil;
    NSDictionary* fileAttrs = [fileMgr attributesOfItemAtPath:path error:&error];

    if (fileAttrs) {

        // create dictionary of file info
        NSMutableDictionary* fileInfo = [NSMutableDictionary dictionaryWithCapacity:5];

        [fileInfo setObject:localURL.fullPath forKey:@"fullPath"];
        [fileInfo setObject:[self mimeTypeForFileAtPath: path] forKey:@"type"];
        [fileInfo setObject:[path lastPathComponent] forKey:@"name"];

        // Ensure that directories (and other non-regular files) report size of 0
        unsigned long long size = ([fileAttrs fileType] == NSFileTypeRegular ? [fileAttrs fileSize] : 0);
        [fileInfo setObject:[NSNumber numberWithUnsignedLongLong:size] forKey:@"size"];

        NSDate* modDate = [fileAttrs fileModificationDate];
        if (modDate) {
            [fileInfo setObject:[NSNumber numberWithDouble:[modDate timeIntervalSince1970] * 1000] forKey:@"lastModifiedDate"];
        }

        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:fileInfo];

    } else {
        // didn't get fileAttribs
        CDVFileError errorCode = ABORT_ERR;
        NSLog(@"error getting metadata: %@", [error localizedDescription]);
        if ([error code] == NSFileNoSuchFileError || [error code] == NSFileReadNoSuchFileError) {
            errorCode = NOT_FOUND_ERR;
        }
        // log [NSNumber numberWithDouble: theMessage] objCtype to see what it returns
        result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:errorCode];
    }

    callback(result);
}

// fix errors that base on Alexsander Akers from http://stackoverflow.com/a/5998683/2613194
- (NSString*) mimeTypeForFileAtPath: (NSString *) path {
    if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
        return nil;
    }
    
    CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)[path pathExtension], NULL);
    CFStringRef mimeType = UTTypeCopyPreferredTagWithClass (UTI, kUTTagClassMIMEType);
    CFRelease(UTI);
    
    if (!mimeType) {
        return @"application/octet-stream";
    }
    return (__bridge NSString *)mimeType;
}

@end
/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */
(function () {
    /* global require, exports, module */
    /* global FILESYSTEM_PREFIX */
    /* global IDBKeyRange */
    /* global FileReader */
    /* global atob, btoa, Blob */

    /* Heavily based on https://github.com/ebidel/idb.filesystem.js */

    // For chrome we don't need to implement proxy methods
    // All functionality can be accessed natively.
    if (require('./isChrome')()) {
        var pathsPrefix = {
            // Read-only directory where the application is installed.
            applicationDirectory: location.origin + '/', // eslint-disable-line no-undef
            // Where to put app-specific data files.
            dataDirectory: 'filesystem:file:///persistent/',
            // Cached files that should survive app restarts.
            // Apps should not rely on the OS to delete files in here.
            cacheDirectory: 'filesystem:file:///temporary/'
        };

        exports.requestAllPaths = function (successCallback) {
            successCallback(pathsPrefix);
        };

        require('cordova/exec/proxy').add('File', module.exports);
        return;
    }

    var LocalFileSystem = require('./LocalFileSystem');
    var FileSystem = require('./FileSystem');
    var FileEntry = require('./FileEntry');
    var FileError = require('./FileError');
    var DirectoryEntry = require('./DirectoryEntry');
    var File = require('./File');

    (function (exports, global) {
        var indexedDB = global.indexedDB || global.mozIndexedDB;
        if (!indexedDB) {
            throw 'Firefox OS File plugin: indexedDB not supported';
        }

        var fs_ = null;

        var idb_ = {};
        idb_.db = null;
        var FILE_STORE_ = 'entries';

        var DIR_SEPARATOR = '/';

        var pathsPrefix = {
            // Read-only directory where the application is installed.
            applicationDirectory: location.origin + '/', // eslint-disable-line no-undef
            // Where to put app-specific data files.
            dataDirectory: 'file:///persistent/',
            // Cached files that should survive app restarts.
            // Apps should not rely on the OS to delete files in here.
            cacheDirectory: 'file:///temporary/'
        };

        var unicodeLastChar = 65535;

    /** * Exported functionality ***/

        exports.requestFileSystem = function (successCallback, errorCallback, args) {
            var type = args[0];
            // Size is ignored since IDB filesystem size depends
            // on browser implementation and can't be set up by user
            var size = args[1]; // eslint-disable-line no-unused-vars

            if (type !== LocalFileSystem.TEMPORARY && type !== LocalFileSystem.PERSISTENT) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }
                return;
            }

            var name = type === LocalFileSystem.TEMPORARY ? 'temporary' : 'persistent';
            var storageName = (location.protocol + location.host).replace(/:/g, '_'); // eslint-disable-line no-undef

            var root = new DirectoryEntry('', DIR_SEPARATOR);
            fs_ = new FileSystem(name, root);

            idb_.open(storageName, function () {
                successCallback(fs_);
            }, errorCallback);
        };

        // Overridden by Android, BlackBerry 10 and iOS to populate fsMap
        require('./fileSystems').getFs = function (name, callback) {
            callback(new FileSystem(name, fs_.root));
        };

        // list a directory's contents (files and folders).
        exports.readEntries = function (successCallback, errorCallback, args) {
            var fullPath = args[0];

            if (typeof successCallback !== 'function') {
                throw Error('Expected successCallback argument.');
            }

            var path = resolveToFullPath_(fullPath);

            exports.getDirectory(function () {
                idb_.getAllEntries(path.fullPath + DIR_SEPARATOR, path.storagePath, function (entries) {
                    successCallback(entries);
                }, errorCallback);
            }, function () {
                if (errorCallback) {
                    errorCallback(FileError.NOT_FOUND_ERR);
                }
            }, [path.storagePath, path.fullPath, {create: false}]);
        };

        exports.getFile = function (successCallback, errorCallback, args) {
            var fullPath = args[0];
            var path = args[1];
            var options = args[2] || {};

            // Create an absolute path if we were handed a relative one.
            path = resolveToFullPath_(fullPath, path);

            idb_.get(path.storagePath, function (fileEntry) {
                if (options.create === true && options.exclusive === true && fileEntry) {
                    // If create and exclusive are both true, and the path already exists,
                    // getFile must fail.

                    if (errorCallback) {
                        errorCallback(FileError.PATH_EXISTS_ERR);
                    }
                } else if (options.create === true && !fileEntry) {
                    // If create is true, the path doesn't exist, and no other error occurs,
                    // getFile must create it as a zero-length file and return a corresponding
                    // FileEntry.
                    var newFileEntry = new FileEntry(path.fileName, path.fullPath, new FileSystem(path.fsName, fs_.root));

                    newFileEntry.file_ = new MyFile({
                        size: 0,
                        name: newFileEntry.name,
                        lastModifiedDate: new Date(),
                        storagePath: path.storagePath
                    });

                    idb_.put(newFileEntry, path.storagePath, successCallback, errorCallback);
                } else if (options.create === true && fileEntry) {
                    if (fileEntry.isFile) {
                        // Overwrite file, delete then create new.
                        idb_['delete'](path.storagePath, function () {
                            var newFileEntry = new FileEntry(path.fileName, path.fullPath, new FileSystem(path.fsName, fs_.root));

                            newFileEntry.file_ = new MyFile({
                                size: 0,
                                name: newFileEntry.name,
                                lastModifiedDate: new Date(),
                                storagePath: path.storagePath
                            });

                            idb_.put(newFileEntry, path.storagePath, successCallback, errorCallback);
                        }, errorCallback);
                    } else {
                        if (errorCallback) {
                            errorCallback(FileError.INVALID_MODIFICATION_ERR);
                        }
                    }
                } else if ((!options.create || options.create === false) && !fileEntry) {
                    // If create is not true and the path doesn't exist, getFile must fail.
                    if (errorCallback) {
                        errorCallback(FileError.NOT_FOUND_ERR);
                    }
                } else if ((!options.create || options.create === false) && fileEntry &&
                    fileEntry.isDirectory) {
                    // If create is not true and the path exists, but is a directory, getFile
                    // must fail.
                    if (errorCallback) {
                        errorCallback(FileError.TYPE_MISMATCH_ERR);
                    }
                } else {
                    // Otherwise, if no other error occurs, getFile must return a FileEntry
                    // corresponding to path.

                    successCallback(fileEntryFromIdbEntry(fileEntry));
                }
            }, errorCallback);
        };

        exports.getFileMetadata = function (successCallback, errorCallback, args) {
            var fullPath = args[0];

            exports.getFile(function (fileEntry) {
                successCallback(new File(fileEntry.file_.name, fileEntry.fullPath, '', fileEntry.file_.lastModifiedDate,
                    fileEntry.file_.size));
            }, errorCallback, [fullPath, null]);
        };

        exports.getMetadata = function (successCallback, errorCallback, args) {
            exports.getFile(function (fileEntry) {
                successCallback(
                    {
                        modificationTime: fileEntry.file_.lastModifiedDate,
                        size: fileEntry.file_.lastModifiedDate
                    });
            }, errorCallback, args);
        };

        exports.setMetadata = function (successCallback, errorCallback, args) {
            var fullPath = args[0];
            var metadataObject = args[1];

            exports.getFile(function (fileEntry) {
                fileEntry.file_.lastModifiedDate = metadataObject.modificationTime;
                idb_.put(fileEntry, fileEntry.file_.storagePath, successCallback, errorCallback);
            }, errorCallback, [fullPath, null]);
        };

        exports.write = function (successCallback, errorCallback, args) {
            var fileName = args[0];
            var data = args[1];
            var position = args[2];
            var isBinary = args[3]; // eslint-disable-line no-unused-vars

            if (!data) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }
                return;
            }

            if (typeof data === 'string' || data instanceof String) {
                data = new Blob([data]); // eslint-disable-line no-undef
            }

            exports.getFile(function (fileEntry) {
                var blob_ = fileEntry.file_.blob_;

                if (!blob_) {
                    blob_ = new Blob([data], {type: data.type}); // eslint-disable-line no-undef
                } else {
                    // Calc the head and tail fragments
                    var head = blob_.slice(0, position);
                    var tail = blob_.slice(position + (data.size || data.byteLength));

                    // Calc the padding
                    var padding = position - head.size;
                    if (padding < 0) {
                        padding = 0;
                    }

                    // Do the "write". In fact, a full overwrite of the Blob.
                    blob_ = new Blob([head, new Uint8Array(padding), data, tail], // eslint-disable-line no-undef
                        {type: data.type});
                }

                // Set the blob we're writing on this file entry so we can recall it later.
                fileEntry.file_.blob_ = blob_;
                fileEntry.file_.lastModifiedDate = new Date() || null;
                fileEntry.file_.size = blob_.size;
                fileEntry.file_.name = blob_.name;
                fileEntry.file_.type = blob_.type;

                idb_.put(fileEntry, fileEntry.file_.storagePath, function () {
                    successCallback(data.size || data.byteLength);
                }, errorCallback);
            }, errorCallback, [fileName, null]);
        };

        exports.readAsText = function (successCallback, errorCallback, args) {
            var fileName = args[0];
            var enc = args[1];
            var startPos = args[2];
            var endPos = args[3];

            readAs('text', fileName, enc, startPos, endPos, successCallback, errorCallback);
        };

        exports.readAsDataURL = function (successCallback, errorCallback, args) {
            var fileName = args[0];
            var startPos = args[1];
            var endPos = args[2];

            readAs('dataURL', fileName, null, startPos, endPos, successCallback, errorCallback);
        };

        exports.readAsBinaryString = function (successCallback, errorCallback, args) {
            var fileName = args[0];
            var startPos = args[1];
            var endPos = args[2];

            readAs('binaryString', fileName, null, startPos, endPos, successCallback, errorCallback);
        };

        exports.readAsArrayBuffer = function (successCallback, errorCallback, args) {
            var fileName = args[0];
            var startPos = args[1];
            var endPos = args[2];

            readAs('arrayBuffer', fileName, null, startPos, endPos, successCallback, errorCallback);
        };

        exports.removeRecursively = exports.remove = function (successCallback, errorCallback, args) {
            if (typeof successCallback !== 'function') {
                throw Error('Expected successCallback argument.');
            }

            var fullPath = resolveToFullPath_(args[0]).storagePath;
            if (fullPath === pathsPrefix.cacheDirectory || fullPath === pathsPrefix.dataDirectory) {
                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
                return;
            }

            function deleteEntry (isDirectory) {
                // TODO: This doesn't protect against directories that have content in it.
                // Should throw an error instead if the dirEntry is not empty.
                idb_['delete'](fullPath, function () {
                    successCallback();
                }, function () {
                    if (errorCallback) { errorCallback(); }
                }, isDirectory);
            }

            // We need to to understand what we are deleting:
            exports.getDirectory(function (entry) {
                deleteEntry(entry.isDirectory);
            }, function () {
                // DirectoryEntry was already deleted or entry is FileEntry
                deleteEntry(false);
            }, [fullPath, null, {create: false}]);
        };

        exports.getDirectory = function (successCallback, errorCallback, args) {
            var fullPath = args[0];
            var path = args[1];
            var options = args[2];

            // Create an absolute path if we were handed a relative one.
            path = resolveToFullPath_(fullPath, path);

            idb_.get(path.storagePath, function (folderEntry) {
                if (!options) {
                    options = {};
                }

                if (options.create === true && options.exclusive === true && folderEntry) {
                    // If create and exclusive are both true, and the path already exists,
                    // getDirectory must fail.
                    if (errorCallback) {
                        errorCallback(FileError.PATH_EXISTS_ERR);
                    }
                    // There is a strange bug in mobilespec + FF, which results in coming to multiple else-if's
                    // so we are shielding from it with returns.
                    return;
                }

                if (options.create === true && !folderEntry) {
                    // If create is true, the path doesn't exist, and no other error occurs,
                    // getDirectory must create it as a zero-length file and return a corresponding
                    // MyDirectoryEntry.
                    var dirEntry = new DirectoryEntry(path.fileName, path.fullPath, new FileSystem(path.fsName, fs_.root));

                    idb_.put(dirEntry, path.storagePath, successCallback, errorCallback);
                    return;
                }

                if (options.create === true && folderEntry) {

                    if (folderEntry.isDirectory) {
                        // IDB won't save methods, so we need re-create the MyDirectoryEntry.
                        successCallback(new DirectoryEntry(folderEntry.name, folderEntry.fullPath, folderEntry.filesystem));
                    } else {
                        if (errorCallback) {
                            errorCallback(FileError.INVALID_MODIFICATION_ERR);
                        }
                    }
                    return;
                }

                if ((!options.create || options.create === false) && !folderEntry) {
                    // Handle root special. It should always exist.
                    if (path.fullPath === DIR_SEPARATOR) {
                        successCallback(fs_.root);
                        return;
                    }

                    // If create is not true and the path doesn't exist, getDirectory must fail.
                    if (errorCallback) {
                        errorCallback(FileError.NOT_FOUND_ERR);
                    }

                    return;
                }
                if ((!options.create || options.create === false) && folderEntry && folderEntry.isFile) {
                    // If create is not true and the path exists, but is a file, getDirectory
                    // must fail.
                    if (errorCallback) {
                        errorCallback(FileError.TYPE_MISMATCH_ERR);
                    }
                    return;
                }

                // Otherwise, if no other error occurs, getDirectory must return a
                // MyDirectoryEntry corresponding to path.

                // IDB won't' save methods, so we need re-create MyDirectoryEntry.
                successCallback(new DirectoryEntry(folderEntry.name, folderEntry.fullPath, folderEntry.filesystem));
            }, errorCallback);
        };

        exports.getParent = function (successCallback, errorCallback, args) {
            if (typeof successCallback !== 'function') {
                throw Error('Expected successCallback argument.');
            }

            var fullPath = args[0];
            // fullPath is like this:
            // file:///persistent/path/to/file or
            // file:///persistent/path/to/directory/

            if (fullPath === DIR_SEPARATOR || fullPath === pathsPrefix.cacheDirectory ||
                fullPath === pathsPrefix.dataDirectory) {
                successCallback(fs_.root);
                return;
            }

            // To delete all slashes at the end
            while (fullPath[fullPath.length - 1] === '/') {
                fullPath = fullPath.substr(0, fullPath.length - 1);
            }

            var pathArr = fullPath.split(DIR_SEPARATOR);
            pathArr.pop();
            var parentName = pathArr.pop();
            var path = pathArr.join(DIR_SEPARATOR) + DIR_SEPARATOR;

            // To get parent of root files
            var joined = path + parentName + DIR_SEPARATOR;// is like this: file:///persistent/
            if (joined === pathsPrefix.cacheDirectory || joined === pathsPrefix.dataDirectory) {
                exports.getDirectory(successCallback, errorCallback, [joined, DIR_SEPARATOR, {create: false}]);
                return;
            }

            exports.getDirectory(successCallback, errorCallback, [path, parentName, {create: false}]);
        };

        exports.copyTo = function (successCallback, errorCallback, args) {
            var srcPath = args[0];
            var parentFullPath = args[1];
            var name = args[2];

            if (name.indexOf('/') !== -1 || srcPath === parentFullPath + name) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }

                return;
            }

            // Read src file
            exports.getFile(function (srcFileEntry) {

                var path = resolveToFullPath_(parentFullPath);
                // Check directory
                exports.getDirectory(function () {

                    // Create dest file
                    exports.getFile(function (dstFileEntry) {

                        exports.write(function () {
                            successCallback(dstFileEntry);
                        }, errorCallback, [dstFileEntry.file_.storagePath, srcFileEntry.file_.blob_, 0]);

                    }, errorCallback, [parentFullPath, name, {create: true}]);

                }, function () { if (errorCallback) { errorCallback(FileError.NOT_FOUND_ERR); } },
                [path.storagePath, null, {create: false}]);

            }, errorCallback, [srcPath, null]);
        };

        exports.moveTo = function (successCallback, errorCallback, args) {
            var srcPath = args[0];
            // parentFullPath and name parameters is ignored because
            // args is being passed downstream to exports.copyTo method
            var parentFullPath = args[1]; // eslint-disable-line
            var name = args[2]; // eslint-disable-line

            exports.copyTo(function (fileEntry) {

                exports.remove(function () {
                    successCallback(fileEntry);
                }, errorCallback, [srcPath]);

            }, errorCallback, args);
        };

        exports.resolveLocalFileSystemURI = function (successCallback, errorCallback, args) {
            var path = args[0];

            // Ignore parameters
            if (path.indexOf('?') !== -1) {
                path = String(path).split('?')[0];
            }

            // support for encodeURI
            if (/\%5/g.test(path) || /\%20/g.test(path)) {  // eslint-disable-line no-useless-escape
                path = decodeURI(path);
            }

            if (path.trim()[0] === '/') {
                if (errorCallback) {
                    errorCallback(FileError.ENCODING_ERR);
                }
                return;
            }

            // support for cdvfile
            if (path.trim().substr(0, 7) === 'cdvfile') {
                if (path.indexOf('cdvfile://localhost') === -1) {
                    if (errorCallback) {
                        errorCallback(FileError.ENCODING_ERR);
                    }
                    return;
                }

                var indexPersistent = path.indexOf('persistent');
                var indexTemporary = path.indexOf('temporary');

                // cdvfile://localhost/persistent/path/to/file
                if (indexPersistent !== -1) {
                    path = 'file:///persistent' + path.substr(indexPersistent + 10);
                } else if (indexTemporary !== -1) {
                    path = 'file:///temporary' + path.substr(indexTemporary + 9);
                } else {
                    if (errorCallback) {
                        errorCallback(FileError.ENCODING_ERR);
                    }
                    return;
                }
            }

            // to avoid path form of '///path/to/file'
            function handlePathSlashes (path) {
                var cutIndex = 0;
                for (var i = 0; i < path.length - 1; i++) {
                    if (path[i] === DIR_SEPARATOR && path[i + 1] === DIR_SEPARATOR) {
                        cutIndex = i + 1;
                    } else break;
                }

                return path.substr(cutIndex);
            }

            // Handle localhost containing paths (see specs )
            if (path.indexOf('file://localhost/') === 0) {
                path = path.replace('file://localhost/', 'file:///');
            }

            if (path.indexOf(pathsPrefix.dataDirectory) === 0) {
                path = path.substring(pathsPrefix.dataDirectory.length - 1);
                path = handlePathSlashes(path);

                exports.requestFileSystem(function () {
                    exports.getFile(successCallback, function () {
                        exports.getDirectory(successCallback, errorCallback, [pathsPrefix.dataDirectory, path,
                        {create: false}]);
                    }, [pathsPrefix.dataDirectory, path, {create: false}]);
                }, errorCallback, [LocalFileSystem.PERSISTENT]);
            } else if (path.indexOf(pathsPrefix.cacheDirectory) === 0) {
                path = path.substring(pathsPrefix.cacheDirectory.length - 1);
                path = handlePathSlashes(path);

                exports.requestFileSystem(function () {
                    exports.getFile(successCallback, function () {
                        exports.getDirectory(successCallback, errorCallback, [pathsPrefix.cacheDirectory, path,
                        {create: false}]);
                    }, [pathsPrefix.cacheDirectory, path, {create: false}]);
                }, errorCallback, [LocalFileSystem.TEMPORARY]);
            } else if (path.indexOf(pathsPrefix.applicationDirectory) === 0) {
                path = path.substring(pathsPrefix.applicationDirectory.length);
                // TODO: need to cut out redundant slashes?

                var xhr = new XMLHttpRequest(); // eslint-disable-line no-undef
                xhr.open('GET', path, true);
                xhr.onreadystatechange = function () {
                    if (xhr.status === 200 && xhr.readyState === 4) {
                        exports.requestFileSystem(function (fs) {
                            fs.name = location.hostname; // eslint-disable-line no-undef

                            // TODO: need to call exports.getFile(...) to handle errors correct
                            fs.root.getFile(path, {create: true}, writeFile, errorCallback);
                        }, errorCallback, [LocalFileSystem.PERSISTENT]);
                    }
                };

                xhr.onerror = function () {
                    if (errorCallback) {
                        errorCallback(FileError.NOT_READABLE_ERR);
                    }
                };

                xhr.send();
            } else {
                if (errorCallback) {
                    errorCallback(FileError.NOT_FOUND_ERR);
                }
            }

            function writeFile (entry) {
                entry.createWriter(function (fileWriter) {
                    fileWriter.onwriteend = function (evt) {
                        if (!evt.target.error) {
                            entry.filesystemName = location.hostname; // eslint-disable-line no-undef
                            successCallback(entry);
                        }
                    };
                    fileWriter.onerror = function () {
                        if (errorCallback) {
                            errorCallback(FileError.NOT_READABLE_ERR);
                        }
                    };
                    fileWriter.write(new Blob([xhr.response])); // eslint-disable-line no-undef
                }, errorCallback); // eslint-disable-line no-undef
            }
        };

        exports.requestAllPaths = function (successCallback) {
            successCallback(pathsPrefix);
        };

    /** * Helpers ***/

        /**
         * Interface to wrap the native File interface.
         *
         * This interface is necessary for creating zero-length (empty) files,
         * something the Filesystem API allows you to do. Unfortunately, File's
         * constructor cannot be called directly, making it impossible to instantiate
         * an empty File in JS.
         *
         * @param {Object} opts Initial values.
         * @constructor
         */
        function MyFile (opts) {
            var blob_ = new Blob(); // eslint-disable-line no-undef

            this.size = opts.size || 0;
            this.name = opts.name || '';
            this.type = opts.type || '';
            this.lastModifiedDate = opts.lastModifiedDate || null;
            this.storagePath = opts.storagePath || '';

            // Need some black magic to correct the object's size/name/type based on the
            // blob that is saved.
            Object.defineProperty(this, 'blob_', {
                enumerable: true,
                get: function () {
                    return blob_;
                },
                set: function (val) {
                    blob_ = val;
                    this.size = blob_.size;
                    this.name = blob_.name;
                    this.type = blob_.type;
                    this.lastModifiedDate = blob_.lastModifiedDate;
                }.bind(this)
            });
        }

        MyFile.prototype.constructor = MyFile;

        var MyFileHelper = {
            toJson: function (myFile, success) {
                /*
                    Safari private browse mode cannot store Blob object to indexeddb.
                    Then use pure json object instead of Blob object.
                */
                var fr = new FileReader();
                fr.onload = function (ev) {
                    var base64 = btoa(String.fromCharCode.apply(null, new Uint8Array(fr.result)));
                    success({
                        opt: {
                            size: myFile.size,
                            name: myFile.name,
                            type: myFile.type,
                            lastModifiedDate: myFile.lastModifiedDate,
                            storagePath: myFile.storagePath
                        },
                        base64: base64
                    });
                };
                fr.readAsArrayBuffer(myFile.blob_);
            },
            setBase64: function (myFile, base64) {
                if (base64) {
                    var arrayBuffer = (new Uint8Array(
                        [].map.call(atob(base64), function (c) { return c.charCodeAt(0); })
                    )).buffer;

                    myFile.blob_ = new Blob([arrayBuffer], { type: myFile.type });
                } else {
                    myFile.blob_ = new Blob();
                }
            }
        };

        // When saving an entry, the fullPath should always lead with a slash and never
        // end with one (e.g. a directory). Also, resolve '.' and '..' to an absolute
        // one. This method ensures path is legit!
        function resolveToFullPath_ (cwdFullPath, path) {
            path = path || '';
            var fullPath = path;
            var prefix = '';

            cwdFullPath = cwdFullPath || DIR_SEPARATOR;
            if (cwdFullPath.indexOf(FILESYSTEM_PREFIX) === 0) {
                prefix = cwdFullPath.substring(0, cwdFullPath.indexOf(DIR_SEPARATOR, FILESYSTEM_PREFIX.length));
                cwdFullPath = cwdFullPath.substring(cwdFullPath.indexOf(DIR_SEPARATOR, FILESYSTEM_PREFIX.length));
            }

            var relativePath = path[0] !== DIR_SEPARATOR;
            if (relativePath) {
                fullPath = cwdFullPath;
                if (cwdFullPath !== DIR_SEPARATOR) {
                    fullPath += DIR_SEPARATOR + path;
                } else {
                    fullPath += path;
                }
            }

            // Remove doubled separator substrings
            var re = new RegExp(DIR_SEPARATOR + DIR_SEPARATOR, 'g');
            fullPath = fullPath.replace(re, DIR_SEPARATOR);

            // Adjust '..'s by removing parent directories when '..' flows in path.
            var parts = fullPath.split(DIR_SEPARATOR);
            for (var i = 0; i < parts.length; ++i) {
                var part = parts[i];
                if (part === '..') {
                    parts[i - 1] = '';
                    parts[i] = '';
                }
            }
            fullPath = parts.filter(function (el) {
                return el;
            }).join(DIR_SEPARATOR);

            // Add back in leading slash.
            if (fullPath[0] !== DIR_SEPARATOR) {
                fullPath = DIR_SEPARATOR + fullPath;
            }

            // Replace './' by current dir. ('./one/./two' -> one/two)
            fullPath = fullPath.replace(/\.\//g, DIR_SEPARATOR);

            // Replace '//' with '/'.
            fullPath = fullPath.replace(/\/\//g, DIR_SEPARATOR);

            // Replace '/.' with '/'.
            fullPath = fullPath.replace(/\/\./g, DIR_SEPARATOR);

            // Remove '/' if it appears on the end.
            if (fullPath[fullPath.length - 1] === DIR_SEPARATOR &&
                fullPath !== DIR_SEPARATOR) {
                fullPath = fullPath.substring(0, fullPath.length - 1);
            }

            var storagePath = prefix + fullPath;
            storagePath = decodeURI(storagePath);
            fullPath = decodeURI(fullPath);

            return {
                storagePath: storagePath,
                fullPath: fullPath,
                fileName: fullPath.split(DIR_SEPARATOR).pop(),
                fsName: prefix.split(DIR_SEPARATOR).pop()
            };
        }

        function fileEntryFromIdbEntry (fileEntry) {
            // IDB won't save methods, so we need re-create the FileEntry.
            var clonedFileEntry = new FileEntry(fileEntry.name, fileEntry.fullPath, fileEntry.filesystem);
            clonedFileEntry.file_ = fileEntry.file_;

            return clonedFileEntry;
        }

        function readAs (what, fullPath, encoding, startPos, endPos, successCallback, errorCallback) {
            exports.getFile(function (fileEntry) {
                var fileReader = new FileReader(); // eslint-disable-line no-undef
                var blob = fileEntry.file_.blob_.slice(startPos, endPos);

                fileReader.onload = function (e) {
                    successCallback(e.target.result);
                };

                fileReader.onerror = errorCallback;

                switch (what) {
                case 'text':
                    fileReader.readAsText(blob, encoding);
                    break;
                case 'dataURL':
                    fileReader.readAsDataURL(blob);
                    break;
                case 'arrayBuffer':
                    fileReader.readAsArrayBuffer(blob);
                    break;
                case 'binaryString':
                    fileReader.readAsBinaryString(blob);
                    break;
                }

            }, errorCallback, [fullPath, null]);
        }

    /** * Core logic to handle IDB operations ***/

        idb_.open = function (dbName, successCallback, errorCallback) {
            var self = this;

            // TODO: FF 12.0a1 isn't liking a db name with : in it.
            var request = indexedDB.open(dbName.replace(':', '_')/*, 1 /*version */);

            request.onerror = errorCallback || onError;

            request.onupgradeneeded = function (e) {
                // First open was called or higher db version was used.

                // console.log('onupgradeneeded: oldVersion:' + e.oldVersion,
                //           'newVersion:' + e.newVersion);

                self.db = e.target.result;
                self.db.onerror = onError;

                if (!self.db.objectStoreNames.contains(FILE_STORE_)) {
                    self.db.createObjectStore(FILE_STORE_/*, {keyPath: 'id', autoIncrement: true} */);
                }
            };

            request.onsuccess = function (e) {
                self.db = e.target.result;
                self.db.onerror = onError;
                successCallback(e);
            };

            request.onblocked = errorCallback || onError;
        };

        idb_.close = function () {
            this.db.close();
            this.db = null;
        };

        idb_.get = function (fullPath, successCallback, errorCallback) {
            if (!this.db) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }
                return;
            }

            var tx = this.db.transaction([FILE_STORE_], 'readonly');

            var request = tx.objectStore(FILE_STORE_).get(fullPath);

            tx.onabort = errorCallback || onError;
            tx.oncomplete = function () {
                var entry = request.result;
                if (entry && entry.file_json) {
                    /*
                        Safari private browse mode cannot store Blob object to indexeddb.
                        Then use pure json object instead of Blob object.
                    */
                    entry.file_ = new MyFile(entry.file_json.opt);
                    MyFileHelper.setBase64(entry.file_, entry.file_json.base64);
                    delete entry.file_json;
                }
                successCallback(entry);
            };
        };

        idb_.getAllEntries = function (fullPath, storagePath, successCallback, errorCallback) {
            if (!this.db) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }
                return;
            }

            var results = [];

            if (storagePath[storagePath.length - 1] === DIR_SEPARATOR) {
                storagePath = storagePath.substring(0, storagePath.length - 1);
            }

            var range = IDBKeyRange.bound(storagePath + DIR_SEPARATOR + ' ',
                storagePath + DIR_SEPARATOR + String.fromCharCode(unicodeLastChar));

            var tx = this.db.transaction([FILE_STORE_], 'readonly');
            tx.onabort = errorCallback || onError;
            tx.oncomplete = function () {
                results = results.filter(function (val) {
                    var pathWithoutSlash = val.fullPath;

                    if (val.fullPath[val.fullPath.length - 1] === DIR_SEPARATOR) {
                        pathWithoutSlash = pathWithoutSlash.substr(0, pathWithoutSlash.length - 1);
                    }

                    var valPartsLen = pathWithoutSlash.split(DIR_SEPARATOR).length;
                    var fullPathPartsLen = fullPath.split(DIR_SEPARATOR).length;

                    /* Input fullPath parameter  equals '//' for root folder */
                    /* Entries in root folder has valPartsLen equals 2 (see below) */
                    if (fullPath[fullPath.length - 1] === DIR_SEPARATOR && fullPath.trim().length === 2) {
                        fullPathPartsLen = 1;
                    } else if (fullPath[fullPath.length - 1] === DIR_SEPARATOR) {
                        fullPathPartsLen = fullPath.substr(0, fullPath.length - 1).split(DIR_SEPARATOR).length;
                    } else {
                        fullPathPartsLen = fullPath.split(DIR_SEPARATOR).length;
                    }

                    if (valPartsLen === fullPathPartsLen + 1) {
                        // If this a subfolder and entry is a direct child, include it in
                        // the results. Otherwise, it's not an entry of this folder.
                        return val;
                    } else return false;
                });

                successCallback(results);
            };

            var request = tx.objectStore(FILE_STORE_).openCursor(range);

            request.onsuccess = function (e) {
                var cursor = e.target.result;
                if (cursor) {
                    var val = cursor.value;

                    results.push(val.isFile ? fileEntryFromIdbEntry(val) : new DirectoryEntry(val.name, val.fullPath, val.filesystem));
                    cursor['continue']();
                }
            };
        };

        idb_['delete'] = function (fullPath, successCallback, errorCallback, isDirectory) {
            if (!idb_.db) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }
                return;
            }

            var tx = this.db.transaction([FILE_STORE_], 'readwrite');
            tx.oncomplete = successCallback;
            tx.onabort = errorCallback || onError;
            tx.oncomplete = function () {
                if (isDirectory) {
                    // We delete nested files and folders after deleting parent folder
                    // We use ranges: https://developer.mozilla.org/en-US/docs/Web/API/IDBKeyRange
                    fullPath = fullPath + DIR_SEPARATOR;

                    // Range contains all entries in the form fullPath<symbol> where
                    // symbol in the range from ' ' to symbol which has code `unicodeLastChar`
                    var range = IDBKeyRange.bound(fullPath + ' ', fullPath + String.fromCharCode(unicodeLastChar));

                    var newTx = this.db.transaction([FILE_STORE_], 'readwrite');
                    newTx.oncomplete = successCallback;
                    newTx.onabort = errorCallback || onError;
                    newTx.objectStore(FILE_STORE_)['delete'](range);
                } else {
                    successCallback();
                }
            };
            tx.objectStore(FILE_STORE_)['delete'](fullPath);
        };

        idb_.put = function (entry, storagePath, successCallback, errorCallback, retry) {
            if (!this.db) {
                if (errorCallback) {
                    errorCallback(FileError.INVALID_MODIFICATION_ERR);
                }
                return;
            }

            var tx = this.db.transaction([FILE_STORE_], 'readwrite');
            tx.onabort = errorCallback || onError;
            tx.oncomplete = function () {
                // TODO: Error is thrown if we pass the request event back instead.
                successCallback(entry);
            };

            try {
                tx.objectStore(FILE_STORE_).put(entry, storagePath);
            } catch (e) {
                if (e.name === 'DataCloneError') {
                    tx.oncomplete = null;
                    /*
                        Safari private browse mode cannot store Blob object to indexeddb.
                        Then use pure json object instead of Blob object.
                    */

                    var successCallback2 = function (entry) {
                        entry.file_ = new MyFile(entry.file_json.opt);
                        delete entry.file_json;
                        successCallback(entry);
                    };

                    if (!retry) {
                        if (entry.file_ && entry.file_ instanceof MyFile && entry.file_.blob_) {
                            MyFileHelper.toJson(entry.file_, function (json) {
                                entry.file_json = json;
                                delete entry.file_;
                                idb_.put(entry, storagePath, successCallback2, errorCallback, true);
                            });
                            return;
                        }
                    }
                }
                throw e;
            }
        };

        // Global error handler. Errors bubble from request, to transaction, to db.
        function onError (e) {
            switch (e.target.errorCode) {
            case 12:
                console.log('Error - Attempt to open db with a lower version than the ' +
                        'current one.');
                break;
            default:
                console.log('errorCode: ' + e.target.errorCode);
            }

            console.log(e, e.code, e.message);
        }

    })(module.exports, window);

    require('cordova/exec/proxy').add('File', module.exports);
})();
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
 */
package org.apache.cordova.file;

import android.content.res.AssetManager;
import android.net.Uri;

import org.apache.cordova.CordovaResourceApi;
import org.apache.cordova.LOG;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.HashMap;
import java.util.Map;

public class AssetFilesystem extends Filesystem {

    private final AssetManager assetManager;

    // A custom gradle hook creates the cdvasset.manifest file, which speeds up asset listing a tonne.
    // See: http://stackoverflow.com/questions/16911558/android-assetmanager-list-incredibly-slow
    private static Object listCacheLock = new Object();
    private static boolean listCacheFromFile;
    private static Map<String, String[]> listCache;
    private static Map<String, Long> lengthCache;

    private static final String LOG_TAG = "AssetFilesystem";

    private void lazyInitCaches() {
        synchronized (listCacheLock) {
            if (listCache == null) {
                ObjectInputStream ois = null;
                try {
                    ois = new ObjectInputStream(assetManager.open("cdvasset.manifest"));
                    listCache = (Map<String, String[]>) ois.readObject();
                    lengthCache = (Map<String, Long>) ois.readObject();
                    listCacheFromFile = true;
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    // Asset manifest won't exist if the gradle hook isn't set up correctly.
                } finally {
                    if (ois != null) {
                        try {
                            ois.close();
                        } catch (IOException e) {
                            LOG.d(LOG_TAG, e.getLocalizedMessage());
                        }
                    }
                }
                if (listCache == null) {
                    LOG.w("AssetFilesystem", "Asset manifest not found. Recursive copies and directory listing will be slow.");
                    listCache = new HashMap<String, String[]>();
                }
            }
        }
    }

    private String[] listAssets(String assetPath) throws IOException {
        if (assetPath.startsWith("/")) {
            assetPath = assetPath.substring(1);
        }
        if (assetPath.endsWith("/")) {
            assetPath = assetPath.substring(0, assetPath.length() - 1);
        }
        lazyInitCaches();
        String[] ret = listCache.get(assetPath);
        if (ret == null) {
            if (listCacheFromFile) {
                ret = new String[0];
            } else {
                ret = assetManager.list(assetPath);
                listCache.put(assetPath, ret);
            }
        }
        return ret;
    }

    private long getAssetSize(String assetPath) throws FileNotFoundException {
        if (assetPath.startsWith("/")) {
            assetPath = assetPath.substring(1);
        }
        lazyInitCaches();
        if (lengthCache != null) {
            Long ret = lengthCache.get(assetPath);
            if (ret == null) {
                throw new FileNotFoundException("Asset not found: " + assetPath);
            }
            return ret;
        }
        CordovaResourceApi.OpenForReadResult offr = null;
        try {
            offr = resourceApi.openForRead(nativeUriForFullPath(assetPath));
            long length = offr.length;
            if (length < 0) {
                // available() doesn't always yield the file size, but for assets it does.
                length = offr.inputStream.available();
            }
            return length;
        } catch (IOException e) {
            FileNotFoundException fnfe = new FileNotFoundException("File not found: " + assetPath);
            fnfe.initCause(e);
            throw fnfe;
        } finally {
            if (offr != null) {
                try {
                    offr.inputStream.close();
                } catch (IOException e) {
                    LOG.d(LOG_TAG, e.getLocalizedMessage());
                }
            }
        }
    }

    public AssetFilesystem(AssetManager assetManager, CordovaResourceApi resourceApi) {
        super(Uri.parse("file:///android_asset/"), "assets", resourceApi);
        this.assetManager = assetManager;
	}

    @Override
    public Uri toNativeUri(LocalFilesystemURL inputURL) {
        return nativeUriForFullPath(inputURL.path);
    }

    @Override
    public LocalFilesystemURL toLocalUri(Uri inputURL) {
        if (!"file".equals(inputURL.getScheme())) {
            return null;
        }
        File f = new File(inputURL.getPath());
        // Removes and duplicate /s (e.g. file:///a//b/c)
        Uri resolvedUri = Uri.fromFile(f);
        String rootUriNoTrailingSlash = rootUri.getEncodedPath();
        rootUriNoTrailingSlash = rootUriNoTrailingSlash.substring(0, rootUriNoTrailingSlash.length() - 1);
        if (!resolvedUri.getEncodedPath().startsWith(rootUriNoTrailingSlash)) {
            return null;
        }
        String subPath = resolvedUri.getEncodedPath().substring(rootUriNoTrailingSlash.length());
        // Strip leading slash
        if (!subPath.isEmpty()) {
            subPath = subPath.substring(1);
        }
        Uri.Builder b = new Uri.Builder()
            .scheme(LocalFilesystemURL.FILESYSTEM_PROTOCOL)
            .authority("localhost")
            .path(name);
        if (!subPath.isEmpty()) {
            b.appendEncodedPath(subPath);
        }
        if (isDirectory(subPath) || inputURL.getPath().endsWith("/")) {
            // Add trailing / for directories.
            b.appendEncodedPath("");
        }
        return LocalFilesystemURL.parse(b.build());
    }

    private boolean isDirectory(String assetPath) {
        try {
            return listAssets(assetPath).length != 0;
        } catch (IOException e) {
            return false;
        }
    }

    @Override
    public LocalFilesystemURL[] listChildren(LocalFilesystemURL inputURL) throws FileNotFoundException {
        String pathNoSlashes = inputURL.path.substring(1);
        if (pathNoSlashes.endsWith("/")) {
            pathNoSlashes = pathNoSlashes.substring(0, pathNoSlashes.length() - 1);
        }

        String[] files;
        try {
            files = listAssets(pathNoSlashes);
        } catch (IOException e) {
            FileNotFoundException fnfe = new FileNotFoundException();
            fnfe.initCause(e);
            throw fnfe;
        }

        LocalFilesystemURL[] entries = new LocalFilesystemURL[files.length];
        for (int i = 0; i < files.length; ++i) {
            entries[i] = localUrlforFullPath(new File(inputURL.path, files[i]).getPath());
        }
        return entries;
	}

    @Override
    public JSONObject getFileForLocalURL(LocalFilesystemURL inputURL,
                                         String path, JSONObject options, boolean directory)
            throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException {
        if (options != null && options.optBoolean("create")) {
            throw new UnsupportedOperationException("Assets are read-only");
        }

        // Check whether the supplied path is absolute or relative
        if (directory && !path.endsWith("/")) {
            path += "/";
        }

        LocalFilesystemURL requestedURL;
        if (path.startsWith("/")) {
            requestedURL = localUrlforFullPath(normalizePath(path));
        } else {
            requestedURL = localUrlforFullPath(normalizePath(inputURL.path + "/" + path));
        }

        // Throws a FileNotFoundException if it doesn't exist.
        getFileMetadataForLocalURL(requestedURL);

        boolean isDir = isDirectory(requestedURL.path);
        if (directory && !isDir) {
            throw new TypeMismatchException("path doesn't exist or is file");
        } else if (!directory && isDir) {
            throw new TypeMismatchException("path doesn't exist or is directory");
        }

        // Return the directory
        return makeEntryForURL(requestedURL);
    }

    @Override
	public JSONObject getFileMetadataForLocalURL(LocalFilesystemURL inputURL) throws FileNotFoundException {
        JSONObject metadata = new JSONObject();
        long size = inputURL.isDirectory ? 0 : getAssetSize(inputURL.path);
        try {
        	metadata.put("size", size);
        	metadata.put("type", inputURL.isDirectory ? "text/directory" : resourceApi.getMimeType(toNativeUri(inputURL)));
        	metadata.put("name", new File(inputURL.path).getName());
        	metadata.put("fullPath", inputURL.path);
        	metadata.put("lastModifiedDate", 0);
        } catch (JSONException e) {
            return null;
        }
        return metadata;
	}

	@Override
	public boolean canRemoveFileAtLocalURL(LocalFilesystemURL inputURL) {
		return false;
	}

    @Override
    long writeToFileAtURL(LocalFilesystemURL inputURL, String data, int offset, boolean isBinary) throws NoModificationAllowedException, IOException {
        throw new NoModificationAllowedException("Assets are read-only");
    }

    @Override
    long truncateFileAtURL(LocalFilesystemURL inputURL, long size) throws IOException, NoModificationAllowedException {
        throw new NoModificationAllowedException("Assets are read-only");
    }

    @Override
    String filesystemPathForURL(LocalFilesystemURL url) {
        return new File(rootUri.getPath(), url.path).toString();
    }

    @Override
    LocalFilesystemURL URLforFilesystemPath(String path) {
        return null;
    }

    @Override
    boolean removeFileAtLocalURL(LocalFilesystemURL inputURL) throws InvalidModificationException, NoModificationAllowedException {
        throw new NoModificationAllowedException("Assets are read-only");
    }

    @Override
    boolean recursiveRemoveFileAtLocalURL(LocalFilesystemURL inputURL) throws NoModificationAllowedException {
        throw new NoModificationAllowedException("Assets are read-only");
    }

}
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
 */
package org.apache.cordova.file;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.cordova.CordovaResourceApi;
import org.json.JSONException;
import org.json.JSONObject;

public class ContentFilesystem extends Filesystem {

    private final Context context;

	public ContentFilesystem(Context context, CordovaResourceApi resourceApi) {
		super(Uri.parse("content://"), "content", resourceApi);
        this.context = context;
	}

    @Override
    public Uri toNativeUri(LocalFilesystemURL inputURL) {
        String authorityAndPath = inputURL.uri.getEncodedPath().substring(this.name.length() + 2);
        if (authorityAndPath.length() < 2) {
            return null;
        }
        String ret = "content://" + authorityAndPath;
        String query = inputURL.uri.getEncodedQuery();
        if (query != null) {
            ret += '?' + query;
        }
        String frag = inputURL.uri.getEncodedFragment();
        if (frag != null) {
            ret += '#' + frag;
        }
        return Uri.parse(ret);
    }

    @Override
    public LocalFilesystemURL toLocalUri(Uri inputURL) {
        if (!"content".equals(inputURL.getScheme())) {
            return null;
        }
        String subPath = inputURL.getEncodedPath();
        if (subPath.length() > 0) {
            subPath = subPath.substring(1);
        }
        Uri.Builder b = new Uri.Builder()
            .scheme(LocalFilesystemURL.FILESYSTEM_PROTOCOL)
            .authority("localhost")
            .path(name)
            .appendPath(inputURL.getAuthority());
        if (subPath.length() > 0) {
            b.appendEncodedPath(subPath);
        }
        Uri localUri = b.encodedQuery(inputURL.getEncodedQuery())
            .encodedFragment(inputURL.getEncodedFragment())
            .build();
        return LocalFilesystemURL.parse(localUri);
    }

    @Override
	public JSONObject getFileForLocalURL(LocalFilesystemURL inputURL,
			String fileName, JSONObject options, boolean directory) throws IOException, TypeMismatchException, JSONException {
        throw new UnsupportedOperationException("getFile() not supported for content:. Use resolveLocalFileSystemURL instead.");
	}

	@Override
	public boolean removeFileAtLocalURL(LocalFilesystemURL inputURL)
			throws NoModificationAllowedException {
        Uri contentUri = toNativeUri(inputURL);
		try {
            context.getContentResolver().delete(contentUri, null, null);
		} catch (UnsupportedOperationException t) {
			// Was seeing this on the File mobile-spec tests on 4.0.3 x86 emulator.
			// The ContentResolver applies only when the file was registered in the
			// first case, which is generally only the case with images.
            NoModificationAllowedException nmae = new NoModificationAllowedException("Deleting not supported for content uri: " + contentUri);
            nmae.initCause(t);
            throw nmae;
		}
        return true;
	}

	@Override
	public boolean recursiveRemoveFileAtLocalURL(LocalFilesystemURL inputURL)
			throws NoModificationAllowedException {
		throw new NoModificationAllowedException("Cannot remove content url");
	}

    @Override
    public LocalFilesystemURL[] listChildren(LocalFilesystemURL inputURL) throws FileNotFoundException {
        throw new UnsupportedOperationException("readEntriesAtLocalURL() not supported for content:. Use resolveLocalFileSystemURL instead.");
    }

	@Override
	public JSONObject getFileMetadataForLocalURL(LocalFilesystemURL inputURL) throws FileNotFoundException {
        long size = -1;
        long lastModified = 0;
        Uri nativeUri = toNativeUri(inputURL);
        String mimeType = resourceApi.getMimeType(nativeUri);
        Cursor cursor = openCursorForURL(nativeUri);
        try {
            if (cursor != null && cursor.moveToFirst()) {
                Long sizeForCursor = resourceSizeForCursor(cursor);
                if (sizeForCursor != null) {
                    size = sizeForCursor.longValue();
                }
                Long modified = lastModifiedDateForCursor(cursor);
                if (modified != null)
                    lastModified = modified.longValue();
            } else {
                // Some content providers don't support cursors at all!
                CordovaResourceApi.OpenForReadResult offr = resourceApi.openForRead(nativeUri);
                size = offr.length;
            }
        } catch (IOException e) {
            FileNotFoundException fnfe = new FileNotFoundException();
            fnfe.initCause(e);
            throw fnfe;
        } finally {
        	if (cursor != null)
        		cursor.close();
        }

        JSONObject metadata = new JSONObject();
        try {
        	metadata.put("size", size);
        	metadata.put("type", mimeType);
        	metadata.put("name", name);
        	metadata.put("fullPath", inputURL.path);
        	metadata.put("lastModifiedDate", lastModified);
        } catch (JSONException e) {
        	return null;
        }
        return metadata;
	}

	@Override
	public long writeToFileAtURL(LocalFilesystemURL inputURL, String data,
			int offset, boolean isBinary) throws NoModificationAllowedException {
        throw new NoModificationAllowedException("Couldn't write to file given its content URI");
    }
	@Override
	public long truncateFileAtURL(LocalFilesystemURL inputURL, long size)
			throws NoModificationAllowedException {
        throw new NoModificationAllowedException("Couldn't truncate file given its content URI");
	}

	protected Cursor openCursorForURL(Uri nativeUri) {
        ContentResolver contentResolver = context.getContentResolver();
        try {
            return contentResolver.query(nativeUri, null, null, null, null);
        } catch (UnsupportedOperationException e) {
            return null;
        }
	}

	private Long resourceSizeForCursor(Cursor cursor) {
        int columnIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
        if (columnIndex != -1) {
            String sizeStr = cursor.getString(columnIndex);
            if (sizeStr != null) {
            	return Long.parseLong(sizeStr);
            }
        }
        return null;
	}
	
	protected Long lastModifiedDateForCursor(Cursor cursor) {
        int columnIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DATE_MODIFIED);
        if (columnIndex == -1) {
            columnIndex = cursor.getColumnIndex(DocumentsContract.Document.COLUMN_LAST_MODIFIED);
        }
        if (columnIndex != -1) {
            String dateStr = cursor.getString(columnIndex);
            if (dateStr != null) {
                return Long.parseLong(dateStr);
            }
        }
        return null;
	}

    @Override
    public String filesystemPathForURL(LocalFilesystemURL url) {
        File f = resourceApi.mapUriToFile(toNativeUri(url));
        return f == null ? null : f.getAbsolutePath();
    }

	@Override
	public LocalFilesystemURL URLforFilesystemPath(String path) {
		// Returns null as we don't support reverse mapping back to content:// URLs
		return null;
	}

	@Override
	public boolean canRemoveFileAtLocalURL(LocalFilesystemURL inputURL) {
		return true;
	}
}
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
*/
package org.apache.cordova.file;

import android.os.Environment;
import android.os.StatFs;

import java.io.File;

/**
 * This class provides file directory utilities.
 * All file operations are performed on the SD card.
 *
 * It is used by the FileUtils class.
 */
public class DirectoryManager {

    @SuppressWarnings("unused")
    private static final String LOG_TAG = "DirectoryManager";

    /**
     * Determine if a file or directory exists.
     * @param name				The name of the file to check.
     * @return					T=exists, F=not found
     */
    public static boolean testFileExists(String name) {
        boolean status;

        // If SD card exists
        if ((testSaveLocationExists()) && (!name.equals(""))) {
            File path = Environment.getExternalStorageDirectory();
            File newPath = constructFilePaths(path.toString(), name);
            status = newPath.exists();
        }
        // If no SD card
        else {
            status = false;
        }
        return status;
    }

    /**
     * Get the free space in external storage
     *
     * @return 		Size in KB or -1 if not available
     */
    public static long getFreeExternalStorageSpace() {
        String status = Environment.getExternalStorageState();
        long freeSpaceInBytes = 0;

        // Check if external storage exists
        if (status.equals(Environment.MEDIA_MOUNTED)) {
            freeSpaceInBytes = getFreeSpaceInBytes(Environment.getExternalStorageDirectory().getPath());
        } else {
            // If no external storage then return -1
            return -1;
        }

        return freeSpaceInBytes / 1024;
    }

    /**
     * Given a path return the number of free bytes in the filesystem containing the path.
     *
     * @param path to the file system
     * @return free space in bytes
     */
    public static long getFreeSpaceInBytes(String path) {
        try {
            StatFs stat = new StatFs(path);
            long blockSize = stat.getBlockSize();
            long availableBlocks = stat.getAvailableBlocks();
            return availableBlocks * blockSize;
        } catch (IllegalArgumentException e) {
            // The path was invalid. Just return 0 free bytes.
            return 0;
        }
    }

    /**
     * Determine if SD card exists.
     *
     * @return				T=exists, F=not found
     */
    public static boolean testSaveLocationExists() {
        String sDCardStatus = Environment.getExternalStorageState();
        boolean status;

        // If SD card is mounted
        if (sDCardStatus.equals(Environment.MEDIA_MOUNTED)) {
            status = true;
        }

        // If no SD card
        else {
            status = false;
        }
        return status;
    }

    /**
     * Create a new file object from two file paths.
     *
     * @param file1			Base file path
     * @param file2			Remaining file path
     * @return				File object
     */
    private static File constructFilePaths (String file1, String file2) {
        File newPath;
        if (file2.startsWith(file1)) {
            newPath = new File(file2);
        }
        else {
            newPath = new File(file1 + "/" + file2);
        }
        return newPath;
    }
}
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
*/

package org.apache.cordova.file;

@SuppressWarnings("serial")
public class EncodingException extends Exception {

    public EncodingException(String message) {
        super(message);
    }

}
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
*/

package org.apache.cordova.file;

@SuppressWarnings("serial")
public class FileExistsException extends Exception {

    public FileExistsException(String msg) {
        super(msg);
    }

}
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
 */
package org.apache.cordova.file;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.util.Base64;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.LOG;
import org.apache.cordova.PermissionHelper;
import org.apache.cordova.PluginResult;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.security.Permission;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;

/**
 * This class provides file and directory services to JavaScript.
 */
public class FileUtils extends CordovaPlugin {
    private static final String LOG_TAG = "FileUtils";

    public static int NOT_FOUND_ERR = 1;
    public static int SECURITY_ERR = 2;
    public static int ABORT_ERR = 3;

    public static int NOT_READABLE_ERR = 4;
    public static int ENCODING_ERR = 5;
    public static int NO_MODIFICATION_ALLOWED_ERR = 6;
    public static int INVALID_STATE_ERR = 7;
    public static int SYNTAX_ERR = 8;
    public static int INVALID_MODIFICATION_ERR = 9;
    public static int QUOTA_EXCEEDED_ERR = 10;
    public static int TYPE_MISMATCH_ERR = 11;
    public static int PATH_EXISTS_ERR = 12;

    /*
     * Permission callback codes
     */

    public static final int ACTION_GET_FILE = 0;
    public static final int ACTION_WRITE = 1;
    public static final int ACTION_GET_DIRECTORY = 2;

    public static final int WRITE = 3;
    public static final int READ = 4;

    public static int UNKNOWN_ERR = 1000;

    private boolean configured = false;

    private PendingRequests pendingRequests;



    /*
     * We need both read and write when accessing the storage, I think.
     */

    private String [] permissions = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE };

    // This field exists only to support getEntry, below, which has been deprecated
    private static FileUtils filePlugin;

    private interface FileOp {
        void run(JSONArray args) throws Exception;
    }

    private ArrayList<Filesystem> filesystems;

    public void registerFilesystem(Filesystem fs) {
    	if (fs != null && filesystemForName(fs.name)== null) {
    		this.filesystems.add(fs);
    	}
    }

    private Filesystem filesystemForName(String name) {
    	for (Filesystem fs:filesystems) {
    		if (fs != null && fs.name != null && fs.name.equals(name)) {
    			return fs;
    		}
    	}
    	return null;
    }

    protected String[] getExtraFileSystemsPreference(Activity activity) {
        String fileSystemsStr = preferences.getString("androidextrafilesystems", "files,files-external,documents,sdcard,cache,cache-external,assets,root");
        return fileSystemsStr.split(",");
    }

    protected void registerExtraFileSystems(String[] filesystems, HashMap<String, String> availableFileSystems) {
        HashSet<String> installedFileSystems = new HashSet<String>();

        /* Register filesystems in order */
        for (String fsName : filesystems) {
            if (!installedFileSystems.contains(fsName)) {
                String fsRoot = availableFileSystems.get(fsName);
                if (fsRoot != null) {
                    File newRoot = new File(fsRoot);
                    if (newRoot.mkdirs() || newRoot.isDirectory()) {
                        registerFilesystem(new LocalFilesystem(fsName, webView.getContext(), webView.getResourceApi(), newRoot));
                        installedFileSystems.add(fsName);
                    } else {
                       LOG.d(LOG_TAG, "Unable to create root dir for filesystem \"" + fsName + "\", skipping");
                    }
                } else {
                    LOG.d(LOG_TAG, "Unrecognized extra filesystem identifier: " + fsName);
                }
            }
        }
    }

    protected HashMap<String, String> getAvailableFileSystems(Activity activity) {
        Context context = activity.getApplicationContext();
        HashMap<String, String> availableFileSystems = new HashMap<String,String>();

        availableFileSystems.put("files", context.getFilesDir().getAbsolutePath());
        availableFileSystems.put("documents", new File(context.getFilesDir(), "Documents").getAbsolutePath());
        availableFileSystems.put("cache", context.getCacheDir().getAbsolutePath());
        availableFileSystems.put("root", "/");
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
          try {
            availableFileSystems.put("files-external", context.getExternalFilesDir(null).getAbsolutePath());
            availableFileSystems.put("sdcard", Environment.getExternalStorageDirectory().getAbsolutePath());
            availableFileSystems.put("cache-external", context.getExternalCacheDir().getAbsolutePath());
          }
          catch(NullPointerException e) {
              LOG.d(LOG_TAG, "External storage unavailable, check to see if USB Mass Storage Mode is on");
          }
        }

        return availableFileSystems;
    }

    @Override
    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
    	super.initialize(cordova, webView);
    	this.filesystems = new ArrayList<Filesystem>();
        this.pendingRequests = new PendingRequests();

    	String tempRoot = null;
    	String persistentRoot = null;

    	Activity activity = cordova.getActivity();
    	String packageName = activity.getPackageName();

        String location = preferences.getString("androidpersistentfilelocation", "internal");

    	tempRoot = activity.getCacheDir().getAbsolutePath();
    	if ("internal".equalsIgnoreCase(location)) {
    		persistentRoot = activity.getFilesDir().getAbsolutePath() + "/files/";
    		this.configured = true;
    	} else if ("compatibility".equalsIgnoreCase(location)) {
    		/*
    		 *  Fall-back to compatibility mode -- this is the logic implemented in
    		 *  earlier versions of this plugin, and should be maintained here so
    		 *  that apps which were originally deployed with older versions of the
    		 *  plugin can continue to provide access to files stored under those
    		 *  versions.
    		 */
    		if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    			persistentRoot = Environment.getExternalStorageDirectory().getAbsolutePath();
    			tempRoot = Environment.getExternalStorageDirectory().getAbsolutePath() +
    					"/Android/data/" + packageName + "/cache/";
    		} else {
    			persistentRoot = "/data/data/" + packageName;
    		}
    		this.configured = true;
    	}

    	if (this.configured) {
			// Create the directories if they don't exist.
			File tmpRootFile = new File(tempRoot);
            File persistentRootFile = new File(persistentRoot);
            tmpRootFile.mkdirs();
            persistentRootFile.mkdirs();

    		// Register initial filesystems
    		// Note: The temporary and persistent filesystems need to be the first two
    		// registered, so that they will match window.TEMPORARY and window.PERSISTENT,
    		// per spec.
    		this.registerFilesystem(new LocalFilesystem("temporary", webView.getContext(), webView.getResourceApi(), tmpRootFile));
    		this.registerFilesystem(new LocalFilesystem("persistent", webView.getContext(), webView.getResourceApi(), persistentRootFile));
    		this.registerFilesystem(new ContentFilesystem(webView.getContext(), webView.getResourceApi()));
            this.registerFilesystem(new AssetFilesystem(webView.getContext().getAssets(), webView.getResourceApi()));

            registerExtraFileSystems(getExtraFileSystemsPreference(activity), getAvailableFileSystems(activity));

    		// Initialize static plugin reference for deprecated getEntry method
    		if (filePlugin == null) {
    			FileUtils.filePlugin = this;
    		}
    	} else {
    		LOG.e(LOG_TAG, "File plugin configuration error: Please set AndroidPersistentFileLocation in config.xml to one of \"internal\" (for new applications) or \"compatibility\" (for compatibility with previous versions)");
    		activity.finish();
    	}
    }

    public static FileUtils getFilePlugin() {
		return filePlugin;
	}

	private Filesystem filesystemForURL(LocalFilesystemURL localURL) {
    	if (localURL == null) return null;
    	return filesystemForName(localURL.fsName);
    }

    @Override
    public Uri remapUri(Uri uri) {
        // Remap only cdvfile: URLs (not content:).
        if (!LocalFilesystemURL.FILESYSTEM_PROTOCOL.equals(uri.getScheme())) {
            return null;
        }
        try {
        	LocalFilesystemURL inputURL = LocalFilesystemURL.parse(uri);
        	Filesystem fs = this.filesystemForURL(inputURL);
        	if (fs == null) {
        		return null;
        	}
        	String path = fs.filesystemPathForURL(inputURL);
        	if (path != null) {
        		return Uri.parse("file://" + fs.filesystemPathForURL(inputURL));
        	}
        	return null;
        } catch (IllegalArgumentException e) {
        	return null;
        }
    }

    public boolean execute(String action, final String rawArgs, final CallbackContext callbackContext) {
        if (!configured) {
            callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, "File plugin is not configured. Please see the README.md file for details on how to update config.xml"));
            return true;
        }
        if (action.equals("testSaveLocationExists")) {
            threadhelper(new FileOp() {
                public void run(JSONArray args) {
                    boolean b = DirectoryManager.testSaveLocationExists();
                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, b));
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("getFreeDiskSpace")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) {
                    // The getFreeDiskSpace plugin API is not documented, but some apps call it anyway via exec().
                    // For compatibility it always returns free space in the primary external storage, and
                    // does NOT fallback to internal store if external storage is unavailable.
                    long l = DirectoryManager.getFreeExternalStorageSpace();
                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, l));
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("testFileExists")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException {
                    String fname=args.getString(0);
                    boolean b = DirectoryManager.testFileExists(fname);
                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, b));
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("testDirectoryExists")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException {
                    String fname=args.getString(0);
                    boolean b = DirectoryManager.testFileExists(fname);
                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, b));
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("readAsText")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException, MalformedURLException {
                    String encoding = args.getString(1);
                    int start = args.getInt(2);
                    int end = args.getInt(3);
                    String fname=args.getString(0);
                    readFileAs(fname, start, end, callbackContext, encoding, PluginResult.MESSAGE_TYPE_STRING);
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("readAsDataURL")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException, MalformedURLException  {
                    int start = args.getInt(1);
                    int end = args.getInt(2);
                    String fname=args.getString(0);
                    readFileAs(fname, start, end, callbackContext, null, -1);
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("readAsArrayBuffer")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException, MalformedURLException  {
                    int start = args.getInt(1);
                    int end = args.getInt(2);
                    String fname=args.getString(0);
                    readFileAs(fname, start, end, callbackContext, null, PluginResult.MESSAGE_TYPE_ARRAYBUFFER);
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("readAsBinaryString")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException, MalformedURLException  {
                    int start = args.getInt(1);
                    int end = args.getInt(2);
                    String fname=args.getString(0);
                    readFileAs(fname, start, end, callbackContext, null, PluginResult.MESSAGE_TYPE_BINARYSTRING);
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("write")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException, FileNotFoundException, IOException, NoModificationAllowedException {
                    String fname=args.getString(0);
                    String nativeURL = resolveLocalFileSystemURI(fname).getString("nativeURL");
                    String data=args.getString(1);
                    int offset=args.getInt(2);
                    Boolean isBinary=args.getBoolean(3);

                    if(needPermission(nativeURL, WRITE)) {
                        getWritePermission(rawArgs, ACTION_WRITE, callbackContext);
                    }
                    else {
                        long fileSize = write(fname, data, offset, isBinary);
                        callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, fileSize));
                    }

                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("truncate")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException, FileNotFoundException, IOException, NoModificationAllowedException {
                    String fname=args.getString(0);
                    int offset=args.getInt(1);
                    long fileSize = truncateFile(fname, offset);
                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, fileSize));
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("requestAllFileSystems")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws IOException, JSONException {
                    callbackContext.success(requestAllFileSystems());
                }
            }, rawArgs, callbackContext);
        } else if (action.equals("requestAllPaths")) {
            cordova.getThreadPool().execute(
                    new Runnable() {
                        public void run() {
                        	try {
					callbackContext.success(requestAllPaths());
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
                        }
                    }
            );
        } else if (action.equals("requestFileSystem")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException {
                    int fstype = args.getInt(0);
                    long requiredSize = args.optLong(1);
                    requestFileSystem(fstype, requiredSize, callbackContext);
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("resolveLocalFileSystemURI")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws IOException, JSONException {
                    String fname=args.getString(0);
                    JSONObject obj = resolveLocalFileSystemURI(fname);
                    callbackContext.success(obj);
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("getFileMetadata")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws FileNotFoundException, JSONException, MalformedURLException {
                    String fname=args.getString(0);
                    JSONObject obj = getFileMetadata(fname);
                    callbackContext.success(obj);
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("getParent")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException, IOException {
                    String fname=args.getString(0);
                    JSONObject obj = getParent(fname);
                    callbackContext.success(obj);
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("getDirectory")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException {
                    String dirname = args.getString(0);
                    String path = args.getString(1);
                    String nativeURL = resolveLocalFileSystemURI(dirname).getString("nativeURL");
                    boolean containsCreate = (args.isNull(2)) ? false : args.getJSONObject(2).optBoolean("create", false);

                    if(containsCreate && needPermission(nativeURL, WRITE)) {
                        getWritePermission(rawArgs, ACTION_GET_DIRECTORY, callbackContext);
                    }
                    else if(!containsCreate && needPermission(nativeURL, READ)) {
                        getReadPermission(rawArgs, ACTION_GET_DIRECTORY, callbackContext);
                    }
                    else {
                        JSONObject obj = getFile(dirname, path, args.optJSONObject(2), true);
                        callbackContext.success(obj);
                    }
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("getFile")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException {
                    String dirname = args.getString(0);
                    String path = args.getString(1);
                    String nativeURL = resolveLocalFileSystemURI(dirname).getString("nativeURL");
                    boolean containsCreate = (args.isNull(2)) ? false : args.getJSONObject(2).optBoolean("create", false);

                    if(containsCreate && needPermission(nativeURL, WRITE)) {
                        getWritePermission(rawArgs, ACTION_GET_FILE, callbackContext);
                    }
                    else if(!containsCreate && needPermission(nativeURL, READ)) {
                        getReadPermission(rawArgs, ACTION_GET_FILE, callbackContext);
                    }
                    else {
                        JSONObject obj = getFile(dirname, path, args.optJSONObject(2), false);
                        callbackContext.success(obj);
                    }
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("remove")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException, NoModificationAllowedException, InvalidModificationException, MalformedURLException {
                    String fname=args.getString(0);
                    boolean success = remove(fname);
                    if (success) {
                        callbackContext.success();
                    } else {
                        callbackContext.error(FileUtils.NO_MODIFICATION_ALLOWED_ERR);
                    }
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("removeRecursively")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException, FileExistsException, MalformedURLException, NoModificationAllowedException {
                    String fname=args.getString(0);
                    boolean success = removeRecursively(fname);
                    if (success) {
                        callbackContext.success();
                    } else {
                        callbackContext.error(FileUtils.NO_MODIFICATION_ALLOWED_ERR);
                    }
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("moveTo")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException, NoModificationAllowedException, IOException, InvalidModificationException, EncodingException, FileExistsException {
                    String fname=args.getString(0);
                    String newParent=args.getString(1);
                    String newName=args.getString(2);
                    JSONObject entry = transferTo(fname, newParent, newName, true);
                    callbackContext.success(entry);
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("copyTo")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws JSONException, NoModificationAllowedException, IOException, InvalidModificationException, EncodingException, FileExistsException {
                    String fname=args.getString(0);
                    String newParent=args.getString(1);
                    String newName=args.getString(2);
                    JSONObject entry = transferTo(fname, newParent, newName, false);
                    callbackContext.success(entry);
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("readEntries")) {
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws FileNotFoundException, JSONException, MalformedURLException {
                    String fname=args.getString(0);
                    JSONArray entries = readEntries(fname);
                    callbackContext.success(entries);
                }
            }, rawArgs, callbackContext);
        }
        else if (action.equals("_getLocalFilesystemPath")) {
            // Internal method for testing: Get the on-disk location of a local filesystem url.
            // [Currently used for testing file-transfer]
            threadhelper( new FileOp( ){
                public void run(JSONArray args) throws FileNotFoundException, JSONException, MalformedURLException {
                    String localURLstr = args.getString(0);
                    String fname = filesystemPathForURL(localURLstr);
                    callbackContext.success(fname);
                }
            }, rawArgs, callbackContext);
        }
        else {
            return false;
        }
        return true;
    }

    private void getReadPermission(String rawArgs, int action, CallbackContext callbackContext) {
        int requestCode = pendingRequests.createRequest(rawArgs, action, callbackContext);
        PermissionHelper.requestPermission(this, requestCode, Manifest.permission.READ_EXTERNAL_STORAGE);
    }

    private void getWritePermission(String rawArgs, int action, CallbackContext callbackContext) {
        int requestCode = pendingRequests.createRequest(rawArgs, action, callbackContext);
        PermissionHelper.requestPermission(this, requestCode, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }

    private boolean hasReadPermission() {
        return PermissionHelper.hasPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
    }

    private boolean hasWritePermission() {
        return PermissionHelper.hasPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }

    private boolean needPermission(String nativeURL, int permissionType) throws JSONException {
        JSONObject j = requestAllPaths();
        ArrayList<String> allowedStorageDirectories = new ArrayList<String>();
        allowedStorageDirectories.add(j.getString("applicationDirectory"));
        allowedStorageDirectories.add(j.getString("applicationStorageDirectory"));
        if(j.has("externalApplicationStorageDirectory")) {
            allowedStorageDirectories.add(j.getString("externalApplicationStorageDirectory"));
        }

        if(permissionType == READ && hasReadPermission()) {
            return false;
        }
        else if(permissionType == WRITE && hasWritePermission()) {
            return false;
        }

        // Permission required if the native url lies outside the allowed storage directories
        for(String directory : allowedStorageDirectories) {
            if(nativeURL.startsWith(directory)) {
                return false;
            }
        }
        return true;
    }


    public LocalFilesystemURL resolveNativeUri(Uri nativeUri) {
        LocalFilesystemURL localURL = null;

        // Try all installed filesystems. Return the best matching URL
        // (determined by the shortest resulting URL)
        for (Filesystem fs : filesystems) {
            LocalFilesystemURL url = fs.toLocalUri(nativeUri);
            if (url != null) {
                // A shorter fullPath implies that the filesystem is a better
                // match for the local path than the previous best.
                if (localURL == null || (url.uri.toString().length() < localURL.toString().length())) {
                    localURL = url;
                }
            }
        }
        return localURL;
    }

    /*
     * These two native-only methods can be used by other plugins to translate between
     * device file system paths and URLs. By design, there is no direct JavaScript
     * interface to these methods.
     */

    public String filesystemPathForURL(String localURLstr) throws MalformedURLException {
        try {
            LocalFilesystemURL inputURL = LocalFilesystemURL.parse(localURLstr);
            Filesystem fs = this.filesystemForURL(inputURL);
            if (fs == null) {
                throw new MalformedURLException("No installed handlers for this URL");
            }
            return fs.filesystemPathForURL(inputURL);
        } catch (IllegalArgumentException e) {
            MalformedURLException mue = new MalformedURLException("Unrecognized filesystem URL");
            mue.initCause(e);
        	throw mue;
        }
    }

    public LocalFilesystemURL filesystemURLforLocalPath(String localPath) {
        LocalFilesystemURL localURL = null;
        int shortestFullPath = 0;

        // Try all installed filesystems. Return the best matching URL
        // (determined by the shortest resulting URL)
        for (Filesystem fs: filesystems) {
            LocalFilesystemURL url = fs.URLforFilesystemPath(localPath);
            if (url != null) {
                // A shorter fullPath implies that the filesystem is a better
                // match for the local path than the previous best.
                if (localURL == null || (url.path.length() < shortestFullPath)) {
                    localURL = url;
                    shortestFullPath = url.path.length();
                }
            }
        }
        return localURL;
    }


	/* helper to execute functions async and handle the result codes
     *
     */
    private void threadhelper(final FileOp f, final String rawArgs, final CallbackContext callbackContext){
        cordova.getThreadPool().execute(new Runnable() {
            public void run() {
                try {
                    JSONArray args = new JSONArray(rawArgs);
                    f.run(args);
                } catch ( Exception e) {
                    if( e instanceof EncodingException){
                        callbackContext.error(FileUtils.ENCODING_ERR);
                    } else if(e instanceof FileNotFoundException) {
                        callbackContext.error(FileUtils.NOT_FOUND_ERR);
                    } else if(e instanceof FileExistsException) {
                        callbackContext.error(FileUtils.PATH_EXISTS_ERR);
                    } else if(e instanceof NoModificationAllowedException ) {
                        callbackContext.error(FileUtils.NO_MODIFICATION_ALLOWED_ERR);
                    } else if(e instanceof InvalidModificationException ) {
                        callbackContext.error(FileUtils.INVALID_MODIFICATION_ERR);
                    } else if(e instanceof MalformedURLException ) {
                        callbackContext.error(FileUtils.ENCODING_ERR);
                    } else if(e instanceof IOException ) {
                        callbackContext.error(FileUtils.INVALID_MODIFICATION_ERR);
                    } else if(e instanceof EncodingException ) {
                        callbackContext.error(FileUtils.ENCODING_ERR);
                    } else if(e instanceof TypeMismatchException ) {
                        callbackContext.error(FileUtils.TYPE_MISMATCH_ERR);
                    } else if(e instanceof JSONException ) {
                        callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
                    } else if (e instanceof SecurityException) {
                        callbackContext.error(FileUtils.SECURITY_ERR);
                    } else {
                        e.printStackTrace();
                    	callbackContext.error(FileUtils.UNKNOWN_ERR);
                    }
                }
            }
        });
    }

    /**
     * Allows the user to look up the Entry for a file or directory referred to by a local URI.
     *
     * @param uriString of the file/directory to look up
     * @return a JSONObject representing a Entry from the filesystem
     * @throws MalformedURLException if the url is not valid
     * @throws FileNotFoundException if the file does not exist
     * @throws IOException if the user can't read the file
     * @throws JSONException
     */
    private JSONObject resolveLocalFileSystemURI(String uriString) throws IOException, JSONException {
        if (uriString == null) {
            throw new MalformedURLException("Unrecognized filesystem URL");
        }
        Uri uri = Uri.parse(uriString);
        boolean isNativeUri = false;

        LocalFilesystemURL inputURL = LocalFilesystemURL.parse(uri);
        if (inputURL == null) {
            /* Check for file://, content:// urls */
            inputURL = resolveNativeUri(uri);
            isNativeUri = true;
        }

        try {
            Filesystem fs = this.filesystemForURL(inputURL);
            if (fs == null) {
                throw new MalformedURLException("No installed handlers for this URL");
            }
            if (fs.exists(inputURL)) {
                if (!isNativeUri) {
                    // If not already resolved as native URI, resolve to a native URI and back to
                    // fix the terminating slash based on whether the entry is a directory or file.
                    inputURL = fs.toLocalUri(fs.toNativeUri(inputURL));
                }

                return fs.getEntryForLocalURL(inputURL);
            }
        } catch (IllegalArgumentException e) {
            MalformedURLException mue = new MalformedURLException("Unrecognized filesystem URL");
            mue.initCause(e);
        	throw mue;
        }
        throw new FileNotFoundException();
    }

    /**
     * Read the list of files from this directory.
     *
     * @return a JSONArray containing JSONObjects that represent Entry objects.
     * @throws FileNotFoundException if the directory is not found.
     * @throws JSONException
     * @throws MalformedURLException
     */
    private JSONArray readEntries(String baseURLstr) throws FileNotFoundException, JSONException, MalformedURLException {
        try {
        	LocalFilesystemURL inputURL = LocalFilesystemURL.parse(baseURLstr);
        	Filesystem fs = this.filesystemForURL(inputURL);
        	if (fs == null) {
        		throw new MalformedURLException("No installed handlers for this URL");
        	}
        	return fs.readEntriesAtLocalURL(inputURL);

        } catch (IllegalArgumentException e) {
            MalformedURLException mue = new MalformedURLException("Unrecognized filesystem URL");
            mue.initCause(e);
        	throw mue;
        }
    }

    /**
     * A setup method that handles the move/copy of files/directories
     *
     * @param newName for the file directory to be called, if null use existing file name
     * @param move if false do a copy, if true do a move
     * @return a Entry object
     * @throws NoModificationAllowedException
     * @throws IOException
     * @throws InvalidModificationException
     * @throws EncodingException
     * @throws JSONException
     * @throws FileExistsException
     */
    private JSONObject transferTo(String srcURLstr, String destURLstr, String newName, boolean move) throws JSONException, NoModificationAllowedException, IOException, InvalidModificationException, EncodingException, FileExistsException {
        if (srcURLstr == null || destURLstr == null) {
            // either no source or no destination provided
        	throw new FileNotFoundException();
        }

        LocalFilesystemURL srcURL = LocalFilesystemURL.parse(srcURLstr);
        LocalFilesystemURL destURL = LocalFilesystemURL.parse(destURLstr);

        Filesystem srcFs = this.filesystemForURL(srcURL);
        Filesystem destFs = this.filesystemForURL(destURL);

        // Check for invalid file name
        if (newName != null && newName.contains(":")) {
            throw new EncodingException("Bad file name");
        }

        return destFs.copyFileToURL(destURL, newName, srcFs, srcURL, move);
    }

    /**
     * Deletes a directory and all of its contents, if any. In the event of an error
     * [e.g. trying to delete a directory that contains a file that cannot be removed],
     * some of the contents of the directory may be deleted.
     * It is an error to attempt to delete the root directory of a filesystem.
     *
     * @return a boolean representing success of failure
     * @throws FileExistsException
     * @throws NoModificationAllowedException
     * @throws MalformedURLException
     */
    private boolean removeRecursively(String baseURLstr) throws FileExistsException, NoModificationAllowedException, MalformedURLException {
        try {
        	LocalFilesystemURL inputURL = LocalFilesystemURL.parse(baseURLstr);
        	// You can't delete the root directory.
        	if ("".equals(inputURL.path) || "/".equals(inputURL.path)) {
        		throw new NoModificationAllowedException("You can't delete the root directory");
        	}

        	Filesystem fs = this.filesystemForURL(inputURL);
        	if (fs == null) {
        		throw new MalformedURLException("No installed handlers for this URL");
        	}
        	return fs.recursiveRemoveFileAtLocalURL(inputURL);

        } catch (IllegalArgumentException e) {
            MalformedURLException mue = new MalformedURLException("Unrecognized filesystem URL");
            mue.initCause(e);
        	throw mue;
        }
    }


    /**
     * Deletes a file or directory. It is an error to attempt to delete a directory that is not empty.
     * It is an error to attempt to delete the root directory of a filesystem.
     *
     * @return a boolean representing success of failure
     * @throws NoModificationAllowedException
     * @throws InvalidModificationException
     * @throws MalformedURLException
     */
    private boolean remove(String baseURLstr) throws NoModificationAllowedException, InvalidModificationException, MalformedURLException {
        try {
        	LocalFilesystemURL inputURL = LocalFilesystemURL.parse(baseURLstr);
        	// You can't delete the root directory.
        	if ("".equals(inputURL.path) || "/".equals(inputURL.path)) {

        		throw new NoModificationAllowedException("You can't delete the root directory");
        	}

        	Filesystem fs = this.filesystemForURL(inputURL);
        	if (fs == null) {
        		throw new MalformedURLException("No installed handlers for this URL");
        	}
        	return fs.removeFileAtLocalURL(inputURL);

        } catch (IllegalArgumentException e) {
            MalformedURLException mue = new MalformedURLException("Unrecognized filesystem URL");
            mue.initCause(e);
        	throw mue;
        }
    }

    /**
     * Creates or looks up a file.
     *
     * @param baseURLstr base directory
     * @param path file/directory to lookup or create
     * @param options specify whether to create or not
     * @param directory if true look up directory, if false look up file
     * @return a Entry object
     * @throws FileExistsException
     * @throws IOException
     * @throws TypeMismatchException
     * @throws EncodingException
     * @throws JSONException
     */
    private JSONObject getFile(String baseURLstr, String path, JSONObject options, boolean directory) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException {
        try {
        	LocalFilesystemURL inputURL = LocalFilesystemURL.parse(baseURLstr);
        	Filesystem fs = this.filesystemForURL(inputURL);
        	if (fs == null) {
        		throw new MalformedURLException("No installed handlers for this URL");
        	}
        	return fs.getFileForLocalURL(inputURL, path, options, directory);

        } catch (IllegalArgumentException e) {
            MalformedURLException mue = new MalformedURLException("Unrecognized filesystem URL");
            mue.initCause(e);
        	throw mue;
        }

    }

    /**
     * Look up the parent DirectoryEntry containing this Entry.
     * If this Entry is the root of its filesystem, its parent is itself.
     */
    private JSONObject getParent(String baseURLstr) throws JSONException, IOException {
        try {
        	LocalFilesystemURL inputURL = LocalFilesystemURL.parse(baseURLstr);
        	Filesystem fs = this.filesystemForURL(inputURL);
        	if (fs == null) {
        		throw new MalformedURLException("No installed handlers for this URL");
        	}
        	return fs.getParentForLocalURL(inputURL);

        } catch (IllegalArgumentException e) {
            MalformedURLException mue = new MalformedURLException("Unrecognized filesystem URL");
            mue.initCause(e);
        	throw mue;
        }
    }

    /**
     * Returns a File that represents the current state of the file that this FileEntry represents.
     *
     * @return returns a JSONObject represent a W3C File object
     */
    private JSONObject getFileMetadata(String baseURLstr) throws FileNotFoundException, JSONException, MalformedURLException {
        try {
        	LocalFilesystemURL inputURL = LocalFilesystemURL.parse(baseURLstr);
        	Filesystem fs = this.filesystemForURL(inputURL);
        	if (fs == null) {
        		throw new MalformedURLException("No installed handlers for this URL");
        	}
        	return fs.getFileMetadataForLocalURL(inputURL);

        } catch (IllegalArgumentException e) {
            MalformedURLException mue = new MalformedURLException("Unrecognized filesystem URL");
            mue.initCause(e);
        	throw mue;
        }
    }

    /**
     * Requests a filesystem in which to store application data.
     *
     * @param type of file system requested
     * @param requiredSize required free space in the file system in bytes
     * @param callbackContext context for returning the result or error
     * @throws JSONException
     */
    private void requestFileSystem(int type, long requiredSize, final CallbackContext callbackContext) throws JSONException {
        Filesystem rootFs = null;
        try {
            rootFs = this.filesystems.get(type);
        } catch (ArrayIndexOutOfBoundsException e) {
            // Pass null through
        }
        if (rootFs == null) {
            callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, FileUtils.NOT_FOUND_ERR));
        } else {
            // If a nonzero required size was specified, check that the retrieved filesystem has enough free space.
            long availableSize = 0;
            if (requiredSize > 0) {
                availableSize = rootFs.getFreeSpaceInBytes();
            }

            if (availableSize < requiredSize) {
                callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, FileUtils.QUOTA_EXCEEDED_ERR));
            } else {
                JSONObject fs = new JSONObject();
                fs.put("name", rootFs.name);
                fs.put("root", rootFs.getRootEntry());
                callbackContext.success(fs);
            }
        }
    }

    /**
     * Requests a filesystem in which to store application data.
     *
     * @return a JSONObject representing the file system
     */
    private JSONArray requestAllFileSystems() throws IOException, JSONException {
        JSONArray ret = new JSONArray();
        for (Filesystem fs : filesystems) {
            ret.put(fs.getRootEntry());
        }
        return ret;
    }

    private static String toDirUrl(File f) {
        return Uri.fromFile(f).toString() + '/';
    }

    private JSONObject requestAllPaths() throws JSONException {
        Context context = cordova.getActivity();
        JSONObject ret = new JSONObject();
        ret.put("applicationDirectory", "file:///android_asset/");
        ret.put("applicationStorageDirectory", toDirUrl(context.getFilesDir().getParentFile()));
        ret.put("dataDirectory", toDirUrl(context.getFilesDir()));
        ret.put("cacheDirectory", toDirUrl(context.getCacheDir()));
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
          try {
            ret.put("externalApplicationStorageDirectory", toDirUrl(context.getExternalFilesDir(null).getParentFile()));
            ret.put("externalDataDirectory", toDirUrl(context.getExternalFilesDir(null)));
            ret.put("externalCacheDirectory", toDirUrl(context.getExternalCacheDir()));
            ret.put("externalRootDirectory", toDirUrl(Environment.getExternalStorageDirectory()));
          }
          catch(NullPointerException e) {
            /* If external storage is unavailable, context.getExternal* returns null */
              LOG.d(LOG_TAG, "Unable to access these paths, most liklely due to USB storage");
          }
        }
        return ret;
    }

   /**
     * Returns a JSON object representing the given File. Internal APIs should be modified
     * to use URLs instead of raw FS paths wherever possible, when interfacing with this plugin.
     *
     * @param file the File to convert
     * @return a JSON representation of the given File
     * @throws JSONException
     */
    public JSONObject getEntryForFile(File file) throws JSONException {
        JSONObject entry;

        for (Filesystem fs : filesystems) {
             entry = fs.makeEntryForFile(file);
             if (entry != null) {
                 return entry;
             }
        }
        return null;
    }

    /**
     * Returns a JSON object representing the given File. Deprecated, as this is only used by
     * FileTransfer, and because it is a static method that should really be an instance method,
     * since it depends on the actual filesystem roots in use. Internal APIs should be modified
     * to use URLs instead of raw FS paths wherever possible, when interfacing with this plugin.
     *
     * @param file the File to convert
     * @return a JSON representation of the given File
     * @throws JSONException
     */
    @Deprecated
    public static JSONObject getEntry(File file) throws JSONException {
 		if (getFilePlugin() != null) {
             return getFilePlugin().getEntryForFile(file);
		}
		return null;
    }

    /**
     * Read the contents of a file.
     * This is done in a background thread; the result is sent to the callback.
     *
     * @param start             Start position in the file.
     * @param end               End position to stop at (exclusive).
     * @param callbackContext   The context through which to send the result.
     * @param encoding          The encoding to return contents as.  Typical value is UTF-8. (see http://www.iana.org/assignments/character-sets)
     * @param resultType        The desired type of data to send to the callback.
     * @return                  Contents of file.
     */
    public void readFileAs(final String srcURLstr, final int start, final int end, final CallbackContext callbackContext, final String encoding, final int resultType) throws MalformedURLException {
        try {
        	LocalFilesystemURL inputURL = LocalFilesystemURL.parse(srcURLstr);
        	Filesystem fs = this.filesystemForURL(inputURL);
        	if (fs == null) {
        		throw new MalformedURLException("No installed handlers for this URL");
        	}

            fs.readFileAtURL(inputURL, start, end, new Filesystem.ReadFileCallback() {
                public void handleData(InputStream inputStream, String contentType) {
            		try {
                        ByteArrayOutputStream os = new ByteArrayOutputStream();
                        final int BUFFER_SIZE = 8192;
                        byte[] buffer = new byte[BUFFER_SIZE];

                        for (;;) {
                            int bytesRead = inputStream.read(buffer, 0, BUFFER_SIZE);

                            if (bytesRead <= 0) {
                                break;
                            }
                            os.write(buffer, 0, bytesRead);
                        }

            			PluginResult result;
            			switch (resultType) {
            			case PluginResult.MESSAGE_TYPE_STRING:
                            result = new PluginResult(PluginResult.Status.OK, os.toString(encoding));
            				break;
            			case PluginResult.MESSAGE_TYPE_ARRAYBUFFER:
                            result = new PluginResult(PluginResult.Status.OK, os.toByteArray());
            				break;
            			case PluginResult.MESSAGE_TYPE_BINARYSTRING:
                            result = new PluginResult(PluginResult.Status.OK, os.toByteArray(), true);
            				break;
            			default: // Base64.
                        byte[] base64 = Base64.encode(os.toByteArray(), Base64.NO_WRAP);
            			String s = "data:" + contentType + ";base64," + new String(base64, "US-ASCII");
            			result = new PluginResult(PluginResult.Status.OK, s);
            			}

            			callbackContext.sendPluginResult(result);
            		} catch (IOException e) {
            			LOG.d(LOG_TAG, e.getLocalizedMessage());
            			callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, NOT_READABLE_ERR));
                    }
            	}
            });


        } catch (IllegalArgumentException e) {
            MalformedURLException mue = new MalformedURLException("Unrecognized filesystem URL");
            mue.initCause(e);
        	throw mue;
        } catch (FileNotFoundException e) {
        	callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, NOT_FOUND_ERR));
        } catch (IOException e) {
        	LOG.d(LOG_TAG, e.getLocalizedMessage());
        	callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, NOT_READABLE_ERR));
        }
    }


    /**
     * Write contents of file.
     *
     * @param data				The contents of the file.
     * @param offset			The position to begin writing the file.
     * @param isBinary          True if the file contents are base64-encoded binary data
     */
    /**/
    public long write(String srcURLstr, String data, int offset, boolean isBinary) throws FileNotFoundException, IOException, NoModificationAllowedException {
        try {
        	LocalFilesystemURL inputURL = LocalFilesystemURL.parse(srcURLstr);
        	Filesystem fs = this.filesystemForURL(inputURL);
        	if (fs == null) {
        		throw new MalformedURLException("No installed handlers for this URL");
        	}

            long x = fs.writeToFileAtURL(inputURL, data, offset, isBinary); LOG.d("TEST",srcURLstr + ": "+x); return x;
        } catch (IllegalArgumentException e) {
            MalformedURLException mue = new MalformedURLException("Unrecognized filesystem URL");
            mue.initCause(e);
        	throw mue;
        }

    }

    /**
     * Truncate the file to size
     */
    private long truncateFile(String srcURLstr, long size) throws FileNotFoundException, IOException, NoModificationAllowedException {
        try {
        	LocalFilesystemURL inputURL = LocalFilesystemURL.parse(srcURLstr);
        	Filesystem fs = this.filesystemForURL(inputURL);
        	if (fs == null) {
        		throw new MalformedURLException("No installed handlers for this URL");
        	}

            return fs.truncateFileAtURL(inputURL, size);
        } catch (IllegalArgumentException e) {
            MalformedURLException mue = new MalformedURLException("Unrecognized filesystem URL");
            mue.initCause(e);
        	throw mue;
        }
    }


    /*
     * Handle the response
     */

    public void onRequestPermissionResult(int requestCode, String[] permissions,
                                          int[] grantResults) throws JSONException {

        final PendingRequests.Request req = pendingRequests.getAndRemove(requestCode);
        if (req != null) {
            for(int r:grantResults)
            {
                if(r == PackageManager.PERMISSION_DENIED)
                {
                    req.getCallbackContext().sendPluginResult(new PluginResult(PluginResult.Status.ERROR, SECURITY_ERR));
                    return;
                }
            }
            switch(req.getAction())
            {
                case ACTION_GET_FILE:
                    threadhelper( new FileOp( ){
                        public void run(JSONArray args) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException {
                            String dirname = args.getString(0);

                            String path = args.getString(1);
                            JSONObject obj = getFile(dirname, path, args.optJSONObject(2), false);
                            req.getCallbackContext().success(obj);
                        }
                    }, req.getRawArgs(), req.getCallbackContext());
                    break;
                case ACTION_GET_DIRECTORY:
                    threadhelper( new FileOp( ){
                        public void run(JSONArray args) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException {
                            String dirname = args.getString(0);

                            String path = args.getString(1);
                            JSONObject obj = getFile(dirname, path, args.optJSONObject(2), true);
                            req.getCallbackContext().success(obj);
                        }
                    }, req.getRawArgs(), req.getCallbackContext());
                    break;
                case ACTION_WRITE:
                    threadhelper( new FileOp( ){
                        public void run(JSONArray args) throws JSONException, FileNotFoundException, IOException, NoModificationAllowedException {
                            String fname=args.getString(0);
                            String data=args.getString(1);
                            int offset=args.getInt(2);
                            Boolean isBinary=args.getBoolean(3);
                            long fileSize = write(fname, data, offset, isBinary);
                            req.getCallbackContext().sendPluginResult(new PluginResult(PluginResult.Status.OK, fileSize));
                        }
                    }, req.getRawArgs(), req.getCallbackContext());
                    break;
            }
        } else {
           LOG.d(LOG_TAG, "Received permission callback for unknown request code");
        }
    }
}
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
 */
package org.apache.cordova.file;

import android.net.Uri;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;

import org.apache.cordova.CordovaResourceApi;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public abstract class Filesystem {

    protected final Uri rootUri;
    protected final CordovaResourceApi resourceApi;
    public final String name;
    private JSONObject rootEntry;

    public Filesystem(Uri rootUri, String name, CordovaResourceApi resourceApi) {
        this.rootUri = rootUri;
        this.name = name;
        this.resourceApi = resourceApi;
    }

    public interface ReadFileCallback {
		public void handleData(InputStream inputStream, String contentType) throws IOException;
	}

    public static JSONObject makeEntryForURL(LocalFilesystemURL inputURL, Uri nativeURL) {
        try {
            String path = inputURL.path;
            int end = path.endsWith("/") ? 1 : 0;
            String[] parts = path.substring(0, path.length() - end).split("/+");
            String fileName = parts[parts.length - 1];

            JSONObject entry = new JSONObject();
            entry.put("isFile", !inputURL.isDirectory);
            entry.put("isDirectory", inputURL.isDirectory);
            entry.put("name", fileName);
            entry.put("fullPath", path);
            // The file system can't be specified, as it would lead to an infinite loop,
            // but the filesystem name can be.
            entry.put("filesystemName", inputURL.fsName);
            // Backwards compatibility
            entry.put("filesystem", "temporary".equals(inputURL.fsName) ? 0 : 1);

            String nativeUrlStr = nativeURL.toString();
            if (inputURL.isDirectory && !nativeUrlStr.endsWith("/")) {
                nativeUrlStr += "/";
            }
            entry.put("nativeURL", nativeUrlStr);
            return entry;
        } catch (JSONException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    public JSONObject makeEntryForURL(LocalFilesystemURL inputURL) {
        Uri nativeUri = toNativeUri(inputURL);
        return nativeUri == null ? null : makeEntryForURL(inputURL, nativeUri);
    }

    public JSONObject makeEntryForNativeUri(Uri nativeUri) {
        LocalFilesystemURL inputUrl = toLocalUri(nativeUri);
        return inputUrl == null ? null : makeEntryForURL(inputUrl, nativeUri);
    }

    public JSONObject getEntryForLocalURL(LocalFilesystemURL inputURL) throws IOException {
        return makeEntryForURL(inputURL);
    }

    public JSONObject makeEntryForFile(File file) {
        return makeEntryForNativeUri(Uri.fromFile(file));
    }

    abstract JSONObject getFileForLocalURL(LocalFilesystemURL inputURL, String path,
			JSONObject options, boolean directory) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException;

	abstract boolean removeFileAtLocalURL(LocalFilesystemURL inputURL) throws InvalidModificationException, NoModificationAllowedException;

	abstract boolean recursiveRemoveFileAtLocalURL(LocalFilesystemURL inputURL) throws FileExistsException, NoModificationAllowedException;

	abstract LocalFilesystemURL[] listChildren(LocalFilesystemURL inputURL) throws FileNotFoundException;

    public final JSONArray readEntriesAtLocalURL(LocalFilesystemURL inputURL) throws FileNotFoundException {
        LocalFilesystemURL[] children = listChildren(inputURL);
        JSONArray entries = new JSONArray();
        if (children != null) {
            for (LocalFilesystemURL url : children) {
                entries.put(makeEntryForURL(url));
            }
        }
        return entries;
    }

	abstract JSONObject getFileMetadataForLocalURL(LocalFilesystemURL inputURL) throws FileNotFoundException;

    public Uri getRootUri() {
        return rootUri;
    }

    public boolean exists(LocalFilesystemURL inputURL) {
        try {
            getFileMetadataForLocalURL(inputURL);
        } catch (FileNotFoundException e) {
            return false;
        }
        return true;
    }

    public Uri nativeUriForFullPath(String fullPath) {
        Uri ret = null;
        if (fullPath != null) {
            String encodedPath = Uri.fromFile(new File(fullPath)).getEncodedPath();
            if (encodedPath.startsWith("/")) {
                encodedPath = encodedPath.substring(1);
            }
            ret = rootUri.buildUpon().appendEncodedPath(encodedPath).build();
        }
        return ret;
    }

    public LocalFilesystemURL localUrlforFullPath(String fullPath) {
        Uri nativeUri = nativeUriForFullPath(fullPath);
        if (nativeUri != null) {
            return toLocalUri(nativeUri);
        }
        return null;
    }

    /**
     * Removes multiple repeated //s, and collapses processes ../s.
     */
    protected static String normalizePath(String rawPath) {
        // If this is an absolute path, trim the leading "/" and replace it later
        boolean isAbsolutePath = rawPath.startsWith("/");
        if (isAbsolutePath) {
            rawPath = rawPath.replaceFirst("/+", "");
        }
        ArrayList<String> components = new ArrayList<String>(Arrays.asList(rawPath.split("/+")));
        for (int index = 0; index < components.size(); ++index) {
            if (components.get(index).equals("..")) {
                components.remove(index);
                if (index > 0) {
                    components.remove(index-1);
                    --index;
                }
            }
        }
        StringBuilder normalizedPath = new StringBuilder();
        for(String component: components) {
            normalizedPath.append("/");
            normalizedPath.append(component);
        }
        if (isAbsolutePath) {
            return normalizedPath.toString();
        } else {
            return normalizedPath.toString().substring(1);
        }
    }

    /**
     * Gets the free space in bytes available on this filesystem.
     * Subclasses may override this method to return nonzero free space.
     */
    public long getFreeSpaceInBytes() {
        return 0;
    }

    public abstract Uri toNativeUri(LocalFilesystemURL inputURL);
    public abstract LocalFilesystemURL toLocalUri(Uri inputURL);

    public JSONObject getRootEntry() {
        if (rootEntry == null) {
            rootEntry = makeEntryForNativeUri(rootUri);
        }
        return rootEntry;
    }

	public JSONObject getParentForLocalURL(LocalFilesystemURL inputURL) throws IOException {
        Uri parentUri = inputURL.uri;
        String parentPath = new File(inputURL.uri.getPath()).getParent();
        if (!"/".equals(parentPath)) {
            parentUri = inputURL.uri.buildUpon().path(parentPath + '/').build();
		}
		return getEntryForLocalURL(LocalFilesystemURL.parse(parentUri));
	}

    protected LocalFilesystemURL makeDestinationURL(String newName, LocalFilesystemURL srcURL, LocalFilesystemURL destURL, boolean isDirectory) {
        // I know this looks weird but it is to work around a JSON bug.
        if ("null".equals(newName) || "".equals(newName)) {
            newName = srcURL.uri.getLastPathSegment();;
        }

        String newDest = destURL.uri.toString();
        if (newDest.endsWith("/")) {
            newDest = newDest + newName;
        } else {
            newDest = newDest + "/" + newName;
        }
        if (isDirectory) {
            newDest += '/';
        }
        return LocalFilesystemURL.parse(newDest);
    }

	/* Read a source URL (possibly from a different filesystem, srcFs,) and copy it to
	 * the destination URL on this filesystem, optionally with a new filename.
	 * If move is true, then this method should either perform an atomic move operation
	 * or remove the source file when finished.
	 */
    public JSONObject copyFileToURL(LocalFilesystemURL destURL, String newName,
            Filesystem srcFs, LocalFilesystemURL srcURL, boolean move) throws IOException, InvalidModificationException, JSONException, NoModificationAllowedException, FileExistsException {
        // First, check to see that we can do it
        if (move && !srcFs.canRemoveFileAtLocalURL(srcURL)) {
            throw new NoModificationAllowedException("Cannot move file at source URL");
        }
        final LocalFilesystemURL destination = makeDestinationURL(newName, srcURL, destURL, srcURL.isDirectory);

        Uri srcNativeUri = srcFs.toNativeUri(srcURL);

        CordovaResourceApi.OpenForReadResult ofrr = resourceApi.openForRead(srcNativeUri);
        OutputStream os = null;
        try {
            os = getOutputStreamForURL(destination);
        } catch (IOException e) {
            ofrr.inputStream.close();
            throw e;
        }
        // Closes streams.
        resourceApi.copyResource(ofrr, os);

        if (move) {
            srcFs.removeFileAtLocalURL(srcURL);
        }
        return getEntryForLocalURL(destination);
    }

    public OutputStream getOutputStreamForURL(LocalFilesystemURL inputURL) throws IOException {
        return resourceApi.openOutputStream(toNativeUri(inputURL));
    }

    public void readFileAtURL(LocalFilesystemURL inputURL, long start, long end,
                              ReadFileCallback readFileCallback) throws IOException {
        CordovaResourceApi.OpenForReadResult ofrr = resourceApi.openForRead(toNativeUri(inputURL));
        if (end < 0) {
            end = ofrr.length;
        }
        long numBytesToRead = end - start;
        try {
            if (start > 0) {
                ofrr.inputStream.skip(start);
            }
            InputStream inputStream = ofrr.inputStream;
            if (end < ofrr.length) {
                inputStream = new LimitedInputStream(inputStream, numBytesToRead);
            }
            readFileCallback.handleData(inputStream, ofrr.mimeType);
        } finally {
            ofrr.inputStream.close();
        }
    }

	abstract long writeToFileAtURL(LocalFilesystemURL inputURL, String data, int offset,
			boolean isBinary) throws NoModificationAllowedException, IOException;

	abstract long truncateFileAtURL(LocalFilesystemURL inputURL, long size)
			throws IOException, NoModificationAllowedException;

	// This method should return null if filesystem urls cannot be mapped to paths
	abstract String filesystemPathForURL(LocalFilesystemURL url);

	abstract LocalFilesystemURL URLforFilesystemPath(String path);

	abstract boolean canRemoveFileAtLocalURL(LocalFilesystemURL inputURL);

    protected class LimitedInputStream extends FilterInputStream {
        long numBytesToRead;
        public LimitedInputStream(InputStream in, long numBytesToRead) {
            super(in);
            this.numBytesToRead = numBytesToRead;
        }
        @Override
        public int read() throws IOException {
            if (numBytesToRead <= 0) {
                return -1;
            }
            numBytesToRead--;
            return in.read();
        }
        @Override
        public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException {
            if (numBytesToRead <= 0) {
                return -1;
            }
            int bytesToRead = byteCount;
            if (byteCount > numBytesToRead) {
                bytesToRead = (int)numBytesToRead; // Cast okay; long is less than int here.
            }
            int numBytesRead = in.read(buffer, byteOffset, bytesToRead);
            numBytesToRead -= numBytesRead;
            return numBytesRead;
        }
    }
}
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
*/


package org.apache.cordova.file;

@SuppressWarnings("serial")
public class InvalidModificationException extends Exception {

    public InvalidModificationException(String message) {
        super(message);
    }

}
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
 */
package org.apache.cordova.file;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import org.apache.cordova.CordovaResourceApi;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.Build;
import android.os.Environment;
import android.util.Base64;
import android.net.Uri;
import android.content.Context;
import android.content.Intent;

import java.nio.charset.Charset;

public class LocalFilesystem extends Filesystem {
    private final Context context;

    public LocalFilesystem(String name, Context context, CordovaResourceApi resourceApi, File fsRoot) {
        super(Uri.fromFile(fsRoot).buildUpon().appendEncodedPath("").build(), name, resourceApi);
        this.context = context;
    }

    public String filesystemPathForFullPath(String fullPath) {
	    return new File(rootUri.getPath(), fullPath).toString();
	}

	@Override
	public String filesystemPathForURL(LocalFilesystemURL url) {
		return filesystemPathForFullPath(url.path);
	}

	private String fullPathForFilesystemPath(String absolutePath) {
		if (absolutePath != null && absolutePath.startsWith(rootUri.getPath())) {
			return absolutePath.substring(rootUri.getPath().length() - 1);
		}
		return null;
	}

    @Override
    public Uri toNativeUri(LocalFilesystemURL inputURL) {
        return nativeUriForFullPath(inputURL.path);
    }

    @Override
    public LocalFilesystemURL toLocalUri(Uri inputURL) {
        if (!"file".equals(inputURL.getScheme())) {
            return null;
        }
        File f = new File(inputURL.getPath());
        // Removes and duplicate /s (e.g. file:///a//b/c)
        Uri resolvedUri = Uri.fromFile(f);
        String rootUriNoTrailingSlash = rootUri.getEncodedPath();
        rootUriNoTrailingSlash = rootUriNoTrailingSlash.substring(0, rootUriNoTrailingSlash.length() - 1);
        if (!resolvedUri.getEncodedPath().startsWith(rootUriNoTrailingSlash)) {
            return null;
        }
        String subPath = resolvedUri.getEncodedPath().substring(rootUriNoTrailingSlash.length());
        // Strip leading slash
        if (!subPath.isEmpty()) {
            subPath = subPath.substring(1);
        }
        Uri.Builder b = new Uri.Builder()
            .scheme(LocalFilesystemURL.FILESYSTEM_PROTOCOL)
            .authority("localhost")
            .path(name);
        if (!subPath.isEmpty()) {
            b.appendEncodedPath(subPath);
        }
        if (f.isDirectory()) {
            // Add trailing / for directories.
            b.appendEncodedPath("");
        }
        return LocalFilesystemURL.parse(b.build());
    }

	@Override
	public LocalFilesystemURL URLforFilesystemPath(String path) {
	    return localUrlforFullPath(fullPathForFilesystemPath(path));
	}

	@Override
	public JSONObject getFileForLocalURL(LocalFilesystemURL inputURL,
			String path, JSONObject options, boolean directory) throws FileExistsException, IOException, TypeMismatchException, EncodingException, JSONException {
        boolean create = false;
        boolean exclusive = false;

        if (options != null) {
            create = options.optBoolean("create");
            if (create) {
                exclusive = options.optBoolean("exclusive");
            }
        }

        // Check for a ":" character in the file to line up with BB and iOS
        if (path.contains(":")) {
            throw new EncodingException("This path has an invalid \":\" in it.");
        }

        LocalFilesystemURL requestedURL;

        // Check whether the supplied path is absolute or relative
        if (directory && !path.endsWith("/")) {
            path += "/";
        }
        if (path.startsWith("/")) {
        	requestedURL = localUrlforFullPath(normalizePath(path));
        } else {
        	requestedURL = localUrlforFullPath(normalizePath(inputURL.path + "/" + path));
        }

        File fp = new File(this.filesystemPathForURL(requestedURL));

        if (create) {
            if (exclusive && fp.exists()) {
                throw new FileExistsException("create/exclusive fails");
            }
            if (directory) {
                fp.mkdir();
            } else {
                fp.createNewFile();
            }
            if (!fp.exists()) {
                throw new FileExistsException("create fails");
            }
        }
        else {
            if (!fp.exists()) {
                throw new FileNotFoundException("path does not exist");
            }
            if (directory) {
                if (fp.isFile()) {
                    throw new TypeMismatchException("path doesn't exist or is file");
                }
            } else {
                if (fp.isDirectory()) {
                    throw new TypeMismatchException("path doesn't exist or is directory");
                }
            }
        }

        // Return the directory
        return makeEntryForURL(requestedURL);
	}

	@Override
	public boolean removeFileAtLocalURL(LocalFilesystemURL inputURL) throws InvalidModificationException {

        File fp = new File(filesystemPathForURL(inputURL));

        // You can't delete a directory that is not empty
        if (fp.isDirectory() && fp.list().length > 0) {
            throw new InvalidModificationException("You can't delete a directory that is not empty.");
        }

        return fp.delete();
	}

    @Override
    public boolean exists(LocalFilesystemURL inputURL) {
        File fp = new File(filesystemPathForURL(inputURL));
        return fp.exists();
    }

    @Override
    public long getFreeSpaceInBytes() {
        return DirectoryManager.getFreeSpaceInBytes(rootUri.getPath());
    }

    @Override
	public boolean recursiveRemoveFileAtLocalURL(LocalFilesystemURL inputURL) throws FileExistsException {
        File directory = new File(filesystemPathForURL(inputURL));
    	return removeDirRecursively(directory);
	}

	protected boolean removeDirRecursively(File directory) throws FileExistsException {
        if (directory.isDirectory()) {
            for (File file : directory.listFiles()) {
                removeDirRecursively(file);
            }
        }

        if (!directory.delete()) {
            throw new FileExistsException("could not delete: " + directory.getName());
        } else {
            return true;
        }
	}

    @Override
    public LocalFilesystemURL[] listChildren(LocalFilesystemURL inputURL) throws FileNotFoundException {
        File fp = new File(filesystemPathForURL(inputURL));

        if (!fp.exists()) {
            // The directory we are listing doesn't exist so we should fail.
            throw new FileNotFoundException();
        }

        File[] files = fp.listFiles();
        if (files == null) {
            // inputURL is a directory
            return null;
        }
        LocalFilesystemURL[] entries = new LocalFilesystemURL[files.length];
        for (int i = 0; i < files.length; i++) {
            entries[i] = URLforFilesystemPath(files[i].getPath());
        }

        return entries;
	}

	@Override
	public JSONObject getFileMetadataForLocalURL(LocalFilesystemURL inputURL) throws FileNotFoundException {
        File file = new File(filesystemPathForURL(inputURL));

        if (!file.exists()) {
            throw new FileNotFoundException("File at " + inputURL.uri + " does not exist.");
        }

        JSONObject metadata = new JSONObject();
        try {
            // Ensure that directories report a size of 0
        	metadata.put("size", file.isDirectory() ? 0 : file.length());
        	metadata.put("type", resourceApi.getMimeType(Uri.fromFile(file)));
        	metadata.put("name", file.getName());
        	metadata.put("fullPath", inputURL.path);
        	metadata.put("lastModifiedDate", file.lastModified());
        } catch (JSONException e) {
        	return null;
        }
        return metadata;
	}

    private void copyFile(Filesystem srcFs, LocalFilesystemURL srcURL, File destFile, boolean move) throws IOException, InvalidModificationException, NoModificationAllowedException {
        if (move) {
            String realSrcPath = srcFs.filesystemPathForURL(srcURL);
            if (realSrcPath != null) {
                File srcFile = new File(realSrcPath);
                if (srcFile.renameTo(destFile)) {
                    return;
                }
                // Trying to rename the file failed.  Possibly because we moved across file system on the device.
            }
        }

        CordovaResourceApi.OpenForReadResult offr = resourceApi.openForRead(srcFs.toNativeUri(srcURL));
        copyResource(offr, new FileOutputStream(destFile));

        if (move) {
            srcFs.removeFileAtLocalURL(srcURL);
        }
    }

    private void copyDirectory(Filesystem srcFs, LocalFilesystemURL srcURL, File dstDir, boolean move) throws IOException, NoModificationAllowedException, InvalidModificationException, FileExistsException {
        if (move) {
            String realSrcPath = srcFs.filesystemPathForURL(srcURL);
            if (realSrcPath != null) {
                File srcDir = new File(realSrcPath);
                // If the destination directory already exists and is empty then delete it.  This is according to spec.
                if (dstDir.exists()) {
                    if (dstDir.list().length > 0) {
                        throw new InvalidModificationException("directory is not empty");
                    }
                    dstDir.delete();
                }
                // Try to rename the directory
                if (srcDir.renameTo(dstDir)) {
                    return;
                }
                // Trying to rename the file failed.  Possibly because we moved across file system on the device.
            }
        }

        if (dstDir.exists()) {
            if (dstDir.list().length > 0) {
                throw new InvalidModificationException("directory is not empty");
            }
        } else {
            if (!dstDir.mkdir()) {
                // If we can't create the directory then fail
                throw new NoModificationAllowedException("Couldn't create the destination directory");
            }
        }

        LocalFilesystemURL[] children = srcFs.listChildren(srcURL);
        for (LocalFilesystemURL childLocalUrl : children) {
            File target = new File(dstDir, new File(childLocalUrl.path).getName());
            if (childLocalUrl.isDirectory) {
                copyDirectory(srcFs, childLocalUrl, target, false);
            } else {
                copyFile(srcFs, childLocalUrl, target, false);
            }
        }

        if (move) {
            srcFs.recursiveRemoveFileAtLocalURL(srcURL);
        }
    }

	@Override
	public JSONObject copyFileToURL(LocalFilesystemURL destURL, String newName,
			Filesystem srcFs, LocalFilesystemURL srcURL, boolean move) throws IOException, InvalidModificationException, JSONException, NoModificationAllowedException, FileExistsException {

		// Check to see if the destination directory exists
        String newParent = this.filesystemPathForURL(destURL);
        File destinationDir = new File(newParent);
        if (!destinationDir.exists()) {
            // The destination does not exist so we should fail.
            throw new FileNotFoundException("The source does not exist");
        }

        // Figure out where we should be copying to
        final LocalFilesystemURL destinationURL = makeDestinationURL(newName, srcURL, destURL, srcURL.isDirectory);

        Uri dstNativeUri = toNativeUri(destinationURL);
        Uri srcNativeUri = srcFs.toNativeUri(srcURL);
        // Check to see if source and destination are the same file
        if (dstNativeUri.equals(srcNativeUri)) {
            throw new InvalidModificationException("Can't copy onto itself");
        }

        if (move && !srcFs.canRemoveFileAtLocalURL(srcURL)) {
            throw new InvalidModificationException("Source URL is read-only (cannot move)");
        }

        File destFile = new File(dstNativeUri.getPath());
        if (destFile.exists()) {
            if (!srcURL.isDirectory && destFile.isDirectory()) {
                throw new InvalidModificationException("Can't copy/move a file to an existing directory");
            } else if (srcURL.isDirectory && destFile.isFile()) {
                throw new InvalidModificationException("Can't copy/move a directory to an existing file");
            }
        }

        if (srcURL.isDirectory) {
            // E.g. Copy /sdcard/myDir to /sdcard/myDir/backup
            if (dstNativeUri.toString().startsWith(srcNativeUri.toString() + '/')) {
                throw new InvalidModificationException("Can't copy directory into itself");
            }
            copyDirectory(srcFs, srcURL, destFile, move);
        } else {
            copyFile(srcFs, srcURL, destFile, move);
        }
        return makeEntryForURL(destinationURL);
	}

	@Override
	public long writeToFileAtURL(LocalFilesystemURL inputURL, String data,
			int offset, boolean isBinary) throws IOException, NoModificationAllowedException {

        boolean append = false;
        if (offset > 0) {
            this.truncateFileAtURL(inputURL, offset);
            append = true;
        }

        byte[] rawData;
        if (isBinary) {
            rawData = Base64.decode(data, Base64.DEFAULT);
        } else {
            rawData = data.getBytes(Charset.defaultCharset());
        }
        ByteArrayInputStream in = new ByteArrayInputStream(rawData);
        try
        {
        	byte buff[] = new byte[rawData.length];
            String absolutePath = filesystemPathForURL(inputURL);
            FileOutputStream out = new FileOutputStream(absolutePath, append);
            try {
            	in.read(buff, 0, buff.length);
            	out.write(buff, 0, rawData.length);
            	out.flush();
            } finally {
            	// Always close the output
            	out.close();
            }
            if (isPublicDirectory(absolutePath)) {
                broadcastNewFile(Uri.fromFile(new File(absolutePath)));
            }
        }
        catch (NullPointerException e)
        {
            // This is a bug in the Android implementation of the Java Stack
            NoModificationAllowedException realException = new NoModificationAllowedException(inputURL.toString());
            realException.initCause(e);
            throw realException;
        }

        return rawData.length;
	}

    private boolean isPublicDirectory(String absolutePath) {
        // TODO: should expose a way to scan app's private files (maybe via a flag).
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            // Lollipop has a bug where SD cards are null.
            for (File f : context.getExternalMediaDirs()) {
                if(f != null && absolutePath.startsWith(f.getAbsolutePath())) {
                    return true;
                }
            }
        }

        String extPath = Environment.getExternalStorageDirectory().getAbsolutePath();
        return absolutePath.startsWith(extPath);
    }

     /**
     * Send broadcast of new file so files appear over MTP
     */
    private void broadcastNewFile(Uri nativeUri) {
        Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, nativeUri);
        context.sendBroadcast(intent);
    }

	@Override
	public long truncateFileAtURL(LocalFilesystemURL inputURL, long size) throws IOException {
        File file = new File(filesystemPathForURL(inputURL));

        if (!file.exists()) {
            throw new FileNotFoundException("File at " + inputURL.uri + " does not exist.");
        }

        RandomAccessFile raf = new RandomAccessFile(filesystemPathForURL(inputURL), "rw");
        try {
            if (raf.length() >= size) {
                FileChannel channel = raf.getChannel();
                channel.truncate(size);
                return size;
            }

            return raf.length();
        } finally {
            raf.close();
        }


	}

	@Override
	public boolean canRemoveFileAtLocalURL(LocalFilesystemURL inputURL) {
		String path = filesystemPathForURL(inputURL);
		File file = new File(path);
		return file.exists();
	}

    // This is a copy & paste from CordovaResource API that is required since CordovaResourceApi
    // has a bug pre-4.0.0.
    // TODO: Once cordova-android@4.0.0 is released, delete this copy and make the plugin depend on
    // 4.0.0 with an engine tag.
    private static void copyResource(CordovaResourceApi.OpenForReadResult input, OutputStream outputStream) throws IOException {
        try {
            InputStream inputStream = input.inputStream;
            if (inputStream instanceof FileInputStream && outputStream instanceof FileOutputStream) {
                FileChannel inChannel = ((FileInputStream)input.inputStream).getChannel();
                FileChannel outChannel = ((FileOutputStream)outputStream).getChannel();
                long offset = 0;
                long length = input.length;
                if (input.assetFd != null) {
                    offset = input.assetFd.getStartOffset();
                }
                // transferFrom()'s 2nd arg is a relative position. Need to set the absolute
                // position first.
                inChannel.position(offset);
                outChannel.transferFrom(inChannel, 0, length);
            } else {
                final int BUFFER_SIZE = 8192;
                byte[] buffer = new byte[BUFFER_SIZE];

                for (;;) {
                    int bytesRead = inputStream.read(buffer, 0, BUFFER_SIZE);

                    if (bytesRead <= 0) {
                        break;
                    }
                    outputStream.write(buffer, 0, bytesRead);
                }
            }
        } finally {
            input.inputStream.close();
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }
}
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
 */
package org.apache.cordova.file;

import android.net.Uri;

public class LocalFilesystemURL {
	
	public static final String FILESYSTEM_PROTOCOL = "cdvfile";

    public final Uri uri;
    public final String fsName;
    public final String path;
    public final boolean isDirectory;

	private LocalFilesystemURL(Uri uri, String fsName, String fsPath, boolean isDirectory) {
		this.uri = uri;
        this.fsName = fsName;
        this.path = fsPath;
        this.isDirectory = isDirectory;
	}

    public static LocalFilesystemURL parse(Uri uri) {
        if (!FILESYSTEM_PROTOCOL.equals(uri.getScheme())) {
            return null;
        }
        String path = uri.getPath();
        if (path.length() < 1) {
            return null;
        }
        int firstSlashIdx = path.indexOf('/', 1);
        if (firstSlashIdx < 0) {
            return null;
        }
        String fsName = path.substring(1, firstSlashIdx);
        path = path.substring(firstSlashIdx);
        boolean isDirectory = path.charAt(path.length() - 1) == '/';
        return new LocalFilesystemURL(uri, fsName, path, isDirectory);
    }

    public static LocalFilesystemURL parse(String uri) {
        return parse(Uri.parse(uri));
    }

    public String toString() {
        return uri.toString();
    }
}
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
*/

package org.apache.cordova.file;

@SuppressWarnings("serial")
public class NoModificationAllowedException extends Exception {

    public NoModificationAllowedException(String message) {
        super(message);
    }

}
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
*/
package org.apache.cordova.file;

import android.util.SparseArray;

import org.apache.cordova.CallbackContext;

/**
 * Holds pending runtime permission requests
 */
class PendingRequests {
    private int currentReqId = 0;
    private SparseArray<Request> requests = new SparseArray<Request>();

    /**
     * Creates a request and adds it to the array of pending requests. Each created request gets a
     * unique result code for use with requestPermission()
     * @param rawArgs           The raw arguments passed to the plugin
     * @param action            The action this request corresponds to (get file, etc.)
     * @param callbackContext   The CallbackContext for this plugin call
     * @return                  The request code that can be used to retrieve the Request object
     */
    public synchronized int createRequest(String rawArgs, int action, CallbackContext callbackContext)  {
        Request req = new Request(rawArgs, action, callbackContext);
        requests.put(req.requestCode, req);
        return req.requestCode;
    }

    /**
     * Gets the request corresponding to this request code and removes it from the pending requests
     * @param requestCode   The request code for the desired request
     * @return              The request corresponding to the given request code or null if such a
     *                      request is not found
     */
    public synchronized Request getAndRemove(int requestCode) {
        Request result = requests.get(requestCode);
        requests.remove(requestCode);
        return result;
    }

    /**
     * Holds the options and CallbackContext for a call made to the plugin.
     */
    public class Request {

        // Unique int used to identify this request in any Android permission callback
        private int requestCode;

        // Action to be performed after permission request result
        private int action;

        // Raw arguments passed to plugin
        private String rawArgs;

        // The callback context for this plugin request
        private CallbackContext callbackContext;

        private Request(String rawArgs, int action, CallbackContext callbackContext) {
            this.rawArgs = rawArgs;
            this.action = action;
            this.callbackContext = callbackContext;
            this.requestCode = currentReqId ++;
        }

        public int getAction() {
            return this.action;
        }

        public String getRawArgs() {
            return rawArgs;
        }

        public CallbackContext getCallbackContext() {
            return callbackContext;
        }
    }
}
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
*/


package org.apache.cordova.file;

@SuppressWarnings("serial")
public class TypeMismatchException extends Exception {

    public TypeMismatchException(String message) {
        super(message);
    }

}
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
 */
ext.postBuildExtras = {
    def inAssetsDir = file("assets")
    def outAssetsDir = inAssetsDir
    def outFile = new File(outAssetsDir, "cdvasset.manifest")

    def newTask = task("cdvCreateAssetManifest") << {
        def contents = new HashMap()
        def sizes = new HashMap()
        contents[""] = inAssetsDir.list()
        def tree = fileTree(dir: inAssetsDir)
        tree.visit { fileDetails ->
            if (fileDetails.isDirectory()) {
                contents[fileDetails.relativePath.toString()] = fileDetails.file.list()
            } else {
                sizes[fileDetails.relativePath.toString()] = fileDetails.file.length()
            }
        }

        outAssetsDir.mkdirs()
        outFile.withObjectOutputStream { oos ->
            oos.writeObject(contents)
            oos.writeObject(sizes)
        }
    }
    newTask.inputs.dir inAssetsDir
    newTask.outputs.file outFile
    def preBuildTask = tasks["preBuild"]
    preBuildTask.dependsOn(newTask)
}
<!---
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
-->

Notes for plugin developers
===========================

These notes are primarily intended for Android and iOS developers who want to write plugins which interface with the file system using the File plugin.

Working with Cordova file system URLs
-------------------------------------

Since version 1.0.0, this plugin has used URLs with a `cdvfile` scheme for all communication over the bridge, rather than exposing raw device file system paths to JavaScript. 

On the JavaScript side, this means that FileEntry and DirectoryEntry objects have a fullPath attribute which is relative to the root of the HTML file system. If your plugin's JavaScript API accepts a FileEntry or DirectoryEntry object, you should call `.toURL()` on that object before passing it across the bridge to native code.

### Converting cdvfile:// URLs to fileystem paths

Plugins which need to write to the filesystem may want to convert a received file system URL to an actual filesystem location. There are multiple ways of doing this, depending on the native platform.

It is important to remember that not all `cdvfile://` URLs are mappable to real files on the device. Some URLs can refer to assets on device which are not represented by files, or can even refer to remote resources. Because of these possibilities, plugins should always test whether they get a meaningful result back when trying to convert URLs to paths.

#### Android

On Android, the simplest method to convert a `cdvfile://` URL to a filesystem path is to use `org.apache.cordova.CordovaResourceApi`. `CordovaResourceApi` has several methods which can handle `cdvfile://` URLs:

    // webView is a member of the Plugin class
    CordovaResourceApi resourceApi = webView.getResourceApi();

    // Obtain a file:/// URL representing this file on the device,
    // or the same URL unchanged if it cannot be mapped to a file
    Uri fileURL = resourceApi.remapUri(Uri.parse(cdvfileURL));

It is also possible to use the File plugin directly:

    import org.apache.cordova.file.FileUtils;
    import org.apache.cordova.file.FileSystem;
    import java.net.MalformedURLException;

    // Get the File plugin from the plugin manager
    FileUtils filePlugin = (FileUtils)webView.pluginManager.getPlugin("File");

    // Given a URL, get a path for it
    try {
        String path = filePlugin.filesystemPathForURL(cdvfileURL);
    } catch (MalformedURLException e) {
        // The filesystem url wasn't recognized
    }

To convert from a path to a `cdvfile://` URL:

    import org.apache.cordova.file.LocalFilesystemURL;

    // Get a LocalFilesystemURL object for a device path,
    // or null if it cannot be represented as a cdvfile URL.
    LocalFilesystemURL url = filePlugin.filesystemURLforLocalPath(path);
    // Get the string representation of the URL object
    String cdvfileURL = url.toString();

If your plugin creates a file, and you want to return a FileEntry object for it, use the File plugin:

    // Return a JSON structure suitable for returning to JavaScript,
    // or null if this file is not representable as a cdvfile URL.
    JSONObject entry = filePlugin.getEntryForFile(file);

#### iOS

Cordova on iOS does not use the same `CordovaResourceApi` concept as Android. On iOS, you should use the File plugin to convert between URLs and filesystem paths.

    // Get a CDVFilesystem URL object from a URL string
    CDVFilesystemURL* url = [CDVFilesystemURL fileSystemURLWithString:cdvfileURL];
    // Get a path for the URL object, or nil if it cannot be mapped to a file
    NSString* path = [filePlugin filesystemPathForURL:url];
    

    // Get a CDVFilesystem URL object for a device path, or
    // nil if it cannot be represented as a cdvfile URL.
    CDVFilesystemURL* url = [filePlugin fileSystemURLforLocalPath:path];
    // Get the string representation of the URL object
    NSString* cdvfileURL = [url absoluteString];

If your plugin creates a file, and you want to return a FileEntry object for it, use the File plugin:

    // Get a CDVFilesystem URL object for a device path, or
    // nil if it cannot be represented as a cdvfile URL.
    CDVFilesystemURL* url = [filePlugin fileSystemURLforLocalPath:path];
    // Get a structure to return to JavaScript
    NSDictionary* entry = [filePlugin makeEntryForLocalURL:url]

#### JavaScript

In JavaScript, to get a `cdvfile://` URL from a FileEntry or DirectoryEntry object, simply call `.toURL()` on it:

    var cdvfileURL = entry.toURL();

In plugin response handlers, to convert from a returned FileEntry structure to an actual Entry object, your handler code should import the File plugin and create a new object:

    // create appropriate Entry object
    var entry;
    if (entryStruct.isDirectory) {
        entry = new DirectoryEntry(entryStruct.name, entryStruct.fullPath, new FileSystem(entryStruct.filesystemName));
    } else {
        entry = new FileEntry(entryStruct.name, entryStruct.fullPath, new FileSystem(entryStruct.filesystemName));
    }

<!--
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#
-->

# Contributing to Apache Cordova

Anyone can contribute to Cordova. And we need your contributions.

There are multiple ways to contribute: report bugs, improve the docs, and
contribute code.

For instructions on this, start with the
[contribution overview](http://cordova.apache.org/contribute/).

The details are explained there, but the important items are:
 - Sign and submit an Apache ICLA (Contributor License Agreement).
 - Have a Jira issue open that corresponds to your contribution.
 - Run the tests so your patch doesn't break existing functionality.

We look forward to your contributions!

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.Apache Cordova
Copyright 2012 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
<!--
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#
-->
# Release Notes

### 1.3.4 (Jun 19, 2019)

-   chore: manually fix lines breaks to LF ([`d804ef2`](https://github.com/apache/cordova-plugin-whitelist/commit/d804ef2))
-   build: add `.gitattributes` to force LF (instead of possible CRLF on Windows) ([`ed0206b`](https://github.com/apache/cordova-plugin-whitelist/commit/ed0206b))
-   build: add `.npmignore` to remove unneeded files from npm package ([`bf8fea5`](https://github.com/apache/cordova-plugin-whitelist/commit/bf8fea5))
-   test,ci(travis): Tests (extracted from cordova-mobile-spec) ([#38](https://github.com/apache/cordova-plugin-whitelist/issues/38)) ([`e4f17b0`](https://github.com/apache/cordova-plugin-whitelist/commit/e4f17b0))
-   docs: Added information on allow-navigation preceding allow-intent ([#41](https://github.com/apache/cordova-plugin-whitelist/issues/41)) ([`7725fed`](https://github.com/apache/cordova-plugin-whitelist/commit/7725fed))
-   chore(github): Add or update GitHub pull request and issue template ([`86b3ee1`](https://github.com/apache/cordova-plugin-whitelist/commit/86b3ee1))
-   fix: Remove information about cordova-android ([#27](https://github.com/apache/cordova-plugin-whitelist/issues/27)) ([`34ed9d0`](https://github.com/apache/cordova-plugin-whitelist/commit/34ed9d0))
-   docs: remove JIRA link ([`fa78675`](https://github.com/apache/cordova-plugin-whitelist/commit/fa78675))
-   docs: Clarify unconfigured Intent Whitelist behaviour ([#26](https://github.com/apache/cordova-plugin-whitelist/issues/26)) ([`8d3f86b`](https://github.com/apache/cordova-plugin-whitelist/commit/8d3f86b))

### 1.3.3 (Nov 06, 2017)
* [CB-12847](https://issues.apache.org/jira/browse/CB-12847) added `bugs` entry to `package.json`.

### 1.3.2 (Feb 28, 2017)
* [CB-12236](https://issues.apache.org/jira/browse/CB-12236) Fixed `RELEASENOTES` for `cordova-plugin-whitelist`

### 1.3.1 (Dec 07, 2016)
* [CB-12224](https://issues.apache.org/jira/browse/CB-12224) Updated version and RELEASENOTES.md for release 1.3.1
* [CB-11917](https://issues.apache.org/jira/browse/CB-11917) - Remove pull request template checklist item: "iCLA has been submittedâ€¦"
* Edit package.json license to match SPDX id
* [CB-11832](https://issues.apache.org/jira/browse/CB-11832) Incremented plugin version.

### 1.3.0 (Sep 08, 2016)
* [CB-11795](https://issues.apache.org/jira/browse/CB-11795) Add 'protective' entry to cordovaDependencies
* Updated installation section
* Plugin uses `Android Log class` and not `Cordova LOG class`
* Add pull request template.
* [CB-10866](https://issues.apache.org/jira/browse/CB-10866) Adding engine info to `package.json`
* [CB-10996](https://issues.apache.org/jira/browse/CB-10996) Adding front matter to README.md

### 1.2.2 (Apr 15, 2016)
* add note about redirects
* [CB-10624](https://issues.apache.org/jira/browse/CB-10624) remove error message from `whitelist.js`, which leaves it empty

### 1.2.1 (Jan 15, 2016)
* [CB-10194](https://issues.apache.org/jira/browse/CB-10194) info tag prints for ios when not applicable

### 1.2.0 (Nov 18, 2015)
* removed **iOS** engine check from `plugin.xml`
* [CB-10035](https://issues.apache.org/jira/browse/CB-10035) Updated `RELEASENOTES` to be newest to oldest
* [CB-9972](https://issues.apache.org/jira/browse/CB-9972) - Remove **iOS** whitelist
* Updated the text, it should read 4.0.x and greater, since this plugin will be required for `cordova-android 5.0`
* Fixing contribute link.
* Updated `plugin.xml <info>` tag to remove warning about not needing this plugin if you are using the **iOS 9 SDK**
* [CB-9738](https://issues.apache.org/jira/browse/CB-9738) - Disable whitelist use when runtime environment is **iOS 9**
* [CB-9740](https://issues.apache.org/jira/browse/CB-9740) - Add `<info>` tag describing whitelist plugin not needed on `cordova-ios` and cordova-android 3.x`
* [CB-9568](https://issues.apache.org/jira/browse/CB-9568) - Update whitelist plugin to allow all network access by default
* [CB-9337](https://issues.apache.org/jira/browse/CB-9337) - enable use of `<access>` tags for native code network requests

### 1.1.0 (Jun 17, 2015)
* [CB-9128](https://issues.apache.org/jira/browse/CB-9128) cordova-plugin-whitelist documentation translation: cordova-plugin-whitelist
* fix npm md issue
* Usage of CDVURLRequestFilter protocol.
* [CB-9089](https://issues.apache.org/jira/browse/CB-9089) - iOS whitelist plugin does not compile
* [CB-9090](https://issues.apache.org/jira/browse/CB-9090) - Enable whitelist plugin for cordova-ios 4.0.0
* Fixed error in Content-Security-Policy example

### 1.0.0 (Mar 25, 2015)
* [CB-8739](https://issues.apache.org/jira/browse/CB-8739) added missing license headers
* Add @Override to CustomConfigXmlParser methods
* Change ID to cordova-plugin-whitelist rather than reverse-DNS-style
* Tweak CSP examples in README
* [CB-8660](https://issues.apache.org/jira/browse/CB-8660) remove extra commas from package.json
{
  "author": {
    "name": "Apache Software Foundation"
  },
  "cordova": {
    "platforms": [
      "android"
    ]
  },
  "deprecated": false,
  "description": "Cordova Whitelist Plugin",
  "engines": {
    "cordovaDependencies": {
      "0.0.0": {
        "cordova-android": ">=4.0.0"
      },
      "2.0.0": {
        "cordova": ">100"
      }
    }
  },
  "homepage": "https://github.com/apache/cordova-plugin-whitelist#readme",
  "license": "Apache-2.0",
  "name": "cordova-plugin-whitelist",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/apache/cordova-plugin-whitelist.git"
  },
  "version": "1.3.4"
}<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you 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.
-->

<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
           id="cordova-plugin-whitelist"
      version="1.3.4">
    <name>Whitelist</name>
    <description>Cordova Network Whitelist Plugin</description>
    <license>Apache 2.0</license>
    <keywords>cordova,whitelist,policy</keywords>

    <engines>
      <engine name="cordova-android" version=">=4.0.0" />
    </engines>

    <platform name="android">
        <config-file target="res/xml/config.xml" parent="/*">
            <feature name="Whitelist" >
                <param name="android-package" value="org.apache.cordova.whitelist.WhitelistPlugin"/>
                <param name="onload" value="true" />
            </feature>
        </config-file>

        <source-file src="src/android/WhitelistPlugin.java" target-dir="src/org/apache/cordova/whitelist" />
    </platform>

</plugin>
/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
*/

package org.apache.cordova.whitelist;

import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.ConfigXmlParser;
import org.apache.cordova.LOG;
import org.apache.cordova.Whitelist;
import org.xmlpull.v1.XmlPullParser;

import android.content.Context;

public class WhitelistPlugin extends CordovaPlugin {
    private static final String LOG_TAG = "WhitelistPlugin";
    private Whitelist allowedNavigations;
    private Whitelist allowedIntents;
    private Whitelist allowedRequests;

    // Used when instantiated via reflection by PluginManager
    public WhitelistPlugin() {
    }
    // These can be used by embedders to allow Java-configuration of whitelists.
    public WhitelistPlugin(Context context) {
        this(new Whitelist(), new Whitelist(), null);
        new CustomConfigXmlParser().parse(context);
    }
    public WhitelistPlugin(XmlPullParser xmlParser) {
        this(new Whitelist(), new Whitelist(), null);
        new CustomConfigXmlParser().parse(xmlParser);
    }
    public WhitelistPlugin(Whitelist allowedNavigations, Whitelist allowedIntents, Whitelist allowedRequests) {
        if (allowedRequests == null) {
            allowedRequests = new Whitelist();
            allowedRequests.addWhiteListEntry("file:///*", false);
            allowedRequests.addWhiteListEntry("data:*", false);
        }
        this.allowedNavigations = allowedNavigations;
        this.allowedIntents = allowedIntents;
        this.allowedRequests = allowedRequests;
    }
    @Override
    public void pluginInitialize() {
        if (allowedNavigations == null) {
            allowedNavigations = new Whitelist();
            allowedIntents = new Whitelist();
            allowedRequests = new Whitelist();
            new CustomConfigXmlParser().parse(webView.getContext());
        }
    }

    private class CustomConfigXmlParser extends ConfigXmlParser {
        @Override
        public void handleStartTag(XmlPullParser xml) {
            String strNode = xml.getName();
            if (strNode.equals("content")) {
                String startPage = xml.getAttributeValue(null, "src");
                allowedNavigations.addWhiteListEntry(startPage, false);
            } else if (strNode.equals("allow-navigation")) {
                String origin = xml.getAttributeValue(null, "href");
                if ("*".equals(origin)) {
                    allowedNavigations.addWhiteListEntry("http://*/*", false);
                    allowedNavigations.addWhiteListEntry("https://*/*", false);
                    allowedNavigations.addWhiteListEntry("data:*", false);
                } else {
                    allowedNavigations.addWhiteListEntry(origin, false);
                }
            } else if (strNode.equals("allow-intent")) {
                String origin = xml.getAttributeValue(null, "href");
                allowedIntents.addWhiteListEntry(origin, false);
            } else if (strNode.equals("access")) {
                String origin = xml.getAttributeValue(null, "origin");
                String subdomains = xml.getAttributeValue(null, "subdomains");
                boolean external = (xml.getAttributeValue(null, "launch-external") != null);
                if (origin != null) {
                    if (external) {
                        LOG.w(LOG_TAG, "Found <access launch-external> within config.xml. Please use <allow-intent> instead.");
                        allowedIntents.addWhiteListEntry(origin, (subdomains != null) && (subdomains.compareToIgnoreCase("true") == 0));
                    } else {
                        if ("*".equals(origin)) {
                            allowedRequests.addWhiteListEntry("http://*/*", false);
                            allowedRequests.addWhiteListEntry("https://*/*", false);
                        } else {
                            allowedRequests.addWhiteListEntry(origin, (subdomains != null) && (subdomains.compareToIgnoreCase("true") == 0));
                        }
                    }
                }
            }
        }
        @Override
        public void handleEndTag(XmlPullParser xml) {
        }
    }

    @Override
    public Boolean shouldAllowNavigation(String url) {
        if (allowedNavigations.isUrlWhiteListed(url)) {
            return true;
        }
        return null; // Default policy
    }

    @Override
    public Boolean shouldAllowRequest(String url) {
        if (Boolean.TRUE == shouldAllowNavigation(url)) {
            return true;
        }
        if (allowedRequests.isUrlWhiteListed(url)) {
            return true;
        }
        return null; // Default policy
    }

    @Override
    public Boolean shouldOpenExternalUrl(String url) {
        if (allowedIntents.isUrlWhiteListed(url)) {
            return true;
        }
        return null; // Default policy
    }

    public Whitelist getAllowedNavigations() {
        return allowedNavigations;
    }

    public void setAllowedNavigations(Whitelist allowedNavigations) {
        this.allowedNavigations = allowedNavigations;
    }

    public Whitelist getAllowedIntents() {
        return allowedIntents;
    }

    public void setAllowedIntents(Whitelist allowedIntents) {
        this.allowedIntents = allowedIntents;
    }

    public Whitelist getAllowedRequests() {
        return allowedRequests;
    }

    public void setAllowedRequests(Whitelist allowedRequests) {
        this.allowedRequests = allowedRequests;
    }
}
# Contributing to this Repository

Thank you for your interest in contributing!

Unfortunately there are some legal hurdles. Sorry about that.

This repository is a Google open source project, and so we require contributors to sign Google's open source Contributor License Agreement.
It's easy to do, just click here to sign as an [individual](https://developers.google.com/open-source/cla/individual) or [corporation](https://developers.google.com/open-source/cla/corporate).
Individuals can sign electronically in seconds (see the bottom of the page); corporations will need to email a PDF, or mail.

We cannot accept PRs or patches larger than fixing typos and the like without a signed CLA.

If your Github account doesn't show the name your used to sign, please mention your name in your PR.
Copyright (c) 2014 The Chromium Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

   * Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
   * Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
   * Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

================================================================================
SSZipArchive (iOS)
================================================================================
Copyright (c) 2010-2015, Sam Soffes, http://soff.es

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

================================================================================
Minizip (iOS)
================================================================================
Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler

This software is provided 'as-is', without any express or implied
warranty.  In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not
   claim that you wrote the original software. If you use this software
   in a product, an acknowledgment in the product documentation would be
   appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
   misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.

Jean-loup Gailly        Mark Adler
jloup@gzip.org          madler@alumni.caltech.edu


{
  "author": "",
  "cordova": {
    "id": "cordova-plugin-unzip",
    "platforms": [
      "android",
      "ios"
    ]
  },
  "deprecated": false,
  "description": "Unzips zip files",
  "engines": [
    {
      "name": "cordova",
      "version": ">=3.3.0"
    }
  ],
  "homepage": "https://github.com/MobileChromeApps/zip",
  "license": "BSD",
  "name": "cordova-plugin-zip",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/MobileChromeApps/cordova-plugin-zip.git"
  },
  "version": "3.1.0"
}<?xml version="1.0" encoding="UTF-8" ?>
<plugin xmlns="http://phonegap.com/ns/plugins/1.0"
    xmlns:android="http://schemas.android.com/apk/res/android"
    id="cordova-plugin-zip"
    version="3.1.0">
  <engines>
    <engine name="cordova" version=">=3.3.0" />
  </engines>
  <dependency id="cordova-plugin-file" version=">=2.0.0" />

  <name>cordova-plugin-zip</name>
  <description>Unzips zip files</description>

  <js-module src="zip.js" name="Zip">
    <clobbers target="zip" />
  </js-module>

  <platform name="android">
    <source-file src="src/android/Zip.java" target-dir="src/org/apache/cordova" />

    <config-file target="res/xml/config.xml" parent="/widget">
      <feature name="Zip">
        <param name="android-package" value="org.apache.cordova.Zip"/>
      </feature>
    </config-file>
  </platform>

  <platform name="ios">
    <source-file src="src/ios/ZipPlugin.m" />
    <header-file src="src/ios/ZipPlugin.h" />
    <header-file src="src/ios/Common.h" />
    <header-file src="src/ios/aes/aes.h" target-dir="Plugins/aes" />
    <header-file src="src/ios/aes/aes_via_ace.h" target-dir="Plugins/aes" />
    <source-file src="src/ios/aes/aescrypt.c" target-dir="Plugins/aes" />
    <source-file src="src/ios/aes/aeskey.c" target-dir="Plugins/aes" />
    <header-file src="src/ios/aes/aesopt.h" target-dir="Plugins/aes" />
    <source-file src="src/ios/aes/aestab.c" target-dir="Plugins/aes" />
    <header-file src="src/ios/aes/aestab.h" target-dir="Plugins/aes" />
    <header-file src="src/ios/aes/brg_endian.h" target-dir="Plugins/aes" />
    <header-file src="src/ios/aes/brg_types.h" target-dir="Plugins/aes" />
    <source-file src="src/ios/aes/entropy.c" target-dir="Plugins/aes" />
    <header-file src="src/ios/aes/entropy.h" target-dir="Plugins/aes" />
    <source-file src="src/ios/aes/fileenc.c" target-dir="Plugins/aes" />
    <header-file src="src/ios/aes/fileenc.h" target-dir="Plugins/aes" />
    <source-file src="src/ios/aes/hmac.c" target-dir="Plugins/aes" />
    <header-file src="src/ios/aes/hmac.h" target-dir="Plugins/aes" />
    <source-file src="src/ios/aes/prng.c" target-dir="Plugins/aes" />
    <header-file src="src/ios/aes/prng.h" target-dir="Plugins/aes" />
    <source-file src="src/ios/aes/pwd2key.c" target-dir="Plugins/aes" />
    <header-file src="src/ios/aes/pwd2key.h" target-dir="Plugins/aes" />
    <source-file src="src/ios/aes/sha1.c" target-dir="Plugins/aes" />
    <header-file src="src/ios/aes/sha1.h" target-dir="Plugins/aes" />
    <source-file src="src/ios/SSZipArchive.m" target-dir="Plugins/minizip" />
    <header-file src="src/ios/SSZipArchive.h" target-dir="Plugins/minizip" />
    <source-file src="src/ios/minizip/zip.c" target-dir="Plugins/minizip" />
    <header-file src="src/ios/minizip/zip.h" target-dir="Plugins/minizip" />
    <source-file src="src/ios/minizip/unzip.c" target-dir="Plugins/minizip" />
    <header-file src="src/ios/minizip/unzip.h" target-dir="Plugins/minizip" />
    <source-file src="src/ios/minizip/mztools.c" target-dir="Plugins/minizip" />
    <header-file src="src/ios/minizip/mztools.h" target-dir="Plugins/minizip" />
    <source-file src="src/ios/minizip/ioapi.c" target-dir="Plugins/minizip" />
    <header-file src="src/ios/minizip/ioapi.h" target-dir="Plugins/minizip" />
    <header-file src="src/ios/minizip/crypt.h" target-dir="Plugins/minizip" />

    <config-file target="config.xml" parent="/widget">
      <feature name="Zip">
        <param name="ios-package" value="ZipPlugin"/>
      </feature>
    </config-file>
    <framework src="libz.dylib" />
  </platform>
</plugin>
var exec = cordova.require('cordova/exec');

function newProgressEvent(result) {
    var event = {
            loaded: result.loaded,
            total: result.total
    };
    return event;
}

exports.unzip = function(fileName, outputDirectory, callback, progressCallback) {
    var win = function(result) {
        if (result && typeof result.loaded != "undefined") {
            if (progressCallback) {
                return progressCallback(newProgressEvent(result));
            }
        } else if (callback) {
            callback(0);
        }
    };
    var fail = function(result) {
        if (callback) {
            callback(-1);
        }
    };
    exec(win, fail, 'Zip', 'unzip', [fileName, outputDirectory]);
};#ifndef SSZipCommon
#define SSZipCommon

/* tm_unz contain date/time info */
typedef struct tm_unz_s
{
    unsigned int tm_sec;            /* seconds after the minute - [0,59] */
    unsigned int tm_min;            /* minutes after the hour - [0,59] */
    unsigned int tm_hour;           /* hours since midnight - [0,23] */
    unsigned int tm_mday;           /* day of the month - [1,31] */
    unsigned int tm_mon;            /* months since January - [0,11] */
    unsigned int tm_year;           /* years - [1980..2044] */
} tm_unz;

typedef struct unz_file_info_s
{
    unsigned long version;              /* version made by                 2 bytes */
    unsigned long version_needed;       /* version needed to extract       2 bytes */
    unsigned long flag;                 /* general purpose bit flag        2 bytes */
    unsigned long compression_method;   /* compression method              2 bytes */
    unsigned long dosDate;              /* last mod file date in Dos fmt   4 bytes */
    unsigned long crc;                  /* crc-32                          4 bytes */
    unsigned long compressed_size;      /* compressed size                 4 bytes */
    unsigned long uncompressed_size;    /* uncompressed size               4 bytes */
    unsigned long size_filename;        /* filename length                 2 bytes */
    unsigned long size_file_extra;      /* extra field length              2 bytes */
    unsigned long size_file_comment;    /* file comment length             2 bytes */

    unsigned long disk_num_start;       /* disk number start               2 bytes */
    unsigned long internal_fa;          /* internal file attributes        2 bytes */
    unsigned long external_fa;          /* external file attributes        4 bytes */

    tm_unz tmu_date;
} unz_file_info;

/* unz_file_info contain information about a file in the zipfile */
typedef struct unz_file_info64_s
{
    unsigned long version;              /* version made by                 2 bytes */
    unsigned long version_needed;       /* version needed to extract       2 bytes */
    unsigned long flag;                 /* general purpose bit flag        2 bytes */
    unsigned long compression_method;   /* compression method              2 bytes */
    unsigned long dosDate;              /* last mod file date in Dos fmt   4 bytes */
    unsigned long crc;                  /* crc-32                          4 bytes */
    unsigned long long compressed_size;   /* compressed size                 8 bytes */
    unsigned long long uncompressed_size; /* uncompressed size               8 bytes */
    unsigned long size_filename;        /* filename length                 2 bytes */
    unsigned long size_file_extra;      /* extra field length              2 bytes */
    unsigned long size_file_comment;    /* file comment length             2 bytes */
    
    unsigned long disk_num_start;       /* disk number start               2 bytes */
    unsigned long internal_fa;          /* internal file attributes        2 bytes */
    unsigned long external_fa;          /* external file attributes        4 bytes */
    
    tm_unz tmu_date;
    unsigned long long disk_offset;
    unsigned long size_file_extra_internal;
} unz_file_info64;

typedef struct unz_global_info_s
{
    unsigned long number_entry;         /* total number of entries in
                                         the central dir on this disk */
    
    unsigned long number_disk_with_CD;  /* number the the disk with central dir, used for spanning ZIP*/

    
    unsigned long size_comment;         /* size of the global comment of the zipfile */
} unz_global_info;

typedef struct unz_global_info64
{
    unsigned long long number_entry;         /* total number of entries in
                                 the central dir on this disk */
    
     unsigned long number_disk_with_CD;  /* number the the disk with central dir, used for spanning ZIP*/
    
    unsigned long size_comment;         /* size of the global comment of the zipfile */
} unz_global_info64;

#endif//
//  SSZipArchive.h
//  SSZipArchive
//
//  Created by Sam Soffes on 7/21/10.
//  Copyright (c) Sam Soffes 2010-2015. All rights reserved.
//

#ifndef _SSZIPARCHIVE_H
#define _SSZIPARCHIVE_H

#import <Foundation/Foundation.h>
#include "Common.h"

@protocol SSZipArchiveDelegate;

@interface SSZipArchive : NSObject

// Unzip
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination;
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination delegate:(id<SSZipArchiveDelegate>)delegate;

+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError * *)error;
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError * *)error delegate:(id<SSZipArchiveDelegate>)delegate;

+ (BOOL)unzipFileAtPath:(NSString *)path
    toDestination:(NSString *)destination
    progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
    completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler;

+ (BOOL)unzipFileAtPath:(NSString *)path
    toDestination:(NSString *)destination
    overwrite:(BOOL)overwrite
    password:(NSString *)password
    progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
    completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler;

// Zip

// without password
+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths;
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath;
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirector;

// with password, password could be nil
+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths withPassword:(NSString *)password;
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath withPassword:(NSString *)password;
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirectory withPassword:(NSString *)password;

- (instancetype)initWithPath:(NSString *)path;
@property (NS_NONATOMIC_IOSONLY, readonly, getter = isOpen) BOOL open;
- (BOOL)writeFile:(NSString *)path withPassword:(NSString *)password;
- (BOOL)writeFolderAtPath:(NSString *)path withFolderName:(NSString *)folderName withPassword:(NSString *)password;
- (BOOL)writeFileAtPath:(NSString *)path withFileName:(NSString *)fileName withPassword:(NSString *)password;
- (BOOL)writeData:(NSData *)data filename:(NSString *)filename withPassword:(NSString *)password;
@property (NS_NONATOMIC_IOSONLY, readonly, getter = isClosed) BOOL close;

@end

@protocol SSZipArchiveDelegate <NSObject>

@optional

- (void)zipArchiveWillUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo;
- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPath;

- (BOOL)zipArchiveShouldUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo;
- (void)zipArchiveWillUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo;
- (void)zipArchiveDidUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo;
- (void)zipArchiveDidUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath unzippedFilePath:(NSString *)unzippedFilePath;

- (void)zipArchiveProgressEvent:(unsigned long long)loaded total:(unsigned long long)total;
- (void)zipArchiveDidUnzipArchiveFile:(NSString *)zipFile entryPath:(NSString *)entryPath destPath:(NSString *)destPath;

@end

#endif /* _SSZIPARCHIVE_H */
//
//  SSZipArchive.m
//  SSZipArchive
//
//  Created by Sam Soffes on 7/21/10.
//  Copyright (c) Sam Soffes 2010-2015. All rights reserved.
//
#import "SSZipArchive.h"
#include "unzip.h"
#include "zip.h"
#import "zlib.h"
#import "zconf.h"

#include <sys/stat.h>

#define CHUNK 16384

@interface SSZipArchive ()
+ (NSDate *)_dateWithMSDOSFormat:(UInt32)msdosDateTime;
@end

@implementation SSZipArchive
{
    NSString *_path;
    NSString *_filename;
    zipFile _zip;
}

#pragma mark - Unzipping

+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination
{
    return [self unzipFileAtPath:path toDestination:destination delegate:nil];
}

+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error
{
    return [self unzipFileAtPath:path toDestination:destination overwrite:overwrite password:password error:error delegate:nil progressHandler:nil completionHandler:nil];
}

+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination delegate:(id<SSZipArchiveDelegate>)delegate
{
    return [self unzipFileAtPath:path toDestination:destination overwrite:YES password:nil error:nil delegate:delegate progressHandler:nil completionHandler:nil];
}

+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error delegate:(id<SSZipArchiveDelegate>)delegate
{
    return [self unzipFileAtPath:path toDestination:destination overwrite:overwrite password:password error:error delegate:delegate progressHandler:nil completionHandler:nil];
}

+ (BOOL)unzipFileAtPath:(NSString *)path
          toDestination:(NSString *)destination
              overwrite:(BOOL)overwrite
               password:(NSString *)password
        progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
      completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler
{
    return [self unzipFileAtPath:path toDestination:destination overwrite:overwrite password:password error:nil delegate:nil progressHandler:progressHandler completionHandler:completionHandler];
}

+ (BOOL)unzipFileAtPath:(NSString *)path
          toDestination:(NSString *)destination
        progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
      completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler
{
    return [self unzipFileAtPath:path toDestination:destination overwrite:YES password:nil error:nil delegate:nil progressHandler:progressHandler completionHandler:completionHandler];
}

+ (BOOL)unzipFileAtPath:(NSString *)path
          toDestination:(NSString *)destination
              overwrite:(BOOL)overwrite
               password:(NSString *)password
                  error:(NSError **)error
               delegate:(id<SSZipArchiveDelegate>)delegate
        progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
      completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler
{
    // Begin opening
    zipFile zip = unzOpen((const char*)[path UTF8String]);
    if (zip == NULL)
    {
        NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"failed to open zip file"};
        NSError *err = [NSError errorWithDomain:@"SSZipArchiveErrorDomain" code:-1 userInfo:userInfo];
        if (error)
        {
            *error = err;
        }
        if (completionHandler)
        {
            completionHandler(nil, NO, err);
        }
        return NO;
    }
    
    NSDictionary * fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];
    unsigned long long fileSize = [fileAttributes[NSFileSize] unsignedLongLongValue];
    unsigned long long currentPosition = 0;
    
    unz_global_info  globalInfo = {0ul, 0ul};
    unzGetGlobalInfo(zip, &globalInfo);
    
    // Begin unzipping
    if (unzGoToFirstFile(zip) != UNZ_OK)
    {
        NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"failed to open first file in zip file"};
        NSError *err = [NSError errorWithDomain:@"SSZipArchiveErrorDomain" code:-2 userInfo:userInfo];
        if (error)
        {
            *error = err;
        }
        if (completionHandler)
        {
            completionHandler(nil, NO, err);
        }
        return NO;
    }
    
    BOOL success = YES;
    BOOL canceled = NO;
    int ret = 0;
    int crc_ret =0;
    unsigned char buffer[4096] = {0};
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSMutableSet *directoriesModificationDates = [[NSMutableSet alloc] init];
    
    // Message delegate
    if ([delegate respondsToSelector:@selector(zipArchiveWillUnzipArchiveAtPath:zipInfo:)]) {
        [delegate zipArchiveWillUnzipArchiveAtPath:path zipInfo:globalInfo];
    }
    if ([delegate respondsToSelector:@selector(zipArchiveProgressEvent:total:)]) {
        [delegate zipArchiveProgressEvent:currentPosition total:fileSize];
    }
    
    NSInteger currentFileNumber = 0;
    do {
        @autoreleasepool {
            if ([password length] == 0) {
                ret = unzOpenCurrentFile(zip);
            } else {
                ret = unzOpenCurrentFilePassword(zip, [password cStringUsingEncoding:NSASCIIStringEncoding]);
            }
            
            if (ret != UNZ_OK) {
                success = NO;
                break;
            }
            
            // Reading data and write to file
            unz_file_info fileInfo;
            memset(&fileInfo, 0, sizeof(unz_file_info));
            
            ret = unzGetCurrentFileInfo(zip, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
            if (ret != UNZ_OK) {
                success = NO;
                unzCloseCurrentFile(zip);
                break;
            }
            
            currentPosition += fileInfo.compressed_size;
            
            // Message delegate
            if ([delegate respondsToSelector:@selector(zipArchiveShouldUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) {
                if (![delegate zipArchiveShouldUnzipFileAtIndex:currentFileNumber
                                                     totalFiles:(NSInteger)globalInfo.number_entry
                                                    archivePath:path fileInfo:fileInfo]) {
                    success = NO;
                    canceled = YES;
                    break;
                }
            }
            if ([delegate respondsToSelector:@selector(zipArchiveWillUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) {
                [delegate zipArchiveWillUnzipFileAtIndex:currentFileNumber totalFiles:(NSInteger)globalInfo.number_entry
                                             archivePath:path fileInfo:fileInfo];
            }
            if ([delegate respondsToSelector:@selector(zipArchiveProgressEvent:total:)]) {
                [delegate zipArchiveProgressEvent:(NSInteger)currentPosition total:(NSInteger)fileSize];
            }
            
            char *filename = (char *)malloc(fileInfo.size_filename + 1);
            if (filename == NULL)
            {
                return NO;
            }
            
            unzGetCurrentFileInfo(zip, &fileInfo, filename, fileInfo.size_filename + 1, NULL, 0, NULL, 0);
            filename[fileInfo.size_filename] = '\0';
            
            //
            // Determine whether this is a symbolic link:
            // - File is stored with 'version made by' value of UNIX (3),
            //   as per http://www.pkware.com/documents/casestudies/APPNOTE.TXT
            //   in the upper byte of the version field.
            // - BSD4.4 st_mode constants are stored in the high 16 bits of the
            //   external file attributes (defacto standard, verified against libarchive)
            //
            // The original constants can be found here:
            //    http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.4BSD/usr/include/sys/stat.h
            //
            const uLong ZipUNIXVersion = 3;
            const uLong BSD_SFMT = 0170000;
            const uLong BSD_IFLNK = 0120000;
            
            BOOL fileIsSymbolicLink = NO;
            if (((fileInfo.version >> 8) == ZipUNIXVersion) && BSD_IFLNK == (BSD_SFMT & (fileInfo.external_fa >> 16))) {
                fileIsSymbolicLink = NO;
            }
            
            // Check if it contains directory
            NSString *strPath = @(filename);
            BOOL isDirectory = NO;
            if (filename[fileInfo.size_filename-1] == '/' || filename[fileInfo.size_filename-1] == '\\') {
                isDirectory = YES;
            }
            free(filename);
            
            // Contains a path
            if ([strPath rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"/\\"]].location != NSNotFound) {
                strPath = [strPath stringByReplacingOccurrencesOfString:@"\\" withString:@"/"];
            }
            
            NSString *fullPath = [destination stringByAppendingPathComponent:strPath];
            NSError *err = nil;
            NSDate *modDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.dosDate];
            NSDictionary *directoryAttr = @{NSFileCreationDate: modDate, NSFileModificationDate: modDate};
            
            if (isDirectory) {
                [fileManager createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:directoryAttr  error:&err];
            } else {
                [fileManager createDirectoryAtPath:[fullPath stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:directoryAttr error:&err];
            }
            if (nil != err) {
                NSLog(@"[SSZipArchive] Error: %@", err.localizedDescription);
            }
            
            if(!fileIsSymbolicLink)
                [directoriesModificationDates addObject: @{@"path": fullPath, @"modDate": modDate}];
            
            if ([fileManager fileExistsAtPath:fullPath] && !isDirectory && !overwrite) {
                //FIXME: couldBe CRC Check?
                unzCloseCurrentFile(zip);
                ret = unzGoToNextFile(zip);
                continue;
            }
            
            if (!fileIsSymbolicLink) {
                FILE *fp = fopen((const char*)[fullPath UTF8String], "wb");
                while (fp) {
                    int readBytes = unzReadCurrentFile(zip, buffer, 4096);
                    
                    if (readBytes > 0) {
                        fwrite(buffer, readBytes, 1, fp );
                    } else {
                        break;
                    }
                }
                
                if (fp) {
                    if ([[[fullPath pathExtension] lowercaseString] isEqualToString:@"zip"]) {
                        NSLog(@"Unzipping nested .zip file:  %@", [fullPath lastPathComponent]);
                        if ([self unzipFileAtPath:fullPath toDestination:[fullPath stringByDeletingLastPathComponent] overwrite:overwrite password:password error:nil delegate:nil]) {
                            [[NSFileManager defaultManager] removeItemAtPath:fullPath error:nil];
                        }
                    }
                    
                    fclose(fp);
                    
                    // Set the original datetime property
                    if (fileInfo.dosDate != 0) {
                        NSDate *orgDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.dosDate];
                        NSDictionary *attr = @{NSFileModificationDate: orgDate};
                        
                        if (attr) {
                            if ([fileManager setAttributes:attr ofItemAtPath:fullPath error:nil] == NO) {
                                // Can't set attributes
                                NSLog(@"[SSZipArchive] Failed to set attributes - whilst setting modification date");
                            }
                        }
                    }
                    
                    // Set the original permissions on the file
                    uLong permissions = fileInfo.external_fa >> 16;
                    if (permissions != 0) {
                        // Store it into a NSNumber
                        NSNumber *permissionsValue = @(permissions);
                        
                        // Retrieve any existing attributes
                        NSMutableDictionary *attrs = [[NSMutableDictionary alloc] initWithDictionary:[fileManager attributesOfItemAtPath:fullPath error:nil]];
                        
                        // Set the value in the attributes dict
                        attrs[NSFilePosixPermissions] = permissionsValue;
                        
                        // Update attributes
                        if ([fileManager setAttributes:attrs ofItemAtPath:fullPath error:nil] == NO) {
                            // Unable to set the permissions attribute
                            NSLog(@"[SSZipArchive] Failed to set attributes - whilst setting permissions");
                        }
                        
#if !__has_feature(objc_arc)
                        [attrs release];
#endif
                    }
                }
            }
            else
            {
                // Assemble the path for the symbolic link
                NSMutableString* destinationPath = [NSMutableString string];
                int bytesRead = 0;
                while((bytesRead = unzReadCurrentFile(zip, buffer, 4096)) > 0)
                {
                    buffer[bytesRead] = (int)0;
                    [destinationPath appendString:@((const char*)buffer)];
                }
                
                // Create the symbolic link (making sure it stays relative if it was relative before)
                int symlinkError = symlink([destinationPath cStringUsingEncoding:NSUTF8StringEncoding],
                                           [fullPath cStringUsingEncoding:NSUTF8StringEncoding]);
                
                if(symlinkError != 0)
                {
                    NSLog(@"Failed to create symbolic link at \"%@\" to \"%@\". symlink() error code: %d", fullPath, destinationPath, errno);
                }
            }
            
            crc_ret = unzCloseCurrentFile( zip );
            if (crc_ret == UNZ_CRCERROR) {
                //CRC ERROR
                success = NO;
                break;
            }
            ret = unzGoToNextFile( zip );
            
            // Message delegate
            if ([delegate respondsToSelector:@selector(zipArchiveDidUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) {
                [delegate zipArchiveDidUnzipFileAtIndex:currentFileNumber totalFiles:(NSInteger)globalInfo.number_entry
                                            archivePath:path fileInfo:fileInfo];
            } else if ([delegate respondsToSelector: @selector(zipArchiveDidUnzipFileAtIndex:totalFiles:archivePath:unzippedFilePath:)]) {
                [delegate zipArchiveDidUnzipFileAtIndex: currentFileNumber totalFiles: (NSInteger)globalInfo.number_entry
                                            archivePath:path unzippedFilePath: fullPath];
            }
            
            currentFileNumber++;
            if (progressHandler)
            {
                progressHandler(strPath, fileInfo, currentFileNumber, globalInfo.number_entry);
            }
        }
    } while(ret == UNZ_OK && ret != UNZ_END_OF_LIST_OF_FILE);
    
    // Close
    unzClose(zip);
    
    // The process of decompressing the .zip archive causes the modification times on the folders
    // to be set to the present time. So, when we are done, they need to be explicitly set.
    // set the modification date on all of the directories.
    NSError * err = nil;
    for (NSDictionary * d in directoriesModificationDates) {
        if (![[NSFileManager defaultManager] setAttributes:@{NSFileModificationDate: d[@"modDate"]} ofItemAtPath:d[@"path"] error:&err]) {
            NSLog(@"[SSZipArchive] Set attributes failed for directory: %@.", d[@"path"]);
        }
        if (err) {
            NSLog(@"[SSZipArchive] Error setting directory file modification date attribute: %@",err.localizedDescription);
        }
    }
    
#if !__has_feature(objc_arc)
    [directoriesModificationDates release];
#endif
    
    // Message delegate
    if (success && [delegate respondsToSelector:@selector(zipArchiveDidUnzipArchiveAtPath:zipInfo:unzippedPath:)]) {
        [delegate zipArchiveDidUnzipArchiveAtPath:path zipInfo:globalInfo unzippedPath:destination];
    }
    // final progress event = 100%
    if (!canceled && [delegate respondsToSelector:@selector(zipArchiveProgressEvent:total:)]) {
        [delegate zipArchiveProgressEvent:fileSize total:fileSize];
    }
    
    NSError *retErr = nil;
    if (crc_ret == UNZ_CRCERROR)
    {
        NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"crc check failed for file"};
        retErr = [NSError errorWithDomain:@"SSZipArchiveErrorDomain" code:-3 userInfo:userInfo];
    }
    if (error)
    {
        *error = retErr;
    }
    if (completionHandler)
    {
        completionHandler(path, success, retErr);
    }
    return success;
}

#pragma mark - Zipping
+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths
{
    return [SSZipArchive createZipFileAtPath:path withFilesAtPaths:paths withPassword:nil];
}
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath{
    return [SSZipArchive createZipFileAtPath:path withContentsOfDirectory:directoryPath withPassword:nil];
}

+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirector{
    return [SSZipArchive createZipFileAtPath:path withContentsOfDirectory:directoryPath keepParentDirectory:keepParentDirector withPassword:nil];
}

+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths withPassword:(NSString *)password
{
    BOOL success = NO;
    SSZipArchive *zipArchive = [[SSZipArchive alloc] initWithPath:path];
    if ([zipArchive open]) {
        for (NSString *filePath in paths) {
            [zipArchive writeFile:filePath withPassword:password];
        }
        success = [zipArchive close];
    }
    
#if !__has_feature(objc_arc)
    [zipArchive release];
#endif
    
    return success;
}

+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath  withPassword:(NSString *)password{
    return [self createZipFileAtPath:path withContentsOfDirectory:directoryPath keepParentDirectory:NO withPassword:password];
}


+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirectory withPassword:(NSString *)password{
    BOOL success = NO;
    
    NSFileManager *fileManager = nil;
    SSZipArchive *zipArchive = [[SSZipArchive alloc] initWithPath:path];
    
    if ([zipArchive open]) {
        // use a local filemanager (queue/thread compatibility)
        fileManager = [[NSFileManager alloc] init];
        NSDirectoryEnumerator *dirEnumerator = [fileManager enumeratorAtPath:directoryPath];
        NSString *fileName;
        while ((fileName = [dirEnumerator nextObject])) {
            BOOL isDir;
            NSString *fullFilePath = [directoryPath stringByAppendingPathComponent:fileName];
            [fileManager fileExistsAtPath:fullFilePath isDirectory:&isDir];
            if (!isDir) {
                if (keepParentDirectory)
                {
                    fileName = [[directoryPath lastPathComponent] stringByAppendingPathComponent:fileName];
                }
                [zipArchive writeFileAtPath:fullFilePath withFileName:fileName withPassword:password];
            }
            else
            {
                if([[NSFileManager defaultManager] subpathsOfDirectoryAtPath:fullFilePath error:nil].count == 0)
                {
                    NSString *tempName = [fullFilePath stringByAppendingPathComponent:@".DS_Store"];
                    [@"" writeToFile:tempName atomically:YES encoding:NSUTF8StringEncoding error:nil];
                    [zipArchive writeFileAtPath:tempName withFileName:[fileName stringByAppendingPathComponent:@".DS_Store"] withPassword:password];
                    [[NSFileManager defaultManager] removeItemAtPath:tempName error:nil];
                }
            }
        }
        success = [zipArchive close];
    }
    
#if !__has_feature(objc_arc)
    [fileManager release];
    [zipArchive release];
#endif
    
    return success;
}


- (instancetype)initWithPath:(NSString *)path
{
    if ((self = [super init])) {
        _path = [path copy];
    }
    return self;
}


#if !__has_feature(objc_arc)
- (void)dealloc
{
    [_path release];
    [super dealloc];
}
#endif


- (BOOL)open
{
    NSAssert((_zip == NULL), @"Attempting open an archive which is already open");
    _zip = zipOpen([_path UTF8String], APPEND_STATUS_CREATE);
    return (NULL != _zip);
}


- (void)zipInfo:(zip_fileinfo*)zipInfo setDate:(NSDate*)date
{
    NSCalendar *currentCalendar = [NSCalendar currentCalendar];
#if defined(__IPHONE_8_0) || defined(__MAC_10_10)
    uint flags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
#else
    uint flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
#endif
    NSDateComponents *components = [currentCalendar components:flags fromDate:date];
    zipInfo->tmz_date.tm_sec = (unsigned int)components.second;
    zipInfo->tmz_date.tm_min = (unsigned int)components.minute;
    zipInfo->tmz_date.tm_hour = (unsigned int)components.hour;
    zipInfo->tmz_date.tm_mday = (unsigned int)components.day;
    zipInfo->tmz_date.tm_mon = (unsigned int)components.month - 1;
    zipInfo->tmz_date.tm_year = (unsigned int)components.year;
}

- (BOOL)writeFolderAtPath:(NSString *)path withFolderName:(NSString *)folderName withPassword:(NSString *)password
{
    NSAssert((_zip != NULL), @"Attempting to write to an archive which was never opened");
    
    zip_fileinfo zipInfo = {{0}};
    
    NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:path error: nil];
    if( attr )
    {
        NSDate *fileDate = (NSDate *)attr[NSFileModificationDate];
        if( fileDate )
        {
            [self zipInfo:&zipInfo setDate: fileDate ];
        }
        
        // Write permissions into the external attributes, for details on this see here: http://unix.stackexchange.com/a/14727
        // Get the permissions value from the files attributes
        NSNumber *permissionsValue = (NSNumber *)attr[NSFilePosixPermissions];
        if (permissionsValue) {
            // Get the short value for the permissions
            short permissionsShort = permissionsValue.shortValue;
            
            // Convert this into an octal by adding 010000, 010000 being the flag for a regular file
            NSInteger permissionsOctal = 0100000 + permissionsShort;
            
            // Convert this into a long value
            uLong permissionsLong = @(permissionsOctal).unsignedLongValue;
            
            // Store this into the external file attributes once it has been shifted 16 places left to form part of the second from last byte
            zipInfo.external_fa = permissionsLong << 16L;
        }
    }
    
    unsigned int len = 0;
    zipOpenNewFileInZip3(_zip, [[folderName stringByAppendingString:@"/"] UTF8String], &zipInfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_NO_COMPRESSION, 0, -MAX_WBITS, DEF_MEM_LEVEL,
                         Z_DEFAULT_STRATEGY, [password UTF8String], 0);
    zipWriteInFileInZip(_zip, &len, 0);
    zipCloseFileInZip(_zip);
    return YES;
}

- (BOOL)writeFile:(NSString *)path withPassword:(NSString *)password;
{
    return [self writeFileAtPath:path withFileName:nil withPassword:password];
}

// supports writing files with logical folder/directory structure
// *path* is the absolute path of the file that will be compressed
// *fileName* is the relative name of the file how it is stored within the zip e.g. /folder/subfolder/text1.txt
- (BOOL)writeFileAtPath:(NSString *)path withFileName:(NSString *)fileName withPassword:(NSString *)password
{
    NSAssert((_zip != NULL), @"Attempting to write to an archive which was never opened");
    
    FILE *input = fopen([path UTF8String], "r");
    if (NULL == input) {
        return NO;
    }
    
    const char *afileName;
    if (!fileName) {
        afileName = [path.lastPathComponent UTF8String];
    }
    else {
        afileName = [fileName UTF8String];
    }
    
    zip_fileinfo zipInfo = {{0}};
    
    NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:path error: nil];
    if( attr )
    {
        NSDate *fileDate = (NSDate *)attr[NSFileModificationDate];
        if( fileDate )
        {
            [self zipInfo:&zipInfo setDate: fileDate ];
        }
        
        // Write permissions into the external attributes, for details on this see here: http://unix.stackexchange.com/a/14727
        // Get the permissions value from the files attributes
        NSNumber *permissionsValue = (NSNumber *)attr[NSFilePosixPermissions];
        if (permissionsValue) {
            // Get the short value for the permissions
            short permissionsShort = permissionsValue.shortValue;
            
            // Convert this into an octal by adding 010000, 010000 being the flag for a regular file
            NSInteger permissionsOctal = 0100000 + permissionsShort;
            
            // Convert this into a long value
            uLong permissionsLong = @(permissionsOctal).unsignedLongValue;
            
            // Store this into the external file attributes once it has been shifted 16 places left to form part of the second from last byte
            zipInfo.external_fa = permissionsLong << 16L;
        }
    }
    
    void *buffer = malloc(CHUNK);
    if (buffer == NULL)
    {
        return NO;
    }

    zipOpenNewFileInZip3(_zip, afileName, &zipInfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, [password UTF8String], 0);
    unsigned int len = 0;
    
    while (!feof(input))
    {
        len = (unsigned int) fread(buffer, 1, CHUNK, input);
        zipWriteInFileInZip(_zip, buffer, len);
    }
    
    zipCloseFileInZip(_zip);
    free(buffer);
    fclose(input);
    return YES;
}

- (BOOL)writeData:(NSData *)data filename:(NSString *)filename withPassword:(NSString *)password;
{
    if (!_zip) {
        return NO;
    }
    if (!data) {
        return NO;
    }
    zip_fileinfo zipInfo = {{0,0,0,0,0,0},0,0,0};
    [self zipInfo:&zipInfo setDate:[NSDate date]];
    
    zipOpenNewFileInZip3(_zip, [filename UTF8String], &zipInfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, [password UTF8String], 0);
    
    zipWriteInFileInZip(_zip, data.bytes, (unsigned int)data.length);
    
    zipCloseFileInZip(_zip);
    return YES;
}


- (BOOL)close
{
    NSAssert((_zip != NULL), @"[SSZipArchive] Attempting to close an archive which was never opened");
    zipClose(_zip, NULL);
    return YES;
}

#pragma mark - Private

// Format from http://newsgroups.derkeiler.com/Archive/Comp/comp.os.msdos.programmer/2009-04/msg00060.html
// Two consecutive words, or a longword, YYYYYYYMMMMDDDDD hhhhhmmmmmmsssss
// YYYYYYY is years from 1980 = 0
// sssss is (seconds/2).
//
// 3658 = 0011 0110 0101 1000 = 0011011 0010 11000 = 27 2 24 = 2007-02-24
// 7423 = 0111 0100 0010 0011 - 01110 100001 00011 = 14 33 3 = 14:33:06
+ (NSDate *)_dateWithMSDOSFormat:(UInt32)msdosDateTime
{
    static const UInt32 kYearMask = 0xFE000000;
    static const UInt32 kMonthMask = 0x1E00000;
    static const UInt32 kDayMask = 0x1F0000;
    static const UInt32 kHourMask = 0xF800;
    static const UInt32 kMinuteMask = 0x7E0;
    static const UInt32 kSecondMask = 0x1F;
    
    static NSCalendar *gregorian;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
#if defined(__IPHONE_8_0) || defined(__MAC_10_10)
        gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
#else
        gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
#endif
    });
    
    NSDateComponents *components = [[NSDateComponents alloc] init];
    
    NSAssert(0xFFFFFFFF == (kYearMask | kMonthMask | kDayMask | kHourMask | kMinuteMask | kSecondMask), @"[SSZipArchive] MSDOS date masks don't add up");
    
    [components setYear:1980 + ((msdosDateTime & kYearMask) >> 25)];
    [components setMonth:(msdosDateTime & kMonthMask) >> 21];
    [components setDay:(msdosDateTime & kDayMask) >> 16];
    [components setHour:(msdosDateTime & kHourMask) >> 11];
    [components setMinute:(msdosDateTime & kMinuteMask) >> 5];
    [components setSecond:(msdosDateTime & kSecondMask) * 2];
    
    NSDate *date = [NSDate dateWithTimeInterval:0 sinceDate:[gregorian dateFromComponents:components]];
    
#if !__has_feature(objc_arc)
    [components release];
#endif
    
    return date;
}

@end#import <Foundation/Foundation.h>
#import <Cordova/CDVPlugin.h>
#import "SSZipArchive.h"

@interface ZipPlugin : CDVPlugin <SSZipArchiveDelegate> {
    @private
    CDVInvokedUrlCommand* _command;
}


- (void)unzip:(CDVInvokedUrlCommand*)command;
- (void)zipArchiveWillUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo;

@end
#import "ZipPlugin.h"
#import "CDVFile.h"

@implementation ZipPlugin

- (NSString *)pathForURL:(NSString *)urlString
{
    // Attempt to use the File plugin to resolve the destination argument to a
    // file path.
    NSString *path = nil;
    id filePlugin = [self.commandDelegate getCommandInstance:@"File"];
    if (filePlugin != nil) {
        CDVFilesystemURL* url = [CDVFilesystemURL fileSystemURLWithString:urlString];
        path = [filePlugin filesystemPathForURL:url];
    }
    // If that didn't work for any reason, assume file: URL.
    if (path == nil) {
        if ([urlString hasPrefix:@"file:"]) {
            path = [[NSURL URLWithString:urlString] path];
        }
    }
    return path;
}

- (void)unzip:(CDVInvokedUrlCommand*)command
{
    self->_command = command;
    [self.commandDelegate runInBackground:^{
        CDVPluginResult* pluginResult = nil;
        
        @try {
            NSString *zipURL = [command.arguments objectAtIndex:0];
            NSString *destinationURL = [command.arguments objectAtIndex:1];
            NSError *error;

            NSString *zipPath = [self pathForURL:zipURL];
            NSString *destinationPath = [self pathForURL:destinationURL];

            if([SSZipArchive unzipFileAtPath:zipPath toDestination:destinationPath overwrite:YES password:nil error:&error delegate:self]) {
                pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
            } else {
                NSLog(@"%@ - %@", @"Error occurred during unzipping", [error localizedDescription]);
                pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Error occurred during unzipping"];
            }
        } @catch(NSException* exception) {
            NSLog(@"%@ - %@", @"Error occurred during unzipping", [exception debugDescription]);
            pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Error occurred during unzipping"];
        }
        
        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
    }];
}

- (void)zipArchiveWillUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo
{
    NSMutableDictionary* message = [NSMutableDictionary dictionaryWithCapacity:2];
    [message setObject:[NSNumber numberWithLongLong:fileIndex] forKey:@"loaded"];
    [message setObject:[NSNumber numberWithLongLong:totalFiles] forKey:@"total"];
    
    CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:message];
    [pluginResult setKeepCallbackAsBool:YES];
    [self.commandDelegate sendPluginResult:pluginResult callbackId:self->_command.callbackId];
}
@end
/* crypt.h -- base code for traditional PKWARE encryption
   Version 1.01e, February 12th, 2005

   Copyright (C) 1998-2005 Gilles Vollant
   Modifications for Info-ZIP crypting
     Copyright (C) 2003 Terry Thorsen

   This code is a modified version of crypting code in Info-ZIP distribution

   Copyright (C) 1990-2000 Info-ZIP.  All rights reserved.

   See the Info-ZIP LICENSE file version 2000-Apr-09 or later for terms of use
   which also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html

   The encryption/decryption parts of this source code (as opposed to the
   non-echoing password parts) were originally written in Europe. The
   whole source package can be freely distributed, including from the USA.
   (Prior to January 2000, re-export from the US was a violation of US law.)

   This encryption code is a direct transcription of the algorithm from
   Roger Schlafly, described by Phil Katz in the file appnote.txt. This
   file (appnote.txt) is distributed with the PKZIP program (even in the
   version without encryption capabilities).

   If you don't need crypting in your application, just define symbols
   NOCRYPT and NOUNCRYPT.
*/

#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))

/***********************************************************************
 * Return the next byte in the pseudo-random sequence
 */
static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
{
    unsigned temp;  /* POTENTIAL BUG:  temp*(temp^1) may overflow in an
                     * unpredictable manner on 16-bit systems; not a problem
                     * with any known compiler so far, though */

    temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
    return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
}

/***********************************************************************
 * Update the encryption keys with the next byte of plain text
 */
static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
{
    (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
    (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
    (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
    {
      register int keyshift = (int)((*(pkeys+1)) >> 24);
      (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
    }
    return c;
}


/***********************************************************************
 * Initialize the encryption keys and the random header according to
 * the given password.
 */
static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
{
    *(pkeys+0) = 305419896L;
    *(pkeys+1) = 591751049L;
    *(pkeys+2) = 878082192L;
    while (*passwd != 0) {
        update_keys(pkeys,pcrc_32_tab,(int)*passwd);
        passwd++;
    }
}

#define zdecode(pkeys,pcrc_32_tab,c) \
    (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))

#define zencode(pkeys,pcrc_32_tab,c,t) \
    (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))

#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED

#define RAND_HEAD_LEN  12
   /* "last resort" source for second part of crypt seed pattern */
#  ifndef ZCR_SEED2
#    define ZCR_SEED2 3141592654UL     /* use PI as default pattern */
#  endif

static int crypthead(const char* passwd,      /* password string */
                     unsigned char* buf,      /* where to write header */
                     int bufSize,
                     unsigned long* pkeys,
                     const unsigned long* pcrc_32_tab,
                     unsigned long crcForCrypting)
{
    int n;                                  /* index in random header */
    int t;                                  /* temporary */
    int c;                                  /* random byte */
    unsigned char header[RAND_HEAD_LEN-2];  /* random header */
    static unsigned calls = 0;              /* ensure different random header each time */

    if (bufSize<RAND_HEAD_LEN)
      return 0;

    /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
     * output of rand() to get less predictability, since rand() is
     * often poorly implemented.
     */
    if (++calls == 1)
    {
        srand((unsigned)(time(NULL) ^ ZCR_SEED2));
    }
    init_keys(passwd, pkeys, pcrc_32_tab);
    for (n = 0; n < RAND_HEAD_LEN-2; n++)
    {
        c = (rand() >> 7) & 0xff;
        header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
    }
    /* Encrypt random header (last two bytes is high word of crc) */
    init_keys(passwd, pkeys, pcrc_32_tab);
    for (n = 0; n < RAND_HEAD_LEN-2; n++)
    {
        buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
    }
    buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
    buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
    return n;
}

#endif
/* ioapi.h -- IO base function header for compress/uncompress .zip
   part of the MiniZip project

   Copyright (C) 1998-2010 Gilles Vollant
     http://www.winimage.com/zLibDll/minizip.html
   Modifications for Zip64 support
     Copyright (C) 2009-2010 Mathias Svensson
     http://result42.com

   This program is distributed under the terms of the same license as zlib.
   See the accompanying LICENSE file for the full text of the license.
*/

#include <stdlib.h>
#include <string.h>

#include "ioapi.h"

#if defined(_WIN32)
#  define snprintf _snprintf
#endif

#ifdef __APPLE__
/* In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions */
#  define FOPEN_FUNC(filename, mode) fopen(filename, mode)
#  define FTELLO_FUNC(stream) ftello(stream)
#  define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)
#else
#  define FOPEN_FUNC(filename, mode) fopen64(filename, mode)
#  define FTELLO_FUNC(stream) ftello64(stream)
#  define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
#endif

/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
#ifndef SEEK_CUR
#  define SEEK_CUR    1
#endif
#ifndef SEEK_END
#  define SEEK_END    2
#endif
#ifndef SEEK_SET
#  define SEEK_SET    0
#endif

voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)
{
    if (pfilefunc->zfile_func64.zopen64_file != NULL)
        return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);
    return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode);
}

voidpf call_zopendisk64 OF((const zlib_filefunc64_32_def* pfilefunc, voidpf filestream, int number_disk, int mode))
{
    if (pfilefunc->zfile_func64.zopendisk64_file != NULL)
        return (*(pfilefunc->zfile_func64.zopendisk64_file)) (pfilefunc->zfile_func64.opaque,filestream,number_disk,mode);
    return (*(pfilefunc->zopendisk32_file))(pfilefunc->zfile_func64.opaque,filestream,number_disk,mode);
}

long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)
{
    uLong offsetTruncated;
    if (pfilefunc->zfile_func64.zseek64_file != NULL)
        return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin);
    offsetTruncated = (uLong)offset;
    if (offsetTruncated != offset)
        return -1;
    return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin);
}

ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)
{
    uLong tell_uLong;
    if (pfilefunc->zfile_func64.zseek64_file != NULL)
        return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);
    tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream);
    if ((tell_uLong) == 0xffffffff)
        return (ZPOS64_T)-1;
    return tell_uLong;
}

void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32)
{
    p_filefunc64_32->zfile_func64.zopen64_file = NULL;
    p_filefunc64_32->zfile_func64.zopendisk64_file = NULL;
    p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;
    p_filefunc64_32->zopendisk32_file = p_filefunc32->zopendisk_file;
    p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
    p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;
    p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;
    p_filefunc64_32->zfile_func64.ztell64_file = NULL;
    p_filefunc64_32->zfile_func64.zseek64_file = NULL;
    p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file;
    p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
    p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque;
    p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file;
    p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
}

static voidpf  ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode));
static uLong   ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
static uLong   ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size));
static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream));
static long    ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
static int     ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream));
static int     ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));

typedef struct 
{
    FILE *file;
    int filenameLength;
    void *filename;
} FILE_IOPOSIX;

static voidpf file_build_ioposix(FILE *file, const char *filename)
{
    FILE_IOPOSIX *ioposix = NULL;
    if (file == NULL)
        return NULL;
    ioposix = (FILE_IOPOSIX*)malloc(sizeof(FILE_IOPOSIX));
    ioposix->file = file;
    ioposix->filenameLength = (int)strlen(filename) + 1;
    ioposix->filename = (char*)malloc(ioposix->filenameLength * sizeof(char));
    strncpy(ioposix->filename, filename, ioposix->filenameLength);
    return (voidpf)ioposix;
}

static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)
{
    FILE* file = NULL;
    const char* mode_fopen = NULL;
    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)
        mode_fopen = "rb";
    else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
        mode_fopen = "r+b";
    else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
        mode_fopen = "wb";

    if ((filename != NULL) && (mode_fopen != NULL))
    {
        file = fopen(filename, mode_fopen);
        return file_build_ioposix(file, filename);
    }
    return file;
}

static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)
{
    FILE* file = NULL;
    const char* mode_fopen = NULL;
    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)
        mode_fopen = "rb";
    else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
        mode_fopen = "r+b";
    else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
        mode_fopen = "wb";

    if ((filename != NULL) && (mode_fopen != NULL))
    {
        file = FOPEN_FUNC((const char*)filename, mode_fopen);
        return file_build_ioposix(file, (const char*)filename);
    }
    return file;
}

static voidpf ZCALLBACK fopendisk64_file_func (voidpf opaque, voidpf stream, int number_disk, int mode)
{
    FILE_IOPOSIX *ioposix = NULL;
    char *diskFilename = NULL;
    voidpf ret = NULL;
    int i = 0;

    if (stream == NULL)
        return NULL;
    ioposix = (FILE_IOPOSIX*)stream;
    diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char));
    strncpy(diskFilename, ioposix->filename, ioposix->filenameLength);
    for (i = ioposix->filenameLength - 1; i >= 0; i -= 1)
    {
        if (diskFilename[i] != '.') 
            continue;
        snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02d", number_disk + 1);
        break;
    }
    if (i >= 0)
        ret = fopen64_file_func(opaque, diskFilename, mode);
    free(diskFilename);
    return ret;
}

static voidpf ZCALLBACK fopendisk_file_func (voidpf opaque, voidpf stream, int number_disk, int mode)
{
    FILE_IOPOSIX *ioposix = NULL;
    char *diskFilename = NULL;
    voidpf ret = NULL;
    int i = 0;

    if (stream == NULL)
        return NULL;
    ioposix = (FILE_IOPOSIX*)stream;
    diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char));
    strncpy(diskFilename, ioposix->filename, ioposix->filenameLength);
    for (i = ioposix->filenameLength - 1; i >= 0; i -= 1)
    {
        if (diskFilename[i] != '.') 
            continue;
        snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02d", number_disk + 1);
        break;
    }
    if (i >= 0)
        ret = fopen_file_func(opaque, diskFilename, mode);
    free(diskFilename);
    return ret;
}

static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)
{
    FILE_IOPOSIX *ioposix = NULL;
    uLong ret;
    if (stream == NULL)
        return -1;
    ioposix = (FILE_IOPOSIX*)stream;
    ret = (uLong)fread(buf, 1, (size_t)size, ioposix->file);
    return ret;
}

static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)
{
    FILE_IOPOSIX *ioposix = NULL;
    uLong ret;
    if (stream == NULL)
        return -1;
    ioposix = (FILE_IOPOSIX*)stream;
    ret = (uLong)fwrite(buf, 1, (size_t)size, ioposix->file);
    return ret;
}

static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
{
    FILE_IOPOSIX *ioposix = NULL;
    long ret = -1;
    if (stream == NULL)
        return ret;
    ioposix = (FILE_IOPOSIX*)stream;
    ret = ftell(ioposix->file);
    return ret;
}

static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
{
    FILE_IOPOSIX *ioposix = NULL;
    ZPOS64_T ret = -1;
    if (stream == NULL)
        return ret;
    ioposix = (FILE_IOPOSIX*)stream;
    ret = FTELLO_FUNC(ioposix->file);
    return ret;
}

static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin)
{
    FILE_IOPOSIX *ioposix = NULL;
    int fseek_origin = 0;
    long ret = 0;

    if (stream == NULL)
        return -1;
    ioposix = (FILE_IOPOSIX*)stream;

    switch (origin)
    {
        case ZLIB_FILEFUNC_SEEK_CUR:
            fseek_origin = SEEK_CUR;
            break;
        case ZLIB_FILEFUNC_SEEK_END:
            fseek_origin = SEEK_END;
            break;
        case ZLIB_FILEFUNC_SEEK_SET:
            fseek_origin = SEEK_SET;
            break;
        default:
            return -1;
    }
    if (fseek(ioposix->file, offset, fseek_origin) != 0)
        ret = -1;
    return ret;
}

static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)
{
    FILE_IOPOSIX *ioposix = NULL;
    int fseek_origin = 0;
    long ret = 0;

    if (stream == NULL)
        return -1;
    ioposix = (FILE_IOPOSIX*)stream;

    switch (origin)
    {
        case ZLIB_FILEFUNC_SEEK_CUR:
            fseek_origin = SEEK_CUR;
            break;
        case ZLIB_FILEFUNC_SEEK_END:
            fseek_origin = SEEK_END;
            break;
        case ZLIB_FILEFUNC_SEEK_SET:
            fseek_origin = SEEK_SET;
            break;
        default:
            return -1;
    }

    if(FSEEKO_FUNC(ioposix->file, offset, fseek_origin) != 0)
        ret = -1;

    return ret;
}


static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
{
    FILE_IOPOSIX *ioposix = NULL;
    int ret = -1;
    if (stream == NULL)
        return ret;
    ioposix = (FILE_IOPOSIX*)stream;
    if (ioposix->filename != NULL)
        free(ioposix->filename);
    ret = fclose(ioposix->file);
    free(ioposix);
    return ret;
}

static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
{
    FILE_IOPOSIX *ioposix = NULL;
    int ret = -1;
    if (stream == NULL)
        return ret;
    ioposix = (FILE_IOPOSIX*)stream;
    ret = ferror(ioposix->file);
    return ret;
}

void fill_fopen_filefunc (zlib_filefunc_def* pzlib_filefunc_def)
{
    pzlib_filefunc_def->zopen_file = fopen_file_func;
    pzlib_filefunc_def->zopendisk_file = fopendisk_file_func;
    pzlib_filefunc_def->zread_file = fread_file_func;
    pzlib_filefunc_def->zwrite_file = fwrite_file_func;
    pzlib_filefunc_def->ztell_file = ftell_file_func;
    pzlib_filefunc_def->zseek_file = fseek_file_func;
    pzlib_filefunc_def->zclose_file = fclose_file_func;
    pzlib_filefunc_def->zerror_file = ferror_file_func;
    pzlib_filefunc_def->opaque = NULL;
}

void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def)
{
    pzlib_filefunc_def->zopen64_file = fopen64_file_func;
    pzlib_filefunc_def->zopendisk64_file = fopendisk64_file_func;
    pzlib_filefunc_def->zread_file = fread_file_func;
    pzlib_filefunc_def->zwrite_file = fwrite_file_func;
    pzlib_filefunc_def->ztell64_file = ftell64_file_func;
    pzlib_filefunc_def->zseek64_file = fseek64_file_func;
    pzlib_filefunc_def->zclose_file = fclose_file_func;
    pzlib_filefunc_def->zerror_file = ferror_file_func;
    pzlib_filefunc_def->opaque = NULL;
}
/* ioapi.h -- IO base function header for compress/uncompress .zip
   part of the MiniZip project

   Copyright (C) 1998-2010 Gilles Vollant
     http://www.winimage.com/zLibDll/minizip.html
   Modifications for Zip64 support
     Copyright (C) 2009-2010 Mathias Svensson
     http://result42.com

   This program is distributed under the terms of the same license as zlib.
   See the accompanying LICENSE file for the full text of the license.
*/

#ifndef _ZLIBIOAPI64_H
#define _ZLIBIOAPI64_H

#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
#  ifndef __USE_FILE_OFFSET64
#    define __USE_FILE_OFFSET64
#  endif
#  ifndef __USE_LARGEFILE64
#    define __USE_LARGEFILE64
#  endif
#  ifndef _LARGEFILE64_SOURCE
#    define _LARGEFILE64_SOURCE
#  endif
#  ifndef _FILE_OFFSET_BIT
#    define _FILE_OFFSET_BIT 64
#  endif
#endif

#include <stdio.h>
#include <stdlib.h>
#include "zlib.h"

#if defined(USE_FILE32API)
#  define fopen64 fopen
#  define ftello64 ftell
#  define fseeko64 fseek
#else
#  if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
#    define fopen64 fopen
#    define ftello64 ftello
#    define fseeko64 fseeko
#  endif
#  ifdef _MSC_VER
#    define fopen64 fopen
#    if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC)))
#      define ftello64 _ftelli64
#      define fseeko64 _fseeki64
#    else /* old MSC */
#      define ftello64 ftell
#      define fseeko64 fseek
#    endif
#  endif
#endif

/* a type choosen by DEFINE */
#ifdef HAVE_64BIT_INT_CUSTOM
typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T;
#else
#  ifdef HAS_STDINT_H
#    include "stdint.h"
     typedef uint64_t ZPOS64_T;
#  else
#    if defined(_MSC_VER) || defined(__BORLANDC__)
       typedef unsigned __int64 ZPOS64_T;
#    else
       typedef unsigned long long int ZPOS64_T;
#    endif
#  endif
#endif

#ifdef __cplusplus
extern "C" {
#endif

#define ZLIB_FILEFUNC_SEEK_CUR (1)
#define ZLIB_FILEFUNC_SEEK_END (2)
#define ZLIB_FILEFUNC_SEEK_SET (0)

#define ZLIB_FILEFUNC_MODE_READ             (1)
#define ZLIB_FILEFUNC_MODE_WRITE            (2)
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER  (3)
#define ZLIB_FILEFUNC_MODE_EXISTING         (4)
#define ZLIB_FILEFUNC_MODE_CREATE           (8)

#ifndef ZCALLBACK
#  if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || \
       defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
#    define ZCALLBACK CALLBACK
#  else
#    define ZCALLBACK
#  endif
#endif

typedef voidpf   (ZCALLBACK *open_file_func)      OF((voidpf opaque, const char* filename, int mode));
typedef voidpf   (ZCALLBACK *opendisk_file_func)  OF((voidpf opaque, voidpf stream, int number_disk, int mode));
typedef uLong    (ZCALLBACK *read_file_func)      OF((voidpf opaque, voidpf stream, void* buf, uLong size));
typedef uLong    (ZCALLBACK *write_file_func)     OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
typedef int      (ZCALLBACK *close_file_func)     OF((voidpf opaque, voidpf stream));
typedef int      (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));

typedef long     (ZCALLBACK *tell_file_func)      OF((voidpf opaque, voidpf stream));
typedef long     (ZCALLBACK *seek_file_func)      OF((voidpf opaque, voidpf stream, uLong offset, int origin));

/* here is the "old" 32 bits structure structure */
typedef struct zlib_filefunc_def_s
{
    open_file_func      zopen_file;
    opendisk_file_func  zopendisk_file;
    read_file_func      zread_file;
    write_file_func     zwrite_file;
    tell_file_func      ztell_file;
    seek_file_func      zseek_file;
    close_file_func     zclose_file;
    testerror_file_func zerror_file;
    voidpf              opaque;
} zlib_filefunc_def;

typedef ZPOS64_T (ZCALLBACK *tell64_file_func)    OF((voidpf opaque, voidpf stream));
typedef long     (ZCALLBACK *seek64_file_func)    OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
typedef voidpf   (ZCALLBACK *open64_file_func)    OF((voidpf opaque, const void* filename, int mode));
typedef voidpf   (ZCALLBACK *opendisk64_file_func)OF((voidpf opaque, voidpf stream, int number_disk, int mode));

typedef struct zlib_filefunc64_def_s
{
    open64_file_func     zopen64_file;
    opendisk64_file_func zopendisk64_file;
    read_file_func       zread_file;
    write_file_func      zwrite_file;
    tell64_file_func     ztell64_file;
    seek64_file_func     zseek64_file;
    close_file_func      zclose_file;
    testerror_file_func  zerror_file;
    voidpf               opaque;
} zlib_filefunc64_def;

void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def));

/* now internal definition, only for zip.c and unzip.h */
typedef struct zlib_filefunc64_32_def_s
{
    zlib_filefunc64_def zfile_func64;
    open_file_func      zopen32_file;
    opendisk_file_func  zopendisk32_file;
    tell_file_func      ztell32_file;
    seek_file_func      zseek32_file;
} zlib_filefunc64_32_def;

#define ZREAD64(filefunc,filestream,buf,size)       ((*((filefunc).zfile_func64.zread_file))        ((filefunc).zfile_func64.opaque,filestream,buf,size))
#define ZWRITE64(filefunc,filestream,buf,size)      ((*((filefunc).zfile_func64.zwrite_file))       ((filefunc).zfile_func64.opaque,filestream,buf,size))
/*#define ZTELL64(filefunc,filestream)                ((*((filefunc).ztell64_file))                   ((filefunc).opaque,filestream))*/
/*#define ZSEEK64(filefunc,filestream,pos,mode)       ((*((filefunc).zseek64_file))                   ((filefunc).opaque,filestream,pos,mode))*/
#define ZCLOSE64(filefunc,filestream)               ((*((filefunc).zfile_func64.zclose_file))       ((filefunc).zfile_func64.opaque,filestream))
#define ZERROR64(filefunc,filestream)               ((*((filefunc).zfile_func64.zerror_file))       ((filefunc).zfile_func64.opaque,filestream))

voidpf   call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode));
voidpf   call_zopendisk64 OF((const zlib_filefunc64_32_def* pfilefunc, voidpf filestream, int number_disk, int mode));
long     call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin));
ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream));

void fill_zlib_filefunc64_32_def_from_filefunc32 OF((zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32));

#define ZOPEN64(filefunc,filename,mode)             (call_zopen64((&(filefunc)),(filename),(mode)))
#define ZOPENDISK64(filefunc,filestream,diskn,mode) (call_zopendisk64((&(filefunc)),(filestream),(diskn),(mode)))
#define ZTELL64(filefunc,filestream)                (call_ztell64((&(filefunc)),(filestream)))
#define ZSEEK64(filefunc,filestream,pos,mode)       (call_zseek64((&(filefunc)),(filestream),(pos),(mode)))

#ifdef __cplusplus
}
#endif

#endif
/*
  Additional tools for Minizip
  Code: Xavier Roche '2004
  License: Same as ZLIB (www.gzip.org)
*/

/* Code */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "zlib.h"
#include "unzip.h"
#include "mztools.h"

#define READ_8(adr)  ((unsigned char)*(adr))
#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) )
#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) )

#define WRITE_8(buff, n) do { \
  *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \
} while(0)
#define WRITE_16(buff, n) do { \
  WRITE_8((unsigned char*)(buff), n); \
  WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \
} while(0)
#define WRITE_32(buff, n) do { \
  WRITE_16((unsigned char*)(buff), (n) & 0xffff); \
  WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \
} while(0)

extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered)
const char* file;
const char* fileOut;
const char* fileOutTmp;
uLong* nRecovered;
uLong* bytesRecovered;
{
  int err = Z_OK;
  FILE* fpZip = fopen(file, "rb");
  FILE* fpOut = fopen(fileOut, "wb");
  FILE* fpOutCD = fopen(fileOutTmp, "wb");
  if (fpZip != NULL &&  fpOut != NULL) {
    int entries = 0;
    uLong totalBytes = 0;
    char header[30];
    char filename[256];
    char extra[1024];
    int offset = 0;
    int offsetCD = 0;
    while ( fread(header, 1, 30, fpZip) == 30 ) {
      int currentOffset = offset;

      /* File entry */
      if (READ_32(header) == 0x04034b50) {
        unsigned int version = READ_16(header + 4);
        unsigned int gpflag = READ_16(header + 6);
        unsigned int method = READ_16(header + 8);
        unsigned int filetime = READ_16(header + 10);
        unsigned int filedate = READ_16(header + 12);
        unsigned int crc = READ_32(header + 14); /* crc */
        unsigned int cpsize = READ_32(header + 18); /* compressed size */
        unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */
        unsigned int fnsize = READ_16(header + 26); /* file name length */
        unsigned int extsize = READ_16(header + 28); /* extra field length */
        filename[0] = extra[0] = '\0';
        
        /* Header */
        if (fwrite(header, 1, 30, fpOut) == 30) {
          offset += 30;
        } else {
          err = Z_ERRNO;
          break;
        }
        
        /* Filename */
        if (fnsize > 0) {
          if (fread(filename, 1, fnsize, fpZip) == fnsize) {
            if (fwrite(filename, 1, fnsize, fpOut) == fnsize) {
              offset += fnsize;
            } else {
              err = Z_ERRNO;
              break;
            }
          } else {
            err = Z_ERRNO;
            break;
          }
        } else {
          err = Z_STREAM_ERROR;
          break;
        }

        /* Extra field */
        if (extsize > 0) {
          if (fread(extra, 1, extsize, fpZip) == extsize) {
            if (fwrite(extra, 1, extsize, fpOut) == extsize) {
              offset += extsize;
            } else {
              err = Z_ERRNO;
              break;
            }
          } else {
            err = Z_ERRNO;
            break;
          }
        }
        
        /* Data */
        {
          int dataSize = cpsize;
          if (dataSize == 0) {
            dataSize = uncpsize;
          }
          if (dataSize > 0) {
            char* data = malloc(dataSize);
            if (data != NULL) {
              if ((int)fread(data, 1, dataSize, fpZip) == dataSize) {
                if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) {
                  offset += dataSize;
                  totalBytes += dataSize;
                } else {
                  err = Z_ERRNO;
                }
              } else {
                err = Z_ERRNO;
              }
              free(data);
              if (err != Z_OK) {
                break;
              }
            } else {
              err = Z_MEM_ERROR;
              break;
            }
          }
        }
        
        /* Central directory entry */
        {
          char centralDirectoryEntryHeader[46];
          //char* comment = "";
          //int comsize = (int) strlen(comment);
          WRITE_32(centralDirectoryEntryHeader, 0x02014b50);
          WRITE_16(centralDirectoryEntryHeader + 4, version);
          WRITE_16(centralDirectoryEntryHeader + 6, version);
          WRITE_16(centralDirectoryEntryHeader + 8, gpflag);
          WRITE_16(centralDirectoryEntryHeader + 10, method);
          WRITE_16(centralDirectoryEntryHeader + 12, filetime);
          WRITE_16(centralDirectoryEntryHeader + 14, filedate);
          WRITE_32(centralDirectoryEntryHeader + 16, crc);
          WRITE_32(centralDirectoryEntryHeader + 20, cpsize);
          WRITE_32(centralDirectoryEntryHeader + 24, uncpsize);
          WRITE_16(centralDirectoryEntryHeader + 28, fnsize);
          WRITE_16(centralDirectoryEntryHeader + 30, extsize);
          WRITE_16(centralDirectoryEntryHeader + 32, 0 /*comsize*/);
          WRITE_16(centralDirectoryEntryHeader + 34, 0);     /* disk # */
          WRITE_16(centralDirectoryEntryHeader + 36, 0);     /* int attrb */
          WRITE_32(centralDirectoryEntryHeader + 38, 0);     /* ext attrb */
          WRITE_32(centralDirectoryEntryHeader + 42, currentOffset);
          /* Header */
          if (fwrite(centralDirectoryEntryHeader, 1, 46, fpOutCD) == 46) {
            offsetCD += 46;
            
            /* Filename */
            if (fnsize > 0) {
              if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) {
                offsetCD += fnsize;
              } else {
                err = Z_ERRNO;
                break;
              }
            } else {
              err = Z_STREAM_ERROR;
              break;
            }
            
            /* Extra field */
            if (extsize > 0) {
              if (fwrite(extra, 1, extsize, fpOutCD) == extsize) {
                offsetCD += extsize;
              } else {
                err = Z_ERRNO;
                break;
              }
            }
            
            /* Comment field */
            /*
            if (comsize > 0) {
              if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) {
                offsetCD += comsize;
              } else {
                err = Z_ERRNO;
                break;
              }
            }
            */
            
          } else {
            err = Z_ERRNO;
            break;
          }
        }

        /* Success */
        entries++;

      } else {
        break;
      }
    }

    /* Final central directory  */
    {
      int entriesZip = entries;
      char finalCentralDirectoryHeader[22];
      //char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools";
      //int comsize = (int) strlen(comment);
      if (entriesZip > 0xffff) {
        entriesZip = 0xffff;
      }
      WRITE_32(finalCentralDirectoryHeader, 0x06054b50);
      WRITE_16(finalCentralDirectoryHeader + 4, 0);    /* disk # */
      WRITE_16(finalCentralDirectoryHeader + 6, 0);    /* disk # */
      WRITE_16(finalCentralDirectoryHeader + 8, entriesZip);   /* hack */
      WRITE_16(finalCentralDirectoryHeader + 10, entriesZip);  /* hack */
      WRITE_32(finalCentralDirectoryHeader + 12, offsetCD);    /* size of CD */
      WRITE_32(finalCentralDirectoryHeader + 16, offset);      /* offset to CD */
      WRITE_16(finalCentralDirectoryHeader + 20, 0 /*comsize*/);     /* comment */
      
      /* Header */
      if (fwrite(finalCentralDirectoryHeader, 1, 22, fpOutCD) == 22) {
        
        /* Comment field */
        /*
        if (comsize > 0) {
          if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) {
            err = Z_ERRNO;
          }
        }
        */
      } else {
        err = Z_ERRNO;
      }
    }

    /* Final merge (file + central directory) */
    fclose(fpOutCD);
    if (err == Z_OK) {
      fpOutCD = fopen(fileOutTmp, "rb");
      if (fpOutCD != NULL) {
        int nRead;
        char buffer[8192];
        while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) {
          if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) {
            err = Z_ERRNO;
            break;
          }
        }
        fclose(fpOutCD);
      }
    }
    
    /* Close */
    fclose(fpZip);
    fclose(fpOut);
    
    /* Wipe temporary file */
    (void)remove(fileOutTmp);
    
    /* Number of recovered entries */
    if (err == Z_OK) {
      if (nRecovered != NULL) {
        *nRecovered = entries;
      }
      if (bytesRecovered != NULL) {
        *bytesRecovered = totalBytes;
      }
    }
  } else {
    err = Z_STREAM_ERROR;
  }
  return err;
}
/*
  Additional tools for Minizip
  Code: Xavier Roche '2004
  License: Same as ZLIB (www.gzip.org)
*/

#ifndef _zip_tools_H
#define _zip_tools_H

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _ZLIB_H
#include "zlib.h"
#endif

#include "unzip.h"

/* Repair a ZIP file (missing central directory)
   file: file to recover
   fileOut: output file after recovery
   fileOutTmp: temporary file name used for recovery
*/
extern int ZEXPORT unzRepair(const char* file,
                             const char* fileOut,
                             const char* fileOutTmp,
                             uLong* nRecovered,
                             uLong* bytesRecovered);

#endif
/* unzip.c -- IO for uncompress .zip files using zlib
   Version 1.1, February 14h, 2010
   part of the MiniZip project

   Copyright (C) 1998-2010 Gilles Vollant
     http://www.winimage.com/zLibDll/minizip.html
   Modifications of Unzip for Zip64
     Copyright (C) 2007-2008 Even Rouault
   Modifications for Zip64 support on both zip and unzip
     Copyright (C) 2009-2010 Mathias Svensson
     http://result42.com
   Modifications for AES, PKWARE disk spanning
     Copyright (C) 2010-2014 Nathan Moinvaziri

   This program is distributed under the terms of the same license as zlib.
   See the accompanying LICENSE file for the full text of the license.
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*#ifndef NOUNCRYPT
 #  define NOUNCRYPT
 #endif*/

#include "zlib.h"
#include "unzip.h"

#include "Common.h"

#ifdef STDC
#  include <stddef.h>
#  include <string.h>
#  include <stdlib.h>
#endif
#ifdef NO_ERRNO_H
extern int errno;
#else
#  include <errno.h>
#endif

#ifdef HAVE_AES
#  define AES_METHOD          (99)
#  define AES_PWVERIFYSIZE    (2)
#  define AES_MAXSALTLENGTH   (16)
#  define AES_AUTHCODESIZE    (10)
#  define AES_HEADERSIZE      (11)
#  define AES_KEYSIZE(mode)   (64 + (mode * 64))

#  include "aes.h"
#  include "fileenc.h"
#endif
#ifndef NOUNCRYPT
#  include "crypt.h"
#endif

#ifndef local
#  define local static
#endif
/* compile with -Dlocal if your debugger can't find static symbols */

#define DISKHEADERMAGIC          (0x08074b50)
#define LOCALHEADERMAGIC         (0x04034b50)
#define CENTRALHEADERMAGIC       (0x02014b50)
#define ENDHEADERMAGIC           (0x06054b50)
#define ZIP64ENDHEADERMAGIC      (0x06064b50)
#define ZIP64ENDLOCHEADERMAGIC   (0x07064b50)

#define SIZECENTRALDIRITEM       (0x2e)
#define SIZECENTRALHEADERLOCATOR (0x14) /* 20 */
#define SIZEZIPLOCALHEADER       (0x1e)

#ifndef BUFREADCOMMENT
#  define BUFREADCOMMENT (0x400)
#endif

#ifndef UNZ_BUFSIZE
#  define UNZ_BUFSIZE (64 * 1024)
#endif
#ifndef UNZ_MAXFILENAMEINZIP
#  define UNZ_MAXFILENAMEINZIP (256)
#endif

#ifndef ALLOC
#  define ALLOC(size) (malloc(size))
#endif
#ifndef TRYFREE
#  define TRYFREE(p) {if (p) free(p); }
#endif

const char unz_copyright[] =
    " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";

/* unz_file_info_interntal contain internal info about a file in zipfile*/
typedef struct unz_file_info64_internal_s {
    ZPOS64_T offset_curfile;            /* relative offset of local header 8 bytes */
    ZPOS64_T byte_before_the_zipfile;   /* byte before the zipfile, (>0 for sfx) */
#ifdef HAVE_AES
    uLong aes_encryption_mode;
    uLong aes_compression_method;
    uLong aes_version;
#endif
} unz_file_info64_internal;

/* file_in_zip_read_info_s contain internal information about a file in zipfile */
typedef struct {
    Bytef *read_buffer;                 /* internal buffer for compressed data */
    z_stream stream;                    /* zLib stream structure for inflate */

#ifdef HAVE_BZIP2
    bz_stream bstream;                  /* bzLib stream structure for bziped */
#endif
#ifdef HAVE_AES
    fcrypt_ctx aes_ctx;
#endif

    ZPOS64_T pos_in_zipfile;            /* position in byte on the zipfile, for fseek */
    uLong stream_initialised;           /* flag set if stream structure is initialised */

    ZPOS64_T offset_local_extrafield;   /* offset of the local extra field */
    uInt size_local_extrafield;         /* size of the local extra field */
    ZPOS64_T pos_local_extrafield;      /* position in the local extra field in read */
    ZPOS64_T total_out_64;

    uLong crc32;                        /* crc32 of all data uncompressed */
    uLong crc32_wait;                   /* crc32 we must obtain after decompress all */
    ZPOS64_T rest_read_compressed;      /* number of byte to be decompressed */
    ZPOS64_T rest_read_uncompressed;    /* number of byte to be obtained after decomp */

    zlib_filefunc64_32_def z_filefunc;

    voidpf filestream;                  /* io structore of the zipfile */
    uLong compression_method;           /* compression method (0==store) */
    ZPOS64_T byte_before_the_zipfile;   /* byte before the zipfile, (>0 for sfx) */
    int raw;
} file_in_zip64_read_info_s;

/* unz64_s contain internal information about the zipfile */
typedef struct {
    zlib_filefunc64_32_def z_filefunc;
    voidpf filestream;                  /* io structure of the current zipfile */
    voidpf filestream_with_CD;          /* io structure of the disk with the central directory */
    unz_global_info64 gi;               /* public global information */
    ZPOS64_T byte_before_the_zipfile;   /* byte before the zipfile, (>0 for sfx)*/
    ZPOS64_T num_file;                  /* number of the current file in the zipfile*/
    ZPOS64_T pos_in_central_dir;        /* pos of the current file in the central dir*/
    ZPOS64_T current_file_ok;           /* flag about the usability of the current file*/
    ZPOS64_T central_pos;               /* position of the beginning of the central dir*/
    uLong number_disk;                  /* number of the current disk, used for spanning ZIP*/
    ZPOS64_T size_central_dir;          /* size of the central directory  */
    ZPOS64_T offset_central_dir;        /* offset of start of central directory with
                                           respect to the starting disk number */

    unz_file_info64 cur_file_info;      /* public info about the current file in zip*/
    unz_file_info64_internal cur_file_info_internal;
    /* private info about it*/
    file_in_zip64_read_info_s *pfile_in_zip_read;
    /* structure about the current file if we are decompressing it */
    int isZip64;                        /* is the current file zip64 */
#ifndef NOUNCRYPT
    unsigned long keys[3];              /* keys defining the pseudo-random sequence */
    const unsigned long *pcrc_32_tab;
#endif
} unz64_s;

/* Translate date/time from Dos format to tm_unz (readable more easily) */
local void unz64local_DosDateToTmuDate(ZPOS64_T ulDosDate, tm_unz *ptm)
{
    ZPOS64_T uDate = (ZPOS64_T)(ulDosDate >> 16);

    ptm->tm_mday = (uInt)(uDate & 0x1f);
    ptm->tm_mon = (uInt)((((uDate) & 0x1E0) / 0x20) - 1);
    ptm->tm_year = (uInt)(((uDate & 0x0FE00) / 0x0200) + 1980);
    ptm->tm_hour = (uInt)((ulDosDate & 0xF800) / 0x800);
    ptm->tm_min = (uInt)((ulDosDate & 0x7E0) / 0x20);
    ptm->tm_sec = (uInt)(2 * (ulDosDate & 0x1f));

#define unz64local_in_range(min, max, value) ((min) <= (value) && (value) <= (max))
    if (!unz64local_in_range(0, 11, ptm->tm_mon) ||
        !unz64local_in_range(1, 31, ptm->tm_mday) ||
        !unz64local_in_range(0, 23, ptm->tm_hour) ||
        !unz64local_in_range(0, 59, ptm->tm_min) ||
        !unz64local_in_range(0, 59, ptm->tm_sec))
        /* Invalid date stored, so don't return it. */
        memset(ptm, 0, sizeof(tm_unz));
#undef unz64local_in_range
}

/* Read a byte from a gz_stream; Return EOF for end of file. */
local int unz64local_getByte(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, int *pi)
{
    unsigned char c;
    int err = (int)ZREAD64(*pzlib_filefunc_def, filestream, &c, 1);
    if (err == 1) {
        *pi = (int)c;
        return UNZ_OK;
    }
    if (ZERROR64(*pzlib_filefunc_def, filestream))
        return UNZ_ERRNO;
    return UNZ_EOF;
}

local int unz64local_getShort OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, uLong * pX));
local int unz64local_getShort(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, uLong *pX)
{
    uLong x;
    int i = 0;
    int err;

    err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x = (uLong)i;
    if (err == UNZ_OK)
        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x |= ((uLong)i) << 8;

    if (err == UNZ_OK)
        *pX = x;
    else
        *pX = 0;
    return err;
}

local int unz64local_getLong OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, uLong * pX));
local int unz64local_getLong(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, uLong *pX)
{
    uLong x;
    int i = 0;
    int err;

    err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x = (uLong)i;
    if (err == UNZ_OK)
        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x |= ((uLong)i) << 8;
    if (err == UNZ_OK)
        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x |= ((uLong)i) << 16;
    if (err == UNZ_OK)
        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x += ((uLong)i) << 24;

    if (err == UNZ_OK)
        *pX = x;
    else
        *pX = 0;
    return err;
}

local int unz64local_getLong64 OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, ZPOS64_T * pX));
local int unz64local_getLong64(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)
{
    ZPOS64_T x;
    int i = 0;
    int err;

    err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x = (ZPOS64_T)i;
    if (err == UNZ_OK)
        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x |= ((ZPOS64_T)i) << 8;
    if (err == UNZ_OK)
        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x |= ((ZPOS64_T)i) << 16;
    if (err == UNZ_OK)
        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x |= ((ZPOS64_T)i) << 24;
    if (err == UNZ_OK)
        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x |= ((ZPOS64_T)i) << 32;
    if (err == UNZ_OK)
        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x |= ((ZPOS64_T)i) << 40;
    if (err == UNZ_OK)
        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x |= ((ZPOS64_T)i) << 48;
    if (err == UNZ_OK)
        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);
    x |= ((ZPOS64_T)i) << 56;

    if (err == UNZ_OK)
        *pX = x;
    else
        *pX = 0;
    return err;
}

/* Locate the Central directory of a zip file (at the end, just before the global comment) */
local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream));
local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream)
{
    unsigned char *buf;
    ZPOS64_T file_size;
    ZPOS64_T back_read = 4;
    ZPOS64_T max_back = 0xffff; /* maximum size of global comment */
    ZPOS64_T pos_found = 0;
    uLong read_size;
    ZPOS64_T read_pos;
    int i;

    buf = (unsigned char *)ALLOC(BUFREADCOMMENT + 4);
    if (buf == NULL)
        return 0;

    if (ZSEEK64(*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0) {
        TRYFREE(buf);
        return 0;
    }

    file_size = ZTELL64(*pzlib_filefunc_def, filestream);

    if (max_back > file_size)
        max_back = file_size;

    while (back_read < max_back) {
        if (back_read + BUFREADCOMMENT > max_back)
            back_read = max_back;
        else
            back_read += BUFREADCOMMENT;

        read_pos = file_size - back_read;
        read_size = ((BUFREADCOMMENT + 4) < (file_size - read_pos)) ?
                    (BUFREADCOMMENT + 4) : (uLong)(file_size - read_pos);

        if (ZSEEK64(*pzlib_filefunc_def, filestream, read_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
            break;
        if (ZREAD64(*pzlib_filefunc_def, filestream, buf, read_size) != read_size)
            break;

        for (i = (int)read_size - 3; (i--) > 0; )
            if (((*(buf + i)) == (ENDHEADERMAGIC & 0xff)) &&
                ((*(buf + i + 1)) == (ENDHEADERMAGIC >> 8 & 0xff)) &&
                ((*(buf + i + 2)) == (ENDHEADERMAGIC >> 16 & 0xff)) &&
                ((*(buf + i + 3)) == (ENDHEADERMAGIC >> 24 & 0xff))) {
                pos_found = read_pos + i;
                break;
            }

        if (pos_found != 0)
            break;
    }
    TRYFREE(buf);
    return pos_found;
}

/* Locate the Central directory 64 of a zipfile (at the end, just before the global comment) */
local ZPOS64_T unz64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream,
                                                 const ZPOS64_T endcentraloffset));
local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream,
                                             const ZPOS64_T endcentraloffset)
{
    ZPOS64_T offset;
    uLong uL;

    /* Zip64 end of central directory locator */
    if (ZSEEK64(*pzlib_filefunc_def, filestream, endcentraloffset - SIZECENTRALHEADERLOCATOR, ZLIB_FILEFUNC_SEEK_SET) != 0)
        return 0;

    /* read locator signature */
    if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
        return 0;
    if (uL != ZIP64ENDLOCHEADERMAGIC)
        return 0;
    /* number of the disk with the start of the zip64 end of  central directory */
    if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
        return 0;
    /* relative offset of the zip64 end of central directory record */
    if (unz64local_getLong64(pzlib_filefunc_def, filestream, &offset) != UNZ_OK)
        return 0;
    /* total number of disks */
    if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
        return 0;
    /* Goto end of central directory record */
    if (ZSEEK64(*pzlib_filefunc_def, filestream, offset, ZLIB_FILEFUNC_SEEK_SET) != 0)
        return 0;
    /* the signature */
    if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK)
        return 0;
    if (uL != ZIP64ENDHEADERMAGIC)
        return 0;

    return offset;
}

local unzFile unzOpenInternal(const void *path, zlib_filefunc64_32_def *pzlib_filefunc64_32_def)
{
    unz64_s us;
    unz64_s *s;
    ZPOS64_T central_pos;
    uLong uL;
    voidpf filestream = NULL;
    ZPOS64_T number_entry_CD;
    int err = UNZ_OK;

    if (unz_copyright[0] != ' ')
        return NULL;

    us.filestream = NULL;
    us.filestream_with_CD = NULL;
    us.z_filefunc.zseek32_file = NULL;
    us.z_filefunc.ztell32_file = NULL;
    if (pzlib_filefunc64_32_def == NULL)
        fill_fopen64_filefunc(&us.z_filefunc.zfile_func64);
    else
        us.z_filefunc = *pzlib_filefunc64_32_def;

    us.filestream = ZOPEN64(us.z_filefunc, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING);

    if (us.filestream == NULL)
        return NULL;

    us.filestream_with_CD = us.filestream;
    us.isZip64 = 0;

    /* Use unz64local_SearchCentralDir first. Only based on the result
       is it necessary to locate the unz64local_SearchCentralDir64 */
    central_pos = unz64local_SearchCentralDir(&us.z_filefunc, us.filestream);
    if (central_pos) {
        if (ZSEEK64(us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
            err = UNZ_ERRNO;

        /* the signature, already checked */
        if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
            err = UNZ_ERRNO;
        /* number of this disk */
        if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
            err = UNZ_ERRNO;
        us.number_disk = uL;
        /* number of the disk with the start of the central directory */
        if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
            err = UNZ_ERRNO;
        us.gi.number_disk_with_CD = uL;
        /* total number of entries in the central directory on this disk */
        if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
            err = UNZ_ERRNO;
        us.gi.number_entry = uL;
        /* total number of entries in the central directory */
        if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
            err = UNZ_ERRNO;
        number_entry_CD = uL;
        if (number_entry_CD != us.gi.number_entry)
            err = UNZ_BADZIPFILE;
        /* size of the central directory */
        if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
            err = UNZ_ERRNO;
        us.size_central_dir = uL;
        /* offset of start of central directory with respect to the starting disk number */
        if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
            err = UNZ_ERRNO;
        us.offset_central_dir = uL;
        /* zipfile comment length */
        if (unz64local_getShort(&us.z_filefunc, us.filestream, &us.gi.size_comment) != UNZ_OK)
            err = UNZ_ERRNO;

        if ((err == UNZ_OK) &&
            ((us.gi.number_entry == 0xffff) || (us.size_central_dir == 0xffff) || (us.offset_central_dir == 0xffffffff))) {
            /* Format should be Zip64, as the central directory or file size is too large */
            central_pos = unz64local_SearchCentralDir64(&us.z_filefunc, us.filestream, central_pos);
            if (central_pos) {
                ZPOS64_T uL64;

                us.isZip64 = 1;

                if (ZSEEK64(us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
                    err = UNZ_ERRNO;

                /* the signature, already checked */
                if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
                    err = UNZ_ERRNO;
                /* size of zip64 end of central directory record */
                if (unz64local_getLong64(&us.z_filefunc, us.filestream, &uL64) != UNZ_OK)
                    err = UNZ_ERRNO;
                /* version made by */
                if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
                    err = UNZ_ERRNO;
                /* version needed to extract */
                if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)
                    err = UNZ_ERRNO;
                /* number of this disk */
                if (unz64local_getLong(&us.z_filefunc, us.filestream, &us.number_disk) != UNZ_OK)
                    err = UNZ_ERRNO;
                /* number of the disk with the start of the central directory */
                if (unz64local_getLong(&us.z_filefunc, us.filestream, &us.gi.number_disk_with_CD) != UNZ_OK)
                    err = UNZ_ERRNO;
                /* total number of entries in the central directory on this disk */
                if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.gi.number_entry) != UNZ_OK)
                    err = UNZ_ERRNO;
                /* total number of entries in the central directory */
                if (unz64local_getLong64(&us.z_filefunc, us.filestream, &number_entry_CD) != UNZ_OK)
                    err = UNZ_ERRNO;
                if (number_entry_CD != us.gi.number_entry)
                    err = UNZ_BADZIPFILE;
                /* size of the central directory */
                if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.size_central_dir) != UNZ_OK)
                    err = UNZ_ERRNO;
                /* offset of start of central directory with respect to the starting disk number */
                if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.offset_central_dir) != UNZ_OK)
                    err = UNZ_ERRNO;
            } else
                err = UNZ_BADZIPFILE;
        }
    } else
        err = UNZ_ERRNO;

    if ((err == UNZ_OK) && (central_pos < us.offset_central_dir + us.size_central_dir))
        err = UNZ_BADZIPFILE;

    if (err != UNZ_OK) {
        ZCLOSE64(us.z_filefunc, us.filestream);
        return NULL;
    }

    if (us.gi.number_disk_with_CD == 0) {
        /* If there is only one disk open another stream so we don't have to seek between the CD
           and the file headers constantly */
        filestream = ZOPEN64(us.z_filefunc, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING);
        if (filestream != NULL)
            us.filestream = filestream;
    }

    /* Hack for zip files that have no respect for zip64
       if ((central_pos > 0xffffffff) && (us.offset_central_dir < 0xffffffff))
        us.offset_central_dir = central_pos - us.size_central_dir;*/

    us.byte_before_the_zipfile = central_pos - (us.offset_central_dir + us.size_central_dir);
    us.central_pos = central_pos;
    us.pfile_in_zip_read = NULL;

    s = (unz64_s *)ALLOC(sizeof(unz64_s));
    if (s != NULL) {
        *s = us;
        unzGoToFirstFile((unzFile)s);
    }
    return (unzFile)s;
}

extern unzFile ZEXPORT unzOpen2(const char *path, zlib_filefunc_def *pzlib_filefunc32_def)
{
    if (pzlib_filefunc32_def != NULL) {
        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
        fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def);
        return unzOpenInternal(path, &zlib_filefunc64_32_def_fill);
    }
    return unzOpenInternal(path, NULL);
}

extern unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def)
{
    if (pzlib_filefunc_def != NULL) {
        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
        zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
        zlib_filefunc64_32_def_fill.ztell32_file = NULL;
        zlib_filefunc64_32_def_fill.zseek32_file = NULL;
        return unzOpenInternal(path, &zlib_filefunc64_32_def_fill);
    }
    return unzOpenInternal(path, NULL);
}

extern unzFile ZEXPORT unzOpen(const char *path)
{
    return unzOpenInternal(path, NULL);
}

extern unzFile ZEXPORT unzOpen64(const void *path)
{
    return unzOpenInternal(path, NULL);
}

extern int ZEXPORT unzClose(unzFile file)
{
    unz64_s *s;
    if (file == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;

    if (s->pfile_in_zip_read != NULL)
        unzCloseCurrentFile(file);

    if ((s->filestream != NULL) && (s->filestream != s->filestream_with_CD))
        ZCLOSE64(s->z_filefunc, s->filestream);
    if (s->filestream_with_CD != NULL)
        ZCLOSE64(s->z_filefunc, s->filestream_with_CD);

    s->filestream = NULL;
    s->filestream_with_CD = NULL;
    TRYFREE(s);
    return UNZ_OK;
}

/* Goto to the next available disk for spanned archives */
local int unzGoToNextDisk OF((unzFile file));
local int unzGoToNextDisk(unzFile file)
{
    unz64_s *s;
    file_in_zip64_read_info_s *pfile_in_zip_read_info;
    uLong number_disk_next = 0;

    s = (unz64_s *)file;
    if (s == NULL)
        return UNZ_PARAMERROR;
    pfile_in_zip_read_info = s->pfile_in_zip_read;
    number_disk_next = s->number_disk;

    if ((pfile_in_zip_read_info != NULL) && (pfile_in_zip_read_info->rest_read_uncompressed > 0))
        /* We are currently reading a file and we need the next sequential disk */
        number_disk_next += 1;
    else
        /* Goto the disk for the current file */
        number_disk_next = s->cur_file_info.disk_num_start;

    if (number_disk_next != s->number_disk) {
        /* Switch disks */
        if ((s->filestream != NULL) && (s->filestream != s->filestream_with_CD))
            ZCLOSE64(s->z_filefunc, s->filestream);

        if (number_disk_next == s->gi.number_disk_with_CD) {
            s->filestream = s->filestream_with_CD;
        } else {
            s->filestream = ZOPENDISK64(s->z_filefunc, s->filestream_with_CD, (unsigned int)number_disk_next,
                                        ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING);
        }

        if (s->filestream == NULL)
            return UNZ_ERRNO;

        s->number_disk = number_disk_next;
    }

    return UNZ_OK;
}

extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info *pglobal_info32)
{
    unz64_s *s;
    if (file == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;
    /* to do : check if number_entry is not truncated */
    pglobal_info32->number_entry = (uLong)s->gi.number_entry;
    pglobal_info32->size_comment = s->gi.size_comment;
    pglobal_info32->number_disk_with_CD = s->gi.number_disk_with_CD;
    return UNZ_OK;
}

extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64 *pglobal_info)
{
    unz64_s *s;
    if (file == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;
    *pglobal_info = s->gi;
    return UNZ_OK;
}

extern int ZEXPORT unzGetGlobalComment(unzFile file, char *comment, uLong comment_size)
{
    unz64_s *s;
    uLong bytes_to_read = comment_size;
    if (file == NULL)
        return (int)UNZ_PARAMERROR;
    s = (unz64_s *)file;

    if (bytes_to_read > s->gi.size_comment)
        bytes_to_read = s->gi.size_comment;

    if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, s->central_pos + 22, ZLIB_FILEFUNC_SEEK_SET) != 0)
        return UNZ_ERRNO;

    if (bytes_to_read > 0) {
        *comment = 0;
        if (ZREAD64(s->z_filefunc, s->filestream_with_CD, comment, bytes_to_read) != bytes_to_read)
            return UNZ_ERRNO;
    }

    if ((comment != NULL) && (comment_size > s->gi.size_comment))
        *(comment + s->gi.size_comment) = 0;
    return (int)bytes_to_read;
}

/* Get Info about the current file in the zipfile, with internal only info */
local int unz64local_GetCurrentFileInfoInternal(unzFile file, unz_file_info64 *pfile_info,
                                                unz_file_info64_internal *pfile_info_internal, char *filename, uLong filename_size, void *extrafield,
                                                uLong extrafield_size, char *comment, uLong comment_size)
{
    unz64_s *s;
    unz_file_info64 file_info;
    unz_file_info64_internal file_info_internal;
    ZPOS64_T bytes_to_read;
    int err = UNZ_OK;
    uLong uMagic;
    long lSeek = 0;
    ZPOS64_T current_pos = 0;
    uLong acc = 0;
    uLong uL;
    ZPOS64_T uL64;

    if (file == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;

    if (ZSEEK64(s->z_filefunc, s->filestream_with_CD,
                s->pos_in_central_dir + s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
        err = UNZ_ERRNO;

    /* Check the magic */
    if (err == UNZ_OK) {
        if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uMagic) != UNZ_OK)
            err = UNZ_ERRNO;
        else if (uMagic != CENTRALHEADERMAGIC)
            err = UNZ_BADZIPFILE;
    }

    /* Read central directory header */
    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.version) != UNZ_OK)
        err = UNZ_ERRNO;
    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.version_needed) != UNZ_OK)
        err = UNZ_ERRNO;
    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.flag) != UNZ_OK)
        err = UNZ_ERRNO;
    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.compression_method) != UNZ_OK)
        err = UNZ_ERRNO;
    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.dosDate) != UNZ_OK)
        err = UNZ_ERRNO;
    unz64local_DosDateToTmuDate(file_info.dosDate, &file_info.tmu_date);
    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.crc) != UNZ_OK)
        err = UNZ_ERRNO;
    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)
        err = UNZ_ERRNO;
    file_info.compressed_size = uL;
    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)
        err = UNZ_ERRNO;
    file_info.uncompressed_size = uL;
    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_filename) != UNZ_OK)
        err = UNZ_ERRNO;
    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_file_extra) != UNZ_OK)
        err = UNZ_ERRNO;
    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_file_comment) != UNZ_OK)
        err = UNZ_ERRNO;
    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.disk_num_start) != UNZ_OK)
        err = UNZ_ERRNO;
    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.internal_fa) != UNZ_OK)
        err = UNZ_ERRNO;
    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.external_fa) != UNZ_OK)
        err = UNZ_ERRNO;
    /* Relative offset of local header */
    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)
        err = UNZ_ERRNO;

    file_info.size_file_extra_internal = 0;
    file_info.disk_offset = uL;
    file_info_internal.offset_curfile = uL;
#ifdef HAVE_AES
    file_info_internal.aes_compression_method = 0;
    file_info_internal.aes_encryption_mode = 0;
    file_info_internal.aes_version = 0;
#endif

    lSeek += file_info.size_filename;

    if ((err == UNZ_OK) && (filename != NULL)) {
        if (file_info.size_filename < filename_size) {
            *(filename + file_info.size_filename) = 0;
            bytes_to_read = file_info.size_filename;
        } else
            bytes_to_read = filename_size;

        if ((file_info.size_filename > 0) && (filename_size > 0))
            if (ZREAD64(s->z_filefunc, s->filestream_with_CD, filename, (uLong)bytes_to_read) != bytes_to_read)
                err = UNZ_ERRNO;
        lSeek -= (uLong)bytes_to_read;
    }

    /* Read extrafield */
    if ((err == UNZ_OK) && (extrafield != NULL)) {
        if (file_info.size_file_extra < extrafield_size)
            bytes_to_read = file_info.size_file_extra;
        else
            bytes_to_read = extrafield_size;

        if (lSeek != 0) {
            if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0)
                lSeek = 0;
            else
                err = UNZ_ERRNO;
        }

        if ((file_info.size_file_extra > 0) && (extrafield_size > 0))
            if (ZREAD64(s->z_filefunc, s->filestream_with_CD, extrafield, (uLong)bytes_to_read) != bytes_to_read)
                err = UNZ_ERRNO;
        lSeek += file_info.size_file_extra - (uLong)bytes_to_read;
    } else
        lSeek += file_info.size_file_extra;

    if ((err == UNZ_OK) && (file_info.size_file_extra != 0)) {
        if (lSeek != 0) {
            if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0)
                lSeek = 0;
            else
                err = UNZ_ERRNO;
        }

        /* We are going to parse the extra field so we need to move back */
        current_pos = ZTELL64(s->z_filefunc, s->filestream_with_CD);
        if (current_pos < file_info.size_file_extra)
            err = UNZ_ERRNO;
        current_pos -= file_info.size_file_extra;
        if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, current_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
            err = UNZ_ERRNO;

        while ((err != UNZ_ERRNO) && (acc < file_info.size_file_extra)) {
            uLong headerid;
            uLong datasize;

            if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &headerid) != UNZ_OK)
                err = UNZ_ERRNO;
            if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &datasize) != UNZ_OK)
                err = UNZ_ERRNO;

            /* ZIP64 extra fields */
            if (headerid == 0x0001) {
                /* Subtract size of ZIP64 field, since ZIP64 is handled internally */
                file_info.size_file_extra_internal += 2 + 2 + datasize;

                if (file_info.uncompressed_size == 0xffffffff) {
                    if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &file_info.uncompressed_size) != UNZ_OK)
                        err = UNZ_ERRNO;
                }
                if (file_info.compressed_size == 0xffffffff) {
                    if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &file_info.compressed_size) != UNZ_OK)
                        err = UNZ_ERRNO;
                }
                if (file_info_internal.offset_curfile == 0xffffffff) {
                    /* Relative Header offset */
                    if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &uL64) != UNZ_OK)
                        err = UNZ_ERRNO;
                    file_info_internal.offset_curfile = uL64;
                    file_info.disk_offset = uL64;
                }
                if (file_info.disk_num_start == 0xffffffff) {
                    /* Disk Start Number */
                    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.disk_num_start) != UNZ_OK)
                        err = UNZ_ERRNO;
                }
            }
#ifdef HAVE_AES
            /* AES header */
            else if (headerid == 0x9901) {
                /* Subtract size of AES field, since AES is handled internally */
                file_info.size_file_extra_internal += 2 + 2 + datasize;

                /* Verify version info */
                if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)
                    err = UNZ_ERRNO;
                /* Support AE-1 and AE-2 */
                if (uL != 1 && uL != 2)
                    err = UNZ_ERRNO;
                file_info_internal.aes_version = uL;
                if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, (int *)&uL) != UNZ_OK)
                    err = UNZ_ERRNO;
                if ((char)uL != 'A')
                    err = UNZ_ERRNO;
                if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, (int *)&uL) != UNZ_OK)
                    err = UNZ_ERRNO;
                if ((char)uL != 'E')
                    err = UNZ_ERRNO;
                /* Get AES encryption strength and actual compression method */
                if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, (int *)&uL) != UNZ_OK)
                    err = UNZ_ERRNO;
                file_info_internal.aes_encryption_mode = uL;
                if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)
                    err = UNZ_ERRNO;
                file_info_internal.aes_compression_method = uL;
            }
#endif
            else {
                if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, datasize, ZLIB_FILEFUNC_SEEK_CUR) != 0)
                    err = UNZ_ERRNO;
            }

            acc += 2 + 2 + datasize;
        }
    }

    if (file_info.disk_num_start == s->gi.number_disk_with_CD)
        file_info_internal.byte_before_the_zipfile = s->byte_before_the_zipfile;
    else
        file_info_internal.byte_before_the_zipfile = 0;

    if ((err == UNZ_OK) && (comment != NULL)) {
        if (file_info.size_file_comment < comment_size) {
            *(comment + file_info.size_file_comment) = 0;
            bytes_to_read = file_info.size_file_comment;
        } else
            bytes_to_read = comment_size;

        if (lSeek != 0) {
            if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) != 0)
                err = UNZ_ERRNO;
        }

        if ((file_info.size_file_comment > 0) && (comment_size > 0))
            if (ZREAD64(s->z_filefunc, s->filestream_with_CD, comment, (uLong)bytes_to_read) != bytes_to_read)
                err = UNZ_ERRNO;
        lSeek += file_info.size_file_comment - (uLong)bytes_to_read;
    } else
        lSeek += file_info.size_file_comment;

    if ((err == UNZ_OK) && (pfile_info != NULL))
        *pfile_info = file_info;

    if ((err == UNZ_OK) && (pfile_info_internal != NULL))
        *pfile_info_internal = file_info_internal;

    return err;
}

extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, unz_file_info *pfile_info, char *filename,
                                         uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)
{
    unz_file_info64 file_info64;
    int err;

    err = unz64local_GetCurrentFileInfoInternal(file, &file_info64, NULL, filename, filename_size,
                                                extrafield, extrafield_size, comment, comment_size);

    if ((err == UNZ_OK) && (pfile_info != NULL)) {
        pfile_info->version = file_info64.version;
        pfile_info->version_needed = file_info64.version_needed;
        pfile_info->flag = file_info64.flag;
        pfile_info->compression_method = file_info64.compression_method;
        pfile_info->dosDate = file_info64.dosDate;
        pfile_info->crc = file_info64.crc;

        pfile_info->size_filename = file_info64.size_filename;
        pfile_info->size_file_extra = file_info64.size_file_extra - file_info64.size_file_extra_internal;
        pfile_info->size_file_comment = file_info64.size_file_comment;

        pfile_info->disk_num_start = file_info64.disk_num_start;
        pfile_info->internal_fa = file_info64.internal_fa;
        pfile_info->external_fa = file_info64.external_fa;

        pfile_info->tmu_date = file_info64.tmu_date,

        pfile_info->compressed_size = (uLong)file_info64.compressed_size;
        pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size;

    }
    return err;
}

extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64 *pfile_info, char *filename,
                                           uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)
{
    return unz64local_GetCurrentFileInfoInternal(file, pfile_info, NULL, filename, filename_size,
                                                 extrafield, extrafield_size, comment, comment_size);
}

/* Read the local header of the current zipfile. Check the coherency of the local header and info in the
   end of central directory about this file store in *piSizeVar the size of extra info in local header
   (filename and size of extra field data) */
local int unz64local_CheckCurrentFileCoherencyHeader(unz64_s *s, uInt *piSizeVar, ZPOS64_T *poffset_local_extrafield,
                                                     uInt *psize_local_extrafield)
{
    uLong uMagic, uL, uFlags;
    uLong size_filename;
    uLong size_extra_field;
    int err = UNZ_OK;
    int compression_method = 0;

    *piSizeVar = 0;
    *poffset_local_extrafield = 0;
    *psize_local_extrafield = 0;

    err = unzGoToNextDisk((unzFile)s);
    if (err != UNZ_OK)
        return err;

    if (ZSEEK64(s->z_filefunc, s->filestream, s->cur_file_info_internal.offset_curfile +
                s->cur_file_info_internal.byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
        return UNZ_ERRNO;

    if (err == UNZ_OK) {
        if (unz64local_getLong(&s->z_filefunc, s->filestream, &uMagic) != UNZ_OK)
            err = UNZ_ERRNO;
        else if (uMagic != LOCALHEADERMAGIC)
            err = UNZ_BADZIPFILE;
    }

    if (unz64local_getShort(&s->z_filefunc, s->filestream, &uL) != UNZ_OK)
        err = UNZ_ERRNO;
    if (unz64local_getShort(&s->z_filefunc, s->filestream, &uFlags) != UNZ_OK)
        err = UNZ_ERRNO;
    if (unz64local_getShort(&s->z_filefunc, s->filestream, &uL) != UNZ_OK)
        err = UNZ_ERRNO;
    else if ((err == UNZ_OK) && (uL != s->cur_file_info.compression_method))
        err = UNZ_BADZIPFILE;

    compression_method = (int)s->cur_file_info.compression_method;
#ifdef HAVE_AES
    if (compression_method == AES_METHOD)
        compression_method = (int)s->cur_file_info_internal.aes_compression_method;
#endif

    if ((err == UNZ_OK) && (compression_method != 0) &&
#ifdef HAVE_BZIP2
        (compression_method != Z_BZIP2ED) &&
#endif
        (compression_method != Z_DEFLATED))
        err = UNZ_BADZIPFILE;

    if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* date/time */
        err = UNZ_ERRNO;
    if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* crc */
        err = UNZ_ERRNO;
    else if ((err == UNZ_OK) && (uL != s->cur_file_info.crc) && ((uFlags & 8) == 0))
        err = UNZ_BADZIPFILE;
    if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* size compr */
        err = UNZ_ERRNO;
    else if ((uL != 0xffffffff) && (err == UNZ_OK) && (uL != s->cur_file_info.compressed_size) && ((uFlags & 8) == 0))
        err = UNZ_BADZIPFILE;
    if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* size uncompr */
        err = UNZ_ERRNO;
    else if ((uL != 0xffffffff) && (err == UNZ_OK) && (uL != s->cur_file_info.uncompressed_size) && ((uFlags & 8) == 0))
        err = UNZ_BADZIPFILE;
    if (unz64local_getShort(&s->z_filefunc, s->filestream, &size_filename) != UNZ_OK)
        err = UNZ_ERRNO;
    else if ((err == UNZ_OK) && (size_filename != s->cur_file_info.size_filename))
        err = UNZ_BADZIPFILE;

    *piSizeVar += (uInt)size_filename;

    if (unz64local_getShort(&s->z_filefunc, s->filestream, &size_extra_field) != UNZ_OK)
        err = UNZ_ERRNO;
    *poffset_local_extrafield = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename;
    *psize_local_extrafield = (uInt)size_extra_field;

    *piSizeVar += (uInt)size_extra_field;

    return err;
}

/*
   Open for reading data the current file in the zipfile.
   If there is no error and the file is opened, the return value is UNZ_OK.
 */
extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int *method, int *level, int raw, const char *password)
{
    int err = UNZ_OK;
    int compression_method;
    uInt iSizeVar;
    unz64_s *s;
    file_in_zip64_read_info_s *pfile_in_zip_read_info;
    ZPOS64_T offset_local_extrafield;
    uInt size_local_extrafield;
#ifndef NOUNCRYPT
    char source[12];
#else
    if (password != NULL)
        return UNZ_PARAMERROR;
#endif
    if (file == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;
    if (!s->current_file_ok)
        return UNZ_PARAMERROR;

    if (s->pfile_in_zip_read != NULL)
        unzCloseCurrentFile(file);

    if (unz64local_CheckCurrentFileCoherencyHeader(s, &iSizeVar, &offset_local_extrafield, &size_local_extrafield) != UNZ_OK)
        return UNZ_BADZIPFILE;

    pfile_in_zip_read_info = (file_in_zip64_read_info_s *)ALLOC(sizeof(file_in_zip64_read_info_s));
    if (pfile_in_zip_read_info == NULL)
        return UNZ_INTERNALERROR;

    pfile_in_zip_read_info->read_buffer = (Bytef *)ALLOC(UNZ_BUFSIZE);
    pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
    pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
    pfile_in_zip_read_info->pos_local_extrafield = 0;
    pfile_in_zip_read_info->raw = raw;

    if (pfile_in_zip_read_info->read_buffer == NULL) {
        TRYFREE(pfile_in_zip_read_info);
        return UNZ_INTERNALERROR;
    }

    pfile_in_zip_read_info->stream_initialised = 0;

    compression_method = (int)s->cur_file_info.compression_method;
#ifdef HAVE_AES
    if (compression_method == AES_METHOD)
        compression_method = (int)s->cur_file_info_internal.aes_compression_method;
#endif

    if (method != NULL)
        *method = compression_method;

    if (level != NULL) {
        *level = 6;
        switch (s->cur_file_info.flag & 0x06) {
        case 6: *level = 1; break;
        case 4: *level = 2; break;
        case 2: *level = 9; break;
        }
    }

    if ((compression_method != 0) &&
#ifdef HAVE_BZIP2
        (compression_method != Z_BZIP2ED) &&
#endif
        (compression_method != Z_DEFLATED))
        err = UNZ_BADZIPFILE;

    pfile_in_zip_read_info->crc32_wait = s->cur_file_info.crc;
    pfile_in_zip_read_info->crc32 = 0;
    pfile_in_zip_read_info->total_out_64 = 0;
    pfile_in_zip_read_info->compression_method = compression_method;
    pfile_in_zip_read_info->filestream = s->filestream;
    pfile_in_zip_read_info->z_filefunc = s->z_filefunc;
    if (s->number_disk == s->gi.number_disk_with_CD)
        pfile_in_zip_read_info->byte_before_the_zipfile = s->byte_before_the_zipfile;
    else
        pfile_in_zip_read_info->byte_before_the_zipfile = 0;
    pfile_in_zip_read_info->stream.total_out = 0;
    pfile_in_zip_read_info->stream.total_in = 0;
    pfile_in_zip_read_info->stream.next_in = NULL;

    if (!raw) {
        if (compression_method == Z_BZIP2ED) {
#ifdef HAVE_BZIP2
            pfile_in_zip_read_info->bstream.bzalloc = (void *(*)(void *, int, int)) 0;
            pfile_in_zip_read_info->bstream.bzfree = (free_func)0;
            pfile_in_zip_read_info->bstream.opaque = (voidpf)0;
            pfile_in_zip_read_info->bstream.state = (voidpf)0;

            pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
            pfile_in_zip_read_info->stream.zfree = (free_func)0;
            pfile_in_zip_read_info->stream.opaque = (voidpf)0;
            pfile_in_zip_read_info->stream.next_in = (voidpf)0;
            pfile_in_zip_read_info->stream.avail_in = 0;

            err = BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0);
            if (err == Z_OK)
                pfile_in_zip_read_info->stream_initialised = Z_BZIP2ED;
            else {
                TRYFREE(pfile_in_zip_read_info);
                return err;
            }
#else
            pfile_in_zip_read_info->raw = 1;
#endif
        } else if (compression_method == Z_DEFLATED) {
            pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
            pfile_in_zip_read_info->stream.zfree = (free_func)0;
            pfile_in_zip_read_info->stream.opaque = (voidpf)s;
            pfile_in_zip_read_info->stream.next_in = 0;
            pfile_in_zip_read_info->stream.avail_in = 0;

            err = inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
            if (err == Z_OK)
                pfile_in_zip_read_info->stream_initialised = Z_DEFLATED;
            else {
                TRYFREE(pfile_in_zip_read_info);
                return err;
            }
            /* windowBits is passed < 0 to tell that there is no zlib header.
             * Note that in this case inflate *requires* an extra "dummy" byte
             * after the compressed stream in order to complete decompression and
             * return Z_STREAM_END.
             * In unzip, i don't wait absolutely Z_STREAM_END because I known the
             * size of both compressed and uncompressed data
             */
        }
    }

    pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size;
    pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size;
    pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar;
    pfile_in_zip_read_info->stream.avail_in = (uInt)0;

    s->pfile_in_zip_read = pfile_in_zip_read_info;

#ifndef NOUNCRYPT
    if ((password != NULL) && ((s->cur_file_info.flag & 1) != 0)) {
        if (ZSEEK64(s->z_filefunc, s->filestream,
                    s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile,
                    ZLIB_FILEFUNC_SEEK_SET) != 0)
            return UNZ_INTERNALERROR;
#ifdef HAVE_AES
        if (s->cur_file_info.compression_method == AES_METHOD) {
            unsigned char passverify[AES_PWVERIFYSIZE];
            unsigned char saltvalue[AES_MAXSALTLENGTH];
            uInt saltlength;

            if ((s->cur_file_info_internal.aes_encryption_mode < 1) ||
                (s->cur_file_info_internal.aes_encryption_mode > 3))
                return UNZ_INTERNALERROR;

            saltlength = SALT_LENGTH(s->cur_file_info_internal.aes_encryption_mode);

            if (ZREAD64(s->z_filefunc, s->filestream, saltvalue, saltlength) != saltlength)
                return UNZ_INTERNALERROR;
            if (ZREAD64(s->z_filefunc, s->filestream, passverify, AES_PWVERIFYSIZE) != AES_PWVERIFYSIZE)
                return UNZ_INTERNALERROR;

            fcrypt_init((int)s->cur_file_info_internal.aes_encryption_mode, (unsigned char *)password, (unsigned int)strlen(password), saltvalue,
                        passverify, &s->pfile_in_zip_read->aes_ctx);

            pfile_in_zip_read_info->rest_read_compressed -= saltlength + AES_PWVERIFYSIZE;
            pfile_in_zip_read_info->rest_read_compressed -= AES_AUTHCODESIZE;

            s->pfile_in_zip_read->pos_in_zipfile += saltlength + AES_PWVERIFYSIZE;
        } else
#endif
        {
            int i;
            s->pcrc_32_tab = (const unsigned long *)get_crc_table();
            init_keys(password, s->keys, s->pcrc_32_tab);

            if (ZREAD64(s->z_filefunc, s->filestream, source, 12) < 12)
                return UNZ_INTERNALERROR;

            for (i = 0; i < 12; i++)
                zdecode(s->keys, s->pcrc_32_tab, source[i]);

            pfile_in_zip_read_info->rest_read_compressed -= 12;

            s->pfile_in_zip_read->pos_in_zipfile += 12;
        }
    }
#endif

    return UNZ_OK;
}

extern int ZEXPORT unzOpenCurrentFile(unzFile file)
{
    return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
}

extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char *password)
{
    return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
}

extern int ZEXPORT unzOpenCurrentFile2(unzFile file, int *method, int *level, int raw)
{
    return unzOpenCurrentFile3(file, method, level, raw, NULL);
}

/* Read bytes from the current file.
   buf contain buffer where data must be copied
   len the size of buf.

   return the number of byte copied if some bytes are copied
   return 0 if the end of file was reached
   return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */
extern int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, unsigned len)
{
    int err = UNZ_OK;
    uInt read = 0;
    unz64_s *s;
    file_in_zip64_read_info_s *pfile_in_zip_read_info;
    if (file == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;
    pfile_in_zip_read_info = s->pfile_in_zip_read;

    if (pfile_in_zip_read_info == NULL)
        return UNZ_PARAMERROR;
    if (pfile_in_zip_read_info->read_buffer == NULL)
        return UNZ_END_OF_LIST_OF_FILE;
    if (len == 0)
        return 0;

    pfile_in_zip_read_info->stream.next_out = (Bytef *)buf;
    pfile_in_zip_read_info->stream.avail_out = (uInt)len;

    if (pfile_in_zip_read_info->raw) {
        if (len > pfile_in_zip_read_info->rest_read_compressed + pfile_in_zip_read_info->stream.avail_in)
            pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_compressed +
                                                       pfile_in_zip_read_info->stream.avail_in;
    } else {
        
        // NOTE:
        // This bit of code seems to try to set the amount of space in the output buffer based on the
        // value stored in the headers stored in the .zip file. However, if those values are incorrect
        // it may result in a loss of data when uncompresssing that file. The compressed data is still
        // legit and will deflate without knowing the uncompressed code so this tidbit is unnecessary and
        // may cause issues for some .zip files.
        //
        // It's removed in here to fix those issues.
        //
        // See: https://github.com/ZipArchive/ziparchive/issues/16
        //
        
        /*
        
         
         FIXME: Upgrading to minizip 1.1 caused issues here, Uncommented the code that was commented before. 11/24/2015
         */
        
        if (len > pfile_in_zip_read_info->rest_read_uncompressed)
            pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
        
         
    
    }

    while (pfile_in_zip_read_info->stream.avail_out > 0) {
        if (pfile_in_zip_read_info->stream.avail_in == 0) {
            uInt bytes_to_read = UNZ_BUFSIZE;
            uInt bytes_not_read = 0;
            uInt bytes_read = 0;
            uInt total_bytes_read = 0;

            if (pfile_in_zip_read_info->stream.next_in != NULL)
                bytes_not_read = (uInt)(pfile_in_zip_read_info->read_buffer + UNZ_BUFSIZE -
                                        pfile_in_zip_read_info->stream.next_in);
            bytes_to_read -= bytes_not_read;
            if (bytes_not_read > 0)
                memcpy(pfile_in_zip_read_info->read_buffer, pfile_in_zip_read_info->stream.next_in, bytes_not_read);
            if (pfile_in_zip_read_info->rest_read_compressed < bytes_to_read)
                bytes_to_read = (uInt)pfile_in_zip_read_info->rest_read_compressed;

            while (total_bytes_read != bytes_to_read) {
                if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream,
                            pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile,
                            ZLIB_FILEFUNC_SEEK_SET) != 0)
                    return UNZ_ERRNO;

                bytes_read = (int)ZREAD64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream,
                                          pfile_in_zip_read_info->read_buffer + bytes_not_read + total_bytes_read,
                                          bytes_to_read - total_bytes_read);

                total_bytes_read += bytes_read;
                pfile_in_zip_read_info->pos_in_zipfile += bytes_read;

                if (bytes_read == 0) {
                    if (ZERROR64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream))
                        return UNZ_ERRNO;

                    err = unzGoToNextDisk(file);
                    if (err != UNZ_OK)
                        return err;

                    pfile_in_zip_read_info->pos_in_zipfile = 0;
                    pfile_in_zip_read_info->filestream = s->filestream;
                }
            }

#ifndef NOUNCRYPT
            if ((s->cur_file_info.flag & 1) != 0) {
#ifdef HAVE_AES
                if (s->cur_file_info.compression_method == AES_METHOD) {
                    fcrypt_decrypt(pfile_in_zip_read_info->read_buffer, bytes_to_read, &s->pfile_in_zip_read->aes_ctx);
                } else
#endif
                {
                    uInt i;
                    for (i = 0; i < total_bytes_read; i++)
                        pfile_in_zip_read_info->read_buffer[i] =
                            zdecode(s->keys, s->pcrc_32_tab, pfile_in_zip_read_info->read_buffer[i]);
                }
            }
#endif

            pfile_in_zip_read_info->rest_read_compressed -= total_bytes_read;
            pfile_in_zip_read_info->stream.next_in = (Bytef *)pfile_in_zip_read_info->read_buffer;
            pfile_in_zip_read_info->stream.avail_in = (uInt)bytes_not_read + total_bytes_read;
        }

        if ((pfile_in_zip_read_info->compression_method == 0) || (pfile_in_zip_read_info->raw)) {
            uInt copy, i;

            if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
                (pfile_in_zip_read_info->rest_read_compressed == 0))
                return (read == 0) ? UNZ_EOF : read;

            if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in)
                copy = pfile_in_zip_read_info->stream.avail_out;
            else
                copy = pfile_in_zip_read_info->stream.avail_in;

            for (i = 0; i < copy; i++)
                *(pfile_in_zip_read_info->stream.next_out + i) =
                    *(pfile_in_zip_read_info->stream.next_in + i);

            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + copy;
            pfile_in_zip_read_info->rest_read_uncompressed -= copy;
            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
                                                  pfile_in_zip_read_info->stream.next_out, copy);

            pfile_in_zip_read_info->stream.avail_in -= copy;
            pfile_in_zip_read_info->stream.avail_out -= copy;
            pfile_in_zip_read_info->stream.next_out += copy;
            pfile_in_zip_read_info->stream.next_in += copy;
            pfile_in_zip_read_info->stream.total_out += copy;
            read += copy;
        } else if (pfile_in_zip_read_info->compression_method == Z_BZIP2ED) {
#ifdef HAVE_BZIP2
            uLong total_out_before, total_out_after;
            const Bytef *buf_before;
            uLong out_bytes;

            pfile_in_zip_read_info->bstream.next_in = (char *)pfile_in_zip_read_info->stream.next_in;
            pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in;
            pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in;
            pfile_in_zip_read_info->bstream.total_in_hi32 = 0;
            pfile_in_zip_read_info->bstream.next_out = (char *)pfile_in_zip_read_info->stream.next_out;
            pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out;
            pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out;
            pfile_in_zip_read_info->bstream.total_out_hi32 = 0;

            total_out_before = pfile_in_zip_read_info->bstream.total_out_lo32;
            buf_before = (const Bytef *)pfile_in_zip_read_info->bstream.next_out;

            err = BZ2_bzDecompress(&pfile_in_zip_read_info->bstream);

            total_out_after = pfile_in_zip_read_info->bstream.total_out_lo32;
            out_bytes = total_out_after - total_out_before;

            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + out_bytes;
            pfile_in_zip_read_info->rest_read_uncompressed -= out_bytes;
            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, buf_before, (uInt)(out_bytes));

            read += (uInt)(total_out_after - total_out_before);

            pfile_in_zip_read_info->stream.next_in = (Bytef *)pfile_in_zip_read_info->bstream.next_in;
            pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in;
            pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32;
            pfile_in_zip_read_info->stream.next_out = (Bytef *)pfile_in_zip_read_info->bstream.next_out;
            pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out;
            pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32;

            if (err == BZ_STREAM_END)
                return (read == 0) ? UNZ_EOF : read;
            if (err != BZ_OK)
                break;
#endif
        } else {
            ZPOS64_T total_out_before, total_out_after;
            const Bytef *buf_before;
            ZPOS64_T out_bytes;
            int flush = Z_SYNC_FLUSH;

            total_out_before = pfile_in_zip_read_info->stream.total_out;
            buf_before = pfile_in_zip_read_info->stream.next_out;

            /*
               if ((pfile_in_zip_read_info->rest_read_uncompressed ==
                     pfile_in_zip_read_info->stream.avail_out) &&
                (pfile_in_zip_read_info->rest_read_compressed == 0))
                flush = Z_FINISH;
             */
            err = inflate(&pfile_in_zip_read_info->stream, flush);

            if ((err >= 0) && (pfile_in_zip_read_info->stream.msg != NULL))
                err = Z_DATA_ERROR;

            total_out_after = pfile_in_zip_read_info->stream.total_out;
            out_bytes = total_out_after - total_out_before;

            pfile_in_zip_read_info->total_out_64 += out_bytes;
            pfile_in_zip_read_info->rest_read_uncompressed -= out_bytes;
            pfile_in_zip_read_info->crc32 =
                crc32(pfile_in_zip_read_info->crc32, buf_before, (uInt)(out_bytes));

            read += (uInt)(total_out_after - total_out_before);

            if (err == Z_STREAM_END)
                return (read == 0) ? UNZ_EOF : read;
            if (err != Z_OK)
                break;
        }
    }

    if (err == Z_OK)
        return read;
    return err;
}

extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file)
{
    unz64_s *s;
    file_in_zip64_read_info_s *pfile_in_zip_read_info;
    s = (unz64_s *)file;
    if (file == NULL)
        return 0; /* UNZ_PARAMERROR */
    pfile_in_zip_read_info = s->pfile_in_zip_read;
    if (pfile_in_zip_read_info == NULL)
        return 0; /* UNZ_PARAMERROR */
    return pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile;
}

extern int ZEXPORT unzGetLocalExtrafield(unzFile file, voidp buf, unsigned len)
{
    unz64_s *s;
    file_in_zip64_read_info_s *pfile_in_zip_read_info;
    uInt read_now;
    ZPOS64_T size_to_read;

    if (file == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;
    pfile_in_zip_read_info = s->pfile_in_zip_read;

    if (pfile_in_zip_read_info == NULL)
        return UNZ_PARAMERROR;

    size_to_read = pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield;

    if (buf == NULL)
        return (int)size_to_read;

    if (len > size_to_read)
        read_now = (uInt)size_to_read;
    else
        read_now = (uInt)len;

    if (read_now == 0)
        return 0;

    if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream,
                pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield,
                ZLIB_FILEFUNC_SEEK_SET) != 0)
        return UNZ_ERRNO;

    if (ZREAD64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, buf, read_now) != read_now)
        return UNZ_ERRNO;

    return (int)read_now;
}

extern int ZEXPORT unzCloseCurrentFile(unzFile file)
{
    int err = UNZ_OK;

    unz64_s *s;
    file_in_zip64_read_info_s *pfile_in_zip_read_info;
    if (file == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;
    pfile_in_zip_read_info = s->pfile_in_zip_read;

    if (pfile_in_zip_read_info == NULL)
        return UNZ_PARAMERROR;

#ifdef HAVE_AES
    if (s->cur_file_info.compression_method == AES_METHOD) {
        unsigned char authcode[AES_AUTHCODESIZE];
        unsigned char rauthcode[AES_AUTHCODESIZE];

        if (ZREAD64(s->z_filefunc, s->filestream, authcode, AES_AUTHCODESIZE) != AES_AUTHCODESIZE)
            return UNZ_ERRNO;

        if (fcrypt_end(rauthcode, &s->pfile_in_zip_read->aes_ctx) != AES_AUTHCODESIZE)
            err = UNZ_CRCERROR;
        if (memcmp(authcode, rauthcode, AES_AUTHCODESIZE) != 0)
            err = UNZ_CRCERROR;
    }
    /* AES zip version AE-1 will expect a valid crc as well */
    if ((s->cur_file_info.compression_method != AES_METHOD) ||
        (s->cur_file_info_internal.aes_version == 0x0001))
#endif
    {
        if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
            (!pfile_in_zip_read_info->raw)) {
            if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
                err = UNZ_CRCERROR;
        }
    }

    TRYFREE(pfile_in_zip_read_info->read_buffer);
    pfile_in_zip_read_info->read_buffer = NULL;
    if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
        inflateEnd(&pfile_in_zip_read_info->stream);
#ifdef HAVE_BZIP2
    else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED)
        BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream);
#endif

    pfile_in_zip_read_info->stream_initialised = 0;
    TRYFREE(pfile_in_zip_read_info);

    s->pfile_in_zip_read = NULL;

    return err;
}

extern int ZEXPORT unzGoToFirstFile2(unzFile file, unz_file_info64 *pfile_info, char *filename,
                                     uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)
{
    int err = UNZ_OK;
    unz64_s *s;
    if (file == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;
    s->pos_in_central_dir = s->offset_central_dir;
    s->num_file = 0;
    err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal,
                                                filename, filename_size, extrafield, extrafield_size, comment, comment_size);
    s->current_file_ok = (err == UNZ_OK);
    if ((err == UNZ_OK) && (pfile_info != NULL))
        memcpy(pfile_info, &s->cur_file_info, sizeof(unz_file_info64));
    return err;
}

extern int ZEXPORT unzGoToFirstFile(unzFile file)
{
    return unzGoToFirstFile2(file, NULL, NULL, 0, NULL, 0, NULL, 0);
}

extern int ZEXPORT unzGoToNextFile2(unzFile file, unz_file_info64 *pfile_info, char *filename,
                                    uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)
{
    unz64_s *s;
    int err;

    if (file == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;
    if (!s->current_file_ok)
        return UNZ_END_OF_LIST_OF_FILE;
    if (s->gi.number_entry != 0xffff)    /* 2^16 files overflow hack */
        if (s->num_file + 1 == s->gi.number_entry)
            return UNZ_END_OF_LIST_OF_FILE;
    s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
                             s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment;
    s->num_file++;
    err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal,
                                                filename, filename_size, extrafield, extrafield_size, comment, comment_size);
    s->current_file_ok = (err == UNZ_OK);
    if ((err == UNZ_OK) && (pfile_info != NULL))
        memcpy(pfile_info, &s->cur_file_info, sizeof(unz_file_info64));
    return err;
}

extern int ZEXPORT unzGoToNextFile(unzFile file)
{
    return unzGoToNextFile2(file, NULL, NULL, 0, NULL, 0, NULL, 0);
}

extern int ZEXPORT unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func)
{
    unz64_s *s;
    int err;
    unz_file_info64 cur_file_info_saved;
    unz_file_info64_internal cur_file_info_internal_saved;
    ZPOS64_T num_file_saved;
    ZPOS64_T pos_in_central_dir_saved;
    char current_filename[UNZ_MAXFILENAMEINZIP + 1];

    if (file == NULL)
        return UNZ_PARAMERROR;
    if (strlen(filename) >= UNZ_MAXFILENAMEINZIP)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;
    if (!s->current_file_ok)
        return UNZ_END_OF_LIST_OF_FILE;

    /* Save the current state */
    num_file_saved = s->num_file;
    pos_in_central_dir_saved = s->pos_in_central_dir;
    cur_file_info_saved = s->cur_file_info;
    cur_file_info_internal_saved = s->cur_file_info_internal;

    err = unzGoToFirstFile2(file, NULL, current_filename, sizeof(current_filename) - 1, NULL, 0, NULL, 0);

    while (err == UNZ_OK) {
        if (filename_compare_func != NULL)
            err = filename_compare_func(file, current_filename, filename);
        else
            err = strcmp(current_filename, filename);
        if (err == 0)
            return UNZ_OK;
        err = unzGoToNextFile2(file, NULL, current_filename, sizeof(current_filename) - 1, NULL, 0, NULL, 0);
    }

    /* We failed, so restore the state of the 'current file' to where we were. */
    s->num_file = num_file_saved;
    s->pos_in_central_dir = pos_in_central_dir_saved;
    s->cur_file_info = cur_file_info_saved;
    s->cur_file_info_internal = cur_file_info_internal_saved;
    return err;
}

extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos *file_pos)
{
    unz64_file_pos file_pos64;
    int err = unzGetFilePos64(file, &file_pos64);
    if (err == UNZ_OK) {
        file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory;
        file_pos->num_of_file = (uLong)file_pos64.num_of_file;
    }
    return err;
}

extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos *file_pos)
{
    unz64_file_pos file_pos64;

    if (file_pos == NULL)
        return UNZ_PARAMERROR;
    file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;
    file_pos64.num_of_file = file_pos->num_of_file;
    return unzGoToFilePos64(file, &file_pos64);
}

extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos *file_pos)
{
    unz64_s *s;

    if (file == NULL || file_pos == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;
    if (!s->current_file_ok)
        return UNZ_END_OF_LIST_OF_FILE;

    file_pos->pos_in_zip_directory = s->pos_in_central_dir;
    file_pos->num_of_file = s->num_file;

    return UNZ_OK;
}

extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos *file_pos)
{
    unz64_s *s;
    int err;

    if (file == NULL || file_pos == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;

    /* jump to the right spot */
    s->pos_in_central_dir = file_pos->pos_in_zip_directory;
    s->num_file = file_pos->num_of_file;

    /* set the current file */
    err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);
    /* return results */
    s->current_file_ok = (err == UNZ_OK);
    return err;
}

extern uLong ZEXPORT unzGetOffset(unzFile file)
{
    ZPOS64_T offset64;

    if (file == NULL)
        return 0; /* UNZ_PARAMERROR; */
    offset64 = unzGetOffset64(file);
    return (uLong)offset64;
}

extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file)
{
    unz64_s *s;

    if (file == NULL)
        return 0; /* UNZ_PARAMERROR; */
    s = (unz64_s *)file;
    if (!s->current_file_ok)
        return 0;
    if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
        if (s->num_file == s->gi.number_entry)
            return 0;
    return s->pos_in_central_dir;
}

extern int ZEXPORT unzSetOffset(unzFile file, uLong pos)
{
    return unzSetOffset64(file, pos);
}

extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos)
{
    unz64_s *s;
    int err;

    if (file == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;

    s->pos_in_central_dir = pos;
    s->num_file = s->gi.number_entry;      /* hack */
    err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);
    s->current_file_ok = (err == UNZ_OK);
    return err;
}

extern z_off_t ZEXPORT unztell(unzFile file)
{
    unz64_s *s;
    file_in_zip64_read_info_s *pfile_in_zip_read_info;
    if (file == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;
    pfile_in_zip_read_info = s->pfile_in_zip_read;
    if (pfile_in_zip_read_info == NULL)
        return UNZ_PARAMERROR;
    return (z_off_t)pfile_in_zip_read_info->stream.total_out;
}

extern ZPOS64_T ZEXPORT unztell64(unzFile file)
{

    unz64_s *s;
    file_in_zip64_read_info_s *pfile_in_zip_read_info;
    if (file == NULL)
        return (ZPOS64_T)-1;
    s = (unz64_s *)file;
    pfile_in_zip_read_info = s->pfile_in_zip_read;

    if (pfile_in_zip_read_info == NULL)
        return (ZPOS64_T)-1;

    return pfile_in_zip_read_info->total_out_64;
}

extern int ZEXPORT unzeof(unzFile file)
{
    unz64_s *s;
    file_in_zip64_read_info_s *pfile_in_zip_read_info;
    if (file == NULL)
        return UNZ_PARAMERROR;
    s = (unz64_s *)file;
    pfile_in_zip_read_info = s->pfile_in_zip_read;

    if (pfile_in_zip_read_info == NULL)
        return UNZ_PARAMERROR;

    if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
        return 1;
    return 0;
}

/* unzip.h -- IO for uncompress .zip files using zlib
   Version 1.1, February 14h, 2010
   part of the MiniZip project

   Copyright (C) 1998-2010 Gilles Vollant
     http://www.winimage.com/zLibDll/minizip.html
   Modifications of Unzip for Zip64
     Copyright (C) 2007-2008 Even Rouault
   Modifications for Zip64 support on both zip and unzip
     Copyright (C) 2009-2010 Mathias Svensson
     http://result42.com

   This program is distributed under the terms of the same license as zlib.
   See the accompanying LICENSE file for the full text of the license.
*/

#include "Common.h"

#ifndef _UNZ_H
#define _UNZ_H

#define HAVE_AES

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _ZLIB_H
#include "zlib.h"
#endif

#ifndef  _ZLIBIOAPI_H
#include "ioapi.h"
#endif

#ifdef HAVE_BZIP2
#include "bzlib.h"
#endif

#define Z_BZIP2ED 12

#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
/* like the STRICT of WIN32, we define a pointer that cannot be converted
    from (void*) without cast */
typedef struct TagunzFile__ { int unused; } unzFile__;
typedef unzFile__ *unzFile;
#else
typedef voidp unzFile;
#endif


#define UNZ_OK                          (0)
#define UNZ_END_OF_LIST_OF_FILE         (-100)
#define UNZ_ERRNO                       (Z_ERRNO)
#define UNZ_EOF                         (0)
#define UNZ_PARAMERROR                  (-102)
#define UNZ_BADZIPFILE                  (-103)
#define UNZ_INTERNALERROR               (-104)
#define UNZ_CRCERROR                    (-105)


/***************************************************************************/
/* Opening and close a zip file */

extern unzFile ZEXPORT unzOpen OF((const char *path));
extern unzFile ZEXPORT unzOpen64 OF((const void *path));
/* Open a Zip file.

   path should contain the full pathname (by example, on a Windows XP computer 
      "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip". 
   return NULL if zipfile cannot be opened or doesn't exist
   return unzFile handle if no error

   NOTE: The "64" function take a const void* pointer, because  the path is just the value passed to the
   open64_file_func callback. Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path 
   is a pointer to a wide unicode string  (LPCTSTR is LPCWSTR), so const char* does not describe the reality */

extern unzFile ZEXPORT unzOpen2 OF((const char *path, zlib_filefunc_def* pzlib_filefunc_def));
/* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write operations */
extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, zlib_filefunc64_def* pzlib_filefunc_def));
/* Open a Zip file, like unz64Open, but provide a set of file low level API for read/write 64-bit operations */

extern int ZEXPORT unzClose OF((unzFile file));
/* Close a ZipFile opened with unzipOpen. If there is files inside the .Zip opened with unzOpenCurrentFile,
   these files MUST be closed with unzipCloseCurrentFile before call unzipClose.

   return UNZ_OK if there is no error */

extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info));
extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, unz_global_info64 *pglobal_info));
/* Write info about the ZipFile in the *pglobal_info structure.

   return UNZ_OK if no error */

extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *comment, uLong comment_size));
/* Get the global comment string of the ZipFile, in the comment buffer.

   uSizeBuf is the size of the szComment buffer.
   return the number of byte copied or an error code <0 */

/***************************************************************************/
/* Reading the content of the current zipfile, you can open it, read data from it, and close it
   (you can close it before reading all the file) */

extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
/* Open for reading data the current file in the zipfile.

   return UNZ_OK if no error */

extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, const char* password));
/* Open for reading data the current file in the zipfile.
   password is a crypting password

   return UNZ_OK if no error */

extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, int* method, int* level, int raw));
/* Same as unzOpenCurrentFile, but open for read raw the file (not uncompress)
   if raw==1 *method will receive method of compression, *level will receive level of compression

   NOTE: you can set level parameter as NULL (if you did not want known level,
         but you CANNOT set method parameter as NULL */

extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, int* method, int* level, int raw, const char* password));
/* Same as unzOpenCurrentFile, but takes extra parameter password for encrypted files */

extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len));
/* Read bytes from the current file (opened by unzOpenCurrentFile)
   buf contain buffer where data must be copied
   len the size of buf.

   return the number of byte copied if somes bytes are copied
   return 0 if the end of file was reached
   return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */

extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *filename, 
    uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,
    uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
/* Get Info about the current file

   pfile_info if != NULL, the *pfile_info structure will contain somes info about the current file
   filename if != NULL, the file name string will be copied in filename 
   filename_size is the size of the filename buffer
   extrafield if != NULL, the extra field information from the central header will be copied in to
   extrafield_size is the size of the extraField buffer 
   comment if != NULL, the comment string of the file will be copied in to
   comment_size is the size of the comment buffer */

extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file));

extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len));
/* Read extra field from the current file (opened by unzOpenCurrentFile)
   This is the local-header version of the extra field (sometimes, there is
   more info in the local-header version than in the central-header)

   if buf == NULL, it return the size of the local extra field
   if buf != NULL, len is the size of the buffer, the extra header is copied in buf.

   return number of bytes copied in buf, or (if <0) the error code */

extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
/* Close the file in zip opened with unzOpenCurrentFile

   return UNZ_CRCERROR if all the file was read but the CRC is not good */

/***************************************************************************/
/* Browse the directory of the zipfile */

typedef int (*unzFileNameComparer)(unzFile file, const char *filename1, const char *filename2);
typedef int (*unzIteratorFunction)(unzFile file);
typedef int (*unzIteratorFunction2)(unzFile file, unz_file_info64 *pfile_info, char *filename,
    uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size);

extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
/* Set the current file of the zipfile to the first file.

   return UNZ_OK if no error */

extern int ZEXPORT unzGoToFirstFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,
    uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
/* Set the current file of the zipfile to the first file and retrieves the current info on success. 
   Not as seek intensive as unzGoToFirstFile + unzGetCurrentFileInfo.

   return UNZ_OK if no error */

extern int ZEXPORT unzGoToNextFile OF((unzFile file));
/* Set the current file of the zipfile to the next file.

   return UNZ_OK if no error
   return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */

extern int ZEXPORT unzGoToNextFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,
    uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));
/* Set the current file of the zipfile to the next file and retrieves the current 
   info on success. Does less seeking around than unzGotoNextFile + unzGetCurrentFileInfo.

   return UNZ_OK if no error
   return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */

extern int ZEXPORT unzLocateFile OF((unzFile file, const char *filename, unzFileNameComparer filename_compare_func));
/* Try locate the file szFileName in the zipfile. For custom filename comparison pass in comparison function.

   return UNZ_OK if the file is found (it becomes the current file)
   return UNZ_END_OF_LIST_OF_FILE if the file is not found */

/***************************************************************************/
/* Raw access to zip file */

typedef struct unz_file_pos_s
{
    uLong pos_in_zip_directory;     /* offset in zip file directory */
    uLong num_of_file;              /* # of file */
} unz_file_pos;

extern int ZEXPORT unzGetFilePos OF((unzFile file, unz_file_pos* file_pos));
extern int ZEXPORT unzGoToFilePos OF((unzFile file, unz_file_pos* file_pos));

typedef struct unz64_file_pos_s
{
    ZPOS64_T pos_in_zip_directory;   /* offset in zip file directory */
    ZPOS64_T num_of_file;            /* # of file */
} unz64_file_pos;

extern int ZEXPORT unzGetFilePos64 OF((unzFile file, unz64_file_pos* file_pos));
extern int ZEXPORT unzGoToFilePos64 OF((unzFile file, const unz64_file_pos* file_pos));

extern uLong ZEXPORT unzGetOffset OF((unzFile file));
extern ZPOS64_T ZEXPORT unzGetOffset64 OF((unzFile file));
/* Get the current file offset */

extern int ZEXPORT unzSetOffset OF((unzFile file, uLong pos));
extern int ZEXPORT unzSetOffset64 OF((unzFile file, ZPOS64_T pos));
/* Set the current file offset */

extern z_off_t ZEXPORT unztell OF((unzFile file));
extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file));
/* return current position in uncompressed data */

extern int ZEXPORT unzeof OF((unzFile file));
/* return 1 if the end of file was reached, 0 elsewhere */

/***************************************************************************/

#ifdef __cplusplus
}
#endif

#endif /* _UNZ_H */
/* zip.c -- IO on .zip files using zlib
   Version 1.1, February 14h, 2010
   part of the MiniZip project

   Copyright (C) 1998-2010 Gilles Vollant
     http://www.winimage.com/zLibDll/minizip.html
   Modifications for Zip64 support
     Copyright (C) 2009-2010 Mathias Svensson
     http://result42.com
   Modifications for AES, PKWARE disk spanning
     Copyright (C) 2010-2014 Nathan Moinvaziri

   This program is distributed under the terms of the same license as zlib.
   See the accompanying LICENSE file for the full text of the license.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "zlib.h"
#include "zip.h"

#ifdef STDC
#  include <stddef.h>
#  include <string.h>
#  include <stdlib.h>
#endif
#ifdef NO_ERRNO_H
extern int errno;
#else
#   include <errno.h>
#endif

#ifdef HAVE_AES
#  define AES_METHOD          (99)
#  define AES_PWVERIFYSIZE    (2)
#  define AES_AUTHCODESIZE    (10)
#  define AES_MAXSALTLENGTH   (16)
#  define AES_VERSION         (0x0001)
#  define AES_ENCRYPTIONMODE  (0x03)

#  include "aes.h"
#  include "fileenc.h"
#  include "prng.h"
#  include "entropy.h"
#endif

#ifndef NOCRYPT
#  define INCLUDECRYPTINGCODE_IFCRYPTALLOWED
#  include "crypt.h"
#endif

#ifndef local
#  define local static
#endif
/* compile with -Dlocal if your debugger can't find static symbols */

#define SIZEDATA_INDATABLOCK        (4096 - (4 * 4))

#define DISKHEADERMAGIC             (0x08074b50)
#define LOCALHEADERMAGIC            (0x04034b50)
#define CENTRALHEADERMAGIC          (0x02014b50)
#define ENDHEADERMAGIC              (0x06054b50)
#define ZIP64ENDHEADERMAGIC         (0x06064b50)
#define ZIP64ENDLOCHEADERMAGIC      (0x07064b50)

#define FLAG_LOCALHEADER_OFFSET     (0x06)
#define CRC_LOCALHEADER_OFFSET      (0x0e)

#define SIZECENTRALHEADER           (0x2e) /* 46 */
#define SIZECENTRALHEADERLOCATOR    (0x14) /* 20 */
#define SIZECENTRALDIRITEM          (0x2e)
#define SIZEZIPLOCALHEADER          (0x1e)

#ifndef BUFREADCOMMENT
#  define BUFREADCOMMENT            (0x400)
#endif
#ifndef VERSIONMADEBY
#  define VERSIONMADEBY             (0x0) /* platform dependent */
#endif

#ifndef Z_BUFSIZE
#  define Z_BUFSIZE (64 * 1024)
#endif
#ifndef Z_MAXFILENAMEINZIP
#  define Z_MAXFILENAMEINZIP (256)
#endif

#ifndef ALLOC
#  define ALLOC(size) (malloc(size))
#endif
#ifndef TRYFREE
#  define TRYFREE(p) {if (p) free(p); }
#endif

/* NOT sure that this work on ALL platform */
#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32))

#ifndef DEF_MEM_LEVEL
#  if MAX_MEM_LEVEL >= 8
#    define DEF_MEM_LEVEL 8
#  else
#    define DEF_MEM_LEVEL  MAX_MEM_LEVEL
#  endif
#endif

const char zip_copyright[] = " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";

typedef struct linkedlist_datablock_internal_s {
    struct linkedlist_datablock_internal_s *next_datablock;
    uLong avail_in_this_block;
    uLong filled_in_this_block;
    uLong unused;  /* for future use and alignment */
    unsigned char data[SIZEDATA_INDATABLOCK];
} linkedlist_datablock_internal;

typedef struct linkedlist_data_s {
    linkedlist_datablock_internal *first_block;
    linkedlist_datablock_internal *last_block;
} linkedlist_data;

typedef struct {
    z_stream stream;                /* zLib stream structure for inflate */
#ifdef HAVE_BZIP2
    bz_stream bstream;              /* bzLib stream structure for bziped */
#endif
#ifdef HAVE_AES
    fcrypt_ctx aes_ctx;
    prng_ctx aes_rng[1];
#endif
    int stream_initialised;         /* 1 is stream is initialized */
    uInt pos_in_buffered_data;      /* last written byte in buffered_data */

    ZPOS64_T pos_local_header;      /* offset of the local header of the file currently writing */
    char *central_header;           /* central header data for the current file */
    uLong size_centralextra;
    uLong size_centralheader;       /* size of the central header for cur file */
    uLong size_centralextrafree;    /* Extra bytes allocated to the central header but that are not used */
    uLong size_comment;
    uLong flag;                     /* flag of the file currently writing */

    int method;                     /* compression method written to file.*/
    int compression_method;         /* compression method to use */
    int raw;                        /* 1 for directly writing raw data */
    Byte buffered_data[Z_BUFSIZE];  /* buffer contain compressed data to be writ*/
    uLong dosDate;
    uLong crc32;
    int zip64;                      /* Add ZIP64 extended information in the extra field */
    uLong number_disk;              /* number of current disk used for spanning ZIP */
    ZPOS64_T pos_zip64extrainfo;
    ZPOS64_T total_compressed;
    ZPOS64_T total_uncompressed;
#ifndef NOCRYPT
    unsigned long keys[3];          /* keys defining the pseudo-random sequence */
    const unsigned long *pcrc_32_tab;
    int crypt_header_size;
#endif
} curfile64_info;

typedef struct {
    zlib_filefunc64_32_def z_filefunc;
    voidpf filestream;              /* io structure of the zipfile */
    voidpf filestream_with_CD;      /* io structure of the zipfile with the central dir */
    linkedlist_data central_dir;    /* datablock with central dir in construction*/
    int in_opened_file_inzip;       /* 1 if a file in the zip is currently writ.*/
    int append;                     /* append mode */
    curfile64_info ci;              /* info on the file currently writing */

    ZPOS64_T begin_pos;             /* position of the beginning of the zipfile */
    ZPOS64_T add_position_when_writting_offset;
    ZPOS64_T number_entry;
    ZPOS64_T disk_size;             /* size of each disk */
    uLong number_disk;              /* number of the current disk, used for spanning ZIP */
    uLong number_disk_with_CD;      /* number the the disk with central dir, used for spanning ZIP */
#ifndef NO_ADDFILEINEXISTINGZIP
    char *globalcomment;
#endif
} zip64_internal;

/* Allocate a new data block */
local linkedlist_datablock_internal *allocate_new_datablock OF(());
local linkedlist_datablock_internal *allocate_new_datablock()
{
    linkedlist_datablock_internal *ldi;

    ldi = (linkedlist_datablock_internal *)ALLOC(sizeof(linkedlist_datablock_internal));

    if (ldi != NULL) {
        ldi->next_datablock = NULL;
        ldi->filled_in_this_block = 0;
        ldi->avail_in_this_block = SIZEDATA_INDATABLOCK;
    }
    return ldi;
}

/* Free data block in linked list */
local void free_datablock OF((linkedlist_datablock_internal * ldi));
local void free_datablock(linkedlist_datablock_internal *ldi)
{
    while (ldi != NULL) {
        linkedlist_datablock_internal *ldinext = ldi->next_datablock;
        TRYFREE(ldi);
        ldi = ldinext;
    }
}

/* Initialize linked list */
local void init_linkedlist OF((linkedlist_data * ll));
local void init_linkedlist(linkedlist_data *ll)
{
    ll->first_block = ll->last_block = NULL;
}

/* Free entire linked list and all data blocks */
local void free_linkedlist OF((linkedlist_data * ll));
local void free_linkedlist(linkedlist_data *ll)
{
    free_datablock(ll->first_block);
    ll->first_block = ll->last_block = NULL;
}

/* Add data to linked list data block */
local int add_data_in_datablock OF((linkedlist_data * ll, const void *buf, uLong len));
local int add_data_in_datablock(linkedlist_data *ll, const void *buf, uLong len)
{
    linkedlist_datablock_internal *ldi;
    const unsigned char *from_copy;

    if (ll == NULL)
        return ZIP_INTERNALERROR;

    if (ll->last_block == NULL) {
        ll->first_block = ll->last_block = allocate_new_datablock();
        if (ll->first_block == NULL)
            return ZIP_INTERNALERROR;
    }

    ldi = ll->last_block;
    from_copy = (unsigned char *)buf;

    while (len > 0) {
        uInt copy_this;
        uInt i;
        unsigned char *to_copy;

        if (ldi->avail_in_this_block == 0) {
            ldi->next_datablock = allocate_new_datablock();
            if (ldi->next_datablock == NULL)
                return ZIP_INTERNALERROR;
            ldi = ldi->next_datablock;
            ll->last_block = ldi;
        }

        if (ldi->avail_in_this_block < len)
            copy_this = (uInt)ldi->avail_in_this_block;
        else
            copy_this = (uInt)len;

        to_copy = &(ldi->data[ldi->filled_in_this_block]);

        for (i = 0; i < copy_this; i++)
            *(to_copy + i) = *(from_copy + i);

        ldi->filled_in_this_block += copy_this;
        ldi->avail_in_this_block -= copy_this;
        from_copy += copy_this;
        len -= copy_this;
    }
    return ZIP_OK;
}

local uLong zip64local_TmzDateToDosDate OF((const tm_zip * ptm));
local uLong zip64local_TmzDateToDosDate(const tm_zip *ptm)
{
    uLong year;
#define zip64local_in_range(min, max, value) ((min) <= (value) && (value) <= (max))
    /* Years supported:
     * [00, 79] (assumed to be between 2000 and 2079)
     * [80, 207] (assumed to be between 1980 and 2107, typical output of old
         software that does 'year-1900' to get a double digit year)
     * [1980, 2107]
       Due to the date format limitations, only years between 1980 and 2107 can be stored.
     */
    if (!(zip64local_in_range(1980, 2107, ptm->tm_year) || zip64local_in_range(0, 207, ptm->tm_year)) ||
        !zip64local_in_range(0, 11, ptm->tm_mon) ||
        !zip64local_in_range(1, 31, ptm->tm_mday) ||
        !zip64local_in_range(0, 23, ptm->tm_hour) ||
        !zip64local_in_range(0, 59, ptm->tm_min) ||
        !zip64local_in_range(0, 59, ptm->tm_sec))
        return 0;
#undef zip64local_in_range

    year = (uLong)ptm->tm_year;
    if (year >= 1980) /* range [1980, 2107] */
        year -= 1980;
    else if (year >= 80) /* range [80, 99] */
        year -= 80;
    else /* range [00, 79] */
        year += 20;

    return
        (uLong)(((ptm->tm_mday) + (32 * (ptm->tm_mon + 1)) + (512 * year)) << 16) |
        ((ptm->tm_sec / 2) + (32 * ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
}

/* Inputs a long in LSB order to the given file: nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) */
local int zip64local_putValue OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream,
                                  ZPOS64_T x, int nbByte));
local int zip64local_putValue(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream,
                              ZPOS64_T x, int nbByte)
{
    unsigned char buf[8];
    int n;
    for (n = 0; n < nbByte; n++) {
        buf[n] = (unsigned char)(x & 0xff);
        x >>= 8;
    }
    if (x != 0) {
        /* data overflow - hack for ZIP64 (X Roche) */
        for (n = 0; n < nbByte; n++) {
            buf[n] = 0xff;
        }
    }

    if (ZWRITE64(*pzlib_filefunc_def, filestream, buf, nbByte) != (uLong)nbByte)
        return ZIP_ERRNO;

    return ZIP_OK;
}

local void zip64local_putValue_inmemory OF((void *dest, ZPOS64_T x, int nbByte));
local void zip64local_putValue_inmemory(void *dest, ZPOS64_T x, int nbByte)
{
    unsigned char *buf = (unsigned char *)dest;
    int n;
    for (n = 0; n < nbByte; n++) {
        buf[n] = (unsigned char)(x & 0xff);
        x >>= 8;
    }

    if (x != 0) {
        /* data overflow - hack for ZIP64 */
        for (n = 0; n < nbByte; n++) {
            buf[n] = 0xff;
        }
    }
}

local int zip64local_getByte OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, int *pi));
local int zip64local_getByte(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, int *pi)
{
    unsigned char c;
    int err = (int)ZREAD64(*pzlib_filefunc_def, filestream, &c, 1);
    if (err == 1) {
        *pi = (int)c;
        return ZIP_OK;
    }
    if (ZERROR64(*pzlib_filefunc_def, filestream))
        return ZIP_ERRNO;
    return ZIP_EOF;
}

local int zip64local_getShort OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, uLong * pX));
local int zip64local_getShort(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, uLong *pX)
{
    uLong x;
    int i = 0;
    int err;

    err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x = (uLong)i;
    if (err == ZIP_OK)
        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x += ((uLong)i) << 8;

    if (err == ZIP_OK)
        *pX = x;
    else
        *pX = 0;
    return err;
}

local int zip64local_getLong OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, uLong * pX));
local int zip64local_getLong(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, uLong *pX)
{
    uLong x;
    int i = 0;
    int err;

    err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x = (uLong)i;
    if (err == ZIP_OK)
        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x += ((uLong)i) << 8;
    if (err == ZIP_OK)
        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x += ((uLong)i) << 16;
    if (err == ZIP_OK)
        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x += ((uLong)i) << 24;

    if (err == ZIP_OK)
        *pX = x;
    else
        *pX = 0;
    return err;
}

local int zip64local_getLong64 OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, ZPOS64_T * pX));
local int zip64local_getLong64(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)
{
    ZPOS64_T x;
    int i = 0;
    int err;

    err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x = (ZPOS64_T)i;
    if (err == ZIP_OK)
        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x += ((ZPOS64_T)i) << 8;
    if (err == ZIP_OK)
        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x += ((ZPOS64_T)i) << 16;
    if (err == ZIP_OK)
        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x += ((ZPOS64_T)i) << 24;
    if (err == ZIP_OK)
        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x += ((ZPOS64_T)i) << 32;
    if (err == ZIP_OK)
        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x += ((ZPOS64_T)i) << 40;
    if (err == ZIP_OK)
        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x += ((ZPOS64_T)i) << 48;
    if (err == ZIP_OK)
        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);
    x += ((ZPOS64_T)i) << 56;

    if (err == ZIP_OK)
        *pX = x;
    else
        *pX = 0;

    return err;
}

/* Gets the amount of bytes left to write to the current disk for spanning archives */
local int zipGetDiskSizeAvailable OF((zipFile file, ZPOS64_T * size_available));
local int zipGetDiskSizeAvailable(zipFile file, ZPOS64_T *size_available)
{
    zip64_internal *zi;
    ZPOS64_T current_disk_size;

    zi = (zip64_internal *)file;
    ZSEEK64(zi->z_filefunc, zi->filestream, 0, ZLIB_FILEFUNC_SEEK_END);
    current_disk_size = ZTELL64(zi->z_filefunc, zi->filestream);
    *size_available = zi->disk_size - current_disk_size;
    return ZIP_OK;
}

/* Goes to a specific disk number for spanning archives */
local int zipGoToSpecificDisk OF((zipFile file, int number_disk, int open_existing));
local int zipGoToSpecificDisk(zipFile file, int number_disk, int open_existing)
{
    zip64_internal *zi;
    int err = ZIP_OK;

    zi = (zip64_internal *)file;
    if (zi->disk_size == 0)
        return err;

    if ((zi->filestream != NULL) && (zi->filestream != zi->filestream_with_CD))
        ZCLOSE64(zi->z_filefunc, zi->filestream);

    zi->filestream = ZOPENDISK64(zi->z_filefunc, zi->filestream_with_CD, number_disk, (open_existing == 1) ?
                                 (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING) :
                                 (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE));

    if (zi->filestream == NULL)
        err = ZIP_ERRNO;

    return err;
}

/* Goes to the first disk in a spanned archive */
local int zipGoToFirstDisk OF((zipFile file));
local int zipGoToFirstDisk(zipFile file)
{
    zip64_internal *zi;
    int number_disk_next;
    int err = ZIP_OK;

    zi = (zip64_internal *)file;

    if (zi->disk_size == 0)
        return err;
    number_disk_next = 0;
    if (zi->number_disk_with_CD > 0)
        number_disk_next = (int)zi->number_disk_with_CD - 1;
    err = zipGoToSpecificDisk(file, number_disk_next, (zi->append == APPEND_STATUS_ADDINZIP));
    if ((err == ZIP_ERRNO) && (zi->append == APPEND_STATUS_ADDINZIP))
        err = zipGoToSpecificDisk(file, number_disk_next, 0);
    if (err == ZIP_OK)
        zi->number_disk = number_disk_next;
    ZSEEK64(zi->z_filefunc, zi->filestream, 0, ZLIB_FILEFUNC_SEEK_END);
    return err;
}

/* Goes to the next disk in a spanned archive */
local int zipGoToNextDisk OF((zipFile file));
local int zipGoToNextDisk(zipFile file)
{
    zip64_internal *zi;
    ZPOS64_T size_available_in_disk;
    int err = ZIP_OK;
    int number_disk_next;

    zi = (zip64_internal *)file;

    if (zi->disk_size == 0)
        return err;

    number_disk_next = (int)zi->number_disk + 1;

    do {
        err = zipGoToSpecificDisk(file, number_disk_next, (zi->append == APPEND_STATUS_ADDINZIP));
        if ((err == ZIP_ERRNO) && (zi->append == APPEND_STATUS_ADDINZIP))
            err = zipGoToSpecificDisk(file, number_disk_next, 0);
        if (err != ZIP_OK)
            break;
        err = zipGetDiskSizeAvailable(file, &size_available_in_disk);
        if (err != ZIP_OK)
            break;
        zi->number_disk = number_disk_next;
        zi->number_disk_with_CD = zi->number_disk + 1;

        number_disk_next += 1;
    } while (size_available_in_disk <= 0);

    return err;
}

/* Locate the Central directory of a zipfile (at the end, just before the global comment) */
local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream));
local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream)
{
    unsigned char *buf;
    ZPOS64_T file_size;
    ZPOS64_T back_read = 4;
    ZPOS64_T max_back = 0xffff; /* maximum size of global comment */
    ZPOS64_T pos_found = 0;
    uLong read_size;
    ZPOS64_T read_pos;
    int i;

    buf = (unsigned char *)ALLOC(BUFREADCOMMENT + 4);
    if (buf == NULL)
        return 0;

    if (ZSEEK64(*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0) {
        TRYFREE(buf);
        return 0;
    }

    file_size = ZTELL64(*pzlib_filefunc_def, filestream);

    if (max_back > file_size)
        max_back = file_size;

    while (back_read < max_back) {
        if (back_read + BUFREADCOMMENT > max_back)
            back_read = max_back;
        else
            back_read += BUFREADCOMMENT;

        read_pos = file_size - back_read;
        read_size = ((BUFREADCOMMENT + 4) < (file_size - read_pos)) ?
                    (BUFREADCOMMENT + 4) : (uLong)(file_size - read_pos);

        if (ZSEEK64(*pzlib_filefunc_def, filestream, read_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
            break;
        if (ZREAD64(*pzlib_filefunc_def, filestream, buf, read_size) != read_size)
            break;

        for (i = (int)read_size - 3; (i--) > 0; )
            if ((*(buf + i)) == (ENDHEADERMAGIC & 0xff) &&
                (*(buf + i + 1)) == (ENDHEADERMAGIC >> 8 & 0xff) &&
                (*(buf + i + 2)) == (ENDHEADERMAGIC >> 16 & 0xff) &&
                (*(buf + i + 3)) == (ENDHEADERMAGIC >> 24 & 0xff)) {
                pos_found = read_pos + i;
                break;
            }

        if (pos_found != 0)
            break;
    }
    TRYFREE(buf);
    return pos_found;
}

/* Locate the Central directory 64 of a zipfile (at the end, just before the global comment) */
local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream,
                                                 const ZPOS64_T endcentraloffset));
local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream,
                                             const ZPOS64_T endcentraloffset)
{
    ZPOS64_T offset;
    uLong uL;

    /* Zip64 end of central directory locator */
    if (ZSEEK64(*pzlib_filefunc_def, filestream, endcentraloffset - SIZECENTRALHEADERLOCATOR, ZLIB_FILEFUNC_SEEK_SET) != 0)
        return 0;

    /* read locator signature */
    if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK)
        return 0;
    if (uL != ZIP64ENDLOCHEADERMAGIC)
        return 0;
    /* number of the disk with the start of the zip64 end of  central directory */
    if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK)
        return 0;
    /* relative offset of the zip64 end of central directory record */
    if (zip64local_getLong64(pzlib_filefunc_def, filestream, &offset) != ZIP_OK)
        return 0;
    /* total number of disks */
    if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK)
        return 0;
    /* Goto end of central directory record */
    if (ZSEEK64(*pzlib_filefunc_def, filestream, offset, ZLIB_FILEFUNC_SEEK_SET) != 0)
        return 0;
    /* the signature */
    if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK)
        return 0;
    if (uL != ZIP64ENDHEADERMAGIC)
        return 0;

    return offset;
}

extern zipFile ZEXPORT zipOpen4(const void *pathname, int append, ZPOS64_T disk_size, zipcharpc *globalcomment,
                                zlib_filefunc64_32_def *pzlib_filefunc64_32_def)
{
    zip64_internal ziinit;
    zip64_internal *zi;
#ifndef NO_ADDFILEINEXISTINGZIP
    ZPOS64_T byte_before_the_zipfile;   /* byte before the zipfile, (>0 for sfx)*/
    ZPOS64_T size_central_dir = 0;          /* size of the central directory  */
    ZPOS64_T offset_central_dir = 0;        /* offset of start of central directory */
    ZPOS64_T number_entry_CD = 0;           /* total number of entries in the central dir */
    ZPOS64_T number_entry;
    ZPOS64_T central_pos;
    ZPOS64_T size_central_dir_to_read;
    uLong uL;
    uLong size_comment = 0;
    size_t buf_size = SIZEDATA_INDATABLOCK;
    void *buf_read;
#endif
    int err = ZIP_OK;
    int mode;

    ziinit.z_filefunc.zseek32_file = NULL;
    ziinit.z_filefunc.ztell32_file = NULL;
    if (pzlib_filefunc64_32_def == NULL)
        fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64);
    else
        ziinit.z_filefunc = *pzlib_filefunc64_32_def;

    if (append == APPEND_STATUS_CREATE)
        mode = (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE);
    else
        mode = (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING);

    ziinit.filestream = ZOPEN64(ziinit.z_filefunc, pathname, mode);
    if (ziinit.filestream == NULL)
        return NULL;

    if (append == APPEND_STATUS_CREATEAFTER) {
        /* Don't support spanning ZIP with APPEND_STATUS_CREATEAFTER */
        if (disk_size > 0)
            return NULL;

        ZSEEK64(ziinit.z_filefunc, ziinit.filestream, 0, SEEK_END);
    }

    ziinit.filestream_with_CD = ziinit.filestream;
    ziinit.append = append;
    ziinit.number_disk = 0;
    ziinit.number_disk_with_CD = 0;
    ziinit.disk_size = disk_size;
    ziinit.begin_pos = ZTELL64(ziinit.z_filefunc, ziinit.filestream);
    ziinit.in_opened_file_inzip = 0;
    ziinit.ci.stream_initialised = 0;
    ziinit.number_entry = 0;
    ziinit.add_position_when_writting_offset = 0;
    init_linkedlist(&(ziinit.central_dir));

    zi = (zip64_internal *)ALLOC(sizeof(zip64_internal));
    if (zi == NULL) {
        ZCLOSE64(ziinit.z_filefunc, ziinit.filestream);
        return NULL;
    }

#ifndef NO_ADDFILEINEXISTINGZIP
    /* Add file in a zipfile */
    ziinit.globalcomment = NULL;
    if (append == APPEND_STATUS_ADDINZIP) {
        /* Read and Cache Central Directory Records */
        central_pos = zip64local_SearchCentralDir(&ziinit.z_filefunc, ziinit.filestream);
        /* disable to allow appending to empty ZIP archive (must be standard zip, not zip64)
            if (central_pos == 0)
                err = ZIP_ERRNO;
         */

        if (err == ZIP_OK) {
            /* read end of central directory info */
            if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
                err = ZIP_ERRNO;

            /* the signature, already checked */
            if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
                err = ZIP_ERRNO;
            /* number of this disk */
            if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk) != ZIP_OK)
                err = ZIP_ERRNO;
            /* number of the disk with the start of the central directory */
            if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk_with_CD) != ZIP_OK)
                err = ZIP_ERRNO;
            /* total number of entries in the central dir on this disk */
            number_entry = 0;
            if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
                err = ZIP_ERRNO;
            else
                number_entry = uL;
            /* total number of entries in the central dir */
            number_entry_CD = 0;
            if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
                err = ZIP_ERRNO;
            else
                number_entry_CD = uL;
            if (number_entry_CD != number_entry)
                err = ZIP_BADZIPFILE;
            /* size of the central directory */
            size_central_dir = 0;
            if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
                err = ZIP_ERRNO;
            else
                size_central_dir = uL;
            /* offset of start of central directory with respect to the starting disk number */
            offset_central_dir = 0;
            if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
                err = ZIP_ERRNO;
            else
                offset_central_dir = uL;
            /* zipfile global comment length */
            if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &size_comment) != ZIP_OK)
                err = ZIP_ERRNO;

            if ((err == ZIP_OK) && ((number_entry_CD == 0xffff) || (offset_central_dir == 0xffffffff))) {
                /* Format should be Zip64, as the central directory or file size is too large */
                central_pos = zip64local_SearchCentralDir64(&ziinit.z_filefunc, ziinit.filestream, central_pos);

                if (central_pos) {
                    ZPOS64_T sizeEndOfCentralDirectory;

                    if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
                        err = ZIP_ERRNO;

                    /* the signature, already checked */
                    if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
                        err = ZIP_ERRNO;
                    /* size of zip64 end of central directory record */
                    if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &sizeEndOfCentralDirectory) != ZIP_OK)
                        err = ZIP_ERRNO;
                    /* version made by */
                    if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
                        err = ZIP_ERRNO;
                    /* version needed to extract */
                    if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)
                        err = ZIP_ERRNO;
                    /* number of this disk */
                    if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk) != ZIP_OK)
                        err = ZIP_ERRNO;
                    /* number of the disk with the start of the central directory */
                    if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk_with_CD) != ZIP_OK)
                        err = ZIP_ERRNO;
                    /* total number of entries in the central directory on this disk */
                    if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &number_entry) != ZIP_OK)
                        err = ZIP_ERRNO;
                    /* total number of entries in the central directory */
                    if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &number_entry_CD) != ZIP_OK)
                        err = ZIP_ERRNO;
                    if (number_entry_CD != number_entry)
                        err = ZIP_BADZIPFILE;
                    /* size of the central directory */
                    if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &size_central_dir) != ZIP_OK)
                        err = ZIP_ERRNO;
                    /* offset of start of central directory with respect to the starting disk number */
                    if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &offset_central_dir) != ZIP_OK)
                        err = ZIP_ERRNO;
                } else
                    err = ZIP_BADZIPFILE;
            }
        }

        if ((err == ZIP_OK) && (central_pos < offset_central_dir + size_central_dir))
            err = ZIP_BADZIPFILE;

        if (err != ZIP_OK) {
            ZCLOSE64(ziinit.z_filefunc, ziinit.filestream);
            TRYFREE(zi);
            return NULL;
        }

        if (size_comment > 0) {
            ziinit.globalcomment = (char *)ALLOC(size_comment + 1);
            if (ziinit.globalcomment) {
                size_comment = ZREAD64(ziinit.z_filefunc, ziinit.filestream, ziinit.globalcomment, size_comment);
                ziinit.globalcomment[size_comment] = 0;
            }
        }

        byte_before_the_zipfile = central_pos - (offset_central_dir + size_central_dir);
        ziinit.add_position_when_writting_offset = byte_before_the_zipfile;

        /* Store central directory in memory */
        size_central_dir_to_read = size_central_dir;
        buf_size = SIZEDATA_INDATABLOCK;
        buf_read = (void *)ALLOC(buf_size);
        if (buf_read == NULL)
            err = ZIP_INTERNALERROR;

        if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream,
                    offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
            err = ZIP_ERRNO;

        while ((size_central_dir_to_read > 0) && (err == ZIP_OK)) {
            ZPOS64_T read_this = SIZEDATA_INDATABLOCK;
            if (read_this > size_central_dir_to_read)
                read_this = size_central_dir_to_read;

            if (ZREAD64(ziinit.z_filefunc, ziinit.filestream, buf_read, (uLong)read_this) != read_this)
                err = ZIP_ERRNO;

            if (err == ZIP_OK)
                err = add_data_in_datablock(&ziinit.central_dir, buf_read, (uLong)read_this);

            size_central_dir_to_read -= read_this;
        }
        TRYFREE(buf_read);

        ziinit.begin_pos = byte_before_the_zipfile;
        ziinit.number_entry = number_entry_CD;

        if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream,
                    offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
            err = ZIP_ERRNO;
    }

    if (globalcomment)
        *globalcomment = ziinit.globalcomment;
#endif

    if (err != ZIP_OK) {
#ifndef NO_ADDFILEINEXISTINGZIP
        TRYFREE(ziinit.globalcomment);
#endif
        TRYFREE(zi);
        return NULL;
    }

    *zi = ziinit;
    zipGoToFirstDisk((zipFile)zi);
    return (zipFile)zi;
}

extern zipFile ZEXPORT zipOpen2(const char *pathname, int append, zipcharpc *globalcomment,
                                zlib_filefunc_def *pzlib_filefunc32_def)
{
    if (pzlib_filefunc32_def != NULL) {
        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
        fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def);
        return zipOpen4(pathname, append, 0, globalcomment, &zlib_filefunc64_32_def_fill);
    }
    return zipOpen4(pathname, append, 0, globalcomment, NULL);
}

extern zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zipcharpc *globalcomment,
                                   zlib_filefunc64_def *pzlib_filefunc_def)
{
    if (pzlib_filefunc_def != NULL) {
        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
        zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
        zlib_filefunc64_32_def_fill.ztell32_file = NULL;
        zlib_filefunc64_32_def_fill.zseek32_file = NULL;
        return zipOpen4(pathname, append, 0, globalcomment, &zlib_filefunc64_32_def_fill);
    }
    return zipOpen4(pathname, append, 0, globalcomment, NULL);
}

extern zipFile ZEXPORT zipOpen3(const char *pathname, int append, ZPOS64_T disk_size, zipcharpc *globalcomment,
                                zlib_filefunc_def *pzlib_filefunc32_def)
{
    if (pzlib_filefunc32_def != NULL) {
        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
        fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def);
        return zipOpen4(pathname, append, disk_size, globalcomment, &zlib_filefunc64_32_def_fill);
    }
    return zipOpen4(pathname, append, disk_size, globalcomment, NULL);
}

extern zipFile ZEXPORT zipOpen3_64(const void *pathname, int append, ZPOS64_T disk_size, zipcharpc *globalcomment,
                                   zlib_filefunc64_def *pzlib_filefunc_def)
{
    if (pzlib_filefunc_def != NULL) {
        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
        zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
        zlib_filefunc64_32_def_fill.ztell32_file = NULL;
        zlib_filefunc64_32_def_fill.zseek32_file = NULL;
        return zipOpen4(pathname, append, disk_size, globalcomment, &zlib_filefunc64_32_def_fill);
    }
    return zipOpen4(pathname, append, disk_size, globalcomment, NULL);
}

extern zipFile ZEXPORT zipOpen(const char *pathname, int append)
{
    return zipOpen3((const void *)pathname, append, 0, NULL, NULL);
}

extern zipFile ZEXPORT zipOpen64(const void *pathname, int append)
{
    return zipOpen3(pathname, append, 0, NULL, NULL);
}

extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
                                           const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
                                           uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits, int memLevel,
                                           int strategy, const char *password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase, int zip64)
{
    zip64_internal *zi;
    uInt size_filename;
    uInt size_comment = 0;
    uInt i;
    int err = ZIP_OK;
    ZPOS64_T size_available;
    ZPOS64_T size_needed;

#ifdef NOCRYPT
    (crcForCrypting);
    if (password != NULL)
        return ZIP_PARAMERROR;
#endif

    if (file == NULL)
        return ZIP_PARAMERROR;

    if ((method != 0) &&
#ifdef HAVE_BZIP2
        (method != Z_BZIP2ED) &&
#endif
        (method != Z_DEFLATED))
        return ZIP_PARAMERROR;

    zi = (zip64_internal *)file;

    if (zi->in_opened_file_inzip == 1) {
        err = zipCloseFileInZip(file);
        if (err != ZIP_OK)
            return err;
    }

    if (filename == NULL)
        filename = "-";
    if (comment != NULL)
        size_comment = (uInt)strlen(comment);

    size_filename = (uInt)strlen(filename);

    if (zipfi == NULL)
        zi->ci.dosDate = 0;
    else {
        if (zipfi->dosDate != 0)
            zi->ci.dosDate = zipfi->dosDate;
        else
            zi->ci.dosDate = zip64local_TmzDateToDosDate(&zipfi->tmz_date);
    }

    zi->ci.method = method;
    zi->ci.compression_method = method;
    zi->ci.crc32 = 0;
    zi->ci.stream_initialised = 0;
    zi->ci.pos_in_buffered_data = 0;
    zi->ci.raw = raw;
    zi->ci.flag = flagBase;
    if ((level == 8) || (level == 9))
        zi->ci.flag |= 2;
    if (level == 2)
        zi->ci.flag |= 4;
    if (level == 1)
        zi->ci.flag |= 6;
    if (password != NULL) {
        zi->ci.flag |= 1;
#ifdef HAVE_AES
        zi->ci.method = AES_METHOD;
#endif
    }

    if (zi->disk_size > 0) {
        if ((zi->number_disk == 0) && (zi->number_entry == 0))
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)DISKHEADERMAGIC, 4);

        /* Make sure enough space available on current disk for local header */
        zipGetDiskSizeAvailable((zipFile)zi, &size_available);
        size_needed = 30 + size_filename + size_extrafield_local;
        if (zi->ci.zip64)
            size_needed += 20;
#ifdef HAVE_AES
        if (zi->ci.method == AES_METHOD)
            size_needed += 11;
#endif
        if (size_available < size_needed)
            zipGoToNextDisk((zipFile)zi);
    }

    zi->ci.pos_local_header = ZTELL64(zi->z_filefunc, zi->filestream);
    zi->ci.size_comment = size_comment;
    zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global;
    zi->ci.size_centralextra = size_extrafield_global;
    zi->ci.size_centralextrafree = 32; /* Extra space reserved for ZIP64 extra info */
#ifdef HAVE_AES
    if (zi->ci.method == AES_METHOD)
        zi->ci.size_centralextrafree += 11; /* Extra space reserved for AES extra info */
#endif
    zi->ci.central_header = (char *)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralextrafree + size_comment);
    if (zi->ci.central_header == NULL)
        return ZIP_INTERNALERROR;
    
    zi->ci.number_disk = zi->number_disk;

    /* Write central directory header */
    zip64local_putValue_inmemory(zi->ci.central_header, (uLong)CENTRALHEADERMAGIC, 4);
    zip64local_putValue_inmemory(zi->ci.central_header + 4, (uLong)versionMadeBy, 2);
    zip64local_putValue_inmemory(zi->ci.central_header + 6, (uLong)20, 2);
    zip64local_putValue_inmemory(zi->ci.central_header + 8, (uLong)zi->ci.flag, 2);
    zip64local_putValue_inmemory(zi->ci.central_header + 10, (uLong)zi->ci.method, 2);
    zip64local_putValue_inmemory(zi->ci.central_header + 12, (uLong)zi->ci.dosDate, 4);
    zip64local_putValue_inmemory(zi->ci.central_header + 16, (uLong)0, 4); /*crc*/
    zip64local_putValue_inmemory(zi->ci.central_header + 20, (uLong)0, 4); /*compr size*/
    zip64local_putValue_inmemory(zi->ci.central_header + 24, (uLong)0, 4); /*uncompr size*/
    zip64local_putValue_inmemory(zi->ci.central_header + 28, (uLong)size_filename, 2);
    zip64local_putValue_inmemory(zi->ci.central_header + 30, (uLong)size_extrafield_global, 2);
    zip64local_putValue_inmemory(zi->ci.central_header + 32, (uLong)size_comment, 2);
    zip64local_putValue_inmemory(zi->ci.central_header + 34, (uLong)zi->ci.number_disk, 2); /*disk nm start*/

    if (zipfi == NULL)
        zip64local_putValue_inmemory(zi->ci.central_header + 36, (uLong)0, 2);
    else
        zip64local_putValue_inmemory(zi->ci.central_header + 36, (uLong)zipfi->internal_fa, 2);
    if (zipfi == NULL)
        zip64local_putValue_inmemory(zi->ci.central_header + 38, (uLong)0, 4);
    else
        zip64local_putValue_inmemory(zi->ci.central_header + 38, (uLong)zipfi->external_fa, 4);
    if (zi->ci.pos_local_header >= 0xffffffff)
        zip64local_putValue_inmemory(zi->ci.central_header + 42, (uLong)0xffffffff, 4);
    else
        zip64local_putValue_inmemory(zi->ci.central_header + 42,
                                     (uLong)zi->ci.pos_local_header - zi->add_position_when_writting_offset, 4);

    for (i = 0; i < size_filename; i++)
        zi->ci.central_header[SIZECENTRALHEADER + i] = filename[i];
    for (i = 0; i < size_extrafield_global; i++)
        zi->ci.central_header[SIZECENTRALHEADER + size_filename + i] =
            ((const char *)extrafield_global)[i];
    /* Store comment at the end for later repositioning */
    for (i = 0; i < size_comment; i++)
        zi->ci.central_header[zi->ci.size_centralheader +
                              zi->ci.size_centralextrafree + i] = comment[i];

    if (zi->ci.central_header == NULL)
        return ZIP_INTERNALERROR;

    zi->ci.zip64 = zip64;
    zi->ci.total_compressed = 0;
    zi->ci.total_uncompressed = 0;
    zi->ci.pos_zip64extrainfo = 0;

    /* Write the local header */
    err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)LOCALHEADERMAGIC, 4);

    if (err == ZIP_OK) {
        if (zi->ci.zip64)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)45, 2); /* version needed to extract */
        else
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)20, 2); /* version needed to extract */
    }
    if (err == ZIP_OK)
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->ci.flag, 2);
    if (err == ZIP_OK)
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->ci.method, 2);
    if (err == ZIP_OK)
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->ci.dosDate, 4);

    /* CRC & compressed size & uncompressed size will be filled in later and rewritten later */

    if (err == ZIP_OK)
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0, 4); /* crc 32, unknown */
    if (err == ZIP_OK) {
        if (zi->ci.zip64)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xFFFFFFFF, 4); /* compressed size, unknown */
        else
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0, 4); /* compressed size, unknown */
    }
    if (err == ZIP_OK) {
        if (zi->ci.zip64) /* uncompressed size, unknown */
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xFFFFFFFF, 4);
        else /* uncompressed size, unknown */
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0, 4);
    }
    if (err == ZIP_OK)
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_filename, 2);
    if (err == ZIP_OK) {
        ZPOS64_T size_extrafield = size_extrafield_local;
        if (zi->ci.zip64)
            size_extrafield += 20;
#ifdef HAVE_AES
        if (zi->ci.method == AES_METHOD)
            size_extrafield += 11;
#endif
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_extrafield, 2);
    }
    if ((err == ZIP_OK) && (size_filename > 0)) {
        if (ZWRITE64(zi->z_filefunc, zi->filestream, filename, size_filename) != size_filename)
            err = ZIP_ERRNO;
    }
    if ((err == ZIP_OK) && (size_extrafield_local > 0)) {
        if (ZWRITE64(zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local)
            err = ZIP_ERRNO;
    }

    /* Write the Zip64 extended info */
    if ((err == ZIP_OK) && (zi->ci.zip64)) {
        short headerid = 1;
        short datasize = 16;
        ZPOS64_T compressed_size = 0;
        ZPOS64_T uncompressed_size = 0;

        /* Remember position of Zip64 extended info for the local file header.
           (needed when we update size after done with file) */
        zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc, zi->filestream);

        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)headerid, 2);
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)datasize, 2);

        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)uncompressed_size, 8);
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)compressed_size, 8);
    }
#ifdef HAVE_AES
    /* Write the AES extended info */
    if ((err == ZIP_OK) && (zi->ci.method == AES_METHOD)) {
        int headerid = 0x9901;
        short datasize = 7;

        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, headerid, 2);
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, datasize, 2);

        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, AES_VERSION, 2);
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, 'A', 1);
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, 'E', 1);
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, AES_ENCRYPTIONMODE, 1);
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->ci.compression_method, 2);
    }
#endif

#ifdef HAVE_BZIP2
    zi->ci.bstream.avail_in = (uInt)0;
    zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
    zi->ci.bstream.next_out = (char *)zi->ci.buffered_data;
    zi->ci.bstream.total_in_hi32 = 0;
    zi->ci.bstream.total_in_lo32 = 0;
    zi->ci.bstream.total_out_hi32 = 0;
    zi->ci.bstream.total_out_lo32 = 0;
#endif

    zi->ci.stream.avail_in = (uInt)0;
    zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
    zi->ci.stream.next_out = zi->ci.buffered_data;
    zi->ci.stream.total_in = 0;
    zi->ci.stream.total_out = 0;
    zi->ci.stream.data_type = Z_BINARY;

    if ((err == ZIP_OK) && (!zi->ci.raw)) {
        if (method == Z_DEFLATED) {
            zi->ci.stream.zalloc = (alloc_func)0;
            zi->ci.stream.zfree = (free_func)0;
            zi->ci.stream.opaque = (voidpf)zi;

            if (windowBits > 0)
                windowBits = -windowBits;

            err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy);

            if (err == Z_OK)
                zi->ci.stream_initialised = Z_DEFLATED;
        } else if (method == Z_BZIP2ED) {
#ifdef HAVE_BZIP2
            zi->ci.bstream.bzalloc = 0;
            zi->ci.bstream.bzfree = 0;
            zi->ci.bstream.opaque = (voidpf)0;

            err = BZ2_bzCompressInit(&zi->ci.bstream, level, 0, 35);
            if (err == BZ_OK)
                zi->ci.stream_initialised = Z_BZIP2ED;
#endif
        }
    }

#ifndef NOCRYPT
    zi->ci.crypt_header_size = 0;
    if ((err == Z_OK) && ((zi->ci.flag & 1) != 0)) {
#ifdef HAVE_AES
        if (zi->ci.method == AES_METHOD) {
            unsigned char passverify[AES_PWVERIFYSIZE];
            unsigned char saltvalue[AES_MAXSALTLENGTH];
            uInt saltlength;

            if ((AES_ENCRYPTIONMODE < 1) || (AES_ENCRYPTIONMODE > 3))
                return Z_ERRNO;

            saltlength = SALT_LENGTH(AES_ENCRYPTIONMODE);

            prng_init(entropy_fun, zi->ci.aes_rng);
            prng_rand(saltvalue, saltlength, zi->ci.aes_rng);
            prng_end(zi->ci.aes_rng);

            fcrypt_init(AES_ENCRYPTIONMODE, (unsigned char *)password, (unsigned int)strlen(password), saltvalue, passverify, &zi->ci.aes_ctx);

            if (ZWRITE64(zi->z_filefunc, zi->filestream, saltvalue, saltlength) != saltlength)
                err = ZIP_ERRNO;
            if (ZWRITE64(zi->z_filefunc, zi->filestream, passverify, AES_PWVERIFYSIZE) != AES_PWVERIFYSIZE)
                err = ZIP_ERRNO;

            zi->ci.crypt_header_size = saltlength + AES_PWVERIFYSIZE + AES_AUTHCODESIZE;
        } else
#endif
        {
            unsigned char bufHead[RAND_HEAD_LEN];
            unsigned int sizeHead;

            zi->ci.pcrc_32_tab = (const unsigned long *)get_crc_table();
            /*init_keys(password, zi->ci.keys, zi->ci.pcrc_32_tab);*/

            sizeHead = crypthead(password, bufHead, RAND_HEAD_LEN, zi->ci.keys, zi->ci.pcrc_32_tab, crcForCrypting);
            zi->ci.crypt_header_size = sizeHead;

            if (ZWRITE64(zi->z_filefunc, zi->filestream, bufHead, sizeHead) != sizeHead)
                err = ZIP_ERRNO;
        }
    }
#endif

    if (err == Z_OK)
        zi->in_opened_file_inzip = 1;
    return err;
}

extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char *filename, const zip_fileinfo *zipfi,
                                        const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
                                        uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits,
                                        int memLevel, int strategy, const char *password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase)
{
    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
                                   extrafield_global, size_extrafield_global, comment, method, level, raw, windowBits, memLevel,
                                   strategy, password, crcForCrypting, versionMadeBy, flagBase, 0);
}

extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char *filename, const zip_fileinfo *zipfi,
                                        const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
                                        uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits,
                                        int memLevel, int strategy, const char *password, uLong crcForCrypting)
{
    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
                                   extrafield_global, size_extrafield_global, comment, method, level, raw, windowBits, memLevel,
                                   strategy, password, crcForCrypting, VERSIONMADEBY, 0, 0);
}

extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
                                           const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
                                           uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits,
                                           int memLevel, int strategy, const char *password, uLong crcForCrypting, int zip64)
{
    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
                                   extrafield_global, size_extrafield_global, comment, method, level, raw, windowBits, memLevel, strategy,
                                   password, crcForCrypting, VERSIONMADEBY, 0, zip64);
}

extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char *filename, const zip_fileinfo *zipfi,
                                        const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
                                        uInt size_extrafield_global, const char *comment, int method, int level, int raw)
{
    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
                                   extrafield_global, size_extrafield_global, comment, method, level, raw, -MAX_WBITS, DEF_MEM_LEVEL,
                                   Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, 0);
}

extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
                                           const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
                                           uInt size_extrafield_global, const char *comment, int method, int level, int raw, int zip64)
{
    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
                                   extrafield_global, size_extrafield_global, comment, method, level, raw, -MAX_WBITS, DEF_MEM_LEVEL,
                                   Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, zip64);
}

extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
                                         const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
                                         uInt size_extrafield_global, const char *comment, int method, int level, int zip64)
{
    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
                                   extrafield_global, size_extrafield_global, comment, method, level, 0, -MAX_WBITS, DEF_MEM_LEVEL,
                                   Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, zip64);
}

extern int ZEXPORT zipOpenNewFileInZip(zipFile file, const char *filename, const zip_fileinfo *zipfi,
                                       const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,
                                       uInt size_extrafield_global, const char *comment, int method, int level)
{
    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,
                                   extrafield_global, size_extrafield_global, comment, method, level, 0, -MAX_WBITS, DEF_MEM_LEVEL,
                                   Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, 0);
}

/* Flushes the write buffer to disk */
local int zip64FlushWriteBuffer OF((zip64_internal * zi));
local int zip64FlushWriteBuffer(zip64_internal *zi)
{
    int err = ZIP_OK;
    uInt written = 0;
    uInt total_written = 0;
    uInt write = 0;
    uInt max_write = 0;
    ZPOS64_T size_available = 0;

    if ((zi->ci.flag & 1) != 0) {
#ifndef NOCRYPT
#ifdef HAVE_AES
        if (zi->ci.method == AES_METHOD) {
            fcrypt_encrypt(zi->ci.buffered_data, zi->ci.pos_in_buffered_data, &zi->ci.aes_ctx);
        } else
#endif
        {
            uInt i;
            int t;
            for (i = 0; i < zi->ci.pos_in_buffered_data; i++)
                zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i], t);
        }
#endif
    }

    write = zi->ci.pos_in_buffered_data;

    do {
        max_write = write;

        if (zi->disk_size > 0) {
            err = zipGetDiskSizeAvailable((zipFile)zi, &size_available);
            if (err != ZIP_OK)
                return err;

            if (size_available == 0) {
                err = zipGoToNextDisk((zipFile)zi);
                if (err != ZIP_OK)
                    return err;
            }

            if (size_available < (ZPOS64_T)max_write)
                max_write = (uInt)size_available;
        }

        written = (unsigned int)ZWRITE64(zi->z_filefunc, zi->filestream, zi->ci.buffered_data + total_written, max_write);

        if (ZERROR64(zi->z_filefunc, zi->filestream)) {
            err = ZIP_ERRNO;
            break;
        }

        total_written += written;
        write -= written;
    } while (write > 0);

    zi->ci.total_compressed += zi->ci.pos_in_buffered_data;

#ifdef HAVE_BZIP2
    if (zi->ci.compression_method == Z_BZIP2ED) {
        zi->ci.total_uncompressed += zi->ci.bstream.total_in_lo32;
        zi->ci.bstream.total_in_lo32 = 0;
        zi->ci.bstream.total_in_hi32 = 0;
    } else
#endif
    {
        zi->ci.total_uncompressed += zi->ci.stream.total_in;
        zi->ci.stream.total_in = 0;
    }

    zi->ci.pos_in_buffered_data = 0;

    return err;
}

extern int ZEXPORT zipWriteInFileInZip(zipFile file, const void *buf, unsigned int len)
{
    zip64_internal *zi;
    int err = ZIP_OK;

    if (file == NULL)
        return ZIP_PARAMERROR;
    zi = (zip64_internal *)file;

    if (zi->in_opened_file_inzip == 0)
        return ZIP_PARAMERROR;

    zi->ci.crc32 = crc32(zi->ci.crc32, buf, (uInt)len);

#ifdef HAVE_BZIP2
    if ((zi->ci.compression_method == Z_BZIP2ED) && (!zi->ci.raw)) {
        zi->ci.bstream.next_in = (void *)buf;
        zi->ci.bstream.avail_in = len;
        err = BZ_RUN_OK;

        while ((err == BZ_RUN_OK) && (zi->ci.bstream.avail_in > 0)) {
            if (zi->ci.bstream.avail_out == 0) {
                if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
                    err = ZIP_ERRNO;
                zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
                zi->ci.bstream.next_out = (char *)zi->ci.buffered_data;
            } else {
                uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32;
                uLong uTotalOutBefore_hi = zi->ci.bstream.total_out_hi32;

                err = BZ2_bzCompress(&zi->ci.bstream, BZ_RUN);

                zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo);
            }
        }

        if (err == BZ_RUN_OK)
            err = ZIP_OK;
    } else
#endif
    {
        zi->ci.stream.next_in = (Bytef *)buf;
        zi->ci.stream.avail_in = len;

        while ((err == ZIP_OK) && (zi->ci.stream.avail_in > 0)) {
            if (zi->ci.stream.avail_out == 0) {
                if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
                    err = ZIP_ERRNO;
                zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
                zi->ci.stream.next_out = zi->ci.buffered_data;
            }

            if (err != ZIP_OK)
                break;

            if ((zi->ci.compression_method == Z_DEFLATED) && (!zi->ci.raw)) {
                uLong total_out_before = zi->ci.stream.total_out;
                err = deflate(&zi->ci.stream, Z_NO_FLUSH);
                zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - total_out_before);
            } else {
                uInt copy_this, i;
                if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)
                    copy_this = zi->ci.stream.avail_in;
                else
                    copy_this = zi->ci.stream.avail_out;

                for (i = 0; i < copy_this; i++)
                    *(((char *)zi->ci.stream.next_out) + i) =
                        *(((const char *)zi->ci.stream.next_in) + i);

                zi->ci.stream.avail_in -= copy_this;
                zi->ci.stream.avail_out -= copy_this;
                zi->ci.stream.next_in += copy_this;
                zi->ci.stream.next_out += copy_this;
                zi->ci.stream.total_in += copy_this;
                zi->ci.stream.total_out += copy_this;
                zi->ci.pos_in_buffered_data += copy_this;
            }
        }
    }

    return err;
}

extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uLong uncompressed_size, uLong crc32)
{
    return zipCloseFileInZipRaw64(file, uncompressed_size, crc32);
}

extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, ZPOS64_T uncompressed_size, uLong crc32)
{
    zip64_internal *zi;
    ZPOS64_T compressed_size;
    uLong invalidValue = 0xffffffff;
    uLong i = 0;
    short datasize = 0;
    int err = ZIP_OK;

    if (file == NULL)
        return ZIP_PARAMERROR;
    zi = (zip64_internal *)file;

    if (zi->in_opened_file_inzip == 0)
        return ZIP_PARAMERROR;
    zi->ci.stream.avail_in = 0;

    if (!zi->ci.raw) {
        if (zi->ci.compression_method == Z_DEFLATED) {
            while (err == ZIP_OK) {
                uLong total_out_before;
                if (zi->ci.stream.avail_out == 0) {
                    if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
                        err = ZIP_ERRNO;
                    zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
                    zi->ci.stream.next_out = zi->ci.buffered_data;
                }
                total_out_before = zi->ci.stream.total_out;
                err = deflate(&zi->ci.stream, Z_FINISH);
                zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - total_out_before);
            }
        } else if (zi->ci.compression_method == Z_BZIP2ED) {
#ifdef HAVE_BZIP2
            err = BZ_FINISH_OK;
            while (err == BZ_FINISH_OK) {
                uLong total_out_before;
                if (zi->ci.bstream.avail_out == 0) {
                    if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
                        err = ZIP_ERRNO;
                    zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
                    zi->ci.bstream.next_out = (char *)zi->ci.buffered_data;
                }
                total_out_before = zi->ci.bstream.total_out_lo32;
                err = BZ2_bzCompress(&zi->ci.bstream, BZ_FINISH);
                if (err == BZ_STREAM_END)
                    err = Z_STREAM_END;
                zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - total_out_before);
            }

            if (err == BZ_FINISH_OK)
                err = ZIP_OK;
#endif
        }
    }

    if (err == Z_STREAM_END)
        err = ZIP_OK; /* this is normal */

    if ((zi->ci.pos_in_buffered_data > 0) && (err == ZIP_OK)) {
        if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
            err = ZIP_ERRNO;
    }

#ifdef HAVE_AES
    if (zi->ci.method == AES_METHOD) {
        unsigned char authcode[AES_AUTHCODESIZE];

        fcrypt_end(authcode, &zi->ci.aes_ctx);

        if (ZWRITE64(zi->z_filefunc, zi->filestream, authcode, AES_AUTHCODESIZE) != AES_AUTHCODESIZE)
            err = ZIP_ERRNO;
    }
#endif

    if (!zi->ci.raw) {
        if (zi->ci.compression_method == Z_DEFLATED) {
            int tmp_err = deflateEnd(&zi->ci.stream);
            if (err == ZIP_OK)
                err = tmp_err;
            zi->ci.stream_initialised = 0;
        }
#ifdef HAVE_BZIP2
        else if (zi->ci.compression_method == Z_BZIP2ED) {
            int tmperr = BZ2_bzCompressEnd(&zi->ci.bstream);
            if (err == ZIP_OK)
                err = tmperr;
            zi->ci.stream_initialised = 0;
        }
#endif

        crc32 = (uLong)zi->ci.crc32;
        uncompressed_size = zi->ci.total_uncompressed;
    }

    compressed_size = zi->ci.total_compressed;
#ifndef NOCRYPT
    compressed_size += zi->ci.crypt_header_size;
#endif

    /* Update current item crc and sizes */
    if (compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff) {
        zip64local_putValue_inmemory(zi->ci.central_header + 4, (uLong)45, 2); /* version made by */
        zip64local_putValue_inmemory(zi->ci.central_header + 6, (uLong)45, 2); /* version needed */
    }
    zip64local_putValue_inmemory(zi->ci.central_header + 16, crc32, 4); /* crc */
    if (compressed_size >= 0xffffffff)
        zip64local_putValue_inmemory(zi->ci.central_header + 20, invalidValue, 4); /* compr size */
    else
        zip64local_putValue_inmemory(zi->ci.central_header + 20, compressed_size, 4); /* compr size */
    if (zi->ci.stream.data_type == Z_ASCII)
        zip64local_putValue_inmemory(zi->ci.central_header + 36, (uLong)Z_ASCII, 2); /* internal file attrib */
    if (uncompressed_size >= 0xffffffff)
        zip64local_putValue_inmemory(zi->ci.central_header + 24, invalidValue, 4); /* uncompr size */
    else
        zip64local_putValue_inmemory(zi->ci.central_header + 24, uncompressed_size, 4); /* uncompr size */

    /* Add ZIP64 extra info field for uncompressed size */
    if (uncompressed_size >= 0xffffffff)
        datasize += 8;
    /* Add ZIP64 extra info field for compressed size */
    if (compressed_size >= 0xffffffff)
        datasize += 8;
    /* Add ZIP64 extra info field for relative offset to local file header of current file */
    if (zi->ci.pos_local_header >= 0xffffffff)
        datasize += 8;

    /* Add Extra Information Header for 'ZIP64 information' */
    if (datasize > 0) {
        char *p = zi->ci.central_header + zi->ci.size_centralheader;

        if ((uLong)(datasize + 4) > zi->ci.size_centralextrafree)
            return ZIP_BADZIPFILE;

        zip64local_putValue_inmemory(p, 0x0001, 2);
        p += 2;
        zip64local_putValue_inmemory(p, datasize, 2);
        p += 2;

        if (uncompressed_size >= 0xffffffff) {
            zip64local_putValue_inmemory(p, uncompressed_size, 8);
            p += 8;
        }
        if (compressed_size >= 0xffffffff) {
            zip64local_putValue_inmemory(p, compressed_size, 8);
            p += 8;
        }
        if (zi->ci.pos_local_header >= 0xffffffff) {
            zip64local_putValue_inmemory(p, zi->ci.pos_local_header, 8);
            p += 8;
        }

        zi->ci.size_centralextrafree -= datasize + 4;
        zi->ci.size_centralheader += datasize + 4;
        zi->ci.size_centralextra += datasize + 4;

        zip64local_putValue_inmemory(zi->ci.central_header + 30, (uLong)zi->ci.size_centralextra, 2);
    }

#ifdef HAVE_AES
    /* Write the AES extended info */
    if (zi->ci.method == AES_METHOD) {
        char *p = zi->ci.central_header + zi->ci.size_centralheader;

        datasize = 7;

        if ((uLong)(datasize + 4) > zi->ci.size_centralextrafree)
            return ZIP_BADZIPFILE;

        zip64local_putValue_inmemory(p, 0x9901, 2);
        p += 2;
        zip64local_putValue_inmemory(p, datasize, 2);
        p += 2;
        zip64local_putValue_inmemory(p, AES_VERSION, 2);
        p += 2;
        zip64local_putValue_inmemory(p, 'A', 1);
        p += 1;
        zip64local_putValue_inmemory(p, 'E', 1);
        p += 1;
        zip64local_putValue_inmemory(p, AES_ENCRYPTIONMODE, 1);
        p += 1;
        zip64local_putValue_inmemory(p, zi->ci.compression_method, 2);
        p += 2;

        zi->ci.size_centralextrafree -= datasize + 4;
        zi->ci.size_centralheader += datasize + 4;
        zi->ci.size_centralextra += datasize + 4;

        zip64local_putValue_inmemory(zi->ci.central_header + 30, (uLong)zi->ci.size_centralextra, 2);
    }
#endif
    /* Restore comment to correct position */
    for (i = 0; i < zi->ci.size_comment; i++)
        zi->ci.central_header[zi->ci.size_centralheader + i] =
            zi->ci.central_header[zi->ci.size_centralheader + zi->ci.size_centralextrafree + i];
    zi->ci.size_centralheader += zi->ci.size_comment;

    if (err == ZIP_OK)
        err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader);

    free(zi->ci.central_header);

    if (err == ZIP_OK) {
        /* Update the LocalFileHeader with the new values. */
        ZPOS64_T cur_pos_inzip = ZTELL64(zi->z_filefunc, zi->filestream);
        uLong cur_number_disk = zi->number_disk;

        /* Local file header is stored on previous disk, switch to make edits */
        if (zi->ci.number_disk != cur_number_disk)
            err = zipGoToSpecificDisk(file, (int)zi->ci.number_disk, 1);

        if (ZSEEK64(zi->z_filefunc, zi->filestream, zi->ci.pos_local_header + 14, ZLIB_FILEFUNC_SEEK_SET) != 0)
            err = ZIP_ERRNO;
        if (err == ZIP_OK)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, crc32, 4); /* crc 32, unknown */

        if (uncompressed_size >= 0xffffffff || compressed_size >= 0xffffffff) {
            if (zi->ci.pos_zip64extrainfo > 0) {
                /* Update the size in the ZIP64 extended field. */
                if (ZSEEK64(zi->z_filefunc, zi->filestream, zi->ci.pos_zip64extrainfo + 4, ZLIB_FILEFUNC_SEEK_SET) != 0)
                    err = ZIP_ERRNO;

                if (err == ZIP_OK) /* compressed size, unknown */
                    err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 8);
                if (err == ZIP_OK) /* uncompressed size, unknown */
                    err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 8);
            } else
                err = ZIP_BADZIPFILE; /* Caller passed zip64 = 0, so no room for zip64 info -> fatal */
        } else {
            if (err == ZIP_OK) /* compressed size, unknown */
                err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 4);
            if (err == ZIP_OK) /* uncompressed size, unknown */
                err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 4);
        }

        /* Now switch back again to the disk we were on before */
        if (zi->ci.number_disk != cur_number_disk)
            err = zipGoToSpecificDisk(file, (int)cur_number_disk, 1);

        if (ZSEEK64(zi->z_filefunc, zi->filestream, cur_pos_inzip, ZLIB_FILEFUNC_SEEK_SET) != 0)
            err = ZIP_ERRNO;
    }

    zi->number_entry++;
    zi->in_opened_file_inzip = 0;

    return err;
}

extern int ZEXPORT zipCloseFileInZip(zipFile file)
{
    return zipCloseFileInZipRaw(file, 0, 0);
}

extern int ZEXPORT zipClose(zipFile file, const char *global_comment)
{
    zip64_internal *zi;
    int err = 0;
    uLong size_centraldir = 0;
    uInt size_global_comment = 0;
    ZPOS64_T centraldir_pos_inzip;
    ZPOS64_T pos = 0;
    uLong write = 0;

    if (file == NULL)
        return ZIP_PARAMERROR;

    zi = (zip64_internal *)file;

    if (zi->in_opened_file_inzip == 1)
        err = zipCloseFileInZip(file);

#ifndef NO_ADDFILEINEXISTINGZIP
    if (global_comment == NULL)
        global_comment = zi->globalcomment;
#endif

    if (zi->filestream != zi->filestream_with_CD) {
        if (ZCLOSE64(zi->z_filefunc, zi->filestream) != 0)
            if (err == ZIP_OK)
                err = ZIP_ERRNO;
        if (zi->disk_size > 0)
            zi->number_disk_with_CD = zi->number_disk + 1;
        zi->filestream = zi->filestream_with_CD;
    }

    centraldir_pos_inzip = ZTELL64(zi->z_filefunc, zi->filestream);

    if (err == ZIP_OK) {
        linkedlist_datablock_internal *ldi = zi->central_dir.first_block;
        while (ldi != NULL) {
            if ((err == ZIP_OK) && (ldi->filled_in_this_block > 0)) {
                write = ZWRITE64(zi->z_filefunc, zi->filestream, ldi->data, ldi->filled_in_this_block);
                if (write != ldi->filled_in_this_block)
                    err = ZIP_ERRNO;
            }

            size_centraldir += ldi->filled_in_this_block;
            ldi = ldi->next_datablock;
        }
    }

    free_linkedlist(&(zi->central_dir));

    pos = centraldir_pos_inzip - zi->add_position_when_writting_offset;

    /* Write the ZIP64 central directory header */
    if (pos >= 0xffffffff || zi->number_entry > 0xffff) {
        ZPOS64_T zip64eocd_pos_inzip = ZTELL64(zi->z_filefunc, zi->filestream);
        uLong zip64datasize = 44;

        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)ZIP64ENDHEADERMAGIC, 4);

        /* size of this 'zip64 end of central directory' */
        if (err == ZIP_OK)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)zip64datasize, 8);
        /* version made by */
        if (err == ZIP_OK)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)45, 2);
        /* version needed */
        if (err == ZIP_OK)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)45, 2);
        /* number of this disk */
        if (err == ZIP_OK)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 4);
        /* number of the disk with the start of the central directory */
        if (err == ZIP_OK)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 4);
        /* total number of entries in the central dir on this disk */
        if (err == ZIP_OK)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8);
        /* total number of entries in the central dir */
        if (err == ZIP_OK)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8);
        /* size of the central directory */
        if (err == ZIP_OK)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)size_centraldir, 8);

        if (err == ZIP_OK) {
            /* offset of start of central directory with respect to the starting disk number */
            ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset;
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)pos, 8);
        }
        if (err == ZIP_OK)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)ZIP64ENDLOCHEADERMAGIC, 4);

        /* number of the disk with the start of the central directory */
        if (err == ZIP_OK)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 4);
        /*relative offset to the Zip64EndOfCentralDirectory */
        if (err == ZIP_OK) {
            ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writting_offset;
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, pos, 8);
        }
        /* number of the disk with the start of the central directory */
        if (err == ZIP_OK)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD + 1, 4);
    }

    /* Write the central directory header */

    /* signature */
    if (err == ZIP_OK)
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)ENDHEADERMAGIC, 4);
    /* number of this disk */
    if (err == ZIP_OK)
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 2);
    /* number of the disk with the start of the central directory */
    if (err == ZIP_OK)
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 2);
    /* total number of entries in the central dir on this disk */
    if (err == ZIP_OK) {
        if (zi->number_entry >= 0xffff)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xffff, 2); /* use value in ZIP64 record */
        else
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_entry, 2);
    }
    /* total number of entries in the central dir */
    if (err == ZIP_OK) {
        if (zi->number_entry >= 0xffff)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xffff, 2); /* use value in ZIP64 record */
        else
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_entry, 2);
    }
    /* size of the central directory */
    if (err == ZIP_OK)
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_centraldir, 4);
    /* offset of start of central directory with respect to the starting disk number */
    if (err == ZIP_OK) {
        ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset;
        if (pos >= 0xffffffff)
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xffffffff, 4);
        else
            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)pos, 4);
    }

    /* Write global comment */

    if (global_comment != NULL)
        size_global_comment = (uInt)strlen(global_comment);
    if (err == ZIP_OK)
        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_global_comment, 2);
    if (err == ZIP_OK && size_global_comment > 0) {
        if (ZWRITE64(zi->z_filefunc, zi->filestream, global_comment, size_global_comment) != size_global_comment)
            err = ZIP_ERRNO;
    }

    if ((ZCLOSE64(zi->z_filefunc, zi->filestream) != 0) && (err == ZIP_OK))
        err = ZIP_ERRNO;

#ifndef NO_ADDFILEINEXISTINGZIP
    TRYFREE(zi->globalcomment);
#endif
    TRYFREE(zi);

    return err;
}

/* zip.h -- IO on .zip files using zlib
   Version 1.1, February 14h, 2010
   part of the MiniZip project

   Copyright (C) 1998-2010 Gilles Vollant
     http://www.winimage.com/zLibDll/minizip.html
   Modifications for Zip64 support
     Copyright (C) 2009-2010 Mathias Svensson
     http://result42.com

   This program is distributed under the terms of the same license as zlib.
   See the accompanying LICENSE file for the full text of the license.
*/

#ifndef _ZIP_H
#define _ZIP_H

#define HAVE_AES

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _ZLIB_H
#  include "zlib.h"
#endif

#ifndef _ZLIBIOAPI_H
#  include "ioapi.h"
#endif

#ifdef HAVE_BZIP2
#  include "bzlib.h"
#endif

#define Z_BZIP2ED 12

#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
/* like the STRICT of WIN32, we define a pointer that cannot be converted
    from (void*) without cast */
typedef struct TagzipFile__ { int unused; } zipFile__;
typedef zipFile__ *zipFile;
#else
typedef voidp zipFile;
#endif

#define ZIP_OK                          (0)
#define ZIP_EOF                         (0)
#define ZIP_ERRNO                       (Z_ERRNO)
#define ZIP_PARAMERROR                  (-102)
#define ZIP_BADZIPFILE                  (-103)
#define ZIP_INTERNALERROR               (-104)

#ifndef DEF_MEM_LEVEL
#  if MAX_MEM_LEVEL >= 8
#    define DEF_MEM_LEVEL 8
#  else
#    define DEF_MEM_LEVEL  MAX_MEM_LEVEL
#  endif
#endif
/* default memLevel */

/* tm_zip contain date/time info */
typedef struct tm_zip_s
{
    uInt tm_sec;                /* seconds after the minute - [0,59] */
    uInt tm_min;                /* minutes after the hour - [0,59] */
    uInt tm_hour;               /* hours since midnight - [0,23] */
    uInt tm_mday;               /* day of the month - [1,31] */
    uInt tm_mon;                /* months since January - [0,11] */
    uInt tm_year;               /* years - [1980..2044] */
} tm_zip;

typedef struct
{
    tm_zip      tmz_date;       /* date in understandable format           */
    uLong       dosDate;        /* if dos_date == 0, tmu_date is used      */
    uLong       internal_fa;    /* internal file attributes        2 bytes */
    uLong       external_fa;    /* external file attributes        4 bytes */
} zip_fileinfo;

typedef const char* zipcharpc;

#define APPEND_STATUS_CREATE        (0)
#define APPEND_STATUS_CREATEAFTER   (1)
#define APPEND_STATUS_ADDINZIP      (2)

/***************************************************************************/
/* Writing a zip file */

extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));
extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append));
/* Create a zipfile.

   pathname should contain the full pathname (by example, on a Windows XP computer 
      "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip". 

   return NULL if zipfile cannot be opened
   return zipFile handle if no error

   If the file pathname exist and append == APPEND_STATUS_CREATEAFTER, the zip
   will be created at the end of the file. (useful if the file contain a self extractor code)
   If the file pathname exist and append == APPEND_STATUS_ADDINZIP, we will add files in existing 
   zip (be sure you don't add file that doesn't exist)

   NOTE: There is no delete function into a zipfile. If you want delete file into a zipfile, 
   you must open a zipfile, and create another. Of course, you can use RAW reading and writing to copy
   the file you did not want delete. */

extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, int append, zipcharpc* globalcomment, 
    zlib_filefunc_def* pzlib_filefunc_def));

extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, int append, zipcharpc* globalcomment, 
    zlib_filefunc64_def* pzlib_filefunc_def));

extern zipFile ZEXPORT zipOpen3 OF((const char *pathname, int append, ZPOS64_T disk_size, 
    zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc_def));
/* Same as zipOpen2 but allows specification of spanned zip size */

extern zipFile ZEXPORT zipOpen3_64 OF((const void *pathname, int append, ZPOS64_T disk_size, 
    zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def));

extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, 
    uInt size_extrafield_global, const char* comment, int method, int level));
/* Open a file in the ZIP for writing.

   filename : the filename in zip (if NULL, '-' without quote will be used
   *zipfi contain supplemental information
   extrafield_local buffer to store the local header extra field data, can be NULL
   size_extrafield_local size of extrafield_local buffer
   extrafield_global buffer to store the global header extra field data, can be NULL
   size_extrafield_global size of extrafield_local buffer
   comment buffer for comment string
   method contain the compression method (0 for store, Z_DEFLATED for deflate)
   level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
   zip64 is set to 1 if a zip64 extended information block should be added to the local file header.
   this MUST be '1' if the uncompressed size is >= 0xffffffff. */

extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, 
    uInt size_extrafield_global, const char* comment, int method, int level, int zip64));
/* Same as zipOpenNewFileInZip with zip64 support */

extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, 
    uInt size_extrafield_global, const char* comment, int method, int level, int raw));
/* Same as zipOpenNewFileInZip, except if raw=1, we write raw file */

extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, 
    uInt size_extrafield_global, const char* comment, int method, int level, int raw, int zip64));
/* Same as zipOpenNewFileInZip3 with zip64 support */

extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, 
    uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, 
    int strategy, const char* password, uLong crcForCrypting));
/* Same as zipOpenNewFileInZip2, except
    windowBits, memLevel, strategy : see parameter strategy in deflateInit2
    password : crypting password (NULL for no crypting)
    crcForCrypting : crc of file to compress (needed for crypting) */

extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, 
    uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, 
    int strategy, const char* password, uLong crcForCrypting, int zip64));
/* Same as zipOpenNewFileInZip3 with zip64 support */

extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, 
    uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, 
    int strategy, const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase));
/* Same as zipOpenNewFileInZip3 except versionMadeBy & flag fields */

extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,
    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, 
    uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, 
    int strategy, const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase, int zip64));
/* Same as zipOpenNewFileInZip4 with zip64 support */

extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, const void* buf, unsigned len));
/* Write data in the zipfile */

extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
/* Close the current file in the zipfile */

extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, uLong uncompressed_size, uLong crc32));
extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, ZPOS64_T uncompressed_size, uLong crc32));
/* Close the current file in the zipfile, for file opened with parameter raw=1 in zipOpenNewFileInZip2
   uncompressed_size and crc32 are value for the uncompressed size */

extern int ZEXPORT zipClose OF((zipFile file, const char* global_comment));
/* Close the zipfile */

/***************************************************************************/

#ifdef __cplusplus
}
#endif

#endif /* _ZIP_H */
/*
---------------------------------------------------------------------------
Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.

The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:

  source code distributions include the above copyright notice, this
  list of conditions and the following disclaimer;

  binary distributions include the above copyright notice, this list
  of conditions and the following disclaimer in their documentation.

This software is provided 'as is' with no explicit or implied warranties
in respect of its operation, including, but not limited to, correctness
and fitness for purpose.
---------------------------------------------------------------------------
Issue Date: 20/12/2007

 This file contains the definitions required to use AES in C. See aesopt.h
 for optimisation details.
*/

#ifndef _AES_H
#define _AES_H

#include <stdlib.h>

/*  This include is used to find 8 & 32 bit unsigned integer types  */
#include "brg_types.h"

#if defined(__cplusplus)
extern "C"
{
#endif

#define AES_128     /* if a fast 128 bit key scheduler is needed    */
#define AES_192     /* if a fast 192 bit key scheduler is needed    */
#define AES_256     /* if a fast 256 bit key scheduler is needed    */
#define AES_VAR     /* if variable key size scheduler is needed     */
#define AES_MODES   /* if support is needed for modes               */

/* The following must also be set in assembler files if being used  */

#define AES_ENCRYPT /* if support for encryption is needed          */
#define AES_DECRYPT /* if support for decryption is needed          */
#define AES_REV_DKS /* define to reverse decryption key schedule    */

#define AES_BLOCK_SIZE  16  /* the AES block size in bytes          */
#define N_COLS           4  /* the number of columns in the state   */

/* The key schedule length is 11, 13 or 15 16-byte blocks for 128,  */
/* 192 or 256-bit keys respectively. That is 176, 208 or 240 bytes  */
/* or 44, 52 or 60 32-bit words.                                    */

#if defined( AES_VAR ) || defined( AES_256 )
#define KS_LENGTH       60
#elif defined( AES_192 )
#define KS_LENGTH       52
#else
#define KS_LENGTH       44
#endif

#define AES_RETURN INT_RETURN

/* the character array 'inf' in the following structures is used    */
/* to hold AES context information. This AES code uses cx->inf.b[0] */
/* to hold the number of rounds multiplied by 16. The other three   */
/* elements can be used by code that implements additional modes    */

typedef union
{   uint_32t l;
    uint_8t b[4];
} aes_inf;

typedef struct
{   uint_32t ks[KS_LENGTH];
    aes_inf inf;
} aes_encrypt_ctx;

typedef struct
{   uint_32t ks[KS_LENGTH];
    aes_inf inf;
} aes_decrypt_ctx;

/* This routine must be called before first use if non-static       */
/* tables are being used                                            */

AES_RETURN aes_init(void);

/* Key lengths in the range 16 <= key_len <= 32 are given in bytes, */
/* those in the range 128 <= key_len <= 256 are given in bits       */

#if defined( AES_ENCRYPT )

#if defined( AES_128 ) || defined( AES_VAR)
AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]);
#endif

#if defined( AES_192 ) || defined( AES_VAR)
AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]);
#endif

#if defined( AES_256 ) || defined( AES_VAR)
AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]);
#endif

#if defined( AES_VAR )
AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1]);
#endif

AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1]);

#endif

#if defined( AES_DECRYPT )

#if defined( AES_128 ) || defined( AES_VAR)
AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]);
#endif

#if defined( AES_192 ) || defined( AES_VAR)
AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]);
#endif

#if defined( AES_256 ) || defined( AES_VAR)
AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]);
#endif

#if defined( AES_VAR )
AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1]);
#endif

AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, const aes_decrypt_ctx cx[1]);

#endif

#if defined( AES_MODES )

/* Multiple calls to the following subroutines for multiple block   */
/* ECB, CBC, CFB, OFB and CTR mode encryption can be used to handle */
/* long messages incremantally provided that the context AND the iv */
/* are preserved between all such calls.  For the ECB and CBC modes */
/* each individual call within a series of incremental calls must   */
/* process only full blocks (i.e. len must be a multiple of 16) but */
/* the CFB, OFB and CTR mode calls can handle multiple incremental  */
/* calls of any length. Each mode is reset when a new AES key is    */
/* set but ECB and CBC operations can be reset without setting a    */
/* new key by setting a new IV value.  To reset CFB, OFB and CTR    */
/* without setting the key, aes_mode_reset() must be called and the */
/* IV must be set.  NOTE: All these calls update the IV on exit so  */
/* this has to be reset if a new operation with the same IV as the  */
/* previous one is required (or decryption follows encryption with  */
/* the same IV array).                                              */

AES_RETURN aes_test_alignment_detection(unsigned int n);

AES_RETURN aes_ecb_encrypt(const unsigned char *ibuf, unsigned char *obuf,
                    int len, const aes_encrypt_ctx cx[1]);

AES_RETURN aes_ecb_decrypt(const unsigned char *ibuf, unsigned char *obuf,
                    int len, const aes_decrypt_ctx cx[1]);

AES_RETURN aes_cbc_encrypt(const unsigned char *ibuf, unsigned char *obuf,
                    int len, unsigned char *iv, const aes_encrypt_ctx cx[1]);

AES_RETURN aes_cbc_decrypt(const unsigned char *ibuf, unsigned char *obuf,
                    int len, unsigned char *iv, const aes_decrypt_ctx cx[1]);

AES_RETURN aes_mode_reset(aes_encrypt_ctx cx[1]);

AES_RETURN aes_cfb_encrypt(const unsigned char *ibuf, unsigned char *obuf,
                    int len, unsigned char *iv, aes_encrypt_ctx cx[1]);

AES_RETURN aes_cfb_decrypt(const unsigned char *ibuf, unsigned char *obuf,
                    int len, unsigned char *iv, aes_encrypt_ctx cx[1]);

#define aes_ofb_encrypt aes_ofb_crypt
#define aes_ofb_decrypt aes_ofb_crypt

AES_RETURN aes_ofb_crypt(const unsigned char *ibuf, unsigned char *obuf,
                    int len, unsigned char *iv, aes_encrypt_ctx cx[1]);

typedef void cbuf_inc(unsigned char *cbuf);

#define aes_ctr_encrypt aes_ctr_crypt
#define aes_ctr_decrypt aes_ctr_crypt

AES_RETURN aes_ctr_crypt(const unsigned char *ibuf, unsigned char *obuf,
            int len, unsigned char *cbuf, cbuf_inc ctr_inc, aes_encrypt_ctx cx[1]);

#endif

#if defined(__cplusplus)
}
#endif

#endif
/*
Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.

The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:

  source code distributions include the above copyright notice, this
  list of conditions and the following disclaimer;

  binary distributions include the above copyright notice, this list
  of conditions and the following disclaimer in their documentation.

This software is provided 'as is' with no explicit or implied warranties
in respect of its operation, including, but not limited to, correctness
and fitness for purpose.
---------------------------------------------------------------------------
Issue Date: 20/12/2007
*/

#ifndef AES_VIA_ACE_H
#define AES_VIA_ACE_H

#if defined( _MSC_VER )
#  define INLINE  __inline
#elif defined( __GNUC__ )
#  define INLINE  static inline
#else
#  error VIA ACE requires Microsoft or GNU C
#endif

#define NEH_GENERATE    1
#define NEH_LOAD        2
#define NEH_HYBRID      3

#define MAX_READ_ATTEMPTS   1000

/* VIA Nehemiah RNG and ACE Feature Mask Values */

#define NEH_CPU_IS_VIA      0x00000001
#define NEH_CPU_READ        0x00000010
#define NEH_CPU_MASK        0x00000011

#define NEH_RNG_PRESENT     0x00000004
#define NEH_RNG_ENABLED     0x00000008
#define NEH_ACE_PRESENT     0x00000040
#define NEH_ACE_ENABLED     0x00000080
#define NEH_RNG_FLAGS       (NEH_RNG_PRESENT | NEH_RNG_ENABLED)
#define NEH_ACE_FLAGS       (NEH_ACE_PRESENT | NEH_ACE_ENABLED)
#define NEH_FLAGS_MASK      (NEH_RNG_FLAGS | NEH_ACE_FLAGS)

/* VIA Nehemiah Advanced Cryptography Engine (ACE) Control Word Values  */

#define NEH_GEN_KEY     0x00000000      /* generate key schedule        */
#define NEH_LOAD_KEY    0x00000080      /* load schedule from memory    */
#define NEH_ENCRYPT     0x00000000      /* encryption                   */
#define NEH_DECRYPT     0x00000200      /* decryption                   */
#define NEH_KEY128      0x00000000+0x0a /* 128 bit key                  */
#define NEH_KEY192      0x00000400+0x0c /* 192 bit key                  */
#define NEH_KEY256      0x00000800+0x0e /* 256 bit key                  */

#define NEH_ENC_GEN     (NEH_ENCRYPT | NEH_GEN_KEY)
#define NEH_DEC_GEN     (NEH_DECRYPT | NEH_GEN_KEY)
#define NEH_ENC_LOAD    (NEH_ENCRYPT | NEH_LOAD_KEY)
#define NEH_DEC_LOAD    (NEH_DECRYPT | NEH_LOAD_KEY)

#define NEH_ENC_GEN_DATA {\
    NEH_ENC_GEN | NEH_KEY128, 0, 0, 0,\
    NEH_ENC_GEN | NEH_KEY192, 0, 0, 0,\
    NEH_ENC_GEN | NEH_KEY256, 0, 0, 0 }

#define NEH_ENC_LOAD_DATA {\
    NEH_ENC_LOAD | NEH_KEY128, 0, 0, 0,\
    NEH_ENC_LOAD | NEH_KEY192, 0, 0, 0,\
    NEH_ENC_LOAD | NEH_KEY256, 0, 0, 0 }

#define NEH_ENC_HYBRID_DATA {\
    NEH_ENC_GEN  | NEH_KEY128, 0, 0, 0,\
    NEH_ENC_LOAD | NEH_KEY192, 0, 0, 0,\
    NEH_ENC_LOAD | NEH_KEY256, 0, 0, 0 }

#define NEH_DEC_GEN_DATA {\
    NEH_DEC_GEN | NEH_KEY128, 0, 0, 0,\
    NEH_DEC_GEN | NEH_KEY192, 0, 0, 0,\
    NEH_DEC_GEN | NEH_KEY256, 0, 0, 0 }

#define NEH_DEC_LOAD_DATA {\
    NEH_DEC_LOAD | NEH_KEY128, 0, 0, 0,\
    NEH_DEC_LOAD | NEH_KEY192, 0, 0, 0,\
    NEH_DEC_LOAD | NEH_KEY256, 0, 0, 0 }

#define NEH_DEC_HYBRID_DATA {\
    NEH_DEC_GEN  | NEH_KEY128, 0, 0, 0,\
    NEH_DEC_LOAD | NEH_KEY192, 0, 0, 0,\
    NEH_DEC_LOAD | NEH_KEY256, 0, 0, 0 }

#define neh_enc_gen_key(x)  ((x) == 128 ? (NEH_ENC_GEN | NEH_KEY128) :      \
     (x) == 192 ? (NEH_ENC_GEN | NEH_KEY192) : (NEH_ENC_GEN | NEH_KEY256))

#define neh_enc_load_key(x) ((x) == 128 ? (NEH_ENC_LOAD | NEH_KEY128) :     \
     (x) == 192 ? (NEH_ENC_LOAD | NEH_KEY192) : (NEH_ENC_LOAD | NEH_KEY256))

#define neh_enc_hybrid_key(x)   ((x) == 128 ? (NEH_ENC_GEN | NEH_KEY128) :  \
     (x) == 192 ? (NEH_ENC_LOAD | NEH_KEY192) : (NEH_ENC_LOAD | NEH_KEY256))

#define neh_dec_gen_key(x)  ((x) == 128 ? (NEH_DEC_GEN | NEH_KEY128) :      \
     (x) == 192 ? (NEH_DEC_GEN | NEH_KEY192) : (NEH_DEC_GEN | NEH_KEY256))

#define neh_dec_load_key(x) ((x) == 128 ? (NEH_DEC_LOAD | NEH_KEY128) :     \
     (x) == 192 ? (NEH_DEC_LOAD | NEH_KEY192) : (NEH_DEC_LOAD | NEH_KEY256))

#define neh_dec_hybrid_key(x)   ((x) == 128 ? (NEH_DEC_GEN | NEH_KEY128) :  \
     (x) == 192 ? (NEH_DEC_LOAD | NEH_KEY192) : (NEH_DEC_LOAD | NEH_KEY256))

#if defined( _MSC_VER ) && ( _MSC_VER > 1200 )
#define aligned_auto(type, name, no, stride)  __declspec(align(stride)) type name[no]
#else
#define aligned_auto(type, name, no, stride)                \
    unsigned char _##name[no * sizeof(type) + stride];      \
    type *name = (type*)(16 * ((((unsigned long)(_##name)) + stride - 1) / stride))
#endif

#if defined( _MSC_VER ) && ( _MSC_VER > 1200 )
#define aligned_array(type, name, no, stride) __declspec(align(stride)) type name[no]
#elif defined( __GNUC__ )
#define aligned_array(type, name, no, stride) type name[no] __attribute__ ((aligned(stride)))
#else
#define aligned_array(type, name, no, stride) type name[no]
#endif

/* VIA ACE codeword     */

static unsigned char via_flags = 0;

#if defined ( _MSC_VER ) && ( _MSC_VER > 800 )

#define NEH_REKEY   __asm pushfd __asm popfd
#define NEH_AES     __asm _emit 0xf3 __asm _emit 0x0f __asm _emit 0xa7
#define NEH_ECB     NEH_AES __asm _emit 0xc8
#define NEH_CBC     NEH_AES __asm _emit 0xd0
#define NEH_CFB     NEH_AES __asm _emit 0xe0
#define NEH_OFB     NEH_AES __asm _emit 0xe8
#define NEH_RNG     __asm _emit 0x0f __asm _emit 0xa7 __asm _emit 0xc0

INLINE int has_cpuid(void)
{   char ret_value;
    __asm
    {   pushfd                  /* save EFLAGS register     */
        mov     eax,[esp]       /* copy it to eax           */
        mov     edx,0x00200000  /* CPUID bit position       */
        xor     eax,edx         /* toggle the CPUID bit     */
        push    eax             /* attempt to set EFLAGS to */
        popfd                   /*     the new value        */
        pushfd                  /* get the new EFLAGS value */
        pop     eax             /*     into eax             */
        xor     eax,[esp]       /* xor with original value  */
        and     eax,edx         /* has CPUID bit changed?   */
        setne   al              /* set to 1 if we have been */
        mov     ret_value,al    /*     able to change it    */
        popfd                   /* restore original EFLAGS  */
    }
    return (int)ret_value;
}

INLINE int is_via_cpu(void)
{   char ret_value;
    __asm
    {   push    ebx
        xor     eax,eax         /* use CPUID to get vendor  */
        cpuid                   /* identity string          */
        xor     eax,eax         /* is it "CentaurHauls" ?   */
        sub     ebx,0x746e6543  /* 'Cent'                   */
        or      eax,ebx
        sub     edx,0x48727561  /* 'aurH'                   */
        or      eax,edx
        sub     ecx,0x736c7561  /* 'auls'                   */
        or      eax,ecx
        sete    al              /* set to 1 if it is VIA ID */
        mov     dl,NEH_CPU_READ /* mark CPU type as read    */
        or      dl,al           /* & store result in flags  */
        mov     [via_flags],dl  /* set VIA detected flag    */
        mov     ret_value,al    /*     able to change it    */
        pop     ebx
    }
    return (int)ret_value;
}

INLINE int read_via_flags(void)
{   char ret_value = 0;
    __asm
    {   mov     eax,0xC0000000  /* Centaur extended CPUID   */
        cpuid
        mov     edx,0xc0000001  /* >= 0xc0000001 if support */
        cmp     eax,edx         /* for VIA extended feature */
        jnae    no_rng          /*     flags is available   */
        mov     eax,edx         /* read Centaur extended    */
        cpuid                   /*     feature flags        */
        mov     eax,NEH_FLAGS_MASK  /* mask out and save    */
        and     eax,edx         /*  the RNG and ACE flags   */
        or      [via_flags],al  /* present & enabled flags  */
        mov     ret_value,al    /*     able to change it    */
no_rng:
    }
    return (int)ret_value;
}

INLINE unsigned int via_rng_in(void *buf)
{   char ret_value = 0x1f;
    __asm
    {   push    edi
        mov     edi,buf         /* input buffer address     */
        xor     edx,edx         /* try to fetch 8 bytes     */
        NEH_RNG                 /* do RNG read operation    */
        and     ret_value,al    /* count of bytes returned  */
        pop     edi
    }
    return (int)ret_value;
}

INLINE void via_ecb_op5(
            const void *k, const void *c, const void *s, void *d, int l)
{   __asm
    {   push    ebx
        NEH_REKEY
        mov     ebx, (k)
        mov     edx, (c)
        mov     esi, (s)
        mov     edi, (d)
        mov     ecx, (l)
        NEH_ECB
        pop     ebx
    }
}

INLINE void via_cbc_op6(
            const void *k, const void *c, const void *s, void *d, int l, void *v)
{   __asm
    {   push    ebx
        NEH_REKEY
        mov     ebx, (k)
        mov     edx, (c)
        mov     esi, (s)
        mov     edi, (d)
        mov     ecx, (l)
        mov     eax, (v)
        NEH_CBC
        pop     ebx
    }
}

INLINE void via_cbc_op7(
        const void *k, const void *c, const void *s, void *d, int l, void *v, void *w)
{   __asm
    {   push    ebx
        NEH_REKEY
        mov     ebx, (k)
        mov     edx, (c)
        mov     esi, (s)
        mov     edi, (d)
        mov     ecx, (l)
        mov     eax, (v)
        NEH_CBC
        mov     esi, eax
        mov     edi, (w)
        movsd
        movsd
        movsd
        movsd
        pop     ebx
    }
}

INLINE void via_cfb_op6(
            const void *k, const void *c, const void *s, void *d, int l, void *v)
{   __asm
    {   push    ebx
        NEH_REKEY
        mov     ebx, (k)
        mov     edx, (c)
        mov     esi, (s)
        mov     edi, (d)
        mov     ecx, (l)
        mov     eax, (v)
        NEH_CFB
        pop     ebx
    }
}

INLINE void via_cfb_op7(
        const void *k, const void *c, const void *s, void *d, int l, void *v, void *w)
{   __asm
    {   push    ebx
        NEH_REKEY
        mov     ebx, (k)
        mov     edx, (c)
        mov     esi, (s)
        mov     edi, (d)
        mov     ecx, (l)
        mov     eax, (v)
        NEH_CFB
        mov     esi, eax
        mov     edi, (w)
        movsd
        movsd
        movsd
        movsd
        pop     ebx
    }
}

INLINE void via_ofb_op6(
            const void *k, const void *c, const void *s, void *d, int l, void *v)
{   __asm
    {   push    ebx
        NEH_REKEY
        mov     ebx, (k)
        mov     edx, (c)
        mov     esi, (s)
        mov     edi, (d)
        mov     ecx, (l)
        mov     eax, (v)
        NEH_OFB
        pop     ebx
    }
}

#elif defined( __GNUC__ )

#define NEH_REKEY   asm("pushfl\n popfl\n\t")
#define NEH_ECB     asm(".byte 0xf3, 0x0f, 0xa7, 0xc8\n\t")
#define NEH_CBC     asm(".byte 0xf3, 0x0f, 0xa7, 0xd0\n\t")
#define NEH_CFB     asm(".byte 0xf3, 0x0f, 0xa7, 0xe0\n\t")
#define NEH_OFB     asm(".byte 0xf3, 0x0f, 0xa7, 0xe8\n\t")
#define NEH_RNG     asm(".byte 0x0f, 0xa7, 0xc0\n\t");

INLINE int has_cpuid(void)
{   int val;
    asm("pushfl\n\t");
    asm("movl  0(%esp),%eax\n\t");
    asm("xor   $0x00200000,%eax\n\t");
    asm("pushl %eax\n\t");
    asm("popfl\n\t");
    asm("pushfl\n\t");
    asm("popl  %eax\n\t");
    asm("xorl  0(%esp),%edx\n\t");
    asm("andl  $0x00200000,%eax\n\t");
    asm("movl  %%eax,%0\n\t" : "=m" (val));
    asm("popfl\n\t");
    return val ? 1 : 0;
}

INLINE int is_via_cpu(void)
{   int val;
    asm("pushl %ebx\n\t");
    asm("xorl %eax,%eax\n\t");
    asm("cpuid\n\t");
    asm("xorl %eax,%eax\n\t");
    asm("subl $0x746e6543,%ebx\n\t");
    asm("orl  %ebx,%eax\n\t");
    asm("subl $0x48727561,%edx\n\t");
    asm("orl  %edx,%eax\n\t");
    asm("subl $0x736c7561,%ecx\n\t");
    asm("orl  %ecx,%eax\n\t");
    asm("movl %%eax,%0\n\t" : "=m" (val));
    asm("popl %ebx\n\t");
    val = (val ? 0 : 1);
    via_flags = (val | NEH_CPU_READ);
    return val;
}

INLINE int read_via_flags(void)
{   unsigned char   val;
    asm("movl $0xc0000000,%eax\n\t");
    asm("cpuid\n\t");
    asm("movl $0xc0000001,%edx\n\t");
    asm("cmpl %edx,%eax\n\t");
    asm("setae %al\n\t");
    asm("movb %%al,%0\n\t" : "=m" (val));
    if(!val) return 0;
    asm("movl $0xc0000001,%eax\n\t");
    asm("cpuid\n\t");
    asm("movb %%dl,%0\n\t" : "=m" (val));
    val &= NEH_FLAGS_MASK;
    via_flags |= val;
    return (int) val;
}

INLINE int via_rng_in(void *buf)
{   int val;
    asm("pushl %edi\n\t");
    asm("movl %0,%%edi\n\t" : : "m" (buf));
    asm("xorl %edx,%edx\n\t");
    NEH_RNG
    asm("andl $0x0000001f,%eax\n\t");
    asm("movl %%eax,%0\n\t" : "=m" (val));
    asm("popl %edi\n\t");
    return val;
}

INLINE volatile  void via_ecb_op5(
            const void *k, const void *c, const void *s, void *d, int l)
{
    asm("pushl %ebx\n\t");
    NEH_REKEY;
    asm("movl %0, %%ebx\n\t" : : "m" (k));
    asm("movl %0, %%edx\n\t" : : "m" (c));
    asm("movl %0, %%esi\n\t" : : "m" (s));
    asm("movl %0, %%edi\n\t" : : "m" (d));
    asm("movl %0, %%ecx\n\t" : : "m" (l));
    NEH_ECB;
    asm("popl %ebx\n\t");
}

INLINE volatile  void via_cbc_op6(
            const void *k, const void *c, const void *s, void *d, int l, void *v)
{
    asm("pushl %ebx\n\t");
    NEH_REKEY;
    asm("movl %0, %%ebx\n\t" : : "m" (k));
    asm("movl %0, %%edx\n\t" : : "m" (c));
    asm("movl %0, %%esi\n\t" : : "m" (s));
    asm("movl %0, %%edi\n\t" : : "m" (d));
    asm("movl %0, %%ecx\n\t" : : "m" (l));
    asm("movl %0, %%eax\n\t" : : "m" (v));
    NEH_CBC;
    asm("popl %ebx\n\t");
}

INLINE volatile  void via_cbc_op7(
        const void *k, const void *c, const void *s, void *d, int l, void *v, void *w)
{
    asm("pushl %ebx\n\t");
    NEH_REKEY;
    asm("movl %0, %%ebx\n\t" : : "m" (k));
    asm("movl %0, %%edx\n\t" : : "m" (c));
    asm("movl %0, %%esi\n\t" : : "m" (s));
    asm("movl %0, %%edi\n\t" : : "m" (d));
    asm("movl %0, %%ecx\n\t" : : "m" (l));
    asm("movl %0, %%eax\n\t" : : "m" (v));
    NEH_CBC;
    asm("movl %eax,%esi\n\t");
    asm("movl %0, %%edi\n\t" : : "m" (w));
    asm("movsl; movsl; movsl; movsl\n\t");
    asm("popl %ebx\n\t");
}

INLINE volatile  void via_cfb_op6(
            const void *k, const void *c, const void *s, void *d, int l, void *v)
{
    asm("pushl %ebx\n\t");
    NEH_REKEY;
    asm("movl %0, %%ebx\n\t" : : "m" (k));
    asm("movl %0, %%edx\n\t" : : "m" (c));
    asm("movl %0, %%esi\n\t" : : "m" (s));
    asm("movl %0, %%edi\n\t" : : "m" (d));
    asm("movl %0, %%ecx\n\t" : : "m" (l));
    asm("movl %0, %%eax\n\t" : : "m" (v));
    NEH_CFB;
    asm("popl %ebx\n\t");
}

INLINE volatile  void via_cfb_op7(
        const void *k, const void *c, const void *s, void *d, int l, void *v, void *w)
{
    asm("pushl %ebx\n\t");
    NEH_REKEY;
    asm("movl %0, %%ebx\n\t" : : "m" (k));
    asm("movl %0, %%edx\n\t" : : "m" (c));
    asm("movl %0, %%esi\n\t" : : "m" (s));
    asm("movl %0, %%edi\n\t" : : "m" (d));
    asm("movl %0, %%ecx\n\t" : : "m" (l));
    asm("movl %0, %%eax\n\t" : : "m" (v));
    NEH_CFB;
    asm("movl %eax,%esi\n\t");
    asm("movl %0, %%edi\n\t" : : "m" (w));
    asm("movsl; movsl; movsl; movsl\n\t");
    asm("popl %ebx\n\t");
}

INLINE volatile  void via_ofb_op6(
            const void *k, const void *c, const void *s, void *d, int l, void *v)
{
    asm("pushl %ebx\n\t");
    NEH_REKEY;
    asm("movl %0, %%ebx\n\t" : : "m" (k));
    asm("movl %0, %%edx\n\t" : : "m" (c));
    asm("movl %0, %%esi\n\t" : : "m" (s));
    asm("movl %0, %%edi\n\t" : : "m" (d));
    asm("movl %0, %%ecx\n\t" : : "m" (l));
    asm("movl %0, %%eax\n\t" : : "m" (v));
    NEH_OFB;
    asm("popl %ebx\n\t");
}

#else
#error VIA ACE is not available with this compiler
#endif

INLINE int via_ace_test(void)
{
    return has_cpuid() && is_via_cpu() && ((read_via_flags() & NEH_ACE_FLAGS) == NEH_ACE_FLAGS);
}

#define VIA_ACE_AVAILABLE   (((via_flags & NEH_ACE_FLAGS) == NEH_ACE_FLAGS)         \
    || (via_flags & NEH_CPU_READ) && (via_flags & NEH_CPU_IS_VIA) || via_ace_test())

INLINE int via_rng_test(void)
{
    return has_cpuid() && is_via_cpu() && ((read_via_flags() & NEH_RNG_FLAGS) == NEH_RNG_FLAGS);
}

#define VIA_RNG_AVAILABLE   (((via_flags & NEH_RNG_FLAGS) == NEH_RNG_FLAGS)         \
    || (via_flags & NEH_CPU_READ) && (via_flags & NEH_CPU_IS_VIA) || via_rng_test())

INLINE int read_via_rng(void *buf, int count)
{   int nbr, max_reads, lcnt = count;
    unsigned char *p, *q;
    aligned_auto(unsigned char, bp, 64, 16);

    if(!VIA_RNG_AVAILABLE)
        return 0;

    do
    {
        max_reads = MAX_READ_ATTEMPTS;
        do
            nbr = via_rng_in(bp);
        while
            (nbr == 0 && --max_reads);

        lcnt -= nbr;
        p = (unsigned char*)buf; q = bp;
        while(nbr--)
            *p++ = *q++;
    }
    while
        (lcnt && max_reads);

    return count - lcnt;
}

#endif
/*
---------------------------------------------------------------------------
Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.

The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:

  source code distributions include the above copyright notice, this
  list of conditions and the following disclaimer;

  binary distributions include the above copyright notice, this list
  of conditions and the following disclaimer in their documentation.

This software is provided 'as is' with no explicit or implied warranties
in respect of its operation, including, but not limited to, correctness
and fitness for purpose.
---------------------------------------------------------------------------
Issue Date: 20/12/2007
*/

#include "aesopt.h"
#include "aestab.h"

#if defined(__cplusplus)
extern "C"
{
#endif

#define si(y,x,k,c) (s(y,c) = word_in(x, c) ^ (k)[c])
#define so(y,x,c)   word_out(y, c, s(x,c))

#if defined(ARRAYS)
#define locals(y,x)     x[4],y[4]
#else
#define locals(y,x)     x##0,x##1,x##2,x##3,y##0,y##1,y##2,y##3
#endif

#define l_copy(y, x)    s(y,0) = s(x,0); s(y,1) = s(x,1); \
                        s(y,2) = s(x,2); s(y,3) = s(x,3);
#define state_in(y,x,k) si(y,x,k,0); si(y,x,k,1); si(y,x,k,2); si(y,x,k,3)
#define state_out(y,x)  so(y,x,0); so(y,x,1); so(y,x,2); so(y,x,3)
#define round(rm,y,x,k) rm(y,x,k,0); rm(y,x,k,1); rm(y,x,k,2); rm(y,x,k,3)

#if ( FUNCS_IN_C & ENCRYPTION_IN_C )

/* Visual C++ .Net v7.1 provides the fastest encryption code when using
   Pentium optimiation with small code but this is poor for decryption
   so we need to control this with the following VC++ pragmas
*/

#if defined( _MSC_VER ) && !defined( _WIN64 )
#pragma optimize( "s", on )
#endif

/* Given the column (c) of the output state variable, the following
   macros give the input state variables which are needed in its
   computation for each row (r) of the state. All the alternative
   macros give the same end values but expand into different ways
   of calculating these values.  In particular the complex macro
   used for dynamically variable block sizes is designed to expand
   to a compile time constant whenever possible but will expand to
   conditional clauses on some branches (I am grateful to Frank
   Yellin for this construction)
*/

#define fwd_var(x,r,c)\
 ( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\
 : r == 1 ? ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0))\
 : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\
 :          ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2)))

#if defined(FT4_SET)
#undef  dec_fmvars
#define fwd_rnd(y,x,k,c)    (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,n),fwd_var,rf1,c))
#elif defined(FT1_SET)
#undef  dec_fmvars
#define fwd_rnd(y,x,k,c)    (s(y,c) = (k)[c] ^ one_table(x,upr,t_use(f,n),fwd_var,rf1,c))
#else
#define fwd_rnd(y,x,k,c)    (s(y,c) = (k)[c] ^ fwd_mcol(no_table(x,t_use(s,box),fwd_var,rf1,c)))
#endif

#if defined(FL4_SET)
#define fwd_lrnd(y,x,k,c)   (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,l),fwd_var,rf1,c))
#elif defined(FL1_SET)
#define fwd_lrnd(y,x,k,c)   (s(y,c) = (k)[c] ^ one_table(x,ups,t_use(f,l),fwd_var,rf1,c))
#else
#define fwd_lrnd(y,x,k,c)   (s(y,c) = (k)[c] ^ no_table(x,t_use(s,box),fwd_var,rf1,c))
#endif

AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1])
{   uint_32t         locals(b0, b1);
    const uint_32t   *kp;
#if defined( dec_fmvars )
    dec_fmvars; /* declare variables for fwd_mcol() if needed */
#endif

    if( cx->inf.b[0] != 10 * 16 && cx->inf.b[0] != 12 * 16 && cx->inf.b[0] != 14 * 16 )
        return EXIT_FAILURE;

    kp = cx->ks;
    state_in(b0, in, kp);

#if (ENC_UNROLL == FULL)

    switch(cx->inf.b[0])
    {
    case 14 * 16:
        round(fwd_rnd,  b1, b0, kp + 1 * N_COLS);
        round(fwd_rnd,  b0, b1, kp + 2 * N_COLS);
        kp += 2 * N_COLS;
    case 12 * 16:
        round(fwd_rnd,  b1, b0, kp + 1 * N_COLS);
        round(fwd_rnd,  b0, b1, kp + 2 * N_COLS);
        kp += 2 * N_COLS;
    case 10 * 16:
        round(fwd_rnd,  b1, b0, kp + 1 * N_COLS);
        round(fwd_rnd,  b0, b1, kp + 2 * N_COLS);
        round(fwd_rnd,  b1, b0, kp + 3 * N_COLS);
        round(fwd_rnd,  b0, b1, kp + 4 * N_COLS);
        round(fwd_rnd,  b1, b0, kp + 5 * N_COLS);
        round(fwd_rnd,  b0, b1, kp + 6 * N_COLS);
        round(fwd_rnd,  b1, b0, kp + 7 * N_COLS);
        round(fwd_rnd,  b0, b1, kp + 8 * N_COLS);
        round(fwd_rnd,  b1, b0, kp + 9 * N_COLS);
        round(fwd_lrnd, b0, b1, kp +10 * N_COLS);
    }

#else

#if (ENC_UNROLL == PARTIAL)
    {   uint_32t    rnd;
        for(rnd = 0; rnd < (cx->inf.b[0] >> 5) - 1; ++rnd)
        {
            kp += N_COLS;
            round(fwd_rnd, b1, b0, kp);
            kp += N_COLS;
            round(fwd_rnd, b0, b1, kp);
        }
        kp += N_COLS;
        round(fwd_rnd,  b1, b0, kp);
#else
    {   uint_32t    rnd;
        for(rnd = 0; rnd < (cx->inf.b[0] >> 4) - 1; ++rnd)
        {
            kp += N_COLS;
            round(fwd_rnd, b1, b0, kp);
            l_copy(b0, b1);
        }
#endif
        kp += N_COLS;
        round(fwd_lrnd, b0, b1, kp);
    }
#endif

    state_out(out, b0);
    return EXIT_SUCCESS;
}

#endif

#if ( FUNCS_IN_C & DECRYPTION_IN_C)

/* Visual C++ .Net v7.1 provides the fastest encryption code when using
   Pentium optimiation with small code but this is poor for decryption
   so we need to control this with the following VC++ pragmas
*/

#if defined( _MSC_VER ) && !defined( _WIN64 )
#pragma optimize( "t", on )
#endif

/* Given the column (c) of the output state variable, the following
   macros give the input state variables which are needed in its
   computation for each row (r) of the state. All the alternative
   macros give the same end values but expand into different ways
   of calculating these values.  In particular the complex macro
   used for dynamically variable block sizes is designed to expand
   to a compile time constant whenever possible but will expand to
   conditional clauses on some branches (I am grateful to Frank
   Yellin for this construction)
*/

#define inv_var(x,r,c)\
 ( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\
 : r == 1 ? ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2))\
 : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\
 :          ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0)))

#if defined(IT4_SET)
#undef  dec_imvars
#define inv_rnd(y,x,k,c)    (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,n),inv_var,rf1,c))
#elif defined(IT1_SET)
#undef  dec_imvars
#define inv_rnd(y,x,k,c)    (s(y,c) = (k)[c] ^ one_table(x,upr,t_use(i,n),inv_var,rf1,c))
#else
#define inv_rnd(y,x,k,c)    (s(y,c) = inv_mcol((k)[c] ^ no_table(x,t_use(i,box),inv_var,rf1,c)))
#endif

#if defined(IL4_SET)
#define inv_lrnd(y,x,k,c)   (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,l),inv_var,rf1,c))
#elif defined(IL1_SET)
#define inv_lrnd(y,x,k,c)   (s(y,c) = (k)[c] ^ one_table(x,ups,t_use(i,l),inv_var,rf1,c))
#else
#define inv_lrnd(y,x,k,c)   (s(y,c) = (k)[c] ^ no_table(x,t_use(i,box),inv_var,rf1,c))
#endif

/* This code can work with the decryption key schedule in the   */
/* order that is used for encrytpion (where the 1st decryption  */
/* round key is at the high end ot the schedule) or with a key  */
/* schedule that has been reversed to put the 1st decryption    */
/* round key at the low end of the schedule in memory (when     */
/* AES_REV_DKS is defined)                                      */

#ifdef AES_REV_DKS
#define key_ofs     0
#define rnd_key(n)  (kp + n * N_COLS)
#else
#define key_ofs     1
#define rnd_key(n)  (kp - n * N_COLS)
#endif

AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, const aes_decrypt_ctx cx[1])
{   uint_32t        locals(b0, b1);
#if defined( dec_imvars )
    dec_imvars; /* declare variables for inv_mcol() if needed */
#endif
    const uint_32t *kp;

    if( cx->inf.b[0] != 10 * 16 && cx->inf.b[0] != 12 * 16 && cx->inf.b[0] != 14 * 16 )
        return EXIT_FAILURE;

    kp = cx->ks + (key_ofs ? (cx->inf.b[0] >> 2) : 0);
    state_in(b0, in, kp);

#if (DEC_UNROLL == FULL)

    kp = cx->ks + (key_ofs ? 0 : (cx->inf.b[0] >> 2));
    switch(cx->inf.b[0])
    {
    case 14 * 16:
        round(inv_rnd,  b1, b0, rnd_key(-13));
        round(inv_rnd,  b0, b1, rnd_key(-12));
    case 12 * 16:
        round(inv_rnd,  b1, b0, rnd_key(-11));
        round(inv_rnd,  b0, b1, rnd_key(-10));
    case 10 * 16:
        round(inv_rnd,  b1, b0, rnd_key(-9));
        round(inv_rnd,  b0, b1, rnd_key(-8));
        round(inv_rnd,  b1, b0, rnd_key(-7));
        round(inv_rnd,  b0, b1, rnd_key(-6));
        round(inv_rnd,  b1, b0, rnd_key(-5));
        round(inv_rnd,  b0, b1, rnd_key(-4));
        round(inv_rnd,  b1, b0, rnd_key(-3));
        round(inv_rnd,  b0, b1, rnd_key(-2));
        round(inv_rnd,  b1, b0, rnd_key(-1));
        round(inv_lrnd, b0, b1, rnd_key( 0));
    }

#else

#if (DEC_UNROLL == PARTIAL)
    {   uint_32t    rnd;
        for(rnd = 0; rnd < (cx->inf.b[0] >> 5) - 1; ++rnd)
        {
            kp = rnd_key(1);
            round(inv_rnd, b1, b0, kp);
            kp = rnd_key(1);
            round(inv_rnd, b0, b1, kp);
        }
        kp = rnd_key(1);
        round(inv_rnd, b1, b0, kp);
#else
    {   uint_32t    rnd;
        for(rnd = 0; rnd < (cx->inf.b[0] >> 4) - 1; ++rnd)
        {
            kp = rnd_key(1);
            round(inv_rnd, b1, b0, kp);
            l_copy(b0, b1);
        }
#endif
        kp = rnd_key(1);
        round(inv_lrnd, b0, b1, kp);
        }
#endif

    state_out(out, b0);
    return EXIT_SUCCESS;
}

#endif

#if defined(__cplusplus)
}
#endif
/*
---------------------------------------------------------------------------
Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.

The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:

  source code distributions include the above copyright notice, this
  list of conditions and the following disclaimer;

  binary distributions include the above copyright notice, this list
  of conditions and the following disclaimer in their documentation.

This software is provided 'as is' with no explicit or implied warranties
in respect of its operation, including, but not limited to, correctness
and fitness for purpose.
---------------------------------------------------------------------------
Issue Date: 20/12/2007
*/

#include "aesopt.h"
#include "aestab.h"

#ifdef USE_VIA_ACE_IF_PRESENT
#  include "aes_via_ace.h"
#endif

#if defined(__cplusplus)
extern "C"
{
#endif

/* Initialise the key schedule from the user supplied key. The key
   length can be specified in bytes, with legal values of 16, 24
   and 32, or in bits, with legal values of 128, 192 and 256. These
   values correspond with Nk values of 4, 6 and 8 respectively.

   The following macros implement a single cycle in the key
   schedule generation process. The number of cycles needed
   for each cx->n_col and nk value is:

    nk =             4  5  6  7  8
    ------------------------------
    cx->n_col = 4   10  9  8  7  7
    cx->n_col = 5   14 11 10  9  9
    cx->n_col = 6   19 15 12 11 11
    cx->n_col = 7   21 19 16 13 14
    cx->n_col = 8   29 23 19 17 14
*/

#if defined( REDUCE_CODE_SIZE )
#  define ls_box ls_sub
   uint_32t ls_sub(const uint_32t t, const uint_32t n);
#  define inv_mcol im_sub
   uint_32t im_sub(const uint_32t x);
#  ifdef ENC_KS_UNROLL
#    undef ENC_KS_UNROLL
#  endif
#  ifdef DEC_KS_UNROLL
#    undef DEC_KS_UNROLL
#  endif
#endif

#if (FUNCS_IN_C & ENC_KEYING_IN_C)

#if defined(AES_128) || defined( AES_VAR )

#define ke4(k,i) \
{   k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \
    k[4*(i)+5] = ss[1] ^= ss[0]; \
    k[4*(i)+6] = ss[2] ^= ss[1]; \
    k[4*(i)+7] = ss[3] ^= ss[2]; \
}

AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1])
{   uint_32t    ss[4];

    cx->ks[0] = ss[0] = word_in(key, 0);
    cx->ks[1] = ss[1] = word_in(key, 1);
    cx->ks[2] = ss[2] = word_in(key, 2);
    cx->ks[3] = ss[3] = word_in(key, 3);

#ifdef ENC_KS_UNROLL
    ke4(cx->ks, 0);  ke4(cx->ks, 1);
    ke4(cx->ks, 2);  ke4(cx->ks, 3);
    ke4(cx->ks, 4);  ke4(cx->ks, 5);
    ke4(cx->ks, 6);  ke4(cx->ks, 7);
    ke4(cx->ks, 8);
#else
    {   uint_32t i;
        for(i = 0; i < 9; ++i)
            ke4(cx->ks, i);
    }
#endif
    ke4(cx->ks, 9);
    cx->inf.l = 0;
    cx->inf.b[0] = 10 * 16;

#ifdef USE_VIA_ACE_IF_PRESENT
    if(VIA_ACE_AVAILABLE)
        cx->inf.b[1] = 0xff;
#endif
    return EXIT_SUCCESS;
}

#endif

#if defined(AES_192) || defined( AES_VAR )

#define kef6(k,i) \
{   k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \
    k[6*(i)+ 7] = ss[1] ^= ss[0]; \
    k[6*(i)+ 8] = ss[2] ^= ss[1]; \
    k[6*(i)+ 9] = ss[3] ^= ss[2]; \
}

#define ke6(k,i) \
{   kef6(k,i); \
    k[6*(i)+10] = ss[4] ^= ss[3]; \
    k[6*(i)+11] = ss[5] ^= ss[4]; \
}

AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1])
{   uint_32t    ss[6];

    cx->ks[0] = ss[0] = word_in(key, 0);
    cx->ks[1] = ss[1] = word_in(key, 1);
    cx->ks[2] = ss[2] = word_in(key, 2);
    cx->ks[3] = ss[3] = word_in(key, 3);
    cx->ks[4] = ss[4] = word_in(key, 4);
    cx->ks[5] = ss[5] = word_in(key, 5);

#ifdef ENC_KS_UNROLL
    ke6(cx->ks, 0);  ke6(cx->ks, 1);
    ke6(cx->ks, 2);  ke6(cx->ks, 3);
    ke6(cx->ks, 4);  ke6(cx->ks, 5);
    ke6(cx->ks, 6);
#else
    {   uint_32t i;
        for(i = 0; i < 7; ++i)
            ke6(cx->ks, i);
    }
#endif
    kef6(cx->ks, 7);
    cx->inf.l = 0;
    cx->inf.b[0] = 12 * 16;

#ifdef USE_VIA_ACE_IF_PRESENT
    if(VIA_ACE_AVAILABLE)
        cx->inf.b[1] = 0xff;
#endif
    return EXIT_SUCCESS;
}

#endif

#if defined(AES_256) || defined( AES_VAR )

#define kef8(k,i) \
{   k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \
    k[8*(i)+ 9] = ss[1] ^= ss[0]; \
    k[8*(i)+10] = ss[2] ^= ss[1]; \
    k[8*(i)+11] = ss[3] ^= ss[2]; \
}

#define ke8(k,i) \
{   kef8(k,i); \
    k[8*(i)+12] = ss[4] ^= ls_box(ss[3],0); \
    k[8*(i)+13] = ss[5] ^= ss[4]; \
    k[8*(i)+14] = ss[6] ^= ss[5]; \
    k[8*(i)+15] = ss[7] ^= ss[6]; \
}

AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1])
{   uint_32t    ss[8];

    cx->ks[0] = ss[0] = word_in(key, 0);
    cx->ks[1] = ss[1] = word_in(key, 1);
    cx->ks[2] = ss[2] = word_in(key, 2);
    cx->ks[3] = ss[3] = word_in(key, 3);
    cx->ks[4] = ss[4] = word_in(key, 4);
    cx->ks[5] = ss[5] = word_in(key, 5);
    cx->ks[6] = ss[6] = word_in(key, 6);
    cx->ks[7] = ss[7] = word_in(key, 7);

#ifdef ENC_KS_UNROLL
    ke8(cx->ks, 0); ke8(cx->ks, 1);
    ke8(cx->ks, 2); ke8(cx->ks, 3);
    ke8(cx->ks, 4); ke8(cx->ks, 5);
#else
    {   uint_32t i;
        for(i = 0; i < 6; ++i)
            ke8(cx->ks,  i);
    }
#endif
    kef8(cx->ks, 6);
    cx->inf.l = 0;
    cx->inf.b[0] = 14 * 16;

#ifdef USE_VIA_ACE_IF_PRESENT
    if(VIA_ACE_AVAILABLE)
        cx->inf.b[1] = 0xff;
#endif
    return EXIT_SUCCESS;
}

#endif

#if defined( AES_VAR )

AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1])
{   
    switch(key_len)
    {
    case 16: case 128: return aes_encrypt_key128(key, cx);
    case 24: case 192: return aes_encrypt_key192(key, cx);
    case 32: case 256: return aes_encrypt_key256(key, cx);
    default: return EXIT_FAILURE;
    }
}

#endif

#endif

#if (FUNCS_IN_C & DEC_KEYING_IN_C)

/* this is used to store the decryption round keys  */
/* in forward or reverse order                      */

#ifdef AES_REV_DKS
#define v(n,i)  ((n) - (i) + 2 * ((i) & 3))
#else
#define v(n,i)  (i)
#endif

#if DEC_ROUND == NO_TABLES
#define ff(x)   (x)
#else
#define ff(x)   inv_mcol(x)
#if defined( dec_imvars )
#define d_vars  dec_imvars
#endif
#endif

#if defined(AES_128) || defined( AES_VAR )

#define k4e(k,i) \
{   k[v(40,(4*(i))+4)] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \
    k[v(40,(4*(i))+5)] = ss[1] ^= ss[0]; \
    k[v(40,(4*(i))+6)] = ss[2] ^= ss[1]; \
    k[v(40,(4*(i))+7)] = ss[3] ^= ss[2]; \
}

#if 1

#define kdf4(k,i) \
{   ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; \
    ss[1] = ss[1] ^ ss[3]; \
    ss[2] = ss[2] ^ ss[3]; \
    ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \
    ss[i % 4] ^= ss[4]; \
    ss[4] ^= k[v(40,(4*(i)))];   k[v(40,(4*(i))+4)] = ff(ss[4]); \
    ss[4] ^= k[v(40,(4*(i))+1)]; k[v(40,(4*(i))+5)] = ff(ss[4]); \
    ss[4] ^= k[v(40,(4*(i))+2)]; k[v(40,(4*(i))+6)] = ff(ss[4]); \
    ss[4] ^= k[v(40,(4*(i))+3)]; k[v(40,(4*(i))+7)] = ff(ss[4]); \
}

#define kd4(k,i) \
{   ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \
    ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); \
    k[v(40,(4*(i))+4)] = ss[4] ^= k[v(40,(4*(i)))]; \
    k[v(40,(4*(i))+5)] = ss[4] ^= k[v(40,(4*(i))+1)]; \
    k[v(40,(4*(i))+6)] = ss[4] ^= k[v(40,(4*(i))+2)]; \
    k[v(40,(4*(i))+7)] = ss[4] ^= k[v(40,(4*(i))+3)]; \
}

#define kdl4(k,i) \
{   ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; \
    k[v(40,(4*(i))+4)] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; \
    k[v(40,(4*(i))+5)] = ss[1] ^ ss[3]; \
    k[v(40,(4*(i))+6)] = ss[0]; \
    k[v(40,(4*(i))+7)] = ss[1]; \
}

#else

#define kdf4(k,i) \
{   ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ff(ss[0]); \
    ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ff(ss[1]); \
    ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ff(ss[2]); \
    ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ff(ss[3]); \
}

#define kd4(k,i) \
{   ss[4] = ls_box(ss[3],3) ^ t_use(r,c)[i]; \
    ss[0] ^= ss[4]; ss[4] = ff(ss[4]); k[v(40,(4*(i))+ 4)] = ss[4] ^= k[v(40,(4*(i)))]; \
    ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[4] ^= k[v(40,(4*(i))+ 1)]; \
    ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[4] ^= k[v(40,(4*(i))+ 2)]; \
    ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[4] ^= k[v(40,(4*(i))+ 3)]; \
}

#define kdl4(k,i) \
{   ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ss[0]; \
    ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[1]; \
    ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[2]; \
    ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[3]; \
}

#endif

AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1])
{   uint_32t    ss[5];
#if defined( d_vars )
        d_vars;
#endif
    cx->ks[v(40,(0))] = ss[0] = word_in(key, 0);
    cx->ks[v(40,(1))] = ss[1] = word_in(key, 1);
    cx->ks[v(40,(2))] = ss[2] = word_in(key, 2);
    cx->ks[v(40,(3))] = ss[3] = word_in(key, 3);

#ifdef DEC_KS_UNROLL
     kdf4(cx->ks, 0); kd4(cx->ks, 1);
     kd4(cx->ks, 2);  kd4(cx->ks, 3);
     kd4(cx->ks, 4);  kd4(cx->ks, 5);
     kd4(cx->ks, 6);  kd4(cx->ks, 7);
     kd4(cx->ks, 8);  kdl4(cx->ks, 9);
#else
    {   uint_32t i;
        for(i = 0; i < 10; ++i)
            k4e(cx->ks, i);
#if !(DEC_ROUND == NO_TABLES)
        for(i = N_COLS; i < 10 * N_COLS; ++i)
            cx->ks[i] = inv_mcol(cx->ks[i]);
#endif
    }
#endif
    cx->inf.l = 0;
    cx->inf.b[0] = 10 * 16;

#ifdef USE_VIA_ACE_IF_PRESENT
    if(VIA_ACE_AVAILABLE)
        cx->inf.b[1] = 0xff;
#endif
    return EXIT_SUCCESS;
}

#endif

#if defined(AES_192) || defined( AES_VAR )

#define k6ef(k,i) \
{   k[v(48,(6*(i))+ 6)] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \
    k[v(48,(6*(i))+ 7)] = ss[1] ^= ss[0]; \
    k[v(48,(6*(i))+ 8)] = ss[2] ^= ss[1]; \
    k[v(48,(6*(i))+ 9)] = ss[3] ^= ss[2]; \
}

#define k6e(k,i) \
{   k6ef(k,i); \
    k[v(48,(6*(i))+10)] = ss[4] ^= ss[3]; \
    k[v(48,(6*(i))+11)] = ss[5] ^= ss[4]; \
}

#define kdf6(k,i) \
{   ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ff(ss[0]); \
    ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ff(ss[1]); \
    ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ff(ss[2]); \
    ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ff(ss[3]); \
    ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ff(ss[4]); \
    ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ff(ss[5]); \
}

#define kd6(k,i) \
{   ss[6] = ls_box(ss[5],3) ^ t_use(r,c)[i]; \
    ss[0] ^= ss[6]; ss[6] = ff(ss[6]); k[v(48,(6*(i))+ 6)] = ss[6] ^= k[v(48,(6*(i)))]; \
    ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[6] ^= k[v(48,(6*(i))+ 1)]; \
    ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[6] ^= k[v(48,(6*(i))+ 2)]; \
    ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[6] ^= k[v(48,(6*(i))+ 3)]; \
    ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ss[6] ^= k[v(48,(6*(i))+ 4)]; \
    ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ss[6] ^= k[v(48,(6*(i))+ 5)]; \
}

#define kdl6(k,i) \
{   ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ss[0]; \
    ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[1]; \
    ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[2]; \
    ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[3]; \
}

AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1])
{   uint_32t    ss[7];
#if defined( d_vars )
        d_vars;
#endif
    cx->ks[v(48,(0))] = ss[0] = word_in(key, 0);
    cx->ks[v(48,(1))] = ss[1] = word_in(key, 1);
    cx->ks[v(48,(2))] = ss[2] = word_in(key, 2);
    cx->ks[v(48,(3))] = ss[3] = word_in(key, 3);

#ifdef DEC_KS_UNROLL
    cx->ks[v(48,(4))] = ff(ss[4] = word_in(key, 4));
    cx->ks[v(48,(5))] = ff(ss[5] = word_in(key, 5));
    kdf6(cx->ks, 0); kd6(cx->ks, 1);
    kd6(cx->ks, 2);  kd6(cx->ks, 3);
    kd6(cx->ks, 4);  kd6(cx->ks, 5);
    kd6(cx->ks, 6);  kdl6(cx->ks, 7);
#else
    cx->ks[v(48,(4))] = ss[4] = word_in(key, 4);
    cx->ks[v(48,(5))] = ss[5] = word_in(key, 5);
    {   uint_32t i;

        for(i = 0; i < 7; ++i)
            k6e(cx->ks, i);
        k6ef(cx->ks, 7);
#if !(DEC_ROUND == NO_TABLES)
        for(i = N_COLS; i < 12 * N_COLS; ++i)
            cx->ks[i] = inv_mcol(cx->ks[i]);
#endif
    }
#endif
    cx->inf.l = 0;
    cx->inf.b[0] = 12 * 16;

#ifdef USE_VIA_ACE_IF_PRESENT
    if(VIA_ACE_AVAILABLE)
        cx->inf.b[1] = 0xff;
#endif
    return EXIT_SUCCESS;
}

#endif

#if defined(AES_256) || defined( AES_VAR )

#define k8ef(k,i) \
{   k[v(56,(8*(i))+ 8)] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \
    k[v(56,(8*(i))+ 9)] = ss[1] ^= ss[0]; \
    k[v(56,(8*(i))+10)] = ss[2] ^= ss[1]; \
    k[v(56,(8*(i))+11)] = ss[3] ^= ss[2]; \
}

#define k8e(k,i) \
{   k8ef(k,i); \
    k[v(56,(8*(i))+12)] = ss[4] ^= ls_box(ss[3],0); \
    k[v(56,(8*(i))+13)] = ss[5] ^= ss[4]; \
    k[v(56,(8*(i))+14)] = ss[6] ^= ss[5]; \
    k[v(56,(8*(i))+15)] = ss[7] ^= ss[6]; \
}

#define kdf8(k,i) \
{   ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ff(ss[0]); \
    ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ff(ss[1]); \
    ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ff(ss[2]); \
    ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ff(ss[3]); \
    ss[4] ^= ls_box(ss[3],0); k[v(56,(8*(i))+12)] = ff(ss[4]); \
    ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ff(ss[5]); \
    ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ff(ss[6]); \
    ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ff(ss[7]); \
}

#define kd8(k,i) \
{   ss[8] = ls_box(ss[7],3) ^ t_use(r,c)[i]; \
    ss[0] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+ 8)] = ss[8] ^= k[v(56,(8*(i)))]; \
    ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[8] ^= k[v(56,(8*(i))+ 1)]; \
    ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[8] ^= k[v(56,(8*(i))+ 2)]; \
    ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[8] ^= k[v(56,(8*(i))+ 3)]; \
    ss[8] = ls_box(ss[3],0); \
    ss[4] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+12)] = ss[8] ^= k[v(56,(8*(i))+ 4)]; \
    ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ss[8] ^= k[v(56,(8*(i))+ 5)]; \
    ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ss[8] ^= k[v(56,(8*(i))+ 6)]; \
    ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ss[8] ^= k[v(56,(8*(i))+ 7)]; \
}

#define kdl8(k,i) \
{   ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ss[0]; \
    ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[1]; \
    ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[2]; \
    ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[3]; \
}

AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1])
{   uint_32t    ss[9];
#if defined( d_vars )
        d_vars;
#endif
    cx->ks[v(56,(0))] = ss[0] = word_in(key, 0);
    cx->ks[v(56,(1))] = ss[1] = word_in(key, 1);
    cx->ks[v(56,(2))] = ss[2] = word_in(key, 2);
    cx->ks[v(56,(3))] = ss[3] = word_in(key, 3);

#ifdef DEC_KS_UNROLL
    cx->ks[v(56,(4))] = ff(ss[4] = word_in(key, 4));
    cx->ks[v(56,(5))] = ff(ss[5] = word_in(key, 5));
    cx->ks[v(56,(6))] = ff(ss[6] = word_in(key, 6));
    cx->ks[v(56,(7))] = ff(ss[7] = word_in(key, 7));
    kdf8(cx->ks, 0); kd8(cx->ks, 1);
    kd8(cx->ks, 2);  kd8(cx->ks, 3);
    kd8(cx->ks, 4);  kd8(cx->ks, 5);
    kdl8(cx->ks, 6);
#else
    cx->ks[v(56,(4))] = ss[4] = word_in(key, 4);
    cx->ks[v(56,(5))] = ss[5] = word_in(key, 5);
    cx->ks[v(56,(6))] = ss[6] = word_in(key, 6);
    cx->ks[v(56,(7))] = ss[7] = word_in(key, 7);
    {   uint_32t i;

        for(i = 0; i < 6; ++i)
            k8e(cx->ks,  i);
        k8ef(cx->ks,  6);
#if !(DEC_ROUND == NO_TABLES)
        for(i = N_COLS; i < 14 * N_COLS; ++i)
            cx->ks[i] = inv_mcol(cx->ks[i]);
#endif
    }
#endif
    cx->inf.l = 0;
    cx->inf.b[0] = 14 * 16;

#ifdef USE_VIA_ACE_IF_PRESENT
    if(VIA_ACE_AVAILABLE)
        cx->inf.b[1] = 0xff;
#endif
    return EXIT_SUCCESS;
}

#endif

#if defined( AES_VAR )

AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1])
{
    switch(key_len)
    {
    case 16: case 128: return aes_decrypt_key128(key, cx);
    case 24: case 192: return aes_decrypt_key192(key, cx);
    case 32: case 256: return aes_decrypt_key256(key, cx);
    default: return EXIT_FAILURE;
    }
}

#endif

#endif

#if defined(__cplusplus)
}
#endif
/*
---------------------------------------------------------------------------
Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.

The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:

  source code distributions include the above copyright notice, this
  list of conditions and the following disclaimer;

  binary distributions include the above copyright notice, this list
  of conditions and the following disclaimer in their documentation.

This software is provided 'as is' with no explicit or implied warranties
in respect of its operation, including, but not limited to, correctness
and fitness for purpose.
---------------------------------------------------------------------------
Issue Date: 20/12/2007

 This file contains the compilation options for AES (Rijndael) and code
 that is common across encryption, key scheduling and table generation.

 OPERATION

 These source code files implement the AES algorithm Rijndael designed by
 Joan Daemen and Vincent Rijmen. This version is designed for the standard
 block size of 16 bytes and for key sizes of 128, 192 and 256 bits (16, 24
 and 32 bytes).

 This version is designed for flexibility and speed using operations on
 32-bit words rather than operations on bytes.  It can be compiled with
 either big or little endian internal byte order but is faster when the
 native byte order for the processor is used.

 THE CIPHER INTERFACE

 The cipher interface is implemented as an array of bytes in which lower
 AES bit sequence indexes map to higher numeric significance within bytes.

  uint_8t                 (an unsigned  8-bit type)
  uint_32t                (an unsigned 32-bit type)
  struct aes_encrypt_ctx  (structure for the cipher encryption context)
  struct aes_decrypt_ctx  (structure for the cipher decryption context)
  AES_RETURN                the function return type

  C subroutine calls:

  AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]);
  AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]);
  AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]);
  AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out,
                                                  const aes_encrypt_ctx cx[1]);

  AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]);
  AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]);
  AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]);
  AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out,
                                                  const aes_decrypt_ctx cx[1]);

 IMPORTANT NOTE: If you are using this C interface with dynamic tables make sure that
 you call aes_init() before AES is used so that the tables are initialised.

 C++ aes class subroutines:

     Class AESencrypt  for encryption

      Construtors:
          AESencrypt(void)
          AESencrypt(const unsigned char *key) - 128 bit key
      Members:
          AES_RETURN key128(const unsigned char *key)
          AES_RETURN key192(const unsigned char *key)
          AES_RETURN key256(const unsigned char *key)
          AES_RETURN encrypt(const unsigned char *in, unsigned char *out) const

      Class AESdecrypt  for encryption
      Construtors:
          AESdecrypt(void)
          AESdecrypt(const unsigned char *key) - 128 bit key
      Members:
          AES_RETURN key128(const unsigned char *key)
          AES_RETURN key192(const unsigned char *key)
          AES_RETURN key256(const unsigned char *key)
          AES_RETURN decrypt(const unsigned char *in, unsigned char *out) const
*/

#if !defined( _AESOPT_H )
#define _AESOPT_H

#if defined( __cplusplus )
#include "aescpp.h"
#else
#include "aes.h"
#endif

/*  PLATFORM SPECIFIC INCLUDES */

#include "brg_endian.h"

/*  CONFIGURATION - THE USE OF DEFINES

    Later in this section there are a number of defines that control the
    operation of the code.  In each section, the purpose of each define is
    explained so that the relevant form can be included or excluded by
    setting either 1's or 0's respectively on the branches of the related
    #if clauses.  The following local defines should not be changed.
*/

#define ENCRYPTION_IN_C     1
#define DECRYPTION_IN_C     2
#define ENC_KEYING_IN_C     4
#define DEC_KEYING_IN_C     8

#define NO_TABLES           0
#define ONE_TABLE           1
#define FOUR_TABLES         4
#define NONE                0
#define PARTIAL             1
#define FULL                2

/*  --- START OF USER CONFIGURED OPTIONS --- */

/*  1. BYTE ORDER WITHIN 32 BIT WORDS

    The fundamental data processing units in Rijndael are 8-bit bytes. The
    input, output and key input are all enumerated arrays of bytes in which
    bytes are numbered starting at zero and increasing to one less than the
    number of bytes in the array in question. This enumeration is only used
    for naming bytes and does not imply any adjacency or order relationship
    from one byte to another. When these inputs and outputs are considered
    as bit sequences, bits 8*n to 8*n+7 of the bit sequence are mapped to
    byte[n] with bit 8n+i in the sequence mapped to bit 7-i within the byte.
    In this implementation bits are numbered from 0 to 7 starting at the
    numerically least significant end of each byte (bit n represents 2^n).

    However, Rijndael can be implemented more efficiently using 32-bit
    words by packing bytes into words so that bytes 4*n to 4*n+3 are placed
    into word[n]. While in principle these bytes can be assembled into words
    in any positions, this implementation only supports the two formats in
    which bytes in adjacent positions within words also have adjacent byte
    numbers. This order is called big-endian if the lowest numbered bytes
    in words have the highest numeric significance and little-endian if the
    opposite applies.

    This code can work in either order irrespective of the order used by the
    machine on which it runs. Normally the internal byte order will be set
    to the order of the processor on which the code is to be run but this
    define can be used to reverse this in special situations

    WARNING: Assembler code versions rely on PLATFORM_BYTE_ORDER being set.
    This define will hence be redefined later (in section 4) if necessary
*/

#if 1
#  define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER
#elif 0
#  define ALGORITHM_BYTE_ORDER IS_LITTLE_ENDIAN
#elif 0
#  define ALGORITHM_BYTE_ORDER IS_BIG_ENDIAN
#else
#  error The algorithm byte order is not defined
#endif

/*  2. VIA ACE SUPPORT */

#if !defined(__APPLE__) && defined( __GNUC__ ) && defined( __i386__ ) \
 || defined( _WIN32   ) && defined( _M_IX86  ) \
 && !(defined( _WIN64 ) || defined( _WIN32_WCE ) || defined( _MSC_VER ) && ( _MSC_VER <= 800 ))
#  define VIA_ACE_POSSIBLE
#endif

/*  Define this option if support for the VIA ACE is required. This uses
    inline assembler instructions and is only implemented for the Microsoft,
    Intel and GCC compilers.  If VIA ACE is known to be present, then defining
    ASSUME_VIA_ACE_PRESENT will remove the ordinary encryption/decryption
    code.  If USE_VIA_ACE_IF_PRESENT is defined then VIA ACE will be used if
    it is detected (both present and enabled) but the normal AES code will
    also be present.

    When VIA ACE is to be used, all AES encryption contexts MUST be 16 byte
    aligned; other input/output buffers do not need to be 16 byte aligned
    but there are very large performance gains if this can be arranged.
    VIA ACE also requires the decryption key schedule to be in reverse
    order (which later checks below ensure).
*/

#if 1 && defined( VIA_ACE_POSSIBLE ) && !defined( USE_VIA_ACE_IF_PRESENT )
#  define USE_VIA_ACE_IF_PRESENT
#endif

#if 0 && defined( VIA_ACE_POSSIBLE ) && !defined( ASSUME_VIA_ACE_PRESENT )
#  define ASSUME_VIA_ACE_PRESENT
#  endif

/*  3. ASSEMBLER SUPPORT

    This define (which can be on the command line) enables the use of the
    assembler code routines for encryption, decryption and key scheduling
    as follows:

    ASM_X86_V1C uses the assembler (aes_x86_v1.asm) with large tables for
                encryption and decryption and but with key scheduling in C
    ASM_X86_V2  uses assembler (aes_x86_v2.asm) with compressed tables for
                encryption, decryption and key scheduling
    ASM_X86_V2C uses assembler (aes_x86_v2.asm) with compressed tables for
                encryption and decryption and but with key scheduling in C
    ASM_AMD64_C uses assembler (aes_amd64.asm) with compressed tables for
                encryption and decryption and but with key scheduling in C

    Change one 'if 0' below to 'if 1' to select the version or define
    as a compilation option.
*/

#if 0 && !defined( ASM_X86_V1C )
#  define ASM_X86_V1C
#elif 0 && !defined( ASM_X86_V2  )
#  define ASM_X86_V2
#elif 0 && !defined( ASM_X86_V2C )
#  define ASM_X86_V2C
#elif 0 && !defined( ASM_AMD64_C )
#  define ASM_AMD64_C
#endif

#if (defined ( ASM_X86_V1C ) || defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )) \
      && !defined( _M_IX86 ) || defined( ASM_AMD64_C ) && !defined( _M_X64 )
#  error Assembler code is only available for x86 and AMD64 systems
#endif

/*  4. FAST INPUT/OUTPUT OPERATIONS.

    On some machines it is possible to improve speed by transferring the
    bytes in the input and output arrays to and from the internal 32-bit
    variables by addressing these arrays as if they are arrays of 32-bit
    words.  On some machines this will always be possible but there may
    be a large performance penalty if the byte arrays are not aligned on
    the normal word boundaries. On other machines this technique will
    lead to memory access errors when such 32-bit word accesses are not
    properly aligned. The option SAFE_IO avoids such problems but will
    often be slower on those machines that support misaligned access
    (especially so if care is taken to align the input  and output byte
    arrays on 32-bit word boundaries). If SAFE_IO is not defined it is
    assumed that access to byte arrays as if they are arrays of 32-bit
    words will not cause problems when such accesses are misaligned.
*/
#if 1 && !defined( _MSC_VER )
#  define SAFE_IO
#endif

/*  5. LOOP UNROLLING

    The code for encryption and decrytpion cycles through a number of rounds
    that can be implemented either in a loop or by expanding the code into a
    long sequence of instructions, the latter producing a larger program but
    one that will often be much faster. The latter is called loop unrolling.
    There are also potential speed advantages in expanding two iterations in
    a loop with half the number of iterations, which is called partial loop
    unrolling.  The following options allow partial or full loop unrolling
    to be set independently for encryption and decryption
*/
#if 1
#  define ENC_UNROLL  FULL
#elif 0
#  define ENC_UNROLL  PARTIAL
#else
#  define ENC_UNROLL  NONE
#endif

#if 1
#  define DEC_UNROLL  FULL
#elif 0
#  define DEC_UNROLL  PARTIAL
#else
#  define DEC_UNROLL  NONE
#endif

#if 1
#  define ENC_KS_UNROLL
#endif

#if 1
#  define DEC_KS_UNROLL
#endif

/*  6. FAST FINITE FIELD OPERATIONS

    If this section is included, tables are used to provide faster finite
    field arithmetic (this has no effect if FIXED_TABLES is defined).
*/
#if 1
#  define FF_TABLES
#endif

/*  7. INTERNAL STATE VARIABLE FORMAT

    The internal state of Rijndael is stored in a number of local 32-bit
    word varaibles which can be defined either as an array or as individual
    names variables. Include this section if you want to store these local
    varaibles in arrays. Otherwise individual local variables will be used.
*/
#if 1
#  define ARRAYS
#endif

/*  8. FIXED OR DYNAMIC TABLES

    When this section is included the tables used by the code are compiled
    statically into the binary file.  Otherwise the subroutine aes_init()
    must be called to compute them before the code is first used.
*/
#if 1 && !(defined( _MSC_VER ) && ( _MSC_VER <= 800 ))
#  define FIXED_TABLES
#endif

/*  9. MASKING OR CASTING FROM LONGER VALUES TO BYTES

    In some systems it is better to mask longer values to extract bytes 
    rather than using a cast. This option allows this choice.
*/
#if 0
#  define to_byte(x)  ((uint_8t)(x))
#else
#  define to_byte(x)  ((x) & 0xff)
#endif

/*  10. TABLE ALIGNMENT

    On some sytsems speed will be improved by aligning the AES large lookup
    tables on particular boundaries. This define should be set to a power of
    two giving the desired alignment. It can be left undefined if alignment
    is not needed.  This option is specific to the Microsft VC++ compiler -
    it seems to sometimes cause trouble for the VC++ version 6 compiler.
*/

#if 1 && defined( _MSC_VER ) && ( _MSC_VER >= 1300 )
#  define TABLE_ALIGN 32
#endif

/*  11.  REDUCE CODE AND TABLE SIZE

    This replaces some expanded macros with function calls if AES_ASM_V2 or
    AES_ASM_V2C are defined
*/

#if 1 && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C ))
#  define REDUCE_CODE_SIZE
#endif

/*  12. TABLE OPTIONS

    This cipher proceeds by repeating in a number of cycles known as 'rounds'
    which are implemented by a round function which can optionally be speeded
    up using tables.  The basic tables are each 256 32-bit words, with either
    one or four tables being required for each round function depending on
    how much speed is required. The encryption and decryption round functions
    are different and the last encryption and decrytpion round functions are
    different again making four different round functions in all.

    This means that:
      1. Normal encryption and decryption rounds can each use either 0, 1
         or 4 tables and table spaces of 0, 1024 or 4096 bytes each.
      2. The last encryption and decryption rounds can also use either 0, 1
         or 4 tables and table spaces of 0, 1024 or 4096 bytes each.

    Include or exclude the appropriate definitions below to set the number
    of tables used by this implementation.
*/

#if 1   /* set tables for the normal encryption round */
#  define ENC_ROUND   FOUR_TABLES
#elif 0
#  define ENC_ROUND   ONE_TABLE
#else
#  define ENC_ROUND   NO_TABLES
#endif

#if 1   /* set tables for the last encryption round */
#  define LAST_ENC_ROUND  FOUR_TABLES
#elif 0
#  define LAST_ENC_ROUND  ONE_TABLE
#else
#  define LAST_ENC_ROUND  NO_TABLES
#endif

#if 1   /* set tables for the normal decryption round */
#  define DEC_ROUND   FOUR_TABLES
#elif 0
#  define DEC_ROUND   ONE_TABLE
#else
#  define DEC_ROUND   NO_TABLES
#endif

#if 1   /* set tables for the last decryption round */
#  define LAST_DEC_ROUND  FOUR_TABLES
#elif 0
#  define LAST_DEC_ROUND  ONE_TABLE
#else
#  define LAST_DEC_ROUND  NO_TABLES
#endif

/*  The decryption key schedule can be speeded up with tables in the same
    way that the round functions can.  Include or exclude the following
    defines to set this requirement.
*/
#if 1
#  define KEY_SCHED   FOUR_TABLES
#elif 0
#  define KEY_SCHED   ONE_TABLE
#else
#  define KEY_SCHED   NO_TABLES
#endif

/*  ---- END OF USER CONFIGURED OPTIONS ---- */

/* VIA ACE support is only available for VC++ and GCC */

#if !defined( _MSC_VER ) && !defined( __GNUC__ )
#  if defined( ASSUME_VIA_ACE_PRESENT )
#    undef ASSUME_VIA_ACE_PRESENT
#  endif
#  if defined( USE_VIA_ACE_IF_PRESENT )
#    undef USE_VIA_ACE_IF_PRESENT
#  endif
#endif

#if defined( ASSUME_VIA_ACE_PRESENT ) && !defined( USE_VIA_ACE_IF_PRESENT )
#  define USE_VIA_ACE_IF_PRESENT
#endif

#if defined( USE_VIA_ACE_IF_PRESENT ) && !defined ( AES_REV_DKS )
#  define AES_REV_DKS
#endif

/* Assembler support requires the use of platform byte order */

#if ( defined( ASM_X86_V1C ) || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C ) ) \
    && (ALGORITHM_BYTE_ORDER != PLATFORM_BYTE_ORDER)
#  undef  ALGORITHM_BYTE_ORDER
#  define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER
#endif

/* In this implementation the columns of the state array are each held in
   32-bit words. The state array can be held in various ways: in an array
   of words, in a number of individual word variables or in a number of
   processor registers. The following define maps a variable name x and
   a column number c to the way the state array variable is to be held.
   The first define below maps the state into an array x[c] whereas the
   second form maps the state into a number of individual variables x0,
   x1, etc.  Another form could map individual state colums to machine
   register names.
*/

#if defined( ARRAYS )
#  define s(x,c) x[c]
#else
#  define s(x,c) x##c
#endif

/*  This implementation provides subroutines for encryption, decryption
    and for setting the three key lengths (separately) for encryption
    and decryption. Since not all functions are needed, masks are set
    up here to determine which will be implemented in C
*/

#if !defined( AES_ENCRYPT )
#  define EFUNCS_IN_C   0
#elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \
    || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C )
#  define EFUNCS_IN_C   ENC_KEYING_IN_C
#elif !defined( ASM_X86_V2 )
#  define EFUNCS_IN_C   ( ENCRYPTION_IN_C | ENC_KEYING_IN_C )
#else
#  define EFUNCS_IN_C   0
#endif

#if !defined( AES_DECRYPT )
#  define DFUNCS_IN_C   0
#elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \
    || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C )
#  define DFUNCS_IN_C   DEC_KEYING_IN_C
#elif !defined( ASM_X86_V2 )
#  define DFUNCS_IN_C   ( DECRYPTION_IN_C | DEC_KEYING_IN_C )
#else
#  define DFUNCS_IN_C   0
#endif

#define FUNCS_IN_C  ( EFUNCS_IN_C | DFUNCS_IN_C )

/* END OF CONFIGURATION OPTIONS */

#define RC_LENGTH   (5 * (AES_BLOCK_SIZE / 4 - 2))

/* Disable or report errors on some combinations of options */

#if ENC_ROUND == NO_TABLES && LAST_ENC_ROUND != NO_TABLES
#  undef  LAST_ENC_ROUND
#  define LAST_ENC_ROUND  NO_TABLES
#elif ENC_ROUND == ONE_TABLE && LAST_ENC_ROUND == FOUR_TABLES
#  undef  LAST_ENC_ROUND
#  define LAST_ENC_ROUND  ONE_TABLE
#endif

#if ENC_ROUND == NO_TABLES && ENC_UNROLL != NONE
#  undef  ENC_UNROLL
#  define ENC_UNROLL  NONE
#endif

#if DEC_ROUND == NO_TABLES && LAST_DEC_ROUND != NO_TABLES
#  undef  LAST_DEC_ROUND
#  define LAST_DEC_ROUND  NO_TABLES
#elif DEC_ROUND == ONE_TABLE && LAST_DEC_ROUND == FOUR_TABLES
#  undef  LAST_DEC_ROUND
#  define LAST_DEC_ROUND  ONE_TABLE
#endif

#if DEC_ROUND == NO_TABLES && DEC_UNROLL != NONE
#  undef  DEC_UNROLL
#  define DEC_UNROLL  NONE
#endif

#if defined( bswap32 )
#  define aes_sw32    bswap32
#elif defined( bswap_32 )
#  define aes_sw32    bswap_32
#else
#  define brot(x,n)   (((uint_32t)(x) <<  n) | ((uint_32t)(x) >> (32 - n)))
#  define aes_sw32(x) ((brot((x),8) & 0x00ff00ff) | (brot((x),24) & 0xff00ff00))
#endif

/*  upr(x,n):  rotates bytes within words by n positions, moving bytes to
               higher index positions with wrap around into low positions
    ups(x,n):  moves bytes by n positions to higher index positions in
               words but without wrap around
    bval(x,n): extracts a byte from a word

    WARNING:   The definitions given here are intended only for use with
               unsigned variables and with shift counts that are compile
               time constants
*/

#if ( ALGORITHM_BYTE_ORDER == IS_LITTLE_ENDIAN )
#  define upr(x,n)      (((uint_32t)(x) << (8 * (n))) | ((uint_32t)(x) >> (32 - 8 * (n))))
#  define ups(x,n)      ((uint_32t) (x) << (8 * (n)))
#  define bval(x,n)     to_byte((x) >> (8 * (n)))
#  define bytes2word(b0, b1, b2, b3)  \
        (((uint_32t)(b3) << 24) | ((uint_32t)(b2) << 16) | ((uint_32t)(b1) << 8) | (b0))
#endif

#if ( ALGORITHM_BYTE_ORDER == IS_BIG_ENDIAN )
#  define upr(x,n)      (((uint_32t)(x) >> (8 * (n))) | ((uint_32t)(x) << (32 - 8 * (n))))
#  define ups(x,n)      ((uint_32t) (x) >> (8 * (n)))
#  define bval(x,n)     to_byte((x) >> (24 - 8 * (n)))
#  define bytes2word(b0, b1, b2, b3)  \
        (((uint_32t)(b0) << 24) | ((uint_32t)(b1) << 16) | ((uint_32t)(b2) << 8) | (b3))
#endif

#if defined( SAFE_IO )
#  define word_in(x,c)    bytes2word(((const uint_8t*)(x)+4*c)[0], ((const uint_8t*)(x)+4*c)[1], \
                                   ((const uint_8t*)(x)+4*c)[2], ((const uint_8t*)(x)+4*c)[3])
#  define word_out(x,c,v) { ((uint_8t*)(x)+4*c)[0] = bval(v,0); ((uint_8t*)(x)+4*c)[1] = bval(v,1); \
                          ((uint_8t*)(x)+4*c)[2] = bval(v,2); ((uint_8t*)(x)+4*c)[3] = bval(v,3); }
#elif ( ALGORITHM_BYTE_ORDER == PLATFORM_BYTE_ORDER )
#  define word_in(x,c)    (*((uint_32t*)(x)+(c)))
#  define word_out(x,c,v) (*((uint_32t*)(x)+(c)) = (v))
#else
#  define word_in(x,c)    aes_sw32(*((uint_32t*)(x)+(c)))
#  define word_out(x,c,v) (*((uint_32t*)(x)+(c)) = aes_sw32(v))
#endif

/* the finite field modular polynomial and elements */

#define WPOLY   0x011b
#define BPOLY     0x1b

/* multiply four bytes in GF(2^8) by 'x' {02} in parallel */

#define gf_c1  0x80808080
#define gf_c2  0x7f7f7f7f
#define gf_mulx(x)  ((((x) & gf_c2) << 1) ^ ((((x) & gf_c1) >> 7) * BPOLY))

/* The following defines provide alternative definitions of gf_mulx that might
   give improved performance if a fast 32-bit multiply is not available. Note
   that a temporary variable u needs to be defined where gf_mulx is used.

#define gf_mulx(x) (u = (x) & gf_c1, u |= (u >> 1), ((x) & gf_c2) << 1) ^ ((u >> 3) | (u >> 6))
#define gf_c4  (0x01010101 * BPOLY)
#define gf_mulx(x) (u = (x) & gf_c1, ((x) & gf_c2) << 1) ^ ((u - (u >> 7)) & gf_c4)
*/

/* Work out which tables are needed for the different options   */

#if defined( ASM_X86_V1C )
#  if defined( ENC_ROUND )
#    undef  ENC_ROUND
#  endif
#  define ENC_ROUND   FOUR_TABLES
#  if defined( LAST_ENC_ROUND )
#    undef  LAST_ENC_ROUND
#  endif
#  define LAST_ENC_ROUND  FOUR_TABLES
#  if defined( DEC_ROUND )
#    undef  DEC_ROUND
#  endif
#  define DEC_ROUND   FOUR_TABLES
#  if defined( LAST_DEC_ROUND )
#    undef  LAST_DEC_ROUND
#  endif
#  define LAST_DEC_ROUND  FOUR_TABLES
#  if defined( KEY_SCHED )
#    undef  KEY_SCHED
#    define KEY_SCHED   FOUR_TABLES
#  endif
#endif

#if ( FUNCS_IN_C & ENCRYPTION_IN_C ) || defined( ASM_X86_V1C )
#  if ENC_ROUND == ONE_TABLE
#    define FT1_SET
#  elif ENC_ROUND == FOUR_TABLES
#    define FT4_SET
#  else
#    define SBX_SET
#  endif
#  if LAST_ENC_ROUND == ONE_TABLE
#    define FL1_SET
#  elif LAST_ENC_ROUND == FOUR_TABLES
#    define FL4_SET
#  elif !defined( SBX_SET )
#    define SBX_SET
#  endif
#endif

#if ( FUNCS_IN_C & DECRYPTION_IN_C ) || defined( ASM_X86_V1C )
#  if DEC_ROUND == ONE_TABLE
#    define IT1_SET
#  elif DEC_ROUND == FOUR_TABLES
#    define IT4_SET
#  else
#    define ISB_SET
#  endif
#  if LAST_DEC_ROUND == ONE_TABLE
#    define IL1_SET
#  elif LAST_DEC_ROUND == FOUR_TABLES
#    define IL4_SET
#  elif !defined(ISB_SET)
#    define ISB_SET
#  endif
#endif

#if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )))
#  if ((FUNCS_IN_C & ENC_KEYING_IN_C) || (FUNCS_IN_C & DEC_KEYING_IN_C))
#    if KEY_SCHED == ONE_TABLE
#      if !defined( FL1_SET )  && !defined( FL4_SET ) 
#        define LS1_SET
#      endif
#    elif KEY_SCHED == FOUR_TABLES
#      if !defined( FL4_SET )
#        define LS4_SET
#      endif
#    elif !defined( SBX_SET )
#      define SBX_SET
#    endif
#  endif
#  if (FUNCS_IN_C & DEC_KEYING_IN_C)
#    if KEY_SCHED == ONE_TABLE
#      define IM1_SET
#    elif KEY_SCHED == FOUR_TABLES
#      define IM4_SET
#    elif !defined( SBX_SET )
#      define SBX_SET
#    endif
#  endif
#endif

/* generic definitions of Rijndael macros that use tables    */

#define no_table(x,box,vf,rf,c) bytes2word( \
    box[bval(vf(x,0,c),rf(0,c))], \
    box[bval(vf(x,1,c),rf(1,c))], \
    box[bval(vf(x,2,c),rf(2,c))], \
    box[bval(vf(x,3,c),rf(3,c))])

#define one_table(x,op,tab,vf,rf,c) \
 (     tab[bval(vf(x,0,c),rf(0,c))] \
  ^ op(tab[bval(vf(x,1,c),rf(1,c))],1) \
  ^ op(tab[bval(vf(x,2,c),rf(2,c))],2) \
  ^ op(tab[bval(vf(x,3,c),rf(3,c))],3))

#define four_tables(x,tab,vf,rf,c) \
 (  tab[0][bval(vf(x,0,c),rf(0,c))] \
  ^ tab[1][bval(vf(x,1,c),rf(1,c))] \
  ^ tab[2][bval(vf(x,2,c),rf(2,c))] \
  ^ tab[3][bval(vf(x,3,c),rf(3,c))])

#define vf1(x,r,c)  (x)
#define rf1(r,c)    (r)
#define rf2(r,c)    ((8+r-c)&3)

/* perform forward and inverse column mix operation on four bytes in long word x in */
/* parallel. NOTE: x must be a simple variable, NOT an expression in these macros.  */

#if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C ))) 

#if defined( FM4_SET )      /* not currently used */
#  define fwd_mcol(x)       four_tables(x,t_use(f,m),vf1,rf1,0)
#elif defined( FM1_SET )    /* not currently used */
#  define fwd_mcol(x)       one_table(x,upr,t_use(f,m),vf1,rf1,0)
#else
#  define dec_fmvars        uint_32t g2
#  define fwd_mcol(x)       (g2 = gf_mulx(x), g2 ^ upr((x) ^ g2, 3) ^ upr((x), 2) ^ upr((x), 1))
#endif

#if defined( IM4_SET )
#  define inv_mcol(x)       four_tables(x,t_use(i,m),vf1,rf1,0)
#elif defined( IM1_SET )
#  define inv_mcol(x)       one_table(x,upr,t_use(i,m),vf1,rf1,0)
#else
#  define dec_imvars        uint_32t g2, g4, g9
#  define inv_mcol(x)       (g2 = gf_mulx(x), g4 = gf_mulx(g2), g9 = (x) ^ gf_mulx(g4), g4 ^= g9, \
                            (x) ^ g2 ^ g4 ^ upr(g2 ^ g9, 3) ^ upr(g4, 2) ^ upr(g9, 1))
#endif

#if defined( FL4_SET )
#  define ls_box(x,c)       four_tables(x,t_use(f,l),vf1,rf2,c)
#elif defined( LS4_SET )
#  define ls_box(x,c)       four_tables(x,t_use(l,s),vf1,rf2,c)
#elif defined( FL1_SET )
#  define ls_box(x,c)       one_table(x,upr,t_use(f,l),vf1,rf2,c)
#elif defined( LS1_SET )
#  define ls_box(x,c)       one_table(x,upr,t_use(l,s),vf1,rf2,c)
#else
#  define ls_box(x,c)       no_table(x,t_use(s,box),vf1,rf2,c)
#endif

#endif

#if defined( ASM_X86_V1C ) && defined( AES_DECRYPT ) && !defined( ISB_SET )
#  define ISB_SET
#endif

#endif
/*
---------------------------------------------------------------------------
Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.

The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:

  source code distributions include the above copyright notice, this
  list of conditions and the following disclaimer;

  binary distributions include the above copyright notice, this list
  of conditions and the following disclaimer in their documentation.

This software is provided 'as is' with no explicit or implied warranties
in respect of its operation, including, but not limited to, correctness
and fitness for purpose.
---------------------------------------------------------------------------
Issue Date: 20/12/2007
*/

#define DO_TABLES

#include "aes.h"
#include "aesopt.h"

#if defined(FIXED_TABLES)

#define sb_data(w) {\
    w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\
    w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\
    w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\
    w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\
    w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\
    w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\
    w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\
    w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\
    w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\
    w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\
    w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\
    w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\
    w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\
    w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\
    w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\
    w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\
    w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\
    w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\
    w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\
    w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\
    w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\
    w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\
    w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\
    w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\
    w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\
    w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\
    w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\
    w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\
    w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\
    w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\
    w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\
    w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) }

#define isb_data(w) {\
    w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\
    w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\
    w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\
    w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\
    w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\
    w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\
    w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\
    w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\
    w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\
    w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\
    w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\
    w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\
    w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\
    w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\
    w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\
    w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\
    w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\
    w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\
    w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\
    w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\
    w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\
    w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\
    w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\
    w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\
    w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\
    w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\
    w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\
    w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\
    w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\
    w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\
    w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\
    w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d) }

#define mm_data(w) {\
    w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\
    w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\
    w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\
    w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\
    w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\
    w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\
    w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\
    w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\
    w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\
    w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\
    w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\
    w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\
    w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\
    w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\
    w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\
    w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\
    w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\
    w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\
    w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\
    w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\
    w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\
    w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\
    w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\
    w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\
    w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\
    w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\
    w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\
    w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\
    w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\
    w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\
    w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\
    w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) }

#define rc_data(w) {\
    w(0x01), w(0x02), w(0x04), w(0x08), w(0x10),w(0x20), w(0x40), w(0x80),\
    w(0x1b), w(0x36) }

#define h0(x)   (x)

#define w0(p)   bytes2word(p, 0, 0, 0)
#define w1(p)   bytes2word(0, p, 0, 0)
#define w2(p)   bytes2word(0, 0, p, 0)
#define w3(p)   bytes2word(0, 0, 0, p)

#define u0(p)   bytes2word(f2(p), p, p, f3(p))
#define u1(p)   bytes2word(f3(p), f2(p), p, p)
#define u2(p)   bytes2word(p, f3(p), f2(p), p)
#define u3(p)   bytes2word(p, p, f3(p), f2(p))

#define v0(p)   bytes2word(fe(p), f9(p), fd(p), fb(p))
#define v1(p)   bytes2word(fb(p), fe(p), f9(p), fd(p))
#define v2(p)   bytes2word(fd(p), fb(p), fe(p), f9(p))
#define v3(p)   bytes2word(f9(p), fd(p), fb(p), fe(p))

#endif

#if defined(FIXED_TABLES) || !defined(FF_TABLES)

#define f2(x)   ((x<<1) ^ (((x>>7) & 1) * WPOLY))
#define f4(x)   ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY))
#define f8(x)   ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) \
                        ^ (((x>>5) & 4) * WPOLY))
#define f3(x)   (f2(x) ^ x)
#define f9(x)   (f8(x) ^ x)
#define fb(x)   (f8(x) ^ f2(x) ^ x)
#define fd(x)   (f8(x) ^ f4(x) ^ x)
#define fe(x)   (f8(x) ^ f4(x) ^ f2(x))

#else

#define f2(x) ((x) ? pow[log[x] + 0x19] : 0)
#define f3(x) ((x) ? pow[log[x] + 0x01] : 0)
#define f9(x) ((x) ? pow[log[x] + 0xc7] : 0)
#define fb(x) ((x) ? pow[log[x] + 0x68] : 0)
#define fd(x) ((x) ? pow[log[x] + 0xee] : 0)
#define fe(x) ((x) ? pow[log[x] + 0xdf] : 0)

#endif

#include "aestab.h"

#if defined(__cplusplus)
extern "C"
{
#endif

#if defined(FIXED_TABLES)

/* implemented in case of wrong call for fixed tables */

AES_RETURN aes_init(void)
{
    return EXIT_SUCCESS;
}

#else   /*  Generate the tables for the dynamic table option */

#if defined(FF_TABLES)

#define gf_inv(x)   ((x) ? pow[ 255 - log[x]] : 0)

#else 

/*  It will generally be sensible to use tables to compute finite
    field multiplies and inverses but where memory is scarse this
    code might sometimes be better. But it only has effect during
    initialisation so its pretty unimportant in overall terms.
*/

/*  return 2 ^ (n - 1) where n is the bit number of the highest bit
    set in x with x in the range 1 < x < 0x00000200.   This form is
    used so that locals within fi can be bytes rather than words
*/

static uint_8t hibit(const uint_32t x)
{   uint_8t r = (uint_8t)((x >> 1) | (x >> 2));

    r |= (r >> 2);
    r |= (r >> 4);
    return (r + 1) >> 1;
}

/* return the inverse of the finite field element x */

static uint_8t gf_inv(const uint_8t x)
{   uint_8t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0;

    if(x < 2) 
        return x;

    for( ; ; )
    {
        if(n1)
            while(n2 >= n1)             /* divide polynomial p2 by p1    */
            {
                n2 /= n1;               /* shift smaller polynomial left */ 
                p2 ^= (p1 * n2) & 0xff; /* and remove from larger one    */
                v2 ^= v1 * n2;          /* shift accumulated value and   */ 
                n2 = hibit(p2);         /* add into result               */
            }
        else
            return v1;

        if(n2)                          /* repeat with values swapped    */ 
            while(n1 >= n2)
            {
                n1 /= n2; 
                p1 ^= p2 * n1; 
                v1 ^= v2 * n1; 
                n1 = hibit(p1);
            }
        else
            return v2;
    }
}

#endif

/* The forward and inverse affine transformations used in the S-box */
uint_8t fwd_affine(const uint_8t x)
{   uint_32t w = x;
    w ^= (w << 1) ^ (w << 2) ^ (w << 3) ^ (w << 4);
    return 0x63 ^ ((w ^ (w >> 8)) & 0xff);
}

uint_8t inv_affine(const uint_8t x)
{   uint_32t w = x;
    w = (w << 1) ^ (w << 3) ^ (w << 6);
    return 0x05 ^ ((w ^ (w >> 8)) & 0xff);
}

static int init = 0;

AES_RETURN aes_init(void)
{   uint_32t  i, w;

#if defined(FF_TABLES)

    uint_8t  pow[512], log[256];

    if(init)
        return EXIT_SUCCESS;
    /*  log and power tables for GF(2^8) finite field with
        WPOLY as modular polynomial - the simplest primitive
        root is 0x03, used here to generate the tables
    */

    i = 0; w = 1;
    do
    {
        pow[i] = (uint_8t)w;
        pow[i + 255] = (uint_8t)w;
        log[w] = (uint_8t)i++;
        w ^=  (w << 1) ^ (w & 0x80 ? WPOLY : 0);
    }
    while (w != 1);

#else
    if(init)
        return EXIT_SUCCESS;
#endif

    for(i = 0, w = 1; i < RC_LENGTH; ++i)
    {
        t_set(r,c)[i] = bytes2word(w, 0, 0, 0);
        w = f2(w);
    }

    for(i = 0; i < 256; ++i)
    {   uint_8t    b;

        b = fwd_affine(gf_inv((uint_8t)i));
        w = bytes2word(f2(b), b, b, f3(b));

#if defined( SBX_SET )
        t_set(s,box)[i] = b;
#endif

#if defined( FT1_SET )                 /* tables for a normal encryption round */
        t_set(f,n)[i] = w;
#endif
#if defined( FT4_SET )
        t_set(f,n)[0][i] = w;
        t_set(f,n)[1][i] = upr(w,1);
        t_set(f,n)[2][i] = upr(w,2);
        t_set(f,n)[3][i] = upr(w,3);
#endif
        w = bytes2word(b, 0, 0, 0);

#if defined( FL1_SET )            /* tables for last encryption round (may also   */
        t_set(f,l)[i] = w;        /* be used in the key schedule)                 */
#endif
#if defined( FL4_SET )
        t_set(f,l)[0][i] = w;
        t_set(f,l)[1][i] = upr(w,1);
        t_set(f,l)[2][i] = upr(w,2);
        t_set(f,l)[3][i] = upr(w,3);
#endif

#if defined( LS1_SET )			/* table for key schedule if t_set(f,l) above is*/
        t_set(l,s)[i] = w;      /* not of the required form                     */
#endif
#if defined( LS4_SET )
        t_set(l,s)[0][i] = w;
        t_set(l,s)[1][i] = upr(w,1);
        t_set(l,s)[2][i] = upr(w,2);
        t_set(l,s)[3][i] = upr(w,3);
#endif

        b = gf_inv(inv_affine((uint_8t)i));
        w = bytes2word(fe(b), f9(b), fd(b), fb(b));

#if defined( IM1_SET )			/* tables for the inverse mix column operation  */
        t_set(i,m)[b] = w;
#endif
#if defined( IM4_SET )
        t_set(i,m)[0][b] = w;
        t_set(i,m)[1][b] = upr(w,1);
        t_set(i,m)[2][b] = upr(w,2);
        t_set(i,m)[3][b] = upr(w,3);
#endif

#if defined( ISB_SET )
        t_set(i,box)[i] = b;
#endif
#if defined( IT1_SET )			/* tables for a normal decryption round */
        t_set(i,n)[i] = w;
#endif
#if defined( IT4_SET )
        t_set(i,n)[0][i] = w;
        t_set(i,n)[1][i] = upr(w,1);
        t_set(i,n)[2][i] = upr(w,2);
        t_set(i,n)[3][i] = upr(w,3);
#endif
        w = bytes2word(b, 0, 0, 0);
#if defined( IL1_SET )			/* tables for last decryption round */
        t_set(i,l)[i] = w;
#endif
#if defined( IL4_SET )
        t_set(i,l)[0][i] = w;
        t_set(i,l)[1][i] = upr(w,1);
        t_set(i,l)[2][i] = upr(w,2);
        t_set(i,l)[3][i] = upr(w,3);
#endif
    }
    init = 1;
    return EXIT_SUCCESS;
}

#endif

#if defined(__cplusplus)
}
#endif

/*
---------------------------------------------------------------------------
Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.

The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:

  source code distributions include the above copyright notice, this
  list of conditions and the following disclaimer;

  binary distributions include the above copyright notice, this list
  of conditions and the following disclaimer in their documentation.

This software is provided 'as is' with no explicit or implied warranties
in respect of its operation, including, but not limited to, correctness
and fitness for purpose.
---------------------------------------------------------------------------
Issue Date: 20/12/2007

 This file contains the code for declaring the tables needed to implement
 AES. The file aesopt.h is assumed to be included before this header file.
 If there are no global variables, the definitions here can be used to put
 the AES tables in a structure so that a pointer can then be added to the
 AES context to pass them to the AES routines that need them.   If this
 facility is used, the calling program has to ensure that this pointer is
 managed appropriately.  In particular, the value of the t_dec(in,it) item
 in the table structure must be set to zero in order to ensure that the
 tables are initialised. In practice the three code sequences in aeskey.c
 that control the calls to aes_init() and the aes_init() routine itself will
 have to be changed for a specific implementation. If global variables are
 available it will generally be preferable to use them with the precomputed
 FIXED_TABLES option that uses static global tables.

 The following defines can be used to control the way the tables
 are defined, initialised and used in embedded environments that
 require special features for these purposes

    the 't_dec' construction is used to declare fixed table arrays
    the 't_set' construction is used to set fixed table values
    the 't_use' construction is used to access fixed table values

    256 byte tables:

        t_xxx(s,box)    => forward S box
        t_xxx(i,box)    => inverse S box

    256 32-bit word OR 4 x 256 32-bit word tables:

        t_xxx(f,n)      => forward normal round
        t_xxx(f,l)      => forward last round
        t_xxx(i,n)      => inverse normal round
        t_xxx(i,l)      => inverse last round
        t_xxx(l,s)      => key schedule table
        t_xxx(i,m)      => key schedule table

    Other variables and tables:

        t_xxx(r,c)      => the rcon table
*/

#if !defined( _AESTAB_H )
#define _AESTAB_H

#if defined(__cplusplus)
extern "C" {
#endif

#define t_dec(m,n) t_##m##n
#define t_set(m,n) t_##m##n
#define t_use(m,n) t_##m##n

#if defined(FIXED_TABLES)
#  if !defined( __GNUC__ ) && (defined( __MSDOS__ ) || defined( __WIN16__ ))
/*   make tables far data to avoid using too much DGROUP space (PG) */
#    define CONST const far
#  else
#    define CONST const
#  endif
#else
#  define CONST
#endif

#if defined(DO_TABLES)
#  define EXTERN
#else
#  define EXTERN extern
#endif

#if defined(_MSC_VER) && defined(TABLE_ALIGN)
#define ALIGN __declspec(align(TABLE_ALIGN))
#else
#define ALIGN
#endif

#if defined( __WATCOMC__ ) && ( __WATCOMC__ >= 1100 )
#  define XP_DIR __cdecl
#else
#  define XP_DIR
#endif

#if defined(DO_TABLES) && defined(FIXED_TABLES)
#define d_1(t,n,b,e)       EXTERN ALIGN CONST XP_DIR t n[256]    =   b(e)
#define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256] = { b(e), b(f), b(g), b(h) }
EXTERN ALIGN CONST uint_32t t_dec(r,c)[RC_LENGTH] = rc_data(w0);
#else
#define d_1(t,n,b,e)       EXTERN ALIGN CONST XP_DIR t n[256]
#define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256]
EXTERN ALIGN CONST uint_32t t_dec(r,c)[RC_LENGTH];
#endif

#if defined( SBX_SET )
    d_1(uint_8t, t_dec(s,box), sb_data, h0);
#endif
#if defined( ISB_SET )
    d_1(uint_8t, t_dec(i,box), isb_data, h0);
#endif

#if defined( FT1_SET )
    d_1(uint_32t, t_dec(f,n), sb_data, u0);
#endif
#if defined( FT4_SET )
    d_4(uint_32t, t_dec(f,n), sb_data, u0, u1, u2, u3);
#endif

#if defined( FL1_SET )
    d_1(uint_32t, t_dec(f,l), sb_data, w0);
#endif
#if defined( FL4_SET )
    d_4(uint_32t, t_dec(f,l), sb_data, w0, w1, w2, w3);
#endif

#if defined( IT1_SET )
    d_1(uint_32t, t_dec(i,n), isb_data, v0);
#endif
#if defined( IT4_SET )
    d_4(uint_32t, t_dec(i,n), isb_data, v0, v1, v2, v3);
#endif

#if defined( IL1_SET )
    d_1(uint_32t, t_dec(i,l), isb_data, w0);
#endif
#if defined( IL4_SET )
    d_4(uint_32t, t_dec(i,l), isb_data, w0, w1, w2, w3);
#endif

#if defined( LS1_SET )
#if defined( FL1_SET )
#undef  LS1_SET
#else
    d_1(uint_32t, t_dec(l,s), sb_data, w0);
#endif
#endif

#if defined( LS4_SET )
#if defined( FL4_SET )
#undef  LS4_SET
#else
    d_4(uint_32t, t_dec(l,s), sb_data, w0, w1, w2, w3);
#endif
#endif

#if defined( IM1_SET )
    d_1(uint_32t, t_dec(i,m), mm_data, v0);
#endif
#if defined( IM4_SET )
    d_4(uint_32t, t_dec(i,m), mm_data, v0, v1, v2, v3);
#endif

#if defined(__cplusplus)
}
#endif

#endif
/*
---------------------------------------------------------------------------
Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.

The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:

  source code distributions include the above copyright notice, this
  list of conditions and the following disclaimer;

  binary distributions include the above copyright notice, this list
  of conditions and the following disclaimer in their documentation.

This software is provided 'as is' with no explicit or implied warranties
in respect of its operation, including, but not limited to, correctness
and fitness for purpose.
---------------------------------------------------------------------------
Issue Date: 20/12/2007
*/

#ifndef _BRG_ENDIAN_H
#define _BRG_ENDIAN_H

#define IS_BIG_ENDIAN      4321 /* byte 0 is most significant (mc68k) */
#define IS_LITTLE_ENDIAN   1234 /* byte 0 is least significant (i386) */

/* Include files where endian defines and byteswap functions may reside */
#if defined( __sun )
#  include <sys/isa_defs.h>
#elif defined( __FreeBSD__ ) || defined( __OpenBSD__ ) || defined( __NetBSD__ )
#  include <sys/endian.h>
#elif defined( BSD ) && ( BSD >= 199103 ) || defined( __APPLE__ ) || \
      defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ )
#  include <machine/endian.h>
#elif defined( __linux__ ) || defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
#  if !defined( __MINGW32__ ) && !defined( _AIX )
#    include <endian.h>
#    if !defined( __BEOS__ )
#      include <byteswap.h>
#    endif
#  endif
#endif

/* Now attempt to set the define for platform byte order using any  */
/* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, which  */
/* seem to encompass most endian symbol definitions                 */

#if defined( BIG_ENDIAN ) && defined( LITTLE_ENDIAN )
#  if defined( BYTE_ORDER ) && BYTE_ORDER == BIG_ENDIAN
#    define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
#  elif defined( BYTE_ORDER ) && BYTE_ORDER == LITTLE_ENDIAN
#    define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
#  endif
#elif defined( BIG_ENDIAN )
#  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
#elif defined( LITTLE_ENDIAN )
#  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
#endif

#if defined( _BIG_ENDIAN ) && defined( _LITTLE_ENDIAN )
#  if defined( _BYTE_ORDER ) && _BYTE_ORDER == _BIG_ENDIAN
#    define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
#  elif defined( _BYTE_ORDER ) && _BYTE_ORDER == _LITTLE_ENDIAN
#    define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
#  endif
#elif defined( _BIG_ENDIAN )
#  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
#elif defined( _LITTLE_ENDIAN )
#  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
#endif

#if defined( __BIG_ENDIAN ) && defined( __LITTLE_ENDIAN )
#  if defined( __BYTE_ORDER ) && __BYTE_ORDER == __BIG_ENDIAN
#    define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
#  elif defined( __BYTE_ORDER ) && __BYTE_ORDER == __LITTLE_ENDIAN
#    define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
#  endif
#elif defined( __BIG_ENDIAN )
#  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
#elif defined( __LITTLE_ENDIAN )
#  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
#endif

#if defined( __BIG_ENDIAN__ ) && defined( __LITTLE_ENDIAN__ )
#  if defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __BIG_ENDIAN__
#    define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
#  elif defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __LITTLE_ENDIAN__
#    define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
#  endif
#elif defined( __BIG_ENDIAN__ )
#  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
#elif defined( __LITTLE_ENDIAN__ )
#  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
#endif

/*  if the platform byte order could not be determined, then try to */
/*  set this define using common machine defines                    */
#if !defined(PLATFORM_BYTE_ORDER)

#if   defined( __alpha__ ) || defined( __alpha ) || defined( i386 )       || \
      defined( __i386__ )  || defined( _M_I86 )  || defined( _M_IX86 )    || \
      defined( __OS2__ )   || defined( sun386 )  || defined( __TURBOC__ ) || \
      defined( vax )       || defined( vms )     || defined( VMS )        || \
      defined( __VMS )     || defined( _M_X64 )
#  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN

#elif defined( AMIGA )   || defined( applec )    || defined( __AS400__ )  || \
      defined( _CRAY )   || defined( __hppa )    || defined( __hp9000 )   || \
      defined( ibm370 )  || defined( mc68000 )   || defined( m68k )       || \
      defined( __MRC__ ) || defined( __MVS__ )   || defined( __MWERKS__ ) || \
      defined( sparc )   || defined( __sparc)    || defined( SYMANTEC_C ) || \
      defined( __VOS__ ) || defined( __TIGCC__ ) || defined( __TANDEM )   || \
      defined( THINK_C ) || defined( __VMCMS__ ) || defined( _AIX )
#  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN

#elif 0     /* **** EDIT HERE IF NECESSARY **** */
#  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN
#elif 0     /* **** EDIT HERE IF NECESSARY **** */
#  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN
#else
#  error Please edit lines 126 or 128 in brg_endian.h to set the platform byte order
#endif

#endif

#endif
/*
---------------------------------------------------------------------------
Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.

The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:

  source code distributions include the above copyright notice, this
  list of conditions and the following disclaimer;

  binary distributions include the above copyright notice, this list
  of conditions and the following disclaimer in their documentation.

This software is provided 'as is' with no explicit or implied warranties
in respect of its operation, including, but not limited to, correctness
and fitness for purpose.
---------------------------------------------------------------------------
Issue Date: 20/12/2007

 The unsigned integer types defined here are of the form uint_<nn>t where
 <nn> is the length of the type; for example, the unsigned 32-bit type is
 'uint_32t'.  These are NOT the same as the 'C99 integer types' that are
 defined in the inttypes.h and stdint.h headers since attempts to use these
 types have shown that support for them is still highly variable.  However,
 since the latter are of the form uint<nn>_t, a regular expression search
 and replace (in VC++ search on 'uint_{:z}t' and replace with 'uint\1_t')
 can be used to convert the types used here to the C99 standard types.
*/

#ifndef _BRG_TYPES_H
#define _BRG_TYPES_H

#if defined(__cplusplus)
extern "C" {
#endif

#include <limits.h>

#if defined( _MSC_VER ) && ( _MSC_VER >= 1300 )
#  include <stddef.h>
#  define ptrint_t intptr_t
#elif defined( __ECOS__ )
#  define intptr_t unsigned int
#  define ptrint_t intptr_t
#elif defined( __GNUC__ ) && ( __GNUC__ >= 3 )
#  include <stdint.h>
#  define ptrint_t intptr_t
#else
#  define ptrint_t int
#endif

#ifndef BRG_UI8
#  define BRG_UI8
#  if UCHAR_MAX == 255u
     typedef unsigned char uint_8t;
#  else
#    error Please define uint_8t as an 8-bit unsigned integer type in brg_types.h
#  endif
#endif

#ifndef BRG_UI16
#  define BRG_UI16
#  if USHRT_MAX == 65535u
     typedef unsigned short uint_16t;
#  else
#    error Please define uint_16t as a 16-bit unsigned short type in brg_types.h
#  endif
#endif

#ifndef BRG_UI32
#  define BRG_UI32
#  if UINT_MAX == 4294967295u
#    define li_32(h) 0x##h##u
     typedef unsigned int uint_32t;
#  elif ULONG_MAX == 4294967295u
#    define li_32(h) 0x##h##ul
     typedef unsigned long uint_32t;
#  elif defined( _CRAY )
#    error This code needs 32-bit data types, which Cray machines do not provide
#  else
#    error Please define uint_32t as a 32-bit unsigned integer type in brg_types.h
#  endif
#endif

#ifndef BRG_UI64
#  if defined( __BORLANDC__ ) && !defined( __MSDOS__ )
#    define BRG_UI64
#    define li_64(h) 0x##h##ui64
     typedef unsigned __int64 uint_64t;
#  elif defined( _MSC_VER ) && ( _MSC_VER < 1300 )    /* 1300 == VC++ 7.0 */
#    define BRG_UI64
#    define li_64(h) 0x##h##ui64
     typedef unsigned __int64 uint_64t;
#  elif defined( __sun ) && defined( ULONG_MAX ) && ULONG_MAX == 0xfffffffful
#    define BRG_UI64
#    define li_64(h) 0x##h##ull
     typedef unsigned long long uint_64t;
#  elif defined( __MVS__ )
#    define BRG_UI64
#    define li_64(h) 0x##h##ull
     typedef unsigned int long long uint_64t;
#  elif defined( UINT_MAX ) && UINT_MAX > 4294967295u
#    if UINT_MAX == 18446744073709551615u
#      define BRG_UI64
#      define li_64(h) 0x##h##u
       typedef unsigned int uint_64t;
#    endif
#  elif defined( ULONG_MAX ) && ULONG_MAX > 4294967295u
#    if ULONG_MAX == 18446744073709551615ul
#      define BRG_UI64
#      define li_64(h) 0x##h##ul
       typedef unsigned long uint_64t;
#    endif
#  elif defined( ULLONG_MAX ) && ULLONG_MAX > 4294967295u
#    if ULLONG_MAX == 18446744073709551615ull
#      define BRG_UI64
#      define li_64(h) 0x##h##ull
       typedef unsigned long long uint_64t;
#    endif
#  elif defined( ULONG_LONG_MAX ) && ULONG_LONG_MAX > 4294967295u
#    if ULONG_LONG_MAX == 18446744073709551615ull
#      define BRG_UI64
#      define li_64(h) 0x##h##ull
       typedef unsigned long long uint_64t;
#    endif
#  endif
#endif

#if !defined( BRG_UI64 )
#  if defined( NEED_UINT_64T )
#    error Please define uint_64t as an unsigned 64 bit type in brg_types.h
#  endif
#endif

#ifndef RETURN_VALUES
#  define RETURN_VALUES
#  if defined( DLL_EXPORT )
#    if defined( _MSC_VER ) || defined ( __INTEL_COMPILER )
#      define VOID_RETURN    __declspec( dllexport ) void __stdcall
#      define INT_RETURN     __declspec( dllexport ) int  __stdcall
#    elif defined( __GNUC__ )
#      define VOID_RETURN    __declspec( __dllexport__ ) void
#      define INT_RETURN     __declspec( __dllexport__ ) int
#    else
#      error Use of the DLL is only available on the Microsoft, Intel and GCC compilers
#    endif
#  elif defined( DLL_IMPORT )
#    if defined( _MSC_VER ) || defined ( __INTEL_COMPILER )
#      define VOID_RETURN    __declspec( dllimport ) void __stdcall
#      define INT_RETURN     __declspec( dllimport ) int  __stdcall
#    elif defined( __GNUC__ )
#      define VOID_RETURN    __declspec( __dllimport__ ) void
#      define INT_RETURN     __declspec( __dllimport__ ) int
#    else
#      error Use of the DLL is only available on the Microsoft, Intel and GCC compilers
#    endif
#  elif defined( __WATCOMC__ )
#    define VOID_RETURN  void __cdecl
#    define INT_RETURN   int  __cdecl
#  else
#    define VOID_RETURN  void
#    define INT_RETURN   int
#  endif
#endif

/*	These defines are used to detect and set the memory alignment of pointers.
    Note that offsets are in bytes.

    ALIGN_OFFSET(x,n)			return the positive or zero offset of 
                                the memory addressed by the pointer 'x' 
                                from an address that is aligned on an 
                                'n' byte boundary ('n' is a power of 2)

    ALIGN_FLOOR(x,n)			return a pointer that points to memory
                                that is aligned on an 'n' byte boundary 
                                and is not higher than the memory address
                                pointed to by 'x' ('n' is a power of 2)

    ALIGN_CEIL(x,n)				return a pointer that points to memory
                                that is aligned on an 'n' byte boundary 
                                and is not lower than the memory address
                                pointed to by 'x' ('n' is a power of 2)
*/

#define ALIGN_OFFSET(x,n)	(((ptrint_t)(x)) & ((n) - 1))
#define ALIGN_FLOOR(x,n)	((uint_8t*)(x) - ( ((ptrint_t)(x)) & ((n) - 1)))
#define ALIGN_CEIL(x,n)		((uint_8t*)(x) + (-((ptrint_t)(x)) & ((n) - 1)))

/*  These defines are used to declare buffers in a way that allows
    faster operations on longer variables to be used.  In all these
    defines 'size' must be a power of 2 and >= 8. NOTE that the 
    buffer size is in bytes but the type length is in bits

    UNIT_TYPEDEF(x,size)        declares a variable 'x' of length 
                                'size' bits

    BUFR_TYPEDEF(x,size,bsize)  declares a buffer 'x' of length 'bsize' 
                                bytes defined as an array of variables
                                each of 'size' bits (bsize must be a 
                                multiple of size / 8)

    UNIT_CAST(x,size)           casts a variable to a type of 
                                length 'size' bits

    UPTR_CAST(x,size)           casts a pointer to a pointer to a 
                                varaiable of length 'size' bits
*/

#define UI_TYPE(size)               uint_##size##t
#define UNIT_TYPEDEF(x,size)        typedef UI_TYPE(size) x
#define BUFR_TYPEDEF(x,size,bsize)  typedef UI_TYPE(size) x[bsize / (size >> 3)]
#define UNIT_CAST(x,size)           ((UI_TYPE(size) )(x))  
#define UPTR_CAST(x,size)           ((UI_TYPE(size)*)(x))

#if defined(__cplusplus)
}
#endif

#endif
#ifdef _WIN32
#include <windows.h>
#else
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#endif

#if defined(__cplusplus)
extern "C"
{
#endif

#ifdef _WIN32
int entropy_fun(unsigned char buf[], unsigned int len)
{
    HCRYPTPROV provider;
    unsigned __int64 pentium_tsc[1];
    unsigned int i;
    int result = 0;


    if (CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
    {
        result = CryptGenRandom(provider, len, buf);
        CryptReleaseContext(provider, 0);
        if (result)
            return len;
    }

    QueryPerformanceCounter((LARGE_INTEGER *)pentium_tsc);

    for(i = 0; i < 8 && i < len; ++i)
        buf[i] = ((unsigned char*)pentium_tsc)[i];

    return i;
}
#else
int entropy_fun(unsigned char buf[], unsigned int len)
{
    int frand = open("/dev/random", O_RDONLY);
    int rlen = 0;
    if (frand != -1)
    {
        rlen = (int)read(frand, buf, len);
        close(frand);
    }
    return rlen;
}
#endif

#if defined(__cplusplus)
}
#endif

#ifndef _ENTROPY_FUN_H
#define _ENTROPY_FUN_H

#if defined(__cplusplus)
extern "C"
{
#endif

int entropy_fun(unsigned char buf[], unsigned int len);

#if defined(__cplusplus)
}
#endif

#endif
/*
   ---------------------------------------------------------------------------
   Copyright (c) 2002, Dr Brian Gladman <                 >, Worcester, UK.
   All rights reserved.

   LICENSE TERMS

   The free distribution and use of this software in both source and binary
   form is allowed (with or without changes) provided that:

   1. distributions of this source code include the above copyright
      notice, this list of conditions and the following disclaimer;

   2. distributions in binary form include the above copyright
      notice, this list of conditions and the following disclaimer
      in the documentation and/or other associated materials;

   3. the copyright holder's name is not used to endorse products
      built using this software without specific written permission.

   ALTERNATIVELY, provided that this notice is retained in full, this product
   may be distributed under the terms of the GNU General Public License (GPL),
   in which case the provisions of the GPL apply INSTEAD OF those given above.

   DISCLAIMER

   This software is provided 'as is' with no explicit or implied warranties
   in respect of its properties, including, but not limited to, correctness
   and/or fitness for purpose.
   -------------------------------------------------------------------------
   Issue Date: 24/01/2003

   This file implements password based file encryption and authentication
   using AES in CTR mode, HMAC-SHA1 authentication and RFC2898 password
   based key derivation.

 */

#include <memory.h>

#include "fileenc.h"

#if defined(__cplusplus)
extern "C"
{
#endif

/* subroutine for data encryption/decryption    */
/* this could be speeded up a lot by aligning   */
/* buffers and using 32 bit operations          */

static void encr_data(unsigned char data[], unsigned long d_len, fcrypt_ctx cx[1])
{
    unsigned long i = 0, pos = cx->encr_pos;

    while (i < d_len) {
        if (pos == AES_BLOCK_SIZE) {
            unsigned int j = 0;
            /* increment encryption nonce   */
            while (j < 8 && !++cx->nonce[j])
                ++j;
            /* encrypt the nonce to form next xor buffer    */
            aes_encrypt(cx->nonce, cx->encr_bfr, cx->encr_ctx);
            pos = 0;
        }

        data[i++] ^= cx->encr_bfr[pos++];
    }

    cx->encr_pos = (unsigned int)pos;
}

int fcrypt_init(
    int mode,                               /* the mode to be used (input)          */
    const unsigned char pwd[],              /* the user specified password (input)  */
    unsigned int pwd_len,                   /* the length of the password (input)   */
    const unsigned char salt[],             /* the salt (input)                     */
#ifdef PASSWORD_VERIFIER
    unsigned char pwd_ver[PWD_VER_LENGTH],  /* 2 byte password verifier (output)    */
#endif
    fcrypt_ctx cx[1])                       /* the file encryption context (output) */
{
    unsigned char kbuf[2 * MAX_KEY_LENGTH + PWD_VER_LENGTH];

    if (pwd_len > MAX_PWD_LENGTH)
        return PASSWORD_TOO_LONG;

    if (mode < 1 || mode > 3)
        return BAD_MODE;

    cx->mode = mode;
    cx->pwd_len = pwd_len;

    /* derive the encryption and authentication keys and the password verifier   */
    derive_key(pwd, pwd_len, salt, SALT_LENGTH(mode), KEYING_ITERATIONS,
               kbuf, 2 * KEY_LENGTH(mode) + PWD_VER_LENGTH);

    /* initialise the encryption nonce and buffer pos   */
    cx->encr_pos = AES_BLOCK_SIZE;
    /* if we need a random component in the encryption  */
    /* nonce, this is where it would have to be set     */
    memset(cx->nonce, 0, AES_BLOCK_SIZE * sizeof(unsigned char));

    /* initialise for encryption using key 1            */
    aes_encrypt_key(kbuf, KEY_LENGTH(mode), cx->encr_ctx);

    /* initialise for authentication using key 2        */
    hmac_sha_begin(cx->auth_ctx);
    hmac_sha_key(kbuf + KEY_LENGTH(mode), KEY_LENGTH(mode), cx->auth_ctx);

#ifdef PASSWORD_VERIFIER
    memcpy(pwd_ver, kbuf + 2 * KEY_LENGTH(mode), PWD_VER_LENGTH);
#endif

    return GOOD_RETURN;
}

/* perform 'in place' encryption and authentication */

void fcrypt_encrypt(unsigned char data[], unsigned int data_len, fcrypt_ctx cx[1])
{
    encr_data(data, data_len, cx);
    hmac_sha_data(data, data_len, cx->auth_ctx);
}

/* perform 'in place' authentication and decryption */

void fcrypt_decrypt(unsigned char data[], unsigned int data_len, fcrypt_ctx cx[1])
{
    hmac_sha_data(data, data_len, cx->auth_ctx);
    encr_data(data, data_len, cx);
}

/* close encryption/decryption and return the MAC value */

int fcrypt_end(unsigned char mac[], fcrypt_ctx cx[1])
{
    hmac_sha_end(mac, MAC_LENGTH(cx->mode), cx->auth_ctx);
    return MAC_LENGTH(cx->mode);    /* return MAC length in bytes   */
}

#if defined(__cplusplus)
}
#endif
/*
 ---------------------------------------------------------------------------
 Copyright (c) 2002, Dr Brian Gladman <                 >, Worcester, UK.
 All rights reserved.

 LICENSE TERMS

 The free distribution and use of this software in both source and binary
 form is allowed (with or without changes) provided that:

   1. distributions of this source code include the above copyright
      notice, this list of conditions and the following disclaimer;

   2. distributions in binary form include the above copyright
      notice, this list of conditions and the following disclaimer
      in the documentation and/or other associated materials;

   3. the copyright holder's name is not used to endorse products
      built using this software without specific written permission.

 ALTERNATIVELY, provided that this notice is retained in full, this product
 may be distributed under the terms of the GNU General Public License (GPL),
 in which case the provisions of the GPL apply INSTEAD OF those given above.

 DISCLAIMER

 This software is provided 'as is' with no explicit or implied warranties
 in respect of its properties, including, but not limited to, correctness
 and/or fitness for purpose.
 ---------------------------------------------------------------------------
 Issue Date: 24/01/2003

 This file contains the header file for fileenc.c, which implements password
 based file encryption and authentication using AES in CTR mode, HMAC-SHA1 
 authentication and RFC2898 password based key derivation.
*/

#ifndef _FENC_H
#define _FENC_H

#include "aes.h"
#include "hmac.h"
#include "pwd2key.h"

#define PASSWORD_VERIFIER

#define MAX_KEY_LENGTH        32
#define MAX_PWD_LENGTH       128
#define MAX_SALT_LENGTH       16
#define KEYING_ITERATIONS   1000

#ifdef  PASSWORD_VERIFIER
#define PWD_VER_LENGTH         2
#else
#define PWD_VER_LENGTH         0
#endif

#define GOOD_RETURN            0
#define PASSWORD_TOO_LONG   -100
#define BAD_MODE            -101

/*
    Field lengths (in bytes) versus File Encryption Mode (0 < mode < 4)

    Mode Key Salt  MAC Overhead
       1  16    8   10       18
       2  24   12   10       22
       3  32   16   10       26

   The following macros assume that the mode value is correct.
*/

#define KEY_LENGTH(mode)        (8 * (mode & 3) + 8)
#define SALT_LENGTH(mode)       (4 * (mode & 3) + 4)
#define MAC_LENGTH(mode)        (10)

/* the context for file encryption   */

#if defined(__cplusplus)
extern "C"
{
#endif

typedef struct
{   unsigned char   nonce[AES_BLOCK_SIZE];      /* the CTR nonce          */
    unsigned char   encr_bfr[AES_BLOCK_SIZE];   /* encrypt buffer         */
    aes_encrypt_ctx encr_ctx[1];                /* encryption context     */
    hmac_ctx        auth_ctx[1];                /* authentication context */
    unsigned int    encr_pos;                   /* block position (enc)   */
    unsigned int    pwd_len;                    /* password length        */
    unsigned int    mode;                       /* File encryption mode   */
} fcrypt_ctx;

/* initialise file encryption or decryption */

int fcrypt_init(
    int mode,                               /* the mode to be used (input)          */
    const unsigned char pwd[],              /* the user specified password (input)  */
    unsigned int pwd_len,                   /* the length of the password (input)   */
    const unsigned char salt[],             /* the salt (input)                     */
#ifdef PASSWORD_VERIFIER
    unsigned char pwd_ver[PWD_VER_LENGTH],  /* 2 byte password verifier (output)    */
#endif
    fcrypt_ctx      cx[1]);                 /* the file encryption context (output) */

/* perform 'in place' encryption or decryption and authentication               */

void fcrypt_encrypt(unsigned char data[], unsigned int data_len, fcrypt_ctx cx[1]);
void fcrypt_decrypt(unsigned char data[], unsigned int data_len, fcrypt_ctx cx[1]);

/* close encryption/decryption and return the MAC value */
/* the return value is the length of the MAC            */

int fcrypt_end(unsigned char mac[],     /* the MAC value (output)   */
               fcrypt_ctx cx[1]);       /* the context (input)      */

#if defined(__cplusplus)
}
#endif

#endif
/*
 ---------------------------------------------------------------------------
 Copyright (c) 2002, Dr Brian Gladman, Worcester, UK.   All rights reserved.

 LICENSE TERMS

 The free distribution and use of this software in both source and binary
 form is allowed (with or without changes) provided that:

   1. distributions of this source code include the above copyright
      notice, this list of conditions and the following disclaimer;

   2. distributions in binary form include the above copyright
      notice, this list of conditions and the following disclaimer
      in the documentation and/or other associated materials;

   3. the copyright holder's name is not used to endorse products
      built using this software without specific written permission.

 ALTERNATIVELY, provided that this notice is retained in full, this product
 may be distributed under the terms of the GNU General Public License (GPL),
 in which case the provisions of the GPL apply INSTEAD OF those given above.

 DISCLAIMER

 This software is provided 'as is' with no explicit or implied warranties
 in respect of its properties, including, but not limited to, correctness
 and/or fitness for purpose.
 ---------------------------------------------------------------------------
 Issue Date: 26/08/2003

 This is an implementation of HMAC, the FIPS standard keyed hash function
*/

#include "hmac.h"
#include "brg_types.h"

#if defined(__cplusplus)
extern "C"
{
#endif

/* initialise the HMAC context to zero */
void hmac_sha_begin(hmac_ctx cx[1])
{
    memset(cx, 0, sizeof(hmac_ctx));
}

/* input the HMAC key (can be called multiple times)    */
int hmac_sha_key(const unsigned char key[], unsigned long key_len, hmac_ctx cx[1])
{
    if(cx->klen == HMAC_IN_DATA)                /* error if further key input   */
        return HMAC_BAD_MODE;                   /* is attempted in data mode    */

    if(cx->klen + key_len > HASH_INPUT_SIZE)    /* if the key has to be hashed  */
    {
        if(cx->klen <= HASH_INPUT_SIZE)         /* if the hash has not yet been */
        {                                       /* started, initialise it and   */
            sha_begin(cx->ctx);                 /* hash stored key characters   */
            sha_hash(cx->key, cx->klen, cx->ctx);
        }

        sha_hash(key, key_len, cx->ctx);       /* hash long key data into hash */
    }
    else                                        /* otherwise store key data     */
        memcpy(cx->key + cx->klen, key, key_len);

    cx->klen += key_len;                        /* update the key length count  */
    return HMAC_OK;
}

/* input the HMAC data (can be called multiple times) - */
/* note that this call terminates the key input phase   */
void hmac_sha_data(const unsigned char data[], unsigned long data_len, hmac_ctx cx[1])
{   unsigned int i;

    if(cx->klen != HMAC_IN_DATA)                /* if not yet in data phase */
    {
        if(cx->klen > HASH_INPUT_SIZE)          /* if key is being hashed   */
        {                                       /* complete the hash and    */
            sha_end(cx->key, cx->ctx);          /* store the result as the  */
            cx->klen = HASH_OUTPUT_SIZE;        /* key and set new length   */
        }

        /* pad the key if necessary */
        memset(cx->key + cx->klen, 0, HASH_INPUT_SIZE - cx->klen);

        /* xor ipad into key value  */
        for(i = 0; i < (HASH_INPUT_SIZE >> 2); ++i)
            ((uint_32t*)cx->key)[i] ^= 0x36363636;

        /* and start hash operation */
        sha_begin(cx->ctx);
        sha_hash(cx->key, HASH_INPUT_SIZE, cx->ctx);

        /* mark as now in data mode */
        cx->klen = HMAC_IN_DATA;
    }

    /* hash the data (if any)       */
    if(data_len)
        sha_hash(data, data_len, cx->ctx);
}

/* compute and output the MAC value */
void hmac_sha_end(unsigned char mac[], unsigned long mac_len, hmac_ctx cx[1])
{   unsigned char dig[HASH_OUTPUT_SIZE];
    unsigned int i;

    /* if no data has been entered perform a null data phase        */
    if(cx->klen != HMAC_IN_DATA)
        hmac_sha_data((const unsigned char*)0, 0, cx);

    sha_end(dig, cx->ctx);         /* complete the inner hash       */

    /* set outer key value using opad and removing ipad */
    for(i = 0; i < (HASH_INPUT_SIZE >> 2); ++i)
        ((uint_32t*)cx->key)[i] ^= 0x36363636 ^ 0x5c5c5c5c;

    /* perform the outer hash operation */
    sha_begin(cx->ctx);
    sha_hash(cx->key, HASH_INPUT_SIZE, cx->ctx);
    sha_hash(dig, HASH_OUTPUT_SIZE, cx->ctx);
    sha_end(dig, cx->ctx);

    /* output the hash value            */
    for(i = 0; i < mac_len; ++i)
        mac[i] = dig[i];
}

/* 'do it all in one go' subroutine     */
void hmac_sha(const unsigned char key[], unsigned long key_len,
          const unsigned char data[], unsigned long data_len,
          unsigned char mac[], unsigned long mac_len)
{   hmac_ctx    cx[1];

    hmac_sha_begin(cx);
    hmac_sha_key(key, key_len, cx);
    hmac_sha_data(data, data_len, cx);
    hmac_sha_end(mac, mac_len, cx);
}

#if defined(__cplusplus)
}
#endif
/*
 ---------------------------------------------------------------------------
 Copyright (c) 2002, Dr Brian Gladman, Worcester, UK.   All rights reserved.

 LICENSE TERMS

 The free distribution and use of this software in both source and binary
 form is allowed (with or without changes) provided that:

   1. distributions of this source code include the above copyright
      notice, this list of conditions and the following disclaimer;

   2. distributions in binary form include the above copyright
      notice, this list of conditions and the following disclaimer
      in the documentation and/or other associated materials;

   3. the copyright holder's name is not used to endorse products
      built using this software without specific written permission.

 ALTERNATIVELY, provided that this notice is retained in full, this product
 may be distributed under the terms of the GNU General Public License (GPL),
 in which case the provisions of the GPL apply INSTEAD OF those given above.

 DISCLAIMER

 This software is provided 'as is' with no explicit or implied warranties
 in respect of its properties, including, but not limited to, correctness
 and/or fitness for purpose.
 ---------------------------------------------------------------------------
 Issue Date: 26/08/2003

 This is an implementation of HMAC, the FIPS standard keyed hash function
*/

#ifndef _HMAC_H
#define _HMAC_H

#include <memory.h>

#if defined(__cplusplus)
extern "C"
{
#endif

#define USE_SHA1

#if !defined(USE_SHA1) && !defined(USE_SHA256)
#error define USE_SHA1 or USE_SHA256 to set the HMAC hash algorithm
#endif

#ifdef USE_SHA1

#include "sha1.h"

#define HASH_INPUT_SIZE     SHA1_BLOCK_SIZE
#define HASH_OUTPUT_SIZE    SHA1_DIGEST_SIZE
#define sha_ctx             sha1_ctx
#define sha_begin           sha1_begin
#define sha_hash            sha1_hash
#define sha_end             sha1_end

#endif

#ifdef USE_SHA256

#include "sha2.h"

#define HASH_INPUT_SIZE     SHA256_BLOCK_SIZE
#define HASH_OUTPUT_SIZE    SHA256_DIGEST_SIZE
#define sha_ctx             sha256_ctx
#define sha_begin           sha256_begin
#define sha_hash            sha256_hash
#define sha_end             sha256_end

#endif

#define HMAC_OK                0
#define HMAC_BAD_MODE         -1
#define HMAC_IN_DATA  0xffffffff

typedef struct
{   unsigned char   key[HASH_INPUT_SIZE];
    sha_ctx         ctx[1];
    unsigned long   klen;
} hmac_ctx;

void hmac_sha_begin(hmac_ctx cx[1]);

int  hmac_sha_key(const unsigned char key[], unsigned long key_len, hmac_ctx cx[1]);

void hmac_sha_data(const unsigned char data[], unsigned long data_len, hmac_ctx cx[1]);

void hmac_sha_end(unsigned char mac[], unsigned long mac_len, hmac_ctx cx[1]);

void hmac_sha(const unsigned char key[], unsigned long key_len,
          const unsigned char data[], unsigned long data_len,
          unsigned char mac[], unsigned long mac_len);

#if defined(__cplusplus)
}
#endif

#endif
/*
 ---------------------------------------------------------------------------
 Copyright (c) 2002, Dr Brian Gladman <                 >, Worcester, UK.
 All rights reserved.

 LICENSE TERMS

 The free distribution and use of this software in both source and binary
 form is allowed (with or without changes) provided that:

   1. distributions of this source code include the above copyright
      notice, this list of conditions and the following disclaimer;

   2. distributions in binary form include the above copyright
      notice, this list of conditions and the following disclaimer
      in the documentation and/or other associated materials;

   3. the copyright holder's name is not used to endorse products
      built using this software without specific written permission.

 ALTERNATIVELY, provided that this notice is retained in full, this product
 may be distributed under the terms of the GNU General Public License (GPL),
 in which case the provisions of the GPL apply INSTEAD OF those given above.

 DISCLAIMER

 This software is provided 'as is' with no explicit or implied warranties
 in respect of its properties, including, but not limited to, correctness
 and/or fitness for purpose.
 ---------------------------------------------------------------------------
 Issue Date: 24/01/2003

 This file implements a random data pool based on the use of an external
 entropy function.  It is based on the ideas advocated by Peter Gutmann in
 his work on pseudo random sequence generators.  It is not a 'paranoid'
 random sequence generator and no attempt is made to protect the pool
 from prying eyes either by memory locking or by techniques to obscure
 its location in memory.
*/

#include <memory.h>
#include "prng.h"

#if defined(__cplusplus)
extern "C"
{
#endif

/* mix a random data pool using the SHA1 compression function (as   */
/* suggested by Peter Gutmann in his paper on random pools)         */

static void prng_mix(unsigned char buf[])
{   unsigned int    i, len;
    sha1_ctx        ctx[1];

    /*lint -e{663}  unusual array to pointer conversion */
    for(i = 0; i < PRNG_POOL_SIZE; i += SHA1_DIGEST_SIZE)
    {
        /* copy digest size pool block into SHA1 hash block */
        memcpy(ctx->hash, buf + (i ? i : PRNG_POOL_SIZE)
                            - SHA1_DIGEST_SIZE, SHA1_DIGEST_SIZE);

        /* copy data from pool into the SHA1 data buffer    */
        len = PRNG_POOL_SIZE - i;
        memcpy(ctx->wbuf, buf + i, (len > SHA1_BLOCK_SIZE ? SHA1_BLOCK_SIZE : len));

        if(len < SHA1_BLOCK_SIZE)
            memcpy(((char*)ctx->wbuf) + len, buf, SHA1_BLOCK_SIZE - len);

        /* compress using the SHA1 compression function     */
        sha1_compile(ctx);

        /* put digest size block back into the random pool  */
        memcpy(buf + i, ctx->hash, SHA1_DIGEST_SIZE);
    }
}

/* refresh the output buffer and update the random pool by adding   */
/* entropy and remixing                                             */

static void update_pool(prng_ctx ctx[1])
{   unsigned int    i = 0;

    /* transfer random pool data to the output buffer   */
    memcpy(ctx->obuf, ctx->rbuf, PRNG_POOL_SIZE);

    /* enter entropy data into the pool */
    while(i < PRNG_POOL_SIZE)
        i += ctx->entropy(ctx->rbuf + i, PRNG_POOL_SIZE - i);

    /* invert and xor the original pool data into the pool  */
    for(i = 0; i < PRNG_POOL_SIZE; ++i)
        ctx->rbuf[i] ^= ~ctx->obuf[i];

    /* mix the pool and the output buffer   */
    prng_mix(ctx->rbuf);
    prng_mix(ctx->obuf);
}

void prng_init(prng_entropy_fn fun, prng_ctx ctx[1])
{   int i;

    /* clear the buffers and the counter in the context     */
    memset(ctx, 0, sizeof(prng_ctx));

    /* set the pointer to the entropy collection function   */
    ctx->entropy = fun;

    /* initialise the random data pool                      */
    update_pool(ctx);

    /* mix the pool a minimum number of times               */
    for(i = 0; i < PRNG_MIN_MIX; ++i)
        prng_mix(ctx->rbuf);

    /* update the pool to prime the pool output buffer      */
    update_pool(ctx);
}

/* provide random bytes from the random data pool   */

void prng_rand(unsigned char data[], unsigned int data_len, prng_ctx ctx[1])
{   unsigned char   *rp = data;
    unsigned int    len, pos = ctx->pos;

    while(data_len)
    {
        /* transfer 'data_len' bytes (or the number of bytes remaining  */
        /* the pool output buffer if less) into the output              */
        len = (data_len < PRNG_POOL_SIZE - pos ? data_len : PRNG_POOL_SIZE - pos);
        memcpy(rp, ctx->obuf + pos, len);
        rp += len;          /* update ouput buffer position pointer     */
        pos += len;         /* update pool output buffer pointer        */
        data_len -= len;    /* update the remaining data count          */

        /* refresh the random pool if necessary */
        if(pos == PRNG_POOL_SIZE)
        {
            update_pool(ctx); pos = 0;
        }
    }

    ctx->pos = pos;
}

void prng_end(prng_ctx ctx[1])
{
    /* ensure the data in the context is destroyed  */
    memset(ctx, 0, sizeof(prng_ctx));
}

#if defined(__cplusplus)
}
#endif

/*
 ---------------------------------------------------------------------------
 Copyright (c) 2002, Dr Brian Gladman <                 >, Worcester, UK.
 All rights reserved.

 LICENSE TERMS

 The free distribution and use of this software in both source and binary
 form is allowed (with or without changes) provided that:

   1. distributions of this source code include the above copyright
      notice, this list of conditions and the following disclaimer;

   2. distributions in binary form include the above copyright
      notice, this list of conditions and the following disclaimer
      in the documentation and/or other associated materials;

   3. the copyright holder's name is not used to endorse products
      built using this software without specific written permission.

 ALTERNATIVELY, provided that this notice is retained in full, this product
 may be distributed under the terms of the GNU General Public License (GPL),
 in which case the provisions of the GPL apply INSTEAD OF those given above.

 DISCLAIMER

 This software is provided 'as is' with no explicit or implied warranties
 in respect of its properties, including, but not limited to, correctness
 and/or fitness for purpose.
 ---------------------------------------------------------------------------
 Issue Date: 24/01/2003

 This is the header file for an implementation of a random data pool based on
 the use of an external entropy function (inspired by Peter Gutmann's work).
*/

#ifndef _PRNG_H
#define _PRNG_H

#include "sha1.h"

#define PRNG_POOL_LEN    256    /* minimum random pool size             */
#define PRNG_MIN_MIX      20    /* min initial pool mixing iterations   */

/* ensure that pool length is a multiple of the SHA1 digest size        */

#define PRNG_POOL_SIZE  (SHA1_DIGEST_SIZE * (1 + (PRNG_POOL_LEN - 1) / SHA1_DIGEST_SIZE))

#if defined(__cplusplus)
extern "C"
{
#endif

/* A function for providing entropy is a parameter in the prng_init()   */
/* call.  This function has the following form and returns a maximum    */
/* of 'len' bytes of pseudo random data in the buffer 'buf'.  It can    */
/* return less than 'len' bytes but will be repeatedly called for more  */
/* data in this case.                                                   */

typedef int (*prng_entropy_fn)(unsigned char buf[], unsigned int len);

typedef struct
{   unsigned char   rbuf[PRNG_POOL_SIZE];   /* the random pool          */
    unsigned char   obuf[PRNG_POOL_SIZE];   /* pool output buffer       */
    unsigned int    pos;                    /* output buffer position   */
    prng_entropy_fn entropy;                /* entropy function pointer */
} prng_ctx;

/* initialise the random stream generator   */
void prng_init(prng_entropy_fn fun, prng_ctx ctx[1]);

/* obtain random bytes from the generator   */
void prng_rand(unsigned char data[], unsigned int data_len, prng_ctx ctx[1]);

/* close the random stream generator        */
void prng_end(prng_ctx ctx[1]);

#if defined(__cplusplus)
}
#endif

#endif
/*
 ---------------------------------------------------------------------------
 Copyright (c) 2002, Dr Brian Gladman, Worcester, UK.   All rights reserved.

 LICENSE TERMS

 The free distribution and use of this software in both source and binary
 form is allowed (with or without changes) provided that:

   1. distributions of this source code include the above copyright
      notice, this list of conditions and the following disclaimer;

   2. distributions in binary form include the above copyright
      notice, this list of conditions and the following disclaimer
      in the documentation and/or other associated materials;

   3. the copyright holder's name is not used to endorse products
      built using this software without specific written permission.

 ALTERNATIVELY, provided that this notice is retained in full, this product
 may be distributed under the terms of the GNU General Public License (GPL),
 in which case the provisions of the GPL apply INSTEAD OF those given above.

 DISCLAIMER

 This software is provided 'as is' with no explicit or implied warranties
 in respect of its properties, including, but not limited to, correctness
 and/or fitness for purpose.
 ---------------------------------------------------------------------------
 Issue Date: 26/08/2003

 This is an implementation of RFC2898, which specifies key derivation from
 a password and a salt value.
*/

#include <memory.h>
#include "hmac.h"

#if defined(__cplusplus)
extern "C"
{
#endif

void derive_key(const unsigned char pwd[],  /* the PASSWORD     */
               unsigned int pwd_len,        /* and its length   */
               const unsigned char salt[],  /* the SALT and its */
               unsigned int salt_len,       /* length           */
               unsigned int iter,   /* the number of iterations */
               unsigned char key[], /* space for the output key */
               unsigned int key_len)/* and its required length  */
{
    unsigned int    i, j, k, n_blk;
    unsigned char uu[HASH_OUTPUT_SIZE], ux[HASH_OUTPUT_SIZE];
    hmac_ctx c1[1], c2[1], c3[1];

    /* set HMAC context (c1) for password               */
    hmac_sha_begin(c1);
    hmac_sha_key(pwd, pwd_len, c1);

    /* set HMAC context (c2) for password and salt      */
    memcpy(c2, c1, sizeof(hmac_ctx));
    hmac_sha_data(salt, salt_len, c2);

    /* find the number of SHA blocks in the key         */
    n_blk = 1 + (key_len - 1) / HASH_OUTPUT_SIZE;

    for(i = 0; i < n_blk; ++i) /* for each block in key */
    {
        /* ux[] holds the running xor value             */
        memset(ux, 0, HASH_OUTPUT_SIZE);

        /* set HMAC context (c3) for password and salt  */
        memcpy(c3, c2, sizeof(hmac_ctx));

        /* enter additional data for 1st block into uu  */
        uu[0] = (unsigned char)((i + 1) >> 24);
        uu[1] = (unsigned char)((i + 1) >> 16);
        uu[2] = (unsigned char)((i + 1) >> 8);
        uu[3] = (unsigned char)(i + 1);

        /* this is the key mixing iteration         */
        for(j = 0, k = 4; j < iter; ++j)
        {
            /* add previous round data to HMAC      */
            hmac_sha_data(uu, k, c3);

            /* obtain HMAC for uu[]                 */
            hmac_sha_end(uu, HASH_OUTPUT_SIZE, c3);

            /* xor into the running xor block       */
            for(k = 0; k < HASH_OUTPUT_SIZE; ++k)
                ux[k] ^= uu[k];

            /* set HMAC context (c3) for password   */
            memcpy(c3, c1, sizeof(hmac_ctx));
        }

        /* compile key blocks into the key output   */
        j = 0; k = i * HASH_OUTPUT_SIZE;
        while(j < HASH_OUTPUT_SIZE && k < key_len)
            key[k++] = ux[j++];
    }
}

#ifdef TEST

#include <stdio.h>

struct
{   unsigned int    pwd_len;
    unsigned int    salt_len;
    unsigned int    it_count;
    unsigned char   *pwd;
    unsigned char   salt[32];
    unsigned char   key[32];
} tests[] =
{
    {   8, 4, 5, (unsigned char*)"password",
        {   
            0x12, 0x34, 0x56, 0x78 
        },
        {   
            0x5c, 0x75, 0xce, 0xf0, 0x1a, 0x96, 0x0d, 0xf7,
            0x4c, 0xb6, 0xb4, 0x9b, 0x9e, 0x38, 0xe6, 0xb5 
        }
    },
    {   8, 8, 5, (unsigned char*)"password",
        {   
            0x12, 0x34, 0x56, 0x78, 0x78, 0x56, 0x34, 0x12 
        },
        {   
            0xd1, 0xda, 0xa7, 0x86, 0x15, 0xf2, 0x87, 0xe6,
            0xa1, 0xc8, 0xb1, 0x20, 0xd7, 0x06, 0x2a, 0x49 
        }
    },
    {   8, 21, 1, (unsigned char*)"password",
        {
            "ATHENA.MIT.EDUraeburn"
        },
        {
            0xcd, 0xed, 0xb5, 0x28, 0x1b, 0xb2, 0xf8, 0x01,
            0x56, 0x5a, 0x11, 0x22, 0xb2, 0x56, 0x35, 0x15
        }
    },
    {   8, 21, 2, (unsigned char*)"password",
        {
            "ATHENA.MIT.EDUraeburn"
        },
        {
            0x01, 0xdb, 0xee, 0x7f, 0x4a, 0x9e, 0x24, 0x3e, 
            0x98, 0x8b, 0x62, 0xc7, 0x3c, 0xda, 0x93, 0x5d
        }
    },
    {   8, 21, 1200, (unsigned char*)"password",
        {
            "ATHENA.MIT.EDUraeburn"
        },
        {
            0x5c, 0x08, 0xeb, 0x61, 0xfd, 0xf7, 0x1e, 0x4e, 
            0x4e, 0xc3, 0xcf, 0x6b, 0xa1, 0xf5, 0x51, 0x2b
        }
    }
};

int main()
{   unsigned int    i, j, key_len = 256;
    unsigned char   key[256];

    printf("\nTest of RFC2898 Password Based Key Derivation");
    for(i = 0; i < 5; ++i)
    {
        derive_key(tests[i].pwd, tests[i].pwd_len, tests[i].salt,
                    tests[i].salt_len, tests[i].it_count, key, key_len);

        printf("\ntest %i: ", i + 1);
        printf("key %s", memcmp(tests[i].key, key, 16) ? "is bad" : "is good");
        for(j = 0; j < key_len && j < 64; j += 4)
        {
            if(j % 16 == 0)
                printf("\n");
            printf("0x%02x%02x%02x%02x ", key[j], key[j + 1], key[j + 2], key[j + 3]);
        }
        printf(j < key_len ? " ... \n" : "\n");
    }
    printf("\n");
    return 0;
}

#if defined(__cplusplus)
}
#endif

#endif
/*
 ---------------------------------------------------------------------------
 Copyright (c) 2002, Dr Brian Gladman, Worcester, UK.   All rights reserved.

 LICENSE TERMS

 The free distribution and use of this software in both source and binary 
 form is allowed (with or without changes) provided that:

   1. distributions of this source code include the above copyright 
      notice, this list of conditions and the following disclaimer;

   2. distributions in binary form include the above copyright
      notice, this list of conditions and the following disclaimer
      in the documentation and/or other associated materials;

   3. the copyright holder's name is not used to endorse products 
      built using this software without specific written permission. 

 ALTERNATIVELY, provided that this notice is retained in full, this product
 may be distributed under the terms of the GNU General Public License (GPL),
 in which case the provisions of the GPL apply INSTEAD OF those given above.
 
 DISCLAIMER

 This software is provided 'as is' with no explicit or implied warranties
 in respect of its properties, including, but not limited to, correctness 
 and/or fitness for purpose.
 ---------------------------------------------------------------------------
 Issue Date: 26/08/2003

 This is an implementation of RFC2898, which specifies key derivation from
 a password and a salt value.
*/

#ifndef PWD2KEY_H
#define PWD2KEY_H

#if defined(__cplusplus)
extern "C"
{
#endif

void derive_key(
        const unsigned char pwd[],   /* the PASSWORD, and   */
        unsigned int pwd_len,        /*    its length       */ 
        const unsigned char salt[],  /* the SALT and its    */
        unsigned int salt_len,       /*    length           */
        unsigned int iter,      /* the number of iterations */
        unsigned char key[],    /* space for the output key */
        unsigned int key_len);  /* and its required length  */

#if defined(__cplusplus)
}
#endif

#endif
/*
 ---------------------------------------------------------------------------
 Copyright (c) 2002, Dr Brian Gladman, Worcester, UK.   All rights reserved.

 LICENSE TERMS

 The free distribution and use of this software in both source and binary
 form is allowed (with or without changes) provided that:

   1. distributions of this source code include the above copyright
      notice, this list of conditions and the following disclaimer;

   2. distributions in binary form include the above copyright
      notice, this list of conditions and the following disclaimer
      in the documentation and/or other associated materials;

   3. the copyright holder's name is not used to endorse products
      built using this software without specific written permission.

 ALTERNATIVELY, provided that this notice is retained in full, this product
 may be distributed under the terms of the GNU General Public License (GPL),
 in which case the provisions of the GPL apply INSTEAD OF those given above.

 DISCLAIMER

 This software is provided 'as is' with no explicit or implied warranties
 in respect of its properties, including, but not limited to, correctness
 and/or fitness for purpose.
 ---------------------------------------------------------------------------
 Issue Date: 01/08/2005

 This is a byte oriented version of SHA1 that operates on arrays of bytes
 stored in memory.
*/

#include <string.h>     /* for memcpy() etc.        */

#include "sha1.h"
#include "brg_endian.h"

#if defined(__cplusplus)
extern "C"
{
#endif

#if defined( _MSC_VER ) && ( _MSC_VER > 800 )
#pragma intrinsic(memcpy)
#endif

#if 0 && defined(_MSC_VER)
#define rotl32  _lrotl
#define rotr32  _lrotr
#else
#define rotl32(x,n)   (((x) << n) | ((x) >> (32 - n)))
#define rotr32(x,n)   (((x) >> n) | ((x) << (32 - n)))
#endif

#if !defined(bswap_32)
#define bswap_32(x) ((rotr32((x), 24) & 0x00ff00ff) | (rotr32((x), 8) & 0xff00ff00))
#endif

#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
#define SWAP_BYTES
#else
#undef  SWAP_BYTES
#endif

#if defined(SWAP_BYTES)
#define bsw_32(p,n) \
    { int _i = (n); while(_i--) ((uint_32t*)p)[_i] = bswap_32(((uint_32t*)p)[_i]); }
#else
#define bsw_32(p,n)
#endif

#define SHA1_MASK   (SHA1_BLOCK_SIZE - 1)

#if 0

#define ch(x,y,z)       (((x) & (y)) ^ (~(x) & (z)))
#define parity(x,y,z)   ((x) ^ (y) ^ (z))
#define maj(x,y,z)      (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))

#else   /* Discovered by Rich Schroeppel and Colin Plumb   */

#define ch(x,y,z)       ((z) ^ ((x) & ((y) ^ (z))))
#define parity(x,y,z)   ((x) ^ (y) ^ (z))
#define maj(x,y,z)      (((x) & (y)) | ((z) & ((x) ^ (y))))

#endif

/* Compile 64 bytes of hash data into SHA1 context. Note    */
/* that this routine assumes that the byte order in the     */
/* ctx->wbuf[] at this point is in such an order that low   */
/* address bytes in the ORIGINAL byte stream will go in     */
/* this buffer to the high end of 32-bit words on BOTH big  */
/* and little endian systems                                */

#ifdef ARRAY
#define q(v,n)  v[n]
#else
#define q(v,n)  v##n
#endif

#define one_cycle(v,a,b,c,d,e,f,k,h)            \
    q(v,e) += rotr32(q(v,a),27) +               \
              f(q(v,b),q(v,c),q(v,d)) + k + h;  \
    q(v,b)  = rotr32(q(v,b), 2)

#define five_cycle(v,f,k,i)                 \
    one_cycle(v, 0,1,2,3,4, f,k,hf(i  ));   \
    one_cycle(v, 4,0,1,2,3, f,k,hf(i+1));   \
    one_cycle(v, 3,4,0,1,2, f,k,hf(i+2));   \
    one_cycle(v, 2,3,4,0,1, f,k,hf(i+3));   \
    one_cycle(v, 1,2,3,4,0, f,k,hf(i+4))

VOID_RETURN sha1_compile(sha1_ctx ctx[1])
{   uint_32t    *w = ctx->wbuf;

#ifdef ARRAY
    uint_32t    v[5];
    memcpy(v, ctx->hash, 5 * sizeof(uint_32t));
#else
    uint_32t    v0, v1, v2, v3, v4;
    v0 = ctx->hash[0]; v1 = ctx->hash[1];
    v2 = ctx->hash[2]; v3 = ctx->hash[3];
    v4 = ctx->hash[4];
#endif

#define hf(i)   w[i]

    five_cycle(v, ch, 0x5a827999,  0);
    five_cycle(v, ch, 0x5a827999,  5);
    five_cycle(v, ch, 0x5a827999, 10);
    one_cycle(v,0,1,2,3,4, ch, 0x5a827999, hf(15)); \

#undef  hf
#define hf(i) (w[(i) & 15] = rotl32(                    \
                 w[((i) + 13) & 15] ^ w[((i) + 8) & 15] \
               ^ w[((i) +  2) & 15] ^ w[(i) & 15], 1))

    one_cycle(v,4,0,1,2,3, ch, 0x5a827999, hf(16));
    one_cycle(v,3,4,0,1,2, ch, 0x5a827999, hf(17));
    one_cycle(v,2,3,4,0,1, ch, 0x5a827999, hf(18));
    one_cycle(v,1,2,3,4,0, ch, 0x5a827999, hf(19));

    five_cycle(v, parity, 0x6ed9eba1,  20);
    five_cycle(v, parity, 0x6ed9eba1,  25);
    five_cycle(v, parity, 0x6ed9eba1,  30);
    five_cycle(v, parity, 0x6ed9eba1,  35);

    five_cycle(v, maj, 0x8f1bbcdc,  40);
    five_cycle(v, maj, 0x8f1bbcdc,  45);
    five_cycle(v, maj, 0x8f1bbcdc,  50);
    five_cycle(v, maj, 0x8f1bbcdc,  55);

    five_cycle(v, parity, 0xca62c1d6,  60);
    five_cycle(v, parity, 0xca62c1d6,  65);
    five_cycle(v, parity, 0xca62c1d6,  70);
    five_cycle(v, parity, 0xca62c1d6,  75);

#ifdef ARRAY
    ctx->hash[0] += v[0]; ctx->hash[1] += v[1];
    ctx->hash[2] += v[2]; ctx->hash[3] += v[3];
    ctx->hash[4] += v[4];
#else
    ctx->hash[0] += v0; ctx->hash[1] += v1;
    ctx->hash[2] += v2; ctx->hash[3] += v3;
    ctx->hash[4] += v4;
#endif
}

VOID_RETURN sha1_begin(sha1_ctx ctx[1])
{
    ctx->count[0] = ctx->count[1] = 0;
    ctx->hash[0] = 0x67452301;
    ctx->hash[1] = 0xefcdab89;
    ctx->hash[2] = 0x98badcfe;
    ctx->hash[3] = 0x10325476;
    ctx->hash[4] = 0xc3d2e1f0;
}

/* SHA1 hash data in an array of bytes into hash buffer and */
/* call the hash_compile function as required.              */

VOID_RETURN sha1_hash(const unsigned char data[], unsigned long len, sha1_ctx ctx[1])
{   uint_32t pos = (uint_32t)(ctx->count[0] & SHA1_MASK),
            space = SHA1_BLOCK_SIZE - pos;
    const unsigned char *sp = data;

    if((ctx->count[0] += len) < len)
        ++(ctx->count[1]);

    while(len >= space)     /* tranfer whole blocks if possible  */
    {
        memcpy(((unsigned char*)ctx->wbuf) + pos, sp, space);
        sp += space; len -= space; space = SHA1_BLOCK_SIZE; pos = 0;
        bsw_32(ctx->wbuf, SHA1_BLOCK_SIZE >> 2);
        sha1_compile(ctx);
    }

    memcpy(((unsigned char*)ctx->wbuf) + pos, sp, len);
}

/* SHA1 final padding and digest calculation  */

VOID_RETURN sha1_end(unsigned char hval[], sha1_ctx ctx[1])
{   uint_32t    i = (uint_32t)(ctx->count[0] & SHA1_MASK);

    /* put bytes in the buffer in an order in which references to   */
    /* 32-bit words will put bytes with lower addresses into the    */
    /* top of 32 bit words on BOTH big and little endian machines   */
    bsw_32(ctx->wbuf, (i + 3) >> 2);

    /* we now need to mask valid bytes and add the padding which is */
    /* a single 1 bit and as many zero bits as necessary. Note that */
    /* we can always add the first padding byte here because the    */
    /* buffer always has at least one empty slot                    */
    ctx->wbuf[i >> 2] &= 0xffffff80 << 8 * (~i & 3);
    ctx->wbuf[i >> 2] |= 0x00000080 << 8 * (~i & 3);

    /* we need 9 or more empty positions, one for the padding byte  */
    /* (above) and eight for the length count. If there is not      */
    /* enough space, pad and empty the buffer                       */
    if(i > SHA1_BLOCK_SIZE - 9)
    {
        if(i < 60) ctx->wbuf[15] = 0;
        sha1_compile(ctx);
        i = 0;
    }
    else    /* compute a word index for the empty buffer positions  */
        i = (i >> 2) + 1;

    while(i < 14) /* and zero pad all but last two positions        */
        ctx->wbuf[i++] = 0;

    /* the following 32-bit length fields are assembled in the      */
    /* wrong byte order on little endian machines but this is       */
    /* corrected later since they are only ever used as 32-bit      */
    /* word values.                                                 */
    ctx->wbuf[14] = (ctx->count[1] << 3) | (ctx->count[0] >> 29);
    ctx->wbuf[15] = ctx->count[0] << 3;
    sha1_compile(ctx);

    /* extract the hash value as bytes in case the hash buffer is   */
    /* misaligned for 32-bit words                                  */
    for(i = 0; i < SHA1_DIGEST_SIZE; ++i)
        hval[i] = (unsigned char)(ctx->hash[i >> 2] >> (8 * (~i & 3)));
}

VOID_RETURN sha1(unsigned char hval[], const unsigned char data[], unsigned long len)
{   sha1_ctx    cx[1];

    sha1_begin(cx); sha1_hash(data, len, cx); sha1_end(hval, cx);
}

#if defined(__cplusplus)
}
#endif
/*
 ---------------------------------------------------------------------------
 Copyright (c) 2002, Dr Brian Gladman, Worcester, UK.   All rights reserved.

 LICENSE TERMS

 The free distribution and use of this software in both source and binary
 form is allowed (with or without changes) provided that:

   1. distributions of this source code include the above copyright
      notice, this list of conditions and the following disclaimer;

   2. distributions in binary form include the above copyright
      notice, this list of conditions and the following disclaimer
      in the documentation and/or other associated materials;

   3. the copyright holder's name is not used to endorse products
      built using this software without specific written permission.

 ALTERNATIVELY, provided that this notice is retained in full, this product
 may be distributed under the terms of the GNU General Public License (GPL),
 in which case the provisions of the GPL apply INSTEAD OF those given above.

 DISCLAIMER

 This software is provided 'as is' with no explicit or implied warranties
 in respect of its properties, including, but not limited to, correctness
 and/or fitness for purpose.
 ---------------------------------------------------------------------------
 Issue Date: 01/08/2005
*/

#ifndef _SHA1_H
#define _SHA1_H

#include <stdlib.h>
#include "brg_types.h"

#define SHA1_BLOCK_SIZE  64
#define SHA1_DIGEST_SIZE 20

#if defined(__cplusplus)
extern "C"
{
#endif

/* type to hold the SHA256 context  */

typedef struct
{   uint_32t count[2];
    uint_32t hash[5];
    uint_32t wbuf[16];
} sha1_ctx;

/* Note that these prototypes are the same for both bit and */
/* byte oriented implementations. However the length fields */
/* are in bytes or bits as appropriate for the version used */
/* and bit sequences are input as arrays of bytes in which  */
/* bit sequences run from the most to the least significant */
/* end of each byte                                         */

VOID_RETURN sha1_compile(sha1_ctx ctx[1]);

VOID_RETURN sha1_begin(sha1_ctx ctx[1]);
VOID_RETURN sha1_hash(const unsigned char data[], unsigned long len, sha1_ctx ctx[1]);
VOID_RETURN sha1_end(unsigned char hval[], sha1_ctx ctx[1]);
VOID_RETURN sha1(unsigned char hval[], const unsigned char data[], unsigned long len);

#if defined(__cplusplus)
}
#endif

#endif
package org.apache.cordova;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileNotFoundException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;


import android.net.Uri;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaResourceApi.OpenForReadResult;
import org.apache.cordova.PluginResult;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class Zip extends CordovaPlugin {

    private static final String LOG_TAG = "Zip";

    @Override
    public boolean execute(String action, CordovaArgs args, final CallbackContext callbackContext) throws JSONException {
        if ("unzip".equals(action)) {
            unzip(args, callbackContext);
            return true;
        }
        return false;
    }

    private void unzip(final CordovaArgs args, final CallbackContext callbackContext) {
        this.cordova.getThreadPool().execute(new Runnable() {
            public void run() {
                unzipSync(args, callbackContext);
            }
        });
    }

    // Can't use DataInputStream because it has the wrong endian-ness.
    private static int readInt(InputStream is) throws IOException {
        int a = is.read();
        int b = is.read();
        int c = is.read();
        int d = is.read();
        return a | b << 8 | c << 16 | d << 24;
    }

    private void unzipSync(CordovaArgs args, CallbackContext callbackContext) {
        InputStream inputStream = null;
        try {
            String zipFileName = args.getString(0);
            String outputDirectory = args.getString(1);

            // Since Cordova 3.3.0 and release of File plugins, files are accessed via cdvfile://
            // Accept a path or a URI for the source zip.
            Uri zipUri = getUriForArg(zipFileName);
            Uri outputUri = getUriForArg(outputDirectory);

            CordovaResourceApi resourceApi = webView.getResourceApi();

            File tempFile = resourceApi.mapUriToFile(zipUri);
            if (tempFile == null || !tempFile.exists()) {
                String errorMessage = "Zip file does not exist";
                callbackContext.error(errorMessage);
                Log.e(LOG_TAG, errorMessage);
                return;
            }

            File outputDir = resourceApi.mapUriToFile(outputUri);
            outputDirectory = outputDir.getAbsolutePath();
            outputDirectory += outputDirectory.endsWith(File.separator) ? "" : File.separator;
            if (outputDir == null || (!outputDir.exists() && !outputDir.mkdirs())){
                String errorMessage = "Could not create output directory";
                callbackContext.error(errorMessage);
                Log.e(LOG_TAG, errorMessage);
                return;
            }

            OpenForReadResult zipFile = resourceApi.openForRead(zipUri);
            ProgressEvent progress = new ProgressEvent();
            progress.setTotal(zipFile.length);

            inputStream = new BufferedInputStream(zipFile.inputStream);
            inputStream.mark(10);
            int magic = readInt(inputStream);

            if (magic != 875721283) { // CRX identifier
                inputStream.reset();
            } else {
                // CRX files contain a header. This header consists of:
                //  * 4 bytes of magic number
                //  * 4 bytes of CRX format version,
                //  * 4 bytes of public key length
                //  * 4 bytes of signature length
                //  * the public key
                //  * the signature
                // and then the ordinary zip data follows. We skip over the header before creating the ZipInputStream.
                readInt(inputStream); // version == 2.
                int pubkeyLength = readInt(inputStream);
                int signatureLength = readInt(inputStream);

                inputStream.skip(pubkeyLength + signatureLength);
                progress.setLoaded(16 + pubkeyLength + signatureLength);
            }

            // The inputstream is now pointing at the start of the actual zip file content.
            ZipInputStream zis = new ZipInputStream(inputStream);
            inputStream = zis;

            ZipEntry ze;
            byte[] buffer = new byte[32 * 1024];
            boolean anyEntries = false;

            while ((ze = zis.getNextEntry()) != null)
            {
                anyEntries = true;
                String compressedName = ze.getName();

                if (ze.isDirectory()) {
                   File dir = new File(outputDirectory + compressedName);
                   dir.mkdirs();
                } else {
                    File file = new File(outputDirectory + compressedName);
                    file.getParentFile().mkdirs();
                    if(file.exists() || file.createNewFile()){
                        Log.w("Zip", "extracting: " + file.getPath());
                        FileOutputStream fout = new FileOutputStream(file);
                        int count;
                        while ((count = zis.read(buffer)) != -1)
                        {
                            fout.write(buffer, 0, count);
                        }
                        fout.close();
                    }

                }
                progress.addLoaded(ze.getCompressedSize());
                updateProgress(callbackContext, progress);
                zis.closeEntry();
            }

            // final progress = 100%
            progress.setLoaded(progress.getTotal());
            updateProgress(callbackContext, progress);

            if (anyEntries)
                callbackContext.success();
            else
                callbackContext.error("Bad zip file");
        } catch (Exception e) {
            String errorMessage = "An error occurred while unzipping.";
            callbackContext.error(errorMessage);
            Log.e(LOG_TAG, errorMessage, e);
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                }
            }
        }
    }

    private void updateProgress(CallbackContext callbackContext, ProgressEvent progress) throws JSONException {
        PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, progress.toJSONObject());
        pluginResult.setKeepCallback(true);
        callbackContext.sendPluginResult(pluginResult);
    }

    private Uri getUriForArg(String arg) {
        CordovaResourceApi resourceApi = webView.getResourceApi();
        Uri tmpTarget = Uri.parse(arg);
        return resourceApi.remapUri(
                tmpTarget.getScheme() != null ? tmpTarget : Uri.fromFile(new File(arg)));
    }

    private static class ProgressEvent {
        private long loaded;
        private long total;
        public long getLoaded() {
            return loaded;
        }
        public void setLoaded(long loaded) {
            this.loaded = loaded;
        }
        public void addLoaded(long add) {
            this.loaded += add;
        }
        public long getTotal() {
            return total;
        }
        public void setTotal(long total) {
            this.total = total;
        }
        public JSONObject toJSONObject() throws JSONException {
            return new JSONObject(
                    "{loaded:" + loaded +
                    ",total:" + total + "}");
        }
    }
}
Copyright Node.js contributors. All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
diff --git a/lib/util.js b/lib/util.js
index a03e874..9074e8e 100644
--- a/lib/util.js
+++ b/lib/util.js
@@ -19,430 +19,6 @@
 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 // USE OR OTHER DEALINGS IN THE SOFTWARE.

-var formatRegExp = /%[sdj%]/g;
-exports.format = function(f) {
-  if (!isString(f)) {
-    var objects = [];
-    for (var i = 0; i < arguments.length; i++) {
-      objects.push(inspect(arguments[i]));
-    }
-    return objects.join(' ');
-  }
-
-  var i = 1;
-  var args = arguments;
-  var len = args.length;
-  var str = String(f).replace(formatRegExp, function(x) {
-    if (x === '%%') return '%';
-    if (i >= len) return x;
-    switch (x) {
-      case '%s': return String(args[i++]);
-      case '%d': return Number(args[i++]);
-      case '%j':
-        try {
-          return JSON.stringify(args[i++]);
-        } catch (_) {
-          return '[Circular]';
-        }
-      default:
-        return x;
-    }
-  });
-  for (var x = args[i]; i < len; x = args[++i]) {
-    if (isNull(x) || !isObject(x)) {
-      str += ' ' + x;
-    } else {
-      str += ' ' + inspect(x);
-    }
-  }
-  return str;
-};
-
-
-// Mark that a method should not be used.
-// Returns a modified function which warns once by default.
-// If --no-deprecation is set, then it is a no-op.
-exports.deprecate = function(fn, msg) {
-  // Allow for deprecating things in the process of starting up.
-  if (isUndefined(global.process)) {
-    return function() {
-      return exports.deprecate(fn, msg).apply(this, arguments);
-    };
-  }
-
-  if (process.noDeprecation === true) {
-    return fn;
-  }
-
-  var warned = false;
-  function deprecated() {
-    if (!warned) {
-      if (process.throwDeprecation) {
-        throw new Error(msg);
-      } else if (process.traceDeprecation) {
-        console.trace(msg);
-      } else {
-        console.error(msg);
-      }
-      warned = true;
-    }
-    return fn.apply(this, arguments);
-  }
-
-  return deprecated;
-};
-
-
-var debugs = {};
-var debugEnviron;
-exports.debuglog = function(set) {
-  if (isUndefined(debugEnviron))
-    debugEnviron = process.env.NODE_DEBUG || '';
-  set = set.toUpperCase();
-  if (!debugs[set]) {
-    if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
-      var pid = process.pid;
-      debugs[set] = function() {
-        var msg = exports.format.apply(exports, arguments);
-        console.error('%s %d: %s', set, pid, msg);
-      };
-    } else {
-      debugs[set] = function() {};
-    }
-  }
-  return debugs[set];
-};
-
-
-/**
- * Echos the value of a value. Trys to print the value out
- * in the best way possible given the different types.
- *
- * @param {Object} obj The object to print out.
- * @param {Object} opts Optional options object that alters the output.
- */
-/* legacy: obj, showHidden, depth, colors*/
-function inspect(obj, opts) {
-  // default options
-  var ctx = {
-    seen: [],
-    stylize: stylizeNoColor
-  };
-  // legacy...
-  if (arguments.length >= 3) ctx.depth = arguments[2];
-  if (arguments.length >= 4) ctx.colors = arguments[3];
-  if (isBoolean(opts)) {
-    // legacy...
-    ctx.showHidden = opts;
-  } else if (opts) {
-    // got an "options" object
-    exports._extend(ctx, opts);
-  }
-  // set default options
-  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
-  if (isUndefined(ctx.depth)) ctx.depth = 2;
-  if (isUndefined(ctx.colors)) ctx.colors = false;
-  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
-  if (ctx.colors) ctx.stylize = stylizeWithColor;
-  return formatValue(ctx, obj, ctx.depth);
-}
-exports.inspect = inspect;
-
-
-// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
-inspect.colors = {
-  'bold' : [1, 22],
-  'italic' : [3, 23],
-  'underline' : [4, 24],
-  'inverse' : [7, 27],
-  'white' : [37, 39],
-  'grey' : [90, 39],
-  'black' : [30, 39],
-  'blue' : [34, 39],
-  'cyan' : [36, 39],
-  'green' : [32, 39],
-  'magenta' : [35, 39],
-  'red' : [31, 39],
-  'yellow' : [33, 39]
-};
-
-// Don't use 'blue' not visible on cmd.exe
-inspect.styles = {
-  'special': 'cyan',
-  'number': 'yellow',
-  'boolean': 'yellow',
-  'undefined': 'grey',
-  'null': 'bold',
-  'string': 'green',
-  'date': 'magenta',
-  // "name": intentionally not styling
-  'regexp': 'red'
-};
-
-
-function stylizeWithColor(str, styleType) {
-  var style = inspect.styles[styleType];
-
-  if (style) {
-    return '\u001b[' + inspect.colors[style][0] + 'm' + str +
-           '\u001b[' + inspect.colors[style][1] + 'm';
-  } else {
-    return str;
-  }
-}
-
-
-function stylizeNoColor(str, styleType) {
-  return str;
-}
-
-
-function arrayToHash(array) {
-  var hash = {};
-
-  array.forEach(function(val, idx) {
-    hash[val] = true;
-  });
-
-  return hash;
-}
-
-
-function formatValue(ctx, value, recurseTimes) {
-  // Provide a hook for user-specified inspect functions.
-  // Check that value is an object with an inspect function on it
-  if (ctx.customInspect &&
-      value &&
-      isFunction(value.inspect) &&
-      // Filter out the util module, it's inspect function is special
-      value.inspect !== exports.inspect &&
-      // Also filter out any prototype objects using the circular check.
-      !(value.constructor && value.constructor.prototype === value)) {
-    var ret = value.inspect(recurseTimes, ctx);
-    if (!isString(ret)) {
-      ret = formatValue(ctx, ret, recurseTimes);
-    }
-    return ret;
-  }
-
-  // Primitive types cannot have properties
-  var primitive = formatPrimitive(ctx, value);
-  if (primitive) {
-    return primitive;
-  }
-
-  // Look up the keys of the object.
-  var keys = Object.keys(value);
-  var visibleKeys = arrayToHash(keys);
-
-  if (ctx.showHidden) {
-    keys = Object.getOwnPropertyNames(value);
-  }
-
-  // Some type of object without properties can be shortcutted.
-  if (keys.length === 0) {
-    if (isFunction(value)) {
-      var name = value.name ? ': ' + value.name : '';
-      return ctx.stylize('[Function' + name + ']', 'special');
-    }
-    if (isRegExp(value)) {
-      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
-    }
-    if (isDate(value)) {
-      return ctx.stylize(Date.prototype.toString.call(value), 'date');
-    }
-    if (isError(value)) {
-      return formatError(value);
-    }
-  }
-
-  var base = '', array = false, braces = ['{', '}'];
-
-  // Make Array say that they are Array
-  if (isArray(value)) {
-    array = true;
-    braces = ['[', ']'];
-  }
-
-  // Make functions say that they are functions
-  if (isFunction(value)) {
-    var n = value.name ? ': ' + value.name : '';
-    base = ' [Function' + n + ']';
-  }
-
-  // Make RegExps say that they are RegExps
-  if (isRegExp(value)) {
-    base = ' ' + RegExp.prototype.toString.call(value);
-  }
-
-  // Make dates with properties first say the date
-  if (isDate(value)) {
-    base = ' ' + Date.prototype.toUTCString.call(value);
-  }
-
-  // Make error with message first say the error
-  if (isError(value)) {
-    base = ' ' + formatError(value);
-  }
-
-  if (keys.length === 0 && (!array || value.length == 0)) {
-    return braces[0] + base + braces[1];
-  }
-
-  if (recurseTimes < 0) {
-    if (isRegExp(value)) {
-      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
-    } else {
-      return ctx.stylize('[Object]', 'special');
-    }
-  }
-
-  ctx.seen.push(value);
-
-  var output;
-  if (array) {
-    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
-  } else {
-    output = keys.map(function(key) {
-      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
-    });
-  }
-
-  ctx.seen.pop();
-
-  return reduceToSingleString(output, base, braces);
-}
-
-
-function formatPrimitive(ctx, value) {
-  if (isUndefined(value))
-    return ctx.stylize('undefined', 'undefined');
-  if (isString(value)) {
-    var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
-                                             .replace(/'/g, "\\'")
-                                             .replace(/\\"/g, '"') + '\'';
-    return ctx.stylize(simple, 'string');
-  }
-  if (isNumber(value)) {
-    // Format -0 as '-0'. Strict equality won't distinguish 0 from -0,
-    // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 .
-    if (value === 0 && 1 / value < 0)
-      return ctx.stylize('-0', 'number');
-    return ctx.stylize('' + value, 'number');
-  }
-  if (isBoolean(value))
-    return ctx.stylize('' + value, 'boolean');
-  // For some reason typeof null is "object", so special case here.
-  if (isNull(value))
-    return ctx.stylize('null', 'null');
-}
-
-
-function formatError(value) {
-  return '[' + Error.prototype.toString.call(value) + ']';
-}
-
-
-function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
-  var output = [];
-  for (var i = 0, l = value.length; i < l; ++i) {
-    if (hasOwnProperty(value, String(i))) {
-      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
-          String(i), true));
-    } else {
-      output.push('');
-    }
-  }
-  keys.forEach(function(key) {
-    if (!key.match(/^\d+$/)) {
-      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
-          key, true));
-    }
-  });
-  return output;
-}
-
-
-function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
-  var name, str, desc;
-  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
-  if (desc.get) {
-    if (desc.set) {
-      str = ctx.stylize('[Getter/Setter]', 'special');
-    } else {
-      str = ctx.stylize('[Getter]', 'special');
-    }
-  } else {
-    if (desc.set) {
-      str = ctx.stylize('[Setter]', 'special');
-    }
-  }
-  if (!hasOwnProperty(visibleKeys, key)) {
-    name = '[' + key + ']';
-  }
-  if (!str) {
-    if (ctx.seen.indexOf(desc.value) < 0) {
-      if (isNull(recurseTimes)) {
-        str = formatValue(ctx, desc.value, null);
-      } else {
-        str = formatValue(ctx, desc.value, recurseTimes - 1);
-      }
-      if (str.indexOf('\n') > -1) {
-        if (array) {
-          str = str.split('\n').map(function(line) {
-            return '  ' + line;
-          }).join('\n').substr(2);
-        } else {
-          str = '\n' + str.split('\n').map(function(line) {
-            return '   ' + line;
-          }).join('\n');
-        }
-      }
-    } else {
-      str = ctx.stylize('[Circular]', 'special');
-    }
-  }
-  if (isUndefined(name)) {
-    if (array && key.match(/^\d+$/)) {
-      return str;
-    }
-    name = JSON.stringify('' + key);
-    if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
-      name = name.substr(1, name.length - 2);
-      name = ctx.stylize(name, 'name');
-    } else {
-      name = name.replace(/'/g, "\\'")
-                 .replace(/\\"/g, '"')
-                 .replace(/(^"|"$)/g, "'");
-      name = ctx.stylize(name, 'string');
-    }
-  }
-
-  return name + ': ' + str;
-}
-
-
-function reduceToSingleString(output, base, braces) {
-  var numLinesEst = 0;
-  var length = output.reduce(function(prev, cur) {
-    numLinesEst++;
-    if (cur.indexOf('\n') >= 0) numLinesEst++;
-    return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
-  }, 0);
-
-  if (length > 60) {
-    return braces[0] +
-           (base === '' ? '' : base + '\n ') +
-           ' ' +
-           output.join(',\n  ') +
-           ' ' +
-           braces[1];
-  }
-
-  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
-}
-
-
 // NOTE: These type checking functions intentionally don't use `instanceof`
 // because it is fragile and can be easily faked with `Object.create()`.
 function isArray(ar) {
@@ -522,166 +98,10 @@ function isPrimitive(arg) {
 exports.isPrimitive = isPrimitive;

 function isBuffer(arg) {
-  return arg instanceof Buffer;
+  return Buffer.isBuffer(arg);
 }
 exports.isBuffer = isBuffer;

 function objectToString(o) {
   return Object.prototype.toString.call(o);
-}
-
-
-function pad(n) {
-  return n < 10 ? '0' + n.toString(10) : n.toString(10);
-}
-
-
-var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
-              'Oct', 'Nov', 'Dec'];
-
-// 26 Feb 16:19:34
-function timestamp() {
-  var d = new Date();
-  var time = [pad(d.getHours()),
-              pad(d.getMinutes()),
-              pad(d.getSeconds())].join(':');
-  return [d.getDate(), months[d.getMonth()], time].join(' ');
-}
-
-
-// log is just a thin wrapper to console.log that prepends a timestamp
-exports.log = function() {
-  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
-};
-
-
-/**
- * Inherit the prototype methods from one constructor into another.
- *
- * The Function.prototype.inherits from lang.js rewritten as a standalone
- * function (not on Function.prototype). NOTE: If this file is to be loaded
- * during bootstrapping this function needs to be rewritten using some native
- * functions as prototype setup using normal JavaScript does not work as
- * expected during bootstrapping (see mirror.js in r114903).
- *
- * @param {function} ctor Constructor function which needs to inherit the
- *     prototype.
- * @param {function} superCtor Constructor function to inherit prototype from.
- */
-exports.inherits = function(ctor, superCtor) {
-  ctor.super_ = superCtor;
-  ctor.prototype = Object.create(superCtor.prototype, {
-    constructor: {
-      value: ctor,
-      enumerable: false,
-      writable: true,
-      configurable: true
-    }
-  });
-};
-
-exports._extend = function(origin, add) {
-  // Don't do anything if add isn't an object
-  if (!add || !isObject(add)) return origin;
-
-  var keys = Object.keys(add);
-  var i = keys.length;
-  while (i--) {
-    origin[keys[i]] = add[keys[i]];
-  }
-  return origin;
-};
-
-function hasOwnProperty(obj, prop) {
-  return Object.prototype.hasOwnProperty.call(obj, prop);
-}
-
-
-// Deprecated old stuff.
-
-exports.p = exports.deprecate(function() {
-  for (var i = 0, len = arguments.length; i < len; ++i) {
-    console.error(exports.inspect(arguments[i]));
-  }
-}, 'util.p: Use console.error() instead');
-
-
-exports.exec = exports.deprecate(function() {
-  return require('child_process').exec.apply(this, arguments);
-}, 'util.exec is now called `child_process.exec`.');
-
-
-exports.print = exports.deprecate(function() {
-  for (var i = 0, len = arguments.length; i < len; ++i) {
-    process.stdout.write(String(arguments[i]));
-  }
-}, 'util.print: Use console.log instead');
-
-
-exports.puts = exports.deprecate(function() {
-  for (var i = 0, len = arguments.length; i < len; ++i) {
-    process.stdout.write(arguments[i] + '\n');
-  }
-}, 'util.puts: Use console.log instead');
-
-
-exports.debug = exports.deprecate(function(x) {
-  process.stderr.write('DEBUG: ' + x + '\n');
-}, 'util.debug: Use console.error instead');
-
-
-exports.error = exports.deprecate(function(x) {
-  for (var i = 0, len = arguments.length; i < len; ++i) {
-    process.stderr.write(arguments[i] + '\n');
-  }
-}, 'util.error: Use console.error instead');
-
-
-exports.pump = exports.deprecate(function(readStream, writeStream, callback) {
-  var callbackCalled = false;
-
-  function call(a, b, c) {
-    if (callback && !callbackCalled) {
-      callback(a, b, c);
-      callbackCalled = true;
-    }
-  }
-
-  readStream.addListener('data', function(chunk) {
-    if (writeStream.write(chunk) === false) readStream.pause();
-  });
-
-  writeStream.addListener('drain', function() {
-    readStream.resume();
-  });
-
-  readStream.addListener('end', function() {
-    writeStream.end();
-  });
-
-  readStream.addListener('close', function() {
-    call();
-  });
-
-  readStream.addListener('error', function(err) {
-    writeStream.end();
-    call(err);
-  });
-
-  writeStream.addListener('error', function(err) {
-    readStream.destroy();
-    call(err);
-  });
-}, 'util.pump(): Use readableStream.pipe() instead');
-
-
-var uv;
-exports._errnoException = function(err, syscall) {
-  if (isUndefined(uv)) uv = process.binding('uv');
-  var errname = uv.errname(err);
-  var e = new Error(syscall + ' ' + errname);
-  e.code = errname;
-  e.errno = errname;
-  e.syscall = syscall;
-  return e;
-};
+}{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "deprecated": false,
  "description": "The `util.is*` functions introduced in Node v0.12.",
  "devDependencies": {
    "tap": "^2.3.0"
  },
  "homepage": "https://github.com/isaacs/core-util-is#readme",
  "license": "MIT",
  "main": "lib/util.js",
  "name": "core-util-is",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/core-util-is.git"
  },
  "version": "1.0.2"
}// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// NOTE: These type checking functions intentionally don't use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.

function isArray(arg) {
  if (Array.isArray) {
    return Array.isArray(arg);
  }
  return objectToString(arg) === '[object Array]';
}
exports.isArray = isArray;

function isBoolean(arg) {
  return typeof arg === 'boolean';
}
exports.isBoolean = isBoolean;

function isNull(arg) {
  return arg === null;
}
exports.isNull = isNull;

function isNullOrUndefined(arg) {
  return arg == null;
}
exports.isNullOrUndefined = isNullOrUndefined;

function isNumber(arg) {
  return typeof arg === 'number';
}
exports.isNumber = isNumber;

function isString(arg) {
  return typeof arg === 'string';
}
exports.isString = isString;

function isSymbol(arg) {
  return typeof arg === 'symbol';
}
exports.isSymbol = isSymbol;

function isUndefined(arg) {
  return arg === void 0;
}
exports.isUndefined = isUndefined;

function isRegExp(re) {
  return objectToString(re) === '[object RegExp]';
}
exports.isRegExp = isRegExp;

function isObject(arg) {
  return typeof arg === 'object' && arg !== null;
}
exports.isObject = isObject;

function isDate(d) {
  return objectToString(d) === '[object Date]';
}
exports.isDate = isDate;

function isError(e) {
  return (objectToString(e) === '[object Error]' || e instanceof Error);
}
exports.isError = isError;

function isFunction(arg) {
  return typeof arg === 'function';
}
exports.isFunction = isFunction;

function isPrimitive(arg) {
  return arg === null ||
         typeof arg === 'boolean' ||
         typeof arg === 'number' ||
         typeof arg === 'string' ||
         typeof arg === 'symbol' ||  // ES6 symbol
         typeof arg === 'undefined';
}
exports.isPrimitive = isPrimitive;

exports.isBuffer = Buffer.isBuffer;

function objectToString(o) {
  return Object.prototype.toString.call(o);
}
The MIT License (MIT)

Copyright (c) 2018 Made With MOXY Lda <hello@moxy.studio>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'use strict';

const cp = require('child_process');
const parse = require('./lib/parse');
const enoent = require('./lib/enoent');

function spawn(command, args, options) {
    // Parse the arguments
    const parsed = parse(command, args, options);

    // Spawn the child process
    const spawned = cp.spawn(parsed.command, parsed.args, parsed.options);

    // Hook into child process "exit" event to emit an error if the command
    // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
    enoent.hookChildProcess(spawned, parsed);

    return spawned;
}

function spawnSync(command, args, options) {
    // Parse the arguments
    const parsed = parse(command, args, options);

    // Spawn the child process
    const result = cp.spawnSync(parsed.command, parsed.args, parsed.options);

    // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
    result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);

    return result;
}

module.exports = spawn;
module.exports.spawn = spawn;
module.exports.sync = spawnSync;

module.exports._parse = parse;
module.exports._enoent = enoent;
{
  "author": {
    "name": "AndrÃ© Cruz",
    "email": "andre@moxy.studio"
  },
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "dependencies": {
    "nice-try": "^1.0.4",
    "path-key": "^2.0.1",
    "semver": "^5.5.0",
    "shebang-command": "^1.2.0",
    "which": "^1.2.9"
  },
  "deprecated": false,
  "description": "Cross platform child_process#spawn and child_process#spawnSync",
  "devDependencies": {
    "@commitlint/cli": "^6.0.0",
    "@commitlint/config-conventional": "^6.0.2",
    "babel-core": "^6.26.0",
    "babel-jest": "^22.1.0",
    "babel-preset-moxy": "^2.2.1",
    "eslint": "^4.3.0",
    "eslint-config-moxy": "^5.0.0",
    "husky": "^0.14.3",
    "jest": "^22.0.0",
    "lint-staged": "^7.0.0",
    "mkdirp": "^0.5.1",
    "regenerator-runtime": "^0.11.1",
    "rimraf": "^2.6.2",
    "standard-version": "^4.2.0"
  },
  "engines": {
    "node": ">=4.8"
  },
  "files": [
    "lib"
  ],
  "homepage": "https://github.com/moxystudio/node-cross-spawn",
  "license": "MIT",
  "lint-staged": {
    "*.js": [
      "eslint --fix",
      "git add"
    ]
  },
  "main": "index.js",
  "name": "cross-spawn",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/moxystudio/node-cross-spawn.git"
  },
  "standard-version": {
    "scripts": {
      "posttag": "git push --follow-tags origin master && npm publish"
    }
  },
  "version": "6.0.5"
}'use strict';

const isWin = process.platform === 'win32';

function notFoundError(original, syscall) {
    return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), {
        code: 'ENOENT',
        errno: 'ENOENT',
        syscall: `${syscall} ${original.command}`,
        path: original.command,
        spawnargs: original.args,
    });
}

function hookChildProcess(cp, parsed) {
    if (!isWin) {
        return;
    }

    const originalEmit = cp.emit;

    cp.emit = function (name, arg1) {
        // If emitting "exit" event and exit code is 1, we need to check if
        // the command exists and emit an "error" instead
        // See https://github.com/IndigoUnited/node-cross-spawn/issues/16
        if (name === 'exit') {
            const err = verifyENOENT(arg1, parsed, 'spawn');

            if (err) {
                return originalEmit.call(cp, 'error', err);
            }
        }

        return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params
    };
}

function verifyENOENT(status, parsed) {
    if (isWin && status === 1 && !parsed.file) {
        return notFoundError(parsed.original, 'spawn');
    }

    return null;
}

function verifyENOENTSync(status, parsed) {
    if (isWin && status === 1 && !parsed.file) {
        return notFoundError(parsed.original, 'spawnSync');
    }

    return null;
}

module.exports = {
    hookChildProcess,
    verifyENOENT,
    verifyENOENTSync,
    notFoundError,
};
'use strict';

const path = require('path');
const niceTry = require('nice-try');
const resolveCommand = require('./util/resolveCommand');
const escape = require('./util/escape');
const readShebang = require('./util/readShebang');
const semver = require('semver');

const isWin = process.platform === 'win32';
const isExecutableRegExp = /\.(?:com|exe)$/i;
const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;

// `options.shell` is supported in Node ^4.8.0, ^5.7.0 and >= 6.0.0
const supportsShellOption = niceTry(() => semver.satisfies(process.version, '^4.8.0 || ^5.7.0 || >= 6.0.0', true)) || false;

function detectShebang(parsed) {
    parsed.file = resolveCommand(parsed);

    const shebang = parsed.file && readShebang(parsed.file);

    if (shebang) {
        parsed.args.unshift(parsed.file);
        parsed.command = shebang;

        return resolveCommand(parsed);
    }

    return parsed.file;
}

function parseNonShell(parsed) {
    if (!isWin) {
        return parsed;
    }

    // Detect & add support for shebangs
    const commandFile = detectShebang(parsed);

    // We don't need a shell if the command filename is an executable
    const needsShell = !isExecutableRegExp.test(commandFile);

    // If a shell is required, use cmd.exe and take care of escaping everything correctly
    // Note that `forceShell` is an hidden option used only in tests
    if (parsed.options.forceShell || needsShell) {
        // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/`
        // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument
        // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called,
        // we need to double escape them
        const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile);

        // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar)
        // This is necessary otherwise it will always fail with ENOENT in those cases
        parsed.command = path.normalize(parsed.command);

        // Escape command & arguments
        parsed.command = escape.command(parsed.command);
        parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars));

        const shellCommand = [parsed.command].concat(parsed.args).join(' ');

        parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`];
        parsed.command = process.env.comspec || 'cmd.exe';
        parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped
    }

    return parsed;
}

function parseShell(parsed) {
    // If node supports the shell option, there's no need to mimic its behavior
    if (supportsShellOption) {
        return parsed;
    }

    // Mimic node shell option
    // See https://github.com/nodejs/node/blob/b9f6a2dc059a1062776133f3d4fd848c4da7d150/lib/child_process.js#L335
    const shellCommand = [parsed.command].concat(parsed.args).join(' ');

    if (isWin) {
        parsed.command = typeof parsed.options.shell === 'string' ? parsed.options.shell : process.env.comspec || 'cmd.exe';
        parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`];
        parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped
    } else {
        if (typeof parsed.options.shell === 'string') {
            parsed.command = parsed.options.shell;
        } else if (process.platform === 'android') {
            parsed.command = '/system/bin/sh';
        } else {
            parsed.command = '/bin/sh';
        }

        parsed.args = ['-c', shellCommand];
    }

    return parsed;
}

function parse(command, args, options) {
    // Normalize arguments, similar to nodejs
    if (args && !Array.isArray(args)) {
        options = args;
        args = null;
    }

    args = args ? args.slice(0) : []; // Clone array to avoid changing the original
    options = Object.assign({}, options); // Clone object to avoid changing the original

    // Build our parsed object
    const parsed = {
        command,
        args,
        options,
        file: undefined,
        original: {
            command,
            args,
        },
    };

    // Delegate further parsing to shell or non-shell
    return options.shell ? parseShell(parsed) : parseNonShell(parsed);
}

module.exports = parse;
'use strict';

// See http://www.robvanderwoude.com/escapechars.php
const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g;

function escapeCommand(arg) {
    // Escape meta chars
    arg = arg.replace(metaCharsRegExp, '^$1');

    return arg;
}

function escapeArgument(arg, doubleEscapeMetaChars) {
    // Convert to string
    arg = `${arg}`;

    // Algorithm below is based on https://qntm.org/cmd

    // Sequence of backslashes followed by a double quote:
    // double up all the backslashes and escape the double quote
    arg = arg.replace(/(\\*)"/g, '$1$1\\"');

    // Sequence of backslashes followed by the end of the string
    // (which will become a double quote later):
    // double up all the backslashes
    arg = arg.replace(/(\\*)$/, '$1$1');

    // All other backslashes occur literally

    // Quote the whole thing:
    arg = `"${arg}"`;

    // Escape meta chars
    arg = arg.replace(metaCharsRegExp, '^$1');

    // Double escape meta chars if necessary
    if (doubleEscapeMetaChars) {
        arg = arg.replace(metaCharsRegExp, '^$1');
    }

    return arg;
}

module.exports.command = escapeCommand;
module.exports.argument = escapeArgument;
'use strict';

const fs = require('fs');
const shebangCommand = require('shebang-command');

function readShebang(command) {
    // Read the first 150 bytes from the file
    const size = 150;
    let buffer;

    if (Buffer.alloc) {
        // Node.js v4.5+ / v5.10+
        buffer = Buffer.alloc(size);
    } else {
        // Old Node.js API
        buffer = new Buffer(size);
        buffer.fill(0); // zero-fill
    }

    let fd;

    try {
        fd = fs.openSync(command, 'r');
        fs.readSync(fd, buffer, 0, size, 0);
        fs.closeSync(fd);
    } catch (e) { /* Empty */ }

    // Attempt to extract shebang (null is returned if not a shebang)
    return shebangCommand(buffer.toString());
}

module.exports = readShebang;
'use strict';

const path = require('path');
const which = require('which');
const pathKey = require('path-key')();

function resolveCommandAttempt(parsed, withoutPathExt) {
    const cwd = process.cwd();
    const hasCustomCwd = parsed.options.cwd != null;

    // If a custom `cwd` was specified, we need to change the process cwd
    // because `which` will do stat calls but does not support a custom cwd
    if (hasCustomCwd) {
        try {
            process.chdir(parsed.options.cwd);
        } catch (err) {
            /* Empty */
        }
    }

    let resolved;

    try {
        resolved = which.sync(parsed.command, {
            path: (parsed.options.env || process.env)[pathKey],
            pathExt: withoutPathExt ? path.delimiter : undefined,
        });
    } catch (e) {
        /* Empty */
    } finally {
        process.chdir(cwd);
    }

    // If we successfully resolved, ensure that an absolute path is returned
    // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it
    if (resolved) {
        resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved);
    }

    return resolved;
}

function resolveCommand(parsed) {
    return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true);
}

module.exports = resolveCommand;
'use strict';
const crypto = require('crypto');

module.exports = len => {
	if (!Number.isFinite(len)) {
		throw new TypeError('Expected a finite number');
	}

	return crypto.randomBytes(Math.ceil(len / 2)).toString('hex').slice(0, len);
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Generate a cryptographically strong random string",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/crypto-random-string#readme",
  "license": "MIT",
  "name": "crypto-random-string",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/crypto-random-string.git"
  },
  "version": "1.0.0"
}'use strict';
var core = require('./core');

function unwrapEvent(event) {
	if (event && event.detail && event.detail.promise) {
		return event.detail;
	}

	return event;
}

module.exports = function (w) {
	w = w || window;
	var c = core();

	w.addEventListener('unhandledrejection', function (event) {
		event = unwrapEvent(event);
		c.onUnhandledRejection(event.reason, event.promise);
	});

	w.addEventListener('rejectionhandled', function (event) {
		event = unwrapEvent(event);
		c.onRejectionHandled(event.promise);
	});

	return c.currentlyUnhandled;
};
'use strict';
var arrayFindIndex = require('array-find-index');

module.exports = function () {
	var unhandledRejections = [];

	function onUnhandledRejection(reason, promise) {
		unhandledRejections.push({reason: reason, promise: promise});
	}

	function onRejectionHandled(promise) {
		var index = arrayFindIndex(unhandledRejections, function (x) {
			return x.promise === promise;
		});

		unhandledRejections.splice(index, 1);
	}

	function currentlyUnhandled() {
		return unhandledRejections.map(function (entry) {
			return {
				reason: entry.reason,
				promise: entry.promise
			};
		});
	}

	return {
		onUnhandledRejection: onUnhandledRejection,
		onRejectionHandled: onRejectionHandled,
		currentlyUnhandled: currentlyUnhandled
	};
};
'use strict';
var core = require('./core');

module.exports = function (p) {
	p = p || process;
	var c = core();

	p.on('unhandledRejection', c.onUnhandledRejection);
	p.on('rejectionHandled', c.onRejectionHandled);

	return c.currentlyUnhandled;
};
The MIT License (MIT)

Copyright (c) James Talmage <james@talmage.io> (github.com/jamestalmage)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "James Talmage",
    "email": "james@talmage.io",
    "url": "github.com/jamestalmage"
  },
  "browser": {
    "./index.js": "./browser.js"
  },
  "dependencies": {
    "array-find-index": "^1.0.1"
  },
  "deprecated": false,
  "description": "Track the list of currently unhandled promise rejections.",
  "devDependencies": {
    "ava": "^0.15.1",
    "bluebird": "^3.4.0",
    "browserify": "^13.0.1",
    "coveralls": "^2.11.9",
    "delay": "^1.3.1",
    "is-ci": "^1.0.8",
    "karma": "^0.13.22",
    "karma-browserify": "^5.0.5",
    "karma-chrome-launcher": "^1.0.1",
    "karma-firefox-launcher": "^1.0.0",
    "karma-mocha": "^1.0.1",
    "mocha": "^2.5.3",
    "nyc": "^6.4.0",
    "watchify": "^3.7.0",
    "xo": "^0.15.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js",
    "core.js",
    "browser.js"
  ],
  "homepage": "https://github.com/jamestalmage/currently-unhandled#readme",
  "license": "MIT",
  "name": "currently-unhandled",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jamestalmage/currently-unhandled.git"
  },
  "version": "0.4.1"
}# node-dashdash changelog

## not yet released

(nothing yet)

## 1.14.1

- [issue #30] Change the output used by dashdash's Bash completion support to
  indicate "there are no completions for this argument" to cope with different
  sorting rules on different Bash/platforms. For example:

        $ triton -v -p test2 package get <TAB>          # before
        ##-no -tritonpackage- completions-##

        $ triton -v -p test2 package get <TAB>          # after
        ##-no-completion- -results-##

## 1.14.0

- New `synopsisFromOpt(<option spec>)` function. This will be used by
  [node-cmdln](https://github.com/trentm/node-cmdln) to put together a synopsis
  of options for a command. Some examples:

        > synopsisFromOpt({names: ['help', 'h'], type: 'bool'});
        '[ --help | -h ]'
        > synopsisFromOpt({name: 'file', type: 'string', helpArg: 'FILE'});
        '[ --file=FILE ]'


## 1.13.1

- [issue #20] `bashCompletionSpecFromOptions` breaks on an options array with
  an empty-string group.


## 1.13.0

- Update assert-plus dep to 1.x to get recent fixes (particularly for
  `assert.optional*`).

- Drop testing (and official support in packages.json#engines) for node 0.8.x.
  Add testing against node 5.x and 4.x with `make testall`.

- [pull #16] Change the `positiveInteger` type to NOT accept zero (0).
  For those who might need the old behaviour, see
  "examples/custom-option-intGteZero.js".  (By Dave Pacheco.)


## 1.12.2

- Bash completion: Add `argtypes` to specify the types of positional args.
  E.g. this would allow you to have an `ssh` command with `argtypes = ['host',
  'cmd']` for bash completion. You then have to provide Bash functions to
  handle completing those types via the `specExtra` arg. See
  "[examples/ddcompletion.js](examples/ddcompletion.js)" for an example.

- Bash completion: Tweak so that options or only offered as completions when
  there is a leading '-'. E.g. `mytool <TAB>` does NOT offer options, `mytool
  -<TAB>` *does*. Without this, a tool with options would never be able to
  fallback to Bash's "default" completion. For example `ls <TAB>` wouldn't
  result in filename completion. Now it will.

- Bash completion: A workaround for not being able to explicitly have *no*
  completion results. Because dashdash's completion uses `complete -o default`,
  we fallback to Bash's "default" completion (typically for filename
  completion). Before this change, an attempt to explicitly say "there are
  no completions that match" would unintentionally trigger filename completion.
  Instead as a workaround we return:

        $ ddcompletion --none <TAB>         # the 'none' argtype
        ##-no           completions-##

        $ ddcompletion                      # a custom 'fruit' argtype
        apple   banana  orange
        $ ddcompletion z
        ##-no           -fruit-         completions-##

  This is a bit of a hack, but IMO a better experience than the surprise
  of matching a local filename beginning with 'z', which isn't, in this
  case, a "fruit".

## 1.12.1

- Bash completion: Document `<option spec>.completionType`. Add `includeHidden`
  option to `bashCompletionSpecFromOptions()`. Add support for dealing with
  hidden subcmds.


## 1.12.0

- Support for generating Bash completion files. See the "Bash completion"
  section of the README.md and "examples/ddcompletion.js" for an example.


## 1.11.0

- Add the `arrayFlatten` boolean option to `dashdash.addOptionType` used for
  custom option types. This allows one to create an `arrayOf...` option type
  where each usage of the option can return multiple results. For example:

        node mytool.js --foo a,b --foo c

  We could define an option type for `--foo` such that
  `opts.foo = ['a', 'b', 'c']`. See
  "[examples/custom-option-arrayOfCommaSepString.js](examples/custom-option-arrayOfCommaSepString.js)"
  for an example.


## 1.10.1

- Trim the published package to the minimal bits. Before: 24K tarball, 144K unpacked.
  After: 12K tarball, 48K unpacked. `npm` won't let me drop the README.md. :)


## 1.10.0

- [issue #9] Support `includeDefault` in help config (similar to `includeEnv`) to have a
  note of an option's default value, if any, in help output.
- [issue #11] Fix option group breakage introduced in v1.9.0.


## 1.9.0

- [issue #10] Custom option types added with `addOptionType` can specify a
  "default" value. See "examples/custom-option-fruit.js".


## 1.8.0

- Support `hidden: true` in an option spec to have help output exclude this
  option.


## 1.7.3

- [issue #8] Fix parsing of a short option group when one of the
  option takes an argument. For example, consider `tail` with
  a `-f` boolean option and a `-n` option that takes a number
  argument. This should parse:

        tail -fn5

  Before this change, that would not parse correctly.
  It is suspected that this was introduced in version 1.4.0
  (with commit 656fa8bc71c372ebddad0a7026bd71611e2ec99a).


## 1.7.2

- Known issues: #8

- Exclude 'tools/' dir in packages published to npm.


## 1.7.1

- Known issues: #8

- Support an option group *empty string* value:

        ...
        { group: '' },
        ...

  to render as a blank line in option help. This can help separate loosely
  related sets of options without resorting to a title for option groups.


## 1.7.0

- Known issues: #8

- [pull #7] Support for `<parser>.help({helpWrap: false, ...})` option to be able
  to fully control the formatting for option help (by Patrick Mooney) `helpWrap:
  false` can also be set on individual options in the option objects, e.g.:

        var options = [
            {
              names: ['foo'],
              type: 'string',
              helpWrap: false,
              help: 'long help with\n  newlines' +
                '\n  spaces\n  and such\nwill render correctly'
            },
            ...
        ];


## 1.6.0

- Known issues: #8

- [pull #6] Support headings between groups of options (by Joshua M. Clulow)
  so that this code:

        var options = [
            { group: 'Armament Options' },
            { names: [ 'weapon', 'w' ], type: 'string' },
            { group: 'General Options' },
            { names: [ 'help', 'h' ], type: 'bool' }
        ];
        ...

  will give you this help output:

        ...
          Armament Options:
            -w, --weapon

          General Options:
            -h, --help
        ...


## 1.5.0

- Known issues: #8

- Add support for adding custom option types. "examples/custom-option-duration.js"
  shows an example adding a "duration" option type.

        $ node custom-option-duration.js -t 1h
        duration: 3600000 ms
        $ node custom-option-duration.js -t 1s
        duration: 1000 ms
        $ node custom-option-duration.js -t 5d
        duration: 432000000 ms
        $ node custom-option-duration.js -t bogus
        custom-option-duration.js: error: arg for "-t" is not a valid duration: "bogus"

  A custom option type is added via:

        var dashdash = require('dashdash');
        dashdash.addOptionType({
            name: '...',
            takesArg: true,
            helpArg: '...',
            parseArg: function (option, optstr, arg) {
                ...
            }
        });

- [issue #4] Add `date` and `arrayOfDate` option types. They accept these date
  formats: epoch second times (e.g. 1396031701) and ISO 8601 format:
  `YYYY-MM-DD[THH:MM:SS[.sss][Z]]` (e.g. "2014-03-28",
  "2014-03-28T18:35:01.489Z"). See "examples/date.js" for an example usage.

        $ node examples/date.js -s 2014-01-01 -e $(date +%s)
        start at 2014-01-01T00:00:00.000Z
        end at 2014-03-29T04:26:18.000Z


## 1.4.0

- Known issues: #8

- [pull #2, pull #3] Add a `allowUnknown: true` option on `createParser` to
  allow unknown options to be passed through as `opts._args` instead of parsing
  throwing an exception (by https://github.com/isaacs).

  See 'allowUnknown' in the README for a subtle caveat.


## 1.3.2

- Fix a subtlety where a *bool* option using both `env` and `default` didn't
  work exactly correctly. If `default: false` then all was fine (by luck).
  However, if you had an option like this:

        options: [ {
            names: ['verbose', 'v'],
            env: 'FOO_VERBOSE',
            'default': true,    // <--- this
            type: 'bool'
        } ],

  wanted `FOO_VERBOSE=0` to make the option false, then you need the fix
  in this version of dashdash.


## 1.3.1

- [issue #1] Fix an envvar not winning over an option 'default'. Previously
  an option with both `default` and `env` would never take a value from the
  environment variable. E.g. `FOO_FILE` would never work here:

        options: [ {
            names: ['file', 'f'],
            env: 'FOO_FILE',
            'default': 'default.file',
            type: 'string'
        } ],


## 1.3.0

- [Backward incompatible change for boolean envvars] Change the
  interpretation of environment variables for boolean options to consider '0'
  to be false. Previous to this *any* value to the envvar was considered
  true -- which was quite misleading. Example:

        $ FOO_VERBOSE=0 node examples/foo.js
        # opts: { verbose: [ false ],
          _order: [ { key: 'verbose', value: false, from: 'env' } ],
          _args: [] }
        # args: []


## 1.2.1

- Fix for `parse.help({includeEnv: true, ...})` handling to ensure that an
  option with an `env` **but no `help`** still has the "Environment: ..."
  output. E.g.:

        { names: ['foo'], type: 'string', env: 'FOO' }

        ...

        --foo=ARG      Environment: FOO=ARG


## 1.2.0

- Transform the option key on the `opts` object returned from
  `<parser>.parse()` for convenience. Currently this is just
  `s/-/_/g`, e.g. '--dry-run' -> `opts.dry_run`. This allow one to use hyphen
  in option names (common) but not have to do silly things like
  `opt["dry-run"]` to access the parsed results.


## 1.1.0

- Environment variable integration. Envvars can be associated with an option,
  then option processing will fallback to using that envvar if defined and
  if the option isn't specified in argv. See the "Environment variable
  integration" section in the README.

- Change the `<parser>.parse()` signature to take a single object with keys
  for arguments. The old signature is still supported.

- `dashdash.createParser(CONFIG)` alternative to `new dashdash.Parser(CONFIG)`
  a la many node-land APIs.


## 1.0.2

- Add "positiveInteger" and "arrayOfPositiveInteger" option types that only
  accept positive integers.

- Add "integer" and "arrayOfInteger" option types that accepts only integers.
  Note that, for better or worse, these do NOT accept: "0x42" (hex), "1e2"
  (with exponent) or "1.", "3.0" (floats).


## 1.0.1

- Fix not modifying the given option spec objects (which breaks creating
  a Parser with them more than once).


## 1.0.0

First release.
# This is the MIT license

Copyright (c) 2013 Trent Mick. All rights reserved.
Copyright (c) 2013 Joyent Inc. All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

{
  "author": {
    "name": "Trent Mick",
    "email": "trentm@gmail.com",
    "url": "http://trentm.com"
  },
  "dependencies": {
    "assert-plus": "^1.0.0"
  },
  "deprecated": false,
  "description": "A light, featureful and explicit option parsing library.",
  "devDependencies": {
    "nodeunit": "0.9.x"
  },
  "engines": {
    "node": ">=0.10"
  },
  "homepage": "https://github.com/trentm/node-dashdash#readme",
  "license": "MIT",
  "main": "./lib/dashdash.js",
  "name": "dashdash",
  "repository": {
    "type": "git",
    "url": "git://github.com/trentm/node-dashdash.git"
  },
  "version": "1.14.1"
}/**
 * dashdash - A light, featureful and explicit option parsing library for
 * node.js.
 */
// vim: set ts=4 sts=4 sw=4 et:

var assert = require('assert-plus');
var format = require('util').format;
var fs = require('fs');
var path = require('path');


var DEBUG = true;
if (DEBUG) {
    var debug = console.warn;
} else {
    var debug = function () {};
}



// ---- internal support stuff

// Replace {{variable}} in `s` with the template data in `d`.
function renderTemplate(s, d) {
    return s.replace(/{{([a-zA-Z]+)}}/g, function (match, key) {
        return d.hasOwnProperty(key) ? d[key] : match;
    });
}

/**
 * Return a shallow copy of the given object;
 */
function shallowCopy(obj) {
    if (!obj) {
        return (obj);
    }
    var copy = {};
    Object.keys(obj).forEach(function (k) {
        copy[k] = obj[k];
    });
    return (copy);
}


function space(n) {
    var s = '';
    for (var i = 0; i < n; i++) {
        s += ' ';
    }
    return s;
}


function makeIndent(arg, deflen, name) {
    if (arg === null || arg === undefined)
        return space(deflen);
    else if (typeof (arg) === 'number')
        return space(arg);
    else if (typeof (arg) === 'string')
        return arg;
    else
        assert.fail('invalid "' + name + '": not a string or number: ' + arg);
}


/**
 * Return an array of lines wrapping the given text to the given width.
 * This splits on whitespace. Single tokens longer than `width` are not
 * broken up.
 */
function textwrap(s, width) {
    var words = s.trim().split(/\s+/);
    var lines = [];
    var line = '';
    words.forEach(function (w) {
        var newLength = line.length + w.length;
        if (line.length > 0)
            newLength += 1;
        if (newLength > width) {
            lines.push(line);
            line = '';
        }
        if (line.length > 0)
            line += ' ';
        line += w;
    });
    lines.push(line);
    return lines;
}


/**
 * Transform an option name to a "key" that is used as the field
 * on the `opts` object returned from `<parser>.parse()`.
 *
 * Transformations:
 * - '-' -> '_': This allow one to use hyphen in option names (common)
 *   but not have to do silly things like `opt["dry-run"]` to access the
 *   parsed results.
 */
function optionKeyFromName(name) {
    return name.replace(/-/g, '_');
}



// ---- Option types

function parseBool(option, optstr, arg) {
    return Boolean(arg);
}

function parseString(option, optstr, arg) {
    assert.string(arg, 'arg');
    return arg;
}

function parseNumber(option, optstr, arg) {
    assert.string(arg, 'arg');
    var num = Number(arg);
    if (isNaN(num)) {
        throw new Error(format('arg for "%s" is not a number: "%s"',
            optstr, arg));
    }
    return num;
}

function parseInteger(option, optstr, arg) {
    assert.string(arg, 'arg');
    var num = Number(arg);
    if (!/^[0-9-]+$/.test(arg) || isNaN(num)) {
        throw new Error(format('arg for "%s" is not an integer: "%s"',
            optstr, arg));
    }
    return num;
}

function parsePositiveInteger(option, optstr, arg) {
    assert.string(arg, 'arg');
    var num = Number(arg);
    if (!/^[0-9]+$/.test(arg) || isNaN(num) || num === 0) {
        throw new Error(format('arg for "%s" is not a positive integer: "%s"',
            optstr, arg));
    }
    return num;
}

/**
 * Supported date args:
 * - epoch second times (e.g. 1396031701)
 * - ISO 8601 format: YYYY-MM-DD[THH:MM:SS[.sss][Z]]
 *      2014-03-28T18:35:01.489Z
 *      2014-03-28T18:35:01.489
 *      2014-03-28T18:35:01Z
 *      2014-03-28T18:35:01
 *      2014-03-28
 */
function parseDate(option, optstr, arg) {
    assert.string(arg, 'arg');
    var date;
    if (/^\d+$/.test(arg)) {
        // epoch seconds
        date = new Date(Number(arg) * 1000);
    /* JSSTYLED */
    } else if (/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?Z?)?$/i.test(arg)) {
        // ISO 8601 format
        date = new Date(arg);
    } else {
        throw new Error(format('arg for "%s" is not a valid date format: "%s"',
            optstr, arg));
    }
    if (date.toString() === 'Invalid Date') {
        throw new Error(format('arg for "%s" is an invalid date: "%s"',
            optstr, arg));
    }
    return date;
}

var optionTypes = {
    bool: {
        takesArg: false,
        parseArg: parseBool
    },
    string: {
        takesArg: true,
        helpArg: 'ARG',
        parseArg: parseString
    },
    number: {
        takesArg: true,
        helpArg: 'NUM',
        parseArg: parseNumber
    },
    integer: {
        takesArg: true,
        helpArg: 'INT',
        parseArg: parseInteger
    },
    positiveInteger: {
        takesArg: true,
        helpArg: 'INT',
        parseArg: parsePositiveInteger
    },
    date: {
        takesArg: true,
        helpArg: 'DATE',
        parseArg: parseDate
    },
    arrayOfBool: {
        takesArg: false,
        array: true,
        parseArg: parseBool
    },
    arrayOfString: {
        takesArg: true,
        helpArg: 'ARG',
        array: true,
        parseArg: parseString
    },
    arrayOfNumber: {
        takesArg: true,
        helpArg: 'NUM',
        array: true,
        parseArg: parseNumber
    },
    arrayOfInteger: {
        takesArg: true,
        helpArg: 'INT',
        array: true,
        parseArg: parseInteger
    },
    arrayOfPositiveInteger: {
        takesArg: true,
        helpArg: 'INT',
        array: true,
        parseArg: parsePositiveInteger
    },
    arrayOfDate: {
        takesArg: true,
        helpArg: 'INT',
        array: true,
        parseArg: parseDate
    },
};



// ---- Parser

/**
 * Parser constructor.
 *
 * @param config {Object} The parser configuration
 *      - options {Array} Array of option specs. See the README for how to
 *        specify each option spec.
 *      - allowUnknown {Boolean} Default false. Whether to throw on unknown
 *        options. If false, then unknown args are included in the _args array.
 *      - interspersed {Boolean} Default true. Whether to allow interspersed
 *        arguments (non-options) and options. E.g.:
 *              node tool.js arg1 arg2 -v
 *        '-v' is after some args here. If `interspersed: false` then '-v'
 *        would not be parsed out. Note that regardless of `interspersed`
 *        the presence of '--' will stop option parsing, as all good
 *        option parsers should.
 */
function Parser(config) {
    assert.object(config, 'config');
    assert.arrayOfObject(config.options, 'config.options');
    assert.optionalBool(config.interspersed, 'config.interspersed');
    var self = this;

    // Allow interspersed arguments (true by default).
    this.interspersed = (config.interspersed !== undefined
        ? config.interspersed : true);

    // Don't allow unknown flags (true by default).
    this.allowUnknown = (config.allowUnknown !== undefined
        ? config.allowUnknown : false);

    this.options = config.options.map(function (o) { return shallowCopy(o); });
    this.optionFromName = {};
    this.optionFromEnv = {};
    for (var i = 0; i < this.options.length; i++) {
        var o = this.options[i];
        if (o.group !== undefined && o.group !== null) {
            assert.optionalString(o.group,
                format('config.options.%d.group', i));
            continue;
        }
        assert.ok(optionTypes[o.type],
            format('invalid config.options.%d.type: "%s" in %j',
                   i, o.type, o));
        assert.optionalString(o.name, format('config.options.%d.name', i));
        assert.optionalArrayOfString(o.names,
            format('config.options.%d.names', i));
        assert.ok((o.name || o.names) && !(o.name && o.names),
            format('exactly one of "name" or "names" required: %j', o));
        assert.optionalString(o.help, format('config.options.%d.help', i));
        var env = o.env || [];
        if (typeof (env) === 'string') {
            env = [env];
        }
        assert.optionalArrayOfString(env, format('config.options.%d.env', i));
        assert.optionalString(o.helpGroup,
            format('config.options.%d.helpGroup', i));
        assert.optionalBool(o.helpWrap,
            format('config.options.%d.helpWrap', i));
        assert.optionalBool(o.hidden, format('config.options.%d.hidden', i));

        if (o.name) {
            o.names = [o.name];
        } else {
            assert.string(o.names[0],
                format('config.options.%d.names is empty', i));
        }
        o.key = optionKeyFromName(o.names[0]);
        o.names.forEach(function (n) {
            if (self.optionFromName[n]) {
                throw new Error(format(
                    'option name collision: "%s" used in %j and %j',
                    n, self.optionFromName[n], o));
            }
            self.optionFromName[n] = o;
        });
        env.forEach(function (n) {
            if (self.optionFromEnv[n]) {
                throw new Error(format(
                    'option env collision: "%s" used in %j and %j',
                    n, self.optionFromEnv[n], o));
            }
            self.optionFromEnv[n] = o;
        });
    }
}

Parser.prototype.optionTakesArg = function optionTakesArg(option) {
    return optionTypes[option.type].takesArg;
};

/**
 * Parse options from the given argv.
 *
 * @param inputs {Object} Optional.
 *      - argv {Array} Optional. The argv to parse. Defaults to
 *        `process.argv`.
 *      - slice {Number} The index into argv at which options/args begin.
 *        Default is 2, as appropriate for `process.argv`.
 *      - env {Object} Optional. The env to use for 'env' entries in the
 *        option specs. Defaults to `process.env`.
 * @returns {Object} Parsed `opts`. It has special keys `_args` (the
 *      remaining args from `argv`) and `_order` (gives the order that
 *      options were specified).
 */
Parser.prototype.parse = function parse(inputs) {
    var self = this;

    // Old API was `parse([argv, [slice]])`
    if (Array.isArray(arguments[0])) {
        inputs = {argv: arguments[0], slice: arguments[1]};
    }

    assert.optionalObject(inputs, 'inputs');
    if (!inputs) {
        inputs = {};
    }
    assert.optionalArrayOfString(inputs.argv, 'inputs.argv');
    //assert.optionalNumber(slice, 'slice');
    var argv = inputs.argv || process.argv;
    var slice = inputs.slice !== undefined ? inputs.slice : 2;
    var args = argv.slice(slice);
    var env = inputs.env || process.env;
    var opts = {};
    var _order = [];

    function addOpt(option, optstr, key, val, from) {
        var type = optionTypes[option.type];
        var parsedVal = type.parseArg(option, optstr, val);
        if (type.array) {
            if (!opts[key]) {
                opts[key] = [];
            }
            if (type.arrayFlatten && Array.isArray(parsedVal)) {
                for (var i = 0; i < parsedVal.length; i++) {
                    opts[key].push(parsedVal[i]);
                }
            } else {
                opts[key].push(parsedVal);
            }
        } else {
            opts[key] = parsedVal;
        }
        var item = { key: key, value: parsedVal, from: from };
        _order.push(item);
    }

    // Parse args.
    var _args = [];
    var i = 0;
    outer: while (i < args.length) {
        var arg = args[i];

        // End of options marker.
        if (arg === '--') {
            i++;
            break;

        // Long option
        } else if (arg.slice(0, 2) === '--') {
            var name = arg.slice(2);
            var val = null;
            var idx = name.indexOf('=');
            if (idx !== -1) {
                val = name.slice(idx + 1);
                name = name.slice(0, idx);
            }
            var option = this.optionFromName[name];
            if (!option) {
                if (!this.allowUnknown)
                    throw new Error(format('unknown option: "--%s"', name));
                else if (this.interspersed)
                    _args.push(arg);
                else
                    break outer;
            } else {
                var takesArg = this.optionTakesArg(option);
                if (val !== null && !takesArg) {
                    throw new Error(format('argument given to "--%s" option '
                        + 'that does not take one: "%s"', name, arg));
                }
                if (!takesArg) {
                    addOpt(option, '--'+name, option.key, true, 'argv');
                } else if (val !== null) {
                    addOpt(option, '--'+name, option.key, val, 'argv');
                } else if (i + 1 >= args.length) {
                    throw new Error(format('do not have enough args for "--%s" '
                        + 'option', name));
                } else {
                    addOpt(option, '--'+name, option.key, args[i + 1], 'argv');
                    i++;
                }
            }

        // Short option
        } else if (arg[0] === '-' && arg.length > 1) {
            var j = 1;
            var allFound = true;
            while (j < arg.length) {
                var name = arg[j];
                var option = this.optionFromName[name];
                if (!option) {
                    allFound = false;
                    if (this.allowUnknown) {
                        if (this.interspersed) {
                            _args.push(arg);
                            break;
                        } else
                            break outer;
                    } else if (arg.length > 2) {
                        throw new Error(format(
                            'unknown option: "-%s" in "%s" group',
                            name, arg));
                    } else {
                        throw new Error(format('unknown option: "-%s"', name));
                    }
                } else if (this.optionTakesArg(option)) {
                    break;
                }
                j++;
            }

            j = 1;
            while (allFound && j < arg.length) {
                var name = arg[j];
                var val = arg.slice(j + 1);  // option val if it takes an arg
                var option = this.optionFromName[name];
                var takesArg = this.optionTakesArg(option);
                if (!takesArg) {
                    addOpt(option, '-'+name, option.key, true, 'argv');
                } else if (val) {
                    addOpt(option, '-'+name, option.key, val, 'argv');
                    break;
                } else {
                    if (i + 1 >= args.length) {
                        throw new Error(format('do not have enough args '
                            + 'for "-%s" option', name));
                    }
                    addOpt(option, '-'+name, option.key, args[i + 1], 'argv');
                    i++;
                    break;
                }
                j++;
            }

        // An interspersed arg
        } else if (this.interspersed) {
            _args.push(arg);

        // An arg and interspersed args are not allowed, so done options.
        } else {
            break outer;
        }
        i++;
    }
    _args = _args.concat(args.slice(i));

    // Parse environment.
    Object.keys(this.optionFromEnv).forEach(function (envname) {
        var val = env[envname];
        if (val === undefined)
            return;
        var option = self.optionFromEnv[envname];
        if (opts[option.key] !== undefined)
            return;
        var takesArg = self.optionTakesArg(option);
        if (takesArg) {
            addOpt(option, envname, option.key, val, 'env');
        } else if (val !== '') {
            // Boolean envvar handling:
            // - VAR=<empty-string>     not set (as if the VAR was not set)
            // - VAR=0                  false
            // - anything else          true
            addOpt(option, envname, option.key, (val !== '0'), 'env');
        }
    });

    // Apply default values.
    this.options.forEach(function (o) {
        if (opts[o.key] === undefined) {
            if (o.default !== undefined) {
                opts[o.key] = o.default;
            } else if (o.type && optionTypes[o.type].default !== undefined) {
                opts[o.key] = optionTypes[o.type].default;
            }
        }
    });

    opts._order = _order;
    opts._args = _args;
    return opts;
};


/**
 * Return help output for the current options.
 *
 * E.g.: if the current options are:
 *      [{names: ['help', 'h'], type: 'bool', help: 'Show help and exit.'}]
 * then this would return:
 *      '  -h, --help     Show help and exit.\n'
 *
 * @param config {Object} Config for controlling the option help output.
 *      - indent {Number|String} Default 4. An indent/prefix to use for
 *        each option line.
 *      - nameSort {String} Default is 'length'. By default the names are
 *        sorted to put the short opts first (i.e. '-h, --help' preferred
 *        to '--help, -h'). Set to 'none' to not do this sorting.
 *      - maxCol {Number} Default 80. Note that long tokens in a help string
 *        can go past this.
 *      - helpCol {Number} Set to specify a specific column at which
 *        option help will be aligned. By default this is determined
 *        automatically.
 *      - minHelpCol {Number} Default 20.
 *      - maxHelpCol {Number} Default 40.
 *      - includeEnv {Boolean} Default false. If true, a note stating the `env`
 *        envvar (if specified for this option) will be appended to the help
 *        output.
 *      - includeDefault {Boolean} Default false. If true, a note stating
 *        the `default` for this option, if any, will be appended to the help
 *        output.
 *      - helpWrap {Boolean} Default true. Wrap help text in helpCol..maxCol
 *        bounds.
 * @returns {String}
 */
Parser.prototype.help = function help(config) {
    config = config || {};
    assert.object(config, 'config');

    var indent = makeIndent(config.indent, 4, 'config.indent');
    var headingIndent = makeIndent(config.headingIndent,
        Math.round(indent.length / 2), 'config.headingIndent');

    assert.optionalString(config.nameSort, 'config.nameSort');
    var nameSort = config.nameSort || 'length';
    assert.ok(~['length', 'none'].indexOf(nameSort),
        'invalid "config.nameSort"');
    assert.optionalNumber(config.maxCol, 'config.maxCol');
    assert.optionalNumber(config.maxHelpCol, 'config.maxHelpCol');
    assert.optionalNumber(config.minHelpCol, 'config.minHelpCol');
    assert.optionalNumber(config.helpCol, 'config.helpCol');
    assert.optionalBool(config.includeEnv, 'config.includeEnv');
    assert.optionalBool(config.includeDefault, 'config.includeDefault');
    assert.optionalBool(config.helpWrap, 'config.helpWrap');
    var maxCol = config.maxCol || 80;
    var minHelpCol = config.minHelpCol || 20;
    var maxHelpCol = config.maxHelpCol || 40;

    var lines = [];
    var maxWidth = 0;
    this.options.forEach(function (o) {
        if (o.hidden) {
            return;
        }
        if (o.group !== undefined && o.group !== null) {
            // We deal with groups in the next pass
            lines.push(null);
            return;
        }
        var type = optionTypes[o.type];
        var arg = o.helpArg || type.helpArg || 'ARG';
        var line = '';
        var names = o.names.slice();
        if (nameSort === 'length') {
            names.sort(function (a, b) {
                if (a.length < b.length)
                    return -1;
                else if (b.length < a.length)
                    return 1;
                else
                    return 0;
            })
        }
        names.forEach(function (name, i) {
            if (i > 0)
                line += ', ';
            if (name.length === 1) {
                line += '-' + name
                if (type.takesArg)
                    line += ' ' + arg;
            } else {
                line += '--' + name
                if (type.takesArg)
                    line += '=' + arg;
            }
        });
        maxWidth = Math.max(maxWidth, line.length);
        lines.push(line);
    });

    // Add help strings.
    var helpCol = config.helpCol;
    if (!helpCol) {
        helpCol = maxWidth + indent.length + 2;
        helpCol = Math.min(Math.max(helpCol, minHelpCol), maxHelpCol);
    }
    var i = -1;
    this.options.forEach(function (o) {
        if (o.hidden) {
            return;
        }
        i++;

        if (o.group !== undefined && o.group !== null) {
            if (o.group === '') {
                // Support a empty string "group" to have a blank line between
                // sets of options.
                lines[i] = '';
            } else {
                // Render the group heading with the heading-specific indent.
                lines[i] = (i === 0 ? '' : '\n') + headingIndent +
                    o.group + ':';
            }
            return;
        }

        var helpDefault;
        if (config.includeDefault) {
            if (o.default !== undefined) {
                helpDefault = format('Default: %j', o.default);
            } else if (o.type && optionTypes[o.type].default !== undefined) {
                helpDefault = format('Default: %j',
                    optionTypes[o.type].default);
            }
        }

        var line = lines[i] = indent + lines[i];
        if (!o.help && !(config.includeEnv && o.env) && !helpDefault) {
            return;
        }
        var n = helpCol - line.length;
        if (n >= 0) {
            line += space(n);
        } else {
            line += '\n' + space(helpCol);
        }

        var helpEnv = '';
        if (o.env && o.env.length && config.includeEnv) {
            helpEnv += 'Environment: ';
            var type = optionTypes[o.type];
            var arg = o.helpArg || type.helpArg || 'ARG';
            var envs = (Array.isArray(o.env) ? o.env : [o.env]).map(
                function (e) {
                    if (type.takesArg) {
                        return e + '=' + arg;
                    } else {
                        return e + '=1';
                    }
                }
            );
            helpEnv += envs.join(', ');
        }
        var help = (o.help || '').trim();
        if (o.helpWrap !== false && config.helpWrap !== false) {
            // Wrap help description normally.
            if (help.length && !~'.!?"\''.indexOf(help.slice(-1))) {
                help += '.';
            }
            if (help.length) {
                help += ' ';
            }
            help += helpEnv;
            if (helpDefault) {
                if (helpEnv) {
                    help += '. ';
                }
                help += helpDefault;
            }
            line += textwrap(help, maxCol - helpCol).join(
                '\n' + space(helpCol));
        } else {
            // Do not wrap help description, but indent newlines appropriately.
            var helpLines = help.split('\n').filter(
                    function (ln) { return ln.length });
            if (helpEnv !== '') {
                helpLines.push(helpEnv);
            }
            if (helpDefault) {
                helpLines.push(helpDefault);
            }
            line += helpLines.join('\n' + space(helpCol));
        }

        lines[i] = line;
    });

    var rv = '';
    if (lines.length > 0) {
        rv = lines.join('\n') + '\n';
    }
    return rv;
};


/**
 * Return a string suitable for a Bash completion file for this tool.
 *
 * @param args.name {String} The tool name.
 * @param args.specExtra {String} Optional. Extra Bash code content to add
 *      to the end of the "spec". Typically this is used to append Bash
 *      "complete_TYPE" functions for custom option types. See
 *      "examples/ddcompletion.js" for an example.
 * @param args.argtypes {Array} Optional. Array of completion types for
 *      positional args (i.e. non-options). E.g.
 *          argtypes = ['fruit', 'veggie', 'file']
 *      will result in completion of fruits for the first arg, veggies for the
 *      second, and filenames for the third and subsequent positional args.
 *      If not given, positional args will use Bash's 'default' completion.
 *      See `specExtra` for providing Bash `complete_TYPE` functions, e.g.
 *      `complete_fruit` and `complete_veggie` in this example.
 */
Parser.prototype.bashCompletion = function bashCompletion(args) {
    assert.object(args, 'args');
    assert.string(args.name, 'args.name');
    assert.optionalString(args.specExtra, 'args.specExtra');
    assert.optionalArrayOfString(args.argtypes, 'args.argtypes');

    return bashCompletionFromOptions({
        name: args.name,
        specExtra: args.specExtra,
        argtypes: args.argtypes,
        options: this.options
    });
};


// ---- Bash completion

const BASH_COMPLETION_TEMPLATE_PATH = path.join(
    __dirname, '../etc/dashdash.bash_completion.in');

/**
 * Return the Bash completion "spec" (the string value for the "{{spec}}"
 * var in the "dashdash.bash_completion.in" template) for this tool.
 *
 * The "spec" is Bash code that defines the CLI options and subcmds for
 * the template's completion code. It looks something like this:
 *
 *      local cmd_shortopts="-J ..."
 *      local cmd_longopts="--help ..."
 *      local cmd_optargs="-p=tritonprofile ..."
 *
 * @param args.options {Array} The array of dashdash option specs.
 * @param args.context {String} Optional. A context string for the "local cmd*"
 *      vars in the spec. By default it is the empty string. When used to
 *      scope for completion on a *sub-command* (e.g. for "git log" on a "git"
 *      tool), then it would have a value (e.g. "__log"). See
 *      <http://github.com/trentm/node-cmdln> Bash completion for details.
 * @param opts.includeHidden {Boolean} Optional. Default false. By default
 *      hidden options and subcmds are "excluded". Here excluded means they
 *      won't be offered as a completion, but if used, their argument type
 *      will be completed. "Hidden" options and subcmds are ones with the
 *      `hidden: true` attribute to exclude them from default help output.
 * @param args.argtypes {Array} Optional. Array of completion types for
 *      positional args (i.e. non-options). E.g.
 *          argtypes = ['fruit', 'veggie', 'file']
 *      will result in completion of fruits for the first arg, veggies for the
 *      second, and filenames for the third and subsequent positional args.
 *      If not given, positional args will use Bash's 'default' completion.
 *      See `specExtra` for providing Bash `complete_TYPE` functions, e.g.
 *      `complete_fruit` and `complete_veggie` in this example.
 */
function bashCompletionSpecFromOptions(args) {
    assert.object(args, 'args');
    assert.object(args.options, 'args.options');
    assert.optionalString(args.context, 'args.context');
    assert.optionalBool(args.includeHidden, 'args.includeHidden');
    assert.optionalArrayOfString(args.argtypes, 'args.argtypes');

    var context = args.context || '';
    var includeHidden = (args.includeHidden === undefined
        ? false : args.includeHidden);

    var spec = [];
    var shortopts = [];
    var longopts = [];
    var optargs = [];
    (args.options || []).forEach(function (o) {
        if (o.group !== undefined && o.group !== null) {
            // Skip group headers.
            return;
        }

        var optNames = o.names || [o.name];
        var optType = getOptionType(o.type);
        if (optType.takesArg) {
            var completionType = o.completionType ||
                optType.completionType || o.type;
            optNames.forEach(function (optName) {
                if (optName.length === 1) {
                    if (includeHidden || !o.hidden) {
                        shortopts.push('-' + optName);
                    }
                    // Include even hidden options in `optargs` so that bash
                    // completion of its arg still works.
                    optargs.push('-' + optName + '=' + completionType);
                } else {
                    if (includeHidden || !o.hidden) {
                        longopts.push('--' + optName);
                    }
                    optargs.push('--' + optName + '=' + completionType);
                }
            });
        } else {
            optNames.forEach(function (optName) {
                if (includeHidden || !o.hidden) {
                    if (optName.length === 1) {
                        shortopts.push('-' + optName);
                    } else {
                        longopts.push('--' + optName);
                    }
                }
            });
        }
    });

    spec.push(format('local cmd%s_shortopts="%s"',
        context, shortopts.sort().join(' ')));
    spec.push(format('local cmd%s_longopts="%s"',
        context, longopts.sort().join(' ')));
    spec.push(format('local cmd%s_optargs="%s"',
        context, optargs.sort().join(' ')));
    if (args.argtypes) {
        spec.push(format('local cmd%s_argtypes="%s"',
            context, args.argtypes.join(' ')));
    }
    return spec.join('\n');
}


/**
 * Return a string suitable for a Bash completion file for this tool.
 *
 * @param args.name {String} The tool name.
 * @param args.options {Array} The array of dashdash option specs.
 * @param args.specExtra {String} Optional. Extra Bash code content to add
 *      to the end of the "spec". Typically this is used to append Bash
 *      "complete_TYPE" functions for custom option types. See
 *      "examples/ddcompletion.js" for an example.
 * @param args.argtypes {Array} Optional. Array of completion types for
 *      positional args (i.e. non-options). E.g.
 *          argtypes = ['fruit', 'veggie', 'file']
 *      will result in completion of fruits for the first arg, veggies for the
 *      second, and filenames for the third and subsequent positional args.
 *      If not given, positional args will use Bash's 'default' completion.
 *      See `specExtra` for providing Bash `complete_TYPE` functions, e.g.
 *      `complete_fruit` and `complete_veggie` in this example.
 */
function bashCompletionFromOptions(args) {
    assert.object(args, 'args');
    assert.object(args.options, 'args.options');
    assert.string(args.name, 'args.name');
    assert.optionalString(args.specExtra, 'args.specExtra');
    assert.optionalArrayOfString(args.argtypes, 'args.argtypes');

    // Gather template data.
    var data = {
        name: args.name,
        date: new Date(),
        spec: bashCompletionSpecFromOptions({
            options: args.options,
            argtypes: args.argtypes
        }),
    };
    if (args.specExtra) {
        data.spec += '\n\n' + args.specExtra;
    }

    // Render template.
    var template = fs.readFileSync(BASH_COMPLETION_TEMPLATE_PATH, 'utf8');
    return renderTemplate(template, data);
}



// ---- exports

function createParser(config) {
    return new Parser(config);
}

/**
 * Parse argv with the given options.
 *
 * @param config {Object} A merge of all the available fields from
 *      `dashdash.Parser` and `dashdash.Parser.parse`: options, interspersed,
 *      argv, env, slice.
 */
function parse(config) {
    assert.object(config, 'config');
    assert.optionalArrayOfString(config.argv, 'config.argv');
    assert.optionalObject(config.env, 'config.env');
    var config = shallowCopy(config);
    var argv = config.argv;
    delete config.argv;
    var env = config.env;
    delete config.env;

    var parser = new Parser(config);
    return parser.parse({argv: argv, env: env});
}


/**
 * Add a new option type.
 *
 * @params optionType {Object}:
 *      - name {String} Required.
 *      - takesArg {Boolean} Required. Whether this type of option takes an
 *        argument on process.argv. Typically this is true for all but the
 *        "bool" type.
 *      - helpArg {String} Required iff `takesArg === true`. The string to
 *        show in generated help for options of this type.
 *      - parseArg {Function} Require. `function (option, optstr, arg)` parser
 *        that takes a string argument and returns an instance of the
 *        appropriate type, or throws an error if the arg is invalid.
 *      - array {Boolean} Optional. Set to true if this is an 'arrayOf' type
 *        that collects multiple usages of the option in process.argv and
 *        puts results in an array.
 *      - arrayFlatten {Boolean} Optional. XXX
 *      - default Optional. Default value for options of this type, if no
 *        default is specified in the option type usage.
 */
function addOptionType(optionType) {
    assert.object(optionType, 'optionType');
    assert.string(optionType.name, 'optionType.name');
    assert.bool(optionType.takesArg, 'optionType.takesArg');
    if (optionType.takesArg) {
        assert.string(optionType.helpArg, 'optionType.helpArg');
    }
    assert.func(optionType.parseArg, 'optionType.parseArg');
    assert.optionalBool(optionType.array, 'optionType.array');
    assert.optionalBool(optionType.arrayFlatten, 'optionType.arrayFlatten');

    optionTypes[optionType.name] = {
        takesArg: optionType.takesArg,
        helpArg: optionType.helpArg,
        parseArg: optionType.parseArg,
        array: optionType.array,
        arrayFlatten: optionType.arrayFlatten,
        default: optionType.default
    }
}


function getOptionType(name) {
    assert.string(name, 'name');
    return optionTypes[name];
}


/**
 * Return a synopsis string for the given option spec.
 *
 * Examples:
 *      > synopsisFromOpt({names: ['help', 'h'], type: 'bool'});
 *      '[ --help | -h ]'
 *      > synopsisFromOpt({name: 'file', type: 'string', helpArg: 'FILE'});
 *      '[ --file=FILE ]'
 */
function synopsisFromOpt(o) {
    assert.object(o, 'o');

    if (o.hasOwnProperty('group')) {
        return null;
    }
    var names = o.names || [o.name];
    // `type` here could be undefined if, for example, the command has a
    // dashdash option spec with a bogus 'type'.
    var type = getOptionType(o.type);
    var helpArg = o.helpArg || (type && type.helpArg) || 'ARG';
    var parts = [];
    names.forEach(function (name) {
        var part = (name.length === 1 ? '-' : '--') + name;
        if (type && type.takesArg) {
            part += (name.length === 1 ? ' ' + helpArg : '=' + helpArg);
        }
        parts.push(part);
    });
    return ('[ ' + parts.join(' | ') + ' ]');
};


module.exports = {
    createParser: createParser,
    Parser: Parser,
    parse: parse,
    addOptionType: addOptionType,
    getOptionType: getOptionType,
    synopsisFromOpt: synopsisFromOpt,

    // Bash completion-related exports
    BASH_COMPLETION_TEMPLATE_PATH: BASH_COMPLETION_TEMPLATE_PATH,
    bashCompletionFromOptions: bashCompletionFromOptions,
    bashCompletionSpecFromOptions: bashCompletionSpecFromOptions,

    // Export the parseFoo parsers because they might be useful as primitives
    // for custom option types.
    parseBool: parseBool,
    parseString: parseString,
    parseNumber: parseNumber,
    parseInteger: parseInteger,
    parsePositiveInteger: parsePositiveInteger,
    parseDate: parseDate
};
#!/bin/bash
#
# Bash completion generated for '{{name}}' at {{date}}.
#
# The original template lives here:
# https://github.com/trentm/node-dashdash/blob/master/etc/dashdash.bash_completion.in
#

#
# Copyright 2016 Trent Mick
# Copyright 2016 Joyent, Inc.
#
#
# A generic Bash completion driver script.
#
# This is meant to provide a re-usable chunk of Bash to use for
# "etc/bash_completion.d/" files for individual tools. Only the "Configuration"
# section with tool-specific info need differ. Features:
#
# - support for short and long opts
# - support for knowing which options take arguments
# - support for subcommands (e.g. 'git log <TAB>' to show just options for the
#   log subcommand)
# - does the right thing with "--" to stop options
# - custom optarg and arg types for custom completions
# - (TODO) support for shells other than Bash (tcsh, zsh, fish?, etc.)
#
#
# Examples/design:
#
# 1. Bash "default" completion. By default Bash's 'complete -o default' is
#    enabled. That means when there are no completions (e.g. if no opts match
#    the current word), then you'll get Bash's default completion. Most notably
#    that means you get filename completion. E.g.:
#       $ tool ./<TAB>
#       $ tool READ<TAB>
#
# 2. all opts and subcmds:
#       $ tool <TAB>
#       $ tool -v <TAB>     # assuming '-v' doesn't take an arg
#       $ tool -<TAB>       # matching opts
#       $ git lo<TAB>       # matching subcmds
#
#    Long opt completions are given *without* the '=', i.e. we prefer space
#    separated because that's easier for good completions.
#
# 3. long opt arg with '='
#       $ tool --file=<TAB>
#       $ tool --file=./d<TAB>
#    We maintain the "--file=" prefix. Limitation: With the attached prefix
#    the 'complete -o filenames' doesn't know to do dirname '/' suffixing. Meh.
#
# 4. envvars:
#       $ tool $<TAB>
#       $ tool $P<TAB>
#    Limitation: Currently only getting exported vars, so we miss "PS1" and
#    others.
#
# 5. Defer to other completion in a subshell:
#       $ tool --file $(cat ./<TAB>
#    We get this from 'complete -o default ...'.
#
# 6. Custom completion types from a provided bash function.
#       $ tool --profile <TAB>        # complete available "profiles"
#
#
# Dev Notes:
# - compgen notes, from http://unix.stackexchange.com/questions/151118/understand-compgen-builtin-command
# - https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html
#


# Debugging this completion:
#   1. Uncomment the "_{{name}}_log_file=..." line.
#   2. 'tail -f /var/tmp/dashdash-completion.log' in one terminal.
#   3. Re-source this bash completion file.
#_{{name}}_log=/var/tmp/dashdash-completion.log

function _{{name}}_completer {

    # ---- cmd definition

    {{spec}}


    # ---- locals

    declare -a argv


    # ---- support functions

    function trace {
        [[ -n "$_{{name}}_log" ]] && echo "$*" >&2
    }

    function _dashdash_complete {
        local idx context
        idx=$1
        context=$2

        local shortopts longopts optargs subcmds allsubcmds argtypes
        shortopts="$(eval "echo \${cmd${context}_shortopts}")"
        longopts="$(eval "echo \${cmd${context}_longopts}")"
        optargs="$(eval "echo \${cmd${context}_optargs}")"
        subcmds="$(eval "echo \${cmd${context}_subcmds}")"
        allsubcmds="$(eval "echo \${cmd${context}_allsubcmds}")"
        IFS=', ' read -r -a argtypes <<< "$(eval "echo \${cmd${context}_argtypes}")"

        trace ""
        trace "_dashdash_complete(idx=$idx, context=$context)"
        trace "  shortopts: $shortopts"
        trace "  longopts: $longopts"
        trace "  optargs: $optargs"
        trace "  subcmds: $subcmds"
        trace "  allsubcmds: $allsubcmds"

        # Get 'state' of option parsing at this COMP_POINT.
        # Copying "dashdash.js#parse()" behaviour here.
        local state=
        local nargs=0
        local i=$idx
        local argtype
        local optname
        local prefix
        local word
        local dashdashseen=
        while [[ $i -lt $len && $i -le $COMP_CWORD ]]; do
            argtype=
            optname=
            prefix=
            word=

            arg=${argv[$i]}
            trace "  consider argv[$i]: '$arg'"

            if [[ "$arg" == "--" && $i -lt $COMP_CWORD ]]; then
                trace "    dashdash seen"
                dashdashseen=yes
                state=arg
                word=$arg
            elif [[ -z "$dashdashseen" && "${arg:0:2}" == "--" ]]; then
                arg=${arg:2}
                if [[ "$arg" == *"="* ]]; then
                    optname=${arg%%=*}
                    val=${arg##*=}
                    trace "    long opt: optname='$optname' val='$val'"
                    state=arg
                    argtype=$(echo "$optargs" | awk -F "-$optname=" '{print $2}' | cut -d' ' -f1)
                    word=$val
                    prefix="--$optname="
                else
                    optname=$arg
                    val=
                    trace "    long opt: optname='$optname'"
                    state=longopt
                    word=--$optname

                    if [[ "$optargs" == *"-$optname="* && $i -lt $COMP_CWORD ]]; then
                        i=$(( $i + 1 ))
                        state=arg
                        argtype=$(echo "$optargs" | awk -F "-$optname=" '{print $2}' | cut -d' ' -f1)
                        word=${argv[$i]}
                        trace "    takes arg (consume argv[$i], word='$word')"
                    fi
                fi
            elif [[ -z "$dashdashseen" && "${arg:0:1}" == "-" ]]; then
                trace "    short opt group"
                state=shortopt
                word=$arg

                local j=1
                while [[ $j -lt ${#arg} ]]; do
                    optname=${arg:$j:1}
                    trace "    consider index $j: optname '$optname'"

                    if [[ "$optargs" == *"-$optname="* ]]; then
                        argtype=$(echo "$optargs" | awk -F "-$optname=" '{print $2}' | cut -d' ' -f1)
                        if [[ $(( $j + 1 )) -lt ${#arg} ]]; then
                            state=arg
                            word=${arg:$(( $j + 1 ))}
                            trace "      takes arg (rest of this arg, word='$word', argtype='$argtype')"
                        elif [[ $i -lt $COMP_CWORD ]]; then
                            state=arg
                            i=$(( $i + 1 ))
                            word=${argv[$i]}
                            trace "    takes arg (word='$word', argtype='$argtype')"
                        fi
                        break
                    fi

                    j=$(( $j + 1 ))
                done
            elif [[ $i -lt $COMP_CWORD && -n "$arg" ]] && $(echo "$allsubcmds" | grep -w "$arg" >/dev/null); then
                trace "    complete subcmd: recurse _dashdash_complete"
                _dashdash_complete $(( $i + 1 )) "${context}__${arg/-/_}"
                return
            else
                trace "    not an opt or a complete subcmd"
                state=arg
                word=$arg
                nargs=$(( $nargs + 1 ))
                if [[ ${#argtypes[@]} -gt 0 ]]; then
                    argtype="${argtypes[$(( $nargs - 1 ))]}"
                    if [[ -z "$argtype" ]]; then
                        # If we have more args than argtypes, we use the
                        # last type.
                        argtype="${argtypes[@]: -1:1}"
                    fi
                fi
            fi

            trace "    state=$state prefix='$prefix' word='$word'"
            i=$(( $i + 1 ))
        done

        trace "  parsed: state=$state optname='$optname' argtype='$argtype' prefix='$prefix' word='$word' dashdashseen=$dashdashseen"
        local compgen_opts=
        if [[ -n "$prefix" ]]; then
            compgen_opts="$compgen_opts -P $prefix"
        fi

        case $state in
        shortopt)
            compgen $compgen_opts -W "$shortopts $longopts" -- "$word"
            ;;
        longopt)
            compgen $compgen_opts -W "$longopts" -- "$word"
            ;;
        arg)
            # If we don't know what completion to do, then emit nothing. We
            # expect that we are running with:
            #       complete -o default ...
            # where "default" means: "Use Readline's default completion if
            # the compspec generates no matches." This gives us the good filename
            # completion, completion in subshells/backticks.
            #
            # We cannot support an argtype="directory" because
            #       compgen -S '/' -A directory -- "$word"
            # doesn't give a satisfying result. It doesn't stop at the trailing '/'
            # so you cannot descend into dirs.
            if [[ "${word:0:1}" == '$' ]]; then
                # By default, Bash will complete '$<TAB>' to all envvars. Apparently
                # 'complete -o default' does *not* give us that. The following
                # gets *close* to the same completions: '-A export' misses envvars
                # like "PS1".
                trace "  completing envvars"
                compgen $compgen_opts -P '$' -A export -- "${word:1}"
            elif [[ -z "$argtype" ]]; then
                # Only include opts in completions if $word is not empty.
                # This is to avoid completing the leading '-', which foils
                # using 'default' completion.
                if [[ -n "$dashdashseen" ]]; then
                    trace "  completing subcmds, if any (no argtype, dashdash seen)"
                    compgen $compgen_opts -W "$subcmds" -- "$word"
                elif [[ -z "$word" ]]; then
                    trace "  completing subcmds, if any (no argtype, empty word)"
                    compgen $compgen_opts -W "$subcmds" -- "$word"
                else
                    trace "  completing opts & subcmds (no argtype)"
                    compgen $compgen_opts -W "$shortopts $longopts $subcmds" -- "$word"
                fi
            elif [[ $argtype == "none" ]]; then
                # We want *no* completions, i.e. some way to get the active
                # 'complete -o default' to not do filename completion.
                trace "  completing 'none' (hack to imply no completions)"
                echo "##-no-completion- -results-##"
            elif [[ $argtype == "file" ]]; then
                # 'complete -o default' gives the best filename completion, at least
                # on Mac.
                trace "  completing 'file' (let 'complete -o default' handle it)"
                echo ""
            elif ! type complete_$argtype 2>/dev/null >/dev/null; then
                trace "  completing '$argtype' (fallback to default b/c complete_$argtype is unknown)"
                echo ""
            else
                trace "  completing custom '$argtype'"
                completions=$(complete_$argtype "$word")
                if [[ -z "$completions" ]]; then
                    trace "  no custom '$argtype' completions"
                    # These are in ascii and "dictionary" order so they sort
                    # correctly.
                    echo "##-no-completion- -results-##"
                else
                    echo $completions
                fi
            fi
            ;;
        *)
            trace "  unknown state: $state"
            ;;
        esac
    }


    trace ""
    trace "-- $(date)"
    #trace "\$IFS: '$IFS'"
    #trace "\$@: '$@'"
    #trace "COMP_WORDBREAKS: '$COMP_WORDBREAKS'"
    trace "COMP_CWORD: '$COMP_CWORD'"
    trace "COMP_LINE: '$COMP_LINE'"
    trace "COMP_POINT: $COMP_POINT"

    # Guard against negative COMP_CWORD. This is a Bash bug at least on
    # Mac 10.10.4's bash. See
    # <https://lists.gnu.org/archive/html/bug-bash/2009-07/msg00125.html>.
    if [[ $COMP_CWORD -lt 0 ]]; then
        trace "abort on negative COMP_CWORD"
        exit 1;
    fi

    # I don't know how to do array manip on argv vars,
    # so copy over to argv array to work on them.
    shift   # the leading '--'
    i=0
    len=$#
    while [[ $# -gt 0 ]]; do
        argv[$i]=$1
        shift;
        i=$(( $i + 1 ))
    done
    trace "argv: '${argv[@]}'"
    trace "argv[COMP_CWORD-1]: '${argv[$(( $COMP_CWORD - 1 ))]}'"
    trace "argv[COMP_CWORD]: '${argv[$COMP_CWORD]}'"
    trace "argv len: '$len'"

    _dashdash_complete 1 ""
}


# ---- mainline

# Note: This if-block to help work with 'compdef' and 'compctl' is
# adapted from 'npm completion'.
if type complete &>/dev/null; then
    function _{{name}}_completion {
        local _log_file=/dev/null
        [[ -z "$_{{name}}_log" ]] || _log_file="$_{{name}}_log"
        COMPREPLY=($(COMP_CWORD="$COMP_CWORD" \
            COMP_LINE="$COMP_LINE" \
            COMP_POINT="$COMP_POINT" \
            _{{name}}_completer -- "${COMP_WORDS[@]}" \
            2>$_log_file)) || return $?
    }
    complete -o default -F _{{name}}_completion {{name}}
elif type compdef &>/dev/null; then
    function _{{name}}_completion {
        local _log_file=/dev/null
        [[ -z "$_{{name}}_log" ]] || _log_file="$_{{name}}_log"
        compadd -- $(COMP_CWORD=$((CURRENT-1)) \
            COMP_LINE=$BUFFER \
            COMP_POINT=0 \
            _{{name}}_completer -- "${words[@]}" \
            2>$_log_file)
    }
    compdef _{{name}}_completion {{name}}
elif type compctl &>/dev/null; then
    function _{{name}}_completion {
        local cword line point words si
        read -Ac words
        read -cn cword
        let cword-=1
        read -l line
        read -ln point
        local _log_file=/dev/null
        [[ -z "$_{{name}}_log" ]] || _log_file="$_{{name}}_log"
        reply=($(COMP_CWORD="$cword" \
            COMP_LINE="$line" \
            COMP_POINT="$point" \
            _{{name}}_completer -- "${words[@]}" \
            2>$_log_file)) || return $?
    }
    compctl -K _{{name}}_completion {{name}}
fi


##
## This is a Bash completion file for the '{{name}}' command. You can install
## with either:
##
##     cp FILE /usr/local/etc/bash_completion.d/{{name}}   # Mac
##     cp FILE /etc/bash_completion.d/{{name}}             # Linux
##
## or:
##
##     cp FILE > ~/.{{name}}.completion
##     echo "source ~/.{{name}}.completion" >> ~/.bashrc
##(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the 'Software'), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial 
portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

module.exports = require('./src/node');
{
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "browser": "./src/browser.js",
  "dependencies": {
    "ms": "^2.1.1"
  },
  "deprecated": false,
  "description": "small debugging utility",
  "devDependencies": {
    "@babel/cli": "^7.0.0",
    "@babel/core": "^7.0.0",
    "@babel/preset-env": "^7.0.0",
    "browserify": "14.4.0",
    "chai": "^3.5.0",
    "concurrently": "^3.1.0",
    "coveralls": "^3.0.2",
    "istanbul": "^0.4.5",
    "karma": "^3.0.0",
    "karma-chai": "^0.1.0",
    "karma-mocha": "^1.3.0",
    "karma-phantomjs-launcher": "^1.0.2",
    "mocha": "^5.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "rimraf": "^2.5.4",
    "xo": "^0.23.0"
  },
  "files": [
    "src",
    "node.js",
    "dist/debug.js",
    "LICENSE",
    "README.md"
  ],
  "homepage": "https://github.com/visionmedia/debug#readme",
  "license": "MIT",
  "main": "./src/index.js",
  "name": "debug",
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "unpkg": "./dist/debug.js",
  "version": "3.2.6"
}"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/* eslint-env browser */

/**
 * This is the web browser implementation of `debug()`.
 */
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = localstorage();
/**
 * Colors.
 */

exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];
/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */
// eslint-disable-next-line complexity

function useColors() {
  // NB: In an Electron preload script, document will be defined but not fully
  // initialized. Since we know we're in Chrome, we'll just detect this case
  // explicitly
  if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
    return true;
  } // Internet Explorer and Edge do not support colors.


  if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
    return false;
  } // Is webkit? http://stackoverflow.com/a/16459606/376773
  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632


  return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773
  typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?
  // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
  typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker
  typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
}
/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */


function formatArgs(args) {
  args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);

  if (!this.useColors) {
    return;
  }

  var c = 'color: ' + this.color;
  args.splice(1, 0, c, 'color: inherit'); // The final "%c" is somewhat tricky, because there could be other
  // arguments passed either before or after the %c, so we need to
  // figure out the correct index to insert the CSS into

  var index = 0;
  var lastC = 0;
  args[0].replace(/%[a-zA-Z%]/g, function (match) {
    if (match === '%%') {
      return;
    }

    index++;

    if (match === '%c') {
      // We only are interested in the *last* %c
      // (the user may have provided their own)
      lastC = index;
    }
  });
  args.splice(lastC, 0, c);
}
/**
 * Invokes `console.log()` when available.
 * No-op when `console.log` is not a "function".
 *
 * @api public
 */


function log() {
  var _console;

  // This hackery is required for IE8/9, where
  // the `console.log` function doesn't have 'apply'
  return (typeof console === "undefined" ? "undefined" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments);
}
/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */


function save(namespaces) {
  try {
    if (namespaces) {
      exports.storage.setItem('debug', namespaces);
    } else {
      exports.storage.removeItem('debug');
    }
  } catch (error) {// Swallow
    // XXX (@Qix-) should we be logging these?
  }
}
/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */


function load() {
  var r;

  try {
    r = exports.storage.getItem('debug');
  } catch (error) {} // Swallow
  // XXX (@Qix-) should we be logging these?
  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG


  if (!r && typeof process !== 'undefined' && 'env' in process) {
    r = process.env.DEBUG;
  }

  return r;
}
/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */


function localstorage() {
  try {
    // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
    // The Browser also has localStorage in the global context.
    return localStorage;
  } catch (error) {// Swallow
    // XXX (@Qix-) should we be logging these?
  }
}

module.exports = require('./common')(exports);
var formatters = module.exports.formatters;
/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

formatters.j = function (v) {
  try {
    return JSON.stringify(v);
  } catch (error) {
    return '[UnexpectedJSONParseError]: ' + error.message;
  }
};

"use strict";

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 */
function setup(env) {
  createDebug.debug = createDebug;
  createDebug.default = createDebug;
  createDebug.coerce = coerce;
  createDebug.disable = disable;
  createDebug.enable = enable;
  createDebug.enabled = enabled;
  createDebug.humanize = require('ms');
  Object.keys(env).forEach(function (key) {
    createDebug[key] = env[key];
  });
  /**
  * Active `debug` instances.
  */

  createDebug.instances = [];
  /**
  * The currently active debug mode names, and names to skip.
  */

  createDebug.names = [];
  createDebug.skips = [];
  /**
  * Map of special "%n" handling functions, for the debug "format" argument.
  *
  * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
  */

  createDebug.formatters = {};
  /**
  * Selects a color for a debug namespace
  * @param {String} namespace The namespace string for the for the debug instance to be colored
  * @return {Number|String} An ANSI color code for the given namespace
  * @api private
  */

  function selectColor(namespace) {
    var hash = 0;

    for (var i = 0; i < namespace.length; i++) {
      hash = (hash << 5) - hash + namespace.charCodeAt(i);
      hash |= 0; // Convert to 32bit integer
    }

    return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
  }

  createDebug.selectColor = selectColor;
  /**
  * Create a debugger with the given `namespace`.
  *
  * @param {String} namespace
  * @return {Function}
  * @api public
  */

  function createDebug(namespace) {
    var prevTime;

    function debug() {
      // Disabled?
      if (!debug.enabled) {
        return;
      }

      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
        args[_key] = arguments[_key];
      }

      var self = debug; // Set `diff` timestamp

      var curr = Number(new Date());
      var ms = curr - (prevTime || curr);
      self.diff = ms;
      self.prev = prevTime;
      self.curr = curr;
      prevTime = curr;
      args[0] = createDebug.coerce(args[0]);

      if (typeof args[0] !== 'string') {
        // Anything else let's inspect with %O
        args.unshift('%O');
      } // Apply any `formatters` transformations


      var index = 0;
      args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {
        // If we encounter an escaped % then don't increase the array index
        if (match === '%%') {
          return match;
        }

        index++;
        var formatter = createDebug.formatters[format];

        if (typeof formatter === 'function') {
          var val = args[index];
          match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format`

          args.splice(index, 1);
          index--;
        }

        return match;
      }); // Apply env-specific formatting (colors, etc.)

      createDebug.formatArgs.call(self, args);
      var logFn = self.log || createDebug.log;
      logFn.apply(self, args);
    }

    debug.namespace = namespace;
    debug.enabled = createDebug.enabled(namespace);
    debug.useColors = createDebug.useColors();
    debug.color = selectColor(namespace);
    debug.destroy = destroy;
    debug.extend = extend; // Debug.formatArgs = formatArgs;
    // debug.rawLog = rawLog;
    // env-specific initialization logic for debug instances

    if (typeof createDebug.init === 'function') {
      createDebug.init(debug);
    }

    createDebug.instances.push(debug);
    return debug;
  }

  function destroy() {
    var index = createDebug.instances.indexOf(this);

    if (index !== -1) {
      createDebug.instances.splice(index, 1);
      return true;
    }

    return false;
  }

  function extend(namespace, delimiter) {
    return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
  }
  /**
  * Enables a debug mode by namespaces. This can include modes
  * separated by a colon and wildcards.
  *
  * @param {String} namespaces
  * @api public
  */


  function enable(namespaces) {
    createDebug.save(namespaces);
    createDebug.names = [];
    createDebug.skips = [];
    var i;
    var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
    var len = split.length;

    for (i = 0; i < len; i++) {
      if (!split[i]) {
        // ignore empty strings
        continue;
      }

      namespaces = split[i].replace(/\*/g, '.*?');

      if (namespaces[0] === '-') {
        createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
      } else {
        createDebug.names.push(new RegExp('^' + namespaces + '$'));
      }
    }

    for (i = 0; i < createDebug.instances.length; i++) {
      var instance = createDebug.instances[i];
      instance.enabled = createDebug.enabled(instance.namespace);
    }
  }
  /**
  * Disable debug output.
  *
  * @api public
  */


  function disable() {
    createDebug.enable('');
  }
  /**
  * Returns true if the given mode name is enabled, false otherwise.
  *
  * @param {String} name
  * @return {Boolean}
  * @api public
  */


  function enabled(name) {
    if (name[name.length - 1] === '*') {
      return true;
    }

    var i;
    var len;

    for (i = 0, len = createDebug.skips.length; i < len; i++) {
      if (createDebug.skips[i].test(name)) {
        return false;
      }
    }

    for (i = 0, len = createDebug.names.length; i < len; i++) {
      if (createDebug.names[i].test(name)) {
        return true;
      }
    }

    return false;
  }
  /**
  * Coerce `val`.
  *
  * @param {Mixed} val
  * @return {Mixed}
  * @api private
  */


  function coerce(val) {
    if (val instanceof Error) {
      return val.stack || val.message;
    }

    return val;
  }

  createDebug.enable(createDebug.load());
  return createDebug;
}

module.exports = setup;

"use strict";

/**
 * Detect Electron renderer / nwjs process, which is node, but we should
 * treat as a browser.
 */
if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
  module.exports = require('./browser.js');
} else {
  module.exports = require('./node.js');
}

"use strict";

/**
 * Module dependencies.
 */
var tty = require('tty');

var util = require('util');
/**
 * This is the Node.js implementation of `debug()`.
 */


exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

try {
  // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
  // eslint-disable-next-line import/no-extraneous-dependencies
  var supportsColor = require('supports-color');

  if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
    exports.colors = [20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68, 69, 74, 75, 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134, 135, 148, 149, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 178, 179, 184, 185, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 214, 215, 220, 221];
  }
} catch (error) {} // Swallow - we only care if `supports-color` is available; it doesn't have to be.

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */


exports.inspectOpts = Object.keys(process.env).filter(function (key) {
  return /^debug_/i.test(key);
}).reduce(function (obj, key) {
  // Camel-case
  var prop = key.substring(6).toLowerCase().replace(/_([a-z])/g, function (_, k) {
    return k.toUpperCase();
  }); // Coerce string value into JS value

  var val = process.env[key];

  if (/^(yes|on|true|enabled)$/i.test(val)) {
    val = true;
  } else if (/^(no|off|false|disabled)$/i.test(val)) {
    val = false;
  } else if (val === 'null') {
    val = null;
  } else {
    val = Number(val);
  }

  obj[prop] = val;
  return obj;
}, {});
/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
  return 'colors' in exports.inspectOpts ? Boolean(exports.inspectOpts.colors) : tty.isatty(process.stderr.fd);
}
/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */


function formatArgs(args) {
  var name = this.namespace,
      useColors = this.useColors;

  if (useColors) {
    var c = this.color;
    var colorCode = "\x1B[3" + (c < 8 ? c : '8;5;' + c);
    var prefix = "  ".concat(colorCode, ";1m").concat(name, " \x1B[0m");
    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
    args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + "\x1B[0m");
  } else {
    args[0] = getDate() + name + ' ' + args[0];
  }
}

function getDate() {
  if (exports.inspectOpts.hideDate) {
    return '';
  }

  return new Date().toISOString() + ' ';
}
/**
 * Invokes `util.format()` with the specified arguments and writes to stderr.
 */


function log() {
  return process.stderr.write(util.format.apply(util, arguments) + '\n');
}
/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */


function save(namespaces) {
  if (namespaces) {
    process.env.DEBUG = namespaces;
  } else {
    // If you set a process.env field to null or undefined, it gets cast to the
    // string 'null' or 'undefined'. Just delete instead.
    delete process.env.DEBUG;
  }
}
/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */


function load() {
  return process.env.DEBUG;
}
/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */


function init(debug) {
  debug.inspectOpts = {};
  var keys = Object.keys(exports.inspectOpts);

  for (var i = 0; i < keys.length; i++) {
    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
  }
}

module.exports = require('./common')(exports);
var formatters = module.exports.formatters;
/**
 * Map %o to `util.inspect()`, all on a single line.
 */

formatters.o = function (v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts).replace(/\s*\n\s*/g, ' ');
};
/**
 * Map %O to `util.inspect()`, allowing multiple lines if needed.
 */


formatters.O = function (v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts);
};

"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

(function (f) {
  if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) === "object" && typeof module !== "undefined") {
    module.exports = f();
  } else if (typeof define === "function" && define.amd) {
    define([], f);
  } else {
    var g;

    if (typeof window !== "undefined") {
      g = window;
    } else if (typeof global !== "undefined") {
      g = global;
    } else if (typeof self !== "undefined") {
      g = self;
    } else {
      g = this;
    }

    g.debug = f();
  }
})(function () {
  var define, module, exports;
  return function () {
    function r(e, n, t) {
      function o(i, f) {
        if (!n[i]) {
          if (!e[i]) {
            var c = "function" == typeof require && require;
            if (!f && c) return c(i, !0);
            if (u) return u(i, !0);
            var a = new Error("Cannot find module '" + i + "'");
            throw a.code = "MODULE_NOT_FOUND", a;
          }

          var p = n[i] = {
            exports: {}
          };
          e[i][0].call(p.exports, function (r) {
            var n = e[i][1][r];
            return o(n || r);
          }, p, p.exports, r, e, n, t);
        }

        return n[i].exports;
      }

      for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) {
        o(t[i]);
      }

      return o;
    }

    return r;
  }()({
    1: [function (require, module, exports) {
      /**
       * Helpers.
       */
      var s = 1000;
      var m = s * 60;
      var h = m * 60;
      var d = h * 24;
      var w = d * 7;
      var y = d * 365.25;
      /**
       * Parse or format the given `val`.
       *
       * Options:
       *
       *  - `long` verbose formatting [false]
       *
       * @param {String|Number} val
       * @param {Object} [options]
       * @throws {Error} throw an error if val is not a non-empty string or a number
       * @return {String|Number}
       * @api public
       */

      module.exports = function (val, options) {
        options = options || {};

        var type = _typeof(val);

        if (type === 'string' && val.length > 0) {
          return parse(val);
        } else if (type === 'number' && isNaN(val) === false) {
          return options.long ? fmtLong(val) : fmtShort(val);
        }

        throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val));
      };
      /**
       * Parse the given `str` and return milliseconds.
       *
       * @param {String} str
       * @return {Number}
       * @api private
       */


      function parse(str) {
        str = String(str);

        if (str.length > 100) {
          return;
        }

        var match = /^((?:\d+)?\-?\d?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);

        if (!match) {
          return;
        }

        var n = parseFloat(match[1]);
        var type = (match[2] || 'ms').toLowerCase();

        switch (type) {
          case 'years':
          case 'year':
          case 'yrs':
          case 'yr':
          case 'y':
            return n * y;

          case 'weeks':
          case 'week':
          case 'w':
            return n * w;

          case 'days':
          case 'day':
          case 'd':
            return n * d;

          case 'hours':
          case 'hour':
          case 'hrs':
          case 'hr':
          case 'h':
            return n * h;

          case 'minutes':
          case 'minute':
          case 'mins':
          case 'min':
          case 'm':
            return n * m;

          case 'seconds':
          case 'second':
          case 'secs':
          case 'sec':
          case 's':
            return n * s;

          case 'milliseconds':
          case 'millisecond':
          case 'msecs':
          case 'msec':
          case 'ms':
            return n;

          default:
            return undefined;
        }
      }
      /**
       * Short format for `ms`.
       *
       * @param {Number} ms
       * @return {String}
       * @api private
       */


      function fmtShort(ms) {
        var msAbs = Math.abs(ms);

        if (msAbs >= d) {
          return Math.round(ms / d) + 'd';
        }

        if (msAbs >= h) {
          return Math.round(ms / h) + 'h';
        }

        if (msAbs >= m) {
          return Math.round(ms / m) + 'm';
        }

        if (msAbs >= s) {
          return Math.round(ms / s) + 's';
        }

        return ms + 'ms';
      }
      /**
       * Long format for `ms`.
       *
       * @param {Number} ms
       * @return {String}
       * @api private
       */


      function fmtLong(ms) {
        var msAbs = Math.abs(ms);

        if (msAbs >= d) {
          return plural(ms, msAbs, d, 'day');
        }

        if (msAbs >= h) {
          return plural(ms, msAbs, h, 'hour');
        }

        if (msAbs >= m) {
          return plural(ms, msAbs, m, 'minute');
        }

        if (msAbs >= s) {
          return plural(ms, msAbs, s, 'second');
        }

        return ms + ' ms';
      }
      /**
       * Pluralization helper.
       */


      function plural(ms, msAbs, n, name) {
        var isPlural = msAbs >= n * 1.5;
        return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
      }
    }, {}],
    2: [function (require, module, exports) {
      // shim for using process in browser
      var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it
      // don't break things.  But we need to wrap it in a try catch in case it is
      // wrapped in strict mode code which doesn't define any globals.  It's inside a
      // function because try/catches deoptimize in certain engines.

      var cachedSetTimeout;
      var cachedClearTimeout;

      function defaultSetTimout() {
        throw new Error('setTimeout has not been defined');
      }

      function defaultClearTimeout() {
        throw new Error('clearTimeout has not been defined');
      }

      (function () {
        try {
          if (typeof setTimeout === 'function') {
            cachedSetTimeout = setTimeout;
          } else {
            cachedSetTimeout = defaultSetTimout;
          }
        } catch (e) {
          cachedSetTimeout = defaultSetTimout;
        }

        try {
          if (typeof clearTimeout === 'function') {
            cachedClearTimeout = clearTimeout;
          } else {
            cachedClearTimeout = defaultClearTimeout;
          }
        } catch (e) {
          cachedClearTimeout = defaultClearTimeout;
        }
      })();

      function runTimeout(fun) {
        if (cachedSetTimeout === setTimeout) {
          //normal enviroments in sane situations
          return setTimeout(fun, 0);
        } // if setTimeout wasn't available but was latter defined


        if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
          cachedSetTimeout = setTimeout;
          return setTimeout(fun, 0);
        }

        try {
          // when when somebody has screwed with setTimeout but no I.E. maddness
          return cachedSetTimeout(fun, 0);
        } catch (e) {
          try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
            return cachedSetTimeout.call(null, fun, 0);
          } catch (e) {
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
            return cachedSetTimeout.call(this, fun, 0);
          }
        }
      }

      function runClearTimeout(marker) {
        if (cachedClearTimeout === clearTimeout) {
          //normal enviroments in sane situations
          return clearTimeout(marker);
        } // if clearTimeout wasn't available but was latter defined


        if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
          cachedClearTimeout = clearTimeout;
          return clearTimeout(marker);
        }

        try {
          // when when somebody has screwed with setTimeout but no I.E. maddness
          return cachedClearTimeout(marker);
        } catch (e) {
          try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
            return cachedClearTimeout.call(null, marker);
          } catch (e) {
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
            return cachedClearTimeout.call(this, marker);
          }
        }
      }

      var queue = [];
      var draining = false;
      var currentQueue;
      var queueIndex = -1;

      function cleanUpNextTick() {
        if (!draining || !currentQueue) {
          return;
        }

        draining = false;

        if (currentQueue.length) {
          queue = currentQueue.concat(queue);
        } else {
          queueIndex = -1;
        }

        if (queue.length) {
          drainQueue();
        }
      }

      function drainQueue() {
        if (draining) {
          return;
        }

        var timeout = runTimeout(cleanUpNextTick);
        draining = true;
        var len = queue.length;

        while (len) {
          currentQueue = queue;
          queue = [];

          while (++queueIndex < len) {
            if (currentQueue) {
              currentQueue[queueIndex].run();
            }
          }

          queueIndex = -1;
          len = queue.length;
        }

        currentQueue = null;
        draining = false;
        runClearTimeout(timeout);
      }

      process.nextTick = function (fun) {
        var args = new Array(arguments.length - 1);

        if (arguments.length > 1) {
          for (var i = 1; i < arguments.length; i++) {
            args[i - 1] = arguments[i];
          }
        }

        queue.push(new Item(fun, args));

        if (queue.length === 1 && !draining) {
          runTimeout(drainQueue);
        }
      }; // v8 likes predictible objects


      function Item(fun, array) {
        this.fun = fun;
        this.array = array;
      }

      Item.prototype.run = function () {
        this.fun.apply(null, this.array);
      };

      process.title = 'browser';
      process.browser = true;
      process.env = {};
      process.argv = [];
      process.version = ''; // empty string to avoid regexp issues

      process.versions = {};

      function noop() {}

      process.on = noop;
      process.addListener = noop;
      process.once = noop;
      process.off = noop;
      process.removeListener = noop;
      process.removeAllListeners = noop;
      process.emit = noop;
      process.prependListener = noop;
      process.prependOnceListener = noop;

      process.listeners = function (name) {
        return [];
      };

      process.binding = function (name) {
        throw new Error('process.binding is not supported');
      };

      process.cwd = function () {
        return '/';
      };

      process.chdir = function (dir) {
        throw new Error('process.chdir is not supported');
      };

      process.umask = function () {
        return 0;
      };
    }, {}],
    3: [function (require, module, exports) {
      /**
       * This is the common logic for both the Node.js and web browser
       * implementations of `debug()`.
       */
      function setup(env) {
        createDebug.debug = createDebug;
        createDebug.default = createDebug;
        createDebug.coerce = coerce;
        createDebug.disable = disable;
        createDebug.enable = enable;
        createDebug.enabled = enabled;
        createDebug.humanize = require('ms');
        Object.keys(env).forEach(function (key) {
          createDebug[key] = env[key];
        });
        /**
        * Active `debug` instances.
        */

        createDebug.instances = [];
        /**
        * The currently active debug mode names, and names to skip.
        */

        createDebug.names = [];
        createDebug.skips = [];
        /**
        * Map of special "%n" handling functions, for the debug "format" argument.
        *
        * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
        */

        createDebug.formatters = {};
        /**
        * Selects a color for a debug namespace
        * @param {String} namespace The namespace string for the for the debug instance to be colored
        * @return {Number|String} An ANSI color code for the given namespace
        * @api private
        */

        function selectColor(namespace) {
          var hash = 0;

          for (var i = 0; i < namespace.length; i++) {
            hash = (hash << 5) - hash + namespace.charCodeAt(i);
            hash |= 0; // Convert to 32bit integer
          }

          return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
        }

        createDebug.selectColor = selectColor;
        /**
        * Create a debugger with the given `namespace`.
        *
        * @param {String} namespace
        * @return {Function}
        * @api public
        */

        function createDebug(namespace) {
          var prevTime;

          function debug() {
            for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
              args[_key] = arguments[_key];
            }

            // Disabled?
            if (!debug.enabled) {
              return;
            }

            var self = debug; // Set `diff` timestamp

            var curr = Number(new Date());
            var ms = curr - (prevTime || curr);
            self.diff = ms;
            self.prev = prevTime;
            self.curr = curr;
            prevTime = curr;
            args[0] = createDebug.coerce(args[0]);

            if (typeof args[0] !== 'string') {
              // Anything else let's inspect with %O
              args.unshift('%O');
            } // Apply any `formatters` transformations


            var index = 0;
            args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {
              // If we encounter an escaped % then don't increase the array index
              if (match === '%%') {
                return match;
              }

              index++;
              var formatter = createDebug.formatters[format];

              if (typeof formatter === 'function') {
                var val = args[index];
                match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format`

                args.splice(index, 1);
                index--;
              }

              return match;
            }); // Apply env-specific formatting (colors, etc.)

            createDebug.formatArgs.call(self, args);
            var logFn = self.log || createDebug.log;
            logFn.apply(self, args);
          }

          debug.namespace = namespace;
          debug.enabled = createDebug.enabled(namespace);
          debug.useColors = createDebug.useColors();
          debug.color = selectColor(namespace);
          debug.destroy = destroy;
          debug.extend = extend; // Debug.formatArgs = formatArgs;
          // debug.rawLog = rawLog;
          // env-specific initialization logic for debug instances

          if (typeof createDebug.init === 'function') {
            createDebug.init(debug);
          }

          createDebug.instances.push(debug);
          return debug;
        }

        function destroy() {
          var index = createDebug.instances.indexOf(this);

          if (index !== -1) {
            createDebug.instances.splice(index, 1);
            return true;
          }

          return false;
        }

        function extend(namespace, delimiter) {
          return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
        }
        /**
        * Enables a debug mode by namespaces. This can include modes
        * separated by a colon and wildcards.
        *
        * @param {String} namespaces
        * @api public
        */


        function enable(namespaces) {
          createDebug.save(namespaces);
          createDebug.names = [];
          createDebug.skips = [];
          var i;
          var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
          var len = split.length;

          for (i = 0; i < len; i++) {
            if (!split[i]) {
              // ignore empty strings
              continue;
            }

            namespaces = split[i].replace(/\*/g, '.*?');

            if (namespaces[0] === '-') {
              createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
            } else {
              createDebug.names.push(new RegExp('^' + namespaces + '$'));
            }
          }

          for (i = 0; i < createDebug.instances.length; i++) {
            var instance = createDebug.instances[i];
            instance.enabled = createDebug.enabled(instance.namespace);
          }
        }
        /**
        * Disable debug output.
        *
        * @api public
        */


        function disable() {
          createDebug.enable('');
        }
        /**
        * Returns true if the given mode name is enabled, false otherwise.
        *
        * @param {String} name
        * @return {Boolean}
        * @api public
        */


        function enabled(name) {
          if (name[name.length - 1] === '*') {
            return true;
          }

          var i;
          var len;

          for (i = 0, len = createDebug.skips.length; i < len; i++) {
            if (createDebug.skips[i].test(name)) {
              return false;
            }
          }

          for (i = 0, len = createDebug.names.length; i < len; i++) {
            if (createDebug.names[i].test(name)) {
              return true;
            }
          }

          return false;
        }
        /**
        * Coerce `val`.
        *
        * @param {Mixed} val
        * @return {Mixed}
        * @api private
        */


        function coerce(val) {
          if (val instanceof Error) {
            return val.stack || val.message;
          }

          return val;
        }

        createDebug.enable(createDebug.load());
        return createDebug;
      }

      module.exports = setup;
    }, {
      "ms": 1
    }],
    4: [function (require, module, exports) {
      (function (process) {
        /* eslint-env browser */

        /**
         * This is the web browser implementation of `debug()`.
         */
        exports.log = log;
        exports.formatArgs = formatArgs;
        exports.save = save;
        exports.load = load;
        exports.useColors = useColors;
        exports.storage = localstorage();
        /**
         * Colors.
         */

        exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];
        /**
         * Currently only WebKit-based Web Inspectors, Firefox >= v31,
         * and the Firebug extension (any Firefox version) are known
         * to support "%c" CSS customizations.
         *
         * TODO: add a `localStorage` variable to explicitly enable/disable colors
         */
        // eslint-disable-next-line complexity

        function useColors() {
          // NB: In an Electron preload script, document will be defined but not fully
          // initialized. Since we know we're in Chrome, we'll just detect this case
          // explicitly
          if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
            return true;
          } // Internet Explorer and Edge do not support colors.


          if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
            return false;
          } // Is webkit? http://stackoverflow.com/a/16459606/376773
          // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632


          return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773
          typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?
          // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
          typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker
          typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
        }
        /**
         * Colorize log arguments if enabled.
         *
         * @api public
         */


        function formatArgs(args) {
          args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);

          if (!this.useColors) {
            return;
          }

          var c = 'color: ' + this.color;
          args.splice(1, 0, c, 'color: inherit'); // The final "%c" is somewhat tricky, because there could be other
          // arguments passed either before or after the %c, so we need to
          // figure out the correct index to insert the CSS into

          var index = 0;
          var lastC = 0;
          args[0].replace(/%[a-zA-Z%]/g, function (match) {
            if (match === '%%') {
              return;
            }

            index++;

            if (match === '%c') {
              // We only are interested in the *last* %c
              // (the user may have provided their own)
              lastC = index;
            }
          });
          args.splice(lastC, 0, c);
        }
        /**
         * Invokes `console.log()` when available.
         * No-op when `console.log` is not a "function".
         *
         * @api public
         */


        function log() {
          var _console;

          // This hackery is required for IE8/9, where
          // the `console.log` function doesn't have 'apply'
          return (typeof console === "undefined" ? "undefined" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments);
        }
        /**
         * Save `namespaces`.
         *
         * @param {String} namespaces
         * @api private
         */


        function save(namespaces) {
          try {
            if (namespaces) {
              exports.storage.setItem('debug', namespaces);
            } else {
              exports.storage.removeItem('debug');
            }
          } catch (error) {// Swallow
            // XXX (@Qix-) should we be logging these?
          }
        }
        /**
         * Load `namespaces`.
         *
         * @return {String} returns the previously persisted debug modes
         * @api private
         */


        function load() {
          var r;

          try {
            r = exports.storage.getItem('debug');
          } catch (error) {} // Swallow
          // XXX (@Qix-) should we be logging these?
          // If debug isn't set in LS, and we're in Electron, try to load $DEBUG


          if (!r && typeof process !== 'undefined' && 'env' in process) {
            r = process.env.DEBUG;
          }

          return r;
        }
        /**
         * Localstorage attempts to return the localstorage.
         *
         * This is necessary because safari throws
         * when a user disables cookies/localstorage
         * and you attempt to access it.
         *
         * @return {LocalStorage}
         * @api private
         */


        function localstorage() {
          try {
            // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
            // The Browser also has localStorage in the global context.
            return localStorage;
          } catch (error) {// Swallow
            // XXX (@Qix-) should we be logging these?
          }
        }

        module.exports = require('./common')(exports);
        var formatters = module.exports.formatters;
        /**
         * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
         */

        formatters.j = function (v) {
          try {
            return JSON.stringify(v);
          } catch (error) {
            return '[UnexpectedJSONParseError]: ' + error.message;
          }
        };
      }).call(this, require('_process'));
    }, {
      "./common": 3,
      "_process": 2
    }]
  }, {}, [4])(4);
});

'use strict';
module.exports = function (str, sep) {
	if (typeof str !== 'string') {
		throw new TypeError('Expected a string');
	}

	sep = typeof sep === 'undefined' ? '_' : sep;

	return str
		.replace(/([a-z\d])([A-Z])/g, '$1' + sep + '$2')
		.replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + sep + '$2')
		.toLowerCase();
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Convert a camelized string into a lowercased one with a custom separator: unicornRainbow â†’ unicorn_rainbow",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/decamelize#readme",
  "license": "MIT",
  "name": "decamelize",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/decamelize.git"
  },
  "version": "1.2.0"
}'use strict';
const PassThrough = require('stream').PassThrough;
const zlib = require('zlib');
const mimicResponse = require('mimic-response');

module.exports = response => {
	// TODO: Use Array#includes when targeting Node.js 6
	if (['gzip', 'deflate'].indexOf(response.headers['content-encoding']) === -1) {
		return response;
	}

	const unzip = zlib.createUnzip();
	const stream = new PassThrough();

	mimicResponse(response, stream);

	unzip.on('error', err => {
		if (err.code === 'Z_BUF_ERROR') {
			stream.end();
			return;
		}

		stream.emit('error', err);
	});

	response.pipe(unzip).pipe(stream);

	return stream;
};
`The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "dependencies": {
    "mimic-response": "^1.0.0"
  },
  "deprecated": false,
  "description": "Decompress a HTTP response if needed",
  "devDependencies": {
    "ava": "*",
    "get-stream": "^3.0.0",
    "pify": "^3.0.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/decompress-response#readme",
  "license": "MIT",
  "maintainers": [
    {
      "name": "Sindre Sorhus",
      "email": "sindresorhus@gmail.com",
      "url": "sindresorhus.com"
    },
    {
      "name": "Vsevolod Strukchinsky",
      "email": "floatdrop@gmail.com",
      "url": "github.com/floatdrop"
    }
  ],
  "name": "decompress-response",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/decompress-response.git"
  },
  "version": "3.3.0"
}The MIT License (MIT)

Copyright (c) 2015 Desmond Brand (dmnd@desmondbrand.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Desmond Brand",
    "email": "dmnd@desmondbrand.com",
    "url": "http://desmondbrand.com"
  },
  "deprecated": false,
  "description": "An ES6 string tag that strips indentation from multi-line strings",
  "devDependencies": {
    "babel-cli": "^6.22.2",
    "babel-preset-es2015": "^6.22.0",
    "babel-preset-es2016": "^6.22.0",
    "babel-preset-es2017": "^6.22.0",
    "eslint": "^3.14.1",
    "jest": "^18.1.0"
  },
  "files": [
    "dist/dedent.js",
    "LICENSE"
  ],
  "homepage": "https://github.com/dmnd/dedent",
  "license": "MIT",
  "main": "dist/dedent.js",
  "name": "dedent",
  "repository": {
    "type": "git",
    "url": "git://github.com/dmnd/dedent.git"
  },
  "version": "0.7.0"
}"use strict";

function dedent(strings) {

  var raw = void 0;
  if (typeof strings === "string") {
    // dedent can be used as a plain function
    raw = [strings];
  } else {
    raw = strings.raw;
  }

  // first, perform interpolation
  var result = "";
  for (var i = 0; i < raw.length; i++) {
    result += raw[i].
    // join lines when there is a suppressed newline
    replace(/\\\n[ \t]*/g, "").

    // handle escaped backticks
    replace(/\\`/g, "`");

    if (i < (arguments.length <= 1 ? 0 : arguments.length - 1)) {
      result += arguments.length <= i + 1 ? undefined : arguments[i + 1];
    }
  }

  // now strip indentation
  var lines = result.split("\n");
  var mindent = null;
  lines.forEach(function (l) {
    var m = l.match(/^(\s+)\S+/);
    if (m) {
      var indent = m[1].length;
      if (!mindent) {
        // this is the first indented line
        mindent = indent;
      } else {
        mindent = Math.min(mindent, indent);
      }
    }
  });

  if (mindent !== null) {
    result = lines.map(function (l) {
      return l[0] === " " ? l.slice(mindent) : l;
    }).join("\n");
  }

  // dedent eats leading and trailing whitespace too
  result = result.trim();

  // handle escaped newlines at the end to ensure they don't get stripped too
  return result.replace(/\\n/g, "\n");
}

if (typeof module !== "undefined") {
  module.exports = dedent;
}
The MIT License (MIT)

Copyright (c) 2013-2018, Viacheslav Lotsmanov

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
module.exports = require('./lib/deep-extend');
{
  "author": {
    "name": "Viacheslav Lotsmanov",
    "email": "lotsmanov89@gmail.com"
  },
  "deprecated": false,
  "description": "Recursive object extending",
  "devDependencies": {
    "mocha": "5.2.0",
    "should": "13.2.1"
  },
  "engines": {
    "node": ">=4.0.0"
  },
  "files": [
    "index.js",
    "lib/"
  ],
  "homepage": "https://github.com/unclechu/node-deep-extend",
  "license": "MIT",
  "licenses": [
    {
      "type": "MIT",
      "url": "https://raw.githubusercontent.com/unclechu/node-deep-extend/master/LICENSE"
    }
  ],
  "main": "lib/deep-extend.js",
  "name": "deep-extend",
  "repository": {
    "type": "git",
    "url": "git://github.com/unclechu/node-deep-extend.git"
  },
  "version": "0.6.0"
}/*!
 * @description Recursive object extending
 * @author Viacheslav Lotsmanov <lotsmanov89@gmail.com>
 * @license MIT
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013-2018 Viacheslav Lotsmanov
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

'use strict';

function isSpecificValue(val) {
	return (
		val instanceof Buffer
		|| val instanceof Date
		|| val instanceof RegExp
	) ? true : false;
}

function cloneSpecificValue(val) {
	if (val instanceof Buffer) {
		var x = Buffer.alloc
			? Buffer.alloc(val.length)
			: new Buffer(val.length);
		val.copy(x);
		return x;
	} else if (val instanceof Date) {
		return new Date(val.getTime());
	} else if (val instanceof RegExp) {
		return new RegExp(val);
	} else {
		throw new Error('Unexpected situation');
	}
}

/**
 * Recursive cloning array.
 */
function deepCloneArray(arr) {
	var clone = [];
	arr.forEach(function (item, index) {
		if (typeof item === 'object' && item !== null) {
			if (Array.isArray(item)) {
				clone[index] = deepCloneArray(item);
			} else if (isSpecificValue(item)) {
				clone[index] = cloneSpecificValue(item);
			} else {
				clone[index] = deepExtend({}, item);
			}
		} else {
			clone[index] = item;
		}
	});
	return clone;
}

function safeGetProperty(object, property) {
	return property === '__proto__' ? undefined : object[property];
}

/**
 * Extening object that entered in first argument.
 *
 * Returns extended object or false if have no target object or incorrect type.
 *
 * If you wish to clone source object (without modify it), just use empty new
 * object as first argument, like this:
 *   deepExtend({}, yourObj_1, [yourObj_N]);
 */
var deepExtend = module.exports = function (/*obj_1, [obj_2], [obj_N]*/) {
	if (arguments.length < 1 || typeof arguments[0] !== 'object') {
		return false;
	}

	if (arguments.length < 2) {
		return arguments[0];
	}

	var target = arguments[0];

	// convert arguments to array and cut off target object
	var args = Array.prototype.slice.call(arguments, 1);

	var val, src, clone;

	args.forEach(function (obj) {
		// skip argument if isn't an object, is null, or is an array
		if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
			return;
		}

		Object.keys(obj).forEach(function (key) {
			src = safeGetProperty(target, key); // source value
			val = safeGetProperty(obj, key); // new value

			// recursion prevention
			if (val === target) {
				return;

			/**
			 * if new value isn't object then just overwrite by new value
			 * instead of extending.
			 */
			} else if (typeof val !== 'object' || val === null) {
				target[key] = val;
				return;

			// just clone arrays (and recursive clone objects inside)
			} else if (Array.isArray(val)) {
				target[key] = deepCloneArray(val);
				return;

			// custom cloning and overwrite for specific objects
			} else if (isSpecificValue(val)) {
				target[key] = cloneSpecificValue(val);
				return;

			// overwrite by new value if source isn't object or array
			} else if (typeof src !== 'object' || src === null || Array.isArray(src)) {
				target[key] = deepExtend({}, val);
				return;

			// source value and new value is objects both, extending...
			} else {
				target[key] = deepExtend(src, val);
				return;
			}
		});
	});

	return target;
};
MIT License

Copyright (c) 2018 Szymon Marczak

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "author": {
    "name": "Szymon Marczak"
  },
  "deprecated": false,
  "description": "The safe way to handle the `connect` socket event",
  "devDependencies": {
    "@sindresorhus/tsconfig": "^0.5.0",
    "@types/node": "^12.12.4",
    "@typescript-eslint/eslint-plugin": "^1.11.0",
    "@typescript-eslint/parser": "^1.11.0",
    "ava": "^2.1.0",
    "coveralls": "^3.0.7",
    "create-cert": "^1.0.6",
    "del-cli": "^3.0.0",
    "eslint-config-xo-typescript": "^0.15.0",
    "nyc": "^14.0.0",
    "p-event": "^4.1.0",
    "ts-node": "^8.1.0",
    "typescript": "^3.6.4",
    "xo": "^0.25.3"
  },
  "files": [
    "dist"
  ],
  "homepage": "https://github.com/szmarczak/defer-to-connect#readme",
  "license": "MIT",
  "main": "dist",
  "name": "defer-to-connect",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/szmarczak/defer-to-connect.git"
  },
  "types": "dist",
  "version": "1.1.3"
}"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tls_1 = require("tls");
const deferToConnect = (socket, fn) => {
    let listeners;
    if (typeof fn === 'function') {
        const connect = fn;
        listeners = { connect };
    }
    else {
        listeners = fn;
    }
    const hasConnectListener = typeof listeners.connect === 'function';
    const hasSecureConnectListener = typeof listeners.secureConnect === 'function';
    const hasCloseListener = typeof listeners.close === 'function';
    const onConnect = () => {
        if (hasConnectListener) {
            listeners.connect();
        }
        if (socket instanceof tls_1.TLSSocket && hasSecureConnectListener) {
            if (socket.authorized) {
                listeners.secureConnect();
            }
            else if (!socket.authorizationError) {
                socket.once('secureConnect', listeners.secureConnect);
            }
        }
        if (hasCloseListener) {
            socket.once('close', listeners.close);
        }
    };
    if (socket.writable && !socket.connecting) {
        onConnect();
    }
    else if (socket.connecting) {
        socket.once('connect', onConnect);
    }
    else if (socket.destroyed && hasCloseListener) {
        listeners.close(socket._hadError);
    }
};
exports.default = deferToConnect;
// For CommonJS default export support
module.exports = deferToConnect;
module.exports.default = deferToConnect;
Copyright (c) 2011 Debuggable Limited <felix@debuggable.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
SHELL := /bin/bash

test:
	@./test/run.js

.PHONY: test

# delayed-stream

Buffers events from a stream until you are ready to handle them.

## Installation

``` bash
npm install delayed-stream
```

## Usage

The following example shows how to write a http echo server that delays its
response by 1000 ms.

``` javascript
var DelayedStream = require('delayed-stream');
var http = require('http');

http.createServer(function(req, res) {
  var delayed = DelayedStream.create(req);

  setTimeout(function() {
    res.writeHead(200);
    delayed.pipe(res);
  }, 1000);
});
```

If you are not using `Stream#pipe`, you can also manually release the buffered
events by calling `delayedStream.resume()`:

``` javascript
var delayed = DelayedStream.create(req);

setTimeout(function() {
  // Emit all buffered events and resume underlaying source
  delayed.resume();
}, 1000);
```

## Implementation

In order to use this meta stream properly, here are a few things you should
know about the implementation.

### Event Buffering / Proxying

All events of the `source` stream are hijacked by overwriting the `source.emit`
method. Until node implements a catch-all event listener, this is the only way.

However, delayed-stream still continues to emit all events it captures on the
`source`, regardless of whether you have released the delayed stream yet or
not.

Upon creation, delayed-stream captures all `source` events and stores them in
an internal event buffer. Once `delayedStream.release()` is called, all
buffered events are emitted on the `delayedStream`, and the event buffer is
cleared. After that, delayed-stream merely acts as a proxy for the underlaying
source.

### Error handling

Error events on `source` are buffered / proxied just like any other events.
However, `delayedStream.create` attaches a no-op `'error'` listener to the
`source`. This way you only have to handle errors on the `delayedStream`
object, rather than in two places.

### Buffer limits

delayed-stream provides a `maxDataSize` property that can be used to limit
the amount of data being buffered. In order to protect you from bad `source`
streams that don't react to `source.pause()`, this feature is enabled by
default.

## API

### DelayedStream.create(source, [options])

Returns a new `delayedStream`. Available options are:

* `pauseStream`
* `maxDataSize`

The description for those properties can be found below.

### delayedStream.source

The `source` stream managed by this object. This is useful if you are
passing your `delayedStream` around, and you still want to access properties
on the `source` object.

### delayedStream.pauseStream = true

Whether to pause the underlaying `source` when calling
`DelayedStream.create()`. Modifying this property afterwards has no effect.

### delayedStream.maxDataSize = 1024 * 1024

The amount of data to buffer before emitting an `error`.

If the underlaying source is emitting `Buffer` objects, the `maxDataSize`
refers to bytes.

If the underlaying source is emitting JavaScript strings, the size refers to
characters.

If you know what you are doing, you can set this property to `Infinity` to
disable this feature. You can also modify this property during runtime.

### delayedStream.dataSize = 0

The amount of data buffered so far.

### delayedStream.readable

An ECMA5 getter that returns the value of `source.readable`.

### delayedStream.resume()

If the `delayedStream` has not been released so far, `delayedStream.release()`
is called.

In either case, `source.resume()` is called.

### delayedStream.pause()

Calls `source.pause()`.

### delayedStream.pipe(dest)

Calls `delayedStream.resume()` and then proxies the arguments to `source.pipe`.

### delayedStream.release()

Emits and clears all events that have been buffered up so far. This does not
resume the underlaying source, use `delayedStream.resume()` instead.

## License

delayed-stream is licensed under the MIT license.
{
  "author": {
    "name": "Felix GeisendÃ¶rfer",
    "email": "felix@debuggable.com",
    "url": "http://debuggable.com/"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Buffers events from a stream until you are ready to handle them.",
  "devDependencies": {
    "fake": "0.2.0",
    "far": "0.0.1"
  },
  "engines": {
    "node": ">=0.4.0"
  },
  "homepage": "https://github.com/felixge/node-delayed-stream",
  "license": "MIT",
  "main": "./lib/delayed_stream",
  "name": "delayed-stream",
  "repository": {
    "type": "git",
    "url": "git://github.com/felixge/node-delayed-stream.git"
  },
  "version": "1.0.0"
}var Stream = require('stream').Stream;
var util = require('util');

module.exports = DelayedStream;
function DelayedStream() {
  this.source = null;
  this.dataSize = 0;
  this.maxDataSize = 1024 * 1024;
  this.pauseStream = true;

  this._maxDataSizeExceeded = false;
  this._released = false;
  this._bufferedEvents = [];
}
util.inherits(DelayedStream, Stream);

DelayedStream.create = function(source, options) {
  var delayedStream = new this();

  options = options || {};
  for (var option in options) {
    delayedStream[option] = options[option];
  }

  delayedStream.source = source;

  var realEmit = source.emit;
  source.emit = function() {
    delayedStream._handleEmit(arguments);
    return realEmit.apply(source, arguments);
  };

  source.on('error', function() {});
  if (delayedStream.pauseStream) {
    source.pause();
  }

  return delayedStream;
};

Object.defineProperty(DelayedStream.prototype, 'readable', {
  configurable: true,
  enumerable: true,
  get: function() {
    return this.source.readable;
  }
});

DelayedStream.prototype.setEncoding = function() {
  return this.source.setEncoding.apply(this.source, arguments);
};

DelayedStream.prototype.resume = function() {
  if (!this._released) {
    this.release();
  }

  this.source.resume();
};

DelayedStream.prototype.pause = function() {
  this.source.pause();
};

DelayedStream.prototype.release = function() {
  this._released = true;

  this._bufferedEvents.forEach(function(args) {
    this.emit.apply(this, args);
  }.bind(this));
  this._bufferedEvents = [];
};

DelayedStream.prototype.pipe = function() {
  var r = Stream.prototype.pipe.apply(this, arguments);
  this.resume();
  return r;
};

DelayedStream.prototype._handleEmit = function(args) {
  if (this._released) {
    this.emit.apply(this, args);
    return;
  }

  if (args[0] === 'data') {
    this.dataSize += args[1].length;
    this._checkIfMaxDataSizeExceeded();
  }

  this._bufferedEvents.push(args);
};

DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {
  if (this._maxDataSizeExceeded) {
    return;
  }

  if (this.dataSize <= this.maxDataSize) {
    return;
  }

  this._maxDataSizeExceeded = true;
  var message =
    'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'
  this.emit('error', new Error(message));
};
{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "app-builder-lib": "~20.44.4",
    "bluebird-lst": "^1.0.9",
    "builder-util": "~10.1.2",
    "fs-extra-p": "^8.0.2",
    "iconv-lite": "^0.4.24",
    "js-yaml": "^3.13.1",
    "parse-color": "^1.0.0",
    "sanitize-filename": "^1.6.1"
  },
  "deprecated": false,
  "description": "Utilities to build DMG. Used by [electron-builder](https://github.com/electron-userland/electron-builder).",
  "files": [
    "out",
    "templates",
    "vendor"
  ],
  "homepage": "https://github.com/electron-userland/electron-builder",
  "license": "MIT",
  "main": "out/dmgUtil.js",
  "name": "dmg-builder",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-builder.git"
  },
  "typings": "./out/dmg.d.ts",
  "version": "6.7.2"
}from .alias import *
from .bookmark import *

__all__ = [ 'ALIAS_KIND_FILE', 'ALIAS_KIND_FOLDER',
            'ALIAS_HFS_VOLUME_SIGNATURE',
            'ALIAS_FIXED_DISK', 'ALIAS_NETWORK_DISK', 'ALIAS_400KB_FLOPPY_DISK',
            'ALIAS_800KB_FLOPPY_DISK', 'ALIAS_1_44MB_FLOPPY_DISK',
            'ALIAS_EJECTABLE_DISK',
            'ALIAS_NO_CNID',
            'kBookmarkPath', 'kBookmarkCNIDPath', 'kBookmarkFileProperties',
            'kBookmarkFileName', 'kBookmarkFileID', 'kBookmarkFileCreationDate',
            'kBookmarkTOCPath', 'kBookmarkVolumePath',
            'kBookmarkVolumeURL', 'kBookmarkVolumeName', 'kBookmarkVolumeUUID',
            'kBookmarkVolumeSize', 'kBookmarkVolumeCreationDate',
            'kBookmarkVolumeProperties', 'kBookmarkContainingFolder',
            'kBookmarkUserName', 'kBookmarkUID', 'kBookmarkWasFileReference',
            'kBookmarkCreationOptions', 'kBookmarkURLLengths',
            'kBookmarkSecurityExtension',
            'AppleShareInfo',
            'VolumeInfo',
            'TargetInfo',
            'Alias',
            'Bookmark',
            'Data',
            'URL' ]


# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from __future__ import division

import struct
import datetime
import io
import re
import os
import os.path
import stat
import sys

if sys.platform == 'darwin':
    from . import osx

try:
    long
except NameError:
    long = int

from .utils import *
    
ALIAS_KIND_FILE = 0
ALIAS_KIND_FOLDER = 1

ALIAS_HFS_VOLUME_SIGNATURE = b'H+'

ALIAS_FIXED_DISK = 0
ALIAS_NETWORK_DISK = 1
ALIAS_400KB_FLOPPY_DISK = 2
ALIAS_800KB_FLOPPY_DISK = 3
ALIAS_1_44MB_FLOPPY_DISK = 4
ALIAS_EJECTABLE_DISK = 5

ALIAS_NO_CNID = 0xffffffff

def encode_utf8(s):
    if isinstance(s, bytes):
        return s
    return s.encode('utf-8')

def decode_utf8(s):
    if isinstance(s, bytes):
        return s.decode('utf-8')
    return s

class AppleShareInfo (object):
    def __init__(self, zone=None, server=None, user=None):
        #: The AppleShare zone
        self.zone = zone
        #: The AFP server
        self.server = server
        #: The username
        self.user = user

    def __repr__(self):
        return 'AppleShareInfo(%r,%r,%r)' % (self.zone, self.server, self.user)
    
class VolumeInfo (object):
    def __init__(self, name, creation_date, fs_type, disk_type,
                 attribute_flags, fs_id, appleshare_info=None,
                 driver_name=None, posix_path=None, disk_image_alias=None,
                 dialup_info=None, network_mount_info=None):
        #: The name of the volume on which the target resides
        self.name = name
        
        #: The creation date of the target's volume
        self.creation_date = creation_date
        
        #: The filesystem type (a two character code, e.g. ``b'H+'`` for HFS+)
        self.fs_type = fs_type
        
        #: The type of disk; should be one of
        #:
        #:   * ALIAS_FIXED_DISK
        #:   * ALIAS_NETWORK_DISK
        #:   * ALIAS_400KB_FLOPPY_DISK
        #:   * ALIAS_800KB_FLOPPY_DISK
        #:   * ALIAS_1_44MB_FLOPPY_DISK
        #:   * ALIAS_EJECTABLE_DISK
        self.disk_type = disk_type

        #: Filesystem attribute flags (from HFS volume header)
        self.attribute_flags = attribute_flags

        #: Filesystem identifier
        self.fs_id = fs_id

        #: AppleShare information (for automatic remounting of network shares)
        #: *(optional)*
        self.appleshare_info = appleshare_info

        #: Driver name (*probably* contains a disk driver name on older Macs)
        #: *(optional)*
        self.driver_name = driver_name

        #: POSIX path of the mount point of the target's volume
        #: *(optional)*
        self.posix_path = posix_path

        #: :class:`Alias` object pointing at the disk image on which the
        #: target's volume resides *(optional)*
        self.disk_image_alias = disk_image_alias

        #: Dialup information (for automatic establishment of dialup connections)
        self.dialup_info = dialup_info

        #: Network mount information (for automatic remounting)
        self.network_mount_info = network_mount_info

    def __repr__(self):
        args = ['name', 'creation_date', 'fs_type', 'disk_type',
                'attribute_flags', 'fs_id']
        values = []
        for a in args:
            v = getattr(self, a)
            values.append(repr(v))
            
        kwargs = ['appleshare_info', 'driver_name', 'posix_path',
                  'disk_image_alias', 'dialup_info', 'network_mount_info']
        for a in kwargs:
            v = getattr(self, a)
            if v is not None:
                values.append('%s=%r' % (a, v))
        return 'VolumeInfo(%s)' % ','.join(values)
    
class TargetInfo (object):
    def __init__(self, kind, filename, folder_cnid, cnid, creation_date,
                 creator_code, type_code, levels_from=-1, levels_to=-1,
                 folder_name=None, cnid_path=None, carbon_path=None,
                 posix_path=None, user_home_prefix_len=None):
        #: Either ALIAS_KIND_FILE or ALIAS_KIND_FOLDER
        self.kind = kind
        
        #: The filename of the target
        self.filename = filename

        #: The CNID (Catalog Node ID) of the target's containing folder;
        #: CNIDs are similar to but different than traditional UNIX inode
        #: numbers
        self.folder_cnid = folder_cnid

        #: The CNID (Catalog Node ID) of the target
        self.cnid = cnid

        #: The target's *creation* date.
        self.creation_date = creation_date

        #: The target's Mac creator code (a four-character binary string)
        self.creator_code = creator_code

        #: The target's Mac type code (a four-character binary string)
        self.type_code = type_code

        #: The depth of the alias? Always seems to be -1 on OS X.
        self.levels_from = levels_from

        #: The depth of the target? Always seems to be -1 on OS X.
        self.levels_to = levels_to

        #: The (POSIX) name of the target's containing folder. *(optional)*
        self.folder_name = folder_name

        #: The path from the volume root as a sequence of CNIDs. *(optional)*
        self.cnid_path = cnid_path

        #: The Carbon path of the target *(optional)*
        self.carbon_path = carbon_path

        #: The POSIX path of the target relative to the volume root.  Note
        #: that this may or may not have a leading '/' character, but it is
        #: always relative to the containing volume. *(optional)*
        self.posix_path = posix_path

        #: If the path points into a user's home folder, the number of folders
        #: deep that we go before we get to that home folder. *(optional)*
        self.user_home_prefix_len = user_home_prefix_len

    def __repr__(self):
        args = ['kind', 'filename', 'folder_cnid', 'cnid', 'creation_date',
                'creator_code', 'type_code']
        values = []
        for a in args:
            v = getattr(self, a)
            values.append(repr(v))

        if self.levels_from != -1:
            values.append('levels_from=%r' % self.levels_from)
        if self.levels_to != -1:
            values.append('levels_to=%r' % self.levels_to)

        kwargs = ['folder_name', 'cnid_path', 'carbon_path',
                  'posix_path', 'user_home_prefix_len']
        for a in kwargs:
            v = getattr(self, a)
            values.append('%s=%r' % (a, v))

        return 'TargetInfo(%s)' % ','.join(values)
    
TAG_CARBON_FOLDER_NAME = 0
TAG_CNID_PATH = 1
TAG_CARBON_PATH = 2
TAG_APPLESHARE_ZONE = 3
TAG_APPLESHARE_SERVER_NAME = 4
TAG_APPLESHARE_USERNAME = 5
TAG_DRIVER_NAME = 6
TAG_NETWORK_MOUNT_INFO = 9
TAG_DIALUP_INFO = 10
TAG_UNICODE_FILENAME = 14
TAG_UNICODE_VOLUME_NAME = 15
TAG_HIGH_RES_VOLUME_CREATION_DATE = 16
TAG_HIGH_RES_CREATION_DATE = 17
TAG_POSIX_PATH = 18
TAG_POSIX_PATH_TO_MOUNTPOINT = 19
TAG_RECURSIVE_ALIAS_OF_DISK_IMAGE = 20
TAG_USER_HOME_LENGTH_PREFIX = 21

class Alias (object):
    def __init__(self, appinfo=b'\0\0\0\0', version=2, volume=None,
                       target=None, extra=[]):
        """Construct a new :class:`Alias` object with the specified
        contents."""

        #: Application specific information (four byte byte-string)
        self.appinfo = appinfo

        #: Version (we support only version 2)
        self.version = version

        #: A :class:`VolumeInfo` object describing the target's volume
        self.volume = volume
        
        #: A :class:`TargetInfo` object describing the target
        self.target = target

        #: A list of extra `(tag, value)` pairs
        self.extra = list(extra)

    @classmethod
    def _from_fd(cls, b):
        appinfo, recsize, version = struct.unpack(b'>4shh', b.read(8))

        if recsize < 150:
            raise ValueError('Incorrect alias length')
                        
        if version != 2:
            raise ValueError('Unsupported alias version %u' % version)

        kind, volname, voldate, fstype, disktype, \
        folder_cnid, filename, cnid, crdate, creator_code, type_code, \
        levels_from, levels_to, volattrs, volfsid, reserved = \
              struct.unpack(b'>h28pI2shI64pII4s4shhI2s10s', b.read(142))

        voldate = mac_epoch + datetime.timedelta(seconds=voldate)
        crdate = mac_epoch + datetime.timedelta(seconds=crdate)

        alias = Alias()
        alias.appinfo = appinfo
            
        alias.volume = VolumeInfo (volname.replace('/',':'),
                                   voldate, fstype, disktype,
                                   volattrs, volfsid)
        alias.target = TargetInfo (kind, filename.replace('/',':'),
                                   folder_cnid, cnid,
                                   crdate, creator_code, type_code)
        alias.target.levels_from = levels_from
        alias.target.levels_to = levels_to
        
        tag = struct.unpack(b'>h', b.read(2))[0]

        while tag != -1:
            length = struct.unpack(b'>h', b.read(2))[0]
            value = b.read(length)
            if length & 1:
                b.read(1)

            if tag == TAG_CARBON_FOLDER_NAME:
                alias.target.folder_name = value.replace('/',':')
            elif tag == TAG_CNID_PATH:
                alias.target.cnid_path = struct.unpack(b'>%uI' % (length // 4),
                                                           value)
            elif tag == TAG_CARBON_PATH:
                alias.target.carbon_path = value
            elif tag == TAG_APPLESHARE_ZONE:
                if alias.volume.appleshare_info is None:
                    alias.volume.appleshare_info = AppleShareInfo()
                alias.volume.appleshare_info.zone = value
            elif tag == TAG_APPLESHARE_SERVER_NAME:
                if alias.volume.appleshare_info is None:
                    alias.volume.appleshare_info = AppleShareInfo()
                alias.volume.appleshare_info.server = value
            elif tag == TAG_APPLESHARE_USERNAME:
                if alias.volume.appleshare_info is None:
                    alias.volume.appleshare_info = AppleShareInfo()
                alias.volume.appleshare_info.user = value
            elif tag == TAG_DRIVER_NAME:
                alias.volume.driver_name = value
            elif tag == TAG_NETWORK_MOUNT_INFO:
                alias.volume.network_mount_info = value
            elif tag == TAG_DIALUP_INFO:
                alias.volume.dialup_info = value
            elif tag == TAG_UNICODE_FILENAME:
                alias.target.filename = value[2:].decode('utf-16be')
            elif tag == TAG_UNICODE_VOLUME_NAME:
                alias.volume.name = value[2:].decode('utf-16be')
            elif tag == TAG_HIGH_RES_VOLUME_CREATION_DATE:
                seconds = struct.unpack(b'>Q', value)[0] / 65536.0
                alias.volume.creation_date \
                    = mac_epoch + datetime.timedelta(seconds=seconds)
            elif tag == TAG_HIGH_RES_CREATION_DATE:
                seconds = struct.unpack(b'>Q', value)[0] / 65536.0
                alias.target.creation_date \
                    = mac_epoch + datetime.timedelta(seconds=seconds)
            elif tag == TAG_POSIX_PATH:
                alias.target.posix_path = value
            elif tag == TAG_POSIX_PATH_TO_MOUNTPOINT:
                alias.volume.posix_path = value
            elif tag == TAG_RECURSIVE_ALIAS_OF_DISK_IMAGE:
                alias.volume.disk_image_alias = Alias.from_bytes(value)
            elif tag == TAG_USER_HOME_LENGTH_PREFIX:
                alias.target.user_home_prefix_len = struct.unpack(b'>h', value)[0]
            else:
                alias.extra.append((tag, value))

            tag = struct.unpack(b'>h', b.read(2))[0]
            
        return alias
         
    @classmethod
    def from_bytes(cls, bytes):
        """Construct an :class:`Alias` object given binary Alias data."""
        with io.BytesIO(bytes) as b:
            return cls._from_fd(b)

    @classmethod
    def for_file(cls, path):
        """Create an :class:`Alias` that points at the specified file."""
        if sys.platform != 'darwin':
            raise Exception('Not implemented (requires special support)')

        path = encode_utf8(path)
        
        a = Alias()

        # Find the filesystem
        st = osx.statfs(path)
        vol_path = st.f_mntonname
        
        # Grab its attributes
        attrs = [osx.ATTR_CMN_CRTIME,
                 osx.ATTR_VOL_NAME,
                 0, 0, 0]
        volinfo = osx.getattrlist(vol_path, attrs, 0)

        vol_crtime = volinfo[0]
        vol_name = encode_utf8(volinfo[1])
        
        # Also grab various attributes of the file
        attrs = [(osx.ATTR_CMN_OBJTYPE
                  | osx.ATTR_CMN_CRTIME
                  | osx.ATTR_CMN_FNDRINFO
                  | osx.ATTR_CMN_FILEID
                  | osx.ATTR_CMN_PARENTID), 0, 0, 0, 0]
        info = osx.getattrlist(path, attrs, osx.FSOPT_NOFOLLOW)

        if info[0] == osx.VDIR:
            kind = ALIAS_KIND_FOLDER
        else:
            kind = ALIAS_KIND_FILE

        cnid = info[3]
        folder_cnid = info[4]
        
        dirname, filename = os.path.split(path)

        if dirname == b'' or dirname == b'.':
            dirname = os.getcwd()

        foldername = os.path.basename(dirname)
        
        creation_date = info[1]

        if kind == ALIAS_KIND_FILE:
            creator_code = struct.pack(b'I', info[2].fileInfo.fileCreator)
            type_code = struct.pack(b'I', info[2].fileInfo.fileType)
        else:
            creator_code = b'\0\0\0\0'
            type_code = b'\0\0\0\0'

        a.target = TargetInfo(kind, filename, folder_cnid, cnid, creation_date,
                              creator_code, type_code)
        a.volume = VolumeInfo(vol_name, vol_crtime, b'H+',
                              ALIAS_FIXED_DISK, 0, b'\0\0')

        a.target.folder_name = foldername
        a.volume.posix_path = vol_path

        rel_path = os.path.relpath(path, vol_path)

        # Leave off the initial '/' if vol_path is '/' (no idea why)
        if vol_path == b'/':
            a.target.posix_path = rel_path
        else:
            a.target.posix_path = b'/' + rel_path

        # Construct the Carbon and CNID paths
        carbon_path = []
        cnid_path = []
        head, tail = os.path.split(rel_path)
        if not tail:
            head, tail = os.path.split(head)
        while head or tail:
            if head:
                attrs = [osx.ATTR_CMN_FILEID, 0, 0, 0, 0]
                info = osx.getattrlist(os.path.join(vol_path, head), attrs, 0)
                cnid_path.append(info[0])
            carbon_tail = tail.replace(b':',b'/')
            carbon_path.insert(0, carbon_tail)
            head, tail = os.path.split(head)

        carbon_path = vol_name + b':' + b':\0'.join(carbon_path)

        a.target.carbon_path = carbon_path
        a.target.cnid_path = cnid_path

        return a
    
    def _to_fd(self, b):
        # We'll come back and fix the length when we're done
        pos = b.tell()
        b.write(struct.pack(b'>4shh', self.appinfo, 0, self.version))

        carbon_volname = encode_utf8(self.volume.name).replace(b':',b'/')
        carbon_filename = encode_utf8(self.target.filename).replace(b':',b'/')
        voldate = (self.volume.creation_date - mac_epoch).total_seconds()
        crdate = (self.target.creation_date - mac_epoch).total_seconds()

        # NOTE: crdate should be in local time, but that's system dependent
        #       (so doing so is ridiculous, and nothing could rely on it).
        b.write(struct.pack(b'>h28pI2shI64pII4s4shhI2s10s',
                            self.target.kind,
                            carbon_volname, int(voldate),
                            self.volume.fs_type,
                            self.volume.disk_type,
                            self.target.folder_cnid,
                            carbon_filename,
                            self.target.cnid,
                            int(crdate),
                            self.target.creator_code,
                            self.target.type_code,
                            self.target.levels_from,
                            self.target.levels_to,
                            self.volume.attribute_flags,
                            self.volume.fs_id,
                            b'\0'*10))

        # Excuse the odd order; we're copying Finder
        if self.target.folder_name:
            carbon_foldername = encode_utf8(self.target.folder_name)\
                                .replace(b':',b'/')
            b.write(struct.pack(b'>hh', TAG_CARBON_FOLDER_NAME,
                                len(carbon_foldername)))
            b.write(carbon_foldername)
            if len(carbon_foldername) & 1:
                b.write(b'\0')

        b.write(struct.pack(b'>hhQhhQ',
                TAG_HIGH_RES_VOLUME_CREATION_DATE,
                8, long(voldate * 65536),
                TAG_HIGH_RES_CREATION_DATE,
                8, long(crdate * 65536)))

        if self.target.cnid_path:
            cnid_path = struct.pack(b'>%uI' % len(self.target.cnid_path),
                                    *self.target.cnid_path)
            b.write(struct.pack(b'>hh', TAG_CNID_PATH,
                                 len(cnid_path)))
            b.write(cnid_path)

        if self.target.carbon_path:
            carbon_path=encode_utf8(self.target.carbon_path)
            b.write(struct.pack(b'>hh', TAG_CARBON_PATH,
                                 len(carbon_path)))
            b.write(carbon_path)
            if len(carbon_path) & 1:
                b.write(b'\0')

        if self.volume.appleshare_info:
            ai = self.volume.appleshare_info
            if ai.zone:
                b.write(struct.pack(b'>hh', TAG_APPLESHARE_ZONE,
                                     len(ai.zone)))
                b.write(ai.zone)
                if len(ai.zone) & 1:
                    b.write(b'\0')
            if ai.server:
                b.write(struct.pack(b'>hh', TAG_APPLESHARE_SERVER_NAME,
                                     len(ai.server)))
                b.write(ai.server)
                if len(ai.server) & 1:
                    b.write(b'\0')
            if ai.username:
                b.write(struct.pack(b'>hh', TAG_APPLESHARE_USERNAME,
                                     len(ai.username)))
                b.write(ai.username)
                if len(ai.username) & 1:
                    b.write(b'\0')

        if self.volume.driver_name:
            driver_name = encode_utf8(self.volume.driver_name)
            b.write(struct.pack(b'>hh', TAG_DRIVER_NAME,
                                len(driver_name)))
            b.write(driver_name)
            if len(driver_name) & 1:
                b.write(b'\0')

        if self.volume.network_mount_info:
            b.write(struct.pack(b'>hh', TAG_NETWORK_MOUNT_INFO,
                                len(self.volume.network_mount_info)))
            b.write(self.volume.network_mount_info)
            if len(self.volume.network_mount_info) & 1:
                b.write(b'\0')

        if self.volume.dialup_info:
            b.write(struct.pack(b'>hh', TAG_DIALUP_INFO,
                                len(self.volume.network_mount_info)))
            b.write(self.volume.network_mount_info)
            if len(self.volume.network_mount_info) & 1:
                b.write(b'\0')

        utf16 = decode_utf8(self.target.filename)\
                .replace(':','/').encode('utf-16-be')
        b.write(struct.pack(b'>hhh', TAG_UNICODE_FILENAME,
                            len(utf16) + 2,
                            len(utf16) // 2))
        b.write(utf16)

        utf16 = decode_utf8(self.volume.name)\
                .replace(':','/').encode('utf-16-be')
        b.write(struct.pack(b'>hhh', TAG_UNICODE_VOLUME_NAME,
                            len(utf16) + 2,
                            len(utf16) // 2))
        b.write(utf16)

        if self.target.posix_path:
            posix_path = encode_utf8(self.target.posix_path)
            b.write(struct.pack(b'>hh', TAG_POSIX_PATH,
                                len(posix_path)))
            b.write(posix_path)
            if len(posix_path) & 1:
                b.write(b'\0')

        if self.volume.posix_path:
            posix_path = encode_utf8(self.volume.posix_path)
            b.write(struct.pack(b'>hh', TAG_POSIX_PATH_TO_MOUNTPOINT,
                                len(posix_path)))
            b.write(posix_path)
            if len(posix_path) & 1:
                b.write(b'\0')

        if self.volume.disk_image_alias:
            d = self.volume.disk_image_alias.to_bytes()
            b.write(struct.pack(b'>hh', TAG_RECURSIVE_ALIAS_OF_DISK_IMAGE,
                                len(d)))
            b.write(d)
            if len(d) & 1:
                b.write(b'\0')

        if self.target.user_home_prefix_len is not None:
            b.write(struct.pack(b'>hhh', TAG_USER_HOME_LENGTH_PREFIX,
                                2, self.target.user_home_prefix_len))

        for t,v in self.extra:
            b.write(struct.pack(b'>hh', t, len(v)))
            b.write(v)
            if len(v) & 1:
                b.write(b'\0')

        b.write(struct.pack(b'>hh', -1, 0))
        
        blen = b.tell() - pos
        b.seek(pos + 4, os.SEEK_SET)
        b.write(struct.pack(b'>h', blen))

    def to_bytes(self):
        """Returns the binary representation for this :class:`Alias`."""
        with io.BytesIO() as b:
            self._to_fd(b)
            return b.getvalue()

    def __str__(self):
        return '<Alias target=%s>' % self.target.filename

    def __repr__(self):
        values = []
        if self.appinfo != b'\0\0\0\0':
            values.append('appinfo=%r' % self.appinfo)
        if self.version != 2:
            values.append('version=%r' % self.version)
        if self.volume is not None:
            values.append('volume=%r' % self.volume)
        if self.target is not None:
            values.append('target=%r' % self.target)
        if self.extra:
            values.append('extra=%r' % self.extra)
        return 'Alias(%s)' % ','.join(values)
# -*- coding: utf-8 -*-
#
#  This file implements the Apple "bookmark" format, which is the replacement
#  for the old-fashioned alias format.  The details of this format were
#  reverse engineered; some things are still not entirely clear.
#
from __future__ import unicode_literals, print_function

import struct
import uuid
import datetime
import os
import sys
import pprint

try:
    from urlparse import urljoin
except ImportError:
    from urllib.parse import urljoin

if sys.platform == 'darwin':
    from . import osx

def iteritems(x):
    return x.iteritems()

try:
    unicode
except NameError:
    unicode = str
    long = int
    xrange = range
    def iteritems(x):
        return x.items()

from .utils import *

BMK_DATA_TYPE_MASK    = 0xffffff00
BMK_DATA_SUBTYPE_MASK = 0x000000ff

BMK_STRING  = 0x0100
BMK_DATA    = 0x0200
BMK_NUMBER  = 0x0300
BMK_DATE    = 0x0400
BMK_BOOLEAN = 0x0500
BMK_ARRAY   = 0x0600
BMK_DICT    = 0x0700
BMK_UUID    = 0x0800
BMK_URL     = 0x0900
BMK_NULL    = 0x0a00

BMK_ST_ZERO = 0x0000
BMK_ST_ONE  = 0x0001

BMK_BOOLEAN_ST_FALSE = 0x0000
BMK_BOOLEAN_ST_TRUE  = 0x0001

# Subtypes for BMK_NUMBER are really CFNumberType values
kCFNumberSInt8Type = 1
kCFNumberSInt16Type = 2
kCFNumberSInt32Type = 3
kCFNumberSInt64Type = 4
kCFNumberFloat32Type = 5
kCFNumberFloat64Type = 6
kCFNumberCharType = 7
kCFNumberShortType = 8
kCFNumberIntType = 9
kCFNumberLongType = 10
kCFNumberLongLongType = 11
kCFNumberFloatType = 12
kCFNumberDoubleType = 13
kCFNumberCFIndexType = 14
kCFNumberNSIntegerType = 15
kCFNumberCGFloatType = 16

# Resource property flags (from CFURLPriv.h)
kCFURLResourceIsRegularFile      = 0x00000001
kCFURLResourceIsDirectory        = 0x00000002
kCFURLResourceIsSymbolicLink     = 0x00000004
kCFURLResourceIsVolume           = 0x00000008
kCFURLResourceIsPackage          = 0x00000010
kCFURLResourceIsSystemImmutable  = 0x00000020
kCFURLResourceIsUserImmutable    = 0x00000040
kCFURLResourceIsHidden           = 0x00000080
kCFURLResourceHasHiddenExtension = 0x00000100
kCFURLResourceIsApplication      = 0x00000200
kCFURLResourceIsCompressed       = 0x00000400
kCFURLResourceIsSystemCompressed = 0x00000400
kCFURLCanSetHiddenExtension      = 0x00000800
kCFURLResourceIsReadable         = 0x00001000
kCFURLResourceIsWriteable        = 0x00002000
kCFURLResourceIsExecutable       = 0x00004000
kCFURLIsAliasFile                = 0x00008000
kCFURLIsMountTrigger             = 0x00010000

# Volume property flags (from CFURLPriv.h)
kCFURLVolumeIsLocal                         =                0x1 #
kCFURLVolumeIsAutomount                     =                0x2 #
kCFURLVolumeDontBrowse                      =                0x4 #
kCFURLVolumeIsReadOnly                      =                0x8 #
kCFURLVolumeIsQuarantined                   =               0x10
kCFURLVolumeIsEjectable                     =               0x20 #
kCFURLVolumeIsRemovable                     =               0x40 #
kCFURLVolumeIsInternal                      =               0x80 #
kCFURLVolumeIsExternal                      =              0x100 #
kCFURLVolumeIsDiskImage                     =              0x200 #
kCFURLVolumeIsFileVault                     =              0x400
kCFURLVolumeIsLocaliDiskMirror              =              0x800
kCFURLVolumeIsiPod                          =             0x1000 #
kCFURLVolumeIsiDisk                         =             0x2000
kCFURLVolumeIsCD                            =             0x4000
kCFURLVolumeIsDVD                           =             0x8000
kCFURLVolumeIsDeviceFileSystem              =            0x10000
kCFURLVolumeSupportsPersistentIDs           =        0x100000000
kCFURLVolumeSupportsSearchFS                =        0x200000000
kCFURLVolumeSupportsExchange                =        0x400000000
# reserved                                           0x800000000
kCFURLVolumeSupportsSymbolicLinks           =       0x1000000000
kCFURLVolumeSupportsDenyModes               =       0x2000000000
kCFURLVolumeSupportsCopyFile                =       0x4000000000
kCFURLVolumeSupportsReadDirAttr             =       0x8000000000
kCFURLVolumeSupportsJournaling              =      0x10000000000
kCFURLVolumeSupportsRename                  =      0x20000000000
kCFURLVolumeSupportsFastStatFS              =      0x40000000000
kCFURLVolumeSupportsCaseSensitiveNames      =      0x80000000000
kCFURLVolumeSupportsCasePreservedNames      =     0x100000000000
kCFURLVolumeSupportsFLock                   =     0x200000000000
kCFURLVolumeHasNoRootDirectoryTimes         =     0x400000000000
kCFURLVolumeSupportsExtendedSecurity        =     0x800000000000
kCFURLVolumeSupports2TBFileSize             =    0x1000000000000
kCFURLVolumeSupportsHardLinks               =    0x2000000000000
kCFURLVolumeSupportsMandatoryByteRangeLocks =    0x4000000000000
kCFURLVolumeSupportsPathFromID              =    0x8000000000000
# reserved                                      0x10000000000000
kCFURLVolumeIsJournaling                    =   0x20000000000000
kCFURLVolumeSupportsSparseFiles             =   0x40000000000000
kCFURLVolumeSupportsZeroRuns                =   0x80000000000000
kCFURLVolumeSupportsVolumeSizes             =  0x100000000000000
kCFURLVolumeSupportsRemoteEvents            =  0x200000000000000
kCFURLVolumeSupportsHiddenFiles             =  0x400000000000000
kCFURLVolumeSupportsDecmpFSCompression      =  0x800000000000000
kCFURLVolumeHas64BitObjectIDs               = 0x1000000000000000
kCFURLVolumePropertyFlagsAll                = 0xffffffffffffffff

BMK_URL_ST_ABSOLUTE = 0x0001
BMK_URL_ST_RELATIVE = 0x0002

# Bookmark keys
#                           = 0x1003
kBookmarkPath               = 0x1004   # Array of path components
kBookmarkCNIDPath           = 0x1005   # Array of CNIDs
kBookmarkFileProperties     = 0x1010   # (CFURL rp flags,
                                       #  CFURL rp flags asked for,
                                       #  8 bytes NULL)
kBookmarkFileName           = 0x1020
kBookmarkFileID             = 0x1030
kBookmarkFileCreationDate   = 0x1040
#                           = 0x1054   # ?
#                           = 0x1055   # ?
#                           = 0x1056   # ?
#                           = 0x1101   # ?
#                           = 0x1102   #Â ?
kBookmarkTOCPath            = 0x2000   # A list of (TOC id, ?) pairs
kBookmarkVolumePath         = 0x2002
kBookmarkVolumeURL          = 0x2005
kBookmarkVolumeName         = 0x2010
kBookmarkVolumeUUID         = 0x2011   # Stored (perversely) as a string
kBookmarkVolumeSize         = 0x2012
kBookmarkVolumeCreationDate = 0x2013
kBookmarkVolumeProperties   = 0x2020   # (CFURL vp flags,
                                       #  CFURL vp flags asked for,
                                       #  8 bytes NULL)
kBookmarkVolumeIsRoot       = 0x2030   # True if volume is FS root
kBookmarkVolumeBookmark     = 0x2040   # Embedded bookmark for disk image (TOC id)
kBookmarkVolumeMountPoint   = 0x2050   # A URL
#                           = 0x2070
kBookmarkContainingFolder   = 0xc001   # Index of containing folder in path
kBookmarkUserName           = 0xc011   # User that created bookmark
kBookmarkUID                = 0xc012   # UID that created bookmark
kBookmarkWasFileReference   = 0xd001   # True if the URL was a file reference
kBookmarkCreationOptions    = 0xd010
kBookmarkURLLengths         = 0xe003   # See below
#                           = 0xf017   # Localized name?
#                           = 0xf022
kBookmarkSecurityExtension  = 0xf080
#                           = 0xf081

# kBookmarkURLLengths is an array that is set if the URL encoded by the
# bookmark had a base URL; in that case, each entry is the length of the
# base URL in question.  Thus a URL
#
#     file:///foo/bar/baz    blam/blat.html
#
# will result in [3, 2], while the URL
#
#     file:///foo    bar/baz    blam    blat.html
#
# would result in [1, 2, 1, 1]


class Data (object):
    def __init__(self, bytedata=None):
        #: The bytes, stored as a byte string
        self.bytes = bytes(bytedata)

    def __repr__(self):
        return 'Data(%r)' % self.bytes

class URL (object):
    def __init__(self, base, rel=None):
        if rel is not None:
            #: The base URL, if any (a :class:`URL`)
            self.base = base
            #: The rest of the URL (a string)
            self.relative = rel
        else:
            self.base = None
            self.relative = base

    @property
    def absolute(self):
        """Return an absolute URL."""
        if self.base is None:
            return self.relative
        else:
            base_abs = self.base.absolute
            return urljoin(self.base.absolute, self.relative)

    def __repr__(self):
        return 'URL(%r)' % self.absolute

class Bookmark (object):
    def __init__(self, tocs=None):
        if tocs is None:
            #: The TOCs for this Bookmark
            self.tocs = []
        else:
            self.tocs = tocs

    @classmethod
    def _get_item(cls, data, hdrsize, offset):
        offset += hdrsize
        if offset > len(data) - 8:
            raise ValueError('Offset out of range')

        length,typecode = struct.unpack(b'<II', data[offset:offset+8])

        if len(data) - offset < 8 + length:
            raise ValueError('Data item truncated')

        databytes = data[offset+8:offset+8+length]

        dsubtype = typecode & BMK_DATA_SUBTYPE_MASK
        dtype = typecode & BMK_DATA_TYPE_MASK

        if dtype == BMK_STRING:
            return databytes.decode('utf-8')
        elif dtype == BMK_DATA:
            return Data(databytes)
        elif dtype == BMK_NUMBER:
            if dsubtype == kCFNumberSInt8Type:
                return ord(databytes[0])
            elif dsubtype == kCFNumberSInt16Type:
                return struct.unpack(b'<h', databytes)[0]
            elif dsubtype == kCFNumberSInt32Type:
                return struct.unpack(b'<i', databytes)[0]
            elif dsubtype == kCFNumberSInt64Type:
                return struct.unpack(b'<q', databytes)[0]
            elif dsubtype == kCFNumberFloat32Type:
                return struct.unpack(b'<f', databytes)[0]
            elif dsubtype == kCFNumberFloat64Type:
                return struct.unpack(b'<d', databytes)[0]
        elif dtype == BMK_DATE:
            # Yes, dates really are stored as *BIG-endian* doubles; everything
            # else is little-endian
            secs = datetime.timedelta(seconds=struct.unpack(b'>d', databytes)[0])
            return osx_epoch + secs
        elif dtype == BMK_BOOLEAN:
            if dsubtype == BMK_BOOLEAN_ST_TRUE:
                return True
            elif dsubtype == BMK_BOOLEAN_ST_FALSE:
                return False
        elif dtype == BMK_UUID:
            return uuid.UUID(bytes=databytes)
        elif dtype == BMK_URL:
            if dsubtype == BMK_URL_ST_ABSOLUTE:
                return URL(databytes.decode('utf-8'))
            elif dsubtype == BMK_URL_ST_RELATIVE:
                baseoff,reloff = struct.unpack(b'<II', databytes)
                base = cls._get_item(data, hdrsize, baseoff)
                rel = cls._get_item(data, hdrsize, reloff)
                return URL(base, rel)
        elif dtype == BMK_ARRAY:
            result = []
            for aoff in xrange(offset+8,offset+8+length,4):
                eltoff, = struct.unpack(b'<I', data[aoff:aoff+4])
                result.append(cls._get_item(data, hdrsize, eltoff))
            return result
        elif dtype == BMK_DICT:
            result = {}
            for eoff in xrange(offset+8,offset+8+length,8):
                keyoff,valoff = struct.unpack(b'<II', data[eoff:eoff+8])
                key = cls._get_item(data, hdrsize, keyoff)
                val = cls._get_item(data, hdrsize, valoff)
                result[key] = val
            return result
        elif dtype == BMK_NULL:
            return None

        print('Unknown data type %08x' % typecode)
        return (typecode, databytes)

    @classmethod
    def from_bytes(cls, data):
        """Create a :class:`Bookmark` given byte data."""

        if len(data) < 16:
            raise ValueError('Not a bookmark file (too short)')

        if isinstance(data, bytearray):
            data = bytes(data)

        magic,size,dummy,hdrsize = struct.unpack(b'<4sIII', data[0:16])

        if magic != b'book':
            raise ValueError('Not a bookmark file (bad magic) %r' % magic)

        if hdrsize < 16:
            raise ValueError('Not a bookmark file (header size too short)')

        if hdrsize > size:
            raise ValueError('Not a bookmark file (header size too large)')

        if size != len(data):
            raise ValueError('Not a bookmark file (truncated)')

        tocoffset, = struct.unpack(b'<I', data[hdrsize:hdrsize+4])

        tocs = []

        while tocoffset != 0:
            tocbase = hdrsize + tocoffset
            if tocoffset > size - hdrsize \
              or size - tocbase < 20:
                raise ValueError('TOC offset out of range')

            tocsize,tocmagic,tocid,nexttoc,toccount \
                = struct.unpack(b'<IIIII',
                                data[tocbase:tocbase+20])

            if tocmagic != 0xfffffffe:
                break

            tocsize += 8

            if size - tocbase < tocsize:
                raise ValueError('TOC truncated')

            if tocsize < 12 * toccount:
                raise ValueError('TOC entries overrun TOC size')

            toc = {}
            for n in xrange(0,toccount):
                ebase = tocbase + 20 + 12 * n
                eid,eoffset,edummy = struct.unpack(b'<III',
                                                   data[ebase:ebase+12])

                if eid & 0x80000000:
                    eid = cls._get_item(data, hdrsize, eid & 0x7fffffff)

                toc[eid] = cls._get_item(data, hdrsize, eoffset)

            tocs.append((tocid, toc))

            tocoffset = nexttoc

        return cls(tocs)

    def __getitem__(self, key):
        for tid,toc in self.tocs:
            if key in toc:
                return toc[key]
        raise KeyError('Key not found')

    def __setitem__(self, key, value):
        if len(self.tocs) == 0:
            self.tocs = [(1, {})]
        self.tocs[0][1][key] = value

    def get(self, key, default=None):
        """Lookup the value for a given key, returning a default if not
        present."""
        for tid,toc in self.tocs:
            if key in toc:
                return toc[key]
        return default

    @classmethod
    def _encode_item(cls, item, offset):
        if item is True:
            result = struct.pack(b'<II', 0, BMK_BOOLEAN | BMK_BOOLEAN_ST_TRUE)
        elif item is False:
            result = struct.pack(b'<II', 0, BMK_BOOLEAN | BMK_BOOLEAN_ST_FALSE)
        elif isinstance(item, unicode):
            encoded = item.encode('utf-8')
            result = (struct.pack(b'<II', len(encoded), BMK_STRING | BMK_ST_ONE)
                      + encoded)
        elif isinstance(item, bytes):
            result = (struct.pack(b'<II', len(item), BMK_STRING | BMK_ST_ONE)
                      + item)
        elif isinstance(item, Data):
            result = (struct.pack(b'<II', len(item.bytes),
                                  BMK_DATA | BMK_ST_ONE)
                      + bytes(item.bytes))
        elif isinstance(item, bytearray):
            result = (struct.pack(b'<II', len(item),
                                  BMK_DATA | BMK_ST_ONE)
                      + bytes(item))
        elif isinstance(item, int) or isinstance(item, long):
            if item > -0x80000000 and item < 0x7fffffff:
                result = struct.pack(b'<IIi', 4,
                                     BMK_NUMBER | kCFNumberSInt32Type, item)
            else:
                result = struct.pack(b'<IIq', 8,
                                     BMK_NUMBER | kCFNumberSInt64Type, item)
        elif isinstance(item, float):
            result = struct.pack(b'<IId', 8,
                                 BMK_NUMBER | kCFNumberFloat64Type, item)
        elif isinstance(item, datetime.datetime):
            secs = item - osx_epoch
            result = struct.pack(b'<II', 8, BMK_DATE | BMK_ST_ZERO) \
                     + struct.pack(b'>d', float(secs.total_seconds()))
        elif isinstance(item, uuid.UUID):
            result = struct.pack(b'<II', 16, BMK_UUID | BMK_ST_ONE) \
                     + item.bytes
        elif isinstance(item, URL):
            if item.base:
                baseoff = offset + 16
                reloff, baseenc = cls._encode_item(item.base, baseoff)
                xoffset, relenc = cls._encode_item(item.relative, reloff)
                result = b''.join([
                    struct.pack(b'<IIII', 8, BMK_URL | BMK_URL_ST_RELATIVE,
                                baseoff, reloff),
                    baseenc,
                    relenc])
            else:
                encoded = item.relative.encode('utf-8')
                result = struct.pack(b'<II', len(encoded),
                                     BMK_URL | BMK_URL_ST_ABSOLUTE) + encoded
        elif isinstance(item, list):
            ioffset = offset + 8 + len(item) * 4
            result = [struct.pack(b'<II', len(item) * 4, BMK_ARRAY | BMK_ST_ONE)]
            enc = []
            for elt in item:
                result.append(struct.pack(b'<I', ioffset))
                ioffset, ienc = cls._encode_item(elt, ioffset)
                enc.append(ienc)
            result = b''.join(result + enc)
        elif isinstance(item, dict):
            ioffset = offset + 8 + len(item) * 8
            result = [struct.pack(b'<II', len(item) * 8, BMK_DICT | BMK_ST_ONE)]
            enc = []
            for k,v in iteritems(item):
                result.append(struct.pack(b'<I', ioffset))
                ioffset, ienc = cls._encode_item(k, ioffset)
                enc.append(ienc)
                result.append(struct.pack(b'<I', ioffset))
                ioffset, ienc = cls._encode_item(v, ioffset)
                enc.append(ienc)
            result = b''.join(result + enc)
        elif item is None:
            result = struct.pack(b'<II', 0, BMK_NULL | BMK_ST_ONE)
        else:
            raise ValueError('Unknown item type when encoding: %s' % item)

        offset += len(result)

        # Pad to a multiple of 4 bytes
        if offset & 3:
            extra = 4 - (offset & 3)
            result += b'\0' * extra
            offset += extra

        return (offset, result)

    def to_bytes(self):
        """Convert this :class:`Bookmark` to a byte representation."""

        result = []
        tocs = []
        offset = 4  # For the offset to the first TOC

        # Generate the data and build the TOCs
        for tid,toc in self.tocs:
            entries = []

            for k,v in iteritems(toc):
                if isinstance(k, (str, unicode)):
                    noffset = offset
                    voffset, enc = self._encode_item(k, offset)
                    result.append(enc)
                    offset, enc = self._encode_item(v, voffset)
                    result.append(enc)
                    entries.append((noffset | 0x80000000, voffset))
                else:
                    entries.append((k, offset))
                    offset, enc = self._encode_item(v, offset)
                    result.append(enc)

            # TOC entries must be sorted - CoreServicesInternal does a
            # binary search to find data
            entries.sort()

            tocs.append((tid, b''.join([struct.pack(b'<III',k,o,0)
                                        for k,o in entries])))

        first_toc_offset = offset

        # Now generate the TOC headers
        for ndx,toc in enumerate(tocs):
            tid, data = toc
            if ndx == len(tocs) - 1:
                next_offset = 0
            else:
                next_offset = offset + 20 + len(data)

            result.append(struct.pack(b'<IIIII', len(data) - 8,
                                      0xfffffffe,
                                      tid,
                                      next_offset,
                                      len(data) // 12))
            result.append(data)

            offset += 20 + len(data)

        # Finally, add the header (and the first TOC offset, which isn't part
        # of the header, but goes just after it)
        header = struct.pack(b'<4sIIIQQQQI', b'book',
                             offset + 48,
                             0x10040000,
                             48,
                             0, 0, 0, 0, first_toc_offset)

        result.insert(0, header)

        return b''.join(result)

    @classmethod
    def for_file(cls, path):
        """Construct a :class:`Bookmark` for a given file."""

        # Find the filesystem
        st = osx.statfs(path)
        vol_path = st.f_mntonname.decode('utf-8')

        # Grab its attributes
        attrs = [osx.ATTR_CMN_CRTIME,
                 osx.ATTR_VOL_SIZE
                 | osx.ATTR_VOL_NAME
                 | osx.ATTR_VOL_UUID,
                 0, 0, 0]
        volinfo = osx.getattrlist(vol_path, attrs, 0)

        vol_crtime = volinfo[0]
        vol_size = volinfo[1]
        vol_name = volinfo[2]
        vol_uuid = volinfo[3]

        # Also grab various attributes of the file
        attrs = [(osx.ATTR_CMN_OBJTYPE
                  | osx.ATTR_CMN_CRTIME
                  | osx.ATTR_CMN_FILEID), 0, 0, 0, 0]
        info = osx.getattrlist(path, attrs, osx.FSOPT_NOFOLLOW)

        cnid = info[2]
        crtime = info[1]

        if info[0] == osx.VREG:
            flags = kCFURLResourceIsRegularFile
        elif info[0] == osx.VDIR:
            flags = kCFURLResourceIsDirectory
        elif info[0] == osx.VLNK:
            flags = kCFURLResourceIsSymbolicLink
        else:
            flags = kCFURLResourceIsRegularFile

        dirname, filename = os.path.split(path)

        relcount = 0
        if not os.path.isabs(dirname):
            curdir = os.getcwd()
            head, tail = os.path.split(curdir)
            relcount = 0
            while head and tail:
                relcount += 1
                head, tail = os.path.split(head)
            dirname = os.path.join(curdir, dirname)

        foldername = os.path.basename(dirname)

        rel_path = os.path.relpath(path, vol_path)

        # Build the path arrays
        name_path = []
        cnid_path = []
        head, tail = os.path.split(rel_path)
        if not tail:
            head, tail = os.path.split(head)
        while head or tail:
            if head:
                attrs = [osx.ATTR_CMN_FILEID, 0, 0, 0, 0]
                info = osx.getattrlist(os.path.join(vol_path, head), attrs, 0)
                cnid_path.insert(0, info[0])
                head, tail = os.path.split(head)
                name_path.insert(0, tail)
            else:
                head, tail = os.path.split(head)
        name_path.append(filename)
        cnid_path.append(cnid)

        url_lengths = [relcount, len(name_path) - relcount]

        fileprops = Data(struct.pack(b'<QQQ', flags, 0x0f, 0))
        volprops = Data(struct.pack(b'<QQQ', 0x81 | kCFURLVolumeSupportsPersistentIDs,
                                    0x13ef | kCFURLVolumeSupportsPersistentIDs, 0))

        toc = {
            kBookmarkPath: name_path,
            kBookmarkCNIDPath: cnid_path,
            kBookmarkFileCreationDate: crtime,
            kBookmarkFileProperties: fileprops,
            kBookmarkContainingFolder: len(name_path) - 2,
            kBookmarkVolumePath: vol_path,
            kBookmarkVolumeIsRoot: vol_path == '/',
            kBookmarkVolumeURL: URL('file://' + vol_path),
            kBookmarkVolumeName: vol_name,
            kBookmarkVolumeSize: vol_size,
            kBookmarkVolumeCreationDate: vol_crtime,
            kBookmarkVolumeUUID: str(vol_uuid).upper(),
            kBookmarkVolumeProperties: volprops,
            kBookmarkCreationOptions: 512,
            kBookmarkWasFileReference: True,
            kBookmarkUserName: 'unknown',
            kBookmarkUID: 99,
        }

        if relcount:
            toc[kBookmarkURLLengths] = url_lengths

        return Bookmark([(1, toc)])

    def __repr__(self):
        result = ['Bookmark([']
        for tid,toc in self.tocs:
            result.append('(0x%x, {\n' % tid)
            for k,v in iteritems(toc):
                if isinstance(k, (str, unicode)):
                    kf = repr(k)
                else:
                    kf = '0x%04x' % k
                result.append('  %s: %r\n' % (kf, v))
            result.append('}),\n')
        result.append('])')

        return ''.join(result)
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from ctypes import *
import struct
import os
import datetime
import uuid

from .utils import *

libc = cdll.LoadLibrary('/usr/lib/libc.dylib')

# Constants
FSOPT_NOFOLLOW         = 0x00000001
FSOPT_NOINMEMUPDATE    = 0x00000002
FSOPT_REPORT_FULLSIZE  = 0x00000004
FSOPT_PACK_INVAL_ATTRS = 0x00000008

VOL_CAPABILITIES_FORMAT     = 0
VOL_CAPABILITIES_INTERFACES = 1

VOL_CAP_FMT_PERSISTENTOBJECTIDS       = 0x00000001
VOL_CAP_FMT_SYMBOLICLINKS             = 0x00000002
VOL_CAP_FMT_HARDLINKS                 = 0x00000004
VOL_CAP_FMT_JOURNAL                   = 0x00000008
VOL_CAP_FMT_JOURNAL_ACTIVE            = 0x00000010
VOL_CAP_FMT_NO_ROOT_TIMES             = 0x00000020
VOL_CAP_FMT_SPARSE_FILES              = 0x00000040
VOL_CAP_FMT_ZERO_RUNS                 = 0x00000080
VOL_CAP_FMT_CASE_SENSITIVE            = 0x00000100
VOL_CAP_FMT_CASE_PRESERVING           = 0x00000200
VOL_CAP_FMT_FAST_STATFS               = 0x00000400
VOL_CAP_FMT_2TB_FILESIZE              = 0x00000800
VOL_CAP_FMT_OPENDENYMODES             = 0x00001000
VOL_CAP_FMT_HIDDEN_FILES              = 0x00002000
VOL_CAP_FMT_PATH_FROM_ID              = 0x00004000
VOL_CAP_FMT_NO_VOLUME_SIZES           = 0x00008000
VOL_CAP_FMT_DECMPFS_COMPRESSION       = 0x00010000
VOL_CAP_FMT_64BIT_OBJECT_IDS          = 0x00020000

VOL_CAP_INT_SEARCHFS                  = 0x00000001
VOL_CAP_INT_ATTRLIST                  = 0x00000002
VOL_CAP_INT_NFSEXPORT                 = 0x00000004
VOL_CAP_INT_READDIRATTR               = 0x00000008
VOL_CAP_INT_EXCHANGEDATA              = 0x00000010
VOL_CAP_INT_COPYFILE                  = 0x00000020
VOL_CAP_INT_ALLOCATE                  = 0x00000040
VOL_CAP_INT_VOL_RENAME                = 0x00000080
VOL_CAP_INT_ADVLOCK                   = 0x00000100
VOL_CAP_INT_FLOCK                     = 0x00000200
VOL_CAP_INT_EXTENDED_SECURITY         = 0x00000400
VOL_CAP_INT_USERACCESS                = 0x00000800
VOL_CAP_INT_MANLOCK                   = 0x00001000
VOL_CAP_INT_NAMEDSTREAMS              = 0x00002000
VOL_CAP_INT_EXTENDED_ATTR             = 0x00004000

ATTR_CMN_NAME                         = 0x00000001
ATTR_CMN_DEVID                        = 0x00000002
ATTR_CMN_FSID                         = 0x00000004
ATTR_CMN_OBJTYPE                      = 0x00000008
ATTR_CMN_OBJTAG                       = 0x00000010
ATTR_CMN_OBJID                        = 0x00000020
ATTR_CMN_OBJPERMANENTID               = 0x00000040
ATTR_CMN_PAROBJID                     = 0x00000080
ATTR_CMN_SCRIPT                       = 0x00000100
ATTR_CMN_CRTIME                       = 0x00000200
ATTR_CMN_MODTIME                      = 0x00000400
ATTR_CMN_CHGTIME                      = 0x00000800
ATTR_CMN_ACCTIME                      = 0x00001000
ATTR_CMN_BKUPTIME                     = 0x00002000
ATTR_CMN_FNDRINFO                     = 0x00004000
ATTR_CMN_OWNERID                      = 0x00008000
ATTR_CMN_GRPID                        = 0x00010000
ATTR_CMN_ACCESSMASK                   = 0x00020000
ATTR_CMN_FLAGS                        = 0x00040000
ATTR_CMN_USERACCESS                   = 0x00200000
ATTR_CMN_EXTENDED_SECURITY            = 0x00400000
ATTR_CMN_UUID                         = 0x00800000
ATTR_CMN_GRPUUID                      = 0x01000000
ATTR_CMN_FILEID                       = 0x02000000
ATTR_CMN_PARENTID                     = 0x04000000
ATTR_CMN_FULLPATH                     = 0x08000000
ATTR_CMN_ADDEDTIME                    = 0x10000000
ATTR_CMN_RETURNED_ATTRS               = 0x80000000
ATTR_CMN_ALL_ATTRS                    = 0x9fe7ffff

ATTR_VOL_FSTYPE				          = 0x00000001
ATTR_VOL_SIGNATURE			          = 0x00000002
ATTR_VOL_SIZE				          = 0x00000004
ATTR_VOL_SPACEFREE			          = 0x00000008
ATTR_VOL_SPACEAVAIL			          = 0x00000010
ATTR_VOL_MINALLOCATION			      = 0x00000020
ATTR_VOL_ALLOCATIONCLUMP		      = 0x00000040
ATTR_VOL_IOBLOCKSIZE			      = 0x00000080
ATTR_VOL_OBJCOUNT			          = 0x00000100
ATTR_VOL_FILECOUNT			          = 0x00000200
ATTR_VOL_DIRCOUNT			          = 0x00000400
ATTR_VOL_MAXOBJCOUNT			      = 0x00000800
ATTR_VOL_MOUNTPOINT			          = 0x00001000
ATTR_VOL_NAME				          = 0x00002000
ATTR_VOL_MOUNTFLAGS			          = 0x00004000
ATTR_VOL_MOUNTEDDEVICE			      = 0x00008000
ATTR_VOL_ENCODINGSUSED			      = 0x00010000
ATTR_VOL_CAPABILITIES			      = 0x00020000
ATTR_VOL_UUID				          = 0x00040000
ATTR_VOL_ATTRIBUTES			          = 0x40000000
ATTR_VOL_INFO				          = 0x80000000
ATTR_VOL_ALL_ATTRS                    = 0xc007ffff

ATTR_DIR_LINKCOUNT			          = 0x00000001
ATTR_DIR_ENTRYCOUNT			          = 0x00000002
ATTR_DIR_MOUNTSTATUS			      = 0x00000004
DIR_MNTSTATUS_MNTPOINT		          = 0x00000001
DIR_MNTSTATUS_TRIGGER			      = 0x00000002
ATTR_DIR_ALL_ATTRS                    = 0x00000007

ATTR_FILE_LINKCOUNT			          = 0x00000001
ATTR_FILE_TOTALSIZE			          = 0x00000002
ATTR_FILE_ALLOCSIZE			          = 0x00000004
ATTR_FILE_IOBLOCKSIZE			      = 0x00000008
ATTR_FILE_DEVTYPE			          = 0x00000020
ATTR_FILE_DATALENGTH			      = 0x00000200
ATTR_FILE_DATAALLOCSIZE			      = 0x00000400
ATTR_FILE_RSRCLENGTH			      = 0x00001000
ATTR_FILE_RSRCALLOCSIZE			      = 0x00002000

ATTR_FILE_ALL_ATTRS                   = 0x0000362f

ATTR_FORK_TOTALSIZE			          = 0x00000001
ATTR_FORK_ALLOCSIZE			          = 0x00000002
ATTR_FORK_ALL_ATTRS                   = 0x00000003

# These can't be used
ATTR_FILE_FORKCOUNT			          = 0x00000080
ATTR_FILE_FORKLIST			          = 0x00000100
ATTR_CMN_NAMEDATTRCOUNT			      = 0x00080000
ATTR_CMN_NAMEDATTRLIST			      = 0x00100000
ATTR_FILE_DATAEXTENTS			      = 0x00000800
ATTR_FILE_RSRCEXTENTS			      = 0x00004000
ATTR_FILE_CLUMPSIZE			          = 0x00000010
ATTR_FILE_FILETYPE			          = 0x00000040

class attrlist(Structure):
    _fields_ = [('bitmapcount', c_ushort),
                ('reserved', c_ushort),
                ('commonattr', c_uint),
                ('volattr', c_uint),
                ('dirattr', c_uint),
                ('fileattr', c_uint),
                ('forkattr', c_uint)]

class attribute_set_t(Structure):
    _fields_ = [('commonattr', c_uint),
                ('volattr', c_uint),
                ('dirattr', c_uint),
                ('fileattr', c_uint),
                ('forkattr', c_uint)]

class fsobj_id_t(Structure):
    _fields_ = [('fid_objno', c_uint),
                ('fid_generation', c_uint)]

class timespec(Structure):
    _fields_ = [('tv_sec', c_long),
                ('tv_nsec', c_long)]

class attrreference_t(Structure):
    _fields_ = [('attr_dataoffset', c_int),
                ('attr_length', c_uint)]

class fsid_t(Structure):
    _fields_ = [('val', c_uint * 2)]

class guid_t(Structure):
    _fields_ = [('g_guid', c_byte*16)]

class kauth_ace(Structure):
    _fields_ = [('ace_applicable', guid_t),
                ('ace_flags', c_uint)]

class kauth_acl(Structure):
    _fields_ = [('acl_entrycount', c_uint),
                ('acl_flags', c_uint),
                ('acl_ace', kauth_ace * 128)]

class kauth_filesec(Structure):
    _fields_ = [('fsec_magic', c_uint),
                ('fsec_owner', guid_t),
                ('fsec_group', guid_t),
                ('fsec_acl', kauth_acl)]

class diskextent(Structure):
    _fields_ = [('startblock', c_uint),
                ('blockcount', c_uint)]

OSType = c_uint
UInt16 = c_ushort
SInt16 = c_short
SInt32 = c_int

class Point(Structure):
    _fields_ = [('x', SInt16),
                ('y', SInt16)]
class Rect(Structure):
    _fields_ = [('x', SInt16),
                ('y', SInt16),
                ('w', SInt16),
                ('h', SInt16)]
class FileInfo(Structure):
    _fields_ = [('fileType', OSType),
                ('fileCreator', OSType),
                ('finderFlags', UInt16),
                ('location', Point),
                ('reservedField', UInt16),
                ('reserved1', SInt16 * 4),
                ('extendedFinderFlags', UInt16),
                ('reserved2', SInt16),
                ('putAwayFolderID', SInt32)]
class FolderInfo(Structure):
    _fields_ = [('windowBounds', Rect),
                ('finderFlags', UInt16),
                ('location', Point),
                ('reservedField', UInt16),
                ('scrollPosition', Point),
                ('reserved1', SInt32),
                ('extendedFinderFlags', UInt16),
                ('reserved2', SInt16),
                ('putAwayFolderID', SInt32)]
class FinderInfo(Union):
    _fields_ = [('fileInfo', FileInfo),
                ('folderInfo', FolderInfo)]

extentrecord = diskextent * 8
        
vol_capabilities_set_t = c_uint * 4

class vol_capabilities_attr_t(Structure):
    _fields_ = [('capabilities', vol_capabilities_set_t),
                ('valid', vol_capabilities_set_t)]

class vol_attributes_attr_t(Structure):
    _fields_ = [('validattr', attribute_set_t),
                ('nativeattr', attribute_set_t)]

dev_t = c_uint

fsobj_type_t = c_uint

VNON = 0
VREG = 1
VDIR = 2
VBLK = 3
VCHR = 4
VLNK = 5
VSOCK = 6
VFIFO = 7
VBAD = 8
VSTR = 9
VCPLX = 10

fsobj_tag_t = c_uint

VT_NON = 0
VT_UFS = 1
VT_NFS = 2
VT_MFS = 3
VT_MSDOSFS = 4
VT_LFS = 5
VT_LOFS = 6
VT_FDESC = 7
VT_PORTAL = 8
VT_NULL = 9
VT_UMAP = 10
VT_KERNFS = 11
VT_PROCFS = 12
VT_AFS = 13
VT_ISOFS = 14
VT_UNION = 15
VT_HFS = 16
VT_ZFS = 17
VT_DEVFS = 18
VT_WEBDAV = 19
VT_UDF = 20
VT_AFP = 21
VT_CDDA = 22
VT_CIFS = 23
VT_OTHER = 24

fsfile_type_t = c_uint
fsvolid_t = c_uint
text_encoding_t = c_uint
uid_t = c_uint
gid_t = c_uint
int32_t = c_int
uint32_t = c_uint
int64_t = c_longlong
uint64_t = c_ulonglong
off_t = c_long
size_t = c_ulong
uuid_t = c_byte*16

NAME_MAX = 255
PATH_MAX = 1024

class struct_statfs(Structure):
    _fields_ = [('f_bsize', uint32_t),
                ('f_iosize', int32_t),
                ('f_blocks', uint64_t),
                ('f_bfree', uint64_t),
                ('f_bavail', uint64_t),
                ('f_files', uint64_t),
                ('f_ffree', uint64_t),
                ('f_fsid', fsid_t),
                ('f_owner', uid_t),
                ('f_type', uint32_t),
                ('f_flags', uint32_t),
                ('f_fssubtype', uint32_t),
                ('f_fstypename', c_char * 16),
                ('f_mntonname', c_char * PATH_MAX),
                ('f_mntfromname', c_char * PATH_MAX),
                ('f_reserved', uint32_t * 8)]

# Calculate the maximum number of bytes required for the attribute buffer
_attr_info = (
    # Common attributes
    (0, ATTR_CMN_RETURNED_ATTRS, sizeof(attribute_set_t)),
    (0, ATTR_CMN_NAME, sizeof(attrreference_t) + NAME_MAX * 3 + 1),
    (0, ATTR_CMN_DEVID, sizeof(dev_t)),
    (0, ATTR_CMN_FSID, sizeof(fsid_t)),
    (0, ATTR_CMN_OBJTYPE, sizeof(fsobj_type_t)),
    (0, ATTR_CMN_OBJTAG, sizeof(fsobj_tag_t)),
    (0, ATTR_CMN_OBJPERMANENTID, sizeof(fsobj_id_t)),
    (0, ATTR_CMN_PAROBJID, sizeof(fsobj_id_t)),
    (0, ATTR_CMN_SCRIPT, sizeof(text_encoding_t)),
    (0, ATTR_CMN_CRTIME, sizeof(timespec)),
    (0, ATTR_CMN_MODTIME, sizeof(timespec)),
    (0, ATTR_CMN_CHGTIME, sizeof(timespec)),
    (0, ATTR_CMN_ACCTIME, sizeof(timespec)),
    (0, ATTR_CMN_BKUPTIME, sizeof(timespec)),
    (0, ATTR_CMN_FNDRINFO, sizeof(FinderInfo)),
    (0, ATTR_CMN_OWNERID, sizeof(uid_t)),
    (0, ATTR_CMN_GRPID, sizeof(gid_t)),
    (0, ATTR_CMN_ACCESSMASK, sizeof(uint32_t)),
    (0, ATTR_CMN_NAMEDATTRCOUNT, None),
    (0, ATTR_CMN_NAMEDATTRLIST, None),
    (0, ATTR_CMN_FLAGS, sizeof(uint32_t)),
    (0, ATTR_CMN_USERACCESS, sizeof(uint32_t)),
    (0, ATTR_CMN_EXTENDED_SECURITY, sizeof(attrreference_t) + sizeof(kauth_filesec)),
    (0, ATTR_CMN_UUID, sizeof(guid_t)),
    (0, ATTR_CMN_GRPUUID, sizeof(guid_t)),
    (0, ATTR_CMN_FILEID, sizeof(uint64_t)),
    (0, ATTR_CMN_PARENTID, sizeof(uint64_t)),
    (0, ATTR_CMN_FULLPATH, sizeof(attrreference_t) + PATH_MAX),
    (0, ATTR_CMN_ADDEDTIME, sizeof(timespec)),

    # Volume attributes
    (1, ATTR_VOL_FSTYPE, sizeof(uint32_t)),
    (1, ATTR_VOL_SIGNATURE, sizeof(uint32_t)),
    (1, ATTR_VOL_SIZE, sizeof(off_t)),
    (1, ATTR_VOL_SPACEFREE, sizeof(off_t)),
    (1, ATTR_VOL_SPACEAVAIL, sizeof(off_t)),
    (1, ATTR_VOL_MINALLOCATION, sizeof(off_t)),
    (1, ATTR_VOL_ALLOCATIONCLUMP, sizeof(off_t)),
    (1, ATTR_VOL_IOBLOCKSIZE, sizeof(uint32_t)),
    (1, ATTR_VOL_OBJCOUNT, sizeof(uint32_t)),
    (1, ATTR_VOL_FILECOUNT, sizeof(uint32_t)),
    (1, ATTR_VOL_DIRCOUNT, sizeof(uint32_t)),
    (1, ATTR_VOL_MAXOBJCOUNT, sizeof(uint32_t)),
    (1, ATTR_VOL_MOUNTPOINT, sizeof(attrreference_t) + PATH_MAX),
    (1, ATTR_VOL_NAME, sizeof(attrreference_t) + NAME_MAX + 1),
    (1, ATTR_VOL_MOUNTFLAGS, sizeof(uint32_t)),
    (1, ATTR_VOL_MOUNTEDDEVICE, sizeof(attrreference_t) + PATH_MAX),
    (1, ATTR_VOL_ENCODINGSUSED, sizeof(c_ulonglong)),
    (1, ATTR_VOL_CAPABILITIES, sizeof(vol_capabilities_attr_t)),
    (1, ATTR_VOL_UUID, sizeof(uuid_t)),
    (1, ATTR_VOL_ATTRIBUTES, sizeof(vol_attributes_attr_t)),

    # Directory attributes
    (2, ATTR_DIR_LINKCOUNT, sizeof(uint32_t)),
    (2, ATTR_DIR_ENTRYCOUNT, sizeof(uint32_t)),
    (2, ATTR_DIR_MOUNTSTATUS, sizeof(uint32_t)),

    # File attributes
    (3, ATTR_FILE_LINKCOUNT, sizeof(uint32_t)),
    (3, ATTR_FILE_TOTALSIZE, sizeof(off_t)),
    (3, ATTR_FILE_ALLOCSIZE, sizeof(off_t)),
    (3, ATTR_FILE_IOBLOCKSIZE, sizeof(uint32_t)),
    (3, ATTR_FILE_CLUMPSIZE, sizeof(uint32_t)),
    (3, ATTR_FILE_DEVTYPE, sizeof(uint32_t)),
    (3, ATTR_FILE_FILETYPE, sizeof(uint32_t)),
    (3, ATTR_FILE_FORKCOUNT, sizeof(uint32_t)),
    (3, ATTR_FILE_FORKLIST, None),
    (3, ATTR_FILE_DATALENGTH, sizeof(off_t)),
    (3, ATTR_FILE_DATAALLOCSIZE, sizeof(off_t)),
    (3, ATTR_FILE_DATAEXTENTS, sizeof(extentrecord)),
    (3, ATTR_FILE_RSRCLENGTH, sizeof(off_t)),
    (3, ATTR_FILE_RSRCALLOCSIZE, sizeof(off_t)),
    (3, ATTR_FILE_RSRCEXTENTS, sizeof(extentrecord)),

    # Fork attributes
    (4, ATTR_FORK_TOTALSIZE, sizeof(off_t)),
    (4, ATTR_FORK_ALLOCSIZE, sizeof(off_t))
    )
    
def _attrbuf_size(attrs):
    size = 4
    for entry in _attr_info:
        if attrs[entry[0]] & entry[1]:
            if entry[2] is None:
                raise ValueError('Unsupported attribute (%u, %x)'
                                 % (entry[0], entry[1]))
            size += entry[2]
    return size

_getattrlist = libc.getattrlist
_getattrlist.argtypes = [c_char_p, POINTER(attrlist), c_void_p, c_ulong, c_ulong]
_getattrlist.restype = c_int

_fgetattrlist = libc.fgetattrlist
_fgetattrlist.argtypes = [c_int, POINTER(attrlist), c_void_p, c_ulong, c_ulong]
_fgetattrlist.restype = c_int

_statfs = libc['statfs$INODE64']
_statfs.argtypes = [c_char_p, POINTER(struct_statfs)]
_statfs.restype = c_int

_fstatfs = libc['fstatfs$INODE64']
_fstatfs.argtypes = [c_int, POINTER(struct_statfs)]
_fstatfs.restype = c_int

def _datetime_from_timespec(ts):
    td = datetime.timedelta(seconds=ts.tv_sec + 1.0e-9 * ts.tv_nsec)
    return unix_epoch + td

def _decode_utf8_nul(sz):
    nul = sz.find(b'\0')
    if nul > -1:
        sz = sz[:nul]
    return sz.decode('utf-8')

def _decode_attrlist_result(buf, attrs, options):
    result = []

    assert len(buf) >= 4
    total_size = uint32_t.from_buffer(buf, 0).value
    assert total_size <= len(buf)

    offset = 4

    # Common attributes
    if attrs[0] & ATTR_CMN_RETURNED_ATTRS:
        a = attribute_set_t.from_buffer(buf, offset)
        result.append(a)
        offset += sizeof (attribute_set_t)
        if not (options & FSOPT_PACK_INVAL_ATTRS):
            attrs = [a.commonattr, a.volattr, a.dirattr, a.fileattr, a.forkattr]
    if attrs[0] & ATTR_CMN_NAME:
        a = attrreference_t.from_buffer(buf, offset)
        ofs = offset + a.attr_dataoffset
        name = _decode_utf8_nul(buf[ofs:ofs+a.attr_length])
        offset += sizeof (attrreference_t)
        result.append(name)
    if attrs[0] & ATTR_CMN_DEVID:
        a = dev_t.from_buffer(buf, offset)
        offset += sizeof(dev_t)
        result.append(a.value)
    if attrs[0] & ATTR_CMN_FSID:
        a = fsid_t.from_buffer(buf, offset)
        offset += sizeof(fsid_t)
        result.append(a)
    if attrs[0] & ATTR_CMN_OBJTYPE:
        a = fsobj_type_t.from_buffer(buf, offset)
        offset += sizeof(fsobj_type_t)
        result.append(a.value)
    if attrs[0] & ATTR_CMN_OBJTAG:
        a = fsobj_tag_t.from_buffer(buf, offset)
        offset += sizeof(fsobj_tag_t)
        result.append(a.value)
    if attrs[0] & ATTR_CMN_OBJID:
        a = fsobj_id_t.from_buffer(buf, offset)
        offset += sizeof(fsobj_id_t)
        result.append(a)
    if attrs[0] & ATTR_CMN_OBJPERMANENTID:
        a = fsobj_id_t.from_buffer(buf, offset)
        offset += sizeof(fsobj_id_t)
        result.append(a)
    if attrs[0] & ATTR_CMN_PAROBJID:
        a = fsobj_id_t.from_buffer(buf, offset)
        offset += sizeof(fsobj_id_t)
        result.append(a)
    if attrs[0] & ATTR_CMN_SCRIPT:
        a = text_encoding_t.from_buffer(buf, offset)
        offset += sizeof(text_encoding_t)
        result.append(a.value)
    if attrs[0] & ATTR_CMN_CRTIME:
        a = timespec.from_buffer(buf, offset)
        offset += sizeof(timespec)
        result.append(_datetime_from_timespec(a))
    if attrs[0] & ATTR_CMN_MODTIME:
        a = timespec.from_buffer(buf, offset)
        offset += sizeof(timespec)
        result.append(_datetime_from_timespec(a))
    if attrs[0] & ATTR_CMN_CHGTIME:
        a = timespec.from_buffer(buf, offset)
        offset += sizeof(timespec)
        result.append(_datetime_from_timespec(a))
    if attrs[0] & ATTR_CMN_ACCTIME:
        a = timespec.from_buffer(buf, offset)
        offset += sizeof(timespec)
        result.append(_datetime_from_timespec(a))
    if attrs[0] & ATTR_CMN_BKUPTIME:
        a = timespec.from_buffer(buf, offset)
        offset += sizeof(timespec)
        result.append(_datetime_from_timespec(a))
    if attrs[0] & ATTR_CMN_FNDRINFO:
        a = FinderInfo.from_buffer(buf, offset)
        offset += sizeof(FinderInfo)
        result.append(a)
    if attrs[0] & ATTR_CMN_OWNERID:
        a = uid_t.from_buffer(buf, offset)
        offset += sizeof(uid_t)
        result.append(a.value)
    if attrs[0] & ATTR_CMN_GRPID:
        a = gid_t.from_buffer(buf, offset)
        offset += sizeof(gid_t)
        result.append(a.value)
    if attrs[0] & ATTR_CMN_ACCESSMASK:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[0] & ATTR_CMN_FLAGS:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[0] & ATTR_CMN_USERACCESS:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[0] & ATTR_CMN_EXTENDED_SECURITY:
        a = attrreference_t.from_buffer(buf, offset)
        ofs = offset + a.attr_dataoffset
        offset += sizeof(attrreference_t)
        ec = uint32_t.from_buffer(buf, ofs + 36).value
        class kauth_acl(Structure):
            _fields_ = [('acl_entrycount', c_uint),
                        ('acl_flags', c_uint),
                        ('acl_ace', kauth_ace * ec)]
        class kauth_filesec(Structure):
            _fields_ = [('fsec_magic', c_uint),
                        ('fsec_owner', guid_t),
                        ('fsec_group', guid_t),
                        ('fsec_acl', kauth_acl)]
        a = kauth_filesec.from_buffer(buf, ofs)
        result.append(a)
    if attrs[0] & ATTR_CMN_UUID:
        result.append(uuid.UUID(bytes=buf[offset:offset+16]))
        offset += sizeof(guid_t)
    if attrs[0] & ATTR_CMN_GRPUUID:
        result.append(uuid.UUID(bytes=buf[offset:offset+16]))
        offset += sizeof(guid_t)
    if attrs[0] & ATTR_CMN_FILEID:
        a = uint64_t.from_buffer(buf, offset)
        offset += sizeof(uint64_t)
        result.append(a.value)
    if attrs[0] & ATTR_CMN_PARENTID:
        a = uint64_t.from_buffer(buf, offset)
        offset += sizeof(uint64_t)
        result.append(a.value)
    if attrs[0] & ATTR_CMN_FULLPATH:
        a = attrreference_t.from_buffer(buf, offset)
        ofs = offset + a.attr_dataoffset
        path = _decode_utf8_nul(buf[ofs:ofs+a.attr_length])
        offset += sizeof (attrreference_t)
        result.append(path)
    if attrs[0] & ATTR_CMN_ADDEDTIME:
        a = timespec.from_buffer(buf, offset)
        offset += sizeof(timespec)
        result.append(_datetime_from_timespec(a))

    # Volume attributes
    if attrs[1] & ATTR_VOL_FSTYPE:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_SIGNATURE:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_SIZE:
        a = off_t.from_buffer(buf, offset)
        offset += sizeof(off_t)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_SPACEFREE:
        a = off_t.from_buffer(buf, offset)
        offset += sizeof(off_t)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_SPACEAVAIL:
        a = off_t.from_buffer(buf, offset)
        offset += sizeof(off_t)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_MINALLOCATION:
        a = off_t.from_buffer(buf, offset)
        offset += sizeof(off_t)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_ALLOCATIONCLUMP:
        a = off_t.from_buffer(buf, offset)
        offset += sizeof(off_t)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_IOBLOCKSIZE:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_OBJCOUNT:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_FILECOUNT:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_DIRCOUNT:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_MAXOBJCOUNT:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_MOUNTPOINT:
        a = attrreference_t.from_buffer(buf, offset)
        ofs = offset + a.attr_dataoffset
        path = _decode_utf8_nul(buf[ofs:ofs+a.attr_length])
        offset += sizeof (attrreference_t)
        result.append(path)
    if attrs[1] & ATTR_VOL_NAME:
        a = attrreference_t.from_buffer(buf, offset)
        ofs = offset + a.attr_dataoffset
        name = _decode_utf8_nul(buf[ofs:ofs+a.attr_length])
        offset += sizeof (attrreference_t)
        result.append(name)
    if attrs[1] & ATTR_VOL_MOUNTFLAGS:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_MOUNTEDDEVICE:
        a = attrreference_t.from_buffer(buf, offset)
        ofs = offset + a.attr_dataoffset
        path = _decode_utf8_nul(buf[ofs:ofs+a.attr_length])
        offset += sizeof (attrreference_t)
        result.append(path)
    if attrs[1] & ATTR_VOL_ENCODINGSUSED:
        a = c_ulonglong.from_buffer(buf, offset)
        offset += sizeof(c_ulonglong)
        result.append(a.value)
    if attrs[1] & ATTR_VOL_CAPABILITIES:
        a = vol_capabilities_attr_t.from_buffer(buf, offset)
        offset += sizeof(vol_capabilities_attr_t)
        result.append(a)
    if attrs[1] & ATTR_VOL_UUID:
        result.append(uuid.UUID(bytes=buf[offset:offset+16]))
        offset += sizeof(uuid_t)
    if attrs[1] & ATTR_VOL_ATTRIBUTES:
        a = vol_attributes_attr_t.from_buffer(buf, offset)
        offset += sizeof(vol_attributes_attr_t)
        result.append(a)

    # Directory attributes
    if attrs[2] & ATTR_DIR_LINKCOUNT:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[2] & ATTR_DIR_ENTRYCOUNT:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[2] & ATTR_DIR_MOUNTSTATUS:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)

    # File attributes
    if attrs[3] & ATTR_FILE_LINKCOUNT:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[3] & ATTR_FILE_TOTALSIZE:
        a = off_t.from_buffer(buf, offset)
        offset += sizeof(off_t)
        result.append(a.value)
    if attrs[3] & ATTR_FILE_ALLOCSIZE:
        a = off_t.from_buffer(buf, offset)
        offset += sizeof(off_t)
        result.append(a.value)
    if attrs[3] & ATTR_FILE_IOBLOCKSIZE:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[3] & ATTR_FILE_CLUMPSIZE:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[3] & ATTR_FILE_DEVTYPE:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[3] & ATTR_FILE_FILETYPE:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[3] & ATTR_FILE_FORKCOUNT:
        a = uint32_t.from_buffer(buf, offset)
        offset += sizeof(uint32_t)
        result.append(a.value)
    if attrs[3] & ATTR_FILE_DATALENGTH:
        a = off_t.from_buffer(buf, offset)
        offset += sizeof(off_t)
        result.append(a.value)
    if attrs[3] & ATTR_FILE_DATAALLOCSIZE:
        a = off_t.from_buffer(buf, offset)
        offset += sizeof(off_t)
        result.append(a.value)
    if attrs[3] & ATTR_FILE_DATAEXTENTS:
        a = extentrecord.from_buffer(buf, offset)
        offset += sizeof(extentrecord)
        result.append(a.value)
    if attrs[3] & ATTR_FILE_RSRCLENGTH:
        a = off_t.from_buffer(buf, offset)
        offset += sizeof(off_t)
        result.append(a.value)
    if attrs[3] & ATTR_FILE_RSRCALLOCSIZE:
        a = off_t.from_buffer(buf, offset)
        offset += sizeof(off_t)
        result.append(a.value)
    if attrs[3] & ATTR_FILE_RSRCEXTENTS:
        a = extentrecord.from_buffer(buf, offset)
        offset += sizeof(extentrecord)
        result.append(a.value)

    # Fork attributes
    if attrs[4] & ATTR_FORK_TOTALSIZE:
        a = off_t.from_buffer(buf, offset)
        offset += sizeof(off_t)
        result.append(a.value)
    if attrs[4] & ATTR_FORK_ALLOCSIZE:
        a = off_t.from_buffer(buf, offset)
        offset += sizeof(off_t)
        result.append(a.value)
        
    return result

# Sadly, ctypes.get_errno() seems not to work
__error = libc.__error
__error.restype = POINTER(c_int)

def _get_errno():
    return __error().contents.value
                
def getattrlist(path, attrs, options):
    if not isinstance(path, bytes):
        path = path.encode('utf-8')
    attrs = list(attrs)
    if attrs[1]:
        attrs[1] |= ATTR_VOL_INFO
    alist = attrlist(bitmapcount=5,
                     commonattr=attrs[0],
                     volattr=attrs[1],
                     dirattr=attrs[2],
                     fileattr=attrs[3],
                     forkattr=attrs[4])

    bufsize = _attrbuf_size(attrs)
    buf = create_string_buffer(bufsize)

    ret = _getattrlist(path, byref(alist), buf, bufsize,
                       options | FSOPT_REPORT_FULLSIZE)

    if ret < 0:
        err = _get_errno()
        raise OSError(err, os.strerror(err), path)

    return _decode_attrlist_result(buf, attrs, options)

def fgetattrlist(fd, attrs, options):
    if hasattr(fd, 'fileno'):
        fd = fd.fileno()
    attrs = list(attrs)
    if attrs[1]:
        attrs[1] |= ATTR_VOL_INFO
    alist = attrlist(bitmapcount=5,
                     commonattr=attrs[0],
                     volattr=attrs[1],
                     dirattr=attrs[2],
                     fileattr=attrs[3],
                     forkattr=attrs[4])

    bufsize = _attrbuf_size(attrs)
    buf = create_string_buffer(bufsize)

    ret = _fgetattrlist(fd, byref(alist), buf, bufsize,
                        options | FSOPT_REPORT_FULLSIZE)

    if ret < 0:
        err = _get_errno()
        raise OSError(err, os.strerror(err))

    return _decode_attrlist_result(buf, attrs, options)

def statfs(path):
    if not isinstance(path, bytes):
        path = path.encode('utf-8')
    result = struct_statfs()
    ret = _statfs(path, byref(result))
    if ret < 0:
        err = _get_errno()
        raise OSError(err, os.strerror(err), path)
    return result

def fstatfs(fd):
    if hasattr(fd, 'fileno'):
        fd = fd.fileno()
    result = struct_statfs()
    ret = _fstatfs(fd, byref(result))
    if ret < 0:
        err = _get_errno()
        raise OSError(err, os.strerror(err))
    return result
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import datetime

ZERO = datetime.timedelta(0)
class UTC (datetime.tzinfo):
    def utcoffset(self, dt):
        return ZERO
    def dst(self, dt):
        return ZERO
    def tzname(self, dt):
        return 'UTC'

utc = UTC()
mac_epoch = datetime.datetime(1904,1,1,0,0,0,0,utc)
unix_epoch = datetime.datetime(1970,1,1,0,0,0,0,utc)
osx_epoch = datetime.datetime(2001,1,1,0,0,0,0,utc)
from .store import DSStore, DSStoreEntry

__all__ = ['DSStore', 'DSStoreEntry']
# -*- coding: utf-8 -*-
import os
import bisect
import struct
import binascii

try:
    {}.iterkeys
    iterkeys = lambda x: x.iterkeys()
except AttributeError:
    iterkeys = lambda x: x.keys()
try:
    unicode
except NameError:
    unicode = str

class BuddyError(Exception):
    pass

class Block(object):
    def __init__(self, allocator, offset, size):
        self._allocator = allocator
        self._offset = offset
        self._size = size
        self._value = bytearray(allocator.read(offset, size))
        self._pos = 0
        self._dirty = False
        
    def __len__(self):
        return self._size

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        self.close()
    
    def close(self):
        if self._dirty:
            self.flush()

    def flush(self):
        if self._dirty:
            self._dirty = False
            self._allocator.write(self._offset, self._value)

    def invalidate(self):
        self._dirty = False
        
    def zero_fill(self):
        len = self._size - self._pos
        zeroes = b'\0' * len
        self._value[self._pos:self._size] = zeroes
        self._dirty = True
        
    def tell(self):
        return self._pos

    def seek(self, pos, whence=os.SEEK_SET):
        if whence == os.SEEK_CUR:
            pos += self._pos
        elif whence == os.SEEK_END:
            pos = self._size - pos

        if pos < 0 or pos > self._size:
            raise ValueError('Seek out of range in Block instance')

        self._pos = pos

    def read(self, size_or_format):
        if isinstance(size_or_format, (str, unicode, bytes)):
            size = struct.calcsize(size_or_format)
            fmt = size_or_format
        else:
            size = size_or_format
            fmt = None

        if self._size - self._pos < size:
            raise BuddyError('Unable to read %lu bytes in block' % size)

        data = self._value[self._pos:self._pos + size]
        self._pos += size
        
        if fmt is not None:
            if isinstance(data, bytearray):
                return struct.unpack_from(fmt, bytes(data))
            else:
                return struct.unpack(fmt, data)
        else:
            return data

    def write(self, data_or_format, *args):
        if len(args):
            data = struct.pack(data_or_format, *args)
        else:
            data = data_or_format

        if self._pos + len(data) > self._size:
            raise ValueError('Attempt to write past end of Block')

        self._value[self._pos:self._pos + len(data)] = data
        self._pos += len(data)
        
        self._dirty = True

    def insert(self, data_or_format, *args):
        if len(args):
            data = struct.pack(data_or_format, *args)
        else:
            data = data_or_format

        del self._value[-len(data):]
        self._value[self._pos:self._pos] = data
        self._pos += len(data)

        self._dirty = True

    def delete(self, size):
        if self._pos + size > self._size:
            raise ValueError('Attempt to delete past end of Block')
        del self._value[self._pos:self._pos + size]
        self._value += b'\0' * size
        self._dirty = True
        
    def __str__(self):
        return binascii.b2a_hex(self._value)
        
class Allocator(object):
    def __init__(self, the_file):
        self._file = the_file
        self._dirty = False

        self._file.seek(0)
        
        # Read the header
        magic1, magic2, offset, size, offset2, self._unknown1 \
          = self.read(-4, '>I4sIII16s')

        if magic2 != b'Bud1' or magic1 != 1:
            raise BuddyError('Not a buddy file')

        if offset != offset2:
            raise BuddyError('Root addresses differ')

        self._root = Block(self, offset, size)

        # Read the block offsets
        count, self._unknown2 = self._root.read('>II')
        self._offsets = []
        c = (count + 255) & ~255
        while c:
            self._offsets += self._root.read('>256I')
            c -= 256
        self._offsets = self._offsets[:count]
        
        # Read the TOC
        self._toc = {}
        count = self._root.read('>I')[0]
        for n in range(count):
            nlen = self._root.read('B')[0]
            name = bytes(self._root.read(nlen))
            value = self._root.read('>I')[0]
            self._toc[name] = value

        # Read the free lists
        self._free = []
        for n in range(32):
            count = self._root.read('>I')
            self._free.append(list(self._root.read('>%uI' % count)))
        
    @classmethod
    def open(cls, file_or_name, mode='r+'):
        if isinstance(file_or_name, (str, unicode)):
            if not 'b' in mode:
                mode = mode[:1] + 'b' + mode[1:]
            f = open(file_or_name, mode)
        else:
            f = file_or_name

        if 'w' in mode:
            # Create an empty file in this case
            f.truncate()
            
            # An empty root block needs 1264 bytes:
            #
            #     0  4       offset count
            #     4  4       unknown
            #     8  4       root block offset (2048)
            #    12  255 * 4 padding (offsets are in multiples of 256)
            #  1032  4       toc count (0)
            #  1036  228     free list
            #  total 1264
            
            # The free list will contain the following:
            #
            #     0  5 * 4   no blocks of width less than 5
            #    20  6 * 8   1 block each of widths 5 to 10
            #    68  4       no blocks of width 11 (allocated for the root)
            #    72  19 * 8  1 block each of widths 12 to 30
            #   224  4       no blocks of width 31
            # total  228
            #
            # (The reason for this layout is that we allocate 2**5 bytes for
            #  the header, which splits the initial 2GB region into every size
            #  below 2**31, including *two* blocks of size 2**5, one of which
            #  we take.  The root block itself then needs a block of size
            #  2**11.  Conveniently, each of these initial blocks will be
            #  located at offset 2**n where n is its width.)

            # Write the header
            header = struct.pack(b'>I4sIII16s',
                                 1, b'Bud1',
                                 2048, 1264, 2048,
                                 b'\x00\x00\x10\x0c'
                                 b'\x00\x00\x00\x87'
                                 b'\x00\x00\x20\x0b'
                                 b'\x00\x00\x00\x00')
            f.write(header)
            f.write(b'\0' * 2016)
            
            # Write the root block
            free_list = [struct.pack(b'>5I', 0, 0, 0, 0, 0)]
            for n in range(5, 11):
                free_list.append(struct.pack(b'>II', 1, 2**n))
            free_list.append(struct.pack(b'>I', 0))
            for n in range(12, 31):
                free_list.append(struct.pack(b'>II', 1, 2**n))
            free_list.append(struct.pack(b'>I', 0))
            
            root = b''.join([struct.pack(b'>III', 1, 0, 2048 | 5),
                            struct.pack(b'>I', 0) * 255,
                            struct.pack(b'>I', 0)] + free_list)
            f.write(root)

        return Allocator(f)

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        self.close()
    
    def close(self):
        self.flush()
        self._file.close()

    def flush(self):
        if self._dirty:
            size = self._root_block_size()
            self.allocate(size, 0)
            with self.get_block(0) as rblk:
                self._write_root_block_into(rblk)

            addr = self._offsets[0]
            offset = addr & ~0x1f
            size = 1 << (addr & 0x1f)

            self._file.seek(0, os.SEEK_SET)
            self._file.write(struct.pack(b'>I4sIII16s',
                                         1, b'Bud1',
                                         offset, size, offset,
                                         self._unknown1))

            self._dirty = False
            
        self._file.flush()
            
    def read(self, offset, size_or_format):
        """Read data at `offset', or raise an exception.  `size_or_format'
           may either be a byte count, in which case we return raw data,
           or a format string for `struct.unpack', in which case we
           work out the size and unpack the data before returning it."""
        # N.B. There is a fixed offset of four bytes(!)
        self._file.seek(offset + 4, os.SEEK_SET)

        if isinstance(size_or_format, (str, unicode)):
            size = struct.calcsize(size_or_format)
            fmt = size_or_format
        else:
            size = size_or_format
            fmt = None
        
        ret = self._file.read(size)
        if len(ret) < size:
            ret += b'\0' * (size - len(ret))

        if fmt is not None:
            if isinstance(ret, bytearray):
                ret = struct.unpack_from(fmt, bytes(ret))
            else:
                ret = struct.unpack(fmt, ret)
            
        return ret

    def write(self, offset, data_or_format, *args):
        """Write data at `offset', or raise an exception.  `data_or_format'
           may either be the data to write, or a format string for `struct.pack',
           in which case we pack the additional arguments and write the
           resulting data."""
        # N.B. There is a fixed offset of four bytes(!)
        self._file.seek(offset + 4, os.SEEK_SET)

        if len(args):
            data = struct.pack(data_or_format, *args)
        else:
            data = data_or_format

        self._file.write(data)

    def get_block(self, block):
        try:
            addr = self._offsets[block]
        except IndexError:
            return None

        offset = addr & ~0x1f
        size = 1 << (addr & 0x1f)

        return Block(self, offset, size)
    
    def _root_block_size(self):
        """Return the number of bytes required by the root block."""
        # Offsets
        size = 8
        size += 4 * ((len(self._offsets) + 255) & ~255)

        # TOC
        size += 4
        size += sum([5 + len(s) for s in self._toc])

        # Free list
        size += sum([4 + 4 * len(fl) for fl in self._free])
        
        return size

    def _write_root_block_into(self, block):
        # Offsets
        block.write('>II', len(self._offsets), self._unknown2)
        block.write('>%uI' % len(self._offsets), *self._offsets)
        extra = len(self._offsets) & 255
        if extra:
            block.write(b'\0\0\0\0' * (256 - extra))

        # TOC
        keys = list(self._toc.keys())
        keys.sort()

        block.write('>I', len(keys))
        for k in keys:
            block.write('B', len(k))
            block.write(k)
            block.write('>I', self._toc[k])

        # Free list
        for w, f in enumerate(self._free):
            block.write('>I', len(f))
            if len(f):
                block.write('>%uI' % len(f), *f)

    def _buddy(self, offset, width):
        f = self._free[width]
        b = offset ^ (1 << width)
        
        try:
            ndx = f.index(b)
        except ValueError:
            ndx = None
            
        return (f, b, ndx)

    def _release(self, offset, width):
        # Coalesce
        while True:
            f,b,ndx = self._buddy(offset, width)

            if ndx is None:
                break
            
            offset &= b
            width += 1
            del f[ndx]
            
        # Add to the list
        bisect.insort(f, offset)

        # Mark as dirty
        self._dirty = True
    
    def _alloc(self, width):
        w = width
        while not self._free[w]:
            w += 1
        while w > width:
            offset = self._free[w].pop(0)
            w -= 1
            self._free[w] = [offset, offset ^ (1 << w)]
        self._dirty = True
        return self._free[width].pop(0)

    def allocate(self, bytes, block=None):
        """Allocate or reallocate a block such that it has space for at least
        `bytes' bytes."""
        if block is None:
            # Find the first unused block
            try:
                block = self._offsets.index(0)
            except ValueError:
                block = len(self._offsets)
                self._offsets.append(0)
        
        # Compute block width
        width = max(bytes.bit_length(), 5)

        addr = self._offsets[block]
        offset = addr & ~0x1f
        
        if addr:
            blkwidth = addr & 0x1f
            if blkwidth == width:
                return block
            self._release(offset, width)
            self._offsets[block] = 0

        offset = self._alloc(width)
        self._offsets[block] = offset | width
        return block
    
    def release(self, block):
        addr = self._offsets[block]

        if addr:
            width = addr & 0x1f
            offset = addr & ~0x1f
            self._release(offset, width)

        if block == len(self._offsets):
            del self._offsets[block]
        else:
            self._offsets[block] = 0

    def __len__(self):
        return len(self._toc)

    def __getitem__(self, key):
        if not isinstance(key, (str, unicode)):
            raise TypeError('Keys must be of string type')
        if not isinstance(key, bytes):
            key = key.encode('latin_1')
        return self._toc[key]

    def __setitem__(self, key, value):
        if not isinstance(key, (str, unicode)):
            raise TypeError('Keys must be of string type')
        if not isinstance(key, bytes):
            key = key.encode('latin_1')
        self._toc[key] = value
        self._dirty = True

    def __delitem__(self, key):
        if not isinstance(key, (str, unicode)):
            raise TypeError('Keys must be of string type')
        if not isinstance(key, bytes):
            key = key.encode('latin_1')
        del self._toc[key]
        self._dirty = True

    def iterkeys(self):
        return iterkeys(self._toc)

    def keys(self):
        return iterkeys(self._toc)

    def __iter__(self):
        return iterkeys(self._toc)

    def __contains__(self, key):
        return key in self._toc

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from __future__ import print_function
from __future__ import division

import binascii
import struct
import biplist
import mac_alias

try:
    next
except NameError:
    next = lambda x: x.next()
try:
    unicode
except NameError:
    unicode = str

from . import buddy

class ILocCodec(object):
    @staticmethod
    def encode(point):
        return struct.pack(b'>IIII', point[0], point[1],
                           0xffffffff, 0xffff0000)

    @staticmethod
    def decode(bytesData):
        if isinstance(bytesData, bytearray):
            x, y = struct.unpack_from(b'>II', bytes(bytesData[:8]))
        else:
            x, y = struct.unpack(b'>II', bytesData[:8])
        return (x, y)

class PlistCodec(object):
    @staticmethod
    def encode(plist):
        return biplist.writePlistToString(plist)

    @staticmethod
    def decode(bytes):
        return biplist.readPlistFromString(bytes)

class BookmarkCodec(object):
    @staticmethod
    def encode(bmk):
        return bmk.to_bytes()

    @staticmethod
    def decode(bytes):
        return mac_alias.Bookmark.from_bytes(bytes)

# This list tells the code how to decode particular kinds of entry in the
# .DS_Store file.  This is really a convenience, and we currently only
# support a tiny subset of the possible entry types.
codecs = {
    b'Iloc': ILocCodec,
    b'bwsp': PlistCodec,
    b'lsvp': PlistCodec,
    b'lsvP': PlistCodec,
    b'icvp': PlistCodec,
    b'pBBk': BookmarkCodec
    }

class DSStoreEntry(object):
    """Holds the data from an entry in a ``.DS_Store`` file.  Note that this is
    not meant to represent the entry itself---i.e. if you change the type
    or value, your changes will *not* be reflected in the underlying file.

    If you want to make a change, you should either use the :class:`DSStore`
    object's :meth:`DSStore.insert` method (which will replace a key if it
    already exists), or the mapping access mode for :class:`DSStore` (often
    simpler anyway).
    """
    def __init__(self, filename, code, typecode, value=None):
        if str != bytes and type(filename) == bytes:
            filename = filename.decode('utf-8')

        if not isinstance(code, bytes):
            code = code.encode('latin_1')

        self.filename = filename
        self.code = code
        self.type = typecode
        self.value = value
        
    @classmethod
    def read(cls, block):
        """Read a ``.DS_Store`` entry from the containing Block"""
        # First read the filename
        nlen = block.read(b'>I')[0]
        filename = block.read(2 * nlen).decode('utf-16be')

        # Next, read the code and type
        code, typecode = block.read(b'>4s4s')

        # Finally, read the data
        if typecode == b'bool':
            value = block.read(b'>?')[0]
        elif typecode == b'long' or typecode == b'shor':
            value = block.read(b'>I')[0]
        elif typecode == b'blob':
            vlen = block.read(b'>I')[0]
            value = block.read(vlen)

            codec = codecs.get(code, None)
            if codec:
                value = codec.decode(value)
                typecode = codec
        elif typecode == b'ustr':
            vlen = block.read(b'>I')[0]
            value = block.read(2 * vlen).decode('utf-16be')
        elif typecode == b'type':
            value = block.read(b'>4s')[0]
        elif typecode == b'comp' or typecode == b'dutc':
            value = block.read(b'>Q')[0]
        else:
            raise ValueError('Unknown type code "%s"' % typecode)

        return DSStoreEntry(filename, code, typecode, value)

    def __lt__(self, other):
        if not isinstance(other, DSStoreEntry):
            raise TypeError('Can only compare against other DSStoreEntry objects')
        sfl = self.filename.lower()
        ofl = other.filename.lower()
        return (sfl < ofl
                or (self.filename == other.filename
                    and self.code < other.code))

    def __le__(self, other):
        if not isinstance(other, DSStoreEntry):
            raise TypeError('Can only compare against other DSStoreEntry objects')
        sfl = self.filename.lower()
        ofl = other.filename.lower()
        return (sfl < ofl
                or (sfl == ofl
                    and self.code <= other.code))

    def __eq__(self, other):
        if not isinstance(other, DSStoreEntry):
            raise TypeError('Can only compare against other DSStoreEntry objects')
        sfl = self.filename.lower()
        ofl = other.filename.lower()
        return (sfl == ofl
                and self.code == other.code)

    def __ne__(self, other):
        if not isinstance(other, DSStoreEntry):
            raise TypeError('Can only compare against other DSStoreEntry objects')
        sfl = self.filename.lower()
        ofl = other.filename.lower()
        return (sfl != ofl
                or self.code != other.code)

    def __gt__(self, other):
        if not isinstance(other, DSStoreEntry):
            raise TypeError('Can only compare against other DSStoreEntry objects')
        sfl = self.filename.lower()
        ofl = other.filename.lower()
        
        selfCode = self.code
        if str != bytes and type(selfCode) is bytes:
            selfCode = selfCode.decode('utf-8')
        otherCode = other.code
        if str != bytes and type(otherCode) is bytes:
            otherCode = otherCode.decode('utf-8')
        
        return (sfl > ofl or (sfl == ofl and selfCode > otherCode))

    def __ge__(self, other):
        if not isinstance(other, DSStoreEntry):
            raise TypeError('Can only compare against other DSStoreEntry objects')
        sfl = self.filename.lower()
        ofl = other.filename.lower()
        return (sfl > ofl
                or (sfl == ofl
                    and self.code >= other.code))

    def __cmp__(self, other):
        if not isinstance(other, DSStoreEntry):
            raise TypeError('Can only compare against other DSStoreEntry objects')
        r = cmp(self.filename.lower(), other.filename.lower())
        if r:
            return r
        return cmp(self.code, other.code)
    
    def byte_length(self):
        """Compute the length of this entry, in bytes"""
        utf16 = self.filename.encode('utf-16be')
        l = 4 + len(utf16) + 8

        if isinstance(self.type, unicode):
            entry_type = self.type.encode('latin_1')
            value = self.value
        elif isinstance(self.type, (bytes, str)):
            entry_type = self.type
            value = self.value
        else:
            entry_type = b'blob'
            value = self.type.encode(self.value)
            
        if entry_type == b'bool':
            l += 1
        elif entry_type == b'long' or entry_type == b'shor':
            l += 4
        elif entry_type == b'blob':
            l += 4 + len(value)
        elif entry_type == b'ustr':
            utf16 = value.encode('utf-16be')
            l += 4 + len(utf16)
        elif entry_type == b'type':
            l += 4
        elif entry_type == b'comp' or entry_type == b'dutc':
            l += 8
        else:
            raise ValueError('Unknown type code "%s"' % entry_type)

        return l
    
    def write(self, block, insert=False):
        """Write this entry to the specified Block"""
        if insert:
            w = block.insert
        else:
            w = block.write

        if isinstance(self.type, unicode):
            entry_type = self.type.encode('latin_1')
            value = self.value
        elif isinstance(self.type, (bytes, str)):
            entry_type = self.type
            value = self.value
        else:
            entry_type = b'blob'
            value = self.type.encode(self.value)

        utf16 = self.filename.encode('utf-16be')
        w(b'>I', len(utf16) // 2)
        w(utf16)
        w(b'>4s4s', self.code, entry_type)

        if entry_type == b'bool':
            w(b'>?', value)
        elif entry_type == b'long' or entry_type == b'shor':
            w(b'>I', value)
        elif entry_type == b'blob':
            w(b'>I', len(value))
            w(value)
        elif entry_type == b'ustr':
            utf16 = value.encode('utf-16be')
            w(b'>I', len(utf16) // 2)
            w(utf16)
        elif entry_type == b'type':
            if isinstance(value, unicode):
                value = value.encode('latin_1')
            w(b'>4s', value)
        elif entry_type == b'comp' or entry_type == b'dutc':
            w(b'>Q', value)
        else:
            raise ValueError('Unknown type code "%s"' % entry_type)
    
    def __repr__(self):
        return '<%s %s>' % (self.filename, self.code)

class DSStore(object):
    """Python interface to a ``.DS_Store`` file.  Works by manipulating the file
    on the disk---so this code will work with ``.DS_Store`` files for *very*
    large directories.

    A :class:`DSStore` object can be used as if it was a mapping, e.g.::

      d['foobar.dat']['Iloc']

    will fetch the "Iloc" record for "foobar.dat", or raise :class:`KeyError` if
    there is no such record.  If used in this manner, the :class:`DSStore` object
    will return (type, value) tuples, unless the type is "blob" and the module
    knows how to decode it.

    Currently, we know how to decode "Iloc", "bwsp", "lsvp", "lsvP" and "icvp"
    blobs.  "Iloc" decodes to an (x, y) tuple, while the others are all decoded
    using ``biplist``.

    Assignment also works, e.g.::

      d['foobar.dat']['note'] = ('ustr', u'Hello World!')

    as does deletion with ``del``::

      del d['foobar.dat']['note']

    This is usually going to be the most convenient interface, though
    occasionally (for instance when creating a new ``.DS_Store`` file) you
    may wish to drop down to using :class:`DSStoreEntry` objects directly."""
    def __init__(self, store):
        self._store = store
        self._superblk = self._store['DSDB']
        with self._get_block(self._superblk) as s:
            self._rootnode, self._levels, self._records, \
            self._nodes, self._page_size = s.read(b'>IIIII')
        self._min_usage = 2 * self._page_size // 3
        self._dirty = False
        
    @classmethod
    def open(cls, file_or_name, mode='r+', initial_entries=None):
        """Open a ``.DS_Store`` file; pass either a Python file object, or a
        filename in the ``file_or_name`` argument and a file access mode in
        the ``mode`` argument.  If you are creating a new file using the "w"
        or "w+" modes, you may also specify a list of entries with which
        to initialise the file."""
        store = buddy.Allocator.open(file_or_name, mode)
        
        if mode == 'w' or mode == 'w+':
            superblk = store.allocate(20)
            store['DSDB'] = superblk
            page_size = 4096
            
            if not initial_entries:
                root = store.allocate(page_size)
                
                with store.get_block(root) as rootblk:
                    rootblk.zero_fill()

                with store.get_block(superblk) as s:
                    s.write(b'>IIIII', root, 0, 0, 1, page_size)
            else:
                # Make sure they're in sorted order
                initial_entries = list(initial_entries)
                initial_entries.sort()

                # Construct the tree
                current_level = initial_entries
                next_level = []
                levels = []
                ptr_size = 0
                node_count = 0
                while True:
                    total = 8
                    nodes = []
                    node = []
                    for e in current_level:
                        new_total = total + ptr_size + e.byte_length()
                        if new_total > page_size:
                            nodes.append(node)
                            next_level.append(e)
                            total = 8
                            node = []
                        else:
                            total = new_total
                            node.append(e)
                    if node:
                        nodes.append(node)

                    node_count += len(nodes)
                    levels.append(nodes)

                    if len(nodes) == 1:
                        break
                    
                    current_level = next_level
                    next_level = []
                    ptr_size = 4

                # Allocate nodes
                ptrs = [store.allocate(page_size) for n in range(node_count)]
                
                # Generate nodes
                pointers = []
                prev_pointers = None
                for level in levels:
                    ppndx = 0
                    lptrs = ptrs[-len(level):]
                    del ptrs[-len(level):]
                    for node in level:
                        ndx = lptrs.pop(0)
                        if prev_pointers is None:
                            with store.get_block(ndx) as block:
                                block.write(b'>II', 0, len(node))
                                for e in node:
                                    e.write(block)
                        else:
                            next_node = prev_pointers[ppndx + len(node)]
                            node_ptrs = prev_pointers[ppndx:ppndx+len(node)]
                            
                            with store.get_block(ndx) as block:
                                block.write(b'>II', next_node, len(node))
                                for ptr, e in zip(node_ptrs, node):
                                    block.write(b'>I', ptr)
                                    e.write(block)
                            
                        pointers.append(ndx)
                    prev_pointers = pointers
                    pointers = []
                
                root = prev_pointers[0]

                with store.get_block(superblk) as s:
                    s.write(b'>IIIII', root, len(levels), len(initial_entries),
                            node_count, page_size)
                    
        return DSStore(store)

    def _get_block(self, number):
        return self._store.get_block(number)

    def flush(self):
        """Flush any dirty data back to the file."""
        if self._dirty:
            self._dirty = False

            with self._get_block(self._superblk) as s:
                s.write(b'>IIIII', self._rootnode, self._levels, self._records,
                        self._nodes, self._page_size)
        self._store.flush()

    def close(self):
        """Flush dirty data and close the underlying file."""
        self.flush()
        self._store.close()
        
    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        self.close()
        
    # Internal B-Tree nodes look like this:
    #
    # [ next | count | (ptr0 | rec0) | (ptr1 | rec1) ... (ptrN | recN) ]
    
    # Leaf nodes look like this:
    #
    # [ 0 | count | rec0 | rec1 ... recN ]

    # Iterate over the tree, starting at `node'
    def _traverse(self, node):
        if node is None:
            node = self._rootnode
        with self._get_block(node) as block:
            next_node, count = block.read(b'>II')
            if next_node:
                for n in range(count):
                    ptr = block.read(b'>I')[0]
                    for e in self._traverse(ptr):
                        yield e
                    e = DSStoreEntry.read(block)
                    yield e
                for e in self._traverse(next_node):
                    yield e
            else:
                for n in range(count):
                    e = DSStoreEntry.read(block)
                    yield e

    # Display the data in `node'
    def _dump_node(self, node):
        with self._get_block(node) as block:
            next_node, count = block.read(b'>II')
            print('next: %u\ncount: %u\n' % (next_node, count))
            for n in range(count):
                if next_node:
                    ptr = block.read(b'>I')[0]
                    print('%8u ' % ptr, end=' ')
                else:
                    print('         ', end=' ')
                e = DSStoreEntry.read(block)
                print(e, ' (%u)' % e.byte_length())
            print('used: %u' % block.tell())

    # Display the data in the super block
    def _dump_super(self):
        print('root: %u\nlevels: %u\nrecords: %u\nnodes: %u\npage-size: %u' \
          % (self._rootnode, self._levels, self._records,
             self._nodes, self._page_size))

    # Splits entries across two blocks, returning one pivot
    #
    # Tries to balance the block usage across the two as best it can
    def _split2(self, blocks, entries, pointers, before, internal):
        left_block = blocks[0]
        right_block = blocks[1]
        
        count = len(entries)
        
        # Find the feasible splits
        best_split = None
        best_diff = None
        total = before[count]

        if 8 + total <= self._page_size:
            # We can use a *single* node for this
            best_split = count
        else:
            # Split into two nodes  
            for n in range(1, count - 1):
                left_size = 8 + before[n]
                right_size = 8 + total - before[n + 1]

                if left_size > self._page_size:
                    break
                if right_size > self._page_size:
                    continue
                
                diff = abs(left_size - right_size)

                if best_split is None or diff < best_diff:
                    best_split = n
                    best_diff = diff

        if best_split is None:
            return None
        
        # Write the nodes
        left_block.seek(0)
        if internal:
            next_node = pointers[best_split]
        else:
            next_node = 0
        left_block.write(b'>II', next_node, best_split)

        for n in range(best_split):
            if internal:
                left_block.write(b'>I', pointers[n])
            entries[n].write(left_block)

        left_block.zero_fill()

        if best_split == count:
            return []
        
        right_block.seek(0)
        if internal:
            next_node = pointers[count]
        else:
            next_node = 0
        right_block.write(b'>II', next_node, count - best_split - 1)

        for n in range(best_split + 1, count):
            if internal:
                right_block.write(b'>I', pointers[n])
            entries[n].write(right_block)

        right_block.zero_fill()
            
        pivot = entries[best_split]

        return [pivot]
    
    def _split(self, node, entry, right_ptr=0):
        self._nodes += 1
        self._dirty = True
        new_right = self._store.allocate(self._page_size)
        with self._get_block(node) as block, \
            self._get_block(new_right) as right_block:

            # First, measure and extract all the elements
            entry_size = entry.byte_length()
            entry_pos = None
            next_node, count = block.read(b'>II')
            if next_node:
                entry_size += 4
            pointers = []
            entries = []
            before = []
            total = 0
            for n in range(count):
                pos = block.tell()
                if next_node:
                    ptr = block.read(b'>I')[0]
                    pointers.append(ptr)
                e = DSStoreEntry.read(block)
                if e > entry:
                    entry_pos = n
                    entries.append(entry)
                    pointers.append(right_ptr)
                    before.append(total)
                    total += entry_size
                entries.append(e)
                before.append(total)
                total += block.tell() - pos
            before.append(total)
            if next_node:
                pointers.append(next_node)

            pivot = self._split2([block, right_block],
                                 entries, pointers, before,
                                 bool(next_node))[0]
            
            self._records += 1
            self._nodes += 1
            self._dirty = True

        return (pivot, new_right)

    # Allocate a new root node containing the element `pivot' and the pointers
    # `left' and `right'
    def _new_root(self, left, pivot, right):
        new_root = self._store.allocate(self._page_size)
        with self._get_block(new_root) as block:
            block.write(b'>III', right, 1, left)
            pivot.write(block)
        self._rootnode = new_root
        self._levels += 1
        self._nodes += 1
        self._dirty = True

    # Insert an entry into an inner node; `path' is the path from the root
    # to `node', not including `node' itself.  `right_ptr' is the new node
    # pointer (inserted to the RIGHT of `entry')
    def _insert_inner(self, path, node, entry, right_ptr):
        with self._get_block(node) as block:
            next_node, count = block.read(b'>II')
            insert_pos = None
            insert_ndx = None
            n = 0
            while n < count:
                pos = block.tell()
                ptr = block.read(b'>I')[0]
                e = DSStoreEntry.read(block)
                if e == entry:
                    if n == count - 1:
                        right_ptr = next_node
                        next_node = ptr
                        block_seek(pos)
                    else:
                        right_ptr = block.read(b'>I')[0]
                        block.seek(pos + 4)
                    insert_pos = pos
                    insert_ndx = n
                    block.delete(e.byte_length() + 4)
                    count -= 1
                    self._records += 1
                    self._dirty = True
                    continue
                elif insert_pos is None and e > entry:
                    insert_pos = pos
                    insert_ndx = n
                n += 1
            if insert_pos is None:
                insert_pos = block.tell()
                insert_ndx = count
            remaining = self._page_size - block.tell()

            if remaining < entry.byte_length() + 4:
                pivot, new_right = self._split(node, entry, right_ptr)
                if path:
                    self._insert_inner(path[:-1], path[-1], pivot, new_right)
                else:
                    self._new_root(node, pivot, new_right)
            else:
                if insert_ndx == count:
                    block.seek(insert_pos)
                    block.write(b'>I', next_node)
                    entry.write(block)
                    next_node = right_ptr
                else:
                    block.seek(insert_pos + 4)
                    entry.write(block, True)
                    block.insert('>I', right_ptr)
                block.seek(0)
                count += 1
                block.write(b'>II', next_node, count)
                self._records += 1
                self._dirty = True

    # Insert `entry' into the leaf node `node'
    def _insert_leaf(self, path, node, entry):
        with self._get_block(node) as block:
            next_node, count = block.read(b'>II')
            insert_pos = None
            insert_ndx = None
            n = 0
            while n < count:
                pos = block.tell()
                e = DSStoreEntry.read(block)
                if e == entry:
                    insert_pos = pos
                    insert_ndx = n
                    block.seek(pos)
                    block.delete(e.byte_length())
                    count -= 1
                    self._records += 1
                    self._dirty = True
                    continue
                elif insert_pos is None and e > entry:
                    insert_pos = pos
                    insert_ndx = n
                n += 1
            if insert_pos is None:
                insert_pos = block.tell()
                insert_ndx = count
            remaining = self._page_size - block.tell()

            if remaining < entry.byte_length():
                pivot, new_right = self._split(node, entry)
                if path:
                    self._insert_inner(path[:-1], path[-1], pivot, new_right)
                else:
                    self._new_root(node, pivot, new_right)
            else:
                block.seek(insert_pos)
                entry.write(block, True)
                block.seek(0)
                count += 1
                block.write(b'>II', next_node, count)
                self._records += 1
                self._dirty = True

    def insert(self, entry):
        """Insert ``entry`` (which should be a :class:`DSStoreEntry`)
        into the B-Tree."""
        path = []
        node = self._rootnode
        while True:
            with self._get_block(node) as block:
                next_node, count = block.read(b'>II')
                if next_node:
                    for n in range(count):
                        ptr = block.read(b'>I')[0]
                        e = DSStoreEntry.read(block)
                        if entry < e:
                            next_node = ptr
                            break
                        elif entry == e:
                            # If we find an existing entry the same, replace it
                            self._insert_inner(path, node, entry, None)
                            return
                    path.append(node)
                    node = next_node
                else:
                    self._insert_leaf(path, node, entry)
                    return

    # Return usage information for the specified `node'
    def _block_usage(self, node):
        with self._get_block(node) as block:
            next_node, count = block.read(b'>II')

            for n in range(count):
                if next_node:
                    ptr = block.read(b'>I')[0]
                e = DSStoreEntry.read(block)

            used = block.tell()

        return (count, used)

    # Splits entries across three blocks, returning two pivots
    def _split3(self, blocks, entries, pointers, before, internal):
        count = len(entries)

        # Find the feasible splits
        best_split = None
        best_diff = None
        total = before[count]
        for n in range(1, count - 3):
            left_size = 8 + before[n]
            remaining = 16 + total - before[n + 1]

            if left_size > self._page_size:
                break
            if remaining > 2 * self._page_size:
                continue

            for m in range(n + 2, count - 1):
                mid_size = 8 + before[m] - before[n + 1]
                right_size = 8 + total - before[m + 1]

                if mid_size > self._page_size:
                    break
                if right_size > self._page_size:
                    continue

                diff = abs(left_size - mid_size) * abs(right_size - mid_size)
                
                if best_split is None or diff < best_diff:
                    best_split = (n, m, count)
                    best_diff = diff

        if best_split is None:
            return None
        
        # Write the nodes
        prev_split = -1
        for block, split in zip(blocks, best_split):
            block.seek(0)
            if internal:
                next_node = pointers[split]
            else:
                next_node = 0
            block.write(b'>II', next_node, split)

            for n in range(prev_split + 1, split):
                if internal:
                    block.write(b'>I', pointers[n])
                entries[n].write(block)

            block.zero_fill()
            
            prev_split = split

        return (entries[best_split[0]], entries[best_split[1]])

    # Extract all of the entries from the specified list of `blocks',
    # separating them by the specified `pivots'.  Also computes the
    # amount of space used before each entry.
    def _extract(self, blocks, pivots):
        pointers = []
        entries = []
        before = []
        total = 0
        ppivots = pivots + [None]
        for b,p in zip(blocks, ppivots):
            b.seek(0)
            next_node, count = b.read(b'>II')
            for n in range(count):
                pos = b.tell()
                if next_node:
                    ptr = b.read(b'>I')[0]
                    pointers.append(ptr)
                e = DSStoreEntry.read(b)
                entries.append(e)
                before.append(total)
                total += b.tell() - pos
            if next_node:
                pointers.append(next_node)
            if p:
                entries.append(p)
                before.append(total)
                total += p.byte_length()
                if next_node:
                    total += 4
        before.append(total)

        return (entries, pointers, before)

    # Rebalance the specified `node', whose path from the root is `path'.
    def _rebalance(self, path, node):
        # Can't rebalance the root
        if not path:
            return

        with self._get_block(node) as block:
            next_node, count = block.read(b'>II')
            
            with self._get_block(path[-1]) as parent:
                # Find the left and right siblings and respective pivots
                parent_next, parent_count = parent.read(b'>II')
                left_pos = None
                left_node = None
                left_pivot = None
                node_pos = None
                right_pos = None
                right_node = None
                right_pivot = None
                prev_e = prev_ptr = prev_pos = None
                for n in range(parent_count):
                    pos = parent.tell()
                    ptr = parent.read(b'>I')[0]
                    e = DSStoreEntry.read(parent)

                    if ptr == node:
                        node_pos = pos
                        right_pivot = e
                        left_pos = prev_pos
                        left_pivot = prev_e
                        left_node = prev_ptr
                    elif prev_ptr == node:
                        right_node = ptr
                        right_pos = pos
                        break
                
                    prev_e = e
                    prev_ptr = ptr
                    prev_pos = pos

                if parent_next == node:
                    node_pos = parent.tell()
                    left_pos = prev_pos
                    left_pivot = prev_e
                    left_node = prev_ptr
                elif right_node is None:
                    right_node = parent_next
                    right_pos = parent.tell()

                parent_used = parent.tell()
            
            if left_node and right_node:
                with self._get_block(left_node) as left, \
                    self._get_block(right_node) as right:
                    blocks = [left, block, right]
                    pivots = [left_pivot, right_pivot]
                    
                    entries, pointers, before = self._extract(blocks, pivots)

                    # If there's a chance that we could use two pages instead
                    # of three, go for it
                    pivots = self._split2(blocks, entries, pointers,
                                           before, bool(next_node))
                    if pivots is None:
                        ptrs = [left_node, node, right_node]
                        pivots = self._split3(blocks, entries, pointers,
                                               before, bool(next_node))
                    else:
                        if pivots:
                            ptrs = [left_node, node]
                        else:
                            ptrs = [left_node]
                            self._store.release(node)
                            self._nodes -= 1
                            node = left_node
                        self._store.release(right_node)
                        self._nodes -= 1
                        self._dirty = True
                        
                    # Remove the pivots from the parent
                    with self._get_block(path[-1]) as parent:
                        if right_node == parent_next:
                            parent.seek(left_pos)
                            parent.delete(right_pos - left_pos)
                            parent_next = left_node
                        else:
                            parent.seek(left_pos + 4)
                            parent.delete(right_pos - left_pos)
                        parent.seek(0)
                        parent_count -= 2
                        parent.write(b'>II', parent_next, parent_count)
                        self._records -= 2
                        
                    # Replace with those in pivots
                    for e,rp in zip(pivots, ptrs[1:]):
                        self._insert_inner(path[:-1], path[-1], e, rp)
            elif left_node:
                with self._get_block(left_node) as left:
                    blocks = [left, block]
                    pivots = [left_pivot]

                    entries, pointers, before = self._extract(blocks, pivots)

                    pivots = self._split2(blocks, entries, pointers,
                                           before, bool(next_node))

                    # Remove the pivot from the parent
                    with self._get_block(path[-1]) as parent:
                        if node == parent_next:
                            parent.seek(left_pos)
                            parent.delete(node_pos - left_pos)
                            parent_next = left_node
                        else:
                            parent.seek(left_pos + 4)
                            parent.delete(node_pos - left_pos)
                        parent.seek(0)
                        parent_count -= 1
                        parent.write(b'>II', parent_next, parent_count)
                        self._records -= 1

                    # Replace the pivot
                    if pivots:
                        self._insert_inner(path[:-1], path[-1], pivots[0], node)
            elif right_node:
                with self._get_block(right_node) as right:
                    blocks = [block, right]
                    pivots = [right_pivot]

                    entries, pointers, before = self._extract(blocks, pivots)

                    pivots = self._split2(blocks, entries, pointers,
                                           before, bool(next_node))

                    # Remove the pivot from the parent
                    with self._get_block(path[-1]) as parent:
                        if right_node == parent_next:
                            parent.seek(pos)
                            parent.delete(right_pos - node_pos)
                            parent_next = node
                        else:
                            parent.seek(pos + 4)
                            parent.delete(right_pos - node_pos)
                        parent.seek(0)
                        parent_count -= 1
                        parent.write(b'>II', parent_next, parent_count)
                        self._records -= 1

                    # Replace the pivot
                    if pivots:
                        self._insert_inner(path[:-1], path[-1], pivots[0],
                                           right_node)

        if not path and not parent_count:
            self._store.release(path[-1])
            self._nodes -= 1
            self._dirty = True
            self._rootnode = node
        else:
            count, used = self._block_usage(path[-1])
    
            if used < self._page_size // 2:
                self._rebalance(path[:-1], path[-1])

    # Delete from the leaf node `node'.  `filename_lc' has already been
    # lower-cased.
    def _delete_leaf(self, node, filename_lc, code):
        found = False
        
        with self._get_block(node) as block:
            next_node, count = block.read(b'>II')

            for n in range(count):
                pos = block.tell()
                e = DSStoreEntry.read(block)
                if e.filename.lower() == filename_lc \
                  and (code is None or e.code == code):
                    block.seek(pos)
                    block.delete(e.byte_length())
                    found = True
                    
                    # This does not affect the loop; THIS IS NOT A BUG
                    count -= 1

                    self._records -= 1
                    self._dirty = True
                    
            if found:
                used = block.tell()
                
                block.seek(0)
                block.write(b'>II', next_node, count)
            
                return used < self._page_size // 2
            else:
                return False

    # Remove the largest entry from the subtree starting at `node' (with
    # path from root `path').  Returns a tuple (rebalance, entry) where
    # rebalance is either None if no rebalancing is required, or a
    # (path, node) tuple giving the details of the node to rebalance.
    def _take_largest(self, path, node):
        path = list(path)
        rebalance = None
        while True:
            with self._get_block(node) as block:
                next_node, count = block.read(b'>II')

                if next_node:
                    path.append(node)
                    node = next_node
                    continue

                for n in range(count):
                    pos = block.tell()
                    e = DSStoreEntry.read(block)

                count -= 1
                block.seek(0)
                block.write(b'>II', next_node, count)

                if pos < self._page_size // 2:
                    rebalance = (path, node)
                break

        return rebalance, e

    # Delete an entry from an inner node, `node'
    def _delete_inner(self, path, node, filename_lc, code):
        rebalance = False
        
        with self._get_block(node) as block:
            next_node, count = block.read(b'>II')

            for n in range(count):
                pos = block.tell()
                ptr = block.read(b'>I')[0]
                e = DSStoreEntry.read(block)
                if e.filename.lower() == filename_lc \
                  and (code is None or e.code == code):
                    # Take the largest from the left subtree
                    rebalance, largest = self._take_largest(path, ptr)

                    # Delete this entry
                    if n == count - 1:
                        right_ptr = next_node
                        next_node = ptr
                        block.seek(pos)
                    else:
                        right_ptr = block.read(b'>I')[0]
                        block.seek(pos + 4)
                        
                    block.delete(e.byte_length() + 4)

                    count -= 1
                    block.seek(0)
                    block.write(b'>II', next_node, count)

                    self._records -= 1
                    self._dirty = True
                    
                    break
                    
        # Replace the pivot value
        self._insert_inner(path, node, largest, right_ptr)

        # Rebalance from the node we stole from
        if rebalance:
            self._rebalance(rebalance[0], rebalance[1])
            return True
        return False

    def delete(self, filename, code):
        """Delete an item, identified by ``filename`` and ``code``
        from the B-Tree."""
        if isinstance(filename, DSStoreEntry):
            code = filename.code
            filename = filename.filename

        # If we're deleting *every* node for "filename", we must recurse
        if code is None:
            ###TODO: Fix this so we can do bulk deletes
            raise ValueError('You must delete items individually.  Sorry')

        # Otherwise, we're deleting *one* specific node
        filename_lc = filename.lower()
        path = []
        node = self._rootnode
        while True:
            with self._get_block(node) as block:
                next_node, count = block.read(b'>II')
                if next_node:
                    for n in range(count):
                        ptr = block.read(b'>I')[0]
                        e = DSStoreEntry.read(block)
                        e_lc = e.filename.lower()
                        if filename_lc < e_lc \
                            or (filename_lc == e_lc and code < e.code):
                            next_node = ptr
                            break
                        elif filename_lc == e_lc and code == e.code:
                            self._delete_inner(path, node, filename_lc, code)
                            return
                    path.append(node)
                    node = next_node
                else:
                    if self._delete_leaf(node, filename_lc, code):
                        self._rebalance(path, node)
                    return

    # Find implementation
    def _find(self, node, filename_lc, code=None):
        if not isinstance(code, bytes):
            code = code.encode('latin_1')
        with self._get_block(node) as block:
            next_node, count = block.read(b'>II')
            if next_node:
                for n in range(count):
                    ptr = block.read(b'>I')[0]
                    e = DSStoreEntry.read(block)
                    if filename_lc < e.filename.lower():
                        for e in self._find(ptr, filename_lc, code):
                            yield e
                        return
                    elif filename_lc == e.filename.lower():
                        if code is None or (code and code < e.code):
                            for e in self._find(ptr, filename_lc, code):
                                yield e
                        if code is None or code == e.code:
                            yield e
                        elif code < e.code:
                            return
                for e in self._find(next_node, filename_lc, code):
                    yield e
            else:
                for n in range(count):
                    e = DSStoreEntry.read(block)
                    if filename_lc == e.filename.lower():
                        if code is None or code == e.code:
                            yield e
                        elif code < e.code:
                            return
                        
    def find(self, filename, code=None):
        """Returns a generator that will iterate over matching entries in
        the B-Tree."""
        if isinstance(filename, DSStoreEntry):
            code = filename.code
            filename = filename.filename

        filename_lc = filename.lower()
        
        return self._find(self._rootnode, filename_lc, code)

    def __len__(self):
        return self._records

    def __iter__(self):
        return self._traverse(self._rootnode)

    class Partial(object):
        """This is used to implement indexing."""
        def __init__(self, store, filename):
            self._store = store
            self._filename = filename

        def __getitem__(self, code):
            if code is None:
                raise KeyError('no such key - [%s][None]' % self._filename)

            if not isinstance(code, bytes):
                code = code.encode('latin_1')

            try:
                item = next(self._store.find(self._filename, code))
            except StopIteration:
                raise KeyError('no such key - [%s][%s]' % (self._filename,
                               code))

            if not isinstance(item.type, (bytes, str, unicode)):
                return item.value
            
            return (item.type, item.value)
            
        def __setitem__(self, code, value):
            if code is None:
                raise KeyError('bad key - [%s][None]' % self._filename)

            if not isinstance(code, bytes):
                code = code.encode('latin_1')

            codec = codecs.get(code, None)
            if codec:
                entry_type = codec
                entry_value = value
            else:
                entry_type = value[0]
                entry_value = value[1]
            
            self._store.insert(DSStoreEntry(self._filename, code,
                                             entry_type, entry_value))

        def __delitem__(self, code):
            if code is None:
                raise KeyError('no such key - [%s][None]' % self._filename)

            self._store.delete(self._filename, code)

        def __iter__(self):
            for item in self._store.find(self._filename):
                yield item

    def __getitem__(self, filename):
        return self.Partial(self, filename)
    
from .core import build_dmg

__all__ = ['dmgbuild']
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from Quartz import *
import math

_REMOVABLE_DISK_PATH = '/System/Library/Extensions/IOStorageFamily.kext/Contents/Resources/Removable.icns'

def badge_disk_icon(badge_file, output_file):
    # Load the Removable disk icon
    url = CFURLCreateWithFileSystemPath(None, _REMOVABLE_DISK_PATH,
                                        kCFURLPOSIXPathStyle, False)
    backdrop = CGImageSourceCreateWithURL(url, None)
    backdropCount = CGImageSourceGetCount(backdrop)
    
    # Load the badge
    url = CFURLCreateWithFileSystemPath(None, badge_file,
                                        kCFURLPOSIXPathStyle, False)
    badge = CGImageSourceCreateWithURL(url, None)
    assert badge is not None, 'Unable to process image file: %s' % badge_file
    badgeCount = CGImageSourceGetCount(badge)
    
    # Set up a destination for our target
    url = CFURLCreateWithFileSystemPath(None, output_file,
                                        kCFURLPOSIXPathStyle, False)
    target = CGImageDestinationCreateWithURL(url, 'com.apple.icns',
                                             backdropCount, None)

    # Get the RGB colorspace
    rgbColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)

    # Scale
    scale = 1.0
    
    # Perspective transform
    corners = ((0.2, 0.95), (0.8, 0.95), (0.85, 0.35), (0.15, 0.35))

    # Translation
    position = (0.5, 0.5)

    for n in range(backdropCount):
        props = CGImageSourceCopyPropertiesAtIndex(backdrop, n, None)
        width = props['PixelWidth']
        height = props['PixelHeight']
        dpi = props['DPIWidth']
        depth = props['Depth']
        
        # Choose the best sized badge image
        bestWidth = None
        bestHeight = None
        bestBadge = None
        bestDepth = None
        bestDPI = None
        for m in range(badgeCount):
            badgeProps = CGImageSourceCopyPropertiesAtIndex(badge, m, None)
            badgeWidth = badgeProps['PixelWidth']
            badgeHeight = badgeProps['PixelHeight']
            badgeDPI = badgeProps['DPIWidth']
            badgeDepth = badgeProps['Depth']
            
            if bestBadge is None or (badgeWidth <= width
                                    and (bestWidth > width
                                        or badgeWidth > bestWidth
                                        or (badgeWidth == bestWidth
                                            and badgeDPI == dpi
                                            and badgeDepth <= depth
                                            and (bestDepth is None
                                                 or badgeDepth > bestDepth)))):
                bestBadge = m
                bestWidth = badgeWidth
                bestHeight = badgeHeight
                bestDPI = badgeDPI
                bestDepth = badgeDepth

        badgeImage = CGImageSourceCreateImageAtIndex(badge, bestBadge, None)
        badgeCI = CIImage.imageWithCGImage_(badgeImage)
    
        backgroundImage = CGImageSourceCreateImageAtIndex(backdrop, n, None)
        backgroundCI = CIImage.imageWithCGImage_(backgroundImage)
    
        compositor = CIFilter.filterWithName_('CISourceOverCompositing')
        lanczos = CIFilter.filterWithName_('CILanczosScaleTransform')
        perspective = CIFilter.filterWithName_('CIPerspectiveTransform')
        transform = CIFilter.filterWithName_('CIAffineTransform')
    
        lanczos.setValue_forKey_(badgeCI, kCIInputImageKey)
        lanczos.setValue_forKey_(scale * float(width)/bestWidth, kCIInputScaleKey)
        lanczos.setValue_forKey_(1.0, kCIInputAspectRatioKey)

        topLeft = (width * scale * corners[0][0],
                   width * scale * corners[0][1])
        topRight = (width * scale * corners[1][0],
                    width * scale * corners[1][1])
        bottomRight = (width * scale * corners[2][0],
                       width * scale * corners[2][1])
        bottomLeft = (width * scale * corners[3][0],
                      width * scale * corners[3][1])

        out = lanczos.valueForKey_(kCIOutputImageKey)
        if width >= 16:
            perspective.setValue_forKey_(out, kCIInputImageKey)
            perspective.setValue_forKey_(CIVector.vectorWithX_Y_(*topLeft),
                                         'inputTopLeft')
            perspective.setValue_forKey_(CIVector.vectorWithX_Y_(*topRight),
                                         'inputTopRight')
            perspective.setValue_forKey_(CIVector.vectorWithX_Y_(*bottomRight),
                                         'inputBottomRight')
            perspective.setValue_forKey_(CIVector.vectorWithX_Y_(*bottomLeft),
                                         'inputBottomLeft')
            out = perspective.valueForKey_(kCIOutputImageKey)

        tfm = NSAffineTransform.transform()
        tfm.translateXBy_yBy_(math.floor((position[0] - 0.5 * scale) * width),
                              math.floor((position[1] - 0.5 * scale) * height))

        transform.setValue_forKey_(out, kCIInputImageKey)
        transform.setValue_forKey_(tfm, 'inputTransform')
        out = transform.valueForKey_(kCIOutputImageKey)
    
        compositor.setValue_forKey_(out, kCIInputImageKey)
        compositor.setValue_forKey_(backgroundCI, kCIInputBackgroundImageKey)

        result = compositor.valueForKey_(kCIOutputImageKey)

        cgContext = CGBitmapContextCreate(None,
                                        width,
                                        height,
                                        8,
                                        0,
                                        rgbColorSpace,
                                        kCGImageAlphaPremultipliedLast)
        context = CIContext.contextWithCGContext_options_(cgContext, None)

        context.drawImage_inRect_fromRect_(result,
                                           ((0, 0), (width, height)),
                                           ((0, 0), (width, height)))

        image = CGBitmapContextCreateImage(cgContext)

        CGImageDestinationAddImage(target, image, props)

    CGImageDestinationFinalize(target)
    
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import re
import math

class Color (object):
    def to_rgb(self):
        raise Exception('Must implement to_rgb() in subclasses')

class RGB (Color):
    def __init__(self, r, g, b):
        self.r = r
        self.g = g
        self.b = b

    def to_rgb(self):
        return self
    
class HSL (Color):
    def __init__(self, h, s, l):
        self.h = h
        self.s = s
        self.l = l

    @staticmethod
    def _hue_to_rgb(t1, t2, hue):
        if hue < 0:
            hue += 6
        elif hue >= 6:
            hue -= 6

        if hue < 1:
            return (t2 - t1) * hue + t1
        elif hue < 3:
            return t2
        elif hue < 4:
            return (t2 - t1) * (4 - hue) + t1
        else:
            return t1
        
    def to_rgb(self):
        hue = self.h / 60.0
        if self.l <= 0.5:
            t2 = self.l * (self.s + 1)
        else:
            t2 = self.l + self.s - (self.l * self.s)
        t1 = self.l * 2 - t2
        r = self._hue_to_rgb(t1, t2, hue + 2)
        g = self._hue_to_rgb(t1, t2, hue)
        b = self._hue_to_rgb(t1, t2, hue - 2)
        return RGB(r, g, b)
    
class HWB (Color):
    def __init__(self, h, w, b):
        self.h = h
        self.w = w
        self.b = b

    @staticmethod
    def _hue_to_rgb(hue):
        if hue < 0:
            hue += 6
        elif hue >= 6:
            hue -= 6

        if hue < 1:
            return hue
        elif hue < 3:
            return 1
        elif hue < 4:
            return (4 - hue)
        else:
            return 0
 
    def to_rgb(self):
        hue = self.h / 60.0
        t1 = 1 - self.w - self.b
        r = self._hue_to_rgb(hue + 2) * t1 + self.w
        g = self._hue_to_rgb(hue) * t1 + self.w
        b = self._hue_to_rgb(hue - 2) * t1 + self.w
        return RGB(r, g, b)
    
class CMYK (Color):
    def __init__(self, c, m, y, k):
        self.c = c
        self.m = m
        self.y = y
        self.k = k

    def to_rgb(self):
        r = 1.0 - min(1.0, self.c + self.k)
        g = 1.0 - min(1.0, self.m + self.k)
        b = 1.0 - min(1.0, self.y + self.k)
        return RGB(r, g, b)
    
class Gray (Color):
    def __init__(self, g):
        self.g = g

    def to_rgb(self):
        return RGB(g, g, g)
    
_x11_colors = {
	'aliceblue': (240, 248, 255),
    'antiquewhite': (250, 235, 215),
    'aqua':	( 0, 255, 255),
    'aquamarine': (127, 255, 212),
    'azure': (240, 255, 255),
    'beige': (245, 245, 220),
    'bisque': (255, 228, 196),
    'black': ( 0, 0, 0),
    'blanchedalmond': (255, 235, 205),
    'blue': ( 0, 0, 255),
    'blueviolet': (138, 43, 226),
    'brown': (165, 42, 42),
    'burlywood': (222, 184, 135),
    'cadetblue': ( 95, 158, 160),
    'chartreuse': (127, 255, 0),
    'chocolate': (210, 105, 30),
    'coral': (255, 127, 80),
    'cornflowerblue': (100, 149, 237),
    'cornsilk': (255, 248, 220),
    'crimson': (220, 20, 60),
    'cyan': ( 0, 255, 255),
    'darkblue': ( 0, 0, 139),
    'darkcyan': ( 0, 139, 139),
    'darkgoldenrod': (184, 134, 11),
    'darkgray': (169, 169, 169),
    'darkgreen': ( 0, 100, 0),
    'darkgrey': (169, 169, 169),
    'darkkhaki': (189, 183, 107),
    'darkmagenta': (139, 0, 139),
    'darkolivegreen': ( 85, 107, 47),
    'darkorange': (255, 140, 0),
    'darkorchid': (153, 50, 204),
    'darkred': (139, 0, 0),
    'darksalmon': (233, 150, 122),
    'darkseagreen': (143, 188, 143),
    'darkslateblue': ( 72, 61, 139),
    'darkslategray': ( 47, 79, 79),
    'darkslategrey': ( 47, 79, 79),
    'darkturquoise': ( 0, 206, 209),
    'darkviolet': (148, 0, 211),
    'deeppink': (255, 20, 147),
    'deepskyblue': ( 0, 191, 255),
    'dimgray': (105, 105, 105),
    'dimgrey': (105, 105, 105),
    'dodgerblue': ( 30, 144, 255),
    'firebrick': (178, 34, 34),
    'floralwhite': (255, 250, 240),
    'forestgreen': ( 34, 139, 34),
    'fuchsia': (255, 0, 255),
    'gainsboro': (220, 220, 220),
    'ghostwhite': (248, 248, 255),
    'gold': (255, 215, 0),
    'goldenrod': (218, 165, 32),
    'gray': (128, 128, 128),
    'grey': (128, 128, 128),
    'green': ( 0, 128, 0),
    'greenyellow': (173, 255, 47),
    'honeydew': (240, 255, 240),
    'hotpink': (255, 105, 180),
    'indianred': (205, 92, 92),
    'indigo': ( 75, 0, 130),
    'ivory': (255, 255, 240),
    'khaki': (240, 230, 140),
    'lavender': (230, 230, 250),
    'lavenderblush': (255, 240, 245),
    'lawngreen': (124, 252, 0),
    'lemonchiffon': (255, 250, 205),
    'lightblue': (173, 216, 230),
    'lightcoral': (240, 128, 128),
    'lightcyan': (224, 255, 255),
    'lightgoldenrodyellow': (250, 250, 210),
    'lightgray': (211, 211, 211),
    'lightgreen': (144, 238, 144),
    'lightgrey': (211, 211, 211),
    'lightpink': (255, 182, 193),
    'lightsalmon': (255, 160, 122),
    'lightseagreen': ( 32, 178, 170),
    'lightskyblue': (135, 206, 250),
    'lightslategray': (119, 136, 153),
    'lightslategrey': (119, 136, 153),
    'lightsteelblue': (176, 196, 222),
    'lightyellow': (255, 255, 224),
    'lime': ( 0, 255, 0),
    'limegreen': ( 50, 205, 50),
    'linen': (250, 240, 230),
    'magenta': (255, 0, 255),
    'maroon': (128, 0, 0),
    'mediumaquamarine': (102, 205, 170),
    'mediumblue': ( 0, 0, 205),
    'mediumorchid': (186, 85, 211),
    'mediumpurple': (147, 112, 219),
    'mediumseagreen': ( 60, 179, 113),
    'mediumslateblue': (123, 104, 238),
    'mediumspringgreen': ( 0, 250, 154),
    'mediumturquoise': ( 72, 209, 204),
    'mediumvioletred': (199, 21, 133),
    'midnightblue': ( 25, 25, 112),
    'mintcream': (245, 255, 250),
    'mistyrose': (255, 228, 225),
    'moccasin': (255, 228, 181),
    'navajowhite': (255, 222, 173),
    'navy': ( 0, 0, 128),
    'oldlace': (253, 245, 230),
    'olive': (128, 128, 0),
    'olivedrab': (107, 142, 35),
    'orange': (255, 165, 0),
    'orangered': (255, 69, 0),
    'orchid': (218, 112, 214),
    'palegoldenrod': (238, 232, 170),
    'palegreen': (152, 251, 152),
    'paleturquoise': (175, 238, 238),
    'palevioletred': (219, 112, 147),
    'papayawhip': (255, 239, 213),
    'peachpuff': (255, 218, 185),
    'peru': (205, 133, 63),
    'pink': (255, 192, 203),
    'plum': (221, 160, 221),
    'powderblue': (176, 224, 230),
    'purple': (128, 0, 128),
    'red': (255, 0, 0),
    'rosybrown': (188, 143, 143),
    'royalblue': ( 65, 105, 225),
    'saddlebrown': (139, 69, 19),
    'salmon': (250, 128, 114),
    'sandybrown': (244, 164, 96),
    'seagreen': ( 46, 139, 87),
    'seashell': (255, 245, 238),
    'sienna': (160, 82, 45),
    'silver': (192, 192, 192),
    'skyblue': (135, 206, 235),
    'slateblue': (106, 90, 205),
    'slategray': (112, 128, 144),
    'slategrey': (112, 128, 144),
    'snow': (255, 250, 250),
    'springgreen': ( 0, 255, 127),
    'steelblue': ( 70, 130, 180),
    'tan': (210, 180, 140),
    'teal': ( 0, 128, 128),
    'thistle': (216, 191, 216),
    'tomato': (255, 99, 71),
    'turquoise': ( 64, 224, 208),
    'violet': (238, 130, 238),
    'wheat': (245, 222, 179),
    'white': (255, 255, 255),
    'whitesmoke': (245, 245, 245),
    'yellow': (255, 255, 0),
    'yellowgreen': (154, 205, 50)
    }
    
_ws_re = re.compile('\s+')
_token_re = re.compile('[A-Za-z_][A-Za-z0-9_]*')
_hex_re = re.compile('#([0-9a-f]{3}(?:[0-9a-f]{3})?)$')
_number_re = re.compile('[0-9]*(\.[0-9]*)')

class ColorParser (object):
    def __init__(self, s):
        self._string = s
        self._pos = 0

    def skipws(self):
        m = _ws_re.match(self._string, self._pos)
        if m:
            self._pos = m.end(0)
        
    def expect(self, s, context=''):
        if len(self._string) - self._pos < len(s) \
          or self._string[self._pos:self._pos + len(s)] != s:
            raise ValueError('bad color "%s" - expected "%s"%s'
                            % (self._string, s, context))
        self._pos += len(s)

    def expectEnd(self):
        if self._pos != len(self._string):
            raise ValueError('junk at end of color "%s"' % self._string)

    def getToken(self):
        m = _token_re.match(self._string, self._pos)
        if m:
            token = m.group(0)

            self._pos = m.end(0)
            return token
        return None
        
    def parseNumber(self, context=''):
        m = _number_re.match(self._string, self._pos)
        if m:
            self._pos = m.end(0)
            return float(m.group(0))
        raise ValueError('bad color "%s" - expected a number%s'
                         % (self._string, context))
    
    def parseColor(self):
        self.skipws()

        token = self.getToken()
        if token:
            if token == 'rgb':
                return self.parseRGB()
            elif token == 'hsl':
                return self.parseHSL()
            elif token == 'hwb':
                return self.parseHWB()
            elif token == 'cmyk':
                return self.parseCMYK()
            elif token == 'gray' or token == 'grey':
                return self.parseGray()

            try:
                r, g, b = _x11_colors[token]
            except KeyError:
                raise ValueError('unknown color name "%s"' % token)

            self.expectEnd()

            return RGB(r / 255.0, g / 255.0, b / 255.0)
        
        m = _hex_re.match(self._string, self._pos)
        if m:
            hrgb = m.group(1)

            if len(hrgb) == 3:
                r = int('0x' + 2 * hrgb[0], 16)
                g = int('0x' + 2 * hrgb[1], 16)
                b = int('0x' + 2 * hrgb[2], 16)
            else:
                r = int('0x' + hrgb[0:2], 16)
                g = int('0x' + hrgb[2:4], 16)
                b = int('0x' + hrgb[4:6], 16)

            self._pos = m.end(0)
            self.skipws()

            self.expectEnd()

            return RGB(r / 255.0, g / 255.0, b / 255.0)

        raise ValueError('bad color syntax "%s"' % self._string)

    def parseRGB(self):
        self.expect('(', 'after "rgb"')
        self.skipws()

        r = self.parseValue()

        self.skipws()
        self.expect(',', 'in "rgb"')
        self.skipws()

        g = self.parseValue()

        self.skipws()
        self.expect(',', 'in "rgb"')
        self.skipws()

        b = self.parseValue()

        self.skipws()
        self.expect(')', 'at end of "rgb"')

        self.skipws()
        self.expectEnd()

        return RGB(r, g, b)
        
    def parseHSL(self):
        self.expect('(', 'after "hsl"')
        self.skipws()

        h = self.parseAngle()

        self.skipws()
        self.expect(',', 'in "hsl"')
        self.skipws()

        s = self.parseValue()

        self.skipws()
        self.expect(',', 'in "hsl"')
        self.skipws()

        l = self.parseValue()

        self.skipws()
        self.expect(')', 'at end of "hsl"')

        self.skipws()
        self.expectEnd()

        return HSL(h, s, l)

    def parseHWB(self):
        self.expect('(', 'after "hwb"')
        self.skipws()

        h = self.parseAngle()

        self.skipws()
        self.expect(',', 'in "hwb"')
        self.skipws()

        w = self.parseValue()

        self.skipws()
        self.expect(',', 'in "hwb"')
        self.skipws()

        b = self.parseValue()

        self.skipws()
        self.expect(')', 'at end of "hwb"')

        self.skipws()
        self.expectEnd()

        return HWB(h, w, b)

    def parseCMYK(self):
        self.expect('(', 'after "cmyk"')
        self.skipws()

        c = self.parseValue()

        self.skipws()
        self.expect(',', 'in "cmyk"')
        self.skipws()

        m = self.parseValue()

        self.skipws()
        self.expect(',', 'in "cmyk"')
        self.skipws()

        y = self.parseValue()

        self.skipws()
        self.expect(',', 'in "cmyk"')
        self.skipws()

        k = self.parseValue()

        self.skipws()
        self.expect(')', 'at end of "cmyk"')

        self.skipws()
        self.expectEnd()

        return CMYK(c, m, y, k)

    def parseGray(self):
        self.expect('(', 'after "gray"')
        self.skipws()

        g = self.parseValue()

        self.skipws()
        self.expect(')', 'at end of "gray')

        self.skipws()
        self.expectEnd()

        return Gray(g)

    def parseValue(self):
        n = self.parseNumber()
        self.skipws()
        if self._string[self._pos] == '%':
            n = n / 100.0
            self.pos += 1
        return n
    
    def parseAngle(self):
        n = self.parseNumber()
        self.skipws()
        tok = self.getToken()
        if tok == 'rad':
            n = n * 180.0 / math.pi
        elif tok == 'grad' or tok == 'gon':
            n = n * 0.9
        elif tok != 'deg':
            raise ValueError('bad angle unit "%s"' % tok)
        return n

_color_re = re.compile('\s*(#|rgb|hsl|hwb|cmyk|gray|grey|%s)'
                       % '|'.join(_x11_colors.keys()))
def isAColor(s):
    return _color_re.match(s)

def parseColor(s):
    return ColorParser(s).parseColor()
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import json
import os
import pkg_resources
import re
import shutil
import subprocess
import sys
import tempfile
import tokenize

try:
    {}.iteritems
    iteritems = lambda x: x.iteritems()
    iterkeys = lambda x: x.iterkeys()
except AttributeError:
    iteritems = lambda x: x.items()
    iterkeys = lambda x: x.keys()
try:
    unicode
except NameError:
    unicode = str

import biplist
from mac_alias import *
from ds_store import *

from . import colors

try:
    from . import badge
except ImportError:
    badge = None

_hexcolor_re = re.compile(r'#[0-9a-f]{3}(?:[0-9a-f]{3})?')

class DMGError(Exception):
    pass

def hdiutil(cmd, *args, **kwargs):
    plist = kwargs.get('plist', True)
    all_args = ['/usr/bin/hdiutil', cmd]
    all_args.extend(args)
    if plist:
        all_args.append('-plist')
    p = subprocess.Popen(all_args, stdout=subprocess.PIPE, close_fds=True)
    output, errors = p.communicate()
    if plist:
        results = biplist.readPlistFromString(output)
    else:
        results = output
    retcode = p.wait()
    return retcode, results

# On Python 2 we can just execfile() it, but Python 3 deprecated that
def load_settings(filename, settings):
    if sys.version_info[0] == 2:
        execfile(filename, settings, settings)
    else:
        encoding = 'utf-8'
        with open(filename, 'rb') as fp:
            try:
                encoding = tokenize.detect_encoding(fp.readline)[0]
            except SyntaxError:
                pass

        with open(filename, 'r', encoding=encoding) as fp:
            exec(compile(fp.read(), filename, 'exec'), settings, settings)

def load_json(filename, settings):
    """Read an appdmg .json spec.  Uses the defaults for appdmg, rather than
       the usual defaults for dmgbuild. """

    with open(filename, 'r') as fp:
        json_data = json.load(fp)

    if 'title' not in json_data:
        raise ValueError('missing \'title\' in JSON settings file')
    if 'contents' not in json_data:
        raise ValueError('missing \'contents\' in JSON settings file')

    settings['volume_name'] = json_data['title']
    settings['icon'] = json_data.get('icon', None)
    settings['badge_icon'] = json_data.get('badge-icon', None)
    bk = json_data.get('background', None)
    if bk is None:
        bk = json_data.get('background-color', None)
    if bk is not None:
        settings['background'] = bk
    settings['icon_size'] = json_data.get('icon-size', 80)
    wnd = json_data.get('window', { 'position': (100, 100),
                                    'size': (640, 480) })
    pos = wnd.get('position', { 'x': 100, 'y': 100 })
    siz = wnd.get('size', { 'width': 640, 'height': 480 })
    settings['window_rect'] = ((pos.get('x', 100), pos.get('y', 100)),
                               (siz.get('width', 640), siz.get('height', 480)))
    settings['format'] = json_data.get('format', 'UDZO')
    settings['compression_level'] = json_data.get('compression-level', None)
    settings['license'] = json_data.get('license', None)
    files = []
    symlinks = {}
    icon_locations = {}
    for fileinfo in json_data.get('contents', []):
        if 'path' not in fileinfo:
            raise ValueError('missing \'path\' in contents in JSON settings file')
        if 'x' not in fileinfo:
            raise ValueError('missing \'x\' in contents in JSON settings file')
        if 'y' not in fileinfo:
            raise ValueError('missing \'y\' in contents in JSON settings file')

        kind = fileinfo.get('type', 'file')
        path = fileinfo['path']
        name = fileinfo.get('name', os.path.basename(path.rstrip('/')))
        if kind == 'file':
            files.append((path, name))
        elif kind == 'link':
            symlinks[name] = path
        elif kind == 'position':
            pass
        icon_locations[name] = (fileinfo['x'], fileinfo['y'])

    settings['files'] = files
    settings['symlinks'] = symlinks
    settings['icon_locations'] = icon_locations

def build_dmg(filename, volume_name, settings_file=None, settings={},
              defines={}, lookForHiDPI=True):
    options = {
        # Default settings
        'filename': filename,
        'volume_name': volume_name,
        'format': 'UDBZ',
        'compression_level': None,
        'size': None,
        'files': [],
        'symlinks': {},
        'icon': None,
        'badge_icon': None,
        'background': None,
        'show_status_bar': False,
        'show_tab_view': False,
        'show_toolbar': False,
        'show_pathbar': False,
        'show_sidebar': False,
        'sidebar_width': 180,
        'arrange_by': None,
        'grid_offset': (0, 0),
        'grid_spacing': 100.0,
        'scroll_position': (0.0, 0.0),
        'show_icon_preview': False,
        'show_item_info': False,
        'label_pos': 'bottom',
        'text_size': 16.0,
        'icon_size': 128.0,
        'include_icon_view_settings': 'auto',
        'include_list_view_settings': 'auto',
        'list_icon_size': 16.0,
        'list_text_size': 12.0,
        'list_scroll_position': (0, 0),
        'list_sort_by': 'name',
        'list_use_relative_dates': True,
        'list_calculate_all_sizes': False,
        'list_columns': ('name', 'date-modified', 'size', 'kind', 'date-added'),
        'list_column_widths': {
            'name': 300,
            'date-modified': 181,
            'date-created': 181,
            'date-added': 181,
            'date-last-opened': 181,
            'size': 97,
            'kind': 115,
            'label': 100,
            'version': 75,
            'comments': 300,
            },
        'list_column_sort_directions': {
            'name': 'ascending',
            'date-modified': 'descending',
            'date-created': 'descending',
            'date-added': 'descending',
            'date-last-opened': 'descending',
            'size': 'descending',
            'kind': 'ascending',
            'label': 'ascending',
            'version': 'ascending',
            'comments': 'ascending',
            },
        'window_rect': ((100, 100), (640, 280)),
        'default_view': 'icon-view',
        'icon_locations': {},
        'license': None,
        'defines': defines
        }

    # Execute the settings file
    if settings_file:
        # We now support JSON settings files using appdmg's format
        if settings_file.endswith('.json'):
            load_json(settings_file, options)
        else:
            load_settings(settings_file, options)

    # Add any overrides
    options.update(settings)

    # Set up the finder data
    bounds = options['window_rect']

    bounds_string = '{{%s, %s}, {%s, %s}}' % (bounds[0][0],
                                              bounds[0][1],
                                              bounds[1][0],
                                              bounds[1][1])
    bwsp = {
        'ShowStatusBar': options['show_status_bar'],
        'WindowBounds': bounds_string.encode('utf-8'),
        'ContainerShowSidebar': False,
        'PreviewPaneVisibility': False,
        'SidebarWidth': options['sidebar_width'],
        'ShowTabView': options['show_tab_view'],
        'ShowToolbar': options['show_toolbar'],
        'ShowPathbar': options['show_pathbar'],
        'ShowSidebar': options['show_sidebar']
        }

    arrange_options = {
        'name': 'name',
        'date-modified': 'dateModified',
        'date-created': 'dateCreated',
        'date-added': 'dateAdded',
        'date-last-opened': 'dateLastOpened',
        'size': 'size',
        'kind': 'kind',
        'label': 'label',
        }

    icvp = {
        'viewOptionsVersion': 1,
        'backgroundType': 0,
        'backgroundColorRed': 1.0,
        'backgroundColorGreen': 1.0,
        'backgroundColorBlue': 1.0,
        'gridOffsetX': float(options['grid_offset'][0]),
        'gridOffsetY': float(options['grid_offset'][1]),
        'gridSpacing': float(options['grid_spacing']),
        'arrangeBy': str(arrange_options.get(options['arrange_by'], 'none')),
        'showIconPreview': options['show_icon_preview'] == True,
        'showItemInfo': options['show_item_info'] == True,
        'labelOnBottom': options['label_pos'] == 'bottom',
        'textSize': float(options['text_size']),
        'iconSize': float(options['icon_size']),
        'scrollPositionX': float(options['scroll_position'][0]),
        'scrollPositionY': float(options['scroll_position'][1])
        }

    background = options['background']

    columns = {
        'name': 'name',
        'date-modified': 'dateModified',
        'date-created': 'dateCreated',
        'date-added': 'dateAdded',
        'date-last-opened': 'dateLastOpened',
        'size': 'size',
        'kind': 'kind',
        'label': 'label',
        'version': 'version',
        'comments': 'comments'
        }

    default_widths = {
        'name': 300,
        'date-modified': 181,
        'date-created': 181,
        'date-added': 181,
        'date-last-opened': 181,
        'size': 97,
        'kind': 115,
        'label': 100,
        'version': 75,
        'comments': 300,
        }

    default_sort_directions = {
        'name': 'ascending',
        'date-modified': 'descending',
        'date-created': 'descending',
        'date-added': 'descending',
        'date-last-opened': 'descending',
        'size': 'descending',
        'kind': 'ascending',
        'label': 'ascending',
        'version': 'ascending',
        'comments': 'ascending',
        }

    lsvp = {
        'viewOptionsVersion': 1,
        'sortColumn': columns.get(options['list_sort_by'], 'name'),
        'textSize': float(options['list_text_size']),
        'iconSize': float(options['list_icon_size']),
        'showIconPreview': options['show_icon_preview'],
        'scrollPositionX': options['list_scroll_position'][0],
        'scrollPositionY': options['list_scroll_position'][1],
        'useRelativeDates': options['list_use_relative_dates'],
        'calculateAllSizes': options['list_calculate_all_sizes'],
        }

    lsvp['columns'] = {}
    cndx = {}

    for n, column in enumerate(options['list_columns']):
        cndx[column] = n
        width = options['list_column_widths'].get(column,
                                                   default_widths[column])
        asc = 'ascending' == options['list_column_sort_directions'].get(column,
                    default_sort_directions[column])

        lsvp['columns'][columns[column]] = {
            'index': n,
            'width': width,
            'identifier': columns[column],
            'visible': True,
            'ascending': asc
            }

    n = len(options['list_columns'])
    for k in iterkeys(columns):
        if cndx.get(k, None) is None:
            cndx[k] = n
            width = default_widths[k]
            asc = 'ascending' == default_sort_directions[k]

        lsvp['columns'][columns[column]] = {
            'index': n,
            'width': width,
            'identifier': columns[column],
            'visible': False,
            'ascending': asc
            }

        n += 1

    default_view = options['default_view']
    views = {
        'icon-view': b'icnv',
        'column-view': b'clmv',
        'list-view': b'Nlsv',
        'coverflow': b'Flwv'
        }

    icvl = (b'type', views.get(default_view, 'icnv'))

    include_icon_view_settings = default_view == 'icon-view' \
        or options['include_icon_view_settings'] not in \
        ('auto', 'no', 0, False, None)
    include_list_view_settings = default_view in ('list-view', 'coverflow') \
        or options['include_list_view_settings'] not in \
        ('auto', 'no', 0, False, None)

    filename = options['filename']
    volume_name = options['volume_name']

    # Construct a writeable image to start with
    dirname, basename = os.path.split(os.path.realpath(filename))
    if not basename.endswith('.dmg'):
        basename += '.dmg'
    writableFile = tempfile.NamedTemporaryFile(dir=dirname, prefix='.temp',
                                               suffix=basename)

    total_size = options['size']
    if total_size == None:
        # Start with a size of 128MB - this way we don't need to calculate the
        # size of the background image, volume icon, and .DS_Store file (and
        # 128 MB should be well sufficient for even the most outlandish image
        # sizes, like an uncompressed 5K multi-resolution TIFF)
        total_size = 128 * 1024 * 1024

        def roundup(x, n):
            return x if x % n == 0 else x + n - x % n

        for path in options['files']:
            if isinstance(path, tuple):
                path = path[0]

            if not os.path.islink(path) and os.path.isdir(path):
                for dirpath, dirnames, filenames in os.walk(path):
                    for f in filenames:
                        fp = os.path.join(dirpath, f)
                        total_size += roundup(os.lstat(fp).st_size, 4096)
            else:
                total_size += roundup(os.lstat(path).st_size, 4096)

        for name,target in iteritems(options['symlinks']):
            total_size += 4096

        total_size = str(max(total_size / 1024, 1024)) + 'K'

    ret, output = hdiutil('create',
                          '-ov',
                          '-volname', volume_name,
                          '-fs', 'HFS+',
                          '-fsargs', '-c c=64,a=16,e=16',
                          '-size', total_size,
                          writableFile.name)

    if ret:
        raise DMGError('Unable to create disk image')

    ret, output = hdiutil('attach',
                          '-nobrowse',
                          '-owners', 'off',
                          '-noidme',
                          writableFile.name)

    if ret:
        raise DMGError('Unable to attach disk image')

    try:
        for info in output['system-entities']:
            if info.get('mount-point', None):
                device = info['dev-entry']
                mount_point = info['mount-point']

        icon = options['icon']
        if badge:
            badge_icon = options['badge_icon']
        else:
            badge_icon = None
        icon_target_path = os.path.join(mount_point, '.VolumeIcon.icns')
        if icon:
            shutil.copyfile(icon, icon_target_path)
        elif badge_icon:
            badge.badge_disk_icon(badge_icon, icon_target_path)

        if icon or badge_icon:
            subprocess.call(['/usr/bin/SetFile', '-a', 'C', mount_point])

        background_bmk = None

        if not isinstance(background, (str, unicode)):
            pass
        elif colors.isAColor(background):
            c = colors.parseColor(background).to_rgb()

            icvp['backgroundType'] = 1
            icvp['backgroundColorRed'] = float(c.r)
            icvp['backgroundColorGreen'] = float(c.g)
            icvp['backgroundColorBlue'] = float(c.b)
        else:
            if os.path.isfile(background):
                # look to see if there are HiDPI resources available

                if lookForHiDPI is True:
                    name, extension = os.path.splitext(os.path.basename(background))
                    orderedImages = [background]
                    imageDirectory = os.path.dirname(background)
                    if imageDirectory == '':
                        imageDirectory = '.'
                    for candidateName in os.listdir(imageDirectory):
                        hasScale = re.match(
                            '^(?P<name>.+)@(?P<scale>\d+)x(?P<extension>\.\w+)$',
                            candidateName)
                        if hasScale and name == hasScale.group('name') and \
                            extension == hasScale.group('extension'):
                                scale = int(hasScale.group('scale'))
                                if len(orderedImages) < scale:
                                    orderedImages += [None] * (scale - len(orderedImages))
                                orderedImages[scale - 1] = os.path.join(imageDirectory, candidateName)

                    if len(orderedImages) > 1:
                        # compile the grouped tiff
                        backgroundFile = tempfile.NamedTemporaryFile(suffix='.tiff')
                        background = backgroundFile.name
                        output = tempfile.TemporaryFile(mode='w+')
                        try:
                            subprocess.check_call(
                                ['/usr/bin/tiffutil', '-cathidpicheck'] +
                                filter(None, orderedImages) +
                                ['-out', background], stdout=output, stderr=output)
                        except Exception as e:
                            output.seek(0)
                            raise ValueError(
                                'unable to compile combined HiDPI file "%s" got error: %s\noutput: %s'
                                % (background, str(e), output.read()))

                _, kind = os.path.splitext(background)
                path_in_image = os.path.join(mount_point, '.background' + kind)
                shutil.copyfile(background, path_in_image)
            elif pkg_resources.resource_exists('dmgbuild', 'resources/' + background + '.tiff'):
                tiffdata = pkg_resources.resource_string(
                    'dmgbuild',
                    'resources/' + background + '.tiff')
                path_in_image = os.path.join(mount_point, '.background.tiff')

                with open(path_in_image, 'wb') as f:
                    f.write(tiffdata)
            else:
                raise ValueError('background file "%s" not found' % background)

            alias = Alias.for_file(path_in_image)
            background_bmk = Bookmark.for_file(path_in_image)

            icvp['backgroundType'] = 2
            icvp['backgroundImageAlias'] = biplist.Data(alias.to_bytes())

        for f in options['files']:
            if isinstance(f, tuple):
                f_in_image = os.path.join(mount_point, f[1])
                f = f[0]
            else:
                basename = os.path.basename(f.rstrip('/'))
                f_in_image = os.path.join(mount_point, basename)

            # use system ditto command to preserve code signing, etc.
            subprocess.call(['/usr/bin/ditto', f, f_in_image])

        for name,target in iteritems(options['symlinks']):
            name_in_image = os.path.join(mount_point, name)
            os.symlink(target, name_in_image)

        userfn = options.get('create_hook', None)
        if callable(userfn):
            userfn(mount_point, options)

        image_dsstore = os.path.join(mount_point, '.DS_Store')

        with DSStore.open(image_dsstore, 'w+') as d:
            d['.']['vSrn'] = ('long', 1)
            d['.']['bwsp'] = bwsp
            if include_icon_view_settings:
                d['.']['icvp'] = icvp
                if background_bmk:
                    d['.']['pBBk'] = background_bmk
            if include_list_view_settings:
                d['.']['lsvp'] = lsvp
            d['.']['icvl'] = icvl

            for k,v in iteritems(options['icon_locations']):
                d[k]['Iloc'] = v

        # Delete .Trashes, if it gets created
        shutil.rmtree(os.path.join(mount_point, '.Trashes'), True)
    except:
        # Always try to detach
        hdiutil('detach', '-force', device, plist=False)
        raise

    ret, output = hdiutil('detach', device, plist=False)

    if ret:
        hdiutil('detach', '-force', device, plist=False)
        raise DMGError('Unable to detach device cleanly')

    # Shrink the output to the minimum possible size
    ret, output = hdiutil('resize',
                          '-quiet',
                          '-sectors', 'min',
                          writableFile.name,
                          plist=False)

    if ret:
        raise DMGError('Unable to shrink')

    key_prefix = {'UDZO': 'zlib', 'UDBZ': 'bzip2', 'ULFO': 'lzfse'}
    compression_level = options['compression_level']
    if options['format'] in key_prefix and compression_level:
        compression_args = [
            '-imagekey',
            key_prefix[options['format']] + '-level=' + str(compression_level)
        ]
    else:
        compression_args = []

    ret, output = hdiutil('convert', writableFile.name,
                          '-format', options['format'],
                          '-ov',
                          '-o', filename, *compression_args)

    if ret:
        raise DMGError('Unable to convert')# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import struct

class Resource (object):
    def __init__(self, res_type, res_id, res_name, data=None, res_attrs=0):
        self.res_type = str(res_type)
        self.res_id = res_id
        if isinstance(res_name, basestring):
            res_name = str(res_name)
        self.res_name = res_name
        self.res_attrs = res_attrs
        if data is None:
            self.data = None
        self.data = str(data)

        self.data_offset = None
        self.name_offset = None

    def __repr__(self):
        return 'Resource(%r, %r, %r, data=%r, res_attrs=%r)' % (self.res_type,
                                                                self.res_id,
                                                                self.res_name,
                                                                self.data,
                                                                self.res_attrs)

class TMPLResource (Resource):
    def __init__(self, res_id, res_name, tmpl, res_attrs=0):
        data = []
        for name,typecode in tmpl:
            data.append(struct.pack(b'B', len(name)))
            data.append(str(name))
            data.append(str(typecode))
        super(TMPLResource, self).__init__(b'TMPL', res_id, res_name,
                                           b''.join(data), res_attrs)

class StringListResource (Resource):
    def __init__(self, res_id, res_name, strings, res_attrs=0):
        data = []
        data.append(struct.pack(b'>H', len(strings)))
        for s in strings:
            data.append(struct.pack(b'B', len(s)))
            data.append(str(s))
        super(StringListResource, self).__init__(b'STR#', res_id, res_name,
                                                 b''.join(data), res_attrs)

class TextResource (Resource):
    def __init__(self, res_id, res_name, string, res_attrs=0):
        super(TextResource, self).__init__(b'TEXT', res_id, res_name,
                                           str(string), res_attrs)

class Style (object):
    # Fonts
    NewYork      = 2
    Geneva       = 3
    Monaco       = 4
    Venice       = 5
    London       = 6
    Athens       = 7
    SanFrancisco = 8
    Toronto      = 9
    Cairo        = 11
    LosAngeles   = 12
    Times        = 20
    Helvetica    = 21
    Courier      = 22
    Symbol       = 23
    Mobile       = 24

    # Styles
    Bold       = 0x0100
    Italic     = 0x0200
    Underline  = 0x0400
    Outline    = 0x0800
    Shadow     = 0x1000
    Condense   = 0x2000
    Expand     = 0x4000

    def __init__(self, start_character, height, ascent, font_id, face,
                 size, color):
        self.start_character = start_character
        self.height = height
        self.ascent = ascent
        self.font_id = font_id
        self.face = face
        self.size = size
        self.color = color

    def __repr__(self):
        styles = []
        if self.face & Style.Bold:
            styles.append('Style.Bold')
        if self.face & Style.Italic:
            styles.append('Style.Italic')
        if self.face & Style.Underline:
            styles.append('Style.Underline')
        if self.face & Style.Outline:
            styles.append('Style.Outline')
        if self.face & Style.Shadow:
            styles.append('Style.Shadow')
        if self.face & Style.Condense:
            styles.append('Style.Condense')
        if self.face & Style.Expand:
            styles.append('Style.Expand')
        if self.face & ~0x4f00:
            styles.append('%#06x' % (self.face & ~0x4f00))
        if styles:
            styles = '|'.join(styles)
        else:
            styles = '0'

        font_revmap = {
             2: 'Style.NewYork',
             3: 'Style.Geneva',
             4: 'Style.Monaco',
             5: 'Style.Venice',
             6: 'Style.London',
             7: 'Style.Athens',
             8: 'Style.SanFrancisco',
             9: 'Style.Toronto',
            11: 'Style.Cairo',
            12: 'Style.LosAngeles',
            20: 'Style.Times',
            21: 'Style.Helvetica',
            22: 'Style.Courier',
            23: 'Style.Symbol',
            24: 'Style.Mobile'
        }

        font = font_revmap.get(self.font_id, '%s' % self.font_id)

        return 'Style(%r, %r, %r, %s, %s, %r, %r)' % (
            self.start_character,
            self.height,
            self.ascent,
            font,
            styles,
            self.size,
            self.color)

class StyleResource (Resource):
    def __init__(self, res_id, res_name, styles, res_attrs=0):
        data = []
        data.append(struct.pack(b'>H', len(styles)))
        for style in styles:
            data.append(struct.pack(b'>LHHHHHHHH',
                                    style.start_character,
                                    style.height,
                                    style.ascent,
                                    style.font_id,
                                    style.face,
                                    style.size,
                                    style.color[0],
                                    style.color[1],
                                    style.color[2]))
        super(StyleResource, self).__init__(b'styl', res_id, res_name,
                                            b''.join(data), res_attrs)

class ResourceFork (object):
    def __init__(self, resources=None):
        self.types = {}
        self.attrs = 0
        if resources is not None:
            for res in resources:
                self.add(res)

    @classmethod
    def from_data(clss, data):
        if len(data) < 16:
            raise ValueError('Bad resource data - data too short')

        # Read the header
        data_start, map_start, data_len, map_len = struct.unpack(b'>LLLL',
                                                                 data[0:16])

        if data_start + data_len > len(data):
            raise ValueError('Bad resource data - data out of range')
        if map_start + map_len > len(data):
            raise ValueError('Bad resource data - map out of range')
        if map_len < 30:
            raise ValueError('Bad resource data - map too short')

        # Read the map header
        fork_attrs, type_offset, name_offset, max_type_ndx \
            = struct.unpack(b'>HHHH', data[map_start + 22:map_start + 30])
        num_types = max_type_ndx + 1

        if type_offset + 8 * num_types > map_len:
            raise ValueError('Bad resource data - type data outside map')

        if name_offset > map_len:
            raise ValueError('Bad resource data - names outside map')

        type_offset += map_start
        name_offset += map_start

        result = ResourceFork()

        # Now read the type list
        for ntype in range(0, num_types):
            type_pos = 2 + type_offset + 8 * ntype
            res_type, max_item_ndx, ref_offset \
                = struct.unpack(b'>4sHH', data[type_pos:type_pos+8])
            num_items = max_item_ndx + 1

            result.types[res_type] = []

            ref_list_offset = type_offset + ref_offset
            if ref_list_offset + 12 * num_items > map_start + map_len:
                raise ValueError('Bad resource data - ref list outside map')

            for nitem in range(0, num_items):
                ref_elt = ref_list_offset + 12 * nitem
                res_id, res_name_offset, data_offset \
                    = struct.unpack(b'>hHL', data[ref_elt:ref_elt+8])

                res_attrs = data_offset >> 24
                data_offset &= 0xffffff

                if data_offset >= data_len:
                    raise ValueError('Bad resource data - item data out of range')

                data_offset += data_start
                res_len = struct.unpack(b'>L', data[data_offset:data_offset+4])[0]
                if data_offset + res_len >= data_start + data_len:
                    raise ValueError('Bad resource data - item data too large')

                res_data = data[data_offset + 4:data_offset + res_len + 4]

                if res_name_offset == 0xffff:
                    res_name = None
                else:
                    res_name_offset += name_offset
                    if res_name_offset >= map_start + map_len:
                        raise ValueError('Bad resource data - name out of range')
                    res_name_len = struct.unpack(b'B', data[res_name_offset])[0]
                    res_name = data[res_name_offset + 1:res_name_offset + res_name_len + 1]

                result.types[res_type].append(Resource(res_type, res_id,
                                                       res_name,
                                                       res_data, res_attrs))

        return result

    @classmethod
    def from_file(clss, filename):
        with open(filename + '/..namedfork/rsrc', 'rb') as f:
            data = f.read()
        return clss.from_data(data)

    def to_data(self):
        data = []
        data_len = 0
        names = []
        names_len = 0
        types_len = len(self.types) * 8
        types_data = []
        reflist_data = []
        reflist_len = 0

        for res_type, items in self.types.items():
            types_data.append(struct.pack(b'>4sHH',
                                          res_type,
                                          len(items) - 1,
                                          2 + types_len + reflist_len))
            for item in items:
                data_offset = data_len

                if item.res_name is None:
                    name_offset = 65535
                else:
                    name_offset = names_len
                    n = str(item.res_name)
                    names.append(struct.pack(b'B', len(n)) + n)
                    names_len += 1 + len(n)

                if item.data is None:
                    data_len += 4
                else:
                    data_len += 4 + (len(item.data) + 3) & ~3

                reflist_len += 12
                reflist_data.append(struct.pack(b'>hHLL',
                                                item.res_id,
                                                name_offset,
                                                (item.res_attrs << 24) \
                                                | data_offset,
                                                0))

        # Header
        data.append(struct.pack(b'>LLLL240s', 256, 256 + data_len, data_len,
                                30 + types_len + reflist_len + names_len,
                                b''))

        # Resource data
        for res_type, items in self.types.items():
            for item in items:
                if item.data is None:
                    dlen = 0
                else:
                    dlen = len(item.data)
                plen = (dlen + 3) & ~3
                data.append(struct.pack(b'>L', dlen))
                if item.data is not None:
                    data.append(item.data)
                if plen != dlen:
                    data.append(b'\0' * (plen - dlen))

        # Resource map header
        data.append(struct.pack(b'>16sLHHHHH',
                                b'', 0, 0,
                                self.attrs, 28, 30 + types_len + reflist_len,
                                len(self.types) - 1))

        # Type list
        data.append(b''.join(types_data))

        # Reference lists
        data.append(b''.join(reflist_data))

        # Name list
        data.append(b''.join(names))

        return b''.join(data)

    def write_to_file(self, filename):
        with open(filename + '/..namedfork/rsrc', 'wb') as f:
            f.write(self.to_data())

    def __len__(self):
        return len(self.types)

    def __getitem__(self, key):
        return self.types[key]

    def __iter__(self):
        for res_type, items in self.types.items():
            for item in items:
                yield item

    def __repr__(self):
        output = []
        for item in self:
            output.append(repr(item))
        return 'ResourceFork([%s])' % ', '.join(output)

    def add(self, res):
        if res.res_type in self.types:
            self.types[res.res_type].append(res)
        else:
            self.types[res.res_type] = [res]

    def remove(self, res):
        self.types[res.res_type].remove(res)
"""biplist -- a library for reading and writing binary property list files.

Binary Property List (plist) files provide a faster and smaller serialization
format for property lists on OS X. This is a library for generating binary
plists which can be read by OS X, iOS, or other clients.

The API models the plistlib API, and will call through to plistlib when
XML serialization or deserialization is required.

To generate plists with UID values, wrap the values with the Uid object. The
value must be an int.

To generate plists with NSData/CFData values, wrap the values with the
Data object. The value must be a string.

Date values can only be datetime.datetime objects.

The exceptions InvalidPlistException and NotBinaryPlistException may be 
thrown to indicate that the data cannot be serialized or deserialized as
a binary plist.

Plist generation example:
    
    from biplist import *
    from datetime import datetime
    plist = {'aKey':'aValue',
             '0':1.322,
             'now':datetime.now(),
             'list':[1,2,3],
             'tuple':('a','b','c')
             }
    try:
        writePlist(plist, "example.plist")
    except (InvalidPlistException, NotBinaryPlistException), e:
        print "Something bad happened:", e

Plist parsing example:

    from biplist import *
    try:
        plist = readPlist("example.plist")
        print plist
    except (InvalidPlistException, NotBinaryPlistException), e:
        print "Not a plist:", e
"""

from collections import namedtuple
import datetime
import io
import math
import plistlib
from struct import pack, unpack, unpack_from
from struct import error as struct_error
import sys
import time

try:
    unicode
    unicodeEmpty = r''
except NameError:
    unicode = str
    unicodeEmpty = ''
try:
    long
except NameError:
    long = int
try:
    {}.iteritems
    iteritems = lambda x: x.iteritems()
except AttributeError:
    iteritems = lambda x: x.items()

__all__ = [
    'Uid', 'Data', 'readPlist', 'writePlist', 'readPlistFromString',
    'writePlistToString', 'InvalidPlistException', 'NotBinaryPlistException'
]

# Apple uses Jan 1, 2001 as a base for all plist date/times.
apple_reference_date = datetime.datetime.utcfromtimestamp(978307200)

class Uid(object):
    """Wrapper around integers for representing UID values. This
       is used in keyed archiving."""
    integer = 0
    def __init__(self, integer):
        self.integer = integer
    
    def __repr__(self):
        return "Uid(%d)" % self.integer
    
    def __eq__(self, other):
        if isinstance(self, Uid) and isinstance(other, Uid):
            return self.integer == other.integer
        return False
    
    def __cmp__(self, other):
        return self.integer - other.integer
    
    def __lt__(self, other):
        return self.integer < other.integer
    
    def __hash__(self):
        return self.integer
    
    def __int__(self):
        return int(self.integer)

class Data(bytes):
    """Wrapper around bytes to distinguish Data values."""

class InvalidPlistException(Exception):
    """Raised when the plist is incorrectly formatted."""

class NotBinaryPlistException(Exception):
    """Raised when a binary plist was expected but not encountered."""

def readPlist(pathOrFile):
    """Raises NotBinaryPlistException, InvalidPlistException"""
    didOpen = False
    result = None
    if isinstance(pathOrFile, (bytes, unicode)):
        pathOrFile = open(pathOrFile, 'rb')
        didOpen = True
    try:
        reader = PlistReader(pathOrFile)
        result = reader.parse()
    except NotBinaryPlistException as e:
        try:
            pathOrFile.seek(0)
            result = None
            if hasattr(plistlib, 'loads'):
                contents = None
                if isinstance(pathOrFile, (bytes, unicode)):
                    with open(pathOrFile, 'rb') as f:
                        contents = f.read()
                else:
                    contents = pathOrFile.read()
                result = plistlib.loads(contents)
            else:
                result = plistlib.readPlist(pathOrFile)
            result = wrapDataObject(result, for_binary=True)
        except Exception as e:
            raise InvalidPlistException(e)
    finally:
        if didOpen:
            pathOrFile.close()
    return result

def wrapDataObject(o, for_binary=False):
    if isinstance(o, Data) and not for_binary:
        v = sys.version_info
        if not (v[0] >= 3 and v[1] >= 4):
            o = plistlib.Data(o)
    elif isinstance(o, (bytes, plistlib.Data)) and for_binary:
        if hasattr(o, 'data'):
            o = Data(o.data)
    elif isinstance(o, tuple):
        o = wrapDataObject(list(o), for_binary)
        o = tuple(o)
    elif isinstance(o, list):
        for i in range(len(o)):
            o[i] = wrapDataObject(o[i], for_binary)
    elif isinstance(o, dict):
        for k in o:
            o[k] = wrapDataObject(o[k], for_binary)
    return o

def writePlist(rootObject, pathOrFile, binary=True):
    if not binary:
        rootObject = wrapDataObject(rootObject, binary)
        if hasattr(plistlib, "dump"):
            if isinstance(pathOrFile, (bytes, unicode)):
                with open(pathOrFile, 'wb') as f:
                    return plistlib.dump(rootObject, f)
            else:
                return plistlib.dump(rootObject, pathOrFile)
        else:
            return plistlib.writePlist(rootObject, pathOrFile)
    else:
        didOpen = False
        if isinstance(pathOrFile, (bytes, unicode)):
            pathOrFile = open(pathOrFile, 'wb')
            didOpen = True
        writer = PlistWriter(pathOrFile)
        result = writer.writeRoot(rootObject)
        if didOpen:
            pathOrFile.close()
        return result

def readPlistFromString(data):
    return readPlist(io.BytesIO(data))

def writePlistToString(rootObject, binary=True):
    if not binary:
        rootObject = wrapDataObject(rootObject, binary)
        if hasattr(plistlib, "dumps"):
            return plistlib.dumps(rootObject)
        elif hasattr(plistlib, "writePlistToBytes"):
            return plistlib.writePlistToBytes(rootObject)
        else:
            return plistlib.writePlistToString(rootObject)
    else:
        ioObject = io.BytesIO()
        writer = PlistWriter(ioObject)
        writer.writeRoot(rootObject)
        return ioObject.getvalue()

def is_stream_binary_plist(stream):
    stream.seek(0)
    header = stream.read(7)
    if header == b'bplist0':
        return True
    else:
        return False

PlistTrailer = namedtuple('PlistTrailer', 'offsetSize, objectRefSize, offsetCount, topLevelObjectNumber, offsetTableOffset')
PlistByteCounts = namedtuple('PlistByteCounts', 'nullBytes, boolBytes, intBytes, realBytes, dateBytes, dataBytes, stringBytes, uidBytes, arrayBytes, setBytes, dictBytes')

class PlistReader(object):
    file = None
    contents = ''
    offsets = None
    trailer = None
    currentOffset = 0
    
    def __init__(self, fileOrStream):
        """Raises NotBinaryPlistException."""
        self.reset()
        self.file = fileOrStream
    
    def parse(self):
        return self.readRoot()
    
    def reset(self):
        self.trailer = None
        self.contents = ''
        self.offsets = []
        self.currentOffset = 0
    
    def readRoot(self):
        result = None
        self.reset()
        # Get the header, make sure it's a valid file.
        if not is_stream_binary_plist(self.file):
            raise NotBinaryPlistException()
        self.file.seek(0)
        self.contents = self.file.read()
        if len(self.contents) < 32:
            raise InvalidPlistException("File is too short.")
        trailerContents = self.contents[-32:]
        try:
            self.trailer = PlistTrailer._make(unpack("!xxxxxxBBQQQ", trailerContents))
            offset_size = self.trailer.offsetSize * self.trailer.offsetCount
            offset = self.trailer.offsetTableOffset
            offset_contents = self.contents[offset:offset+offset_size]
            offset_i = 0
            while offset_i < self.trailer.offsetCount:
                begin = self.trailer.offsetSize*offset_i
                tmp_contents = offset_contents[begin:begin+self.trailer.offsetSize]
                tmp_sized = self.getSizedInteger(tmp_contents, self.trailer.offsetSize)
                self.offsets.append(tmp_sized)
                offset_i += 1
            self.setCurrentOffsetToObjectNumber(self.trailer.topLevelObjectNumber)
            result = self.readObject()
        except TypeError as e:
            raise InvalidPlistException(e)
        return result
    
    def setCurrentOffsetToObjectNumber(self, objectNumber):
        self.currentOffset = self.offsets[objectNumber]
    
    def readObject(self):
        result = None
        tmp_byte = self.contents[self.currentOffset:self.currentOffset+1]
        marker_byte = unpack("!B", tmp_byte)[0]
        format = (marker_byte >> 4) & 0x0f
        extra = marker_byte & 0x0f
        self.currentOffset += 1
        
        def proc_extra(extra):
            if extra == 0b1111:
                #self.currentOffset += 1
                extra = self.readObject()
            return extra
        
        # bool, null, or fill byte
        if format == 0b0000:
            if extra == 0b0000:
                result = None
            elif extra == 0b1000:
                result = False
            elif extra == 0b1001:
                result = True
            elif extra == 0b1111:
                pass # fill byte
            else:
                raise InvalidPlistException("Invalid object found at offset: %d" % (self.currentOffset - 1))
        # int
        elif format == 0b0001:
            extra = proc_extra(extra)
            result = self.readInteger(pow(2, extra))
        # real
        elif format == 0b0010:
            extra = proc_extra(extra)
            result = self.readReal(extra)
        # date
        elif format == 0b0011 and extra == 0b0011:
            result = self.readDate()
        # data
        elif format == 0b0100:
            extra = proc_extra(extra)
            result = self.readData(extra)
        # ascii string
        elif format == 0b0101:
            extra = proc_extra(extra)
            result = self.readAsciiString(extra)
        # Unicode string
        elif format == 0b0110:
            extra = proc_extra(extra)
            result = self.readUnicode(extra)
        # uid
        elif format == 0b1000:
            result = self.readUid(extra)
        # array
        elif format == 0b1010:
            extra = proc_extra(extra)
            result = self.readArray(extra)
        # set
        elif format == 0b1100:
            extra = proc_extra(extra)
            result = set(self.readArray(extra))
        # dict
        elif format == 0b1101:
            extra = proc_extra(extra)
            result = self.readDict(extra)
        else:    
            raise InvalidPlistException("Invalid object found: {format: %s, extra: %s}" % (bin(format), bin(extra)))
        return result
    
    def readInteger(self, byteSize):
        result = 0
        original_offset = self.currentOffset
        data = self.contents[self.currentOffset:self.currentOffset + byteSize]
        result = self.getSizedInteger(data, byteSize, as_number=True)
        self.currentOffset = original_offset + byteSize
        return result
    
    def readReal(self, length):
        result = 0.0
        to_read = pow(2, length)
        data = self.contents[self.currentOffset:self.currentOffset+to_read]
        if length == 2: # 4 bytes
            result = unpack('>f', data)[0]
        elif length == 3: # 8 bytes
            result = unpack('>d', data)[0]
        else:
            raise InvalidPlistException("Unknown real of length %d bytes" % to_read)
        return result
    
    def readRefs(self, count):    
        refs = []
        i = 0
        while i < count:
            fragment = self.contents[self.currentOffset:self.currentOffset+self.trailer.objectRefSize]
            ref = self.getSizedInteger(fragment, len(fragment))
            refs.append(ref)
            self.currentOffset += self.trailer.objectRefSize
            i += 1
        return refs
    
    def readArray(self, count):
        result = []
        values = self.readRefs(count)
        i = 0
        while i < len(values):
            self.setCurrentOffsetToObjectNumber(values[i])
            value = self.readObject()
            result.append(value)
            i += 1
        return result
    
    def readDict(self, count):
        result = {}
        keys = self.readRefs(count)
        values = self.readRefs(count)
        i = 0
        while i < len(keys):
            self.setCurrentOffsetToObjectNumber(keys[i])
            key = self.readObject()
            self.setCurrentOffsetToObjectNumber(values[i])
            value = self.readObject()
            result[key] = value
            i += 1
        return result
    
    def readAsciiString(self, length):
        result = unpack("!%ds" % length, self.contents[self.currentOffset:self.currentOffset+length])[0]
        self.currentOffset += length
        return str(result.decode('ascii'))
    
    def readUnicode(self, length):
        actual_length = length*2
        data = self.contents[self.currentOffset:self.currentOffset+actual_length]
        # unpack not needed?!! data = unpack(">%ds" % (actual_length), data)[0]
        self.currentOffset += actual_length
        return data.decode('utf_16_be')
    
    def readDate(self):
        result = unpack(">d", self.contents[self.currentOffset:self.currentOffset+8])[0]
        # Use timedelta to workaround time_t size limitation on 32-bit python.
        result = datetime.timedelta(seconds=result) + apple_reference_date
        self.currentOffset += 8
        return result
    
    def readData(self, length):
        result = self.contents[self.currentOffset:self.currentOffset+length]
        self.currentOffset += length
        return Data(result)
    
    def readUid(self, length):
        return Uid(self.readInteger(length+1))
    
    def getSizedInteger(self, data, byteSize, as_number=False):
        """Numbers of 8 bytes are signed integers when they refer to numbers, but unsigned otherwise."""
        result = 0
        # 1, 2, and 4 byte integers are unsigned
        if byteSize == 1:
            result = unpack('>B', data)[0]
        elif byteSize == 2:
            result = unpack('>H', data)[0]
        elif byteSize == 4:
            result = unpack('>L', data)[0]
        elif byteSize == 8:
            if as_number:
                result = unpack('>q', data)[0]
            else:
                result = unpack('>Q', data)[0]
        elif byteSize <= 16:
            # Handle odd-sized or integers larger than 8 bytes
            # Don't naively go over 16 bytes, in order to prevent infinite loops.
            result = 0
            if hasattr(int, 'from_bytes'):
                result = int.from_bytes(data, 'big')
            else:
                for byte in data:
                    if not isinstance(byte, int): # Python3.0-3.1.x return ints, 2.x return str
                        byte = unpack_from('>B', byte)[0]
                    result = (result << 8) | byte
        else:
            raise InvalidPlistException("Encountered integer longer than 16 bytes.")
        return result

class HashableWrapper(object):
    def __init__(self, value):
        self.value = value
    def __repr__(self):
        return "<HashableWrapper: %s>" % [self.value]

class BoolWrapper(object):
    def __init__(self, value):
        self.value = value
    def __repr__(self):
        return "<BoolWrapper: %s>" % self.value

class FloatWrapper(object):
    _instances = {}
    def __new__(klass, value):
        # Ensure FloatWrapper(x) for a given float x is always the same object
        wrapper = klass._instances.get(value)
        if wrapper is None:
            wrapper = object.__new__(klass)
            wrapper.value = value
            klass._instances[value] = wrapper
        return wrapper
    def __repr__(self):
        return "<FloatWrapper: %s>" % self.value

class StringWrapper(object):
    __instances = {}
    
    encodedValue = None
    encoding = None
    
    def __new__(cls, value):
        '''Ensure we only have a only one instance for any string,
         and that we encode ascii as 1-byte-per character when possible'''
        
        encodedValue = None
        
        for encoding in ('ascii', 'utf_16_be'):
            try:
               encodedValue = value.encode(encoding)
            except: pass
            if encodedValue is not None:
                if encodedValue not in cls.__instances:
                    cls.__instances[encodedValue] = super(StringWrapper, cls).__new__(cls)
                    cls.__instances[encodedValue].encodedValue = encodedValue
                    cls.__instances[encodedValue].encoding = encoding
                return cls.__instances[encodedValue]
        
        raise ValueError('Unable to get ascii or utf_16_be encoding for %s' % repr(value))
    
    def __len__(self):
        '''Return roughly the number of characters in this string (half the byte length)'''
        if self.encoding == 'ascii':
            return len(self.encodedValue)
        else:
            return len(self.encodedValue)//2
    
    def __lt__(self, other):
        return self.encodedValue < other.encodedValue
    
    @property
    def encodingMarker(self):
        if self.encoding == 'ascii':
            return 0b0101
        else:
            return 0b0110
    
    def __repr__(self):
        return '<StringWrapper (%s): %s>' % (self.encoding, self.encodedValue)

class PlistWriter(object):
    header = b'bplist00bybiplist1.0'
    file = None
    byteCounts = None
    trailer = None
    computedUniques = None
    writtenReferences = None
    referencePositions = None
    wrappedTrue = None
    wrappedFalse = None
    
    def __init__(self, file):
        self.reset()
        self.file = file
        self.wrappedTrue = BoolWrapper(True)
        self.wrappedFalse = BoolWrapper(False)

    def reset(self):
        self.byteCounts = PlistByteCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
        self.trailer = PlistTrailer(0, 0, 0, 0, 0)
        
        # A set of all the uniques which have been computed.
        self.computedUniques = set()
        # A list of all the uniques which have been written.
        self.writtenReferences = {}
        # A dict of the positions of the written uniques.
        self.referencePositions = {}
        
    def positionOfObjectReference(self, obj):
        """If the given object has been written already, return its
           position in the offset table. Otherwise, return None."""
        return self.writtenReferences.get(obj)
        
    def writeRoot(self, root):
        """
        Strategy is:
        - write header
        - wrap root object so everything is hashable
        - compute size of objects which will be written
          - need to do this in order to know how large the object refs
            will be in the list/dict/set reference lists
        - write objects
          - keep objects in writtenReferences
          - keep positions of object references in referencePositions
          - write object references with the length computed previously
        - computer object reference length
        - write object reference positions
        - write trailer
        """
        output = self.header
        wrapped_root = self.wrapRoot(root)
        self.computeOffsets(wrapped_root, asReference=True, isRoot=True)
        self.trailer = self.trailer._replace(**{'objectRefSize':self.intSize(len(self.computedUniques))})
        self.writeObjectReference(wrapped_root, output)
        output = self.writeObject(wrapped_root, output, setReferencePosition=True)
        
        # output size at this point is an upper bound on how big the
        # object reference offsets need to be.
        self.trailer = self.trailer._replace(**{
            'offsetSize':self.intSize(len(output)),
            'offsetCount':len(self.computedUniques),
            'offsetTableOffset':len(output),
            'topLevelObjectNumber':0
            })
        
        output = self.writeOffsetTable(output)
        output += pack('!xxxxxxBBQQQ', *self.trailer)
        self.file.write(output)

    def wrapRoot(self, root):
        if isinstance(root, bool):
            if root is True:
                return self.wrappedTrue
            else:
                return self.wrappedFalse
        elif isinstance(root, float):
            return FloatWrapper(root)
        elif isinstance(root, set):
            n = set()
            for value in root:
                n.add(self.wrapRoot(value))
            return HashableWrapper(n)
        elif isinstance(root, dict):
            n = {}
            for key, value in iteritems(root):
                n[self.wrapRoot(key)] = self.wrapRoot(value)
            return HashableWrapper(n)
        elif isinstance(root, list):
            n = []
            for value in root:
                n.append(self.wrapRoot(value))
            return HashableWrapper(n)
        elif isinstance(root, tuple):
            n = tuple([self.wrapRoot(value) for value in root])
            return HashableWrapper(n)
        elif isinstance(root, (str, unicode)) and not isinstance(root, Data):
            return StringWrapper(root)
        elif isinstance(root, bytes):
            return Data(root)
        else:
            return root

    def incrementByteCount(self, field, incr=1):
        self.byteCounts = self.byteCounts._replace(**{field:self.byteCounts.__getattribute__(field) + incr})

    def computeOffsets(self, obj, asReference=False, isRoot=False):
        def check_key(key):
            if key is None:
                raise InvalidPlistException('Dictionary keys cannot be null in plists.')
            elif isinstance(key, Data):
                raise InvalidPlistException('Data cannot be dictionary keys in plists.')
            elif not isinstance(key, StringWrapper):
                raise InvalidPlistException('Keys must be strings.')
        
        def proc_size(size):
            if size > 0b1110:
                size += self.intSize(size)
            return size
        # If this should be a reference, then we keep a record of it in the
        # uniques table.
        if asReference:
            if obj in self.computedUniques:
                return
            else:
                self.computedUniques.add(obj)
        
        if obj is None:
            self.incrementByteCount('nullBytes')
        elif isinstance(obj, BoolWrapper):
            self.incrementByteCount('boolBytes')
        elif isinstance(obj, Uid):
            size = self.intSize(obj.integer)
            self.incrementByteCount('uidBytes', incr=1+size)
        elif isinstance(obj, (int, long)):
            size = self.intSize(obj)
            self.incrementByteCount('intBytes', incr=1+size)
        elif isinstance(obj, FloatWrapper):
            size = self.realSize(obj)
            self.incrementByteCount('realBytes', incr=1+size)
        elif isinstance(obj, datetime.datetime):    
            self.incrementByteCount('dateBytes', incr=2)
        elif isinstance(obj, Data):
            size = proc_size(len(obj))
            self.incrementByteCount('dataBytes', incr=1+size)
        elif isinstance(obj, StringWrapper):
            size = proc_size(len(obj))
            self.incrementByteCount('stringBytes', incr=1+size)
        elif isinstance(obj, HashableWrapper):
            obj = obj.value
            if isinstance(obj, set):
                size = proc_size(len(obj))
                self.incrementByteCount('setBytes', incr=1+size)
                for value in obj:
                    self.computeOffsets(value, asReference=True)
            elif isinstance(obj, (list, tuple)):
                size = proc_size(len(obj))
                self.incrementByteCount('arrayBytes', incr=1+size)
                for value in obj:
                    asRef = True
                    self.computeOffsets(value, asReference=True)
            elif isinstance(obj, dict):
                size = proc_size(len(obj))
                self.incrementByteCount('dictBytes', incr=1+size)
                for key, value in iteritems(obj):
                    check_key(key)
                    self.computeOffsets(key, asReference=True)
                    self.computeOffsets(value, asReference=True)
        else:
            raise InvalidPlistException("Unknown object type: %s (%s)" % (type(obj).__name__, repr(obj)))

    def writeObjectReference(self, obj, output):
        """Tries to write an object reference, adding it to the references
           table. Does not write the actual object bytes or set the reference
           position. Returns a tuple of whether the object was a new reference
           (True if it was, False if it already was in the reference table)
           and the new output.
        """
        position = self.positionOfObjectReference(obj)
        if position is None:
            self.writtenReferences[obj] = len(self.writtenReferences)
            output += self.binaryInt(len(self.writtenReferences) - 1, byteSize=self.trailer.objectRefSize)
            return (True, output)
        else:
            output += self.binaryInt(position, byteSize=self.trailer.objectRefSize)
            return (False, output)

    def writeObject(self, obj, output, setReferencePosition=False):
        """Serializes the given object to the output. Returns output.
           If setReferencePosition is True, will set the position the
           object was written.
        """
        def proc_variable_length(format, length):
            result = b''
            if length > 0b1110:
                result += pack('!B', (format << 4) | 0b1111)
                result = self.writeObject(length, result)
            else:
                result += pack('!B', (format << 4) | length)
            return result
        
        def timedelta_total_seconds(td):
            # Shim for Python 2.6 compatibility, which doesn't have total_seconds.
            # Make one argument a float to ensure the right calculation.
            return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10.0**6) / 10.0**6
       
        if setReferencePosition:
            self.referencePositions[obj] = len(output)
        
        if obj is None:
            output += pack('!B', 0b00000000)
        elif isinstance(obj, BoolWrapper):
            if obj.value is False:
                output += pack('!B', 0b00001000)
            else:
                output += pack('!B', 0b00001001)
        elif isinstance(obj, Uid):
            size = self.intSize(obj.integer)
            output += pack('!B', (0b1000 << 4) | size - 1)
            output += self.binaryInt(obj.integer)
        elif isinstance(obj, (int, long)):
            byteSize = self.intSize(obj)
            root = math.log(byteSize, 2)
            output += pack('!B', (0b0001 << 4) | int(root))
            output += self.binaryInt(obj, as_number=True)
        elif isinstance(obj, FloatWrapper):
            # just use doubles
            output += pack('!B', (0b0010 << 4) | 3)
            output += self.binaryReal(obj)
        elif isinstance(obj, datetime.datetime):
            try:
                timestamp = (obj - apple_reference_date).total_seconds()
            except AttributeError:
                timestamp = timedelta_total_seconds(obj - apple_reference_date)
            output += pack('!B', 0b00110011)
            output += pack('!d', float(timestamp))
        elif isinstance(obj, Data):
            output += proc_variable_length(0b0100, len(obj))
            output += obj
        elif isinstance(obj, StringWrapper):
            output += proc_variable_length(obj.encodingMarker, len(obj))
            output += obj.encodedValue
        elif isinstance(obj, bytes):
            output += proc_variable_length(0b0101, len(obj))
            output += obj
        elif isinstance(obj, HashableWrapper):
            obj = obj.value
            if isinstance(obj, (set, list, tuple)):
                if isinstance(obj, set):
                    output += proc_variable_length(0b1100, len(obj))
                else:
                    output += proc_variable_length(0b1010, len(obj))
            
                objectsToWrite = []
                for objRef in sorted(obj) if isinstance(obj, set) else obj:
                    (isNew, output) = self.writeObjectReference(objRef, output)
                    if isNew:
                        objectsToWrite.append(objRef)
                for objRef in objectsToWrite:
                    output = self.writeObject(objRef, output, setReferencePosition=True)
            elif isinstance(obj, dict):
                output += proc_variable_length(0b1101, len(obj))
                keys = []
                values = []
                objectsToWrite = []
                for key, value in sorted(iteritems(obj)):
                    keys.append(key)
                    values.append(value)
                for key in keys:
                    (isNew, output) = self.writeObjectReference(key, output)
                    if isNew:
                        objectsToWrite.append(key)
                for value in values:
                    (isNew, output) = self.writeObjectReference(value, output)
                    if isNew:
                        objectsToWrite.append(value)
                for objRef in objectsToWrite:
                    output = self.writeObject(objRef, output, setReferencePosition=True)
        return output
    
    def writeOffsetTable(self, output):
        """Writes all of the object reference offsets."""
        all_positions = []
        writtenReferences = list(self.writtenReferences.items())
        writtenReferences.sort(key=lambda x: x[1])
        for obj,order in writtenReferences:
            # Porting note: Elsewhere we deliberately replace empty unicdoe strings
            # with empty binary strings, but the empty unicode string
            # goes into writtenReferences.  This isn't an issue in Py2
            # because u'' and b'' have the same hash; but it is in
            # Py3, where they don't.
            if bytes != str and obj == unicodeEmpty:
                obj = b''
            position = self.referencePositions.get(obj)
            if position is None:
                raise InvalidPlistException("Error while writing offsets table. Object not found. %s" % obj)
            output += self.binaryInt(position, self.trailer.offsetSize)
            all_positions.append(position)
        return output
    
    def binaryReal(self, obj):
        # just use doubles
        result = pack('>d', obj.value)
        return result
    
    def binaryInt(self, obj, byteSize=None, as_number=False):
        result = b''
        if byteSize is None:
            byteSize = self.intSize(obj)
        if byteSize == 1:
            result += pack('>B', obj)
        elif byteSize == 2:
            result += pack('>H', obj)
        elif byteSize == 4:
            result += pack('>L', obj)
        elif byteSize == 8:
            if as_number:
                result += pack('>q', obj)
            else:
                result += pack('>Q', obj)
        elif byteSize <= 16:
            try:
                result = pack('>Q', 0) + pack('>Q', obj)
            except struct_error as e:
                raise InvalidPlistException("Unable to pack integer %d: %s" % (obj, e))
        else:
            raise InvalidPlistException("Core Foundation can't handle integers with size greater than 16 bytes.")
        return result
    
    def intSize(self, obj):
        """Returns the number of bytes necessary to store the given integer."""
        # SIGNED
        if obj < 0: # Signed integer, always 8 bytes
            return 8
        # UNSIGNED
        elif obj <= 0xFF: # 1 byte
            return 1
        elif obj <= 0xFFFF: # 2 bytes
            return 2
        elif obj <= 0xFFFFFFFF: # 4 bytes
            return 4
        # SIGNED
        # 0x7FFFFFFFFFFFFFFF is the max.
        elif obj <= 0x7FFFFFFFFFFFFFFF: # 8 bytes signed
            return 8
        elif obj <= 0xffffffffffffffff: # 8 bytes unsigned
            return 16
        else:
            raise InvalidPlistException("Core Foundation can't handle integers with size greater than 8 bytes.")
    
    def realSize(self, obj):
        return 8
package Mac::Finder::DSStore;

=head1 NAME

Mac::Finder::DSStore - Read and write Macintosh Finder DS_Store files

=head1 DESCRIPTION

C<Mac::Finder::DSStore> provides a handful of functions for reading and
writing the desktop database files created by the Macintosh Finder.

=head1 FUNCTIONS

Many functions take a C<$store> argument which is the opened file as
an instance of L<Mac::Finder::DSStore::BuddyAllocator>, or a C<$block>
argument which is a specific block of the file as an instance of
L<Mac::Finder::DSStore::BuddyAllocator::Block>.

=cut

use strict;
use warnings;
use POSIX qw(ceil);
use Carp qw(croak);
use Fcntl;
require Exporter;

our($VERSION) = '1.00';
our(@ISA) = qw(Exporter);
our(@EXPORT_OK) = qw( getDSDBEntries putDSDBEntries writeDSDBEntries makeEntries );

our($testpoint);

=head2 @records = &Mac::Finder::DSStore::getDSDBEntries($store[, $callback])

Retrieves the "superblock" pointed to by the C<DSDB> entry in the store's table
of contents, and traverses the B-tree it points to, returning a list of
the records in the tree. Alternately, you can supply a callback which will
be invoked for each record, and C<getDSDBEntries> will return an empty list.

=cut

sub getBTreeRootblock {
    my($store) = @_;
    return $store->blockByNumber($store->{toc}->{DSDB})->read(20, 'N*');
}

sub getDSDBEntries {
    my($file, $callback) = @_;

    my(@retval);

    $callback = sub { push(@retval, $_[0]); } unless defined $callback;

    my($rootnode, $height, $nrec, $nnodes, $blksize) = &getBTreeRootblock($file);
    
    my($n) = &traverse_btree($file, $rootnode, $callback);

    warn "Header node count ($nrec) not equal to actual node count ($n)"
	if $n != $nrec;

    @retval;
}

=head2 &Mac::Finder::DSStore::putDSDBEntries($store, $arrayref)

C<$arrayref> must contain a correctly ordered list of
C<Mac::Finder::DSStore::Entry> objects. They will be evenly
organized into a B-tree structure and written to the C<$store>. If there is
an existing tree of records in the file already, it will be deallocated.

This function does not flush the allocator's information back to the file.

=cut

sub putDSDBEntries {
    my($file, $recs) = @_;
    
    my($tocblock, $pagesize);
    my($pagecount, $reccount, $height);

    # Delete the old btree (but keep its superblock), or allocate a superblock.
    if(defined($file->{toc}->{DSDB})) {
	$tocblock = $file->{toc}->{DSDB};
	my($old_rootblock);
	($old_rootblock, $pagesize) = (&getBTreeRootblock($file))[0, 4];
	&freeBTreeNode($file, $old_rootblock);
    } else {
	$tocblock = $file->allocate( 20 );
	$file->{toc}->{DSDB} = $tocblock;
	$pagesize = 0x1000;
    }

    $reccount = @$recs;
    $pagecount = 0;
    $height = 0;

    my(@children);
    
    # Partition the records into btree nodes, from the bottom of
    # the tree working towards the root.
    do {
	my(@sizes);

	if (@children) {
            # Interior node: child pointers interleaved with records
	    @sizes = map { 4 + $_->byteSize } @$recs;
	} else {
            # Leaf node: just a bunch of records
	    @sizes = map { $_->byteSize } @$recs;
	}

        # In addition to @sizes, each page contains a record
        # count and a flag/childnode field (4 bytes each)
	my(@interleaf) = &partition_sizes($pagesize - 8, @sizes);
	my(@nchildren);

	my($next) = 0;
	foreach my $non (@interleaf, 1+$#$recs) {
	    my($blknr) = $file->allocate($pagesize);
	    push(@nchildren, $blknr);
	    my($blk) = $file->blockByNumber($blknr, 1);
	    if (@children) {
		&writeBTreeNode($blk,
				[ @$recs[ $next .. $non-1 ] ],
				[ @children[ $next .. $non ] ] );
	    } else {
		&writeBTreeNode($blk,
				[ @$recs[ $next .. $non-1 ] ]);
	    }
            $blk->close(1);
	    $next = $non + 1;
	    $pagecount ++;
	}
	
	$height ++;
	$recs = [ map { $recs->[$_] } @interleaf ];
	@children = @nchildren;
	die unless @children == 1+@$recs;
    } while(@children > 1);
    die unless 0 == @$recs;

    my($masterblock) = $file->blockByNumber($tocblock, 1);
    $masterblock->write('NNNNN',
			$children[0],
			$height - 1,
			$reccount,
			$pagecount,
			$pagesize);
    $masterblock->close;

    1;
}

# Given a list of sizes, break them into groups so that
# each group sums to no more than $max, not including the items
# that separate them (returned in @ejecta).
sub partition_sizes {
    my($max, @sizes) = @_;
    my($sum) = 0;
    $sum += $_ foreach @sizes;

    return () if $sum <= $max;

    my(@ejecta);
    my($bcount) = ceil($sum / $max);
    my($target) = $sum / $bcount;

    my($n) = 0;
    for(;;) {
	my($bsum) = 0;
	while( $n < @sizes && $bsum < $target && ($bsum + $sizes[$n]) < $max ) {
	    $bsum += $sizes[$n];
	    $n ++;
	}

	last if $n >= @sizes;

	push(@ejecta, $n);
	$n++;
    }

    @ejecta;
}

sub traverse_btree {
    my($store, $nodenr, $callback) = @_;
    my($count);
    my($values, $pointers) = &readBTreeNode( $store->blockByNumber( $nodenr ) );

    if ($testpoint) {
        my($o) = Mac::Finder::DSStore::BuddyAllocator::StringBlock->new();
        {
            # Temporarily disable the test point so writeBTreeNode doesn't
            # recursively invoke it
            local($testpoint) = undef;
            &writeBTreeNode($o, $values, $pointers);
        }
        my($actual) = $store->blockByNumber( $nodenr )->copyback;
        my($roundtrip) = $o->copyback;
        $actual = substr($actual, 0, length($roundtrip));
        $testpoint->( $actual, $roundtrip );
    }

    $count = @$values;
    
    if (defined $pointers) {
	die "Value count should be one less than pointer count" 
	    unless ( @$values + 1 ) == ( @$pointers ) ;
	$count += &traverse_btree($store, shift(@$pointers), $callback);
	while(@$values) {
	    &{$callback}(shift @$values);
	    $count += &traverse_btree($store, shift(@$pointers), $callback);
	}
    } else {
	&{$callback}($_) foreach @$values;
    }

    $count;
}

sub freeBTreeNode {
    my($allocator, $nodeid) = @_;
    my($block) = $allocator->blockByNumber( $nodeid );
    
    if($block->read(4, 'N') != 0) {
	$block->seek(0);
	my(undef, $pointers) = &readBTreeNode($block);
	&freeBTreeNode($allocator, $_) foreach @$pointers;
    }

    $allocator->free($nodeid);
}

sub readBTreeNode {
    my($node) = @_;

    my($pointer) = $node->read(4, 'N');

    my($count) = $node->read(4, 'N');
    if ($pointer > 0) {
	my(@pointers, @values);
	while($count) {
	    push(@pointers, $node->read(4, 'N'));
	    push(@values, Mac::Finder::DSStore::Entry->readEntry($node));
	    $count --;
	}
	push(@pointers, $pointer);
	return \@values, \@pointers;
    } else {
	my(@values);
	while($count) {
	    push(@values, Mac::Finder::DSStore::Entry->readEntry($node));
	    $count --;
	}
	return \@values, undef;
    }
}

sub writeBTreeNode {
    my($into, $values, $pointers) = @_;

    if (!$pointers) {
	# A leaf node: no pointers, just database entries.
	$into->write('NN', 0, scalar(@$values));
	$_->write($into) foreach @$values;
    } else {
	# An internal node: interleaved pointers and values,
	# with the final pointer moved to the front.
	my(@vals) = @$values;
	my(@ps) = @$pointers;
	die "number of pointers must be one more than number of entries"
	    unless 1+@vals == @ps;
	$into->write('NN', pop(@ps), scalar(@vals));
	while(@vals) {
	    $into->write('N', shift(@ps));
	    ( shift(@vals) )->write($into);
	}
    }

    if($testpoint) {
        my($x) = [ &readBTreeNode($into->copyback) ];
        $testpoint->( [ $values, $pointers], $x );
    }
}

=head2 &Mac::Finder::DSStore::writeDSDBEntries($file, @entries)

A convenience function which sorts a list of entries and writes them
to the specified file using C<putDSDBEntries>, then flushes the allocator's
data structures to disk. 
C<$file> may be a filename or an open file handle.
The store object is returned, but you don't need to do anything else with it.

=cut

sub writeDSDBEntries {
    my($store, $recs);
    {
        my($file, @entries) = @_;

        require IO::File;
        require Mac::Finder::DSStore::BuddyAllocator;
        
        unless(ref $file) {
            my($filename) = $file;
            $file = IO::File->new( $filename, Fcntl::O_RDWR | Fcntl::O_CREAT );
            croak "$filename: $!, died" unless $file;
        }

        if((stat($file))[7] > 32) {
            $store = Mac::Finder::DSStore::BuddyAllocator->open($file);
        } else {
            $store = Mac::Finder::DSStore::BuddyAllocator->new($file);
        }

        $recs = [ sort { $a->cmp($b) } @entries ];
    }

    putDSDBEntries($store, $recs);
    $store->writeMetaData;

    $store;
}

=head2 &Mac::Finder::DSStore::makeEntries($filename, [ what => value ... ])

C<makeEntries> encapsulates some information about the format of individual
records in the DS_Store file. It returns a list of records constructed with the
given filename and with the information specified in the rest of its args.
Most args come in pairs, a name and a value, so C<makeEntries> kind of looks
like it takes a hash. Some names take no value and some could take several.
Some produce more than one record as a result.

See the output of the F<examples/dsstore_dump.pl> script for an example of how
to use this, and check the source code for a list of the formats it accepts.

This function might change in the future.

=cut

sub makeEntries {
    my($filename, @info) = @_;
    my(@results);
    
    while(@info) {
        my($recordType) = shift @info;
        
        if ($recordType =~ /^....$/) {
            my($record) = Mac::Finder::DSStore::Entry->new($filename, $recordType);
            $record->value( shift @info );
            push(@results, $record);
        } elsif ($recordType =~ /^(....)_hex$/) {
            my($record) = Mac::Finder::DSStore::Entry->new($filename, $1);
            $record->value( pack('H*', shift @info) );
            push(@results, $record);            
        } else {
            my($mkr) = $Mac::Finder::DSStore::Entry::{'make_'.$recordType};
            croak "Don't know how to handle '$recordType'" unless $mkr;
            push(@results, &{$mkr}($filename, $recordType, \@info));
        }
    }
    
    @results;    
}

package Mac::Finder::DSStore::Entry;

=head1 Mac::Finder::DSStore::Entry

This class holds the individual records from the database. Each record
contains a filename (in some cases, "." to refer to the containing
directory), a 4-character record type, and a value. The value is
one of a few concrete types, according to the record type.

=cut

use strict;
use warnings;
use Encode ();
use Carp qw(croak);

#
# Concrete types of known ids
#
our(%types) = (
               'BKGD' => 'blob',
               'bwsp' => 'blob',
               'cmmt' => 'ustr',
               'dilc' => 'blob',
               'dscl' => 'bool',
               'extn' => 'ustr',
               'fwi0' => 'blob',
               'fwsw' => 'long',
               'fwvh' => 'shor',
               'GRP0' => 'ustr',
               'icgo' => 'blob',
               'icsp' => 'blob',
               'icvo' => 'blob',
               'ICVO' => 'bool',
               'icvp' => 'blob',
               'icvt' => 'shor',
               'Iloc' => 'blob',
               'info' => 'blob',
               'lg1S' => 'comp',
               'logS' => 'comp',
               'lssp' => 'blob',
               'lsvo' => 'blob',
               'LSVO' => 'bool',
               'lsvP' => 'blob',
               'lsvp' => 'blob',
               'lsvt' => 'shor',
               'moDD' => 'dutc',
               'modD' => 'dutc',
               'ph1S' => 'comp',
               'phyS' => 'comp',
               'pict' => 'blob',
               'vSrn' => 'long',
               'vstl' => 'type',
               );

=head2 $entry = ...::Entry->new($filename, $typecode)

Creates a new entry with no value. The concrete type is inferred from the
record type code.

=head2 $entry->filename

Gets the filename of an entry.

=head2 $entry->strucId

Gets the record type of this entry, as a four-character string, indicating
what aspect of the file the entry describes.

=head2 $entry->value([$value])

Gets or sets the value of an entry.

If the concrete type is C<blob> or C<type>, the value is interpreted as a byte string; 
if it is C<ustr>, as a character string.
If the concrete type is C<long>, C<shor>, C<comp>, C<dutc>, or C<bool>,
then the value should be an integer.

=cut

sub new {
    my($class, $filename, $strucId, @opts) = @_;
    
    croak "no opts supported yet, died" if @opts;

    bless([ $filename, $strucId, $types{$strucId}, undef ],
          ref $class || $class);
}

sub filename {
    $_[0]->[0];
}

sub strucId {
    $_[0]->[1];
}

sub value {
    my($self, $value) = @_;
 
    return $self->[3] unless defined $value;
   
    croak "Can't set a value on an entry with no concrete type"
        unless defined($self->[2]);
    
    my($t) = $self->[2];
    if($t eq 'blob' or $t eq 'ustr') {
        $self->[3] = '' . $value;
    } elsif ($t eq 'bool' or $t eq 'shor' or $t eq 'long') {
        $self->[3] = 0 + $value;
    } elsif ($t eq 'type') {
        $value = '' . $value;
        croak "'type' values must be exactly four bytes long"
            unless length($value) == 4;
        $self->[3] = $value;
    } else {
        die "Unknown concrete type $t, died";
    }

    $self->[3];
}

sub readEntry {
    my($class, $block) = @_;

    my($filename, $strucId, $strucType, $value);

    $filename = &readFilename($block);
    $strucId = $block->read(4);
    $strucType = $block->read(4);
    
    if ($strucType eq 'bool') {
	$value = $block->read(1, 'C');
    } elsif ($strucType eq 'long' or $strucType eq 'shor') {
	$value = $block->read(4, 'N');
    } elsif ($strucType eq 'blob') {
	my($bloblen) = $block->read(4, 'N');
	$value = $block->read($bloblen);
    } elsif ($strucType eq 'ustr') {
	my($strlen) = $block->read(4, 'N');
	$value = Encode::decode('UTF-16BE', $block->read(2 * $strlen));
    } elsif ($strucType eq 'type') {
        $value = $block->read(4);
    } elsif ($strucType eq 'comp' || $strucType eq 'dutc') {
        $value = $block->read(8, 'Q>');
    } else {
	die "Unknown struc type '$strucType', died";
    }

    return bless([ $filename, $strucId, $strucType, $value ],
		 ref($class) || $class);
}

sub readFilename {
    my($block) = @_;

    my($flen) = $block->read(4, 'N');
    my($utf16be) = $block->read(2 * $flen);
    
    return Encode::decode('UTF-16BE', $utf16be, Encode::FB_CROAK);
}

sub byteSize {
    my($filename, $strucId, $strucType, $value) = @{$_[0]};
    my($size);

    # TODO: We're assuming that the filename is completely normal
    # basic-multilingual-plane characters, and doesn't need to be de/re-
    # composed or anything.
    $size = length($filename) * 2 + 12;
    # 12 bytes: 4 each for filename length, struct id, and struct type

    if ($strucType eq 'long' or $strucType eq 'shor' or $strucType eq 'type') {
	$size += 4;
    } elsif ($strucType eq 'bool') {
	$size += 1;
    } elsif ($strucType eq 'blob') {
	$size += 4 + length($value);
    } elsif ($strucType eq 'ustr') {
	$size += 4 + 2 * length($value);
    } elsif ($strucType eq 'comp' or $strucType eq 'dutc') {
        $size += 8;
    } else {
	die "Unknown struc type '$strucType', died";
    }

    $size;
}

sub write {
    my($self, $into) = @_;
    
    my($fname) = Encode::encode('UTF-16BE', $self->[0]);

    my($strucType) = $self->[2];

    $into->write('N a* a4 a4', length($fname)/2, $fname,
		 $self->[1], $strucType);

    if ($strucType eq 'long' or $strucType eq 'shor') {
	$into->write('N', $self->[3]);
    } elsif ($strucType eq 'bool') {
	$into->write('C', $self->[3]);
    } elsif ($strucType eq 'blob') {
	$into->write('N', length($self->[3]));
	$into->write($self->[3]);
    } elsif ($strucType eq 'ustr') {
	$into->write('N', length($self->[3]));
	$into->write(Encode::encode('UTF-16BE', $self->[3]));
    } elsif ($strucType eq 'type') {
        $into->write('a4', $self->[3]);
    } elsif ($strucType eq 'comp' or $strucType eq 'dutc') {
        $into->write('Q>', $self->[3]);
    } else {
	die "Unknown struc type '$strucType', died";
    }
}

=head2 $entry->cmp($other)

Returns -1, 0, or 1 depending on the relative ordering of the two entries,
according to (a guess at) the record ordering used by the store's B-tree.

=cut

sub cmp {
    my($self, $other) = @_;

    #
    # There's probably some wacky Mac-specific Unicode collation
    # rule for these, but case-insensitive comparison is a good
    # approximation
    #

    # Ordering in the btree is Finder-filename-ordering on the files,
    # and simple bytewise ordering on the structure IDs.

    ( lc($self->[0]) cmp lc($other->[0]) ) 
        ||
    ( $self->[1] cmp $other->[1] );
}

#
#  The make_foo subs are used by Mac::Finder::DSStore::makeEntries.
#

sub make_BKGD_default {
    my($filename, undef, undef) = @_;

    my($rec) = Mac::Finder::DSStore::Entry->new($filename, 'BKGD');
    $rec->value( pack('A4 x8', 'DefB') );
    $rec;
}

sub make_BKGD_color {
    my($filename, $strucId, $argv) = @_;
    my($color) = shift @$argv;
    my($rgb);

    if ($color =~ /^\#([0-9a-f]+)$/i) {
        if(length($1) == 3) {
            ( $rgb = $1 ) =~ s/(.)(.)(.)/$1$1$1$1$2$2$2$2$3$3$3$3/;
        } elsif (length($1) == 6) {
            ( $rgb = $1 ) =~ s/(..)(..)(..)/$1$1$2$2$3$3/;
        } elsif (length($1) == 12) {
            $rgb = $1;
        }
    }

    croak "Can't parse color string '$color'"
        unless $rgb;

    my($rec) = Mac::Finder::DSStore::Entry->new($filename, 'BKGD');
    $rec->value( pack('A4 H12 x2', 'ClrB', $rgb) );

    $rec;
}

sub make_BKGD_alias {
    my($filename, $strucId, $argv) = @_;

    my($image) = shift @$argv;

    if(!ref $image) {
        require Mac::Memory;
        require Mac::Files;
        $image = Mac::Files::NewAlias($image);
    }

    my($isize) = $image->size;
    my($bkgd, $pict);

    $bkgd = Mac::Finder::DSStore::Entry->new($filename, 'BKGD');
    $bkgd->value( pack('A4 N nn', 'PctB', $isize, 0, 0) );

    $pict = Mac::Finder::DSStore::Entry->new($filename, 'pict');
    $pict->value( $image->get );

    ( $bkgd, $pict );
}

sub _make_packed {
    my($filename, $strucId, $fmt, @values) = @_;
    my($record) = Mac::Finder::DSStore::Entry->new($filename, $strucId);
    $record->value( pack($fmt, @values) );
    $record;
}

sub _make_packed_arrayref {
    my($filename, $strucId, $argv, $format, $reqcount, $dflt) = @_;
    my($values) = shift @$argv;

    croak "$strucId argument must be an array ref"
        unless ref $values;

    croak "$strucId argument must have at least $reqcount items"
        unless $reqcount <= @$values;

    my($max) = $reqcount + @$dflt;

    croak "$strucId argument can't have more than $max items"
        if $max < @$values;

    my(@fields) = @$values;
    if ($max > @fields) {
        push(@fields, @{$dflt}[ ( @fields - $max ) .. -1 ]);
    }

    return &_make_packed($filename, substr($strucId, 0, 4),
                         $format, @fields);
}

sub make_Iloc_xy {
    my($filename, $strucId, $argv) = @_;
    return &_make_packed_arrayref($filename, $strucId, $argv,
                                  'NN nnnn', 2, [65535, 65535, 65535, 0]);
}

sub make_fwi0_flds {
    my($filename, $strucId, $argv) = @_;
    my($flds) = shift @$argv;
    
    croak "$strucId argument must have 7 values"
        unless 7 == @$flds;

    return &_make_packed($filename, 'fwi0', 'n4 A4 n*', @$flds);
}
    

=head1 SEE ALSO

See L<Mac::Finder::DSStore::Format> for more detailed information on
the record types found in a DS_Store file.

See L<Mac::Finder::DSStore::BuddyAllocator> for the low-level organization
of the DS_Store file.

=head1 AUTHOR

Copyright 2008 by Wim Lewis E<lt>wiml@hhhh.orgE<gt>.

Some information is from Mark Mentovai via the Mozilla project.
Thanks also to Martin Baker for bug reports.

=cut

1;
package Mac::Finder::DSStore::BuddyAllocator;

=head1 NAME

Mac::Finder::DSStore::BuddyAllocator - Allocate space within a file

=head1 DESCRIPTION

C<Mac::Finder::DSStore::BuddyAllocator>
implements a buddy-allocation scheme within a file. It's used by
C<Mac::Finder::DSStore> to read certain files created by the Macintosh
Finder.

The allocation methods do not perform any actual file I/O.
The contents of allocated blocks are read and written by the caller using
methods on C<BuddyAllocator::Block>.
If the C<allocate> and C<free> methods are used,
or if the C<toc> hash is modified,
C<writeMetaData> must be called for the changes to be reflected in the file.

=head1 METHODS

=cut

use strict;
use warnings;
use Carp;

our($VERSION) = '1.00';

# Debug logging. Uncomment these and all uses of them to activate.
# It might be nice to make this more easily switchable.
#our($loglevel) = 0;
#sub logf {
#    print STDERR ( ' ' x $loglevel ) . sprintf($_[0], @_[1 .. $#_ ]) . "\n";
#}

=head2 $allocator = Mac::Finder::DSStore::BuddyAllocator->open($fh)

C<open($fh)> constructs a new buddy allocator 
and initializes its state from the information in the file.
The file handle is retained by the allocator for future
operations.

=cut

sub open {
    my($class, $fh) = @_;

    binmode($fh);

    # read the file header: 32 bytes, plus a mysterious extra
    # four bytes at the front
    my($fheader);
    $fh->read($fheader, 4 + 0x20) == 0x24
	or die "Can't read file header: $!";
    my($magic1, $magic, $offset, $size, $offset2, $unk2) = unpack('N a4 NNN a16', $fheader);
    die 'bad magic' unless $magic eq 'Bud1' and $magic1 == 1;
    die 'inconsistency: two root addresses are different'
	unless $offset == $offset2;

    my($self) = {
	fh => $fh,
	unk2 => $unk2,
	fudge => 4,  # add this to offsets for some unknown reason
    };
    bless($self, ref($class) || $class);
    
    # retrieve the root/index block which contains the allocator's
    # book-keeping data
    my ($rootblock) = $self->getBlock($offset, $size);

    # parse out the offsets of all the allocated blocks
    # these are in tagged offset format (27 bits offset, 5 bits size)
    my($offsetcount, $unk3) = $rootblock->read(8, 'NN');
    # not sure what the word following the offset count is
    $self->{'unk3'} = $unk3;
    # For some reason, offsets are always stored in blocks of 256.
    my(@offsets);
    while($offsetcount > 0) {
	push(@offsets, $rootblock->read(1024, 'N256'));
	$offsetcount -= 256;
    }
    # 0 indicates an empty slot; don't need to keep those around
    while($offsets[$#offsets] == 0) { pop(@offsets); }
    grep { $_ = undef if $_ == 0 } @offsets;

    # Next, read N key/value pairs
    my($toccount) = $rootblock->read(4, 'N');
    my($toc) = {
    };
    while($toccount--) {
	my($len) = $rootblock->read(1, 'C');
	my($name) = $rootblock->read($len);
	my($value) = $rootblock->read(4, 'N');
	$toc->{$name} = $value;
    }

    $self->{'offsets'} = \@offsets;
    $self->{'toc'} = $toc;

    # Finally, read the free lists.
    my($freelists) = { };
    for(my $width = 0; $width < 32; $width ++) {
	my($blkcount) = $rootblock->read(4, 'N');
	$freelists->{$width} = [ $rootblock->read(4 * $blkcount, 'N*') ];
    }
    $self->{'freelist'} = $freelists;

    return $self;
}

=head2 $allocator = Mac::Finder::DSStore::BuddyAllocator->new($fh)

Similar to C<open>, but does not read anything from the file. This
can be used to create a new file from scratch.

=cut

sub new {
    my($cls, $fh) = @_;

    binmode($fh) if defined($fh);

    my($self) = {
	fh => $fh,
	toc => { },
	offsets => [ ],
	freelist => { },

	# And the mystery meat goes here...
	unk2 => pack('NNNN', 0x100C, 0x0087, 0x200B, 0 ),
	unk3 => 0,
	fudge => 4
    };
    bless($self, ref $cls || $cls);

    # All our freelists are empty...
    foreach my $width (0 .. 30) {
	$self->{freelist}->{$width} = [ ];
    }
    # ... except for a single 2GB block starting at 0
    $self->{freelist}->{31} = [ 0 ];

    # Allocate the header block, 2^5 bytes wide
    my($hdr) = $self->_alloc(5);
    # it had better be at offset zero
    ( $hdr == 0 ) or die;

    $self;
}

=head2 $allocator->close( )

Closes the underlying file handle.

=cut

sub close {
    my($self) = @_;
    my($fh) = $self->{fh};

    delete $self->{fh};

    $fh->close;
}

=head2 $allocator->listBlocks($verbose)

List all the blocks in order and see if there are any gaps or overlaps.
If C<$verbose> is true, then the blocks are listed to the current
output filehandle. Returns true if the allocated and free blocks
have no gaps or overlaps.

=cut

sub listBlocks {
    my($self, $verbose) = @_;
    my(%byaddr);
    my($addr, $len);

    # We store all blocks (allocated and free) in %byaddr,
    # then go through its keys in order

    # Store the implicit 32-byte block that holds the file header
    push(@{$byaddr{0}}, "5 (file header)");

    # Store all the numbered/allocated blocks from @offsets
    for my $blnum (0 .. $#{$self->{'offsets'}}) {
	my($addr_size) = $self->{'offsets'}->[$blnum];
	next unless defined $addr_size;
	$addr = $addr_size & ~0x1F;
	$len = $addr_size & 0x1F;
	push(@{$byaddr{$addr}}, "$len (blkid $blnum)");
    }

    # Store all the blocks in the freelist(s)
    for $len (keys %{$self->{'freelist'}}) {
	for $addr (@{$self->{'freelist'}->{$len}}) {
	    push(@{$byaddr{$addr}}, "$len (free)");
	}
    }

    my($gaps, $overlaps) = (0, 0);

    # Loop through the blocks in order of address
    my(@addrs) = sort {$a <=> $b} keys %byaddr;
    $addr = 0;
    while(@addrs) {
	my($next) = shift @addrs;
	if ($next > $addr) {
	    print "... ", ($next - $addr), " bytes unaccounted for\n"
		if $verbose;
	    $gaps ++;
	}
	my(@uses) = @{$byaddr{$next}};
	printf "%08x %s\n", $next, join(', ', @uses)
	    if $verbose;
	$overlaps ++ if @uses > 1;

	# strip off the length (log_2(length) really) from the info str
	($len = $uses[0]) =~ s/ .*//;
	$addr = $next + ( 1 << (0 + $len) );
    }

    ( $gaps == 0 && $overlaps == 0 );
}

=head2 $allocator->writeMetaData( )

Writes the allocator's metadata (header block and root block)
back to the file.

=cut

sub writeMetaData {
    my($self) = @_;

    # Root block nr is hardcoded to 0.
    # We don't actually care, but the DSStore btree does.
    my($blocknr) = 0;

    # Before computing the size of the rootblock to allocate it,
    # make sure it'll be large enough to hold its own (eventual)
    # allocation information.
    $self->{offsets}->[0] = undef unless exists $self->{offsets}->[0];

    my($rbs) = $self->rootBlockSize();
    $self->allocate($rbs, $blocknr);
    
    $self->writeRootblock($self->blockByNumber($blocknr, 1));

    my($blockOffset, $blockLength) = $self->blockOffset($blocknr);

    $self->{fh}->seek(0, 0);
    $self->{fh}->write(pack('N', 1)); # magic1
    $self->_sought(0)->write(pack('a4 NNN a16',
				  'Bud1', # magic
				  $blockOffset, $blockLength, $blockOffset,
				  $self->{unk2}));

    $self->{fh}->flush;
}

sub rootBlockSize {
    my($self) = @_;
    my($size);

    $size = 8;  # The offset count and the unknown field that follows it
    
    # The offset blocks, rounded up to a multiple of 256 entries
    my($offsetcount) = scalar( @{$self->{'offsets'}} );
    my($tail) = $offsetcount % 256;
    $offsetcount += 256 - $tail if ($tail);
    $size += 4 * $offsetcount;

    # The table of contents
    $size += 4; # count
    $size += (5 + length($_)) foreach keys %{$self->{'toc'}};

    # The freelists
    foreach my $width (0 .. 31) {
	$size += 4 + 4 * scalar( @{$self->{'freelist'}->{$width}} );
    }

    $size;
}

sub writeRootblock {
    my($self, $into) = @_;

    my(@offsets) = @{$self->{'offsets'}};
    
    # Write the offset count & the unknown field that follows it
    $into->write('NN', scalar(@offsets), $self->{'unk3'});
    
    # Write the offsets (using 0 to indicate an unused slot)
    $into->write('N*', map { (defined($_) && $_ > 0)? $_ : 0 } @offsets);
    
    # The offsets are always written in blocks of 256.
    my($offsetcount) = scalar(@offsets) % 256;
    if ($offsetcount > 0) {
	# Fill out the last block
	$into->write('N*', (0) x (256-$offsetcount));
    }

    # The DS_Store files only ever have one item in their
    # table of contents, so I'm not sure if it needs to be sorted or what
    my(@tockeys) = sort keys %{$self->{'toc'}};
    $into->write('N', scalar(@tockeys));
    foreach my $entry (@tockeys) {
	$into->write('C a* N', length($entry), $entry, $self->{'toc'}->{$entry});
    }
    
    # And finally the freelists
    for my $width ( 0 .. 31 ) {
	my($blks) = $self->{'freelist'}->{$width};
	$into->write('N N*', scalar(@$blks), @$blks);
    }
}

=head2 $block = $allocator->blockByNumber(blocknumber[, write])

Retrieves a block by its block number (I<aka> block ID).

If C<write> is supplied and is true, then the returned block implements the
C<write> method but not the C<read> method.

=head2 $block = $allocator->getBlock(offset, size)

Retrieves a block (a BuddyAllocator::Block instance) by offset & length.
Normally you should use C<blockByNumber> instead of this method.

=cut

sub getBlock {
    my($self, $offset, $size) = @_;

    return Mac::Finder::DSStore::BuddyAllocator::Block->new($self, $offset, $size);
}

# Retrieve a block by its block number (small integer)
sub blockByNumber {
    my($self, $id, $write) = @_;
    my($addr) = $self->{offsets}->[$id];
    return undef unless $addr;
    my($offset, $len);
    $offset = $addr & ~0x1F;
    $len = 1 << ( $addr & 0x1F );
#    print "  node id $id is $len bytes at 0x".sprintf('%x', $offset)."\n";
    if (!defined($write) || !$write) {
	return Mac::Finder::DSStore::BuddyAllocator::Block->new($self, $offset, $len);
    } else {
	return Mac::Finder::DSStore::BuddyAllocator::WriteBlock->new($self, $offset, $len);
    }
}

=head2 ( $offset, $size ) = $allocator->blockOffset(blockid)

Retrieves the file offset and size in bytes of a given block.
The offset doesn't include the 4-byte fudge.
In scalar context, just returns the offset.

=cut

sub blockOffset {
    my($self, $id) = @_;
    my($addr) = $self->{offsets}->[$id];
    croak "Block $id is not allocated" unless $addr;
    my($offset) = $addr & ~0x1F;
    return $offset unless wantarray;
    return ( $offset,  1 << ( $addr & 0x1F ) );
}

# Return freelist + index of a block's buddy in its freelist (or empty list)
sub _buddy {
    my($self, $offset, $width) = @_;
    my($freelist, $buddyaddr);

    $freelist = $self->{'freelist'}->{$width};
    $buddyaddr = $offset ^ ( 1 << $width );

    return ($freelist,
	    grep { $freelist->[$_] == $buddyaddr } 0 .. $#$freelist );
}

# Free a block, coalescing ith buddies as needed.
sub _free {
    my($self, $offset, $width) = @_;

    my($freelist, $buddyindex) = $self->_buddy($offset, $width);

    if(defined($buddyindex)) {
	# our buddy is free. Coalesce, and add the coalesced block to flist.
	my($buddyoffset) = splice(@$freelist, $buddyindex, 1);
	#&logf("Combining %x with buddy %x", $offset, $buddyoffset);
	$self->_free($offset & $buddyoffset, $width+1);
    } else {
	#&logf("Adding block %x to freelist %d", $offset, $width);
	@$freelist = sort( @$freelist, $offset );
    }
}

# Allocate a block of a specified width, splitting as needed.
sub _alloc {
    my($self, $width) = @_;
    
    #&logf("Allocating a block of width %d", $width);
    #$loglevel ++;

    my($flist) = $self->{'freelist'}->{$width};
    if (@$flist) {
	# There is a block of the desired size; return it.
	#&logf("Pulling %x from freelist", $flist->[0]); $loglevel --;
	return shift @$flist;
    } else {
	# Allocate a block of the next larger size; split it.
	my($offset) = $self->_alloc($width + 1);
	# and put the other half on the free list.
	my($buddy) = $offset ^ ( 1 << $width );
	#&logf("Splitting %x into %x and %x", $offset, $offset, $buddy);
	#$loglevel ++;
	$self->_free($buddy, $width);
	#$loglevel -= 2;
	return $offset;
    }
}

=head2 $blocknumber = $allocator->allocate($size, [$blocknumber])

Allocates or re-allocates a block to be at least C<$size> bytes long.
If C<$blocknumber> is given, the specified block will be grown or
shrunk if needed, otherwise a new block number will be chosen and
given to the allocated block.

Unlike the libc C<realloc> function, this may move a block even if the
block is not grown.

=head2 $allocator->free($blocknumer)

Releases the block number and the block associated with it back to the
block pool.

=cut

sub allocate {
    my($self, $bytes, $blocknum) = @_;
    my($offsets) = $self->{'offsets'};

    #if(defined($blocknum)) {
    #    &logf("(Re)allocating %d bytes for blkid %d", $bytes, $blocknum);
    #}

    if(!defined($blocknum)) {
	$blocknum = 1;
	# search for an empty slot, or extend the array
	$blocknum++ while defined($offsets->[$blocknum]);
	#&logf("Allocating %d bytes, assigning blkid %d", $bytes, $blocknum);
    }

    #$loglevel ++;

    my($wantwidth) = 5;
    # Minimum width, since that's how many low-order bits we steal for the tag
    $wantwidth ++ while $bytes > 1 << $wantwidth;

    my($blkaddr, $blkwidth, $blkoffset);

    if(exists($offsets->[$blocknum]) && $offsets->[$blocknum]) {
	$blkaddr = $offsets->[$blocknum];
	$blkwidth = $blkaddr & 0x1F;
	$blkoffset = $blkaddr & ~0x1F;
	if ($blkwidth == $wantwidth) {
	    #&logf("Block is already width %d, no change", $wantwidth);
	    #$loglevel --;
	    # The block is currently of the desired size. Leave it alone.
	    return $blocknum;
	} else {
	    #&logf("Freeing wrong-sized block");
	    #$loglevel ++;
	    # Free the current block, allocate a new one.
	    $self->_free($blkoffset, $blkwidth);
	    delete $offsets->[$blocknum];
	    #$loglevel --;
	}
    }

    # Allocate a block, update the offsets table, and return the new offset
    $blkoffset = $self->_alloc($wantwidth);
    $blkaddr = $blkoffset | $wantwidth;
    $offsets->[$blocknum] = $blkaddr;
    #$loglevel --;
    $blocknum;
}

sub free {
    my($self, $blknum) = @_;
    my($blkaddr) = $self->{'offsets'}->[$blknum];

    #&logf("Freeing block index %d", $blknum);
    #$loglevel ++;

    if($blkaddr) {
	my($blkoffset, $blkwidth);
	$blkwidth = $blkaddr & 0x1F;
	$blkoffset = $blkaddr & ~0x1F;
	$self->_free($blkoffset, $blkwidth);
    }

    delete $self->{'offsets'}->[$blknum];
    #$loglevel --;
    undef;
}

=head1 ATTRIBUTES

=head2 $allocator->{toc}

C<toc> holds a hashref whose keys are short strings and whose values
are integers. This table of contents is read and written as part of the
allocator's metadata but is not otherwise used by the allocator;
users of the allocator use it to find their data within the file.

=head2 $allocator->{fh}

The file handle passed in to C<open> or C<new>. If you find yourself needing
to use this, you should probably try to extend the class so that you don't.

=cut

# Used by ...::Block to get a positioned file handle.
sub _sought {
    my($self, $offset) = @_;

    my($fh) = $self->{fh};
    $fh->seek($offset + $self->{fudge}, 0)
	or croak;
    $fh;
}

package Mac::Finder::DSStore::BuddyAllocator::Block;

=head1 BuddyAllocator::Block

C<BuddyAllocator::Block> instances are returned by the
C<blockByNumber> and C<getBlock> methods. They hold a pointer into
the file and provide a handful of useful methods.

(There are also two other classes, C<WriteBlock> and C<StringBlock>,
which might be returned instead. Think of this as an interface rather
than as a concrete class.)

=head2 $block->read(length, [format])

Reads C<length> bytes from the block (advancing the read pointer
correspondingly). If C<format> is specified, the bytes read are
unpacked using the format; otherwise a byte string is returned. 

=head2 $block->length( )

Returns the length (or size) of this block.

=head2 $block->seek(position[, whence])

Adjusts the read/write pointer within the block.

=head2 $block->write(bytes)

=head2 $block->write(format, items...)

Writes data to the underlying file, at the position represented by this
block. If multiple arguments are given, the first is a format string
and the rest are the remaining arguments to C<pack>.

=head2 $block->close([ zerofill ])

This is generally a no-op, but if called on a writable block with
C<zerofill = true>, then zeroes will be written from the current
location to the end of the allocated block.

=head2 $block->copyback( )

Returns the block's contents as a string. For write blocks, this
reads from the file. This is just here for debugging purposes and
might change.

=cut

use strict;
use warnings;
use Carp;

#
# Block objects are created by the buddy allocator; they're a
# reference to an array with the following components:
#
#  [ $allocator, $value, $position]
#

sub new {
    my($class, $allocator, $offset, $size) = @_;

    my($value);
    $allocator->_sought($offset)->read($value, $size)
	> 0 or die;
    # Previously, this died if we couldn't read the full block.
    # Not sure if it's really an error not to read the full
    # block if the next layer up doesn't need the full block.
    # So now we're succeeding as long as we get something; if
    # the reader overruns it'll die in substr().

    bless([ $allocator, $value, 0 ], ref $class || $class);
}

sub read {
    my($self, $len, $unpack) = @_;

    my($pos) = $self->[2];
    die "out of range: pos=$pos len=$len max=".(length($self->[1])) if $pos + $len > length($self->[1]);
    my($bytes) = substr($self->[1], $pos, $len);
    $self->[2] = $pos + $len;
    
    $unpack? unpack($unpack, $bytes) : $bytes;
}

sub length {
    return CORE::length($_[0]->[1]);
}

sub close {
    1;
}

sub seek {
    my($self, $pos, $whence) = @_;
    $whence = 0 unless defined $whence;
    if ($whence == 0) {
	# pos = pos
    } elsif ($whence == 1) {
	$pos += $self->[2];
    } elsif ($whence == 2) {
	$pos += $self->length();
    } else {
	croak "seek: whence=$whence";
    }
    $self->[2] = $pos;
}

sub copyback {
    return $_[0]->[1];
}

package Mac::Finder::DSStore::BuddyAllocator::WriteBlock;

use strict;
use warnings;
use Carp;

#
# Write blocks
#

sub new {
    my($class, $allocator, $offset, $size) = @_;

    croak "Missing arguments"
	unless defined($offset) && defined($size);
    croak "Bad offset"
	if $offset <= 0;

    bless([ $allocator, undef, 0, $offset, $size ], ref $class || $class);
}

sub read {
    my($self) = @_;

    croak "This is a write-only block";
}

sub length {
    return ($_[0]->[4]);
}

sub seek {
    my($self, $pos, $whence) = @_;
    if ($whence == 0) {
	$self->[2] = $pos;
    } elsif ($whence == 1) {
	$self->[2] += $pos;
    } elsif ($whence == 2) {
	$self->[2] = $self->length + $pos;
    } else {
	croak "seek: whence=$whence";
    }
    undef $self->[1];
    $self;
}

sub write {
    my($self, $what, @args) = @_;;

    if (!defined($self->[1])) {
	$self->[1] = $self->[0]->_sought($self->[2] + $self->[3]);
    }

    if (@args) {
	$what = pack($what, @args);
    }

    my($wlen) = CORE::length($what);

    croak "Writing past end of block (writing $wlen at ".($self->[2]).", end is at ".($self->[4])."), died"
        if $self->[2]+$wlen > $self->[4];

    $self->[1]->write($what);
    $self->[2] += $wlen;
}

sub close {
    my($self, $fill) = @_;
    if (defined($fill) && $fill && $self->[2] < $self->[4]) {
        $self->write("\0" x ($self->[4] - $self->[2]));
    }
    undef $self->[1];
    1;
}

#
# This is just here for debugging/testing purposes
#

sub copyback {
    my($self) = @_;

    my($r) = Mac::Finder::DSStore::BuddyAllocator::Block->new(@{$self}[0, 3, 2]);

    undef $self->[1]; # probably need to re-seek now

    return $r;
}

package Mac::Finder::DSStore::BuddyAllocator::StringBlock;

use strict;
use warnings;

#
# This one's kind of handy, really, but is only used for debugging and
# test harnesses right now.
#

sub new {
    my($x) = '';
    bless(\$x, ref $_[0] || $_[0]);
}

sub write {
    my($self, $what, @args) = @_;;

    if (@args) {
	$what = pack($what, @args);
    }

    ${$self} .= $what;
}

sub copyback {
    ${$_[0]};
}

=head1 AUTHOR

Written by Wim Lewis as part of the Mac::Finder::DSStore package.

This file is copyright 2008 by Wim Lewis.
All rights reserved.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.


=cut

1;
=head1 DS_Store Format

Some notes on the format of the Macintosh Finder's F<.DS_Store> files.

=head1 OVERVIEW

The Mac OS X Finder stores information about how it displays directories
and files in files named F<.DS_Store> in each directory which it has touched.
(This seems to be a departure from the pre-OSX method of storing all the
information in one file at the root of each filesystem).
The format is not documented by Apple.
The information in this file is based on the reverse-engineering notes
by Mark Mentovai published on the Mozilla wiki,
and further investigation by me (Wim Lewis).

=head1 FILE FORMAT

The F<.DS_Store> file holds a series of records giving attributes of
the files in the directory or of the directory itself (referred to as
F<.>). These records are stored in a B-tree, and the pages of the
B-tree are stored in the file by a "buddy allocator" along with a
small amount of metadata. The allocator also provides a level of
indirection, from small integers to file offsets, presumably allowing
blocks to be relocated as they grow and shrink.

The file is generally big-endian. Unless otherwise noted, an "integer"
is a four-byte (32-bit) big-endian number, probably unsigned (but I'm
not always sure about that).

=head2 Records

A record has the following format:

=over

=item *

Filename length, in characters, as an integer. (4 bytes)

=item *

Filename, in big-endian UTF-16. Presumably with the same Unicode
composition rules as the HFS+ filesystem. (2 * length bytes)

=item *

Structure id or type, a FourCharCode indicating what property of the
file this entry describes. (4 bytes)

=item *

Data type (4 bytes), indicating what kind of data field follows:

=over

=item C<'long'>

An integer (4 bytes)

=item C<'shor'>

A short integer? Still stored as four bytes, but the first two are
always zero.

=item C<'bool'>

A boolean value, stored as one byte.

=item C<'blob'>

An arbitrary block of bytes, stored as an integer followed by that
many bytes of data.

=item C<'type'>

Four bytes, containing a FourCharCode.

=item C<'ustr'>

A Unicode text string, stored as an integer character count followed 
by 2*count bytes of data in UTF-16.

=item C<'comp'>

An eight-byte (64-bit) integer.
(I don't know why the abbreviation "comp" was chosen for this.)

=item C<'dutc'>

A datestamp, represented as an 8-byte integer count of the number
of (1/65536)-second intervals since the Mac epoch in 1904. Given
the name, this probably corresponds to the C<UTCDateTime> structure.

=back

=back

A given structure id/type always seems to have the same type of data
associated with it, and any structure id appears at most once per
filename. Some only appear on files, and some only appear on
directories (including the filename F<.>).

Information about a directory (its Finder window view settings, for
example) is usually held in its parent directory's store file, unless
the directory is at the root of its volume, in which case it's held
in the directory itself with the filename F<.>.

I've encountered the following record types:

=over

=item C<'BKGD'>

12-byte C<blob>, directories only. Indicates the background of the
Finder window viewing this directory (in icon mode). The format
depends on the kind of background:

=over

=item Default background

FourCharCode C<DefB>, followed by eight unknown bytes, probably garbage.

=item Solid color

FourCharCode C<ClrB>, followed by an RGB value in six bytes, followed by two unknown bytes.

=item Picture

FourCharCode C<PctB>, followed by the the length of the blob
stored in the C<'pict'> record, followed by four unknown bytes.
The C<'pict'> record points to the actual background image.

=back

=item C<'ICVO'>

C<bool>, directories only. Unknown meaning. Always seems to be 1, so
presumably 0 is the default value.

=item C<'Iloc'>

16-byte C<blob>, attached to files and directories. 
The file's icon location. Two 4-byte values representing the
horizontal and vertical positions of the icon's center (not
top-left). (Then, 6 bytes 0xff and 2 bytes 0?) For the purposes of the
center, the icon only is taken into account, not any label. The icon's
size comes from the icvo blob.

=item C<'LSVO'>

C<bool>, attached to directories. Purpose unknown.

=item C<'bwsp'>

A C<blob> containing a binary plist. This contains the size
and layout of the window (including whether optional parts like
the sidebar or path bar are visible).
This appeared in Snow Leopard (10.6).

The plist contains the keys C<WindowBounds> (a string in the same
format in which AppKit saves window frames); C<SidebarWidth> (a
float), and booleans C<ShowSidebar>, C<ShowToolbar>, C<ShowStatusBar>,
and C<ShowPathbar>.  Sometimes contains C<ViewStyle> (a string),
C<TargetURL> (a string), and C<TargetPath> (an array of strings).

=item C<'cmmt'>

C<ustr>, containing a file's "Spotlight Comments".
(The comment is also stored in the C<com.apple.metadata:kMDItemFinderComment>
xattr; this copy may be historical.)

=item C<'dilc'>

32-byte C<blob>, attached to files and directories.
Unknown, may indicate the icon location
when files are displayed on the desktop.

=item C<'dscl'>

C<bool>, attached to subdirectories. Indicates that the
subdirectory is open (disclosed) in list view.

=item C<'extn'>

C<ustr>. Often contains the file extension of the file, but sometimes
contains a different extension.
Purpose unknown.

=item C<'fwi0'>

16-byte C<blob>, directories only.
Finder window information.
The data is first four two-byte values representing the top, left,
bottom, and right edges of the rect defining the content area of the
window. The next four bytes represent the view of the window: C<icnv>
is icon view, other values are C<clmv> and C<Nlsv>.
The next four bytes are unknown, and are either zeroes or
C<00 01 00 00>.

On Leopard (10.5), the view-type information seems to be ignored,
but see C<vstl>. On Snow Leopard (10.6), some more of this record's
function seems to have been taken over by the plist records C<bwsp>,
C<lsvp>, and and C<lsvP>.

=item C<'fwsw'>

C<long>, directories only. Finder window sidebar width, in
pixels/points. Zero if collapsed.

=item C<'fwvh'>

C<shor>, directories only.
Finder window vertical height. If present, it overrides the height
defined by the rect in fwi0. The Finder seems to create these (at
least on 10.4) even though it will do the right thing for window
height with only an fwi0 around, perhaps this is because the stored
height is weird when accounting for toolbars and status bars. 

=item C<'GRP0'>

C<ustr>. Unknown; I've only seen this once.

=item C<'icgo'>

8-byte C<blob>, directories (and files?).
Unknown. Probably two integers, and often the value C<00 00 00 00 00
00 00 04>.

=item C<'icsp'>

8-byte C<blob>, directories only.
Unknown, usually all but the last two bytes are zeroes.

=item C<'icvo'>

18- or 26-byte C<blob>, directories only.
Icon view options. There seem to be two formats for this blob.

If the first 4 bytes are "icvo", then 8 unknown bytes (flags?), then 2 bytes
corresponding to the selected icon view size, then 4 unknown bytes
C<6e 6f 6e 65> (the text "none", guess that this is the "keep
arranged by" setting?).

If the first 4 bytes are "icv4", then:
two bytes indicating the icon size in pixels, typically 48;
a 4CC indicating the "keep arranged by" setting
(or C<none> for none or C<grid> for align to grid);
another 4CC, either C<botm> or C<rght>,  indicating the label position I<w.r.t.> the icon;
and then 12 unknown bytes (flags?).

Of the flag bytes, the low-order bit of the second byte is 1 if "Show
item info" is checked, and the low-order bit of the 12th (last) byte
is 1 if the "Show icon preview" checkbox is checked. The tenth byte
usually has the value 4, and the remainder are zero.

=item C<'icvp'>

A C<blob> containing a plist, giving settings for the icon view.
Appeared in Snow Leopard (10.6), probably supplanting C<'icvo'>.

The plist holds a dictionary with several key-value pairs:
booleans C<showIconPreview>, C<showItemInfo>, and C<labelOnBottom>;
numbers C<scrollPositionX>, C<scrollPositionY>, C<gridOffsetX>, C<gridOffsetY>,
C<textSize>, C<iconSize>, C<gridSpacing>, and C<viewOptionsVersion>;
string C<arrangeBy>.

The value of the C<backgroundType> key (an integer) presumably controls
the presence of further optional keys such as C<backgroundColorRed>/C<backgroundColorGreen>/C<backgroundColorBlue>.

=item C<'icvt'>

C<shor>, directories only.
Icon view text label (filename) size, in points.

=item C<'info'>

40- or 48-byte C<blob>, attached to directories and files.
Unknown. The first 8 bytes look like a timestamp as in C<dutc>.

=item C<'logS'> or C<'lg1S'>

C<comp>, directories only. Appears to contain the logical size in
bytes of the directory's contents, perhaps as a cache to speed up
display in the Finder.
I think that C<'logS'> appeared in 10.7 and was
supplanted by C<'lg1S'> in 10.8. See also C<'ph1S'>.

=item C<'lssp'>

8-byte C<blob>, directories only.
Unknown. Possibly the scroll position in list view mode?

=item C<'lsvo'>

76-byte C<blob>, directories only.
List view options. Seems to contain the columns displayed in list
view, their widths, and their sort ordering if any. Presumably
supplanted by C<lsvp> and/or C<lsvP>.

These list view settings are shared between list view and the list
portion of coverflow view.

=item C<'lsvt'>

C<shor>, directories only.
List view text (filename) size, in points.

=item C<'lsvp'>

A C<blob> containing a binary plist. List view settings, perhaps
supplanting the C<'lsvo'> record. Appeared in Snow Leopard (10.6).

The plist contains boolean values for the keys C<showIconPreview>,
C<useRelativeDates>, and C<calculateAllSizes>; numbers for
C<scrollPositionX>, C<scrollPositionY>, C<textSize>, C<iconSize>, and
C<viewOptionsVersion> (typically 1); and a string, C<sortColumn>.

There is also a C<columns> key containing the set of columns, their widths,
visibility, column ordering, sort ordering.
The only difference between C<lsvp> and C<lsvP> appears to be the
format of the columns specification: an array or a dictionary.

=item C<'lsvP'>

A C<blob> containing a binary plist.
Often occurs with C<lsvp>, but may have appeared in 10.7 or 10.8.

=item C<'modD'> and C<'moDD'>

C<dutc> timestamps; directories only.
One or both may appear.
Typically the same as the directory's modification date.
Unknown purpose; appeared in 10.7 or 10.8.
Possibly used to detect when C<logS> needs to be recalculated?

=item C<'phyS'> or C<'ph1S'>

C<comp>, directories only. This number is always a multiple of
8192 and slightly larger than C<'logS'> / C<'lg1S'>, which always
seems to be present if this is (though the reverse is not always true).
Presumably it is the corresponding physical size (an integer number of
8k-byte disk blocks). 

=item C<'pict'>

Variable-length C<blob>, directories only.
Despite the name, this contains not a PICT image but an Alias record
(see I<Inside Macintosh: Files>) which resolves to the file containing
the actual background image. See also C<'BKGD'>.

=item C<'vSrn'>

C<long>, attached to directories.
Always appears to contain the value 1.
Appeared in 10.7 or 10.8.

=item C<'vstl'>

C<type>, directories only. Indicates the style of the view
(one of C<icnv>, C<clmv>, C<Nlsv>, or C<Flwv>,
indicating respectively: icon view, column/browser view, list view, and coverflow view)
selected by the Finder's "Always open in icon [or other style] view"
checkbox.
This appears to be a new addition to the Leopard (10.5) Finder.

=back

=head2 B-Tree

The records are stored in a B-tree structure. The B-tree consists of a
small master block containing a few statistics and a pointer to the
root node; one or more leaf (external) nodes; and zero or more
non-leaf (internal) nodes.

The header block is pointed to by the C<DSDB> entry in the buddy
allocator's directory. It is 20 bytes long and contains five integers:

=over

=item

The block number of the root node of the B-tree

=item

The number of levels of internal nodes (tree height minus one --- that
is, for a tree containing only a single, leaf, node this will be zero)

=item

The number of records in the tree

=item

The number of nodes in the tree (tree nodes, not including this header
block)

=item

Always 0x1000, probably the tree node page size 

=back

Individual nodes are either leaf nodes containing a bunch of records,
or non-leaf (internal) nodes containing N records and N+1 pointers to
child nodes.

Each node starts with two integers, C<P> and C<count>. If C<P> is 0,
then this is a leaf node and C<count> is immediately followed by that
many records. If C<P> is nonzero, then this is an internal node, and
C<count> is followed by the block number of the leftmost child, then a
record, then another block number, I<etc.>, for a total of C<count>
child pointers and C<count> records. C<P> is itself the rightmost
child pointer, that is, it is logically at the end of the node.

This relies on 0 not being a valid value for a block number. As far as
I can tell, 0 is a valid value for a block number but it always holds
the block containing the buddy allocator's internal information,
presumably because that block is allocated first.

The ordering of records within the B-tree is by case-insensitive
comparison of their filenames, secondarily sorted on the structure
ID (record type) field. My guess is that the string comparison follows
the same rules as HFS+ described in Apple's TN1150.

=head2 Buddy Allocator

B-tree pages and other info are stored in blocks managed by a buddy
allocator. The allocator maintains a list of the offsets and sizes of
blocks (indexed by small integers) and a freelist. 
The allocator also stores a small amount of metadata, including a
directory or table of contents which maps short strings to block
numbers. The only entry in that table of contents maps the string
C<DSDB> ("desktop services database"?) to the B-tree's master block.

The buddy allocator is in charge of all but the first 36 bytes of
the file, and manages a notional 2GB address space, although the file is
of course truncated to the last allocated block. All its offsets are
relative to the fourth byte of the file. Another way to describe this
is that the file consists of a four-byte header (always C<00 00 00
01>) followed by a 2GB buddy-allocated area, the first 32-byte block
of which is allocated but does not appear on the buddy allocator's
allocation list.

The 32-byte header has the following fields:

=over

=item *

Magic number C<Bud1> (C<42 75 64 31>)

=item *

Offset to the allocator's bookkeeping information block

=item *

Size of the allocator's bookkeeping information block

=item *

A second copy of the offset; the Finder will refuse to read the file
if this does not match the first copy. Perhaps this is a safeguard
against corruption from an interrupted write transaction.

=item *

Sixteen bytes of unknown purpose.
These might simply be the unused space at the end of the block,
since
the minimum allocation size is 32 bytes, as will be seen later.

=back

The offset and size indicate where to find the block containing the
rest of the buddy allocator's state. That block has the following
fields:

=over

=item Block count

Integer. The number of blocks in the allocated-blocks list.

=item Unknown

Four unknown bytes. Appear to always be 0.

=item Block addresses

Array of integers. There are I<block count> block addresses here, with
unassigned block numbers represented by zeroes. This is followed by
enough zeroes to round the section up to the next multiple of 256
entries (1024 bytes).

=item Directory count

Integer, indicates the number of directory entries.

=item Directory entries

Each consists of a 1-byte count, followed by that many bytes of name
(in ASCII or perhaps some 1-byte superset such as MacRoman), followed
by a 4-byte integer containing the entry's block number.

=item Free lists

There are 32 freelists, one for each power of two from 2^0 to
2^31. Each freelist has a count followed by that many offsets.

=back

There are three different ways to refer to a given block. Most of the
file uses what I call block numbers or block IDs, which are indexes
into the C<block address> table. Block ID 0 always seems to refer to
the buddy allocator's metadata block itself.

The entries in the block address table are what I call block addresses.
Each address is a packed offset+size. The least-significant 5 bits of
the number indicate the block's size, as a power of 2 (from 2^5 to
2^31). If those bits are masked off, the result is the starting offset
of the block (keeping in mind the 4-byte fudge factor). Since the
lower 5 bits are unusable to store an offset, blocks must be allocated
on 32-byte boundaries, and as a side effect the minimum block size is
32 bytes
(in which case the least significant 5 bits are equal to C<0x05>).

The free lists contain actual block offsets, not "addresses". The
size of the referenced blocks is implied by which freelist the block
is in; a free block in freelist N is 2^N bytes long.

Although the header block is not explicitly allocated, the allocator
behaves as if it is; other blocks are split in order to accommodate it
in the buddy scheme, and its buddy block (at 0x20) is either on the
freelist or allocated. (Usually it holds the B-tree's master block.)

Other than the 4-byte prefix and the 32-byte header block, every byte
in the file is either in a block on the allocated blocks list, or is in a
block on one of the free lists.

=head1 CREDITS

Original reverse-engineering effort by Mark Mentovai,
L<https://wiki.mozilla.org/DS_Store_File_Format>. Some of the text
describing record types has been copied from that wiki page.

Further investigation and documentation by Wim Lewis
E<lt>wiml@hhhh.orgE<gt>.

Also thanks to Yvan BARTHE<Eacute>LEMY for investigation and bugfixes.
MM *  Ü                       |    €;N¤ø. a@Gü4ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6…
 €!¯÷ãýüþR;]ŽÇÜ@	N°XlV;%–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^gOÇsµÛSÞ°X<&‡ÄbqX¼f7�ÈdrY<¦V)P V�˜¶w=ŸÐhtZ=&—M§ÔjuZ½f5œÖìv[=¦×m·Ünw[½æ÷}ˆ×ïø\>'�Çäry\¾g7�0àóú]>§W­×ìv{]¾çv/Ñïx|^?'—Íçôz}^¹/ƒÙïø|~_?§×í÷üZ=ßŸç÷üÿÀÀŽk÷ÁLÁ�lÂ
,Â�¬-ÃÌ5¼ðœ9ÄEÄ‘,LÃCÑ<UÅ‘l]ÆŠ9ÆQ¬mÇÌu½q¤yÈ…!È’+CHÒL•%É’l�'¨RD¡)Ê’¬­+Ë\¥,Ë’ì½/Ì-ÌS,Í3ÍLÔéÌ“\Ý7ÎŒå9²“lé;ÏÌõ=ÏŠTí>ÐAÐ”*1?ÐÔMEÑ”l»DQÔ�%IÒ”¬]HRÔÍ5MÓ”ìLSÕEQÔ•+­PTÕMUUÕ•kUTUÕ�eYÖ•ªñXVÕÍu]×•ì¢­¶õ…aØ–-Œ™×=•eÙ–mgdÙÖ�¥iÚ”�¡jÛÍµmÍö½¹oÜÅ&Û×ÍsÝL[rÝWmÝwÞ�xÞ—­í{Â—eñ}ß—íüé_Wþ�à˜+i€àØN…áŒŽ†âŽ%‰®~)‹ãÎ5	^xÞ=�ä
�‹dY.M“å–I”å™n]‰ey~e™æ—ÞcšçÎuqfùÞ}Ÿè^{ èš.�gãº>•¥é–ž‡¦êŽ¥Ciúž­«ëŽ«¬ëšî½.kzþÅ±ì’.Ã²íNÕlû^Ý·îÞÛ¸î›®ín{¾õ½ï�žó¾ðï  €;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%‚Q©Tºe6�O¨TjU:¥V­W¬VkUºåv½_°XlV8Ý"d´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW;5îýÀ`pX<&‡ÄbqX¼f6Û}ÇdrY<¦W-—ÌfsY¼æw=nÈgôZ=&—M§ÔjuZ½f·]%Ðëö[=¦×m·Ünw[½æö±ßpx\>'�Çäry\¸×™Ïètz]>§W­×ìSùÝžçw½ßðx|^?&¯·åôz}^¿g·ÝïøN¼ÿ§×í÷ü~_¾/ÏøÿÀÀ�,´¿Ð<Á�lÂŠ#ÂP¬-ÃÌ5¹0¤9ÄEÄ‘+DÑLUÅ‘l]¦ñDaÆ‘¬mÇLeÇ‘ì}È×ÈR,�#ÉL”×È’\�'ÊŒ¥)®òl©+ËÌµ-Ë‰ü­.ÌÅ1Ì“*/ÌÓLÕ5Í“ls4MÓŒå9Î“¬8NÓÌõ=Ï“ë¿<OÔAÐ”+i@PÔMEÑ”kDQÔ�%IÒ”ª¿HRÔÍ5MÓ”ìb�¬ôõEQÔ•-L•Ó=UUÕ•m#TÕÕ�eYÖ“maZ×Íu]Éu½y_Ø…×Ö�cÙLbÙVm�gÚAhÚ–­­k¾–e±mÛ–í¼×[VýÅqÜ—+%pÜ×MÕuÝ‹¥ÑvÞ�åyª÷}é{ßÍôùZwÝýà
‹{`X.ƒá>	„á˜nxax~%‰â–¾#ŠãÎ5`bøÞ=�ä>;�ä™.MWß¹>U•å•žG–æŽe2eùžm›ç~kœç™î}gyþ…¡è‘ƒ¢éN•hú^�§êÎ›¨êš®¬òjz¾µ­ëŽŽ³®ìÄÞ  €;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%‚Q©Tºe6�O¨TjU:¥V­W¬VkUºåv½_°XlV8Ý"d´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW;5îýÀ`pX<&‡ÄbqX¼f6Û}ÇdrY<¦W-—ÌfsY¼æw=nÈgôZ=&—M§ÔjuZ½f·]%Ðëö[=¦×m·Ünw[½æö±ßpx\>'�Çäry\¸×™Ïètz]>§W­×ìSùÝžçw½ßðx|^?&¯·åôz}^¿g·ÝïøN¼ÿ§×í÷ü~_¾/ÏøÿÀÀ�,´¿Ð<Á�lÂŠ#ÂP¬-ÃÌ5¹0¤9ÄEÄ‘+DÑLUÅ‘l]¦ñDaÆ‘¬mÇLeÇ‘ì}È×ÈR,�#ÉL”×È’\�'ÊŒ¥)®òl©+ËÌµ-Ë‰ü­.ÌÅ1Ì“*/ÌÓLÕ5Í“ls4MÓŒå9Î“¬8NÓÌõ=Ï“ë¿<OÔAÐ”+i@PÔMEÑ”kDQÔ�%IÒ”ª¿HRÔÍ5MÓ”ìb�¬ôõEQÔ•-L•Ó=UUÕ•m#TÕÕ�eYÖ“maZ×Íu]Éu½y_Ø…×Ö�cÙLbÙVm�gÚAhÚ–­­k¾–e±mÛ–í¼×[VýÅqÜ—+%pÜ×MÕuÝ‹¥ÑvÞ�åyª÷}é{ßÍôùZwÝýà
‹{`X.ƒá>	„á˜nxax~%‰â–¾#ŠãÎ5`bøÞ=�ä>;�ä™.MWß¹>U•å•žG–æŽe2eùžm›ç~kœç™î}gyþ…¡è‘ƒ¢éN•hú^�§êÎ›¨êš®¬òjz¾µ­ëŽŽ³®ìÄÞ  €;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%‚Q©Tºe6�O¨TjU:¥V­W¬VkUºåv½_°XlV8Ý"d´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW;5îýÀ`pX<&‡ÄbqX¼f6Û}ÇdrY<¦W-—ÌfsY¼æw=nÈgôZ=&—M§ÔjuZ½f·]%Ðëö[=¦×m·Ünw[½æö±ßpx\>'�Çäry\¸×™Ïètz]>§W­×ìSùÝžçw½ßðx|^?&¯·åôz}^¿g·ÝïøN¼ÿ§×í÷ü~_¾/ÏøÿÀ À€ 
 €ö~€ÿÀPŒ%	¹oô)ÃÊÇ  ñ€\D ±( Et!E‘l\ÑBÑ|eÆ‰ø€t Ñè .H  y!€ÌŒ ÒLk%É’jóÉÒŒ¥)£Ñ¸ ÒÈ GË€ ³/€ ¤Ä ³( Í û5Ê“lÝ7ªR„á9Î’¤8 sÈ [Ï€ m?€  H £ È TlÕ6N´�%I¥Ó•)KÓÀM€Ø Næ•D Õ( U  ÇUÑ”t’S5�eY¨èÏZWËó;žUè ZØ  a€Œ 6H OÙ€ ‘gÙÖ�õiÅU½uk  	ƒAá˜T.‡Câ”N)‹Eã˜Ôn9�Gãî×c±ÿ “Iå™T®Y-—Kæ”Îi5›Mç™ÔîhŸ ô6ˆ .QÀªPýM :ê  MN>€še:y]¯WìŽÉe³Yí›U®Ø ‘I-·•Îéu»]ï›Õîù«P(I, ±… q Þ,ãÀ

†žêu Ù� C8 ~çïº�I¥Óiõ�UÞß%Õëö–ÏiµÛmã×ööì �ß |M/ûª€€@£Y¬ NóÀÎ� Äa0æó´×öã¹ÝïwüŽç­òyýŸW¯ÙíÑ€~ ŸÌ ·û ß� gù[í¡ $ p  M@à o Ô 1é, ÷Bp¤+BðÄ2›<ÐÔ;CñC6nC“Áìƒ>~¢+ù´m›` �„q¤P’ÄîÔGGqä{Gë\9 Hr$‹#Hò3áR` ZIà )  ìªÏ4„ Ð ^—Åð k¦«Ã3€„¯ÉdÛ7Mó„5!N3¤ë;NóÂè¿¨&ú†¢¨âã†1Lb).š”@ LÑ` AG:ƒÄ ô£ý<ÒôÅ3MSjìçNSõCQThöÀ°l(°Ã±.*3.š€ OV` E[ Ms.@P•I_Wöƒ:ÓÖ‹cXöCÙSO¤ušà8JUV£’é£k ² 	6à ÛàùqRÖMËs\÷Cob]7eÛw]ë\”ù>…Åê ·ÃöþÇ)ÿœ‡)Ê &A� 8C±4ÅW†‡aø‚suâ8¦+‹bè¼OÂXbZ¿œ  G7ôp@ tˆ ew&1—eù†1‰æ9¦k›=2ìN‚a˜bþ¿¡ãAŸ'úA† ºEæy€~›(Êr¨;5%ËùŸX”ù> ôxÌ2Œ  ±FÙ¾Ë³lõg´m{fÚ¾štIÔt�0z¡( ï`¯¿ Æq€ ã	oÎöï»ÿÁð±—¼o[á±Ë �  <à .‹Âð aÝã&:@
 ½` ]õàAÐº@çM–íÝÇsÝC»Wwßwþcy  @øúPÔ€š 
€¬ëF«]Ëuh†"žxž'úZÈê™þ¿míûž÷¿Y“ÜÅc±]ˆ¾/€PRÜ7kÜGæÈæ×¤Ô«x0@s^ï`D��4‡¿Ã"(  q  Ár¤U 4 | ëHH„€€` =áP Ð¶ÂXO
a\!¯••€äb|Jê'>m,CCð â'a�•2È	¢TK‰…†DØ¡`*]BQTÈ!%ä¼ˆDV$±fx¹Q”Z kð²"w3`›% XëÃvÉ£”sŽ„z'ÇXñXŠòaƒbŒP ’²4mM¼±™"@ ¦‘€ +Hõ Ô“Ž1êKIxõäÄ›“‹á¼Põ(Wºù
ò” ™P�ùP` JùO*@9Z‚3IÙq.^š—Rö_'‰?ÃìÃ ‘ÒÈð­,GÊ@/ãðÐ	a*%T²‘RQÂ$Ëù±6Y‘#5ÓjoMôã0@¡NˆÄÌª¥DËH¨�ñ™&­[änˆðâ[Î	ñ>V<¼ŸSö!ˆ! ˜. “Ò;dØ—]`Í|h Pð (“SW³þ‹Qtó?(Å£‡Ž*"”°�QhÚPš5È_ç½¥”µÑª]Li‘¢�†€bSt¨•�%;�ÉÕ.—ñmP@ Ý7�mMjCLêUK=4Â¦Tú Zgä”`ô JP¯2”Â]�âyð‚Dj+ „€5ÛÕÑZMUN­U¶·iÅ0Ãí˜òBu©Èb+«Ð ô «  Åƒ’RR·Ø{^+e‰±–4�U9E9çB©«J^Ÿ“ô^Œð×?é÷É[hmN›–ŽÓZrU™” €ºH­:DOÆ5³…�¸!Ûwr(¡�µöß[oîÃ|¬r¤§þ0®T‹â�ÑPtˆ-¸—VëƒuîÕj¦¨¬aÝù€ð §`’ž¤rþ1m ¤bŒ ;àƒqY‚íß{ðE.Íù¿”ÆÈNUñUªÅ•H‰uy[‡híªòšúV{û„p‘¿xOOêã1&4Ž®Ò¥—õ5   o›©…ñVÂ¸¯M›ÿ9¬™†®èí.Ü¡…s.pP{ËmnÛ_�qV-ÈY]0ËV nKµê"zn1  ¨Ê€ e{åtŠ˜	¾Ù/_|‰—ó›yq…	#•äÎ£�ÍÇ5lÎS³Mºgw°—ù&>€ ‘0`=–Ý V
Õ+Ìzêæ¢bUÝ à    ®“¤Ð 
iwðÿL±—žùl =A¦@›¬ú{P=E©8Õ–ääÃ»t:É*„°´{  ®t®ÑZößè�}°^
ò®âB@ ;Çpî| Kg  ó´@ ÙÚ‡8èD%³€–Ð”Ca¿¾»¦d –¡[IÿÐ×”ÒCÖ  »&Ak�îX®iÁ†±Ápbí±NÂß–£`oÞ ðà Ã¼w�#!+À` Ü6Úëq¶7áL4K…  OÆa"â<Lq^	A?…CÜ Gé -R…Ñ®” ˜eÿ”îh üÕg…¸3—7ßç–‡óÒ  �@à�X4	…Bá�Øt>!‰Dâ‘X´^1�Fã‘Øô~A!ˆ�$€ ?ßàä¼(”É �YL
W-—¿&2€ÒmœË¦ :0ÙI %i€­< +©Q'’(5 uVÀŠð Qa l€ Eœ þµU­–Ûu¾áq¹\î—[µÞñy½^ï—ÛõÿvÒe¸6‰Åbñ˜Üv?!‘Édò�·Ö\ Í]@YÐ]ô –K[ZP �P jí6¼®¿a±Ùlö›]¶ßq¹ÝApnÌ.ï�Áápøœ^7‘É�Ì³ù†·< $é �]²Bí ]Ð#À 1øÀ_77C£åzýžßw¿áñù|âÛÝÿÓñùý~ÿŸßóþ‘+ Ã „ BØ¶ á°l p’;°° SC  ZÀ Â0 ´ºï¼E1TWE±sl€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜L@ 9 ¿7 $§@Äô 9  t8èŒ jR@	Z` _O j@ MT þ¬L«Uºåv½_°XlV;%–Íg´ZmV¸×o¸\nW;¥Öíw¼^oWºäÐ o`@	  ³‡ ±T*$bŒ  ²SiÃQªÕ ³@ X(W¬ß4Z=&—M§ÔjuZ½dÊÛÖìv[=¦×m·Ünu¹ Ó¿ &SI T¨T 
ù@ç6+� 1ú@° Iì  ½¾g9ÿßÝx|^?'—ÍçôzašÿW·Ýïø|~_?¤Yõ÷ ¿QžƒŠb€)HR ˜h  ¾/€  ;íƒë	Â�¬-ÃÊòöCPì=ÄEAÀ ûŸ@.Ì±h FƒÀ†:ll ‘È *ð¸.*Œó@Dr,�#ÉL”ñC’\�'ÊŒ¥)£Ëð pË H  ¶-@ o1±‡ÚèJÅìÔÀ0B´ÜÎ`X ~Î’¤í;ÏÌõ=½h%>PAÐ�\¬››éÊvž‹	ú‚¡ÌÒ´Ví;‘hKOôÅMÓ”í=OµrmAQÔ•-MS¢’³o0l+,±,\" 5¨ P×  �]€p¬îŸ•E…aØ–-ŒŽTV=•eÙ–l4Þ7Î†â8î@[kº.™Em€E¼ Apdã9VvuÍsÝL¥dÝWmÝwÞ=  ­€ Zj»ÁA‘€9Î·Ž�à˜+uv`ØN…áˆìK¿˜'‰€ ¶-€´ 
  øì‡†äE‘¬XFI“åMÑ+Yh Gf
œ-æŒÈzâMË•g™î}Ÿ¢6�¡èš,ï–eÄf” Á8N Ê�ýMhÚ®­«àº±­ëšì(æØ&ÆÄ !D ÀhŒkÛnÝ·ÔÚÖá¹î›«W‡º©»o›îý%î[ÿÁðœ/Ãñ_ÄñœoÇò�$ùq|Ÿ-ËóÏ5ÍóŠ÷+ÎôEÑô�/-ÏôÝOUÕõ�o]’ueÙö�¯mÛÐ}�qÝ÷�ï}ßøOuàøž/�ãùJÍáù^o�çú�¤†ùžŸ­ëûÏµÓz¾ß½ïüÅº{¿ÍóýOÕƒ|¿_Ý÷þ�åMý¿ŸíûÿÏõ~¿ßüÿà€J…?@8àD	�EíþÀ¸à„‚DNÁ8-àÄÐVAØ=áÚƒ�†BXM	ÝÄ#…®BØ\æ!T/†PÎCVça´9‡Pî;bAˆQžÃˆ‰âDI‰J
#D¸�â„QD16)EX­âÁæŠ‘f.EØ½Í[ŒŽ2FXÌXcg�Q®6FÒActqŽQÎ:hácÄy�Qf;Ç¸ýäB�²BHY
ä‡‘R.FA)#d„‘’OîGÉ9-%äÃæ’²fNIÙ<óäÜŸ”RŽRB˜)eD©•O~PÊ¹]+åƒ�•²ÆZKYlÝeœ·—Rî^4Is/fÁ˜L2_Ì9�1æBç  €;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%‚Q©Tºe6�O¨TjU:¥V­W¬VkUºåv½_°XlV8Ý"d´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW;5îýÀ`pX<&‡ÄbqX¼f6Û}ÇdrY<¦W-—ÌfsY¼æw=nÈgôZ=&—M§ÔjuZ½f·]%Ðëö[=¦×m·Ünw[½æö±ßpx\>'�Çäry\¸×™Ïètz]>§W­×ìSùÝžçw½ßðx|^?&¯·åôz}^¿g·ÝïøN¼ÿ§×í÷ü~_¾/ÏøÿÀÀ�,´¿Ð<Á�lÂŠ#ÂP¬-ÃÌ5¹0¤9ÄEÄ‘+DÑLUÅ‘l]¦ñDaÆ‘¬mÇLeÇ‘ì}È×ÈR,�#ÉL”×È’\�'ÊŒ¥)®òl©+ËÌµ-Ë‰ü­.ÌÅ1Ì“*/ÌÓLÕ5Í“ls4MÓŒå9Î“¬8NÓÌõ=Ï“ë¿<OÔAÐ”+i@PÔMEÑ”kDQÔ�%IÒ”ª¿HRÔÍ5MÓ”ìb�¬ôõEQÔ•-L•Ó=UUÕ•m#TÕÕ�eYÖ“maZ×Íu]Éu½y_Ø…×Ö�cÙLbÙVm�gÚAhÚ–­­k¾–e±mÛ–í¼×[VýÅqÜ—+%pÜ×MÕuÝ‹¥ÑvÞ�åyª÷}é{ßÍôùZwÝýà
‹{`X.ƒá>	„á˜nxax~%‰â–¾#ŠãÎ5`bøÞ=�ä>;�ä™.MWß¹>U•å•žG–æŽe2eùžm›ç~kœç™î}gyþ…¡è‘ƒ¢éN•hú^�§êÎ›¨êš®¬òjz¾µ­ëŽŽ³®ìÄÞ  €;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%‚Q©Tºe6�O¨TjU:¥V­W¬VkUºåv½_°XlV8Ý"d´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW;5îýÀ`pX<&‡ÄbqX¼f6Û}ÇdrY<¦W-—ÌfsY¼æw=nÈgôZ=&—M§ÔjuZ½f·]%Ðëö[=¦×m·Ünw[½æö±ßpx\>'�Çäry\¸×™Ïètz]>§W­×ìSùÝžçw½ßðx|^?&¯·åôz}^¿g·ÝïøN¼ÿ§×í÷ü~_¾/ÏøÿÀÀ�,´¿Ð<Á�lÂŠ#ÂP¬-ÃÌ5¹0¤9ÄEÄ‘+DÑLUÅ‘l]¦çqÚvŸñªÏGÌuÇ‘ì\ È �} à$}#ÉL•%É�¹øvGQ> €@¹   $m&Ë’ì½/ÌQ, ±øŸÇñH€€             |                            N      *                   <              ö      þ       (       1      b2      p=       R       S      F¼   n  „‡i       ‡s   H  !ò  €¶   H      H           ß  ß  ¥  ¸  ß  ¨   2  9    ÷  œ  T  3    dmg-background.png  tiffutil v294 2016:10:05 16:10:25 <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/"
            xmlns:xmp="http://ns.adobe.com/xap/1.0/">
         <dc:description>
            <rdf:Alt>
               <rdf:li xml:lang="x-default">dmg-background.png</rdf:li>
            </rdf:Alt>
         </dc:description>
         <xmp:CreatorTool>Pixelmator 3.5.1</xmp:CreatorTool>
         <xmp:ModifyDate>2016-10-05T16:10:25</xmp:ModifyDate>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
  HLino  mntrRGB XYZ Î  	  1  acspMSFT    IEC sRGB              öÖ     Ó-HP                                                 cprt  P   3desc  „   lwtpt  ð   bkpt     rXYZ     gXYZ  ,   bXYZ  @   dmnd  T   pdmdd  Ä   ˆvued  L   †view  Ô   $lumi  ø   meas     $tech  0   rTRC  <  gTRC  <  bTRC  <  text    Copyright (c) 1998 Hewlett-Packard Company  desc       sRGB IEC61966-2.1           sRGB IEC61966-2.1                                                  XYZ       óQ    ÌXYZ                 XYZ       o¢  8õ  �XYZ       b™  ·…  ÚXYZ       $   „  ¶Ïdesc       IEC http://www.iec.ch           IEC http://www.iec.ch                                              desc       .IEC 61966-2.1 Default RGB colour space - sRGB           .IEC 61966-2.1 Default RGB colour space - sRGB                      desc       ,Reference Viewing Condition in IEC61966-2.1           ,Reference Viewing Condition in IEC61966-2.1                          view     ¤þ _. Ï íÌ  \ž   XYZ      L	V P   Wçmeas                         �   sig     CRT curv           
     # ( - 2 7 ; @ E J O T Y ^ c h m r w | � † ‹ � • š Ÿ ¤ © ® ² · ¼ Á Æ Ë Ð Õ Û à å ë ð ö û%+28>ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú&/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ+:IXgw†–¦µÅÕåö'7HYj{Œ�¯ÀÑãõ+=Oat†™¬¿Òåø2FZn‚–ª¾Òçû		%	:	O	d	y	�	¤	º	Ï	å	û

'
=
T
j
�
˜
®
Å
Ü
ó"9Qi€˜°Èáù*C\uŽ§ÀÙó&@ZtŽ©ÃÞø.Id›¶Òî	%A^z–³Ïì	&Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il�²ÖúAe‰®Ò÷@eŠ¯Õú Ek‘·Ý*QwžÅì;cŠ²Ú*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý#
#8#f#”#Â#ð$$M$|$«$Ú%	%8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü((?(q(¢(Ô))8)k)�)Ð**5*h*›*Ï++6+i+�+Ñ,,9,n,¢,×--A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô33F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<'<e<¤<ã="=a=¡=à> >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄKKSKšKâL*LrLºMMJM“MÜN%NnN·O OIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBT�TÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!|�|á}A}¡~~b~Â#„å€G€¨�
�k�Í‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ�1�˜�ÿŽfŽÎ�6�ž��n�Ö‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ—
—u—à˜L˜¸™$™�™üšhšÕ›B›¯œœ‰œ÷�d�Òž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª�««u«é¬\¬Ð­D­¸®-®¡¯¯‹° °u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½�¾
¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=È¼É:É¹Ê8Ê·Ë6Ë¶Ì5ÌµÍ5ÍµÎ6Î¶Ï7Ï¸Ð9ÐºÑ<Ñ¾Ò?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)ß¯à6à½áDáÌâSâÛãcãëäsäüå„ææ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ                8       ø    €;]N£x 5 !BhT6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°XlV;%–Í)v»�˜l2Ïo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡ÄbqX¼f7�ÈdrY:¥¥ØÿÊfsY¼æw=ŸÐhtZ=&—M§ÔjuZ½f·]¯Ølv[=¦-˜Úîw[½æ÷}¿àpx\>'�Çäry\¾g7�ÏèFvý§W­×ìv{]¾çw½ßðx|^?'—Íçôt­[�O·Ýïø|~_?§×í÷ü~_¿ç÷ü÷ºoüÀ�,ÁLÁ�lÂŒ$·À0œ-ÃÌ5Ã�ì=ÄEÄ‘*Q
ÄÑLUÅ‘l]ÆŒeÆ‘¬m£qDqÇ‘ì}È…!È’,�#É	ôu$É’l�'ÊŒ¥)Ê’¬­+ËÌ—,Ë’ì½/ÌÅ1Ì“,Í3ÃòÜÑ5Í“lÝ7ÎŒå9Î“¬ì¯MS¼õ=Ï“ìý?ÐAÐ‘óBÑMEÑ”mGÒ�$ÁPô�-KÓÍ5MÓ”í=OÏ”­AQÔ•-MSÕMUUÕ�•EVÖ�eYÖ•­m[×ÊËW×Uí}_Ø…aØ–-G^XÖM•eÙ–m�gÚŒ]dZV­­kÛÍµmÛ–ë}j[×ÅqÜ—-ÍsÝJ—p]WmÝwÞ�åyÞ–]ÙzßÍõ}ß—íýÍw¾�à˜.ƒáNàX^‡âŽ%‰â˜«c†âØÎ5�ã˜î=�ä«×�ä™.M“åNU•£ÆY—æŽe™æ™­í‘æÙÎu�ç™î}ŸÓ€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãË\{ã€.L ã‘€À0 U�e™n]âÙ~e™æŒAŸ›€t„‡è +h®…¡è�¾c¢éN”³™šh SjHh†  ´,‹:^µ­ë�ª€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:$1™G )©P‘ Ôj -K4Z¥V­W¬VkUºåv½_°XlV;%–Íg´ZmV»e¶Ý�A-÷;¥Öíw¼^oW»åöýÀ`pX<&UGfRipŠm>£Shd@\  y— óXlæw=ŸÐhtZ=&—M§ÔjuZ½d*ãÖìv[=¦×m·Ünw[½æ÷}n·›ÀªQ)	#ò@` ûÏ >ú@  
 2Ì`7wßðx|^?'—Íçôz}^¹Ö¿Ùïø|~_?§×í÷ü~oìü“Éâx€Üê €  FÁ Ë¡.«®ì»nèLýB�¬-ÃÌ5Ã�ì<�½ÐüEÄ‘,MÅLU¤t\âÄ° wÅèDì;Nã½G‘ì}È…!È‘C"ÉL•%É’l�'Êœ\wF”i*!³®íB1Ü£/ÌÅ1Ì“,Í"Hó<Õ5Í“lÝ7ÎŠRmÎ€å;€Œô  Sê)Ê±œjƒ�à€ çƒäù?NTmGÒ�%IÒ‰\ÓJÓÍ5MÓ”í<ÑU HTˆH—S€TˆÐ­]�çx  ˆ >cÝSõí}_Ø…a·Ô½‰cÙM•eÙ–ÅÊbœ¨*H©ïk€‘¦i€(H  •ÅfÜ—-ÍsÝMÔ�Ø×]ÝwÞ�åy¼Vz•h±–›”žè `  �Þ˜.ƒáNÝ¸^‡âŽ%‰¦÷³ƒ±¶¢¦’Xè P”E ä€ Â0èJâ™n]—æŽd°a¹žm›çÎucâ×Æ1}Z©!j[Àz^ˆL´ìƒ&U–gzŽ¥©êš®[šêÚÎµ­ëšìGžÚLv‚‘¿ð"I@áXéX Ë¦€ýÁ¯n›®í»ï±¼ï›îý¿ð6Á|ìXÚNvñ×YK;vá¹p<�%Éòœ«{½òÜÏ5ÍóœêXà¸n+Ž„9"8Ò¥§gW ãq 0 9ŽC� w÷uÝ÷�ï|«sÿ…áøž.òþ³ÿ Àp,˜uGk‰Wõç‚%{  ‰íøÞï½ïü
àü_/Íóý—¢ ?h {žÇ° /þ€ +ûý?Ïõýÿ™×Èÿ`€P@XàD	Cþ@Øà�ðNƒm;'„ôUÙWC,e€´6FÈ ðŒ ØMaD)…P­#3a!„1†PÌÑªÄ¨Õ)Tá-Tª²ˆü_�~áü áú?X%mí8ÄØiâ„QŠF¶E8­âÄY'®Ÿ¸RŠ?ã  1Œ ¨ÌB@4J¡” 0D¢ÔqŽQÎ:ø«cÄy�Qì…EÂÆWÙVr #dÙcDj�‘º8GÉ#ä„‘#QÞIIY-%àL~ ±•‰:Ô	þ@"4€p £X �ò6LJÙ]+âœ”–ÎZKW{&¤ã†+’~P¼²Àyà  �-¦DÉ™OêYL¹�3æƒY—]ùx%Q‹Ê@ X�p ¸wš3ŽrNW53g4é�S­‚Í8¼Y‡¬ñ2fTÏP çÄìŸSî~3¹Ñ?h JuÐCŒrS¨/®!é ÚÀ˜%¢TNŠ,IÿEhÅ£I‰äM§˜Ð#Ï/nŠŠL¿ÀH	 	p ]Fé…1¦Iš‹Ó:mMéÃ6ôì :}"e0gÁš–ÒúsQêEIDtÖ¥TÚ�S×:€lí¤y§‚À@”ò¦—¡Wëa<d€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:$A·G <©@�4 ¨QeŽª *–K t¸@ ÌÆ` ‚ÍR´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀJ PL‡ÄbqX¼f7�ÈdrY<¦W-—Ÿ8³@†vKÐ z<­QÕV¬V«�zõ€êt: [<Æ×m·Ünw[½æ÷}¿àpx\>$—âòy\¾g7�Ïètz]>§W­3fv@
nä$h5€E’Î×M¨¬ÖÞP’�´ =øuþ_?§×í÷ü~_¿ç÷~ã¿ÐÀ�,ÁL ™Æyž †† ‡éú†€(8E€t<  1
tÄ€^X í¢°Ê„Pì?ÅÈ<HtÄÑDU"‘¬a	ÑD„FñÌSžÑQêz€tœï<ÈÜÈ¥\­
‡à 0K€ !/ÁsÅ1Ì“,Í3ÍLÕ1@\Ý7ÎŒå9Î“¬ìÈ#Ðô 'ÁðŒ�Ô
Ê³¡% ÔJC@�Ô@„ÐÅ%E$eHPôIœŠ†¡°l "À±;Ô•-L€  P8$„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Ö ív;óiäö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­29Vb Ðp8 v:�@ »$�g *íQšåzÁb²ìÖ‹R®Ù]¯ØlvX%��iµÃ    ¼].€øº¼ñ‹� 7ò@T ÌcsY¼æw=ŸÐhtZ=&—M§ÔjuZ½f·]8�k¶[=¦×m·Ünw[½æ÷}¿àpd‡~ ÷Ç y@o6è  ý8k»¬ {vb½ ¯K©ë;»¨§s¼êõû/hH3Ü |xQ‡Ô ‚A àOùØ#ü ð À�œÁLÁ�lÂŒ%	·í‚w
CÌ5Ã�ì=ÄEª¦L 1æ( Å€ Ä�‘ý€,l ñÊ
ÿñŒ…!È’,�#ÉL•%É’jIÒŒ¥)Ê’¬­+ËÌµ-Ë‰Ó/€©,K ¡æyÇoü3Àp,»7ÎŒå9Î“¬í;Ï	T¡<Ï“ìý?ÐAÐ”,/�3Ç2ÌóLz4R  =IÐÔ­-KÓÍ5MÓ”ê=ÓÕEQÔ•-MSÕÉõU€ 5]T±§Ed Ä¹/FM 5]€¥}XX…aØ–-�c¤U‘eÙ–m�gÚ‹6UZ€‘k€Å´ 
Öí¤£VGEi[W  ;J#€áoÝ—mÝwÞ�äßYW�í{ßÍõ}Ò£¢ô§è  ` Fd]øšž˜h lb  Q‰€p…ãÎ5�ã˜íózãÙE‘ä™.LÒ+#’Ge™:~uæƒäå ¹vm›çÎu�ÁyyŸè…¡æÙNW–è‰9‡¥€~œ±½ã.¥I î“«ëÎµ­ëˆÖ}®ìÅ±ì“®Œ„e„vÊ�IR FI’‚�;¬HƒÚ®×½ï›îý¿ØÚÿÁðœ/Ã¶[:´ñiÕÇ€™(J ®‚n HH6õÆôEÑô�ïÒõOUÕõˆ×ƒq�jsö—oË›¦íÎsÚ·eßø…á¨]?‰ãùO•¡¸ƒ»Œäf€éøç7¬ äÁ1Êòè2 y º¯y/Íóý?�ôýŸoÝ÷Ùq1ƒ2`wFW¬s{×¸îH X€@ @WáàD	�MõÀ¸à„‚Iuý€[Àƒ0¡€/…ö*{àœ!„PŽ,H	aD)…P®BØ]á„1o°žCXmáÁKUcéVªøP/â  ƒ”r€ ‰À  bÄØ�â�¯'(^(ÅX­âÁZ‚©k-…´âÞ‚.<u Û 
@ 4©9âÌqŽQÎ:(icÄy�P•& À˜#a*�É ÉúLêåïF  ƒHi2æf=ÉY-%äÄw“nNI×„ëÈ+±„1"«enzÈ,j�rFI€7'¥„±–P®MK9m-åÃc”QBIHö$¨ �U«�.fDÉ™O&ZÌ¹�3æƒ—d^Â‘$$Ä˜ Na·©ŒfŒáœSŽÅ9É9çDé^ÓL�MXQ)€ Ûž@UFÉ#$å|êŸSî~2i›?h J
v 	Ý	G½	 Z†  OCàû tNŠQUØ@@€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? Pf§z ÷G i@M6…O¨TjRåTv º�v½_°XlV;%–Íg´ZmV»e¶Ýo¸\nW;¤zºÞoW»åöýÀ`pX<&‡ÄbqQ–4 ÅÈ y0 ÿ-‹Ìfa®là3Ÿ <ô@I(” "‘™­f·]¯Ølv[=¦×m·ÜnwS›¼w¿àpx\>'�Çäry\¾g6÷œs Ét¸ìõzÂF°{½Îðx|^?'—Íçôz}^¸Î÷Ùïø|~_?§×í÷ü~^‡K¨ë;H@ Ø5�` 3¿plÂŒ%	Â�¬,›=Ð¼5Ã�ì=ÄD®ŸQ( E˜þ’äÁ0 §¡é H 4Ç  9ÅQì}È…!È’*)ÈÒL•%É’l�'Ê
‘U)€D¬ È +K’‹Z{L D„eFÃDÔ ³l½7ÎŒå9Î“¬ì—É¼õ=Ï“ìý?Ð°è:Ž ü~Ÿ  €`E‘t
ühÒ€CKÍ Ô4M“u%OÔEQÔ•+k<ÔÕMUUÕ•m]PŽUŠGV•zÖ|× A]€Áò 
VuVÖ-�cÙM•eÕ]�gÚ�¥i·UˆåYÖ¶¥µmÛ–í½oÜ›pÜ—-ÍsÝJ7k[uÔ”Wˆ ]^€ +{€=õwß—íýà
¥qàX.ƒáL™v!•¥Ý…"§9Ðt ¹,K ”f„8í:âE‘ä™-©‚dÙNU•å™m«Ya¶Î[‰b˜¶1�@P  ?£è èv…¡èš.�e>•¥éšnœž(ƒºŒ¤)@*˜§eXž(éº§£F„­43Œà =³éûNÕµí›kg¤íÛŽå¹îš;`±ì‹&²¬¾Htð +‹ã:ú°ÆÃ8Ì3  ÿºò�%ÉòŠáÊóÏ5Íó“ó>L€ÏD„�(²l¼p?Îõ�o]×ó\¿aÙö�¯mÛ¾ñ>O€¡¦i€(ÓìœoÜyO•åà=—™çú�¤çD§ÔOåUð k{€ Iï€ oÅéüŸ/ÍóÔ¾wÑõýŸoÜºJeT«+†¿¨ ÿhý€ ¿ü b�" tµ1öE_Ø¯þ ‘	 CüÀ^ (ÈàJ<! 2  !Î	U€xŽ  ¡Cï…P®BÔšú¡t1†PÎÅ¡T:‰# q7à  ˆD$VÄVò1Hì<dú D "1�‰r% ™bˆ¢¶#�Ðÿð]  ÆSmÑj/CÄx€ ƒÀ MŽPÖ: 
‚Á ðˆL*†Ã¡ñŒJ'ŠÅ¢ñˆÌj7ŽÇ£ò	ŠG$’É¤ò‰LªW,–Ë¥ó	ŒÊ:ív;ó9Ìêw<žÏ§ô

‡D¢Ñ¨ôŠM*—L¦Ó©õ
�J§TžOG åðø‹ @ : Ù ¨«HÑl�Wì6;-ž	iEZí±›}ŠÉfÚ-VÇD4j6 %‚ÅVRéÆ€Ù Ï'å€\Î/7œÎç³ú‹G¤Òé´ú�N«W¬Öëµó™¬ßa´Úí¶û�Îëw¼Þï·ü‡:g3Ùà#† ~?_°ÐH 3€ÞÌ%³Ü .—k°ïÇé º�nÇjÜl÷¼/$CÍèëöG½¾ïÂñx< ºAC@Ô5 ¡dYpXÓ¥�dY3ÍÀ€  †‘¤ a·‡¡ø‚!ˆ¢8’%‰¢x¢)Š¢´e²N"ÈÂ1Œ£8Ò5�£xâ9Ž£¸ñ¥3#ð ¦� 8‚[ÓªI 	X<ò<¡(P Æa˜ %xöY–¥¹r]—¥ù‚a˜¦9‘)‹¦Y¢iš¦¹²m›¦ùÂqœ”xüÌ�d4� ˜)¸>gð †!ÈvJN”!YNU•Â	Î�£¨úB‘¤©:R•¥šiž—¦©ºr�§©ú‚¡¨©3®¥ ²0Œs^F%ŠaXfàØ¬€jµ¡å)RV–*:ò½¯«ûÁ°¬;L¦l["É²¬»2Í³¬úýþÏkP ­vôü¶€„¢(™&PQ  ¹­¢éº®»²í»®öêÇ¼/;Òõ½¯{âù¾¯»òý¿¯üÀ°8’òÁ0|#	Â°¼3¾“c° .q0 Å€3 õƒÇ±üƒ!È²<‘IÁ²\£)Ê²¼³-ÈÏüÀ -ó0 ñ¡„Á,K  Üñ¢©N¹,•%@	:OA­  	4¼»MÓ´ýCQÔ®ÜŸSÕµ}cYÖµ¹|Ö×€saACàü? <Og³ýCÑkqô|  +u×7}ãyÞ·½òÕwÞ�à¸>…OçYÜ¦‘ h"}U6É0–ÑÅ–q™š¹¾�ç¹þƒ¡è‘Ô€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:$1™G )©P‘ Ôj -K4X„Ø J%R “Åã	Àà1”Ê Zj–»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX:$
	„ÄbqX¼f7�ÈdrY<¦W-—ÌfsSê;2“K„Siõ�Ñ?§ 4õV’Íhµfö[=¦×m·Ünw[½æ÷}¿àpm˜h/�Çäry\¾g7�Ïètz]9žw>¦¦Sª+­+±Ö°ØìÖqÇ©çôz}^¿g·Ýïø|~_8Gé÷ü~_¿ç÷üÿÀ~ë;ÎËFî.‡Ô ðh ! �ÀtÃÌ5Ã�ì=Ä
ûDQ,MÅLUÅ‘l\‘@�§)ê“JŸŸ±È sÇ€ 7€ …È’,�#ÉL•%É�¤I&ÊŒ¥)Ê’¬­+Ëy×-€YF áö}€ÄÌ ÓJz« ¼Ü óˆ ‡AÐ *Š‚¤³=Ï“ìý?ÐIôCÑMEÑ”jvxR íI€ Õ-5 `´­«Êúa 6c]SÕMUUÕ•m\‹Pµ}eYÖ•­m[×�Øv�´Ò´ 4Š€À0 4ã8ÂUÍ�gÚ�¥iÚ�ÍcjÛÍµmÛ–í¼·×uí7`XH=‰c£ È —m¿wÞ�åyÞ—•¯zßÍõ}ß—ëøà o�Ø‘ä 	‚X– ¸jZ~b ‰Î•‡b€M×v„—ö=�äE‘ÃW¾I“åNU•åŠ)­—€æd„‡Áø~ 
xž–›ùè IèMÏŒÝWeÝ–éN•¥éšjï“iÚŽ¥©êš­ë»´Ò%§ö¼ »^W¢hœ' (E«m›nÝ·î®¡¸î›®í»ïF±;q¾ó¿ðÁå[Ÿ	ÃñOÅ·ÛÞµïÈÉÝÉàX Ë€Övóœg=ÏôEpÝMÓõOTœqÈ;E¾ò\¥Ç8�èHÇÛ€_uÕ÷�ï}ßøŸKàøž/�ãóýj×ëˆ§&wWÊßi¡  ( =cÜ'
ùï½ïü
Uáü_/Íóýß” F€lˆùþŽ+ÚØ~¨ÛŒ` Mýý?ïüÿà¾|�@XÔ:[iu/¦Æ™S:iÄ5é•—¤å«Öéþ@ˆ=á!i�BXM	áBRÁI)E,ˆŠ:Ðeû»‡ö	¡L9‡Pî-IbAˆQö
Ñ\+€ Åƒ  Gì!´ˆ‘N*EX¬”!üW‹Qn.EÓŽGè È8Ð:„Àx‹Ñ®6FØÜ~"ÌoŽQÎ:GR0À+ìƒ„��^  zB$‡¤D‰‘R,ßG#ä„‘ˆL¼k3fB  @ µðb�� ¡p.I)M)åD©/2:UJÙ]+Þóë!€r3  äCŒ°—Rî^KÒQ+%ôÁ˜S¼Ë"ž³  –fLI�3æ„½˜FjMY¬ÈÆŒÙ †n�	7À bw  ‚y¯9çDé�ÓNuNÙÝ;Ö€øž@ MOXø ¸V
ÐrO	ý?è"�”‚PZAèE	¡T,ÚÐ:Cè…¢TNŠQZ,I¨u£TnŽQÚ=GéÂ  €;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Ã�ì=ÄEÄ‘,MÅLT‰Ãq\]ÆŒeÆ‘¬mÇÌu¦ÑlyÈ…!È’,�#ÉL•%±1ô™'ÊŒ¥)Ê’¬­+ËÌµIÒÜ½/ÌÅ1Ì“,Í3ÍJ­.ÍSlÝ7ÎŒå9Î“¬í;Â“dñ=Ï“ìý?ÐAÐ”*í=PÔMEÑ”mGÒ�%6Ñ�-KÓÍ5MÓ”í=O¼t­AQÔ•-MSÕMUUÕŠíEVÖ�eYÖ•­m[×•_\×•í}_Ø…aØ�ýwbÙM•eÙ–m�gÚ…�hÚ–­­kÛÍµmÛŠ§nÜÅqÜ—-Ís×–ýÑuÝ—mÝwÞ�å-]W�í{ßÍõ}ß—ëýzßØ�à˜.ƒá&„á˜n‡âŽ%‰©˜^)‹ãÎ5�ã˜î%‹cÙE‘ä™.M“ØyQ•å™n]—æŒì€€€;]ŽÇø„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=�HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%�G¤RiTºe6�O¨TjU:¥V­W¬VkUºåv½_°J PK–Íg´ZmV»e¶Ýo¸\nW;¥Öíw¼^oW»åöýÀ`pX<&‡Äbjv8.+�ÈdrY<¦W-—ÌfsY¼æw=ŸÐhtZ=&—M§Ôjn¸ÍV·]¯Ølv[=¦×m·Ünw[½æ÷}¿àpx\>$SYÅäry\¾g7�Ïètz]>§W­×ìv{]¾äK�Ýðx|^?'—Íçôz}^¿g·Ýïø||]ÿ—×í÷ü~_¿ç÷üÿÀÀ�*Àú@ÐLÁ�lÂŒ%	Â�¬-Ã	Æl á43ÄEÄ‘,MÅLUÅ‘j&m§QÔ7€ 5C±tuÇ‘ì}È…!È’,�#¥æÐ Ä²       8      ø        �à                    ‚À      ‚P                           �è      �Ð      �Ø       (       1      ‚Ö2      ‚ä=       R       S      ‚¸¼   q  ‚ø‡i      .:‡s   H  …j       �      �         ³  ¢  ¢  ¢  ¢  ¢  ¢  ¢  ¢  ¢  ¢  ¢  ×  Š    p  1  ¢  ¢  ¢  ¢  ¢  ¢  ¢  ¢  ƒ  .d  1  3¹  6[  8ý  ;Ÿ  >A  @ã  C…  F'  HÉ  Kk  N  Pä  Vn  ]�  dñ  j"  lÄ  of  r  tª  wL  yî  |�  2    dmg-background@2x.png tiffutil v294 2016:10:05 16:10:93 <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/"
            xmlns:xmp="http://ns.adobe.com/xap/1.0/">
         <dc:description>
            <rdf:Alt>
               <rdf:li xml:lang="x-default">dmg-background@2x.png</rdf:li>
            </rdf:Alt>
         </dc:description>
         <xmp:CreatorTool>Pixelmator 3.5.1</xmp:CreatorTool>
         <xmp:ModifyDate>2016-10-05T16:10:93</xmp:ModifyDate>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
   HLino  mntrRGB XYZ Î  	  1  acspMSFT    IEC sRGB              öÖ     Ó-HP                                                 cprt  P   3desc  „   lwtpt  ð   bkpt     rXYZ     gXYZ  ,   bXYZ  @   dmnd  T   pdmdd  Ä   ˆvued  L   †view  Ô   $lumi  ø   meas     $tech  0   rTRC  <  gTRC  <  bTRC  <  text    Copyright (c) 1998 Hewlett-Packard Company  desc       sRGB IEC61966-2.1           sRGB IEC61966-2.1                                                  XYZ       óQ    ÌXYZ                 XYZ       o¢  8õ  �XYZ       b™  ·…  ÚXYZ       $   „  ¶Ïdesc       IEC http://www.iec.ch           IEC http://www.iec.ch                                              desc       .IEC 61966-2.1 Default RGB colour space - sRGB           .IEC 61966-2.1 Default RGB colour space - sRGB                      desc       ,Reference Viewing Condition in IEC61966-2.1           ,Reference Viewing Condition in IEC61966-2.1                          view     ¤þ _. Ï íÌ  \ž   XYZ      L	V P   Wçmeas                         �   sig     CRT curv           
     # ( - 2 7 ; @ E J O T Y ^ c h m r w | � † ‹ � • š Ÿ ¤ © ® ² · ¼ Á Æ Ë Ð Õ Û à å ë ð ö û%+28>ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú&/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ+:IXgw†–¦µÅÕåö'7HYj{Œ�¯ÀÑãõ+=Oat†™¬¿Òåø2FZn‚–ª¾Òçû		%	:	O	d	y	�	¤	º	Ï	å	û

'
=
T
j
�
˜
®
Å
Ü
ó"9Qi€˜°Èáù*C\uŽ§ÀÙó&@ZtŽ©ÃÞø.Id›¶Òî	%A^z–³Ïì	&Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il�²ÖúAe‰®Ò÷@eŠ¯Õú Ek‘·Ý*QwžÅì;cŠ²Ú*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý#
#8#f#”#Â#ð$$M$|$«$Ú%	%8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü((?(q(¢(Ô))8)k)�)Ð**5*h*›*Ï++6+i+�+Ñ,,9,n,¢,×--A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô33F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<'<e<¤<ã="=a=¡=à> >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄKKSKšKâL*LrLºMMJM“MÜN%NnN·O OIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBT�TÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!|�|á}A}¡~~b~Â#„å€G€¨�
�k�Í‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ�1�˜�ÿŽfŽÎ�6�ž��n�Ö‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ—
—u—à˜L˜¸™$™�™üšhšÕ›B›¯œœ‰œ÷�d�Òž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª�««u«é¬\¬Ð­D­¸®-®¡¯¯‹° °u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½�¾
¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=È¼É:É¹Ê8Ê·Ë6Ë¶Ì5ÌµÍ5ÍµÎ6Î¶Ï7Ï¸Ð9ÐºÑ<Ñ¾Ò?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)ß¯à6à½áDáÌâSâÛãcãëäsäüå„ææ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ#!/usr/bin/perl -w

use Mac::Finder::DSStore qw( writeDSDBEntries makeEntries );
use Mac::Memory qw( );
use Mac::Files qw( NewAliasMinimal );
use Encode ();
use utf8;

my($backgroundWidth, $backgroundHeight);

if (defined($ENV{'backgroundFilename'}) && !defined($ENV{'windowWidth'}) && !defined($ENV{'windowHeight'})) {
  $ENV{'backgroundFilename'} = Encode::decode("UTF-8", $ENV{'backgroundFilename'});
  open(SIPS, "sips -g pixelHeight -g pixelWidth -g format '$ENV{'volumePath'}/.background/$ENV{'backgroundFilename'}' |") || die;
  while(<SIPS>) {
      if (/\bpixelWidth: (\d+)/) {
          $backgroundWidth = $1;
      }
      elsif (/\bpixelHeight: (\d+)/) {
          $backgroundHeight = $1;
      }
  }
  ( close(SIPS) &&
    defined($backgroundWidth) &&
    defined($backgroundHeight) )|| die "Cannot query image dimensions";
}

# perl DOESN'T DECODE incoming env variables properly, so, you MUST explicitly decode it using Encode::decode("UTF-8", ...)
# see http://stackoverflow.com/questions/2437877/how-can-i-properly-use-environment-variables-encoded-as-windows-1251-in-perl

&writeDSDBEntries("$ENV{'volumePath'}/.DS_Store",
    &makeEntries(".background", Iloc_xy => [ 2560, 170 ]),
    &makeEntries(".DS_Store", Iloc_xy => [ 2610, 170 ]),
    &makeEntries(".fseventsd", Iloc_xy => [ 2660, 170 ]),
    &makeEntries(".Trashes", Iloc_xy => [ 2710, 170 ]),
    &makeEntries(".VolumeIcon.icns", Iloc_xy => [ 2760, 170 ]),
    &makeEntries(".",
        (defined($ENV{'backgroundColor'}) ? BKGD_color : BKGD_alias) => (defined($ENV{'backgroundColor'}) ? "$ENV{'backgroundColor'}" : NewAliasMinimal("$ENV{'volumePath'}/.background/$ENV{'backgroundFilename'}")),
        ICVO => 1,
        fwi0_flds => [ $ENV{'windowY'}, $ENV{'windowX'}, $ENV{'windowY'} + (defined($ENV{'windowHeight'}) ? $ENV{'windowHeight'} : $backgroundHeight), $ENV{'windowX'} + (defined($ENV{'windowWidth'}) ? $ENV{'windowWidth'} : $backgroundWidth), "icnv", 0, 0 ],
        icvo => pack('A4 n A4 A4 n*', "icv4", $ENV{'iconSize'}, "none", "botm", 0, 0, 0, 0, 0, 1, 0, 100, 1),
        icvt => $ENV{'iconTextSize'}
    ),
    $ENTRIES
);
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import biplist
import os.path

application = <%= people.join(", "); %>
appname = os.path.basename(application)

def icon_from_app(app_path):
    plist_path = os.path.join(app_path, 'Contents', 'Info.plist')
    plist = biplist.readPlist(plist_path)
    icon_name = plist['CFBundleIconFile']
    icon_root,icon_ext = os.path.splitext(icon_name)
    if not icon_ext:
        icon_ext = '.icns'
    icon_name = icon_root + icon_ext
    return os.path.join(app_path, 'Contents', 'Resources', icon_name)

# .. Basics ....................................................................

# Volume format (see hdiutil create -help)
format = defines.get('format')

# Compression level (if relevant)
compression_level = defines.get('compressionLevel', 9)

# Volume size
size = defines.get('size', None)

# Files to include
files = [ application ]

# Symlinks to create
symlinks = { 'Applications': '/Applications' }

# Volume icon
#
# You can either define icon, in which case that icon file will be copied to the
# image, *or* you can define badge_icon, in which case the icon file you specify
# will be used to badge the system's Removable Disk icon
#
#icon = '/path/to/icon.icns'
badge_icon = icon_from_app(application)

# Where to put the icons
icon_locations = {
    appname:        (140, 120),
    'Applications': (500, 120)
    }

# .. Window configuration ......................................................

# Background
#
# This is a STRING containing any of the following:
#
#    #3344ff          - web-style RGB color
#    #34f             - web-style RGB color, short form (#34f == #3344ff)
#    rgb(1,0,0)       - RGB color, each value is between 0 and 1
#    hsl(120,1,.5)    - HSL (hue saturation lightness) color
#    hwb(300,0,0)     - HWB (hue whiteness blackness) color
#    cmyk(0,1,0,0)    - CMYK color
#    goldenrod        - X11/SVG named color
#    builtin-arrow    - A simple built-in background with a blue arrow
#    /foo/bar/baz.png - The path to an image file
#
# The hue component in hsl() and hwb() may include a unit; it defaults to
# degrees ('deg'), but also supports radians ('rad') and gradians ('grad'
# or 'gon').
#
# Other color components may be expressed either in the range 0 to 1, or
# as percentages (e.g. 60% is equivalent to 0.6).
background = 'builtin-arrow'

show_status_bar = False
show_tab_view = False
show_toolbar = False
show_pathbar = False
show_sidebar = False
sidebar_width = 180

# Window position in ((x, y), (w, h)) format
window_rect = ((100, 100), (640, 280))

# Select the default view; must be one of
#
#    'icon-view'
#    'list-view'
#    'column-view'
#    'coverflow'
#
default_view = 'icon-view'

# General view configuration
show_icon_preview = False

# Set these to True to force inclusion of icon/list view settings (otherwise
# we only include settings for the default view)
include_icon_view_settings = 'auto'
include_list_view_settings = 'auto'

# .. Icon view configuration ...................................................

arrange_by = None
grid_offset = (0, 0)
grid_spacing = 100
scroll_position = (0, 0)
label_pos = 'bottom' # or 'right'
text_size = 16
icon_size = 128

# .. List view configuration ...................................................

# Column names are as follows:
#
#   name
#   date-modified
#   date-created
#   date-added
#   date-last-opened
#   size
#   kind
#   label
#   version
#   comments
#
list_icon_size = 16
list_text_size = 12
list_scroll_position = (0, 0)
list_sort_by = 'name'
list_use_relative_dates = True
list_calculate_all_sizes = False,
list_columns = ('name', 'date-modified', 'size', 'kind', 'date-added')
list_column_widths = {
    'name': 300,
    'date-modified': 181,
    'date-created': 181,
    'date-added': 181,
    'date-last-opened': 181,
    'size': 97,
    'kind': 115,
    'label': 100,
    'version': 75,
    'comments': 300,
    }
list_column_sort_directions = {
    'name': 'ascending',
    'date-modified': 'descending',
    'date-created': 'descending',
    'date-added': 'descending',
    'date-last-opened': 'descending',
    'size': 'descending',
    'kind': 'ascending',
    'label': 'ascending',
    'version': 'ascending',
    'comments': 'ascending',
    }

# .. License configuration .....................................................

# Text in the license configuration is stored in the resources, which means
# it gets stored in a legacy Mac encoding according to the language.  dmgbuild
# will *try* to convert Unicode strings to the appropriate encoding, *but*
# you should be aware that Python doesn't support all of the necessary encodings;
# in many cases you will need to encode the text yourself and use byte strings
# instead here.

# Recognized language names are:
#
#  af_ZA, ar, be_BY, bg_BG, bn, bo, br, ca_ES, cs_CZ, cy, da_DK, de_AT, de_CH,
#  de_DE, dz_BT, el_CY, el_GR, en_AU, en_CA, en_GB, en_IE, en_SG, en_US, eo,
#  es_419, es_ES, et_EE, fa_IR, fi_FI, fo_FO, fr_001, fr_BE, fr_CA, fr_CH,
#  fr_FR, ga-Latg_IE, ga_IE, gd, grc, gu_IN, gv, he_IL, hi_IN, hr_HR, hu_HU,
#  hy_AM, is_IS, it_CH, it_IT, iu_CA, ja_JP, ka_GE, kl, ko_KR, lt_LT, lv_LV,
#  mk_MK, mr_IN, mt_MT, nb_NO, ne_NP, nl_BE, nl_NL, nn_NO, pa, pl_PL, pt_BR,
#  pt_PT, ro_RO, ru_RU, se, sk_SK, sl_SI, sr_RS, sv_SE, th_TH, to_TO, tr_TR,
#  uk_UA, ur_IN, ur_PK, uz_UZ, vi_VN, zh_CN, zh_TW

# license = {
#     'default-language': 'en_US',
#     'licenses': {
#         # For each language, the text of the license.  This can be plain text,
#         # RTF (in which case it must start "{\rtf1"), or a path to a file
#         # containing the license text.  If you're using RTF,
#         # watch out for Python escaping (or read it from a file).
#         'English': b'''{\\rtf1\\ansi\\ansicpg1252\\cocoartf1504\\cocoasubrtf820
# {\\fonttbl\\f0\\fnil\\fcharset0 Helvetica-Bold;\\f1\\fnil\\fcharset0 Helvetica;}
# {\\colortbl;\\red255\\green255\\blue255;\\red0\\green0\\blue0;}
# {\\*\\expandedcolortbl;;\\cssrgb\\c0\\c0\\c0;}
# \\paperw11905\\paperh16837\\margl1133\\margr1133\\margb1133\\margt1133
# \\deftab720
# \\pard\\pardeftab720\\sa160\\partightenfactor0

# \\f0\\b\\fs60 \\cf2 \\expnd0\\expndtw0\\kerning0
# \\up0 \\nosupersub \\ulnone \\outl0\\strokewidth0 \\strokec2 Test License\\
# \\pard\\pardeftab720\\sa160\\partightenfactor0

# \\fs36 \\cf2 \\strokec2 What is this?\\
# \\pard\\pardeftab720\\sa160\\partightenfactor0

# \\f1\\b0\\fs22 \\cf2 \\strokec2 This is the English license. It says what you are allowed to do with this software.\\
# \\
# }''',
#     },
#     'buttons': {
#         # For each language, text for the buttons on the licensing window.
#         #
#         # Default buttons and text are built-in for the following languages:
#         #
#         #   English (en_US), German (de_DE), Spanish (es_ES), French (fr_FR),
#         #   Italian (it_IT), Japanese (ja_JP), Dutch (nl_NL), Swedish (sv_SE),
#         #   Brazilian Portuguese (pt_BR), Simplified Chinese (zh_CN),
#         #   Traditional Chinese (zh_TW), Danish (da_DK), Finnish (fi_FI),
#         #   Korean (ko_KR), Norwegian (nb_NO)
#         #
#         # You don't need to specify them for those languages; if you fail to
#         # specify them for some other language, English will be used instead.

#         'en_US': (
#             b'English',
#             b'Agree',
#             b'Disagree',
#             b'Print',
#             b'Save',
#             b'If you agree with the terms of this license, press "Agree" to '
#             b'install the software.  If you do not agree, press "Disagree".'
#         ),
#     },
# }
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.DmgTarget = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _dmgLicense() {
  const data = require("./dmgLicense");

  _dmgLicense = function () {
    return data;
  };

  return data;
}

function _dmgUtil() {
  const data = require("./dmgUtil");

  _dmgUtil = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _sanitizeFilename() {
  const data = _interopRequireDefault(require("sanitize-filename"));

  _sanitizeFilename = function () {
    return data;
  };

  return data;
}

function _macCodeSign() {
  const data = require("app-builder-lib/out/codeSign/macCodeSign");

  _macCodeSign = function () {
    return data;
  };

  return data;
}

function _appBuilderLib() {
  const data = require("app-builder-lib");

  _appBuilderLib = function () {
    return data;
  };

  return data;
}

function _differentialUpdateInfoBuilder() {
  const data = require("app-builder-lib/out/targets/differentialUpdateInfoBuilder");

  _differentialUpdateInfoBuilder = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class DmgTarget extends _appBuilderLib().Target {
  constructor(packager, outDir) {
    super("dmg");
    this.packager = packager;
    this.outDir = outDir;
    this.options = this.packager.config.dmg || Object.create(null);
  }

  build(appPath, arch) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const packager = _this.packager; // tslint:disable-next-line:no-invalid-template-strings

      const artifactName = packager.expandArtifactNamePattern(packager.config.dmg, "dmg", null, "${productName}-" + (packager.platformSpecificBuildOptions.bundleShortVersion || "${version}") + ".${ext}");
      const artifactPath = path.join(_this.outDir, artifactName);
      yield packager.info.callArtifactBuildStarted({
        targetPresentableName: "DMG",
        file: artifactPath,
        arch
      });
      const specification = yield _this.computeDmgOptions();
      const volumeName = (0, _sanitizeFilename().default)(_this.computeVolumeName(specification.title));
      const tempDmg = yield createStageDmg((yield packager.getTempFile(".dmg")), appPath, volumeName); // https://github.com/electron-userland/electron-builder/issues/2115

      const backgroundFile = specification.background == null ? null : yield (0, _dmgUtil().transformBackgroundFileIfNeed)(specification.background, packager.info.tempDirManager);
      const finalSize = yield computeAssetSize(packager.info.cancellationToken, tempDmg, specification, backgroundFile);
      yield (0, _builderUtil().exec)("hdiutil", ["resize", "-size", finalSize.toString(), tempDmg]);
      const volumePath = path.join("/Volumes", volumeName);

      if (yield (0, _fs().exists)(volumePath)) {
        _builderUtil().log.debug({
          volumePath
        }, "unmounting previous disk image");

        yield (0, _dmgUtil().detach)(volumePath);
      }

      if (!(yield (0, _dmgUtil().attachAndExecute)(tempDmg, true, () => customizeDmg(volumePath, specification, packager, backgroundFile)))) {
        return;
      } // dmg file must not exist otherwise hdiutil failed (https://github.com/electron-userland/electron-builder/issues/1308#issuecomment-282847594), so, -ov must be specified


      const args = ["convert", tempDmg, "-ov", "-format", specification.format, "-o", artifactPath];

      if (specification.format === "UDZO") {
        args.push("-imagekey", `zlib-level=${process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL || "9"}`);
      }

      yield (0, _builderUtil().spawn)("hdiutil", addLogLevel(args));

      if (_this.options.internetEnabled) {
        yield (0, _builderUtil().exec)("hdiutil", addLogLevel(["internet-enable"]).concat(artifactPath));
      }

      const licenseData = yield (0, _dmgLicense().addLicenseToDmg)(packager, artifactPath);

      if (packager.packagerOptions.effectiveOptionComputed != null) {
        yield packager.packagerOptions.effectiveOptionComputed({
          licenseData
        });
      }

      if (_this.options.sign) {
        yield _this.signDmg(artifactPath);
      }

      const safeArtifactName = packager.computeSafeArtifactName(artifactName, "dmg");
      const updateInfo = yield (0, _differentialUpdateInfoBuilder().createBlockmap)(artifactPath, _this, packager, safeArtifactName);
      yield packager.info.callArtifactBuildCompleted({
        file: artifactPath,
        safeArtifactName,
        target: _this,
        arch,
        packager,
        isWriteUpdateInfo: true,
        updateInfo
      });
    })();
  }

  signDmg(artifactPath) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (!(0, _macCodeSign().isSignAllowed)(false)) {
        return;
      }

      const packager = _this2.packager;
      const qualifier = packager.platformSpecificBuildOptions.identity; // explicitly disabled if set to null

      if (qualifier === null) {
        // macPackager already somehow handle this situation, so, here just return
        return;
      }

      const keychainName = (yield packager.codeSigningInfo.value).keychainName;
      const certificateType = "Developer ID Application";
      let identity = yield (0, _macCodeSign().findIdentity)(certificateType, qualifier, keychainName);

      if (identity == null) {
        identity = yield (0, _macCodeSign().findIdentity)("Mac Developer", qualifier, keychainName);

        if (identity == null) {
          return;
        }
      }

      const args = ["--sign", identity.hash];

      if (keychainName != null) {
        args.push("--keychain", keychainName);
      }

      args.push(artifactPath);
      yield (0, _builderUtil().exec)("codesign", args);
    })();
  }

  computeVolumeName(custom) {
    const appInfo = this.packager.appInfo;
    const shortVersion = this.packager.platformSpecificBuildOptions.bundleShortVersion || appInfo.version;

    if (custom == null) {
      return `${appInfo.productFilename} ${shortVersion}`;
    }

    return custom.replace(/\${shortVersion}/g, shortVersion).replace(/\${version}/g, appInfo.version).replace(/\${name}/g, appInfo.name).replace(/\${productName}/g, appInfo.productName);
  } // public to test


  computeDmgOptions() {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      // appdmg
      const appdmgWindow = _this3.options.window || {};
      const oldPosition = appdmgWindow.position;
      const oldSize = appdmgWindow.size;
      const oldIconSize = _this3.options["icon-size"];
      const oldBackgroundColor = _this3.options["background-color"];

      if (oldPosition != null) {
        _builderUtil().log.warn({
          solution: "use dmg.window"
        }, "dmg.window.position is deprecated");
      }

      if (oldSize != null) {
        _builderUtil().log.warn({
          solution: "use dmg.window"
        }, "dmg.window.size is deprecated");
      }

      if (oldIconSize != null) {
        _builderUtil().log.warn({
          solution: "use dmg.iconSize"
        }, "dmg.icon-size is deprecated");
      }

      if (oldBackgroundColor != null) {
        _builderUtil().log.warn({
          solution: "use dmg.backgroundColor"
        }, "dmg.background-color is deprecated");
      }

      const packager = _this3.packager;
      const specification = (0, _builderUtil().deepAssign)({
        window: {
          x: 400,
          y: 100
        },
        iconSize: oldIconSize,
        backgroundColor: oldBackgroundColor,
        icon: "icon" in _this3.options ? undefined : yield packager.getIconPath()
      }, _this3.options, oldPosition == null ? null : {
        window: {
          x: oldPosition.x,
          y: oldPosition.y
        }
      }, oldSize == null ? null : {
        window: {
          width: oldSize.width,
          height: oldSize.height
        }
      });

      if (specification.icon != null && (0, _builderUtil().isEmptyOrSpaces)(specification.icon)) {
        throw new (_builderUtil().InvalidConfigurationError)("dmg.icon cannot be specified as empty string");
      }

      const background = specification.background;

      if (specification.backgroundColor != null) {
        if (background != null) {
          throw new (_builderUtil().InvalidConfigurationError)("Both dmg.backgroundColor and dmg.background are specified â€” please set the only one");
        }

        specification.backgroundColor = (0, _dmgUtil().computeBackgroundColor)(specification.backgroundColor);
      } else if (background == null) {
        specification.background = yield (0, _dmgUtil().computeBackground)(packager);
      } else {
        specification.background = path.resolve(packager.info.projectDir, background);
      }

      if (specification.format == null) {
        if (process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL != null) {
          specification.format = "UDZO";
        } else if (packager.compression === "store") {
          specification.format = "UDRO";
        } else {
          specification.format = packager.compression === "maximum" ? "UDBZ" : "UDZO";
        }
      }

      if (specification.contents == null) {
        specification.contents = [{
          x: 130,
          y: 220
        }, {
          x: 410,
          y: 220,
          type: "link",
          path: "/Applications"
        }];
      }

      return specification;
    })();
  }

}

exports.DmgTarget = DmgTarget;

function createStageDmg(_x, _x2, _x3) {
  return _createStageDmg.apply(this, arguments);
}

function _createStageDmg() {
  _createStageDmg = (0, _bluebirdLst().coroutine)(function* (tempDmg, appPath, volumeName) {
    //noinspection SpellCheckingInspection
    const imageArgs = addLogLevel(["create", "-srcfolder", appPath, "-volname", volumeName, "-anyowners", "-nospotlight", "-format", "UDRW"]);
    imageArgs.push("-fs", "HFS+", "-fsargs", "-c c=64,a=16,e=16");
    imageArgs.push(tempDmg);
    yield (0, _builderUtil().spawn)("hdiutil", imageArgs);
    return tempDmg;
  });
  return _createStageDmg.apply(this, arguments);
}

function addLogLevel(args) {
  args.push(process.env.DEBUG_DMG === "true" ? "-verbose" : "-quiet");
  return args;
}

function computeAssetSize(_x4, _x5, _x6, _x7) {
  return _computeAssetSize.apply(this, arguments);
}

function _computeAssetSize() {
  _computeAssetSize = (0, _bluebirdLst().coroutine)(function* (cancellationToken, dmgFile, specification, backgroundFile) {
    const asyncTaskManager = new (_builderUtil().AsyncTaskManager)(cancellationToken);
    asyncTaskManager.addTask((0, _fsExtraP().stat)(dmgFile));

    if (specification.icon != null) {
      asyncTaskManager.addTask((0, _fs().statOrNull)(specification.icon));
    }

    if (backgroundFile != null) {
      asyncTaskManager.addTask((0, _fsExtraP().stat)(backgroundFile));
    }

    let result = 32 * 1024;

    for (const stat of yield asyncTaskManager.awaitTasks()) {
      if (stat != null) {
        result += stat.size;
      }
    }

    return result;
  });
  return _computeAssetSize.apply(this, arguments);
}

function customizeDmg(_x8, _x9, _x10, _x11) {
  return _customizeDmg.apply(this, arguments);
}

function _customizeDmg() {
  _customizeDmg = (0, _bluebirdLst().coroutine)(function* (volumePath, specification, packager, backgroundFile) {
    const window = specification.window;
    const env = Object.assign({}, process.env, {
      volumePath,
      appFileName: `${packager.appInfo.productFilename}.app`,
      iconSize: specification.iconSize || 80,
      iconTextSize: specification.iconTextSize || 12,
      windowX: window.x,
      windowY: window.y,
      VERSIONER_PERL_PREFER_32_BIT: "true"
    });

    if (specification.backgroundColor != null || specification.background == null) {
      env.backgroundColor = specification.backgroundColor || "#ffffff";
      env.windowWidth = (window.width || 540).toString();
      env.windowHeight = (window.height || 380).toString();
    } else {
      delete env.backgroundColor;

      if (window.width == null) {
        delete env.windowWidth;
      } else {
        env.windowWidth = window.width.toString();
      }

      if (window.height == null) {
        delete env.windowHeight;
      } else {
        env.windowHeight = window.height.toString();
      }
    }

    const args = ["dmg", "--volume", volumePath];

    if (specification.icon != null) {
      args.push("--icon", (yield packager.getResource(specification.icon)));
    }

    if (backgroundFile != null) {
      env.backgroundFilename = path.basename(backgroundFile);
      args.push("--background", backgroundFile);
    }

    yield (0, _builderUtil().executeAppBuilder)(args);
    const asyncTaskManager = new (_builderUtil().AsyncTaskManager)(packager.info.cancellationToken);
    yield (0, _dmgUtil().applyProperties)((yield computeDmgEntries(specification, volumePath, packager, asyncTaskManager)), env, asyncTaskManager, packager);
    return packager.packagerOptions.effectiveOptionComputed == null || !(yield packager.packagerOptions.effectiveOptionComputed({
      volumePath,
      specification,
      packager
    }));
  });
  return _customizeDmg.apply(this, arguments);
}

function computeDmgEntries(_x12, _x13, _x14, _x15) {
  return _computeDmgEntries.apply(this, arguments);
} function _computeDmgEntries() {
  _computeDmgEntries = (0, _bluebirdLst().coroutine)(function* (specification, volumePath, packager, asyncTaskManager) {
    let result = "";

    for (const c of specification.contents) {
      if (c.path != null && c.path.endsWith(".app") && c.type !== "link") {
        _builderUtil().log.warn({
          path: c.path,
          reason: "actual path to app will be used instead"
        }, `do not specify path for application`);
      }

      const entryPath = c.path || `${packager.appInfo.productFilename}.app`;
      const entryName = c.name || path.basename(entryPath);
      result += `&makeEntries("${entryName}", Iloc_xy => [ ${c.x}, ${c.y} ]),\n`;

      if (c.type === "link") {
        asyncTaskManager.addTask((0, _builderUtil().exec)("ln", ["-s", `/${entryPath.startsWith("/") ? entryPath.substring(1) : entryPath}`, `${volumePath}/${entryName}`]));
      } // use c.path instead of entryPath (to be sure that this logic is not applied to .app bundle) https://github.com/electron-userland/electron-builder/issues/2147
      else if (!(0, _builderUtil().isEmptyOrSpaces)(c.path) && (c.type === "file" || c.type === "dir")) {
          const source = yield packager.getResource(c.path);

          if (source == null) {
            _builderUtil().log.warn({
              entryPath,
              reason: "doesn't exist"
            }, `skipped DMG item copying`);

            continue;
          }

          const destination = `${volumePath}/${entryName}`;
          asyncTaskManager.addTask(c.type === "dir" || (yield (0, _fsExtraP().stat)(source)).isDirectory() ? (0, _fs().copyDir)(source, destination) : (0, _fs().copyFile)(source, destination));
        }
    }

    return result;
  });
  return _computeDmgEntries.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=dmg.js.map{"version":3,"sources":["../src/dmg.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, AsyncTaskManager, exec, InvalidConfigurationError, isEmptyOrSpaces, log, spawn, deepAssign, executeAppBuilder } from \"builder-util\"\nimport { CancellationToken } from \"builder-util-runtime\"\nimport { copyDir, copyFile, exists, statOrNull } from \"builder-util/out/fs\"\nimport { addLicenseToDmg } from \"./dmgLicense\"\nimport { applyProperties, attachAndExecute, computeBackground, computeBackgroundColor, detach, transformBackgroundFileIfNeed } from \"./dmgUtil\"\nimport { stat } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport sanitizeFileName from \"sanitize-filename\"\nimport { findIdentity, isSignAllowed } from \"app-builder-lib/out/codeSign/macCodeSign\"\nimport { Target, DmgOptions } from \"app-builder-lib\"\nimport MacPackager from \"app-builder-lib/out/macPackager\"\nimport { createBlockmap } from \"app-builder-lib/out/targets/differentialUpdateInfoBuilder\"\n\nexport class DmgTarget extends Target {\n  readonly options: DmgOptions = this.packager.config.dmg || Object.create(null)\n\n  constructor(private readonly packager: MacPackager, readonly outDir: string) {\n    super(\"dmg\")\n  }\n\n  async build(appPath: string, arch: Arch) {\n    const packager = this.packager\n    // tslint:disable-next-line:no-invalid-template-strings\n    const artifactName = packager.expandArtifactNamePattern(packager.config.dmg, \"dmg\", null, \"${productName}-\" + (packager.platformSpecificBuildOptions.bundleShortVersion || \"${version}\") + \".${ext}\")\n    const artifactPath = path.join(this.outDir, artifactName)\n    await packager.info.callArtifactBuildStarted({\n      targetPresentableName: \"DMG\",\n      file: artifactPath,\n      arch,\n    })\n\n    const specification = await this.computeDmgOptions()\n    const volumeName = sanitizeFileName(this.computeVolumeName(specification.title))\n\n    const tempDmg = await createStageDmg(await packager.getTempFile(\".dmg\"), appPath, volumeName)\n\n    // https://github.com/electron-userland/electron-builder/issues/2115\n    const backgroundFile = specification.background == null ? null : await transformBackgroundFileIfNeed(specification.background, packager.info.tempDirManager)\n    const finalSize = await computeAssetSize(packager.info.cancellationToken, tempDmg, specification, backgroundFile)\n    await exec(\"hdiutil\", [\"resize\", \"-size\", finalSize.toString(), tempDmg])\n\n    const volumePath = path.join(\"/Volumes\", volumeName)\n    if (await exists(volumePath)) {\n      log.debug({volumePath}, \"unmounting previous disk image\")\n      await detach(volumePath)\n    }\n\n    if (!await attachAndExecute(tempDmg, true, () => customizeDmg(volumePath, specification, packager, backgroundFile))) {\n      return\n    }\n\n    // dmg file must not exist otherwise hdiutil failed (https://github.com/electron-userland/electron-builder/issues/1308#issuecomment-282847594), so, -ov must be specified\n    const args = [\"convert\", tempDmg, \"-ov\", \"-format\", specification.format!, \"-o\", artifactPath]\n    if (specification.format === \"UDZO\") {\n      args.push(\"-imagekey\", `zlib-level=${process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL || \"9\"}`)\n    }\n    await spawn(\"hdiutil\", addLogLevel(args))\n    if (this.options.internetEnabled) {\n      await exec(\"hdiutil\", addLogLevel([\"internet-enable\"]).concat(artifactPath))\n    }\n\n    const licenseData = await addLicenseToDmg(packager, artifactPath)\n    if (packager.packagerOptions.effectiveOptionComputed != null) {\n      await packager.packagerOptions.effectiveOptionComputed({licenseData})\n    }\n\n    if (this.options.sign) {\n      await this.signDmg(artifactPath)\n    }\n\n    const safeArtifactName = packager.computeSafeArtifactName(artifactName, \"dmg\")\n    const updateInfo = await createBlockmap(artifactPath, this, packager, safeArtifactName)\n    await packager.info.callArtifactBuildCompleted({\n      file: artifactPath,\n      safeArtifactName,\n      target: this,\n      arch,\n      packager,\n      isWriteUpdateInfo: true,\n      updateInfo,\n    })\n  }\n\n  private async signDmg(artifactPath: string) {\n    if (!isSignAllowed(false)) {\n      return\n    }\n\n    const packager = this.packager\n    const qualifier = packager.platformSpecificBuildOptions.identity\n    // explicitly disabled if set to null\n    if (qualifier === null) {\n      // macPackager already somehow handle this situation, so, here just return\n      return\n    }\n\n    const keychainName = (await packager.codeSigningInfo.value).keychainName\n    const certificateType = \"Developer ID Application\"\n    let identity = await findIdentity(certificateType, qualifier, keychainName)\n    if (identity == null) {\n      identity = await findIdentity(\"Mac Developer\", qualifier, keychainName)\n      if (identity == null) {\n        return\n      }\n    }\n\n    const args = [\"--sign\", identity.hash]\n    if (keychainName != null) {\n      args.push(\"--keychain\", keychainName)\n    }\n    args.push(artifactPath)\n    await exec(\"codesign\", args)\n  }\n\n  computeVolumeName(custom?: string | null): string {\n    const appInfo = this.packager.appInfo\n    const shortVersion = this.packager.platformSpecificBuildOptions.bundleShortVersion || appInfo.version\n\n    if (custom == null) {\n      return `${appInfo.productFilename} ${shortVersion}`\n    }\n\n    return custom\n      .replace(/\\${shortVersion}/g, shortVersion)\n      .replace(/\\${version}/g, appInfo.version)\n      .replace(/\\${name}/g, appInfo.name)\n      .replace(/\\${productName}/g, appInfo.productName)\n  }\n\n  // public to test\n  async computeDmgOptions(): Promise<DmgOptions> {\n    // appdmg\n    const appdmgWindow = (this.options.window as any) || {}\n    const oldPosition = appdmgWindow.position\n    const oldSize = appdmgWindow.size\n    const oldIconSize = (this.options as any)[\"icon-size\"]\n    const oldBackgroundColor = (this.options as any)[\"background-color\"]\n    if (oldPosition != null) {\n      log.warn({solution: \"use dmg.window\"}, \"dmg.window.position is deprecated\")\n    }\n    if (oldSize != null) {\n      log.warn({solution: \"use dmg.window\"}, \"dmg.window.size is deprecated\")\n    }\n    if (oldIconSize != null) {\n      log.warn({solution: \"use dmg.iconSize\"}, \"dmg.icon-size is deprecated\")\n    }\n    if (oldBackgroundColor != null) {\n      log.warn({solution: \"use dmg.backgroundColor\"}, \"dmg.background-color is deprecated\")\n    }\n\n    const packager = this.packager\n    const specification = deepAssign<DmgOptions>({\n        window: {\n          x: 400,\n          y: 100,\n        },\n        iconSize: oldIconSize,\n        backgroundColor: oldBackgroundColor,\n        icon: \"icon\" in this.options ? undefined : await packager.getIconPath()\n      },\n      this.options,\n      oldPosition == null ? null : {\n        window: {\n          x: oldPosition.x,\n          y: oldPosition.y,\n        }\n      },\n      oldSize == null ? null : {\n        window: {\n          width: oldSize.width,\n          height: oldSize.height,\n        }\n      })\n\n    if (specification.icon != null && isEmptyOrSpaces(specification.icon)) {\n      throw new InvalidConfigurationError(\"dmg.icon cannot be specified as empty string\")\n    }\n\n    const background = specification.background\n    if (specification.backgroundColor != null) {\n      if (background != null) {\n        throw new InvalidConfigurationError(\"Both dmg.backgroundColor and dmg.background are specified â€” please set the only one\")\n      }\n      specification.backgroundColor = computeBackgroundColor(specification.backgroundColor)\n    }\n    else if (background == null) {\n      specification.background = await computeBackground(packager)\n    }\n    else {\n      specification.background = path.resolve(packager.info.projectDir, background)\n    }\n\n    if (specification.format == null) {\n      if (process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL != null) {\n        (specification as any).format = \"UDZO\"\n      }\n      else if (packager.compression === \"store\") {\n        (specification as any).format = \"UDRO\"\n      }\n      else {\n        (specification as any).format = packager.compression === \"maximum\" ? \"UDBZ\" : \"UDZO\"\n      }\n    }\n\n    if (specification.contents == null) {\n      specification.contents = [\n        {\n          x: 130, y: 220\n        },\n        {\n          x: 410, y: 220, type: \"link\", path: \"/Applications\"\n        }\n      ]\n    }\n    return specification\n  }\n}\n\nasync function createStageDmg(tempDmg: string, appPath: string, volumeName: string) {\n  //noinspection SpellCheckingInspection\n  const imageArgs = addLogLevel([\"create\",\n    \"-srcfolder\", appPath,\n    \"-volname\", volumeName,\n    \"-anyowners\", \"-nospotlight\",\n    \"-format\", \"UDRW\",\n  ])\n  imageArgs.push(\"-fs\", \"HFS+\", \"-fsargs\", \"-c c=64,a=16,e=16\")\n  imageArgs.push(tempDmg)\n  await spawn(\"hdiutil\", imageArgs)\n  return tempDmg\n}\n\nfunction addLogLevel(args: Array<string>): Array<string> {\n  args.push(process.env.DEBUG_DMG === \"true\" ? \"-verbose\" : \"-quiet\")\n  return args\n}\n\nasync function computeAssetSize(cancellationToken: CancellationToken, dmgFile: string, specification: DmgOptions, backgroundFile: string | null | undefined) {\n  const asyncTaskManager = new AsyncTaskManager(cancellationToken)\n  asyncTaskManager.addTask(stat(dmgFile))\n\n  if (specification.icon != null) {\n    asyncTaskManager.addTask(statOrNull(specification.icon))\n  }\n\n  if (backgroundFile != null) {\n    asyncTaskManager.addTask(stat(backgroundFile))\n  }\n\n  let result = 32 * 1024\n  for (const stat of await asyncTaskManager.awaitTasks()) {\n    if (stat != null) {\n      result += stat.size\n    }\n  }\n  return result\n}\n\nasync function customizeDmg(volumePath: string, specification: DmgOptions, packager: MacPackager, backgroundFile: string | null | undefined) {\n  const window = specification.window!\n  const env: any = {\n    ...process.env,\n    volumePath,\n    appFileName: `${packager.appInfo.productFilename}.app`,\n    iconSize: specification.iconSize || 80,\n    iconTextSize: specification.iconTextSize || 12,\n\n    windowX: window.x,\n    windowY: window.y,\n\n    VERSIONER_PERL_PREFER_32_BIT: \"true\"\n  }\n\n  if (specification.backgroundColor != null || specification.background == null) {\n    env.backgroundColor = specification.backgroundColor || \"#ffffff\"\n    env.windowWidth = (window.width || 540).toString()\n    env.windowHeight = (window.height || 380).toString()\n  }\n  else {\n    delete env.backgroundColor\n\n    if (window.width == null) {\n      delete env.windowWidth\n    }\n    else {\n      env.windowWidth = window.width.toString()\n    }\n    if (window.height == null) {\n      delete env.windowHeight\n    }\n    else {\n      env.windowHeight = window.height.toString()\n    }\n  }\n\n  const args = [\"dmg\", \"--volume\", volumePath]\n  if (specification.icon != null) {\n    args.push(\"--icon\", (await packager.getResource(specification.icon))!!)\n  }\n  if (backgroundFile != null) {\n    env.backgroundFilename = path.basename(backgroundFile)\n    args.push(\"--background\", backgroundFile)\n  }\n  await executeAppBuilder(args)\n\n  const asyncTaskManager = new AsyncTaskManager(packager.info.cancellationToken)\n  await applyProperties(await computeDmgEntries(specification, volumePath, packager, asyncTaskManager), env, asyncTaskManager, packager)\n  return packager.packagerOptions.effectiveOptionComputed == null || !(await packager.packagerOptions.effectiveOptionComputed({volumePath, specification, packager}))\n}\n\nasync function computeDmgEntries(specification: DmgOptions, volumePath: string, packager: MacPackager, asyncTaskManager: AsyncTaskManager) {\n  let result = \"\"\n  for (const c of specification.contents!!) {\n    if (c.path != null && c.path.endsWith(\".app\") && c.type !== \"link\") {\n      log.warn({path: c.path, reason: \"actual path to app will be used instead\"}, `do not specify path for application`)\n    }\n\n    const entryPath = c.path || `${packager.appInfo.productFilename}.app`\n    const entryName = c.name || path.basename(entryPath)\n    result += `&makeEntries(\"${entryName}\", Iloc_xy => [ ${c.x}, ${c.y} ]),\\n`\n\n    if (c.type === \"link\") {\n      asyncTaskManager.addTask(exec(\"ln\", [\"-s\", `/${entryPath.startsWith(\"/\") ? entryPath.substring(1) : entryPath}`, `${volumePath}/${entryName}`]))\n    }\n    // use c.path instead of entryPath (to be sure that this logic is not applied to .app bundle) https://github.com/electron-userland/electron-builder/issues/2147\n    else if (!isEmptyOrSpaces(c.path) && (c.type === \"file\" || c.type === \"dir\")) {\n      const source = await packager.getResource(c.path)\n      if (source == null) {\n        log.warn({entryPath, reason: \"doesn't exist\"}, `skipped DMG item copying`)\n        continue\n      }\n\n      const destination = `${volumePath}/${entryName}`\n      asyncTaskManager.addTask(c.type === \"dir\" || (await stat(source)).isDirectory() ? copyDir(source, destination) : copyFile(source, destination))\n    }\n  }\n  return result\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.addLicenseToDmg = addLicenseToDmg;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _license() {
  const data = require("app-builder-lib/out/util/license");

  _license = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _dmgUtil() {
  const data = require("./dmgUtil");

  _dmgUtil = function () {
    return data;
  };

  return data;
}

function _licenseButtons() {
  const data = require("./licenseButtons");

  _licenseButtons = function () {
    return data;
  };

  return data;
}

// DropDMG/dmgbuild a in any case (even if no english, but only ru/de) set to 0 (en_US), well, without docs, just believe that's correct
const DEFAULT_REGION_CODE = 0;

function addLicenseToDmg(_x, _x2) {
  return _addLicenseToDmg.apply(this, arguments);
}

function _addLicenseToDmg() {
  _addLicenseToDmg = (0, _bluebirdLst().coroutine)(function* (packager, dmgPath) {
    // http://www.owsiak.org/?p=700
    const licenseFiles = yield (0, _license().getLicenseFiles)(packager);

    if (licenseFiles.length === 0) {
      return null;
    }

    const licenseButtonFiles = yield (0, _licenseButtons().getLicenseButtonsFile)(packager);
    packager.debugLogger.add("dmg.licenseFiles", licenseFiles);
    packager.debugLogger.add("dmg.licenseButtons", licenseButtonFiles);
    const style = [];
    const rtfs = [];
    const defaultButtons = [];
    let counter = 5000;
    const addedRegionCodes = [];

    for (const item of licenseFiles) {
      _builderUtil().log.info({
        lang: item.langName
      }, "adding license"); // value from DropDMG, data the same for any language
      // noinspection SpellCheckingInspection


      style.push(`data 'styl' (${counter}, "${item.langName}") {
  $"0001 0000 0000 000E 0011 0015 0000 000C"
  $"0000 0000 0000"
};`);
      let data = `data 'RTF ' (${counter}, "${item.langName}") {\n`;
      const fileData = yield (0, _fsExtraP().readFile)(item.file, "utf-8");
      const isRtf = item.file.endsWith(".rtf") || item.file.endsWith(".RTF");
      data += isRtf ? (0, _dmgUtil().serializeString)(Buffer.from(fileData).toString("hex")) : wrapInRtf((yield (0, _fsExtraP().readFile)(item.file, "utf-8")));
      data += "\n};";
      rtfs.push(data);
      defaultButtons.push((yield (0, _licenseButtons().getLicenseButtons)(licenseButtonFiles, item.langWithRegion, counter, item.langName)));
      addedRegionCodes.push(getRegionCode(item.langWithRegion));
      counter++;
    }

    const buffer = Buffer.allocUnsafe((2 + 3 * addedRegionCodes.length) * 2);
    let offset = 0;
    buffer.writeUInt16BE(DEFAULT_REGION_CODE, offset);
    offset += 2;
    buffer.writeUInt16BE(addedRegionCodes.length, offset);
    offset += 2;

    for (let i = 0; i < addedRegionCodes.length; i++) {
      const regionCode = addedRegionCodes[i];
      buffer.writeUInt16BE(regionCode, offset);
      offset += 2;
      buffer.writeUInt16BE(i, offset);
      offset += 2;
      buffer.writeUInt16BE(
      /* is two byte */
      [14, 51, 52, 53].includes(regionCode) ? 1 : 0, offset);
      offset += 2;
    }

    const lPic = `data 'LPic' (5000) {\n${(0, _dmgUtil().serializeString)(buffer.toString("hex"))}\n};`;
    const data = style.concat(rtfs).concat(lPic).concat(defaultButtons).join("\n\n");
    packager.debugLogger.add("dmg.licenseResource", data);
    const tempFile = yield packager.getTempFile(".r");
    yield (0, _fsExtraP().outputFile)(tempFile, data);
    yield (0, _builderUtil().exec)("hdiutil", ["unflatten", dmgPath]);
    yield (0, _builderUtil().exec)("Rez", ["-a", tempFile, "-o", dmgPath]);
    yield (0, _builderUtil().exec)("hdiutil", ["flatten", dmgPath]);
    return data;
  });
  return _addLicenseToDmg.apply(this, arguments);
}

function getRtfUnicodeEscapedString(text) {
  let result = "";

  for (let i = 0; i < text.length; i++) {
    if (text[i] === "\\" || text[i] === "{" || text[i] === "}" || text[i] === "\n") {
      result += `\\${text[i]}`;
    } else if (text[i] === "\r") {// ignore
    } else if (text.charCodeAt(i) <= 0x7f) {
      result += text[i];
    } else {
      result += `\\u${text.codePointAt(i)}`;
    }
  }

  return result;
}

function wrapInRtf(text) {
  return `  $"7B5C 7274 6631 5C61 6E73 695C 616E 7369"
  $"6370 6731 3235 325C 636F 636F 6172 7466"
  $"3135 3034 5C63 6F63 6F61 7375 6272 7466"
  $"3833 300A 7B5C 666F 6E74 7462 6C5C 6630"
  $"5C66 7377 6973 735C 6663 6861 7273 6574"
  $"3020 4865 6C76 6574 6963 613B 7D0A 7B5C"
  $"636F 6C6F 7274 626C 3B5C 7265 6432 3535"
  $"5C67 7265 656E 3235 355C 626C 7565 3235"
  $"353B 7D0A 7B5C 2A5C 6578 7061 6E64 6564"
  $"636F 6C6F 7274 626C 3B3B 7D0A 5C70 6172"
  $"645C 7478 3536 305C 7478 3131 3230 5C74"
  $"7831 3638 305C 7478 3232 3430 5C74 7832"
  $"3830 305C 7478 3333 3630 5C74 7833 3932"
  $"305C 7478 3434 3830 5C74 7835 3034 305C"
  $"7478 3536 3030 5C74 7836 3136 305C 7478"
  $"3637 3230 5C70 6172 6469 726E 6174 7572"
  $"616C 5C70 6172 7469 6768 7465 6E66 6163"
  $"746F 7230 0A0A 5C66 305C 6673 3234 205C"
${(0, _dmgUtil().serializeString)("63663020" + Buffer.from(getRtfUnicodeEscapedString(text)).toString("hex").toUpperCase() + "7D")}`; // ^ to produce correctly splitted output, this two leading chunks from default wrapper appended here
}

function getRegionCode(langWithRegion) {
  const result = regionCodes[langWithRegion];

  if (result == null) {
    throw new Error(`Cannot determine region code for ${langWithRegion}`);
  }

  return result;
} // noinspection SpellCheckingInspection


const regionCodes = {
  en_US: 0,
  fr_FR: 1,
  en_GB: 2,
  de_DE: 3,
  it_IT: 4,
  nl_NL: 5,
  nl_BE: 6,
  sv_SE: 7,
  es_ES: 8,
  da_DK: 9,
  pt_PT: 10,
  fr_CA: 11,
  nb_NO: 12,
  he_IL: 13,
  ja_JP: 14,
  en_AU: 15,
  ar: 16,
  fi_FI: 17,
  fr_CH: 18,
  de_CH: 19,
  el_GR: 20,
  is_IS: 21,
  mt_MT: 22,
  el_CY: 23,
  tr_TR: 24,
  hi_IN: 33,
  ur_PK: 34,
  it_CH: 36,
  ro_RO: 39,
  grc: 40,
  lt_LT: 41,
  pl_PL: 42,
  hu_HU: 43,
  et_EE: 44,
  lv_LV: 45,
  se: 46,
  fo_FO: 47,
  fa_IR: 48,
  ru_RU: 49,
  ga_IE: 50,
  ko_KR: 51,
  zh_CN: 52,
  zh_TW: 53,
  th_TH: 54,
  cs_CZ: 56,
  sk_SK: 57,
  bn: 60,
  be_BY: 61,
  uk_UA: 62,
  sr_RS: 65,
  sl_SI: 66,
  mk_MK: 67,
  hr_HR: 68,
  pt_BR: 71,
  bg_BG: 72,
  ca_ES: 73,
  gd: 75,
  gv: 76,
  br: 77,
  iu_CA: 78,
  cy: 79,
  "ga-Latg_IE": 81,
  en_CA: 82,
  dz_BT: 83,
  hy_AM: 84,
  ka_GE: 85,
  es_419: 86,
  to_TO: 88,
  fr_001: 91,
  de_AT: 92,
  gu_IN: 94,
  pa: 95,
  ur_IN: 96,
  vi_VN: 97,
  fr_BE: 98,
  uz_UZ: 99,
  en_SG: 100,
  nn_NO: 101,
  af_ZA: 102,
  eo: 103,
  mr_IN: 104,
  bo: 105,
  ne_NP: 106,
  kl: 107,
  en_IE: 108
}; 
// __ts-babel@6.0.4
//# sourceMappingURL=dmgLicense.js.map{"version":3,"sources":["../src/dmgLicense.ts"],"names":[],"mappings":"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","sourcesContent":["import { exec, log } from \"builder-util\"\nimport { PlatformPackager } from \"app-builder-lib\"\nimport { getLicenseFiles } from \"app-builder-lib/out/util/license\"\nimport { outputFile, readFile } from \"fs-extra-p\"\nimport { serializeString } from \"./dmgUtil\"\nimport { getLicenseButtons, getLicenseButtonsFile } from \"./licenseButtons\"\n\n// DropDMG/dmgbuild a in any case (even if no english, but only ru/de) set to 0 (en_US), well, without docs, just believe that's correct\nconst DEFAULT_REGION_CODE = 0\n\nexport async function addLicenseToDmg(packager: PlatformPackager<any>, dmgPath: string): Promise<string | null> {\n  // http://www.owsiak.org/?p=700\n  const licenseFiles = await getLicenseFiles(packager)\n  if (licenseFiles.length === 0) {\n    return null\n  }\n\n  const licenseButtonFiles = await getLicenseButtonsFile(packager)\n  packager.debugLogger.add(\"dmg.licenseFiles\", licenseFiles)\n  packager.debugLogger.add(\"dmg.licenseButtons\", licenseButtonFiles)\n\n  const style: Array<string> = []\n  const rtfs: Array<string> = []\n  const defaultButtons: Array<string> = []\n\n  let counter = 5000\n  const addedRegionCodes: Array<number> = []\n  for (const item of licenseFiles) {\n    log.info({lang: item.langName}, \"adding license\")\n\n    // value from DropDMG, data the same for any language\n    // noinspection SpellCheckingInspection\n    style.push(`data 'styl' (${counter}, \"${item.langName}\") {\n  $\"0001 0000 0000 000E 0011 0015 0000 000C\"\n  $\"0000 0000 0000\"\n};`)\n\n    let data = `data 'RTF ' (${counter}, \"${item.langName}\") {\\n`\n    const fileData = await readFile(item.file, \"utf-8\")\n    const isRtf = item.file.endsWith(\".rtf\") || item.file.endsWith(\".RTF\")\n    data += isRtf ? serializeString((Buffer.from(fileData)).toString(\"hex\")) : wrapInRtf(await readFile(item.file, \"utf-8\"))\n    data += \"\\n};\"\n    rtfs.push(data)\n\n    defaultButtons.push(await getLicenseButtons(licenseButtonFiles, item.langWithRegion, counter, item.langName))\n    addedRegionCodes.push(getRegionCode(item.langWithRegion))\n    counter++\n  }\n\n  const buffer = Buffer.allocUnsafe((2 + (3 * addedRegionCodes.length)) * 2)\n  let offset = 0\n  buffer.writeUInt16BE(DEFAULT_REGION_CODE, offset)\n  offset += 2\n  buffer.writeUInt16BE(addedRegionCodes.length, offset)\n  offset += 2\n\n  for (let i = 0; i < addedRegionCodes.length; i++) {\n    const regionCode = addedRegionCodes[i]\n    buffer.writeUInt16BE(regionCode, offset)\n    offset += 2\n    buffer.writeUInt16BE(i, offset)\n    offset += 2\n    buffer.writeUInt16BE(/* is two byte */ [14, 51, 52, 53].includes(regionCode) ? 1 : 0, offset)\n    offset += 2\n  }\n\n  const lPic = `data 'LPic' (5000) {\\n${serializeString(buffer.toString(\"hex\"))}\\n};`\n  const data = style\n    .concat(rtfs)\n    .concat(lPic)\n    .concat(defaultButtons)\n    .join(\"\\n\\n\")\n\n  packager.debugLogger.add(\"dmg.licenseResource\", data)\n  const tempFile = await packager.getTempFile(\".r\")\n  await outputFile(tempFile, data)\n  await exec(\"hdiutil\", [\"unflatten\", dmgPath])\n  await exec(\"Rez\", [\"-a\", tempFile, \"-o\", dmgPath])\n  await exec(\"hdiutil\", [\"flatten\", dmgPath])\n\n  return data\n}\n\nfunction getRtfUnicodeEscapedString(text: string) {\n  let result = \"\"\n  for (let i = 0; i < text.length; i++) {\n    if (text[i] === \"\\\\\" || text[i] === \"{\" || text[i] === \"}\" || text[i] === \"\\n\") {\n      result += `\\\\${text[i]}`\n    }\n    else if (text[i] === \"\\r\") {\n      // ignore\n    }\n    else if (text.charCodeAt(i) <= 0x7f) {\n      result += text[i]\n    }\n    else {\n      result += `\\\\u${text.codePointAt(i)}`\n    }\n  }\n  return result\n}\n\nfunction wrapInRtf(text: string) {\n  return `  $\"7B5C 7274 6631 5C61 6E73 695C 616E 7369\"\n  $\"6370 6731 3235 325C 636F 636F 6172 7466\"\n  $\"3135 3034 5C63 6F63 6F61 7375 6272 7466\"\n  $\"3833 300A 7B5C 666F 6E74 7462 6C5C 6630\"\n  $\"5C66 7377 6973 735C 6663 6861 7273 6574\"\n  $\"3020 4865 6C76 6574 6963 613B 7D0A 7B5C\"\n  $\"636F 6C6F 7274 626C 3B5C 7265 6432 3535\"\n  $\"5C67 7265 656E 3235 355C 626C 7565 3235\"\n  $\"353B 7D0A 7B5C 2A5C 6578 7061 6E64 6564\"\n  $\"636F 6C6F 7274 626C 3B3B 7D0A 5C70 6172\"\n  $\"645C 7478 3536 305C 7478 3131 3230 5C74\"\n  $\"7831 3638 305C 7478 3232 3430 5C74 7832\"\n  $\"3830 305C 7478 3333 3630 5C74 7833 3932\"\n  $\"305C 7478 3434 3830 5C74 7835 3034 305C\"\n  $\"7478 3536 3030 5C74 7836 3136 305C 7478\"\n  $\"3637 3230 5C70 6172 6469 726E 6174 7572\"\n  $\"616C 5C70 6172 7469 6768 7465 6E66 6163\"\n  $\"746F 7230 0A0A 5C66 305C 6673 3234 205C\"\n${serializeString(\"63663020\" + Buffer.from(getRtfUnicodeEscapedString(text)).toString(\"hex\").toUpperCase() + \"7D\")}`\n  // ^ to produce correctly splitted output, this two leading chunks from default wrapper appended here\n}\n\nfunction getRegionCode(langWithRegion: string) {\n  const result = regionCodes[langWithRegion]\n  if (result == null) {\n    throw new Error(`Cannot determine region code for ${langWithRegion}`)\n  }\n  return result\n}\n\n// noinspection SpellCheckingInspection\nconst regionCodes: any = {\n  en_US: 0,\n  fr_FR: 1,\n  en_GB: 2,\n  de_DE: 3,\n  it_IT: 4,\n  nl_NL: 5,\n  nl_BE: 6,\n  sv_SE: 7,\n  es_ES: 8,\n  da_DK: 9,\n  pt_PT: 10,\n  fr_CA: 11,\n  nb_NO: 12,\n  he_IL: 13,\n  ja_JP: 14,\n  en_AU: 15,\n  ar: 16,\n  fi_FI: 17,\n  fr_CH: 18,\n  de_CH: 19,\n  el_GR: 20,\n  is_IS: 21,\n  mt_MT: 22,\n  el_CY: 23,\n  tr_TR: 24,\n  hi_IN: 33,\n  ur_PK: 34,\n  it_CH: 36,\n  ro_RO: 39,\n  grc: 40,\n  lt_LT: 41,\n  pl_PL: 42,\n  hu_HU: 43,\n  et_EE: 44,\n  lv_LV: 45,\n  se: 46,\n  fo_FO: 47,\n  fa_IR: 48,\n  ru_RU: 49,\n  ga_IE: 50,\n  ko_KR: 51,\n  zh_CN: 52,\n  zh_TW: 53,\n  th_TH: 54,\n  cs_CZ: 56,\n  sk_SK: 57,\n  bn: 60,\n  be_BY: 61,\n  uk_UA: 62,\n  sr_RS: 65,\n  sl_SI: 66,\n  mk_MK: 67,\n  hr_HR: 68,\n  pt_BR: 71,\n  bg_BG: 72,\n  ca_ES: 73,\n  gd: 75,\n  gv: 76,\n  br: 77,\n  iu_CA: 78,\n  cy: 79,\n  \"ga-Latg_IE\": 81,\n  en_CA: 82,\n  dz_BT: 83,\n  hy_AM: 84,\n  ka_GE: 85,\n  es_419: 86,\n  to_TO: 88,\n  fr_001: 91,\n  de_AT: 92,\n  gu_IN: 94,\n  pa: 95,\n  ur_IN: 96,\n  vi_VN: 97,\n  fr_BE: 98,\n  uz_UZ: 99,\n  en_SG: 100,\n  nn_NO: 101,\n  af_ZA: 102,\n  eo: 103,\n  mr_IN: 104,\n  bo: 105,\n  ne_NP: 106,\n  kl: 107,\n  en_IE: 108\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getDmgTemplatePath = getDmgTemplatePath;
exports.getDmgVendorPath = getDmgVendorPath;
exports.attachAndExecute = attachAndExecute;
exports.detach = detach;
exports.computeBackgroundColor = computeBackgroundColor;
exports.computeBackground = computeBackground;
exports.applyProperties = applyProperties;
exports.transformBackgroundFileIfNeed = transformBackgroundFileIfNeed;
exports.serializeString = serializeString;
Object.defineProperty(exports, "DmgTarget", {
  enumerable: true,
  get: function () {
    return _dmg().DmgTarget;
  }
});

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _dmg() {
  const data = require("./dmg");

  _dmg = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

const root = path.join(__dirname, "..");

function getDmgTemplatePath() {
  return path.join(root, "templates");
}

function getDmgVendorPath() {
  return path.join(root, "vendor");
}

function attachAndExecute(_x, _x2, _x3) {
  return _attachAndExecute.apply(this, arguments);
}

function _attachAndExecute() {
  _attachAndExecute = (0, _bluebirdLst().coroutine)(function* (dmgPath, readWrite, task) {
    //noinspection SpellCheckingInspection
    const args = ["attach", "-noverify", "-noautoopen"];

    if (readWrite) {
      args.push("-readwrite");
    }

    args.push(dmgPath);
    const attachResult = yield (0, _builderUtil().exec)("hdiutil", args);
    const deviceResult = attachResult == null ? null : /^(\/dev\/\w+)/.exec(attachResult);
    const device = deviceResult == null || deviceResult.length !== 2 ? null : deviceResult[1];

    if (device == null) {
      throw new Error(`Cannot mount: ${attachResult}`);
    }

    return yield (0, _promise().executeFinally)(task(), () => detach(device));
  });
  return _attachAndExecute.apply(this, arguments);
}

function detach(_x4) {
  return _detach.apply(this, arguments);
}

function _detach() {
  _detach = (0, _bluebirdLst().coroutine)(function* (name) {
    try {
      yield (0, _builderUtil().exec)("hdiutil", ["detach", "-quiet", name]);
    } catch (e) {
      yield new Promise((resolve, reject) => {
        setTimeout(() => {
          (0, _builderUtil().exec)("hdiutil", ["detach", "-force", name]).then(resolve).catch(reject);
        }, 1000);
      });
    }
  });
  return _detach.apply(this, arguments);
}

function computeBackgroundColor(rawValue) {
  return require("parse-color")(rawValue).hex;
}

function computeBackground(_x5) {
  return _computeBackground.apply(this, arguments);
}

function _computeBackground() {
  _computeBackground = (0, _bluebirdLst().coroutine)(function* (packager) {
    const resourceList = yield packager.resourceList;

    if (resourceList.includes("background.tiff")) {
      return path.join(packager.buildResourcesDir, "background.tiff");
    } else if (resourceList.includes("background.png")) {
      return path.join(packager.buildResourcesDir, "background.png");
    } else {
      return path.join(getDmgTemplatePath(), "background.tiff");
    }
  });
  return _computeBackground.apply(this, arguments);
}

function applyProperties(_x6, _x7, _x8, _x9) {
  return _applyProperties.apply(this, arguments);
}

function _applyProperties() {
  _applyProperties = (0, _bluebirdLst().coroutine)(function* (entries, env, asyncTaskManager, packager) {
    const dmgPropertiesFile = yield packager.getTempFile("dmgProperties.pl");
    asyncTaskManager.addTask((0, _fsExtraP().outputFile)(dmgPropertiesFile, (yield (0, _fsExtraP().readFile)(path.join(getDmgTemplatePath(), "dmgProperties.pl"), "utf-8")).replace("$ENTRIES", entries)));
    yield asyncTaskManager.awaitTasks();
    yield (0, _builderUtil().exec)("/usr/bin/perl", [dmgPropertiesFile], {
      cwd: getDmgVendorPath(),
      env
    });
  });
  return _applyProperties.apply(this, arguments);
}

function transformBackgroundFileIfNeed(_x10, _x11) {
  return _transformBackgroundFileIfNeed.apply(this, arguments);
}
/** @internal */


function _transformBackgroundFileIfNeed() {
  _transformBackgroundFileIfNeed = (0, _bluebirdLst().coroutine)(function* (file, tmpDir) {
    if (file.endsWith(".tiff") || file.endsWith(".TIFF")) {
      return file;
    }

    const retinaFile = file.replace(/\.([a-z]+)$/, "@2x.$1");

    if (yield (0, _fs().exists)(retinaFile)) {
      const tiffFile = yield tmpDir.getTempFile({
        suffix: ".tiff"
      });
      yield (0, _builderUtil().exec)("tiffutil", ["-cathidpicheck", file, retinaFile, "-out", tiffFile]);
      return tiffFile;
    }

    return file;
  });
  return _transformBackgroundFileIfNeed.apply(this, arguments);
}

function serializeString(data) {
  return '  $"' + data.match(/.{1,32}/g).map(it => it.match(/.{1,4}/g).join(" ")).join('"\n  $"') + '"';
} 
// __ts-babel@6.0.4
//# sourceMappingURL=dmgUtil.js.map{"version":3,"sources":["../src/dmgUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import { exec } from \"builder-util\"\nimport { PlatformPackager } from \"app-builder-lib\"\nimport { AsyncTaskManager } from \"builder-util/out/asyncTaskManager\"\nimport { exists } from \"builder-util/out/fs\"\nimport { executeFinally } from \"builder-util/out/promise\"\nimport { outputFile, readFile } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport { TmpDir } from \"temp-file\"\n\nexport { DmgTarget } from \"./dmg\"\n\nconst root = path.join(__dirname, \"..\")\n\nexport function getDmgTemplatePath() {\n  return path.join(root, \"templates\")\n}\n\nexport function getDmgVendorPath() {\n  return path.join(root, \"vendor\")\n}\n\nexport async function attachAndExecute(dmgPath: string, readWrite: boolean, task: () => Promise<any>) {\n  //noinspection SpellCheckingInspection\n  const args = [\"attach\", \"-noverify\", \"-noautoopen\"]\n  if (readWrite) {\n    args.push(\"-readwrite\")\n  }\n\n  args.push(dmgPath)\n  const attachResult = await exec(\"hdiutil\", args)\n  const deviceResult = attachResult == null ? null : /^(\\/dev\\/\\w+)/.exec(attachResult)\n  const device = deviceResult == null || deviceResult.length !== 2 ? null : deviceResult[1]\n  if (device == null) {\n    throw new Error(`Cannot mount: ${attachResult}`)\n  }\n\n  return await executeFinally(task(), () => detach(device))\n}\n\nexport async function detach(name: string) {\n  try {\n    await exec(\"hdiutil\", [\"detach\", \"-quiet\", name])\n  }\n  catch (e) {\n    await new Promise((resolve, reject) => {\n      setTimeout(() => {\n        exec(\"hdiutil\", [\"detach\", \"-force\", name])\n          .then(resolve)\n          .catch(reject)\n      }, 1000)\n    })\n  }\n}\n\nexport function computeBackgroundColor(rawValue: string) {\n  return require(\"parse-color\")(rawValue).hex\n}\n\nexport async function computeBackground(packager: PlatformPackager<any>): Promise<string> {\n  const resourceList = await packager.resourceList\n  if (resourceList.includes(\"background.tiff\")) {\n    return path.join(packager.buildResourcesDir, \"background.tiff\")\n  }\n  else if (resourceList.includes(\"background.png\")) {\n    return path.join(packager.buildResourcesDir, \"background.png\")\n  }\n  else {\n    return path.join(getDmgTemplatePath(), \"background.tiff\")\n  }\n}\n\nexport async function applyProperties(entries: any, env: any, asyncTaskManager: AsyncTaskManager, packager: PlatformPackager<any>) {\n  const dmgPropertiesFile = await packager.getTempFile(\"dmgProperties.pl\")\n  asyncTaskManager.addTask(outputFile(dmgPropertiesFile, (await readFile(path.join(getDmgTemplatePath(), \"dmgProperties.pl\"), \"utf-8\")).replace(\"$ENTRIES\", entries)))\n  await asyncTaskManager.awaitTasks()\n\n  await exec(\"/usr/bin/perl\", [dmgPropertiesFile], {\n    cwd: getDmgVendorPath(),\n    env\n  })\n}\n\nexport async function transformBackgroundFileIfNeed(file: string, tmpDir: TmpDir): Promise<string> {\n  if (file.endsWith(\".tiff\") || file.endsWith(\".TIFF\")) {\n    return file\n  }\n\n  const retinaFile = file.replace(/\\.([a-z]+)$/, \"@2x.$1\")\n  if (await exists(retinaFile)) {\n    const tiffFile = await tmpDir.getTempFile({suffix: \".tiff\"})\n    await exec(\"tiffutil\", [\"-cathidpicheck\", file, retinaFile, \"-out\", tiffFile])\n    return tiffFile\n  }\n\n  return file\n}\n\n/** @internal */\nexport function serializeString(data: string) {\n  return '  $\"' + data.match(/.{1,32}/g)!!.map(it => it.match(/.{1,4}/g)!!.join(\" \")).join('\"\\n  $\"') + '\"'\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getLicenseButtonsFile = getLicenseButtonsFile;
exports.getLicenseButtons = getLicenseButtons;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _license() {
  const data = require("app-builder-lib/out/util/license");

  _license = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function iconv() {
  const data = _interopRequireWildcard(require("iconv-lite"));

  iconv = function () {
    return data;
  };

  return data;
}

function _jsYaml() {
  const data = require("js-yaml");

  _jsYaml = function () {
    return data;
  };

  return data;
}

function _dmgUtil() {
  const data = require("./dmgUtil");

  _dmgUtil = function () {
    return data;
  };

  return data;
}

function _licenseDefaultButtons() {
  const data = require("./licenseDefaultButtons");

  _licenseDefaultButtons = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function getLicenseButtonsFile(_x) {
  return _getLicenseButtonsFile.apply(this, arguments);
}

function _getLicenseButtonsFile() {
  _getLicenseButtonsFile = (0, _bluebirdLst().coroutine)(function* (packager) {
    return (0, _license().getLicenseAssets)((yield packager.resourceList).filter(it => {
      const name = it.toLowerCase(); // noinspection SpellCheckingInspection

      return name.startsWith("licensebuttons_") && (name.endsWith(".json") || name.endsWith(".yml"));
    }), packager);
  });
  return _getLicenseButtonsFile.apply(this, arguments);
}

function getLicenseButtons(_x2, _x3, _x4, _x5) {
  return _getLicenseButtons.apply(this, arguments);
}

function _getLicenseButtons() {
  _getLicenseButtons = (0, _bluebirdLst().coroutine)(function* (licenseButtonFiles, langWithRegion, id, name) {
    let data = (0, _licenseDefaultButtons().getDefaultButtons)(langWithRegion, id, name);

    for (const item of licenseButtonFiles) {
      if (item.langWithRegion !== langWithRegion) {
        continue;
      }

      try {
        const fileData = (0, _jsYaml().safeLoad)((yield (0, _fsExtraP().readFile)(item.file, "utf-8")));
        const buttonsStr = labelToHex(fileData.lang, item.lang, item.langWithRegion) + labelToHex(fileData.agree, item.lang, item.langWithRegion) + labelToHex(fileData.disagree, item.lang, item.langWithRegion) + labelToHex(fileData.print, item.lang, item.langWithRegion) + labelToHex(fileData.save, item.lang, item.langWithRegion) + labelToHex(fileData.description, item.lang, item.langWithRegion);
        data = `data 'STR#' (${id}, "${name}") {\n`;
        data += (0, _dmgUtil().serializeString)("0006" + buttonsStr);
        data += `\n};`;

        if (_builderUtil().log.isDebugEnabled) {
          _builderUtil().log.debug({
            lang: item.langName,
            data
          }, `overwriting license buttons`);
        }

        return data;
      } catch (e) {
        _builderUtil().log.debug({
          error: e
        }, "cannot overwrite license buttons");

        return data;
      }
    }

    return data;
  });
  return _getLicenseButtons.apply(this, arguments);
}

function labelToHex(label, lang, langWithRegion) {
  const lbl = hexEncode(label, lang, langWithRegion).toString().toUpperCase();
  const len = numberToHex(lbl.length / 2);
  return len + lbl;
}

function numberToHex(nb) {
  return ("0" + nb.toString(16)).slice(-2);
}

function hexEncode(str, lang, langWithRegion) {
  const macCodePages = getMacCodePage(lang, langWithRegion);
  let result = "";

  for (let i = 0; i < str.length; i++) {
    try {
      let hex = getMacHexCode(str, i, macCodePages);

      if (hex === undefined) {
        hex = "3F"; //?
      }

      result += hex;
    } catch (e) {
      _builderUtil().log.debug({
        error: e,
        char: str[i]
      }, "cannot convert");

      result += "3F"; //?
    }
  }

  return result;
}

function getMacCodePage(lang, langWithRegion) {
  switch (lang) {
    case "ja":
      //japanese
      return ["euc-jp"];
    //Apple Japanese

    case "zh":
      //chinese
      if (langWithRegion === "zh_CN") {
        return ["gb2312"]; //Apple Simplified Chinese (GB 2312)
      }

      return ["big5"];
    //Apple Traditional Chinese (Big5)

    case "ko":
      //korean
      return ["euc-kr"];
    //Apple Korean

    case "ar": //arabic

    case "ur":
      //urdu
      return ["macarabic"];
    //Apple Arabic

    case "he":
      //hebrew
      return ["machebrew"];
    //Apple Hebrew

    case "el": //greek

    case "elc":
      //greek
      return ["macgreek"];
    //Apple Greek

    case "ru": //russian

    case "be": //belarussian

    case "sr": //serbian

    case "bg": //bulgarian

    case "uz":
      //uzbek
      return ["maccyrillic"];
    //Apple Macintosh Cyrillic

    case "ro":
      //romanian
      return ["macromania"];
    //Apple Romanian

    case "uk":
      //ukrainian
      return ["macukraine"];
    //Apple Ukrainian

    case "th":
      //thai
      return ["macthai"];
    //Apple Thai

    case "et": //estonian

    case "lt": //lithuanian

    case "lv": //latvian

    case "pl": //polish

    case "hu": //hungarian

    case "cs": //czech

    case "sk":
      //slovak
      return ["maccenteuro"];
    //Apple Macintosh Central Europe

    case "is": //icelandic

    case "fo":
      //faroese
      return ["maciceland"];
    //Apple Icelandic

    case "tr":
      //turkish
      return ["macturkish"];
    //Apple Turkish

    case "hr": //croatian

    case "sl":
      //slovenian
      return ["maccroatian"];
    //Apple Croatian

    default:
      return ["macroman"];
    //Apple Macintosh Roman
  }
}

function getMacHexCode(str, i, macCodePages) {
  const code = str.charCodeAt(i);

  if (code < 128) {
    return code.toString(16);
  } else if (code < 256) {
    return iconv().encode(str[i], "macroman").toString("hex");
  } else {
    for (let i = 0; i < macCodePages.length; i++) {
      const result = iconv().encode(str[i], macCodePages[i]).toString("hex");

      if (result !== undefined) {
        return result;
      }
    }
  }

  return code;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=licenseButtons.js.map{"version":3,"sources":["../src/licenseButtons.ts"],"names":[],"mappings":"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","sourcesContent":["import { log } from \"builder-util\"\nimport { PlatformPackager } from \"app-builder-lib\"\nimport { getLicenseAssets } from \"app-builder-lib/out/util/license\"\nimport { readFile } from \"fs-extra-p\"\nimport * as iconv from \"iconv-lite\"\nimport { safeLoad } from \"js-yaml\"\nimport { serializeString } from \"./dmgUtil\"\nimport { getDefaultButtons } from \"./licenseDefaultButtons\"\n\nexport async function getLicenseButtonsFile(packager: PlatformPackager<any>): Promise<Array<LicenseButtonsFile>> {\n  return getLicenseAssets((await packager.resourceList)\n    .filter(it => {\n      const name = it.toLowerCase()\n      // noinspection SpellCheckingInspection\n      return name.startsWith(\"licensebuttons_\") && (name.endsWith(\".json\") || name.endsWith(\".yml\"))\n    }), packager)\n}\n\nexport interface LicenseButtonsFile {\n  file: string\n  lang: string\n  langWithRegion: string\n  langName: string\n}\n\nexport async function getLicenseButtons(licenseButtonFiles: Array<LicenseButtonsFile>, langWithRegion: string, id: number, name: string) {\n  let data = getDefaultButtons(langWithRegion, id, name)\n\n  for (const item of licenseButtonFiles) {\n    if (item.langWithRegion !== langWithRegion) {\n      continue\n    }\n\n    try {\n      const fileData = safeLoad(await readFile(item.file, \"utf-8\")) as any\n      const buttonsStr = labelToHex(fileData.lang, item.lang, item.langWithRegion) +\n        labelToHex(fileData.agree, item.lang, item.langWithRegion) +\n        labelToHex(fileData.disagree, item.lang, item.langWithRegion) +\n        labelToHex(fileData.print, item.lang, item.langWithRegion) +\n        labelToHex(fileData.save, item.lang, item.langWithRegion) +\n        labelToHex(fileData.description, item.lang, item.langWithRegion)\n\n      data = `data 'STR#' (${id}, \"${name}\") {\\n`\n      data += serializeString(\"0006\" + buttonsStr)\n      data += `\\n};`\n\n      if (log.isDebugEnabled) {\n        log.debug({lang: item.langName, data}, `overwriting license buttons`)\n      }\n      return data\n    }\n    catch (e) {\n      log.debug({error: e}, \"cannot overwrite license buttons\")\n      return data\n    }\n  }\n\n  return data\n}\n\nfunction labelToHex(label: string, lang: string, langWithRegion: string) {\n  const lbl = hexEncode(label, lang, langWithRegion).toString().toUpperCase()\n  const len = numberToHex((lbl.length / 2))\n  return len + lbl\n}\n\nfunction numberToHex(nb: number) {\n  return (\"0\" + (nb.toString(16))).slice(-2)\n}\n\nfunction hexEncode(str: string, lang: string, langWithRegion: string) {\n  const macCodePages = getMacCodePage(lang, langWithRegion)\n  let result = \"\"\n\n  for (let i = 0; i < str.length; i++) {\n    try {\n      let hex = getMacHexCode(str, i, macCodePages)\n      if (hex === undefined) {\n        hex = \"3F\" //?\n      }\n      result += hex\n    }\n    catch (e) {\n      log.debug({error: e, char: str[i]}, \"cannot convert\")\n      result += \"3F\" //?\n    }\n  }\n\n  return result\n}\n\nfunction getMacCodePage(lang: string, langWithRegion: string) {\n  switch (lang) {\n    case \"ja\": //japanese\n      return [\"euc-jp\"] //Apple Japanese\n    case \"zh\": //chinese\n      if (langWithRegion === \"zh_CN\") {\n        return [\"gb2312\"] //Apple Simplified Chinese (GB 2312)\n      }\n      return [\"big5\"] //Apple Traditional Chinese (Big5)\n    case \"ko\": //korean\n      return [\"euc-kr\"] //Apple Korean\n    case \"ar\": //arabic\n    case \"ur\": //urdu\n      return [\"macarabic\"] //Apple Arabic\n    case \"he\": //hebrew\n      return [\"machebrew\"] //Apple Hebrew\n    case \"el\": //greek\n    case \"elc\": //greek\n      return [\"macgreek\"] //Apple Greek\n    case \"ru\": //russian\n    case \"be\": //belarussian\n    case \"sr\": //serbian\n    case \"bg\": //bulgarian\n    case \"uz\": //uzbek\n      return [\"maccyrillic\"] //Apple Macintosh Cyrillic\n    case \"ro\": //romanian\n      return [\"macromania\"] //Apple Romanian\n    case \"uk\": //ukrainian\n      return [\"macukraine\"] //Apple Ukrainian\n    case \"th\": //thai\n      return [\"macthai\"] //Apple Thai\n    case \"et\": //estonian\n    case \"lt\": //lithuanian\n    case \"lv\": //latvian\n    case \"pl\": //polish\n    case \"hu\": //hungarian\n    case \"cs\": //czech\n    case \"sk\": //slovak\n      return [\"maccenteuro\"] //Apple Macintosh Central Europe\n    case \"is\": //icelandic\n    case \"fo\": //faroese\n      return [\"maciceland\"] //Apple Icelandic\n    case \"tr\": //turkish\n      return [\"macturkish\"] //Apple Turkish\n    case \"hr\": //croatian\n    case \"sl\": //slovenian\n      return [\"maccroatian\"] //Apple Croatian\n    default:\n      return [\"macroman\"] //Apple Macintosh Roman\n  }\n}\n\nfunction getMacHexCode(str: string, i: number, macCodePages: any) {\n  const code = str.charCodeAt(i)\n  if (code < 128) {\n    return code.toString(16)\n  }\n  else if (code < 256) {\n    return iconv.encode(str[i], \"macroman\").toString(\"hex\")\n  }\n  else {\n    for (let i = 0; i < macCodePages.length; i++) {\n      const result = iconv.encode(str[i], macCodePages[i]).toString(\"hex\")\n      if (result !== undefined) {\n        return result\n      }\n    }\n  }\n  return code\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getDefaultButtons = getDefaultButtons;

function getDefaultButtons(langWithRegion, id, name) {
  switch (langWithRegion) {
    case "de_DE":
      return `data 'STR#' (${id}, "${name}") {
  $"0006 0744 6575 7473 6368 0B41 6B7A 6570"
  $"7469 6572 656E 0841 626C 6568 6E65 6E07"
  $"4472 7563 6B65 6E0A 5369 6368 6572 6E2E"
  $"2E2E E74B 6C69 636B 656E 2053 6965 2069"
  $"6E20 D241 6B7A 6570 7469 6572 656E D32C"
  $"2077 656E 6E20 5369 6520 6D69 7420 6465"
  $"6E20 4265 7374 696D 6D75 6E67 656E 2064"
  $"6573 2053 6F66 7477 6172 652D 4C69 7A65"
  $"6E7A 7665 7274 7261 6773 2065 696E 7665"
  $"7273 7461 6E64 656E 2073 696E 642E 2046"
  $"616C 6C73 206E 6963 6874 2C20 6269 7474"
  $"6520 D241 626C 6568 6E65 6ED3 2061 6E6B"
  $"6C69 636B 656E 2E20 5369 6520 6B9A 6E6E"
  $"656E 2064 6965 2053 6F66 7477 6172 6520"
  $"6E75 7220 696E 7374 616C 6C69 6572 656E"
  $"2C20 7765 6E6E 2053 6965 20D2 416B 7A65"
  $"7074 6965 7265 6ED3 2061 6E67 656B 6C69"
  $"636B 7420 6861 6265 6E2E"
};`;

    case "fr_FR":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 0846 7261 6E8D 6169 7308 4163 6365"
	$"7074 6572 0752 6566 7573 6572 0849 6D70"
	$"7269 6D65 720E 456E 7265 6769 7374 7265"
	$"722E 2E2E BA53 6920 766F 7573 2061 6363"
	$"6570 7465 7A20 6C65 7320 7465 726D 6573"
	$"2064 6520 6C61 2070 728E 7365 6E74 6520"
	$"6C69 6365 6E63 652C 2063 6C69 7175 657A"
	$"2073 7572 2022 4163 6365 7074 6572 2220"
	$"6166 696E 2064 2769 6E73 7461 6C6C 6572"
	$"206C 6520 6C6F 6769 6369 656C 2E20 5369"
	$"2076 6F75 7320 6E27 9074 6573 2070 6173"
	$"2064 2761 6363 6F72 6420 6176 6563 206C"
	$"6573 2074 6572 6D65 7320 6465 206C 6120"
	$"6C69 6365 6E63 652C 2063 6C69 7175 657A"
	$"2073 7572 2022 5265 6675 7365 7222 2E"
};`;

    case "fr_CA":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 1146 7261 6E8D 6169 7320 6361 6E61"
	$"6469 656E 0841 6363 6570 7465 7207 5265"
	$"6675 7365 7208 496D 7072 696D 6572 0E45"
	$"6E72 6567 6973 7472 6572 2E2E 2EBA 5369"
	$"2076 6F75 7320 6163 6365 7074 657A 206C"
	$"6573 2074 6572 6D65 7320 6465 206C 6120"
	$"7072 8E73 656E 7465 206C 6963 656E 6365"
	$"2C20 636C 6971 7565 7A20 7375 7220 2241"
	$"6363 6570 7465 7222 2061 6669 6E20 6427"
	$"696E 7374 616C 6C65 7220 6C65 206C 6F67"
	$"6963 6965 6C2E 2053 6920 766F 7573 206E"
	$"2790 7465 7320 7061 7320 6427 6163 636F"
	$"7264 2061 7665 6320 6C65 7320 7465 726D"
	$"6573 2064 6520 6C61 206C 6963 656E 6365"
	$"2C20 636C 6971 7565 7A20 7375 7220 2252"
	$"6566 7573 6572 222E"
};`;

    case "es_ES":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 0745 7370 6196 6F6C 0741 6365 7074"
	$"6172 0A4E 6F20 6163 6570 7461 7208 496D"
	$"7072 696D 6972 0A47 7561 7264 6172 2E2E"
	$"2EC0 5369 2065 7374 8720 6465 2061 6375"
	$"6572 646F 2063 6F6E 206C 6F73 2074 8E72"
	$"6D69 6E6F 7320 6465 2065 7374 6120 6C69"
	$"6365 6E63 6961 2C20 7075 6C73 6520 2241"
	$"6365 7074 6172 2220 7061 7261 2069 6E73"
	$"7461 6C61 7220 656C 2073 6F66 7477 6172"
	$"652E 2045 6E20 656C 2073 7570 7565 7374"
	$"6F20 6465 2071 7565 206E 6F20 6573 748E"
	$"2064 6520 6163 7565 7264 6F20 636F 6E20"
	$"6C6F 7320 748E 726D 696E 6F73 2064 6520"
	$"6573 7461 206C 6963 656E 6369 612C 2070"
	$"756C 7365 2022 4E6F 2061 6365 7074 6172"
	$"2E22"
};`;

    case "it_IT":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 0849 7461 6C69 616E 6F07 4163 6365"
	$"7474 6F07 5269 6669 7574 6F06 5374 616D"
	$"7061 0B52 6567 6973 7472 612E 2E2E 7F53"
	$"6520 6163 6365 7474 6920 6C65 2063 6F6E"
	$"6469 7A69 6F6E 6920 6469 2071 7565 7374"
	$"6120 6C69 6365 6E7A 612C 2066 6169 2063"
	$"6C69 6320 7375 2022 4163 6365 7474 6F22"
	$"2070 6572 2069 6E73 7461 6C6C 6172 6520"
	$"696C 2073 6F66 7477 6172 652E 2041 6C74"
	$"7269 6D65 6E74 6920 6661 6920 636C 6963"
	$"2073 7520 2252 6966 6975 746F 222E"
};`;

    case "ja_JP":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 084A 6170 616E 6573 650A 93AF 88D3"
	$"82B5 82DC 82B7 0C93 AF88 D382 B582 DC82"
	$"B982 F108 88F3 8DFC 82B7 82E9 0795 DB91"
	$"B62E 2E2E B496 7B83 5C83 7483 6783 4583"
	$"4783 418E 6797 708B 9691 F88C 5F96 F182"
	$"CC8F F08C 8F82 C993 AF88 D382 B382 EA82"
	$"E98F EA8D 8782 C982 CD81 4183 5C83 7483"
	$"6783 4583 4783 4182 F083 4383 9383 5883"
	$"6781 5B83 8B82 B782 E982 BD82 DF82 C981"
	$"7593 AF88 D382 B582 DC82 B781 7682 F089"
	$"9F82 B582 C482 AD82 BE82 B382 A281 4281"
	$"4093 AF88 D382 B382 EA82 C882 A28F EA8D"
	$"8782 C982 CD81 4181 7593 AF88 D382 B582"
	$"DC82 B982 F181 7682 F089 9F82 B582 C482"
	$"AD82 BE82 B382 A281 42"
};`;

    case "nl_NL":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 0A4E 6564 6572 6C61 6E64 7302 4A61"
	$"034E 6565 0550 7269 6E74 0942 6577 6161"
	$"722E 2E2E A449 6E64 6965 6E20 7520 616B"
	$"6B6F 6F72 6420 6761 6174 206D 6574 2064"
	$"6520 766F 6F72 7761 6172 6465 6E20 7661"
	$"6E20 6465 7A65 206C 6963 656E 7469 652C"
	$"206B 756E 7420 7520 6F70 2027 4A61 2720"
	$"6B6C 696B 6B65 6E20 6F6D 2064 6520 7072"
	$"6F67 7261 6D6D 6174 7575 7220 7465 2069"
	$"6E73 7461 6C6C 6572 656E 2E20 496E 6469"
	$"656E 2075 206E 6965 7420 616B 6B6F 6F72"
	$"6420 6761 6174 2C20 6B6C 696B 7420 7520"
	$"6F70 2027 4E65 6527 2E"
};`;

    case "sv_SE":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 0653 7665 6E73 6B08 476F 646B 8A6E"
	$"6E73 0641 7662 9A6A 7308 536B 7269 7620"
	$"7574 0853 7061 7261 2E2E 2E93 4F6D 2044"
	$"7520 676F 646B 8A6E 6E65 7220 6C69 6365"
	$"6E73 7669 6C6C 6B6F 7265 6E20 6B6C 6963"
	$"6B61 2070 8C20 2247 6F64 6B8A 6E6E 7322"
	$"2066 9A72 2061 7474 2069 6E73 7461 6C6C"
	$"6572 6120 7072 6F67 7261 6D70 726F 6475"
	$"6B74 656E 2E20 4F6D 2044 7520 696E 7465"
	$"2067 6F64 6B8A 6E6E 6572 206C 6963 656E"
	$"7376 696C 6C6B 6F72 656E 2C20 6B6C 6963"
	$"6B61 2070 8C20 2241 7662 9A6A 7322 2E"
};`;

    case "br_FR":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 1150 6F72 7475 6775 9073 2C20 4272"
	$"6173 696C 0943 6F6E 636F 7264 6172 0944"
	$"6973 636F 7264 6172 0849 6D70 7269 6D69"
	$"7209 5361 6C76 6172 2E2E 2E8C 5365 2065"
	$"7374 8720 6465 2061 636F 7264 6F20 636F"
	$"6D20 6F73 2074 6572 6D6F 7320 6465 7374"
	$"6120 6C69 6365 6E8D 612C 2070 7265 7373"
	$"696F 6E65 2022 436F 6E63 6F72 6461 7222"
	$"2070 6172 6120 696E 7374 616C 6172 206F"
	$"2073 6F66 7477 6172 652E 2053 6520 6E8B"
	$"6F20 6573 7487 2064 6520 6163 6F72 646F"
	$"2C20 7072 6573 7369 6F6E 6520 2244 6973"
	$"636F 7264 6172 222E"
};`;

    case "zh_TW":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 1354 7261 6469 7469 6F6E 616C 2043"
	$"6869 6E65 7365 04A6 50B7 4E06 A4A3 A650"
	$"B74E 04A6 43A6 4C06 C078 A673 A14B 50A6"
	$"70AA 47B1 7AA6 50B7 4EA5 BBB3 5CA5 69C3"
	$"D2B8 CCAA BAB1 F8B4 DAA1 41BD D0AB F6A1"
	$"A7A6 50B7 4EA1 A8A5 48A6 77B8 CBB3 6EC5"
	$"E9A1 43A6 70AA 47A4 A3A6 50B7 4EA1 41BD"
	$"D0AB F6A1 A7A4 A3A6 50B7 4EA1 A8A1 43"
};`;

    case "zh_CN":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 1253 696D 706C 6966 6965 6420 4368"
	$"696E 6573 6504 CDAC D2E2 06B2 BBCD ACD2"
	$"E204 B4F2 D3A1 06B4 E6B4 A2A1 AD54 C8E7"
	$"B9FB C4FA CDAC D2E2 B1BE D0ED BFC9 D0AD"
	$"D2E9 B5C4 CCF5 BFEE A3AC C7EB B0B4 A1B0"
	$"CDAC D2E2 A1B1 C0B4 B0B2 D7B0 B4CB C8ED"
	$"BCFE A1A3 C8E7 B9FB C4FA B2BB CDAC D2E2"
	$"A3AC C7EB B0B4 A1B0 B2BB CDAC D2E2 A1B1"
	$"A1A3"
};`;

    case "da_DK":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 0544 616E 736B 0445 6E69 6705 5565"
	$"6E69 6707 5564 736B 7269 760A 4172 6B69"
	$"7665 722E 2E2E 9848 7669 7320 6475 2061"
	$"6363 6570 7465 7265 7220 6265 7469 6E67"
	$"656C 7365 726E 6520 6920 6C69 6365 6E73"
	$"6166 7461 6C65 6E2C 2073 6B61 6C20 6475"
	$"206B 6C69 6B6B 6520 708C 20D2 456E 6967"
	$"D320 666F 7220 6174 2069 6E73 7461 6C6C"
	$"6572 6520 736F 6674 7761 7265 6E2E 204B"
	$"6C69 6B20 708C 20D2 5565 6E69 67D3 2066"
	$"6F72 2061 7420 616E 6E75 6C6C 6572 6520"
	$"696E 7374 616C 6C65 7269 6E67 656E 2E"
};`;

    case "fi_FI":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 0553 756F 6D69 0848 7976 8A6B 7379"
	$"6E0A 456E 2068 7976 8A6B 7379 0754 756C"
	$"6F73 7461 0954 616C 6C65 6E6E 61C9 6F48"
	$"7976 8A6B 7379 206C 6973 656E 7373 6973"
	$"6F70 696D 756B 7365 6E20 6568 646F 7420"
	$"6F73 6F69 7474 616D 616C 6C61 20D5 4879"
	$"768A 6B73 79D5 2E20 4A6F 7320 6574 2068"
	$"7976 8A6B 7379 2073 6F70 696D 756B 7365"
	$"6E20 6568 746F 6A61 2C20 6F73 6F69 7461"
	$"20D5 456E 2068 7976 8A6B 7379 D52E"
};`;

    case "ko_KR":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 064B 6F72 6561 6E04 B5BF C0C7 09B5"
	$"BFC0 C720 BEC8 C7D4 06C7 C1B8 B0C6 AE07"
	$"C0FA C0E5 2E2E 2E7E BBE7 BFEB 20B0 E8BE"
	$"E0BC ADC0 C720 B3BB BFEB BFA1 20B5 BFC0"
	$"C7C7 CFB8 E92C 2022 B5BF C0C7 2220 B4DC"
	$"C3DF B8A6 20B4 ADB7 AF20 BCD2 C7C1 C6AE"
	$"BFFE BEEE B8A6 20BC B3C4 A1C7 CFBD CABD"
	$"C3BF C02E 20B5 BFC0 C7C7 CFC1 F620 BECA"
	$"B4C2 B4D9 B8E9 2C20 22B5 BFC0 C720 BEC8"
	$"C7D4 2220 B4DC C3DF B8A6 20B4 A9B8 A3BD"
	$"CABD C3BF C02E"
};`;

    case "nb_NO":
      return `data 'STR#' (${id}, "${name}") {
	$"0006 054E 6F72 736B 0445 6E69 6709 496B"
	$"6B65 2065 6E69 6708 536B 7269 7620 7574"
	$"0A41 726B 6976 6572 2E2E 2EA3 4876 6973"
	$"2044 6520 6572 2065 6E69 6720 6920 6265"
	$"7374 656D 6D65 6C73 656E 6520 6920 6465"
	$"6E6E 6520 6C69 7365 6E73 6176 7461 6C65"
	$"6E2C 206B 6C69 6B6B 6572 2044 6520 708C"
	$"2022 456E 6967 222D 6B6E 6170 7065 6E20"
	$"666F 7220 8C20 696E 7374 616C 6C65 7265"
	$"2070 726F 6772 616D 7661 7265 6E2E 2048"
	$"7669 7320 4465 2069 6B6B 6520 6572 2065"
	$"6E69 672C 206B 6C69 6B6B 6572 2044 6520"
	$"708C 2022 496B 6B65 2065 6E69 6722 2E"
};`;

    default:
      // en_US
      return `data 'STR#' (${id}, "${name}") {
	$"0006 0745 6E67 6C69 7368 0541 6772 6565"
	$"0844 6973 6167 7265 6505 5072 696E 7407"
	$"5361 7665 2E2E 2E7A 4966 2079 6F75 2061"
	$"6772 6565 2077 6974 6820 7468 6520 7465"
	$"726D 7320 6F66 2074 6869 7320 6C69 6365"
	$"6E73 652C 2070 7265 7373 20D2 4167 7265"
	$"65D3 2074 6F20 696E 7374 616C 6C20 7468"
	$"6520 736F 6674 7761 7265 2E20 4966 2079"
	$"6F75 2064 6F20 6E6F 7420 6167 7265 652C"
	$"2070 7265 7373 20D2 4469 7361 6772 6565"
	$"D32E"
};`;
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=licenseDefaultButtons.js.map{"version":3,"sources":["../src/licenseDefaultButtons.ts"],"names":[],"mappings":";;;;;;;AAAM,SAAU,iBAAV,CAA4B,cAA5B,EAAoD,EAApD,EAAgE,IAAhE,EAA4E;AAChF,UAAQ,cAAR;AACE,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;;;;;;;;;GAAnC;;AAqBF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;;;;;;GAAnC;;AAkBF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;;;;;;;GAAnC;;AAmBF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;;;;;;;GAAnC;;AAmBF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;;GAAnC;;AAcF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;;;;;;GAAnC;;AAkBF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;;;;GAAnC;;AAgBF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;;;GAAnC;;AAeF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;;;;GAAnC;;AAgBF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;GAAnC;;AAWF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;GAAnC;;AAYF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;;;GAAnC;;AAeF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;GAAnC;;AAaF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;;GAAnC;;AAcF,SAAK,OAAL;AACE,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;;;;GAAnC;;AAgBF;AACE;AACA,aAAO,gBAAgB,EAAE,MAAM,IAAI;;;;;;;;;;;;GAAnC;AA/PJ;AA6QD,C","sourcesContent":["export function getDefaultButtons(langWithRegion: string, id: number, name: string) {\n  switch (langWithRegion) {\n    case \"de_DE\":\n      return `data 'STR#' (${id}, \"${name}\") {\n  $\"0006 0744 6575 7473 6368 0B41 6B7A 6570\"\n  $\"7469 6572 656E 0841 626C 6568 6E65 6E07\"\n  $\"4472 7563 6B65 6E0A 5369 6368 6572 6E2E\"\n  $\"2E2E E74B 6C69 636B 656E 2053 6965 2069\"\n  $\"6E20 D241 6B7A 6570 7469 6572 656E D32C\"\n  $\"2077 656E 6E20 5369 6520 6D69 7420 6465\"\n  $\"6E20 4265 7374 696D 6D75 6E67 656E 2064\"\n  $\"6573 2053 6F66 7477 6172 652D 4C69 7A65\"\n  $\"6E7A 7665 7274 7261 6773 2065 696E 7665\"\n  $\"7273 7461 6E64 656E 2073 696E 642E 2046\"\n  $\"616C 6C73 206E 6963 6874 2C20 6269 7474\"\n  $\"6520 D241 626C 6568 6E65 6ED3 2061 6E6B\"\n  $\"6C69 636B 656E 2E20 5369 6520 6B9A 6E6E\"\n  $\"656E 2064 6965 2053 6F66 7477 6172 6520\"\n  $\"6E75 7220 696E 7374 616C 6C69 6572 656E\"\n  $\"2C20 7765 6E6E 2053 6965 20D2 416B 7A65\"\n  $\"7074 6965 7265 6ED3 2061 6E67 656B 6C69\"\n  $\"636B 7420 6861 6265 6E2E\"\n};`\n\n    case \"fr_FR\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 0846 7261 6E8D 6169 7308 4163 6365\"\n\t$\"7074 6572 0752 6566 7573 6572 0849 6D70\"\n\t$\"7269 6D65 720E 456E 7265 6769 7374 7265\"\n\t$\"722E 2E2E BA53 6920 766F 7573 2061 6363\"\n\t$\"6570 7465 7A20 6C65 7320 7465 726D 6573\"\n\t$\"2064 6520 6C61 2070 728E 7365 6E74 6520\"\n\t$\"6C69 6365 6E63 652C 2063 6C69 7175 657A\"\n\t$\"2073 7572 2022 4163 6365 7074 6572 2220\"\n\t$\"6166 696E 2064 2769 6E73 7461 6C6C 6572\"\n\t$\"206C 6520 6C6F 6769 6369 656C 2E20 5369\"\n\t$\"2076 6F75 7320 6E27 9074 6573 2070 6173\"\n\t$\"2064 2761 6363 6F72 6420 6176 6563 206C\"\n\t$\"6573 2074 6572 6D65 7320 6465 206C 6120\"\n\t$\"6C69 6365 6E63 652C 2063 6C69 7175 657A\"\n\t$\"2073 7572 2022 5265 6675 7365 7222 2E\"\n};`\n\n    case \"fr_CA\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 1146 7261 6E8D 6169 7320 6361 6E61\"\n\t$\"6469 656E 0841 6363 6570 7465 7207 5265\"\n\t$\"6675 7365 7208 496D 7072 696D 6572 0E45\"\n\t$\"6E72 6567 6973 7472 6572 2E2E 2EBA 5369\"\n\t$\"2076 6F75 7320 6163 6365 7074 657A 206C\"\n\t$\"6573 2074 6572 6D65 7320 6465 206C 6120\"\n\t$\"7072 8E73 656E 7465 206C 6963 656E 6365\"\n\t$\"2C20 636C 6971 7565 7A20 7375 7220 2241\"\n\t$\"6363 6570 7465 7222 2061 6669 6E20 6427\"\n\t$\"696E 7374 616C 6C65 7220 6C65 206C 6F67\"\n\t$\"6963 6965 6C2E 2053 6920 766F 7573 206E\"\n\t$\"2790 7465 7320 7061 7320 6427 6163 636F\"\n\t$\"7264 2061 7665 6320 6C65 7320 7465 726D\"\n\t$\"6573 2064 6520 6C61 206C 6963 656E 6365\"\n\t$\"2C20 636C 6971 7565 7A20 7375 7220 2252\"\n\t$\"6566 7573 6572 222E\"\n};`\n\n    case \"es_ES\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 0745 7370 6196 6F6C 0741 6365 7074\"\n\t$\"6172 0A4E 6F20 6163 6570 7461 7208 496D\"\n\t$\"7072 696D 6972 0A47 7561 7264 6172 2E2E\"\n\t$\"2EC0 5369 2065 7374 8720 6465 2061 6375\"\n\t$\"6572 646F 2063 6F6E 206C 6F73 2074 8E72\"\n\t$\"6D69 6E6F 7320 6465 2065 7374 6120 6C69\"\n\t$\"6365 6E63 6961 2C20 7075 6C73 6520 2241\"\n\t$\"6365 7074 6172 2220 7061 7261 2069 6E73\"\n\t$\"7461 6C61 7220 656C 2073 6F66 7477 6172\"\n\t$\"652E 2045 6E20 656C 2073 7570 7565 7374\"\n\t$\"6F20 6465 2071 7565 206E 6F20 6573 748E\"\n\t$\"2064 6520 6163 7565 7264 6F20 636F 6E20\"\n\t$\"6C6F 7320 748E 726D 696E 6F73 2064 6520\"\n\t$\"6573 7461 206C 6963 656E 6369 612C 2070\"\n\t$\"756C 7365 2022 4E6F 2061 6365 7074 6172\"\n\t$\"2E22\"\n};`\n\n    case \"it_IT\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 0849 7461 6C69 616E 6F07 4163 6365\"\n\t$\"7474 6F07 5269 6669 7574 6F06 5374 616D\"\n\t$\"7061 0B52 6567 6973 7472 612E 2E2E 7F53\"\n\t$\"6520 6163 6365 7474 6920 6C65 2063 6F6E\"\n\t$\"6469 7A69 6F6E 6920 6469 2071 7565 7374\"\n\t$\"6120 6C69 6365 6E7A 612C 2066 6169 2063\"\n\t$\"6C69 6320 7375 2022 4163 6365 7474 6F22\"\n\t$\"2070 6572 2069 6E73 7461 6C6C 6172 6520\"\n\t$\"696C 2073 6F66 7477 6172 652E 2041 6C74\"\n\t$\"7269 6D65 6E74 6920 6661 6920 636C 6963\"\n\t$\"2073 7520 2252 6966 6975 746F 222E\"\n};`\n\n    case \"ja_JP\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 084A 6170 616E 6573 650A 93AF 88D3\"\n\t$\"82B5 82DC 82B7 0C93 AF88 D382 B582 DC82\"\n\t$\"B982 F108 88F3 8DFC 82B7 82E9 0795 DB91\"\n\t$\"B62E 2E2E B496 7B83 5C83 7483 6783 4583\"\n\t$\"4783 418E 6797 708B 9691 F88C 5F96 F182\"\n\t$\"CC8F F08C 8F82 C993 AF88 D382 B382 EA82\"\n\t$\"E98F EA8D 8782 C982 CD81 4183 5C83 7483\"\n\t$\"6783 4583 4783 4182 F083 4383 9383 5883\"\n\t$\"6781 5B83 8B82 B782 E982 BD82 DF82 C981\"\n\t$\"7593 AF88 D382 B582 DC82 B781 7682 F089\"\n\t$\"9F82 B582 C482 AD82 BE82 B382 A281 4281\"\n\t$\"4093 AF88 D382 B382 EA82 C882 A28F EA8D\"\n\t$\"8782 C982 CD81 4181 7593 AF88 D382 B582\"\n\t$\"DC82 B982 F181 7682 F089 9F82 B582 C482\"\n\t$\"AD82 BE82 B382 A281 42\"\n};`\n\n    case \"nl_NL\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 0A4E 6564 6572 6C61 6E64 7302 4A61\"\n\t$\"034E 6565 0550 7269 6E74 0942 6577 6161\"\n\t$\"722E 2E2E A449 6E64 6965 6E20 7520 616B\"\n\t$\"6B6F 6F72 6420 6761 6174 206D 6574 2064\"\n\t$\"6520 766F 6F72 7761 6172 6465 6E20 7661\"\n\t$\"6E20 6465 7A65 206C 6963 656E 7469 652C\"\n\t$\"206B 756E 7420 7520 6F70 2027 4A61 2720\"\n\t$\"6B6C 696B 6B65 6E20 6F6D 2064 6520 7072\"\n\t$\"6F67 7261 6D6D 6174 7575 7220 7465 2069\"\n\t$\"6E73 7461 6C6C 6572 656E 2E20 496E 6469\"\n\t$\"656E 2075 206E 6965 7420 616B 6B6F 6F72\"\n\t$\"6420 6761 6174 2C20 6B6C 696B 7420 7520\"\n\t$\"6F70 2027 4E65 6527 2E\"\n};`\n\n    case \"sv_SE\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 0653 7665 6E73 6B08 476F 646B 8A6E\"\n\t$\"6E73 0641 7662 9A6A 7308 536B 7269 7620\"\n\t$\"7574 0853 7061 7261 2E2E 2E93 4F6D 2044\"\n\t$\"7520 676F 646B 8A6E 6E65 7220 6C69 6365\"\n\t$\"6E73 7669 6C6C 6B6F 7265 6E20 6B6C 6963\"\n\t$\"6B61 2070 8C20 2247 6F64 6B8A 6E6E 7322\"\n\t$\"2066 9A72 2061 7474 2069 6E73 7461 6C6C\"\n\t$\"6572 6120 7072 6F67 7261 6D70 726F 6475\"\n\t$\"6B74 656E 2E20 4F6D 2044 7520 696E 7465\"\n\t$\"2067 6F64 6B8A 6E6E 6572 206C 6963 656E\"\n\t$\"7376 696C 6C6B 6F72 656E 2C20 6B6C 6963\"\n\t$\"6B61 2070 8C20 2241 7662 9A6A 7322 2E\"\n};`\n\n    case \"br_FR\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 1150 6F72 7475 6775 9073 2C20 4272\"\n\t$\"6173 696C 0943 6F6E 636F 7264 6172 0944\"\n\t$\"6973 636F 7264 6172 0849 6D70 7269 6D69\"\n\t$\"7209 5361 6C76 6172 2E2E 2E8C 5365 2065\"\n\t$\"7374 8720 6465 2061 636F 7264 6F20 636F\"\n\t$\"6D20 6F73 2074 6572 6D6F 7320 6465 7374\"\n\t$\"6120 6C69 6365 6E8D 612C 2070 7265 7373\"\n\t$\"696F 6E65 2022 436F 6E63 6F72 6461 7222\"\n\t$\"2070 6172 6120 696E 7374 616C 6172 206F\"\n\t$\"2073 6F66 7477 6172 652E 2053 6520 6E8B\"\n\t$\"6F20 6573 7487 2064 6520 6163 6F72 646F\"\n\t$\"2C20 7072 6573 7369 6F6E 6520 2244 6973\"\n\t$\"636F 7264 6172 222E\"\n};`\n\n    case \"zh_TW\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 1354 7261 6469 7469 6F6E 616C 2043\"\n\t$\"6869 6E65 7365 04A6 50B7 4E06 A4A3 A650\"\n\t$\"B74E 04A6 43A6 4C06 C078 A673 A14B 50A6\"\n\t$\"70AA 47B1 7AA6 50B7 4EA5 BBB3 5CA5 69C3\"\n\t$\"D2B8 CCAA BAB1 F8B4 DAA1 41BD D0AB F6A1\"\n\t$\"A7A6 50B7 4EA1 A8A5 48A6 77B8 CBB3 6EC5\"\n\t$\"E9A1 43A6 70AA 47A4 A3A6 50B7 4EA1 41BD\"\n\t$\"D0AB F6A1 A7A4 A3A6 50B7 4EA1 A8A1 43\"\n};`\n\n    case \"zh_CN\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 1253 696D 706C 6966 6965 6420 4368\"\n\t$\"696E 6573 6504 CDAC D2E2 06B2 BBCD ACD2\"\n\t$\"E204 B4F2 D3A1 06B4 E6B4 A2A1 AD54 C8E7\"\n\t$\"B9FB C4FA CDAC D2E2 B1BE D0ED BFC9 D0AD\"\n\t$\"D2E9 B5C4 CCF5 BFEE A3AC C7EB B0B4 A1B0\"\n\t$\"CDAC D2E2 A1B1 C0B4 B0B2 D7B0 B4CB C8ED\"\n\t$\"BCFE A1A3 C8E7 B9FB C4FA B2BB CDAC D2E2\"\n\t$\"A3AC C7EB B0B4 A1B0 B2BB CDAC D2E2 A1B1\"\n\t$\"A1A3\"\n};`\n\n    case \"da_DK\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 0544 616E 736B 0445 6E69 6705 5565\"\n\t$\"6E69 6707 5564 736B 7269 760A 4172 6B69\"\n\t$\"7665 722E 2E2E 9848 7669 7320 6475 2061\"\n\t$\"6363 6570 7465 7265 7220 6265 7469 6E67\"\n\t$\"656C 7365 726E 6520 6920 6C69 6365 6E73\"\n\t$\"6166 7461 6C65 6E2C 2073 6B61 6C20 6475\"\n\t$\"206B 6C69 6B6B 6520 708C 20D2 456E 6967\"\n\t$\"D320 666F 7220 6174 2069 6E73 7461 6C6C\"\n\t$\"6572 6520 736F 6674 7761 7265 6E2E 204B\"\n\t$\"6C69 6B20 708C 20D2 5565 6E69 67D3 2066\"\n\t$\"6F72 2061 7420 616E 6E75 6C6C 6572 6520\"\n\t$\"696E 7374 616C 6C65 7269 6E67 656E 2E\"\n};`\n\n    case \"fi_FI\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 0553 756F 6D69 0848 7976 8A6B 7379\"\n\t$\"6E0A 456E 2068 7976 8A6B 7379 0754 756C\"\n\t$\"6F73 7461 0954 616C 6C65 6E6E 61C9 6F48\"\n\t$\"7976 8A6B 7379 206C 6973 656E 7373 6973\"\n\t$\"6F70 696D 756B 7365 6E20 6568 646F 7420\"\n\t$\"6F73 6F69 7474 616D 616C 6C61 20D5 4879\"\n\t$\"768A 6B73 79D5 2E20 4A6F 7320 6574 2068\"\n\t$\"7976 8A6B 7379 2073 6F70 696D 756B 7365\"\n\t$\"6E20 6568 746F 6A61 2C20 6F73 6F69 7461\"\n\t$\"20D5 456E 2068 7976 8A6B 7379 D52E\"\n};`\n\n    case \"ko_KR\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 064B 6F72 6561 6E04 B5BF C0C7 09B5\"\n\t$\"BFC0 C720 BEC8 C7D4 06C7 C1B8 B0C6 AE07\"\n\t$\"C0FA C0E5 2E2E 2E7E BBE7 BFEB 20B0 E8BE\"\n\t$\"E0BC ADC0 C720 B3BB BFEB BFA1 20B5 BFC0\"\n\t$\"C7C7 CFB8 E92C 2022 B5BF C0C7 2220 B4DC\"\n\t$\"C3DF B8A6 20B4 ADB7 AF20 BCD2 C7C1 C6AE\"\n\t$\"BFFE BEEE B8A6 20BC B3C4 A1C7 CFBD CABD\"\n\t$\"C3BF C02E 20B5 BFC0 C7C7 CFC1 F620 BECA\"\n\t$\"B4C2 B4D9 B8E9 2C20 22B5 BFC0 C720 BEC8\"\n\t$\"C7D4 2220 B4DC C3DF B8A6 20B4 A9B8 A3BD\"\n\t$\"CABD C3BF C02E\"\n};`\n\n    case \"nb_NO\":\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 054E 6F72 736B 0445 6E69 6709 496B\"\n\t$\"6B65 2065 6E69 6708 536B 7269 7620 7574\"\n\t$\"0A41 726B 6976 6572 2E2E 2EA3 4876 6973\"\n\t$\"2044 6520 6572 2065 6E69 6720 6920 6265\"\n\t$\"7374 656D 6D65 6C73 656E 6520 6920 6465\"\n\t$\"6E6E 6520 6C69 7365 6E73 6176 7461 6C65\"\n\t$\"6E2C 206B 6C69 6B6B 6572 2044 6520 708C\"\n\t$\"2022 456E 6967 222D 6B6E 6170 7065 6E20\"\n\t$\"666F 7220 8C20 696E 7374 616C 6C65 7265\"\n\t$\"2070 726F 6772 616D 7661 7265 6E2E 2048\"\n\t$\"7669 7320 4465 2069 6B6B 6520 6572 2065\"\n\t$\"6E69 672C 206B 6C69 6B6B 6572 2044 6520\"\n\t$\"708C 2022 496B 6B65 2065 6E69 6722 2E\"\n};`\n\n    default:\n      // en_US\n      return `data 'STR#' (${id}, \"${name}\") {\n\t$\"0006 0745 6E67 6C69 7368 0541 6772 6565\"\n\t$\"0844 6973 6167 7265 6505 5072 696E 7407\"\n\t$\"5361 7665 2E2E 2E7A 4966 2079 6F75 2061\"\n\t$\"6772 6565 2077 6974 6820 7468 6520 7465\"\n\t$\"726D 7320 6F66 2074 6869 7320 6C69 6365\"\n\t$\"6E73 652C 2070 7265 7373 20D2 4167 7265\"\n\t$\"65D3 2074 6F20 696E 7374 616C 6C20 7468\"\n\t$\"6520 736F 6674 7761 7265 2E20 4966 2079\"\n\t$\"6F75 2064 6F20 6E6F 7420 6167 7265 652C\"\n\t$\"2070 7265 7373 20D2 4469 7361 6772 6565\"\n\t$\"D32E\"\n};`\n  }\n}"],"sourceRoot":""}
'use strict';
var isObj = require('is-obj');

module.exports.get = function (obj, path) {
	if (!isObj(obj) || typeof path !== 'string') {
		return obj;
	}

	var pathArr = getPathSegments(path);

	for (var i = 0; i < pathArr.length; i++) {
		var descriptor = Object.getOwnPropertyDescriptor(obj, pathArr[i]) || Object.getOwnPropertyDescriptor(Object.prototype, pathArr[i]);
		if (descriptor && !descriptor.enumerable) {
			return;
		}

		obj = obj[pathArr[i]];

		if (obj === undefined || obj === null) {
			// `obj` is either `undefined` or `null` so we want to stop the loop, and
			// if this is not the last bit of the path, and
			// if it did't return `undefined`
			// it would return `null` if `obj` is `null`
			// but we want `get({foo: null}, 'foo.bar')` to equal `undefined` not `null`
			if (i !== pathArr.length - 1) {
				return undefined;
			}

			break;
		}
	}

	return obj;
};

module.exports.set = function (obj, path, value) {
	if (!isObj(obj) || typeof path !== 'string') {
		return;
	}

	var pathArr = getPathSegments(path);

	for (var i = 0; i < pathArr.length; i++) {
		var p = pathArr[i];

		if (!isObj(obj[p])) {
			obj[p] = {};
		}

		if (i === pathArr.length - 1) {
			obj[p] = value;
		}

		obj = obj[p];
	}
};

module.exports.delete = function (obj, path) {
	if (!isObj(obj) || typeof path !== 'string') {
		return;
	}

	var pathArr = getPathSegments(path);

	for (var i = 0; i < pathArr.length; i++) {
		var p = pathArr[i];

		if (i === pathArr.length - 1) {
			delete obj[p];
			return;
		}

		obj = obj[p];
	}
};

module.exports.has = function (obj, path) {
	if (!isObj(obj) || typeof path !== 'string') {
		return false;
	}

	var pathArr = getPathSegments(path);

	for (var i = 0; i < pathArr.length; i++) {
		obj = obj[pathArr[i]];

		if (obj === undefined) {
			return false;
		}
	}

	return true;
};

function getPathSegments(path) {
	var pathArr = path.split('.');
	var parts = [];

	for (var i = 0; i < pathArr.length; i++) {
		var p = pathArr[i];

		while (p[p.length - 1] === '\\' && pathArr[i + 1] !== undefined) {
			p = p.slice(0, -1) + '.';
			p += pathArr[++i];
		}

		parts.push(p);
	}

	return parts;
}
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "is-obj": "^1.0.0"
  },
  "deprecated": false,
  "description": "Get, set, or delete a property from a nested object using a dot path",
  "devDependencies": {
    "ava": "*",
    "matcha": "^0.7.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/dot-prop#readme",
  "license": "MIT",
  "name": "dot-prop",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/dot-prop.git"
  },
  "version": "3.0.0"
}Copyright (c) 2015, Scott Motte
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/* @flow */

(function () {
  require('./lib/main').config(
    Object.assign(
      {},
      require('./lib/env-options'),
      require('./lib/cli-options')(process.argv)
    )
  )
})()
{
  "dependencies": {},
  "deprecated": false,
  "description": "Loads environment variables from .env file",
  "devDependencies": {
    "decache": "^4.5.0",
    "flow-bin": "^0.84.0",
    "sinon": "^6.3.5",
    "standard": "^12.0.1",
    "standard-markdown": "^5.0.1",
    "tap": "^12.0.1"
  },
  "engines": {
    "node": ">=6"
  },
  "homepage": "https://github.com/motdotla/dotenv#readme",
  "license": "BSD-2-Clause",
  "main": "lib/main.js",
  "name": "dotenv",
  "repository": {
    "type": "git",
    "url": "git://github.com/motdotla/dotenv.git"
  },
  "standard": {
    "ignore": [
      "flow-typed/"
    ]
  },
  "version": "6.2.0"
}/* @flow */

const re = /^dotenv_config_(encoding|path|debug)=(.+)$/

module.exports = function optionMatcher (args /*: Array<string> */) {
  return args.reduce(function (acc, cur) {
    const matches = cur.match(re)
    if (matches) {
      acc[matches[1]] = matches[2]
    }
    return acc
  }, {})
}
/* @flow */

// ../config.js accepts options via environment variables
const options = {}

if (process.env.DOTENV_CONFIG_ENCODING) {
  options.encoding = process.env.DOTENV_CONFIG_ENCODING
}

if (process.env.DOTENV_CONFIG_PATH) {
  options.path = process.env.DOTENV_CONFIG_PATH
}

if (process.env.DOTENV_CONFIG_DEBUG) {
  options.debug = process.env.DOTENV_CONFIG_DEBUG
}

module.exports = options
/* @flow */
/*::

type DotenvParseOptions = {
  debug?: boolean
}

// keys and values from src
type DotenvParseOutput = { [string]: string }

type DotenvConfigOptions = {
  path?: string, // path to .env file
  encoding?: string, // encoding of .env file
  debug?: string // turn on logging for debugging purposes
}

type DotenvConfigOutput = {
  parsed?: DotenvParseOutput,
  error?: Error
}

*/

const fs = require('fs')
const path = require('path')

function log (message /*: string */) {
  console.log(`[dotenv][DEBUG] ${message}`)
}

// Parses src into an Object
function parse (src /*: string | Buffer */, options /*: ?DotenvParseOptions */) /*: DotenvParseOutput */ {
  const debug = Boolean(options && options.debug)
  const obj = {}

  // convert Buffers before splitting into lines and processing
  src.toString().split('\n').forEach(function (line, idx) {
    // matching "KEY' and 'VAL' in 'KEY=VAL'
    const keyValueArr = line.match(/^\s*([\w.-]+)\s*=\s*(.*)?\s*$/)
    // matched?
    if (keyValueArr != null) {
      const key = keyValueArr[1]

      // default undefined or missing values to empty string
      let value = keyValueArr[2] || ''

      // expand newlines in quoted values
      const len = value ? value.length : 0
      if (len > 0 && value.charAt(0) === '"' && value.charAt(len - 1) === '"') {
        value = value.replace(/\\n/gm, '\n')
      }

      // remove any surrounding quotes and extra spaces
      value = value.replace(/(^['"]|['"]$)/g, '').trim()

      obj[key] = value
    } else if (debug) {
      log(`did not match key and value when parsing line ${idx + 1}: ${line}`)
    }
  })

  return obj
}

// Populates process.env from .env file
function config (options /*: ?DotenvConfigOptions */) /*: DotenvConfigOutput */ {
  let dotenvPath = path.resolve(process.cwd(), '.env')
  let encoding /*: string */ = 'utf8'
  let debug = false

  if (options) {
    if (options.path != null) {
      dotenvPath = options.path
    }
    if (options.encoding != null) {
      encoding = options.encoding
    }
    if (options.debug != null) {
      debug = true
    }
  }

  try {
    // specifying an encoding returns a string instead of a buffer
    const parsed = parse(fs.readFileSync(dotenvPath, { encoding }), { debug })

    Object.keys(parsed).forEach(function (key) {
      if (!process.env.hasOwnProperty(key)) {
        process.env[key] = parsed[key]
      } else if (debug) {
        log(`"${key}" is already defined in \`process.env\` and will not be overwritten`)
      }
    })

    return { parsed }
  } catch (e) {
    return { error: e }
  }
}

module.exports.config = config
module.exports.load = config
module.exports.parse = parse
# Contributing

1. Fork it
2. `npm install`
3. Create your feature branch (`git checkout -b my-new-feature`)
4. Commit your changes (`git commit -am 'Added some feature'`)
5. `npm test`
6. Push to the branch (`git push origin my-new-feature`)
7. Create new Pull Request

## Testing

We use [lab](https://github.com/hapijs/lab) and [should](https://github.com/shouldjs/should.js) to write BDD test. Run our test suite with this command:

```
npm test
```

## Code Style

We use [standard](https://www.npmjs.com/package/standard) and [editorconfig](http://editorconfig.org) to maintain code style and best practices. Please make sure your PR adheres to the guides by running:

```
npm run lint
```

Copyright (c) 2016, Scott Motte
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

‰PNG

   IHDR  �   È   Æ·â   sRGB ®Îé  +­IDATxí�X×Ùþo"(¨ñLÐ mÀ^‹ùÐL­¦	kMRÀ“F¬µŠm"/¶ÒTßKªi*Ú4ú6ø¯@mµ­Ø¼Áš‰¦­ÔB*$‘ø%	4…A%á\ØÝ9³;»ëÇÜs]ËÎœ9Ï9g~{˜{Î×3>³t€	�€”À�	ÅÒp’ 	 ×	� 	� 	!@1B�6$@$@l�°� 	� 	#Àˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž ÄôU€ H€HÀ
ˆ1n´" Ó €˜¾
 	� 	#@1Æ�V$@$`zÓW  c( Æ¸ÑŠH€LO€bú*@ $@$`Œ Ä7Z‘ 	�€é	P@L_€H€Œ €ãF+ 0=
ˆé« � 	�€1cÜhE$@¦'@1}   0F€bŒ­H€HÀô( ¦¯@$@ÆP@Œq£	� 	˜ž€¯œû¨o×�ƒ/ú¡—é’¿À€@DEÒÌÿ\cÞ~ï3Írúøv £½&~)A~}×þ†÷?Ã{gÛ¤ùuååƒ#ƒâß¯§ÌíŸã­·šÑÖO)‹OO¸jï„�¿£»¿Š57´âh½«ßSá xT•ÌSñë÷cïÊé@{;àë‹ºÒµ;3ËSÙ1]¸ìÜÿß}Ù/I]€7_~³~\£>áå�A#PóâdúÈoþoî©ÕUÎ¤Ï§Œîcé¿@áS‡ñ“Š�œ¦ó³íwáÛ±Cºã|Þôî˜·¿ûØÙÎYÿ…üaÎ¢8×�}¹ocáo?pi;ü+ñVA$ø8:—ÉèŽä?Hˆ±Ø„x(ÛÐ!�ßüC×*ù�ì»Z?¿+C'‡Œé'Ú@Ú›Þr­y¯ÿ§U;!�g‚F;+MW"Z:ýFÆ³÷�Ò•ÃÞí�øè‹ÏuÅÕ©ã|v½Ø¨+zúwFyM<t¨¯‘¢S°¥ø êš/âTIf_S£ý5O ñññª�ýeÇc_]3šëŽ xK&¢íOº<2…€¸¤à¥ç?uS÷YÇ9|wÃ{8×ñ…—Jn›Íu¸gÞÛ ÍýÏŽ¾‹òÚ6ÍóFN|øö'(n<çÚôº‘¸'v°ëxnŒÑìÆ´ì“ŠGþ¾#¸xxÒãè‹ð;æÁb‰G$`GÀ²)¥¥¥ªOÕ›š“òMÜˆÀÐH$¦­ÃáÖÓ(Ù´È.ggt®àsµ/Öà…¿}rYJxã­Á˜4@WÞ/–¹³Œ(Åy—›µP·§„`B€w[žÓBíÇ[üü†!ÞZ £ßÑ™8Ò\ŠÔ„È®î1k:�Ñx,½·Ï‹Vc~››@`÷åg&Ï‚÷‘ØñÁìe¹h¬È×Õ¡€ØÂ»Êöôíc8uAØzyó€oÌ¡+×íÜÖ�Õqþ<þ¼óC]ù~Ã2\tzzìÃ‚-%J—R+:::°n^¤]Ùü#ç¡T„·6žBÉ–t»súRPñú:Döü¿Û™=Îî˜$Ð[ý/JM‚cRñòÁMÒs¶�[WÛþçÿÁêê/C©}pç}:Ç?¯Åë'ú>^£\ä™·?ÖÙ}†øHûÖ€»!¥l*AcÇ.¤ÍVº”ìžáTYù‡cvÚF\¬;ˆÞ46ÜŒ™x4”cÅ?ÌÌ(VåÅ è�¬™c1eEš$F!qË°�ó64DÎ“AîRþòìØsò3OYšöˆ¨!øÆpí)É¶FÚ'«ž¶1ôìwào:»¯î_1cú{®û*½°
Û–ÍF°žbÛÄñ�ÃÆŠSØdÓmsÚ~7z=�“äÐVƒ#§!§Ê>:�HÀ(�ªœdÜ½j�Xâ Þ¦?¾ÒiW–çþËÔe¹âC�ˆðë\ÏL2v!ŸaðX?§³°Œ¥,ýÑ)¼Q0Isz°Ñt�ÚùúãÁÔPüîgÇœFSNþ%ç#|¸(£úÀ¶7ÝW�Ìê²LF#D§ã™¤(£æbŠo8–m¯À¡€X8IeQF"d“€l^‚'v<EFTeÏÁóó±,Æá¡%ôndˆ1õä<yª+—ë†£äÿ…¨@}ƒÃV³+áûÌ?�ã/‡`Õ,}ãî*óÔq‹Ó! øü}¼V3�L–õÇè+�Þî«À‰cá¼KI_Ž²XÑXŸ™h?˜m­'ªßFýÇÀˆˆÉˆ³[¤›~˜Ÿ‚‚…ÚòÕ¸±jÓöøSF™:œ!$àË·•cIÌl‡ú-?Ç¤ˆÔåu•]X6à}qõâØð½8Ò"³¹D·î™„%¡=‹�%^üJ_º±Äì«}úf_=ü­ŒèCKÇÙ5DgnÄlY³@5Ta®OÆGOÃŒÓ0),sWí”ö-+yD>´Ê¿¥|KÁMajl;^ÎÖ‡CÝA ç¯¨•ôc�ùòTÍÔ¯Þ;¦æ%™ôÄ§ñÔóïãs¯ºjé�¹i¡º€¿ôË|`pÆ˜Ò}µcÇ‡®óñˆû§ë4×‰©cŒ%O»½~¾›Ç!íâìùºb·´o�0Ss,¤%Ï/¶¨Åp�“8#™ïâ;P»W†]Xnƒùzý«±óþ}ê*êíUL‰Ýf?ÖaõEÊjnÆ‚h�n'Iœ9ªoöUXü|e”vew’…®S·Ç�‘Æ;ò—BhŽiçXðÒS‘ªþWëß{Òü]F[RðõÉÐŠVqƒhm=‹“‡¢¸L³Ô®’ôâùhX%`ò°€Î<[Ï¾�ÃypGGžÂ%aòPFÌ”û¦’Ãï¿�¼ÇG�Î¬ûô':Þ‚iS&C¹Œ€€ 4~P�œ¼>æ�”iSpÃ%6g=Tvg®®ÕÎbóÜOàÉ§ÞEÂ_nñX7Ž#€£‘y×0d¿vÖñ”êø÷{ÎÑ}õW}ÝWÊÚ��~ÆT…1àïç'±jÃ;•òþakäÿ{õ8“"­‡—¾u§èÄ*pnë`Ô«ÃôMÅH_0áÁêî0%¡ö–Tz¹+’‘'Ñ’èôx5û>Eqìòõ7ÁC›jO#Ž_�ãÅßAˆp*iÛ#â+nœ¯>ƒñsºLfAÖ¬0‘|W,å|ÝÞg0É"ÎÇ§£øgK1+&Â~¡›R’Ü|4œ¨ÀŸŸËÄâœÞJ‰X»Sœ‰âc"VôË¶Ü|1–Uõ7üfÍd»¸Ç;^ƒ˜%ßÖCX6³³Eºhý¬Lý"BÔOÙ„Ê—~�…–íISÖäcå7-ˆ
V�ÍÍoBõþb¬ž¹'UgÝÀ.,÷3½¬)¶=…ŸîÔwÃuOAûáëÊŸÌÓý…†^/|ÔÝ}%&AÜ{ÛõŽYºõx€ÃðbWâþ¸9F³/ª3Êé3ŸHËqê’ŠNÇþºVl\–¨)J�|C“�„ÜÃÍ(Y¯¾†ªœ—ñ�¸}Û}ýƒ‘ð�,MW*[~öD
÷*;_¼µg7‹ðqað÷ìN;ÐßcÇ… zQ!šK7"Q&�Ö¾‰ˆCÚÆRœÚ·¾;=W;éùûÑ¬¬Ýî`´Ä£+ù@DˆÁäu»:pj¾Soácì¯!8X\÷ÐAâæ�âãÍÈ]9O*]ù#&q%7V!Óùr‹îKË?xÛV§JÅÃšfTB*v5W!C_ïrwÚFv( F¨]á6¿ùQÊ?r¯*g—<é¶á¸ÙÁé¢4¾XøøZuïÖ¬œ9Ú¬kñ`ø½!øÒYAZC�¯:%µ›4û1i¸5°xù4ø�ÀŽŸØÅ.o­	ôæÛ²	u1=TÞê�'ˆÙ+wa¿j�JRÖìÑ0‰ÁZ1“Lµ¥â[ÒÕ�@SùÏaÉîiêœ¿hÛ>éJÉ?*‡s“ ~^WåÔž°R8–\#?iºEÜx7¦N×�®Õ4|z*öÖ•hŠÈy»6–ÕêüþÔëHŒÐyÁQX·÷Ò­æß›6"5Nc‡£M`’æÅ8†ºý˜âv¤W@‚Ÿà»ßÃyáFÃ[¿à�Xô5}û÷/�íÅ@þYzZ×%<ñÐp�{Þm9/Ù¥óOÄéŠBÍ›Œ®pG$ÑuT·k$Ã-ºRŸ¾,¶~ö#e}@ne“Ô>*å‡pt»·ãéÕ]NŠu{þ{Z†4�¾†Ï^�}NVL/*<‚4½7^Ia|Cg#‡«Û»�¡("ÃuŠ‡ÕÌ7O9ñ°œ²¥ËdK­ö—é›Ò¾úðÎ·;Ë^îXŸò�÷qiy|Çl«”w�¸4îuýzÿ^Ð€“­ò±c¶J÷Õ‹Ûuˆð¼;;VßªxÇ<zs\¼|N¨š;“‰IBië)ìX#y*ïM&JÜøÛ1®—÷ÅlÇ¯¿Í^‹¶T–èôÌZÓ Õ:FÒÚ-JRvÛâØgPkré@ÜôVÚÞXÓK0WcÎ�Ÿ/�ÆZ4YÊÝaMõ'Pyà Êkê¥ÏúÖˆ	éÙ]j™X¥²Zµ£¶ú Šr7#wëNTÖÊ…R‰>ï)¬Ñí»Ò¾’4Õ×¢º²åÕ'ÐbÊZ�ÎïÐ»¿¡1µ{~ø¸³ÖDêOT£²²õMZ¿­]Vš²6¼ŸŸöÄù(’fò×ð‰ŽìÝ×€Éƒûã¢›ŸÜÛÅúóÛoÚç·¾sñ,øÞD|^V‡"¸î
z2é8fWÙ£n=¬5Âê¡woóyk�ü[L7.«:‡ñqýåçmB•î«ß�q}�w>‚ñ®Ó³IÚàn6ìZŠÜyr{ÿpÌ[½Ó×ãe{ñ§¿ENAoyEÒnB�$‡ºêJIè¥ ±B~n„üßYY£ò¨˜fl[’ôÂ
lLRß”£ÀúèÅÈèéidcùfv-‹Så1/™buJ¶èóß—é¸­+z[Mfôrd[m)2Î„Ý¹EÎo_	©FÆa™h…gÙ^¥Ðb1®*µP�\ñ²³ÅsR6íGþ²é’Ñ®PÌJ¶ «JO·c×ïÐT³ÿ½Ä‚<»"YPX‘‡¤I‹Ý?
Å58\ƒeK"å?-ZD&Yì¦�Ç§ç#?;á½éÅìdtŠÂ9L.ð?­³¥){ Ð(–”øµ(Þ±‘¹¬Â3×ès=TÜ†('J®7ãþ£‚ñdÖ=üO×&bêìÿŒÄ–Çnp·�1º<ôŽÆÞßžr™Ò=‹Çâ®wé-Wo÷UÊ1•ØK[Þü'ðÀ©½˜®ý¯ãŠé‰©�ŸìgO`ïöç`Yž£»„[–~MÒÔŽSoÔL#?m–ä¦´ToÅÈØ…*»œäXŒ¾á4VNw¼‘…à¡ÕéÈ˜o_^egç×[1Ou÷ÇÒ’tdï¿ŠcõV�gIV;	i¯/Å½cgÚ	^gôâñàq§*VC†êÜG ‡›oPÈiN'Š2Tâ¡D,X>SãN‹î"õÅø]/MJØT™‹¡±‹%çŠ‘ÛŒˆÆRÈz¤F„„9Ø·ý³5š>`âa§OÂº,g!Æ–6 îðJí©C.]‡UØ_Õ€Ù¡íXÑÒ|LŒ�å-W‹'»°¤ Ýèã'þ¹Ýƒú3ñRªÑ·ŽÔýVÀí?­AÙûöÓ0Ý|u—’zçŽÔ•ô‘Â�pÔY[^I¥½Mg÷UîŒóJ½¶•aÎØXl-¯×•£H—	O¼�G°i‘Æ� ;%òÖ!-JÒÕv…6ÐÝ&�;k0+Rö¸Ù†¿nP‹‡Õ6#ïÈ:<ÂnŽ´F±ûžÿDìBºBg‹ë[— 9ToÍOíÒSš�U;7«nŠÝ‘«²°ü7ò–X`Ôýªn¦“¯—`çî�Ø¹³ëSTTÔ¹ÿÇíBízídwv¶;£&ÄÚ:ÙoÁž”‰‡Õ¤Ï×Xì¾/žw˜™ÿ8¦ËÔRtèíÉ^ê„S2¶VÛ¥­ç »ðUi�ˆ[¶û%¯$pÏ]MOÉÇM:D:×!eU¤¾™O¢eµôj½òöÂ“tzèÝXûê”Ç™c-ºº¯<íyW^È*,œ†v£ÁIŸ¶­­op$–åFUñÛà®}ñÒ¨ŠºFÑuºKÌ²qxú»ûÀæÕÞˆ€èô)RÇ‹h9ŒµêìºC
þ€cÑ¡*[ŽÕEòŸ´=&Vè§8ñ÷Õ]‡¿µ‰S¼x§|LFÌ±
gQìVd`¾e>æÏïú$''wîghˆ¤ù×™h`oÞqd_Ç£–æsŽA�Çcn½Ý.<zÚDùÌ±¶*ºpÉÜ"^}Üë­@¬	*—=&øcºx%AGk3N/éo’þî½Î”^'0`ÄõxîéIøêßr™w]é;øÕ«!øAüP—qûAxè}$5Lxè=ê2™­/}„'î¢9sªòeƒç"—G¾æákrr%dÄcSñÏ°àÞëøoŠJ\-Þö&V?Ûv+�Ç„Ð`i”’}ížµbAÝ}`-Ú¸È1RÛvˆé¤UâF)] 	á.Å$—À	S;o²ó’— åžR¨z¾¬…éþnÁÖ%szµ@®ÛÔåN6þV“…pU«Ë£Ç)­<'âp)mëÊð1C•Ök×
ýÎSb•þ¨[F]Šåý¯€!öýdãÂC¤¿mÓá×5(úZêåÓÅØã/‰iÈ’Ê!Öí„„…t‹šŽ*ß×âÐÞS¦>|–ü²Ï+î_]lk…åß1lŽMÝX:äøE7Vf¸Üû±è¾úóï>tqEÀ ‰7áŽ±Þì¾’©Ë-±X.‘Ó×,Áý_¿S£#Ç!í•·½UmÙ‡hën³è±³‹asÐv c/­Ü¶	µßÕ˜· ŒÅDFÉ[4ö	89}p-ÃŒ¡u[’Öƒzgbµ»³±P¦@Y=<ñ‘€¦Œ‹t" ñ‹�¿ò1ÌŠ›‚P�ÕùFËã1;�ßöä¿K=–¥E�eü8Õ±Mc‚[»”;»°<ø3x>éøþ–Éú²ÝFOæýG_Ü>Ä
œ0XŸ‡Þ/Î`ï¿ä3¬štv_=ú­áö ë’Þa¨BNÖbÌŒ/fÛMÁÚ¢Ýÿd²t¢¾µ²gÊ¦èîÐ”Aÿéh®Ê—%Ñ–p§C¿M÷ƒ;²¹œ¶I‰nŽgJ�Œµ”QÍ¶µpû~Ùòq
yF)Øqð.–æ"UyƒäÕ"âbƒä?†_w@~Å}MÁÁFmñ€oOî�¾‘ÖmÝŽ/tÇíMÄá“†cë¢›t™¼úÜ¿ñâ1ùM[Wº"é÷ÐûÛÝI;zùŒëœ„çÝ<èy×uœÅ¨BVòMIÃ�zÉ ƒb*¦l.µ®ü>Y‹CÕ5]S(%ÉF¥âHá"É™® ~îîHè¹Aheê4O¿�½½)e
‚üÆª.o:ªZ·a^\¸´+HÿÊ
¹3v¬×Txä×ÒbJA”u9Õÿ¨FÝ¥R¹»æyýbÝ™áÝ3G#d�û‘|vÎƒ}=õ¦C$¦�Ã¬íup¹CÀJKo¾ø%ñäîNröiéõÐ[ûÒ¼•51Á6k8:»¯¬ÕÓ>]Û#ÅónŒ=ïÚæex¿*3ÂÎ¡¢y›ôÝæÝ^²«²1#ºë‰=sGÖÍ‹Re™´éâµpö“k»¢U¾#xEEªlÚšÐxÉQ¡ê¤f€¨ÿgßé¾AÈ¢E‹ƒßw6"ÄñÙýëQ0#Cfî–°f8ígëÎcýþLDIºò­”âÉ÷ëEj—êà…!¦Ü]ÎoMØMß5ïˆmÙ¬<7¥¯JF¬'zXÕ5(bµ×£è©$Û-ÌQ\Grë" œñýtã­ˆÐûdså€».h0Ö®ŸŒ½ßyÃe¡>;ú.~þÒ(¬ýú0œ÷P«HñÐûôÝ#ðô«.œ:Šn¬=‡>AŒÍ››Ž}ªköU²p]âIÏ»Ž 7	_JÊÚ€váa¶k^W}°YŒù,/sŒm{\€5E+°+-Æ6°sÌÔñm?P�=?CöËÖgDàA±È,Ça�ƒ’ÐézùŒžÖ£[æv÷!)È_#_0ØyQ—þ„L_†‹Ä¨<ÛP÷íÇß¢cm“pí’ª!tí•ÈþÁBdIfcE¯?ˆÃ+ãÜWØ>¤t¸þ©µ§q®ypšDÚQš5GˆG•ª,ìÂ²Ar±Ý3ÝL6Yxl÷æ{Â:oÚz2øÅ÷�Š·^@ ¿§ZEý0çÁ0=EAáÏÚM1þ×~ÙB‡¤„Øß7Uxs»4“É×Wå£d m'=…´ŸYc=ã«±°Tk}Fè¤)VS»ïæ6ùÓxÀð1vñÜq�Y²^ÚšR§í�y?=Ø=ÝS}¾o!“Â‡JhG]mÏMÎ2÷ùôæ¶j|wd¬T<”DÇù_9‘AlBçÃ‡AŸ‚âqÇÍê”S†ó5Ö Q@l€»k±ŸM’^Üí‡'²&éËO<ùÿäWµøx€çú±ÆO†i]ÿ#Ö•}ˆê3ºÊÝ~%§]^Ãø‡FàK¶Ý^.-úAÞç€	ññ.¯;#Ói¿¨1Å¦ê%©j-ð+ÛS.}u®Älq]<INAÂÓnælÙ¬®v´È†z‚ãÄçt�Ä´ƒU‹é£F¯ÇÙS1÷Ã·{d\¨\¸«ÿßjç~¹¸®·ŽEòÔñÉš¤3ô£g©Y:–¡Ù1Àåq†Hfs´;¤9e˜âêÕaÐÁØõÃ›uxÏ¯k°º°z3êJÐ!’â¡w~Â0‡PÉ¡ðüò¡®I�Êì«>t]í³„¸tƒ"É©OA•J_´jóEÂÒŸ¸ðÂ�=«²T>8¤1³ªï[çIÚXÊÛ"BÙ.¼!+„sÄMÎgpõ$�ôLí�záU
ûž•»Yo8�… G‹¤7ºðÄ,•‡ßž<å{£&ÊyYc¯.EÞ²hoÀQ›Á¡#�/H´¦gÿ�‰gW�AÙÇñÞQUi�ôaÂ½È
'+ æøe/ˆéuA5ë˜FJ0WkðÝ)cñ�áú=Ó~z¼ÃC—ªßCïïŠÏtÎÆ:¼ßÅ˜‰RÒ~£1+z ‡Ê¬�lÞËoIo�ž.^´éÒ'}vTýQøˆ’5~ü‰k±Ô.‘í™2lþsµm@÷¾2ƒëôÁ|±JE{KYSˆãÂ7ÓÆu¿ãòx‹
Ÿ×ðuU‹Ü¥b@q2
ª%ª'D,íù§ù;æ*Ü³Ì—$Sx™^9]Ö
þQ$œ:öleo|Ðs`³õpfÏj›ðøô-8Þº>)mbzq·*–rË`’~‰ƒ[dœRPrJ{&•;K/¯ÙîÌ�iy—€Xžõü-øÝÃåÞÍW’›^½ue§Q]Š½EÒÇh»”½çy×.[ /û×&Jo¢�	ØXzOÕTà_•GÐxa0nŒ¾·k¾QO¤-ÖJ<ÛKµ%²;,^¼ÕßÚ&�q—ŠÃ­³Púâ_ð·ÊZ`È„„Ü„ÉÑ·à–É‘èYá‹ûVŠkM¶Kñ›°VÃ%ú‰�9Ý¾®./‚¥4MH†Ã&Þ§Q ^>Ý·&q©¹h½w^}å5=smmA¸ç‘‡£ùž�¼ôl–CÆÏÓ¢km[kþi/Ž]8�ƒÃ1íö;j¤Åâ�¥¿P†Ç7&J·}—–‹Æ{CÉ+å8ƒá¸ejœózçæò]V2Á¦½Ù‹ûø˜¥±Íuô­!øÅ¼ÑøÞÎÿ\Ö‹W<ô&=†½yï:/‡èÆZžV�·êeO°ö¦îfàµ£2¬ÈÞƒÃgkäè‹ÐÈ8$Š�ž­üW™ó¯ôX9‹S Þ˜ŒÃë4Ê'^r”0/M|œ¥!–§D<(Z!ÑböTUwÄùKä]Fb0zƒ­×Þ²ÅxîÀX-™ù•ºk6t‹Mwâ’ež›rcò‰Äl!\WdgÙR]¤Zù^¶|;N,‰“·(I©H°Kå
=È®ôÓ/bžÔ©",^ï›$>—ccÖå îñ<¯CÒÊÉº±=[Ü1Ûµ«ueæ­£®ÅýnÀ]‘Þï¾²2ªÊ™ƒEÕÖCÃßõ¥0Í�­kA”·¦m­´üVÞñ>®ÛÖ²©BóÆU™§ŒÎš‘£áè0Oý^´ntl½~ªm©Ä“â&êM¼¿årç�ê¸=!-õò—WŽý²Çf•õä.ß›/Æ’´^f&·ðN(Ä;œ½žK¿àÁøéÚH¯çë˜¡½Ê8Ìàñ®…!qåŒºÎSS�K.?ÎIŽFÂŠ"ÔÊfÉMlBÛPž›†°™ØiôÈØd€¼…±˜»a�S7*¶ñí÷[P^´JøèºÔ3½›–iÄ6À“’÷C(/ŸZ·ó„}²—Žü#“pp½ŽÞƒÖZª±êÎXÍYUyÉ�`k¥ë®ÑîäÄË¯‚Â2pÜºÜÇzBù‡éX—m¤®ýê ¾…ˆÅ¦ãgmèE½kÃîUiØ]+»�¾ÅÖšbKãÛÿrâ�øþ—U=ÒÞ½ÊKz]eúéqùb8[»$O{¶ÍÌÉ~YN2ÆLÁ†�4Ý�Øš··5¡ú@Ò¦`Úb}+ëdI†�¶MVs¿8cŽp£² E¥Õhjs}ikªÅñŽ¹>A˜–Ü3�¾:IÃ™žxÅ3Úï¢È›ÿ4*54 .u™‹Yk@ù¯,HX%\¶79){{ª…o«„ hh,Q¸ÄG¸Þ�)\ï‹ôœ½ƒ¦­{rW h’2þS€ƒGd0§ÙOGhûL¦êíb‘®ó­ù¹K¡Ö�?Ñ6,Ëõn.ŠÔHßÙa5l©¯Ä†q°dç¡æ½Fkp÷÷9ÇwŽXÏDÇâÉ0�³2ùˆñOMÃ±KóÛ[c oì8�øUoj–£ó„Xœvðß_¹¬+Ñõ”óÑÌ©âƒòY(²üøX#ÆÞ{@vJWØ/þ�ÑAºâjEúôd#ÆÌ2^%]Åón—ï>óè©£ñ)‹0mâmH{Êö5¢m(Ýœ‰Í»JQ\Ö3ž ÅÈ1<ÿH3R#ÿ›ë±Ö'ŽCÅŽ¶ŽÇJùâ§Æ "t.ÔŸEñ�OÏâƒ£5øûÁQ>GïoªhÄ²õNuî‚nOÅñ)é˜}çÜ4lpg¡.ˆrŸ®ÌwæèpÚ®¾Ë¢5˜s×$Œ¯®¾ Ü–XÓËé]][4¥ÏCÌ”×\À§õà¥…È+î}}S®=zÍ~^=]…¡:wnO«Ôál¯»ì¯�ÃŽ‹8züSº¾¿˜®é9MõÐcF*?¸w¶!‚Q¸ô&$?çb ÛƒÅ<®ËC¯·óZÅHúöˆ+Èó®})Ë
ò„ìc°¤Û
ÈEÛeüæ¼ëµcB@»�B1_ÌfÊêÅl&¥¤�å»Úî�——äˆòÛóîËQq^Šõ5û’�l«ÄÄ@cB¡U¸Œ¤©’SMø{I±$¼+ˆbE#f}óÁýÖ#�}š�c/Nö¢'ÜûÄxXŠ>Dq£ën"Ï\x—‡Þçìú½%Òü…ç]Ë�ê'UiÜË(i¥I‚ô¯ó­{ÂV¸ƒAdê³Ø²« Öa
‡Ó<$CRò+ÄL.•mû‰§uÍ»ýªâ™/`Èï+Ói³6L¾¬°;=ô,AXüˆ.0˜ ‡Ìf›ÍO—Ÿ,‡Ýläìk6T[ÒvÖ!_¾rQ›$àŠ@faòS[»ŠUvmPÆ„´7
ˆ6�œ9ÿ©çºÇœ8â®QXwŸÄQš3#7ž³zè5’dòCÃ¼Øb3RBÅæ$JvíÁ�ÒR”ŠÏ�Ò?aŸvË_W&9–Dù,ßP¤n,EÅ3štåÄHf%°©¢ë’b$‹�š�™.½)³Ë45§kCV½¨J£{ÑtyèuéâÝ1S1¹áþÛúÐä˜žÇŽ«�1Ž›S¯‚eì<”ß†ÙŽê-¨y½�
åæÒ2¹«�À[ïŠûAŒcÝâ±{&Ù.Õ¸4¶@4À\‹ÁF_�—ž¾|]Yz=ôÚ²ÿÐ(LôÞ¤Û¼¯ŒýbÌ„¹{Ð`»ö¤éßø_7._×ÊRx›@ÞóÿgçÉY™¼9m
&é|%1ÄÛ¿ØeÎïöGnÄc£.Ï½â¡÷á{ÅÒ^li–a^÷¼Û‹ây-jÎâ9àƒ¶¢üD-Ê‹ÄÌ¯«}cÈeÿË~ƒáíDùn¬MK‹(c±ÜÆ��«òñtEÈç?×LÓã#¾�ùü—ðÂƒÿÐ,…çN\‡™÷�v~¨/áy÷«·vÍÿ×gpíÇÊÉXˆƒÙ¯4:Ÿ|Ü(Š ÞòØS2_ßv|ÔP×À=¨BrìXÃy˜¢âÛßû3Ÿ´~‘A!ýÄµ|óÓñ>öAƒ}äÆ½5[Ý¤Ë¢¿oßó³ÍèÆ[‡Â2t m�æþ½KFal>ãhºÊOdÍ?ø‰·=Z?>>˜)ymïU~©×lñ/ëJôk–*/ìš! g%ú5s±¼è%S´@zÉ„ÑI€H€t €è€Ä($@$@j5†� 	� 	è @Ñ‰QH€H€Ô( j&! ÐA€¢£� 	� 	¨	P@ÔLB$@$ ƒ D$F! P €¨™0„H€H@
ˆHŒB$@$ &@Q3a	� 	�€�…H€H@M€¢fÂ  ( : 1
	� 	�€š DÍ„!$@$@:P@t@b  5
ˆš	CH€H€t €è€Ä($@$@j5†� 	� 	è @Ñ‰QH€H€Ô( j&! ÐAàÿÜr Ç%Âb    IEND®B`‚{
  "author": {
    "name": "motdotla"
  },
  "deprecated": false,
  "description": "Expand environment variables using dotenv",
  "devDependencies": {
    "dotenv": "^4.0.0",
    "lab": "^13.0.1",
    "should": "^11.2.1",
    "standard": "^9.0.2"
  },
  "license": "BSD-2-Clause",
  "main": "lib/main.js",
  "name": "dotenv-expand",
  "types": "./index.d.ts",
  "version": "4.2.0"
}'use strict'

var dotenvExpand = function (config) {
  var interpolate = function (env) {
    var matches = env.match(/\$([a-zA-Z0-9_]+)|\${([a-zA-Z0-9_]+)}/g) || []

    matches.forEach(function (match) {
      var key = match.replace(/\$|{|}/g, '')

      // process.env value 'wins' over .env file's value
      var variable = process.env[key] || config.parsed[key] || ''

      // Resolve recursive interpolations
      variable = interpolate(variable)

      env = env.replace(match, variable)
    })

    return env
  }

  for (var configKey in config.parsed) {
    var value = process.env[configKey] || config.parsed[configKey]

    if (config.parsed[configKey].substring(0, 2) === '\\$') {
      config.parsed[configKey] = value.substring(1)
    } else if (config.parsed[configKey].indexOf('\\$') > 0) {
      config.parsed[configKey] = value.replace(/\\\$/g, '$')
    } else {
      config.parsed[configKey] = interpolate(value)
    }
  }

  for (var processKey in config.parsed) {
    process.env[processKey] = config.parsed[processKey]
  }

  return config
}

module.exports = dotenvExpand
Copyright (c) 2013, Deoxxa Development
======================================
All rights reserved.
--------------------
  
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:  
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.  
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.  
3. Neither the name of Deoxxa Development nor the names of its contributors
   may be used to endorse or promote products derived from this software
   without specific prior written permission.  
  
THIS SOFTWARE IS PROVIDED BY DEOXXA DEVELOPMENT ''AS IS'' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL DEOXXA DEVELOPMENT BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
"use strict";

var stream = require("stream");

function DuplexWrapper(options, writable, readable) {
  if (typeof readable === "undefined") {
    readable = writable;
    writable = options;
    options = null;
  }

  stream.Duplex.call(this, options);

  if (typeof readable.read !== "function") {
    readable = (new stream.Readable(options)).wrap(readable);
  }

  this._writable = writable;
  this._readable = readable;
  this._waiting = false;

  var self = this;

  writable.once("finish", function() {
    self.end();
  });

  this.once("finish", function() {
    writable.end();
  });

  readable.on("readable", function() {
    if (self._waiting) {
      self._waiting = false;
      self._read();
    }
  });

  readable.once("end", function() {
    self.push(null);
  });

  if (!options || typeof options.bubbleErrors === "undefined" || options.bubbleErrors) {
    writable.on("error", function(err) {
      self.emit("error", err);
    });

    readable.on("error", function(err) {
      self.emit("error", err);
    });
  }
}

DuplexWrapper.prototype = Object.create(stream.Duplex.prototype, {constructor: {value: DuplexWrapper}});

DuplexWrapper.prototype._write = function _write(input, encoding, done) {
  this._writable.write(input, encoding, done);
};

DuplexWrapper.prototype._read = function _read() {
  var buf;
  var reads = 0;
  while ((buf = this._readable.read()) !== null) {
    this.push(buf);
    reads++;
  }
  if (reads === 0) {
    this._waiting = true;
  }
};

module.exports = function duplex2(options, writable, readable) {
  return new DuplexWrapper(options, writable, readable);
};

module.exports.DuplexWrapper = DuplexWrapper;
{
  "author": {
    "name": "Conrad Pankoff",
    "email": "deoxxa@fknsrs.biz",
    "url": "http://www.fknsrs.biz/"
  },
  "deprecated": false,
  "description": "Like duplexer but using streams3",
  "devDependencies": {
    "mocha": "^2.2.5"
  },
  "engine": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/floatdrop/duplexer3#readme",
  "license": "BSD-3-Clause",
  "name": "duplexer3",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/floatdrop/duplexer3.git"
  },
  "version": "0.1.4"
}The MIT License (MIT)

Copyright (c) 2014 Jeremie Miller

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.var crypto = require("crypto");
var BigInteger = require("jsbn").BigInteger;
var ECPointFp = require("./lib/ec.js").ECPointFp;
var Buffer = require("safer-buffer").Buffer;
exports.ECCurves = require("./lib/sec.js");

// zero prepad
function unstupid(hex,len)
{
	return (hex.length >= len) ? hex : unstupid("0"+hex,len);
}

exports.ECKey = function(curve, key, isPublic)
{
  var priv;
	var c = curve();
	var n = c.getN();
  var bytes = Math.floor(n.bitLength()/8);

  if(key)
  {
    if(isPublic)
    {
      var curve = c.getCurve();
//      var x = key.slice(1,bytes+1); // skip the 04 for uncompressed format
//      var y = key.slice(bytes+1);
//      this.P = new ECPointFp(curve,
//        curve.fromBigInteger(new BigInteger(x.toString("hex"), 16)),
//        curve.fromBigInteger(new BigInteger(y.toString("hex"), 16)));      
      this.P = curve.decodePointHex(key.toString("hex"));
    }else{
      if(key.length != bytes) return false;
      priv = new BigInteger(key.toString("hex"), 16);      
    }
  }else{
    var n1 = n.subtract(BigInteger.ONE);
    var r = new BigInteger(crypto.randomBytes(n.bitLength()));
    priv = r.mod(n1).add(BigInteger.ONE);
    this.P = c.getG().multiply(priv);
  }
  if(this.P)
  {
//  var pubhex = unstupid(this.P.getX().toBigInteger().toString(16),bytes*2)+unstupid(this.P.getY().toBigInteger().toString(16),bytes*2);
//  this.PublicKey = Buffer.from("04"+pubhex,"hex");
    this.PublicKey = Buffer.from(c.getCurve().encodeCompressedPointHex(this.P),"hex");
  }
  if(priv)
  {
    this.PrivateKey = Buffer.from(unstupid(priv.toString(16),bytes*2),"hex");
    this.deriveSharedSecret = function(key)
    {
      if(!key || !key.P) return false;
      var S = key.P.multiply(priv);
      return Buffer.from(unstupid(S.getX().toBigInteger().toString(16),bytes*2),"hex");
   }     
  }
}

{
  "author": {
    "name": "Jeremie Miller",
    "email": "jeremie@jabber.org",
    "url": "http://jeremie.com/"
  },
  "dependencies": {
    "jsbn": "~0.1.0",
    "safer-buffer": "^2.1.0"
  },
  "deprecated": false,
  "description": "ECC JS code based on JSBN",
  "homepage": "https://github.com/quartzjer/ecc-jsbn",
  "license": "MIT",
  "main": "index.js",
  "maintainers": [
    {
      "name": "Jeremie Miller",
      "email": "jeremie@jabber.org",
      "url": "http://jeremie.com/"
    },
    {
      "name": "Ryan Bennett",
      "url": "https://github.com/rynomad"
    }
  ],
  "name": "ecc-jsbn",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/quartzjer/ecc-jsbn.git"
  },
  "version": "0.1.2"
}Licensing
---------

This software is covered under the following copyright:

/*
 * Copyright (c) 2003-2005  Tom Wu
 * All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
 *
 * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
 * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
 * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
 * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * In addition, the following condition applies:
 *
 * All redistributions must retain an intact copy of this copyright notice
 * and disclaimer.
 */

Address all questions regarding this license to:

  Tom Wu
  tjw@cs.Stanford.EDU
// Basic Javascript Elliptic Curve implementation
// Ported loosely from BouncyCastle's Java EC code
// Only Fp curves implemented for now

// Requires jsbn.js and jsbn2.js
var BigInteger = require('jsbn').BigInteger
var Barrett = BigInteger.prototype.Barrett

// ----------------
// ECFieldElementFp

// constructor
function ECFieldElementFp(q,x) {
    this.x = x;
    // TODO if(x.compareTo(q) >= 0) error
    this.q = q;
}

function feFpEquals(other) {
    if(other == this) return true;
    return (this.q.equals(other.q) && this.x.equals(other.x));
}

function feFpToBigInteger() {
    return this.x;
}

function feFpNegate() {
    return new ECFieldElementFp(this.q, this.x.negate().mod(this.q));
}

function feFpAdd(b) {
    return new ECFieldElementFp(this.q, this.x.add(b.toBigInteger()).mod(this.q));
}

function feFpSubtract(b) {
    return new ECFieldElementFp(this.q, this.x.subtract(b.toBigInteger()).mod(this.q));
}

function feFpMultiply(b) {
    return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger()).mod(this.q));
}

function feFpSquare() {
    return new ECFieldElementFp(this.q, this.x.square().mod(this.q));
}

function feFpDivide(b) {
    return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q));
}

ECFieldElementFp.prototype.equals = feFpEquals;
ECFieldElementFp.prototype.toBigInteger = feFpToBigInteger;
ECFieldElementFp.prototype.negate = feFpNegate;
ECFieldElementFp.prototype.add = feFpAdd;
ECFieldElementFp.prototype.subtract = feFpSubtract;
ECFieldElementFp.prototype.multiply = feFpMultiply;
ECFieldElementFp.prototype.square = feFpSquare;
ECFieldElementFp.prototype.divide = feFpDivide;

// ----------------
// ECPointFp

// constructor
function ECPointFp(curve,x,y,z) {
    this.curve = curve;
    this.x = x;
    this.y = y;
    // Projective coordinates: either zinv == null or z * zinv == 1
    // z and zinv are just BigIntegers, not fieldElements
    if(z == null) {
      this.z = BigInteger.ONE;
    }
    else {
      this.z = z;
    }
    this.zinv = null;
    //TODO: compression flag
}

function pointFpGetX() {
    if(this.zinv == null) {
      this.zinv = this.z.modInverse(this.curve.q);
    }
    var r = this.x.toBigInteger().multiply(this.zinv);
    this.curve.reduce(r);
    return this.curve.fromBigInteger(r);
}

function pointFpGetY() {
    if(this.zinv == null) {
      this.zinv = this.z.modInverse(this.curve.q);
    }
    var r = this.y.toBigInteger().multiply(this.zinv);
    this.curve.reduce(r);
    return this.curve.fromBigInteger(r);
}

function pointFpEquals(other) {
    if(other == this) return true;
    if(this.isInfinity()) return other.isInfinity();
    if(other.isInfinity()) return this.isInfinity();
    var u, v;
    // u = Y2 * Z1 - Y1 * Z2
    u = other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.q);
    if(!u.equals(BigInteger.ZERO)) return false;
    // v = X2 * Z1 - X1 * Z2
    v = other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.q);
    return v.equals(BigInteger.ZERO);
}

function pointFpIsInfinity() {
    if((this.x == null) && (this.y == null)) return true;
    return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO);
}

function pointFpNegate() {
    return new ECPointFp(this.curve, this.x, this.y.negate(), this.z);
}

function pointFpAdd(b) {
    if(this.isInfinity()) return b;
    if(b.isInfinity()) return this;

    // u = Y2 * Z1 - Y1 * Z2
    var u = b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.q);
    // v = X2 * Z1 - X1 * Z2
    var v = b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.q);

    if(BigInteger.ZERO.equals(v)) {
        if(BigInteger.ZERO.equals(u)) {
            return this.twice(); // this == b, so double
        }
	return this.curve.getInfinity(); // this = -b, so infinity
    }

    var THREE = new BigInteger("3");
    var x1 = this.x.toBigInteger();
    var y1 = this.y.toBigInteger();
    var x2 = b.x.toBigInteger();
    var y2 = b.y.toBigInteger();

    var v2 = v.square();
    var v3 = v2.multiply(v);
    var x1v2 = x1.multiply(v2);
    var zu2 = u.square().multiply(this.z);

    // x3 = v * (z2 * (z1 * u^2 - 2 * x1 * v^2) - v^3)
    var x3 = zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.q);
    // y3 = z2 * (3 * x1 * u * v^2 - y1 * v^3 - z1 * u^3) + u * v^3
    var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.q);
    // z3 = v^3 * z1 * z2
    var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.q);

    return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
}

function pointFpTwice() {
    if(this.isInfinity()) return this;
    if(this.y.toBigInteger().signum() == 0) return this.curve.getInfinity();

    // TODO: optimized handling of constants
    var THREE = new BigInteger("3");
    var x1 = this.x.toBigInteger();
    var y1 = this.y.toBigInteger();

    var y1z1 = y1.multiply(this.z);
    var y1sqz1 = y1z1.multiply(y1).mod(this.curve.q);
    var a = this.curve.a.toBigInteger();

    // w = 3 * x1^2 + a * z1^2
    var w = x1.square().multiply(THREE);
    if(!BigInteger.ZERO.equals(a)) {
      w = w.add(this.z.square().multiply(a));
    }
    w = w.mod(this.curve.q);
    //this.curve.reduce(w);
    // x3 = 2 * y1 * z1 * (w^2 - 8 * x1 * y1^2 * z1)
    var x3 = w.square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.q);
    // y3 = 4 * y1^2 * z1 * (3 * w * x1 - 2 * y1^2 * z1) - w^3
    var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.square().multiply(w)).mod(this.curve.q);
    // z3 = 8 * (y1 * z1)^3
    var z3 = y1z1.square().multiply(y1z1).shiftLeft(3).mod(this.curve.q);

    return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
}

// Simple NAF (Non-Adjacent Form) multiplication algorithm
// TODO: modularize the multiplication algorithm
function pointFpMultiply(k) {
    if(this.isInfinity()) return this;
    if(k.signum() == 0) return this.curve.getInfinity();

    var e = k;
    var h = e.multiply(new BigInteger("3"));

    var neg = this.negate();
    var R = this;

    var i;
    for(i = h.bitLength() - 2; i > 0; --i) {
	R = R.twice();

	var hBit = h.testBit(i);
	var eBit = e.testBit(i);

	if (hBit != eBit) {
	    R = R.add(hBit ? this : neg);
	}
    }

    return R;
}

// Compute this*j + x*k (simultaneous multiplication)
function pointFpMultiplyTwo(j,x,k) {
  var i;
  if(j.bitLength() > k.bitLength())
    i = j.bitLength() - 1;
  else
    i = k.bitLength() - 1;

  var R = this.curve.getInfinity();
  var both = this.add(x);
  while(i >= 0) {
    R = R.twice();
    if(j.testBit(i)) {
      if(k.testBit(i)) {
        R = R.add(both);
      }
      else {
        R = R.add(this);
      }
    }
    else {
      if(k.testBit(i)) {
        R = R.add(x);
      }
    }
    --i;
  }

  return R;
}

ECPointFp.prototype.getX = pointFpGetX;
ECPointFp.prototype.getY = pointFpGetY;
ECPointFp.prototype.equals = pointFpEquals;
ECPointFp.prototype.isInfinity = pointFpIsInfinity;
ECPointFp.prototype.negate = pointFpNegate;
ECPointFp.prototype.add = pointFpAdd;
ECPointFp.prototype.twice = pointFpTwice;
ECPointFp.prototype.multiply = pointFpMultiply;
ECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo;

// ----------------
// ECCurveFp

// constructor
function ECCurveFp(q,a,b) {
    this.q = q;
    this.a = this.fromBigInteger(a);
    this.b = this.fromBigInteger(b);
    this.infinity = new ECPointFp(this, null, null);
    this.reducer = new Barrett(this.q);
}

function curveFpGetQ() {
    return this.q;
}

function curveFpGetA() {
    return this.a;
}

function curveFpGetB() {
    return this.b;
}

function curveFpEquals(other) {
    if(other == this) return true;
    return(this.q.equals(other.q) && this.a.equals(other.a) && this.b.equals(other.b));
}

function curveFpGetInfinity() {
    return this.infinity;
}

function curveFpFromBigInteger(x) {
    return new ECFieldElementFp(this.q, x);
}

function curveReduce(x) {
    this.reducer.reduce(x);
}

// for now, work with hex strings because they're easier in JS
function curveFpDecodePointHex(s) {
    switch(parseInt(s.substr(0,2), 16)) { // first byte
    case 0:
	return this.infinity;
    case 2:
    case 3:
	// point compression not supported yet
	return null;
    case 4:
    case 6:
    case 7:
	var len = (s.length - 2) / 2;
	var xHex = s.substr(2, len);
	var yHex = s.substr(len+2, len);

	return new ECPointFp(this,
			     this.fromBigInteger(new BigInteger(xHex, 16)),
			     this.fromBigInteger(new BigInteger(yHex, 16)));

    default: // unsupported
	return null;
    }
}

function curveFpEncodePointHex(p) {
	if (p.isInfinity()) return "00";
	var xHex = p.getX().toBigInteger().toString(16);
	var yHex = p.getY().toBigInteger().toString(16);
	var oLen = this.getQ().toString(16).length;
	if ((oLen % 2) != 0) oLen++;
	while (xHex.length < oLen) {
		xHex = "0" + xHex;
	}
	while (yHex.length < oLen) {
		yHex = "0" + yHex;
	}
	return "04" + xHex + yHex;
}

ECCurveFp.prototype.getQ = curveFpGetQ;
ECCurveFp.prototype.getA = curveFpGetA;
ECCurveFp.prototype.getB = curveFpGetB;
ECCurveFp.prototype.equals = curveFpEquals;
ECCurveFp.prototype.getInfinity = curveFpGetInfinity;
ECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger;
ECCurveFp.prototype.reduce = curveReduce;
//ECCurveFp.prototype.decodePointHex = curveFpDecodePointHex;
ECCurveFp.prototype.encodePointHex = curveFpEncodePointHex;

// from: https://github.com/kaielvin/jsbn-ec-point-compression
ECCurveFp.prototype.decodePointHex = function(s)
{
	var yIsEven;
    switch(parseInt(s.substr(0,2), 16)) { // first byte
    case 0:
	return this.infinity;
    case 2:
	yIsEven = false;
    case 3:
	if(yIsEven == undefined) yIsEven = true;
	var len = s.length - 2;
	var xHex = s.substr(2, len);
	var x = this.fromBigInteger(new BigInteger(xHex,16));
	var alpha = x.multiply(x.square().add(this.getA())).add(this.getB());
	var beta = alpha.sqrt();

    if (beta == null) throw "Invalid point compression";

    var betaValue = beta.toBigInteger();
    if (betaValue.testBit(0) != yIsEven)
    {
        // Use the other root
        beta = this.fromBigInteger(this.getQ().subtract(betaValue));
    }
    return new ECPointFp(this,x,beta);
    case 4:
    case 6:
    case 7:
	var len = (s.length - 2) / 2;
	var xHex = s.substr(2, len);
	var yHex = s.substr(len+2, len);

	return new ECPointFp(this,
			     this.fromBigInteger(new BigInteger(xHex, 16)),
			     this.fromBigInteger(new BigInteger(yHex, 16)));

    default: // unsupported
	return null;
    }
}
ECCurveFp.prototype.encodeCompressedPointHex = function(p)
{
	if (p.isInfinity()) return "00";
	var xHex = p.getX().toBigInteger().toString(16);
	var oLen = this.getQ().toString(16).length;
	if ((oLen % 2) != 0) oLen++;
	while (xHex.length < oLen)
		xHex = "0" + xHex;
	var yPrefix;
	if(p.getY().toBigInteger().isEven()) yPrefix = "02";
	else                                 yPrefix = "03";

	return yPrefix + xHex;
}


ECFieldElementFp.prototype.getR = function()
{
	if(this.r != undefined) return this.r;

    this.r = null;
    var bitLength = this.q.bitLength();
    if (bitLength > 128)
    {
        var firstWord = this.q.shiftRight(bitLength - 64);
        if (firstWord.intValue() == -1)
        {
            this.r = BigInteger.ONE.shiftLeft(bitLength).subtract(this.q);
        }
    }
    return this.r;
}
ECFieldElementFp.prototype.modMult = function(x1,x2)
{
    return this.modReduce(x1.multiply(x2));
}
ECFieldElementFp.prototype.modReduce = function(x)
{
    if (this.getR() != null)
    {
        var qLen = q.bitLength();
        while (x.bitLength() > (qLen + 1))
        {
            var u = x.shiftRight(qLen);
            var v = x.subtract(u.shiftLeft(qLen));
            if (!this.getR().equals(BigInteger.ONE))
            {
                u = u.multiply(this.getR());
            }
            x = u.add(v); 
        }
        while (x.compareTo(q) >= 0)
        {
            x = x.subtract(q);
        }
    }
    else
    {
        x = x.mod(q);
    }
    return x;
}
ECFieldElementFp.prototype.sqrt = function()
{
    if (!this.q.testBit(0)) throw "unsupported";

    // p mod 4 == 3
    if (this.q.testBit(1))
    {
    	var z = new ECFieldElementFp(this.q,this.x.modPow(this.q.shiftRight(2).add(BigInteger.ONE),this.q));
    	return z.square().equals(this) ? z : null;
    }

    // p mod 4 == 1
    var qMinusOne = this.q.subtract(BigInteger.ONE);

    var legendreExponent = qMinusOne.shiftRight(1);
    if (!(this.x.modPow(legendreExponent, this.q).equals(BigInteger.ONE)))
    {
        return null;
    }

    var u = qMinusOne.shiftRight(2);
    var k = u.shiftLeft(1).add(BigInteger.ONE);

    var Q = this.x;
    var fourQ = modDouble(modDouble(Q));

    var U, V;
    do
    {
        var P;
        do
        {
            P = new BigInteger(this.q.bitLength(), new SecureRandom());
        }
        while (P.compareTo(this.q) >= 0
            || !(P.multiply(P).subtract(fourQ).modPow(legendreExponent, this.q).equals(qMinusOne)));

        var result = this.lucasSequence(P, Q, k);
        U = result[0];
        V = result[1];

        if (this.modMult(V, V).equals(fourQ))
        {
            // Integer division by 2, mod q
            if (V.testBit(0))
            {
                V = V.add(q);
            }

            V = V.shiftRight(1);

            return new ECFieldElementFp(q,V);
        }
    }
    while (U.equals(BigInteger.ONE) || U.equals(qMinusOne));

    return null;
}
ECFieldElementFp.prototype.lucasSequence = function(P,Q,k)
{
    var n = k.bitLength();
    var s = k.getLowestSetBit();

    var Uh = BigInteger.ONE;
    var Vl = BigInteger.TWO;
    var Vh = P;
    var Ql = BigInteger.ONE;
    var Qh = BigInteger.ONE;

    for (var j = n - 1; j >= s + 1; --j)
    {
        Ql = this.modMult(Ql, Qh);

        if (k.testBit(j))
        {
            Qh = this.modMult(Ql, Q);
            Uh = this.modMult(Uh, Vh);
            Vl = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql)));
            Vh = this.modReduce(Vh.multiply(Vh).subtract(Qh.shiftLeft(1)));
        }
        else
        {
            Qh = Ql;
            Uh = this.modReduce(Uh.multiply(Vl).subtract(Ql));
            Vh = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql)));
            Vl = this.modReduce(Vl.multiply(Vl).subtract(Ql.shiftLeft(1)));
        }
    }

    Ql = this.modMult(Ql, Qh);
    Qh = this.modMult(Ql, Q);
    Uh = this.modReduce(Uh.multiply(Vl).subtract(Ql));
    Vl = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql)));
    Ql = this.modMult(Ql, Qh);

    for (var j = 1; j <= s; ++j)
    {
        Uh = this.modMult(Uh, Vl);
        Vl = this.modReduce(Vl.multiply(Vl).subtract(Ql.shiftLeft(1)));
        Ql = this.modMult(Ql, Ql);
    }

    return [ Uh, Vl ];
}

var exports = {
  ECCurveFp: ECCurveFp,
  ECPointFp: ECPointFp,
  ECFieldElementFp: ECFieldElementFp
}

module.exports = exports
// Named EC curves

// Requires ec.js, jsbn.js, and jsbn2.js
var BigInteger = require('jsbn').BigInteger
var ECCurveFp = require('./ec.js').ECCurveFp


// ----------------
// X9ECParameters

// constructor
function X9ECParameters(curve,g,n,h) {
    this.curve = curve;
    this.g = g;
    this.n = n;
    this.h = h;
}

function x9getCurve() {
    return this.curve;
}

function x9getG() {
    return this.g;
}

function x9getN() {
    return this.n;
}

function x9getH() {
    return this.h;
}

X9ECParameters.prototype.getCurve = x9getCurve;
X9ECParameters.prototype.getG = x9getG;
X9ECParameters.prototype.getN = x9getN;
X9ECParameters.prototype.getH = x9getH;

// ----------------
// SECNamedCurves

function fromHex(s) { return new BigInteger(s, 16); }

function secp128r1() {
    // p = 2^128 - 2^97 - 1
    var p = fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF");
    var a = fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC");
    var b = fromHex("E87579C11079F43DD824993C2CEE5ED3");
    //byte[] S = Hex.decode("000E0D4D696E6768756151750CC03A4473D03679");
    var n = fromHex("FFFFFFFE0000000075A30D1B9038A115");
    var h = BigInteger.ONE;
    var curve = new ECCurveFp(p, a, b);
    var G = curve.decodePointHex("04"
                + "161FF7528B899B2D0C28607CA52C5B86"
		+ "CF5AC8395BAFEB13C02DA292DDED7A83");
    return new X9ECParameters(curve, G, n, h);
}

function secp160k1() {
    // p = 2^160 - 2^32 - 2^14 - 2^12 - 2^9 - 2^8 - 2^7 - 2^3 - 2^2 - 1
    var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73");
    var a = BigInteger.ZERO;
    var b = fromHex("7");
    //byte[] S = null;
    var n = fromHex("0100000000000000000001B8FA16DFAB9ACA16B6B3");
    var h = BigInteger.ONE;
    var curve = new ECCurveFp(p, a, b);
    var G = curve.decodePointHex("04"
                + "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB"
                + "938CF935318FDCED6BC28286531733C3F03C4FEE");
    return new X9ECParameters(curve, G, n, h);
}

function secp160r1() {
    // p = 2^160 - 2^31 - 1
    var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF");
    var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC");
    var b = fromHex("1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45");
    //byte[] S = Hex.decode("1053CDE42C14D696E67687561517533BF3F83345");
    var n = fromHex("0100000000000000000001F4C8F927AED3CA752257");
    var h = BigInteger.ONE;
    var curve = new ECCurveFp(p, a, b);
    var G = curve.decodePointHex("04"
		+ "4A96B5688EF573284664698968C38BB913CBFC82"
		+ "23A628553168947D59DCC912042351377AC5FB32");
    return new X9ECParameters(curve, G, n, h);
}

function secp192k1() {
    // p = 2^192 - 2^32 - 2^12 - 2^8 - 2^7 - 2^6 - 2^3 - 1
    var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37");
    var a = BigInteger.ZERO;
    var b = fromHex("3");
    //byte[] S = null;
    var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D");
    var h = BigInteger.ONE;
    var curve = new ECCurveFp(p, a, b);
    var G = curve.decodePointHex("04"
                + "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D"
                + "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D");
    return new X9ECParameters(curve, G, n, h);
}

function secp192r1() {
    // p = 2^192 - 2^64 - 1
    var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF");
    var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC");
    var b = fromHex("64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1");
    //byte[] S = Hex.decode("3045AE6FC8422F64ED579528D38120EAE12196D5");
    var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831");
    var h = BigInteger.ONE;
    var curve = new ECCurveFp(p, a, b);
    var G = curve.decodePointHex("04"
                + "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012"
                + "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811");
    return new X9ECParameters(curve, G, n, h);
}

function secp224r1() {
    // p = 2^224 - 2^96 + 1
    var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001");
    var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE");
    var b = fromHex("B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4");
    //byte[] S = Hex.decode("BD71344799D5C7FCDC45B59FA3B9AB8F6A948BC5");
    var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D");
    var h = BigInteger.ONE;
    var curve = new ECCurveFp(p, a, b);
    var G = curve.decodePointHex("04"
                + "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21"
                + "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34");
    return new X9ECParameters(curve, G, n, h);
}

function secp256r1() {
    // p = 2^224 (2^32 - 1) + 2^192 + 2^96 - 1
    var p = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF");
    var a = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC");
    var b = fromHex("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B");
    //byte[] S = Hex.decode("C49D360886E704936A6678E1139D26B7819F7E90");
    var n = fromHex("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551");
    var h = BigInteger.ONE;
    var curve = new ECCurveFp(p, a, b);
    var G = curve.decodePointHex("04"
                + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"
		+ "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5");
    return new X9ECParameters(curve, G, n, h);
}

// TODO: make this into a proper hashtable
function getSECCurveByName(name) {
    if(name == "secp128r1") return secp128r1();
    if(name == "secp160k1") return secp160k1();
    if(name == "secp160r1") return secp160r1();
    if(name == "secp192k1") return secp192k1();
    if(name == "secp192r1") return secp192r1();
    if(name == "secp224r1") return secp224r1();
    if(name == "secp256r1") return secp256r1();
    return null;
}

module.exports = {
  "secp128r1":secp128r1,
  "secp160k1":secp160k1,
  "secp160r1":secp160r1,
  "secp192k1":secp192k1,
  "secp192r1":secp192r1,
  "secp224r1":secp224r1,
  "secp256r1":secp256r1
}

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ejs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
/*
 * EJS Embedded JavaScript templates
 * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
*/

'use strict';

/**
 * @file Embedded JavaScript templating engine. {@link http://ejs.co}
 * @author Matthew Eernisse <mde@fleegix.org>
 * @author Tiancheng "Timothy" Gu <timothygu99@gmail.com>
 * @project EJS
 * @license {@link http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0}
 */

/**
 * EJS internal functions.
 *
 * Technically this "module" lies in the same file as {@link module:ejs}, for
 * the sake of organization all the private functions re grouped into this
 * module.
 *
 * @module ejs-internal
 * @private
 */

/**
 * Embedded JavaScript templating engine.
 *
 * @module ejs
 * @public
 */

var fs = require('fs');
var path = require('path');
var utils = require('./utils');

var scopeOptionWarned = false;
var _VERSION_STRING = require('../package.json').version;
var _DEFAULT_OPEN_DELIMITER = '<';
var _DEFAULT_CLOSE_DELIMITER = '>';
var _DEFAULT_DELIMITER = '%';
var _DEFAULT_LOCALS_NAME = 'locals';
var _NAME = 'ejs';
var _REGEX_STRING = '(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)';
var _OPTS_PASSABLE_WITH_DATA = ['delimiter', 'scope', 'context', 'debug', 'compileDebug',
  'client', '_with', 'rmWhitespace', 'strict', 'filename', 'async'];
// We don't allow 'cache' option to be passed in the data obj for
// the normal `render` call, but this is where Express 2 & 3 put it
// so we make an exception for `renderFile`
var _OPTS_PASSABLE_WITH_DATA_EXPRESS = _OPTS_PASSABLE_WITH_DATA.concat('cache');
var _BOM = /^\uFEFF/;

/**
 * EJS template function cache. This can be a LRU object from lru-cache NPM
 * module. By default, it is {@link module:utils.cache}, a simple in-process
 * cache that grows continuously.
 *
 * @type {Cache}
 */

exports.cache = utils.cache;

/**
 * Custom file loader. Useful for template preprocessing or restricting access
 * to a certain part of the filesystem.
 *
 * @type {fileLoader}
 */

exports.fileLoader = fs.readFileSync;

/**
 * Name of the object containing the locals.
 *
 * This variable is overridden by {@link Options}`.localsName` if it is not
 * `undefined`.
 *
 * @type {String}
 * @public
 */

exports.localsName = _DEFAULT_LOCALS_NAME;

/**
 * Promise implementation -- defaults to the native implementation if available
 * This is mostly just for testability
 *
 * @type {Function}
 * @public
 */

exports.promiseImpl = (new Function('return this;'))().Promise;

/**
 * Get the path to the included file from the parent file path and the
 * specified path.
 *
 * @param {String}  name     specified path
 * @param {String}  filename parent file path
 * @param {Boolean} isDir    parent file path whether is directory
 * @return {String}
 */
exports.resolveInclude = function(name, filename, isDir) {
  var dirname = path.dirname;
  var extname = path.extname;
  var resolve = path.resolve;
  var includePath = resolve(isDir ? filename : dirname(filename), name);
  var ext = extname(name);
  if (!ext) {
    includePath += '.ejs';
  }
  return includePath;
};

/**
 * Get the path to the included file by Options
 *
 * @param  {String}  path    specified path
 * @param  {Options} options compilation options
 * @return {String}
 */
function getIncludePath(path, options) {
  var includePath;
  var filePath;
  var views = options.views;
  var match = /^[A-Za-z]+:\\|^\//.exec(path);

  // Abs path
  if (match && match.length) {
    includePath = exports.resolveInclude(path.replace(/^\/*/,''), options.root || '/', true);
  }
  // Relative paths
  else {
    // Look relative to a passed filename first
    if (options.filename) {
      filePath = exports.resolveInclude(path, options.filename);
      if (fs.existsSync(filePath)) {
        includePath = filePath;
      }
    }
    // Then look in any views directories
    if (!includePath) {
      if (Array.isArray(views) && views.some(function (v) {
        filePath = exports.resolveInclude(path, v, true);
        return fs.existsSync(filePath);
      })) {
        includePath = filePath;
      }
    }
    if (!includePath) {
      throw new Error('Could not find the include file "' +
          options.escapeFunction(path) + '"');
    }
  }
  return includePath;
}

/**
 * Get the template from a string or a file, either compiled on-the-fly or
 * read from cache (if enabled), and cache the template if needed.
 *
 * If `template` is not set, the file specified in `options.filename` will be
 * read.
 *
 * If `options.cache` is true, this function reads the file from
 * `options.filename` so it must be set prior to calling this function.
 *
 * @memberof module:ejs-internal
 * @param {Options} options   compilation options
 * @param {String} [template] template source
 * @return {(TemplateFunction|ClientFunction)}
 * Depending on the value of `options.client`, either type might be returned.
 * @static
 */

function handleCache(options, template) {
  var func;
  var filename = options.filename;
  var hasTemplate = arguments.length > 1;

  if (options.cache) {
    if (!filename) {
      throw new Error('cache option requires a filename');
    }
    func = exports.cache.get(filename);
    if (func) {
      return func;
    }
    if (!hasTemplate) {
      template = fileLoader(filename).toString().replace(_BOM, '');
    }
  }
  else if (!hasTemplate) {
    // istanbul ignore if: should not happen at all
    if (!filename) {
      throw new Error('Internal EJS error: no file name or template '
                    + 'provided');
    }
    template = fileLoader(filename).toString().replace(_BOM, '');
  }
  func = exports.compile(template, options);
  if (options.cache) {
    exports.cache.set(filename, func);
  }
  return func;
}

/**
 * Try calling handleCache with the given options and data and call the
 * callback with the result. If an error occurs, call the callback with
 * the error. Used by renderFile().
 *
 * @memberof module:ejs-internal
 * @param {Options} options    compilation options
 * @param {Object} data        template data
 * @param {RenderFileCallback} cb callback
 * @static
 */

function tryHandleCache(options, data, cb) {
  var result;
  if (!cb) {
    if (typeof exports.promiseImpl == 'function') {
      return new exports.promiseImpl(function (resolve, reject) {
        try {
          result = handleCache(options)(data);
          resolve(result);
        }
        catch (err) {
          reject(err);
        }
      });
    }
    else {
      throw new Error('Please provide a callback function');
    }
  }
  else {
    try {
      result = handleCache(options)(data);
    }
    catch (err) {
      return cb(err);
    }

    cb(null, result);
  }
}

/**
 * fileLoader is independent
 *
 * @param {String} filePath ejs file path.
 * @return {String} The contents of the specified file.
 * @static
 */

function fileLoader(filePath){
  return exports.fileLoader(filePath);
}

/**
 * Get the template function.
 *
 * If `options.cache` is `true`, then the template is cached.
 *
 * @memberof module:ejs-internal
 * @param {String}  path    path for the specified file
 * @param {Options} options compilation options
 * @return {(TemplateFunction|ClientFunction)}
 * Depending on the value of `options.client`, either type might be returned
 * @static
 */

function includeFile(path, options) {
  var opts = utils.shallowCopy({}, options);
  opts.filename = getIncludePath(path, opts);
  return handleCache(opts);
}

/**
 * Get the JavaScript source of an included file.
 *
 * @memberof module:ejs-internal
 * @param {String}  path    path for the specified file
 * @param {Options} options compilation options
 * @return {Object}
 * @static
 */

function includeSource(path, options) {
  var opts = utils.shallowCopy({}, options);
  var includePath;
  var template;
  includePath = getIncludePath(path, opts);
  template = fileLoader(includePath).toString().replace(_BOM, '');
  opts.filename = includePath;
  var templ = new Template(template, opts);
  templ.generateSource();
  return {
    source: templ.source,
    filename: includePath,
    template: template
  };
}

/**
 * Re-throw the given `err` in context to the `str` of ejs, `filename`, and
 * `lineno`.
 *
 * @implements RethrowCallback
 * @memberof module:ejs-internal
 * @param {Error}  err      Error object
 * @param {String} str      EJS source
 * @param {String} filename file name of the EJS file
 * @param {String} lineno   line number of the error
 * @static
 */

function rethrow(err, str, flnm, lineno, esc){
  var lines = str.split('\n');
  var start = Math.max(lineno - 3, 0);
  var end = Math.min(lines.length, lineno + 3);
  var filename = esc(flnm); // eslint-disable-line
  // Error context
  var context = lines.slice(start, end).map(function (line, i){
    var curr = i + start + 1;
    return (curr == lineno ? ' >> ' : '    ')
      + curr
      + '| '
      + line;
  }).join('\n');

  // Alter exception message
  err.path = filename;
  err.message = (filename || 'ejs') + ':'
    + lineno + '\n'
    + context + '\n\n'
    + err.message;

  throw err;
}

function stripSemi(str){
  return str.replace(/;(\s*$)/, '$1');
}

/**
 * Compile the given `str` of ejs into a template function.
 *
 * @param {String}  template EJS template
 *
 * @param {Options} opts     compilation options
 *
 * @return {(TemplateFunction|ClientFunction)}
 * Depending on the value of `opts.client`, either type might be returned.
 * Note that the return type of the function also depends on the value of `opts.async`.
 * @public
 */

exports.compile = function compile(template, opts) {
  var templ;

  // v1 compat
  // 'scope' is 'context'
  // FIXME: Remove this in a future version
  if (opts && opts.scope) {
    if (!scopeOptionWarned){
      console.warn('`scope` option is deprecated and will be removed in EJS 3');
      scopeOptionWarned = true;
    }
    if (!opts.context) {
      opts.context = opts.scope;
    }
    delete opts.scope;
  }
  templ = new Template(template, opts);
  return templ.compile();
};

/**
 * Render the given `template` of ejs.
 *
 * If you would like to include options but not data, you need to explicitly
 * call this function with `data` being an empty object or `null`.
 *
 * @param {String}   template EJS template
 * @param {Object}  [data={}] template data
 * @param {Options} [opts={}] compilation and rendering options
 * @return {(String|Promise<String>)}
 * Return value type depends on `opts.async`.
 * @public
 */

exports.render = function (template, d, o) {
  var data = d || {};
  var opts = o || {};

  // No options object -- if there are optiony names
  // in the data, copy them to options
  if (arguments.length == 2) {
    utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA);
  }

  return handleCache(opts, template)(data);
};

/**
 * Render an EJS file at the given `path` and callback `cb(err, str)`.
 *
 * If you would like to include options but not data, you need to explicitly
 * call this function with `data` being an empty object or `null`.
 *
 * @param {String}             path     path to the EJS file
 * @param {Object}            [data={}] template data
 * @param {Options}           [opts={}] compilation and rendering options
 * @param {RenderFileCallback} cb callback
 * @public
 */

exports.renderFile = function () {
  var args = Array.prototype.slice.call(arguments);
  var filename = args.shift();
  var cb;
  var opts = {filename: filename};
  var data;
  var viewOpts;

  // Do we have a callback?
  if (typeof arguments[arguments.length - 1] == 'function') {
    cb = args.pop();
  }
  // Do we have data/opts?
  if (args.length) {
    // Should always have data obj
    data = args.shift();
    // Normal passed opts (data obj + opts obj)
    if (args.length) {
      // Use shallowCopy so we don't pollute passed in opts obj with new vals
      utils.shallowCopy(opts, args.pop());
    }
    // Special casing for Express (settings + opts-in-data)
    else {
      // Express 3 and 4
      if (data.settings) {
        // Pull a few things from known locations
        if (data.settings.views) {
          opts.views = data.settings.views;
        }
        if (data.settings['view cache']) {
          opts.cache = true;
        }
        // Undocumented after Express 2, but still usable, esp. for
        // items that are unsafe to be passed along with data, like `root`
        viewOpts = data.settings['view options'];
        if (viewOpts) {
          utils.shallowCopy(opts, viewOpts);
        }
      }
      // Express 2 and lower, values set in app.locals, or people who just
      // want to pass options in their data. NOTE: These values will override
      // anything previously set in settings  or settings['view options']
      utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA_EXPRESS);
    }
    opts.filename = filename;
  }
  else {
    data = {};
  }

  return tryHandleCache(opts, data, cb);
};

/**
 * Clear intermediate JavaScript cache. Calls {@link Cache#reset}.
 * @public
 */

/**
 * EJS template class
 * @public
 */
exports.Template = Template;

exports.clearCache = function () {
  exports.cache.reset();
};

function Template(text, opts) {
  opts = opts || {};
  var options = {};
  this.templateText = text;
  this.mode = null;
  this.truncate = false;
  this.currentLine = 1;
  this.source = '';
  this.dependencies = [];
  options.client = opts.client || false;
  options.escapeFunction = opts.escape || opts.escapeFunction || utils.escapeXML;
  options.compileDebug = opts.compileDebug !== false;
  options.debug = !!opts.debug;
  options.filename = opts.filename;
  options.openDelimiter = opts.openDelimiter || exports.openDelimiter || _DEFAULT_OPEN_DELIMITER;
  options.closeDelimiter = opts.closeDelimiter || exports.closeDelimiter || _DEFAULT_CLOSE_DELIMITER;
  options.delimiter = opts.delimiter || exports.delimiter || _DEFAULT_DELIMITER;
  options.strict = opts.strict || false;
  options.context = opts.context;
  options.cache = opts.cache || false;
  options.rmWhitespace = opts.rmWhitespace;
  options.root = opts.root;
  options.outputFunctionName = opts.outputFunctionName;
  options.localsName = opts.localsName || exports.localsName || _DEFAULT_LOCALS_NAME;
  options.views = opts.views;
  options.async = opts.async;
  options.destructuredLocals = opts.destructuredLocals;
  options.legacyInclude = typeof opts.legacyInclude != 'undefined' ? !!opts.legacyInclude : true;

  if (options.strict) {
    options._with = false;
  }
  else {
    options._with = typeof opts._with != 'undefined' ? opts._with : true;
  }

  this.opts = options;

  this.regex = this.createRegex();
}

Template.modes = {
  EVAL: 'eval',
  ESCAPED: 'escaped',
  RAW: 'raw',
  COMMENT: 'comment',
  LITERAL: 'literal'
};

Template.prototype = {
  createRegex: function () {
    var str = _REGEX_STRING;
    var delim = utils.escapeRegExpChars(this.opts.delimiter);
    var open = utils.escapeRegExpChars(this.opts.openDelimiter);
    var close = utils.escapeRegExpChars(this.opts.closeDelimiter);
    str = str.replace(/%/g, delim)
      .replace(/</g, open)
      .replace(/>/g, close);
    return new RegExp(str);
  },

  compile: function () {
    var src;
    var fn;
    var opts = this.opts;
    var prepended = '';
    var appended = '';
    var escapeFn = opts.escapeFunction;
    var ctor;

    if (!this.source) {
      this.generateSource();
      prepended +=
        '  var __output = "";\n' +
        '  function __append(s) { if (s !== undefined && s !== null) __output += s }\n';
      if (opts.outputFunctionName) {
        prepended += '  var ' + opts.outputFunctionName + ' = __append;' + '\n';
      }
      if (opts.destructuredLocals && opts.destructuredLocals.length) {
        var destructuring = '  var __locals = (' + opts.localsName + ' || {}),\n';
        for (var i = 0; i < opts.destructuredLocals.length; i++) {
          var name = opts.destructuredLocals[i];
          if (i > 0) {
            destructuring += ',\n  ';
          }
          destructuring += name + ' = __locals.' + name;
        }
        prepended += destructuring + ';\n';
      }
      if (opts._with !== false) {
        prepended +=  '  with (' + opts.localsName + ' || {}) {' + '\n';
        appended += '  }' + '\n';
      }
      appended += '  return __output;' + '\n';
      this.source = prepended + this.source + appended;
    }

    if (opts.compileDebug) {
      src = 'var __line = 1' + '\n'
        + '  , __lines = ' + JSON.stringify(this.templateText) + '\n'
        + '  , __filename = ' + (opts.filename ?
        JSON.stringify(opts.filename) : 'undefined') + ';' + '\n'
        + 'try {' + '\n'
        + this.source
        + '} catch (e) {' + '\n'
        + '  rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
        + '}' + '\n';
    }
    else {
      src = this.source;
    }

    if (opts.client) {
      src = 'escapeFn = escapeFn || ' + escapeFn.toString() + ';' + '\n' + src;
      if (opts.compileDebug) {
        src = 'rethrow = rethrow || ' + rethrow.toString() + ';' + '\n' + src;
      }
    }

    if (opts.strict) {
      src = '"use strict";\n' + src;
    }
    if (opts.debug) {
      console.log(src);
    }
    if (opts.compileDebug && opts.filename) {
      src = src + '\n'
        + '//# sourceURL=' + opts.filename + '\n';
    }

    try {
      if (opts.async) {
        // Have to use generated function for this, since in envs without support,
        // it breaks in parsing
        try {
          ctor = (new Function('return (async function(){}).constructor;'))();
        }
        catch(e) {
          if (e instanceof SyntaxError) {
            throw new Error('This environment does not support async/await');
          }
          else {
            throw e;
          }
        }
      }
      else {
        ctor = Function;
      }
      fn = new ctor(opts.localsName + ', escapeFn, include, rethrow', src);
    }
    catch(e) {
      // istanbul ignore else
      if (e instanceof SyntaxError) {
        if (opts.filename) {
          e.message += ' in ' + opts.filename;
        }
        e.message += ' while compiling ejs\n\n';
        e.message += 'If the above error is not helpful, you may want to try EJS-Lint:\n';
        e.message += 'https://github.com/RyanZim/EJS-Lint';
        if (!opts.async) {
          e.message += '\n';
          e.message += 'Or, if you meant to create an async function, pass `async: true` as an option.';
        }
      }
      throw e;
    }

    // Return a callable function which will execute the function
    // created by the source-code, with the passed data as locals
    // Adds a local `include` function which allows full recursive include
    var returnedFn = opts.client ? fn : function anonymous(data) {
      var include = function (path, includeData) {
        var d = utils.shallowCopy({}, data);
        if (includeData) {
          d = utils.shallowCopy(d, includeData);
        }
        return includeFile(path, opts)(d);
      };
      return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]);
    };
    returnedFn.dependencies = this.dependencies;
    if (opts.filename && typeof Object.defineProperty === 'function') {
      var filename = opts.filename;
      var basename = path.basename(filename, path.extname(filename));
      try {
        Object.defineProperty(returnedFn, 'name', {
          value: basename,
          writable: false,
          enumerable: false,
          configurable: true
        });
      } catch (e) {/* ignore */}
    }
    return returnedFn;
  },

  generateSource: function () {
    var opts = this.opts;

    if (opts.rmWhitespace) {
      // Have to use two separate replace here as `^` and `$` operators don't
      // work well with `\r` and empty lines don't work well with the `m` flag.
      this.templateText =
        this.templateText.replace(/[\r\n]+/g, '\n').replace(/^\s+|\s+$/gm, '');
    }

    // Slurp spaces and tabs before <%_ and after _%>
    this.templateText =
      this.templateText.replace(/[ \t]*<%_/gm, '<%_').replace(/_%>[ \t]*/gm, '_%>');

    var self = this;
    var matches = this.parseTemplateText();
    var d = this.opts.delimiter;
    var o = this.opts.openDelimiter;
    var c = this.opts.closeDelimiter;

    if (matches && matches.length) {
      matches.forEach(function (line, index) {
        var opening;
        var closing;
        var include;
        var includeOpts;
        var includeObj;
        var includeSrc;
        // If this is an opening tag, check for closing tags
        // FIXME: May end up with some false positives here
        // Better to store modes as k/v with openDelimiter + delimiter as key
        // Then this can simply check against the map
        if ( line.indexOf(o + d) === 0        // If it is a tag
          && line.indexOf(o + d + d) !== 0) { // and is not escaped
          closing = matches[index + 2];
          if (!(closing == d + c || closing == '-' + d + c || closing == '_' + d + c)) {
            throw new Error('Could not find matching close tag for "' + line + '".');
          }
        }
        // HACK: backward-compat `include` preprocessor directives
        if (opts.legacyInclude && (include = line.match(/^\s*include\s+(\S+)/))) {
          opening = matches[index - 1];
          // Must be in EVAL or RAW mode
          if (opening && (opening == o + d || opening == o + d + '-' || opening == o + d + '_')) {
            includeOpts = utils.shallowCopy({}, self.opts);
            includeObj = includeSource(include[1], includeOpts);
            if (self.opts.compileDebug) {
              includeSrc =
                  '    ; (function(){' + '\n'
                  + '      var __line = 1' + '\n'
                  + '      , __lines = ' + JSON.stringify(includeObj.template) + '\n'
                  + '      , __filename = ' + JSON.stringify(includeObj.filename) + ';' + '\n'
                  + '      try {' + '\n'
                  + includeObj.source
                  + '      } catch (e) {' + '\n'
                  + '        rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
                  + '      }' + '\n'
                  + '    ; }).call(this)' + '\n';
            }else{
              includeSrc = '    ; (function(){' + '\n' + includeObj.source +
                  '    ; }).call(this)' + '\n';
            }
            self.source += includeSrc;
            self.dependencies.push(exports.resolveInclude(include[1],
              includeOpts.filename));
            return;
          }
        }
        self.scanLine(line);
      });
    }

  },

  parseTemplateText: function () {
    var str = this.templateText;
    var pat = this.regex;
    var result = pat.exec(str);
    var arr = [];
    var firstPos;

    while (result) {
      firstPos = result.index;

      if (firstPos !== 0) {
        arr.push(str.substring(0, firstPos));
        str = str.slice(firstPos);
      }

      arr.push(result[0]);
      str = str.slice(result[0].length);
      result = pat.exec(str);
    }

    if (str) {
      arr.push(str);
    }

    return arr;
  },

  _addOutput: function (line) {
    if (this.truncate) {
      // Only replace single leading linebreak in the line after
      // -%> tag -- this is the single, trailing linebreak
      // after the tag that the truncation mode replaces
      // Handle Win / Unix / old Mac linebreaks -- do the \r\n
      // combo first in the regex-or
      line = line.replace(/^(?:\r\n|\r|\n)/, '');
      this.truncate = false;
    }
    if (!line) {
      return line;
    }

    // Preserve literal slashes
    line = line.replace(/\\/g, '\\\\');

    // Convert linebreaks
    line = line.replace(/\n/g, '\\n');
    line = line.replace(/\r/g, '\\r');

    // Escape double-quotes
    // - this will be the delimiter during execution
    line = line.replace(/"/g, '\\"');
    this.source += '    ; __append("' + line + '")' + '\n';
  },

  scanLine: function (line) {
    var self = this;
    var d = this.opts.delimiter;
    var o = this.opts.openDelimiter;
    var c = this.opts.closeDelimiter;
    var newLineCount = 0;

    newLineCount = (line.split('\n').length - 1);

    switch (line) {
    case o + d:
    case o + d + '_':
      this.mode = Template.modes.EVAL;
      break;
    case o + d + '=':
      this.mode = Template.modes.ESCAPED;
      break;
    case o + d + '-':
      this.mode = Template.modes.RAW;
      break;
    case o + d + '#':
      this.mode = Template.modes.COMMENT;
      break;
    case o + d + d:
      this.mode = Template.modes.LITERAL;
      this.source += '    ; __append("' + line.replace(o + d + d, o + d) + '")' + '\n';
      break;
    case d + d + c:
      this.mode = Template.modes.LITERAL;
      this.source += '    ; __append("' + line.replace(d + d + c, d + c) + '")' + '\n';
      break;
    case d + c:
    case '-' + d + c:
    case '_' + d + c:
      if (this.mode == Template.modes.LITERAL) {
        this._addOutput(line);
      }

      this.mode = null;
      this.truncate = line.indexOf('-') === 0 || line.indexOf('_') === 0;
      break;
    default:
      // In script mode, depends on type of tag
      if (this.mode) {
        // If '//' is found without a line break, add a line break.
        switch (this.mode) {
        case Template.modes.EVAL:
        case Template.modes.ESCAPED:
        case Template.modes.RAW:
          if (line.lastIndexOf('//') > line.lastIndexOf('\n')) {
            line += '\n';
          }
        }
        switch (this.mode) {
        // Just executing code
        case Template.modes.EVAL:
          this.source += '    ; ' + line + '\n';
          break;
          // Exec, esc, and output
        case Template.modes.ESCAPED:
          this.source += '    ; __append(escapeFn(' + stripSemi(line) + '))' + '\n';
          break;
          // Exec and output
        case Template.modes.RAW:
          this.source += '    ; __append(' + stripSemi(line) + ')' + '\n';
          break;
        case Template.modes.COMMENT:
          // Do nothing
          break;
          // Literal <%% mode, append as raw output
        case Template.modes.LITERAL:
          this._addOutput(line);
          break;
        }
      }
      // In string mode, just add the output
      else {
        this._addOutput(line);
      }
    }

    if (self.opts.compileDebug && newLineCount) {
      this.currentLine += newLineCount;
      this.source += '    ; __line = ' + this.currentLine + '\n';
    }
  }
};

/**
 * Escape characters reserved in XML.
 *
 * This is simply an export of {@link module:utils.escapeXML}.
 *
 * If `markup` is `undefined` or `null`, the empty string is returned.
 *
 * @param {String} markup Input string
 * @return {String} Escaped string
 * @public
 * @func
 * */
exports.escapeXML = utils.escapeXML;

/**
 * Express.js support.
 *
 * This is an alias for {@link module:ejs.renderFile}, in order to support
 * Express.js out-of-the-box.
 *
 * @func
 */

exports.__express = exports.renderFile;

// Add require support
/* istanbul ignore else */
if (require.extensions) {
  require.extensions['.ejs'] = function (module, flnm) {
    console.log('Deprecated: this API will go away in EJS v2.8');
    var filename = flnm || /* istanbul ignore next */ module.filename;
    var options = {
      filename: filename,
      client: true
    };
    var template = fileLoader(filename).toString();
    var fn = exports.compile(template, options);
    module._compile('module.exports = ' + fn.toString() + ';', filename);
  };
}

/**
 * Version of EJS.
 *
 * @readonly
 * @type {String}
 * @public
 */

exports.VERSION = _VERSION_STRING;

/**
 * Name for detection of EJS.
 *
 * @readonly
 * @type {String}
 * @public
 */

exports.name = _NAME;

/* istanbul ignore if */
if (typeof window != 'undefined') {
  window.ejs = exports;
}

},{"../package.json":6,"./utils":2,"fs":3,"path":4}],2:[function(require,module,exports){
/*
 * EJS Embedded JavaScript templates
 * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
 *
 * 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.
 *
*/

/**
 * Private utility functions
 * @module utils
 * @private
 */

'use strict';

var regExpChars = /[|\\{}()[\]^$+*?.]/g;

/**
 * Escape characters reserved in regular expressions.
 *
 * If `string` is `undefined` or `null`, the empty string is returned.
 *
 * @param {String} string Input string
 * @return {String} Escaped string
 * @static
 * @private
 */
exports.escapeRegExpChars = function (string) {
  // istanbul ignore if
  if (!string) {
    return '';
  }
  return String(string).replace(regExpChars, '\\$&');
};

var _ENCODE_HTML_RULES = {
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&#34;',
  "'": '&#39;'
};
var _MATCH_HTML = /[&<>'"]/g;

function encode_char(c) {
  return _ENCODE_HTML_RULES[c] || c;
}

/**
 * Stringified version of constants used by {@link module:utils.escapeXML}.
 *
 * It is used in the process of generating {@link ClientFunction}s.
 *
 * @readonly
 * @type {String}
 */

var escapeFuncStr =
  'var _ENCODE_HTML_RULES = {\n'
+ '      "&": "&amp;"\n'
+ '    , "<": "&lt;"\n'
+ '    , ">": "&gt;"\n'
+ '    , \'"\': "&#34;"\n'
+ '    , "\'": "&#39;"\n'
+ '    }\n'
+ '  , _MATCH_HTML = /[&<>\'"]/g;\n'
+ 'function encode_char(c) {\n'
+ '  return _ENCODE_HTML_RULES[c] || c;\n'
+ '};\n';

/**
 * Escape characters reserved in XML.
 *
 * If `markup` is `undefined` or `null`, the empty string is returned.
 *
 * @implements {EscapeCallback}
 * @param {String} markup Input string
 * @return {String} Escaped string
 * @static
 * @private
 */

exports.escapeXML = function (markup) {
  return markup == undefined
    ? ''
    : String(markup)
      .replace(_MATCH_HTML, encode_char);
};
exports.escapeXML.toString = function () {
  return Function.prototype.toString.call(this) + ';\n' + escapeFuncStr;
};

/**
 * Naive copy of properties from one object to another.
 * Does not recurse into non-scalar properties
 * Does not check to see if the property has a value before copying
 *
 * @param  {Object} to   Destination object
 * @param  {Object} from Source object
 * @return {Object}      Destination object
 * @static
 * @private
 */
exports.shallowCopy = function (to, from) {
  from = from || {};
  for (var p in from) {
    to[p] = from[p];
  }
  return to;
};

/**
 * Naive copy of a list of key names, from one object to another.
 * Only copies property if it is actually defined
 * Does not recurse into non-scalar properties
 *
 * @param  {Object} to   Destination object
 * @param  {Object} from Source object
 * @param  {Array} list List of properties to copy
 * @return {Object}      Destination object
 * @static
 * @private
 */
exports.shallowCopyFromList = function (to, from, list) {
  for (var i = 0; i < list.length; i++) {
    var p = list[i];
    if (typeof from[p] != 'undefined') {
      to[p] = from[p];
    }
  }
  return to;
};

/**
 * Simple in-process cache implementation. Does not implement limits of any
 * sort.
 *
 * @implements Cache
 * @static
 * @private
 */
exports.cache = {
  _data: {},
  set: function (key, val) {
    this._data[key] = val;
  },
  get: function (key) {
    return this._data[key];
  },
  remove: function (key) {
    delete this._data[key];
  },
  reset: function () {
    this._data = {};
  }
};

},{}],3:[function(require,module,exports){

},{}],4:[function(require,module,exports){
(function (process){
// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,
// backported and transplited with Babel, with backwards-compat fixes

// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// resolves . and .. elements in a path array with directory names there
// must be no slashes, empty elements, or device names (c:\) in the array
// (so also no leading and trailing slashes - it does not distinguish
// relative and absolute paths)
function normalizeArray(parts, allowAboveRoot) {
  // if the path tries to go above the root, `up` ends up > 0
  var up = 0;
  for (var i = parts.length - 1; i >= 0; i--) {
    var last = parts[i];
    if (last === '.') {
      parts.splice(i, 1);
    } else if (last === '..') {
      parts.splice(i, 1);
      up++;
    } else if (up) {
      parts.splice(i, 1);
      up--;
    }
  }

  // if the path is allowed to go above the root, restore leading ..s
  if (allowAboveRoot) {
    for (; up--; up) {
      parts.unshift('..');
    }
  }

  return parts;
}

// path.resolve([from ...], to)
// posix version
exports.resolve = function() {
  var resolvedPath = '',
      resolvedAbsolute = false;

  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
    var path = (i >= 0) ? arguments[i] : process.cwd();

    // Skip empty and invalid entries
    if (typeof path !== 'string') {
      throw new TypeError('Arguments to path.resolve must be strings');
    } else if (!path) {
      continue;
    }

    resolvedPath = path + '/' + resolvedPath;
    resolvedAbsolute = path.charAt(0) === '/';
  }

  // At this point the path should be resolved to a full absolute path, but
  // handle relative paths to be safe (might happen when process.cwd() fails)

  // Normalize the path
  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
    return !!p;
  }), !resolvedAbsolute).join('/');

  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
};

// path.normalize(path)
// posix version
exports.normalize = function(path) {
  var isAbsolute = exports.isAbsolute(path),
      trailingSlash = substr(path, -1) === '/';

  // Normalize the path
  path = normalizeArray(filter(path.split('/'), function(p) {
    return !!p;
  }), !isAbsolute).join('/');

  if (!path && !isAbsolute) {
    path = '.';
  }
  if (path && trailingSlash) {
    path += '/';
  }

  return (isAbsolute ? '/' : '') + path;
};

// posix version
exports.isAbsolute = function(path) {
  return path.charAt(0) === '/';
};

// posix version
exports.join = function() {
  var paths = Array.prototype.slice.call(arguments, 0);
  return exports.normalize(filter(paths, function(p, index) {
    if (typeof p !== 'string') {
      throw new TypeError('Arguments to path.join must be strings');
    }
    return p;
  }).join('/'));
};


// path.relative(from, to)
// posix version
exports.relative = function(from, to) {
  from = exports.resolve(from).substr(1);
  to = exports.resolve(to).substr(1);

  function trim(arr) {
    var start = 0;
    for (; start < arr.length; start++) {
      if (arr[start] !== '') break;
    }

    var end = arr.length - 1;
    for (; end >= 0; end--) {
      if (arr[end] !== '') break;
    }

    if (start > end) return [];
    return arr.slice(start, end - start + 1);
  }

  var fromParts = trim(from.split('/'));
  var toParts = trim(to.split('/'));

  var length = Math.min(fromParts.length, toParts.length);
  var samePartsLength = length;
  for (var i = 0; i < length; i++) {
    if (fromParts[i] !== toParts[i]) {
      samePartsLength = i;
      break;
    }
  }

  var outputParts = [];
  for (var i = samePartsLength; i < fromParts.length; i++) {
    outputParts.push('..');
  }

  outputParts = outputParts.concat(toParts.slice(samePartsLength));

  return outputParts.join('/');
};

exports.sep = '/';
exports.delimiter = ':';

exports.dirname = function (path) {
  if (typeof path !== 'string') path = path + '';
  if (path.length === 0) return '.';
  var code = path.charCodeAt(0);
  var hasRoot = code === 47 /*/*/;
  var end = -1;
  var matchedSlash = true;
  for (var i = path.length - 1; i >= 1; --i) {
    code = path.charCodeAt(i);
    if (code === 47 /*/*/) {
        if (!matchedSlash) {
          end = i;
          break;
        }
      } else {
      // We saw the first non-path separator
      matchedSlash = false;
    }
  }

  if (end === -1) return hasRoot ? '/' : '.';
  if (hasRoot && end === 1) {
    // return '//';
    // Backwards-compat fix:
    return '/';
  }
  return path.slice(0, end);
};

function basename(path) {
  if (typeof path !== 'string') path = path + '';

  var start = 0;
  var end = -1;
  var matchedSlash = true;
  var i;

  for (i = path.length - 1; i >= 0; --i) {
    if (path.charCodeAt(i) === 47 /*/*/) {
        // If we reached a path separator that was not part of a set of path
        // separators at the end of the string, stop now
        if (!matchedSlash) {
          start = i + 1;
          break;
        }
      } else if (end === -1) {
      // We saw the first non-path separator, mark this as the end of our
      // path component
      matchedSlash = false;
      end = i + 1;
    }
  }

  if (end === -1) return '';
  return path.slice(start, end);
}

// Uses a mixed approach for backwards-compatibility, as ext behavior changed
// in new Node.js versions, so only basename() above is backported here
exports.basename = function (path, ext) {
  var f = basename(path);
  if (ext && f.substr(-1 * ext.length) === ext) {
    f = f.substr(0, f.length - ext.length);
  }
  return f;
};

exports.extname = function (path) {
  if (typeof path !== 'string') path = path + '';
  var startDot = -1;
  var startPart = 0;
  var end = -1;
  var matchedSlash = true;
  // Track the state of characters (if any) we see before our first dot and
  // after any path separator we find
  var preDotState = 0;
  for (var i = path.length - 1; i >= 0; --i) {
    var code = path.charCodeAt(i);
    if (code === 47 /*/*/) {
        // If we reached a path separator that was not part of a set of path
        // separators at the end of the string, stop now
        if (!matchedSlash) {
          startPart = i + 1;
          break;
        }
        continue;
      }
    if (end === -1) {
      // We saw the first non-path separator, mark this as the end of our
      // extension
      matchedSlash = false;
      end = i + 1;
    }
    if (code === 46 /*.*/) {
        // If this is our first dot, mark it as the start of our extension
        if (startDot === -1)
          startDot = i;
        else if (preDotState !== 1)
          preDotState = 1;
    } else if (startDot !== -1) {
      // We saw a non-dot and non-path separator before our dot, so we should
      // have a good chance at having a non-empty extension
      preDotState = -1;
    }
  }

  if (startDot === -1 || end === -1 ||
      // We saw a non-dot character immediately before the dot
      preDotState === 0 ||
      // The (right-most) trimmed path component is exactly '..'
      preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
    return '';
  }
  return path.slice(startDot, end);
};

function filter (xs, f) {
    if (xs.filter) return xs.filter(f);
    var res = [];
    for (var i = 0; i < xs.length; i++) {
        if (f(xs[i], i, xs)) res.push(xs[i]);
    }
    return res;
}

// String.prototype.substr - negative index don't work in IE8
var substr = 'ab'.substr(-1) === 'b'
    ? function (str, start, len) { return str.substr(start, len) }
    : function (str, start, len) {
        if (start < 0) start = str.length + start;
        return str.substr(start, len);
    }
;

}).call(this,require('_process'))
},{"_process":5}],5:[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};

// cached from whatever global is present so that test runners that stub it
// don't break things.  But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals.  It's inside a
// function because try/catches deoptimize in certain engines.

var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout() {
    throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
    throw new Error('clearTimeout has not been defined');
}
(function () {
    try {
        if (typeof setTimeout === 'function') {
            cachedSetTimeout = setTimeout;
        } else {
            cachedSetTimeout = defaultSetTimout;
        }
    } catch (e) {
        cachedSetTimeout = defaultSetTimout;
    }
    try {
        if (typeof clearTimeout === 'function') {
            cachedClearTimeout = clearTimeout;
        } else {
            cachedClearTimeout = defaultClearTimeout;
        }
    } catch (e) {
        cachedClearTimeout = defaultClearTimeout;
    }
} ())
function runTimeout(fun) {
    if (cachedSetTimeout === setTimeout) {
        //normal enviroments in sane situations
        return setTimeout(fun, 0);
    }
    // if setTimeout wasn't available but was latter defined
    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
        cachedSetTimeout = setTimeout;
        return setTimeout(fun, 0);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedSetTimeout(fun, 0);
    } catch(e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
            return cachedSetTimeout.call(null, fun, 0);
        } catch(e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
            return cachedSetTimeout.call(this, fun, 0);
        }
    }


}
function runClearTimeout(marker) {
    if (cachedClearTimeout === clearTimeout) {
        //normal enviroments in sane situations
        return clearTimeout(marker);
    }
    // if clearTimeout wasn't available but was latter defined
    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
        cachedClearTimeout = clearTimeout;
        return clearTimeout(marker);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedClearTimeout(marker);
    } catch (e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
            return cachedClearTimeout.call(null, marker);
        } catch (e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
            return cachedClearTimeout.call(this, marker);
        }
    }



}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;

function cleanUpNextTick() {
    if (!draining || !currentQueue) {
        return;
    }
    draining = false;
    if (currentQueue.length) {
        queue = currentQueue.concat(queue);
    } else {
        queueIndex = -1;
    }
    if (queue.length) {
        drainQueue();
    }
}

function drainQueue() {
    if (draining) {
        return;
    }
    var timeout = runTimeout(cleanUpNextTick);
    draining = true;

    var len = queue.length;
    while(len) {
        currentQueue = queue;
        queue = [];
        while (++queueIndex < len) {
            if (currentQueue) {
                currentQueue[queueIndex].run();
            }
        }
        queueIndex = -1;
        len = queue.length;
    }
    currentQueue = null;
    draining = false;
    runClearTimeout(timeout);
}

process.nextTick = function (fun) {
    var args = new Array(arguments.length - 1);
    if (arguments.length > 1) {
        for (var i = 1; i < arguments.length; i++) {
            args[i - 1] = arguments[i];
        }
    }
    queue.push(new Item(fun, args));
    if (queue.length === 1 && !draining) {
        runTimeout(drainQueue);
    }
};

// v8 likes predictible objects
function Item(fun, array) {
    this.fun = fun;
    this.array = array;
}
Item.prototype.run = function () {
    this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;

process.listeners = function (name) { return [] }

process.binding = function (name) {
    throw new Error('process.binding is not supported');
};

process.cwd = function () { return '/' };
process.chdir = function (dir) {
    throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };

},{}],6:[function(require,module,exports){
module.exports={
  "name": "ejs",
  "description": "Embedded JavaScript templates",
  "keywords": [
    "template",
    "engine",
    "ejs"
  ],
  "version": "2.7.4",
  "author": "Matthew Eernisse <mde@fleegix.org> (http://fleegix.org)",
  "license": "Apache-2.0",
  "main": "./lib/ejs.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/mde/ejs.git"
  },
  "bugs": "https://github.com/mde/ejs/issues",
  "homepage": "https://github.com/mde/ejs",
  "dependencies": {},
  "devDependencies": {
    "browserify": "^13.1.1",
    "eslint": "^4.14.0",
    "git-directory-deploy": "^1.5.1",
    "jake": "^10.3.1",
    "jsdoc": "^3.4.0",
    "lru-cache": "^4.0.1",
    "mocha": "^5.0.5",
    "uglify-js": "^3.3.16"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "scripts": {
    "test": "mocha",
    "postinstall": "node ./postinstall.js"
  }
}

},{}]},{},[1])(1)
});
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ejs=f()}})(function(){var define,module,exports;return function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r}()({1:[function(require,module,exports){"use strict";var fs=require("fs");var path=require("path");var utils=require("./utils");var scopeOptionWarned=false;var _VERSION_STRING=require("../package.json").version;var _DEFAULT_OPEN_DELIMITER="<";var _DEFAULT_CLOSE_DELIMITER=">";var _DEFAULT_DELIMITER="%";var _DEFAULT_LOCALS_NAME="locals";var _NAME="ejs";var _REGEX_STRING="(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)";var _OPTS_PASSABLE_WITH_DATA=["delimiter","scope","context","debug","compileDebug","client","_with","rmWhitespace","strict","filename","async"];var _OPTS_PASSABLE_WITH_DATA_EXPRESS=_OPTS_PASSABLE_WITH_DATA.concat("cache");var _BOM=/^\uFEFF/;exports.cache=utils.cache;exports.fileLoader=fs.readFileSync;exports.localsName=_DEFAULT_LOCALS_NAME;exports.promiseImpl=new Function("return this;")().Promise;exports.resolveInclude=function(name,filename,isDir){var dirname=path.dirname;var extname=path.extname;var resolve=path.resolve;var includePath=resolve(isDir?filename:dirname(filename),name);var ext=extname(name);if(!ext){includePath+=".ejs"}return includePath};function getIncludePath(path,options){var includePath;var filePath;var views=options.views;var match=/^[A-Za-z]+:\\|^\//.exec(path);if(match&&match.length){includePath=exports.resolveInclude(path.replace(/^\/*/,""),options.root||"/",true)}else{if(options.filename){filePath=exports.resolveInclude(path,options.filename);if(fs.existsSync(filePath)){includePath=filePath}}if(!includePath){if(Array.isArray(views)&&views.some(function(v){filePath=exports.resolveInclude(path,v,true);return fs.existsSync(filePath)})){includePath=filePath}}if(!includePath){throw new Error('Could not find the include file "'+options.escapeFunction(path)+'"')}}return includePath}function handleCache(options,template){var func;var filename=options.filename;var hasTemplate=arguments.length>1;if(options.cache){if(!filename){throw new Error("cache option requires a filename")}func=exports.cache.get(filename);if(func){return func}if(!hasTemplate){template=fileLoader(filename).toString().replace(_BOM,"")}}else if(!hasTemplate){if(!filename){throw new Error("Internal EJS error: no file name or template "+"provided")}template=fileLoader(filename).toString().replace(_BOM,"")}func=exports.compile(template,options);if(options.cache){exports.cache.set(filename,func)}return func}function tryHandleCache(options,data,cb){var result;if(!cb){if(typeof exports.promiseImpl=="function"){return new exports.promiseImpl(function(resolve,reject){try{result=handleCache(options)(data);resolve(result)}catch(err){reject(err)}})}else{throw new Error("Please provide a callback function")}}else{try{result=handleCache(options)(data)}catch(err){return cb(err)}cb(null,result)}}function fileLoader(filePath){return exports.fileLoader(filePath)}function includeFile(path,options){var opts=utils.shallowCopy({},options);opts.filename=getIncludePath(path,opts);return handleCache(opts)}function includeSource(path,options){var opts=utils.shallowCopy({},options);var includePath;var template;includePath=getIncludePath(path,opts);template=fileLoader(includePath).toString().replace(_BOM,"");opts.filename=includePath;var templ=new Template(template,opts);templ.generateSource();return{source:templ.source,filename:includePath,template:template}}function rethrow(err,str,flnm,lineno,esc){var lines=str.split("\n");var start=Math.max(lineno-3,0);var end=Math.min(lines.length,lineno+3);var filename=esc(flnm);var context=lines.slice(start,end).map(function(line,i){var curr=i+start+1;return(curr==lineno?" >> ":"    ")+curr+"| "+line}).join("\n");err.path=filename;err.message=(filename||"ejs")+":"+lineno+"\n"+context+"\n\n"+err.message;throw err}function stripSemi(str){return str.replace(/;(\s*$)/,"$1")}exports.compile=function compile(template,opts){var templ;if(opts&&opts.scope){if(!scopeOptionWarned){console.warn("`scope` option is deprecated and will be removed in EJS 3");scopeOptionWarned=true}if(!opts.context){opts.context=opts.scope}delete opts.scope}templ=new Template(template,opts);return templ.compile()};exports.render=function(template,d,o){var data=d||{};var opts=o||{};if(arguments.length==2){utils.shallowCopyFromList(opts,data,_OPTS_PASSABLE_WITH_DATA)}return handleCache(opts,template)(data)};exports.renderFile=function(){var args=Array.prototype.slice.call(arguments);var filename=args.shift();var cb;var opts={filename:filename};var data;var viewOpts;if(typeof arguments[arguments.length-1]=="function"){cb=args.pop()}if(args.length){data=args.shift();if(args.length){utils.shallowCopy(opts,args.pop())}else{if(data.settings){if(data.settings.views){opts.views=data.settings.views}if(data.settings["view cache"]){opts.cache=true}viewOpts=data.settings["view options"];if(viewOpts){utils.shallowCopy(opts,viewOpts)}}utils.shallowCopyFromList(opts,data,_OPTS_PASSABLE_WITH_DATA_EXPRESS)}opts.filename=filename}else{data={}}return tryHandleCache(opts,data,cb)};exports.Template=Template;exports.clearCache=function(){exports.cache.reset()};function Template(text,opts){opts=opts||{};var options={};this.templateText=text;this.mode=null;this.truncate=false;this.currentLine=1;this.source="";this.dependencies=[];options.client=opts.client||false;options.escapeFunction=opts.escape||opts.escapeFunction||utils.escapeXML;options.compileDebug=opts.compileDebug!==false;options.debug=!!opts.debug;options.filename=opts.filename;options.openDelimiter=opts.openDelimiter||exports.openDelimiter||_DEFAULT_OPEN_DELIMITER;options.closeDelimiter=opts.closeDelimiter||exports.closeDelimiter||_DEFAULT_CLOSE_DELIMITER;options.delimiter=opts.delimiter||exports.delimiter||_DEFAULT_DELIMITER;options.strict=opts.strict||false;options.context=opts.context;options.cache=opts.cache||false;options.rmWhitespace=opts.rmWhitespace;options.root=opts.root;options.outputFunctionName=opts.outputFunctionName;options.localsName=opts.localsName||exports.localsName||_DEFAULT_LOCALS_NAME;options.views=opts.views;options.async=opts.async;options.destructuredLocals=opts.destructuredLocals;options.legacyInclude=typeof opts.legacyInclude!="undefined"?!!opts.legacyInclude:true;if(options.strict){options._with=false}else{options._with=typeof opts._with!="undefined"?opts._with:true}this.opts=options;this.regex=this.createRegex()}Template.modes={EVAL:"eval",ESCAPED:"escaped",RAW:"raw",COMMENT:"comment",LITERAL:"literal"};Template.prototype={createRegex:function(){var str=_REGEX_STRING;var delim=utils.escapeRegExpChars(this.opts.delimiter);var open=utils.escapeRegExpChars(this.opts.openDelimiter);var close=utils.escapeRegExpChars(this.opts.closeDelimiter);str=str.replace(/%/g,delim).replace(/</g,open).replace(/>/g,close);return new RegExp(str)},compile:function(){var src;var fn;var opts=this.opts;var prepended="";var appended="";var escapeFn=opts.escapeFunction;var ctor;if(!this.source){this.generateSource();prepended+='  var __output = "";\n'+"  function __append(s) { if (s !== undefined && s !== null) __output += s }\n";if(opts.outputFunctionName){prepended+="  var "+opts.outputFunctionName+" = __append;"+"\n"}if(opts.destructuredLocals&&opts.destructuredLocals.length){var destructuring="  var __locals = ("+opts.localsName+" || {}),\n";for(var i=0;i<opts.destructuredLocals.length;i++){var name=opts.destructuredLocals[i];if(i>0){destructuring+=",\n  "}destructuring+=name+" = __locals."+name}prepended+=destructuring+";\n"}if(opts._with!==false){prepended+="  with ("+opts.localsName+" || {}) {"+"\n";appended+="  }"+"\n"}appended+="  return __output;"+"\n";this.source=prepended+this.source+appended}if(opts.compileDebug){src="var __line = 1"+"\n"+"  , __lines = "+JSON.stringify(this.templateText)+"\n"+"  , __filename = "+(opts.filename?JSON.stringify(opts.filename):"undefined")+";"+"\n"+"try {"+"\n"+this.source+"} catch (e) {"+"\n"+"  rethrow(e, __lines, __filename, __line, escapeFn);"+"\n"+"}"+"\n"}else{src=this.source}if(opts.client){src="escapeFn = escapeFn || "+escapeFn.toString()+";"+"\n"+src;if(opts.compileDebug){src="rethrow = rethrow || "+rethrow.toString()+";"+"\n"+src}}if(opts.strict){src='"use strict";\n'+src}if(opts.debug){console.log(src)}if(opts.compileDebug&&opts.filename){src=src+"\n"+"//# sourceURL="+opts.filename+"\n"}try{if(opts.async){try{ctor=new Function("return (async function(){}).constructor;")()}catch(e){if(e instanceof SyntaxError){throw new Error("This environment does not support async/await")}else{throw e}}}else{ctor=Function}fn=new ctor(opts.localsName+", escapeFn, include, rethrow",src)}catch(e){if(e instanceof SyntaxError){if(opts.filename){e.message+=" in "+opts.filename}e.message+=" while compiling ejs\n\n";e.message+="If the above error is not helpful, you may want to try EJS-Lint:\n";e.message+="https://github.com/RyanZim/EJS-Lint";if(!opts.async){e.message+="\n";e.message+="Or, if you meant to create an async function, pass `async: true` as an option."}}throw e}var returnedFn=opts.client?fn:function anonymous(data){var include=function(path,includeData){var d=utils.shallowCopy({},data);if(includeData){d=utils.shallowCopy(d,includeData)}return includeFile(path,opts)(d)};return fn.apply(opts.context,[data||{},escapeFn,include,rethrow])};returnedFn.dependencies=this.dependencies;if(opts.filename&&typeof Object.defineProperty==="function"){var filename=opts.filename;var basename=path.basename(filename,path.extname(filename));try{Object.defineProperty(returnedFn,"name",{value:basename,writable:false,enumerable:false,configurable:true})}catch(e){}}return returnedFn},generateSource:function(){var opts=this.opts;if(opts.rmWhitespace){this.templateText=this.templateText.replace(/[\r\n]+/g,"\n").replace(/^\s+|\s+$/gm,"")}this.templateText=this.templateText.replace(/[ \t]*<%_/gm,"<%_").replace(/_%>[ \t]*/gm,"_%>");var self=this;var matches=this.parseTemplateText();var d=this.opts.delimiter;var o=this.opts.openDelimiter;var c=this.opts.closeDelimiter;if(matches&&matches.length){matches.forEach(function(line,index){var opening;var closing;var include;var includeOpts;var includeObj;var includeSrc;if(line.indexOf(o+d)===0&&line.indexOf(o+d+d)!==0){closing=matches[index+2];if(!(closing==d+c||closing=="-"+d+c||closing=="_"+d+c)){throw new Error('Could not find matching close tag for "'+line+'".')}}if(opts.legacyInclude&&(include=line.match(/^\s*include\s+(\S+)/))){opening=matches[index-1];if(opening&&(opening==o+d||opening==o+d+"-"||opening==o+d+"_")){includeOpts=utils.shallowCopy({},self.opts);includeObj=includeSource(include[1],includeOpts);if(self.opts.compileDebug){includeSrc="    ; (function(){"+"\n"+"      var __line = 1"+"\n"+"      , __lines = "+JSON.stringify(includeObj.template)+"\n"+"      , __filename = "+JSON.stringify(includeObj.filename)+";"+"\n"+"      try {"+"\n"+includeObj.source+"      } catch (e) {"+"\n"+"        rethrow(e, __lines, __filename, __line, escapeFn);"+"\n"+"      }"+"\n"+"    ; }).call(this)"+"\n"}else{includeSrc="    ; (function(){"+"\n"+includeObj.source+"    ; }).call(this)"+"\n"}self.source+=includeSrc;self.dependencies.push(exports.resolveInclude(include[1],includeOpts.filename));return}}self.scanLine(line)})}},parseTemplateText:function(){var str=this.templateText;var pat=this.regex;var result=pat.exec(str);var arr=[];var firstPos;while(result){firstPos=result.index;if(firstPos!==0){arr.push(str.substring(0,firstPos));str=str.slice(firstPos)}arr.push(result[0]);str=str.slice(result[0].length);result=pat.exec(str)}if(str){arr.push(str)}return arr},_addOutput:function(line){if(this.truncate){line=line.replace(/^(?:\r\n|\r|\n)/,"");this.truncate=false}if(!line){return line}line=line.replace(/\\/g,"\\\\");line=line.replace(/\n/g,"\\n");line=line.replace(/\r/g,"\\r");line=line.replace(/"/g,'\\"');this.source+='    ; __append("'+line+'")'+"\n"},scanLine:function(line){var self=this;var d=this.opts.delimiter;var o=this.opts.openDelimiter;var c=this.opts.closeDelimiter;var newLineCount=0;newLineCount=line.split("\n").length-1;switch(line){case o+d:case o+d+"_":this.mode=Template.modes.EVAL;break;case o+d+"=":this.mode=Template.modes.ESCAPED;break;case o+d+"-":this.mode=Template.modes.RAW;break;case o+d+"#":this.mode=Template.modes.COMMENT;break;case o+d+d:this.mode=Template.modes.LITERAL;this.source+='    ; __append("'+line.replace(o+d+d,o+d)+'")'+"\n";break;case d+d+c:this.mode=Template.modes.LITERAL;this.source+='    ; __append("'+line.replace(d+d+c,d+c)+'")'+"\n";break;case d+c:case"-"+d+c:case"_"+d+c:if(this.mode==Template.modes.LITERAL){this._addOutput(line)}this.mode=null;this.truncate=line.indexOf("-")===0||line.indexOf("_")===0;break;default:if(this.mode){switch(this.mode){case Template.modes.EVAL:case Template.modes.ESCAPED:case Template.modes.RAW:if(line.lastIndexOf("//")>line.lastIndexOf("\n")){line+="\n"}}switch(this.mode){case Template.modes.EVAL:this.source+="    ; "+line+"\n";break;case Template.modes.ESCAPED:this.source+="    ; __append(escapeFn("+stripSemi(line)+"))"+"\n";break;case Template.modes.RAW:this.source+="    ; __append("+stripSemi(line)+")"+"\n";break;case Template.modes.COMMENT:break;case Template.modes.LITERAL:this._addOutput(line);break}}else{this._addOutput(line)}}if(self.opts.compileDebug&&newLineCount){this.currentLine+=newLineCount;this.source+="    ; __line = "+this.currentLine+"\n"}}};exports.escapeXML=utils.escapeXML;exports.__express=exports.renderFile;if(require.extensions){require.extensions[".ejs"]=function(module,flnm){console.log("Deprecated: this API will go away in EJS v2.8");var filename=flnm||module.filename;var options={filename:filename,client:true};var template=fileLoader(filename).toString();var fn=exports.compile(template,options);module._compile("module.exports = "+fn.toString()+";",filename)}}exports.VERSION=_VERSION_STRING;exports.name=_NAME;if(typeof window!="undefined"){window.ejs=exports}},{"../package.json":6,"./utils":2,fs:3,path:4}],2:[function(require,module,exports){"use strict";var regExpChars=/[|\\{}()[\]^$+*?.]/g;exports.escapeRegExpChars=function(string){if(!string){return""}return String(string).replace(regExpChars,"\\$&")};var _ENCODE_HTML_RULES={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&#34;","'":"&#39;"};var _MATCH_HTML=/[&<>'"]/g;function encode_char(c){return _ENCODE_HTML_RULES[c]||c}var escapeFuncStr="var _ENCODE_HTML_RULES = {\n"+'      "&": "&amp;"\n'+'    , "<": "&lt;"\n'+'    , ">": "&gt;"\n'+'    , \'"\': "&#34;"\n'+'    , "\'": "&#39;"\n'+"    }\n"+"  , _MATCH_HTML = /[&<>'\"]/g;\n"+"function encode_char(c) {\n"+"  return _ENCODE_HTML_RULES[c] || c;\n"+"};\n";exports.escapeXML=function(markup){return markup==undefined?"":String(markup).replace(_MATCH_HTML,encode_char)};exports.escapeXML.toString=function(){return Function.prototype.toString.call(this)+";\n"+escapeFuncStr};exports.shallowCopy=function(to,from){from=from||{};for(var p in from){to[p]=from[p]}return to};exports.shallowCopyFromList=function(to,from,list){for(var i=0;i<list.length;i++){var p=list[i];if(typeof from[p]!="undefined"){to[p]=from[p]}}return to};exports.cache={_data:{},set:function(key,val){this._data[key]=val},get:function(key){return this._data[key]},remove:function(key){delete this._data[key]},reset:function(){this._data={}}}},{}],3:[function(require,module,exports){},{}],4:[function(require,module,exports){(function(process){function normalizeArray(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}exports.resolve=function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:process.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){continue}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=normalizeArray(filter(resolvedPath.split("/"),function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."};exports.normalize=function(path){var isAbsolute=exports.isAbsolute(path),trailingSlash=substr(path,-1)==="/";path=normalizeArray(filter(path.split("/"),function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path};exports.isAbsolute=function(path){return path.charAt(0)==="/"};exports.join=function(){var paths=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(paths,function(p,index){if(typeof p!=="string"){throw new TypeError("Arguments to path.join must be strings")}return p}).join("/"))};exports.relative=function(from,to){from=exports.resolve(from).substr(1);to=exports.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")};exports.sep="/";exports.delimiter=":";exports.dirname=function(path){if(typeof path!=="string")path=path+"";if(path.length===0)return".";var code=path.charCodeAt(0);var hasRoot=code===47;var end=-1;var matchedSlash=true;for(var i=path.length-1;i>=1;--i){code=path.charCodeAt(i);if(code===47){if(!matchedSlash){end=i;break}}else{matchedSlash=false}}if(end===-1)return hasRoot?"/":".";if(hasRoot&&end===1){return"/"}return path.slice(0,end)};function basename(path){if(typeof path!=="string")path=path+"";var start=0;var end=-1;var matchedSlash=true;var i;for(i=path.length-1;i>=0;--i){if(path.charCodeAt(i)===47){if(!matchedSlash){start=i+1;break}}else if(end===-1){matchedSlash=false;end=i+1}}if(end===-1)return"";return path.slice(start,end)}exports.basename=function(path,ext){var f=basename(path);if(ext&&f.substr(-1*ext.length)===ext){f=f.substr(0,f.length-ext.length)}return f};exports.extname=function(path){if(typeof path!=="string")path=path+"";var startDot=-1;var startPart=0;var end=-1;var matchedSlash=true;var preDotState=0;for(var i=path.length-1;i>=0;--i){var code=path.charCodeAt(i);if(code===47){if(!matchedSlash){startPart=i+1;break}continue}if(end===-1){matchedSlash=false;end=i+1}if(code===46){if(startDot===-1)startDot=i;else if(preDotState!==1)preDotState=1}else if(startDot!==-1){preDotState=-1}}if(startDot===-1||end===-1||preDotState===0||preDotState===1&&startDot===end-1&&startDot===startPart+1){return""}return path.slice(startDot,end)};function filter(xs,f){if(xs.filter)return xs.filter(f);var res=[];for(var i=0;i<xs.length;i++){if(f(xs[i],i,xs))res.push(xs[i])}return res}var substr="ab".substr(-1)==="b"?function(str,start,len){return str.substr(start,len)}:function(str,start,len){if(start<0)start=str.length+start;return str.substr(start,len)}}).call(this,require("_process"))},{_process:5}],5:[function(require,module,exports){var process=module.exports={};var cachedSetTimeout;var cachedClearTimeout;function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}(function(){try{if(typeof setTimeout==="function"){cachedSetTimeout=setTimeout}else{cachedSetTimeout=defaultSetTimout}}catch(e){cachedSetTimeout=defaultSetTimout}try{if(typeof clearTimeout==="function"){cachedClearTimeout=clearTimeout}else{cachedClearTimeout=defaultClearTimeout}}catch(e){cachedClearTimeout=defaultClearTimeout}})();function runTimeout(fun){if(cachedSetTimeout===setTimeout){return setTimeout(fun,0)}if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout){cachedSetTimeout=setTimeout;return setTimeout(fun,0)}try{return cachedSetTimeout(fun,0)}catch(e){try{return cachedSetTimeout.call(null,fun,0)}catch(e){return cachedSetTimeout.call(this,fun,0)}}}function runClearTimeout(marker){if(cachedClearTimeout===clearTimeout){return clearTimeout(marker)}if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout){cachedClearTimeout=clearTimeout;return clearTimeout(marker)}try{return cachedClearTimeout(marker)}catch(e){try{return cachedClearTimeout.call(null,marker)}catch(e){return cachedClearTimeout.call(this,marker)}}}var queue=[];var draining=false;var currentQueue;var queueIndex=-1;function cleanUpNextTick(){if(!draining||!currentQueue){return}draining=false;if(currentQueue.length){queue=currentQueue.concat(queue)}else{queueIndex=-1}if(queue.length){drainQueue()}}function drainQueue(){if(draining){return}var timeout=runTimeout(cleanUpNextTick);draining=true;var len=queue.length;while(len){currentQueue=queue;queue=[];while(++queueIndex<len){if(currentQueue){currentQueue[queueIndex].run()}}queueIndex=-1;len=queue.length}currentQueue=null;draining=false;runClearTimeout(timeout)}process.nextTick=function(fun){var args=new Array(arguments.length-1);if(arguments.length>1){for(var i=1;i<arguments.length;i++){args[i-1]=arguments[i]}}queue.push(new Item(fun,args));if(queue.length===1&&!draining){runTimeout(drainQueue)}};function Item(fun,array){this.fun=fun;this.array=array}Item.prototype.run=function(){this.fun.apply(null,this.array)};process.title="browser";process.browser=true;process.env={};process.argv=[];process.version="";process.versions={};function noop(){}process.on=noop;process.addListener=noop;process.once=noop;process.off=noop;process.removeListener=noop;process.removeAllListeners=noop;process.emit=noop;process.prependListener=noop;process.prependOnceListener=noop;process.listeners=function(name){return[]};process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")};process.umask=function(){return 0}},{}],6:[function(require,module,exports){module.exports={name:"ejs",description:"Embedded JavaScript templates",keywords:["template","engine","ejs"],version:"2.7.4",author:"Matthew Eernisse <mde@fleegix.org> (http://fleegix.org)",license:"Apache-2.0",main:"./lib/ejs.js",repository:{type:"git",url:"git://github.com/mde/ejs.git"},bugs:"https://github.com/mde/ejs/issues",homepage:"https://github.com/mde/ejs",dependencies:{},devDependencies:{browserify:"^13.1.1",eslint:"^4.14.0","git-directory-deploy":"^1.5.1",jake:"^10.3.1",jsdoc:"^3.4.0","lru-cache":"^4.0.1",mocha:"^5.0.5","uglify-js":"^3.3.16"},engines:{node:">=0.10.0"},scripts:{test:"mocha",postinstall:"node ./postinstall.js"}}},{}]},{},[1])(1)});
var fs = require('fs');
var execSync = require('child_process').execSync;
var exec = function (cmd) {
  execSync(cmd, {stdio: 'inherit'});
};

/* global jake, task, desc, publishTask */

task('build', ['lint', 'clean', 'browserify', 'minify'], function () {
  console.log('Build completed.');
});

desc('Cleans browerified/minified files and package files');
task('clean', ['clobber'], function () {
  jake.rmRf('./ejs.js');
  jake.rmRf('./ejs.min.js');
  console.log('Cleaned up compiled files.');
});

desc('Lints the source code');
task('lint', ['clean'], function () {
  exec('./node_modules/.bin/eslint "**/*.js"');
  console.log('Linting completed.');
});

task('browserify', function () {
  exec('./node_modules/browserify/bin/cmd.js --standalone ejs lib/ejs.js > ejs.js');
  console.log('Browserification completed.');
});

task('minify', function () {
  exec('./node_modules/uglify-js/bin/uglifyjs ejs.js > ejs.min.js');
  console.log('Minification completed.');
});

desc('Generates the EJS API docs');
task('doc', function (dev) {
  jake.rmRf('out');
  var p = dev ? '-p' : '';
  exec('./node_modules/.bin/jsdoc ' + p + ' -c jsdoc.json lib/* docs/jsdoc/*');
  console.log('Documentation generated.');
});

desc('Publishes the EJS API docs');
task('docPublish', ['doc'], function () {
  fs.writeFileSync('out/CNAME', 'api.ejs.co');
  console.log('Pushing docs to gh-pages...');
  exec('./node_modules/.bin/git-directory-deploy --directory out/');
  console.log('Docs published to gh-pages.');
});

desc('Runs the EJS test suite');
task('test', ['lint'], function () {
  exec('./node_modules/.bin/mocha');
});

publishTask('ejs', ['build'], function () {
  this.packageFiles.include([
    'jakefile.js',
    'README.md',
    'LICENSE',
    'package.json',
    'postinstall.js',
    'ejs.js',
    'ejs.min.js',
    'lib/**'
  ]);
});

jake.Task.publish.on('complete', function () {
  console.log('Updating hosted docs...');
  console.log('If this fails, run jake docPublish to re-try.');
  jake.Task.docPublish.invoke();
});
{
  "author": {
    "name": "Matthew Eernisse",
    "email": "mde@fleegix.org",
    "url": "http://fleegix.org"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Embedded JavaScript templates",
  "devDependencies": {
    "browserify": "^13.1.1",
    "eslint": "^4.14.0",
    "git-directory-deploy": "^1.5.1",
    "jake": "^10.3.1",
    "jsdoc": "^3.4.0",
    "lru-cache": "^4.0.1",
    "mocha": "^5.0.5",
    "uglify-js": "^3.3.16"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "homepage": "https://github.com/mde/ejs",
  "license": "Apache-2.0",
  "main": "./lib/ejs.js",
  "name": "ejs",
  "repository": {
    "type": "git",
    "url": "git://github.com/mde/ejs.git"
  },
  "version": "2.7.4"
}#!/usr/bin/env node

'use strict';

function isTrue(value) {
  return !!value && value !== '0' && value !== 'false';
}

let envDisable = isTrue(process.env.DISABLE_OPENCOLLECTIVE) || isTrue(process.env.CI);
let logLevel = process.env.npm_config_loglevel;
let logLevelDisplay = ['silent', 'error', 'warn'].indexOf(logLevel) > -1;

if (!envDisable && !logLevelDisplay) {
  console.log('Thank you for installing \u001b[35mEJS\u001b[0m: built with the \u001b[32mJake\u001b[0m JavaScript build tool (\u001b[32mhttps://jakejs.com/\u001b[0m)\n');
}


/*
 * EJS Embedded JavaScript templates
 * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
*/

'use strict';

/**
 * @file Embedded JavaScript templating engine. {@link http://ejs.co}
 * @author Matthew Eernisse <mde@fleegix.org>
 * @author Tiancheng "Timothy" Gu <timothygu99@gmail.com>
 * @project EJS
 * @license {@link http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0}
 */

/**
 * EJS internal functions.
 *
 * Technically this "module" lies in the same file as {@link module:ejs}, for
 * the sake of organization all the private functions re grouped into this
 * module.
 *
 * @module ejs-internal
 * @private
 */

/**
 * Embedded JavaScript templating engine.
 *
 * @module ejs
 * @public
 */

var fs = require('fs');
var path = require('path');
var utils = require('./utils');

var scopeOptionWarned = false;
var _VERSION_STRING = require('../package.json').version;
var _DEFAULT_OPEN_DELIMITER = '<';
var _DEFAULT_CLOSE_DELIMITER = '>';
var _DEFAULT_DELIMITER = '%';
var _DEFAULT_LOCALS_NAME = 'locals';
var _NAME = 'ejs';
var _REGEX_STRING = '(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)';
var _OPTS_PASSABLE_WITH_DATA = ['delimiter', 'scope', 'context', 'debug', 'compileDebug',
  'client', '_with', 'rmWhitespace', 'strict', 'filename', 'async'];
// We don't allow 'cache' option to be passed in the data obj for
// the normal `render` call, but this is where Express 2 & 3 put it
// so we make an exception for `renderFile`
var _OPTS_PASSABLE_WITH_DATA_EXPRESS = _OPTS_PASSABLE_WITH_DATA.concat('cache');
var _BOM = /^\uFEFF/;

/**
 * EJS template function cache. This can be a LRU object from lru-cache NPM
 * module. By default, it is {@link module:utils.cache}, a simple in-process
 * cache that grows continuously.
 *
 * @type {Cache}
 */

exports.cache = utils.cache;

/**
 * Custom file loader. Useful for template preprocessing or restricting access
 * to a certain part of the filesystem.
 *
 * @type {fileLoader}
 */

exports.fileLoader = fs.readFileSync;

/**
 * Name of the object containing the locals.
 *
 * This variable is overridden by {@link Options}`.localsName` if it is not
 * `undefined`.
 *
 * @type {String}
 * @public
 */

exports.localsName = _DEFAULT_LOCALS_NAME;

/**
 * Promise implementation -- defaults to the native implementation if available
 * This is mostly just for testability
 *
 * @type {Function}
 * @public
 */

exports.promiseImpl = (new Function('return this;'))().Promise;

/**
 * Get the path to the included file from the parent file path and the
 * specified path.
 *
 * @param {String}  name     specified path
 * @param {String}  filename parent file path
 * @param {Boolean} isDir    parent file path whether is directory
 * @return {String}
 */
exports.resolveInclude = function(name, filename, isDir) {
  var dirname = path.dirname;
  var extname = path.extname;
  var resolve = path.resolve;
  var includePath = resolve(isDir ? filename : dirname(filename), name);
  var ext = extname(name);
  if (!ext) {
    includePath += '.ejs';
  }
  return includePath;
};

/**
 * Get the path to the included file by Options
 *
 * @param  {String}  path    specified path
 * @param  {Options} options compilation options
 * @return {String}
 */
function getIncludePath(path, options) {
  var includePath;
  var filePath;
  var views = options.views;
  var match = /^[A-Za-z]+:\\|^\//.exec(path);

  // Abs path
  if (match && match.length) {
    includePath = exports.resolveInclude(path.replace(/^\/*/,''), options.root || '/', true);
  }
  // Relative paths
  else {
    // Look relative to a passed filename first
    if (options.filename) {
      filePath = exports.resolveInclude(path, options.filename);
      if (fs.existsSync(filePath)) {
        includePath = filePath;
      }
    }
    // Then look in any views directories
    if (!includePath) {
      if (Array.isArray(views) && views.some(function (v) {
        filePath = exports.resolveInclude(path, v, true);
        return fs.existsSync(filePath);
      })) {
        includePath = filePath;
      }
    }
    if (!includePath) {
      throw new Error('Could not find the include file "' +
          options.escapeFunction(path) + '"');
    }
  }
  return includePath;
}

/**
 * Get the template from a string or a file, either compiled on-the-fly or
 * read from cache (if enabled), and cache the template if needed.
 *
 * If `template` is not set, the file specified in `options.filename` will be
 * read.
 *
 * If `options.cache` is true, this function reads the file from
 * `options.filename` so it must be set prior to calling this function.
 *
 * @memberof module:ejs-internal
 * @param {Options} options   compilation options
 * @param {String} [template] template source
 * @return {(TemplateFunction|ClientFunction)}
 * Depending on the value of `options.client`, either type might be returned.
 * @static
 */

function handleCache(options, template) {
  var func;
  var filename = options.filename;
  var hasTemplate = arguments.length > 1;

  if (options.cache) {
    if (!filename) {
      throw new Error('cache option requires a filename');
    }
    func = exports.cache.get(filename);
    if (func) {
      return func;
    }
    if (!hasTemplate) {
      template = fileLoader(filename).toString().replace(_BOM, '');
    }
  }
  else if (!hasTemplate) {
    // istanbul ignore if: should not happen at all
    if (!filename) {
      throw new Error('Internal EJS error: no file name or template '
                    + 'provided');
    }
    template = fileLoader(filename).toString().replace(_BOM, '');
  }
  func = exports.compile(template, options);
  if (options.cache) {
    exports.cache.set(filename, func);
  }
  return func;
}

/**
 * Try calling handleCache with the given options and data and call the
 * callback with the result. If an error occurs, call the callback with
 * the error. Used by renderFile().
 *
 * @memberof module:ejs-internal
 * @param {Options} options    compilation options
 * @param {Object} data        template data
 * @param {RenderFileCallback} cb callback
 * @static
 */

function tryHandleCache(options, data, cb) {
  var result;
  if (!cb) {
    if (typeof exports.promiseImpl == 'function') {
      return new exports.promiseImpl(function (resolve, reject) {
        try {
          result = handleCache(options)(data);
          resolve(result);
        }
        catch (err) {
          reject(err);
        }
      });
    }
    else {
      throw new Error('Please provide a callback function');
    }
  }
  else {
    try {
      result = handleCache(options)(data);
    }
    catch (err) {
      return cb(err);
    }

    cb(null, result);
  }
}

/**
 * fileLoader is independent
 *
 * @param {String} filePath ejs file path.
 * @return {String} The contents of the specified file.
 * @static
 */

function fileLoader(filePath){
  return exports.fileLoader(filePath);
}

/**
 * Get the template function.
 *
 * If `options.cache` is `true`, then the template is cached.
 *
 * @memberof module:ejs-internal
 * @param {String}  path    path for the specified file
 * @param {Options} options compilation options
 * @return {(TemplateFunction|ClientFunction)}
 * Depending on the value of `options.client`, either type might be returned
 * @static
 */

function includeFile(path, options) {
  var opts = utils.shallowCopy({}, options);
  opts.filename = getIncludePath(path, opts);
  return handleCache(opts);
}

/**
 * Get the JavaScript source of an included file.
 *
 * @memberof module:ejs-internal
 * @param {String}  path    path for the specified file
 * @param {Options} options compilation options
 * @return {Object}
 * @static
 */

function includeSource(path, options) {
  var opts = utils.shallowCopy({}, options);
  var includePath;
  var template;
  includePath = getIncludePath(path, opts);
  template = fileLoader(includePath).toString().replace(_BOM, '');
  opts.filename = includePath;
  var templ = new Template(template, opts);
  templ.generateSource();
  return {
    source: templ.source,
    filename: includePath,
    template: template
  };
}

/**
 * Re-throw the given `err` in context to the `str` of ejs, `filename`, and
 * `lineno`.
 *
 * @implements RethrowCallback
 * @memberof module:ejs-internal
 * @param {Error}  err      Error object
 * @param {String} str      EJS source
 * @param {String} filename file name of the EJS file
 * @param {String} lineno   line number of the error
 * @static
 */

function rethrow(err, str, flnm, lineno, esc){
  var lines = str.split('\n');
  var start = Math.max(lineno - 3, 0);
  var end = Math.min(lines.length, lineno + 3);
  var filename = esc(flnm); // eslint-disable-line
  // Error context
  var context = lines.slice(start, end).map(function (line, i){
    var curr = i + start + 1;
    return (curr == lineno ? ' >> ' : '    ')
      + curr
      + '| '
      + line;
  }).join('\n');

  // Alter exception message
  err.path = filename;
  err.message = (filename || 'ejs') + ':'
    + lineno + '\n'
    + context + '\n\n'
    + err.message;

  throw err;
}

function stripSemi(str){
  return str.replace(/;(\s*$)/, '$1');
}

/**
 * Compile the given `str` of ejs into a template function.
 *
 * @param {String}  template EJS template
 *
 * @param {Options} opts     compilation options
 *
 * @return {(TemplateFunction|ClientFunction)}
 * Depending on the value of `opts.client`, either type might be returned.
 * Note that the return type of the function also depends on the value of `opts.async`.
 * @public
 */

exports.compile = function compile(template, opts) {
  var templ;

  // v1 compat
  // 'scope' is 'context'
  // FIXME: Remove this in a future version
  if (opts && opts.scope) {
    if (!scopeOptionWarned){
      console.warn('`scope` option is deprecated and will be removed in EJS 3');
      scopeOptionWarned = true;
    }
    if (!opts.context) {
      opts.context = opts.scope;
    }
    delete opts.scope;
  }
  templ = new Template(template, opts);
  return templ.compile();
};

/**
 * Render the given `template` of ejs.
 *
 * If you would like to include options but not data, you need to explicitly
 * call this function with `data` being an empty object or `null`.
 *
 * @param {String}   template EJS template
 * @param {Object}  [data={}] template data
 * @param {Options} [opts={}] compilation and rendering options
 * @return {(String|Promise<String>)}
 * Return value type depends on `opts.async`.
 * @public
 */

exports.render = function (template, d, o) {
  var data = d || {};
  var opts = o || {};

  // No options object -- if there are optiony names
  // in the data, copy them to options
  if (arguments.length == 2) {
    utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA);
  }

  return handleCache(opts, template)(data);
};

/**
 * Render an EJS file at the given `path` and callback `cb(err, str)`.
 *
 * If you would like to include options but not data, you need to explicitly
 * call this function with `data` being an empty object or `null`.
 *
 * @param {String}             path     path to the EJS file
 * @param {Object}            [data={}] template data
 * @param {Options}           [opts={}] compilation and rendering options
 * @param {RenderFileCallback} cb callback
 * @public
 */

exports.renderFile = function () {
  var args = Array.prototype.slice.call(arguments);
  var filename = args.shift();
  var cb;
  var opts = {filename: filename};
  var data;
  var viewOpts;

  // Do we have a callback?
  if (typeof arguments[arguments.length - 1] == 'function') {
    cb = args.pop();
  }
  // Do we have data/opts?
  if (args.length) {
    // Should always have data obj
    data = args.shift();
    // Normal passed opts (data obj + opts obj)
    if (args.length) {
      // Use shallowCopy so we don't pollute passed in opts obj with new vals
      utils.shallowCopy(opts, args.pop());
    }
    // Special casing for Express (settings + opts-in-data)
    else {
      // Express 3 and 4
      if (data.settings) {
        // Pull a few things from known locations
        if (data.settings.views) {
          opts.views = data.settings.views;
        }
        if (data.settings['view cache']) {
          opts.cache = true;
        }
        // Undocumented after Express 2, but still usable, esp. for
        // items that are unsafe to be passed along with data, like `root`
        viewOpts = data.settings['view options'];
        if (viewOpts) {
          utils.shallowCopy(opts, viewOpts);
        }
      }
      // Express 2 and lower, values set in app.locals, or people who just
      // want to pass options in their data. NOTE: These values will override
      // anything previously set in settings  or settings['view options']
      utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA_EXPRESS);
    }
    opts.filename = filename;
  }
  else {
    data = {};
  }

  return tryHandleCache(opts, data, cb);
};

/**
 * Clear intermediate JavaScript cache. Calls {@link Cache#reset}.
 * @public
 */

/**
 * EJS template class
 * @public
 */
exports.Template = Template;

exports.clearCache = function () {
  exports.cache.reset();
};

function Template(text, opts) {
  opts = opts || {};
  var options = {};
  this.templateText = text;
  this.mode = null;
  this.truncate = false;
  this.currentLine = 1;
  this.source = '';
  this.dependencies = [];
  options.client = opts.client || false;
  options.escapeFunction = opts.escape || opts.escapeFunction || utils.escapeXML;
  options.compileDebug = opts.compileDebug !== false;
  options.debug = !!opts.debug;
  options.filename = opts.filename;
  options.openDelimiter = opts.openDelimiter || exports.openDelimiter || _DEFAULT_OPEN_DELIMITER;
  options.closeDelimiter = opts.closeDelimiter || exports.closeDelimiter || _DEFAULT_CLOSE_DELIMITER;
  options.delimiter = opts.delimiter || exports.delimiter || _DEFAULT_DELIMITER;
  options.strict = opts.strict || false;
  options.context = opts.context;
  options.cache = opts.cache || false;
  options.rmWhitespace = opts.rmWhitespace;
  options.root = opts.root;
  options.outputFunctionName = opts.outputFunctionName;
  options.localsName = opts.localsName || exports.localsName || _DEFAULT_LOCALS_NAME;
  options.views = opts.views;
  options.async = opts.async;
  options.destructuredLocals = opts.destructuredLocals;
  options.legacyInclude = typeof opts.legacyInclude != 'undefined' ? !!opts.legacyInclude : true;

  if (options.strict) {
    options._with = false;
  }
  else {
    options._with = typeof opts._with != 'undefined' ? opts._with : true;
  }

  this.opts = options;

  this.regex = this.createRegex();
}

Template.modes = {
  EVAL: 'eval',
  ESCAPED: 'escaped',
  RAW: 'raw',
  COMMENT: 'comment',
  LITERAL: 'literal'
};

Template.prototype = {
  createRegex: function () {
    var str = _REGEX_STRING;
    var delim = utils.escapeRegExpChars(this.opts.delimiter);
    var open = utils.escapeRegExpChars(this.opts.openDelimiter);
    var close = utils.escapeRegExpChars(this.opts.closeDelimiter);
    str = str.replace(/%/g, delim)
      .replace(/</g, open)
      .replace(/>/g, close);
    return new RegExp(str);
  },

  compile: function () {
    var src;
    var fn;
    var opts = this.opts;
    var prepended = '';
    var appended = '';
    var escapeFn = opts.escapeFunction;
    var ctor;

    if (!this.source) {
      this.generateSource();
      prepended +=
        '  var __output = "";\n' +
        '  function __append(s) { if (s !== undefined && s !== null) __output += s }\n';
      if (opts.outputFunctionName) {
        prepended += '  var ' + opts.outputFunctionName + ' = __append;' + '\n';
      }
      if (opts.destructuredLocals && opts.destructuredLocals.length) {
        var destructuring = '  var __locals = (' + opts.localsName + ' || {}),\n';
        for (var i = 0; i < opts.destructuredLocals.length; i++) {
          var name = opts.destructuredLocals[i];
          if (i > 0) {
            destructuring += ',\n  ';
          }
          destructuring += name + ' = __locals.' + name;
        }
        prepended += destructuring + ';\n';
      }
      if (opts._with !== false) {
        prepended +=  '  with (' + opts.localsName + ' || {}) {' + '\n';
        appended += '  }' + '\n';
      }
      appended += '  return __output;' + '\n';
      this.source = prepended + this.source + appended;
    }

    if (opts.compileDebug) {
      src = 'var __line = 1' + '\n'
        + '  , __lines = ' + JSON.stringify(this.templateText) + '\n'
        + '  , __filename = ' + (opts.filename ?
        JSON.stringify(opts.filename) : 'undefined') + ';' + '\n'
        + 'try {' + '\n'
        + this.source
        + '} catch (e) {' + '\n'
        + '  rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
        + '}' + '\n';
    }
    else {
      src = this.source;
    }

    if (opts.client) {
      src = 'escapeFn = escapeFn || ' + escapeFn.toString() + ';' + '\n' + src;
      if (opts.compileDebug) {
        src = 'rethrow = rethrow || ' + rethrow.toString() + ';' + '\n' + src;
      }
    }

    if (opts.strict) {
      src = '"use strict";\n' + src;
    }
    if (opts.debug) {
      console.log(src);
    }
    if (opts.compileDebug && opts.filename) {
      src = src + '\n'
        + '//# sourceURL=' + opts.filename + '\n';
    }

    try {
      if (opts.async) {
        // Have to use generated function for this, since in envs without support,
        // it breaks in parsing
        try {
          ctor = (new Function('return (async function(){}).constructor;'))();
        }
        catch(e) {
          if (e instanceof SyntaxError) {
            throw new Error('This environment does not support async/await');
          }
          else {
            throw e;
          }
        }
      }
      else {
        ctor = Function;
      }
      fn = new ctor(opts.localsName + ', escapeFn, include, rethrow', src);
    }
    catch(e) {
      // istanbul ignore else
      if (e instanceof SyntaxError) {
        if (opts.filename) {
          e.message += ' in ' + opts.filename;
        }
        e.message += ' while compiling ejs\n\n';
        e.message += 'If the above error is not helpful, you may want to try EJS-Lint:\n';
        e.message += 'https://github.com/RyanZim/EJS-Lint';
        if (!opts.async) {
          e.message += '\n';
          e.message += 'Or, if you meant to create an async function, pass `async: true` as an option.';
        }
      }
      throw e;
    }

    // Return a callable function which will execute the function
    // created by the source-code, with the passed data as locals
    // Adds a local `include` function which allows full recursive include
    var returnedFn = opts.client ? fn : function anonymous(data) {
      var include = function (path, includeData) {
        var d = utils.shallowCopy({}, data);
        if (includeData) {
          d = utils.shallowCopy(d, includeData);
        }
        return includeFile(path, opts)(d);
      };
      return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]);
    };
    returnedFn.dependencies = this.dependencies;
    if (opts.filename && typeof Object.defineProperty === 'function') {
      var filename = opts.filename;
      var basename = path.basename(filename, path.extname(filename));
      try {
        Object.defineProperty(returnedFn, 'name', {
          value: basename,
          writable: false,
          enumerable: false,
          configurable: true
        });
      } catch (e) {/* ignore */}
    }
    return returnedFn;
  },

  generateSource: function () {
    var opts = this.opts;

    if (opts.rmWhitespace) {
      // Have to use two separate replace here as `^` and `$` operators don't
      // work well with `\r` and empty lines don't work well with the `m` flag.
      this.templateText =
        this.templateText.replace(/[\r\n]+/g, '\n').replace(/^\s+|\s+$/gm, '');
    }

    // Slurp spaces and tabs before <%_ and after _%>
    this.templateText =
      this.templateText.replace(/[ \t]*<%_/gm, '<%_').replace(/_%>[ \t]*/gm, '_%>');

    var self = this;
    var matches = this.parseTemplateText();
    var d = this.opts.delimiter;
    var o = this.opts.openDelimiter;
    var c = this.opts.closeDelimiter;

    if (matches && matches.length) {
      matches.forEach(function (line, index) {
        var opening;
        var closing;
        var include;
        var includeOpts;
        var includeObj;
        var includeSrc;
        // If this is an opening tag, check for closing tags
        // FIXME: May end up with some false positives here
        // Better to store modes as k/v with openDelimiter + delimiter as key
        // Then this can simply check against the map
        if ( line.indexOf(o + d) === 0        // If it is a tag
          && line.indexOf(o + d + d) !== 0) { // and is not escaped
          closing = matches[index + 2];
          if (!(closing == d + c || closing == '-' + d + c || closing == '_' + d + c)) {
            throw new Error('Could not find matching close tag for "' + line + '".');
          }
        }
        // HACK: backward-compat `include` preprocessor directives
        if (opts.legacyInclude && (include = line.match(/^\s*include\s+(\S+)/))) {
          opening = matches[index - 1];
          // Must be in EVAL or RAW mode
          if (opening && (opening == o + d || opening == o + d + '-' || opening == o + d + '_')) {
            includeOpts = utils.shallowCopy({}, self.opts);
            includeObj = includeSource(include[1], includeOpts);
            if (self.opts.compileDebug) {
              includeSrc =
                  '    ; (function(){' + '\n'
                  + '      var __line = 1' + '\n'
                  + '      , __lines = ' + JSON.stringify(includeObj.template) + '\n'
                  + '      , __filename = ' + JSON.stringify(includeObj.filename) + ';' + '\n'
                  + '      try {' + '\n'
                  + includeObj.source
                  + '      } catch (e) {' + '\n'
                  + '        rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
                  + '      }' + '\n'
                  + '    ; }).call(this)' + '\n';
            }else{
              includeSrc = '    ; (function(){' + '\n' + includeObj.source +
                  '    ; }).call(this)' + '\n';
            }
            self.source += includeSrc;
            self.dependencies.push(exports.resolveInclude(include[1],
              includeOpts.filename));
            return;
          }
        }
        self.scanLine(line);
      });
    }

  },

  parseTemplateText: function () {
    var str = this.templateText;
    var pat = this.regex;
    var result = pat.exec(str);
    var arr = [];
    var firstPos;

    while (result) {
      firstPos = result.index;

      if (firstPos !== 0) {
        arr.push(str.substring(0, firstPos));
        str = str.slice(firstPos);
      }

      arr.push(result[0]);
      str = str.slice(result[0].length);
      result = pat.exec(str);
    }

    if (str) {
      arr.push(str);
    }

    return arr;
  },

  _addOutput: function (line) {
    if (this.truncate) {
      // Only replace single leading linebreak in the line after
      // -%> tag -- this is the single, trailing linebreak
      // after the tag that the truncation mode replaces
      // Handle Win / Unix / old Mac linebreaks -- do the \r\n
      // combo first in the regex-or
      line = line.replace(/^(?:\r\n|\r|\n)/, '');
      this.truncate = false;
    }
    if (!line) {
      return line;
    }

    // Preserve literal slashes
    line = line.replace(/\\/g, '\\\\');

    // Convert linebreaks
    line = line.replace(/\n/g, '\\n');
    line = line.replace(/\r/g, '\\r');

    // Escape double-quotes
    // - this will be the delimiter during execution
    line = line.replace(/"/g, '\\"');
    this.source += '    ; __append("' + line + '")' + '\n';
  },

  scanLine: function (line) {
    var self = this;
    var d = this.opts.delimiter;
    var o = this.opts.openDelimiter;
    var c = this.opts.closeDelimiter;
    var newLineCount = 0;

    newLineCount = (line.split('\n').length - 1);

    switch (line) {
    case o + d:
    case o + d + '_':
      this.mode = Template.modes.EVAL;
      break;
    case o + d + '=':
      this.mode = Template.modes.ESCAPED;
      break;
    case o + d + '-':
      this.mode = Template.modes.RAW;
      break;
    case o + d + '#':
      this.mode = Template.modes.COMMENT;
      break;
    case o + d + d:
      this.mode = Template.modes.LITERAL;
      this.source += '    ; __append("' + line.replace(o + d + d, o + d) + '")' + '\n';
      break;
    case d + d + c:
      this.mode = Template.modes.LITERAL;
      this.source += '    ; __append("' + line.replace(d + d + c, d + c) + '")' + '\n';
      break;
    case d + c:
    case '-' + d + c:
    case '_' + d + c:
      if (this.mode == Template.modes.LITERAL) {
        this._addOutput(line);
      }

      this.mode = null;
      this.truncate = line.indexOf('-') === 0 || line.indexOf('_') === 0;
      break;
    default:
      // In script mode, depends on type of tag
      if (this.mode) {
        // If '//' is found without a line break, add a line break.
        switch (this.mode) {
        case Template.modes.EVAL:
        case Template.modes.ESCAPED:
        case Template.modes.RAW:
          if (line.lastIndexOf('//') > line.lastIndexOf('\n')) {
            line += '\n';
          }
        }
        switch (this.mode) {
        // Just executing code
        case Template.modes.EVAL:
          this.source += '    ; ' + line + '\n';
          break;
          // Exec, esc, and output
        case Template.modes.ESCAPED:
          this.source += '    ; __append(escapeFn(' + stripSemi(line) + '))' + '\n';
          break;
          // Exec and output
        case Template.modes.RAW:
          this.source += '    ; __append(' + stripSemi(line) + ')' + '\n';
          break;
        case Template.modes.COMMENT:
          // Do nothing
          break;
          // Literal <%% mode, append as raw output
        case Template.modes.LITERAL:
          this._addOutput(line);
          break;
        }
      }
      // In string mode, just add the output
      else {
        this._addOutput(line);
      }
    }

    if (self.opts.compileDebug && newLineCount) {
      this.currentLine += newLineCount;
      this.source += '    ; __line = ' + this.currentLine + '\n';
    }
  }
};

/**
 * Escape characters reserved in XML.
 *
 * This is simply an export of {@link module:utils.escapeXML}.
 *
 * If `markup` is `undefined` or `null`, the empty string is returned.
 *
 * @param {String} markup Input string
 * @return {String} Escaped string
 * @public
 * @func
 * */
exports.escapeXML = utils.escapeXML;

/**
 * Express.js support.
 *
 * This is an alias for {@link module:ejs.renderFile}, in order to support
 * Express.js out-of-the-box.
 *
 * @func
 */

exports.__express = exports.renderFile;

// Add require support
/* istanbul ignore else */
if (require.extensions) {
  require.extensions['.ejs'] = function (module, flnm) {
    console.log('Deprecated: this API will go away in EJS v2.8');
    var filename = flnm || /* istanbul ignore next */ module.filename;
    var options = {
      filename: filename,
      client: true
    };
    var template = fileLoader(filename).toString();
    var fn = exports.compile(template, options);
    module._compile('module.exports = ' + fn.toString() + ';', filename);
  };
}

/**
 * Version of EJS.
 *
 * @readonly
 * @type {String}
 * @public
 */

exports.VERSION = _VERSION_STRING;

/**
 * Name for detection of EJS.
 *
 * @readonly
 * @type {String}
 * @public
 */

exports.name = _NAME;

/* istanbul ignore if */
if (typeof window != 'undefined') {
  window.ejs = exports;
}
/*
 * EJS Embedded JavaScript templates
 * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
 *
 * 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.
 *
*/

/**
 * Private utility functions
 * @module utils
 * @private
 */

'use strict';

var regExpChars = /[|\\{}()[\]^$+*?.]/g;

/**
 * Escape characters reserved in regular expressions.
 *
 * If `string` is `undefined` or `null`, the empty string is returned.
 *
 * @param {String} string Input string
 * @return {String} Escaped string
 * @static
 * @private
 */
exports.escapeRegExpChars = function (string) {
  // istanbul ignore if
  if (!string) {
    return '';
  }
  return String(string).replace(regExpChars, '\\$&');
};

var _ENCODE_HTML_RULES = {
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&#34;',
  "'": '&#39;'
};
var _MATCH_HTML = /[&<>'"]/g;

function encode_char(c) {
  return _ENCODE_HTML_RULES[c] || c;
}

/**
 * Stringified version of constants used by {@link module:utils.escapeXML}.
 *
 * It is used in the process of generating {@link ClientFunction}s.
 *
 * @readonly
 * @type {String}
 */

var escapeFuncStr =
  'var _ENCODE_HTML_RULES = {\n'
+ '      "&": "&amp;"\n'
+ '    , "<": "&lt;"\n'
+ '    , ">": "&gt;"\n'
+ '    , \'"\': "&#34;"\n'
+ '    , "\'": "&#39;"\n'
+ '    }\n'
+ '  , _MATCH_HTML = /[&<>\'"]/g;\n'
+ 'function encode_char(c) {\n'
+ '  return _ENCODE_HTML_RULES[c] || c;\n'
+ '};\n';

/**
 * Escape characters reserved in XML.
 *
 * If `markup` is `undefined` or `null`, the empty string is returned.
 *
 * @implements {EscapeCallback}
 * @param {String} markup Input string
 * @return {String} Escaped string
 * @static
 * @private
 */

exports.escapeXML = function (markup) {
  return markup == undefined
    ? ''
    : String(markup)
      .replace(_MATCH_HTML, encode_char);
};
exports.escapeXML.toString = function () {
  return Function.prototype.toString.call(this) + ';\n' + escapeFuncStr;
};

/**
 * Naive copy of properties from one object to another.
 * Does not recurse into non-scalar properties
 * Does not check to see if the property has a value before copying
 *
 * @param  {Object} to   Destination object
 * @param  {Object} from Source object
 * @return {Object}      Destination object
 * @static
 * @private
 */
exports.shallowCopy = function (to, from) {
  from = from || {};
  for (var p in from) {
    to[p] = from[p];
  }
  return to;
};

/**
 * Naive copy of a list of key names, from one object to another.
 * Only copies property if it is actually defined
 * Does not recurse into non-scalar properties
 *
 * @param  {Object} to   Destination object
 * @param  {Object} from Source object
 * @param  {Array} list List of properties to copy
 * @return {Object}      Destination object
 * @static
 * @private
 */
exports.shallowCopyFromList = function (to, from, list) {
  for (var i = 0; i < list.length; i++) {
    var p = list[i];
    if (typeof from[p] != 'undefined') {
      to[p] = from[p];
    }
  }
  return to;
};

/**
 * Simple in-process cache implementation. Does not implement limits of any
 * sort.
 *
 * @implements Cache
 * @static
 * @private
 */
exports.cache = {
  _data: {},
  set: function (key, val) {
    this._data[key] = val;
  },
  get: function (key) {
    return this._data[key];
  },
  remove: function (key) {
    delete this._data[key];
  },
  reset: function () {
    this._data = {};
  }
};
{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "bin": {
    "electron-builder": "out/cli/cli.js",
    "build": "out/cli/cli.js",
    "install-app-deps": "out/cli/install-app-deps.js"
  },
  "dependencies": {
    "app-builder-lib": "20.44.4",
    "bluebird-lst": "^1.0.9",
    "builder-util": "10.1.2",
    "builder-util-runtime": "8.2.5",
    "chalk": "^2.4.2",
    "dmg-builder": "6.7.2",
    "fs-extra-p": "^8.0.2",
    "is-ci": "^2.0.0",
    "lazy-val": "^1.0.4",
    "read-config-file": "3.2.2",
    "sanitize-filename": "^1.6.1",
    "update-notifier": "^3.0.0",
    "yargs": "^13.2.4"
  },
  "deprecated": false,
  "description": "A complete solution to package and build a ready for distribution Electron app for MacOS, Windows and Linux with â€œauto updateâ€� support out of the box",
  "engines": {
    "node": ">=8.12.0"
  },
  "files": [
    "out"
  ],
  "homepage": "https://github.com/electron-userland/electron-builder",
  "license": "MIT",
  "main": "out/index.js",
  "name": "electron-builder",
  "publishConfig": {
    "tag": "next"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-builder.git"
  },
  "typings": "./out/index.d.ts",
  "version": "20.44.4"
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.normalizeOptions = normalizeOptions;
exports.coerceTypes = coerceTypes;
exports.createTargets = createTargets;
exports.build = build;
exports.configureBuildCommand = configureBuildCommand;

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

function _appBuilderLib() {
  const data = require("app-builder-lib");

  _appBuilderLib = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/** @internal */
function normalizeOptions(args) {
  if (args.extraMetadata != null) {
    throw new (_builderUtil().InvalidConfigurationError)("Please specify extraMetadata under config field");
  }

  if (args.targets != null) {
    return args;
  }

  if (args.draft != null || args.prerelease != null) {
    _builderUtil().log.warn({
      solution: "set releaseType (http://electron.build/configuration/publish#GithubOptions-releaseType) in the GitHub publish options"
    }, "--draft and --prerelease is deprecated");
  }

  let targets = new Map();

  function processTargets(platform, types) {
    function commonArch(currentIfNotSpecified) {
      if (platform === _appBuilderLib().Platform.MAC) {
        return args.x64 || currentIfNotSpecified ? [_builderUtil().Arch.x64] : [];
      }

      const result = Array();

      if (args.x64) {
        result.push(_builderUtil().Arch.x64);
      }

      if (args.armv7l) {
        result.push(_builderUtil().Arch.armv7l);
      }

      if (args.arm64) {
        result.push(_builderUtil().Arch.arm64);
      }

      if (args.ia32) {
        result.push(_builderUtil().Arch.ia32);
      }

      return result.length === 0 && currentIfNotSpecified ? [(0, _builderUtil().archFromString)(process.arch)] : result;
    }

    if (args.platform != null) {
      throw new (_builderUtil().InvalidConfigurationError)(`--platform cannot be used if --${platform.buildConfigurationKey} is passed`);
    }

    if (args.arch != null) {
      throw new (_builderUtil().InvalidConfigurationError)(`--arch cannot be used if --${platform.buildConfigurationKey} is passed`);
    }

    let archToType = targets.get(platform);

    if (archToType == null) {
      archToType = new Map();
      targets.set(platform, archToType);
    }

    if (types.length === 0) {
      const defaultTargetValue = args.dir ? [_appBuilderLib().DIR_TARGET] : [];

      for (const arch of commonArch(args.dir === true)) {
        archToType.set(arch, defaultTargetValue);
      }

      return;
    }

    for (const type of types) {
      const suffixPos = type.lastIndexOf(":");

      if (suffixPos > 0) {
        (0, _builderUtil().addValue)(archToType, (0, _builderUtil().archFromString)(type.substring(suffixPos + 1)), type.substring(0, suffixPos));
      } else {
        for (const arch of commonArch(true)) {
          (0, _builderUtil().addValue)(archToType, arch, type);
        }
      }
    }
  }

  if (args.mac != null) {
    processTargets(_appBuilderLib().Platform.MAC, args.mac);
  }

  if (args.linux != null) {
    processTargets(_appBuilderLib().Platform.LINUX, args.linux);
  }

  if (args.win != null) {
    processTargets(_appBuilderLib().Platform.WINDOWS, args.win);
  }

  if (targets.size === 0) {
    if (args.platform == null && args.arch == null) {
      processTargets(_appBuilderLib().Platform.current(), []);
    } else {
      targets = createTargets(normalizePlatforms(args.platform), args.dir ? _appBuilderLib().DIR_TARGET : null, args.arch);
    }
  }

  const result = Object.assign({}, args);
  result.targets = targets;
  delete result.dir;
  delete result.mac;
  delete result.linux;
  delete result.win;
  delete result.platform;
  delete result.arch;
  const r = result;
  delete r.m;
  delete r.o;
  delete r.l;
  delete r.w;
  delete r.windows;
  delete r.macos;
  delete r.$0;
  delete r._;
  delete r.version;
  delete r.help;
  delete r.c;
  delete r.p;
  delete r.pd;
  delete result.ia32;
  delete result.x64;
  delete result.armv7l;
  delete result.arm64;
  let config = result.config; // config is array when combining dot-notation values with a config file value
  // https://github.com/electron-userland/electron-builder/issues/2016

  if (Array.isArray(config)) {
    const newConfig = {};

    for (const configItem of config) {
      if (typeof configItem === "object") {
        (0, _builderUtil().deepAssign)(newConfig, configItem);
      } else if (typeof configItem === "string") {
        newConfig.extends = configItem;
      }
    }

    config = newConfig;
    result.config = newConfig;
  }

  if (config != null && typeof config !== "string") {
    if (config.extraMetadata != null) {
      coerceTypes(config.extraMetadata);
    }

    if (config.mac != null) {
      // ability to disable code sign using -c.mac.identity=null
      coerceValue(config.mac, "identity");
    }
  }

  if ("project" in r && !("projectDir" in result)) {
    result.projectDir = r.project;
  }

  delete r.project;
  return result;
}

function coerceValue(host, key) {
  const value = host[key];

  if (value === "true") {
    host[key] = true;
  } else if (value === "false") {
    host[key] = false;
  } else if (value === "null") {
    host[key] = null;
  } else if (key === "version" && typeof value === "number") {
    host[key] = value.toString();
  } else if (value != null && typeof value === "object") {
    coerceTypes(value);
  }
}
/** @private */


function coerceTypes(host) {
  for (const key of Object.getOwnPropertyNames(host)) {
    coerceValue(host, key);
  }

  return host;
}

function createTargets(platforms, type, arch) {
  const targets = new Map();

  for (const platform of platforms) {
    const archs = platform === _appBuilderLib().Platform.MAC ? [_builderUtil().Arch.x64] : arch === "all" ? [_builderUtil().Arch.x64, _builderUtil().Arch.ia32] : [(0, _builderUtil().archFromString)(arch == null ? process.arch : arch)];
    const archToType = new Map();
    targets.set(platform, archToType);

    for (const arch of archs) {
      archToType.set(arch, type == null ? [] : [type]);
    }
  }

  return targets;
}

function build(rawOptions) {
  const buildOptions = normalizeOptions(rawOptions || {});
  return (0, _appBuilderLib().build)(buildOptions, new (_appBuilderLib().Packager)(buildOptions));
}
/**
 * @private
 * @internal
 */


function configureBuildCommand(yargs) {
  const publishGroup = "Publishing:";
  const buildGroup = "Building:";
  const deprecated = "Deprecated:";
  return yargs.option("mac", {
    group: buildGroup,
    alias: ["m", "o", "macos"],
    description: `Build for macOS, accepts target list (see ${_chalk().default.underline("https://goo.gl/5uHuzj")}).`,
    type: "array"
  }).option("linux", {
    group: buildGroup,
    alias: "l",
    description: `Build for Linux, accepts target list (see ${_chalk().default.underline("https://goo.gl/4vwQad")})`,
    type: "array"
  }).option("win", {
    group: buildGroup,
    alias: ["w", "windows"],
    description: `Build for Windows, accepts target list (see ${_chalk().default.underline("https://goo.gl/jYsTEJ")})`,
    type: "array"
  }).option("x64", {
    group: buildGroup,
    description: "Build for x64",
    type: "boolean"
  }).option("ia32", {
    group: buildGroup,
    description: "Build for ia32",
    type: "boolean"
  }).option("armv7l", {
    group: buildGroup,
    description: "Build for armv7l",
    type: "boolean"
  }).option("arm64", {
    group: buildGroup,
    description: "Build for arm64",
    type: "boolean"
  }).option("dir", {
    group: buildGroup,
    description: "Build unpacked dir. Useful to test.",
    type: "boolean"
  }).option("publish", {
    group: publishGroup,
    alias: "p",
    description: `Publish artifacts, see ${_chalk().default.underline("https://goo.gl/tSFycD")}`,
    choices: ["onTag", "onTagOrDraft", "always", "never", undefined]
  }).option("draft", {
    group: deprecated,
    description: "Please set releaseType in the GitHub publish options instead",
    type: "boolean",
    default: undefined
  }).option("prerelease", {
    group: deprecated,
    description: "Please set releaseType in the GitHub publish options instead",
    type: "boolean",
    default: undefined
  }).option("platform", {
    group: deprecated,
    description: "The target platform (preferred to use --mac, --win or --linux)",
    choices: ["mac", "win", "linux", "darwin", "win32", "all", undefined]
  }).option("arch", {
    group: deprecated,
    description: "The target arch (preferred to use --x64 or --ia32)",
    choices: (0, _builderUtil().getArchCliNames)().concat("all", undefined)
  }).option("prepackaged", {
    alias: ["pd"],
    group: buildGroup,
    description: "The path to prepackaged app (to pack in a distributable format)"
  }).option("projectDir", {
    alias: ["project"],
    group: buildGroup,
    description: "The path to project directory. Defaults to current working directory."
  }).option("config", {
    alias: ["c"],
    group: buildGroup,
    description: "The path to an electron-builder config. Defaults to `electron-builder.yml` (or `json`, or `json5`), see " + _chalk().default.underline("https://goo.gl/YFRJOM")
  }).group(["help", "version"], "Other:").example("electron-builder -mwl", "build for macOS, Windows and Linux").example("electron-builder --linux deb tar.xz", "build deb and tar.xz for Linux").example("electron-builder --win --ia32", "build for Windows ia32").example("electron-builder -c.extraMetadata.foo=bar", "set package.json property `foo` to `bar`").example("electron-builder --config.nsis.unicode=false", "configure unicode options for NSIS");
}

function normalizePlatforms(rawPlatforms) {
  const platforms = rawPlatforms == null || Array.isArray(rawPlatforms) ? rawPlatforms : [rawPlatforms];

  if (platforms == null || platforms.length === 0) {
    return [_appBuilderLib().Platform.fromString(process.platform)];
  } else if (platforms[0] === "all") {
    if (process.platform === _appBuilderLib().Platform.MAC.nodeName) {
      return [_appBuilderLib().Platform.MAC, _appBuilderLib().Platform.LINUX, _appBuilderLib().Platform.WINDOWS];
    } else if (process.platform === _appBuilderLib().Platform.LINUX.nodeName) {
      // macOS code sign works only on macOS
      return [_appBuilderLib().Platform.LINUX, _appBuilderLib().Platform.WINDOWS];
    } else {
      return [_appBuilderLib().Platform.WINDOWS];
    }
  } else {
    return platforms.map(it => it instanceof _appBuilderLib().Platform ? it : _appBuilderLib().Platform.fromString(it));
  }
} 
// __ts-babel@6.0.4
//# sourceMappingURL=builder.js.map{"version":3,"sources":["../src/builder.ts"],"names":[],"mappings":"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","sourcesContent":["import { addValue, Arch, archFromString, deepAssign, getArchCliNames, InvalidConfigurationError, log } from \"builder-util\"\nimport chalk from \"chalk\"\nimport { build as _build, Configuration, DIR_TARGET, Packager, PackagerOptions, Platform } from \"app-builder-lib\"\nimport { PublishOptions } from \"electron-publish\"\nimport yargs from \"yargs\"\n\n/** @internal */\nexport interface BuildOptions extends PackagerOptions, PublishOptions {\n}\n\nexport interface CliOptions extends PackagerOptions, PublishOptions {\n  arch?: string\n\n  x64?: boolean\n  ia32?: boolean\n  armv7l?: boolean\n  arm64?: boolean\n\n  dir?: boolean\n\n  platform?: string\n}\n\n/** @internal */\nexport function normalizeOptions(args: CliOptions): BuildOptions {\n  if ((args as any).extraMetadata != null) {\n    throw new InvalidConfigurationError(\"Please specify extraMetadata under config field\")\n  }\n\n  if (args.targets != null) {\n    return args\n  }\n\n  if ((args as any).draft != null || (args as any).prerelease != null) {\n    log.warn({solution: \"set releaseType (http://electron.build/configuration/publish#GithubOptions-releaseType) in the GitHub publish options\"}, \"--draft and --prerelease is deprecated\")\n  }\n\n  let targets = new Map<Platform, Map<Arch, Array<string>>>()\n\n  function processTargets(platform: Platform, types: Array<string>) {\n    function commonArch(currentIfNotSpecified: boolean): Array<Arch> {\n      if (platform === Platform.MAC) {\n        return args.x64 || currentIfNotSpecified ? [Arch.x64] : []\n      }\n\n      const result = Array<Arch>()\n      if (args.x64) {\n        result.push(Arch.x64)\n      }\n      if (args.armv7l) {\n        result.push(Arch.armv7l)\n      }\n      if (args.arm64) {\n        result.push(Arch.arm64)\n      }\n      if (args.ia32) {\n        result.push(Arch.ia32)\n      }\n\n      return result.length === 0 && currentIfNotSpecified ? [archFromString(process.arch)] : result\n    }\n\n    if (args.platform != null) {\n      throw new InvalidConfigurationError(`--platform cannot be used if --${platform.buildConfigurationKey} is passed`)\n    }\n    if (args.arch != null) {\n      throw new InvalidConfigurationError(`--arch cannot be used if --${platform.buildConfigurationKey} is passed`)\n    }\n\n    let archToType = targets.get(platform)\n    if (archToType == null) {\n      archToType = new Map<Arch, Array<string>>()\n      targets.set(platform, archToType)\n    }\n\n    if (types.length === 0) {\n      const defaultTargetValue = args.dir ? [DIR_TARGET] : []\n      for (const arch of commonArch(args.dir === true)) {\n        archToType.set(arch, defaultTargetValue)\n      }\n      return\n    }\n\n    for (const type of types) {\n      const suffixPos = type.lastIndexOf(\":\")\n      if (suffixPos > 0) {\n        addValue(archToType, archFromString(type.substring(suffixPos + 1)), type.substring(0, suffixPos))\n      }\n      else {\n        for (const arch of commonArch(true)) {\n          addValue(archToType, arch, type)\n        }\n      }\n    }\n  }\n\n  if (args.mac != null) {\n    processTargets(Platform.MAC, args.mac)\n  }\n\n  if (args.linux != null) {\n    processTargets(Platform.LINUX, args.linux)\n  }\n\n  if (args.win != null) {\n    processTargets(Platform.WINDOWS, args.win)\n  }\n\n  if (targets.size === 0) {\n    if (args.platform == null && args.arch == null) {\n      processTargets(Platform.current(), [])\n    }\n    else {\n      targets = createTargets(normalizePlatforms(args.platform), args.dir ? DIR_TARGET : null, args.arch)\n    }\n  }\n\n  const result = {...args}\n  result.targets = targets\n\n  delete result.dir\n  delete result.mac\n  delete result.linux\n  delete result.win\n  delete result.platform\n  delete result.arch\n\n  const r = result as any\n  delete r.m\n  delete r.o\n  delete r.l\n  delete r.w\n  delete r.windows\n  delete r.macos\n  delete r.$0\n  delete r._\n  delete r.version\n  delete r.help\n  delete r.c\n  delete r.p\n  delete r.pd\n\n  delete result.ia32\n  delete result.x64\n  delete result.armv7l\n  delete result.arm64\n\n  let config = result.config\n\n  // config is array when combining dot-notation values with a config file value\n  // https://github.com/electron-userland/electron-builder/issues/2016\n  if (Array.isArray(config)) {\n    const newConfig: Configuration = {}\n    for (const configItem of config) {\n      if (typeof configItem === \"object\") {\n        deepAssign(newConfig, configItem)\n      }\n      else if (typeof configItem === \"string\") {\n        newConfig.extends = configItem\n      }\n    }\n\n    config = newConfig\n    result.config = newConfig\n  }\n\n  if (config != null && typeof config !== \"string\") {\n    if (config.extraMetadata != null) {\n      coerceTypes(config.extraMetadata)\n    }\n    if (config.mac != null) {\n      // ability to disable code sign using -c.mac.identity=null\n      coerceValue(config.mac, \"identity\")\n    }\n  }\n\n  if (\"project\" in r && !(\"projectDir\" in result)) {\n    result.projectDir = r.project\n  }\n  delete r.project\n\n  return result as BuildOptions\n}\n\nfunction coerceValue(host: any, key: string): void {\n  const value = host[key]\n  if (value === \"true\") {\n    host[key] = true\n  }\n  else if (value === \"false\") {\n    host[key] = false\n  }\n  else if (value === \"null\") {\n    host[key] = null\n  }\n  else if (key === \"version\" && typeof value === \"number\") {\n    host[key] = value.toString()\n  }\n  else if (value != null && typeof value === \"object\") {\n    coerceTypes(value)\n  }\n}\n\n/** @private */\nexport function coerceTypes(host: any): any {\n  for (const key of Object.getOwnPropertyNames(host)) {\n    coerceValue(host, key)\n  }\n  return host\n}\n\nexport function createTargets(platforms: Array<Platform>, type?: string | null, arch?: string | null): Map<Platform, Map<Arch, Array<string>>> {\n  const targets = new Map<Platform, Map<Arch, Array<string>>>()\n  for (const platform of platforms) {\n    const archs = platform === Platform.MAC ? [Arch.x64] : (arch === \"all\" ? [Arch.x64, Arch.ia32] : [archFromString(arch == null ? process.arch : arch)])\n    const archToType = new Map<Arch, Array<string>>()\n    targets.set(platform, archToType)\n\n    for (const arch of archs) {\n      archToType.set(arch, type == null ? [] : [type])\n    }\n  }\n  return targets\n}\n\nexport function build(rawOptions?: CliOptions): Promise<Array<string>> {\n  const buildOptions = normalizeOptions(rawOptions || {})\n  return _build(buildOptions, new Packager(buildOptions))\n}\n\n/**\n * @private\n * @internal\n */\nexport function configureBuildCommand(yargs: yargs.Argv): yargs.Argv {\n  const publishGroup = \"Publishing:\"\n  const buildGroup = \"Building:\"\n  const deprecated = \"Deprecated:\"\n\n  return yargs\n    .option(\"mac\", {\n      group: buildGroup,\n      alias: [\"m\", \"o\", \"macos\"],\n      description: `Build for macOS, accepts target list (see ${chalk.underline(\"https://goo.gl/5uHuzj\")}).`,\n      type: \"array\",\n    })\n    .option(\"linux\", {\n      group: buildGroup,\n      alias: \"l\",\n      description: `Build for Linux, accepts target list (see ${chalk.underline(\"https://goo.gl/4vwQad\")})`,\n      type: \"array\",\n    })\n    .option(\"win\", {\n      group: buildGroup,\n      alias: [\"w\", \"windows\"],\n      description: `Build for Windows, accepts target list (see ${chalk.underline(\"https://goo.gl/jYsTEJ\")})`,\n      type: \"array\",\n    })\n    .option(\"x64\", {\n      group: buildGroup,\n      description: \"Build for x64\",\n      type: \"boolean\",\n    })\n    .option(\"ia32\", {\n      group: buildGroup,\n      description: \"Build for ia32\",\n      type: \"boolean\",\n    })\n    .option(\"armv7l\", {\n      group: buildGroup,\n      description: \"Build for armv7l\",\n      type: \"boolean\",\n    })\n    .option(\"arm64\", {\n      group: buildGroup,\n      description: \"Build for arm64\",\n      type: \"boolean\",\n    })\n    .option(\"dir\", {\n      group: buildGroup,\n      description: \"Build unpacked dir. Useful to test.\",\n      type: \"boolean\",\n    })\n    .option(\"publish\", {\n      group: publishGroup,\n      alias: \"p\",\n      description: `Publish artifacts, see ${chalk.underline(\"https://goo.gl/tSFycD\")}`,\n      choices: [\"onTag\", \"onTagOrDraft\", \"always\", \"never\", undefined as any],\n    })\n    .option(\"draft\", {\n      group: deprecated,\n      description: \"Please set releaseType in the GitHub publish options instead\",\n      type: \"boolean\",\n      default: undefined,\n    })\n    .option(\"prerelease\", {\n      group: deprecated,\n      description: \"Please set releaseType in the GitHub publish options instead\",\n      type: \"boolean\",\n      default: undefined,\n    })\n    .option(\"platform\", {\n      group: deprecated,\n      description: \"The target platform (preferred to use --mac, --win or --linux)\",\n      choices: [\"mac\", \"win\", \"linux\", \"darwin\", \"win32\", \"all\", undefined as any],\n    })\n    .option(\"arch\", {\n      group: deprecated,\n      description: \"The target arch (preferred to use --x64 or --ia32)\",\n      choices: getArchCliNames().concat(\"all\", undefined as any),\n    })\n    .option(\"prepackaged\", {\n      alias: [\"pd\"],\n      group: buildGroup,\n      description: \"The path to prepackaged app (to pack in a distributable format)\",\n    })\n    .option(\"projectDir\", {\n      alias: [\"project\"],\n      group: buildGroup,\n      description: \"The path to project directory. Defaults to current working directory.\",\n    })\n    .option(\"config\", {\n      alias: [\"c\"],\n      group: buildGroup,\n      description: \"The path to an electron-builder config. Defaults to `electron-builder.yml` (or `json`, or `json5`), see \" + chalk.underline(\"https://goo.gl/YFRJOM\"),\n    })\n    .group([\"help\", \"version\"], \"Other:\")\n    .example(\"electron-builder -mwl\", \"build for macOS, Windows and Linux\")\n    .example(\"electron-builder --linux deb tar.xz\", \"build deb and tar.xz for Linux\")\n    .example(\"electron-builder --win --ia32\", \"build for Windows ia32\")\n    .example(\"electron-builder -c.extraMetadata.foo=bar\", \"set package.json property `foo` to `bar`\")\n    .example(\"electron-builder --config.nsis.unicode=false\", \"configure unicode options for NSIS\")\n}\n\nfunction normalizePlatforms(rawPlatforms: Array<string | Platform> | string | Platform | null | undefined): Array<Platform> {\n  const platforms = rawPlatforms == null || Array.isArray(rawPlatforms) ? (rawPlatforms as Array<string | Platform | null | undefined>) : [rawPlatforms]\n  if (platforms as any == null || platforms.length === 0) {\n    return [Platform.fromString(process.platform)]\n  }\n  else if (platforms[0] === \"all\") {\n    if (process.platform === Platform.MAC.nodeName) {\n      return [Platform.MAC, Platform.LINUX, Platform.WINDOWS]\n    }\n    else if (process.platform === Platform.LINUX.nodeName) {\n      // macOS code sign works only on macOS\n      return [Platform.LINUX, Platform.WINDOWS]\n    }\n    else {\n      return [Platform.WINDOWS]\n    }\n  }\n  else {\n    return platforms.map(it => it instanceof Platform ? it : Platform.fromString(it!))\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "getArchSuffix", {
  enumerable: true,
  get: function () {
    return _builderUtil().getArchSuffix;
  }
});
Object.defineProperty(exports, "Arch", {
  enumerable: true,
  get: function () {
    return _builderUtil().Arch;
  }
});
Object.defineProperty(exports, "archFromString", {
  enumerable: true,
  get: function () {
    return _builderUtil().archFromString;
  }
});
Object.defineProperty(exports, "build", {
  enumerable: true,
  get: function () {
    return _builder().build;
  }
});
Object.defineProperty(exports, "createTargets", {
  enumerable: true,
  get: function () {
    return _builder().createTargets;
  }
});
Object.defineProperty(exports, "Platform", {
  enumerable: true,
  get: function () {
    return _appBuilderLib().Platform;
  }
});
Object.defineProperty(exports, "Target", {
  enumerable: true,
  get: function () {
    return _appBuilderLib().Target;
  }
});
Object.defineProperty(exports, "DIR_TARGET", {
  enumerable: true,
  get: function () {
    return _appBuilderLib().DIR_TARGET;
  }
});
Object.defineProperty(exports, "DEFAULT_TARGET", {
  enumerable: true,
  get: function () {
    return _appBuilderLib().DEFAULT_TARGET;
  }
});
Object.defineProperty(exports, "Packager", {
  enumerable: true,
  get: function () {
    return _appBuilderLib().Packager;
  }
});
Object.defineProperty(exports, "AppInfo", {
  enumerable: true,
  get: function () {
    return _appBuilderLib().AppInfo;
  }
});
Object.defineProperty(exports, "PublishManager", {
  enumerable: true,
  get: function () {
    return _appBuilderLib().PublishManager;
  }
});
Object.defineProperty(exports, "buildForge", {
  enumerable: true,
  get: function () {
    return _appBuilderLib().buildForge;
  }
});
Object.defineProperty(exports, "CancellationToken", {
  enumerable: true,
  get: function () {
    return _builderUtilRuntime().CancellationToken;
  }
});

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builder() {
  const data = require("./builder");

  _builder = function () {
    return data;
  };

  return data;
}

function _appBuilderLib() {
  const data = require("app-builder-lib");

  _appBuilderLib = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}
// __ts-babel@6.0.4
//# sourceMappingURL=index.js.map{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAcA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA","sourcesContent":["export { getArchSuffix, Arch, archFromString } from \"builder-util\"\nexport { build, CliOptions, createTargets } from \"./builder\"\nexport {\n  TargetConfiguration, Platform, Target, DIR_TARGET, BeforeBuildContext, SourceRepositoryInfo, TargetSpecificOptions, TargetConfigType, DEFAULT_TARGET, CompressionLevel,\n  MacConfiguration, DmgOptions, MasConfiguration, MacOsTargetName, PkgOptions, DmgContent, DmgWindow,\n  PlatformSpecificBuildOptions, AsarOptions, FileSet,\n  LinuxConfiguration, DebOptions, CommonLinuxOptions, LinuxTargetSpecificOptions, AppImageOptions,\n  Configuration, AfterPackContext, MetadataDirectories, Protocol, ReleaseInfo, ElectronDownloadOptions,\n  SnapOptions, CommonWindowsInstallerConfiguration, FileAssociation, MsiOptions, AppXOptions, WindowsConfiguration,\n  Packager, BuildResult, PackagerOptions, ArtifactCreated, ArtifactBuildStarted,\n  NsisOptions, NsisWebOptions, PortableOptions, CommonNsisOptions, SquirrelWindowsOptions,\n  WindowsSignOptions, CustomWindowsSignTaskConfiguration, WindowsSignTaskConfiguration, CustomWindowsSign, FileCodeSigningInfo, CertificateFromStoreInfo,\n  Metadata, AuthorMetadata, RepositoryInfo, AppInfo,\n  UploadTask, PublishManager, PublishOptions, ProgressInfo\n} from \"app-builder-lib\"\nexport { buildForge, ForgeOptions } from \"app-builder-lib\"\nexport { CancellationToken } from \"builder-util-runtime\"\n"],"sourceRoot":""}
#! /usr/bin/env node
"use strict";

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

function _electronVersion() {
  const data = require("app-builder-lib/out/electron/electronVersion");

  _electronVersion = function () {
    return data;
  };

  return data;
}

function _yarn() {
  const data = require("app-builder-lib/out/util/yarn");

  _yarn = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _isCi() {
  const data = _interopRequireDefault(require("is-ci"));

  _isCi = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _readConfigFile() {
  const data = require("read-config-file");

  _readConfigFile = function () {
    return data;
  };

  return data;
}

function _updateNotifier() {
  const data = _interopRequireDefault(require("update-notifier"));

  _updateNotifier = function () {
    return data;
  };

  return data;
}

function _yargs() {
  const data = _interopRequireDefault(require("yargs"));

  _yargs = function () {
    return data;
  };

  return data;
}

function _builder() {
  const data = require("../builder");

  _builder = function () {
    return data;
  };

  return data;
}

function _createSelfSignedCert() {
  const data = require("./create-self-signed-cert");

  _createSelfSignedCert = function () {
    return data;
  };

  return data;
}

function _installAppDeps() {
  const data = require("./install-app-deps");

  _installAppDeps = function () {
    return data;
  };

  return data;
}

function _start() {
  const data = require("./start");

  _start = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// tslint:disable:no-unused-expression
_yargs().default.parserConfiguration({
  "camel-case-expansion": false
}).command(["build", "*"], "Build", _builder().configureBuildCommand, wrap(_builder().build)).command("install-app-deps", "Install app deps", _installAppDeps().configureInstallAppDepsCommand, wrap(_installAppDeps().installAppDeps)).command("node-gyp-rebuild", "Rebuild own native code", _installAppDeps().configureInstallAppDepsCommand
/* yes, args the same as for install app deps */
, wrap(rebuildAppNativeCode)).command("create-self-signed-cert", "Create self-signed code signing cert for Windows apps", yargs => yargs.option("publisher", {
  alias: ["p"],
  type: "string",
  requiresArg: true,
  description: "The publisher name"
}).demandOption("publisher"), wrap(argv => (0, _createSelfSignedCert().createSelfSignedCert)(argv.publisher))).command("start", "Run application in a development mode using electron-webpack", yargs => yargs, wrap(() => (0, _start().start)())).help().epilog(`See ${_chalk().default.underline("https://electron.build")} for more documentation.`).strict().recommendCommands().argv;

function wrap(task) {
  return args => {
    checkIsOutdated();
    (0, _readConfigFile().loadEnv)(path.join(process.cwd(), "electron-builder.env")).then(() => task(args)).catch(error => {
      process.exitCode = 1; // https://github.com/electron-userland/electron-builder/issues/2940

      process.on("exit", () => process.exitCode = 1);
      console.error(_chalk().default.red(error instanceof _builderUtil().InvalidConfigurationError ? error.message : (error.stack || error).toString()));
    });
  };
}

function checkIsOutdated() {
  if (_isCi().default || process.env.NO_UPDATE_NOTIFIER != null) {
    return;
  }

  (0, _fsExtraP().readJson)(path.join(__dirname, "..", "..", "package.json")).then(it => {
    if (it.version === "0.0.0-semantic-release") {
      return;
    }

    const notifier = (0, _updateNotifier().default)({
      pkg: it
    });

    if (notifier.update != null) {
      notifier.notify({
        message: `Update available ${_chalk().default.dim(notifier.update.current)}${_chalk().default.reset(" â†’ ")}${_chalk().default.green(notifier.update.latest)} \nRun ${_chalk().default.cyan("yarn upgrade electron-builder")} to update`
      });
    }
  }).catch(e => _builderUtil().log.warn({
    error: e
  }, "cannot check updates"));
}

function rebuildAppNativeCode(_x) {
  return _rebuildAppNativeCode.apply(this, arguments);
} function _rebuildAppNativeCode() {
  _rebuildAppNativeCode = (0, _bluebirdLst().coroutine)(function* (args) {
    const projectDir = process.cwd();

    _builderUtil().log.info({
      platform: args.platform,
      arch: args.arch
    }, "executing node-gyp rebuild"); // this script must be used only for electron


    yield (0, _builderUtil().exec)(process.platform === "win32" ? "node-gyp.cmd" : "node-gyp", ["rebuild"], {
      env: (0, _yarn().getGypEnv)({
        version: yield (0, _electronVersion().getElectronVersion)(projectDir),
        useCustomDist: true
      }, args.platform, args.arch, true)
    });
  });
  return _rebuildAppNativeCode.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=cli.js.map{"version":3,"sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#! /usr/bin/env node\n\nimport { exec, InvalidConfigurationError, log } from \"builder-util\"\nimport chalk from \"chalk\"\nimport { getElectronVersion } from \"app-builder-lib/out/electron/electronVersion\"\nimport { getGypEnv } from \"app-builder-lib/out/util/yarn\"\nimport { readJson } from \"fs-extra-p\"\nimport isCi from \"is-ci\"\nimport * as path from \"path\"\nimport { loadEnv } from \"read-config-file\"\nimport updateNotifier from \"update-notifier\"\nimport yargs from \"yargs\"\nimport { build, configureBuildCommand } from \"../builder\"\nimport { createSelfSignedCert } from \"./create-self-signed-cert\"\nimport { configureInstallAppDepsCommand, installAppDeps } from \"./install-app-deps\"\nimport { start } from \"./start\"\n\n// tslint:disable:no-unused-expression\nyargs\n  .parserConfiguration({\n    \"camel-case-expansion\": false,\n  })\n  .command([\"build\", \"*\"], \"Build\", configureBuildCommand, wrap(build))\n  .command(\"install-app-deps\", \"Install app deps\", configureInstallAppDepsCommand, wrap(installAppDeps))\n  .command(\"node-gyp-rebuild\", \"Rebuild own native code\", configureInstallAppDepsCommand /* yes, args the same as for install app deps */, wrap(rebuildAppNativeCode))\n  .command(\"create-self-signed-cert\", \"Create self-signed code signing cert for Windows apps\",\n    yargs => yargs\n      .option(\"publisher\", {\n        alias: [\"p\"],\n        type: \"string\",\n        requiresArg: true,\n        description: \"The publisher name\",\n      })\n      .demandOption(\"publisher\"),\n    wrap(argv => createSelfSignedCert(argv.publisher)))\n  .command(\"start\", \"Run application in a development mode using electron-webpack\",\n    yargs => yargs,\n    wrap(() => start()))\n  .help()\n  .epilog(`See ${chalk.underline(\"https://electron.build\")} for more documentation.`)\n  .strict()\n  .recommendCommands()\n  .argv\n\nfunction wrap(task: (args: any) => Promise<any>) {\n  return (args: any) => {\n    checkIsOutdated()\n    loadEnv(path.join(process.cwd(), \"electron-builder.env\"))\n      .then(() => task(args))\n      .catch(error => {\n        process.exitCode = 1\n        // https://github.com/electron-userland/electron-builder/issues/2940\n        process.on(\"exit\", () => process.exitCode = 1)\n\n        console.error(chalk.red(error instanceof InvalidConfigurationError ? error.message : (error.stack || error).toString()))\n      })\n  }\n}\n\nfunction checkIsOutdated() {\n  if (isCi || process.env.NO_UPDATE_NOTIFIER != null) {\n    return\n  }\n\n  readJson(path.join(__dirname, \"..\", \"..\", \"package.json\"))\n    .then(it => {\n      if (it.version === \"0.0.0-semantic-release\") {\n        return\n      }\n\n      const notifier = updateNotifier({pkg: it})\n      if (notifier.update != null) {\n        notifier.notify({\n          message: `Update available ${chalk.dim(notifier.update.current)}${chalk.reset(\" â†’ \")}${chalk.green(notifier.update.latest)} \\nRun ${chalk.cyan(\"yarn upgrade electron-builder\")} to update`\n        })\n      }\n    })\n    .catch(e => log.warn({error: e}, \"cannot check updates\"))\n}\n\nasync function rebuildAppNativeCode(args: any) {\n  const projectDir = process.cwd()\n  log.info({platform: args.platform, arch: args.arch}, \"executing node-gyp rebuild\")\n  // this script must be used only for electron\n  await exec(process.platform === \"win32\" ? \"node-gyp.cmd\" : \"node-gyp\", [\"rebuild\"], {\n    env: getGypEnv({version: await getElectronVersion(projectDir), useCustomDist: true}, args.platform, args.arch, true),\n  })\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createSelfSignedCert = createSelfSignedCert;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = require("builder-util/out/fs");

  _fs = function () {
    return data;
  };

  return data;
}

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

function _windowsCodeSign() {
  const data = require("app-builder-lib/out/codeSign/windowsCodeSign");

  _windowsCodeSign = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _sanitizeFilename() {
  const data = _interopRequireDefault(require("sanitize-filename"));

  _sanitizeFilename = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/** @internal */
function createSelfSignedCert(_x) {
  return _createSelfSignedCert.apply(this, arguments);
}

function _createSelfSignedCert() {
  _createSelfSignedCert = (0, _bluebirdLst().coroutine)(function* (publisher) {
    const tmpDir = new (_builderUtil().TmpDir)("create-self-signed-cert");
    const targetDir = process.cwd();
    const tempPrefix = path.join((yield tmpDir.getTempDir({
      prefix: "self-signed-cert-creator"
    })), (0, _sanitizeFilename().default)(publisher));
    const cer = `${tempPrefix}.cer`;
    const pvk = `${tempPrefix}.pvk`;

    _builderUtil().log.info(_chalk().default.bold('When asked to enter a password ("Create Private Key Password"), please select "None".'));

    try {
      yield (0, _fsExtraP().ensureDir)(path.dirname(tempPrefix));
      const vendorPath = path.join((yield (0, _windowsCodeSign().getSignVendorPath)()), "windows-10", process.arch);
      yield (0, _builderUtil().exec)(path.join(vendorPath, "makecert.exe"), ["-r", "-h", "0", "-n", `CN=${quoteString(publisher)}`, "-eku", "1.3.6.1.5.5.7.3.3", "-pe", "-sv", pvk, cer]);
      const pfx = path.join(targetDir, `${(0, _sanitizeFilename().default)(publisher)}.pfx`);
      yield (0, _fs().unlinkIfExists)(pfx);
      yield (0, _builderUtil().exec)(path.join(vendorPath, "pvk2pfx.exe"), ["-pvk", pvk, "-spc", cer, "-pfx", pfx]);

      _builderUtil().log.info({
        file: pfx
      }, `created. Please see https://electron.build/code-signing how to use it to sign.`);

      const certLocation = "Cert:\\LocalMachine\\TrustedPeople";

      _builderUtil().log.info({
        file: pfx,
        certLocation
      }, `importing. Operation will be succeed only if runned from root. Otherwise import file manually.`);

      yield (0, _builderUtil().spawn)("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", "Import-PfxCertificate", "-FilePath", `"${pfx}"`, "-CertStoreLocation", ""]);
    } finally {
      yield tmpDir.cleanup();
    }
  });
  return _createSelfSignedCert.apply(this, arguments);
}

function quoteString(s) {
  if (!s.includes(",") && !s.includes('"')) {
    return s;
  }

  return `"${s.replace(/"/g, '\\"')}"`;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=create-self-signed-cert.js.map{"version":3,"sources":["../../src/cli/create-self-signed-cert.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;;;;AAEA;SACsB,oB;;;;;wDAAf,WAAoC,SAApC,EAAqD;AAC1D,UAAM,MAAM,GAAG,KAAI,qBAAJ,EAAW,yBAAX,CAAf;AACA,UAAM,SAAS,GAAG,OAAO,CAAC,GAAR,EAAlB;AACA,UAAM,UAAU,GAAG,IAAI,CAAC,IAAL,QAAgB,MAAM,CAAC,UAAP,CAAkB;AAAC,MAAA,MAAM,EAAE;AAAT,KAAlB,CAAhB,GAAyE,iCAAiB,SAAjB,CAAzE,CAAnB;AACA,UAAM,GAAG,GAAG,GAAG,UAAU,MAAzB;AACA,UAAM,GAAG,GAAG,GAAG,UAAU,MAAzB;;AAEA,uBAAI,IAAJ,CAAS,iBAAM,IAAN,CAAW,uFAAX,CAAT;;AAEA,QAAI;AACF,YAAM,2BAAU,IAAI,CAAC,OAAL,CAAa,UAAb,CAAV,CAAN;AACA,YAAM,UAAU,GAAG,IAAI,CAAC,IAAL,QAAgB,2CAAhB,GAAqC,YAArC,EAAmD,OAAO,CAAC,IAA3D,CAAnB;AACA,YAAM,yBAAK,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,cAAtB,CAAL,EACJ,CAAC,IAAD,EAAO,IAAP,EAAa,GAAb,EAAkB,IAAlB,EAAwB,MAAM,WAAW,CAAC,SAAD,CAAW,EAApD,EAAwD,MAAxD,EAAgE,mBAAhE,EAAqF,KAArF,EAA4F,KAA5F,EAAmG,GAAnG,EAAwG,GAAxG,CADI,CAAN;AAGA,YAAM,GAAG,GAAG,IAAI,CAAC,IAAL,CAAU,SAAV,EAAqB,GAAG,iCAAiB,SAAjB,CAA2B,MAAnD,CAAZ;AACA,YAAM,0BAAe,GAAf,CAAN;AACA,YAAM,yBAAK,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,aAAtB,CAAL,EAA2C,CAAC,MAAD,EAAS,GAAT,EAAc,MAAd,EAAsB,GAAtB,EAA2B,MAA3B,EAAmC,GAAnC,CAA3C,CAAN;;AACA,yBAAI,IAAJ,CAAS;AAAC,QAAA,IAAI,EAAE;AAAP,OAAT,EAAsB,gFAAtB;;AAEA,YAAM,YAAY,GAAG,oCAArB;;AACA,yBAAI,IAAJ,CAAS;AAAC,QAAA,IAAI,EAAE,GAAP;AAAY,QAAA;AAAZ,OAAT,EAAoC,gGAApC;;AACA,YAAM,0BAAM,gBAAN,EAAwB,CAAC,YAAD,EAAe,iBAAf,EAAkC,UAAlC,EAA8C,uBAA9C,EAAuE,WAAvE,EAAoF,IAAI,GAAG,GAA3F,EAAgG,oBAAhG,EAAsH,EAAtH,CAAxB,CAAN;AACD,KAdD,SAeQ;AACN,YAAM,MAAM,CAAC,OAAP,EAAN;AACD;AACF,G;;;;AAED,SAAS,WAAT,CAAqB,CAArB,EAA8B;AAC5B,MAAI,CAAC,CAAC,CAAC,QAAF,CAAW,GAAX,CAAD,IAAoB,CAAC,CAAC,CAAC,QAAF,CAAW,GAAX,CAAzB,EAA0C;AACxC,WAAO,CAAP;AACD;;AAED,SAAO,IAAI,CAAC,CAAC,OAAF,CAAU,IAAV,EAAgB,KAAhB,CAAsB,GAAjC;AACD,C","sourcesContent":["import { exec, log, spawn, TmpDir } from \"builder-util\"\nimport { unlinkIfExists } from \"builder-util/out/fs\"\nimport chalk from \"chalk\"\nimport { getSignVendorPath } from \"app-builder-lib/out/codeSign/windowsCodeSign\"\nimport { ensureDir } from \"fs-extra-p\"\nimport * as path from \"path\"\nimport sanitizeFileName from \"sanitize-filename\"\n\n/** @internal */\nexport async function createSelfSignedCert(publisher: string) {\n  const tmpDir = new TmpDir(\"create-self-signed-cert\")\n  const targetDir = process.cwd()\n  const tempPrefix = path.join(await tmpDir.getTempDir({prefix: \"self-signed-cert-creator\"}), sanitizeFileName(publisher))\n  const cer = `${tempPrefix}.cer`\n  const pvk = `${tempPrefix}.pvk`\n\n  log.info(chalk.bold('When asked to enter a password (\"Create Private Key Password\"), please select \"None\".'))\n\n  try {\n    await ensureDir(path.dirname(tempPrefix))\n    const vendorPath = path.join(await getSignVendorPath(), \"windows-10\", process.arch)\n    await exec(path.join(vendorPath, \"makecert.exe\"),\n      [\"-r\", \"-h\", \"0\", \"-n\", `CN=${quoteString(publisher)}`, \"-eku\", \"1.3.6.1.5.5.7.3.3\", \"-pe\", \"-sv\", pvk, cer])\n\n    const pfx = path.join(targetDir, `${sanitizeFileName(publisher)}.pfx`)\n    await unlinkIfExists(pfx)\n    await exec(path.join(vendorPath, \"pvk2pfx.exe\"), [\"-pvk\", pvk, \"-spc\", cer, \"-pfx\", pfx])\n    log.info({file: pfx}, `created. Please see https://electron.build/code-signing how to use it to sign.`)\n\n    const certLocation = \"Cert:\\\\LocalMachine\\\\TrustedPeople\"\n    log.info({file: pfx, certLocation}, `importing. Operation will be succeed only if runned from root. Otherwise import file manually.`)\n    await spawn(\"powershell.exe\", [\"-NoProfile\", \"-NonInteractive\", \"-Command\", \"Import-PfxCertificate\", \"-FilePath\", `\"${pfx}\"`, \"-CertStoreLocation\", \"\"])\n  }\n  finally {\n    await tmpDir.cleanup()\n  }\n}\n\nfunction quoteString(s: string): string {\n  if (!s.includes(\",\") && !s.includes('\"')) {\n    return s\n  }\n\n  return `\"${s.replace(/\"/g, '\\\\\"')}\"`\n}"],"sourceRoot":""}
#! /usr/bin/env node
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.configureInstallAppDepsCommand = configureInstallAppDepsCommand;
exports.installAppDeps = installAppDeps;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _promise() {
  const data = require("builder-util/out/promise");

  _promise = function () {
    return data;
  };

  return data;
}

function _config() {
  const data = require("app-builder-lib/out/util/config");

  _config = function () {
    return data;
  };

  return data;
}

function _electronVersion() {
  const data = require("app-builder-lib/out/electron/electronVersion");

  _electronVersion = function () {
    return data;
  };

  return data;
}

function _packageDependencies() {
  const data = require("app-builder-lib/out/util/packageDependencies");

  _packageDependencies = function () {
    return data;
  };

  return data;
}

function _yarn() {
  const data = require("app-builder-lib/out/util/yarn");

  _yarn = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _readConfigFile() {
  const data = require("read-config-file");

  _readConfigFile = function () {
    return data;
  };

  return data;
}

function _yargs() {
  const data = _interopRequireDefault(require("yargs"));

  _yargs = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

/** @internal */
function configureInstallAppDepsCommand(yargs) {
  // https://github.com/yargs/yargs/issues/760
  // demandOption is required to be set
  return yargs.parserConfiguration({
    "camel-case-expansion": false
  }).option("platform", {
    choices: ["linux", "darwin", "win32"],
    default: process.platform,
    description: "The target platform"
  }).option("arch", {
    choices: (0, _builderUtil().getArchCliNames)().concat("all"),
    default: process.arch === "arm" ? "armv7l" : process.arch,
    description: "The target arch"
  });
}
/** @internal */


function installAppDeps(_x) {
  return _installAppDeps.apply(this, arguments);
}

function _installAppDeps() {
  _installAppDeps = (0, _bluebirdLst().coroutine)(function* (args) {
    try {
      _builderUtil().log.info({
        version: "20.44.4"
      }, "electron-builder");
    } catch (e) {
      // error in dev mode without babel
      if (!(e instanceof ReferenceError)) {
        throw e;
      }
    }

    const projectDir = process.cwd();
    const packageMetadata = new (_lazyVal().Lazy)(() => (0, _readConfigFile().orNullIfFileNotExist)((0, _fsExtraP().readJson)(path.join(projectDir, "package.json"))));
    const config = yield (0, _config().getConfig)(projectDir, null, null, packageMetadata);
    const results = yield Promise.all([(0, _config().computeDefaultAppDirectory)(projectDir, (0, _builderUtil().use)(config.directories, it => it.app)), (0, _electronVersion().getElectronVersion)(projectDir, config, packageMetadata)]); // if two package.json â€” force full install (user wants to install/update app deps in addition to dev)

    yield (0, _yarn().installOrRebuild)(config, results[0], {
      frameworkInfo: {
        version: results[1],
        useCustomDist: true
      },
      platform: args.platform,
      arch: args.arch,
      productionDeps: (0, _packageDependencies().createLazyProductionDeps)(results[0])
    }, results[0] !== projectDir);
  });
  return _installAppDeps.apply(this, arguments);
}

function main() {
  return installAppDeps(configureInstallAppDepsCommand(_yargs().default).argv);
}

if (process.mainModule === module) {
  _builderUtil().log.warn("please use as subcommand: electron-builder install-app-deps");

  main().catch(_promise().printErrorAndExit);
} 
// __ts-babel@6.0.4
//# sourceMappingURL=install-app-deps.js.map{"version":3,"sources":["../../src/cli/install-app-deps.ts"],"names":[],"mappings":"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","sourcesContent":["#! /usr/bin/env node\n\nimport { log, use, getArchCliNames } from \"builder-util\"\nimport { printErrorAndExit } from \"builder-util/out/promise\"\nimport { computeDefaultAppDirectory, getConfig } from \"app-builder-lib/out/util/config\"\nimport { getElectronVersion } from \"app-builder-lib/out/electron/electronVersion\"\nimport { createLazyProductionDeps } from \"app-builder-lib/out/util/packageDependencies\"\nimport { installOrRebuild } from \"app-builder-lib/out/util/yarn\"\nimport { readJson } from \"fs-extra-p\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { orNullIfFileNotExist } from \"read-config-file\"\nimport yargs from \"yargs\"\n\ndeclare const PACKAGE_VERSION: string\n\n/** @internal */\nexport function configureInstallAppDepsCommand(yargs: yargs.Argv): yargs.Argv {\n  // https://github.com/yargs/yargs/issues/760\n  // demandOption is required to be set\n  return yargs\n    .parserConfiguration({\n      \"camel-case-expansion\": false,\n    })\n    .option(\"platform\", {\n      choices: [\"linux\", \"darwin\", \"win32\"],\n      default: process.platform,\n      description: \"The target platform\",\n    })\n    .option(\"arch\", {\n      choices: getArchCliNames().concat(\"all\"),\n      default: process.arch === \"arm\" ? \"armv7l\" : process.arch,\n      description: \"The target arch\",\n    })\n}\n\n/** @internal */\nexport async function installAppDeps(args: any) {\n  try {\n    log.info({version: PACKAGE_VERSION}, \"electron-builder\")\n  }\n  catch (e) {\n    // error in dev mode without babel\n    if (!(e instanceof ReferenceError)) {\n      throw e\n    }\n  }\n\n  const projectDir = process.cwd()\n  const packageMetadata = new Lazy(() => orNullIfFileNotExist(readJson(path.join(projectDir, \"package.json\"))))\n  const config = await getConfig(projectDir, null, null, packageMetadata)\n  const results = await Promise.all<string>([\n    computeDefaultAppDirectory(projectDir, use(config.directories, it => it!.app)),\n    getElectronVersion(projectDir, config, packageMetadata),\n  ])\n\n  // if two package.json â€” force full install (user wants to install/update app deps in addition to dev)\n  await installOrRebuild(config, results[0], {\n    frameworkInfo: {version: results[1], useCustomDist: true},\n    platform: args.platform,\n    arch: args.arch,\n    productionDeps: createLazyProductionDeps(results[0]),\n  }, results[0] !== projectDir)\n}\n\nfunction main() {\n  return installAppDeps(configureInstallAppDepsCommand(yargs).argv)\n}\n\nif (process.mainModule === module) {\n  log.warn(\"please use as subcommand: electron-builder install-app-deps\")\n  main()\n    .catch(printErrorAndExit)\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.start = start;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

/** @internal */
function start() {
  return _start.apply(this, arguments);
} function _start() {
  _start = (0, _bluebirdLst().coroutine)(function* () {
    require("electron-webpack/dev-runner");
  });
  return _start.apply(this, arguments);
}
// __ts-babel@6.0.4
//# sourceMappingURL=start.js.map{"version":3,"sources":["../../src/cli/start.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;SACsB,K;;;;;;yCAAf,aAAoB;AACzB,IAAA,OAAO,CAAC,6BAAD,CAAP;AACD,G","sourcesContent":["/** @internal */\nexport async function start() {\n  require(\"electron-webpack/dev-runner\")\n}"],"sourceRoot":""}
# Code of Conduct

This project is a part of the Electron ecosystem. As such, all contributions to this project follow
[Electron's code of conduct](https://github.com/electron/electron/blob/master/CODE_OF_CONDUCT.md)
where appropriate.
BSD 3-Clause License

Copyright (c) 2018, Electron Userland
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
## Collaborators

electron-download is only possible due to the excellent work of the following collaborators:

<table><tbody><tr><th align="left">maxogden</th><td><a href="https://github.com/maxogden">GitHub/maxogden</a></td></tr>
<tr><th align="left">mafintosh</th><td><a href="https://github.com/mafintosh">GitHub/mafintosh</a></td></tr>
<tr><th align="left">fritx</th><td><a href="https://github.com/fritx">GitHub/fritx</a></td></tr>
</tbody></table>
{
  "author": {
    "name": "max ogden"
  },
  "bin": {
    "electron-download": "lib/cli.js"
  },
  "dependencies": {
    "debug": "^3.0.0",
    "env-paths": "^1.0.0",
    "fs-extra": "^4.0.1",
    "minimist": "^1.2.0",
    "nugget": "^2.0.1",
    "path-exists": "^3.0.0",
    "rc": "^1.2.1",
    "semver": "^5.4.1",
    "sumchecker": "^2.0.2"
  },
  "deprecated": false,
  "description": "download electron prebuilt binary zips from github releases",
  "devDependencies": {
    "eslint": "^4.4.1",
    "eslint-config-standard": "^10.2.1",
    "eslint-plugin-import": "^2.7.0",
    "eslint-plugin-node": "^5.1.1",
    "eslint-plugin-promise": "^3.5.0",
    "eslint-plugin-standard": "^3.0.1",
    "sinon": "^6.1.4",
    "tape": "^4.8.0",
    "temp": "^0.8.3"
  },
  "engines": {
    "node": ">= 4.0"
  },
  "homepage": "https://github.com/electron-userland/electron-download#readme",
  "license": "BSD-3-Clause",
  "main": "lib/index.js",
  "name": "electron-download",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-download.git"
  },
  "version": "4.1.1"
}'use strict'

const execSync = require('child_process').execSync

module.exports = {
  host: function host (quiet) {
    const arch = process.arch
    if (arch === 'arm') {
      switch (process.config.variables.arm_version) {
        case '6':
          return module.exports.uname()
        case '7':
          return 'armv7l'
        default:
          if (!quiet) {
            console.warn(`WARNING: Could not determine specific ARM arch. Detected ARM version: ${JSON.stringify(process.config.variables.arm_version)}`)
          }
      }
    }

    return arch
  },

  /**
   * Returns the arch name from the `uname` utility.
   */
  uname: function uname () {
    return execSync('uname -m').toString().trim()
  }
}
#!/usr/bin/env node

'use strict'

const download = require('./')
const minimist = require('minimist')

const opts = minimist(process.argv.slice(2))

if (opts['strict-ssl'] === false) {
  opts.strictSSL = false
}

download(opts, (err, zipPath) => {
  if (err) throw err
  console.log('Downloaded zip:', zipPath)
  process.exit(0)
})
'use strict'

const arch = require('./arch')
const debug = require('debug')('electron-download')
const envPaths = require('env-paths')
const fs = require('fs-extra')
const rc = require('rc')
const nugget = require('nugget')
const os = require('os')
const path = require('path')
const pathExists = require('path-exists')
const semver = require('semver')
const sumchecker = require('sumchecker')

class ElectronDownloader {
  constructor (opts) {
    this.opts = Object.assign({ autoDownload: true }, opts)
    if (this.opts.force && !this.opts.autoDownload) {
      throw new Error('force and autoDownload options are incompatible for Electron Download')
    }

    this.npmrc = {}
    try {
      rc('npm', this.npmrc)
    } catch (error) {
      console.error(`Error reading npm configuration: ${error.message}`)
    }
  }

  get baseUrl () {
    if (this.version.indexOf('nightly') !== -1) {
      return process.env.NPM_CONFIG_ELECTRON_NIGHTLY_MIRROR ||
        process.env.npm_config_electron_nightly_mirror ||
        process.env.npm_package_config_electron_nightly_mirror ||
        process.env.ELECTRON_NIGHTLY_MIRROR ||
        this.opts.nightly_mirror ||
        'https://github.com/electron/nightlies/releases/download/v'
    }
    return process.env.NPM_CONFIG_ELECTRON_MIRROR ||
      process.env.npm_config_electron_mirror ||
      process.env.npm_package_config_electron_mirror ||
      process.env.ELECTRON_MIRROR ||
      this.opts.mirror ||
      'https://github.com/electron/electron/releases/download/v'
  }

  get middleUrl () {
    return process.env.NPM_CONFIG_ELECTRON_CUSTOM_DIR ||
      process.env.npm_config_electron_custom_dir ||
      process.env.npm_package_config_electron_custom_dir ||
      process.env.ELECTRON_CUSTOM_DIR ||
      this.opts.customDir ||
      this.version
  }

  get urlSuffix () {
    return process.env.NPM_CONFIG_ELECTRON_CUSTOM_FILENAME ||
      process.env.npm_config_electron_custom_filename ||
      process.env.npm_package_config_electron_custom_filename ||
      process.env.ELECTRON_CUSTOM_FILENAME ||
      this.opts.customFilename ||
      this.filename
  }

  get arch () {
    return this.opts.arch || arch.host(this.quiet)
  }

  get cache () {
    const cacheLocation = this.opts.cache || process.env.ELECTRON_CACHE
    if (cacheLocation) return cacheLocation

    const oldCacheDirectory = path.join(os.homedir(), './.electron')
    if (pathExists.sync(path.join(oldCacheDirectory, this.filename))) {
      return oldCacheDirectory
    }
    // use passed argument or XDG environment variable fallback to OS default
    return envPaths('electron', {suffix: ''}).cache
  }

  get cachedChecksum () {
    return path.join(this.cache, `${this.checksumFilename}-${this.version}`)
  }

  get cachedZip () {
    return path.join(this.cache, this.filename)
  }

  get checksumFilename () {
    return 'SHASUMS256.txt'
  }

  get checksumUrl () {
    return `${this.baseUrl}${this.middleUrl}/${this.checksumFilename}`
  }

  get filename () {
    const type = `${this.platform}-${this.arch}`
    const suffix = `v${this.version}-${type}`

    if (this.chromedriver) {
      // Chromedriver started using Electron's version in asset name in 1.7.0
      if (semver.gte(this.version, '1.7.0')) {
        return `chromedriver-${suffix}.zip`
      } else {
        return `chromedriver-v2.21-${type}.zip`
      }
    } else if (this.mksnapshot) {
      return `mksnapshot-${suffix}.zip`
    } else if (this.ffmpeg) {
      return `ffmpeg-${suffix}.zip`
    } else if (this.symbols) {
      return `electron-${suffix}-symbols.zip`
    } else if (this.dsym) {
      return `electron-${suffix}-dsym.zip`
    } else {
      return `electron-${suffix}.zip`
    }
  }

  get platform () {
    return this.opts.platform || os.platform()
  }

  get proxy () {
    let proxy
    if (this.npmrc && this.npmrc.proxy) proxy = this.npmrc.proxy
    if (this.npmrc && this.npmrc['https-proxy']) proxy = this.npmrc['https-proxy']

    return proxy
  }

  get quiet () {
    return this.opts.quiet || process.stdout.rows < 1
  }

  get strictSSL () {
    let strictSSL = true
    if (this.opts.strictSSL === false || this.npmrc['strict-ssl'] === false) {
      strictSSL = false
    }

    return strictSSL
  }

  get force () {
    return this.opts.force || false
  }

  get symbols () {
    return this.opts.symbols || false
  }

  get dsym () {
    return this.opts.dsym || false
  }

  get chromedriver () {
    return this.opts.chromedriver || false
  }

  get mksnapshot () {
    return this.opts.mksnapshot || false
  }

  get ffmpeg () {
    return this.opts.ffmpeg || false
  }

  get url () {
    return process.env.ELECTRON_DOWNLOAD_OVERRIDE_URL ||
      `${this.baseUrl}${this.middleUrl}/${this.urlSuffix}`
  }

  get verifyChecksumNeeded () {
    return !this.opts.disableChecksumSafetyCheck && semver.gte(this.version, '1.3.2')
  }

  get version () {
    return this.opts.version
  }

  get headers () {
    return this.opts.headers
  }

  checkForCachedChecksum (cb) {
    pathExists(this.cachedChecksum)
      .then(exists => {
        if (exists && !this.force) {
          this.verifyChecksum(cb)
        } else {
          this.downloadChecksum(cb)
        }
      })
  }

  checkForCachedZip (cb) {
    pathExists(this.cachedZip).then(exists => {
      if (exists && !this.force) {
        debug('zip exists', this.cachedZip)
        this.checkIfZipNeedsVerifying(cb)
      } else if (this.opts.autoDownload) {
        this.ensureCacheDir(cb)
      } else {
        cb(new Error(`File: "${this.cachedZip}" does not exist locally and autoDownload is false`))
      }
    })
  }

  checkIfZipNeedsVerifying (cb) {
    if (this.verifyChecksumNeeded) {
      debug('Verifying zip with checksum')
      return this.checkForCachedChecksum(cb)
    }
    return cb(null, this.cachedZip)
  }

  createCacheDir (cb) {
    fs.mkdirs(this.cache, (err) => {
      if (err) {
        if (err.code !== 'EACCES') return cb(err)
        // try local folder if homedir is off limits (e.g. some linuxes return '/' as homedir)
        const localCache = path.resolve('./.electron')
        return fs.mkdirs(localCache, function (err) {
          if (err) return cb(err)
          cb(null, localCache)
        })
      }
      cb(null, this.cache)
    })
  }

  downloadChecksum (cb) {
    this.downloadFile(this.checksumUrl, this.cachedChecksum, cb, this.verifyChecksum.bind(this))
  }

  downloadFile (url, cacheFilename, cb, onSuccess) {
    const tempFileName = `tmp-${process.pid}-${(ElectronDownloader.tmpFileCounter++).toString(16)}-${path.basename(cacheFilename)}`
    debug('downloading', url, 'to', this.cache)
    const nuggetOpts = {
      target: tempFileName,
      dir: this.cache,
      resume: true,
      quiet: this.quiet,
      strictSSL: this.strictSSL,
      proxy: this.proxy,
      headers: this.headers
    }
    nugget(url, nuggetOpts, (errors) => {
      if (errors) {
        // nugget returns an array of errors but we only need 1st because we only have 1 url
        return this.handleDownloadError(cb, errors[0])
      }

      this.moveFileToCache(tempFileName, cacheFilename, cb, onSuccess)
    })
  }

  downloadIfNotCached (cb) {
    if (!this.version) return cb(new Error('must specify version'))
    debug('info', {cache: this.cache, filename: this.filename, url: this.url})
    this.checkForCachedZip(cb)
  }

  downloadZip (cb) {
    this.downloadFile(this.url, this.cachedZip, cb, this.checkIfZipNeedsVerifying.bind(this))
  }

  ensureCacheDir (cb) {
    debug('creating cache dir')
    this.createCacheDir((err, actualCache) => {
      if (err) return cb(err)
      this.opts.cache = actualCache // in case cache dir changed
      this.downloadZip(cb)
    })
  }

  handleDownloadError (cb, error) {
    if (error.message.indexOf('404') === -1) return cb(error)
    if (this.symbols) {
      error.message = `Failed to find Electron symbols v${this.version} for ${this.platform}-${this.arch} at ${this.url}`
    } else {
      error.message = `Failed to find Electron v${this.version} for ${this.platform}-${this.arch} at ${this.url}`
    }

    return cb(error)
  }

  moveFileToCache (filename, target, cb, onSuccess) {
    const cache = this.cache
    debug('moving', filename, 'from', cache, 'to', target)
    fs.rename(path.join(cache, filename), target, (err) => {
      if (err) {
        fs.unlink(cache, cleanupError => {
          try {
            if (cleanupError) {
              console.error(`Error deleting cache file: ${cleanupError.message}`)
            }
          } finally {
            cb(err)
          }
        })
      } else {
        onSuccess(cb)
      }
    })
  }

  verifyChecksum (cb) {
    const options = {}
    if (semver.lt(this.version, '1.3.5')) {
      options.defaultTextEncoding = 'binary'
    }
    const checker = new sumchecker.ChecksumValidator('sha256', this.cachedChecksum, options)
    checker.validate(this.cache, this.filename).then(() => {
      cb(null, this.cachedZip)
    }, (err) => {
      fs.unlink(this.cachedZip, (fsErr) => {
        if (fsErr) return cb(fsErr)
        cb(err)
      })
    })
  }
}

ElectronDownloader.tmpFileCounter = 0

module.exports = function download (opts, cb) {
  try {
    const downloader = new ElectronDownloader(opts)
    downloader.downloadIfNotCached(cb)
  } catch (err) {
    cb(err)
  }
}
{
  "env": {
    "es6": true,
    "node": true
  },
  "extends": "eslint:recommended",
  "parserOptions": {
    "sourceType": "module"
  },
  "rules": {
    "accessor-pairs": 2,
    "array-bracket-spacing": [
      2,
      "never"
    ],
    "array-callback-return": 2,
    "arrow-body-style": 2,
    "arrow-parens": 2,
    "arrow-spacing": 2,
    "block-scoped-var": 2,
    "block-spacing": 2,
    "brace-style": [
      2,
      "1tbs"
    ],
    "callback-return": 0,
    "camelcase": 2,
    "comma-spacing": [
      2,
      {
        "after": true,
        "before": false
      }
    ],
    "comma-style": [
      2,
      "last"
    ],
    "complexity": 2,
    "computed-property-spacing": [
      2,
      "never"
    ],
    "consistent-return": 0,
    "consistent-this": 2,
    "curly": 0,
    "default-case": 0,
    "dot-location": [
      2,
      "property"
    ],
    "dot-notation": [
      2,
      {
        "allowKeywords": true
      }
    ],
    "eol-last": 2,
    "func-names": 0,
    "func-style": [
      2,
      "declaration"
    ],
    "generator-star-spacing": 2,
    "global-require": 2,
    "guard-for-in": 2,
    "handle-callback-err": 0,
    "id-blacklist": 2,
    "id-length": 0,
    "id-match": 2,
    "indent": 0,
    "init-declarations": 0,
    "jsx-quotes": 2,
    "key-spacing": 2,
    "keyword-spacing": [
      2,
      {
        "after": true,
        "before": true
      }
    ],
    "linebreak-style": [
      2,
      "unix"
    ],
    "lines-around-comment": 2,
    "max-depth": 2,
    "max-len": 0,
    "max-nested-callbacks": 2,
    "max-params": 2,
    "new-cap": 2,
    "new-parens": 2,
    "newline-after-var": 0,
    "newline-per-chained-call": 0,
    "no-alert": 2,
    "no-array-constructor": 2,
    "no-bitwise": 2,
    "no-caller": 2,
    "no-console": [
      "error",
      {
        "allow": [
          "log",
          "warn",
          "error"
        ]
      }
    ],
    "no-catch-shadow": 2,
    "no-confusing-arrow": 2,
    "no-continue": 2,
    "no-div-regex": 2,
    "no-else-return": 0,
    "no-eq-null": 0,
    "no-eval": 2,
    "no-extend-native": 2,
    "no-extra-bind": 2,
    "no-extra-label": 2,
    "no-extra-parens": 2,
    "no-floating-decimal": 2,
    "no-implicit-coercion": 2,
    "no-implicit-globals": 2,
    "no-implied-eval": 2,
    "no-inline-comments": 0,
    "no-inner-declarations": [
      2,
      "functions"
    ],
    "no-invalid-this": 2,
    "no-iterator": 2,
    "no-label-var": 2,
    "no-labels": 2,
    "no-lone-blocks": 2,
    "no-lonely-if": 2,
    "no-loop-func": 2,
    "no-magic-numbers": 0,
    "no-mixed-requires": 2,
    "no-multi-spaces": 2,
    "no-multi-str": 2,
    "no-multiple-empty-lines": 2,
    "no-native-reassign": 2,
    "no-negated-condition": 0,
    "no-nested-ternary": 2,
    "no-new": 2,
    "no-new-func": 2,
    "no-new-object": 2,
    "no-new-require": 2,
    "no-new-wrappers": 2,
    "no-octal-escape": 2,
    "no-param-reassign": 0,
    "no-path-concat": 2,
    "no-plusplus": [
      2,
      {
        "allowForLoopAfterthoughts": true
      }
    ],
    "no-process-env": 2,
    "no-process-exit": 2,
    "no-proto": 2,
    "no-restricted-imports": 2,
    "no-restricted-modules": 2,
    "no-restricted-syntax": 2,
    "no-return-assign": 2,
    "no-script-url": 2,
    "no-self-compare": 2,
    "no-sequences": 2,
    "no-shadow": 0,
    "no-shadow-restricted-names": 2,
    "no-spaced-func": 2,
    "no-sync": 0,
    "no-ternary": 0,
    "no-throw-literal": 2,
    "no-trailing-spaces": 2,
    "no-undef-init": 2,
    "no-undefined": 2,
    "no-underscore-dangle": 0,
    "no-unmodified-loop-condition": 2,
    "no-unneeded-ternary": 2,
    "no-unused-expressions": 2,
    "no-use-before-define": 0,
    "no-useless-call": 2,
    "no-useless-concat": 2,
    "no-useless-constructor": 2,
    "no-var": 0,
    "no-void": 2,
    "no-warning-comments": 0,
    "no-whitespace-before-property": 2,
    "no-with": 2,
    "object-curly-spacing": 2,
    "object-shorthand": 2,
    "one-var": 0,
    "one-var-declaration-per-line": 2,
    "operator-assignment": 2,
    "operator-linebreak": 2,
    "padded-blocks": 0,
    "prefer-arrow-callback": 0,
    "prefer-const": 0,
    "prefer-reflect": 2,
    "prefer-rest-params": 2,
    "prefer-spread": 2,
    "prefer-template": 0,
    "quote-props": 2,
    "quotes": 0,
    "radix": 2,
    "require-jsdoc": 0,
    "require-yield": 2,
    "semi": 0,
    "semi-spacing": [
      2,
      {
        "after": true,
        "before": false
      }
    ],
    "sort-imports": 2,
    "sort-vars": 2,
    "space-before-blocks": 2,
    "space-before-function-paren": 2,
    "space-in-parens": [
      2,
      "never"
    ],
    "space-infix-ops": 2,
    "space-unary-ops": 2,
    "spaced-comment": [
      2,
      "always"
    ],
    "strict": 0,
    "template-curly-spacing": 2,
    "valid-jsdoc": 2,
    "vars-on-top": 0,
    "wrap-iife": 2,
    "wrap-regex": 2,
    "yield-star-spacing": 2,
    "yoda": [
      2,
      "never"
    ]
  }
}
Copyright (c) 2015-2016 Zhuo Lu, Jason Hinkle, et al.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
  </dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
  </dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.inherit</key>
    <true/>
  </dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
  </dict>
</plist>
/**
 * @module flat
 */

'use strict'

const path = require('path')

const Promise = require('bluebird')

const pkg = require('./package.json')
const util = require('./util')
const debuglog = util.debuglog
const debugwarn = util.debugwarn
const execFileAsync = util.execFileAsync
const validateOptsAppAsync = util.validateOptsAppAsync
const validateOptsPlatformAsync = util.validateOptsPlatformAsync
const Identity = require('./util-identities').findIdentitiesAsync
const findIdentitiesAsync = require('./util-identities').findIdentitiesAsync

/**
 * This function returns a promise validating all options passed in opts.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
function validateFlatOptsAsync (opts) {
  if (opts.pkg) {
    if (typeof opts.pkg !== 'string') return Promise.reject(new Error('`pkg` must be a string.'))
    if (path.extname(opts.pkg) !== '.pkg') return Promise.reject(new Error('Extension of output package must be `.pkg`.'))
  } else {
    debugwarn('No `pkg` passed in arguments, will fallback to default inferred from the given application.')
    opts.pkg = path.join(path.dirname(opts.app), path.basename(opts.app, '.app') + '.pkg')
  }

  if (opts.install) {
    if (typeof opts.install !== 'string') return Promise.reject(new Error('`install` must be a string.'))
  } else {
    debugwarn('No `install` passed in arguments, will fallback to default `/Applications`.')
    opts.install = '/Applications'
  }

  return Promise.map([
    validateOptsAppAsync,
    validateOptsPlatformAsync
  ], function (validate) {
    return validate(opts)
  })
}

/**
 * This function returns a promise flattening the application.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
function flatApplicationAsync (opts) {
  var args = [
    '--component', opts.app, opts.install,
    '--sign', opts.identity.name,
    opts.pkg
  ]
  if (opts.keychain) {
    args.unshift('--keychain', opts.keychain)
  }
  if (opts.scripts) {
    args.unshift('--scripts', opts.scripts)
  }

  debuglog('Flattening... ' + opts.app)
  return execFileAsync('productbuild', args)
    .thenReturn(undefined)
}

/**
 * This function is exported and returns a promise flattening the application.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
var flatAsync = module.exports.flatAsync = function (opts) {
  debuglog('electron-osx-sign@%s', pkg.version)
  return validateFlatOptsAsync(opts)
    .then(function () {
      var promise
      if (opts.identity) {
        debuglog('`identity` passed in arguments.')
        if (opts['identity-validation'] === false || opts.identity instanceof Identity) {
          return Promise.resolve()
        }
        promise = findIdentitiesAsync(opts, opts.identity)
      } else {
        debugwarn('No `identity` passed in arguments...')
        if (opts.platform === 'mas') {
          debuglog('Finding `3rd Party Mac Developer Installer` certificate for flattening app distribution in the Mac App Store...')
          promise = findIdentitiesAsync(opts, '3rd Party Mac Developer Installer:')
        } else {
          debuglog('Finding `Developer ID Application` certificate for distribution outside the Mac App Store...')
          promise = findIdentitiesAsync(opts, 'Developer ID Installer:')
        }
      }
      return promise
        .then(function (identities) {
          if (identities.length > 0) {
            // Provisioning profile(s) found
            if (identities.length > 1) {
              debugwarn('Multiple identities found, will use the first discovered.')
            } else {
              debuglog('Found 1 identity.')
            }
            opts.identity = identities[0]
          } else {
            // No identity found
            return Promise.reject(new Error('No identity found for signing.'))
          }
        })
    })
    .then(function () {
      // Pre-flat operations
    })
    .then(function () {
      debuglog('Flattening application...', '\n',
        '> Application:', opts.app, '\n',
        '> Package output:', opts.pkg, '\n',
        '> Install path:', opts.install, '\n',
        '> Identity:', opts.identity, '\n',
        '> Scripts:', opts.scripts)
      return flatApplicationAsync(opts)
    })
    .then(function () {
      // Post-flat operations
      debuglog('Application flattened.')
    })
}

/**
 * This function is exported with normal callback implementation.
 * @function
 * @param {Object} opts - Options.
 * @param {RequestCallback} cb - Callback.
 */
module.exports.flat = function (opts, cb) {
  flatAsync(opts)
    .then(function () {
      debuglog('Application flattened, saved to: ' + opts.app)
      if (cb) cb()
    })
    .catch(function (err) {
      debuglog('Flat failed:')
      if (err.message) debuglog(err.message)
      else if (err.stack) debuglog(err.stack)
      else debuglog(err)
      if (cb) cb(err)
    })
}
/**
 * @module electron-osx-sign
 */

'use strict'

const sign = require('./sign')
const flat = require('./flat')

/**
 * This function is a normal callback implementation.
 * @param {Object} opts - Options.
 * @param {RequestCallback} cb - Callback.
 */
module.exports = sign.sign // Aliasing

/**
 * This function is a normal callback implementation.
 * @function
 * @param {Object} opts - Options.
 * @param {RequestCallback} cb - Callback.
 */
module.exports.sign = sign.sign

/**
 * This function returns a promise signing the application.
 * @function
 * @param {mixed} opts - Options.
 * @returns {Promise} Promise.
 */
module.exports.signAsync = sign.signAsync

/**
 * This function is exported with normal callback implementation.
 * @function
 * @param {Object} opts - Options.
 * @param {RequestCallback} cb - Callback.
 */
module.exports.flat = flat.flat

/**
 * This function is exported and returns a promise flattening the application.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
module.exports.flatAsync = flat.flatAsync
{
  "author": {
    "name": "sethlu"
  },
  "bin": {
    "electron-osx-flat": "bin/electron-osx-flat.js",
    "electron-osx-sign": "bin/electron-osx-sign.js"
  },
  "dependencies": {
    "bluebird": "^3.5.0",
    "compare-version": "^0.1.2",
    "debug": "^2.6.8",
    "isbinaryfile": "^3.0.2",
    "minimist": "^1.2.0",
    "plist": "^3.0.1"
  },
  "deprecated": false,
  "description": "Codesign Electron macOS apps",
  "devDependencies": {
    "electron-download": "^4.1.0",
    "eslint": "^4.2.0",
    "eslint-config-eslint": "^4.0.0",
    "extract-zip": "^1.6.5",
    "mkdirp": "^0.5.1",
    "rimraf": "^2.6.1",
    "run-series": "^1.1.4",
    "run-waterfall": "^1.1.3",
    "standard": "^10.0.2",
    "tape": "^4.7.0"
  },
  "engines": {
    "node": ">=4.0.0"
  },
  "homepage": "https://github.com/electron-userland/electron-osx-sign",
  "license": "BSD-2-Clause",
  "main": "index.js",
  "name": "electron-osx-sign",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-osx-sign.git"
  },
  "standard": {
    "ignore": [
      "test/work"
    ]
  },
  "version": "0.4.11"
}/**
 * @module sign
 */

'use strict'

const path = require('path')

const Promise = require('bluebird')
const compareVersion = require('compare-version')

const pkg = require('./package.json')
const util = require('./util')
const debuglog = util.debuglog
const debugwarn = util.debugwarn
const getAppContentsPath = util.getAppContentsPath
const execFileAsync = util.execFileAsync
const validateOptsAppAsync = util.validateOptsAppAsync
const validateOptsPlatformAsync = util.validateOptsPlatformAsync
const walkAsync = util.walkAsync
const Identity = require('./util-identities').Identity
const findIdentitiesAsync = require('./util-identities').findIdentitiesAsync
const ProvisioningProfile = require('./util-provisioning-profiles').ProvisioningProfile
const preEmbedProvisioningProfile = require('./util-provisioning-profiles').preEmbedProvisioningProfile
const preAutoEntitlements = require('./util-entitlements').preAutoEntitlements

const osRelease = require('os').release()

/**
 * This function returns a promise validating opts.binaries, the additional binaries to be signed along with the discovered enclosed components.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
function validateOptsBinariesAsync (opts) {
  return new Promise(function (resolve, reject) {
    if (opts.binaries) {
      if (!Array.isArray(opts.binaries)) {
        reject(new Error('Additional binaries should be an Array.'))
        return
      }
      // TODO: Presence check for binary files, reject if any does not exist
    }
    resolve()
  })
}

/**
 * This function returns a promise validating all options passed in opts.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
function validateSignOptsAsync (opts) {
  if (opts.ignore && !(opts.ignore instanceof Array)) {
    opts.ignore = [opts.ignore]
  }

  if (opts['provisioning-profile']) {
    if (typeof opts['provisioning-profile'] !== 'string' && !(opts['provisioning-profile'] instanceof ProvisioningProfile)) return Promise.reject(new Error('Path to provisioning profile should be a string or a ProvisioningProfile object.'))
  }

  if (opts['type']) {
    if (opts['type'] !== 'development' && opts['type'] !== 'distribution') return Promise.reject(new Error('Type must be either `development` or `distribution`.'))
  } else {
    opts['type'] = 'distribution'
  }

  return Promise.map([
    validateOptsAppAsync,
    validateOptsPlatformAsync,
    validateOptsBinariesAsync
  ], function (validate) {
    return validate(opts)
  })
}

/**
 * This function returns a promise verifying the code sign of application bundle.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise resolving output.
 */
function verifySignApplicationAsync (opts) {
  // Verify with codesign
  var compareVersion = require('compare-version')
  debuglog('Verifying application bundle with codesign...')

  var promise = execFileAsync('codesign', [
    '--verify',
    '--deep'
  ]
    .concat(
      opts['strict-verify'] !== false &&
      compareVersion(osRelease, '15.0.0') >= 0 // Only pass strict flag in El Capitan and later
        ? ['--strict' +
            (opts['strict-verify']
             ? '=' + opts['strict-verify'] // Array should be converted to a comma separated string
             : '')]
        : [],
      ['--verbose=2', opts.app]))

  // Additionally test Gatekeeper acceptance for darwin platform
  if (opts.platform === 'darwin' && opts['gatekeeper-assess'] !== false) {
    promise = promise
      .then(function () {
        debuglog('Verifying Gatekeeper acceptance for darwin platform...')
        return execFileAsync('spctl', [
          '--assess',
          '--type', 'execute',
          '--verbose',
          '--ignore-cache',
          '--no-cache',
          opts.app
        ])
      })
  }

  return promise
    .thenReturn()
}

/**
 * This function returns a promise codesigning only.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
function signApplicationAsync (opts) {
  return walkAsync(getAppContentsPath(opts))
    .then(function (childPaths) {
      function ignoreFilePath (opts, filePath) {
        if (opts.ignore) {
          return opts.ignore.some(function (ignore) {
            if (typeof ignore === 'function') {
              return ignore(filePath)
            }
            return filePath.match(ignore)
          })
        }
        return false
      }

      if (opts.binaries) childPaths = childPaths.concat(opts.binaries)

      var args = [
        '--sign', opts.identity.hash || opts.identity.name,
        '--force'
      ]
      if (opts.keychain) {
        args.push('--keychain', opts.keychain)
      }
      if (opts.requirements) {
        args.push('--requirements', opts.requirements)
      }
      if (opts.timestamp) {
        args.push('--timestamp=' + opts.timestamp)
      }
      if (opts.hardenedRuntime || opts['hardened-runtime']) {
        // 17.7.0 === 10.13.6
        if (compareVersion(osRelease, '17.7.0') >= 0) {
          args.push('--options', 'runtime')
        } else {
          debuglog('Not enabling hardened runtime, current macOS version too low, requires 10.13.6 and higher')
        }
      }

      var promise
      if (opts.entitlements) {
        // Sign with entitlements
        promise = Promise.mapSeries(childPaths, function (filePath) {
          if (ignoreFilePath(opts, filePath)) {
            debuglog('Skipped... ' + filePath)
            return
          }
          debuglog('Signing... ' + filePath)
          return execFileAsync('codesign', args.concat('--entitlements', opts['entitlements-inherit'], filePath))
        })
          .then(function () {
            debuglog('Signing... ' + opts.app)
            return execFileAsync('codesign', args.concat('--entitlements', opts.entitlements, opts.app))
          })
      } else {
        // Otherwise normally
        promise = Promise.mapSeries(childPaths, function (filePath) {
          if (ignoreFilePath(opts, filePath)) {
            debuglog('Skipped... ' + filePath)
            return
          }
          debuglog('Signing... ' + filePath)
          return execFileAsync('codesign', args.concat(filePath))
        })
          .then(function () {
            debuglog('Signing... ' + opts.app)
            return execFileAsync('codesign', args.concat(opts.app))
          })
      }

      return promise
        .then(function () {
          // Verify code sign
          debuglog('Verifying...')
          var promise = verifySignApplicationAsync(opts)
            .then(function (result) {
              debuglog('Verified.')
            })

          // Check entitlements if applicable
          if (opts.entitlements) {
            promise = promise
              .then(function () {
                debuglog('Displaying entitlements...')
                return execFileAsync('codesign', [
                  '--display',
                  '--entitlements', ':-', // Write to standard output and strip off the blob header
                  opts.app
                ])
              })
              .then(function (result) {
                debuglog('Entitlements:', '\n',
                  result)
              })
          }

          return promise
        })
    })
}

/**
 * This function returns a promise signing the application.
 * @function
 * @param {mixed} opts - Options.
 * @returns {Promise} Promise.
 */
var signAsync = module.exports.signAsync = function (opts) {
  debuglog('electron-osx-sign@%s', pkg.version)
  return validateSignOptsAsync(opts)
    .then(function () {
      // Determine identity for signing
      var promise
      if (opts.identity) {
        debuglog('`identity` passed in arguments.')
        if (opts['identity-validation'] === false) {
          if (!(opts.identity instanceof Identity)) {
            opts.identity = new Identity(opts.identity)
          }
          return Promise.resolve()
        }
        promise = findIdentitiesAsync(opts, opts.identity)
      } else {
        debugwarn('No `identity` passed in arguments...')
        if (opts.platform === 'mas') {
          if (opts.type === 'distribution') {
            debuglog('Finding `3rd Party Mac Developer Application` certificate for signing app distribution in the Mac App Store...')
            promise = findIdentitiesAsync(opts, '3rd Party Mac Developer Application:')
          } else {
            debuglog('Finding `Mac Developer` certificate for signing app in development for the Mac App Store signing...')
            promise = findIdentitiesAsync(opts, 'Mac Developer:')
          }
        } else {
          debuglog('Finding `Developer ID Application` certificate for distribution outside the Mac App Store...')
          promise = findIdentitiesAsync(opts, 'Developer ID Application:')
        }
      }
      return promise
        .then(function (identities) {
          if (identities.length > 0) {
            // Identity(/ies) found
            if (identities.length > 1) {
              debugwarn('Multiple identities found, will use the first discovered.')
            } else {
              debuglog('Found 1 identity.')
            }
            opts.identity = identities[0]
          } else {
            // No identity found
            return Promise.reject(new Error('No identity found for signing.'))
          }
        })
    })
    .then(function () {
      // Determine entitlements for code signing
      var filePath
      if (opts.platform === 'mas') {
        // To sign apps for Mac App Store, an entitlements file is required, especially for app sandboxing (as well some other services).
        // Fallback entitlements for sandboxing by default: Note this may cause troubles while running an signed app due to missing keys special to the project.
        // Further reading: https://developer.apple.com/library/mac/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html
        if (!opts.entitlements) {
          filePath = path.join(__dirname, 'default.entitlements.mas.plist')
          debugwarn('No `entitlements` passed in arguments:', '\n',
            '* Sandbox entitlements are required for Mac App Store distribution, your codesign entitlements file is default to:', filePath)
          opts.entitlements = filePath
        }
        if (!opts['entitlements-inherit']) {
          filePath = path.join(__dirname, 'default.entitlements.mas.inherit.plist')
          debugwarn('No `entitlements-inherit` passed in arguments:', '\n',
            '* Sandbox entitlements file for enclosing app files is default to:', filePath)
          opts['entitlements-inherit'] = filePath
        }
      } else {
        // Not necessary to have entitlements for non Mac App Store distribution
        if (!opts.entitlements) {
          debugwarn('No `entitlements` passed in arguments:', '\n',
            '* Provide `entitlements` to specify entitlements file for codesign.')
        } else {
          // If entitlements is provided as a flag, fallback to default
          if (opts.entitlements === true) {
            filePath = path.join(__dirname, 'default.entitlements.darwin.plist')
            debugwarn('`entitlements` not specified in arguments:', '\n',
              '* Provide `entitlements` to specify entitlements file for codesign.', '\n',
              '* Sandbox entitlements file for enclosing app files is default to:', filePath)
            opts.entitlements = filePath
          }
          if (!opts['entitlements-inherit']) {
            filePath = path.join(__dirname, 'default.entitlements.darwin.inherit.plist')
            debugwarn('No `entitlements-inherit` passed in arguments:', '\n',
              '* Sandbox entitlements file for enclosing app files is default to:', filePath)
            opts['entitlements-inherit'] = filePath
          }
        }
      }
    })
    .then(function () {
      // Pre-sign operations
      var preSignOperations = []

      if (opts['pre-embed-provisioning-profile'] === false) {
        debugwarn('Pre-sign operation disabled for provisioning profile embedding:', '\n',
          '* Enable by setting `pre-embed-provisioning-profile` to `true`.')
      } else {
        debuglog('Pre-sign operation enabled for provisioning profile:', '\n',
          '* Disable by setting `pre-embed-previsioning-profile` to `false`.')
        preSignOperations.push(preEmbedProvisioningProfile)
      }

      if (opts['pre-auto-entitlements'] === false) {
        debugwarn('Pre-sign operation disabled for entitlements automation.')
      } else {
        debuglog('Pre-sign operation enabled for entitlements automation with versions >= `1.1.1`:', '\n',
          '* Disable by setting `pre-auto-entitlements` to `false`.')
        if (opts.entitlements && (!opts.version || compareVersion(opts.version, '1.1.1') >= 0)) {
          // Enable Mac App Store sandboxing without using temporary-exception, introduced in Electron v1.1.1. Relates to electron#5601
          preSignOperations.push(preAutoEntitlements)
        }
      }

      return Promise.mapSeries(preSignOperations, function (preSignOperation) {
        return preSignOperation(opts)
      })
    })
    .then(function () {
      debuglog('Signing application...', '\n',
        '> Application:', opts.app, '\n',
        '> Platform:', opts.platform, '\n',
        '> Entitlements:', opts.entitlements, '\n',
        '> Child entitlements:', opts['entitlements-inherit'], '\n',
        '> Additional binaries:', opts.binaries, '\n',
        '> Identity:', opts.identity)
      return signApplicationAsync(opts)
    })
    .then(function () {
      // Post-sign operations
      debuglog('Application signed.')
    })
}

/**
 * This function is a normal callback implementation.
 * @function
 * @param {Object} opts - Options.
 * @param {RequestCallback} cb - Callback.
 */
module.exports.sign = function (opts, cb) {
  signAsync(opts)
    .then(function () {
      debuglog('Application signed: ' + opts.app)
      if (cb) cb()
    })
    .catch(function (err) {
      debuglog('Sign failed:')
      if (err.message) debuglog(err.message)
      else if (err.stack) debuglog(err.stack)
      else debuglog(err)
      if (cb) cb(err)
    })
}
/**
 * @module util-entitlements
 */

'use strict'

const os = require('os')
const path = require('path')

const plist = require('plist')

const util = require('./util')
const debuglog = util.debuglog
const getAppContentsPath = util.getAppContentsPath
const readFileAsync = util.readFileAsync
const writeFileAsync = util.writeFileAsync

let tmpFileCounter = 0

/**
 * This function returns a promise completing the entitlements automation: The process includes checking in `Info.plist` for `ElectronTeamID` or setting parsed value from identity, and checking in entitlements file for `com.apple.security.application-groups` or inserting new into array. A temporary entitlements file may be created to replace the input for any changes introduced.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
module.exports.preAutoEntitlements = function (opts) {
  // If entitlements file not provided, default will be used. Fixes #41
  var appInfoPath = path.join(getAppContentsPath(opts), 'Info.plist')
  var appInfo
  var entitlements

  debuglog('Automating entitlement app group...', '\n',
    '> Info.plist:', appInfoPath, '\n',
    '> Entitlements:', opts.entitlements)
  return readFileAsync(opts.entitlements, 'utf8')
    .then(function (result) {
      entitlements = plist.parse(result)
      if (!entitlements['com.apple.security.app-sandbox']) {
        // Only automate when app sandbox enabled by user
        return
      }

      return readFileAsync(appInfoPath, 'utf8')
        .then(function (result) {
          appInfo = plist.parse(result)
          // Use ElectronTeamID in Info.plist if already specified
          if (appInfo.ElectronTeamID) {
            debuglog('`ElectronTeamID` found in `Info.plist`: ' + appInfo.ElectronTeamID)
          } else {
            // The team identifier in signing identity should not be trusted
            if (opts['provisioning-profile']) {
              appInfo.ElectronTeamID = opts['provisioning-profile'].message.Entitlements['com.apple.developer.team-identifier']
              debuglog('`ElectronTeamID` not found in `Info.plist`, use parsed from provisioning profile: ' + appInfo.ElectronTeamID)
            } else {
              appInfo.ElectronTeamID = opts.identity.name.substring(opts.identity.name.indexOf('(') + 1, opts.identity.name.lastIndexOf(')'))
              debuglog('`ElectronTeamID` not found in `Info.plist`, use parsed from signing identity: ' + appInfo.ElectronTeamID)
            }
            return writeFileAsync(appInfoPath, plist.build(appInfo), 'utf8')
              .then(function () {
                debuglog('`Info.plist` updated:', '\n',
                  '> Info.plist:', appInfoPath)
              })
          }
        })
        .then(function () {
          var appIdentifier = appInfo.ElectronTeamID + '.' + appInfo.CFBundleIdentifier
          // Insert application identifier if not exists
          if (entitlements['com.apple.application-identifier']) {
            debuglog('`com.apple.application-identifier` found in entitlements file: ' + entitlements['com.apple.application-identifier'])
          } else {
            debuglog('`com.apple.application-identifier` not found in entitlements file, new inserted: ' + appIdentifier)
            entitlements['com.apple.application-identifier'] = appIdentifier
          }
          // Insert developer team identifier if not exists
          if (entitlements['com.apple.developer.team-identifier']) {
            debuglog('`com.apple.developer.team-identifier` found in entitlements file: ' + entitlements['com.apple.developer.team-identifier'])
          } else {
            debuglog('`com.apple.developer.team-identifier` not found in entitlements file, new inserted: ' + appInfo.ElectronTeamID)
            entitlements['com.apple.developer.team-identifier'] = appInfo.ElectronTeamID
          }
          // Init entitlements app group key to array if not exists
          if (!entitlements['com.apple.security.application-groups']) {
            entitlements['com.apple.security.application-groups'] = []
          }
          // Insert app group if not exists
          if (Array.isArray(entitlements['com.apple.security.application-groups']) && entitlements['com.apple.security.application-groups'].indexOf(appIdentifier) === -1) {
            debuglog('`com.apple.security.application-groups` not found in entitlements file, new inserted: ' + appIdentifier)
            entitlements['com.apple.security.application-groups'].push(appIdentifier)
          } else {
            debuglog('`com.apple.security.application-groups` found in entitlements file: ' + appIdentifier)
          }
          // Create temporary entitlements file
          const entitlementsPath = path.join(os.tmpdir(), `tmp-entitlements-${process.pid.toString(16)}-${(tmpFileCounter++).toString(16)}.plist`)
          opts.entitlements = entitlementsPath
          return writeFileAsync(entitlementsPath, plist.build(entitlements), 'utf8')
            .then(function () {
              debuglog('Entitlements file updated:', '\n',
                '> Entitlements:', entitlementsPath)
            })
        })
    })
}
/**
 * @module util-identities
 */

'use strict'

const util = require('./util')
const debuglog = util.debuglog
const flatList = util.flatList
const execFileAsync = util.execFileAsync

/**
 * @constructor
 * @param {string} name - Name of the signing identity.
 * @param {String} hash - SHA-1 hash of the identity.
 */
var Identity = module.exports.Identity = function (name, hash) {
  this.name = name
  this.hash = hash
}

/**
 * This function returns a promise checking the indentity proposed and updates the identity option to a exact finding from results.
 * @function
 * @param {Object} opts - Options.
 * @param {string} identity - The proposed identity.
 * @returns {Promise} Promise.
 */
module.exports.findIdentitiesAsync = function (opts, identity) {
  // Only to look for valid identities, excluding those flagged with
  // CSSMERR_TP_CERT_EXPIRED or CSSMERR_TP_NOT_TRUSTED. Fixes #9

  var args = [
    'find-identity',
    '-v'
  ]
  if (opts.keychain) {
    args.push(opts.keychain)
  }

  return execFileAsync('security', args)
    .then(function (result) {
      return result.split('\n').map(function (line) {
        if (line.indexOf(identity) >= 0) {
          var identityFound = line.substring(line.indexOf('"') + 1, line.lastIndexOf('"'))
          var identityHashFound = line.substring(line.indexOf(')') + 2, line.indexOf('"') - 1)
          debuglog('Identity:', '\n',
            '> Name:', identityFound, '\n',
            '> Hash:', identityHashFound)
          return new Identity(identityFound, identityHashFound)
        }
      })
    })
    .then(flatList)
}
/**
 * @module util-provisioning-profiles
 */

'use strict'

const path = require('path')

const Promise = require('bluebird')
const plist = require('plist')

const util = require('./util')
const debuglog = util.debuglog
const debugwarn = util.debugwarn
const getAppContentsPath = util.getAppContentsPath
const flatList = util.flatList
const copyFileAsync = util.copyFileAsync
const execFileAsync = util.execFileAsync
const lstatAsync = util.lstatAsync
const readdirAsync = util.readdirAsync

/**
 * @constructor
 * @param {string} filePath - Path to provisioning profile.
 * @param {Object} message - Decoded message in provisioning profile.
 */
var ProvisioningProfile = module.exports.ProvisioningProfile = function (filePath, message) {
  this.filePath = filePath
  this.message = message
}

Object.defineProperty(ProvisioningProfile.prototype, 'name', {
  get: function () {
    return this.message['Name']
  }
})

Object.defineProperty(ProvisioningProfile.prototype, 'platforms', {
  get: function () {
    if ('ProvisionsAllDevices' in this.message) return ['darwin'] // Developer ID
    else if (this.type === 'distribution') return ['mas'] // Mac App Store
    else return ['darwin', 'mas'] // Mac App Development
  }
})

Object.defineProperty(ProvisioningProfile.prototype, 'type', {
  get: function () {
    if ('ProvisionedDevices' in this.message) return 'development' // Mac App Development
    else return 'distribution' // Developer ID or Mac App Store
  }
})

/**
 * Returns a promise resolving to a ProvisioningProfile instance based on file.
 * @function
 * @param {string} filePath - Path to provisioning profile.
 * @returns {Promise} Promise.
 */
var getProvisioningProfileAsync = module.exports.getProvisioningProfileAsync = function (filePath) {
  return execFileAsync('security', [
    'cms',
    '-D', // Decode a CMS message
    '-i', filePath // Use infile as source of data
  ])
    .then(function (result) {
      var provisioningProfile = new ProvisioningProfile(filePath, plist.parse(result))
      debuglog('Provisioning profile:', '\n',
        '> Name:', provisioningProfile.name, '\n',
        '> Platforms:', provisioningProfile.platforms, '\n',
        '> Type:', provisioningProfile.type, '\n',
        '> Path:', provisioningProfile.filePath, '\n',
        '> Message:', provisioningProfile.message)
      return provisioningProfile
    })
}

/**
 * Returns a promise resolving to a list of suitable provisioning profile within the current working directory.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
var findProvisioningProfilesAsync = module.exports.findProvisioningProfilesAsync = function (opts) {
  return Promise.map([
    process.cwd() // Current working directory
  ], function (dirPath) {
    return readdirAsync(dirPath)
      .map(function (name) {
        var filePath = path.join(dirPath, name)
        return lstatAsync(filePath)
          .then(function (stat) {
            if (stat.isFile()) {
              switch (path.extname(filePath)) {
                case '.provisionprofile':
                  return filePath
              }
            }
            return undefined
          })
      })
  })
    .then(flatList)
    .map(function (filePath) {
      return getProvisioningProfileAsync(filePath)
        .then(function (provisioningProfile) {
          if (provisioningProfile.platforms.indexOf(opts.platform) >= 0 && provisioningProfile.type === opts.type) return provisioningProfile
          debugwarn('Provisioning profile above ignored, not for ' + opts.platform + ' ' + opts.type + '.')
          return undefined
        })
    })
    .then(flatList)
}

/**
 * Returns a promise embedding the provisioning profile in the app Contents folder.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
module.exports.preEmbedProvisioningProfile = function (opts) {
  function embedProvisioningProfile () {
    if (opts['provisioning-profile']) {
      debuglog('Looking for existing provisioning profile...')
      var embeddedFilePath = path.join(getAppContentsPath(opts), 'embedded.provisionprofile')
      return lstatAsync(embeddedFilePath)
        .then(function (stat) {
          debuglog('Found embedded provisioning profile:', '\n',
            '* Please manually remove the existing file if not wanted.', '\n',
            '* Current file at:', embeddedFilePath)
        })
        .catch(function (err) {
          if (err.code === 'ENOENT') {
            // File does not exist
            debuglog('Embedding provisioning profile...')
            return copyFileAsync(opts['provisioning-profile'].filePath, embeddedFilePath)
          } else throw err
        })
    }
  }

  if (opts['provisioning-profile']) {
    // User input provisioning profile
    debuglog('`provisioning-profile` passed in arguments.')
    if (opts['provisioning-profile'] instanceof ProvisioningProfile) {
      return embedProvisioningProfile()
    } else {
      return getProvisioningProfileAsync(opts['provisioning-profile'])
        .then(function (provisioningProfile) {
          opts['provisioning-profile'] = provisioningProfile
        })
        .then(embedProvisioningProfile)
    }
  } else {
    // Discover provisioning profile
    debuglog('No `provisioning-profile` passed in arguments, will find in current working directory and in user library...')
    return findProvisioningProfilesAsync(opts)
      .then(function (provisioningProfiles) {
        if (provisioningProfiles.length > 0) {
          // Provisioning profile(s) found
          if (provisioningProfiles.length > 1) {
            debuglog('Multiple provisioning profiles found, will use the first discovered.')
          } else {
            debuglog('Found 1 provisioning profile.')
          }
          opts['provisioning-profile'] = provisioningProfiles[0]
        } else {
          // No provisioning profile found
          debuglog('No provisioning profile found, will not embed profile in app contents.')
        }
      })
      .then(embedProvisioningProfile)
  }
}
/**
 * @module util
 */

'use strict'

const child = require('child_process')
const fs = require('fs')
const path = require('path')

const Promise = require('bluebird')
const debug = require('debug')

/**
 * This callback is used across signing and flattening.
 * @callback RequestCallback
 * @param {?Error} err
 */

/** @function */
const debuglog = module.exports.debuglog = debug('electron-osx-sign')
debuglog.log = console.log.bind(console)

/** @function */
const debugwarn = module.exports.debugwarn = debug('electron-osx-sign:warn')
debugwarn.log = console.warn.bind(console)

/** @function */
const isBinaryFileAsync = module.exports.isBinaryFileAsync = Promise.promisify(require('isbinaryfile'))

/** @function */
const removePassword = function (input) {
  return input.replace(/(-P |pass:|\/p|-pass )([^ ]+)/, function (match, p1, p2) {
    return `${p1}***`
  })
}

/** @function */
module.exports.execFileAsync = function (file, args, options) {
  if (debuglog.enabled) {
    debuglog('Executing...', file, args && Array.isArray(args) ? removePassword(args.join(' ')) : '')
  }

  return new Promise(function (resolve, reject) {
    child.execFile(file, args, options, function (err, stdout, stderr) {
      if (err) {
        debuglog('Error executing file:', '\n',
          '> Stdout:', stdout, '\n',
          '> Stderr:', stderr)
        reject(err)
        return
      }
      resolve(stdout)
    })
  })
}

/** @function */
const lstatAsync = module.exports.lstatAsync = Promise.promisify(fs.lstat)

/** @function */
const readdirAsync = module.exports.readdirAsync = Promise.promisify(fs.readdir)

/** @function */
module.exports.readFileAsync = Promise.promisify(fs.readFile)

/** @function */
module.exports.writeFileAsync = Promise.promisify(fs.writeFile)

/**
 * This function returns a flattened list of elements from an array of lists.
 * @function
 * @param {*} list - List.
 * @returns Flattened list.
 */
var flatList = module.exports.flatList = function (list) {
  function populateResult (list) {
    if (!Array.isArray(list)) {
      result.push(list)
    } else if (list.length > 0) {
      for (let item of list) if (item) populateResult(item)
    }
  }

  var result = []
  populateResult(list)
  return result
}

/**
 * This function returns the path to app contents.
 * @function
 * @param {Object} opts - Options.
 * @returns {string} App contents path.
 */
var getAppContentsPath = module.exports.getAppContentsPath = function (opts) {
  return path.join(opts.app, 'Contents')
}

/**
 * This function returns the path to app frameworks within contents.
 * @function
 * @param {Object} opts - Options.
 * @returns {string} App frameworks path.
 */
var getAppFrameworksPath = module.exports.getAppFrameworksPath = function (opts) {
  return path.join(getAppContentsPath(opts), 'Frameworks')
}

/**
 * This function returns a promise copying a file from the source to the target.
 * @function
 * @param {string} source - Source path.
 * @param {string} target - Target path.
 * @returns {Promise} Promise.
 */
module.exports.copyFileAsync = function (source, target) {
  debuglog('Copying file...', '\n',
    '> Source:', source, '\n',
    '> Target:', target)
  return new Promise(function (resolve, reject) {
    var readStream = fs.createReadStream(source)
    readStream.on('error', reject)
    var writeStream = fs.createWriteStream(target)
    writeStream.on('error', reject)
    writeStream.on('close', resolve)
    readStream.pipe(writeStream)
  })
}

/**
 * This function returns a promise with platform resolved.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise resolving platform.
 */
var detectElectronPlatformAsync = module.exports.detectElectronPlatformAsync = function (opts) {
  return new Promise(function (resolve) {
    var appFrameworksPath = getAppFrameworksPath(opts)
    // The presence of Squirrel.framework identifies a Mac App Store build as used in https://github.com/atom/electron/blob/master/docs/tutorial/mac-app-store-submission-guide.md
    return lstatAsync(path.join(appFrameworksPath, 'Squirrel.framework'))
      .then(function () {
        resolve('darwin')
      })
      .catch(function () {
        resolve('mas')
      })
  })
}

/**
 * This function returns a promise resolving the file path if file binary.
 * @function
 * @param {string} filePath - Path to file.
 * @returns {Promise} Promise resolving file path or undefined.
 */
var getFilePathIfBinaryAsync = module.exports.getFilePathIfBinaryAsync = function (filePath) {
  return isBinaryFileAsync(filePath)
    .then(function (isBinary) {
      return isBinary ? filePath : undefined
    })
}

/**
 * This function returns a promise validating opts.app, the application to be signed or flattened.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
module.exports.validateOptsAppAsync = function (opts) {
  if (!opts.app) {
    return Promise.reject(new Error('Path to aplication must be specified.'))
  }
  if (path.extname(opts.app) !== '.app') {
    return Promise.reject(new Error('Extension of application must be `.app`.'))
  }
  return lstatAsync(opts.app)
    .thenReturn()
}

/**
 * This function returns a promise validating opts.platform, the platform of Electron build. It allows auto-discovery if no opts.platform is specified.
 * @function
 * @param {Object} opts - Options.
 * @returns {Promise} Promise.
 */
module.exports.validateOptsPlatformAsync = function (opts) {
  if (opts.platform) {
    if (opts.platform === 'mas' || opts.platform === 'darwin') {
      return Promise.resolve()
    } else {
      debugwarn('`platform` passed in arguments not supported, checking Electron platform...')
    }
  } else {
    debugwarn('No `platform` passed in arguments, checking Electron platform...')
  }

  return detectElectronPlatformAsync(opts)
    .then(function (platform) {
      opts.platform = platform
    })
}

/**
 * This function returns a promise resolving all child paths within the directory specified.
 * @function
 * @param {string} dirPath - Path to directory.
 * @returns {Promise} Promise resolving child paths needing signing in order.
 */
module.exports.walkAsync = function (dirPath) {
  debuglog('Walking... ' + dirPath)

  var unlinkAsync = Promise.promisify(fs.unlink)

  function _walkAsync (dirPath) {
    return readdirAsync(dirPath)
      .then(function (names) {
        return Promise.map(names, function (name) {
          var filePath = path.join(dirPath, name)
          return lstatAsync(filePath)
            .then(function (stat) {
              if (stat.isFile()) {
                switch (path.extname(filePath)) {
                  case '': // Binary
                    if (path.basename(filePath)[0] !== '.') {
                      return getFilePathIfBinaryAsync(filePath)
                    } // Else reject hidden file
                    break
                  case '.dylib': // Dynamic library
                  case '.node': // Native node addon
                    return filePath
                  case '.cstemp': // Temporary file generated from past codesign
                    debuglog('Removing... ' + filePath)
                    return unlinkAsync(filePath)
                      .thenReturn(undefined)
                  default:
                    if (path.extname(filePath).indexOf(' ') >= 0) {
                      // Still consider the file as binary if extension seems invalid
                      return getFilePathIfBinaryAsync(filePath)
                    }
                }
              } else if (stat.isDirectory() && !stat.isSymbolicLink()) {
                return _walkAsync(filePath)
                  .then(function (result) {
                    switch (path.extname(filePath)) {
                      case '.app': // Application
                      case '.framework': // Framework
                        result.push(filePath)
                    }
                    return result
                  })
              }
            })
        })
      })
  }

  return _walkAsync(dirPath)
    .then(flatList)
}

NAME
  electron-osx-flat -- product building for Electron apps

SYNOPSIS
  electron-osx-flat app [options ...]

DESCRIPTION
  app
    Path to the application package.
    Needs file extension ``.app''.

  --help
    Flag to display all commands.

  --identity=identity
    Name of certificate to use when signing.
    Default to selected with respect to --platform from --keychain specified or keychain by system default.

  --identity-validation, --no-identity-validation
    Flag to enable/disable validation for the signing identity.

  --install=install-path
    Path to install the bundle.
    Default to ``/Applications''.

  --keychain=keychain
    The keychain name.
    Default to system default keychain.

  --platform=platform
    Build platform of Electron.
    Allowed values: ``darwin'', ``mas''.
    Default to auto detect from application bundle.

  --pkg
    Path to the output the flattened package.
    Needs file extension ``.pkg''.

  --scripts
    Path to a directory containing pre and/or post install scripts.
#!/usr/bin/env node

var fs = require('fs')
var path = require('path')
var args = require('minimist')(process.argv.slice(2), {
  'boolean': [
    'help'
  ]
})
var usage = fs.readFileSync(path.join(__dirname, 'electron-osx-flat-usage.txt')).toString()
var flat = require('../').flat

args.app = args._.shift()

if (!args.app || args.help) {
  console.log(usage)
  process.exit(0)
}

// Remove excess arguments
delete args._
delete args.help

flat(args, function done (err) {
  if (err) {
    console.error('Flat failed:')
    if (err.message) console.error(err.message)
    else if (err.stack) console.error(err.stack)
    else console.log(err)
    process.exit(1)
  }
  console.log('Application flattened, saved to:', args.pkg)
  process.exit(0)
})

NAME
  electron-osx-sign -- code signing for Electron apps

SYNOPSIS
  electron-osx-sign app [embedded-binary ...] [options ...]

DESCRIPTION
  app
    Path to the application package.
    Needs file extension ``.app''.

  embedded-binary ...
    Path to additional binaries that will be signed along with built-ins of Electron, spaced.

  --entitlements=file
    Path to entitlements file for signing the app.
    Default to built-in entitlements file, Sandbox enabled for Mac App Store platform.

  --entitlements-inherit=file
    Path to child entitlements which inherit the security settings for signing frameworks and bundles of a distribution.
    This option only applies when signing with entitlements.

  --gatekeeper-assess, --no-gatekeeper-assess
    Flag to enable/disable Gatekeeper assessment after signing the app. Disabling it is useful for signing with self-signed certificates.
    Gatekeeper assessment is enabled by default on ``darwin'' platform.

  --hardened-runtime
    Flag to enable the Mojave hardened runtime when signing the app.  Disabled by default, requires Xcode >= 10 and macOS
    >= 10.13.6.

  --help
    Flag to display all commands.

  --identity=identity
    Name of certificate to use when signing.
    Default to selected with respect to --provisioning-profile and --platform from --keychain specified or keychain by system default.

  --identity-validation, --no-identity-validation
    Flag to enable/disable validation for the signing identity.

  --ignore=path
    Path to skip signing. The string will be treated as a regular expression when used to match the file paths.

  --keychain=keychain
    The keychain name.
    Default to system default keychain.

  --platform=platform
    Build platform of Electron.
    Allowed values: ``darwin'', ``mas''.
    Default to auto detect from application bundle.

  --pre-auto-entitlements, --no-pre-auto-entitlements
    Flag to enable/disable automation of entitlements file and Info.plist.

  --pre-embed-provisioning-profile, --no-pre-embed-provisioning-profile
    Flag to enable/disable embedding of provisioning profile.

  --provisioning-profile=file
    Path to provisioning profile.

  --requirements=requirements
    Specify the criteria that you recommend to be used to evaluate the code signature.

  --strict-verify, --strict-verify=options, --no-strict-verify
    Flag to enable/disable ``--strict'' flag when verifying the signed application bundle.
    Each component should be separated in ``options'' with comma (``,'').
    Enabled by default.

  --timestamp=timestamp
    Specify the URL of the timestamp authority server, default to server provided by Apple.
    Disable the timestamp service with ``none''.

  --type=type
    Specify whether to sign app for development or for distribution.
    Allowed values: ``development'', ``distribution''.
    Default to ``distribution''.

  --version=version
    Build version of Electron.
    Values may be: ``1.2.0''.
    Default to latest Electron version.
#!/usr/bin/env node

var fs = require('fs')
var path = require('path')
var args = require('minimist')(process.argv.slice(2), {
  'boolean': [
    'help',
    'pre-auto-entitlements',
    'pre-embed-provisioning-profile',
    'gatekeeper-assess',
    'hardened-runtime'
  ],
  'default': {
    'pre-auto-entitlements': true,
    'pre-embed-provisioning-profile': true,
    'gatekeeper-assess': true
  }
})
var usage = fs.readFileSync(path.join(__dirname, 'electron-osx-sign-usage.txt')).toString()
var sign = require('../').sign

args.app = args._.shift()
args.binaries = args._

if (!args.app || args.help) {
  console.log(usage)
  process.exit(0)
}

// Remove excess arguments
delete args._
delete args.help

sign(args, function done (err) {
  if (err) {
    console.error('Sign failed:')
    if (err.message) console.error(err.message)
    else if (err.stack) console.error(err.stack)
    else console.log(err)
    process.exit(1)
  }
  console.log('Application signed:', args.app)
  process.exit(0)
})
{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "bluebird-lst": "^1.0.9",
    "builder-util": "~10.1.2",
    "builder-util-runtime": "^8.2.5",
    "chalk": "^2.4.2",
    "fs-extra-p": "^8.0.2",
    "lazy-val": "^1.0.4",
    "mime": "^2.4.4"
  },
  "deprecated": false,
  "description": "Part of [electron-builder](https://github.com/electron-userland/electron-builder).",
  "files": [
    "out"
  ],
  "homepage": "https://github.com/electron-userland/electron-builder",
  "license": "MIT",
  "main": "out/publisher.js",
  "name": "electron-publish",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-builder.git"
  },
  "typings": "./out/publisher.d.ts",
  "version": "20.44.4"
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.BintrayPublisher = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _bintray() {
  const data = require("builder-util-runtime/out/bintray");

  _bintray = function () {
    return data;
  };

  return data;
}

function _nodeHttpExecutor() {
  const data = require("builder-util/out/nodeHttpExecutor");

  _nodeHttpExecutor = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

function _publisher() {
  const data = require("./publisher");

  _publisher = function () {
    return data;
  };

  return data;
}

class BintrayPublisher extends _publisher().HttpPublisher {
  constructor(context, info, version, options = {}) {
    super(context);
    this.version = version;
    this.options = options;
    this._versionPromise = new (_lazyVal().Lazy)(() => this.init());
    this.providerName = "Bintray";
    let token = info.token;

    if ((0, _builderUtil().isEmptyOrSpaces)(token)) {
      token = process.env.BT_TOKEN;

      if ((0, _builderUtil().isEmptyOrSpaces)(token)) {
        throw new (_builderUtil().InvalidConfigurationError)(`Bintray token is not set, neither programmatically, nor using env "BT_TOKEN" (see https://www.electron.build/configuration/publish#bintrayoptions)`);
      }

      token = token.trim();

      if (!(0, _builderUtil().isTokenCharValid)(token)) {
        throw new (_builderUtil().InvalidConfigurationError)(`Bintray token (${JSON.stringify(token)}) contains invalid characters, please check env "BT_TOKEN"`);
      }
    }

    this.client = new (_bintray().BintrayClient)(info, _nodeHttpExecutor().httpExecutor, this.context.cancellationToken, token);
  }

  init() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      try {
        return yield _this.client.getVersion(_this.version);
      } catch (e) {
        if (e instanceof _builderUtilRuntime().HttpError && e.statusCode === 404) {
          if (_this.options.publish !== "onTagOrDraft") {
            _builderUtil().log.info({
              version: _this.version
            }, "version doesn't exist, creating one");

            return _this.client.createVersion(_this.version);
          } else {
            _builderUtil().log.notice({
              reason: "version doesn't exist",
              version: _this.version
            }, "skipped publishing");
          }
        }

        throw e;
      }
    })();
  }

  doUpload(fileName, arch, dataLength, requestProcessor) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const version = yield _this2._versionPromise.value;

      if (version == null) {
        _builderUtil().log.notice({
          file: fileName,
          reason: "version doesn't exist and is not created",
          version: _this2.version
        }, "skipped publishing");

        return;
      }

      const options = {
        hostname: "api.bintray.com",
        path: `/content/${_this2.client.owner}/${_this2.client.repo}/${_this2.client.packageName}/${encodeURI(`${version.name}/${fileName}`)}`,
        method: "PUT",
        headers: {
          "Content-Length": dataLength,
          "X-Bintray-Override": "1",
          "X-Bintray-Publish": "1",
          "X-Bintray-Debian-Architecture": (0, _builderUtil().toLinuxArchString)(arch)
        }
      };

      if (_this2.client.distribution != null) {
        options.headers["X-Bintray-Debian-Distribution"] = _this2.client.distribution;
      }

      if (_this2.client.component != null) {
        options.headers["X-Bintray-Debian-Component"] = _this2.client.component;
      }

      for (let attemptNumber = 0;; attemptNumber++) {
        try {
          return yield _nodeHttpExecutor().httpExecutor.doApiRequest((0, _builderUtilRuntime().configureRequestOptions)(options, _this2.client.auth), _this2.context.cancellationToken, requestProcessor);
        } catch (e) {
          if (attemptNumber < 3 && (e instanceof _builderUtilRuntime().HttpError && e.statusCode === 502 || e.code === "EPIPE")) {
            continue;
          }

          throw e;
        }
      }
    })();
  } //noinspection JSUnusedGlobalSymbols


  deleteRelease(isForce = false) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (!isForce && !_this3._versionPromise.hasValue) {
        return;
      }

      const version = yield _this3._versionPromise.value;

      if (version != null) {
        yield _this3.client.deleteVersion(version.name);
      }
    })();
  }

  toString() {
    return `Bintray (user: ${this.client.user || this.client.owner}, owner: ${this.client.owner},  package: ${this.client.packageName}, repository: ${this.client.repo}, version: ${this.version})`;
  }

} exports.BintrayPublisher = BintrayPublisher;
// __ts-babel@6.0.4
//# sourceMappingURL=BintrayPublisher.js.map{"version":3,"sources":["../src/BintrayPublisher.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, InvalidConfigurationError, isEmptyOrSpaces, isTokenCharValid, log, toLinuxArchString } from \"builder-util\"\nimport { BintrayOptions, configureRequestOptions, HttpError } from \"builder-util-runtime\"\nimport { BintrayClient, Version } from \"builder-util-runtime/out/bintray\"\nimport { httpExecutor } from \"builder-util/out/nodeHttpExecutor\"\nimport { ClientRequest, RequestOptions } from \"http\"\nimport { Lazy } from \"lazy-val\"\nimport { HttpPublisher, PublishContext, PublishOptions } from \"./publisher\"\n\nexport class BintrayPublisher extends HttpPublisher {\n  private readonly _versionPromise = new Lazy(() => this.init())\n\n  private readonly client: BintrayClient\n\n  readonly providerName = \"Bintray\"\n\n  constructor(context: PublishContext, info: BintrayOptions, private readonly version: string, private readonly options: PublishOptions = {}) {\n    super(context)\n\n    let token = info.token\n    if (isEmptyOrSpaces(token)) {\n      token = process.env.BT_TOKEN\n      if (isEmptyOrSpaces(token)) {\n        throw new InvalidConfigurationError(`Bintray token is not set, neither programmatically, nor using env \"BT_TOKEN\" (see https://www.electron.build/configuration/publish#bintrayoptions)`)\n      }\n\n      token = token.trim()\n\n      if (!isTokenCharValid(token)) {\n        throw new InvalidConfigurationError(`Bintray token (${JSON.stringify(token)}) contains invalid characters, please check env \"BT_TOKEN\"`)\n      }\n    }\n\n    this.client = new BintrayClient(info, httpExecutor, this.context.cancellationToken, token)\n  }\n\n  private async init(): Promise<Version | null> {\n    try {\n      return await this.client.getVersion(this.version)\n    }\n    catch (e) {\n      if (e instanceof HttpError && e.statusCode === 404) {\n        if (this.options.publish !== \"onTagOrDraft\") {\n          log.info({version: this.version}, \"version doesn't exist, creating one\")\n          return this.client.createVersion(this.version)\n        }\n        else {\n          log.notice({reason: \"version doesn't exist\", version: this.version}, \"skipped publishing\")\n        }\n      }\n\n      throw e\n    }\n  }\n\n  protected async doUpload(fileName: string, arch: Arch, dataLength: number, requestProcessor: (request: ClientRequest, reject: (error: Error) => void) => void) {\n    const version = await this._versionPromise.value\n    if (version == null) {\n      log.notice({file: fileName, reason: \"version doesn't exist and is not created\", version: this.version}, \"skipped publishing\")\n      return\n    }\n\n    const options: RequestOptions = {\n      hostname: \"api.bintray.com\",\n      path: `/content/${this.client.owner}/${this.client.repo}/${this.client.packageName}/${encodeURI(`${version.name}/${fileName}`)}`,\n      method: \"PUT\",\n      headers: {\n        \"Content-Length\": dataLength,\n        \"X-Bintray-Override\": \"1\",\n        \"X-Bintray-Publish\": \"1\",\n        \"X-Bintray-Debian-Architecture\": toLinuxArchString(arch)\n      }\n    }\n\n    if (this.client.distribution != null) {\n      options.headers!![\"X-Bintray-Debian-Distribution\"] = this.client.distribution\n    }\n\n    if (this.client.component != null) {\n      options.headers!![\"X-Bintray-Debian-Component\"] = this.client.component\n    }\n\n    for (let attemptNumber = 0; ; attemptNumber++) {\n      try {\n        return await httpExecutor.doApiRequest(configureRequestOptions(options, this.client.auth), this.context.cancellationToken, requestProcessor)\n      }\n      catch (e) {\n        if (attemptNumber < 3 && ((e instanceof HttpError && e.statusCode === 502) || e.code === \"EPIPE\")) {\n          continue\n        }\n\n        throw e\n      }\n    }\n  }\n\n  //noinspection JSUnusedGlobalSymbols\n  async deleteRelease(isForce = false): Promise<void> {\n    if (!isForce && !this._versionPromise.hasValue) {\n      return\n    }\n\n    const version = (await this._versionPromise.value)\n    if (version != null) {\n      await this.client.deleteVersion(version.name)\n    }\n  }\n\n  toString() {\n    return `Bintray (user: ${this.client.user || this.client.owner}, owner: ${this.client.owner},  package: ${this.client.packageName}, repository: ${this.client.repo}, version: ${this.version})`\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.GitHubPublisher = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _nodeHttpExecutor() {
  const data = require("builder-util/out/nodeHttpExecutor");

  _nodeHttpExecutor = function () {
    return data;
  };

  return data;
}

function _lazyVal() {
  const data = require("lazy-val");

  _lazyVal = function () {
    return data;
  };

  return data;
}

function _mime() {
  const data = _interopRequireDefault(require("mime"));

  _mime = function () {
    return data;
  };

  return data;
}

function _url() {
  const data = require("url");

  _url = function () {
    return data;
  };

  return data;
}

function _publisher() {
  const data = require("./publisher");

  _publisher = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

class GitHubPublisher extends _publisher().HttpPublisher {
  constructor(context, info, version, options = {}) {
    super(context, true);
    this.info = info;
    this.version = version;
    this.options = options;
    this._release = new (_lazyVal().Lazy)(() => this.token === "__test__" ? Promise.resolve(null) : this.getOrCreateRelease());
    this.providerName = "GitHub";
    this.releaseLogFields = null;
    let token = info.token;

    if ((0, _builderUtil().isEmptyOrSpaces)(token)) {
      token = process.env.GH_TOKEN || process.env.GITHUB_TOKEN;

      if ((0, _builderUtil().isEmptyOrSpaces)(token)) {
        throw new (_builderUtil().InvalidConfigurationError)(`GitHub Personal Access Token is not set, neither programmatically, nor using env "GH_TOKEN"`);
      }

      token = token.trim();

      if (!(0, _builderUtil().isTokenCharValid)(token)) {
        throw new (_builderUtil().InvalidConfigurationError)(`GitHub Personal Access Token (${JSON.stringify(token)}) contains invalid characters, please check env "GH_TOKEN"`);
      }
    }

    this.token = token;

    if (version.startsWith("v")) {
      throw new (_builderUtil().InvalidConfigurationError)(`Version must not start with "v": ${version}`);
    }

    this.tag = info.vPrefixedTagName === false ? version : `v${version}`;

    if ((0, _builderUtil().isEnvTrue)(process.env.EP_DRAFT)) {
      this.releaseType = "draft";

      _builderUtil().log.info({
        reason: "env EP_DRAFT is set to true"
      }, "GitHub provider release type is set to draft");
    } else if ((0, _builderUtil().isEnvTrue)(process.env.EP_PRE_RELEASE) || (0, _builderUtil().isEnvTrue)(process.env.EP_PRELEASE)
    /* https://github.com/electron-userland/electron-builder/issues/2878 */
    ) {
        this.releaseType = "prerelease";

        _builderUtil().log.info({
          reason: "env EP_PRE_RELEASE is set to true"
        }, "GitHub provider release type is set to prerelease");
      } else if (info.releaseType != null) {
      this.releaseType = info.releaseType;
    } else if (options.prerelease) {
      this.releaseType = "prerelease";
    } else {
      this.releaseType = options.draft === false ? "release" : "draft";
    }
  }

  getOrCreateRelease() {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const logFields = {
        tag: _this.tag,
        version: _this.version
      }; // we don't use "Get a release by tag name" because "tag name" means existing git tag, but we draft release and don't create git tag

      const releases = yield _this.githubRequest(`/repos/${_this.info.owner}/${_this.info.repo}/releases`, _this.token);

      for (const release of releases) {
        if (!(release.tag_name === _this.tag || release.tag_name === _this.version)) {
          continue;
        }

        if (release.draft) {
          return release;
        } // https://github.com/electron-userland/electron-builder/issues/1197
        // https://electron-builder.slack.com/archives/general/p1485961449000202
        // https://github.com/electron-userland/electron-builder/issues/2072


        if (_this.releaseType === "draft") {
          _this.releaseLogFields = Object.assign({
            reason: "existing type not compatible with publishing type"
          }, logFields, {
            existingType: release.prerelease ? "pre-release" : "release",
            publishingType: _this.releaseType
          });

          _builderUtil().log.warn(_this.releaseLogFields, "GitHub release not created");

          return null;
        } // https://github.com/electron-userland/electron-builder/issues/1133
        // https://github.com/electron-userland/electron-builder/issues/2074
        // if release created < 2 hours â€” allow to upload


        const publishedAt = release.published_at == null ? null : Date.parse(release.published_at);

        if (publishedAt != null && Date.now() - publishedAt > 2 * 3600 * 1000) {
          // https://github.com/electron-userland/electron-builder/issues/1183#issuecomment-275867187
          _this.releaseLogFields = Object.assign({
            reason: "existing release published more than 2 hours ago"
          }, logFields, {
            date: new Date(publishedAt).toString()
          });

          _builderUtil().log.warn(_this.releaseLogFields, "GitHub release not created");

          return null;
        }

        return release;
      } // https://github.com/electron-userland/electron-builder/issues/1835


      if (_this.options.publish === "always" || (0, _publisher().getCiTag)() != null) {
        _builderUtil().log.info(Object.assign({
          reason: "release doesn't exist"
        }, logFields), `creating GitHub release`);

        return _this.createRelease();
      }

      _this.releaseLogFields = Object.assign({
        reason: "release doesn't exist and not created because \"publish\" is not \"always\" and build is not on tag"
      }, logFields);
      return null;
    })();
  }

  overwriteArtifact(fileName, release) {
    var _this2 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      // delete old artifact and re-upload
      _builderUtil().log.notice({
        file: fileName,
        reason: "already exists on GitHub"
      }, "overwrite published file");

      const assets = yield _this2.githubRequest(`/repos/${_this2.info.owner}/${_this2.info.repo}/releases/${release.id}/assets`, _this2.token, null);

      for (const asset of assets) {
        if (asset.name === fileName) {
          yield _this2.githubRequest(`/repos/${_this2.info.owner}/${_this2.info.repo}/releases/assets/${asset.id}`, _this2.token, null, "DELETE");
          return;
        }
      }

      _builderUtil().log.debug({
        file: fileName,
        reason: "not found on GitHub"
      }, "trying to upload again");
    })();
  }

  doUpload(fileName, arch, dataLength, requestProcessor) {
    var _this3 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const release = yield _this3._release.value;

      if (release == null) {
        _builderUtil().log.warn(Object.assign({
          file: fileName
        }, _this3.releaseLogFields), "skipped publishing");

        return;
      }

      const parsedUrl = (0, _url().parse)(release.upload_url.substring(0, release.upload_url.indexOf("{")) + "?name=" + fileName);
      let attemptNumber = 0;

      for (let i = 0; i < 3; i++) {
        try {
          return yield _nodeHttpExecutor().httpExecutor.doApiRequest((0, _builderUtilRuntime().configureRequestOptions)({
            hostname: parsedUrl.hostname,
            path: parsedUrl.path,
            method: "POST",
            headers: {
              accept: "application/vnd.github.v3+json",
              "Content-Type": _mime().default.getType(fileName) || "application/octet-stream",
              "Content-Length": dataLength
            }
          }, _this3.token), _this3.context.cancellationToken, requestProcessor);
        } catch (e) {
          if (e instanceof _builderUtilRuntime().HttpError && e.statusCode === 422 && e.description != null && e.description.errors != null && e.description.errors[0].code === "already_exists") {
            yield _this3.overwriteArtifact(fileName, release);
            continue;
          }

          if (!(attemptNumber++ < 3 && (e instanceof _builderUtilRuntime().HttpError || e.code === "EPIPE" || e.code === "ECONNRESET"))) {
            throw e;
          }
        }
      }
    })();
  }

  createRelease() {
    return this.githubRequest(`/repos/${this.info.owner}/${this.info.repo}/releases`, this.token, {
      tag_name: this.tag,
      name: this.version,
      draft: this.releaseType === "draft",
      prerelease: this.releaseType === "prerelease"
    });
  } // test only
  //noinspection JSUnusedGlobalSymbols


  getRelease() {
    var _this4 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      return _this4.githubRequest(`/repos/${_this4.info.owner}/${_this4.info.repo}/releases/${(yield _this4._release.value).id}`, _this4.token);
    })();
  } //noinspection JSUnusedGlobalSymbols


  deleteRelease() {
    var _this5 = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      if (!_this5._release.hasValue) {
        return;
      }

      const release = yield _this5._release.value;

      for (let i = 0; i < 3; i++) {
        try {
          return yield _this5.githubRequest(`/repos/${_this5.info.owner}/${_this5.info.repo}/releases/${release.id}`, _this5.token, null, "DELETE");
        } catch (e) {
          if (e instanceof _builderUtilRuntime().HttpError) {
            if (e.statusCode === 404) {
              _builderUtil().log.warn({
                releaseId: release.id,
                reason: "doesn't exist"
              }, "cannot delete release");

              return;
            } else if (e.statusCode === 405 || e.statusCode === 502) {
              continue;
            }
          }

          throw e;
        }
      }

      _builderUtil().log.warn({
        releaseId: release.id
      }, "cannot delete release");
    })();
  }

  githubRequest(path, token, data = null, method) {
    // host can contains port, but node http doesn't support host as url does
    const baseUrl = (0, _url().parse)(`https://${this.info.host || "api.github.com"}`);
    return (0, _builderUtilRuntime().parseJson)(_nodeHttpExecutor().httpExecutor.request((0, _builderUtilRuntime().configureRequestOptions)({
      hostname: baseUrl.hostname,
      port: baseUrl.port,
      path: this.info.host != null && this.info.host !== "github.com" ? `/api/v3${path.startsWith("/") ? path : `/${path}`}` : path,
      headers: {
        accept: "application/vnd.github.v3+json"
      }
    }, token, method), this.context.cancellationToken, data));
  }

  toString() {
    return `Github (owner: ${this.info.owner}, project: ${this.info.repo}, version: ${this.version})`;
  }

} exports.GitHubPublisher = GitHubPublisher;
// __ts-babel@6.0.4
//# sourceMappingURL=gitHubPublisher.js.map{"version":3,"sources":["../src/gitHubPublisher.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, InvalidConfigurationError, isEmptyOrSpaces, isEnvTrue, isTokenCharValid, log } from \"builder-util\"\nimport { configureRequestOptions, GithubOptions, HttpError, parseJson } from \"builder-util-runtime\"\nimport { Fields } from \"builder-util/out/log\"\nimport { httpExecutor } from \"builder-util/out/nodeHttpExecutor\"\nimport { ClientRequest } from \"http\"\nimport { Lazy } from \"lazy-val\"\nimport mime from \"mime\"\nimport { parse as parseUrl } from \"url\"\nimport { getCiTag, HttpPublisher, PublishContext, PublishOptions } from \"./publisher\"\n\nexport interface Release {\n  id: number\n  tag_name: string\n\n  draft: boolean\n  prerelease: boolean\n\n  published_at: string\n\n  upload_url: string\n}\n\ninterface Asset {\n  id: number\n  name: string\n}\n\nexport class GitHubPublisher extends HttpPublisher {\n  private readonly tag: string\n  readonly _release = new Lazy(() => this.token === \"__test__\" ? Promise.resolve(null as any) : this.getOrCreateRelease())\n\n  private readonly token: string\n\n  readonly providerName = \"GitHub\"\n\n  private readonly releaseType: \"draft\" | \"prerelease\" | \"release\"\n\n  private releaseLogFields: Fields | null = null\n\n  constructor(context: PublishContext, private readonly info: GithubOptions, private readonly version: string, private readonly options: PublishOptions = {}) {\n    super(context, true)\n\n    let token = info.token\n    if (isEmptyOrSpaces(token)) {\n      token = process.env.GH_TOKEN || process.env.GITHUB_TOKEN\n      if (isEmptyOrSpaces(token)) {\n        throw new InvalidConfigurationError(`GitHub Personal Access Token is not set, neither programmatically, nor using env \"GH_TOKEN\"`)\n      }\n\n      token = token.trim()\n\n      if (!isTokenCharValid(token)) {\n        throw new InvalidConfigurationError(`GitHub Personal Access Token (${JSON.stringify(token)}) contains invalid characters, please check env \"GH_TOKEN\"`)\n      }\n    }\n\n    this.token = token!\n\n    if (version.startsWith(\"v\")) {\n      throw new InvalidConfigurationError(`Version must not start with \"v\": ${version}`)\n    }\n\n    this.tag = info.vPrefixedTagName === false ? version : `v${version}`\n\n    if (isEnvTrue(process.env.EP_DRAFT)) {\n      this.releaseType = \"draft\"\n      log.info({reason: \"env EP_DRAFT is set to true\"}, \"GitHub provider release type is set to draft\")\n    }\n    else if (isEnvTrue(process.env.EP_PRE_RELEASE) || isEnvTrue(process.env.EP_PRELEASE) /* https://github.com/electron-userland/electron-builder/issues/2878 */) {\n      this.releaseType = \"prerelease\"\n      log.info({reason: \"env EP_PRE_RELEASE is set to true\"}, \"GitHub provider release type is set to prerelease\")\n    }\n    else if (info.releaseType != null) {\n      this.releaseType = info.releaseType\n    }\n    else if ((options as any).prerelease) {\n      this.releaseType = \"prerelease\"\n    }\n    else {\n      this.releaseType = (options as any).draft === false ? \"release\" : \"draft\"\n    }\n  }\n\n  private async getOrCreateRelease(): Promise<Release | null> {\n    const logFields = {\n      tag: this.tag,\n      version: this.version,\n    }\n\n    // we don't use \"Get a release by tag name\" because \"tag name\" means existing git tag, but we draft release and don't create git tag\n    const releases = await this.githubRequest<Array<Release>>(`/repos/${this.info.owner}/${this.info.repo}/releases`, this.token)\n    for (const release of releases) {\n      if (!(release.tag_name === this.tag || release.tag_name === this.version)) {\n        continue\n      }\n\n      if (release.draft) {\n        return release\n      }\n\n      // https://github.com/electron-userland/electron-builder/issues/1197\n      // https://electron-builder.slack.com/archives/general/p1485961449000202\n      // https://github.com/electron-userland/electron-builder/issues/2072\n      if (this.releaseType === \"draft\") {\n        this.releaseLogFields = {\n          reason: \"existing type not compatible with publishing type\",\n          ...logFields,\n          existingType: release.prerelease ? \"pre-release\" : \"release\",\n          publishingType: this.releaseType,\n        }\n        log.warn(this.releaseLogFields, \"GitHub release not created\")\n        return null\n      }\n\n      // https://github.com/electron-userland/electron-builder/issues/1133\n      // https://github.com/electron-userland/electron-builder/issues/2074\n      // if release created < 2 hours â€” allow to upload\n      const publishedAt = release.published_at == null ? null : Date.parse(release.published_at)\n      if (publishedAt != null && (Date.now() - publishedAt) > (2 * 3600 * 1000)) {\n        // https://github.com/electron-userland/electron-builder/issues/1183#issuecomment-275867187\n        this.releaseLogFields = {\n          reason: \"existing release published more than 2 hours ago\",\n          ...logFields,\n          date: new Date(publishedAt).toString(),\n        }\n        log.warn(this.releaseLogFields, \"GitHub release not created\")\n        return null\n      }\n      return release\n    }\n\n    // https://github.com/electron-userland/electron-builder/issues/1835\n    if (this.options.publish === \"always\" || getCiTag() != null) {\n      log.info({\n        reason: \"release doesn't exist\",\n        ...logFields,\n      }, `creating GitHub release`)\n      return this.createRelease()\n    }\n\n    this.releaseLogFields = {\n      reason: \"release doesn't exist and not created because \\\"publish\\\" is not \\\"always\\\" and build is not on tag\",\n      ...logFields,\n    }\n    return null\n  }\n\n  private async overwriteArtifact(fileName: string, release: Release) {\n    // delete old artifact and re-upload\n    log.notice({file: fileName, reason: \"already exists on GitHub\"}, \"overwrite published file\")\n\n    const assets = await this.githubRequest<Array<Asset>>(`/repos/${this.info.owner}/${this.info.repo}/releases/${release.id}/assets`, this.token, null)\n    for (const asset of assets) {\n      if (asset!.name === fileName) {\n        await this.githubRequest<void>(`/repos/${this.info.owner}/${this.info.repo}/releases/assets/${asset!.id}`, this.token, null, \"DELETE\")\n        return\n      }\n    }\n\n    log.debug({file: fileName, reason: \"not found on GitHub\"}, \"trying to upload again\")\n  }\n\n  protected async doUpload(fileName: string, arch: Arch, dataLength: number, requestProcessor: (request: ClientRequest, reject: (error: Error) => void) => void): Promise<any> {\n    const release = await this._release.value\n    if (release == null) {\n      log.warn({file: fileName, ...this.releaseLogFields}, \"skipped publishing\")\n      return\n    }\n\n    const parsedUrl = parseUrl(release.upload_url.substring(0, release.upload_url.indexOf(\"{\")) + \"?name=\" + fileName)\n    let attemptNumber = 0\n    for (let i = 0; i < 3; i++) {\n      try {\n        return await httpExecutor.doApiRequest(configureRequestOptions({\n          hostname: parsedUrl.hostname,\n          path: parsedUrl.path,\n          method: \"POST\",\n          headers: {\n            accept: \"application/vnd.github.v3+json\",\n            \"Content-Type\": mime.getType(fileName) || \"application/octet-stream\",\n            \"Content-Length\": dataLength\n          }\n        }, this.token), this.context.cancellationToken, requestProcessor)\n      }\n      catch (e) {\n        if (e instanceof HttpError && e.statusCode === 422 && e.description != null && e.description.errors != null && e.description.errors[0].code === \"already_exists\") {\n          await this.overwriteArtifact(fileName, release)\n          continue\n        }\n\n        if (!(attemptNumber++ < 3 && (e instanceof HttpError || (e.code === \"EPIPE\" || e.code === \"ECONNRESET\")))) {\n          throw e\n        }\n      }\n    }\n  }\n\n  private createRelease() {\n    return this.githubRequest<Release>(`/repos/${this.info.owner}/${this.info.repo}/releases`, this.token, {\n      tag_name: this.tag,\n      name: this.version,\n      draft: this.releaseType === \"draft\",\n      prerelease: this.releaseType === \"prerelease\",\n    })\n  }\n\n  // test only\n  //noinspection JSUnusedGlobalSymbols\n  async getRelease(): Promise<any> {\n    return this.githubRequest<Release>(`/repos/${this.info.owner}/${this.info.repo}/releases/${(await this._release.value)!.id}`, this.token)\n  }\n\n  //noinspection JSUnusedGlobalSymbols\n  async deleteRelease(): Promise<any> {\n    if (!this._release.hasValue) {\n      return\n    }\n\n    const release = await this._release.value\n    for (let i = 0; i < 3; i++) {\n      try {\n        return await this.githubRequest(`/repos/${this.info.owner}/${this.info.repo}/releases/${release.id}`, this.token, null, \"DELETE\")\n      }\n      catch (e) {\n        if (e instanceof HttpError) {\n          if (e.statusCode === 404) {\n            log.warn({releaseId: release.id, reason: \"doesn't exist\"}, \"cannot delete release\")\n            return\n          }\n          else if (e.statusCode === 405 || e.statusCode === 502) {\n            continue\n          }\n        }\n\n        throw e\n      }\n    }\n\n    log.warn({releaseId: release.id}, \"cannot delete release\")\n  }\n\n  private githubRequest<T>(path: string, token: string | null, data: {[name: string]: any; } | null = null, method?: \"GET\" | \"DELETE\" | \"PUT\"): Promise<T> {\n    // host can contains port, but node http doesn't support host as url does\n    const baseUrl = parseUrl(`https://${this.info.host || \"api.github.com\"}`)\n    return parseJson(httpExecutor.request(configureRequestOptions({\n      hostname: baseUrl.hostname,\n      port: baseUrl.port as any,\n      path: (this.info.host != null && this.info.host !== \"github.com\") ? `/api/v3${path.startsWith(\"/\") ? path : `/${path}`}` : path,\n      headers: {accept: \"application/vnd.github.v3+json\"}\n    }, token, method), this.context.cancellationToken, data))\n  }\n\n  toString() {\n    return `Github (owner: ${this.info.owner}, project: ${this.info.repo}, version: ${this.version})`\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MultiProgress = void 0;

function _log() {
  const data = require("builder-util/out/log");

  _log = function () {
    return data;
  };

  return data;
}

function _progress() {
  const data = require("./progress");

  _progress = function () {
    return data;
  };

  return data;
}

class MultiProgress {
  constructor() {
    this.stream = process.stdout;
    this.cursor = 0;
    this.totalLines = 0;
    this.isLogListenerAdded = false;
    this.barCount = 0;
  }

  createBar(format, options) {
    options.stream = this.stream; // tslint:disable:no-this-assignment

    const manager = this;

    class MultiProgressBar extends _progress().ProgressBar {
      constructor(format, options) {
        super(format, options);
        this.index = -1;
      }

      render() {
        if (this.index === -1) {
          this.index = manager.totalLines;
          manager.allocateLines(1);
        } else {
          manager.moveCursor(this.index);
        }

        super.render();

        if (!manager.isLogListenerAdded) {
          manager.isLogListenerAdded = true;
          (0, _log().setPrinter)(message => {
            let newLineCount = 0;
            let newLineIndex = message.indexOf("\n");

            while (newLineIndex > -1) {
              newLineCount++;
              newLineIndex = message.indexOf("\n", ++newLineIndex);
            }

            manager.allocateLines(newLineCount + 1);
            manager.stream.write(message);
          });
        }
      }

      terminate() {
        manager.barCount--;

        if (manager.barCount === 0 && manager.totalLines > 0) {
          manager.allocateLines(1);
          manager.totalLines = 0;
          manager.cursor = 0;
          (0, _log().setPrinter)(null);
          manager.isLogListenerAdded = false;
        }
      }

    }

    const bar = new MultiProgressBar(format, options);
    this.barCount++;
    return bar;
  }

  allocateLines(count) {
    this.stream.moveCursor(0, this.totalLines - 1); // if cursor pointed to previous line where \n is already printed, another \n is ignored, so, we can simply print it

    this.stream.write("\n");
    this.totalLines += count;
    this.cursor = this.totalLines - 1;
  }

  moveCursor(index) {
    this.stream.moveCursor(0, index - this.cursor);
    this.cursor = index;
  }

  terminate() {
    this.moveCursor(this.totalLines);
    this.stream.clearLine();
    this.stream.cursorTo(0);
  }

} exports.MultiProgress = MultiProgress;
// __ts-babel@6.0.4
//# sourceMappingURL=multiProgress.js.map{"version":3,"sources":["../src/multiProgress.ts"],"names":[],"mappings":"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","sourcesContent":["import { setPrinter } from \"builder-util/out/log\"\nimport { ProgressBar } from \"./progress\"\n\nexport class MultiProgress {\n  private readonly stream = process.stdout as any\n  private cursor = 0\n\n  private totalLines = 0\n\n  private isLogListenerAdded = false\n\n  private barCount = 0\n\n  createBar(format: string, options: any): ProgressBar {\n    options.stream = this.stream\n\n    // tslint:disable:no-this-assignment\n    const manager = this\n    class MultiProgressBar extends ProgressBar {\n      private index = -1\n\n      constructor(format: string, options: any) {\n        super(format, options)\n      }\n\n      render() {\n        if (this.index === -1) {\n          this.index = manager.totalLines\n          manager.allocateLines(1)\n        }\n        else {\n          manager.moveCursor(this.index)\n        }\n\n        super.render()\n\n        if (!manager.isLogListenerAdded) {\n          manager.isLogListenerAdded = true\n          setPrinter(message => {\n            let newLineCount = 0\n            let newLineIndex = message.indexOf(\"\\n\")\n            while (newLineIndex > -1) {\n              newLineCount++\n              newLineIndex = message.indexOf(\"\\n\", ++newLineIndex)\n            }\n\n            manager.allocateLines(newLineCount + 1)\n            manager.stream.write(message)\n          })\n        }\n      }\n\n      terminate() {\n        manager.barCount--\n        if (manager.barCount === 0 && manager.totalLines > 0) {\n          manager.allocateLines(1)\n          manager.totalLines = 0\n          manager.cursor = 0\n          setPrinter(null)\n          manager.isLogListenerAdded = false\n        }\n      }\n    }\n\n    const bar = new MultiProgressBar(format, options)\n    this.barCount++\n    return bar\n  }\n\n  private allocateLines(count: number) {\n    this.stream.moveCursor(0, this.totalLines - 1)\n    // if cursor pointed to previous line where \\n is already printed, another \\n is ignored, so, we can simply print it\n    this.stream.write(\"\\n\")\n    this.totalLines += count\n    this.cursor = this.totalLines - 1\n  }\n\n  private moveCursor(index: number) {\n    this.stream.moveCursor(0, index - this.cursor)\n    this.cursor = index\n  }\n\n  terminate() {\n    this.moveCursor(this.totalLines)\n    this.stream.clearLine()\n    this.stream.cursorTo(0)\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ProgressCallback = exports.ProgressBar = void 0;

/*!
 * node-progress
 * Copyright(c) 2011 TJ Holowaychuk <tj@vision-media.ca>
 * MIT Licensed
 */
class ProgressBar {
  /**
   * Initialize a `ProgressBar` with the given `fmt` string and `options` or`total`.
   *
   * Options:
   *   - `curr` current completed index
   *   - `total` total number of ticks to complete
   *   - `width` the displayed width of the progress bar defaulting to total
   *   - `stream` the output stream defaulting to stderr
   *   - `head` head character defaulting to complete character
   *   - `complete` completion character defaulting to "="
   *   - `incomplete` incomplete character defaulting to "-"
   *   - `renderThrottle` minimum time between updates in milliseconds defaulting to 16
   *   - `callback` optional function to call when the progress bar completes
   *   - `clear` will clear the progress bar upon termination
   *
   * Tokens:
   *   - `:bar` the progress bar itself
   *   - `:current` current tick number
   *   - `:total` total ticks
   *   - `:elapsed` time elapsed in seconds
   *   - `:percent` completion percentage
   *   - `:eta` eta in seconds
   *   - `:rate` rate of ticks per second
   */
  constructor(format, options = {}) {
    this.format = format;
    this.current = 0;
    this.total = 0;
    this.tokens = null;
    this.lastDraw = "";
    this.start = 0;
    this.complete = false;
    this.stream = options.stream || process.stderr;
    this.total = options.total;
    this.width = options.width || this.total;
    this.chars = {
      complete: options.complete || "=",
      incomplete: options.incomplete || "-",
      head: options.head || options.complete || "="
    };
  }
  /**
   * "tick" the progress bar with optional `len` and optional `tokens`.
   */


  tick(delta) {
    this.currentAmount = this.current + delta;
  }

  set currentAmount(value) {
    this.current = value;

    if (this.complete) {
      return;
    }

    this.render();

    if (this.current >= this.total) {
      this.complete = true;
      this.terminate();
    }
  }

  render() {
    // start time for eta
    if (this.start === 0) {
      this.start = Date.now();
    }

    const ratio = Math.min(Math.max(this.current / this.total, 0), 1);
    const percent = ratio * 100;
    const elapsed = Date.now() - this.start;
    const eta = percent === 100 ? 0 : elapsed * (this.total / this.current - 1);
    const rate = this.current / (elapsed / 1000);
    /* populate the bar template with percentages and timestamps */

    let str = this.format.replace(":current", this.current.toString()).replace(":total", this.total.toString()).replace(":elapsed", isNaN(elapsed) ? "0.0" : (elapsed / 1000).toFixed(1)).replace(":eta", isNaN(eta) || !isFinite(eta) ? "0.0" : (eta / 1000).toFixed(1)).replace(":percent", percent.toFixed(0) + "%").replace(":rate", Math.round(rate).toString()); // compute the available space (non-zero) for the bar

    let availableSpace = Math.max(0, this.stream.columns - str.replace(":bar", "").length);

    if (availableSpace && process.platform === "win32") {
      availableSpace -= 1;
    }

    const width = Math.min(this.width, availableSpace);
    const completeLength = Math.round(width * ratio);
    let complete = Array(Math.max(0, completeLength + 1)).join(this.chars.complete);
    const incomplete = Array(Math.max(0, width - completeLength + 1)).join(this.chars.incomplete);
    /* add head to the complete string */

    if (completeLength > 0) {
      complete = complete.slice(0, -1) + this.chars.head;
    }
    /* fill in the actual progress bar */


    str = str.replace(":bar", complete + incomplete);
    /* replace the extra tokens */

    if (this.tokens != null) {
      for (const key of Object.keys(this.tokens)) {
        str = str.replace(`:${key}`, this.tokens[key]);
      }
    }

    if (this.lastDraw !== str) {
      this.stream.cursorTo(0);
      this.stream.write(str);
      this.stream.clearLine(1);
      this.lastDraw = str;
    }
  }
  /**
   * "update" the progress bar to represent an exact percentage.
   * The ratio (between 0 and 1) specified will be multiplied by `total` and
   * floored, representing the closest available "tick." For example, if a
   * progress bar has a length of 3 and `update(0.5)` is called, the progress
   * will be set to 1.
   *
   * A ratio of 0.5 will attempt to set the progress to halfway.
   */


  update(ratio) {
    const goal = Math.floor(ratio * this.total);
    const delta = goal - this.current;
    this.tick(delta);
  }
  /**
   * "interrupt" the progress bar and write a message above it.
   */


  interrupt(message) {
    // clear the current line
    const stream = this.stream;
    stream.clearLine(); // move the cursor to the start of the line

    stream.cursorTo(0); // write the message text

    stream.write(message); // terminate the line after writing the message

    stream.write("\n"); // re-display the progress bar with its lastDraw

    stream.write(this.lastDraw);
  }

}

exports.ProgressBar = ProgressBar;

class ProgressCallback {
  constructor(progressBar) {
    this.progressBar = progressBar;
    this.start = Date.now();
    this.nextUpdate = this.start + 1000;
  }

  update(transferred, total) {
    const now = Date.now();

    if (now >= this.nextUpdate || transferred >= total) {
      this.nextUpdate = now + 1000;
      this.progressBar.total = total;
      this.progressBar.currentAmount = transferred;
    }
  }

} exports.ProgressCallback = ProgressCallback;
// __ts-babel@6.0.4
//# sourceMappingURL=progress.js.map{"version":3,"sources":["../src/progress.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * node-progress\n * Copyright(c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n * MIT Licensed\n */\n\nexport abstract class ProgressBar {\n  private stream: any\n\n  private current = 0\n  total = 0\n  private width: number\n\n  private chars: any\n  private tokens: any = null\n  private lastDraw = \"\"\n\n  private start = 0\n\n  private complete = false\n\n  /**\n   * Initialize a `ProgressBar` with the given `fmt` string and `options` or`total`.\n   *\n   * Options:\n   *   - `curr` current completed index\n   *   - `total` total number of ticks to complete\n   *   - `width` the displayed width of the progress bar defaulting to total\n   *   - `stream` the output stream defaulting to stderr\n   *   - `head` head character defaulting to complete character\n   *   - `complete` completion character defaulting to \"=\"\n   *   - `incomplete` incomplete character defaulting to \"-\"\n   *   - `renderThrottle` minimum time between updates in milliseconds defaulting to 16\n   *   - `callback` optional function to call when the progress bar completes\n   *   - `clear` will clear the progress bar upon termination\n   *\n   * Tokens:\n   *   - `:bar` the progress bar itself\n   *   - `:current` current tick number\n   *   - `:total` total ticks\n   *   - `:elapsed` time elapsed in seconds\n   *   - `:percent` completion percentage\n   *   - `:eta` eta in seconds\n   *   - `:rate` rate of ticks per second\n   */\n  constructor(private readonly format: string, options: any = {}) {\n    this.stream = options.stream || process.stderr\n\n    this.total = options.total\n    this.width = options.width || this.total\n    this.chars = {\n      complete: options.complete || \"=\",\n      incomplete: options.incomplete || \"-\",\n      head: options.head || (options.complete || \"=\")\n    }\n  }\n\n  /**\n   * \"tick\" the progress bar with optional `len` and optional `tokens`.\n   */\n  tick(delta: number) {\n    this.currentAmount = this.current + delta\n  }\n\n  set currentAmount(value: number) {\n    this.current = value\n\n    if (this.complete) {\n      return\n    }\n\n    this.render()\n\n    if (this.current >= this.total) {\n      this.complete = true\n      this.terminate()\n    }\n  }\n\n  render() {\n    // start time for eta\n    if (this.start === 0) {\n      this.start = Date.now()\n    }\n\n    const ratio = Math.min(Math.max(this.current / this.total, 0), 1)\n\n    const percent = ratio * 100\n    const elapsed = Date.now() - this.start\n    const eta = percent === 100 ? 0 : (elapsed * (this.total / this.current - 1))\n    const rate = this.current / (elapsed / 1000)\n\n    /* populate the bar template with percentages and timestamps */\n    let str = this.format\n      .replace(\":current\", this.current.toString())\n      .replace(\":total\", this.total.toString())\n      .replace(\":elapsed\", isNaN(elapsed) ? \"0.0\" : (elapsed / 1000).toFixed(1))\n      .replace(\":eta\", (isNaN(eta) || !isFinite(eta)) ? \"0.0\" : (eta / 1000).toFixed(1))\n      .replace(\":percent\", percent.toFixed(0) + \"%\")\n      .replace(\":rate\", Math.round(rate).toString())\n\n    // compute the available space (non-zero) for the bar\n    let availableSpace = Math.max(0, this.stream.columns - str.replace(\":bar\", \"\").length)\n    if (availableSpace && process.platform === \"win32\") {\n      availableSpace -= 1\n    }\n\n    const width = Math.min(this.width, availableSpace)\n    const completeLength = Math.round(width * ratio)\n    let complete = Array(Math.max(0, completeLength + 1)).join(this.chars.complete)\n    const incomplete = Array(Math.max(0, width - completeLength + 1)).join(this.chars.incomplete)\n\n    /* add head to the complete string */\n    if (completeLength > 0) {\n      complete = complete.slice(0, -1) + this.chars.head\n    }\n\n    /* fill in the actual progress bar */\n    str = str.replace(\":bar\", complete + incomplete)\n\n    /* replace the extra tokens */\n    if (this.tokens != null) {\n      for (const key of Object.keys(this.tokens)) {\n        str = str.replace(`:${key}`, this.tokens[key])\n      }\n    }\n\n    if (this.lastDraw !== str) {\n      this.stream.cursorTo(0)\n      this.stream.write(str)\n      this.stream.clearLine(1)\n      this.lastDraw = str\n    }\n  }\n\n  /**\n   * \"update\" the progress bar to represent an exact percentage.\n   * The ratio (between 0 and 1) specified will be multiplied by `total` and\n   * floored, representing the closest available \"tick.\" For example, if a\n   * progress bar has a length of 3 and `update(0.5)` is called, the progress\n   * will be set to 1.\n   *\n   * A ratio of 0.5 will attempt to set the progress to halfway.\n   */\n  update(ratio: number) {\n    const goal = Math.floor(ratio * this.total)\n    const delta = goal - this.current\n    this.tick(delta)\n  }\n\n  /**\n   * \"interrupt\" the progress bar and write a message above it.\n   */\n  interrupt(message: string) {\n    // clear the current line\n    const stream = this.stream\n    stream.clearLine()\n    // move the cursor to the start of the line\n    stream.cursorTo(0)\n    // write the message text\n    stream.write(message)\n    // terminate the line after writing the message\n    stream.write(\"\\n\")\n    // re-display the progress bar with its lastDraw\n    stream.write(this.lastDraw)\n  }\n\n  abstract terminate(): void\n}\n\nexport class ProgressCallback {\n  private start = Date.now()\n  private nextUpdate = this.start + 1000\n\n  constructor(private readonly progressBar: ProgressBar) {\n  }\n\n  update(transferred: number, total: number) {\n    const now = Date.now()\n    if (now >= this.nextUpdate || transferred >= total) {\n      this.nextUpdate = now + 1000\n\n      this.progressBar.total = total\n      this.progressBar.currentAmount = transferred\n    }\n  }\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getCiTag = getCiTag;
Object.defineProperty(exports, "ProgressCallback", {
  enumerable: true,
  get: function () {
    return _progress().ProgressCallback;
  }
});
exports.HttpPublisher = exports.Publisher = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _builderUtilRuntime() {
  const data = require("builder-util-runtime");

  _builderUtilRuntime = function () {
    return data;
  };

  return data;
}

function _log() {
  const data = require("builder-util/out/log");

  _log = function () {
    return data;
  };

  return data;
}

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var _path = require("path");

function _progress() {
  const data = require("./progress");

  _progress = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const progressBarOptions = {
  incomplete: " ",
  width: 20
};

class Publisher {
  constructor(context) {
    this.context = context;
  }

  createProgressBar(fileName, size) {
    _builderUtil().log.info({
      file: fileName,
      provider: this.providerName
    }, "uploading");

    if (this.context.progress == null || size < 512 * 1024) {
      return null;
    }

    return this.context.progress.createBar(`${" ".repeat(_log().PADDING + 2)}[:bar] :percent :etas | ${_chalk().default.green(fileName)} to ${this.providerName}`, Object.assign({
      total: size
    }, progressBarOptions));
  }

  createReadStreamAndProgressBar(file, fileStat, progressBar, reject) {
    const fileInputStream = (0, _fsExtraP().createReadStream)(file);
    fileInputStream.on("error", reject);

    if (progressBar == null) {
      return fileInputStream;
    } else {
      const progressStream = new (_builderUtilRuntime().ProgressCallbackTransform)(fileStat.size, this.context.cancellationToken, it => progressBar.tick(it.delta));
      progressStream.on("error", reject);
      return fileInputStream.pipe(progressStream);
    }
  }

}

exports.Publisher = Publisher;

class HttpPublisher extends Publisher {
  constructor(context, useSafeArtifactName = false) {
    super(context);
    this.context = context;
    this.useSafeArtifactName = useSafeArtifactName;
  }

  upload(task) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const fileName = (_this.useSafeArtifactName ? task.safeArtifactName : null) || (0, _path.basename)(task.file);

      if (task.fileContent != null) {
        yield _this.doUpload(fileName, task.arch || _builderUtil().Arch.x64, task.fileContent.length, it => it.end(task.fileContent));
        return;
      }

      const fileStat = yield (0, _fsExtraP().stat)(task.file);

      const progressBar = _this.createProgressBar(fileName, fileStat.size);

      yield _this.doUpload(fileName, task.arch || _builderUtil().Arch.x64, fileStat.size, (request, reject) => {
        if (progressBar != null) {
          // reset (because can be called several times (several attempts)
          progressBar.update(0);
        }

        return _this.createReadStreamAndProgressBar(task.file, fileStat, progressBar, reject).pipe(request);
      }, task.file);
    })();
  }

}

exports.HttpPublisher = HttpPublisher;

function getCiTag() {
  const tag = process.env.TRAVIS_TAG || process.env.APPVEYOR_REPO_TAG_NAME || process.env.CIRCLE_TAG || process.env.BITRISE_GIT_TAG || process.env.CI_BUILD_TAG;
  return tag != null && tag.length > 0 ? tag : null;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=publisher.js.map{"version":3,"sources":["../src/publisher.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, log } from \"builder-util\"\nimport { CancellationToken, ProgressCallbackTransform } from \"builder-util-runtime\"\nimport { PADDING } from \"builder-util/out/log\"\nimport chalk from \"chalk\"\nimport { createReadStream, stat, Stats } from \"fs-extra-p\"\nimport { ClientRequest } from \"http\"\nimport { basename } from \"path\"\nimport { MultiProgress } from \"./multiProgress\"\nimport { ProgressBar } from \"./progress\"\n\nexport type PublishPolicy = \"onTag\" | \"onTagOrDraft\" | \"always\" | \"never\"\n\nexport { ProgressCallback } from \"./progress\"\n\nexport interface PublishOptions {\n  publish?: PublishPolicy | null\n}\n\nexport interface PublishContext {\n  readonly cancellationToken: CancellationToken\n  readonly progress: MultiProgress | null\n}\n\nconst progressBarOptions = {\n  incomplete: \" \",\n  width: 20,\n}\n\nexport interface UploadTask {\n  file: string\n  fileContent?: Buffer | null\n\n  arch: Arch | null\n  safeArtifactName?: string | null\n}\n\nexport abstract class Publisher {\n  protected constructor(protected readonly context: PublishContext) {\n  }\n\n  abstract get providerName(): string\n\n  abstract upload(task: UploadTask): Promise<any>\n\n  protected createProgressBar(fileName: string, size: number): ProgressBar | null {\n    log.info({file: fileName, provider: this.providerName}, \"uploading\")\n    if (this.context.progress == null || size < (512 * 1024)) {\n      return null\n    }\n    return this.context.progress.createBar(`${\" \".repeat(PADDING + 2)}[:bar] :percent :etas | ${chalk.green(fileName)} to ${this.providerName}`, {total: size, ...progressBarOptions})\n  }\n\n  protected createReadStreamAndProgressBar(file: string, fileStat: Stats, progressBar: ProgressBar | null, reject: (error: Error) => void): NodeJS.ReadableStream {\n    const fileInputStream = createReadStream(file)\n    fileInputStream.on(\"error\", reject)\n\n    if (progressBar == null) {\n      return fileInputStream\n    }\n    else {\n      const progressStream = new ProgressCallbackTransform(fileStat.size, this.context.cancellationToken, it => progressBar.tick(it.delta))\n      progressStream.on(\"error\", reject)\n      return fileInputStream.pipe(progressStream)\n    }\n  }\n\n  abstract toString(): string\n}\n\nexport abstract class HttpPublisher extends Publisher {\n  constructor(protected readonly context: PublishContext, private readonly useSafeArtifactName = false) {\n    super(context)\n  }\n\n  async upload(task: UploadTask): Promise<any> {\n    const fileName = (this.useSafeArtifactName ? task.safeArtifactName : null) || basename(task.file)\n\n    if (task.fileContent != null) {\n      await this.doUpload(fileName, task.arch || Arch.x64, task.fileContent.length, it => it.end(task.fileContent))\n      return\n    }\n\n    const fileStat = await stat(task.file)\n\n    const progressBar = this.createProgressBar(fileName, fileStat.size)\n    await this.doUpload(fileName, task.arch || Arch.x64, fileStat.size, (request, reject) => {\n      if (progressBar != null) {\n        // reset (because can be called several times (several attempts)\n        progressBar.update(0)\n      }\n      return this.createReadStreamAndProgressBar(task.file, fileStat, progressBar, reject).pipe(request)\n    }, task.file)\n  }\n\n  protected abstract doUpload(fileName: string, arch: Arch, dataLength: number, requestProcessor: (request: ClientRequest, reject: (error: Error) => void) => void, file?: string): Promise<any>\n}\n\nexport function getCiTag() {\n  const tag = process.env.TRAVIS_TAG || process.env.APPVEYOR_REPO_TAG_NAME || process.env.CIRCLE_TAG || process.env.BITRISE_GIT_TAG || process.env.CI_BUILD_TAG\n  return tag != null && tag.length > 0 ? tag : null\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.BaseS3Publisher = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _publisher() {
  const data = require("../publisher");

  _publisher = function () {
    return data;
  };

  return data;
}

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

class BaseS3Publisher extends _publisher().Publisher {
  constructor(context, options) {
    super(context);
    this.options = options;
  }

  configureS3Options(args) {
    // if explicitly set to null, do not add
    if (this.options.acl !== null) {
      args.push("--acl", this.options.acl || "public-read");
    }
  } // http://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-example-creating-buckets.html


  upload(task) {
    var _this = this;

    return (0, _bluebirdLst().coroutine)(function* () {
      const fileName = path.basename(task.file);
      const cancellationToken = _this.context.cancellationToken;
      const target = (_this.options.path == null ? "" : `${_this.options.path}/`) + fileName;
      const args = ["publish-s3", "--bucket", _this.getBucketName(), "--key", target, "--file", task.file];

      _this.configureS3Options(args);

      if (process.env.__TEST_S3_PUBLISHER__ != null) {
        const testFile = path.join(process.env.__TEST_S3_PUBLISHER__, target);
        yield (0, _fsExtraP().ensureDir)(path.dirname(testFile));
        yield (0, _fsExtraP().symlink)(task.file, testFile);
        return;
      } // https://github.com/aws/aws-sdk-go/issues/279


      _this.createProgressBar(fileName, -1); // if (progressBar != null) {
      //   const callback = new ProgressCallback(progressBar)
      //   uploader.on("progress", () => {
      //     if (!cancellationToken.cancelled) {
      //       callback.update(uploader.loaded, uploader.contentLength)
      //     }
      //   })
      // }


      return yield cancellationToken.createPromise((resolve, reject, onCancel) => {
        (0, _builderUtil().executeAppBuilder)(args, process => {
          onCancel(() => {
            process.kill("SIGINT");
          });
        }).then(() => {
          try {
            _builderUtil().log.debug({
              provider: _this.providerName,
              file: fileName,
              bucket: _this.getBucketName()
            }, "uploaded");
          } finally {
            resolve();
          }
        }).catch(reject);
      });
    })();
  }

  toString() {
    return `${this.providerName} (bucket: ${this.getBucketName()})`;
  }

} exports.BaseS3Publisher = BaseS3Publisher;
// __ts-babel@6.0.4
//# sourceMappingURL=BaseS3Publisher.js.map{"version":3,"sources":["../../src/s3/BaseS3Publisher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;;;;AAEM,MAAgB,eAAhB,SAAwC,sBAAxC,CAAiD;AACrD,EAAA,WAAA,CAAsB,OAAtB,EAAuD,OAAvD,EAA6E;AAC3E,UAAM,OAAN;AADqD,SAAA,OAAA,GAAA,OAAA;AAEtD;;AAIS,EAAA,kBAAkB,CAAC,IAAD,EAAoB;AAC9C;AACA,QAAI,KAAK,OAAL,CAAa,GAAb,KAAqB,IAAzB,EAA+B;AAC7B,MAAA,IAAI,CAAC,IAAL,CAAU,OAAV,EAAmB,KAAK,OAAL,CAAa,GAAb,IAAoB,aAAvC;AACD;AACF,GAZoD,CAcrD;;;AACM,EAAA,MAAN,CAAa,IAAb,EAA6B;AAAA;;AAAA;AAC3B,YAAM,QAAQ,GAAG,IAAI,CAAC,QAAL,CAAc,IAAI,CAAC,IAAnB,CAAjB;AACA,YAAM,iBAAiB,GAAG,KAAI,CAAC,OAAL,CAAa,iBAAvC;AAEA,YAAM,MAAM,GAAG,CAAC,KAAI,CAAC,OAAL,CAAa,IAAb,IAAqB,IAArB,GAA4B,EAA5B,GAAiC,GAAG,KAAI,CAAC,OAAL,CAAa,IAAI,GAAtD,IAA6D,QAA5E;AAEA,YAAM,IAAI,GAAG,CAAC,YAAD,EAAe,UAAf,EAA2B,KAAI,CAAC,aAAL,EAA3B,EAAiD,OAAjD,EAA0D,MAA1D,EAAkE,QAAlE,EAA4E,IAAI,CAAC,IAAjF,CAAb;;AACA,MAAA,KAAI,CAAC,kBAAL,CAAwB,IAAxB;;AAEA,UAAI,OAAO,CAAC,GAAR,CAAY,qBAAZ,IAAqC,IAAzC,EAA+C;AAC7C,cAAM,QAAQ,GAAG,IAAI,CAAC,IAAL,CAAU,OAAO,CAAC,GAAR,CAAY,qBAAtB,EAA8C,MAA9C,CAAjB;AACA,cAAM,2BAAU,IAAI,CAAC,OAAL,CAAa,QAAb,CAAV,CAAN;AACA,cAAM,yBAAQ,IAAI,CAAC,IAAb,EAAmB,QAAnB,CAAN;AACA;AACD,OAd0B,CAgB3B;;;AACA,MAAA,KAAI,CAAC,iBAAL,CAAuB,QAAvB,EAAiC,CAAC,CAAlC,EAjB2B,CAkB3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAEA,mBAAa,iBAAiB,CAAC,aAAlB,CAAgC,CAAC,OAAD,EAAU,MAAV,EAAkB,QAAlB,KAA8B;AACzE,8CAAkB,IAAlB,EAAwB,OAAO,IAAG;AAChC,UAAA,QAAQ,CAAC,MAAK;AACZ,YAAA,OAAO,CAAC,IAAR,CAAa,QAAb;AACD,WAFO,CAAR;AAGD,SAJD,EAKG,IALH,CAKQ,MAAK;AACT,cAAI;AACF,+BAAI,KAAJ,CAAU;AAAC,cAAA,QAAQ,EAAE,KAAI,CAAC,YAAhB;AAA8B,cAAA,IAAI,EAAE,QAApC;AAA8C,cAAA,MAAM,EAAE,KAAI,CAAC,aAAL;AAAtD,aAAV,EAAuF,UAAvF;AACD,WAFD,SAGQ;AACN,YAAA,OAAO;AACR;AACF,SAZH,EAaG,KAbH,CAaS,MAbT;AAcD,OAfY,CAAb;AA3B2B;AA2C5B;;AAED,EAAA,QAAQ,GAAA;AACN,WAAO,GAAG,KAAK,YAAY,aAAa,KAAK,aAAL,EAAoB,GAA5D;AACD;;AA9DoD,C","sourcesContent":["import { log, executeAppBuilder } from \"builder-util\"\nimport { BaseS3Options } from \"builder-util-runtime\"\nimport { PublishContext, Publisher, UploadTask } from \"../publisher\"\nimport { ensureDir, symlink } from \"fs-extra-p\"\nimport * as path from \"path\"\n\nexport abstract class BaseS3Publisher extends Publisher {\n  protected constructor(context: PublishContext, private options: BaseS3Options) {\n    super(context)\n  }\n\n  protected abstract getBucketName(): string\n\n  protected configureS3Options(args: Array<string>) {\n    // if explicitly set to null, do not add\n    if (this.options.acl !== null) {\n      args.push(\"--acl\", this.options.acl || \"public-read\")\n    }\n  }\n\n  // http://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-example-creating-buckets.html\n  async upload(task: UploadTask): Promise<any> {\n    const fileName = path.basename(task.file)\n    const cancellationToken = this.context.cancellationToken\n\n    const target = (this.options.path == null ? \"\" : `${this.options.path}/`) + fileName\n\n    const args = [\"publish-s3\", \"--bucket\", this.getBucketName(), \"--key\", target, \"--file\", task.file]\n    this.configureS3Options(args)\n\n    if (process.env.__TEST_S3_PUBLISHER__ != null) {\n      const testFile = path.join(process.env.__TEST_S3_PUBLISHER__!, target)\n      await ensureDir(path.dirname(testFile))\n      await symlink(task.file, testFile)\n      return\n    }\n\n    // https://github.com/aws/aws-sdk-go/issues/279\n    this.createProgressBar(fileName, -1)\n    // if (progressBar != null) {\n    //   const callback = new ProgressCallback(progressBar)\n    //   uploader.on(\"progress\", () => {\n    //     if (!cancellationToken.cancelled) {\n    //       callback.update(uploader.loaded, uploader.contentLength)\n    //     }\n    //   })\n    // }\n\n    return await cancellationToken.createPromise((resolve, reject, onCancel) => {\n      executeAppBuilder(args, process => {\n        onCancel(() => {\n          process.kill(\"SIGINT\")\n        })\n      })\n        .then(() => {\n          try {\n            log.debug({provider: this.providerName, file: fileName, bucket: this.getBucketName()}, \"uploaded\")\n          }\n          finally {\n            resolve()\n          }\n        })\n        .catch(reject)\n    })\n  }\n\n  toString() {\n    return `${this.providerName} (bucket: ${this.getBucketName()})`\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _BaseS3Publisher() {
  const data = require("./BaseS3Publisher");

  _BaseS3Publisher = function () {
    return data;
  };

  return data;
}

class S3Publisher extends _BaseS3Publisher().BaseS3Publisher {
  constructor(context, info) {
    super(context, info);
    this.info = info;
    this.providerName = "S3";
  }

  static checkAndResolveOptions(options, channelFromAppVersion, errorIfCannot) {
    return (0, _bluebirdLst().coroutine)(function* () {
      const bucket = options.bucket;

      if (bucket == null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Please specify "bucket" for "s3" publish provider`);
      }

      if (options.endpoint == null && bucket.includes(".") && options.region == null) {
        // on dotted bucket names, we need to use a path-based endpoint URL. Path-based endpoint URLs need to include the region.
        try {
          options.region = yield (0, _builderUtil().executeAppBuilder)(["get-bucket-location", "--bucket", bucket]);
        } catch (e) {
          if (errorIfCannot) {
            throw e;
          } else {
            _builderUtil().log.warn(`cannot compute region for bucket (required because on dotted bucket names, we need to use a path-based endpoint URL): ${e}`);
          }
        }
      }

      if (options.channel == null && channelFromAppVersion != null) {
        options.channel = channelFromAppVersion;
      }

      if (options.endpoint != null && options.endpoint.endsWith("/")) {
        options.endpoint = options.endpoint.slice(0, -1);
      }
    })();
  }

  getBucketName() {
    return this.info.bucket;
  }

  configureS3Options(args) {
    super.configureS3Options(args);

    if (this.info.endpoint != null) {
      args.push("--endpoint", this.info.endpoint);
    }

    if (this.info.region != null) {
      args.push("--region", this.info.region);
    }

    if (this.info.storageClass != null) {
      args.push("--storageClass", this.info.storageClass);
    }

    if (this.info.encryption != null) {
      args.push("--encryption", this.info.encryption);
    }
  }

  toString() {
    const result = super.toString();
    const endpoint = this.info.endpoint;

    if (endpoint != null) {
      return result.substring(0, result.length - 1) + `, endpoint: ${endpoint})`;
    }

    return result;
  }

} exports.default = S3Publisher;
// __ts-babel@6.0.4
//# sourceMappingURL=s3Publisher.js.map{"version":3,"sources":["../../src/s3/s3Publisher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEc,MAAO,WAAP,SAA2B,kCAA3B,CAA0C;AAGtD,EAAA,WAAA,CAAY,OAAZ,EAAsD,IAAtD,EAAqE;AACnE,UAAM,OAAN,EAAe,IAAf;AADoD,SAAA,IAAA,GAAA,IAAA;AAF7C,SAAA,YAAA,GAAe,IAAf;AAIR;;AAED,SAAa,sBAAb,CAAoC,OAApC,EAAwD,qBAAxD,EAA8F,aAA9F,EAAoH;AAAA;AAClH,YAAM,MAAM,GAAG,OAAO,CAAC,MAAvB;;AACA,UAAI,MAAM,IAAI,IAAd,EAAoB;AAClB,cAAM,KAAI,wCAAJ,EAA8B,mDAA9B,CAAN;AACD;;AAED,UAAI,OAAO,CAAC,QAAR,IAAoB,IAApB,IAA6B,MAAM,CAAC,QAAP,CAAgB,GAAhB,KAAwB,OAAO,CAAC,MAAR,IAAkB,IAA3E,EAAkF;AAChF;AACA,YAAI;AACF,UAAA,OAAO,CAAC,MAAR,SAAuB,sCAAkB,CAAC,qBAAD,EAAwB,UAAxB,EAAoC,MAApC,CAAlB,CAAvB;AACD,SAFD,CAGA,OAAO,CAAP,EAAU;AACR,cAAI,aAAJ,EAAmB;AACjB,kBAAM,CAAN;AACD,WAFD,MAGK;AACH,+BAAI,IAAJ,CAAS,yHAAyH,CAAC,EAAnI;AACD;AACF;AACF;;AAED,UAAI,OAAO,CAAC,OAAR,IAAmB,IAAnB,IAA2B,qBAAqB,IAAI,IAAxD,EAA8D;AAC5D,QAAA,OAAO,CAAC,OAAR,GAAkB,qBAAlB;AACD;;AAED,UAAI,OAAO,CAAC,QAAR,IAAoB,IAApB,IAA4B,OAAO,CAAC,QAAR,CAAiB,QAAjB,CAA0B,GAA1B,CAAhC,EAAgE;AAC7D,QAAA,OAAe,CAAC,QAAhB,GAA2B,OAAO,CAAC,QAAR,CAAiB,KAAjB,CAAuB,CAAvB,EAA0B,CAAC,CAA3B,CAA3B;AACF;AA3BiH;AA4BnH;;AAES,EAAA,aAAa,GAAA;AACrB,WAAO,KAAK,IAAL,CAAU,MAAjB;AACD;;AAES,EAAA,kBAAkB,CAAC,IAAD,EAAoB;AAC9C,UAAM,kBAAN,CAAyB,IAAzB;;AAEA,QAAI,KAAK,IAAL,CAAU,QAAV,IAAsB,IAA1B,EAAgC;AAC9B,MAAA,IAAI,CAAC,IAAL,CAAU,YAAV,EAAwB,KAAK,IAAL,CAAU,QAAlC;AACD;;AACD,QAAI,KAAK,IAAL,CAAU,MAAV,IAAoB,IAAxB,EAA8B;AAC5B,MAAA,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,KAAK,IAAL,CAAU,MAAhC;AACD;;AAED,QAAI,KAAK,IAAL,CAAU,YAAV,IAA0B,IAA9B,EAAoC;AAClC,MAAA,IAAI,CAAC,IAAL,CAAU,gBAAV,EAA4B,KAAK,IAAL,CAAU,YAAtC;AACD;;AACD,QAAI,KAAK,IAAL,CAAU,UAAV,IAAwB,IAA5B,EAAkC;AAChC,MAAA,IAAI,CAAC,IAAL,CAAU,cAAV,EAA0B,KAAK,IAAL,CAAU,UAApC;AACD;AACF;;AAED,EAAA,QAAQ,GAAA;AACN,UAAM,MAAM,GAAG,MAAM,QAAN,EAAf;AACA,UAAM,QAAQ,GAAG,KAAK,IAAL,CAAU,QAA3B;;AACA,QAAI,QAAQ,IAAI,IAAhB,EAAsB;AACpB,aAAO,MAAM,CAAC,SAAP,CAAiB,CAAjB,EAAoB,MAAM,CAAC,MAAP,GAAgB,CAApC,IAAyC,eAAe,QAAQ,GAAvE;AACD;;AACD,WAAO,MAAP;AACD;;AAlEqD,C","sourcesContent":["import { executeAppBuilder, InvalidConfigurationError, log } from \"builder-util\"\nimport { S3Options } from \"builder-util-runtime\"\nimport { PublishContext } from \"../publisher\"\nimport { BaseS3Publisher } from \"./BaseS3Publisher\"\n\nexport default class S3Publisher extends BaseS3Publisher {\n  readonly providerName = \"S3\"\n\n  constructor(context: PublishContext, private readonly info: S3Options) {\n    super(context, info)\n  }\n\n  static async checkAndResolveOptions(options: S3Options, channelFromAppVersion: string | null, errorIfCannot: boolean) {\n    const bucket = options.bucket\n    if (bucket == null) {\n      throw new InvalidConfigurationError(`Please specify \"bucket\" for \"s3\" publish provider`)\n    }\n\n    if (options.endpoint == null && (bucket.includes(\".\") && options.region == null)) {\n      // on dotted bucket names, we need to use a path-based endpoint URL. Path-based endpoint URLs need to include the region.\n      try {\n        options.region = await executeAppBuilder([\"get-bucket-location\", \"--bucket\", bucket])\n      }\n      catch (e) {\n        if (errorIfCannot) {\n          throw e\n        }\n        else {\n          log.warn(`cannot compute region for bucket (required because on dotted bucket names, we need to use a path-based endpoint URL): ${e}`)\n        }\n      }\n    }\n\n    if (options.channel == null && channelFromAppVersion != null) {\n      options.channel = channelFromAppVersion\n    }\n\n    if (options.endpoint != null && options.endpoint.endsWith(\"/\")) {\n      (options as any).endpoint = options.endpoint.slice(0, -1)\n    }\n  }\n\n  protected getBucketName(): string {\n    return this.info.bucket!\n  }\n\n  protected configureS3Options(args: Array<string>): void {\n    super.configureS3Options(args)\n\n    if (this.info.endpoint != null) {\n      args.push(\"--endpoint\", this.info.endpoint)\n    }\n    if (this.info.region != null) {\n      args.push(\"--region\", this.info.region)\n    }\n\n    if (this.info.storageClass != null) {\n      args.push(\"--storageClass\", this.info.storageClass)\n    }\n    if (this.info.encryption != null) {\n      args.push(\"--encryption\", this.info.encryption)\n    }\n  }\n\n  toString() {\n    const result = super.toString()\n    const endpoint = this.info.endpoint\n    if (endpoint != null) {\n      return result.substring(0, result.length - 1) + `, endpoint: ${endpoint})`\n    }\n    return result\n  }\n}\n"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _bluebirdLst() {
  const data = require("bluebird-lst");

  _bluebirdLst = function () {
    return data;
  };

  return data;
}

function _builderUtil() {
  const data = require("builder-util");

  _builderUtil = function () {
    return data;
  };

  return data;
}

function _BaseS3Publisher() {
  const data = require("./BaseS3Publisher");

  _BaseS3Publisher = function () {
    return data;
  };

  return data;
}

class SpacesPublisher extends _BaseS3Publisher().BaseS3Publisher {
  constructor(context, info) {
    super(context, info);
    this.info = info;
    this.providerName = "Spaces";
  }

  static checkAndResolveOptions(options, channelFromAppVersion, errorIfCannot) {
    return (0, _bluebirdLst().coroutine)(function* () {
      if (options.name == null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Please specify "name" for "spaces" publish provider (see https://www.electron.build/configuration/publish#spacesoptions)`);
      }

      if (options.region == null) {
        throw new (_builderUtil().InvalidConfigurationError)(`Please specify "region" for "spaces" publish provider (see https://www.electron.build/configuration/publish#spacesoptions)`);
      }

      if (options.channel == null && channelFromAppVersion != null) {
        options.channel = channelFromAppVersion;
      }
    })();
  }

  getBucketName() {
    return this.info.name;
  }

  configureS3Options(args) {
    super.configureS3Options(args);
    args.push("--endpoint", `${this.info.region}.digitaloceanspaces.com`);
    args.push("--region", this.info.region);
    const accessKey = process.env.DO_KEY_ID;
    const secretKey = process.env.DO_SECRET_KEY;

    if ((0, _builderUtil().isEmptyOrSpaces)(accessKey)) {
      throw new (_builderUtil().InvalidConfigurationError)("Please set env DO_KEY_ID (see https://www.electron.build/configuration/publish#spacesoptions)");
    }

    if ((0, _builderUtil().isEmptyOrSpaces)(secretKey)) {
      throw new (_builderUtil().InvalidConfigurationError)("Please set env DO_SECRET_KEY (see https://www.electron.build/configuration/publish#spacesoptions)");
    }

    args.push("--accessKey", accessKey);
    args.push("--secretKey", secretKey);
  }

} exports.default = SpacesPublisher;
// __ts-babel@6.0.4
//# sourceMappingURL=spacesPublisher.js.map{"version":3,"sources":["../../src/s3/spacesPublisher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAEc,MAAO,eAAP,SAA+B,kCAA/B,CAA8C;AAG1D,EAAA,WAAA,CAAY,OAAZ,EAAsD,IAAtD,EAAyE;AACvE,UAAM,OAAN,EAAe,IAAf;AADoD,SAAA,IAAA,GAAA,IAAA;AAF7C,SAAA,YAAA,GAAe,QAAf;AAIR;;AAED,SAAa,sBAAb,CAAoC,OAApC,EAA4D,qBAA5D,EAAkG,aAAlG,EAAwH;AAAA;AACtH,UAAI,OAAO,CAAC,IAAR,IAAgB,IAApB,EAA0B;AACxB,cAAM,KAAI,wCAAJ,EAA8B,0HAA9B,CAAN;AACD;;AACD,UAAI,OAAO,CAAC,MAAR,IAAkB,IAAtB,EAA4B;AAC1B,cAAM,KAAI,wCAAJ,EAA8B,4HAA9B,CAAN;AACD;;AAED,UAAI,OAAO,CAAC,OAAR,IAAmB,IAAnB,IAA2B,qBAAqB,IAAI,IAAxD,EAA8D;AAC5D,QAAA,OAAO,CAAC,OAAR,GAAkB,qBAAlB;AACD;AAVqH;AAWvH;;AAES,EAAA,aAAa,GAAA;AACrB,WAAO,KAAK,IAAL,CAAU,IAAjB;AACD;;AAES,EAAA,kBAAkB,CAAC,IAAD,EAAoB;AAC9C,UAAM,kBAAN,CAAyB,IAAzB;AAEA,IAAA,IAAI,CAAC,IAAL,CAAU,YAAV,EAAwB,GAAG,KAAK,IAAL,CAAU,MAAM,yBAA3C;AACA,IAAA,IAAI,CAAC,IAAL,CAAU,UAAV,EAAsB,KAAK,IAAL,CAAU,MAAhC;AAEA,UAAM,SAAS,GAAG,OAAO,CAAC,GAAR,CAAY,SAA9B;AACA,UAAM,SAAS,GAAG,OAAO,CAAC,GAAR,CAAY,aAA9B;;AACA,QAAI,oCAAgB,SAAhB,CAAJ,EAAgC;AAC9B,YAAM,KAAI,wCAAJ,EAA8B,+FAA9B,CAAN;AACD;;AACD,QAAI,oCAAgB,SAAhB,CAAJ,EAAgC;AAC9B,YAAM,KAAI,wCAAJ,EAA8B,mGAA9B,CAAN;AACD;;AACD,IAAA,IAAI,CAAC,IAAL,CAAU,aAAV,EAAyB,SAAzB;AACA,IAAA,IAAI,CAAC,IAAL,CAAU,aAAV,EAAyB,SAAzB;AACD;;AAxCyD,C","sourcesContent":["import { InvalidConfigurationError, isEmptyOrSpaces } from \"builder-util\"\nimport { SpacesOptions } from \"builder-util-runtime\"\nimport { PublishContext } from \"../publisher\"\nimport { BaseS3Publisher } from \"./BaseS3Publisher\"\n\nexport default class SpacesPublisher extends BaseS3Publisher {\n  readonly providerName = \"Spaces\"\n\n  constructor(context: PublishContext, private readonly info: SpacesOptions) {\n    super(context, info)\n  }\n\n  static async checkAndResolveOptions(options: SpacesOptions, channelFromAppVersion: string | null, errorIfCannot: boolean) {\n    if (options.name == null) {\n      throw new InvalidConfigurationError(`Please specify \"name\" for \"spaces\" publish provider (see https://www.electron.build/configuration/publish#spacesoptions)`)\n    }\n    if (options.region == null) {\n      throw new InvalidConfigurationError(`Please specify \"region\" for \"spaces\" publish provider (see https://www.electron.build/configuration/publish#spacesoptions)`)\n    }\n\n    if (options.channel == null && channelFromAppVersion != null) {\n      options.channel = channelFromAppVersion\n    }\n  }\n\n  protected getBucketName(): string {\n    return this.info.name\n  }\n\n  protected configureS3Options(args: Array<string>): void {\n    super.configureS3Options(args)\n\n    args.push(\"--endpoint\", `${this.info.region}.digitaloceanspaces.com`)\n    args.push(\"--region\", this.info.region)\n\n    const accessKey = process.env.DO_KEY_ID\n    const secretKey = process.env.DO_SECRET_KEY\n    if (isEmptyOrSpaces(accessKey)) {\n      throw new InvalidConfigurationError(\"Please set env DO_KEY_ID (see https://www.electron.build/configuration/publish#spacesoptions)\")\n    }\n    if (isEmptyOrSpaces(secretKey)) {\n      throw new InvalidConfigurationError(\"Please set env DO_SECRET_KEY (see https://www.electron.build/configuration/publish#spacesoptions)\")\n    }\n    args.push(\"--accessKey\", accessKey)\n    args.push(\"--secretKey\", secretKey)\n  }\n}"],"sourceRoot":""}
elementtree v0.1.6 - 2014-02-06

* Add support for CData elements. (#14)
  [hermannpencole]

elementtree v0.1.5 - 2012-11-14

* Fix a bug in the find() and findtext() method which could manifest itself
  under some conditions.
  [metagriffin]

elementtree v0.1.4 - 2012-10-15

* Allow user to use namespaced attributes when using find* functions.
  [Andrew Lunny]

elementtree v0.1.3 - 2012-09-21

* Improve the output of text content in the tags (strip unnecessary line break
  characters).

[Darryl Pogue]

elementtree v0.1.2 - 2012-09-04

 * Allow user to pass 'indent' option to ElementTree.write method. If this
   option is specified (e.g. {'indent': 4}). XML will be pretty printed.
   [Darryl Pogue, Tomaz Muraus]

 * Bump sax dependency version.

elementtree v0.1.1 - 2011-09-23

 * Improve special character escaping.
   [Ryan Phillips]

elementtree v0.1.0 - 2011-09-05

 * Initial release.

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

TESTS := \
	tests/test-simple.js



PATH := ./node_modules/.bin:$(PATH)

WHISKEY := $(shell bash -c 'PATH=$(PATH) type -p whiskey')

default: test

test:
	NODE_PATH=`pwd`/lib/ ${WHISKEY} --scope-leaks --sequential --real-time --tests "${TESTS}"

tap:
	NODE_PATH=`pwd`/lib/ ${WHISKEY} --test-reporter tap --sequential --real-time --tests "${TESTS}"

coverage:
	NODE_PATH=`pwd`/lib/ ${WHISKEY} --sequential --coverage  --coverage-reporter html --coverage-dir coverage_html --tests "${TESTS}"

.PHONY: default test coverage tap scope
node-elementtree
Copyright (c) 2011, Rackspace, Inc.

The ElementTree toolkit is Copyright (c) 1999-2007 by Fredrik Lundh

{
  "author": {
    "name": "Rackspace US, Inc."
  },
  "dependencies": {
    "sax": "1.1.4"
  },
  "deprecated": false,
  "description": "XML Serialization and Parsing module based on Python's ElementTree.",
  "devDependencies": {
    "whiskey": "0.8.x"
  },
  "directories": {
    "lib": "lib"
  },
  "engines": {
    "node": ">= 0.4.0"
  },
  "homepage": "https://github.com/racker/node-elementtree",
  "license": "Apache-2.0",
  "main": "lib/elementtree.js",
  "name": "elementtree",
  "repository": {
    "type": "git",
    "url": "git://github.com/racker/node-elementtree.git"
  },
  "version": "0.1.7"
}/*
 *  Copyright 2011 Rackspace
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

var DEFAULT_PARSER = 'sax';

exports.DEFAULT_PARSER = DEFAULT_PARSER;
/**
 *  Copyright 2011 Rackspace
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

var sprintf = require('./sprintf').sprintf;

var utils = require('./utils');
var SyntaxError = require('./errors').SyntaxError;

var _cache = {};

var RE = new RegExp(
  "(" +
  "'[^']*'|\"[^\"]*\"|" +
  "::|" +
  "//?|" +
  "\\.\\.|" +
  "\\(\\)|" +
  "[/.*:\\[\\]\\(\\)@=])|" +
  "((?:\\{[^}]+\\})?[^/\\[\\]\\(\\)@=\\s]+)|" +
  "\\s+", 'g'
);

var xpath_tokenizer = utils.findall.bind(null, RE);

function prepare_tag(next, token) {
  var tag = token[0];

  function select(context, result) {
    var i, len, elem, rv = [];

    for (i = 0, len = result.length; i < len; i++) {
      elem = result[i];
      elem._children.forEach(function(e) {
        if (e.tag === tag) {
          rv.push(e);
        }
      });
    }

    return rv;
  }

  return select;
}

function prepare_star(next, token) {
  function select(context, result) {
    var i, len, elem, rv = [];

    for (i = 0, len = result.length; i < len; i++) {
      elem = result[i];
      elem._children.forEach(function(e) {
        rv.push(e);
      });
    }

    return rv;
  }

  return select;
}

function prepare_dot(next, token) {
  function select(context, result) {
    var i, len, elem, rv = [];

    for (i = 0, len = result.length; i < len; i++) {
      elem = result[i];
      rv.push(elem);
    }

    return rv;
  }

  return select;
}

function prepare_iter(next, token) {
  var tag;
  token = next();

  if (token[1] === '*') {
    tag = '*';
  }
  else if (!token[1]) {
    tag = token[0] || '';
  }
  else {
    throw new SyntaxError(token);
  }

  function select(context, result) {
    var i, len, elem, rv = [];

    for (i = 0, len = result.length; i < len; i++) {
      elem = result[i];
      elem.iter(tag, function(e) {
        if (e !== elem) {
          rv.push(e);
        }
      });
    }

    return rv;
  }

  return select;
}

function prepare_dot_dot(next, token) {
  function select(context, result) {
    var i, len, elem, rv = [], parent_map = context.parent_map;

    if (!parent_map) {
      context.parent_map = parent_map = {};

      context.root.iter(null, function(p) {
        p._children.forEach(function(e) {
          parent_map[e] = p;
        });
      });
    }

    for (i = 0, len = result.length; i < len; i++) {
      elem = result[i];

      if (parent_map.hasOwnProperty(elem)) {
        rv.push(parent_map[elem]);
      }
    }

    return rv;
  }

  return select;
}


function prepare_predicate(next, token) {
  var tag, key, value, select;
  token = next();

  if (token[1] === '@') {
    // attribute
    token = next();

    if (token[1]) {
      throw new SyntaxError(token, 'Invalid attribute predicate');
    }

    key = token[0];
    token = next();

    if (token[1] === ']') {
      select = function(context, result) {
        var i, len, elem, rv = [];

        for (i = 0, len = result.length; i < len; i++) {
          elem = result[i];

          if (elem.get(key)) {
            rv.push(elem);
          }
        }

        return rv;
      };
    }
    else if (token[1] === '=') {
      value = next()[1];

      if (value[0] === '"' || value[value.length - 1] === '\'') {
        value = value.slice(1, value.length - 1);
      }
      else {
        throw new SyntaxError(token, 'Ivalid comparison target');
      }

      token = next();
      select = function(context, result) {
        var i, len, elem, rv = [];

        for (i = 0, len = result.length; i < len; i++) {
          elem = result[i];

          if (elem.get(key) === value) {
            rv.push(elem);
          }
        }

        return rv;
      };
    }

    if (token[1] !== ']') {
      throw new SyntaxError(token, 'Invalid attribute predicate');
    }
  }
  else if (!token[1]) {
    tag = token[0] || '';
    token = next();

    if (token[1] !== ']') {
      throw new SyntaxError(token, 'Invalid node predicate');
    }

    select = function(context, result) {
      var i, len, elem, rv = [];

      for (i = 0, len = result.length; i < len; i++) {
        elem = result[i];

        if (elem.find(tag)) {
          rv.push(elem);
        }
      }

      return rv;
    };
  }
  else {
    throw new SyntaxError(null, 'Invalid predicate');
  }

  return select;
}



var ops = {
  "": prepare_tag,
  "*": prepare_star,
  ".": prepare_dot,
  "..": prepare_dot_dot,
  "//": prepare_iter,
  "[": prepare_predicate,
};

function _SelectorContext(root) {
  this.parent_map = null;
  this.root = root;
}

function findall(elem, path) {
  var selector, result, i, len, token, value, select, context;

  if (_cache.hasOwnProperty(path)) {
    selector = _cache[path];
  }
  else {
    // TODO: Use smarter cache purging approach
    if (Object.keys(_cache).length > 100) {
      _cache = {};
    }

    if (path.charAt(0) === '/') {
      throw new SyntaxError(null, 'Cannot use absolute path on element');
    }

    result = xpath_tokenizer(path);
    selector = [];

    function getToken() {
      return result.shift();
    }

    token = getToken();
    while (true) {
      var c = token[1] || '';
      value = ops[c](getToken, token);

      if (!value) {
        throw new SyntaxError(null, sprintf('Invalid path: %s', path));
      }

      selector.push(value);
      token = getToken();

      if (!token) {
        break;
      }
      else if (token[1] === '/') {
        token = getToken();
      }

      if (!token) {
        break;
      }
    }

    _cache[path] = selector;
  }

  // Execute slector pattern
  result = [elem];
  context = new _SelectorContext(elem);

  for (i = 0, len = selector.length; i < len; i++) {
    select = selector[i];
    result = select(context, result);
  }

  return result || [];
}

function find(element, path) {
  var resultElements = findall(element, path);

  if (resultElements && resultElements.length > 0) {
    return resultElements[0];
  }

  return null;
}

function findtext(element, path, defvalue) {
  var resultElements = findall(element, path);

  if (resultElements && resultElements.length > 0) {
    return resultElements[0].text;
  }

  return defvalue;
}


exports.find = find;
exports.findall = findall;
exports.findtext = findtext;
/**
 *  Copyright 2011 Rackspace
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

var sprintf = require('./sprintf').sprintf;

var utils = require('./utils');
var ElementPath = require('./elementpath');
var TreeBuilder = require('./treebuilder').TreeBuilder;
var get_parser = require('./parser').get_parser;
var constants = require('./constants');

var element_ids = 0;

function Element(tag, attrib)
{
  this._id = element_ids++;
  this.tag = tag;
  this.attrib = {};
  this.text = null;
  this.tail = null;
  this._children = [];

  if (attrib) {
    this.attrib = utils.merge(this.attrib, attrib);
  }
}

Element.prototype.toString = function()
{
  return sprintf("<Element %s at %s>", this.tag, this._id);
};

Element.prototype.makeelement = function(tag, attrib)
{
  return new Element(tag, attrib);
};

Element.prototype.len = function()
{
  return this._children.length;
};

Element.prototype.getItem = function(index)
{
  return this._children[index];
};

Element.prototype.setItem = function(index, element)
{
  this._children[index] = element;
};

Element.prototype.delItem = function(index)
{
  this._children.splice(index, 1);
};

Element.prototype.getSlice = function(start, stop)
{
  return this._children.slice(start, stop);
};

Element.prototype.setSlice = function(start, stop, elements)
{
  var i;
  var k = 0;
  for (i = start; i < stop; i++, k++) {
    this._children[i] = elements[k];
  }
};

Element.prototype.delSlice = function(start, stop)
{
  this._children.splice(start, stop - start);
};

Element.prototype.append = function(element)
{
  this._children.push(element);
};

Element.prototype.extend = function(elements)
{
  this._children.concat(elements);
};

Element.prototype.insert = function(index, element)
{
  this._children[index] = element;
};

Element.prototype.remove = function(element)
{
  this._children = this._children.filter(function(e) {
    /* TODO: is this the right way to do this? */
    if (e._id === element._id) {
      return false;
    }
    return true;
  });
};

Element.prototype.getchildren = function() {
  return this._children;
};

Element.prototype.find = function(path)
{
  return ElementPath.find(this, path);
};

Element.prototype.findtext = function(path, defvalue)
{
  return ElementPath.findtext(this, path, defvalue);
};

Element.prototype.findall = function(path, defvalue)
{
  return ElementPath.findall(this, path, defvalue);
};

Element.prototype.clear = function()
{
  this.attrib = {};
  this._children = [];
  this.text = null;
  this.tail = null;
};

Element.prototype.get = function(key, defvalue)
{
  if (this.attrib[key] !== undefined) {
    return this.attrib[key];
  }
  else {
    return defvalue;
  }
};

Element.prototype.set = function(key, value)
{
  this.attrib[key] = value;
};

Element.prototype.keys = function()
{
  return Object.keys(this.attrib);
};

Element.prototype.items = function()
{
  return utils.items(this.attrib);
};

/*
 * In python this uses a generator, but in v8 we don't have em,
 * so we use a callback instead.
 **/
Element.prototype.iter = function(tag, callback)
{
  var self = this;
  var i, child;

  if (tag === "*") {
    tag = null;
  }

  if (tag === null || this.tag === tag) {
    callback(self);
  }

  for (i = 0; i < this._children.length; i++) {
    child = this._children[i];
    child.iter(tag, function(e) {
      callback(e);
    });
  }
};

Element.prototype.itertext = function(callback)
{
  this.iter(null, function(e) {
    if (e.text) {
      callback(e.text);
    }

    if (e.tail) {
      callback(e.tail);
    }
  });
};


function SubElement(parent, tag, attrib) {
  var element = parent.makeelement(tag, attrib);
  parent.append(element);
  return element;
}

function Comment(text) {
  var element = new Element(Comment);
  if (text) {
    element.text = text;
  }
  return element;
}

function CData(text) {
  var element = new Element(CData);
  if (text) {
    element.text = text;
  }
  return element;
}

function ProcessingInstruction(target, text)
{
  var element = new Element(ProcessingInstruction);
  element.text = target;
  if (text) {
    element.text = element.text + " " + text;
  }
  return element;
}

function QName(text_or_uri, tag)
{
  if (tag) {
    text_or_uri = sprintf("{%s}%s", text_or_uri, tag);
  }
  this.text = text_or_uri;
}

QName.prototype.toString = function() {
  return this.text;
};

function ElementTree(element)
{
  this._root = element;
}

ElementTree.prototype.getroot = function() {
  return this._root;
};

ElementTree.prototype._setroot = function(element) {
  this._root = element;
};

ElementTree.prototype.parse = function(source, parser) {
  if (!parser) {
    parser = get_parser(constants.DEFAULT_PARSER);
    parser = new parser.XMLParser(new TreeBuilder());
  }

  parser.feed(source);
  this._root = parser.close();
  return this._root;
};

ElementTree.prototype.iter = function(tag, callback) {
  this._root.iter(tag, callback);
};

ElementTree.prototype.find = function(path) {
  return this._root.find(path);
};

ElementTree.prototype.findtext = function(path, defvalue) {
  return this._root.findtext(path, defvalue);
};

ElementTree.prototype.findall = function(path) {
  return this._root.findall(path);
};

/**
 * Unlike ElementTree, we don't write to a file, we return you a string.
 */
ElementTree.prototype.write = function(options) {
  var sb = [];
  options = utils.merge({
    encoding: 'utf-8',
    xml_declaration: null,
    default_namespace: null,
    method: 'xml'}, options);

  if (options.xml_declaration !== false) {
    sb.push("<?xml version='1.0' encoding='"+options.encoding +"'?>\n");
  }

  if (options.method === "text") {
    _serialize_text(sb, self._root, encoding);
  }
  else {
    var qnames, namespaces, indent, indent_string;
    var x = _namespaces(this._root, options.encoding, options.default_namespace);
    qnames = x[0];
    namespaces = x[1];

    if (options.hasOwnProperty('indent')) {
      indent = 0;
      indent_string = new Array(options.indent + 1).join(' ');
    }
    else {
      indent = false;
    }

    if (options.method === "xml") {
      _serialize_xml(function(data) {
        sb.push(data);
      }, this._root, options.encoding, qnames, namespaces, indent, indent_string);
    }
    else {
      /* TODO: html */
      throw new Error("unknown serialization method "+ options.method);
    }
  }

  return sb.join("");
};

var _namespace_map = {
    /* "well-known" namespace prefixes */
    "http://www.w3.org/XML/1998/namespace": "xml",
    "http://www.w3.org/1999/xhtml": "html",
    "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf",
    "http://schemas.xmlsoap.org/wsdl/": "wsdl",
    /* xml schema */
    "http://www.w3.org/2001/XMLSchema": "xs",
    "http://www.w3.org/2001/XMLSchema-instance": "xsi",
    /* dublic core */
    "http://purl.org/dc/elements/1.1/": "dc",
};

function register_namespace(prefix, uri) {
  if (/ns\d+$/.test(prefix)) {
    throw new Error('Prefix format reserved for internal use');
  }

  if (_namespace_map.hasOwnProperty(uri) && _namespace_map[uri] === prefix) {
    delete _namespace_map[uri];
  }

  _namespace_map[uri] = prefix;
}


function _escape(text, encoding, isAttribute, isText) {
  if (text) {
    text = text.toString();
    text = text.replace(/&/g, '&amp;');
    text = text.replace(/</g, '&lt;');
    text = text.replace(/>/g, '&gt;');
    if (!isText) {
        text = text.replace(/\n/g, '&#xA;');
        text = text.replace(/\r/g, '&#xD;');
    }
    if (isAttribute) {
      text = text.replace(/"/g, '&quot;');
    }
  }
  return text;
}

/* TODO: benchmark single regex */
function _escape_attrib(text, encoding) {
  return _escape(text, encoding, true);
}

function _escape_cdata(text, encoding) {
  return _escape(text, encoding, false);
}

function _escape_text(text, encoding) {
  return _escape(text, encoding, false, true);
}

function _namespaces(elem, encoding, default_namespace) {
  var qnames = {};
  var namespaces = {};

  if (default_namespace) {
    namespaces[default_namespace] = "";
  }

  function encode(text) {
    return text;
  }

  function add_qname(qname) {
    if (qname[0] === "{") {
      var tmp = qname.substring(1).split("}", 2);
      var uri = tmp[0];
      var tag = tmp[1];
      var prefix = namespaces[uri];

      if (prefix === undefined) {
        prefix = _namespace_map[uri];
        if (prefix === undefined) {
          prefix = "ns" + Object.keys(namespaces).length;
        }
        if (prefix !== "xml") {
          namespaces[uri] = prefix;
        }
      }

      if (prefix) {
        qnames[qname] = sprintf("%s:%s", prefix, tag);
      }
      else {
        qnames[qname] = tag;
      }
    }
    else {
      if (default_namespace) {
        throw new Error('cannot use non-qualified names with default_namespace option');
      }

      qnames[qname] = qname;
    }
  }


  elem.iter(null, function(e) {
    var i;
    var tag = e.tag;
    var text = e.text;
    var items = e.items();

    if (tag instanceof QName && qnames[tag.text] === undefined) {
      add_qname(tag.text);
    }
    else if (typeof(tag) === "string") {
      add_qname(tag);
    }
    else if (tag !== null && tag !== Comment && tag !== CData && tag !== ProcessingInstruction) {
      throw new Error('Invalid tag type for serialization: '+ tag);
    }

    if (text instanceof QName && qnames[text.text] === undefined) {
      add_qname(text.text);
    }

    items.forEach(function(item) {
      var key = item[0],
          value = item[1];
      if (key instanceof QName) {
        key = key.text;
      }

      if (qnames[key] === undefined) {
        add_qname(key);
      }

      if (value instanceof QName && qnames[value.text] === undefined) {
        add_qname(value.text);
      }
    });
  });
  return [qnames, namespaces];
}

function _serialize_xml(write, elem, encoding, qnames, namespaces, indent, indent_string) {
  var tag = elem.tag;
  var text = elem.text;
  var items;
  var i;

  var newlines = indent || (indent === 0);
  write(Array(indent + 1).join(indent_string));

  if (tag === Comment) {
    write(sprintf("<!--%s-->", _escape_cdata(text, encoding)));
  }
  else if (tag === ProcessingInstruction) {
    write(sprintf("<?%s?>", _escape_cdata(text, encoding)));
  }
  else if (tag === CData) {
    text = text || '';
    write(sprintf("<![CDATA[%s]]>", text));
  }
  else {
    tag = qnames[tag];
    if (tag === undefined) {
      if (text) {
        write(_escape_text(text, encoding));
      }
      elem.iter(function(e) {
        _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string);
      });
    }
    else {
      write("<" + tag);
      items = elem.items();

      if (items || namespaces) {
        items.sort(); // lexical order

        items.forEach(function(item) {
          var k = item[0],
              v = item[1];

            if (k instanceof QName) {
              k = k.text;
            }

            if (v instanceof QName) {
              v = qnames[v.text];
            }
            else {
              v = _escape_attrib(v, encoding);
            }
            write(sprintf(" %s=\"%s\"", qnames[k], v));
        });

        if (namespaces) {
          items = utils.items(namespaces);
          items.sort(function(a, b) { return a[1] < b[1]; });

          items.forEach(function(item) {
            var k = item[1],
                v = item[0];

            if (k) {
              k = ':' + k;
            }

            write(sprintf(" xmlns%s=\"%s\"", k, _escape_attrib(v, encoding)));
          });
        }
      }

      if (text || elem.len()) {
        if (text && text.toString().match(/^\s*$/)) {
            text = null;
        }

        write(">");
        if (!text && newlines) {
          write("\n");
        }

        if (text) {
          write(_escape_text(text, encoding));
        }
        elem._children.forEach(function(e) {
          _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string);
        });

        if (!text && indent) {
          write(Array(indent + 1).join(indent_string));
        }
        write("</" + tag + ">");
      }
      else {
        write(" />");
      }
    }
  }

  if (newlines) {
    write("\n");
  }
}

function parse(source, parser) {
  var tree = new ElementTree();
  tree.parse(source, parser);
  return tree;
}

function tostring(element, options) {
  return new ElementTree(element).write(options);
}

exports.PI = ProcessingInstruction;
exports.Comment = Comment;
exports.CData = CData;
exports.ProcessingInstruction = ProcessingInstruction;
exports.SubElement = SubElement;
exports.QName = QName;
exports.ElementTree = ElementTree;
exports.ElementPath = ElementPath;
exports.Element = function(tag, attrib) {
  return new Element(tag, attrib);
};

exports.XML = function(data) {
  var et = new ElementTree();
  return et.parse(data);
};

exports.parse = parse;
exports.register_namespace = register_namespace;
exports.tostring = tostring;
/**
 *  Copyright 2011 Rackspace
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

var util = require('util');

var sprintf = require('./sprintf').sprintf;

function SyntaxError(token, msg) {
  msg = msg || sprintf('Syntax Error at token %s', token.toString());
  this.token = token;
  this.message = msg;
  Error.call(this, msg);
}

util.inherits(SyntaxError, Error);

exports.SyntaxError = SyntaxError;
/*
 *  Copyright 2011 Rackspace
 *
 *  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.
 *
 */

/* TODO: support node-expat C++ module optionally */

var util = require('util');
var parsers = require('./parsers/index');

function get_parser(name) {
  if (name === 'sax') {
    return parsers.sax;
  }
  else {
    throw new Error('Invalid parser: ' + name);
  }
}


exports.get_parser = get_parser;
/*
 *  Copyright 2011 Rackspace
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

var cache = {};


// Do any others need escaping?
var TO_ESCAPE = {
  '\'': '\\\'',
  '\n': '\\n'
};


function populate(formatter) {
  var i, type,
      key = formatter,
      prev = 0,
      arg = 1,
      builder = 'return \'';

  for (i = 0; i < formatter.length; i++) {
    if (formatter[i] === '%') {
      type = formatter[i + 1];

      switch (type) {
        case 's':
          builder += formatter.slice(prev, i) + '\' + arguments[' + arg + '] + \'';
          prev = i + 2;
          arg++;
          break;
        case 'j':
          builder += formatter.slice(prev, i) + '\' + JSON.stringify(arguments[' + arg + ']) + \'';
          prev = i + 2;
          arg++;
          break;
        case '%':
          builder += formatter.slice(prev, i + 1);
          prev = i + 2;
          i++;
          break;
      }


    } else if (TO_ESCAPE[formatter[i]]) {
      builder += formatter.slice(prev, i) + TO_ESCAPE[formatter[i]];
      prev = i + 1;
    }
  }

  builder += formatter.slice(prev) + '\';';
  cache[key] = new Function(builder);
}


/**
 * A fast version of sprintf(), which currently only supports the %s and %j.
 * This caches a formatting function for each format string that is used, so
 * you should only use this sprintf() will be called many times with a single
 * format string and a limited number of format strings will ever be used (in
 * general this means that format strings should be string literals).
 *
 * @param {String} formatter A format string.
 * @param {...String} var_args Values that will be formatted by %s and %j.
 * @return {String} The formatted output.
 */
exports.sprintf = function(formatter, var_args) {
  if (!cache[formatter]) {
    populate(formatter);
  }

  return cache[formatter].apply(null, arguments);
};
function TreeBuilder(element_factory) {
  this._data = [];
  this._elem = [];
  this._last = null;
  this._tail = null;
  if (!element_factory) {
    /* evil circular dep */
    element_factory = require('./elementtree').Element;
  }
  this._factory = element_factory;
}

TreeBuilder.prototype.close = function() {
  return this._last;
};

TreeBuilder.prototype._flush = function() {
  if (this._data) {
    if (this._last !== null) {
      var text = this._data.join("");
      if (this._tail) {
        this._last.tail = text;
      }
      else {
        this._last.text = text;
      }
    }
    this._data = [];
  }
};

TreeBuilder.prototype.data = function(data) {
  this._data.push(data);
};

TreeBuilder.prototype.start = function(tag, attrs) {
  this._flush();
  var elem = this._factory(tag, attrs);
  this._last = elem;

  if (this._elem.length) {
    this._elem[this._elem.length - 1].append(elem);
  }

  this._elem.push(elem);

  this._tail = null;
};

TreeBuilder.prototype.end = function(tag) {
  this._flush();
  this._last = this._elem.pop();
  if (this._last.tag !== tag) {
    throw new Error("end tag mismatch");
  }
  this._tail = 1;
  return this._last;
};

exports.TreeBuilder = TreeBuilder;
/**
 *  Copyright 2011 Rackspace
 *
 *  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.
 *
 */

/**
 * @param {Object} hash.
 * @param {Array} ignored.
 */
function items(hash, ignored) {
  ignored = ignored || null;
  var k, rv = [];

  function is_ignored(key) {
    if (!ignored || ignored.length === 0) {
      return false;
    }

    return ignored.indexOf(key);
  }

  for (k in hash) {
    if (hash.hasOwnProperty(k) && !(is_ignored(ignored))) {
      rv.push([k, hash[k]]);
    }
  }

  return rv;
}


function findall(re, str) {
  var match, matches = [];

  while ((match = re.exec(str))) {
      matches.push(match);
  }

  return matches;
}

function merge(a, b) {
  var c = {}, attrname;

  for (attrname in a) {
    if (a.hasOwnProperty(attrname)) {
      c[attrname] = a[attrname];
    }
  }
  for (attrname in b) {
    if (b.hasOwnProperty(attrname)) {
      c[attrname] = b[attrname];
    }
  }
  return c;
}

exports.items = items;
exports.findall = findall;
exports.merge = merge;
exports.sax = require('./sax');
var util = require('util');

var sax = require('sax');

var TreeBuilder = require('./../treebuilder').TreeBuilder;

function XMLParser(target) {
  this.parser = sax.parser(true);

  this.target = (target) ? target : new TreeBuilder();

  this.parser.onopentag = this._handleOpenTag.bind(this);
  this.parser.ontext = this._handleText.bind(this);
  this.parser.oncdata = this._handleCdata.bind(this);
  this.parser.ondoctype = this._handleDoctype.bind(this);
  this.parser.oncomment = this._handleComment.bind(this);
  this.parser.onclosetag = this._handleCloseTag.bind(this);
  this.parser.onerror = this._handleError.bind(this);
}

XMLParser.prototype._handleOpenTag = function(tag) {
  this.target.start(tag.name, tag.attributes);
};

XMLParser.prototype._handleText = function(text) {
  this.target.data(text);
};

XMLParser.prototype._handleCdata = function(text) {
  this.target.data(text);
};

XMLParser.prototype._handleDoctype = function(text) {
};

XMLParser.prototype._handleComment = function(comment) {
};

XMLParser.prototype._handleCloseTag = function(tag) {
  this.target.end(tag);
};

XMLParser.prototype._handleError = function(err) {
  throw err;
};

XMLParser.prototype.feed = function(chunk) {
  this.parser.write(chunk);
};

XMLParser.prototype.close = function() {
  this.parser.close();
  return this.target.close();
};

exports.XMLParser = XMLParser;
Copyright Mathias Bynens <https://mathiasbynens.be/>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
"use strict";

module.exports = function () {
  // https://mths.be/emoji
  return /\uD83C\uDFF4(?:\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74)\uDB40\uDC7F|\u200D\u2620\uFE0F)|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC68(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3]))|\uD83D\uDC69\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\uD83D\uDC68(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83D\uDC69\u200D[\u2695\u2696\u2708])\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC68(?:\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDD1-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDEEB\uDEEC\uDEF4-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC69\uDC6E\uDC70-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD26\uDD30-\uDD39\uDD3D\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDD1-\uDDDD])/g;
};
{
  "author": {
    "name": "Mathias Bynens",
    "url": "https://mathiasbynens.be/"
  },
  "deprecated": false,
  "description": "A regular expression to match all Emoji-only symbols as per the Unicode Standard.",
  "devDependencies": {
    "@babel/cli": "^7.0.0",
    "@babel/core": "^7.0.0",
    "@babel/plugin-proposal-unicode-property-regex": "^7.0.0",
    "@babel/preset-env": "^7.0.0",
    "mocha": "^5.2.0",
    "regexgen": "^1.3.0",
    "unicode-11.0.0": "^0.7.7",
    "unicode-tr51": "^9.0.1"
  },
  "files": [
    "LICENSE-MIT.txt",
    "index.js",
    "index.d.ts",
    "text.js",
    "es2015/index.js",
    "es2015/text.js"
  ],
  "homepage": "https://mths.be/emoji-regex",
  "license": "MIT",
  "main": "index.js",
  "name": "emoji-regex",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/mathiasbynens/emoji-regex.git"
  },
  "types": "index.d.ts",
  "version": "7.0.3"
}"use strict";

module.exports = function () {
  // https://mths.be/emoji
  return /\uD83C\uDFF4(?:\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74)\uDB40\uDC7F|\u200D\u2620\uFE0F)|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC68(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3]))|\uD83D\uDC69\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\uD83D\uDC68(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83D\uDC69\u200D[\u2695\u2696\u2708])\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC68(?:\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDD1-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDEEB\uDEEC\uDEF4-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])\uFE0F?|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC69\uDC6E\uDC70-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD26\uDD30-\uDD39\uDD3D\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDD1-\uDDDD])/g;
};
"use strict";

module.exports = () => {
  // https://mths.be/emoji
  return /\u{1F3F4}(?:\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074})\u{E007F}|\u200D\u2620\uFE0F)|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F468}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u{1F468}(?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F469}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F468}(?:\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|[\u{1F3FB}-\u{1F3FF}])|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u{1F469}\u200D\u{1F466}|\u{1F1F6}\u{1F1E6}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9D1}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]\uFE0F|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F469}\u{1F46E}\u{1F470}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9D1}-\u{1F9DD}]/gu;
};
"use strict";

module.exports = () => {
  // https://mths.be/emoji
  return /\u{1F3F4}(?:\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074})\u{E007F}|\u200D\u2620\uFE0F)|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F468}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u{1F468}(?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F469}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F468}(?:\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|[\u{1F3FB}-\u{1F3FF}])|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u{1F469}\u200D\u{1F466}|\u{1F1F6}\u{1F1E6}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9D1}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]\uFE0F?|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F469}\u{1F46E}\u{1F470}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9D1}-\u{1F9DD}]/gu;
};
The MIT License (MIT)

Copyright (c) 2014 Mathias Buus

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.var once = require('once');

var noop = function() {};

var isRequest = function(stream) {
	return stream.setHeader && typeof stream.abort === 'function';
};

var isChildProcess = function(stream) {
	return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3
};

var eos = function(stream, opts, callback) {
	if (typeof opts === 'function') return eos(stream, null, opts);
	if (!opts) opts = {};

	callback = once(callback || noop);

	var ws = stream._writableState;
	var rs = stream._readableState;
	var readable = opts.readable || (opts.readable !== false && stream.readable);
	var writable = opts.writable || (opts.writable !== false && stream.writable);
	var cancelled = false;

	var onlegacyfinish = function() {
		if (!stream.writable) onfinish();
	};

	var onfinish = function() {
		writable = false;
		if (!readable) callback.call(stream);
	};

	var onend = function() {
		readable = false;
		if (!writable) callback.call(stream);
	};

	var onexit = function(exitCode) {
		callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);
	};

	var onerror = function(err) {
		callback.call(stream, err);
	};

	var onclose = function() {
		process.nextTick(onclosenexttick);
	};

	var onclosenexttick = function() {
		if (cancelled) return;
		if (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close'));
		if (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close'));
	};

	var onrequest = function() {
		stream.req.on('finish', onfinish);
	};

	if (isRequest(stream)) {
		stream.on('complete', onfinish);
		stream.on('abort', onclose);
		if (stream.req) onrequest();
		else stream.on('request', onrequest);
	} else if (writable && !ws) { // legacy streams
		stream.on('end', onlegacyfinish);
		stream.on('close', onlegacyfinish);
	}

	if (isChildProcess(stream)) stream.on('exit', onexit);

	stream.on('end', onend);
	stream.on('finish', onfinish);
	if (opts.error !== false) stream.on('error', onerror);
	stream.on('close', onclose);

	return function() {
		cancelled = true;
		stream.removeListener('complete', onfinish);
		stream.removeListener('abort', onclose);
		stream.removeListener('request', onrequest);
		if (stream.req) stream.req.removeListener('finish', onfinish);
		stream.removeListener('end', onlegacyfinish);
		stream.removeListener('close', onlegacyfinish);
		stream.removeListener('finish', onfinish);
		stream.removeListener('exit', onexit);
		stream.removeListener('end', onend);
		stream.removeListener('error', onerror);
		stream.removeListener('close', onclose);
	};
};

module.exports = eos;
{
  "author": {
    "name": "Mathias Buus",
    "email": "mathiasbuus@gmail.com"
  },
  "dependencies": {
    "once": "^1.4.0"
  },
  "deprecated": false,
  "description": "Call a callback when a readable/writable/duplex stream has completed or failed.",
  "devDependencies": {
    "tape": "^4.11.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/mafintosh/end-of-stream",
  "license": "MIT",
  "main": "index.js",
  "name": "end-of-stream",
  "repository": {
    "type": "git",
    "url": "git://github.com/mafintosh/end-of-stream.git"
  },
  "version": "1.4.4"
}The MIT License (MIT)

Copyright (c) 2017 Zhou Hancheng (z308114274@gmail.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
const dedent = require('dedent')
const objectorarray = require('objectorarray')
const parse = require('fast-json-parse')

module.exports = endent

const ENDENT_ID = 'twhZNwxI1aFG3r4'

function endent (strings, ...values) {
  strings = [].concat(strings)

  let result = ''

  for (let i = 0; i < strings.length; i++) {
    result += strings[i]

    if (i < values.length) {
      let value = values[i]
      let isJson = false

      if (parse(value).value) {
        value = parse(value).value
        isJson = true
      }

      if ((value && value[ENDENT_ID]) || isJson) {
        let rawlines = result.split('\n')
        let l = rawlines[rawlines.length - 1].search(/\S/)
        let endentation = l > 0 ? ' '.repeat(l) : ''
        let valueJson = isJson ? JSON.stringify(value, null, 2) : value[ENDENT_ID]
        let valueLines = valueJson.split('\n')

        valueLines.forEach((l, index) => {
          if (index > 0) {
            result += ('\n' + endentation + l)
          } else {
            result += l
          }
        })
      } else if (typeof value === 'string' && value.includes('\n')) {
        let endentations = result.match(/(?:^|\n)( *)$/)

        if (typeof value === 'string') {
          let endentation = endentations ? endentations[1] : ''
          result += value
            .split('\n')
            .map((str, i) => {
              str = (ENDENT_ID + str)
              return i === 0 ? str : `${endentation}${str}`
            })
            .join('\n')
        } else {
          result += value
        }
      } else {
        result += value
      }
    }
  }
  result = dedent(result)
  return result.split(ENDENT_ID).join('')
}

endent.pretty = (data) => {
  return objectorarray(data) ? {[ENDENT_ID]: JSON.stringify(data, null, 2)} : data
}
{
  "author": {
    "name": "zhouhancheng",
    "email": "z308114274@gmail.com"
  },
  "dependencies": {
    "dedent": "^0.7.0",
    "fast-json-parse": "^1.0.3",
    "objectorarray": "^1.0.4"
  },
  "deprecated": false,
  "description": "âž¡ï¸� An ES6 string tag that makes indentation right",
  "devDependencies": {
    "standard": "^11.0.1",
    "tape": "^4.8.0"
  },
  "homepage": "https://github.com/ZhouHansen/endent#readme",
  "license": "MIT",
  "main": "endent.js",
  "name": "endent",
  "repository": {
    "type": "git",
    "url": "git://github.com/ZhouHansen/endent.git"
  },
  "version": "1.4.1"
}'use strict';
const path = require('path');
const os = require('os');

const homedir = os.homedir();
const tmpdir = os.tmpdir();
const env = process.env;

const macos = name => {
	const library = path.join(homedir, 'Library');

	return {
		data: path.join(library, 'Application Support', name),
		config: path.join(library, 'Preferences', name),
		cache: path.join(library, 'Caches', name),
		log: path.join(library, 'Logs', name),
		temp: path.join(tmpdir, name)
	};
};

const windows = name => {
	const appData = env.LOCALAPPDATA || path.join(homedir, 'AppData', 'Local');

	return {
		// data/config/cache/log are invented by me as Windows isn't opinionated about this
		data: path.join(appData, name, 'Data'),
		config: path.join(appData, name, 'Config'),
		cache: path.join(appData, name, 'Cache'),
		log: path.join(appData, name, 'Log'),
		temp: path.join(tmpdir, name)
	};
};

// https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
const linux = name => {
	const username = path.basename(homedir);

	return {
		data: path.join(env.XDG_DATA_HOME || path.join(homedir, '.local', 'share'), name),
		config: path.join(env.XDG_CONFIG_HOME || path.join(homedir, '.config'), name),
		cache: path.join(env.XDG_CACHE_HOME || path.join(homedir, '.cache'), name),
		// https://wiki.debian.org/XDGBaseDirectorySpecification#state
		log: path.join(env.XDG_STATE_HOME || path.join(homedir, '.local', 'state'), name),
		temp: path.join(tmpdir, username, name)
	};
};

module.exports = (name, opts) => {
	if (typeof name !== 'string') {
		throw new TypeError(`Expected string, got ${typeof name}`);
	}

	opts = Object.assign({suffix: 'nodejs'}, opts);

	if (opts.suffix) {
		// add suffix to prevent possible conflict with native apps
		name += `-${opts.suffix}`;
	}

	if (process.platform === 'darwin') {
		return macos(name);
	}

	if (process.platform === 'win32') {
		return windows(name);
	}

	return linux(name);
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Get paths for storing things like data, config, cache, etc",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/env-paths#readme",
  "license": "MIT",
  "name": "env-paths",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/env-paths.git"
  },
  "version": "1.0.0"
}The MIT License (MIT)

Copyright (c) 2015 JD Ballard

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'use strict';

var util = require('util');
var isArrayish = require('is-arrayish');

var errorEx = function errorEx(name, properties) {
	if (!name || name.constructor !== String) {
		properties = name || {};
		name = Error.name;
	}

	var errorExError = function ErrorEXError(message) {
		if (!this) {
			return new ErrorEXError(message);
		}

		message = message instanceof Error
			? message.message
			: (message || this.message);

		Error.call(this, message);
		Error.captureStackTrace(this, errorExError);

		this.name = name;

		Object.defineProperty(this, 'message', {
			configurable: true,
			enumerable: false,
			get: function () {
				var newMessage = message.split(/\r?\n/g);

				for (var key in properties) {
					if (!properties.hasOwnProperty(key)) {
						continue;
					}

					var modifier = properties[key];

					if ('message' in modifier) {
						newMessage = modifier.message(this[key], newMessage) || newMessage;
						if (!isArrayish(newMessage)) {
							newMessage = [newMessage];
						}
					}
				}

				return newMessage.join('\n');
			},
			set: function (v) {
				message = v;
			}
		});

		var overwrittenStack = null;

		var stackDescriptor = Object.getOwnPropertyDescriptor(this, 'stack');
		var stackGetter = stackDescriptor.get;
		var stackValue = stackDescriptor.value;
		delete stackDescriptor.value;
		delete stackDescriptor.writable;

		stackDescriptor.set = function (newstack) {
			overwrittenStack = newstack;
		};

		stackDescriptor.get = function () {
			var stack = (overwrittenStack || ((stackGetter)
				? stackGetter.call(this)
				: stackValue)).split(/\r?\n+/g);

			// starting in Node 7, the stack builder caches the message.
			// just replace it.
			if (!overwrittenStack) {
				stack[0] = this.name + ': ' + this.message;
			}

			var lineCount = 1;
			for (var key in properties) {
				if (!properties.hasOwnProperty(key)) {
					continue;
				}

				var modifier = properties[key];

				if ('line' in modifier) {
					var line = modifier.line(this[key]);
					if (line) {
						stack.splice(lineCount++, 0, '    ' + line);
					}
				}

				if ('stack' in modifier) {
					modifier.stack(this[key], stack);
				}
			}

			return stack.join('\n');
		};

		Object.defineProperty(this, 'stack', stackDescriptor);
	};

	if (Object.setPrototypeOf) {
		Object.setPrototypeOf(errorExError.prototype, Error.prototype);
		Object.setPrototypeOf(errorExError, Error);
	} else {
		util.inherits(errorExError, Error);
	}

	return errorExError;
};

errorEx.append = function (str, def) {
	return {
		message: function (v, message) {
			v = v || def;

			if (v) {
				message[0] += ' ' + str.replace('%s', v.toString());
			}

			return message;
		}
	};
};

errorEx.line = function (str, def) {
	return {
		line: function (v) {
			v = v || def;

			if (v) {
				return str.replace('%s', v.toString());
			}

			return null;
		}
	};
};

module.exports = errorEx;
{
  "dependencies": {
    "is-arrayish": "^0.2.1"
  },
  "deprecated": false,
  "description": "Easy error subclassing and stack customization",
  "devDependencies": {
    "coffee-script": "^1.9.3",
    "coveralls": "^2.11.2",
    "istanbul": "^0.3.17",
    "mocha": "^2.2.5",
    "should": "^7.0.1",
    "xo": "^0.7.1"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/qix-/node-error-ex#readme",
  "license": "MIT",
  "maintainers": [
    {
      "name": "Josh Junon",
      "email": "i.am.qix@gmail.com",
      "url": "github.com/qix-"
    },
    {
      "name": "Sindre Sorhus",
      "email": "sindresorhus@gmail.com",
      "url": "sindresorhus.com"
    }
  ],
  "name": "error-ex",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/qix-/node-error-ex.git"
  },
  "version": "1.3.2"
}'use strict';

var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;

module.exports = function (str) {
	if (typeof str !== 'string') {
		throw new TypeError('Expected a string');
	}

	return str.replace(matchOperatorsRe, '\\$&');
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Escape RegExp special characters",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.8.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/escape-string-regexp#readme",
  "license": "MIT",
  "maintainers": [
    {
      "name": "Sindre Sorhus",
      "email": "sindresorhus@gmail.com",
      "url": "sindresorhus.com"
    },
    {
      "name": "Joshua Boy Nicolai Appelman",
      "email": "joshua@jbna.nl",
      "url": "jbna.nl"
    }
  ],
  "name": "escape-string-regexp",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/escape-string-regexp.git"
  },
  "version": "1.0.5"
}Copyright JS Foundation and other contributors, https://js.foundation/

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

  * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
  * Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
  "author": {
    "name": "Ariya Hidayat",
    "email": "ariya.hidayat@gmail.com"
  },
  "bin": {
    "esparse": "bin/esparse.js",
    "esvalidate": "bin/esvalidate.js"
  },
  "deprecated": false,
  "description": "ECMAScript parsing infrastructure for multipurpose analysis",
  "devDependencies": {
    "codecov.io": "~0.1.6",
    "escomplex-js": "1.2.0",
    "everything.js": "~1.0.3",
    "glob": "~7.1.0",
    "istanbul": "~0.4.0",
    "json-diff": "~0.3.1",
    "karma": "~1.3.0",
    "karma-chrome-launcher": "~2.0.0",
    "karma-detect-browsers": "~2.2.3",
    "karma-edge-launcher": "~0.2.0",
    "karma-firefox-launcher": "~1.0.0",
    "karma-ie-launcher": "~1.0.0",
    "karma-mocha": "~1.3.0",
    "karma-safari-launcher": "~1.0.0",
    "karma-safaritechpreview-launcher": "~0.0.4",
    "karma-sauce-launcher": "~1.1.0",
    "lodash": "~3.10.1",
    "mocha": "~3.2.0",
    "node-tick-processor": "~0.0.2",
    "regenerate": "~1.3.2",
    "temp": "~0.8.3",
    "tslint": "~5.1.0",
    "typescript": "~2.3.2",
    "typescript-formatter": "~5.1.3",
    "unicode-8.0.0": "~0.7.0",
    "webpack": "~1.14.0"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "bin",
    "dist/esprima.js"
  ],
  "homepage": "http://esprima.org",
  "license": "BSD-2-Clause",
  "main": "dist/esprima.js",
  "maintainers": [
    {
      "name": "Ariya Hidayat",
      "email": "ariya.hidayat@gmail.com",
      "url": "http://ariya.ofilabs.com"
    }
  ],
  "name": "esprima",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jquery/esprima.git"
  },
  "version": "4.0.1"
}(function webpackUniversalModuleDefinition(root, factory) {
/* istanbul ignore next */
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define([], factory);
/* istanbul ignore next */
	else if(typeof exports === 'object')
		exports["esprima"] = factory();
	else
		root["esprima"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};

/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {

/******/ 		// Check if module is in cache
/* istanbul ignore if */
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;

/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};

/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;

/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}


/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;

/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;

/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";

/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	/*
	  Copyright JS Foundation and other contributors, https://js.foundation/

	  Redistribution and use in source and binary forms, with or without
	  modification, are permitted provided that the following conditions are met:

	    * Redistributions of source code must retain the above copyright
	      notice, this list of conditions and the following disclaimer.
	    * Redistributions in binary form must reproduce the above copyright
	      notice, this list of conditions and the following disclaimer in the
	      documentation and/or other materials provided with the distribution.

	  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
	  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
	  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
	  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
	  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
	  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
	  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
	  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
	  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
	  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
	*/
	Object.defineProperty(exports, "__esModule", { value: true });
	var comment_handler_1 = __webpack_require__(1);
	var jsx_parser_1 = __webpack_require__(3);
	var parser_1 = __webpack_require__(8);
	var tokenizer_1 = __webpack_require__(15);
	function parse(code, options, delegate) {
	    var commentHandler = null;
	    var proxyDelegate = function (node, metadata) {
	        if (delegate) {
	            delegate(node, metadata);
	        }
	        if (commentHandler) {
	            commentHandler.visit(node, metadata);
	        }
	    };
	    var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null;
	    var collectComment = false;
	    if (options) {
	        collectComment = (typeof options.comment === 'boolean' && options.comment);
	        var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment);
	        if (collectComment || attachComment) {
	            commentHandler = new comment_handler_1.CommentHandler();
	            commentHandler.attach = attachComment;
	            options.comment = true;
	            parserDelegate = proxyDelegate;
	        }
	    }
	    var isModule = false;
	    if (options && typeof options.sourceType === 'string') {
	        isModule = (options.sourceType === 'module');
	    }
	    var parser;
	    if (options && typeof options.jsx === 'boolean' && options.jsx) {
	        parser = new jsx_parser_1.JSXParser(code, options, parserDelegate);
	    }
	    else {
	        parser = new parser_1.Parser(code, options, parserDelegate);
	    }
	    var program = isModule ? parser.parseModule() : parser.parseScript();
	    var ast = program;
	    if (collectComment && commentHandler) {
	        ast.comments = commentHandler.comments;
	    }
	    if (parser.config.tokens) {
	        ast.tokens = parser.tokens;
	    }
	    if (parser.config.tolerant) {
	        ast.errors = parser.errorHandler.errors;
	    }
	    return ast;
	}
	exports.parse = parse;
	function parseModule(code, options, delegate) {
	    var parsingOptions = options || {};
	    parsingOptions.sourceType = 'module';
	    return parse(code, parsingOptions, delegate);
	}
	exports.parseModule = parseModule;
	function parseScript(code, options, delegate) {
	    var parsingOptions = options || {};
	    parsingOptions.sourceType = 'script';
	    return parse(code, parsingOptions, delegate);
	}
	exports.parseScript = parseScript;
	function tokenize(code, options, delegate) {
	    var tokenizer = new tokenizer_1.Tokenizer(code, options);
	    var tokens;
	    tokens = [];
	    try {
	        while (true) {
	            var token = tokenizer.getNextToken();
	            if (!token) {
	                break;
	            }
	            if (delegate) {
	                token = delegate(token);
	            }
	            tokens.push(token);
	        }
	    }
	    catch (e) {
	        tokenizer.errorHandler.tolerate(e);
	    }
	    if (tokenizer.errorHandler.tolerant) {
	        tokens.errors = tokenizer.errors();
	    }
	    return tokens;
	}
	exports.tokenize = tokenize;
	var syntax_1 = __webpack_require__(2);
	exports.Syntax = syntax_1.Syntax;
	// Sync with *.json manifests.
	exports.version = '4.0.1';


/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	var syntax_1 = __webpack_require__(2);
	var CommentHandler = (function () {
	    function CommentHandler() {
	        this.attach = false;
	        this.comments = [];
	        this.stack = [];
	        this.leading = [];
	        this.trailing = [];
	    }
	    CommentHandler.prototype.insertInnerComments = function (node, metadata) {
	        //  innnerComments for properties empty block
	        //  `function a() {/** comments **\/}`
	        if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) {
	            var innerComments = [];
	            for (var i = this.leading.length - 1; i >= 0; --i) {
	                var entry = this.leading[i];
	                if (metadata.end.offset >= entry.start) {
	                    innerComments.unshift(entry.comment);
	                    this.leading.splice(i, 1);
	                    this.trailing.splice(i, 1);
	                }
	            }
	            if (innerComments.length) {
	                node.innerComments = innerComments;
	            }
	        }
	    };
	    CommentHandler.prototype.findTrailingComments = function (metadata) {
	        var trailingComments = [];
	        if (this.trailing.length > 0) {
	            for (var i = this.trailing.length - 1; i >= 0; --i) {
	                var entry_1 = this.trailing[i];
	                if (entry_1.start >= metadata.end.offset) {
	                    trailingComments.unshift(entry_1.comment);
	                }
	            }
	            this.trailing.length = 0;
	            return trailingComments;
	        }
	        var entry = this.stack[this.stack.length - 1];
	        if (entry && entry.node.trailingComments) {
	            var firstComment = entry.node.trailingComments[0];
	            if (firstComment && firstComment.range[0] >= metadata.end.offset) {
	                trailingComments = entry.node.trailingComments;
	                delete entry.node.trailingComments;
	            }
	        }
	        return trailingComments;
	    };
	    CommentHandler.prototype.findLeadingComments = function (metadata) {
	        var leadingComments = [];
	        var target;
	        while (this.stack.length > 0) {
	            var entry = this.stack[this.stack.length - 1];
	            if (entry && entry.start >= metadata.start.offset) {
	                target = entry.node;
	                this.stack.pop();
	            }
	            else {
	                break;
	            }
	        }
	        if (target) {
	            var count = target.leadingComments ? target.leadingComments.length : 0;
	            for (var i = count - 1; i >= 0; --i) {
	                var comment = target.leadingComments[i];
	                if (comment.range[1] <= metadata.start.offset) {
	                    leadingComments.unshift(comment);
	                    target.leadingComments.splice(i, 1);
	                }
	            }
	            if (target.leadingComments && target.leadingComments.length === 0) {
	                delete target.leadingComments;
	            }
	            return leadingComments;
	        }
	        for (var i = this.leading.length - 1; i >= 0; --i) {
	            var entry = this.leading[i];
	            if (entry.start <= metadata.start.offset) {
	                leadingComments.unshift(entry.comment);
	                this.leading.splice(i, 1);
	            }
	        }
	        return leadingComments;
	    };
	    CommentHandler.prototype.visitNode = function (node, metadata) {
	        if (node.type === syntax_1.Syntax.Program && node.body.length > 0) {
	            return;
	        }
	        this.insertInnerComments(node, metadata);
	        var trailingComments = this.findTrailingComments(metadata);
	        var leadingComments = this.findLeadingComments(metadata);
	        if (leadingComments.length > 0) {
	            node.leadingComments = leadingComments;
	        }
	        if (trailingComments.length > 0) {
	            node.trailingComments = trailingComments;
	        }
	        this.stack.push({
	            node: node,
	            start: metadata.start.offset
	        });
	    };
	    CommentHandler.prototype.visitComment = function (node, metadata) {
	        var type = (node.type[0] === 'L') ? 'Line' : 'Block';
	        var comment = {
	            type: type,
	            value: node.value
	        };
	        if (node.range) {
	            comment.range = node.range;
	        }
	        if (node.loc) {
	            comment.loc = node.loc;
	        }
	        this.comments.push(comment);
	        if (this.attach) {
	            var entry = {
	                comment: {
	                    type: type,
	                    value: node.value,
	                    range: [metadata.start.offset, metadata.end.offset]
	                },
	                start: metadata.start.offset
	            };
	            if (node.loc) {
	                entry.comment.loc = node.loc;
	            }
	            node.type = type;
	            this.leading.push(entry);
	            this.trailing.push(entry);
	        }
	    };
	    CommentHandler.prototype.visit = function (node, metadata) {
	        if (node.type === 'LineComment') {
	            this.visitComment(node, metadata);
	        }
	        else if (node.type === 'BlockComment') {
	            this.visitComment(node, metadata);
	        }
	        else if (this.attach) {
	            this.visitNode(node, metadata);
	        }
	    };
	    return CommentHandler;
	}());
	exports.CommentHandler = CommentHandler;


/***/ },
/* 2 */
/***/ function(module, exports) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	exports.Syntax = {
	    AssignmentExpression: 'AssignmentExpression',
	    AssignmentPattern: 'AssignmentPattern',
	    ArrayExpression: 'ArrayExpression',
	    ArrayPattern: 'ArrayPattern',
	    ArrowFunctionExpression: 'ArrowFunctionExpression',
	    AwaitExpression: 'AwaitExpression',
	    BlockStatement: 'BlockStatement',
	    BinaryExpression: 'BinaryExpression',
	    BreakStatement: 'BreakStatement',
	    CallExpression: 'CallExpression',
	    CatchClause: 'CatchClause',
	    ClassBody: 'ClassBody',
	    ClassDeclaration: 'ClassDeclaration',
	    ClassExpression: 'ClassExpression',
	    ConditionalExpression: 'ConditionalExpression',
	    ContinueStatement: 'ContinueStatement',
	    DoWhileStatement: 'DoWhileStatement',
	    DebuggerStatement: 'DebuggerStatement',
	    EmptyStatement: 'EmptyStatement',
	    ExportAllDeclaration: 'ExportAllDeclaration',
	    ExportDefaultDeclaration: 'ExportDefaultDeclaration',
	    ExportNamedDeclaration: 'ExportNamedDeclaration',
	    ExportSpecifier: 'ExportSpecifier',
	    ExpressionStatement: 'ExpressionStatement',
	    ForStatement: 'ForStatement',
	    ForOfStatement: 'ForOfStatement',
	    ForInStatement: 'ForInStatement',
	    FunctionDeclaration: 'FunctionDeclaration',
	    FunctionExpression: 'FunctionExpression',
	    Identifier: 'Identifier',
	    IfStatement: 'IfStatement',
	    ImportDeclaration: 'ImportDeclaration',
	    ImportDefaultSpecifier: 'ImportDefaultSpecifier',
	    ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
	    ImportSpecifier: 'ImportSpecifier',
	    Literal: 'Literal',
	    LabeledStatement: 'LabeledStatement',
	    LogicalExpression: 'LogicalExpression',
	    MemberExpression: 'MemberExpression',
	    MetaProperty: 'MetaProperty',
	    MethodDefinition: 'MethodDefinition',
	    NewExpression: 'NewExpression',
	    ObjectExpression: 'ObjectExpression',
	    ObjectPattern: 'ObjectPattern',
	    Program: 'Program',
	    Property: 'Property',
	    RestElement: 'RestElement',
	    ReturnStatement: 'ReturnStatement',
	    SequenceExpression: 'SequenceExpression',
	    SpreadElement: 'SpreadElement',
	    Super: 'Super',
	    SwitchCase: 'SwitchCase',
	    SwitchStatement: 'SwitchStatement',
	    TaggedTemplateExpression: 'TaggedTemplateExpression',
	    TemplateElement: 'TemplateElement',
	    TemplateLiteral: 'TemplateLiteral',
	    ThisExpression: 'ThisExpression',
	    ThrowStatement: 'ThrowStatement',
	    TryStatement: 'TryStatement',
	    UnaryExpression: 'UnaryExpression',
	    UpdateExpression: 'UpdateExpression',
	    VariableDeclaration: 'VariableDeclaration',
	    VariableDeclarator: 'VariableDeclarator',
	    WhileStatement: 'WhileStatement',
	    WithStatement: 'WithStatement',
	    YieldExpression: 'YieldExpression'
	};


/***/ },
/* 3 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
/* istanbul ignore next */
	var __extends = (this && this.__extends) || (function () {
	    var extendStatics = Object.setPrototypeOf ||
	        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
	        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
	    return function (d, b) {
	        extendStatics(d, b);
	        function __() { this.constructor = d; }
	        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
	    };
	})();
	Object.defineProperty(exports, "__esModule", { value: true });
	var character_1 = __webpack_require__(4);
	var JSXNode = __webpack_require__(5);
	var jsx_syntax_1 = __webpack_require__(6);
	var Node = __webpack_require__(7);
	var parser_1 = __webpack_require__(8);
	var token_1 = __webpack_require__(13);
	var xhtml_entities_1 = __webpack_require__(14);
	token_1.TokenName[100 /* Identifier */] = 'JSXIdentifier';
	token_1.TokenName[101 /* Text */] = 'JSXText';
	// Fully qualified element name, e.g. <svg:path> returns "svg:path"
	function getQualifiedElementName(elementName) {
	    var qualifiedName;
	    switch (elementName.type) {
	        case jsx_syntax_1.JSXSyntax.JSXIdentifier:
	            var id = elementName;
	            qualifiedName = id.name;
	            break;
	        case jsx_syntax_1.JSXSyntax.JSXNamespacedName:
	            var ns = elementName;
	            qualifiedName = getQualifiedElementName(ns.namespace) + ':' +
	                getQualifiedElementName(ns.name);
	            break;
	        case jsx_syntax_1.JSXSyntax.JSXMemberExpression:
	            var expr = elementName;
	            qualifiedName = getQualifiedElementName(expr.object) + '.' +
	                getQualifiedElementName(expr.property);
	            break;
	        /* istanbul ignore next */
	        default:
	            break;
	    }
	    return qualifiedName;
	}
	var JSXParser = (function (_super) {
	    __extends(JSXParser, _super);
	    function JSXParser(code, options, delegate) {
	        return _super.call(this, code, options, delegate) || this;
	    }
	    JSXParser.prototype.parsePrimaryExpression = function () {
	        return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this);
	    };
	    JSXParser.prototype.startJSX = function () {
	        // Unwind the scanner before the lookahead token.
	        this.scanner.index = this.startMarker.index;
	        this.scanner.lineNumber = this.startMarker.line;
	        this.scanner.lineStart = this.startMarker.index - this.startMarker.column;
	    };
	    JSXParser.prototype.finishJSX = function () {
	        // Prime the next lookahead.
	        this.nextToken();
	    };
	    JSXParser.prototype.reenterJSX = function () {
	        this.startJSX();
	        this.expectJSX('}');
	        // Pop the closing '}' added from the lookahead.
	        if (this.config.tokens) {
	            this.tokens.pop();
	        }
	    };
	    JSXParser.prototype.createJSXNode = function () {
	        this.collectComments();
	        return {
	            index: this.scanner.index,
	            line: this.scanner.lineNumber,
	            column: this.scanner.index - this.scanner.lineStart
	        };
	    };
	    JSXParser.prototype.createJSXChildNode = function () {
	        return {
	            index: this.scanner.index,
	            line: this.scanner.lineNumber,
	            column: this.scanner.index - this.scanner.lineStart
	        };
	    };
	    JSXParser.prototype.scanXHTMLEntity = function (quote) {
	        var result = '&';
	        var valid = true;
	        var terminated = false;
	        var numeric = false;
	        var hex = false;
	        while (!this.scanner.eof() && valid && !terminated) {
	            var ch = this.scanner.source[this.scanner.index];
	            if (ch === quote) {
	                break;
	            }
	            terminated = (ch === ';');
	            result += ch;
	            ++this.scanner.index;
	            if (!terminated) {
	                switch (result.length) {
	                    case 2:
	                        // e.g. '&#123;'
	                        numeric = (ch === '#');
	                        break;
	                    case 3:
	                        if (numeric) {
	                            // e.g. '&#x41;'
	                            hex = (ch === 'x');
	                            valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0));
	                            numeric = numeric && !hex;
	                        }
	                        break;
	                    default:
	                        valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0)));
	                        valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0)));
	                        break;
	                }
	            }
	        }
	        if (valid && terminated && result.length > 2) {
	            // e.g. '&#x41;' becomes just '#x41'
	            var str = result.substr(1, result.length - 2);
	            if (numeric && str.length > 1) {
	                result = String.fromCharCode(parseInt(str.substr(1), 10));
	            }
	            else if (hex && str.length > 2) {
	                result = String.fromCharCode(parseInt('0' + str.substr(1), 16));
	            }
	            else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) {
	                result = xhtml_entities_1.XHTMLEntities[str];
	            }
	        }
	        return result;
	    };
	    // Scan the next JSX token. This replaces Scanner#lex when in JSX mode.
	    JSXParser.prototype.lexJSX = function () {
	        var cp = this.scanner.source.charCodeAt(this.scanner.index);
	        // < > / : = { }
	        if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) {
	            var value = this.scanner.source[this.scanner.index++];
	            return {
	                type: 7 /* Punctuator */,
	                value: value,
	                lineNumber: this.scanner.lineNumber,
	                lineStart: this.scanner.lineStart,
	                start: this.scanner.index - 1,
	                end: this.scanner.index
	            };
	        }
	        // " '
	        if (cp === 34 || cp === 39) {
	            var start = this.scanner.index;
	            var quote = this.scanner.source[this.scanner.index++];
	            var str = '';
	            while (!this.scanner.eof()) {
	                var ch = this.scanner.source[this.scanner.index++];
	                if (ch === quote) {
	                    break;
	                }
	                else if (ch === '&') {
	                    str += this.scanXHTMLEntity(quote);
	                }
	                else {
	                    str += ch;
	                }
	            }
	            return {
	                type: 8 /* StringLiteral */,
	                value: str,
	                lineNumber: this.scanner.lineNumber,
	                lineStart: this.scanner.lineStart,
	                start: start,
	                end: this.scanner.index
	            };
	        }
	        // ... or .
	        if (cp === 46) {
	            var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1);
	            var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2);
	            var value = (n1 === 46 && n2 === 46) ? '...' : '.';
	            var start = this.scanner.index;
	            this.scanner.index += value.length;
	            return {
	                type: 7 /* Punctuator */,
	                value: value,
	                lineNumber: this.scanner.lineNumber,
	                lineStart: this.scanner.lineStart,
	                start: start,
	                end: this.scanner.index
	            };
	        }
	        // `
	        if (cp === 96) {
	            // Only placeholder, since it will be rescanned as a real assignment expression.
	            return {
	                type: 10 /* Template */,
	                value: '',
	                lineNumber: this.scanner.lineNumber,
	                lineStart: this.scanner.lineStart,
	                start: this.scanner.index,
	                end: this.scanner.index
	            };
	        }
	        // Identifer can not contain backslash (char code 92).
	        if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) {
	            var start = this.scanner.index;
	            ++this.scanner.index;
	            while (!this.scanner.eof()) {
	                var ch = this.scanner.source.charCodeAt(this.scanner.index);
	                if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) {
	                    ++this.scanner.index;
	                }
	                else if (ch === 45) {
	                    // Hyphen (char code 45) can be part of an identifier.
	                    ++this.scanner.index;
	                }
	                else {
	                    break;
	                }
	            }
	            var id = this.scanner.source.slice(start, this.scanner.index);
	            return {
	                type: 100 /* Identifier */,
	                value: id,
	                lineNumber: this.scanner.lineNumber,
	                lineStart: this.scanner.lineStart,
	                start: start,
	                end: this.scanner.index
	            };
	        }
	        return this.scanner.lex();
	    };
	    JSXParser.prototype.nextJSXToken = function () {
	        this.collectComments();
	        this.startMarker.index = this.scanner.index;
	        this.startMarker.line = this.scanner.lineNumber;
	        this.startMarker.column = this.scanner.index - this.scanner.lineStart;
	        var token = this.lexJSX();
	        this.lastMarker.index = this.scanner.index;
	        this.lastMarker.line = this.scanner.lineNumber;
	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
	        if (this.config.tokens) {
	            this.tokens.push(this.convertToken(token));
	        }
	        return token;
	    };
	    JSXParser.prototype.nextJSXText = function () {
	        this.startMarker.index = this.scanner.index;
	        this.startMarker.line = this.scanner.lineNumber;
	        this.startMarker.column = this.scanner.index - this.scanner.lineStart;
	        var start = this.scanner.index;
	        var text = '';
	        while (!this.scanner.eof()) {
	            var ch = this.scanner.source[this.scanner.index];
	            if (ch === '{' || ch === '<') {
	                break;
	            }
	            ++this.scanner.index;
	            text += ch;
	            if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                ++this.scanner.lineNumber;
	                if (ch === '\r' && this.scanner.source[this.scanner.index] === '\n') {
	                    ++this.scanner.index;
	                }
	                this.scanner.lineStart = this.scanner.index;
	            }
	        }
	        this.lastMarker.index = this.scanner.index;
	        this.lastMarker.line = this.scanner.lineNumber;
	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
	        var token = {
	            type: 101 /* Text */,
	            value: text,
	            lineNumber: this.scanner.lineNumber,
	            lineStart: this.scanner.lineStart,
	            start: start,
	            end: this.scanner.index
	        };
	        if ((text.length > 0) && this.config.tokens) {
	            this.tokens.push(this.convertToken(token));
	        }
	        return token;
	    };
	    JSXParser.prototype.peekJSXToken = function () {
	        var state = this.scanner.saveState();
	        this.scanner.scanComments();
	        var next = this.lexJSX();
	        this.scanner.restoreState(state);
	        return next;
	    };
	    // Expect the next JSX token to match the specified punctuator.
	    // If not, an exception will be thrown.
	    JSXParser.prototype.expectJSX = function (value) {
	        var token = this.nextJSXToken();
	        if (token.type !== 7 /* Punctuator */ || token.value !== value) {
	            this.throwUnexpectedToken(token);
	        }
	    };
	    // Return true if the next JSX token matches the specified punctuator.
	    JSXParser.prototype.matchJSX = function (value) {
	        var next = this.peekJSXToken();
	        return next.type === 7 /* Punctuator */ && next.value === value;
	    };
	    JSXParser.prototype.parseJSXIdentifier = function () {
	        var node = this.createJSXNode();
	        var token = this.nextJSXToken();
	        if (token.type !== 100 /* Identifier */) {
	            this.throwUnexpectedToken(token);
	        }
	        return this.finalize(node, new JSXNode.JSXIdentifier(token.value));
	    };
	    JSXParser.prototype.parseJSXElementName = function () {
	        var node = this.createJSXNode();
	        var elementName = this.parseJSXIdentifier();
	        if (this.matchJSX(':')) {
	            var namespace = elementName;
	            this.expectJSX(':');
	            var name_1 = this.parseJSXIdentifier();
	            elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1));
	        }
	        else if (this.matchJSX('.')) {
	            while (this.matchJSX('.')) {
	                var object = elementName;
	                this.expectJSX('.');
	                var property = this.parseJSXIdentifier();
	                elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property));
	            }
	        }
	        return elementName;
	    };
	    JSXParser.prototype.parseJSXAttributeName = function () {
	        var node = this.createJSXNode();
	        var attributeName;
	        var identifier = this.parseJSXIdentifier();
	        if (this.matchJSX(':')) {
	            var namespace = identifier;
	            this.expectJSX(':');
	            var name_2 = this.parseJSXIdentifier();
	            attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2));
	        }
	        else {
	            attributeName = identifier;
	        }
	        return attributeName;
	    };
	    JSXParser.prototype.parseJSXStringLiteralAttribute = function () {
	        var node = this.createJSXNode();
	        var token = this.nextJSXToken();
	        if (token.type !== 8 /* StringLiteral */) {
	            this.throwUnexpectedToken(token);
	        }
	        var raw = this.getTokenRaw(token);
	        return this.finalize(node, new Node.Literal(token.value, raw));
	    };
	    JSXParser.prototype.parseJSXExpressionAttribute = function () {
	        var node = this.createJSXNode();
	        this.expectJSX('{');
	        this.finishJSX();
	        if (this.match('}')) {
	            this.tolerateError('JSX attributes must only be assigned a non-empty expression');
	        }
	        var expression = this.parseAssignmentExpression();
	        this.reenterJSX();
	        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
	    };
	    JSXParser.prototype.parseJSXAttributeValue = function () {
	        return this.matchJSX('{') ? this.parseJSXExpressionAttribute() :
	            this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute();
	    };
	    JSXParser.prototype.parseJSXNameValueAttribute = function () {
	        var node = this.createJSXNode();
	        var name = this.parseJSXAttributeName();
	        var value = null;
	        if (this.matchJSX('=')) {
	            this.expectJSX('=');
	            value = this.parseJSXAttributeValue();
	        }
	        return this.finalize(node, new JSXNode.JSXAttribute(name, value));
	    };
	    JSXParser.prototype.parseJSXSpreadAttribute = function () {
	        var node = this.createJSXNode();
	        this.expectJSX('{');
	        this.expectJSX('...');
	        this.finishJSX();
	        var argument = this.parseAssignmentExpression();
	        this.reenterJSX();
	        return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument));
	    };
	    JSXParser.prototype.parseJSXAttributes = function () {
	        var attributes = [];
	        while (!this.matchJSX('/') && !this.matchJSX('>')) {
	            var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() :
	                this.parseJSXNameValueAttribute();
	            attributes.push(attribute);
	        }
	        return attributes;
	    };
	    JSXParser.prototype.parseJSXOpeningElement = function () {
	        var node = this.createJSXNode();
	        this.expectJSX('<');
	        var name = this.parseJSXElementName();
	        var attributes = this.parseJSXAttributes();
	        var selfClosing = this.matchJSX('/');
	        if (selfClosing) {
	            this.expectJSX('/');
	        }
	        this.expectJSX('>');
	        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
	    };
	    JSXParser.prototype.parseJSXBoundaryElement = function () {
	        var node = this.createJSXNode();
	        this.expectJSX('<');
	        if (this.matchJSX('/')) {
	            this.expectJSX('/');
	            var name_3 = this.parseJSXElementName();
	            this.expectJSX('>');
	            return this.finalize(node, new JSXNode.JSXClosingElement(name_3));
	        }
	        var name = this.parseJSXElementName();
	        var attributes = this.parseJSXAttributes();
	        var selfClosing = this.matchJSX('/');
	        if (selfClosing) {
	            this.expectJSX('/');
	        }
	        this.expectJSX('>');
	        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));
	    };
	    JSXParser.prototype.parseJSXEmptyExpression = function () {
	        var node = this.createJSXChildNode();
	        this.collectComments();
	        this.lastMarker.index = this.scanner.index;
	        this.lastMarker.line = this.scanner.lineNumber;
	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
	        return this.finalize(node, new JSXNode.JSXEmptyExpression());
	    };
	    JSXParser.prototype.parseJSXExpressionContainer = function () {
	        var node = this.createJSXNode();
	        this.expectJSX('{');
	        var expression;
	        if (this.matchJSX('}')) {
	            expression = this.parseJSXEmptyExpression();
	            this.expectJSX('}');
	        }
	        else {
	            this.finishJSX();
	            expression = this.parseAssignmentExpression();
	            this.reenterJSX();
	        }
	        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));
	    };
	    JSXParser.prototype.parseJSXChildren = function () {
	        var children = [];
	        while (!this.scanner.eof()) {
	            var node = this.createJSXChildNode();
	            var token = this.nextJSXText();
	            if (token.start < token.end) {
	                var raw = this.getTokenRaw(token);
	                var child = this.finalize(node, new JSXNode.JSXText(token.value, raw));
	                children.push(child);
	            }
	            if (this.scanner.source[this.scanner.index] === '{') {
	                var container = this.parseJSXExpressionContainer();
	                children.push(container);
	            }
	            else {
	                break;
	            }
	        }
	        return children;
	    };
	    JSXParser.prototype.parseComplexJSXElement = function (el) {
	        var stack = [];
	        while (!this.scanner.eof()) {
	            el.children = el.children.concat(this.parseJSXChildren());
	            var node = this.createJSXChildNode();
	            var element = this.parseJSXBoundaryElement();
	            if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) {
	                var opening = element;
	                if (opening.selfClosing) {
	                    var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null));
	                    el.children.push(child);
	                }
	                else {
	                    stack.push(el);
	                    el = { node: node, opening: opening, closing: null, children: [] };
	                }
	            }
	            if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) {
	                el.closing = element;
	                var open_1 = getQualifiedElementName(el.opening.name);
	                var close_1 = getQualifiedElementName(el.closing.name);
	                if (open_1 !== close_1) {
	                    this.tolerateError('Expected corresponding JSX closing tag for %0', open_1);
	                }
	                if (stack.length > 0) {
	                    var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing));
	                    el = stack[stack.length - 1];
	                    el.children.push(child);
	                    stack.pop();
	                }
	                else {
	                    break;
	                }
	            }
	        }
	        return el;
	    };
	    JSXParser.prototype.parseJSXElement = function () {
	        var node = this.createJSXNode();
	        var opening = this.parseJSXOpeningElement();
	        var children = [];
	        var closing = null;
	        if (!opening.selfClosing) {
	            var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children });
	            children = el.children;
	            closing = el.closing;
	        }
	        return this.finalize(node, new JSXNode.JSXElement(opening, children, closing));
	    };
	    JSXParser.prototype.parseJSXRoot = function () {
	        // Pop the opening '<' added from the lookahead.
	        if (this.config.tokens) {
	            this.tokens.pop();
	        }
	        this.startJSX();
	        var element = this.parseJSXElement();
	        this.finishJSX();
	        return element;
	    };
	    JSXParser.prototype.isStartOfExpression = function () {
	        return _super.prototype.isStartOfExpression.call(this) || this.match('<');
	    };
	    return JSXParser;
	}(parser_1.Parser));
	exports.JSXParser = JSXParser;


/***/ },
/* 4 */
/***/ function(module, exports) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	// See also tools/generate-unicode-regex.js.
	var Regex = {
	    // Unicode v8.0.0 NonAsciiIdentifierStart:
	    NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,
	    // Unicode v8.0.0 NonAsciiIdentifierPart:
	    NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
	};
	exports.Character = {
	    /* tslint:disable:no-bitwise */
	    fromCodePoint: function (cp) {
	        return (cp < 0x10000) ? String.fromCharCode(cp) :
	            String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) +
	                String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023));
	    },
	    // https://tc39.github.io/ecma262/#sec-white-space
	    isWhiteSpace: function (cp) {
	        return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) ||
	            (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0);
	    },
	    // https://tc39.github.io/ecma262/#sec-line-terminators
	    isLineTerminator: function (cp) {
	        return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029);
	    },
	    // https://tc39.github.io/ecma262/#sec-names-and-keywords
	    isIdentifierStart: function (cp) {
	        return (cp === 0x24) || (cp === 0x5F) ||
	            (cp >= 0x41 && cp <= 0x5A) ||
	            (cp >= 0x61 && cp <= 0x7A) ||
	            (cp === 0x5C) ||
	            ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp)));
	    },
	    isIdentifierPart: function (cp) {
	        return (cp === 0x24) || (cp === 0x5F) ||
	            (cp >= 0x41 && cp <= 0x5A) ||
	            (cp >= 0x61 && cp <= 0x7A) ||
	            (cp >= 0x30 && cp <= 0x39) ||
	            (cp === 0x5C) ||
	            ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp)));
	    },
	    // https://tc39.github.io/ecma262/#sec-literals-numeric-literals
	    isDecimalDigit: function (cp) {
	        return (cp >= 0x30 && cp <= 0x39); // 0..9
	    },
	    isHexDigit: function (cp) {
	        return (cp >= 0x30 && cp <= 0x39) ||
	            (cp >= 0x41 && cp <= 0x46) ||
	            (cp >= 0x61 && cp <= 0x66); // a..f
	    },
	    isOctalDigit: function (cp) {
	        return (cp >= 0x30 && cp <= 0x37); // 0..7
	    }
	};


/***/ },
/* 5 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	var jsx_syntax_1 = __webpack_require__(6);
	/* tslint:disable:max-classes-per-file */
	var JSXClosingElement = (function () {
	    function JSXClosingElement(name) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement;
	        this.name = name;
	    }
	    return JSXClosingElement;
	}());
	exports.JSXClosingElement = JSXClosingElement;
	var JSXElement = (function () {
	    function JSXElement(openingElement, children, closingElement) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXElement;
	        this.openingElement = openingElement;
	        this.children = children;
	        this.closingElement = closingElement;
	    }
	    return JSXElement;
	}());
	exports.JSXElement = JSXElement;
	var JSXEmptyExpression = (function () {
	    function JSXEmptyExpression() {
	        this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression;
	    }
	    return JSXEmptyExpression;
	}());
	exports.JSXEmptyExpression = JSXEmptyExpression;
	var JSXExpressionContainer = (function () {
	    function JSXExpressionContainer(expression) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer;
	        this.expression = expression;
	    }
	    return JSXExpressionContainer;
	}());
	exports.JSXExpressionContainer = JSXExpressionContainer;
	var JSXIdentifier = (function () {
	    function JSXIdentifier(name) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier;
	        this.name = name;
	    }
	    return JSXIdentifier;
	}());
	exports.JSXIdentifier = JSXIdentifier;
	var JSXMemberExpression = (function () {
	    function JSXMemberExpression(object, property) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression;
	        this.object = object;
	        this.property = property;
	    }
	    return JSXMemberExpression;
	}());
	exports.JSXMemberExpression = JSXMemberExpression;
	var JSXAttribute = (function () {
	    function JSXAttribute(name, value) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXAttribute;
	        this.name = name;
	        this.value = value;
	    }
	    return JSXAttribute;
	}());
	exports.JSXAttribute = JSXAttribute;
	var JSXNamespacedName = (function () {
	    function JSXNamespacedName(namespace, name) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName;
	        this.namespace = namespace;
	        this.name = name;
	    }
	    return JSXNamespacedName;
	}());
	exports.JSXNamespacedName = JSXNamespacedName;
	var JSXOpeningElement = (function () {
	    function JSXOpeningElement(name, selfClosing, attributes) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement;
	        this.name = name;
	        this.selfClosing = selfClosing;
	        this.attributes = attributes;
	    }
	    return JSXOpeningElement;
	}());
	exports.JSXOpeningElement = JSXOpeningElement;
	var JSXSpreadAttribute = (function () {
	    function JSXSpreadAttribute(argument) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute;
	        this.argument = argument;
	    }
	    return JSXSpreadAttribute;
	}());
	exports.JSXSpreadAttribute = JSXSpreadAttribute;
	var JSXText = (function () {
	    function JSXText(value, raw) {
	        this.type = jsx_syntax_1.JSXSyntax.JSXText;
	        this.value = value;
	        this.raw = raw;
	    }
	    return JSXText;
	}());
	exports.JSXText = JSXText;


/***/ },
/* 6 */
/***/ function(module, exports) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	exports.JSXSyntax = {
	    JSXAttribute: 'JSXAttribute',
	    JSXClosingElement: 'JSXClosingElement',
	    JSXElement: 'JSXElement',
	    JSXEmptyExpression: 'JSXEmptyExpression',
	    JSXExpressionContainer: 'JSXExpressionContainer',
	    JSXIdentifier: 'JSXIdentifier',
	    JSXMemberExpression: 'JSXMemberExpression',
	    JSXNamespacedName: 'JSXNamespacedName',
	    JSXOpeningElement: 'JSXOpeningElement',
	    JSXSpreadAttribute: 'JSXSpreadAttribute',
	    JSXText: 'JSXText'
	};


/***/ },
/* 7 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	var syntax_1 = __webpack_require__(2);
	/* tslint:disable:max-classes-per-file */
	var ArrayExpression = (function () {
	    function ArrayExpression(elements) {
	        this.type = syntax_1.Syntax.ArrayExpression;
	        this.elements = elements;
	    }
	    return ArrayExpression;
	}());
	exports.ArrayExpression = ArrayExpression;
	var ArrayPattern = (function () {
	    function ArrayPattern(elements) {
	        this.type = syntax_1.Syntax.ArrayPattern;
	        this.elements = elements;
	    }
	    return ArrayPattern;
	}());
	exports.ArrayPattern = ArrayPattern;
	var ArrowFunctionExpression = (function () {
	    function ArrowFunctionExpression(params, body, expression) {
	        this.type = syntax_1.Syntax.ArrowFunctionExpression;
	        this.id = null;
	        this.params = params;
	        this.body = body;
	        this.generator = false;
	        this.expression = expression;
	        this.async = false;
	    }
	    return ArrowFunctionExpression;
	}());
	exports.ArrowFunctionExpression = ArrowFunctionExpression;
	var AssignmentExpression = (function () {
	    function AssignmentExpression(operator, left, right) {
	        this.type = syntax_1.Syntax.AssignmentExpression;
	        this.operator = operator;
	        this.left = left;
	        this.right = right;
	    }
	    return AssignmentExpression;
	}());
	exports.AssignmentExpression = AssignmentExpression;
	var AssignmentPattern = (function () {
	    function AssignmentPattern(left, right) {
	        this.type = syntax_1.Syntax.AssignmentPattern;
	        this.left = left;
	        this.right = right;
	    }
	    return AssignmentPattern;
	}());
	exports.AssignmentPattern = AssignmentPattern;
	var AsyncArrowFunctionExpression = (function () {
	    function AsyncArrowFunctionExpression(params, body, expression) {
	        this.type = syntax_1.Syntax.ArrowFunctionExpression;
	        this.id = null;
	        this.params = params;
	        this.body = body;
	        this.generator = false;
	        this.expression = expression;
	        this.async = true;
	    }
	    return AsyncArrowFunctionExpression;
	}());
	exports.AsyncArrowFunctionExpression = AsyncArrowFunctionExpression;
	var AsyncFunctionDeclaration = (function () {
	    function AsyncFunctionDeclaration(id, params, body) {
	        this.type = syntax_1.Syntax.FunctionDeclaration;
	        this.id = id;
	        this.params = params;
	        this.body = body;
	        this.generator = false;
	        this.expression = false;
	        this.async = true;
	    }
	    return AsyncFunctionDeclaration;
	}());
	exports.AsyncFunctionDeclaration = AsyncFunctionDeclaration;
	var AsyncFunctionExpression = (function () {
	    function AsyncFunctionExpression(id, params, body) {
	        this.type = syntax_1.Syntax.FunctionExpression;
	        this.id = id;
	        this.params = params;
	        this.body = body;
	        this.generator = false;
	        this.expression = false;
	        this.async = true;
	    }
	    return AsyncFunctionExpression;
	}());
	exports.AsyncFunctionExpression = AsyncFunctionExpression;
	var AwaitExpression = (function () {
	    function AwaitExpression(argument) {
	        this.type = syntax_1.Syntax.AwaitExpression;
	        this.argument = argument;
	    }
	    return AwaitExpression;
	}());
	exports.AwaitExpression = AwaitExpression;
	var BinaryExpression = (function () {
	    function BinaryExpression(operator, left, right) {
	        var logical = (operator === '||' || operator === '&&');
	        this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression;
	        this.operator = operator;
	        this.left = left;
	        this.right = right;
	    }
	    return BinaryExpression;
	}());
	exports.BinaryExpression = BinaryExpression;
	var BlockStatement = (function () {
	    function BlockStatement(body) {
	        this.type = syntax_1.Syntax.BlockStatement;
	        this.body = body;
	    }
	    return BlockStatement;
	}());
	exports.BlockStatement = BlockStatement;
	var BreakStatement = (function () {
	    function BreakStatement(label) {
	        this.type = syntax_1.Syntax.BreakStatement;
	        this.label = label;
	    }
	    return BreakStatement;
	}());
	exports.BreakStatement = BreakStatement;
	var CallExpression = (function () {
	    function CallExpression(callee, args) {
	        this.type = syntax_1.Syntax.CallExpression;
	        this.callee = callee;
	        this.arguments = args;
	    }
	    return CallExpression;
	}());
	exports.CallExpression = CallExpression;
	var CatchClause = (function () {
	    function CatchClause(param, body) {
	        this.type = syntax_1.Syntax.CatchClause;
	        this.param = param;
	        this.body = body;
	    }
	    return CatchClause;
	}());
	exports.CatchClause = CatchClause;
	var ClassBody = (function () {
	    function ClassBody(body) {
	        this.type = syntax_1.Syntax.ClassBody;
	        this.body = body;
	    }
	    return ClassBody;
	}());
	exports.ClassBody = ClassBody;
	var ClassDeclaration = (function () {
	    function ClassDeclaration(id, superClass, body) {
	        this.type = syntax_1.Syntax.ClassDeclaration;
	        this.id = id;
	        this.superClass = superClass;
	        this.body = body;
	    }
	    return ClassDeclaration;
	}());
	exports.ClassDeclaration = ClassDeclaration;
	var ClassExpression = (function () {
	    function ClassExpression(id, superClass, body) {
	        this.type = syntax_1.Syntax.ClassExpression;
	        this.id = id;
	        this.superClass = superClass;
	        this.body = body;
	    }
	    return ClassExpression;
	}());
	exports.ClassExpression = ClassExpression;
	var ComputedMemberExpression = (function () {
	    function ComputedMemberExpression(object, property) {
	        this.type = syntax_1.Syntax.MemberExpression;
	        this.computed = true;
	        this.object = object;
	        this.property = property;
	    }
	    return ComputedMemberExpression;
	}());
	exports.ComputedMemberExpression = ComputedMemberExpression;
	var ConditionalExpression = (function () {
	    function ConditionalExpression(test, consequent, alternate) {
	        this.type = syntax_1.Syntax.ConditionalExpression;
	        this.test = test;
	        this.consequent = consequent;
	        this.alternate = alternate;
	    }
	    return ConditionalExpression;
	}());
	exports.ConditionalExpression = ConditionalExpression;
	var ContinueStatement = (function () {
	    function ContinueStatement(label) {
	        this.type = syntax_1.Syntax.ContinueStatement;
	        this.label = label;
	    }
	    return ContinueStatement;
	}());
	exports.ContinueStatement = ContinueStatement;
	var DebuggerStatement = (function () {
	    function DebuggerStatement() {
	        this.type = syntax_1.Syntax.DebuggerStatement;
	    }
	    return DebuggerStatement;
	}());
	exports.DebuggerStatement = DebuggerStatement;
	var Directive = (function () {
	    function Directive(expression, directive) {
	        this.type = syntax_1.Syntax.ExpressionStatement;
	        this.expression = expression;
	        this.directive = directive;
	    }
	    return Directive;
	}());
	exports.Directive = Directive;
	var DoWhileStatement = (function () {
	    function DoWhileStatement(body, test) {
	        this.type = syntax_1.Syntax.DoWhileStatement;
	        this.body = body;
	        this.test = test;
	    }
	    return DoWhileStatement;
	}());
	exports.DoWhileStatement = DoWhileStatement;
	var EmptyStatement = (function () {
	    function EmptyStatement() {
	        this.type = syntax_1.Syntax.EmptyStatement;
	    }
	    return EmptyStatement;
	}());
	exports.EmptyStatement = EmptyStatement;
	var ExportAllDeclaration = (function () {
	    function ExportAllDeclaration(source) {
	        this.type = syntax_1.Syntax.ExportAllDeclaration;
	        this.source = source;
	    }
	    return ExportAllDeclaration;
	}());
	exports.ExportAllDeclaration = ExportAllDeclaration;
	var ExportDefaultDeclaration = (function () {
	    function ExportDefaultDeclaration(declaration) {
	        this.type = syntax_1.Syntax.ExportDefaultDeclaration;
	        this.declaration = declaration;
	    }
	    return ExportDefaultDeclaration;
	}());
	exports.ExportDefaultDeclaration = ExportDefaultDeclaration;
	var ExportNamedDeclaration = (function () {
	    function ExportNamedDeclaration(declaration, specifiers, source) {
	        this.type = syntax_1.Syntax.ExportNamedDeclaration;
	        this.declaration = declaration;
	        this.specifiers = specifiers;
	        this.source = source;
	    }
	    return ExportNamedDeclaration;
	}());
	exports.ExportNamedDeclaration = ExportNamedDeclaration;
	var ExportSpecifier = (function () {
	    function ExportSpecifier(local, exported) {
	        this.type = syntax_1.Syntax.ExportSpecifier;
	        this.exported = exported;
	        this.local = local;
	    }
	    return ExportSpecifier;
	}());
	exports.ExportSpecifier = ExportSpecifier;
	var ExpressionStatement = (function () {
	    function ExpressionStatement(expression) {
	        this.type = syntax_1.Syntax.ExpressionStatement;
	        this.expression = expression;
	    }
	    return ExpressionStatement;
	}());
	exports.ExpressionStatement = ExpressionStatement;
	var ForInStatement = (function () {
	    function ForInStatement(left, right, body) {
	        this.type = syntax_1.Syntax.ForInStatement;
	        this.left = left;
	        this.right = right;
	        this.body = body;
	        this.each = false;
	    }
	    return ForInStatement;
	}());
	exports.ForInStatement = ForInStatement;
	var ForOfStatement = (function () {
	    function ForOfStatement(left, right, body) {
	        this.type = syntax_1.Syntax.ForOfStatement;
	        this.left = left;
	        this.right = right;
	        this.body = body;
	    }
	    return ForOfStatement;
	}());
	exports.ForOfStatement = ForOfStatement;
	var ForStatement = (function () {
	    function ForStatement(init, test, update, body) {
	        this.type = syntax_1.Syntax.ForStatement;
	        this.init = init;
	        this.test = test;
	        this.update = update;
	        this.body = body;
	    }
	    return ForStatement;
	}());
	exports.ForStatement = ForStatement;
	var FunctionDeclaration = (function () {
	    function FunctionDeclaration(id, params, body, generator) {
	        this.type = syntax_1.Syntax.FunctionDeclaration;
	        this.id = id;
	        this.params = params;
	        this.body = body;
	        this.generator = generator;
	        this.expression = false;
	        this.async = false;
	    }
	    return FunctionDeclaration;
	}());
	exports.FunctionDeclaration = FunctionDeclaration;
	var FunctionExpression = (function () {
	    function FunctionExpression(id, params, body, generator) {
	        this.type = syntax_1.Syntax.FunctionExpression;
	        this.id = id;
	        this.params = params;
	        this.body = body;
	        this.generator = generator;
	        this.expression = false;
	        this.async = false;
	    }
	    return FunctionExpression;
	}());
	exports.FunctionExpression = FunctionExpression;
	var Identifier = (function () {
	    function Identifier(name) {
	        this.type = syntax_1.Syntax.Identifier;
	        this.name = name;
	    }
	    return Identifier;
	}());
	exports.Identifier = Identifier;
	var IfStatement = (function () {
	    function IfStatement(test, consequent, alternate) {
	        this.type = syntax_1.Syntax.IfStatement;
	        this.test = test;
	        this.consequent = consequent;
	        this.alternate = alternate;
	    }
	    return IfStatement;
	}());
	exports.IfStatement = IfStatement;
	var ImportDeclaration = (function () {
	    function ImportDeclaration(specifiers, source) {
	        this.type = syntax_1.Syntax.ImportDeclaration;
	        this.specifiers = specifiers;
	        this.source = source;
	    }
	    return ImportDeclaration;
	}());
	exports.ImportDeclaration = ImportDeclaration;
	var ImportDefaultSpecifier = (function () {
	    function ImportDefaultSpecifier(local) {
	        this.type = syntax_1.Syntax.ImportDefaultSpecifier;
	        this.local = local;
	    }
	    return ImportDefaultSpecifier;
	}());
	exports.ImportDefaultSpecifier = ImportDefaultSpecifier;
	var ImportNamespaceSpecifier = (function () {
	    function ImportNamespaceSpecifier(local) {
	        this.type = syntax_1.Syntax.ImportNamespaceSpecifier;
	        this.local = local;
	    }
	    return ImportNamespaceSpecifier;
	}());
	exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier;
	var ImportSpecifier = (function () {
	    function ImportSpecifier(local, imported) {
	        this.type = syntax_1.Syntax.ImportSpecifier;
	        this.local = local;
	        this.imported = imported;
	    }
	    return ImportSpecifier;
	}());
	exports.ImportSpecifier = ImportSpecifier;
	var LabeledStatement = (function () {
	    function LabeledStatement(label, body) {
	        this.type = syntax_1.Syntax.LabeledStatement;
	        this.label = label;
	        this.body = body;
	    }
	    return LabeledStatement;
	}());
	exports.LabeledStatement = LabeledStatement;
	var Literal = (function () {
	    function Literal(value, raw) {
	        this.type = syntax_1.Syntax.Literal;
	        this.value = value;
	        this.raw = raw;
	    }
	    return Literal;
	}());
	exports.Literal = Literal;
	var MetaProperty = (function () {
	    function MetaProperty(meta, property) {
	        this.type = syntax_1.Syntax.MetaProperty;
	        this.meta = meta;
	        this.property = property;
	    }
	    return MetaProperty;
	}());
	exports.MetaProperty = MetaProperty;
	var MethodDefinition = (function () {
	    function MethodDefinition(key, computed, value, kind, isStatic) {
	        this.type = syntax_1.Syntax.MethodDefinition;
	        this.key = key;
	        this.computed = computed;
	        this.value = value;
	        this.kind = kind;
	        this.static = isStatic;
	    }
	    return MethodDefinition;
	}());
	exports.MethodDefinition = MethodDefinition;
	var Module = (function () {
	    function Module(body) {
	        this.type = syntax_1.Syntax.Program;
	        this.body = body;
	        this.sourceType = 'module';
	    }
	    return Module;
	}());
	exports.Module = Module;
	var NewExpression = (function () {
	    function NewExpression(callee, args) {
	        this.type = syntax_1.Syntax.NewExpression;
	        this.callee = callee;
	        this.arguments = args;
	    }
	    return NewExpression;
	}());
	exports.NewExpression = NewExpression;
	var ObjectExpression = (function () {
	    function ObjectExpression(properties) {
	        this.type = syntax_1.Syntax.ObjectExpression;
	        this.properties = properties;
	    }
	    return ObjectExpression;
	}());
	exports.ObjectExpression = ObjectExpression;
	var ObjectPattern = (function () {
	    function ObjectPattern(properties) {
	        this.type = syntax_1.Syntax.ObjectPattern;
	        this.properties = properties;
	    }
	    return ObjectPattern;
	}());
	exports.ObjectPattern = ObjectPattern;
	var Property = (function () {
	    function Property(kind, key, computed, value, method, shorthand) {
	        this.type = syntax_1.Syntax.Property;
	        this.key = key;
	        this.computed = computed;
	        this.value = value;
	        this.kind = kind;
	        this.method = method;
	        this.shorthand = shorthand;
	    }
	    return Property;
	}());
	exports.Property = Property;
	var RegexLiteral = (function () {
	    function RegexLiteral(value, raw, pattern, flags) {
	        this.type = syntax_1.Syntax.Literal;
	        this.value = value;
	        this.raw = raw;
	        this.regex = { pattern: pattern, flags: flags };
	    }
	    return RegexLiteral;
	}());
	exports.RegexLiteral = RegexLiteral;
	var RestElement = (function () {
	    function RestElement(argument) {
	        this.type = syntax_1.Syntax.RestElement;
	        this.argument = argument;
	    }
	    return RestElement;
	}());
	exports.RestElement = RestElement;
	var ReturnStatement = (function () {
	    function ReturnStatement(argument) {
	        this.type = syntax_1.Syntax.ReturnStatement;
	        this.argument = argument;
	    }
	    return ReturnStatement;
	}());
	exports.ReturnStatement = ReturnStatement;
	var Script = (function () {
	    function Script(body) {
	        this.type = syntax_1.Syntax.Program;
	        this.body = body;
	        this.sourceType = 'script';
	    }
	    return Script;
	}());
	exports.Script = Script;
	var SequenceExpression = (function () {
	    function SequenceExpression(expressions) {
	        this.type = syntax_1.Syntax.SequenceExpression;
	        this.expressions = expressions;
	    }
	    return SequenceExpression;
	}());
	exports.SequenceExpression = SequenceExpression;
	var SpreadElement = (function () {
	    function SpreadElement(argument) {
	        this.type = syntax_1.Syntax.SpreadElement;
	        this.argument = argument;
	    }
	    return SpreadElement;
	}());
	exports.SpreadElement = SpreadElement;
	var StaticMemberExpression = (function () {
	    function StaticMemberExpression(object, property) {
	        this.type = syntax_1.Syntax.MemberExpression;
	        this.computed = false;
	        this.object = object;
	        this.property = property;
	    }
	    return StaticMemberExpression;
	}());
	exports.StaticMemberExpression = StaticMemberExpression;
	var Super = (function () {
	    function Super() {
	        this.type = syntax_1.Syntax.Super;
	    }
	    return Super;
	}());
	exports.Super = Super;
	var SwitchCase = (function () {
	    function SwitchCase(test, consequent) {
	        this.type = syntax_1.Syntax.SwitchCase;
	        this.test = test;
	        this.consequent = consequent;
	    }
	    return SwitchCase;
	}());
	exports.SwitchCase = SwitchCase;
	var SwitchStatement = (function () {
	    function SwitchStatement(discriminant, cases) {
	        this.type = syntax_1.Syntax.SwitchStatement;
	        this.discriminant = discriminant;
	        this.cases = cases;
	    }
	    return SwitchStatement;
	}());
	exports.SwitchStatement = SwitchStatement;
	var TaggedTemplateExpression = (function () {
	    function TaggedTemplateExpression(tag, quasi) {
	        this.type = syntax_1.Syntax.TaggedTemplateExpression;
	        this.tag = tag;
	        this.quasi = quasi;
	    }
	    return TaggedTemplateExpression;
	}());
	exports.TaggedTemplateExpression = TaggedTemplateExpression;
	var TemplateElement = (function () {
	    function TemplateElement(value, tail) {
	        this.type = syntax_1.Syntax.TemplateElement;
	        this.value = value;
	        this.tail = tail;
	    }
	    return TemplateElement;
	}());
	exports.TemplateElement = TemplateElement;
	var TemplateLiteral = (function () {
	    function TemplateLiteral(quasis, expressions) {
	        this.type = syntax_1.Syntax.TemplateLiteral;
	        this.quasis = quasis;
	        this.expressions = expressions;
	    }
	    return TemplateLiteral;
	}());
	exports.TemplateLiteral = TemplateLiteral;
	var ThisExpression = (function () {
	    function ThisExpression() {
	        this.type = syntax_1.Syntax.ThisExpression;
	    }
	    return ThisExpression;
	}());
	exports.ThisExpression = ThisExpression;
	var ThrowStatement = (function () {
	    function ThrowStatement(argument) {
	        this.type = syntax_1.Syntax.ThrowStatement;
	        this.argument = argument;
	    }
	    return ThrowStatement;
	}());
	exports.ThrowStatement = ThrowStatement;
	var TryStatement = (function () {
	    function TryStatement(block, handler, finalizer) {
	        this.type = syntax_1.Syntax.TryStatement;
	        this.block = block;
	        this.handler = handler;
	        this.finalizer = finalizer;
	    }
	    return TryStatement;
	}());
	exports.TryStatement = TryStatement;
	var UnaryExpression = (function () {
	    function UnaryExpression(operator, argument) {
	        this.type = syntax_1.Syntax.UnaryExpression;
	        this.operator = operator;
	        this.argument = argument;
	        this.prefix = true;
	    }
	    return UnaryExpression;
	}());
	exports.UnaryExpression = UnaryExpression;
	var UpdateExpression = (function () {
	    function UpdateExpression(operator, argument, prefix) {
	        this.type = syntax_1.Syntax.UpdateExpression;
	        this.operator = operator;
	        this.argument = argument;
	        this.prefix = prefix;
	    }
	    return UpdateExpression;
	}());
	exports.UpdateExpression = UpdateExpression;
	var VariableDeclaration = (function () {
	    function VariableDeclaration(declarations, kind) {
	        this.type = syntax_1.Syntax.VariableDeclaration;
	        this.declarations = declarations;
	        this.kind = kind;
	    }
	    return VariableDeclaration;
	}());
	exports.VariableDeclaration = VariableDeclaration;
	var VariableDeclarator = (function () {
	    function VariableDeclarator(id, init) {
	        this.type = syntax_1.Syntax.VariableDeclarator;
	        this.id = id;
	        this.init = init;
	    }
	    return VariableDeclarator;
	}());
	exports.VariableDeclarator = VariableDeclarator;
	var WhileStatement = (function () {
	    function WhileStatement(test, body) {
	        this.type = syntax_1.Syntax.WhileStatement;
	        this.test = test;
	        this.body = body;
	    }
	    return WhileStatement;
	}());
	exports.WhileStatement = WhileStatement;
	var WithStatement = (function () {
	    function WithStatement(object, body) {
	        this.type = syntax_1.Syntax.WithStatement;
	        this.object = object;
	        this.body = body;
	    }
	    return WithStatement;
	}());
	exports.WithStatement = WithStatement;
	var YieldExpression = (function () {
	    function YieldExpression(argument, delegate) {
	        this.type = syntax_1.Syntax.YieldExpression;
	        this.argument = argument;
	        this.delegate = delegate;
	    }
	    return YieldExpression;
	}());
	exports.YieldExpression = YieldExpression;


/***/ },
/* 8 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	var assert_1 = __webpack_require__(9);
	var error_handler_1 = __webpack_require__(10);
	var messages_1 = __webpack_require__(11);
	var Node = __webpack_require__(7);
	var scanner_1 = __webpack_require__(12);
	var syntax_1 = __webpack_require__(2);
	var token_1 = __webpack_require__(13);
	var ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder';
	var Parser = (function () {
	    function Parser(code, options, delegate) {
	        if (options === void 0) { options = {}; }
	        this.config = {
	            range: (typeof options.range === 'boolean') && options.range,
	            loc: (typeof options.loc === 'boolean') && options.loc,
	            source: null,
	            tokens: (typeof options.tokens === 'boolean') && options.tokens,
	            comment: (typeof options.comment === 'boolean') && options.comment,
	            tolerant: (typeof options.tolerant === 'boolean') && options.tolerant
	        };
	        if (this.config.loc && options.source && options.source !== null) {
	            this.config.source = String(options.source);
	        }
	        this.delegate = delegate;
	        this.errorHandler = new error_handler_1.ErrorHandler();
	        this.errorHandler.tolerant = this.config.tolerant;
	        this.scanner = new scanner_1.Scanner(code, this.errorHandler);
	        this.scanner.trackComment = this.config.comment;
	        this.operatorPrecedence = {
	            ')': 0,
	            ';': 0,
	            ',': 0,
	            '=': 0,
	            ']': 0,
	            '||': 1,
	            '&&': 2,
	            '|': 3,
	            '^': 4,
	            '&': 5,
	            '==': 6,
	            '!=': 6,
	            '===': 6,
	            '!==': 6,
	            '<': 7,
	            '>': 7,
	            '<=': 7,
	            '>=': 7,
	            '<<': 8,
	            '>>': 8,
	            '>>>': 8,
	            '+': 9,
	            '-': 9,
	            '*': 11,
	            '/': 11,
	            '%': 11
	        };
	        this.lookahead = {
	            type: 2 /* EOF */,
	            value: '',
	            lineNumber: this.scanner.lineNumber,
	            lineStart: 0,
	            start: 0,
	            end: 0
	        };
	        this.hasLineTerminator = false;
	        this.context = {
	            isModule: false,
	            await: false,
	            allowIn: true,
	            allowStrictDirective: true,
	            allowYield: true,
	            firstCoverInitializedNameError: null,
	            isAssignmentTarget: false,
	            isBindingElement: false,
	            inFunctionBody: false,
	            inIteration: false,
	            inSwitch: false,
	            labelSet: {},
	            strict: false
	        };
	        this.tokens = [];
	        this.startMarker = {
	            index: 0,
	            line: this.scanner.lineNumber,
	            column: 0
	        };
	        this.lastMarker = {
	            index: 0,
	            line: this.scanner.lineNumber,
	            column: 0
	        };
	        this.nextToken();
	        this.lastMarker = {
	            index: this.scanner.index,
	            line: this.scanner.lineNumber,
	            column: this.scanner.index - this.scanner.lineStart
	        };
	    }
	    Parser.prototype.throwError = function (messageFormat) {
	        var values = [];
	        for (var _i = 1; _i < arguments.length; _i++) {
	            values[_i - 1] = arguments[_i];
	        }
	        var args = Array.prototype.slice.call(arguments, 1);
	        var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
	            assert_1.assert(idx < args.length, 'Message reference must be in range');
	            return args[idx];
	        });
	        var index = this.lastMarker.index;
	        var line = this.lastMarker.line;
	        var column = this.lastMarker.column + 1;
	        throw this.errorHandler.createError(index, line, column, msg);
	    };
	    Parser.prototype.tolerateError = function (messageFormat) {
	        var values = [];
	        for (var _i = 1; _i < arguments.length; _i++) {
	            values[_i - 1] = arguments[_i];
	        }
	        var args = Array.prototype.slice.call(arguments, 1);
	        var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) {
	            assert_1.assert(idx < args.length, 'Message reference must be in range');
	            return args[idx];
	        });
	        var index = this.lastMarker.index;
	        var line = this.scanner.lineNumber;
	        var column = this.lastMarker.column + 1;
	        this.errorHandler.tolerateError(index, line, column, msg);
	    };
	    // Throw an exception because of the token.
	    Parser.prototype.unexpectedTokenError = function (token, message) {
	        var msg = message || messages_1.Messages.UnexpectedToken;
	        var value;
	        if (token) {
	            if (!message) {
	                msg = (token.type === 2 /* EOF */) ? messages_1.Messages.UnexpectedEOS :
	                    (token.type === 3 /* Identifier */) ? messages_1.Messages.UnexpectedIdentifier :
	                        (token.type === 6 /* NumericLiteral */) ? messages_1.Messages.UnexpectedNumber :
	                            (token.type === 8 /* StringLiteral */) ? messages_1.Messages.UnexpectedString :
	                                (token.type === 10 /* Template */) ? messages_1.Messages.UnexpectedTemplate :
	                                    messages_1.Messages.UnexpectedToken;
	                if (token.type === 4 /* Keyword */) {
	                    if (this.scanner.isFutureReservedWord(token.value)) {
	                        msg = messages_1.Messages.UnexpectedReserved;
	                    }
	                    else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) {
	                        msg = messages_1.Messages.StrictReservedWord;
	                    }
	                }
	            }
	            value = token.value;
	        }
	        else {
	            value = 'ILLEGAL';
	        }
	        msg = msg.replace('%0', value);
	        if (token && typeof token.lineNumber === 'number') {
	            var index = token.start;
	            var line = token.lineNumber;
	            var lastMarkerLineStart = this.lastMarker.index - this.lastMarker.column;
	            var column = token.start - lastMarkerLineStart + 1;
	            return this.errorHandler.createError(index, line, column, msg);
	        }
	        else {
	            var index = this.lastMarker.index;
	            var line = this.lastMarker.line;
	            var column = this.lastMarker.column + 1;
	            return this.errorHandler.createError(index, line, column, msg);
	        }
	    };
	    Parser.prototype.throwUnexpectedToken = function (token, message) {
	        throw this.unexpectedTokenError(token, message);
	    };
	    Parser.prototype.tolerateUnexpectedToken = function (token, message) {
	        this.errorHandler.tolerate(this.unexpectedTokenError(token, message));
	    };
	    Parser.prototype.collectComments = function () {
	        if (!this.config.comment) {
	            this.scanner.scanComments();
	        }
	        else {
	            var comments = this.scanner.scanComments();
	            if (comments.length > 0 && this.delegate) {
	                for (var i = 0; i < comments.length; ++i) {
	                    var e = comments[i];
	                    var node = void 0;
	                    node = {
	                        type: e.multiLine ? 'BlockComment' : 'LineComment',
	                        value: this.scanner.source.slice(e.slice[0], e.slice[1])
	                    };
	                    if (this.config.range) {
	                        node.range = e.range;
	                    }
	                    if (this.config.loc) {
	                        node.loc = e.loc;
	                    }
	                    var metadata = {
	                        start: {
	                            line: e.loc.start.line,
	                            column: e.loc.start.column,
	                            offset: e.range[0]
	                        },
	                        end: {
	                            line: e.loc.end.line,
	                            column: e.loc.end.column,
	                            offset: e.range[1]
	                        }
	                    };
	                    this.delegate(node, metadata);
	                }
	            }
	        }
	    };
	    // From internal representation to an external structure
	    Parser.prototype.getTokenRaw = function (token) {
	        return this.scanner.source.slice(token.start, token.end);
	    };
	    Parser.prototype.convertToken = function (token) {
	        var t = {
	            type: token_1.TokenName[token.type],
	            value: this.getTokenRaw(token)
	        };
	        if (this.config.range) {
	            t.range = [token.start, token.end];
	        }
	        if (this.config.loc) {
	            t.loc = {
	                start: {
	                    line: this.startMarker.line,
	                    column: this.startMarker.column
	                },
	                end: {
	                    line: this.scanner.lineNumber,
	                    column: this.scanner.index - this.scanner.lineStart
	                }
	            };
	        }
	        if (token.type === 9 /* RegularExpression */) {
	            var pattern = token.pattern;
	            var flags = token.flags;
	            t.regex = { pattern: pattern, flags: flags };
	        }
	        return t;
	    };
	    Parser.prototype.nextToken = function () {
	        var token = this.lookahead;
	        this.lastMarker.index = this.scanner.index;
	        this.lastMarker.line = this.scanner.lineNumber;
	        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;
	        this.collectComments();
	        if (this.scanner.index !== this.startMarker.index) {
	            this.startMarker.index = this.scanner.index;
	            this.startMarker.line = this.scanner.lineNumber;
	            this.startMarker.column = this.scanner.index - this.scanner.lineStart;
	        }
	        var next = this.scanner.lex();
	        this.hasLineTerminator = (token.lineNumber !== next.lineNumber);
	        if (next && this.context.strict && next.type === 3 /* Identifier */) {
	            if (this.scanner.isStrictModeReservedWord(next.value)) {
	                next.type = 4 /* Keyword */;
	            }
	        }
	        this.lookahead = next;
	        if (this.config.tokens && next.type !== 2 /* EOF */) {
	            this.tokens.push(this.convertToken(next));
	        }
	        return token;
	    };
	    Parser.prototype.nextRegexToken = function () {
	        this.collectComments();
	        var token = this.scanner.scanRegExp();
	        if (this.config.tokens) {
	            // Pop the previous token, '/' or '/='
	            // This is added from the lookahead token.
	            this.tokens.pop();
	            this.tokens.push(this.convertToken(token));
	        }
	        // Prime the next lookahead.
	        this.lookahead = token;
	        this.nextToken();
	        return token;
	    };
	    Parser.prototype.createNode = function () {
	        return {
	            index: this.startMarker.index,
	            line: this.startMarker.line,
	            column: this.startMarker.column
	        };
	    };
	    Parser.prototype.startNode = function (token, lastLineStart) {
	        if (lastLineStart === void 0) { lastLineStart = 0; }
	        var column = token.start - token.lineStart;
	        var line = token.lineNumber;
	        if (column < 0) {
	            column += lastLineStart;
	            line--;
	        }
	        return {
	            index: token.start,
	            line: line,
	            column: column
	        };
	    };
	    Parser.prototype.finalize = function (marker, node) {
	        if (this.config.range) {
	            node.range = [marker.index, this.lastMarker.index];
	        }
	        if (this.config.loc) {
	            node.loc = {
	                start: {
	                    line: marker.line,
	                    column: marker.column,
	                },
	                end: {
	                    line: this.lastMarker.line,
	                    column: this.lastMarker.column
	                }
	            };
	            if (this.config.source) {
	                node.loc.source = this.config.source;
	            }
	        }
	        if (this.delegate) {
	            var metadata = {
	                start: {
	                    line: marker.line,
	                    column: marker.column,
	                    offset: marker.index
	                },
	                end: {
	                    line: this.lastMarker.line,
	                    column: this.lastMarker.column,
	                    offset: this.lastMarker.index
	                }
	            };
	            this.delegate(node, metadata);
	        }
	        return node;
	    };
	    // Expect the next token to match the specified punctuator.
	    // If not, an exception will be thrown.
	    Parser.prototype.expect = function (value) {
	        var token = this.nextToken();
	        if (token.type !== 7 /* Punctuator */ || token.value !== value) {
	            this.throwUnexpectedToken(token);
	        }
	    };
	    // Quietly expect a comma when in tolerant mode, otherwise delegates to expect().
	    Parser.prototype.expectCommaSeparator = function () {
	        if (this.config.tolerant) {
	            var token = this.lookahead;
	            if (token.type === 7 /* Punctuator */ && token.value === ',') {
	                this.nextToken();
	            }
	            else if (token.type === 7 /* Punctuator */ && token.value === ';') {
	                this.nextToken();
	                this.tolerateUnexpectedToken(token);
	            }
	            else {
	                this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken);
	            }
	        }
	        else {
	            this.expect(',');
	        }
	    };
	    // Expect the next token to match the specified keyword.
	    // If not, an exception will be thrown.
	    Parser.prototype.expectKeyword = function (keyword) {
	        var token = this.nextToken();
	        if (token.type !== 4 /* Keyword */ || token.value !== keyword) {
	            this.throwUnexpectedToken(token);
	        }
	    };
	    // Return true if the next token matches the specified punctuator.
	    Parser.prototype.match = function (value) {
	        return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value;
	    };
	    // Return true if the next token matches the specified keyword
	    Parser.prototype.matchKeyword = function (keyword) {
	        return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword;
	    };
	    // Return true if the next token matches the specified contextual keyword
	    // (where an identifier is sometimes a keyword depending on the context)
	    Parser.prototype.matchContextualKeyword = function (keyword) {
	        return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword;
	    };
	    // Return true if the next token is an assignment operator
	    Parser.prototype.matchAssign = function () {
	        if (this.lookahead.type !== 7 /* Punctuator */) {
	            return false;
	        }
	        var op = this.lookahead.value;
	        return op === '=' ||
	            op === '*=' ||
	            op === '**=' ||
	            op === '/=' ||
	            op === '%=' ||
	            op === '+=' ||
	            op === '-=' ||
	            op === '<<=' ||
	            op === '>>=' ||
	            op === '>>>=' ||
	            op === '&=' ||
	            op === '^=' ||
	            op === '|=';
	    };
	    // Cover grammar support.
	    //
	    // When an assignment expression position starts with an left parenthesis, the determination of the type
	    // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead)
	    // or the first comma. This situation also defers the determination of all the expressions nested in the pair.
	    //
	    // There are three productions that can be parsed in a parentheses pair that needs to be determined
	    // after the outermost pair is closed. They are:
	    //
	    //   1. AssignmentExpression
	    //   2. BindingElements
	    //   3. AssignmentTargets
	    //
	    // In order to avoid exponential backtracking, we use two flags to denote if the production can be
	    // binding element or assignment target.
	    //
	    // The three productions have the relationship:
	    //
	    //   BindingElements âŠ† AssignmentTargets âŠ† AssignmentExpression
	    //
	    // with a single exception that CoverInitializedName when used directly in an Expression, generates
	    // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the
	    // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair.
	    //
	    // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not
	    // effect the current flags. This means the production the parser parses is only used as an expression. Therefore
	    // the CoverInitializedName check is conducted.
	    //
	    // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates
	    // the flags outside of the parser. This means the production the parser parses is used as a part of a potential
	    // pattern. The CoverInitializedName check is deferred.
	    Parser.prototype.isolateCoverGrammar = function (parseFunction) {
	        var previousIsBindingElement = this.context.isBindingElement;
	        var previousIsAssignmentTarget = this.context.isAssignmentTarget;
	        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
	        this.context.isBindingElement = true;
	        this.context.isAssignmentTarget = true;
	        this.context.firstCoverInitializedNameError = null;
	        var result = parseFunction.call(this);
	        if (this.context.firstCoverInitializedNameError !== null) {
	            this.throwUnexpectedToken(this.context.firstCoverInitializedNameError);
	        }
	        this.context.isBindingElement = previousIsBindingElement;
	        this.context.isAssignmentTarget = previousIsAssignmentTarget;
	        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError;
	        return result;
	    };
	    Parser.prototype.inheritCoverGrammar = function (parseFunction) {
	        var previousIsBindingElement = this.context.isBindingElement;
	        var previousIsAssignmentTarget = this.context.isAssignmentTarget;
	        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;
	        this.context.isBindingElement = true;
	        this.context.isAssignmentTarget = true;
	        this.context.firstCoverInitializedNameError = null;
	        var result = parseFunction.call(this);
	        this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement;
	        this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget;
	        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError;
	        return result;
	    };
	    Parser.prototype.consumeSemicolon = function () {
	        if (this.match(';')) {
	            this.nextToken();
	        }
	        else if (!this.hasLineTerminator) {
	            if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) {
	                this.throwUnexpectedToken(this.lookahead);
	            }
	            this.lastMarker.index = this.startMarker.index;
	            this.lastMarker.line = this.startMarker.line;
	            this.lastMarker.column = this.startMarker.column;
	        }
	    };
	    // https://tc39.github.io/ecma262/#sec-primary-expression
	    Parser.prototype.parsePrimaryExpression = function () {
	        var node = this.createNode();
	        var expr;
	        var token, raw;
	        switch (this.lookahead.type) {
	            case 3 /* Identifier */:
	                if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') {
	                    this.tolerateUnexpectedToken(this.lookahead);
	                }
	                expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value));
	                break;
	            case 6 /* NumericLiteral */:
	            case 8 /* StringLiteral */:
	                if (this.context.strict && this.lookahead.octal) {
	                    this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral);
	                }
	                this.context.isAssignmentTarget = false;
	                this.context.isBindingElement = false;
	                token = this.nextToken();
	                raw = this.getTokenRaw(token);
	                expr = this.finalize(node, new Node.Literal(token.value, raw));
	                break;
	            case 1 /* BooleanLiteral */:
	                this.context.isAssignmentTarget = false;
	                this.context.isBindingElement = false;
	                token = this.nextToken();
	                raw = this.getTokenRaw(token);
	                expr = this.finalize(node, new Node.Literal(token.value === 'true', raw));
	                break;
	            case 5 /* NullLiteral */:
	                this.context.isAssignmentTarget = false;
	                this.context.isBindingElement = false;
	                token = this.nextToken();
	                raw = this.getTokenRaw(token);
	                expr = this.finalize(node, new Node.Literal(null, raw));
	                break;
	            case 10 /* Template */:
	                expr = this.parseTemplateLiteral();
	                break;
	            case 7 /* Punctuator */:
	                switch (this.lookahead.value) {
	                    case '(':
	                        this.context.isBindingElement = false;
	                        expr = this.inheritCoverGrammar(this.parseGroupExpression);
	                        break;
	                    case '[':
	                        expr = this.inheritCoverGrammar(this.parseArrayInitializer);
	                        break;
	                    case '{':
	                        expr = this.inheritCoverGrammar(this.parseObjectInitializer);
	                        break;
	                    case '/':
	                    case '/=':
	                        this.context.isAssignmentTarget = false;
	                        this.context.isBindingElement = false;
	                        this.scanner.index = this.startMarker.index;
	                        token = this.nextRegexToken();
	                        raw = this.getTokenRaw(token);
	                        expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags));
	                        break;
	                    default:
	                        expr = this.throwUnexpectedToken(this.nextToken());
	                }
	                break;
	            case 4 /* Keyword */:
	                if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) {
	                    expr = this.parseIdentifierName();
	                }
	                else if (!this.context.strict && this.matchKeyword('let')) {
	                    expr = this.finalize(node, new Node.Identifier(this.nextToken().value));
	                }
	                else {
	                    this.context.isAssignmentTarget = false;
	                    this.context.isBindingElement = false;
	                    if (this.matchKeyword('function')) {
	                        expr = this.parseFunctionExpression();
	                    }
	                    else if (this.matchKeyword('this')) {
	                        this.nextToken();
	                        expr = this.finalize(node, new Node.ThisExpression());
	                    }
	                    else if (this.matchKeyword('class')) {
	                        expr = this.parseClassExpression();
	                    }
	                    else {
	                        expr = this.throwUnexpectedToken(this.nextToken());
	                    }
	                }
	                break;
	            default:
	                expr = this.throwUnexpectedToken(this.nextToken());
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-array-initializer
	    Parser.prototype.parseSpreadElement = function () {
	        var node = this.createNode();
	        this.expect('...');
	        var arg = this.inheritCoverGrammar(this.parseAssignmentExpression);
	        return this.finalize(node, new Node.SpreadElement(arg));
	    };
	    Parser.prototype.parseArrayInitializer = function () {
	        var node = this.createNode();
	        var elements = [];
	        this.expect('[');
	        while (!this.match(']')) {
	            if (this.match(',')) {
	                this.nextToken();
	                elements.push(null);
	            }
	            else if (this.match('...')) {
	                var element = this.parseSpreadElement();
	                if (!this.match(']')) {
	                    this.context.isAssignmentTarget = false;
	                    this.context.isBindingElement = false;
	                    this.expect(',');
	                }
	                elements.push(element);
	            }
	            else {
	                elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
	                if (!this.match(']')) {
	                    this.expect(',');
	                }
	            }
	        }
	        this.expect(']');
	        return this.finalize(node, new Node.ArrayExpression(elements));
	    };
	    // https://tc39.github.io/ecma262/#sec-object-initializer
	    Parser.prototype.parsePropertyMethod = function (params) {
	        this.context.isAssignmentTarget = false;
	        this.context.isBindingElement = false;
	        var previousStrict = this.context.strict;
	        var previousAllowStrictDirective = this.context.allowStrictDirective;
	        this.context.allowStrictDirective = params.simple;
	        var body = this.isolateCoverGrammar(this.parseFunctionSourceElements);
	        if (this.context.strict && params.firstRestricted) {
	            this.tolerateUnexpectedToken(params.firstRestricted, params.message);
	        }
	        if (this.context.strict && params.stricted) {
	            this.tolerateUnexpectedToken(params.stricted, params.message);
	        }
	        this.context.strict = previousStrict;
	        this.context.allowStrictDirective = previousAllowStrictDirective;
	        return body;
	    };
	    Parser.prototype.parsePropertyMethodFunction = function () {
	        var isGenerator = false;
	        var node = this.createNode();
	        var previousAllowYield = this.context.allowYield;
	        this.context.allowYield = true;
	        var params = this.parseFormalParameters();
	        var method = this.parsePropertyMethod(params);
	        this.context.allowYield = previousAllowYield;
	        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
	    };
	    Parser.prototype.parsePropertyMethodAsyncFunction = function () {
	        var node = this.createNode();
	        var previousAllowYield = this.context.allowYield;
	        var previousAwait = this.context.await;
	        this.context.allowYield = false;
	        this.context.await = true;
	        var params = this.parseFormalParameters();
	        var method = this.parsePropertyMethod(params);
	        this.context.allowYield = previousAllowYield;
	        this.context.await = previousAwait;
	        return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method));
	    };
	    Parser.prototype.parseObjectPropertyKey = function () {
	        var node = this.createNode();
	        var token = this.nextToken();
	        var key;
	        switch (token.type) {
	            case 8 /* StringLiteral */:
	            case 6 /* NumericLiteral */:
	                if (this.context.strict && token.octal) {
	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral);
	                }
	                var raw = this.getTokenRaw(token);
	                key = this.finalize(node, new Node.Literal(token.value, raw));
	                break;
	            case 3 /* Identifier */:
	            case 1 /* BooleanLiteral */:
	            case 5 /* NullLiteral */:
	            case 4 /* Keyword */:
	                key = this.finalize(node, new Node.Identifier(token.value));
	                break;
	            case 7 /* Punctuator */:
	                if (token.value === '[') {
	                    key = this.isolateCoverGrammar(this.parseAssignmentExpression);
	                    this.expect(']');
	                }
	                else {
	                    key = this.throwUnexpectedToken(token);
	                }
	                break;
	            default:
	                key = this.throwUnexpectedToken(token);
	        }
	        return key;
	    };
	    Parser.prototype.isPropertyKey = function (key, value) {
	        return (key.type === syntax_1.Syntax.Identifier && key.name === value) ||
	            (key.type === syntax_1.Syntax.Literal && key.value === value);
	    };
	    Parser.prototype.parseObjectProperty = function (hasProto) {
	        var node = this.createNode();
	        var token = this.lookahead;
	        var kind;
	        var key = null;
	        var value = null;
	        var computed = false;
	        var method = false;
	        var shorthand = false;
	        var isAsync = false;
	        if (token.type === 3 /* Identifier */) {
	            var id = token.value;
	            this.nextToken();
	            computed = this.match('[');
	            isAsync = !this.hasLineTerminator && (id === 'async') &&
	                !this.match(':') && !this.match('(') && !this.match('*') && !this.match(',');
	            key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id));
	        }
	        else if (this.match('*')) {
	            this.nextToken();
	        }
	        else {
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	        }
	        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
	        if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) {
	            kind = 'get';
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	            this.context.allowYield = false;
	            value = this.parseGetterMethod();
	        }
	        else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) {
	            kind = 'set';
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	            value = this.parseSetterMethod();
	        }
	        else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
	            kind = 'init';
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	            value = this.parseGeneratorMethod();
	            method = true;
	        }
	        else {
	            if (!key) {
	                this.throwUnexpectedToken(this.lookahead);
	            }
	            kind = 'init';
	            if (this.match(':') && !isAsync) {
	                if (!computed && this.isPropertyKey(key, '__proto__')) {
	                    if (hasProto.value) {
	                        this.tolerateError(messages_1.Messages.DuplicateProtoProperty);
	                    }
	                    hasProto.value = true;
	                }
	                this.nextToken();
	                value = this.inheritCoverGrammar(this.parseAssignmentExpression);
	            }
	            else if (this.match('(')) {
	                value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
	                method = true;
	            }
	            else if (token.type === 3 /* Identifier */) {
	                var id = this.finalize(node, new Node.Identifier(token.value));
	                if (this.match('=')) {
	                    this.context.firstCoverInitializedNameError = this.lookahead;
	                    this.nextToken();
	                    shorthand = true;
	                    var init = this.isolateCoverGrammar(this.parseAssignmentExpression);
	                    value = this.finalize(node, new Node.AssignmentPattern(id, init));
	                }
	                else {
	                    shorthand = true;
	                    value = id;
	                }
	            }
	            else {
	                this.throwUnexpectedToken(this.nextToken());
	            }
	        }
	        return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand));
	    };
	    Parser.prototype.parseObjectInitializer = function () {
	        var node = this.createNode();
	        this.expect('{');
	        var properties = [];
	        var hasProto = { value: false };
	        while (!this.match('}')) {
	            properties.push(this.parseObjectProperty(hasProto));
	            if (!this.match('}')) {
	                this.expectCommaSeparator();
	            }
	        }
	        this.expect('}');
	        return this.finalize(node, new Node.ObjectExpression(properties));
	    };
	    // https://tc39.github.io/ecma262/#sec-template-literals
	    Parser.prototype.parseTemplateHead = function () {
	        assert_1.assert(this.lookahead.head, 'Template literal must start with a template head');
	        var node = this.createNode();
	        var token = this.nextToken();
	        var raw = token.value;
	        var cooked = token.cooked;
	        return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
	    };
	    Parser.prototype.parseTemplateElement = function () {
	        if (this.lookahead.type !== 10 /* Template */) {
	            this.throwUnexpectedToken();
	        }
	        var node = this.createNode();
	        var token = this.nextToken();
	        var raw = token.value;
	        var cooked = token.cooked;
	        return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));
	    };
	    Parser.prototype.parseTemplateLiteral = function () {
	        var node = this.createNode();
	        var expressions = [];
	        var quasis = [];
	        var quasi = this.parseTemplateHead();
	        quasis.push(quasi);
	        while (!quasi.tail) {
	            expressions.push(this.parseExpression());
	            quasi = this.parseTemplateElement();
	            quasis.push(quasi);
	        }
	        return this.finalize(node, new Node.TemplateLiteral(quasis, expressions));
	    };
	    // https://tc39.github.io/ecma262/#sec-grouping-operator
	    Parser.prototype.reinterpretExpressionAsPattern = function (expr) {
	        switch (expr.type) {
	            case syntax_1.Syntax.Identifier:
	            case syntax_1.Syntax.MemberExpression:
	            case syntax_1.Syntax.RestElement:
	            case syntax_1.Syntax.AssignmentPattern:
	                break;
	            case syntax_1.Syntax.SpreadElement:
	                expr.type = syntax_1.Syntax.RestElement;
	                this.reinterpretExpressionAsPattern(expr.argument);
	                break;
	            case syntax_1.Syntax.ArrayExpression:
	                expr.type = syntax_1.Syntax.ArrayPattern;
	                for (var i = 0; i < expr.elements.length; i++) {
	                    if (expr.elements[i] !== null) {
	                        this.reinterpretExpressionAsPattern(expr.elements[i]);
	                    }
	                }
	                break;
	            case syntax_1.Syntax.ObjectExpression:
	                expr.type = syntax_1.Syntax.ObjectPattern;
	                for (var i = 0; i < expr.properties.length; i++) {
	                    this.reinterpretExpressionAsPattern(expr.properties[i].value);
	                }
	                break;
	            case syntax_1.Syntax.AssignmentExpression:
	                expr.type = syntax_1.Syntax.AssignmentPattern;
	                delete expr.operator;
	                this.reinterpretExpressionAsPattern(expr.left);
	                break;
	            default:
	                // Allow other node type for tolerant parsing.
	                break;
	        }
	    };
	    Parser.prototype.parseGroupExpression = function () {
	        var expr;
	        this.expect('(');
	        if (this.match(')')) {
	            this.nextToken();
	            if (!this.match('=>')) {
	                this.expect('=>');
	            }
	            expr = {
	                type: ArrowParameterPlaceHolder,
	                params: [],
	                async: false
	            };
	        }
	        else {
	            var startToken = this.lookahead;
	            var params = [];
	            if (this.match('...')) {
	                expr = this.parseRestElement(params);
	                this.expect(')');
	                if (!this.match('=>')) {
	                    this.expect('=>');
	                }
	                expr = {
	                    type: ArrowParameterPlaceHolder,
	                    params: [expr],
	                    async: false
	                };
	            }
	            else {
	                var arrow = false;
	                this.context.isBindingElement = true;
	                expr = this.inheritCoverGrammar(this.parseAssignmentExpression);
	                if (this.match(',')) {
	                    var expressions = [];
	                    this.context.isAssignmentTarget = false;
	                    expressions.push(expr);
	                    while (this.lookahead.type !== 2 /* EOF */) {
	                        if (!this.match(',')) {
	                            break;
	                        }
	                        this.nextToken();
	                        if (this.match(')')) {
	                            this.nextToken();
	                            for (var i = 0; i < expressions.length; i++) {
	                                this.reinterpretExpressionAsPattern(expressions[i]);
	                            }
	                            arrow = true;
	                            expr = {
	                                type: ArrowParameterPlaceHolder,
	                                params: expressions,
	                                async: false
	                            };
	                        }
	                        else if (this.match('...')) {
	                            if (!this.context.isBindingElement) {
	                                this.throwUnexpectedToken(this.lookahead);
	                            }
	                            expressions.push(this.parseRestElement(params));
	                            this.expect(')');
	                            if (!this.match('=>')) {
	                                this.expect('=>');
	                            }
	                            this.context.isBindingElement = false;
	                            for (var i = 0; i < expressions.length; i++) {
	                                this.reinterpretExpressionAsPattern(expressions[i]);
	                            }
	                            arrow = true;
	                            expr = {
	                                type: ArrowParameterPlaceHolder,
	                                params: expressions,
	                                async: false
	                            };
	                        }
	                        else {
	                            expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression));
	                        }
	                        if (arrow) {
	                            break;
	                        }
	                    }
	                    if (!arrow) {
	                        expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
	                    }
	                }
	                if (!arrow) {
	                    this.expect(')');
	                    if (this.match('=>')) {
	                        if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') {
	                            arrow = true;
	                            expr = {
	                                type: ArrowParameterPlaceHolder,
	                                params: [expr],
	                                async: false
	                            };
	                        }
	                        if (!arrow) {
	                            if (!this.context.isBindingElement) {
	                                this.throwUnexpectedToken(this.lookahead);
	                            }
	                            if (expr.type === syntax_1.Syntax.SequenceExpression) {
	                                for (var i = 0; i < expr.expressions.length; i++) {
	                                    this.reinterpretExpressionAsPattern(expr.expressions[i]);
	                                }
	                            }
	                            else {
	                                this.reinterpretExpressionAsPattern(expr);
	                            }
	                            var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]);
	                            expr = {
	                                type: ArrowParameterPlaceHolder,
	                                params: parameters,
	                                async: false
	                            };
	                        }
	                    }
	                    this.context.isBindingElement = false;
	                }
	            }
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions
	    Parser.prototype.parseArguments = function () {
	        this.expect('(');
	        var args = [];
	        if (!this.match(')')) {
	            while (true) {
	                var expr = this.match('...') ? this.parseSpreadElement() :
	                    this.isolateCoverGrammar(this.parseAssignmentExpression);
	                args.push(expr);
	                if (this.match(')')) {
	                    break;
	                }
	                this.expectCommaSeparator();
	                if (this.match(')')) {
	                    break;
	                }
	            }
	        }
	        this.expect(')');
	        return args;
	    };
	    Parser.prototype.isIdentifierName = function (token) {
	        return token.type === 3 /* Identifier */ ||
	            token.type === 4 /* Keyword */ ||
	            token.type === 1 /* BooleanLiteral */ ||
	            token.type === 5 /* NullLiteral */;
	    };
	    Parser.prototype.parseIdentifierName = function () {
	        var node = this.createNode();
	        var token = this.nextToken();
	        if (!this.isIdentifierName(token)) {
	            this.throwUnexpectedToken(token);
	        }
	        return this.finalize(node, new Node.Identifier(token.value));
	    };
	    Parser.prototype.parseNewExpression = function () {
	        var node = this.createNode();
	        var id = this.parseIdentifierName();
	        assert_1.assert(id.name === 'new', 'New expression must start with `new`');
	        var expr;
	        if (this.match('.')) {
	            this.nextToken();
	            if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') {
	                var property = this.parseIdentifierName();
	                expr = new Node.MetaProperty(id, property);
	            }
	            else {
	                this.throwUnexpectedToken(this.lookahead);
	            }
	        }
	        else {
	            var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression);
	            var args = this.match('(') ? this.parseArguments() : [];
	            expr = new Node.NewExpression(callee, args);
	            this.context.isAssignmentTarget = false;
	            this.context.isBindingElement = false;
	        }
	        return this.finalize(node, expr);
	    };
	    Parser.prototype.parseAsyncArgument = function () {
	        var arg = this.parseAssignmentExpression();
	        this.context.firstCoverInitializedNameError = null;
	        return arg;
	    };
	    Parser.prototype.parseAsyncArguments = function () {
	        this.expect('(');
	        var args = [];
	        if (!this.match(')')) {
	            while (true) {
	                var expr = this.match('...') ? this.parseSpreadElement() :
	                    this.isolateCoverGrammar(this.parseAsyncArgument);
	                args.push(expr);
	                if (this.match(')')) {
	                    break;
	                }
	                this.expectCommaSeparator();
	                if (this.match(')')) {
	                    break;
	                }
	            }
	        }
	        this.expect(')');
	        return args;
	    };
	    Parser.prototype.parseLeftHandSideExpressionAllowCall = function () {
	        var startToken = this.lookahead;
	        var maybeAsync = this.matchContextualKeyword('async');
	        var previousAllowIn = this.context.allowIn;
	        this.context.allowIn = true;
	        var expr;
	        if (this.matchKeyword('super') && this.context.inFunctionBody) {
	            expr = this.createNode();
	            this.nextToken();
	            expr = this.finalize(expr, new Node.Super());
	            if (!this.match('(') && !this.match('.') && !this.match('[')) {
	                this.throwUnexpectedToken(this.lookahead);
	            }
	        }
	        else {
	            expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
	        }
	        while (true) {
	            if (this.match('.')) {
	                this.context.isBindingElement = false;
	                this.context.isAssignmentTarget = true;
	                this.expect('.');
	                var property = this.parseIdentifierName();
	                expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property));
	            }
	            else if (this.match('(')) {
	                var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber);
	                this.context.isBindingElement = false;
	                this.context.isAssignmentTarget = false;
	                var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments();
	                expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args));
	                if (asyncArrow && this.match('=>')) {
	                    for (var i = 0; i < args.length; ++i) {
	                        this.reinterpretExpressionAsPattern(args[i]);
	                    }
	                    expr = {
	                        type: ArrowParameterPlaceHolder,
	                        params: args,
	                        async: true
	                    };
	                }
	            }
	            else if (this.match('[')) {
	                this.context.isBindingElement = false;
	                this.context.isAssignmentTarget = true;
	                this.expect('[');
	                var property = this.isolateCoverGrammar(this.parseExpression);
	                this.expect(']');
	                expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property));
	            }
	            else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
	                var quasi = this.parseTemplateLiteral();
	                expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi));
	            }
	            else {
	                break;
	            }
	        }
	        this.context.allowIn = previousAllowIn;
	        return expr;
	    };
	    Parser.prototype.parseSuper = function () {
	        var node = this.createNode();
	        this.expectKeyword('super');
	        if (!this.match('[') && !this.match('.')) {
	            this.throwUnexpectedToken(this.lookahead);
	        }
	        return this.finalize(node, new Node.Super());
	    };
	    Parser.prototype.parseLeftHandSideExpression = function () {
	        assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.');
	        var node = this.startNode(this.lookahead);
	        var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() :
	            this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);
	        while (true) {
	            if (this.match('[')) {
	                this.context.isBindingElement = false;
	                this.context.isAssignmentTarget = true;
	                this.expect('[');
	                var property = this.isolateCoverGrammar(this.parseExpression);
	                this.expect(']');
	                expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property));
	            }
	            else if (this.match('.')) {
	                this.context.isBindingElement = false;
	                this.context.isAssignmentTarget = true;
	                this.expect('.');
	                var property = this.parseIdentifierName();
	                expr = this.finalize(node, new Node.StaticMemberExpression(expr, property));
	            }
	            else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {
	                var quasi = this.parseTemplateLiteral();
	                expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi));
	            }
	            else {
	                break;
	            }
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-update-expressions
	    Parser.prototype.parseUpdateExpression = function () {
	        var expr;
	        var startToken = this.lookahead;
	        if (this.match('++') || this.match('--')) {
	            var node = this.startNode(startToken);
	            var token = this.nextToken();
	            expr = this.inheritCoverGrammar(this.parseUnaryExpression);
	            if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
	                this.tolerateError(messages_1.Messages.StrictLHSPrefix);
	            }
	            if (!this.context.isAssignmentTarget) {
	                this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
	            }
	            var prefix = true;
	            expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix));
	            this.context.isAssignmentTarget = false;
	            this.context.isBindingElement = false;
	        }
	        else {
	            expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
	            if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) {
	                if (this.match('++') || this.match('--')) {
	                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {
	                        this.tolerateError(messages_1.Messages.StrictLHSPostfix);
	                    }
	                    if (!this.context.isAssignmentTarget) {
	                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
	                    }
	                    this.context.isAssignmentTarget = false;
	                    this.context.isBindingElement = false;
	                    var operator = this.nextToken().value;
	                    var prefix = false;
	                    expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix));
	                }
	            }
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-unary-operators
	    Parser.prototype.parseAwaitExpression = function () {
	        var node = this.createNode();
	        this.nextToken();
	        var argument = this.parseUnaryExpression();
	        return this.finalize(node, new Node.AwaitExpression(argument));
	    };
	    Parser.prototype.parseUnaryExpression = function () {
	        var expr;
	        if (this.match('+') || this.match('-') || this.match('~') || this.match('!') ||
	            this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) {
	            var node = this.startNode(this.lookahead);
	            var token = this.nextToken();
	            expr = this.inheritCoverGrammar(this.parseUnaryExpression);
	            expr = this.finalize(node, new Node.UnaryExpression(token.value, expr));
	            if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) {
	                this.tolerateError(messages_1.Messages.StrictDelete);
	            }
	            this.context.isAssignmentTarget = false;
	            this.context.isBindingElement = false;
	        }
	        else if (this.context.await && this.matchContextualKeyword('await')) {
	            expr = this.parseAwaitExpression();
	        }
	        else {
	            expr = this.parseUpdateExpression();
	        }
	        return expr;
	    };
	    Parser.prototype.parseExponentiationExpression = function () {
	        var startToken = this.lookahead;
	        var expr = this.inheritCoverGrammar(this.parseUnaryExpression);
	        if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) {
	            this.nextToken();
	            this.context.isAssignmentTarget = false;
	            this.context.isBindingElement = false;
	            var left = expr;
	            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
	            expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right));
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-exp-operator
	    // https://tc39.github.io/ecma262/#sec-multiplicative-operators
	    // https://tc39.github.io/ecma262/#sec-additive-operators
	    // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators
	    // https://tc39.github.io/ecma262/#sec-relational-operators
	    // https://tc39.github.io/ecma262/#sec-equality-operators
	    // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators
	    // https://tc39.github.io/ecma262/#sec-binary-logical-operators
	    Parser.prototype.binaryPrecedence = function (token) {
	        var op = token.value;
	        var precedence;
	        if (token.type === 7 /* Punctuator */) {
	            precedence = this.operatorPrecedence[op] || 0;
	        }
	        else if (token.type === 4 /* Keyword */) {
	            precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0;
	        }
	        else {
	            precedence = 0;
	        }
	        return precedence;
	    };
	    Parser.prototype.parseBinaryExpression = function () {
	        var startToken = this.lookahead;
	        var expr = this.inheritCoverGrammar(this.parseExponentiationExpression);
	        var token = this.lookahead;
	        var prec = this.binaryPrecedence(token);
	        if (prec > 0) {
	            this.nextToken();
	            this.context.isAssignmentTarget = false;
	            this.context.isBindingElement = false;
	            var markers = [startToken, this.lookahead];
	            var left = expr;
	            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);
	            var stack = [left, token.value, right];
	            var precedences = [prec];
	            while (true) {
	                prec = this.binaryPrecedence(this.lookahead);
	                if (prec <= 0) {
	                    break;
	                }
	                // Reduce: make a binary expression from the three topmost entries.
	                while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) {
	                    right = stack.pop();
	                    var operator = stack.pop();
	                    precedences.pop();
	                    left = stack.pop();
	                    markers.pop();
	                    var node = this.startNode(markers[markers.length - 1]);
	                    stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right)));
	                }
	                // Shift.
	                stack.push(this.nextToken().value);
	                precedences.push(prec);
	                markers.push(this.lookahead);
	                stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression));
	            }
	            // Final reduce to clean-up the stack.
	            var i = stack.length - 1;
	            expr = stack[i];
	            var lastMarker = markers.pop();
	            while (i > 1) {
	                var marker = markers.pop();
	                var lastLineStart = lastMarker && lastMarker.lineStart;
	                var node = this.startNode(marker, lastLineStart);
	                var operator = stack[i - 1];
	                expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr));
	                i -= 2;
	                lastMarker = marker;
	            }
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-conditional-operator
	    Parser.prototype.parseConditionalExpression = function () {
	        var startToken = this.lookahead;
	        var expr = this.inheritCoverGrammar(this.parseBinaryExpression);
	        if (this.match('?')) {
	            this.nextToken();
	            var previousAllowIn = this.context.allowIn;
	            this.context.allowIn = true;
	            var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression);
	            this.context.allowIn = previousAllowIn;
	            this.expect(':');
	            var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression);
	            expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate));
	            this.context.isAssignmentTarget = false;
	            this.context.isBindingElement = false;
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-assignment-operators
	    Parser.prototype.checkPatternParam = function (options, param) {
	        switch (param.type) {
	            case syntax_1.Syntax.Identifier:
	                this.validateParam(options, param, param.name);
	                break;
	            case syntax_1.Syntax.RestElement:
	                this.checkPatternParam(options, param.argument);
	                break;
	            case syntax_1.Syntax.AssignmentPattern:
	                this.checkPatternParam(options, param.left);
	                break;
	            case syntax_1.Syntax.ArrayPattern:
	                for (var i = 0; i < param.elements.length; i++) {
	                    if (param.elements[i] !== null) {
	                        this.checkPatternParam(options, param.elements[i]);
	                    }
	                }
	                break;
	            case syntax_1.Syntax.ObjectPattern:
	                for (var i = 0; i < param.properties.length; i++) {
	                    this.checkPatternParam(options, param.properties[i].value);
	                }
	                break;
	            default:
	                break;
	        }
	        options.simple = options.simple && (param instanceof Node.Identifier);
	    };
	    Parser.prototype.reinterpretAsCoverFormalsList = function (expr) {
	        var params = [expr];
	        var options;
	        var asyncArrow = false;
	        switch (expr.type) {
	            case syntax_1.Syntax.Identifier:
	                break;
	            case ArrowParameterPlaceHolder:
	                params = expr.params;
	                asyncArrow = expr.async;
	                break;
	            default:
	                return null;
	        }
	        options = {
	            simple: true,
	            paramSet: {}
	        };
	        for (var i = 0; i < params.length; ++i) {
	            var param = params[i];
	            if (param.type === syntax_1.Syntax.AssignmentPattern) {
	                if (param.right.type === syntax_1.Syntax.YieldExpression) {
	                    if (param.right.argument) {
	                        this.throwUnexpectedToken(this.lookahead);
	                    }
	                    param.right.type = syntax_1.Syntax.Identifier;
	                    param.right.name = 'yield';
	                    delete param.right.argument;
	                    delete param.right.delegate;
	                }
	            }
	            else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') {
	                this.throwUnexpectedToken(this.lookahead);
	            }
	            this.checkPatternParam(options, param);
	            params[i] = param;
	        }
	        if (this.context.strict || !this.context.allowYield) {
	            for (var i = 0; i < params.length; ++i) {
	                var param = params[i];
	                if (param.type === syntax_1.Syntax.YieldExpression) {
	                    this.throwUnexpectedToken(this.lookahead);
	                }
	            }
	        }
	        if (options.message === messages_1.Messages.StrictParamDupe) {
	            var token = this.context.strict ? options.stricted : options.firstRestricted;
	            this.throwUnexpectedToken(token, options.message);
	        }
	        return {
	            simple: options.simple,
	            params: params,
	            stricted: options.stricted,
	            firstRestricted: options.firstRestricted,
	            message: options.message
	        };
	    };
	    Parser.prototype.parseAssignmentExpression = function () {
	        var expr;
	        if (!this.context.allowYield && this.matchKeyword('yield')) {
	            expr = this.parseYieldExpression();
	        }
	        else {
	            var startToken = this.lookahead;
	            var token = startToken;
	            expr = this.parseConditionalExpression();
	            if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') {
	                if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) {
	                    var arg = this.parsePrimaryExpression();
	                    this.reinterpretExpressionAsPattern(arg);
	                    expr = {
	                        type: ArrowParameterPlaceHolder,
	                        params: [arg],
	                        async: true
	                    };
	                }
	            }
	            if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) {
	                // https://tc39.github.io/ecma262/#sec-arrow-function-definitions
	                this.context.isAssignmentTarget = false;
	                this.context.isBindingElement = false;
	                var isAsync = expr.async;
	                var list = this.reinterpretAsCoverFormalsList(expr);
	                if (list) {
	                    if (this.hasLineTerminator) {
	                        this.tolerateUnexpectedToken(this.lookahead);
	                    }
	                    this.context.firstCoverInitializedNameError = null;
	                    var previousStrict = this.context.strict;
	                    var previousAllowStrictDirective = this.context.allowStrictDirective;
	                    this.context.allowStrictDirective = list.simple;
	                    var previousAllowYield = this.context.allowYield;
	                    var previousAwait = this.context.await;
	                    this.context.allowYield = true;
	                    this.context.await = isAsync;
	                    var node = this.startNode(startToken);
	                    this.expect('=>');
	                    var body = void 0;
	                    if (this.match('{')) {
	                        var previousAllowIn = this.context.allowIn;
	                        this.context.allowIn = true;
	                        body = this.parseFunctionSourceElements();
	                        this.context.allowIn = previousAllowIn;
	                    }
	                    else {
	                        body = this.isolateCoverGrammar(this.parseAssignmentExpression);
	                    }
	                    var expression = body.type !== syntax_1.Syntax.BlockStatement;
	                    if (this.context.strict && list.firstRestricted) {
	                        this.throwUnexpectedToken(list.firstRestricted, list.message);
	                    }
	                    if (this.context.strict && list.stricted) {
	                        this.tolerateUnexpectedToken(list.stricted, list.message);
	                    }
	                    expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) :
	                        this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression));
	                    this.context.strict = previousStrict;
	                    this.context.allowStrictDirective = previousAllowStrictDirective;
	                    this.context.allowYield = previousAllowYield;
	                    this.context.await = previousAwait;
	                }
	            }
	            else {
	                if (this.matchAssign()) {
	                    if (!this.context.isAssignmentTarget) {
	                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);
	                    }
	                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) {
	                        var id = expr;
	                        if (this.scanner.isRestrictedWord(id.name)) {
	                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment);
	                        }
	                        if (this.scanner.isStrictModeReservedWord(id.name)) {
	                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
	                        }
	                    }
	                    if (!this.match('=')) {
	                        this.context.isAssignmentTarget = false;
	                        this.context.isBindingElement = false;
	                    }
	                    else {
	                        this.reinterpretExpressionAsPattern(expr);
	                    }
	                    token = this.nextToken();
	                    var operator = token.value;
	                    var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
	                    expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right));
	                    this.context.firstCoverInitializedNameError = null;
	                }
	            }
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-comma-operator
	    Parser.prototype.parseExpression = function () {
	        var startToken = this.lookahead;
	        var expr = this.isolateCoverGrammar(this.parseAssignmentExpression);
	        if (this.match(',')) {
	            var expressions = [];
	            expressions.push(expr);
	            while (this.lookahead.type !== 2 /* EOF */) {
	                if (!this.match(',')) {
	                    break;
	                }
	                this.nextToken();
	                expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
	            }
	            expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));
	        }
	        return expr;
	    };
	    // https://tc39.github.io/ecma262/#sec-block
	    Parser.prototype.parseStatementListItem = function () {
	        var statement;
	        this.context.isAssignmentTarget = true;
	        this.context.isBindingElement = true;
	        if (this.lookahead.type === 4 /* Keyword */) {
	            switch (this.lookahead.value) {
	                case 'export':
	                    if (!this.context.isModule) {
	                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration);
	                    }
	                    statement = this.parseExportDeclaration();
	                    break;
	                case 'import':
	                    if (!this.context.isModule) {
	                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration);
	                    }
	                    statement = this.parseImportDeclaration();
	                    break;
	                case 'const':
	                    statement = this.parseLexicalDeclaration({ inFor: false });
	                    break;
	                case 'function':
	                    statement = this.parseFunctionDeclaration();
	                    break;
	                case 'class':
	                    statement = this.parseClassDeclaration();
	                    break;
	                case 'let':
	                    statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement();
	                    break;
	                default:
	                    statement = this.parseStatement();
	                    break;
	            }
	        }
	        else {
	            statement = this.parseStatement();
	        }
	        return statement;
	    };
	    Parser.prototype.parseBlock = function () {
	        var node = this.createNode();
	        this.expect('{');
	        var block = [];
	        while (true) {
	            if (this.match('}')) {
	                break;
	            }
	            block.push(this.parseStatementListItem());
	        }
	        this.expect('}');
	        return this.finalize(node, new Node.BlockStatement(block));
	    };
	    // https://tc39.github.io/ecma262/#sec-let-and-const-declarations
	    Parser.prototype.parseLexicalBinding = function (kind, options) {
	        var node = this.createNode();
	        var params = [];
	        var id = this.parsePattern(params, kind);
	        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
	            if (this.scanner.isRestrictedWord(id.name)) {
	                this.tolerateError(messages_1.Messages.StrictVarName);
	            }
	        }
	        var init = null;
	        if (kind === 'const') {
	            if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) {
	                if (this.match('=')) {
	                    this.nextToken();
	                    init = this.isolateCoverGrammar(this.parseAssignmentExpression);
	                }
	                else {
	                    this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const');
	                }
	            }
	        }
	        else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) {
	            this.expect('=');
	            init = this.isolateCoverGrammar(this.parseAssignmentExpression);
	        }
	        return this.finalize(node, new Node.VariableDeclarator(id, init));
	    };
	    Parser.prototype.parseBindingList = function (kind, options) {
	        var list = [this.parseLexicalBinding(kind, options)];
	        while (this.match(',')) {
	            this.nextToken();
	            list.push(this.parseLexicalBinding(kind, options));
	        }
	        return list;
	    };
	    Parser.prototype.isLexicalDeclaration = function () {
	        var state = this.scanner.saveState();
	        this.scanner.scanComments();
	        var next = this.scanner.lex();
	        this.scanner.restoreState(state);
	        return (next.type === 3 /* Identifier */) ||
	            (next.type === 7 /* Punctuator */ && next.value === '[') ||
	            (next.type === 7 /* Punctuator */ && next.value === '{') ||
	            (next.type === 4 /* Keyword */ && next.value === 'let') ||
	            (next.type === 4 /* Keyword */ && next.value === 'yield');
	    };
	    Parser.prototype.parseLexicalDeclaration = function (options) {
	        var node = this.createNode();
	        var kind = this.nextToken().value;
	        assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const');
	        var declarations = this.parseBindingList(kind, options);
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.VariableDeclaration(declarations, kind));
	    };
	    // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns
	    Parser.prototype.parseBindingRestElement = function (params, kind) {
	        var node = this.createNode();
	        this.expect('...');
	        var arg = this.parsePattern(params, kind);
	        return this.finalize(node, new Node.RestElement(arg));
	    };
	    Parser.prototype.parseArrayPattern = function (params, kind) {
	        var node = this.createNode();
	        this.expect('[');
	        var elements = [];
	        while (!this.match(']')) {
	            if (this.match(',')) {
	                this.nextToken();
	                elements.push(null);
	            }
	            else {
	                if (this.match('...')) {
	                    elements.push(this.parseBindingRestElement(params, kind));
	                    break;
	                }
	                else {
	                    elements.push(this.parsePatternWithDefault(params, kind));
	                }
	                if (!this.match(']')) {
	                    this.expect(',');
	                }
	            }
	        }
	        this.expect(']');
	        return this.finalize(node, new Node.ArrayPattern(elements));
	    };
	    Parser.prototype.parsePropertyPattern = function (params, kind) {
	        var node = this.createNode();
	        var computed = false;
	        var shorthand = false;
	        var method = false;
	        var key;
	        var value;
	        if (this.lookahead.type === 3 /* Identifier */) {
	            var keyToken = this.lookahead;
	            key = this.parseVariableIdentifier();
	            var init = this.finalize(node, new Node.Identifier(keyToken.value));
	            if (this.match('=')) {
	                params.push(keyToken);
	                shorthand = true;
	                this.nextToken();
	                var expr = this.parseAssignmentExpression();
	                value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr));
	            }
	            else if (!this.match(':')) {
	                params.push(keyToken);
	                shorthand = true;
	                value = init;
	            }
	            else {
	                this.expect(':');
	                value = this.parsePatternWithDefault(params, kind);
	            }
	        }
	        else {
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	            this.expect(':');
	            value = this.parsePatternWithDefault(params, kind);
	        }
	        return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand));
	    };
	    Parser.prototype.parseObjectPattern = function (params, kind) {
	        var node = this.createNode();
	        var properties = [];
	        this.expect('{');
	        while (!this.match('}')) {
	            properties.push(this.parsePropertyPattern(params, kind));
	            if (!this.match('}')) {
	                this.expect(',');
	            }
	        }
	        this.expect('}');
	        return this.finalize(node, new Node.ObjectPattern(properties));
	    };
	    Parser.prototype.parsePattern = function (params, kind) {
	        var pattern;
	        if (this.match('[')) {
	            pattern = this.parseArrayPattern(params, kind);
	        }
	        else if (this.match('{')) {
	            pattern = this.parseObjectPattern(params, kind);
	        }
	        else {
	            if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) {
	                this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding);
	            }
	            params.push(this.lookahead);
	            pattern = this.parseVariableIdentifier(kind);
	        }
	        return pattern;
	    };
	    Parser.prototype.parsePatternWithDefault = function (params, kind) {
	        var startToken = this.lookahead;
	        var pattern = this.parsePattern(params, kind);
	        if (this.match('=')) {
	            this.nextToken();
	            var previousAllowYield = this.context.allowYield;
	            this.context.allowYield = true;
	            var right = this.isolateCoverGrammar(this.parseAssignmentExpression);
	            this.context.allowYield = previousAllowYield;
	            pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right));
	        }
	        return pattern;
	    };
	    // https://tc39.github.io/ecma262/#sec-variable-statement
	    Parser.prototype.parseVariableIdentifier = function (kind) {
	        var node = this.createNode();
	        var token = this.nextToken();
	        if (token.type === 4 /* Keyword */ && token.value === 'yield') {
	            if (this.context.strict) {
	                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
	            }
	            else if (!this.context.allowYield) {
	                this.throwUnexpectedToken(token);
	            }
	        }
	        else if (token.type !== 3 /* Identifier */) {
	            if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) {
	                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);
	            }
	            else {
	                if (this.context.strict || token.value !== 'let' || kind !== 'var') {
	                    this.throwUnexpectedToken(token);
	                }
	            }
	        }
	        else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') {
	            this.tolerateUnexpectedToken(token);
	        }
	        return this.finalize(node, new Node.Identifier(token.value));
	    };
	    Parser.prototype.parseVariableDeclaration = function (options) {
	        var node = this.createNode();
	        var params = [];
	        var id = this.parsePattern(params, 'var');
	        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {
	            if (this.scanner.isRestrictedWord(id.name)) {
	                this.tolerateError(messages_1.Messages.StrictVarName);
	            }
	        }
	        var init = null;
	        if (this.match('=')) {
	            this.nextToken();
	            init = this.isolateCoverGrammar(this.parseAssignmentExpression);
	        }
	        else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) {
	            this.expect('=');
	        }
	        return this.finalize(node, new Node.VariableDeclarator(id, init));
	    };
	    Parser.prototype.parseVariableDeclarationList = function (options) {
	        var opt = { inFor: options.inFor };
	        var list = [];
	        list.push(this.parseVariableDeclaration(opt));
	        while (this.match(',')) {
	            this.nextToken();
	            list.push(this.parseVariableDeclaration(opt));
	        }
	        return list;
	    };
	    Parser.prototype.parseVariableStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('var');
	        var declarations = this.parseVariableDeclarationList({ inFor: false });
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.VariableDeclaration(declarations, 'var'));
	    };
	    // https://tc39.github.io/ecma262/#sec-empty-statement
	    Parser.prototype.parseEmptyStatement = function () {
	        var node = this.createNode();
	        this.expect(';');
	        return this.finalize(node, new Node.EmptyStatement());
	    };
	    // https://tc39.github.io/ecma262/#sec-expression-statement
	    Parser.prototype.parseExpressionStatement = function () {
	        var node = this.createNode();
	        var expr = this.parseExpression();
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.ExpressionStatement(expr));
	    };
	    // https://tc39.github.io/ecma262/#sec-if-statement
	    Parser.prototype.parseIfClause = function () {
	        if (this.context.strict && this.matchKeyword('function')) {
	            this.tolerateError(messages_1.Messages.StrictFunction);
	        }
	        return this.parseStatement();
	    };
	    Parser.prototype.parseIfStatement = function () {
	        var node = this.createNode();
	        var consequent;
	        var alternate = null;
	        this.expectKeyword('if');
	        this.expect('(');
	        var test = this.parseExpression();
	        if (!this.match(')') && this.config.tolerant) {
	            this.tolerateUnexpectedToken(this.nextToken());
	            consequent = this.finalize(this.createNode(), new Node.EmptyStatement());
	        }
	        else {
	            this.expect(')');
	            consequent = this.parseIfClause();
	            if (this.matchKeyword('else')) {
	                this.nextToken();
	                alternate = this.parseIfClause();
	            }
	        }
	        return this.finalize(node, new Node.IfStatement(test, consequent, alternate));
	    };
	    // https://tc39.github.io/ecma262/#sec-do-while-statement
	    Parser.prototype.parseDoWhileStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('do');
	        var previousInIteration = this.context.inIteration;
	        this.context.inIteration = true;
	        var body = this.parseStatement();
	        this.context.inIteration = previousInIteration;
	        this.expectKeyword('while');
	        this.expect('(');
	        var test = this.parseExpression();
	        if (!this.match(')') && this.config.tolerant) {
	            this.tolerateUnexpectedToken(this.nextToken());
	        }
	        else {
	            this.expect(')');
	            if (this.match(';')) {
	                this.nextToken();
	            }
	        }
	        return this.finalize(node, new Node.DoWhileStatement(body, test));
	    };
	    // https://tc39.github.io/ecma262/#sec-while-statement
	    Parser.prototype.parseWhileStatement = function () {
	        var node = this.createNode();
	        var body;
	        this.expectKeyword('while');
	        this.expect('(');
	        var test = this.parseExpression();
	        if (!this.match(')') && this.config.tolerant) {
	            this.tolerateUnexpectedToken(this.nextToken());
	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
	        }
	        else {
	            this.expect(')');
	            var previousInIteration = this.context.inIteration;
	            this.context.inIteration = true;
	            body = this.parseStatement();
	            this.context.inIteration = previousInIteration;
	        }
	        return this.finalize(node, new Node.WhileStatement(test, body));
	    };
	    // https://tc39.github.io/ecma262/#sec-for-statement
	    // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements
	    Parser.prototype.parseForStatement = function () {
	        var init = null;
	        var test = null;
	        var update = null;
	        var forIn = true;
	        var left, right;
	        var node = this.createNode();
	        this.expectKeyword('for');
	        this.expect('(');
	        if (this.match(';')) {
	            this.nextToken();
	        }
	        else {
	            if (this.matchKeyword('var')) {
	                init = this.createNode();
	                this.nextToken();
	                var previousAllowIn = this.context.allowIn;
	                this.context.allowIn = false;
	                var declarations = this.parseVariableDeclarationList({ inFor: true });
	                this.context.allowIn = previousAllowIn;
	                if (declarations.length === 1 && this.matchKeyword('in')) {
	                    var decl = declarations[0];
	                    if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) {
	                        this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in');
	                    }
	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
	                    this.nextToken();
	                    left = init;
	                    right = this.parseExpression();
	                    init = null;
	                }
	                else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
	                    this.nextToken();
	                    left = init;
	                    right = this.parseAssignmentExpression();
	                    init = null;
	                    forIn = false;
	                }
	                else {
	                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));
	                    this.expect(';');
	                }
	            }
	            else if (this.matchKeyword('const') || this.matchKeyword('let')) {
	                init = this.createNode();
	                var kind = this.nextToken().value;
	                if (!this.context.strict && this.lookahead.value === 'in') {
	                    init = this.finalize(init, new Node.Identifier(kind));
	                    this.nextToken();
	                    left = init;
	                    right = this.parseExpression();
	                    init = null;
	                }
	                else {
	                    var previousAllowIn = this.context.allowIn;
	                    this.context.allowIn = false;
	                    var declarations = this.parseBindingList(kind, { inFor: true });
	                    this.context.allowIn = previousAllowIn;
	                    if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) {
	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
	                        this.nextToken();
	                        left = init;
	                        right = this.parseExpression();
	                        init = null;
	                    }
	                    else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {
	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
	                        this.nextToken();
	                        left = init;
	                        right = this.parseAssignmentExpression();
	                        init = null;
	                        forIn = false;
	                    }
	                    else {
	                        this.consumeSemicolon();
	                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));
	                    }
	                }
	            }
	            else {
	                var initStartToken = this.lookahead;
	                var previousAllowIn = this.context.allowIn;
	                this.context.allowIn = false;
	                init = this.inheritCoverGrammar(this.parseAssignmentExpression);
	                this.context.allowIn = previousAllowIn;
	                if (this.matchKeyword('in')) {
	                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
	                        this.tolerateError(messages_1.Messages.InvalidLHSInForIn);
	                    }
	                    this.nextToken();
	                    this.reinterpretExpressionAsPattern(init);
	                    left = init;
	                    right = this.parseExpression();
	                    init = null;
	                }
	                else if (this.matchContextualKeyword('of')) {
	                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {
	                        this.tolerateError(messages_1.Messages.InvalidLHSInForLoop);
	                    }
	                    this.nextToken();
	                    this.reinterpretExpressionAsPattern(init);
	                    left = init;
	                    right = this.parseAssignmentExpression();
	                    init = null;
	                    forIn = false;
	                }
	                else {
	                    if (this.match(',')) {
	                        var initSeq = [init];
	                        while (this.match(',')) {
	                            this.nextToken();
	                            initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression));
	                        }
	                        init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq));
	                    }
	                    this.expect(';');
	                }
	            }
	        }
	        if (typeof left === 'undefined') {
	            if (!this.match(';')) {
	                test = this.parseExpression();
	            }
	            this.expect(';');
	            if (!this.match(')')) {
	                update = this.parseExpression();
	            }
	        }
	        var body;
	        if (!this.match(')') && this.config.tolerant) {
	            this.tolerateUnexpectedToken(this.nextToken());
	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
	        }
	        else {
	            this.expect(')');
	            var previousInIteration = this.context.inIteration;
	            this.context.inIteration = true;
	            body = this.isolateCoverGrammar(this.parseStatement);
	            this.context.inIteration = previousInIteration;
	        }
	        return (typeof left === 'undefined') ?
	            this.finalize(node, new Node.ForStatement(init, test, update, body)) :
	            forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) :
	                this.finalize(node, new Node.ForOfStatement(left, right, body));
	    };
	    // https://tc39.github.io/ecma262/#sec-continue-statement
	    Parser.prototype.parseContinueStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('continue');
	        var label = null;
	        if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
	            var id = this.parseVariableIdentifier();
	            label = id;
	            var key = '$' + id.name;
	            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
	                this.throwError(messages_1.Messages.UnknownLabel, id.name);
	            }
	        }
	        this.consumeSemicolon();
	        if (label === null && !this.context.inIteration) {
	            this.throwError(messages_1.Messages.IllegalContinue);
	        }
	        return this.finalize(node, new Node.ContinueStatement(label));
	    };
	    // https://tc39.github.io/ecma262/#sec-break-statement
	    Parser.prototype.parseBreakStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('break');
	        var label = null;
	        if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {
	            var id = this.parseVariableIdentifier();
	            var key = '$' + id.name;
	            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
	                this.throwError(messages_1.Messages.UnknownLabel, id.name);
	            }
	            label = id;
	        }
	        this.consumeSemicolon();
	        if (label === null && !this.context.inIteration && !this.context.inSwitch) {
	            this.throwError(messages_1.Messages.IllegalBreak);
	        }
	        return this.finalize(node, new Node.BreakStatement(label));
	    };
	    // https://tc39.github.io/ecma262/#sec-return-statement
	    Parser.prototype.parseReturnStatement = function () {
	        if (!this.context.inFunctionBody) {
	            this.tolerateError(messages_1.Messages.IllegalReturn);
	        }
	        var node = this.createNode();
	        this.expectKeyword('return');
	        var hasArgument = (!this.match(';') && !this.match('}') &&
	            !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */) ||
	            this.lookahead.type === 8 /* StringLiteral */ ||
	            this.lookahead.type === 10 /* Template */;
	        var argument = hasArgument ? this.parseExpression() : null;
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.ReturnStatement(argument));
	    };
	    // https://tc39.github.io/ecma262/#sec-with-statement
	    Parser.prototype.parseWithStatement = function () {
	        if (this.context.strict) {
	            this.tolerateError(messages_1.Messages.StrictModeWith);
	        }
	        var node = this.createNode();
	        var body;
	        this.expectKeyword('with');
	        this.expect('(');
	        var object = this.parseExpression();
	        if (!this.match(')') && this.config.tolerant) {
	            this.tolerateUnexpectedToken(this.nextToken());
	            body = this.finalize(this.createNode(), new Node.EmptyStatement());
	        }
	        else {
	            this.expect(')');
	            body = this.parseStatement();
	        }
	        return this.finalize(node, new Node.WithStatement(object, body));
	    };
	    // https://tc39.github.io/ecma262/#sec-switch-statement
	    Parser.prototype.parseSwitchCase = function () {
	        var node = this.createNode();
	        var test;
	        if (this.matchKeyword('default')) {
	            this.nextToken();
	            test = null;
	        }
	        else {
	            this.expectKeyword('case');
	            test = this.parseExpression();
	        }
	        this.expect(':');
	        var consequent = [];
	        while (true) {
	            if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) {
	                break;
	            }
	            consequent.push(this.parseStatementListItem());
	        }
	        return this.finalize(node, new Node.SwitchCase(test, consequent));
	    };
	    Parser.prototype.parseSwitchStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('switch');
	        this.expect('(');
	        var discriminant = this.parseExpression();
	        this.expect(')');
	        var previousInSwitch = this.context.inSwitch;
	        this.context.inSwitch = true;
	        var cases = [];
	        var defaultFound = false;
	        this.expect('{');
	        while (true) {
	            if (this.match('}')) {
	                break;
	            }
	            var clause = this.parseSwitchCase();
	            if (clause.test === null) {
	                if (defaultFound) {
	                    this.throwError(messages_1.Messages.MultipleDefaultsInSwitch);
	                }
	                defaultFound = true;
	            }
	            cases.push(clause);
	        }
	        this.expect('}');
	        this.context.inSwitch = previousInSwitch;
	        return this.finalize(node, new Node.SwitchStatement(discriminant, cases));
	    };
	    // https://tc39.github.io/ecma262/#sec-labelled-statements
	    Parser.prototype.parseLabelledStatement = function () {
	        var node = this.createNode();
	        var expr = this.parseExpression();
	        var statement;
	        if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) {
	            this.nextToken();
	            var id = expr;
	            var key = '$' + id.name;
	            if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {
	                this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name);
	            }
	            this.context.labelSet[key] = true;
	            var body = void 0;
	            if (this.matchKeyword('class')) {
	                this.tolerateUnexpectedToken(this.lookahead);
	                body = this.parseClassDeclaration();
	            }
	            else if (this.matchKeyword('function')) {
	                var token = this.lookahead;
	                var declaration = this.parseFunctionDeclaration();
	                if (this.context.strict) {
	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction);
	                }
	                else if (declaration.generator) {
	                    this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext);
	                }
	                body = declaration;
	            }
	            else {
	                body = this.parseStatement();
	            }
	            delete this.context.labelSet[key];
	            statement = new Node.LabeledStatement(id, body);
	        }
	        else {
	            this.consumeSemicolon();
	            statement = new Node.ExpressionStatement(expr);
	        }
	        return this.finalize(node, statement);
	    };
	    // https://tc39.github.io/ecma262/#sec-throw-statement
	    Parser.prototype.parseThrowStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('throw');
	        if (this.hasLineTerminator) {
	            this.throwError(messages_1.Messages.NewlineAfterThrow);
	        }
	        var argument = this.parseExpression();
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.ThrowStatement(argument));
	    };
	    // https://tc39.github.io/ecma262/#sec-try-statement
	    Parser.prototype.parseCatchClause = function () {
	        var node = this.createNode();
	        this.expectKeyword('catch');
	        this.expect('(');
	        if (this.match(')')) {
	            this.throwUnexpectedToken(this.lookahead);
	        }
	        var params = [];
	        var param = this.parsePattern(params);
	        var paramMap = {};
	        for (var i = 0; i < params.length; i++) {
	            var key = '$' + params[i].value;
	            if (Object.prototype.hasOwnProperty.call(paramMap, key)) {
	                this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value);
	            }
	            paramMap[key] = true;
	        }
	        if (this.context.strict && param.type === syntax_1.Syntax.Identifier) {
	            if (this.scanner.isRestrictedWord(param.name)) {
	                this.tolerateError(messages_1.Messages.StrictCatchVariable);
	            }
	        }
	        this.expect(')');
	        var body = this.parseBlock();
	        return this.finalize(node, new Node.CatchClause(param, body));
	    };
	    Parser.prototype.parseFinallyClause = function () {
	        this.expectKeyword('finally');
	        return this.parseBlock();
	    };
	    Parser.prototype.parseTryStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('try');
	        var block = this.parseBlock();
	        var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null;
	        var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null;
	        if (!handler && !finalizer) {
	            this.throwError(messages_1.Messages.NoCatchOrFinally);
	        }
	        return this.finalize(node, new Node.TryStatement(block, handler, finalizer));
	    };
	    // https://tc39.github.io/ecma262/#sec-debugger-statement
	    Parser.prototype.parseDebuggerStatement = function () {
	        var node = this.createNode();
	        this.expectKeyword('debugger');
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.DebuggerStatement());
	    };
	    // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations
	    Parser.prototype.parseStatement = function () {
	        var statement;
	        switch (this.lookahead.type) {
	            case 1 /* BooleanLiteral */:
	            case 5 /* NullLiteral */:
	            case 6 /* NumericLiteral */:
	            case 8 /* StringLiteral */:
	            case 10 /* Template */:
	            case 9 /* RegularExpression */:
	                statement = this.parseExpressionStatement();
	                break;
	            case 7 /* Punctuator */:
	                var value = this.lookahead.value;
	                if (value === '{') {
	                    statement = this.parseBlock();
	                }
	                else if (value === '(') {
	                    statement = this.parseExpressionStatement();
	                }
	                else if (value === ';') {
	                    statement = this.parseEmptyStatement();
	                }
	                else {
	                    statement = this.parseExpressionStatement();
	                }
	                break;
	            case 3 /* Identifier */:
	                statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement();
	                break;
	            case 4 /* Keyword */:
	                switch (this.lookahead.value) {
	                    case 'break':
	                        statement = this.parseBreakStatement();
	                        break;
	                    case 'continue':
	                        statement = this.parseContinueStatement();
	                        break;
	                    case 'debugger':
	                        statement = this.parseDebuggerStatement();
	                        break;
	                    case 'do':
	                        statement = this.parseDoWhileStatement();
	                        break;
	                    case 'for':
	                        statement = this.parseForStatement();
	                        break;
	                    case 'function':
	                        statement = this.parseFunctionDeclaration();
	                        break;
	                    case 'if':
	                        statement = this.parseIfStatement();
	                        break;
	                    case 'return':
	                        statement = this.parseReturnStatement();
	                        break;
	                    case 'switch':
	                        statement = this.parseSwitchStatement();
	                        break;
	                    case 'throw':
	                        statement = this.parseThrowStatement();
	                        break;
	                    case 'try':
	                        statement = this.parseTryStatement();
	                        break;
	                    case 'var':
	                        statement = this.parseVariableStatement();
	                        break;
	                    case 'while':
	                        statement = this.parseWhileStatement();
	                        break;
	                    case 'with':
	                        statement = this.parseWithStatement();
	                        break;
	                    default:
	                        statement = this.parseExpressionStatement();
	                        break;
	                }
	                break;
	            default:
	                statement = this.throwUnexpectedToken(this.lookahead);
	        }
	        return statement;
	    };
	    // https://tc39.github.io/ecma262/#sec-function-definitions
	    Parser.prototype.parseFunctionSourceElements = function () {
	        var node = this.createNode();
	        this.expect('{');
	        var body = this.parseDirectivePrologues();
	        var previousLabelSet = this.context.labelSet;
	        var previousInIteration = this.context.inIteration;
	        var previousInSwitch = this.context.inSwitch;
	        var previousInFunctionBody = this.context.inFunctionBody;
	        this.context.labelSet = {};
	        this.context.inIteration = false;
	        this.context.inSwitch = false;
	        this.context.inFunctionBody = true;
	        while (this.lookahead.type !== 2 /* EOF */) {
	            if (this.match('}')) {
	                break;
	            }
	            body.push(this.parseStatementListItem());
	        }
	        this.expect('}');
	        this.context.labelSet = previousLabelSet;
	        this.context.inIteration = previousInIteration;
	        this.context.inSwitch = previousInSwitch;
	        this.context.inFunctionBody = previousInFunctionBody;
	        return this.finalize(node, new Node.BlockStatement(body));
	    };
	    Parser.prototype.validateParam = function (options, param, name) {
	        var key = '$' + name;
	        if (this.context.strict) {
	            if (this.scanner.isRestrictedWord(name)) {
	                options.stricted = param;
	                options.message = messages_1.Messages.StrictParamName;
	            }
	            if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
	                options.stricted = param;
	                options.message = messages_1.Messages.StrictParamDupe;
	            }
	        }
	        else if (!options.firstRestricted) {
	            if (this.scanner.isRestrictedWord(name)) {
	                options.firstRestricted = param;
	                options.message = messages_1.Messages.StrictParamName;
	            }
	            else if (this.scanner.isStrictModeReservedWord(name)) {
	                options.firstRestricted = param;
	                options.message = messages_1.Messages.StrictReservedWord;
	            }
	            else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
	                options.stricted = param;
	                options.message = messages_1.Messages.StrictParamDupe;
	            }
	        }
	        /* istanbul ignore next */
	        if (typeof Object.defineProperty === 'function') {
	            Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true });
	        }
	        else {
	            options.paramSet[key] = true;
	        }
	    };
	    Parser.prototype.parseRestElement = function (params) {
	        var node = this.createNode();
	        this.expect('...');
	        var arg = this.parsePattern(params);
	        if (this.match('=')) {
	            this.throwError(messages_1.Messages.DefaultRestParameter);
	        }
	        if (!this.match(')')) {
	            this.throwError(messages_1.Messages.ParameterAfterRestParameter);
	        }
	        return this.finalize(node, new Node.RestElement(arg));
	    };
	    Parser.prototype.parseFormalParameter = function (options) {
	        var params = [];
	        var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params);
	        for (var i = 0; i < params.length; i++) {
	            this.validateParam(options, params[i], params[i].value);
	        }
	        options.simple = options.simple && (param instanceof Node.Identifier);
	        options.params.push(param);
	    };
	    Parser.prototype.parseFormalParameters = function (firstRestricted) {
	        var options;
	        options = {
	            simple: true,
	            params: [],
	            firstRestricted: firstRestricted
	        };
	        this.expect('(');
	        if (!this.match(')')) {
	            options.paramSet = {};
	            while (this.lookahead.type !== 2 /* EOF */) {
	                this.parseFormalParameter(options);
	                if (this.match(')')) {
	                    break;
	                }
	                this.expect(',');
	                if (this.match(')')) {
	                    break;
	                }
	            }
	        }
	        this.expect(')');
	        return {
	            simple: options.simple,
	            params: options.params,
	            stricted: options.stricted,
	            firstRestricted: options.firstRestricted,
	            message: options.message
	        };
	    };
	    Parser.prototype.matchAsyncFunction = function () {
	        var match = this.matchContextualKeyword('async');
	        if (match) {
	            var state = this.scanner.saveState();
	            this.scanner.scanComments();
	            var next = this.scanner.lex();
	            this.scanner.restoreState(state);
	            match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function');
	        }
	        return match;
	    };
	    Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) {
	        var node = this.createNode();
	        var isAsync = this.matchContextualKeyword('async');
	        if (isAsync) {
	            this.nextToken();
	        }
	        this.expectKeyword('function');
	        var isGenerator = isAsync ? false : this.match('*');
	        if (isGenerator) {
	            this.nextToken();
	        }
	        var message;
	        var id = null;
	        var firstRestricted = null;
	        if (!identifierIsOptional || !this.match('(')) {
	            var token = this.lookahead;
	            id = this.parseVariableIdentifier();
	            if (this.context.strict) {
	                if (this.scanner.isRestrictedWord(token.value)) {
	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
	                }
	            }
	            else {
	                if (this.scanner.isRestrictedWord(token.value)) {
	                    firstRestricted = token;
	                    message = messages_1.Messages.StrictFunctionName;
	                }
	                else if (this.scanner.isStrictModeReservedWord(token.value)) {
	                    firstRestricted = token;
	                    message = messages_1.Messages.StrictReservedWord;
	                }
	            }
	        }
	        var previousAllowAwait = this.context.await;
	        var previousAllowYield = this.context.allowYield;
	        this.context.await = isAsync;
	        this.context.allowYield = !isGenerator;
	        var formalParameters = this.parseFormalParameters(firstRestricted);
	        var params = formalParameters.params;
	        var stricted = formalParameters.stricted;
	        firstRestricted = formalParameters.firstRestricted;
	        if (formalParameters.message) {
	            message = formalParameters.message;
	        }
	        var previousStrict = this.context.strict;
	        var previousAllowStrictDirective = this.context.allowStrictDirective;
	        this.context.allowStrictDirective = formalParameters.simple;
	        var body = this.parseFunctionSourceElements();
	        if (this.context.strict && firstRestricted) {
	            this.throwUnexpectedToken(firstRestricted, message);
	        }
	        if (this.context.strict && stricted) {
	            this.tolerateUnexpectedToken(stricted, message);
	        }
	        this.context.strict = previousStrict;
	        this.context.allowStrictDirective = previousAllowStrictDirective;
	        this.context.await = previousAllowAwait;
	        this.context.allowYield = previousAllowYield;
	        return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) :
	            this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator));
	    };
	    Parser.prototype.parseFunctionExpression = function () {
	        var node = this.createNode();
	        var isAsync = this.matchContextualKeyword('async');
	        if (isAsync) {
	            this.nextToken();
	        }
	        this.expectKeyword('function');
	        var isGenerator = isAsync ? false : this.match('*');
	        if (isGenerator) {
	            this.nextToken();
	        }
	        var message;
	        var id = null;
	        var firstRestricted;
	        var previousAllowAwait = this.context.await;
	        var previousAllowYield = this.context.allowYield;
	        this.context.await = isAsync;
	        this.context.allowYield = !isGenerator;
	        if (!this.match('(')) {
	            var token = this.lookahead;
	            id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier();
	            if (this.context.strict) {
	                if (this.scanner.isRestrictedWord(token.value)) {
	                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);
	                }
	            }
	            else {
	                if (this.scanner.isRestrictedWord(token.value)) {
	                    firstRestricted = token;
	                    message = messages_1.Messages.StrictFunctionName;
	                }
	                else if (this.scanner.isStrictModeReservedWord(token.value)) {
	                    firstRestricted = token;
	                    message = messages_1.Messages.StrictReservedWord;
	                }
	            }
	        }
	        var formalParameters = this.parseFormalParameters(firstRestricted);
	        var params = formalParameters.params;
	        var stricted = formalParameters.stricted;
	        firstRestricted = formalParameters.firstRestricted;
	        if (formalParameters.message) {
	            message = formalParameters.message;
	        }
	        var previousStrict = this.context.strict;
	        var previousAllowStrictDirective = this.context.allowStrictDirective;
	        this.context.allowStrictDirective = formalParameters.simple;
	        var body = this.parseFunctionSourceElements();
	        if (this.context.strict && firstRestricted) {
	            this.throwUnexpectedToken(firstRestricted, message);
	        }
	        if (this.context.strict && stricted) {
	            this.tolerateUnexpectedToken(stricted, message);
	        }
	        this.context.strict = previousStrict;
	        this.context.allowStrictDirective = previousAllowStrictDirective;
	        this.context.await = previousAllowAwait;
	        this.context.allowYield = previousAllowYield;
	        return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) :
	            this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator));
	    };
	    // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive
	    Parser.prototype.parseDirective = function () {
	        var token = this.lookahead;
	        var node = this.createNode();
	        var expr = this.parseExpression();
	        var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null;
	        this.consumeSemicolon();
	        return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr));
	    };
	    Parser.prototype.parseDirectivePrologues = function () {
	        var firstRestricted = null;
	        var body = [];
	        while (true) {
	            var token = this.lookahead;
	            if (token.type !== 8 /* StringLiteral */) {
	                break;
	            }
	            var statement = this.parseDirective();
	            body.push(statement);
	            var directive = statement.directive;
	            if (typeof directive !== 'string') {
	                break;
	            }
	            if (directive === 'use strict') {
	                this.context.strict = true;
	                if (firstRestricted) {
	                    this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral);
	                }
	                if (!this.context.allowStrictDirective) {
	                    this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective);
	                }
	            }
	            else {
	                if (!firstRestricted && token.octal) {
	                    firstRestricted = token;
	                }
	            }
	        }
	        return body;
	    };
	    // https://tc39.github.io/ecma262/#sec-method-definitions
	    Parser.prototype.qualifiedPropertyName = function (token) {
	        switch (token.type) {
	            case 3 /* Identifier */:
	            case 8 /* StringLiteral */:
	            case 1 /* BooleanLiteral */:
	            case 5 /* NullLiteral */:
	            case 6 /* NumericLiteral */:
	            case 4 /* Keyword */:
	                return true;
	            case 7 /* Punctuator */:
	                return token.value === '[';
	            default:
	                break;
	        }
	        return false;
	    };
	    Parser.prototype.parseGetterMethod = function () {
	        var node = this.createNode();
	        var isGenerator = false;
	        var previousAllowYield = this.context.allowYield;
	        this.context.allowYield = !isGenerator;
	        var formalParameters = this.parseFormalParameters();
	        if (formalParameters.params.length > 0) {
	            this.tolerateError(messages_1.Messages.BadGetterArity);
	        }
	        var method = this.parsePropertyMethod(formalParameters);
	        this.context.allowYield = previousAllowYield;
	        return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
	    };
	    Parser.prototype.parseSetterMethod = function () {
	        var node = this.createNode();
	        var isGenerator = false;
	        var previousAllowYield = this.context.allowYield;
	        this.context.allowYield = !isGenerator;
	        var formalParameters = this.parseFormalParameters();
	        if (formalParameters.params.length !== 1) {
	            this.tolerateError(messages_1.Messages.BadSetterArity);
	        }
	        else if (formalParameters.params[0] instanceof Node.RestElement) {
	            this.tolerateError(messages_1.Messages.BadSetterRestParameter);
	        }
	        var method = this.parsePropertyMethod(formalParameters);
	        this.context.allowYield = previousAllowYield;
	        return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));
	    };
	    Parser.prototype.parseGeneratorMethod = function () {
	        var node = this.createNode();
	        var isGenerator = true;
	        var previousAllowYield = this.context.allowYield;
	        this.context.allowYield = true;
	        var params = this.parseFormalParameters();
	        this.context.allowYield = false;
	        var method = this.parsePropertyMethod(params);
	        this.context.allowYield = previousAllowYield;
	        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));
	    };
	    // https://tc39.github.io/ecma262/#sec-generator-function-definitions
	    Parser.prototype.isStartOfExpression = function () {
	        var start = true;
	        var value = this.lookahead.value;
	        switch (this.lookahead.type) {
	            case 7 /* Punctuator */:
	                start = (value === '[') || (value === '(') || (value === '{') ||
	                    (value === '+') || (value === '-') ||
	                    (value === '!') || (value === '~') ||
	                    (value === '++') || (value === '--') ||
	                    (value === '/') || (value === '/='); // regular expression literal
	                break;
	            case 4 /* Keyword */:
	                start = (value === 'class') || (value === 'delete') ||
	                    (value === 'function') || (value === 'let') || (value === 'new') ||
	                    (value === 'super') || (value === 'this') || (value === 'typeof') ||
	                    (value === 'void') || (value === 'yield');
	                break;
	            default:
	                break;
	        }
	        return start;
	    };
	    Parser.prototype.parseYieldExpression = function () {
	        var node = this.createNode();
	        this.expectKeyword('yield');
	        var argument = null;
	        var delegate = false;
	        if (!this.hasLineTerminator) {
	            var previousAllowYield = this.context.allowYield;
	            this.context.allowYield = false;
	            delegate = this.match('*');
	            if (delegate) {
	                this.nextToken();
	                argument = this.parseAssignmentExpression();
	            }
	            else if (this.isStartOfExpression()) {
	                argument = this.parseAssignmentExpression();
	            }
	            this.context.allowYield = previousAllowYield;
	        }
	        return this.finalize(node, new Node.YieldExpression(argument, delegate));
	    };
	    // https://tc39.github.io/ecma262/#sec-class-definitions
	    Parser.prototype.parseClassElement = function (hasConstructor) {
	        var token = this.lookahead;
	        var node = this.createNode();
	        var kind = '';
	        var key = null;
	        var value = null;
	        var computed = false;
	        var method = false;
	        var isStatic = false;
	        var isAsync = false;
	        if (this.match('*')) {
	            this.nextToken();
	        }
	        else {
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	            var id = key;
	            if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) {
	                token = this.lookahead;
	                isStatic = true;
	                computed = this.match('[');
	                if (this.match('*')) {
	                    this.nextToken();
	                }
	                else {
	                    key = this.parseObjectPropertyKey();
	                }
	            }
	            if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) {
	                var punctuator = this.lookahead.value;
	                if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') {
	                    isAsync = true;
	                    token = this.lookahead;
	                    key = this.parseObjectPropertyKey();
	                    if (token.type === 3 /* Identifier */ && token.value === 'constructor') {
	                        this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync);
	                    }
	                }
	            }
	        }
	        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);
	        if (token.type === 3 /* Identifier */) {
	            if (token.value === 'get' && lookaheadPropertyKey) {
	                kind = 'get';
	                computed = this.match('[');
	                key = this.parseObjectPropertyKey();
	                this.context.allowYield = false;
	                value = this.parseGetterMethod();
	            }
	            else if (token.value === 'set' && lookaheadPropertyKey) {
	                kind = 'set';
	                computed = this.match('[');
	                key = this.parseObjectPropertyKey();
	                value = this.parseSetterMethod();
	            }
	        }
	        else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {
	            kind = 'init';
	            computed = this.match('[');
	            key = this.parseObjectPropertyKey();
	            value = this.parseGeneratorMethod();
	            method = true;
	        }
	        if (!kind && key && this.match('(')) {
	            kind = 'init';
	            value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();
	            method = true;
	        }
	        if (!kind) {
	            this.throwUnexpectedToken(this.lookahead);
	        }
	        if (kind === 'init') {
	            kind = 'method';
	        }
	        if (!computed) {
	            if (isStatic && this.isPropertyKey(key, 'prototype')) {
	                this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype);
	            }
	            if (!isStatic && this.isPropertyKey(key, 'constructor')) {
	                if (kind !== 'method' || !method || (value && value.generator)) {
	                    this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod);
	                }
	                if (hasConstructor.value) {
	                    this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor);
	                }
	                else {
	                    hasConstructor.value = true;
	                }
	                kind = 'constructor';
	            }
	        }
	        return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic));
	    };
	    Parser.prototype.parseClassElementList = function () {
	        var body = [];
	        var hasConstructor = { value: false };
	        this.expect('{');
	        while (!this.match('}')) {
	            if (this.match(';')) {
	                this.nextToken();
	            }
	            else {
	                body.push(this.parseClassElement(hasConstructor));
	            }
	        }
	        this.expect('}');
	        return body;
	    };
	    Parser.prototype.parseClassBody = function () {
	        var node = this.createNode();
	        var elementList = this.parseClassElementList();
	        return this.finalize(node, new Node.ClassBody(elementList));
	    };
	    Parser.prototype.parseClassDeclaration = function (identifierIsOptional) {
	        var node = this.createNode();
	        var previousStrict = this.context.strict;
	        this.context.strict = true;
	        this.expectKeyword('class');
	        var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier();
	        var superClass = null;
	        if (this.matchKeyword('extends')) {
	            this.nextToken();
	            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
	        }
	        var classBody = this.parseClassBody();
	        this.context.strict = previousStrict;
	        return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody));
	    };
	    Parser.prototype.parseClassExpression = function () {
	        var node = this.createNode();
	        var previousStrict = this.context.strict;
	        this.context.strict = true;
	        this.expectKeyword('class');
	        var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null;
	        var superClass = null;
	        if (this.matchKeyword('extends')) {
	            this.nextToken();
	            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);
	        }
	        var classBody = this.parseClassBody();
	        this.context.strict = previousStrict;
	        return this.finalize(node, new Node.ClassExpression(id, superClass, classBody));
	    };
	    // https://tc39.github.io/ecma262/#sec-scripts
	    // https://tc39.github.io/ecma262/#sec-modules
	    Parser.prototype.parseModule = function () {
	        this.context.strict = true;
	        this.context.isModule = true;
	        this.scanner.isModule = true;
	        var node = this.createNode();
	        var body = this.parseDirectivePrologues();
	        while (this.lookahead.type !== 2 /* EOF */) {
	            body.push(this.parseStatementListItem());
	        }
	        return this.finalize(node, new Node.Module(body));
	    };
	    Parser.prototype.parseScript = function () {
	        var node = this.createNode();
	        var body = this.parseDirectivePrologues();
	        while (this.lookahead.type !== 2 /* EOF */) {
	            body.push(this.parseStatementListItem());
	        }
	        return this.finalize(node, new Node.Script(body));
	    };
	    // https://tc39.github.io/ecma262/#sec-imports
	    Parser.prototype.parseModuleSpecifier = function () {
	        var node = this.createNode();
	        if (this.lookahead.type !== 8 /* StringLiteral */) {
	            this.throwError(messages_1.Messages.InvalidModuleSpecifier);
	        }
	        var token = this.nextToken();
	        var raw = this.getTokenRaw(token);
	        return this.finalize(node, new Node.Literal(token.value, raw));
	    };
	    // import {<foo as bar>} ...;
	    Parser.prototype.parseImportSpecifier = function () {
	        var node = this.createNode();
	        var imported;
	        var local;
	        if (this.lookahead.type === 3 /* Identifier */) {
	            imported = this.parseVariableIdentifier();
	            local = imported;
	            if (this.matchContextualKeyword('as')) {
	                this.nextToken();
	                local = this.parseVariableIdentifier();
	            }
	        }
	        else {
	            imported = this.parseIdentifierName();
	            local = imported;
	            if (this.matchContextualKeyword('as')) {
	                this.nextToken();
	                local = this.parseVariableIdentifier();
	            }
	            else {
	                this.throwUnexpectedToken(this.nextToken());
	            }
	        }
	        return this.finalize(node, new Node.ImportSpecifier(local, imported));
	    };
	    // {foo, bar as bas}
	    Parser.prototype.parseNamedImports = function () {
	        this.expect('{');
	        var specifiers = [];
	        while (!this.match('}')) {
	            specifiers.push(this.parseImportSpecifier());
	            if (!this.match('}')) {
	                this.expect(',');
	            }
	        }
	        this.expect('}');
	        return specifiers;
	    };
	    // import <foo> ...;
	    Parser.prototype.parseImportDefaultSpecifier = function () {
	        var node = this.createNode();
	        var local = this.parseIdentifierName();
	        return this.finalize(node, new Node.ImportDefaultSpecifier(local));
	    };
	    // import <* as foo> ...;
	    Parser.prototype.parseImportNamespaceSpecifier = function () {
	        var node = this.createNode();
	        this.expect('*');
	        if (!this.matchContextualKeyword('as')) {
	            this.throwError(messages_1.Messages.NoAsAfterImportNamespace);
	        }
	        this.nextToken();
	        var local = this.parseIdentifierName();
	        return this.finalize(node, new Node.ImportNamespaceSpecifier(local));
	    };
	    Parser.prototype.parseImportDeclaration = function () {
	        if (this.context.inFunctionBody) {
	            this.throwError(messages_1.Messages.IllegalImportDeclaration);
	        }
	        var node = this.createNode();
	        this.expectKeyword('import');
	        var src;
	        var specifiers = [];
	        if (this.lookahead.type === 8 /* StringLiteral */) {
	            // import 'foo';
	            src = this.parseModuleSpecifier();
	        }
	        else {
	            if (this.match('{')) {
	                // import {bar}
	                specifiers = specifiers.concat(this.parseNamedImports());
	            }
	            else if (this.match('*')) {
	                // import * as foo
	                specifiers.push(this.parseImportNamespaceSpecifier());
	            }
	            else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) {
	                // import foo
	                specifiers.push(this.parseImportDefaultSpecifier());
	                if (this.match(',')) {
	                    this.nextToken();
	                    if (this.match('*')) {
	                        // import foo, * as foo
	                        specifiers.push(this.parseImportNamespaceSpecifier());
	                    }
	                    else if (this.match('{')) {
	                        // import foo, {bar}
	                        specifiers = specifiers.concat(this.parseNamedImports());
	                    }
	                    else {
	                        this.throwUnexpectedToken(this.lookahead);
	                    }
	                }
	            }
	            else {
	                this.throwUnexpectedToken(this.nextToken());
	            }
	            if (!this.matchContextualKeyword('from')) {
	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
	                this.throwError(message, this.lookahead.value);
	            }
	            this.nextToken();
	            src = this.parseModuleSpecifier();
	        }
	        this.consumeSemicolon();
	        return this.finalize(node, new Node.ImportDeclaration(specifiers, src));
	    };
	    // https://tc39.github.io/ecma262/#sec-exports
	    Parser.prototype.parseExportSpecifier = function () {
	        var node = this.createNode();
	        var local = this.parseIdentifierName();
	        var exported = local;
	        if (this.matchContextualKeyword('as')) {
	            this.nextToken();
	            exported = this.parseIdentifierName();
	        }
	        return this.finalize(node, new Node.ExportSpecifier(local, exported));
	    };
	    Parser.prototype.parseExportDeclaration = function () {
	        if (this.context.inFunctionBody) {
	            this.throwError(messages_1.Messages.IllegalExportDeclaration);
	        }
	        var node = this.createNode();
	        this.expectKeyword('export');
	        var exportDeclaration;
	        if (this.matchKeyword('default')) {
	            // export default ...
	            this.nextToken();
	            if (this.matchKeyword('function')) {
	                // export default function foo () {}
	                // export default function () {}
	                var declaration = this.parseFunctionDeclaration(true);
	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
	            }
	            else if (this.matchKeyword('class')) {
	                // export default class foo {}
	                var declaration = this.parseClassDeclaration(true);
	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
	            }
	            else if (this.matchContextualKeyword('async')) {
	                // export default async function f () {}
	                // export default async function () {}
	                // export default async x => x
	                var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression();
	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
	            }
	            else {
	                if (this.matchContextualKeyword('from')) {
	                    this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value);
	                }
	                // export default {};
	                // export default [];
	                // export default (1 + 2);
	                var declaration = this.match('{') ? this.parseObjectInitializer() :
	                    this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression();
	                this.consumeSemicolon();
	                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
	            }
	        }
	        else if (this.match('*')) {
	            // export * from 'foo';
	            this.nextToken();
	            if (!this.matchContextualKeyword('from')) {
	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
	                this.throwError(message, this.lookahead.value);
	            }
	            this.nextToken();
	            var src = this.parseModuleSpecifier();
	            this.consumeSemicolon();
	            exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src));
	        }
	        else if (this.lookahead.type === 4 /* Keyword */) {
	            // export var f = 1;
	            var declaration = void 0;
	            switch (this.lookahead.value) {
	                case 'let':
	                case 'const':
	                    declaration = this.parseLexicalDeclaration({ inFor: false });
	                    break;
	                case 'var':
	                case 'class':
	                case 'function':
	                    declaration = this.parseStatementListItem();
	                    break;
	                default:
	                    this.throwUnexpectedToken(this.lookahead);
	            }
	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
	        }
	        else if (this.matchAsyncFunction()) {
	            var declaration = this.parseFunctionDeclaration();
	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
	        }
	        else {
	            var specifiers = [];
	            var source = null;
	            var isExportFromIdentifier = false;
	            this.expect('{');
	            while (!this.match('}')) {
	                isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default');
	                specifiers.push(this.parseExportSpecifier());
	                if (!this.match('}')) {
	                    this.expect(',');
	                }
	            }
	            this.expect('}');
	            if (this.matchContextualKeyword('from')) {
	                // export {default} from 'foo';
	                // export {foo} from 'foo';
	                this.nextToken();
	                source = this.parseModuleSpecifier();
	                this.consumeSemicolon();
	            }
	            else if (isExportFromIdentifier) {
	                // export {default}; // missing fromClause
	                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
	                this.throwError(message, this.lookahead.value);
	            }
	            else {
	                // export {foo};
	                this.consumeSemicolon();
	            }
	            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source));
	        }
	        return exportDeclaration;
	    };
	    return Parser;
	}());
	exports.Parser = Parser;


/***/ },
/* 9 */
/***/ function(module, exports) {

	"use strict";
	// Ensure the condition is true, otherwise throw an error.
	// This is only to have a better contract semantic, i.e. another safety net
	// to catch a logic error. The condition shall be fulfilled in normal case.
	// Do NOT use this to enforce a certain condition on any user input.
	Object.defineProperty(exports, "__esModule", { value: true });
	function assert(condition, message) {
	    /* istanbul ignore if */
	    if (!condition) {
	        throw new Error('ASSERT: ' + message);
	    }
	}
	exports.assert = assert;


/***/ },
/* 10 */
/***/ function(module, exports) {

	"use strict";
	/* tslint:disable:max-classes-per-file */
	Object.defineProperty(exports, "__esModule", { value: true });
	var ErrorHandler = (function () {
	    function ErrorHandler() {
	        this.errors = [];
	        this.tolerant = false;
	    }
	    ErrorHandler.prototype.recordError = function (error) {
	        this.errors.push(error);
	    };
	    ErrorHandler.prototype.tolerate = function (error) {
	        if (this.tolerant) {
	            this.recordError(error);
	        }
	        else {
	            throw error;
	        }
	    };
	    ErrorHandler.prototype.constructError = function (msg, column) {
	        var error = new Error(msg);
	        try {
	            throw error;
	        }
	        catch (base) {
	            /* istanbul ignore else */
	            if (Object.create && Object.defineProperty) {
	                error = Object.create(base);
	                Object.defineProperty(error, 'column', { value: column });
	            }
	        }
	        /* istanbul ignore next */
	        return error;
	    };
	    ErrorHandler.prototype.createError = function (index, line, col, description) {
	        var msg = 'Line ' + line + ': ' + description;
	        var error = this.constructError(msg, col);
	        error.index = index;
	        error.lineNumber = line;
	        error.description = description;
	        return error;
	    };
	    ErrorHandler.prototype.throwError = function (index, line, col, description) {
	        throw this.createError(index, line, col, description);
	    };
	    ErrorHandler.prototype.tolerateError = function (index, line, col, description) {
	        var error = this.createError(index, line, col, description);
	        if (this.tolerant) {
	            this.recordError(error);
	        }
	        else {
	            throw error;
	        }
	    };
	    return ErrorHandler;
	}());
	exports.ErrorHandler = ErrorHandler;


/***/ },
/* 11 */
/***/ function(module, exports) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	// Error messages should be identical to V8.
	exports.Messages = {
	    BadGetterArity: 'Getter must not have any formal parameters',
	    BadSetterArity: 'Setter must have exactly one formal parameter',
	    BadSetterRestParameter: 'Setter function argument must not be a rest parameter',
	    ConstructorIsAsync: 'Class constructor may not be an async method',
	    ConstructorSpecialMethod: 'Class constructor may not be an accessor',
	    DeclarationMissingInitializer: 'Missing initializer in %0 declaration',
	    DefaultRestParameter: 'Unexpected token =',
	    DuplicateBinding: 'Duplicate binding %0',
	    DuplicateConstructor: 'A class may only have one constructor',
	    DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',
	    ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer',
	    GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts',
	    IllegalBreak: 'Illegal break statement',
	    IllegalContinue: 'Illegal continue statement',
	    IllegalExportDeclaration: 'Unexpected token',
	    IllegalImportDeclaration: 'Unexpected token',
	    IllegalLanguageModeDirective: 'Illegal \'use strict\' directive in function with non-simple parameter list',
	    IllegalReturn: 'Illegal return statement',
	    InvalidEscapedReservedWord: 'Keyword must not contain escaped characters',
	    InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence',
	    InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
	    InvalidLHSInForIn: 'Invalid left-hand side in for-in',
	    InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',
	    InvalidModuleSpecifier: 'Unexpected token',
	    InvalidRegExp: 'Invalid regular expression',
	    LetInLexicalBinding: 'let is disallowed as a lexically bound name',
	    MissingFromClause: 'Unexpected token',
	    MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
	    NewlineAfterThrow: 'Illegal newline after throw',
	    NoAsAfterImportNamespace: 'Unexpected token',
	    NoCatchOrFinally: 'Missing catch or finally after try',
	    ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',
	    Redeclaration: '%0 \'%1\' has already been declared',
	    StaticPrototype: 'Classes may not have static property named prototype',
	    StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
	    StrictDelete: 'Delete of an unqualified identifier in strict mode.',
	    StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block',
	    StrictFunctionName: 'Function name may not be eval or arguments in strict mode',
	    StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',
	    StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
	    StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
	    StrictModeWith: 'Strict mode code may not include a with statement',
	    StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',
	    StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
	    StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',
	    StrictReservedWord: 'Use of future reserved word in strict mode',
	    StrictVarName: 'Variable name may not be eval or arguments in strict mode',
	    TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',
	    UnexpectedEOS: 'Unexpected end of input',
	    UnexpectedIdentifier: 'Unexpected identifier',
	    UnexpectedNumber: 'Unexpected number',
	    UnexpectedReserved: 'Unexpected reserved word',
	    UnexpectedString: 'Unexpected string',
	    UnexpectedTemplate: 'Unexpected quasi %0',
	    UnexpectedToken: 'Unexpected token %0',
	    UnexpectedTokenIllegal: 'Unexpected token ILLEGAL',
	    UnknownLabel: 'Undefined label \'%0\'',
	    UnterminatedRegExp: 'Invalid regular expression: missing /'
	};


/***/ },
/* 12 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	var assert_1 = __webpack_require__(9);
	var character_1 = __webpack_require__(4);
	var messages_1 = __webpack_require__(11);
	function hexValue(ch) {
	    return '0123456789abcdef'.indexOf(ch.toLowerCase());
	}
	function octalValue(ch) {
	    return '01234567'.indexOf(ch);
	}
	var Scanner = (function () {
	    function Scanner(code, handler) {
	        this.source = code;
	        this.errorHandler = handler;
	        this.trackComment = false;
	        this.isModule = false;
	        this.length = code.length;
	        this.index = 0;
	        this.lineNumber = (code.length > 0) ? 1 : 0;
	        this.lineStart = 0;
	        this.curlyStack = [];
	    }
	    Scanner.prototype.saveState = function () {
	        return {
	            index: this.index,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart
	        };
	    };
	    Scanner.prototype.restoreState = function (state) {
	        this.index = state.index;
	        this.lineNumber = state.lineNumber;
	        this.lineStart = state.lineStart;
	    };
	    Scanner.prototype.eof = function () {
	        return this.index >= this.length;
	    };
	    Scanner.prototype.throwUnexpectedToken = function (message) {
	        if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
	        return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
	    };
	    Scanner.prototype.tolerateUnexpectedToken = function (message) {
	        if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
	        this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
	    };
	    // https://tc39.github.io/ecma262/#sec-comments
	    Scanner.prototype.skipSingleLineComment = function (offset) {
	        var comments = [];
	        var start, loc;
	        if (this.trackComment) {
	            comments = [];
	            start = this.index - offset;
	            loc = {
	                start: {
	                    line: this.lineNumber,
	                    column: this.index - this.lineStart - offset
	                },
	                end: {}
	            };
	        }
	        while (!this.eof()) {
	            var ch = this.source.charCodeAt(this.index);
	            ++this.index;
	            if (character_1.Character.isLineTerminator(ch)) {
	                if (this.trackComment) {
	                    loc.end = {
	                        line: this.lineNumber,
	                        column: this.index - this.lineStart - 1
	                    };
	                    var entry = {
	                        multiLine: false,
	                        slice: [start + offset, this.index - 1],
	                        range: [start, this.index - 1],
	                        loc: loc
	                    };
	                    comments.push(entry);
	                }
	                if (ch === 13 && this.source.charCodeAt(this.index) === 10) {
	                    ++this.index;
	                }
	                ++this.lineNumber;
	                this.lineStart = this.index;
	                return comments;
	            }
	        }
	        if (this.trackComment) {
	            loc.end = {
	                line: this.lineNumber,
	                column: this.index - this.lineStart
	            };
	            var entry = {
	                multiLine: false,
	                slice: [start + offset, this.index],
	                range: [start, this.index],
	                loc: loc
	            };
	            comments.push(entry);
	        }
	        return comments;
	    };
	    Scanner.prototype.skipMultiLineComment = function () {
	        var comments = [];
	        var start, loc;
	        if (this.trackComment) {
	            comments = [];
	            start = this.index - 2;
	            loc = {
	                start: {
	                    line: this.lineNumber,
	                    column: this.index - this.lineStart - 2
	                },
	                end: {}
	            };
	        }
	        while (!this.eof()) {
	            var ch = this.source.charCodeAt(this.index);
	            if (character_1.Character.isLineTerminator(ch)) {
	                if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) {
	                    ++this.index;
	                }
	                ++this.lineNumber;
	                ++this.index;
	                this.lineStart = this.index;
	            }
	            else if (ch === 0x2A) {
	                // Block comment ends with '*/'.
	                if (this.source.charCodeAt(this.index + 1) === 0x2F) {
	                    this.index += 2;
	                    if (this.trackComment) {
	                        loc.end = {
	                            line: this.lineNumber,
	                            column: this.index - this.lineStart
	                        };
	                        var entry = {
	                            multiLine: true,
	                            slice: [start + 2, this.index - 2],
	                            range: [start, this.index],
	                            loc: loc
	                        };
	                        comments.push(entry);
	                    }
	                    return comments;
	                }
	                ++this.index;
	            }
	            else {
	                ++this.index;
	            }
	        }
	        // Ran off the end of the file - the whole thing is a comment
	        if (this.trackComment) {
	            loc.end = {
	                line: this.lineNumber,
	                column: this.index - this.lineStart
	            };
	            var entry = {
	                multiLine: true,
	                slice: [start + 2, this.index],
	                range: [start, this.index],
	                loc: loc
	            };
	            comments.push(entry);
	        }
	        this.tolerateUnexpectedToken();
	        return comments;
	    };
	    Scanner.prototype.scanComments = function () {
	        var comments;
	        if (this.trackComment) {
	            comments = [];
	        }
	        var start = (this.index === 0);
	        while (!this.eof()) {
	            var ch = this.source.charCodeAt(this.index);
	            if (character_1.Character.isWhiteSpace(ch)) {
	                ++this.index;
	            }
	            else if (character_1.Character.isLineTerminator(ch)) {
	                ++this.index;
	                if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) {
	                    ++this.index;
	                }
	                ++this.lineNumber;
	                this.lineStart = this.index;
	                start = true;
	            }
	            else if (ch === 0x2F) {
	                ch = this.source.charCodeAt(this.index + 1);
	                if (ch === 0x2F) {
	                    this.index += 2;
	                    var comment = this.skipSingleLineComment(2);
	                    if (this.trackComment) {
	                        comments = comments.concat(comment);
	                    }
	                    start = true;
	                }
	                else if (ch === 0x2A) {
	                    this.index += 2;
	                    var comment = this.skipMultiLineComment();
	                    if (this.trackComment) {
	                        comments = comments.concat(comment);
	                    }
	                }
	                else {
	                    break;
	                }
	            }
	            else if (start && ch === 0x2D) {
	                // U+003E is '>'
	                if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) {
	                    // '-->' is a single-line comment
	                    this.index += 3;
	                    var comment = this.skipSingleLineComment(3);
	                    if (this.trackComment) {
	                        comments = comments.concat(comment);
	                    }
	                }
	                else {
	                    break;
	                }
	            }
	            else if (ch === 0x3C && !this.isModule) {
	                if (this.source.slice(this.index + 1, this.index + 4) === '!--') {
	                    this.index += 4; // `<!--`
	                    var comment = this.skipSingleLineComment(4);
	                    if (this.trackComment) {
	                        comments = comments.concat(comment);
	                    }
	                }
	                else {
	                    break;
	                }
	            }
	            else {
	                break;
	            }
	        }
	        return comments;
	    };
	    // https://tc39.github.io/ecma262/#sec-future-reserved-words
	    Scanner.prototype.isFutureReservedWord = function (id) {
	        switch (id) {
	            case 'enum':
	            case 'export':
	            case 'import':
	            case 'super':
	                return true;
	            default:
	                return false;
	        }
	    };
	    Scanner.prototype.isStrictModeReservedWord = function (id) {
	        switch (id) {
	            case 'implements':
	            case 'interface':
	            case 'package':
	            case 'private':
	            case 'protected':
	            case 'public':
	            case 'static':
	            case 'yield':
	            case 'let':
	                return true;
	            default:
	                return false;
	        }
	    };
	    Scanner.prototype.isRestrictedWord = function (id) {
	        return id === 'eval' || id === 'arguments';
	    };
	    // https://tc39.github.io/ecma262/#sec-keywords
	    Scanner.prototype.isKeyword = function (id) {
	        switch (id.length) {
	            case 2:
	                return (id === 'if') || (id === 'in') || (id === 'do');
	            case 3:
	                return (id === 'var') || (id === 'for') || (id === 'new') ||
	                    (id === 'try') || (id === 'let');
	            case 4:
	                return (id === 'this') || (id === 'else') || (id === 'case') ||
	                    (id === 'void') || (id === 'with') || (id === 'enum');
	            case 5:
	                return (id === 'while') || (id === 'break') || (id === 'catch') ||
	                    (id === 'throw') || (id === 'const') || (id === 'yield') ||
	                    (id === 'class') || (id === 'super');
	            case 6:
	                return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
	                    (id === 'switch') || (id === 'export') || (id === 'import');
	            case 7:
	                return (id === 'default') || (id === 'finally') || (id === 'extends');
	            case 8:
	                return (id === 'function') || (id === 'continue') || (id === 'debugger');
	            case 10:
	                return (id === 'instanceof');
	            default:
	                return false;
	        }
	    };
	    Scanner.prototype.codePointAt = function (i) {
	        var cp = this.source.charCodeAt(i);
	        if (cp >= 0xD800 && cp <= 0xDBFF) {
	            var second = this.source.charCodeAt(i + 1);
	            if (second >= 0xDC00 && second <= 0xDFFF) {
	                var first = cp;
	                cp = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
	            }
	        }
	        return cp;
	    };
	    Scanner.prototype.scanHexEscape = function (prefix) {
	        var len = (prefix === 'u') ? 4 : 2;
	        var code = 0;
	        for (var i = 0; i < len; ++i) {
	            if (!this.eof() && character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {
	                code = code * 16 + hexValue(this.source[this.index++]);
	            }
	            else {
	                return null;
	            }
	        }
	        return String.fromCharCode(code);
	    };
	    Scanner.prototype.scanUnicodeCodePointEscape = function () {
	        var ch = this.source[this.index];
	        var code = 0;
	        // At least, one hex digit is required.
	        if (ch === '}') {
	            this.throwUnexpectedToken();
	        }
	        while (!this.eof()) {
	            ch = this.source[this.index++];
	            if (!character_1.Character.isHexDigit(ch.charCodeAt(0))) {
	                break;
	            }
	            code = code * 16 + hexValue(ch);
	        }
	        if (code > 0x10FFFF || ch !== '}') {
	            this.throwUnexpectedToken();
	        }
	        return character_1.Character.fromCodePoint(code);
	    };
	    Scanner.prototype.getIdentifier = function () {
	        var start = this.index++;
	        while (!this.eof()) {
	            var ch = this.source.charCodeAt(this.index);
	            if (ch === 0x5C) {
	                // Blackslash (U+005C) marks Unicode escape sequence.
	                this.index = start;
	                return this.getComplexIdentifier();
	            }
	            else if (ch >= 0xD800 && ch < 0xDFFF) {
	                // Need to handle surrogate pairs.
	                this.index = start;
	                return this.getComplexIdentifier();
	            }
	            if (character_1.Character.isIdentifierPart(ch)) {
	                ++this.index;
	            }
	            else {
	                break;
	            }
	        }
	        return this.source.slice(start, this.index);
	    };
	    Scanner.prototype.getComplexIdentifier = function () {
	        var cp = this.codePointAt(this.index);
	        var id = character_1.Character.fromCodePoint(cp);
	        this.index += id.length;
	        // '\u' (U+005C, U+0075) denotes an escaped character.
	        var ch;
	        if (cp === 0x5C) {
	            if (this.source.charCodeAt(this.index) !== 0x75) {
	                this.throwUnexpectedToken();
	            }
	            ++this.index;
	            if (this.source[this.index] === '{') {
	                ++this.index;
	                ch = this.scanUnicodeCodePointEscape();
	            }
	            else {
	                ch = this.scanHexEscape('u');
	                if (ch === null || ch === '\\' || !character_1.Character.isIdentifierStart(ch.charCodeAt(0))) {
	                    this.throwUnexpectedToken();
	                }
	            }
	            id = ch;
	        }
	        while (!this.eof()) {
	            cp = this.codePointAt(this.index);
	            if (!character_1.Character.isIdentifierPart(cp)) {
	                break;
	            }
	            ch = character_1.Character.fromCodePoint(cp);
	            id += ch;
	            this.index += ch.length;
	            // '\u' (U+005C, U+0075) denotes an escaped character.
	            if (cp === 0x5C) {
	                id = id.substr(0, id.length - 1);
	                if (this.source.charCodeAt(this.index) !== 0x75) {
	                    this.throwUnexpectedToken();
	                }
	                ++this.index;
	                if (this.source[this.index] === '{') {
	                    ++this.index;
	                    ch = this.scanUnicodeCodePointEscape();
	                }
	                else {
	                    ch = this.scanHexEscape('u');
	                    if (ch === null || ch === '\\' || !character_1.Character.isIdentifierPart(ch.charCodeAt(0))) {
	                        this.throwUnexpectedToken();
	                    }
	                }
	                id += ch;
	            }
	        }
	        return id;
	    };
	    Scanner.prototype.octalToDecimal = function (ch) {
	        // \0 is not octal escape sequence
	        var octal = (ch !== '0');
	        var code = octalValue(ch);
	        if (!this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
	            octal = true;
	            code = code * 8 + octalValue(this.source[this.index++]);
	            // 3 digits are only allowed when string starts
	            // with 0, 1, 2, 3
	            if ('0123'.indexOf(ch) >= 0 && !this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
	                code = code * 8 + octalValue(this.source[this.index++]);
	            }
	        }
	        return {
	            code: code,
	            octal: octal
	        };
	    };
	    // https://tc39.github.io/ecma262/#sec-names-and-keywords
	    Scanner.prototype.scanIdentifier = function () {
	        var type;
	        var start = this.index;
	        // Backslash (U+005C) starts an escaped character.
	        var id = (this.source.charCodeAt(start) === 0x5C) ? this.getComplexIdentifier() : this.getIdentifier();
	        // There is no keyword or literal with only one character.
	        // Thus, it must be an identifier.
	        if (id.length === 1) {
	            type = 3 /* Identifier */;
	        }
	        else if (this.isKeyword(id)) {
	            type = 4 /* Keyword */;
	        }
	        else if (id === 'null') {
	            type = 5 /* NullLiteral */;
	        }
	        else if (id === 'true' || id === 'false') {
	            type = 1 /* BooleanLiteral */;
	        }
	        else {
	            type = 3 /* Identifier */;
	        }
	        if (type !== 3 /* Identifier */ && (start + id.length !== this.index)) {
	            var restore = this.index;
	            this.index = start;
	            this.tolerateUnexpectedToken(messages_1.Messages.InvalidEscapedReservedWord);
	            this.index = restore;
	        }
	        return {
	            type: type,
	            value: id,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    // https://tc39.github.io/ecma262/#sec-punctuators
	    Scanner.prototype.scanPunctuator = function () {
	        var start = this.index;
	        // Check for most common single-character punctuators.
	        var str = this.source[this.index];
	        switch (str) {
	            case '(':
	            case '{':
	                if (str === '{') {
	                    this.curlyStack.push('{');
	                }
	                ++this.index;
	                break;
	            case '.':
	                ++this.index;
	                if (this.source[this.index] === '.' && this.source[this.index + 1] === '.') {
	                    // Spread operator: ...
	                    this.index += 2;
	                    str = '...';
	                }
	                break;
	            case '}':
	                ++this.index;
	                this.curlyStack.pop();
	                break;
	            case ')':
	            case ';':
	            case ',':
	            case '[':
	            case ']':
	            case ':':
	            case '?':
	            case '~':
	                ++this.index;
	                break;
	            default:
	                // 4-character punctuator.
	                str = this.source.substr(this.index, 4);
	                if (str === '>>>=') {
	                    this.index += 4;
	                }
	                else {
	                    // 3-character punctuators.
	                    str = str.substr(0, 3);
	                    if (str === '===' || str === '!==' || str === '>>>' ||
	                        str === '<<=' || str === '>>=' || str === '**=') {
	                        this.index += 3;
	                    }
	                    else {
	                        // 2-character punctuators.
	                        str = str.substr(0, 2);
	                        if (str === '&&' || str === '||' || str === '==' || str === '!=' ||
	                            str === '+=' || str === '-=' || str === '*=' || str === '/=' ||
	                            str === '++' || str === '--' || str === '<<' || str === '>>' ||
	                            str === '&=' || str === '|=' || str === '^=' || str === '%=' ||
	                            str === '<=' || str === '>=' || str === '=>' || str === '**') {
	                            this.index += 2;
	                        }
	                        else {
	                            // 1-character punctuators.
	                            str = this.source[this.index];
	                            if ('<>=!+-*%&|^/'.indexOf(str) >= 0) {
	                                ++this.index;
	                            }
	                        }
	                    }
	                }
	        }
	        if (this.index === start) {
	            this.throwUnexpectedToken();
	        }
	        return {
	            type: 7 /* Punctuator */,
	            value: str,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    // https://tc39.github.io/ecma262/#sec-literals-numeric-literals
	    Scanner.prototype.scanHexLiteral = function (start) {
	        var num = '';
	        while (!this.eof()) {
	            if (!character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {
	                break;
	            }
	            num += this.source[this.index++];
	        }
	        if (num.length === 0) {
	            this.throwUnexpectedToken();
	        }
	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {
	            this.throwUnexpectedToken();
	        }
	        return {
	            type: 6 /* NumericLiteral */,
	            value: parseInt('0x' + num, 16),
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    Scanner.prototype.scanBinaryLiteral = function (start) {
	        var num = '';
	        var ch;
	        while (!this.eof()) {
	            ch = this.source[this.index];
	            if (ch !== '0' && ch !== '1') {
	                break;
	            }
	            num += this.source[this.index++];
	        }
	        if (num.length === 0) {
	            // only 0b or 0B
	            this.throwUnexpectedToken();
	        }
	        if (!this.eof()) {
	            ch = this.source.charCodeAt(this.index);
	            /* istanbul ignore else */
	            if (character_1.Character.isIdentifierStart(ch) || character_1.Character.isDecimalDigit(ch)) {
	                this.throwUnexpectedToken();
	            }
	        }
	        return {
	            type: 6 /* NumericLiteral */,
	            value: parseInt(num, 2),
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    Scanner.prototype.scanOctalLiteral = function (prefix, start) {
	        var num = '';
	        var octal = false;
	        if (character_1.Character.isOctalDigit(prefix.charCodeAt(0))) {
	            octal = true;
	            num = '0' + this.source[this.index++];
	        }
	        else {
	            ++this.index;
	        }
	        while (!this.eof()) {
	            if (!character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {
	                break;
	            }
	            num += this.source[this.index++];
	        }
	        if (!octal && num.length === 0) {
	            // only 0o or 0O
	            this.throwUnexpectedToken();
	        }
	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index)) || character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
	            this.throwUnexpectedToken();
	        }
	        return {
	            type: 6 /* NumericLiteral */,
	            value: parseInt(num, 8),
	            octal: octal,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    Scanner.prototype.isImplicitOctalLiteral = function () {
	        // Implicit octal, unless there is a non-octal digit.
	        // (Annex B.1.1 on Numeric Literals)
	        for (var i = this.index + 1; i < this.length; ++i) {
	            var ch = this.source[i];
	            if (ch === '8' || ch === '9') {
	                return false;
	            }
	            if (!character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
	                return true;
	            }
	        }
	        return true;
	    };
	    Scanner.prototype.scanNumericLiteral = function () {
	        var start = this.index;
	        var ch = this.source[start];
	        assert_1.assert(character_1.Character.isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'), 'Numeric literal must start with a decimal digit or a decimal point');
	        var num = '';
	        if (ch !== '.') {
	            num = this.source[this.index++];
	            ch = this.source[this.index];
	            // Hex number starts with '0x'.
	            // Octal number starts with '0'.
	            // Octal number in ES6 starts with '0o'.
	            // Binary number in ES6 starts with '0b'.
	            if (num === '0') {
	                if (ch === 'x' || ch === 'X') {
	                    ++this.index;
	                    return this.scanHexLiteral(start);
	                }
	                if (ch === 'b' || ch === 'B') {
	                    ++this.index;
	                    return this.scanBinaryLiteral(start);
	                }
	                if (ch === 'o' || ch === 'O') {
	                    return this.scanOctalLiteral(ch, start);
	                }
	                if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
	                    if (this.isImplicitOctalLiteral()) {
	                        return this.scanOctalLiteral(ch, start);
	                    }
	                }
	            }
	            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
	                num += this.source[this.index++];
	            }
	            ch = this.source[this.index];
	        }
	        if (ch === '.') {
	            num += this.source[this.index++];
	            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
	                num += this.source[this.index++];
	            }
	            ch = this.source[this.index];
	        }
	        if (ch === 'e' || ch === 'E') {
	            num += this.source[this.index++];
	            ch = this.source[this.index];
	            if (ch === '+' || ch === '-') {
	                num += this.source[this.index++];
	            }
	            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
	                while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
	                    num += this.source[this.index++];
	                }
	            }
	            else {
	                this.throwUnexpectedToken();
	            }
	        }
	        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {
	            this.throwUnexpectedToken();
	        }
	        return {
	            type: 6 /* NumericLiteral */,
	            value: parseFloat(num),
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    // https://tc39.github.io/ecma262/#sec-literals-string-literals
	    Scanner.prototype.scanStringLiteral = function () {
	        var start = this.index;
	        var quote = this.source[start];
	        assert_1.assert((quote === '\'' || quote === '"'), 'String literal must starts with a quote');
	        ++this.index;
	        var octal = false;
	        var str = '';
	        while (!this.eof()) {
	            var ch = this.source[this.index++];
	            if (ch === quote) {
	                quote = '';
	                break;
	            }
	            else if (ch === '\\') {
	                ch = this.source[this.index++];
	                if (!ch || !character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                    switch (ch) {
	                        case 'u':
	                            if (this.source[this.index] === '{') {
	                                ++this.index;
	                                str += this.scanUnicodeCodePointEscape();
	                            }
	                            else {
	                                var unescaped_1 = this.scanHexEscape(ch);
	                                if (unescaped_1 === null) {
	                                    this.throwUnexpectedToken();
	                                }
	                                str += unescaped_1;
	                            }
	                            break;
	                        case 'x':
	                            var unescaped = this.scanHexEscape(ch);
	                            if (unescaped === null) {
	                                this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence);
	                            }
	                            str += unescaped;
	                            break;
	                        case 'n':
	                            str += '\n';
	                            break;
	                        case 'r':
	                            str += '\r';
	                            break;
	                        case 't':
	                            str += '\t';
	                            break;
	                        case 'b':
	                            str += '\b';
	                            break;
	                        case 'f':
	                            str += '\f';
	                            break;
	                        case 'v':
	                            str += '\x0B';
	                            break;
	                        case '8':
	                        case '9':
	                            str += ch;
	                            this.tolerateUnexpectedToken();
	                            break;
	                        default:
	                            if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
	                                var octToDec = this.octalToDecimal(ch);
	                                octal = octToDec.octal || octal;
	                                str += String.fromCharCode(octToDec.code);
	                            }
	                            else {
	                                str += ch;
	                            }
	                            break;
	                    }
	                }
	                else {
	                    ++this.lineNumber;
	                    if (ch === '\r' && this.source[this.index] === '\n') {
	                        ++this.index;
	                    }
	                    this.lineStart = this.index;
	                }
	            }
	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                break;
	            }
	            else {
	                str += ch;
	            }
	        }
	        if (quote !== '') {
	            this.index = start;
	            this.throwUnexpectedToken();
	        }
	        return {
	            type: 8 /* StringLiteral */,
	            value: str,
	            octal: octal,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    // https://tc39.github.io/ecma262/#sec-template-literal-lexical-components
	    Scanner.prototype.scanTemplate = function () {
	        var cooked = '';
	        var terminated = false;
	        var start = this.index;
	        var head = (this.source[start] === '`');
	        var tail = false;
	        var rawOffset = 2;
	        ++this.index;
	        while (!this.eof()) {
	            var ch = this.source[this.index++];
	            if (ch === '`') {
	                rawOffset = 1;
	                tail = true;
	                terminated = true;
	                break;
	            }
	            else if (ch === '$') {
	                if (this.source[this.index] === '{') {
	                    this.curlyStack.push('${');
	                    ++this.index;
	                    terminated = true;
	                    break;
	                }
	                cooked += ch;
	            }
	            else if (ch === '\\') {
	                ch = this.source[this.index++];
	                if (!character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                    switch (ch) {
	                        case 'n':
	                            cooked += '\n';
	                            break;
	                        case 'r':
	                            cooked += '\r';
	                            break;
	                        case 't':
	                            cooked += '\t';
	                            break;
	                        case 'u':
	                            if (this.source[this.index] === '{') {
	                                ++this.index;
	                                cooked += this.scanUnicodeCodePointEscape();
	                            }
	                            else {
	                                var restore = this.index;
	                                var unescaped_2 = this.scanHexEscape(ch);
	                                if (unescaped_2 !== null) {
	                                    cooked += unescaped_2;
	                                }
	                                else {
	                                    this.index = restore;
	                                    cooked += ch;
	                                }
	                            }
	                            break;
	                        case 'x':
	                            var unescaped = this.scanHexEscape(ch);
	                            if (unescaped === null) {
	                                this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence);
	                            }
	                            cooked += unescaped;
	                            break;
	                        case 'b':
	                            cooked += '\b';
	                            break;
	                        case 'f':
	                            cooked += '\f';
	                            break;
	                        case 'v':
	                            cooked += '\v';
	                            break;
	                        default:
	                            if (ch === '0') {
	                                if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {
	                                    // Illegal: \01 \02 and so on
	                                    this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);
	                                }
	                                cooked += '\0';
	                            }
	                            else if (character_1.Character.isOctalDigit(ch.charCodeAt(0))) {
	                                // Illegal: \1 \2
	                                this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);
	                            }
	                            else {
	                                cooked += ch;
	                            }
	                            break;
	                    }
	                }
	                else {
	                    ++this.lineNumber;
	                    if (ch === '\r' && this.source[this.index] === '\n') {
	                        ++this.index;
	                    }
	                    this.lineStart = this.index;
	                }
	            }
	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                ++this.lineNumber;
	                if (ch === '\r' && this.source[this.index] === '\n') {
	                    ++this.index;
	                }
	                this.lineStart = this.index;
	                cooked += '\n';
	            }
	            else {
	                cooked += ch;
	            }
	        }
	        if (!terminated) {
	            this.throwUnexpectedToken();
	        }
	        if (!head) {
	            this.curlyStack.pop();
	        }
	        return {
	            type: 10 /* Template */,
	            value: this.source.slice(start + 1, this.index - rawOffset),
	            cooked: cooked,
	            head: head,
	            tail: tail,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals
	    Scanner.prototype.testRegExp = function (pattern, flags) {
	        // The BMP character to use as a replacement for astral symbols when
	        // translating an ES6 "u"-flagged pattern to an ES5-compatible
	        // approximation.
	        // Note: replacing with '\uFFFF' enables false positives in unlikely
	        // scenarios. For example, `[\u{1044f}-\u{10440}]` is an invalid
	        // pattern that would not be detected by this substitution.
	        var astralSubstitute = '\uFFFF';
	        var tmp = pattern;
	        var self = this;
	        if (flags.indexOf('u') >= 0) {
	            tmp = tmp
	                .replace(/\\u\{([0-9a-fA-F]+)\}|\\u([a-fA-F0-9]{4})/g, function ($0, $1, $2) {
	                var codePoint = parseInt($1 || $2, 16);
	                if (codePoint > 0x10FFFF) {
	                    self.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);
	                }
	                if (codePoint <= 0xFFFF) {
	                    return String.fromCharCode(codePoint);
	                }
	                return astralSubstitute;
	            })
	                .replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, astralSubstitute);
	        }
	        // First, detect invalid regular expressions.
	        try {
	            RegExp(tmp);
	        }
	        catch (e) {
	            this.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);
	        }
	        // Return a regular expression object for this pattern-flag pair, or
	        // `null` in case the current environment doesn't support the flags it
	        // uses.
	        try {
	            return new RegExp(pattern, flags);
	        }
	        catch (exception) {
	            /* istanbul ignore next */
	            return null;
	        }
	    };
	    Scanner.prototype.scanRegExpBody = function () {
	        var ch = this.source[this.index];
	        assert_1.assert(ch === '/', 'Regular expression literal must start with a slash');
	        var str = this.source[this.index++];
	        var classMarker = false;
	        var terminated = false;
	        while (!this.eof()) {
	            ch = this.source[this.index++];
	            str += ch;
	            if (ch === '\\') {
	                ch = this.source[this.index++];
	                // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals
	                if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                    this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
	                }
	                str += ch;
	            }
	            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {
	                this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
	            }
	            else if (classMarker) {
	                if (ch === ']') {
	                    classMarker = false;
	                }
	            }
	            else {
	                if (ch === '/') {
	                    terminated = true;
	                    break;
	                }
	                else if (ch === '[') {
	                    classMarker = true;
	                }
	            }
	        }
	        if (!terminated) {
	            this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);
	        }
	        // Exclude leading and trailing slash.
	        return str.substr(1, str.length - 2);
	    };
	    Scanner.prototype.scanRegExpFlags = function () {
	        var str = '';
	        var flags = '';
	        while (!this.eof()) {
	            var ch = this.source[this.index];
	            if (!character_1.Character.isIdentifierPart(ch.charCodeAt(0))) {
	                break;
	            }
	            ++this.index;
	            if (ch === '\\' && !this.eof()) {
	                ch = this.source[this.index];
	                if (ch === 'u') {
	                    ++this.index;
	                    var restore = this.index;
	                    var char = this.scanHexEscape('u');
	                    if (char !== null) {
	                        flags += char;
	                        for (str += '\\u'; restore < this.index; ++restore) {
	                            str += this.source[restore];
	                        }
	                    }
	                    else {
	                        this.index = restore;
	                        flags += 'u';
	                        str += '\\u';
	                    }
	                    this.tolerateUnexpectedToken();
	                }
	                else {
	                    str += '\\';
	                    this.tolerateUnexpectedToken();
	                }
	            }
	            else {
	                flags += ch;
	                str += ch;
	            }
	        }
	        return flags;
	    };
	    Scanner.prototype.scanRegExp = function () {
	        var start = this.index;
	        var pattern = this.scanRegExpBody();
	        var flags = this.scanRegExpFlags();
	        var value = this.testRegExp(pattern, flags);
	        return {
	            type: 9 /* RegularExpression */,
	            value: '',
	            pattern: pattern,
	            flags: flags,
	            regex: value,
	            lineNumber: this.lineNumber,
	            lineStart: this.lineStart,
	            start: start,
	            end: this.index
	        };
	    };
	    Scanner.prototype.lex = function () {
	        if (this.eof()) {
	            return {
	                type: 2 /* EOF */,
	                value: '',
	                lineNumber: this.lineNumber,
	                lineStart: this.lineStart,
	                start: this.index,
	                end: this.index
	            };
	        }
	        var cp = this.source.charCodeAt(this.index);
	        if (character_1.Character.isIdentifierStart(cp)) {
	            return this.scanIdentifier();
	        }
	        // Very common: ( and ) and ;
	        if (cp === 0x28 || cp === 0x29 || cp === 0x3B) {
	            return this.scanPunctuator();
	        }
	        // String literal starts with single quote (U+0027) or double quote (U+0022).
	        if (cp === 0x27 || cp === 0x22) {
	            return this.scanStringLiteral();
	        }
	        // Dot (.) U+002E can also start a floating-point number, hence the need
	        // to check the next character.
	        if (cp === 0x2E) {
	            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index + 1))) {
	                return this.scanNumericLiteral();
	            }
	            return this.scanPunctuator();
	        }
	        if (character_1.Character.isDecimalDigit(cp)) {
	            return this.scanNumericLiteral();
	        }
	        // Template literals start with ` (U+0060) for template head
	        // or } (U+007D) for template middle or template tail.
	        if (cp === 0x60 || (cp === 0x7D && this.curlyStack[this.curlyStack.length - 1] === '${')) {
	            return this.scanTemplate();
	        }
	        // Possible identifier start in a surrogate pair.
	        if (cp >= 0xD800 && cp < 0xDFFF) {
	            if (character_1.Character.isIdentifierStart(this.codePointAt(this.index))) {
	                return this.scanIdentifier();
	            }
	        }
	        return this.scanPunctuator();
	    };
	    return Scanner;
	}());
	exports.Scanner = Scanner;


/***/ },
/* 13 */
/***/ function(module, exports) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	exports.TokenName = {};
	exports.TokenName[1 /* BooleanLiteral */] = 'Boolean';
	exports.TokenName[2 /* EOF */] = '<end>';
	exports.TokenName[3 /* Identifier */] = 'Identifier';
	exports.TokenName[4 /* Keyword */] = 'Keyword';
	exports.TokenName[5 /* NullLiteral */] = 'Null';
	exports.TokenName[6 /* NumericLiteral */] = 'Numeric';
	exports.TokenName[7 /* Punctuator */] = 'Punctuator';
	exports.TokenName[8 /* StringLiteral */] = 'String';
	exports.TokenName[9 /* RegularExpression */] = 'RegularExpression';
	exports.TokenName[10 /* Template */] = 'Template';


/***/ },
/* 14 */
/***/ function(module, exports) {

	"use strict";
	// Generated by generate-xhtml-entities.js. DO NOT MODIFY!
	Object.defineProperty(exports, "__esModule", { value: true });
	exports.XHTMLEntities = {
	    quot: '\u0022',
	    amp: '\u0026',
	    apos: '\u0027',
	    gt: '\u003E',
	    nbsp: '\u00A0',
	    iexcl: '\u00A1',
	    cent: '\u00A2',
	    pound: '\u00A3',
	    curren: '\u00A4',
	    yen: '\u00A5',
	    brvbar: '\u00A6',
	    sect: '\u00A7',
	    uml: '\u00A8',
	    copy: '\u00A9',
	    ordf: '\u00AA',
	    laquo: '\u00AB',
	    not: '\u00AC',
	    shy: '\u00AD',
	    reg: '\u00AE',
	    macr: '\u00AF',
	    deg: '\u00B0',
	    plusmn: '\u00B1',
	    sup2: '\u00B2',
	    sup3: '\u00B3',
	    acute: '\u00B4',
	    micro: '\u00B5',
	    para: '\u00B6',
	    middot: '\u00B7',
	    cedil: '\u00B8',
	    sup1: '\u00B9',
	    ordm: '\u00BA',
	    raquo: '\u00BB',
	    frac14: '\u00BC',
	    frac12: '\u00BD',
	    frac34: '\u00BE',
	    iquest: '\u00BF',
	    Agrave: '\u00C0',
	    Aacute: '\u00C1',
	    Acirc: '\u00C2',
	    Atilde: '\u00C3',
	    Auml: '\u00C4',
	    Aring: '\u00C5',
	    AElig: '\u00C6',
	    Ccedil: '\u00C7',
	    Egrave: '\u00C8',
	    Eacute: '\u00C9',
	    Ecirc: '\u00CA',
	    Euml: '\u00CB',
	    Igrave: '\u00CC',
	    Iacute: '\u00CD',
	    Icirc: '\u00CE',
	    Iuml: '\u00CF',
	    ETH: '\u00D0',
	    Ntilde: '\u00D1',
	    Ograve: '\u00D2',
	    Oacute: '\u00D3',
	    Ocirc: '\u00D4',
	    Otilde: '\u00D5',
	    Ouml: '\u00D6',
	    times: '\u00D7',
	    Oslash: '\u00D8',
	    Ugrave: '\u00D9',
	    Uacute: '\u00DA',
	    Ucirc: '\u00DB',
	    Uuml: '\u00DC',
	    Yacute: '\u00DD',
	    THORN: '\u00DE',
	    szlig: '\u00DF',
	    agrave: '\u00E0',
	    aacute: '\u00E1',
	    acirc: '\u00E2',
	    atilde: '\u00E3',
	    auml: '\u00E4',
	    aring: '\u00E5',
	    aelig: '\u00E6',
	    ccedil: '\u00E7',
	    egrave: '\u00E8',
	    eacute: '\u00E9',
	    ecirc: '\u00EA',
	    euml: '\u00EB',
	    igrave: '\u00EC',
	    iacute: '\u00ED',
	    icirc: '\u00EE',
	    iuml: '\u00EF',
	    eth: '\u00F0',
	    ntilde: '\u00F1',
	    ograve: '\u00F2',
	    oacute: '\u00F3',
	    ocirc: '\u00F4',
	    otilde: '\u00F5',
	    ouml: '\u00F6',
	    divide: '\u00F7',
	    oslash: '\u00F8',
	    ugrave: '\u00F9',
	    uacute: '\u00FA',
	    ucirc: '\u00FB',
	    uuml: '\u00FC',
	    yacute: '\u00FD',
	    thorn: '\u00FE',
	    yuml: '\u00FF',
	    OElig: '\u0152',
	    oelig: '\u0153',
	    Scaron: '\u0160',
	    scaron: '\u0161',
	    Yuml: '\u0178',
	    fnof: '\u0192',
	    circ: '\u02C6',
	    tilde: '\u02DC',
	    Alpha: '\u0391',
	    Beta: '\u0392',
	    Gamma: '\u0393',
	    Delta: '\u0394',
	    Epsilon: '\u0395',
	    Zeta: '\u0396',
	    Eta: '\u0397',
	    Theta: '\u0398',
	    Iota: '\u0399',
	    Kappa: '\u039A',
	    Lambda: '\u039B',
	    Mu: '\u039C',
	    Nu: '\u039D',
	    Xi: '\u039E',
	    Omicron: '\u039F',
	    Pi: '\u03A0',
	    Rho: '\u03A1',
	    Sigma: '\u03A3',
	    Tau: '\u03A4',
	    Upsilon: '\u03A5',
	    Phi: '\u03A6',
	    Chi: '\u03A7',
	    Psi: '\u03A8',
	    Omega: '\u03A9',
	    alpha: '\u03B1',
	    beta: '\u03B2',
	    gamma: '\u03B3',
	    delta: '\u03B4',
	    epsilon: '\u03B5',
	    zeta: '\u03B6',
	    eta: '\u03B7',
	    theta: '\u03B8',
	    iota: '\u03B9',
	    kappa: '\u03BA',
	    lambda: '\u03BB',
	    mu: '\u03BC',
	    nu: '\u03BD',
	    xi: '\u03BE',
	    omicron: '\u03BF',
	    pi: '\u03C0',
	    rho: '\u03C1',
	    sigmaf: '\u03C2',
	    sigma: '\u03C3',
	    tau: '\u03C4',
	    upsilon: '\u03C5',
	    phi: '\u03C6',
	    chi: '\u03C7',
	    psi: '\u03C8',
	    omega: '\u03C9',
	    thetasym: '\u03D1',
	    upsih: '\u03D2',
	    piv: '\u03D6',
	    ensp: '\u2002',
	    emsp: '\u2003',
	    thinsp: '\u2009',
	    zwnj: '\u200C',
	    zwj: '\u200D',
	    lrm: '\u200E',
	    rlm: '\u200F',
	    ndash: '\u2013',
	    mdash: '\u2014',
	    lsquo: '\u2018',
	    rsquo: '\u2019',
	    sbquo: '\u201A',
	    ldquo: '\u201C',
	    rdquo: '\u201D',
	    bdquo: '\u201E',
	    dagger: '\u2020',
	    Dagger: '\u2021',
	    bull: '\u2022',
	    hellip: '\u2026',
	    permil: '\u2030',
	    prime: '\u2032',
	    Prime: '\u2033',
	    lsaquo: '\u2039',
	    rsaquo: '\u203A',
	    oline: '\u203E',
	    frasl: '\u2044',
	    euro: '\u20AC',
	    image: '\u2111',
	    weierp: '\u2118',
	    real: '\u211C',
	    trade: '\u2122',
	    alefsym: '\u2135',
	    larr: '\u2190',
	    uarr: '\u2191',
	    rarr: '\u2192',
	    darr: '\u2193',
	    harr: '\u2194',
	    crarr: '\u21B5',
	    lArr: '\u21D0',
	    uArr: '\u21D1',
	    rArr: '\u21D2',
	    dArr: '\u21D3',
	    hArr: '\u21D4',
	    forall: '\u2200',
	    part: '\u2202',
	    exist: '\u2203',
	    empty: '\u2205',
	    nabla: '\u2207',
	    isin: '\u2208',
	    notin: '\u2209',
	    ni: '\u220B',
	    prod: '\u220F',
	    sum: '\u2211',
	    minus: '\u2212',
	    lowast: '\u2217',
	    radic: '\u221A',
	    prop: '\u221D',
	    infin: '\u221E',
	    ang: '\u2220',
	    and: '\u2227',
	    or: '\u2228',
	    cap: '\u2229',
	    cup: '\u222A',
	    int: '\u222B',
	    there4: '\u2234',
	    sim: '\u223C',
	    cong: '\u2245',
	    asymp: '\u2248',
	    ne: '\u2260',
	    equiv: '\u2261',
	    le: '\u2264',
	    ge: '\u2265',
	    sub: '\u2282',
	    sup: '\u2283',
	    nsub: '\u2284',
	    sube: '\u2286',
	    supe: '\u2287',
	    oplus: '\u2295',
	    otimes: '\u2297',
	    perp: '\u22A5',
	    sdot: '\u22C5',
	    lceil: '\u2308',
	    rceil: '\u2309',
	    lfloor: '\u230A',
	    rfloor: '\u230B',
	    loz: '\u25CA',
	    spades: '\u2660',
	    clubs: '\u2663',
	    hearts: '\u2665',
	    diams: '\u2666',
	    lang: '\u27E8',
	    rang: '\u27E9'
	};


/***/ },
/* 15 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";
	Object.defineProperty(exports, "__esModule", { value: true });
	var error_handler_1 = __webpack_require__(10);
	var scanner_1 = __webpack_require__(12);
	var token_1 = __webpack_require__(13);
	var Reader = (function () {
	    function Reader() {
	        this.values = [];
	        this.curly = this.paren = -1;
	    }
	    // A function following one of those tokens is an expression.
	    Reader.prototype.beforeFunctionExpression = function (t) {
	        return ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',
	            'return', 'case', 'delete', 'throw', 'void',
	            // assignment operators
	            '=', '+=', '-=', '*=', '**=', '/=', '%=', '<<=', '>>=', '>>>=',
	            '&=', '|=', '^=', ',',
	            // binary/unary operators
	            '+', '-', '*', '**', '/', '%', '++', '--', '<<', '>>', '>>>', '&',
	            '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',
	            '<=', '<', '>', '!=', '!=='].indexOf(t) >= 0;
	    };
	    // Determine if forward slash (/) is an operator or part of a regular expression
	    // https://github.com/mozilla/sweet.js/wiki/design
	    Reader.prototype.isRegexStart = function () {
	        var previous = this.values[this.values.length - 1];
	        var regex = (previous !== null);
	        switch (previous) {
	            case 'this':
	            case ']':
	                regex = false;
	                break;
	            case ')':
	                var keyword = this.values[this.paren - 1];
	                regex = (keyword === 'if' || keyword === 'while' || keyword === 'for' || keyword === 'with');
	                break;
	            case '}':
	                // Dividing a function by anything makes little sense,
	                // but we have to check for that.
	                regex = false;
	                if (this.values[this.curly - 3] === 'function') {
	                    // Anonymous function, e.g. function(){} /42
	                    var check = this.values[this.curly - 4];
	                    regex = check ? !this.beforeFunctionExpression(check) : false;
	                }
	                else if (this.values[this.curly - 4] === 'function') {
	                    // Named function, e.g. function f(){} /42/
	                    var check = this.values[this.curly - 5];
	                    regex = check ? !this.beforeFunctionExpression(check) : true;
	                }
	                break;
	            default:
	                break;
	        }
	        return regex;
	    };
	    Reader.prototype.push = function (token) {
	        if (token.type === 7 /* Punctuator */ || token.type === 4 /* Keyword */) {
	            if (token.value === '{') {
	                this.curly = this.values.length;
	            }
	            else if (token.value === '(') {
	                this.paren = this.values.length;
	            }
	            this.values.push(token.value);
	        }
	        else {
	            this.values.push(null);
	        }
	    };
	    return Reader;
	}());
	var Tokenizer = (function () {
	    function Tokenizer(code, config) {
	        this.errorHandler = new error_handler_1.ErrorHandler();
	        this.errorHandler.tolerant = config ? (typeof config.tolerant === 'boolean' && config.tolerant) : false;
	        this.scanner = new scanner_1.Scanner(code, this.errorHandler);
	        this.scanner.trackComment = config ? (typeof config.comment === 'boolean' && config.comment) : false;
	        this.trackRange = config ? (typeof config.range === 'boolean' && config.range) : false;
	        this.trackLoc = config ? (typeof config.loc === 'boolean' && config.loc) : false;
	        this.buffer = [];
	        this.reader = new Reader();
	    }
	    Tokenizer.prototype.errors = function () {
	        return this.errorHandler.errors;
	    };
	    Tokenizer.prototype.getNextToken = function () {
	        if (this.buffer.length === 0) {
	            var comments = this.scanner.scanComments();
	            if (this.scanner.trackComment) {
	                for (var i = 0; i < comments.length; ++i) {
	                    var e = comments[i];
	                    var value = this.scanner.source.slice(e.slice[0], e.slice[1]);
	                    var comment = {
	                        type: e.multiLine ? 'BlockComment' : 'LineComment',
	                        value: value
	                    };
	                    if (this.trackRange) {
	                        comment.range = e.range;
	                    }
	                    if (this.trackLoc) {
	                        comment.loc = e.loc;
	                    }
	                    this.buffer.push(comment);
	                }
	            }
	            if (!this.scanner.eof()) {
	                var loc = void 0;
	                if (this.trackLoc) {
	                    loc = {
	                        start: {
	                            line: this.scanner.lineNumber,
	                            column: this.scanner.index - this.scanner.lineStart
	                        },
	                        end: {}
	                    };
	                }
	                var startRegex = (this.scanner.source[this.scanner.index] === '/') && this.reader.isRegexStart();
	                var token = startRegex ? this.scanner.scanRegExp() : this.scanner.lex();
	                this.reader.push(token);
	                var entry = {
	                    type: token_1.TokenName[token.type],
	                    value: this.scanner.source.slice(token.start, token.end)
	                };
	                if (this.trackRange) {
	                    entry.range = [token.start, token.end];
	                }
	                if (this.trackLoc) {
	                    loc.end = {
	                        line: this.scanner.lineNumber,
	                        column: this.scanner.index - this.scanner.lineStart
	                    };
	                    entry.loc = loc;
	                }
	                if (token.type === 9 /* RegularExpression */) {
	                    var pattern = token.pattern;
	                    var flags = token.flags;
	                    entry.regex = { pattern: pattern, flags: flags };
	                }
	                this.buffer.push(entry);
	            }
	        }
	        return this.buffer.shift();
	    };
	    return Tokenizer;
	}());
	exports.Tokenizer = Tokenizer;


/***/ }
/******/ ])
});
;#!/usr/bin/env node
/*
  Copyright JS Foundation and other contributors, https://js.foundation/

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*jslint sloppy:true node:true rhino:true */

var fs, esprima, fname, forceFile, content, options, syntax;

if (typeof require === 'function') {
    fs = require('fs');
    try {
        esprima = require('esprima');
    } catch (e) {
        esprima = require('../');
    }
} else if (typeof load === 'function') {
    try {
        load('esprima.js');
    } catch (e) {
        load('../esprima.js');
    }
}

// Shims to Node.js objects when running under Rhino.
if (typeof console === 'undefined' && typeof process === 'undefined') {
    console = { log: print };
    fs = { readFileSync: readFile };
    process = { argv: arguments, exit: quit };
    process.argv.unshift('esparse.js');
    process.argv.unshift('rhino');
}

function showUsage() {
    console.log('Usage:');
    console.log('   esparse [options] [file.js]');
    console.log();
    console.log('Available options:');
    console.log();
    console.log('  --comment      Gather all line and block comments in an array');
    console.log('  --loc          Include line-column location info for each syntax node');
    console.log('  --range        Include index-based range for each syntax node');
    console.log('  --raw          Display the raw value of literals');
    console.log('  --tokens       List all tokens in an array');
    console.log('  --tolerant     Tolerate errors on a best-effort basis (experimental)');
    console.log('  -v, --version  Shows program version');
    console.log();
    process.exit(1);
}

options = {};

process.argv.splice(2).forEach(function (entry) {

    if (forceFile || entry === '-' || entry.slice(0, 1) !== '-') {
        if (typeof fname === 'string') {
            console.log('Error: more than one input file.');
            process.exit(1);
        } else {
            fname = entry;
        }
    } else if (entry === '-h' || entry === '--help') {
        showUsage();
    } else if (entry === '-v' || entry === '--version') {
        console.log('ECMAScript Parser (using Esprima version', esprima.version, ')');
        console.log();
        process.exit(0);
    } else if (entry === '--comment') {
        options.comment = true;
    } else if (entry === '--loc') {
        options.loc = true;
    } else if (entry === '--range') {
        options.range = true;
    } else if (entry === '--raw') {
        options.raw = true;
    } else if (entry === '--tokens') {
        options.tokens = true;
    } else if (entry === '--tolerant') {
        options.tolerant = true;
    } else if (entry === '--') {
        forceFile = true;
    } else {
        console.log('Error: unknown option ' + entry + '.');
        process.exit(1);
    }
});

// Special handling for regular expression literal since we need to
// convert it to a string literal, otherwise it will be decoded
// as object "{}" and the regular expression would be lost.
function adjustRegexLiteral(key, value) {
    if (key === 'value' && value instanceof RegExp) {
        value = value.toString();
    }
    return value;
}

function run(content) {
    syntax = esprima.parse(content, options);
    console.log(JSON.stringify(syntax, adjustRegexLiteral, 4));
}

try {
    if (fname && (fname !== '-' || forceFile)) {
        run(fs.readFileSync(fname, 'utf-8'));
    } else {
        var content = '';
        process.stdin.resume();
        process.stdin.on('data', function(chunk) {
            content += chunk;
        });
        process.stdin.on('end', function() {
            run(content);
        });
    }
} catch (e) {
    console.log('Error: ' + e.message);
    process.exit(1);
}
#!/usr/bin/env node
/*
  Copyright JS Foundation and other contributors, https://js.foundation/

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*jslint sloppy:true plusplus:true node:true rhino:true */
/*global phantom:true */

var fs, system, esprima, options, fnames, forceFile, count;

if (typeof esprima === 'undefined') {
    // PhantomJS can only require() relative files
    if (typeof phantom === 'object') {
        fs = require('fs');
        system = require('system');
        esprima = require('./esprima');
    } else if (typeof require === 'function') {
        fs = require('fs');
        try {
            esprima = require('esprima');
        } catch (e) {
            esprima = require('../');
        }
    } else if (typeof load === 'function') {
        try {
            load('esprima.js');
        } catch (e) {
            load('../esprima.js');
        }
    }
}

// Shims to Node.js objects when running under PhantomJS 1.7+.
if (typeof phantom === 'object') {
    fs.readFileSync = fs.read;
    process = {
        argv: [].slice.call(system.args),
        exit: phantom.exit,
        on: function (evt, callback) {
            callback();
        }
    };
    process.argv.unshift('phantomjs');
}

// Shims to Node.js objects when running under Rhino.
if (typeof console === 'undefined' && typeof process === 'undefined') {
    console = { log: print };
    fs = { readFileSync: readFile };
    process = {
        argv: arguments,
        exit: quit,
        on: function (evt, callback) {
            callback();
        }
    };
    process.argv.unshift('esvalidate.js');
    process.argv.unshift('rhino');
}

function showUsage() {
    console.log('Usage:');
    console.log('   esvalidate [options] [file.js...]');
    console.log();
    console.log('Available options:');
    console.log();
    console.log('  --format=type  Set the report format, plain (default) or junit');
    console.log('  -v, --version  Print program version');
    console.log();
    process.exit(1);
}

options = {
    format: 'plain'
};

fnames = [];

process.argv.splice(2).forEach(function (entry) {

    if (forceFile || entry === '-' || entry.slice(0, 1) !== '-') {
        fnames.push(entry);
    } else if (entry === '-h' || entry === '--help') {
        showUsage();
    } else if (entry === '-v' || entry === '--version') {
        console.log('ECMAScript Validator (using Esprima version', esprima.version, ')');
        console.log();
        process.exit(0);
    } else if (entry.slice(0, 9) === '--format=') {
        options.format = entry.slice(9);
        if (options.format !== 'plain' && options.format !== 'junit') {
            console.log('Error: unknown report format ' + options.format + '.');
            process.exit(1);
        }
    } else if (entry === '--') {
        forceFile = true;
    } else {
        console.log('Error: unknown option ' + entry + '.');
        process.exit(1);
    }
});

if (fnames.length === 0) {
    fnames.push('');
}

if (options.format === 'junit') {
    console.log('<?xml version="1.0" encoding="UTF-8"?>');
    console.log('<testsuites>');
}

count = 0;

function run(fname, content) {
    var timestamp, syntax, name;
    try {
        if (typeof content !== 'string') {
            throw content;
        }

        if (content[0] === '#' && content[1] === '!') {
            content = '//' + content.substr(2, content.length);
        }

        timestamp = Date.now();
        syntax = esprima.parse(content, { tolerant: true });

        if (options.format === 'junit') {

            name = fname;
            if (name.lastIndexOf('/') >= 0) {
                name = name.slice(name.lastIndexOf('/') + 1);
            }

            console.log('<testsuite name="' + fname + '" errors="0" ' +
                ' failures="' + syntax.errors.length + '" ' +
                ' tests="' + syntax.errors.length + '" ' +
                ' time="' + Math.round((Date.now() - timestamp) / 1000) +
                '">');

            syntax.errors.forEach(function (error) {
                var msg = error.message;
                msg = msg.replace(/^Line\ [0-9]*\:\ /, '');
                console.log('  <testcase name="Line ' + error.lineNumber + ': ' + msg + '" ' +
                    ' time="0">');
                console.log('    <error type="SyntaxError" message="' + error.message + '">' +
                    error.message + '(' + name + ':' + error.lineNumber + ')' +
                    '</error>');
                console.log('  </testcase>');
            });

            console.log('</testsuite>');

        } else if (options.format === 'plain') {

            syntax.errors.forEach(function (error) {
                var msg = error.message;
                msg = msg.replace(/^Line\ [0-9]*\:\ /, '');
                msg = fname + ':' + error.lineNumber + ': ' + msg;
                console.log(msg);
                ++count;
            });

        }
    } catch (e) {
        ++count;
        if (options.format === 'junit') {
            console.log('<testsuite name="' + fname + '" errors="1" failures="0" tests="1" ' +
                ' time="' + Math.round((Date.now() - timestamp) / 1000) + '">');
            console.log(' <testcase name="' + e.message + '" ' + ' time="0">');
            console.log(' <error type="ParseError" message="' + e.message + '">' +
                e.message + '(' + fname + ((e.lineNumber) ? ':' + e.lineNumber : '') +
                ')</error>');
            console.log(' </testcase>');
            console.log('</testsuite>');
        } else {
            console.log(fname + ':' + e.lineNumber + ': ' + e.message.replace(/^Line\ [0-9]*\:\ /, ''));
        }
    }
}

fnames.forEach(function (fname) {
    var content = '';
    try {
        if (fname && (fname !== '-' || forceFile)) {
            content = fs.readFileSync(fname, 'utf-8');
        } else {
            fname = '';
            process.stdin.resume();
            process.stdin.on('data', function(chunk) {
                content += chunk;
            });
            process.stdin.on('end', function() {
                run(fname, content);
            });
            return;
        }
    } catch (e) {
        content = e;
    }
    run(fname, content);
});

process.on('exit', function () {
    if (options.format === 'junit') {
        console.log('</testsuites>');
    }

    if (count > 0) {
        process.exit(1);
    }

    if (count === 0 && typeof phantom === 'object') {
        process.exit(0);
    }
});
'use strict';
const childProcess = require('child_process');
const util = require('util');
const crossSpawn = require('cross-spawn');
const stripEof = require('strip-eof');
const npmRunPath = require('npm-run-path');
const isStream = require('is-stream');
const _getStream = require('get-stream');
const pFinally = require('p-finally');
const onExit = require('signal-exit');
const errname = require('./lib/errname');
const stdio = require('./lib/stdio');

const TEN_MEGABYTES = 1000 * 1000 * 10;

function handleArgs(cmd, args, opts) {
	let parsed;

	if (opts && opts.env && opts.extendEnv !== false) {
		opts.env = Object.assign({}, process.env, opts.env);
	}

	if (opts && opts.__winShell === true) {
		delete opts.__winShell;
		parsed = {
			command: cmd,
			args,
			options: opts,
			file: cmd,
			original: cmd
		};
	} else {
		parsed = crossSpawn._parse(cmd, args, opts);
	}

	opts = Object.assign({
		maxBuffer: TEN_MEGABYTES,
		stripEof: true,
		preferLocal: true,
		localDir: parsed.options.cwd || process.cwd(),
		encoding: 'utf8',
		reject: true,
		cleanup: true
	}, parsed.options);

	opts.stdio = stdio(opts);

	if (opts.preferLocal) {
		opts.env = npmRunPath.env(Object.assign({}, opts, {cwd: opts.localDir}));
	}

	return {
		cmd: parsed.command,
		args: parsed.args,
		opts,
		parsed
	};
}

function handleInput(spawned, opts) {
	const input = opts.input;

	if (input === null || input === undefined) {
		return;
	}

	if (isStream(input)) {
		input.pipe(spawned.stdin);
	} else {
		spawned.stdin.end(input);
	}
}

function handleOutput(opts, val) {
	if (val && opts.stripEof) {
		val = stripEof(val);
	}

	return val;
}

function handleShell(fn, cmd, opts) {
	let file = '/bin/sh';
	let args = ['-c', cmd];

	opts = Object.assign({}, opts);

	if (process.platform === 'win32') {
		opts.__winShell = true;
		file = process.env.comspec || 'cmd.exe';
		args = ['/s', '/c', `"${cmd}"`];
		opts.windowsVerbatimArguments = true;
	}

	if (opts.shell) {
		file = opts.shell;
		delete opts.shell;
	}

	return fn(file, args, opts);
}

function getStream(process, stream, encoding, maxBuffer) {
	if (!process[stream]) {
		return null;
	}

	let ret;

	if (encoding) {
		ret = _getStream(process[stream], {
			encoding,
			maxBuffer
		});
	} else {
		ret = _getStream.buffer(process[stream], {maxBuffer});
	}

	return ret.catch(err => {
		err.stream = stream;
		err.message = `${stream} ${err.message}`;
		throw err;
	});
}

module.exports = (cmd, args, opts) => {
	let joinedCmd = cmd;

	if (Array.isArray(args) && args.length > 0) {
		joinedCmd += ' ' + args.join(' ');
	}

	const parsed = handleArgs(cmd, args, opts);
	const encoding = parsed.opts.encoding;
	const maxBuffer = parsed.opts.maxBuffer;

	let spawned;
	try {
		spawned = childProcess.spawn(parsed.cmd, parsed.args, parsed.opts);
	} catch (err) {
		return Promise.reject(err);
	}

	let removeExitHandler;
	if (parsed.opts.cleanup) {
		removeExitHandler = onExit(() => {
			spawned.kill();
		});
	}

	let timeoutId = null;
	let timedOut = false;

	const cleanupTimeout = () => {
		if (timeoutId) {
			clearTimeout(timeoutId);
			timeoutId = null;
		}
	};

	if (parsed.opts.timeout > 0) {
		timeoutId = setTimeout(() => {
			timeoutId = null;
			timedOut = true;
			spawned.kill(parsed.opts.killSignal);
		}, parsed.opts.timeout);
	}

	const processDone = new Promise(resolve => {
		spawned.on('exit', (code, signal) => {
			cleanupTimeout();
			resolve({code, signal});
		});

		spawned.on('error', err => {
			cleanupTimeout();
			resolve({err});
		});

		if (spawned.stdin) {
			spawned.stdin.on('error', err => {
				cleanupTimeout();
				resolve({err});
			});
		}
	});

	function destroy() {
		if (spawned.stdout) {
			spawned.stdout.destroy();
		}

		if (spawned.stderr) {
			spawned.stderr.destroy();
		}
	}

	const promise = pFinally(Promise.all([
		processDone,
		getStream(spawned, 'stdout', encoding, maxBuffer),
		getStream(spawned, 'stderr', encoding, maxBuffer)
	]).then(arr => {
		const result = arr[0];
		const stdout = arr[1];
		const stderr = arr[2];

		let err = result.err;
		const code = result.code;
		const signal = result.signal;

		if (removeExitHandler) {
			removeExitHandler();
		}

		if (err || code !== 0 || signal !== null) {
			if (!err) {
				let output = '';

				if (Array.isArray(parsed.opts.stdio)) {
					if (parsed.opts.stdio[2] !== 'inherit') {
						output += output.length > 0 ? stderr : `\n${stderr}`;
					}

					if (parsed.opts.stdio[1] !== 'inherit') {
						output += `\n${stdout}`;
					}
				} else if (parsed.opts.stdio !== 'inherit') {
					output = `\n${stderr}${stdout}`;
				}

				err = new Error(`Command failed: ${joinedCmd}${output}`);
				err.code = code < 0 ? errname(code) : code;
			}

			// TODO: missing some timeout logic for killed
			// https://github.com/nodejs/node/blob/master/lib/child_process.js#L203
			// err.killed = spawned.killed || killed;
			err.killed = err.killed || spawned.killed;

			err.stdout = stdout;
			err.stderr = stderr;
			err.failed = true;
			err.signal = signal || null;
			err.cmd = joinedCmd;
			err.timedOut = timedOut;

			if (!parsed.opts.reject) {
				return err;
			}

			throw err;
		}

		return {
			stdout: handleOutput(parsed.opts, stdout),
			stderr: handleOutput(parsed.opts, stderr),
			code: 0,
			failed: false,
			killed: false,
			signal: null,
			cmd: joinedCmd,
			timedOut: false
		};
	}), destroy);

	crossSpawn._enoent.hookChildProcess(spawned, parsed.parsed);

	handleInput(spawned, parsed.opts);

	spawned.then = promise.then.bind(promise);
	spawned.catch = promise.catch.bind(promise);

	return spawned;
};

module.exports.stdout = function () {
	// TODO: set `stderr: 'ignore'` when that option is implemented
	return module.exports.apply(null, arguments).then(x => x.stdout);
};

module.exports.stderr = function () {
	// TODO: set `stdout: 'ignore'` when that option is implemented
	return module.exports.apply(null, arguments).then(x => x.stderr);
};

module.exports.shell = (cmd, opts) => handleShell(module.exports, cmd, opts);

module.exports.sync = (cmd, args, opts) => {
	const parsed = handleArgs(cmd, args, opts);

	if (isStream(parsed.opts.input)) {
		throw new TypeError('The `input` option cannot be a stream in sync mode');
	}

	const result = childProcess.spawnSync(parsed.cmd, parsed.args, parsed.opts);

	if (result.error || result.status !== 0) {
		throw (result.error || new Error(result.stderr === '' ? result.stdout : result.stderr));
	}

	result.stdout = handleOutput(parsed.opts, result.stdout);
	result.stderr = handleOutput(parsed.opts, result.stderr);

	return result;
};

module.exports.shellSync = (cmd, opts) => handleShell(module.exports.sync, cmd, opts);

module.exports.spawn = util.deprecate(module.exports, 'execa.spawn() is deprecated. Use execa() instead.');
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "cross-spawn": "^5.0.1",
    "get-stream": "^3.0.0",
    "is-stream": "^1.1.0",
    "npm-run-path": "^2.0.0",
    "p-finally": "^1.0.0",
    "signal-exit": "^3.0.0",
    "strip-eof": "^1.0.0"
  },
  "deprecated": false,
  "description": "A better `child_process`",
  "devDependencies": {
    "ava": "*",
    "cat-names": "^1.0.2",
    "coveralls": "^2.11.9",
    "delay": "^2.0.0",
    "is-running": "^2.0.0",
    "nyc": "^11.0.2",
    "tempfile": "^2.0.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js",
    "lib"
  ],
  "homepage": "https://github.com/sindresorhus/execa#readme",
  "license": "MIT",
  "maintainers": [
    {
      "name": "James Talmage",
      "email": "james@talmage.io",
      "url": "github.com/jamestalmage"
    }
  ],
  "name": "execa",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/execa.git"
  },
  "version": "0.7.0"
}'use strict';
// The Node team wants to deprecate `process.bind(...)`.
//   https://github.com/nodejs/node/pull/2768
//
// However, we need the 'uv' binding for errname support.
// This is a defensive wrapper around it so `execa` will not fail entirely if it stops working someday.
//
// If this ever stops working. See: https://github.com/sindresorhus/execa/issues/31#issuecomment-215939939 for another possible solution.
let uv;

try {
	uv = process.binding('uv');

	if (typeof uv.errname !== 'function') {
		throw new TypeError('uv.errname is not a function');
	}
} catch (err) {
	console.error('execa/lib/errname: unable to establish process.binding(\'uv\')', err);
	uv = null;
}

function errname(uv, code) {
	if (uv) {
		return uv.errname(code);
	}

	if (!(code < 0)) {
		throw new Error('err >= 0');
	}

	return `Unknown system error ${code}`;
}

module.exports = code => errname(uv, code);

// Used for testing the fallback behavior
module.exports.__test__ = errname;
'use strict';
const alias = ['stdin', 'stdout', 'stderr'];

const hasAlias = opts => alias.some(x => Boolean(opts[x]));

module.exports = opts => {
	if (!opts) {
		return null;
	}

	if (opts.stdio && hasAlias(opts)) {
		throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${alias.map(x => `\`${x}\``).join(', ')}`);
	}

	if (typeof opts.stdio === 'string') {
		return opts.stdio;
	}

	const stdio = opts.stdio || [];

	if (!Array.isArray(stdio)) {
		throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``);
	}

	const result = [];
	const len = Math.max(stdio.length, alias.length);

	for (let i = 0; i < len; i++) {
		let value = null;

		if (stdio[i] !== undefined) {
			value = stdio[i];
		} else if (opts[alias[i]] !== undefined) {
			value = opts[alias[i]];
		}

		result[i] = value;
	}

	return result;
};
root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
{
	"es3": true,

	"additionalRules": [],

	"requireSemicolons": true,

	"disallowMultipleSpaces": true,

	"disallowIdentifierNames": [],

	"requireCurlyBraces": {
		"allExcept": [],
		"keywords": ["if", "else", "for", "while", "do", "try", "catch"]
	},

	"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],

	"disallowSpaceAfterKeywords": [],

	"disallowSpaceBeforeComma": true,
	"disallowSpaceAfterComma": false,
	"disallowSpaceBeforeSemicolon": true,

	"disallowNodeTypes": [
		"DebuggerStatement",
		"LabeledStatement",
		"SwitchCase",
		"SwitchStatement",
		"WithStatement"
	],

	"requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },

	"requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
	"requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
	"disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
	"requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
	"disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },

	"requireSpaceBetweenArguments": true,

	"disallowSpacesInsideParentheses": true,

	"disallowSpacesInsideArrayBrackets": true,

	"disallowQuotedKeysInObjects": { "allExcept": ["reserved"] },

	"disallowSpaceAfterObjectKeys": true,

	"requireCommaBeforeLineBreak": true,

	"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
	"requireSpaceAfterPrefixUnaryOperators": [],

	"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
	"requireSpaceBeforePostfixUnaryOperators": [],

	"disallowSpaceBeforeBinaryOperators": [],
	"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],

	"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
	"disallowSpaceAfterBinaryOperators": [],

	"disallowImplicitTypeConversion": ["binary", "string"],

	"disallowKeywords": ["with", "eval"],

	"requireKeywordsOnNewLine": [],
	"disallowKeywordsOnNewLine": ["else"],

	"requireLineFeedAtFileEnd": true,

	"disallowTrailingWhitespace": true,

	"disallowTrailingComma": true,

	"excludeFiles": ["node_modules/**", "vendor/**"],

	"disallowMultipleLineStrings": true,

	"requireDotNotation": { "allExcept": ["keywords"] },

	"requireParenthesesAroundIIFE": true,

	"validateLineBreaks": "LF",

	"validateQuoteMarks": {
		"escape": true,
		"mark": "'"
	},

	"disallowOperatorBeforeLineBreak": [],

	"requireSpaceBeforeKeywords": [
		"do",
		"for",
		"if",
		"else",
		"switch",
		"case",
		"try",
		"catch",
		"finally",
		"while",
		"with",
		"return"
	],

	"validateAlignedFunctionParameters": {
		"lineBreakAfterOpeningBraces": true,
		"lineBreakBeforeClosingBraces": true
	},

	"requirePaddingNewLinesBeforeExport": true,

	"validateNewlineAfterArrayElements": {
		"maximum": 6
	},

	"requirePaddingNewLinesAfterUseStrict": true,

	"disallowArrowFunctions": true,

	"disallowMultiLineTernary": true,

	"validateOrderInObjectKeys": false,

	"disallowIdenticalDestructuringNames": true,

	"disallowNestedTernaries": { "maxLevel": 1 },

	"requireSpaceAfterComma": { "allExcept": ["trailing"] },
	"requireAlignedMultilineParams": false,

	"requireSpacesInGenerator": {
		"afterStar": true
	},

	"disallowSpacesInGenerator": {
		"beforeStar": true
	},

	"disallowVar": false,

	"requireArrayDestructuring": false,

	"requireEnhancedObjectLiterals": false,

	"requireObjectDestructuring": false,

	"requireEarlyReturn": false,

	"requireCapitalizedConstructorsNew": {
		"allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
	},

	"requireImportAlphabetized": false,

	"requireSpaceBeforeObjectValues": true,
	"requireSpaceBeforeDestructuredValues": true,

	"disallowSpacesInsideTemplateStringPlaceholders": true,

	"disallowArrayDestructuringReturn": false,

	"requireNewlineBeforeSingleStatementsInIf": false,

	"disallowUnusedVariables": true,

	"requireSpacesInsideImportedObjectBraces": true,

	"requireUseStrict": true
}

The MIT License (MIT)

Copyright (c) 2014 Stefan Thomas

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

{
	"name": "extend",
	"author": "Stefan Thomas <justmoon@members.fsf.org> (http://www.justmoon.net)",
	"version": "3.0.0",
	"description": "Port of jQuery.extend for node.js and the browser.",
	"scripts": [
		"index.js"
	],
	"contributors": [
		{
			"name": "Jordan Harband",
			"url": "https://github.com/ljharb"
		}
	],
	"keywords": [
		"extend",
		"clone",
		"merge"
	],
	"repository" : {
		"type": "git",
		"url": "https://github.com/justmoon/node-extend.git"
	},
	"dependencies": {
	},
	"devDependencies": {
		"tape" : "~3.0.0",
		"covert": "~0.4.0",
		"jscs": "~1.6.2"
	}
}

'use strict';

var hasOwn = Object.prototype.hasOwnProperty;
var toStr = Object.prototype.toString;
var defineProperty = Object.defineProperty;
var gOPD = Object.getOwnPropertyDescriptor;

var isArray = function isArray(arr) {
	if (typeof Array.isArray === 'function') {
		return Array.isArray(arr);
	}

	return toStr.call(arr) === '[object Array]';
};

var isPlainObject = function isPlainObject(obj) {
	if (!obj || toStr.call(obj) !== '[object Object]') {
		return false;
	}

	var hasOwnConstructor = hasOwn.call(obj, 'constructor');
	var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');
	// Not own constructor property must be Object
	if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
		return false;
	}

	// Own properties are enumerated firstly, so to speed up,
	// if last one is own, then all properties are own.
	var key;
	for (key in obj) { /**/ }

	return typeof key === 'undefined' || hasOwn.call(obj, key);
};

// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target
var setProperty = function setProperty(target, options) {
	if (defineProperty && options.name === '__proto__') {
		defineProperty(target, options.name, {
			enumerable: true,
			configurable: true,
			value: options.newValue,
			writable: true
		});
	} else {
		target[options.name] = options.newValue;
	}
};

// Return undefined instead of __proto__ if '__proto__' is not an own property
var getProperty = function getProperty(obj, name) {
	if (name === '__proto__') {
		if (!hasOwn.call(obj, name)) {
			return void 0;
		} else if (gOPD) {
			// In early versions of node, obj['__proto__'] is buggy when obj has
			// __proto__ as an own property. Object.getOwnPropertyDescriptor() works.
			return gOPD(obj, name).value;
		}
	}

	return obj[name];
};

module.exports = function extend() {
	var options, name, src, copy, copyIsArray, clone;
	var target = arguments[0];
	var i = 1;
	var length = arguments.length;
	var deep = false;

	// Handle a deep copy situation
	if (typeof target === 'boolean') {
		deep = target;
		target = arguments[1] || {};
		// skip the boolean and the target
		i = 2;
	}
	if (target == null || (typeof target !== 'object' && typeof target !== 'function')) {
		target = {};
	}

	for (; i < length; ++i) {
		options = arguments[i];
		// Only deal with non-null/undefined values
		if (options != null) {
			// Extend the base object
			for (name in options) {
				src = getProperty(target, name);
				copy = getProperty(options, name);

				// Prevent never-ending loop
				if (target !== copy) {
					// Recurse if we're merging plain objects or arrays
					if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
						if (copyIsArray) {
							copyIsArray = false;
							clone = src && isArray(src) ? src : [];
						} else {
							clone = src && isPlainObject(src) ? src : {};
						}

						// Never move original objects, clone them
						setProperty(target, { name: name, newValue: extend(deep, clone, copy) });

					// Don't bring in undefined values
					} else if (typeof copy !== 'undefined') {
						setProperty(target, { name: name, newValue: copy });
					}
				}
			}
		}
	}

	// Return the modified object
	return target;
};
{
  "author": {
    "name": "Stefan Thomas",
    "email": "justmoon@members.fsf.org",
    "url": "http://www.justmoon.net"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Port of jQuery.extend for node.js and the browser",
  "devDependencies": {
    "@ljharb/eslint-config": "^12.2.1",
    "covert": "^1.1.0",
    "eslint": "^4.19.1",
    "jscs": "^3.0.7",
    "tape": "^4.9.1"
  },
  "homepage": "https://github.com/justmoon/node-extend#readme",
  "license": "MIT",
  "main": "index",
  "name": "extend",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/justmoon/node-extend.git"
  },
  "version": "3.0.2"
}Before potentially wasting your time by making major, opinionated changes to this codebase please feel free to open a discussion repos in the Issues section of the repository. Outline your proposed idea and seek feedback from the maintainer first before implementing major features.Copyright (c) 2014 Max Ogden and other contributors
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#!/usr/bin/env node

var extract = require('./')

var args = process.argv.slice(2)
var source = args[0]
var dest = args[1] || process.cwd()
if (!source) {
  console.error('Usage: extract-zip foo.zip <targetDirectory>')
  process.exit(1)
}

extract(source, {dir: dest}, function (err, results) {
  if (err) {
    console.error('error!', err)
    process.exit(1)
  } else {
    process.exit(0)
  }
})
var fs = require('fs')
var path = require('path')
var yauzl = require('yauzl')
var mkdirp = require('mkdirp')
var concat = require('concat-stream')
var debug = require('debug')('extract-zip')

module.exports = function (zipPath, opts, cb) {
  debug('creating target directory', opts.dir)

  if (path.isAbsolute(opts.dir) === false) {
    return cb(new Error('Target directory is expected to be absolute'))
  }

  mkdirp(opts.dir, function (err) {
    if (err) return cb(err)

    fs.realpath(opts.dir, function (err, canonicalDir) {
      if (err) return cb(err)

      opts.dir = canonicalDir

      openZip(opts)
    })
  })

  function openZip () {
    debug('opening', zipPath, 'with opts', opts)

    yauzl.open(zipPath, {lazyEntries: true}, function (err, zipfile) {
      if (err) return cb(err)

      var cancelled = false

      zipfile.on('error', function (err) {
        if (err) {
          cancelled = true
          return cb(err)
        }
      })
      zipfile.readEntry()

      zipfile.on('close', function () {
        if (!cancelled) {
          debug('zip extraction complete')
          cb()
        }
      })

      zipfile.on('entry', function (entry) {
        if (cancelled) {
          debug('skipping entry', entry.fileName, {cancelled: cancelled})
          return
        }

        debug('zipfile entry', entry.fileName)

        if (/^__MACOSX\//.test(entry.fileName)) {
          // dir name starts with __MACOSX/
          zipfile.readEntry()
          return
        }

        var destDir = path.dirname(path.join(opts.dir, entry.fileName))

        mkdirp(destDir, function (err) {
          if (err) {
            cancelled = true
            zipfile.close()
            return cb(err)
          }

          fs.realpath(destDir, function (err, canonicalDestDir) {
            if (err) {
              cancelled = true
              zipfile.close()
              return cb(err)
            }

            var relativeDestDir = path.relative(opts.dir, canonicalDestDir)

            if (relativeDestDir.split(path.sep).indexOf('..') !== -1) {
              cancelled = true
              zipfile.close()
              return cb(new Error('Out of bound path "' + canonicalDestDir + '" found while processing file ' + entry.fileName))
            }

            extractEntry(entry, function (err) {
              // if any extraction fails then abort everything
              if (err) {
                cancelled = true
                zipfile.close()
                return cb(err)
              }
              debug('finished processing', entry.fileName)
              zipfile.readEntry()
            })
          })
        })
      })

      function extractEntry (entry, done) {
        if (cancelled) {
          debug('skipping entry extraction', entry.fileName, {cancelled: cancelled})
          return setImmediate(done)
        }

        if (opts.onEntry) {
          opts.onEntry(entry, zipfile)
        }

        var dest = path.join(opts.dir, entry.fileName)

        // convert external file attr int into a fs stat mode int
        var mode = (entry.externalFileAttributes >> 16) & 0xFFFF
        // check if it's a symlink or dir (using stat mode constants)
        var IFMT = 61440
        var IFDIR = 16384
        var IFLNK = 40960
        var symlink = (mode & IFMT) === IFLNK
        var isDir = (mode & IFMT) === IFDIR

        // Failsafe, borrowed from jsZip
        if (!isDir && entry.fileName.slice(-1) === '/') {
          isDir = true
        }

        // check for windows weird way of specifying a directory
        // https://github.com/maxogden/extract-zip/issues/13#issuecomment-154494566
        var madeBy = entry.versionMadeBy >> 8
        if (!isDir) isDir = (madeBy === 0 && entry.externalFileAttributes === 16)

        // if no mode then default to default modes
        if (mode === 0) {
          if (isDir) {
            if (opts.defaultDirMode) mode = parseInt(opts.defaultDirMode, 10)
            if (!mode) mode = 493 // Default to 0755
          } else {
            if (opts.defaultFileMode) mode = parseInt(opts.defaultFileMode, 10)
            if (!mode) mode = 420 // Default to 0644
          }
        }

        debug('extracting entry', { filename: entry.fileName, isDir: isDir, isSymlink: symlink })

        // reverse umask first (~)
        var umask = ~process.umask()
        // & with processes umask to override invalid perms
        var procMode = mode & umask

        // always ensure folders are created
        var destDir = dest
        if (!isDir) destDir = path.dirname(dest)

        debug('mkdirp', {dir: destDir})
        mkdirp(destDir, function (err) {
          if (err) {
            debug('mkdirp error', destDir, {error: err})
            cancelled = true
            return done(err)
          }

          if (isDir) return done()

          debug('opening read stream', dest)
          zipfile.openReadStream(entry, function (err, readStream) {
            if (err) {
              debug('openReadStream error', err)
              cancelled = true
              return done(err)
            }

            readStream.on('error', function (err) {
              console.log('read err', err)
            })

            if (symlink) writeSymlink()
            else writeStream()

            function writeStream () {
              var writeStream = fs.createWriteStream(dest, {mode: procMode})
              readStream.pipe(writeStream)

              writeStream.on('finish', function () {
                done()
              })

              writeStream.on('error', function (err) {
                debug('write error', {error: err})
                cancelled = true
                return done(err)
              })
            }

            // AFAICT the content of the symlink file itself is the symlink target filename string
            function writeSymlink () {
              readStream.pipe(concat(function (data) {
                var link = data.toString()
                debug('creating symlink', link, dest)
                fs.symlink(link, dest, function (err) {
                  if (err) cancelled = true
                  done(err)
                })
              }))
            }
          })
        })
      }
    })
  }
}
{
  "author": {
    "name": "max ogden"
  },
  "bin": {
    "extract-zip": "cli.js"
  },
  "dependencies": {
    "concat-stream": "^1.6.2",
    "debug": "^2.6.9",
    "mkdirp": "^0.5.4",
    "yauzl": "^2.10.0"
  },
  "deprecated": false,
  "description": "unzip a zip file into a directory using 100% javascript",
  "devDependencies": {
    "rimraf": "^2.2.8",
    "standard": "^5.2.2",
    "tape": "^4.2.0",
    "temp": "^0.8.3"
  },
  "directories": {
    "test": "test"
  },
  "homepage": "https://github.com/maxogden/extract-zip#readme",
  "license": "BSD-2-Clause",
  "main": "index.js",
  "name": "extract-zip",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/maxogden/extract-zip.git"
  },
  "version": "1.7.0"
}Copyright (c) 2012, Joyent, Inc. All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE
#
# Copyright (c) 2012, Joyent, Inc. All rights reserved.
#
# Makefile: top-level Makefile
#
# This Makefile contains only repo-specific logic and uses included makefiles
# to supply common targets (javascriptlint, jsstyle, restdown, etc.), which are
# used by other repos as well.
#

#
# Files
#
JSL		 = jsl
JSSTYLE		 = jsstyle
JS_FILES	:= $(shell find examples lib -name '*.js')
JSL_FILES_NODE   = $(JS_FILES)
JSSTYLE_FILES	 = $(JS_FILES)
JSL_CONF_NODE	 = jsl.node.conf

# Default target is "check"
check:

include ./Makefile.targ
# -*- mode: makefile -*-
#
# Copyright (c) 2012, Joyent, Inc. All rights reserved.
#
# Makefile.targ: common targets.
#
# NOTE: This makefile comes from the "eng" repo. It's designed to be dropped
# into other repos as-is without requiring any modifications. If you find
# yourself changing this file, you should instead update the original copy in
# eng.git and then update your repo to use the new version.
#
# This Makefile defines several useful targets and rules. You can use it by
# including it from a Makefile that specifies some of the variables below.
#
# Targets defined in this Makefile:
#
#	check	Checks JavaScript files for lint and style
#		Checks bash scripts for syntax
#		Checks SMF manifests for validity against the SMF DTD
#
#	clean	Removes built files
#
#	docs	Builds restdown documentation in docs/
#
#	prepush	Depends on "check" and "test"
#
#	test	Does nothing (you should override this)
#
#	xref	Generates cscope (source cross-reference index)
#
# For details on what these targets are supposed to do, see the Joyent
# Engineering Guide.
#
# To make use of these targets, you'll need to set some of these variables. Any
# variables left unset will simply not be used.
#
#	BASH_FILES	Bash scripts to check for syntax
#			(paths relative to top-level Makefile)
#
#	CLEAN_FILES	Files to remove as part of the "clean" target.  Note
#			that files generated by targets in this Makefile are
#			automatically included in CLEAN_FILES.  These include
#			restdown-generated HTML and JSON files.
#
#	DOC_FILES	Restdown (documentation source) files. These are
#			assumed to be contained in "docs/", and must NOT
#			contain the "docs/" prefix.
#
#	JSL_CONF_NODE	Specify JavaScriptLint configuration files
#	JSL_CONF_WEB	(paths relative to top-level Makefile)
#
#			Node.js and Web configuration files are separate
#			because you'll usually want different global variable
#			configurations.  If no file is specified, none is given
#			to jsl, which causes it to use a default configuration,
#			which probably isn't what you want.
#
#	JSL_FILES_NODE	JavaScript files to check with Node config file.
#	JSL_FILES_WEB	JavaScript files to check with Web config file.
#
# You can also override these variables:
#
#	BASH		Path to bash (default: bash)
#
#	CSCOPE_DIRS	Directories to search for source files for the cscope
#			index. (default: ".")
#
#	JSL		Path to JavaScriptLint (default: "jsl")
#
#	JSL_FLAGS_NODE	Additional flags to pass through to JSL
#	JSL_FLAGS_WEB
#	JSL_FLAGS
#
#	JSSTYLE		Path to jsstyle (default: jsstyle)
#
#	JSSTYLE_FLAGS	Additional flags to pass through to jsstyle
#

#
# Defaults for the various tools we use.
#
BASH		?= bash
BASHSTYLE	?= tools/bashstyle
CP		?= cp
CSCOPE		?= cscope
CSCOPE_DIRS	?= .
JSL		?= jsl
JSSTYLE		?= jsstyle
MKDIR		?= mkdir -p
MV		?= mv
RESTDOWN_FLAGS	?=
RMTREE		?= rm -rf
JSL_FLAGS  	?= --nologo --nosummary

ifeq ($(shell uname -s),SunOS)
	TAR	?= gtar
else
	TAR	?= tar
endif


#
# Defaults for other fixed values.
#
BUILD		= build
DISTCLEAN_FILES += $(BUILD)
DOC_BUILD	= $(BUILD)/docs/public

#
# Configure JSL_FLAGS_{NODE,WEB} based on JSL_CONF_{NODE,WEB}.
#
ifneq ($(origin JSL_CONF_NODE), undefined)
	JSL_FLAGS_NODE += --conf=$(JSL_CONF_NODE)
endif

ifneq ($(origin JSL_CONF_WEB), undefined)
	JSL_FLAGS_WEB += --conf=$(JSL_CONF_WEB)
endif

#
# Targets. For descriptions on what these are supposed to do, see the
# Joyent Engineering Guide.
#

#
# Instruct make to keep around temporary files. We have rules below that
# automatically update git submodules as needed, but they employ a deps/*/.git
# temporary file. Without this directive, make tries to remove these .git
# directories after the build has completed.
#
.SECONDARY: $($(wildcard deps/*):%=%/.git)

#
# This rule enables other rules that use files from a git submodule to have
# those files depend on deps/module/.git and have "make" automatically check
# out the submodule as needed.
#
deps/%/.git:
	git submodule update --init deps/$*

#
# These recipes make heavy use of dynamically-created phony targets. The parent
# Makefile defines a list of input files like BASH_FILES. We then say that each
# of these files depends on a fake target called filename.bashchk, and then we
# define a pattern rule for those targets that runs bash in check-syntax-only
# mode. This mechanism has the nice properties that if you specify zero files,
# the rule becomes a noop (unlike a single rule to check all bash files, which
# would invoke bash with zero files), and you can check individual files from
# the command line with "make filename.bashchk".
#
.PHONY: check-bash
check-bash: $(BASH_FILES:%=%.bashchk) $(BASH_FILES:%=%.bashstyle)

%.bashchk: %
	$(BASH) -n $^

%.bashstyle: %
	$(BASHSTYLE) $^

.PHONY: check-jsl check-jsl-node check-jsl-web
check-jsl: check-jsl-node check-jsl-web

check-jsl-node: $(JSL_FILES_NODE:%=%.jslnodechk)

check-jsl-web: $(JSL_FILES_WEB:%=%.jslwebchk)

%.jslnodechk: % $(JSL_EXEC)
	$(JSL) $(JSL_FLAGS) $(JSL_FLAGS_NODE) $<

%.jslwebchk: % $(JSL_EXEC)
	$(JSL) $(JSL_FLAGS) $(JSL_FLAGS_WEB) $<

.PHONY: check-jsstyle
check-jsstyle: $(JSSTYLE_FILES:%=%.jsstylechk)

%.jsstylechk: % $(JSSTYLE_EXEC)
	$(JSSTYLE) $(JSSTYLE_FLAGS) $<

.PHONY: check
check: check-jsl check-jsstyle check-bash
	@echo check ok

.PHONY: clean
clean::
	-$(RMTREE) $(CLEAN_FILES)

.PHONY: distclean
distclean:: clean
	-$(RMTREE) $(DISTCLEAN_FILES)

CSCOPE_FILES = cscope.in.out cscope.out cscope.po.out
CLEAN_FILES += $(CSCOPE_FILES)

.PHONY: xref
xref: cscope.files
	$(CSCOPE) -bqR

.PHONY: cscope.files
cscope.files:
	find $(CSCOPE_DIRS) -name '*.c' -o -name '*.h' -o -name '*.cc' \
	    -o -name '*.js' -o -name '*.s' -o -name '*.cpp' > $@

#
# The "docs" target is complicated because we do several things here:
#
#    (1) Use restdown to build HTML and JSON files from each of DOC_FILES.
#
#    (2) Copy these files into $(DOC_BUILD) (build/docs/public), which
#        functions as a complete copy of the documentation that could be
#        mirrored or served over HTTP.
#
#    (3) Then copy any directories and media from docs/media into
#        $(DOC_BUILD)/media. This allows projects to include their own media,
#        including files that will override same-named files provided by
#        restdown.
#
# Step (3) is the surprisingly complex part: in order to do this, we need to
# identify the subdirectories in docs/media, recreate them in
# $(DOC_BUILD)/media, then do the same with the files.
#
DOC_MEDIA_DIRS := $(shell find docs/media -type d 2>/dev/null | grep -v "^docs/media$$")
DOC_MEDIA_DIRS := $(DOC_MEDIA_DIRS:docs/media/%=%)
DOC_MEDIA_DIRS_BUILD := $(DOC_MEDIA_DIRS:%=$(DOC_BUILD)/media/%)

DOC_MEDIA_FILES := $(shell find docs/media -type f 2>/dev/null)
DOC_MEDIA_FILES := $(DOC_MEDIA_FILES:docs/media/%=%)
DOC_MEDIA_FILES_BUILD := $(DOC_MEDIA_FILES:%=$(DOC_BUILD)/media/%)

#
# Like the other targets, "docs" just depends on the final files we want to
# create in $(DOC_BUILD), leveraging other targets and recipes to define how
# to get there.
#
.PHONY: docs
docs:							\
    $(DOC_FILES:%.restdown=$(DOC_BUILD)/%.html)		\
    $(DOC_FILES:%.restdown=$(DOC_BUILD)/%.json)		\
    $(DOC_MEDIA_FILES_BUILD)

#
# We keep the intermediate files so that the next build can see whether the
# files in DOC_BUILD are up to date.
#
.PRECIOUS:					\
    $(DOC_FILES:%.restdown=docs/%.html)		\
    $(DOC_FILES:%.restdown=docs/%json)

#
# We do clean those intermediate files, as well as all of DOC_BUILD.
#
CLEAN_FILES +=					\
    $(DOC_BUILD)				\
    $(DOC_FILES:%.restdown=docs/%.html)		\
    $(DOC_FILES:%.restdown=docs/%.json)

#
# Before installing the files, we must make sure the directories exist. The |
# syntax tells make that the dependency need only exist, not be up to date.
# Otherwise, it might try to rebuild spuriously because the directory itself
# appears out of date.
#
$(DOC_MEDIA_FILES_BUILD): | $(DOC_MEDIA_DIRS_BUILD)

$(DOC_BUILD)/%: docs/% | $(DOC_BUILD)
	$(CP) $< $@

docs/%.json docs/%.html: docs/%.restdown | $(DOC_BUILD) $(RESTDOWN_EXEC)
	$(RESTDOWN) $(RESTDOWN_FLAGS) -m $(DOC_BUILD) $<

$(DOC_BUILD):
	$(MKDIR) $@

$(DOC_MEDIA_DIRS_BUILD):
	$(MKDIR) $@

#
# The default "test" target does nothing. This should usually be overridden by
# the parent Makefile. It's included here so we can define "prepush" without
# requiring the repo to define "test".
#
.PHONY: test
test:

.PHONY: prepush
prepush: check test
#
# Configuration File for JavaScript Lint 
#
# This configuration file can be used to lint a collection of scripts, or to enable
# or disable warnings for scripts that are linted via the command line.
#

### Warnings
# Enable or disable warnings based on requirements.
# Use "+WarningName" to display or "-WarningName" to suppress.
#
+ambiguous_else_stmt          # the else statement could be matched with one of multiple if statements (use curly braces to indicate intent
+ambiguous_nested_stmt        # block statements containing block statements should use curly braces to resolve ambiguity
+ambiguous_newline            # unexpected end of line; it is ambiguous whether these lines are part of the same statement
+anon_no_return_value         # anonymous function does not always return value
+assign_to_function_call      # assignment to a function call
-block_without_braces         # block statement without curly braces
+comma_separated_stmts        # multiple statements separated by commas (use semicolons?)
+comparison_type_conv         # comparisons against null, 0, true, false, or an empty string allowing implicit type conversion (use === or !==)
+default_not_at_end           # the default case is not at the end of the switch statement
+dup_option_explicit          # duplicate "option explicit" control comment
+duplicate_case_in_switch     # duplicate case in switch statement
+duplicate_formal             # duplicate formal argument {name}
+empty_statement              # empty statement or extra semicolon
+identifier_hides_another     # identifer {name} hides an identifier in a parent scope
-inc_dec_within_stmt          # increment (++) and decrement (--) operators used as part of greater statement
+incorrect_version            # Expected /*jsl:content-type*/ control comment. The script was parsed with the wrong version.
+invalid_fallthru             # unexpected "fallthru" control comment
+invalid_pass                 # unexpected "pass" control comment
+jsl_cc_not_understood        # couldn't understand control comment using /*jsl:keyword*/ syntax
+leading_decimal_point        # leading decimal point may indicate a number or an object member
+legacy_cc_not_understood     # couldn't understand control comment using /*@keyword@*/ syntax
+meaningless_block            # meaningless block; curly braces have no impact
+mismatch_ctrl_comments       # mismatched control comment; "ignore" and "end" control comments must have a one-to-one correspondence
+misplaced_regex              # regular expressions should be preceded by a left parenthesis, assignment, colon, or comma
+missing_break                # missing break statement
+missing_break_for_last_case  # missing break statement for last case in switch
+missing_default_case         # missing default case in switch statement
+missing_option_explicit      # the "option explicit" control comment is missing
+missing_semicolon            # missing semicolon
+missing_semicolon_for_lambda # missing semicolon for lambda assignment
+multiple_plus_minus          # unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs
+nested_comment               # nested comment
+no_return_value              # function {name} does not always return a value
+octal_number                 # leading zeros make an octal number
+parseint_missing_radix       # parseInt missing radix parameter
+partial_option_explicit      # the "option explicit" control comment, if used, must be in the first script tag
+redeclared_var               # redeclaration of {name}
+trailing_comma_in_array      # extra comma is not recommended in array initializers
+trailing_decimal_point       # trailing decimal point may indicate a number or an object member
+undeclared_identifier        # undeclared identifier: {name}
+unreachable_code             # unreachable code
-unreferenced_argument        # argument declared but never referenced: {name}
-unreferenced_function        # function is declared but never referenced: {name}
+unreferenced_variable        # variable is declared but never referenced: {name}
+unsupported_version          # JavaScript {version} is not supported
+use_of_label                 # use of label
+useless_assign               # useless assignment
+useless_comparison           # useless comparison; comparing identical expressions
-useless_quotes               # the quotation marks are unnecessary
+useless_void                 # use of the void type may be unnecessary (void is always undefined)
+var_hides_arg                # variable {name} hides argument
+want_assign_or_call          # expected an assignment or function call
+with_statement               # with statement hides undeclared variables; use temporary variable instead


### Output format
# Customize the format of the error message.
#    __FILE__ indicates current file path
#    __FILENAME__ indicates current file name
#    __LINE__ indicates current line
#    __COL__ indicates current column
#    __ERROR__ indicates error message (__ERROR_PREFIX__: __ERROR_MSG__)
#    __ERROR_NAME__ indicates error name (used in configuration file)
#    __ERROR_PREFIX__ indicates error prefix
#    __ERROR_MSG__ indicates error message
#
# For machine-friendly output, the output format can be prefixed with
# "encode:". If specified, all items will be encoded with C-slashes.
#
# Visual Studio syntax (default):
+output-format __FILE__(__LINE__): __ERROR__
# Alternative syntax:
#+output-format __FILE__:__LINE__: __ERROR__


### Context
# Show the in-line position of the error.
# Use "+context" to display or "-context" to suppress.
#
+context


### Control Comments
# Both JavaScript Lint and the JScript interpreter confuse each other with the syntax for
# the /*@keyword@*/ control comments and JScript conditional comments. (The latter is
# enabled in JScript with @cc_on@). The /*jsl:keyword*/ syntax is preferred for this reason,
# although legacy control comments are enabled by default for backward compatibility.
#
-legacy_control_comments


### Defining identifiers
# By default, "option explicit" is enabled on a per-file basis.
# To enable this for all files, use "+always_use_option_explicit"
-always_use_option_explicit

# Define certain identifiers of which the lint is not aware.
# (Use this in conjunction with the "undeclared identifier" warning.)
#
# Common uses for webpages might be:
+define __dirname
+define clearInterval
+define clearTimeout
+define console
+define exports
+define global
+define process
+define require
+define setInterval
+define setTimeout
+define Buffer
+define JSON
+define Math

### JavaScript Version
# To change the default JavaScript version:
#+default-type text/javascript;version=1.5
#+default-type text/javascript;e4x=1

### Files
# Specify which files to lint
# Use "+recurse" to enable recursion (disabled by default).
# To add a set of files, use "+process FileName", "+process Folder\Path\*.js",
# or "+process Folder\Path\*.htm".
#

{
  "deprecated": false,
  "description": "extended POSIX-style sprintf",
  "engines": [
    "node >=0.6.0"
  ],
  "homepage": "https://github.com/davepacheco/node-extsprintf#readme",
  "license": "MIT",
  "main": "./lib/extsprintf.js",
  "name": "extsprintf",
  "repository": {
    "type": "git",
    "url": "git://github.com/davepacheco/node-extsprintf.git"
  },
  "version": "1.3.0"
}/*
 * extsprintf.js: extended POSIX-style sprintf
 */

var mod_assert = require('assert');
var mod_util = require('util');

/*
 * Public interface
 */
exports.sprintf = jsSprintf;
exports.printf = jsPrintf;
exports.fprintf = jsFprintf;

/*
 * Stripped down version of s[n]printf(3c).  We make a best effort to throw an
 * exception when given a format string we don't understand, rather than
 * ignoring it, so that we won't break existing programs if/when we go implement
 * the rest of this.
 *
 * This implementation currently supports specifying
 *	- field alignment ('-' flag),
 * 	- zero-pad ('0' flag)
 *	- always show numeric sign ('+' flag),
 *	- field width
 *	- conversions for strings, decimal integers, and floats (numbers).
 *	- argument size specifiers.  These are all accepted but ignored, since
 *	  Javascript has no notion of the physical size of an argument.
 *
 * Everything else is currently unsupported, most notably precision, unsigned
 * numbers, non-decimal numbers, and characters.
 */
function jsSprintf(fmt)
{
	var regex = [
	    '([^%]*)',				/* normal text */
	    '%',				/* start of format */
	    '([\'\\-+ #0]*?)',			/* flags (optional) */
	    '([1-9]\\d*)?',			/* width (optional) */
	    '(\\.([1-9]\\d*))?',		/* precision (optional) */
	    '[lhjztL]*?',			/* length mods (ignored) */
	    '([diouxXfFeEgGaAcCsSp%jr])'	/* conversion */
	].join('');

	var re = new RegExp(regex);
	var args = Array.prototype.slice.call(arguments, 1);
	var flags, width, precision, conversion;
	var left, pad, sign, arg, match;
	var ret = '';
	var argn = 1;

	mod_assert.equal('string', typeof (fmt));

	while ((match = re.exec(fmt)) !== null) {
		ret += match[1];
		fmt = fmt.substring(match[0].length);

		flags = match[2] || '';
		width = match[3] || 0;
		precision = match[4] || '';
		conversion = match[6];
		left = false;
		sign = false;
		pad = ' ';

		if (conversion == '%') {
			ret += '%';
			continue;
		}

		if (args.length === 0)
			throw (new Error('too few args to sprintf'));

		arg = args.shift();
		argn++;

		if (flags.match(/[\' #]/))
			throw (new Error(
			    'unsupported flags: ' + flags));

		if (precision.length > 0)
			throw (new Error(
			    'non-zero precision not supported'));

		if (flags.match(/-/))
			left = true;

		if (flags.match(/0/))
			pad = '0';

		if (flags.match(/\+/))
			sign = true;

		switch (conversion) {
		case 's':
			if (arg === undefined || arg === null)
				throw (new Error('argument ' + argn +
				    ': attempted to print undefined or null ' +
				    'as a string'));
			ret += doPad(pad, width, left, arg.toString());
			break;

		case 'd':
			arg = Math.floor(arg);
			/*jsl:fallthru*/
		case 'f':
			sign = sign && arg > 0 ? '+' : '';
			ret += sign + doPad(pad, width, left,
			    arg.toString());
			break;

		case 'x':
			ret += doPad(pad, width, left, arg.toString(16));
			break;

		case 'j': /* non-standard */
			if (width === 0)
				width = 10;
			ret += mod_util.inspect(arg, false, width);
			break;

		case 'r': /* non-standard */
			ret += dumpException(arg);
			break;

		default:
			throw (new Error('unsupported conversion: ' +
			    conversion));
		}
	}

	ret += fmt;
	return (ret);
}

function jsPrintf() {
	var args = Array.prototype.slice.call(arguments);
	args.unshift(process.stdout);
	jsFprintf.apply(null, args);
}

function jsFprintf(stream) {
	var args = Array.prototype.slice.call(arguments, 1);
	return (stream.write(jsSprintf.apply(this, args)));
}

function doPad(chr, width, left, str)
{
	var ret = str;

	while (ret.length < width) {
		if (left)
			ret += chr;
		else
			ret = chr + ret;
	}

	return (ret);
}

/*
 * This function dumps long stack traces for exceptions having a cause() method.
 * See node-verror for an example.
 */
function dumpException(ex)
{
	var ret;

	if (!(ex instanceof Error))
		throw (new Error(jsSprintf('invalid type for %%r: %j', ex)));

	/* Note that V8 prepends "ex.stack" with ex.toString(). */
	ret = 'EXCEPTION: ' + ex.constructor.name + ': ' + ex.stack;

	if (ex.cause && typeof (ex.cause) === 'function') {
		var cex = ex.cause();
		if (cex) {
			ret += '\nCaused by: ' + dumpException(cex);
		}
	}

	return (ret);
}
MIT License

Copyright (c) 2017 Evgeny Poberezkin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';

// do not edit .js files directly - edit src/index.jst



module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }



    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};
{
  "author": {
    "name": "Evgeny Poberezkin"
  },
  "deprecated": false,
  "description": "Fast deep equal",
  "devDependencies": {
    "coveralls": "^3.1.0",
    "dot": "^1.1.2",
    "eslint": "^7.2.0",
    "mocha": "^7.2.0",
    "nyc": "^15.1.0",
    "pre-commit": "^1.2.2",
    "react": "^16.12.0",
    "react-test-renderer": "^16.12.0",
    "sinon": "^9.0.2",
    "typescript": "^3.9.5"
  },
  "files": [
    "index.js",
    "index.d.ts",
    "react.js",
    "react.d.ts",
    "es6/"
  ],
  "homepage": "https://github.com/epoberezkin/fast-deep-equal#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "fast-deep-equal",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/epoberezkin/fast-deep-equal.git"
  },
  "types": "index.d.ts",
  "version": "3.1.3"
}'use strict';

// do not edit .js files directly - edit src/index.jst



module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }



    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (key === '_owner' && a.$$typeof) {
        // React-specific: avoid traversing React elements' _owner.
        //  _owner contains circular references
        // and is not needed when comparing the actual elements (and not their owners)
        continue;
      }

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};
'use strict';

// do not edit .js files directly - edit src/index.jst


  var envHasBigInt64Array = typeof BigInt64Array !== 'undefined';


module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }


    if ((a instanceof Map) && (b instanceof Map)) {
      if (a.size !== b.size) return false;
      for (i of a.entries())
        if (!b.has(i[0])) return false;
      for (i of a.entries())
        if (!equal(i[1], b.get(i[0]))) return false;
      return true;
    }

    if ((a instanceof Set) && (b instanceof Set)) {
      if (a.size !== b.size) return false;
      for (i of a.entries())
        if (!b.has(i[0])) return false;
      return true;
    }

    if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (a[i] !== b[i]) return false;
      return true;
    }


    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};
'use strict';

// do not edit .js files directly - edit src/index.jst


  var envHasBigInt64Array = typeof BigInt64Array !== 'undefined';


module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }


    if ((a instanceof Map) && (b instanceof Map)) {
      if (a.size !== b.size) return false;
      for (i of a.entries())
        if (!b.has(i[0])) return false;
      for (i of a.entries())
        if (!equal(i[1], b.get(i[0]))) return false;
      return true;
    }

    if ((a instanceof Set) && (b instanceof Set)) {
      if (a.size !== b.size) return false;
      for (i of a.entries())
        if (!b.has(i[0])) return false;
      return true;
    }

    if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (a[i] !== b[i]) return false;
      return true;
    }


    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (key === '_owner' && a.$$typeof) {
        // React-specific: avoid traversing React elements' _owner.
        //  _owner contains circular references
        // and is not needed when comparing the actual elements (and not their owners)
        continue;
      }

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};
The MIT License (MIT)

Copyright (c) 2016 Matteo Collina

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict'

var benchmark = require('benchmark')
var suite = new benchmark.Suite()
var fs = require('fs')
var myData = fs.readFileSync('./package.json')
var Parse = require('./')
var safe = require('json-parse-safe')
var max = 100

suite.add('Parse class', function parseBench () {
  var parsed = new Parse(myData)
  if (parsed.err) {
    return
  }

  // add a loop to simulate some activity here
  for (var i = 0; i < max; i++) {
    var count = 0
    var keys = Object.keys(parsed.value)
    for (var k = 0; k < keys.length; k++) {
      count++
    }
  }
})

suite.add('Parse wrapped', function parseBench () {
  var parsed = Parse(myData)
  if (parsed.err) {
    return
  }

  // add a loop to simulate some activity here
  for (var i = 0; i < max; i++) {
    var count = 0
    var keys = Object.keys(parsed.value)
    for (var k = 0; k < keys.length; k++) {
      count++
    }
  }
})

suite.add('json-parse-safe', function parseBench () {
  var parsed = safe(myData)
  if (parsed.error) {
    return
  }

  // add a loop to simulate some activity here
  for (var i = 0; i < max; i++) {
    var count = 0
    var keys = Object.keys(parsed.value)
    for (var k = 0; k < keys.length; k++) {
      count++
    }
  }
})

suite.add('try catch here', function tryCatchBench () {
  var data = null
  try {
    data = JSON.parse(myData)
  } catch (err) {
    return
  }

  // add a loop to simulate some activity here
  for (var i = 0; i < max; i++) {
    var count = 0
    var keys = Object.keys(data)
    for (var k = 0; k < keys.length; k++) {
      count++
    }
  }
})

suite.on('complete', function print () {
  for (var i = 0; i < this.length; i++) {
    console.log(this[i].toString())
  }

  console.log('Fastest is', this.filter('fastest').map('name')[0])
})

suite.run()
{
  "author": {
    "name": "Matteo Collina",
    "email": "hello@matteocollina.com"
  },
  "deprecated": false,
  "description": "Parse json safely and at max speed",
  "devDependencies": {
    "benchmark": "^2.1.0",
    "json-parse-safe": "^1.0.3",
    "pre-commit": "^1.1.2",
    "standard": "^6.0.5",
    "tap": "^5.5.0"
  },
  "homepage": "https://github.com/mcollina/fast-json-parse#readme",
  "license": "MIT",
  "main": "parse.js",
  "name": "fast-json-parse",
  "pre-commit": "test",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/mcollina/fast-json-parse.git"
  },
  "version": "1.0.3"
}'use strict'

function Parse (data) {
  if (!(this instanceof Parse)) {
    return new Parse(data)
  }
  this.err = null
  this.value = null
  try {
    this.value = JSON.parse(data)
  } catch (err) {
    this.err = err
  }
}

module.exports = Parse
extends: eslint:recommended
env:
  node: true
  browser: true
rules:
  block-scoped-var: 2
  callback-return: 2
  dot-notation: 2
  indent: 2
  linebreak-style: [2, unix]
  new-cap: 2
  no-console: [2, allow: [warn, error]]
  no-else-return: 2
  no-eq-null: 2
  no-fallthrough: 2
  no-invalid-this: 2
  no-return-assign: 2
  no-shadow: 1
  no-trailing-spaces: 2
  no-use-before-define: [2, nofunc]
  quotes: [2, single, avoid-escape]
  semi: [2, always]
  strict: [2, global]
  valid-jsdoc: [2, requireReturn: false]
  no-control-regex: 0
  no-useless-escape: 2
This software is released under the MIT license:

Copyright (c) 2017 Evgeny Poberezkin
Copyright (c) 2013 James Halliday

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict';

module.exports = function (data, opts) {
    if (!opts) opts = {};
    if (typeof opts === 'function') opts = { cmp: opts };
    var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;

    var cmp = opts.cmp && (function (f) {
        return function (node) {
            return function (a, b) {
                var aobj = { key: a, value: node[a] };
                var bobj = { key: b, value: node[b] };
                return f(aobj, bobj);
            };
        };
    })(opts.cmp);

    var seen = [];
    return (function stringify (node) {
        if (node && node.toJSON && typeof node.toJSON === 'function') {
            node = node.toJSON();
        }

        if (node === undefined) return;
        if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
        if (typeof node !== 'object') return JSON.stringify(node);

        var i, out;
        if (Array.isArray(node)) {
            out = '[';
            for (i = 0; i < node.length; i++) {
                if (i) out += ',';
                out += stringify(node[i]) || 'null';
            }
            return out + ']';
        }

        if (node === null) return 'null';

        if (seen.indexOf(node) !== -1) {
            if (cycles) return JSON.stringify('__cycle__');
            throw new TypeError('Converting circular structure to JSON');
        }

        var seenIndex = seen.push(node) - 1;
        var keys = Object.keys(node).sort(cmp && cmp(node));
        out = '';
        for (i = 0; i < keys.length; i++) {
            var key = keys[i];
            var value = stringify(node[key]);

            if (!value) continue;
            if (out) out += ',';
            out += JSON.stringify(key) + ':' + value;
        }
        seen.splice(seenIndex, 1);
        return '{' + out + '}';
    })(data);
};
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "deterministic `JSON.stringify()` - a faster version of substack's json-stable-strigify without jsonify",
  "devDependencies": {
    "benchmark": "^2.1.4",
    "coveralls": "^3.0.0",
    "eslint": "^6.7.0",
    "fast-stable-stringify": "latest",
    "faster-stable-stringify": "latest",
    "json-stable-stringify": "latest",
    "nyc": "^14.1.0",
    "pre-commit": "^1.2.2",
    "tape": "^4.11.0"
  },
  "homepage": "https://github.com/epoberezkin/fast-json-stable-stringify",
  "license": "MIT",
  "main": "index.js",
  "name": "fast-json-stable-stringify",
  "repository": {
    "type": "git",
    "url": "git://github.com/epoberezkin/fast-json-stable-stringify.git"
  },
  "types": "index.d.ts",
  "version": "2.1.0"
}'use strict';

const Benchmark = require('benchmark');
const suite = new Benchmark.Suite;
const testData = require('./test.json');


const stringifyPackages = {
  // 'JSON.stringify': JSON.stringify,
  'fast-json-stable-stringify': require('../index'),
  'json-stable-stringify': true,
  'fast-stable-stringify': true,
  'faster-stable-stringify': true
};


for (const name in stringifyPackages) {
  let func = stringifyPackages[name];
  if (func === true) func = require(name);

  suite.add(name, function() {
    func(testData);
  });
}

suite
  .on('cycle', (event) => console.log(String(event.target)))
  .on('complete', function () {
    console.log('The fastest is ' + this.filter('fastest').map('name'));
  })
  .run({async: true});
[
  {
    "_id": "59ef4a83ee8364808d761beb",
    "index": 0,
    "guid": "e50ffae9-7128-4148-9ee5-40c3fc523c5d",
    "isActive": false,
    "balance": "$2,341.81",
    "picture": "http://placehold.it/32x32",
    "age": 28,
    "eyeColor": "brown",
    "name": "Carey Savage",
    "gender": "female",
    "company": "VERAQ",
    "email": "careysavage@veraq.com",
    "phone": "+1 (897) 574-3014",
    "address": "458 Willow Street, Henrietta, California, 7234",
    "about": "Nisi reprehenderit nulla ad officia pariatur non dolore laboris irure cupidatat laborum. Minim eu ex Lorem adipisicing exercitation irure minim sunt est enim mollit incididunt voluptate nulla. Ut mollit anim reprehenderit et aliqua ex esse aliquip. Aute sit duis deserunt do incididunt consequat minim qui dolor commodo deserunt et voluptate.\r\n",
    "registered": "2014-05-21T01:56:51 -01:00",
    "latitude": 63.89502,
    "longitude": 62.369807,
    "tags": [
      "nostrud",
      "nisi",
      "consectetur",
      "ullamco",
      "cupidatat",
      "culpa",
      "commodo"
    ],
    "friends": [
      {
        "id": 0,
        "name": "Henry Walls"
      },
      {
        "id": 1,
        "name": "Janice Baker"
      },
      {
        "id": 2,
        "name": "Russell Bush"
      }
    ],
    "greeting": "Hello, Carey Savage! You have 4 unread messages.",
    "favoriteFruit": "banana"
  },
  {
    "_id": "59ef4a83ff5774a691454e89",
    "index": 1,
    "guid": "2bee9efc-4095-4c2e-87ef-d08c8054c89d",
    "isActive": true,
    "balance": "$1,618.15",
    "picture": "http://placehold.it/32x32",
    "age": 35,
    "eyeColor": "blue",
    "name": "Elinor Pearson",
    "gender": "female",
    "company": "FLEXIGEN",
    "email": "elinorpearson@flexigen.com",
    "phone": "+1 (923) 548-3751",
    "address": "600 Bayview Avenue, Draper, Montana, 3088",
    "about": "Mollit commodo ea sit Lorem velit. Irure anim esse Lorem sint quis officia ut. Aliqua nisi dolore in aute deserunt mollit ex ea in mollit.\r\n",
    "registered": "2017-04-22T07:58:41 -01:00",
    "latitude": -87.824919,
    "longitude": 69.538927,
    "tags": [
      "fugiat",
      "labore",
      "proident",
      "quis",
      "eiusmod",
      "qui",
      "est"
    ],
    "friends": [
      {
        "id": 0,
        "name": "Massey Wagner"
      },
      {
        "id": 1,
        "name": "Marcella Ferrell"
      },
      {
        "id": 2,
        "name": "Evans Mckee"
      }
    ],
    "greeting": "Hello, Elinor Pearson! You have 3 unread messages.",
    "favoriteFruit": "strawberry"
  },
  {
    "_id": "59ef4a839ec8a4be4430b36b",
    "index": 2,
    "guid": "ddd6e8c0-95bd-416d-8b46-a768d6363809",
    "isActive": false,
    "balance": "$2,046.95",
    "picture": "http://placehold.it/32x32",
    "age": 40,
    "eyeColor": "green",
    "name": "Irwin Davidson",
    "gender": "male",
    "company": "DANJA",
    "email": "irwindavidson@danja.com",
    "phone": "+1 (883) 537-2041",
    "address": "439 Cook Street, Chapin, Kentucky, 7398",
    "about": "Irure velit non commodo aliqua exercitation ut nostrud minim magna. Dolor ad ad ut irure eu. Non pariatur dolor eiusmod ipsum do et exercitation cillum. Et amet laboris minim eiusmod ullamco magna ea reprehenderit proident sunt.\r\n",
    "registered": "2016-09-01T07:49:08 -01:00",
    "latitude": -49.803812,
    "longitude": 104.93279,
    "tags": [
      "consequat",
      "enim",
      "quis",
      "magna",
      "est",
      "culpa",
      "tempor"
    ],
    "friends": [
      {
        "id": 0,
        "name": "Ruth Hansen"
      },
      {
        "id": 1,
        "name": "Kathrine Austin"
      },
      {
        "id": 2,
        "name": "Rivera Munoz"
      }
    ],
    "greeting": "Hello, Irwin Davidson! You have 2 unread messages.",
    "favoriteFruit": "banana"
  }
]
tidelift: "npm/fast-json-stable-stringify"
Copyright (c) 2014 Andrew Kelley

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var fs = require('fs');
var util = require('util');
var stream = require('stream');
var Readable = stream.Readable;
var Writable = stream.Writable;
var PassThrough = stream.PassThrough;
var Pend = require('pend');
var EventEmitter = require('events').EventEmitter;

exports.createFromBuffer = createFromBuffer;
exports.createFromFd = createFromFd;
exports.BufferSlicer = BufferSlicer;
exports.FdSlicer = FdSlicer;

util.inherits(FdSlicer, EventEmitter);
function FdSlicer(fd, options) {
  options = options || {};
  EventEmitter.call(this);

  this.fd = fd;
  this.pend = new Pend();
  this.pend.max = 1;
  this.refCount = 0;
  this.autoClose = !!options.autoClose;
}

FdSlicer.prototype.read = function(buffer, offset, length, position, callback) {
  var self = this;
  self.pend.go(function(cb) {
    fs.read(self.fd, buffer, offset, length, position, function(err, bytesRead, buffer) {
      cb();
      callback(err, bytesRead, buffer);
    });
  });
};

FdSlicer.prototype.write = function(buffer, offset, length, position, callback) {
  var self = this;
  self.pend.go(function(cb) {
    fs.write(self.fd, buffer, offset, length, position, function(err, written, buffer) {
      cb();
      callback(err, written, buffer);
    });
  });
};

FdSlicer.prototype.createReadStream = function(options) {
  return new ReadStream(this, options);
};

FdSlicer.prototype.createWriteStream = function(options) {
  return new WriteStream(this, options);
};

FdSlicer.prototype.ref = function() {
  this.refCount += 1;
};

FdSlicer.prototype.unref = function() {
  var self = this;
  self.refCount -= 1;

  if (self.refCount > 0) return;
  if (self.refCount < 0) throw new Error("invalid unref");

  if (self.autoClose) {
    fs.close(self.fd, onCloseDone);
  }

  function onCloseDone(err) {
    if (err) {
      self.emit('error', err);
    } else {
      self.emit('close');
    }
  }
};

util.inherits(ReadStream, Readable);
function ReadStream(context, options) {
  options = options || {};
  Readable.call(this, options);

  this.context = context;
  this.context.ref();

  this.start = options.start || 0;
  this.endOffset = options.end;
  this.pos = this.start;
  this.destroyed = false;
}

ReadStream.prototype._read = function(n) {
  var self = this;
  if (self.destroyed) return;

  var toRead = Math.min(self._readableState.highWaterMark, n);
  if (self.endOffset != null) {
    toRead = Math.min(toRead, self.endOffset - self.pos);
  }
  if (toRead <= 0) {
    self.destroyed = true;
    self.push(null);
    self.context.unref();
    return;
  }
  self.context.pend.go(function(cb) {
    if (self.destroyed) return cb();
    var buffer = new Buffer(toRead);
    fs.read(self.context.fd, buffer, 0, toRead, self.pos, function(err, bytesRead) {
      if (err) {
        self.destroy(err);
      } else if (bytesRead === 0) {
        self.destroyed = true;
        self.push(null);
        self.context.unref();
      } else {
        self.pos += bytesRead;
        self.push(buffer.slice(0, bytesRead));
      }
      cb();
    });
  });
};

ReadStream.prototype.destroy = function(err) {
  if (this.destroyed) return;
  err = err || new Error("stream destroyed");
  this.destroyed = true;
  this.emit('error', err);
  this.context.unref();
};

util.inherits(WriteStream, Writable);
function WriteStream(context, options) {
  options = options || {};
  Writable.call(this, options);

  this.context = context;
  this.context.ref();

  this.start = options.start || 0;
  this.endOffset = (options.end == null) ? Infinity : +options.end;
  this.bytesWritten = 0;
  this.pos = this.start;
  this.destroyed = false;

  this.on('finish', this.destroy.bind(this));
}

WriteStream.prototype._write = function(buffer, encoding, callback) {
  var self = this;
  if (self.destroyed) return;

  if (self.pos + buffer.length > self.endOffset) {
    var err = new Error("maximum file length exceeded");
    err.code = 'ETOOBIG';
    self.destroy();
    callback(err);
    return;
  }
  self.context.pend.go(function(cb) {
    if (self.destroyed) return cb();
    fs.write(self.context.fd, buffer, 0, buffer.length, self.pos, function(err, bytes) {
      if (err) {
        self.destroy();
        cb();
        callback(err);
      } else {
        self.bytesWritten += bytes;
        self.pos += bytes;
        self.emit('progress');
        cb();
        callback();
      }
    });
  });
};

WriteStream.prototype.destroy = function() {
  if (this.destroyed) return;
  this.destroyed = true;
  this.context.unref();
};

util.inherits(BufferSlicer, EventEmitter);
function BufferSlicer(buffer, options) {
  EventEmitter.call(this);

  options = options || {};
  this.refCount = 0;
  this.buffer = buffer;
  this.maxChunkSize = options.maxChunkSize || Number.MAX_SAFE_INTEGER;
}

BufferSlicer.prototype.read = function(buffer, offset, length, position, callback) {
  var end = position + length;
  var delta = end - this.buffer.length;
  var written = (delta > 0) ? delta : length;
  this.buffer.copy(buffer, offset, position, end);
  setImmediate(function() {
    callback(null, written);
  });
};

BufferSlicer.prototype.write = function(buffer, offset, length, position, callback) {
  buffer.copy(this.buffer, position, offset, offset + length);
  setImmediate(function() {
    callback(null, length, buffer);
  });
};

BufferSlicer.prototype.createReadStream = function(options) {
  options = options || {};
  var readStream = new PassThrough(options);
  readStream.destroyed = false;
  readStream.start = options.start || 0;
  readStream.endOffset = options.end;
  // by the time this function returns, we'll be done.
  readStream.pos = readStream.endOffset || this.buffer.length;

  // respect the maxChunkSize option to slice up the chunk into smaller pieces.
  var entireSlice = this.buffer.slice(readStream.start, readStream.pos);
  var offset = 0;
  while (true) {
    var nextOffset = offset + this.maxChunkSize;
    if (nextOffset >= entireSlice.length) {
      // last chunk
      if (offset < entireSlice.length) {
        readStream.write(entireSlice.slice(offset, entireSlice.length));
      }
      break;
    }
    readStream.write(entireSlice.slice(offset, nextOffset));
    offset = nextOffset;
  }

  readStream.end();
  readStream.destroy = function() {
    readStream.destroyed = true;
  };
  return readStream;
};

BufferSlicer.prototype.createWriteStream = function(options) {
  var bufferSlicer = this;
  options = options || {};
  var writeStream = new Writable(options);
  writeStream.start = options.start || 0;
  writeStream.endOffset = (options.end == null) ? this.buffer.length : +options.end;
  writeStream.bytesWritten = 0;
  writeStream.pos = writeStream.start;
  writeStream.destroyed = false;
  writeStream._write = function(buffer, encoding, callback) {
    if (writeStream.destroyed) return;

    var end = writeStream.pos + buffer.length;
    if (end > writeStream.endOffset) {
      var err = new Error("maximum file length exceeded");
      err.code = 'ETOOBIG';
      writeStream.destroyed = true;
      callback(err);
      return;
    }
    buffer.copy(bufferSlicer.buffer, writeStream.pos, 0, buffer.length);

    writeStream.bytesWritten += buffer.length;
    writeStream.pos = end;
    writeStream.emit('progress');
    callback();
  };
  writeStream.destroy = function() {
    writeStream.destroyed = true;
  };
  return writeStream;
};

BufferSlicer.prototype.ref = function() {
  this.refCount += 1;
};

BufferSlicer.prototype.unref = function() {
  this.refCount -= 1;

  if (this.refCount < 0) {
    throw new Error("invalid unref");
  }
};

function createFromBuffer(buffer, options) {
  return new BufferSlicer(buffer, options);
}

function createFromFd(fd, options) {
  return new FdSlicer(fd, options);
}
{
  "author": {
    "name": "Andrew Kelley",
    "email": "superjoe30@gmail.com"
  },
  "dependencies": {
    "pend": "~1.2.0"
  },
  "deprecated": false,
  "description": "safely create multiple ReadStream or WriteStream objects from the same file descriptor",
  "devDependencies": {
    "istanbul": "~0.3.3",
    "mocha": "~2.0.1",
    "stream-equal": "~0.1.5",
    "streamsink": "~1.2.0"
  },
  "directories": {
    "test": "test"
  },
  "homepage": "https://github.com/andrewrk/node-fd-slicer#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "fd-slicer",
  "repository": {
    "type": "git",
    "url": "git://github.com/andrewrk/node-fd-slicer.git"
  },
  "version": "1.1.0"
}'use strict';
var path = require('path');
var pathExists = require('path-exists');
var Promise = require('pinkie-promise');

function splitPath(x) {
	return path.resolve(x || '').split(path.sep);
}

function join(parts, filename) {
	return path.resolve(parts.join(path.sep) + path.sep, filename);
}

module.exports = function (filename, opts) {
	opts = opts || {};

	var parts = splitPath(opts.cwd);

	return new Promise(function (resolve) {
		(function find() {
			var fp = join(parts, filename);

			pathExists(fp).then(function (exists) {
				if (exists) {
					resolve(fp);
				} else if (parts.pop()) {
					find();
				} else {
					resolve(null);
				}
			});
		})();
	});
};

module.exports.sync = function (filename, opts) {
	opts = opts || {};

	var parts = splitPath(opts.cwd);
	var len = parts.length;

	while (len--) {
		var fp = join(parts, filename);

		if (pathExists.sync(fp)) {
			return fp;
		}

		parts.pop();
	}

	return null;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "path-exists": "^2.0.0",
    "pinkie-promise": "^2.0.0"
  },
  "deprecated": false,
  "description": "Find a file by walking up parent directories",
  "devDependencies": {
    "ava": "*",
    "tempfile": "^1.1.1",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/find-up#readme",
  "license": "MIT",
  "name": "find-up",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/find-up.git"
  },
  "version": "1.1.2"
}Apache License

Version 2.0, January 2004

http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

You must give any other recipients of the Work or Derivative Works a copy of this License; and

You must cause any modified files to carry prominent notices stating that You changed the files; and

You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONSmodule.exports = ForeverAgent
ForeverAgent.SSL = ForeverAgentSSL

var util = require('util')
  , Agent = require('http').Agent
  , net = require('net')
  , tls = require('tls')
  , AgentSSL = require('https').Agent
  
function getConnectionName(host, port) {  
  var name = ''
  if (typeof host === 'string') {
    name = host + ':' + port
  } else {
    // For node.js v012.0 and iojs-v1.5.1, host is an object. And any existing localAddress is part of the connection name.
    name = host.host + ':' + host.port + ':' + (host.localAddress ? (host.localAddress + ':') : ':')
  }
  return name
}    

function ForeverAgent(options) {
  var self = this
  self.options = options || {}
  self.requests = {}
  self.sockets = {}
  self.freeSockets = {}
  self.maxSockets = self.options.maxSockets || Agent.defaultMaxSockets
  self.minSockets = self.options.minSockets || ForeverAgent.defaultMinSockets
  self.on('free', function(socket, host, port) {
    var name = getConnectionName(host, port)

    if (self.requests[name] && self.requests[name].length) {
      self.requests[name].shift().onSocket(socket)
    } else if (self.sockets[name].length < self.minSockets) {
      if (!self.freeSockets[name]) self.freeSockets[name] = []
      self.freeSockets[name].push(socket)
      
      // if an error happens while we don't use the socket anyway, meh, throw the socket away
      var onIdleError = function() {
        socket.destroy()
      }
      socket._onIdleError = onIdleError
      socket.on('error', onIdleError)
    } else {
      // If there are no pending requests just destroy the
      // socket and it will get removed from the pool. This
      // gets us out of timeout issues and allows us to
      // default to Connection:keep-alive.
      socket.destroy()
    }
  })

}
util.inherits(ForeverAgent, Agent)

ForeverAgent.defaultMinSockets = 5


ForeverAgent.prototype.createConnection = net.createConnection
ForeverAgent.prototype.addRequestNoreuse = Agent.prototype.addRequest
ForeverAgent.prototype.addRequest = function(req, host, port) {
  var name = getConnectionName(host, port)
  
  if (typeof host !== 'string') {
    var options = host
    port = options.port
    host = options.host
  }

  if (this.freeSockets[name] && this.freeSockets[name].length > 0 && !req.useChunkedEncodingByDefault) {
    var idleSocket = this.freeSockets[name].pop()
    idleSocket.removeListener('error', idleSocket._onIdleError)
    delete idleSocket._onIdleError
    req._reusedSocket = true
    req.onSocket(idleSocket)
  } else {
    this.addRequestNoreuse(req, host, port)
  }
}

ForeverAgent.prototype.removeSocket = function(s, name, host, port) {
  if (this.sockets[name]) {
    var index = this.sockets[name].indexOf(s)
    if (index !== -1) {
      this.sockets[name].splice(index, 1)
    }
  } else if (this.sockets[name] && this.sockets[name].length === 0) {
    // don't leak
    delete this.sockets[name]
    delete this.requests[name]
  }
  
  if (this.freeSockets[name]) {
    var index = this.freeSockets[name].indexOf(s)
    if (index !== -1) {
      this.freeSockets[name].splice(index, 1)
      if (this.freeSockets[name].length === 0) {
        delete this.freeSockets[name]
      }
    }
  }

  if (this.requests[name] && this.requests[name].length) {
    // If we have pending requests and a socket gets closed a new one
    // needs to be created to take over in the pool for the one that closed.
    this.createSocket(name, host, port).emit('free')
  }
}

function ForeverAgentSSL (options) {
  ForeverAgent.call(this, options)
}
util.inherits(ForeverAgentSSL, ForeverAgent)

ForeverAgentSSL.prototype.createConnection = createConnectionSSL
ForeverAgentSSL.prototype.addRequestNoreuse = AgentSSL.prototype.addRequest

function createConnectionSSL (port, host, options) {
  if (typeof port === 'object') {
    options = port;
  } else if (typeof host === 'object') {
    options = host;
  } else if (typeof options === 'object') {
    options = options;
  } else {
    options = {};
  }

  if (typeof port === 'number') {
    options.port = port;
  }

  if (typeof host === 'string') {
    options.host = host;
  }

  return tls.connect(options);
}
{
  "author": {
    "name": "Mikeal Rogers",
    "email": "mikeal.rogers@gmail.com",
    "url": "http://www.futurealoof.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "HTTP Agent that keeps socket connections alive between keep-alive requests. Formerly part of mikeal/request, now a standalone module.",
  "devDependencies": {},
  "engines": {
    "node": "*"
  },
  "homepage": "https://github.com/mikeal/forever-agent#readme",
  "license": "Apache-2.0",
  "main": "index.js",
  "name": "forever-agent",
  "optionalDependencies": {},
  "repository": {
    "url": "git+https://github.com/mikeal/forever-agent.git"
  },
  "version": "0.6.1"
}Copyright (c) 2012 Felix GeisendÃ¶rfer (felix@debuggable.com) and contributors

 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
# Form-Data [![NPM Module](https://img.shields.io/npm/v/form-data.svg)](https://www.npmjs.com/package/form-data) [![Join the chat at https://gitter.im/form-data/form-data](http://form-data.github.io/images/gitterbadge.svg)](https://gitter.im/form-data/form-data)

A library to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications.

The API of this library is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd].

[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface

[![Linux Build](https://img.shields.io/travis/form-data/form-data/master.svg?label=linux:4.x-9.x)](https://travis-ci.org/form-data/form-data)
[![MacOS Build](https://img.shields.io/travis/form-data/form-data/master.svg?label=macos:4.x-9.x)](https://travis-ci.org/form-data/form-data)
[![Windows Build](https://img.shields.io/appveyor/ci/alexindigo/form-data/master.svg?label=windows:4.x-9.x)](https://ci.appveyor.com/project/alexindigo/form-data)

[![Coverage Status](https://img.shields.io/coveralls/form-data/form-data/master.svg?label=code+coverage)](https://coveralls.io/github/form-data/form-data?branch=master)
[![Dependency Status](https://img.shields.io/david/form-data/form-data.svg)](https://david-dm.org/form-data/form-data)
[![bitHound Overall Score](https://www.bithound.io/github/form-data/form-data/badges/score.svg)](https://www.bithound.io/github/form-data/form-data)

## Install

```
npm install --save form-data
```

## Usage

In this example we are constructing a form with 3 fields that contain a string,
a buffer and a file stream.

``` javascript
var FormData = require('form-data');
var fs = require('fs');

var form = new FormData();
form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));
form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
```

Also you can use http-response stream:

``` javascript
var FormData = require('form-data');
var http = require('http');

var form = new FormData();

http.request('http://nodejs.org/images/logo.png', function(response) {
  form.append('my_field', 'my value');
  form.append('my_buffer', new Buffer(10));
  form.append('my_logo', response);
});
```

Or @mikeal's [request](https://github.com/request/request) stream:

``` javascript
var FormData = require('form-data');
var request = require('request');

var form = new FormData();

form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));
form.append('my_logo', request('http://nodejs.org/images/logo.png'));
```

In order to submit this form to a web application, call ```submit(url, [callback])``` method:

``` javascript
form.submit('http://example.org/', function(err, res) {
  // res â€“ response object (http.IncomingMessage)  //
  res.resume();
});

```

For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods.

### Custom options

You can provide custom options, such as `maxDataSize`:

``` javascript
var FormData = require('form-data');

var form = new FormData({ maxDataSize: 20971520 });
form.append('my_field', 'my value');
form.append('my_buffer', /* something big */);
```

List of available options could be found in [combined-stream](https://github.com/felixge/node-combined-stream/blob/master/lib/combined_stream.js#L7-L15)

### Alternative submission methods

You can use node's http client interface:

``` javascript
var http = require('http');

var request = http.request({
  method: 'post',
  host: 'example.org',
  path: '/upload',
  headers: form.getHeaders()
});

form.pipe(request);

request.on('response', function(res) {
  console.log(res.statusCode);
});
```

Or if you would prefer the `'Content-Length'` header to be set for you:

``` javascript
form.submit('example.org/upload', function(err, res) {
  console.log(res.statusCode);
});
```

To use custom headers and pre-known length in parts:

``` javascript
var CRLF = '\r\n';
var form = new FormData();

var options = {
  header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF,
  knownLength: 1
};

form.append('my_buffer', buffer, options);

form.submit('http://example.com/', function(err, res) {
  if (err) throw err;
  console.log('Done');
});
```

Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually:

``` javascript
someModule.stream(function(err, stdout, stderr) {
  if (err) throw err;

  var form = new FormData();

  form.append('file', stdout, {
    filename: 'unicycle.jpg', // ... or:
    filepath: 'photos/toys/unicycle.jpg',
    contentType: 'image/jpeg',
    knownLength: 19806
  });

  form.submit('http://example.com/', function(err, res) {
    if (err) throw err;
    console.log('Done');
  });
});
```

The `filepath` property overrides `filename` and may contain a relative path. This is typically used when uploading [multiple files from a directory](https://wicg.github.io/entries-api/#dom-htmlinputelement-webkitdirectory).

For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter:

``` javascript
form.submit({
  host: 'example.com',
  path: '/probably.php?extra=params',
  auth: 'username:password'
}, function(err, res) {
  console.log(res.statusCode);
});
```

In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`:

``` javascript
form.submit({
  host: 'example.com',
  path: '/surelynot.php',
  headers: {'x-test-header': 'test-header-value'}
}, function(err, res) {
  console.log(res.statusCode);
});
```

### Integration with other libraries

#### Request

Form submission using  [request](https://github.com/request/request):

```javascript
var formData = {
  my_field: 'my_value',
  my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
};

request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) {
  if (err) {
    return console.error('upload failed:', err);
  }
  console.log('Upload successful!  Server responded with:', body);
});
```

For more details see [request readme](https://github.com/request/request#multipartform-data-multipart-form-uploads).

#### node-fetch

You can also submit a form using [node-fetch](https://github.com/bitinn/node-fetch):

```javascript
var form = new FormData();

form.append('a', 1);

fetch('http://example.com', { method: 'POST', body: form })
    .then(function(res) {
        return res.json();
    }).then(function(json) {
        console.log(json);
    });
```

## Notes

- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround.
- Starting version `2.x` FormData has dropped support for `node@0.10.x`.

## License

Form-Data is released under the [MIT](License) license.
{
  "author": {
    "name": "Felix GeisendÃ¶rfer",
    "email": "felix@debuggable.com",
    "url": "http://debuggable.com/"
  },
  "browser": "./lib/browser",
  "dependencies": {
    "asynckit": "^0.4.0",
    "combined-stream": "^1.0.6",
    "mime-types": "^2.1.12"
  },
  "deprecated": false,
  "description": "A library to create readable \"multipart/form-data\" streams. Can be used to submit forms and file uploads to other web applications.",
  "devDependencies": {
    "browserify": "^13.1.1",
    "browserify-istanbul": "^2.0.0",
    "coveralls": "^2.11.14",
    "cross-spawn": "^4.0.2",
    "eslint": "^3.9.1",
    "fake": "^0.2.2",
    "far": "^0.0.7",
    "formidable": "^1.0.17",
    "in-publish": "^2.0.0",
    "is-node-modern": "^1.0.0",
    "istanbul": "^0.4.5",
    "obake": "^0.1.2",
    "phantomjs-prebuilt": "^2.1.13",
    "pkgfiles": "^2.3.0",
    "pre-commit": "^1.1.3",
    "request": "2.76.0",
    "rimraf": "^2.5.4",
    "tape": "^4.6.2"
  },
  "engines": {
    "node": ">= 0.12"
  },
  "homepage": "https://github.com/form-data/form-data#readme",
  "license": "MIT",
  "main": "./lib/form_data",
  "name": "form-data",
  "pre-commit": [
    "lint",
    "ci-test",
    "check"
  ],
  "repository": {
    "type": "git",
    "url": "git://github.com/form-data/form-data.git"
  },
  "version": "2.3.3"
}/* eslint-env browser */
module.exports = typeof self == 'object' ? self.FormData : window.FormData;
var CombinedStream = require('combined-stream');
var util = require('util');
var path = require('path');
var http = require('http');
var https = require('https');
var parseUrl = require('url').parse;
var fs = require('fs');
var mime = require('mime-types');
var asynckit = require('asynckit');
var populate = require('./populate.js');

// Public API
module.exports = FormData;

// make it a Stream
util.inherits(FormData, CombinedStream);

/**
 * Create readable "multipart/form-data" streams.
 * Can be used to submit forms
 * and file uploads to other web applications.
 *
 * @constructor
 * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream
 */
function FormData(options) {
  if (!(this instanceof FormData)) {
    return new FormData();
  }

  this._overheadLength = 0;
  this._valueLength = 0;
  this._valuesToMeasure = [];

  CombinedStream.call(this);

  options = options || {};
  for (var option in options) {
    this[option] = options[option];
  }
}

FormData.LINE_BREAK = '\r\n';
FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';

FormData.prototype.append = function(field, value, options) {

  options = options || {};

  // allow filename as single option
  if (typeof options == 'string') {
    options = {filename: options};
  }

  var append = CombinedStream.prototype.append.bind(this);

  // all that streamy business can't handle numbers
  if (typeof value == 'number') {
    value = '' + value;
  }

  // https://github.com/felixge/node-form-data/issues/38
  if (util.isArray(value)) {
    // Please convert your array into string
    // the way web server expects it
    this._error(new Error('Arrays are not supported.'));
    return;
  }

  var header = this._multiPartHeader(field, value, options);
  var footer = this._multiPartFooter();

  append(header);
  append(value);
  append(footer);

  // pass along options.knownLength
  this._trackLength(header, value, options);
};

FormData.prototype._trackLength = function(header, value, options) {
  var valueLength = 0;

  // used w/ getLengthSync(), when length is known.
  // e.g. for streaming directly from a remote server,
  // w/ a known file a size, and not wanting to wait for
  // incoming file to finish to get its size.
  if (options.knownLength != null) {
    valueLength += +options.knownLength;
  } else if (Buffer.isBuffer(value)) {
    valueLength = value.length;
  } else if (typeof value === 'string') {
    valueLength = Buffer.byteLength(value);
  }

  this._valueLength += valueLength;

  // @check why add CRLF? does this account for custom/multiple CRLFs?
  this._overheadLength +=
    Buffer.byteLength(header) +
    FormData.LINE_BREAK.length;

  // empty or either doesn't have path or not an http response
  if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) )) {
    return;
  }

  // no need to bother with the length
  if (!options.knownLength) {
    this._valuesToMeasure.push(value);
  }
};

FormData.prototype._lengthRetriever = function(value, callback) {

  if (value.hasOwnProperty('fd')) {

    // take read range into a account
    // `end` = Infinity â€“> read file till the end
    //
    // TODO: Looks like there is bug in Node fs.createReadStream
    // it doesn't respect `end` options without `start` options
    // Fix it when node fixes it.
    // https://github.com/joyent/node/issues/7819
    if (value.end != undefined && value.end != Infinity && value.start != undefined) {

      // when end specified
      // no need to calculate range
      // inclusive, starts with 0
      callback(null, value.end + 1 - (value.start ? value.start : 0));

    // not that fast snoopy
    } else {
      // still need to fetch file size from fs
      fs.stat(value.path, function(err, stat) {

        var fileSize;

        if (err) {
          callback(err);
          return;
        }

        // update final size based on the range options
        fileSize = stat.size - (value.start ? value.start : 0);
        callback(null, fileSize);
      });
    }

  // or http response
  } else if (value.hasOwnProperty('httpVersion')) {
    callback(null, +value.headers['content-length']);

  // or request stream http://github.com/mikeal/request
  } else if (value.hasOwnProperty('httpModule')) {
    // wait till response come back
    value.on('response', function(response) {
      value.pause();
      callback(null, +response.headers['content-length']);
    });
    value.resume();

  // something else
  } else {
    callback('Unknown stream');
  }
};

FormData.prototype._multiPartHeader = function(field, value, options) {
  // custom header specified (as string)?
  // it becomes responsible for boundary
  // (e.g. to handle extra CRLFs on .NET servers)
  if (typeof options.header == 'string') {
    return options.header;
  }

  var contentDisposition = this._getContentDisposition(value, options);
  var contentType = this._getContentType(value, options);

  var contents = '';
  var headers  = {
    // add custom disposition as third element or keep it two elements if not
    'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []),
    // if no content type. allow it to be empty array
    'Content-Type': [].concat(contentType || [])
  };

  // allow custom headers.
  if (typeof options.header == 'object') {
    populate(headers, options.header);
  }

  var header;
  for (var prop in headers) {
    if (!headers.hasOwnProperty(prop)) continue;
    header = headers[prop];

    // skip nullish headers.
    if (header == null) {
      continue;
    }

    // convert all headers to arrays.
    if (!Array.isArray(header)) {
      header = [header];
    }

    // add non-empty headers.
    if (header.length) {
      contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;
    }
  }

  return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;
};

FormData.prototype._getContentDisposition = function(value, options) {

  var filename
    , contentDisposition
    ;

  if (typeof options.filepath === 'string') {
    // custom filepath for relative paths
    filename = path.normalize(options.filepath).replace(/\\/g, '/');
  } else if (options.filename || value.name || value.path) {
    // custom filename take precedence
    // formidable and the browser add a name property
    // fs- and request- streams have path property
    filename = path.basename(options.filename || value.name || value.path);
  } else if (value.readable && value.hasOwnProperty('httpVersion')) {
    // or try http response
    filename = path.basename(value.client._httpMessage.path);
  }

  if (filename) {
    contentDisposition = 'filename="' + filename + '"';
  }

  return contentDisposition;
};

FormData.prototype._getContentType = function(value, options) {

  // use custom content-type above all
  var contentType = options.contentType;

  // or try `name` from formidable, browser
  if (!contentType && value.name) {
    contentType = mime.lookup(value.name);
  }

  // or try `path` from fs-, request- streams
  if (!contentType && value.path) {
    contentType = mime.lookup(value.path);
  }

  // or if it's http-reponse
  if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {
    contentType = value.headers['content-type'];
  }

  // or guess it from the filepath or filename
  if (!contentType && (options.filepath || options.filename)) {
    contentType = mime.lookup(options.filepath || options.filename);
  }

  // fallback to the default content type if `value` is not simple value
  if (!contentType && typeof value == 'object') {
    contentType = FormData.DEFAULT_CONTENT_TYPE;
  }

  return contentType;
};

FormData.prototype._multiPartFooter = function() {
  return function(next) {
    var footer = FormData.LINE_BREAK;

    var lastPart = (this._streams.length === 0);
    if (lastPart) {
      footer += this._lastBoundary();
    }

    next(footer);
  }.bind(this);
};

FormData.prototype._lastBoundary = function() {
  return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;
};

FormData.prototype.getHeaders = function(userHeaders) {
  var header;
  var formHeaders = {
    'content-type': 'multipart/form-data; boundary=' + this.getBoundary()
  };

  for (header in userHeaders) {
    if (userHeaders.hasOwnProperty(header)) {
      formHeaders[header.toLowerCase()] = userHeaders[header];
    }
  }

  return formHeaders;
};

FormData.prototype.getBoundary = function() {
  if (!this._boundary) {
    this._generateBoundary();
  }

  return this._boundary;
};

FormData.prototype._generateBoundary = function() {
  // This generates a 50 character boundary similar to those used by Firefox.
  // They are optimized for boyer-moore parsing.
  var boundary = '--------------------------';
  for (var i = 0; i < 24; i++) {
    boundary += Math.floor(Math.random() * 10).toString(16);
  }

  this._boundary = boundary;
};

// Note: getLengthSync DOESN'T calculate streams length
// As workaround one can calculate file size manually
// and add it as knownLength option
FormData.prototype.getLengthSync = function() {
  var knownLength = this._overheadLength + this._valueLength;

  // Don't get confused, there are 3 "internal" streams for each keyval pair
  // so it basically checks if there is any value added to the form
  if (this._streams.length) {
    knownLength += this._lastBoundary().length;
  }

  // https://github.com/form-data/form-data/issues/40
  if (!this.hasKnownLength()) {
    // Some async length retrievers are present
    // therefore synchronous length calculation is false.
    // Please use getLength(callback) to get proper length
    this._error(new Error('Cannot calculate proper length in synchronous way.'));
  }

  return knownLength;
};

// Public API to check if length of added values is known
// https://github.com/form-data/form-data/issues/196
// https://github.com/form-data/form-data/issues/262
FormData.prototype.hasKnownLength = function() {
  var hasKnownLength = true;

  if (this._valuesToMeasure.length) {
    hasKnownLength = false;
  }

  return hasKnownLength;
};

FormData.prototype.getLength = function(cb) {
  var knownLength = this._overheadLength + this._valueLength;

  if (this._streams.length) {
    knownLength += this._lastBoundary().length;
  }

  if (!this._valuesToMeasure.length) {
    process.nextTick(cb.bind(this, null, knownLength));
    return;
  }

  asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {
    if (err) {
      cb(err);
      return;
    }

    values.forEach(function(length) {
      knownLength += length;
    });

    cb(null, knownLength);
  });
};

FormData.prototype.submit = function(params, cb) {
  var request
    , options
    , defaults = {method: 'post'}
    ;

  // parse provided url if it's string
  // or treat it as options object
  if (typeof params == 'string') {

    params = parseUrl(params);
    options = populate({
      port: params.port,
      path: params.pathname,
      host: params.hostname,
      protocol: params.protocol
    }, defaults);

  // use custom params
  } else {

    options = populate(params, defaults);
    // if no port provided use default one
    if (!options.port) {
      options.port = options.protocol == 'https:' ? 443 : 80;
    }
  }

  // put that good code in getHeaders to some use
  options.headers = this.getHeaders(params.headers);

  // https if specified, fallback to http in any other case
  if (options.protocol == 'https:') {
    request = https.request(options);
  } else {
    request = http.request(options);
  }

  // get content length and fire away
  this.getLength(function(err, length) {
    if (err) {
      this._error(err);
      return;
    }

    // add content length
    request.setHeader('Content-Length', length);

    this.pipe(request);
    if (cb) {
      request.on('error', cb);
      request.on('response', cb.bind(this, null));
    }
  }.bind(this));

  return request;
};

FormData.prototype._error = function(err) {
  if (!this.error) {
    this.error = err;
    this.pause();
    this.emit('error', err);
  }
};

FormData.prototype.toString = function () {
  return '[object FormData]';
};
// populates missing values
module.exports = function(dst, src) {

  Object.keys(src).forEach(function(prop)
  {
    dst[prop] = dst[prop] || src[prop];
  });

  return dst;
};
(The MIT License)

Copyright (c) 2011-2017 JP Richardson

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
 merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "JP Richardson",
    "email": "jprichardson@gmail.com"
  },
  "dependencies": {
    "graceful-fs": "^4.2.0",
    "jsonfile": "^4.0.0",
    "universalify": "^0.1.0"
  },
  "deprecated": false,
  "description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as mkdir -p, cp -r, and rm -rf.",
  "devDependencies": {
    "coveralls": "^3.0.0",
    "istanbul": "^0.4.5",
    "klaw": "^2.1.1",
    "klaw-sync": "^3.0.2",
    "minimist": "^1.1.1",
    "mocha": "^5.0.5",
    "proxyquire": "^2.0.1",
    "read-dir-files": "^0.1.1",
    "semver": "^5.3.0",
    "standard": "^12.0.1"
  },
  "engines": {
    "node": ">=6 <7 || >=8"
  },
  "files": [
    "lib/",
    "!lib/**/__tests__/"
  ],
  "homepage": "https://github.com/jprichardson/node-fs-extra",
  "license": "MIT",
  "main": "./lib/index.js",
  "name": "fs-extra",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jprichardson/node-fs-extra.git"
  },
  "version": "8.1.0"
}'use strict'

module.exports = Object.assign(
  {},
  // Export promiseified graceful-fs:
  require('./fs'),
  // Export extra methods:
  require('./copy-sync'),
  require('./copy'),
  require('./empty'),
  require('./ensure'),
  require('./json'),
  require('./mkdirs'),
  require('./move-sync'),
  require('./move'),
  require('./output'),
  require('./path-exists'),
  require('./remove')
)

// Export fs.promises as a getter property so that we don't trigger
// ExperimentalWarning before fs.promises is actually accessed.
const fs = require('fs')
if (Object.getOwnPropertyDescriptor(fs, 'promises')) {
  Object.defineProperty(module.exports, 'promises', {
    get () { return fs.promises }
  })
}
'use strict'
/* eslint-disable node/no-deprecated-api */
module.exports = function (size) {
  if (typeof Buffer.allocUnsafe === 'function') {
    try {
      return Buffer.allocUnsafe(size)
    } catch (e) {
      return new Buffer(size)
    }
  }
  return new Buffer(size)
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')

const NODE_VERSION_MAJOR_WITH_BIGINT = 10
const NODE_VERSION_MINOR_WITH_BIGINT = 5
const NODE_VERSION_PATCH_WITH_BIGINT = 0
const nodeVersion = process.versions.node.split('.')
const nodeVersionMajor = Number.parseInt(nodeVersion[0], 10)
const nodeVersionMinor = Number.parseInt(nodeVersion[1], 10)
const nodeVersionPatch = Number.parseInt(nodeVersion[2], 10)

function nodeSupportsBigInt () {
  if (nodeVersionMajor > NODE_VERSION_MAJOR_WITH_BIGINT) {
    return true
  } else if (nodeVersionMajor === NODE_VERSION_MAJOR_WITH_BIGINT) {
    if (nodeVersionMinor > NODE_VERSION_MINOR_WITH_BIGINT) {
      return true
    } else if (nodeVersionMinor === NODE_VERSION_MINOR_WITH_BIGINT) {
      if (nodeVersionPatch >= NODE_VERSION_PATCH_WITH_BIGINT) {
        return true
      }
    }
  }
  return false
}

function getStats (src, dest, cb) {
  if (nodeSupportsBigInt()) {
    fs.stat(src, { bigint: true }, (err, srcStat) => {
      if (err) return cb(err)
      fs.stat(dest, { bigint: true }, (err, destStat) => {
        if (err) {
          if (err.code === 'ENOENT') return cb(null, { srcStat, destStat: null })
          return cb(err)
        }
        return cb(null, { srcStat, destStat })
      })
    })
  } else {
    fs.stat(src, (err, srcStat) => {
      if (err) return cb(err)
      fs.stat(dest, (err, destStat) => {
        if (err) {
          if (err.code === 'ENOENT') return cb(null, { srcStat, destStat: null })
          return cb(err)
        }
        return cb(null, { srcStat, destStat })
      })
    })
  }
}

function getStatsSync (src, dest) {
  let srcStat, destStat
  if (nodeSupportsBigInt()) {
    srcStat = fs.statSync(src, { bigint: true })
  } else {
    srcStat = fs.statSync(src)
  }
  try {
    if (nodeSupportsBigInt()) {
      destStat = fs.statSync(dest, { bigint: true })
    } else {
      destStat = fs.statSync(dest)
    }
  } catch (err) {
    if (err.code === 'ENOENT') return { srcStat, destStat: null }
    throw err
  }
  return { srcStat, destStat }
}

function checkPaths (src, dest, funcName, cb) {
  getStats(src, dest, (err, stats) => {
    if (err) return cb(err)
    const { srcStat, destStat } = stats
    if (destStat && destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
      return cb(new Error('Source and destination must not be the same.'))
    }
    if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
      return cb(new Error(errMsg(src, dest, funcName)))
    }
    return cb(null, { srcStat, destStat })
  })
}

function checkPathsSync (src, dest, funcName) {
  const { srcStat, destStat } = getStatsSync(src, dest)
  if (destStat && destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
    throw new Error('Source and destination must not be the same.')
  }
  if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
    throw new Error(errMsg(src, dest, funcName))
  }
  return { srcStat, destStat }
}

// recursively check if dest parent is a subdirectory of src.
// It works for all file types including symlinks since it
// checks the src and dest inodes. It starts from the deepest
// parent and stops once it reaches the src parent or the root path.
function checkParentPaths (src, srcStat, dest, funcName, cb) {
  const srcParent = path.resolve(path.dirname(src))
  const destParent = path.resolve(path.dirname(dest))
  if (destParent === srcParent || destParent === path.parse(destParent).root) return cb()
  if (nodeSupportsBigInt()) {
    fs.stat(destParent, { bigint: true }, (err, destStat) => {
      if (err) {
        if (err.code === 'ENOENT') return cb()
        return cb(err)
      }
      if (destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
        return cb(new Error(errMsg(src, dest, funcName)))
      }
      return checkParentPaths(src, srcStat, destParent, funcName, cb)
    })
  } else {
    fs.stat(destParent, (err, destStat) => {
      if (err) {
        if (err.code === 'ENOENT') return cb()
        return cb(err)
      }
      if (destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
        return cb(new Error(errMsg(src, dest, funcName)))
      }
      return checkParentPaths(src, srcStat, destParent, funcName, cb)
    })
  }
}

function checkParentPathsSync (src, srcStat, dest, funcName) {
  const srcParent = path.resolve(path.dirname(src))
  const destParent = path.resolve(path.dirname(dest))
  if (destParent === srcParent || destParent === path.parse(destParent).root) return
  let destStat
  try {
    if (nodeSupportsBigInt()) {
      destStat = fs.statSync(destParent, { bigint: true })
    } else {
      destStat = fs.statSync(destParent)
    }
  } catch (err) {
    if (err.code === 'ENOENT') return
    throw err
  }
  if (destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
    throw new Error(errMsg(src, dest, funcName))
  }
  return checkParentPathsSync(src, srcStat, destParent, funcName)
}

// return true if dest is a subdir of src, otherwise false.
// It only checks the path strings.
function isSrcSubdir (src, dest) {
  const srcArr = path.resolve(src).split(path.sep).filter(i => i)
  const destArr = path.resolve(dest).split(path.sep).filter(i => i)
  return srcArr.reduce((acc, cur, i) => acc && destArr[i] === cur, true)
}

function errMsg (src, dest, funcName) {
  return `Cannot ${funcName} '${src}' to a subdirectory of itself, '${dest}'.`
}

module.exports = {
  checkPaths,
  checkPathsSync,
  checkParentPaths,
  checkParentPathsSync,
  isSrcSubdir
}
'use strict'

const fs = require('graceful-fs')
const os = require('os')
const path = require('path')

// HFS, ext{2,3}, FAT do not, Node.js v0.10 does not
function hasMillisResSync () {
  let tmpfile = path.join('millis-test-sync' + Date.now().toString() + Math.random().toString().slice(2))
  tmpfile = path.join(os.tmpdir(), tmpfile)

  // 550 millis past UNIX epoch
  const d = new Date(1435410243862)
  fs.writeFileSync(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141')
  const fd = fs.openSync(tmpfile, 'r+')
  fs.futimesSync(fd, d, d)
  fs.closeSync(fd)
  return fs.statSync(tmpfile).mtime > 1435410243000
}

function hasMillisRes (callback) {
  let tmpfile = path.join('millis-test' + Date.now().toString() + Math.random().toString().slice(2))
  tmpfile = path.join(os.tmpdir(), tmpfile)

  // 550 millis past UNIX epoch
  const d = new Date(1435410243862)
  fs.writeFile(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141', err => {
    if (err) return callback(err)
    fs.open(tmpfile, 'r+', (err, fd) => {
      if (err) return callback(err)
      fs.futimes(fd, d, d, err => {
        if (err) return callback(err)
        fs.close(fd, err => {
          if (err) return callback(err)
          fs.stat(tmpfile, (err, stats) => {
            if (err) return callback(err)
            callback(null, stats.mtime > 1435410243000)
          })
        })
      })
    })
  })
}

function timeRemoveMillis (timestamp) {
  if (typeof timestamp === 'number') {
    return Math.floor(timestamp / 1000) * 1000
  } else if (timestamp instanceof Date) {
    return new Date(Math.floor(timestamp.getTime() / 1000) * 1000)
  } else {
    throw new Error('fs-extra: timeRemoveMillis() unknown parameter type')
  }
}

function utimesMillis (path, atime, mtime, callback) {
  // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)
  fs.open(path, 'r+', (err, fd) => {
    if (err) return callback(err)
    fs.futimes(fd, atime, mtime, futimesErr => {
      fs.close(fd, closeErr => {
        if (callback) callback(futimesErr || closeErr)
      })
    })
  })
}

function utimesMillisSync (path, atime, mtime) {
  const fd = fs.openSync(path, 'r+')
  fs.futimesSync(fd, atime, mtime)
  return fs.closeSync(fd)
}

module.exports = {
  hasMillisRes,
  hasMillisResSync,
  timeRemoveMillis,
  utimesMillis,
  utimesMillisSync
}
'use strict'

const u = require('universalify').fromCallback
const rimraf = require('./rimraf')

module.exports = {
  remove: u(rimraf),
  removeSync: rimraf.sync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const assert = require('assert')

const isWindows = (process.platform === 'win32')

function defaults (options) {
  const methods = [
    'unlink',
    'chmod',
    'stat',
    'lstat',
    'rmdir',
    'readdir'
  ]
  methods.forEach(m => {
    options[m] = options[m] || fs[m]
    m = m + 'Sync'
    options[m] = options[m] || fs[m]
  })

  options.maxBusyTries = options.maxBusyTries || 3
}

function rimraf (p, options, cb) {
  let busyTries = 0

  if (typeof options === 'function') {
    cb = options
    options = {}
  }

  assert(p, 'rimraf: missing path')
  assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
  assert.strictEqual(typeof cb, 'function', 'rimraf: callback function required')
  assert(options, 'rimraf: invalid options argument provided')
  assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')

  defaults(options)

  rimraf_(p, options, function CB (er) {
    if (er) {
      if ((er.code === 'EBUSY' || er.code === 'ENOTEMPTY' || er.code === 'EPERM') &&
          busyTries < options.maxBusyTries) {
        busyTries++
        const time = busyTries * 100
        // try again, with the same exact callback as this one.
        return setTimeout(() => rimraf_(p, options, CB), time)
      }

      // already gone
      if (er.code === 'ENOENT') er = null
    }

    cb(er)
  })
}

// Two possible strategies.
// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
//
// Both result in an extra syscall when you guess wrong.  However, there
// are likely far more normal files in the world than directories.  This
// is based on the assumption that a the average number of files per
// directory is >= 1.
//
// If anyone ever complains about this, then I guess the strategy could
// be made configurable somehow.  But until then, YAGNI.
function rimraf_ (p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  // sunos lets the root user unlink directories, which is... weird.
  // so we have to lstat here and make sure it's not a dir.
  options.lstat(p, (er, st) => {
    if (er && er.code === 'ENOENT') {
      return cb(null)
    }

    // Windows can EPERM on stat.  Life is suffering.
    if (er && er.code === 'EPERM' && isWindows) {
      return fixWinEPERM(p, options, er, cb)
    }

    if (st && st.isDirectory()) {
      return rmdir(p, options, er, cb)
    }

    options.unlink(p, er => {
      if (er) {
        if (er.code === 'ENOENT') {
          return cb(null)
        }
        if (er.code === 'EPERM') {
          return (isWindows)
            ? fixWinEPERM(p, options, er, cb)
            : rmdir(p, options, er, cb)
        }
        if (er.code === 'EISDIR') {
          return rmdir(p, options, er, cb)
        }
      }
      return cb(er)
    })
  })
}

function fixWinEPERM (p, options, er, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')
  if (er) {
    assert(er instanceof Error)
  }

  options.chmod(p, 0o666, er2 => {
    if (er2) {
      cb(er2.code === 'ENOENT' ? null : er)
    } else {
      options.stat(p, (er3, stats) => {
        if (er3) {
          cb(er3.code === 'ENOENT' ? null : er)
        } else if (stats.isDirectory()) {
          rmdir(p, options, er, cb)
        } else {
          options.unlink(p, cb)
        }
      })
    }
  })
}

function fixWinEPERMSync (p, options, er) {
  let stats

  assert(p)
  assert(options)
  if (er) {
    assert(er instanceof Error)
  }

  try {
    options.chmodSync(p, 0o666)
  } catch (er2) {
    if (er2.code === 'ENOENT') {
      return
    } else {
      throw er
    }
  }

  try {
    stats = options.statSync(p)
  } catch (er3) {
    if (er3.code === 'ENOENT') {
      return
    } else {
      throw er
    }
  }

  if (stats.isDirectory()) {
    rmdirSync(p, options, er)
  } else {
    options.unlinkSync(p)
  }
}

function rmdir (p, options, originalEr, cb) {
  assert(p)
  assert(options)
  if (originalEr) {
    assert(originalEr instanceof Error)
  }
  assert(typeof cb === 'function')

  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
  // if we guessed wrong, and it's not a directory, then
  // raise the original error.
  options.rmdir(p, er => {
    if (er && (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM')) {
      rmkids(p, options, cb)
    } else if (er && er.code === 'ENOTDIR') {
      cb(originalEr)
    } else {
      cb(er)
    }
  })
}

function rmkids (p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  options.readdir(p, (er, files) => {
    if (er) return cb(er)

    let n = files.length
    let errState

    if (n === 0) return options.rmdir(p, cb)

    files.forEach(f => {
      rimraf(path.join(p, f), options, er => {
        if (errState) {
          return
        }
        if (er) return cb(errState = er)
        if (--n === 0) {
          options.rmdir(p, cb)
        }
      })
    })
  })
}

// this looks simpler, and is strictly *faster*, but will
// tie up the JavaScript thread and fail on excessively
// deep directory trees.
function rimrafSync (p, options) {
  let st

  options = options || {}
  defaults(options)

  assert(p, 'rimraf: missing path')
  assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
  assert(options, 'rimraf: missing options')
  assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')

  try {
    st = options.lstatSync(p)
  } catch (er) {
    if (er.code === 'ENOENT') {
      return
    }

    // Windows can EPERM on stat.  Life is suffering.
    if (er.code === 'EPERM' && isWindows) {
      fixWinEPERMSync(p, options, er)
    }
  }

  try {
    // sunos lets the root user unlink directories, which is... weird.
    if (st && st.isDirectory()) {
      rmdirSync(p, options, null)
    } else {
      options.unlinkSync(p)
    }
  } catch (er) {
    if (er.code === 'ENOENT') {
      return
    } else if (er.code === 'EPERM') {
      return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
    } else if (er.code !== 'EISDIR') {
      throw er
    }
    rmdirSync(p, options, er)
  }
}

function rmdirSync (p, options, originalEr) {
  assert(p)
  assert(options)
  if (originalEr) {
    assert(originalEr instanceof Error)
  }

  try {
    options.rmdirSync(p)
  } catch (er) {
    if (er.code === 'ENOTDIR') {
      throw originalEr
    } else if (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM') {
      rmkidsSync(p, options)
    } else if (er.code !== 'ENOENT') {
      throw er
    }
  }
}

function rmkidsSync (p, options) {
  assert(p)
  assert(options)
  options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))

  if (isWindows) {
    // We only end up here once we got ENOTEMPTY at least once, and
    // at this point, we are guaranteed to have removed all the kids.
    // So, we know that it won't be ENOENT or ENOTDIR or anything else.
    // try really hard to delete stuff on windows, because it has a
    // PROFOUNDLY annoying habit of not closing handles promptly when
    // files are deleted, resulting in spurious ENOTEMPTY errors.
    const startTime = Date.now()
    do {
      try {
        const ret = options.rmdirSync(p, options)
        return ret
      } catch (er) { }
    } while (Date.now() - startTime < 500) // give up after 500ms
  } else {
    const ret = options.rmdirSync(p, options)
    return ret
  }
}

module.exports = rimraf
rimraf.sync = rimrafSync
'use strict'
const u = require('universalify').fromPromise
const fs = require('../fs')

function pathExists (path) {
  return fs.access(path).then(() => true).catch(() => false)
}

module.exports = {
  pathExists: u(pathExists),
  pathExistsSync: fs.existsSync
}
'use strict'

const u = require('universalify').fromCallback
const fs = require('graceful-fs')
const path = require('path')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function outputFile (file, data, encoding, callback) {
  if (typeof encoding === 'function') {
    callback = encoding
    encoding = 'utf8'
  }

  const dir = path.dirname(file)
  pathExists(dir, (err, itDoes) => {
    if (err) return callback(err)
    if (itDoes) return fs.writeFile(file, data, encoding, callback)

    mkdir.mkdirs(dir, err => {
      if (err) return callback(err)

      fs.writeFile(file, data, encoding, callback)
    })
  })
}

function outputFileSync (file, ...args) {
  const dir = path.dirname(file)
  if (fs.existsSync(dir)) {
    return fs.writeFileSync(file, ...args)
  }
  mkdir.mkdirsSync(dir)
  fs.writeFileSync(file, ...args)
}

module.exports = {
  outputFile: u(outputFile),
  outputFileSync
}
'use strict'

module.exports = {
  moveSync: require('./move-sync')
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const copySync = require('../copy-sync').copySync
const removeSync = require('../remove').removeSync
const mkdirpSync = require('../mkdirs').mkdirpSync
const stat = require('../util/stat')

function moveSync (src, dest, opts) {
  opts = opts || {}
  const overwrite = opts.overwrite || opts.clobber || false

  const { srcStat } = stat.checkPathsSync(src, dest, 'move')
  stat.checkParentPathsSync(src, srcStat, dest, 'move')
  mkdirpSync(path.dirname(dest))
  return doRename(src, dest, overwrite)
}

function doRename (src, dest, overwrite) {
  if (overwrite) {
    removeSync(dest)
    return rename(src, dest, overwrite)
  }
  if (fs.existsSync(dest)) throw new Error('dest already exists.')
  return rename(src, dest, overwrite)
}

function rename (src, dest, overwrite) {
  try {
    fs.renameSync(src, dest)
  } catch (err) {
    if (err.code !== 'EXDEV') throw err
    return moveAcrossDevice(src, dest, overwrite)
  }
}

function moveAcrossDevice (src, dest, overwrite) {
  const opts = {
    overwrite,
    errorOnExist: true
  }
  copySync(src, dest, opts)
  return removeSync(src)
}

module.exports = moveSync
'use strict'

const u = require('universalify').fromCallback
module.exports = {
  move: u(require('./move'))
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const copy = require('../copy').copy
const remove = require('../remove').remove
const mkdirp = require('../mkdirs').mkdirp
const pathExists = require('../path-exists').pathExists
const stat = require('../util/stat')

function move (src, dest, opts, cb) {
  if (typeof opts === 'function') {
    cb = opts
    opts = {}
  }

  const overwrite = opts.overwrite || opts.clobber || false

  stat.checkPaths(src, dest, 'move', (err, stats) => {
    if (err) return cb(err)
    const { srcStat } = stats
    stat.checkParentPaths(src, srcStat, dest, 'move', err => {
      if (err) return cb(err)
      mkdirp(path.dirname(dest), err => {
        if (err) return cb(err)
        return doRename(src, dest, overwrite, cb)
      })
    })
  })
}

function doRename (src, dest, overwrite, cb) {
  if (overwrite) {
    return remove(dest, err => {
      if (err) return cb(err)
      return rename(src, dest, overwrite, cb)
    })
  }
  pathExists(dest, (err, destExists) => {
    if (err) return cb(err)
    if (destExists) return cb(new Error('dest already exists.'))
    return rename(src, dest, overwrite, cb)
  })
}

function rename (src, dest, overwrite, cb) {
  fs.rename(src, dest, err => {
    if (!err) return cb()
    if (err.code !== 'EXDEV') return cb(err)
    return moveAcrossDevice(src, dest, overwrite, cb)
  })
}

function moveAcrossDevice (src, dest, overwrite, cb) {
  const opts = {
    overwrite,
    errorOnExist: true
  }
  copy(src, dest, opts, err => {
    if (err) return cb(err)
    return remove(src, cb)
  })
}

module.exports = move
'use strict'
const u = require('universalify').fromCallback
const mkdirs = u(require('./mkdirs'))
const mkdirsSync = require('./mkdirs-sync')

module.exports = {
  mkdirs,
  mkdirsSync,
  // alias
  mkdirp: mkdirs,
  mkdirpSync: mkdirsSync,
  ensureDir: mkdirs,
  ensureDirSync: mkdirsSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const invalidWin32Path = require('./win32').invalidWin32Path

const o777 = parseInt('0777', 8)

function mkdirsSync (p, opts, made) {
  if (!opts || typeof opts !== 'object') {
    opts = { mode: opts }
  }

  let mode = opts.mode
  const xfs = opts.fs || fs

  if (process.platform === 'win32' && invalidWin32Path(p)) {
    const errInval = new Error(p + ' contains invalid WIN32 path characters.')
    errInval.code = 'EINVAL'
    throw errInval
  }

  if (mode === undefined) {
    mode = o777 & (~process.umask())
  }
  if (!made) made = null

  p = path.resolve(p)

  try {
    xfs.mkdirSync(p, mode)
    made = made || p
  } catch (err0) {
    if (err0.code === 'ENOENT') {
      if (path.dirname(p) === p) throw err0
      made = mkdirsSync(path.dirname(p), opts, made)
      mkdirsSync(p, opts, made)
    } else {
      // In the case of any other error, just see if there's a dir there
      // already. If so, then hooray!  If not, then something is borked.
      let stat
      try {
        stat = xfs.statSync(p)
      } catch (err1) {
        throw err0
      }
      if (!stat.isDirectory()) throw err0
    }
  }

  return made
}

module.exports = mkdirsSync
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const invalidWin32Path = require('./win32').invalidWin32Path

const o777 = parseInt('0777', 8)

function mkdirs (p, opts, callback, made) {
  if (typeof opts === 'function') {
    callback = opts
    opts = {}
  } else if (!opts || typeof opts !== 'object') {
    opts = { mode: opts }
  }

  if (process.platform === 'win32' && invalidWin32Path(p)) {
    const errInval = new Error(p + ' contains invalid WIN32 path characters.')
    errInval.code = 'EINVAL'
    return callback(errInval)
  }

  let mode = opts.mode
  const xfs = opts.fs || fs

  if (mode === undefined) {
    mode = o777 & (~process.umask())
  }
  if (!made) made = null

  callback = callback || function () {}
  p = path.resolve(p)

  xfs.mkdir(p, mode, er => {
    if (!er) {
      made = made || p
      return callback(null, made)
    }
    switch (er.code) {
      case 'ENOENT':
        if (path.dirname(p) === p) return callback(er)
        mkdirs(path.dirname(p), opts, (er, made) => {
          if (er) callback(er, made)
          else mkdirs(p, opts, callback, made)
        })
        break

      // In the case of any other error, just see if there's a dir
      // there already.  If so, then hooray!  If not, then something
      // is borked.
      default:
        xfs.stat(p, (er2, stat) => {
          // if the stat fails, then that's super weird.
          // let the original error be the failure reason.
          if (er2 || !stat.isDirectory()) callback(er, made)
          else callback(null, made)
        })
        break
    }
  })
}

module.exports = mkdirs
'use strict'

const path = require('path')

// get drive on windows
function getRootPath (p) {
  p = path.normalize(path.resolve(p)).split(path.sep)
  if (p.length > 0) return p[0]
  return null
}

// http://stackoverflow.com/a/62888/10333 contains more accurate
// TODO: expand to include the rest
const INVALID_PATH_CHARS = /[<>:"|?*]/

function invalidWin32Path (p) {
  const rp = getRootPath(p)
  p = p.replace(rp, '')
  return INVALID_PATH_CHARS.test(p)
}

module.exports = {
  getRootPath,
  invalidWin32Path
}
'use strict'

const u = require('universalify').fromCallback
const jsonFile = require('./jsonfile')

jsonFile.outputJson = u(require('./output-json'))
jsonFile.outputJsonSync = require('./output-json-sync')
// aliases
jsonFile.outputJSON = jsonFile.outputJson
jsonFile.outputJSONSync = jsonFile.outputJsonSync
jsonFile.writeJSON = jsonFile.writeJson
jsonFile.writeJSONSync = jsonFile.writeJsonSync
jsonFile.readJSON = jsonFile.readJson
jsonFile.readJSONSync = jsonFile.readJsonSync

module.exports = jsonFile
'use strict'

const u = require('universalify').fromCallback
const jsonFile = require('jsonfile')

module.exports = {
  // jsonfile exports
  readJson: u(jsonFile.readFile),
  readJsonSync: jsonFile.readFileSync,
  writeJson: u(jsonFile.writeFile),
  writeJsonSync: jsonFile.writeFileSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdir = require('../mkdirs')
const jsonFile = require('./jsonfile')

function outputJsonSync (file, data, options) {
  const dir = path.dirname(file)

  if (!fs.existsSync(dir)) {
    mkdir.mkdirsSync(dir)
  }

  jsonFile.writeJsonSync(file, data, options)
}

module.exports = outputJsonSync
'use strict'

const path = require('path')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists
const jsonFile = require('./jsonfile')

function outputJson (file, data, options, callback) {
  if (typeof options === 'function') {
    callback = options
    options = {}
  }

  const dir = path.dirname(file)

  pathExists(dir, (err, itDoes) => {
    if (err) return callback(err)
    if (itDoes) return jsonFile.writeJson(file, data, options, callback)

    mkdir.mkdirs(dir, err => {
      if (err) return callback(err)
      jsonFile.writeJson(file, data, options, callback)
    })
  })
}

module.exports = outputJson
'use strict'
// This is adapted from https://github.com/normalize/mz
// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
const u = require('universalify').fromCallback
const fs = require('graceful-fs')

const api = [
  'access',
  'appendFile',
  'chmod',
  'chown',
  'close',
  'copyFile',
  'fchmod',
  'fchown',
  'fdatasync',
  'fstat',
  'fsync',
  'ftruncate',
  'futimes',
  'lchown',
  'lchmod',
  'link',
  'lstat',
  'mkdir',
  'mkdtemp',
  'open',
  'readFile',
  'readdir',
  'readlink',
  'realpath',
  'rename',
  'rmdir',
  'stat',
  'symlink',
  'truncate',
  'unlink',
  'utimes',
  'writeFile'
].filter(key => {
  // Some commands are not available on some systems. Ex:
  // fs.copyFile was added in Node.js v8.5.0
  // fs.mkdtemp was added in Node.js v5.10.0
  // fs.lchown is not available on at least some Linux
  return typeof fs[key] === 'function'
})

// Export all keys:
Object.keys(fs).forEach(key => {
  if (key === 'promises') {
    // fs.promises is a getter property that triggers ExperimentalWarning
    // Don't re-export it here, the getter is defined in "lib/index.js"
    return
  }
  exports[key] = fs[key]
})

// Universalify async methods:
api.forEach(method => {
  exports[method] = u(fs[method])
})

// We differ from mz/fs in that we still ship the old, broken, fs.exists()
// since we are a drop-in replacement for the native module
exports.exists = function (filename, callback) {
  if (typeof callback === 'function') {
    return fs.exists(filename, callback)
  }
  return new Promise(resolve => {
    return fs.exists(filename, resolve)
  })
}

// fs.read() & fs.write need special treatment due to multiple callback args

exports.read = function (fd, buffer, offset, length, position, callback) {
  if (typeof callback === 'function') {
    return fs.read(fd, buffer, offset, length, position, callback)
  }
  return new Promise((resolve, reject) => {
    fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
      if (err) return reject(err)
      resolve({ bytesRead, buffer })
    })
  })
}

// Function signature can be
// fs.write(fd, buffer[, offset[, length[, position]]], callback)
// OR
// fs.write(fd, string[, position[, encoding]], callback)
// We need to handle both cases, so we use ...args
exports.write = function (fd, buffer, ...args) {
  if (typeof args[args.length - 1] === 'function') {
    return fs.write(fd, buffer, ...args)
  }

  return new Promise((resolve, reject) => {
    fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {
      if (err) return reject(err)
      resolve({ bytesWritten, buffer })
    })
  })
}

// fs.realpath.native only available in Node v9.2+
if (typeof fs.realpath.native === 'function') {
  exports.realpath.native = u(fs.realpath.native)
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function createFile (file, callback) {
  function makeFile () {
    fs.writeFile(file, '', err => {
      if (err) return callback(err)
      callback()
    })
  }

  fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err
    if (!err && stats.isFile()) return callback()
    const dir = path.dirname(file)
    pathExists(dir, (err, dirExists) => {
      if (err) return callback(err)
      if (dirExists) return makeFile()
      mkdir.mkdirs(dir, err => {
        if (err) return callback(err)
        makeFile()
      })
    })
  })
}

function createFileSync (file) {
  let stats
  try {
    stats = fs.statSync(file)
  } catch (e) {}
  if (stats && stats.isFile()) return

  const dir = path.dirname(file)
  if (!fs.existsSync(dir)) {
    mkdir.mkdirsSync(dir)
  }

  fs.writeFileSync(file, '')
}

module.exports = {
  createFile: u(createFile),
  createFileSync
}
'use strict'

const file = require('./file')
const link = require('./link')
const symlink = require('./symlink')

module.exports = {
  // file
  createFile: file.createFile,
  createFileSync: file.createFileSync,
  ensureFile: file.createFile,
  ensureFileSync: file.createFileSync,
  // link
  createLink: link.createLink,
  createLinkSync: link.createLinkSync,
  ensureLink: link.createLink,
  ensureLinkSync: link.createLinkSync,
  // symlink
  createSymlink: symlink.createSymlink,
  createSymlinkSync: symlink.createSymlinkSync,
  ensureSymlink: symlink.createSymlink,
  ensureSymlinkSync: symlink.createSymlinkSync
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function createLink (srcpath, dstpath, callback) {
  function makeLink (srcpath, dstpath) {
    fs.link(srcpath, dstpath, err => {
      if (err) return callback(err)
      callback(null)
    })
  }

  pathExists(dstpath, (err, destinationExists) => {
    if (err) return callback(err)
    if (destinationExists) return callback(null)
    fs.lstat(srcpath, (err) => {
      if (err) {
        err.message = err.message.replace('lstat', 'ensureLink')
        return callback(err)
      }

      const dir = path.dirname(dstpath)
      pathExists(dir, (err, dirExists) => {
        if (err) return callback(err)
        if (dirExists) return makeLink(srcpath, dstpath)
        mkdir.mkdirs(dir, err => {
          if (err) return callback(err)
          makeLink(srcpath, dstpath)
        })
      })
    })
  })
}

function createLinkSync (srcpath, dstpath) {
  const destinationExists = fs.existsSync(dstpath)
  if (destinationExists) return undefined

  try {
    fs.lstatSync(srcpath)
  } catch (err) {
    err.message = err.message.replace('lstat', 'ensureLink')
    throw err
  }

  const dir = path.dirname(dstpath)
  const dirExists = fs.existsSync(dir)
  if (dirExists) return fs.linkSync(srcpath, dstpath)
  mkdir.mkdirsSync(dir)

  return fs.linkSync(srcpath, dstpath)
}

module.exports = {
  createLink: u(createLink),
  createLinkSync
}
'use strict'

const path = require('path')
const fs = require('graceful-fs')
const pathExists = require('../path-exists').pathExists

/**
 * Function that returns two types of paths, one relative to symlink, and one
 * relative to the current working directory. Checks if path is absolute or
 * relative. If the path is relative, this function checks if the path is
 * relative to symlink or relative to current working directory. This is an
 * initiative to find a smarter `srcpath` to supply when building symlinks.
 * This allows you to determine which path to use out of one of three possible
 * types of source paths. The first is an absolute path. This is detected by
 * `path.isAbsolute()`. When an absolute path is provided, it is checked to
 * see if it exists. If it does it's used, if not an error is returned
 * (callback)/ thrown (sync). The other two options for `srcpath` are a
 * relative url. By default Node's `fs.symlink` works by creating a symlink
 * using `dstpath` and expects the `srcpath` to be relative to the newly
 * created symlink. If you provide a `srcpath` that does not exist on the file
 * system it results in a broken symlink. To minimize this, the function
 * checks to see if the 'relative to symlink' source file exists, and if it
 * does it will use it. If it does not, it checks if there's a file that
 * exists that is relative to the current working directory, if does its used.
 * This preserves the expectations of the original fs.symlink spec and adds
 * the ability to pass in `relative to current working direcotry` paths.
 */

function symlinkPaths (srcpath, dstpath, callback) {
  if (path.isAbsolute(srcpath)) {
    return fs.lstat(srcpath, (err) => {
      if (err) {
        err.message = err.message.replace('lstat', 'ensureSymlink')
        return callback(err)
      }
      return callback(null, {
        'toCwd': srcpath,
        'toDst': srcpath
      })
    })
  } else {
    const dstdir = path.dirname(dstpath)
    const relativeToDst = path.join(dstdir, srcpath)
    return pathExists(relativeToDst, (err, exists) => {
      if (err) return callback(err)
      if (exists) {
        return callback(null, {
          'toCwd': relativeToDst,
          'toDst': srcpath
        })
      } else {
        return fs.lstat(srcpath, (err) => {
          if (err) {
            err.message = err.message.replace('lstat', 'ensureSymlink')
            return callback(err)
          }
          return callback(null, {
            'toCwd': srcpath,
            'toDst': path.relative(dstdir, srcpath)
          })
        })
      }
    })
  }
}

function symlinkPathsSync (srcpath, dstpath) {
  let exists
  if (path.isAbsolute(srcpath)) {
    exists = fs.existsSync(srcpath)
    if (!exists) throw new Error('absolute srcpath does not exist')
    return {
      'toCwd': srcpath,
      'toDst': srcpath
    }
  } else {
    const dstdir = path.dirname(dstpath)
    const relativeToDst = path.join(dstdir, srcpath)
    exists = fs.existsSync(relativeToDst)
    if (exists) {
      return {
        'toCwd': relativeToDst,
        'toDst': srcpath
      }
    } else {
      exists = fs.existsSync(srcpath)
      if (!exists) throw new Error('relative srcpath does not exist')
      return {
        'toCwd': srcpath,
        'toDst': path.relative(dstdir, srcpath)
      }
    }
  }
}

module.exports = {
  symlinkPaths,
  symlinkPathsSync
}
'use strict'

const fs = require('graceful-fs')

function symlinkType (srcpath, type, callback) {
  callback = (typeof type === 'function') ? type : callback
  type = (typeof type === 'function') ? false : type
  if (type) return callback(null, type)
  fs.lstat(srcpath, (err, stats) => {
    if (err) return callback(null, 'file')
    type = (stats && stats.isDirectory()) ? 'dir' : 'file'
    callback(null, type)
  })
}

function symlinkTypeSync (srcpath, type) {
  let stats

  if (type) return type
  try {
    stats = fs.lstatSync(srcpath)
  } catch (e) {
    return 'file'
  }
  return (stats && stats.isDirectory()) ? 'dir' : 'file'
}

module.exports = {
  symlinkType,
  symlinkTypeSync
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const _mkdirs = require('../mkdirs')
const mkdirs = _mkdirs.mkdirs
const mkdirsSync = _mkdirs.mkdirsSync

const _symlinkPaths = require('./symlink-paths')
const symlinkPaths = _symlinkPaths.symlinkPaths
const symlinkPathsSync = _symlinkPaths.symlinkPathsSync

const _symlinkType = require('./symlink-type')
const symlinkType = _symlinkType.symlinkType
const symlinkTypeSync = _symlinkType.symlinkTypeSync

const pathExists = require('../path-exists').pathExists

function createSymlink (srcpath, dstpath, type, callback) {
  callback = (typeof type === 'function') ? type : callback
  type = (typeof type === 'function') ? false : type

  pathExists(dstpath, (err, destinationExists) => {
    if (err) return callback(err)
    if (destinationExists) return callback(null)
    symlinkPaths(srcpath, dstpath, (err, relative) => {
      if (err) return callback(err)
      srcpath = relative.toDst
      symlinkType(relative.toCwd, type, (err, type) => {
        if (err) return callback(err)
        const dir = path.dirname(dstpath)
        pathExists(dir, (err, dirExists) => {
          if (err) return callback(err)
          if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
          mkdirs(dir, err => {
            if (err) return callback(err)
            fs.symlink(srcpath, dstpath, type, callback)
          })
        })
      })
    })
  })
}

function createSymlinkSync (srcpath, dstpath, type) {
  const destinationExists = fs.existsSync(dstpath)
  if (destinationExists) return undefined

  const relative = symlinkPathsSync(srcpath, dstpath)
  srcpath = relative.toDst
  type = symlinkTypeSync(relative.toCwd, type)
  const dir = path.dirname(dstpath)
  const exists = fs.existsSync(dir)
  if (exists) return fs.symlinkSync(srcpath, dstpath, type)
  mkdirsSync(dir)
  return fs.symlinkSync(srcpath, dstpath, type)
}

module.exports = {
  createSymlink: u(createSymlink),
  createSymlinkSync
}
'use strict'

const u = require('universalify').fromCallback
const fs = require('graceful-fs')
const path = require('path')
const mkdir = require('../mkdirs')
const remove = require('../remove')

const emptyDir = u(function emptyDir (dir, callback) {
  callback = callback || function () {}
  fs.readdir(dir, (err, items) => {
    if (err) return mkdir.mkdirs(dir, callback)

    items = items.map(item => path.join(dir, item))

    deleteItem()

    function deleteItem () {
      const item = items.pop()
      if (!item) return callback()
      remove.remove(item, err => {
        if (err) return callback(err)
        deleteItem()
      })
    }
  })
})

function emptyDirSync (dir) {
  let items
  try {
    items = fs.readdirSync(dir)
  } catch (err) {
    return mkdir.mkdirsSync(dir)
  }

  items.forEach(item => {
    item = path.join(dir, item)
    remove.removeSync(item)
  })
}

module.exports = {
  emptyDirSync,
  emptydirSync: emptyDirSync,
  emptyDir,
  emptydir: emptyDir
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdirpSync = require('../mkdirs').mkdirsSync
const utimesSync = require('../util/utimes.js').utimesMillisSync
const stat = require('../util/stat')

function copySync (src, dest, opts) {
  if (typeof opts === 'function') {
    opts = { filter: opts }
  }

  opts = opts || {}
  opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
  opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber

  // Warn about using preserveTimestamps on 32-bit node
  if (opts.preserveTimestamps && process.arch === 'ia32') {
    console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
    see https://github.com/jprichardson/node-fs-extra/issues/269`)
  }

  const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy')
  stat.checkParentPathsSync(src, srcStat, dest, 'copy')
  return handleFilterAndCopy(destStat, src, dest, opts)
}

function handleFilterAndCopy (destStat, src, dest, opts) {
  if (opts.filter && !opts.filter(src, dest)) return
  const destParent = path.dirname(dest)
  if (!fs.existsSync(destParent)) mkdirpSync(destParent)
  return startCopy(destStat, src, dest, opts)
}

function startCopy (destStat, src, dest, opts) {
  if (opts.filter && !opts.filter(src, dest)) return
  return getStats(destStat, src, dest, opts)
}

function getStats (destStat, src, dest, opts) {
  const statSync = opts.dereference ? fs.statSync : fs.lstatSync
  const srcStat = statSync(src)

  if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts)
  else if (srcStat.isFile() ||
           srcStat.isCharacterDevice() ||
           srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts)
  else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts)
}

function onFile (srcStat, destStat, src, dest, opts) {
  if (!destStat) return copyFile(srcStat, src, dest, opts)
  return mayCopyFile(srcStat, src, dest, opts)
}

function mayCopyFile (srcStat, src, dest, opts) {
  if (opts.overwrite) {
    fs.unlinkSync(dest)
    return copyFile(srcStat, src, dest, opts)
  } else if (opts.errorOnExist) {
    throw new Error(`'${dest}' already exists`)
  }
}

function copyFile (srcStat, src, dest, opts) {
  if (typeof fs.copyFileSync === 'function') {
    fs.copyFileSync(src, dest)
    fs.chmodSync(dest, srcStat.mode)
    if (opts.preserveTimestamps) {
      return utimesSync(dest, srcStat.atime, srcStat.mtime)
    }
    return
  }
  return copyFileFallback(srcStat, src, dest, opts)
}

function copyFileFallback (srcStat, src, dest, opts) {
  const BUF_LENGTH = 64 * 1024
  const _buff = require('../util/buffer')(BUF_LENGTH)

  const fdr = fs.openSync(src, 'r')
  const fdw = fs.openSync(dest, 'w', srcStat.mode)
  let pos = 0

  while (pos < srcStat.size) {
    const bytesRead = fs.readSync(fdr, _buff, 0, BUF_LENGTH, pos)
    fs.writeSync(fdw, _buff, 0, bytesRead)
    pos += bytesRead
  }

  if (opts.preserveTimestamps) fs.futimesSync(fdw, srcStat.atime, srcStat.mtime)

  fs.closeSync(fdr)
  fs.closeSync(fdw)
}

function onDir (srcStat, destStat, src, dest, opts) {
  if (!destStat) return mkDirAndCopy(srcStat, src, dest, opts)
  if (destStat && !destStat.isDirectory()) {
    throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`)
  }
  return copyDir(src, dest, opts)
}

function mkDirAndCopy (srcStat, src, dest, opts) {
  fs.mkdirSync(dest)
  copyDir(src, dest, opts)
  return fs.chmodSync(dest, srcStat.mode)
}

function copyDir (src, dest, opts) {
  fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts))
}

function copyDirItem (item, src, dest, opts) {
  const srcItem = path.join(src, item)
  const destItem = path.join(dest, item)
  const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy')
  return startCopy(destStat, srcItem, destItem, opts)
}

function onLink (destStat, src, dest, opts) {
  let resolvedSrc = fs.readlinkSync(src)
  if (opts.dereference) {
    resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
  }

  if (!destStat) {
    return fs.symlinkSync(resolvedSrc, dest)
  } else {
    let resolvedDest
    try {
      resolvedDest = fs.readlinkSync(dest)
    } catch (err) {
      // dest exists and is a regular file or directory,
      // Windows may throw UNKNOWN error. If dest already exists,
      // fs throws error anyway, so no need to guard against it here.
      if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest)
      throw err
    }
    if (opts.dereference) {
      resolvedDest = path.resolve(process.cwd(), resolvedDest)
    }
    if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
      throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`)
    }

    // prevent copy if src is a subdir of dest since unlinking
    // dest in this case would result in removing src contents
    // and therefore a broken symlink would be created.
    if (fs.statSync(dest).isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
      throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)
    }
    return copyLink(resolvedSrc, dest)
  }
}

function copyLink (resolvedSrc, dest) {
  fs.unlinkSync(dest)
  return fs.symlinkSync(resolvedSrc, dest)
}

module.exports = copySync
'use strict'

module.exports = {
  copySync: require('./copy-sync')
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdirp = require('../mkdirs').mkdirs
const pathExists = require('../path-exists').pathExists
const utimes = require('../util/utimes').utimesMillis
const stat = require('../util/stat')

function copy (src, dest, opts, cb) {
  if (typeof opts === 'function' && !cb) {
    cb = opts
    opts = {}
  } else if (typeof opts === 'function') {
    opts = { filter: opts }
  }

  cb = cb || function () {}
  opts = opts || {}

  opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
  opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber

  // Warn about using preserveTimestamps on 32-bit node
  if (opts.preserveTimestamps && process.arch === 'ia32') {
    console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
    see https://github.com/jprichardson/node-fs-extra/issues/269`)
  }

  stat.checkPaths(src, dest, 'copy', (err, stats) => {
    if (err) return cb(err)
    const { srcStat, destStat } = stats
    stat.checkParentPaths(src, srcStat, dest, 'copy', err => {
      if (err) return cb(err)
      if (opts.filter) return handleFilter(checkParentDir, destStat, src, dest, opts, cb)
      return checkParentDir(destStat, src, dest, opts, cb)
    })
  })
}

function checkParentDir (destStat, src, dest, opts, cb) {
  const destParent = path.dirname(dest)
  pathExists(destParent, (err, dirExists) => {
    if (err) return cb(err)
    if (dirExists) return startCopy(destStat, src, dest, opts, cb)
    mkdirp(destParent, err => {
      if (err) return cb(err)
      return startCopy(destStat, src, dest, opts, cb)
    })
  })
}

function handleFilter (onInclude, destStat, src, dest, opts, cb) {
  Promise.resolve(opts.filter(src, dest)).then(include => {
    if (include) return onInclude(destStat, src, dest, opts, cb)
    return cb()
  }, error => cb(error))
}

function startCopy (destStat, src, dest, opts, cb) {
  if (opts.filter) return handleFilter(getStats, destStat, src, dest, opts, cb)
  return getStats(destStat, src, dest, opts, cb)
}

function getStats (destStat, src, dest, opts, cb) {
  const stat = opts.dereference ? fs.stat : fs.lstat
  stat(src, (err, srcStat) => {
    if (err) return cb(err)

    if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts, cb)
    else if (srcStat.isFile() ||
             srcStat.isCharacterDevice() ||
             srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts, cb)
    else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts, cb)
  })
}

function onFile (srcStat, destStat, src, dest, opts, cb) {
  if (!destStat) return copyFile(srcStat, src, dest, opts, cb)
  return mayCopyFile(srcStat, src, dest, opts, cb)
}

function mayCopyFile (srcStat, src, dest, opts, cb) {
  if (opts.overwrite) {
    fs.unlink(dest, err => {
      if (err) return cb(err)
      return copyFile(srcStat, src, dest, opts, cb)
    })
  } else if (opts.errorOnExist) {
    return cb(new Error(`'${dest}' already exists`))
  } else return cb()
}

function copyFile (srcStat, src, dest, opts, cb) {
  if (typeof fs.copyFile === 'function') {
    return fs.copyFile(src, dest, err => {
      if (err) return cb(err)
      return setDestModeAndTimestamps(srcStat, dest, opts, cb)
    })
  }
  return copyFileFallback(srcStat, src, dest, opts, cb)
}

function copyFileFallback (srcStat, src, dest, opts, cb) {
  const rs = fs.createReadStream(src)
  rs.on('error', err => cb(err)).once('open', () => {
    const ws = fs.createWriteStream(dest, { mode: srcStat.mode })
    ws.on('error', err => cb(err))
      .on('open', () => rs.pipe(ws))
      .once('close', () => setDestModeAndTimestamps(srcStat, dest, opts, cb))
  })
}

function setDestModeAndTimestamps (srcStat, dest, opts, cb) {
  fs.chmod(dest, srcStat.mode, err => {
    if (err) return cb(err)
    if (opts.preserveTimestamps) {
      return utimes(dest, srcStat.atime, srcStat.mtime, cb)
    }
    return cb()
  })
}

function onDir (srcStat, destStat, src, dest, opts, cb) {
  if (!destStat) return mkDirAndCopy(srcStat, src, dest, opts, cb)
  if (destStat && !destStat.isDirectory()) {
    return cb(new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`))
  }
  return copyDir(src, dest, opts, cb)
}

function mkDirAndCopy (srcStat, src, dest, opts, cb) {
  fs.mkdir(dest, err => {
    if (err) return cb(err)
    copyDir(src, dest, opts, err => {
      if (err) return cb(err)
      return fs.chmod(dest, srcStat.mode, cb)
    })
  })
}

function copyDir (src, dest, opts, cb) {
  fs.readdir(src, (err, items) => {
    if (err) return cb(err)
    return copyDirItems(items, src, dest, opts, cb)
  })
}

function copyDirItems (items, src, dest, opts, cb) {
  const item = items.pop()
  if (!item) return cb()
  return copyDirItem(items, item, src, dest, opts, cb)
}

function copyDirItem (items, item, src, dest, opts, cb) {
  const srcItem = path.join(src, item)
  const destItem = path.join(dest, item)
  stat.checkPaths(srcItem, destItem, 'copy', (err, stats) => {
    if (err) return cb(err)
    const { destStat } = stats
    startCopy(destStat, srcItem, destItem, opts, err => {
      if (err) return cb(err)
      return copyDirItems(items, src, dest, opts, cb)
    })
  })
}

function onLink (destStat, src, dest, opts, cb) {
  fs.readlink(src, (err, resolvedSrc) => {
    if (err) return cb(err)
    if (opts.dereference) {
      resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
    }

    if (!destStat) {
      return fs.symlink(resolvedSrc, dest, cb)
    } else {
      fs.readlink(dest, (err, resolvedDest) => {
        if (err) {
          // dest exists and is a regular file or directory,
          // Windows may throw UNKNOWN error. If dest already exists,
          // fs throws error anyway, so no need to guard against it here.
          if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest, cb)
          return cb(err)
        }
        if (opts.dereference) {
          resolvedDest = path.resolve(process.cwd(), resolvedDest)
        }
        if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
          return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))
        }

        // do not copy if src is a subdir of dest since unlinking
        // dest in this case would result in removing src contents
        // and therefore a broken symlink would be created.
        if (destStat.isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
          return cb(new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`))
        }
        return copyLink(resolvedSrc, dest, cb)
      })
    }
  })
}

function copyLink (resolvedSrc, dest, cb) {
  fs.unlink(dest, err => {
    if (err) return cb(err)
    return fs.symlink(resolvedSrc, dest, cb)
  })
}

module.exports = copy
'use strict'

const u = require('universalify').fromCallback
module.exports = {
  copy: u(require('./copy'))
}
The MIT License (MIT)

Copyright (c) 2017 Vladimir Krivosheev

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
"use strict"

const path = require("path")
const nodeFs = require("fs")
const fsExtra = require("fs-extra")
const Promise = require('bluebird-lst')

function makeFs(Promise) {
  const fs = Object.create(null)

  for (const methodName of Object.keys(fsExtra)) {
    const method = fsExtra[methodName]
    if (methodName === "createFile" || methodName === "mkdirp") {
      continue
    }

    if (typeof method !== "function" ||
        methodName.endsWith("Sync") ||
        methodName.endsWith("Stream") ||
        methodName.match(/^[A-Z]/) ||
        methodName === "exists" ||
        methodName === "watch" ||
        methodName === "watchFile" ||
        methodName === "unwatchFile") {
      fs[methodName] = method
    }
    else {
      fs[methodName] = Promise.promisify(method)
    }
  }

  fs.createFile = fs.ensureFile
  fs.mkdirp = fs.mkdirs
  return fs
}

const newFs = makeFs(Promise)

newFs.emptyDir = function (dir) {
  return new Promise((resolve, reject) => {
    nodeFs.readdir(dir, (error, files) => {
      if (error == null) {
        Promise.map(files, it => newFs.remove(path.join(dir, it)))
          .then(resolve)
          .catch(reject)
      }
      else {
        newFs.mkdirs(dir)
          .then(resolve)
          .catch(reject)
      }
    })
  })
}

module.exports = newFs{
  "dependencies": {
    "bluebird-lst": "^1.0.9",
    "fs-extra": "^8.1.0"
  },
  "deprecated": false,
  "description": "fs-extra module promisified with bluebird",
  "engines": {
    "node": ">=8.6"
  },
  "files": [
    "index.*"
  ],
  "homepage": "https://github.com/develar/fs-extra-p#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "fs-extra-p",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/develar/fs-extra-p.git"
  },
  "version": "8.1.0"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

----

This library bundles a version of the `fs.realpath` and `fs.realpathSync`
methods from Node.js v0.10 under the terms of the Node.js MIT license.

Node's license follows, also included at the header of `old.js` which contains
the licensed code:

  Copyright Joyent, Inc. and other Node contributors.

  Permission is hereby granted, free of charge, to any person obtaining a
  copy of this software and associated documentation files (the "Software"),
  to deal in the Software without restriction, including without limitation
  the rights to use, copy, modify, merge, publish, distribute, sublicense,
  and/or sell copies of the Software, and to permit persons to whom the
  Software is furnished to do so, subject to the following conditions:

  The above copyright notice and this permission notice shall be included in
  all copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  DEALINGS IN THE SOFTWARE.
module.exports = realpath
realpath.realpath = realpath
realpath.sync = realpathSync
realpath.realpathSync = realpathSync
realpath.monkeypatch = monkeypatch
realpath.unmonkeypatch = unmonkeypatch

var fs = require('fs')
var origRealpath = fs.realpath
var origRealpathSync = fs.realpathSync

var version = process.version
var ok = /^v[0-5]\./.test(version)
var old = require('./old.js')

function newError (er) {
  return er && er.syscall === 'realpath' && (
    er.code === 'ELOOP' ||
    er.code === 'ENOMEM' ||
    er.code === 'ENAMETOOLONG'
  )
}

function realpath (p, cache, cb) {
  if (ok) {
    return origRealpath(p, cache, cb)
  }

  if (typeof cache === 'function') {
    cb = cache
    cache = null
  }
  origRealpath(p, cache, function (er, result) {
    if (newError(er)) {
      old.realpath(p, cache, cb)
    } else {
      cb(er, result)
    }
  })
}

function realpathSync (p, cache) {
  if (ok) {
    return origRealpathSync(p, cache)
  }

  try {
    return origRealpathSync(p, cache)
  } catch (er) {
    if (newError(er)) {
      return old.realpathSync(p, cache)
    } else {
      throw er
    }
  }
}

function monkeypatch () {
  fs.realpath = realpath
  fs.realpathSync = realpathSync
}

function unmonkeypatch () {
  fs.realpath = origRealpath
  fs.realpathSync = origRealpathSync
}
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

var pathModule = require('path');
var isWindows = process.platform === 'win32';
var fs = require('fs');

// JavaScript implementation of realpath, ported from node pre-v6

var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);

function rethrow() {
  // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and
  // is fairly slow to generate.
  var callback;
  if (DEBUG) {
    var backtrace = new Error;
    callback = debugCallback;
  } else
    callback = missingCallback;

  return callback;

  function debugCallback(err) {
    if (err) {
      backtrace.message = err.message;
      err = backtrace;
      missingCallback(err);
    }
  }

  function missingCallback(err) {
    if (err) {
      if (process.throwDeprecation)
        throw err;  // Forgot a callback but don't know where? Use NODE_DEBUG=fs
      else if (!process.noDeprecation) {
        var msg = 'fs: missing callback ' + (err.stack || err.message);
        if (process.traceDeprecation)
          console.trace(msg);
        else
          console.error(msg);
      }
    }
  }
}

function maybeCallback(cb) {
  return typeof cb === 'function' ? cb : rethrow();
}

var normalize = pathModule.normalize;

// Regexp that finds the next partion of a (partial) path
// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']
if (isWindows) {
  var nextPartRe = /(.*?)(?:[\/\\]+|$)/g;
} else {
  var nextPartRe = /(.*?)(?:[\/]+|$)/g;
}

// Regex to find the device root, including trailing slash. E.g. 'c:\\'.
if (isWindows) {
  var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/;
} else {
  var splitRootRe = /^[\/]*/;
}

exports.realpathSync = function realpathSync(p, cache) {
  // make p is absolute
  p = pathModule.resolve(p);

  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
    return cache[p];
  }

  var original = p,
      seenLinks = {},
      knownHard = {};

  // current character position in p
  var pos;
  // the partial path so far, including a trailing slash if any
  var current;
  // the partial path without a trailing slash (except when pointing at a root)
  var base;
  // the partial path scanned in the previous round, with slash
  var previous;

  start();

  function start() {
    // Skip over roots
    var m = splitRootRe.exec(p);
    pos = m[0].length;
    current = m[0];
    base = m[0];
    previous = '';

    // On windows, check that the root exists. On unix there is no need.
    if (isWindows && !knownHard[base]) {
      fs.lstatSync(base);
      knownHard[base] = true;
    }
  }

  // walk down the path, swapping out linked pathparts for their real
  // values
  // NB: p.length changes.
  while (pos < p.length) {
    // find the next part
    nextPartRe.lastIndex = pos;
    var result = nextPartRe.exec(p);
    previous = current;
    current += result[0];
    base = previous + result[1];
    pos = nextPartRe.lastIndex;

    // continue if not a symlink
    if (knownHard[base] || (cache && cache[base] === base)) {
      continue;
    }

    var resolvedLink;
    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
      // some known symbolic link.  no need to stat again.
      resolvedLink = cache[base];
    } else {
      var stat = fs.lstatSync(base);
      if (!stat.isSymbolicLink()) {
        knownHard[base] = true;
        if (cache) cache[base] = base;
        continue;
      }

      // read the link if it wasn't read before
      // dev/ino always return 0 on windows, so skip the check.
      var linkTarget = null;
      if (!isWindows) {
        var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
        if (seenLinks.hasOwnProperty(id)) {
          linkTarget = seenLinks[id];
        }
      }
      if (linkTarget === null) {
        fs.statSync(base);
        linkTarget = fs.readlinkSync(base);
      }
      resolvedLink = pathModule.resolve(previous, linkTarget);
      // track this, if given a cache.
      if (cache) cache[base] = resolvedLink;
      if (!isWindows) seenLinks[id] = linkTarget;
    }

    // resolve the link, then start over
    p = pathModule.resolve(resolvedLink, p.slice(pos));
    start();
  }

  if (cache) cache[original] = p;

  return p;
};


exports.realpath = function realpath(p, cache, cb) {
  if (typeof cb !== 'function') {
    cb = maybeCallback(cache);
    cache = null;
  }

  // make p is absolute
  p = pathModule.resolve(p);

  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
    return process.nextTick(cb.bind(null, null, cache[p]));
  }

  var original = p,
      seenLinks = {},
      knownHard = {};

  // current character position in p
  var pos;
  // the partial path so far, including a trailing slash if any
  var current;
  // the partial path without a trailing slash (except when pointing at a root)
  var base;
  // the partial path scanned in the previous round, with slash
  var previous;

  start();

  function start() {
    // Skip over roots
    var m = splitRootRe.exec(p);
    pos = m[0].length;
    current = m[0];
    base = m[0];
    previous = '';

    // On windows, check that the root exists. On unix there is no need.
    if (isWindows && !knownHard[base]) {
      fs.lstat(base, function(err) {
        if (err) return cb(err);
        knownHard[base] = true;
        LOOP();
      });
    } else {
      process.nextTick(LOOP);
    }
  }

  // walk down the path, swapping out linked pathparts for their real
  // values
  function LOOP() {
    // stop if scanned past end of path
    if (pos >= p.length) {
      if (cache) cache[original] = p;
      return cb(null, p);
    }

    // find the next part
    nextPartRe.lastIndex = pos;
    var result = nextPartRe.exec(p);
    previous = current;
    current += result[0];
    base = previous + result[1];
    pos = nextPartRe.lastIndex;

    // continue if not a symlink
    if (knownHard[base] || (cache && cache[base] === base)) {
      return process.nextTick(LOOP);
    }

    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
      // known symbolic link.  no need to stat again.
      return gotResolvedLink(cache[base]);
    }

    return fs.lstat(base, gotStat);
  }

  function gotStat(err, stat) {
    if (err) return cb(err);

    // if not a symlink, skip to the next path part
    if (!stat.isSymbolicLink()) {
      knownHard[base] = true;
      if (cache) cache[base] = base;
      return process.nextTick(LOOP);
    }

    // stat & read the link if not read before
    // call gotTarget as soon as the link target is known
    // dev/ino always return 0 on windows, so skip the check.
    if (!isWindows) {
      var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
      if (seenLinks.hasOwnProperty(id)) {
        return gotTarget(null, seenLinks[id], base);
      }
    }
    fs.stat(base, function(err) {
      if (err) return cb(err);

      fs.readlink(base, function(err, target) {
        if (!isWindows) seenLinks[id] = target;
        gotTarget(err, target);
      });
    });
  }

  function gotTarget(err, target, base) {
    if (err) return cb(err);

    var resolvedLink = pathModule.resolve(previous, target);
    if (cache) cache[base] = resolvedLink;
    gotResolvedLink(resolvedLink);
  }

  function gotResolvedLink(resolvedLink) {
    // resolve the link, then start over
    p = pathModule.resolve(resolvedLink, p.slice(pos));
    start();
  }
};
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Use node's fs.realpath, but fall back to the JS implementation if the native one fails",
  "devDependencies": {},
  "files": [
    "old.js",
    "index.js"
  ],
  "homepage": "https://github.com/isaacs/fs.realpath#readme",
  "license": "ISC",
  "main": "index.js",
  "name": "fs.realpath",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/fs.realpath.git"
  },
  "version": "1.0.0"
}ISC License (ISC)
Copyright 2018 Stefan Penner

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
"use strict";
// Call this function in a another function to find out the file from
// which that function was called from. (Inspects the v8 stack trace)
//
// Inspired by http://stackoverflow.com/questions/13227489
module.exports = function getCallerFile(position) {
    if (position === void 0) { position = 2; }
    if (position >= Error.stackTraceLimit) {
        throw new TypeError('getCallerFile(position) requires position be less then Error.stackTraceLimit but position was: `' + position + '` and Error.stackTraceLimit was: `' + Error.stackTraceLimit + '`');
    }
    var oldPrepareStackTrace = Error.prepareStackTrace;
    Error.prepareStackTrace = function (_, stack) { return stack; };
    var stack = new Error().stack;
    Error.prepareStackTrace = oldPrepareStackTrace;
    if (stack !== null && typeof stack === 'object') {
        // stack[0] holds this file
        // stack[1] holds where this function was called
        // stack[2] holds the file we're interested in
        return stack[position] ? stack[position].getFileName() : undefined;
    }
};
//# sourceMappingURL=index.js.map{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,qEAAqE;AACrE,EAAE;AACF,0DAA0D;AAE1D,iBAAS,SAAS,aAAa,CAAC,QAAY;IAAZ,yBAAA,EAAA,YAAY;IAC1C,IAAI,QAAQ,IAAI,KAAK,CAAC,eAAe,EAAE;QACrC,MAAM,IAAI,SAAS,CAAC,kGAAkG,GAAG,QAAQ,GAAG,oCAAoC,GAAG,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;KACzM;IAED,IAAM,oBAAoB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACrD,KAAK,CAAC,iBAAiB,GAAG,UAAC,CAAC,EAAE,KAAK,IAAM,OAAA,KAAK,EAAL,CAAK,CAAC;IAC/C,IAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC;IAChC,KAAK,CAAC,iBAAiB,GAAG,oBAAoB,CAAC;IAG/C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC/C,2BAA2B;QAC3B,gDAAgD;QAChD,8CAA8C;QAC9C,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,QAAQ,CAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;KAC7E;AACH,CAAC,CAAC"}{
  "author": {
    "name": "Stefan Penner"
  },
  "deprecated": false,
  "description": "[![Build Status](https://travis-ci.org/stefanpenner/get-caller-file.svg?branch=master)](https://travis-ci.org/stefanpenner/get-caller-file) [![Build status](https://ci.appveyor.com/api/projects/status/ol2q94g1932cy14a/branch/master?svg=true)](https://ci.appveyor.com/project/embercli/get-caller-file/branch/master)",
  "devDependencies": {
    "@types/chai": "^4.1.7",
    "@types/ensure-posix-path": "^1.0.0",
    "@types/mocha": "^5.2.6",
    "@types/node": "^11.10.5",
    "chai": "^4.1.2",
    "ensure-posix-path": "^1.0.1",
    "mocha": "^5.2.0",
    "typescript": "^3.3.3333"
  },
  "directories": {
    "test": "tests"
  },
  "engines": {
    "node": "6.* || 8.* || >= 10.*"
  },
  "files": [
    "index.js",
    "index.js.map",
    "index.d.ts"
  ],
  "homepage": "https://github.com/stefanpenner/get-caller-file#readme",
  "license": "ISC",
  "main": "index.js",
  "name": "get-caller-file",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/stefanpenner/get-caller-file.git"
  },
  "version": "2.0.5"
}'use strict';

module.exports = function (cb) {
	var stdin = process.stdin;
	var ret = '';

	if (stdin.isTTY) {
		setImmediate(cb, '');
		return;
	}

	stdin.setEncoding('utf8');

	stdin.on('readable', function () {
		var chunk;

		while (chunk = stdin.read()) {
			ret += chunk;
		}
	});

	stdin.on('end', function () {
		cb(ret);
	});
};

module.exports.buffer = function (cb) {
	var stdin = process.stdin;
	var ret = [];
	var len = 0;

	if (stdin.isTTY) {
		setImmediate(cb, new Buffer(''));
		return;
	}

	stdin.on('readable', function () {
		var chunk;

		while (chunk = stdin.read()) {
			ret.push(chunk);
			len += chunk.length;
		}
	});

	stdin.on('end', function () {
		cb(Buffer.concat(ret, len));
	});
};
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "http://sindresorhus.com"
  },
  "deprecated": false,
  "description": "Easier stdin",
  "devDependencies": {
    "ava": "0.0.4",
    "buffer-equal": "0.0.1"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/get-stdin#readme",
  "license": "MIT",
  "name": "get-stdin",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/get-stdin.git"
  },
  "version": "4.0.1"
}'use strict';
const PassThrough = require('stream').PassThrough;

module.exports = opts => {
	opts = Object.assign({}, opts);

	const array = opts.array;
	let encoding = opts.encoding;
	const buffer = encoding === 'buffer';
	let objectMode = false;

	if (array) {
		objectMode = !(encoding || buffer);
	} else {
		encoding = encoding || 'utf8';
	}

	if (buffer) {
		encoding = null;
	}

	let len = 0;
	const ret = [];
	const stream = new PassThrough({objectMode});

	if (encoding) {
		stream.setEncoding(encoding);
	}

	stream.on('data', chunk => {
		ret.push(chunk);

		if (objectMode) {
			len = ret.length;
		} else {
			len += chunk.length;
		}
	});

	stream.getBufferedValue = () => {
		if (array) {
			return ret;
		}

		return buffer ? Buffer.concat(ret, len) : ret.join('');
	};

	stream.getBufferedLength = () => len;

	return stream;
};
'use strict';
const bufferStream = require('./buffer-stream');

function getStream(inputStream, opts) {
	if (!inputStream) {
		return Promise.reject(new Error('Expected a stream'));
	}

	opts = Object.assign({maxBuffer: Infinity}, opts);

	const maxBuffer = opts.maxBuffer;
	let stream;
	let clean;

	const p = new Promise((resolve, reject) => {
		const error = err => {
			if (err) { // null check
				err.bufferedData = stream.getBufferedValue();
			}

			reject(err);
		};

		stream = bufferStream(opts);
		inputStream.once('error', error);
		inputStream.pipe(stream);

		stream.on('data', () => {
			if (stream.getBufferedLength() > maxBuffer) {
				reject(new Error('maxBuffer exceeded'));
			}
		});
		stream.once('error', error);
		stream.on('end', resolve);

		clean = () => {
			// some streams doesn't implement the `stream.Readable` interface correctly
			if (inputStream.unpipe) {
				inputStream.unpipe(stream);
			}
		};
	});

	p.then(clean, clean);

	return p.then(() => stream.getBufferedValue());
}

module.exports = getStream;
module.exports.buffer = (stream, opts) => getStream(stream, Object.assign({}, opts, {encoding: 'buffer'}));
module.exports.array = (stream, opts) => getStream(stream, Object.assign({}, opts, {array: true}));
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Get a stream as a string, buffer, or array",
  "devDependencies": {
    "ava": "*",
    "into-stream": "^3.0.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js",
    "buffer-stream.js"
  ],
  "homepage": "https://github.com/sindresorhus/get-stream#readme",
  "license": "MIT",
  "name": "get-stream",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/get-stream.git"
  },
  "version": "3.0.0"
}Copyright Joyent, Inc. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
{
  "author": {
    "name": "Alex Wilson",
    "email": "alex.wilson@joyent.com"
  },
  "dependencies": {
    "assert-plus": "^1.0.0"
  },
  "deprecated": false,
  "description": "getpass for node.js",
  "homepage": "https://github.com/arekinath/node-getpass#readme",
  "license": "MIT",
  "main": "lib/index.js",
  "name": "getpass",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/arekinath/node-getpass.git"
  },
  "version": "0.1.7"
}/*
 * Copyright 2016, Joyent, Inc. All rights reserved.
 * Author: Alex Wilson <alex.wilson@joyent.com>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
*/

module.exports = {
	getPass: getPass
};

const mod_tty = require('tty');
const mod_fs = require('fs');
const mod_assert = require('assert-plus');

var BACKSPACE = String.fromCharCode(127);
var CTRLC = '\u0003';
var CTRLD = '\u0004';

function getPass(opts, cb) {
	if (typeof (opts) === 'function' && cb === undefined) {
		cb = opts;
		opts = {};
	}
	mod_assert.object(opts, 'options');
	mod_assert.func(cb, 'callback');

	mod_assert.optionalString(opts.prompt, 'options.prompt');
	if (opts.prompt === undefined)
		opts.prompt = 'Password';

	openTTY(function (err, rfd, wfd, rtty, wtty) {
		if (err) {
			cb(err);
			return;
		}

		wtty.write(opts.prompt + ':');
		rtty.resume();
		rtty.setRawMode(true);
		rtty.resume();
		rtty.setEncoding('utf8');

		var pw = '';
		rtty.on('data', onData);

		function onData(data) {
			var str = data.toString('utf8');
			for (var i = 0; i < str.length; ++i) {
				var ch = str[i];
				switch (ch) {
				case '\r':
				case '\n':
				case CTRLD:
					cleanup();
					cb(null, pw);
					return;
				case CTRLC:
					cleanup();
					cb(new Error('Aborted'));
					return;
				case BACKSPACE:
					pw = pw.slice(0, pw.length - 1);
					break;
				default:
					pw += ch;
					break;
				}
			}
		}

		function cleanup() {
			wtty.write('\r\n');
			rtty.setRawMode(false);
			rtty.pause();
			rtty.removeListener('data', onData);
			if (wfd !== undefined && wfd !== rfd) {
				wtty.end();
				mod_fs.closeSync(wfd);
			}
			if (rfd !== undefined) {
				rtty.end();
				mod_fs.closeSync(rfd);
			}
		}
	});
}

function openTTY(cb) {
	mod_fs.open('/dev/tty', 'r+', function (err, rttyfd) {
		if ((err && (err.code === 'ENOENT' || err.code === 'EACCES')) ||
		    (process.version.match(/^v0[.][0-8][.]/))) {
			cb(null, undefined, undefined, process.stdin,
			    process.stdout);
			return;
		}
		var rtty = new mod_tty.ReadStream(rttyfd);
		mod_fs.open('/dev/tty', 'w+', function (err3, wttyfd) {
			var wtty = new mod_tty.WriteStream(wttyfd);
			if (err3) {
				cb(err3);
				return;
			}
			cb(null, rttyfd, wttyfd, rtty, wtty);
		});
	});
}
The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

## Glob Logo

Glob's logo created by Tanya Brassie <http://tanyabrassie.com/>, licensed
under a Creative Commons Attribution-ShareAlike 4.0 International License
https://creativecommons.org/licenses/by-sa/4.0/
exports.alphasort = alphasort
exports.alphasorti = alphasorti
exports.setopts = setopts
exports.ownProp = ownProp
exports.makeAbs = makeAbs
exports.finish = finish
exports.mark = mark
exports.isIgnored = isIgnored
exports.childrenIgnored = childrenIgnored

function ownProp (obj, field) {
  return Object.prototype.hasOwnProperty.call(obj, field)
}

var path = require("path")
var minimatch = require("minimatch")
var isAbsolute = require("path-is-absolute")
var Minimatch = minimatch.Minimatch

function alphasorti (a, b) {
  return a.toLowerCase().localeCompare(b.toLowerCase())
}

function alphasort (a, b) {
  return a.localeCompare(b)
}

function setupIgnores (self, options) {
  self.ignore = options.ignore || []

  if (!Array.isArray(self.ignore))
    self.ignore = [self.ignore]

  if (self.ignore.length) {
    self.ignore = self.ignore.map(ignoreMap)
  }
}

// ignore patterns are always in dot:true mode.
function ignoreMap (pattern) {
  var gmatcher = null
  if (pattern.slice(-3) === '/**') {
    var gpattern = pattern.replace(/(\/\*\*)+$/, '')
    gmatcher = new Minimatch(gpattern, { dot: true })
  }

  return {
    matcher: new Minimatch(pattern, { dot: true }),
    gmatcher: gmatcher
  }
}

function setopts (self, pattern, options) {
  if (!options)
    options = {}

  // base-matching: just use globstar for that.
  if (options.matchBase && -1 === pattern.indexOf("/")) {
    if (options.noglobstar) {
      throw new Error("base matching requires globstar")
    }
    pattern = "**/" + pattern
  }

  self.silent = !!options.silent
  self.pattern = pattern
  self.strict = options.strict !== false
  self.realpath = !!options.realpath
  self.realpathCache = options.realpathCache || Object.create(null)
  self.follow = !!options.follow
  self.dot = !!options.dot
  self.mark = !!options.mark
  self.nodir = !!options.nodir
  if (self.nodir)
    self.mark = true
  self.sync = !!options.sync
  self.nounique = !!options.nounique
  self.nonull = !!options.nonull
  self.nosort = !!options.nosort
  self.nocase = !!options.nocase
  self.stat = !!options.stat
  self.noprocess = !!options.noprocess
  self.absolute = !!options.absolute

  self.maxLength = options.maxLength || Infinity
  self.cache = options.cache || Object.create(null)
  self.statCache = options.statCache || Object.create(null)
  self.symlinks = options.symlinks || Object.create(null)

  setupIgnores(self, options)

  self.changedCwd = false
  var cwd = process.cwd()
  if (!ownProp(options, "cwd"))
    self.cwd = cwd
  else {
    self.cwd = path.resolve(options.cwd)
    self.changedCwd = self.cwd !== cwd
  }

  self.root = options.root || path.resolve(self.cwd, "/")
  self.root = path.resolve(self.root)
  if (process.platform === "win32")
    self.root = self.root.replace(/\\/g, "/")

  // TODO: is an absolute `cwd` supposed to be resolved against `root`?
  // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')
  self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)
  if (process.platform === "win32")
    self.cwdAbs = self.cwdAbs.replace(/\\/g, "/")
  self.nomount = !!options.nomount

  // disable comments and negation in Minimatch.
  // Note that they are not supported in Glob itself anyway.
  options.nonegate = true
  options.nocomment = true

  self.minimatch = new Minimatch(pattern, options)
  self.options = self.minimatch.options
}

function finish (self) {
  var nou = self.nounique
  var all = nou ? [] : Object.create(null)

  for (var i = 0, l = self.matches.length; i < l; i ++) {
    var matches = self.matches[i]
    if (!matches || Object.keys(matches).length === 0) {
      if (self.nonull) {
        // do like the shell, and spit out the literal glob
        var literal = self.minimatch.globSet[i]
        if (nou)
          all.push(literal)
        else
          all[literal] = true
      }
    } else {
      // had matches
      var m = Object.keys(matches)
      if (nou)
        all.push.apply(all, m)
      else
        m.forEach(function (m) {
          all[m] = true
        })
    }
  }

  if (!nou)
    all = Object.keys(all)

  if (!self.nosort)
    all = all.sort(self.nocase ? alphasorti : alphasort)

  // at *some* point we statted all of these
  if (self.mark) {
    for (var i = 0; i < all.length; i++) {
      all[i] = self._mark(all[i])
    }
    if (self.nodir) {
      all = all.filter(function (e) {
        var notDir = !(/\/$/.test(e))
        var c = self.cache[e] || self.cache[makeAbs(self, e)]
        if (notDir && c)
          notDir = c !== 'DIR' && !Array.isArray(c)
        return notDir
      })
    }
  }

  if (self.ignore.length)
    all = all.filter(function(m) {
      return !isIgnored(self, m)
    })

  self.found = all
}

function mark (self, p) {
  var abs = makeAbs(self, p)
  var c = self.cache[abs]
  var m = p
  if (c) {
    var isDir = c === 'DIR' || Array.isArray(c)
    var slash = p.slice(-1) === '/'

    if (isDir && !slash)
      m += '/'
    else if (!isDir && slash)
      m = m.slice(0, -1)

    if (m !== p) {
      var mabs = makeAbs(self, m)
      self.statCache[mabs] = self.statCache[abs]
      self.cache[mabs] = self.cache[abs]
    }
  }

  return m
}

// lotta situps...
function makeAbs (self, f) {
  var abs = f
  if (f.charAt(0) === '/') {
    abs = path.join(self.root, f)
  } else if (isAbsolute(f) || f === '') {
    abs = f
  } else if (self.changedCwd) {
    abs = path.resolve(self.cwd, f)
  } else {
    abs = path.resolve(f)
  }

  if (process.platform === 'win32')
    abs = abs.replace(/\\/g, '/')

  return abs
}


// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
function isIgnored (self, path) {
  if (!self.ignore.length)
    return false

  return self.ignore.some(function(item) {
    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
  })
}

function childrenIgnored (self, path) {
  if (!self.ignore.length)
    return false

  return self.ignore.some(function(item) {
    return !!(item.gmatcher && item.gmatcher.match(path))
  })
}
// Approach:
//
// 1. Get the minimatch set
// 2. For each pattern in the set, PROCESS(pattern, false)
// 3. Store matches per-set, then uniq them
//
// PROCESS(pattern, inGlobStar)
// Get the first [n] items from pattern that are all strings
// Join these together.  This is PREFIX.
//   If there is no more remaining, then stat(PREFIX) and
//   add to matches if it succeeds.  END.
//
// If inGlobStar and PREFIX is symlink and points to dir
//   set ENTRIES = []
// else readdir(PREFIX) as ENTRIES
//   If fail, END
//
// with ENTRIES
//   If pattern[n] is GLOBSTAR
//     // handle the case where the globstar match is empty
//     // by pruning it out, and testing the resulting pattern
//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
//     // handle other cases.
//     for ENTRY in ENTRIES (not dotfiles)
//       // attach globstar + tail onto the entry
//       // Mark that this entry is a globstar match
//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
//
//   else // not globstar
//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
//       Test ENTRY against pattern[n]
//       If fails, continue
//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
//
// Caveat:
//   Cache all stats and readdirs results to minimize syscall.  Since all
//   we ever care about is existence and directory-ness, we can just keep
//   `true` for files, and [children,...] for directories, or `false` for
//   things that don't exist.

module.exports = glob

var fs = require('fs')
var rp = require('fs.realpath')
var minimatch = require('minimatch')
var Minimatch = minimatch.Minimatch
var inherits = require('inherits')
var EE = require('events').EventEmitter
var path = require('path')
var assert = require('assert')
var isAbsolute = require('path-is-absolute')
var globSync = require('./sync.js')
var common = require('./common.js')
var alphasort = common.alphasort
var alphasorti = common.alphasorti
var setopts = common.setopts
var ownProp = common.ownProp
var inflight = require('inflight')
var util = require('util')
var childrenIgnored = common.childrenIgnored
var isIgnored = common.isIgnored

var once = require('once')

function glob (pattern, options, cb) {
  if (typeof options === 'function') cb = options, options = {}
  if (!options) options = {}

  if (options.sync) {
    if (cb)
      throw new TypeError('callback provided to sync glob')
    return globSync(pattern, options)
  }

  return new Glob(pattern, options, cb)
}

glob.sync = globSync
var GlobSync = glob.GlobSync = globSync.GlobSync

// old api surface
glob.glob = glob

function extend (origin, add) {
  if (add === null || typeof add !== 'object') {
    return origin
  }

  var keys = Object.keys(add)
  var i = keys.length
  while (i--) {
    origin[keys[i]] = add[keys[i]]
  }
  return origin
}

glob.hasMagic = function (pattern, options_) {
  var options = extend({}, options_)
  options.noprocess = true

  var g = new Glob(pattern, options)
  var set = g.minimatch.set

  if (!pattern)
    return false

  if (set.length > 1)
    return true

  for (var j = 0; j < set[0].length; j++) {
    if (typeof set[0][j] !== 'string')
      return true
  }

  return false
}

glob.Glob = Glob
inherits(Glob, EE)
function Glob (pattern, options, cb) {
  if (typeof options === 'function') {
    cb = options
    options = null
  }

  if (options && options.sync) {
    if (cb)
      throw new TypeError('callback provided to sync glob')
    return new GlobSync(pattern, options)
  }

  if (!(this instanceof Glob))
    return new Glob(pattern, options, cb)

  setopts(this, pattern, options)
  this._didRealPath = false

  // process each pattern in the minimatch set
  var n = this.minimatch.set.length

  // The matches are stored as {<filename>: true,...} so that
  // duplicates are automagically pruned.
  // Later, we do an Object.keys() on these.
  // Keep them as a list so we can fill in when nonull is set.
  this.matches = new Array(n)

  if (typeof cb === 'function') {
    cb = once(cb)
    this.on('error', cb)
    this.on('end', function (matches) {
      cb(null, matches)
    })
  }

  var self = this
  this._processing = 0

  this._emitQueue = []
  this._processQueue = []
  this.paused = false

  if (this.noprocess)
    return this

  if (n === 0)
    return done()

  var sync = true
  for (var i = 0; i < n; i ++) {
    this._process(this.minimatch.set[i], i, false, done)
  }
  sync = false

  function done () {
    --self._processing
    if (self._processing <= 0) {
      if (sync) {
        process.nextTick(function () {
          self._finish()
        })
      } else {
        self._finish()
      }
    }
  }
}

Glob.prototype._finish = function () {
  assert(this instanceof Glob)
  if (this.aborted)
    return

  if (this.realpath && !this._didRealpath)
    return this._realpath()

  common.finish(this)
  this.emit('end', this.found)
}

Glob.prototype._realpath = function () {
  if (this._didRealpath)
    return

  this._didRealpath = true

  var n = this.matches.length
  if (n === 0)
    return this._finish()

  var self = this
  for (var i = 0; i < this.matches.length; i++)
    this._realpathSet(i, next)

  function next () {
    if (--n === 0)
      self._finish()
  }
}

Glob.prototype._realpathSet = function (index, cb) {
  var matchset = this.matches[index]
  if (!matchset)
    return cb()

  var found = Object.keys(matchset)
  var self = this
  var n = found.length

  if (n === 0)
    return cb()

  var set = this.matches[index] = Object.create(null)
  found.forEach(function (p, i) {
    // If there's a problem with the stat, then it means that
    // one or more of the links in the realpath couldn't be
    // resolved.  just return the abs value in that case.
    p = self._makeAbs(p)
    rp.realpath(p, self.realpathCache, function (er, real) {
      if (!er)
        set[real] = true
      else if (er.syscall === 'stat')
        set[p] = true
      else
        self.emit('error', er) // srsly wtf right here

      if (--n === 0) {
        self.matches[index] = set
        cb()
      }
    })
  })
}

Glob.prototype._mark = function (p) {
  return common.mark(this, p)
}

Glob.prototype._makeAbs = function (f) {
  return common.makeAbs(this, f)
}

Glob.prototype.abort = function () {
  this.aborted = true
  this.emit('abort')
}

Glob.prototype.pause = function () {
  if (!this.paused) {
    this.paused = true
    this.emit('pause')
  }
}

Glob.prototype.resume = function () {
  if (this.paused) {
    this.emit('resume')
    this.paused = false
    if (this._emitQueue.length) {
      var eq = this._emitQueue.slice(0)
      this._emitQueue.length = 0
      for (var i = 0; i < eq.length; i ++) {
        var e = eq[i]
        this._emitMatch(e[0], e[1])
      }
    }
    if (this._processQueue.length) {
      var pq = this._processQueue.slice(0)
      this._processQueue.length = 0
      for (var i = 0; i < pq.length; i ++) {
        var p = pq[i]
        this._processing--
        this._process(p[0], p[1], p[2], p[3])
      }
    }
  }
}

Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
  assert(this instanceof Glob)
  assert(typeof cb === 'function')

  if (this.aborted)
    return

  this._processing++
  if (this.paused) {
    this._processQueue.push([pattern, index, inGlobStar, cb])
    return
  }

  //console.error('PROCESS %d', this._processing, pattern)

  // Get the first [n] parts of pattern that are all strings.
  var n = 0
  while (typeof pattern[n] === 'string') {
    n ++
  }
  // now n is the index of the first one that is *not* a string.

  // see if there's anything else
  var prefix
  switch (n) {
    // if not, then this is rather simple
    case pattern.length:
      this._processSimple(pattern.join('/'), index, cb)
      return

    case 0:
      // pattern *starts* with some non-trivial item.
      // going to readdir(cwd), but not include the prefix in matches.
      prefix = null
      break

    default:
      // pattern has some string bits in the front.
      // whatever it starts with, whether that's 'absolute' like /foo/bar,
      // or 'relative' like '../baz'
      prefix = pattern.slice(0, n).join('/')
      break
  }

  var remain = pattern.slice(n)

  // get the list of entries.
  var read
  if (prefix === null)
    read = '.'
  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
    if (!prefix || !isAbsolute(prefix))
      prefix = '/' + prefix
    read = prefix
  } else
    read = prefix

  var abs = this._makeAbs(read)

  //if ignored, skip _processing
  if (childrenIgnored(this, read))
    return cb()

  var isGlobStar = remain[0] === minimatch.GLOBSTAR
  if (isGlobStar)
    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
  else
    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
}

Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
  var self = this
  this._readdir(abs, inGlobStar, function (er, entries) {
    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
  })
}

Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {

  // if the abs isn't a dir, then nothing can match!
  if (!entries)
    return cb()

  // It will only match dot entries if it starts with a dot, or if
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
  var pn = remain[0]
  var negate = !!this.minimatch.negate
  var rawGlob = pn._glob
  var dotOk = this.dot || rawGlob.charAt(0) === '.'

  var matchedEntries = []
  for (var i = 0; i < entries.length; i++) {
    var e = entries[i]
    if (e.charAt(0) !== '.' || dotOk) {
      var m
      if (negate && !prefix) {
        m = !e.match(pn)
      } else {
        m = e.match(pn)
      }
      if (m)
        matchedEntries.push(e)
    }
  }

  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)

  var len = matchedEntries.length
  // If there are no matched entries, then nothing matches.
  if (len === 0)
    return cb()

  // if this is the last remaining pattern bit, then no need for
  // an additional stat *unless* the user has specified mark or
  // stat explicitly.  We know they exist, since readdir returned
  // them.

  if (remain.length === 1 && !this.mark && !this.stat) {
    if (!this.matches[index])
      this.matches[index] = Object.create(null)

    for (var i = 0; i < len; i ++) {
      var e = matchedEntries[i]
      if (prefix) {
        if (prefix !== '/')
          e = prefix + '/' + e
        else
          e = prefix + e
      }

      if (e.charAt(0) === '/' && !this.nomount) {
        e = path.join(this.root, e)
      }
      this._emitMatch(index, e)
    }
    // This was the last one, and no stats were needed
    return cb()
  }

  // now test all matched entries as stand-ins for that part
  // of the pattern.
  remain.shift()
  for (var i = 0; i < len; i ++) {
    var e = matchedEntries[i]
    var newPattern
    if (prefix) {
      if (prefix !== '/')
        e = prefix + '/' + e
      else
        e = prefix + e
    }
    this._process([e].concat(remain), index, inGlobStar, cb)
  }
  cb()
}

Glob.prototype._emitMatch = function (index, e) {
  if (this.aborted)
    return

  if (isIgnored(this, e))
    return

  if (this.paused) {
    this._emitQueue.push([index, e])
    return
  }

  var abs = isAbsolute(e) ? e : this._makeAbs(e)

  if (this.mark)
    e = this._mark(e)

  if (this.absolute)
    e = abs

  if (this.matches[index][e])
    return

  if (this.nodir) {
    var c = this.cache[abs]
    if (c === 'DIR' || Array.isArray(c))
      return
  }

  this.matches[index][e] = true

  var st = this.statCache[abs]
  if (st)
    this.emit('stat', e, st)

  this.emit('match', e)
}

Glob.prototype._readdirInGlobStar = function (abs, cb) {
  if (this.aborted)
    return

  // follow all symlinked directories forever
  // just proceed as if this is a non-globstar situation
  if (this.follow)
    return this._readdir(abs, false, cb)

  var lstatkey = 'lstat\0' + abs
  var self = this
  var lstatcb = inflight(lstatkey, lstatcb_)

  if (lstatcb)
    fs.lstat(abs, lstatcb)

  function lstatcb_ (er, lstat) {
    if (er && er.code === 'ENOENT')
      return cb()

    var isSym = lstat && lstat.isSymbolicLink()
    self.symlinks[abs] = isSym

    // If it's not a symlink or a dir, then it's definitely a regular file.
    // don't bother doing a readdir in that case.
    if (!isSym && lstat && !lstat.isDirectory()) {
      self.cache[abs] = 'FILE'
      cb()
    } else
      self._readdir(abs, false, cb)
  }
}

Glob.prototype._readdir = function (abs, inGlobStar, cb) {
  if (this.aborted)
    return

  cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
  if (!cb)
    return

  //console.error('RD %j %j', +inGlobStar, abs)
  if (inGlobStar && !ownProp(this.symlinks, abs))
    return this._readdirInGlobStar(abs, cb)

  if (ownProp(this.cache, abs)) {
    var c = this.cache[abs]
    if (!c || c === 'FILE')
      return cb()

    if (Array.isArray(c))
      return cb(null, c)
  }

  var self = this
  fs.readdir(abs, readdirCb(this, abs, cb))
}

function readdirCb (self, abs, cb) {
  return function (er, entries) {
    if (er)
      self._readdirError(abs, er, cb)
    else
      self._readdirEntries(abs, entries, cb)
  }
}

Glob.prototype._readdirEntries = function (abs, entries, cb) {
  if (this.aborted)
    return

  // if we haven't asked to stat everything, then just
  // assume that everything in there exists, so we can avoid
  // having to stat it a second time.
  if (!this.mark && !this.stat) {
    for (var i = 0; i < entries.length; i ++) {
      var e = entries[i]
      if (abs === '/')
        e = abs + e
      else
        e = abs + '/' + e
      this.cache[e] = true
    }
  }

  this.cache[abs] = entries
  return cb(null, entries)
}

Glob.prototype._readdirError = function (f, er, cb) {
  if (this.aborted)
    return

  // handle errors, and cache the information
  switch (er.code) {
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    case 'ENOTDIR': // totally normal. means it *does* exist.
      var abs = this._makeAbs(f)
      this.cache[abs] = 'FILE'
      if (abs === this.cwdAbs) {
        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
        error.path = this.cwd
        error.code = er.code
        this.emit('error', error)
        this.abort()
      }
      break

    case 'ENOENT': // not terribly unusual
    case 'ELOOP':
    case 'ENAMETOOLONG':
    case 'UNKNOWN':
      this.cache[this._makeAbs(f)] = false
      break

    default: // some unusual error.  Treat as failure.
      this.cache[this._makeAbs(f)] = false
      if (this.strict) {
        this.emit('error', er)
        // If the error is handled, then we abort
        // if not, we threw out of here
        this.abort()
      }
      if (!this.silent)
        console.error('glob error', er)
      break
  }

  return cb()
}

Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
  var self = this
  this._readdir(abs, inGlobStar, function (er, entries) {
    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
  })
}


Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
  //console.error('pgs2', prefix, remain[0], entries)

  // no entries means not a dir, so it can never have matches
  // foo.txt/** doesn't match foo.txt
  if (!entries)
    return cb()

  // test without the globstar, and with every child both below
  // and replacing the globstar.
  var remainWithoutGlobStar = remain.slice(1)
  var gspref = prefix ? [ prefix ] : []
  var noGlobStar = gspref.concat(remainWithoutGlobStar)

  // the noGlobStar pattern exits the inGlobStar state
  this._process(noGlobStar, index, false, cb)

  var isSym = this.symlinks[abs]
  var len = entries.length

  // If it's a symlink, and we're in a globstar, then stop
  if (isSym && inGlobStar)
    return cb()

  for (var i = 0; i < len; i++) {
    var e = entries[i]
    if (e.charAt(0) === '.' && !this.dot)
      continue

    // these two cases enter the inGlobStar state
    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    this._process(instead, index, true, cb)

    var below = gspref.concat(entries[i], remain)
    this._process(below, index, true, cb)
  }

  cb()
}

Glob.prototype._processSimple = function (prefix, index, cb) {
  // XXX review this.  Shouldn't it be doing the mounting etc
  // before doing stat?  kinda weird?
  var self = this
  this._stat(prefix, function (er, exists) {
    self._processSimple2(prefix, index, er, exists, cb)
  })
}
Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {

  //console.error('ps2', prefix, exists)

  if (!this.matches[index])
    this.matches[index] = Object.create(null)

  // If it doesn't exist, then just mark the lack of results
  if (!exists)
    return cb()

  if (prefix && isAbsolute(prefix) && !this.nomount) {
    var trail = /[\/\\]$/.test(prefix)
    if (prefix.charAt(0) === '/') {
      prefix = path.join(this.root, prefix)
    } else {
      prefix = path.resolve(this.root, prefix)
      if (trail)
        prefix += '/'
    }
  }

  if (process.platform === 'win32')
    prefix = prefix.replace(/\\/g, '/')

  // Mark this as a match
  this._emitMatch(index, prefix)
  cb()
}

// Returns either 'DIR', 'FILE', or false
Glob.prototype._stat = function (f, cb) {
  var abs = this._makeAbs(f)
  var needDir = f.slice(-1) === '/'

  if (f.length > this.maxLength)
    return cb()

  if (!this.stat && ownProp(this.cache, abs)) {
    var c = this.cache[abs]

    if (Array.isArray(c))
      c = 'DIR'

    // It exists, but maybe not how we need it
    if (!needDir || c === 'DIR')
      return cb(null, c)

    if (needDir && c === 'FILE')
      return cb()

    // otherwise we have to stat, because maybe c=true
    // if we know it exists, but not what it is.
  }

  var exists
  var stat = this.statCache[abs]
  if (stat !== undefined) {
    if (stat === false)
      return cb(null, stat)
    else {
      var type = stat.isDirectory() ? 'DIR' : 'FILE'
      if (needDir && type === 'FILE')
        return cb()
      else
        return cb(null, type, stat)
    }
  }

  var self = this
  var statcb = inflight('stat\0' + abs, lstatcb_)
  if (statcb)
    fs.lstat(abs, statcb)

  function lstatcb_ (er, lstat) {
    if (lstat && lstat.isSymbolicLink()) {
      // If it's a symlink, then treat it as the target, unless
      // the target does not exist, then treat it as a file.
      return fs.stat(abs, function (er, stat) {
        if (er)
          self._stat2(f, abs, null, lstat, cb)
        else
          self._stat2(f, abs, er, stat, cb)
      })
    } else {
      self._stat2(f, abs, er, lstat, cb)
    }
  }
}

Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
  if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
    this.statCache[abs] = false
    return cb()
  }

  var needDir = f.slice(-1) === '/'
  this.statCache[abs] = stat

  if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
    return cb(null, false, stat)

  var c = true
  if (stat)
    c = stat.isDirectory() ? 'DIR' : 'FILE'
  this.cache[abs] = this.cache[abs] || c

  if (needDir && c === 'FILE')
    return cb()

  return cb(null, c, stat)
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {
    "fs.realpath": "^1.0.0",
    "inflight": "^1.0.4",
    "inherits": "2",
    "minimatch": "^3.0.4",
    "once": "^1.3.0",
    "path-is-absolute": "^1.0.0"
  },
  "deprecated": false,
  "description": "a little globber",
  "devDependencies": {
    "mkdirp": "0",
    "rimraf": "^2.2.8",
    "tap": "^12.0.1",
    "tick": "0.0.6"
  },
  "engines": {
    "node": "*"
  },
  "files": [
    "glob.js",
    "sync.js",
    "common.js"
  ],
  "funding": {
    "url": "https://github.com/sponsors/isaacs"
  },
  "homepage": "https://github.com/isaacs/node-glob#readme",
  "license": "ISC",
  "main": "glob.js",
  "name": "glob",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/node-glob.git"
  },
  "version": "7.1.6"
}module.exports = globSync
globSync.GlobSync = GlobSync

var fs = require('fs')
var rp = require('fs.realpath')
var minimatch = require('minimatch')
var Minimatch = minimatch.Minimatch
var Glob = require('./glob.js').Glob
var util = require('util')
var path = require('path')
var assert = require('assert')
var isAbsolute = require('path-is-absolute')
var common = require('./common.js')
var alphasort = common.alphasort
var alphasorti = common.alphasorti
var setopts = common.setopts
var ownProp = common.ownProp
var childrenIgnored = common.childrenIgnored
var isIgnored = common.isIgnored

function globSync (pattern, options) {
  if (typeof options === 'function' || arguments.length === 3)
    throw new TypeError('callback provided to sync glob\n'+
                        'See: https://github.com/isaacs/node-glob/issues/167')

  return new GlobSync(pattern, options).found
}

function GlobSync (pattern, options) {
  if (!pattern)
    throw new Error('must provide pattern')

  if (typeof options === 'function' || arguments.length === 3)
    throw new TypeError('callback provided to sync glob\n'+
                        'See: https://github.com/isaacs/node-glob/issues/167')

  if (!(this instanceof GlobSync))
    return new GlobSync(pattern, options)

  setopts(this, pattern, options)

  if (this.noprocess)
    return this

  var n = this.minimatch.set.length
  this.matches = new Array(n)
  for (var i = 0; i < n; i ++) {
    this._process(this.minimatch.set[i], i, false)
  }
  this._finish()
}

GlobSync.prototype._finish = function () {
  assert(this instanceof GlobSync)
  if (this.realpath) {
    var self = this
    this.matches.forEach(function (matchset, index) {
      var set = self.matches[index] = Object.create(null)
      for (var p in matchset) {
        try {
          p = self._makeAbs(p)
          var real = rp.realpathSync(p, self.realpathCache)
          set[real] = true
        } catch (er) {
          if (er.syscall === 'stat')
            set[self._makeAbs(p)] = true
          else
            throw er
        }
      }
    })
  }
  common.finish(this)
}


GlobSync.prototype._process = function (pattern, index, inGlobStar) {
  assert(this instanceof GlobSync)

  // Get the first [n] parts of pattern that are all strings.
  var n = 0
  while (typeof pattern[n] === 'string') {
    n ++
  }
  // now n is the index of the first one that is *not* a string.

  // See if there's anything else
  var prefix
  switch (n) {
    // if not, then this is rather simple
    case pattern.length:
      this._processSimple(pattern.join('/'), index)
      return

    case 0:
      // pattern *starts* with some non-trivial item.
      // going to readdir(cwd), but not include the prefix in matches.
      prefix = null
      break

    default:
      // pattern has some string bits in the front.
      // whatever it starts with, whether that's 'absolute' like /foo/bar,
      // or 'relative' like '../baz'
      prefix = pattern.slice(0, n).join('/')
      break
  }

  var remain = pattern.slice(n)

  // get the list of entries.
  var read
  if (prefix === null)
    read = '.'
  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
    if (!prefix || !isAbsolute(prefix))
      prefix = '/' + prefix
    read = prefix
  } else
    read = prefix

  var abs = this._makeAbs(read)

  //if ignored, skip processing
  if (childrenIgnored(this, read))
    return

  var isGlobStar = remain[0] === minimatch.GLOBSTAR
  if (isGlobStar)
    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
  else
    this._processReaddir(prefix, read, abs, remain, index, inGlobStar)
}


GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
  var entries = this._readdir(abs, inGlobStar)

  // if the abs isn't a dir, then nothing can match!
  if (!entries)
    return

  // It will only match dot entries if it starts with a dot, or if
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
  var pn = remain[0]
  var negate = !!this.minimatch.negate
  var rawGlob = pn._glob
  var dotOk = this.dot || rawGlob.charAt(0) === '.'

  var matchedEntries = []
  for (var i = 0; i < entries.length; i++) {
    var e = entries[i]
    if (e.charAt(0) !== '.' || dotOk) {
      var m
      if (negate && !prefix) {
        m = !e.match(pn)
      } else {
        m = e.match(pn)
      }
      if (m)
        matchedEntries.push(e)
    }
  }

  var len = matchedEntries.length
  // If there are no matched entries, then nothing matches.
  if (len === 0)
    return

  // if this is the last remaining pattern bit, then no need for
  // an additional stat *unless* the user has specified mark or
  // stat explicitly.  We know they exist, since readdir returned
  // them.

  if (remain.length === 1 && !this.mark && !this.stat) {
    if (!this.matches[index])
      this.matches[index] = Object.create(null)

    for (var i = 0; i < len; i ++) {
      var e = matchedEntries[i]
      if (prefix) {
        if (prefix.slice(-1) !== '/')
          e = prefix + '/' + e
        else
          e = prefix + e
      }

      if (e.charAt(0) === '/' && !this.nomount) {
        e = path.join(this.root, e)
      }
      this._emitMatch(index, e)
    }
    // This was the last one, and no stats were needed
    return
  }

  // now test all matched entries as stand-ins for that part
  // of the pattern.
  remain.shift()
  for (var i = 0; i < len; i ++) {
    var e = matchedEntries[i]
    var newPattern
    if (prefix)
      newPattern = [prefix, e]
    else
      newPattern = [e]
    this._process(newPattern.concat(remain), index, inGlobStar)
  }
}


GlobSync.prototype._emitMatch = function (index, e) {
  if (isIgnored(this, e))
    return

  var abs = this._makeAbs(e)

  if (this.mark)
    e = this._mark(e)

  if (this.absolute) {
    e = abs
  }

  if (this.matches[index][e])
    return

  if (this.nodir) {
    var c = this.cache[abs]
    if (c === 'DIR' || Array.isArray(c))
      return
  }

  this.matches[index][e] = true

  if (this.stat)
    this._stat(e)
}


GlobSync.prototype._readdirInGlobStar = function (abs) {
  // follow all symlinked directories forever
  // just proceed as if this is a non-globstar situation
  if (this.follow)
    return this._readdir(abs, false)

  var entries
  var lstat
  var stat
  try {
    lstat = fs.lstatSync(abs)
  } catch (er) {
    if (er.code === 'ENOENT') {
      // lstat failed, doesn't exist
      return null
    }
  }

  var isSym = lstat && lstat.isSymbolicLink()
  this.symlinks[abs] = isSym

  // If it's not a symlink or a dir, then it's definitely a regular file.
  // don't bother doing a readdir in that case.
  if (!isSym && lstat && !lstat.isDirectory())
    this.cache[abs] = 'FILE'
  else
    entries = this._readdir(abs, false)

  return entries
}

GlobSync.prototype._readdir = function (abs, inGlobStar) {
  var entries

  if (inGlobStar && !ownProp(this.symlinks, abs))
    return this._readdirInGlobStar(abs)

  if (ownProp(this.cache, abs)) {
    var c = this.cache[abs]
    if (!c || c === 'FILE')
      return null

    if (Array.isArray(c))
      return c
  }

  try {
    return this._readdirEntries(abs, fs.readdirSync(abs))
  } catch (er) {
    this._readdirError(abs, er)
    return null
  }
}

GlobSync.prototype._readdirEntries = function (abs, entries) {
  // if we haven't asked to stat everything, then just
  // assume that everything in there exists, so we can avoid
  // having to stat it a second time.
  if (!this.mark && !this.stat) {
    for (var i = 0; i < entries.length; i ++) {
      var e = entries[i]
      if (abs === '/')
        e = abs + e
      else
        e = abs + '/' + e
      this.cache[e] = true
    }
  }

  this.cache[abs] = entries

  // mark and cache dir-ness
  return entries
}

GlobSync.prototype._readdirError = function (f, er) {
  // handle errors, and cache the information
  switch (er.code) {
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    case 'ENOTDIR': // totally normal. means it *does* exist.
      var abs = this._makeAbs(f)
      this.cache[abs] = 'FILE'
      if (abs === this.cwdAbs) {
        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
        error.path = this.cwd
        error.code = er.code
        throw error
      }
      break

    case 'ENOENT': // not terribly unusual
    case 'ELOOP':
    case 'ENAMETOOLONG':
    case 'UNKNOWN':
      this.cache[this._makeAbs(f)] = false
      break

    default: // some unusual error.  Treat as failure.
      this.cache[this._makeAbs(f)] = false
      if (this.strict)
        throw er
      if (!this.silent)
        console.error('glob error', er)
      break
  }
}

GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {

  var entries = this._readdir(abs, inGlobStar)

  // no entries means not a dir, so it can never have matches
  // foo.txt/** doesn't match foo.txt
  if (!entries)
    return

  // test without the globstar, and with every child both below
  // and replacing the globstar.
  var remainWithoutGlobStar = remain.slice(1)
  var gspref = prefix ? [ prefix ] : []
  var noGlobStar = gspref.concat(remainWithoutGlobStar)

  // the noGlobStar pattern exits the inGlobStar state
  this._process(noGlobStar, index, false)

  var len = entries.length
  var isSym = this.symlinks[abs]

  // If it's a symlink, and we're in a globstar, then stop
  if (isSym && inGlobStar)
    return

  for (var i = 0; i < len; i++) {
    var e = entries[i]
    if (e.charAt(0) === '.' && !this.dot)
      continue

    // these two cases enter the inGlobStar state
    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    this._process(instead, index, true)

    var below = gspref.concat(entries[i], remain)
    this._process(below, index, true)
  }
}

GlobSync.prototype._processSimple = function (prefix, index) {
  // XXX review this.  Shouldn't it be doing the mounting etc
  // before doing stat?  kinda weird?
  var exists = this._stat(prefix)

  if (!this.matches[index])
    this.matches[index] = Object.create(null)

  // If it doesn't exist, then just mark the lack of results
  if (!exists)
    return

  if (prefix && isAbsolute(prefix) && !this.nomount) {
    var trail = /[\/\\]$/.test(prefix)
    if (prefix.charAt(0) === '/') {
      prefix = path.join(this.root, prefix)
    } else {
      prefix = path.resolve(this.root, prefix)
      if (trail)
        prefix += '/'
    }
  }

  if (process.platform === 'win32')
    prefix = prefix.replace(/\\/g, '/')

  // Mark this as a match
  this._emitMatch(index, prefix)
}

// Returns either 'DIR', 'FILE', or false
GlobSync.prototype._stat = function (f) {
  var abs = this._makeAbs(f)
  var needDir = f.slice(-1) === '/'

  if (f.length > this.maxLength)
    return false

  if (!this.stat && ownProp(this.cache, abs)) {
    var c = this.cache[abs]

    if (Array.isArray(c))
      c = 'DIR'

    // It exists, but maybe not how we need it
    if (!needDir || c === 'DIR')
      return c

    if (needDir && c === 'FILE')
      return false

    // otherwise we have to stat, because maybe c=true
    // if we know it exists, but not what it is.
  }

  var exists
  var stat = this.statCache[abs]
  if (!stat) {
    var lstat
    try {
      lstat = fs.lstatSync(abs)
    } catch (er) {
      if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
        this.statCache[abs] = false
        return false
      }
    }

    if (lstat && lstat.isSymbolicLink()) {
      try {
        stat = fs.statSync(abs)
      } catch (er) {
        stat = lstat
      }
    } else {
      stat = lstat
    }
  }

  this.statCache[abs] = stat

  var c = true
  if (stat)
    c = stat.isDirectory() ? 'DIR' : 'FILE'

  this.cache[abs] = this.cache[abs] || c

  if (needDir && c === 'FILE')
    return false

  return c
}

GlobSync.prototype._mark = function (p) {
  return common.mark(this, p)
}

GlobSync.prototype._makeAbs = function (f) {
  return common.makeAbs(this, f)
}
'use strict';
const path = require('path');
const os = require('os');
const fs = require('fs');
const ini = require('ini');

const readRc = fp => {
	try {
		return ini.parse(fs.readFileSync(fp, 'utf8')).prefix;
	} catch (err) {}
};

const defaultNpmPrefix = (() => {
	if (process.env.PREFIX) {
		return process.env.PREFIX;
	}

	if (process.platform === 'win32') {
		// `c:\node\node.exe` â†’ `prefix=c:\node\`
		return path.dirname(process.execPath);
	}

	// `/usr/local/bin/node` â†’ `prefix=/usr/local`
	return path.dirname(path.dirname(process.execPath));
})();

const getNpmPrefix = () => {
	if (process.env.PREFIX) {
		return process.env.PREFIX;
	}

	const homePrefix = readRc(path.join(os.homedir(), '.npmrc'));
	if (homePrefix) {
		return homePrefix;
	}

	const globalConfigPrefix = readRc(path.resolve(defaultNpmPrefix, 'etc', 'npmrc'));
	if (globalConfigPrefix) {
		return globalConfigPrefix;
	}

	if (process.platform === 'win32' && process.env.APPDATA) {
		// Hardcoded contents of `c:\Program Files\nodejs\node_modules\npm\.npmrc`
		const prefix = path.join(process.env.APPDATA, 'npm');
		if (fs.existsSync(prefix)) {
			return prefix;
		}
	}

	return defaultNpmPrefix;
};

const npmPrefix = path.resolve(getNpmPrefix());

const getYarnPrefix = () => {
	if (process.env.PREFIX) {
		return process.env.PREFIX;
	}

	if (process.platform === 'win32' && process.env.LOCALAPPDATA) {
		const prefix = path.join(process.env.LOCALAPPDATA, 'Yarn');
		if (fs.existsSync(prefix)) {
			return prefix;
		}
	}

	const configPrefix = path.join(os.homedir(), '.config/yarn');
	if (fs.existsSync(configPrefix)) {
		return configPrefix;
	}

	const homePrefix = path.join(os.homedir(), '.yarn-config');
	if (fs.existsSync(homePrefix)) {
		return homePrefix;
	}

	// Yarn supports the npm conventions but the inverse is not true
	return npmPrefix;
};

exports.npm = {};
exports.npm.prefix = npmPrefix;
exports.npm.packages = path.join(npmPrefix, process.platform === 'win32' ? 'node_modules' : 'lib/node_modules');
exports.npm.binaries = process.platform === 'win32' ? npmPrefix : path.join(npmPrefix, 'bin');

const yarnPrefix = path.resolve(getYarnPrefix());
exports.yarn = {};
exports.yarn.prefix = yarnPrefix;
exports.yarn.packages = path.join(yarnPrefix, process.platform === 'win32' ? 'config/global/node_modules' : 'global/node_modules');
exports.yarn.binaries = path.join(exports.yarn.packages, '.bin');
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "ini": "^1.3.4"
  },
  "deprecated": false,
  "description": "Get the directory of globally installed packages and binaries",
  "devDependencies": {
    "ava": "*",
    "execa": "^0.7.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/global-dirs#readme",
  "license": "MIT",
  "name": "global-dirs",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/global-dirs.git"
  },
  "version": "0.1.1"
}MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "browser": {
    "decompress-response": false,
    "electron": false
  },
  "dependencies": {
    "@sindresorhus/is": "^0.14.0",
    "@szmarczak/http-timer": "^1.1.2",
    "cacheable-request": "^6.0.0",
    "decompress-response": "^3.3.0",
    "duplexer3": "^0.1.4",
    "get-stream": "^4.1.0",
    "lowercase-keys": "^1.0.1",
    "mimic-response": "^1.0.1",
    "p-cancelable": "^1.0.0",
    "to-readable-stream": "^1.0.0",
    "url-parse-lax": "^3.0.0"
  },
  "deprecated": false,
  "description": "Simplified HTTP requests",
  "devDependencies": {
    "ava": "^1.1.0",
    "coveralls": "^3.0.0",
    "delay": "^4.1.0",
    "form-data": "^2.3.3",
    "get-port": "^4.0.0",
    "np": "^3.1.0",
    "nyc": "^13.1.0",
    "p-event": "^2.1.0",
    "pem": "^1.13.2",
    "proxyquire": "^2.0.1",
    "sinon": "^7.2.2",
    "slow-stream": "0.0.4",
    "tempfile": "^2.0.0",
    "tempy": "^0.2.1",
    "tough-cookie": "^3.0.0",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=8.6"
  },
  "files": [
    "source"
  ],
  "homepage": "https://github.com/sindresorhus/got#readme",
  "license": "MIT",
  "main": "source",
  "name": "got",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/got.git"
  },
  "version": "9.6.0"
}'use strict';
const EventEmitter = require('events');
const getStream = require('get-stream');
const is = require('@sindresorhus/is');
const PCancelable = require('p-cancelable');
const requestAsEventEmitter = require('./request-as-event-emitter');
const {HTTPError, ParseError, ReadError} = require('./errors');
const {options: mergeOptions} = require('./merge');
const {reNormalize} = require('./normalize-arguments');

const asPromise = options => {
	const proxy = new EventEmitter();

	const promise = new PCancelable((resolve, reject, onCancel) => {
		const emitter = requestAsEventEmitter(options);

		onCancel(emitter.abort);

		emitter.on('response', async response => {
			proxy.emit('response', response);

			const stream = is.null(options.encoding) ? getStream.buffer(response) : getStream(response, options);

			let data;
			try {
				data = await stream;
			} catch (error) {
				reject(new ReadError(error, options));
				return;
			}

			const limitStatusCode = options.followRedirect ? 299 : 399;

			response.body = data;

			try {
				for (const [index, hook] of Object.entries(options.hooks.afterResponse)) {
					// eslint-disable-next-line no-await-in-loop
					response = await hook(response, updatedOptions => {
						updatedOptions = reNormalize(mergeOptions(options, {
							...updatedOptions,
							retry: 0,
							throwHttpErrors: false
						}));

						// Remove any further hooks for that request, because we we'll call them anyway.
						// The loop continues. We don't want duplicates (asPromise recursion).
						updatedOptions.hooks.afterResponse = options.hooks.afterResponse.slice(0, index);

						return asPromise(updatedOptions);
					});
				}
			} catch (error) {
				reject(error);
				return;
			}

			const {statusCode} = response;

			if (options.json && response.body) {
				try {
					response.body = JSON.parse(response.body);
				} catch (error) {
					if (statusCode >= 200 && statusCode < 300) {
						const parseError = new ParseError(error, statusCode, options, data);
						Object.defineProperty(parseError, 'response', {value: response});
						reject(parseError);
						return;
					}
				}
			}

			if (statusCode !== 304 && (statusCode < 200 || statusCode > limitStatusCode)) {
				const error = new HTTPError(response, options);
				Object.defineProperty(error, 'response', {value: response});
				if (emitter.retry(error) === false) {
					if (options.throwHttpErrors) {
						reject(error);
						return;
					}

					resolve(response);
				}

				return;
			}

			resolve(response);
		});

		emitter.once('error', reject);
		[
			'request',
			'redirect',
			'uploadProgress',
			'downloadProgress'
		].forEach(event => emitter.on(event, (...args) => proxy.emit(event, ...args)));
	});

	promise.on = (name, fn) => {
		proxy.on(name, fn);
		return promise;
	};

	return promise;
};

module.exports = asPromise;
'use strict';
const {PassThrough} = require('stream');
const duplexer3 = require('duplexer3');
const requestAsEventEmitter = require('./request-as-event-emitter');
const {HTTPError, ReadError} = require('./errors');

module.exports = options => {
	const input = new PassThrough();
	const output = new PassThrough();
	const proxy = duplexer3(input, output);
	const piped = new Set();
	let isFinished = false;

	options.retry.retries = () => 0;

	if (options.body) {
		proxy.write = () => {
			throw new Error('Got\'s stream is not writable when the `body` option is used');
		};
	}

	const emitter = requestAsEventEmitter(options, input);

	// Cancels the request
	proxy._destroy = emitter.abort;

	emitter.on('response', response => {
		const {statusCode} = response;

		response.on('error', error => {
			proxy.emit('error', new ReadError(error, options));
		});

		if (options.throwHttpErrors && statusCode !== 304 && (statusCode < 200 || statusCode > 299)) {
			proxy.emit('error', new HTTPError(response, options), null, response);
			return;
		}

		isFinished = true;

		response.pipe(output);

		for (const destination of piped) {
			if (destination.headersSent) {
				continue;
			}

			for (const [key, value] of Object.entries(response.headers)) {
				// Got gives *decompressed* data. Overriding `content-encoding` header would result in an error.
				// It's not possible to decompress already decompressed data, is it?
				const allowed = options.decompress ? key !== 'content-encoding' : true;
				if (allowed) {
					destination.setHeader(key, value);
				}
			}

			destination.statusCode = response.statusCode;
		}

		proxy.emit('response', response);
	});

	[
		'error',
		'request',
		'redirect',
		'uploadProgress',
		'downloadProgress'
	].forEach(event => emitter.on(event, (...args) => proxy.emit(event, ...args)));

	const pipe = proxy.pipe.bind(proxy);
	const unpipe = proxy.unpipe.bind(proxy);
	proxy.pipe = (destination, options) => {
		if (isFinished) {
			throw new Error('Failed to pipe. The response has been emitted already.');
		}

		const result = pipe(destination, options);

		if (Reflect.has(destination, 'setHeader')) {
			piped.add(destination);
		}

		return result;
	};

	proxy.unpipe = stream => {
		piped.delete(stream);
		return unpipe(stream);
	};

	return proxy;
};
'use strict';
const errors = require('./errors');
const asStream = require('./as-stream');
const asPromise = require('./as-promise');
const normalizeArguments = require('./normalize-arguments');
const merge = require('./merge');
const deepFreeze = require('./utils/deep-freeze');

const getPromiseOrStream = options => options.stream ? asStream(options) : asPromise(options);

const aliases = [
	'get',
	'post',
	'put',
	'patch',
	'head',
	'delete'
];

const create = defaults => {
	defaults = merge({}, defaults);
	normalizeArguments.preNormalize(defaults.options);

	if (!defaults.handler) {
		// This can't be getPromiseOrStream, because when merging
		// the chain would stop at this point and no further handlers would be called.
		defaults.handler = (options, next) => next(options);
	}

	function got(url, options) {
		try {
			return defaults.handler(normalizeArguments(url, options, defaults), getPromiseOrStream);
		} catch (error) {
			if (options && options.stream) {
				throw error;
			} else {
				return Promise.reject(error);
			}
		}
	}

	got.create = create;
	got.extend = options => {
		let mutableDefaults;
		if (options && Reflect.has(options, 'mutableDefaults')) {
			mutableDefaults = options.mutableDefaults;
			delete options.mutableDefaults;
		} else {
			mutableDefaults = defaults.mutableDefaults;
		}

		return create({
			options: merge.options(defaults.options, options),
			handler: defaults.handler,
			mutableDefaults
		});
	};

	got.mergeInstances = (...args) => create(merge.instances(args));

	got.stream = (url, options) => got(url, {...options, stream: true});

	for (const method of aliases) {
		got[method] = (url, options) => got(url, {...options, method});
		got.stream[method] = (url, options) => got.stream(url, {...options, method});
	}

	Object.assign(got, {...errors, mergeOptions: merge.options});
	Object.defineProperty(got, 'defaults', {
		value: defaults.mutableDefaults ? defaults : deepFreeze(defaults),
		writable: defaults.mutableDefaults,
		configurable: defaults.mutableDefaults,
		enumerable: true
	});

	return got;
};

module.exports = create;
'use strict';
const urlLib = require('url');
const http = require('http');
const PCancelable = require('p-cancelable');
const is = require('@sindresorhus/is');

class GotError extends Error {
	constructor(message, error, options) {
		super(message);
		Error.captureStackTrace(this, this.constructor);
		this.name = 'GotError';

		if (!is.undefined(error.code)) {
			this.code = error.code;
		}

		Object.assign(this, {
			host: options.host,
			hostname: options.hostname,
			method: options.method,
			path: options.path,
			socketPath: options.socketPath,
			protocol: options.protocol,
			url: options.href,
			gotOptions: options
		});
	}
}

module.exports.GotError = GotError;

module.exports.CacheError = class extends GotError {
	constructor(error, options) {
		super(error.message, error, options);
		this.name = 'CacheError';
	}
};

module.exports.RequestError = class extends GotError {
	constructor(error, options) {
		super(error.message, error, options);
		this.name = 'RequestError';
	}
};

module.exports.ReadError = class extends GotError {
	constructor(error, options) {
		super(error.message, error, options);
		this.name = 'ReadError';
	}
};

module.exports.ParseError = class extends GotError {
	constructor(error, statusCode, options, data) {
		super(`${error.message} in "${urlLib.format(options)}": \n${data.slice(0, 77)}...`, error, options);
		this.name = 'ParseError';
		this.statusCode = statusCode;
		this.statusMessage = http.STATUS_CODES[this.statusCode];
	}
};

module.exports.HTTPError = class extends GotError {
	constructor(response, options) {
		const {statusCode} = response;
		let {statusMessage} = response;

		if (statusMessage) {
			statusMessage = statusMessage.replace(/\r?\n/g, ' ').trim();
		} else {
			statusMessage = http.STATUS_CODES[statusCode];
		}

		super(`Response code ${statusCode} (${statusMessage})`, {}, options);
		this.name = 'HTTPError';
		this.statusCode = statusCode;
		this.statusMessage = statusMessage;
		this.headers = response.headers;
		this.body = response.body;
	}
};

module.exports.MaxRedirectsError = class extends GotError {
	constructor(statusCode, redirectUrls, options) {
		super('Redirected 10 times. Aborting.', {}, options);
		this.name = 'MaxRedirectsError';
		this.statusCode = statusCode;
		this.statusMessage = http.STATUS_CODES[this.statusCode];
		this.redirectUrls = redirectUrls;
	}
};

module.exports.UnsupportedProtocolError = class extends GotError {
	constructor(options) {
		super(`Unsupported protocol "${options.protocol}"`, {}, options);
		this.name = 'UnsupportedProtocolError';
	}
};

module.exports.TimeoutError = class extends GotError {
	constructor(error, options) {
		super(error.message, {code: 'ETIMEDOUT'}, options);
		this.name = 'TimeoutError';
		this.event = error.event;
	}
};

module.exports.CancelError = PCancelable.CancelError;
'use strict';
const decompressResponse = require('decompress-response');
const is = require('@sindresorhus/is');
const mimicResponse = require('mimic-response');
const progress = require('./progress');

module.exports = (response, options, emitter) => {
	const downloadBodySize = Number(response.headers['content-length']) || null;

	const progressStream = progress.download(response, emitter, downloadBodySize);

	mimicResponse(response, progressStream);

	const newResponse = options.decompress === true &&
		is.function(decompressResponse) &&
		options.method !== 'HEAD' ? decompressResponse(progressStream) : progressStream;

	if (!options.decompress && ['gzip', 'deflate'].includes(response.headers['content-encoding'])) {
		options.encoding = null;
	}

	emitter.emit('response', newResponse);

	emitter.emit('downloadProgress', {
		percent: 0,
		transferred: 0,
		total: downloadBodySize
	});

	response.pipe(progressStream);
};
'use strict';
const pkg = require('../package.json');
const create = require('./create');

const defaults = {
	options: {
		retry: {
			retries: 2,
			methods: [
				'GET',
				'PUT',
				'HEAD',
				'DELETE',
				'OPTIONS',
				'TRACE'
			],
			statusCodes: [
				408,
				413,
				429,
				500,
				502,
				503,
				504
			],
			errorCodes: [
				'ETIMEDOUT',
				'ECONNRESET',
				'EADDRINUSE',
				'ECONNREFUSED',
				'EPIPE',
				'ENOTFOUND',
				'ENETUNREACH',
				'EAI_AGAIN'
			]
		},
		headers: {
			'user-agent': `${pkg.name}/${pkg.version} (https://github.com/sindresorhus/got)`
		},
		hooks: {
			beforeRequest: [],
			beforeRedirect: [],
			beforeRetry: [],
			afterResponse: []
		},
		decompress: true,
		throwHttpErrors: true,
		followRedirect: true,
		stream: false,
		form: false,
		json: false,
		cache: false,
		useElectronNet: false
	},
	mutableDefaults: false
};

const got = create(defaults);

module.exports = got;
'use strict';

module.exports = [
	'beforeError',
	'init',
	'beforeRequest',
	'beforeRedirect',
	'beforeRetry',
	'afterResponse'
];
'use strict';
const {URL} = require('url');
const is = require('@sindresorhus/is');
const knownHookEvents = require('./known-hook-events');

const merge = (target, ...sources) => {
	for (const source of sources) {
		for (const [key, sourceValue] of Object.entries(source)) {
			if (is.undefined(sourceValue)) {
				continue;
			}

			const targetValue = target[key];
			if (is.urlInstance(targetValue) && (is.urlInstance(sourceValue) || is.string(sourceValue))) {
				target[key] = new URL(sourceValue, targetValue);
			} else if (is.plainObject(sourceValue)) {
				if (is.plainObject(targetValue)) {
					target[key] = merge({}, targetValue, sourceValue);
				} else {
					target[key] = merge({}, sourceValue);
				}
			} else if (is.array(sourceValue)) {
				target[key] = merge([], sourceValue);
			} else {
				target[key] = sourceValue;
			}
		}
	}

	return target;
};

const mergeOptions = (...sources) => {
	sources = sources.map(source => source || {});
	const merged = merge({}, ...sources);

	const hooks = {};
	for (const hook of knownHookEvents) {
		hooks[hook] = [];
	}

	for (const source of sources) {
		if (source.hooks) {
			for (const hook of knownHookEvents) {
				hooks[hook] = hooks[hook].concat(source.hooks[hook]);
			}
		}
	}

	merged.hooks = hooks;

	return merged;
};

const mergeInstances = (instances, methods) => {
	const handlers = instances.map(instance => instance.defaults.handler);
	const size = instances.length - 1;

	return {
		methods,
		options: mergeOptions(...instances.map(instance => instance.defaults.options)),
		handler: (options, next) => {
			let iteration = -1;
			const iterate = options => handlers[++iteration](options, iteration === size ? next : iterate);

			return iterate(options);
		}
	};
};

module.exports = merge;
module.exports.options = mergeOptions;
module.exports.instances = mergeInstances;
'use strict';
const {URL, URLSearchParams} = require('url'); // TODO: Use the `URL` global when targeting Node.js 10
const urlLib = require('url');
const is = require('@sindresorhus/is');
const urlParseLax = require('url-parse-lax');
const lowercaseKeys = require('lowercase-keys');
const urlToOptions = require('./utils/url-to-options');
const isFormData = require('./utils/is-form-data');
const merge = require('./merge');
const knownHookEvents = require('./known-hook-events');

const retryAfterStatusCodes = new Set([413, 429, 503]);

// `preNormalize` handles static options (e.g. headers).
// For example, when you create a custom instance and make a request
// with no static changes, they won't be normalized again.
//
// `normalize` operates on dynamic options - they cannot be saved.
// For example, `body` is everytime different per request.
// When it's done normalizing the new options, it performs merge()
// on the prenormalized options and the normalized ones.

const preNormalize = (options, defaults) => {
	if (is.nullOrUndefined(options.headers)) {
		options.headers = {};
	} else {
		options.headers = lowercaseKeys(options.headers);
	}

	if (options.baseUrl && !options.baseUrl.toString().endsWith('/')) {
		options.baseUrl += '/';
	}

	if (options.stream) {
		options.json = false;
	}

	if (is.nullOrUndefined(options.hooks)) {
		options.hooks = {};
	} else if (!is.object(options.hooks)) {
		throw new TypeError(`Parameter \`hooks\` must be an object, not ${is(options.hooks)}`);
	}

	for (const event of knownHookEvents) {
		if (is.nullOrUndefined(options.hooks[event])) {
			if (defaults) {
				options.hooks[event] = [...defaults.hooks[event]];
			} else {
				options.hooks[event] = [];
			}
		}
	}

	if (is.number(options.timeout)) {
		options.gotTimeout = {request: options.timeout};
	} else if (is.object(options.timeout)) {
		options.gotTimeout = options.timeout;
	}

	delete options.timeout;

	const {retry} = options;
	options.retry = {
		retries: 0,
		methods: [],
		statusCodes: [],
		errorCodes: []
	};

	if (is.nonEmptyObject(defaults) && retry !== false) {
		options.retry = {...defaults.retry};
	}

	if (retry !== false) {
		if (is.number(retry)) {
			options.retry.retries = retry;
		} else {
			options.retry = {...options.retry, ...retry};
		}
	}

	if (options.gotTimeout) {
		options.retry.maxRetryAfter = Math.min(...[options.gotTimeout.request, options.gotTimeout.connection].filter(n => !is.nullOrUndefined(n)));
	}

	if (is.array(options.retry.methods)) {
		options.retry.methods = new Set(options.retry.methods.map(method => method.toUpperCase()));
	}

	if (is.array(options.retry.statusCodes)) {
		options.retry.statusCodes = new Set(options.retry.statusCodes);
	}

	if (is.array(options.retry.errorCodes)) {
		options.retry.errorCodes = new Set(options.retry.errorCodes);
	}

	return options;
};

const normalize = (url, options, defaults) => {
	if (is.plainObject(url)) {
		options = {...url, ...options};
		url = options.url || {};
		delete options.url;
	}

	if (defaults) {
		options = merge({}, defaults.options, options ? preNormalize(options, defaults.options) : {});
	} else {
		options = merge({}, preNormalize(options));
	}

	if (!is.string(url) && !is.object(url)) {
		throw new TypeError(`Parameter \`url\` must be a string or object, not ${is(url)}`);
	}

	if (is.string(url)) {
		if (options.baseUrl) {
			if (url.toString().startsWith('/')) {
				url = url.toString().slice(1);
			}

			url = urlToOptions(new URL(url, options.baseUrl));
		} else {
			url = url.replace(/^unix:/, 'http://$&');
			url = urlParseLax(url);
		}
	} else if (is(url) === 'URL') {
		url = urlToOptions(url);
	}

	// Override both null/undefined with default protocol
	options = merge({path: ''}, url, {protocol: url.protocol || 'https:'}, options);

	for (const hook of options.hooks.init) {
		const called = hook(options);

		if (is.promise(called)) {
			throw new TypeError('The `init` hook must be a synchronous function');
		}
	}

	const {baseUrl} = options;
	Object.defineProperty(options, 'baseUrl', {
		set: () => {
			throw new Error('Failed to set baseUrl. Options are normalized already.');
		},
		get: () => baseUrl
	});

	const {query} = options;
	if (is.nonEmptyString(query) || is.nonEmptyObject(query) || query instanceof URLSearchParams) {
		if (!is.string(query)) {
			options.query = (new URLSearchParams(query)).toString();
		}

		options.path = `${options.path.split('?')[0]}?${options.query}`;
		delete options.query;
	}

	if (options.hostname === 'unix') {
		const matches = /(.+?):(.+)/.exec(options.path);

		if (matches) {
			const [, socketPath, path] = matches;
			options = {
				...options,
				socketPath,
				path,
				host: null
			};
		}
	}

	const {headers} = options;
	for (const [key, value] of Object.entries(headers)) {
		if (is.nullOrUndefined(value)) {
			delete headers[key];
		}
	}

	if (options.json && is.undefined(headers.accept)) {
		headers.accept = 'application/json';
	}

	if (options.decompress && is.undefined(headers['accept-encoding'])) {
		headers['accept-encoding'] = 'gzip, deflate';
	}

	const {body} = options;
	if (is.nullOrUndefined(body)) {
		options.method = options.method ? options.method.toUpperCase() : 'GET';
	} else {
		const isObject = is.object(body) && !is.buffer(body) && !is.nodeStream(body);
		if (!is.nodeStream(body) && !is.string(body) && !is.buffer(body) && !(options.form || options.json)) {
			throw new TypeError('The `body` option must be a stream.Readable, string or Buffer');
		}

		if (options.json && !(isObject || is.array(body))) {
			throw new TypeError('The `body` option must be an Object or Array when the `json` option is used');
		}

		if (options.form && !isObject) {
			throw new TypeError('The `body` option must be an Object when the `form` option is used');
		}

		if (isFormData(body)) {
			// Special case for https://github.com/form-data/form-data
			headers['content-type'] = headers['content-type'] || `multipart/form-data; boundary=${body.getBoundary()}`;
		} else if (options.form) {
			headers['content-type'] = headers['content-type'] || 'application/x-www-form-urlencoded';
			options.body = (new URLSearchParams(body)).toString();
		} else if (options.json) {
			headers['content-type'] = headers['content-type'] || 'application/json';
			options.body = JSON.stringify(body);
		}

		options.method = options.method ? options.method.toUpperCase() : 'POST';
	}

	if (!is.function(options.retry.retries)) {
		const {retries} = options.retry;

		options.retry.retries = (iteration, error) => {
			if (iteration > retries) {
				return 0;
			}

			if ((!error || !options.retry.errorCodes.has(error.code)) && (!options.retry.methods.has(error.method) || !options.retry.statusCodes.has(error.statusCode))) {
				return 0;
			}

			if (Reflect.has(error, 'headers') && Reflect.has(error.headers, 'retry-after') && retryAfterStatusCodes.has(error.statusCode)) {
				let after = Number(error.headers['retry-after']);
				if (is.nan(after)) {
					after = Date.parse(error.headers['retry-after']) - Date.now();
				} else {
					after *= 1000;
				}

				if (after > options.retry.maxRetryAfter) {
					return 0;
				}

				return after;
			}

			if (error.statusCode === 413) {
				return 0;
			}

			const noise = Math.random() * 100;
			return ((2 ** (iteration - 1)) * 1000) + noise;
		};
	}

	return options;
};

const reNormalize = options => normalize(urlLib.format(options), options);

module.exports = normalize;
module.exports.preNormalize = preNormalize;
module.exports.reNormalize = reNormalize;
'use strict';
const {Transform} = require('stream');

module.exports = {
	download(response, emitter, downloadBodySize) {
		let downloaded = 0;

		return new Transform({
			transform(chunk, encoding, callback) {
				downloaded += chunk.length;

				const percent = downloadBodySize ? downloaded / downloadBodySize : 0;

				// Let `flush()` be responsible for emitting the last event
				if (percent < 1) {
					emitter.emit('downloadProgress', {
						percent,
						transferred: downloaded,
						total: downloadBodySize
					});
				}

				callback(null, chunk);
			},

			flush(callback) {
				emitter.emit('downloadProgress', {
					percent: 1,
					transferred: downloaded,
					total: downloadBodySize
				});

				callback();
			}
		});
	},

	upload(request, emitter, uploadBodySize) {
		const uploadEventFrequency = 150;
		let uploaded = 0;
		let progressInterval;

		emitter.emit('uploadProgress', {
			percent: 0,
			transferred: 0,
			total: uploadBodySize
		});

		request.once('error', () => {
			clearInterval(progressInterval);
		});

		request.once('response', () => {
			clearInterval(progressInterval);

			emitter.emit('uploadProgress', {
				percent: 1,
				transferred: uploaded,
				total: uploadBodySize
			});
		});

		request.once('socket', socket => {
			const onSocketConnect = () => {
				progressInterval = setInterval(() => {
					const lastUploaded = uploaded;
					/* istanbul ignore next: see #490 (occurs randomly!) */
					const headersSize = request._header ? Buffer.byteLength(request._header) : 0;
					uploaded = socket.bytesWritten - headersSize;

					// Don't emit events with unchanged progress and
					// prevent last event from being emitted, because
					// it's emitted when `response` is emitted
					if (uploaded === lastUploaded || uploaded === uploadBodySize) {
						return;
					}

					emitter.emit('uploadProgress', {
						percent: uploadBodySize ? uploaded / uploadBodySize : 0,
						transferred: uploaded,
						total: uploadBodySize
					});
				}, uploadEventFrequency);
			};

			/* istanbul ignore next: hard to test */
			if (socket.connecting) {
				socket.once('connect', onSocketConnect);
			} else if (socket.writable) {
				// The socket is being reused from pool,
				// so the connect event will not be emitted
				onSocketConnect();
			}
		});
	}
};
'use strict';
const {URL} = require('url'); // TODO: Use the `URL` global when targeting Node.js 10
const util = require('util');
const EventEmitter = require('events');
const http = require('http');
const https = require('https');
const urlLib = require('url');
const CacheableRequest = require('cacheable-request');
const toReadableStream = require('to-readable-stream');
const is = require('@sindresorhus/is');
const timer = require('@szmarczak/http-timer');
const timedOut = require('./utils/timed-out');
const getBodySize = require('./utils/get-body-size');
const getResponse = require('./get-response');
const progress = require('./progress');
const {CacheError, UnsupportedProtocolError, MaxRedirectsError, RequestError, TimeoutError} = require('./errors');
const urlToOptions = require('./utils/url-to-options');

const getMethodRedirectCodes = new Set([300, 301, 302, 303, 304, 305, 307, 308]);
const allMethodRedirectCodes = new Set([300, 303, 307, 308]);

module.exports = (options, input) => {
	const emitter = new EventEmitter();
	const redirects = [];
	let currentRequest;
	let requestUrl;
	let redirectString;
	let uploadBodySize;
	let retryCount = 0;
	let shouldAbort = false;

	const setCookie = options.cookieJar ? util.promisify(options.cookieJar.setCookie.bind(options.cookieJar)) : null;
	const getCookieString = options.cookieJar ? util.promisify(options.cookieJar.getCookieString.bind(options.cookieJar)) : null;
	const agents = is.object(options.agent) ? options.agent : null;

	const emitError = async error => {
		try {
			for (const hook of options.hooks.beforeError) {
				// eslint-disable-next-line no-await-in-loop
				error = await hook(error);
			}

			emitter.emit('error', error);
		} catch (error2) {
			emitter.emit('error', error2);
		}
	};

	const get = async options => {
		const currentUrl = redirectString || requestUrl;

		if (options.protocol !== 'http:' && options.protocol !== 'https:') {
			throw new UnsupportedProtocolError(options);
		}

		decodeURI(currentUrl);

		let fn;
		if (is.function(options.request)) {
			fn = {request: options.request};
		} else {
			fn = options.protocol === 'https:' ? https : http;
		}

		if (agents) {
			const protocolName = options.protocol === 'https:' ? 'https' : 'http';
			options.agent = agents[protocolName] || options.agent;
		}

		/* istanbul ignore next: electron.net is broken */
		if (options.useElectronNet && process.versions.electron) {
			const r = ({x: require})['yx'.slice(1)]; // Trick webpack
			const electron = r('electron');
			fn = electron.net || electron.remote.net;
		}

		if (options.cookieJar) {
			const cookieString = await getCookieString(currentUrl, {});

			if (is.nonEmptyString(cookieString)) {
				options.headers.cookie = cookieString;
			}
		}

		let timings;
		const handleResponse = async response => {
			try {
				/* istanbul ignore next: fixes https://github.com/electron/electron/blob/cbb460d47628a7a146adf4419ed48550a98b2923/lib/browser/api/net.js#L59-L65 */
				if (options.useElectronNet) {
					response = new Proxy(response, {
						get: (target, name) => {
							if (name === 'trailers' || name === 'rawTrailers') {
								return [];
							}

							const value = target[name];
							return is.function(value) ? value.bind(target) : value;
						}
					});
				}

				const {statusCode} = response;
				response.url = currentUrl;
				response.requestUrl = requestUrl;
				response.retryCount = retryCount;
				response.timings = timings;
				response.redirectUrls = redirects;
				response.request = {
					gotOptions: options
				};

				const rawCookies = response.headers['set-cookie'];
				if (options.cookieJar && rawCookies) {
					await Promise.all(rawCookies.map(rawCookie => setCookie(rawCookie, response.url)));
				}

				if (options.followRedirect && 'location' in response.headers) {
					if (allMethodRedirectCodes.has(statusCode) || (getMethodRedirectCodes.has(statusCode) && (options.method === 'GET' || options.method === 'HEAD'))) {
						response.resume(); // We're being redirected, we don't care about the response.

						if (statusCode === 303) {
							// Server responded with "see other", indicating that the resource exists at another location,
							// and the client should request it from that location via GET or HEAD.
							options.method = 'GET';
						}

						if (redirects.length >= 10) {
							throw new MaxRedirectsError(statusCode, redirects, options);
						}

						// Handles invalid URLs. See https://github.com/sindresorhus/got/issues/604
						const redirectBuffer = Buffer.from(response.headers.location, 'binary').toString();
						const redirectURL = new URL(redirectBuffer, currentUrl);
						redirectString = redirectURL.toString();

						redirects.push(redirectString);

						const redirectOptions = {
							...options,
							...urlToOptions(redirectURL)
						};

						for (const hook of options.hooks.beforeRedirect) {
							// eslint-disable-next-line no-await-in-loop
							await hook(redirectOptions);
						}

						emitter.emit('redirect', response, redirectOptions);

						await get(redirectOptions);
						return;
					}
				}

				getResponse(response, options, emitter);
			} catch (error) {
				emitError(error);
			}
		};

		const handleRequest = request => {
			if (shouldAbort) {
				request.once('error', () => {});
				request.abort();
				return;
			}

			currentRequest = request;

			request.once('error', error => {
				if (request.aborted) {
					return;
				}

				if (error instanceof timedOut.TimeoutError) {
					error = new TimeoutError(error, options);
				} else {
					error = new RequestError(error, options);
				}

				if (emitter.retry(error) === false) {
					emitError(error);
				}
			});

			timings = timer(request);

			progress.upload(request, emitter, uploadBodySize);

			if (options.gotTimeout) {
				timedOut(request, options.gotTimeout, options);
			}

			emitter.emit('request', request);

			const uploadComplete = () => {
				request.emit('upload-complete');
			};

			try {
				if (is.nodeStream(options.body)) {
					options.body.once('end', uploadComplete);
					options.body.pipe(request);
					options.body = undefined;
				} else if (options.body) {
					request.end(options.body, uploadComplete);
				} else if (input && (options.method === 'POST' || options.method === 'PUT' || options.method === 'PATCH')) {
					input.once('end', uploadComplete);
					input.pipe(request);
				} else {
					request.end(uploadComplete);
				}
			} catch (error) {
				emitError(new RequestError(error, options));
			}
		};

		if (options.cache) {
			const cacheableRequest = new CacheableRequest(fn.request, options.cache);
			const cacheRequest = cacheableRequest(options, handleResponse);

			cacheRequest.once('error', error => {
				if (error instanceof CacheableRequest.RequestError) {
					emitError(new RequestError(error, options));
				} else {
					emitError(new CacheError(error, options));
				}
			});

			cacheRequest.once('request', handleRequest);
		} else {
			// Catches errors thrown by calling fn.request(...)
			try {
				handleRequest(fn.request(options, handleResponse));
			} catch (error) {
				emitError(new RequestError(error, options));
			}
		}
	};

	emitter.retry = error => {
		let backoff;

		try {
			backoff = options.retry.retries(++retryCount, error);
		} catch (error2) {
			emitError(error2);
			return;
		}

		if (backoff) {
			const retry = async options => {
				try {
					for (const hook of options.hooks.beforeRetry) {
						// eslint-disable-next-line no-await-in-loop
						await hook(options, error, retryCount);
					}

					await get(options);
				} catch (error) {
					emitError(error);
				}
			};

			setTimeout(retry, backoff, {...options, forceRefresh: true});
			return true;
		}

		return false;
	};

	emitter.abort = () => {
		if (currentRequest) {
			currentRequest.once('error', () => {});
			currentRequest.abort();
		} else {
			shouldAbort = true;
		}
	};

	setImmediate(async () => {
		try {
			// Convert buffer to stream to receive upload progress events (#322)
			const {body} = options;
			if (is.buffer(body)) {
				options.body = toReadableStream(body);
				uploadBodySize = body.length;
			} else {
				uploadBodySize = await getBodySize(options);
			}

			if (is.undefined(options.headers['content-length']) && is.undefined(options.headers['transfer-encoding'])) {
				if ((uploadBodySize > 0 || options.method === 'PUT') && !is.null(uploadBodySize)) {
					options.headers['content-length'] = uploadBodySize;
				}
			}

			for (const hook of options.hooks.beforeRequest) {
				// eslint-disable-next-line no-await-in-loop
				await hook(options);
			}

			requestUrl = options.href || (new URL(options.path, urlLib.format(options))).toString();

			await get(options);
		} catch (error) {
			emitError(error);
		}
	});

	return emitter;
};
'use strict';
const is = require('@sindresorhus/is');

module.exports = function deepFreeze(object) {
	for (const [key, value] of Object.entries(object)) {
		if (is.plainObject(value) || is.array(value)) {
			deepFreeze(object[key]);
		}
	}

	return Object.freeze(object);
};
'use strict';
const fs = require('fs');
const util = require('util');
const is = require('@sindresorhus/is');
const isFormData = require('./is-form-data');

module.exports = async options => {
	const {body} = options;

	if (options.headers['content-length']) {
		return Number(options.headers['content-length']);
	}

	if (!body && !options.stream) {
		return 0;
	}

	if (is.string(body)) {
		return Buffer.byteLength(body);
	}

	if (isFormData(body)) {
		return util.promisify(body.getLength.bind(body))();
	}

	if (body instanceof fs.ReadStream) {
		const {size} = await util.promisify(fs.stat)(body.path);
		return size;
	}

	return null;
};
'use strict';
const is = require('@sindresorhus/is');

module.exports = body => is.nodeStream(body) && is.function(body.getBoundary);
'use strict';
const net = require('net');

class TimeoutError extends Error {
	constructor(threshold, event) {
		super(`Timeout awaiting '${event}' for ${threshold}ms`);
		this.name = 'TimeoutError';
		this.code = 'ETIMEDOUT';
		this.event = event;
	}
}

const reentry = Symbol('reentry');

const noop = () => {};

module.exports = (request, delays, options) => {
	/* istanbul ignore next: this makes sure timed-out isn't called twice */
	if (request[reentry]) {
		return;
	}

	request[reentry] = true;

	let stopNewTimeouts = false;

	const addTimeout = (delay, callback, ...args) => {
		// An error had been thrown before. Going further would result in uncaught errors.
		// See https://github.com/sindresorhus/got/issues/631#issuecomment-435675051
		if (stopNewTimeouts) {
			return noop;
		}

		// Event loop order is timers, poll, immediates.
		// The timed event may emit during the current tick poll phase, so
		// defer calling the handler until the poll phase completes.
		let immediate;
		const timeout = setTimeout(() => {
			immediate = setImmediate(callback, delay, ...args);
			/* istanbul ignore next: added in node v9.7.0 */
			if (immediate.unref) {
				immediate.unref();
			}
		}, delay);

		/* istanbul ignore next: in order to support electron renderer */
		if (timeout.unref) {
			timeout.unref();
		}

		const cancel = () => {
			clearTimeout(timeout);
			clearImmediate(immediate);
		};

		cancelers.push(cancel);

		return cancel;
	};

	const {host, hostname} = options;
	const timeoutHandler = (delay, event) => {
		request.emit('error', new TimeoutError(delay, event));
		request.once('error', () => {}); // Ignore the `socket hung up` error made by request.abort()

		request.abort();
	};

	const cancelers = [];
	const cancelTimeouts = () => {
		stopNewTimeouts = true;
		cancelers.forEach(cancelTimeout => cancelTimeout());
	};

	request.once('error', cancelTimeouts);
	request.once('response', response => {
		response.once('end', cancelTimeouts);
	});

	if (delays.request !== undefined) {
		addTimeout(delays.request, timeoutHandler, 'request');
	}

	if (delays.socket !== undefined) {
		const socketTimeoutHandler = () => {
			timeoutHandler(delays.socket, 'socket');
		};

		request.setTimeout(delays.socket, socketTimeoutHandler);

		// `request.setTimeout(0)` causes a memory leak.
		// We can just remove the listener and forget about the timer - it's unreffed.
		// See https://github.com/sindresorhus/got/issues/690
		cancelers.push(() => request.removeListener('timeout', socketTimeoutHandler));
	}

	if (delays.lookup !== undefined && !request.socketPath && !net.isIP(hostname || host)) {
		request.once('socket', socket => {
			/* istanbul ignore next: hard to test */
			if (socket.connecting) {
				const cancelTimeout = addTimeout(delays.lookup, timeoutHandler, 'lookup');
				socket.once('lookup', cancelTimeout);
			}
		});
	}

	if (delays.connect !== undefined) {
		request.once('socket', socket => {
			/* istanbul ignore next: hard to test */
			if (socket.connecting) {
				const timeConnect = () => addTimeout(delays.connect, timeoutHandler, 'connect');

				if (request.socketPath || net.isIP(hostname || host)) {
					socket.once('connect', timeConnect());
				} else {
					socket.once('lookup', error => {
						if (error === null) {
							socket.once('connect', timeConnect());
						}
					});
				}
			}
		});
	}

	if (delays.secureConnect !== undefined && options.protocol === 'https:') {
		request.once('socket', socket => {
			/* istanbul ignore next: hard to test */
			if (socket.connecting) {
				socket.once('connect', () => {
					const cancelTimeout = addTimeout(delays.secureConnect, timeoutHandler, 'secureConnect');
					socket.once('secureConnect', cancelTimeout);
				});
			}
		});
	}

	if (delays.send !== undefined) {
		request.once('socket', socket => {
			const timeRequest = () => addTimeout(delays.send, timeoutHandler, 'send');
			/* istanbul ignore next: hard to test */
			if (socket.connecting) {
				socket.once('connect', () => {
					request.once('upload-complete', timeRequest());
				});
			} else {
				request.once('upload-complete', timeRequest());
			}
		});
	}

	if (delays.response !== undefined) {
		request.once('upload-complete', () => {
			const cancelTimeout = addTimeout(delays.response, timeoutHandler, 'response');
			request.once('response', cancelTimeout);
		});
	}
};

module.exports.TimeoutError = TimeoutError;
'use strict';
const is = require('@sindresorhus/is');

module.exports = url => {
	const options = {
		protocol: url.protocol,
		hostname: url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname,
		hash: url.hash,
		search: url.search,
		pathname: url.pathname,
		href: url.href
	};

	if (is.string(url.port) && url.port.length > 0) {
		options.port = Number(url.port);
	}

	if (url.username || url.password) {
		options.auth = `${url.username}:${url.password}`;
	}

	options.path = is.null(url.search) ? url.pathname : `${url.pathname}${url.search}`;

	return options;
};
The ISC License

Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
'use strict'

module.exports = clone

function clone (obj) {
  if (obj === null || typeof obj !== 'object')
    return obj

  if (obj instanceof Object)
    var copy = { __proto__: obj.__proto__ }
  else
    var copy = Object.create(null)

  Object.getOwnPropertyNames(obj).forEach(function (key) {
    Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key))
  })

  return copy
}
var fs = require('fs')
var polyfills = require('./polyfills.js')
var legacy = require('./legacy-streams.js')
var clone = require('./clone.js')

var util = require('util')

/* istanbul ignore next - node 0.x polyfill */
var gracefulQueue
var previousSymbol

/* istanbul ignore else - node 0.x polyfill */
if (typeof Symbol === 'function' && typeof Symbol.for === 'function') {
  gracefulQueue = Symbol.for('graceful-fs.queue')
  // This is used in testing by future versions
  previousSymbol = Symbol.for('graceful-fs.previous')
} else {
  gracefulQueue = '___graceful-fs.queue'
  previousSymbol = '___graceful-fs.previous'
}

function noop () {}

function publishQueue(context, queue) {
  Object.defineProperty(context, gracefulQueue, {
    get: function() {
      return queue
    }
  })
}

var debug = noop
if (util.debuglog)
  debug = util.debuglog('gfs4')
else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || ''))
  debug = function() {
    var m = util.format.apply(util, arguments)
    m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ')
    console.error(m)
  }

// Once time initialization
if (!fs[gracefulQueue]) {
  // This queue can be shared by multiple loaded instances
  var queue = global[gracefulQueue] || []
  publishQueue(fs, queue)

  // Patch fs.close/closeSync to shared queue version, because we need
  // to retry() whenever a close happens *anywhere* in the program.
  // This is essential when multiple graceful-fs instances are
  // in play at the same time.
  fs.close = (function (fs$close) {
    function close (fd, cb) {
      return fs$close.call(fs, fd, function (err) {
        // This function uses the graceful-fs shared queue
        if (!err) {
          retry()
        }

        if (typeof cb === 'function')
          cb.apply(this, arguments)
      })
    }

    Object.defineProperty(close, previousSymbol, {
      value: fs$close
    })
    return close
  })(fs.close)

  fs.closeSync = (function (fs$closeSync) {
    function closeSync (fd) {
      // This function uses the graceful-fs shared queue
      fs$closeSync.apply(fs, arguments)
      retry()
    }

    Object.defineProperty(closeSync, previousSymbol, {
      value: fs$closeSync
    })
    return closeSync
  })(fs.closeSync)

  if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) {
    process.on('exit', function() {
      debug(fs[gracefulQueue])
      require('assert').equal(fs[gracefulQueue].length, 0)
    })
  }
}

if (!global[gracefulQueue]) {
  publishQueue(global, fs[gracefulQueue]);
}

module.exports = patch(clone(fs))
if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) {
    module.exports = patch(fs)
    fs.__patched = true;
}

function patch (fs) {
  // Everything that references the open() function needs to be in here
  polyfills(fs)
  fs.gracefulify = patch

  fs.createReadStream = createReadStream
  fs.createWriteStream = createWriteStream
  var fs$readFile = fs.readFile
  fs.readFile = readFile
  function readFile (path, options, cb) {
    if (typeof options === 'function')
      cb = options, options = null

    return go$readFile(path, options, cb)

    function go$readFile (path, options, cb) {
      return fs$readFile(path, options, function (err) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([go$readFile, [path, options, cb]])
        else {
          if (typeof cb === 'function')
            cb.apply(this, arguments)
          retry()
        }
      })
    }
  }

  var fs$writeFile = fs.writeFile
  fs.writeFile = writeFile
  function writeFile (path, data, options, cb) {
    if (typeof options === 'function')
      cb = options, options = null

    return go$writeFile(path, data, options, cb)

    function go$writeFile (path, data, options, cb) {
      return fs$writeFile(path, data, options, function (err) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([go$writeFile, [path, data, options, cb]])
        else {
          if (typeof cb === 'function')
            cb.apply(this, arguments)
          retry()
        }
      })
    }
  }

  var fs$appendFile = fs.appendFile
  if (fs$appendFile)
    fs.appendFile = appendFile
  function appendFile (path, data, options, cb) {
    if (typeof options === 'function')
      cb = options, options = null

    return go$appendFile(path, data, options, cb)

    function go$appendFile (path, data, options, cb) {
      return fs$appendFile(path, data, options, function (err) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([go$appendFile, [path, data, options, cb]])
        else {
          if (typeof cb === 'function')
            cb.apply(this, arguments)
          retry()
        }
      })
    }
  }

  var fs$readdir = fs.readdir
  fs.readdir = readdir
  function readdir (path, options, cb) {
    var args = [path]
    if (typeof options !== 'function') {
      args.push(options)
    } else {
      cb = options
    }
    args.push(go$readdir$cb)

    return go$readdir(args)

    function go$readdir$cb (err, files) {
      if (files && files.sort)
        files.sort()

      if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
        enqueue([go$readdir, [args]])

      else {
        if (typeof cb === 'function')
          cb.apply(this, arguments)
        retry()
      }
    }
  }

  function go$readdir (args) {
    return fs$readdir.apply(fs, args)
  }

  if (process.version.substr(0, 4) === 'v0.8') {
    var legStreams = legacy(fs)
    ReadStream = legStreams.ReadStream
    WriteStream = legStreams.WriteStream
  }

  var fs$ReadStream = fs.ReadStream
  if (fs$ReadStream) {
    ReadStream.prototype = Object.create(fs$ReadStream.prototype)
    ReadStream.prototype.open = ReadStream$open
  }

  var fs$WriteStream = fs.WriteStream
  if (fs$WriteStream) {
    WriteStream.prototype = Object.create(fs$WriteStream.prototype)
    WriteStream.prototype.open = WriteStream$open
  }

  Object.defineProperty(fs, 'ReadStream', {
    get: function () {
      return ReadStream
    },
    set: function (val) {
      ReadStream = val
    },
    enumerable: true,
    configurable: true
  })
  Object.defineProperty(fs, 'WriteStream', {
    get: function () {
      return WriteStream
    },
    set: function (val) {
      WriteStream = val
    },
    enumerable: true,
    configurable: true
  })

  // legacy names
  var FileReadStream = ReadStream
  Object.defineProperty(fs, 'FileReadStream', {
    get: function () {
      return FileReadStream
    },
    set: function (val) {
      FileReadStream = val
    },
    enumerable: true,
    configurable: true
  })
  var FileWriteStream = WriteStream
  Object.defineProperty(fs, 'FileWriteStream', {
    get: function () {
      return FileWriteStream
    },
    set: function (val) {
      FileWriteStream = val
    },
    enumerable: true,
    configurable: true
  })

  function ReadStream (path, options) {
    if (this instanceof ReadStream)
      return fs$ReadStream.apply(this, arguments), this
    else
      return ReadStream.apply(Object.create(ReadStream.prototype), arguments)
  }

  function ReadStream$open () {
    var that = this
    open(that.path, that.flags, that.mode, function (err, fd) {
      if (err) {
        if (that.autoClose)
          that.destroy()

        that.emit('error', err)
      } else {
        that.fd = fd
        that.emit('open', fd)
        that.read()
      }
    })
  }

  function WriteStream (path, options) {
    if (this instanceof WriteStream)
      return fs$WriteStream.apply(this, arguments), this
    else
      return WriteStream.apply(Object.create(WriteStream.prototype), arguments)
  }

  function WriteStream$open () {
    var that = this
    open(that.path, that.flags, that.mode, function (err, fd) {
      if (err) {
        that.destroy()
        that.emit('error', err)
      } else {
        that.fd = fd
        that.emit('open', fd)
      }
    })
  }

  function createReadStream (path, options) {
    return new fs.ReadStream(path, options)
  }

  function createWriteStream (path, options) {
    return new fs.WriteStream(path, options)
  }

  var fs$open = fs.open
  fs.open = open
  function open (path, flags, mode, cb) {
    if (typeof mode === 'function')
      cb = mode, mode = null

    return go$open(path, flags, mode, cb)

    function go$open (path, flags, mode, cb) {
      return fs$open(path, flags, mode, function (err, fd) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([go$open, [path, flags, mode, cb]])
        else {
          if (typeof cb === 'function')
            cb.apply(this, arguments)
          retry()
        }
      })
    }
  }

  return fs
}

function enqueue (elem) {
  debug('ENQUEUE', elem[0].name, elem[1])
  fs[gracefulQueue].push(elem)
}

function retry () {
  var elem = fs[gracefulQueue].shift()
  if (elem) {
    debug('RETRY', elem[0].name, elem[1])
    elem[0].apply(null, elem[1])
  }
}
var Stream = require('stream').Stream

module.exports = legacy

function legacy (fs) {
  return {
    ReadStream: ReadStream,
    WriteStream: WriteStream
  }

  function ReadStream (path, options) {
    if (!(this instanceof ReadStream)) return new ReadStream(path, options);

    Stream.call(this);

    var self = this;

    this.path = path;
    this.fd = null;
    this.readable = true;
    this.paused = false;

    this.flags = 'r';
    this.mode = 438; /*=0666*/
    this.bufferSize = 64 * 1024;

    options = options || {};

    // Mixin options into this
    var keys = Object.keys(options);
    for (var index = 0, length = keys.length; index < length; index++) {
      var key = keys[index];
      this[key] = options[key];
    }

    if (this.encoding) this.setEncoding(this.encoding);

    if (this.start !== undefined) {
      if ('number' !== typeof this.start) {
        throw TypeError('start must be a Number');
      }
      if (this.end === undefined) {
        this.end = Infinity;
      } else if ('number' !== typeof this.end) {
        throw TypeError('end must be a Number');
      }

      if (this.start > this.end) {
        throw new Error('start must be <= end');
      }

      this.pos = this.start;
    }

    if (this.fd !== null) {
      process.nextTick(function() {
        self._read();
      });
      return;
    }

    fs.open(this.path, this.flags, this.mode, function (err, fd) {
      if (err) {
        self.emit('error', err);
        self.readable = false;
        return;
      }

      self.fd = fd;
      self.emit('open', fd);
      self._read();
    })
  }

  function WriteStream (path, options) {
    if (!(this instanceof WriteStream)) return new WriteStream(path, options);

    Stream.call(this);

    this.path = path;
    this.fd = null;
    this.writable = true;

    this.flags = 'w';
    this.encoding = 'binary';
    this.mode = 438; /*=0666*/
    this.bytesWritten = 0;

    options = options || {};

    // Mixin options into this
    var keys = Object.keys(options);
    for (var index = 0, length = keys.length; index < length; index++) {
      var key = keys[index];
      this[key] = options[key];
    }

    if (this.start !== undefined) {
      if ('number' !== typeof this.start) {
        throw TypeError('start must be a Number');
      }
      if (this.start < 0) {
        throw new Error('start must be >= zero');
      }

      this.pos = this.start;
    }

    this.busy = false;
    this._queue = [];

    if (this.fd === null) {
      this._open = fs.open;
      this._queue.push([this._open, this.path, this.flags, this.mode, undefined]);
      this.flush();
    }
  }
}
{
  "dependencies": {},
  "deprecated": false,
  "description": "A drop-in replacement for fs, making various improvements.",
  "devDependencies": {
    "import-fresh": "^2.0.0",
    "mkdirp": "^0.5.0",
    "rimraf": "^2.2.8",
    "tap": "^12.7.0"
  },
  "directories": {
    "test": "test"
  },
  "files": [
    "fs.js",
    "graceful-fs.js",
    "legacy-streams.js",
    "polyfills.js",
    "clone.js"
  ],
  "homepage": "https://github.com/isaacs/node-graceful-fs#readme",
  "license": "ISC",
  "main": "graceful-fs.js",
  "name": "graceful-fs",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/node-graceful-fs.git"
  },
  "version": "4.2.4"
}var constants = require('constants')

var origCwd = process.cwd
var cwd = null

var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform

process.cwd = function() {
  if (!cwd)
    cwd = origCwd.call(process)
  return cwd
}
try {
  process.cwd()
} catch (er) {}

var chdir = process.chdir
process.chdir = function(d) {
  cwd = null
  chdir.call(process, d)
}

module.exports = patch

function patch (fs) {
  // (re-)implement some things that are known busted or missing.

  // lchmod, broken prior to 0.6.2
  // back-port the fix here.
  if (constants.hasOwnProperty('O_SYMLINK') &&
      process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) {
    patchLchmod(fs)
  }

  // lutimes implementation, or no-op
  if (!fs.lutimes) {
    patchLutimes(fs)
  }

  // https://github.com/isaacs/node-graceful-fs/issues/4
  // Chown should not fail on einval or eperm if non-root.
  // It should not fail on enosys ever, as this just indicates
  // that a fs doesn't support the intended operation.

  fs.chown = chownFix(fs.chown)
  fs.fchown = chownFix(fs.fchown)
  fs.lchown = chownFix(fs.lchown)

  fs.chmod = chmodFix(fs.chmod)
  fs.fchmod = chmodFix(fs.fchmod)
  fs.lchmod = chmodFix(fs.lchmod)

  fs.chownSync = chownFixSync(fs.chownSync)
  fs.fchownSync = chownFixSync(fs.fchownSync)
  fs.lchownSync = chownFixSync(fs.lchownSync)

  fs.chmodSync = chmodFixSync(fs.chmodSync)
  fs.fchmodSync = chmodFixSync(fs.fchmodSync)
  fs.lchmodSync = chmodFixSync(fs.lchmodSync)

  fs.stat = statFix(fs.stat)
  fs.fstat = statFix(fs.fstat)
  fs.lstat = statFix(fs.lstat)

  fs.statSync = statFixSync(fs.statSync)
  fs.fstatSync = statFixSync(fs.fstatSync)
  fs.lstatSync = statFixSync(fs.lstatSync)

  // if lchmod/lchown do not exist, then make them no-ops
  if (!fs.lchmod) {
    fs.lchmod = function (path, mode, cb) {
      if (cb) process.nextTick(cb)
    }
    fs.lchmodSync = function () {}
  }
  if (!fs.lchown) {
    fs.lchown = function (path, uid, gid, cb) {
      if (cb) process.nextTick(cb)
    }
    fs.lchownSync = function () {}
  }

  // on Windows, A/V software can lock the directory, causing this
  // to fail with an EACCES or EPERM if the directory contains newly
  // created files.  Try again on failure, for up to 60 seconds.

  // Set the timeout this long because some Windows Anti-Virus, such as Parity
  // bit9, may lock files for up to a minute, causing npm package install
  // failures. Also, take care to yield the scheduler. Windows scheduling gives
  // CPU to a busy looping process, which can cause the program causing the lock
  // contention to be starved of CPU by node, so the contention doesn't resolve.
  if (platform === "win32") {
    fs.rename = (function (fs$rename) { return function (from, to, cb) {
      var start = Date.now()
      var backoff = 0;
      fs$rename(from, to, function CB (er) {
        if (er
            && (er.code === "EACCES" || er.code === "EPERM")
            && Date.now() - start < 60000) {
          setTimeout(function() {
            fs.stat(to, function (stater, st) {
              if (stater && stater.code === "ENOENT")
                fs$rename(from, to, CB);
              else
                cb(er)
            })
          }, backoff)
          if (backoff < 100)
            backoff += 10;
          return;
        }
        if (cb) cb(er)
      })
    }})(fs.rename)
  }

  // if read() returns EAGAIN, then just try it again.
  fs.read = (function (fs$read) {
    function read (fd, buffer, offset, length, position, callback_) {
      var callback
      if (callback_ && typeof callback_ === 'function') {
        var eagCounter = 0
        callback = function (er, _, __) {
          if (er && er.code === 'EAGAIN' && eagCounter < 10) {
            eagCounter ++
            return fs$read.call(fs, fd, buffer, offset, length, position, callback)
          }
          callback_.apply(this, arguments)
        }
      }
      return fs$read.call(fs, fd, buffer, offset, length, position, callback)
    }

    // This ensures `util.promisify` works as it does for native `fs.read`.
    read.__proto__ = fs$read
    return read
  })(fs.read)

  fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) {
    var eagCounter = 0
    while (true) {
      try {
        return fs$readSync.call(fs, fd, buffer, offset, length, position)
      } catch (er) {
        if (er.code === 'EAGAIN' && eagCounter < 10) {
          eagCounter ++
          continue
        }
        throw er
      }
    }
  }})(fs.readSync)

  function patchLchmod (fs) {
    fs.lchmod = function (path, mode, callback) {
      fs.open( path
             , constants.O_WRONLY | constants.O_SYMLINK
             , mode
             , function (err, fd) {
        if (err) {
          if (callback) callback(err)
          return
        }
        // prefer to return the chmod error, if one occurs,
        // but still try to close, and report closing errors if they occur.
        fs.fchmod(fd, mode, function (err) {
          fs.close(fd, function(err2) {
            if (callback) callback(err || err2)
          })
        })
      })
    }

    fs.lchmodSync = function (path, mode) {
      var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode)

      // prefer to return the chmod error, if one occurs,
      // but still try to close, and report closing errors if they occur.
      var threw = true
      var ret
      try {
        ret = fs.fchmodSync(fd, mode)
        threw = false
      } finally {
        if (threw) {
          try {
            fs.closeSync(fd)
          } catch (er) {}
        } else {
          fs.closeSync(fd)
        }
      }
      return ret
    }
  }

  function patchLutimes (fs) {
    if (constants.hasOwnProperty("O_SYMLINK")) {
      fs.lutimes = function (path, at, mt, cb) {
        fs.open(path, constants.O_SYMLINK, function (er, fd) {
          if (er) {
            if (cb) cb(er)
            return
          }
          fs.futimes(fd, at, mt, function (er) {
            fs.close(fd, function (er2) {
              if (cb) cb(er || er2)
            })
          })
        })
      }

      fs.lutimesSync = function (path, at, mt) {
        var fd = fs.openSync(path, constants.O_SYMLINK)
        var ret
        var threw = true
        try {
          ret = fs.futimesSync(fd, at, mt)
          threw = false
        } finally {
          if (threw) {
            try {
              fs.closeSync(fd)
            } catch (er) {}
          } else {
            fs.closeSync(fd)
          }
        }
        return ret
      }

    } else {
      fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) }
      fs.lutimesSync = function () {}
    }
  }

  function chmodFix (orig) {
    if (!orig) return orig
    return function (target, mode, cb) {
      return orig.call(fs, target, mode, function (er) {
        if (chownErOk(er)) er = null
        if (cb) cb.apply(this, arguments)
      })
    }
  }

  function chmodFixSync (orig) {
    if (!orig) return orig
    return function (target, mode) {
      try {
        return orig.call(fs, target, mode)
      } catch (er) {
        if (!chownErOk(er)) throw er
      }
    }
  }


  function chownFix (orig) {
    if (!orig) return orig
    return function (target, uid, gid, cb) {
      return orig.call(fs, target, uid, gid, function (er) {
        if (chownErOk(er)) er = null
        if (cb) cb.apply(this, arguments)
      })
    }
  }

  function chownFixSync (orig) {
    if (!orig) return orig
    return function (target, uid, gid) {
      try {
        return orig.call(fs, target, uid, gid)
      } catch (er) {
        if (!chownErOk(er)) throw er
      }
    }
  }

  function statFix (orig) {
    if (!orig) return orig
    // Older versions of Node erroneously returned signed integers for
    // uid + gid.
    return function (target, options, cb) {
      if (typeof options === 'function') {
        cb = options
        options = null
      }
      function callback (er, stats) {
        if (stats) {
          if (stats.uid < 0) stats.uid += 0x100000000
          if (stats.gid < 0) stats.gid += 0x100000000
        }
        if (cb) cb.apply(this, arguments)
      }
      return options ? orig.call(fs, target, options, callback)
        : orig.call(fs, target, callback)
    }
  }

  function statFixSync (orig) {
    if (!orig) return orig
    // Older versions of Node erroneously returned signed integers for
    // uid + gid.
    return function (target, options) {
      var stats = options ? orig.call(fs, target, options)
        : orig.call(fs, target)
      if (stats.uid < 0) stats.uid += 0x100000000
      if (stats.gid < 0) stats.gid += 0x100000000
      return stats;
    }
  }

  // ENOSYS means that the fs doesn't support the op. Just ignore
  // that, because it doesn't matter.
  //
  // if there's no getuid, or if getuid() is something other
  // than 0, and the error is EINVAL or EPERM, then just ignore
  // it.
  //
  // This specific case is a silent failure in cp, install, tar,
  // and most other unix tools that manage permissions.
  //
  // When running as root, or if other types of errors are
  // encountered, then it's strict.
  function chownErOk (er) {
    if (!er)
      return true

    if (er.code === "ENOSYS")
      return true

    var nonroot = !process.getuid || process.getuid() !== 0
    if (nonroot) {
      if (er.code === "EINVAL" || er.code === "EPERM")
        return true
    }

    return false
  }
}
Copyright (c) 2015, Ahmad Nassri <ahmad@ahmadnassri.com>

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
{
  "author": {
    "name": "Ahmad Nassri",
    "email": "ahmad@ahmadnassri.com",
    "url": "https://www.ahmadnassri.com/"
  },
  "config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
  },
  "deprecated": false,
  "description": "JSON Schema for HTTP Archive (HAR)",
  "devDependencies": {
    "ajv": "^5.0.0",
    "codeclimate-test-reporter": "^0.4.0",
    "cz-conventional-changelog": "^1.2.0",
    "echint": "^2.1.0",
    "semantic-release": "^6.3.2",
    "snazzy": "^5.0.0",
    "tap": "^8.0.1"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "lib"
  ],
  "homepage": "https://github.com/ahmadnassri/har-schema",
  "license": "ISC",
  "main": "lib/index.js",
  "name": "har-schema",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ahmadnassri/har-schema.git"
  },
  "version": "2.0.0"
}{
  "$id": "afterRequest.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "optional": true,
  "required": [
    "lastAccess",
    "eTag",
    "hitCount"
  ],
  "properties": {
    "expires": {
      "type": "string",
      "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?"
    },
    "lastAccess": {
      "type": "string",
      "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?"
    },
    "eTag": {
      "type": "string"
    },
    "hitCount": {
      "type": "integer"
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "beforeRequest.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "optional": true,
  "required": [
    "lastAccess",
    "eTag",
    "hitCount"
  ],
  "properties": {
    "expires": {
      "type": "string",
      "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?"
    },
    "lastAccess": {
      "type": "string",
      "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?"
    },
    "eTag": {
      "type": "string"
    },
    "hitCount": {
      "type": "integer"
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "browser.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "required": [
    "name",
    "version"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "version": {
      "type": "string"
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "cache.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "properties": {
    "beforeRequest": {
      "oneOf": [
        { "type": "null" },
        { "$ref": "beforeRequest.json#" }
      ]
    },
    "afterRequest": {
      "oneOf": [
        { "type": "null" },
        { "$ref": "afterRequest.json#" }
      ]
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "content.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "required": [
    "size",
    "mimeType"
  ],
  "properties": {
    "size": {
      "type": "integer"
    },
    "compression": {
      "type": "integer"
    },
    "mimeType": {
      "type": "string"
    },
    "text": {
      "type": "string"
    },
    "encoding": {
      "type": "string"
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "cookie.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "required": [
    "name",
    "value"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "value": {
      "type": "string"
    },
    "path": {
      "type": "string"
    },
    "domain": {
      "type": "string"
    },
    "expires": {
      "type": ["string", "null"],
      "format": "date-time"
    },
    "httpOnly": {
      "type": "boolean"
    },
    "secure": {
      "type": "boolean"
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "creator.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "required": [
    "name",
    "version"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "version": {
      "type": "string"
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "entry.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "optional": true,
  "required": [
    "startedDateTime",
    "time",
    "request",
    "response",
    "cache",
    "timings"
  ],
  "properties": {
    "pageref": {
      "type": "string"
    },
    "startedDateTime": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))"
    },
    "time": {
      "type": "number",
      "min": 0
    },
    "request": {
      "$ref": "request.json#"
    },
    "response": {
      "$ref": "response.json#"
    },
    "cache": {
      "$ref": "cache.json#"
    },
    "timings": {
      "$ref": "timings.json#"
    },
    "serverIPAddress": {
      "type": "string",
      "oneOf": [
        { "format": "ipv4" },
        { "format": "ipv6" }
      ]
    },
    "connection": {
      "type": "string"
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "har.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "required": [
    "log"
  ],
  "properties": {
    "log": {
      "$ref": "log.json#"
    }
  }
}
{
  "$id": "header.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "required": [
    "name",
    "value"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "value": {
      "type": "string"
    },
    "comment": {
      "type": "string"
    }
  }
}
'use strict'

module.exports = {
  afterRequest: require('./afterRequest.json'),
  beforeRequest: require('./beforeRequest.json'),
  browser: require('./browser.json'),
  cache: require('./cache.json'),
  content: require('./content.json'),
  cookie: require('./cookie.json'),
  creator: require('./creator.json'),
  entry: require('./entry.json'),
  har: require('./har.json'),
  header: require('./header.json'),
  log: require('./log.json'),
  page: require('./page.json'),
  pageTimings: require('./pageTimings.json'),
  postData: require('./postData.json'),
  query: require('./query.json'),
  request: require('./request.json'),
  response: require('./response.json'),
  timings: require('./timings.json')
}
{
  "$id": "log.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "required": [
    "version",
    "creator",
    "entries"
  ],
  "properties": {
    "version": {
      "type": "string"
    },
    "creator": {
      "$ref": "creator.json#"
    },
    "browser": {
      "$ref": "browser.json#"
    },
    "pages": {
      "type": "array",
      "items": {
        "$ref": "page.json#"
      }
    },
    "entries": {
      "type": "array",
      "items": {
        "$ref": "entry.json#"
      }
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "page.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "optional": true,
  "required": [
    "startedDateTime",
    "id",
    "title",
    "pageTimings"
  ],
  "properties": {
    "startedDateTime": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))"
    },
    "id": {
      "type": "string",
      "unique": true
    },
    "title": {
      "type": "string"
    },
    "pageTimings": {
      "$ref": "pageTimings.json#"
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "pageTimings.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "properties": {
    "onContentLoad": {
      "type": "number",
      "min": -1
    },
    "onLoad": {
      "type": "number",
      "min": -1
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "postData.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "optional": true,
  "required": [
    "mimeType"
  ],
  "properties": {
    "mimeType": {
      "type": "string"
    },
    "text": {
      "type": "string"
    },
    "params": {
      "type": "array",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "value": {
          "type": "string"
        },
        "fileName": {
          "type": "string"
        },
        "contentType": {
          "type": "string"
        },
        "comment": {
          "type": "string"
        }
      }
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "query.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "required": [
    "name",
    "value"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "value": {
      "type": "string"
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "request.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "required": [
    "method",
    "url",
    "httpVersion",
    "cookies",
    "headers",
    "queryString",
    "headersSize",
    "bodySize"
  ],
  "properties": {
    "method": {
      "type": "string"
    },
    "url": {
      "type": "string",
      "format": "uri"
    },
    "httpVersion": {
      "type": "string"
    },
    "cookies": {
      "type": "array",
      "items": {
        "$ref": "cookie.json#"
      }
    },
    "headers": {
      "type": "array",
      "items": {
        "$ref": "header.json#"
      }
    },
    "queryString": {
      "type": "array",
      "items": {
        "$ref": "query.json#"
      }
    },
    "postData": {
      "$ref": "postData.json#"
    },
    "headersSize": {
      "type": "integer"
    },
    "bodySize": {
      "type": "integer"
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "response.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "required": [
    "status",
    "statusText",
    "httpVersion",
    "cookies",
    "headers",
    "content",
    "redirectURL",
    "headersSize",
    "bodySize"
  ],
  "properties": {
    "status": {
      "type": "integer"
    },
    "statusText": {
      "type": "string"
    },
    "httpVersion": {
      "type": "string"
    },
    "cookies": {
      "type": "array",
      "items": {
        "$ref": "cookie.json#"
      }
    },
    "headers": {
      "type": "array",
      "items": {
        "$ref": "header.json#"
      }
    },
    "content": {
      "$ref": "content.json#"
    },
    "redirectURL": {
      "type": "string"
    },
    "headersSize": {
      "type": "integer"
    },
    "bodySize": {
      "type": "integer"
    },
    "comment": {
      "type": "string"
    }
  }
}
{
  "$id": "timings.json#",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "required": [
    "send",
    "wait",
    "receive"
  ],
  "properties": {
    "dns": {
      "type": "number",
      "min": -1
    },
    "connect": {
      "type": "number",
      "min": -1
    },
    "blocked": {
      "type": "number",
      "min": -1
    },
    "send": {
      "type": "number",
      "min": -1
    },
    "wait": {
      "type": "number",
      "min": -1
    },
    "receive": {
      "type": "number",
      "min": -1
    },
    "ssl": {
      "type": "number",
      "min": -1
    },
    "comment": {
      "type": "string"
    }
  }
}
MIT License

Copyright (c) 2018 Ahmad Nassri <ahmad@ahmadnassri.com>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Ahmad Nassri",
    "email": "ahmad@ahmadnassri.com",
    "url": "https://www.ahmadnassri.com/"
  },
  "dependencies": {
    "ajv": "^6.12.3",
    "har-schema": "^2.0.0"
  },
  "deprecated": "this library is no longer supported",
  "description": "Extremely fast HTTP Archive (HAR) validator using JSON Schema",
  "devDependencies": {
    "tap": "^14.10.8"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "lib"
  ],
  "homepage": "https://github.com/ahmadnassri/node-har-validator",
  "license": "MIT",
  "main": "lib/promise.js",
  "name": "har-validator",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ahmadnassri/node-har-validator.git"
  },
  "version": "5.1.5"
}var Ajv = require('ajv')
var HARError = require('./error')
var schemas = require('har-schema')

var ajv

function createAjvInstance () {
  var ajv = new Ajv({
    allErrors: true
  })
  ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-06.json'))
  ajv.addSchema(schemas)

  return ajv
}

function validate (name, data, next) {
  data = data || {}

  // validator config
  ajv = ajv || createAjvInstance()

  var validate = ajv.getSchema(name + '.json')

  var valid = validate(data)

  // callback?
  if (typeof next === 'function') {
    return next(!valid ? new HARError(validate.errors) : null, valid)
  }

  return valid
}

exports.afterRequest = function (data, next) {
  return validate('afterRequest', data, next)
}

exports.beforeRequest = function (data, next) {
  return validate('beforeRequest', data, next)
}

exports.browser = function (data, next) {
  return validate('browser', data, next)
}

exports.cache = function (data, next) {
  return validate('cache', data, next)
}

exports.content = function (data, next) {
  return validate('content', data, next)
}

exports.cookie = function (data, next) {
  return validate('cookie', data, next)
}

exports.creator = function (data, next) {
  return validate('creator', data, next)
}

exports.entry = function (data, next) {
  return validate('entry', data, next)
}

exports.har = function (data, next) {
  return validate('har', data, next)
}

exports.header = function (data, next) {
  return validate('header', data, next)
}

exports.log = function (data, next) {
  return validate('log', data, next)
}

exports.page = function (data, next) {
  return validate('page', data, next)
}

exports.pageTimings = function (data, next) {
  return validate('pageTimings', data, next)
}

exports.postData = function (data, next) {
  return validate('postData', data, next)
}

exports.query = function (data, next) {
  return validate('query', data, next)
}

exports.request = function (data, next) {
  return validate('request', data, next)
}

exports.response = function (data, next) {
  return validate('response', data, next)
}

exports.timings = function (data, next) {
  return validate('timings', data, next)
}
function HARError (errors) {
  var message = 'validation failed'

  this.name = 'HARError'
  this.message = message
  this.errors = errors

  if (typeof Error.captureStackTrace === 'function') {
    Error.captureStackTrace(this, this.constructor)
  } else {
    this.stack = (new Error(message)).stack
  }
}

HARError.prototype = Error.prototype

module.exports = HARError
var Ajv = require('ajv')
var HARError = require('./error')
var schemas = require('har-schema')

var ajv

function createAjvInstance () {
  var ajv = new Ajv({
    allErrors: true
  })
  ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-06.json'))
  ajv.addSchema(schemas)

  return ajv
}

function validate (name, data) {
  data = data || {}

  // validator config
  ajv = ajv || createAjvInstance()

  var validate = ajv.getSchema(name + '.json')

  return new Promise(function (resolve, reject) {
    var valid = validate(data)

    !valid ? reject(new HARError(validate.errors)) : resolve(data)
  })
}

exports.afterRequest = function (data) {
  return validate('afterRequest', data)
}

exports.beforeRequest = function (data) {
  return validate('beforeRequest', data)
}

exports.browser = function (data) {
  return validate('browser', data)
}

exports.cache = function (data) {
  return validate('cache', data)
}

exports.content = function (data) {
  return validate('content', data)
}

exports.cookie = function (data) {
  return validate('cookie', data)
}

exports.creator = function (data) {
  return validate('creator', data)
}

exports.entry = function (data) {
  return validate('entry', data)
}

exports.har = function (data) {
  return validate('har', data)
}

exports.header = function (data) {
  return validate('header', data)
}

exports.log = function (data) {
  return validate('log', data)
}

exports.page = function (data) {
  return validate('page', data)
}

exports.pageTimings = function (data) {
  return validate('pageTimings', data)
}

exports.postData = function (data) {
  return validate('postData', data)
}

exports.query = function (data) {
  return validate('query', data)
}

exports.request = function (data) {
  return validate('request', data)
}

exports.response = function (data) {
  return validate('response', data)
}

exports.timings = function (data) {
  return validate('timings', data)
}
'use strict';
module.exports = (flag, argv) => {
	argv = argv || process.argv;
	const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');
	const pos = argv.indexOf(prefix + flag);
	const terminatorPos = argv.indexOf('--');
	return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if argv has a specific flag",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/has-flag#readme",
  "license": "MIT",
  "name": "has-flag",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/has-flag.git"
  },
  "version": "3.0.0"
}'use strict';
const path = require('path');
const fs = require('fs');

const hasYarn = (cwd = process.cwd()) => fs.existsSync(path.resolve(cwd, 'yarn.lock'));

module.exports = hasYarn;
// TODO: Remove this for the next major release
module.exports.default = hasYarn;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if a project is using Yarn",
  "devDependencies": {
    "ava": "^1.4.1",
    "tsd": "^0.7.1",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/sindresorhus/has-yarn#readme",
  "license": "MIT",
  "name": "has-yarn",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/has-yarn.git"
  },
  "version": "2.1.0"
}Copyright (c) 2015, Rebecca Turner

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
'use strict'

var gitHosts = module.exports = {
  github: {
    // First two are insecure and generally shouldn't be used any more, but
    // they are still supported.
    'protocols': [ 'git', 'http', 'git+ssh', 'git+https', 'ssh', 'https' ],
    'domain': 'github.com',
    'treepath': 'tree',
    'filetemplate': 'https://{auth@}raw.githubusercontent.com/{user}/{project}/{committish}/{path}',
    'bugstemplate': 'https://{domain}/{user}/{project}/issues',
    'gittemplate': 'git://{auth@}{domain}/{user}/{project}.git{#committish}',
    'tarballtemplate': 'https://codeload.{domain}/{user}/{project}/tar.gz/{committish}'
  },
  bitbucket: {
    'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ],
    'domain': 'bitbucket.org',
    'treepath': 'src',
    'tarballtemplate': 'https://{domain}/{user}/{project}/get/{committish}.tar.gz'
  },
  gitlab: {
    'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ],
    'domain': 'gitlab.com',
    'treepath': 'tree',
    'bugstemplate': 'https://{domain}/{user}/{project}/issues',
    'httpstemplate': 'git+https://{auth@}{domain}/{user}/{projectPath}.git{#committish}',
    'tarballtemplate': 'https://{domain}/{user}/{project}/repository/archive.tar.gz?ref={committish}',
    'pathmatch': /^[/]([^/]+)[/]((?!.*(\/-\/|\/repository\/archive\.tar\.gz\?=.*|\/repository\/[^/]+\/archive.tar.gz$)).*?)(?:[.]git|[/])?$/
  },
  gist: {
    'protocols': [ 'git', 'git+ssh', 'git+https', 'ssh', 'https' ],
    'domain': 'gist.github.com',
    'pathmatch': /^[/](?:([^/]+)[/])?([a-z0-9]{32,})(?:[.]git)?$/,
    'filetemplate': 'https://gist.githubusercontent.com/{user}/{project}/raw{/committish}/{path}',
    'bugstemplate': 'https://{domain}/{project}',
    'gittemplate': 'git://{domain}/{project}.git{#committish}',
    'sshtemplate': 'git@{domain}:/{project}.git{#committish}',
    'sshurltemplate': 'git+ssh://git@{domain}/{project}.git{#committish}',
    'browsetemplate': 'https://{domain}/{project}{/committish}',
    'browsefiletemplate': 'https://{domain}/{project}{/committish}{#path}',
    'docstemplate': 'https://{domain}/{project}{/committish}',
    'httpstemplate': 'git+https://{domain}/{project}.git{#committish}',
    'shortcuttemplate': '{type}:{project}{#committish}',
    'pathtemplate': '{project}{#committish}',
    'tarballtemplate': 'https://codeload.github.com/gist/{project}/tar.gz/{committish}',
    'hashformat': function (fragment) {
      return 'file-' + formatHashFragment(fragment)
    }
  }
}

var gitHostDefaults = {
  'sshtemplate': 'git@{domain}:{user}/{project}.git{#committish}',
  'sshurltemplate': 'git+ssh://git@{domain}/{user}/{project}.git{#committish}',
  'browsetemplate': 'https://{domain}/{user}/{project}{/tree/committish}',
  'browsefiletemplate': 'https://{domain}/{user}/{project}/{treepath}/{committish}/{path}{#fragment}',
  'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#readme',
  'httpstemplate': 'git+https://{auth@}{domain}/{user}/{project}.git{#committish}',
  'filetemplate': 'https://{domain}/{user}/{project}/raw/{committish}/{path}',
  'shortcuttemplate': '{type}:{user}/{project}{#committish}',
  'pathtemplate': '{user}/{project}{#committish}',
  'pathmatch': /^[/]([^/]+)[/]([^/]+?)(?:[.]git|[/])?$/,
  'hashformat': formatHashFragment
}

Object.keys(gitHosts).forEach(function (name) {
  Object.keys(gitHostDefaults).forEach(function (key) {
    if (gitHosts[name][key]) return
    gitHosts[name][key] = gitHostDefaults[key]
  })
  gitHosts[name].protocols_re = RegExp('^(' +
    gitHosts[name].protocols.map(function (protocol) {
      return protocol.replace(/([\\+*{}()[\]$^|])/g, '\\$1')
    }).join('|') + '):$')
})

function formatHashFragment (fragment) {
  return fragment.toLowerCase().replace(/^\W+|\/|\W+$/g, '').replace(/\W+/g, '-')
}
'use strict'
var gitHosts = require('./git-host-info.js')
/* eslint-disable node/no-deprecated-api */

// copy-pasta util._extend from node's source, to avoid pulling
// the whole util module into peoples' webpack bundles.
/* istanbul ignore next */
var extend = Object.assign || function _extend (target, source) {
  // Don't do anything if source isn't an object
  if (source === null || typeof source !== 'object') return target

  var keys = Object.keys(source)
  var i = keys.length
  while (i--) {
    target[keys[i]] = source[keys[i]]
  }
  return target
}

module.exports = GitHost
function GitHost (type, user, auth, project, committish, defaultRepresentation, opts) {
  var gitHostInfo = this
  gitHostInfo.type = type
  Object.keys(gitHosts[type]).forEach(function (key) {
    gitHostInfo[key] = gitHosts[type][key]
  })
  gitHostInfo.user = user
  gitHostInfo.auth = auth
  gitHostInfo.project = project
  gitHostInfo.committish = committish
  gitHostInfo.default = defaultRepresentation
  gitHostInfo.opts = opts || {}
}

GitHost.prototype.hash = function () {
  return this.committish ? '#' + this.committish : ''
}

GitHost.prototype._fill = function (template, opts) {
  if (!template) return
  var vars = extend({}, opts)
  vars.path = vars.path ? vars.path.replace(/^[/]+/g, '') : ''
  opts = extend(extend({}, this.opts), opts)
  var self = this
  Object.keys(this).forEach(function (key) {
    if (self[key] != null && vars[key] == null) vars[key] = self[key]
  })
  var rawAuth = vars.auth
  var rawcommittish = vars.committish
  var rawFragment = vars.fragment
  var rawPath = vars.path
  var rawProject = vars.project
  Object.keys(vars).forEach(function (key) {
    var value = vars[key]
    if ((key === 'path' || key === 'project') && typeof value === 'string') {
      vars[key] = value.split('/').map(function (pathComponent) {
        return encodeURIComponent(pathComponent)
      }).join('/')
    } else {
      vars[key] = encodeURIComponent(value)
    }
  })
  vars['auth@'] = rawAuth ? rawAuth + '@' : ''
  vars['#fragment'] = rawFragment ? '#' + this.hashformat(rawFragment) : ''
  vars.fragment = vars.fragment ? vars.fragment : ''
  vars['#path'] = rawPath ? '#' + this.hashformat(rawPath) : ''
  vars['/path'] = vars.path ? '/' + vars.path : ''
  vars.projectPath = rawProject.split('/').map(encodeURIComponent).join('/')
  if (opts.noCommittish) {
    vars['#committish'] = ''
    vars['/tree/committish'] = ''
    vars['/committish'] = ''
    vars.committish = ''
  } else {
    vars['#committish'] = rawcommittish ? '#' + rawcommittish : ''
    vars['/tree/committish'] = vars.committish
      ? '/' + vars.treepath + '/' + vars.committish
      : ''
    vars['/committish'] = vars.committish ? '/' + vars.committish : ''
    vars.committish = vars.committish || 'master'
  }
  var res = template
  Object.keys(vars).forEach(function (key) {
    res = res.replace(new RegExp('[{]' + key + '[}]', 'g'), vars[key])
  })
  if (opts.noGitPlus) {
    return res.replace(/^git[+]/, '')
  } else {
    return res
  }
}

GitHost.prototype.ssh = function (opts) {
  return this._fill(this.sshtemplate, opts)
}

GitHost.prototype.sshurl = function (opts) {
  return this._fill(this.sshurltemplate, opts)
}

GitHost.prototype.browse = function (P, F, opts) {
  if (typeof P === 'string') {
    if (typeof F !== 'string') {
      opts = F
      F = null
    }
    return this._fill(this.browsefiletemplate, extend({
      fragment: F,
      path: P
    }, opts))
  } else {
    return this._fill(this.browsetemplate, P)
  }
}

GitHost.prototype.docs = function (opts) {
  return this._fill(this.docstemplate, opts)
}

GitHost.prototype.bugs = function (opts) {
  return this._fill(this.bugstemplate, opts)
}

GitHost.prototype.https = function (opts) {
  return this._fill(this.httpstemplate, opts)
}

GitHost.prototype.git = function (opts) {
  return this._fill(this.gittemplate, opts)
}

GitHost.prototype.shortcut = function (opts) {
  return this._fill(this.shortcuttemplate, opts)
}

GitHost.prototype.path = function (opts) {
  return this._fill(this.pathtemplate, opts)
}

GitHost.prototype.tarball = function (opts_) {
  var opts = extend({}, opts_, { noCommittish: false })
  return this._fill(this.tarballtemplate, opts)
}

GitHost.prototype.file = function (P, opts) {
  return this._fill(this.filetemplate, extend({ path: P }, opts))
}

GitHost.prototype.getDefaultRepresentation = function () {
  return this.default
}

GitHost.prototype.toString = function (opts) {
  if (this.default && typeof this[this.default] === 'function') return this[this.default](opts)
  return this.sshurl(opts)
}
'use strict'
var url = require('url')
var gitHosts = require('./git-host-info.js')
var GitHost = module.exports = require('./git-host.js')

var protocolToRepresentationMap = {
  'git+ssh:': 'sshurl',
  'git+https:': 'https',
  'ssh:': 'sshurl',
  'git:': 'git'
}

function protocolToRepresentation (protocol) {
  return protocolToRepresentationMap[protocol] || protocol.slice(0, -1)
}

var authProtocols = {
  'git:': true,
  'https:': true,
  'git+https:': true,
  'http:': true,
  'git+http:': true
}

var cache = {}

module.exports.fromUrl = function (giturl, opts) {
  if (typeof giturl !== 'string') return
  var key = giturl + JSON.stringify(opts || {})

  if (!(key in cache)) {
    cache[key] = fromUrl(giturl, opts)
  }

  return cache[key]
}

function fromUrl (giturl, opts) {
  if (giturl == null || giturl === '') return
  var url = fixupUnqualifiedGist(
    isGitHubShorthand(giturl) ? 'github:' + giturl : giturl
  )
  var parsed = parseGitUrl(url)
  var shortcutMatch = url.match(new RegExp('^([^:]+):(?:(?:[^@:]+(?:[^@]+)?@)?([^/]*))[/](.+?)(?:[.]git)?($|#)'))
  var matches = Object.keys(gitHosts).map(function (gitHostName) {
    try {
      var gitHostInfo = gitHosts[gitHostName]
      var auth = null
      if (parsed.auth && authProtocols[parsed.protocol]) {
        auth = parsed.auth
      }
      var committish = parsed.hash ? decodeURIComponent(parsed.hash.substr(1)) : null
      var user = null
      var project = null
      var defaultRepresentation = null
      if (shortcutMatch && shortcutMatch[1] === gitHostName) {
        user = shortcutMatch[2] && decodeURIComponent(shortcutMatch[2])
        project = decodeURIComponent(shortcutMatch[3])
        defaultRepresentation = 'shortcut'
      } else {
        if (parsed.host && parsed.host !== gitHostInfo.domain && parsed.host.replace(/^www[.]/, '') !== gitHostInfo.domain) return
        if (!gitHostInfo.protocols_re.test(parsed.protocol)) return
        if (!parsed.path) return
        var pathmatch = gitHostInfo.pathmatch
        var matched = parsed.path.match(pathmatch)
        if (!matched) return
        /* istanbul ignore else */
        if (matched[1] !== null && matched[1] !== undefined) {
          user = decodeURIComponent(matched[1].replace(/^:/, ''))
        }
        project = decodeURIComponent(matched[2])
        defaultRepresentation = protocolToRepresentation(parsed.protocol)
      }
      return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts)
    } catch (ex) {
      /* istanbul ignore else */
      if (ex instanceof URIError) {
      } else throw ex
    }
  }).filter(function (gitHostInfo) { return gitHostInfo })
  if (matches.length !== 1) return
  return matches[0]
}

function isGitHubShorthand (arg) {
  // Note: This does not fully test the git ref format.
  // See https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html
  //
  // The only way to do this properly would be to shell out to
  // git-check-ref-format, and as this is a fast sync function,
  // we don't want to do that.  Just let git fail if it turns
  // out that the commit-ish is invalid.
  // GH usernames cannot start with . or -
  return /^[^:@%/\s.-][^:@%/\s]*[/][^:@\s/%]+(?:#.*)?$/.test(arg)
}

function fixupUnqualifiedGist (giturl) {
  // necessary for round-tripping gists
  var parsed = url.parse(giturl)
  if (parsed.protocol === 'gist:' && parsed.host && !parsed.path) {
    return parsed.protocol + '/' + parsed.host
  } else {
    return giturl
  }
}

function parseGitUrl (giturl) {
  var matched = giturl.match(/^([^@]+)@([^:/]+):[/]?((?:[^/]+[/])?[^/]+?)(?:[.]git)?(#.*)?$/)
  if (!matched) {
    var legacy = url.parse(giturl)
    // If we don't have url.URL, then sorry, this is just not fixable.
    // This affects Node <= 6.12.
    if (legacy.auth && typeof url.URL === 'function') {
      // git urls can be in the form of scp-style/ssh-connect strings, like
      // git+ssh://user@host.com:some/path, which the legacy url parser
      // supports, but WhatWG url.URL class does not.  However, the legacy
      // parser de-urlencodes the username and password, so something like
      // https://user%3An%40me:p%40ss%3Aword@x.com/ becomes
      // https://user:n@me:p@ss:word@x.com/ which is all kinds of wrong.
      // Pull off just the auth and host, so we dont' get the confusing
      // scp-style URL, then pass that to the WhatWG parser to get the
      // auth properly escaped.
      var authmatch = giturl.match(/[^@]+@[^:/]+/)
      /* istanbul ignore else - this should be impossible */
      if (authmatch) {
        var whatwg = new url.URL(authmatch[0])
        legacy.auth = whatwg.username || ''
        if (whatwg.password) legacy.auth += ':' + whatwg.password
      }
    }
    return legacy
  }
  return {
    protocol: 'git+ssh:',
    slashes: true,
    auth: matched[1],
    host: matched[2],
    port: null,
    hostname: matched[2],
    hash: matched[4],
    search: null,
    query: null,
    pathname: '/' + matched[3],
    path: '/' + matched[3],
    href: 'git+ssh://' + matched[1] + '@' + matched[2] +
          '/' + matched[3] + (matched[4] || '')
  }
}
{
  "author": {
    "name": "Rebecca Turner",
    "email": "me@re-becca.org",
    "url": "http://re-becca.org"
  },
  "deprecated": false,
  "description": "Provides metadata and conversions from repository urls for Github, Bitbucket and Gitlab",
  "devDependencies": {
    "standard": "^11.0.1",
    "standard-version": "^4.4.0",
    "tap": "^12.7.0"
  },
  "files": [
    "index.js",
    "git-host.js",
    "git-host-info.js"
  ],
  "homepage": "https://github.com/npm/hosted-git-info",
  "license": "ISC",
  "main": "index.js",
  "name": "hosted-git-info",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/hosted-git-info.git"
  },
  "version": "2.8.8"
}Copyright 2016-2018 Kornel LesiÅ„ski

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
'use strict';
// rfc7231 6.1
const statusCodeCacheableByDefault = new Set([
    200,
    203,
    204,
    206,
    300,
    301,
    404,
    405,
    410,
    414,
    501,
]);

// This implementation does not understand partial responses (206)
const understoodStatuses = new Set([
    200,
    203,
    204,
    300,
    301,
    302,
    303,
    307,
    308,
    404,
    405,
    410,
    414,
    501,
]);

const errorStatusCodes = new Set([
    500,
    502,
    503, 
    504,
]);

const hopByHopHeaders = {
    date: true, // included, because we add Age update Date
    connection: true,
    'keep-alive': true,
    'proxy-authenticate': true,
    'proxy-authorization': true,
    te: true,
    trailer: true,
    'transfer-encoding': true,
    upgrade: true,
};

const excludedFromRevalidationUpdate = {
    // Since the old body is reused, it doesn't make sense to change properties of the body
    'content-length': true,
    'content-encoding': true,
    'transfer-encoding': true,
    'content-range': true,
};

function toNumberOrZero(s) {
    const n = parseInt(s, 10);
    return isFinite(n) ? n : 0;
}

// RFC 5861
function isErrorResponse(response) {
    // consider undefined response as faulty
    if(!response) {
        return true
    }
    return errorStatusCodes.has(response.status);
}

function parseCacheControl(header) {
    const cc = {};
    if (!header) return cc;

    // TODO: When there is more than one value present for a given directive (e.g., two Expires header fields, multiple Cache-Control: max-age directives),
    // the directive's value is considered invalid. Caches are encouraged to consider responses that have invalid freshness information to be stale
    const parts = header.trim().split(/\s*,\s*/); // TODO: lame parsing
    for (const part of parts) {
        const [k, v] = part.split(/\s*=\s*/, 2);
        cc[k] = v === undefined ? true : v.replace(/^"|"$/g, ''); // TODO: lame unquoting
    }

    return cc;
}

function formatCacheControl(cc) {
    let parts = [];
    for (const k in cc) {
        const v = cc[k];
        parts.push(v === true ? k : k + '=' + v);
    }
    if (!parts.length) {
        return undefined;
    }
    return parts.join(', ');
}

module.exports = class CachePolicy {
    constructor(
        req,
        res,
        {
            shared,
            cacheHeuristic,
            immutableMinTimeToLive,
            ignoreCargoCult,
            _fromObject,
        } = {}
    ) {
        if (_fromObject) {
            this._fromObject(_fromObject);
            return;
        }

        if (!res || !res.headers) {
            throw Error('Response headers missing');
        }
        this._assertRequestHasHeaders(req);

        this._responseTime = this.now();
        this._isShared = shared !== false;
        this._cacheHeuristic =
            undefined !== cacheHeuristic ? cacheHeuristic : 0.1; // 10% matches IE
        this._immutableMinTtl =
            undefined !== immutableMinTimeToLive
                ? immutableMinTimeToLive
                : 24 * 3600 * 1000;

        this._status = 'status' in res ? res.status : 200;
        this._resHeaders = res.headers;
        this._rescc = parseCacheControl(res.headers['cache-control']);
        this._method = 'method' in req ? req.method : 'GET';
        this._url = req.url;
        this._host = req.headers.host;
        this._noAuthorization = !req.headers.authorization;
        this._reqHeaders = res.headers.vary ? req.headers : null; // Don't keep all request headers if they won't be used
        this._reqcc = parseCacheControl(req.headers['cache-control']);

        // Assume that if someone uses legacy, non-standard uncecessary options they don't understand caching,
        // so there's no point stricly adhering to the blindly copy&pasted directives.
        if (
            ignoreCargoCult &&
            'pre-check' in this._rescc &&
            'post-check' in this._rescc
        ) {
            delete this._rescc['pre-check'];
            delete this._rescc['post-check'];
            delete this._rescc['no-cache'];
            delete this._rescc['no-store'];
            delete this._rescc['must-revalidate'];
            this._resHeaders = Object.assign({}, this._resHeaders, {
                'cache-control': formatCacheControl(this._rescc),
            });
            delete this._resHeaders.expires;
            delete this._resHeaders.pragma;
        }

        // When the Cache-Control header field is not present in a request, caches MUST consider the no-cache request pragma-directive
        // as having the same effect as if "Cache-Control: no-cache" were present (see Section 5.2.1).
        if (
            res.headers['cache-control'] == null &&
            /no-cache/.test(res.headers.pragma)
        ) {
            this._rescc['no-cache'] = true;
        }
    }

    now() {
        return Date.now();
    }

    storable() {
        // The "no-store" request directive indicates that a cache MUST NOT store any part of either this request or any response to it.
        return !!(
            !this._reqcc['no-store'] &&
            // A cache MUST NOT store a response to any request, unless:
            // The request method is understood by the cache and defined as being cacheable, and
            ('GET' === this._method ||
                'HEAD' === this._method ||
                ('POST' === this._method && this._hasExplicitExpiration())) &&
            // the response status code is understood by the cache, and
            understoodStatuses.has(this._status) &&
            // the "no-store" cache directive does not appear in request or response header fields, and
            !this._rescc['no-store'] &&
            // the "private" response directive does not appear in the response, if the cache is shared, and
            (!this._isShared || !this._rescc.private) &&
            // the Authorization header field does not appear in the request, if the cache is shared,
            (!this._isShared ||
                this._noAuthorization ||
                this._allowsStoringAuthenticated()) &&
            // the response either:
            // contains an Expires header field, or
            (this._resHeaders.expires ||
                // contains a max-age response directive, or
                // contains a s-maxage response directive and the cache is shared, or
                // contains a public response directive.
                this._rescc['max-age'] ||
                (this._isShared && this._rescc['s-maxage']) ||
                this._rescc.public ||
                // has a status code that is defined as cacheable by default
                statusCodeCacheableByDefault.has(this._status))
        );
    }

    _hasExplicitExpiration() {
        // 4.2.1 Calculating Freshness Lifetime
        return (
            (this._isShared && this._rescc['s-maxage']) ||
            this._rescc['max-age'] ||
            this._resHeaders.expires
        );
    }

    _assertRequestHasHeaders(req) {
        if (!req || !req.headers) {
            throw Error('Request headers missing');
        }
    }

    satisfiesWithoutRevalidation(req) {
        this._assertRequestHasHeaders(req);

        // When presented with a request, a cache MUST NOT reuse a stored response, unless:
        // the presented request does not contain the no-cache pragma (Section 5.4), nor the no-cache cache directive,
        // unless the stored response is successfully validated (Section 4.3), and
        const requestCC = parseCacheControl(req.headers['cache-control']);
        if (requestCC['no-cache'] || /no-cache/.test(req.headers.pragma)) {
            return false;
        }

        if (requestCC['max-age'] && this.age() > requestCC['max-age']) {
            return false;
        }

        if (
            requestCC['min-fresh'] &&
            this.timeToLive() < 1000 * requestCC['min-fresh']
        ) {
            return false;
        }

        // the stored response is either:
        // fresh, or allowed to be served stale
        if (this.stale()) {
            const allowsStale =
                requestCC['max-stale'] &&
                !this._rescc['must-revalidate'] &&
                (true === requestCC['max-stale'] ||
                    requestCC['max-stale'] > this.age() - this.maxAge());
            if (!allowsStale) {
                return false;
            }
        }

        return this._requestMatches(req, false);
    }

    _requestMatches(req, allowHeadMethod) {
        // The presented effective request URI and that of the stored response match, and
        return (
            (!this._url || this._url === req.url) &&
            this._host === req.headers.host &&
            // the request method associated with the stored response allows it to be used for the presented request, and
            (!req.method ||
                this._method === req.method ||
                (allowHeadMethod && 'HEAD' === req.method)) &&
            // selecting header fields nominated by the stored response (if any) match those presented, and
            this._varyMatches(req)
        );
    }

    _allowsStoringAuthenticated() {
        //  following Cache-Control response directives (Section 5.2.2) have such an effect: must-revalidate, public, and s-maxage.
        return (
            this._rescc['must-revalidate'] ||
            this._rescc.public ||
            this._rescc['s-maxage']
        );
    }

    _varyMatches(req) {
        if (!this._resHeaders.vary) {
            return true;
        }

        // A Vary header field-value of "*" always fails to match
        if (this._resHeaders.vary === '*') {
            return false;
        }

        const fields = this._resHeaders.vary
            .trim()
            .toLowerCase()
            .split(/\s*,\s*/);
        for (const name of fields) {
            if (req.headers[name] !== this._reqHeaders[name]) return false;
        }
        return true;
    }

    _copyWithoutHopByHopHeaders(inHeaders) {
        const headers = {};
        for (const name in inHeaders) {
            if (hopByHopHeaders[name]) continue;
            headers[name] = inHeaders[name];
        }
        // 9.1.  Connection
        if (inHeaders.connection) {
            const tokens = inHeaders.connection.trim().split(/\s*,\s*/);
            for (const name of tokens) {
                delete headers[name];
            }
        }
        if (headers.warning) {
            const warnings = headers.warning.split(/,/).filter(warning => {
                return !/^\s*1[0-9][0-9]/.test(warning);
            });
            if (!warnings.length) {
                delete headers.warning;
            } else {
                headers.warning = warnings.join(',').trim();
            }
        }
        return headers;
    }

    responseHeaders() {
        const headers = this._copyWithoutHopByHopHeaders(this._resHeaders);
        const age = this.age();

        // A cache SHOULD generate 113 warning if it heuristically chose a freshness
        // lifetime greater than 24 hours and the response's age is greater than 24 hours.
        if (
            age > 3600 * 24 &&
            !this._hasExplicitExpiration() &&
            this.maxAge() > 3600 * 24
        ) {
            headers.warning =
                (headers.warning ? `${headers.warning}, ` : '') +
                '113 - "rfc7234 5.5.4"';
        }
        headers.age = `${Math.round(age)}`;
        headers.date = new Date(this.now()).toUTCString();
        return headers;
    }

    /**
     * Value of the Date response header or current time if Date was invalid
     * @return timestamp
     */
    date() {
        const serverDate = Date.parse(this._resHeaders.date);
        if (isFinite(serverDate)) {
            return serverDate;
        }
        return this._responseTime;
    }

    /**
     * Value of the Age header, in seconds, updated for the current time.
     * May be fractional.
     *
     * @return Number
     */
    age() {
        let age = this._ageValue();

        const residentTime = (this.now() - this._responseTime) / 1000;
        return age + residentTime;
    }

    _ageValue() {
        return toNumberOrZero(this._resHeaders.age);
    }

    /**
     * Value of applicable max-age (or heuristic equivalent) in seconds. This counts since response's `Date`.
     *
     * For an up-to-date value, see `timeToLive()`.
     *
     * @return Number
     */
    maxAge() {
        if (!this.storable() || this._rescc['no-cache']) {
            return 0;
        }

        // Shared responses with cookies are cacheable according to the RFC, but IMHO it'd be unwise to do so by default
        // so this implementation requires explicit opt-in via public header
        if (
            this._isShared &&
            (this._resHeaders['set-cookie'] &&
                !this._rescc.public &&
                !this._rescc.immutable)
        ) {
            return 0;
        }

        if (this._resHeaders.vary === '*') {
            return 0;
        }

        if (this._isShared) {
            if (this._rescc['proxy-revalidate']) {
                return 0;
            }
            // if a response includes the s-maxage directive, a shared cache recipient MUST ignore the Expires field.
            if (this._rescc['s-maxage']) {
                return toNumberOrZero(this._rescc['s-maxage']);
            }
        }

        // If a response includes a Cache-Control field with the max-age directive, a recipient MUST ignore the Expires field.
        if (this._rescc['max-age']) {
            return toNumberOrZero(this._rescc['max-age']);
        }

        const defaultMinTtl = this._rescc.immutable ? this._immutableMinTtl : 0;

        const serverDate = this.date();
        if (this._resHeaders.expires) {
            const expires = Date.parse(this._resHeaders.expires);
            // A cache recipient MUST interpret invalid date formats, especially the value "0", as representing a time in the past (i.e., "already expired").
            if (Number.isNaN(expires) || expires < serverDate) {
                return 0;
            }
            return Math.max(defaultMinTtl, (expires - serverDate) / 1000);
        }

        if (this._resHeaders['last-modified']) {
            const lastModified = Date.parse(this._resHeaders['last-modified']);
            if (isFinite(lastModified) && serverDate > lastModified) {
                return Math.max(
                    defaultMinTtl,
                    ((serverDate - lastModified) / 1000) * this._cacheHeuristic
                );
            }
        }

        return defaultMinTtl;
    }

    timeToLive() {
        const age = this.maxAge() - this.age();
        const staleIfErrorAge = age + toNumberOrZero(this._rescc['stale-if-error']);
        const staleWhileRevalidateAge = age + toNumberOrZero(this._rescc['stale-while-revalidate']);
        return Math.max(0, age, staleIfErrorAge, staleWhileRevalidateAge) * 1000;
    }

    stale() {
        return this.maxAge() <= this.age();
    }

    _useStaleIfError() {
        return this.maxAge() + toNumberOrZero(this._rescc['stale-if-error']) > this.age();
    }

    useStaleWhileRevalidate() {
        return this.maxAge() + toNumberOrZero(this._rescc['stale-while-revalidate']) > this.age();
    }

    static fromObject(obj) {
        return new this(undefined, undefined, { _fromObject: obj });
    }

    _fromObject(obj) {
        if (this._responseTime) throw Error('Reinitialized');
        if (!obj || obj.v !== 1) throw Error('Invalid serialization');

        this._responseTime = obj.t;
        this._isShared = obj.sh;
        this._cacheHeuristic = obj.ch;
        this._immutableMinTtl =
            obj.imm !== undefined ? obj.imm : 24 * 3600 * 1000;
        this._status = obj.st;
        this._resHeaders = obj.resh;
        this._rescc = obj.rescc;
        this._method = obj.m;
        this._url = obj.u;
        this._host = obj.h;
        this._noAuthorization = obj.a;
        this._reqHeaders = obj.reqh;
        this._reqcc = obj.reqcc;
    }

    toObject() {
        return {
            v: 1,
            t: this._responseTime,
            sh: this._isShared,
            ch: this._cacheHeuristic,
            imm: this._immutableMinTtl,
            st: this._status,
            resh: this._resHeaders,
            rescc: this._rescc,
            m: this._method,
            u: this._url,
            h: this._host,
            a: this._noAuthorization,
            reqh: this._reqHeaders,
            reqcc: this._reqcc,
        };
    }

    /**
     * Headers for sending to the origin server to revalidate stale response.
     * Allows server to return 304 to allow reuse of the previous response.
     *
     * Hop by hop headers are always stripped.
     * Revalidation headers may be added or removed, depending on request.
     */
    revalidationHeaders(incomingReq) {
        this._assertRequestHasHeaders(incomingReq);
        const headers = this._copyWithoutHopByHopHeaders(incomingReq.headers);

        // This implementation does not understand range requests
        delete headers['if-range'];

        if (!this._requestMatches(incomingReq, true) || !this.storable()) {
            // revalidation allowed via HEAD
            // not for the same resource, or wasn't allowed to be cached anyway
            delete headers['if-none-match'];
            delete headers['if-modified-since'];
            return headers;
        }

        /* MUST send that entity-tag in any cache validation request (using If-Match or If-None-Match) if an entity-tag has been provided by the origin server. */
        if (this._resHeaders.etag) {
            headers['if-none-match'] = headers['if-none-match']
                ? `${headers['if-none-match']}, ${this._resHeaders.etag}`
                : this._resHeaders.etag;
        }

        // Clients MAY issue simple (non-subrange) GET requests with either weak validators or strong validators. Clients MUST NOT use weak validators in other forms of request.
        const forbidsWeakValidators =
            headers['accept-ranges'] ||
            headers['if-match'] ||
            headers['if-unmodified-since'] ||
            (this._method && this._method != 'GET');

        /* SHOULD send the Last-Modified value in non-subrange cache validation requests (using If-Modified-Since) if only a Last-Modified value has been provided by the origin server.
        Note: This implementation does not understand partial responses (206) */
        if (forbidsWeakValidators) {
            delete headers['if-modified-since'];

            if (headers['if-none-match']) {
                const etags = headers['if-none-match']
                    .split(/,/)
                    .filter(etag => {
                        return !/^\s*W\//.test(etag);
                    });
                if (!etags.length) {
                    delete headers['if-none-match'];
                } else {
                    headers['if-none-match'] = etags.join(',').trim();
                }
            }
        } else if (
            this._resHeaders['last-modified'] &&
            !headers['if-modified-since']
        ) {
            headers['if-modified-since'] = this._resHeaders['last-modified'];
        }

        return headers;
    }

    /**
     * Creates new CachePolicy with information combined from the previews response,
     * and the new revalidation response.
     *
     * Returns {policy, modified} where modified is a boolean indicating
     * whether the response body has been modified, and old cached body can't be used.
     *
     * @return {Object} {policy: CachePolicy, modified: Boolean}
     */
    revalidatedPolicy(request, response) {
        this._assertRequestHasHeaders(request);
        if(this._useStaleIfError() && isErrorResponse(response)) {  // I consider the revalidation request unsuccessful
          return {
            modified: false,
            matches: false,
            policy: this,
          };
        }
        if (!response || !response.headers) {
            throw Error('Response headers missing');
        }

        // These aren't going to be supported exactly, since one CachePolicy object
        // doesn't know about all the other cached objects.
        let matches = false;
        if (response.status !== undefined && response.status != 304) {
            matches = false;
        } else if (
            response.headers.etag &&
            !/^\s*W\//.test(response.headers.etag)
        ) {
            // "All of the stored responses with the same strong validator are selected.
            // If none of the stored responses contain the same strong validator,
            // then the cache MUST NOT use the new response to update any stored responses."
            matches =
                this._resHeaders.etag &&
                this._resHeaders.etag.replace(/^\s*W\//, '') ===
                    response.headers.etag;
        } else if (this._resHeaders.etag && response.headers.etag) {
            // "If the new response contains a weak validator and that validator corresponds
            // to one of the cache's stored responses,
            // then the most recent of those matching stored responses is selected for update."
            matches =
                this._resHeaders.etag.replace(/^\s*W\//, '') ===
                response.headers.etag.replace(/^\s*W\//, '');
        } else if (this._resHeaders['last-modified']) {
            matches =
                this._resHeaders['last-modified'] ===
                response.headers['last-modified'];
        } else {
            // If the new response does not include any form of validator (such as in the case where
            // a client generates an If-Modified-Since request from a source other than the Last-Modified
            // response header field), and there is only one stored response, and that stored response also
            // lacks a validator, then that stored response is selected for update.
            if (
                !this._resHeaders.etag &&
                !this._resHeaders['last-modified'] &&
                !response.headers.etag &&
                !response.headers['last-modified']
            ) {
                matches = true;
            }
        }

        if (!matches) {
            return {
                policy: new this.constructor(request, response),
                // Client receiving 304 without body, even if it's invalid/mismatched has no option
                // but to reuse a cached body. We don't have a good way to tell clients to do
                // error recovery in such case.
                modified: response.status != 304,
                matches: false,
            };
        }

        // use other header fields provided in the 304 (Not Modified) response to replace all instances
        // of the corresponding header fields in the stored response.
        const headers = {};
        for (const k in this._resHeaders) {
            headers[k] =
                k in response.headers && !excludedFromRevalidationUpdate[k]
                    ? response.headers[k]
                    : this._resHeaders[k];
        }

        const newResponse = Object.assign({}, response, {
            status: this._status,
            method: this._method,
            headers,
        });
        return {
            policy: new this.constructor(request, newResponse, {
                shared: this._isShared,
                cacheHeuristic: this._cacheHeuristic,
                immutableMinTimeToLive: this._immutableMinTtl,
            }),
            modified: false,
            matches: true,
        };
    }
};
{
  "author": {
    "name": "Kornel LesiÅ„ski",
    "email": "kornel@geekhood.net",
    "url": "https://kornel.ski/"
  },
  "deprecated": false,
  "description": "Parses Cache-Control and other headers. Helps building correct HTTP caches and proxies",
  "devDependencies": {
    "eslint": "^5.13.0",
    "eslint-plugin-prettier": "^3.0.1",
    "husky": "^0.14.3",
    "lint-staged": "^8.1.3",
    "mocha": "^5.1.0",
    "prettier": "^1.14.3",
    "prettier-eslint-cli": "^4.7.1"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/kornelski/http-cache-semantics#readme",
  "license": "BSD-2-Clause",
  "main": "index.js",
  "name": "http-cache-semantics",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/kornelski/http-cache-semantics.git"
  },
  "version": "4.1.0"
}((nil . ((indent-tabs-mode . nil)
         (tab-width . 8)
         (fill-column . 80)))
 (js-mode . ((js-indent-level . 2)
             (indent-tabs-mode . nil)
             )))# node-http-signature changelog

## 1.1.1

- Version of dependency `assert-plus` updated: old version was missing
  some license information
- Corrected examples in `http_signing.md`, added auto-tests to
  automatically validate these examples

## 1.1.0

- Bump version of `sshpk` dependency, remove peerDependency on it since
  it now supports exchanging objects between multiple versions of itself
  where possible

## 1.0.2

- Bump min version of `jsprim` dependency, to include fixes for using
  http-signature with `browserify`

## 1.0.1

- Bump minimum version of `sshpk` dependency, to include fixes for
  whitespace tolerance in key parsing.

## 1.0.0

- First semver release.
- #36: Ensure verifySignature does not leak useful timing information
- #42: Bring the library up to the latest version of the spec (including the 
       request-target changes)
- Support for ECDSA keys and signatures.
- Now uses `sshpk` for key parsing, validation and conversion.
- Fixes for #21, #47, #39 and compatibility with node 0.8

## 0.11.0

- Split up HMAC and Signature verification to avoid vulnerabilities where a
  key intended for use with one can be validated against the other method
  instead.

## 0.10.2

- Updated versions of most dependencies.
- Utility functions exported for PEM => SSH-RSA conversion.
- Improvements to tests and examples.
Copyright Joyent, Inc. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
# Abstract

This document describes a way to add origin authentication, message integrity,
and replay resistance to HTTP REST requests.  It is intended to be used over
the HTTPS protocol.

# Copyright Notice

Copyright (c) 2011 Joyent, Inc. and the persons identified as document authors.
All rights reserved.

Code Components extracted from this document must include MIT License text.

# Introduction

This protocol is intended to provide a standard way for clients to sign HTTP
requests.  RFC2617 (HTTP Authentication) defines Basic and Digest authentication
mechanisms, and RFC5246 (TLS 1.2) defines client-auth, both of which are widely
employed on the Internet today.  However, it is common place that the burdens of
PKI prevent web service operators from deploying that methodology, and so many
fall back to Basic authentication, which has poor security characteristics.

Additionally, OAuth provides a fully-specified alternative for authorization
of web service requests, but is not (always) ideal for machine to machine
communication, as the key acquisition steps (generally) imply a fixed
infrastructure that may not make sense to a service provider (e.g., symmetric
keys).

Several web service providers have invented their own schemes for signing
HTTP requests, but to date, none have been placed in the public domain as a
standard.  This document serves that purpose.  There are no techniques in this
proposal that are novel beyond previous art, however, this aims to be a simple
mechanism for signing these requests.

# Signature Authentication Scheme

The "signature" authentication scheme is based on the model that the client must
authenticate itself with a digital signature produced by either a private
asymmetric key (e.g., RSA) or a shared symmetric key (e.g., HMAC).  The scheme
is parameterized enough such that it is not bound to any particular key type or
signing algorithm.  However, it does explicitly assume that clients can send an
HTTP `Date` header.

## Authorization Header

The client is expected to send an Authorization header (as defined in RFC 2617)
with the following parameterization:

    credentials := "Signature" params
    params := 1#(keyId | algorithm | [headers] | [ext] | signature)
    digitalSignature := plain-string

    keyId := "keyId" "=" <"> plain-string <">
    algorithm := "algorithm" "=" <"> plain-string <">
    headers := "headers" "=" <"> 1#headers-value <">
    ext := "ext" "=" <"> plain-string <">
    signature := "signature" "=" <"> plain-string <">

    headers-value := plain-string
    plain-string   = 1*( %x20-21 / %x23-5B / %x5D-7E )

### Signature Parameters

#### keyId

REQUIRED.  The `keyId` field is an opaque string that the server can use to look
up the component they need to validate the signature.  It could be an SSH key
fingerprint, an LDAP DN, etc.  Management of keys and assignment of `keyId` is
out of scope for this document.

#### algorithm

REQUIRED. The `algorithm` parameter is used if the client and server agree on a
non-standard digital signature algorithm.  The full list of supported signature
mechanisms is listed below.

#### headers

OPTIONAL.  The `headers` parameter is used to specify the list of HTTP headers
used to sign the request.  If specified, it should be a quoted list of HTTP
header names, separated by a single space character.  By default, only one
HTTP header is signed, which is the `Date` header.  Note that the list MUST be
specified in the order the values are concatenated together during signing. To
include the HTTP request line in the signature calculation, use the special
`request-line` value.  While this is overloading the definition of `headers` in
HTTP linguism, the request-line is defined in RFC 2616, and as the outlier from
headers in useful signature calculation, it is deemed simpler to simply use
`request-line` than to add a separate parameter for it.

#### extensions

OPTIONAL.  The `extensions` parameter is used to include additional information
which is covered by the request.  The content and format of the string is out of
scope for this document, and expected to be specified by implementors.

#### signature

REQUIRED.  The `signature` parameter is a `Base64` encoded digital signature
generated by the client. The client uses the `algorithm` and `headers` request
parameters to form a canonicalized `signing string`.  This `signing string` is
then signed with the key associated with `keyId` and the algorithm
corresponding to `algorithm`.  The `signature` parameter is then set to the
`Base64` encoding of the signature.

### Signing String Composition

In order to generate the string that is signed with a key, the client MUST take
the values of each HTTP header specified by `headers` in the order they appear.

1. If the header name is not `request-line` then append the lowercased header
   name followed with an ASCII colon `:` and an ASCII space ` `.
2. If the header name is `request-line` then append the HTTP request line,
   otherwise append the header value.
3. If value is not the last value then append an ASCII newline `\n`. The string
   MUST NOT include a trailing ASCII newline.

# Example Requests

All requests refer to the following request (body omitted):

    POST /foo HTTP/1.1
    Host: example.org
    Date: Tue, 07 Jun 2014 20:51:35 GMT
    Content-Type: application/json
    Digest: SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
    Content-Length: 18

The "rsa-key-1" keyId refers to a private key known to the client and a public
key known to the server. The "hmac-key-1" keyId refers to key known to the
client and server.

## Default parameterization

The authorization header and signature would be generated as:

    Authorization: Signature keyId="rsa-key-1",algorithm="rsa-sha256",signature="Base64(RSA-SHA256(signing string))"

The client would compose the signing string as:

    date: Tue, 07 Jun 2014 20:51:35 GMT

## Header List

The authorization header and signature would be generated as:

    Authorization: Signature keyId="rsa-key-1",algorithm="rsa-sha256",headers="(request-target) date content-type digest",signature="Base64(RSA-SHA256(signing string))"

The client would compose the signing string as (`+ "\n"` inserted for
readability):

    (request-target) post /foo + "\n"
    date: Tue, 07 Jun 2011 20:51:35 GMT + "\n"
    content-type: application/json + "\n"
    digest: SHA-256=Base64(SHA256(Body))

## Algorithm

The authorization header and signature would be generated as:

    Authorization: Signature keyId="hmac-key-1",algorithm="hmac-sha1",signature="Base64(HMAC-SHA1(signing string))"

The client would compose the signing string as:

    date: Tue, 07 Jun 2011 20:51:35 GMT

# Signing Algorithms

Currently supported algorithm names are:

* rsa-sha1
* rsa-sha256
* rsa-sha512
* dsa-sha1
* hmac-sha1
* hmac-sha256
* hmac-sha512

# Security Considerations

## Default Parameters

Note the default parameterization of the `Signature` scheme is only safe if all
requests are carried over a secure transport (i.e., TLS).  Sending the default
scheme over a non-secure transport will leave the request vulnerable to
spoofing, tampering, replay/repudiation, and integrity violations (if using the
STRIDE threat-modeling methodology).

## Insecure Transports

If sending the request over plain HTTP, service providers SHOULD require clients
to sign ALL HTTP headers, and the `request-line`.  Additionally, service
providers SHOULD require `Content-MD5` calculations to be performed to ensure
against any tampering from clients.

## Nonces

Nonces are out of scope for this document simply because many service providers
fail to implement them correctly, or do not adopt security specifications
because of the infrastructure complexity.  Given the `header` parameterization,
a service provider is fully enabled to add nonce semantics into this scheme by
using something like an `x-request-nonce` header, and ensuring it is signed
with the `Date` header.

## Clock Skew

As the default scheme is to sign the `Date` header, service providers SHOULD
protect against logged replay attacks by enforcing a clock skew.  The server
SHOULD be synchronized with NTP, and the recommendation in this specification
is to allow 300s of clock skew (in either direction).

## Required Headers to Sign

It is out of scope for this document to dictate what headers a service provider
will want to enforce, but service providers SHOULD at minimum include the
`Date` header.

# References

## Normative References

* [RFC2616] Hypertext Transfer Protocol -- HTTP/1.1
* [RFC2617] HTTP Authentication: Basic and Digest Access Authentication
* [RFC5246] The Transport Layer Security (TLS) Protocol Version 1.2

## Informative References

    Name: Mark Cavage (editor)
    Company: Joyent, Inc.
    Email: mark.cavage@joyent.com
    URI: http://www.joyent.com

# Appendix A - Test Values

The following test data uses the RSA (1024b) keys, which we will refer
to as `keyId=Test` in the following samples:

    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCFENGw33yGihy92pDjZQhl0C3
    6rPJj+CvfSC8+q28hxA161QFNUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6
    Z4UMR7EOcpfdUE9Hf3m/hs+FUR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJw
    oYi+1hqp1fIekaxsyQIDAQAB
    -----END PUBLIC KEY-----

    -----BEGIN RSA PRIVATE KEY-----
    MIICXgIBAAKBgQDCFENGw33yGihy92pDjZQhl0C36rPJj+CvfSC8+q28hxA161QF
    NUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6Z4UMR7EOcpfdUE9Hf3m/hs+F
    UR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJwoYi+1hqp1fIekaxsyQIDAQAB
    AoGBAJR8ZkCUvx5kzv+utdl7T5MnordT1TvoXXJGXK7ZZ+UuvMNUCdN2QPc4sBiA
    QWvLw1cSKt5DsKZ8UETpYPy8pPYnnDEz2dDYiaew9+xEpubyeW2oH4Zx71wqBtOK
    kqwrXa/pzdpiucRRjk6vE6YY7EBBs/g7uanVpGibOVAEsqH1AkEA7DkjVH28WDUg
    f1nqvfn2Kj6CT7nIcE3jGJsZZ7zlZmBmHFDONMLUrXR/Zm3pR5m0tCmBqa5RK95u
    412jt1dPIwJBANJT3v8pnkth48bQo/fKel6uEYyboRtA5/uHuHkZ6FQF7OUkGogc
    mSJluOdc5t6hI1VsLn0QZEjQZMEOWr+wKSMCQQCC4kXJEsHAve77oP6HtG/IiEn7
    kpyUXRNvFsDE0czpJJBvL/aRFUJxuRK91jhjC68sA7NsKMGg5OXb5I5Jj36xAkEA
    gIT7aFOYBFwGgQAQkWNKLvySgKbAZRTeLBacpHMuQdl1DfdntvAyqpAZ0lY0RKmW
    G6aFKaqQfOXKCyWoUiVknQJAXrlgySFci/2ueKlIE1QqIiLSZ8V8OlpFLRnb1pzI
    7U1yQXnTAEFYM560yJlzUpOb1V4cScGd365tiSMvxLOvTA==
    -----END RSA PRIVATE KEY-----

And all examples use this request:

<!-- httpreq -->

    POST /foo?param=value&pet=dog HTTP/1.1
    Host: example.com
    Date: Thu, 05 Jan 2014 21:31:40 GMT
    Content-Type: application/json
    Digest: SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
    Content-Length: 18

    {"hello": "world"}

<!-- /httpreq -->

### Default

The string to sign would be:

<!-- sign {"name": "Default", "options": {"keyId":"Test", "algorithm": "rsa-sha256"}} -->
<!-- signstring -->

    date: Thu, 05 Jan 2014 21:31:40 GMT

<!-- /signstring -->

The Authorization header would be:

<!-- authz -->

    Authorization: Signature keyId="Test",algorithm="rsa-sha256",headers="date",signature="jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9HpFQlG7N4YcJPteKTu4MWCLyk+gIr0wDgqtLWf9NLpMAMimdfsH7FSWGfbMFSrsVTHNTk0rK3usrfFnti1dxsM4jl0kYJCKTGI/UWkqiaxwNiKqGcdlEDrTcUhhsFsOIo8VhddmZTZ8w="

<!-- /authz -->

### All Headers

Parameterized to include all headers, the string to sign would be (`+ "\n"`
inserted for readability):

<!-- sign {"name": "All Headers", "options": {"keyId":"Test", "algorithm": "rsa-sha256", "headers": ["(request-target)", "host", "date", "content-type", "digest", "content-length"]}} -->
<!-- signstring -->

    (request-target): post /foo?param=value&pet=dog
    host: example.com
    date: Thu, 05 Jan 2014 21:31:40 GMT
    content-type: application/json
    digest: SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
    content-length: 18

<!-- /signstring -->

The Authorization header would be:

<!-- authz -->

    Authorization: Signature keyId="Test",algorithm="rsa-sha256",headers="(request-target) host date content-type digest content-length",signature="Ef7MlxLXoBovhil3AlyjtBwAL9g4TN3tibLj7uuNB3CROat/9KaeQ4hW2NiJ+pZ6HQEOx9vYZAyi+7cmIkmJszJCut5kQLAwuX+Ms/mUFvpKlSo9StS2bMXDBNjOh4Auj774GFj4gwjS+3NhFeoqyr/MuN6HsEnkvn6zdgfE2i0="

<!-- /authz -->

## Generating and verifying signatures using `openssl`

The `openssl` commandline tool can be used to generate or verify the signatures listed above.

Compose the signing string as usual, and pipe it into the the `openssl dgst` command, then into `openssl enc -base64`, as follows:

    $ printf 'date: Thu, 05 Jan 2014 21:31:40 GMT' | \
      openssl dgst -binary -sign /path/to/private.pem -sha256 | \
      openssl enc -base64
    jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9Hp...
    $

The `-sha256` option is necessary to produce an `rsa-sha256` signature. You can select other hash algorithms such as `sha1` by changing this argument.

To verify a signature, first save the signature data, Base64-decoded, into a file, then use `openssl dgst` again with the `-verify` option:

    $ echo 'jKyvPcxB4JbmYY4mByy...' | openssl enc -A -d -base64 > signature
    $ printf 'date: Thu, 05 Jan 2014 21:31:40 GMT' | \
      openssl dgst -sha256 -verify /path/to/public.pem -signature ./signature
    Verified OK
    $

## Generating and verifying signatures using `sshpk-sign`

You can also generate and check signatures using the `sshpk-sign` tool which is
included with the `sshpk` package in `npm`.

Compose the signing string as above, and pipe it into `sshpk-sign` as follows:

    $ printf 'date: Thu, 05 Jan 2014 21:31:40 GMT' | \
      sshpk-sign -i /path/to/private.pem
    jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9Hp...
    $

This will produce an `rsa-sha256` signature by default, as you can see using
the `-v` option:

    sshpk-sign: using rsa-sha256 with a 1024 bit key

You can also use `sshpk-verify` in a similar manner:

    $ printf 'date: Thu, 05 Jan 2014 21:31:40 GMT' | \
      sshpk-verify -i ./public.pem -s 'jKyvPcxB4JbmYY...'
    OK
    $
{
  "author": {
    "name": "Joyent, Inc"
  },
  "dependencies": {
    "assert-plus": "^1.0.0",
    "jsprim": "^1.2.2",
    "sshpk": "^1.7.0"
  },
  "deprecated": false,
  "description": "Reference implementation of Joyent's HTTP Signature scheme.",
  "devDependencies": {
    "tap": "0.4.2",
    "uuid": "^2.0.2"
  },
  "engines": {
    "node": ">=0.8",
    "npm": ">=1.3.7"
  },
  "homepage": "https://github.com/joyent/node-http-signature/",
  "license": "MIT",
  "main": "lib/index.js",
  "name": "http-signature",
  "repository": {
    "type": "git",
    "url": "git://github.com/joyent/node-http-signature.git"
  },
  "version": "1.2.0"
}// Copyright 2015 Joyent, Inc.

var parser = require('./parser');
var signer = require('./signer');
var verify = require('./verify');
var utils = require('./utils');



///--- API

module.exports = {

  parse: parser.parseRequest,
  parseRequest: parser.parseRequest,

  sign: signer.signRequest,
  signRequest: signer.signRequest,
  createSigner: signer.createSigner,
  isSigner: signer.isSigner,

  sshKeyToPEM: utils.sshKeyToPEM,
  sshKeyFingerprint: utils.fingerprint,
  pemToRsaSSHKey: utils.pemToRsaSSHKey,

  verify: verify.verifySignature,
  verifySignature: verify.verifySignature,
  verifyHMAC: verify.verifyHMAC
};
// Copyright 2012 Joyent, Inc.  All rights reserved.

var assert = require('assert-plus');
var util = require('util');
var utils = require('./utils');



///--- Globals

var HASH_ALGOS = utils.HASH_ALGOS;
var PK_ALGOS = utils.PK_ALGOS;
var HttpSignatureError = utils.HttpSignatureError;
var InvalidAlgorithmError = utils.InvalidAlgorithmError;
var validateAlgorithm = utils.validateAlgorithm;

var State = {
  New: 0,
  Params: 1
};

var ParamsState = {
  Name: 0,
  Quote: 1,
  Value: 2,
  Comma: 3
};


///--- Specific Errors


function ExpiredRequestError(message) {
  HttpSignatureError.call(this, message, ExpiredRequestError);
}
util.inherits(ExpiredRequestError, HttpSignatureError);


function InvalidHeaderError(message) {
  HttpSignatureError.call(this, message, InvalidHeaderError);
}
util.inherits(InvalidHeaderError, HttpSignatureError);


function InvalidParamsError(message) {
  HttpSignatureError.call(this, message, InvalidParamsError);
}
util.inherits(InvalidParamsError, HttpSignatureError);


function MissingHeaderError(message) {
  HttpSignatureError.call(this, message, MissingHeaderError);
}
util.inherits(MissingHeaderError, HttpSignatureError);

function StrictParsingError(message) {
  HttpSignatureError.call(this, message, StrictParsingError);
}
util.inherits(StrictParsingError, HttpSignatureError);

///--- Exported API

module.exports = {

  /**
   * Parses the 'Authorization' header out of an http.ServerRequest object.
   *
   * Note that this API will fully validate the Authorization header, and throw
   * on any error.  It will not however check the signature, or the keyId format
   * as those are specific to your environment.  You can use the options object
   * to pass in extra constraints.
   *
   * As a response object you can expect this:
   *
   *     {
   *       "scheme": "Signature",
   *       "params": {
   *         "keyId": "foo",
   *         "algorithm": "rsa-sha256",
   *         "headers": [
   *           "date" or "x-date",
   *           "digest"
   *         ],
   *         "signature": "base64"
   *       },
   *       "signingString": "ready to be passed to crypto.verify()"
   *     }
   *
   * @param {Object} request an http.ServerRequest.
   * @param {Object} options an optional options object with:
   *                   - clockSkew: allowed clock skew in seconds (default 300).
   *                   - headers: required header names (def: date or x-date)
   *                   - algorithms: algorithms to support (default: all).
   *                   - strict: should enforce latest spec parsing
   *                             (default: false).
   * @return {Object} parsed out object (see above).
   * @throws {TypeError} on invalid input.
   * @throws {InvalidHeaderError} on an invalid Authorization header error.
   * @throws {InvalidParamsError} if the params in the scheme are invalid.
   * @throws {MissingHeaderError} if the params indicate a header not present,
   *                              either in the request headers from the params,
   *                              or not in the params from a required header
   *                              in options.
   * @throws {StrictParsingError} if old attributes are used in strict parsing
   *                              mode.
   * @throws {ExpiredRequestError} if the value of date or x-date exceeds skew.
   */
  parseRequest: function parseRequest(request, options) {
    assert.object(request, 'request');
    assert.object(request.headers, 'request.headers');
    if (options === undefined) {
      options = {};
    }
    if (options.headers === undefined) {
      options.headers = [request.headers['x-date'] ? 'x-date' : 'date'];
    }
    assert.object(options, 'options');
    assert.arrayOfString(options.headers, 'options.headers');
    assert.optionalFinite(options.clockSkew, 'options.clockSkew');

    var authzHeaderName = options.authorizationHeaderName || 'authorization';

    if (!request.headers[authzHeaderName]) {
      throw new MissingHeaderError('no ' + authzHeaderName + ' header ' +
                                   'present in the request');
    }

    options.clockSkew = options.clockSkew || 300;


    var i = 0;
    var state = State.New;
    var substate = ParamsState.Name;
    var tmpName = '';
    var tmpValue = '';

    var parsed = {
      scheme: '',
      params: {},
      signingString: ''
    };

    var authz = request.headers[authzHeaderName];
    for (i = 0; i < authz.length; i++) {
      var c = authz.charAt(i);

      switch (Number(state)) {

      case State.New:
        if (c !== ' ') parsed.scheme += c;
        else state = State.Params;
        break;

      case State.Params:
        switch (Number(substate)) {

        case ParamsState.Name:
          var code = c.charCodeAt(0);
          // restricted name of A-Z / a-z
          if ((code >= 0x41 && code <= 0x5a) || // A-Z
              (code >= 0x61 && code <= 0x7a)) { // a-z
            tmpName += c;
          } else if (c === '=') {
            if (tmpName.length === 0)
              throw new InvalidHeaderError('bad param format');
            substate = ParamsState.Quote;
          } else {
            throw new InvalidHeaderError('bad param format');
          }
          break;

        case ParamsState.Quote:
          if (c === '"') {
            tmpValue = '';
            substate = ParamsState.Value;
          } else {
            throw new InvalidHeaderError('bad param format');
          }
          break;

        case ParamsState.Value:
          if (c === '"') {
            parsed.params[tmpName] = tmpValue;
            substate = ParamsState.Comma;
          } else {
            tmpValue += c;
          }
          break;

        case ParamsState.Comma:
          if (c === ',') {
            tmpName = '';
            substate = ParamsState.Name;
          } else {
            throw new InvalidHeaderError('bad param format');
          }
          break;

        default:
          throw new Error('Invalid substate');
        }
        break;

      default:
        throw new Error('Invalid substate');
      }

    }

    if (!parsed.params.headers || parsed.params.headers === '') {
      if (request.headers['x-date']) {
        parsed.params.headers = ['x-date'];
      } else {
        parsed.params.headers = ['date'];
      }
    } else {
      parsed.params.headers = parsed.params.headers.split(' ');
    }

    // Minimally validate the parsed object
    if (!parsed.scheme || parsed.scheme !== 'Signature')
      throw new InvalidHeaderError('scheme was not "Signature"');

    if (!parsed.params.keyId)
      throw new InvalidHeaderError('keyId was not specified');

    if (!parsed.params.algorithm)
      throw new InvalidHeaderError('algorithm was not specified');

    if (!parsed.params.signature)
      throw new InvalidHeaderError('signature was not specified');

    // Check the algorithm against the official list
    parsed.params.algorithm = parsed.params.algorithm.toLowerCase();
    try {
      validateAlgorithm(parsed.params.algorithm);
    } catch (e) {
      if (e instanceof InvalidAlgorithmError)
        throw (new InvalidParamsError(parsed.params.algorithm + ' is not ' +
          'supported'));
      else
        throw (e);
    }

    // Build the signingString
    for (i = 0; i < parsed.params.headers.length; i++) {
      var h = parsed.params.headers[i].toLowerCase();
      parsed.params.headers[i] = h;

      if (h === 'request-line') {
        if (!options.strict) {
          /*
           * We allow headers from the older spec drafts if strict parsing isn't
           * specified in options.
           */
          parsed.signingString +=
            request.method + ' ' + request.url + ' HTTP/' + request.httpVersion;
        } else {
          /* Strict parsing doesn't allow older draft headers. */
          throw (new StrictParsingError('request-line is not a valid header ' +
            'with strict parsing enabled.'));
        }
      } else if (h === '(request-target)') {
        parsed.signingString +=
          '(request-target): ' + request.method.toLowerCase() + ' ' +
          request.url;
      } else {
        var value = request.headers[h];
        if (value === undefined)
          throw new MissingHeaderError(h + ' was not in the request');
        parsed.signingString += h + ': ' + value;
      }

      if ((i + 1) < parsed.params.headers.length)
        parsed.signingString += '\n';
    }

    // Check against the constraints
    var date;
    if (request.headers.date || request.headers['x-date']) {
        if (request.headers['x-date']) {
          date = new Date(request.headers['x-date']);
        } else {
          date = new Date(request.headers.date);
        }
      var now = new Date();
      var skew = Math.abs(now.getTime() - date.getTime());

      if (skew > options.clockSkew * 1000) {
        throw new ExpiredRequestError('clock skew of ' +
                                      (skew / 1000) +
                                      's was greater than ' +
                                      options.clockSkew + 's');
      }
    }

    options.headers.forEach(function (hdr) {
      // Remember that we already checked any headers in the params
      // were in the request, so if this passes we're good.
      if (parsed.params.headers.indexOf(hdr.toLowerCase()) < 0)
        throw new MissingHeaderError(hdr + ' was not a signed header');
    });

    if (options.algorithms) {
      if (options.algorithms.indexOf(parsed.params.algorithm) === -1)
        throw new InvalidParamsError(parsed.params.algorithm +
                                     ' is not a supported algorithm');
    }

    parsed.algorithm = parsed.params.algorithm.toUpperCase();
    parsed.keyId = parsed.params.keyId;
    return parsed;
  }

};
// Copyright 2012 Joyent, Inc.  All rights reserved.

var assert = require('assert-plus');
var crypto = require('crypto');
var http = require('http');
var util = require('util');
var sshpk = require('sshpk');
var jsprim = require('jsprim');
var utils = require('./utils');

var sprintf = require('util').format;

var HASH_ALGOS = utils.HASH_ALGOS;
var PK_ALGOS = utils.PK_ALGOS;
var InvalidAlgorithmError = utils.InvalidAlgorithmError;
var HttpSignatureError = utils.HttpSignatureError;
var validateAlgorithm = utils.validateAlgorithm;

///--- Globals

var AUTHZ_FMT =
  'Signature keyId="%s",algorithm="%s",headers="%s",signature="%s"';

///--- Specific Errors

function MissingHeaderError(message) {
  HttpSignatureError.call(this, message, MissingHeaderError);
}
util.inherits(MissingHeaderError, HttpSignatureError);

function StrictParsingError(message) {
  HttpSignatureError.call(this, message, StrictParsingError);
}
util.inherits(StrictParsingError, HttpSignatureError);

/* See createSigner() */
function RequestSigner(options) {
  assert.object(options, 'options');

  var alg = [];
  if (options.algorithm !== undefined) {
    assert.string(options.algorithm, 'options.algorithm');
    alg = validateAlgorithm(options.algorithm);
  }
  this.rs_alg = alg;

  /*
   * RequestSigners come in two varieties: ones with an rs_signFunc, and ones
   * with an rs_signer.
   *
   * rs_signFunc-based RequestSigners have to build up their entire signing
   * string within the rs_lines array and give it to rs_signFunc as a single
   * concat'd blob. rs_signer-based RequestSigners can add a line at a time to
   * their signing state by using rs_signer.update(), thus only needing to
   * buffer the hash function state and one line at a time.
   */
  if (options.sign !== undefined) {
    assert.func(options.sign, 'options.sign');
    this.rs_signFunc = options.sign;

  } else if (alg[0] === 'hmac' && options.key !== undefined) {
    assert.string(options.keyId, 'options.keyId');
    this.rs_keyId = options.keyId;

    if (typeof (options.key) !== 'string' && !Buffer.isBuffer(options.key))
      throw (new TypeError('options.key for HMAC must be a string or Buffer'));

    /*
     * Make an rs_signer for HMACs, not a rs_signFunc -- HMACs digest their
     * data in chunks rather than requiring it all to be given in one go
     * at the end, so they are more similar to signers than signFuncs.
     */
    this.rs_signer = crypto.createHmac(alg[1].toUpperCase(), options.key);
    this.rs_signer.sign = function () {
      var digest = this.digest('base64');
      return ({
        hashAlgorithm: alg[1],
        toString: function () { return (digest); }
      });
    };

  } else if (options.key !== undefined) {
    var key = options.key;
    if (typeof (key) === 'string' || Buffer.isBuffer(key))
      key = sshpk.parsePrivateKey(key);

    assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]),
      'options.key must be a sshpk.PrivateKey');
    this.rs_key = key;

    assert.string(options.keyId, 'options.keyId');
    this.rs_keyId = options.keyId;

    if (!PK_ALGOS[key.type]) {
      throw (new InvalidAlgorithmError(key.type.toUpperCase() + ' type ' +
        'keys are not supported'));
    }

    if (alg[0] !== undefined && key.type !== alg[0]) {
      throw (new InvalidAlgorithmError('options.key must be a ' +
        alg[0].toUpperCase() + ' key, was given a ' +
        key.type.toUpperCase() + ' key instead'));
    }

    this.rs_signer = key.createSign(alg[1]);

  } else {
    throw (new TypeError('options.sign (func) or options.key is required'));
  }

  this.rs_headers = [];
  this.rs_lines = [];
}

/**
 * Adds a header to be signed, with its value, into this signer.
 *
 * @param {String} header
 * @param {String} value
 * @return {String} value written
 */
RequestSigner.prototype.writeHeader = function (header, value) {
  assert.string(header, 'header');
  header = header.toLowerCase();
  assert.string(value, 'value');

  this.rs_headers.push(header);

  if (this.rs_signFunc) {
    this.rs_lines.push(header + ': ' + value);

  } else {
    var line = header + ': ' + value;
    if (this.rs_headers.length > 0)
      line = '\n' + line;
    this.rs_signer.update(line);
  }

  return (value);
};

/**
 * Adds a default Date header, returning its value.
 *
 * @return {String}
 */
RequestSigner.prototype.writeDateHeader = function () {
  return (this.writeHeader('date', jsprim.rfc1123(new Date())));
};

/**
 * Adds the request target line to be signed.
 *
 * @param {String} method, HTTP method (e.g. 'get', 'post', 'put')
 * @param {String} path
 */
RequestSigner.prototype.writeTarget = function (method, path) {
  assert.string(method, 'method');
  assert.string(path, 'path');
  method = method.toLowerCase();
  this.writeHeader('(request-target)', method + ' ' + path);
};

/**
 * Calculate the value for the Authorization header on this request
 * asynchronously.
 *
 * @param {Func} callback (err, authz)
 */
RequestSigner.prototype.sign = function (cb) {
  assert.func(cb, 'callback');

  if (this.rs_headers.length < 1)
    throw (new Error('At least one header must be signed'));

  var alg, authz;
  if (this.rs_signFunc) {
    var data = this.rs_lines.join('\n');
    var self = this;
    this.rs_signFunc(data, function (err, sig) {
      if (err) {
        cb(err);
        return;
      }
      try {
        assert.object(sig, 'signature');
        assert.string(sig.keyId, 'signature.keyId');
        assert.string(sig.algorithm, 'signature.algorithm');
        assert.string(sig.signature, 'signature.signature');
        alg = validateAlgorithm(sig.algorithm);

        authz = sprintf(AUTHZ_FMT,
          sig.keyId,
          sig.algorithm,
          self.rs_headers.join(' '),
          sig.signature);
      } catch (e) {
        cb(e);
        return;
      }
      cb(null, authz);
    });

  } else {
    try {
      var sigObj = this.rs_signer.sign();
    } catch (e) {
      cb(e);
      return;
    }
    alg = (this.rs_alg[0] || this.rs_key.type) + '-' + sigObj.hashAlgorithm;
    var signature = sigObj.toString();
    authz = sprintf(AUTHZ_FMT,
      this.rs_keyId,
      alg,
      this.rs_headers.join(' '),
      signature);
    cb(null, authz);
  }
};

///--- Exported API

module.exports = {
  /**
   * Identifies whether a given object is a request signer or not.
   *
   * @param {Object} object, the object to identify
   * @returns {Boolean}
   */
  isSigner: function (obj) {
    if (typeof (obj) === 'object' && obj instanceof RequestSigner)
      return (true);
    return (false);
  },

  /**
   * Creates a request signer, used to asynchronously build a signature
   * for a request (does not have to be an http.ClientRequest).
   *
   * @param {Object} options, either:
   *                   - {String} keyId
   *                   - {String|Buffer} key
   *                   - {String} algorithm (optional, required for HMAC)
   *                 or:
   *                   - {Func} sign (data, cb)
   * @return {RequestSigner}
   */
  createSigner: function createSigner(options) {
    return (new RequestSigner(options));
  },

  /**
   * Adds an 'Authorization' header to an http.ClientRequest object.
   *
   * Note that this API will add a Date header if it's not already set. Any
   * other headers in the options.headers array MUST be present, or this
   * will throw.
   *
   * You shouldn't need to check the return type; it's just there if you want
   * to be pedantic.
   *
   * The optional flag indicates whether parsing should use strict enforcement
   * of the version draft-cavage-http-signatures-04 of the spec or beyond.
   * The default is to be loose and support
   * older versions for compatibility.
   *
   * @param {Object} request an instance of http.ClientRequest.
   * @param {Object} options signing parameters object:
   *                   - {String} keyId required.
   *                   - {String} key required (either a PEM or HMAC key).
   *                   - {Array} headers optional; defaults to ['date'].
   *                   - {String} algorithm optional (unless key is HMAC);
   *                              default is the same as the sshpk default
   *                              signing algorithm for the type of key given
   *                   - {String} httpVersion optional; defaults to '1.1'.
   *                   - {Boolean} strict optional; defaults to 'false'.
   * @return {Boolean} true if Authorization (and optionally Date) were added.
   * @throws {TypeError} on bad parameter types (input).
   * @throws {InvalidAlgorithmError} if algorithm was bad or incompatible with
   *                                 the given key.
   * @throws {sshpk.KeyParseError} if key was bad.
   * @throws {MissingHeaderError} if a header to be signed was specified but
   *                              was not present.
   */
  signRequest: function signRequest(request, options) {
    assert.object(request, 'request');
    assert.object(options, 'options');
    assert.optionalString(options.algorithm, 'options.algorithm');
    assert.string(options.keyId, 'options.keyId');
    assert.optionalArrayOfString(options.headers, 'options.headers');
    assert.optionalString(options.httpVersion, 'options.httpVersion');

    if (!request.getHeader('Date'))
      request.setHeader('Date', jsprim.rfc1123(new Date()));
    if (!options.headers)
      options.headers = ['date'];
    if (!options.httpVersion)
      options.httpVersion = '1.1';

    var alg = [];
    if (options.algorithm) {
      options.algorithm = options.algorithm.toLowerCase();
      alg = validateAlgorithm(options.algorithm);
    }

    var i;
    var stringToSign = '';
    for (i = 0; i < options.headers.length; i++) {
      if (typeof (options.headers[i]) !== 'string')
        throw new TypeError('options.headers must be an array of Strings');

      var h = options.headers[i].toLowerCase();

      if (h === 'request-line') {
        if (!options.strict) {
          /**
           * We allow headers from the older spec drafts if strict parsing isn't
           * specified in options.
           */
          stringToSign +=
            request.method + ' ' + request.path + ' HTTP/' +
            options.httpVersion;
        } else {
          /* Strict parsing doesn't allow older draft headers. */
          throw (new StrictParsingError('request-line is not a valid header ' +
            'with strict parsing enabled.'));
        }
      } else if (h === '(request-target)') {
        stringToSign +=
          '(request-target): ' + request.method.toLowerCase() + ' ' +
          request.path;
      } else {
        var value = request.getHeader(h);
        if (value === undefined || value === '') {
          throw new MissingHeaderError(h + ' was not in the request');
        }
        stringToSign += h + ': ' + value;
      }

      if ((i + 1) < options.headers.length)
        stringToSign += '\n';
    }

    /* This is just for unit tests. */
    if (request.hasOwnProperty('_stringToSign')) {
      request._stringToSign = stringToSign;
    }

    var signature;
    if (alg[0] === 'hmac') {
      if (typeof (options.key) !== 'string' && !Buffer.isBuffer(options.key))
        throw (new TypeError('options.key must be a string or Buffer'));

      var hmac = crypto.createHmac(alg[1].toUpperCase(), options.key);
      hmac.update(stringToSign);
      signature = hmac.digest('base64');

    } else {
      var key = options.key;
      if (typeof (key) === 'string' || Buffer.isBuffer(key))
        key = sshpk.parsePrivateKey(options.key);

      assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]),
        'options.key must be a sshpk.PrivateKey');

      if (!PK_ALGOS[key.type]) {
        throw (new InvalidAlgorithmError(key.type.toUpperCase() + ' type ' +
          'keys are not supported'));
      }

      if (alg[0] !== undefined && key.type !== alg[0]) {
        throw (new InvalidAlgorithmError('options.key must be a ' +
          alg[0].toUpperCase() + ' key, was given a ' +
          key.type.toUpperCase() + ' key instead'));
      }

      var signer = key.createSign(alg[1]);
      signer.update(stringToSign);
      var sigObj = signer.sign();
      if (!HASH_ALGOS[sigObj.hashAlgorithm]) {
        throw (new InvalidAlgorithmError(sigObj.hashAlgorithm.toUpperCase() +
          ' is not a supported hash algorithm'));
      }
      options.algorithm = key.type + '-' + sigObj.hashAlgorithm;
      signature = sigObj.toString();
      assert.notStrictEqual(signature, '', 'empty signature produced');
    }

    var authzHeaderName = options.authorizationHeaderName || 'Authorization';

    request.setHeader(authzHeaderName, sprintf(AUTHZ_FMT,
                                               options.keyId,
                                               options.algorithm,
                                               options.headers.join(' '),
                                               signature));

    return true;
  }

};
// Copyright 2012 Joyent, Inc.  All rights reserved.

var assert = require('assert-plus');
var sshpk = require('sshpk');
var util = require('util');

var HASH_ALGOS = {
  'sha1': true,
  'sha256': true,
  'sha512': true
};

var PK_ALGOS = {
  'rsa': true,
  'dsa': true,
  'ecdsa': true
};

function HttpSignatureError(message, caller) {
  if (Error.captureStackTrace)
    Error.captureStackTrace(this, caller || HttpSignatureError);

  this.message = message;
  this.name = caller.name;
}
util.inherits(HttpSignatureError, Error);

function InvalidAlgorithmError(message) {
  HttpSignatureError.call(this, message, InvalidAlgorithmError);
}
util.inherits(InvalidAlgorithmError, HttpSignatureError);

function validateAlgorithm(algorithm) {
  var alg = algorithm.toLowerCase().split('-');

  if (alg.length !== 2) {
    throw (new InvalidAlgorithmError(alg[0].toUpperCase() + ' is not a ' +
      'valid algorithm'));
  }

  if (alg[0] !== 'hmac' && !PK_ALGOS[alg[0]]) {
    throw (new InvalidAlgorithmError(alg[0].toUpperCase() + ' type keys ' +
      'are not supported'));
  }

  if (!HASH_ALGOS[alg[1]]) {
    throw (new InvalidAlgorithmError(alg[1].toUpperCase() + ' is not a ' +
      'supported hash algorithm'));
  }

  return (alg);
}

///--- API

module.exports = {

  HASH_ALGOS: HASH_ALGOS,
  PK_ALGOS: PK_ALGOS,

  HttpSignatureError: HttpSignatureError,
  InvalidAlgorithmError: InvalidAlgorithmError,

  validateAlgorithm: validateAlgorithm,

  /**
   * Converts an OpenSSH public key (rsa only) to a PKCS#8 PEM file.
   *
   * The intent of this module is to interoperate with OpenSSL only,
   * specifically the node crypto module's `verify` method.
   *
   * @param {String} key an OpenSSH public key.
   * @return {String} PEM encoded form of the RSA public key.
   * @throws {TypeError} on bad input.
   * @throws {Error} on invalid ssh key formatted data.
   */
  sshKeyToPEM: function sshKeyToPEM(key) {
    assert.string(key, 'ssh_key');

    var k = sshpk.parseKey(key, 'ssh');
    return (k.toString('pem'));
  },


  /**
   * Generates an OpenSSH fingerprint from an ssh public key.
   *
   * @param {String} key an OpenSSH public key.
   * @return {String} key fingerprint.
   * @throws {TypeError} on bad input.
   * @throws {Error} if what you passed doesn't look like an ssh public key.
   */
  fingerprint: function fingerprint(key) {
    assert.string(key, 'ssh_key');

    var k = sshpk.parseKey(key, 'ssh');
    return (k.fingerprint('md5').toString('hex'));
  },

  /**
   * Converts a PKGCS#8 PEM file to an OpenSSH public key (rsa)
   *
   * The reverse of the above function.
   */
  pemToRsaSSHKey: function pemToRsaSSHKey(pem, comment) {
    assert.equal('string', typeof (pem), 'typeof pem');

    var k = sshpk.parseKey(pem, 'pem');
    k.comment = comment;
    return (k.toString('ssh'));
  }
};
// Copyright 2015 Joyent, Inc.

var assert = require('assert-plus');
var crypto = require('crypto');
var sshpk = require('sshpk');
var utils = require('./utils');

var HASH_ALGOS = utils.HASH_ALGOS;
var PK_ALGOS = utils.PK_ALGOS;
var InvalidAlgorithmError = utils.InvalidAlgorithmError;
var HttpSignatureError = utils.HttpSignatureError;
var validateAlgorithm = utils.validateAlgorithm;

///--- Exported API

module.exports = {
  /**
   * Verify RSA/DSA signature against public key.  You are expected to pass in
   * an object that was returned from `parse()`.
   *
   * @param {Object} parsedSignature the object you got from `parse`.
   * @param {String} pubkey RSA/DSA private key PEM.
   * @return {Boolean} true if valid, false otherwise.
   * @throws {TypeError} if you pass in bad arguments.
   * @throws {InvalidAlgorithmError}
   */
  verifySignature: function verifySignature(parsedSignature, pubkey) {
    assert.object(parsedSignature, 'parsedSignature');
    if (typeof (pubkey) === 'string' || Buffer.isBuffer(pubkey))
      pubkey = sshpk.parseKey(pubkey);
    assert.ok(sshpk.Key.isKey(pubkey, [1, 1]), 'pubkey must be a sshpk.Key');

    var alg = validateAlgorithm(parsedSignature.algorithm);
    if (alg[0] === 'hmac' || alg[0] !== pubkey.type)
      return (false);

    var v = pubkey.createVerify(alg[1]);
    v.update(parsedSignature.signingString);
    return (v.verify(parsedSignature.params.signature, 'base64'));
  },

  /**
   * Verify HMAC against shared secret.  You are expected to pass in an object
   * that was returned from `parse()`.
   *
   * @param {Object} parsedSignature the object you got from `parse`.
   * @param {String} secret HMAC shared secret.
   * @return {Boolean} true if valid, false otherwise.
   * @throws {TypeError} if you pass in bad arguments.
   * @throws {InvalidAlgorithmError}
   */
  verifyHMAC: function verifyHMAC(parsedSignature, secret) {
    assert.object(parsedSignature, 'parsedHMAC');
    assert.string(secret, 'secret');

    var alg = validateAlgorithm(parsedSignature.algorithm);
    if (alg[0] !== 'hmac')
      return (false);

    var hashAlg = alg[1].toUpperCase();

    var hmac = crypto.createHmac(hashAlg, secret);
    hmac.update(parsedSignature.signingString);

    /*
     * Now double-hash to avoid leaking timing information - there's
     * no easy constant-time compare in JS, so we use this approach
     * instead. See for more info:
     * https://www.isecpartners.com/blog/2011/february/double-hmac-
     * verification.aspx
     */
    var h1 = crypto.createHmac(hashAlg, secret);
    h1.update(hmac.digest());
    h1 = h1.digest();
    var h2 = crypto.createHmac(hashAlg, secret);
    h2.update(new Buffer(parsedSignature.params.signature, 'base64'));
    h2 = h2.digest();

    /* Node 0.8 returns strings from .digest(). */
    if (typeof (h1) === 'string')
      return (h1 === h2);
    /* And node 0.10 lacks the .equals() method on Buffers. */
    if (Buffer.isBuffer(h1) && !h1.equals)
      return (h1.toString('binary') === h2.toString('binary'));

    return (h1.equals(h2));
  }
};
# 0.4.24 / 2018-08-22

  * Added MIK encoding (#196, by @Ivan-Kalatchev)


# 0.4.23 / 2018-05-07

  * Fix deprecation warning in Node v10 due to the last usage of `new Buffer` (#185, by @felixbuenemann)
  * Switched from NodeBuffer to Buffer in typings (#155 by @felixfbecker, #186 by @larssn)


# 0.4.22 / 2018-05-05

  * Use older semver style for dependencies to be compatible with Node version 0.10 (#182, by @dougwilson)
  * Fix tests to accomodate fixes in Node v10 (#182, by @dougwilson)


# 0.4.21 / 2018-04-06

  * Fix encoding canonicalization (#156)
  * Fix the paths in the "browser" field in package.json (#174 by @LMLB)
  * Removed "contributors" section in package.json - see Git history instead.


# 0.4.20 / 2018-04-06

  * Updated `new Buffer()` usages with recommended replacements as it's being deprecated in Node v10 (#176, #178 by @ChALkeR)


# 0.4.19 / 2017-09-09

  * Fixed iso8859-1 codec regression in handling untranslatable characters (#162, caused by #147)
  * Re-generated windows1255 codec, because it was updated in iconv project
  * Fixed grammar in error message when iconv-lite is loaded with encoding other than utf8


# 0.4.18 / 2017-06-13

  * Fixed CESU-8 regression in Node v8.


# 0.4.17 / 2017-04-22

 * Updated typescript definition file to support Angular 2 AoT mode (#153 by @larssn)


# 0.4.16 / 2017-04-22

 * Added support for React Native (#150)
 * Changed iso8859-1 encoding to usine internal 'binary' encoding, as it's the same thing (#147 by @mscdex)
 * Fixed typo in Readme (#138 by @jiangzhuo)
 * Fixed build for Node v6.10+ by making correct version comparison
 * Added a warning if iconv-lite is loaded not as utf-8 (see #142)


# 0.4.15 / 2016-11-21

 * Fixed typescript type definition (#137)


# 0.4.14 / 2016-11-20

 * Preparation for v1.0
 * Added Node v6 and latest Node versions to Travis CI test rig
 * Deprecated Node v0.8 support
 * Typescript typings (@larssn)
 * Fix encoding of Euro character in GB 18030 (inspired by @lygstate)
 * Add ms prefix to dbcs windows encodings (@rokoroku)


# 0.4.13 / 2015-10-01

 * Fix silly mistake in deprecation notice.


# 0.4.12 / 2015-09-26

 * Node v4 support:
   * Added CESU-8 decoding (#106)
   * Added deprecation notice for `extendNodeEncodings`
   * Added Travis tests for Node v4 and io.js latest (#105 by @Mithgol)


# 0.4.11 / 2015-07-03

 * Added CESU-8 encoding.


# 0.4.10 / 2015-05-26

 * Changed UTF-16 endianness heuristic to take into account any ASCII chars, not
   just spaces. This should minimize the importance of "default" endianness.


# 0.4.9 / 2015-05-24

 * Streamlined BOM handling: strip BOM by default, add BOM when encoding if 
   addBOM: true. Added docs to Readme.
 * UTF16 now uses UTF16-LE by default.
 * Fixed minor issue with big5 encoding.
 * Added io.js testing on Travis; updated node-iconv version to test against.
   Now we just skip testing SBCS encodings that node-iconv doesn't support.
 * (internal refactoring) Updated codec interface to use classes.
 * Use strict mode in all files.


# 0.4.8 / 2015-04-14
 
 * added alias UNICODE-1-1-UTF-7 for UTF-7 encoding (#94)


# 0.4.7 / 2015-02-05

 * stop official support of Node.js v0.8. Should still work, but no guarantees.
   reason: Packages needed for testing are hard to get on Travis CI.
 * work in environment where Object.prototype is monkey patched with enumerable 
   props (#89).


# 0.4.6 / 2015-01-12
 
 * fix rare aliases of single-byte encodings (thanks @mscdex)
 * double the timeout for dbcs tests to make them less flaky on travis


# 0.4.5 / 2014-11-20

 * fix windows-31j and x-sjis encoding support (@nleush)
 * minor fix: undefined variable reference when internal error happens


# 0.4.4 / 2014-07-16

 * added encodings UTF-7 (RFC2152) and UTF-7-IMAP (RFC3501 Section 5.1.3)
 * fixed streaming base64 encoding


# 0.4.3 / 2014-06-14

 * added encodings UTF-16BE and UTF-16 with BOM


# 0.4.2 / 2014-06-12

 * don't throw exception if `extendNodeEncodings()` is called more than once


# 0.4.1 / 2014-06-11

 * codepage 808 added


# 0.4.0 / 2014-06-10

 * code is rewritten from scratch
 * all widespread encodings are supported
 * streaming interface added
 * browserify compatibility added
 * (optional) extend core primitive encodings to make usage even simpler
 * moved from vows to mocha as the testing framework


Copyright (c) 2011 Alexander Shtuchkin

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

{
  "author": {
    "name": "Alexander Shtuchkin",
    "email": "ashtuchkin@gmail.com"
  },
  "browser": {
    "./lib/extend-node": false,
    "./lib/streams": false
  },
  "dependencies": {
    "safer-buffer": ">= 2.1.2 < 3"
  },
  "deprecated": false,
  "description": "Convert character encodings in pure javascript.",
  "devDependencies": {
    "async": "*",
    "errto": "*",
    "iconv": "*",
    "istanbul": "*",
    "mocha": "^3.1.0",
    "request": "~2.87.0",
    "semver": "*",
    "unorm": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "homepage": "https://github.com/ashtuchkin/iconv-lite",
  "license": "MIT",
  "main": "./lib/index.js",
  "name": "iconv-lite",
  "repository": {
    "type": "git",
    "url": "git://github.com/ashtuchkin/iconv-lite.git"
  },
  "typings": "./lib/index.d.ts",
  "version": "0.4.24"
}"use strict";

var BOMChar = '\uFEFF';

exports.PrependBOM = PrependBOMWrapper
function PrependBOMWrapper(encoder, options) {
    this.encoder = encoder;
    this.addBOM = true;
}

PrependBOMWrapper.prototype.write = function(str) {
    if (this.addBOM) {
        str = BOMChar + str;
        this.addBOM = false;
    }

    return this.encoder.write(str);
}

PrependBOMWrapper.prototype.end = function() {
    return this.encoder.end();
}


//------------------------------------------------------------------------------

exports.StripBOM = StripBOMWrapper;
function StripBOMWrapper(decoder, options) {
    this.decoder = decoder;
    this.pass = false;
    this.options = options || {};
}

StripBOMWrapper.prototype.write = function(buf) {
    var res = this.decoder.write(buf);
    if (this.pass || !res)
        return res;

    if (res[0] === BOMChar) {
        res = res.slice(1);
        if (typeof this.options.stripBOM === 'function')
            this.options.stripBOM();
    }

    this.pass = true;
    return res;
}

StripBOMWrapper.prototype.end = function() {
    return this.decoder.end();
}

"use strict";
var Buffer = require("buffer").Buffer;
// Note: not polyfilled with safer-buffer on a purpose, as overrides Buffer

// == Extend Node primitives to use iconv-lite =================================

module.exports = function (iconv) {
    var original = undefined; // Place to keep original methods.

    // Node authors rewrote Buffer internals to make it compatible with
    // Uint8Array and we cannot patch key functions since then.
    // Note: this does use older Buffer API on a purpose
    iconv.supportsNodeEncodingsExtension = !(Buffer.from || new Buffer(0) instanceof Uint8Array);

    iconv.extendNodeEncodings = function extendNodeEncodings() {
        if (original) return;
        original = {};

        if (!iconv.supportsNodeEncodingsExtension) {
            console.error("ACTION NEEDED: require('iconv-lite').extendNodeEncodings() is not supported in your version of Node");
            console.error("See more info at https://github.com/ashtuchkin/iconv-lite/wiki/Node-v4-compatibility");
            return;
        }

        var nodeNativeEncodings = {
            'hex': true, 'utf8': true, 'utf-8': true, 'ascii': true, 'binary': true, 
            'base64': true, 'ucs2': true, 'ucs-2': true, 'utf16le': true, 'utf-16le': true,
        };

        Buffer.isNativeEncoding = function(enc) {
            return enc && nodeNativeEncodings[enc.toLowerCase()];
        }

        // -- SlowBuffer -----------------------------------------------------------
        var SlowBuffer = require('buffer').SlowBuffer;

        original.SlowBufferToString = SlowBuffer.prototype.toString;
        SlowBuffer.prototype.toString = function(encoding, start, end) {
            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.SlowBufferToString.call(this, encoding, start, end);

            // Otherwise, use our decoding method.
            if (typeof start == 'undefined') start = 0;
            if (typeof end == 'undefined') end = this.length;
            return iconv.decode(this.slice(start, end), encoding);
        }

        original.SlowBufferWrite = SlowBuffer.prototype.write;
        SlowBuffer.prototype.write = function(string, offset, length, encoding) {
            // Support both (string, offset, length, encoding)
            // and the legacy (string, encoding, offset, length)
            if (isFinite(offset)) {
                if (!isFinite(length)) {
                    encoding = length;
                    length = undefined;
                }
            } else {  // legacy
                var swap = encoding;
                encoding = offset;
                offset = length;
                length = swap;
            }

            offset = +offset || 0;
            var remaining = this.length - offset;
            if (!length) {
                length = remaining;
            } else {
                length = +length;
                if (length > remaining) {
                    length = remaining;
                }
            }
            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.SlowBufferWrite.call(this, string, offset, length, encoding);

            if (string.length > 0 && (length < 0 || offset < 0))
                throw new RangeError('attempt to write beyond buffer bounds');

            // Otherwise, use our encoding method.
            var buf = iconv.encode(string, encoding);
            if (buf.length < length) length = buf.length;
            buf.copy(this, offset, 0, length);
            return length;
        }

        // -- Buffer ---------------------------------------------------------------

        original.BufferIsEncoding = Buffer.isEncoding;
        Buffer.isEncoding = function(encoding) {
            return Buffer.isNativeEncoding(encoding) || iconv.encodingExists(encoding);
        }

        original.BufferByteLength = Buffer.byteLength;
        Buffer.byteLength = SlowBuffer.byteLength = function(str, encoding) {
            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.BufferByteLength.call(this, str, encoding);

            // Slow, I know, but we don't have a better way yet.
            return iconv.encode(str, encoding).length;
        }

        original.BufferToString = Buffer.prototype.toString;
        Buffer.prototype.toString = function(encoding, start, end) {
            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.BufferToString.call(this, encoding, start, end);

            // Otherwise, use our decoding method.
            if (typeof start == 'undefined') start = 0;
            if (typeof end == 'undefined') end = this.length;
            return iconv.decode(this.slice(start, end), encoding);
        }

        original.BufferWrite = Buffer.prototype.write;
        Buffer.prototype.write = function(string, offset, length, encoding) {
            var _offset = offset, _length = length, _encoding = encoding;
            // Support both (string, offset, length, encoding)
            // and the legacy (string, encoding, offset, length)
            if (isFinite(offset)) {
                if (!isFinite(length)) {
                    encoding = length;
                    length = undefined;
                }
            } else {  // legacy
                var swap = encoding;
                encoding = offset;
                offset = length;
                length = swap;
            }

            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.BufferWrite.call(this, string, _offset, _length, _encoding);

            offset = +offset || 0;
            var remaining = this.length - offset;
            if (!length) {
                length = remaining;
            } else {
                length = +length;
                if (length > remaining) {
                    length = remaining;
                }
            }

            if (string.length > 0 && (length < 0 || offset < 0))
                throw new RangeError('attempt to write beyond buffer bounds');

            // Otherwise, use our encoding method.
            var buf = iconv.encode(string, encoding);
            if (buf.length < length) length = buf.length;
            buf.copy(this, offset, 0, length);
            return length;

            // TODO: Set _charsWritten.
        }


        // -- Readable -------------------------------------------------------------
        if (iconv.supportsStreams) {
            var Readable = require('stream').Readable;

            original.ReadableSetEncoding = Readable.prototype.setEncoding;
            Readable.prototype.setEncoding = function setEncoding(enc, options) {
                // Use our own decoder, it has the same interface.
                // We cannot use original function as it doesn't handle BOM-s.
                this._readableState.decoder = iconv.getDecoder(enc, options);
                this._readableState.encoding = enc;
            }

            Readable.prototype.collect = iconv._collect;
        }
    }

    // Remove iconv-lite Node primitive extensions.
    iconv.undoExtendNodeEncodings = function undoExtendNodeEncodings() {
        if (!iconv.supportsNodeEncodingsExtension)
            return;
        if (!original)
            throw new Error("require('iconv-lite').undoExtendNodeEncodings(): Nothing to undo; extendNodeEncodings() is not called.")

        delete Buffer.isNativeEncoding;

        var SlowBuffer = require('buffer').SlowBuffer;

        SlowBuffer.prototype.toString = original.SlowBufferToString;
        SlowBuffer.prototype.write = original.SlowBufferWrite;

        Buffer.isEncoding = original.BufferIsEncoding;
        Buffer.byteLength = original.BufferByteLength;
        Buffer.prototype.toString = original.BufferToString;
        Buffer.prototype.write = original.BufferWrite;

        if (iconv.supportsStreams) {
            var Readable = require('stream').Readable;

            Readable.prototype.setEncoding = original.ReadableSetEncoding;
            delete Readable.prototype.collect;
        }

        original = undefined;
    }
}
"use strict";

// Some environments don't have global Buffer (e.g. React Native).
// Solution would be installing npm modules "buffer" and "stream" explicitly.
var Buffer = require("safer-buffer").Buffer;

var bomHandling = require("./bom-handling"),
    iconv = module.exports;

// All codecs and aliases are kept here, keyed by encoding name/alias.
// They are lazy loaded in `iconv.getCodec` from `encodings/index.js`.
iconv.encodings = null;

// Characters emitted in case of error.
iconv.defaultCharUnicode = 'ï¿½';
iconv.defaultCharSingleByte = '?';

// Public API.
iconv.encode = function encode(str, encoding, options) {
    str = "" + (str || ""); // Ensure string.

    var encoder = iconv.getEncoder(encoding, options);

    var res = encoder.write(str);
    var trail = encoder.end();
    
    return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res;
}

iconv.decode = function decode(buf, encoding, options) {
    if (typeof buf === 'string') {
        if (!iconv.skipDecodeWarning) {
            console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding');
            iconv.skipDecodeWarning = true;
        }

        buf = Buffer.from("" + (buf || ""), "binary"); // Ensure buffer.
    }

    var decoder = iconv.getDecoder(encoding, options);

    var res = decoder.write(buf);
    var trail = decoder.end();

    return trail ? (res + trail) : res;
}

iconv.encodingExists = function encodingExists(enc) {
    try {
        iconv.getCodec(enc);
        return true;
    } catch (e) {
        return false;
    }
}

// Legacy aliases to convert functions
iconv.toEncoding = iconv.encode;
iconv.fromEncoding = iconv.decode;

// Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache.
iconv._codecDataCache = {};
iconv.getCodec = function getCodec(encoding) {
    if (!iconv.encodings)
        iconv.encodings = require("../encodings"); // Lazy load all encoding definitions.
    
    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.
    var enc = iconv._canonicalizeEncoding(encoding);

    // Traverse iconv.encodings to find actual codec.
    var codecOptions = {};
    while (true) {
        var codec = iconv._codecDataCache[enc];
        if (codec)
            return codec;

        var codecDef = iconv.encodings[enc];

        switch (typeof codecDef) {
            case "string": // Direct alias to other encoding.
                enc = codecDef;
                break;

            case "object": // Alias with options. Can be layered.
                for (var key in codecDef)
                    codecOptions[key] = codecDef[key];

                if (!codecOptions.encodingName)
                    codecOptions.encodingName = enc;
                
                enc = codecDef.type;
                break;

            case "function": // Codec itself.
                if (!codecOptions.encodingName)
                    codecOptions.encodingName = enc;

                // The codec function must load all tables and return object with .encoder and .decoder methods.
                // It'll be called only once (for each different options object).
                codec = new codecDef(codecOptions, iconv);

                iconv._codecDataCache[codecOptions.encodingName] = codec; // Save it to be reused later.
                return codec;

            default:
                throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')");
        }
    }
}

iconv._canonicalizeEncoding = function(encoding) {
    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.
    return (''+encoding).toLowerCase().replace(/:\d{4}$|[^0-9a-z]/g, "");
}

iconv.getEncoder = function getEncoder(encoding, options) {
    var codec = iconv.getCodec(encoding),
        encoder = new codec.encoder(options, codec);

    if (codec.bomAware && options && options.addBOM)
        encoder = new bomHandling.PrependBOM(encoder, options);

    return encoder;
}

iconv.getDecoder = function getDecoder(encoding, options) {
    var codec = iconv.getCodec(encoding),
        decoder = new codec.decoder(options, codec);

    if (codec.bomAware && !(options && options.stripBOM === false))
        decoder = new bomHandling.StripBOM(decoder, options);

    return decoder;
}


// Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json.
var nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node;
if (nodeVer) {

    // Load streaming support in Node v0.10+
    var nodeVerArr = nodeVer.split(".").map(Number);
    if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) {
        require("./streams")(iconv);
    }

    // Load Node primitive extensions.
    require("./extend-node")(iconv);
}

if ("Ä€" != "\u0100") {
    console.error("iconv-lite warning: javascript files use encoding different from utf-8. See https://github.com/ashtuchkin/iconv-lite/wiki/Javascript-source-file-encodings for more info.");
}
"use strict";

var Buffer = require("buffer").Buffer,
    Transform = require("stream").Transform;


// == Exports ==================================================================
module.exports = function(iconv) {
    
    // Additional Public API.
    iconv.encodeStream = function encodeStream(encoding, options) {
        return new IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options);
    }

    iconv.decodeStream = function decodeStream(encoding, options) {
        return new IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options);
    }

    iconv.supportsStreams = true;


    // Not published yet.
    iconv.IconvLiteEncoderStream = IconvLiteEncoderStream;
    iconv.IconvLiteDecoderStream = IconvLiteDecoderStream;
    iconv._collect = IconvLiteDecoderStream.prototype.collect;
};


// == Encoder stream =======================================================
function IconvLiteEncoderStream(conv, options) {
    this.conv = conv;
    options = options || {};
    options.decodeStrings = false; // We accept only strings, so we don't need to decode them.
    Transform.call(this, options);
}

IconvLiteEncoderStream.prototype = Object.create(Transform.prototype, {
    constructor: { value: IconvLiteEncoderStream }
});

IconvLiteEncoderStream.prototype._transform = function(chunk, encoding, done) {
    if (typeof chunk != 'string')
        return done(new Error("Iconv encoding stream needs strings as its input."));
    try {
        var res = this.conv.write(chunk);
        if (res && res.length) this.push(res);
        done();
    }
    catch (e) {
        done(e);
    }
}

IconvLiteEncoderStream.prototype._flush = function(done) {
    try {
        var res = this.conv.end();
        if (res && res.length) this.push(res);
        done();
    }
    catch (e) {
        done(e);
    }
}

IconvLiteEncoderStream.prototype.collect = function(cb) {
    var chunks = [];
    this.on('error', cb);
    this.on('data', function(chunk) { chunks.push(chunk); });
    this.on('end', function() {
        cb(null, Buffer.concat(chunks));
    });
    return this;
}


// == Decoder stream =======================================================
function IconvLiteDecoderStream(conv, options) {
    this.conv = conv;
    options = options || {};
    options.encoding = this.encoding = 'utf8'; // We output strings.
    Transform.call(this, options);
}

IconvLiteDecoderStream.prototype = Object.create(Transform.prototype, {
    constructor: { value: IconvLiteDecoderStream }
});

IconvLiteDecoderStream.prototype._transform = function(chunk, encoding, done) {
    if (!Buffer.isBuffer(chunk))
        return done(new Error("Iconv decoding stream needs buffers as its input."));
    try {
        var res = this.conv.write(chunk);
        if (res && res.length) this.push(res, this.encoding);
        done();
    }
    catch (e) {
        done(e);
    }
}

IconvLiteDecoderStream.prototype._flush = function(done) {
    try {
        var res = this.conv.end();
        if (res && res.length) this.push(res, this.encoding);                
        done();
    }
    catch (e) {
        done(e);
    }
}

IconvLiteDecoderStream.prototype.collect = function(cb) {
    var res = '';
    this.on('error', cb);
    this.on('data', function(chunk) { res += chunk; });
    this.on('end', function() {
        cb(null, res);
    });
    return this;
}

"use strict";
var Buffer = require("safer-buffer").Buffer;

// Multibyte codec. In this scheme, a character is represented by 1 or more bytes.
// Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences.
// To save memory and loading time, we read table files only when requested.

exports._dbcs = DBCSCodec;

var UNASSIGNED = -1,
    GB18030_CODE = -2,
    SEQ_START  = -10,
    NODE_START = -1000,
    UNASSIGNED_NODE = new Array(0x100),
    DEF_CHAR = -1;

for (var i = 0; i < 0x100; i++)
    UNASSIGNED_NODE[i] = UNASSIGNED;


// Class DBCSCodec reads and initializes mapping tables.
function DBCSCodec(codecOptions, iconv) {
    this.encodingName = codecOptions.encodingName;
    if (!codecOptions)
        throw new Error("DBCS codec is called without the data.")
    if (!codecOptions.table)
        throw new Error("Encoding '" + this.encodingName + "' has no data.");

    // Load tables.
    var mappingTable = codecOptions.table();


    // Decode tables: MBCS -> Unicode.

    // decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256.
    // Trie root is decodeTables[0].
    // Values: >=  0 -> unicode character code. can be > 0xFFFF
    //         == UNASSIGNED -> unknown/unassigned sequence.
    //         == GB18030_CODE -> this is the end of a GB18030 4-byte sequence.
    //         <= NODE_START -> index of the next node in our trie to process next byte.
    //         <= SEQ_START  -> index of the start of a character code sequence, in decodeTableSeq.
    this.decodeTables = [];
    this.decodeTables[0] = UNASSIGNED_NODE.slice(0); // Create root node.

    // Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here. 
    this.decodeTableSeq = [];

    // Actual mapping tables consist of chunks. Use them to fill up decode tables.
    for (var i = 0; i < mappingTable.length; i++)
        this._addDecodeChunk(mappingTable[i]);

    this.defaultCharUnicode = iconv.defaultCharUnicode;

    
    // Encode tables: Unicode -> DBCS.

    // `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance.
    // Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null.
    // Values: >=  0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.).
    //         == UNASSIGNED -> no conversion found. Output a default char.
    //         <= SEQ_START  -> it's an index in encodeTableSeq, see below. The character starts a sequence.
    this.encodeTable = [];
    
    // `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of
    // objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key
    // means end of sequence (needed when one sequence is a strict subsequence of another).
    // Objects are kept separately from encodeTable to increase performance.
    this.encodeTableSeq = [];

    // Some chars can be decoded, but need not be encoded.
    var skipEncodeChars = {};
    if (codecOptions.encodeSkipVals)
        for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) {
            var val = codecOptions.encodeSkipVals[i];
            if (typeof val === 'number')
                skipEncodeChars[val] = true;
            else
                for (var j = val.from; j <= val.to; j++)
                    skipEncodeChars[j] = true;
        }
        
    // Use decode trie to recursively fill out encode tables.
    this._fillEncodeTable(0, 0, skipEncodeChars);

    // Add more encoding pairs when needed.
    if (codecOptions.encodeAdd) {
        for (var uChar in codecOptions.encodeAdd)
            if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar))
                this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]);
    }

    this.defCharSB  = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)];
    if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]['?'];
    if (this.defCharSB === UNASSIGNED) this.defCharSB = "?".charCodeAt(0);


    // Load & create GB18030 tables when needed.
    if (typeof codecOptions.gb18030 === 'function') {
        this.gb18030 = codecOptions.gb18030(); // Load GB18030 ranges.

        // Add GB18030 decode tables.
        var thirdByteNodeIdx = this.decodeTables.length;
        var thirdByteNode = this.decodeTables[thirdByteNodeIdx] = UNASSIGNED_NODE.slice(0);

        var fourthByteNodeIdx = this.decodeTables.length;
        var fourthByteNode = this.decodeTables[fourthByteNodeIdx] = UNASSIGNED_NODE.slice(0);

        for (var i = 0x81; i <= 0xFE; i++) {
            var secondByteNodeIdx = NODE_START - this.decodeTables[0][i];
            var secondByteNode = this.decodeTables[secondByteNodeIdx];
            for (var j = 0x30; j <= 0x39; j++)
                secondByteNode[j] = NODE_START - thirdByteNodeIdx;
        }
        for (var i = 0x81; i <= 0xFE; i++)
            thirdByteNode[i] = NODE_START - fourthByteNodeIdx;
        for (var i = 0x30; i <= 0x39; i++)
            fourthByteNode[i] = GB18030_CODE
    }        
}

DBCSCodec.prototype.encoder = DBCSEncoder;
DBCSCodec.prototype.decoder = DBCSDecoder;

// Decoder helpers
DBCSCodec.prototype._getDecodeTrieNode = function(addr) {
    var bytes = [];
    for (; addr > 0; addr >>= 8)
        bytes.push(addr & 0xFF);
    if (bytes.length == 0)
        bytes.push(0);

    var node = this.decodeTables[0];
    for (var i = bytes.length-1; i > 0; i--) { // Traverse nodes deeper into the trie.
        var val = node[bytes[i]];

        if (val == UNASSIGNED) { // Create new node.
            node[bytes[i]] = NODE_START - this.decodeTables.length;
            this.decodeTables.push(node = UNASSIGNED_NODE.slice(0));
        }
        else if (val <= NODE_START) { // Existing node.
            node = this.decodeTables[NODE_START - val];
        }
        else
            throw new Error("Overwrite byte in " + this.encodingName + ", addr: " + addr.toString(16));
    }
    return node;
}


DBCSCodec.prototype._addDecodeChunk = function(chunk) {
    // First element of chunk is the hex mbcs code where we start.
    var curAddr = parseInt(chunk[0], 16);

    // Choose the decoding node where we'll write our chars.
    var writeTable = this._getDecodeTrieNode(curAddr);
    curAddr = curAddr & 0xFF;

    // Write all other elements of the chunk to the table.
    for (var k = 1; k < chunk.length; k++) {
        var part = chunk[k];
        if (typeof part === "string") { // String, write as-is.
            for (var l = 0; l < part.length;) {
                var code = part.charCodeAt(l++);
                if (0xD800 <= code && code < 0xDC00) { // Decode surrogate
                    var codeTrail = part.charCodeAt(l++);
                    if (0xDC00 <= codeTrail && codeTrail < 0xE000)
                        writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00);
                    else
                        throw new Error("Incorrect surrogate pair in "  + this.encodingName + " at chunk " + chunk[0]);
                }
                else if (0x0FF0 < code && code <= 0x0FFF) { // Character sequence (our own encoding used)
                    var len = 0xFFF - code + 2;
                    var seq = [];
                    for (var m = 0; m < len; m++)
                        seq.push(part.charCodeAt(l++)); // Simple variation: don't support surrogates or subsequences in seq.

                    writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length;
                    this.decodeTableSeq.push(seq);
                }
                else
                    writeTable[curAddr++] = code; // Basic char
            }
        } 
        else if (typeof part === "number") { // Integer, meaning increasing sequence starting with prev character.
            var charCode = writeTable[curAddr - 1] + 1;
            for (var l = 0; l < part; l++)
                writeTable[curAddr++] = charCode++;
        }
        else
            throw new Error("Incorrect type '" + typeof part + "' given in "  + this.encodingName + " at chunk " + chunk[0]);
    }
    if (curAddr > 0xFF)
        throw new Error("Incorrect chunk in "  + this.encodingName + " at addr " + chunk[0] + ": too long" + curAddr);
}

// Encoder helpers
DBCSCodec.prototype._getEncodeBucket = function(uCode) {
    var high = uCode >> 8; // This could be > 0xFF because of astral characters.
    if (this.encodeTable[high] === undefined)
        this.encodeTable[high] = UNASSIGNED_NODE.slice(0); // Create bucket on demand.
    return this.encodeTable[high];
}

DBCSCodec.prototype._setEncodeChar = function(uCode, dbcsCode) {
    var bucket = this._getEncodeBucket(uCode);
    var low = uCode & 0xFF;
    if (bucket[low] <= SEQ_START)
        this.encodeTableSeq[SEQ_START-bucket[low]][DEF_CHAR] = dbcsCode; // There's already a sequence, set a single-char subsequence of it.
    else if (bucket[low] == UNASSIGNED)
        bucket[low] = dbcsCode;
}

DBCSCodec.prototype._setEncodeSequence = function(seq, dbcsCode) {
    
    // Get the root of character tree according to first character of the sequence.
    var uCode = seq[0];
    var bucket = this._getEncodeBucket(uCode);
    var low = uCode & 0xFF;

    var node;
    if (bucket[low] <= SEQ_START) {
        // There's already a sequence with  - use it.
        node = this.encodeTableSeq[SEQ_START-bucket[low]];
    }
    else {
        // There was no sequence object - allocate a new one.
        node = {};
        if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; // If a char was set before - make it a single-char subsequence.
        bucket[low] = SEQ_START - this.encodeTableSeq.length;
        this.encodeTableSeq.push(node);
    }

    // Traverse the character tree, allocating new nodes as needed.
    for (var j = 1; j < seq.length-1; j++) {
        var oldVal = node[uCode];
        if (typeof oldVal === 'object')
            node = oldVal;
        else {
            node = node[uCode] = {}
            if (oldVal !== undefined)
                node[DEF_CHAR] = oldVal
        }
    }

    // Set the leaf to given dbcsCode.
    uCode = seq[seq.length-1];
    node[uCode] = dbcsCode;
}

DBCSCodec.prototype._fillEncodeTable = function(nodeIdx, prefix, skipEncodeChars) {
    var node = this.decodeTables[nodeIdx];
    for (var i = 0; i < 0x100; i++) {
        var uCode = node[i];
        var mbCode = prefix + i;
        if (skipEncodeChars[mbCode])
            continue;

        if (uCode >= 0)
            this._setEncodeChar(uCode, mbCode);
        else if (uCode <= NODE_START)
            this._fillEncodeTable(NODE_START - uCode, mbCode << 8, skipEncodeChars);
        else if (uCode <= SEQ_START)
            this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode);
    }
}



// == Encoder ==================================================================

function DBCSEncoder(options, codec) {
    // Encoder state
    this.leadSurrogate = -1;
    this.seqObj = undefined;
    
    // Static data
    this.encodeTable = codec.encodeTable;
    this.encodeTableSeq = codec.encodeTableSeq;
    this.defaultCharSingleByte = codec.defCharSB;
    this.gb18030 = codec.gb18030;
}

DBCSEncoder.prototype.write = function(str) {
    var newBuf = Buffer.alloc(str.length * (this.gb18030 ? 4 : 3)),
        leadSurrogate = this.leadSurrogate,
        seqObj = this.seqObj, nextChar = -1,
        i = 0, j = 0;

    while (true) {
        // 0. Get next character.
        if (nextChar === -1) {
            if (i == str.length) break;
            var uCode = str.charCodeAt(i++);
        }
        else {
            var uCode = nextChar;
            nextChar = -1;    
        }

        // 1. Handle surrogates.
        if (0xD800 <= uCode && uCode < 0xE000) { // Char is one of surrogates.
            if (uCode < 0xDC00) { // We've got lead surrogate.
                if (leadSurrogate === -1) {
                    leadSurrogate = uCode;
                    continue;
                } else {
                    leadSurrogate = uCode;
                    // Double lead surrogate found.
                    uCode = UNASSIGNED;
                }
            } else { // We've got trail surrogate.
                if (leadSurrogate !== -1) {
                    uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00);
                    leadSurrogate = -1;
                } else {
                    // Incomplete surrogate pair - only trail surrogate found.
                    uCode = UNASSIGNED;
                }
                
            }
        }
        else if (leadSurrogate !== -1) {
            // Incomplete surrogate pair - only lead surrogate found.
            nextChar = uCode; uCode = UNASSIGNED; // Write an error, then current char.
            leadSurrogate = -1;
        }

        // 2. Convert uCode character.
        var dbcsCode = UNASSIGNED;
        if (seqObj !== undefined && uCode != UNASSIGNED) { // We are in the middle of the sequence
            var resCode = seqObj[uCode];
            if (typeof resCode === 'object') { // Sequence continues.
                seqObj = resCode;
                continue;

            } else if (typeof resCode == 'number') { // Sequence finished. Write it.
                dbcsCode = resCode;

            } else if (resCode == undefined) { // Current character is not part of the sequence.

                // Try default character for this sequence
                resCode = seqObj[DEF_CHAR];
                if (resCode !== undefined) {
                    dbcsCode = resCode; // Found. Write it.
                    nextChar = uCode; // Current character will be written too in the next iteration.

                } else {
                    // TODO: What if we have no default? (resCode == undefined)
                    // Then, we should write first char of the sequence as-is and try the rest recursively.
                    // Didn't do it for now because no encoding has this situation yet.
                    // Currently, just skip the sequence and write current char.
                }
            }
            seqObj = undefined;
        }
        else if (uCode >= 0) {  // Regular character
            var subtable = this.encodeTable[uCode >> 8];
            if (subtable !== undefined)
                dbcsCode = subtable[uCode & 0xFF];
            
            if (dbcsCode <= SEQ_START) { // Sequence start
                seqObj = this.encodeTableSeq[SEQ_START-dbcsCode];
                continue;
            }

            if (dbcsCode == UNASSIGNED && this.gb18030) {
                // Use GB18030 algorithm to find character(s) to write.
                var idx = findIdx(this.gb18030.uChars, uCode);
                if (idx != -1) {
                    var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx]);
                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); dbcsCode = dbcsCode % 12600;
                    newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); dbcsCode = dbcsCode % 1260;
                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); dbcsCode = dbcsCode % 10;
                    newBuf[j++] = 0x30 + dbcsCode;
                    continue;
                }
            }
        }

        // 3. Write dbcsCode character.
        if (dbcsCode === UNASSIGNED)
            dbcsCode = this.defaultCharSingleByte;
        
        if (dbcsCode < 0x100) {
            newBuf[j++] = dbcsCode;
        }
        else if (dbcsCode < 0x10000) {
            newBuf[j++] = dbcsCode >> 8;   // high byte
            newBuf[j++] = dbcsCode & 0xFF; // low byte
        }
        else {
            newBuf[j++] = dbcsCode >> 16;
            newBuf[j++] = (dbcsCode >> 8) & 0xFF;
            newBuf[j++] = dbcsCode & 0xFF;
        }
    }

    this.seqObj = seqObj;
    this.leadSurrogate = leadSurrogate;
    return newBuf.slice(0, j);
}

DBCSEncoder.prototype.end = function() {
    if (this.leadSurrogate === -1 && this.seqObj === undefined)
        return; // All clean. Most often case.

    var newBuf = Buffer.alloc(10), j = 0;

    if (this.seqObj) { // We're in the sequence.
        var dbcsCode = this.seqObj[DEF_CHAR];
        if (dbcsCode !== undefined) { // Write beginning of the sequence.
            if (dbcsCode < 0x100) {
                newBuf[j++] = dbcsCode;
            }
            else {
                newBuf[j++] = dbcsCode >> 8;   // high byte
                newBuf[j++] = dbcsCode & 0xFF; // low byte
            }
        } else {
            // See todo above.
        }
        this.seqObj = undefined;
    }

    if (this.leadSurrogate !== -1) {
        // Incomplete surrogate pair - only lead surrogate found.
        newBuf[j++] = this.defaultCharSingleByte;
        this.leadSurrogate = -1;
    }
    
    return newBuf.slice(0, j);
}

// Export for testing
DBCSEncoder.prototype.findIdx = findIdx;


// == Decoder ==================================================================

function DBCSDecoder(options, codec) {
    // Decoder state
    this.nodeIdx = 0;
    this.prevBuf = Buffer.alloc(0);

    // Static data
    this.decodeTables = codec.decodeTables;
    this.decodeTableSeq = codec.decodeTableSeq;
    this.defaultCharUnicode = codec.defaultCharUnicode;
    this.gb18030 = codec.gb18030;
}

DBCSDecoder.prototype.write = function(buf) {
    var newBuf = Buffer.alloc(buf.length*2),
        nodeIdx = this.nodeIdx, 
        prevBuf = this.prevBuf, prevBufOffset = this.prevBuf.length,
        seqStart = -this.prevBuf.length, // idx of the start of current parsed sequence.
        uCode;

    if (prevBufOffset > 0) // Make prev buf overlap a little to make it easier to slice later.
        prevBuf = Buffer.concat([prevBuf, buf.slice(0, 10)]);
    
    for (var i = 0, j = 0; i < buf.length; i++) {
        var curByte = (i >= 0) ? buf[i] : prevBuf[i + prevBufOffset];

        // Lookup in current trie node.
        var uCode = this.decodeTables[nodeIdx][curByte];

        if (uCode >= 0) { 
            // Normal character, just use it.
        }
        else if (uCode === UNASSIGNED) { // Unknown char.
            // TODO: Callback with seq.
            //var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);
            i = seqStart; // Try to parse again, after skipping first byte of the sequence ('i' will be incremented by 'for' cycle).
            uCode = this.defaultCharUnicode.charCodeAt(0);
        }
        else if (uCode === GB18030_CODE) {
            var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);
            var ptr = (curSeq[0]-0x81)*12600 + (curSeq[1]-0x30)*1260 + (curSeq[2]-0x81)*10 + (curSeq[3]-0x30);
            var idx = findIdx(this.gb18030.gbChars, ptr);
            uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx];
        }
        else if (uCode <= NODE_START) { // Go to next trie node.
            nodeIdx = NODE_START - uCode;
            continue;
        }
        else if (uCode <= SEQ_START) { // Output a sequence of chars.
            var seq = this.decodeTableSeq[SEQ_START - uCode];
            for (var k = 0; k < seq.length - 1; k++) {
                uCode = seq[k];
                newBuf[j++] = uCode & 0xFF;
                newBuf[j++] = uCode >> 8;
            }
            uCode = seq[seq.length-1];
        }
        else
            throw new Error("iconv-lite internal error: invalid decoding table value " + uCode + " at " + nodeIdx + "/" + curByte);

        // Write the character to buffer, handling higher planes using surrogate pair.
        if (uCode > 0xFFFF) { 
            uCode -= 0x10000;
            var uCodeLead = 0xD800 + Math.floor(uCode / 0x400);
            newBuf[j++] = uCodeLead & 0xFF;
            newBuf[j++] = uCodeLead >> 8;

            uCode = 0xDC00 + uCode % 0x400;
        }
        newBuf[j++] = uCode & 0xFF;
        newBuf[j++] = uCode >> 8;

        // Reset trie node.
        nodeIdx = 0; seqStart = i+1;
    }

    this.nodeIdx = nodeIdx;
    this.prevBuf = (seqStart >= 0) ? buf.slice(seqStart) : prevBuf.slice(seqStart + prevBufOffset);
    return newBuf.slice(0, j).toString('ucs2');
}

DBCSDecoder.prototype.end = function() {
    var ret = '';

    // Try to parse all remaining chars.
    while (this.prevBuf.length > 0) {
        // Skip 1 character in the buffer.
        ret += this.defaultCharUnicode;
        var buf = this.prevBuf.slice(1);

        // Parse remaining as usual.
        this.prevBuf = Buffer.alloc(0);
        this.nodeIdx = 0;
        if (buf.length > 0)
            ret += this.write(buf);
    }

    this.nodeIdx = 0;
    return ret;
}

// Binary search for GB18030. Returns largest i such that table[i] <= val.
function findIdx(table, val) {
    if (table[0] > val)
        return -1;

    var l = 0, r = table.length;
    while (l < r-1) { // always table[l] <= val < table[r]
        var mid = l + Math.floor((r-l+1)/2);
        if (table[mid] <= val)
            l = mid;
        else
            r = mid;
    }
    return l;
}

"use strict";

// Description of supported double byte encodings and aliases.
// Tables are not require()-d until they are needed to speed up library load.
// require()-s are direct to support Browserify.

module.exports = {
    
    // == Japanese/ShiftJIS ====================================================
    // All japanese encodings are based on JIS X set of standards:
    // JIS X 0201 - Single-byte encoding of ASCII + Â¥ + Kana chars at 0xA1-0xDF.
    // JIS X 0208 - Main set of 6879 characters, placed in 94x94 plane, to be encoded by 2 bytes. 
    //              Has several variations in 1978, 1983, 1990 and 1997.
    // JIS X 0212 - Supplementary plane of 6067 chars in 94x94 plane. 1990. Effectively dead.
    // JIS X 0213 - Extension and modern replacement of 0208 and 0212. Total chars: 11233.
    //              2 planes, first is superset of 0208, second - revised 0212.
    //              Introduced in 2000, revised 2004. Some characters are in Unicode Plane 2 (0x2xxxx)

    // Byte encodings are:
    //  * Shift_JIS: Compatible with 0201, uses not defined chars in top half as lead bytes for double-byte
    //               encoding of 0208. Lead byte ranges: 0x81-0x9F, 0xE0-0xEF; Trail byte ranges: 0x40-0x7E, 0x80-0x9E, 0x9F-0xFC.
    //               Windows CP932 is a superset of Shift_JIS. Some companies added more chars, notably KDDI.
    //  * EUC-JP:    Up to 3 bytes per character. Used mostly on *nixes.
    //               0x00-0x7F       - lower part of 0201
    //               0x8E, 0xA1-0xDF - upper part of 0201
    //               (0xA1-0xFE)x2   - 0208 plane (94x94).
    //               0x8F, (0xA1-0xFE)x2 - 0212 plane (94x94).
    //  * JIS X 208: 7-bit, direct encoding of 0208. Byte ranges: 0x21-0x7E (94 values). Uncommon.
    //               Used as-is in ISO2022 family.
    //  * ISO2022-JP: Stateful encoding, with escape sequences to switch between ASCII, 
    //                0201-1976 Roman, 0208-1978, 0208-1983.
    //  * ISO2022-JP-1: Adds esc seq for 0212-1990.
    //  * ISO2022-JP-2: Adds esc seq for GB2313-1980, KSX1001-1992, ISO8859-1, ISO8859-7.
    //  * ISO2022-JP-3: Adds esc seq for 0201-1976 Kana set, 0213-2000 Planes 1, 2.
    //  * ISO2022-JP-2004: Adds 0213-2004 Plane 1.
    //
    // After JIS X 0213 appeared, Shift_JIS-2004, EUC-JISX0213 and ISO2022-JP-2004 followed, with just changing the planes.
    //
    // Overall, it seems that it's a mess :( http://www8.plala.or.jp/tkubota1/unicode-symbols-map2.html

    'shiftjis': {
        type: '_dbcs',
        table: function() { return require('./tables/shiftjis.json') },
        encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
        encodeSkipVals: [{from: 0xED40, to: 0xF940}],
    },
    'csshiftjis': 'shiftjis',
    'mskanji': 'shiftjis',
    'sjis': 'shiftjis',
    'windows31j': 'shiftjis',
    'ms31j': 'shiftjis',
    'xsjis': 'shiftjis',
    'windows932': 'shiftjis',
    'ms932': 'shiftjis',
    '932': 'shiftjis',
    'cp932': 'shiftjis',

    'eucjp': {
        type: '_dbcs',
        table: function() { return require('./tables/eucjp.json') },
        encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
    },

    // TODO: KDDI extension to Shift_JIS
    // TODO: IBM CCSID 942 = CP932, but F0-F9 custom chars and other char changes.
    // TODO: IBM CCSID 943 = Shift_JIS = CP932 with original Shift_JIS lower 128 chars.


    // == Chinese/GBK ==========================================================
    // http://en.wikipedia.org/wiki/GBK
    // We mostly implement W3C recommendation: https://www.w3.org/TR/encoding/#gbk-encoder

    // Oldest GB2312 (1981, ~7600 chars) is a subset of CP936
    'gb2312': 'cp936',
    'gb231280': 'cp936',
    'gb23121980': 'cp936',
    'csgb2312': 'cp936',
    'csiso58gb231280': 'cp936',
    'euccn': 'cp936',

    // Microsoft's CP936 is a subset and approximation of GBK.
    'windows936': 'cp936',
    'ms936': 'cp936',
    '936': 'cp936',
    'cp936': {
        type: '_dbcs',
        table: function() { return require('./tables/cp936.json') },
    },

    // GBK (~22000 chars) is an extension of CP936 that added user-mapped chars and some other.
    'gbk': {
        type: '_dbcs',
        table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },
    },
    'xgbk': 'gbk',
    'isoir58': 'gbk',

    // GB18030 is an algorithmic extension of GBK.
    // Main source: https://www.w3.org/TR/encoding/#gbk-encoder
    // http://icu-project.org/docs/papers/gb18030.html
    // http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml
    // http://www.khngai.com/chinese/charmap/tblgbk.php?page=0
    'gb18030': {
        type: '_dbcs',
        table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },
        gb18030: function() { return require('./tables/gb18030-ranges.json') },
        encodeSkipVals: [0x80],
        encodeAdd: {'â‚¬': 0xA2E3},
    },

    'chinese': 'gb18030',


    // == Korean ===============================================================
    // EUC-KR, KS_C_5601 and KS X 1001 are exactly the same.
    'windows949': 'cp949',
    'ms949': 'cp949',
    '949': 'cp949',
    'cp949': {
        type: '_dbcs',
        table: function() { return require('./tables/cp949.json') },
    },

    'cseuckr': 'cp949',
    'csksc56011987': 'cp949',
    'euckr': 'cp949',
    'isoir149': 'cp949',
    'korean': 'cp949',
    'ksc56011987': 'cp949',
    'ksc56011989': 'cp949',
    'ksc5601': 'cp949',


    // == Big5/Taiwan/Hong Kong ================================================
    // There are lots of tables for Big5 and cp950. Please see the following links for history:
    // http://moztw.org/docs/big5/  http://www.haible.de/bruno/charsets/conversion-tables/Big5.html
    // Variations, in roughly number of defined chars:
    //  * Windows CP 950: Microsoft variant of Big5. Canonical: http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT
    //  * Windows CP 951: Microsoft variant of Big5-HKSCS-2001. Seems to be never public. http://me.abelcheung.org/articles/research/what-is-cp951/
    //  * Big5-2003 (Taiwan standard) almost superset of cp950.
    //  * Unicode-at-on (UAO) / Mozilla 1.8. Falling out of use on the Web. Not supported by other browsers.
    //  * Big5-HKSCS (-2001, -2004, -2008). Hong Kong standard. 
    //    many unicode code points moved from PUA to Supplementary plane (U+2XXXX) over the years.
    //    Plus, it has 4 combining sequences.
    //    Seems that Mozilla refused to support it for 10 yrs. https://bugzilla.mozilla.org/show_bug.cgi?id=162431 https://bugzilla.mozilla.org/show_bug.cgi?id=310299
    //    because big5-hkscs is the only encoding to include astral characters in non-algorithmic way.
    //    Implementations are not consistent within browsers; sometimes labeled as just big5.
    //    MS Internet Explorer switches from big5 to big5-hkscs when a patch applied.
    //    Great discussion & recap of what's going on https://bugzilla.mozilla.org/show_bug.cgi?id=912470#c31
    //    In the encoder, it might make sense to support encoding old PUA mappings to Big5 bytes seq-s.
    //    Official spec: http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/2003cmp_2008.txt
    //                   http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/terms/doc/hkscs-2008-big5-iso.txt
    // 
    // Current understanding of how to deal with Big5(-HKSCS) is in the Encoding Standard, http://encoding.spec.whatwg.org/#big5-encoder
    // Unicode mapping (http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT) is said to be wrong.

    'windows950': 'cp950',
    'ms950': 'cp950',
    '950': 'cp950',
    'cp950': {
        type: '_dbcs',
        table: function() { return require('./tables/cp950.json') },
    },

    // Big5 has many variations and is an extension of cp950. We use Encoding Standard's as a consensus.
    'big5': 'big5hkscs',
    'big5hkscs': {
        type: '_dbcs',
        table: function() { return require('./tables/cp950.json').concat(require('./tables/big5-added.json')) },
        encodeSkipVals: [0xa2cc],
    },

    'cnbig5': 'big5hkscs',
    'csbig5': 'big5hkscs',
    'xxbig5': 'big5hkscs',
};
"use strict";

// Update this array if you add/rename/remove files in this directory.
// We support Browserify by skipping automatic module discovery and requiring modules directly.
var modules = [
    require("./internal"),
    require("./utf16"),
    require("./utf7"),
    require("./sbcs-codec"),
    require("./sbcs-data"),
    require("./sbcs-data-generated"),
    require("./dbcs-codec"),
    require("./dbcs-data"),
];

// Put all encoding/alias/codec definitions to single object and export it. 
for (var i = 0; i < modules.length; i++) {
    var module = modules[i];
    for (var enc in module)
        if (Object.prototype.hasOwnProperty.call(module, enc))
            exports[enc] = module[enc];
}
"use strict";
var Buffer = require("safer-buffer").Buffer;

// Export Node.js internal encodings.

module.exports = {
    // Encodings
    utf8:   { type: "_internal", bomAware: true},
    cesu8:  { type: "_internal", bomAware: true},
    unicode11utf8: "utf8",

    ucs2:   { type: "_internal", bomAware: true},
    utf16le: "ucs2",

    binary: { type: "_internal" },
    base64: { type: "_internal" },
    hex:    { type: "_internal" },

    // Codec.
    _internal: InternalCodec,
};

//------------------------------------------------------------------------------

function InternalCodec(codecOptions, iconv) {
    this.enc = codecOptions.encodingName;
    this.bomAware = codecOptions.bomAware;

    if (this.enc === "base64")
        this.encoder = InternalEncoderBase64;
    else if (this.enc === "cesu8") {
        this.enc = "utf8"; // Use utf8 for decoding.
        this.encoder = InternalEncoderCesu8;

        // Add decoder for versions of Node not supporting CESU-8
        if (Buffer.from('eda0bdedb2a9', 'hex').toString() !== 'ðŸ’©') {
            this.decoder = InternalDecoderCesu8;
            this.defaultCharUnicode = iconv.defaultCharUnicode;
        }
    }
}

InternalCodec.prototype.encoder = InternalEncoder;
InternalCodec.prototype.decoder = InternalDecoder;

//------------------------------------------------------------------------------

// We use node.js internal decoder. Its signature is the same as ours.
var StringDecoder = require('string_decoder').StringDecoder;

if (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method.
    StringDecoder.prototype.end = function() {};


function InternalDecoder(options, codec) {
    StringDecoder.call(this, codec.enc);
}

InternalDecoder.prototype = StringDecoder.prototype;


//------------------------------------------------------------------------------
// Encoder is mostly trivial

function InternalEncoder(options, codec) {
    this.enc = codec.enc;
}

InternalEncoder.prototype.write = function(str) {
    return Buffer.from(str, this.enc);
}

InternalEncoder.prototype.end = function() {
}


//------------------------------------------------------------------------------
// Except base64 encoder, which must keep its state.

function InternalEncoderBase64(options, codec) {
    this.prevStr = '';
}

InternalEncoderBase64.prototype.write = function(str) {
    str = this.prevStr + str;
    var completeQuads = str.length - (str.length % 4);
    this.prevStr = str.slice(completeQuads);
    str = str.slice(0, completeQuads);

    return Buffer.from(str, "base64");
}

InternalEncoderBase64.prototype.end = function() {
    return Buffer.from(this.prevStr, "base64");
}


//------------------------------------------------------------------------------
// CESU-8 encoder is also special.

function InternalEncoderCesu8(options, codec) {
}

InternalEncoderCesu8.prototype.write = function(str) {
    var buf = Buffer.alloc(str.length * 3), bufIdx = 0;
    for (var i = 0; i < str.length; i++) {
        var charCode = str.charCodeAt(i);
        // Naive implementation, but it works because CESU-8 is especially easy
        // to convert from UTF-16 (which all JS strings are encoded in).
        if (charCode < 0x80)
            buf[bufIdx++] = charCode;
        else if (charCode < 0x800) {
            buf[bufIdx++] = 0xC0 + (charCode >>> 6);
            buf[bufIdx++] = 0x80 + (charCode & 0x3f);
        }
        else { // charCode will always be < 0x10000 in javascript.
            buf[bufIdx++] = 0xE0 + (charCode >>> 12);
            buf[bufIdx++] = 0x80 + ((charCode >>> 6) & 0x3f);
            buf[bufIdx++] = 0x80 + (charCode & 0x3f);
        }
    }
    return buf.slice(0, bufIdx);
}

InternalEncoderCesu8.prototype.end = function() {
}

//------------------------------------------------------------------------------
// CESU-8 decoder is not implemented in Node v4.0+

function InternalDecoderCesu8(options, codec) {
    this.acc = 0;
    this.contBytes = 0;
    this.accBytes = 0;
    this.defaultCharUnicode = codec.defaultCharUnicode;
}

InternalDecoderCesu8.prototype.write = function(buf) {
    var acc = this.acc, contBytes = this.contBytes, accBytes = this.accBytes, 
        res = '';
    for (var i = 0; i < buf.length; i++) {
        var curByte = buf[i];
        if ((curByte & 0xC0) !== 0x80) { // Leading byte
            if (contBytes > 0) { // Previous code is invalid
                res += this.defaultCharUnicode;
                contBytes = 0;
            }

            if (curByte < 0x80) { // Single-byte code
                res += String.fromCharCode(curByte);
            } else if (curByte < 0xE0) { // Two-byte code
                acc = curByte & 0x1F;
                contBytes = 1; accBytes = 1;
            } else if (curByte < 0xF0) { // Three-byte code
                acc = curByte & 0x0F;
                contBytes = 2; accBytes = 1;
            } else { // Four or more are not supported for CESU-8.
                res += this.defaultCharUnicode;
            }
        } else { // Continuation byte
            if (contBytes > 0) { // We're waiting for it.
                acc = (acc << 6) | (curByte & 0x3f);
                contBytes--; accBytes++;
                if (contBytes === 0) {
                    // Check for overlong encoding, but support Modified UTF-8 (encoding NULL as C0 80)
                    if (accBytes === 2 && acc < 0x80 && acc > 0)
                        res += this.defaultCharUnicode;
                    else if (accBytes === 3 && acc < 0x800)
                        res += this.defaultCharUnicode;
                    else
                        // Actually add character.
                        res += String.fromCharCode(acc);
                }
            } else { // Unexpected continuation byte
                res += this.defaultCharUnicode;
            }
        }
    }
    this.acc = acc; this.contBytes = contBytes; this.accBytes = accBytes;
    return res;
}

InternalDecoderCesu8.prototype.end = function() {
    var res = 0;
    if (this.contBytes > 0)
        res += this.defaultCharUnicode;
    return res;
}
"use strict";
var Buffer = require("safer-buffer").Buffer;

// Single-byte codec. Needs a 'chars' string parameter that contains 256 or 128 chars that
// correspond to encoded bytes (if 128 - then lower half is ASCII). 

exports._sbcs = SBCSCodec;
function SBCSCodec(codecOptions, iconv) {
    if (!codecOptions)
        throw new Error("SBCS codec is called without the data.")
    
    // Prepare char buffer for decoding.
    if (!codecOptions.chars || (codecOptions.chars.length !== 128 && codecOptions.chars.length !== 256))
        throw new Error("Encoding '"+codecOptions.type+"' has incorrect 'chars' (must be of len 128 or 256)");
    
    if (codecOptions.chars.length === 128) {
        var asciiString = "";
        for (var i = 0; i < 128; i++)
            asciiString += String.fromCharCode(i);
        codecOptions.chars = asciiString + codecOptions.chars;
    }

    this.decodeBuf = Buffer.from(codecOptions.chars, 'ucs2');
    
    // Encoding buffer.
    var encodeBuf = Buffer.alloc(65536, iconv.defaultCharSingleByte.charCodeAt(0));

    for (var i = 0; i < codecOptions.chars.length; i++)
        encodeBuf[codecOptions.chars.charCodeAt(i)] = i;

    this.encodeBuf = encodeBuf;
}

SBCSCodec.prototype.encoder = SBCSEncoder;
SBCSCodec.prototype.decoder = SBCSDecoder;


function SBCSEncoder(options, codec) {
    this.encodeBuf = codec.encodeBuf;
}

SBCSEncoder.prototype.write = function(str) {
    var buf = Buffer.alloc(str.length);
    for (var i = 0; i < str.length; i++)
        buf[i] = this.encodeBuf[str.charCodeAt(i)];
    
    return buf;
}

SBCSEncoder.prototype.end = function() {
}


function SBCSDecoder(options, codec) {
    this.decodeBuf = codec.decodeBuf;
}

SBCSDecoder.prototype.write = function(buf) {
    // Strings are immutable in JS -> we use ucs2 buffer to speed up computations.
    var decodeBuf = this.decodeBuf;
    var newBuf = Buffer.alloc(buf.length*2);
    var idx1 = 0, idx2 = 0;
    for (var i = 0; i < buf.length; i++) {
        idx1 = buf[i]*2; idx2 = i*2;
        newBuf[idx2] = decodeBuf[idx1];
        newBuf[idx2+1] = decodeBuf[idx1+1];
    }
    return newBuf.toString('ucs2');
}

SBCSDecoder.prototype.end = function() {
}
"use strict";

// Generated data for sbcs codec. Don't edit manually. Regenerate using generation/gen-sbcs.js script.
module.exports = {
  "437": "cp437",
  "737": "cp737",
  "775": "cp775",
  "850": "cp850",
  "852": "cp852",
  "855": "cp855",
  "856": "cp856",
  "857": "cp857",
  "858": "cp858",
  "860": "cp860",
  "861": "cp861",
  "862": "cp862",
  "863": "cp863",
  "864": "cp864",
  "865": "cp865",
  "866": "cp866",
  "869": "cp869",
  "874": "windows874",
  "922": "cp922",
  "1046": "cp1046",
  "1124": "cp1124",
  "1125": "cp1125",
  "1129": "cp1129",
  "1133": "cp1133",
  "1161": "cp1161",
  "1162": "cp1162",
  "1163": "cp1163",
  "1250": "windows1250",
  "1251": "windows1251",
  "1252": "windows1252",
  "1253": "windows1253",
  "1254": "windows1254",
  "1255": "windows1255",
  "1256": "windows1256",
  "1257": "windows1257",
  "1258": "windows1258",
  "28591": "iso88591",
  "28592": "iso88592",
  "28593": "iso88593",
  "28594": "iso88594",
  "28595": "iso88595",
  "28596": "iso88596",
  "28597": "iso88597",
  "28598": "iso88598",
  "28599": "iso88599",
  "28600": "iso885910",
  "28601": "iso885911",
  "28603": "iso885913",
  "28604": "iso885914",
  "28605": "iso885915",
  "28606": "iso885916",
  "windows874": {
    "type": "_sbcs",
    "chars": "â‚¬ï¿½ï¿½ï¿½ï¿½â€¦ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½â€˜â€™â€œâ€�â€¢â€“â€”ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Â à¸�à¸‚à¸ƒà¸„à¸…à¸†à¸‡à¸ˆà¸‰à¸Šà¸‹à¸Œà¸�à¸Žà¸�à¸�à¸‘à¸’à¸“à¸”à¸•à¸–à¸—à¸˜à¸™à¸šà¸›à¸œà¸�à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï¿½ï¿½ï¿½ï¿½à¸¿à¹€à¹�à¹‚à¹ƒà¹„à¹…à¹†à¹‡à¹ˆà¹‰à¹Šà¹‹à¹Œà¹�à¹Žà¹�à¹�à¹‘à¹’à¹“à¹”à¹•à¹–à¹—à¹˜à¹™à¹šà¹›ï¿½ï¿½ï¿½ï¿½"
  },
  "win874": "windows874",
  "cp874": "windows874",
  "windows1250": {
    "type": "_sbcs",
    "chars": "â‚¬ï¿½â€šï¿½â€žâ€¦â€ â€¡ï¿½â€°Å â€¹ÅšÅ¤Å½Å¹ï¿½â€˜â€™â€œâ€�â€¢â€“â€”ï¿½â„¢Å¡â€ºÅ›Å¥Å¾ÅºÂ Ë‡Ë˜Å�Â¤Ä„Â¦Â§Â¨Â©ÅžÂ«Â¬Â­Â®Å»Â°Â±Ë›Å‚Â´ÂµÂ¶Â·Â¸Ä…ÅŸÂ»Ä½Ë�Ä¾Å¼Å”Ã�Ã‚Ä‚Ã„Ä¹Ä†Ã‡ÄŒÃ‰Ä˜Ã‹ÄšÃ�ÃŽÄŽÄ�ÅƒÅ‡Ã“Ã”Å�Ã–Ã—Å˜Å®ÃšÅ°ÃœÃ�Å¢ÃŸÅ•Ã¡Ã¢ÄƒÃ¤ÄºÄ‡Ã§Ä�Ã©Ä™Ã«Ä›Ã­Ã®Ä�Ä‘Å„ÅˆÃ³Ã´Å‘Ã¶Ã·Å™Å¯ÃºÅ±Ã¼Ã½Å£Ë™"
  },
  "win1250": "windows1250",
  "cp1250": "windows1250",
  "windows1251": {
    "type": "_sbcs",
    "chars": "Ð‚Ðƒâ€šÑ“â€žâ€¦â€ â€¡â‚¬â€°Ð‰â€¹ÐŠÐŒÐ‹Ð�Ñ’â€˜â€™â€œâ€�â€¢â€“â€”ï¿½â„¢Ñ™â€ºÑšÑœÑ›ÑŸÂ ÐŽÑžÐˆÂ¤Ò�Â¦Â§Ð�Â©Ð„Â«Â¬Â­Â®Ð‡Â°Â±Ð†Ñ–Ò‘ÂµÂ¶Â·Ñ‘â„–Ñ”Â»Ñ˜Ð…Ñ•Ñ—Ð�Ð‘Ð’Ð“Ð”Ð•Ð–Ð—Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ Ð¡Ð¢Ð£Ð¤Ð¥Ð¦Ð§Ð¨Ð©ÐªÐ«Ð¬Ð­Ð®Ð¯Ð°Ð±Ð²Ð³Ð´ÐµÐ¶Ð·Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿Ñ€Ñ�Ñ‚ÑƒÑ„Ñ…Ñ†Ñ‡ÑˆÑ‰ÑŠÑ‹ÑŒÑ�ÑŽÑ�"
  },
  "win1251": "windows1251",
  "cp1251": "windows1251",
  "windows1252": {
    "type": "_sbcs",
    "chars": "â‚¬ï¿½â€šÆ’â€žâ€¦â€ â€¡Ë†â€°Å â€¹Å’ï¿½Å½ï¿½ï¿½â€˜â€™â€œâ€�â€¢â€“â€”Ëœâ„¢Å¡â€ºÅ“ï¿½Å¾Å¸Â Â¡Â¢Â£Â¤Â¥Â¦Â§Â¨Â©ÂªÂ«Â¬Â­Â®Â¯Â°Â±Â²Â³Â´ÂµÂ¶Â·Â¸Â¹ÂºÂ»Â¼Â½Â¾Â¿Ã€Ã�Ã‚ÃƒÃ„Ã…Ã†Ã‡ÃˆÃ‰ÃŠÃ‹ÃŒÃ�ÃŽÃ�Ã�Ã‘Ã’Ã“Ã”Ã•Ã–Ã—Ã˜Ã™ÃšÃ›ÃœÃ�ÃžÃŸÃ Ã¡Ã¢Ã£Ã¤Ã¥Ã¦Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯Ã°Ã±Ã²Ã³Ã´ÃµÃ¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Ã½Ã¾Ã¿"
  },
  "win1252": "windows1252",
  "cp1252": "windows1252",
  "windows1253": {
    "type": "_sbcs",
    "chars": "â‚¬ï¿½â€šÆ’â€žâ€¦â€ â€¡ï¿½â€°ï¿½â€¹ï¿½ï¿½ï¿½ï¿½ï¿½â€˜â€™â€œâ€�â€¢â€“â€”ï¿½â„¢ï¿½â€ºï¿½ï¿½ï¿½ï¿½Â Î…Î†Â£Â¤Â¥Â¦Â§Â¨Â©ï¿½Â«Â¬Â­Â®â€•Â°Â±Â²Â³Î„ÂµÂ¶Â·ÎˆÎ‰ÎŠÂ»ÎŒÂ½ÎŽÎ�Î�Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎ�ÎžÎŸÎ Î¡ï¿½Î£Î¤Î¥Î¦Î§Î¨Î©ÎªÎ«Î¬Î­Î®Î¯Î°Î±Î²Î³Î´ÎµÎ¶Î·Î¸Î¹ÎºÎ»Î¼Î½Î¾Î¿Ï€Ï�Ï‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰ÏŠÏ‹ÏŒÏ�ÏŽï¿½"
  },
  "win1253": "windows1253",
  "cp1253": "windows1253",
  "windows1254": {
    "type": "_sbcs",
    "chars": "â‚¬ï¿½â€šÆ’â€žâ€¦â€ â€¡Ë†â€°Å â€¹Å’ï¿½ï¿½ï¿½ï¿½â€˜â€™â€œâ€�â€¢â€“â€”Ëœâ„¢Å¡â€ºÅ“ï¿½ï¿½Å¸Â Â¡Â¢Â£Â¤Â¥Â¦Â§Â¨Â©ÂªÂ«Â¬Â­Â®Â¯Â°Â±Â²Â³Â´ÂµÂ¶Â·Â¸Â¹ÂºÂ»Â¼Â½Â¾Â¿Ã€Ã�Ã‚ÃƒÃ„Ã…Ã†Ã‡ÃˆÃ‰ÃŠÃ‹ÃŒÃ�ÃŽÃ�ÄžÃ‘Ã’Ã“Ã”Ã•Ã–Ã—Ã˜Ã™ÃšÃ›ÃœÄ°ÅžÃŸÃ Ã¡Ã¢Ã£Ã¤Ã¥Ã¦Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯ÄŸÃ±Ã²Ã³Ã´ÃµÃ¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Ä±ÅŸÃ¿"
  },
  "win1254": "windows1254",
  "cp1254": "windows1254",
  "windows1255": {
    "type": "_sbcs",
    "chars": "â‚¬ï¿½â€šÆ’â€žâ€¦â€ â€¡Ë†â€°ï¿½â€¹ï¿½ï¿½ï¿½ï¿½ï¿½â€˜â€™â€œâ€�â€¢â€“â€”Ëœâ„¢ï¿½â€ºï¿½ï¿½ï¿½ï¿½Â Â¡Â¢Â£â‚ªÂ¥Â¦Â§Â¨Â©Ã—Â«Â¬Â­Â®Â¯Â°Â±Â²Â³Â´ÂµÂ¶Â·Â¸Â¹Ã·Â»Â¼Â½Â¾Â¿Ö°Ö±Ö²Ö³Ö´ÖµÖ¶Ö·Ö¸Ö¹ÖºÖ»Ö¼Ö½Ö¾Ö¿×€×�×‚×ƒ×°×±×²×³×´ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½×�×‘×’×“×”×•×–×—×˜×™×š×›×œ×�×ž×Ÿ× ×¡×¢×£×¤×¥×¦×§×¨×©×ªï¿½ï¿½â€Žâ€�ï¿½"
  },
  "win1255": "windows1255",
  "cp1255": "windows1255",
  "windows1256": {
    "type": "_sbcs",
    "chars": "â‚¬Ù¾â€šÆ’â€žâ€¦â€ â€¡Ë†â€°Ù¹â€¹Å’Ú†Ú˜ÚˆÚ¯â€˜â€™â€œâ€�â€¢â€“â€”Ú©â„¢Ú‘â€ºÅ“â€Œâ€�ÚºÂ ØŒÂ¢Â£Â¤Â¥Â¦Â§Â¨Â©Ú¾Â«Â¬Â­Â®Â¯Â°Â±Â²Â³Â´ÂµÂ¶Â·Â¸Â¹Ø›Â»Â¼Â½Â¾ØŸÛ�Ø¡Ø¢Ø£Ø¤Ø¥Ø¦Ø§Ø¨Ø©ØªØ«Ø¬Ø­Ø®Ø¯Ø°Ø±Ø²Ø³Ø´ØµØ¶Ã—Ø·Ø¸Ø¹ØºÙ€Ù�Ù‚ÙƒÃ Ù„Ã¢Ù…Ù†Ù‡ÙˆÃ§Ã¨Ã©ÃªÃ«Ù‰ÙŠÃ®Ã¯Ù‹ÙŒÙ�ÙŽÃ´Ù�Ù�Ã·Ù‘Ã¹Ù’Ã»Ã¼â€Žâ€�Û’"
  },
  "win1256": "windows1256",
  "cp1256": "windows1256",
  "windows1257": {
    "type": "_sbcs",
    "chars": "â‚¬ï¿½â€šï¿½â€žâ€¦â€ â€¡ï¿½â€°ï¿½â€¹ï¿½Â¨Ë‡Â¸ï¿½â€˜â€™â€œâ€�â€¢â€“â€”ï¿½â„¢ï¿½â€ºï¿½Â¯Ë›ï¿½Â ï¿½Â¢Â£Â¤ï¿½Â¦Â§Ã˜Â©Å–Â«Â¬Â­Â®Ã†Â°Â±Â²Â³Â´ÂµÂ¶Â·Ã¸Â¹Å—Â»Â¼Â½Â¾Ã¦Ä„Ä®Ä€Ä†Ã„Ã…Ä˜Ä’ÄŒÃ‰Å¹Ä–Ä¢Ä¶ÄªÄ»Å ÅƒÅ…Ã“ÅŒÃ•Ã–Ã—Å²Å�ÅšÅªÃœÅ»Å½ÃŸÄ…Ä¯Ä�Ä‡Ã¤Ã¥Ä™Ä“Ä�Ã©ÅºÄ—Ä£Ä·Ä«Ä¼Å¡Å„Å†Ã³Å�ÃµÃ¶Ã·Å³Å‚Å›Å«Ã¼Å¼Å¾Ë™"
  },
  "win1257": "windows1257",
  "cp1257": "windows1257",
  "windows1258": {
    "type": "_sbcs",
    "chars": "â‚¬ï¿½â€šÆ’â€žâ€¦â€ â€¡Ë†â€°ï¿½â€¹Å’ï¿½ï¿½ï¿½ï¿½â€˜â€™â€œâ€�â€¢â€“â€”Ëœâ„¢ï¿½â€ºÅ“ï¿½ï¿½Å¸Â Â¡Â¢Â£Â¤Â¥Â¦Â§Â¨Â©ÂªÂ«Â¬Â­Â®Â¯Â°Â±Â²Â³Â´ÂµÂ¶Â·Â¸Â¹ÂºÂ»Â¼Â½Â¾Â¿Ã€Ã�Ã‚Ä‚Ã„Ã…Ã†Ã‡ÃˆÃ‰ÃŠÃ‹Ì€Ã�ÃŽÃ�Ä�Ã‘Ì‰Ã“Ã”Æ Ã–Ã—Ã˜Ã™ÃšÃ›ÃœÆ¯ÌƒÃŸÃ Ã¡Ã¢ÄƒÃ¤Ã¥Ã¦Ã§Ã¨Ã©ÃªÃ«Ì�Ã­Ã®Ã¯Ä‘Ã±Ì£Ã³Ã´Æ¡Ã¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Æ°â‚«Ã¿"
  },
  "win1258": "windows1258",
  "cp1258": "windows1258",
  "iso88591": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Â¡Â¢Â£Â¤Â¥Â¦Â§Â¨Â©ÂªÂ«Â¬Â­Â®Â¯Â°Â±Â²Â³Â´ÂµÂ¶Â·Â¸Â¹ÂºÂ»Â¼Â½Â¾Â¿Ã€Ã�Ã‚ÃƒÃ„Ã…Ã†Ã‡ÃˆÃ‰ÃŠÃ‹ÃŒÃ�ÃŽÃ�Ã�Ã‘Ã’Ã“Ã”Ã•Ã–Ã—Ã˜Ã™ÃšÃ›ÃœÃ�ÃžÃŸÃ Ã¡Ã¢Ã£Ã¤Ã¥Ã¦Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯Ã°Ã±Ã²Ã³Ã´ÃµÃ¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Ã½Ã¾Ã¿"
  },
  "cp28591": "iso88591",
  "iso88592": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Ä„Ë˜Å�Â¤Ä½ÅšÂ§Â¨Å ÅžÅ¤Å¹Â­Å½Å»Â°Ä…Ë›Å‚Â´Ä¾Å›Ë‡Â¸Å¡ÅŸÅ¥ÅºË�Å¾Å¼Å”Ã�Ã‚Ä‚Ã„Ä¹Ä†Ã‡ÄŒÃ‰Ä˜Ã‹ÄšÃ�ÃŽÄŽÄ�ÅƒÅ‡Ã“Ã”Å�Ã–Ã—Å˜Å®ÃšÅ°ÃœÃ�Å¢ÃŸÅ•Ã¡Ã¢ÄƒÃ¤ÄºÄ‡Ã§Ä�Ã©Ä™Ã«Ä›Ã­Ã®Ä�Ä‘Å„ÅˆÃ³Ã´Å‘Ã¶Ã·Å™Å¯ÃºÅ±Ã¼Ã½Å£Ë™"
  },
  "cp28592": "iso88592",
  "iso88593": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Ä¦Ë˜Â£Â¤ï¿½Ä¤Â§Â¨Ä°ÅžÄžÄ´Â­ï¿½Å»Â°Ä§Â²Â³Â´ÂµÄ¥Â·Â¸Ä±ÅŸÄŸÄµÂ½ï¿½Å¼Ã€Ã�Ã‚ï¿½Ã„ÄŠÄˆÃ‡ÃˆÃ‰ÃŠÃ‹ÃŒÃ�ÃŽÃ�ï¿½Ã‘Ã’Ã“Ã”Ä Ã–Ã—ÄœÃ™ÃšÃ›ÃœÅ¬ÅœÃŸÃ Ã¡Ã¢ï¿½Ã¤Ä‹Ä‰Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯ï¿½Ã±Ã²Ã³Ã´Ä¡Ã¶Ã·Ä�Ã¹ÃºÃ»Ã¼Å­Å�Ë™"
  },
  "cp28593": "iso88593",
  "iso88594": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Ä„Ä¸Å–Â¤Ä¨Ä»Â§Â¨Å Ä’Ä¢Å¦Â­Å½Â¯Â°Ä…Ë›Å—Â´Ä©Ä¼Ë‡Â¸Å¡Ä“Ä£Å§ÅŠÅ¾Å‹Ä€Ã�Ã‚ÃƒÃ„Ã…Ã†Ä®ÄŒÃ‰Ä˜Ã‹Ä–Ã�ÃŽÄªÄ�Å…ÅŒÄ¶Ã”Ã•Ã–Ã—Ã˜Å²ÃšÃ›ÃœÅ¨ÅªÃŸÄ�Ã¡Ã¢Ã£Ã¤Ã¥Ã¦Ä¯Ä�Ã©Ä™Ã«Ä—Ã­Ã®Ä«Ä‘Å†Å�Ä·Ã´ÃµÃ¶Ã·Ã¸Å³ÃºÃ»Ã¼Å©Å«Ë™"
  },
  "cp28594": "iso88594",
  "iso88595": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Ð�Ð‚ÐƒÐ„Ð…Ð†Ð‡ÐˆÐ‰ÐŠÐ‹ÐŒÂ­ÐŽÐ�Ð�Ð‘Ð’Ð“Ð”Ð•Ð–Ð—Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ Ð¡Ð¢Ð£Ð¤Ð¥Ð¦Ð§Ð¨Ð©ÐªÐ«Ð¬Ð­Ð®Ð¯Ð°Ð±Ð²Ð³Ð´ÐµÐ¶Ð·Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿Ñ€Ñ�Ñ‚ÑƒÑ„Ñ…Ñ†Ñ‡ÑˆÑ‰ÑŠÑ‹ÑŒÑ�ÑŽÑ�â„–Ñ‘Ñ’Ñ“Ñ”Ñ•Ñ–Ñ—Ñ˜Ñ™ÑšÑ›ÑœÂ§ÑžÑŸ"
  },
  "cp28595": "iso88595",
  "iso88596": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ ï¿½ï¿½ï¿½Â¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ØŒÂ­ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ø›ï¿½ï¿½ï¿½ØŸï¿½Ø¡Ø¢Ø£Ø¤Ø¥Ø¦Ø§Ø¨Ø©ØªØ«Ø¬Ø­Ø®Ø¯Ø°Ø±Ø²Ø³Ø´ØµØ¶Ø·Ø¸Ø¹Øºï¿½ï¿½ï¿½ï¿½ï¿½Ù€Ù�Ù‚ÙƒÙ„Ù…Ù†Ù‡ÙˆÙ‰ÙŠÙ‹ÙŒÙ�ÙŽÙ�Ù�Ù‘Ù’ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½"
  },
  "cp28596": "iso88596",
  "iso88597": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ â€˜â€™Â£â‚¬â‚¯Â¦Â§Â¨Â©ÍºÂ«Â¬Â­ï¿½â€•Â°Â±Â²Â³Î„Î…Î†Â·ÎˆÎ‰ÎŠÂ»ÎŒÂ½ÎŽÎ�Î�Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎ�ÎžÎŸÎ Î¡ï¿½Î£Î¤Î¥Î¦Î§Î¨Î©ÎªÎ«Î¬Î­Î®Î¯Î°Î±Î²Î³Î´ÎµÎ¶Î·Î¸Î¹ÎºÎ»Î¼Î½Î¾Î¿Ï€Ï�Ï‚ÏƒÏ„Ï…Ï†Ï‡ÏˆÏ‰ÏŠÏ‹ÏŒÏ�ÏŽï¿½"
  },
  "cp28597": "iso88597",
  "iso88598": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ ï¿½Â¢Â£Â¤Â¥Â¦Â§Â¨Â©Ã—Â«Â¬Â­Â®Â¯Â°Â±Â²Â³Â´ÂµÂ¶Â·Â¸Â¹Ã·Â»Â¼Â½Â¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½â€—×�×‘×’×“×”×•×–×—×˜×™×š×›×œ×�×ž×Ÿ× ×¡×¢×£×¤×¥×¦×§×¨×©×ªï¿½ï¿½â€Žâ€�ï¿½"
  },
  "cp28598": "iso88598",
  "iso88599": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Â¡Â¢Â£Â¤Â¥Â¦Â§Â¨Â©ÂªÂ«Â¬Â­Â®Â¯Â°Â±Â²Â³Â´ÂµÂ¶Â·Â¸Â¹ÂºÂ»Â¼Â½Â¾Â¿Ã€Ã�Ã‚ÃƒÃ„Ã…Ã†Ã‡ÃˆÃ‰ÃŠÃ‹ÃŒÃ�ÃŽÃ�ÄžÃ‘Ã’Ã“Ã”Ã•Ã–Ã—Ã˜Ã™ÃšÃ›ÃœÄ°ÅžÃŸÃ Ã¡Ã¢Ã£Ã¤Ã¥Ã¦Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯ÄŸÃ±Ã²Ã³Ã´ÃµÃ¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Ä±ÅŸÃ¿"
  },
  "cp28599": "iso88599",
  "iso885910": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Ä„Ä’Ä¢ÄªÄ¨Ä¶Â§Ä»Ä�Å Å¦Å½Â­ÅªÅŠÂ°Ä…Ä“Ä£Ä«Ä©Ä·Â·Ä¼Ä‘Å¡Å§Å¾â€•Å«Å‹Ä€Ã�Ã‚ÃƒÃ„Ã…Ã†Ä®ÄŒÃ‰Ä˜Ã‹Ä–Ã�ÃŽÃ�Ã�Å…ÅŒÃ“Ã”Ã•Ã–Å¨Ã˜Å²ÃšÃ›ÃœÃ�ÃžÃŸÄ�Ã¡Ã¢Ã£Ã¤Ã¥Ã¦Ä¯Ä�Ã©Ä™Ã«Ä—Ã­Ã®Ã¯Ã°Å†Å�Ã³Ã´ÃµÃ¶Å©Ã¸Å³ÃºÃ»Ã¼Ã½Ã¾Ä¸"
  },
  "cp28600": "iso885910",
  "iso885911": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ à¸�à¸‚à¸ƒà¸„à¸…à¸†à¸‡à¸ˆà¸‰à¸Šà¸‹à¸Œà¸�à¸Žà¸�à¸�à¸‘à¸’à¸“à¸”à¸•à¸–à¸—à¸˜à¸™à¸šà¸›à¸œà¸�à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï¿½ï¿½ï¿½ï¿½à¸¿à¹€à¹�à¹‚à¹ƒà¹„à¹…à¹†à¹‡à¹ˆà¹‰à¹Šà¹‹à¹Œà¹�à¹Žà¹�à¹�à¹‘à¹’à¹“à¹”à¹•à¹–à¹—à¹˜à¹™à¹šà¹›ï¿½ï¿½ï¿½ï¿½"
  },
  "cp28601": "iso885911",
  "iso885913": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ â€�Â¢Â£Â¤â€žÂ¦Â§Ã˜Â©Å–Â«Â¬Â­Â®Ã†Â°Â±Â²Â³â€œÂµÂ¶Â·Ã¸Â¹Å—Â»Â¼Â½Â¾Ã¦Ä„Ä®Ä€Ä†Ã„Ã…Ä˜Ä’ÄŒÃ‰Å¹Ä–Ä¢Ä¶ÄªÄ»Å ÅƒÅ…Ã“ÅŒÃ•Ã–Ã—Å²Å�ÅšÅªÃœÅ»Å½ÃŸÄ…Ä¯Ä�Ä‡Ã¤Ã¥Ä™Ä“Ä�Ã©ÅºÄ—Ä£Ä·Ä«Ä¼Å¡Å„Å†Ã³Å�ÃµÃ¶Ã·Å³Å‚Å›Å«Ã¼Å¼Å¾â€™"
  },
  "cp28603": "iso885913",
  "iso885914": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ á¸‚á¸ƒÂ£ÄŠÄ‹á¸ŠÂ§áº€Â©áº‚á¸‹á»²Â­Â®Å¸á¸žá¸ŸÄ Ä¡á¹€á¹�Â¶á¹–áº�á¹—áºƒá¹ á»³áº„áº…á¹¡Ã€Ã�Ã‚ÃƒÃ„Ã…Ã†Ã‡ÃˆÃ‰ÃŠÃ‹ÃŒÃ�ÃŽÃ�Å´Ã‘Ã’Ã“Ã”Ã•Ã–á¹ªÃ˜Ã™ÃšÃ›ÃœÃ�Å¶ÃŸÃ Ã¡Ã¢Ã£Ã¤Ã¥Ã¦Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯ÅµÃ±Ã²Ã³Ã´ÃµÃ¶á¹«Ã¸Ã¹ÃºÃ»Ã¼Ã½Å·Ã¿"
  },
  "cp28604": "iso885914",
  "iso885915": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Â¡Â¢Â£â‚¬Â¥Å Â§Å¡Â©ÂªÂ«Â¬Â­Â®Â¯Â°Â±Â²Â³Å½ÂµÂ¶Â·Å¾Â¹ÂºÂ»Å’Å“Å¸Â¿Ã€Ã�Ã‚ÃƒÃ„Ã…Ã†Ã‡ÃˆÃ‰ÃŠÃ‹ÃŒÃ�ÃŽÃ�Ã�Ã‘Ã’Ã“Ã”Ã•Ã–Ã—Ã˜Ã™ÃšÃ›ÃœÃ�ÃžÃŸÃ Ã¡Ã¢Ã£Ã¤Ã¥Ã¦Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯Ã°Ã±Ã²Ã³Ã´ÃµÃ¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Ã½Ã¾Ã¿"
  },
  "cp28605": "iso885915",
  "iso885916": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Ä„Ä…Å�â‚¬â€žÅ Â§Å¡Â©È˜Â«Å¹Â­ÅºÅ»Â°Â±ÄŒÅ‚Å½â€�Â¶Â·Å¾Ä�È™Â»Å’Å“Å¸Å¼Ã€Ã�Ã‚Ä‚Ã„Ä†Ã†Ã‡ÃˆÃ‰ÃŠÃ‹ÃŒÃ�ÃŽÃ�Ä�ÅƒÃ’Ã“Ã”Å�Ã–ÅšÅ°Ã™ÃšÃ›ÃœÄ˜ÈšÃŸÃ Ã¡Ã¢ÄƒÃ¤Ä‡Ã¦Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯Ä‘Å„Ã²Ã³Ã´Å‘Ã¶Å›Å±Ã¹ÃºÃ»Ã¼Ä™È›Ã¿"
  },
  "cp28606": "iso885916",
  "cp437": {
    "type": "_sbcs",
    "chars": "Ã‡Ã¼Ã©Ã¢Ã¤Ã Ã¥Ã§ÃªÃ«Ã¨Ã¯Ã®Ã¬Ã„Ã…Ã‰Ã¦Ã†Ã´Ã¶Ã²Ã»Ã¹Ã¿Ã–ÃœÂ¢Â£Â¥â‚§Æ’Ã¡Ã­Ã³ÃºÃ±Ã‘ÂªÂºÂ¿âŒ�Â¬Â½Â¼Â¡Â«Â»â–‘â–’â–“â”‚â”¤â•¡â•¢â•–â••â•£â•‘â•—â•�â•œâ•›â”�â””â”´â”¬â”œâ”€â”¼â•žâ•Ÿâ•šâ•”â•©â•¦â• â•�â•¬â•§â•¨â•¤â•¥â•™â•˜â•’â•“â•«â•ªâ”˜â”Œâ–ˆâ–„â–Œâ–�â–€Î±ÃŸÎ“Ï€Î£ÏƒÂµÏ„Î¦Î˜Î©Î´âˆžÏ†Îµâˆ©â‰¡Â±â‰¥â‰¤âŒ âŒ¡Ã·â‰ˆÂ°âˆ™Â·âˆšâ�¿Â²â– Â "
  },
  "ibm437": "cp437",
  "csibm437": "cp437",
  "cp737": {
    "type": "_sbcs",
    "chars": "Î‘Î’Î“Î”Î•Î–Î—Î˜Î™ÎšÎ›ÎœÎ�ÎžÎŸÎ Î¡Î£Î¤Î¥Î¦Î§Î¨Î©Î±Î²Î³Î´ÎµÎ¶Î·Î¸Î¹ÎºÎ»Î¼Î½Î¾Î¿Ï€Ï�ÏƒÏ‚Ï„Ï…Ï†Ï‡Ïˆâ–‘â–’â–“â”‚â”¤â•¡â•¢â•–â••â•£â•‘â•—â•�â•œâ•›â”�â””â”´â”¬â”œâ”€â”¼â•žâ•Ÿâ•šâ•”â•©â•¦â• â•�â•¬â•§â•¨â•¤â•¥â•™â•˜â•’â•“â•«â•ªâ”˜â”Œâ–ˆâ–„â–Œâ–�â–€Ï‰Î¬Î­Î®ÏŠÎ¯ÏŒÏ�Ï‹ÏŽÎ†ÎˆÎ‰ÎŠÎŒÎŽÎ�Â±â‰¥â‰¤ÎªÎ«Ã·â‰ˆÂ°âˆ™Â·âˆšâ�¿Â²â– Â "
  },
  "ibm737": "cp737",
  "csibm737": "cp737",
  "cp775": {
    "type": "_sbcs",
    "chars": "Ä†Ã¼Ã©Ä�Ã¤Ä£Ã¥Ä‡Å‚Ä“Å–Å—Ä«Å¹Ã„Ã…Ã‰Ã¦Ã†Å�Ã¶Ä¢Â¢ÅšÅ›Ã–ÃœÃ¸Â£Ã˜Ã—Â¤Ä€ÄªÃ³Å»Å¼Åºâ€�Â¦Â©Â®Â¬Â½Â¼Å�Â«Â»â–‘â–’â–“â”‚â”¤Ä„ÄŒÄ˜Ä–â•£â•‘â•—â•�Ä®Å â”�â””â”´â”¬â”œâ”€â”¼Å²Åªâ•šâ•”â•©â•¦â• â•�â•¬Å½Ä…Ä�Ä™Ä—Ä¯Å¡Å³Å«Å¾â”˜â”Œâ–ˆâ–„â–Œâ–�â–€Ã“ÃŸÅŒÅƒÃµÃ•ÂµÅ„Ä¶Ä·Ä»Ä¼Å†Ä’Å…â€™Â­Â±â€œÂ¾Â¶Â§Ã·â€žÂ°âˆ™Â·Â¹Â³Â²â– Â "
  },
  "ibm775": "cp775",
  "csibm775": "cp775",
  "cp850": {
    "type": "_sbcs",
    "chars": "Ã‡Ã¼Ã©Ã¢Ã¤Ã Ã¥Ã§ÃªÃ«Ã¨Ã¯Ã®Ã¬Ã„Ã…Ã‰Ã¦Ã†Ã´Ã¶Ã²Ã»Ã¹Ã¿Ã–ÃœÃ¸Â£Ã˜Ã—Æ’Ã¡Ã­Ã³ÃºÃ±Ã‘ÂªÂºÂ¿Â®Â¬Â½Â¼Â¡Â«Â»â–‘â–’â–“â”‚â”¤Ã�Ã‚Ã€Â©â•£â•‘â•—â•�Â¢Â¥â”�â””â”´â”¬â”œâ”€â”¼Ã£Ãƒâ•šâ•”â•©â•¦â• â•�â•¬Â¤Ã°Ã�ÃŠÃ‹ÃˆÄ±Ã�ÃŽÃ�â”˜â”Œâ–ˆâ–„Â¦ÃŒâ–€Ã“ÃŸÃ”Ã’ÃµÃ•ÂµÃ¾ÃžÃšÃ›Ã™Ã½Ã�Â¯Â´Â­Â±â€—Â¾Â¶Â§Ã·Â¸Â°Â¨Â·Â¹Â³Â²â– Â "
  },
  "ibm850": "cp850",
  "csibm850": "cp850",
  "cp852": {
    "type": "_sbcs",
    "chars": "Ã‡Ã¼Ã©Ã¢Ã¤Å¯Ä‡Ã§Å‚Ã«Å�Å‘Ã®Å¹Ã„Ä†Ã‰Ä¹ÄºÃ´Ã¶Ä½Ä¾ÅšÅ›Ã–ÃœÅ¤Å¥Å�Ã—Ä�Ã¡Ã­Ã³ÃºÄ„Ä…Å½Å¾Ä˜Ä™Â¬ÅºÄŒÅŸÂ«Â»â–‘â–’â–“â”‚â”¤Ã�Ã‚ÄšÅžâ•£â•‘â•—â•�Å»Å¼â”�â””â”´â”¬â”œâ”€â”¼Ä‚Äƒâ•šâ•”â•©â•¦â• â•�â•¬Â¤Ä‘Ä�ÄŽÃ‹Ä�Å‡Ã�ÃŽÄ›â”˜â”Œâ–ˆâ–„Å¢Å®â–€Ã“ÃŸÃ”ÅƒÅ„ÅˆÅ Å¡Å”ÃšÅ•Å°Ã½Ã�Å£Â´Â­Ë�Ë›Ë‡Ë˜Â§Ã·Â¸Â°Â¨Ë™Å±Å˜Å™â– Â "
  },
  "ibm852": "cp852",
  "csibm852": "cp852",
  "cp855": {
    "type": "_sbcs",
    "chars": "Ñ’Ð‚Ñ“ÐƒÑ‘Ð�Ñ”Ð„Ñ•Ð…Ñ–Ð†Ñ—Ð‡Ñ˜ÐˆÑ™Ð‰ÑšÐŠÑ›Ð‹ÑœÐŒÑžÐŽÑŸÐ�ÑŽÐ®ÑŠÐªÐ°Ð�Ð±Ð‘Ñ†Ð¦Ð´Ð”ÐµÐ•Ñ„Ð¤Ð³Ð“Â«Â»â–‘â–’â–“â”‚â”¤Ñ…Ð¥Ð¸Ð˜â•£â•‘â•—â•�Ð¹Ð™â”�â””â”´â”¬â”œâ”€â”¼ÐºÐšâ•šâ•”â•©â•¦â• â•�â•¬Â¤Ð»Ð›Ð¼ÐœÐ½Ð�Ð¾ÐžÐ¿â”˜â”Œâ–ˆâ–„ÐŸÑ�â–€Ð¯Ñ€Ð Ñ�Ð¡Ñ‚Ð¢ÑƒÐ£Ð¶Ð–Ð²Ð’ÑŒÐ¬â„–Â­Ñ‹Ð«Ð·Ð—ÑˆÐ¨Ñ�Ð­Ñ‰Ð©Ñ‡Ð§Â§â– Â "
  },
  "ibm855": "cp855",
  "csibm855": "cp855",
  "cp856": {
    "type": "_sbcs",
    "chars": "×�×‘×’×“×”×•×–×—×˜×™×š×›×œ×�×ž×Ÿ× ×¡×¢×£×¤×¥×¦×§×¨×©×ªï¿½Â£ï¿½Ã—ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Â®Â¬Â½Â¼ï¿½Â«Â»â–‘â–’â–“â”‚â”¤ï¿½ï¿½ï¿½Â©â•£â•‘â•—â•�Â¢Â¥â”�â””â”´â”¬â”œâ”€â”¼ï¿½ï¿½â•šâ•”â•©â•¦â• â•�â•¬Â¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½â”˜â”Œâ–ˆâ–„Â¦ï¿½â–€ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Âµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Â¯Â´Â­Â±â€—Â¾Â¶Â§Ã·Â¸Â°Â¨Â·Â¹Â³Â²â– Â "
  },
  "ibm856": "cp856",
  "csibm856": "cp856",
  "cp857": {
    "type": "_sbcs",
    "chars": "Ã‡Ã¼Ã©Ã¢Ã¤Ã Ã¥Ã§ÃªÃ«Ã¨Ã¯Ã®Ä±Ã„Ã…Ã‰Ã¦Ã†Ã´Ã¶Ã²Ã»Ã¹Ä°Ã–ÃœÃ¸Â£Ã˜ÅžÅŸÃ¡Ã­Ã³ÃºÃ±Ã‘ÄžÄŸÂ¿Â®Â¬Â½Â¼Â¡Â«Â»â–‘â–’â–“â”‚â”¤Ã�Ã‚Ã€Â©â•£â•‘â•—â•�Â¢Â¥â”�â””â”´â”¬â”œâ”€â”¼Ã£Ãƒâ•šâ•”â•©â•¦â• â•�â•¬Â¤ÂºÂªÃŠÃ‹Ãˆï¿½Ã�ÃŽÃ�â”˜â”Œâ–ˆâ–„Â¦ÃŒâ–€Ã“ÃŸÃ”Ã’ÃµÃ•Âµï¿½Ã—ÃšÃ›Ã™Ã¬Ã¿Â¯Â´Â­Â±ï¿½Â¾Â¶Â§Ã·Â¸Â°Â¨Â·Â¹Â³Â²â– Â "
  },
  "ibm857": "cp857",
  "csibm857": "cp857",
  "cp858": {
    "type": "_sbcs",
    "chars": "Ã‡Ã¼Ã©Ã¢Ã¤Ã Ã¥Ã§ÃªÃ«Ã¨Ã¯Ã®Ã¬Ã„Ã…Ã‰Ã¦Ã†Ã´Ã¶Ã²Ã»Ã¹Ã¿Ã–ÃœÃ¸Â£Ã˜Ã—Æ’Ã¡Ã­Ã³ÃºÃ±Ã‘ÂªÂºÂ¿Â®Â¬Â½Â¼Â¡Â«Â»â–‘â–’â–“â”‚â”¤Ã�Ã‚Ã€Â©â•£â•‘â•—â•�Â¢Â¥â”�â””â”´â”¬â”œâ”€â”¼Ã£Ãƒâ•šâ•”â•©â•¦â• â•�â•¬Â¤Ã°Ã�ÃŠÃ‹Ãˆâ‚¬Ã�ÃŽÃ�â”˜â”Œâ–ˆâ–„Â¦ÃŒâ–€Ã“ÃŸÃ”Ã’ÃµÃ•ÂµÃ¾ÃžÃšÃ›Ã™Ã½Ã�Â¯Â´Â­Â±â€—Â¾Â¶Â§Ã·Â¸Â°Â¨Â·Â¹Â³Â²â– Â "
  },
  "ibm858": "cp858",
  "csibm858": "cp858",
  "cp860": {
    "type": "_sbcs",
    "chars": "Ã‡Ã¼Ã©Ã¢Ã£Ã Ã�Ã§ÃªÃŠÃ¨Ã�Ã”Ã¬ÃƒÃ‚Ã‰Ã€ÃˆÃ´ÃµÃ²ÃšÃ¹ÃŒÃ•ÃœÂ¢Â£Ã™â‚§Ã“Ã¡Ã­Ã³ÃºÃ±Ã‘ÂªÂºÂ¿Ã’Â¬Â½Â¼Â¡Â«Â»â–‘â–’â–“â”‚â”¤â•¡â•¢â•–â••â•£â•‘â•—â•�â•œâ•›â”�â””â”´â”¬â”œâ”€â”¼â•žâ•Ÿâ•šâ•”â•©â•¦â• â•�â•¬â•§â•¨â•¤â•¥â•™â•˜â•’â•“â•«â•ªâ”˜â”Œâ–ˆâ–„â–Œâ–�â–€Î±ÃŸÎ“Ï€Î£ÏƒÂµÏ„Î¦Î˜Î©Î´âˆžÏ†Îµâˆ©â‰¡Â±â‰¥â‰¤âŒ âŒ¡Ã·â‰ˆÂ°âˆ™Â·âˆšâ�¿Â²â– Â "
  },
  "ibm860": "cp860",
  "csibm860": "cp860",
  "cp861": {
    "type": "_sbcs",
    "chars": "Ã‡Ã¼Ã©Ã¢Ã¤Ã Ã¥Ã§ÃªÃ«Ã¨Ã�Ã°ÃžÃ„Ã…Ã‰Ã¦Ã†Ã´Ã¶Ã¾Ã»Ã�Ã½Ã–ÃœÃ¸Â£Ã˜â‚§Æ’Ã¡Ã­Ã³ÃºÃ�Ã�Ã“ÃšÂ¿âŒ�Â¬Â½Â¼Â¡Â«Â»â–‘â–’â–“â”‚â”¤â•¡â•¢â•–â••â•£â•‘â•—â•�â•œâ•›â”�â””â”´â”¬â”œâ”€â”¼â•žâ•Ÿâ•šâ•”â•©â•¦â• â•�â•¬â•§â•¨â•¤â•¥â•™â•˜â•’â•“â•«â•ªâ”˜â”Œâ–ˆâ–„â–Œâ–�â–€Î±ÃŸÎ“Ï€Î£ÏƒÂµÏ„Î¦Î˜Î©Î´âˆžÏ†Îµâˆ©â‰¡Â±â‰¥â‰¤âŒ âŒ¡Ã·â‰ˆÂ°âˆ™Â·âˆšâ�¿Â²â– Â "
  },
  "ibm861": "cp861",
  "csibm861": "cp861",
  "cp862": {
    "type": "_sbcs",
    "chars": "×�×‘×’×“×”×•×–×—×˜×™×š×›×œ×�×ž×Ÿ× ×¡×¢×£×¤×¥×¦×§×¨×©×ªÂ¢Â£Â¥â‚§Æ’Ã¡Ã­Ã³ÃºÃ±Ã‘ÂªÂºÂ¿âŒ�Â¬Â½Â¼Â¡Â«Â»â–‘â–’â–“â”‚â”¤â•¡â•¢â•–â••â•£â•‘â•—â•�â•œâ•›â”�â””â”´â”¬â”œâ”€â”¼â•žâ•Ÿâ•šâ•”â•©â•¦â• â•�â•¬â•§â•¨â•¤â•¥â•™â•˜â•’â•“â•«â•ªâ”˜â”Œâ–ˆâ–„â–Œâ–�â–€Î±ÃŸÎ“Ï€Î£ÏƒÂµÏ„Î¦Î˜Î©Î´âˆžÏ†Îµâˆ©â‰¡Â±â‰¥â‰¤âŒ âŒ¡Ã·â‰ˆÂ°âˆ™Â·âˆšâ�¿Â²â– Â "
  },
  "ibm862": "cp862",
  "csibm862": "cp862",
  "cp863": {
    "type": "_sbcs",
    "chars": "Ã‡Ã¼Ã©Ã¢Ã‚Ã Â¶Ã§ÃªÃ«Ã¨Ã¯Ã®â€—Ã€Â§Ã‰ÃˆÃŠÃ´Ã‹Ã�Ã»Ã¹Â¤Ã”ÃœÂ¢Â£Ã™Ã›Æ’Â¦Â´Ã³ÃºÂ¨Â¸Â³Â¯ÃŽâŒ�Â¬Â½Â¼Â¾Â«Â»â–‘â–’â–“â”‚â”¤â•¡â•¢â•–â••â•£â•‘â•—â•�â•œâ•›â”�â””â”´â”¬â”œâ”€â”¼â•žâ•Ÿâ•šâ•”â•©â•¦â• â•�â•¬â•§â•¨â•¤â•¥â•™â•˜â•’â•“â•«â•ªâ”˜â”Œâ–ˆâ–„â–Œâ–�â–€Î±ÃŸÎ“Ï€Î£ÏƒÂµÏ„Î¦Î˜Î©Î´âˆžÏ†Îµâˆ©â‰¡Â±â‰¥â‰¤âŒ âŒ¡Ã·â‰ˆÂ°âˆ™Â·âˆšâ�¿Â²â– Â "
  },
  "ibm863": "cp863",
  "csibm863": "cp863",
  "cp864": {
    "type": "_sbcs",
    "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$Ùª&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~Â°Â·âˆ™âˆšâ–’â”€â”‚â”¼â”¤â”¬â”œâ”´â”�â”Œâ””â”˜Î²âˆžÏ†Â±Â½Â¼â‰ˆÂ«Â»ï»·ï»¸ï¿½ï¿½ï»»ï»¼ï¿½Â Â­ïº‚Â£Â¤ïº„ï¿½ï¿½ïºŽïº�ïº•ïº™ØŒïº�ïº¡ïº¥Ù Ù¡Ù¢Ù£Ù¤Ù¥Ù¦Ù§Ù¨Ù©ï»‘Ø›ïº±ïºµïº¹ØŸÂ¢ïº€ïº�ïºƒïº…ï»Šïº‹ïº�ïº‘ïº“ïº—ïº›ïºŸïº£ïº§ïº©ïº«ïº­ïº¯ïº³ïº·ïº»ïº¿ï»�ï»…ï»‹ï»�Â¦Â¬Ã·Ã—ï»‰Ù€ï»“ï»—ï»›ï»Ÿï»£ï»§ï»«ï»­ï»¯ï»³ïº½ï»Œï»Žï»�ï»¡ï¹½Ù‘ï»¥ï»©ï»¬ï»°ï»²ï»�ï»•ï»µï»¶ï»�ï»™ï»±â– ï¿½"
  },
  "ibm864": "cp864",
  "csibm864": "cp864",
  "cp865": {
    "type": "_sbcs",
    "chars": "Ã‡Ã¼Ã©Ã¢Ã¤Ã Ã¥Ã§ÃªÃ«Ã¨Ã¯Ã®Ã¬Ã„Ã…Ã‰Ã¦Ã†Ã´Ã¶Ã²Ã»Ã¹Ã¿Ã–ÃœÃ¸Â£Ã˜â‚§Æ’Ã¡Ã­Ã³ÃºÃ±Ã‘ÂªÂºÂ¿âŒ�Â¬Â½Â¼Â¡Â«Â¤â–‘â–’â–“â”‚â”¤â•¡â•¢â•–â••â•£â•‘â•—â•�â•œâ•›â”�â””â”´â”¬â”œâ”€â”¼â•žâ•Ÿâ•šâ•”â•©â•¦â• â•�â•¬â•§â•¨â•¤â•¥â•™â•˜â•’â•“â•«â•ªâ”˜â”Œâ–ˆâ–„â–Œâ–�â–€Î±ÃŸÎ“Ï€Î£ÏƒÂµÏ„Î¦Î˜Î©Î´âˆžÏ†Îµâˆ©â‰¡Â±â‰¥â‰¤âŒ âŒ¡Ã·â‰ˆÂ°âˆ™Â·âˆšâ�¿Â²â– Â "
  },
  "ibm865": "cp865",
  "csibm865": "cp865",
  "cp866": {
    "type": "_sbcs",
    "chars": "Ð�Ð‘Ð’Ð“Ð”Ð•Ð–Ð—Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ Ð¡Ð¢Ð£Ð¤Ð¥Ð¦Ð§Ð¨Ð©ÐªÐ«Ð¬Ð­Ð®Ð¯Ð°Ð±Ð²Ð³Ð´ÐµÐ¶Ð·Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿â–‘â–’â–“â”‚â”¤â•¡â•¢â•–â••â•£â•‘â•—â•�â•œâ•›â”�â””â”´â”¬â”œâ”€â”¼â•žâ•Ÿâ•šâ•”â•©â•¦â• â•�â•¬â•§â•¨â•¤â•¥â•™â•˜â•’â•“â•«â•ªâ”˜â”Œâ–ˆâ–„â–Œâ–�â–€Ñ€Ñ�Ñ‚ÑƒÑ„Ñ…Ñ†Ñ‡ÑˆÑ‰ÑŠÑ‹ÑŒÑ�ÑŽÑ�Ð�Ñ‘Ð„Ñ”Ð‡Ñ—ÐŽÑžÂ°âˆ™Â·âˆšâ„–Â¤â– Â "
  },
  "ibm866": "cp866",
  "csibm866": "cp866",
  "cp869": {
    "type": "_sbcs",
    "chars": "ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î†ï¿½Â·Â¬Â¦â€˜â€™Îˆâ€•Î‰ÎŠÎªÎŒï¿½ï¿½ÎŽÎ«Â©Î�Â²Â³Î¬Â£Î­Î®Î¯ÏŠÎ�ÏŒÏ�Î‘Î’Î“Î”Î•Î–Î—Â½Î˜Î™Â«Â»â–‘â–’â–“â”‚â”¤ÎšÎ›ÎœÎ�â•£â•‘â•—â•�ÎžÎŸâ”�â””â”´â”¬â”œâ”€â”¼Î Î¡â•šâ•”â•©â•¦â• â•�â•¬Î£Î¤Î¥Î¦Î§Î¨Î©Î±Î²Î³â”˜â”Œâ–ˆâ–„Î´Îµâ–€Î¶Î·Î¸Î¹ÎºÎ»Î¼Î½Î¾Î¿Ï€Ï�ÏƒÏ‚Ï„Î„Â­Â±Ï…Ï†Ï‡Â§ÏˆÎ…Â°Â¨Ï‰Ï‹Î°ÏŽâ– Â "
  },
  "ibm869": "cp869",
  "csibm869": "cp869",
  "cp922": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Â¡Â¢Â£Â¤Â¥Â¦Â§Â¨Â©ÂªÂ«Â¬Â­Â®â€¾Â°Â±Â²Â³Â´ÂµÂ¶Â·Â¸Â¹ÂºÂ»Â¼Â½Â¾Â¿Ã€Ã�Ã‚ÃƒÃ„Ã…Ã†Ã‡ÃˆÃ‰ÃŠÃ‹ÃŒÃ�ÃŽÃ�Å Ã‘Ã’Ã“Ã”Ã•Ã–Ã—Ã˜Ã™ÃšÃ›ÃœÃ�Å½ÃŸÃ Ã¡Ã¢Ã£Ã¤Ã¥Ã¦Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯Å¡Ã±Ã²Ã³Ã´ÃµÃ¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Ã½Å¾Ã¿"
  },
  "ibm922": "cp922",
  "csibm922": "cp922",
  "cp1046": {
    "type": "_sbcs",
    "chars": "ïºˆÃ—Ã·ï£¶ï£µï£´ï£·ï¹±Âˆâ– â”‚â”€â”�â”Œâ””â”˜ï¹¹ï¹»ï¹½ï¹¿ï¹·ïºŠï»°ï»³ï»²ï»Žï»�ï»�ï»¶ï»¸ï»ºï»¼Â ï£ºï£¹ï£¸Â¤ï£»ïº‹ïº‘ïº—ïº›ïºŸïº£ØŒÂ­ïº§ïº³Ù Ù¡Ù¢Ù£Ù¤Ù¥Ù¦Ù§Ù¨Ù©ïº·Ø›ïº»ïº¿ï»ŠØŸï»‹Ø¡Ø¢Ø£Ø¤Ø¥Ø¦Ø§Ø¨Ø©ØªØ«Ø¬Ø­Ø®Ø¯Ø°Ø±Ø²Ø³Ø´ØµØ¶Ø·ï»‡Ø¹Øºï»Œïº‚ïº„ïºŽï»“Ù€Ù�Ù‚ÙƒÙ„Ù…Ù†Ù‡ÙˆÙ‰ÙŠÙ‹ÙŒÙ�ÙŽÙ�Ù�Ù‘Ù’ï»—ï»›ï»Ÿï£¼ï»µï»·ï»¹ï»»ï»£ï»§ï»¬ï»©ï¿½"
  },
  "ibm1046": "cp1046",
  "csibm1046": "cp1046",
  "cp1124": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Ð�Ð‚Ò�Ð„Ð…Ð†Ð‡ÐˆÐ‰ÐŠÐ‹ÐŒÂ­ÐŽÐ�Ð�Ð‘Ð’Ð“Ð”Ð•Ð–Ð—Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ Ð¡Ð¢Ð£Ð¤Ð¥Ð¦Ð§Ð¨Ð©ÐªÐ«Ð¬Ð­Ð®Ð¯Ð°Ð±Ð²Ð³Ð´ÐµÐ¶Ð·Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿Ñ€Ñ�Ñ‚ÑƒÑ„Ñ…Ñ†Ñ‡ÑˆÑ‰ÑŠÑ‹ÑŒÑ�ÑŽÑ�â„–Ñ‘Ñ’Ò‘Ñ”Ñ•Ñ–Ñ—Ñ˜Ñ™ÑšÑ›ÑœÂ§ÑžÑŸ"
  },
  "ibm1124": "cp1124",
  "csibm1124": "cp1124",
  "cp1125": {
    "type": "_sbcs",
    "chars": "Ð�Ð‘Ð’Ð“Ð”Ð•Ð–Ð—Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ Ð¡Ð¢Ð£Ð¤Ð¥Ð¦Ð§Ð¨Ð©ÐªÐ«Ð¬Ð­Ð®Ð¯Ð°Ð±Ð²Ð³Ð´ÐµÐ¶Ð·Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿â–‘â–’â–“â”‚â”¤â•¡â•¢â•–â••â•£â•‘â•—â•�â•œâ•›â”�â””â”´â”¬â”œâ”€â”¼â•žâ•Ÿâ•šâ•”â•©â•¦â• â•�â•¬â•§â•¨â•¤â•¥â•™â•˜â•’â•“â•«â•ªâ”˜â”Œâ–ˆâ–„â–Œâ–�â–€Ñ€Ñ�Ñ‚ÑƒÑ„Ñ…Ñ†Ñ‡ÑˆÑ‰ÑŠÑ‹ÑŒÑ�ÑŽÑ�Ð�Ñ‘Ò�Ò‘Ð„Ñ”Ð†Ñ–Ð‡Ñ—Â·âˆšâ„–Â¤â– Â "
  },
  "ibm1125": "cp1125",
  "csibm1125": "cp1125",
  "cp1129": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Â¡Â¢Â£Â¤Â¥Â¦Â§Å“Â©ÂªÂ«Â¬Â­Â®Â¯Â°Â±Â²Â³Å¸ÂµÂ¶Â·Å’Â¹ÂºÂ»Â¼Â½Â¾Â¿Ã€Ã�Ã‚Ä‚Ã„Ã…Ã†Ã‡ÃˆÃ‰ÃŠÃ‹Ì€Ã�ÃŽÃ�Ä�Ã‘Ì‰Ã“Ã”Æ Ã–Ã—Ã˜Ã™ÃšÃ›ÃœÆ¯ÌƒÃŸÃ Ã¡Ã¢ÄƒÃ¤Ã¥Ã¦Ã§Ã¨Ã©ÃªÃ«Ì�Ã­Ã®Ã¯Ä‘Ã±Ì£Ã³Ã´Æ¡Ã¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Æ°â‚«Ã¿"
  },
  "ibm1129": "cp1129",
  "csibm1129": "cp1129",
  "cp1133": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ àº�àº‚àº„àº‡àºˆàºªàºŠàº�àº”àº•àº–àº—àº™àºšàº›àºœàº�àºžàºŸàº¡àº¢àº£àº¥àº§àº«àº­àº®ï¿½ï¿½ï¿½àº¯àº°àº²àº³àº´àºµàº¶àº·àº¸àº¹àº¼àº±àº»àº½ï¿½ï¿½ï¿½à»€à»�à»‚à»ƒà»„à»ˆà»‰à»Šà»‹à»Œà»�à»†ï¿½à»œà»�â‚­ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½à»�à»‘à»’à»“à»”à»•à»–à»—à»˜à»™ï¿½ï¿½Â¢Â¬Â¦ï¿½"
  },
  "ibm1133": "cp1133",
  "csibm1133": "cp1133",
  "cp1161": {
    "type": "_sbcs",
    "chars": "ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½à¹ˆà¸�à¸‚à¸ƒà¸„à¸…à¸†à¸‡à¸ˆà¸‰à¸Šà¸‹à¸Œà¸�à¸Žà¸�à¸�à¸‘à¸’à¸“à¸”à¸•à¸–à¸—à¸˜à¸™à¸šà¸›à¸œà¸�à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºà¹‰à¹Šà¹‹â‚¬à¸¿à¹€à¹�à¹‚à¹ƒà¹„à¹…à¹†à¹‡à¹ˆà¹‰à¹Šà¹‹à¹Œà¹�à¹Žà¹�à¹�à¹‘à¹’à¹“à¹”à¹•à¹–à¹—à¹˜à¹™à¹šà¹›Â¢Â¬Â¦Â "
  },
  "ibm1161": "cp1161",
  "csibm1161": "cp1161",
  "cp1162": {
    "type": "_sbcs",
    "chars": "â‚¬Â�Â‚ÂƒÂ„â€¦Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�â€˜â€™â€œâ€�â€¢â€“â€”Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ à¸�à¸‚à¸ƒà¸„à¸…à¸†à¸‡à¸ˆà¸‰à¸Šà¸‹à¸Œà¸�à¸Žà¸�à¸�à¸‘à¸’à¸“à¸”à¸•à¸–à¸—à¸˜à¸™à¸šà¸›à¸œà¸�à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï¿½ï¿½ï¿½ï¿½à¸¿à¹€à¹�à¹‚à¹ƒà¹„à¹…à¹†à¹‡à¹ˆà¹‰à¹Šà¹‹à¹Œà¹�à¹Žà¹�à¹�à¹‘à¹’à¹“à¹”à¹•à¹–à¹—à¹˜à¹™à¹šà¹›ï¿½ï¿½ï¿½ï¿½"
  },
  "ibm1162": "cp1162",
  "csibm1162": "cp1162",
  "cp1163": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Â¡Â¢Â£â‚¬Â¥Â¦Â§Å“Â©ÂªÂ«Â¬Â­Â®Â¯Â°Â±Â²Â³Å¸ÂµÂ¶Â·Å’Â¹ÂºÂ»Â¼Â½Â¾Â¿Ã€Ã�Ã‚Ä‚Ã„Ã…Ã†Ã‡ÃˆÃ‰ÃŠÃ‹Ì€Ã�ÃŽÃ�Ä�Ã‘Ì‰Ã“Ã”Æ Ã–Ã—Ã˜Ã™ÃšÃ›ÃœÆ¯ÌƒÃŸÃ Ã¡Ã¢ÄƒÃ¤Ã¥Ã¦Ã§Ã¨Ã©ÃªÃ«Ì�Ã­Ã®Ã¯Ä‘Ã±Ì£Ã³Ã´Æ¡Ã¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Æ°â‚«Ã¿"
  },
  "ibm1163": "cp1163",
  "csibm1163": "cp1163",
  "maccroatian": {
    "type": "_sbcs",
    "chars": "Ã„Ã…Ã‡Ã‰Ã‘Ã–ÃœÃ¡Ã Ã¢Ã¤Ã£Ã¥Ã§Ã©Ã¨ÃªÃ«Ã­Ã¬Ã®Ã¯Ã±Ã³Ã²Ã´Ã¶ÃµÃºÃ¹Ã»Ã¼â€ Â°Â¢Â£Â§â€¢Â¶ÃŸÂ®Å â„¢Â´Â¨â‰ Å½Ã˜âˆžÂ±â‰¤â‰¥âˆ†Âµâˆ‚âˆ‘âˆ�Å¡âˆ«ÂªÂºâ„¦Å¾Ã¸Â¿Â¡Â¬âˆšÆ’â‰ˆÄ†Â«ÄŒâ€¦Â Ã€ÃƒÃ•Å’Å“Ä�â€”â€œâ€�â€˜â€™Ã·â—Šï¿½Â©â�„Â¤â€¹â€ºÃ†Â»â€“Â·â€šâ€žâ€°Ã‚Ä‡Ã�Ä�ÃˆÃ�ÃŽÃ�ÃŒÃ“Ã”Ä‘Ã’ÃšÃ›Ã™Ä±Ë†ËœÂ¯Ï€Ã‹ËšÂ¸ÃŠÃ¦Ë‡"
  },
  "maccyrillic": {
    "type": "_sbcs",
    "chars": "Ð�Ð‘Ð’Ð“Ð”Ð•Ð–Ð—Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ Ð¡Ð¢Ð£Ð¤Ð¥Ð¦Ð§Ð¨Ð©ÐªÐ«Ð¬Ð­Ð®Ð¯â€ Â°Â¢Â£Â§â€¢Â¶Ð†Â®Â©â„¢Ð‚Ñ’â‰ ÐƒÑ“âˆžÂ±â‰¤â‰¥Ñ–Âµâˆ‚ÐˆÐ„Ñ”Ð‡Ñ—Ð‰Ñ™ÐŠÑšÑ˜Ð…Â¬âˆšÆ’â‰ˆâˆ†Â«Â»â€¦Â Ð‹Ñ›ÐŒÑœÑ•â€“â€”â€œâ€�â€˜â€™Ã·â€žÐŽÑžÐ�ÑŸâ„–Ð�Ñ‘Ñ�Ð°Ð±Ð²Ð³Ð´ÐµÐ¶Ð·Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿Ñ€Ñ�Ñ‚ÑƒÑ„Ñ…Ñ†Ñ‡ÑˆÑ‰ÑŠÑ‹ÑŒÑ�ÑŽÂ¤"
  },
  "macgreek": {
    "type": "_sbcs",
    "chars": "Ã„Â¹Â²Ã‰Â³Ã–ÃœÎ…Ã Ã¢Ã¤Î„Â¨Ã§Ã©Ã¨ÃªÃ«Â£â„¢Ã®Ã¯â€¢Â½â€°Ã´Ã¶Â¦Â­Ã¹Ã»Ã¼â€ Î“Î”Î˜Î›ÎžÎ ÃŸÂ®Â©Î£ÎªÂ§â‰ Â°Î‡Î‘Â±â‰¤â‰¥Â¥Î’Î•Î–Î—Î™ÎšÎœÎ¦Î«Î¨Î©Î¬Î�Â¬ÎŸÎ¡â‰ˆÎ¤Â«Â»â€¦Â Î¥Î§Î†ÎˆÅ“â€“â€•â€œâ€�â€˜â€™Ã·Î‰ÎŠÎŒÎŽÎ­Î®Î¯ÏŒÎ�Ï�Î±Î²ÏˆÎ´ÎµÏ†Î³Î·Î¹Î¾ÎºÎ»Î¼Î½Î¿Ï€ÏŽÏ�ÏƒÏ„Î¸Ï‰Ï‚Ï‡Ï…Î¶ÏŠÏ‹Î�Î°ï¿½"
  },
  "maciceland": {
    "type": "_sbcs",
    "chars": "Ã„Ã…Ã‡Ã‰Ã‘Ã–ÃœÃ¡Ã Ã¢Ã¤Ã£Ã¥Ã§Ã©Ã¨ÃªÃ«Ã­Ã¬Ã®Ã¯Ã±Ã³Ã²Ã´Ã¶ÃµÃºÃ¹Ã»Ã¼Ã�Â°Â¢Â£Â§â€¢Â¶ÃŸÂ®Â©â„¢Â´Â¨â‰ Ã†Ã˜âˆžÂ±â‰¤â‰¥Â¥Âµâˆ‚âˆ‘âˆ�Ï€âˆ«ÂªÂºâ„¦Ã¦Ã¸Â¿Â¡Â¬âˆšÆ’â‰ˆâˆ†Â«Â»â€¦Â Ã€ÃƒÃ•Å’Å“â€“â€”â€œâ€�â€˜â€™Ã·â—ŠÃ¿Å¸â�„Â¤Ã�Ã°ÃžÃ¾Ã½Â·â€šâ€žâ€°Ã‚ÃŠÃ�Ã‹ÃˆÃ�ÃŽÃ�ÃŒÃ“Ã”ï¿½Ã’ÃšÃ›Ã™Ä±Ë†ËœÂ¯Ë˜Ë™ËšÂ¸Ë�Ë›Ë‡"
  },
  "macroman": {
    "type": "_sbcs",
    "chars": "Ã„Ã…Ã‡Ã‰Ã‘Ã–ÃœÃ¡Ã Ã¢Ã¤Ã£Ã¥Ã§Ã©Ã¨ÃªÃ«Ã­Ã¬Ã®Ã¯Ã±Ã³Ã²Ã´Ã¶ÃµÃºÃ¹Ã»Ã¼â€ Â°Â¢Â£Â§â€¢Â¶ÃŸÂ®Â©â„¢Â´Â¨â‰ Ã†Ã˜âˆžÂ±â‰¤â‰¥Â¥Âµâˆ‚âˆ‘âˆ�Ï€âˆ«ÂªÂºâ„¦Ã¦Ã¸Â¿Â¡Â¬âˆšÆ’â‰ˆâˆ†Â«Â»â€¦Â Ã€ÃƒÃ•Å’Å“â€“â€”â€œâ€�â€˜â€™Ã·â—ŠÃ¿Å¸â�„Â¤â€¹â€ºï¬�ï¬‚â€¡Â·â€šâ€žâ€°Ã‚ÃŠÃ�Ã‹ÃˆÃ�ÃŽÃ�ÃŒÃ“Ã”ï¿½Ã’ÃšÃ›Ã™Ä±Ë†ËœÂ¯Ë˜Ë™ËšÂ¸Ë�Ë›Ë‡"
  },
  "macromania": {
    "type": "_sbcs",
    "chars": "Ã„Ã…Ã‡Ã‰Ã‘Ã–ÃœÃ¡Ã Ã¢Ã¤Ã£Ã¥Ã§Ã©Ã¨ÃªÃ«Ã­Ã¬Ã®Ã¯Ã±Ã³Ã²Ã´Ã¶ÃµÃºÃ¹Ã»Ã¼â€ Â°Â¢Â£Â§â€¢Â¶ÃŸÂ®Â©â„¢Â´Â¨â‰ Ä‚ÅžâˆžÂ±â‰¤â‰¥Â¥Âµâˆ‚âˆ‘âˆ�Ï€âˆ«ÂªÂºâ„¦ÄƒÅŸÂ¿Â¡Â¬âˆšÆ’â‰ˆâˆ†Â«Â»â€¦Â Ã€ÃƒÃ•Å’Å“â€“â€”â€œâ€�â€˜â€™Ã·â—ŠÃ¿Å¸â�„Â¤â€¹â€ºÅ¢Å£â€¡Â·â€šâ€žâ€°Ã‚ÃŠÃ�Ã‹ÃˆÃ�ÃŽÃ�ÃŒÃ“Ã”ï¿½Ã’ÃšÃ›Ã™Ä±Ë†ËœÂ¯Ë˜Ë™ËšÂ¸Ë�Ë›Ë‡"
  },
  "macthai": {
    "type": "_sbcs",
    "chars": "Â«Â»â€¦ï¢Œï¢�ï¢’ï¢•ï¢˜ï¢‹ï¢Žï¢‘ï¢”ï¢—â€œâ€�ï¢™ï¿½â€¢ï¢„ï¢‰ï¢…ï¢†ï¢‡ï¢ˆï¢Šï¢�ï¢�ï¢“ï¢–â€˜â€™ï¿½Â à¸�à¸‚à¸ƒà¸„à¸…à¸†à¸‡à¸ˆà¸‰à¸Šà¸‹à¸Œà¸�à¸Žà¸�à¸�à¸‘à¸’à¸“à¸”à¸•à¸–à¸—à¸˜à¸™à¸šà¸›à¸œà¸�à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï»¿â€‹â€“â€”à¸¿à¹€à¹�à¹‚à¹ƒà¹„à¹…à¹†à¹‡à¹ˆà¹‰à¹Šà¹‹à¹Œà¹�â„¢à¹�à¹�à¹‘à¹’à¹“à¹”à¹•à¹–à¹—à¹˜à¹™Â®Â©ï¿½ï¿½ï¿½ï¿½"
  },
  "macturkish": {
    "type": "_sbcs",
    "chars": "Ã„Ã…Ã‡Ã‰Ã‘Ã–ÃœÃ¡Ã Ã¢Ã¤Ã£Ã¥Ã§Ã©Ã¨ÃªÃ«Ã­Ã¬Ã®Ã¯Ã±Ã³Ã²Ã´Ã¶ÃµÃºÃ¹Ã»Ã¼â€ Â°Â¢Â£Â§â€¢Â¶ÃŸÂ®Â©â„¢Â´Â¨â‰ Ã†Ã˜âˆžÂ±â‰¤â‰¥Â¥Âµâˆ‚âˆ‘âˆ�Ï€âˆ«ÂªÂºâ„¦Ã¦Ã¸Â¿Â¡Â¬âˆšÆ’â‰ˆâˆ†Â«Â»â€¦Â Ã€ÃƒÃ•Å’Å“â€“â€”â€œâ€�â€˜â€™Ã·â—ŠÃ¿Å¸ÄžÄŸÄ°Ä±ÅžÅŸâ€¡Â·â€šâ€žâ€°Ã‚ÃŠÃ�Ã‹ÃˆÃ�ÃŽÃ�ÃŒÃ“Ã”ï¿½Ã’ÃšÃ›Ã™ï¿½Ë†ËœÂ¯Ë˜Ë™ËšÂ¸Ë�Ë›Ë‡"
  },
  "macukraine": {
    "type": "_sbcs",
    "chars": "Ð�Ð‘Ð’Ð“Ð”Ð•Ð–Ð—Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ Ð¡Ð¢Ð£Ð¤Ð¥Ð¦Ð§Ð¨Ð©ÐªÐ«Ð¬Ð­Ð®Ð¯â€ Â°Ò�Â£Â§â€¢Â¶Ð†Â®Â©â„¢Ð‚Ñ’â‰ ÐƒÑ“âˆžÂ±â‰¤â‰¥Ñ–ÂµÒ‘ÐˆÐ„Ñ”Ð‡Ñ—Ð‰Ñ™ÐŠÑšÑ˜Ð…Â¬âˆšÆ’â‰ˆâˆ†Â«Â»â€¦Â Ð‹Ñ›ÐŒÑœÑ•â€“â€”â€œâ€�â€˜â€™Ã·â€žÐŽÑžÐ�ÑŸâ„–Ð�Ñ‘Ñ�Ð°Ð±Ð²Ð³Ð´ÐµÐ¶Ð·Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿Ñ€Ñ�Ñ‚ÑƒÑ„Ñ…Ñ†Ñ‡ÑˆÑ‰ÑŠÑ‹ÑŒÑ�ÑŽÂ¤"
  },
  "koi8r": {
    "type": "_sbcs",
    "chars": "â”€â”‚â”Œâ”�â””â”˜â”œâ”¤â”¬â”´â”¼â–€â–„â–ˆâ–Œâ–�â–‘â–’â–“âŒ â– âˆ™âˆšâ‰ˆâ‰¤â‰¥Â âŒ¡Â°Â²Â·Ã·â•�â•‘â•’Ñ‘â•“â•”â••â•–â•—â•˜â•™â•šâ•›â•œâ•�â•žâ•Ÿâ• â•¡Ð�â•¢â•£â•¤â•¥â•¦â•§â•¨â•©â•ªâ•«â•¬Â©ÑŽÐ°Ð±Ñ†Ð´ÐµÑ„Ð³Ñ…Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿Ñ�Ñ€Ñ�Ñ‚ÑƒÐ¶Ð²ÑŒÑ‹Ð·ÑˆÑ�Ñ‰Ñ‡ÑŠÐ®Ð�Ð‘Ð¦Ð”Ð•Ð¤Ð“Ð¥Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ¯Ð Ð¡Ð¢Ð£Ð–Ð’Ð¬Ð«Ð—Ð¨Ð­Ð©Ð§Ðª"
  },
  "koi8u": {
    "type": "_sbcs",
    "chars": "â”€â”‚â”Œâ”�â””â”˜â”œâ”¤â”¬â”´â”¼â–€â–„â–ˆâ–Œâ–�â–‘â–’â–“âŒ â– âˆ™âˆšâ‰ˆâ‰¤â‰¥Â âŒ¡Â°Â²Â·Ã·â•�â•‘â•’Ñ‘Ñ”â•”Ñ–Ñ—â•—â•˜â•™â•šâ•›Ò‘â•�â•žâ•Ÿâ• â•¡Ð�Ð„â•£Ð†Ð‡â•¦â•§â•¨â•©â•ªÒ�â•¬Â©ÑŽÐ°Ð±Ñ†Ð´ÐµÑ„Ð³Ñ…Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿Ñ�Ñ€Ñ�Ñ‚ÑƒÐ¶Ð²ÑŒÑ‹Ð·ÑˆÑ�Ñ‰Ñ‡ÑŠÐ®Ð�Ð‘Ð¦Ð”Ð•Ð¤Ð“Ð¥Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ¯Ð Ð¡Ð¢Ð£Ð–Ð’Ð¬Ð«Ð—Ð¨Ð­Ð©Ð§Ðª"
  },
  "koi8ru": {
    "type": "_sbcs",
    "chars": "â”€â”‚â”Œâ”�â””â”˜â”œâ”¤â”¬â”´â”¼â–€â–„â–ˆâ–Œâ–�â–‘â–’â–“âŒ â– âˆ™âˆšâ‰ˆâ‰¤â‰¥Â âŒ¡Â°Â²Â·Ã·â•�â•‘â•’Ñ‘Ñ”â•”Ñ–Ñ—â•—â•˜â•™â•šâ•›Ò‘Ñžâ•žâ•Ÿâ• â•¡Ð�Ð„â•£Ð†Ð‡â•¦â•§â•¨â•©â•ªÒ�ÐŽÂ©ÑŽÐ°Ð±Ñ†Ð´ÐµÑ„Ð³Ñ…Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿Ñ�Ñ€Ñ�Ñ‚ÑƒÐ¶Ð²ÑŒÑ‹Ð·ÑˆÑ�Ñ‰Ñ‡ÑŠÐ®Ð�Ð‘Ð¦Ð”Ð•Ð¤Ð“Ð¥Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ¯Ð Ð¡Ð¢Ð£Ð–Ð’Ð¬Ð«Ð—Ð¨Ð­Ð©Ð§Ðª"
  },
  "koi8t": {
    "type": "_sbcs",
    "chars": "Ò›Ò“â€šÒ’â€žâ€¦â€ â€¡ï¿½â€°Ò³â€¹Ò²Ò·Ò¶ï¿½Òšâ€˜â€™â€œâ€�â€¢â€“â€”ï¿½â„¢ï¿½â€ºï¿½ï¿½ï¿½ï¿½ï¿½Ó¯Ó®Ñ‘Â¤Ó£Â¦Â§ï¿½ï¿½ï¿½Â«Â¬Â­Â®ï¿½Â°Â±Â²Ð�ï¿½Ó¢Â¶Â·ï¿½â„–ï¿½Â»ï¿½ï¿½ï¿½Â©ÑŽÐ°Ð±Ñ†Ð´ÐµÑ„Ð³Ñ…Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿Ñ�Ñ€Ñ�Ñ‚ÑƒÐ¶Ð²ÑŒÑ‹Ð·ÑˆÑ�Ñ‰Ñ‡ÑŠÐ®Ð�Ð‘Ð¦Ð”Ð•Ð¤Ð“Ð¥Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ¯Ð Ð¡Ð¢Ð£Ð–Ð’Ð¬Ð«Ð—Ð¨Ð­Ð©Ð§Ðª"
  },
  "armscii8": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ ï¿½Ö‡Ö‰)(Â»Â«â€”.Õ�,-ÖŠâ€¦ÕœÕ›ÕžÔ±Õ¡Ô²Õ¢Ô³Õ£Ô´Õ¤ÔµÕ¥Ô¶Õ¦Ô·Õ§Ô¸Õ¨Ô¹Õ©ÔºÕªÔ»Õ«Ô¼Õ¬Ô½Õ­Ô¾Õ®Ô¿Õ¯Õ€Õ°Õ�Õ±Õ‚Õ²ÕƒÕ³Õ„Õ´Õ…ÕµÕ†Õ¶Õ‡Õ·ÕˆÕ¸Õ‰Õ¹ÕŠÕºÕ‹Õ»ÕŒÕ¼Õ�Õ½ÕŽÕ¾Õ�Õ¿Õ�Ö€Õ‘Ö�Õ’Ö‚Õ“ÖƒÕ”Ö„Õ•Ö…Õ–Ö†Õšï¿½"
  },
  "rk1048": {
    "type": "_sbcs",
    "chars": "Ð‚Ðƒâ€šÑ“â€žâ€¦â€ â€¡â‚¬â€°Ð‰â€¹ÐŠÒšÒºÐ�Ñ’â€˜â€™â€œâ€�â€¢â€“â€”ï¿½â„¢Ñ™â€ºÑšÒ›Ò»ÑŸÂ Ò°Ò±Ó˜Â¤Ó¨Â¦Â§Ð�Â©Ò’Â«Â¬Â­Â®Ò®Â°Â±Ð†Ñ–Ó©ÂµÂ¶Â·Ñ‘â„–Ò“Â»Ó™Ò¢Ò£Ò¯Ð�Ð‘Ð’Ð“Ð”Ð•Ð–Ð—Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ Ð¡Ð¢Ð£Ð¤Ð¥Ð¦Ð§Ð¨Ð©ÐªÐ«Ð¬Ð­Ð®Ð¯Ð°Ð±Ð²Ð³Ð´ÐµÐ¶Ð·Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿Ñ€Ñ�Ñ‚ÑƒÑ„Ñ…Ñ†Ñ‡ÑˆÑ‰ÑŠÑ‹ÑŒÑ�ÑŽÑ�"
  },
  "tcvn": {
    "type": "_sbcs",
    "chars": "\u0000Ãšá»¤\u0003á»ªá»¬á»®\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010á»¨á»°á»²á»¶á»¸Ã�á»´\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~Ã€áº¢ÃƒÃ�áº áº¶áº¬Ãˆáººáº¼Ã‰áº¸á»†ÃŒá»ˆÄ¨Ã�á»ŠÃ’á»ŽÃ•Ã“á»Œá»˜á»œá»žá» á»šá»¢Ã™á»¦Å¨Â Ä‚Ã‚ÃŠÃ”Æ Æ¯Ä�ÄƒÃ¢ÃªÃ´Æ¡Æ°Ä‘áº°Ì€Ì‰ÌƒÌ�Ì£Ã áº£Ã£Ã¡áº¡áº²áº±áº³áºµáº¯áº´áº®áº¦áº¨áºªáº¤á»€áº·áº§áº©áº«áº¥áº­Ã¨á»‚áº»áº½Ã©áº¹á»�á»ƒá»…áº¿á»‡Ã¬á»‰á»„áº¾á»’Ä©Ã­á»‹Ã²á»”á»�ÃµÃ³á»�á»“á»•á»—á»‘á»™á»�á»Ÿá»¡á»›á»£Ã¹á»–á»§Å©Ãºá»¥á»«á»­á»¯á»©á»±á»³á»·á»¹Ã½á»µá»�"
  },
  "georgianacademy": {
    "type": "_sbcs",
    "chars": "Â€Â�â€šÆ’â€žâ€¦â€ â€¡Ë†â€°Å â€¹Å’Â�ÂŽÂ�Â�â€˜â€™â€œâ€�â€¢â€“â€”Ëœâ„¢Å¡â€ºÅ“Â�ÂžÅ¸Â Â¡Â¢Â£Â¤Â¥Â¦Â§Â¨Â©ÂªÂ«Â¬Â­Â®Â¯Â°Â±Â²Â³Â´ÂµÂ¶Â·Â¸Â¹ÂºÂ»Â¼Â½Â¾Â¿áƒ�áƒ‘áƒ’áƒ“áƒ”áƒ•áƒ–áƒ—áƒ˜áƒ™áƒšáƒ›áƒœáƒ�áƒžáƒŸáƒ áƒ¡áƒ¢áƒ£áƒ¤áƒ¥áƒ¦áƒ§áƒ¨áƒ©áƒªáƒ«áƒ¬áƒ­áƒ®áƒ¯áƒ°áƒ±áƒ²áƒ³áƒ´áƒµáƒ¶Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯Ã°Ã±Ã²Ã³Ã´ÃµÃ¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Ã½Ã¾Ã¿"
  },
  "georgianps": {
    "type": "_sbcs",
    "chars": "Â€Â�â€šÆ’â€žâ€¦â€ â€¡Ë†â€°Å â€¹Å’Â�ÂŽÂ�Â�â€˜â€™â€œâ€�â€¢â€“â€”Ëœâ„¢Å¡â€ºÅ“Â�ÂžÅ¸Â Â¡Â¢Â£Â¤Â¥Â¦Â§Â¨Â©ÂªÂ«Â¬Â­Â®Â¯Â°Â±Â²Â³Â´ÂµÂ¶Â·Â¸Â¹ÂºÂ»Â¼Â½Â¾Â¿áƒ�áƒ‘áƒ’áƒ“áƒ”áƒ•áƒ–áƒ±áƒ—áƒ˜áƒ™áƒšáƒ›áƒœáƒ²áƒ�áƒžáƒŸáƒ áƒ¡áƒ¢áƒ³áƒ£áƒ¤áƒ¥áƒ¦áƒ§áƒ¨áƒ©áƒªáƒ«áƒ¬áƒ­áƒ®áƒ´áƒ¯áƒ°áƒµÃ¦Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯Ã°Ã±Ã²Ã³Ã´ÃµÃ¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Ã½Ã¾Ã¿"
  },
  "pt154": {
    "type": "_sbcs",
    "chars": "Ò–Ò’Ó®Ò“â€žâ€¦Ò¶Ò®Ò²Ò¯Ò Ó¢Ò¢ÒšÒºÒ¸Ò—â€˜â€™â€œâ€�â€¢â€“â€”Ò³Ò·Ò¡Ó£Ò£Ò›Ò»Ò¹Â ÐŽÑžÐˆÓ¨Ò˜Ò°Â§Ð�Â©Ó˜Â«Â¬Ó¯Â®ÒœÂ°Ò±Ð†Ñ–Ò™Ó©Â¶Â·Ñ‘â„–Ó™Â»Ñ˜ÒªÒ«Ò�Ð�Ð‘Ð’Ð“Ð”Ð•Ð–Ð—Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ Ð¡Ð¢Ð£Ð¤Ð¥Ð¦Ð§Ð¨Ð©ÐªÐ«Ð¬Ð­Ð®Ð¯Ð°Ð±Ð²Ð³Ð´ÐµÐ¶Ð·Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿Ñ€Ñ�Ñ‚ÑƒÑ„Ñ…Ñ†Ñ‡ÑˆÑ‰ÑŠÑ‹ÑŒÑ�ÑŽÑ�"
  },
  "viscii": {
    "type": "_sbcs",
    "chars": "\u0000\u0001áº²\u0003\u0004áº´áºª\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013á»¶\u0015\u0016\u0017\u0018á»¸\u001a\u001b\u001c\u001dá»´\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~áº áº®áº°áº¶áº¤áº¦áº¨áº¬áº¼áº¸áº¾á»€á»‚á»„á»†á»�á»’á»”á»–á»˜á»¢á»šá»œá»žá»Šá»Žá»Œá»ˆá»¦Å¨á»¤á»²Ã•áº¯áº±áº·áº¥áº§áº©áº­áº½áº¹áº¿á»�á»ƒá»…á»‡á»‘á»“á»•á»—á» Æ á»™á»�á»Ÿá»‹á»°á»¨á»ªá»¬Æ¡á»›Æ¯Ã€Ã�Ã‚Ãƒáº¢Ä‚áº³áºµÃˆÃ‰ÃŠáººÃŒÃ�Ä¨á»³Ä�á»©Ã’Ã“Ã”áº¡á»·á»«á»­Ã™Ãšá»¹á»µÃ�á»¡Æ°Ã Ã¡Ã¢Ã£áº£Äƒá»¯áº«Ã¨Ã©Ãªáº»Ã¬Ã­Ä©á»‰Ä‘á»±Ã²Ã³Ã´Ãµá»�á»�á»¥Ã¹ÃºÅ©á»§Ã½á»£á»®"
  },
  "iso646cn": {
    "type": "_sbcs",
    "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#Â¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}â€¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½"
  },
  "iso646jp": {
    "type": "_sbcs",
    "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[Â¥]^_`abcdefghijklmnopqrstuvwxyz{|}â€¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½"
  },
  "hproman8": {
    "type": "_sbcs",
    "chars": "Â€Â�Â‚ÂƒÂ„Â…Â†Â‡ÂˆÂ‰ÂŠÂ‹ÂŒÂ�ÂŽÂ�Â�Â‘Â’Â“Â”Â•Â–Â—Â˜Â™ÂšÂ›ÂœÂ�ÂžÂŸÂ Ã€Ã‚ÃˆÃŠÃ‹ÃŽÃ�Â´Ë‹Ë†Â¨ËœÃ™Ã›â‚¤Â¯Ã�Ã½Â°Ã‡Ã§Ã‘Ã±Â¡Â¿Â¤Â£Â¥Â§Æ’Â¢Ã¢ÃªÃ´Ã»Ã¡Ã©Ã³ÃºÃ Ã¨Ã²Ã¹Ã¤Ã«Ã¶Ã¼Ã…Ã®Ã˜Ã†Ã¥Ã­Ã¸Ã¦Ã„Ã¬Ã–ÃœÃ‰Ã¯ÃŸÃ”Ã�ÃƒÃ£Ã�Ã°Ã�ÃŒÃ“Ã’Ã•ÃµÅ Å¡ÃšÅ¸Ã¿ÃžÃ¾Â·ÂµÂ¶Â¾â€”Â¼Â½ÂªÂºÂ«â– Â»Â±ï¿½"
  },
  "macintosh": {
    "type": "_sbcs",
    "chars": "Ã„Ã…Ã‡Ã‰Ã‘Ã–ÃœÃ¡Ã Ã¢Ã¤Ã£Ã¥Ã§Ã©Ã¨ÃªÃ«Ã­Ã¬Ã®Ã¯Ã±Ã³Ã²Ã´Ã¶ÃµÃºÃ¹Ã»Ã¼â€ Â°Â¢Â£Â§â€¢Â¶ÃŸÂ®Â©â„¢Â´Â¨â‰ Ã†Ã˜âˆžÂ±â‰¤â‰¥Â¥Âµâˆ‚âˆ‘âˆ�Ï€âˆ«ÂªÂºâ„¦Ã¦Ã¸Â¿Â¡Â¬âˆšÆ’â‰ˆâˆ†Â«Â»â€¦Â Ã€ÃƒÃ•Å’Å“â€“â€”â€œâ€�â€˜â€™Ã·â—ŠÃ¿Å¸â�„Â¤â€¹â€ºï¬�ï¬‚â€¡Â·â€šâ€žâ€°Ã‚ÃŠÃ�Ã‹ÃˆÃ�ÃŽÃ�ÃŒÃ“Ã”ï¿½Ã’ÃšÃ›Ã™Ä±Ë†ËœÂ¯Ë˜Ë™ËšÂ¸Ë�Ë›Ë‡"
  },
  "ascii": {
    "type": "_sbcs",
    "chars": "ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½"
  },
  "tis620": {
    "type": "_sbcs",
    "chars": "ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½à¸�à¸‚à¸ƒà¸„à¸…à¸†à¸‡à¸ˆà¸‰à¸Šà¸‹à¸Œà¸�à¸Žà¸�à¸�à¸‘à¸’à¸“à¸”à¸•à¸–à¸—à¸˜à¸™à¸šà¸›à¸œà¸�à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï¿½ï¿½ï¿½ï¿½à¸¿à¹€à¹�à¹‚à¹ƒà¹„à¹…à¹†à¹‡à¹ˆà¹‰à¹Šà¹‹à¹Œà¹�à¹Žà¹�à¹�à¹‘à¹’à¹“à¹”à¹•à¹–à¹—à¹˜à¹™à¹šà¹›ï¿½ï¿½ï¿½ï¿½"
  }
}"use strict";

// Manually added data to be used by sbcs codec in addition to generated one.

module.exports = {
    // Not supported by iconv, not sure why.
    "10029": "maccenteuro",
    "maccenteuro": {
        "type": "_sbcs",
        "chars": "Ã„Ä€Ä�Ã‰Ä„Ã–ÃœÃ¡Ä…ÄŒÃ¤Ä�Ä†Ä‡Ã©Å¹ÅºÄŽÃ­Ä�Ä’Ä“Ä–Ã³Ä—Ã´Ã¶ÃµÃºÄšÄ›Ã¼â€ Â°Ä˜Â£Â§â€¢Â¶ÃŸÂ®Â©â„¢Ä™Â¨â‰ Ä£Ä®Ä¯Äªâ‰¤â‰¥Ä«Ä¶âˆ‚âˆ‘Å‚Ä»Ä¼Ä½Ä¾Ä¹ÄºÅ…Å†ÅƒÂ¬âˆšÅ„Å‡âˆ†Â«Â»â€¦Â ÅˆÅ�Ã•Å‘ÅŒâ€“â€”â€œâ€�â€˜â€™Ã·â—ŠÅ�Å”Å•Å˜â€¹â€ºÅ™Å–Å—Å â€šâ€žÅ¡ÅšÅ›Ã�Å¤Å¥Ã�Å½Å¾ÅªÃ“Ã”Å«Å®ÃšÅ¯Å°Å±Å²Å³Ã�Ã½Ä·Å»Å�Å¼Ä¢Ë‡"
    },

    "808": "cp808",
    "ibm808": "cp808",
    "cp808": {
        "type": "_sbcs",
        "chars": "Ð�Ð‘Ð’Ð“Ð”Ð•Ð–Ð—Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ Ð¡Ð¢Ð£Ð¤Ð¥Ð¦Ð§Ð¨Ð©ÐªÐ«Ð¬Ð­Ð®Ð¯Ð°Ð±Ð²Ð³Ð´ÐµÐ¶Ð·Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿â–‘â–’â–“â”‚â”¤â•¡â•¢â•–â••â•£â•‘â•—â•�â•œâ•›â”�â””â”´â”¬â”œâ”€â”¼â•žâ•Ÿâ•šâ•”â•©â•¦â• â•�â•¬â•§â•¨â•¤â•¥â•™â•˜â•’â•“â•«â•ªâ”˜â”Œâ–ˆâ–„â–Œâ–�â–€Ñ€Ñ�Ñ‚ÑƒÑ„Ñ…Ñ†Ñ‡ÑˆÑ‰ÑŠÑ‹ÑŒÑ�ÑŽÑ�Ð�Ñ‘Ð„Ñ”Ð‡Ñ—ÐŽÑžÂ°âˆ™Â·âˆšâ„–â‚¬â– Â "
    },

    "mik": {
        "type": "_sbcs",
        "chars": "Ð�Ð‘Ð’Ð“Ð”Ð•Ð–Ð—Ð˜Ð™ÐšÐ›ÐœÐ�ÐžÐŸÐ Ð¡Ð¢Ð£Ð¤Ð¥Ð¦Ð§Ð¨Ð©ÐªÐ«Ð¬Ð­Ð®Ð¯Ð°Ð±Ð²Ð³Ð´ÐµÐ¶Ð·Ð¸Ð¹ÐºÐ»Ð¼Ð½Ð¾Ð¿Ñ€Ñ�Ñ‚ÑƒÑ„Ñ…Ñ†Ñ‡ÑˆÑ‰ÑŠÑ‹ÑŒÑ�ÑŽÑ�â””â”´â”¬â”œâ”€â”¼â•£â•‘â•šâ•”â•©â•¦â• â•�â•¬â”�â–‘â–’â–“â”‚â”¤â„–Â§â•—â•�â”˜â”Œâ–ˆâ–„â–Œâ–�â–€Î±ÃŸÎ“Ï€Î£ÏƒÂµÏ„Î¦Î˜Î©Î´âˆžÏ†Îµâˆ©â‰¡Â±â‰¥â‰¤âŒ âŒ¡Ã·â‰ˆÂ°âˆ™Â·âˆšâ�¿Â²â– Â "
    },

    // Aliases of generated encodings.
    "ascii8bit": "ascii",
    "usascii": "ascii",
    "ansix34": "ascii",
    "ansix341968": "ascii",
    "ansix341986": "ascii",
    "csascii": "ascii",
    "cp367": "ascii",
    "ibm367": "ascii",
    "isoir6": "ascii",
    "iso646us": "ascii",
    "iso646irv": "ascii",
    "us": "ascii",

    "latin1": "iso88591",
    "latin2": "iso88592",
    "latin3": "iso88593",
    "latin4": "iso88594",
    "latin5": "iso88599",
    "latin6": "iso885910",
    "latin7": "iso885913",
    "latin8": "iso885914",
    "latin9": "iso885915",
    "latin10": "iso885916",

    "csisolatin1": "iso88591",
    "csisolatin2": "iso88592",
    "csisolatin3": "iso88593",
    "csisolatin4": "iso88594",
    "csisolatincyrillic": "iso88595",
    "csisolatinarabic": "iso88596",
    "csisolatingreek" : "iso88597",
    "csisolatinhebrew": "iso88598",
    "csisolatin5": "iso88599",
    "csisolatin6": "iso885910",

    "l1": "iso88591",
    "l2": "iso88592",
    "l3": "iso88593",
    "l4": "iso88594",
    "l5": "iso88599",
    "l6": "iso885910",
    "l7": "iso885913",
    "l8": "iso885914",
    "l9": "iso885915",
    "l10": "iso885916",

    "isoir14": "iso646jp",
    "isoir57": "iso646cn",
    "isoir100": "iso88591",
    "isoir101": "iso88592",
    "isoir109": "iso88593",
    "isoir110": "iso88594",
    "isoir144": "iso88595",
    "isoir127": "iso88596",
    "isoir126": "iso88597",
    "isoir138": "iso88598",
    "isoir148": "iso88599",
    "isoir157": "iso885910",
    "isoir166": "tis620",
    "isoir179": "iso885913",
    "isoir199": "iso885914",
    "isoir203": "iso885915",
    "isoir226": "iso885916",

    "cp819": "iso88591",
    "ibm819": "iso88591",

    "cyrillic": "iso88595",

    "arabic": "iso88596",
    "arabic8": "iso88596",
    "ecma114": "iso88596",
    "asmo708": "iso88596",

    "greek" : "iso88597",
    "greek8" : "iso88597",
    "ecma118" : "iso88597",
    "elot928" : "iso88597",

    "hebrew": "iso88598",
    "hebrew8": "iso88598",

    "turkish": "iso88599",
    "turkish8": "iso88599",

    "thai": "iso885911",
    "thai8": "iso885911",

    "celtic": "iso885914",
    "celtic8": "iso885914",
    "isoceltic": "iso885914",

    "tis6200": "tis620",
    "tis62025291": "tis620",
    "tis62025330": "tis620",

    "10000": "macroman",
    "10006": "macgreek",
    "10007": "maccyrillic",
    "10079": "maciceland",
    "10081": "macturkish",

    "cspc8codepage437": "cp437",
    "cspc775baltic": "cp775",
    "cspc850multilingual": "cp850",
    "cspcp852": "cp852",
    "cspc862latinhebrew": "cp862",
    "cpgr": "cp869",

    "msee": "cp1250",
    "mscyrl": "cp1251",
    "msansi": "cp1252",
    "msgreek": "cp1253",
    "msturk": "cp1254",
    "mshebr": "cp1255",
    "msarab": "cp1256",
    "winbaltrim": "cp1257",

    "cp20866": "koi8r",
    "20866": "koi8r",
    "ibm878": "koi8r",
    "cskoi8r": "koi8r",

    "cp21866": "koi8u",
    "21866": "koi8u",
    "ibm1168": "koi8u",

    "strk10482002": "rk1048",

    "tcvn5712": "tcvn",
    "tcvn57121": "tcvn",

    "gb198880": "iso646cn",
    "cn": "iso646cn",

    "csiso14jisc6220ro": "iso646jp",
    "jisc62201969ro": "iso646jp",
    "jp": "iso646jp",

    "cshproman8": "hproman8",
    "r8": "hproman8",
    "roman8": "hproman8",
    "xroman8": "hproman8",
    "ibm1051": "hproman8",

    "mac": "macintosh",
    "csmacintosh": "macintosh",
};

"use strict";
var Buffer = require("safer-buffer").Buffer;

// Note: UTF16-LE (or UCS2) codec is Node.js native. See encodings/internal.js

// == UTF16-BE codec. ==========================================================

exports.utf16be = Utf16BECodec;
function Utf16BECodec() {
}

Utf16BECodec.prototype.encoder = Utf16BEEncoder;
Utf16BECodec.prototype.decoder = Utf16BEDecoder;
Utf16BECodec.prototype.bomAware = true;


// -- Encoding

function Utf16BEEncoder() {
}

Utf16BEEncoder.prototype.write = function(str) {
    var buf = Buffer.from(str, 'ucs2');
    for (var i = 0; i < buf.length; i += 2) {
        var tmp = buf[i]; buf[i] = buf[i+1]; buf[i+1] = tmp;
    }
    return buf;
}

Utf16BEEncoder.prototype.end = function() {
}


// -- Decoding

function Utf16BEDecoder() {
    this.overflowByte = -1;
}

Utf16BEDecoder.prototype.write = function(buf) {
    if (buf.length == 0)
        return '';

    var buf2 = Buffer.alloc(buf.length + 1),
        i = 0, j = 0;

    if (this.overflowByte !== -1) {
        buf2[0] = buf[0];
        buf2[1] = this.overflowByte;
        i = 1; j = 2;
    }

    for (; i < buf.length-1; i += 2, j+= 2) {
        buf2[j] = buf[i+1];
        buf2[j+1] = buf[i];
    }

    this.overflowByte = (i == buf.length-1) ? buf[buf.length-1] : -1;

    return buf2.slice(0, j).toString('ucs2');
}

Utf16BEDecoder.prototype.end = function() {
}


// == UTF-16 codec =============================================================
// Decoder chooses automatically from UTF-16LE and UTF-16BE using BOM and space-based heuristic.
// Defaults to UTF-16LE, as it's prevalent and default in Node.
// http://en.wikipedia.org/wiki/UTF-16 and http://encoding.spec.whatwg.org/#utf-16le
// Decoder default can be changed: iconv.decode(buf, 'utf16', {defaultEncoding: 'utf-16be'});

// Encoder uses UTF-16LE and prepends BOM (which can be overridden with addBOM: false).

exports.utf16 = Utf16Codec;
function Utf16Codec(codecOptions, iconv) {
    this.iconv = iconv;
}

Utf16Codec.prototype.encoder = Utf16Encoder;
Utf16Codec.prototype.decoder = Utf16Decoder;


// -- Encoding (pass-through)

function Utf16Encoder(options, codec) {
    options = options || {};
    if (options.addBOM === undefined)
        options.addBOM = true;
    this.encoder = codec.iconv.getEncoder('utf-16le', options);
}

Utf16Encoder.prototype.write = function(str) {
    return this.encoder.write(str);
}

Utf16Encoder.prototype.end = function() {
    return this.encoder.end();
}


// -- Decoding

function Utf16Decoder(options, codec) {
    this.decoder = null;
    this.initialBytes = [];
    this.initialBytesLen = 0;

    this.options = options || {};
    this.iconv = codec.iconv;
}

Utf16Decoder.prototype.write = function(buf) {
    if (!this.decoder) {
        // Codec is not chosen yet. Accumulate initial bytes.
        this.initialBytes.push(buf);
        this.initialBytesLen += buf.length;
        
        if (this.initialBytesLen < 16) // We need more bytes to use space heuristic (see below)
            return '';

        // We have enough bytes -> detect endianness.
        var buf = Buffer.concat(this.initialBytes),
            encoding = detectEncoding(buf, this.options.defaultEncoding);
        this.decoder = this.iconv.getDecoder(encoding, this.options);
        this.initialBytes.length = this.initialBytesLen = 0;
    }

    return this.decoder.write(buf);
}

Utf16Decoder.prototype.end = function() {
    if (!this.decoder) {
        var buf = Buffer.concat(this.initialBytes),
            encoding = detectEncoding(buf, this.options.defaultEncoding);
        this.decoder = this.iconv.getDecoder(encoding, this.options);

        var res = this.decoder.write(buf),
            trail = this.decoder.end();

        return trail ? (res + trail) : res;
    }
    return this.decoder.end();
}

function detectEncoding(buf, defaultEncoding) {
    var enc = defaultEncoding || 'utf-16le';

    if (buf.length >= 2) {
        // Check BOM.
        if (buf[0] == 0xFE && buf[1] == 0xFF) // UTF-16BE BOM
            enc = 'utf-16be';
        else if (buf[0] == 0xFF && buf[1] == 0xFE) // UTF-16LE BOM
            enc = 'utf-16le';
        else {
            // No BOM found. Try to deduce encoding from initial content.
            // Most of the time, the content has ASCII chars (U+00**), but the opposite (U+**00) is uncommon.
            // So, we count ASCII as if it was LE or BE, and decide from that.
            var asciiCharsLE = 0, asciiCharsBE = 0, // Counts of chars in both positions
                _len = Math.min(buf.length - (buf.length % 2), 64); // Len is always even.

            for (var i = 0; i < _len; i += 2) {
                if (buf[i] === 0 && buf[i+1] !== 0) asciiCharsBE++;
                if (buf[i] !== 0 && buf[i+1] === 0) asciiCharsLE++;
            }

            if (asciiCharsBE > asciiCharsLE)
                enc = 'utf-16be';
            else if (asciiCharsBE < asciiCharsLE)
                enc = 'utf-16le';
        }
    }

    return enc;
}


"use strict";
var Buffer = require("safer-buffer").Buffer;

// UTF-7 codec, according to https://tools.ietf.org/html/rfc2152
// See also below a UTF-7-IMAP codec, according to http://tools.ietf.org/html/rfc3501#section-5.1.3

exports.utf7 = Utf7Codec;
exports.unicode11utf7 = 'utf7'; // Alias UNICODE-1-1-UTF-7
function Utf7Codec(codecOptions, iconv) {
    this.iconv = iconv;
};

Utf7Codec.prototype.encoder = Utf7Encoder;
Utf7Codec.prototype.decoder = Utf7Decoder;
Utf7Codec.prototype.bomAware = true;


// -- Encoding

var nonDirectChars = /[^A-Za-z0-9'\(\),-\.\/:\? \n\r\t]+/g;

function Utf7Encoder(options, codec) {
    this.iconv = codec.iconv;
}

Utf7Encoder.prototype.write = function(str) {
    // Naive implementation.
    // Non-direct chars are encoded as "+<base64>-"; single "+" char is encoded as "+-".
    return Buffer.from(str.replace(nonDirectChars, function(chunk) {
        return "+" + (chunk === '+' ? '' : 
            this.iconv.encode(chunk, 'utf16-be').toString('base64').replace(/=+$/, '')) 
            + "-";
    }.bind(this)));
}

Utf7Encoder.prototype.end = function() {
}


// -- Decoding

function Utf7Decoder(options, codec) {
    this.iconv = codec.iconv;
    this.inBase64 = false;
    this.base64Accum = '';
}

var base64Regex = /[A-Za-z0-9\/+]/;
var base64Chars = [];
for (var i = 0; i < 256; i++)
    base64Chars[i] = base64Regex.test(String.fromCharCode(i));

var plusChar = '+'.charCodeAt(0), 
    minusChar = '-'.charCodeAt(0),
    andChar = '&'.charCodeAt(0);

Utf7Decoder.prototype.write = function(buf) {
    var res = "", lastI = 0,
        inBase64 = this.inBase64,
        base64Accum = this.base64Accum;

    // The decoder is more involved as we must handle chunks in stream.

    for (var i = 0; i < buf.length; i++) {
        if (!inBase64) { // We're in direct mode.
            // Write direct chars until '+'
            if (buf[i] == plusChar) {
                res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
                lastI = i+1;
                inBase64 = true;
            }
        } else { // We decode base64.
            if (!base64Chars[buf[i]]) { // Base64 ended.
                if (i == lastI && buf[i] == minusChar) {// "+-" -> "+"
                    res += "+";
                } else {
                    var b64str = base64Accum + buf.slice(lastI, i).toString();
                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
                }

                if (buf[i] != minusChar) // Minus is absorbed after base64.
                    i--;

                lastI = i+1;
                inBase64 = false;
                base64Accum = '';
            }
        }
    }

    if (!inBase64) {
        res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
    } else {
        var b64str = base64Accum + buf.slice(lastI).toString();

        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
        b64str = b64str.slice(0, canBeDecoded);

        res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
    }

    this.inBase64 = inBase64;
    this.base64Accum = base64Accum;

    return res;
}

Utf7Decoder.prototype.end = function() {
    var res = "";
    if (this.inBase64 && this.base64Accum.length > 0)
        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), "utf16-be");

    this.inBase64 = false;
    this.base64Accum = '';
    return res;
}


// UTF-7-IMAP codec.
// RFC3501 Sec. 5.1.3 Modified UTF-7 (http://tools.ietf.org/html/rfc3501#section-5.1.3)
// Differences:
//  * Base64 part is started by "&" instead of "+"
//  * Direct characters are 0x20-0x7E, except "&" (0x26)
//  * In Base64, "," is used instead of "/"
//  * Base64 must not be used to represent direct characters.
//  * No implicit shift back from Base64 (should always end with '-')
//  * String must end in non-shifted position.
//  * "-&" while in base64 is not allowed.


exports.utf7imap = Utf7IMAPCodec;
function Utf7IMAPCodec(codecOptions, iconv) {
    this.iconv = iconv;
};

Utf7IMAPCodec.prototype.encoder = Utf7IMAPEncoder;
Utf7IMAPCodec.prototype.decoder = Utf7IMAPDecoder;
Utf7IMAPCodec.prototype.bomAware = true;


// -- Encoding

function Utf7IMAPEncoder(options, codec) {
    this.iconv = codec.iconv;
    this.inBase64 = false;
    this.base64Accum = Buffer.alloc(6);
    this.base64AccumIdx = 0;
}

Utf7IMAPEncoder.prototype.write = function(str) {
    var inBase64 = this.inBase64,
        base64Accum = this.base64Accum,
        base64AccumIdx = this.base64AccumIdx,
        buf = Buffer.alloc(str.length*5 + 10), bufIdx = 0;

    for (var i = 0; i < str.length; i++) {
        var uChar = str.charCodeAt(i);
        if (0x20 <= uChar && uChar <= 0x7E) { // Direct character or '&'.
            if (inBase64) {
                if (base64AccumIdx > 0) {
                    bufIdx += buf.write(base64Accum.slice(0, base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
                    base64AccumIdx = 0;
                }

                buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
                inBase64 = false;
            }

            if (!inBase64) {
                buf[bufIdx++] = uChar; // Write direct character

                if (uChar === andChar)  // Ampersand -> '&-'
                    buf[bufIdx++] = minusChar;
            }

        } else { // Non-direct character
            if (!inBase64) {
                buf[bufIdx++] = andChar; // Write '&', then go to base64 mode.
                inBase64 = true;
            }
            if (inBase64) {
                base64Accum[base64AccumIdx++] = uChar >> 8;
                base64Accum[base64AccumIdx++] = uChar & 0xFF;

                if (base64AccumIdx == base64Accum.length) {
                    bufIdx += buf.write(base64Accum.toString('base64').replace(/\//g, ','), bufIdx);
                    base64AccumIdx = 0;
                }
            }
        }
    }

    this.inBase64 = inBase64;
    this.base64AccumIdx = base64AccumIdx;

    return buf.slice(0, bufIdx);
}

Utf7IMAPEncoder.prototype.end = function() {
    var buf = Buffer.alloc(10), bufIdx = 0;
    if (this.inBase64) {
        if (this.base64AccumIdx > 0) {
            bufIdx += buf.write(this.base64Accum.slice(0, this.base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
            this.base64AccumIdx = 0;
        }

        buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
        this.inBase64 = false;
    }

    return buf.slice(0, bufIdx);
}


// -- Decoding

function Utf7IMAPDecoder(options, codec) {
    this.iconv = codec.iconv;
    this.inBase64 = false;
    this.base64Accum = '';
}

var base64IMAPChars = base64Chars.slice();
base64IMAPChars[','.charCodeAt(0)] = true;

Utf7IMAPDecoder.prototype.write = function(buf) {
    var res = "", lastI = 0,
        inBase64 = this.inBase64,
        base64Accum = this.base64Accum;

    // The decoder is more involved as we must handle chunks in stream.
    // It is forgiving, closer to standard UTF-7 (for example, '-' is optional at the end).

    for (var i = 0; i < buf.length; i++) {
        if (!inBase64) { // We're in direct mode.
            // Write direct chars until '&'
            if (buf[i] == andChar) {
                res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
                lastI = i+1;
                inBase64 = true;
            }
        } else { // We decode base64.
            if (!base64IMAPChars[buf[i]]) { // Base64 ended.
                if (i == lastI && buf[i] == minusChar) { // "&-" -> "&"
                    res += "&";
                } else {
                    var b64str = base64Accum + buf.slice(lastI, i).toString().replace(/,/g, '/');
                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
                }

                if (buf[i] != minusChar) // Minus may be absorbed after base64.
                    i--;

                lastI = i+1;
                inBase64 = false;
                base64Accum = '';
            }
        }
    }

    if (!inBase64) {
        res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
    } else {
        var b64str = base64Accum + buf.slice(lastI).toString().replace(/,/g, '/');

        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
        b64str = b64str.slice(0, canBeDecoded);

        res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
    }

    this.inBase64 = inBase64;
    this.base64Accum = base64Accum;

    return res;
}

Utf7IMAPDecoder.prototype.end = function() {
    var res = "";
    if (this.inBase64 && this.base64Accum.length > 0)
        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), "utf16-be");

    this.inBase64 = false;
    this.base64Accum = '';
    return res;
}


[
["8740","ä�°ä°²ä˜ƒä–¦ä•¸ð§‰§äµ·ä–³ð§²±ä³¢ð§³…ã®•äœ¶ä�„ä±‡ä±€ð¤Š¿ð£˜—ð§�’ð¦º‹ð§ƒ’ä±—ðª�‘ä��ä—šä²…ð§±¬ä´‡äª¤äš¡ð¦¬£çˆ¥ð¥©”ð¡©£ð£¸†ð£½¡æ™�å›»"],
["8767","ç¶•å¤�ð¨®¹ã·´éœ´ð§¯¯å¯›ð¡µžåª¤ã˜¥ð©º°å«‘å®·å³¼æ�®è–“ð©¥…ç‘¡ç’�ã¡µð¡µ“ð£šžð¦€¡ã»¬"],
["87a1","ð¥£žã«µç«¼é¾—ð¤…¡ð¨¤�ð£‡ªð ªŠð£‰žäŒŠè’„é¾–é�¯ä¤°è˜“å¢–é�Šéˆ˜ç§�ç¨²æ™ æ¨©è¢�ç‘Œç¯…æž‚ç¨¬å‰�é�†ã“¦ç�„ð¥¶¹ç“†é¿‡åž³ä¤¯å‘Œä„±ð£šŽå ˜ç©²ð§­¥è®�äš®ð¦ºˆä†�ð¥¶™ç®®ð¢’¼é¿ˆð¢“�ð¢“‰ð¢“Œé¿‰è”„ð£–»ä‚´é¿Šä“¡ðª·¿æ‹�ç�®é¿‹"],
["8840","ã‡€",4,"ð „Œã‡…ð ƒ‘ð ƒ�ã‡†ã‡‡ð ƒ‹ð¡¿¨ã‡ˆð ƒŠã‡‰ã‡Šã‡‹ã‡Œð „Žã‡�ã‡ŽÄ€Ã�Ç�Ã€Ä’Ã‰ÄšÃˆÅŒÃ“Ç‘Ã’à¿¿ÃŠÌ„áº¾à¿¿ÃŠÌŒá»€ÃŠÄ�Ã¡ÇŽÃ É‘Ä“Ã©Ä›Ã¨Ä«Ã­Ç�Ã¬Å�Ã³Ç’Ã²Å«ÃºÇ”Ã¹Ç–Ç˜Çš"],
["88a1","ÇœÃ¼à¿¿ÃªÌ„áº¿à¿¿ÃªÌŒá»�ÃªÉ¡â�šâ�›"],
["8940","ðªŽ©ð¡……"],
["8943","æ”Š"],
["8946","ä¸½æ»�éµŽé‡Ÿ"],
["894c","ð§œµæ’‘ä¼šä¼¨ä¾¨å…–å…´å†œå‡¤åŠ¡åŠ¨åŒ»å�Žå�‘å�˜å›¢å£°å¤„å¤‡å¤²å¤´å­¦å®žå®Ÿå²šåº†æ€»æ–‰æŸ¾æ „æ¡¥æµŽç‚¼ç”µçº¤çº¬çººç»‡ç»�ç»Ÿç¼†ç¼·è‰ºè‹�è�¯è§†è®¾è¯¢è½¦è½§è½®"],
["89a1","ç�‘ç³¼ç·�æ¥†ç«‰åˆ§"],
["89ab","é†Œç¢¸é…žè‚¼"],
["89b0","è´‹èƒ¶ð §§"],
["89b5","è‚Ÿé»‡ä³�é·‰é¸Œä°¾ð©·¶ð§€Žé¸Šðª„³ã—�"],
["89c1","æºšèˆ¾ç”™"],
["89c5","ä¤‘é©¬éª�é¾™ç¦‡ð¨‘¬ð¡·Šð —�ð¢«¦ä¸¤äº�äº€äº‡äº¿ä»«ä¼·ã‘Œä¾½ã¹ˆå€ƒå‚ˆã‘½ã’“ã’¥å††å¤…å‡›å‡¼åˆ…äº‰å‰¹åŠ�åŒ§ã—‡åŽ©ã•‘åŽ°ã•“å�‚å�£ã•­ã•²ãš�å’“å’£å’´å’¹å“�å“¯å”˜å”£å”¨ã–˜å”¿ã–¥ã–¿å——ã—…"],
["8a40","ð§¶„å”¥"],
["8a43","ð ±‚ð ´•ð¥„«å–�ð¢³†ã§¬ð ��è¹†ð¤¶¸ð©“¥ä�“ð¨‚¾ç�ºð¢°¸ã¨´äŸ•ð¨…�ð¦§²ð¤·ªæ“�ð µ¼ð ¾´ð ³•ð¡ƒ´æ’�è¹¾ð º–ð °‹ð ½¤ð¢²©ð¨‰–ð¤““"],
["8a64","ð µ†ð©©�ð¨ƒ©äŸ´ð¤º§ð¢³‚éª²ã©§ð©—´ã¿­ã”†ð¥‹‡ð©Ÿ”ð§£ˆð¢µ„éµ®é •"],
["8a76","ä�™ð¦‚¥æ’´å“£ð¢µŒð¢¯Šð¡�·ã§»ð¡�¯"],
["8aa1","ð¦›šð¦œ–ð§¦ æ“ªð¥�’ð ±ƒè¹¨ð¢†¡ð¨­Œð œ±"],
["8aac","ä ‹ð †©ã¿ºå¡³ð¢¶�"],
["8ab2","ð¤—ˆð “¼ð¦‚—ð ½Œð ¶–å•¹ä‚»äŽº"],
["8abb","äª´ð¢©¦ð¡‚�è†ªé£µð ¶œæ�¹ã§¾ð¢�µè·€åš¡æ‘¼ã¹ƒ"],
["8ac9","ðª˜�ð ¸‰ð¢«�ð¢³‰"],
["8ace","ð¡ƒˆð£§‚ã¦’ã¨†ð¨Š›ã•¸ð¥¹‰ð¢ƒ‡å™’ð ¼±ð¢²²ð©œ ã’¼æ°½ð¤¸»"],
["8adf","ð§•´ð¢º‹ð¢ˆˆðª™›ð¨³�ð ¹ºð °´ð¦ œç¾“ð¡ƒ�ð¢ ƒð¢¤¹ã—»ð¥‡£ð ºŒð ¾�ð ºªã¾“ð ¼°ð µ‡ð¡…�ð ¹Œ"],
["8af6","ð º«ð ®©ð µˆð¡ƒ€ð¡„½ã¿¹ð¢š–æ�²ð ¾­"],
["8b40","ð£�´ð§˜¹ð¢¯Žð µ¾ð µ¿ð¢±‘ð¢±•ã¨˜ð º˜ð¡ƒ‡ð ¼®ðª˜²ð¦­�ð¨³’ð¨¶™ð¨³Šé–ªå“Œè‹„å–¹"],
["8b55","ð©»ƒé°¦éª¶ð§�žð¢·®ç…€è…­èƒ¬å°œð¦•²è„´ãž—å�Ÿð¨‚½é†¶ð »ºð ¸�ð ¹·ð »»ã—�ð¤·«ã˜‰ð ³–åš¯ð¢žµð¡ƒ‰ð ¸�ð ¹¸ð¡�¸ð¡…ˆð¨ˆ‡ð¡‘•ð ¹¹ð¤¹�ð¢¶¤å©”ð¡€�ð¡€žð¡ƒµð¡ƒ¶åžœð ¸‘"],
["8ba1","ð§š”ð¨‹�ð ¾µð ¹»ð¥…¾ãœƒð ¾¶ð¡†€ð¥‹˜ðªŠ½ð¤§šð¡ ºð¤…·ð¨‰¼å¢™å‰¨ã˜šð¥œ½ç®²å­¨ä €ä¬¬é¼§ä§§é°Ÿé®�ð¥­´ð£„½å—»ã—²åš‰ä¸¨å¤‚ð¡¯�ð¯¡¸é�‘ð ‚†ä¹›äº»ã”¾å°£å½‘å¿„ã£ºæ‰Œæ”µæ­ºæ°µæ°ºç�¬çˆ«ä¸¬çŠ­ð¤£©ç½’ç¤»ç³¹ç½“ð¦‰ªã“�"],
["8bde","ð¦�‹è€‚è‚€ð¦˜’ð¦¥‘å��è¡¤è§�ð§¢²è® è´�é’…é•¸é•¿é—¨ð¨¸�éŸ¦é¡µé£Žé£žé¥£ð© �é±¼é¸Ÿé»„æ­¯ï¤‡ä¸·ð ‚‡é˜�æˆ·é’¢"],
["8c40","å€»æ·¾ð©±³é¾¦ã·‰è¢�ð¤…Žç�·å³µä¬ ð¥‡�ã•™ð¥´°æ„¢ð¨¨²è¾§é‡¶ç†‘æœ™çŽºð£Š�ðª„‡ã²‹ð¡¦€ä¬�ç£¤ç�‚å†®ð¨œ�ä€‰æ©£ðªŠºäˆ£è˜�ð ©¯ç¨ªð©¥‡ð¨«ªé�•ç��åŒ¤ð¢�¾é�´ç›™ð¨§£é¾§çŸ�äº£ä¿°å‚¼ä¸¯ä¼—é¾¨å�´ç¶‹å¢’å£�ð¡¶¶åº’åº™å¿‚ð¢œ’æ–‹"],
["8ca1","ð£�¹æ¤™æ©ƒð£±£æ³¿"],
["8ca7","çˆ€ð¤”…çŽŒã»›ð¤¨“å¬•ç’¹è®ƒð¥²¤ð¥š•çª“ç¯¬ç³ƒç¹¬è‹¸è–—é¾©è¢�é¾ªèº¹é¾«è¿�è•Ÿé§ éˆ¡é¾¬ð¨¶¹ð¡�¿ä�±äŠ¢å¨š"],
["8cc9","é¡¨æ�«ä‰¶åœ½"],
["8cce","è—–ð¤¥»èŠ¿ð§„�ä²�ð¦µ´åµ»ð¦¬•ð¦¾¾é¾­é¾®å®–é¾¯æ›§ç¹›æ¹—ç§Šã¶ˆä“ƒð£‰–ð¢ž–äŽšä”¶"],
["8ce6","å³•ð£¬šè«¹å±¸ã´’ð£•‘åµ¸é¾²ç…—ä•˜ð¤ƒ¬ð¡¸£ä±·ã¥¸ã‘Šð †¤ð¦±�è«Œä¾´ð ˆ¹å¦¿è…¬é¡–ð©£ºå¼»"],
["8d40","ð ®Ÿ"],
["8d42","ð¢‡�ð¨¥­ä„‚äš»ð©�¹ã¼‡é¾³ðª†µäƒ¸ãŸ–ä›·ð¦±†ä…¼ð¨š²ð§�¿ä•­ã£”ð¥’šä•¡ä”›ä¶‰ä±»äµ¶ä—ªã¿ˆð¤¬�ã™¡ä“žä’½ä‡­å´¾åµˆåµ–ã·¼ã �å¶¤å¶¹ã  ã ¸å¹‚åº½å¼¥å¾ƒã¤ˆã¤”ã¤¿ã¥�æƒ—æ„½å³¥ã¦‰æ†·æ†¹æ‡�ã¦¸æˆ¬æŠ�æ‹¥æŒ˜ã§¸åš±"],
["8da1","ã¨ƒæ�¢æ�»æ�‡æ‘šã©‹æ“€å´•å˜¡é¾Ÿãª—æ–†ãª½æ—¿æ™“ã«²æš’ã¬¢æœ–ã­‚æž¤æ €ã­˜æ¡Šæ¢„ã­²ã­±ã­»æ¤‰æ¥ƒç‰œæ¥¤æ¦Ÿæ¦…ã®¼æ§–ã¯�æ©¥æ©´æ©±æª‚ã¯¬æª™ã¯²æª«æªµæ«”æ«¶æ®�æ¯�æ¯ªæ±µæ²ªã³‹æ´‚æ´†æ´¦æ¶�ã³¯æ¶¤æ¶±æ¸•æ¸˜æ¸©æº†ð¨§€æº»æ»¢æ»šé½¿æ»¨æ»©æ¼¤æ¼´ãµ†ð£½�æ¾�æ¾¾ãµªãµµç†·å²™ã¶Šç€¬ã¶‘ç��ç�”ç�¯ç�¿ç‚‰ð Œ¥ä��ã—±ð »˜"],
["8e40","ð£»—åž¾ð¦»“ç„¾ð¥Ÿ ã™Žæ¦¢ð¨¯©å­´ç©‰ð¥£¡ð©“™ç©¥ç©½ð¥¦¬çª»çª°ç«‚ç«ƒç‡‘ð¦’�ä‡Šç«šç«�ç«ªä‡¯å’²ð¥°�ç¬‹ç­•ç¬©ð¥ŒŽð¥³¾ç®¢ç­¯èŽœð¥®´ð¦±¿ç¯�è�¡ç®’ç®¸ð¥´ ã¶­ð¥±¥è’’ç¯ºç°†ç°µð¥³�ç±„ç²ƒð¤¢‚ç²¦æ™½ð¤•¸ç³‰ç³‡ç³¦ç±´ç³³ç³µç³Ž"],
["8ea1","ç¹§ä”�ð¦¹„çµ�ð¦»–ç’�ç¶‰ç¶«ç„µç¶³ç·’ð¤�—ð¦€©ç·¤ã´“ç·µð¡Ÿ¹ç·¥ð¨�­ç¸�ð¦„¡ð¦…šç¹®çº’äŒ«é‘¬ç¸§ç½€ç½�ç½‡ç¤¶ð¦‹�é§¡ç¾—ð¦�‘ç¾£ð¡™¡ð �¨ä•œð£�¦ä”ƒð¨Œºç¿ºð¦’‰è€…è€ˆè€�è€¨è€¯ðª‚‡ð¦³ƒè€»è€¼è�¡ð¢œ”ä¦‰ð¦˜¦ð£·£ð¦›¨æœ¥è‚§ð¨©ˆè„‡è„šå¢°ð¢›¶æ±¿ð¦’˜ð¤¾¸æ“§ð¡’Šèˆ˜ð¡¡žæ©“ð¤©¥ð¤ª•ä‘ºèˆ©ð ¬�ð¦©’ð£µ¾ä¿¹ð¡“½è“¢è�¢ð¦¬Šð¤¦§ð£”°ð¡�³ð£·¸èŠªæ¤›ð¯¦”ä‡›"],
["8f40","è•‹è‹�èŒšð ¸–ð¡ž´ã›�ð£…½ð£•šè‰»è‹¢èŒ˜ð£º‹ð¦¶£ð¦¬…ð¦®—ð£—Žã¶¿èŒ�å—¬èŽ…ä”‹ð¦¶¥èŽ¬è��è�“ã‘¾ð¦»”æ©—è•šã’–ð¦¹‚ð¢»¯è‘˜ð¥¯¤è‘±ã·“ä“¤æª§è‘Šð£²µç¥˜è’¨ð¦®–ð¦¹·ð¦¹ƒè“žè��èŽ‘ä’ è’“è“¤ð¥²‘ä‰€ð¥³€ä•ƒè”´å«²ð¦º™ä”§è•³ä”–æž¿è˜–"],
["8fa1","ð¨˜¥ð¨˜»è—�ð§‚ˆè˜‚ð¡–‚ð§ƒ�ð¯¦²ä•ªè˜¨ã™ˆð¡¢¢å�·ð§Žšè™¾è�±ðªƒ¸èŸ®ð¢°§èž±èŸšè �å™¡è™¬æ¡–ä˜�è¡…è¡†ð§— ð£¶¹ð§—¤è¡žè¢œä™›è¢´è¢µæ��è£…ç�·ð§œ�è¦‡è¦Šè¦¦è¦©è¦§è¦¼ð¨¨¥è§§ð§¤¤ð§ª½èªœçž“é‡¾èª�ð§©™ç«©ð§¬ºð£¾�äœ“ð§¬¸ç…¼è¬Œè¬Ÿð¥�°ð¥•¥è¬¿è­Œè­�èª©ð¤©ºè®�è®›èª¯ð¡›Ÿä˜•è¡�è²›ð§µ”ð§¶�ð¯§”ãœ¥ð§µ“è³–ð§¶˜ð§¶½è´’è´ƒð¡¤�è³›ç�œè´‘ð¤³‰ã»�èµ·"],
["9040","è¶©ð¨€‚ð¡€”ð¤¦Šã­¼ð¨†¼ð§„Œç«§èº­èº¶è»ƒé‹”è¼™è¼­ð¨�¥ð¨�’è¾¥éŒƒðªŠŸð ©�è¾³ä¤ªð¨§žð¨”½ð£¶»å»¸ð£‰¢è¿¹ðª€”ð¨š¼ð¨”�ð¢Œ¥ã¦€ð¦»—é€·ð¨”¼ð§ª¾é�¡ð¨•¬ð¨˜‹é‚¨ð¨œ“éƒ„ð¨›¦é‚®éƒ½é…§ã«°é†©é‡„ç²¬ð¨¤³ð¡º‰éˆŽæ²Ÿé‰�é‰¢ð¥–¹éŠ¹ð¨«†ð£²›ð¨¬Œð¥—›"],
["90a1","ð ´±éŒ¬é�«ð¨«¡ð¨¯«ç‚�å«ƒð¨«¢ð¨«¥ä¥¥é‰„ð¨¯¬ð¨°¹ð¨¯¿é�³é‘›èº¼é–…é–¦é�¦é– æ¿¶äŠ¹ð¢™ºð¨›˜ð¡‰¼ð£¸®ä§Ÿæ°œé™»éš–ä…¬éš£ð¦»•æ‡šéš¶ç£µð¨« éš½å�Œä¦¡ð¦²¸ð ‰´ð¦��ð©‚¯ð©ƒ¥ð¤«‘ð¡¤•ð£ŒŠéœ±è™‚éœ¶ä¨�ä”½ä–…ð¤«©ç�µå­�éœ›é�œð©‡•é�—å­Šð©‡«é�Ÿé�¥åƒ�ð£‚·ð£‚¼éž‰éžŸéž±éž¾éŸ€éŸ’éŸ ð¥‘¬éŸ®ç�œð©�³éŸ¿éŸµð©��ð§¥ºä«‘é ´é ³é¡‹é¡¦ã¬Žð§…µãµ‘ð ˜°ð¤…œ"],
["9140","ð¥œ†é£Šé¢·é£ˆé£‡ä«¿ð¦´§ð¡›“å–°é£¡é£¦é£¬é�¸é¤¹ð¤¨©ä­²ð©¡—ð©¤…é§µé¨Œé¨»é¨�é©˜ð¥œ¥ã›„ð©‚±ð©¯•é« é«¢ð©¬…é«´ä°Žé¬”é¬­ð¨˜€å€´é¬´ð¦¦¨ã£ƒð£�½é­�é­€ð©´¾å©…ð¡¡£é®Žð¤‰‹é°‚é¯¿é°Œð©¹¨é·”ð©¾·ðª†’ðª†«ðªƒ¡ðª„£ðª‡Ÿéµ¾é¶ƒðª„´é¸Žæ¢ˆ"],
["91a1","é·„ð¢…›ðª†“ðªˆ ð¡¤»ðªˆ³é´¹ðª‚¹ðªŠ´éº�éº•éºžéº¢ä´´éºªéº¯ð¤�¤é»�ã­ ã§¥ã´�ä¼²ãž¾ð¨°«é¼‚é¼ˆä®–é�¤ð¦¶¢é¼—é¼–é¼¹åšŸåšŠé½…é¦¸ð©‚‹éŸ²è‘¿é½¢é½©ç«œé¾Žçˆ–ä®¾ð¤¥µð¤¦»ç…·ð¤§¸ð¤�ˆð¤©‘çŽžð¨¯šð¡£ºç¦Ÿð¨¥¾ð¨¸¶é�©é�³ð¨©„é‹¬éŽ�é�‹ð¨¥¬ð¤’¹çˆ—ã»«ç�²ç©ƒçƒ�ð¤‘³ð¤�¸ç…¾ð¡Ÿ¯ç‚£ð¡¢¾ð£–™ã»‡ð¡¢…ð¥�¯ð¡Ÿ¸ãœ¢ð¡›»ð¡ ¹ã›¡ð¡�´ð¡£‘ð¥½‹ãœ£ð¡›€å�›ð¤¨¥ð¡�¾ð¡Š¨"],
["9240","ð¡�†ð¡’¶è”ƒð£š¦è”ƒè‘•ð¤¦”ð§…¥ð£¸±ð¥•œð£»»ð§�’ä“´ð£›®ð©¦�ð¦¼¦æŸ¹ãœ³ã°•ã·§å¡¬ð¡¤¢æ �ä�—ð£œ¿ð¤ƒ¡ð¤‚‹ð¤„�ð¦°¡å“‹åšžð¦š±åš’ð ¿Ÿð ®¨ð ¸�é�†ð¨¬“éŽœä»¸å„«ã ™ð¤�¶äº¼ð ‘¥ð �¿ä½‹ä¾Šð¥™‘å©¨ð †«ð �‹ã¦™ð ŒŠð �”ã�µä¼©ð ‹€ð¨º³ð ‰µè«šð ˆŒäº˜"],
["92a1","åƒ�å„�ä¾¢ä¼ƒð¤¨Žð£ºŠä½‚å€®å�¬å‚�ä¿Œä¿¥å�˜åƒ¼å…™å…›å…�å…žæ¹¶ð£–•ð£¸¹ð£º¿æµ²ð¡¢„ð£º‰å†¨å‡ƒð — ä“�ð ’£ð ’’ð ’‘èµºð¨ªœð œŽå‰™åŠ¤ð ¡³å‹¡é�®ä™ºç†Œð¤ŽŒð ° ð¤¦¬ð¡ƒ¤æ§‘ð ¸�ç‘¹ã»žç’™ç�”ç‘–çŽ˜ä®Žð¤ª¼ð¤‚�å��ã–„çˆ�ð¤ƒ‰å–´ð �…å“�ð ¯†åœ�é‰�é›´é�¦åŸ�åž�å�¿ã˜¾å£‹åª™ð¨©†ð¡›ºð¡�¯ð¡œ�å¨¬å¦¸éŠ�å©¾å«�å¨’ð¥¥†ð¡§³ð¡¡¡ð¤Š•ã›µæ´…ç‘ƒå¨¡ð¥ºƒ"],
["9340","åª�ð¨¯—ð �“é� ç’Œð¡Œƒç„…ä¥²é�ˆð¨§»éŽ½ãž å°žå²žå¹žå¹ˆð¡¦–ð¡¥¼ð£«®å»�å­�ð¡¤ƒð¡¤„ãœ�ð¡¢ ã›�ð¡›¾ã›“è„ªð¨©‡ð¡¶ºð£‘²ð¨¦¨å¼Œå¼Žð¡¤§ð¡ž«å©«ð¡œ»å­„è˜”ð§—½è¡ æ�¾ð¢¡ ð¢˜«å¿›ãº¸ð¢–¯ð¢–¾ð©‚ˆð¦½³æ‡€ð €¾ð �†ð¢˜›æ†™æ†˜æ�µð¢²›ð¢´‡ð¤›”ð©…�"],
["93a1","æ‘±ð¤™¥ð¢­ªã¨©ð¢¬¢ð£‘�ð©£ªð¢¹¸æŒ·ðª‘›æ’¶æŒ±æ�‘ð¤§£ð¢µ§æŠ¤ð¢²¡æ�»æ•«æ¥²ã¯´ð£‚Žð£Š­ð¤¦‰ð£Š«å”�ð£‹ ð¡£™ð©�¿æ›Žð£Š‰ð£†³ã« ä†�ð¥–„ð¨¬¢ð¥–�ð¡›¼ð¥•›ð¥�¥ç£®ð£„ƒð¡ ªð£ˆ´ã‘¤ð£ˆ�ð£†‚ð¤‹‰æšŽð¦´¤æ™«ä®“æ˜°ð§¡°ð¡·«æ™£ð£‹’ð£‹¡æ˜žð¥¡²ã£‘ð£ ºð£ž¼ã®™ð£ž¢ð£�¾ç“�ã®–æž�ð¤˜ªæ¢¶æ žã¯„æª¾ã¡£ð£Ÿ•ð¤’‡æ¨³æ©’æ«‰æ¬…ð¡¤’æ”‘æ¢˜æ©Œã¯—æ©ºæ­—ð£¿€ð£²šéŽ é‹²ð¨¯ªð¨«‹"],
["9440","éŠ‰ð¨€žð¨§œé‘§æ¶¥æ¼‹ð¤§¬æµ§ð£½¿ã¶�æ¸„ð¤€¼å¨½æ¸Šå¡‡æ´¤ç¡‚ç„»ð¤Œšð¤‰¶çƒ±ç‰�çŠ‡çŠ”ð¤ž�ð¤œ¥å…¹ð¤ª¤ð —«ç‘ºð£»¸ð£™Ÿð¤©Šð¤¤—ð¥¿¡ã¼†ãº±ð¤«Ÿð¨°£ð£¼µæ‚§ã»³ç“Œç�¼éŽ‡ç�·ä’Ÿð¦·ªä•‘ç–ƒã½£ð¤³™ð¤´†ã½˜ç••ç™³ðª—†ã¬™ç‘¨ð¨«Œð¤¦«ð¤¦Žã«»"],
["94a1","ã·�ð¤©Žã»¿ð¤§…ð¤£³é‡ºåœ²é�‚ð¨«£ð¡¡¤åƒŸð¥ˆ¡ð¥‡§ç�¸ð£ˆ²çœŽçœ�ç�»ð¤š—ð£ž�ã©žð¤£°ç�¸ç’›ãº¿ð¤ªºð¤«‡äƒˆð¤ª–ð¦†®éŒ‡ð¥–�ç žç¢�ç¢ˆç£’ç��ç¥™ð§��ð¥›£ä„Žç¦›è’–ç¦¥æ¨­ð£»ºç¨ºç§´ä…®ð¡›¦ä„²éˆµç§±ð µŒð¤¦Œð Š™ð£¶ºð¡�®ã–—å•«ã•°ãšªð ‡”ð °�ç«¢å©™ð¢›µð¥ª¯ð¥ªœå¨�ð ‰›ç£°å¨ªð¥¯†ç«¾ä‡¹ç±�ç±­äˆ‘ð¥®³ð¥º¼ð¥º¦ç³�ð¤§¹ð¡ž°ç²Žç±¼ç²®æª²ç·œç¸‡ç·“ç½Žð¦‰¡"],
["9540","ð¦…œð§­ˆç¶—ð¥º‚ä‰ªð¦­µð ¤–æŸ–ð �Žð£—�åŸ„ð¦�’ð¦�¸ð¤¥¢ç¿�ç¬§ð  ¬ð¥«©ð¥µƒç¬Œð¥¸Žé§¦è™…é©£æ¨œð£�¿ã§¢ð¤§·ð¦–­é¨Ÿð¦– è’€ð§„§ð¦³‘ä“ªè„·ä�‚èƒ†è„‰è…‚ð¦ž´é£ƒð¦©‚è‰¢è‰¥ð¦©‘è‘“ð¦¶§è˜�ð§ˆ›åª†ä…¿ð¡¡€å¬«ð¡¢¡å«¤ð¡£˜èš ð¯¦¼ð£¶�è ­ð§�¢å¨‚"],
["95a1","è¡®ä½…è¢‡è¢¿è£¦è¥¥è¥�ð¥šƒè¥”ð§ž…ð§ž„ð¨¯µð¨¯™ð¨®œð¨§¹ãº­è’£ä›µä›�ãŸ²è¨½è¨œð©‘ˆå½�éˆ«ð¤Š„æ—”ç„©çƒ„ð¡¡…éµ­è²Ÿè³©ð§·œå¦šçŸƒå§°ä�®ã›”è¸ªèº§ð¤°‰è¼°è½Šä‹´æ±˜æ¾»ð¢Œ¡ä¢›æ½¹æº‹ð¡Ÿšé¯©ãšµð¤¤¯é‚»é‚—å•±ä¤†é†»é�„ð¨©‹ä�¢ð¨«¼é�§ð¨°�ð¨°»è“¥è¨«é–™é–§é–—é––ð¨´´ç‘…ã»‚ð¤£¿ð¤©‚ð¤�ªã»§ð£ˆ¥éš�ð¨»§ð¨¹¦ð¨¹¥ã»Œð¤§­ð¤©¸ð£¿®ç�’ç‘«ã»¼é��ð©‚°"],
["9640","æ¡‡ä¨�ð©‚“ð¥ŸŸé��é�¨ð¨¦‰ð¨°¦ð¨¬¯ð¦Ž¾éŠºå¬‘è­©ä¤¼ç�¹ð¤ˆ›éž›é�±é¤¸ð ¼¦å·�ð¨¯…ð¤ª²é Ÿð©“šé‹¶ð©——é‡¥ä“€ð¨­�ð¤©§ð¨­¤é£œð¨©…ã¼€éˆªä¤¥è�”é¤»é¥�ð§¬†ã·½é¦›ä­¯é¦ªé©œð¨­¥ð¥£ˆæª�é¨¡å«¾é¨¯ð©£±ä®�ð©¥ˆé¦¼ä®½ä®—é�½å¡²ð¡Œ‚å ¢ð¤¦¸"],
["96a1","ð¡“¨ç¡„ð¢œŸð£¶¸æ£…ãµ½é‘˜ã¤§æ…�ð¢ž�ð¢¥«æ„‡é±�é±“é±»é°µé°�é­¿é¯�ð©¸­é®Ÿðª‡µðªƒ¾é´¡ä²®ð¤„„é¸˜ä²°é´Œðª†´ðªƒ­ðªƒ³ð©¤¯é¶¥è’½ð¦¸’ð¦¿Ÿð¦®‚è—¼ä”³ð¦¶¤ð¦º„ð¦·°è� è—®ð¦¸€ð£Ÿ—ð¦�¤ç§¢ð£–œð£™€ä¤­ð¤§žãµ¢é�›éŠ¾é�ˆð Š¿ç¢¹é‰·é‘�ä¿¤ã‘€é�¤ð¥•�ç ½ç¡”ç¢¶ç¡‹ð¡�—ð£‡‰ð¤¥�ãššä½²æ¿šæ¿™ç€žç€žå�”ð¤†µåž»å£³åžŠé´–åŸ—ç„´ã’¯ð¤†¬ç‡«ð¦±€ð¤¾—å¬¨ð¡žµð¨©‰"],
["9740","æ„Œå«Žå¨‹äŠ¼ð¤’ˆãœ¬ä­»ð¨§¼éŽ»éŽ¸ð¡£–ð ¼�è‘²ð¦³€ð¡�“ð¤‹ºð¢°¦ð¤��å¦”ð£¶·ð¦��ç¶¨ð¦…›ð¦‚¤ð¤¦¹ð¤¦‹ð¨§ºé‹¥ç�¢ã»©ç’´ð¨­£ð¡¢Ÿã»¡ð¤ª³æ«˜ç�³ç�»ã»–ð¤¨¾ð¤ª”ð¡Ÿ™ð¤©¦ð Ž§ð¡�¤ð¤§¥ç‘ˆð¤¤–ç‚¥ð¤¥¶éŠ„ç�¦é�Ÿð “¾éŒ±ð¨«Žð¨¨–éŽ†ð¨¯§ð¥—•ä¤µð¨ª‚ç…«"],
["97a1","ð¤¥ƒð ³¿åš¤ð ˜šð ¯«ð ²¸å”‚ç§„ð¡Ÿºç·¾ð¡›‚ð¤©�ð¡¡’ä”®é��ãœŠð¨«€ð¤¦­å¦°ð¡¢¿ð¡¢ƒð§’„åª¡ã›¢ð£µ›ãš°é‰Ÿå©¹ð¨ª�ð¡¡¢é�´ã³�ð ª´äª–ã¦Šåƒ´ãµ©ãµŒð¡Žœç…µä‹»ð¨ˆ˜æ¸�ð©ƒ¤ä“«æµ—ð§¹�ç�§æ²¯ã³–ð£¿­ð£¸­æ¸‚æ¼Œãµ¯ð �µç•‘ãš¼ã“ˆäš€ã»šä¡±å§„é‰®ä¤¾è½�ð¨°œð¦¯€å ’åŸˆã›–ð¡‘’çƒ¾ð¤�¢ð¤©±ð¢¿£ð¡Š°ð¢Ž½æ¢¹æ¥§ð¡Ž˜ð£“¥ð§¯´ð£›Ÿð¨ªƒð£Ÿ–ð£�ºð¤²Ÿæ¨šð£š­ð¦²·è�¾ä“Ÿä“Ž"],
["9840","ð¦´¦ð¦µ‘ð¦²‚ð¦¿žæ¼—ð§„‰èŒ½ð¡œºè�­ð¦²€ð§�“ð¡Ÿ›å¦‰åª‚ð¡ž³å©¡å©±ð¡¤…ð¤‡¼ãœ­å§¯ð¡œ¼ã›‡ç†ŽéŽ�æššð¤Š¥å©®å¨«ð¤Š“æ¨«ð£»¹ð§œ¶ð¤‘›ð¤‹Šç„�ð¤‰™ð¨§¡ä¾°ð¦´¨å³‚ð¤“Žð§¹�ð¤Ž½æ¨Œð¤‰–ð¡Œ„ç‚¦ç„³ð¤�©ã¶¥æ³Ÿð¯ ¥ð¤©�ç¹¥å§«å´¯ã·³å½œð¤©�ð¡ŸŸç¶¤è�¦"],
["98a1","å’…ð£«ºð£Œ€ð ˆ”å�¾ð £•ð ˜™ã¿¥ð¡¾žðªŠ¶ç€ƒð©…›åµ°çŽ�ç³“ð¨©™ð©� ä¿ˆç¿§ç‹�çŒ�ð§«´çŒ¸çŒ¹ð¥›¶ç��ç�ˆãº©ð§¬˜é�¬ç‡µð¤£²ç�¡è‡¶ã»ŠçœŒã»‘æ²¢å›½ç�™ç�žç�Ÿã»¢ã»°ã»´ã»ºç““ã¼Žã½“ç•‚ç•­ç•²ç–�ã½¼ç—ˆç—œã¿€ç™�ã¿—ç™´ã¿œç™ºð¤½œç†ˆå˜£è¦€å¡©ä€�ç�ƒä€¹æ�¡ä�…ã—›çž˜ä�ªä�¯å±žçž¾çŸ‹å£²ç ˜ç‚¹ç œä‚¨ç ¹ç¡‡ç¡‘ç¡¦è‘ˆð¥”µç¤³æ ƒç¤²ä„ƒ"],
["9940","ä„‰ç¦‘ç¦™è¾»ç¨†è¾¼ä…§çª‘ä†²çª¼è‰¹ä‡„ç«�ç«›ä‡�ä¸¡ç­¢ç­¬ç­»ç°’ç°›ä‰ ä‰ºç±»ç²œäŠŒç²¸äŠ”ç³­è¾“çƒ€ð ³�ç·�ç·”ç·�ç·½ç¾®ç¾´çŠŸäŽ—è€ è€¥ç¬¹è€®è€±è�”ã·Œåž´ç‚ è‚·èƒ©ä�­è„ŒçŒªè„Žè„’ç• è„”ä��ã¬¹è…–è…™è…š"],
["99a1","ä�“å ºè…¼è†„ä�¥è†“ä�­è†¥åŸ¯è‡�è‡¤è‰”ä’�èŠ¦è‰¶è‹Šè‹˜è‹¿ä’°è�—é™©æ¦Šè�…çƒµè‘¤æƒ£è’ˆä”„è’¾è“¡è“¸è”�è”¸è•’ä”»è•¯è•°è— ä•·è™²èš’èš²è›¯é™…èž‹ä˜†ä˜—è¢®è£¿è¤¤è¥‡è¦‘ð§¥§è¨©è¨¸èª”èª´è±‘è³”è³²è´œäž˜å¡Ÿè·ƒäŸ­ä»®è¸ºå—˜å�”è¹±å—µèº°ä ·è»Žè»¢è»¤è»­è»²è¾·è¿�è¿Šè¿Œé€³é§„ä¢­é£ éˆ“ä¤žéˆ¨é‰˜é‰«éŠ±éŠ®éŠ¿"],
["9a40","é‹£é‹«é‹³é‹´é‹½é�ƒéŽ„éŽ­ä¥…ä¥‘éº¿é�—åŒ�é��é�­é�¾ä¥ªé‘”é‘¹é”­é–¢ä¦§é—´é˜³ä§¥æž ä¨¤é�€ä¨µéž²éŸ‚å™”ä«¤æƒ¨é¢¹ä¬™é£±å¡„é¤Žé¤™å†´é¤œé¤·é¥‚é¥�é¥¢ä­°é§…ä®�é¨¼é¬�çªƒé­©é®�é¯�é¯±é¯´ä±­é° ã�¯ð¡¯‚éµ‰é°º"],
["9aa1","é»¾å™�é¶“é¶½é·€é·¼é“¶è¾¶é¹»éº¬éº±éº½é»†é“œé»¢é»±é»¸ç«ˆé½„ð ‚”ð Š·ð Ž æ¤šé“ƒå¦¬ð “—å¡€é“�ãž¹ð —•ð ˜•ð ™¶ð¡šºå�—ç…³ð «‚ð «�ð ®¿å‘ªð¯ »ð ¯‹å’žð ¯»ð °»ð ±“ð ±¥ð ±¼æƒ§ð ²�å™ºð ²µð ³�ð ³­ð µ¯ð ¶²ð ·ˆæ¥•é°¯èž¥ð ¸„ð ¸Žð »—ð ¾�ð ¼­ð ¹³å° ð ¾¼å¸‹ð¡�œð¡��ð¡�¶æœžð¡�»ð¡‚ˆð¡‚–ã™‡ð¡‚¿ð¡ƒ“ð¡„¯ð¡„»å�¤è’­ð¡‹£ð¡�µð¡Œ¶è®�ð¡•·ð¡˜™ð¡Ÿƒð¡Ÿ‡ä¹¸ç‚»ð¡ ­ð¡¥ª"],
["9b40","ð¡¨­ð¡©…ð¡°ªð¡±°ð¡²¬ð¡»ˆæ‹ƒð¡»•ð¡¼•ç†˜æ¡•ð¢�…æ§©ã›ˆð¢‰¼ð¢�—ð¢�ºð¢œªð¢¡±ð¢¥�è‹½ð¢¥§ð¢¦“ð¢«•è¦¥ð¢«¨è¾ ð¢¬Žéž¸ð¢¬¿é¡‡éª½ð¢±Œ"],
["9b62","ð¢²ˆð¢²·ð¥¯¨ð¢´ˆð¢´’ð¢¶·ð¢¶•ð¢¹‚ð¢½´ð¢¿Œð£€³ð£�¦ð£ŒŸð£�žå¾±æ™ˆæš¿ð§©¹ð£•§ð£—³çˆ�ð¤¦ºçŸ—ð£˜šð£œ–çº‡ð �†å¢µæœŽ"],
["9ba1","æ¤˜ð£ª§ð§™—ð¥¿¢ð£¸‘ð£º¹ð§—¾ð¢‚šä£�äª¸ð¤„™ð¨ªšð¤‹®ð¤Œ�ð¤€»ð¤Œ´ð¤Ž–ð¤©…ð —Šå‡’ð ˜‘å¦Ÿð¡º¨ã®¾ð£³¿ð¤�„ð¤“–åžˆð¤™´ã¦›ð¤œ¯ð¨—¨ð©§‰ã�¢ð¢‡ƒè­žð¨­Žé§–ð¤ ’ð¤£»ð¤¨•çˆ‰ð¤«€ð ±¸å¥¥ð¤º¥ð¤¾†ð �¹è»šð¥€¬åŠ�åœ¿ç…±ð¥Š™ð¥�™ð£½Šð¤ª§å–¼ð¥‘†ð¥‘®ð¦­’é‡”ã‘³ð¥”¿ð§˜²ð¥•žäœ˜ð¥•¢ð¥•¦ð¥Ÿ‡ð¤¤¿ð¥¡�å�¦ã“»ð£�Œæƒžð¥¤ƒä�¼ð¨¥ˆð¥ª®ð¥®‰ð¥°†ð¡¶�åž¡ç…‘æ¾¶ð¦„‚ð§°’é�–ð¦†²ð¤¾šè­¢ð¦�‚ð¦‘Š"],
["9c40","åµ›ð¦¯·è¼¶ð¦’„ð¡¤œè«ªð¤§¶ð¦’ˆð£¿¯ð¦”’ä¯€ð¦–¿ð¦šµð¢œ›é‘¥ð¥Ÿ¡æ†•å¨§ð¯£�ä¾»åš¹ð¤”¡ð¦›¼ä¹ªð¤¤´é™–æ¶�ð¦²½ã˜˜è¥·ð¦ž™ð¦¡®ð¦�‘ð¦¡žç‡Ÿð¦£‡ç­‚ð©ƒ€ð ¨‘ð¦¤¦é„„ð¦¤¹ç©…é·°ð¦§ºé¨¦ð¦¨­ã™Ÿð¦‘©ð €¡ç¦ƒð¦¨´ð¦­›å´¬ð£”™è��ð¦®�ä›�ð¦²¤ç”»è¡¥ð¦¶®å¢¶"],
["9ca1","ãœœð¢–�ð§�‹ð§‡�ã±”ð§Š€ð§Š…éŠ�ð¢…ºð§Š‹éŒ°ð§‹¦ð¤§�æ°¹é’Ÿð§‘�ð »¸è §è£µð¢¤¦ð¨‘³ð¡ž±æº¸ð¤¨ªð¡  ã¦¤ãš¹å°�ç§£ä”¿æš¶ð©²­ð©¢¤è¥ƒð§ŸŒð§¡˜å›–äƒŸð¡˜Šã¦¡ð£œ¯ð¨ƒ¨ð¡�…ç†­è�¦ð§§�ð©†¨å©§ä²·ð§‚¯ð¨¦«ð§§½ð§¨Šð§¬‹ð§µ¦ð¤…ºç­ƒç¥¾ð¨€‰æ¾µðª‹Ÿæ¨ƒð¨Œ˜åŽ¢ð¦¸‡éŽ¿æ ¶é��ð¨…¯ð¨€£ð¦¦µð¡�­ð£ˆ¯ð¨�ˆå¶…ð¨°°ð¨‚ƒåœ•é £ð¨¥‰å¶«ð¤¦ˆæ–¾æ§•å�’ð¤ª¥ð£¾�ã°‘æœ¶ð¨‚�ð¨ƒ´ð¨„®ð¡¾¡ð¨…�"],
["9d40","ð¨†‰ð¨†¯ð¨ˆšð¨Œ†ð¨Œ¯ð¨ŽŠã—Šð¨‘¨ð¨šªä£ºæ�¦ð¨¥–ç ˆé‰•ð¨¦¸ä�²ð¨§§ä�Ÿð¨§¨ð¨­†ð¨¯”å§¸ð¨°‰è¼‹ð¨¿…ð©ƒ¬ç­‘ð©„�ð©„¼ã··ð©…žð¤«Šè¿�çŠ�åš‹ð©“§ð©—©ð©–°ð©–¸ð©œ²ð©£‘ð©¥‰ð©¥ªð©§ƒð©¨¨ð©¬Žð©µšð©¶›çºŸð©»¸ð©¼£ä²¤é•‡ðªŠ“ç†¢ðª‹¿ä¶‘é€’ðª—‹ä¶œð ²œè¾¾å—�"],
["9da1","è¾ºð¢’°è¾¹ð¤ª“ä”‰ç¹¿æ½–æª±ä»ªã“¤ð¨¬¬ð§¢�ãœºèº€ð¡Ÿµð¨€¤ð¨­¬ð¨®™ð§¨¾ð¦š¯ã·«ð§™•ð£²·ð¥˜µð¥¥–äºšð¥º�ð¦‰˜åš¿ð ¹­è¸Žå­­ð£ºˆð¤²žæ�žæ‹�ð¡Ÿ¶ð¡¡»æ”°å˜­ð¥±Šå�šð¥Œ‘ã·†ð©¶˜ä±½å˜¢å˜žç½‰ð¥»˜å¥µð£µ€è�°ä¸œð ¿ªð µ‰ð£šºè„—éµžè´˜ç˜»é±…ç™Žçž¹é�…å�²è…ˆè‹·å˜¥è„²è�˜è‚½å—ªç¥¢å™ƒå�–ð º�ã—Žå˜…å—±æ›±ð¨‹¢ã˜­ç”´å—°å–ºå’—å•²ð ±�ð ²–å»�ð¥…ˆð ¹¶ð¢±¢"],
["9e40","ð º¢éº«çµšå—žð¡�µæŠ�é�­å’”è³�ç‡¶é…¶æ�¼æŽ¹æ�¾å•©ð¢­ƒé±²ð¢º³å†šã“Ÿð ¶§å†§å‘�å”žå”“ç™¦è¸­ð¦¢Šç–±è‚¶è „èž†è£‡è†¶è�œð¡ƒ�ä“¬çŒ„ð¤œ†å®�èŒ‹ð¦¢“å™»ð¢›´ð§´¯ð¤†£ð§µ³ð¦»�ð§Š¶é…°ð¡‡™éˆˆð£³¼ðªš©ð º¬ð »¹ç‰¦ð¡²¢ä�Žð¤¿‚ð§¿¹ð ¿«äƒº"],
["9ea1","é±�æ”Ÿð¢¶ ä£³ð¤Ÿ ð©µ¼ð ¿¬ð ¸Šæ�¢ð§–£ð ¿­"],
["9ead","ð¦�ˆð¡†‡ç†£çºŽéµ�ä¸šä¸„ã•·å¬�æ²²å�§ãš¬ã§œå�½ãš¥ð¤˜˜å¢šð¤­®èˆ­å‘‹åžªð¥ª•ð ¥¹"],
["9ec5","ã©’ð¢‘¥ç�´ð©º¬ä´‰é¯­ð£³¾ð©¼°ä±›ð¤¾©ð©–žð©¿žè‘œð£¶¶ð§Š²ð¦ž³ð£œ æŒ®ç´¥ð£»·ð£¸¬ã¨ªé€ˆå‹Œã¹´ã™ºä—©ð ’Žç™€å«°ð º¶ç¡ºð§¼®å¢§ä‚¿å™¼é®‹åµ´ç™”ðª�´éº…ä³¡ç—¹ãŸ»æ„™ð£ƒšð¤�²"],
["9ef5","å™�ð¡Š©åž§ð¤¥£ð©¸†åˆ´ð§‚®ã–­æ±Šéµ¼"],
["9f40","ç±–é¬¹åŸžð¡�¬å±“æ““ð©“�ð¦Œµð§…¤èš­ð ´¨ð¦´¢ð¤«¢ð µ±"],
["9f4f","å‡¾ð¡¼�å¶Žéœƒð¡·‘éº�é�Œç¬Ÿé¬‚å³‘ç®£æ‰¨æŒµé«¿ç¯�é¬ªç±¾é¬®ç±‚ç²†é°•ç¯¼é¬‰é¼—é°›ð¤¤¾é½šå•³å¯ƒä¿½éº˜ä¿²å‰ ã¸†å‹‘å�§å�–å¦·å¸’éŸˆé¶«è½œå‘©éž´é¥€éžºåŒ¬æ„°"],
["9fa1","æ¤¬å�šé°Šé´‚ä°»é™�æ¦€å‚¦ç•†ð¡�­é§šå‰³"],
["9fae","é…™éš�é…œ"],
["9fb2","é…‘ð¨º—æ�¿ð¦´£æ«Šå˜‘é†Žç•ºæŠ…ð �¼ç��ç±°ð¥°¡ð£³½"],
["9fc1","ð¤¤™ç›–é®�ä¸ªð ³”èŽ¾è¡‚"],
["9fc9","å±Šæ§€åƒ­å�ºåˆŸå·µä»Žæ°±ð ‡²ä¼¹å’œå“šåŠšè¶‚ã—¾å¼Œã—³"],
["9fdb","æ­’é…¼é¾¥é®—é ®é¢´éªºéº¨éº„ç…ºç¬”"],
["9fe7","æ¯ºè ˜ç½¸"],
["9feb","å˜ ðª™Šè¹·é½“"],
["9ff0","è·”è¹�é¸œè¸�æŠ‚ð¨�½è¸¨è¹µç«“ð¤©·ç¨¾ç£˜æ³ªè©§ç˜‡"],
["a040","ð¨©šé¼¦æ³ŽèŸ–ç—ƒðªŠ²ç¡“ð¯¡€è´Œç‹¢ç�±è¬­çŒ‚ç“±è³«ð¤ª»è˜¯å¾ºè¢ ä’·"],
["a055","ð¡ »ð¦¸…"],
["a058","è©¾ð¢”›"],
["a05b","æƒ½ç™§é«—éµ„é�®é®�èŸµ"],
["a063","è �è³·çŒ¬éœ¡é®°ã—–çŠ²ä°‡ç±‘é¥Šð¦…™æ…™ä°„éº–æ…½"],
["a073","å�Ÿæ…¯æŠ¦æˆ¹æ‹Žã©œæ‡¢åŽªð£�µæ�¤æ ‚ã—’"],
["a0a1","åµ—ð¨¯‚è¿šð¨¸¹"],
["a0a6","åƒ™ð¡µ†ç¤†åŒ²é˜¸ð ¼»ä�¥"],
["a0ae","çŸ¾"],
["a0b0","ç³‚ð¥¼šç³šç¨­è�¦è�£çµ�ç”…ç“²è¦”èˆšæœŒè�¢ð§’†è�›ç“°è„ƒçœ¤è¦‰ð¦ŸŒç•“ð¦»‘èž©èŸŽè‡ˆèžŒè©‰è²­è­ƒçœ«ç“¸è“šã˜µæ¦²è¶¦"],
["a0d4","è¦©ç‘¨æ¶¹èŸ�ð¤€‘ç“§ã·›ç…¶æ‚¤æ†œã³‘ç…¢æ�·"],
["a0e2","ç½±ð¨¬­ç‰�æƒ©ä­¾åˆ ã°˜ð£³‡ð¥»—ð§™–ð¥”±ð¡¥„ð¡‹¾ð©¤ƒð¦·œð§‚­å³�ð¦†­ð¨¨�ð£™·ð ƒ®ð¦¡†ð¤¼Žä•¢å¬Ÿð¦�Œé½�éº¦ð¦‰«"],
["a3c0","â�€",31,"â�¡"],
["c6a1","â‘ ",9,"â‘´",9,"â…°",9,"ä¸¶ä¸¿äº…äº å†‚å†–å†«å‹¹åŒ¸å�©åŽ¶å¤Šå®€å·›â¼³å¹¿å»´å½�å½¡æ”´æ— ç–’ç™¶è¾µéš¶Â¨Ë†ãƒ½ãƒ¾ã‚�ã‚žã€ƒä»�ã€…ã€†ã€‡ãƒ¼ï¼»ï¼½âœ½ã��",23],
["c740","ã�™",58,"ã‚¡ã‚¢ã‚£ã‚¤"],
["c7a1","ã‚¥",81,"Ð�",5,"Ð�Ð–",4],
["c840","Ð›",26,"Ñ‘Ð¶",25,"â‡§â†¸â†¹ã‡�ð ƒŒä¹šð ‚Šåˆ‚ä’‘"],
["c8a1","é¾°å†ˆé¾±ð§˜‡"],
["c8cd","ï¿¢ï¿¤ï¼‡ï¼‚ãˆ±â„–â„¡ã‚›ã‚œâº€âº„âº†âº‡âºˆâºŠâºŒâº�âº•âºœâº�âº¥âº§âºªâº¬âº®âº¶âº¼âº¾â»†â»Šâ»Œâ»�â»�â»–â»—â»žâ»£"],
["c8f5","ÊƒÉ�É›É”ÉµÅ“Ã¸Å‹ÊŠÉª"],
["f9fe","ï¿­"],
["fa40","ð •‡é‹›ð —Ÿð£¿…è•ŒäŠµç�¯å†µã™‰ð¤¥‚ð¨§¤é�„ð¡§›è‹®ð£³ˆç ¼æ�„æ‹Ÿð¤¤³ð¨¦ªð Š ð¦®³ð¡Œ…ä¾«ð¢“­å€ˆð¦´©ð§ª„ð£˜€ð¤ª±ð¢”“å€©ð �¾å¾¤ð Ž€ð �‡æ»›ð �Ÿå�½å„�ã‘ºå„Žé¡¬ã�ƒè�–ð¤¦¤ð ’‡å… ð£Ž´å…ªð ¯¿ð¢ƒ¼ð ‹¥ð¢”°ð –Žð£ˆ³ð¡¦ƒå®‚è�½ð –³ð£²™å†²å†¸"],
["faa1","é´´å‡‰å‡�å‡‘ã³œå‡“ð¤ª¦å†³å‡¢å�‚å‡­è��æ¤¾ð£œ­å½»åˆ‹åˆ¦åˆ¼åŠµå‰—åŠ”åŠ¹å‹…ç°•è•‚å‹ è˜�ð¦¬“åŒ…ð¨«žå•‰æ»™ð£¾€ð ¥”ð£¿¬åŒ³å�„ð ¯¢æ³‹ð¡œ¦æ ›ç�•æ�Šãºªã£Œð¡›¨ç‡�ä’¢å�­å�´ð¨š«å�¾å�¿ð¡––ð¡˜“çŸ¦åŽ“ð¨ª›åŽ åŽ«åŽ®çŽ§ð¥�²ã½™çŽœå��å�…æ±‰ä¹‰åŸ¾å�™ãª«ð ®�å� ð£¿«ð¢¶£å�¶ð ±·å�“ç�¹å”«æ™—æµ›å‘­ð¦­“ð µ´å•�å’�å’¤äž¦ð¡œ�ð »�ã¶´ð µ�"],
["fb40","ð¨¦¼ð¢š˜å•‡ä³­å�¯ç�—å–†å–©å˜…ð¡£—ð¤€ºä•’ð¤�µæš³ð¡‚´å˜·æ›�ð£ŠŠæš¤æš­å™�å™�ç£±å›±éž‡å�¾åœ€å›¯å›­ð¨­¦ã˜£ð¡‰�å�†ð¤†¥æ±®ç‚‹å�‚ãš±ð¦±¾åŸ¦ð¡�–å ƒð¡‘”ð¤�£å ¦ð¤¯µå¡œå¢ªã•¡å£ å£œð¡ˆ¼å£»å¯¿å�ƒðª…�ð¤‰¸é�“ã–¡å¤Ÿæ¢¦ã›ƒæ¹™"],
["fba1","ð¡˜¾å¨¤å•“ð¡š’è”…å§‰ð µŽð¦²�ð¦´ªð¡Ÿœå§™ð¡Ÿ»ð¡ž²ð¦¶¦æµ±ð¡ ¨ð¡›•å§¹ð¦¹…åª«å©£ã›¦ð¤¦©å©·ãœˆåª–ç‘¥å«“ð¦¾¡ð¢•”ã¶…ð¡¤‘ãœ²ð¡š¸åºƒå‹�å­¶æ–ˆå­¼ð§¨Žä€„ä¡�ð ˆ„å¯•æ… ð¡¨´ð¥§Œð –¥å¯³å®�ä´�å°…ð¡­„å°“ç�Žå°”ð¡²¥ð¦¬¨å±‰ä£�å²…å³©å³¯å¶‹ð¡·¹ð¡¸·å´�å´˜åµ†ð¡º¤å²ºå·—è‹¼ã ­ð¤¤�ð¢�‰ð¢…³èŠ‡ã ¶ã¯‚å¸®æªŠå¹µå¹ºð¤’¼ð ³“åŽ¦äº·å»�åŽ¨ð¡�±å¸‰å»´ð¨’‚"],
["fc40","å»¹å»»ã¢ å»¼æ ¾é�›å¼�ð ‡�ð¯¢”ã«žä¢®ð¡Œºå¼ºð¦¢ˆð¢��å½˜ð¢‘±å½£éž½ð¦¹®å½²é�€ð¨¨¶å¾§å¶¶ãµŸð¥‰�ð¡½ªð§ƒ¸ð¢™¨é‡–ð Šžð¨¨©æ€±æš…ð¡¡·ã¥£ã·‡ã˜¹åž�ð¢ž´ç¥±ã¹€æ‚žæ‚¤æ‚³ð¤¦‚ð¤¦�ð§©“ç’¤åƒ¡åª æ…¤è�¤æ…‚ð¯¢¦ð¦»’æ†�å‡´ð ™–æ†‡å®ªð£¾·"],
["fca1","ð¢¡Ÿæ‡“ð¨®�ð©¥�æ‡�ã¤²ð¢¦€ð¢£�æ€£æ…œæ”žæŽ‹ð „˜æ‹…ð¡�°æ‹•ð¢¸�æ�¬ð¤§Ÿã¨—æ�¸æ�¸ð¡ŽŽð¡Ÿ¼æ’�æ¾Šð¢¸¶é ”ð¤‚Œð¥œ�æ“¡æ“¥é‘»ã©¦æ�ºã©—æ•�æ¼–ð¤¨¨ð¤¨£æ–…æ•­æ•Ÿð£�¾æ–µð¤¥€ä¬·æ—‘äƒ˜ð¡ ©æ— æ—£å¿Ÿð£�€æ˜˜ð£‡·ð£‡¸æ™„ð£†¤ð£†¥æ™‹ð ¹µæ™§ð¥‡¦æ™³æ™´ð¡¸½ð£ˆ±ð¨—´ð£‡ˆð¥Œ“çŸ…ð¢£·é¦¤æœ‚ð¤Žœð¤¨¡ã¬«æ§ºð£Ÿ‚æ�žæ�§æ�¢ð¤‡�ð©ƒ­æŸ—ä“©æ ¢æ¹�éˆ¼æ �ð£�¦ð¦¶ æ¡�"],
["fd40","ð£‘¯æ§¡æ¨‹ð¨«Ÿæ¥³æ£ƒð£—�æ¤�æ¤€ã´²ã¨�ð£˜¼ã®€æž¬æ¥¡ð¨©Šä‹¼æ¤¶æ¦˜ã®¡ð �‰è�£å‚�æ§¹ð£™™ð¢„ªæ©…ð£œƒæª�ã¯³æž±æ«ˆð©†œã°�æ¬�ð ¤£æƒžæ¬µæ­´ð¢Ÿ�æºµð£«›ð Žµð¡¥˜ã�€å�¡ð£­šæ¯¡ð£»¼æ¯œæ°·ð¢’‹ð¤£±ð¦­‘æ±šèˆ¦æ±¹ð£¶¼ä“…ð£¶½ð¤†¤ð¤¤Œð¤¤€"],
["fda1","ð£³‰ã›¥ã³«ð ´²é®ƒð£‡¹ð¢’‘ç¾�æ ·ð¦´¥ð¦¶¡ð¦·«æ¶–æµœæ¹¼æ¼„ð¤¥¿ð¤‚…ð¦¹²è”³ð¦½´å‡‡æ²œæ¸�è�®ð¨¬¡æ¸¯ð£¸¯ç‘“ð£¾‚ç§Œæ¹�åª‘ð£�‹æ¿¸ãœ�æ¾�ð£¸°æ»ºð¡’—ð¤€½ä••é�°æ½„æ½œãµŽæ½´ð©…°ã´»æ¾Ÿð¤…„æ¿“ð¤‚‘ð¤…•ð¤€¹ð£¿°ð£¾´ð¤„¿å‡Ÿð¤…–ð¤…—ð¤…€ð¦‡�ç�‹ç�¾ç‚§ç‚�çƒŒçƒ•çƒ–çƒŸä„„ã·¨ç†´ç†–ð¤‰·ç„«ç……åªˆç…Šç…®å²œð¤�¥ç…�é�¢ð¤‹�ç„¬ð¤‘šð¤¨§ð¤¨¢ç†ºð¨¯¨ç‚½çˆŽ"],
["fe40","é‘‚çˆ•å¤‘é‘ƒçˆ¤é��ð¥˜…çˆ®ç‰€ð¤¥´æ¢½ç‰•ç‰—ã¹•ð£�„æ �æ¼½çŠ‚çŒªçŒ«ð¤ £ð¨ «ä£­ð¨ „çŒ¨çŒ®ç��çŽªð °ºð¦¨®ç�‰ç‘‰ð¤‡¢ð¡›§ð¤¨¤æ˜£ã›…ð¤¦·ð¤¦�ð¤§»ç�·ç�•æ¤ƒð¤¨¦ç�¹ð —ƒã»—ç‘œð¢¢­ç‘ ð¨º²ç‘‡ç�¤ç‘¶èŽ¹ç‘¬ãœ°ç‘´é�±æ¨¬ç’‚ä¥“ð¤ªŒ"],
["fea1","ð¤…Ÿð¤©¹ð¨®�å­†ð¨°ƒð¡¢žç“ˆð¡¦ˆç”Žç“©ç”žð¨»™ð¡©‹å¯—ð¨º¬éŽ…ç•�ç•Šç•§ç•®ð¤¾‚ã¼„ð¤´“ç–Žç‘�ç–žç–´ç˜‚ç˜¬ç™‘ç™�ç™¯ç™¶ð¦�µçš�è‡¯ãŸ¸ð¦¤‘ð¦¤Žçš¡çš¥çš·ç›Œð¦¾Ÿè‘¢ð¥‚�ð¥…½ð¡¸œçœžçœ¦ç�€æ’¯ð¥ˆ ç�˜ð£Š¬çž¯ð¨¥¤ð¨¥¨ð¡›�çŸ´ç ‰ð¡�¶ð¤¨’æ£Šç¢¯ç£‡ç£“éš¥ç¤®ð¥— ç£—ç¤´ç¢±ð§˜Œè¾¸è¢„ð¨¬«ð¦‚ƒð¢˜œç¦†è¤€æ¤‚ç¦€ð¥¡—ç¦�ð§¬¹ç¤¼ç¦©æ¸ªð§„¦ãº¨ç§†ð©„�ç§”"]
]
[
["0","\u0000",127,"â‚¬"],
["8140","ä¸‚ä¸„ä¸…ä¸†ä¸�ä¸’ä¸—ä¸Ÿä¸ ä¸¡ä¸£ä¸¦ä¸©ä¸®ä¸¯ä¸±ä¸³ä¸µä¸·ä¸¼ä¹€ä¹�ä¹‚ä¹„ä¹†ä¹Šä¹‘ä¹•ä¹—ä¹šä¹›ä¹¢ä¹£ä¹¤ä¹¥ä¹§ä¹¨ä¹ª",5,"ä¹²ä¹´",9,"ä¹¿",6,"äº‡äºŠ"],
["8180","äº�äº–äº—äº™äºœäº�äºžäº£äºªäº¯äº°äº±äº´äº¶äº·äº¸äº¹äº¼äº½äº¾ä»ˆä»Œä»�ä»�ä»’ä»šä»›ä»œä» ä»¢ä»¦ä»§ä»©ä»­ä»®ä»¯ä»±ä»´ä»¸ä»¹ä»ºä»¼ä»¾ä¼€ä¼‚",6,"ä¼‹ä¼Œä¼’",4,"ä¼œä¼�ä¼¡ä¼£ä¼¨ä¼©ä¼¬ä¼­ä¼®ä¼±ä¼³ä¼µä¼·ä¼¹ä¼»ä¼¾",4,"ä½„ä½…ä½‡",5,"ä½’ä½”ä½–ä½¡ä½¢ä½¦ä½¨ä½ªä½«ä½­ä½®ä½±ä½²ä½µä½·ä½¸ä½¹ä½ºä½½ä¾€ä¾�ä¾‚ä¾…ä¾†ä¾‡ä¾Šä¾Œä¾Žä¾�ä¾’ä¾“ä¾•ä¾–ä¾˜ä¾™ä¾šä¾œä¾žä¾Ÿä¾¡ä¾¢"],
["8240","ä¾¤ä¾«ä¾­ä¾°",4,"ä¾¶",8,"ä¿€ä¿�ä¿‚ä¿†ä¿‡ä¿ˆä¿‰ä¿‹ä¿Œä¿�ä¿’",4,"ä¿™ä¿›ä¿ ä¿¢ä¿¤ä¿¥ä¿§ä¿«ä¿¬ä¿°ä¿²ä¿´ä¿µä¿¶ä¿·ä¿¹ä¿»ä¿¼ä¿½ä¿¿",11],
["8280","å€‹å€Žå€�å€‘å€“å€•å€–å€—å€›å€�å€žå€ å€¢å€£å€¤å€§å€«å€¯",10,"å€»å€½å€¿å�€å��å�‚å�„å�…å�†å�‰å�Šå�‹å��å��",4,"å�–å�—å�˜å�™å�›å��",7,"å�¦",5,"å�­",8,"å�¸å�¹å�ºå�¼å�½å‚�å‚‚å‚ƒå‚„å‚†å‚‡å‚‰å‚Šå‚‹å‚Œå‚Ž",20,"å‚¤å‚¦å‚ªå‚«å‚­",4,"å‚³",6,"å‚¼"],
["8340","å‚½",17,"åƒ�",5,"åƒ—åƒ˜åƒ™åƒ›",10,"åƒ¨åƒ©åƒªåƒ«åƒ¯åƒ°åƒ±åƒ²åƒ´åƒ¶",4,"åƒ¼",9,"å„ˆ"],
["8380","å„‰å„Šå„Œ",5,"å„“",13,"å„¢",28,"å…‚å…‡å…Šå…Œå…Žå…�å…�å…’å…“å…—å…˜å…™å…›å…�",4,"å…£å…¤å…¦å…§å…©å…ªå…¯å…²å…ºå…¾å…¿å†ƒå†„å††å†‡å†Šå†‹å†Žå†�å†�å†‘å†“å†”å†˜å†šå†�å†žå†Ÿå†¡å†£å†¦",4,"å†­å†®å†´å†¸å†¹å†ºå†¾å†¿å‡�å‡‚å‡ƒå‡…å‡ˆå‡Šå‡�å‡Žå‡�å‡’",5],
["8440","å‡˜å‡™å‡šå‡œå‡žå‡Ÿå‡¢å‡£å‡¥",5,"å‡¬å‡®å‡±å‡²å‡´å‡·å‡¾åˆ„åˆ…åˆ‰åˆ‹åˆŒåˆ�åˆ�åˆ“åˆ”åˆ•åˆœåˆžåˆŸåˆ¡åˆ¢åˆ£åˆ¥åˆ¦åˆ§åˆªåˆ¬åˆ¯åˆ±åˆ²åˆ´åˆµåˆ¼åˆ¾å‰„",5,"å‰‹å‰Žå‰�å‰’å‰“å‰•å‰—å‰˜"],
["8480","å‰™å‰šå‰›å‰�å‰Ÿå‰ å‰¢å‰£å‰¤å‰¦å‰¨å‰«å‰¬å‰­å‰®å‰°å‰±å‰³",9,"å‰¾åŠ€åŠƒ",4,"åŠ‰",6,"åŠ‘åŠ’åŠ”",6,"åŠœåŠ¤åŠ¥åŠ¦åŠ§åŠ®åŠ¯åŠ°åŠ´",9,"å‹€å‹�å‹‚å‹„å‹…å‹†å‹ˆå‹Šå‹Œå‹�å‹Žå‹�å‹‘å‹“å‹”å‹•å‹—å‹™",5,"å‹ å‹¡å‹¢å‹£å‹¥",10,"å‹±",7,"å‹»å‹¼å‹½åŒ�åŒ‚åŒƒåŒ„åŒ‡åŒ‰åŒŠåŒ‹åŒŒåŒŽ"],
["8540","åŒ‘åŒ’åŒ“åŒ”åŒ˜åŒ›åŒœåŒžåŒŸåŒ¢åŒ¤åŒ¥åŒ§åŒ¨åŒ©åŒ«åŒ¬åŒ­åŒ¯",9,"åŒ¼åŒ½å�€å�‚å�„å�†å�‹å�Œå��å��å�”å�˜å�™å�›å��å�¥å�¨å�ªå�¬å�­å�²å�¶å�¹å�»å�¼å�½å�¾åŽ€åŽ�åŽƒåŽ‡åŽˆåŽŠåŽŽåŽ�"],
["8580","åŽ�",4,"åŽ–åŽ—åŽ™åŽ›åŽœåŽžåŽ åŽ¡åŽ¤åŽ§åŽªåŽ«åŽ¬åŽ­åŽ¯",6,"åŽ·åŽ¸åŽ¹åŽºåŽ¼åŽ½åŽ¾å�€å�ƒ",4,"å�Žå��å��å�’å�“å�•å�šå�œå��å�žå�¡å�¢å�§å�´å�ºå�¾å�¿å�€å�‚å�…å�‡å�‹å�”å�˜å�™å�šå�œå�¢å�¤å�¥å�ªå�°å�³å�¶å�·å�ºå�½å�¿å‘�å‘‚å‘„å‘…å‘‡å‘‰å‘Œå‘�å‘Žå‘�å‘‘å‘šå‘�",4,"å‘£å‘¥å‘§å‘©",7,"å‘´å‘¹å‘ºå‘¾å‘¿å’�å’ƒå’…å’‡å’ˆå’‰å’Šå’�å’‘å’“å’—å’˜å’œå’žå’Ÿå’ å’¡"],
["8640","å’¢å’¥å’®å’°å’²å’µå’¶å’·å’¹å’ºå’¼å’¾å“ƒå“…å“Šå“‹å“–å“˜å“›å“ ",4,"å“«å“¬å“¯å“°å“±å“´",5,"å“»å“¾å”€å”‚å”ƒå”„å”…å”ˆå”Š",4,"å”’å”“å”•",5,"å”œå”�å”žå”Ÿå”¡å”¥å”¦"],
["8680","å”¨å”©å”«å”­å”²å”´å”µå”¶å”¸å”¹å”ºå”»å”½å•€å•‚å•…å•‡å•ˆå•‹",4,"å•‘å•’å•“å•”å•—",4,"å•�å•žå•Ÿå• å•¢å•£å•¨å•©å•«å•¯",5,"å•¹å•ºå•½å•¿å–…å–†å–Œå–�å–Žå–�å–’å–“å–•å––å–—å–šå–›å–žå– ",6,"å–¨",8,"å–²å–´å–¶å–¸å–ºå–¼å–¿",4,"å—†å—‡å—ˆå—Šå—‹å—Žå—�å—�å—•å——",4,"å—žå— å—¢å—§å—©å—­å—®å—°å—±å—´å—¶å—¸",4,"å—¿å˜‚å˜ƒå˜„å˜…"],
["8740","å˜†å˜‡å˜Šå˜‹å˜�å˜�",7,"å˜™å˜šå˜œå˜�å˜ å˜¡å˜¢å˜¥å˜¦å˜¨å˜©å˜ªå˜«å˜®å˜¯å˜°å˜³å˜µå˜·å˜¸å˜ºå˜¼å˜½å˜¾å™€",11,"å™�",4,"å™•å™–å™šå™›å™�",4],
["8780","å™£å™¥å™¦å™§å™­å™®å™¯å™°å™²å™³å™´å™µå™·å™¸å™¹å™ºå™½",7,"åš‡",6,"åš�åš‘åš’åš”",14,"åš¤",10,"åš°",6,"åš¸åš¹åšºåš»åš½",12,"å›‹",8,"å›•å›–å›˜å›™å›œå›£å›¥",5,"å›¬å›®å›¯å›²å›³å›¶å›·å›¸å›»å›¼åœ€åœ�åœ‚åœ…åœ‡åœ‹",6],
["8840","åœ’",9,"åœ�åœžåœ åœ¡åœ¢åœ¤åœ¥åœ¦åœ§åœ«åœ±åœ²åœ´",4,"åœ¼åœ½åœ¿å��å�ƒå�„å�…å�†å�ˆå�‰å�‹å�’",4,"å�˜å�™å�¢å�£å�¥å�§å�¬å�®å�°å�±å�²å�´å�µå�¸å�¹å�ºå�½å�¾å�¿åž€"],
["8880","åž�åž‡åžˆåž‰åžŠåž�",4,"åž”",6,"åžœåž�åžžåžŸåž¥åž¨åžªåž¬åž¯åž°åž±åž³åžµåž¶åž·åž¹",8,"åŸ„",6,"åŸŒåŸ�åŸ�åŸ‘åŸ“åŸ–åŸ—åŸ›åŸœåŸžåŸ¡åŸ¢åŸ£åŸ¥",7,"åŸ®åŸ°åŸ±åŸ²åŸ³åŸµåŸ¶åŸ·åŸ»åŸ¼åŸ¾åŸ¿å �å ƒå „å …å ˆå ‰å Šå Œå Žå �å �å ’å “å ”å –å —å ˜å šå ›å œå �å Ÿå ¢å £å ¥",4,"å «",4,"å ±å ²å ³å ´å ¶",7],
["8940","å ¾",5,"å¡…",6,"å¡Žå¡�å¡�å¡’å¡“å¡•å¡–å¡—å¡™",4,"å¡Ÿ",5,"å¡¦",4,"å¡­",16,"å¡¿å¢‚å¢„å¢†å¢‡å¢ˆå¢Šå¢‹å¢Œ"],
["8980","å¢�",4,"å¢”",4,"å¢›å¢œå¢�å¢ ",7,"å¢ª",17,"å¢½å¢¾å¢¿å£€å£‚å£ƒå£„å£†",10,"å£’å£“å£”å£–",13,"å£¥",5,"å£­å£¯å£±å£²å£´å£µå£·å£¸å£º",7,"å¤ƒå¤…å¤†å¤ˆ",4,"å¤Žå¤�å¤‘å¤’å¤“å¤—å¤˜å¤›å¤�å¤žå¤ å¤¡å¤¢å¤£å¤¦å¤¨å¤¬å¤°å¤²å¤³å¤µå¤¶å¤»"],
["8a40","å¤½å¤¾å¤¿å¥€å¥ƒå¥…å¥†å¥Šå¥Œå¥�å¥�å¥’å¥“å¥™å¥›",4,"å¥¡å¥£å¥¤å¥¦",12,"å¥µå¥·å¥ºå¥»å¥¼å¥¾å¥¿å¦€å¦…å¦‰å¦‹å¦Œå¦Žå¦�å¦�å¦‘å¦”å¦•å¦˜å¦šå¦›å¦œå¦�å¦Ÿå¦ å¦¡å¦¢å¦¦"],
["8a80","å¦§å¦¬å¦­å¦°å¦±å¦³",5,"å¦ºå¦¼å¦½å¦¿",6,"å§‡å§ˆå§‰å§Œå§�å§Žå§�å§•å§–å§™å§›å§ž",4,"å§¤å§¦å§§å§©å§ªå§«å§­",11,"å§ºå§¼å§½å§¾å¨€å¨‚å¨Šå¨‹å¨�å¨Žå¨�å¨�å¨’å¨”å¨•å¨–å¨—å¨™å¨šå¨›å¨�å¨žå¨¡å¨¢å¨¤å¨¦å¨§å¨¨å¨ª",6,"å¨³å¨µå¨·",4,"å¨½å¨¾å¨¿å©�",4,"å©‡å©ˆå©‹",9,"å©–å©—å©˜å©™å©›",5],
["8b40","å©¡å©£å©¤å©¥å©¦å©¨å©©å©«",8,"å©¸å©¹å©»å©¼å©½å©¾åª€",17,"åª“",6,"åªœ",13,"åª«åª¬"],
["8b80","åª­",4,"åª´åª¶åª·åª¹",4,"åª¿å«€å«ƒ",5,"å«Šå«‹å«�",4,"å«“å«•å«—å«™å«šå«›å«�å«žå«Ÿå«¢å«¤å«¥å«§å«¨å«ªå«¬",4,"å«²",22,"å¬Š",11,"å¬˜",25,"å¬³å¬µå¬¶å¬¸",7,"å­�",6],
["8c40","å­ˆ",7,"å­’å­–å­žå­ å­¡å­§å­¨å­«å­­å­®å­¯å­²å­´å­¶å­·å­¸å­¹å­»å­¼å­¾å­¿å®‚å®†å®Šå®�å®Žå®�å®‘å®’å®”å®–å®Ÿå®§å®¨å®©å®¬å®­å®®å®¯å®±å®²å®·å®ºå®»å®¼å¯€å¯�å¯ƒå¯ˆå¯‰å¯Šå¯‹å¯�å¯Žå¯�"],
["8c80","å¯‘å¯”",8,"å¯ å¯¢å¯£å¯¦å¯§å¯©",4,"å¯¯å¯±",6,"å¯½å¯¾å°€å°‚å°ƒå°…å°‡å°ˆå°‹å°Œå°�å°Žå°�å°’å°“å°—å°™å°›å°žå°Ÿå° å°¡å°£å°¦å°¨å°©å°ªå°«å°­å°®å°¯å°°å°²å°³å°µå°¶å°·å±ƒå±„å±†å±‡å±Œå±�å±’å±“å±”å±–å±—å±˜å±šå±›å±œå±�å±Ÿå±¢å±¤å±§",6,"å±°å±²",6,"å±»å±¼å±½å±¾å²€å²ƒ",4,"å²‰å²Šå²‹å²Žå²�å²’å²“å²•å²�",4,"å²¤",4],
["8d40","å²ªå²®å²¯å²°å²²å²´å²¶å²¹å²ºå²»å²¼å²¾å³€å³‚å³ƒå³…",5,"å³Œ",5,"å³“",5,"å³š",6,"å³¢å³£å³§å³©å³«å³¬å³®å³¯å³±",9,"å³¼",4],
["8d80","å´�å´„å´…å´ˆ",5,"å´�",4,"å´•å´—å´˜å´™å´šå´œå´�å´Ÿ",4,"å´¥å´¨å´ªå´«å´¬å´¯",4,"å´µ",7,"å´¿",7,"åµˆåµ‰åµ�",10,"åµ™åµšåµœåµž",10,"åµªåµ­åµ®åµ°åµ±åµ²åµ³åµµ",12,"å¶ƒ",21,"å¶šå¶›å¶œå¶žå¶Ÿå¶ "],
["8e40","å¶¡",21,"å¶¸",12,"å·†",6,"å·Ž",12,"å·œå·Ÿå· å·£å·¤å·ªå·¬å·­"],
["8e80","å·°å·µå·¶å·¸",4,"å·¿å¸€å¸„å¸‡å¸‰å¸Šå¸‹å¸�å¸Žå¸’å¸“å¸—å¸ž",7,"å¸¨",4,"å¸¯å¸°å¸²",4,"å¸¹å¸ºå¸¾å¸¿å¹€å¹�å¹ƒå¹†",5,"å¹�",6,"å¹–",4,"å¹œå¹�å¹Ÿå¹ å¹£",14,"å¹µå¹·å¹¹å¹¾åº�åº‚åºƒåº…åºˆåº‰åºŒåº�åºŽåº’åº˜åº›åº�åº¡åº¢åº£åº¤åº¨",4,"åº®",4,"åº´åººåº»åº¼åº½åº¿",6],
["8f40","å»†å»‡å»ˆå»‹",5,"å»”å»•å»—å»˜å»™å»šå»œ",11,"å»©å»«",8,"å»µå»¸å»¹å»»å»¼å»½å¼…å¼†å¼‡å¼‰å¼Œå¼�å¼Žå¼�å¼’å¼”å¼–å¼™å¼šå¼œå¼�å¼žå¼¡å¼¢å¼£å¼¤"],
["8f80","å¼¨å¼«å¼¬å¼®å¼°å¼²",6,"å¼»å¼½å¼¾å¼¿å½�",14,"å½‘å½”å½™å½šå½›å½œå½žå½Ÿå½ å½£å½¥å½§å½¨å½«å½®å½¯å½²å½´å½µå½¶å½¸å½ºå½½å½¾å½¿å¾ƒå¾†å¾�å¾Žå¾�å¾‘å¾“å¾”å¾–å¾šå¾›å¾�å¾žå¾Ÿå¾ å¾¢",5,"å¾©å¾«å¾¬å¾¯",5,"å¾¶å¾¸å¾¹å¾ºå¾»å¾¾",4,"å¿‡å¿ˆå¿Šå¿‹å¿Žå¿“å¿”å¿•å¿šå¿›å¿œå¿žå¿Ÿå¿¢å¿£å¿¥å¿¦å¿¨å¿©å¿¬å¿¯å¿°å¿²å¿³å¿´å¿¶å¿·å¿¹å¿ºå¿¼æ€‡"],
["9040","æ€ˆæ€‰æ€‹æ€Œæ€�æ€‘æ€“æ€—æ€˜æ€šæ€žæ€Ÿæ€¢æ€£æ€¤æ€¬æ€­æ€®æ€°",4,"æ€¶",4,"æ€½æ€¾æ�€æ�„",6,"æ�Œæ�Žæ��æ�‘æ�“æ�”æ�–æ�—æ�˜æ�›æ�œæ�žæ�Ÿæ� æ�¡æ�¥æ�¦æ�®æ�±æ�²æ�´æ�µæ�·æ�¾æ‚€"],
["9080","æ‚�æ‚‚æ‚…æ‚†æ‚‡æ‚ˆæ‚Šæ‚‹æ‚Žæ‚�æ‚�æ‚‘æ‚“æ‚•æ‚—æ‚˜æ‚™æ‚œæ‚žæ‚¡æ‚¢æ‚¤æ‚¥æ‚§æ‚©æ‚ªæ‚®æ‚°æ‚³æ‚µæ‚¶æ‚·æ‚¹æ‚ºæ‚½",7,"æƒ‡æƒˆæƒ‰æƒŒ",4,"æƒ’æƒ“æƒ”æƒ–æƒ—æƒ™æƒ›æƒžæƒ¡",4,"æƒªæƒ±æƒ²æƒµæƒ·æƒ¸æƒ»",4,"æ„‚æ„ƒæ„„æ„…æ„‡æ„Šæ„‹æ„Œæ„�",4,"æ„–æ„—æ„˜æ„™æ„›æ„œæ„�æ„žæ„¡æ„¢æ„¥æ„¨æ„©æ„ªæ„¬",18,"æ…€",6],
["9140","æ…‡æ…‰æ…‹æ…�æ…�æ…�æ…’æ…“æ…”æ…–",6,"æ…žæ…Ÿæ… æ…¡æ…£æ…¤æ…¥æ…¦æ…©",6,"æ…±æ…²æ…³æ…´æ…¶æ…¸",18,"æ†Œæ†�æ†�",4,"æ†•"],
["9180","æ†–",6,"æ†ž",8,"æ†ªæ†«æ†­",9,"æ†¸",5,"æ†¿æ‡€æ‡�æ‡ƒ",4,"æ‡‰æ‡Œ",4,"æ‡“æ‡•",16,"æ‡§",13,"æ‡¶",8,"æˆ€",5,"æˆ‡æˆ‰æˆ“æˆ”æˆ™æˆœæˆ�æˆžæˆ æˆ£æˆ¦æˆ§æˆ¨æˆ©æˆ«æˆ­æˆ¯æˆ°æˆ±æˆ²æˆµæˆ¶æˆ¸",4,"æ‰‚æ‰„æ‰…æ‰†æ‰Š"],
["9240","æ‰�æ‰�æ‰•æ‰–æ‰—æ‰™æ‰šæ‰œ",6,"æ‰¤æ‰¥æ‰¨æ‰±æ‰²æ‰´æ‰µæ‰·æ‰¸æ‰ºæ‰»æ‰½æŠ�æŠ‚æŠƒæŠ…æŠ†æŠ‡æŠˆæŠ‹",5,"æŠ”æŠ™æŠœæŠ�æŠžæŠ£æŠ¦æŠ§æŠ©æŠªæŠ­æŠ®æŠ¯æŠ°æŠ²æŠ³æŠ´æŠ¶æŠ·æŠ¸æŠºæŠ¾æ‹€æ‹�"],
["9280","æ‹ƒæ‹‹æ‹�æ‹‘æ‹•æ‹�æ‹žæ‹ æ‹¡æ‹¤æ‹ªæ‹«æ‹°æ‹²æ‹µæ‹¸æ‹¹æ‹ºæ‹»æŒ€æŒƒæŒ„æŒ…æŒ†æŒŠæŒ‹æŒŒæŒ�æŒ�æŒ�æŒ’æŒ“æŒ”æŒ•æŒ—æŒ˜æŒ™æŒœæŒ¦æŒ§æŒ©æŒ¬æŒ­æŒ®æŒ°æŒ±æŒ³",5,"æŒ»æŒ¼æŒ¾æŒ¿æ�€æ��æ�„æ�‡æ�ˆæ�Šæ�‘æ�’æ�“æ�”æ�–",7,"æ� æ�¤æ�¥æ�¦æ�¨æ�ªæ�«æ�¬æ�¯æ�°æ�²æ�³æ�´æ�µæ�¸æ�¹æ�¼æ�½æ�¾æ�¿æŽ�æŽƒæŽ„æŽ…æŽ†æŽ‹æŽ�æŽ‘æŽ“æŽ”æŽ•æŽ—æŽ™",6,"æŽ¡æŽ¤æŽ¦æŽ«æŽ¯æŽ±æŽ²æŽµæŽ¶æŽ¹æŽ»æŽ½æŽ¿æ�€"],
["9340","æ��æ�‚æ�ƒæ�…æ�‡æ�ˆæ�Šæ�‹æ�Œæ�‘æ�“æ�”æ�•æ�—",6,"æ�Ÿæ�¢æ�¤",4,"æ�«æ�¬æ�®æ�¯æ�°æ�±æ�³æ�µæ�·æ�¹æ�ºæ�»æ�¼æ�¾æ�ƒæ�„æ�†",4,"æ��æ�Žæ�‘æ�’æ�•",5,"æ��æ�Ÿæ�¢æ�£æ�¤"],
["9380","æ�¥æ�§æ�¨æ�©æ�«æ�®",5,"æ�µ",4,"æ�»æ�¼æ�¾æ‘€æ‘‚æ‘ƒæ‘‰æ‘‹",6,"æ‘“æ‘•æ‘–æ‘—æ‘™",4,"æ‘Ÿ",7,"æ‘¨æ‘ªæ‘«æ‘¬æ‘®",9,"æ‘»",6,"æ’ƒæ’†æ’ˆ",8,"æ’“æ’”æ’—æ’˜æ’šæ’›æ’œæ’�æ’Ÿ",4,"æ’¥æ’¦æ’§æ’¨æ’ªæ’«æ’¯æ’±æ’²æ’³æ’´æ’¶æ’¹æ’»æ’½æ’¾æ’¿æ“�æ“ƒæ“„æ“†",6,"æ“�æ“‘æ““æ“”æ“•æ“–æ“™æ“š"],
["9440","æ“›æ“œæ“�æ“Ÿæ“ æ“¡æ“£æ“¥æ“§",24,"æ”�",7,"æ”Š",7,"æ”“",4,"æ”™",8],
["9480","æ”¢æ”£æ”¤æ”¦",4,"æ”¬æ”­æ”°æ”±æ”²æ”³æ”·æ”ºæ”¼æ”½æ•€",4,"æ•†æ•‡æ•Šæ•‹æ•�æ•Žæ•�æ•’æ•“æ•”æ•—æ•˜æ•šæ•œæ•Ÿæ• æ•¡æ•¤æ•¥æ•§æ•¨æ•©æ•ªæ•­æ•®æ•¯æ•±æ•³æ•µæ•¶æ•¸",14,"æ–ˆæ–‰æ–Šæ–�æ–Žæ–�æ–’æ–”æ–•æ––æ–˜æ–šæ–�æ–žæ– æ–¢æ–£æ–¦æ–¨æ–ªæ–¬æ–®æ–±",7,"æ–ºæ–»æ–¾æ–¿æ—€æ—‚æ—‡æ—ˆæ—‰æ—Šæ—�æ—�æ—‘æ—“æ—”æ—•æ—˜",7,"æ—¡æ—£æ—¤æ—ªæ—«"],
["9540","æ—²æ—³æ—´æ—µæ—¸æ—¹æ—»",4,"æ˜�æ˜„æ˜…æ˜‡æ˜ˆæ˜‰æ˜‹æ˜�æ˜�æ˜‘æ˜’æ˜–æ˜—æ˜˜æ˜šæ˜›æ˜œæ˜žæ˜¡æ˜¢æ˜£æ˜¤æ˜¦æ˜©æ˜ªæ˜«æ˜¬æ˜®æ˜°æ˜²æ˜³æ˜·",4,"æ˜½æ˜¿æ™€æ™‚æ™„",6,"æ™�æ™Žæ™�æ™‘æ™˜"],
["9580","æ™™æ™›æ™œæ™�æ™žæ™ æ™¢æ™£æ™¥æ™§æ™©",4,"æ™±æ™²æ™³æ™µæ™¸æ™¹æ™»æ™¼æ™½æ™¿æš€æš�æšƒæš…æš†æšˆæš‰æšŠæš‹æš�æšŽæš�æš�æš’æš“æš”æš•æš˜",4,"æšž",8,"æš©",4,"æš¯",4,"æšµæš¶æš·æš¸æšºæš»æš¼æš½æš¿",25,"æ›šæ›ž",7,"æ›§æ›¨æ›ª",5,"æ›±æ›µæ›¶æ›¸æ›ºæ›»æ›½æœ�æœ‚æœƒ"],
["9640","æœ„æœ…æœ†æœ‡æœŒæœŽæœ�æœ‘æœ’æœ“æœ–æœ˜æœ™æœšæœœæœžæœ ",5,"æœ§æœ©æœ®æœ°æœ²æœ³æœ¶æœ·æœ¸æœ¹æœ»æœ¼æœ¾æœ¿æ��æ�„æ�…æ�‡æ�Šæ�‹æ��æ�’æ�”æ�•æ�—",4,"æ��æ�¢æ�£æ�¤æ�¦æ�§æ�«æ�¬æ�®æ�±æ�´æ�¶"],
["9680","æ�¸æ�¹æ�ºæ�»æ�½æž€æž‚æžƒæž…æž†æžˆæžŠæžŒæž�æžŽæž�æž‘æž’æž“æž”æž–æž™æž›æžŸæž æž¡æž¤æž¦æž©æž¬æž®æž±æž²æž´æž¹",7,"æŸ‚æŸ…",9,"æŸ•æŸ–æŸ—æŸ›æŸŸæŸ¡æŸ£æŸ¤æŸ¦æŸ§æŸ¨æŸªæŸ«æŸ­æŸ®æŸ²æŸµ",7,"æŸ¾æ �æ ‚æ ƒæ „æ †æ �æ �æ ’æ ”æ •æ ˜",4,"æ žæ Ÿæ  æ ¢",6,"æ «",6,"æ ´æ µæ ¶æ ºæ »æ ¿æ¡‡æ¡‹æ¡�æ¡�æ¡’æ¡–",5],
["9740","æ¡œæ¡�æ¡žæ¡Ÿæ¡ªæ¡¬",7,"æ¡µæ¡¸",8,"æ¢‚æ¢„æ¢‡",7,"æ¢�æ¢‘æ¢’æ¢”æ¢•æ¢–æ¢˜",9,"æ¢£æ¢¤æ¢¥æ¢©æ¢ªæ¢«æ¢¬æ¢®æ¢±æ¢²æ¢´æ¢¶æ¢·æ¢¸"],
["9780","æ¢¹",6,"æ£�æ£ƒ",5,"æ£Šæ£Œæ£Žæ£�æ£�æ£‘æ£“æ£”æ£–æ£—æ£™æ£›",4,"æ£¡æ£¢æ£¤",9,"æ£¯æ£²æ£³æ£´æ£¶æ£·æ£¸æ£»æ£½æ£¾æ£¿æ¤€æ¤‚æ¤ƒæ¤„æ¤†",4,"æ¤Œæ¤�æ¤‘æ¤“",11,"æ¤¡æ¤¢æ¤£æ¤¥",7,"æ¤®æ¤¯æ¤±æ¤²æ¤³æ¤µæ¤¶æ¤·æ¤¸æ¤ºæ¤»æ¤¼æ¤¾æ¥€æ¥�æ¥ƒ",16,"æ¥•æ¥–æ¥˜æ¥™æ¥›æ¥œæ¥Ÿ"],
["9840","æ¥¡æ¥¢æ¥¤æ¥¥æ¥§æ¥¨æ¥©æ¥ªæ¥¬æ¥­æ¥¯æ¥°æ¥²",4,"æ¥ºæ¥»æ¥½æ¥¾æ¥¿æ¦�æ¦ƒæ¦…æ¦Šæ¦‹æ¦Œæ¦Ž",5,"æ¦–æ¦—æ¦™æ¦šæ¦�",9,"æ¦©æ¦ªæ¦¬æ¦®æ¦¯æ¦°æ¦²æ¦³æ¦µæ¦¶æ¦¸æ¦¹æ¦ºæ¦¼æ¦½"],
["9880","æ¦¾æ¦¿æ§€æ§‚",7,"æ§‹æ§�æ§�æ§‘æ§’æ§“æ§•",5,"æ§œæ§�æ§žæ§¡",11,"æ§®æ§¯æ§°æ§±æ§³",9,"æ§¾æ¨€",9,"æ¨‹",11,"æ¨™",5,"æ¨ æ¨¢",5,"æ¨©æ¨«æ¨¬æ¨­æ¨®æ¨°æ¨²æ¨³æ¨´æ¨¶",6,"æ¨¿",4,"æ©…æ©†æ©ˆ",7,"æ©‘",6,"æ©š"],
["9940","æ©œ",4,"æ©¢æ©£æ©¤æ©¦",10,"æ©²",6,"æ©ºæ©»æ©½æ©¾æ©¿æª�æª‚æªƒæª…",8,"æª�æª’",4,"æª˜",7,"æª¡",5],
["9980","æª§æª¨æªªæª­",114,"æ¬¥æ¬¦æ¬¨",6],
["9a40","æ¬¯æ¬°æ¬±æ¬³æ¬´æ¬µæ¬¶æ¬¸æ¬»æ¬¼æ¬½æ¬¿æ­€æ­�æ­‚æ­„æ­…æ­ˆæ­Šæ­‹æ­�",11,"æ­š",7,"æ­¨æ­©æ­«",13,"æ­ºæ­½æ­¾æ­¿æ®€æ®…æ®ˆ"],
["9a80","æ®Œæ®Žæ®�æ®�æ®‘æ®”æ®•æ®—æ®˜æ®™æ®œ",4,"æ®¢",7,"æ®«",7,"æ®¶æ®¸",6,"æ¯€æ¯ƒæ¯„æ¯†",4,"æ¯Œæ¯Žæ¯�æ¯‘æ¯˜æ¯šæ¯œ",4,"æ¯¢",7,"æ¯¬æ¯­æ¯®æ¯°æ¯±æ¯²æ¯´æ¯¶æ¯·æ¯¸æ¯ºæ¯»æ¯¼æ¯¾",6,"æ°ˆ",4,"æ°Žæ°’æ°—æ°œæ°�æ°žæ° æ°£æ°¥æ°«æ°¬æ°­æ°±æ°³æ°¶æ°·æ°¹æ°ºæ°»æ°¼æ°¾æ°¿æ±ƒæ±„æ±…æ±ˆæ±‹",4,"æ±‘æ±’æ±“æ±–æ±˜"],
["9b40","æ±™æ±šæ±¢æ±£æ±¥æ±¦æ±§æ±«",4,"æ±±æ±³æ±µæ±·æ±¸æ±ºæ±»æ±¼æ±¿æ²€æ²„æ²‡æ²Šæ²‹æ²�æ²Žæ²‘æ²’æ²•æ²–æ²—æ²˜æ²šæ²œæ²�æ²žæ² æ²¢æ²¨æ²¬æ²¯æ²°æ²´æ²µæ²¶æ²·æ²ºæ³€æ³�æ³‚æ³ƒæ³†æ³‡æ³ˆæ³‹æ³�æ³Žæ³�æ³‘æ³’æ³˜"],
["9b80","æ³™æ³šæ³œæ³�æ³Ÿæ³¤æ³¦æ³§æ³©æ³¬æ³­æ³²æ³´æ³¹æ³¿æ´€æ´‚æ´ƒæ´…æ´†æ´ˆæ´‰æ´Šæ´�æ´�æ´�æ´‘æ´“æ´”æ´•æ´–æ´˜æ´œæ´�æ´Ÿ",5,"æ´¦æ´¨æ´©æ´¬æ´­æ´¯æ´°æ´´æ´¶æ´·æ´¸æ´ºæ´¿æµ€æµ‚æµ„æµ‰æµŒæµ�æµ•æµ–æµ—æµ˜æµ›æµ�æµŸæµ¡æµ¢æµ¤æµ¥æµ§æµ¨æµ«æµ¬æµ­æµ°æµ±æµ²æµ³æµµæµ¶æµ¹æµºæµ»æµ½",4,"æ¶ƒæ¶„æ¶†æ¶‡æ¶Šæ¶‹æ¶�æ¶�æ¶�æ¶’æ¶–",4,"æ¶œæ¶¢æ¶¥æ¶¬æ¶­æ¶°æ¶±æ¶³æ¶´æ¶¶æ¶·æ¶¹",5,"æ·�æ·‚æ·ƒæ·ˆæ·‰æ·Š"],
["9c40","æ·�æ·Žæ·�æ·�æ·’æ·“æ·”æ·•æ·—æ·šæ·›æ·œæ·Ÿæ·¢æ·£æ·¥æ·§æ·¨æ·©æ·ªæ·­æ·¯æ·°æ·²æ·´æ·µæ·¶æ·¸æ·ºæ·½",7,"æ¸†æ¸‡æ¸ˆæ¸‰æ¸‹æ¸�æ¸’æ¸“æ¸•æ¸˜æ¸™æ¸›æ¸œæ¸žæ¸Ÿæ¸¢æ¸¦æ¸§æ¸¨æ¸ªæ¸¬æ¸®æ¸°æ¸±æ¸³æ¸µ"],
["9c80","æ¸¶æ¸·æ¸¹æ¸»",7,"æ¹…",7,"æ¹�æ¹�æ¹‘æ¹’æ¹•æ¹—æ¹™æ¹šæ¹œæ¹�æ¹žæ¹ ",10,"æ¹¬æ¹­æ¹¯",14,"æº€æº�æº‚æº„æº‡æºˆæºŠ",4,"æº‘",6,"æº™æºšæº›æº�æºžæº æº¡æº£æº¤æº¦æº¨æº©æº«æº¬æº­æº®æº°æº³æºµæº¸æº¹æº¼æº¾æº¿æ»€æ»ƒæ»„æ»…æ»†æ»ˆæ»‰æ»Šæ»Œæ»�æ»Žæ»�æ»’æ»–æ»˜æ»™æ»›æ»œæ»�æ»£æ»§æ»ª",5],
["9d40","æ»°æ»±æ»²æ»³æ»µæ»¶æ»·æ»¸æ»º",7,"æ¼ƒæ¼„æ¼…æ¼‡æ¼ˆæ¼Š",4,"æ¼�æ¼‘æ¼’æ¼–",9,"æ¼¡æ¼¢æ¼£æ¼¥æ¼¦æ¼§æ¼¨æ¼¬æ¼®æ¼°æ¼²æ¼´æ¼µæ¼·",6,"æ¼¿æ½€æ½�æ½‚"],
["9d80","æ½ƒæ½„æ½…æ½ˆæ½‰æ½Šæ½Œæ½Ž",9,"æ½™æ½šæ½›æ½�æ½Ÿæ½ æ½¡æ½£æ½¤æ½¥æ½§",5,"æ½¯æ½°æ½±æ½³æ½µæ½¶æ½·æ½¹æ½»æ½½",6,"æ¾…æ¾†æ¾‡æ¾Šæ¾‹æ¾�",12,"æ¾�æ¾žæ¾Ÿæ¾ æ¾¢",4,"æ¾¨",10,"æ¾´æ¾µæ¾·æ¾¸æ¾º",5,"æ¿�æ¿ƒ",5,"æ¿Š",6,"æ¿“",10,"æ¿Ÿæ¿¢æ¿£æ¿¤æ¿¥"],
["9e40","æ¿¦",7,"æ¿°",32,"ç€’",7,"ç€œ",6,"ç€¤",6],
["9e80","ç€«",9,"ç€¶ç€·ç€¸ç€º",17,"ç��ç�Žç��",13,"ç�Ÿ",11,"ç�®ç�±ç�²ç�³ç�´ç�·ç�¹ç�ºç�»ç�½ç‚�ç‚‚ç‚ƒç‚„ç‚†ç‚‡ç‚ˆç‚‹ç‚Œç‚�ç‚�ç‚�ç‚‘ç‚“ç‚—ç‚˜ç‚šç‚›ç‚ž",12,"ç‚°ç‚²ç‚´ç‚µç‚¶ç‚ºç‚¾ç‚¿çƒ„çƒ…çƒ†çƒ‡çƒ‰çƒ‹",12,"çƒš"],
["9f40","çƒœçƒ�çƒžçƒ çƒ¡çƒ¢çƒ£çƒ¥çƒªçƒ®çƒ°",6,"çƒ¸çƒºçƒ»çƒ¼çƒ¾",10,"ç„‹",4,"ç„‘ç„’ç„”ç„—ç„›",10,"ç„§",7,"ç„²ç„³ç„´"],
["9f80","ç„µç„·",13,"ç…†ç…‡ç…ˆç…‰ç…‹ç…�ç…�",12,"ç…�ç…Ÿ",4,"ç…¥ç…©",4,"ç…¯ç…°ç…±ç…´ç…µç…¶ç…·ç…¹ç…»ç…¼ç…¾",5,"ç†…",4,"ç†‹ç†Œç†�ç†Žç†�ç†‘ç†’ç†“ç†•ç†–ç†—ç†š",4,"ç†¡",6,"ç†©ç†ªç†«ç†­",5,"ç†´ç†¶ç†·ç†¸ç†º",8,"ç‡„",9,"ç‡�",4],
["a040","ç‡–",9,"ç‡¡ç‡¢ç‡£ç‡¤ç‡¦ç‡¨",5,"ç‡¯",9,"ç‡º",11,"çˆ‡",19],
["a080","çˆ›çˆœçˆž",9,"çˆ©çˆ«çˆ­çˆ®çˆ¯çˆ²çˆ³çˆ´çˆºçˆ¼çˆ¾ç‰€",6,"ç‰‰ç‰Šç‰‹ç‰Žç‰�ç‰�ç‰‘ç‰“ç‰”ç‰•ç‰—ç‰˜ç‰šç‰œç‰žç‰ ç‰£ç‰¤ç‰¥ç‰¨ç‰ªç‰«ç‰¬ç‰­ç‰°ç‰±ç‰³ç‰´ç‰¶ç‰·ç‰¸ç‰»ç‰¼ç‰½çŠ‚çŠƒçŠ…",4,"çŠŒçŠŽçŠ�çŠ‘çŠ“",11,"çŠ ",11,"çŠ®çŠ±çŠ²çŠ³çŠµçŠº",6,"ç‹…ç‹†ç‹‡ç‹‰ç‹Šç‹‹ç‹Œç‹�ç‹‘ç‹“ç‹”ç‹•ç‹–ç‹˜ç‹šç‹›"],
["a1a1","ã€€ã€�ã€‚Â·Ë‰Ë‡Â¨ã€ƒã€…â€”ï½žâ€–â€¦â€˜â€™â€œâ€�ã€”ã€•ã€ˆ",7,"ã€–ã€—ã€�ã€‘Â±Ã—Ã·âˆ¶âˆ§âˆ¨âˆ‘âˆ�âˆªâˆ©âˆˆâˆ·âˆšâŠ¥âˆ¥âˆ âŒ’âŠ™âˆ«âˆ®â‰¡â‰Œâ‰ˆâˆ½âˆ�â‰ â‰®â‰¯â‰¤â‰¥âˆžâˆµâˆ´â™‚â™€Â°â€²â€³â„ƒï¼„Â¤ï¿ ï¿¡â€°Â§â„–â˜†â˜…â—‹â—�â—Žâ—‡â—†â–¡â– â–³â–²â€»â†’â†�â†‘â†“ã€“"],
["a2a1","â…°",9],
["a2b1","â’ˆ",19,"â‘´",19,"â‘ ",9],
["a2e5","ãˆ ",9],
["a2f1","â… ",11],
["a3a1","ï¼�ï¼‚ï¼ƒï¿¥ï¼…",88,"ï¿£"],
["a4a1","ã��",82],
["a5a1","ã‚¡",85],
["a6a1","Î‘",16,"Î£",6],
["a6c1","Î±",16,"Ïƒ",6],
["a6e0","ï¸µï¸¶ï¸¹ï¸ºï¸¿ï¹€ï¸½ï¸¾ï¹�ï¹‚ï¹ƒï¹„"],
["a6ee","ï¸»ï¸¼ï¸·ï¸¸ï¸±"],
["a6f4","ï¸³ï¸´"],
["a7a1","Ð�",5,"Ð�Ð–",25],
["a7d1","Ð°",5,"Ñ‘Ð¶",25],
["a840","ËŠË‹Ë™â€“â€•â€¥â€µâ„…â„‰â†–â†—â†˜â†™âˆ•âˆŸâˆ£â‰’â‰¦â‰§âŠ¿â•�",35,"â–�",6],
["a880","â–ˆ",7,"â–“â–”â–•â–¼â–½â—¢â—£â—¤â—¥â˜‰âŠ•ã€’ã€�ã€ž"],
["a8a1","Ä�Ã¡ÇŽÃ Ä“Ã©Ä›Ã¨Ä«Ã­Ç�Ã¬Å�Ã³Ç’Ã²Å«ÃºÇ”Ã¹Ç–Ç˜ÇšÇœÃ¼ÃªÉ‘"],
["a8bd","Å„Åˆ"],
["a8c0","É¡"],
["a8c5","ã„…",36],
["a940","ã€¡",8,"ãŠ£ãŽŽãŽ�ãŽœãŽ�ãŽžãŽ¡ã�„ã�Žã�‘ã�’ã�•ï¸°ï¿¢ï¿¤"],
["a959","â„¡ãˆ±"],
["a95c","â€�"],
["a960","ãƒ¼ã‚›ã‚œãƒ½ãƒ¾ã€†ã‚�ã‚žï¹‰",9,"ï¹”ï¹•ï¹–ï¹—ï¹™",8],
["a980","ï¹¢",4,"ï¹¨ï¹©ï¹ªï¹«"],
["a996","ã€‡"],
["a9a4","â”€",75],
["aa40","ç‹œç‹�ç‹Ÿç‹¢",5,"ç‹ªç‹«ç‹µç‹¶ç‹¹ç‹½ç‹¾ç‹¿çŒ€çŒ‚çŒ„",5,"çŒ‹çŒŒçŒ�çŒ�çŒ�çŒ‘çŒ’çŒ”çŒ˜çŒ™çŒšçŒŸçŒ çŒ£çŒ¤çŒ¦çŒ§çŒ¨çŒ­çŒ¯çŒ°çŒ²çŒ³çŒµçŒ¶çŒºçŒ»çŒ¼çŒ½ç�€",8],
["aa80","ç�‰ç�Šç�‹ç�Œç�Žç��ç�‘ç�“ç�”ç�•ç�–ç�˜",7,"ç�¡",10,"ç�®ç�°ç�±"],
["ab40","ç�²",11,"ç�¿",4,"çŽ…çŽ†çŽˆçŽŠçŽŒçŽ�çŽ�çŽ�çŽ’çŽ“çŽ”çŽ•çŽ—çŽ˜çŽ™çŽšçŽœçŽ�çŽžçŽ çŽ¡çŽ£",5,"çŽªçŽ¬çŽ­çŽ±çŽ´çŽµçŽ¶çŽ¸çŽ¹çŽ¼çŽ½çŽ¾çŽ¿ç��ç�ƒ",4],
["ab80","ç�‹ç�Œç�Žç�’",6,"ç�šç�›ç�œç��ç�Ÿç�¡ç�¢ç�£ç�¤ç�¦ç�¨ç�ªç�«ç�¬ç�®ç�¯ç�°ç�±ç�³",4],
["ac40","ç�¸",10,"ç�„ç�‡ç�ˆç�‹ç�Œç��ç�Žç�‘",8,"ç�œ",5,"ç�£ç�¤ç�§ç�©ç�«ç�­ç�¯ç�±ç�²ç�·",4,"ç�½ç�¾ç�¿ç‘€ç‘‚",11],
["ac80","ç‘Ž",6,"ç‘–ç‘˜ç‘�ç‘ ",12,"ç‘®ç‘¯ç‘±",4,"ç‘¸ç‘¹ç‘º"],
["ad40","ç‘»ç‘¼ç‘½ç‘¿ç’‚ç’„ç’…ç’†ç’ˆç’‰ç’Šç’Œç’�ç’�ç’‘",10,"ç’�ç’Ÿ",7,"ç’ª",15,"ç’»",12],
["ad80","ç“ˆ",9,"ç““",8,"ç“�ç“Ÿç“¡ç“¥ç“§",6,"ç“°ç“±ç“²"],
["ae40","ç“³ç“µç“¸",6,"ç”€ç”�ç”‚ç”ƒç”…",7,"ç”Žç”�ç”’ç””ç”•ç”–ç”—ç”›ç”�ç”žç” ",4,"ç”¦ç”§ç”ªç”®ç”´ç”¶ç”¹ç”¼ç”½ç”¿ç•�ç•‚ç•ƒç•„ç•†ç•‡ç•‰ç•Šç•�ç•�ç•‘ç•’ç•“ç••ç•–ç•—ç•˜"],
["ae80","ç•�",7,"ç•§ç•¨ç•©ç•«",6,"ç•³ç•µç•¶ç•·ç•º",4,"ç–€ç–�ç–‚ç–„ç–…ç–‡"],
["af40","ç–ˆç–‰ç–Šç–Œç–�ç–Žç–�ç–“ç–•ç–˜ç–›ç–œç–žç–¢ç–¦",4,"ç–­ç–¶ç–·ç–ºç–»ç–¿ç—€ç—�ç—†ç—‹ç—Œç—Žç—�ç—�ç—‘ç—“ç——ç—™ç—šç—œç—�ç—Ÿç— ç—¡ç—¥ç—©ç—¬ç—­ç—®ç—¯ç—²ç—³ç—µç—¶ç—·ç—¸ç—ºç—»ç—½ç—¾ç˜‚ç˜„ç˜†ç˜‡"],
["af80","ç˜ˆç˜‰ç˜‹ç˜�ç˜Žç˜�ç˜‘ç˜’ç˜“ç˜”ç˜–ç˜šç˜œç˜�ç˜žç˜¡ç˜£ç˜§ç˜¨ç˜¬ç˜®ç˜¯ç˜±ç˜²ç˜¶ç˜·ç˜¹ç˜ºç˜»ç˜½ç™�ç™‚ç™„"],
["b040","ç™…",6,"ç™Ž",5,"ç™•ç™—",4,"ç™�ç™Ÿç™ ç™¡ç™¢ç™¤",6,"ç™¬ç™­ç™®ç™°",7,"ç™¹ç™ºç™¼ç™¿çš€çš�çšƒçš…çš‰çšŠçšŒçš�çš�çš�çš’çš”çš•çš—çš˜çššçš›"],
["b080","çšœ",7,"çš¥",8,"çš¯çš°çš³çšµ",9,"ç›€ç›�ç›ƒå•Šé˜¿åŸƒæŒ¨å“Žå”‰å“€çš‘ç™Œè”¼çŸ®è‰¾ç¢�çˆ±éš˜éž�æ°¨å®‰ä¿ºæŒ‰æš—å²¸èƒºæ¡ˆè‚®æ˜‚ç›Žå‡¹æ•–ç†¬ç¿±è¢„å‚²å¥¥æ‡Šæ¾³èŠ­æ�Œæ‰’å�­å�§ç¬†å…«ç–¤å·´æ‹”è·‹é�¶æŠŠè€™å��éœ¸ç½¢çˆ¸ç™½æŸ�ç™¾æ‘†ä½°è´¥æ‹œç¨—æ–‘ç�­æ�¬æ‰³èˆ¬é¢�æ�¿ç‰ˆæ‰®æ‹Œä¼´ç“£å�ŠåŠžç»Šé‚¦å¸®æ¢†æ¦œè†€ç»‘æ£’ç£…èšŒé•‘å‚�è°¤è‹žèƒžåŒ…è¤’å‰¥"],
["b140","ç›„ç›‡ç›‰ç›‹ç›Œç›“ç›•ç›™ç›šç›œç›�ç›žç› ",4,"ç›¦",7,"ç›°ç›³ç›µç›¶ç›·ç›ºç›»ç›½ç›¿çœ€çœ‚çœƒçœ…çœ†çœŠçœŒçœŽ",10,"çœ›çœœçœ�çœžçœ¡çœ£çœ¤çœ¥çœ§çœªçœ«"],
["b180","çœ¬çœ®çœ°",4,"çœ¹çœ»çœ½çœ¾çœ¿ç�‚ç�„ç�…ç�†ç�ˆ",7,"ç�’",7,"ç�œè–„é›¹ä¿�å ¡é¥±å®�æŠ±æŠ¥æš´è±¹é²�çˆ†æ�¯ç¢‘æ‚²å�‘åŒ—è¾ˆèƒŒè´�é’¡å€�ç‹ˆå¤‡æƒ«ç„™è¢«å¥”è‹¯æœ¬ç¬¨å´©ç»·ç”­æ³µè¹¦è¿¸é€¼é¼»æ¯”é„™ç¬”å½¼ç¢§è“–è”½æ¯•æ¯™æ¯–å¸�åº‡ç—¹é—­æ•�å¼Šå¿…è¾Ÿå£�è‡‚é�¿é™›éž­è¾¹ç¼–è´¬æ‰�ä¾¿å�˜å�žè¾¨è¾©è¾«é��æ ‡å½ªè†˜è¡¨é³–æ†‹åˆ«ç˜ªå½¬æ–Œæ¿’æ»¨å®¾æ‘ˆå…µå†°æŸ„ä¸™ç§‰é¥¼ç‚³"],
["b240","ç��ç�žç�Ÿç� ç�¤ç�§ç�©ç�ªç�­",11,"ç�ºç�»ç�¼çž�çž‚çžƒçž†",5,"çž�çž�çž“",11,"çž¡çž£çž¤çž¦çž¨çž«çž­çž®çž¯çž±çž²çž´çž¶",4],
["b280","çž¼çž¾çŸ€",12,"çŸŽ",8,"çŸ˜çŸ™çŸšçŸ�",4,"çŸ¤ç—…å¹¶çŽ»è� æ’­æ‹¨é’µæ³¢å�šå‹ƒæ��é“‚ç®”ä¼¯å¸›èˆ¶è„–è†Šæ¸¤æ³Šé©³æ�•å�œå“ºè¡¥åŸ ä¸�å¸ƒæ­¥ç°¿éƒ¨æ€–æ“¦çŒœè£�æ��æ‰�è´¢ç�¬è¸©é‡‡å½©è�œè”¡é¤�å�‚èš•æ®‹æƒ­æƒ¨ç�¿è‹�èˆ±ä»“æ²§è—�æ“�ç³™æ§½æ›¹è�‰åŽ•ç­–ä¾§å†Œæµ‹å±‚è¹­æ�’å�‰èŒ¬èŒ¶æŸ¥ç¢´æ�½å¯Ÿå²”å·®è¯§æ‹†æŸ´è±ºæ�€æŽºè�‰é¦‹è°—ç¼ é“²äº§é˜�é¢¤æ˜ŒçŒ–"],
["b340","çŸ¦çŸ¨çŸªçŸ¯çŸ°çŸ±çŸ²çŸ´çŸµçŸ·çŸ¹çŸºçŸ»çŸ¼ç ƒ",5,"ç Šç ‹ç Žç �ç �ç “ç •ç ™ç ›ç žç  ç ¡ç ¢ç ¤ç ¨ç ªç «ç ®ç ¯ç ±ç ²ç ³ç µç ¶ç ½ç ¿ç¡�ç¡‚ç¡ƒç¡„ç¡†ç¡ˆç¡‰ç¡Šç¡‹ç¡�ç¡�ç¡‘ç¡“ç¡”ç¡˜ç¡™ç¡š"],
["b380","ç¡›ç¡œç¡ž",11,"ç¡¯",7,"ç¡¸ç¡¹ç¡ºç¡»ç¡½",6,"åœºå°�å¸¸é•¿å�¿è‚ åŽ‚æ•žç•…å”±å€¡è¶…æŠ„é’žæœ�å˜²æ½®å·¢å�µç‚’è½¦æ‰¯æ’¤æŽ£å½»æ¾ˆéƒ´è‡£è¾°å°˜æ™¨å¿±æ²‰é™ˆè¶�è¡¬æ’‘ç§°åŸŽæ©™æˆ�å‘ˆä¹˜ç¨‹æƒ©æ¾„è¯šæ‰¿é€žéª‹ç§¤å�ƒç—´æŒ�åŒ™æ± è¿Ÿå¼›é©°è€»é½¿ä¾ˆå°ºèµ¤ç¿…æ–¥ç‚½å……å†²è™«å´‡å® æŠ½é…¬ç•´è¸Œç¨ æ„�ç­¹ä»‡ç»¸çž…ä¸‘è‡­åˆ�å‡ºæ©±åŽ¨èº‡é”„é›�æ»�é™¤æ¥š"],
["b440","ç¢„ç¢…ç¢†ç¢ˆç¢Šç¢‹ç¢�ç¢�ç¢’ç¢”ç¢•ç¢–ç¢™ç¢�ç¢žç¢ ç¢¢ç¢¤ç¢¦ç¢¨",7,"ç¢µç¢¶ç¢·ç¢¸ç¢ºç¢»ç¢¼ç¢½ç¢¿ç£€ç£‚ç£ƒç£„ç£†ç£‡ç£ˆç£Œç£�ç£Žç£�ç£‘ç£’ç£“ç£–ç£—ç£˜ç£š",9],
["b480","ç£¤ç£¥ç£¦ç£§ç£©ç£ªç£«ç£­",4,"ç£³ç£µç£¶ç£¸ç£¹ç£»",5,"ç¤‚ç¤ƒç¤„ç¤†",6,"ç¡€å‚¨çŸ—æ��è§¦å¤„æ�£å·�ç©¿æ¤½ä¼ èˆ¹å–˜ä¸²ç–®çª—å¹¢åºŠé—¯åˆ›å�¹ç‚Šæ�¶é”¤åž‚æ˜¥æ¤¿é†‡å”‡æ·³çº¯è ¢æˆ³ç»°ç–µèŒ¨ç£�é›Œè¾žæ…ˆç“·è¯�æ­¤åˆºèµ�æ¬¡è�ªè‘±å›±åŒ†ä»Žä¸›å‡‘ç²—é†‹ç°‡ä¿ƒè¹¿ç¯¡çªœæ‘§å´”å‚¬è„†ç˜�ç²¹æ·¬ç¿ æ�‘å­˜å¯¸ç£‹æ’®æ�“æŽªæŒ«é”™æ�­è¾¾ç­”ç˜©æ‰“å¤§å‘†æ­¹å‚£æˆ´å¸¦æ®†ä»£è´·è¢‹å¾…é€®"],
["b540","ç¤�",5,"ç¤”",9,"ç¤Ÿ",4,"ç¤¥",14,"ç¤µ",4,"ç¤½ç¤¿ç¥‚ç¥ƒç¥„ç¥…ç¥‡ç¥Š",8,"ç¥”ç¥•ç¥˜ç¥™ç¥¡ç¥£"],
["b580","ç¥¤ç¥¦ç¥©ç¥ªç¥«ç¥¬ç¥®ç¥°",6,"ç¥¹ç¥»",4,"ç¦‚ç¦ƒç¦†ç¦‡ç¦ˆç¦‰ç¦‹ç¦Œç¦�ç¦Žç¦�ç¦‘ç¦’æ€ è€½æ‹…ä¸¹å�•éƒ¸æŽ¸èƒ†æ—¦æ°®ä½†æƒ®æ·¡è¯žå¼¹è›‹å½“æŒ¡å…šè�¡æ¡£åˆ€æ�£è¹ˆå€’å²›ç¥·å¯¼åˆ°ç¨»æ‚¼é�“ç›—å¾·å¾—çš„è¹¬ç�¯ç™»ç­‰çžªå‡³é‚“å ¤ä½Žæ»´è¿ªæ•Œç¬›ç‹„æ¶¤ç¿Ÿå«¡æŠµåº•åœ°è’‚ç¬¬å¸�å¼Ÿé€’ç¼”é¢ æŽ‚æ»‡ç¢˜ç‚¹å…¸é�›åž«ç”µä½ƒç”¸åº—æƒ¦å¥ æ·€æ®¿ç¢‰å�¼é›•å‡‹åˆ�æŽ‰å�Šé’“è°ƒè·Œçˆ¹ç¢Ÿè�¶è¿­è°�å� "],
["b640","ç¦“",6,"ç¦›",11,"ç¦¨",10,"ç¦´",4,"ç¦¼ç¦¿ç§‚ç§„ç§…ç§‡ç§ˆç§Šç§Œç§Žç§�ç§�ç§“ç§”ç§–ç§—ç§™",5,"ç§ ç§¡ç§¢ç§¥ç§¨ç§ª"],
["b680","ç§¬ç§®ç§±",6,"ç§¹ç§ºç§¼ç§¾ç§¿ç¨�ç¨„ç¨…ç¨‡ç¨ˆç¨‰ç¨Šç¨Œç¨�",4,"ç¨•ç¨–ç¨˜ç¨™ç¨›ç¨œä¸�ç›¯å�®é’‰é¡¶é¼Žé”­å®šè®¢ä¸¢ä¸œå†¬è‘£æ‡‚åŠ¨æ ‹ä¾—æ�«å†»æ´žå…œæŠ–æ–—é™¡è±†é€—ç—˜éƒ½ç�£æ¯’çŠŠç‹¬è¯»å µç�¹èµŒæ�œé•€è‚šåº¦æ¸¡å¦’ç«¯çŸ­é”»æ®µæ–­ç¼Žå †å…‘é˜Ÿå¯¹å¢©å�¨è¹²æ•¦é¡¿å›¤é’�ç›¾é��æŽ‡å“†å¤šå¤ºåž›èº²æœµè·ºèˆµå‰�æƒ°å •è›¾å³¨é¹…ä¿„é¢�è®¹å¨¥æ�¶åŽ„æ‰¼é��é„‚é¥¿æ�©è€Œå„¿è€³å°”é¥µæ´±äºŒ"],
["b740","ç¨�ç¨Ÿç¨¡ç¨¢ç¨¤",14,"ç¨´ç¨µç¨¶ç¨¸ç¨ºç¨¾ç©€",5,"ç©‡",9,"ç©’",4,"ç©˜",16],
["b780","ç©©",6,"ç©±ç©²ç©³ç©µç©»ç©¼ç©½ç©¾çª‚çª…çª‡çª‰çªŠçª‹çªŒçªŽçª�çª�çª“çª”çª™çªšçª›çªžçª¡çª¢è´°å�‘ç½šç­�ä¼�ä¹�é˜€æ³•ç��è—©å¸†ç•ªç¿»æ¨ŠçŸ¾é’’ç¹�å‡¡çƒ¦å��è¿”èŒƒè´©çŠ¯é¥­æ³›å�ŠèŠ³æ–¹è‚ªæˆ¿é˜²å¦¨ä»¿è®¿çººæ”¾è�²é�žå•¡é£žè‚¥åŒªè¯½å� è‚ºåºŸæ²¸è´¹èŠ¬é…šå�©æ°›åˆ†çº·å�Ÿç„šæ±¾ç²‰å¥‹ä»½å¿¿æ„¤ç²ªä¸°å°�æž«èœ‚å³°é”‹é£Žç–¯çƒ½é€¢å†¯ç¼�è®½å¥‰å‡¤ä½›å�¦å¤«æ•·è‚¤å­µæ‰¶æ‹‚è¾�å¹…æ°Ÿç¬¦ä¼�ä¿˜æœ�"],
["b840","çª£çª¤çª§çª©çªªçª«çª®",4,"çª´",10,"ç«€",10,"ç«Œ",9,"ç«—ç«˜ç«šç«›ç«œç«�ç«¡ç«¢ç«¤ç«§",5,"ç«®ç«°ç«±ç«²ç«³"],
["b880","ç«´",4,"ç«»ç«¼ç«¾ç¬€ç¬�ç¬‚ç¬…ç¬‡ç¬‰ç¬Œç¬�ç¬Žç¬�ç¬’ç¬“ç¬–ç¬—ç¬˜ç¬šç¬œç¬�ç¬Ÿç¬¡ç¬¢ç¬£ç¬§ç¬©ç¬­æµ®æ¶ªç¦�è¢±å¼—ç”«æŠšè¾…ä¿¯é‡œæ–§è„¯è…‘åºœè…�èµ´å‰¯è¦†èµ‹å¤�å‚…ä»˜é˜œçˆ¶è…¹è´Ÿå¯Œè®£é™„å¦‡ç¼šå’�å™¶å˜Žè¯¥æ”¹æ¦‚é’™ç›–æº‰å¹²ç”˜æ�†æŸ‘ç«¿è‚�èµ¶æ„Ÿç§†æ•¢èµ£å†ˆåˆšé’¢ç¼¸è‚›çº²å²—æ¸¯æ� ç¯™çš‹é«˜è†�ç¾”ç³•æ�žé•�ç¨¿å‘Šå“¥æ­Œæ��æˆˆé¸½èƒ³ç–™å‰²é�©è‘›æ ¼è›¤é˜�éš”é“¬ä¸ªå�„ç»™æ ¹è·Ÿè€•æ›´åºšç¾¹"],
["b940","ç¬¯ç¬°ç¬²ç¬´ç¬µç¬¶ç¬·ç¬¹ç¬»ç¬½ç¬¿",5,"ç­†ç­ˆç­Šç­�ç­Žç­“ç­•ç­—ç­™ç­œç­žç­Ÿç­¡ç­£",10,"ç­¯ç­°ç­³ç­´ç­¶ç­¸ç­ºç­¼ç­½ç­¿ç®�ç®‚ç®ƒç®„ç®†",6,"ç®Žç®�"],
["b980","ç®‘ç®’ç®“ç®–ç®˜ç®™ç®šç®›ç®žç®Ÿç® ç®£ç®¤ç®¥ç®®ç®¯ç®°ç®²ç®³ç®µç®¶ç®·ç®¹",7,"ç¯‚ç¯ƒç¯„åŸ‚è€¿æ¢—å·¥æ”»åŠŸæ�­é¾šä¾›èº¬å…¬å®«å¼“å·©æ±žæ‹±è´¡å…±é’©å‹¾æ²Ÿè‹Ÿç‹—åž¢æž„è´­å¤Ÿè¾œè�‡å’•ç®�ä¼°æ²½å­¤å§‘é¼“å�¤è›Šéª¨è°·è‚¡æ•…é¡¾å›ºé›‡åˆ®ç“œå‰�å¯¡æŒ‚è¤‚ä¹–æ‹�æ€ªæ£ºå…³å®˜å† è§‚ç®¡é¦†ç½�æƒ¯ç�Œè´¯å…‰å¹¿é€›ç‘°è§„åœ­ç¡…å½’é¾Ÿé—ºè½¨é¬¼è¯¡ç™¸æ¡‚æŸœè·ªè´µåˆ½è¾Šæ»šæ£�é”…éƒ­å›½æžœè£¹è¿‡å“ˆ"],
["ba40","ç¯…ç¯ˆç¯‰ç¯Šç¯‹ç¯�ç¯Žç¯�ç¯�ç¯’ç¯”",4,"ç¯›ç¯œç¯žç¯Ÿç¯ ç¯¢ç¯£ç¯¤ç¯§ç¯¨ç¯©ç¯«ç¯¬ç¯­ç¯¯ç¯°ç¯²",4,"ç¯¸ç¯¹ç¯ºç¯»ç¯½ç¯¿",7,"ç°ˆç°‰ç°Šç°�ç°Žç°�",5,"ç°—ç°˜ç°™"],
["ba80","ç°š",4,"ç° ",5,"ç°¨ç°©ç°«",12,"ç°¹",5,"ç±‚éª¸å­©æµ·æ°¦äº¥å®³éª‡é…£æ†¨é‚¯éŸ©å�«æ¶µå¯’å‡½å–Šç½•ç¿°æ’¼æ��æ—±æ†¾æ‚�ç„Šæ±—æ±‰å¤¯æ�­èˆªå£•åšŽè±ªæ¯«éƒ�å¥½è€—å�·æµ©å‘µå–�è�·è��æ ¸ç¦¾å’Œä½•å�ˆç›’è²‰é˜‚æ²³æ¶¸èµ«è¤�é¹¤è´ºå˜¿é»‘ç—•å¾ˆç‹ æ�¨å“¼äº¨æ¨ªè¡¡æ�’è½°å“„çƒ˜è™¹é¸¿æ´ªå®�å¼˜çº¢å–‰ä¾¯çŒ´å�¼åŽšå€™å�Žå‘¼ä¹Žå¿½ç‘šå£¶è‘«èƒ¡è�´ç‹�ç³Šæ¹–"],
["bb40","ç±ƒ",9,"ç±Ž",36,"ç±µ",5,"ç±¾",9],
["bb80","ç²ˆç²Š",6,"ç²“ç²”ç²–ç²™ç²šç²›ç² ç²¡ç²£ç²¦ç²§ç²¨ç²©ç²«ç²¬ç²­ç²¯ç²°ç²´",4,"ç²ºç²»å¼§è™Žå”¬æŠ¤äº’æ²ªæˆ·èŠ±å“—å�ŽçŒ¾æ»‘ç”»åˆ’åŒ–è¯�æ§�å¾Šæ€€æ·®å��æ¬¢çŽ¯æ¡“è¿˜ç¼“æ�¢æ‚£å”¤ç—ªè±¢ç„•æ¶£å®¦å¹»è�’æ…Œé»„ç£ºè�—ç°§çš‡å‡°æƒ¶ç…Œæ™ƒå¹Œæ��è°Žç�°æŒ¥è¾‰å¾½æ�¢è›”å›žæ¯�æ‚”æ…§å�‰æƒ æ™¦è´¿ç§½ä¼šçƒ©æ±‡è®³è¯²ç»˜è�¤æ˜�å©šé­‚æµ‘æ··è±�æ´»ä¼™ç�«èŽ·æˆ–æƒ‘éœ�è´§ç¥¸å‡»åœ¾åŸºæœºç•¸ç¨½ç§¯ç®•"],
["bc40","ç²¿ç³€ç³‚ç³ƒç³„ç³†ç³‰ç³‹ç³Ž",6,"ç³˜ç³šç³›ç³�ç³žç³¡",6,"ç³©",5,"ç³°",7,"ç³¹ç³ºç³¼",13,"ç´‹",5],
["bc80","ç´‘",14,"ç´¡ç´£ç´¤ç´¥ç´¦ç´¨ç´©ç´ªç´¬ç´­ç´®ç´°",6,"è‚Œé¥¥è¿¹æ¿€è®¥é¸¡å§¬ç»©ç¼‰å�‰æž�æ£˜è¾‘ç±�é›†å�Šæ€¥ç–¾æ±²å�³å«‰çº§æŒ¤å‡ è„Šå·±è“ŸæŠ€å†€å­£ä¼Žç¥­å‰‚æ‚¸æµŽå¯„å¯‚è®¡è®°æ—¢å¿Œé™…å¦“ç»§çºªå˜‰æž·å¤¹ä½³å®¶åŠ è�šé¢Šè´¾ç”²é’¾å�‡ç¨¼ä»·æž¶é©¾å«�æ­¼ç›‘å�šå°–ç¬ºé—´ç…Žå…¼è‚©è‰°å¥¸ç¼„èŒ§æ£€æŸ¬ç¢±ç¡·æ‹£æ�¡ç®€ä¿­å‰ªå‡�è��æ§›é‰´è·µè´±è§�é”®ç®­ä»¶"],
["bd40","ç´·",54,"çµ¯",7],
["bd80","çµ¸",32,"å�¥èˆ°å‰‘é¥¯æ¸�æº…æ¶§å»ºåƒµå§œå°†æµ†æ±Ÿç–†è’‹æ¡¨å¥–è®²åŒ é…±é™�è•‰æ¤’ç¤�ç„¦èƒ¶äº¤éƒŠæµ‡éª„å¨‡åš¼æ�…é“°çŸ«ä¾¥è„šç‹¡è§’é¥ºç¼´ç»žå‰¿æ•™é…µè½¿è¾ƒå�«çª–æ�­æŽ¥çš†ç§¸è¡—é˜¶æˆªåŠ«èŠ‚æ¡”æ�°æ�·ç�«ç«­æ´�ç»“è§£å§�æˆ’è—‰èŠ¥ç•Œå€Ÿä»‹ç–¥è¯«å±Šå·¾ç­‹æ–¤é‡‘ä»Šæ´¥è¥Ÿç´§é”¦ä»…è°¨è¿›é�³æ™‹ç¦�è¿‘çƒ¬æµ¸"],
["be40","ç¶™",12,"ç¶§",6,"ç¶¯",42],
["be80","ç·š",32,"å°½åŠ²è�†å…¢èŒŽç�›æ™¶é²¸äº¬æƒŠç²¾ç²³ç»�äº•è­¦æ™¯é¢ˆé�™å¢ƒæ•¬é•œå¾„ç—‰é�–ç«Ÿç«žå‡€ç‚¯çª˜æ�ªç©¶çº çŽ–éŸ­ä¹…ç�¸ä¹�é…’åŽ©æ•‘æ—§è‡¼èˆ…å’Žå°±ç–šéž æ‹˜ç‹™ç–½å±…é©¹è�Šå±€å’€çŸ©ä¸¾æ²®è�šæ‹’æ�®å·¨å…·è·�è¸žé”¯ä¿±å�¥æƒ§ç‚¬å‰§æ��é¹ƒå¨Ÿå€¦çœ·å�·ç»¢æ’…æ”«æŠ‰æŽ˜å€”çˆµè§‰å†³è¯€ç»�å�‡è�Œé’§å†›å�›å³»"],
["bf40","ç·»",62],
["bf80","ç¸ºç¸¼",4,"ç¹‚",4,"ç¹ˆ",21,"ä¿Šç«£æµšéƒ¡éª�å–€å’–å�¡å’¯å¼€æ�©æ¥·å‡¯æ…¨åˆŠå ªå‹˜å�Žç �çœ‹åº·æ…·ç³ æ‰›æŠ—äº¢ç‚•è€ƒæ‹·çƒ¤é� å�·è‹›æŸ¯æ£µç£•é¢—ç§‘å£³å’³å�¯æ¸´å…‹åˆ»å®¢è¯¾è‚¯å•ƒåž¦æ�³å�‘å�­ç©ºæ��å­”æŽ§æŠ å�£æ‰£å¯‡æž¯å“­çªŸè‹¦é…·åº“è£¤å¤¸åž®æŒŽè·¨èƒ¯å�—ç­·ä¾©å¿«å®½æ¬¾åŒ¡ç­�ç‹‚æ¡†çŸ¿çœ¶æ—·å†µäº�ç›”å²¿çª¥è‘µå¥Žé­�å‚€"],
["c040","ç¹ž",35,"çºƒ",23,"çºœçº�çºž"],
["c080","çº®çº´çº»çº¼ç»–ç»¤ç»¬ç»¹ç¼Šç¼�ç¼žç¼·ç¼¹ç¼»",6,"ç½ƒç½†",9,"ç½’ç½“é¦ˆæ„§æºƒå�¤æ˜†æ�†å›°æ‹¬æ‰©å»“é˜”åžƒæ‹‰å–‡èœ¡è…Šè¾£å•¦èŽ±æ�¥èµ–è“�å©ªæ �æ‹¦ç¯®é˜‘å…°æ¾œè°°æ�½è§ˆæ‡’ç¼†çƒ‚æ»¥ç�…æ¦”ç‹¼å»ŠéƒŽæœ—æµªæ�žåŠ³ç‰¢è€�ä½¬å§¥é…ªçƒ™æ¶�å‹’ä¹�é›·é•­è•¾ç£Šç´¯å„¡åž’æ“‚è‚‹ç±»æ³ªæ£±æ¥žå†·åŽ˜æ¢¨çŠ�é»Žç¯±ç‹¸ç¦»æ¼“ç�†æ�Žé‡Œé²¤ç¤¼èŽ‰è�”å��æ —ä¸½åŽ‰åŠ±ç ¾åŽ†åˆ©å‚ˆä¾‹ä¿�"],
["c140","ç½–ç½™ç½›ç½œç½�ç½žç½ ç½£",4,"ç½«ç½¬ç½­ç½¯ç½°ç½³ç½µç½¶ç½·ç½¸ç½ºç½»ç½¼ç½½ç½¿ç¾€ç¾‚",7,"ç¾‹ç¾�ç¾�",4,"ç¾•",4,"ç¾›ç¾œç¾ ç¾¢ç¾£ç¾¥ç¾¦ç¾¨",6,"ç¾±"],
["c180","ç¾³",4,"ç¾ºç¾»ç¾¾ç¿€ç¿‚ç¿ƒç¿„ç¿†ç¿‡ç¿ˆç¿‰ç¿‹ç¿�ç¿�",4,"ç¿–ç¿—ç¿™",5,"ç¿¢ç¿£ç—¢ç«‹ç²’æ²¥éš¶åŠ›ç’ƒå“©ä¿©è�”èŽ²è¿žé•°å»‰æ€œæ¶Ÿå¸˜æ•›è„¸é“¾æ�‹ç‚¼ç»ƒç²®å‡‰æ¢�ç²±è‰¯ä¸¤è¾†é‡�æ™¾äº®è°…æ’©è�Šåƒšç–—ç‡Žå¯¥è¾½æ½¦äº†æ’‚é•£å»–æ–™åˆ—è£‚çƒˆåŠ£çŒŽç�³æž—ç£·éœ–ä¸´é‚»é³žæ·‹å‡›èµ�å��æ‹ŽçŽ²è�±é›¶é¾„é“ƒä¼¶ç¾šå‡Œç�µé™µå²­é¢†å�¦ä»¤æºœç�‰æ¦´ç¡«é¦�ç•™åˆ˜ç˜¤æµ�æŸ³å…­é¾™è�‹å’™ç¬¼çª¿"],
["c240","ç¿¤ç¿§ç¿¨ç¿ªç¿«ç¿¬ç¿­ç¿¯ç¿²ç¿´",6,"ç¿½ç¿¾ç¿¿è€‚è€‡è€ˆè€‰è€Šè€Žè€�è€‘è€“è€šè€›è€�è€žè€Ÿè€¡è€£è€¤è€«",5,"è€²è€´è€¹è€ºè€¼è€¾è�€è��è�„è�…è�‡è�ˆè�‰è�Žè��è��è�‘è�“è�•è�–è�—"],
["c280","è�™è�›",13,"è�«",5,"è�²",11,"éš†åž„æ‹¢é™‡æ¥¼å¨„æ�‚ç¯“æ¼�é™‹èŠ¦å�¢é¢…åº�ç‚‰æŽ³å�¤è™�é²�éº“ç¢Œéœ²è·¯èµ‚é¹¿æ½žç¦„å½•é™†æˆ®é©´å�•é“�ä¾£æ—…å±¥å±¡ç¼•è™‘æ°¯å¾‹çŽ‡æ»¤ç»¿å³¦æŒ›å­ªæ»¦å�µä¹±æŽ ç•¥æŠ¡è½®ä¼¦ä»‘æ²¦çº¶è®ºè��èžºç½—é€»é”£ç®©éª¡è£¸è�½æ´›éª†ç»œå¦ˆéº»çŽ›ç �èš‚é©¬éª‚å˜›å�—åŸ‹ä¹°éº¦å�–è¿ˆè„‰çž’é¦’è›®æ»¡è”“æ›¼æ…¢æ¼«"],
["c340","è�¾è‚�è‚‚è‚…è‚ˆè‚Šè‚�",5,"è‚”è‚•è‚—è‚™è‚žè‚£è‚¦è‚§è‚¨è‚¬è‚°è‚³è‚µè‚¶è‚¸è‚¹è‚»èƒ…èƒ‡",4,"èƒ�",6,"èƒ˜èƒŸèƒ èƒ¢èƒ£èƒ¦èƒ®èƒµèƒ·èƒ¹èƒ»èƒ¾èƒ¿è„€è„�è„ƒè„„è„…è„‡è„ˆè„‹"],
["c380","è„Œè„•è„—è„™è„›è„œè„�è„Ÿ",12,"è„­è„®è„°è„³è„´è„µè„·è„¹",4,"è„¿è°©èŠ’èŒ«ç›²æ°“å¿™èŽ½çŒ«èŒ…é”šæ¯›çŸ›é“†å�¯èŒ‚å†’å¸½è²Œè´¸ä¹ˆçŽ«æžšæ¢…é…¶éœ‰ç…¤æ²¡çœ‰åª’é•�æ¯�ç¾Žæ˜§å¯�å¦¹åªšé—¨é—·ä»¬è�Œè’™æª¬ç›Ÿé”°çŒ›æ¢¦å­Ÿçœ¯é†šé�¡ç³œè¿·è°œå¼¥ç±³ç§˜è§…æ³Œèœœå¯†å¹‚æ£‰çœ ç»µå†•å…�å‹‰å¨©ç¼…é�¢è‹—æ��çž„è—�ç§’æ¸ºåº™å¦™è”‘ç�­æ°‘æŠ¿çš¿æ•�æ‚¯é—½æ˜ŽèžŸé¸£é“­å��å‘½è°¬æ‘¸"],
["c440","è…€",5,"è…‡è…‰è…�è…Žè…�è…’è…–è…—è…˜è…›",4,"è…¡è…¢è…£è…¤è…¦è…¨è…ªè…«è…¬è…¯è…²è…³è…µè…¶è…·è…¸è†�è†ƒ",4,"è†‰è†‹è†Œè†�è†Žè†�è†’",5,"è†™è†šè†ž",4,"è†¤è†¥"],
["c480","è†§è†©è†«",7,"è†´",5,"è†¼è†½è†¾è†¿è‡„è‡…è‡‡è‡ˆè‡‰è‡‹è‡�",6,"æ‘¹è˜‘æ¨¡è†œç£¨æ‘©é­”æŠ¹æœ«èŽ«å¢¨é»˜æ²«æ¼ å¯žé™Œè°‹ç‰ŸæŸ�æ‹‡ç‰¡äº©å§†æ¯�å¢“æš®å¹•å‹Ÿæ…•æœ¨ç›®ç�¦ç‰§ç©†æ‹¿å“ªå‘�é’ é‚£å¨œçº³æ°–ä¹ƒå¥¶è€�å¥ˆå�—ç”·éš¾å›ŠæŒ è„‘æ�¼é—¹æ·–å‘¢é¦�å†…å«©èƒ½å¦®éœ“å€ªæ³¥å°¼æ‹Ÿä½ åŒ¿è…»é€†æººè”«æ‹ˆå¹´ç¢¾æ’µæ�»å¿µå¨˜é…¿é¸Ÿå°¿æ��è�‚å­½å•®é•Šé•�æ¶…æ‚¨æŸ ç‹žå‡�å®�"],
["c540","è‡”",14,"è‡¤è‡¥è‡¦è‡¨è‡©è‡«è‡®",4,"è‡µ",5,"è‡½è‡¿èˆƒèˆ‡",4,"èˆŽèˆ�èˆ‘èˆ“èˆ•",5,"èˆ�èˆ èˆ¤èˆ¥èˆ¦èˆ§èˆ©èˆ®èˆ²èˆºèˆ¼èˆ½èˆ¿"],
["c580","è‰€è‰�è‰‚è‰ƒè‰…è‰†è‰ˆè‰Šè‰Œè‰�è‰Žè‰�",7,"è‰™è‰›è‰œè‰�è‰žè‰ ",7,"è‰©æ‹§æ³žç‰›æ‰­é’®çº½è„“æµ“å†œå¼„å¥´åŠªæ€’å¥³æš–è™�ç–ŸæŒªæ‡¦ç³¯è¯ºå“¦æ¬§é¸¥æ®´è—•å‘•å�¶æ²¤å•ªè¶´çˆ¬å¸•æ€•ç�¶æ‹�æŽ’ç‰Œå¾˜æ¹ƒæ´¾æ”€æ½˜ç›˜ç£�ç›¼ç•”åˆ¤å�›ä¹“åºžæ—�è€ªèƒ–æŠ›å’†åˆ¨ç‚®è¢�è·‘æ³¡å‘¸èƒšåŸ¹è£´èµ”é™ªé…�ä½©æ²›å–·ç›†ç °æŠ¨çƒ¹æ¾Žå½­è“¬æ£šç¡¼ç¯·è†¨æœ‹é¹�æ�§ç¢°å�¯ç ’éœ¹æ‰¹æŠ«åŠˆç�µæ¯—"],
["c640","è‰ªè‰«è‰¬è‰­è‰±è‰µè‰¶è‰·è‰¸è‰»è‰¼èŠ€èŠ�èŠƒèŠ…èŠ†èŠ‡èŠ‰èŠŒèŠ�èŠ“èŠ”èŠ•èŠ–èŠšèŠ›èŠžèŠ èŠ¢èŠ£èŠ§èŠ²èŠµèŠ¶èŠºèŠ»èŠ¼èŠ¿è‹€è‹‚è‹ƒè‹…è‹†è‹‰è‹�è‹–è‹™è‹šè‹�è‹¢è‹§è‹¨è‹©è‹ªè‹¬è‹­è‹®è‹°è‹²è‹³è‹µè‹¶è‹¸"],
["c680","è‹ºè‹¼",4,"èŒŠèŒ‹èŒ�èŒ�èŒ’èŒ“èŒ–èŒ˜èŒ™èŒ�",9,"èŒ©èŒªèŒ®èŒ°èŒ²èŒ·èŒ»èŒ½å•¤è„¾ç–²çš®åŒ¹ç—žåƒ»å±�è­¬ç¯‡å��ç‰‡éª—é£˜æ¼‚ç“¢ç¥¨æ’‡çž¥æ‹¼é¢‘è´«å“�è�˜ä¹’å�ªè‹¹è��å¹³å‡­ç“¶è¯„å±�å�¡æ³¼é¢‡å©†ç ´é­„è¿«ç²•å‰–æ‰‘é“ºä»†èŽ†è‘¡è�©è’²åŸ”æœ´åœƒæ™®æµ¦è°±æ›�ç€‘æœŸæ¬ºæ –æˆšå¦»ä¸ƒå‡„æ¼†æŸ’æ²�å…¶æ£‹å¥‡æ­§ç•¦å´Žè„�é½�æ——ç¥ˆç¥�éª‘èµ·å²‚ä¹žä¼�å�¯å¥‘ç Œå™¨æ°”è¿„å¼ƒæ±½æ³£è®«æŽ�"],
["c740","èŒ¾èŒ¿è��è�‚è�„è�…è�ˆè�Š",4,"è�“è�•",4,"è��è�¢è�°",6,"è�¹è�ºè�¾",6,"èŽ‡èŽˆèŽŠèŽ‹èŽŒèŽ�èŽ�èŽ�èŽ‘èŽ”èŽ•èŽ–èŽ—èŽ™èŽšèŽ�èŽŸèŽ¡",6,"èŽ¬èŽ­èŽ®"],
["c780","èŽ¯èŽµèŽ»èŽ¾èŽ¿è�‚è�ƒè�„è�†è�ˆè�‰è�‹è��è�Žè��è�‘è�’è�“è�•è�—è�™è�šè�›è�žè�¢è�£è�¤è�¦è�§è�¨è�«è�¬è�­æ�°æ´½ç‰µæ‰¦é’Žé“…å�ƒè¿�ç­¾ä»Ÿè°¦ä¹¾é»”é’±é’³å‰�æ½œé�£æµ…è°´å ‘åµŒæ¬ æ­‰æžªå‘›è…”ç¾Œå¢™è”·å¼ºæŠ¢æ©‡é”¹æ•²æ‚„æ¡¥çž§ä¹”ä¾¨å·§éž˜æ’¬ç¿˜å³­ä¿�çª�åˆ‡èŒ„ä¸”æ€¯çªƒé’¦ä¾µäº²ç§¦ç�´å‹¤èŠ¹æ“’ç¦½å¯�æ²�é�’è½»æ°¢å€¾å�¿æ¸…æ“Žæ™´æ°°æƒ…é¡·è¯·åº†ç�¼ç©·ç§‹ä¸˜é‚±ç�ƒæ±‚å›šé…‹æ³…è¶‹åŒºè›†æ›²èº¯å±ˆé©±æ¸ "],
["c840","è�®è�¯è�³",4,"è�ºè�»è�¼è�¾è�¿è�€è�‚è�…è�‡è�ˆè�‰è�Šè��è�’",5,"è�™è�šè�›è�ž",5,"è�©",7,"è�²",5,"è�¹è�ºè�»è�¾",7,"è‘‡è‘ˆè‘‰"],
["c880","è‘Š",6,"è‘’",4,"è‘˜è‘�è‘žè‘Ÿè‘ è‘¢è‘¤",4,"è‘ªè‘®è‘¯è‘°è‘²è‘´è‘·è‘¹è‘»è‘¼å�–å¨¶é¾‹è¶£åŽ»åœˆé¢§æ�ƒé†›æ³‰å…¨ç—Šæ‹³çŠ¬åˆ¸åŠ�ç¼ºç‚”ç˜¸å�´é¹Šæ¦·ç¡®é›€è£™ç¾¤ç„¶ç‡ƒå†‰æŸ“ç“¤å£¤æ”˜åš·è®©é¥¶æ‰°ç»•æƒ¹çƒ­å£¬ä»�äººå¿�éŸ§ä»»è®¤åˆƒå¦Šçº«æ‰”ä»�æ—¥æˆŽèŒ¸è“‰è�£èž�ç†”æº¶å®¹ç»’å†—æ�‰æŸ”è‚‰èŒ¹è •å„’å­ºå¦‚è¾±ä¹³æ±�å…¥è¤¥è½¯é˜®è•Šç‘žé”�é—°æ¶¦è‹¥å¼±æ’’æ´’è�¨è…®é³ƒå¡žèµ›ä¸‰å��"],
["c940","è‘½",4,"è’ƒè’„è’…è’†è’Šè’�è’�",7,"è’˜è’šè’›è’�è’žè’Ÿè’ è’¢",12,"è’°è’±è’³è’µè’¶è’·è’»è’¼è’¾è“€è“‚è“ƒè“…è“†è“‡è“ˆè“‹è“Œè“Žè“�è“’è“”è“•è“—"],
["c980","è“˜",4,"è“žè“¡è“¢è“¤è“§",4,"è“­è“®è“¯è“±",10,"è“½è“¾è”€è”�è”‚ä¼žæ•£æ¡‘å—“ä¸§æ�”éªšæ‰«å«‚ç‘Ÿè‰²æ¶©æ£®åƒ§èŽŽç ‚æ�€åˆ¹æ²™çº±å‚»å•¥ç…žç­›æ™’ç�Šè‹«æ�‰å±±åˆ ç…½è¡«é—ªé™•æ“…èµ¡è†³å–„æ±•æ‰‡ç¼®å¢’ä¼¤å•†èµ�æ™Œä¸Šå°šè£³æ¢¢æ�Žç¨�çƒ§èŠ�å‹ºéŸ¶å°‘å“¨é‚µç»�å¥¢èµŠè›‡èˆŒèˆ�èµ¦æ‘„å°„æ…‘æ¶‰ç¤¾è®¾ç ·ç”³å‘»ä¼¸èº«æ·±å¨ ç»…ç¥žæ²ˆå®¡å©¶ç”šè‚¾æ…Žæ¸—å£°ç”Ÿç”¥ç‰²å�‡ç»³"],
["ca40","è”ƒ",8,"è”�è”Žè”�è”�è”’è””è”•è”–è”˜è”™è”›è”œè”�è”žè” è”¢",8,"è”­",9,"è”¾",4,"è•„è•…è•†è•‡è•‹",10],
["ca80","è•—è•˜è•šè•›è•œè•�è•Ÿ",4,"è•¥è•¦è•§è•©",8,"è•³è•µè•¶è•·è•¸è•¼è•½è•¿è–€è–�çœ�ç››å‰©èƒœåœ£å¸ˆå¤±ç‹®æ–½æ¹¿è¯—å°¸è™±å��çŸ³æ‹¾æ—¶ä»€é£Ÿèš€å®žè¯†å�²çŸ¢ä½¿å±Žé©¶å§‹å¼�ç¤ºå£«ä¸–æŸ¿äº‹æ‹­èª“é€�åŠ¿æ˜¯å—œå™¬é€‚ä»•ä¾�é‡Šé¥°æ°�å¸‚æ�ƒå®¤è§†è¯•æ”¶æ‰‹é¦–å®ˆå¯¿æŽˆå”®å�—ç˜¦å…½è”¬æž¢æ¢³æ®ŠæŠ’è¾“å�”èˆ’æ·‘ç–�ä¹¦èµŽå­°ç†Ÿè–¯æš‘æ›™ç½²èœ€é»�é¼ å±žæœ¯è¿°æ ‘æ�Ÿæˆ�ç«–å¢…åº¶æ•°æ¼±"],
["cb40","è–‚è–ƒè–†è–ˆ",6,"è–�",10,"è–�",6,"è–¥è–¦è–§è–©è–«è–¬è–­è–±",5,"è–¸è–º",6,"è—‚",6,"è—Š",4,"è—‘è—’"],
["cb80","è—”è—–",5,"è—�",6,"è—¥è—¦è—§è—¨è—ª",14,"æ�•åˆ·è€�æ‘”è¡°ç”©å¸…æ “æ‹´éœœå�Œçˆ½è°�æ°´ç�¡ç¨Žå�®çž¬é¡ºèˆœè¯´ç¡•æœ”çƒ�æ–¯æ’•å˜¶æ€�ç§�å�¸ä¸�æ­»è‚†å¯ºå—£å››ä¼ºä¼¼é¥²å·³æ�¾è€¸æ€‚é¢‚é€�å®‹è®¼è¯µæ�œè‰˜æ“žå—½è‹�é…¥ä¿—ç´ é€Ÿç²Ÿåƒ³å¡‘æº¯å®¿è¯‰è‚ƒé…¸è’œç®—è™½éš‹éš�ç»¥é«“ç¢Žå²�ç©—é�‚éš§ç¥Ÿå­™æ�Ÿç¬‹è“‘æ¢­å”†ç¼©ç��ç´¢é”�æ‰€å¡Œä»–å®ƒå¥¹å¡”"],
["cc40","è—¹è—ºè—¼è—½è—¾è˜€",4,"è˜†",10,"è˜’è˜“è˜”è˜•è˜—",15,"è˜¨è˜ª",13,"è˜¹è˜ºè˜»è˜½è˜¾è˜¿è™€"],
["cc80","è™�",11,"è™’è™“è™•",4,"è™›è™œè™�è™Ÿè™ è™¡è™£",7,"ç�­æŒžè¹‹è¸�èƒŽè‹”æŠ¬å�°æ³°é…žå¤ªæ€�æ±°å��æ‘Šè´ªç˜«æ»©å�›æª€ç—°æ½­è°­è°ˆå�¦æ¯¯è¢’ç¢³æŽ¢å�¹ç‚­æ±¤å¡˜æ�ªå ‚æ£ è†›å”�ç³–å€˜èººæ·Œè¶Ÿçƒ«æŽ�æ¶›æ»”ç»¦è�„æ¡ƒé€ƒæ·˜é™¶è®¨å¥—ç‰¹è—¤è…¾ç–¼èªŠæ¢¯å‰”è¸¢é”‘æ��é¢˜è¹„å•¼ä½“æ›¿åš�æƒ•æ¶•å‰ƒå±‰å¤©æ·»å¡«ç”°ç”œæ�¬èˆ”è…†æŒ‘æ�¡è¿¢çœºè·³è´´é“�å¸–åŽ…å�¬çƒƒ"],
["cd40","è™­è™¯è™°è™²",6,"èšƒ",6,"èšŽ",4,"èš”èš–",5,"èšž",4,"èš¥èš¦èš«èš­èš®èš²èš³èš·èš¸èš¹èš»",4,"è›�è›‚è›ƒè›…è›ˆè›Œè›�è›’è›“è›•è›–è›—è›šè›œ"],
["cd80","è›�è› è›¡è›¢è›£è›¥è›¦è›§è›¨è›ªè›«è›¬è›¯è›µè›¶è›·è›ºè›»è›¼è›½è›¿èœ�èœ„èœ…èœ†èœ‹èœŒèœŽèœ�èœ�èœ‘èœ”èœ–æ±€å»·å�œäº­åº­æŒºè‰‡é€šæ¡�é…®çž³å�Œé“œå½¤ç«¥æ¡¶æ�…ç­’ç»Ÿç—›å�·æŠ•å¤´é€�å‡¸ç§ƒçª�å›¾å¾’é€”æ¶‚å± åœŸå��å…”æ¹�å›¢æŽ¨é¢“è…¿èœ•è¤ªé€€å�žå±¯è‡€æ‹–æ‰˜è„±é¸µé™€é©®é©¼æ¤­å¦¥æ‹“å”¾æŒ–å“‡è›™æ´¼å¨ƒç“¦è¢œæ­ªå¤–è±Œå¼¯æ¹¾çŽ©é¡½ä¸¸çƒ·å®Œç¢—æŒ½æ™šçš–æƒ‹å®›å©‰ä¸‡è…•æ±ªçŽ‹äº¡æž‰ç½‘å¾€æ—ºæœ›å¿˜å¦„å¨�"],
["ce40","èœ™èœ›èœ�èœŸèœ èœ¤èœ¦èœ§èœ¨èœªèœ«èœ¬èœ­èœ¯èœ°èœ²èœ³èœµèœ¶èœ¸èœ¹èœºèœ¼èœ½è�€",6,"è�Šè�‹è��è��è��è�‘è�’è�”è�•è�–è�˜è�š",5,"è�¡è�¢è�¦",7,"è�¯è�±è�²è�³è�µ"],
["ce80","è�·è�¸è�¹è�ºè�¿èž€èž�èž„èž†èž‡èž‰èžŠèžŒèžŽ",4,"èž”èž•èž–èž˜",6,"èž ",4,"å·�å¾®å�±éŸ¦è¿�æ¡…å›´å”¯æƒŸä¸ºæ½�ç»´è‹‡è�Žå§”ä¼Ÿä¼ªå°¾çº¬æœªè”šå‘³ç•�èƒƒå–‚é­�ä½�æ¸­è°“å°‰æ…°å�«ç˜Ÿæ¸©èšŠæ–‡é—»çº¹å�»ç¨³ç´Šé—®å—¡ç¿�ç“®æŒ�èœ—æ¶¡çª�æˆ‘æ–¡å�§æ�¡æ²ƒå·«å‘œé’¨ä¹Œæ±¡è¯¬å±‹æ— èŠœæ¢§å�¾å�´æ¯‹æ­¦äº”æ�‚å�ˆèˆžä¼�ä¾®å�žæˆŠé›¾æ™¤ç‰©å‹¿åŠ¡æ‚Ÿè¯¯æ˜”ç†™æž�è¥¿ç¡’çŸ½æ™°å˜»å�¸é”¡ç‰º"],
["cf40","èž¥èž¦èž§èž©èžªèž®èž°èž±èž²èž´èž¶èž·èž¸èž¹èž»èž¼èž¾èž¿èŸ�",4,"èŸ‡èŸˆèŸ‰èŸŒ",4,"èŸ”",6,"èŸœèŸ�èŸžèŸŸèŸ¡èŸ¢èŸ£èŸ¤èŸ¦èŸ§èŸ¨èŸ©èŸ«èŸ¬èŸ­èŸ¯",9],
["cf80","èŸºèŸ»èŸ¼èŸ½èŸ¿è €è �è ‚è „",5,"è ‹",7,"è ”è —è ˜è ™è šè œ",4,"è £ç¨€æ�¯å¸Œæ‚‰è†�å¤•æƒœç†„çƒ¯æºªæ±�çŠ€æª„è¢­å¸­ä¹ åª³å–œé“£æ´—ç³»éš™æˆ�ç»†çžŽè™¾åŒ£éœžè¾–æš‡å³¡ä¾ ç‹­ä¸‹åŽ¦å¤�å�“æŽ€é”¨å…ˆä»™é²œçº¤å’¸è´¤è¡”èˆ·é—²æ¶Žå¼¦å«Œæ˜¾é™©çŽ°çŒ®åŽ¿è…ºé¦…ç¾¡å®ªé™·é™�çº¿ç›¸åŽ¢é•¶é¦™ç®±è¥„æ¹˜ä¹¡ç¿”ç¥¥è¯¦æƒ³å“�äº«é¡¹å··æ©¡åƒ�å�‘è±¡è�§ç¡�éœ„å‰Šå“®åš£é”€æ¶ˆå®µæ·†æ™“"],
["d040","è ¤",13,"è ³",5,"è ºè »è ½è ¾è ¿è¡�è¡‚è¡ƒè¡†",5,"è¡Ž",5,"è¡•è¡–è¡˜è¡š",6,"è¡¦è¡§è¡ªè¡­è¡¯è¡±è¡³è¡´è¡µè¡¶è¡¸è¡¹è¡º"],
["d080","è¡»è¡¼è¢€è¢ƒè¢†è¢‡è¢‰è¢Šè¢Œè¢Žè¢�è¢�è¢‘è¢“è¢”è¢•è¢—",4,"è¢�",4,"è¢£è¢¥",5,"å°�å­�æ ¡è‚–å•¸ç¬‘æ•ˆæ¥”äº›æ­‡è�Žéž‹å��æŒŸæ�ºé‚ªæ–œèƒ�è°�å†™æ¢°å�¸èŸ¹æ‡ˆæ³„æ³»è°¢å±‘è–ªèŠ¯é”Œæ¬£è¾›æ–°å¿»å¿ƒä¿¡è¡…æ˜Ÿè…¥çŒ©æƒºå…´åˆ‘åž‹å½¢é‚¢è¡Œé†’å¹¸æ��æ€§å§“å…„å‡¶èƒ¸åŒˆæ±¹é›„ç†Šä¼‘ä¿®ç¾žæœ½å—…é”ˆç§€è¢–ç»£å¢ŸæˆŒéœ€è™šå˜˜é¡»å¾�è®¸è“„é…—å�™æ—­åº�ç•œæ�¤çµ®å©¿ç»ªç»­è½©å–§å®£æ‚¬æ—‹çŽ„"],
["d140","è¢¬è¢®è¢¯è¢°è¢²",4,"è¢¸è¢¹è¢ºè¢»è¢½è¢¾è¢¿è£€è£ƒè£„è£‡è£ˆè£Šè£‹è£Œè£�è£�è£�è£‘è£“è£–è£—è£š",4,"è£ è£¡è£¦è£§è£©",6,"è£²è£µè£¶è£·è£ºè£»è£½è£¿è¤€è¤�è¤ƒ",5],
["d180","è¤‰è¤‹",4,"è¤‘è¤”",4,"è¤œ",4,"è¤¢è¤£è¤¤è¤¦è¤§è¤¨è¤©è¤¬è¤­è¤®è¤¯è¤±è¤²è¤³è¤µè¤·é€‰ç™£çœ©ç»šé�´è–›å­¦ç©´é›ªè¡€å‹‹ç†�å¾ªæ—¬è¯¢å¯»é©¯å·¡æ®‰æ±›è®­è®¯é€Šè¿…åŽ‹æŠ¼é¸¦é¸­å‘€ä¸«èŠ½ç‰™èšœå´–è¡™æ¶¯é›…å“‘äºšè®¶ç„‰å’½é˜‰çƒŸæ·¹ç›�ä¸¥ç ”èœ’å²©å»¶è¨€é¢œé˜Žç‚Žæ²¿å¥„æŽ©çœ¼è¡�æ¼”è‰³å °ç‡•åŽŒç šé›�å”�å½¦ç„°å®´è°šéªŒæ®ƒå¤®é¸¯ç§§æ�¨æ‰¬ä½¯ç–¡ç¾Šæ´‹é˜³æ°§ä»°ç—’å…»æ ·æ¼¾é‚€è…°å¦–ç‘¶"],
["d240","è¤¸",8,"è¥‚è¥ƒè¥…",24,"è¥ ",5,"è¥§",19,"è¥¼"],
["d280","è¥½è¥¾è¦€è¦‚è¦„è¦…è¦‡",26,"æ‘‡å°§é�¥çª‘è°£å§šå’¬èˆ€è�¯è¦�è€€æ¤°å™Žè€¶çˆ·é‡Žå†¶ä¹Ÿé¡µæŽ–ä¸šå�¶æ›³è…‹å¤œæ¶²ä¸€å£¹åŒ»æ�–é“±ä¾�ä¼Šè¡£é¢�å¤·é�—ç§»ä»ªèƒ°ç–‘æ²‚å®œå§¨å½�æ¤…èš�å€šå·²ä¹™çŸ£ä»¥è‰ºæŠ‘æ˜“é‚‘å±¹äº¿å½¹è‡†é€¸è‚„ç–«äº¦è£”æ„�æ¯…å¿†ä¹‰ç›Šæº¢è¯£è®®è°Šè¯‘å¼‚ç¿¼ç¿Œç»ŽèŒµè�«å› æ®·éŸ³é˜´å§»å�Ÿé“¶æ·«å¯…é¥®å°¹å¼•éš�"],
["d340","è¦¢",30,"è§ƒè§�è§“è§”è§•è§—è§˜è§™è§›è§�è§Ÿè§ è§¡è§¢è§¤è§§è§¨è§©è§ªè§¬è§­è§®è§°è§±è§²è§´",6],
["d380","è§»",4,"è¨�",5,"è¨ˆ",21,"å�°è‹±æ¨±å©´é¹°åº”ç¼¨èŽ¹è�¤è�¥è�§è�‡è¿Žèµ¢ç›ˆå½±é¢–ç¡¬æ˜ å“Ÿæ‹¥ä½£è‡ƒç—ˆåº¸é›�è¸Šè›¹å’�æ³³æ¶Œæ°¸æ�¿å‹‡ç”¨å¹½ä¼˜æ‚ å¿§å°¤ç”±é‚®é“€çŠ¹æ²¹æ¸¸é…‰æœ‰å�‹å�³ä½‘é‡‰è¯±å�ˆå¹¼è¿‚æ·¤äºŽç›‚æ¦†è™žæ„šèˆ†ä½™ä¿žé€¾é±¼æ„‰æ¸�æ¸”éš…äºˆå¨±é›¨ä¸Žå±¿ç¦¹å®‡è¯­ç¾½çŽ‰åŸŸèŠ‹éƒ�å��é�‡å–»å³ªå¾¡æ„ˆæ¬²ç‹±è‚²èª‰"],
["d440","è¨ž",31,"è¨¿",8,"è©‰",21],
["d480","è©Ÿ",25,"è©º",6,"æµ´å¯“è£•é¢„è±«é©­é¸³æ¸Šå†¤å…ƒåž£è¢�åŽŸæ�´è¾•å›­å‘˜åœ†çŒ¿æº�ç¼˜è¿œè‹‘æ„¿æ€¨é™¢æ›°çº¦è¶Šè·ƒé’¥å²³ç²¤æœˆæ‚¦é˜…è€˜äº‘éƒ§åŒ€é™¨å…�è¿�è•´é…�æ™•éŸµå­•åŒ�ç ¸æ�‚æ ½å“‰ç�¾å®°è½½å†�åœ¨å’±æ”’æš‚èµžèµƒè„�è‘¬é�­ç³Ÿå‡¿è—»æž£æ—©æ¾¡èš¤èº�å™ªé€ çš‚ç�¶ç‡¥è´£æ‹©åˆ™æ³½è´¼æ€Žå¢žæ†Žæ›¾èµ æ‰Žå–³æ¸£æœ­è½§"],
["d540","èª�",7,"èª‹",7,"èª”",46],
["d580","è«ƒ",32,"é“¡é—¸çœ¨æ …æ¦¨å’‹ä¹�ç‚¸è¯ˆæ‘˜æ–‹å®…çª„å€ºå¯¨çž»æ¯¡è©¹ç²˜æ²¾ç›�æ–©è¾—å´­å±•è˜¸æ ˆå� æˆ˜ç«™æ¹›ç»½æ¨Ÿç« å½°æ¼³å¼ æŽŒæ¶¨æ�–ä¸ˆå¸�è´¦ä»—èƒ€ç˜´éšœæ‹›æ˜­æ‰¾æ²¼èµµç…§ç½©å…†è‚‡å�¬é�®æŠ˜å“²è›°è¾™è€…é”—è”—è¿™æµ™ç��æ–ŸçœŸç”„ç §è‡»è´žé’ˆä¾¦æž•ç–¹è¯Šéœ‡æŒ¯é•‡é˜µè’¸æŒ£ç��å¾�ç‹°äº‰æ€”æ•´æ‹¯æ­£æ”¿"],
["d640","è«¤",34,"è¬ˆ",27],
["d680","è¬¤è¬¥è¬§",30,"å¸§ç—‡éƒ‘è¯�èŠ�æž�æ”¯å�±èœ˜çŸ¥è‚¢è„‚æ±�ä¹‹ç»‡è�Œç›´æ¤�æ®–æ‰§å€¼ä¾„å�€æŒ‡æ­¢è¶¾å�ªæ—¨çº¸å¿—æŒšæŽ·è‡³è‡´ç½®å¸œå³™åˆ¶æ™ºç§©ç¨šè´¨ç‚™ç—”æ»žæ²»çª’ä¸­ç›…å¿ é’Ÿè¡·ç»ˆç§�è‚¿é‡�ä»²ä¼—èˆŸå‘¨å·žæ´²è¯Œç²¥è½´è‚˜å¸šå’’çš±å®™æ˜¼éª¤ç� æ ªè››æœ±çŒªè¯¸è¯›é€�ç«¹çƒ›ç…®æ‹„çž©å˜±ä¸»è‘—æŸ±åŠ©è›€è´®é“¸ç­‘"],
["d740","è­†",31,"è­§",4,"è­­",25],
["d780","è®‡",24,"è®¬è®±è®»è¯‡è¯�è¯ªè°‰è°žä½�æ³¨ç¥�é©»æŠ“çˆªæ‹½ä¸“ç –è½¬æ’°èµšç¯†æ¡©åº„è£…å¦†æ’žå£®çŠ¶æ¤Žé”¥è¿½èµ˜å� ç¼€è°†å‡†æ�‰æ‹™å�“æ¡Œç�¢èŒ�é…Œå•„ç�€ç�¼æµŠå…¹å’¨èµ„å§¿æ»‹æ·„å­œç´«ä»”ç±½æ»“å­�è‡ªæ¸�å­—é¬ƒæ£•è¸ªå®—ç»¼æ€»çºµé‚¹èµ°å¥�æ��ç§Ÿè¶³å�’æ—�ç¥–è¯…é˜»ç»„é’»çº‚å˜´é†‰æœ€ç½ªå°Šé�µæ˜¨å·¦ä½�æŸžå�šä½œå��åº§"],
["d840","è°¸",8,"è±‚è±ƒè±„è±…è±ˆè±Šè±‹è±�",7,"è±–è±—è±˜è±™è±›",5,"è±£",6,"è±¬",6,"è±´è±µè±¶è±·è±»",6,"è²ƒè²„è²†è²‡"],
["d880","è²ˆè²‹è²�",6,"è²•è²–è²—è²™",20,"äº�ä¸Œå…€ä¸�å»¿å�…ä¸•äº˜ä¸žé¬²å­¬å™©ä¸¨ç¦ºä¸¿åŒ•ä¹‡å¤­çˆ»å�®æ°�å›Ÿèƒ¤é¦—æ¯“ç�¾é¼—ä¸¶äºŸé¼�ä¹œä¹©äº“èŠˆå­›å•¬å˜�ä»„åŽ�åŽ�åŽ£åŽ¥åŽ®é�¥èµ�åŒšå�µåŒ¦åŒ®åŒ¾èµœå�¦å�£åˆ‚åˆˆåˆŽåˆ­åˆ³åˆ¿å‰€å‰Œå‰žå‰¡å‰œè’¯å‰½åŠ‚åŠ�åŠ�åŠ“å†‚ç½”äº»ä»ƒä»‰ä»‚ä»¨ä»¡ä»«ä»žä¼›ä»³ä¼¢ä½¤ä»µä¼¥ä¼§ä¼‰ä¼«ä½žä½§æ”¸ä½šä½�"],
["d940","è²®",62],
["d980","è³­",32,"ä½Ÿä½—ä¼²ä¼½ä½¶ä½´ä¾‘ä¾‰ä¾ƒä¾�ä½¾ä½»ä¾ªä½¼ä¾¬ä¾”ä¿¦ä¿¨ä¿ªä¿…ä¿šä¿£ä¿œä¿‘ä¿Ÿä¿¸å€©å�Œä¿³å€¬å€�å€®å€­ä¿¾å€œå€Œå€¥å€¨å�¾å�ƒå�•å�ˆå�Žå�¬å�»å‚¥å‚§å‚©å‚ºåƒ–å„†åƒ­åƒ¬åƒ¦åƒ®å„‡å„‹ä»�æ°½ä½˜ä½¥ä¿Žé¾ æ±†ç±´å…®å·½é»‰é¦˜å†�å¤”å‹¹åŒ�è¨‡åŒ�å‡«å¤™å…•äº å…–äº³è¡®è¢¤äºµè„”è£’ç¦€å¬´è ƒç¾¸å†«å†±å†½å†¼"],
["da40","è´Ž",14,"è´ èµ‘èµ’èµ—èµŸèµ¥èµ¨èµ©èµªèµ¬èµ®èµ¯èµ±èµ²èµ¸",8,"è¶‚è¶ƒè¶†è¶‡è¶ˆè¶‰è¶Œ",4,"è¶’è¶“è¶•",9,"è¶ è¶¡"],
["da80","è¶¢è¶¤",12,"è¶²è¶¶è¶·è¶¹è¶»è¶½è·€è·�è·‚è·…è·‡è·ˆè·‰è·Šè·�è·�è·’è·“è·”å‡‡å†–å†¢å†¥è® è®¦è®§è®ªè®´è®µè®·è¯‚è¯ƒè¯‹è¯�è¯Žè¯’è¯“è¯”è¯–è¯˜è¯™è¯œè¯Ÿè¯ è¯¤è¯¨è¯©è¯®è¯°è¯³è¯¶è¯¹è¯¼è¯¿è°€è°‚è°„è°‡è°Œè°�è°‘è°’è°”è°•è°–è°™è°›è°˜è°�è°Ÿè° è°¡è°¥è°§è°ªè°«è°®è°¯è°²è°³è°µè°¶å�©å�ºé˜�é˜¢é˜¡é˜±é˜ªé˜½é˜¼é™‚é™‰é™”é™Ÿé™§é™¬é™²é™´éšˆéš�éš—éš°é‚—é‚›é‚�é‚™é‚¬é‚¡é‚´é‚³é‚¶é‚º"],
["db40","è·•è·˜è·™è·œè· è·¡è·¢è·¥è·¦è·§è·©è·­è·®è·°è·±è·²è·´è·¶è·¼è·¾",6,"è¸†è¸‡è¸ˆè¸‹è¸�è¸Žè¸�è¸‘è¸’è¸“è¸•",7,"è¸ è¸¡è¸¤",4,"è¸«è¸­è¸°è¸²è¸³è¸´è¸¶è¸·è¸¸è¸»è¸¼è¸¾"],
["db80","è¸¿è¹ƒè¹…è¹†è¹Œ",4,"è¹“",5,"è¹š",11,"è¹§è¹¨è¹ªè¹«è¹®è¹±é‚¸é‚°éƒ�éƒ…é‚¾éƒ�éƒ„éƒ‡éƒ“éƒ¦éƒ¢éƒœéƒ—éƒ›éƒ«éƒ¯éƒ¾é„„é„¢é„žé„£é„±é„¯é„¹é…ƒé…†åˆ�å¥‚åŠ¢åŠ¬åŠ­åŠ¾å“¿å‹�å‹–å‹°å�Ÿç‡®çŸ�å»´å‡µå‡¼é¬¯åŽ¶å¼�ç•šå·¯å�Œåž©åž¡å¡¾å¢¼å£…å£‘åœ©åœ¬åœªåœ³åœ¹åœ®åœ¯å�œåœ»å�‚å�©åž…å�«åž†å�¼å�»å�¨å�­å�¶å�³åž­åž¤åžŒåž²åŸ�åž§åž´åž“åž åŸ•åŸ˜åŸšåŸ™åŸ’åž¸åŸ´åŸ¯åŸ¸åŸ¤åŸ�"],
["dc40","è¹³è¹µè¹·",4,"è¹½è¹¾èº€èº‚èºƒèº„èº†èºˆ",6,"èº‘èº’èº“èº•",6,"èº�èºŸ",11,"èº­èº®èº°èº±èº³",6,"èº»",7],
["dc80","è»ƒ",10,"è»�",21,"å ‹å �åŸ½åŸ­å €å žå ™å¡„å  å¡¥å¡¬å¢�å¢‰å¢šå¢€é¦¨é¼™æ‡¿è‰¹è‰½è‰¿èŠ�èŠŠèŠ¨èŠ„èŠŽèŠ‘èŠ—èŠ™èŠ«èŠ¸èŠ¾èŠ°è‹ˆè‹Šè‹£èŠ˜èŠ·èŠ®è‹‹è‹Œè‹�èŠ©èŠ´èŠ¡èŠªèŠŸè‹„è‹ŽèŠ¤è‹¡èŒ‰è‹·è‹¤èŒ�èŒ‡è‹œè‹´è‹’è‹˜èŒŒè‹»è‹“èŒ‘èŒšèŒ†èŒ”èŒ•è‹ è‹•èŒœè�‘è�›è�œèŒˆèŽ’èŒ¼èŒ´èŒ±èŽ›è�žèŒ¯è��è�‡è�ƒè�Ÿè�€èŒ—è� èŒ­èŒºèŒ³è�¦è�¥"],
["dd40","è»¥",62],
["dd80","è¼¤",32,"è�¨èŒ›è�©è�¬è�ªè�­è�®èŽ°è�¸èŽ³èŽ´èŽ èŽªèŽ“èŽœèŽ…è�¼èŽ¶èŽ©è�½èŽ¸è�»èŽ˜èŽžèŽ¨èŽºèŽ¼è��è��è�¥è�˜å ‡è�˜è�‹è��è�½è�–è�œè�¸è�‘è�†è�”è�Ÿè��è�ƒè�¸è�¹è�ªè�…è�€è�¦è�°è�¡è‘œè‘‘è‘šè‘™è‘³è’‡è’ˆè‘ºè’‰è‘¸è�¼è‘†è‘©è‘¶è’Œè’Žè�±è‘­è“�è“�è“�è“¦è’½è““è“Šè’¿è’ºè“ è’¡è’¹è’´è’—è“¥è“£è”Œç”�è”¸è“°è”¹è”Ÿè”º"],
["de40","è½…",32,"è½ªè¾€è¾Œè¾’è¾�è¾ è¾¡è¾¢è¾¤è¾¥è¾¦è¾§è¾ªè¾¬è¾­è¾®è¾¯è¾²è¾³è¾´è¾µè¾·è¾¸è¾ºè¾»è¾¼è¾¿è¿€è¿ƒè¿†"],
["de80","è¿‰",4,"è¿�è¿’è¿–è¿—è¿šè¿ è¿¡è¿£è¿§è¿¬è¿¯è¿±è¿²è¿´è¿µè¿¶è¿ºè¿»è¿¼è¿¾è¿¿é€‡é€ˆé€Œé€Žé€“é€•é€˜è•–è”»è“¿è“¼è•™è•ˆè•¨è•¤è•žè•ºçž¢è•ƒè•²è•»è–¤è–¨è–‡è–�è•¹è–®è–œè–…è–¹è–·è–°è—“è—�è—œè—¿è˜§è˜…è˜©è˜–è˜¼å»¾å¼ˆå¤¼å¥�è€·å¥•å¥šå¥˜åŒ�å°¢å°¥å°¬å°´æ‰Œæ‰ªæŠŸæŠ»æ‹Šæ‹šæ‹—æ‹®æŒ¢æ‹¶æŒ¹æ�‹æ�ƒæŽ­æ�¶æ�±æ�ºæŽŽæŽ´æ�­æŽ¬æŽŠæ�©æŽ®æŽ¼æ�²æ�¸æ� æ�¿æ�„æ�žæ�Žæ‘’æ�†æŽ¾æ‘…æ‘�æ�‹æ�›æ� æ�Œæ�¦æ�¡æ‘žæ’„æ‘­æ’–"],
["df40","é€™é€œé€£é€¤é€¥é€§",5,"é€°",4,"é€·é€¹é€ºé€½é€¿é�€é�ƒé�…é�†é�ˆ",4,"é�Žé�”é�•é�–é�™é�šé�œ",5,"é�¤é�¦é�§é�©é�ªé�«é�¬é�¯",4,"é�¶",6,"é�¾é‚�"],
["df80","é‚„é‚…é‚†é‚‡é‚‰é‚Šé‚Œ",4,"é‚’é‚”é‚–é‚˜é‚šé‚œé‚žé‚Ÿé‚ é‚¤é‚¥é‚§é‚¨é‚©é‚«é‚­é‚²é‚·é‚¼é‚½é‚¿éƒ€æ‘ºæ’·æ’¸æ’™æ’ºæ“€æ“�æ“—æ“¤æ“¢æ”‰æ”¥æ”®å¼‹å¿’ç”™å¼‘å�Ÿå�±å�½å�©å�¨å�»å�’å�–å�†å‘‹å‘’å‘“å‘”å‘–å‘ƒå�¡å‘—å‘™å�£å�²å’‚å’”å‘·å‘±å‘¤å’šå’›å’„å‘¶å‘¦å’�å“�å’­å“‚å’´å“’å’§å’¦å““å“”å‘²å’£å“•å’»å’¿å“Œå“™å“šå“œå’©å’ªå’¤å“�å“�å“žå”›å“§å” å“½å””å“³å”¢å”£å”�å”‘å”§å”ªå•§å–�å–µå•‰å•­å•�å••å”¿å•�å”¼"],
["e040","éƒ‚éƒƒéƒ†éƒˆéƒ‰éƒ‹éƒŒéƒ�éƒ’éƒ”éƒ•éƒ–éƒ˜éƒ™éƒšéƒžéƒŸéƒ éƒ£éƒ¤éƒ¥éƒ©éƒªéƒ¬éƒ®éƒ°éƒ±éƒ²éƒ³éƒµéƒ¶éƒ·éƒ¹éƒºéƒ»éƒ¼éƒ¿é„€é„�é„ƒé„…",19,"é„šé„›é„œ"],
["e080","é„�é„Ÿé„ é„¡é„¤",10,"é„°é„²",6,"é„º",8,"é…„å”·å•–å•µå•¶å•·å”³å”°å•œå–‹å—’å–ƒå–±å–¹å–ˆå–�å–Ÿå•¾å—–å–‘å•»å—Ÿå–½å–¾å–”å–™å—ªå—·å—‰å˜Ÿå—‘å—«å—¬å—”å—¦å—�å—„å—¯å—¥å—²å—³å—Œå—�å—¨å—µå—¤è¾”å˜žå˜ˆå˜Œå˜�å˜¤å˜£å—¾å˜€å˜§å˜­å™˜å˜¹å™—å˜¬å™�å™¢å™™å™œå™Œå™”åš†å™¤å™±å™«å™»å™¼åš…åš“åš¯å›”å›—å›�å›¡å›µå›«å›¹å›¿åœ„åœŠåœ‰åœœå¸�å¸™å¸”å¸‘å¸±å¸»å¸¼"],
["e140","é……é…‡é…ˆé…‘é…“é…”é…•é…–é…˜é…™é…›é…œé…Ÿé… é…¦é…§é…¨é…«é…­é…³é…ºé…»é…¼é†€",4,"é††é†ˆé†Šé†Žé†�é†“",6,"é†œ",5,"é†¤",5,"é†«é†¬é†°é†±é†²é†³é†¶é†·é†¸é†¹é†»"],
["e180","é†¼",10,"é‡ˆé‡‹é‡�é‡’",9,"é‡�",8,"å¸·å¹„å¹”å¹›å¹žå¹¡å²Œå±ºå²�å²�å²–å²ˆå²˜å²™å²‘å²šå²œå²µå²¢å²½å²¬å²«å²±å²£å³�å²·å³„å³’å³¤å³‹å³¥å´‚å´ƒå´§å´¦å´®å´¤å´žå´†å´›åµ˜å´¾å´´å´½åµ¬åµ›åµ¯åµ�åµ«åµ‹åµŠåµ©åµ´å¶‚å¶™å¶�è±³å¶·å·…å½³å½·å¾‚å¾‡å¾‰å¾Œå¾•å¾™å¾œå¾¨å¾­å¾µå¾¼è¡¢å½¡çŠ­çŠ°çŠ´çŠ·çŠ¸ç‹ƒç‹�ç‹Žç‹�ç‹’ç‹¨ç‹¯ç‹©ç‹²ç‹´ç‹·çŒ�ç‹³çŒƒç‹º"],
["e240","é‡¦",62],
["e280","éˆ¥",32,"ç‹»çŒ—çŒ“çŒ¡çŒŠçŒžçŒ�çŒ•çŒ¢çŒ¹çŒ¥çŒ¬çŒ¸çŒ±ç��ç��ç�—ç� ç�¬ç�¯ç�¾èˆ›å¤¥é£§å¤¤å¤‚é¥£é¥§",5,"é¥´é¥·é¥½é¦€é¦„é¦‡é¦Šé¦�é¦�é¦‘é¦“é¦”é¦•åº€åº‘åº‹åº–åº¥åº åº¹åºµåº¾åº³èµ“å»’å»‘å»›å»¨å»ªè†ºå¿„å¿‰å¿–å¿�æ€ƒå¿®æ€„å¿¡å¿¤å¿¾æ€…æ€†å¿ªå¿­å¿¸æ€™æ€µæ€¦æ€›æ€�æ€�æ€©æ€«æ€Šæ€¿æ€¡æ�¸æ�¹æ�»æ�ºæ�‚"],
["e340","é‰†",45,"é‰µ",16],
["e380","éŠ†",7,"éŠ�",24,"æ�ªæ�½æ‚–æ‚šæ‚­æ‚�æ‚ƒæ‚’æ‚Œæ‚›æƒ¬æ‚»æ‚±æƒ�æƒ˜æƒ†æƒšæ‚´æ„ æ„¦æ„•æ„£æƒ´æ„€æ„Žæ„«æ…Šæ…µæ†¬æ†”æ†§æ†·æ‡”æ‡µå¿�éš³é—©é—«é—±é—³é—µé—¶é—¼é—¾é˜ƒé˜„é˜†é˜ˆé˜Šé˜‹é˜Œé˜�é˜�é˜’é˜•é˜–é˜—é˜™é˜šä¸¬çˆ¿æˆ•æ°µæ±”æ±œæ±Šæ²£æ²…æ²�æ²”æ²Œæ±¨æ±©æ±´æ±¶æ²†æ²©æ³�æ³”æ²­æ³·æ³¸æ³±æ³—æ²²æ³ æ³–æ³ºæ³«æ³®æ²±æ³“æ³¯æ³¾"],
["e440","éŠ¨",5,"éŠ¯",24,"é‹‰",31],
["e480","é‹©",32,"æ´¹æ´§æ´Œæµƒæµˆæ´‡æ´„æ´™æ´Žæ´«æµ�æ´®æ´µæ´šæµ�æµ’æµ”æ´³æ¶‘æµ¯æ¶žæ¶ æµžæ¶“æ¶”æµœæµ æµ¼æµ£æ¸šæ·‡æ·…æ·žæ¸Žæ¶¿æ· æ¸‘æ·¦æ·�æ·™æ¸–æ¶«æ¸Œæ¶®æ¸«æ¹®æ¹Žæ¹«æº²æ¹Ÿæº†æ¹“æ¹”æ¸²æ¸¥æ¹„æ»Ÿæº±æº˜æ» æ¼­æ»¢æº¥æº§æº½æº»æº·æ»—æº´æ»�æº�æ»‚æºŸæ½¢æ½†æ½‡æ¼¤æ¼•æ»¹æ¼¯æ¼¶æ½‹æ½´æ¼ªæ¼‰æ¼©æ¾‰æ¾�æ¾Œæ½¸æ½²æ½¼æ½ºæ¿‘"],
["e540","éŒŠ",51,"éŒ¿",10],
["e580","é�Š",31,"é�«æ¿‰æ¾§æ¾¹æ¾¶æ¿‚æ¿¡æ¿®æ¿žæ¿ æ¿¯ç€šç€£ç€›ç€¹ç€µç��ç�žå®€å®„å®•å®“å®¥å®¸ç”¯éªžæ�´å¯¤å¯®è¤°å¯°è¹‡è¬‡è¾¶è¿“è¿•è¿¥è¿®è¿¤è¿©è¿¦è¿³è¿¨é€…é€„é€‹é€¦é€‘é€�é€–é€¡é€µé€¶é€­é€¯é�„é�‘é�’é��é�¨é�˜é�¢é�›æš¹é�´é�½é‚‚é‚ˆé‚ƒé‚‹å½�å½—å½–å½˜å°»å’«å±�å±™å­±å±£å±¦ç¾¼å¼ªå¼©å¼­è‰´å¼¼é¬»å±®å¦�å¦ƒå¦�å¦©å¦ªå¦£"],
["e640","é�¬",34,"éŽ�",27],
["e680","éŽ¬",29,"é�‹é�Œé��å¦—å§Šå¦«å¦žå¦¤å§’å¦²å¦¯å§—å¦¾å¨…å¨†å§�å¨ˆå§£å§˜å§¹å¨Œå¨‰å¨²å¨´å¨‘å¨£å¨“å©€å©§å©Šå©•å¨¼å©¢å©µèƒ¬åªªåª›å©·å©ºåª¾å««åª²å«’å«”åª¸å« å«£å«±å«–å«¦å«˜å«œå¬‰å¬—å¬–å¬²å¬·å­€å°•å°œå­šå­¥å­³å­‘å­“å­¢é©µé©·é©¸é©ºé©¿é©½éª€éª�éª…éªˆéªŠéª�éª’éª“éª–éª˜éª›éªœéª�éªŸéª éª¢éª£éª¥éª§çºŸçº¡çº£çº¥çº¨çº©"],
["e740","é�Ž",7,"é�—",54],
["e780","é�Ž",32,"çº­çº°çº¾ç»€ç»�ç»‚ç»‰ç»‹ç»Œç»�ç»”ç»—ç»›ç» ç»¡ç»¨ç»«ç»®ç»¯ç»±ç»²ç¼�ç»¶ç»ºç»»ç»¾ç¼�ç¼‚ç¼ƒç¼‡ç¼ˆç¼‹ç¼Œç¼�ç¼‘ç¼’ç¼—ç¼™ç¼œç¼›ç¼Ÿç¼¡",6,"ç¼ªç¼«ç¼¬ç¼­ç¼¯",4,"ç¼µå¹ºç•¿å·›ç”¾é‚•çŽŽçŽ‘çŽ®çŽ¢çŽŸç��ç�‚ç�‘çŽ·çŽ³ç�€ç�‰ç�ˆç�¥ç�™é¡¼ç�Šç�©ç�§ç�žçŽºç�²ç��ç�ªç‘›ç�¦ç�¥ç�¨ç�°ç�®ç�¬"],
["e840","é�¯",14,"é�¿",43,"é‘¬é‘­é‘®é‘¯"],
["e880","é‘°",20,"é’‘é’–é’˜é“‡é“�é““é“”é“šé“¦é“»é”œé” ç�›ç�šç‘�ç‘œç‘—ç‘•ç‘™ç‘·ç‘­ç‘¾ç’œç’Žç’€ç’�ç’‡ç’‹ç’žç’¨ç’©ç’�ç’§ç“’ç’ºéŸªéŸ«éŸ¬æ�Œæ�“æ�žæ�ˆæ�©æž¥æž‡æ�ªæ�³æž˜æž§æ�µæž¨æžžæž­æž‹æ�·æ�¼æŸ°æ ‰æŸ˜æ ŠæŸ©æž°æ ŒæŸ™æžµæŸšæž³æŸ�æ €æŸƒæž¸æŸ¢æ ŽæŸ�æŸ½æ ²æ ³æ¡ æ¡¡æ¡Žæ¡¢æ¡„æ¡¤æ¢ƒæ �æ¡•æ¡¦æ¡�æ¡§æ¡€æ ¾æ¡Šæ¡‰æ ©æ¢µæ¢�æ¡´æ¡·æ¢“æ¡«æ£‚æ¥®æ£¼æ¤Ÿæ¤ æ£¹"],
["e940","é”§é”³é”½é•ƒé•ˆé•‹é••é•šé• é•®é•´é•µé•·",7,"é–€",42],
["e980","é–«",32,"æ¤¤æ£°æ¤‹æ¤�æ¥—æ££æ¤�æ¥±æ¤¹æ¥ æ¥‚æ¥�æ¦„æ¥«æ¦€æ¦˜æ¥¸æ¤´æ§Œæ¦‡æ¦ˆæ§Žæ¦‰æ¥¦æ¥£æ¥¹æ¦›æ¦§æ¦»æ¦«æ¦­æ§”æ¦±æ§�æ§Šæ§Ÿæ¦•æ§ æ¦�æ§¿æ¨¯æ§­æ¨—æ¨˜æ©¥æ§²æ©„æ¨¾æª æ©�æ©›æ¨µæªŽæ©¹æ¨½æ¨¨æ©˜æ©¼æª‘æª�æª©æª—æª«çŒ·ç�’æ®�æ®‚æ®‡æ®„æ®’æ®“æ®�æ®šæ®›æ®¡æ®ªè½«è½­è½±è½²è½³è½µè½¶è½¸è½·è½¹è½ºè½¼è½¾è¾�è¾‚è¾„è¾‡è¾‹"],
["ea40","é—Œ",27,"é—¬é—¿é˜‡é˜“é˜˜é˜›é˜žé˜ é˜£",6,"é˜«é˜¬é˜­é˜¯é˜°é˜·é˜¸é˜¹é˜ºé˜¾é™�é™ƒé™Šé™Žé™�é™‘é™’é™“é™–é™—"],
["ea80","é™˜é™™é™šé™œé™�é™žé™ é™£é™¥é™¦é™«é™­",4,"é™³é™¸",12,"éš‡éš‰éšŠè¾�è¾Žè¾�è¾˜è¾šè»Žæˆ‹æˆ—æˆ›æˆŸæˆ¢æˆ¡æˆ¥æˆ¤æˆ¬è‡§ç“¯ç“´ç“¿ç”�ç”‘ç”“æ”´æ—®æ—¯æ—°æ˜Šæ˜™æ�²æ˜ƒæ˜•æ˜€ç‚…æ›·æ˜�æ˜´æ˜±æ˜¶æ˜µè€†æ™Ÿæ™”æ™�æ™�æ™–æ™¡æ™—æ™·æš„æšŒæš§æš�æš¾æ››æ›œæ›¦æ›©è´²è´³è´¶è´»è´½èµ€èµ…èµ†èµˆèµ‰èµ‡èµ�èµ•èµ™è§‡è§Šè§‹è§Œè§Žè§�è§�è§‘ç‰®çŠŸç‰�ç‰¦ç‰¯ç‰¾ç‰¿çŠ„çŠ‹çŠ�çŠ�çŠ’æŒˆæŒ²æŽ°"],
["eb40","éšŒéšŽéš‘éš’éš“éš•éš–éššéš›éš�",9,"éš¨",7,"éš±éš²éš´éšµéš·éš¸éšºéš»éš¿é›‚é›ƒé›ˆé›Šé›‹é›�é›‘é›“é›”é›–",9,"é›¡",6,"é›«"],
["eb80","é›¬é›­é›®é›°é›±é›²é›´é›µé›¸é›ºé›»é›¼é›½é›¿éœ‚éœƒéœ…éœŠéœ‹éœŒéœ�éœ‘éœ’éœ”éœ•éœ—",4,"éœ�éœŸéœ æ�¿æ“˜è€„æ¯ªæ¯³æ¯½æ¯µæ¯¹æ°…æ°‡æ°†æ°�æ°•æ°˜æ°™æ°šæ°¡æ°©æ°¤æ°ªæ°²æ”µæ••æ•«ç‰�ç‰’ç‰–çˆ°è™¢åˆ–è‚Ÿè‚œè‚“è‚¼æœŠè‚½è‚±è‚«è‚­è‚´è‚·èƒ§èƒ¨èƒ©èƒªèƒ›èƒ‚èƒ„èƒ™èƒ�èƒ—æœ�èƒ�èƒ«èƒ±èƒ´èƒ­è„�è„Žèƒ²èƒ¼æœ•è„’è±šè„¶è„žè„¬è„˜è„²è…ˆè…Œè…“è…´è…™è…šè…±è… è…©è…¼è…½è…­è…§å¡�åªµè†ˆè†‚è†‘æ»•è†£è†ªè‡Œæœ¦è‡Šè†»"],
["ec40","éœ¡",8,"éœ«éœ¬éœ®éœ¯éœ±éœ³",4,"éœºéœ»éœ¼éœ½éœ¿",18,"é�”é�•é�—é�˜é�šé�œé��é�Ÿé�£é�¤é�¦é�§é�¨é�ª",7],
["ec80","é�²é�µé�·",4,"é�½",7,"éž†",4,"éžŒéžŽéž�éž�éž“éž•éž–éž—éž™",4,"è‡�è†¦æ¬¤æ¬·æ¬¹æ­ƒæ­†æ­™é£‘é£’é£“é£•é£™é£šæ®³å½€æ¯‚è§³æ–�é½‘æ–“æ–¼æ—†æ—„æ—ƒæ—Œæ—Žæ—’æ—–ç‚€ç‚œç‚–ç‚�ç‚»çƒ€ç‚·ç‚«ç‚±çƒ¨çƒŠç„�ç„“ç„–ç„¯ç„±ç…³ç…œç…¨ç……ç…²ç…Šç…¸ç…ºç†˜ç†³ç†µç†¨ç† ç‡ ç‡”ç‡§ç‡¹çˆ�çˆ¨ç�¬ç„˜ç…¦ç†¹æˆ¾æˆ½æ‰ƒæ‰ˆæ‰‰ç¤»ç¥€ç¥†ç¥‰ç¥›ç¥œç¥“ç¥šç¥¢ç¥—ç¥ ç¥¯ç¥§ç¥ºç¦…ç¦Šç¦šç¦§ç¦³å¿‘å¿�"],
["ed40","éžžéžŸéž¡éž¢éž¤",6,"éž¬éž®éž°éž±éž³éžµ",46],
["ed80","éŸ¤éŸ¥éŸ¨éŸ®",4,"éŸ´éŸ·",23,"æ€¼æ��æ�šæ�§æ��æ�™æ�£æ‚«æ„†æ„�æ…�æ†©æ†�æ‡‹æ‡‘æˆ†è‚€è�¿æ²“æ³¶æ·¼çŸ¶çŸ¸ç €ç ‰ç —ç ˜ç ‘æ–«ç ­ç œç �ç ¹ç ºç »ç Ÿç ¼ç ¥ç ¬ç £ç ©ç¡Žç¡­ç¡–ç¡—ç ¦ç¡�ç¡‡ç¡Œç¡ªç¢›ç¢“ç¢šç¢‡ç¢œç¢¡ç¢£ç¢²ç¢¹ç¢¥ç£”ç£™ç£‰ç£¬ç£²ç¤…ç£´ç¤“ç¤¤ç¤žç¤´é¾›é»¹é»»é»¼ç›±çœ„çœ�ç›¹çœ‡çœˆçœšçœ¢çœ™çœ­çœ¦çœµçœ¸ç��ç�‘ç�‡ç�ƒç�šç�¨"],
["ee40","é �",62],
["ee80","é¡Ž",32,"ç�¢ç�¥ç�¿çž�ç�½çž€çžŒçž‘çžŸçž çž°çžµçž½ç”ºç•€ç•Žç•‹ç•ˆç•›ç•²ç•¹ç–ƒç½˜ç½¡ç½Ÿè©ˆç½¨ç½´ç½±ç½¹ç¾�ç½¾ç›�ç›¥è ²é’…é’†é’‡é’‹é’Šé’Œé’�é’�é’�é’”é’—é’•é’šé’›é’œé’£é’¤é’«é’ªé’­é’¬é’¯é’°é’²é’´é’¶",4,"é’¼é’½é’¿é“„é“ˆ",6,"é“�é“‘é“’é“•é“–é“—é“™é“˜é“›é“žé“Ÿé“ é“¢é“¤é“¥é“§é“¨é“ª"],
["ef40","é¡¯",5,"é¢‹é¢Žé¢’é¢•é¢™é¢£é¢¨",37,"é£�é£�é£”é£–é£—é£›é£œé£�é£ ",4],
["ef80","é£¥é£¦é£©",30,"é“©é“«é“®é“¯é“³é“´é“µé“·é“¹é“¼é“½é“¿é”ƒé”‚é”†é”‡é”‰é”Šé”�é”Žé”�é”’",4,"é”˜é”›é”�é”žé”Ÿé”¢é”ªé”«é”©é”¬é”±é”²é”´é”¶é”·é”¸é”¼é”¾é”¿é•‚é”µé•„é•…é•†é•‰é•Œé•Žé•�é•’é•“é•”é•–é•—é•˜é•™é•›é•žé•Ÿé•�é•¡é•¢é•¤",8,"é•¯é•±é•²é•³é”ºçŸ§çŸ¬é›‰ç§•ç§­ç§£ç§«ç¨†åµ‡ç¨ƒç¨‚ç¨žç¨”"],
["f040","é¤ˆ",4,"é¤Žé¤�é¤‘",28,"é¤¯",26],
["f080","é¥Š",9,"é¥–",12,"é¥¤é¥¦é¥³é¥¸é¥¹é¥»é¥¾é¦‚é¦ƒé¦‰ç¨¹ç¨·ç©‘é»�é¦¥ç©°çšˆçšŽçš“çš™çš¤ç“žç“ ç”¬é¸ é¸¢é¸¨",4,"é¸²é¸±é¸¶é¸¸é¸·é¸¹é¸ºé¸¾é¹�é¹‚é¹„é¹†é¹‡é¹ˆé¹‰é¹‹é¹Œé¹Žé¹‘é¹•é¹—é¹šé¹›é¹œé¹žé¹£é¹¦",6,"é¹±é¹­é¹³ç–’ç–”ç––ç– ç–�ç–¬ç–£ç–³ç–´ç–¸ç—„ç–±ç–°ç—ƒç—‚ç—–ç—�ç—£ç—¨ç—¦ç—¤ç—«ç—§ç˜ƒç—±ç—¼ç—¿ç˜�ç˜€ç˜…ç˜Œç˜—ç˜Šç˜¥ç˜˜ç˜•ç˜™"],
["f140","é¦Œé¦Žé¦š",10,"é¦¦é¦§é¦©",47],
["f180","é§™",32,"ç˜›ç˜¼ç˜¢ç˜ ç™€ç˜­ç˜°ç˜¿ç˜µç™ƒç˜¾ç˜³ç™�ç™žç™”ç™œç™–ç™«ç™¯ç¿Šç«¦ç©¸ç©¹çª€çª†çªˆçª•çª¦çª çª¬çª¨çª­çª³è¡¤è¡©è¡²è¡½è¡¿è¢‚è¢¢è£†è¢·è¢¼è£‰è£¢è£Žè££è£¥è£±è¤šè£¼è£¨è£¾è£°è¤¡è¤™è¤“è¤›è¤Šè¤´è¤«è¤¶è¥�è¥¦è¥»ç–‹èƒ¥çš²çš´çŸœè€’è€”è€–è€œè€ è€¢è€¥è€¦è€§è€©è€¨è€±è€‹è€µè�ƒè�†è��è�’è�©è�±è¦ƒé¡¸é¢€é¢ƒ"],
["f240","é§º",62],
["f280","é¨¹",32,"é¢‰é¢Œé¢�é¢�é¢”é¢šé¢›é¢žé¢Ÿé¢¡é¢¢é¢¥é¢¦è™�è™”è™¬è™®è™¿è™ºè™¼è™»èš¨èš�èš‹èš¬èš�èš§èš£èšªèš“èš©èš¶è›„èšµè›Žèš°èšºèš±èš¯è›‰è›�èš´è›©è›±è›²è›­è›³è›�èœ“è›žè›´è›Ÿè›˜è›‘èœƒèœ‡è›¸èœˆèœŠèœ�èœ‰èœ£èœ»èœžèœ¥èœ®èœšèœ¾è�ˆèœ´èœ±èœ©èœ·èœ¿èž‚èœ¢è�½è�¾è�»è� è�°è�Œè�®èž‹è�“è�£è�¼è�¤è�™è�¥èž“èž¯èž¨èŸ’"],
["f340","é©š",17,"é©²éªƒéª‰éª�éªŽéª”éª•éª™éª¦éª©",6,"éª²éª³éª´éªµéª¹éª»éª½éª¾éª¿é«ƒé«„é«†",4,"é«�é«Žé«�é«�é«’é«”é«•é«–é«—é«™é«šé«›é«œ"],
["f380","é«�é«žé« é«¢é«£é«¤é«¥é«§é«¨é«©é«ªé«¬é«®é«°",8,"é«ºé«¼",6,"é¬„é¬…é¬†èŸ†èžˆèž…èž­èž—èžƒèž«èŸ¥èž¬èžµèž³èŸ‹èŸ“èž½èŸ‘èŸ€èŸŠèŸ›èŸªèŸ èŸ®è –è “èŸ¾è Šè ›è ¡è ¹è ¼ç¼¶ç½‚ç½„ç½…èˆ�ç«ºç«½ç¬ˆç¬ƒç¬„ç¬•ç¬Šç¬«ç¬�ç­‡ç¬¸ç¬ªç¬™ç¬®ç¬±ç¬ ç¬¥ç¬¤ç¬³ç¬¾ç¬žç­˜ç­šç­…ç­µç­Œç­�ç­ ç­®ç­»ç­¢ç­²ç­±ç®�ç®¦ç®§ç®¸ç®¬ç®�ç®¨ç®…ç®ªç®œç®¢ç®«ç®´ç¯‘ç¯�ç¯Œç¯�ç¯šç¯¥ç¯¦ç¯ªç°Œç¯¾ç¯¼ç°�ç°–ç°‹"],
["f440","é¬‡é¬‰",5,"é¬�é¬‘é¬’é¬”",10,"é¬ é¬¡é¬¢é¬¤",10,"é¬°é¬±é¬³",7,"é¬½é¬¾é¬¿é­€é­†é­Šé­‹é­Œé­Žé­�é­’é­“é­•",5],
["f480","é­›",32,"ç°Ÿç°ªç°¦ç°¸ç±�ç±€è‡¾èˆ�èˆ‚èˆ„è‡¬è¡„èˆ¡èˆ¢èˆ£èˆ­èˆ¯èˆ¨èˆ«èˆ¸èˆ»èˆ³èˆ´èˆ¾è‰„è‰‰è‰‹è‰�è‰šè‰Ÿè‰¨è¡¾è¢…è¢ˆè£˜è£Ÿè¥žç¾�ç¾Ÿç¾§ç¾¯ç¾°ç¾²ç±¼æ•‰ç²‘ç²�ç²œç²žç²¢ç²²ç²¼ç²½ç³�ç³‡ç³Œç³�ç³ˆç³…ç³—ç³¨è‰®æš¨ç¾¿ç¿Žç¿•ç¿¥ç¿¡ç¿¦ç¿©ç¿®ç¿³ç³¸çµ·ç¶¦ç¶®ç¹‡çº›éº¸éº´èµ³è¶„è¶”è¶‘è¶±èµ§èµ­è±‡è±‰é…Šé…�é…Žé…�é…¤"],
["f540","é­¼",62],
["f580","é®»",32,"é…¢é…¡é…°é…©é…¯é…½é…¾é…²é…´é…¹é†Œé†…é†�é†�é†‘é†¢é†£é†ªé†­é†®é†¯é†µé†´é†ºè±•é¹¾è¶¸è·«è¸…è¹™è¹©è¶µè¶¿è¶¼è¶ºè·„è·–è·—è·šè·žè·Žè·�è·›è·†è·¬è··è·¸è·£è·¹è·»è·¤è¸‰è·½è¸”è¸�è¸Ÿè¸¬è¸®è¸£è¸¯è¸ºè¹€è¸¹è¸µè¸½è¸±è¹‰è¹�è¹‚è¹‘è¹’è¹Šè¹°è¹¶è¹¼è¹¯è¹´èº…èº�èº”èº�èºœèºžè±¸è²‚è²Šè²…è²˜è²”æ–›è§–è§žè§šè§œ"],
["f640","é¯œ",62],
["f680","é°›",32,"è§¥è§«è§¯è¨¾è¬¦é�“é›©é›³é›¯éœ†éœ�éœˆéœ�éœŽéœªéœ­éœ°éœ¾é¾€é¾ƒé¾…",5,"é¾Œé»¾é¼‹é¼�éš¹éš¼éš½é›Žé›’çž¿é› éŠŽéŠ®é‹ˆéŒ¾é�ªé�ŠéŽ�é�¾é‘«é±¿é²‚é²…é²†é²‡é²ˆç¨£é²‹é²Žé²�é²‘é²’é²”é²•é²šé²›é²ž",5,"é²¥",4,"é²«é²­é²®é²°",7,"é²ºé²»é²¼é²½é³„é³…é³†é³‡é³Šé³‹"],
["f740","é°¼",62],
["f780","é±»é±½é±¾é²€é²ƒé²„é²‰é²Šé²Œé²�é²“é²–é²—é²˜é²™é²�é²ªé²¬é²¯é²¹é²¾",4,"é³ˆé³‰é³‘é³’é³šé³›é³ é³¡é³Œ",4,"é³“é³”é³•é³—é³˜é³™é³œé³�é³Ÿé³¢é�¼éž…éž‘éž’éž”éž¯éž«éž£éž²éž´éª±éª°éª·é¹˜éª¶éªºéª¼é«�é«€é«…é«‚é«‹é«Œé«‘é­…é­ƒé­‡é­‰é­ˆé­�é­‘é£¨é¤�é¤®é¥•é¥”é«Ÿé«¡é«¦é«¯é««é«»é«­é«¹é¬ˆé¬�é¬“é¬Ÿé¬£éº½éº¾ç¸»éº‚éº‡éºˆéº‹éº’é�–éº�éºŸé»›é»œé»�é» é»Ÿé»¢é»©é»§é»¥é»ªé»¯é¼¢é¼¬é¼¯é¼¹é¼·é¼½é¼¾é½„"],
["f840","é³£",62],
["f880","é´¢",32],
["f940","éµƒ",62],
["f980","é¶‚",32],
["fa40","é¶£",62],
["fa80","é·¢",32],
["fb40","é¸ƒ",27,"é¸¤é¸§é¸®é¸°é¸´é¸»é¸¼é¹€é¹�é¹�é¹’é¹“é¹”é¹–é¹™é¹�é¹Ÿé¹ é¹¡é¹¢é¹¥é¹®é¹¯é¹²é¹´",9,"éº€"],
["fb80","éº�éºƒéº„éº…éº†éº‰éºŠéºŒ",5,"éº”",8,"éºžéº ",5,"éº§éº¨éº©éºª"],
["fc40","éº«",8,"éºµéº¶éº·éº¹éººéº¼éº¿",4,"é»…é»†é»‡é»ˆé»Šé»‹é»Œé»�é»’é»“é»•é»–é»—é»™é»šé»žé»¡é»£é»¤é»¦é»¨é»«é»¬é»­é»®é»°",8,"é»ºé»½é»¿",6],
["fc80","é¼†",4,"é¼Œé¼�é¼‘é¼’é¼”é¼•é¼–é¼˜é¼š",5,"é¼¡é¼£",8,"é¼­é¼®é¼°é¼±"],
["fd40","é¼²",4,"é¼¸é¼ºé¼¼é¼¿",4,"é½…",10,"é½’",38],
["fd80","é½¹",5,"é¾�é¾‚é¾�",11,"é¾œé¾�é¾žé¾¡",4,"ï¤¬ï¥¹ï¦•ï§§ï§±"],
["fe40","ï¨Œï¨�ï¨Žï¨�ï¨‘ï¨“ï¨”ï¨˜ï¨Ÿï¨ ï¨¡ï¨£ï¨¤ï¨§ï¨¨ï¨©"]
]
[
["0","\u0000",127],
["8141","ê°‚ê°ƒê°…ê°†ê°‹",4,"ê°˜ê°žê°Ÿê°¡ê°¢ê°£ê°¥",6,"ê°®ê°²ê°³ê°´"],
["8161","ê°µê°¶ê°·ê°ºê°»ê°½ê°¾ê°¿ê±�",9,"ê±Œê±Ž",5,"ê±•"],
["8181","ê±–ê±—ê±™ê±šê±›ê±�",18,"ê±²ê±³ê±µê±¶ê±¹ê±»",4,"ê²‚ê²‡ê²ˆê²�ê²Žê²�ê²‘ê²’ê²“ê²•",6,"ê²žê²¢",5,"ê²«ê²­ê²®ê²±",6,"ê²ºê²¾ê²¿ê³€ê³‚ê³ƒê³…ê³†ê³‡ê³‰ê³Šê³‹ê³�",7,"ê³–ê³˜",7,"ê³¢ê³£ê³¥ê³¦ê³©ê³«ê³­ê³®ê³²ê³´ê³·",4,"ê³¾ê³¿ê´�ê´‚ê´ƒê´…ê´‡",4,"ê´Žê´�ê´’ê´“"],
["8241","ê´”ê´•ê´–ê´—ê´™ê´šê´›ê´�ê´žê´Ÿê´¡",7,"ê´ªê´«ê´®",5],
["8261","ê´¶ê´·ê´¹ê´ºê´»ê´½",6,"êµ†êµˆêµŠ",5,"êµ‘êµ’êµ“êµ•êµ–êµ—"],
["8281","êµ™",7,"êµ¢êµ¤",7,"êµ®êµ¯êµ±êµ²êµ·êµ¸êµ¹êµºêµ¾ê¶€ê¶ƒ",4,"ê¶Šê¶‹ê¶�ê¶Žê¶�ê¶‘",10,"ê¶ž",5,"ê¶¥",17,"ê¶¸",7,"ê·‚ê·ƒê·…ê·†ê·‡ê·‰",6,"ê·’ê·”",7,"ê·�ê·žê·Ÿê·¡ê·¢ê·£ê·¥",18],
["8341","ê·ºê·»ê·½ê·¾ê¸‚",5,"ê¸Šê¸Œê¸Ž",5,"ê¸•",7],
["8361","ê¸�",18,"ê¸²ê¸³ê¸µê¸¶ê¸¹ê¸»ê¸¼"],
["8381","ê¸½ê¸¾ê¸¿ê¹‚ê¹„ê¹‡ê¹ˆê¹‰ê¹‹ê¹�ê¹‘ê¹’ê¹“ê¹•ê¹—",4,"ê¹žê¹¢ê¹£ê¹¤ê¹¦ê¹§ê¹ªê¹«ê¹­ê¹®ê¹¯ê¹±",6,"ê¹ºê¹¾",5,"êº†",5,"êº�",46,"êº¿ê»�ê»‚ê»ƒê»…",6,"ê»Žê»’",5,"ê»šê»›ê»�",8],
["8441","ê»¦ê»§ê»©ê»ªê»¬ê»®",5,"ê»µê»¶ê»·ê»¹ê»ºê»»ê»½",8],
["8461","ê¼†ê¼‰ê¼Šê¼‹ê¼Œê¼Žê¼�ê¼‘",18],
["8481","ê¼¤",7,"ê¼®ê¼¯ê¼±ê¼³ê¼µ",6,"ê¼¾ê½€ê½„ê½…ê½†ê½‡ê½Š",5,"ê½‘",10,"ê½ž",5,"ê½¦",18,"ê½º",5,"ê¾�ê¾‚ê¾ƒê¾…ê¾†ê¾‡ê¾‰",6,"ê¾’ê¾“ê¾”ê¾–",5,"ê¾�",26,"ê¾ºê¾»ê¾½ê¾¾"],
["8541","ê¾¿ê¿�",5,"ê¿Šê¿Œê¿�",4,"ê¿•",6,"ê¿�",4],
["8561","ê¿¢",5,"ê¿ª",5,"ê¿²ê¿³ê¿µê¿¶ê¿·ê¿¹",6,"ë€‚ë€ƒ"],
["8581","ë€…",6,"ë€�ë€Žë€�ë€‘ë€’ë€“ë€•",6,"ë€ž",9,"ë€©",26,"ë�†ë�‡ë�‰ë�‹ë��ë��ë��ë�‘ë�’ë�–ë�˜ë�šë�›ë�œë�ž",29,"ë�¾ë�¿ë‚�ë‚‚ë‚ƒë‚…",6,"ë‚Žë‚�ë‚’",5,"ë‚›ë‚�ë‚žë‚£ë‚¤"],
["8641","ë‚¥ë‚¦ë‚§ë‚ªë‚°ë‚²ë‚¶ë‚·ë‚¹ë‚ºë‚»ë‚½",6,"ëƒ†ëƒŠ",5,"ëƒ’"],
["8661","ëƒ“ëƒ•ëƒ–ëƒ—ëƒ™",6,"ëƒ¡ëƒ¢ëƒ£ëƒ¤ëƒ¦",10],
["8681","ëƒ±",22,"ë„Šë„�ë„Žë„�ë„‘ë„”ë„•ë„–ë„—ë„šë„ž",4,"ë„¦ë„§ë„©ë„ªë„«ë„­",6,"ë„¶ë„º",5,"ë…‚ë…ƒë……ë…†ë…‡ë…‰",6,"ë…’ë…“ë…–ë…—ë…™ë…šë…›ë…�ë…žë…Ÿë…¡",22,"ë…ºë…»ë…½ë…¾ë…¿ë†�ë†ƒ",4,"ë†Šë†Œë†Žë†�ë†�ë†‘ë†•ë†–ë†—ë†™ë†šë†›ë†�"],
["8741","ë†ž",9,"ë†©",15],
["8761","ë†¹",18,"ë‡�ë‡Žë‡�ë‡‘ë‡’ë‡“ë‡•"],
["8781","ë‡–",5,"ë‡žë‡ ",7,"ë‡ªë‡«ë‡­ë‡®ë‡¯ë‡±",7,"ë‡ºë‡¼ë‡¾",5,"ëˆ†ëˆ‡ëˆ‰ëˆŠëˆ�",6,"ëˆ–ëˆ˜ëˆš",5,"ëˆ¡",18,"ëˆµ",6,"ëˆ½",26,"ë‰™ë‰šë‰›ë‰�ë‰žë‰Ÿë‰¡",6,"ë‰ª",4],
["8841","ë‰¯",4,"ë‰¶",5,"ë‰½",6,"ëŠ†ëŠ‡ëŠˆëŠŠ",4],
["8861","ëŠ�ëŠ’ëŠ“ëŠ•ëŠ–ëŠ—ëŠ›",4,"ëŠ¢ëŠ¤ëŠ§ëŠ¨ëŠ©ëŠ«ëŠ­ëŠ®ëŠ¯ëŠ±ëŠ²ëŠ³ëŠµëŠ¶ëŠ·"],
["8881","ëŠ¸",15,"ë‹Šë‹‹ë‹�ë‹Žë‹�ë‹‘ë‹“",4,"ë‹šë‹œë‹žë‹Ÿë‹ ë‹¡ë‹£ë‹§ë‹©ë‹ªë‹°ë‹±ë‹²ë‹¶ë‹¼ë‹½ë‹¾ëŒ‚ëŒƒëŒ…ëŒ†ëŒ‡ëŒ‰",6,"ëŒ’ëŒ–",5,"ëŒ�",54,"ë�—ë�™ë�šë��ë� ë�¡ë�¢ë�£"],
["8941","ë�¦ë�¨ë�ªë�¬ë�­ë�¯ë�²ë�³ë�µë�¶ë�·ë�¹",6,"ëŽ‚ëŽ†",5,"ëŽ�"],
["8961","ëŽŽëŽ�ëŽ‘ëŽ’ëŽ“ëŽ•",10,"ëŽ¢",5,"ëŽ©ëŽªëŽ«ëŽ­"],
["8981","ëŽ®",21,"ë�†ë�‡ë�‰ë�Šë��ë��ë�‘ë�’ë�“ë�–ë�˜ë�šë�œë�žë�Ÿë�¡ë�¢ë�£ë�¥ë�¦ë�§ë�©",18,"ë�½",18,"ë�‘",6,"ë�™ë�šë�›ë��ë�žë�Ÿë�¡",6,"ë�ªë�¬",7,"ë�µ",15],
["8a41","ë‘…",10,"ë‘’ë‘“ë‘•ë‘–ë‘—ë‘™",6,"ë‘¢ë‘¤ë‘¦"],
["8a61","ë‘§",4,"ë‘­",18,"ë’�ë’‚"],
["8a81","ë’ƒ",4,"ë’‰",19,"ë’ž",5,"ë’¥ë’¦ë’§ë’©ë’ªë’«ë’­",7,"ë’¶ë’¸ë’º",5,"ë“�ë“‚ë“ƒë“…ë“†ë“‡ë“‰",6,"ë“‘ë“’ë““ë“”ë“–",5,"ë“žë“Ÿë“¡ë“¢ë“¥ë“§",4,"ë“®ë“°ë“²",5,"ë“¹",26,"ë”–ë”—ë”™ë”šë”�"],
["8b41","ë”ž",5,"ë”¦ë”«",4,"ë”²ë”³ë”µë”¶ë”·ë”¹",6,"ë•‚ë•†"],
["8b61","ë•‡ë•ˆë•‰ë•Šë•Žë•�ë•‘ë•’ë•“ë••",6,"ë•žë•¢",8],
["8b81","ë•«",52,"ë–¢ë–£ë–¥ë–¦ë–§ë–©ë–¬ë–­ë–®ë–¯ë–²ë–¶",4,"ë–¾ë–¿ë—�ë—‚ë—ƒë—…",6,"ë—Žë—’",5,"ë—™",18,"ë—­",18],
["8c41","ë˜€",15,"ë˜’ë˜“ë˜•ë˜–ë˜—ë˜™",4],
["8c61","ë˜ž",6,"ë˜¦",5,"ë˜­",6,"ë˜µ",5],
["8c81","ë˜»",12,"ë™‰",26,"ë™¥ë™¦ë™§ë™©",50,"ëšžëšŸëš¡ëš¢ëš£ëš¥",5,"ëš­ëš®ëš¯ëš°ëš²",16],
["8d41","ë›ƒ",16,"ë›•",8],
["8d61","ë›ž",17,"ë›±ë›²ë›³ë›µë›¶ë›·ë›¹ë›º"],
["8d81","ë›»",4,"ëœ‚ëœƒëœ„ëœ†",33,"ëœªëœ«ëœ­ëœ®ëœ±",6,"ëœºëœ¼",7,"ë�…ë�†ë�‡ë�‰ë�Šë�‹ë��",6,"ë�–",9,"ë�¡ë�¢ë�£ë�¥ë�¦ë�§ë�©",6,"ë�²ë�´ë�¶",5,"ë�¾ë�¿ëž�ëž‚ëžƒëž…",6,"ëžŽëž“ëž”ëž•ëžšëž›ëž�ëžž"],
["8e41","ëžŸëž¡",6,"ëžªëž®",5,"ëž¶ëž·ëž¹",8],
["8e61","ëŸ‚",4,"ëŸˆëŸŠ",19],
["8e81","ëŸž",13,"ëŸ®ëŸ¯ëŸ±ëŸ²ëŸ³ëŸµ",6,"ëŸ¾ë ‚",4,"ë Šë ‹ë �ë Žë �ë ‘",6,"ë šë œë ž",5,"ë ¦ë §ë ©ë ªë «ë ­",6,"ë ¶ë º",5,"ë¡�ë¡‚ë¡ƒë¡…",11,"ë¡’ë¡”",7,"ë¡žë¡Ÿë¡¡ë¡¢ë¡£ë¡¥",6,"ë¡®ë¡°ë¡²",5,"ë¡¹ë¡ºë¡»ë¡½",7],
["8f41","ë¢…",7,"ë¢Ž",17],
["8f61","ë¢ ",7,"ë¢©",6,"ë¢±ë¢²ë¢³ë¢µë¢¶ë¢·ë¢¹",4],
["8f81","ë¢¾ë¢¿ë£‚ë£„ë£†",5,"ë£�ë£Žë£�ë£‘ë£’ë£“ë£•",7,"ë£žë£ ë£¢",5,"ë£ªë£«ë£­ë£®ë£¯ë£±",6,"ë£ºë£¼ë£¾",5,"ë¤…",18,"ë¤™",6,"ë¤¡",26,"ë¤¾ë¤¿ë¥�ë¥‚ë¥ƒë¥…",6,"ë¥�ë¥Žë¥�ë¥’",5],
["9041","ë¥šë¥›ë¥�ë¥žë¥Ÿë¥¡",6,"ë¥ªë¥¬ë¥®",5,"ë¥¶ë¥·ë¥¹ë¥ºë¥»ë¥½"],
["9061","ë¥¾",5,"ë¦†ë¦ˆë¦‹ë¦Œë¦�",15],
["9081","ë¦Ÿ",12,"ë¦®ë¦¯ë¦±ë¦²ë¦³ë¦µ",6,"ë¦¾ë§€ë§‚",5,"ë§Šë§‹ë§�ë§“",4,"ë§šë§œë§Ÿë§ ë§¢ë§¦ë§§ë§©ë§ªë§«ë§­",6,"ë§¶ë§»",4,"ë¨‚",5,"ë¨‰",11,"ë¨–",33,"ë¨ºë¨»ë¨½ë¨¾ë¨¿ë©�ë©ƒë©„ë©…ë©†"],
["9141","ë©‡ë©Šë©Œë©�ë©�ë©‘ë©’ë©–ë©—ë©™ë©šë©›ë©�",6,"ë©¦ë©ª",5],
["9161","ë©²ë©³ë©µë©¶ë©·ë©¹",9,"ëª†ëªˆëª‰ëªŠëª‹ëª�",5],
["9181","ëª“",20,"ëªªëª­ëª®ëª¯ëª±ëª³",4,"ëªºëª¼ëª¾",5,"ë«…ë«†ë«‡ë«‰",14,"ë«š",33,"ë«½ë«¾ë«¿ë¬�ë¬‚ë¬ƒë¬…",7,"ë¬Žë¬�ë¬’",5,"ë¬™ë¬šë¬›ë¬�ë¬žë¬Ÿë¬¡",6],
["9241","ë¬¨ë¬ªë¬¬",7,"ë¬·ë¬¹ë¬ºë¬¿",4,"ë­†ë­ˆë­Šë­‹ë­Œë­Žë­‘ë­’"],
["9261","ë­“ë­•ë­–ë­—ë­™",7,"ë­¢ë­¤",7,"ë­­",4],
["9281","ë­²",21,"ë®‰ë®Šë®‹ë®�ë®Žë®�ë®‘",18,"ë®¥ë®¦ë®§ë®©ë®ªë®«ë®­",6,"ë®µë®¶ë®¸",7,"ë¯�ë¯‚ë¯ƒë¯…ë¯†ë¯‡ë¯‰",6,"ë¯‘ë¯’ë¯”",35,"ë¯ºë¯»ë¯½ë¯¾ë°�"],
["9341","ë°ƒ",4,"ë°Šë°Žë°�ë°’ë°“ë°™ë°šë° ë°¡ë°¢ë°£ë°¦ë°¨ë°ªë°«ë°¬ë°®ë°¯ë°²ë°³ë°µ"],
["9361","ë°¶ë°·ë°¹",6,"ë±‚ë±†ë±‡ë±ˆë±Šë±‹ë±Žë±�ë±‘",8],
["9381","ë±šë±›ë±œë±ž",37,"ë²†ë²‡ë²‰ë²Šë²�ë²�",4,"ë²–ë²˜ë²›",4,"ë²¢ë²£ë²¥ë²¦ë²©",6,"ë²²ë²¶",5,"ë²¾ë²¿ë³�ë³‚ë³ƒë³…",7,"ë³Žë³’ë³“ë³”ë³–ë³—ë³™ë³šë³›ë³�",22,"ë³·ë³¹ë³ºë³»ë³½"],
["9441","ë³¾",5,"ë´†ë´ˆë´Š",5,"ë´‘ë´’ë´“ë´•",8],
["9461","ë´ž",5,"ë´¥",6,"ë´­",12],
["9481","ë´º",5,"ëµ�",6,"ëµŠëµ‹ëµ�ëµŽëµ�ëµ‘",6,"ëµš",9,"ëµ¥ëµ¦ëµ§ëµ©",22,"ë¶‚ë¶ƒë¶…ë¶†ë¶‹",4,"ë¶’ë¶”ë¶–ë¶—ë¶˜ë¶›ë¶�",6,"ë¶¥",10,"ë¶±",6,"ë¶¹",24],
["9541","ë·’ë·“ë·–ë·—ë·™ë·šë·›ë·�",11,"ë·ª",5,"ë·±"],
["9561","ë·²ë·³ë·µë·¶ë··ë·¹",6,"ë¸�ë¸‚ë¸„ë¸†",5,"ë¸Žë¸�ë¸‘ë¸’ë¸“"],
["9581","ë¸•",6,"ë¸žë¸ ",35,"ë¹†ë¹‡ë¹‰ë¹Šë¹‹ë¹�ë¹�",4,"ë¹–ë¹˜ë¹œë¹�ë¹žë¹Ÿë¹¢ë¹£ë¹¥ë¹¦ë¹§ë¹©ë¹«",4,"ë¹²ë¹¶",4,"ë¹¾ë¹¿ëº�ëº‚ëºƒëº…",6,"ëºŽëº’",5,"ëºš",13,"ëº©",14],
["9641","ëº¸",23,"ë»’ë»“"],
["9661","ë»•ë»–ë»™",6,"ë»¡ë»¢ë»¦",5,"ë»­",8],
["9681","ë»¶",10,"ë¼‚",5,"ë¼Š",13,"ë¼šë¼ž",33,"ë½‚ë½ƒë½…ë½†ë½‡ë½‰",6,"ë½’ë½“ë½”ë½–",44],
["9741","ë¾ƒ",16,"ë¾•",8],
["9761","ë¾ž",17,"ë¾±",7],
["9781","ë¾¹",11,"ë¿†",5,"ë¿Žë¿�ë¿‘ë¿’ë¿“ë¿•",6,"ë¿�ë¿žë¿ ë¿¢",89,"ì€½ì€¾ì€¿"],
["9841","ì�€",16,"ì�’",5,"ì�™ì�šì�›"],
["9861","ì��ì�žì�Ÿì�¡",6,"ì�ª",15],
["9881","ì�º",21,"ì‚’ì‚“ì‚•ì‚–ì‚—ì‚™",6,"ì‚¢ì‚¤ì‚¦",5,"ì‚®ì‚±ì‚²ì‚·",4,"ì‚¾ìƒ‚ìƒƒìƒ„ìƒ†ìƒ‡ìƒŠìƒ‹ìƒ�ìƒŽìƒ�ìƒ‘",6,"ìƒšìƒž",5,"ìƒ¦ìƒ§ìƒ©ìƒªìƒ«ìƒ­",6,"ìƒ¶ìƒ¸ìƒº",5,"ì„�ì„‚ì„ƒì„…ì„†ì„‡ì„‰",6,"ì„‘ì„’ì„“ì„”ì„–",5,"ì„¡ì„¢ì„¥ì„¨ì„©ì„ªì„«ì„®"],
["9941","ì„²ì„³ì„´ì„µì„·ì„ºì„»ì„½ì„¾ì„¿ì…�",6,"ì…Šì…Ž",5,"ì…–ì…—"],
["9961","ì…™ì…šì…›ì…�",6,"ì…¦ì…ª",5,"ì…±ì…²ì…³ì…µì…¶ì…·ì…¹ì…ºì…»"],
["9981","ì…¼",8,"ì††",5,"ì†�ì†‘ì†’ì†“ì†•ì†—",4,"ì†žì† ì†¢ì†£ì†¤ì†¦ì†§ì†ªì†«ì†­ì†®ì†¯ì†±",11,"ì†¾",5,"ì‡…ì‡†ì‡‡ì‡‰ì‡Šì‡‹ì‡�",6,"ì‡•ì‡–ì‡™",6,"ì‡¡ì‡¢ì‡£ì‡¥ì‡¦ì‡§ì‡©",6,"ì‡²ì‡´",7,"ì‡¾ì‡¿ìˆ�ìˆ‚ìˆƒìˆ…",6,"ìˆŽìˆ�ìˆ’",5,"ìˆšìˆ›ìˆ�ìˆžìˆ¡ìˆ¢ìˆ£"],
["9a41","ìˆ¤ìˆ¥ìˆ¦ìˆ§ìˆªìˆ¬ìˆ®ìˆ°ìˆ³ìˆµ",16],
["9a61","ì‰†ì‰‡ì‰‰",6,"ì‰’ì‰“ì‰•ì‰–ì‰—ì‰™",6,"ì‰¡ì‰¢ì‰£ì‰¤ì‰¦"],
["9a81","ì‰§",4,"ì‰®ì‰¯ì‰±ì‰²ì‰³ì‰µ",6,"ì‰¾ìŠ€ìŠ‚",5,"ìŠŠ",5,"ìŠ‘",6,"ìŠ™ìŠšìŠœìŠž",5,"ìŠ¦ìŠ§ìŠ©ìŠªìŠ«ìŠ®",5,"ìŠ¶ìŠ¸ìŠº",33,"ì‹žì‹Ÿì‹¡ì‹¢ì‹¥",5,"ì‹®ì‹°ì‹²ì‹³ì‹´ì‹µì‹·ì‹ºì‹½ì‹¾ì‹¿ìŒ�",6,"ìŒŠìŒ‹ìŒŽìŒ�"],
["9b41","ìŒ�ìŒ‘ìŒ’ìŒ–ìŒ—ìŒ™ìŒšìŒ›ìŒ�",6,"ìŒ¦ìŒ§ìŒª",8],
["9b61","ìŒ³",17,"ì�†",7],
["9b81","ì�Ž",25,"ì�ªì�«ì�­ì�®ì�¯ì�±ì�³",4,"ì�ºì�»ì�¾",5,"ìŽ…ìŽ†ìŽ‡ìŽ‰ìŽŠìŽ‹ìŽ�",50,"ì��",22,"ì�š"],
["9c41","ì�›ì��ì�žì�¡ì�£",4,"ì�ªì�«ì�¬ì�®",5,"ì�¶ì�·ì�¹",5],
["9c61","ì�¿",8,"ì�‰",6,"ì�‘",9],
["9c81","ì�›",8,"ì�¥",6,"ì�­ì�®ì�¯ì�±ì�²ì�³ì�µ",6,"ì�¾",9,"ì‘‰",26,"ì‘¦ì‘§ì‘©ì‘ªì‘«ì‘­",6,"ì‘¶ì‘·ì‘¸ì‘º",5,"ì’�",18,"ì’•",6,"ì’�",12],
["9d41","ì’ª",13,"ì’¹ì’ºì’»ì’½",8],
["9d61","ì“†",25],
["9d81","ì“ ",8,"ì“ª",5,"ì“²ì“³ì“µì“¶ì“·ì“¹ì“»ì“¼ì“½ì“¾ì”‚",9,"ì”�ì”Žì”�ì”‘ì”’ì”“ì”•",6,"ì”�",10,"ì”ªì”«ì”­ì”®ì”¯ì”±",6,"ì”ºì”¼ì”¾",5,"ì•†ì•‡ì•‹ì•�ì•�ì•‘ì•’ì•–ì•šì•›ì•œì•Ÿì•¢ì•£ì•¥ì•¦ì•§ì•©",6,"ì•²ì•¶",5,"ì•¾ì•¿ì–�ì–‚ì–ƒì–…ì–†ì–ˆì–‰ì–Šì–‹ì–Žì–�ì–’ì–“ì–”"],
["9e41","ì––ì–™ì–šì–›ì–�ì–žì–Ÿì–¡",7,"ì–ª",9,"ì–¶"],
["9e61","ì–·ì–ºì–¿",4,"ì—‹ì—�ì—�ì—’ì—“ì—•ì—–ì——ì—™",6,"ì—¢ì—¤ì—¦ì—§"],
["9e81","ì—¨ì—©ì—ªì—«ì—¯ì—±ì—²ì—³ì—µì—¸ì—¹ì—ºì—»ì˜‚ì˜ƒì˜„ì˜‰ì˜Šì˜‹ì˜�ì˜Žì˜�ì˜‘",6,"ì˜šì˜�",6,"ì˜¦ì˜§ì˜©ì˜ªì˜«ì˜¯ì˜±ì˜²ì˜¶ì˜¸ì˜ºì˜¼ì˜½ì˜¾ì˜¿ì™‚ì™ƒì™…ì™†ì™‡ì™‰",6,"ì™’ì™–",5,"ì™žì™Ÿì™¡",10,"ì™­ì™®ì™°ì™²",5,"ì™ºì™»ì™½ì™¾ì™¿ìš�",6,"ìšŠìšŒìšŽ",5,"ìš–ìš—ìš™ìššìš›ìš�",6,"ìš¦"],
["9f41","ìš¨ìšª",5,"ìš²ìš³ìšµìš¶ìš·ìš»",4,"ì›‚ì›„ì›†",5,"ì›Ž"],
["9f61","ì›�ì›‘ì›’ì›“ì›•",6,"ì›žì›Ÿì›¢",5,"ì›ªì›«ì›­ì›®ì›¯ì›±ì›²"],
["9f81","ì›³",4,"ì›ºì›»ì›¼ì›¾",5,"ìœ†ìœ‡ìœ‰ìœŠìœ‹ìœ�",6,"ìœ–ìœ˜ìœš",5,"ìœ¢ìœ£ìœ¥ìœ¦ìœ§ìœ©",6,"ìœ²ìœ´ìœ¶ìœ¸ìœ¹ìœºìœ»ìœ¾ìœ¿ì��ì�‚ì�ƒì�…",4,"ì�‹ì�Žì��ì�™ì�šì�›ì��ì�žì�Ÿì�¡",6,"ì�©ì�ªì�¬",7,"ì�¶ì�·ì�¹ì�ºì�»ì�¿ìž€ìž�ìž‚ìž†ìž‹ìžŒìž�ìž�ìž’ìž“ìž•ìž™ìž›",4,"ìž¢ìž§",4,"ìž®ìž¯ìž±ìž²ìž³ìžµìž¶ìž·"],
["a041","ìž¸ìž¹ìžºìž»ìž¾ìŸ‚",5,"ìŸŠìŸ‹ìŸ�ìŸ�ìŸ‘",6,"ìŸ™ìŸšìŸ›ìŸœ"],
["a061","ìŸž",5,"ìŸ¥ìŸ¦ìŸ§ìŸ©ìŸªìŸ«ìŸ­",13],
["a081","ìŸ»",4,"ì ‚ì ƒì …ì †ì ‡ì ‰ì ‹",4,"ì ’ì ”ì —",4,"ì žì Ÿì ¡ì ¢ì £ì ¥",6,"ì ®ì °ì ²",5,"ì ¹ì ºì »ì ½ì ¾ì ¿ì¡�",6,"ì¡Šì¡‹ì¡Ž",5,"ì¡•",26,"ì¡²ì¡³ì¡µì¡¶ì¡·ì¡¹ì¡»",4,"ì¢‚ì¢„ì¢ˆì¢‰ì¢Šì¢Ž",5,"ì¢•",7,"ì¢žì¢ ì¢¢ì¢£ì¢¤"],
["a141","ì¢¥ì¢¦ì¢§ì¢©",18,"ì¢¾ì¢¿ì£€ì£�"],
["a161","ì£‚ì£ƒì£…ì£†ì£‡ì£‰ì£Šì£‹ì£�",6,"ì£–ì£˜ì£š",5,"ì£¢ì££ì£¥"],
["a181","ì£¦",14,"ì£¶",5,"ì£¾ì£¿ì¤�ì¤‚ì¤ƒì¤‡",4,"ì¤Žã€€ã€�ã€‚Â·â€¥â€¦Â¨ã€ƒÂ­â€•âˆ¥ï¼¼âˆ¼â€˜â€™â€œâ€�ã€”ã€•ã€ˆ",9,"Â±Ã—Ã·â‰ â‰¤â‰¥âˆžâˆ´Â°â€²â€³â„ƒâ„«ï¿ ï¿¡ï¿¥â™‚â™€âˆ âŠ¥âŒ’âˆ‚âˆ‡â‰¡â‰’Â§â€»â˜†â˜…â—‹â—�â—Žâ—‡â—†â–¡â– â–³â–²â–½â–¼â†’â†�â†‘â†“â†”ã€“â‰ªâ‰«âˆšâˆ½âˆ�âˆµâˆ«âˆ¬âˆˆâˆ‹âŠ†âŠ‡âŠ‚âŠƒâˆªâˆ©âˆ§âˆ¨ï¿¢"],
["a241","ì¤�ì¤’",5,"ì¤™",18],
["a261","ì¤­",6,"ì¤µ",18],
["a281","ì¥ˆ",7,"ì¥’ì¥“ì¥•ì¥–ì¥—ì¥™",6,"ì¥¢ì¥¤",7,"ì¥­ì¥®ì¥¯â‡’â‡”âˆ€âˆƒÂ´ï½žË‡Ë˜Ë�ËšË™Â¸Ë›Â¡Â¿Ë�âˆ®âˆ‘âˆ�Â¤â„‰â€°â—�â—€â–·â–¶â™¤â™ â™¡â™¥â™§â™£âŠ™â—ˆâ–£â—�â—‘â–’â–¤â–¥â–¨â–§â–¦â–©â™¨â˜�â˜Žâ˜œâ˜žÂ¶â€ â€¡â†•â†—â†™â†–â†˜â™­â™©â™ªâ™¬ã‰¿ãˆœâ„–ã�‡â„¢ã�‚ã�˜â„¡â‚¬Â®"],
["a341","ì¥±ì¥²ì¥³ì¥µ",6,"ì¥½",10,"ì¦Šì¦‹ì¦�ì¦Žì¦�"],
["a361","ì¦‘",6,"ì¦šì¦œì¦ž",16],
["a381","ì¦¯",16,"ì§‚ì§ƒì§…ì§†ì§‰ì§‹",4,"ì§’ì§”ì§—ì§˜ì§›ï¼�",58,"ï¿¦ï¼½",32,"ï¿£"],
["a441","ì§žì§Ÿì§¡ì§£ì§¥ì§¦ì§¨ì§©ì§ªì§«ì§®ì§²",5,"ì§ºì§»ì§½ì§¾ì§¿ì¨�ì¨‚ì¨ƒì¨„"],
["a461","ì¨…ì¨†ì¨‡ì¨Šì¨Ž",5,"ì¨•ì¨–ì¨—ì¨™",12],
["a481","ì¨¦ì¨§ì¨¨ì¨ª",28,"ã„±",93],
["a541","ì©‡",4,"ì©Žì©�ì©‘ì©’ì©“ì©•",6,"ì©žì©¢",5,"ì©©ì©ª"],
["a561","ì©«",17,"ì©¾",5,"ìª…ìª†"],
["a581","ìª‡",16,"ìª™",14,"â…°",9],
["a5b0","â… ",9],
["a5c1","Î‘",16,"Î£",6],
["a5e1","Î±",16,"Ïƒ",6],
["a641","ìª¨",19,"ìª¾ìª¿ì«�ì«‚ì«ƒì«…"],
["a661","ì«†",5,"ì«Žì«�ì«’ì«”ì«•ì«–ì«—ì«š",5,"ì«¡",6],
["a681","ì«¨ì«©ì«ªì««ì«­",6,"ì«µ",18,"ì¬‰ì¬Šâ”€â”‚â”Œâ”�â”˜â””â”œâ”¬â”¤â”´â”¼â”�â”ƒâ”�â”“â”›â”—â”£â”³â”«â”»â•‹â” â”¯â”¨â”·â”¿â”�â”°â”¥â”¸â•‚â”’â”‘â”šâ”™â”–â”•â”Žâ”�â”žâ”Ÿâ”¡â”¢â”¦â”§â”©â”ªâ”­â”®â”±â”²â”µâ”¶â”¹â”ºâ”½â”¾â•€â•�â•ƒ",7],
["a741","ì¬‹",4,"ì¬‘ì¬’ì¬“ì¬•ì¬–ì¬—ì¬™",6,"ì¬¢",7],
["a761","ì¬ª",22,"ì­‚ì­ƒì­„"],
["a781","ì­…ì­†ì­‡ì­Šì­‹ì­�ì­Žì­�ì­‘",6,"ì­šì­›ì­œì­ž",5,"ì­¥",7,"ãŽ•ãŽ–ãŽ—â„“ãŽ˜ã�„ãŽ£ãŽ¤ãŽ¥ãŽ¦ãŽ™",9,"ã�ŠãŽ�ãŽŽãŽ�ã��ãŽˆãŽ‰ã�ˆãŽ§ãŽ¨ãŽ°",9,"ãŽ€",4,"ãŽº",5,"ãŽ�",4,"â„¦ã�€ã��ãŽŠãŽ‹ãŽŒã�–ã�…ãŽ­ãŽ®ãŽ¯ã�›ãŽ©ãŽªãŽ«ãŽ¬ã��ã��ã�“ã�ƒã�‰ã�œã�†"],
["a841","ì­­",10,"ì­º",14],
["a861","ì®‰",18,"ì®�",6],
["a881","ì®¤",19,"ì®¹",11,"Ã†Ã�ÂªÄ¦"],
["a8a6","Ä²"],
["a8a8","Ä¿Å�Ã˜Å’ÂºÃžÅ¦ÅŠ"],
["a8b1","ã‰ ",27,"â“�",25,"â‘ ",14,"Â½â…“â…”Â¼Â¾â…›â…œâ…�â…ž"],
["a941","ì¯…",14,"ì¯•",10],
["a961","ì¯ ì¯¡ì¯¢ì¯£ì¯¥ì¯¦ì¯¨ì¯ª",18],
["a981","ì¯½",14,"ì°Žì°�ì°‘ì°’ì°“ì°•",6,"ì°žì°Ÿì° ì°£ì°¤Ã¦Ä‘Ã°Ä§Ä±Ä³Ä¸Å€Å‚Ã¸Å“ÃŸÃ¾Å§Å‹Å‰ãˆ€",27,"â’œ",25,"â‘´",14,"Â¹Â²Â³â�´â�¿â‚�â‚‚â‚ƒâ‚„"],
["aa41","ì°¥ì°¦ì°ªì°«ì°­ì°¯ì°±",6,"ì°ºì°¿",4,"ì±†ì±‡ì±‰ì±Šì±‹ì±�ì±Ž"],
["aa61","ì±�",4,"ì±–ì±š",5,"ì±¡ì±¢ì±£ì±¥ì±§ì±©",6,"ì±±ì±²"],
["aa81","ì±³ì±´ì±¶",29,"ã��",82],
["ab41","ì²”ì²•ì²–ì²—ì²šì²›ì²�ì²žì²Ÿì²¡",6,"ì²ªì²®",5,"ì²¶ì²·ì²¹"],
["ab61","ì²ºì²»ì²½",6,"ì³†ì³ˆì³Š",5,"ì³‘ì³’ì³“ì³•",5],
["ab81","ì³›",8,"ì³¥",6,"ì³­ì³®ì³¯ì³±",12,"ã‚¡",85],
["ac41","ì³¾ì³¿ì´€ì´‚",5,"ì´Šì´‹ì´�ì´Žì´�ì´‘",6,"ì´šì´œì´žì´Ÿì´ "],
["ac61","ì´¡ì´¢ì´£ì´¥ì´¦ì´§ì´©ì´ªì´«ì´­",11,"ì´º",4],
["ac81","ì´¿",28,"ìµ�ìµžìµŸÐ�",5,"Ð�Ð–",25],
["acd1","Ð°",5,"Ñ‘Ð¶",25],
["ad41","ìµ¡ìµ¢ìµ£ìµ¥",6,"ìµ®ìµ°ìµ²",5,"ìµ¹",7],
["ad61","ì¶�",6,"ì¶‰",10,"ì¶–ì¶—ì¶™ì¶šì¶›ì¶�ì¶žì¶Ÿ"],
["ad81","ì¶ ì¶¡ì¶¢ì¶£ì¶¦ì¶¨ì¶ª",5,"ì¶±",18,"ì·…"],
["ae41","ì·†",5,"ì·�ì·Žì·�ì·‘",16],
["ae61","ì·¢",5,"ì·©ì·ªì·«ì·­ì·®ì·¯ì·±",6,"ì·ºì·¼ì·¾",4],
["ae81","ì¸ƒì¸…ì¸†ì¸‡ì¸‰ì¸Šì¸‹ì¸�",6,"ì¸•ì¸–ì¸—ì¸˜ì¸š",5,"ì¸¢ì¸£ì¸¥ì¸¦ì¸§ì¸©ì¸ªì¸«"],
["af41","ì¸¬ì¸­ì¸®ì¸¯ì¸²ì¸´ì¸¶",19],
["af61","ì¹Š",13,"ì¹šì¹›ì¹�ì¹žì¹¢",5,"ì¹ªì¹¬"],
["af81","ì¹®",5,"ì¹¶ì¹·ì¹¹ì¹ºì¹»ì¹½",6,"ìº†ìºˆìºŠ",5,"ìº’ìº“ìº•ìº–ìº—ìº™"],
["b041","ìºš",5,"ìº¢ìº¦",5,"ìº®",12],
["b061","ìº»",5,"ì»‚",19],
["b081","ì»–",13,"ì»¦ì»§ì»©ì»ªì»­",6,"ì»¶ì»º",5,"ê°€ê°�ê°„ê°‡ê°ˆê°‰ê°Šê°�",7,"ê°™",4,"ê° ê°¤ê°¬ê°­ê°¯ê°°ê°±ê°¸ê°¹ê°¼ê±€ê±‹ê±�ê±”ê±˜ê±œê±°ê±±ê±´ê±·ê±¸ê±ºê²€ê²�ê²ƒê²„ê²…ê²†ê²‰ê²Šê²‹ê²Œê²�ê²”ê²œê²�ê²Ÿê² ê²¡ê²¨ê²©ê²ªê²¬ê²¯ê²°ê²¸ê²¹ê²»ê²¼ê²½ê³�ê³„ê³ˆê³Œê³•ê³—ê³ ê³¡ê³¤ê³§ê³¨ê³ªê³¬ê³¯ê³°ê³±ê³³ê³µê³¶ê³¼ê³½ê´€ê´„ê´†"],
["b141","ì¼‚ì¼ƒì¼…ì¼†ì¼‡ì¼‰",6,"ì¼’ì¼”ì¼–",5,"ì¼�ì¼žì¼Ÿì¼¡ì¼¢ì¼£"],
["b161","ì¼¥",6,"ì¼®ì¼²",5,"ì¼¹",11],
["b181","ì½…",14,"ì½–ì½—ì½™ì½šì½›ì½�",6,"ì½¦ì½¨ì½ªì½«ì½¬ê´Œê´�ê´�ê´‘ê´˜ê´œê´ ê´©ê´¬ê´­ê´´ê´µê´¸ê´¼êµ„êµ…êµ‡êµ‰êµ�êµ”êµ˜êµ¡êµ£êµ¬êµ­êµ°êµ³êµ´êµµêµ¶êµ»êµ¼êµ½êµ¿ê¶�ê¶‚ê¶ˆê¶‰ê¶Œê¶�ê¶œê¶�ê¶¤ê¶·ê·€ê·�ê·„ê·ˆê·�ê·‘ê·“ê·œê· ê·¤ê·¸ê·¹ê·¼ê·¿ê¸€ê¸�ê¸ˆê¸‰ê¸‹ê¸�ê¸”ê¸°ê¸±ê¸´ê¸·ê¸¸ê¸ºê¹€ê¹�ê¹ƒê¹…ê¹†ê¹Šê¹Œê¹�ê¹Žê¹�ê¹”ê¹–ê¹œê¹�ê¹Ÿê¹ ê¹¡ê¹¥ê¹¨ê¹©ê¹¬ê¹°ê¹¸"],
["b241","ì½­ì½®ì½¯ì½²ì½³ì½µì½¶ì½·ì½¹",6,"ì¾�ì¾‚ì¾ƒì¾„ì¾†",5,"ì¾�"],
["b261","ì¾Ž",18,"ì¾¢",5,"ì¾©"],
["b281","ì¾ª",5,"ì¾±",18,"ì¿…",6,"ê¹¹ê¹»ê¹¼ê¹½êº„êº…êºŒêº¼êº½êº¾ê»€ê»„ê»Œê»�ê»�ê»�ê»‘ê»˜ê»™ê»œê»¨ê»«ê»­ê»´ê»¸ê»¼ê¼‡ê¼ˆê¼�ê¼�ê¼¬ê¼­ê¼°ê¼²ê¼´ê¼¼ê¼½ê¼¿ê½�ê½‚ê½ƒê½ˆê½‰ê½�ê½œê½�ê½¤ê½¥ê½¹ê¾€ê¾„ê¾ˆê¾�ê¾‘ê¾•ê¾œê¾¸ê¾¹ê¾¼ê¿€ê¿‡ê¿ˆê¿‰ê¿‹ê¿�ê¿Žê¿”ê¿œê¿¨ê¿©ê¿°ê¿±ê¿´ê¿¸ë€€ë€�ë€„ë€Œë€�ë€”ë€œë€�ë€¨ë�„ë�…ë�ˆë�Šë�Œë�Žë�“ë�”ë�•ë�—ë�™"],
["b341","ì¿Œ",19,"ì¿¢ì¿£ì¿¥ì¿¦ì¿§ì¿©"],
["b361","ì¿ª",5,"ì¿²ì¿´ì¿¶",5,"ì¿½ì¿¾ì¿¿í€�í€‚í€ƒí€…",5],
["b381","í€‹",5,"í€’",5,"í€™",19,"ë��ë�¼ë�½ë‚€ë‚„ë‚Œë‚�ë‚�ë‚‘ë‚˜ë‚™ë‚šë‚œë‚Ÿë‚ ë‚¡ë‚¢ë‚¨ë‚©ë‚«",4,"ë‚±ë‚³ë‚´ë‚µë‚¸ë‚¼ëƒ„ëƒ…ëƒ‡ëƒˆëƒ‰ëƒ�ëƒ‘ëƒ”ëƒ˜ëƒ ëƒ¥ë„ˆë„‰ë„‹ë„Œë„�ë„’ë„“ë„˜ë„™ë„›ë„œë„�ë„£ë„¤ë„¥ë„¨ë„¬ë„´ë„µë„·ë„¸ë„¹ë…€ë…�ë…„ë…ˆë…�ë…‘ë…”ë…•ë…˜ë…œë… ë…¸ë…¹ë…¼ë†€ë†‚ë†ˆë†‰ë†‹ë†�ë†’ë†“ë†”ë†˜ë†œë†¨ë‡Œë‡�ë‡”ë‡œë‡�"],
["b441","í€®",5,"í€¶í€·í€¹í€ºí€»í€½",6,"í�†í�ˆí�Š",5],
["b461","í�‘í�’í�“í�•í�–í�—í�™",6,"í�¡",10,"í�®í�¯"],
["b481","í�±í�²í�³í�µ",6,"í�¾í�¿í‚€í‚‚",18,"ë‡Ÿë‡¨ë‡©ë‡¬ë‡°ë‡¹ë‡»ë‡½ëˆ„ëˆ…ëˆˆëˆ‹ëˆŒëˆ”ëˆ•ëˆ—ëˆ™ëˆ ëˆ´ëˆ¼ë‰˜ë‰œë‰ ë‰¨ë‰©ë‰´ë‰µë‰¼ëŠ„ëŠ…ëŠ‰ëŠ�ëŠ‘ëŠ”ëŠ˜ëŠ™ëŠšëŠ ëŠ¡ëŠ£ëŠ¥ëŠ¦ëŠªëŠ¬ëŠ°ëŠ´ë‹ˆë‹‰ë‹Œë‹�ë‹’ë‹˜ë‹™ë‹›ë‹�ë‹¢ë‹¤ë‹¥ë‹¦ë‹¨ë‹«",4,"ë‹³ë‹´ë‹µë‹·",4,"ë‹¿ëŒ€ëŒ�ëŒ„ëŒˆëŒ�ëŒ‘ëŒ“ëŒ”ëŒ•ëŒœë�”ë�•ë�–ë�˜ë�›ë�œë�žë�Ÿë�¤ë�¥"],
["b541","í‚•",14,"í‚¦í‚§í‚©í‚ªí‚«í‚­",5],
["b561","í‚³í‚¶í‚¸í‚º",5,"íƒ‚íƒƒíƒ…íƒ†íƒ‡íƒŠ",5,"íƒ’íƒ–",4],
["b581","íƒ›íƒžíƒŸíƒ¡íƒ¢íƒ£íƒ¥",6,"íƒ®íƒ²",5,"íƒ¹",11,"ë�§ë�©ë�«ë�®ë�°ë�±ë�´ë�¸ëŽ€ëŽ�ëŽƒëŽ„ëŽ…ëŽŒëŽ�ëŽ”ëŽ ëŽ¡ëŽ¨ëŽ¬ë�„ë�…ë�ˆë�‹ë�Œë�Žë��ë�”ë�•ë�—ë�™ë�›ë��ë� ë�¤ë�¨ë�¼ë��ë�˜ë�œë� ë�¨ë�©ë�«ë�´ë‘�ë‘‘ë‘”ë‘˜ë‘ ë‘¡ë‘£ë‘¥ë‘¬ë’€ë’ˆë’�ë’¤ë’¨ë’¬ë’µë’·ë’¹ë“€ë“„ë“ˆë“�ë“•ë“œë“�ë“ ë“£ë“¤ë“¦ë“¬ë“­ë“¯ë“±ë“¸ë””ë”•ë”˜ë”›ë”œë”¤ë”¥ë”§ë”¨ë”©ë”ªë”°ë”±ë”´ë”¸"],
["b641","í„…",7,"í„Ž",17],
["b661","í„ ",15,"í„²í„³í„µí„¶í„·í„¹í„»í„¼í„½í„¾"],
["b681","í„¿í…‚í…†",5,"í…Ží…�í…‘í…’í…“í…•",6,"í…ží… í…¢",5,"í…©í…ªí…«í…­ë•€ë•�ë•ƒë•„ë•…ë•‹ë•Œë•�ë•�ë•”ë•œë•�ë•Ÿë• ë•¡ë– ë–¡ë–¤ë–¨ë–ªë–«ë–°ë–±ë–³ë–´ë–µë–»ë–¼ë–½ë—€ë—„ë—Œë—�ë—�ë—�ë—‘ë—˜ë—¬ë˜�ë˜‘ë˜”ë˜˜ë˜¥ë˜¬ë˜´ë™ˆë™¤ë™¨ëšœëš�ëš ëš¤ëš«ëš¬ëš±ë›”ë›°ë›´ë›¸ëœ€ëœ�ëœ…ëœ¨ëœ©ëœ¬ëœ¯ëœ°ëœ¸ëœ¹ëœ»ë�„ë�ˆë�Œë�”ë�•ë� ë�¤ë�¨ë�°ë�±ë�³ë�µë�¼ë�½ëž€ëž„ëžŒëž�ëž�ëž�ëž‘ëž’ëž–ëž—"],
["b741","í…®",13,"í…½",6,"í†…í††í†‡í†‰í†Š"],
["b761","í†‹",20,"í†¢í†£í†¥í†¦í†§"],
["b781","í†©",6,"í†²í†´í†¶í†·í†¸í†¹í†»í†½í†¾í†¿í‡�",14,"ëž˜ëž™ëžœëž ëž¨ëž©ëž«ëž¬ëž­ëž´ëžµëž¸ëŸ‡ëŸ‰ëŸ¬ëŸ­ëŸ°ëŸ´ëŸ¼ëŸ½ëŸ¿ë €ë �ë ‡ë ˆë ‰ë Œë �ë ˜ë ™ë ›ë �ë ¤ë ¥ë ¨ë ¬ë ´ë µë ·ë ¸ë ¹ë¡€ë¡„ë¡‘ë¡“ë¡œë¡�ë¡ ë¡¤ë¡¬ë¡­ë¡¯ë¡±ë¡¸ë¡¼ë¢�ë¢¨ë¢°ë¢´ë¢¸ë£€ë£�ë£ƒë£…ë£Œë£�ë£”ë£�ë£Ÿë£¡ë£¨ë£©ë£¬ë£°ë£¸ë£¹ë£»ë£½ë¤„ë¤˜ë¤ ë¤¼ë¤½ë¥€ë¥„ë¥Œë¥�ë¥‘ë¥˜ë¥™ë¥œë¥ ë¥¨ë¥©"],
["b841","í‡�",7,"í‡™",17],
["b861","í‡«",8,"í‡µí‡¶í‡·í‡¹",13],
["b881","íˆˆíˆŠ",5,"íˆ‘",24,"ë¥«ë¥­ë¥´ë¥µë¥¸ë¥¼ë¦„ë¦…ë¦‡ë¦‰ë¦Šë¦�ë¦Žë¦¬ë¦­ë¦°ë¦´ë¦¼ë¦½ë¦¿ë§�ë§ˆë§‰ë§Œë§Ž",4,"ë§˜ë§™ë§›ë§�ë§žë§¡ë§£ë§¤ë§¥ë§¨ë§¬ë§´ë§µë§·ë§¸ë§¹ë§ºë¨€ë¨�ë¨ˆë¨•ë¨¸ë¨¹ë¨¼ë©€ë©‚ë©ˆë©‰ë©‹ë©�ë©Žë©“ë©”ë©•ë©˜ë©œë©¤ë©¥ë©§ë©¨ë©©ë©°ë©±ë©´ë©¸ëªƒëª„ëª…ëª‡ëªŒëª¨ëª©ëª«ëª¬ëª°ëª²ëª¸ëª¹ëª»ëª½ë«„ë«ˆë«˜ë«™ë«¼"],
["b941","íˆªíˆ«íˆ®íˆ¯íˆ±íˆ²íˆ³íˆµ",6,"íˆ¾í‰€í‰‚",5,"í‰‰í‰Ší‰‹í‰Œ"],
["b961","í‰�",14,"í‰�",6,"í‰¥í‰¦í‰§í‰¨"],
["b981","í‰©",22,"íŠ‚íŠƒíŠ…íŠ†íŠ‡íŠ‰íŠŠíŠ‹íŠŒë¬€ë¬„ë¬�ë¬�ë¬‘ë¬˜ë¬œë¬ ë¬©ë¬«ë¬´ë¬µë¬¶ë¬¸ë¬»ë¬¼ë¬½ë¬¾ë­„ë­…ë­‡ë­‰ë­�ë­�ë­�ë­”ë­˜ë­¡ë­£ë­¬ë®ˆë®Œë®�ë®¤ë®¨ë®¬ë®´ë®·ë¯€ë¯„ë¯ˆë¯�ë¯“ë¯¸ë¯¹ë¯¼ë¯¿ë°€ë°‚ë°ˆë°‰ë°‹ë°Œë°�ë°�ë°‘ë°”",4,"ë°›",4,"ë°¤ë°¥ë°§ë°©ë°­ë°°ë°±ë°´ë°¸ë±€ë±�ë±ƒë±„ë±…ë±‰ë±Œë±�ë±�ë±�ë²„ë²…ë²ˆë²‹ë²Œë²Žë²”ë²•ë²—"],
["ba41","íŠ�íŠŽíŠ�íŠ’íŠ“íŠ”íŠ–",5,"íŠ�íŠžíŠŸíŠ¡íŠ¢íŠ£íŠ¥",6,"íŠ­"],
["ba61","íŠ®íŠ¯íŠ°íŠ²",5,"íŠºíŠ»íŠ½íŠ¾í‹�í‹ƒ",4,"í‹Ší‹Œ",5],
["ba81","í‹’í‹“í‹•í‹–í‹—í‹™í‹ší‹›í‹�",6,"í‹¦",9,"í‹²í‹³í‹µí‹¶í‹·í‹¹í‹ºë²™ë²šë² ë²¡ë²¤ë²§ë²¨ë²°ë²±ë²³ë²´ë²µë²¼ë²½ë³€ë³„ë³�ë³�ë³�ë³‘ë³•ë³˜ë³œë³´ë³µë³¶ë³¸ë³¼ë´„ë´…ë´‡ë´‰ë´�ë´”ë´¤ë´¬ëµ€ëµˆëµ‰ëµŒëµ�ëµ˜ëµ™ëµ¤ëµ¨ë¶€ë¶�ë¶„ë¶‡ë¶ˆë¶‰ë¶Šë¶�ë¶‘ë¶“ë¶•ë¶™ë¶šë¶œë¶¤ë¶°ë¶¸ë·”ë·•ë·˜ë·œë·©ë·°ë·´ë·¸ë¸€ë¸ƒë¸…ë¸Œë¸�ë¸�ë¸”ë¸œë¸�ë¸Ÿë¹„ë¹…ë¹ˆë¹Œë¹Žë¹”ë¹•ë¹—ë¹™ë¹šë¹›ë¹ ë¹¡ë¹¤"],
["bb41","í‹»",4,"íŒ‚íŒ„íŒ†",5,"íŒ�íŒ‘íŒ’íŒ“íŒ•íŒ—",4,"íŒžíŒ¢íŒ£"],
["bb61","íŒ¤íŒ¦íŒ§íŒªíŒ«íŒ­íŒ®íŒ¯íŒ±",6,"íŒºíŒ¾",5,"í�†í�‡í�ˆí�‰"],
["bb81","í�Š",31,"ë¹¨ë¹ªë¹°ë¹±ë¹³ë¹´ë¹µë¹»ë¹¼ë¹½ëº€ëº„ëºŒëº�ëº�ëº�ëº‘ëº˜ëº™ëº¨ë»�ë»‘ë»”ë»—ë»˜ë» ë»£ë»¤ë»¥ë»¬ë¼�ë¼ˆë¼‰ë¼˜ë¼™ë¼›ë¼œë¼�ë½€ë½�ë½„ë½ˆë½�ë½‘ë½•ë¾”ë¾°ë¿…ë¿Œë¿�ë¿�ë¿”ë¿œë¿Ÿë¿¡ì€¼ì�‘ì�˜ì�œì� ì�¨ì�©ì‚�ì‚‘ì‚”ì‚˜ì‚ ì‚¡ì‚£ì‚¥ì‚¬ì‚­ì‚¯ì‚°ì‚³ì‚´ì‚µì‚¶ì‚¼ì‚½ì‚¿ìƒ€ìƒ�ìƒ…ìƒˆìƒ‰ìƒŒìƒ�ìƒ˜ìƒ™ìƒ›ìƒœìƒ�ìƒ¤"],
["bc41","í�ª",17,"í�¾í�¿íŽ�íŽ‚íŽƒíŽ…íŽ†íŽ‡"],
["bc61","íŽˆíŽ‰íŽŠíŽ‹íŽŽíŽ’",5,"íŽšíŽ›íŽ�íŽžíŽŸíŽ¡",6,"íŽªíŽ¬íŽ®"],
["bc81","íŽ¯",4,"íŽµíŽ¶íŽ·íŽ¹íŽºíŽ»íŽ½",6,"í�†í�‡í�Š",5,"í�‘",5,"ìƒ¥ìƒ¨ìƒ¬ìƒ´ìƒµìƒ·ìƒ¹ì„€ì„„ì„ˆì„�ì„•ì„œ",4,"ì„£ì„¤ì„¦ì„§ì„¬ì„­ì„¯ì„°ì„±ì„¶ì„¸ì„¹ì„¼ì…€ì…ˆì…‰ì…‹ì…Œì…�ì…”ì…•ì…˜ì…œì…¤ì…¥ì…§ì…¨ì…©ì…°ì…´ì…¸ì†…ì†Œì†�ì†Žì†�ì†”ì†–ì†œì†�ì†Ÿì†¡ì†¥ì†¨ì†©ì†¬ì†°ì†½ì‡„ì‡ˆì‡Œì‡”ì‡—ì‡˜ì‡ ì‡¤ì‡¨ì‡°ì‡±ì‡³ì‡¼ì‡½ìˆ€ìˆ„ìˆŒìˆ�ìˆ�ìˆ‘ìˆ˜ìˆ™ìˆœìˆŸìˆ ìˆ¨ìˆ©ìˆ«ìˆ­"],
["bd41","í�—í�™",7,"í�¢í�¤",7,"í�®í�¯í�±í�²í�³í�µí�¶í�·"],
["bd61","í�¸í�¹í�ºí�»í�¾í�€í�‚",5,"í�‰",13],
["bd81","í�—",5,"í�ž",25,"ìˆ¯ìˆ±ìˆ²ìˆ´ì‰ˆì‰�ì‰‘ì‰”ì‰˜ì‰ ì‰¥ì‰¬ì‰­ì‰°ì‰´ì‰¼ì‰½ì‰¿ìŠ�ìŠˆìŠ‰ìŠ�ìŠ˜ìŠ›ìŠ�ìŠ¤ìŠ¥ìŠ¨ìŠ¬ìŠ­ìŠ´ìŠµìŠ·ìŠ¹ì‹œì‹�ì‹ ì‹£ì‹¤ì‹«ì‹¬ì‹­ì‹¯ì‹±ì‹¶ì‹¸ì‹¹ì‹»ì‹¼ìŒ€ìŒˆìŒ‰ìŒŒìŒ�ìŒ“ìŒ”ìŒ•ìŒ˜ìŒœìŒ¤ìŒ¥ìŒ¨ìŒ©ì�…ì�¨ì�©ì�¬ì�°ì�²ì�¸ì�¹ì�¼ì�½ìŽ„ìŽˆìŽŒì�€ì�˜ì�™ì�œì�Ÿì� ì�¢ì�¨ì�©ì�­ì�´ì�µì�¸ì�ˆì��ì�¤ì�¬ì�°"],
["be41","í�¸",7,"í‘�í‘‚í‘ƒí‘…",14],
["be61","í‘”",7,"í‘�í‘ží‘Ÿí‘¡í‘¢í‘£í‘¥",7,"í‘®í‘°í‘±í‘²"],
["be81","í‘³",4,"í‘ºí‘»í‘½í‘¾í’�í’ƒ",4,"í’Ší’Œí’Ž",5,"í’•",8,"ì�´ì�¼ì�½ì‘ˆì‘¤ì‘¥ì‘¨ì‘¬ì‘´ì‘µì‘¹ì’€ì’”ì’œì’¸ì’¼ì“©ì“°ì“±ì“´ì“¸ì“ºì“¿ì”€ì”�ì”Œì”�ì””ì”œì”¨ì”©ì”¬ì”°ì”¸ì”¹ì”»ì”½ì•„ì•…ì•ˆì•‰ì•Šì•Œì•�ì•Žì•“ì•”ì••ì•—ì•˜ì•™ì•�ì•žì• ì•¡ì•¤ì•¨ì•°ì•±ì•³ì•´ì•µì•¼ì•½ì–€ì–„ì–‡ì–Œì–�ì–�ì–‘ì–•ì–—ì–˜ì–œì– ì–©ì–´ì–µì–¸ì–¹ì–»ì–¼ì–½ì–¾ì—„",6,"ì—Œì—Ž"],
["bf41","í’ž",10,"í’ª",14],
["bf61","í’¹",18,"í“�í“Ží“�í“‘í“’í““í“•"],
["bf81","í“–",5,"í“�í“ží“ ",7,"í“©í“ªí“«í“­í“®í“¯í“±",6,"í“¹í“ºí“¼ì—�ì—‘ì—”ì—˜ì— ì—¡ì—£ì—¥ì—¬ì—­ì—®ì—°ì—´ì—¶ì—·ì—¼",5,"ì˜…ì˜†ì˜‡ì˜ˆì˜Œì˜�ì˜˜ì˜™ì˜›ì˜œì˜¤ì˜¥ì˜¨ì˜¬ì˜­ì˜®ì˜°ì˜³ì˜´ì˜µì˜·ì˜¹ì˜»ì™€ì™�ì™„ì™ˆì™�ì™‘ì™“ì™”ì™•ì™œì™�ì™ ì™¬ì™¯ì™±ì™¸ì™¹ì™¼ìš€ìšˆìš‰ìš‹ìš�ìš”ìš•ìš˜ìšœìš¤ìš¥ìš§ìš©ìš°ìš±ìš´ìš¸ìš¹ìšºì›€ì›�ì›ƒì›…ì›Œì›�ì›�ì›”ì›œì›�ì› ì›¡ì›¨"],
["c041","í“¾",5,"í”…í”†í”‡í”‰í”Ší”‹í”�",6,"í”–í”˜",5],
["c061","í”ž",25],
["c081","í”¸í”¹í”ºí”»í”¾í”¿í•�í•‚í•ƒí•…",6,"í•Ží•�í•’",5,"í•ší•›í•�í•ží•Ÿí•¡í•¢í•£ì›©ì›¬ì›°ì›¸ì›¹ì›½ìœ„ìœ…ìœˆìœŒìœ”ìœ•ìœ—ìœ™ìœ ìœ¡ìœ¤ìœ¨ìœ°ìœ±ìœ³ìœµìœ·ìœ¼ìœ½ì�€ì�„ì�Šì�Œì��ì��ì�‘",7,"ì�œì� ì�¨ì�«ì�´ì�µì�¸ì�¼ì�½ì�¾ìžƒìž„ìž…ìž‡ìžˆìž‰ìžŠìžŽìž�ìž‘ìž”ìž–ìž—ìž˜ìžšìž ìž¡ìž£ìž¤ìž¥ìž¦ìž¬ìž­ìž°ìž´ìž¼ìž½ìž¿ìŸ€ìŸ�ìŸˆìŸ‰ìŸŒìŸŽìŸ�ìŸ˜ìŸ�ìŸ¤ìŸ¨ìŸ¬ì €ì �ì „ì ˆì Š"],
["c141","í•¤í•¦í•§í•ªí•¬í•®",5,"í•¶í•·í•¹í•ºí•»í•½",6,"í–†í–Ší–‹"],
["c161","í–Œí–�í–Ží–�í–‘",19,"í–¦í–§"],
["c181","í–¨",31,"ì �ì ‘ì “ì •ì –ì œì �ì  ì ¤ì ¬ì ­ì ¯ì ±ì ¸ì ¼ì¡€ì¡ˆì¡‰ì¡Œì¡�ì¡”ì¡°ì¡±ì¡´ì¡¸ì¡ºì¢€ì¢�ì¢ƒì¢…ì¢†ì¢‡ì¢‹ì¢Œì¢�ì¢”ì¢�ì¢Ÿì¢¡ì¢¨ì¢¼ì¢½ì£„ì£ˆì£Œì£”ì£•ì£—ì£™ì£ ì£¡ì£¤ì£µì£¼ì£½ì¤€ì¤„ì¤…ì¤†ì¤Œì¤�ì¤�ì¤‘ì¤˜ì¤¬ì¤´ì¥�ì¥‘ì¥”ì¥˜ì¥ ì¥¡ì¥£ì¥¬ì¥°ì¥´ì¥¼ì¦ˆì¦‰ì¦Œì¦�ì¦˜ì¦™ì¦›ì¦�ì§€ì§�ì§„ì§‡ì§ˆì§Šì§�ì§‘ì§“"],
["c241","í—Ší—‹í—�í—Ží—�í—‘í—“",4,"í—ší—œí—ž",5,"í—¦í—§í—©í—ªí—«í—­í—®"],
["c261","í—¯",4,"í—¶í—¸í—º",5,"í˜‚í˜ƒí˜…í˜†í˜‡í˜‰",6,"í˜’"],
["c281","í˜–",5,"í˜�í˜ží˜Ÿí˜¡í˜¢í˜£í˜¥",7,"í˜®",9,"í˜ºí˜»ì§•ì§–ì§™ì§šì§œì§�ì§ ì§¢ì§¤ì§§ì§¬ì§­ì§¯ì§°ì§±ì§¸ì§¹ì§¼ì¨€ì¨ˆì¨‰ì¨‹ì¨Œì¨�ì¨”ì¨˜ì¨©ì©Œì©�ì©�ì©”ì©œì©�ì©Ÿì© ì©¡ì©¨ì©½ìª„ìª˜ìª¼ìª½ì«€ì«„ì«Œì«�ì«�ì«‘ì«“ì«˜ì«™ì« ì«¬ì«´ì¬ˆì¬�ì¬”ì¬˜ì¬ ì¬¡ì­�ì­ˆì­‰ì­Œì­�ì­˜ì­™ì­�ì­¤ì­¸ì­¹ì®œì®¸ì¯”ì¯¤ì¯§ì¯©ì°Œì°�ì°�ì°”ì°œì°�ì°¡ì°¢ì°§ì°¨ì°©ì°¬ì°®ì°°ì°¸ì°¹ì°»"],
["c341","í˜½í˜¾í˜¿í™�í™‚í™ƒí™„í™†í™‡í™Ší™Œí™Ží™�í™�í™’í™“í™–í™—í™™í™ší™›í™�",4],
["c361","í™¢",4,"í™¨í™ª",5,"í™²í™³í™µ",11],
["c381","íš�íš‚íš„íš†",5,"íšŽíš�íš‘íš’íš“íš•",7,"íšžíš íš¢",5,"íš©íšªì°¼ì°½ì°¾ì±„ì±…ì±ˆì±Œì±”ì±•ì±—ì±˜ì±™ì± ì±¤ì±¦ì±¨ì±°ì±µì²˜ì²™ì²œì² ì²¨ì²©ì²«ì²¬ì²­ì²´ì²µì²¸ì²¼ì³„ì³…ì³‡ì³‰ì³�ì³”ì³¤ì³¬ì³°ì´�ì´ˆì´‰ì´Œì´�ì´˜ì´™ì´›ì´�ì´¤ì´¨ì´¬ì´¹ìµœìµ ìµ¤ìµ¬ìµ­ìµ¯ìµ±ìµ¸ì¶ˆì¶”ì¶•ì¶˜ì¶œì¶¤ì¶¥ì¶§ì¶©ì¶°ì·„ì·Œì·�ì·¨ì·¬ì·°ì·¸ì·¹ì·»ì·½ì¸„ì¸ˆì¸Œì¸”ì¸™ì¸ ì¸¡ì¸¤ì¸¨ì¸°ì¸±ì¸³ì¸µ"],
["c441","íš«íš­íš®íš¯íš±",7,"íšºíš¼",7,"í›†í›‡í›‰í›Ší›‹"],
["c461","í›�í›Ží›�í›�í›’í›“í›•í›–í›˜í›š",5,"í›¡í›¢í›£í›¥í›¦í›§í›©",4],
["c481","í›®í›¯í›±í›²í›³í›´í›¶",5,"í›¾í›¿íœ�íœ‚íœƒíœ…",11,"íœ’íœ“íœ”ì¹˜ì¹™ì¹œì¹Ÿì¹ ì¹¡ì¹¨ì¹©ì¹«ì¹­ì¹´ì¹µì¹¸ì¹¼ìº„ìº…ìº‡ìº‰ìº�ìº‘ìº”ìº˜ìº ìº¡ìº£ìº¤ìº¥ìº¬ìº­ì»�ì»¤ì»¥ì»¨ì»«ì»¬ì»´ì»µì»·ì»¸ì»¹ì¼€ì¼�ì¼„ì¼ˆì¼�ì¼‘ì¼“ì¼•ì¼œì¼ ì¼¤ì¼¬ì¼­ì¼¯ì¼°ì¼±ì¼¸ì½”ì½•ì½˜ì½œì½¤ì½¥ì½§ì½©ì½°ì½±ì½´ì½¸ì¾€ì¾…ì¾Œì¾¡ì¾¨ì¾°ì¿„ì¿ ì¿¡ì¿¤ì¿¨ì¿°ì¿±ì¿³ì¿µì¿¼í€€í€„í€‘í€˜í€­í€´í€µí€¸í€¼"],
["c541","íœ•íœ–íœ—íœšíœ›íœ�íœžíœŸíœ¡",6,"íœªíœ¬íœ®",5,"íœ¶íœ·íœ¹"],
["c561","íœºíœ»íœ½",6,"í�…í�†í�ˆí�Š",5,"í�’í�“í�•í�š",4],
["c581","í�Ÿí�¢í�¤í�¦í�§í�¨í�ªí�«í�­í�®í�¯í�±í�²í�³í�µ",6,"í�¾í�¿íž€íž‚",5,"ížŠíž‹í�„í�…í�‡í�‰í��í�”í�˜í� í�¬í�­í�°í�´í�¼í�½í‚�í‚¤í‚¥í‚¨í‚¬í‚´í‚µí‚·í‚¹íƒ€íƒ�íƒ„íƒˆíƒ‰íƒ�íƒ‘íƒ“íƒ”íƒ•íƒœíƒ�íƒ íƒ¤íƒ¬íƒ­íƒ¯íƒ°íƒ±íƒ¸í„�í„°í„±í„´í„¸í„ºí…€í…�í…ƒí…„í……í…Œí…�í…�í…”í…œí…�í…Ÿí…¡í…¨í…¬í…¼í†„í†ˆí† í†¡í†¤í†¨í†°í†±í†³í†µí†ºí†¼í‡€í‡˜í‡´í‡¸íˆ‡íˆ‰íˆ�íˆ¬íˆ­íˆ°íˆ´íˆ¼íˆ½íˆ¿í‰�í‰ˆí‰œ"],
["c641","íž�ížŽíž�íž‘",6,"ížšížœížž",5],
["c6a1","í‰¤íŠ€íŠ�íŠ„íŠˆíŠ�íŠ‘íŠ•íŠœíŠ íŠ¤íŠ¬íŠ±íŠ¸íŠ¹íŠ¼íŠ¿í‹€í‹‚í‹ˆí‹‰í‹‹í‹”í‹˜í‹œí‹¤í‹¥í‹°í‹±í‹´í‹¸íŒ€íŒ�íŒƒíŒ…íŒŒíŒ�íŒŽíŒ�íŒ”íŒ–íŒœíŒ�íŒŸíŒ íŒ¡íŒ¥íŒ¨íŒ©íŒ¬íŒ°íŒ¸íŒ¹íŒ»íŒ¼íŒ½í�„í�…í�¼í�½íŽ€íŽ„íŽŒíŽ�íŽ�íŽ�íŽ‘íŽ˜íŽ™íŽœíŽ íŽ¨íŽ©íŽ«íŽ­íŽ´íŽ¸íŽ¼í�„í�…í�ˆí�‰í��í�˜í�¡í�£í�¬í�­í�°í�´í�¼í�½í�¿í��"],
["c7a1","í�ˆí��í‘€í‘„í‘œí‘ í‘¤í‘­í‘¯í‘¸í‘¹í‘¼í‘¿í’€í’‚í’ˆí’‰í’‹í’�í’”í’©í“Œí“�í“”í“œí“Ÿí“¨í“¬í“°í“¸í“»í“½í”„í”ˆí”Œí””í”•í”—í”¼í”½í•€í•„í•Œí•�í•�í•‘í•˜í•™í•œí• í•¥í•¨í•©í•«í•­í•´í•µí•¸í•¼í–„í–…í–‡í–ˆí–‰í–�í–¥í—ˆí—‰í—Œí—�í—’í—˜í—™í—›í—�í—¤í—¥í—¨í—¬í—´í—µí—·í—¹í˜€í˜�í˜„í˜ˆí˜�í˜‘í˜“í˜”í˜•í˜œí˜ "],
["c8a1","í˜¤í˜­í˜¸í˜¹í˜¼í™€í™…í™ˆí™‰í™‹í™�í™‘í™”í™•í™˜í™œí™§í™©í™°í™±í™´íšƒíš…íšŒíš�íš�íš”íš�íšŸíš¡íš¨íš¬íš°íš¹íš»í›„í›…í›ˆí›Œí›‘í›”í›—í›™í› í›¤í›¨í›°í›µí›¼í›½íœ€íœ„íœ‘íœ˜íœ™íœœíœ íœ¨íœ©íœ«íœ­íœ´íœµíœ¸íœ¼í�„í�‡í�‰í��í�‘í�”í�–í�—í�˜í�™í� í�¡í�£í�¥í�©í�¬í�°í�´í�¼í�½íž�ížˆíž‰ížŒíž�íž˜íž™íž›íž�"],
["caa1","ä¼½ä½³å�‡åƒ¹åŠ å�¯å‘µå“¥å˜‰å«�å®¶æš‡æž¶æž·æŸ¯æ­Œç�‚ç—‚ç¨¼è‹›èŒ„è¡—è¢ˆè¨¶è³ˆè·�è»»è¿¦é§•åˆ»å�´å�„æ�ªæ…¤æ®¼ç��è„šè¦ºè§’é–£ä¾ƒåˆŠå¢¾å¥¸å§¦å¹²å¹¹æ‡‡æ�€æ�†æŸ¬æ¡¿æ¾—ç™Žçœ‹ç£µç¨ˆç«¿ç°¡è‚�è‰®è‰±è««é–“ä¹«å–�æ›·æ¸´ç¢£ç«­è‘›è¤�è�Žéž¨å‹˜å�Žå ªåµŒæ„Ÿæ†¾æˆ¡æ•¢æŸ‘æ©„æ¸›ç”˜ç–³ç›£çž°ç´ºé‚¯é‘‘é‘’é¾•"],
["cba1","åŒ£å²¬ç”²èƒ›é‰€é–˜å‰›å ˆå§œå²¡å´—åº·å¼ºå½Šæ…·æ±Ÿç•ºç–†ç³ çµ³ç¶±ç¾Œè…”èˆ¡è–‘è¥�è¬›é‹¼é™�é±‡ä»‹ä»·å€‹å‡±å¡�æ„·æ„¾æ…¨æ”¹æ§ªæ¼‘ç–¥çš†ç›–ç®‡èŠ¥è“‹ï¤€éŽ§é–‹å–€å®¢å�‘ï¤�ç²³ç¾¹é†µå€¨åŽ»å±…å·¨æ‹’æ�®æ“šæ“§æ¸ ç‚¬ç¥›è·�è¸žï¤‚é�½é‰…é‹¸ä¹¾ä»¶å�¥å·¾å»ºæ„†æ¥—è…±è™”è¹‡é�µé¨«ä¹žå‚‘æ�°æ¡€å„‰åŠ�åŠ’æª¢"],
["cca1","çž¼éˆ�é»”åŠ«æ€¯è¿²å�ˆæ†©æ�­æ“Šæ ¼æª„æ¿€è†ˆè¦¡éš”å …ç‰½çŠ¬ç”„çµ¹ç¹­è‚©è¦‹è­´é�£éµ‘æŠ‰æ±ºæ½”çµ�ç¼ºè¨£å…¼æ…Šç®�è¬™é‰—éŽŒäº¬ä¿“å€žå‚¾å„†å‹�å‹�å�¿å�°å¢ƒåºšå¾‘æ…¶æ†¬æ“Žæ•¬æ™¯æš»æ›´æ¢—æ¶‡ç‚…çƒ±ç’Ÿç’¥ç“Šç—™ç¡¬ç£¬ç«Ÿç«¶çµ…ç¶“è€•è€¿è„›èŽ–è­¦è¼•é€•é�¡é ƒé ¸é©šé¯¨ä¿‚å•“å ºå¥‘å­£å±†æ‚¸æˆ’æ¡‚æ¢°"],
["cda1","æ£¨æºªç•Œç™¸ç£Žç¨½ç³»ç¹«ç¹¼è¨ˆèª¡è°¿éšŽé·„å�¤å�©å‘Šå‘±å›ºå§‘å­¤å°»åº«æ‹·æ”·æ•…æ•²æš æž¯æ§�æ²½ç—¼çš�ç�¾ç¨¿ç¾”è€ƒè‚¡è†�è‹¦è‹½è�°è—�è ±è¢´èª¥ï¤ƒè¾œéŒ®é›‡é¡§é«˜é¼“å“­æ–›æ›²æ¢�ç©€è°·éµ å›°å�¤å´‘æ˜†æ¢±æ£�æ»¾ç�¨è¢žé¯¤æ±¨ï¤„éª¨ä¾›å…¬å…±åŠŸå­”å·¥æ��æ�­æ‹±æŽ§æ”»ç�™ç©ºèš£è²¢éž�ä¸²å¯¡æˆˆæžœç“œ"],
["cea1","ç§‘è�“èª‡èª²è·¨é�Žé�‹é¡†å»“æ§¨è—¿éƒ­ï¤…å† å®˜å¯¬æ…£æ£ºæ¬¾ç�Œç�¯ç“˜ç®¡ç½�è�…è§€è²«é—œé¤¨åˆ®æ��æ‹¬é€‚ä¾Šå…‰åŒ¡å£™å»£æ› æ´¸ç‚šç‹‚ç�–ç­�èƒ±é‘›å�¦æŽ›ç½«ä¹–å‚€å¡Šå£žæ€ªæ„§æ‹�æ§�é­�å®�ç´˜è‚±è½Ÿäº¤åƒ‘å’¬å–¬å¬Œå¶ å·§æ”ªæ•Žæ ¡æ©‹ç‹¡çšŽçŸ¯çµžç¿¹è† è•Žè›Ÿè¼ƒè½ŽéƒŠé¤ƒé©•é®«ä¸˜ä¹…ä¹�ä»‡ä¿±å…·å‹¾"],
["cfa1","å�€å�£å�¥å’Žå˜”å�µåž¢å¯‡å¶‡å»�æ‡¼æ‹˜æ•‘æž¸æŸ©æ§‹æ­�æ¯†æ¯¬æ±‚æº�ç�¸ç‹—çŽ–ç�ƒçž¿çŸ©ç©¶çµ¿è€‰è‡¼èˆ…èˆŠè‹Ÿè¡¢è¬³è³¼è»€é€‘é‚±é‰¤éŠ¶é§’é©…é³©é·—é¾œåœ‹å±€è�Šéž éž«éº´å�›çª˜ç¾¤è£™è»�éƒ¡å €å±ˆæŽ˜çªŸå®®å¼“ç©¹çª®èŠŽèº¬å€¦åˆ¸å‹¸å�·åœˆæ‹³æ�²æ¬Šæ·ƒçœ·åŽ¥ç�—è•¨è¹¶é—•æœºæ«ƒæ½°è©­è»Œé¥‹ï¤†æ™·æ­¸è²´"],
["d0a1","é¬¼ï¤‡å�«åœ­å¥Žæ�†æ§»ç�ªç¡…çªºç«…ç³¾è‘µè¦�èµ³é€µé–¨å‹»å�‡ç•‡ç­ è�Œéˆžï¤ˆæ©˜å…‹å‰‹åŠ‡æˆŸæ£˜æ¥µéš™åƒ…åŠ¤å‹¤æ‡ƒæ–¤æ ¹æ§¿ç‘¾ç­‹èŠ¹è�«è¦²è¬¹è¿‘é¥‰ï¤‰ä»Šå¦—æ“’æ˜‘æªŽç�´ç¦�ç¦½èŠ©è¡¾è¡¿è¥Ÿï¤ŠéŒ¦ä¼‹å�Šæ€¥æ‰±æ±²ç´šçµ¦äº˜å…¢çŸœè‚¯ä¼�ä¼Žå…¶å†€å—œå™¨åœ»åŸºåŸ¼å¤”å¥‡å¦“å¯„å²�å´Žå·±å¹¾å¿ŒæŠ€æ——æ—£"],
["d1a1","æœžæœŸæ�žæ£‹æ£„æ©Ÿæ¬ºæ°£æ±½æ²‚æ·‡çŽ˜ç�¦ç�ªç’‚ç’£ç•¸ç•¿ç¢�ç£¯ç¥�ç¥‡ç¥ˆç¥ºç®•ç´€ç¶ºç¾ˆè€†è€­è‚Œè¨˜è­�è±ˆèµ·éŒ¡éŒ¤é£¢é¥‘é¨Žé¨�é©¥éº’ç·Šä½¶å�‰æ‹®æ¡”é‡‘å–«å„ºï¤‹ï¤Œå¨œæ‡¦ï¤�æ‹�æ‹¿ï¤Ž",5,"é‚£ï¤”",4,"è«¾ï¤™ï¤šï¤›ï¤œæš–ï¤�ç…–ï¤žï¤Ÿé›£ï¤ æ��æ�ºå�—ï¤¡æž�æ¥ æ¹³ï¤¢ç”·ï¤£ï¤¤ï¤¥"],
["d2a1","ç´�ï¤¦ï¤§è¡²å›Šå¨˜ï¤¨",4,"ä¹ƒï¤­å…§å¥ˆæŸ°è€�ï¤®å¥³å¹´æ’šç§Šå¿µæ�¬æ‹ˆæ�»å¯§å¯—åŠªï¤¯å¥´å¼©æ€’ï¤°ï¤±ï¤²ç‘™ï¤³",5,"é§‘ï¤¹",10,"æ¿ƒï¥„ï¥…è†¿è¾²æƒ±ï¥†ï¥‡è…¦ï¥ˆï¥‰å°¿ï¥Š",7,"å«©è¨¥æ�»ç´�ï¥’",5,"èƒ½ï¥˜ï¥™å°¼æ³¥åŒ¿æººå¤šèŒ¶"],
["d3a1","ä¸¹äº¶ä½†å–®åœ˜å£‡å½–æ–·æ—¦æª€æ®µæ¹�çŸ­ç«¯ç°žç·žè›‹è¢’é„²é�›æ’»æ¾¾ç�ºç–¸é�”å•–å��æ†ºæ“”æ›‡æ·¡æ¹›æ½­æ¾¹ç—°è�ƒè†½è•�è¦ƒè«‡è­šéŒŸæ²“ç•“ç­”è¸�é��å”�å ‚å¡˜å¹¢æˆ‡æ’žæ£ ç•¶ç³–èž³é»¨ä»£åžˆå�®å¤§å°�å²±å¸¶å¾…æˆ´æ“¡çŽ³è‡ºè¢‹è²¸éšŠé»›å®…å¾·æ‚³å€’åˆ€åˆ°åœ–å µå¡—å°Žå± å³¶å¶‹åº¦å¾’æ‚¼æŒ‘æŽ‰æ�—æ¡ƒ"],
["d4a1","æ£¹æ«‚æ·˜æ¸¡æ»”æ¿¤ç‡¾ç›œç�¹ç¦±ç¨»è�„è¦©è³­è·³è¹ˆé€ƒé€”é�“éƒ½é��é™¶éŸœæ¯’ç€†ç‰˜çŠ¢ç�¨ç�£ç¦¿ç¯¤çº›è®€å¢©æƒ‡æ•¦æ—½æš¾æ²Œç„žç‡‰è±šé “ä¹­çª�ä»�å†¬å‡�å‹•å�Œæ†§æ�±æ¡�æ£Ÿæ´žæ½¼ç–¼çž³ç«¥èƒ´è‘£éŠ…å…œæ–—æ�œæž“ç—˜ç«‡è�³ï¥šè±†é€—é ­å±¯è‡€èŠšé��é�¯éˆ�å¾—å¶�æ©™ç‡ˆç™»ç­‰è—¤è¬„é„§é¨°å–‡æ‡¶ï¥›ç™©ç¾…"],
["d5a1","è˜¿èžºè£¸é‚�ï¥œæ´›çƒ™ç�žçµ¡è�½ï¥�é…ªé§±ï¥žäº‚å�µæ¬„æ¬’ç€¾çˆ›è˜­é¸žå‰Œè¾£åµ�æ“¥æ”¬æ¬–æ¿«ç±ƒçºœè—�è¥¤è¦½æ‹‰è‡˜è Ÿå»Šæœ—æµªç‹¼ç�…ç‘¯èž‚éƒžä¾†å´�å¾ è�Šå†·æŽ ç•¥äº®å€†å…©å‡‰æ¢�æ¨‘ç²®ç²±ç³§è‰¯è«’è¼›é‡�ä¾¶å„·å‹µå‘‚å»¬æ…®æˆ¾æ—…æ«šæ¿¾ç¤ªè—œè £é–­é©¢é©ªéº—é»ŽåŠ›æ›†æ­·ç€�ç¤«è½¢é�‚æ†�æˆ€æ”£æ¼£"],
["d6a1","ç…‰ç’‰ç·´è�¯è“®è¼¦é€£é�Šå†½åˆ—åŠ£æ´Œçƒˆè£‚å»‰æ–‚æ®®æ¿‚ç°¾ç�µä»¤ä¼¶å›¹ï¥Ÿå²ºå¶ºæ€œçŽ²ç¬­ç¾šç¿Žè�†é€žéˆ´é›¶é�ˆé ˜é½¡ä¾‹æ¾§ç¦®é†´éš·å‹žï¥ æ’ˆæ“„æ«“æ½žç€˜çˆ�ç›§è€�è˜†è™œè·¯è¼…éœ²é­¯é·ºé¹µç¢Œç¥¿ç¶ è�‰éŒ„é¹¿éº“è«–å£Ÿå¼„æœ§ç€§ç“�ç± è�¾å„¡ç€¨ç‰¢ç£Šè³‚è³šè³´é›·äº†åƒšå¯®å»–æ–™ç‡Žç™‚çž­è�Šè“¼"],
["d7a1","é�¼é¬§é¾�å£˜å©�å±¢æ¨“æ·šæ¼�ç˜»ç´¯ç¸·è”žè¤¸é�¤é™‹åŠ‰æ—’æŸ³æ¦´æµ�æºœç€�ç�‰ç‘ ç•™ç˜¤ç¡«è¬¬é¡žå…­æˆ®é™¸ä¾–å€«å´™æ·ªç¶¸è¼ªå¾‹æ…„æ —ï¥¡éš†å‹’è‚‹å‡œå‡Œæ¥žç¨œç¶¾è�±é™µä¿šåˆ©åŽ˜å��å”Žå±¥æ‚§æ�Žæ¢¨æµ¬çŠ�ç‹¸ç�†ç’ƒï¥¢ç—¢ç±¬ç½¹ç¾¸èŽ‰è£�è£¡é‡Œé‡�é›¢é¯‰å��æ½¾ç‡�ç’˜è—ºèºªéš£é±—éºŸæž—æ·‹ç�³è‡¨éœ–ç ¬"],
["d8a1","ç«‹ç¬ ç²’æ‘©ç‘ªç—²ç¢¼ç£¨é¦¬é­”éº»å¯žå¹•æ¼ è†œèŽ«é‚ˆä¸‡å��å¨©å·’å½Žæ…¢æŒ½æ™©æ›¼æ»¿æ¼«ç�£çžžè�¬è”“è »è¼“é¥…é°»å”œæŠ¹æœ«æ²«èŒ‰è¥ªé�ºäº¡å¦„å¿˜å¿™æœ›ç¶²ç½”èŠ’èŒ«èŽ½è¼žé‚™åŸ‹å¦¹åª’å¯�æ˜§æžšæ¢…æ¯�ç…¤ç½µè²·è³£é‚�é­…è„ˆè²Šé™Œé©€éº¥å­Ÿæ°“çŒ›ç›²ç›Ÿè�Œå†ªè¦“å…�å†•å‹‰æ£‰æ²”çœ„çœ ç¶¿ç·¬é�¢éºµæ»…"],
["d9a1","è”‘å†¥å��å‘½æ˜Žæš�æ¤§æºŸçš¿çž‘èŒ—è“‚èžŸé…©éŠ˜é³´è¢‚ä¾®å†’å‹Ÿå§†å¸½æ…•æ‘¸æ‘¹æš®æŸ�æ¨¡æ¯�æ¯›ç‰Ÿç‰¡ç‘�çœ¸çŸ›è€—èŠ¼èŒ…è¬€è¬¨è²Œæœ¨æ²�ç‰§ç›®ç�¦ç©†é¶©æ­¿æ²’å¤¢æœ¦è’™å�¯å¢“å¦™å»Ÿæ��æ˜´æ�³æ¸ºçŒ«ç«—è‹—éŒ¨å‹™å·«æ†®æ‡‹æˆŠæ‹‡æ’«æ— æ¥™æ­¦æ¯‹ç„¡ç�·ç•�ç¹†èˆžèŒ‚è•ªèª£è²¿éœ§éµ¡å¢¨é»˜å€‘åˆŽå�»å•�æ–‡"],
["daa1","æ±¶ç´Šç´‹è�žèšŠé–€é›¯å‹¿æ²•ç‰©å‘³åªšå°¾åµ‹å½Œå¾®æœªæ¢¶æ¥£æ¸¼æ¹„çœ‰ç±³ç¾Žè–‡è¬Žè¿·é�¡é»´å²·æ‚¶æ„�æ†«æ•�æ—»æ—¼æ°‘æ³¯çŽŸç�‰ç·¡é–”å¯†èœœè¬�å‰�å�šæ‹�æ��æ’²æœ´æ¨¸æ³Šç�€ç’žç®”ç²•ç¸›è†Šèˆ¶è–„è¿«é›¹é§�ä¼´å�Šå��å�›æ‹Œæ�¬æ”€æ–‘æ§ƒæ³®æ½˜ç�­ç•”ç˜¢ç›¤ç›¼ç£�ç£»ç¤¬çµ†èˆ¬èŸ è¿”é ’é£¯å‹ƒæ‹”æ’¥æ¸¤æ½‘"],
["dba1","ç™¼è·‹é†±é‰¢é«®é­ƒå€£å‚�å�Šå¦¨å°¨å¹‡å½·æˆ¿æ”¾æ–¹æ—�æ˜‰æž‹æ¦œæ»‚ç£…ç´¡è‚ªè†€èˆ«èŠ³è’¡èšŒè¨ªè¬—é‚¦é˜²é¾�å€�ä¿³ï¥£åŸ¹å¾˜æ‹œæŽ’æ�¯æ¹ƒç„™ç›ƒèƒŒèƒšè£´è£µè¤™è³ è¼©é…�é™ªä¼¯ä½°å¸›æŸ�æ ¢ç™½ç™¾é­„å¹¡æ¨Šç…©ç‡”ç•ªï¥¤ç¹�è•ƒè—©é£œä¼�ç­�ç½°é–¥å‡¡å¸†æ¢µæ°¾æ±Žæ³›çŠ¯ç¯„èŒƒæ³•ç�ºåƒ»åŠˆå£�æ“˜æª—ç’§ç™–"],
["dca1","ç¢§è˜—é—¢éœ¹ï¥¥å�žå¼�è®Šè¾¨è¾¯é‚Šåˆ¥çž¥é±‰é¼ˆä¸™å€‚å…µå±›å¹·æ˜žæ˜ºæŸ„æ£…ç‚³ç”�ç—…ç§‰ç«�è¼§é¤ é¨ˆä¿�å ¡å ±å¯¶æ™®æ­¥æ´‘æ¹ºæ½½ç�¤ç”«è�©è£œè¤“è­œè¼”ä¼�åƒ•åŒ�å�œå®“å¾©æœ�ç¦�è…¹èŒ¯è””è¤‡è¦†è¼¹è¼»é¦¥é°’æœ¬ä¹¶ä¿¸å¥‰å°�å³¯å³°æ�§æ£’çƒ½ç†¢ç�«ç¸«è“¬èœ‚é€¢é‹’é³³ä¸�ä»˜ä¿¯å‚…å‰–å‰¯å�¦å’�åŸ å¤«å©¦"],
["dda1","å­šå­µå¯Œåºœï¥¦æ‰¶æ•·æ–§æµ®æº¥çˆ¶ç¬¦ç°¿ç¼¶è…�è…‘è†šè‰€èŠ™èŽ©è¨ƒè² è³¦è³»èµ´è¶ºéƒ¨é‡œé˜œé™„é§™é³§åŒ—åˆ†å�©å™´å¢³å¥”å¥®å¿¿æ†¤æ‰®æ˜�æ±¾ç„šç›†ç²‰ç³žç´›èŠ¬è³�é›°ï¥§ä½›å¼—å½¿æ‹‚å´©æœ‹æ£šç¡¼ç¹ƒéµ¬ä¸•å‚™åŒ•åŒªå�‘å¦ƒå©¢åº‡æ‚²æ†Šæ‰‰æ‰¹æ–�æž‡æ¦§æ¯”æ¯–æ¯—æ¯˜æ²¸ï¥¨ç�µç—ºç ’ç¢‘ç§•ç§˜ç²ƒç·‹ç¿¡è‚¥"],
["dea1","è„¾è‡‚è�²èœšè£¨èª¹è­¬è²»é„™é�žé£›é¼»åš¬å¬ªå½¬æ–Œæª³æ®¯æµœæ¿±ç€•ç‰�çŽ­è²§è³“é »æ†‘æ°·è�˜é¨�ä¹�äº‹äº›ä»•ä¼ºä¼¼ä½¿ä¿Ÿåƒ¿å�²å�¸å”†å—£å››å£«å¥¢å¨‘å¯«å¯ºå°„å·³å¸«å¾™æ€�æ�¨æ–œæ–¯æŸ¶æŸ»æ¢­æ­»æ²™æ³—æ¸£ç€‰ç�…ç ‚ç¤¾ç¥€ç¥ ç§�ç¯©ç´—çµ²è‚†èˆ�èŽŽè“‘è›‡è£Ÿè©�è©žè¬�è³œèµ¦è¾­é‚ªé£¼é§Ÿéº�å‰Šï¥©æœ”ï¥ª"],
["dfa1","å‚˜åˆªå±±æ•£æ±•ç�Šç”£ç–�ç®—è’œé…¸éœ°ä¹·æ’’æ®ºç…žè–©ä¸‰ï¥«æ�‰æ£®æ¸—èŠŸè”˜è¡«æ�·æ¾�éˆ’é¢¯ä¸Šå‚·åƒ�å„Ÿå•†å–ªå˜—å­€å°™å³ å¸¸åºŠåº å»‚æƒ³æ¡‘æ©¡æ¹˜çˆ½ç‰€ç‹€ç›¸ç¥¥ç®±ç¿”è£³è§´è©³è±¡è³žéœœå¡žç’½è³½å—‡ï¥¬ç©¡ç´¢è‰²ç‰²ç”Ÿç”¥ï¥­ç¬™å¢…å£»å¶¼åº�åº¶å¾�æ�•æŠ’æ�¿æ•�æš‘æ›™æ›¸æ –æ£²çŠ€ç‘žç­®çµ®ç·–ç½²"],
["e0a1","èƒ¥èˆ’è–¯è¥¿èª“é€�é‹¤é»�é¼ å¤•å¥­å¸­æƒœæ˜”æ™³æž�æ±�æ·…æ½ŸçŸ³ç¢©è“†é‡‹éŒ«ä»™åƒŠå…ˆå–„å¬‹å®£æ‰‡æ•¾æ—‹æ¸²ç…½ç��ç‘„ç’‡ç’¿ç™¬ç¦ªç·šç¹•ç¾¨è…ºè†³èˆ¹è˜šèŸ¬è©µè·£é�¸éŠ‘é�¥é¥�é®®å�¨å±‘æ¥”æ³„æ´©æ¸«èˆŒè–›è¤»è¨­èªªé›ªé½§å‰¡æš¹æ®²çº–èŸ¾è´�é–ƒé™�æ”�æ¶‰ç‡®ï¥®åŸŽå§“å®¬æ€§æƒºæˆ�æ˜Ÿæ™ŸçŒ©ç�¹ç››çœ�ç­¬"],
["e1a1","è�–è�²è…¥èª é†’ä¸–å‹¢æ­²æ´—ç¨…ç¬¹ç´°ï¥¯è²°å�¬å˜¯å¡‘å®µå°�å°‘å·¢æ‰€æŽƒæ�”æ˜­æ¢³æ²¼æ¶ˆæº¯ç€Ÿç‚¤ç‡’ç”¦ç–�ç–Žç˜™ç¬‘ç¯ ç°«ç´ ç´¹è”¬è•­è˜‡è¨´é€�é�¡é‚µéŠ·éŸ¶é¨·ä¿—å±¬æ�Ÿæ¶‘ç²ŸçºŒè¬–è´–é€Ÿå­«å·½æ��è“€é�œé£¡çŽ‡å®‹æ‚šæ�¾æ·žè¨Ÿèª¦é€�é Œåˆ·ï¥°ç�‘ç¢ŽéŽ–è¡°é‡—ä¿®å�—å—½å›šåž‚å£½å«‚å®ˆå²«å³€å¸¥æ„�"],
["e2a1","æˆ�æ‰‹æŽˆæ�œæ”¶æ•¸æ¨¹æ®Šæ°´æ´™æ¼±ç‡§ç‹©ç�¸ç�‡ç’²ç˜¦ç�¡ç§€ç©—ç«ªç²¹ç¶�ç¶¬ç¹¡ç¾žè„©èŒ±è’�è“šè—ªè¢–èª°è®�è¼¸é�‚é‚ƒé…¬éŠ–éŠ¹éš‹éš§éš¨é›–éœ€é ˆé¦–é«“é¬šå�”å¡¾å¤™å­°å®¿æ·‘æ½šç†Ÿç�¡ç’¹è‚…è�½å·¡å¾‡å¾ªæ�‚æ—¬æ ’æ¥¯æ©“æ®‰æ´µæ·³ç�£ç›¾çž¬ç­�ç´”è„£èˆœè�€è“´è•£è©¢è«„é†‡éŒžé †é¦´æˆŒè¡“è¿°é‰¥å´‡å´§"],
["e3a1","åµ©ç‘Ÿè†�è�¨æ¿•æ‹¾ç¿’è¤¶è¥²ä¸žä¹˜åƒ§å‹�å�‡æ‰¿æ˜‡ç¹©è …é™žä¾�åŒ™å˜¶å§‹åª¤å°¸å±Žå±�å¸‚å¼‘æ�ƒæ–½æ˜¯æ™‚æž¾æŸ´çŒœçŸ¢ç¤ºç¿…è’”è“�è¦–è©¦è©©è«¡è±•è±ºåŸ´å¯”å¼�æ�¯æ‹­æ¤�æ®–æ¹œç†„ç¯’è�•è­˜è»¾é£Ÿé£¾ä¼¸ä¾�ä¿¡å‘»å¨ å®¸æ„¼æ–°æ™¨ç‡¼ç”³ç¥žç´³è…Žè‡£èŽ˜è–ªè—Žèœƒè¨Šèº«è¾›ï¥±è¿…å¤±å®¤å¯¦æ‚‰å¯©å°‹å¿ƒæ²�"],
["e4a1","ï¥²æ·±ç€‹ç”šèŠ¯è«¶ä»€å��ï¥³é›™æ°�äºžä¿„å…’å•žå¨¥å³¨æˆ‘ç‰™èŠ½èŽªè›¾è¡™è¨�é˜¿é›…é¤“é´‰éµ�å Šå²³å¶½å¹„æƒ¡æ„•æ�¡æ¨‚æ¸¥é„‚é�”é¡Žé°�é½·å®‰å²¸æŒ‰æ™�æ¡ˆçœ¼é›�éž�é¡”é®Ÿæ–¡è¬�è»‹é–¼å”µå²©å·–åºµæš—ç™Œè�´é—‡å£“æŠ¼ç‹Žé´¨ä»°å¤®æ€�æ˜»æ®ƒç§§é´¦åŽ“å“€åŸƒå´–æ„›æ›–æ¶¯ç¢�è‰¾éš˜é�„åŽ„æ‰¼æŽ–æ¶²ç¸Šè…‹é¡�"],
["e5a1","æ«»ç½Œé¶¯é¸šä¹Ÿå€»å†¶å¤œæƒ¹æ�¶æ¤°çˆºè€¶ï¥´é‡Žå¼±ï¥µï¥¶ç´„è‹¥è‘¯è’»è—¥èº�ï¥·ä½¯ï¥¸ï¥¹å£¤å­ƒæ�™æ�šæ”˜æ•­æš˜ï¥ºæ¥Šæ¨£æ´‹ç€�ç…¬ç—’ç˜�ç¦³ç©°ï¥»ç¾Šï¥¼è¥„ï¥½è®“é‡€é™½ï¥¾é¤Šåœ„å¾¡æ–¼æ¼�ç˜€ç¦¦èªžé¦­é­šé½¬å„„æ†¶æŠ‘æª�è‡†å�ƒå °å½¦ç„‰è¨€è«ºå­¼è˜–ä¿ºå„¼åš´å¥„æŽ©æ·¹å¶ªæ¥­å††äºˆä½™ï¥¿ï¦€ï¦�å¦‚ï¦‚"],
["e6a1","ï¦ƒæ­Ÿæ±�ï¦„ç’µç¤–ï¦…èˆ‡è‰…èŒ¹è¼¿è½�ï¦†é¤˜ï¦‡ï¦ˆï¦‰äº¦ï¦ŠåŸŸå½¹æ˜“ï¦‹ï¦Œç–«ç¹¹è­¯ï¦�é€†é©›åš¥å §å§¸å¨Ÿå®´ï¦Žå»¶ï¦�ï¦�æ��æŒ»ï¦‘æ¤½æ²‡æ²¿æ¶Žæ¶“æ·µæ¼”ï¦’çƒŸç„¶ç…™ï¦“ç‡ƒç‡•ï¦”ç¡�ç¡¯ï¦•ç­µç·£ï¦–ç¸¯ï¦—è¡�è»Ÿï¦˜ï¦™ï¦šé‰›ï¦›é³¶ï¦œï¦�ï¦žæ‚…æ¶…ï¦Ÿç†±ï¦ ï¦¡é–±åŽ­ï¦¢ï¦£ï¦¤æŸ“ï¦¥ç‚Žç„°ç�°è‰¶è‹’"],
["e7a1","ï¦¦é–»é«¥é¹½æ›„ï¦§ç‡�è‘‰ï¦¨ï¦©å¡‹ï¦ªï¦«å¶¸å½±ï¦¬æ˜ æšŽæ¥¹æ¦®æ°¸æ³³æ¸¶æ½�æ¿šç€›ç€¯ç…�ç‡Ÿç�°ï¦­ç‘›ï¦®ç“”ç›ˆç©Žçº“ï¦¯ï¦°è‹±è© è¿Žï¦±é�ˆï¦²éœ™ï¦³ï¦´ä¹‚å€ªï¦µåˆˆå�¡æ›³æ±­æ¿ŠçŒŠç�¿ç©¢èŠ®è—�è˜‚ï¦¶è£”è©£è­½è±«ï¦·éŠ³ï¦¸éœ“é �äº”ä¼�ä¿‰å‚²å�ˆå�¾å�³å—šå¡¢å¢ºå¥§å¨›å¯¤æ‚Ÿï¦¹æ‡Šæ•–æ—¿æ™¤æ¢§æ±šæ¾³"],
["e8a1","çƒ�ç†¬ç�’ç­½èœˆèª¤é°²é¼‡å±‹æ²ƒç�„çŽ‰éˆºæº«ç‘¥ç˜Ÿç©©ç¸•è˜Šå…€å£…æ“�ç“®ç”•ç™°ç¿�é‚•é›�é¥”æ¸¦ç“¦çª©çªªè‡¥è›™è�¸è¨›å©‰å®Œå®›æ¢¡æ¤€æµ£çŽ©ç�“ç�¬ç¢—ç·©ç¿«è„˜è…•èŽžè±Œé˜®é ‘æ›°å¾€æ—ºæž‰æ±ªçŽ‹å€­å¨ƒæ­ªçŸ®å¤–åµ¬å·�çŒ¥ç•�ï¦ºï¦»åƒ¥å‡¹å ¯å¤­å¦–å§šå¯¥ï¦¼ï¦½å¶¢æ‹—æ�–æ’“æ“¾ï¦¾æ›œï¦¿æ©ˆï§€ç‡¿ç‘¤ï§�"],
["e9a1","çªˆçª¯ç¹‡ç¹žè€€è…°ï§‚èŸ¯è¦�è¬ é�™ï§ƒé‚€é¥’æ…¾æ¬²æµ´ç¸Ÿè¤¥è¾±ä¿‘å‚­å†—å‹‡åŸ‡å¢‰å®¹åº¸æ…‚æ¦•æ¶Œæ¹§æº¶ç†”ç‘¢ç”¨ç”¬è�³èŒ¸è“‰è¸ŠéŽ”é�žï§„äºŽä½‘å�¶å„ªå�ˆå�‹å�³å®‡å¯“å°¤æ„šæ†‚æ—´ç‰›çŽ—ç‘€ç›‚ç¥�ç¦‘ç¦¹ç´†ç¾½èŠ‹è—•è™žè¿‚é�‡éƒµé‡ªéš…é›¨é›©å‹–å½§æ—­æ˜±æ ¯ç…œç¨¶éƒ�é Šäº‘ï§…æ©’æ®žæ¾�ç†‰è€˜èŠ¸è•“"],
["eaa1","é�‹éš•é›²éŸ»è”šé¬±äº�ç†Šé›„å…ƒåŽŸå“¡åœ“åœ’åž£åª›å«„å¯ƒæ€¨æ„¿æ�´æ²…æ´¹æ¹²æº�çˆ°çŒ¿ç‘—è‹‘è¢�è½…é� ï§†é™¢é¡˜é´›æœˆè¶Šé‰žä½�å�‰åƒžå�±åœ�å§”å¨�å°‰æ…°æš�æ¸­çˆ²ç‘‹ç·¯èƒƒè�Žè‘¦è”¿è�Ÿè¡›è¤˜è¬‚é�•éŸ‹é­�ä¹³ä¾‘å„’å…ªï§‡å”¯å–©å­ºå®¥å¹¼å¹½åº¾æ‚ æƒŸæ„ˆæ„‰æ�„æ”¸æœ‰ï§ˆæŸ”æŸšï§‰æ¥¡æ¥¢æ²¹æ´§ï§Šæ¸¸ï§‹"],
["eba1","æ¿¡çŒ¶çŒ·ï§Œç‘œç”±ï§�ç™’ï§Žï§�ç¶­è‡¾è�¸è£•èª˜è«›è«­è¸°è¹‚é�Šé€¾é�ºé…‰é‡‰é�®ï§�ï§‘å ‰ï§’æ¯“è‚‰è‚²ï§“ï§”å…�å¥«å°¹ï§•ï§–æ½¤çŽ§èƒ¤è´‡ï§—éˆ—é–�ï§˜ï§™ï§šï§›è�¿æˆŽç€œçµ¨èž�ï§œåž æ�©æ…‡æ®·èª¾éŠ€éš±ä¹™å�Ÿæ·«è”­é™°éŸ³é£®æ�–æ³£é‚‘å‡�æ‡‰è†ºé·¹ä¾�å€šå„€å®œæ„�æ‡¿æ“¬æ¤…æ¯…ç–‘çŸ£ç¾©è‰¤è–�èŸ»è¡£èª¼"],
["eca1","è­°é†«äºŒä»¥ä¼Šï§�ï§žå¤·å§¨ï§Ÿå·²å¼›å½›æ€¡ï§ ï§¡ï§¢ï§£çˆ¾ç�¥ï§¤ç•°ç—�ï§¥ç§»ï§¦è€Œè€³è‚„è‹¡è�‘ï§§ï§¨è²½è²³é‚‡ï§©ï§ªé£´é¤Œï§«ï§¬ç€·ç›Šç¿Šç¿Œç¿¼è¬šäººä»�åˆƒå�°ï§­å’½å› å§»å¯…å¼•å¿�æ¹®ï§®ï§¯çµªèŒµï§°èš“èª�ï§±é�­é�·ï§²ï§³ä¸€ä½šä½¾å£¹æ—¥æº¢é€¸éŽ°é¦¹ä»»å£¬å¦Šå§™æ��ï§´ï§µç¨”ï§¶è��è³ƒå…¥å�„"],
["eda1","ï§·ï§¸ï§¹ä»�å‰©å­•èŠ¿ä»”åˆºå’¨å§‰å§¿å­�å­—å­œæ�£æ…ˆæ»‹ç‚™ç…®çŽ†ç“·ç–µç£�ç´«è€…è‡ªèŒ¨è”—è—‰è«®è³‡é›Œä½œå‹ºåš¼æ–«æ˜¨ç�¼ç‚¸çˆµç¶½èŠ�é…Œé›€éµ²å­±æ£§æ®˜æ½ºç›žå²‘æš«æ½›ç®´ç°ªè ¶é›œä¸ˆä»—åŒ å ´å¢»å£¯å¥¬å°‡å¸³åº„å¼µæŽŒæš²æ�–æ¨Ÿæª£æ¬Œæ¼¿ç‰†ï§ºç��ç’‹ç« ç²§è…¸è‡Ÿè‡§èŽŠè‘¬è”£è–”è—�è£�è´“é†¬é•·"],
["eea1","éšœå†�å“‰åœ¨å®°æ‰�æ��æ ½æ¢“æ¸½æ»“ç�½ç¸¡è£�è²¡è¼‰é½‹é½Žçˆ­ç®�è«�éŒšä½‡ä½Žå„²å’€å§�åº•æŠµæ�µæ¥®æ¨—æ²®æ¸šç‹™çŒªç–½ç®¸ç´µè‹§è�¹è‘—è—·è©›è²¯èº‡é€™é‚¸é›Žé½Ÿå‹£å�Šå«¡å¯‚æ‘˜æ•µæ»´ç‹„ï§»çš„ç©�ç¬›ç±�ç¸¾ç¿Ÿè�»è¬«è³Šèµ¤è·¡è¹Ÿè¿ªè¿¹é�©é�‘ä½ƒä½ºå‚³å…¨å…¸å‰�å‰ªå¡¡å¡¼å¥ å°ˆå±•å»›æ‚›æˆ°æ “æ®¿æ°ˆæ¾±"],
["efa1","ç…Žç� ç”°ç”¸ç•‘ç™²ç­Œç®‹ç®­ç¯†çº�è©®è¼¾è½‰éˆ¿éŠ“éŒ¢é�«é›»é¡šé¡«é¤žåˆ‡æˆªæŠ˜æµ™ç™¤ç«Šç¯€çµ¶å� å²¾åº—æ¼¸ç‚¹ç²˜éœ‘é®Žé»žæŽ¥æ‘ºè�¶ä¸�äº•äº­å�œå�µå‘ˆå§ƒå®šå¹€åº­å»·å¾�æƒ…æŒºæ”¿æ•´æ—Œæ™¶æ™¸æŸ¾æ¥¨æª‰æ­£æ±€æ·€æ·¨æ¸Ÿæ¹žç€žç‚¡çŽŽç�½ç”ºç�›ç¢‡ç¦Žç¨‹ç©½ç²¾ç¶Žè‰‡è¨‚è«ªè²žé„­é…Šé‡˜é‰¦é‹ŒéŒ éœ†é�–"],
["f0a1","é�œé ‚é¼Žåˆ¶åŠ‘å•¼å ¤å¸�å¼Ÿæ‚Œæ��æ¢¯æ¿Ÿç¥­ç¬¬è‡�è–ºè£½è«¸è¹„é†�é™¤éš›éœ½é¡Œé½Šä¿Žå…†å‡‹åŠ©å˜²å¼”å½«æŽªæ“�æ—©æ™�æ›ºæ›¹æœ�æ¢�æ£—æ§½æ¼•æ½®ç…§ç‡¥çˆªç’ªçœºç¥–ç¥šç§Ÿç¨ çª•ç²—ç³Ÿçµ„ç¹°è‚‡è—»èš¤è©”èª¿è¶™èº�é€ é�­é‡£é˜»é›•é³¥æ—�ç°‡è¶³é�ƒå­˜å°Šå�’æ‹™çŒ�å€§å®—å¾žæ‚°æ…«æ£•æ·™ç�®ç¨®çµ‚ç¶œç¸±è…«"],
["f1a1","è¸ªè¸µé�¾é�˜ä½�å��å·¦åº§æŒ«ç½ªä¸»ä½�ä¾�å�šå§�èƒ„å‘ªå‘¨å—¾å¥�å®™å·žå»šæ™�æœ±æŸ±æ ªæ³¨æ´²æ¹Šæ¾�ç‚·ç� ç–‡ç±Œç´‚ç´¬ç¶¢èˆŸè››è¨»èª…èµ°èºŠè¼³é€±é…Žé…’é‘„é§�ç«¹ç²¥ä¿Šå„�å‡†åŸˆå¯¯å³»æ™™æ¨½æµšæº–æ¿¬ç„Œç•¯ç«£è ¢é€¡é�µé›‹é§¿èŒ�ä¸­ä»²è¡†é‡�å�½æ«›æ¥«æ±�è‘ºå¢žæ†Žæ›¾æ‹¯çƒ�ç”‘ç—‡ç¹’è’¸è­‰è´ˆä¹‹å�ª"],
["f2a1","å’«åœ°å�€å¿—æŒ�æŒ‡æ‘¯æ”¯æ—¨æ™ºæž�æž³æ­¢æ± æ²šæ¼¬çŸ¥ç ¥ç¥‰ç¥—ç´™è‚¢è„‚è‡³èŠ�èŠ·èœ˜èªŒï§¼è´„è¶¾é�²ç›´ç¨™ç¨·ç¹”è�·å”‡å—”å¡µæŒ¯æ�¢æ™‰æ™‹æ¡­æ¦›æ®„æ´¥æº±ç��ç‘¨ç’¡ç•›ç–¹ç›¡çœžçž‹ç§¦ç¸‰ç¸�è‡»è”¯è¢—è¨ºè³‘è»«è¾°é€²éŽ­é™£é™³éœ‡ä¾„å�±å§ªå«‰å¸™æ¡Žç“†ç–¾ç§©çª’è†£è›­è³ªè·Œè¿­æ–Ÿæœ•ï§½åŸ·æ½—ç·�è¼¯"],
["f3a1","é�¶é›†å¾µæ‡²æ¾„ä¸”ä¾˜å€Ÿå�‰å—Ÿåµ¯å·®æ¬¡æ­¤ç£‹ç®šï§¾è¹‰è»Šé�®æ�‰æ�¾ç�€çª„éŒ¯é‘¿é½ªæ’°æ¾¯ç‡¦ç’¨ç“šç«„ç°’çº‚ç²²çº˜è®šè´Šé‘½é¤�é¥Œåˆ¹å¯Ÿæ“¦æœ­ç´®åƒ­å�ƒå¡¹æ…˜æ…™æ‡ºæ–¬ç«™è®’è®–å€‰å€¡å‰µå”±å¨¼å» å½°æ„´æ•žæ˜Œæ˜¶æš¢æ§�æ»„æ¼²çŒ–ç˜¡çª“è„¹è‰™è�–è’¼å‚µåŸ°å¯€å¯¨å½©æŽ¡ç ¦ç¶µè�œè”¡é‡‡é‡µå†ŠæŸµç­–"],
["f4a1","è²¬å‡„å¦»æ‚½è™•å€œï§¿å‰”å°ºæ…½æˆšæ‹“æ“²æ–¥æ»Œç˜ è„Šè¹ é™Ÿéš»ä»Ÿå�ƒå–˜å¤©å·�æ“…æ³‰æ·ºçŽ”ç©¿èˆ›è–¦è³¤è¸�é�·é‡§é—¡é˜¡éŸ†å‡¸å“²å–†å¾¹æ’¤æ¾ˆç¶´è¼Ÿè½�é�µåƒ‰å°–æ²¾æ·»ç”›çž»ç°½ç±¤è©¹è«‚å žå¦¾å¸–æ�·ç‰’ç–Šç�«è«œè²¼è¼’å»³æ™´æ·¸è�½è��è«‹é�‘é¯–ï¨€å‰ƒæ›¿æ¶•æ»¯ç· è«¦é€®é�žé«”åˆ�å‰¿å“¨æ†”æŠ„æ‹›æ¢¢"],
["f5a1","æ¤’æ¥šæ¨µç‚’ç„¦ç¡�ç¤�ç¤Žç§’ç¨�è‚–è‰¸è‹•è�‰è•‰è²‚è¶…é…¢é†‹é†®ä¿ƒå›‘ç‡­çŸ—èœ€è§¸å¯¸å¿–æ�‘é‚¨å�¢å¡šå¯µæ‚¤æ†�æ‘ ç¸½è�°è”¥éŠƒæ’®å‚¬å´”æœ€å¢œæŠ½æŽ¨æ¤Žæ¥¸æ¨žæ¹«çšºç§‹èŠ»è�©è«�è¶¨è¿½é„’é…‹é†œéŒ�éŒ˜éŽšé››é¨¶é°�ä¸‘ç•œç¥�ç«ºç­‘ç¯‰ç¸®è“„è¹™è¹´è»¸é€�æ˜¥æ¤¿ç‘ƒå‡ºæœ®é»œå……å¿ æ²–èŸ²è¡�è¡·æ‚´è†µè�ƒ"],
["f6a1","è´…å�–å�¹å˜´å¨¶å°±ç‚Šç¿ è�šè„†è‡­è¶£é†‰é©Ÿé·²å�´ä»„åŽ æƒ»æ¸¬å±¤ä¾ˆå€¤å—¤å³™å¹Ÿæ�¥æ¢”æ²»æ·„ç†¾ç—”ç—´ç™¡ç¨šç©‰ç·‡ç·»ç½®è‡´èš©è¼œé›‰é¦³é½’å‰‡å‹…é£­è¦ªä¸ƒæŸ’æ¼†ä¾µå¯¢æž•æ²ˆæµ¸ç�›ç §é‡�é�¼èŸ„ç§¤ç¨±å¿«ä»–å’¤å”¾å¢®å¦¥æƒ°æ‰“æ‹–æœ¶æ¥•èˆµé™€é¦±é§�å€¬å�“å•„å�¼ï¨�æ‰˜ï¨‚æ“¢æ™«æŸ�æ¿�æ¿¯ç�¢ç�¸è¨—"],
["f7a1","é�¸å‘‘å˜†å�¦å½ˆæ†šæ­Žç�˜ç‚­ç¶»èª•å¥ªè„«æŽ¢çœˆè€½è²ªå¡”æ�­æ¦»å®•å¸‘æ¹¯ï¨ƒè•©å…Œå�°å¤ªæ€ æ…‹æ®†æ±°æ³°ç¬žèƒŽè‹”è·†é‚°é¢±ï¨„æ“‡æ¾¤æ’‘æ”„å…Žå��åœŸè¨Žæ…Ÿæ¡¶ï¨…ç—›ç­’çµ±é€šå †æ§Œè…¿è¤ªé€€é ¹å�¸å¥—å¦¬æŠ•é€�é¬ªæ…�ç‰¹é—–å�¡å©†å·´æŠŠæ’­æ“ºæ�·æ³¢æ´¾çˆ¬ç�¶ç ´ç½·èŠ­è·›é —åˆ¤å�‚æ�¿ç‰ˆç“£è²©è¾¦éˆ‘"],
["f8a1","é˜ªå…«å�­æ�Œä½©å”„æ‚–æ•—æ²›æµ¿ç‰Œç‹½ç¨—è¦‡è²�å½­æ¾Žçƒ¹è†¨æ„Žä¾¿å��æ‰�ç‰‡ç¯‡ç·¨ç¿©é��éž­é¨™è²¶å�ªå¹³æž°è��è©•å� å¬–å¹£å»¢å¼Šæ–ƒè‚ºè”½é–‰é™›ä½ˆåŒ…åŒ�åŒ�å’†å“ºåœƒå¸ƒæ€–æŠ›æŠ±æ�•ï¨†æ³¡æµ¦ç–±ç ²èƒžè„¯è‹žè‘¡è’²è¢�è¤’é€‹é‹ªé£½é®‘å¹…æš´æ›�ç€‘çˆ†ï¨‡ä¿µå‰½å½ªæ…“æ�“æ¨™æ¼‚ç“¢ç¥¨è¡¨è±¹é£‡é£„é©ƒ"],
["f9a1","å“�ç¨Ÿæ¥“è«·è±Šé¢¨é¦®å½¼æŠ«ç–²çš®è¢«é�¿é™‚åŒ¹å¼¼å¿…æ³Œç�Œç•¢ç–‹ç­†è‹¾é¦�ä¹�é€¼ä¸‹ä½•åŽ¦å¤�å»ˆæ˜°æ²³ç‘•è�·è�¦è³€é��éœžé°•å£‘å­¸è™�è¬”é¶´å¯’æ�¨æ‚�æ—±æ±—æ¼¢æ¾£ç€šç½•ç¿°é–‘é–’é™�éŸ“å‰²è½„å‡½å�«å’¸å•£å–Šæª»æ¶µç·˜è‰¦éŠœé™·é¹¹å�ˆå“ˆç›’è›¤é–¤é—”é™œäº¢ä¼‰å§®å«¦å··æ�’æŠ—æ�­æ¡�æ²†æ¸¯ç¼¸è‚›èˆª"],
["faa1","ï¨ˆï¨‰é …äº¥å�•å’³åž“å¥šå­©å®³æ‡ˆæ¥·æµ·ç€£èŸ¹è§£è©²è«§é‚‚é§­éª¸åŠ¾æ ¸å€–å¹¸æ��è�‡è¡Œäº«å�‘åš®ç�¦é„•éŸ¿é¤‰é¥—é¦™å™“å¢Ÿè™›è¨±æ†²æ«¶ç�»è»’æ­‡éšªé©—å¥•çˆ€èµ«é�©ä¿”å³´å¼¦æ‡¸æ™›æ³«ç‚«çŽ„çŽ¹ç�¾çœ©ç��çµƒçµ¢ç¸£èˆ·è¡’ï¨Šè³¢é‰‰é¡¯å­‘ç©´è¡€é �å«Œä¿ å�”å¤¾å³½æŒ¾æµ¹ç‹¹è„…è„‡èŽ¢é‹�é °äº¨å…„åˆ‘åž‹"],
["fba1","å½¢æ³‚æ»Žç€…ç��ç‚¯ç†’ç�©ç‘©è�Šèž¢è¡¡é€ˆé‚¢éŽ£é¦¨å…®å½—æƒ æ…§æš³è•™è¹Šé†¯éž‹ä¹Žäº’å‘¼å£•å£ºå¥½å²µå¼§æˆ¶æ‰ˆæ˜Šæ™§æ¯«æµ©æ·�æ¹–æ»¸æ¾”æ¿ æ¿©ç��ç‹�ç�¥ç‘šç“ çš“ç¥œç³Šç¸žèƒ¡èŠ¦è‘«è’¿è™Žè™Ÿè�´è­·è±ªéŽ¬é €é¡¥æƒ‘æˆ–é…·å©šæ˜�æ··æ¸¾ç�¿é­‚å¿½æƒšç¬�å“„å¼˜æ±žæ³“æ´ªçƒ˜ç´…è™¹è¨Œé´»åŒ–å’Œå¬…æ¨ºç�«ç•µ"],
["fca1","ç¦�ç¦¾èŠ±è�¯è©±è­�è²¨é�´ï¨‹æ“´æ”«ç¢ºç¢»ç©«ä¸¸å–šå¥�å®¦å¹»æ‚£æ�›æ­¡æ™¥æ¡“æ¸™ç…¥ç’°ç´ˆé‚„é©©é°¥æ´»æ»‘çŒ¾è±�é—Šå‡°å¹Œå¾¨æ��æƒ¶æ„°æ…Œæ™ƒæ™„æ¦¥æ³�æ¹Ÿæ»‰æ½¢ç…Œç’œçš‡ç¯�ç°§è�’è�—é�‘éš�é»ƒåŒ¯å›žå»»å¾Šæ�¢æ‚”æ‡·æ™¦æœƒæªœæ·®æ¾®ç�°ç�ªç¹ªè†¾èŒ´è›”èª¨è³„åŠƒç�²å®–æ©«é�„å“®åš†å­�æ•ˆæ–…æ›‰æ¢Ÿæ¶�æ·†"],
["fda1","çˆ»è‚´é…µé©�ä¾¯å€™åŽšå�Žå�¼å–‰å—…å¸¿å¾Œæœ½ç…¦ç��é€…å‹›å‹³å¡¤å£Žç„„ç†�ç‡»è–°è¨“æšˆè–¨å–§æš„ç…Šè�±å�‰å–™æ¯�å½™å¾½æ�®æš‰ç…‡è«±è¼�éº¾ä¼‘æ�ºçƒ‹ç•¦è™§æ�¤è­Žé·¸å…‡å‡¶åŒˆæ´¶èƒ¸é»‘æ˜•æ¬£ç‚˜ç—•å�ƒå±¹ç´‡è¨–æ¬ æ¬½æ­†å�¸æ�°æ´½ç¿•èˆˆåƒ–å‡žå–œå™«å›�å§¬å¬‰å¸Œæ†™æ†˜æˆ±æ™žæ›¦ç†™ç†¹ç†ºçŠ§ç¦§ç¨€ç¾²è©°"]
]
[
["0","\u0000",127],
["a140","ã€€ï¼Œã€�ã€‚ï¼Žâ€§ï¼›ï¼šï¼Ÿï¼�ï¸°â€¦â€¥ï¹�ï¹‘ï¹’Â·ï¹”ï¹•ï¹–ï¹—ï½œâ€“ï¸±â€”ï¸³â•´ï¸´ï¹�ï¼ˆï¼‰ï¸µï¸¶ï½›ï½�ï¸·ï¸¸ã€”ã€•ï¸¹ï¸ºã€�ã€‘ï¸»ï¸¼ã€Šã€‹ï¸½ï¸¾ã€ˆã€‰ï¸¿ï¹€ã€Œã€�ï¹�ï¹‚ã€Žã€�ï¹ƒï¹„ï¹™ï¹š"],
["a1a1","ï¹›ï¹œï¹�ï¹žâ€˜â€™â€œâ€�ã€�ã€žâ€µâ€²ï¼ƒï¼†ï¼Šâ€»Â§ã€ƒâ—‹â—�â–³â–²â—Žâ˜†â˜…â—‡â—†â–¡â– â–½â–¼ãŠ£â„…Â¯ï¿£ï¼¿Ë�ï¹‰ï¹Šï¹�ï¹Žï¹‹ï¹Œï¹Ÿï¹ ï¹¡ï¼‹ï¼�Ã—Ã·Â±âˆšï¼œï¼žï¼�â‰¦â‰§â‰ âˆžâ‰’â‰¡ï¹¢",4,"ï½žâˆ©âˆªâŠ¥âˆ âˆŸâŠ¿ã�’ã�‘âˆ«âˆ®âˆµâˆ´â™€â™‚âŠ•âŠ™â†‘â†“â†�â†’â†–â†—â†™â†˜âˆ¥âˆ£ï¼�"],
["a240","ï¼¼âˆ•ï¹¨ï¼„ï¿¥ã€’ï¿ ï¿¡ï¼…ï¼ â„ƒâ„‰ï¹©ï¹ªï¹«ã�•ãŽœãŽ�ãŽžã�ŽãŽ¡ãŽŽãŽ�ã�„Â°å…™å…›å…žå…�å…¡å…£å—§ç“©ç³Žâ–�",7,"â–�â–Žâ–�â–Œâ–‹â–Šâ–‰â”¼â”´â”¬â”¤â”œâ–”â”€â”‚â–•â”Œâ”�â””â”˜â•­"],
["a2a1","â•®â•°â•¯â•�â•žâ•ªâ•¡â—¢â—£â—¥â—¤â•±â•²â•³ï¼�",9,"â… ",9,"ã€¡",8,"å��å�„å�…ï¼¡",25,"ï½�",21],
["a340","ï½—ï½˜ï½™ï½šÎ‘",16,"Î£",6,"Î±",16,"Ïƒ",6,"ã„…",10],
["a3a1","ã„�",25,"Ë™Ë‰ËŠË‡Ë‹"],
["a3e1","â‚¬"],
["a440","ä¸€ä¹™ä¸�ä¸ƒä¹ƒä¹�äº†äºŒäººå„¿å…¥å…«å‡ åˆ€åˆ�åŠ›åŒ•å��å�œå�ˆä¸‰ä¸‹ä¸ˆä¸Šä¸«ä¸¸å‡¡ä¹…ä¹ˆä¹Ÿä¹žäºŽäº¡å…€åˆƒå‹ºå�ƒå�‰å�£åœŸå£«å¤•å¤§å¥³å­�å­‘å­“å¯¸å°�å°¢å°¸å±±å·�å·¥å·±å·²å·³å·¾å¹²å»¾å¼‹å¼“æ‰�"],
["a4a1","ä¸‘ä¸�ä¸�ä¸­ä¸°ä¸¹ä¹‹å°¹äºˆäº‘äº•äº’äº”äº¢ä»�ä»€ä»ƒä»†ä»‡ä»�ä»Šä»‹ä»„å…ƒå…�å…§å…­å…®å…¬å†—å‡¶åˆ†åˆ‡åˆˆå‹»å‹¾å‹¿åŒ–åŒ¹å�ˆå�‡å�…å�žåŽ„å�‹å�Šå��å£¬å¤©å¤«å¤ªå¤­å­”å°‘å°¤å°ºå±¯å·´å¹»å»¿å¼”å¼•å¿ƒæˆˆæˆ¶æ‰‹æ‰Žæ”¯æ–‡æ–—æ–¤æ–¹æ—¥æ›°æœˆæœ¨æ¬ æ­¢æ­¹æ¯‹æ¯”æ¯›æ°�æ°´ç�«çˆªçˆ¶çˆ»ç‰‡ç‰™ç‰›çŠ¬çŽ‹ä¸™"],
["a540","ä¸–ä¸•ä¸”ä¸˜ä¸»ä¹�ä¹�ä¹Žä»¥ä»˜ä»”ä»•ä»–ä»—ä»£ä»¤ä»™ä»žå……å…„å†‰å†Šå†¬å‡¹å‡ºå‡¸åˆŠåŠ åŠŸåŒ…åŒ†åŒ—åŒ�ä»Ÿå�Šå�‰å�¡å� å�¯å�®åŽ»å�¯å�¤å�³å�¬å�®å�©å�¨å�¼å�¸å�µå�«å�¦å�ªå�²å�±å�°å�¥å�­å�»å››å›šå¤–"],
["a5a1","å¤®å¤±å¥´å¥¶å­•å®ƒå°¼å·¨å·§å·¦å¸‚å¸ƒå¹³å¹¼å¼�å¼˜å¼—å¿…æˆŠæ‰“æ‰”æ‰’æ‰‘æ–¥æ—¦æœ®æœ¬æœªæœ«æœ­æ­£æ¯�æ°‘æ°�æ°¸æ±�æ±€æ°¾çŠ¯çŽ„çŽ‰ç“œç“¦ç”˜ç”Ÿç”¨ç”©ç”°ç”±ç”²ç”³ç–‹ç™½çš®çš¿ç›®çŸ›çŸ¢çŸ³ç¤ºç¦¾ç©´ç«‹ä¸žä¸Ÿä¹’ä¹“ä¹©äº™äº¤äº¦äº¥ä»¿ä¼‰ä¼™ä¼Šä¼•ä¼�ä¼�ä¼‘ä¼�ä»²ä»¶ä»»ä»°ä»³ä»½ä¼�ä¼‹å…‰å…‡å…†å…ˆå…¨"],
["a640","å…±å†�å†°åˆ—åˆ‘åˆ’åˆŽåˆ–åŠ£åŒˆåŒ¡åŒ å�°å�±å�‰å��å�Œå�Šå��å��å�‹å�„å�‘å��å�ˆå�ƒå�Žå�†å�’å› å›žå›�åœ³åœ°åœ¨åœ­åœ¬åœ¯åœ©å¤™å¤šå¤·å¤¸å¦„å¥¸å¦ƒå¥½å¥¹å¦‚å¦�å­—å­˜å®‡å®ˆå®…å®‰å¯ºå°–å±¹å·žå¸†å¹¶å¹´"],
["a6a1","å¼�å¼›å¿™å¿–æˆŽæˆŒæˆ�æˆ�æ‰£æ‰›æ‰˜æ”¶æ—©æ—¨æ—¬æ—­æ›²æ›³æœ‰æœ½æœ´æœ±æœµæ¬¡æ­¤æ­»æ°–æ±�æ±—æ±™æ±Ÿæ± æ±�æ±•æ±¡æ±›æ±�æ±Žç�°ç‰Ÿç‰�ç™¾ç«¹ç±³ç³¸ç¼¶ç¾Šç¾½è€�è€ƒè€Œè€’è€³è�¿è‚‰è‚‹è‚Œè‡£è‡ªè‡³è‡¼èˆŒèˆ›èˆŸè‰®è‰²è‰¾è™«è¡€è¡Œè¡£è¥¿é˜¡ä¸²äº¨ä½�ä½�ä½‡ä½—ä½žä¼´ä½›ä½•ä¼°ä½�ä½‘ä¼½ä¼ºä¼¸ä½ƒä½”ä¼¼ä½†ä½£"],
["a740","ä½œä½ ä¼¯ä½Žä¼¶ä½™ä½�ä½ˆä½šå…Œå…‹å…�å…µå†¶å†·åˆ¥åˆ¤åˆ©åˆªåˆ¨åŠ«åŠ©åŠªåŠ¬åŒ£å�³å�µå��å�­å�žå�¾å�¦å‘Žå�§å‘†å‘ƒå�³å‘ˆå‘‚å�›å�©å‘Šå�¹å�»å�¸å�®å�µå�¶å� å�¼å‘€å�±å�«å�Ÿå�¬å›ªå›°å›¤å›«å�Šå�‘å�€å��"],
["a7a1","å�‡å�Žåœ¾å��å��åœ»å£¯å¤¾å¦�å¦’å¦¨å¦žå¦£å¦™å¦–å¦�å¦¤å¦“å¦Šå¦¥å­�å­œå­šå­›å®Œå®‹å®�å°¬å±€å±�å°¿å°¾å²�å²‘å²”å²Œå·«å¸Œåº�åº‡åºŠå»·å¼„å¼Ÿå½¤å½¢å½·å½¹å¿˜å¿Œå¿—å¿�å¿±å¿«å¿¸å¿ªæˆ’æˆ‘æŠ„æŠ—æŠ–æŠ€æ‰¶æŠ‰æ‰­æŠŠæ‰¼æ‰¾æ‰¹æ‰³æŠ’æ‰¯æŠ˜æ‰®æŠ•æŠ“æŠ‘æŠ†æ”¹æ”»æ”¸æ—±æ›´æ�Ÿæ�Žæ��æ��æ�‘æ�œæ�–æ�žæ�‰æ�†æ� "],
["a840","æ�“æ�—æ­¥æ¯�æ±‚æ±žæ²™æ²�æ²ˆæ²‰æ²…æ²›æ±ªæ±ºæ²�æ±°æ²Œæ±¨æ²–æ²’æ±½æ²ƒæ±²æ±¾æ±´æ²†æ±¶æ²�æ²”æ²˜æ²‚ç�¶ç�¼ç�½ç�¸ç‰¢ç‰¡ç‰ ç‹„ç‹‚çŽ–ç”¬ç”«ç”·ç”¸çš‚ç›¯çŸ£ç§�ç§€ç¦¿ç©¶ç³»ç½•è‚–è‚“è‚�è‚˜è‚›è‚šè‚²è‰¯èŠ’"],
["a8a1","èŠ‹èŠ�è¦‹è§’è¨€è°·è±†è±•è²�èµ¤èµ°è¶³èº«è»Šè¾›è¾°è¿‚è¿†è¿…è¿„å·¡é‚‘é‚¢é‚ªé‚¦é‚£é…‰é‡†é‡Œé˜²é˜®é˜±é˜ªé˜¬ä¸¦ä¹–ä¹³äº‹äº›äºžäº«äº¬ä½¯ä¾�ä¾�ä½³ä½¿ä½¬ä¾›ä¾‹ä¾†ä¾ƒä½°ä½µä¾ˆä½©ä½»ä¾–ä½¾ä¾�ä¾‘ä½ºå…”å…’å…•å…©å…·å…¶å…¸å†½å‡½åˆ»åˆ¸åˆ·åˆºåˆ°åˆ®åˆ¶å‰�åŠ¾åŠ»å�’å�”å�“å�‘å�¦å�·å�¸å�¹å�–å�”å�—å‘³å‘µ"],
["a940","å’–å‘¸å’•å’€å‘»å‘·å’„å’’å’†å‘¼å’�å‘±å‘¶å’Œå’šå‘¢å‘¨å’‹å‘½å’Žå›ºåžƒå�·å�ªå�©å�¡å�¦å�¤å�¼å¤œå¥‰å¥‡å¥ˆå¥„å¥”å¦¾å¦»å§”å¦¹å¦®å§‘å§†å§�å§�å§‹å§“å§Šå¦¯å¦³å§’å§…å­Ÿå­¤å­£å®—å®šå®˜å®œå®™å®›å°šå±ˆå±…"],
["a9a1","å±†å²·å²¡å²¸å²©å²«å²±å²³å¸˜å¸šå¸–å¸•å¸›å¸‘å¹¸åºšåº—åºœåº•åº–å»¶å¼¦å¼§å¼©å¾€å¾�å½¿å½¼å¿�å¿ å¿½å¿µå¿¿æ€�æ€”æ€¯æ€µæ€–æ€ªæ€•æ€¡æ€§æ€©æ€«æ€›æˆ–æˆ•æˆ¿æˆ¾æ‰€æ‰¿æ‹‰æ‹Œæ‹„æŠ¿æ‹‚æŠ¹æ‹’æ‹›æŠ«æ‹“æ‹”æ‹‹æ‹ˆæŠ¨æŠ½æŠ¼æ‹�æ‹™æ‹‡æ‹�æŠµæ‹šæŠ±æ‹˜æ‹–æ‹—æ‹†æŠ¬æ‹Žæ”¾æ–§æ–¼æ—ºæ˜”æ˜“æ˜Œæ˜†æ˜‚æ˜Žæ˜€æ˜�æ˜•æ˜Š"],
["aa40","æ˜‡æœ�æœ‹æ�­æž‹æž•æ�±æžœæ�³æ�·æž‡æž�æž—æ�¯æ�°æ�¿æž‰æ�¾æž�æ�µæžšæž“æ�¼æ�ªæ�²æ¬£æ­¦æ­§æ­¿æ°“æ°›æ³£æ³¨æ³³æ²±æ³Œæ³¥æ²³æ²½æ²¾æ²¼æ³¢æ²«æ³•æ³“æ²¸æ³„æ²¹æ³�æ²®æ³—æ³…æ³±æ²¿æ²»æ³¡æ³›æ³Šæ²¬æ³¯æ³œæ³–æ³ "],
["aaa1","ç‚•ç‚Žç‚’ç‚Šç‚™çˆ¬çˆ­çˆ¸ç‰ˆç‰§ç‰©ç‹€ç‹Žç‹™ç‹—ç‹�çŽ©çŽ¨çŽŸçŽ«çŽ¥ç”½ç–�ç–™ç–šçš„ç›‚ç›²ç›´çŸ¥çŸ½ç¤¾ç¥€ç¥�ç§‰ç§ˆç©ºç©¹ç«ºç³¾ç½”ç¾Œç¾‹è€…è‚ºè‚¥è‚¢è‚±è‚¡è‚«è‚©è‚´è‚ªè‚¯è‡¥è‡¾èˆ�èŠ³èŠ�èŠ™èŠ­èŠ½èŠŸèŠ¹èŠ±èŠ¬èŠ¥èŠ¯èŠ¸èŠ£èŠ°èŠ¾èŠ·è™Žè™±åˆ�è¡¨è»‹è¿Žè¿”è¿‘é‚µé‚¸é‚±é‚¶é‡‡é‡‘é•·é–€é˜œé™€é˜¿é˜»é™„"],
["ab40","é™‚éš¹é›¨é�’é�žäºŸäº­äº®ä¿¡ä¾µä¾¯ä¾¿ä¿ ä¿‘ä¿�ä¿�ä¿ƒä¾¶ä¿˜ä¿Ÿä¿Šä¿—ä¾®ä¿�ä¿„ä¿‚ä¿šä¿Žä¿žä¾·å…—å†’å†‘å† å‰Žå‰ƒå‰Šå‰�å‰Œå‰‹å‰‡å‹‡å‹‰å‹ƒå‹�åŒ�å�—å�»åŽšå�›å’¬å“€å’¨å“Žå“‰å’¸å’¦å’³å“‡å“‚å’½å’ªå“�"],
["aba1","å“„å“ˆå’¯å’«å’±å’»å’©å’§å’¿å›¿åž‚åž‹åž åž£åž¢åŸŽåž®åž“å¥•å¥‘å¥�å¥Žå¥�å§œå§˜å§¿å§£å§¨å¨ƒå§¥å§ªå§šå§¦å¨�å§»å­©å®£å®¦å®¤å®¢å®¥å°�å±Žå±�å±�å±‹å³™å³’å··å¸�å¸¥å¸Ÿå¹½åº åº¦å»ºå¼ˆå¼­å½¥å¾ˆå¾…å¾Šå¾‹å¾‡å¾Œå¾‰æ€’æ€�æ€ æ€¥æ€Žæ€¨æ��æ�°æ�¨æ�¢æ�†æ�ƒæ�¬æ�«æ�ªæ�¤æ‰�æ‹œæŒ–æŒ‰æ‹¼æ‹­æŒ�æ‹®æ‹½æŒ‡æ‹±æ‹·"],
["ac40","æ‹¯æ‹¬æ‹¾æ‹´æŒ‘æŒ‚æ”¿æ•…æ–«æ–½æ—¢æ˜¥æ˜­æ˜ æ˜§æ˜¯æ˜Ÿæ˜¨æ˜±æ˜¤æ›·æŸ¿æŸ“æŸ±æŸ”æŸ�æŸ¬æž¶æž¯æŸµæŸ©æŸ¯æŸ„æŸ‘æž´æŸšæŸ¥æž¸æŸ�æŸžæŸ³æž°æŸ™æŸ¢æŸ�æŸ’æ­ªæ®ƒæ®†æ®µæ¯’æ¯—æ°Ÿæ³‰æ´‹æ´²æ´ªæµ�æ´¥æ´Œæ´±æ´žæ´—"],
["aca1","æ´»æ´½æ´¾æ´¶æ´›æ³µæ´¹æ´§æ´¸æ´©æ´®æ´µæ´Žæ´«ç‚«ç‚ºç‚³ç‚¬ç‚¯ç‚­ç‚¸ç‚®ç‚¤çˆ°ç‰²ç‰¯ç‰´ç‹©ç‹ ç‹¡çŽ·ç�ŠçŽ»çŽ²ç��ç�€çŽ³ç”šç”­ç•�ç•Œç•Žç•‹ç–«ç–¤ç–¥ç–¢ç–£ç™¸çš†çš‡çšˆç›ˆç›†ç›ƒç›…çœ�ç›¹ç›¸çœ‰çœ‹ç›¾ç›¼çœ‡çŸœç ‚ç ”ç Œç �ç¥†ç¥‰ç¥ˆç¥‡ç¦¹ç¦ºç§‘ç§’ç§‹ç©¿çª�ç«¿ç«½ç±½ç´‚ç´…ç´€ç´‰ç´‡ç´„ç´†ç¼¸ç¾Žç¾¿è€„"],
["ad40","è€�è€�è€‘è€¶èƒ–èƒ¥èƒšèƒƒèƒ„èƒŒèƒ¡èƒ›èƒŽèƒžèƒ¤èƒ�è‡´èˆ¢è‹§èŒƒèŒ…è‹£è‹›è‹¦èŒ„è‹¥èŒ‚èŒ‰è‹’è‹—è‹±èŒ�è‹œè‹”è‹‘è‹žè‹“è‹Ÿè‹¯èŒ†è™�è™¹è™»è™ºè¡�è¡«è¦�è§”è¨ˆè¨‚è¨ƒè²žè² èµ´èµ³è¶´è»�è»Œè¿°è¿¦è¿¢è¿ªè¿¥"],
["ada1","è¿­è¿«è¿¤è¿¨éƒŠéƒŽéƒ�éƒƒé…‹é…Šé‡�é–‚é™�é™‹é™Œé™�é�¢é�©éŸ‹éŸ­éŸ³é �é¢¨é£›é£Ÿé¦–é¦™ä¹˜äº³å€Œå€�å€£ä¿¯å€¦å€¥ä¿¸å€©å€–å€†å€¼å€Ÿå€šå€’å€‘ä¿ºå€€å€”å€¨ä¿±å€¡å€‹å€™å€˜ä¿³ä¿®å€­å€ªä¿¾å€«å€‰å…¼å†¤å†¥å†¢å‡�å‡Œå‡†å‡‹å‰–å‰œå‰”å‰›å‰�åŒªå�¿åŽŸåŽ�å�Ÿå“¨å”�å”�å”·å“¼å“¥å“²å”†å“ºå””å“©å“­å“¡å”‰å“®å“ª"],
["ae40","å“¦å”§å”‡å“½å”�åœƒåœ„åŸ‚åŸ”åŸ‹åŸƒå ‰å¤�å¥—å¥˜å¥šå¨‘å¨˜å¨œå¨Ÿå¨›å¨“å§¬å¨ å¨£å¨©å¨¥å¨Œå¨‰å­«å±˜å®°å®³å®¶å®´å®®å®µå®¹å®¸å°„å±‘å±•å±�å³­å³½å³»å³ªå³¨å³°å³¶å´�å³´å·®å¸­å¸«åº«åº­åº§å¼±å¾’å¾‘å¾�æ�™"],
["aea1","æ�£æ�¥æ��æ�•æ�­æ�©æ�¯æ‚„æ‚Ÿæ‚šæ‚�æ‚”æ‚Œæ‚…æ‚–æ‰‡æ‹³æŒˆæ‹¿æ�ŽæŒ¾æŒ¯æ�•æ�‚æ�†æ��æ�‰æŒºæ��æŒ½æŒªæŒ«æŒ¨æ��æ�Œæ•ˆæ•‰æ–™æ—�æ—…æ™‚æ™‰æ™�æ™ƒæ™’æ™Œæ™…æ™�æ›¸æœ”æœ•æœ—æ ¡æ ¸æ¡ˆæ¡†æ¡“æ ¹æ¡‚æ¡”æ ©æ¢³æ —æ¡Œæ¡‘æ ½æŸ´æ¡�æ¡€æ ¼æ¡ƒæ ªæ¡…æ “æ ˜æ¡�æ®Šæ®‰æ®·æ°£æ°§æ°¨æ°¦æ°¤æ³°æµªæ¶•æ¶ˆæ¶‡æµ¦æµ¸æµ·æµ™æ¶“"],
["af40","æµ¬æ¶‰æµ®æµšæµ´æµ©æ¶Œæ¶Šæµ¹æ¶…æµ¥æ¶”çƒŠçƒ˜çƒ¤çƒ™çƒˆçƒ�çˆ¹ç‰¹ç‹¼ç‹¹ç‹½ç‹¸ç‹·çŽ†ç�­ç�‰ç�®ç� ç�ªç�žç•”ç•�ç•œç•šç•™ç–¾ç—…ç—‡ç–²ç–³ç–½ç–¼ç–¹ç—‚ç–¸çš‹çš°ç›Šç›�ç›Žçœ©çœŸçœ çœ¨çŸ©ç °ç §ç ¸ç �ç ´ç ·"],
["afa1","ç ¥ç ­ç  ç Ÿç ²ç¥•ç¥�ç¥ ç¥Ÿç¥–ç¥žç¥�ç¥—ç¥šç§¤ç§£ç§§ç§Ÿç§¦ç§©ç§˜çª„çªˆç«™ç¬†ç¬‘ç²‰ç´¡ç´—ç´‹ç´Šç´ ç´¢ç´”ç´�ç´•ç´šç´œç´�ç´™ç´›ç¼ºç½Ÿç¾”ç¿…ç¿�è€†è€˜è€•è€™è€—è€½è€¿èƒ±è„‚èƒ°è„…èƒ­èƒ´è„†èƒ¸èƒ³è„ˆèƒ½è„Šèƒ¼èƒ¯è‡­è‡¬èˆ€èˆ�èˆªèˆ«èˆ¨èˆ¬èŠ»èŒ«è�’è�”è�ŠèŒ¸è��è�‰èŒµèŒ´è��èŒ²èŒ¹èŒ¶èŒ—è�€èŒ±èŒ¨è�ƒ"],
["b040","è™”èšŠèšªèš“èš¤èš©èšŒèš£èšœè¡°è¡·è¢�è¢‚è¡½è¡¹è¨˜è¨�è¨Žè¨Œè¨•è¨Šè¨—è¨“è¨–è¨�è¨‘è±ˆè±ºè±¹è²¡è²¢èµ·èº¬è»’è»”è»�è¾±é€�é€†è¿·é€€è¿ºè¿´é€ƒè¿½é€…è¿¸é‚•éƒ¡éƒ�éƒ¢é…’é…�é…Œé‡˜é‡�é‡—é‡œé‡™é–ƒé™¢é™£é™¡"],
["b0a1","é™›é™�é™¤é™˜é™žéš»é£¢é¦¬éª¨é«˜é¬¥é¬²é¬¼ä¹¾å�ºå�½å�œå�‡å�ƒå�Œå�šå�‰å�¥å�¶å�Žå�•å�µå�´å�·å��å€�å�¯å�­å…œå†•å‡°å‰ªå‰¯å‹’å‹™å‹˜å‹•åŒ�åŒ�åŒ™åŒ¿å�€åŒ¾å�ƒæ›¼å•†å•ªå•¦å•„å•žå•¡å•ƒå•Šå”±å•–å•�å••å”¯å•¤å”¸å”®å•œå”¬å•£å”³å•�å•—åœˆåœ‹åœ‰åŸŸå …å Šå †åŸ åŸ¤åŸºå ‚å µåŸ·åŸ¹å¤ å¥¢å¨¶å©�å©‰å©¦å©ªå©€"],
["b140","å¨¼å©¢å©šå©†å©Šå­°å¯‡å¯…å¯„å¯‚å®¿å¯†å°‰å°ˆå°‡å± å±œå±�å´‡å´†å´Žå´›å´–å´¢å´‘å´©å´”å´™å´¤å´§å´—å·¢å¸¸å¸¶å¸³å¸·åº·åº¸åº¶åºµåº¾å¼µå¼·å½—å½¬å½©å½«å¾—å¾™å¾žå¾˜å¾¡å¾ å¾œæ�¿æ‚£æ‚‰æ‚ æ‚¨æƒ‹æ‚´æƒ¦æ‚½"],
["b1a1","æƒ…æ‚»æ‚µæƒœæ‚¼æƒ˜æƒ•æƒ†æƒŸæ‚¸æƒšæƒ‡æˆšæˆ›æ‰ˆæŽ æŽ§æ�²æŽ–æŽ¢æŽ¥æ�·æ�§æŽ˜æŽªæ�±æŽ©æŽ‰æŽƒæŽ›æ�«æŽ¨æŽ„æŽˆæŽ™æŽ¡æŽ¬æŽ’æŽ�æŽ€æ�»æ�©æ�¨æ�ºæ•�æ•–æ•‘æ•™æ•—å•Ÿæ•�æ•˜æ••æ•”æ–œæ–›æ–¬æ—�æ—‹æ—Œæ—Žæ™�æ™šæ™¤æ™¨æ™¦æ™žæ›¹å‹—æœ›æ¢�æ¢¯æ¢¢æ¢“æ¢µæ¡¿æ¡¶æ¢±æ¢§æ¢—æ¢°æ¢ƒæ£„æ¢­æ¢†æ¢…æ¢”æ¢�æ¢¨æ¢Ÿæ¢¡æ¢‚æ¬²æ®º"],
["b240","æ¯«æ¯¬æ°«æ¶Žæ¶¼æ·³æ·™æ¶²æ·¡æ·Œæ·¤æ·»æ·ºæ¸…æ·‡æ·‹æ¶¯æ·‘æ¶®æ·žæ·¹æ¶¸æ··æ·µæ·…æ·’æ¸šæ¶µæ·šæ·«æ·˜æ·ªæ·±æ·®æ·¨æ·†æ·„æ¶ªæ·¬æ¶¿æ·¦çƒ¹ç„‰ç„Šçƒ½çƒ¯çˆ½ç‰½çŠ�çŒœçŒ›çŒ–çŒ“çŒ™çŽ‡ç�…ç�Šç�ƒç�†ç�¾ç��ç“ ç“¶"],
["b2a1","ç“·ç”œç”¢ç•¥ç•¦ç•¢ç•°ç–�ç—”ç—•ç–µç—Šç—�çšŽç›”ç›’ç››çœ·çœ¾çœ¼çœ¶çœ¸çœºç¡«ç¡ƒç¡Žç¥¥ç¥¨ç¥­ç§»çª’çª•ç¬ ç¬¨ç¬›ç¬¬ç¬¦ç¬™ç¬žç¬®ç²’ç²—ç²•çµ†çµƒçµ±ç´®ç´¹ç´¼çµ€ç´°ç´³çµ„ç´¯çµ‚ç´²ç´±ç¼½ç¾žç¾šç¿Œç¿Žç¿’è€œè�Šè�†è„¯è„–è„£è„«è„©è„°è„¤èˆ‚èˆµèˆ·èˆ¶èˆ¹èŽŽèŽžèŽ˜è�¸èŽ¢èŽ–èŽ½èŽ«èŽ’èŽŠèŽ“èŽ‰èŽ è�·è�»è�¼"],
["b340","èŽ†èŽ§è™•å½ªè›‡è›€èš¶è›„èšµè›†è›‹èš±èš¯è›‰è¡“è¢žè¢ˆè¢«è¢’è¢–è¢�è¢‹è¦“è¦�è¨ªè¨�è¨£è¨¥è¨±è¨­è¨Ÿè¨›è¨¢è±‰è±šè²©è²¬è²«è²¨è²ªè²§èµ§èµ¦è¶¾è¶ºè»›è»Ÿé€™é€�é€šé€—é€£é€Ÿé€�é€�é€•é€žé€ é€�é€¢é€–é€›é€”"],
["b3a1","éƒ¨éƒ­éƒ½é…—é‡Žé‡µé‡¦é‡£é‡§é‡­é‡©é–‰é™ªé™µé™³é™¸é™°é™´é™¶é™·é™¬é›€é›ªé›©ç« ç«Ÿé ‚é ƒé­šé³¥é¹µé¹¿éº¥éº»å‚¢å‚�å‚…å‚™å‚‘å‚€å‚–å‚˜å‚šæœ€å‡±å‰²å‰´å‰µå‰©å‹žå‹�å‹›å�šåŽ¥å•»å–€å–§å•¼å–Šå–�å–˜å–‚å–œå–ªå–”å–‡å–‹å–ƒå–³å–®å–Ÿå”¾å–²å–šå–»å–¬å–±å•¾å–‰å–«å–™åœ�å ¯å ªå ´å ¤å °å ±å ¡å �å  å£¹å£ºå¥ "],
["b440","å©·åªšå©¿åª’åª›åª§å­³å­±å¯’å¯Œå¯“å¯�å°Šå°‹å°±åµŒåµ�å´´åµ‡å·½å¹…å¸½å¹€å¹ƒå¹¾å»Šå»�å»‚å»„å¼¼å½­å¾©å¾ªå¾¨æƒ‘æƒ¡æ‚²æ‚¶æƒ æ„œæ„£æƒºæ„•æƒ°æƒ»æƒ´æ…¨æƒ±æ„Žæƒ¶æ„‰æ„€æ„’æˆŸæ‰‰æŽ£æŽŒæ��æ�€æ�©æ�‰æ�†æ��"],
["b4a1","æ�’æ�£æ��æ�¡æ�–æ�­æ�®æ�¶æ�´æ�ªæ�›æ‘’æ�šæ�¹æ•žæ•¦æ•¢æ•£æ–‘æ–�æ–¯æ™®æ™°æ™´æ™¶æ™¯æš‘æ™ºæ™¾æ™·æ›¾æ›¿æœŸæœ�æ£ºæ£•æ£ æ£˜æ£—æ¤…æ£Ÿæ£µæ£®æ£§æ£¹æ£’æ£²æ££æ£‹æ£�æ¤�æ¤’æ¤Žæ£‰æ£šæ¥®æ£»æ¬¾æ¬ºæ¬½æ®˜æ®–æ®¼æ¯¯æ°®æ°¯æ°¬æ¸¯æ¸¸æ¹”æ¸¡æ¸²æ¹§æ¹Šæ¸ æ¸¥æ¸£æ¸›æ¹›æ¹˜æ¸¤æ¹–æ¹®æ¸­æ¸¦æ¹¯æ¸´æ¹�æ¸ºæ¸¬æ¹ƒæ¸�æ¸¾æ»‹"],
["b540","æº‰æ¸™æ¹Žæ¹£æ¹„æ¹²æ¹©æ¹Ÿç„™ç„šç„¦ç„°ç„¡ç„¶ç…®ç„œç‰ŒçŠ„çŠ€çŒ¶çŒ¥çŒ´çŒ©ç�ºç�ªç�³ç�¢ç�¥ç�µç�¶ç�´ç�¯ç�›ç�¦ç�¨ç”¥ç”¦ç•«ç•ªç—¢ç—›ç—£ç—™ç—˜ç—žç— ç™»ç™¼çš–çš“çš´ç›œç��çŸ­ç¡�ç¡¬ç¡¯ç¨�ç¨ˆç¨‹ç¨…ç¨€çª˜"],
["b5a1","çª—çª–ç«¥ç«£ç­‰ç­–ç­†ç­�ç­’ç­”ç­�ç­‹ç­�ç­‘ç²Ÿç²¥çµžçµ�çµ¨çµ•ç´«çµ®çµ²çµ¡çµ¦çµ¢çµ°çµ³å–„ç¿”ç¿•è€‹è�’è‚…è…•è…”è…‹è…‘è…Žè„¹è…†è„¾è…Œè…“è…´èˆ’èˆœè�©è�ƒè�¸è��è� è�…è�‹è��è�¯è�±è�´è‘—è�Šè�°è�Œè�Œè�½è�²è�Šè�¸è�Žè�„è�œè�‡è�”è�Ÿè™›è›Ÿè›™è›­è›”è››è›¤è›�è›žè¡—è£�è£‚è¢±è¦ƒè¦–è¨»è© è©•è©žè¨¼è©�"],
["b640","è©”è©›è©�è©†è¨´è¨ºè¨¶è©–è±¡è²‚è²¯è²¼è²³è²½è³�è²»è³€è²´è²·è²¶è²¿è²¸è¶Šè¶…è¶�è·Žè·�è·‹è·šè·‘è·Œè·›è·†è»»è»¸è»¼è¾œé€®é€µé€±é€¸é€²é€¶é„‚éƒµé„‰éƒ¾é…£é…¥é‡�éˆ”éˆ•éˆ£éˆ‰éˆžéˆ�éˆ�éˆ‡éˆ‘é–”é–�é–‹é–‘"],
["b6a1","é–“é–’é–ŽéšŠéšŽéš‹é™½éš…éš†éš�é™²éš„é›�é›…é›„é›†é›‡é›¯é›²éŸŒé …é †é ˆé£§é£ªé£¯é£©é£²é£­é¦®é¦­é»ƒé»�é»‘äº‚å‚­å‚µå‚²å‚³åƒ…å‚¾å‚¬å‚·å‚»å‚¯åƒ‡å‰¿å‰·å‰½å‹Ÿå‹¦å‹¤å‹¢å‹£åŒ¯å—Ÿå—¨å—“å—¦å—Žå—œå—‡å—‘å—£å—¤å—¯å—šå—¡å—…å—†å—¥å—‰åœ’åœ“å¡žå¡‘å¡˜å¡—å¡šå¡”å¡«å¡Œå¡­å¡Šå¡¢å¡’å¡‹å¥§å«�å«‰å«Œåª¾åª½åª¼"],
["b740","åª³å«‚åª²åµ©åµ¯å¹Œå¹¹å»‰å»ˆå¼’å½™å¾¬å¾®æ„šæ„�æ…ˆæ„Ÿæƒ³æ„›æƒ¹æ„�æ„ˆæ…Žæ…Œæ…„æ…�æ„¾æ„´æ„§æ„�æ„†æ„·æˆ¡æˆ¢æ�“æ�¾æ�žæ�ªæ�­æ�½æ�¬æ��æ�œæ�”æ��æ�¶æ�–æ�—æ�†æ•¬æ–Ÿæ–°æš—æš‰æš‡æšˆæš–æš„æš˜æš�æœƒæ¦”æ¥­"],
["b7a1","æ¥šæ¥·æ¥ æ¥”æ¥µæ¤°æ¦‚æ¥Šæ¥¨æ¥«æ¥žæ¥“æ¥¹æ¦†æ¥�æ¥£æ¥›æ­‡æ­²æ¯€æ®¿æ¯“æ¯½æº¢æº¯æ»“æº¶æ»‚æº�æº�æ»‡æ»…æº¥æº˜æº¼æººæº«æ»‘æº–æºœæ»„æ»”æºªæº§æº´ç…Žç…™ç…©ç…¤ç…‰ç…§ç…œç…¬ç…¦ç…Œç…¥ç…žç…†ç…¨ç…–çˆºç‰’çŒ·ç�…çŒ¿çŒ¾ç‘¯ç‘šç‘•ç‘Ÿç‘žç‘�ç�¿ç‘™ç‘›ç‘œç•¶ç•¸ç˜€ç—°ç˜�ç—²ç—±ç—ºç—¿ç—´ç—³ç›žç›Ÿç�›ç�«ç�¦ç�žç�£"],
["b840","ç�¹ç�ªç�¬ç�œç�¥ç�¨ç�¢çŸ®ç¢Žç¢°ç¢—ç¢˜ç¢Œç¢‰ç¡¼ç¢‘ç¢“ç¡¿ç¥ºç¥¿ç¦�è�¬ç¦½ç¨œç¨šç¨ ç¨”ç¨Ÿç¨žçªŸçª ç­·ç¯€ç­ ç­®ç­§ç²±ç²³ç²µç¶“çµ¹ç¶‘ç¶�ç¶�çµ›ç½®ç½©ç½ªç½²ç¾©ç¾¨ç¾¤è�–è�˜è‚†è‚„è…±è…°è…¸è…¥è…®è…³è…«"],
["b8a1","è…¹è…ºè…¦èˆ…è‰‡è’‚è‘·è�½è�±è‘µè‘¦è‘«è‘‰è‘¬è‘›è�¼è�µè‘¡è‘£è‘©è‘­è‘†è™žè™œè™Ÿè›¹èœ“èœˆèœ‡èœ€è›¾è›»èœ‚èœƒèœ†èœŠè¡™è£Ÿè£”è£™è£œè£˜è£�è£¡è£Šè£•è£’è¦œè§£è©«è©²è©³è©¦è©©è©°èª‡è©¼è©£èª è©±èª…è©­è©¢è©®è©¬è©¹è©»è¨¾è©¨è±¢è²Šè²‰è³Šè³‡è³ˆè³„è²²è³ƒè³‚è³…è·¡è·Ÿè·¨è·¯è·³è·ºè·ªè·¤è·¦èº²è¼ƒè¼‰è»¾è¼Š"],
["b940","è¾Ÿè¾²é�‹é�Šé�“é�‚é�”é€¼é�•é��é�‡é��é�Žé��é�‘é€¾é��é„’é„—é…¬é…ªé…©é‡‰éˆ·é‰—éˆ¸éˆ½é‰€éˆ¾é‰›é‰‹é‰¤é‰‘éˆ´é‰‰é‰�é‰…éˆ¹éˆ¿é‰šé–˜éš˜éš”éš•é›�é›‹é›‰é›Šé›·é›»é›¹é›¶é�–é�´é�¶é �é ‘é “é Šé ’é Œé£¼é£´"],
["b9a1","é£½é£¾é¦³é¦±é¦´é«¡é³©éº‚é¼Žé¼“é¼ åƒ§åƒ®åƒ¥åƒ–åƒ­åƒšåƒ•åƒ�åƒ‘åƒ±åƒŽåƒ©å…¢å‡³åŠƒåŠ‚åŒ±åŽ­å—¾å˜€å˜›å˜—å—½å˜”å˜†å˜‰å˜�å˜Žå—·å˜–å˜Ÿå˜ˆå˜�å—¶åœ˜åœ–å¡µå¡¾å¢ƒå¢“å¢Šå¡¹å¢…å¡½å£½å¤¥å¤¢å¤¤å¥ªå¥©å«¡å«¦å«©å«—å«–å«˜å«£å­µå¯žå¯§å¯¡å¯¥å¯¦å¯¨å¯¢å¯¤å¯Ÿå°�å±¢å¶„å¶‡å¹›å¹£å¹•å¹—å¹”å»“å»–å¼Šå½†å½°å¾¹æ…‡"],
["ba40","æ„¿æ…‹æ…·æ…¢æ…£æ…Ÿæ…šæ…˜æ…µæˆªæ’‡æ‘˜æ‘”æ’¤æ‘¸æ‘Ÿæ‘ºæ‘‘æ‘§æ�´æ‘­æ‘»æ•²æ–¡æ——æ—–æš¢æš¨æš�æ¦œæ¦¨æ¦•æ§�æ¦®æ§“æ§‹æ¦›æ¦·æ¦»æ¦«æ¦´æ§�æ§�æ¦­æ§Œæ¦¦æ§ƒæ¦£æ­‰æ­Œæ°³æ¼³æ¼”æ»¾æ¼“æ»´æ¼©æ¼¾æ¼ æ¼¬æ¼�æ¼‚æ¼¢"],
["baa1","æ»¿æ»¯æ¼†æ¼±æ¼¸æ¼²æ¼£æ¼•æ¼«æ¼¯æ¾ˆæ¼ªæ»¬æ¼�æ»²æ»Œæ»·ç†”ç†™ç…½ç†Šç†„ç†’çˆ¾çŠ’çŠ–ç�„ç��ç‘¤ç‘£ç‘ªç‘°ç‘­ç”„ç–‘ç˜§ç˜�ç˜‹ç˜‰ç˜“ç›¡ç›£çž„ç�½ç�¿ç�¡ç£�ç¢Ÿç¢§ç¢³ç¢©ç¢£ç¦Žç¦�ç¦�ç¨®ç¨±çªªçª©ç«­ç«¯ç®¡ç®•ç®‹ç­µç®—ç®�ç®”ç®�ç®¸ç®‡ç®„ç²¹ç²½ç²¾ç¶»ç¶°ç¶œç¶½ç¶¾ç¶ ç·Šç¶´ç¶²ç¶±ç¶ºç¶¢ç¶¿ç¶µç¶¸ç¶­ç·’ç·‡ç¶¬"],
["bb40","ç½°ç¿ ç¿¡ç¿Ÿè�žè�šè‚‡è…�è†€è†�è†ˆè†Šè…¿è†‚è‡§è‡ºèˆ‡èˆ”èˆžè‰‹è“‰è’¿è“†è“„è’™è’žè’²è’œè“‹è’¸è“€è““è’�è’¼è“‘è“Šèœ¿èœœèœ»èœ¢èœ¥èœ´èœ˜è�•èœ·èœ©è£³è¤‚è£´è£¹è£¸è£½è£¨è¤šè£¯èª¦èªŒèªžèª£èª�èª¡èª“èª¤"],
["bba1","èªªèª¥èª¨èª˜èª‘èªšèª§è±ªè²�è²Œè³“è³‘è³’èµ«è¶™è¶•è·¼è¼”è¼’è¼•è¼“è¾£é� é�˜é�œé�£é�™é�žé�¢é��é�›é„™é„˜é„žé…µé…¸é…·é…´é‰¸éŠ€éŠ…éŠ˜éŠ–é‰»éŠ“éŠœéŠ¨é‰¼éŠ‘é–¡é–¨é–©é–£é–¥é–¤éš™éšœéš›é›Œé›’éœ€é�¼éž…éŸ¶é —é ˜é¢¯é¢±é¤ƒé¤…é¤Œé¤‰é§�éª¯éª°é«¦é­�é­‚é³´é³¶é³³éº¼é¼»é½Šå„„å„€åƒ»åƒµåƒ¹å„‚å„ˆå„‰å„…å‡œ"],
["bc40","åŠ‡åŠˆåŠ‰åŠ�åŠŠå‹°åŽ²å˜®å˜»å˜¹å˜²å˜¿å˜´å˜©å™“å™Žå™—å™´å˜¶å˜¯å˜°å¢€å¢Ÿå¢žå¢³å¢œå¢®å¢©å¢¦å¥­å¬‰å«»å¬‹å«µå¬Œå¬ˆå¯®å¯¬å¯©å¯«å±¤å±¥å¶�å¶”å¹¢å¹Ÿå¹¡å»¢å»šå»Ÿå»�å»£å» å½ˆå½±å¾·å¾µæ…¶æ…§æ…®æ…�æ…•æ†‚"],
["bca1","æ…¼æ…°æ…«æ…¾æ†§æ†�æ†«æ†Žæ†¬æ†šæ†¤æ†”æ†®æˆ®æ‘©æ‘¯æ‘¹æ’žæ’²æ’ˆæ’�æ’°æ’¥æ’“æ’•æ’©æ’’æ’®æ’­æ’«æ’šæ’¬æ’™æ’¢æ’³æ•µæ•·æ•¸æš®æš«æš´æš±æ¨£æ¨Ÿæ§¨æ¨�æ¨žæ¨™æ§½æ¨¡æ¨“æ¨Šæ§³æ¨‚æ¨…æ§­æ¨‘æ­�æ­Žæ®¤æ¯…æ¯†æ¼¿æ½¼æ¾„æ½‘æ½¦æ½”æ¾†æ½­æ½›æ½¸æ½®æ¾Žæ½ºæ½°æ½¤æ¾—æ½˜æ»•æ½¯æ½ æ½Ÿç†Ÿç†¬ç†±ç†¨ç‰–çŠ›ç�Žç�—ç‘©ç’‹ç’ƒ"],
["bd40","ç‘¾ç’€ç•¿ç˜ ç˜©ç˜Ÿç˜¤ç˜¦ç˜¡ç˜¢çššçšºç›¤çžŽçž‡çžŒçž‘çž‹ç£‹ç£…ç¢ºç£Šç¢¾ç£•ç¢¼ç£�ç¨¿ç¨¼ç©€ç¨½ç¨·ç¨»çª¯çª®ç®­ç®±ç¯„ç®´ç¯†ç¯‡ç¯�ç® ç¯Œç³Šç· ç·´ç·¯ç·»ç·˜ç·¬ç·�ç·¨ç·£ç·šç·žç·©ç¶žç·™ç·²ç·¹ç½µç½·ç¾¯"],
["bda1","ç¿©è€¦è†›è†œè†�è† è†šè†˜è”—è”½è”šè“®è”¬è”­è”“è”‘è”£è”¡è””è“¬è”¥è“¿è”†èž‚è�´è�¶è� è�¦è�¸è�¨è�™è�—è�Œè�“è¡›è¡�è¤�è¤‡è¤’è¤“è¤•è¤Šèª¼è«’è«‡è«„èª•è«‹è«¸èª²è«‰è«‚èª¿èª°è«–è«�èª¶èª¹è«›è±Œè±Žè±¬è³ è³žè³¦è³¤è³¬è³­è³¢è³£è³œè³ªè³¡èµ­è¶Ÿè¶£è¸«è¸�è¸�è¸¢è¸�è¸©è¸Ÿè¸¡è¸žèººè¼�è¼›è¼Ÿè¼©è¼¦è¼ªè¼œè¼ž"],
["be40","è¼¥é�©é�®é�¨é�­é�·é„°é„­é„§é„±é†‡é†‰é†‹é†ƒé‹…éŠ»éŠ·é‹ªéŠ¬é‹¤é‹�éŠ³éŠ¼é‹’é‹‡é‹°éŠ²é–­é–±éœ„éœ†éœ‡éœ‰é� éž�éž‹éž�é ¡é «é œé¢³é¤Šé¤“é¤’é¤˜é§�é§�é§Ÿé§›é§‘é§•é§’é§™éª·é«®é«¯é¬§é­…é­„é­·é­¯é´†é´‰"],
["bea1","é´ƒéº©éº¾é»Žå¢¨é½’å„’å„˜å„”å„�å„•å†€å†ªå‡�åŠ‘åŠ“å‹³å™™å™«å™¹å™©å™¤å™¸å™ªå™¨å™¥å™±å™¯å™¬å™¢å™¶å£�å¢¾å£‡å£…å¥®å¬�å¬´å­¸å¯°å°Žå½Šæ†²æ†‘æ†©æ†Šæ‡�æ†¶æ†¾æ‡Šæ‡ˆæˆ°æ“…æ“�æ“‹æ’»æ’¼æ“šæ“„æ“‡æ“‚æ“�æ’¿æ“’æ“”æ’¾æ•´æ›†æ›‰æš¹æ›„æ›‡æš¸æ¨½æ¨¸æ¨ºæ©™æ©«æ©˜æ¨¹æ©„æ©¢æ©¡æ©‹æ©‡æ¨µæ©Ÿæ©ˆæ­™æ­·æ°…æ¿‚æ¾±æ¾¡"],
["bf40","æ¿ƒæ¾¤æ¿�æ¾§æ¾³æ¿€æ¾¹æ¾¶æ¾¦æ¾ æ¾´ç†¾ç‡‰ç‡�ç‡’ç‡ˆç‡•ç†¹ç‡Žç‡™ç‡œç‡ƒç‡„ç�¨ç’œç’£ç’˜ç’Ÿç’žç“¢ç”Œç”�ç˜´ç˜¸ç˜ºç›§ç›¥çž çžžçžŸçž¥ç£¨ç£šç£¬ç£§ç¦¦ç©�ç©Žç©†ç©Œç©‹çªºç¯™ç°‘ç¯‰ç¯¤ç¯›ç¯¡ç¯©ç¯¦ç³•ç³–ç¸Š"],
["bfa1","ç¸‘ç¸ˆç¸›ç¸£ç¸žç¸�ç¸‰ç¸�ç½¹ç¾²ç¿°ç¿±ç¿®è€¨è†³è†©è†¨è‡»èˆˆè‰˜è‰™è•Šè•™è•ˆè•¨è•©è•ƒè•‰è•­è•ªè•žèžƒèžŸèžžèž¢èž�è¡¡è¤ªè¤²è¤¥è¤«è¤¡è¦ªè¦¦è«¦è«ºè««è«±è¬€è«œè«§è«®è«¾è¬�è¬‚è«·è«­è«³è«¶è«¼è±«è±­è²“è³´è¹„è¸±è¸´è¹‚è¸¹è¸µè¼»è¼¯è¼¸è¼³è¾¨è¾¦é�µé�´é�¸é�²é�¼é�ºé„´é†’éŒ éŒ¶é‹¸éŒ³éŒ¯éŒ¢é‹¼éŒ«éŒ„éŒš"],
["c040","éŒ�éŒ¦éŒ¡éŒ•éŒ®éŒ™é–»éš§éš¨éšªé›•éœŽéœ‘éœ–éœ�éœ“éœ�é�›é�œé�¦éž˜é °é ¸é »é ·é ­é ¹é ¤é¤�é¤¨é¤žé¤›é¤¡é¤šé§­é§¢é§±éª¸éª¼é«»é«­é¬¨é®‘é´•é´£é´¦é´¨é´’é´›é»˜é»”é¾�é¾œå„ªå„Ÿå„¡å„²å‹µåšŽåš€åš�åš…åš‡"],
["c0a1","åš�å£•å£“å£‘å£Žå¬°å¬ªå¬¤å­ºå°·å±¨å¶¼å¶ºå¶½å¶¸å¹«å½Œå¾½æ‡‰æ‡‚æ‡‡æ‡¦æ‡‹æˆ²æˆ´æ“Žæ“Šæ“˜æ“ æ“°æ“¦æ“¬æ“±æ“¢æ“­æ–‚æ–ƒæ›™æ›–æª€æª”æª„æª¢æªœæ«›æª£æ©¾æª—æª�æª æ­œæ®®æ¯šæ°ˆæ¿˜æ¿±æ¿Ÿæ¿ æ¿›æ¿¤æ¿«æ¿¯æ¾€æ¿¬æ¿¡æ¿©æ¿•æ¿®æ¿°ç‡§ç‡Ÿç‡®ç‡¦ç‡¥ç‡­ç‡¬ç‡´ç‡ çˆµç‰†ç�°ç�²ç’©ç’°ç’¦ç’¨ç™†ç™‚ç™Œç›ªçž³çžªçž°çž¬"],
["c140","çž§çž­çŸ¯ç£·ç£ºç£´ç£¯ç¤�ç¦§ç¦ªç©—çª¿ç°‡ç°�ç¯¾ç¯·ç°Œç¯ ç³ ç³œç³žç³¢ç³Ÿç³™ç³�ç¸®ç¸¾ç¹†ç¸·ç¸²ç¹ƒç¸«ç¸½ç¸±ç¹…ç¹�ç¸´ç¸¹ç¹ˆç¸µç¸¿ç¸¯ç½„ç¿³ç¿¼è�±è�²è�°è�¯è�³è‡†è‡ƒè†ºè‡‚è‡€è†¿è†½è‡‰è†¾è‡¨èˆ‰è‰±è–ª"],
["c1a1","è–„è•¾è–œè–‘è–”è–¯è–›è–‡è–¨è–Šè™§èŸ€èŸ‘èž³èŸ’èŸ†èž«èž»èžºèŸˆèŸ‹è¤»è¤¶è¥„è¤¸è¤½è¦¬è¬Žè¬—è¬™è¬›è¬Šè¬ è¬�è¬„è¬�è±�è°¿è±³è³ºè³½è³¼è³¸è³»è¶¨è¹‰è¹‹è¹ˆè¹Šè½„è¼¾è½‚è½…è¼¿é�¿é�½é‚„é‚�é‚‚é‚€é„¹é†£é†žé†œé��éŽ‚éŒ¨é�µé�Šé�¥é�‹éŒ˜é�¾é�¬é�›é�°é�šé�”é—Šé—‹é—Œé—ˆé—†éš±éš¸é›–éœœéœžéž éŸ“é¡†é¢¶é¤µé¨�"],
["c240","é§¿é®®é®«é®ªé®­é´»é´¿éº‹é»�é»žé»œé»�é»›é¼¾é½‹å�¢åš•åš®å£™å£˜å¬¸å½�æ‡£æˆ³æ“´æ“²æ“¾æ”†æ“ºæ“»æ“·æ–·æ›œæœ¦æª³æª¬æ«ƒæª»æª¸æ«‚æª®æª¯æ­Ÿæ­¸æ®¯ç€‰ç€‹æ¿¾ç€†æ¿ºç€‘ç€�ç‡»ç‡¼ç‡¾ç‡¸ç�·ç�µç’§ç’¿ç”•ç™–ç™˜"],
["c2a1","ç™’çž½çž¿çž»çž¼ç¤Žç¦®ç©¡ç©¢ç© ç«„ç«…ç°«ç°§ç°ªç°žç°£ç°¡ç³§ç¹”ç¹•ç¹žç¹šç¹¡ç¹’ç¹™ç½ˆç¿¹ç¿»è�·è�¶è‡�è‡�èˆŠè—�è–©è—�è—�è—‰è–°è–ºè–¹è–¦èŸ¯èŸ¬èŸ²èŸ è¦†è¦²è§´è¬¨è¬¹è¬¬è¬«è±�è´…è¹™è¹£è¹¦è¹¤è¹Ÿè¹•è»€è½‰è½�é‚‡é‚ƒé‚ˆé†«é†¬é‡�éŽ”éŽŠéŽ–éŽ¢éŽ³éŽ®éŽ¬éŽ°éŽ˜éŽšéŽ—é—”é—–é—�é—•é›¢é›œé›™é››é›žéœ¤éž£éž¦"],
["c340","éž­éŸ¹é¡�é¡�é¡Œé¡Žé¡“é¢ºé¤¾é¤¿é¤½é¤®é¦¥é¨Žé«�é¬ƒé¬†é­�é­Žé­�é¯Šé¯‰é¯½é¯ˆé¯€éµ‘éµ�éµ é» é¼•é¼¬å„³åš¥å£žå£Ÿå£¢å¯µé¾�å»¬æ‡²æ‡·æ‡¶æ‡µæ”€æ”�æ› æ›�æ«¥æ«�æ«šæ«“ç€›ç€Ÿç€¨ç€šç€�ç€•ç€˜çˆ†çˆ�ç‰˜çŠ¢ç�¸"],
["c3a1","ç�ºç’½ç“Šç“£ç–‡ç–†ç™Ÿç™¡çŸ‡ç¤™ç¦±ç©«ç©©ç°¾ç°¿ç°¸ç°½ç°·ç±€ç¹«ç¹­ç¹¹ç¹©ç¹ªç¾…ç¹³ç¾¶ç¾¹ç¾¸è‡˜è—©è—�è—ªè—•è—¤è—¥è—·èŸ»è …è �èŸ¹èŸ¾è¥ è¥Ÿè¥–è¥žè­�è­œè­˜è­‰è­šè­Žè­�è­†è­™è´ˆè´Šè¹¼è¹²èº‡è¹¶è¹¬è¹ºè¹´è½”è½Žè¾­é‚Šé‚‹é†±é†®é�¡é�‘é�Ÿé�ƒé�ˆé�œé��é�–é�¢é��é�˜é�¤é�—é�¨é—œéš´é›£éœªéœ§é�¡éŸœéŸ»é¡ž"],
["c440","é¡˜é¡›é¢¼é¥…é¥‰é¨–é¨™é¬�é¯¨é¯§é¯–é¯›é¶‰éµ¡éµ²éµªéµ¬éº’éº—éº“éº´å‹¸åš¨åš·åš¶åš´åš¼å£¤å­€å­ƒå­½å¯¶å·‰æ‡¸æ‡ºæ”˜æ””æ”™æ›¦æœ§æ«¬ç€¾ç€°ç€²çˆ�ç�»ç“�ç™¢ç™¥ç¤¦ç¤ªç¤¬ç¤«ç«‡ç«¶ç±Œç±ƒç±�ç³¯ç³°è¾®ç¹½ç¹¼"],
["c4a1","çº‚ç½Œè€€è‡šè‰¦è—»è—¹è˜‘è—ºè˜†è˜‹è˜‡è˜Šè ”è •è¥¤è¦ºè§¸è­°è­¬è­¦è­¯è­Ÿè­«è´�è´�èº‰èº�èº…èº‚é†´é‡‹é�˜é�ƒé�½é—¡éœ°é£„é¥’é¥‘é¦¨é¨«é¨°é¨·é¨µé°“é°�é¹¹éºµé»¨é¼¯é½Ÿé½£é½¡å„·å„¸å›�å›€å›‚å¤”å±¬å·�æ‡¼æ‡¾æ”�æ”œæ–•æ›©æ«»æ¬„æ«ºæ®²ç�Œçˆ›çŠ§ç“–ç“”ç™©çŸ“ç±�çº�çºŒç¾¼è˜—è˜­è˜šè £è ¢è ¡è Ÿè¥ªè¥¬è¦½è­´"],
["c540","è­·è­½è´“èºŠèº�èº‹è½Ÿè¾¯é†ºé�®é�³é�µé�ºé�¸é�²é�«é—¢éœ¸éœ¹éœ²éŸ¿é¡§é¡¥é¥—é©…é©ƒé©€é¨¾é«�é­”é­‘é°­é°¥é¶¯é¶´é·‚é¶¸éº�é»¯é¼™é½œé½¦é½§å„¼å„»å›ˆå›Šå›‰å­¿å·”å·’å½Žæ‡¿æ”¤æ¬Šæ­¡ç�‘ç�˜çŽ€ç“¤ç–Šç™®ç™¬"],
["c5a1","ç¦³ç± ç±Ÿè�¾è�½è‡Ÿè¥²è¥¯è§¼è®€è´–è´—èº‘èº“è½¡é…ˆé‘„é‘‘é‘’éœ½éœ¾éŸƒéŸ�é¡«é¥•é©•é©�é«’é¬šé±‰é°±é°¾é°»é·“é·—é¼´é½¬é½ªé¾”å›Œå·–æˆ€æ”£æ”«æ”ªæ›¬æ¬�ç“šç«Šç±¤ç±£ç±¥çº“çº–çº”è‡¢è˜¸è˜¿è ±è®Šé‚�é‚�é‘£é‘ é‘¤é�¨é¡¯é¥œé©šé©›é©—é«“é«”é«‘é±”é±—é±–é·¥éºŸé»´å›‘å£©æ”¬ç�žç™±ç™²çŸ—ç½�ç¾ˆè ¶è ¹è¡¢è®“è®’"],
["c640","è®–è‰·è´›é‡€é‘ªé�‚é�ˆé�„éŸ†é¡°é©Ÿé¬¢é­˜é±Ÿé·¹é·ºé¹¼é¹½é¼‡é½·é½²å»³æ¬–ç�£ç±¬ç±®è »è§€èº¡é‡�é‘²é‘°é¡±é¥žé«–é¬£é»Œç�¤çŸšè®šé‘·éŸ‰é©¢é©¥çºœè®œèºªé‡…é‘½é‘¾é‘¼é±·é±¸é»·è±”é‘¿é¸šçˆ¨é©ªé¬±é¸›é¸žç±²"],
["c940","ä¹‚ä¹œå‡µåŒšåŽ‚ä¸‡ä¸Œä¹‡äº�å›—ï¨Œå±®å½³ä¸�å†‡ä¸Žä¸®äº“ä»‚ä»‰ä»ˆå†˜å‹¼å�¬åŽ¹åœ å¤ƒå¤¬å°�å·¿æ—¡æ®³æ¯Œæ°”çˆ¿ä¸±ä¸¼ä»¨ä»œä»©ä»¡ä»�ä»šåˆŒåŒœå�Œåœ¢åœ£å¤—å¤¯å®�å®„å°’å°»å±´å±³å¸„åº€åº‚å¿‰æˆ‰æ‰�æ°•"],
["c9a1","æ°¶æ±ƒæ°¿æ°»çŠ®çŠ°çŽŠç¦¸è‚Šé˜žä¼Žä¼˜ä¼¬ä»µä¼”ä»±ä¼€ä»·ä¼ˆä¼�ä¼‚ä¼…ä¼¢ä¼“ä¼„ä»´ä¼’å†±åˆ“åˆ‰åˆ�åŠ¦åŒ¢åŒŸå��åŽŠå�‡å›¡å›Ÿåœ®åœªåœ´å¤¼å¦€å¥¼å¦…å¥»å¥¾å¥·å¥¿å­–å°•å°¥å±¼å±ºå±»å±¾å·Ÿå¹µåº„å¼‚å¼šå½´å¿•å¿”å¿�æ‰œæ‰žæ‰¤æ‰¡æ‰¦æ‰¢æ‰™æ‰ æ‰šæ‰¥æ—¯æ—®æœ¾æœ¹æœ¸æœ»æœºæœ¿æœ¼æœ³æ°˜æ±†æ±’æ±œæ±�æ±Šæ±”æ±‹"],
["ca40","æ±Œç�±ç‰žçŠ´çŠµçŽŽç”ªç™¿ç©µç½‘è‰¸è‰¼èŠ€è‰½è‰¿è™�è¥¾é‚™é‚—é‚˜é‚›é‚”é˜¢é˜¤é˜ é˜£ä½–ä¼»ä½¢ä½‰ä½“ä½¤ä¼¾ä½§ä½’ä½Ÿä½�ä½˜ä¼­ä¼³ä¼¿ä½¡å†�å†¹åˆœåˆžåˆ¡åŠ­åŠ®åŒ‰å�£å�²åŽŽåŽ�å�°å�·å�ªå‘”å‘…å�™å�œå�¥å�˜"],
["caa1","å�½å‘�å‘�å�¨å�¤å‘‡å›®å›§å›¥å��å�…å�Œå�‰å�‹å�’å¤†å¥€å¦¦å¦˜å¦ å¦—å¦Žå¦¢å¦�å¦�å¦§å¦¡å®Žå®’å°¨å°ªå²�å²�å²ˆå²‹å²‰å²’å²Šå²†å²“å²•å· å¸Šå¸Žåº‹åº‰åºŒåºˆåº�å¼…å¼�å½¸å½¶å¿’å¿‘å¿�å¿­å¿¨å¿®å¿³å¿¡å¿¤å¿£å¿ºå¿¯å¿·å¿»æ€€å¿´æˆºæŠƒæŠŒæŠŽæŠ�æŠ”æŠ‡æ‰±æ‰»æ‰ºæ‰°æŠ�æŠˆæ‰·æ‰½æ‰²æ‰´æ”·æ—°æ—´æ—³æ—²æ—µæ�…æ�‡"],
["cb40","æ�™æ�•æ�Œæ�ˆæ��æ��æ�šæ�‹æ¯�æ°™æ°šæ±¸æ±§æ±«æ²„æ²‹æ²�æ±±æ±¯æ±©æ²šæ±­æ²‡æ²•æ²œæ±¦æ±³æ±¥æ±»æ²Žç�´ç�ºç‰£çŠ¿çŠ½ç‹ƒç‹†ç‹�çŠºç‹…çŽ•çŽ—çŽ“çŽ”çŽ’ç”ºç”¹ç–”ç–•çš�ç¤½è€´è‚•è‚™è‚�è‚’è‚œèŠ�èŠ�èŠ…èŠŽèŠ‘èŠ“"],
["cba1","èŠŠèŠƒèŠ„è±¸è¿‰è¾¿é‚Ÿé‚¡é‚¥é‚žé‚§é‚ é˜°é˜¨é˜¯é˜­ä¸³ä¾˜ä½¼ä¾…ä½½ä¾€ä¾‡ä½¶ä½´ä¾‰ä¾„ä½·ä½Œä¾—ä½ªä¾šä½¹ä¾�ä½¸ä¾�ä¾œä¾”ä¾žä¾’ä¾‚ä¾•ä½«ä½®å†žå†¼å†¾åˆµåˆ²åˆ³å‰†åˆ±åŠ¼åŒŠåŒ‹åŒ¼åŽ’åŽ”å’‡å‘¿å’�å’‘å’‚å’ˆå‘«å‘ºå‘¾å‘¥å‘¬å‘´å‘¦å’�å‘¯å‘¡å‘ å’˜å‘£å‘§å‘¤å›·å›¹å�¯å�²å�­å�«å�±å�°å�¶åž€å�µå�»å�³å�´å�¢"],
["cc40","å�¨å�½å¤Œå¥…å¦µå¦ºå§�å§Žå¦²å§Œå§�å¦¶å¦¼å§ƒå§–å¦±å¦½å§€å§ˆå¦´å§‡å­¢å­¥å®“å®•å±„å±‡å²®å²¤å² å²µå²¯å²¨å²¬å²Ÿå²£å²­å²¢å²ªå²§å²�å²¥å²¶å²°å²¦å¸—å¸”å¸™å¼¨å¼¢å¼£å¼¤å½”å¾‚å½¾å½½å¿žå¿¥æ€­æ€¦æ€™æ€²æ€‹"],
["cca1","æ€´æ€Šæ€—æ€³æ€šæ€žæ€¬æ€¢æ€�æ€�æ€®æ€“æ€‘æ€Œæ€‰æ€œæˆ”æˆ½æŠ­æŠ´æ‹‘æŠ¾æŠªæŠ¶æ‹ŠæŠ®æŠ³æŠ¯æŠ»æŠ©æŠ°æŠ¸æ”½æ–¨æ–»æ˜‰æ—¼æ˜„æ˜’æ˜ˆæ—»æ˜ƒæ˜‹æ˜�æ˜…æ—½æ˜‘æ˜�æ›¶æœŠæž…æ�¬æžŽæž’æ�¶æ�»æž˜æž†æž„æ�´æž�æžŒæ�ºæžŸæž‘æž™æžƒæ�½æž�æ�¸æ�¹æž”æ¬¥æ®€æ­¾æ¯žæ°�æ²“æ³¬æ³«æ³®æ³™æ²¶æ³”æ²­æ³§æ²·æ³�æ³‚æ²ºæ³ƒæ³†æ³­æ³²"],
["cd40","æ³’æ³�æ²´æ²Šæ²�æ²€æ³žæ³€æ´°æ³�æ³‡æ²°æ³¹æ³�æ³©æ³‘ç‚”ç‚˜ç‚…ç‚“ç‚†ç‚„ç‚‘ç‚–ç‚‚ç‚šç‚ƒç‰ªç‹–ç‹‹ç‹˜ç‹‰ç‹œç‹’ç‹”ç‹šç‹Œç‹‘çŽ¤çŽ¡çŽ­çŽ¦çŽ¢çŽ çŽ¬çŽ�ç“�ç“¨ç”¿ç•€ç”¾ç–Œç–˜çš¯ç›³ç›±ç›°ç›µçŸ¸çŸ¼çŸ¹çŸ»çŸº"],
["cda1","çŸ·ç¥‚ç¤¿ç§…ç©¸ç©»ç«»ç±µç³½è€µè‚�è‚®è‚£è‚¸è‚µè‚­èˆ èŠ è‹€èŠ«èŠšèŠ˜èŠ›èŠµèŠ§èŠ®èŠ¼èŠžèŠºèŠ´èŠ¨èŠ¡èŠ©è‹‚èŠ¤è‹ƒèŠ¶èŠ¢è™°è™¯è™­è™®è±–è¿’è¿‹è¿“è¿�è¿–è¿•è¿—é‚²é‚´é‚¯é‚³é‚°é˜¹é˜½é˜¼é˜ºé™ƒä¿�ä¿…ä¿“ä¾²ä¿‰ä¿‹ä¿�ä¿”ä¿œä¿™ä¾»ä¾³ä¿›ä¿‡ä¿–ä¾ºä¿€ä¾¹ä¿¬å‰„å‰‰å‹€å‹‚åŒ½å�¼åŽ—åŽ–åŽ™åŽ˜å’ºå’¡å’­å’¥å“�"],
["ce40","å“ƒèŒ�å’·å’®å“–å’¶å“…å“†å’ å‘°å’¼å’¢å’¾å‘²å“žå’°åžµåžžåžŸåž¤åžŒåž—åž�åž›åž”åž˜åž�åž™åž¥åžšåž•å£´å¤�å¥“å§¡å§žå§®å¨€å§±å§�å§ºå§½å§¼å§¶å§¤å§²å§·å§›å§©å§³å§µå§ å§¾å§´å§­å®¨å±Œå³�å³˜å³Œå³—å³‹å³›"],
["cea1","å³žå³šå³‰å³‡å³Šå³–å³“å³”å³�å³ˆå³†å³Žå³Ÿå³¸å·¹å¸¡å¸¢å¸£å¸ å¸¤åº°åº¤åº¢åº›åº£åº¥å¼‡å¼®å½–å¾†æ€·æ€¹æ�”æ�²æ�žæ�…æ�“æ�‡æ�‰æ�›æ�Œæ�€æ�‚æ�Ÿæ€¤æ�„æ�˜æ�¦æ�®æ‰‚æ‰ƒæ‹�æŒ�æŒ‹æ‹µæŒŽæŒƒæ‹«æ‹¹æŒ�æŒŒæ‹¸æ‹¶æŒ€æŒ“æŒ”æ‹ºæŒ•æ‹»æ‹°æ•�æ•ƒæ–ªæ–¿æ˜¶æ˜¡æ˜²æ˜µæ˜œæ˜¦æ˜¢æ˜³æ˜«æ˜ºæ˜�æ˜´æ˜¹æ˜®æœ�æœ�æŸ�æŸ²æŸˆæžº"],
["cf40","æŸœæž»æŸ¸æŸ˜æŸ€æž·æŸ…æŸ«æŸ¤æŸŸæžµæŸ�æž³æŸ·æŸ¶æŸ®æŸ£æŸ‚æž¹æŸŽæŸ§æŸ°æž²æŸ¼æŸ†æŸ­æŸŒæž®æŸ¦æŸ›æŸºæŸ‰æŸŠæŸƒæŸªæŸ‹æ¬¨æ®‚æ®„æ®¶æ¯–æ¯˜æ¯ æ° æ°¡æ´¨æ´´æ´­æ´Ÿæ´¼æ´¿æ´’æ´Šæ³šæ´³æ´„æ´™æ´ºæ´šæ´‘æ´€æ´�æµ‚"],
["cfa1","æ´�æ´˜æ´·æ´ƒæ´�æµ€æ´‡æ´ æ´¬æ´ˆæ´¢æ´‰æ´�ç‚·ç‚Ÿç‚¾ç‚±ç‚°ç‚¡ç‚´ç‚µç‚©ç‰�ç‰‰ç‰Šç‰¬ç‰°ç‰³ç‰®ç‹Šç‹¤ç‹¨ç‹«ç‹Ÿç‹ªç‹¦ç‹£çŽ…ç�Œç�‚ç�ˆç�…çŽ¹çŽ¶çŽµçŽ´ç�«çŽ¿ç�‡çŽ¾ç�ƒç�†çŽ¸ç�‹ç“¬ç“®ç”®ç•‡ç•ˆç–§ç–ªç™¹ç›„çœˆçœƒçœ„çœ…çœŠç›·ç›»ç›ºçŸ§çŸ¨ç †ç ‘ç ’ç …ç �ç �ç Žç ‰ç ƒç “ç¥Šç¥Œç¥‹ç¥…ç¥„ç§•ç§�ç§�ç§–ç§Žçª€"],
["d040","ç©¾ç«‘ç¬€ç¬�ç±ºç±¸ç±¹ç±¿ç²€ç²�ç´ƒç´ˆç´�ç½˜ç¾‘ç¾�ç¾¾è€‡è€Žè€�è€”è€·èƒ˜èƒ‡èƒ èƒ‘èƒˆèƒ‚èƒ�èƒ…èƒ£èƒ™èƒœèƒŠèƒ•èƒ‰èƒ�èƒ—èƒ¦èƒ�è‡¿èˆ¡èŠ”è‹™è‹¾è‹¹èŒ‡è‹¨èŒ€è‹•èŒºè‹«è‹–è‹´è‹¬è‹¡è‹²è‹µèŒŒè‹»è‹¶è‹°è‹ª"],
["d0a1","è‹¤è‹ è‹ºè‹³è‹­è™·è™´è™¼è™³è¡�è¡Žè¡§è¡ªè¡©è§“è¨„è¨‡èµ²è¿£è¿¡è¿®è¿ éƒ±é‚½é‚¿éƒ•éƒ…é‚¾éƒ‡éƒ‹éƒˆé‡”é‡“é™”é™�é™‘é™“é™Šé™Žå€žå€…å€‡å€“å€¢å€°å€›ä¿µä¿´å€³å€·å€¬ä¿¶ä¿·å€—å€œå€ å€§å€µå€¯å€±å€Žå…šå†”å†“å‡Šå‡„å‡…å‡ˆå‡Žå‰¡å‰šå‰’å‰žå‰Ÿå‰•å‰¢å‹�åŒŽåŽžå”¦å“¢å”—å”’å“§å“³å“¤å”šå“¿å”„å”ˆå“«å”‘å”…å“±"],
["d140","å”Šå“»å“·å“¸å“ å”Žå”ƒå”‹åœ�åœ‚åŸŒå ²åŸ•åŸ’åžºåŸ†åž½åž¼åž¸åž¶åž¿åŸ‡åŸ�åž¹åŸ�å¤Žå¥Šå¨™å¨–å¨­å¨®å¨•å¨�å¨—å¨Šå¨žå¨³å­¬å®§å®­å®¬å°ƒå±–å±”å³¬å³¿å³®å³±å³·å´€å³¹å¸©å¸¨åº¨åº®åºªåº¬å¼³å¼°å½§æ��æ�šæ�§"],
["d1a1","æ��æ‚¢æ‚ˆæ‚€æ‚’æ‚�æ‚�æ‚ƒæ‚•æ‚›æ‚—æ‚‡æ‚œæ‚Žæˆ™æ‰†æ‹²æŒ�æ�–æŒ¬æ�„æ�…æŒ¶æ�ƒæ�¤æŒ¹æ�‹æ�ŠæŒ¼æŒ©æ��æŒ´æ�˜æ�”æ�™æŒ­æ�‡æŒ³æ�šæ�‘æŒ¸æ�—æ�€æ�ˆæ•Šæ•†æ—†æ—ƒæ—„æ—‚æ™Šæ™Ÿæ™‡æ™‘æœ’æœ“æ Ÿæ šæ¡‰æ ²æ ³æ »æ¡‹æ¡�æ –æ ±æ œæ µæ «æ ­æ ¯æ¡Žæ¡„æ ´æ �æ ’æ ”æ ¦æ ¨æ ®æ¡�æ ºæ ¥æ  æ¬¬æ¬¯æ¬­æ¬±æ¬´æ­­è‚‚æ®ˆæ¯¦æ¯¤"],
["d240","æ¯¨æ¯£æ¯¢æ¯§æ°¥æµºæµ£æµ¤æµ¶æ´�æµ¡æ¶’æµ˜æµ¢æµ­æµ¯æ¶‘æ¶�æ·¯æµ¿æ¶†æµžæµ§æµ æ¶—æµ°æµ¼æµŸæ¶‚æ¶˜æ´¯æµ¨æ¶‹æµ¾æ¶€æ¶„æ´–æ¶ƒæµ»æµ½æµµæ¶�çƒœçƒ“çƒ‘çƒ�çƒ‹ç¼¹çƒ¢çƒ—çƒ’çƒžçƒ çƒ”çƒ�çƒ…çƒ†çƒ‡çƒšçƒŽçƒ¡ç‰‚ç‰¸"],
["d2a1","ç‰·ç‰¶çŒ€ç‹ºç‹´ç‹¾ç‹¶ç‹³ç‹»çŒ�ç�“ç�™ç�¥ç�–çŽ¼ç�§ç�£ç�©ç�œç�’ç�›ç�”ç��ç�šç�—ç�˜ç�¨ç“žç“Ÿç“´ç“µç”¡ç•›ç•Ÿç–°ç—�ç–»ç—„ç—€ç–¿ç–¶ç–ºçšŠç›‰çœ�çœ›çœ�çœ“çœ’çœ£çœ‘çœ•çœ™çœšçœ¢çœ§ç £ç ¬ç ¢ç µç ¯ç ¨ç ®ç «ç ¡ç ©ç ³ç ªç ±ç¥”ç¥›ç¥�ç¥œç¥“ç¥’ç¥‘ç§«ç§¬ç§ ç§®ç§­ç§ªç§œç§žç§�çª†çª‰çª…çª‹çªŒçªŠçª‡ç«˜ç¬�"],
["d340","ç¬„ç¬“ç¬…ç¬�ç¬ˆç¬Šç¬Žç¬‰ç¬’ç²„ç²‘ç²Šç²Œç²ˆç²�ç²…ç´žç´�ç´‘ç´Žç´˜ç´–ç´“ç´Ÿç´’ç´�ç´Œç½œç½¡ç½žç½ ç½�ç½›ç¾–ç¾’ç¿ƒç¿‚ç¿€è€–è€¾è€¹èƒºèƒ²èƒ¹èƒµè„�èƒ»è„€èˆ�èˆ¯èˆ¥èŒ³èŒ­è�„èŒ™è�‘èŒ¥è�–èŒ¿è��èŒ¦èŒœèŒ¢"],
["d3a1","è�‚è�ŽèŒ›èŒªèŒˆèŒ¼è��èŒ–èŒ¤èŒ èŒ·èŒ¯èŒ©è�‡è�…è�Œè�“èŒžèŒ¬è�‹èŒ§è�ˆè™“è™’èš¢èš¨èš–èš�èš‘èšžèš‡èš—èš†èš‹èššèš…èš¥èš™èš¡èš§èš•èš˜èšŽèš�èš�èš”è¡ƒè¡„è¡­è¡µè¡¶è¡²è¢€è¡±è¡¿è¡¯è¢ƒè¡¾è¡´è¡¼è¨’è±‡è±—è±»è²¤è²£èµ¶èµ¸è¶µè¶·è¶¶è»‘è»“è¿¾è¿µé€‚è¿¿è¿»é€„è¿¼è¿¶éƒ–éƒ éƒ™éƒšéƒ£éƒŸéƒ¥éƒ˜éƒ›éƒ—éƒœéƒ¤é…�"],
["d440","é…Žé…�é‡•é‡¢é‡šé™œé™Ÿéš¼é££é«Ÿé¬¯ä¹¿å�°å�ªå�¡å�žå� å�“å�‹å��å�²å�ˆå��å��å�›å�Šå�¢å€•å�…å�Ÿå�©å�«å�£å�¤å�†å�€å�®å�³å�—å�‘å‡�å‰«å‰­å‰¬å‰®å‹–å‹“åŒ­åŽœå•µå•¶å”¼å•�å•�å”´å”ªå•‘å•¢å”¶å”µå”°å•’å•…"],
["d4a1","å”Œå”²å•¥å•Žå”¹å•ˆå”­å”»å•€å•‹åœŠåœ‡åŸ»å ”åŸ¢åŸ¶åŸœåŸ´å €åŸ­åŸ½å ˆåŸ¸å ‹åŸ³åŸ�å ‡åŸ®åŸ£åŸ²åŸ¥åŸ¬åŸ¡å ŽåŸ¼å �åŸ§å �å ŒåŸ±åŸ©åŸ°å �å „å¥œå© å©˜å©•å©§å©žå¨¸å¨µå©­å©�å©Ÿå©¥å©¬å©“å©¤å©—å©ƒå©�å©’å©„å©›å©ˆåªŽå¨¾å©�å¨¹å©Œå©°å©©å©‡å©‘å©–å©‚å©œå­²å­®å¯�å¯€å±™å´žå´‹å´�å´šå´ å´Œå´¨å´�å´¦å´¥å´�"],
["d540","å´°å´’å´£å´Ÿå´®å¸¾å¸´åº±åº´åº¹åº²åº³å¼¶å¼¸å¾›å¾–å¾Ÿæ‚Šæ‚�æ‚†æ‚¾æ‚°æ‚ºæƒ“æƒ”æƒ�æƒ¤æƒ™æƒ�æƒˆæ‚±æƒ›æ‚·æƒŠæ‚¿æƒƒæƒ�æƒ€æŒ²æ�¥æŽŠæŽ‚æ�½æŽ½æŽžæŽ­æŽ�æŽ—æŽ«æŽŽæ�¯æŽ‡æŽ�æ�®æŽ¯æ�µæŽœæ�­æŽ®æ�¼æŽ¤æŒ»æŽŸ"],
["d5a1","æ�¸æŽ…æŽ�æŽ‘æŽ�æ�°æ•“æ—�æ™¥æ™¡æ™›æ™™æ™œæ™¢æœ˜æ¡¹æ¢‡æ¢�æ¢œæ¡­æ¡®æ¢®æ¢«æ¥–æ¡¯æ¢£æ¢¬æ¢©æ¡µæ¡´æ¢²æ¢�æ¡·æ¢’æ¡¼æ¡«æ¡²æ¢ªæ¢€æ¡±æ¡¾æ¢›æ¢–æ¢‹æ¢ æ¢‰æ¢¤æ¡¸æ¡»æ¢‘æ¢Œæ¢Šæ¡½æ¬¶æ¬³æ¬·æ¬¸æ®‘æ®�æ®�æ®Žæ®Œæ°ªæ·€æ¶«æ¶´æ¶³æ¹´æ¶¬æ·©æ·¢æ¶·æ·¶æ·”æ¸€æ·ˆæ· æ·Ÿæ·–æ¶¾æ·¥æ·œæ·�æ·›æ·´æ·Šæ¶½æ·­æ·°æ¶ºæ·•æ·‚æ·�æ·‰"],
["d640","æ·�æ·²æ·“æ·½æ·—æ·�æ·£æ¶»çƒºç„�çƒ·ç„—çƒ´ç„Œçƒ°ç„„çƒ³ç„�çƒ¼çƒ¿ç„†ç„“ç„€çƒ¸çƒ¶ç„‹ç„‚ç„Žç‰¾ç‰»ç‰¼ç‰¿çŒ�çŒ—çŒ‡çŒ‘çŒ˜çŒŠçŒˆç‹¿çŒ�çŒžçŽˆç�¶ç�¸ç�µç�„ç��ç�½ç�‡ç�€ç�ºç�¼ç�¿ç�Œç�‹ç�´ç�ˆç•¤ç•£ç—Žç—’ç—�"],
["d6a1","ç—‹ç—Œç—‘ç—�çš�çš‰ç›“çœ¹çœ¯çœ­çœ±çœ²çœ´çœ³çœ½çœ¥çœ»çœµç¡ˆç¡’ç¡‰ç¡�ç¡Šç¡Œç ¦ç¡…ç¡�ç¥¤ç¥§ç¥©ç¥ªç¥£ç¥«ç¥¡ç¦»ç§ºç§¸ç§¶ç§·çª�çª”çª�ç¬µç­‡ç¬´ç¬¥ç¬°ç¬¢ç¬¤ç¬³ç¬˜ç¬ªç¬�ç¬±ç¬«ç¬­ç¬¯ç¬²ç¬¸ç¬šç¬£ç²”ç²˜ç²–ç²£ç´µç´½ç´¸ç´¶ç´ºçµ…ç´¬ç´©çµ�çµ‡ç´¾ç´¿çµŠç´»ç´¨ç½£ç¾•ç¾œç¾�ç¾›ç¿Šç¿‹ç¿�ç¿�ç¿‘ç¿‡ç¿�ç¿‰è€Ÿ"],
["d740","è€žè€›è�‡è�ƒè�ˆè„˜è„¥è„™è„›è„­è„Ÿè„¬è„žè„¡è„•è„§è„�è„¢èˆ‘èˆ¸èˆ³èˆºèˆ´èˆ²è‰´èŽ�èŽ£èŽ¨èŽ�è�ºè�³èŽ¤è�´èŽ�èŽ�èŽ•èŽ™è�µèŽ”èŽ©è�½èŽƒèŽŒèŽ�èŽ›èŽªèŽ‹è�¾èŽ¥èŽ¯èŽˆèŽ—èŽ°è�¿èŽ¦èŽ‡èŽ®è�¶èŽšè™™è™–èš¿èš·"],
["d7a1","è›‚è›�è›…èšºèš°è›ˆèš¹èš³èš¸è›Œèš´èš»èš¼è›ƒèš½èš¾è¡’è¢‰è¢•è¢¨è¢¢è¢ªè¢šè¢‘è¢¡è¢Ÿè¢˜è¢§è¢™è¢›è¢—è¢¤è¢¬è¢Œè¢“è¢Žè¦‚è§–è§™è§•è¨°è¨§è¨¬è¨žè°¹è°»è±œè±�è±½è²¥èµ½èµ»èµ¹è¶¼è·‚è¶¹è¶¿è·�è»˜è»žè»�è»œè»—è» è»¡é€¤é€‹é€‘é€œé€Œé€¡éƒ¯éƒªéƒ°éƒ´éƒ²éƒ³éƒ”éƒ«éƒ¬éƒ©é…–é…˜é…šé…“é…•é‡¬é‡´é‡±é‡³é‡¸é‡¤é‡¹é‡ª"],
["d840","é‡«é‡·é‡¨é‡®é•ºé–†é–ˆé™¼é™­é™«é™±é™¯éš¿é�ªé „é£¥é¦—å‚›å‚•å‚”å‚žå‚‹å‚£å‚ƒå‚Œå‚Žå‚�å�¨å‚œå‚’å‚‚å‚‡å…Ÿå‡”åŒ’åŒ‘åŽ¤åŽ§å–‘å–¨å–¥å–­å•·å™…å–¢å–“å–ˆå–�å–µå–�å–£å–’å–¤å•½å–Œå–¦å•¿å–•å–¡å–ŽåœŒå ©å ·"],
["d8a1","å ™å žå §å £å ¨åŸµå¡ˆå ¥å œå ›å ³å ¿å ¶å ®å ¹å ¸å ­å ¬å »å¥¡åª¯åª”åªŸå©ºåª¢åªžå©¸åª¦å©¼åª¥åª¬åª•åª®å¨·åª„åªŠåª—åªƒåª‹åª©å©»å©½åªŒåªœåª�åª“åª�å¯ªå¯�å¯‹å¯”å¯‘å¯Šå¯Žå°Œå°°å´·åµƒåµ«åµ�åµ‹å´¿å´µåµ‘åµŽåµ•å´³å´ºåµ’å´½å´±åµ™åµ‚å´¹åµ‰å´¸å´¼å´²å´¶åµ€åµ…å¹„å¹�å½˜å¾¦å¾¥å¾«æƒ‰æ‚¹æƒŒæƒ¢æƒŽæƒ„æ„”"],
["d940","æƒ²æ„Šæ„–æ„…æƒµæ„“æƒ¸æƒ¼æƒ¾æƒ�æ„ƒæ„˜æ„�æ„�æƒ¿æ„„æ„‹æ‰ŠæŽ”æŽ±æŽ°æ�Žæ�¥æ�¨æ�¯æ�ƒæ’�æ�³æ�Šæ� æ�¶æ�•æ�²æ�µæ‘¡æ�ŸæŽ¾æ��æ�œæ�„æ�˜æ�“æ�‚æ�‡æ�Œæ�‹æ�ˆæ�°æ�—æ�™æ”²æ•§æ•ªæ•¤æ•œæ•¨æ•¥æ–Œæ–�æ–žæ–®æ—�æ—’"],
["d9a1","æ™¼æ™¬æ™»æš€æ™±æ™¹æ™ªæ™²æœ�æ¤Œæ£“æ¤„æ£œæ¤ªæ£¬æ£ªæ£±æ¤�æ£–æ£·æ£«æ£¤æ£¶æ¤“æ¤�æ£³æ£¡æ¤‡æ£Œæ¤ˆæ¥°æ¢´æ¤‘æ£¯æ£†æ¤”æ£¸æ£�æ£½æ£¼æ£¨æ¤‹æ¤Šæ¤—æ£Žæ£ˆæ£�æ£žæ£¦æ£´æ£‘æ¤†æ£”æ£©æ¤•æ¤¥æ£‡æ¬¹æ¬»æ¬¿æ¬¼æ®”æ®—æ®™æ®•æ®½æ¯°æ¯²æ¯³æ°°æ·¼æ¹†æ¹‡æ¸Ÿæ¹‰æºˆæ¸¼æ¸½æ¹…æ¹¢æ¸«æ¸¿æ¹�æ¹�æ¹³æ¸œæ¸³æ¹‹æ¹€æ¹‘æ¸»æ¸ƒæ¸®æ¹ž"],
["da40","æ¹¨æ¹œæ¹¡æ¸±æ¸¨æ¹ æ¹±æ¹«æ¸¹æ¸¢æ¸°æ¹“æ¹¥æ¸§æ¹¸æ¹¤æ¹·æ¹•æ¹¹æ¹’æ¹¦æ¸µæ¸¶æ¹šç„ ç„žç„¯çƒ»ç„®ç„±ç„£ç„¥ç„¢ç„²ç„Ÿç„¨ç„ºç„›ç‰‹ç‰šçŠˆçŠ‰çŠ†çŠ…çŠ‹çŒ’çŒ‹çŒ°çŒ¢çŒ±çŒ³çŒ§çŒ²çŒ­çŒ¦çŒ£çŒµçŒŒç�®ç�¬ç�°ç�«ç�–"],
["daa1","ç�šç�¡ç�­ç�±ç�¤ç�£ç��ç�©ç� ç�²ç“»ç”¯ç•¯ç•¬ç—§ç—šç—¡ç—¦ç—�ç—Ÿç—¤ç——çš•çš’ç›šç�†ç�‡ç�„ç��ç�…ç�Šç�Žç�‹ç�ŒçŸžçŸ¬ç¡ ç¡¤ç¡¥ç¡œç¡­ç¡±ç¡ªç¡®ç¡°ç¡©ç¡¨ç¡žç¡¢ç¥´ç¥³ç¥²ç¥°ç¨‚ç¨Šç¨ƒç¨Œç¨„çª™ç«¦ç«¤ç­Šç¬»ç­„ç­ˆç­Œç­Žç­€ç­˜ç­…ç²¢ç²žç²¨ç²¡çµ˜çµ¯çµ£çµ“çµ–çµ§çµªçµ�çµ­çµœçµ«çµ’çµ”çµ©çµ‘çµŸçµŽç¼¾ç¼¿ç½¥"],
["db40","ç½¦ç¾¢ç¾ ç¾¡ç¿—è�‘è��è��èƒ¾èƒ”è…ƒè…Šè…’è…�è…‡è„½è…�è„ºè‡¦è‡®è‡·è‡¸è‡¹èˆ„èˆ¼èˆ½èˆ¿è‰µèŒ»è��è�¹è�£è�€è�¨è�’è�§è�¤è�¼è�¶è��è�†è�ˆè�«è�£èŽ¿è��è��è�¥è�˜è�¿è�¡è�‹è�Žè�–è�µè�‰è�‰è��è�žè�‘è�†è�‚è�³"],
["dba1","è�•è�ºè�‡è�‘è�ªè�“è�ƒè�¬è�®è�„è�»è�—è�¢è�›è�›è�¾è›˜è›¢è›¦è›“è›£è›šè›ªè›�è›«è›œè›¬è›©è›—è›¨è›‘è¡ˆè¡–è¡•è¢ºè£—è¢¹è¢¸è£€è¢¾è¢¶è¢¼è¢·è¢½è¢²è¤�è£‰è¦•è¦˜è¦—è§�è§šè§›è©Žè©�è¨¹è©™è©€è©—è©˜è©„è©…è©’è©ˆè©‘è©Šè©Œè©�è±Ÿè²�è²€è²ºè²¾è²°è²¹è²µè¶„è¶€è¶‰è·˜è·“è·�è·‡è·–è·œè·�è·•è·™è·ˆè·—è·…è»¯è»·è»º"],
["dc40","è»¹è»¦è»®è»¥è»µè»§è»¨è»¶è»«è»±è»¬è»´è»©é€­é€´é€¯é„†é„¬é„„éƒ¿éƒ¼é„ˆéƒ¹éƒ»é„�é„€é„‡é„…é„ƒé…¡é…¤é…Ÿé…¢é… éˆ�éˆŠéˆ¥éˆƒéˆšéˆ¦éˆ�éˆŒéˆ€éˆ’é‡¿é‡½éˆ†éˆ„éˆ§éˆ‚éˆœéˆ¤éˆ™éˆ—éˆ…éˆ–é•»é–�é–Œé–�éš‡é™¾éšˆ"],
["dca1","éš‰éšƒéš€é›‚é›ˆé›ƒé›±é›°é�¬é�°é�®é ‡é¢©é£«é³¦é»¹äºƒäº„äº¶å‚½å‚¿åƒ†å‚®åƒ„åƒŠå‚´åƒˆåƒ‚å‚°åƒ�å‚ºå‚±åƒ‹åƒ‰å‚¶å‚¸å‡—å‰ºå‰¸å‰»å‰¼å—ƒå—›å—Œå—�å—‹å—Šå—�å—€å—”å—„å—©å–¿å—’å–�å—�å—•å—¢å—–å—ˆå—²å—�å—™å—‚åœ”å¡“å¡¨å¡¤å¡�å¡�å¡‰å¡¯å¡•å¡Žå¡�å¡™å¡¥å¡›å ½å¡£å¡±å£¼å«‡å«„å«‹åªºåª¸åª±åªµåª°åª¿å«ˆåª»å«†"],
["dd40","åª·å«€å«Šåª´åª¶å«�åª¹åª�å¯–å¯˜å¯™å°Ÿå°³åµ±åµ£åµŠåµ¥åµ²åµ¬åµžåµ¨åµ§åµ¢å·°å¹�å¹Žå¹Šå¹�å¹‹å»…å»Œå»†å»‹å»‡å½€å¾¯å¾­æƒ·æ…‰æ…Šæ„«æ……æ„¶æ„²æ„®æ…†æ„¯æ…�æ„©æ…€æˆ é…¨æˆ£æˆ¥æˆ¤æ�…æ�±æ�«æ��æ�’æ�‰æ� æ�¤"],
["dda1","æ�³æ‘ƒæ�Ÿæ�•æ�˜æ�¹æ�·æ�¢æ�£æ�Œæ�¦æ�°æ�¨æ‘�æ�µæ�¯æ�Šæ�šæ‘€æ�¥æ�§æ�‹æ�§æ�›æ�®æ�¡æ�Žæ•¯æ–’æ—“æš†æšŒæš•æš�æš‹æšŠæš™æš”æ™¸æœ æ¥¦æ¥Ÿæ¤¸æ¥Žæ¥¢æ¥±æ¤¿æ¥…æ¥ªæ¤¹æ¥‚æ¥—æ¥™æ¥ºæ¥ˆæ¥‰æ¤µæ¥¬æ¤³æ¤½æ¥¥æ£°æ¥¸æ¤´æ¥©æ¥€æ¥¯æ¥„æ¥¶æ¥˜æ¥�æ¥´æ¥Œæ¤»æ¥‹æ¤·æ¥œæ¥�æ¥‘æ¤²æ¥’æ¤¯æ¥»æ¤¼æ­†æ­…æ­ƒæ­‚æ­ˆæ­�æ®›ï¨�æ¯»æ¯¼"],
["de40","æ¯¹æ¯·æ¯¸æº›æ»–æ»ˆæº�æ»€æºŸæº“æº”æº æº±æº¹æ»†æ»’æº½æ»�æºžæ»‰æº·æº°æ»�æº¦æ»�æº²æº¾æ»ƒæ»œæ»˜æº™æº’æºŽæº�æº¤æº¡æº¿æº³æ»�æ»Šæº—æº®æº£ç…‡ç…”ç…’ç…£ç… ç…�ç…�ç…¢ç…²ç…¸ç…ªç…¡ç…‚ç…˜ç…ƒç…‹ç…°ç…Ÿç…�ç…“"],
["dea1","ç…„ç…�ç…šç‰�çŠ�çŠŒçŠ‘çŠ�çŠŽçŒ¼ç�‚çŒ»çŒºç�€ç�Šç�‰ç‘„ç‘Šç‘‹ç‘’ç‘‘ç‘—ç‘€ç‘�ç‘�ç‘Žç‘‚ç‘†ç‘�ç‘”ç“¡ç“¿ç“¾ç“½ç”�ç•¹ç•·æ¦ƒç—¯ç˜�ç˜ƒç—·ç—¾ç—¼ç—¹ç—¸ç˜�ç—»ç—¶ç—­ç—µç—½çš™çšµç›�ç�•ç�Ÿç� ç�’ç�–ç�šç�©ç�§ç�”ç�™ç�­çŸ ç¢‡ç¢šç¢”ç¢�ç¢„ç¢•ç¢…ç¢†ç¢¡ç¢ƒç¡¹ç¢™ç¢€ç¢–ç¡»ç¥¼ç¦‚ç¥½ç¥¹ç¨‘ç¨˜ç¨™ç¨’ç¨—ç¨•ç¨¢ç¨“"],
["df40","ç¨›ç¨�çª£çª¢çªžç««ç­¦ç­¤ç­­ç­´ç­©ç­²ç­¥ç­³ç­±ç­°ç­¡ç­¸ç­¶ç­£ç²²ç²´ç²¯ç¶ˆç¶†ç¶€ç¶�çµ¿ç¶…çµºç¶Žçµ»ç¶ƒçµ¼ç¶Œç¶”ç¶„çµ½ç¶’ç½­ç½«ç½§ç½¨ç½¬ç¾¦ç¾¥ç¾§ç¿›ç¿œè€¡è…¤è… è…·è…œè…©è…›è…¢è…²æœ¡è…žè…¶è…§è…¯"],
["dfa1","è…„è…¡èˆ�è‰‰è‰„è‰€è‰‚è‰…è“±è�¿è‘–è‘¶è‘¹è’�è’�è‘¥è‘‘è‘€è’†è‘§è�°è‘�è‘½è‘šè‘™è‘´è‘³è‘�è”‡è‘žè�·è�ºè�´è‘ºè‘ƒè‘¸è�²è‘…è�©è�™è‘‹è�¯è‘‚è�­è‘Ÿè‘°è�¹è‘Žè‘Œè‘’è‘¯è“…è’Žè�»è‘‡è�¶è�³è‘¨è‘¾è‘„è�«è‘ è‘”è‘®è‘�èœ‹èœ„è›·èœŒè›ºè›–è›µè��è›¸èœŽèœ‰èœ�è›¶èœ�èœ…è£–è£‹è£�è£Žè£žè£›è£šè£Œè£�è¦…è¦›è§Ÿè§¥è§¤"],
["e040","è§¡è§ è§¢è§œè§¦è©¶èª†è©¿è©¡è¨¿è©·èª‚èª„è©µèªƒèª�è©´è©ºè°¼è±‹è±Šè±¥è±¤è±¦è²†è²„è²…è³Œèµ¨èµ©è¶‘è¶Œè¶Žè¶�è¶�è¶“è¶”è¶�è¶’è·°è· è·¬è·±è·®è·�è·©è·£è·¢è·§è·²è·«è·´è¼†è»¿è¼�è¼€è¼…è¼‡è¼ˆè¼‚è¼‹é�’é€¿"],
["e0a1","é�„é�‰é€½é„�é„�é„�é„‘é„–é„”é„‹é„Žé…®é…¯é‰ˆé‰’éˆ°éˆºé‰¦éˆ³é‰¥é‰žéŠƒéˆ®é‰Šé‰†é‰­é‰¬é‰�é‰ é‰§é‰¯éˆ¶é‰¡é‰°éˆ±é‰”é‰£é‰�é‰²é‰Žé‰“é‰Œé‰–éˆ²é–Ÿé–œé–žé–›éš’éš“éš‘éš—é›Žé›ºé›½é›¸é›µé�³é�·é�¸é�²é �é �é Žé¢¬é£¶é£¹é¦¯é¦²é¦°é¦µéª­éª«é­›é³ªé³­é³§éº€é»½åƒ¦åƒ”åƒ—åƒ¨åƒ³åƒ›åƒªåƒ�åƒ¤åƒ“åƒ¬åƒ°åƒ¯åƒ£åƒ "],
["e140","å‡˜åŠ€åŠ�å‹©å‹«åŒ°åŽ¬å˜§å˜•å˜Œå˜’å—¼å˜�å˜œå˜�å˜“å˜‚å—ºå˜�å˜„å—¿å—¹å¢‰å¡¼å¢�å¢˜å¢†å¢�å¡¿å¡´å¢‹å¡ºå¢‡å¢‘å¢Žå¡¶å¢‚å¢ˆå¡»å¢”å¢�å£¾å¥«å«œå«®å«¥å«•å«ªå«šå«­å««å«³å«¢å« å«›å«¬å«žå«�å«™å«¨å«Ÿå­·å¯ "],
["e1a1","å¯£å±£å¶‚å¶€åµ½å¶†åµºå¶�åµ·å¶Šå¶‰å¶ˆåµ¾åµ¼å¶�åµ¹åµ¿å¹˜å¹™å¹“å»˜å»‘å»—å»Žå»œå»•å»™å»’å»”å½„å½ƒå½¯å¾¶æ„¬æ„¨æ…�æ…žæ…±æ…³æ…’æ…“æ…²æ…¬æ†€æ…´æ…”æ…ºæ…›æ…¥æ„»æ…ªæ…¡æ…–æˆ©æˆ§æˆ«æ�«æ‘�æ‘›æ‘�æ‘´æ‘¶æ‘²æ‘³æ‘½æ‘µæ‘¦æ’¦æ‘Žæ’‚æ‘žæ‘œæ‘‹æ‘“æ‘ æ‘�æ‘¿æ�¿æ‘¬æ‘«æ‘™æ‘¥æ‘·æ•³æ– æš¡æš æšŸæœ…æœ„æœ¢æ¦±æ¦¶æ§‰"],
["e240","æ¦ æ§Žæ¦–æ¦°æ¦¬æ¦¼æ¦‘æ¦™æ¦Žæ¦§æ¦�æ¦©æ¦¾æ¦¯æ¦¿æ§„æ¦½æ¦¤æ§”æ¦¹æ§Šæ¦šæ§�æ¦³æ¦“æ¦ªæ¦¡æ¦žæ§™æ¦—æ¦�æ§‚æ¦µæ¦¥æ§†æ­Šæ­�æ­‹æ®žæ®Ÿæ® æ¯ƒæ¯„æ¯¾æ»Žæ»µæ»±æ¼ƒæ¼¥æ»¸æ¼·æ»»æ¼®æ¼‰æ½Žæ¼™æ¼šæ¼§æ¼˜æ¼»æ¼’æ»­æ¼Š"],
["e2a1","æ¼¶æ½³æ»¹æ»®æ¼­æ½€æ¼°æ¼¼æ¼µæ»«æ¼‡æ¼Žæ½ƒæ¼…æ»½æ»¶æ¼¹æ¼œæ»¼æ¼ºæ¼Ÿæ¼�æ¼žæ¼ˆæ¼¡ç†‡ç†�ç†‰ç†€ç†…ç†‚ç†�ç…»ç††ç†�ç†—ç‰„ç‰“çŠ—çŠ•çŠ“ç�ƒç��ç�‘ç�Œç‘¢ç‘³ç‘±ç‘µç‘²ç‘§ç‘®ç”€ç”‚ç”ƒç•½ç–�ç˜–ç˜ˆç˜Œç˜•ç˜‘ç˜Šç˜”çš¸çž�ç�¼çž…çž‚ç�®çž€ç�¯ç�¾çžƒç¢²ç¢ªç¢´ç¢­ç¢¨ç¡¾ç¢«ç¢žç¢¥ç¢ ç¢¬ç¢¢ç¢¤ç¦˜ç¦Šç¦‹ç¦–ç¦•ç¦”ç¦“"],
["e340","ç¦—ç¦ˆç¦’ç¦�ç¨«ç©Šç¨°ç¨¯ç¨¨ç¨¦çª¨çª«çª¬ç«®ç®ˆç®œç®Šç®‘ç®�ç®–ç®�ç®Œç®›ç®Žç®…ç®˜åŠ„ç®™ç®¤ç®‚ç²»ç²¿ç²¼ç²ºç¶§ç¶·ç·‚ç¶£ç¶ªç·�ç·€ç·…ç¶�ç·Žç·„ç·†ç·‹ç·Œç¶¯ç¶¹ç¶–ç¶¼ç¶Ÿç¶¦ç¶®ç¶©ç¶¡ç·‰ç½³ç¿¢ç¿£ç¿¥ç¿ž"],
["e3a1","è€¤è��è�œè†‰è††è†ƒè†‡è†�è†Œè†‹èˆ•è’—è’¤è’¡è’Ÿè’ºè“Žè“‚è’¬è’®è’«è’¹è’´è“�è“�è’ªè’šè’±è“�è’�è’§è’»è’¢è’”è“‡è“Œè’›è’©è’¯è’¨è“–è’˜è’¶è“�è’ è“—è“”è“’è“›è’°è’‘è™¡èœ³èœ£èœ¨è�«è�€èœ®èœžèœ¡èœ™èœ›è�ƒèœ¬è��èœ¾è�†èœ èœ²èœªèœ­èœ¼èœ’èœºèœ±èœµè�‚èœ¦èœ§èœ¸èœ¤èœšèœ°èœ‘è£·è£§è£±è£²è£ºè£¾è£®è£¼è£¶è£»"],
["e440","è£°è£¬è£«è¦�è¦¡è¦Ÿè¦žè§©è§«è§¨èª«èª™èª‹èª’èª�èª–è°½è±¨è±©è³•è³�è³—è¶–è¸‰è¸‚è·¿è¸�è·½è¸Šè¸ƒè¸‡è¸†è¸…è·¾è¸€è¸„è¼�è¼‘è¼Žè¼�é„£é„œé„ é„¢é„Ÿé„�é„šé„¤é„¡é„›é…ºé…²é…¹é…³éŠ¥éŠ¤é‰¶éŠ›é‰ºéŠ éŠ”éŠªéŠ�"],
["e4a1","éŠ¦éŠšéŠ«é‰¹éŠ—é‰¿éŠ£é‹®éŠŽéŠ‚éŠ•éŠ¢é‰½éŠˆéŠ¡éŠŠéŠ†éŠŒéŠ™éŠ§é‰¾éŠ‡éŠ©éŠ�éŠ‹éˆ­éšžéš¡é›¿é�˜é�½é�ºé�¾éžƒéž€éž‚é�»éž„éž�é�¿éŸŽéŸ�é –é¢­é¢®é¤‚é¤€é¤‡é¦�é¦œé§ƒé¦¹é¦»é¦ºé§‚é¦½é§‡éª±é«£é«§é¬¾é¬¿é­ é­¡é­Ÿé³±é³²é³µéº§åƒ¿å„ƒå„°åƒ¸å„†å„‡åƒ¶åƒ¾å„‹å„Œåƒ½å„ŠåŠ‹åŠŒå‹±å‹¯å™ˆå™‚å™Œå˜µå™�å™Šå™‰å™†å™˜"],
["e540","å™šå™€å˜³å˜½å˜¬å˜¾å˜¸å˜ªå˜ºåœšå¢«å¢�å¢±å¢ å¢£å¢¯å¢¬å¢¥å¢¡å£¿å«¿å«´å«½å«·å«¶å¬ƒå«¸å¬‚å«¹å¬�å¬‡å¬…å¬�å±§å¶™å¶—å¶Ÿå¶’å¶¢å¶“å¶•å¶ å¶œå¶¡å¶šå¶žå¹©å¹�å¹ å¹œç·³å»›å»žå»¡å½‰å¾²æ†‹æ†ƒæ…¹æ†±æ†°æ†¢æ†‰"],
["e5a1","æ†›æ†“æ†¯æ†­æ†Ÿæ†’æ†ªæ†¡æ†�æ…¦æ†³æˆ­æ‘®æ‘°æ’–æ’ æ’…æ’—æ’œæ’�æ’‹æ’Šæ’Œæ’£æ’Ÿæ‘¨æ’±æ’˜æ•¶æ•ºæ•¹æ•»æ–²æ–³æšµæš°æš©æš²æš·æšªæš¯æ¨€æ¨†æ¨—æ§¥æ§¸æ¨•æ§±æ§¤æ¨ æ§¿æ§¬æ§¢æ¨›æ¨�æ§¾æ¨§æ§²æ§®æ¨”æ§·æ§§æ©€æ¨ˆæ§¦æ§»æ¨�æ§¼æ§«æ¨‰æ¨„æ¨˜æ¨¥æ¨�æ§¶æ¨¦æ¨‡æ§´æ¨–æ­‘æ®¥æ®£æ®¢æ®¦æ°�æ°€æ¯¿æ°‚æ½�æ¼¦æ½¾æ¾‡æ¿†æ¾’"],
["e640","æ¾�æ¾‰æ¾Œæ½¢æ½�æ¾…æ½šæ¾–æ½¶æ½¬æ¾‚æ½•æ½²æ½’æ½�æ½—æ¾”æ¾“æ½�æ¼€æ½¡æ½«æ½½æ½§æ¾�æ½“æ¾‹æ½©æ½¿æ¾•æ½£æ½·æ½ªæ½»ç†²ç†¯ç†›ç†°ç† ç†šç†©ç†µç†�ç†¥ç†žç†¤ç†¡ç†ªç†œç†§ç†³çŠ˜çŠšç�˜ç�’ç�žç�Ÿç� ç��ç�›ç�¡ç�šç�™"],
["e6a1","ç�¢ç’‡ç’‰ç’Šç’†ç’�ç‘½ç’…ç’ˆç‘¼ç‘¹ç”ˆç”‡ç•¾ç˜¥ç˜žç˜™ç˜�ç˜œç˜£ç˜šç˜¨ç˜›çšœçš�çšžçš›çž�çž�çž‰çžˆç£�ç¢»ç£�ç£Œç£‘ç£Žç£”ç£ˆç£ƒç£„ç£‰ç¦šç¦¡ç¦ ç¦œç¦¢ç¦›æ­¶ç¨¹çª²çª´çª³ç®·ç¯‹ç®¾ç®¬ç¯Žç®¯ç®¹ç¯Šç®µç³…ç³ˆç³Œç³‹ç··ç·›ç·ªç·§ç·—ç·¡ç¸ƒç·ºç·¦ç·¶ç·±ç·°ç·®ç·Ÿç½¶ç¾¬ç¾°ç¾­ç¿­ç¿«ç¿ªç¿¬ç¿¦ç¿¨è�¤è�§è†£è†Ÿ"],
["e740","è†žè†•è†¢è†™è†—èˆ–è‰�è‰“è‰’è‰�è‰Žè‰‘è”¤è”»è”�è”€è”©è”Žè”‰è”�è”Ÿè”Šè”§è”œè“»è”«è“ºè”ˆè”Œè“´è”ªè“²è”•è“·è“«è“³è“¼è”’è“ªè“©è”–è“¾è”¨è”�è”®è”‚è“½è”žè“¶è”±è”¦è“§è“¨è“°è“¯è“¹è”˜è” è”°è”‹è”™è”¯è™¢"],
["e7a1","è�–è�£è�¤è�·èŸ¡è�³è�˜è�”è�›è�’è�¡è�šè�‘è�žè�­è�ªè��è�Žè�Ÿè��è�¯è�¬è�ºè�®è�œè�¥è��è�»è�µè�¢è�§è�©è¡šè¤…è¤Œè¤”è¤‹è¤—è¤˜è¤™è¤†è¤–è¤‘è¤Žè¤‰è¦¢è¦¤è¦£è§­è§°è§¬è«�è«†èª¸è«“è«‘è«”è«•èª»è«—èª¾è«€è«…è«˜è«ƒèªºèª½è«™è°¾è±�è²�è³¥è³Ÿè³™è³¨è³šè³�è³§è¶ è¶œè¶¡è¶›è¸ è¸£è¸¥è¸¤è¸®è¸•è¸›è¸–è¸‘è¸™è¸¦è¸§"],
["e840","è¸”è¸’è¸˜è¸“è¸œè¸—è¸šè¼¬è¼¤è¼˜è¼šè¼ è¼£è¼–è¼—é�³é�°é�¯é�§é�«é„¯é„«é„©é„ªé„²é„¦é„®é†…é††é†Šé†�é†‚é†„é†€é‹�é‹ƒé‹„é‹€é‹™éŠ¶é‹�é‹±é‹Ÿé‹˜é‹©é‹—é‹�é‹Œé‹¯é‹‚é‹¨é‹Šé‹ˆé‹Žé‹¦é‹�é‹•é‹‰é‹ é‹žé‹§é‹‘é‹“"],
["e8a1","éŠµé‹¡é‹†éŠ´é•¼é–¬é–«é–®é–°éš¤éš¢é›“éœ…éœˆéœ‚é�šéžŠéžŽéžˆéŸ�éŸ�é žé �é ¦é ©é ¨é  é ›é §é¢²é¤ˆé£ºé¤‘é¤”é¤–é¤—é¤•é§œé§�é§�é§“é§”é§Žé§‰é§–é§˜é§‹é§—é§Œéª³é«¬é««é«³é«²é«±é­†é­ƒé­§é­´é­±é­¦é­¶é­µé­°é­¨é­¤é­¬é³¼é³ºé³½é³¿é³·é´‡é´€é³¹é³»é´ˆé´…é´„éºƒé»“é¼�é¼�å„œå„“å„—å„šå„‘å‡žåŒ´å�¡å™°å™ å™®"],
["e940","å™³å™¦å™£å™­å™²å™žå™·åœœåœ›å£ˆå¢½å£‰å¢¿å¢ºå£‚å¢¼å£†å¬—å¬™å¬›å¬¡å¬”å¬“å¬�å¬–å¬¨å¬šå¬ å¬žå¯¯å¶¬å¶±å¶©å¶§å¶µå¶°å¶®å¶ªå¶¨å¶²å¶­å¶¯å¶´å¹§å¹¨å¹¦å¹¯å»©å»§å»¦å»¨å»¥å½‹å¾¼æ†�æ†¨æ†–æ‡…æ†´æ‡†æ‡�æ‡Œæ†º"],
["e9a1","æ†¿æ†¸æ†Œæ“—æ“–æ“�æ“�æ“‰æ’½æ’‰æ“ƒæ“›æ“³æ“™æ”³æ•¿æ•¼æ–¢æ›ˆæš¾æ›€æ›Šæ›‹æ›�æš½æš»æšºæ›Œæœ£æ¨´æ©¦æ©‰æ©§æ¨²æ©¨æ¨¾æ©�æ©­æ©¶æ©›æ©‘æ¨¨æ©šæ¨»æ¨¿æ©�æ©ªæ©¤æ©�æ©�æ©”æ©¯æ©©æ© æ¨¼æ©žæ©–æ©•æ©�æ©Žæ©†æ­•æ­”æ­–æ®§æ®ªæ®«æ¯ˆæ¯‡æ°„æ°ƒæ°†æ¾­æ¿‹æ¾£æ¿‡æ¾¼æ¿Žæ¿ˆæ½žæ¿„æ¾½æ¾žæ¿Šæ¾¨ç€„æ¾¥æ¾®æ¾ºæ¾¬æ¾ªæ¿�æ¾¿æ¾¸"],
["ea40","æ¾¢æ¿‰æ¾«æ¿�æ¾¯æ¾²æ¾°ç‡…ç‡‚ç†¿ç†¸ç‡–ç‡€ç‡�ç‡‹ç‡”ç‡Šç‡‡ç‡�ç†½ç‡˜ç†¼ç‡†ç‡šç‡›çŠ�çŠžç�©ç�¦ç�§ç�¬ç�¥ç�«ç�ªç‘¿ç’šç’ ç’”ç’’ç’•ç’¡ç”‹ç–€ç˜¯ç˜­ç˜±ç˜½ç˜³ç˜¼ç˜µç˜²ç˜°çš»ç›¦çžšçž�çž¡çžœçž›çž¢çž£çž•çž™"],
["eaa1","çž—ç£�ç£©ç£¥ç£ªç£žç££ç£›ç£¡ç£¢ç£­ç£Ÿç£ ç¦¤ç©„ç©ˆç©‡çª¶çª¸çªµçª±çª·ç¯žç¯£ç¯§ç¯�ç¯•ç¯¥ç¯šç¯¨ç¯¹ç¯”ç¯ªç¯¢ç¯œç¯«ç¯˜ç¯Ÿç³’ç³”ç³—ç³�ç³‘ç¸’ç¸¡ç¸—ç¸Œç¸Ÿç¸ ç¸“ç¸Žç¸œç¸•ç¸šç¸¢ç¸‹ç¸�ç¸–ç¸�ç¸”ç¸¥ç¸¤ç½ƒç½»ç½¼ç½ºç¾±ç¿¯è€ªè€©è�¬è†±è†¦è†®è†¹è†µè†«è†°è†¬è†´è†²è†·è†§è‡²è‰•è‰–è‰—è•–è•…è•«è•�è•“è•¡è•˜"],
["eb40","è•€è•†è•¤è•�è•¢è•„è•‘è•‡è•£è”¾è•›è•±è•Žè•®è•µè••è•§è• è–Œè•¦è•�è•”è•¥è•¬è™£è™¥è™¤èž›èž�èž—èž“èž’èžˆèž�èž–èž˜è�¹èž‡èž£èž…èž�èž‘èž�èž„èž”èžœèžšèž‰è¤žè¤¦è¤°è¤­è¤®è¤§è¤±è¤¢è¤©è¤£è¤¯è¤¬è¤Ÿè§±è« "],
["eba1","è«¢è«²è«´è«µè«�è¬”è«¤è«Ÿè«°è«ˆè«žè«¡è«¨è«¿è«¯è«»è²‘è²’è²�è³µè³®è³±è³°è³³èµ¬èµ®è¶¥è¶§è¸³è¸¾è¸¸è¹€è¹…è¸¶è¸¼è¸½è¹�è¸°è¸¿èº½è¼¶è¼®è¼µè¼²è¼¹è¼·è¼´é�¶é�¹é�»é‚†éƒºé„³é„µé„¶é†“é†�é†‘é†�é†�éŒ§éŒžéŒˆéŒŸéŒ†éŒ�é�ºéŒ¸éŒ¼éŒ›éŒ£éŒ’éŒ�é�†éŒ­éŒŽéŒ�é‹‹éŒ�é‹ºéŒ¥éŒ“é‹¹é‹·éŒ´éŒ‚éŒ¤é‹¿éŒ©éŒ¹éŒµéŒªéŒ”éŒŒ"],
["ec40","éŒ‹é‹¾éŒ‰éŒ€é‹»éŒ–é–¼é—�é–¾é–¹é–ºé–¶é–¿é–µé–½éš©é›”éœ‹éœ’éœ�éž™éž—éž”éŸ°éŸ¸é µé ¯é ²é¤¤é¤Ÿé¤§é¤©é¦žé§®é§¬é§¥é§¤é§°é§£é§ªé§©é§§éª¹éª¿éª´éª»é«¶é«ºé«¹é«·é¬³é®€é®…é®‡é­¼é­¾é­»é®‚é®“é®’é®�é­ºé®•"],
["eca1","é­½é®ˆé´¥é´—é´ é´žé´”é´©é´�é´˜é´¢é´�é´™é´Ÿéºˆéº†éº‡éº®éº­é»•é»–é»ºé¼’é¼½å„¦å„¥å„¢å„¤å„ å„©å‹´åš“åšŒåš�åš†åš„åšƒå™¾åš‚å™¿åš�å£–å£”å£�å£’å¬­å¬¥å¬²å¬£å¬¬å¬§å¬¦å¬¯å¬®å­»å¯±å¯²å¶·å¹¬å¹ªå¾¾å¾»æ‡ƒæ†µæ†¼æ‡§æ‡ æ‡¥æ‡¤æ‡¨æ‡žæ“¯æ“©æ“£æ“«æ“¤æ“¨æ–�æ–€æ–¶æ—šæ›’æª�æª–æª�æª¥æª‰æªŸæª›æª¡æªžæª‡æª“æªŽ"],
["ed40","æª•æªƒæª¨æª¤æª‘æ©¿æª¦æªšæª…æªŒæª’æ­›æ®­æ°‰æ¿Œæ¾©æ¿´æ¿”æ¿£æ¿œæ¿­æ¿§æ¿¦æ¿žæ¿²æ¿�æ¿¢æ¿¨ç‡¡ç‡±ç‡¨ç‡²ç‡¤ç‡°ç‡¢ç�³ç�®ç�¯ç’—ç’²ç’«ç’�ç’ªç’­ç’±ç’¥ç’¯ç”�ç”‘ç”’ç”�ç–„ç™ƒç™ˆç™‰ç™‡çš¤ç›©çžµçž«çž²çž·çž¶"],
["eda1","çž´çž±çž¨çŸ°ç£³ç£½ç¤‚ç£»ç£¼ç£²ç¤…ç£¹ç£¾ç¤„ç¦«ç¦¨ç©œç©›ç©–ç©˜ç©”ç©šçª¾ç«€ç«�ç°…ç°�ç¯²ç°€ç¯¿ç¯»ç°Žç¯´ç°‹ç¯³ç°‚ç°‰ç°ƒç°�ç¯¸ç¯½ç°†ç¯°ç¯±ç°�ç°Šç³¨ç¸­ç¸¼ç¹‚ç¸³é¡ˆç¸¸ç¸ªç¹‰ç¹€ç¹‡ç¸©ç¹Œç¸°ç¸»ç¸¶ç¹„ç¸ºç½…ç½¿ç½¾ç½½ç¿´ç¿²è€¬è†»è‡„è‡Œè‡Šè‡…è‡‡è†¼è‡©è‰›è‰šè‰œè–ƒè–€è–�è–§è–•è– è–‹è–£è•»è–¤è–šè–ž"],
["ee40","è•·è•¼è–‰è–¡è•ºè•¸è•—è–Žè––è–†è–�è–™è–�è–�è–¢è–‚è–ˆè–…è•¹è•¶è–˜è–�è–Ÿè™¨èž¾èžªèž­èŸ…èž°èž¬èž¹èžµèž¼èž®èŸ‰èŸƒèŸ‚èŸŒèž·èž¯èŸ„èŸŠèž´èž¶èž¿èž¸èž½èŸžèž²è¤µè¤³è¤¼è¤¾è¥�è¥’è¤·è¥‚è¦­è¦¯è¦®è§²è§³è¬ž"],
["eea1","è¬˜è¬–è¬‘è¬…è¬‹è¬¢è¬�è¬’è¬•è¬‡è¬�è¬ˆè¬†è¬œè¬“è¬šè±�è±°è±²è±±è±¯è²•è²”è³¹èµ¯è¹Žè¹�è¹“è¹�è¹Œè¹‡è½ƒè½€é‚…é�¾é„¸é†šé†¢é†›é†™é†Ÿé†¡é†�é† éŽ¡éŽƒéŽ¯é�¤é�–é�‡é�¼é�˜é�œé�¶é�‰é��é�‘é� é�­éŽ�é�Œé�ªé�¹é�—é�•é�’é��é�±é�·é�»é�¡é�žé�£é�§éŽ€é�Žé�™é—‡é—€é—‰é—ƒé—…é–·éš®éš°éš¬éœ éœŸéœ˜éœ�éœ™éžšéž¡éžœ"],
["ef40","éžžéž�éŸ•éŸ”éŸ±é¡�é¡„é¡Šé¡‰é¡…é¡ƒé¤¥é¤«é¤¬é¤ªé¤³é¤²é¤¯é¤­é¤±é¤°é¦˜é¦£é¦¡é¨‚é§ºé§´é§·é§¹é§¸é§¶é§»é§½é§¾é§¼é¨ƒéª¾é«¾é«½é¬�é«¼é­ˆé®šé®¨é®žé®›é®¦é®¡é®¥é®¤é®†é®¢é® é®¯é´³éµ�éµ§é´¶é´®é´¯é´±é´¸é´°"],
["efa1","éµ…éµ‚éµƒé´¾é´·éµ€é´½ç¿µé´­éºŠéº‰éº�éº°é»ˆé»šé»»é»¿é¼¤é¼£é¼¢é½”é¾ å„±å„­å„®åš˜åšœåš—åššåš�åš™å¥°å¬¼å±©å±ªå·€å¹­å¹®æ‡˜æ‡Ÿæ‡­æ‡®æ‡±æ‡ªæ‡°æ‡«æ‡–æ‡©æ“¿æ”„æ“½æ“¸æ”�æ”ƒæ“¼æ–”æ—›æ›šæ››æ›˜æ«…æª¹æª½æ«¡æ«†æªºæª¶æª·æ«‡æª´æª­æ­žæ¯‰æ°‹ç€‡ç€Œç€�ç€�ç€…ç€”ç€Žæ¿¿ç€€æ¿»ç€¦æ¿¼æ¿·ç€Šçˆ�ç‡¿ç‡¹çˆƒç‡½ç�¶"],
["f040","ç’¸ç“€ç’µç“�ç’¾ç’¶ç’»ç“‚ç””ç”“ç™œç™¤ç™™ç™�ç™“ç™—ç™šçš¦çš½ç›¬çŸ‚çžºç£¿ç¤Œç¤“ç¤”ç¤‰ç¤�ç¤’ç¤‘ç¦­ç¦¬ç©Ÿç°œç°©ç°™ç° ç°Ÿç°­ç°�ç°¦ç°¨ç°¢ç°¥ç°°ç¹œç¹�ç¹–ç¹£ç¹˜ç¹¢ç¹Ÿç¹‘ç¹ ç¹—ç¹“ç¾µç¾³ç¿·ç¿¸è�µè‡‘è‡’"],
["f0a1","è‡�è‰Ÿè‰žè–´è—†è—€è—ƒè—‚è–³è–µè–½è—‡è—„è–¿è—‹è—Žè—ˆè—…è–±è–¶è—’è˜¤è–¸è–·è–¾è™©èŸ§èŸ¦èŸ¢èŸ›èŸ«èŸªèŸ¥èŸŸèŸ³èŸ¤èŸ”èŸœèŸ“èŸ­èŸ˜èŸ£èž¤èŸ—èŸ™è �èŸ´èŸ¨èŸ�è¥“è¥‹è¥�è¥Œè¥†è¥�è¥‘è¥‰è¬ªè¬§è¬£è¬³è¬°è¬µè­‡è¬¯è¬¼è¬¾è¬±è¬¥è¬·è¬¦è¬¶è¬®è¬¤è¬»è¬½è¬ºè±‚è±µè²™è²˜è²—è³¾è´„è´‚è´€è¹œè¹¢è¹ è¹—è¹–è¹žè¹¥è¹§"],
["f140","è¹›è¹šè¹¡è¹�è¹©è¹”è½†è½‡è½ˆè½‹é„¨é„ºé„»é„¾é†¨é†¥é†§é†¯é†ªéŽµéŽŒéŽ’éŽ·éŽ›éŽ�éŽ‰éŽ§éŽŽéŽªéŽžéŽ¦éŽ•éŽˆéŽ™éŽŸéŽ�éŽ±éŽ‘éŽ²éŽ¤éŽ¨éŽ´éŽ£éŽ¥é—’é—“é—‘éš³é›—é›šå·‚é›Ÿé›˜é›�éœ£éœ¢éœ¥éž¬éž®éž¨éž«éž¤éžª"],
["f1a1","éž¢éž¥éŸ—éŸ™éŸ–éŸ˜éŸºé¡�é¡‘é¡’é¢¸é¥�é¤¼é¤ºé¨�é¨‹é¨‰é¨�é¨„é¨‘é¨Šé¨…é¨‡é¨†é«€é«œé¬ˆé¬„é¬…é¬©é¬µé­Šé­Œé­‹é¯‡é¯†é¯ƒé®¿é¯�é®µé®¸é¯“é®¶é¯„é®¹é®½éµœéµ“éµ�éµŠéµ›éµ‹éµ™éµ–éµŒéµ—éµ’éµ”éµŸéµ˜éµšéºŽéºŒé»Ÿé¼�é¼€é¼–é¼¥é¼«é¼ªé¼©é¼¨é½Œé½•å„´å„µåŠ–å‹·åŽ´åš«åš­åš¦åš§åšªåš¬å£šå£�å£›å¤’å¬½å¬¾å¬¿å·ƒå¹°"],
["f240","å¾¿æ‡»æ”‡æ”�æ”�æ”‰æ”Œæ”Žæ–„æ—žæ—�æ›žæ«§æ« æ«Œæ«‘æ«™æ«‹æ«Ÿæ«œæ«�æ««æ«�æ«�æ«žæ­ æ®°æ°Œç€™ç€§ç€ ç€–ç€«ç€¡ç€¢ç€£ç€©ç€—ç€¤ç€œç€ªçˆŒçˆŠçˆ‡çˆ‚çˆ…çŠ¥çŠ¦çŠ¤çŠ£çŠ¡ç“‹ç“…ç’·ç“ƒç”–ç™ çŸ‰çŸŠçŸ„çŸ±ç¤�ç¤›"],
["f2a1","ç¤¡ç¤œç¤—ç¤žç¦°ç©§ç©¨ç°³ç°¼ç°¹ç°¬ç°»ç³¬ç³ªç¹¶ç¹µç¹¸ç¹°ç¹·ç¹¯ç¹ºç¹²ç¹´ç¹¨ç½‹ç½Šç¾ƒç¾†ç¾·ç¿½ç¿¾è�¸è‡—è‡•è‰¤è‰¡è‰£è—«è—±è—­è—™è—¡è—¨è—šè——è—¬è—²è—¸è—˜è—Ÿè—£è—œè—‘è—°è—¦è—¯è—žè—¢è €èŸºè ƒèŸ¶èŸ·è ‰è Œè ‹è †èŸ¼è ˆèŸ¿è Šè ‚è¥¢è¥šè¥›è¥—è¥¡è¥œè¥˜è¥�è¥™è¦ˆè¦·è¦¶è§¶è­�è­ˆè­Šè­€è­“è­–è­”è­‹è­•"],
["f340","è­‘è­‚è­’è­—è±ƒè±·è±¶è²šè´†è´‡è´‰è¶¬è¶ªè¶­è¶«è¹­è¹¸è¹³è¹ªè¹¯è¹»è»‚è½’è½‘è½�è½�è½“è¾´é…€é„¿é†°é†­é�žé�‡é��é�‚é�šé��é�¹é�¬é�Œé�™éŽ©é�¦é�Šé�”é�®é�£é�•é�„é�Žé�€é�’é�§é•½é—šé—›é›¡éœ©éœ«éœ¬éœ¨éœ¦"],
["f3a1","éž³éž·éž¶éŸ�éŸžéŸŸé¡œé¡™é¡�é¡—é¢¿é¢½é¢»é¢¾é¥ˆé¥‡é¥ƒé¦¦é¦§é¨šé¨•é¨¥é¨�é¨¤é¨›é¨¢é¨ é¨§é¨£é¨žé¨œé¨”é«‚é¬‹é¬Šé¬Žé¬Œé¬·é¯ªé¯«é¯ é¯žé¯¤é¯¦é¯¢é¯°é¯”é¯—é¯¬é¯œé¯™é¯¥é¯•é¯¡é¯šéµ·é¶�é¶Šé¶„é¶ˆéµ±é¶€éµ¸é¶†é¶‹é¶Œéµ½éµ«éµ´éµµéµ°éµ©é¶…éµ³éµ»é¶‚éµ¯éµ¹éµ¿é¶‡éµ¨éº”éº‘é»€é»¼é¼­é½€é½�é½�é½–é½—é½˜åŒ·åš²"],
["f440","åšµåš³å££å­…å·†å·‡å»®å»¯å¿€å¿�æ‡¹æ”—æ”–æ”•æ”“æ—Ÿæ›¨æ›£æ›¤æ«³æ«°æ«ªæ«¨æ«¹æ«±æ«®æ«¯ç€¼ç€µç€¯ç€·ç€´ç€±ç�‚ç€¸ç€¿ç€ºç€¹ç�€ç€»ç€³ç��çˆ“çˆ”çŠ¨ç�½ç�¼ç’ºçš«çšªçš¾ç›­çŸŒçŸŽçŸ�çŸ�çŸ²ç¤¥ç¤£ç¤§ç¤¨ç¤¤ç¤©"],
["f4a1","ç¦²ç©®ç©¬ç©­ç«·ç±‰ç±ˆç±Šç±‡ç±…ç³®ç¹»ç¹¾çº�çº€ç¾ºç¿¿è�¹è‡›è‡™èˆ‹è‰¨è‰©è˜¢è—¿è˜�è—¾è˜›è˜€è—¶è˜„è˜‰è˜…è˜Œè—½è ™è �è ‘è —è “è –è¥£è¥¦è¦¹è§·è­ è­ªè­�è­¨è­£è­¥è­§è­­è¶®èº†èºˆèº„è½™è½–è½—è½•è½˜è½šé‚�é…ƒé…�é†·é†µé†²é†³é�‹é�“é�»é� é��é�”é�¾é�•é��é�¨é�™é��é�µé�€é�·é�‡é�Žé�–é�’é�ºé�‰é�¸é�Šé�¿"],
["f540","é�¼é�Œé�¶é�‘é�†é—žé— é—Ÿéœ®éœ¯éž¹éž»éŸ½éŸ¾é¡ é¡¢é¡£é¡Ÿé£�é£‚é¥�é¥Žé¥™é¥Œé¥‹é¥“é¨²é¨´é¨±é¨¬é¨ªé¨¶é¨©é¨®é¨¸é¨­é«‡é«Šé«†é¬�é¬’é¬‘é°‹é°ˆé¯·é°…é°’é¯¸é±€é°‡é°Žé°†é°—é°”é°‰é¶Ÿé¶™é¶¤é¶�é¶’é¶˜é¶�é¶›"],
["f5a1","é¶ é¶”é¶œé¶ªé¶—é¶¡é¶šé¶¢é¶¨é¶žé¶£é¶¿é¶©é¶–é¶¦é¶§éº™éº›éºšé»¥é»¤é»§é»¦é¼°é¼®é½›é½ é½žé½�é½™é¾‘å„ºå„¹åŠ˜åŠ—å›ƒåš½åš¾å­ˆå­‡å·‹å·�å»±æ‡½æ”›æ¬‚æ«¼æ¬ƒæ«¸æ¬€ç�ƒç�„ç�Šç�ˆç�‰ç�…ç�†çˆ�çˆšçˆ™ç�¾ç”—ç™ªçŸ�ç¤­ç¤±ç¤¯ç±”ç±“ç³²çºŠçº‡çºˆçº‹çº†çº�ç½�ç¾»è€°è‡�è˜˜è˜ªè˜¦è˜Ÿè˜£è˜œè˜™è˜§è˜®è˜¡è˜ è˜©è˜žè˜¥"],
["f640","è ©è �è ›è  è ¤è œè «è¡Šè¥­è¥©è¥®è¥«è§ºè­¹è­¸è­…è­ºè­»è´�è´”è¶¯èºŽèºŒè½žè½›è½�é…†é…„é……é†¹é�¿é�»é�¶é�©é�½é�¼é�°é�¹é�ªé�·é�¬é‘€é�±é—¥é—¤é—£éœµéœºéž¿éŸ¡é¡¤é£‰é£†é£€é¥˜é¥–é¨¹é¨½é©†é©„é©‚é©�é¨º"],
["f6a1","é¨¿é«�é¬•é¬—é¬˜é¬–é¬ºé­’é°«é°�é°œé°¬é°£é°¨é°©é°¤é°¡é¶·é¶¶é¶¼é·�é·‡é·Šé·�é¶¾é·…é·ƒé¶»é¶µé·Žé¶¹é¶ºé¶¬é·ˆé¶±é¶­é·Œé¶³é·�é¶²é¹ºéºœé»«é»®é»­é¼›é¼˜é¼šé¼±é½Žé½¥é½¤é¾’äº¹å›†å›…å›‹å¥±å­‹å­Œå·•å·‘å»²æ”¡æ” æ”¦æ”¢æ¬‹æ¬ˆæ¬‰æ°�ç�•ç�–ç�—ç�’çˆžçˆŸçŠ©ç�¿ç“˜ç“•ç“™ç“—ç™­çš­ç¤µç¦´ç©°ç©±ç±—ç±œç±™ç±›ç±š"],
["f740","ç³´ç³±çº‘ç½�ç¾‡è‡žè‰«è˜´è˜µè˜³è˜¬è˜²è˜¶è ¬è ¨è ¦è ªè ¥è¥±è¦¿è¦¾è§»è­¾è®„è®‚è®†è®…è­¿è´•èº•èº”èºšèº’èº�èº–èº—è½ è½¢é…‡é‘Œé‘�é‘Šé‘‹é‘�é‘‡é‘…é‘ˆé‘‰é‘†éœ¿éŸ£é¡ªé¡©é£‹é¥”é¥›é©Žé©“é©”é©Œé©�é©ˆé©Š"],
["f7a1","é©‰é©’é©�é«�é¬™é¬«é¬»é­–é­•é±†é±ˆé°¿é±„é°¹é°³é±�é°¼é°·é°´é°²é°½é°¶é·›é·’é·žé·šé·‹é·�é·œé·‘é·Ÿé·©é·™é·˜é·–é·µé·•é·�éº¶é»°é¼µé¼³é¼²é½‚é½«é¾•é¾¢å„½åŠ™å£¨å£§å¥²å­�å·˜è ¯å½�æˆ�æˆƒæˆ„æ”©æ”¥æ––æ›«æ¬‘æ¬’æ¬�æ¯Šç�›ç�šçˆ¢çŽ‚çŽ�çŽƒç™°çŸ”ç±§ç±¦çº•è‰¬è˜ºè™€è˜¹è˜¼è˜±è˜»è˜¾è °è ²è ®è ³è¥¶è¥´è¥³è§¾"],
["f840","è®Œè®Žè®‹è®ˆè±…è´™èº˜è½¤è½£é†¼é‘¢é‘•é‘�é‘—é‘žéŸ„éŸ…é €é©–é©™é¬žé¬Ÿé¬ é±’é±˜é±�é±Šé±�é±‹é±•é±™é±Œé±Žé·»é··é·¯é·£é·«é·¸é·¤é·¶é·¡é·®é·¦é·²é·°é·¢é·¬é·´é·³é·¨é·­é»‚é»�é»²é»³é¼†é¼œé¼¸é¼·é¼¶é½ƒé½�"],
["f8a1","é½±é½°é½®é½¯å›“å›�å­Žå±­æ”­æ›­æ›®æ¬“ç�Ÿç�¡ç��ç� çˆ£ç“›ç“¥çŸ•ç¤¸ç¦·ç¦¶ç±ªçº—ç¾‰è‰­è™ƒè ¸è ·è µè¡‹è®”è®•èºžèºŸèº èº�é†¾é†½é‡‚é‘«é‘¨é‘©é›¥é�†é�ƒé�‡éŸ‡éŸ¥é©žé«•é­™é±£é±§é±¦é±¢é±žé± é¸‚é·¾é¸‡é¸ƒé¸†é¸…é¸€é¸�é¸‰é·¿é·½é¸„éº é¼žé½†é½´é½µé½¶å›”æ”®æ–¸æ¬˜æ¬™æ¬—æ¬šç�¢çˆ¦çŠªçŸ˜çŸ™ç¤¹ç±©ç±«ç³¶çºš"],
["f940","çº˜çº›çº™è‡ è‡¡è™†è™‡è™ˆè¥¹è¥ºè¥¼è¥»è§¿è®˜è®™èº¥èº¤èº£é‘®é‘­é‘¯é‘±é‘³é�‰é¡²é¥Ÿé±¨é±®é±­é¸‹é¸�é¸�é¸�é¸’é¸‘éº¡é»µé¼‰é½‡é½¸é½»é½ºé½¹åœžç�¦ç±¯è ¼è¶²èº¦é‡ƒé‘´é‘¸é‘¶é‘µé© é±´é±³é±±é±µé¸”é¸“é»¶é¼Š"],
["f9a1","é¾¤ç�¨ç�¥ç³·è™ªè ¾è ½è ¿è®žè²œèº©è»‰é�‹é¡³é¡´é£Œé¥¡é¦«é©¤é©¦é©§é¬¤é¸•é¸—é½ˆæˆ‡æ¬žçˆ§è™Œèº¨é’‚é’€é’�é©©é©¨é¬®é¸™çˆ©è™‹è®Ÿé’ƒé±¹éº·ç™µé©«é±ºé¸�ç�©ç�ªéº¤é½¾é½‰é¾˜ç¢�éŠ¹è£�å¢»æ�’ç²§å«ºâ•”â•¦â•—â• â•¬â•£â•šâ•©â•�â•’â•¤â••â•žâ•ªâ•¡â•˜â•§â•›â•“â•¥â•–â•Ÿâ•«â•¢â•™â•¨â•œâ•‘â•�â•­â•®â•°â•¯â–“"]
]
[
["0","\u0000",127],
["8ea1","ï½¡",62],
["a1a1","ã€€ã€�ã€‚ï¼Œï¼Žãƒ»ï¼šï¼›ï¼Ÿï¼�ã‚›ã‚œÂ´ï½€Â¨ï¼¾ï¿£ï¼¿ãƒ½ãƒ¾ã‚�ã‚žã€ƒä»�ã€…ã€†ã€‡ãƒ¼â€•â€�ï¼�ï¼¼ï½žâˆ¥ï½œâ€¦â€¥â€˜â€™â€œâ€�ï¼ˆï¼‰ã€”ã€•ï¼»ï¼½ï½›ï½�ã€ˆ",9,"ï¼‹ï¼�Â±Ã—Ã·ï¼�â‰ ï¼œï¼žâ‰¦â‰§âˆžâˆ´â™‚â™€Â°â€²â€³â„ƒï¿¥ï¼„ï¿ ï¿¡ï¼…ï¼ƒï¼†ï¼Šï¼ Â§â˜†â˜…â—‹â—�â—Žâ—‡"],
["a2a1","â—†â–¡â– â–³â–²â–½â–¼â€»ã€’â†’â†�â†‘â†“ã€“"],
["a2ba","âˆˆâˆ‹âŠ†âŠ‡âŠ‚âŠƒâˆªâˆ©"],
["a2ca","âˆ§âˆ¨ï¿¢â‡’â‡”âˆ€âˆƒ"],
["a2dc","âˆ âŠ¥âŒ’âˆ‚âˆ‡â‰¡â‰’â‰ªâ‰«âˆšâˆ½âˆ�âˆµâˆ«âˆ¬"],
["a2f2","â„«â€°â™¯â™­â™ªâ€ â€¡Â¶"],
["a2fe","â—¯"],
["a3b0","ï¼�",9],
["a3c1","ï¼¡",25],
["a3e1","ï½�",25],
["a4a1","ã��",82],
["a5a1","ã‚¡",85],
["a6a1","Î‘",16,"Î£",6],
["a6c1","Î±",16,"Ïƒ",6],
["a7a1","Ð�",5,"Ð�Ð–",25],
["a7d1","Ð°",5,"Ñ‘Ð¶",25],
["a8a1","â”€â”‚â”Œâ”�â”˜â””â”œâ”¬â”¤â”´â”¼â”�â”ƒâ”�â”“â”›â”—â”£â”³â”«â”»â•‹â” â”¯â”¨â”·â”¿â”�â”°â”¥â”¸â•‚"],
["ada1","â‘ ",19,"â… ",9],
["adc0","ã�‰ãŒ”ãŒ¢ã��ãŒ˜ãŒ§ãŒƒãŒ¶ã�‘ã�—ãŒ�ãŒ¦ãŒ£ãŒ«ã�ŠãŒ»ãŽœãŽ�ãŽžãŽŽãŽ�ã�„ãŽ¡"],
["addf","ã�»ã€�ã€Ÿâ„–ã��â„¡ãŠ¤",4,"ãˆ±ãˆ²ãˆ¹ã�¾ã�½ã�¼â‰’â‰¡âˆ«âˆ®âˆ‘âˆšâŠ¥âˆ âˆŸâŠ¿âˆµâˆ©âˆª"],
["b0a1","äºœå”–å¨ƒé˜¿å“€æ„›æŒ¨å§¶é€¢è‘µèŒœç©�æ‚ªæ�¡æ¸¥æ—­è‘¦èŠ¦é¯µæ¢“åœ§æ–¡æ‰±å®›å§�è™»é£´çµ¢ç¶¾é®Žæˆ–ç²Ÿè¢·å®‰åºµæŒ‰æš—æ¡ˆé—‡éž�æ��ä»¥ä¼Šä½�ä¾�å�‰å›²å¤·å§”å¨�å°‰æƒŸæ„�æ…°æ˜“æ¤…ç‚ºç•�ç•°ç§»ç¶­ç·¯èƒƒè�Žè¡£è¬‚é�•é�ºåŒ»äº•äº¥åŸŸè‚²éƒ�ç£¯ä¸€å£±æº¢é€¸ç¨²èŒ¨èŠ‹é°¯å…�å�°å’½å“¡å› å§»å¼•é£²æ·«èƒ¤è”­"],
["b1a1","é™¢é™°éš éŸ»å�‹å�³å®‡çƒ�ç¾½è¿‚é›¨å�¯éµœçªºä¸‘ç¢“è‡¼æ¸¦å˜˜å”„æ¬�è”šé°»å§¥åŽ©æµ¦ç“œé–�å™‚äº‘é�‹é›²è��é¤Œå�¡å–¶å¬°å½±æ˜ æ›³æ „æ°¸æ³³æ´©ç‘›ç›ˆç©Žé ´è‹±è¡›è© é‹­æ¶²ç–«ç›Šé§…æ‚¦è¬�è¶Šé–²æ¦ŽåŽ­å††åœ’å °å¥„å®´å»¶æ€¨æŽ©æ�´æ²¿æ¼”ç‚Žç„”ç…™ç‡•çŒ¿ç¸�è‰¶è‹‘è–—é� é‰›é´›å¡©æ–¼æ±šç”¥å‡¹å¤®å¥¥å¾€å¿œ"],
["b2a1","æŠ¼æ—ºæ¨ªæ¬§æ®´çŽ‹ç¿�è¥–é´¬é´Žé»„å²¡æ²–è�»å„„å±‹æ†¶è‡†æ¡¶ç‰¡ä¹™ä¿ºå�¸æ�©æ¸©ç©�éŸ³ä¸‹åŒ–ä»®ä½•ä¼½ä¾¡ä½³åŠ å�¯å˜‰å¤�å«�å®¶å¯¡ç§‘æš‡æžœæž¶æ­Œæ²³ç�«ç�‚ç¦�ç¦¾ç¨¼ç®‡èŠ±è‹›èŒ„è�·è�¯è�“è�¦èª²å˜©è²¨è¿¦é�ŽéœžèšŠä¿„å³¨æˆ‘ç‰™ç”»è‡¥èŠ½è›¾è³€é›…é¤“é§•ä»‹ä¼šè§£å›žå¡Šå£Šå»»å¿«æ€ªæ‚”æ�¢æ‡�æˆ’æ‹�æ”¹"],
["b3a1","é­�æ™¦æ¢°æµ·ç�°ç•Œçš†çµµèŠ¥èŸ¹é–‹éšŽè²�å‡±åŠ¾å¤–å’³å®³å´–æ…¨æ¦‚æ¶¯ç¢�è“‹è¡—è©²éŽ§éª¸æµ¬é¦¨è›™åž£æŸ¿è›ŽéˆŽåŠƒåš‡å�„å»“æ‹¡æ’¹æ ¼æ ¸æ®»ç�²ç¢ºç©«è¦šè§’èµ«è¼ƒéƒ­é–£éš”é�©å­¦å²³æ¥½é¡�é¡ŽæŽ›ç¬ æ¨«æ©¿æ¢¶é°�æ½Ÿå‰²å–�æ�°æ‹¬æ´»æ¸‡æ»‘è‘›è¤�è½„ä¸”é°¹å�¶æ¤›æ¨ºéž„æ ªå…œç«ƒè’²é‡œéŽŒå™›é´¨æ ¢èŒ…è�±"],
["b4a1","ç²¥åˆˆè‹…ç“¦ä¹¾ä¾ƒå† å¯’åˆŠå‹˜å‹§å·»å–šå ªå§¦å®Œå®˜å¯›å¹²å¹¹æ‚£æ„Ÿæ…£æ†¾æ�›æ•¢æŸ‘æ¡“æ£ºæ¬¾æ­“æ±—æ¼¢æ¾—æ½…ç’°ç”˜ç›£çœ‹ç«¿ç®¡ç°¡ç·©ç¼¶ç¿°è‚�è‰¦èŽžè¦³è«Œè²«é‚„é‘‘é–“é–‘é–¢é™¥éŸ“é¤¨èˆ˜ä¸¸å�«å²¸å·ŒçŽ©ç™Œçœ¼å²©ç¿«è´‹é›�é ‘é¡”é¡˜ä¼�ä¼Žå�±å–œå™¨åŸºå¥‡å¬‰å¯„å²�å¸Œå¹¾å¿Œæ�®æœºæ——æ—¢æœŸæ£‹æ£„"],
["b5a1","æ©Ÿå¸°æ¯…æ°—æ±½ç•¿ç¥ˆå­£ç¨€ç´€å¾½è¦�è¨˜è²´èµ·è»Œè¼�é£¢é¨Žé¬¼äº€å�½å„€å¦“å®œæˆ¯æŠ€æ“¬æ¬ºçŠ ç–‘ç¥‡ç¾©èŸ»èª¼è­°æŽ¬è�Šéž å�‰å�ƒå–«æ¡”æ©˜è©°ç §æ�µé»�å�´å®¢è„šè™�é€†ä¸˜ä¹…ä»‡ä¼‘å�Šå�¸å®®å¼“æ€¥æ•‘æœ½æ±‚æ±²æ³£ç�¸ç�ƒç©¶çª®ç¬ˆç´šç³¾çµ¦æ—§ç‰›åŽ»å±…å·¨æ‹’æ‹ æŒ™æ¸ è™šè¨±è·�é‹¸æ¼�ç¦¦é­šäº¨äº«äº¬"],
["b6a1","ä¾›ä¾ åƒ‘å…‡ç«¶å…±å‡¶å�”åŒ¡å�¿å�«å–¬å¢ƒå³¡å¼·å½Šæ€¯æ��æ�­æŒŸæ•™æ©‹æ³�ç‹‚ç‹­çŸ¯èƒ¸è„…èˆˆè•Žéƒ·é�¡éŸ¿é¥—é©šä»°å‡�å°­æš�æ¥­å±€æ›²æ¥µçŽ‰æ¡�ç²�åƒ…å‹¤å�‡å·¾éŒ¦æ–¤æ¬£æ¬½ç�´ç¦�ç¦½ç­‹ç·ŠèŠ¹è�Œè¡¿è¥Ÿè¬¹è¿‘é‡‘å�ŸéŠ€ä¹�å€¶å�¥åŒºç‹—çŽ–çŸ©è‹¦èº¯é§†é§ˆé§’å…·æ„šè™žå–°ç©ºå�¶å¯“é�‡éš…ä¸²æ«›é‡§å±‘å±ˆ"],
["b7a1","æŽ˜çªŸæ²“é�´è½¡çªªç†Šéšˆç²‚æ —ç¹°æ¡‘é�¬å‹²å�›è–«è¨“ç¾¤è»�éƒ¡å�¦è¢ˆç¥�ä¿‚å‚¾åˆ‘å…„å•“åœ­ç�ªåž‹å¥‘å½¢å¾„æ�µæ…¶æ…§æ†©æŽ²æ�ºæ•¬æ™¯æ¡‚æ¸“ç•¦ç¨½ç³»çµŒç¶™ç¹‹ç½«èŒŽè�Šè›�è¨ˆè©£è­¦è»½é šé¶�èŠ¸è¿Žé¯¨åŠ‡æˆŸæ’ƒæ¿€éš™æ¡�å‚‘æ¬ æ±ºæ½”ç©´çµ�è¡€è¨£æœˆä»¶å€¹å€¦å�¥å…¼åˆ¸å‰£å–§åœ�å …å«Œå»ºæ†²æ‡¸æ‹³æ�²"],
["b8a1","æ¤œæ¨©ç‰½çŠ¬çŒ®ç ”ç¡¯çµ¹çœŒè‚©è¦‹è¬™è³¢è»’é�£é�µé™ºé¡•é¨“é¹¸å…ƒåŽŸåŽ³å¹»å¼¦æ¸›æº�çŽ„ç�¾çµƒèˆ·è¨€è«ºé™�ä¹Žå€‹å�¤å‘¼å›ºå§‘å­¤å·±åº«å¼§æˆ¸æ•…æž¯æ¹–ç‹�ç³Šè¢´è‚¡èƒ¡è�°è™Žèª‡è·¨éˆ·é›‡é¡§é¼“äº”äº’ä¼�å�ˆå‘‰å�¾å¨¯å¾Œå¾¡æ‚Ÿæ¢§æªŽç‘šç¢�èªžèª¤è­·é†�ä¹žé¯‰äº¤ä½¼ä¾¯å€™å€–å…‰å…¬åŠŸåŠ¹å‹¾åŽšå�£å�‘"],
["b9a1","å�Žå–‰å�‘åž¢å¥½å­”å­�å®�å·¥å·§å··å¹¸åºƒåºšåº·å¼˜æ�’æ…ŒæŠ—æ‹˜æŽ§æ”»æ˜‚æ™ƒæ›´æ�­æ ¡æ¢—æ§‹æ±Ÿæ´ªæµ©æ¸¯æº�ç”²çš‡ç¡¬ç¨¿ç³ ç´…ç´˜çµžç¶±è€•è€ƒè‚¯è‚±è…”è†�èˆªè�’è¡Œè¡¡è¬›è²¢è³¼éƒŠé…µé‰±ç ¿é‹¼é–¤é™�é …é¦™é«˜é´»å‰›åŠ«å�·å�ˆå£•æ‹·æ¿ è±ªè½Ÿéº¹å…‹åˆ»å‘Šå›½ç©€é…·éµ é»’ç�„æ¼‰è…°ç”‘å¿½æƒšéª¨ç‹›è¾¼"],
["baa1","æ­¤é ƒä»Šå›°å�¤å¢¾å©šæ�¨æ‡‡æ˜�æ˜†æ ¹æ¢±æ··ç—•ç´ºè‰®é­‚äº›ä½�å�‰å”†åµ¯å·¦å·®æŸ»æ²™ç‘³ç ‚è©�éŽ–è£Ÿå��åº§æŒ«å‚µå‚¬å†�æœ€å“‰å¡žå¦»å®°å½©æ‰�æŽ¡æ ½æ­³æ¸ˆç�½é‡‡çŠ€ç •ç ¦ç¥­æ–Žç´°è�œè£�è¼‰éš›å‰¤åœ¨æ��ç½ªè²¡å†´å�‚é˜ªå ºæ¦Šè‚´å’²å´ŽåŸ¼ç¢•é·ºä½œå‰Šå’‹æ�¾æ˜¨æœ”æŸµçª„ç­–ç´¢éŒ¯æ¡œé®­ç¬¹åŒ™å†Šåˆ·"],
["bba1","å¯Ÿæ‹¶æ’®æ“¦æœ­æ®ºè–©é›‘çš�é¯–æ�ŒéŒ†é®«çš¿æ™’ä¸‰å‚˜å�‚å±±æƒ¨æ’’æ•£æ¡Ÿç‡¦ç�Šç”£ç®—çº‚èš•è®ƒè³›é…¸é¤�æ–¬æš«æ®‹ä»•ä»”ä¼ºä½¿åˆºå�¸å�²å—£å››å£«å§‹å§‰å§¿å­�å±�å¸‚å¸«å¿—æ€�æŒ‡æ”¯å­œæ–¯æ–½æ—¨æž�æ­¢æ­»æ°�ç�…ç¥‰ç§�ç³¸ç´™ç´«è‚¢è„‚è‡³è¦–è©žè©©è©¦èªŒè«®è³‡è³œé›Œé£¼æ­¯äº‹ä¼¼ä¾�å…�å­—å¯ºæ…ˆæŒ�æ™‚"],
["bca1","æ¬¡æ»‹æ²»çˆ¾ç’½ç—”ç£�ç¤ºè€Œè€³è‡ªè’”è¾žæ±�é¹¿å¼�è­˜é´«ç«ºè»¸å®�é›«ä¸ƒå�±åŸ·å¤±å«‰å®¤æ‚‰æ¹¿æ¼†ç–¾è³ªå®Ÿè”€ç¯ å�²æŸ´èŠ�å±¡è•Šç¸žèˆŽå†™å°„æ�¨èµ¦æ–œç…®ç¤¾ç´—è€…è¬�è»Šé�®è›‡é‚ªå€Ÿå‹ºå°ºæ�“ç�¼çˆµé…Œé‡ˆéŒ«è‹¥å¯‚å¼±æƒ¹ä¸»å�–å®ˆæ‰‹æœ±æ®Šç‹©ç� ç¨®è…«è¶£é…’é¦–å„’å�—å‘ªå¯¿æŽˆæ¨¹ç¶¬éœ€å›šå�Žå‘¨"],
["bda1","å®—å°±å·žä¿®æ„�æ‹¾æ´²ç§€ç§‹çµ‚ç¹�ç¿’è‡­èˆŸè’�è¡†è¥²è®�è¹´è¼¯é€±é…‹é…¬é›†é†œä»€ä½�å……å��å¾“æˆŽæŸ”æ±�æ¸‹ç�£ç¸¦é‡�éŠƒå�”å¤™å®¿æ·‘ç¥�ç¸®ç²›å¡¾ç†Ÿå‡ºè¡“è¿°ä¿Šå³»æ˜¥çž¬ç«£èˆœé§¿å‡†å¾ªæ—¬æ¥¯æ®‰æ·³æº–æ½¤ç›¾ç´”å·¡é�µé†‡é †å‡¦åˆ�æ‰€æš‘æ›™æ¸šåº¶ç·’ç½²æ›¸è–¯è—·è«¸åŠ©å�™å¥³åº�å¾�æ�•é‹¤é™¤å‚·å„Ÿ"],
["bea1","å‹�åŒ å�‡å�¬å“¨å•†å”±å˜—å¥¨å¦¾å¨¼å®µå°†å°�å°‘å°šåº„åºŠå» å½°æ‰¿æŠ„æ‹›æŽŒæ�·æ˜‡æ˜Œæ˜­æ™¶æ�¾æ¢¢æ¨Ÿæ¨µæ²¼æ¶ˆæ¸‰æ¹˜ç„¼ç„¦ç…§ç—‡çœ�ç¡�ç¤�ç¥¥ç§°ç« ç¬‘ç²§ç´¹è‚–è�–è’‹è•‰è¡�è£³è¨Ÿè¨¼è©”è©³è±¡è³žé†¤é‰¦é�¾é�˜éšœéž˜ä¸Šä¸ˆä¸žä¹—å†—å‰°åŸŽå ´å£Œå¬¢å¸¸æƒ…æ“¾æ�¡æ�–æµ„çŠ¶ç•³ç©£è’¸è­²é†¸éŒ å˜±åŸ´é£¾"],
["bfa1","æ‹­æ¤�æ®–ç‡­ç¹”è�·è‰²è§¦é£Ÿè�•è¾±å°»ä¼¸ä¿¡ä¾µå”‡å¨ å¯�å¯©å¿ƒæ…ŽæŒ¯æ–°æ™‹æ£®æ¦›æµ¸æ·±ç”³ç–¹çœŸç¥žç§¦ç´³è‡£èŠ¯è–ªè¦ªè¨ºèº«è¾›é€²é‡�éœ‡äººä»�åˆƒå¡µå£¬å°‹ç”šå°½è…Žè¨Šè¿…é™£é�­ç¬¥è«�é ˆé…¢å›³åŽ¨é€—å�¹åž‚å¸¥æŽ¨æ°´ç‚Šç�¡ç²‹ç¿ è¡°é�‚é…”éŒ�éŒ˜éš�ç‘žé«„å´‡åµ©æ•°æž¢è¶¨é››æ�®æ�‰æ¤™è�…é —é›€è£¾"],
["c0a1","æ¾„æ‘ºå¯¸ä¸–ç€¬ç•�æ˜¯å‡„åˆ¶å‹¢å§“å¾�æ€§æˆ�æ”¿æ•´æ˜Ÿæ™´æ£²æ –æ­£æ¸…ç‰²ç”Ÿç››ç²¾è�–å£°è£½è¥¿èª èª“è«‹é€�é†’é�’é�™æ–‰ç¨Žè„†éš»å¸­æƒœæˆšæ–¥æ˜”æž�çŸ³ç©�ç±�ç¸¾è„Šè²¬èµ¤è·¡è¹Ÿç¢©åˆ‡æ‹™æŽ¥æ‘‚æŠ˜è¨­çªƒç¯€èª¬é›ªçµ¶èˆŒè�‰ä»™å…ˆå�ƒå� å®£å°‚å°–å·�æˆ¦æ‰‡æ’°æ “æ ´æ³‰æµ…æ´—æŸ“æ½œç…Žç…½æ—‹ç©¿ç®­ç·š"],
["c1a1","ç¹Šç¾¨è…ºèˆ›èˆ¹è–¦è©®è³Žè·µé�¸é�·éŠ­éŠ‘é–ƒé®®å‰�å–„æ¼¸ç„¶å…¨ç¦…ç¹•è†³ç³Žå™Œå¡‘å²¨æŽªæ›¾æ›½æ¥šç‹™ç–�ç–Žç¤Žç¥–ç§Ÿç²—ç´ çµ„è˜‡è¨´é˜»é�¡é¼ åƒ§å‰µå�Œå�¢å€‰å–ªå£®å¥�çˆ½å®‹å±¤åŒ�æƒ£æƒ³æ�œæŽƒæŒ¿æŽ»æ“�æ—©æ›¹å·£æ§�æ§½æ¼•ç‡¥äº‰ç—©ç›¸çª“ç³Ÿç·�ç¶œè�¡è�‰è�˜è‘¬è’¼è—»è£…èµ°é€�é�­éŽ—éœœé¨’åƒ�å¢—æ†Ž"],
["c2a1","è‡“è”µè´ˆé€ ä¿ƒå�´å‰‡å�³æ�¯æ�‰æ�Ÿæ¸¬è¶³é€Ÿä¿—å±žè³Šæ—�ç¶šå�’è¢–å…¶æ�ƒå­˜å­«å°Šæ��æ�‘é�œä»–å¤šå¤ªæ±°è©‘å”¾å •å¦¥æƒ°æ‰“æŸ�èˆµæ¥•é™€é§„é¨¨ä½“å †å¯¾è€�å²±å¸¯å¾…æ€ æ…‹æˆ´æ›¿æ³°æ»žèƒŽè…¿è‹”è¢‹è²¸é€€é€®éšŠé»›é¯›ä»£å�°å¤§ç¬¬é†�é¡Œé·¹æ»�ç€§å�“å•„å®…æ‰˜æŠžæ‹“æ²¢æ¿¯ç�¢è¨—é�¸æ¿�è«¾èŒ¸å‡§è›¸å�ª"],
["c3a1","å�©ä½†é�”è¾°å¥ªè„±å·½ç«ªè¾¿æ£šè°·ç‹¸é±ˆæ¨½èª°ä¸¹å�˜å˜†å�¦æ‹…æŽ¢æ—¦æ­Žæ·¡æ¹›ç‚­çŸ­ç«¯ç®ªç¶»è€½èƒ†è›‹èª•é�›å›£å£‡å¼¾æ–­æš–æª€æ®µç”·è«‡å€¤çŸ¥åœ°å¼›æ�¥æ™ºæ± ç—´ç¨šç½®è‡´èœ˜é�…é¦³ç¯‰ç•œç«¹ç­‘è“„é€�ç§©çª’èŒ¶å«¡ç�€ä¸­ä»²å®™å¿ æŠ½æ˜¼æŸ±æ³¨è™«è¡·è¨»é…Žé‹³é§�æ¨—ç€¦çŒªè‹§è‘—è²¯ä¸�å…†å‡‹å–‹å¯µ"],
["c4a1","å¸–å¸³åº�å¼”å¼µå½«å¾´æ‡²æŒ‘æš¢æœ�æ½®ç‰’ç”ºçœºè�´è„¹è…¸è�¶èª¿è«œè¶…è·³éŠšé•·é ‚é³¥å‹…æ�—ç›´æœ•æ²ˆç��è³ƒéŽ®é™³æ´¥å¢œæ¤Žæ§Œè¿½éŽšç—›é€šå¡šæ ‚æŽ´æ§»ä½ƒæ¼¬æŸ˜è¾»è”¦ç¶´é�”æ¤¿æ½°å�ªå£·å¬¬ç´¬çˆªå�Šé‡£é¶´äº­ä½Žå�œå�µå‰ƒè²žå‘ˆå ¤å®šå¸�åº•åº­å»·å¼Ÿæ‚ŒæŠµæŒºæ��æ¢¯æ±€ç¢‡ç¦Žç¨‹ç· è‰‡è¨‚è«¦è¹„é€“"],
["c5a1","é‚¸é„­é‡˜é¼Žæ³¥æ‘˜æ“¢æ•µæ»´çš„ç¬›é�©é�‘æººå“²å¾¹æ’¤è½�è¿­é‰„å…¸å¡«å¤©å±•åº—æ·»çº�ç”œè²¼è»¢é¡›ç‚¹ä¼�æ®¿æ¾±ç”°é›»å…Žå��å µå¡—å¦¬å± å¾’æ–—æ�œæ¸¡ç™»è�Ÿè³­é€”éƒ½é��ç ¥ç ºåŠªåº¦åœŸå¥´æ€’å€’å…šå†¬å‡�åˆ€å”�å¡”å¡˜å¥—å®•å³¶å¶‹æ‚¼æŠ•æ�­æ�±æ¡ƒæ¢¼æ£Ÿç›—æ·˜æ¹¯æ¶›ç�¯ç‡ˆå½“ç—˜ç¥·ç­‰ç­”ç­’ç³–çµ±åˆ°"],
["c6a1","è‘£è•©è—¤è¨Žè¬„è±†è¸�é€ƒé€�é�™é™¶é ­é¨°é—˜åƒ�å‹•å�Œå ‚å°Žæ†§æ’žæ´žçž³ç«¥èƒ´è�„é�“éŠ…å³ é´‡åŒ¿å¾—å¾³æ¶œç‰¹ç�£ç¦¿ç¯¤æ¯’ç‹¬èª­æ ƒæ©¡å‡¸çª�æ¤´å±Šé³¶è‹«å¯…é…‰ç€žå™¸å±¯æƒ‡æ•¦æ²Œè±šé��é “å‘‘æ›‡éˆ�å¥ˆé‚£å†…ä¹�å‡ªè–™è¬Žç�˜æ�ºé�‹æ¥¢é¦´ç¸„ç•·å�—æ¥ è»Ÿé›£æ±�äºŒå°¼å¼�è¿©åŒ‚è³‘è‚‰è™¹å»¿æ—¥ä¹³å…¥"],
["c7a1","å¦‚å°¿éŸ®ä»»å¦Šå¿�èª�æ¿¡ç¦°ç¥¢å¯§è‘±çŒ«ç†±å¹´å¿µæ�»æ’šç‡ƒç²˜ä¹ƒå»¼ä¹‹åŸœåš¢æ‚©æ¿ƒç´�èƒ½è„³è†¿è¾²è¦—èš¤å·´æŠŠæ’­è¦‡æ�·æ³¢æ´¾ç�¶ç ´å©†ç½µèŠ­é¦¬ä¿³å»ƒæ‹�æŽ’æ•—æ�¯ç›ƒç‰ŒèƒŒè‚ºè¼©é…�å€�åŸ¹åª’æ¢…æ¥³ç…¤ç‹½è²·å£²è³ é™ªé€™è�¿ç§¤çŸ§è�©ä¼¯å‰¥å�šæ‹�æŸ�æ³Šç™½ç®”ç²•èˆ¶è–„è¿«æ›�æ¼ çˆ†ç¸›èŽ«é§�éº¦"],
["c8a1","å‡½ç®±ç¡²ç®¸è‚‡ç­ˆæ«¨å¹¡è‚Œç•‘ç• å…«é‰¢æºŒç™ºé†—é«ªä¼�ç½°æŠœç­�é–¥é³©å™ºå¡™è›¤éš¼ä¼´åˆ¤å�Šå��å�›å¸†æ�¬æ–‘æ�¿æ°¾æ±Žç‰ˆçŠ¯ç�­ç•”ç¹�èˆ¬è—©è²©ç¯„é‡†ç…©é ’é£¯æŒ½æ™©ç•ªç›¤ç£�è•ƒè›®åŒªå�‘å�¦å¦ƒåº‡å½¼æ‚²æ‰‰æ‰¹æŠ«æ–�æ¯”æ³Œç–²çš®ç¢‘ç§˜ç·‹ç½·è‚¥è¢«èª¹è²»é�¿é�žé£›æ¨‹ç°¸å‚™å°¾å¾®æž‡æ¯˜ç�µçœ‰ç¾Ž"],
["c9a1","é¼»æŸŠç¨—åŒ¹ç–‹é«­å½¦è†�è�±è‚˜å¼¼å¿…ç•¢ç­†é€¼æ¡§å§«åª›ç´�ç™¾è¬¬ä¿µå½ªæ¨™æ°·æ¼‚ç“¢ç¥¨è¡¨è©•è±¹å»Ÿæ��ç—…ç§’è‹—éŒ¨é‹²è’œè›­é°­å“�å½¬æ–Œæµœç€•è²§è³“é »æ•�ç“¶ä¸�ä»˜åŸ å¤«å©¦å¯Œå†¨å¸ƒåºœæ€–æ‰¶æ•·æ–§æ™®æµ®çˆ¶ç¬¦è…�è†šèŠ™è­œè² è³¦èµ´é˜œé™„ä¾®æ’«æ­¦èˆžè‘¡è•ªéƒ¨å°�æ¥“é¢¨è‘ºè•—ä¼�å‰¯å¾©å¹…æœ�"],
["caa1","ç¦�è…¹è¤‡è¦†æ·µå¼—æ‰•æ²¸ä»�ç‰©é®’åˆ†å�»å™´å¢³æ†¤æ‰®ç„šå¥®ç²‰ç³žç´›é›°æ–‡è�žä¸™ä½µå…µå¡€å¹£å¹³å¼ŠæŸ„ä¸¦è”½é–‰é™›ç±³é �åƒ»å£�ç™–ç¢§åˆ¥çž¥è”‘ç®†å��å¤‰ç‰‡ç¯‡ç·¨è¾ºè¿”é��ä¾¿å‹‰å¨©å¼�éž­ä¿�èˆ—é‹ªåœƒæ�•æ­©ç”«è£œè¼”ç©‚å‹Ÿå¢“æ…•æˆŠæš®æ¯�ç°¿è�©å€£ä¿¸åŒ…å‘†å ±å¥‰å®�å³°å³¯å´©åº–æŠ±æ�§æ”¾æ–¹æœ‹"],
["cba1","æ³•æ³¡çƒ¹ç ²ç¸«èƒžèŠ³è�Œè“¬èœ‚è¤’è¨ªè±Šé‚¦é‹’é£½é³³éµ¬ä¹�äº¡å‚�å‰–å�Šå¦¨å¸½å¿˜å¿™æˆ¿æš´æœ›æŸ�æ£’å†’ç´¡è‚ªè†¨è¬€è²Œè²¿é‰¾é˜²å� é ¬åŒ—åƒ•å�œå¢¨æ’²æœ´ç‰§ç�¦ç©†é‡¦å‹ƒæ²¡æ®†å €å¹Œå¥”æœ¬ç¿»å‡¡ç›†æ‘©ç£¨é­”éº»åŸ‹å¦¹æ˜§æžšæ¯Žå“©æ§™å¹•è†œæž•é®ªæŸ¾é±’æ¡�äº¦ä¿£å�ˆæŠ¹æœ«æ²«è¿„ä¾­ç¹­éº¿ä¸‡æ…¢æº€"],
["cca1","æ¼«è”“å‘³æœªé­…å·³ç®•å²¬å¯†èœœæ¹Šè“‘ç¨”è„ˆå¦™ç²�æ°‘çœ å‹™å¤¢ç„¡ç‰ŸçŸ›éœ§éµ¡æ¤‹å©¿å¨˜å†¥å��å‘½æ˜Žç›Ÿè¿·éŠ˜é³´å§ªç‰�æ»…å…�æ£‰ç¶¿ç·¬é�¢éººæ‘¸æ¨¡èŒ‚å¦„å­Ÿæ¯›çŒ›ç›²ç¶²è€—è’™å„²æœ¨é»™ç›®æ�¢å‹¿é¤…å°¤æˆ»ç±¾è²°å•�æ‚¶ç´‹é–€åŒ�ä¹Ÿå†¶å¤œçˆºè€¶é‡Žå¼¥çŸ¢åŽ„å½¹ç´„è–¬è¨³èº�é�–æŸ³è–®é‘“æ„‰æ„ˆæ²¹ç™’"],
["cda1","è«­è¼¸å”¯ä½‘å„ªå‹‡å�‹å®¥å¹½æ‚ æ†‚æ�–æœ‰æŸšæ¹§æ¶ŒçŒ¶çŒ·ç”±ç¥�è£•èª˜é�Šé‚‘éƒµé›„èž�å¤•äºˆä½™ä¸Žèª‰è¼¿é �å‚­å¹¼å¦–å®¹åº¸æ�šæ�ºæ“�æ›œæ¥Šæ§˜æ´‹æº¶ç†”ç”¨çª¯ç¾Šè€€è‘‰è“‰è¦�è¬¡è¸Šé�¥é™½é¤Šæ…¾æŠ‘æ¬²æ²ƒæµ´ç¿Œç¿¼æ·€ç¾…èžºè£¸æ�¥èŽ±é ¼é›·æ´›çµ¡è�½é…ªä¹±å�µåµ�æ¬„æ¿«è—�è˜­è¦§åˆ©å��å±¥æ�Žæ¢¨ç�†ç’ƒ"],
["cea1","ç—¢è£�è£¡é‡Œé›¢é™¸å¾‹çŽ‡ç«‹è‘ŽæŽ ç•¥åŠ‰æµ�æºœç�‰ç•™ç¡«ç²’éš†ç«œé¾�ä¾¶æ…®æ—…è™œäº†äº®åƒšä¸¡å‡Œå¯®æ–™æ¢�æ¶¼çŒŸç™‚çž­ç¨œç³§è‰¯è«’é�¼é‡�é™µé ˜åŠ›ç·‘å€«åŽ˜æž—æ·‹ç‡�ç�³è‡¨è¼ªéš£é±—éºŸç‘ å¡�æ¶™ç´¯é¡žä»¤ä¼¶ä¾‹å†·åŠ±å¶ºæ€œçŽ²ç¤¼è‹“éˆ´éš·é›¶éœŠéº—é½¢æš¦æ­´åˆ—åŠ£çƒˆè£‚å»‰æ�‹æ†�æ¼£ç…‰ç°¾ç·´è�¯"],
["cfa1","è“®é€£éŒ¬å‘‚é­¯æ«“ç‚‰è³‚è·¯éœ²åŠ´å©�å»Šå¼„æœ—æ¥¼æ¦”æµªæ¼�ç‰¢ç‹¼ç¯­è€�è�¾è�‹éƒŽå…­éº“ç¦„è‚‹éŒ²è«–å€­å’Œè©±æ­ªè³„è„‡æƒ‘æž é·²äº™äº˜é°�è©«è—�è•¨æ¤€æ¹¾ç¢—è…•"],
["d0a1","å¼Œä¸�ä¸•ä¸ªä¸±ä¸¶ä¸¼ä¸¿ä¹‚ä¹–ä¹˜äº‚äº…è±«äºŠèˆ’å¼�äºŽäºžäºŸäº äº¢äº°äº³äº¶ä»Žä»�ä»„ä»†ä»‚ä»—ä»žä»­ä»Ÿä»·ä¼‰ä½šä¼°ä½›ä½�ä½—ä½‡ä½¶ä¾ˆä¾�ä¾˜ä½»ä½©ä½°ä¾‘ä½¯ä¾†ä¾–å„˜ä¿”ä¿Ÿä¿Žä¿˜ä¿›ä¿‘ä¿šä¿�ä¿¤ä¿¥å€šå€¨å€”å€ªå€¥å€…ä¼œä¿¶å€¡å€©å€¬ä¿¾ä¿¯å€‘å€†å�ƒå�‡æœƒå�•å��å�ˆå�šå�–å�¬å�¸å‚€å‚šå‚…å‚´å‚²"],
["d1a1","åƒ‰åƒŠå‚³åƒ‚åƒ–åƒžåƒ¥åƒ­åƒ£åƒ®åƒ¹åƒµå„‰å„�å„‚å„–å„•å„”å„šå„¡å„ºå„·å„¼å„»å„¿å…€å…’å…Œå…”å…¢ç«¸å…©å…ªå…®å†€å†‚å›˜å†Œå†‰å†�å†‘å†“å†•å†–å†¤å†¦å†¢å†©å†ªå†«å†³å†±å†²å†°å†µå†½å‡…å‡‰å‡›å‡ è™•å‡©å‡­å‡°å‡µå‡¾åˆ„åˆ‹åˆ”åˆŽåˆ§åˆªåˆ®åˆ³åˆ¹å‰�å‰„å‰‹å‰Œå‰žå‰”å‰ªå‰´å‰©å‰³å‰¿å‰½åŠ�åŠ”åŠ’å‰±åŠˆåŠ‘è¾¨"],
["d2a1","è¾§åŠ¬åŠ­åŠ¼åŠµå‹�å‹�å‹—å‹žå‹£å‹¦é£­å‹ å‹³å‹µå‹¸å‹¹åŒ†åŒˆç”¸åŒ�åŒ�åŒ�åŒ•åŒšåŒ£åŒ¯åŒ±åŒ³åŒ¸å�€å�†å�…ä¸—å�‰å��å‡–å�žå�©å�®å¤˜å�»å�·åŽ‚åŽ–åŽ åŽ¦åŽ¥åŽ®åŽ°åŽ¶å�ƒç°’é›™å�Ÿæ›¼ç‡®å�®å�¨å�­å�ºå��å�½å‘€å�¬å�­å�¼å�®å�¶å�©å��å‘Žå’�å‘µå’Žå‘Ÿå‘±å‘·å‘°å’’å‘»å’€å‘¶å’„å’�å’†å“‡å’¢å’¸å’¥å’¬å“„å“ˆå’¨"],
["d3a1","å’«å“‚å’¤å’¾å’¼å“˜å“¥å“¦å”�å””å“½å“®å“­å“ºå“¢å”¹å•€å•£å•Œå”®å•œå•…å•–å•—å”¸å”³å•�å–™å–€å’¯å–Šå–Ÿå•»å•¾å–˜å–žå–®å•¼å–ƒå–©å–‡å–¨å—šå—…å—Ÿå—„å—œå—¤å—”å˜”å—·å˜–å—¾å—½å˜›å—¹å™Žå™�ç‡Ÿå˜´å˜¶å˜²å˜¸å™«å™¤å˜¯å™¬å™ªåš†åš€åšŠåš åš”åš�åš¥åš®åš¶åš´å›‚åš¼å›�å›ƒå›€å›ˆå›Žå›‘å›“å›—å›®å›¹åœ€å›¿åœ„åœ‰"],
["d4a1","åœˆåœ‹åœ�åœ“åœ˜åœ–å—‡åœœåœ¦åœ·åœ¸å�Žåœ»å�€å��å�©åŸ€åžˆå�¡å�¿åž‰åž“åž åž³åž¤åžªåž°åŸƒåŸ†åŸ”åŸ’åŸ“å ŠåŸ–åŸ£å ‹å ™å �å¡²å ¡å¡¢å¡‹å¡°æ¯€å¡’å ½å¡¹å¢…å¢¹å¢Ÿå¢«å¢ºå£žå¢»å¢¸å¢®å£…å£“å£‘å£—å£™å£˜å£¥å£œå£¤å£Ÿå£¯å£ºå£¹å£»å£¼å£½å¤‚å¤Šå¤�å¤›æ¢¦å¤¥å¤¬å¤­å¤²å¤¸å¤¾ç«’å¥•å¥�å¥Žå¥šå¥˜å¥¢å¥ å¥§å¥¬å¥©"],
["d5a1","å¥¸å¦�å¦�ä½žä¾«å¦£å¦²å§†å§¨å§œå¦�å§™å§šå¨¥å¨Ÿå¨‘å¨œå¨‰å¨šå©€å©¬å©‰å¨µå¨¶å©¢å©ªåªšåª¼åª¾å«‹å«‚åª½å«£å«—å«¦å«©å«–å«ºå«»å¬Œå¬‹å¬–å¬²å«�å¬ªå¬¶å¬¾å­ƒå­…å­€å­‘å­•å­šå­›å­¥å­©å­°å­³å­µå­¸æ–ˆå­ºå®€å®ƒå®¦å®¸å¯ƒå¯‡å¯‰å¯”å¯�å¯¤å¯¦å¯¢å¯žå¯¥å¯«å¯°å¯¶å¯³å°…å°‡å°ˆå°�å°“å° å°¢å°¨å°¸å°¹å±�å±†å±Žå±“"],
["d6a1","å±�å±�å­±å±¬å±®ä¹¢å±¶å±¹å²Œå²‘å²”å¦›å²«å²»å²¶å²¼å²·å³…å²¾å³‡å³™å³©å³½å³ºå³­å¶Œå³ªå´‹å´•å´—åµœå´Ÿå´›å´‘å´”å´¢å´šå´™å´˜åµŒåµ’åµŽåµ‹åµ¬åµ³åµ¶å¶‡å¶„å¶‚å¶¢å¶�å¶¬å¶®å¶½å¶�å¶·å¶¼å·‰å·�å·“å·’å·–å·›å·«å·²å·µå¸‹å¸šå¸™å¸‘å¸›å¸¶å¸·å¹„å¹ƒå¹€å¹Žå¹—å¹”å¹Ÿå¹¢å¹¤å¹‡å¹µå¹¶å¹ºéº¼å¹¿åº å»�å»‚å»ˆå»�å»�"],
["d7a1","å»–å»£å»�å»šå»›å»¢å»¡å»¨å»©å»¬å»±å»³å»°å»´å»¸å»¾å¼ƒå¼‰å½�å½œå¼‹å¼‘å¼–å¼©å¼­å¼¸å½�å½ˆå½Œå½Žå¼¯å½‘å½–å½—å½™å½¡å½­å½³å½·å¾ƒå¾‚å½¿å¾Šå¾ˆå¾‘å¾‡å¾žå¾™å¾˜å¾ å¾¨å¾­å¾¼å¿–å¿»å¿¤å¿¸å¿±å¿�æ‚³å¿¿æ€¡æ� æ€™æ€�æ€©æ€Žæ€±æ€›æ€•æ€«æ€¦æ€�æ€ºæ�šæ��æ�ªæ�·æ�Ÿæ�Šæ�†æ��æ�£æ�ƒæ�¤æ�‚æ�¬æ�«æ�™æ‚�æ‚�æƒ§æ‚ƒæ‚š"],
["d8a1","æ‚„æ‚›æ‚–æ‚—æ‚’æ‚§æ‚‹æƒ¡æ‚¸æƒ æƒ“æ‚´å¿°æ‚½æƒ†æ‚µæƒ˜æ…�æ„•æ„†æƒ¶æƒ·æ„€æƒ´æƒºæ„ƒæ„¡æƒ»æƒ±æ„�æ„Žæ…‡æ„¾æ„¨æ„§æ…Šæ„¿æ„¼æ„¬æ„´æ„½æ…‚æ…„æ…³æ…·æ…˜æ…™æ…šæ…«æ…´æ…¯æ…¥æ…±æ…Ÿæ…�æ…“æ…µæ†™æ†–æ†‡æ†¬æ†”æ†šæ†Šæ†‘æ†«æ†®æ‡Œæ‡Šæ‡‰æ‡·æ‡ˆæ‡ƒæ‡†æ†ºæ‡‹ç½¹æ‡�æ‡¦æ‡£æ‡¶æ‡ºæ‡´æ‡¿æ‡½æ‡¼æ‡¾æˆ€æˆˆæˆ‰æˆ�æˆŒæˆ”æˆ›"],
["d9a1","æˆžæˆ¡æˆªæˆ®æˆ°æˆ²æˆ³æ‰�æ‰Žæ‰žæ‰£æ‰›æ‰ æ‰¨æ‰¼æŠ‚æŠ‰æ‰¾æŠ’æŠ“æŠ–æ‹”æŠƒæŠ”æ‹—æ‹‘æŠ»æ‹�æ‹¿æ‹†æ“”æ‹ˆæ‹œæ‹Œæ‹Šæ‹‚æ‹‡æŠ›æ‹‰æŒŒæ‹®æ‹±æŒ§æŒ‚æŒˆæ‹¯æ‹µæ��æŒ¾æ��æ�œæ��æŽ–æŽŽæŽ€æŽ«æ�¶æŽ£æŽ�æŽ‰æŽŸæŽµæ�«æ�©æŽ¾æ�©æ�€æ�†æ�£æ�‰æ�’æ�¶æ�„æ�–æ�´æ�†æ�“æ�¦æ�¶æ”�æ�—æ�¨æ��æ‘§æ‘¯æ‘¶æ‘Žæ”ªæ’•æ’“æ’¥æ’©æ’ˆæ’¼"],
["daa1","æ“šæ“’æ“…æ“‡æ’»æ“˜æ“‚æ“±æ“§èˆ‰æ“ æ“¡æŠ¬æ“£æ“¯æ”¬æ“¶æ“´æ“²æ“ºæ”€æ“½æ”˜æ”œæ”…æ”¤æ”£æ”«æ”´æ”µæ”·æ”¶æ”¸ç•‹æ•ˆæ•–æ••æ•�æ•˜æ•žæ•�æ•²æ•¸æ–‚æ–ƒè®Šæ–›æ–Ÿæ–«æ–·æ—ƒæ—†æ—�æ—„æ—Œæ—’æ—›æ—™æ— æ—¡æ—±æ�²æ˜Šæ˜ƒæ—»æ�³æ˜µæ˜¶æ˜´æ˜œæ™�æ™„æ™‰æ™�æ™žæ™�æ™¤æ™§æ™¨æ™Ÿæ™¢æ™°æšƒæšˆæšŽæš‰æš„æš˜æš�æ›�æš¹æ›‰æš¾æš¼"],
["dba1","æ›„æš¸æ›–æ›šæ› æ˜¿æ›¦æ›©æ›°æ›µæ›·æœ�æœ–æœžæœ¦æœ§éœ¸æœ®æœ¿æœ¶æ��æœ¸æœ·æ�†æ�žæ� æ�™æ�£æ�¤æž‰æ�°æž©æ�¼æ�ªæžŒæž‹æž¦æž¡æž…æž·æŸ¯æž´æŸ¬æž³æŸ©æž¸æŸ¤æŸžæŸ�æŸ¢æŸ®æž¹æŸŽæŸ†æŸ§æªœæ žæ¡†æ ©æ¡€æ¡�æ ²æ¡Žæ¢³æ «æ¡™æ¡£æ¡·æ¡¿æ¢Ÿæ¢�æ¢­æ¢”æ¢�æ¢›æ¢ƒæª®æ¢¹æ¡´æ¢µæ¢ æ¢ºæ¤�æ¢�æ¡¾æ¤�æ£Šæ¤ˆæ£˜æ¤¢æ¤¦æ£¡æ¤Œæ£�"],
["dca1","æ£”æ£§æ£•æ¤¶æ¤’æ¤„æ£—æ££æ¤¥æ£¹æ£ æ£¯æ¤¨æ¤ªæ¤šæ¤£æ¤¡æ£†æ¥¹æ¥·æ¥œæ¥¸æ¥«æ¥”æ¥¾æ¥®æ¤¹æ¥´æ¤½æ¥™æ¤°æ¥¡æ¥žæ¥�æ¦�æ¥ªæ¦²æ¦®æ§�æ¦¿æ§�æ§“æ¦¾æ§Žå¯¨æ§Šæ§�æ¦»æ§ƒæ¦§æ¨®æ¦‘æ¦ æ¦œæ¦•æ¦´æ§žæ§¨æ¨‚æ¨›æ§¿æ¬Šæ§¹æ§²æ§§æ¨…æ¦±æ¨žæ§­æ¨”æ§«æ¨Šæ¨’æ«�æ¨£æ¨“æ©„æ¨Œæ©²æ¨¶æ©¸æ©‡æ©¢æ©™æ©¦æ©ˆæ¨¸æ¨¢æª�æª�æª æª„æª¢æª£"],
["dda1","æª—è˜—æª»æ«ƒæ«‚æª¸æª³æª¬æ«žæ«‘æ«Ÿæªªæ«šæ«ªæ«»æ¬…è˜–æ«ºæ¬’æ¬–é¬±æ¬Ÿæ¬¸æ¬·ç›œæ¬¹é£®æ­‡æ­ƒæ­‰æ­�æ­™æ­”æ­›æ­Ÿæ­¡æ­¸æ­¹æ­¿æ®€æ®„æ®ƒæ®�æ®˜æ®•æ®žæ®¤æ®ªæ®«æ®¯æ®²æ®±æ®³æ®·æ®¼æ¯†æ¯‹æ¯“æ¯Ÿæ¯¬æ¯«æ¯³æ¯¯éº¾æ°ˆæ°“æ°”æ°›æ°¤æ°£æ±žæ±•æ±¢æ±ªæ²‚æ²�æ²šæ²�æ²›æ±¾æ±¨æ±³æ²’æ²�æ³„æ³±æ³“æ²½æ³—æ³…æ³�æ²®æ²±æ²¾"],
["dea1","æ²ºæ³›æ³¯æ³™æ³ªæ´Ÿè¡�æ´¶æ´«æ´½æ´¸æ´™æ´µæ´³æ´’æ´Œæµ£æ¶“æµ¤æµšæµ¹æµ™æ¶Žæ¶•æ¿¤æ¶…æ·¹æ¸•æ¸Šæ¶µæ·‡æ·¦æ¶¸æ·†æ·¬æ·žæ·Œæ·¨æ·’æ·…æ·ºæ·™æ·¤æ·•æ·ªæ·®æ¸­æ¹®æ¸®æ¸™æ¹²æ¹Ÿæ¸¾æ¸£æ¹«æ¸«æ¹¶æ¹�æ¸Ÿæ¹ƒæ¸ºæ¹Žæ¸¤æ»¿æ¸�æ¸¸æº‚æºªæº˜æ»‰æº·æ»“æº½æº¯æ»„æº²æ»”æ»•æº�æº¥æ»‚æºŸæ½�æ¼‘ç�Œæ»¬æ»¸æ»¾æ¼¿æ»²æ¼±æ»¯æ¼²æ»Œ"],
["dfa1","æ¼¾æ¼“æ»·æ¾†æ½ºæ½¸æ¾�æ¾€æ½¯æ½›æ¿³æ½­æ¾‚æ½¼æ½˜æ¾Žæ¾‘æ¿‚æ½¦æ¾³æ¾£æ¾¡æ¾¤æ¾¹æ¿†æ¾ªæ¿Ÿæ¿•æ¿¬æ¿”æ¿˜æ¿±æ¿®æ¿›ç€‰ç€‹æ¿ºç€‘ç€�ç€�æ¿¾ç€›ç€šæ½´ç€�ç€˜ç€Ÿç€°ç€¾ç€²ç�‘ç�£ç‚™ç‚’ç‚¯çƒ±ç‚¬ç‚¸ç‚³ç‚®çƒŸçƒ‹çƒ�çƒ™ç„‰çƒ½ç„œç„™ç…¥ç…•ç†ˆç…¦ç…¢ç…Œç…–ç…¬ç†�ç‡»ç†„ç†•ç†¨ç†¬ç‡—ç†¹ç†¾ç‡’ç‡‰ç‡”ç‡Žç‡ ç‡¬ç‡§ç‡µç‡¼"],
["e0a1","ç‡¹ç‡¿çˆ�çˆ�çˆ›çˆ¨çˆ­çˆ¬çˆ°çˆ²çˆ»çˆ¼çˆ¿ç‰€ç‰†ç‰‹ç‰˜ç‰´ç‰¾çŠ‚çŠ�çŠ‡çŠ’çŠ–çŠ¢çŠ§çŠ¹çŠ²ç‹ƒç‹†ç‹„ç‹Žç‹’ç‹¢ç‹ ç‹¡ç‹¹ç‹·å€�çŒ—çŒŠçŒœçŒ–çŒ�çŒ´çŒ¯çŒ©çŒ¥çŒ¾ç�Žç��é»˜ç�—ç�ªç�¨ç�°ç�¸ç�µç�»ç�ºç�ˆçŽ³ç�ŽçŽ»ç�€ç�¥ç�®ç�žç’¢ç�…ç‘¯ç�¥ç�¸ç�²ç�ºç‘•ç�¿ç‘Ÿç‘™ç‘�ç‘œç‘©ç‘°ç‘£ç‘ªç‘¶ç‘¾ç’‹ç’žç’§ç“Šç“�ç“”ç�±"],
["e1a1","ç“ ç“£ç“§ç“©ç“®ç“²ç“°ç“±ç“¸ç“·ç”„ç”ƒç”…ç”Œç”Žç”�ç”•ç”“ç”žç”¦ç”¬ç”¼ç•„ç•�ç•Šç•‰ç•›ç•†ç•šç•©ç•¤ç•§ç•«ç•­ç•¸ç•¶ç–†ç–‡ç•´ç–Šç–‰ç–‚ç–”ç–šç–�ç–¥ç–£ç—‚ç–³ç—ƒç–µç–½ç–¸ç–¼ç–±ç—�ç—Šç—’ç—™ç—£ç—žç—¾ç—¿ç—¼ç˜�ç—°ç—ºç—²ç—³ç˜‹ç˜�ç˜‰ç˜Ÿç˜§ç˜ ç˜¡ç˜¢ç˜¤ç˜´ç˜°ç˜»ç™‡ç™ˆç™†ç™œç™˜ç™¡ç™¢ç™¨ç™©ç™ªç™§ç™¬ç™°"],
["e2a1","ç™²ç™¶ç™¸ç™¼çš€çšƒçšˆçš‹çšŽçš–çš“çš™çššçš°çš´çš¸çš¹çšºç›‚ç›�ç›–ç›’ç›žç›¡ç›¥ç›§ç›ªè˜¯ç›»çœˆçœ‡çœ„çœ©çœ¤çœžçœ¥çœ¦çœ›çœ·çœ¸ç�‡ç�šç�¨ç�«ç�›ç�¥ç�¿ç�¾ç�¹çžŽçž‹çž‘çž çžžçž°çž¶çž¹çž¿çž¼çž½çž»çŸ‡çŸ�çŸ—çŸšçŸœçŸ£çŸ®çŸ¼ç Œç ’ç¤¦ç  ç¤ªç¡…ç¢Žç¡´ç¢†ç¡¼ç¢šç¢Œç¢£ç¢µç¢ªç¢¯ç£‘ç£†ç£‹ç£”ç¢¾ç¢¼ç£…ç£Šç£¬"],
["e3a1","ç£§ç£šç£½ç£´ç¤‡ç¤’ç¤‘ç¤™ç¤¬ç¤«ç¥€ç¥ ç¥—ç¥Ÿç¥šç¥•ç¥“ç¥ºç¥¿ç¦Šç¦�ç¦§é½‹ç¦ªç¦®ç¦³ç¦¹ç¦ºç§‰ç§•ç§§ç§¬ç§¡ç§£ç¨ˆç¨�ç¨˜ç¨™ç¨ ç¨Ÿç¦€ç¨±ç¨»ç¨¾ç¨·ç©ƒç©—ç©‰ç©¡ç©¢ç©©é¾�ç©°ç©¹ç©½çªˆçª—çª•çª˜çª–çª©ç«ˆçª°çª¶ç«…ç«„çª¿é‚ƒç«‡ç«Šç«�ç«�ç«•ç«“ç«™ç«šç«�ç«¡ç«¢ç«¦ç«­ç«°ç¬‚ç¬�ç¬Šç¬†ç¬³ç¬˜ç¬™ç¬žç¬µç¬¨ç¬¶ç­�"],
["e4a1","ç­ºç¬„ç­�ç¬‹ç­Œç­…ç­µç­¥ç­´ç­§ç­°ç­±ç­¬ç­®ç®�ç®˜ç®Ÿç®�ç®œç®šç®‹ç®’ç®�ç­�ç®™ç¯‹ç¯�ç¯Œç¯�ç®´ç¯†ç¯�ç¯©ç°‘ç°”ç¯¦ç¯¥ç± ç°€ç°‡ç°“ç¯³ç¯·ç°—ç°�ç¯¶ç°£ç°§ç°ªç°Ÿç°·ç°«ç°½ç±Œç±ƒç±”ç±�ç±€ç±�ç±˜ç±Ÿç±¤ç±–ç±¥ç±¬ç±µç²ƒç²�ç²¤ç²­ç²¢ç²«ç²¡ç²¨ç²³ç²²ç²±ç²®ç²¹ç²½ç³€ç³…ç³‚ç³˜ç³’ç³œç³¢é¬»ç³¯ç³²ç³´ç³¶ç³ºç´†"],
["e5a1","ç´‚ç´œç´•ç´Šçµ…çµ‹ç´®ç´²ç´¿ç´µçµ†çµ³çµ–çµŽçµ²çµ¨çµ®çµ�çµ£ç¶“ç¶‰çµ›ç¶�çµ½ç¶›ç¶ºç¶®ç¶£ç¶µç·‡ç¶½ç¶«ç¸½ç¶¢ç¶¯ç·œç¶¸ç¶Ÿç¶°ç·˜ç·�ç·¤ç·žç·»ç·²ç·¡ç¸…ç¸Šç¸£ç¸¡ç¸’ç¸±ç¸Ÿç¸‰ç¸‹ç¸¢ç¹†ç¹¦ç¸»ç¸µç¸¹ç¹ƒç¸·ç¸²ç¸ºç¹§ç¹�ç¹–ç¹žç¹™ç¹šç¹¹ç¹ªç¹©ç¹¼ç¹»çºƒç·•ç¹½è¾®ç¹¿çºˆçº‰çºŒçº’çº�çº“çº”çº–çºŽçº›çºœç¼¸ç¼º"],
["e6a1","ç½…ç½Œç½�ç½Žç½�ç½‘ç½•ç½”ç½˜ç½Ÿç½ ç½¨ç½©ç½§ç½¸ç¾‚ç¾†ç¾ƒç¾ˆç¾‡ç¾Œç¾”ç¾žç¾�ç¾šç¾£ç¾¯ç¾²ç¾¹ç¾®ç¾¶ç¾¸è­±ç¿…ç¿†ç¿Šç¿•ç¿”ç¿¡ç¿¦ç¿©ç¿³ç¿¹é£œè€†è€„è€‹è€’è€˜è€™è€œè€¡è€¨è€¿è€»è�Šè�†è�’è�˜è�šè�Ÿè�¢è�¨è�³è�²è�°è�¶è�¹è�½è�¿è‚„è‚†è‚…è‚›è‚“è‚šè‚­å†�è‚¬èƒ›èƒ¥èƒ™èƒ�èƒ„èƒšèƒ–è„‰èƒ¯èƒ±è„›è„©è„£è„¯è…‹"],
["e7a1","éš‹è…†è„¾è…“è…‘èƒ¼è…±è…®è…¥è…¦è…´è†ƒè†ˆè†Šè†€è†‚è† è†•è†¤è†£è…Ÿè†“è†©è†°è†µè†¾è†¸è†½è‡€è‡‚è†ºè‡‰è‡�è‡‘è‡™è‡˜è‡ˆè‡šè‡Ÿè‡ è‡§è‡ºè‡»è‡¾èˆ�èˆ‚èˆ…èˆ‡èˆŠèˆ�èˆ�èˆ–èˆ©èˆ«èˆ¸èˆ³è‰€è‰™è‰˜è‰�è‰šè‰Ÿè‰¤è‰¢è‰¨è‰ªè‰«èˆ®è‰±è‰·è‰¸è‰¾èŠ�èŠ’èŠ«èŠŸèŠ»èŠ¬è‹¡è‹£è‹Ÿè‹’è‹´è‹³è‹ºèŽ“èŒƒè‹»è‹¹è‹žèŒ†è‹œèŒ‰è‹™"],
["e8a1","èŒµèŒ´èŒ–èŒ²èŒ±è�€èŒ¹è��è�…èŒ¯èŒ«èŒ—èŒ˜èŽ…èŽšèŽªèŽŸèŽ¢èŽ–èŒ£èŽŽèŽ‡èŽŠè�¼èŽµè�³è�µèŽ èŽ‰èŽ¨è�´è�“è�«è�Žè�½è�ƒè�˜è�‹è��è�·è�‡è� è�²è��è�¢è� èŽ½è�¸è”†è�»è‘­è�ªè�¼è•šè’„è‘·è‘«è’­è‘®è’‚è‘©è‘†è�¬è‘¯è‘¹è�µè“Šè‘¢è’¹è’¿è’Ÿè“™è“�è’»è“šè“�è“�è“†è“–è’¡è”¡è“¿è“´è”—è”˜è”¬è”Ÿè”•è””è“¼è•€è•£è•˜è•ˆ"],
["e9a1","è•�è˜‚è•‹è••è–€è–¤è–ˆè–‘è–Šè–¨è•­è–”è–›è—ªè–‡è–œè•·è•¾è–�è—‰è–ºè—�è–¹è—�è—•è—�è—¥è—œè—¹è˜Šè˜“è˜‹è—¾è—ºè˜†è˜¢è˜šè˜°è˜¿è™�ä¹•è™”è™Ÿè™§è™±èš“èš£èš©èšªèš‹èšŒèš¶èš¯è›„è›†èš°è›‰è £èš«è›”è›žè›©è›¬è›Ÿè››è›¯èœ’èœ†èœˆèœ€èœƒè›»èœ‘èœ‰èœ�è›¹èœŠèœ´èœ¿èœ·èœ»èœ¥èœ©èœšè� è�Ÿè�¸è�Œè�Žè�´è�—è�¨è�®è�™"],
["eaa1","è�“è�£è�ªè …èž¢èžŸèž‚èž¯èŸ‹èž½èŸ€èŸ�é›–èž«èŸ„èž³èŸ‡èŸ†èž»èŸ¯èŸ²èŸ è �è �èŸ¾èŸ¶èŸ·è ŽèŸ’è ‘è –è •è ¢è ¡è ±è ¶è ¹è §è »è¡„è¡‚è¡’è¡™è¡žè¡¢è¡«è¢�è¡¾è¢žè¡µè¡½è¢µè¡²è¢‚è¢—è¢’è¢®è¢™è¢¢è¢�è¢¤è¢°è¢¿è¢±è£ƒè£„è£”è£˜è£™è£�è£¹è¤‚è£¼è£´è£¨è£²è¤„è¤Œè¤Šè¤“è¥ƒè¤žè¤¥è¤ªè¤«è¥�è¥„è¤»è¤¶è¤¸è¥Œè¤�è¥ è¥ž"],
["eba1","è¥¦è¥¤è¥­è¥ªè¥¯è¥´è¥·è¥¾è¦ƒè¦ˆè¦Šè¦“è¦˜è¦¡è¦©è¦¦è¦¬è¦¯è¦²è¦ºè¦½è¦¿è§€è§šè§œè§�è§§è§´è§¸è¨ƒè¨–è¨�è¨Œè¨›è¨�è¨¥è¨¶è©�è©›è©’è©†è©ˆè©¼è©­è©¬è©¢èª…èª‚èª„èª¨èª¡èª‘èª¥èª¦èªšèª£è«„è«�è«‚è«šè««è«³è«§è«¤è«±è¬”è« è«¢è«·è«žè«›è¬Œè¬‡è¬šè«¡è¬–è¬�è¬—è¬ è¬³éž«è¬¦è¬«è¬¾è¬¨è­�è­Œè­�è­Žè­‰è­–è­›è­šè­«"],
["eca1","è­Ÿè­¬è­¯è­´è­½è®€è®Œè®Žè®’è®“è®–è®™è®šè°ºè±�è°¿è±ˆè±Œè±Žè±�è±•è±¢è±¬è±¸è±ºè²‚è²‰è²…è²Šè²�è²Žè²”è±¼è²˜æˆ�è²­è²ªè²½è²²è²³è²®è²¶è³ˆè³�è³¤è³£è³šè³½è³ºè³»è´„è´…è´Šè´‡è´�è´�è´�é½Žè´“è³�è´”è´–èµ§èµ­èµ±èµ³è¶�è¶™è·‚è¶¾è¶ºè·�è·šè·–è·Œè·›è·‹è·ªè·«è·Ÿè·£è·¼è¸ˆè¸‰è·¿è¸�è¸žè¸�è¸Ÿè¹‚è¸µè¸°è¸´è¹Š"],
["eda1","è¹‡è¹‰è¹Œè¹�è¹ˆè¹™è¹¤è¹ è¸ªè¹£è¹•è¹¶è¹²è¹¼èº�èº‡èº…èº„èº‹èºŠèº“èº‘èº”èº™èºªèº¡èº¬èº°è»†èº±èº¾è»…è»ˆè»‹è»›è»£è»¼è»»è»«è»¾è¼Šè¼…è¼•è¼’è¼™è¼“è¼œè¼Ÿè¼›è¼Œè¼¦è¼³è¼»è¼¹è½…è½‚è¼¾è½Œè½‰è½†è½Žè½—è½œè½¢è½£è½¤è¾œè¾Ÿè¾£è¾­è¾¯è¾·è¿šè¿¥è¿¢è¿ªè¿¯é‚‡è¿´é€…è¿¹è¿ºé€‘é€•é€¡é€�é€žé€–é€‹é€§é€¶é€µé€¹è¿¸"],
["eea1","é��é��é�‘é�’é€Žé�‰é€¾é�–é�˜é�žé�¨é�¯é�¶éš¨é�²é‚‚é�½é‚�é‚€é‚Šé‚‰é‚�é‚¨é‚¯é‚±é‚µéƒ¢éƒ¤æ‰ˆéƒ›é„‚é„’é„™é„²é„°é…Šé…–é…˜é…£é…¥é…©é…³é…²é†‹é†‰é†‚é†¢é†«é†¯é†ªé†µé†´é†ºé‡€é‡�é‡‰é‡‹é‡�é‡–é‡Ÿé‡¡é‡›é‡¼é‡µé‡¶éˆžé‡¿éˆ”éˆ¬éˆ•éˆ‘é‰žé‰—é‰…é‰‰é‰¤é‰ˆéŠ•éˆ¿é‰‹é‰�éŠœéŠ–éŠ“éŠ›é‰šé‹�éŠ¹éŠ·é‹©éŒ�é‹ºé�„éŒ®"],
["efa1","éŒ™éŒ¢éŒšéŒ£éŒºéŒµéŒ»é�œé� é�¼é�®é�–éŽ°éŽ¬éŽ­éŽ”éŽ¹é�–é�—é�¨é�¥é�˜é�ƒé��é��é�ˆé�¤é�šé�”é�“é�ƒé�‡é��é�¶é�«é�µé�¡é�ºé‘�é‘’é‘„é‘›é‘ é‘¢é‘žé‘ªéˆ©é‘°é‘µé‘·é‘½é‘šé‘¼é‘¾é’�é‘¿é–‚é–‡é–Šé–”é––é–˜é–™é– é–¨é–§é–­é–¼é–»é–¹é–¾é—Šæ¿¶é—ƒé—�é—Œé—•é—”é—–é—œé—¡é—¥é—¢é˜¡é˜¨é˜®é˜¯é™‚é™Œé™�é™‹é™·é™œé™ž"],
["f0a1","é™�é™Ÿé™¦é™²é™¬éš�éš˜éš•éš—éšªéš§éš±éš²éš°éš´éš¶éš¸éš¹é›Žé›‹é›‰é›�è¥�é›œéœ�é›•é›¹éœ„éœ†éœˆéœ“éœŽéœ‘éœ�éœ–éœ™éœ¤éœªéœ°éœ¹éœ½éœ¾é�„é�†é�ˆé�‚é�‰é�œé� é�¤é�¦é�¨å‹’é�«é�±é�¹éž…é�¼éž�é�ºéž†éž‹éž�éž�éžœéž¨éž¦éž£éž³éž´éŸƒéŸ†éŸˆéŸ‹éŸœéŸ­é½�éŸ²ç«ŸéŸ¶éŸµé �é Œé ¸é ¤é ¡é ·é ½é¡†é¡�é¡‹é¡«é¡¯é¡°"],
["f1a1","é¡±é¡´é¡³é¢ªé¢¯é¢±é¢¶é£„é£ƒé£†é£©é£«é¤ƒé¤‰é¤’é¤”é¤˜é¤¡é¤�é¤žé¤¤é¤ é¤¬é¤®é¤½é¤¾é¥‚é¥‰é¥…é¥�é¥‹é¥‘é¥’é¥Œé¥•é¦—é¦˜é¦¥é¦­é¦®é¦¼é§Ÿé§›é§�é§˜é§‘é§­é§®é§±é§²é§»é§¸é¨�é¨�é¨…é§¢é¨™é¨«é¨·é©…é©‚é©€é©ƒé¨¾é©•é©�é©›é©—é©Ÿé©¢é©¥é©¤é©©é©«é©ªéª­éª°éª¼é«€é«�é«‘é«“é«”é«žé«Ÿé«¢é«£é«¦é«¯é««é«®é«´é«±é«·"],
["f2a1","é«»é¬†é¬˜é¬šé¬Ÿé¬¢é¬£é¬¥é¬§é¬¨é¬©é¬ªé¬®é¬¯é¬²é­„é­ƒé­�é­�é­Žé­‘é­˜é­´é®“é®ƒé®‘é®–é®—é®Ÿé® é®¨é®´é¯€é¯Šé®¹é¯†é¯�é¯‘é¯’é¯£é¯¢é¯¤é¯”é¯¡é°ºé¯²é¯±é¯°é°•é°”é°‰é°“é°Œé°†é°ˆé°’é°Šé°„é°®é°›é°¥é°¤é°¡é°°é±‡é°²é±†é°¾é±šé± é±§é±¶é±¸é³§é³¬é³°é´‰é´ˆé³«é´ƒé´†é´ªé´¦é¶¯é´£é´Ÿéµ„é´•é´’éµ�é´¿é´¾éµ†éµˆ"],
["f3a1","éµ�éµžéµ¤éµ‘éµ�éµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·�é¶»é¶¸é¶ºé·†é·�é·‚é·™é·“é·¸é·¦é·­é·¯é·½é¸šé¸›é¸žé¹µé¹¹é¹½éº�éºˆéº‹éºŒéº’éº•éº‘éº�éº¥éº©éº¸éºªéº­é�¡é»Œé»Žé»�é»�é»”é»œé»žé»�é» é»¥é»¨é»¯é»´é»¶é»·é»¹é»»é»¼é»½é¼‡é¼ˆçš·é¼•é¼¡é¼¬é¼¾é½Šé½’é½”é½£é½Ÿé½ é½¡é½¦é½§é½¬é½ªé½·é½²é½¶é¾•é¾œé¾ "],
["f4a1","å ¯æ§‡é�™ç‘¤å‡œç†™"],
["f9a1","çºŠè¤œé�ˆéŠˆè“œä¿‰ç‚»æ˜±æ£ˆé‹¹æ›»å½…ä¸¨ä»¡ä»¼ä¼€ä¼ƒä¼¹ä½–ä¾’ä¾Šä¾šä¾”ä¿�å�€å€¢ä¿¿å€žå�†å�°å�‚å‚”åƒ´åƒ˜å…Šå…¤å†�å†¾å‡¬åˆ•åŠœåŠ¦å‹€å‹›åŒ€åŒ‡åŒ¤å�²åŽ“åŽ²å��ï¨Žå’œå’Šå’©å“¿å–†å�™å�¥åž¬åŸˆåŸ‡ï¨�ï¨�å¢žå¢²å¤‹å¥“å¥›å¥�å¥£å¦¤å¦ºå­–å¯€ç”¯å¯˜å¯¬å°žå²¦å²ºå³µå´§åµ“ï¨‘åµ‚åµ­å¶¸å¶¹å·�å¼¡å¼´å½§å¾·"],
["faa1","å¿žæ��æ‚…æ‚Šæƒžæƒ•æ„ æƒ²æ„‘æ„·æ„°æ†˜æˆ“æŠ¦æ�µæ‘ æ’�æ“Žæ•Žæ˜€æ˜•æ˜»æ˜‰æ˜®æ˜žæ˜¤æ™¥æ™—æ™™ï¨’æ™³æš™æš æš²æš¿æ›ºæœŽï¤©æ�¦æž»æ¡’æŸ€æ �æ¡„æ£�ï¨“æ¥¨ï¨”æ¦˜æ§¢æ¨°æ©«æ©†æ©³æ©¾æ«¢æ«¤æ¯–æ°¿æ±œæ²†æ±¯æ³šæ´„æ¶‡æµ¯æ¶–æ¶¬æ·�æ·¸æ·²æ·¼æ¸¹æ¹œæ¸§æ¸¼æº¿æ¾ˆæ¾µæ¿µç€…ç€‡ç€¨ç‚…ç‚«ç„�ç„„ç…œç…†ç…‡ï¨•ç‡�ç‡¾çŠ±"],
["fba1","çŠ¾çŒ¤ï¨–ç�·çŽ½ç�‰ç�–ç�£ç�’ç�‡ç�µç�¦ç�ªç�©ç�®ç‘¢ç’‰ç’Ÿç”�ç•¯çš‚çšœçšžçš›çš¦ï¨—ç�†åŠ¯ç ¡ç¡Žç¡¤ç¡ºç¤°ï¨˜ï¨™ï¨šç¦”ï¨›ç¦›ç«‘ç«§ï¨œç««ç®žï¨�çµˆçµœç¶·ç¶ ç·–ç¹’ç½‡ç¾¡ï¨žèŒ�è�¢è�¿è�‡è�¶è‘ˆè’´è•“è•™è•«ï¨Ÿè–°ï¨ ï¨¡è ‡è£µè¨’è¨·è©¹èª§èª¾è«Ÿï¨¢è«¶è­“è­¿è³°è³´è´’èµ¶ï¨£è»�ï¨¤ï¨¥é�§éƒžï¨¦é„•é„§é‡š"],
["fca1","é‡—é‡žé‡­é‡®é‡¤é‡¥éˆ†éˆ�éˆŠéˆºé‰€éˆ¼é‰Žé‰™é‰‘éˆ¹é‰§éŠ§é‰·é‰¸é‹§é‹—é‹™é‹�ï¨§é‹•é‹ é‹“éŒ¥éŒ¡é‹»ï¨¨éŒžé‹¿éŒ�éŒ‚é�°é�—éŽ¤é�†é�žé�¸é�±é‘…é‘ˆé–’ï§œï¨©éš�éš¯éœ³éœ»é�ƒé��é��é�‘é�•é¡—é¡¥ï¨ªï¨«é¤§ï¨¬é¦žé©Žé«™é«œé­µé­²é®�é®±é®»é°€éµ°éµ«ï¨­é¸™é»‘"],
["fcf1","â…°",9,"ï¿¢ï¿¤ï¼‡ï¼‚"],
["8fa2af","Ë˜Ë‡Â¸Ë™Ë�Â¯Ë›Ëšï½žÎ„Î…"],
["8fa2c2","Â¡Â¦Â¿"],
["8fa2eb","ÂºÂªÂ©Â®â„¢Â¤â„–"],
["8fa6e1","Î†ÎˆÎ‰ÎŠÎª"],
["8fa6e7","ÎŒ"],
["8fa6e9","ÎŽÎ«"],
["8fa6ec","Î�"],
["8fa6f1","Î¬Î­Î®Î¯ÏŠÎ�ÏŒÏ‚Ï�Ï‹Î°ÏŽ"],
["8fa7c2","Ð‚",10,"ÐŽÐ�"],
["8fa7f2","Ñ’",10,"ÑžÑŸ"],
["8fa9a1","Ã†Ä�"],
["8fa9a4","Ä¦"],
["8fa9a6","Ä²"],
["8fa9a8","Å�Ä¿"],
["8fa9ab","ÅŠÃ˜Å’"],
["8fa9af","Å¦Ãž"],
["8fa9c1","Ã¦Ä‘Ã°Ä§Ä±Ä³Ä¸Å‚Å€Å‰Å‹Ã¸Å“ÃŸÅ§Ã¾"],
["8faaa1","Ã�Ã€Ã„Ã‚Ä‚Ç�Ä€Ä„Ã…ÃƒÄ†ÄˆÄŒÃ‡ÄŠÄŽÃ‰ÃˆÃ‹ÃŠÄšÄ–Ä’Ä˜"],
["8faaba","ÄœÄžÄ¢Ä Ä¤Ã�ÃŒÃ�ÃŽÇ�Ä°ÄªÄ®Ä¨Ä´Ä¶Ä¹Ä½Ä»ÅƒÅ‡Å…Ã‘Ã“Ã’Ã–Ã”Ç‘Å�ÅŒÃ•Å”Å˜Å–ÅšÅœÅ ÅžÅ¤Å¢ÃšÃ™ÃœÃ›Å¬Ç“Å°ÅªÅ²Å®Å¨Ç—Ç›Ç™Ç•Å´Ã�Å¸Å¶Å¹Å½Å»"],
["8faba1","Ã¡Ã Ã¤Ã¢ÄƒÇŽÄ�Ä…Ã¥Ã£Ä‡Ä‰Ä�Ã§Ä‹Ä�Ã©Ã¨Ã«ÃªÄ›Ä—Ä“Ä™ÇµÄ�ÄŸ"],
["8fabbd","Ä¡Ä¥Ã­Ã¬Ã¯Ã®Ç�"],
["8fabc5","Ä«Ä¯Ä©ÄµÄ·ÄºÄ¾Ä¼Å„ÅˆÅ†Ã±Ã³Ã²Ã¶Ã´Ç’Å‘Å�ÃµÅ•Å™Å—Å›Å�Å¡ÅŸÅ¥Å£ÃºÃ¹Ã¼Ã»Å­Ç”Å±Å«Å³Å¯Å©Ç˜ÇœÇšÇ–ÅµÃ½Ã¿Å·ÅºÅ¾Å¼"],
["8fb0a1","ä¸‚ä¸„ä¸…ä¸Œä¸’ä¸Ÿä¸£ä¸¤ä¸¨ä¸«ä¸®ä¸¯ä¸°ä¸µä¹€ä¹�ä¹„ä¹‡ä¹‘ä¹šä¹œä¹£ä¹¨ä¹©ä¹´ä¹µä¹¹ä¹¿äº�äº–äº—äº�äº¯äº¹ä»ƒä»�ä»šä»›ä» ä»¡ä»¢ä»¨ä»¯ä»±ä»³ä»µä»½ä»¾ä»¿ä¼€ä¼‚ä¼ƒä¼ˆä¼‹ä¼Œä¼’ä¼•ä¼–ä¼—ä¼™ä¼®ä¼±ä½ ä¼³ä¼µä¼·ä¼¹ä¼»ä¼¾ä½€ä½‚ä½ˆä½‰ä½‹ä½Œä½’ä½”ä½–ä½˜ä½Ÿä½£ä½ªä½¬ä½®ä½±ä½·ä½¸ä½¹ä½ºä½½ä½¾ä¾�ä¾‚ä¾„"],
["8fb1a1","ä¾…ä¾‰ä¾Šä¾Œä¾Žä¾�ä¾’ä¾“ä¾”ä¾—ä¾™ä¾šä¾žä¾Ÿä¾²ä¾·ä¾¹ä¾»ä¾¼ä¾½ä¾¾ä¿€ä¿�ä¿…ä¿†ä¿ˆä¿‰ä¿‹ä¿Œä¿�ä¿�ä¿’ä¿œä¿ ä¿¢ä¿°ä¿²ä¿¼ä¿½ä¿¿å€€å€�å€„å€‡å€Šå€Œå€Žå€�å€“å€—å€˜å€›å€œå€�å€žå€¢å€§å€®å€°å€²å€³å€µå�€å��å�‚å�…å�†å�Šå�Œå�Žå�‘å�’å�“å�—å�™å�Ÿå� å�¢å�£å�¦å�§å�ªå�­å�°å�±å€»å‚�å‚ƒå‚„å‚†å‚Šå‚Žå‚�å‚�"],
["8fb2a1","å‚’å‚“å‚”å‚–å‚›å‚œå‚ž",4,"å‚ªå‚¯å‚°å‚¹å‚ºå‚½åƒ€åƒƒåƒ„åƒ‡åƒŒåƒŽåƒ�åƒ“åƒ”åƒ˜åƒœåƒ�åƒŸåƒ¢åƒ¤åƒ¦åƒ¨åƒ©åƒ¯åƒ±åƒ¶åƒºåƒ¾å„ƒå„†å„‡å„ˆå„‹å„Œå„�å„Žåƒ²å„�å„—å„™å„›å„œå„�å„žå„£å„§å„¨å„¬å„­å„¯å„±å„³å„´å„µå„¸å„¹å…‚å…Šå…�å…“å…•å…—å…˜å…Ÿå…¤å…¦å…¾å†ƒå†„å†‹å†Žå†˜å†�å†¡å†£å†­å†¸å†ºå†¼å†¾å†¿å‡‚"],
["8fb3a1","å‡ˆå‡�å‡‘å‡’å‡“å‡•å‡˜å‡žå‡¢å‡¥å‡®å‡²å‡³å‡´å‡·åˆ�åˆ‚åˆ…åˆ’åˆ“åˆ•åˆ–åˆ˜åˆ¢åˆ¨åˆ±åˆ²åˆµåˆ¼å‰…å‰‰å‰•å‰—å‰˜å‰šå‰œå‰Ÿå‰ å‰¡å‰¦å‰®å‰·å‰¸å‰¹åŠ€åŠ‚åŠ…åŠŠåŠŒåŠ“åŠ•åŠ–åŠ—åŠ˜åŠšåŠœåŠ¤åŠ¥åŠ¦åŠ§åŠ¯åŠ°åŠ¶åŠ·åŠ¸åŠºåŠ»åŠ½å‹€å‹„å‹†å‹ˆå‹Œå‹�å‹‘å‹”å‹–å‹›å‹œå‹¡å‹¥å‹¨å‹©å‹ªå‹¬å‹°å‹±å‹´å‹¶å‹·åŒ€åŒƒåŒŠåŒ‹"],
["8fb4a1","åŒŒåŒ‘åŒ“åŒ˜åŒ›åŒœåŒžåŒŸåŒ¥åŒ§åŒ¨åŒ©åŒ«åŒ¬åŒ­åŒ°åŒ²åŒµåŒ¼åŒ½åŒ¾å�‚å�Œå�‹å�™å�›å�¡å�£å�¥å�¬å�­å�²å�¹å�¾åŽƒåŽ‡åŽˆåŽŽåŽ“åŽ”åŽ™åŽ�åŽ¡åŽ¤åŽªåŽ«åŽ¯åŽ²åŽ´åŽµåŽ·åŽ¸åŽºåŽ½å�€å�…å��å�’å�“å�•å�šå��å�žå� å�¦å�§å�µå�‚å�“å�šå�¡å�§å�¨å�ªå�¯å�±å�´å�µå‘ƒå‘„å‘‡å‘�å‘�å‘žå‘¢å‘¤å‘¦å‘§å‘©å‘«å‘­å‘®å‘´å‘¿"],
["8fb5a1","å’�å’ƒå’…å’ˆå’‰å’�å’‘å’•å’–å’œå’Ÿå’¡å’¦å’§å’©å’ªå’­å’®å’±å’·å’¹å’ºå’»å’¿å“†å“Šå“�å“Žå“ å“ªå“¬å“¯å“¶å“¼å“¾å“¿å”€å”�å”…å”ˆå”‰å”Œå”�å”Žå”•å”ªå”«å”²å”µå”¶å”»å”¼å”½å•�å•‡å•‰å•Šå•�å•�å•‘å•˜å•šå•›å•žå• å•¡å•¤å•¦å•¿å–�å–‚å–†å–ˆå–Žå–�å–‘å–’å–“å–”å–—å–£å–¤å–­å–²å–¿å—�å—ƒå—†å—‰å—‹å—Œå—Žå—‘å—’"],
["8fb6a1","å—“å——å—˜å—›å—žå—¢å—©å—¶å—¿å˜…å˜ˆå˜Šå˜�",5,"å˜™å˜¬å˜°å˜³å˜µå˜·å˜¹å˜»å˜¼å˜½å˜¿å™€å™�å™ƒå™„å™†å™‰å™‹å™�å™�å™”å™žå™ å™¡å™¢å™£å™¦å™©å™­å™¯å™±å™²å™µåš„åš…åšˆåš‹åšŒåš•åš™åššåš�åšžåšŸåš¦åš§åš¨åš©åš«åš¬åš­åš±åš³åš·åš¾å›…å›‰å›Šå›‹å›�å›�å›Œå›�å›™å›œå›�å›Ÿå›¡å›¤",4,"å›±å›«å›­"],
["8fb7a1","å›¶å›·åœ�åœ‚åœ‡åœŠåœŒåœ‘åœ•åœšåœ›åœ�åœ åœ¢åœ£åœ¤åœ¥åœ©åœªåœ¬åœ®åœ¯åœ³åœ´åœ½åœ¾åœ¿å�…å�†å�Œå��å�’å�¢å�¥å�§å�¨å�«å�­",4,"å�³å�´å�µå�·å�¹å�ºå�»å�¼å�¾åž�åžƒåžŒåž”åž—åž™åžšåžœåž�åžžåžŸåž¡åž•åž§åž¨åž©åž¬åž¸åž½åŸ‡åŸˆåŸŒåŸ�åŸ•åŸ�åŸžåŸ¤åŸ¦åŸ§åŸ©åŸ­åŸ°åŸµåŸ¶åŸ¸åŸ½åŸ¾åŸ¿å ƒå „å ˆå ‰åŸ¡"],
["8fb8a1","å Œå �å ›å žå Ÿå  å ¦å §å ­å ²å ¹å ¿å¡‰å¡Œå¡�å¡�å¡�å¡•å¡Ÿå¡¡å¡¤å¡§å¡¨å¡¸å¡¼å¡¿å¢€å¢�å¢‡å¢ˆå¢‰å¢Šå¢Œå¢�å¢�å¢�å¢”å¢–å¢�å¢ å¢¡å¢¢å¢¦å¢©å¢±å¢²å£„å¢¼å£‚å£ˆå£�å£Žå£�å£’å£”å£–å£šå£�å£¡å£¢å£©å£³å¤…å¤†å¤‹å¤Œå¤’å¤“å¤”è™�å¤�å¤¡å¤£å¤¤å¤¨å¤¯å¤°å¤³å¤µå¤¶å¤¿å¥ƒå¥†å¥’å¥“å¥™å¥›å¥�å¥žå¥Ÿå¥¡å¥£å¥«å¥­"],
["8fb9a1","å¥¯å¥²å¥µå¥¶å¥¹å¥»å¥¼å¦‹å¦Œå¦Žå¦’å¦•å¦—å¦Ÿå¦¤å¦§å¦­å¦®å¦¯å¦°å¦³å¦·å¦ºå¦¼å§�å§ƒå§„å§ˆå§Šå§�å§’å§�å§žå§Ÿå§£å§¤å§§å§®å§¯å§±å§²å§´å§·å¨€å¨„å¨Œå¨�å¨Žå¨’å¨“å¨žå¨£å¨¤å¨§å¨¨å¨ªå¨­å¨°å©„å©…å©‡å©ˆå©Œå©�å©•å©žå©£å©¥å©§å©­å©·å©ºå©»å©¾åª‹åª�åª“åª–åª™åªœåªžåªŸåª åª¢åª§åª¬åª±åª²åª³åªµåª¸åªºåª»åª¿"],
["8fbaa1","å«„å«†å«ˆå«�å«šå«œå« å«¥å«ªå«®å«µå«¶å«½å¬€å¬�å¬ˆå¬—å¬´å¬™å¬›å¬�å¬¡å¬¥å¬­å¬¸å­�å­‹å­Œå­’å­–å­žå­¨å­®å­¯å­¼å­½å­¾å­¿å®�å®„å®†å®Šå®Žå®�å®‘å®“å®”å®–å®¨å®©å®¬å®­å®¯å®±å®²å®·å®ºå®¼å¯€å¯�å¯�å¯�å¯–",4,"å¯ å¯¯å¯±å¯´å¯½å°Œå°—å°žå°Ÿå°£å°¦å°©å°«å°¬å°®å°°å°²å°µå°¶å±™å±šå±œå±¢å±£å±§å±¨å±©"],
["8fbba1","å±­å±°å±´å±µå±ºå±»å±¼å±½å²‡å²ˆå²Šå²�å²’å²�å²Ÿå² å²¢å²£å²¦å²ªå²²å²´å²µå²ºå³‰å³‹å³’å³�å³—å³®å³±å³²å³´å´�å´†å´�å´’å´«å´£å´¤å´¦å´§å´±å´´å´¹å´½å´¿åµ‚åµƒåµ†åµˆåµ•åµ‘åµ™åµŠåµŸåµ åµ¡åµ¢åµ¤åµªåµ­åµ°åµ¹åµºåµ¾åµ¿å¶�å¶ƒå¶ˆå¶Šå¶’å¶“å¶”å¶•å¶™å¶›å¶Ÿå¶ å¶§å¶«å¶°å¶´å¶¸å¶¹å·ƒå·‡å·‹å·�å·Žå·˜å·™å· å·¤"],
["8fbca1","å·©å·¸å·¹å¸€å¸‡å¸�å¸’å¸”å¸•å¸˜å¸Ÿå¸ å¸®å¸¨å¸²å¸µå¸¾å¹‹å¹�å¹‰å¹‘å¹–å¹˜å¹›å¹œå¹žå¹¨å¹ª",4,"å¹°åº€åº‹åºŽåº¢åº¤åº¥åº¨åºªåº¬åº±åº³åº½åº¾åº¿å»†å»Œå»‹å»Žå»‘å»’å»”å»•å»œå»žå»¥å»«å¼‚å¼†å¼‡å¼ˆå¼Žå¼™å¼œå¼�å¼¡å¼¢å¼£å¼¤å¼¨å¼«å¼¬å¼®å¼°å¼´å¼¶å¼»å¼½å¼¿å½€å½„å½…å½‡å½�å½�å½”å½˜å½›å½ å½£å½¤å½§"],
["8fbda1","å½¯å½²å½´å½µå½¸å½ºå½½å½¾å¾‰å¾�å¾�å¾–å¾œå¾�å¾¢å¾§å¾«å¾¤å¾¬å¾¯å¾°å¾±å¾¸å¿„å¿‡å¿ˆå¿‰å¿‹å¿�",4,"å¿žå¿¡å¿¢å¿¨å¿©å¿ªå¿¬å¿­å¿®å¿¯å¿²å¿³å¿¶å¿ºå¿¼æ€‡æ€Šæ€�æ€“æ€”æ€—æ€˜æ€šæ€Ÿæ€¤æ€­æ€³æ€µæ�€æ�‡æ�ˆæ�‰æ�Œæ�‘æ�”æ�–æ�—æ��æ�¡æ�§æ�±æ�¾æ�¿æ‚‚æ‚†æ‚ˆæ‚Šæ‚Žæ‚‘æ‚“æ‚•æ‚˜æ‚�æ‚žæ‚¢æ‚¤æ‚¥æ‚¨æ‚°æ‚±æ‚·"],
["8fbea1","æ‚»æ‚¾æƒ‚æƒ„æƒˆæƒ‰æƒŠæƒ‹æƒŽæƒ�æƒ”æƒ•æƒ™æƒ›æƒ�æƒžæƒ¢æƒ¥æƒ²æƒµæƒ¸æƒ¼æƒ½æ„‚æ„‡æ„Šæ„Œæ„�",4,"æ„–æ„—æ„™æ„œæ„žæ„¢æ„ªæ„«æ„°æ„±æ„µæ„¶æ„·æ„¹æ…�æ……æ…†æ…‰æ…žæ… æ…¬æ…²æ…¸æ…»æ…¼æ…¿æ†€æ†�æ†ƒæ†„æ†‹æ†�æ†’æ†“æ†—æ†˜æ†œæ†�æ†Ÿæ† æ†¥æ†¨æ†ªæ†­æ†¸æ†¹æ†¼æ‡€æ‡�æ‡‚æ‡Žæ‡�æ‡•æ‡œæ‡�æ‡žæ‡Ÿæ‡¡æ‡¢æ‡§æ‡©æ‡¥"],
["8fbfa1","æ‡¬æ‡­æ‡¯æˆ�æˆƒæˆ„æˆ‡æˆ“æˆ•æˆœæˆ æˆ¢æˆ£æˆ§æˆ©æˆ«æˆ¹æˆ½æ‰‚æ‰ƒæ‰„æ‰†æ‰Œæ‰�æ‰‘æ‰’æ‰”æ‰–æ‰šæ‰œæ‰¤æ‰­æ‰¯æ‰³æ‰ºæ‰½æŠ�æŠŽæŠ�æŠ�æŠ¦æŠ¨æŠ³æŠ¶æŠ·æŠºæŠ¾æŠ¿æ‹„æ‹Žæ‹•æ‹–æ‹šæ‹ªæ‹²æ‹´æ‹¼æ‹½æŒƒæŒ„æŒŠæŒ‹æŒ�æŒ�æŒ“æŒ–æŒ˜æŒ©æŒªæŒ­æŒµæŒ¶æŒ¹æŒ¼æ��æ�‚æ�ƒæ�„æ�†æ�Šæ�‹æ�Žæ�’æ�“æ�”æ�˜æ�›æ�¥æ�¦æ�¬æ�­æ�±æ�´æ�µ"],
["8fc0a1","æ�¸æ�¼æ�½æ�¿æŽ‚æŽ„æŽ‡æŽŠæŽ�æŽ”æŽ•æŽ™æŽšæŽžæŽ¤æŽ¦æŽ­æŽ®æŽ¯æŽ½æ��æ�…æ�ˆæ�Žæ�‘æ�“æ�”æ�•æ�œæ� æ�¥æ�ªæ�¬æ�²æ�³æ�µæ�¸æ�¹æ�‰æ�Šæ��æ�’æ�”æ�˜æ�žæ� æ�¢æ�¤æ�¥æ�©æ�ªæ�¯æ�°æ�µæ�½æ�¿æ‘‹æ‘�æ‘‘æ‘’æ‘“æ‘”æ‘šæ‘›æ‘œæ‘�æ‘Ÿæ‘ æ‘¡æ‘£æ‘­æ‘³æ‘´æ‘»æ‘½æ’…æ’‡æ’�æ’�æ’‘æ’˜æ’™æ’›æ’�æ’Ÿæ’¡æ’£æ’¦æ’¨æ’¬æ’³æ’½æ’¾æ’¿"],
["8fc1a1","æ“„æ“‰æ“Šæ“‹æ“Œæ“Žæ“�æ“‘æ“•æ“—æ“¤æ“¥æ“©æ“ªæ“­æ“°æ“µæ“·æ“»æ“¿æ”�æ”„æ”ˆæ”‰æ”Šæ”�æ”“æ””æ”–æ”™æ”›æ”žæ”Ÿæ”¢æ”¦æ”©æ”®æ”±æ”ºæ”¼æ”½æ•ƒæ•‡æ•‰æ•�æ•’æ•”æ•Ÿæ• æ•§æ•«æ•ºæ•½æ–�æ–…æ–Šæ–’æ–•æ–˜æ–�æ– æ–£æ–¦æ–®æ–²æ–³æ–´æ–¿æ—‚æ—ˆæ—‰æ—Žæ—�æ—”æ—–æ—˜æ—Ÿæ—°æ—²æ—´æ—µæ—¹æ—¾æ—¿æ˜€æ˜„æ˜ˆæ˜‰æ˜�æ˜‘æ˜’æ˜•æ˜–æ˜�"],
["8fc2a1","æ˜žæ˜¡æ˜¢æ˜£æ˜¤æ˜¦æ˜©æ˜ªæ˜«æ˜¬æ˜®æ˜°æ˜±æ˜³æ˜¹æ˜·æ™€æ™…æ™†æ™Šæ™Œæ™‘æ™Žæ™—æ™˜æ™™æ™›æ™œæ™ æ™¡æ›»æ™ªæ™«æ™¬æ™¾æ™³æ™µæ™¿æ™·æ™¸æ™¹æ™»æš€æ™¼æš‹æšŒæš�æš�æš’æš™æššæš›æšœæšŸæš æš¤æš­æš±æš²æšµæš»æš¿æ›€æ›‚æ›ƒæ›ˆæ›Œæ›Žæ›�æ›”æ››æ›Ÿæ›¨æ›«æ›¬æ›®æ›ºæœ…æœ‡æœŽæœ“æœ™æœœæœ æœ¢æœ³æœ¾æ�…æ�‡æ�ˆæ�Œæ�”æ�•æ��"],
["8fc3a1","æ�¦æ�¬æ�®æ�´æ�¶æ�»æž�æž„æžŽæž�æž‘æž“æž–æž˜æž™æž›æž°æž±æž²æžµæž»æž¼æž½æŸ¹æŸ€æŸ‚æŸƒæŸ…æŸˆæŸ‰æŸ’æŸ—æŸ™æŸœæŸ¡æŸ¦æŸ°æŸ²æŸ¶æŸ·æ¡’æ ”æ ™æ �æ Ÿæ ¨æ §æ ¬æ ­æ ¯æ °æ ±æ ³æ »æ ¿æ¡„æ¡…æ¡Šæ¡Œæ¡•æ¡—æ¡˜æ¡›æ¡«æ¡®",4,"æ¡µæ¡¹æ¡ºæ¡»æ¡¼æ¢‚æ¢„æ¢†æ¢ˆæ¢–æ¢˜æ¢šæ¢œæ¢¡æ¢£æ¢¥æ¢©æ¢ªæ¢®æ¢²æ¢»æ£…æ£ˆæ£Œæ£�"],
["8fc4a1","æ£�æ£‘æ£“æ£–æ£™æ£œæ£�æ£¥æ£¨æ£ªæ£«æ£¬æ£­æ£°æ£±æ£µæ£¶æ£»æ£¼æ£½æ¤†æ¤‰æ¤Šæ¤�æ¤‘æ¤“æ¤–æ¤—æ¤±æ¤³æ¤µæ¤¸æ¤»æ¥‚æ¥…æ¥‰æ¥Žæ¥—æ¥›æ¥£æ¥¤æ¥¥æ¥¦æ¥¨æ¥©æ¥¬æ¥°æ¥±æ¥²æ¥ºæ¥»æ¥¿æ¦€æ¦�æ¦’æ¦–æ¦˜æ¦¡æ¦¥æ¦¦æ¦¨æ¦«æ¦­æ¦¯æ¦·æ¦¸æ¦ºæ¦¼æ§…æ§ˆæ§‘æ§–æ§—æ§¢æ§¥æ§®æ§¯æ§±æ§³æ§µæ§¾æ¨€æ¨�æ¨ƒæ¨�æ¨‘æ¨•æ¨šæ¨�æ¨ æ¨¤æ¨¨æ¨°æ¨²"],
["8fc5a1","æ¨´æ¨·æ¨»æ¨¾æ¨¿æ©…æ©†æ©‰æ©Šæ©Žæ©�æ©‘æ©’æ©•æ©–æ©›æ©¤æ©§æ©ªæ©±æ©³æ©¾æª�æªƒæª†æª‡æª‰æª‹æª‘æª›æª�æªžæªŸæª¥æª«æª¯æª°æª±æª´æª½æª¾æª¿æ«†æ«‰æ«ˆæ«Œæ«�æ«”æ«•æ«–æ«œæ«�æ«¤æ«§æ«¬æ«°æ«±æ«²æ«¼æ«½æ¬‚æ¬ƒæ¬†æ¬‡æ¬‰æ¬�æ¬�æ¬‘æ¬—æ¬›æ¬žæ¬¤æ¬¨æ¬«æ¬¬æ¬¯æ¬µæ¬¶æ¬»æ¬¿æ­†æ­Šæ­�æ­’æ­–æ­˜æ­�æ­ æ­§æ­«æ­®æ­°æ­µæ­½"],
["8fc6a1","æ­¾æ®‚æ®…æ®—æ®›æ®Ÿæ® æ®¢æ®£æ®¨æ®©æ®¬æ®­æ®®æ®°æ®¸æ®¹æ®½æ®¾æ¯ƒæ¯„æ¯‰æ¯Œæ¯–æ¯šæ¯¡æ¯£æ¯¦æ¯§æ¯®æ¯±æ¯·æ¯¹æ¯¿æ°‚æ°„æ°…æ°‰æ°�æ°Žæ°�æ°’æ°™æ°Ÿæ°¦æ°§æ°¨æ°¬æ°®æ°³æ°µæ°¶æ°ºæ°»æ°¿æ±Šæ±‹æ±�æ±�æ±’æ±”æ±™æ±›æ±œæ±«æ±­æ±¯æ±´æ±¶æ±¸æ±¹æ±»æ²…æ²†æ²‡æ²‰æ²”æ²•æ²—æ²˜æ²œæ²Ÿæ²°æ²²æ²´æ³‚æ³†æ³�æ³�æ³�æ³‘æ³’æ³”æ³–"],
["8fc7a1","æ³šæ³œæ³ æ³§æ³©æ³«æ³¬æ³®æ³²æ³´æ´„æ´‡æ´Šæ´Žæ´�æ´‘æ´“æ´šæ´¦æ´§æ´¨æ±§æ´®æ´¯æ´±æ´¹æ´¼æ´¿æµ—æµžæµŸæµ¡æµ¥æµ§æµ¯æµ°æµ¼æ¶‚æ¶‡æ¶‘æ¶’æ¶”æ¶–æ¶—æ¶˜æ¶ªæ¶¬æ¶´æ¶·æ¶¹æ¶½æ¶¿æ·„æ·ˆæ·Šæ·Žæ·�æ·–æ·›æ·�æ·Ÿæ· æ·¢æ·¥æ·©æ·¯æ·°æ·´æ·¶æ·¼æ¸€æ¸„æ¸žæ¸¢æ¸§æ¸²æ¸¶æ¸¹æ¸»æ¸¼æ¹„æ¹…æ¹ˆæ¹‰æ¹‹æ¹�æ¹‘æ¹’æ¹“æ¹”æ¹—æ¹œæ¹�æ¹ž"],
["8fc8a1","æ¹¢æ¹£æ¹¨æ¹³æ¹»æ¹½æº�æº“æº™æº æº§æº­æº®æº±æº³æº»æº¿æ»€æ»�æ»ƒæ»‡æ»ˆæ»Šæ»�æ»Žæ»�æ»«æ»­æ»®æ»¹æ»»æ»½æ¼„æ¼ˆæ¼Šæ¼Œæ¼�æ¼–æ¼˜æ¼šæ¼›æ¼¦æ¼©æ¼ªæ¼¯æ¼°æ¼³æ¼¶æ¼»æ¼¼æ¼­æ½�æ½‘æ½’æ½“æ½—æ½™æ½šæ½�æ½žæ½¡æ½¢æ½¨æ½¬æ½½æ½¾æ¾ƒæ¾‡æ¾ˆæ¾‹æ¾Œæ¾�æ¾�æ¾’æ¾“æ¾”æ¾–æ¾šæ¾Ÿæ¾ æ¾¥æ¾¦æ¾§æ¾¨æ¾®æ¾¯æ¾°æ¾µæ¾¶æ¾¼æ¿…æ¿‡æ¿ˆæ¿Š"],
["8fc9a1","æ¿šæ¿žæ¿¨æ¿©æ¿°æ¿µæ¿¹æ¿¼æ¿½ç€€ç€…ç€†ç€‡ç€�ç€—ç€ ç€£ç€¯ç€´ç€·ç€¹ç€¼ç�ƒç�„ç�ˆç�‰ç�Šç�‹ç�”ç�•ç��ç�žç�Žç�¤ç�¥ç�¬ç�®ç�µç�¶ç�¾ç‚�ç‚…ç‚†ç‚”",4,"ç‚›ç‚¤ç‚«ç‚°ç‚±ç‚´ç‚·çƒŠçƒ‘çƒ“çƒ”çƒ•çƒ–çƒ˜çƒœçƒ¤çƒºç„ƒ",4,"ç„‹ç„Œç„�ç„žç„ ç„«ç„­ç„¯ç„°ç„±ç„¸ç…�ç……ç…†ç…‡ç…Šç…‹ç…�ç…’ç…—ç…šç…œç…žç… "],
["8fcaa1","ç…¨ç…¹ç†€ç†…ç†‡ç†Œç†’ç†šç†›ç† ç†¢ç†¯ç†°ç†²ç†³ç†ºç†¿ç‡€ç‡�ç‡„ç‡‹ç‡Œç‡“ç‡–ç‡™ç‡šç‡œç‡¸ç‡¾çˆ€çˆ‡çˆˆçˆ‰çˆ“çˆ—çˆšçˆ�çˆŸçˆ¤çˆ«çˆ¯çˆ´çˆ¸çˆ¹ç‰�ç‰‚ç‰ƒç‰…ç‰Žç‰�ç‰�ç‰“ç‰•ç‰–ç‰šç‰œç‰žç‰ ç‰£ç‰¨ç‰«ç‰®ç‰¯ç‰±ç‰·ç‰¸ç‰»ç‰¼ç‰¿çŠ„çŠ‰çŠ�çŠŽçŠ“çŠ›çŠ¨çŠ­çŠ®çŠ±çŠ´çŠ¾ç‹�ç‹‡ç‹‰ç‹Œç‹•ç‹–ç‹˜ç‹Ÿç‹¥ç‹³ç‹´ç‹ºç‹»"],
["8fcba1","ç‹¾çŒ‚çŒ„çŒ…çŒ‡çŒ‹çŒ�çŒ’çŒ“çŒ˜çŒ™çŒžçŒ¢çŒ¤çŒ§çŒ¨çŒ¬çŒ±çŒ²çŒµçŒºçŒ»çŒ½ç�ƒç��ç��ç�’ç�–ç�˜ç��ç�žç�Ÿç� ç�¦ç�§ç�©ç�«ç�¬ç�®ç�¯ç�±ç�·ç�¹ç�¼çŽ€çŽ�çŽƒçŽ…çŽ†çŽŽçŽ�çŽ“çŽ•çŽ—çŽ˜çŽœçŽžçŽŸçŽ çŽ¢çŽ¥çŽ¦çŽªçŽ«çŽ­çŽµçŽ·çŽ¹çŽ¼çŽ½çŽ¿ç�…ç�†ç�‰ç�‹ç�Œç��ç�’ç�“ç�–ç�™ç��ç�¡ç�£ç�¦ç�§ç�©ç�´ç�µç�·ç�¹ç�ºç�»ç�½"],
["8fcca1","ç�¿ç�€ç��ç�„ç�‡ç�Šç�‘ç�šç�›ç�¤ç�¦ç�¨",9,"ç�¹ç‘€ç‘ƒç‘„ç‘†ç‘‡ç‘‹ç‘�ç‘‘ç‘’ç‘—ç‘�ç‘¢ç‘¦ç‘§ç‘¨ç‘«ç‘­ç‘®ç‘±ç‘²ç’€ç’�ç’…ç’†ç’‡ç’‰ç’�ç’�ç’‘ç’’ç’˜ç’™ç’šç’œç’Ÿç’ ç’¡ç’£ç’¦ç’¨ç’©ç’ªç’«ç’®ç’¯ç’±ç’²ç’µç’¹ç’»ç’¿ç“ˆç“‰ç“Œç“�ç““ç“˜ç“šç“›ç“žç“Ÿç“¤ç“¨ç“ªç“«ç“¯ç“´ç“ºç“»ç“¼ç“¿ç”†"],
["8fcda1","ç”’ç”–ç”—ç” ç”¡ç”¤ç”§ç”©ç”ªç”¯ç”¶ç”¹ç”½ç”¾ç”¿ç•€ç•ƒç•‡ç•ˆç•Žç•�ç•’ç•—ç•žç•Ÿç•¡ç•¯ç•±ç•¹",5,"ç–�ç–…ç–�ç–’ç–“ç–•ç–™ç–œç–¢ç–¤ç–´ç–ºç–¿ç—€ç—�ç—„ç—†ç—Œç—Žç—�ç——ç—œç—Ÿç— ç—¡ç—¤ç—§ç—¬ç—®ç—¯ç—±ç—¹ç˜€ç˜‚ç˜ƒç˜„ç˜‡ç˜ˆç˜Šç˜Œç˜�ç˜’ç˜“ç˜•ç˜–ç˜™ç˜›ç˜œç˜�ç˜žç˜£ç˜¥ç˜¦ç˜©ç˜­ç˜²ç˜³ç˜µç˜¸ç˜¹"],
["8fcea1","ç˜ºç˜¼ç™Šç™€ç™�ç™ƒç™„ç™…ç™‰ç™‹ç™•ç™™ç™Ÿç™¤ç™¥ç™­ç™®ç™¯ç™±ç™´çš�çš…çšŒçš�çš•çš›çšœçš�çšŸçš çš¢",6,"çšªçš­çš½ç›�ç›…ç›‰ç›‹ç›Œç›Žç›”ç›™ç› ç›¦ç›¨ç›¬ç›°ç›±ç›¶ç›¹ç›¼çœ€çœ†çœŠçœŽçœ’çœ”çœ•çœ—çœ™çœšçœœçœ¢çœ¨çœ­çœ®çœ¯çœ´çœµçœ¶çœ¹çœ½çœ¾ç�‚ç�…ç�†ç�Šç��ç�Žç��ç�’ç�–ç�—ç�œç�žç�Ÿç� ç�¢"],
["8fcfa1","ç�¤ç�§ç�ªç�¬ç�°ç�²ç�³ç�´ç�ºç�½çž€çž„çžŒçž�çž”çž•çž–çžšçžŸçž¢çž§çžªçž®çž¯çž±çžµçž¾çŸƒçŸ‰çŸ‘çŸ’çŸ•çŸ™çŸžçŸŸçŸ çŸ¤çŸ¦çŸªçŸ¬çŸ°çŸ±çŸ´çŸ¸çŸ»ç …ç †ç ‰ç �ç Žç ‘ç �ç ¡ç ¢ç £ç ­ç ®ç °ç µç ·ç¡ƒç¡„ç¡‡ç¡ˆç¡Œç¡Žç¡’ç¡œç¡žç¡ ç¡¡ç¡£ç¡¤ç¡¨ç¡ªç¡®ç¡ºç¡¾ç¢Šç¢�ç¢”ç¢˜ç¢¡ç¢�ç¢žç¢Ÿç¢¤ç¢¨ç¢¬ç¢­ç¢°ç¢±ç¢²ç¢³"],
["8fd0a1","ç¢»ç¢½ç¢¿ç£‡ç£ˆç£‰ç£Œç£Žç£’ç£“ç£•ç£–ç£¤ç£›ç£Ÿç£ ç£¡ç£¦ç£ªç£²ç£³ç¤€ç£¶ç£·ç£ºç£»ç£¿ç¤†ç¤Œç¤�ç¤šç¤œç¤žç¤Ÿç¤ ç¤¥ç¤§ç¤©ç¤­ç¤±ç¤´ç¤µç¤»ç¤½ç¤¿ç¥„ç¥…ç¥†ç¥Šç¥‹ç¥�ç¥‘ç¥”ç¥˜ç¥›ç¥œç¥§ç¥©ç¥«ç¥²ç¥¹ç¥»ç¥¼ç¥¾ç¦‹ç¦Œç¦‘ç¦“ç¦”ç¦•ç¦–ç¦˜ç¦›ç¦œç¦¡ç¦¨ç¦©ç¦«ç¦¯ç¦±ç¦´ç¦¸ç¦»ç§‚ç§„ç§‡ç§ˆç§Šç§�ç§”ç§–ç§šç§�ç§ž"],
["8fd1a1","ç§ ç§¢ç§¥ç§ªç§«ç§­ç§±ç§¸ç§¼ç¨‚ç¨ƒç¨‡ç¨‰ç¨Šç¨Œç¨‘ç¨•ç¨›ç¨žç¨¡ç¨§ç¨«ç¨­ç¨¯ç¨°ç¨´ç¨µç¨¸ç¨¹ç¨ºç©„ç©…ç©‡ç©ˆç©Œç©•ç©–ç©™ç©œç©�ç©Ÿç© ç©¥ç©§ç©ªç©­ç©µç©¸ç©¾çª€çª‚çª…çª†çªŠçª‹çª�çª‘çª”çªžçª çª£çª¬çª³çªµçª¹çª»çª¼ç«†ç«‰ç«Œç«Žç«‘ç«›ç«¨ç«©ç««ç«¬ç«±ç«´ç«»ç«½ç«¾ç¬‡ç¬”ç¬Ÿç¬£ç¬§ç¬©ç¬ªç¬«ç¬­ç¬®ç¬¯ç¬°"],
["8fd2a1","ç¬±ç¬´ç¬½ç¬¿ç­€ç­�ç­‡ç­Žç­•ç­ ç­¤ç­¦ç­©ç­ªç­­ç­¯ç­²ç­³ç­·ç®„ç®‰ç®Žç®�ç®‘ç®–ç®›ç®žç® ç®¥ç®¬ç®¯ç®°ç®²ç®µç®¶ç®ºç®»ç®¼ç®½ç¯‚ç¯…ç¯ˆç¯Šç¯”ç¯–ç¯—ç¯™ç¯šç¯›ç¯¨ç¯ªç¯²ç¯´ç¯µç¯¸ç¯¹ç¯ºç¯¼ç¯¾ç°�ç°‚ç°ƒç°„ç°†ç°‰ç°‹ç°Œç°Žç°�ç°™ç°›ç° ç°¥ç°¦ç°¨ç°¬ç°±ç°³ç°´ç°¶ç°¹ç°ºç±†ç±Šç±•ç±‘ç±’ç±“ç±™",5],
["8fd3a1","ç±¡ç±£ç±§ç±©ç±­ç±®ç±°ç±²ç±¹ç±¼ç±½ç²†ç²‡ç²�ç²”ç²žç² ç²¦ç²°ç²¶ç²·ç²ºç²»ç²¼ç²¿ç³„ç³‡ç³ˆç³‰ç³�ç³�ç³“ç³”ç³•ç³—ç³™ç³šç³�ç³¦ç³©ç³«ç³µç´ƒç´‡ç´ˆç´‰ç´�ç´‘ç´’ç´“ç´–ç´�ç´žç´£ç´¦ç´ªç´­ç´±ç´¼ç´½ç´¾çµ€çµ�çµ‡çµˆçµ�çµ‘çµ“çµ—çµ™çµšçµœçµ�çµ¥çµ§çµªçµ°çµ¸çµºçµ»çµ¿ç¶�ç¶‚ç¶ƒç¶…ç¶†ç¶ˆç¶‹ç¶Œç¶�ç¶‘ç¶–ç¶—ç¶�"],
["8fd4a1","ç¶žç¶¦ç¶§ç¶ªç¶³ç¶¶ç¶·ç¶¹ç·‚",4,"ç·Œç·�ç·Žç·—ç·™ç¸€ç·¢ç·¥ç·¦ç·ªç·«ç·­ç·±ç·µç·¶ç·¹ç·ºç¸ˆç¸�ç¸‘ç¸•ç¸—ç¸œç¸�ç¸ ç¸§ç¸¨ç¸¬ç¸­ç¸¯ç¸³ç¸¶ç¸¿ç¹„ç¹…ç¹‡ç¹Žç¹�ç¹’ç¹˜ç¹Ÿç¹¡ç¹¢ç¹¥ç¹«ç¹®ç¹¯ç¹³ç¹¸ç¹¾çº�çº†çº‡çºŠçº�çº‘çº•çº˜çºšçº�çºžç¼¼ç¼»ç¼½ç¼¾ç¼¿ç½ƒç½„ç½‡ç½�ç½’ç½“ç½›ç½œç½�ç½¡ç½£ç½¤ç½¥ç½¦ç½­"],
["8fd5a1","ç½±ç½½ç½¾ç½¿ç¾€ç¾‹ç¾�ç¾�ç¾�ç¾‘ç¾–ç¾—ç¾œç¾¡ç¾¢ç¾¦ç¾ªç¾­ç¾´ç¾¼ç¾¿ç¿€ç¿ƒç¿ˆç¿Žç¿�ç¿›ç¿Ÿç¿£ç¿¥ç¿¨ç¿¬ç¿®ç¿¯ç¿²ç¿ºç¿½ç¿¾ç¿¿è€‡è€ˆè€Šè€�è€Žè€�è€‘è€“è€”è€–è€�è€žè€Ÿè€ è€¤è€¦è€¬è€®è€°è€´è€µè€·è€¹è€ºè€¼è€¾è�€è�„è� è�¤è�¦è�­è�±è�µè‚�è‚ˆè‚Žè‚œè‚žè‚¦è‚§è‚«è‚¸è‚¹èƒˆèƒ�èƒ�èƒ’èƒ”èƒ•èƒ—èƒ˜èƒ èƒ­èƒ®"],
["8fd6a1","èƒ°èƒ²èƒ³èƒ¶èƒ¹èƒºèƒ¾è„ƒè„‹è„–è„—è„˜è„œè„žè„ è„¤è„§è„¬è„°è„µè„ºè„¼è……è…‡è…Šè…Œè…’è…—è… è…¡è…§è…¨è…©è…­è…¯è…·è†�è†�è†„è†…è††è†‹è†Žè†–è†˜è†›è†žè†¢è†®è†²è†´è†»è‡‹è‡ƒè‡…è‡Šè‡Žè‡�è‡•è‡—è‡›è‡�è‡žè‡¡è‡¤è‡«è‡¬è‡°è‡±è‡²è‡µè‡¶è‡¸è‡¹è‡½è‡¿èˆ€èˆƒèˆ�èˆ“èˆ”èˆ™èˆšèˆ�èˆ¡èˆ¢èˆ¨èˆ²èˆ´èˆºè‰ƒè‰„è‰…è‰†"],
["8fd7a1","è‰‹è‰Žè‰�è‰‘è‰–è‰œè‰ è‰£è‰§è‰­è‰´è‰»è‰½è‰¿èŠ€èŠ�èŠƒèŠ„èŠ‡èŠ‰èŠŠèŠŽèŠ‘èŠ”èŠ–èŠ˜èŠšèŠ›èŠ èŠ¡èŠ£èŠ¤èŠ§èŠ¨èŠ©èŠªèŠ®èŠ°èŠ²èŠ´èŠ·èŠºèŠ¼èŠ¾èŠ¿è‹†è‹�è‹•è‹šè‹ è‹¢è‹¤è‹¨è‹ªè‹­è‹¯è‹¶è‹·è‹½è‹¾èŒ€èŒ�èŒ‡èŒˆèŒŠèŒ‹è�”èŒ›èŒ�èŒžèŒŸèŒ¡èŒ¢èŒ¬èŒ­èŒ®èŒ°èŒ³èŒ·èŒºèŒ¼èŒ½è�‚è�ƒè�„è�‡è��è�Žè�‘è�•è�–è�—è�°è�¸"],
["8fd8a1","è�½è�¿èŽ€èŽ‚èŽ„èŽ†èŽ�èŽ’èŽ”èŽ•èŽ˜èŽ™èŽ›èŽœèŽ�èŽ¦èŽ§èŽ©èŽ¬èŽ¾èŽ¿è�€è�‡è�‰è��è��è�‘è�”è��è�“è�¨è�ªè�¶è�¸è�¹è�¼è��è�†è�Šè��è�‘è�•è�™èŽ­è�¯è�¹è‘…è‘‡è‘ˆè‘Šè‘�è‘�è‘‘è‘’è‘–è‘˜è‘™è‘šè‘œè‘ è‘¤è‘¥è‘§è‘ªè‘°è‘³è‘´è‘¶è‘¸è‘¼è‘½è’�è’…è’’è’“è’•è’žè’¦è’¨è’©è’ªè’¯è’±è’´è’ºè’½è’¾è“€è“‚è“‡è“ˆè“Œè“�è““"],
["8fd9a1","è“œè“§è“ªè“¯è“°è“±è“²è“·è”²è“ºè“»è“½è”‚è”ƒè”‡è”Œè”Žè”�è”œè”žè”¢è”£è”¤è”¥è”§è”ªè”«è”¯è”³è”´è”¶è”¿è•†è•�",4,"è•–è•™è•œ",6,"è•¤è•«è•¯è•¹è•ºè•»è•½è•¿è–�è–…è–†è–‰è–‹è–Œè–�è–“è–˜è–�è–Ÿè– è–¢è–¥è–§è–´è–¶è–·è–¸è–¼è–½è–¾è–¿è—‚è—‡è—Šè—‹è—Žè–­è—˜è—šè—Ÿè— è—¦è—¨è—­è—³è—¶è—¼"],
["8fdaa1","è—¿è˜€è˜„è˜…è˜�è˜Žè˜�è˜‘è˜’è˜˜è˜™è˜›è˜žè˜¡è˜§è˜©è˜¶è˜¸è˜ºè˜¼è˜½è™€è™‚è™†è™’è™“è™–è™—è™˜è™™è™�è™ ",4,"è™©è™¬è™¯è™µè™¶è™·è™ºèš�èš‘èš–èš˜èššèšœèš¡èš¦èš§èš¨èš­èš±èš³èš´èšµèš·èš¸èš¹èš¿è›€è›�è›ƒè›…è›‘è›’è›•è›—è›šè›œè› è›£è›¥è›§èšˆè›ºè›¼è›½èœ„èœ…èœ‡èœ‹èœŽèœ�èœ�èœ“èœ”èœ™èœžèœŸèœ¡èœ£"],
["8fdba1","èœ¨èœ®èœ¯èœ±èœ²èœ¹èœºèœ¼èœ½èœ¾è�€è�ƒè�…è��è�˜è��è�¡è�¤è�¥è�¯è�±è�²è�»èžƒ",6,"èž‹èžŒèž�èž“èž•èž—èž˜èž™èžžèž èž£èž§èž¬èž­èž®èž±èžµèž¾èž¿èŸ�èŸˆèŸ‰èŸŠèŸŽèŸ•èŸ–èŸ™èŸšèŸœèŸŸèŸ¢èŸ£èŸ¤èŸªèŸ«èŸ­èŸ±èŸ³èŸ¸èŸºèŸ¿è �è ƒè †è ‰è Šè ‹è �è ™è ’è “è ”è ˜è šè ›è œè žè Ÿè ¨è ­è ®è °è ²è µ"],
["8fdca1","è ºè ¼è¡�è¡ƒè¡…è¡ˆè¡‰è¡Šè¡‹è¡Žè¡‘è¡•è¡–è¡˜è¡šè¡œè¡Ÿè¡ è¡¤è¡©è¡±è¡¹è¡»è¢€è¢˜è¢šè¢›è¢œè¢Ÿè¢ è¢¨è¢ªè¢ºè¢½è¢¾è£€è£Š",4,"è£‘è£’è£“è£›è£žè£§è£¯è£°è£±è£µè£·è¤�è¤†è¤�è¤Žè¤�è¤•è¤–è¤˜è¤™è¤šè¤œè¤ è¤¦è¤§è¤¨è¤°è¤±è¤²è¤µè¤¹è¤ºè¤¾è¥€è¥‚è¥…è¥†è¥‰è¥�è¥’è¥—è¥šè¥›è¥œè¥¡è¥¢è¥£è¥«è¥®è¥°è¥³è¥µè¥º"],
["8fdda1","è¥»è¥¼è¥½è¦‰è¦�è¦�è¦”è¦•è¦›è¦œè¦Ÿè¦ è¦¥è¦°è¦´è¦µè¦¶è¦·è¦¼è§”",4,"è§¥è§©è§«è§­è§±è§³è§¶è§¹è§½è§¿è¨„è¨…è¨‡è¨�è¨‘è¨’è¨”è¨•è¨žè¨ è¨¢è¨¤è¨¦è¨«è¨¬è¨¯è¨µè¨·è¨½è¨¾è©€è©ƒè©…è©‡è©‰è©�è©Žè©“è©–è©—è©˜è©œè©�è©¡è©¥è©§è©µè©¶è©·è©¹è©ºè©»è©¾è©¿èª€èªƒèª†èª‹èª�èª�èª’èª–èª—èª™èªŸèª§èª©èª®èª¯èª³"],
["8fdea1","èª¶èª·èª»èª¾è«ƒè«†è«ˆè«‰è«Šè«‘è«“è«”è«•è«—è«�è«Ÿè«¬è«°è«´è«µè«¶è«¼è«¿è¬…è¬†è¬‹è¬‘è¬œè¬žè¬Ÿè¬Šè¬­è¬°è¬·è¬¼è­‚",4,"è­ˆè­’è­“è­”è­™è­�è­žè­£è­­è­¶è­¸è­¹è­¼è­¾è®�è®„è®…è®‹è®�è®�è®”è®•è®œè®žè®Ÿè°¸è°¹è°½è°¾è±…è±‡è±‰è±‹è±�è±‘è±“è±”è±—è±˜è±›è±�è±™è±£è±¤è±¦è±¨è±©è±­è±³è±µè±¶è±»è±¾è²†"],
["8fdfa1","è²‡è²‹è²�è²’è²“è²™è²›è²œè²¤è²¹è²ºè³…è³†è³‰è³‹è³�è³–è³•è³™è³�è³¡è³¨è³¬è³¯è³°è³²è³µè³·è³¸è³¾è³¿è´�è´ƒè´‰è´’è´—è´›èµ¥èµ©èµ¬èµ®èµ¿è¶‚è¶„è¶ˆè¶�è¶�è¶‘è¶•è¶žè¶Ÿè¶ è¶¦è¶«è¶¬è¶¯è¶²è¶µè¶·è¶¹è¶»è·€è·…è·†è·‡è·ˆè·Šè·Žè·‘è·”è·•è·—è·™è·¤è·¥è·§è·¬è·°è¶¼è·±è·²è·´è·½è¸�è¸„è¸…è¸†è¸‹è¸‘è¸”è¸–è¸ è¸¡è¸¢"],
["8fe0a1","è¸£è¸¦è¸§è¸±è¸³è¸¶è¸·è¸¸è¸¹è¸½è¹€è¹�è¹‹è¹�è¹Žè¹�è¹”è¹›è¹œè¹�è¹žè¹¡è¹¢è¹©è¹¬è¹­è¹¯è¹°è¹±è¹¹è¹ºè¹»èº‚èºƒèº‰èº�èº’èº•èºšèº›èº�èºžèº¢èº§èº©èº­èº®èº³èºµèººèº»è»€è»�è»ƒè»„è»‡è»�è»‘è»”è»œè»¨è»®è»°è»±è»·è»¹è»ºè»­è¼€è¼‚è¼‡è¼ˆè¼�è¼�è¼–è¼—è¼˜è¼žè¼ è¼¡è¼£è¼¥è¼§è¼¨è¼¬è¼­è¼®è¼´è¼µè¼¶è¼·è¼ºè½€è½�"],
["8fe1a1","è½ƒè½‡è½�è½‘",4,"è½˜è½�è½žè½¥è¾�è¾ è¾¡è¾¤è¾¥è¾¦è¾µè¾¶è¾¸è¾¾è¿€è¿�è¿†è¿Šè¿‹è¿�è¿�è¿’è¿“è¿•è¿ è¿£è¿¤è¿¨è¿®è¿±è¿µè¿¶è¿»è¿¾é€‚é€„é€ˆé€Œé€˜é€›é€¨é€©é€¯é€ªé€¬é€­é€³é€´é€·é€¿é�ƒé�„é�Œé�›é��é�¢é�¦é�§é�¬é�°é�´é�¹é‚…é‚ˆé‚‹é‚Œé‚Žé‚�é‚•é‚—é‚˜é‚™é‚›é‚ é‚¡é‚¢é‚¥é‚°é‚²é‚³é‚´é‚¶é‚½éƒŒé‚¾éƒƒ"],
["8fe2a1","éƒ„éƒ…éƒ‡éƒˆéƒ•éƒ—éƒ˜éƒ™éƒœéƒ�éƒŸéƒ¥éƒ’éƒ¶éƒ«éƒ¯éƒ°éƒ´éƒ¾éƒ¿é„€é„„é„…é„†é„ˆé„�é„�é„”é„–é„—é„˜é„šé„œé„žé„ é„¥é„¢é„£é„§é„©é„®é„¯é„±é„´é„¶é„·é„¹é„ºé„¼é„½é…ƒé…‡é…ˆé…�é…“é…—é…™é…šé…›é…¡é…¤é…§é…­é…´é…¹é…ºé…»é†�é†ƒé†…é††é†Šé†Žé†‘é†“é†”é†•é†˜é†žé†¡é†¦é†¨é†¬é†­é†®é†°é†±é†²é†³é†¶é†»é†¼é†½é†¿"],
["8fe3a1","é‡‚é‡ƒé‡…é‡“é‡”é‡—é‡™é‡šé‡žé‡¤é‡¥é‡©é‡ªé‡¬",5,"é‡·é‡¹é‡»é‡½éˆ€éˆ�éˆ„éˆ…éˆ†éˆ‡éˆ‰éˆŠéˆŒéˆ�éˆ’éˆ“éˆ–éˆ˜éˆœéˆ�éˆ£éˆ¤éˆ¥éˆ¦éˆ¨éˆ®éˆ¯éˆ°éˆ³éˆµéˆ¶éˆ¸éˆ¹éˆºéˆ¼éˆ¾é‰€é‰‚é‰ƒé‰†é‰‡é‰Šé‰�é‰Žé‰�é‰‘é‰˜é‰™é‰œé‰�é‰ é‰¡é‰¥é‰§é‰¨é‰©é‰®é‰¯é‰°é‰µ",4,"é‰»é‰¼é‰½é‰¿éŠˆéŠ‰éŠŠéŠ�éŠŽéŠ’éŠ—"],
["8fe4a1","éŠ™éŠŸéŠ éŠ¤éŠ¥éŠ§éŠ¨éŠ«éŠ¯éŠ²éŠ¶éŠ¸éŠºéŠ»éŠ¼éŠ½éŠ¿",4,"é‹…é‹†é‹‡é‹ˆé‹‹é‹Œé‹�é‹Žé‹�é‹“é‹•é‹—é‹˜é‹™é‹œé‹�é‹Ÿé‹ é‹¡é‹£é‹¥é‹§é‹¨é‹¬é‹®é‹°é‹¹é‹»é‹¿éŒ€éŒ‚éŒˆéŒ�éŒ‘éŒ”éŒ•éŒœéŒ�éŒžéŒŸéŒ¡éŒ¤éŒ¥éŒ§éŒ©éŒªéŒ³éŒ´éŒ¶éŒ·é�‡é�ˆé�‰é��é�‘é�’é�•é�—é�˜é�šé�žé�¤é�¥é�§é�©é�ªé�­é�¯é�°é�±é�³é�´é�¶"],
["8fe5a1","é�ºé�½é�¿éŽ€éŽ�éŽ‚éŽˆéŽŠéŽ‹éŽ�éŽ�éŽ’éŽ•éŽ˜éŽ›éŽžéŽ¡éŽ£éŽ¤éŽ¦éŽ¨éŽ«éŽ´éŽµéŽ¶éŽºéŽ©é��é�„é�…é�†é�‡é�‰",4,"é�“é�™é�œé�žé�Ÿé�¢é�¦é�§é�¹é�·é�¸é�ºé�»é�½é��é�‚é�„é�ˆé�‰é��é�Žé��é�•é�–é�—é�Ÿé�®é�¯é�±é�²é�³é�´é�»é�¿é�½é‘ƒé‘…é‘ˆé‘Šé‘Œé‘•é‘™é‘œé‘Ÿé‘¡é‘£é‘¨é‘«é‘­é‘®é‘¯é‘±é‘²é’„é’ƒé•¸é•¹"],
["8fe6a1","é•¾é–„é–ˆé–Œé–�é–Žé–�é–žé–Ÿé–¡é–¦é–©é–«é–¬é–´é–¶é–ºé–½é–¿é—†é—ˆé—‰é—‹é—�é—‘é—’é—“é—™é—šé—�é—žé—Ÿé— é—¤é—¦é˜�é˜žé˜¢é˜¤é˜¥é˜¦é˜¬é˜±é˜³é˜·é˜¸é˜¹é˜ºé˜¼é˜½é™�é™’é™”é™–é™—é™˜é™¡é™®é™´é™»é™¼é™¾é™¿éš�éš‚éšƒéš„éš‰éš‘éš–éššéš�éšŸéš¤éš¥éš¦éš©éš®éš¯éš³éšºé›Šé›’å¶²é›˜é›šé›�é›žé›Ÿé›©é›¯é›±é›ºéœ‚"],
["8fe7a1","éœƒéœ…éœ‰éœšéœ›éœ�éœ¡éœ¢éœ£éœ¨éœ±éœ³é��é�ƒé�Šé�Žé��é�•é�—é�˜é�šé�›é�£é�§é�ªé�®é�³é�¶é�·é�¸é�»é�½é�¿éž€éž‰éž•éž–éž—éž™éžšéžžéžŸéž¢éž¬éž®éž±éž²éžµéž¶éž¸éž¹éžºéž¼éž¾éž¿éŸ�éŸ„éŸ…éŸ‡éŸ‰éŸŠéŸŒéŸ�éŸŽéŸ�éŸ‘éŸ”éŸ—éŸ˜éŸ™éŸ�éŸžéŸ éŸ›éŸ¡éŸ¤éŸ¯éŸ±éŸ´éŸ·éŸ¸éŸºé ‡é Šé ™é �é Žé ”é –é œé žé  é £é ¦"],
["8fe8a1","é «é ®é ¯é °é ²é ³é µé ¥é ¾é¡„é¡‡é¡Šé¡‘é¡’é¡“é¡–é¡—é¡™é¡šé¡¢é¡£é¡¥é¡¦é¡ªé¡¬é¢«é¢­é¢®é¢°é¢´é¢·é¢¸é¢ºé¢»é¢¿é£‚é£…é£ˆé£Œé£¡é££é£¥é£¦é£§é£ªé£³é£¶é¤‚é¤‡é¤ˆé¤‘é¤•é¤–é¤—é¤šé¤›é¤œé¤Ÿé¤¢é¤¦é¤§é¤«é¤±",4,"é¤¹é¤ºé¤»é¤¼é¥€é¥�é¥†é¥‡é¥ˆé¥�é¥Žé¥”é¥˜é¥™é¥›é¥œé¥žé¥Ÿé¥ é¦›é¦�é¦Ÿé¦¦é¦°é¦±é¦²é¦µ"],
["8fe9a1","é¦¹é¦ºé¦½é¦¿é§ƒé§‰é§“é§”é§™é§šé§œé§žé§§é§ªé§«é§¬é§°é§´é§µé§¹é§½é§¾é¨‚é¨ƒé¨„é¨‹é¨Œé¨�é¨‘é¨–é¨žé¨ é¨¢é¨£é¨¤é¨§é¨­é¨®é¨³é¨µé¨¶é¨¸é©‡é©�é©„é©Šé©‹é©Œé©Žé©‘é©”é©–é©�éªªéª¬éª®éª¯éª²éª´éªµéª¶éª¹éª»éª¾éª¿é«�é«ƒé«†é«ˆé«Žé«�é«’é«•é«–é«—é«›é«œé« é«¤é«¥é«§é«©é«¬é«²é«³é«µé«¹é«ºé«½é«¿",4],
["8feaa1","é¬„é¬…é¬ˆé¬‰é¬‹é¬Œé¬�é¬Žé¬�é¬’é¬–é¬™é¬›é¬œé¬ é¬¦é¬«é¬­é¬³é¬´é¬µé¬·é¬¹é¬ºé¬½é­ˆé­‹é­Œé­•é­–é­—é­›é­žé­¡é­£é­¥é­¦é­¨é­ª",4,"é­³é­µé­·é­¸é­¹é­¿é®€é®„é®…é®†é®‡é®‰é®Šé®‹é®�é®�é®�é®”é®šé®�é®žé®¦é®§é®©é®¬é®°é®±é®²é®·é®¸é®»é®¼é®¾é®¿é¯�é¯‡é¯ˆé¯Žé¯�é¯—é¯˜é¯�é¯Ÿé¯¥é¯§é¯ªé¯«é¯¯é¯³é¯·é¯¸"],
["8feba1","é¯¹é¯ºé¯½é¯¿é°€é°‚é°‹é°�é°‘é°–é°˜é°™é°šé°œé°žé°¢é°£é°¦",4,"é°±é°µé°¶é°·é°½é±�é±ƒé±„é±…é±‰é±Šé±Žé±�é±�é±“é±”é±–é±˜é±›é±�é±žé±Ÿé±£é±©é±ªé±œé±«é±¨é±®é±°é±²é±µé±·é±»é³¦é³²é³·é³¹é´‹é´‚é´‘é´—é´˜é´œé´�é´žé´¯é´°é´²é´³é´´é´ºé´¼éµ…é´½éµ‚éµƒéµ‡éµŠéµ“éµ”éµŸéµ£éµ¢éµ¥éµ©éµªéµ«éµ°éµ¶éµ·éµ»"],
["8feca1","éµ¼éµ¾é¶ƒé¶„é¶†é¶Šé¶�é¶Žé¶’é¶“é¶•é¶–é¶—é¶˜é¶¡é¶ªé¶¬é¶®é¶±é¶µé¶¹é¶¼é¶¿é·ƒé·‡é·‰é·Šé·”é·•é·–é·—é·šé·žé·Ÿé· é·¥é·§é·©é·«é·®é·°é·³é·´é·¾é¸Šé¸‚é¸‡é¸Žé¸�é¸‘é¸’é¸•é¸–é¸™é¸œé¸�é¹ºé¹»é¹¼éº€éº‚éºƒéº„éº…éº‡éºŽéº�éº–éº˜éº›éºžéº¤éº¨éº¬éº®éº¯éº°éº³éº´éºµé»†é»ˆé»‹é»•é»Ÿé»¤é»§é»¬é»­é»®é»°é»±é»²é»µ"],
["8feda1","é»¸é»¿é¼‚é¼ƒé¼‰é¼�é¼�é¼‘é¼’é¼”é¼–é¼—é¼™é¼šé¼›é¼Ÿé¼¢é¼¦é¼ªé¼«é¼¯é¼±é¼²é¼´é¼·é¼¹é¼ºé¼¼é¼½é¼¿é½�é½ƒ",4,"é½“é½•é½–é½—é½˜é½šé½�é½žé½¨é½©é½­",4,"é½³é½µé½ºé½½é¾�é¾�é¾‘é¾’é¾”é¾–é¾—é¾žé¾¡é¾¢é¾£é¾¥"]
]
{"uChars":[128,165,169,178,184,216,226,235,238,244,248,251,253,258,276,284,300,325,329,334,364,463,465,467,469,471,473,475,477,506,594,610,712,716,730,930,938,962,970,1026,1104,1106,8209,8215,8218,8222,8231,8241,8244,8246,8252,8365,8452,8454,8458,8471,8482,8556,8570,8596,8602,8713,8720,8722,8726,8731,8737,8740,8742,8748,8751,8760,8766,8777,8781,8787,8802,8808,8816,8854,8858,8870,8896,8979,9322,9372,9548,9588,9616,9622,9634,9652,9662,9672,9676,9680,9702,9735,9738,9793,9795,11906,11909,11913,11917,11928,11944,11947,11951,11956,11960,11964,11979,12284,12292,12312,12319,12330,12351,12436,12447,12535,12543,12586,12842,12850,12964,13200,13215,13218,13253,13263,13267,13270,13384,13428,13727,13839,13851,14617,14703,14801,14816,14964,15183,15471,15585,16471,16736,17208,17325,17330,17374,17623,17997,18018,18212,18218,18301,18318,18760,18811,18814,18820,18823,18844,18848,18872,19576,19620,19738,19887,40870,59244,59336,59367,59413,59417,59423,59431,59437,59443,59452,59460,59478,59493,63789,63866,63894,63976,63986,64016,64018,64021,64025,64034,64037,64042,65074,65093,65107,65112,65127,65132,65375,65510,65536],"gbChars":[0,36,38,45,50,81,89,95,96,100,103,104,105,109,126,133,148,172,175,179,208,306,307,308,309,310,311,312,313,341,428,443,544,545,558,741,742,749,750,805,819,820,7922,7924,7925,7927,7934,7943,7944,7945,7950,8062,8148,8149,8152,8164,8174,8236,8240,8262,8264,8374,8380,8381,8384,8388,8390,8392,8393,8394,8396,8401,8406,8416,8419,8424,8437,8439,8445,8482,8485,8496,8521,8603,8936,8946,9046,9050,9063,9066,9076,9092,9100,9108,9111,9113,9131,9162,9164,9218,9219,11329,11331,11334,11336,11346,11361,11363,11366,11370,11372,11375,11389,11682,11686,11687,11692,11694,11714,11716,11723,11725,11730,11736,11982,11989,12102,12336,12348,12350,12384,12393,12395,12397,12510,12553,12851,12962,12973,13738,13823,13919,13933,14080,14298,14585,14698,15583,15847,16318,16434,16438,16481,16729,17102,17122,17315,17320,17402,17418,17859,17909,17911,17915,17916,17936,17939,17961,18664,18703,18814,18962,19043,33469,33470,33471,33484,33485,33490,33497,33501,33505,33513,33520,33536,33550,37845,37921,37948,38029,38038,38064,38065,38066,38069,38075,38076,38078,39108,39109,39113,39114,39115,39116,39265,39394,189000]}[
["a140","î“†",62],
["a180","î”…",32],
["a240","î”¦",62],
["a280","î•¥",32],
["a2ab","î�¦",5],
["a2e3","â‚¬î�­"],
["a2ef","î�®î�¯"],
["a2fd","î�°î�±"],
["a340","î–†",62],
["a380","î—…",31,"ã€€"],
["a440","î—¦",62],
["a480","î˜¥",32],
["a4f4","î�²",10],
["a540","î™†",62],
["a580","îš…",32],
["a5f7","î�½",7],
["a640","îš¦",62],
["a680","î›¥",32],
["a6b9","îž…",7],
["a6d9","îž�",6],
["a6ec","îž”îž•"],
["a6f3","îž–"],
["a6f6","îž—",8],
["a740","îœ†",62],
["a780","î�…",32],
["a7c2","îž ",14],
["a7f2","îž¯",12],
["a896","îž¼",10],
["a8bc","îŸ‡"],
["a8bf","Ç¹"],
["a8c1","îŸ‰îŸŠîŸ‹îŸŒ"],
["a8ea","îŸ�",20],
["a958","îŸ¢"],
["a95b","îŸ£"],
["a95d","îŸ¤îŸ¥îŸ¦"],
["a989","ã€¾â¿°",11],
["a997","îŸ´",12],
["a9f0","î �",14],
["aaa1","î€€",93],
["aba1","î�ž",93],
["aca1","î‚¼",93],
["ada1","î„š",93],
["aea1","î…¸",93],
["afa1","î‡–",93],
["d7fa","î �",4],
["f8a1","îˆ´",93],
["f9a1","îŠ’",93],
["faa1","î‹°",93],
["fba1","î�Ž",93],
["fca1","îŽ¬",93],
["fda1","î�Š",93],
["fe50","âº�î –î —î ˜âº„ã‘³ã‘‡âºˆâº‹î žã–žã˜šã˜ŽâºŒâº—ã¥®ã¤˜î ¦ã§�ã§Ÿã©³ã§�î «î ¬ã­Žã±®ã³ âº§î ±î ²âºªä�–ä…Ÿâº®äŒ·âº³âº¶âº·î »äŽ±äŽ¬âº»ä��ä“–ä™¡ä™Œî¡ƒ"],
["fe80","äœ£äœ©ä�¼äž�â»Šä¥‡ä¥ºä¥½ä¦‚ä¦ƒä¦…ä¦†ä¦Ÿä¦›ä¦·ä¦¶î¡”î¡•ä²£ä²Ÿä² ä²¡ä±·ä²¢ä´“",6,"ä¶®î¡¤î‘¨",93]
]
[
["0","\u0000",128],
["a1","ï½¡",62],
["8140","ã€€ã€�ã€‚ï¼Œï¼Žãƒ»ï¼šï¼›ï¼Ÿï¼�ã‚›ã‚œÂ´ï½€Â¨ï¼¾ï¿£ï¼¿ãƒ½ãƒ¾ã‚�ã‚žã€ƒä»�ã€…ã€†ã€‡ãƒ¼â€•â€�ï¼�ï¼¼ï½žâˆ¥ï½œâ€¦â€¥â€˜â€™â€œâ€�ï¼ˆï¼‰ã€”ã€•ï¼»ï¼½ï½›ï½�ã€ˆ",9,"ï¼‹ï¼�Â±Ã—"],
["8180","Ã·ï¼�â‰ ï¼œï¼žâ‰¦â‰§âˆžâˆ´â™‚â™€Â°â€²â€³â„ƒï¿¥ï¼„ï¿ ï¿¡ï¼…ï¼ƒï¼†ï¼Šï¼ Â§â˜†â˜…â—‹â—�â—Žâ—‡â—†â–¡â– â–³â–²â–½â–¼â€»ã€’â†’â†�â†‘â†“ã€“"],
["81b8","âˆˆâˆ‹âŠ†âŠ‡âŠ‚âŠƒâˆªâˆ©"],
["81c8","âˆ§âˆ¨ï¿¢â‡’â‡”âˆ€âˆƒ"],
["81da","âˆ âŠ¥âŒ’âˆ‚âˆ‡â‰¡â‰’â‰ªâ‰«âˆšâˆ½âˆ�âˆµâˆ«âˆ¬"],
["81f0","â„«â€°â™¯â™­â™ªâ€ â€¡Â¶"],
["81fc","â—¯"],
["824f","ï¼�",9],
["8260","ï¼¡",25],
["8281","ï½�",25],
["829f","ã��",82],
["8340","ã‚¡",62],
["8380","ãƒ ",22],
["839f","Î‘",16,"Î£",6],
["83bf","Î±",16,"Ïƒ",6],
["8440","Ð�",5,"Ð�Ð–",25],
["8470","Ð°",5,"Ñ‘Ð¶",7],
["8480","Ð¾",17],
["849f","â”€â”‚â”Œâ”�â”˜â””â”œâ”¬â”¤â”´â”¼â”�â”ƒâ”�â”“â”›â”—â”£â”³â”«â”»â•‹â” â”¯â”¨â”·â”¿â”�â”°â”¥â”¸â•‚"],
["8740","â‘ ",19,"â… ",9],
["875f","ã�‰ãŒ”ãŒ¢ã��ãŒ˜ãŒ§ãŒƒãŒ¶ã�‘ã�—ãŒ�ãŒ¦ãŒ£ãŒ«ã�ŠãŒ»ãŽœãŽ�ãŽžãŽŽãŽ�ã�„ãŽ¡"],
["877e","ã�»"],
["8780","ã€�ã€Ÿâ„–ã��â„¡ãŠ¤",4,"ãˆ±ãˆ²ãˆ¹ã�¾ã�½ã�¼â‰’â‰¡âˆ«âˆ®âˆ‘âˆšâŠ¥âˆ âˆŸâŠ¿âˆµâˆ©âˆª"],
["889f","äºœå”–å¨ƒé˜¿å“€æ„›æŒ¨å§¶é€¢è‘µèŒœç©�æ‚ªæ�¡æ¸¥æ—­è‘¦èŠ¦é¯µæ¢“åœ§æ–¡æ‰±å®›å§�è™»é£´çµ¢ç¶¾é®Žæˆ–ç²Ÿè¢·å®‰åºµæŒ‰æš—æ¡ˆé—‡éž�æ��ä»¥ä¼Šä½�ä¾�å�‰å›²å¤·å§”å¨�å°‰æƒŸæ„�æ…°æ˜“æ¤…ç‚ºç•�ç•°ç§»ç¶­ç·¯èƒƒè�Žè¡£è¬‚é�•é�ºåŒ»äº•äº¥åŸŸè‚²éƒ�ç£¯ä¸€å£±æº¢é€¸ç¨²èŒ¨èŠ‹é°¯å…�å�°å’½å“¡å› å§»å¼•é£²æ·«èƒ¤è”­"],
["8940","é™¢é™°éš éŸ»å�‹å�³å®‡çƒ�ç¾½è¿‚é›¨å�¯éµœçªºä¸‘ç¢“è‡¼æ¸¦å˜˜å”„æ¬�è”šé°»å§¥åŽ©æµ¦ç“œé–�å™‚äº‘é�‹é›²è��é¤Œå�¡å–¶å¬°å½±æ˜ æ›³æ „æ°¸æ³³æ´©ç‘›ç›ˆç©Žé ´è‹±è¡›è© é‹­æ¶²ç–«ç›Šé§…æ‚¦è¬�è¶Šé–²æ¦ŽåŽ­å††"],
["8980","åœ’å °å¥„å®´å»¶æ€¨æŽ©æ�´æ²¿æ¼”ç‚Žç„”ç…™ç‡•çŒ¿ç¸�è‰¶è‹‘è–—é� é‰›é´›å¡©æ–¼æ±šç”¥å‡¹å¤®å¥¥å¾€å¿œæŠ¼æ—ºæ¨ªæ¬§æ®´çŽ‹ç¿�è¥–é´¬é´Žé»„å²¡æ²–è�»å„„å±‹æ†¶è‡†æ¡¶ç‰¡ä¹™ä¿ºå�¸æ�©æ¸©ç©�éŸ³ä¸‹åŒ–ä»®ä½•ä¼½ä¾¡ä½³åŠ å�¯å˜‰å¤�å«�å®¶å¯¡ç§‘æš‡æžœæž¶æ­Œæ²³ç�«ç�‚ç¦�ç¦¾ç¨¼ç®‡èŠ±è‹›èŒ„è�·è�¯è�“è�¦èª²å˜©è²¨è¿¦é�ŽéœžèšŠä¿„å³¨æˆ‘ç‰™ç”»è‡¥èŠ½è›¾è³€é›…é¤“é§•ä»‹ä¼šè§£å›žå¡Šå£Šå»»å¿«æ€ªæ‚”æ�¢æ‡�æˆ’æ‹�æ”¹"],
["8a40","é­�æ™¦æ¢°æµ·ç�°ç•Œçš†çµµèŠ¥èŸ¹é–‹éšŽè²�å‡±åŠ¾å¤–å’³å®³å´–æ…¨æ¦‚æ¶¯ç¢�è“‹è¡—è©²éŽ§éª¸æµ¬é¦¨è›™åž£æŸ¿è›ŽéˆŽåŠƒåš‡å�„å»“æ‹¡æ’¹æ ¼æ ¸æ®»ç�²ç¢ºç©«è¦šè§’èµ«è¼ƒéƒ­é–£éš”é�©å­¦å²³æ¥½é¡�é¡ŽæŽ›ç¬ æ¨«"],
["8a80","æ©¿æ¢¶é°�æ½Ÿå‰²å–�æ�°æ‹¬æ´»æ¸‡æ»‘è‘›è¤�è½„ä¸”é°¹å�¶æ¤›æ¨ºéž„æ ªå…œç«ƒè’²é‡œéŽŒå™›é´¨æ ¢èŒ…è�±ç²¥åˆˆè‹…ç“¦ä¹¾ä¾ƒå† å¯’åˆŠå‹˜å‹§å·»å–šå ªå§¦å®Œå®˜å¯›å¹²å¹¹æ‚£æ„Ÿæ…£æ†¾æ�›æ•¢æŸ‘æ¡“æ£ºæ¬¾æ­“æ±—æ¼¢æ¾—æ½…ç’°ç”˜ç›£çœ‹ç«¿ç®¡ç°¡ç·©ç¼¶ç¿°è‚�è‰¦èŽžè¦³è«Œè²«é‚„é‘‘é–“é–‘é–¢é™¥éŸ“é¤¨èˆ˜ä¸¸å�«å²¸å·ŒçŽ©ç™Œçœ¼å²©ç¿«è´‹é›�é ‘é¡”é¡˜ä¼�ä¼Žå�±å–œå™¨åŸºå¥‡å¬‰å¯„å²�å¸Œå¹¾å¿Œæ�®æœºæ——æ—¢æœŸæ£‹æ£„"],
["8b40","æ©Ÿå¸°æ¯…æ°—æ±½ç•¿ç¥ˆå­£ç¨€ç´€å¾½è¦�è¨˜è²´èµ·è»Œè¼�é£¢é¨Žé¬¼äº€å�½å„€å¦“å®œæˆ¯æŠ€æ“¬æ¬ºçŠ ç–‘ç¥‡ç¾©èŸ»èª¼è­°æŽ¬è�Šéž å�‰å�ƒå–«æ¡”æ©˜è©°ç §æ�µé»�å�´å®¢è„šè™�é€†ä¸˜ä¹…ä»‡ä¼‘å�Šå�¸å®®å¼“æ€¥æ•‘"],
["8b80","æœ½æ±‚æ±²æ³£ç�¸ç�ƒç©¶çª®ç¬ˆç´šç³¾çµ¦æ—§ç‰›åŽ»å±…å·¨æ‹’æ‹ æŒ™æ¸ è™šè¨±è·�é‹¸æ¼�ç¦¦é­šäº¨äº«äº¬ä¾›ä¾ åƒ‘å…‡ç«¶å…±å‡¶å�”åŒ¡å�¿å�«å–¬å¢ƒå³¡å¼·å½Šæ€¯æ��æ�­æŒŸæ•™æ©‹æ³�ç‹‚ç‹­çŸ¯èƒ¸è„…èˆˆè•Žéƒ·é�¡éŸ¿é¥—é©šä»°å‡�å°­æš�æ¥­å±€æ›²æ¥µçŽ‰æ¡�ç²�åƒ…å‹¤å�‡å·¾éŒ¦æ–¤æ¬£æ¬½ç�´ç¦�ç¦½ç­‹ç·ŠèŠ¹è�Œè¡¿è¥Ÿè¬¹è¿‘é‡‘å�ŸéŠ€ä¹�å€¶å�¥åŒºç‹—çŽ–çŸ©è‹¦èº¯é§†é§ˆé§’å…·æ„šè™žå–°ç©ºå�¶å¯“é�‡éš…ä¸²æ«›é‡§å±‘å±ˆ"],
["8c40","æŽ˜çªŸæ²“é�´è½¡çªªç†Šéšˆç²‚æ —ç¹°æ¡‘é�¬å‹²å�›è–«è¨“ç¾¤è»�éƒ¡å�¦è¢ˆç¥�ä¿‚å‚¾åˆ‘å…„å•“åœ­ç�ªåž‹å¥‘å½¢å¾„æ�µæ…¶æ…§æ†©æŽ²æ�ºæ•¬æ™¯æ¡‚æ¸“ç•¦ç¨½ç³»çµŒç¶™ç¹‹ç½«èŒŽè�Šè›�è¨ˆè©£è­¦è»½é šé¶�èŠ¸è¿Žé¯¨"],
["8c80","åŠ‡æˆŸæ’ƒæ¿€éš™æ¡�å‚‘æ¬ æ±ºæ½”ç©´çµ�è¡€è¨£æœˆä»¶å€¹å€¦å�¥å…¼åˆ¸å‰£å–§åœ�å …å«Œå»ºæ†²æ‡¸æ‹³æ�²æ¤œæ¨©ç‰½çŠ¬çŒ®ç ”ç¡¯çµ¹çœŒè‚©è¦‹è¬™è³¢è»’é�£é�µé™ºé¡•é¨“é¹¸å…ƒåŽŸåŽ³å¹»å¼¦æ¸›æº�çŽ„ç�¾çµƒèˆ·è¨€è«ºé™�ä¹Žå€‹å�¤å‘¼å›ºå§‘å­¤å·±åº«å¼§æˆ¸æ•…æž¯æ¹–ç‹�ç³Šè¢´è‚¡èƒ¡è�°è™Žèª‡è·¨éˆ·é›‡é¡§é¼“äº”äº’ä¼�å�ˆå‘‰å�¾å¨¯å¾Œå¾¡æ‚Ÿæ¢§æªŽç‘šç¢�èªžèª¤è­·é†�ä¹žé¯‰äº¤ä½¼ä¾¯å€™å€–å…‰å…¬åŠŸåŠ¹å‹¾åŽšå�£å�‘"],
["8d40","å�Žå–‰å�‘åž¢å¥½å­”å­�å®�å·¥å·§å··å¹¸åºƒåºšåº·å¼˜æ�’æ…ŒæŠ—æ‹˜æŽ§æ”»æ˜‚æ™ƒæ›´æ�­æ ¡æ¢—æ§‹æ±Ÿæ´ªæµ©æ¸¯æº�ç”²çš‡ç¡¬ç¨¿ç³ ç´…ç´˜çµžç¶±è€•è€ƒè‚¯è‚±è…”è†�èˆªè�’è¡Œè¡¡è¬›è²¢è³¼éƒŠé…µé‰±ç ¿é‹¼é–¤é™�"],
["8d80","é …é¦™é«˜é´»å‰›åŠ«å�·å�ˆå£•æ‹·æ¿ è±ªè½Ÿéº¹å…‹åˆ»å‘Šå›½ç©€é…·éµ é»’ç�„æ¼‰è…°ç”‘å¿½æƒšéª¨ç‹›è¾¼æ­¤é ƒä»Šå›°å�¤å¢¾å©šæ�¨æ‡‡æ˜�æ˜†æ ¹æ¢±æ··ç—•ç´ºè‰®é­‚äº›ä½�å�‰å”†åµ¯å·¦å·®æŸ»æ²™ç‘³ç ‚è©�éŽ–è£Ÿå��åº§æŒ«å‚µå‚¬å†�æœ€å“‰å¡žå¦»å®°å½©æ‰�æŽ¡æ ½æ­³æ¸ˆç�½é‡‡çŠ€ç •ç ¦ç¥­æ–Žç´°è�œè£�è¼‰éš›å‰¤åœ¨æ��ç½ªè²¡å†´å�‚é˜ªå ºæ¦Šè‚´å’²å´ŽåŸ¼ç¢•é·ºä½œå‰Šå’‹æ�¾æ˜¨æœ”æŸµçª„ç­–ç´¢éŒ¯æ¡œé®­ç¬¹åŒ™å†Šåˆ·"],
["8e40","å¯Ÿæ‹¶æ’®æ“¦æœ­æ®ºè–©é›‘çš�é¯–æ�ŒéŒ†é®«çš¿æ™’ä¸‰å‚˜å�‚å±±æƒ¨æ’’æ•£æ¡Ÿç‡¦ç�Šç”£ç®—çº‚èš•è®ƒè³›é…¸é¤�æ–¬æš«æ®‹ä»•ä»”ä¼ºä½¿åˆºå�¸å�²å—£å››å£«å§‹å§‰å§¿å­�å±�å¸‚å¸«å¿—æ€�æŒ‡æ”¯å­œæ–¯æ–½æ—¨æž�æ­¢"],
["8e80","æ­»æ°�ç�…ç¥‰ç§�ç³¸ç´™ç´«è‚¢è„‚è‡³è¦–è©žè©©è©¦èªŒè«®è³‡è³œé›Œé£¼æ­¯äº‹ä¼¼ä¾�å…�å­—å¯ºæ…ˆæŒ�æ™‚æ¬¡æ»‹æ²»çˆ¾ç’½ç—”ç£�ç¤ºè€Œè€³è‡ªè’”è¾žæ±�é¹¿å¼�è­˜é´«ç«ºè»¸å®�é›«ä¸ƒå�±åŸ·å¤±å«‰å®¤æ‚‰æ¹¿æ¼†ç–¾è³ªå®Ÿè”€ç¯ å�²æŸ´èŠ�å±¡è•Šç¸žèˆŽå†™å°„æ�¨èµ¦æ–œç…®ç¤¾ç´—è€…è¬�è»Šé�®è›‡é‚ªå€Ÿå‹ºå°ºæ�“ç�¼çˆµé…Œé‡ˆéŒ«è‹¥å¯‚å¼±æƒ¹ä¸»å�–å®ˆæ‰‹æœ±æ®Šç‹©ç� ç¨®è…«è¶£é…’é¦–å„’å�—å‘ªå¯¿æŽˆæ¨¹ç¶¬éœ€å›šå�Žå‘¨"],
["8f40","å®—å°±å·žä¿®æ„�æ‹¾æ´²ç§€ç§‹çµ‚ç¹�ç¿’è‡­èˆŸè’�è¡†è¥²è®�è¹´è¼¯é€±é…‹é…¬é›†é†œä»€ä½�å……å��å¾“æˆŽæŸ”æ±�æ¸‹ç�£ç¸¦é‡�éŠƒå�”å¤™å®¿æ·‘ç¥�ç¸®ç²›å¡¾ç†Ÿå‡ºè¡“è¿°ä¿Šå³»æ˜¥çž¬ç«£èˆœé§¿å‡†å¾ªæ—¬æ¥¯æ®‰æ·³"],
["8f80","æº–æ½¤ç›¾ç´”å·¡é�µé†‡é †å‡¦åˆ�æ‰€æš‘æ›™æ¸šåº¶ç·’ç½²æ›¸è–¯è—·è«¸åŠ©å�™å¥³åº�å¾�æ�•é‹¤é™¤å‚·å„Ÿå‹�åŒ å�‡å�¬å“¨å•†å”±å˜—å¥¨å¦¾å¨¼å®µå°†å°�å°‘å°šåº„åºŠå» å½°æ‰¿æŠ„æ‹›æŽŒæ�·æ˜‡æ˜Œæ˜­æ™¶æ�¾æ¢¢æ¨Ÿæ¨µæ²¼æ¶ˆæ¸‰æ¹˜ç„¼ç„¦ç…§ç—‡çœ�ç¡�ç¤�ç¥¥ç§°ç« ç¬‘ç²§ç´¹è‚–è�–è’‹è•‰è¡�è£³è¨Ÿè¨¼è©”è©³è±¡è³žé†¤é‰¦é�¾é�˜éšœéž˜ä¸Šä¸ˆä¸žä¹—å†—å‰°åŸŽå ´å£Œå¬¢å¸¸æƒ…æ“¾æ�¡æ�–æµ„çŠ¶ç•³ç©£è’¸è­²é†¸éŒ å˜±åŸ´é£¾"],
["9040","æ‹­æ¤�æ®–ç‡­ç¹”è�·è‰²è§¦é£Ÿè�•è¾±å°»ä¼¸ä¿¡ä¾µå”‡å¨ å¯�å¯©å¿ƒæ…ŽæŒ¯æ–°æ™‹æ£®æ¦›æµ¸æ·±ç”³ç–¹çœŸç¥žç§¦ç´³è‡£èŠ¯è–ªè¦ªè¨ºèº«è¾›é€²é‡�éœ‡äººä»�åˆƒå¡µå£¬å°‹ç”šå°½è…Žè¨Šè¿…é™£é�­ç¬¥è«�é ˆé…¢å›³åŽ¨"],
["9080","é€—å�¹åž‚å¸¥æŽ¨æ°´ç‚Šç�¡ç²‹ç¿ è¡°é�‚é…”éŒ�éŒ˜éš�ç‘žé«„å´‡åµ©æ•°æž¢è¶¨é››æ�®æ�‰æ¤™è�…é —é›€è£¾æ¾„æ‘ºå¯¸ä¸–ç€¬ç•�æ˜¯å‡„åˆ¶å‹¢å§“å¾�æ€§æˆ�æ”¿æ•´æ˜Ÿæ™´æ£²æ –æ­£æ¸…ç‰²ç”Ÿç››ç²¾è�–å£°è£½è¥¿èª èª“è«‹é€�é†’é�’é�™æ–‰ç¨Žè„†éš»å¸­æƒœæˆšæ–¥æ˜”æž�çŸ³ç©�ç±�ç¸¾è„Šè²¬èµ¤è·¡è¹Ÿç¢©åˆ‡æ‹™æŽ¥æ‘‚æŠ˜è¨­çªƒç¯€èª¬é›ªçµ¶èˆŒè�‰ä»™å…ˆå�ƒå� å®£å°‚å°–å·�æˆ¦æ‰‡æ’°æ “æ ´æ³‰æµ…æ´—æŸ“æ½œç…Žç…½æ—‹ç©¿ç®­ç·š"],
["9140","ç¹Šç¾¨è…ºèˆ›èˆ¹è–¦è©®è³Žè·µé�¸é�·éŠ­éŠ‘é–ƒé®®å‰�å–„æ¼¸ç„¶å…¨ç¦…ç¹•è†³ç³Žå™Œå¡‘å²¨æŽªæ›¾æ›½æ¥šç‹™ç–�ç–Žç¤Žç¥–ç§Ÿç²—ç´ çµ„è˜‡è¨´é˜»é�¡é¼ åƒ§å‰µå�Œå�¢å€‰å–ªå£®å¥�çˆ½å®‹å±¤åŒ�æƒ£æƒ³æ�œæŽƒæŒ¿æŽ»"],
["9180","æ“�æ—©æ›¹å·£æ§�æ§½æ¼•ç‡¥äº‰ç—©ç›¸çª“ç³Ÿç·�ç¶œè�¡è�‰è�˜è‘¬è’¼è—»è£…èµ°é€�é�­éŽ—éœœé¨’åƒ�å¢—æ†Žè‡“è”µè´ˆé€ ä¿ƒå�´å‰‡å�³æ�¯æ�‰æ�Ÿæ¸¬è¶³é€Ÿä¿—å±žè³Šæ—�ç¶šå�’è¢–å…¶æ�ƒå­˜å­«å°Šæ��æ�‘é�œä»–å¤šå¤ªæ±°è©‘å”¾å •å¦¥æƒ°æ‰“æŸ�èˆµæ¥•é™€é§„é¨¨ä½“å †å¯¾è€�å²±å¸¯å¾…æ€ æ…‹æˆ´æ›¿æ³°æ»žèƒŽè…¿è‹”è¢‹è²¸é€€é€®éšŠé»›é¯›ä»£å�°å¤§ç¬¬é†�é¡Œé·¹æ»�ç€§å�“å•„å®…æ‰˜æŠžæ‹“æ²¢æ¿¯ç�¢è¨—é�¸æ¿�è«¾èŒ¸å‡§è›¸å�ª"],
["9240","å�©ä½†é�”è¾°å¥ªè„±å·½ç«ªè¾¿æ£šè°·ç‹¸é±ˆæ¨½èª°ä¸¹å�˜å˜†å�¦æ‹…æŽ¢æ—¦æ­Žæ·¡æ¹›ç‚­çŸ­ç«¯ç®ªç¶»è€½èƒ†è›‹èª•é�›å›£å£‡å¼¾æ–­æš–æª€æ®µç”·è«‡å€¤çŸ¥åœ°å¼›æ�¥æ™ºæ± ç—´ç¨šç½®è‡´èœ˜é�…é¦³ç¯‰ç•œç«¹ç­‘è“„"],
["9280","é€�ç§©çª’èŒ¶å«¡ç�€ä¸­ä»²å®™å¿ æŠ½æ˜¼æŸ±æ³¨è™«è¡·è¨»é…Žé‹³é§�æ¨—ç€¦çŒªè‹§è‘—è²¯ä¸�å…†å‡‹å–‹å¯µå¸–å¸³åº�å¼”å¼µå½«å¾´æ‡²æŒ‘æš¢æœ�æ½®ç‰’ç”ºçœºè�´è„¹è…¸è�¶èª¿è«œè¶…è·³éŠšé•·é ‚é³¥å‹…æ�—ç›´æœ•æ²ˆç��è³ƒéŽ®é™³æ´¥å¢œæ¤Žæ§Œè¿½éŽšç—›é€šå¡šæ ‚æŽ´æ§»ä½ƒæ¼¬æŸ˜è¾»è”¦ç¶´é�”æ¤¿æ½°å�ªå£·å¬¬ç´¬çˆªå�Šé‡£é¶´äº­ä½Žå�œå�µå‰ƒè²žå‘ˆå ¤å®šå¸�åº•åº­å»·å¼Ÿæ‚ŒæŠµæŒºæ��æ¢¯æ±€ç¢‡ç¦Žç¨‹ç· è‰‡è¨‚è«¦è¹„é€“"],
["9340","é‚¸é„­é‡˜é¼Žæ³¥æ‘˜æ“¢æ•µæ»´çš„ç¬›é�©é�‘æººå“²å¾¹æ’¤è½�è¿­é‰„å…¸å¡«å¤©å±•åº—æ·»çº�ç”œè²¼è»¢é¡›ç‚¹ä¼�æ®¿æ¾±ç”°é›»å…Žå��å µå¡—å¦¬å± å¾’æ–—æ�œæ¸¡ç™»è�Ÿè³­é€”éƒ½é��ç ¥ç ºåŠªåº¦åœŸå¥´æ€’å€’å…šå†¬"],
["9380","å‡�åˆ€å”�å¡”å¡˜å¥—å®•å³¶å¶‹æ‚¼æŠ•æ�­æ�±æ¡ƒæ¢¼æ£Ÿç›—æ·˜æ¹¯æ¶›ç�¯ç‡ˆå½“ç—˜ç¥·ç­‰ç­”ç­’ç³–çµ±åˆ°è‘£è•©è—¤è¨Žè¬„è±†è¸�é€ƒé€�é�™é™¶é ­é¨°é—˜åƒ�å‹•å�Œå ‚å°Žæ†§æ’žæ´žçž³ç«¥èƒ´è�„é�“éŠ…å³ é´‡åŒ¿å¾—å¾³æ¶œç‰¹ç�£ç¦¿ç¯¤æ¯’ç‹¬èª­æ ƒæ©¡å‡¸çª�æ¤´å±Šé³¶è‹«å¯…é…‰ç€žå™¸å±¯æƒ‡æ•¦æ²Œè±šé��é “å‘‘æ›‡éˆ�å¥ˆé‚£å†…ä¹�å‡ªè–™è¬Žç�˜æ�ºé�‹æ¥¢é¦´ç¸„ç•·å�—æ¥ è»Ÿé›£æ±�äºŒå°¼å¼�è¿©åŒ‚è³‘è‚‰è™¹å»¿æ—¥ä¹³å…¥"],
["9440","å¦‚å°¿éŸ®ä»»å¦Šå¿�èª�æ¿¡ç¦°ç¥¢å¯§è‘±çŒ«ç†±å¹´å¿µæ�»æ’šç‡ƒç²˜ä¹ƒå»¼ä¹‹åŸœåš¢æ‚©æ¿ƒç´�èƒ½è„³è†¿è¾²è¦—èš¤å·´æŠŠæ’­è¦‡æ�·æ³¢æ´¾ç�¶ç ´å©†ç½µèŠ­é¦¬ä¿³å»ƒæ‹�æŽ’æ•—æ�¯ç›ƒç‰ŒèƒŒè‚ºè¼©é…�å€�åŸ¹åª’æ¢…"],
["9480","æ¥³ç…¤ç‹½è²·å£²è³ é™ªé€™è�¿ç§¤çŸ§è�©ä¼¯å‰¥å�šæ‹�æŸ�æ³Šç™½ç®”ç²•èˆ¶è–„è¿«æ›�æ¼ çˆ†ç¸›èŽ«é§�éº¦å‡½ç®±ç¡²ç®¸è‚‡ç­ˆæ«¨å¹¡è‚Œç•‘ç• å…«é‰¢æºŒç™ºé†—é«ªä¼�ç½°æŠœç­�é–¥é³©å™ºå¡™è›¤éš¼ä¼´åˆ¤å�Šå��å�›å¸†æ�¬æ–‘æ�¿æ°¾æ±Žç‰ˆçŠ¯ç�­ç•”ç¹�èˆ¬è—©è²©ç¯„é‡†ç…©é ’é£¯æŒ½æ™©ç•ªç›¤ç£�è•ƒè›®åŒªå�‘å�¦å¦ƒåº‡å½¼æ‚²æ‰‰æ‰¹æŠ«æ–�æ¯”æ³Œç–²çš®ç¢‘ç§˜ç·‹ç½·è‚¥è¢«èª¹è²»é�¿é�žé£›æ¨‹ç°¸å‚™å°¾å¾®æž‡æ¯˜ç�µçœ‰ç¾Ž"],
["9540","é¼»æŸŠç¨—åŒ¹ç–‹é«­å½¦è†�è�±è‚˜å¼¼å¿…ç•¢ç­†é€¼æ¡§å§«åª›ç´�ç™¾è¬¬ä¿µå½ªæ¨™æ°·æ¼‚ç“¢ç¥¨è¡¨è©•è±¹å»Ÿæ��ç—…ç§’è‹—éŒ¨é‹²è’œè›­é°­å“�å½¬æ–Œæµœç€•è²§è³“é »æ•�ç“¶ä¸�ä»˜åŸ å¤«å©¦å¯Œå†¨å¸ƒåºœæ€–æ‰¶æ•·"],
["9580","æ–§æ™®æµ®çˆ¶ç¬¦è…�è†šèŠ™è­œè² è³¦èµ´é˜œé™„ä¾®æ’«æ­¦èˆžè‘¡è•ªéƒ¨å°�æ¥“é¢¨è‘ºè•—ä¼�å‰¯å¾©å¹…æœ�ç¦�è…¹è¤‡è¦†æ·µå¼—æ‰•æ²¸ä»�ç‰©é®’åˆ†å�»å™´å¢³æ†¤æ‰®ç„šå¥®ç²‰ç³žç´›é›°æ–‡è�žä¸™ä½µå…µå¡€å¹£å¹³å¼ŠæŸ„ä¸¦è”½é–‰é™›ç±³é �åƒ»å£�ç™–ç¢§åˆ¥çž¥è”‘ç®†å��å¤‰ç‰‡ç¯‡ç·¨è¾ºè¿”é��ä¾¿å‹‰å¨©å¼�éž­ä¿�èˆ—é‹ªåœƒæ�•æ­©ç”«è£œè¼”ç©‚å‹Ÿå¢“æ…•æˆŠæš®æ¯�ç°¿è�©å€£ä¿¸åŒ…å‘†å ±å¥‰å®�å³°å³¯å´©åº–æŠ±æ�§æ”¾æ–¹æœ‹"],
["9640","æ³•æ³¡çƒ¹ç ²ç¸«èƒžèŠ³è�Œè“¬èœ‚è¤’è¨ªè±Šé‚¦é‹’é£½é³³éµ¬ä¹�äº¡å‚�å‰–å�Šå¦¨å¸½å¿˜å¿™æˆ¿æš´æœ›æŸ�æ£’å†’ç´¡è‚ªè†¨è¬€è²Œè²¿é‰¾é˜²å� é ¬åŒ—åƒ•å�œå¢¨æ’²æœ´ç‰§ç�¦ç©†é‡¦å‹ƒæ²¡æ®†å €å¹Œå¥”æœ¬ç¿»å‡¡ç›†"],
["9680","æ‘©ç£¨é­”éº»åŸ‹å¦¹æ˜§æžšæ¯Žå“©æ§™å¹•è†œæž•é®ªæŸ¾é±’æ¡�äº¦ä¿£å�ˆæŠ¹æœ«æ²«è¿„ä¾­ç¹­éº¿ä¸‡æ…¢æº€æ¼«è”“å‘³æœªé­…å·³ç®•å²¬å¯†èœœæ¹Šè“‘ç¨”è„ˆå¦™ç²�æ°‘çœ å‹™å¤¢ç„¡ç‰ŸçŸ›éœ§éµ¡æ¤‹å©¿å¨˜å†¥å��å‘½æ˜Žç›Ÿè¿·éŠ˜é³´å§ªç‰�æ»…å…�æ£‰ç¶¿ç·¬é�¢éººæ‘¸æ¨¡èŒ‚å¦„å­Ÿæ¯›çŒ›ç›²ç¶²è€—è’™å„²æœ¨é»™ç›®æ�¢å‹¿é¤…å°¤æˆ»ç±¾è²°å•�æ‚¶ç´‹é–€åŒ�ä¹Ÿå†¶å¤œçˆºè€¶é‡Žå¼¥çŸ¢åŽ„å½¹ç´„è–¬è¨³èº�é�–æŸ³è–®é‘“æ„‰æ„ˆæ²¹ç™’"],
["9740","è«­è¼¸å”¯ä½‘å„ªå‹‡å�‹å®¥å¹½æ‚ æ†‚æ�–æœ‰æŸšæ¹§æ¶ŒçŒ¶çŒ·ç”±ç¥�è£•èª˜é�Šé‚‘éƒµé›„èž�å¤•äºˆä½™ä¸Žèª‰è¼¿é �å‚­å¹¼å¦–å®¹åº¸æ�šæ�ºæ“�æ›œæ¥Šæ§˜æ´‹æº¶ç†”ç”¨çª¯ç¾Šè€€è‘‰è“‰è¦�è¬¡è¸Šé�¥é™½é¤Šæ…¾æŠ‘æ¬²"],
["9780","æ²ƒæµ´ç¿Œç¿¼æ·€ç¾…èžºè£¸æ�¥èŽ±é ¼é›·æ´›çµ¡è�½é…ªä¹±å�µåµ�æ¬„æ¿«è—�è˜­è¦§åˆ©å��å±¥æ�Žæ¢¨ç�†ç’ƒç—¢è£�è£¡é‡Œé›¢é™¸å¾‹çŽ‡ç«‹è‘ŽæŽ ç•¥åŠ‰æµ�æºœç�‰ç•™ç¡«ç²’éš†ç«œé¾�ä¾¶æ…®æ—…è™œäº†äº®åƒšä¸¡å‡Œå¯®æ–™æ¢�æ¶¼çŒŸç™‚çž­ç¨œç³§è‰¯è«’é�¼é‡�é™µé ˜åŠ›ç·‘å€«åŽ˜æž—æ·‹ç‡�ç�³è‡¨è¼ªéš£é±—éºŸç‘ å¡�æ¶™ç´¯é¡žä»¤ä¼¶ä¾‹å†·åŠ±å¶ºæ€œçŽ²ç¤¼è‹“éˆ´éš·é›¶éœŠéº—é½¢æš¦æ­´åˆ—åŠ£çƒˆè£‚å»‰æ�‹æ†�æ¼£ç…‰ç°¾ç·´è�¯"],
["9840","è“®é€£éŒ¬å‘‚é­¯æ«“ç‚‰è³‚è·¯éœ²åŠ´å©�å»Šå¼„æœ—æ¥¼æ¦”æµªæ¼�ç‰¢ç‹¼ç¯­è€�è�¾è�‹éƒŽå…­éº“ç¦„è‚‹éŒ²è«–å€­å’Œè©±æ­ªè³„è„‡æƒ‘æž é·²äº™äº˜é°�è©«è—�è•¨æ¤€æ¹¾ç¢—è…•"],
["989f","å¼Œä¸�ä¸•ä¸ªä¸±ä¸¶ä¸¼ä¸¿ä¹‚ä¹–ä¹˜äº‚äº…è±«äºŠèˆ’å¼�äºŽäºžäºŸäº äº¢äº°äº³äº¶ä»Žä»�ä»„ä»†ä»‚ä»—ä»žä»­ä»Ÿä»·ä¼‰ä½šä¼°ä½›ä½�ä½—ä½‡ä½¶ä¾ˆä¾�ä¾˜ä½»ä½©ä½°ä¾‘ä½¯ä¾†ä¾–å„˜ä¿”ä¿Ÿä¿Žä¿˜ä¿›ä¿‘ä¿šä¿�ä¿¤ä¿¥å€šå€¨å€”å€ªå€¥å€…ä¼œä¿¶å€¡å€©å€¬ä¿¾ä¿¯å€‘å€†å�ƒå�‡æœƒå�•å��å�ˆå�šå�–å�¬å�¸å‚€å‚šå‚…å‚´å‚²"],
["9940","åƒ‰åƒŠå‚³åƒ‚åƒ–åƒžåƒ¥åƒ­åƒ£åƒ®åƒ¹åƒµå„‰å„�å„‚å„–å„•å„”å„šå„¡å„ºå„·å„¼å„»å„¿å…€å…’å…Œå…”å…¢ç«¸å…©å…ªå…®å†€å†‚å›˜å†Œå†‰å†�å†‘å†“å†•å†–å†¤å†¦å†¢å†©å†ªå†«å†³å†±å†²å†°å†µå†½å‡…å‡‰å‡›å‡ è™•å‡©å‡­"],
["9980","å‡°å‡µå‡¾åˆ„åˆ‹åˆ”åˆŽåˆ§åˆªåˆ®åˆ³åˆ¹å‰�å‰„å‰‹å‰Œå‰žå‰”å‰ªå‰´å‰©å‰³å‰¿å‰½åŠ�åŠ”åŠ’å‰±åŠˆåŠ‘è¾¨è¾§åŠ¬åŠ­åŠ¼åŠµå‹�å‹�å‹—å‹žå‹£å‹¦é£­å‹ å‹³å‹µå‹¸å‹¹åŒ†åŒˆç”¸åŒ�åŒ�åŒ�åŒ•åŒšåŒ£åŒ¯åŒ±åŒ³åŒ¸å�€å�†å�…ä¸—å�‰å��å‡–å�žå�©å�®å¤˜å�»å�·åŽ‚åŽ–åŽ åŽ¦åŽ¥åŽ®åŽ°åŽ¶å�ƒç°’é›™å�Ÿæ›¼ç‡®å�®å�¨å�­å�ºå��å�½å‘€å�¬å�­å�¼å�®å�¶å�©å��å‘Žå’�å‘µå’Žå‘Ÿå‘±å‘·å‘°å’’å‘»å’€å‘¶å’„å’�å’†å“‡å’¢å’¸å’¥å’¬å“„å“ˆå’¨"],
["9a40","å’«å“‚å’¤å’¾å’¼å“˜å“¥å“¦å”�å””å“½å“®å“­å“ºå“¢å”¹å•€å•£å•Œå”®å•œå•…å•–å•—å”¸å”³å•�å–™å–€å’¯å–Šå–Ÿå•»å•¾å–˜å–žå–®å•¼å–ƒå–©å–‡å–¨å—šå—…å—Ÿå—„å—œå—¤å—”å˜”å—·å˜–å—¾å—½å˜›å—¹å™Žå™�ç‡Ÿå˜´å˜¶å˜²å˜¸"],
["9a80","å™«å™¤å˜¯å™¬å™ªåš†åš€åšŠåš åš”åš�åš¥åš®åš¶åš´å›‚åš¼å›�å›ƒå›€å›ˆå›Žå›‘å›“å›—å›®å›¹åœ€å›¿åœ„åœ‰åœˆåœ‹åœ�åœ“åœ˜åœ–å—‡åœœåœ¦åœ·åœ¸å�Žåœ»å�€å��å�©åŸ€åžˆå�¡å�¿åž‰åž“åž åž³åž¤åžªåž°åŸƒåŸ†åŸ”åŸ’åŸ“å ŠåŸ–åŸ£å ‹å ™å �å¡²å ¡å¡¢å¡‹å¡°æ¯€å¡’å ½å¡¹å¢…å¢¹å¢Ÿå¢«å¢ºå£žå¢»å¢¸å¢®å£…å£“å£‘å£—å£™å£˜å£¥å£œå£¤å£Ÿå£¯å£ºå£¹å£»å£¼å£½å¤‚å¤Šå¤�å¤›æ¢¦å¤¥å¤¬å¤­å¤²å¤¸å¤¾ç«’å¥•å¥�å¥Žå¥šå¥˜å¥¢å¥ å¥§å¥¬å¥©"],
["9b40","å¥¸å¦�å¦�ä½žä¾«å¦£å¦²å§†å§¨å§œå¦�å§™å§šå¨¥å¨Ÿå¨‘å¨œå¨‰å¨šå©€å©¬å©‰å¨µå¨¶å©¢å©ªåªšåª¼åª¾å«‹å«‚åª½å«£å«—å«¦å«©å«–å«ºå«»å¬Œå¬‹å¬–å¬²å«�å¬ªå¬¶å¬¾å­ƒå­…å­€å­‘å­•å­šå­›å­¥å­©å­°å­³å­µå­¸æ–ˆå­ºå®€"],
["9b80","å®ƒå®¦å®¸å¯ƒå¯‡å¯‰å¯”å¯�å¯¤å¯¦å¯¢å¯žå¯¥å¯«å¯°å¯¶å¯³å°…å°‡å°ˆå°�å°“å° å°¢å°¨å°¸å°¹å±�å±†å±Žå±“å±�å±�å­±å±¬å±®ä¹¢å±¶å±¹å²Œå²‘å²”å¦›å²«å²»å²¶å²¼å²·å³…å²¾å³‡å³™å³©å³½å³ºå³­å¶Œå³ªå´‹å´•å´—åµœå´Ÿå´›å´‘å´”å´¢å´šå´™å´˜åµŒåµ’åµŽåµ‹åµ¬åµ³åµ¶å¶‡å¶„å¶‚å¶¢å¶�å¶¬å¶®å¶½å¶�å¶·å¶¼å·‰å·�å·“å·’å·–å·›å·«å·²å·µå¸‹å¸šå¸™å¸‘å¸›å¸¶å¸·å¹„å¹ƒå¹€å¹Žå¹—å¹”å¹Ÿå¹¢å¹¤å¹‡å¹µå¹¶å¹ºéº¼å¹¿åº å»�å»‚å»ˆå»�å»�"],
["9c40","å»–å»£å»�å»šå»›å»¢å»¡å»¨å»©å»¬å»±å»³å»°å»´å»¸å»¾å¼ƒå¼‰å½�å½œå¼‹å¼‘å¼–å¼©å¼­å¼¸å½�å½ˆå½Œå½Žå¼¯å½‘å½–å½—å½™å½¡å½­å½³å½·å¾ƒå¾‚å½¿å¾Šå¾ˆå¾‘å¾‡å¾žå¾™å¾˜å¾ å¾¨å¾­å¾¼å¿–å¿»å¿¤å¿¸å¿±å¿�æ‚³å¿¿æ€¡æ� "],
["9c80","æ€™æ€�æ€©æ€Žæ€±æ€›æ€•æ€«æ€¦æ€�æ€ºæ�šæ��æ�ªæ�·æ�Ÿæ�Šæ�†æ��æ�£æ�ƒæ�¤æ�‚æ�¬æ�«æ�™æ‚�æ‚�æƒ§æ‚ƒæ‚šæ‚„æ‚›æ‚–æ‚—æ‚’æ‚§æ‚‹æƒ¡æ‚¸æƒ æƒ“æ‚´å¿°æ‚½æƒ†æ‚µæƒ˜æ…�æ„•æ„†æƒ¶æƒ·æ„€æƒ´æƒºæ„ƒæ„¡æƒ»æƒ±æ„�æ„Žæ…‡æ„¾æ„¨æ„§æ…Šæ„¿æ„¼æ„¬æ„´æ„½æ…‚æ…„æ…³æ…·æ…˜æ…™æ…šæ…«æ…´æ…¯æ…¥æ…±æ…Ÿæ…�æ…“æ…µæ†™æ†–æ†‡æ†¬æ†”æ†šæ†Šæ†‘æ†«æ†®æ‡Œæ‡Šæ‡‰æ‡·æ‡ˆæ‡ƒæ‡†æ†ºæ‡‹ç½¹æ‡�æ‡¦æ‡£æ‡¶æ‡ºæ‡´æ‡¿æ‡½æ‡¼æ‡¾æˆ€æˆˆæˆ‰æˆ�æˆŒæˆ”æˆ›"],
["9d40","æˆžæˆ¡æˆªæˆ®æˆ°æˆ²æˆ³æ‰�æ‰Žæ‰žæ‰£æ‰›æ‰ æ‰¨æ‰¼æŠ‚æŠ‰æ‰¾æŠ’æŠ“æŠ–æ‹”æŠƒæŠ”æ‹—æ‹‘æŠ»æ‹�æ‹¿æ‹†æ“”æ‹ˆæ‹œæ‹Œæ‹Šæ‹‚æ‹‡æŠ›æ‹‰æŒŒæ‹®æ‹±æŒ§æŒ‚æŒˆæ‹¯æ‹µæ��æŒ¾æ��æ�œæ��æŽ–æŽŽæŽ€æŽ«æ�¶æŽ£æŽ�æŽ‰æŽŸæŽµæ�«"],
["9d80","æ�©æŽ¾æ�©æ�€æ�†æ�£æ�‰æ�’æ�¶æ�„æ�–æ�´æ�†æ�“æ�¦æ�¶æ”�æ�—æ�¨æ��æ‘§æ‘¯æ‘¶æ‘Žæ”ªæ’•æ’“æ’¥æ’©æ’ˆæ’¼æ“šæ“’æ“…æ“‡æ’»æ“˜æ“‚æ“±æ“§èˆ‰æ“ æ“¡æŠ¬æ“£æ“¯æ”¬æ“¶æ“´æ“²æ“ºæ”€æ“½æ”˜æ”œæ”…æ”¤æ”£æ”«æ”´æ”µæ”·æ”¶æ”¸ç•‹æ•ˆæ•–æ••æ•�æ•˜æ•žæ•�æ•²æ•¸æ–‚æ–ƒè®Šæ–›æ–Ÿæ–«æ–·æ—ƒæ—†æ—�æ—„æ—Œæ—’æ—›æ—™æ— æ—¡æ—±æ�²æ˜Šæ˜ƒæ—»æ�³æ˜µæ˜¶æ˜´æ˜œæ™�æ™„æ™‰æ™�æ™žæ™�æ™¤æ™§æ™¨æ™Ÿæ™¢æ™°æšƒæšˆæšŽæš‰æš„æš˜æš�æ›�æš¹æ›‰æš¾æš¼"],
["9e40","æ›„æš¸æ›–æ›šæ› æ˜¿æ›¦æ›©æ›°æ›µæ›·æœ�æœ–æœžæœ¦æœ§éœ¸æœ®æœ¿æœ¶æ��æœ¸æœ·æ�†æ�žæ� æ�™æ�£æ�¤æž‰æ�°æž©æ�¼æ�ªæžŒæž‹æž¦æž¡æž…æž·æŸ¯æž´æŸ¬æž³æŸ©æž¸æŸ¤æŸžæŸ�æŸ¢æŸ®æž¹æŸŽæŸ†æŸ§æªœæ žæ¡†æ ©æ¡€æ¡�æ ²æ¡Ž"],
["9e80","æ¢³æ «æ¡™æ¡£æ¡·æ¡¿æ¢Ÿæ¢�æ¢­æ¢”æ¢�æ¢›æ¢ƒæª®æ¢¹æ¡´æ¢µæ¢ æ¢ºæ¤�æ¢�æ¡¾æ¤�æ£Šæ¤ˆæ£˜æ¤¢æ¤¦æ£¡æ¤Œæ£�æ£”æ£§æ£•æ¤¶æ¤’æ¤„æ£—æ££æ¤¥æ£¹æ£ æ£¯æ¤¨æ¤ªæ¤šæ¤£æ¤¡æ£†æ¥¹æ¥·æ¥œæ¥¸æ¥«æ¥”æ¥¾æ¥®æ¤¹æ¥´æ¤½æ¥™æ¤°æ¥¡æ¥žæ¥�æ¦�æ¥ªæ¦²æ¦®æ§�æ¦¿æ§�æ§“æ¦¾æ§Žå¯¨æ§Šæ§�æ¦»æ§ƒæ¦§æ¨®æ¦‘æ¦ æ¦œæ¦•æ¦´æ§žæ§¨æ¨‚æ¨›æ§¿æ¬Šæ§¹æ§²æ§§æ¨…æ¦±æ¨žæ§­æ¨”æ§«æ¨Šæ¨’æ«�æ¨£æ¨“æ©„æ¨Œæ©²æ¨¶æ©¸æ©‡æ©¢æ©™æ©¦æ©ˆæ¨¸æ¨¢æª�æª�æª æª„æª¢æª£"],
["9f40","æª—è˜—æª»æ«ƒæ«‚æª¸æª³æª¬æ«žæ«‘æ«Ÿæªªæ«šæ«ªæ«»æ¬…è˜–æ«ºæ¬’æ¬–é¬±æ¬Ÿæ¬¸æ¬·ç›œæ¬¹é£®æ­‡æ­ƒæ­‰æ­�æ­™æ­”æ­›æ­Ÿæ­¡æ­¸æ­¹æ­¿æ®€æ®„æ®ƒæ®�æ®˜æ®•æ®žæ®¤æ®ªæ®«æ®¯æ®²æ®±æ®³æ®·æ®¼æ¯†æ¯‹æ¯“æ¯Ÿæ¯¬æ¯«æ¯³æ¯¯"],
["9f80","éº¾æ°ˆæ°“æ°”æ°›æ°¤æ°£æ±žæ±•æ±¢æ±ªæ²‚æ²�æ²šæ²�æ²›æ±¾æ±¨æ±³æ²’æ²�æ³„æ³±æ³“æ²½æ³—æ³…æ³�æ²®æ²±æ²¾æ²ºæ³›æ³¯æ³™æ³ªæ´Ÿè¡�æ´¶æ´«æ´½æ´¸æ´™æ´µæ´³æ´’æ´Œæµ£æ¶“æµ¤æµšæµ¹æµ™æ¶Žæ¶•æ¿¤æ¶…æ·¹æ¸•æ¸Šæ¶µæ·‡æ·¦æ¶¸æ·†æ·¬æ·žæ·Œæ·¨æ·’æ·…æ·ºæ·™æ·¤æ·•æ·ªæ·®æ¸­æ¹®æ¸®æ¸™æ¹²æ¹Ÿæ¸¾æ¸£æ¹«æ¸«æ¹¶æ¹�æ¸Ÿæ¹ƒæ¸ºæ¹Žæ¸¤æ»¿æ¸�æ¸¸æº‚æºªæº˜æ»‰æº·æ»“æº½æº¯æ»„æº²æ»”æ»•æº�æº¥æ»‚æºŸæ½�æ¼‘ç�Œæ»¬æ»¸æ»¾æ¼¿æ»²æ¼±æ»¯æ¼²æ»Œ"],
["e040","æ¼¾æ¼“æ»·æ¾†æ½ºæ½¸æ¾�æ¾€æ½¯æ½›æ¿³æ½­æ¾‚æ½¼æ½˜æ¾Žæ¾‘æ¿‚æ½¦æ¾³æ¾£æ¾¡æ¾¤æ¾¹æ¿†æ¾ªæ¿Ÿæ¿•æ¿¬æ¿”æ¿˜æ¿±æ¿®æ¿›ç€‰ç€‹æ¿ºç€‘ç€�ç€�æ¿¾ç€›ç€šæ½´ç€�ç€˜ç€Ÿç€°ç€¾ç€²ç�‘ç�£ç‚™ç‚’ç‚¯çƒ±ç‚¬ç‚¸ç‚³ç‚®çƒŸçƒ‹çƒ�"],
["e080","çƒ™ç„‰çƒ½ç„œç„™ç…¥ç…•ç†ˆç…¦ç…¢ç…Œç…–ç…¬ç†�ç‡»ç†„ç†•ç†¨ç†¬ç‡—ç†¹ç†¾ç‡’ç‡‰ç‡”ç‡Žç‡ ç‡¬ç‡§ç‡µç‡¼ç‡¹ç‡¿çˆ�çˆ�çˆ›çˆ¨çˆ­çˆ¬çˆ°çˆ²çˆ»çˆ¼çˆ¿ç‰€ç‰†ç‰‹ç‰˜ç‰´ç‰¾çŠ‚çŠ�çŠ‡çŠ’çŠ–çŠ¢çŠ§çŠ¹çŠ²ç‹ƒç‹†ç‹„ç‹Žç‹’ç‹¢ç‹ ç‹¡ç‹¹ç‹·å€�çŒ—çŒŠçŒœçŒ–çŒ�çŒ´çŒ¯çŒ©çŒ¥çŒ¾ç�Žç��é»˜ç�—ç�ªç�¨ç�°ç�¸ç�µç�»ç�ºç�ˆçŽ³ç�ŽçŽ»ç�€ç�¥ç�®ç�žç’¢ç�…ç‘¯ç�¥ç�¸ç�²ç�ºç‘•ç�¿ç‘Ÿç‘™ç‘�ç‘œç‘©ç‘°ç‘£ç‘ªç‘¶ç‘¾ç’‹ç’žç’§ç“Šç“�ç“”ç�±"],
["e140","ç“ ç“£ç“§ç“©ç“®ç“²ç“°ç“±ç“¸ç“·ç”„ç”ƒç”…ç”Œç”Žç”�ç”•ç”“ç”žç”¦ç”¬ç”¼ç•„ç•�ç•Šç•‰ç•›ç•†ç•šç•©ç•¤ç•§ç•«ç•­ç•¸ç•¶ç–†ç–‡ç•´ç–Šç–‰ç–‚ç–”ç–šç–�ç–¥ç–£ç—‚ç–³ç—ƒç–µç–½ç–¸ç–¼ç–±ç—�ç—Šç—’ç—™ç—£ç—žç—¾ç—¿"],
["e180","ç—¼ç˜�ç—°ç—ºç—²ç—³ç˜‹ç˜�ç˜‰ç˜Ÿç˜§ç˜ ç˜¡ç˜¢ç˜¤ç˜´ç˜°ç˜»ç™‡ç™ˆç™†ç™œç™˜ç™¡ç™¢ç™¨ç™©ç™ªç™§ç™¬ç™°ç™²ç™¶ç™¸ç™¼çš€çšƒçšˆçš‹çšŽçš–çš“çš™çššçš°çš´çš¸çš¹çšºç›‚ç›�ç›–ç›’ç›žç›¡ç›¥ç›§ç›ªè˜¯ç›»çœˆçœ‡çœ„çœ©çœ¤çœžçœ¥çœ¦çœ›çœ·çœ¸ç�‡ç�šç�¨ç�«ç�›ç�¥ç�¿ç�¾ç�¹çžŽçž‹çž‘çž çžžçž°çž¶çž¹çž¿çž¼çž½çž»çŸ‡çŸ�çŸ—çŸšçŸœçŸ£çŸ®çŸ¼ç Œç ’ç¤¦ç  ç¤ªç¡…ç¢Žç¡´ç¢†ç¡¼ç¢šç¢Œç¢£ç¢µç¢ªç¢¯ç£‘ç£†ç£‹ç£”ç¢¾ç¢¼ç£…ç£Šç£¬"],
["e240","ç£§ç£šç£½ç£´ç¤‡ç¤’ç¤‘ç¤™ç¤¬ç¤«ç¥€ç¥ ç¥—ç¥Ÿç¥šç¥•ç¥“ç¥ºç¥¿ç¦Šç¦�ç¦§é½‹ç¦ªç¦®ç¦³ç¦¹ç¦ºç§‰ç§•ç§§ç§¬ç§¡ç§£ç¨ˆç¨�ç¨˜ç¨™ç¨ ç¨Ÿç¦€ç¨±ç¨»ç¨¾ç¨·ç©ƒç©—ç©‰ç©¡ç©¢ç©©é¾�ç©°ç©¹ç©½çªˆçª—çª•çª˜çª–çª©ç«ˆçª°"],
["e280","çª¶ç«…ç«„çª¿é‚ƒç«‡ç«Šç«�ç«�ç«•ç«“ç«™ç«šç«�ç«¡ç«¢ç«¦ç«­ç«°ç¬‚ç¬�ç¬Šç¬†ç¬³ç¬˜ç¬™ç¬žç¬µç¬¨ç¬¶ç­�ç­ºç¬„ç­�ç¬‹ç­Œç­…ç­µç­¥ç­´ç­§ç­°ç­±ç­¬ç­®ç®�ç®˜ç®Ÿç®�ç®œç®šç®‹ç®’ç®�ç­�ç®™ç¯‹ç¯�ç¯Œç¯�ç®´ç¯†ç¯�ç¯©ç°‘ç°”ç¯¦ç¯¥ç± ç°€ç°‡ç°“ç¯³ç¯·ç°—ç°�ç¯¶ç°£ç°§ç°ªç°Ÿç°·ç°«ç°½ç±Œç±ƒç±”ç±�ç±€ç±�ç±˜ç±Ÿç±¤ç±–ç±¥ç±¬ç±µç²ƒç²�ç²¤ç²­ç²¢ç²«ç²¡ç²¨ç²³ç²²ç²±ç²®ç²¹ç²½ç³€ç³…ç³‚ç³˜ç³’ç³œç³¢é¬»ç³¯ç³²ç³´ç³¶ç³ºç´†"],
["e340","ç´‚ç´œç´•ç´Šçµ…çµ‹ç´®ç´²ç´¿ç´µçµ†çµ³çµ–çµŽçµ²çµ¨çµ®çµ�çµ£ç¶“ç¶‰çµ›ç¶�çµ½ç¶›ç¶ºç¶®ç¶£ç¶µç·‡ç¶½ç¶«ç¸½ç¶¢ç¶¯ç·œç¶¸ç¶Ÿç¶°ç·˜ç·�ç·¤ç·žç·»ç·²ç·¡ç¸…ç¸Šç¸£ç¸¡ç¸’ç¸±ç¸Ÿç¸‰ç¸‹ç¸¢ç¹†ç¹¦ç¸»ç¸µç¸¹ç¹ƒç¸·"],
["e380","ç¸²ç¸ºç¹§ç¹�ç¹–ç¹žç¹™ç¹šç¹¹ç¹ªç¹©ç¹¼ç¹»çºƒç·•ç¹½è¾®ç¹¿çºˆçº‰çºŒçº’çº�çº“çº”çº–çºŽçº›çºœç¼¸ç¼ºç½…ç½Œç½�ç½Žç½�ç½‘ç½•ç½”ç½˜ç½Ÿç½ ç½¨ç½©ç½§ç½¸ç¾‚ç¾†ç¾ƒç¾ˆç¾‡ç¾Œç¾”ç¾žç¾�ç¾šç¾£ç¾¯ç¾²ç¾¹ç¾®ç¾¶ç¾¸è­±ç¿…ç¿†ç¿Šç¿•ç¿”ç¿¡ç¿¦ç¿©ç¿³ç¿¹é£œè€†è€„è€‹è€’è€˜è€™è€œè€¡è€¨è€¿è€»è�Šè�†è�’è�˜è�šè�Ÿè�¢è�¨è�³è�²è�°è�¶è�¹è�½è�¿è‚„è‚†è‚…è‚›è‚“è‚šè‚­å†�è‚¬èƒ›èƒ¥èƒ™èƒ�èƒ„èƒšèƒ–è„‰èƒ¯èƒ±è„›è„©è„£è„¯è…‹"],
["e440","éš‹è…†è„¾è…“è…‘èƒ¼è…±è…®è…¥è…¦è…´è†ƒè†ˆè†Šè†€è†‚è† è†•è†¤è†£è…Ÿè†“è†©è†°è†µè†¾è†¸è†½è‡€è‡‚è†ºè‡‰è‡�è‡‘è‡™è‡˜è‡ˆè‡šè‡Ÿè‡ è‡§è‡ºè‡»è‡¾èˆ�èˆ‚èˆ…èˆ‡èˆŠèˆ�èˆ�èˆ–èˆ©èˆ«èˆ¸èˆ³è‰€è‰™è‰˜è‰�è‰šè‰Ÿè‰¤"],
["e480","è‰¢è‰¨è‰ªè‰«èˆ®è‰±è‰·è‰¸è‰¾èŠ�èŠ’èŠ«èŠŸèŠ»èŠ¬è‹¡è‹£è‹Ÿè‹’è‹´è‹³è‹ºèŽ“èŒƒè‹»è‹¹è‹žèŒ†è‹œèŒ‰è‹™èŒµèŒ´èŒ–èŒ²èŒ±è�€èŒ¹è��è�…èŒ¯èŒ«èŒ—èŒ˜èŽ…èŽšèŽªèŽŸèŽ¢èŽ–èŒ£èŽŽèŽ‡èŽŠè�¼èŽµè�³è�µèŽ èŽ‰èŽ¨è�´è�“è�«è�Žè�½è�ƒè�˜è�‹è��è�·è�‡è� è�²è��è�¢è� èŽ½è�¸è”†è�»è‘­è�ªè�¼è•šè’„è‘·è‘«è’­è‘®è’‚è‘©è‘†è�¬è‘¯è‘¹è�µè“Šè‘¢è’¹è’¿è’Ÿè“™è“�è’»è“šè“�è“�è“†è“–è’¡è”¡è“¿è“´è”—è”˜è”¬è”Ÿè”•è””è“¼è•€è•£è•˜è•ˆ"],
["e540","è•�è˜‚è•‹è••è–€è–¤è–ˆè–‘è–Šè–¨è•­è–”è–›è—ªè–‡è–œè•·è•¾è–�è—‰è–ºè—�è–¹è—�è—•è—�è—¥è—œè—¹è˜Šè˜“è˜‹è—¾è—ºè˜†è˜¢è˜šè˜°è˜¿è™�ä¹•è™”è™Ÿè™§è™±èš“èš£èš©èšªèš‹èšŒèš¶èš¯è›„è›†èš°è›‰è £èš«è›”è›žè›©è›¬"],
["e580","è›Ÿè››è›¯èœ’èœ†èœˆèœ€èœƒè›»èœ‘èœ‰èœ�è›¹èœŠèœ´èœ¿èœ·èœ»èœ¥èœ©èœšè� è�Ÿè�¸è�Œè�Žè�´è�—è�¨è�®è�™è�“è�£è�ªè …èž¢èžŸèž‚èž¯èŸ‹èž½èŸ€èŸ�é›–èž«èŸ„èž³èŸ‡èŸ†èž»èŸ¯èŸ²èŸ è �è �èŸ¾èŸ¶èŸ·è ŽèŸ’è ‘è –è •è ¢è ¡è ±è ¶è ¹è §è »è¡„è¡‚è¡’è¡™è¡žè¡¢è¡«è¢�è¡¾è¢žè¡µè¡½è¢µè¡²è¢‚è¢—è¢’è¢®è¢™è¢¢è¢�è¢¤è¢°è¢¿è¢±è£ƒè£„è£”è£˜è£™è£�è£¹è¤‚è£¼è£´è£¨è£²è¤„è¤Œè¤Šè¤“è¥ƒè¤žè¤¥è¤ªè¤«è¥�è¥„è¤»è¤¶è¤¸è¥Œè¤�è¥ è¥ž"],
["e640","è¥¦è¥¤è¥­è¥ªè¥¯è¥´è¥·è¥¾è¦ƒè¦ˆè¦Šè¦“è¦˜è¦¡è¦©è¦¦è¦¬è¦¯è¦²è¦ºè¦½è¦¿è§€è§šè§œè§�è§§è§´è§¸è¨ƒè¨–è¨�è¨Œè¨›è¨�è¨¥è¨¶è©�è©›è©’è©†è©ˆè©¼è©­è©¬è©¢èª…èª‚èª„èª¨èª¡èª‘èª¥èª¦èªšèª£è«„è«�è«‚è«šè««è«³è«§"],
["e680","è«¤è«±è¬”è« è«¢è«·è«žè«›è¬Œè¬‡è¬šè«¡è¬–è¬�è¬—è¬ è¬³éž«è¬¦è¬«è¬¾è¬¨è­�è­Œè­�è­Žè­‰è­–è­›è­šè­«è­Ÿè­¬è­¯è­´è­½è®€è®Œè®Žè®’è®“è®–è®™è®šè°ºè±�è°¿è±ˆè±Œè±Žè±�è±•è±¢è±¬è±¸è±ºè²‚è²‰è²…è²Šè²�è²Žè²”è±¼è²˜æˆ�è²­è²ªè²½è²²è²³è²®è²¶è³ˆè³�è³¤è³£è³šè³½è³ºè³»è´„è´…è´Šè´‡è´�è´�è´�é½Žè´“è³�è´”è´–èµ§èµ­èµ±èµ³è¶�è¶™è·‚è¶¾è¶ºè·�è·šè·–è·Œè·›è·‹è·ªè·«è·Ÿè·£è·¼è¸ˆè¸‰è·¿è¸�è¸žè¸�è¸Ÿè¹‚è¸µè¸°è¸´è¹Š"],
["e740","è¹‡è¹‰è¹Œè¹�è¹ˆè¹™è¹¤è¹ è¸ªè¹£è¹•è¹¶è¹²è¹¼èº�èº‡èº…èº„èº‹èºŠèº“èº‘èº”èº™èºªèº¡èº¬èº°è»†èº±èº¾è»…è»ˆè»‹è»›è»£è»¼è»»è»«è»¾è¼Šè¼…è¼•è¼’è¼™è¼“è¼œè¼Ÿè¼›è¼Œè¼¦è¼³è¼»è¼¹è½…è½‚è¼¾è½Œè½‰è½†è½Žè½—è½œ"],
["e780","è½¢è½£è½¤è¾œè¾Ÿè¾£è¾­è¾¯è¾·è¿šè¿¥è¿¢è¿ªè¿¯é‚‡è¿´é€…è¿¹è¿ºé€‘é€•é€¡é€�é€žé€–é€‹é€§é€¶é€µé€¹è¿¸é��é��é�‘é�’é€Žé�‰é€¾é�–é�˜é�žé�¨é�¯é�¶éš¨é�²é‚‚é�½é‚�é‚€é‚Šé‚‰é‚�é‚¨é‚¯é‚±é‚µéƒ¢éƒ¤æ‰ˆéƒ›é„‚é„’é„™é„²é„°é…Šé…–é…˜é…£é…¥é…©é…³é…²é†‹é†‰é†‚é†¢é†«é†¯é†ªé†µé†´é†ºé‡€é‡�é‡‰é‡‹é‡�é‡–é‡Ÿé‡¡é‡›é‡¼é‡µé‡¶éˆžé‡¿éˆ”éˆ¬éˆ•éˆ‘é‰žé‰—é‰…é‰‰é‰¤é‰ˆéŠ•éˆ¿é‰‹é‰�éŠœéŠ–éŠ“éŠ›é‰šé‹�éŠ¹éŠ·é‹©éŒ�é‹ºé�„éŒ®"],
["e840","éŒ™éŒ¢éŒšéŒ£éŒºéŒµéŒ»é�œé� é�¼é�®é�–éŽ°éŽ¬éŽ­éŽ”éŽ¹é�–é�—é�¨é�¥é�˜é�ƒé��é��é�ˆé�¤é�šé�”é�“é�ƒé�‡é��é�¶é�«é�µé�¡é�ºé‘�é‘’é‘„é‘›é‘ é‘¢é‘žé‘ªéˆ©é‘°é‘µé‘·é‘½é‘šé‘¼é‘¾é’�é‘¿é–‚é–‡é–Šé–”é––é–˜é–™"],
["e880","é– é–¨é–§é–­é–¼é–»é–¹é–¾é—Šæ¿¶é—ƒé—�é—Œé—•é—”é—–é—œé—¡é—¥é—¢é˜¡é˜¨é˜®é˜¯é™‚é™Œé™�é™‹é™·é™œé™žé™�é™Ÿé™¦é™²é™¬éš�éš˜éš•éš—éšªéš§éš±éš²éš°éš´éš¶éš¸éš¹é›Žé›‹é›‰é›�è¥�é›œéœ�é›•é›¹éœ„éœ†éœˆéœ“éœŽéœ‘éœ�éœ–éœ™éœ¤éœªéœ°éœ¹éœ½éœ¾é�„é�†é�ˆé�‚é�‰é�œé� é�¤é�¦é�¨å‹’é�«é�±é�¹éž…é�¼éž�é�ºéž†éž‹éž�éž�éžœéž¨éž¦éž£éž³éž´éŸƒéŸ†éŸˆéŸ‹éŸœéŸ­é½�éŸ²ç«ŸéŸ¶éŸµé �é Œé ¸é ¤é ¡é ·é ½é¡†é¡�é¡‹é¡«é¡¯é¡°"],
["e940","é¡±é¡´é¡³é¢ªé¢¯é¢±é¢¶é£„é£ƒé£†é£©é£«é¤ƒé¤‰é¤’é¤”é¤˜é¤¡é¤�é¤žé¤¤é¤ é¤¬é¤®é¤½é¤¾é¥‚é¥‰é¥…é¥�é¥‹é¥‘é¥’é¥Œé¥•é¦—é¦˜é¦¥é¦­é¦®é¦¼é§Ÿé§›é§�é§˜é§‘é§­é§®é§±é§²é§»é§¸é¨�é¨�é¨…é§¢é¨™é¨«é¨·é©…é©‚é©€é©ƒ"],
["e980","é¨¾é©•é©�é©›é©—é©Ÿé©¢é©¥é©¤é©©é©«é©ªéª­éª°éª¼é«€é«�é«‘é«“é«”é«žé«Ÿé«¢é«£é«¦é«¯é««é«®é«´é«±é«·é«»é¬†é¬˜é¬šé¬Ÿé¬¢é¬£é¬¥é¬§é¬¨é¬©é¬ªé¬®é¬¯é¬²é­„é­ƒé­�é­�é­Žé­‘é­˜é­´é®“é®ƒé®‘é®–é®—é®Ÿé® é®¨é®´é¯€é¯Šé®¹é¯†é¯�é¯‘é¯’é¯£é¯¢é¯¤é¯”é¯¡é°ºé¯²é¯±é¯°é°•é°”é°‰é°“é°Œé°†é°ˆé°’é°Šé°„é°®é°›é°¥é°¤é°¡é°°é±‡é°²é±†é°¾é±šé± é±§é±¶é±¸é³§é³¬é³°é´‰é´ˆé³«é´ƒé´†é´ªé´¦é¶¯é´£é´Ÿéµ„é´•é´’éµ�é´¿é´¾éµ†éµˆ"],
["ea40","éµ�éµžéµ¤éµ‘éµ�éµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·�é¶»é¶¸é¶ºé·†é·�é·‚é·™é·“é·¸é·¦é·­é·¯é·½é¸šé¸›é¸žé¹µé¹¹é¹½éº�éºˆéº‹éºŒéº’éº•éº‘éº�éº¥éº©éº¸éºªéº­é�¡é»Œé»Žé»�é»�é»”é»œé»žé»�é» é»¥é»¨é»¯"],
["ea80","é»´é»¶é»·é»¹é»»é»¼é»½é¼‡é¼ˆçš·é¼•é¼¡é¼¬é¼¾é½Šé½’é½”é½£é½Ÿé½ é½¡é½¦é½§é½¬é½ªé½·é½²é½¶é¾•é¾œé¾ å ¯æ§‡é�™ç‘¤å‡œç†™"],
["ed40","çºŠè¤œé�ˆéŠˆè“œä¿‰ç‚»æ˜±æ£ˆé‹¹æ›»å½…ä¸¨ä»¡ä»¼ä¼€ä¼ƒä¼¹ä½–ä¾’ä¾Šä¾šä¾”ä¿�å�€å€¢ä¿¿å€žå�†å�°å�‚å‚”åƒ´åƒ˜å…Šå…¤å†�å†¾å‡¬åˆ•åŠœåŠ¦å‹€å‹›åŒ€åŒ‡åŒ¤å�²åŽ“åŽ²å��ï¨Žå’œå’Šå’©å“¿å–†å�™å�¥åž¬åŸˆåŸ‡ï¨�"],
["ed80","ï¨�å¢žå¢²å¤‹å¥“å¥›å¥�å¥£å¦¤å¦ºå­–å¯€ç”¯å¯˜å¯¬å°žå²¦å²ºå³µå´§åµ“ï¨‘åµ‚åµ­å¶¸å¶¹å·�å¼¡å¼´å½§å¾·å¿žæ��æ‚…æ‚Šæƒžæƒ•æ„ æƒ²æ„‘æ„·æ„°æ†˜æˆ“æŠ¦æ�µæ‘ æ’�æ“Žæ•Žæ˜€æ˜•æ˜»æ˜‰æ˜®æ˜žæ˜¤æ™¥æ™—æ™™ï¨’æ™³æš™æš æš²æš¿æ›ºæœŽï¤©æ�¦æž»æ¡’æŸ€æ �æ¡„æ£�ï¨“æ¥¨ï¨”æ¦˜æ§¢æ¨°æ©«æ©†æ©³æ©¾æ«¢æ«¤æ¯–æ°¿æ±œæ²†æ±¯æ³šæ´„æ¶‡æµ¯æ¶–æ¶¬æ·�æ·¸æ·²æ·¼æ¸¹æ¹œæ¸§æ¸¼æº¿æ¾ˆæ¾µæ¿µç€…ç€‡ç€¨ç‚…ç‚«ç„�ç„„ç…œç…†ç…‡ï¨•ç‡�ç‡¾çŠ±"],
["ee40","çŠ¾çŒ¤ï¨–ç�·çŽ½ç�‰ç�–ç�£ç�’ç�‡ç�µç�¦ç�ªç�©ç�®ç‘¢ç’‰ç’Ÿç”�ç•¯çš‚çšœçšžçš›çš¦ï¨—ç�†åŠ¯ç ¡ç¡Žç¡¤ç¡ºç¤°ï¨˜ï¨™ï¨šç¦”ï¨›ç¦›ç«‘ç«§ï¨œç««ç®žï¨�çµˆçµœç¶·ç¶ ç·–ç¹’ç½‡ç¾¡ï¨žèŒ�è�¢è�¿è�‡è�¶è‘ˆè’´è•“è•™"],
["ee80","è•«ï¨Ÿè–°ï¨ ï¨¡è ‡è£µè¨’è¨·è©¹èª§èª¾è«Ÿï¨¢è«¶è­“è­¿è³°è³´è´’èµ¶ï¨£è»�ï¨¤ï¨¥é�§éƒžï¨¦é„•é„§é‡šé‡—é‡žé‡­é‡®é‡¤é‡¥éˆ†éˆ�éˆŠéˆºé‰€éˆ¼é‰Žé‰™é‰‘éˆ¹é‰§éŠ§é‰·é‰¸é‹§é‹—é‹™é‹�ï¨§é‹•é‹ é‹“éŒ¥éŒ¡é‹»ï¨¨éŒžé‹¿éŒ�éŒ‚é�°é�—éŽ¤é�†é�žé�¸é�±é‘…é‘ˆé–’ï§œï¨©éš�éš¯éœ³éœ»é�ƒé��é��é�‘é�•é¡—é¡¥ï¨ªï¨«é¤§ï¨¬é¦žé©Žé«™é«œé­µé­²é®�é®±é®»é°€éµ°éµ«ï¨­é¸™é»‘"],
["eeef","â…°",9,"ï¿¢ï¿¤ï¼‡ï¼‚"],
["f040","î€€",62],
["f080","î€¿",124],
["f140","î‚¼",62],
["f180","îƒ»",124],
["f240","î…¸",62],
["f280","î†·",124],
["f340","îˆ´",62],
["f380","î‰³",124],
["f440","î‹°",62],
["f480","îŒ¯",124],
["f540","îŽ¬",62],
["f580","î�«",124],
["f640","î‘¨",62],
["f680","î’§",124],
["f740","î”¤",62],
["f780","î•£",124],
["f840","î— ",62],
["f880","î˜Ÿ",124],
["f940","îšœ"],
["fa40","â…°",9,"â… ",9,"ï¿¢ï¿¤ï¼‡ï¼‚ãˆ±â„–â„¡âˆµçºŠè¤œé�ˆéŠˆè“œä¿‰ç‚»æ˜±æ£ˆé‹¹æ›»å½…ä¸¨ä»¡ä»¼ä¼€ä¼ƒä¼¹ä½–ä¾’ä¾Šä¾šä¾”ä¿�å�€å€¢ä¿¿å€žå�†å�°å�‚å‚”åƒ´åƒ˜å…Š"],
["fa80","å…¤å†�å†¾å‡¬åˆ•åŠœåŠ¦å‹€å‹›åŒ€åŒ‡åŒ¤å�²åŽ“åŽ²å��ï¨Žå’œå’Šå’©å“¿å–†å�™å�¥åž¬åŸˆåŸ‡ï¨�ï¨�å¢žå¢²å¤‹å¥“å¥›å¥�å¥£å¦¤å¦ºå­–å¯€ç”¯å¯˜å¯¬å°žå²¦å²ºå³µå´§åµ“ï¨‘åµ‚åµ­å¶¸å¶¹å·�å¼¡å¼´å½§å¾·å¿žæ��æ‚…æ‚Šæƒžæƒ•æ„ æƒ²æ„‘æ„·æ„°æ†˜æˆ“æŠ¦æ�µæ‘ æ’�æ“Žæ•Žæ˜€æ˜•æ˜»æ˜‰æ˜®æ˜žæ˜¤æ™¥æ™—æ™™ï¨’æ™³æš™æš æš²æš¿æ›ºæœŽï¤©æ�¦æž»æ¡’æŸ€æ �æ¡„æ£�ï¨“æ¥¨ï¨”æ¦˜æ§¢æ¨°æ©«æ©†æ©³æ©¾æ«¢æ«¤æ¯–æ°¿æ±œæ²†æ±¯æ³šæ´„æ¶‡æµ¯"],
["fb40","æ¶–æ¶¬æ·�æ·¸æ·²æ·¼æ¸¹æ¹œæ¸§æ¸¼æº¿æ¾ˆæ¾µæ¿µç€…ç€‡ç€¨ç‚…ç‚«ç„�ç„„ç…œç…†ç…‡ï¨•ç‡�ç‡¾çŠ±çŠ¾çŒ¤ï¨–ç�·çŽ½ç�‰ç�–ç�£ç�’ç�‡ç�µç�¦ç�ªç�©ç�®ç‘¢ç’‰ç’Ÿç”�ç•¯çš‚çšœçšžçš›çš¦ï¨—ç�†åŠ¯ç ¡ç¡Žç¡¤ç¡ºç¤°ï¨˜ï¨™"],
["fb80","ï¨šç¦”ï¨›ç¦›ç«‘ç«§ï¨œç««ç®žï¨�çµˆçµœç¶·ç¶ ç·–ç¹’ç½‡ç¾¡ï¨žèŒ�è�¢è�¿è�‡è�¶è‘ˆè’´è•“è•™è•«ï¨Ÿè–°ï¨ ï¨¡è ‡è£µè¨’è¨·è©¹èª§èª¾è«Ÿï¨¢è«¶è­“è­¿è³°è³´è´’èµ¶ï¨£è»�ï¨¤ï¨¥é�§éƒžï¨¦é„•é„§é‡šé‡—é‡žé‡­é‡®é‡¤é‡¥éˆ†éˆ�éˆŠéˆºé‰€éˆ¼é‰Žé‰™é‰‘éˆ¹é‰§éŠ§é‰·é‰¸é‹§é‹—é‹™é‹�ï¨§é‹•é‹ é‹“éŒ¥éŒ¡é‹»ï¨¨éŒžé‹¿éŒ�éŒ‚é�°é�—éŽ¤é�†é�žé�¸é�±é‘…é‘ˆé–’ï§œï¨©éš�éš¯éœ³éœ»é�ƒé��é��é�‘é�•é¡—é¡¥ï¨ªï¨«é¤§ï¨¬é¦žé©Žé«™"],
["fc40","é«œé­µé­²é®�é®±é®»é°€éµ°éµ«ï¨­é¸™é»‘"]
]
'use strict';
const lazy = (mod, fn, id) => mod === undefined ? fn(id) : mod;

module.exports = fn => {
	return id => {
		let mod;

		return function () {
			if (arguments.length === 0) {
				mod = lazy(mod, fn, id);
				return mod;
			}

			const ret = {};

			[].forEach.call(arguments, prop => {
				Object.defineProperty(ret, prop, {
					get: () => {
						mod = lazy(mod, fn, id);
						if (typeof mod[prop] === 'function') {
							return function () {
								return mod[prop].apply(mod, arguments);
							};
						}

						return mod[prop];
					}
				});
			});

			return ret;
		};
	};
};

module.exports.proxy = fn => {
	return id => {
		let mod;

		const handler = {
			get: (target, property) => {
				mod = lazy(mod, fn, id);
				return Reflect.get(mod, property);
			},
			apply: (target, thisArg, argumentsList) => {
				mod = lazy(mod, fn, id);
				return Reflect.apply(mod, thisArg, argumentsList);
			}
		};

		return new Proxy(() => {}, handler);
	};
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Import modules lazily",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/import-lazy#readme",
  "license": "MIT",
  "name": "import-lazy",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/import-lazy.git"
  },
  "version": "2.1.0"
}/**
 * @preserve
 * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013)
 *
 * @author <a href="mailto:jensyt@gmail.com">Jens Taylor</a>
 * @see http://github.com/homebrewing/brauhaus-diff
 * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
 * @see http://github.com/garycourt/murmurhash-js
 * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a>
 * @see http://sites.google.com/site/murmurhash/
 */
(function(){
    var cache;

    // Call this function without `new` to use the cached object (good for
    // single-threaded environments), or with `new` to create a new object.
    //
    // @param {string} key A UTF-16 or ASCII string
    // @param {number} seed An optional positive integer
    // @return {object} A MurmurHash3 object for incremental hashing
    function MurmurHash3(key, seed) {
        var m = this instanceof MurmurHash3 ? this : cache;
        m.reset(seed)
        if (typeof key === 'string' && key.length > 0) {
            m.hash(key);
        }

        if (m !== this) {
            return m;
        }
    };

    // Incrementally add a string to this hash
    //
    // @param {string} key A UTF-16 or ASCII string
    // @return {object} this
    MurmurHash3.prototype.hash = function(key) {
        var h1, k1, i, top, len;

        len = key.length;
        this.len += len;

        k1 = this.k1;
        i = 0;
        switch (this.rem) {
            case 0: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) : 0;
            case 1: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 8 : 0;
            case 2: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 16 : 0;
            case 3:
                k1 ^= len > i ? (key.charCodeAt(i) & 0xff) << 24 : 0;
                k1 ^= len > i ? (key.charCodeAt(i++) & 0xff00) >> 8 : 0;
        }

        this.rem = (len + this.rem) & 3; // & 3 is same as % 4
        len -= this.rem;
        if (len > 0) {
            h1 = this.h1;
            while (1) {
                k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff;
                k1 = (k1 << 15) | (k1 >>> 17);
                k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff;

                h1 ^= k1;
                h1 = (h1 << 13) | (h1 >>> 19);
                h1 = (h1 * 5 + 0xe6546b64) & 0xffffffff;

                if (i >= len) {
                    break;
                }

                k1 = ((key.charCodeAt(i++) & 0xffff)) ^
                     ((key.charCodeAt(i++) & 0xffff) << 8) ^
                     ((key.charCodeAt(i++) & 0xffff) << 16);
                top = key.charCodeAt(i++);
                k1 ^= ((top & 0xff) << 24) ^
                      ((top & 0xff00) >> 8);
            }

            k1 = 0;
            switch (this.rem) {
                case 3: k1 ^= (key.charCodeAt(i + 2) & 0xffff) << 16;
                case 2: k1 ^= (key.charCodeAt(i + 1) & 0xffff) << 8;
                case 1: k1 ^= (key.charCodeAt(i) & 0xffff);
            }

            this.h1 = h1;
        }

        this.k1 = k1;
        return this;
    };

    // Get the result of this hash
    //
    // @return {number} The 32-bit hash
    MurmurHash3.prototype.result = function() {
        var k1, h1;
        
        k1 = this.k1;
        h1 = this.h1;

        if (k1 > 0) {
            k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff;
            k1 = (k1 << 15) | (k1 >>> 17);
            k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff;
            h1 ^= k1;
        }

        h1 ^= this.len;

        h1 ^= h1 >>> 16;
        h1 = (h1 * 0xca6b + (h1 & 0xffff) * 0x85eb0000) & 0xffffffff;
        h1 ^= h1 >>> 13;
        h1 = (h1 * 0xae35 + (h1 & 0xffff) * 0xc2b20000) & 0xffffffff;
        h1 ^= h1 >>> 16;

        return h1 >>> 0;
    };

    // Reset the hash object for reuse
    //
    // @param {number} seed An optional positive integer
    MurmurHash3.prototype.reset = function(seed) {
        this.h1 = typeof seed === 'number' ? seed : 0;
        this.rem = this.k1 = this.len = 0;
        return this;
    };

    // A cached object to use. This can be safely used if you're in a single-
    // threaded environment, otherwise you need to create new hashes to use.
    cache = new MurmurHash3();

    if (typeof(module) != 'undefined') {
        module.exports = MurmurHash3;
    } else {
        this.MurmurHash3 = MurmurHash3;
    }
}());
/**
 * @preserve
 * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013)
 *
 * @author <a href="mailto:jensyt@gmail.com">Jens Taylor</a>
 * @see http://github.com/homebrewing/brauhaus-diff
 * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
 * @see http://github.com/garycourt/murmurhash-js
 * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a>
 * @see http://sites.google.com/site/murmurhash/
 */
!function(){function t(h,r){var s=this instanceof t?this:e;return s.reset(r),"string"==typeof h&&h.length>0&&s.hash(h),s!==this?s:void 0}var e;t.prototype.hash=function(t){var e,h,r,s,i;switch(i=t.length,this.len+=i,h=this.k1,r=0,this.rem){case 0:h^=i>r?65535&t.charCodeAt(r++):0;case 1:h^=i>r?(65535&t.charCodeAt(r++))<<8:0;case 2:h^=i>r?(65535&t.charCodeAt(r++))<<16:0;case 3:h^=i>r?(255&t.charCodeAt(r))<<24:0,h^=i>r?(65280&t.charCodeAt(r++))>>8:0}if(this.rem=3&i+this.rem,i-=this.rem,i>0){for(e=this.h1;;){if(h=4294967295&11601*h+3432906752*(65535&h),h=h<<15|h>>>17,h=4294967295&13715*h+461832192*(65535&h),e^=h,e=e<<13|e>>>19,e=4294967295&5*e+3864292196,r>=i)break;h=65535&t.charCodeAt(r++)^(65535&t.charCodeAt(r++))<<8^(65535&t.charCodeAt(r++))<<16,s=t.charCodeAt(r++),h^=(255&s)<<24^(65280&s)>>8}switch(h=0,this.rem){case 3:h^=(65535&t.charCodeAt(r+2))<<16;case 2:h^=(65535&t.charCodeAt(r+1))<<8;case 1:h^=65535&t.charCodeAt(r)}this.h1=e}return this.k1=h,this},t.prototype.result=function(){var t,e;return t=this.k1,e=this.h1,t>0&&(t=4294967295&11601*t+3432906752*(65535&t),t=t<<15|t>>>17,t=4294967295&13715*t+461832192*(65535&t),e^=t),e^=this.len,e^=e>>>16,e=4294967295&51819*e+2246770688*(65535&e),e^=e>>>13,e=4294967295&44597*e+3266445312*(65535&e),e^=e>>>16,e>>>0},t.prototype.reset=function(t){return this.h1="number"==typeof t?t:0,this.rem=this.k1=this.len=0,this},e=new t,"undefined"!=typeof module?module.exports=t:this.MurmurHash3=t}();{
  "author": {
    "name": "Jens Taylor",
    "email": "jensyt@gmail.com",
    "url": "https://github.com/homebrewing"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "An incremental implementation of MurmurHash3",
  "devDependencies": {},
  "engines": {
    "node": ">=0.8.19"
  },
  "files": [
    "imurmurhash.js",
    "imurmurhash.min.js",
    "package.json",
    "README.md"
  ],
  "homepage": "https://github.com/jensyt/imurmurhash-js",
  "license": "MIT",
  "main": "imurmurhash.js",
  "name": "imurmurhash",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jensyt/imurmurhash-js.git"
  },
  "version": "0.1.4"
}'use strict';
var repeating = require('repeating');

module.exports = function (str, indent, count) {
	if (typeof str !== 'string' || typeof indent !== 'string') {
		throw new TypeError('`string` and `indent` should be strings');
	}

	if (count != null && typeof count !== 'number') {
		throw new TypeError('`count` should be a number');
	}

	if (count === 0) {
		return str;
	}

	indent = count > 1 ? repeating(indent, count) : indent;

	return str.replace(/^(?!\s*$)/mg, indent);
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "repeating": "^2.0.0"
  },
  "deprecated": false,
  "description": "Indent each line in a string",
  "devDependencies": {
    "mocha": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/indent-string#readme",
  "license": "MIT",
  "name": "indent-string",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/indent-string.git"
  },
  "version": "2.1.0"
}The ISC License

Copyright (c) Isaac Z. Schlueter

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
var wrappy = require('wrappy')
var reqs = Object.create(null)
var once = require('once')

module.exports = wrappy(inflight)

function inflight (key, cb) {
  if (reqs[key]) {
    reqs[key].push(cb)
    return null
  } else {
    reqs[key] = [cb]
    return makeres(key)
  }
}

function makeres (key) {
  return once(function RES () {
    var cbs = reqs[key]
    var len = cbs.length
    var args = slice(arguments)

    // XXX It's somewhat ambiguous whether a new callback added in this
    // pass should be queued for later execution if something in the
    // list of callbacks throws, or if it should just be discarded.
    // However, it's such an edge case that it hardly matters, and either
    // choice is likely as surprising as the other.
    // As it happens, we do go ahead and schedule it for later execution.
    try {
      for (var i = 0; i < len; i++) {
        cbs[i].apply(null, args)
      }
    } finally {
      if (cbs.length > len) {
        // added more in the interim.
        // de-zalgo, just in case, but don't call again.
        cbs.splice(0, len)
        process.nextTick(function () {
          RES.apply(null, args)
        })
      } else {
        delete reqs[key]
      }
    }
  })
}

function slice (args) {
  var length = args.length
  var array = []

  for (var i = 0; i < length; i++) array[i] = args[i]
  return array
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {
    "once": "^1.3.0",
    "wrappy": "1"
  },
  "deprecated": false,
  "description": "Add callbacks to requests in flight to avoid async duplication",
  "devDependencies": {
    "tap": "^7.1.2"
  },
  "files": [
    "inflight.js"
  ],
  "homepage": "https://github.com/isaacs/inflight",
  "license": "ISC",
  "main": "inflight.js",
  "name": "inflight",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/inflight.git"
  },
  "version": "1.0.6"
}The ISC License

Copyright (c) Isaac Z. Schlueter

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

try {
  var util = require('util');
  /* istanbul ignore next */
  if (typeof util.inherits !== 'function') throw '';
  module.exports = util.inherits;
} catch (e) {
  /* istanbul ignore next */
  module.exports = require('./inherits_browser.js');
}
if (typeof Object.create === 'function') {
  // implementation from standard node.js 'util' module
  module.exports = function inherits(ctor, superCtor) {
    if (superCtor) {
      ctor.super_ = superCtor
      ctor.prototype = Object.create(superCtor.prototype, {
        constructor: {
          value: ctor,
          enumerable: false,
          writable: true,
          configurable: true
        }
      })
    }
  };
} else {
  // old school shim for old browsers
  module.exports = function inherits(ctor, superCtor) {
    if (superCtor) {
      ctor.super_ = superCtor
      var TempCtor = function () {}
      TempCtor.prototype = superCtor.prototype
      ctor.prototype = new TempCtor()
      ctor.prototype.constructor = ctor
    }
  }
}
{
  "browser": "./inherits_browser.js",
  "deprecated": false,
  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
  "devDependencies": {
    "tap": "^14.2.4"
  },
  "files": [
    "inherits.js",
    "inherits_browser.js"
  ],
  "homepage": "https://github.com/isaacs/inherits#readme",
  "license": "ISC",
  "main": "./inherits.js",
  "name": "inherits",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/inherits.git"
  },
  "version": "2.0.4"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
exports.parse = exports.decode = decode

exports.stringify = exports.encode = encode

exports.safe = safe
exports.unsafe = unsafe

var eol = typeof process !== 'undefined' &&
  process.platform === 'win32' ? '\r\n' : '\n'

function encode (obj, opt) {
  var children = []
  var out = ''

  if (typeof opt === 'string') {
    opt = {
      section: opt,
      whitespace: false
    }
  } else {
    opt = opt || {}
    opt.whitespace = opt.whitespace === true
  }

  var separator = opt.whitespace ? ' = ' : '='

  Object.keys(obj).forEach(function (k, _, __) {
    var val = obj[k]
    if (val && Array.isArray(val)) {
      val.forEach(function (item) {
        out += safe(k + '[]') + separator + safe(item) + '\n'
      })
    } else if (val && typeof val === 'object') {
      children.push(k)
    } else {
      out += safe(k) + separator + safe(val) + eol
    }
  })

  if (opt.section && out.length) {
    out = '[' + safe(opt.section) + ']' + eol + out
  }

  children.forEach(function (k, _, __) {
    var nk = dotSplit(k).join('\\.')
    var section = (opt.section ? opt.section + '.' : '') + nk
    var child = encode(obj[k], {
      section: section,
      whitespace: opt.whitespace
    })
    if (out.length && child.length) {
      out += eol
    }
    out += child
  })

  return out
}

function dotSplit (str) {
  return str.replace(/\1/g, '\u0002LITERAL\\1LITERAL\u0002')
    .replace(/\\\./g, '\u0001')
    .split(/\./).map(function (part) {
      return part.replace(/\1/g, '\\.')
      .replace(/\2LITERAL\\1LITERAL\2/g, '\u0001')
    })
}

function decode (str) {
  var out = {}
  var p = out
  var section = null
  //          section     |key      = value
  var re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i
  var lines = str.split(/[\r\n]+/g)

  lines.forEach(function (line, _, __) {
    if (!line || line.match(/^\s*[;#]/)) return
    var match = line.match(re)
    if (!match) return
    if (match[1] !== undefined) {
      section = unsafe(match[1])
      p = out[section] = out[section] || {}
      return
    }
    var key = unsafe(match[2])
    var value = match[3] ? unsafe(match[4]) : true
    switch (value) {
      case 'true':
      case 'false':
      case 'null': value = JSON.parse(value)
    }

    // Convert keys with '[]' suffix to an array
    if (key.length > 2 && key.slice(-2) === '[]') {
      key = key.substring(0, key.length - 2)
      if (!p[key]) {
        p[key] = []
      } else if (!Array.isArray(p[key])) {
        p[key] = [p[key]]
      }
    }

    // safeguard against resetting a previously defined
    // array by accidentally forgetting the brackets
    if (Array.isArray(p[key])) {
      p[key].push(value)
    } else {
      p[key] = value
    }
  })

  // {a:{y:1},"a.b":{x:2}} --> {a:{y:1,b:{x:2}}}
  // use a filter to return the keys that have to be deleted.
  Object.keys(out).filter(function (k, _, __) {
    if (!out[k] ||
      typeof out[k] !== 'object' ||
      Array.isArray(out[k])) {
      return false
    }
    // see if the parent section is also an object.
    // if so, add it to that, and mark this one for deletion
    var parts = dotSplit(k)
    var p = out
    var l = parts.pop()
    var nl = l.replace(/\\\./g, '.')
    parts.forEach(function (part, _, __) {
      if (!p[part] || typeof p[part] !== 'object') p[part] = {}
      p = p[part]
    })
    if (p === out && nl === l) {
      return false
    }
    p[nl] = out[k]
    return true
  }).forEach(function (del, _, __) {
    delete out[del]
  })

  return out
}

function isQuoted (val) {
  return (val.charAt(0) === '"' && val.slice(-1) === '"') ||
    (val.charAt(0) === "'" && val.slice(-1) === "'")
}

function safe (val) {
  return (typeof val !== 'string' ||
    val.match(/[=\r\n]/) ||
    val.match(/^\[/) ||
    (val.length > 1 &&
     isQuoted(val)) ||
    val !== val.trim())
      ? JSON.stringify(val)
      : val.replace(/;/g, '\\;').replace(/#/g, '\\#')
}

function unsafe (val, doUnesc) {
  val = (val || '').trim()
  if (isQuoted(val)) {
    // remove the single quotes before calling JSON.parse
    if (val.charAt(0) === "'") {
      val = val.substr(1, val.length - 2)
    }
    try { val = JSON.parse(val) } catch (_) {}
  } else {
    // walk the val to find the first not-escaped ; character
    var esc = false
    var unesc = ''
    for (var i = 0, l = val.length; i < l; i++) {
      var c = val.charAt(i)
      if (esc) {
        if ('\\;#'.indexOf(c) !== -1) {
          unesc += c
        } else {
          unesc += '\\' + c
        }
        esc = false
      } else if (';#'.indexOf(c) !== -1) {
        break
      } else if (c === '\\') {
        esc = true
      } else {
        unesc += c
      }
    }
    if (esc) {
      unesc += '\\'
    }
    return unesc.trim()
  }
  return val
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "An ini encoder/decoder for node",
  "devDependencies": {
    "standard": "^10.0.3",
    "tap": "^10.7.3 || 11"
  },
  "engines": {
    "node": "*"
  },
  "files": [
    "ini.js"
  ],
  "homepage": "https://github.com/isaacs/ini#readme",
  "license": "ISC",
  "main": "ini.js",
  "name": "ini",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/ini.git"
  },
  "version": "1.3.5"
}root = true

[*]
indent_style = tab
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.coffee]
indent_style = space

[{package.json,*.yml}]
indent_style = space
indent_size = 2

[*.md]
trim_trailing_whitespace = false
instrumentation:
  excludes:
    - test.js
    - test/**/*
The MIT License (MIT)

Copyright (c) 2015 JD Ballard

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'use strict';

module.exports = function isArrayish(obj) {
	if (!obj) {
		return false;
	}

	return obj instanceof Array || Array.isArray(obj) ||
		(obj.length >= 0 && obj.splice instanceof Function);
};
{
  "author": {
    "name": "Qix",
    "url": "http://github.com/qix-"
  },
  "deprecated": false,
  "description": "Determines if an object can be used as an array",
  "devDependencies": {
    "coffee-script": "^1.9.3",
    "coveralls": "^2.11.2",
    "istanbul": "^0.3.17",
    "mocha": "^2.2.5",
    "should": "^7.0.1",
    "xo": "^0.6.1"
  },
  "homepage": "https://github.com/qix-/node-is-arrayish#readme",
  "license": "MIT",
  "name": "is-arrayish",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/qix-/node-is-arrayish.git"
  },
  "version": "0.2.1"
}The MIT License (MIT)

Copyright (c) 2016-2018 Thomas Watson Steen

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
#!/usr/bin/env node
'use strict'

process.exit(require('./') ? 0 : 1)
'use strict'

module.exports = require('ci-info').isCI
{
  "author": {
    "name": "Thomas Watson Steen",
    "email": "w@tson.dk",
    "url": "https://twitter.com/wa7son"
  },
  "bin": {
    "is-ci": "bin.js"
  },
  "coordinates": [
    55.778272,
    12.593116
  ],
  "dependencies": {
    "ci-info": "^2.0.0"
  },
  "deprecated": false,
  "description": "Detect if the current environment is a CI server",
  "devDependencies": {
    "clear-module": "^3.0.0",
    "standard": "^12.0.1"
  },
  "homepage": "https://github.com/watson/is-ci",
  "license": "MIT",
  "main": "index.js",
  "name": "is-ci",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/watson/is-ci.git"
  },
  "version": "2.0.0"
}'use strict';

module.exports = Number.isFinite || function (value) {
	return !(typeof value !== 'number' || value !== value || value === Infinity || value === -Infinity);
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "ES2015 Number.isFinite() ponyfill",
  "devDependencies": {
    "ava": "^3.2.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "funding": "https://github.com/sponsors/sindresorhus",
  "homepage": "https://github.com/sindresorhus/is-finite#readme",
  "license": "MIT",
  "name": "is-finite",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-finite.git"
  },
  "version": "1.1.0"
}'use strict';
var numberIsNan = require('number-is-nan');

module.exports = function (x) {
	if (numberIsNan(x)) {
		return false;
	}

	// https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1369

	// code points are derived from:
	// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt
	if (x >= 0x1100 && (
		x <= 0x115f ||  // Hangul Jamo
		0x2329 === x || // LEFT-POINTING ANGLE BRACKET
		0x232a === x || // RIGHT-POINTING ANGLE BRACKET
		// CJK Radicals Supplement .. Enclosed CJK Letters and Months
		(0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||
		// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
		0x3250 <= x && x <= 0x4dbf ||
		// CJK Unified Ideographs .. Yi Radicals
		0x4e00 <= x && x <= 0xa4c6 ||
		// Hangul Jamo Extended-A
		0xa960 <= x && x <= 0xa97c ||
		// Hangul Syllables
		0xac00 <= x && x <= 0xd7a3 ||
		// CJK Compatibility Ideographs
		0xf900 <= x && x <= 0xfaff ||
		// Vertical Forms
		0xfe10 <= x && x <= 0xfe19 ||
		// CJK Compatibility Forms .. Small Form Variants
		0xfe30 <= x && x <= 0xfe6b ||
		// Halfwidth and Fullwidth Forms
		0xff01 <= x && x <= 0xff60 ||
		0xffe0 <= x && x <= 0xffe6 ||
		// Kana Supplement
		0x1b000 <= x && x <= 0x1b001 ||
		// Enclosed Ideographic Supplement
		0x1f200 <= x && x <= 0x1f251 ||
		// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
		0x20000 <= x && x <= 0x3fffd)) {
		return true;
	}

	return false;
}
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "number-is-nan": "^1.0.0"
  },
  "deprecated": false,
  "description": "Check if the character represented by a given Unicode code point is fullwidth",
  "devDependencies": {
    "ava": "0.0.4",
    "code-point-at": "^1.0.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/is-fullwidth-code-point#readme",
  "license": "MIT",
  "name": "is-fullwidth-code-point",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git"
  },
  "version": "1.0.0"
}'use strict';
const globalDirs = require('global-dirs');
const isPathInside = require('is-path-inside');

module.exports = isPathInside(__dirname, globalDirs.yarn.packages) || isPathInside(__dirname, globalDirs.npm.packages);
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "global-dirs": "^0.1.0",
    "is-path-inside": "^1.0.0"
  },
  "deprecated": false,
  "description": "Check if your package was installed globally",
  "devDependencies": {
    "ava": "*",
    "execa": "^0.7.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/is-installed-globally#readme",
  "license": "MIT",
  "name": "is-installed-globally",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-installed-globally.git"
  },
  "version": "0.1.0"
}'use strict';

const isNpm =
	'npm_config_username' in process.env ||
	'npm_package_name' in process.env ||
	'npm_config_heading' in process.env;

// TODO: This named export should be replaced by a default export as soon as we move to ES modules
exports.isNpm = isNpm;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if your code is running as an npm script",
  "devDependencies": {
    "ava": "^1.3.1",
    "tsd-check": "^0.3.0",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/sindresorhus/is-npm#readme",
  "license": "MIT",
  "name": "is-npm",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-npm.git"
  },
  "version": "3.0.0"
}'use strict';
module.exports = function (x) {
	var type = typeof x;
	return x !== null && (type === 'object' || type === 'function');
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if a value is an object",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/is-obj#readme",
  "license": "MIT",
  "name": "is-obj",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-obj.git"
  },
  "version": "1.0.1"
}'use strict';
var path = require('path');
var pathIsInside = require('path-is-inside');

module.exports = function (a, b) {
	a = path.resolve(a);
	b = path.resolve(b);

	if (a === b) {
		return false;
	}

	return pathIsInside(a, b);
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "path-is-inside": "^1.0.1"
  },
  "deprecated": false,
  "description": "Check if a path is inside another path",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/is-path-inside#readme",
  "license": "MIT",
  "name": "is-path-inside",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-path-inside.git"
  },
  "version": "1.0.1"
}'use strict';

var isStream = module.exports = function (stream) {
	return stream !== null && typeof stream === 'object' && typeof stream.pipe === 'function';
};

isStream.writable = function (stream) {
	return isStream(stream) && stream.writable !== false && typeof stream._write === 'function' && typeof stream._writableState === 'object';
};

isStream.readable = function (stream) {
	return isStream(stream) && stream.readable !== false && typeof stream._read === 'function' && typeof stream._readableState === 'object';
};

isStream.duplex = function (stream) {
	return isStream.writable(stream) && isStream.readable(stream);
};

isStream.transform = function (stream) {
	return isStream.duplex(stream) && typeof stream._transform === 'function' && typeof stream._transformState === 'object';
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if something is a Node.js stream",
  "devDependencies": {
    "ava": "*",
    "tempfile": "^1.1.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/is-stream#readme",
  "license": "MIT",
  "name": "is-stream",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-stream.git"
  },
  "version": "1.1.0"
}This software is released under the MIT license:

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
module.exports      = isTypedArray
isTypedArray.strict = isStrictTypedArray
isTypedArray.loose  = isLooseTypedArray

var toString = Object.prototype.toString
var names = {
    '[object Int8Array]': true
  , '[object Int16Array]': true
  , '[object Int32Array]': true
  , '[object Uint8Array]': true
  , '[object Uint8ClampedArray]': true
  , '[object Uint16Array]': true
  , '[object Uint32Array]': true
  , '[object Float32Array]': true
  , '[object Float64Array]': true
}

function isTypedArray(arr) {
  return (
       isStrictTypedArray(arr)
    || isLooseTypedArray(arr)
  )
}

function isStrictTypedArray(arr) {
  return (
       arr instanceof Int8Array
    || arr instanceof Int16Array
    || arr instanceof Int32Array
    || arr instanceof Uint8Array
    || arr instanceof Uint8ClampedArray
    || arr instanceof Uint16Array
    || arr instanceof Uint32Array
    || arr instanceof Float32Array
    || arr instanceof Float64Array
  )
}

function isLooseTypedArray(arr) {
  return names[toString.call(arr)]
}
{
  "author": {
    "name": "Hugh Kennedy",
    "email": "hughskennedy@gmail.com",
    "url": "http://hughsk.io/"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Detect whether or not an object is a Typed Array",
  "devDependencies": {
    "tape": "^2.13.1"
  },
  "homepage": "https://github.com/hughsk/is-typedarray",
  "license": "MIT",
  "main": "index.js",
  "name": "is-typedarray",
  "repository": {
    "type": "git",
    "url": "git://github.com/hughsk/is-typedarray.git"
  },
  "version": "1.0.0"
}The MIT License (MIT)

Copyright (C) 2014 Wei Fanzhe

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
ã€€ã€€
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

exports = module.exports = function(bytes)
{
    var i = 0;
    while(i < bytes.length)
    {
        if(     (// ASCII
                    bytes[i] == 0x09 ||
                    bytes[i] == 0x0A ||
                    bytes[i] == 0x0D ||
                    (0x20 <= bytes[i] && bytes[i] <= 0x7E)
                )
          ) {
              i += 1;
              continue;
          }

        if(     (// non-overlong 2-byte
                    (0xC2 <= bytes[i] && bytes[i] <= 0xDF) &&
                    (0x80 <= bytes[i+1] && bytes[i+1] <= 0xBF)
                )
          ) {
              i += 2;
              continue;
          }

        if(     (// excluding overlongs
                    bytes[i] == 0xE0 &&
                    (0xA0 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
                    (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
                ) ||
                (// straight 3-byte
                 ((0xE1 <= bytes[i] && bytes[i] <= 0xEC) ||
                  bytes[i] == 0xEE ||
                  bytes[i] == 0xEF) &&
                 (0x80 <= bytes[i + 1] && bytes[i+1] <= 0xBF) &&
                 (0x80 <= bytes[i+2] && bytes[i+2] <= 0xBF)
                ) ||
                (// excluding surrogates
                 bytes[i] == 0xED &&
                 (0x80 <= bytes[i+1] && bytes[i+1] <= 0x9F) &&
                 (0x80 <= bytes[i+2] && bytes[i+2] <= 0xBF)
                )
          ) {
              i += 3;
              continue;
          }

        if(     (// planes 1-3
                    bytes[i] == 0xF0 &&
                    (0x90 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
                    (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
                    (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
                ) ||
                (// planes 4-15
                 (0xF1 <= bytes[i] && bytes[i] <= 0xF3) &&
                 (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
                 (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
                 (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
                ) ||
                (// plane 16
                 bytes[i] == 0xF4 &&
                 (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x8F) &&
                 (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
                 (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
                )
          ) {
              i += 4;
              continue;
          }

        return false;
    }

    return true;
}
{
  "author": {
    "name": "wayfind"
  },
  "deprecated": false,
  "description": "Detect if a buffer is utf8 encoded.",
  "files": [
    "is-utf8.js"
  ],
  "homepage": "https://github.com/wayfind/is-utf8#readme",
  "license": "MIT",
  "main": "is-utf8.js",
  "name": "is-utf8",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/wayfind/is-utf8.git"
  },
  "version": "0.2.1"
}MIT License

Copyright (c) 2018 LitoMore

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';

const path = require('path');

module.exports = function () {
	const isWindows = process.platform === 'win32';
	const yarnPath = isWindows ? path.join('Yarn', 'config', 'global') : path.join('.config', 'yarn', 'global');
	if (__dirname.includes(yarnPath)) {
		return true;
	}
	return false;
};
{
  "author": {
    "name": "LitoMore",
    "url": "litomore@gmail.com"
  },
  "deprecated": false,
  "description": "Check if installed by yarn globally without any `fs` calls",
  "devDependencies": {
    "ava": "^0.24.0",
    "xo": "^0.18.2"
  },
  "homepage": "https://github.com/LitoMore/is-yarn-global#readme",
  "license": "MIT",
  "name": "is-yarn-global",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/LitoMore/is-yarn-global.git"
  },
  "version": "0.3.0"
}{
  "name" : "isarray",
  "description" : "Array#isArray for older browsers",
  "version" : "0.0.1",
  "repository" : "juliangruber/isarray",
  "homepage": "https://github.com/juliangruber/isarray",
  "main" : "index.js",
  "scripts" : [
    "index.js"
  ],
  "dependencies" : {},
  "keywords": ["browser","isarray","array"],
  "author": {
    "name": "Julian Gruber",
    "email": "mail@juliangruber.com",
    "url": "http://juliangruber.com"
  },
  "license": "MIT"
}
module.exports = Array.isArray || function (arr) {
  return Object.prototype.toString.call(arr) == '[object Array]';
};
{
  "author": {
    "name": "Julian Gruber",
    "email": "mail@juliangruber.com",
    "url": "http://juliangruber.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Array#isArray for older browsers",
  "devDependencies": {
    "tap": "*"
  },
  "homepage": "https://github.com/juliangruber/isarray",
  "license": "MIT",
  "main": "index.js",
  "name": "isarray",
  "repository": {
    "type": "git",
    "url": "git://github.com/juliangruber/isarray.git"
  },
  "version": "0.0.1"
}
/**
 * Require the given path.
 *
 * @param {String} path
 * @return {Object} exports
 * @api public
 */

function require(path, parent, orig) {
  var resolved = require.resolve(path);

  // lookup failed
  if (null == resolved) {
    orig = orig || path;
    parent = parent || 'root';
    var err = new Error('Failed to require "' + orig + '" from "' + parent + '"');
    err.path = orig;
    err.parent = parent;
    err.require = true;
    throw err;
  }

  var module = require.modules[resolved];

  // perform real require()
  // by invoking the module's
  // registered function
  if (!module.exports) {
    module.exports = {};
    module.client = module.component = true;
    module.call(this, module.exports, require.relative(resolved), module);
  }

  return module.exports;
}

/**
 * Registered modules.
 */

require.modules = {};

/**
 * Registered aliases.
 */

require.aliases = {};

/**
 * Resolve `path`.
 *
 * Lookup:
 *
 *   - PATH/index.js
 *   - PATH.js
 *   - PATH
 *
 * @param {String} path
 * @return {String} path or null
 * @api private
 */

require.resolve = function(path) {
  if (path.charAt(0) === '/') path = path.slice(1);
  var index = path + '/index.js';

  var paths = [
    path,
    path + '.js',
    path + '.json',
    path + '/index.js',
    path + '/index.json'
  ];

  for (var i = 0; i < paths.length; i++) {
    var path = paths[i];
    if (require.modules.hasOwnProperty(path)) return path;
  }

  if (require.aliases.hasOwnProperty(index)) {
    return require.aliases[index];
  }
};

/**
 * Normalize `path` relative to the current path.
 *
 * @param {String} curr
 * @param {String} path
 * @return {String}
 * @api private
 */

require.normalize = function(curr, path) {
  var segs = [];

  if ('.' != path.charAt(0)) return path;

  curr = curr.split('/');
  path = path.split('/');

  for (var i = 0; i < path.length; ++i) {
    if ('..' == path[i]) {
      curr.pop();
    } else if ('.' != path[i] && '' != path[i]) {
      segs.push(path[i]);
    }
  }

  return curr.concat(segs).join('/');
};

/**
 * Register module at `path` with callback `definition`.
 *
 * @param {String} path
 * @param {Function} definition
 * @api private
 */

require.register = function(path, definition) {
  require.modules[path] = definition;
};

/**
 * Alias a module definition.
 *
 * @param {String} from
 * @param {String} to
 * @api private
 */

require.alias = function(from, to) {
  if (!require.modules.hasOwnProperty(from)) {
    throw new Error('Failed to alias "' + from + '", it does not exist');
  }
  require.aliases[to] = from;
};

/**
 * Return a require function relative to the `parent` path.
 *
 * @param {String} parent
 * @return {Function}
 * @api private
 */

require.relative = function(parent) {
  var p = require.normalize(parent, '..');

  /**
   * lastIndexOf helper.
   */

  function lastIndexOf(arr, obj) {
    var i = arr.length;
    while (i--) {
      if (arr[i] === obj) return i;
    }
    return -1;
  }

  /**
   * The relative require() itself.
   */

  function localRequire(path) {
    var resolved = localRequire.resolve(path);
    return require(resolved, parent, path);
  }

  /**
   * Resolve relative to the parent.
   */

  localRequire.resolve = function(path) {
    var c = path.charAt(0);
    if ('/' == c) return path.slice(1);
    if ('.' == c) return require.normalize(p, path);

    // resolve deps by returning
    // the dep in the nearest "deps"
    // directory
    var segs = parent.split('/');
    var i = lastIndexOf(segs, 'deps') + 1;
    if (!i) i = 0;
    path = segs.slice(0, i + 1).join('/') + '/deps/' + path;
    return path;
  };

  /**
   * Check if module is defined at `path`.
   */

  localRequire.exists = function(path) {
    return require.modules.hasOwnProperty(localRequire.resolve(path));
  };

  return localRequire;
};
require.register("isarray/index.js", function(exports, require, module){
module.exports = Array.isArray || function (arr) {
  return Object.prototype.toString.call(arr) == '[object Array]';
};

});
require.alias("isarray/index.js", "isarray/index.js");

Copyright (c) 2019 Garen J. Torikian

MIT License

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "dependencies": {},
  "deprecated": false,
  "description": "Detects if a file is binary in Node.js. Similar to Perl's -B.",
  "devDependencies": {
    "@types/jest": "^23.3.14",
    "@types/node": "^10.17.17",
    "jest": "^25.1.0",
    "prettier": "^1.19.1",
    "release-it": "^12.6.3",
    "ts-jest": "^23.10.5",
    "tslint": "^5.20.1",
    "tslint-config-prettier": "^1.18.0",
    "typescript": "^3.8.3"
  },
  "engines": {
    "node": ">= 8.0.0"
  },
  "files": [
    "lib/**/*"
  ],
  "funding": "https://github.com/sponsors/gjtorikian/",
  "homepage": "https://github.com/gjtorikian/isBinaryFile#readme",
  "license": "MIT",
  "main": "lib/index.js",
  "maintainers": [
    {
      "name": "Garen J. Torikian",
      "email": "gjtorikian@gmail.com"
    }
  ],
  "name": "isbinaryfile",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/gjtorikian/isBinaryFile.git"
  },
  "types": "lib/index.d.ts",
  "version": "4.0.6"
}"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const util_1 = require("util");
const statAsync = util_1.promisify(fs.stat);
const openAsync = util_1.promisify(fs.open);
const closeAsync = util_1.promisify(fs.close);
const MAX_BYTES = 512;
function isBinaryFile(file, size) {
    return __awaiter(this, void 0, void 0, function* () {
        if (isString(file)) {
            const stat = yield statAsync(file);
            isStatFile(stat);
            const fileDescriptor = yield openAsync(file, 'r');
            const allocBuffer = Buffer.alloc(MAX_BYTES);
            // Read the file with no encoding for raw buffer access.
            // NB: something is severely wrong with promisify, had to construct my own Promise
            return new Promise((fulfill, reject) => {
                fs.read(fileDescriptor, allocBuffer, 0, MAX_BYTES, 0, (err, bytesRead, _) => {
                    closeAsync(fileDescriptor);
                    if (err) {
                        reject(err);
                    }
                    else {
                        fulfill(isBinaryCheck(allocBuffer, bytesRead));
                    }
                });
            });
        }
        else {
            if (size === undefined) {
                size = file.length;
            }
            return isBinaryCheck(file, size);
        }
    });
}
exports.isBinaryFile = isBinaryFile;
function isBinaryFileSync(file, size) {
    if (isString(file)) {
        const stat = fs.statSync(file);
        isStatFile(stat);
        const fileDescriptor = fs.openSync(file, 'r');
        const allocBuffer = Buffer.alloc(MAX_BYTES);
        const bytesRead = fs.readSync(fileDescriptor, allocBuffer, 0, MAX_BYTES, 0);
        fs.closeSync(fileDescriptor);
        return isBinaryCheck(allocBuffer, bytesRead);
    }
    else {
        if (size === undefined) {
            size = file.length;
        }
        return isBinaryCheck(file, size);
    }
}
exports.isBinaryFileSync = isBinaryFileSync;
function isBinaryCheck(fileBuffer, bytesRead) {
    // empty file. no clue what it is.
    if (bytesRead === 0) {
        return false;
    }
    let suspiciousBytes = 0;
    const totalBytes = Math.min(bytesRead, MAX_BYTES);
    // UTF-8 BOM
    if (bytesRead >= 3 && fileBuffer[0] === 0xef && fileBuffer[1] === 0xbb && fileBuffer[2] === 0xbf) {
        return false;
    }
    // UTF-32 BOM
    if (bytesRead >= 4 &&
        fileBuffer[0] === 0x00 &&
        fileBuffer[1] === 0x00 &&
        fileBuffer[2] === 0xfe &&
        fileBuffer[3] === 0xff) {
        return false;
    }
    // UTF-32 LE BOM
    if (bytesRead >= 4 &&
        fileBuffer[0] === 0xff &&
        fileBuffer[1] === 0xfe &&
        fileBuffer[2] === 0x00 &&
        fileBuffer[3] === 0x00) {
        return false;
    }
    // GB BOM
    if (bytesRead >= 4 &&
        fileBuffer[0] === 0x84 &&
        fileBuffer[1] === 0x31 &&
        fileBuffer[2] === 0x95 &&
        fileBuffer[3] === 0x33) {
        return false;
    }
    if (totalBytes >= 5 && fileBuffer.slice(0, 5).toString() === '%PDF-') {
        /* PDF. This is binary. */
        return true;
    }
    // UTF-16 BE BOM
    if (bytesRead >= 2 && fileBuffer[0] === 0xfe && fileBuffer[1] === 0xff) {
        return false;
    }
    // UTF-16 LE BOM
    if (bytesRead >= 2 && fileBuffer[0] === 0xff && fileBuffer[1] === 0xfe) {
        return false;
    }
    for (let i = 0; i < totalBytes; i++) {
        if (fileBuffer[i] === 0) {
            // NULL byte--it's binary!
            return true;
        }
        else if ((fileBuffer[i] < 7 || fileBuffer[i] > 14) && (fileBuffer[i] < 32 || fileBuffer[i] > 127)) {
            // UTF-8 detection
            if (fileBuffer[i] > 193 && fileBuffer[i] < 224 && i + 1 < totalBytes) {
                i++;
                if (fileBuffer[i] > 127 && fileBuffer[i] < 192) {
                    continue;
                }
            }
            else if (fileBuffer[i] > 223 && fileBuffer[i] < 240 && i + 2 < totalBytes) {
                i++;
                if (fileBuffer[i] > 127 && fileBuffer[i] < 192 && fileBuffer[i + 1] > 127 && fileBuffer[i + 1] < 192) {
                    i++;
                    continue;
                }
            }
            suspiciousBytes++;
            // Read at least 32 fileBuffer before making a decision
            if (i > 32 && (suspiciousBytes * 100) / totalBytes > 10) {
                return true;
            }
        }
    }
    if ((suspiciousBytes * 100) / totalBytes > 10) {
        return true;
    }
    return false;
}
function isString(x) {
    return typeof x === 'string';
}
function isStatFile(stat) {
    if (!stat.isFile()) {
        throw new Error(`Path provided was not a file!`);
    }
}
The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
var fs = require('fs')
var core
if (process.platform === 'win32' || global.TESTING_WINDOWS) {
  core = require('./windows.js')
} else {
  core = require('./mode.js')
}

module.exports = isexe
isexe.sync = sync

function isexe (path, options, cb) {
  if (typeof options === 'function') {
    cb = options
    options = {}
  }

  if (!cb) {
    if (typeof Promise !== 'function') {
      throw new TypeError('callback not provided')
    }

    return new Promise(function (resolve, reject) {
      isexe(path, options || {}, function (er, is) {
        if (er) {
          reject(er)
        } else {
          resolve(is)
        }
      })
    })
  }

  core(path, options || {}, function (er, is) {
    // ignore EACCES because that just means we aren't allowed to run it
    if (er) {
      if (er.code === 'EACCES' || options && options.ignoreErrors) {
        er = null
        is = false
      }
    }
    cb(er, is)
  })
}

function sync (path, options) {
  // my kingdom for a filtered catch
  try {
    return core.sync(path, options || {})
  } catch (er) {
    if (options && options.ignoreErrors || er.code === 'EACCES') {
      return false
    } else {
      throw er
    }
  }
}
module.exports = isexe
isexe.sync = sync

var fs = require('fs')

function isexe (path, options, cb) {
  fs.stat(path, function (er, stat) {
    cb(er, er ? false : checkStat(stat, options))
  })
}

function sync (path, options) {
  return checkStat(fs.statSync(path), options)
}

function checkStat (stat, options) {
  return stat.isFile() && checkMode(stat, options)
}

function checkMode (stat, options) {
  var mod = stat.mode
  var uid = stat.uid
  var gid = stat.gid

  var myUid = options.uid !== undefined ?
    options.uid : process.getuid && process.getuid()
  var myGid = options.gid !== undefined ?
    options.gid : process.getgid && process.getgid()

  var u = parseInt('100', 8)
  var g = parseInt('010', 8)
  var o = parseInt('001', 8)
  var ug = u | g

  var ret = (mod & o) ||
    (mod & g) && gid === myGid ||
    (mod & u) && uid === myUid ||
    (mod & ug) && myUid === 0

  return ret
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "deprecated": false,
  "description": "Minimal module to check if a file is executable.",
  "devDependencies": {
    "mkdirp": "^0.5.1",
    "rimraf": "^2.5.0",
    "tap": "^10.3.0"
  },
  "directories": {
    "test": "test"
  },
  "homepage": "https://github.com/isaacs/isexe#readme",
  "license": "ISC",
  "main": "index.js",
  "name": "isexe",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/isexe.git"
  },
  "version": "2.0.0"
}module.exports = isexe
isexe.sync = sync

var fs = require('fs')

function checkPathExt (path, options) {
  var pathext = options.pathExt !== undefined ?
    options.pathExt : process.env.PATHEXT

  if (!pathext) {
    return true
  }

  pathext = pathext.split(';')
  if (pathext.indexOf('') !== -1) {
    return true
  }
  for (var i = 0; i < pathext.length; i++) {
    var p = pathext[i].toLowerCase()
    if (p && path.substr(-p.length).toLowerCase() === p) {
      return true
    }
  }
  return false
}

function checkStat (stat, path, options) {
  if (!stat.isSymbolicLink() && !stat.isFile()) {
    return false
  }
  return checkPathExt(path, options)
}

function isexe (path, options, cb) {
  fs.stat(path, function (er, stat) {
    cb(er, er ? false : checkStat(stat, path, options))
  })
}

function sync (path, options) {
  return checkStat(fs.statSync(path), path, options)
}
The MIT License (MIT)
=====================

Copyright (c) 2015 Rod Vagg
---------------------------

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
var stream = require('stream')


function isStream (obj) {
  return obj instanceof stream.Stream
}


function isReadable (obj) {
  return isStream(obj) && typeof obj._read == 'function' && typeof obj._readableState == 'object'
}


function isWritable (obj) {
  return isStream(obj) && typeof obj._write == 'function' && typeof obj._writableState == 'object'
}


function isDuplex (obj) {
  return isReadable(obj) && isWritable(obj)
}


module.exports            = isStream
module.exports.isReadable = isReadable
module.exports.isWritable = isWritable
module.exports.isDuplex   = isDuplex
{
  "author": {
    "name": "Rod Vagg",
    "email": "rod@vagg.org"
  },
  "deprecated": false,
  "description": "Determine if an object is a Stream",
  "devDependencies": {
    "core-util-is": "~1.0.0",
    "inherits": "~2.0.1",
    "isarray": "0.0.1",
    "string_decoder": "~0.10.x",
    "tape": "~2.12.3"
  },
  "homepage": "https://github.com/rvagg/isstream",
  "license": "MIT",
  "main": "isstream.js",
  "name": "isstream",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/rvagg/isstream.git"
  },
  "version": "0.1.2"
}(The MIT License)

Copyright (C) 2011-2015 by Vitaly Puzrin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'use strict';


var yaml = require('./lib/js-yaml.js');


module.exports = yaml;
{
  "author": {
    "name": "Vladimir Zapparov",
    "email": "dervus.grim@gmail.com"
  },
  "bin": {
    "js-yaml": "bin/js-yaml.js"
  },
  "dependencies": {
    "argparse": "^1.0.7",
    "esprima": "^4.0.0"
  },
  "deprecated": false,
  "description": "YAML 1.2 parser and serializer",
  "devDependencies": {
    "ansi": "^0.3.1",
    "benchmark": "^2.1.4",
    "browserify": "^16.2.2",
    "codemirror": "^5.13.4",
    "eslint": "^7.0.0",
    "fast-check": "^1.24.2",
    "istanbul": "^0.4.5",
    "mocha": "^7.1.2",
    "uglify-js": "^3.0.1"
  },
  "files": [
    "index.js",
    "lib/",
    "bin/",
    "dist/"
  ],
  "homepage": "https://github.com/nodeca/js-yaml",
  "jsdelivr": "dist/js-yaml.min.js",
  "license": "MIT",
  "name": "js-yaml",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/nodeca/js-yaml.git"
  },
  "unpkg": "dist/js-yaml.min.js",
  "version": "3.14.0"
}'use strict';


var loader = require('./js-yaml/loader');
var dumper = require('./js-yaml/dumper');


function deprecated(name) {
  return function () {
    throw new Error('Function ' + name + ' is deprecated and cannot be used.');
  };
}


module.exports.Type                = require('./js-yaml/type');
module.exports.Schema              = require('./js-yaml/schema');
module.exports.FAILSAFE_SCHEMA     = require('./js-yaml/schema/failsafe');
module.exports.JSON_SCHEMA         = require('./js-yaml/schema/json');
module.exports.CORE_SCHEMA         = require('./js-yaml/schema/core');
module.exports.DEFAULT_SAFE_SCHEMA = require('./js-yaml/schema/default_safe');
module.exports.DEFAULT_FULL_SCHEMA = require('./js-yaml/schema/default_full');
module.exports.load                = loader.load;
module.exports.loadAll             = loader.loadAll;
module.exports.safeLoad            = loader.safeLoad;
module.exports.safeLoadAll         = loader.safeLoadAll;
module.exports.dump                = dumper.dump;
module.exports.safeDump            = dumper.safeDump;
module.exports.YAMLException       = require('./js-yaml/exception');

// Deprecated schema names from JS-YAML 2.0.x
module.exports.MINIMAL_SCHEMA = require('./js-yaml/schema/failsafe');
module.exports.SAFE_SCHEMA    = require('./js-yaml/schema/default_safe');
module.exports.DEFAULT_SCHEMA = require('./js-yaml/schema/default_full');

// Deprecated functions from JS-YAML 1.x.x
module.exports.scan           = deprecated('scan');
module.exports.parse          = deprecated('parse');
module.exports.compose        = deprecated('compose');
module.exports.addConstructor = deprecated('addConstructor');
'use strict';


function isNothing(subject) {
  return (typeof subject === 'undefined') || (subject === null);
}


function isObject(subject) {
  return (typeof subject === 'object') && (subject !== null);
}


function toArray(sequence) {
  if (Array.isArray(sequence)) return sequence;
  else if (isNothing(sequence)) return [];

  return [ sequence ];
}


function extend(target, source) {
  var index, length, key, sourceKeys;

  if (source) {
    sourceKeys = Object.keys(source);

    for (index = 0, length = sourceKeys.length; index < length; index += 1) {
      key = sourceKeys[index];
      target[key] = source[key];
    }
  }

  return target;
}


function repeat(string, count) {
  var result = '', cycle;

  for (cycle = 0; cycle < count; cycle += 1) {
    result += string;
  }

  return result;
}


function isNegativeZero(number) {
  return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);
}


module.exports.isNothing      = isNothing;
module.exports.isObject       = isObject;
module.exports.toArray        = toArray;
module.exports.repeat         = repeat;
module.exports.isNegativeZero = isNegativeZero;
module.exports.extend         = extend;
'use strict';

/*eslint-disable no-use-before-define*/

var common              = require('./common');
var YAMLException       = require('./exception');
var DEFAULT_FULL_SCHEMA = require('./schema/default_full');
var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe');

var _toString       = Object.prototype.toString;
var _hasOwnProperty = Object.prototype.hasOwnProperty;

var CHAR_TAB                  = 0x09; /* Tab */
var CHAR_LINE_FEED            = 0x0A; /* LF */
var CHAR_CARRIAGE_RETURN      = 0x0D; /* CR */
var CHAR_SPACE                = 0x20; /* Space */
var CHAR_EXCLAMATION          = 0x21; /* ! */
var CHAR_DOUBLE_QUOTE         = 0x22; /* " */
var CHAR_SHARP                = 0x23; /* # */
var CHAR_PERCENT              = 0x25; /* % */
var CHAR_AMPERSAND            = 0x26; /* & */
var CHAR_SINGLE_QUOTE         = 0x27; /* ' */
var CHAR_ASTERISK             = 0x2A; /* * */
var CHAR_COMMA                = 0x2C; /* , */
var CHAR_MINUS                = 0x2D; /* - */
var CHAR_COLON                = 0x3A; /* : */
var CHAR_EQUALS               = 0x3D; /* = */
var CHAR_GREATER_THAN         = 0x3E; /* > */
var CHAR_QUESTION             = 0x3F; /* ? */
var CHAR_COMMERCIAL_AT        = 0x40; /* @ */
var CHAR_LEFT_SQUARE_BRACKET  = 0x5B; /* [ */
var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */
var CHAR_GRAVE_ACCENT         = 0x60; /* ` */
var CHAR_LEFT_CURLY_BRACKET   = 0x7B; /* { */
var CHAR_VERTICAL_LINE        = 0x7C; /* | */
var CHAR_RIGHT_CURLY_BRACKET  = 0x7D; /* } */

var ESCAPE_SEQUENCES = {};

ESCAPE_SEQUENCES[0x00]   = '\\0';
ESCAPE_SEQUENCES[0x07]   = '\\a';
ESCAPE_SEQUENCES[0x08]   = '\\b';
ESCAPE_SEQUENCES[0x09]   = '\\t';
ESCAPE_SEQUENCES[0x0A]   = '\\n';
ESCAPE_SEQUENCES[0x0B]   = '\\v';
ESCAPE_SEQUENCES[0x0C]   = '\\f';
ESCAPE_SEQUENCES[0x0D]   = '\\r';
ESCAPE_SEQUENCES[0x1B]   = '\\e';
ESCAPE_SEQUENCES[0x22]   = '\\"';
ESCAPE_SEQUENCES[0x5C]   = '\\\\';
ESCAPE_SEQUENCES[0x85]   = '\\N';
ESCAPE_SEQUENCES[0xA0]   = '\\_';
ESCAPE_SEQUENCES[0x2028] = '\\L';
ESCAPE_SEQUENCES[0x2029] = '\\P';

var DEPRECATED_BOOLEANS_SYNTAX = [
  'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',
  'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'
];

function compileStyleMap(schema, map) {
  var result, keys, index, length, tag, style, type;

  if (map === null) return {};

  result = {};
  keys = Object.keys(map);

  for (index = 0, length = keys.length; index < length; index += 1) {
    tag = keys[index];
    style = String(map[tag]);

    if (tag.slice(0, 2) === '!!') {
      tag = 'tag:yaml.org,2002:' + tag.slice(2);
    }
    type = schema.compiledTypeMap['fallback'][tag];

    if (type && _hasOwnProperty.call(type.styleAliases, style)) {
      style = type.styleAliases[style];
    }

    result[tag] = style;
  }

  return result;
}

function encodeHex(character) {
  var string, handle, length;

  string = character.toString(16).toUpperCase();

  if (character <= 0xFF) {
    handle = 'x';
    length = 2;
  } else if (character <= 0xFFFF) {
    handle = 'u';
    length = 4;
  } else if (character <= 0xFFFFFFFF) {
    handle = 'U';
    length = 8;
  } else {
    throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF');
  }

  return '\\' + handle + common.repeat('0', length - string.length) + string;
}

function State(options) {
  this.schema        = options['schema'] || DEFAULT_FULL_SCHEMA;
  this.indent        = Math.max(1, (options['indent'] || 2));
  this.noArrayIndent = options['noArrayIndent'] || false;
  this.skipInvalid   = options['skipInvalid'] || false;
  this.flowLevel     = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);
  this.styleMap      = compileStyleMap(this.schema, options['styles'] || null);
  this.sortKeys      = options['sortKeys'] || false;
  this.lineWidth     = options['lineWidth'] || 80;
  this.noRefs        = options['noRefs'] || false;
  this.noCompatMode  = options['noCompatMode'] || false;
  this.condenseFlow  = options['condenseFlow'] || false;

  this.implicitTypes = this.schema.compiledImplicit;
  this.explicitTypes = this.schema.compiledExplicit;

  this.tag = null;
  this.result = '';

  this.duplicates = [];
  this.usedDuplicates = null;
}

// Indents every line in a string. Empty lines (\n only) are not indented.
function indentString(string, spaces) {
  var ind = common.repeat(' ', spaces),
      position = 0,
      next = -1,
      result = '',
      line,
      length = string.length;

  while (position < length) {
    next = string.indexOf('\n', position);
    if (next === -1) {
      line = string.slice(position);
      position = length;
    } else {
      line = string.slice(position, next + 1);
      position = next + 1;
    }

    if (line.length && line !== '\n') result += ind;

    result += line;
  }

  return result;
}

function generateNextLine(state, level) {
  return '\n' + common.repeat(' ', state.indent * level);
}

function testImplicitResolving(state, str) {
  var index, length, type;

  for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {
    type = state.implicitTypes[index];

    if (type.resolve(str)) {
      return true;
    }
  }

  return false;
}

// [33] s-white ::= s-space | s-tab
function isWhitespace(c) {
  return c === CHAR_SPACE || c === CHAR_TAB;
}

// Returns true if the character can be printed without escaping.
// From YAML 1.2: "any allowed characters known to be non-printable
// should also be escaped. [However,] This isnâ€™t mandatory"
// Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029.
function isPrintable(c) {
  return  (0x00020 <= c && c <= 0x00007E)
      || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)
      || ((0x0E000 <= c && c <= 0x00FFFD) && c !== 0xFEFF /* BOM */)
      ||  (0x10000 <= c && c <= 0x10FFFF);
}

// [34] ns-char ::= nb-char - s-white
// [27] nb-char ::= c-printable - b-char - c-byte-order-mark
// [26] b-char  ::= b-line-feed | b-carriage-return
// [24] b-line-feed       ::=     #xA    /* LF */
// [25] b-carriage-return ::=     #xD    /* CR */
// [3]  c-byte-order-mark ::=     #xFEFF
function isNsChar(c) {
  return isPrintable(c) && !isWhitespace(c)
    // byte-order-mark
    && c !== 0xFEFF
    // b-char
    && c !== CHAR_CARRIAGE_RETURN
    && c !== CHAR_LINE_FEED;
}

// Simplified test for values allowed after the first character in plain style.
function isPlainSafe(c, prev) {
  // Uses a subset of nb-char - c-flow-indicator - ":" - "#"
  // where nb-char ::= c-printable - b-char - c-byte-order-mark.
  return isPrintable(c) && c !== 0xFEFF
    // - c-flow-indicator
    && c !== CHAR_COMMA
    && c !== CHAR_LEFT_SQUARE_BRACKET
    && c !== CHAR_RIGHT_SQUARE_BRACKET
    && c !== CHAR_LEFT_CURLY_BRACKET
    && c !== CHAR_RIGHT_CURLY_BRACKET
    // - ":" - "#"
    // /* An ns-char preceding */ "#"
    && c !== CHAR_COLON
    && ((c !== CHAR_SHARP) || (prev && isNsChar(prev)));
}

// Simplified test for values allowed as the first character in plain style.
function isPlainSafeFirst(c) {
  // Uses a subset of ns-char - c-indicator
  // where ns-char = nb-char - s-white.
  return isPrintable(c) && c !== 0xFEFF
    && !isWhitespace(c) // - s-white
    // - (c-indicator ::=
    // â€œ-â€� | â€œ?â€� | â€œ:â€� | â€œ,â€� | â€œ[â€� | â€œ]â€� | â€œ{â€� | â€œ}â€�
    && c !== CHAR_MINUS
    && c !== CHAR_QUESTION
    && c !== CHAR_COLON
    && c !== CHAR_COMMA
    && c !== CHAR_LEFT_SQUARE_BRACKET
    && c !== CHAR_RIGHT_SQUARE_BRACKET
    && c !== CHAR_LEFT_CURLY_BRACKET
    && c !== CHAR_RIGHT_CURLY_BRACKET
    // | â€œ#â€� | â€œ&â€� | â€œ*â€� | â€œ!â€� | â€œ|â€� | â€œ=â€� | â€œ>â€� | â€œ'â€� | â€œ"â€�
    && c !== CHAR_SHARP
    && c !== CHAR_AMPERSAND
    && c !== CHAR_ASTERISK
    && c !== CHAR_EXCLAMATION
    && c !== CHAR_VERTICAL_LINE
    && c !== CHAR_EQUALS
    && c !== CHAR_GREATER_THAN
    && c !== CHAR_SINGLE_QUOTE
    && c !== CHAR_DOUBLE_QUOTE
    // | â€œ%â€� | â€œ@â€� | â€œ`â€�)
    && c !== CHAR_PERCENT
    && c !== CHAR_COMMERCIAL_AT
    && c !== CHAR_GRAVE_ACCENT;
}

// Determines whether block indentation indicator is required.
function needIndentIndicator(string) {
  var leadingSpaceRe = /^\n* /;
  return leadingSpaceRe.test(string);
}

var STYLE_PLAIN   = 1,
    STYLE_SINGLE  = 2,
    STYLE_LITERAL = 3,
    STYLE_FOLDED  = 4,
    STYLE_DOUBLE  = 5;

// Determines which scalar styles are possible and returns the preferred style.
// lineWidth = -1 => no limit.
// Pre-conditions: str.length > 0.
// Post-conditions:
//    STYLE_PLAIN or STYLE_SINGLE => no \n are in the string.
//    STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).
//    STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).
function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) {
  var i;
  var char, prev_char;
  var hasLineBreak = false;
  var hasFoldableLine = false; // only checked if shouldTrackWidth
  var shouldTrackWidth = lineWidth !== -1;
  var previousLineBreak = -1; // count the first line correctly
  var plain = isPlainSafeFirst(string.charCodeAt(0))
          && !isWhitespace(string.charCodeAt(string.length - 1));

  if (singleLineOnly) {
    // Case: no block styles.
    // Check for disallowed characters to rule out plain and single.
    for (i = 0; i < string.length; i++) {
      char = string.charCodeAt(i);
      if (!isPrintable(char)) {
        return STYLE_DOUBLE;
      }
      prev_char = i > 0 ? string.charCodeAt(i - 1) : null;
      plain = plain && isPlainSafe(char, prev_char);
    }
  } else {
    // Case: block styles permitted.
    for (i = 0; i < string.length; i++) {
      char = string.charCodeAt(i);
      if (char === CHAR_LINE_FEED) {
        hasLineBreak = true;
        // Check if any line can be folded.
        if (shouldTrackWidth) {
          hasFoldableLine = hasFoldableLine ||
            // Foldable line = too long, and not more-indented.
            (i - previousLineBreak - 1 > lineWidth &&
             string[previousLineBreak + 1] !== ' ');
          previousLineBreak = i;
        }
      } else if (!isPrintable(char)) {
        return STYLE_DOUBLE;
      }
      prev_char = i > 0 ? string.charCodeAt(i - 1) : null;
      plain = plain && isPlainSafe(char, prev_char);
    }
    // in case the end is missing a \n
    hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&
      (i - previousLineBreak - 1 > lineWidth &&
       string[previousLineBreak + 1] !== ' '));
  }
  // Although every style can represent \n without escaping, prefer block styles
  // for multiline, since they're more readable and they don't add empty lines.
  // Also prefer folding a super-long line.
  if (!hasLineBreak && !hasFoldableLine) {
    // Strings interpretable as another type have to be quoted;
    // e.g. the string 'true' vs. the boolean true.
    return plain && !testAmbiguousType(string)
      ? STYLE_PLAIN : STYLE_SINGLE;
  }
  // Edge case: block indentation indicator can only have one digit.
  if (indentPerLevel > 9 && needIndentIndicator(string)) {
    return STYLE_DOUBLE;
  }
  // At this point we know block styles are valid.
  // Prefer literal style unless we want to fold.
  return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;
}

// Note: line breaking/folding is implemented for only the folded style.
// NB. We drop the last trailing newline (if any) of a returned block scalar
//  since the dumper adds its own newline. This always works:
//    â€¢ No ending newline => unaffected; already using strip "-" chomping.
//    â€¢ Ending newline    => removed then restored.
//  Importantly, this keeps the "+" chomp indicator from gaining an extra line.
function writeScalar(state, string, level, iskey) {
  state.dump = (function () {
    if (string.length === 0) {
      return "''";
    }
    if (!state.noCompatMode &&
        DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) {
      return "'" + string + "'";
    }

    var indent = state.indent * Math.max(1, level); // no 0-indent scalars
    // As indentation gets deeper, let the width decrease monotonically
    // to the lower bound min(state.lineWidth, 40).
    // Note that this implies
    //  state.lineWidth â‰¤ 40 + state.indent: width is fixed at the lower bound.
    //  state.lineWidth > 40 + state.indent: width decreases until the lower bound.
    // This behaves better than a constant minimum width which disallows narrower options,
    // or an indent threshold which causes the width to suddenly increase.
    var lineWidth = state.lineWidth === -1
      ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);

    // Without knowing if keys are implicit/explicit, assume implicit for safety.
    var singleLineOnly = iskey
      // No block styles in flow mode.
      || (state.flowLevel > -1 && level >= state.flowLevel);
    function testAmbiguity(string) {
      return testImplicitResolving(state, string);
    }

    switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) {
      case STYLE_PLAIN:
        return string;
      case STYLE_SINGLE:
        return "'" + string.replace(/'/g, "''") + "'";
      case STYLE_LITERAL:
        return '|' + blockHeader(string, state.indent)
          + dropEndingNewline(indentString(string, indent));
      case STYLE_FOLDED:
        return '>' + blockHeader(string, state.indent)
          + dropEndingNewline(indentString(foldString(string, lineWidth), indent));
      case STYLE_DOUBLE:
        return '"' + escapeString(string, lineWidth) + '"';
      default:
        throw new YAMLException('impossible error: invalid scalar style');
    }
  }());
}

// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.
function blockHeader(string, indentPerLevel) {
  var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';

  // note the special case: the string '\n' counts as a "trailing" empty line.
  var clip =          string[string.length - 1] === '\n';
  var keep = clip && (string[string.length - 2] === '\n' || string === '\n');
  var chomp = keep ? '+' : (clip ? '' : '-');

  return indentIndicator + chomp + '\n';
}

// (See the note for writeScalar.)
function dropEndingNewline(string) {
  return string[string.length - 1] === '\n' ? string.slice(0, -1) : string;
}

// Note: a long line without a suitable break point will exceed the width limit.
// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.
function foldString(string, width) {
  // In folded style, $k$ consecutive newlines output as $k+1$ newlinesâ€”
  // unless they're before or after a more-indented line, or at the very
  // beginning or end, in which case $k$ maps to $k$.
  // Therefore, parse each chunk as newline(s) followed by a content line.
  var lineRe = /(\n+)([^\n]*)/g;

  // first line (possibly an empty line)
  var result = (function () {
    var nextLF = string.indexOf('\n');
    nextLF = nextLF !== -1 ? nextLF : string.length;
    lineRe.lastIndex = nextLF;
    return foldLine(string.slice(0, nextLF), width);
  }());
  // If we haven't reached the first content line yet, don't add an extra \n.
  var prevMoreIndented = string[0] === '\n' || string[0] === ' ';
  var moreIndented;

  // rest of the lines
  var match;
  while ((match = lineRe.exec(string))) {
    var prefix = match[1], line = match[2];
    moreIndented = (line[0] === ' ');
    result += prefix
      + (!prevMoreIndented && !moreIndented && line !== ''
        ? '\n' : '')
      + foldLine(line, width);
    prevMoreIndented = moreIndented;
  }

  return result;
}

// Greedy line breaking.
// Picks the longest line under the limit each time,
// otherwise settles for the shortest line over the limit.
// NB. More-indented lines *cannot* be folded, as that would add an extra \n.
function foldLine(line, width) {
  if (line === '' || line[0] === ' ') return line;

  // Since a more-indented line adds a \n, breaks can't be followed by a space.
  var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.
  var match;
  // start is an inclusive index. end, curr, and next are exclusive.
  var start = 0, end, curr = 0, next = 0;
  var result = '';

  // Invariants: 0 <= start <= length-1.
  //   0 <= curr <= next <= max(0, length-2). curr - start <= width.
  // Inside the loop:
  //   A match implies length >= 2, so curr and next are <= length-2.
  while ((match = breakRe.exec(line))) {
    next = match.index;
    // maintain invariant: curr - start <= width
    if (next - start > width) {
      end = (curr > start) ? curr : next; // derive end <= length-2
      result += '\n' + line.slice(start, end);
      // skip the space that was output as \n
      start = end + 1;                    // derive start <= length-1
    }
    curr = next;
  }

  // By the invariants, start <= length-1, so there is something left over.
  // It is either the whole string or a part starting from non-whitespace.
  result += '\n';
  // Insert a break if the remainder is too long and there is a break available.
  if (line.length - start > width && curr > start) {
    result += line.slice(start, curr) + '\n' + line.slice(curr + 1);
  } else {
    result += line.slice(start);
  }

  return result.slice(1); // drop extra \n joiner
}

// Escapes a double-quoted string.
function escapeString(string) {
  var result = '';
  var char, nextChar;
  var escapeSeq;

  for (var i = 0; i < string.length; i++) {
    char = string.charCodeAt(i);
    // Check for surrogate pairs (reference Unicode 3.0 section "3.7 Surrogates").
    if (char >= 0xD800 && char <= 0xDBFF/* high surrogate */) {
      nextChar = string.charCodeAt(i + 1);
      if (nextChar >= 0xDC00 && nextChar <= 0xDFFF/* low surrogate */) {
        // Combine the surrogate pair and store it escaped.
        result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000);
        // Advance index one extra since we already used that char here.
        i++; continue;
      }
    }
    escapeSeq = ESCAPE_SEQUENCES[char];
    result += !escapeSeq && isPrintable(char)
      ? string[i]
      : escapeSeq || encodeHex(char);
  }

  return result;
}

function writeFlowSequence(state, level, object) {
  var _result = '',
      _tag    = state.tag,
      index,
      length;

  for (index = 0, length = object.length; index < length; index += 1) {
    // Write only valid elements.
    if (writeNode(state, level, object[index], false, false)) {
      if (index !== 0) _result += ',' + (!state.condenseFlow ? ' ' : '');
      _result += state.dump;
    }
  }

  state.tag = _tag;
  state.dump = '[' + _result + ']';
}

function writeBlockSequence(state, level, object, compact) {
  var _result = '',
      _tag    = state.tag,
      index,
      length;

  for (index = 0, length = object.length; index < length; index += 1) {
    // Write only valid elements.
    if (writeNode(state, level + 1, object[index], true, true)) {
      if (!compact || index !== 0) {
        _result += generateNextLine(state, level);
      }

      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
        _result += '-';
      } else {
        _result += '- ';
      }

      _result += state.dump;
    }
  }

  state.tag = _tag;
  state.dump = _result || '[]'; // Empty sequence if no valid values.
}

function writeFlowMapping(state, level, object) {
  var _result       = '',
      _tag          = state.tag,
      objectKeyList = Object.keys(object),
      index,
      length,
      objectKey,
      objectValue,
      pairBuffer;

  for (index = 0, length = objectKeyList.length; index < length; index += 1) {

    pairBuffer = '';
    if (index !== 0) pairBuffer += ', ';

    if (state.condenseFlow) pairBuffer += '"';

    objectKey = objectKeyList[index];
    objectValue = object[objectKey];

    if (!writeNode(state, level, objectKey, false, false)) {
      continue; // Skip this pair because of invalid key;
    }

    if (state.dump.length > 1024) pairBuffer += '? ';

    pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' ');

    if (!writeNode(state, level, objectValue, false, false)) {
      continue; // Skip this pair because of invalid value.
    }

    pairBuffer += state.dump;

    // Both key and value are valid.
    _result += pairBuffer;
  }

  state.tag = _tag;
  state.dump = '{' + _result + '}';
}

function writeBlockMapping(state, level, object, compact) {
  var _result       = '',
      _tag          = state.tag,
      objectKeyList = Object.keys(object),
      index,
      length,
      objectKey,
      objectValue,
      explicitPair,
      pairBuffer;

  // Allow sorting keys so that the output file is deterministic
  if (state.sortKeys === true) {
    // Default sorting
    objectKeyList.sort();
  } else if (typeof state.sortKeys === 'function') {
    // Custom sort function
    objectKeyList.sort(state.sortKeys);
  } else if (state.sortKeys) {
    // Something is wrong
    throw new YAMLException('sortKeys must be a boolean or a function');
  }

  for (index = 0, length = objectKeyList.length; index < length; index += 1) {
    pairBuffer = '';

    if (!compact || index !== 0) {
      pairBuffer += generateNextLine(state, level);
    }

    objectKey = objectKeyList[index];
    objectValue = object[objectKey];

    if (!writeNode(state, level + 1, objectKey, true, true, true)) {
      continue; // Skip this pair because of invalid key.
    }

    explicitPair = (state.tag !== null && state.tag !== '?') ||
                   (state.dump && state.dump.length > 1024);

    if (explicitPair) {
      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
        pairBuffer += '?';
      } else {
        pairBuffer += '? ';
      }
    }

    pairBuffer += state.dump;

    if (explicitPair) {
      pairBuffer += generateNextLine(state, level);
    }

    if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {
      continue; // Skip this pair because of invalid value.
    }

    if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
      pairBuffer += ':';
    } else {
      pairBuffer += ': ';
    }

    pairBuffer += state.dump;

    // Both key and value are valid.
    _result += pairBuffer;
  }

  state.tag = _tag;
  state.dump = _result || '{}'; // Empty mapping if no valid pairs.
}

function detectType(state, object, explicit) {
  var _result, typeList, index, length, type, style;

  typeList = explicit ? state.explicitTypes : state.implicitTypes;

  for (index = 0, length = typeList.length; index < length; index += 1) {
    type = typeList[index];

    if ((type.instanceOf  || type.predicate) &&
        (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&
        (!type.predicate  || type.predicate(object))) {

      state.tag = explicit ? type.tag : '?';

      if (type.represent) {
        style = state.styleMap[type.tag] || type.defaultStyle;

        if (_toString.call(type.represent) === '[object Function]') {
          _result = type.represent(object, style);
        } else if (_hasOwnProperty.call(type.represent, style)) {
          _result = type.represent[style](object, style);
        } else {
          throw new YAMLException('!<' + type.tag + '> tag resolver accepts not "' + style + '" style');
        }

        state.dump = _result;
      }

      return true;
    }
  }

  return false;
}

// Serializes `object` and writes it to global `result`.
// Returns true on success, or false on invalid object.
//
function writeNode(state, level, object, block, compact, iskey) {
  state.tag = null;
  state.dump = object;

  if (!detectType(state, object, false)) {
    detectType(state, object, true);
  }

  var type = _toString.call(state.dump);

  if (block) {
    block = (state.flowLevel < 0 || state.flowLevel > level);
  }

  var objectOrArray = type === '[object Object]' || type === '[object Array]',
      duplicateIndex,
      duplicate;

  if (objectOrArray) {
    duplicateIndex = state.duplicates.indexOf(object);
    duplicate = duplicateIndex !== -1;
  }

  if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {
    compact = false;
  }

  if (duplicate && state.usedDuplicates[duplicateIndex]) {
    state.dump = '*ref_' + duplicateIndex;
  } else {
    if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {
      state.usedDuplicates[duplicateIndex] = true;
    }
    if (type === '[object Object]') {
      if (block && (Object.keys(state.dump).length !== 0)) {
        writeBlockMapping(state, level, state.dump, compact);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + state.dump;
        }
      } else {
        writeFlowMapping(state, level, state.dump);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
        }
      }
    } else if (type === '[object Array]') {
      var arrayLevel = (state.noArrayIndent && (level > 0)) ? level - 1 : level;
      if (block && (state.dump.length !== 0)) {
        writeBlockSequence(state, arrayLevel, state.dump, compact);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + state.dump;
        }
      } else {
        writeFlowSequence(state, arrayLevel, state.dump);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
        }
      }
    } else if (type === '[object String]') {
      if (state.tag !== '?') {
        writeScalar(state, state.dump, level, iskey);
      }
    } else {
      if (state.skipInvalid) return false;
      throw new YAMLException('unacceptable kind of an object to dump ' + type);
    }

    if (state.tag !== null && state.tag !== '?') {
      state.dump = '!<' + state.tag + '> ' + state.dump;
    }
  }

  return true;
}

function getDuplicateReferences(object, state) {
  var objects = [],
      duplicatesIndexes = [],
      index,
      length;

  inspectNode(object, objects, duplicatesIndexes);

  for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {
    state.duplicates.push(objects[duplicatesIndexes[index]]);
  }
  state.usedDuplicates = new Array(length);
}

function inspectNode(object, objects, duplicatesIndexes) {
  var objectKeyList,
      index,
      length;

  if (object !== null && typeof object === 'object') {
    index = objects.indexOf(object);
    if (index !== -1) {
      if (duplicatesIndexes.indexOf(index) === -1) {
        duplicatesIndexes.push(index);
      }
    } else {
      objects.push(object);

      if (Array.isArray(object)) {
        for (index = 0, length = object.length; index < length; index += 1) {
          inspectNode(object[index], objects, duplicatesIndexes);
        }
      } else {
        objectKeyList = Object.keys(object);

        for (index = 0, length = objectKeyList.length; index < length; index += 1) {
          inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);
        }
      }
    }
  }
}

function dump(input, options) {
  options = options || {};

  var state = new State(options);

  if (!state.noRefs) getDuplicateReferences(input, state);

  if (writeNode(state, 0, input, true, true)) return state.dump + '\n';

  return '';
}

function safeDump(input, options) {
  return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
}

module.exports.dump     = dump;
module.exports.safeDump = safeDump;
// YAML error class. http://stackoverflow.com/questions/8458984
//
'use strict';

function YAMLException(reason, mark) {
  // Super constructor
  Error.call(this);

  this.name = 'YAMLException';
  this.reason = reason;
  this.mark = mark;
  this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : '');

  // Include stack trace in error object
  if (Error.captureStackTrace) {
    // Chrome and NodeJS
    Error.captureStackTrace(this, this.constructor);
  } else {
    // FF, IE 10+ and Safari 6+. Fallback for others
    this.stack = (new Error()).stack || '';
  }
}


// Inherit from Error
YAMLException.prototype = Object.create(Error.prototype);
YAMLException.prototype.constructor = YAMLException;


YAMLException.prototype.toString = function toString(compact) {
  var result = this.name + ': ';

  result += this.reason || '(unknown reason)';

  if (!compact && this.mark) {
    result += ' ' + this.mark.toString();
  }

  return result;
};


module.exports = YAMLException;
'use strict';

/*eslint-disable max-len,no-use-before-define*/

var common              = require('./common');
var YAMLException       = require('./exception');
var Mark                = require('./mark');
var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe');
var DEFAULT_FULL_SCHEMA = require('./schema/default_full');


var _hasOwnProperty = Object.prototype.hasOwnProperty;


var CONTEXT_FLOW_IN   = 1;
var CONTEXT_FLOW_OUT  = 2;
var CONTEXT_BLOCK_IN  = 3;
var CONTEXT_BLOCK_OUT = 4;


var CHOMPING_CLIP  = 1;
var CHOMPING_STRIP = 2;
var CHOMPING_KEEP  = 3;


var PATTERN_NON_PRINTABLE         = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/;
var PATTERN_FLOW_INDICATORS       = /[,\[\]\{\}]/;
var PATTERN_TAG_HANDLE            = /^(?:!|!!|![a-z\-]+!)$/i;
var PATTERN_TAG_URI               = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;


function _class(obj) { return Object.prototype.toString.call(obj); }

function is_EOL(c) {
  return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);
}

function is_WHITE_SPACE(c) {
  return (c === 0x09/* Tab */) || (c === 0x20/* Space */);
}

function is_WS_OR_EOL(c) {
  return (c === 0x09/* Tab */) ||
         (c === 0x20/* Space */) ||
         (c === 0x0A/* LF */) ||
         (c === 0x0D/* CR */);
}

function is_FLOW_INDICATOR(c) {
  return c === 0x2C/* , */ ||
         c === 0x5B/* [ */ ||
         c === 0x5D/* ] */ ||
         c === 0x7B/* { */ ||
         c === 0x7D/* } */;
}

function fromHexCode(c) {
  var lc;

  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
    return c - 0x30;
  }

  /*eslint-disable no-bitwise*/
  lc = c | 0x20;

  if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {
    return lc - 0x61 + 10;
  }

  return -1;
}

function escapedHexLen(c) {
  if (c === 0x78/* x */) { return 2; }
  if (c === 0x75/* u */) { return 4; }
  if (c === 0x55/* U */) { return 8; }
  return 0;
}

function fromDecimalCode(c) {
  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
    return c - 0x30;
  }

  return -1;
}

function simpleEscapeSequence(c) {
  /* eslint-disable indent */
  return (c === 0x30/* 0 */) ? '\x00' :
        (c === 0x61/* a */) ? '\x07' :
        (c === 0x62/* b */) ? '\x08' :
        (c === 0x74/* t */) ? '\x09' :
        (c === 0x09/* Tab */) ? '\x09' :
        (c === 0x6E/* n */) ? '\x0A' :
        (c === 0x76/* v */) ? '\x0B' :
        (c === 0x66/* f */) ? '\x0C' :
        (c === 0x72/* r */) ? '\x0D' :
        (c === 0x65/* e */) ? '\x1B' :
        (c === 0x20/* Space */) ? ' ' :
        (c === 0x22/* " */) ? '\x22' :
        (c === 0x2F/* / */) ? '/' :
        (c === 0x5C/* \ */) ? '\x5C' :
        (c === 0x4E/* N */) ? '\x85' :
        (c === 0x5F/* _ */) ? '\xA0' :
        (c === 0x4C/* L */) ? '\u2028' :
        (c === 0x50/* P */) ? '\u2029' : '';
}

function charFromCodepoint(c) {
  if (c <= 0xFFFF) {
    return String.fromCharCode(c);
  }
  // Encode UTF-16 surrogate pair
  // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF
  return String.fromCharCode(
    ((c - 0x010000) >> 10) + 0xD800,
    ((c - 0x010000) & 0x03FF) + 0xDC00
  );
}

var simpleEscapeCheck = new Array(256); // integer, for fast access
var simpleEscapeMap = new Array(256);
for (var i = 0; i < 256; i++) {
  simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;
  simpleEscapeMap[i] = simpleEscapeSequence(i);
}


function State(input, options) {
  this.input = input;

  this.filename  = options['filename']  || null;
  this.schema    = options['schema']    || DEFAULT_FULL_SCHEMA;
  this.onWarning = options['onWarning'] || null;
  this.legacy    = options['legacy']    || false;
  this.json      = options['json']      || false;
  this.listener  = options['listener']  || null;

  this.implicitTypes = this.schema.compiledImplicit;
  this.typeMap       = this.schema.compiledTypeMap;

  this.length     = input.length;
  this.position   = 0;
  this.line       = 0;
  this.lineStart  = 0;
  this.lineIndent = 0;

  this.documents = [];

  /*
  this.version;
  this.checkLineBreaks;
  this.tagMap;
  this.anchorMap;
  this.tag;
  this.anchor;
  this.kind;
  this.result;*/

}


function generateError(state, message) {
  return new YAMLException(
    message,
    new Mark(state.filename, state.input, state.position, state.line, (state.position - state.lineStart)));
}

function throwError(state, message) {
  throw generateError(state, message);
}

function throwWarning(state, message) {
  if (state.onWarning) {
    state.onWarning.call(null, generateError(state, message));
  }
}


var directiveHandlers = {

  YAML: function handleYamlDirective(state, name, args) {

    var match, major, minor;

    if (state.version !== null) {
      throwError(state, 'duplication of %YAML directive');
    }

    if (args.length !== 1) {
      throwError(state, 'YAML directive accepts exactly one argument');
    }

    match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]);

    if (match === null) {
      throwError(state, 'ill-formed argument of the YAML directive');
    }

    major = parseInt(match[1], 10);
    minor = parseInt(match[2], 10);

    if (major !== 1) {
      throwError(state, 'unacceptable YAML version of the document');
    }

    state.version = args[0];
    state.checkLineBreaks = (minor < 2);

    if (minor !== 1 && minor !== 2) {
      throwWarning(state, 'unsupported YAML version of the document');
    }
  },

  TAG: function handleTagDirective(state, name, args) {

    var handle, prefix;

    if (args.length !== 2) {
      throwError(state, 'TAG directive accepts exactly two arguments');
    }

    handle = args[0];
    prefix = args[1];

    if (!PATTERN_TAG_HANDLE.test(handle)) {
      throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');
    }

    if (_hasOwnProperty.call(state.tagMap, handle)) {
      throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle');
    }

    if (!PATTERN_TAG_URI.test(prefix)) {
      throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');
    }

    state.tagMap[handle] = prefix;
  }
};


function captureSegment(state, start, end, checkJson) {
  var _position, _length, _character, _result;

  if (start < end) {
    _result = state.input.slice(start, end);

    if (checkJson) {
      for (_position = 0, _length = _result.length; _position < _length; _position += 1) {
        _character = _result.charCodeAt(_position);
        if (!(_character === 0x09 ||
              (0x20 <= _character && _character <= 0x10FFFF))) {
          throwError(state, 'expected valid JSON character');
        }
      }
    } else if (PATTERN_NON_PRINTABLE.test(_result)) {
      throwError(state, 'the stream contains non-printable characters');
    }

    state.result += _result;
  }
}

function mergeMappings(state, destination, source, overridableKeys) {
  var sourceKeys, key, index, quantity;

  if (!common.isObject(source)) {
    throwError(state, 'cannot merge mappings; the provided source object is unacceptable');
  }

  sourceKeys = Object.keys(source);

  for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {
    key = sourceKeys[index];

    if (!_hasOwnProperty.call(destination, key)) {
      destination[key] = source[key];
      overridableKeys[key] = true;
    }
  }
}

function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) {
  var index, quantity;

  // The output is a plain object here, so keys can only be strings.
  // We need to convert keyNode to a string, but doing so can hang the process
  // (deeply nested arrays that explode exponentially using aliases).
  if (Array.isArray(keyNode)) {
    keyNode = Array.prototype.slice.call(keyNode);

    for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {
      if (Array.isArray(keyNode[index])) {
        throwError(state, 'nested arrays are not supported inside keys');
      }

      if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {
        keyNode[index] = '[object Object]';
      }
    }
  }

  // Avoid code execution in load() via toString property
  // (still use its own toString for arrays, timestamps,
  // and whatever user schema extensions happen to have @@toStringTag)
  if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {
    keyNode = '[object Object]';
  }


  keyNode = String(keyNode);

  if (_result === null) {
    _result = {};
  }

  if (keyTag === 'tag:yaml.org,2002:merge') {
    if (Array.isArray(valueNode)) {
      for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {
        mergeMappings(state, _result, valueNode[index], overridableKeys);
      }
    } else {
      mergeMappings(state, _result, valueNode, overridableKeys);
    }
  } else {
    if (!state.json &&
        !_hasOwnProperty.call(overridableKeys, keyNode) &&
        _hasOwnProperty.call(_result, keyNode)) {
      state.line = startLine || state.line;
      state.position = startPos || state.position;
      throwError(state, 'duplicated mapping key');
    }
    _result[keyNode] = valueNode;
    delete overridableKeys[keyNode];
  }

  return _result;
}

function readLineBreak(state) {
  var ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x0A/* LF */) {
    state.position++;
  } else if (ch === 0x0D/* CR */) {
    state.position++;
    if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {
      state.position++;
    }
  } else {
    throwError(state, 'a line break is expected');
  }

  state.line += 1;
  state.lineStart = state.position;
}

function skipSeparationSpace(state, allowComments, checkIndent) {
  var lineBreaks = 0,
      ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    while (is_WHITE_SPACE(ch)) {
      ch = state.input.charCodeAt(++state.position);
    }

    if (allowComments && ch === 0x23/* # */) {
      do {
        ch = state.input.charCodeAt(++state.position);
      } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);
    }

    if (is_EOL(ch)) {
      readLineBreak(state);

      ch = state.input.charCodeAt(state.position);
      lineBreaks++;
      state.lineIndent = 0;

      while (ch === 0x20/* Space */) {
        state.lineIndent++;
        ch = state.input.charCodeAt(++state.position);
      }
    } else {
      break;
    }
  }

  if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {
    throwWarning(state, 'deficient indentation');
  }

  return lineBreaks;
}

function testDocumentSeparator(state) {
  var _position = state.position,
      ch;

  ch = state.input.charCodeAt(_position);

  // Condition state.position === state.lineStart is tested
  // in parent on each call, for efficiency. No needs to test here again.
  if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&
      ch === state.input.charCodeAt(_position + 1) &&
      ch === state.input.charCodeAt(_position + 2)) {

    _position += 3;

    ch = state.input.charCodeAt(_position);

    if (ch === 0 || is_WS_OR_EOL(ch)) {
      return true;
    }
  }

  return false;
}

function writeFoldedLines(state, count) {
  if (count === 1) {
    state.result += ' ';
  } else if (count > 1) {
    state.result += common.repeat('\n', count - 1);
  }
}


function readPlainScalar(state, nodeIndent, withinFlowCollection) {
  var preceding,
      following,
      captureStart,
      captureEnd,
      hasPendingContent,
      _line,
      _lineStart,
      _lineIndent,
      _kind = state.kind,
      _result = state.result,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (is_WS_OR_EOL(ch)      ||
      is_FLOW_INDICATOR(ch) ||
      ch === 0x23/* # */    ||
      ch === 0x26/* & */    ||
      ch === 0x2A/* * */    ||
      ch === 0x21/* ! */    ||
      ch === 0x7C/* | */    ||
      ch === 0x3E/* > */    ||
      ch === 0x27/* ' */    ||
      ch === 0x22/* " */    ||
      ch === 0x25/* % */    ||
      ch === 0x40/* @ */    ||
      ch === 0x60/* ` */) {
    return false;
  }

  if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {
    following = state.input.charCodeAt(state.position + 1);

    if (is_WS_OR_EOL(following) ||
        withinFlowCollection && is_FLOW_INDICATOR(following)) {
      return false;
    }
  }

  state.kind = 'scalar';
  state.result = '';
  captureStart = captureEnd = state.position;
  hasPendingContent = false;

  while (ch !== 0) {
    if (ch === 0x3A/* : */) {
      following = state.input.charCodeAt(state.position + 1);

      if (is_WS_OR_EOL(following) ||
          withinFlowCollection && is_FLOW_INDICATOR(following)) {
        break;
      }

    } else if (ch === 0x23/* # */) {
      preceding = state.input.charCodeAt(state.position - 1);

      if (is_WS_OR_EOL(preceding)) {
        break;
      }

    } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||
               withinFlowCollection && is_FLOW_INDICATOR(ch)) {
      break;

    } else if (is_EOL(ch)) {
      _line = state.line;
      _lineStart = state.lineStart;
      _lineIndent = state.lineIndent;
      skipSeparationSpace(state, false, -1);

      if (state.lineIndent >= nodeIndent) {
        hasPendingContent = true;
        ch = state.input.charCodeAt(state.position);
        continue;
      } else {
        state.position = captureEnd;
        state.line = _line;
        state.lineStart = _lineStart;
        state.lineIndent = _lineIndent;
        break;
      }
    }

    if (hasPendingContent) {
      captureSegment(state, captureStart, captureEnd, false);
      writeFoldedLines(state, state.line - _line);
      captureStart = captureEnd = state.position;
      hasPendingContent = false;
    }

    if (!is_WHITE_SPACE(ch)) {
      captureEnd = state.position + 1;
    }

    ch = state.input.charCodeAt(++state.position);
  }

  captureSegment(state, captureStart, captureEnd, false);

  if (state.result) {
    return true;
  }

  state.kind = _kind;
  state.result = _result;
  return false;
}

function readSingleQuotedScalar(state, nodeIndent) {
  var ch,
      captureStart, captureEnd;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x27/* ' */) {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';
  state.position++;
  captureStart = captureEnd = state.position;

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    if (ch === 0x27/* ' */) {
      captureSegment(state, captureStart, state.position, true);
      ch = state.input.charCodeAt(++state.position);

      if (ch === 0x27/* ' */) {
        captureStart = state.position;
        state.position++;
        captureEnd = state.position;
      } else {
        return true;
      }

    } else if (is_EOL(ch)) {
      captureSegment(state, captureStart, captureEnd, true);
      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
      captureStart = captureEnd = state.position;

    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
      throwError(state, 'unexpected end of the document within a single quoted scalar');

    } else {
      state.position++;
      captureEnd = state.position;
    }
  }

  throwError(state, 'unexpected end of the stream within a single quoted scalar');
}

function readDoubleQuotedScalar(state, nodeIndent) {
  var captureStart,
      captureEnd,
      hexLength,
      hexResult,
      tmp,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x22/* " */) {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';
  state.position++;
  captureStart = captureEnd = state.position;

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    if (ch === 0x22/* " */) {
      captureSegment(state, captureStart, state.position, true);
      state.position++;
      return true;

    } else if (ch === 0x5C/* \ */) {
      captureSegment(state, captureStart, state.position, true);
      ch = state.input.charCodeAt(++state.position);

      if (is_EOL(ch)) {
        skipSeparationSpace(state, false, nodeIndent);

        // TODO: rework to inline fn with no type cast?
      } else if (ch < 256 && simpleEscapeCheck[ch]) {
        state.result += simpleEscapeMap[ch];
        state.position++;

      } else if ((tmp = escapedHexLen(ch)) > 0) {
        hexLength = tmp;
        hexResult = 0;

        for (; hexLength > 0; hexLength--) {
          ch = state.input.charCodeAt(++state.position);

          if ((tmp = fromHexCode(ch)) >= 0) {
            hexResult = (hexResult << 4) + tmp;

          } else {
            throwError(state, 'expected hexadecimal character');
          }
        }

        state.result += charFromCodepoint(hexResult);

        state.position++;

      } else {
        throwError(state, 'unknown escape sequence');
      }

      captureStart = captureEnd = state.position;

    } else if (is_EOL(ch)) {
      captureSegment(state, captureStart, captureEnd, true);
      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
      captureStart = captureEnd = state.position;

    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
      throwError(state, 'unexpected end of the document within a double quoted scalar');

    } else {
      state.position++;
      captureEnd = state.position;
    }
  }

  throwError(state, 'unexpected end of the stream within a double quoted scalar');
}

function readFlowCollection(state, nodeIndent) {
  var readNext = true,
      _line,
      _tag     = state.tag,
      _result,
      _anchor  = state.anchor,
      following,
      terminator,
      isPair,
      isExplicitPair,
      isMapping,
      overridableKeys = {},
      keyNode,
      keyTag,
      valueNode,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x5B/* [ */) {
    terminator = 0x5D;/* ] */
    isMapping = false;
    _result = [];
  } else if (ch === 0x7B/* { */) {
    terminator = 0x7D;/* } */
    isMapping = true;
    _result = {};
  } else {
    return false;
  }

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(++state.position);

  while (ch !== 0) {
    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if (ch === terminator) {
      state.position++;
      state.tag = _tag;
      state.anchor = _anchor;
      state.kind = isMapping ? 'mapping' : 'sequence';
      state.result = _result;
      return true;
    } else if (!readNext) {
      throwError(state, 'missed comma between flow collection entries');
    }

    keyTag = keyNode = valueNode = null;
    isPair = isExplicitPair = false;

    if (ch === 0x3F/* ? */) {
      following = state.input.charCodeAt(state.position + 1);

      if (is_WS_OR_EOL(following)) {
        isPair = isExplicitPair = true;
        state.position++;
        skipSeparationSpace(state, true, nodeIndent);
      }
    }

    _line = state.line;
    composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
    keyTag = state.tag;
    keyNode = state.result;
    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {
      isPair = true;
      ch = state.input.charCodeAt(++state.position);
      skipSeparationSpace(state, true, nodeIndent);
      composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
      valueNode = state.result;
    }

    if (isMapping) {
      storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode);
    } else if (isPair) {
      _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode));
    } else {
      _result.push(keyNode);
    }

    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if (ch === 0x2C/* , */) {
      readNext = true;
      ch = state.input.charCodeAt(++state.position);
    } else {
      readNext = false;
    }
  }

  throwError(state, 'unexpected end of the stream within a flow collection');
}

function readBlockScalar(state, nodeIndent) {
  var captureStart,
      folding,
      chomping       = CHOMPING_CLIP,
      didReadContent = false,
      detectedIndent = false,
      textIndent     = nodeIndent,
      emptyLines     = 0,
      atMoreIndented = false,
      tmp,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x7C/* | */) {
    folding = false;
  } else if (ch === 0x3E/* > */) {
    folding = true;
  } else {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';

  while (ch !== 0) {
    ch = state.input.charCodeAt(++state.position);

    if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {
      if (CHOMPING_CLIP === chomping) {
        chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;
      } else {
        throwError(state, 'repeat of a chomping mode identifier');
      }

    } else if ((tmp = fromDecimalCode(ch)) >= 0) {
      if (tmp === 0) {
        throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');
      } else if (!detectedIndent) {
        textIndent = nodeIndent + tmp - 1;
        detectedIndent = true;
      } else {
        throwError(state, 'repeat of an indentation width identifier');
      }

    } else {
      break;
    }
  }

  if (is_WHITE_SPACE(ch)) {
    do { ch = state.input.charCodeAt(++state.position); }
    while (is_WHITE_SPACE(ch));

    if (ch === 0x23/* # */) {
      do { ch = state.input.charCodeAt(++state.position); }
      while (!is_EOL(ch) && (ch !== 0));
    }
  }

  while (ch !== 0) {
    readLineBreak(state);
    state.lineIndent = 0;

    ch = state.input.charCodeAt(state.position);

    while ((!detectedIndent || state.lineIndent < textIndent) &&
           (ch === 0x20/* Space */)) {
      state.lineIndent++;
      ch = state.input.charCodeAt(++state.position);
    }

    if (!detectedIndent && state.lineIndent > textIndent) {
      textIndent = state.lineIndent;
    }

    if (is_EOL(ch)) {
      emptyLines++;
      continue;
    }

    // End of the scalar.
    if (state.lineIndent < textIndent) {

      // Perform the chomping.
      if (chomping === CHOMPING_KEEP) {
        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
      } else if (chomping === CHOMPING_CLIP) {
        if (didReadContent) { // i.e. only if the scalar is not empty.
          state.result += '\n';
        }
      }

      // Break this `while` cycle and go to the funciton's epilogue.
      break;
    }

    // Folded style: use fancy rules to handle line breaks.
    if (folding) {

      // Lines starting with white space characters (more-indented lines) are not folded.
      if (is_WHITE_SPACE(ch)) {
        atMoreIndented = true;
        // except for the first content line (cf. Example 8.1)
        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);

      // End of more-indented block.
      } else if (atMoreIndented) {
        atMoreIndented = false;
        state.result += common.repeat('\n', emptyLines + 1);

      // Just one line break - perceive as the same line.
      } else if (emptyLines === 0) {
        if (didReadContent) { // i.e. only if we have already read some scalar content.
          state.result += ' ';
        }

      // Several line breaks - perceive as different lines.
      } else {
        state.result += common.repeat('\n', emptyLines);
      }

    // Literal style: just add exact number of line breaks between content lines.
    } else {
      // Keep all line breaks except the header line break.
      state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
    }

    didReadContent = true;
    detectedIndent = true;
    emptyLines = 0;
    captureStart = state.position;

    while (!is_EOL(ch) && (ch !== 0)) {
      ch = state.input.charCodeAt(++state.position);
    }

    captureSegment(state, captureStart, state.position, false);
  }

  return true;
}

function readBlockSequence(state, nodeIndent) {
  var _line,
      _tag      = state.tag,
      _anchor   = state.anchor,
      _result   = [],
      following,
      detected  = false,
      ch;

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {

    if (ch !== 0x2D/* - */) {
      break;
    }

    following = state.input.charCodeAt(state.position + 1);

    if (!is_WS_OR_EOL(following)) {
      break;
    }

    detected = true;
    state.position++;

    if (skipSeparationSpace(state, true, -1)) {
      if (state.lineIndent <= nodeIndent) {
        _result.push(null);
        ch = state.input.charCodeAt(state.position);
        continue;
      }
    }

    _line = state.line;
    composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);
    _result.push(state.result);
    skipSeparationSpace(state, true, -1);

    ch = state.input.charCodeAt(state.position);

    if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {
      throwError(state, 'bad indentation of a sequence entry');
    } else if (state.lineIndent < nodeIndent) {
      break;
    }
  }

  if (detected) {
    state.tag = _tag;
    state.anchor = _anchor;
    state.kind = 'sequence';
    state.result = _result;
    return true;
  }
  return false;
}

function readBlockMapping(state, nodeIndent, flowIndent) {
  var following,
      allowCompact,
      _line,
      _pos,
      _tag          = state.tag,
      _anchor       = state.anchor,
      _result       = {},
      overridableKeys = {},
      keyTag        = null,
      keyNode       = null,
      valueNode     = null,
      atExplicitKey = false,
      detected      = false,
      ch;

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    following = state.input.charCodeAt(state.position + 1);
    _line = state.line; // Save the current line.
    _pos = state.position;

    //
    // Explicit notation case. There are two separate blocks:
    // first for the key (denoted by "?") and second for the value (denoted by ":")
    //
    if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {

      if (ch === 0x3F/* ? */) {
        if (atExplicitKey) {
          storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
          keyTag = keyNode = valueNode = null;
        }

        detected = true;
        atExplicitKey = true;
        allowCompact = true;

      } else if (atExplicitKey) {
        // i.e. 0x3A/* : */ === character after the explicit key.
        atExplicitKey = false;
        allowCompact = true;

      } else {
        throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');
      }

      state.position += 1;
      ch = following;

    //
    // Implicit notation case. Flow-style node as the key first, then ":", and the value.
    //
    } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {

      if (state.line === _line) {
        ch = state.input.charCodeAt(state.position);

        while (is_WHITE_SPACE(ch)) {
          ch = state.input.charCodeAt(++state.position);
        }

        if (ch === 0x3A/* : */) {
          ch = state.input.charCodeAt(++state.position);

          if (!is_WS_OR_EOL(ch)) {
            throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');
          }

          if (atExplicitKey) {
            storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
            keyTag = keyNode = valueNode = null;
          }

          detected = true;
          atExplicitKey = false;
          allowCompact = false;
          keyTag = state.tag;
          keyNode = state.result;

        } else if (detected) {
          throwError(state, 'can not read an implicit mapping pair; a colon is missed');

        } else {
          state.tag = _tag;
          state.anchor = _anchor;
          return true; // Keep the result of `composeNode`.
        }

      } else if (detected) {
        throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');

      } else {
        state.tag = _tag;
        state.anchor = _anchor;
        return true; // Keep the result of `composeNode`.
      }

    } else {
      break; // Reading is done. Go to the epilogue.
    }

    //
    // Common reading code for both explicit and implicit notations.
    //
    if (state.line === _line || state.lineIndent > nodeIndent) {
      if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {
        if (atExplicitKey) {
          keyNode = state.result;
        } else {
          valueNode = state.result;
        }
      }

      if (!atExplicitKey) {
        storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos);
        keyTag = keyNode = valueNode = null;
      }

      skipSeparationSpace(state, true, -1);
      ch = state.input.charCodeAt(state.position);
    }

    if (state.lineIndent > nodeIndent && (ch !== 0)) {
      throwError(state, 'bad indentation of a mapping entry');
    } else if (state.lineIndent < nodeIndent) {
      break;
    }
  }

  //
  // Epilogue.
  //

  // Special case: last mapping's node contains only the key in explicit notation.
  if (atExplicitKey) {
    storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
  }

  // Expose the resulting mapping.
  if (detected) {
    state.tag = _tag;
    state.anchor = _anchor;
    state.kind = 'mapping';
    state.result = _result;
  }

  return detected;
}

function readTagProperty(state) {
  var _position,
      isVerbatim = false,
      isNamed    = false,
      tagHandle,
      tagName,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x21/* ! */) return false;

  if (state.tag !== null) {
    throwError(state, 'duplication of a tag property');
  }

  ch = state.input.charCodeAt(++state.position);

  if (ch === 0x3C/* < */) {
    isVerbatim = true;
    ch = state.input.charCodeAt(++state.position);

  } else if (ch === 0x21/* ! */) {
    isNamed = true;
    tagHandle = '!!';
    ch = state.input.charCodeAt(++state.position);

  } else {
    tagHandle = '!';
  }

  _position = state.position;

  if (isVerbatim) {
    do { ch = state.input.charCodeAt(++state.position); }
    while (ch !== 0 && ch !== 0x3E/* > */);

    if (state.position < state.length) {
      tagName = state.input.slice(_position, state.position);
      ch = state.input.charCodeAt(++state.position);
    } else {
      throwError(state, 'unexpected end of the stream within a verbatim tag');
    }
  } else {
    while (ch !== 0 && !is_WS_OR_EOL(ch)) {

      if (ch === 0x21/* ! */) {
        if (!isNamed) {
          tagHandle = state.input.slice(_position - 1, state.position + 1);

          if (!PATTERN_TAG_HANDLE.test(tagHandle)) {
            throwError(state, 'named tag handle cannot contain such characters');
          }

          isNamed = true;
          _position = state.position + 1;
        } else {
          throwError(state, 'tag suffix cannot contain exclamation marks');
        }
      }

      ch = state.input.charCodeAt(++state.position);
    }

    tagName = state.input.slice(_position, state.position);

    if (PATTERN_FLOW_INDICATORS.test(tagName)) {
      throwError(state, 'tag suffix cannot contain flow indicator characters');
    }
  }

  if (tagName && !PATTERN_TAG_URI.test(tagName)) {
    throwError(state, 'tag name cannot contain such characters: ' + tagName);
  }

  if (isVerbatim) {
    state.tag = tagName;

  } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) {
    state.tag = state.tagMap[tagHandle] + tagName;

  } else if (tagHandle === '!') {
    state.tag = '!' + tagName;

  } else if (tagHandle === '!!') {
    state.tag = 'tag:yaml.org,2002:' + tagName;

  } else {
    throwError(state, 'undeclared tag handle "' + tagHandle + '"');
  }

  return true;
}

function readAnchorProperty(state) {
  var _position,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x26/* & */) return false;

  if (state.anchor !== null) {
    throwError(state, 'duplication of an anchor property');
  }

  ch = state.input.charCodeAt(++state.position);
  _position = state.position;

  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
    ch = state.input.charCodeAt(++state.position);
  }

  if (state.position === _position) {
    throwError(state, 'name of an anchor node must contain at least one character');
  }

  state.anchor = state.input.slice(_position, state.position);
  return true;
}

function readAlias(state) {
  var _position, alias,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x2A/* * */) return false;

  ch = state.input.charCodeAt(++state.position);
  _position = state.position;

  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
    ch = state.input.charCodeAt(++state.position);
  }

  if (state.position === _position) {
    throwError(state, 'name of an alias node must contain at least one character');
  }

  alias = state.input.slice(_position, state.position);

  if (!state.anchorMap.hasOwnProperty(alias)) {
    throwError(state, 'unidentified alias "' + alias + '"');
  }

  state.result = state.anchorMap[alias];
  skipSeparationSpace(state, true, -1);
  return true;
}

function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {
  var allowBlockStyles,
      allowBlockScalars,
      allowBlockCollections,
      indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent
      atNewLine  = false,
      hasContent = false,
      typeIndex,
      typeQuantity,
      type,
      flowIndent,
      blockIndent;

  if (state.listener !== null) {
    state.listener('open', state);
  }

  state.tag    = null;
  state.anchor = null;
  state.kind   = null;
  state.result = null;

  allowBlockStyles = allowBlockScalars = allowBlockCollections =
    CONTEXT_BLOCK_OUT === nodeContext ||
    CONTEXT_BLOCK_IN  === nodeContext;

  if (allowToSeek) {
    if (skipSeparationSpace(state, true, -1)) {
      atNewLine = true;

      if (state.lineIndent > parentIndent) {
        indentStatus = 1;
      } else if (state.lineIndent === parentIndent) {
        indentStatus = 0;
      } else if (state.lineIndent < parentIndent) {
        indentStatus = -1;
      }
    }
  }

  if (indentStatus === 1) {
    while (readTagProperty(state) || readAnchorProperty(state)) {
      if (skipSeparationSpace(state, true, -1)) {
        atNewLine = true;
        allowBlockCollections = allowBlockStyles;

        if (state.lineIndent > parentIndent) {
          indentStatus = 1;
        } else if (state.lineIndent === parentIndent) {
          indentStatus = 0;
        } else if (state.lineIndent < parentIndent) {
          indentStatus = -1;
        }
      } else {
        allowBlockCollections = false;
      }
    }
  }

  if (allowBlockCollections) {
    allowBlockCollections = atNewLine || allowCompact;
  }

  if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {
    if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {
      flowIndent = parentIndent;
    } else {
      flowIndent = parentIndent + 1;
    }

    blockIndent = state.position - state.lineStart;

    if (indentStatus === 1) {
      if (allowBlockCollections &&
          (readBlockSequence(state, blockIndent) ||
           readBlockMapping(state, blockIndent, flowIndent)) ||
          readFlowCollection(state, flowIndent)) {
        hasContent = true;
      } else {
        if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||
            readSingleQuotedScalar(state, flowIndent) ||
            readDoubleQuotedScalar(state, flowIndent)) {
          hasContent = true;

        } else if (readAlias(state)) {
          hasContent = true;

          if (state.tag !== null || state.anchor !== null) {
            throwError(state, 'alias node should not have any properties');
          }

        } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {
          hasContent = true;

          if (state.tag === null) {
            state.tag = '?';
          }
        }

        if (state.anchor !== null) {
          state.anchorMap[state.anchor] = state.result;
        }
      }
    } else if (indentStatus === 0) {
      // Special case: block sequences are allowed to have same indentation level as the parent.
      // http://www.yaml.org/spec/1.2/spec.html#id2799784
      hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);
    }
  }

  if (state.tag !== null && state.tag !== '!') {
    if (state.tag === '?') {
      // Implicit resolving is not allowed for non-scalar types, and '?'
      // non-specific tag is only automatically assigned to plain scalars.
      //
      // We only need to check kind conformity in case user explicitly assigns '?'
      // tag, for example like this: "!<?> [0]"
      //
      if (state.result !== null && state.kind !== 'scalar') {
        throwError(state, 'unacceptable node kind for !<?> tag; it should be "scalar", not "' + state.kind + '"');
      }

      for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {
        type = state.implicitTypes[typeIndex];

        if (type.resolve(state.result)) { // `state.result` updated in resolver if matched
          state.result = type.construct(state.result);
          state.tag = type.tag;
          if (state.anchor !== null) {
            state.anchorMap[state.anchor] = state.result;
          }
          break;
        }
      }
    } else if (_hasOwnProperty.call(state.typeMap[state.kind || 'fallback'], state.tag)) {
      type = state.typeMap[state.kind || 'fallback'][state.tag];

      if (state.result !== null && type.kind !== state.kind) {
        throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"');
      }

      if (!type.resolve(state.result)) { // `state.result` updated in resolver if matched
        throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');
      } else {
        state.result = type.construct(state.result);
        if (state.anchor !== null) {
          state.anchorMap[state.anchor] = state.result;
        }
      }
    } else {
      throwError(state, 'unknown tag !<' + state.tag + '>');
    }
  }

  if (state.listener !== null) {
    state.listener('close', state);
  }
  return state.tag !== null ||  state.anchor !== null || hasContent;
}

function readDocument(state) {
  var documentStart = state.position,
      _position,
      directiveName,
      directiveArgs,
      hasDirectives = false,
      ch;

  state.version = null;
  state.checkLineBreaks = state.legacy;
  state.tagMap = {};
  state.anchorMap = {};

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    skipSeparationSpace(state, true, -1);

    ch = state.input.charCodeAt(state.position);

    if (state.lineIndent > 0 || ch !== 0x25/* % */) {
      break;
    }

    hasDirectives = true;
    ch = state.input.charCodeAt(++state.position);
    _position = state.position;

    while (ch !== 0 && !is_WS_OR_EOL(ch)) {
      ch = state.input.charCodeAt(++state.position);
    }

    directiveName = state.input.slice(_position, state.position);
    directiveArgs = [];

    if (directiveName.length < 1) {
      throwError(state, 'directive name must not be less than one character in length');
    }

    while (ch !== 0) {
      while (is_WHITE_SPACE(ch)) {
        ch = state.input.charCodeAt(++state.position);
      }

      if (ch === 0x23/* # */) {
        do { ch = state.input.charCodeAt(++state.position); }
        while (ch !== 0 && !is_EOL(ch));
        break;
      }

      if (is_EOL(ch)) break;

      _position = state.position;

      while (ch !== 0 && !is_WS_OR_EOL(ch)) {
        ch = state.input.charCodeAt(++state.position);
      }

      directiveArgs.push(state.input.slice(_position, state.position));
    }

    if (ch !== 0) readLineBreak(state);

    if (_hasOwnProperty.call(directiveHandlers, directiveName)) {
      directiveHandlers[directiveName](state, directiveName, directiveArgs);
    } else {
      throwWarning(state, 'unknown document directive "' + directiveName + '"');
    }
  }

  skipSeparationSpace(state, true, -1);

  if (state.lineIndent === 0 &&
      state.input.charCodeAt(state.position)     === 0x2D/* - */ &&
      state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&
      state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {
    state.position += 3;
    skipSeparationSpace(state, true, -1);

  } else if (hasDirectives) {
    throwError(state, 'directives end mark is expected');
  }

  composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);
  skipSeparationSpace(state, true, -1);

  if (state.checkLineBreaks &&
      PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {
    throwWarning(state, 'non-ASCII line breaks are interpreted as content');
  }

  state.documents.push(state.result);

  if (state.position === state.lineStart && testDocumentSeparator(state)) {

    if (state.input.charCodeAt(state.position) === 0x2E/* . */) {
      state.position += 3;
      skipSeparationSpace(state, true, -1);
    }
    return;
  }

  if (state.position < (state.length - 1)) {
    throwError(state, 'end of the stream or a document separator is expected');
  } else {
    return;
  }
}


function loadDocuments(input, options) {
  input = String(input);
  options = options || {};

  if (input.length !== 0) {

    // Add tailing `\n` if not exists
    if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&
        input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {
      input += '\n';
    }

    // Strip BOM
    if (input.charCodeAt(0) === 0xFEFF) {
      input = input.slice(1);
    }
  }

  var state = new State(input, options);

  var nullpos = input.indexOf('\0');

  if (nullpos !== -1) {
    state.position = nullpos;
    throwError(state, 'null byte is not allowed in input');
  }

  // Use 0 as string terminator. That significantly simplifies bounds check.
  state.input += '\0';

  while (state.input.charCodeAt(state.position) === 0x20/* Space */) {
    state.lineIndent += 1;
    state.position += 1;
  }

  while (state.position < (state.length - 1)) {
    readDocument(state);
  }

  return state.documents;
}


function loadAll(input, iterator, options) {
  if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {
    options = iterator;
    iterator = null;
  }

  var documents = loadDocuments(input, options);

  if (typeof iterator !== 'function') {
    return documents;
  }

  for (var index = 0, length = documents.length; index < length; index += 1) {
    iterator(documents[index]);
  }
}


function load(input, options) {
  var documents = loadDocuments(input, options);

  if (documents.length === 0) {
    /*eslint-disable no-undefined*/
    return undefined;
  } else if (documents.length === 1) {
    return documents[0];
  }
  throw new YAMLException('expected a single document in the stream, but found more');
}


function safeLoadAll(input, iterator, options) {
  if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') {
    options = iterator;
    iterator = null;
  }

  return loadAll(input, iterator, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
}


function safeLoad(input, options) {
  return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
}


module.exports.loadAll     = loadAll;
module.exports.load        = load;
module.exports.safeLoadAll = safeLoadAll;
module.exports.safeLoad    = safeLoad;
'use strict';


var common = require('./common');


function Mark(name, buffer, position, line, column) {
  this.name     = name;
  this.buffer   = buffer;
  this.position = position;
  this.line     = line;
  this.column   = column;
}


Mark.prototype.getSnippet = function getSnippet(indent, maxLength) {
  var head, start, tail, end, snippet;

  if (!this.buffer) return null;

  indent = indent || 4;
  maxLength = maxLength || 75;

  head = '';
  start = this.position;

  while (start > 0 && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(start - 1)) === -1) {
    start -= 1;
    if (this.position - start > (maxLength / 2 - 1)) {
      head = ' ... ';
      start += 5;
      break;
    }
  }

  tail = '';
  end = this.position;

  while (end < this.buffer.length && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(end)) === -1) {
    end += 1;
    if (end - this.position > (maxLength / 2 - 1)) {
      tail = ' ... ';
      end -= 5;
      break;
    }
  }

  snippet = this.buffer.slice(start, end);

  return common.repeat(' ', indent) + head + snippet + tail + '\n' +
         common.repeat(' ', indent + this.position - start + head.length) + '^';
};


Mark.prototype.toString = function toString(compact) {
  var snippet, where = '';

  if (this.name) {
    where += 'in "' + this.name + '" ';
  }

  where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1);

  if (!compact) {
    snippet = this.getSnippet();

    if (snippet) {
      where += ':\n' + snippet;
    }
  }

  return where;
};


module.exports = Mark;
'use strict';

/*eslint-disable max-len*/

var common        = require('./common');
var YAMLException = require('./exception');
var Type          = require('./type');


function compileList(schema, name, result) {
  var exclude = [];

  schema.include.forEach(function (includedSchema) {
    result = compileList(includedSchema, name, result);
  });

  schema[name].forEach(function (currentType) {
    result.forEach(function (previousType, previousIndex) {
      if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) {
        exclude.push(previousIndex);
      }
    });

    result.push(currentType);
  });

  return result.filter(function (type, index) {
    return exclude.indexOf(index) === -1;
  });
}


function compileMap(/* lists... */) {
  var result = {
        scalar: {},
        sequence: {},
        mapping: {},
        fallback: {}
      }, index, length;

  function collectType(type) {
    result[type.kind][type.tag] = result['fallback'][type.tag] = type;
  }

  for (index = 0, length = arguments.length; index < length; index += 1) {
    arguments[index].forEach(collectType);
  }
  return result;
}


function Schema(definition) {
  this.include  = definition.include  || [];
  this.implicit = definition.implicit || [];
  this.explicit = definition.explicit || [];

  this.implicit.forEach(function (type) {
    if (type.loadKind && type.loadKind !== 'scalar') {
      throw new YAMLException('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');
    }
  });

  this.compiledImplicit = compileList(this, 'implicit', []);
  this.compiledExplicit = compileList(this, 'explicit', []);
  this.compiledTypeMap  = compileMap(this.compiledImplicit, this.compiledExplicit);
}


Schema.DEFAULT = null;


Schema.create = function createSchema() {
  var schemas, types;

  switch (arguments.length) {
    case 1:
      schemas = Schema.DEFAULT;
      types = arguments[0];
      break;

    case 2:
      schemas = arguments[0];
      types = arguments[1];
      break;

    default:
      throw new YAMLException('Wrong number of arguments for Schema.create function');
  }

  schemas = common.toArray(schemas);
  types = common.toArray(types);

  if (!schemas.every(function (schema) { return schema instanceof Schema; })) {
    throw new YAMLException('Specified list of super schemas (or a single Schema object) contains a non-Schema object.');
  }

  if (!types.every(function (type) { return type instanceof Type; })) {
    throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.');
  }

  return new Schema({
    include: schemas,
    explicit: types
  });
};


module.exports = Schema;
'use strict';

var YAMLException = require('./exception');

var TYPE_CONSTRUCTOR_OPTIONS = [
  'kind',
  'resolve',
  'construct',
  'instanceOf',
  'predicate',
  'represent',
  'defaultStyle',
  'styleAliases'
];

var YAML_NODE_KINDS = [
  'scalar',
  'sequence',
  'mapping'
];

function compileStyleAliases(map) {
  var result = {};

  if (map !== null) {
    Object.keys(map).forEach(function (style) {
      map[style].forEach(function (alias) {
        result[String(alias)] = style;
      });
    });
  }

  return result;
}

function Type(tag, options) {
  options = options || {};

  Object.keys(options).forEach(function (name) {
    if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {
      throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.');
    }
  });

  // TODO: Add tag format check.
  this.tag          = tag;
  this.kind         = options['kind']         || null;
  this.resolve      = options['resolve']      || function () { return true; };
  this.construct    = options['construct']    || function (data) { return data; };
  this.instanceOf   = options['instanceOf']   || null;
  this.predicate    = options['predicate']    || null;
  this.represent    = options['represent']    || null;
  this.defaultStyle = options['defaultStyle'] || null;
  this.styleAliases = compileStyleAliases(options['styleAliases'] || null);

  if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {
    throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
  }
}

module.exports = Type;
'use strict';

/*eslint-disable no-bitwise*/

var NodeBuffer;

try {
  // A trick for browserified version, to not include `Buffer` shim
  var _require = require;
  NodeBuffer = _require('buffer').Buffer;
} catch (__) {}

var Type       = require('../type');


// [ 64, 65, 66 ] -> [ padding, CR, LF ]
var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r';


function resolveYamlBinary(data) {
  if (data === null) return false;

  var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;

  // Convert one by one.
  for (idx = 0; idx < max; idx++) {
    code = map.indexOf(data.charAt(idx));

    // Skip CR/LF
    if (code > 64) continue;

    // Fail on illegal characters
    if (code < 0) return false;

    bitlen += 6;
  }

  // If there are any bits left, source was corrupted
  return (bitlen % 8) === 0;
}

function constructYamlBinary(data) {
  var idx, tailbits,
      input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan
      max = input.length,
      map = BASE64_MAP,
      bits = 0,
      result = [];

  // Collect by 6*4 bits (3 bytes)

  for (idx = 0; idx < max; idx++) {
    if ((idx % 4 === 0) && idx) {
      result.push((bits >> 16) & 0xFF);
      result.push((bits >> 8) & 0xFF);
      result.push(bits & 0xFF);
    }

    bits = (bits << 6) | map.indexOf(input.charAt(idx));
  }

  // Dump tail

  tailbits = (max % 4) * 6;

  if (tailbits === 0) {
    result.push((bits >> 16) & 0xFF);
    result.push((bits >> 8) & 0xFF);
    result.push(bits & 0xFF);
  } else if (tailbits === 18) {
    result.push((bits >> 10) & 0xFF);
    result.push((bits >> 2) & 0xFF);
  } else if (tailbits === 12) {
    result.push((bits >> 4) & 0xFF);
  }

  // Wrap into Buffer for NodeJS and leave Array for browser
  if (NodeBuffer) {
    // Support node 6.+ Buffer API when available
    return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result);
  }

  return result;
}

function representYamlBinary(object /*, style*/) {
  var result = '', bits = 0, idx, tail,
      max = object.length,
      map = BASE64_MAP;

  // Convert every three bytes to 4 ASCII characters.

  for (idx = 0; idx < max; idx++) {
    if ((idx % 3 === 0) && idx) {
      result += map[(bits >> 18) & 0x3F];
      result += map[(bits >> 12) & 0x3F];
      result += map[(bits >> 6) & 0x3F];
      result += map[bits & 0x3F];
    }

    bits = (bits << 8) + object[idx];
  }

  // Dump tail

  tail = max % 3;

  if (tail === 0) {
    result += map[(bits >> 18) & 0x3F];
    result += map[(bits >> 12) & 0x3F];
    result += map[(bits >> 6) & 0x3F];
    result += map[bits & 0x3F];
  } else if (tail === 2) {
    result += map[(bits >> 10) & 0x3F];
    result += map[(bits >> 4) & 0x3F];
    result += map[(bits << 2) & 0x3F];
    result += map[64];
  } else if (tail === 1) {
    result += map[(bits >> 2) & 0x3F];
    result += map[(bits << 4) & 0x3F];
    result += map[64];
    result += map[64];
  }

  return result;
}

function isBinary(object) {
  return NodeBuffer && NodeBuffer.isBuffer(object);
}

module.exports = new Type('tag:yaml.org,2002:binary', {
  kind: 'scalar',
  resolve: resolveYamlBinary,
  construct: constructYamlBinary,
  predicate: isBinary,
  represent: representYamlBinary
});
'use strict';

var Type = require('../type');

function resolveYamlBoolean(data) {
  if (data === null) return false;

  var max = data.length;

  return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||
         (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));
}

function constructYamlBoolean(data) {
  return data === 'true' ||
         data === 'True' ||
         data === 'TRUE';
}

function isBoolean(object) {
  return Object.prototype.toString.call(object) === '[object Boolean]';
}

module.exports = new Type('tag:yaml.org,2002:bool', {
  kind: 'scalar',
  resolve: resolveYamlBoolean,
  construct: constructYamlBoolean,
  predicate: isBoolean,
  represent: {
    lowercase: function (object) { return object ? 'true' : 'false'; },
    uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },
    camelcase: function (object) { return object ? 'True' : 'False'; }
  },
  defaultStyle: 'lowercase'
});
'use strict';

var common = require('../common');
var Type   = require('../type');

var YAML_FLOAT_PATTERN = new RegExp(
  // 2.5e4, 2.5 and integers
  '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +
  // .2e4, .2
  // special case, seems not from spec
  '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +
  // 20:59
  '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' +
  // .inf
  '|[-+]?\\.(?:inf|Inf|INF)' +
  // .nan
  '|\\.(?:nan|NaN|NAN))$');

function resolveYamlFloat(data) {
  if (data === null) return false;

  if (!YAML_FLOAT_PATTERN.test(data) ||
      // Quick hack to not allow integers end with `_`
      // Probably should update regexp & check speed
      data[data.length - 1] === '_') {
    return false;
  }

  return true;
}

function constructYamlFloat(data) {
  var value, sign, base, digits;

  value  = data.replace(/_/g, '').toLowerCase();
  sign   = value[0] === '-' ? -1 : 1;
  digits = [];

  if ('+-'.indexOf(value[0]) >= 0) {
    value = value.slice(1);
  }

  if (value === '.inf') {
    return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;

  } else if (value === '.nan') {
    return NaN;

  } else if (value.indexOf(':') >= 0) {
    value.split(':').forEach(function (v) {
      digits.unshift(parseFloat(v, 10));
    });

    value = 0.0;
    base = 1;

    digits.forEach(function (d) {
      value += d * base;
      base *= 60;
    });

    return sign * value;

  }
  return sign * parseFloat(value, 10);
}


var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;

function representYamlFloat(object, style) {
  var res;

  if (isNaN(object)) {
    switch (style) {
      case 'lowercase': return '.nan';
      case 'uppercase': return '.NAN';
      case 'camelcase': return '.NaN';
    }
  } else if (Number.POSITIVE_INFINITY === object) {
    switch (style) {
      case 'lowercase': return '.inf';
      case 'uppercase': return '.INF';
      case 'camelcase': return '.Inf';
    }
  } else if (Number.NEGATIVE_INFINITY === object) {
    switch (style) {
      case 'lowercase': return '-.inf';
      case 'uppercase': return '-.INF';
      case 'camelcase': return '-.Inf';
    }
  } else if (common.isNegativeZero(object)) {
    return '-0.0';
  }

  res = object.toString(10);

  // JS stringifier can build scientific format without dots: 5e-100,
  // while YAML requres dot: 5.e-100. Fix it with simple hack

  return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;
}

function isFloat(object) {
  return (Object.prototype.toString.call(object) === '[object Number]') &&
         (object % 1 !== 0 || common.isNegativeZero(object));
}

module.exports = new Type('tag:yaml.org,2002:float', {
  kind: 'scalar',
  resolve: resolveYamlFloat,
  construct: constructYamlFloat,
  predicate: isFloat,
  represent: representYamlFloat,
  defaultStyle: 'lowercase'
});
'use strict';

var common = require('../common');
var Type   = require('../type');

function isHexCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||
         ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||
         ((0x61/* a */ <= c) && (c <= 0x66/* f */));
}

function isOctCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));
}

function isDecCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));
}

function resolveYamlInteger(data) {
  if (data === null) return false;

  var max = data.length,
      index = 0,
      hasDigits = false,
      ch;

  if (!max) return false;

  ch = data[index];

  // sign
  if (ch === '-' || ch === '+') {
    ch = data[++index];
  }

  if (ch === '0') {
    // 0
    if (index + 1 === max) return true;
    ch = data[++index];

    // base 2, base 8, base 16

    if (ch === 'b') {
      // base 2
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (ch !== '0' && ch !== '1') return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }


    if (ch === 'x') {
      // base 16
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (!isHexCode(data.charCodeAt(index))) return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }

    // base 8
    for (; index < max; index++) {
      ch = data[index];
      if (ch === '_') continue;
      if (!isOctCode(data.charCodeAt(index))) return false;
      hasDigits = true;
    }
    return hasDigits && ch !== '_';
  }

  // base 10 (except 0) or base 60

  // value should not start with `_`;
  if (ch === '_') return false;

  for (; index < max; index++) {
    ch = data[index];
    if (ch === '_') continue;
    if (ch === ':') break;
    if (!isDecCode(data.charCodeAt(index))) {
      return false;
    }
    hasDigits = true;
  }

  // Should have digits and should not end with `_`
  if (!hasDigits || ch === '_') return false;

  // if !base60 - done;
  if (ch !== ':') return true;

  // base60 almost not used, no needs to optimize
  return /^(:[0-5]?[0-9])+$/.test(data.slice(index));
}

function constructYamlInteger(data) {
  var value = data, sign = 1, ch, base, digits = [];

  if (value.indexOf('_') !== -1) {
    value = value.replace(/_/g, '');
  }

  ch = value[0];

  if (ch === '-' || ch === '+') {
    if (ch === '-') sign = -1;
    value = value.slice(1);
    ch = value[0];
  }

  if (value === '0') return 0;

  if (ch === '0') {
    if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);
    if (value[1] === 'x') return sign * parseInt(value, 16);
    return sign * parseInt(value, 8);
  }

  if (value.indexOf(':') !== -1) {
    value.split(':').forEach(function (v) {
      digits.unshift(parseInt(v, 10));
    });

    value = 0;
    base = 1;

    digits.forEach(function (d) {
      value += (d * base);
      base *= 60;
    });

    return sign * value;

  }

  return sign * parseInt(value, 10);
}

function isInteger(object) {
  return (Object.prototype.toString.call(object)) === '[object Number]' &&
         (object % 1 === 0 && !common.isNegativeZero(object));
}

module.exports = new Type('tag:yaml.org,2002:int', {
  kind: 'scalar',
  resolve: resolveYamlInteger,
  construct: constructYamlInteger,
  predicate: isInteger,
  represent: {
    binary:      function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },
    octal:       function (obj) { return obj >= 0 ? '0'  + obj.toString(8) : '-0'  + obj.toString(8).slice(1); },
    decimal:     function (obj) { return obj.toString(10); },
    /* eslint-disable max-len */
    hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() :  '-0x' + obj.toString(16).toUpperCase().slice(1); }
  },
  defaultStyle: 'decimal',
  styleAliases: {
    binary:      [ 2,  'bin' ],
    octal:       [ 8,  'oct' ],
    decimal:     [ 10, 'dec' ],
    hexadecimal: [ 16, 'hex' ]
  }
});
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:map', {
  kind: 'mapping',
  construct: function (data) { return data !== null ? data : {}; }
});
'use strict';

var Type = require('../type');

function resolveYamlMerge(data) {
  return data === '<<' || data === null;
}

module.exports = new Type('tag:yaml.org,2002:merge', {
  kind: 'scalar',
  resolve: resolveYamlMerge
});
'use strict';

var Type = require('../type');

function resolveYamlNull(data) {
  if (data === null) return true;

  var max = data.length;

  return (max === 1 && data === '~') ||
         (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));
}

function constructYamlNull() {
  return null;
}

function isNull(object) {
  return object === null;
}

module.exports = new Type('tag:yaml.org,2002:null', {
  kind: 'scalar',
  resolve: resolveYamlNull,
  construct: constructYamlNull,
  predicate: isNull,
  represent: {
    canonical: function () { return '~';    },
    lowercase: function () { return 'null'; },
    uppercase: function () { return 'NULL'; },
    camelcase: function () { return 'Null'; }
  },
  defaultStyle: 'lowercase'
});
'use strict';

var Type = require('../type');

var _hasOwnProperty = Object.prototype.hasOwnProperty;
var _toString       = Object.prototype.toString;

function resolveYamlOmap(data) {
  if (data === null) return true;

  var objectKeys = [], index, length, pair, pairKey, pairHasKey,
      object = data;

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];
    pairHasKey = false;

    if (_toString.call(pair) !== '[object Object]') return false;

    for (pairKey in pair) {
      if (_hasOwnProperty.call(pair, pairKey)) {
        if (!pairHasKey) pairHasKey = true;
        else return false;
      }
    }

    if (!pairHasKey) return false;

    if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);
    else return false;
  }

  return true;
}

function constructYamlOmap(data) {
  return data !== null ? data : [];
}

module.exports = new Type('tag:yaml.org,2002:omap', {
  kind: 'sequence',
  resolve: resolveYamlOmap,
  construct: constructYamlOmap
});
'use strict';

var Type = require('../type');

var _toString = Object.prototype.toString;

function resolveYamlPairs(data) {
  if (data === null) return true;

  var index, length, pair, keys, result,
      object = data;

  result = new Array(object.length);

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];

    if (_toString.call(pair) !== '[object Object]') return false;

    keys = Object.keys(pair);

    if (keys.length !== 1) return false;

    result[index] = [ keys[0], pair[keys[0]] ];
  }

  return true;
}

function constructYamlPairs(data) {
  if (data === null) return [];

  var index, length, pair, keys, result,
      object = data;

  result = new Array(object.length);

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];

    keys = Object.keys(pair);

    result[index] = [ keys[0], pair[keys[0]] ];
  }

  return result;
}

module.exports = new Type('tag:yaml.org,2002:pairs', {
  kind: 'sequence',
  resolve: resolveYamlPairs,
  construct: constructYamlPairs
});
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:seq', {
  kind: 'sequence',
  construct: function (data) { return data !== null ? data : []; }
});
'use strict';

var Type = require('../type');

var _hasOwnProperty = Object.prototype.hasOwnProperty;

function resolveYamlSet(data) {
  if (data === null) return true;

  var key, object = data;

  for (key in object) {
    if (_hasOwnProperty.call(object, key)) {
      if (object[key] !== null) return false;
    }
  }

  return true;
}

function constructYamlSet(data) {
  return data !== null ? data : {};
}

module.exports = new Type('tag:yaml.org,2002:set', {
  kind: 'mapping',
  resolve: resolveYamlSet,
  construct: constructYamlSet
});
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:str', {
  kind: 'scalar',
  construct: function (data) { return data !== null ? data : ''; }
});
'use strict';

var Type = require('../type');

var YAML_DATE_REGEXP = new RegExp(
  '^([0-9][0-9][0-9][0-9])'          + // [1] year
  '-([0-9][0-9])'                    + // [2] month
  '-([0-9][0-9])$');                   // [3] day

var YAML_TIMESTAMP_REGEXP = new RegExp(
  '^([0-9][0-9][0-9][0-9])'          + // [1] year
  '-([0-9][0-9]?)'                   + // [2] month
  '-([0-9][0-9]?)'                   + // [3] day
  '(?:[Tt]|[ \\t]+)'                 + // ...
  '([0-9][0-9]?)'                    + // [4] hour
  ':([0-9][0-9])'                    + // [5] minute
  ':([0-9][0-9])'                    + // [6] second
  '(?:\\.([0-9]*))?'                 + // [7] fraction
  '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour
  '(?::([0-9][0-9]))?))?$');           // [11] tz_minute

function resolveYamlTimestamp(data) {
  if (data === null) return false;
  if (YAML_DATE_REGEXP.exec(data) !== null) return true;
  if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;
  return false;
}

function constructYamlTimestamp(data) {
  var match, year, month, day, hour, minute, second, fraction = 0,
      delta = null, tz_hour, tz_minute, date;

  match = YAML_DATE_REGEXP.exec(data);
  if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);

  if (match === null) throw new Error('Date resolve error');

  // match: [1] year [2] month [3] day

  year = +(match[1]);
  month = +(match[2]) - 1; // JS month starts with 0
  day = +(match[3]);

  if (!match[4]) { // no hour
    return new Date(Date.UTC(year, month, day));
  }

  // match: [4] hour [5] minute [6] second [7] fraction

  hour = +(match[4]);
  minute = +(match[5]);
  second = +(match[6]);

  if (match[7]) {
    fraction = match[7].slice(0, 3);
    while (fraction.length < 3) { // milli-seconds
      fraction += '0';
    }
    fraction = +fraction;
  }

  // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute

  if (match[9]) {
    tz_hour = +(match[10]);
    tz_minute = +(match[11] || 0);
    delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds
    if (match[9] === '-') delta = -delta;
  }

  date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));

  if (delta) date.setTime(date.getTime() - delta);

  return date;
}

function representYamlTimestamp(object /*, style*/) {
  return object.toISOString();
}

module.exports = new Type('tag:yaml.org,2002:timestamp', {
  kind: 'scalar',
  resolve: resolveYamlTimestamp,
  construct: constructYamlTimestamp,
  instanceOf: Date,
  represent: representYamlTimestamp
});
'use strict';

var esprima;

// Browserified version does not have esprima
//
// 1. For node.js just require module as deps
// 2. For browser try to require mudule via external AMD system.
//    If not found - try to fallback to window.esprima. If not
//    found too - then fail to parse.
//
try {
  // workaround to exclude package from browserify list.
  var _require = require;
  esprima = _require('esprima');
} catch (_) {
  /* eslint-disable no-redeclare */
  /* global window */
  if (typeof window !== 'undefined') esprima = window.esprima;
}

var Type = require('../../type');

function resolveJavascriptFunction(data) {
  if (data === null) return false;

  try {
    var source = '(' + data + ')',
        ast    = esprima.parse(source, { range: true });

    if (ast.type                    !== 'Program'             ||
        ast.body.length             !== 1                     ||
        ast.body[0].type            !== 'ExpressionStatement' ||
        (ast.body[0].expression.type !== 'ArrowFunctionExpression' &&
          ast.body[0].expression.type !== 'FunctionExpression')) {
      return false;
    }

    return true;
  } catch (err) {
    return false;
  }
}

function constructJavascriptFunction(data) {
  /*jslint evil:true*/

  var source = '(' + data + ')',
      ast    = esprima.parse(source, { range: true }),
      params = [],
      body;

  if (ast.type                    !== 'Program'             ||
      ast.body.length             !== 1                     ||
      ast.body[0].type            !== 'ExpressionStatement' ||
      (ast.body[0].expression.type !== 'ArrowFunctionExpression' &&
        ast.body[0].expression.type !== 'FunctionExpression')) {
    throw new Error('Failed to resolve function');
  }

  ast.body[0].expression.params.forEach(function (param) {
    params.push(param.name);
  });

  body = ast.body[0].expression.body.range;

  // Esprima's ranges include the first '{' and the last '}' characters on
  // function expressions. So cut them out.
  if (ast.body[0].expression.body.type === 'BlockStatement') {
    /*eslint-disable no-new-func*/
    return new Function(params, source.slice(body[0] + 1, body[1] - 1));
  }
  // ES6 arrow functions can omit the BlockStatement. In that case, just return
  // the body.
  /*eslint-disable no-new-func*/
  return new Function(params, 'return ' + source.slice(body[0], body[1]));
}

function representJavascriptFunction(object /*, style*/) {
  return object.toString();
}

function isFunction(object) {
  return Object.prototype.toString.call(object) === '[object Function]';
}

module.exports = new Type('tag:yaml.org,2002:js/function', {
  kind: 'scalar',
  resolve: resolveJavascriptFunction,
  construct: constructJavascriptFunction,
  predicate: isFunction,
  represent: representJavascriptFunction
});
'use strict';

var Type = require('../../type');

function resolveJavascriptRegExp(data) {
  if (data === null) return false;
  if (data.length === 0) return false;

  var regexp = data,
      tail   = /\/([gim]*)$/.exec(data),
      modifiers = '';

  // if regexp starts with '/' it can have modifiers and must be properly closed
  // `/foo/gim` - modifiers tail can be maximum 3 chars
  if (regexp[0] === '/') {
    if (tail) modifiers = tail[1];

    if (modifiers.length > 3) return false;
    // if expression starts with /, is should be properly terminated
    if (regexp[regexp.length - modifiers.length - 1] !== '/') return false;
  }

  return true;
}

function constructJavascriptRegExp(data) {
  var regexp = data,
      tail   = /\/([gim]*)$/.exec(data),
      modifiers = '';

  // `/foo/gim` - tail can be maximum 4 chars
  if (regexp[0] === '/') {
    if (tail) modifiers = tail[1];
    regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
  }

  return new RegExp(regexp, modifiers);
}

function representJavascriptRegExp(object /*, style*/) {
  var result = '/' + object.source + '/';

  if (object.global) result += 'g';
  if (object.multiline) result += 'm';
  if (object.ignoreCase) result += 'i';

  return result;
}

function isRegExp(object) {
  return Object.prototype.toString.call(object) === '[object RegExp]';
}

module.exports = new Type('tag:yaml.org,2002:js/regexp', {
  kind: 'scalar',
  resolve: resolveJavascriptRegExp,
  construct: constructJavascriptRegExp,
  predicate: isRegExp,
  represent: representJavascriptRegExp
});
'use strict';

var Type = require('../../type');

function resolveJavascriptUndefined() {
  return true;
}

function constructJavascriptUndefined() {
  /*eslint-disable no-undefined*/
  return undefined;
}

function representJavascriptUndefined() {
  return '';
}

function isUndefined(object) {
  return typeof object === 'undefined';
}

module.exports = new Type('tag:yaml.org,2002:js/undefined', {
  kind: 'scalar',
  resolve: resolveJavascriptUndefined,
  construct: constructJavascriptUndefined,
  predicate: isUndefined,
  represent: representJavascriptUndefined
});
// Standard YAML's Core schema.
// http://www.yaml.org/spec/1.2/spec.html#id2804923
//
// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.
// So, Core schema has no distinctions from JSON schema is JS-YAML.


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  include: [
    require('./json')
  ]
});
// JS-YAML's default schema for `load` function.
// It is not described in the YAML specification.
//
// This schema is based on JS-YAML's default safe schema and includes
// JavaScript-specific types: !!js/undefined, !!js/regexp and !!js/function.
//
// Also this schema is used as default base schema at `Schema.create` function.


'use strict';


var Schema = require('../schema');


module.exports = Schema.DEFAULT = new Schema({
  include: [
    require('./default_safe')
  ],
  explicit: [
    require('../type/js/undefined'),
    require('../type/js/regexp'),
    require('../type/js/function')
  ]
});
// JS-YAML's default schema for `safeLoad` function.
// It is not described in the YAML specification.
//
// This schema is based on standard YAML's Core schema and includes most of
// extra types described at YAML tag repository. (http://yaml.org/type/)


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  include: [
    require('./core')
  ],
  implicit: [
    require('../type/timestamp'),
    require('../type/merge')
  ],
  explicit: [
    require('../type/binary'),
    require('../type/omap'),
    require('../type/pairs'),
    require('../type/set')
  ]
});
// Standard YAML's Failsafe schema.
// http://www.yaml.org/spec/1.2/spec.html#id2802346


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  explicit: [
    require('../type/str'),
    require('../type/seq'),
    require('../type/map')
  ]
});
// Standard YAML's JSON schema.
// http://www.yaml.org/spec/1.2/spec.html#id2803231
//
// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.
// So, this schema is not such strict as defined in the YAML specification.
// It allows numbers in binary notaion, use `Null` and `NULL` as `null`, etc.


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  include: [
    require('./failsafe')
  ],
  implicit: [
    require('../type/null'),
    require('../type/bool'),
    require('../type/int'),
    require('../type/float')
  ]
});
/* js-yaml 3.14.0 https://github.com/nodeca/js-yaml */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.jsyaml = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
'use strict';


var loader = require('./js-yaml/loader');
var dumper = require('./js-yaml/dumper');


function deprecated(name) {
  return function () {
    throw new Error('Function ' + name + ' is deprecated and cannot be used.');
  };
}


module.exports.Type                = require('./js-yaml/type');
module.exports.Schema              = require('./js-yaml/schema');
module.exports.FAILSAFE_SCHEMA     = require('./js-yaml/schema/failsafe');
module.exports.JSON_SCHEMA         = require('./js-yaml/schema/json');
module.exports.CORE_SCHEMA         = require('./js-yaml/schema/core');
module.exports.DEFAULT_SAFE_SCHEMA = require('./js-yaml/schema/default_safe');
module.exports.DEFAULT_FULL_SCHEMA = require('./js-yaml/schema/default_full');
module.exports.load                = loader.load;
module.exports.loadAll             = loader.loadAll;
module.exports.safeLoad            = loader.safeLoad;
module.exports.safeLoadAll         = loader.safeLoadAll;
module.exports.dump                = dumper.dump;
module.exports.safeDump            = dumper.safeDump;
module.exports.YAMLException       = require('./js-yaml/exception');

// Deprecated schema names from JS-YAML 2.0.x
module.exports.MINIMAL_SCHEMA = require('./js-yaml/schema/failsafe');
module.exports.SAFE_SCHEMA    = require('./js-yaml/schema/default_safe');
module.exports.DEFAULT_SCHEMA = require('./js-yaml/schema/default_full');

// Deprecated functions from JS-YAML 1.x.x
module.exports.scan           = deprecated('scan');
module.exports.parse          = deprecated('parse');
module.exports.compose        = deprecated('compose');
module.exports.addConstructor = deprecated('addConstructor');

},{"./js-yaml/dumper":3,"./js-yaml/exception":4,"./js-yaml/loader":5,"./js-yaml/schema":7,"./js-yaml/schema/core":8,"./js-yaml/schema/default_full":9,"./js-yaml/schema/default_safe":10,"./js-yaml/schema/failsafe":11,"./js-yaml/schema/json":12,"./js-yaml/type":13}],2:[function(require,module,exports){
'use strict';


function isNothing(subject) {
  return (typeof subject === 'undefined') || (subject === null);
}


function isObject(subject) {
  return (typeof subject === 'object') && (subject !== null);
}


function toArray(sequence) {
  if (Array.isArray(sequence)) return sequence;
  else if (isNothing(sequence)) return [];

  return [ sequence ];
}


function extend(target, source) {
  var index, length, key, sourceKeys;

  if (source) {
    sourceKeys = Object.keys(source);

    for (index = 0, length = sourceKeys.length; index < length; index += 1) {
      key = sourceKeys[index];
      target[key] = source[key];
    }
  }

  return target;
}


function repeat(string, count) {
  var result = '', cycle;

  for (cycle = 0; cycle < count; cycle += 1) {
    result += string;
  }

  return result;
}


function isNegativeZero(number) {
  return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);
}


module.exports.isNothing      = isNothing;
module.exports.isObject       = isObject;
module.exports.toArray        = toArray;
module.exports.repeat         = repeat;
module.exports.isNegativeZero = isNegativeZero;
module.exports.extend         = extend;

},{}],3:[function(require,module,exports){
'use strict';

/*eslint-disable no-use-before-define*/

var common              = require('./common');
var YAMLException       = require('./exception');
var DEFAULT_FULL_SCHEMA = require('./schema/default_full');
var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe');

var _toString       = Object.prototype.toString;
var _hasOwnProperty = Object.prototype.hasOwnProperty;

var CHAR_TAB                  = 0x09; /* Tab */
var CHAR_LINE_FEED            = 0x0A; /* LF */
var CHAR_CARRIAGE_RETURN      = 0x0D; /* CR */
var CHAR_SPACE                = 0x20; /* Space */
var CHAR_EXCLAMATION          = 0x21; /* ! */
var CHAR_DOUBLE_QUOTE         = 0x22; /* " */
var CHAR_SHARP                = 0x23; /* # */
var CHAR_PERCENT              = 0x25; /* % */
var CHAR_AMPERSAND            = 0x26; /* & */
var CHAR_SINGLE_QUOTE         = 0x27; /* ' */
var CHAR_ASTERISK             = 0x2A; /* * */
var CHAR_COMMA                = 0x2C; /* , */
var CHAR_MINUS                = 0x2D; /* - */
var CHAR_COLON                = 0x3A; /* : */
var CHAR_EQUALS               = 0x3D; /* = */
var CHAR_GREATER_THAN         = 0x3E; /* > */
var CHAR_QUESTION             = 0x3F; /* ? */
var CHAR_COMMERCIAL_AT        = 0x40; /* @ */
var CHAR_LEFT_SQUARE_BRACKET  = 0x5B; /* [ */
var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */
var CHAR_GRAVE_ACCENT         = 0x60; /* ` */
var CHAR_LEFT_CURLY_BRACKET   = 0x7B; /* { */
var CHAR_VERTICAL_LINE        = 0x7C; /* | */
var CHAR_RIGHT_CURLY_BRACKET  = 0x7D; /* } */

var ESCAPE_SEQUENCES = {};

ESCAPE_SEQUENCES[0x00]   = '\\0';
ESCAPE_SEQUENCES[0x07]   = '\\a';
ESCAPE_SEQUENCES[0x08]   = '\\b';
ESCAPE_SEQUENCES[0x09]   = '\\t';
ESCAPE_SEQUENCES[0x0A]   = '\\n';
ESCAPE_SEQUENCES[0x0B]   = '\\v';
ESCAPE_SEQUENCES[0x0C]   = '\\f';
ESCAPE_SEQUENCES[0x0D]   = '\\r';
ESCAPE_SEQUENCES[0x1B]   = '\\e';
ESCAPE_SEQUENCES[0x22]   = '\\"';
ESCAPE_SEQUENCES[0x5C]   = '\\\\';
ESCAPE_SEQUENCES[0x85]   = '\\N';
ESCAPE_SEQUENCES[0xA0]   = '\\_';
ESCAPE_SEQUENCES[0x2028] = '\\L';
ESCAPE_SEQUENCES[0x2029] = '\\P';

var DEPRECATED_BOOLEANS_SYNTAX = [
  'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',
  'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'
];

function compileStyleMap(schema, map) {
  var result, keys, index, length, tag, style, type;

  if (map === null) return {};

  result = {};
  keys = Object.keys(map);

  for (index = 0, length = keys.length; index < length; index += 1) {
    tag = keys[index];
    style = String(map[tag]);

    if (tag.slice(0, 2) === '!!') {
      tag = 'tag:yaml.org,2002:' + tag.slice(2);
    }
    type = schema.compiledTypeMap['fallback'][tag];

    if (type && _hasOwnProperty.call(type.styleAliases, style)) {
      style = type.styleAliases[style];
    }

    result[tag] = style;
  }

  return result;
}

function encodeHex(character) {
  var string, handle, length;

  string = character.toString(16).toUpperCase();

  if (character <= 0xFF) {
    handle = 'x';
    length = 2;
  } else if (character <= 0xFFFF) {
    handle = 'u';
    length = 4;
  } else if (character <= 0xFFFFFFFF) {
    handle = 'U';
    length = 8;
  } else {
    throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF');
  }

  return '\\' + handle + common.repeat('0', length - string.length) + string;
}

function State(options) {
  this.schema        = options['schema'] || DEFAULT_FULL_SCHEMA;
  this.indent        = Math.max(1, (options['indent'] || 2));
  this.noArrayIndent = options['noArrayIndent'] || false;
  this.skipInvalid   = options['skipInvalid'] || false;
  this.flowLevel     = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);
  this.styleMap      = compileStyleMap(this.schema, options['styles'] || null);
  this.sortKeys      = options['sortKeys'] || false;
  this.lineWidth     = options['lineWidth'] || 80;
  this.noRefs        = options['noRefs'] || false;
  this.noCompatMode  = options['noCompatMode'] || false;
  this.condenseFlow  = options['condenseFlow'] || false;

  this.implicitTypes = this.schema.compiledImplicit;
  this.explicitTypes = this.schema.compiledExplicit;

  this.tag = null;
  this.result = '';

  this.duplicates = [];
  this.usedDuplicates = null;
}

// Indents every line in a string. Empty lines (\n only) are not indented.
function indentString(string, spaces) {
  var ind = common.repeat(' ', spaces),
      position = 0,
      next = -1,
      result = '',
      line,
      length = string.length;

  while (position < length) {
    next = string.indexOf('\n', position);
    if (next === -1) {
      line = string.slice(position);
      position = length;
    } else {
      line = string.slice(position, next + 1);
      position = next + 1;
    }

    if (line.length && line !== '\n') result += ind;

    result += line;
  }

  return result;
}

function generateNextLine(state, level) {
  return '\n' + common.repeat(' ', state.indent * level);
}

function testImplicitResolving(state, str) {
  var index, length, type;

  for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {
    type = state.implicitTypes[index];

    if (type.resolve(str)) {
      return true;
    }
  }

  return false;
}

// [33] s-white ::= s-space | s-tab
function isWhitespace(c) {
  return c === CHAR_SPACE || c === CHAR_TAB;
}

// Returns true if the character can be printed without escaping.
// From YAML 1.2: "any allowed characters known to be non-printable
// should also be escaped. [However,] This isnâ€™t mandatory"
// Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029.
function isPrintable(c) {
  return  (0x00020 <= c && c <= 0x00007E)
      || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)
      || ((0x0E000 <= c && c <= 0x00FFFD) && c !== 0xFEFF /* BOM */)
      ||  (0x10000 <= c && c <= 0x10FFFF);
}

// [34] ns-char ::= nb-char - s-white
// [27] nb-char ::= c-printable - b-char - c-byte-order-mark
// [26] b-char  ::= b-line-feed | b-carriage-return
// [24] b-line-feed       ::=     #xA    /* LF */
// [25] b-carriage-return ::=     #xD    /* CR */
// [3]  c-byte-order-mark ::=     #xFEFF
function isNsChar(c) {
  return isPrintable(c) && !isWhitespace(c)
    // byte-order-mark
    && c !== 0xFEFF
    // b-char
    && c !== CHAR_CARRIAGE_RETURN
    && c !== CHAR_LINE_FEED;
}

// Simplified test for values allowed after the first character in plain style.
function isPlainSafe(c, prev) {
  // Uses a subset of nb-char - c-flow-indicator - ":" - "#"
  // where nb-char ::= c-printable - b-char - c-byte-order-mark.
  return isPrintable(c) && c !== 0xFEFF
    // - c-flow-indicator
    && c !== CHAR_COMMA
    && c !== CHAR_LEFT_SQUARE_BRACKET
    && c !== CHAR_RIGHT_SQUARE_BRACKET
    && c !== CHAR_LEFT_CURLY_BRACKET
    && c !== CHAR_RIGHT_CURLY_BRACKET
    // - ":" - "#"
    // /* An ns-char preceding */ "#"
    && c !== CHAR_COLON
    && ((c !== CHAR_SHARP) || (prev && isNsChar(prev)));
}

// Simplified test for values allowed as the first character in plain style.
function isPlainSafeFirst(c) {
  // Uses a subset of ns-char - c-indicator
  // where ns-char = nb-char - s-white.
  return isPrintable(c) && c !== 0xFEFF
    && !isWhitespace(c) // - s-white
    // - (c-indicator ::=
    // â€œ-â€� | â€œ?â€� | â€œ:â€� | â€œ,â€� | â€œ[â€� | â€œ]â€� | â€œ{â€� | â€œ}â€�
    && c !== CHAR_MINUS
    && c !== CHAR_QUESTION
    && c !== CHAR_COLON
    && c !== CHAR_COMMA
    && c !== CHAR_LEFT_SQUARE_BRACKET
    && c !== CHAR_RIGHT_SQUARE_BRACKET
    && c !== CHAR_LEFT_CURLY_BRACKET
    && c !== CHAR_RIGHT_CURLY_BRACKET
    // | â€œ#â€� | â€œ&â€� | â€œ*â€� | â€œ!â€� | â€œ|â€� | â€œ=â€� | â€œ>â€� | â€œ'â€� | â€œ"â€�
    && c !== CHAR_SHARP
    && c !== CHAR_AMPERSAND
    && c !== CHAR_ASTERISK
    && c !== CHAR_EXCLAMATION
    && c !== CHAR_VERTICAL_LINE
    && c !== CHAR_EQUALS
    && c !== CHAR_GREATER_THAN
    && c !== CHAR_SINGLE_QUOTE
    && c !== CHAR_DOUBLE_QUOTE
    // | â€œ%â€� | â€œ@â€� | â€œ`â€�)
    && c !== CHAR_PERCENT
    && c !== CHAR_COMMERCIAL_AT
    && c !== CHAR_GRAVE_ACCENT;
}

// Determines whether block indentation indicator is required.
function needIndentIndicator(string) {
  var leadingSpaceRe = /^\n* /;
  return leadingSpaceRe.test(string);
}

var STYLE_PLAIN   = 1,
    STYLE_SINGLE  = 2,
    STYLE_LITERAL = 3,
    STYLE_FOLDED  = 4,
    STYLE_DOUBLE  = 5;

// Determines which scalar styles are possible and returns the preferred style.
// lineWidth = -1 => no limit.
// Pre-conditions: str.length > 0.
// Post-conditions:
//    STYLE_PLAIN or STYLE_SINGLE => no \n are in the string.
//    STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).
//    STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).
function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) {
  var i;
  var char, prev_char;
  var hasLineBreak = false;
  var hasFoldableLine = false; // only checked if shouldTrackWidth
  var shouldTrackWidth = lineWidth !== -1;
  var previousLineBreak = -1; // count the first line correctly
  var plain = isPlainSafeFirst(string.charCodeAt(0))
          && !isWhitespace(string.charCodeAt(string.length - 1));

  if (singleLineOnly) {
    // Case: no block styles.
    // Check for disallowed characters to rule out plain and single.
    for (i = 0; i < string.length; i++) {
      char = string.charCodeAt(i);
      if (!isPrintable(char)) {
        return STYLE_DOUBLE;
      }
      prev_char = i > 0 ? string.charCodeAt(i - 1) : null;
      plain = plain && isPlainSafe(char, prev_char);
    }
  } else {
    // Case: block styles permitted.
    for (i = 0; i < string.length; i++) {
      char = string.charCodeAt(i);
      if (char === CHAR_LINE_FEED) {
        hasLineBreak = true;
        // Check if any line can be folded.
        if (shouldTrackWidth) {
          hasFoldableLine = hasFoldableLine ||
            // Foldable line = too long, and not more-indented.
            (i - previousLineBreak - 1 > lineWidth &&
             string[previousLineBreak + 1] !== ' ');
          previousLineBreak = i;
        }
      } else if (!isPrintable(char)) {
        return STYLE_DOUBLE;
      }
      prev_char = i > 0 ? string.charCodeAt(i - 1) : null;
      plain = plain && isPlainSafe(char, prev_char);
    }
    // in case the end is missing a \n
    hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&
      (i - previousLineBreak - 1 > lineWidth &&
       string[previousLineBreak + 1] !== ' '));
  }
  // Although every style can represent \n without escaping, prefer block styles
  // for multiline, since they're more readable and they don't add empty lines.
  // Also prefer folding a super-long line.
  if (!hasLineBreak && !hasFoldableLine) {
    // Strings interpretable as another type have to be quoted;
    // e.g. the string 'true' vs. the boolean true.
    return plain && !testAmbiguousType(string)
      ? STYLE_PLAIN : STYLE_SINGLE;
  }
  // Edge case: block indentation indicator can only have one digit.
  if (indentPerLevel > 9 && needIndentIndicator(string)) {
    return STYLE_DOUBLE;
  }
  // At this point we know block styles are valid.
  // Prefer literal style unless we want to fold.
  return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;
}

// Note: line breaking/folding is implemented for only the folded style.
// NB. We drop the last trailing newline (if any) of a returned block scalar
//  since the dumper adds its own newline. This always works:
//    â€¢ No ending newline => unaffected; already using strip "-" chomping.
//    â€¢ Ending newline    => removed then restored.
//  Importantly, this keeps the "+" chomp indicator from gaining an extra line.
function writeScalar(state, string, level, iskey) {
  state.dump = (function () {
    if (string.length === 0) {
      return "''";
    }
    if (!state.noCompatMode &&
        DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) {
      return "'" + string + "'";
    }

    var indent = state.indent * Math.max(1, level); // no 0-indent scalars
    // As indentation gets deeper, let the width decrease monotonically
    // to the lower bound min(state.lineWidth, 40).
    // Note that this implies
    //  state.lineWidth â‰¤ 40 + state.indent: width is fixed at the lower bound.
    //  state.lineWidth > 40 + state.indent: width decreases until the lower bound.
    // This behaves better than a constant minimum width which disallows narrower options,
    // or an indent threshold which causes the width to suddenly increase.
    var lineWidth = state.lineWidth === -1
      ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);

    // Without knowing if keys are implicit/explicit, assume implicit for safety.
    var singleLineOnly = iskey
      // No block styles in flow mode.
      || (state.flowLevel > -1 && level >= state.flowLevel);
    function testAmbiguity(string) {
      return testImplicitResolving(state, string);
    }

    switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) {
      case STYLE_PLAIN:
        return string;
      case STYLE_SINGLE:
        return "'" + string.replace(/'/g, "''") + "'";
      case STYLE_LITERAL:
        return '|' + blockHeader(string, state.indent)
          + dropEndingNewline(indentString(string, indent));
      case STYLE_FOLDED:
        return '>' + blockHeader(string, state.indent)
          + dropEndingNewline(indentString(foldString(string, lineWidth), indent));
      case STYLE_DOUBLE:
        return '"' + escapeString(string, lineWidth) + '"';
      default:
        throw new YAMLException('impossible error: invalid scalar style');
    }
  }());
}

// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.
function blockHeader(string, indentPerLevel) {
  var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';

  // note the special case: the string '\n' counts as a "trailing" empty line.
  var clip =          string[string.length - 1] === '\n';
  var keep = clip && (string[string.length - 2] === '\n' || string === '\n');
  var chomp = keep ? '+' : (clip ? '' : '-');

  return indentIndicator + chomp + '\n';
}

// (See the note for writeScalar.)
function dropEndingNewline(string) {
  return string[string.length - 1] === '\n' ? string.slice(0, -1) : string;
}

// Note: a long line without a suitable break point will exceed the width limit.
// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.
function foldString(string, width) {
  // In folded style, $k$ consecutive newlines output as $k+1$ newlinesâ€”
  // unless they're before or after a more-indented line, or at the very
  // beginning or end, in which case $k$ maps to $k$.
  // Therefore, parse each chunk as newline(s) followed by a content line.
  var lineRe = /(\n+)([^\n]*)/g;

  // first line (possibly an empty line)
  var result = (function () {
    var nextLF = string.indexOf('\n');
    nextLF = nextLF !== -1 ? nextLF : string.length;
    lineRe.lastIndex = nextLF;
    return foldLine(string.slice(0, nextLF), width);
  }());
  // If we haven't reached the first content line yet, don't add an extra \n.
  var prevMoreIndented = string[0] === '\n' || string[0] === ' ';
  var moreIndented;

  // rest of the lines
  var match;
  while ((match = lineRe.exec(string))) {
    var prefix = match[1], line = match[2];
    moreIndented = (line[0] === ' ');
    result += prefix
      + (!prevMoreIndented && !moreIndented && line !== ''
        ? '\n' : '')
      + foldLine(line, width);
    prevMoreIndented = moreIndented;
  }

  return result;
}

// Greedy line breaking.
// Picks the longest line under the limit each time,
// otherwise settles for the shortest line over the limit.
// NB. More-indented lines *cannot* be folded, as that would add an extra \n.
function foldLine(line, width) {
  if (line === '' || line[0] === ' ') return line;

  // Since a more-indented line adds a \n, breaks can't be followed by a space.
  var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.
  var match;
  // start is an inclusive index. end, curr, and next are exclusive.
  var start = 0, end, curr = 0, next = 0;
  var result = '';

  // Invariants: 0 <= start <= length-1.
  //   0 <= curr <= next <= max(0, length-2). curr - start <= width.
  // Inside the loop:
  //   A match implies length >= 2, so curr and next are <= length-2.
  while ((match = breakRe.exec(line))) {
    next = match.index;
    // maintain invariant: curr - start <= width
    if (next - start > width) {
      end = (curr > start) ? curr : next; // derive end <= length-2
      result += '\n' + line.slice(start, end);
      // skip the space that was output as \n
      start = end + 1;                    // derive start <= length-1
    }
    curr = next;
  }

  // By the invariants, start <= length-1, so there is something left over.
  // It is either the whole string or a part starting from non-whitespace.
  result += '\n';
  // Insert a break if the remainder is too long and there is a break available.
  if (line.length - start > width && curr > start) {
    result += line.slice(start, curr) + '\n' + line.slice(curr + 1);
  } else {
    result += line.slice(start);
  }

  return result.slice(1); // drop extra \n joiner
}

// Escapes a double-quoted string.
function escapeString(string) {
  var result = '';
  var char, nextChar;
  var escapeSeq;

  for (var i = 0; i < string.length; i++) {
    char = string.charCodeAt(i);
    // Check for surrogate pairs (reference Unicode 3.0 section "3.7 Surrogates").
    if (char >= 0xD800 && char <= 0xDBFF/* high surrogate */) {
      nextChar = string.charCodeAt(i + 1);
      if (nextChar >= 0xDC00 && nextChar <= 0xDFFF/* low surrogate */) {
        // Combine the surrogate pair and store it escaped.
        result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000);
        // Advance index one extra since we already used that char here.
        i++; continue;
      }
    }
    escapeSeq = ESCAPE_SEQUENCES[char];
    result += !escapeSeq && isPrintable(char)
      ? string[i]
      : escapeSeq || encodeHex(char);
  }

  return result;
}

function writeFlowSequence(state, level, object) {
  var _result = '',
      _tag    = state.tag,
      index,
      length;

  for (index = 0, length = object.length; index < length; index += 1) {
    // Write only valid elements.
    if (writeNode(state, level, object[index], false, false)) {
      if (index !== 0) _result += ',' + (!state.condenseFlow ? ' ' : '');
      _result += state.dump;
    }
  }

  state.tag = _tag;
  state.dump = '[' + _result + ']';
}

function writeBlockSequence(state, level, object, compact) {
  var _result = '',
      _tag    = state.tag,
      index,
      length;

  for (index = 0, length = object.length; index < length; index += 1) {
    // Write only valid elements.
    if (writeNode(state, level + 1, object[index], true, true)) {
      if (!compact || index !== 0) {
        _result += generateNextLine(state, level);
      }

      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
        _result += '-';
      } else {
        _result += '- ';
      }

      _result += state.dump;
    }
  }

  state.tag = _tag;
  state.dump = _result || '[]'; // Empty sequence if no valid values.
}

function writeFlowMapping(state, level, object) {
  var _result       = '',
      _tag          = state.tag,
      objectKeyList = Object.keys(object),
      index,
      length,
      objectKey,
      objectValue,
      pairBuffer;

  for (index = 0, length = objectKeyList.length; index < length; index += 1) {

    pairBuffer = '';
    if (index !== 0) pairBuffer += ', ';

    if (state.condenseFlow) pairBuffer += '"';

    objectKey = objectKeyList[index];
    objectValue = object[objectKey];

    if (!writeNode(state, level, objectKey, false, false)) {
      continue; // Skip this pair because of invalid key;
    }

    if (state.dump.length > 1024) pairBuffer += '? ';

    pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' ');

    if (!writeNode(state, level, objectValue, false, false)) {
      continue; // Skip this pair because of invalid value.
    }

    pairBuffer += state.dump;

    // Both key and value are valid.
    _result += pairBuffer;
  }

  state.tag = _tag;
  state.dump = '{' + _result + '}';
}

function writeBlockMapping(state, level, object, compact) {
  var _result       = '',
      _tag          = state.tag,
      objectKeyList = Object.keys(object),
      index,
      length,
      objectKey,
      objectValue,
      explicitPair,
      pairBuffer;

  // Allow sorting keys so that the output file is deterministic
  if (state.sortKeys === true) {
    // Default sorting
    objectKeyList.sort();
  } else if (typeof state.sortKeys === 'function') {
    // Custom sort function
    objectKeyList.sort(state.sortKeys);
  } else if (state.sortKeys) {
    // Something is wrong
    throw new YAMLException('sortKeys must be a boolean or a function');
  }

  for (index = 0, length = objectKeyList.length; index < length; index += 1) {
    pairBuffer = '';

    if (!compact || index !== 0) {
      pairBuffer += generateNextLine(state, level);
    }

    objectKey = objectKeyList[index];
    objectValue = object[objectKey];

    if (!writeNode(state, level + 1, objectKey, true, true, true)) {
      continue; // Skip this pair because of invalid key.
    }

    explicitPair = (state.tag !== null && state.tag !== '?') ||
                   (state.dump && state.dump.length > 1024);

    if (explicitPair) {
      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
        pairBuffer += '?';
      } else {
        pairBuffer += '? ';
      }
    }

    pairBuffer += state.dump;

    if (explicitPair) {
      pairBuffer += generateNextLine(state, level);
    }

    if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {
      continue; // Skip this pair because of invalid value.
    }

    if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
      pairBuffer += ':';
    } else {
      pairBuffer += ': ';
    }

    pairBuffer += state.dump;

    // Both key and value are valid.
    _result += pairBuffer;
  }

  state.tag = _tag;
  state.dump = _result || '{}'; // Empty mapping if no valid pairs.
}

function detectType(state, object, explicit) {
  var _result, typeList, index, length, type, style;

  typeList = explicit ? state.explicitTypes : state.implicitTypes;

  for (index = 0, length = typeList.length; index < length; index += 1) {
    type = typeList[index];

    if ((type.instanceOf  || type.predicate) &&
        (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&
        (!type.predicate  || type.predicate(object))) {

      state.tag = explicit ? type.tag : '?';

      if (type.represent) {
        style = state.styleMap[type.tag] || type.defaultStyle;

        if (_toString.call(type.represent) === '[object Function]') {
          _result = type.represent(object, style);
        } else if (_hasOwnProperty.call(type.represent, style)) {
          _result = type.represent[style](object, style);
        } else {
          throw new YAMLException('!<' + type.tag + '> tag resolver accepts not "' + style + '" style');
        }

        state.dump = _result;
      }

      return true;
    }
  }

  return false;
}

// Serializes `object` and writes it to global `result`.
// Returns true on success, or false on invalid object.
//
function writeNode(state, level, object, block, compact, iskey) {
  state.tag = null;
  state.dump = object;

  if (!detectType(state, object, false)) {
    detectType(state, object, true);
  }

  var type = _toString.call(state.dump);

  if (block) {
    block = (state.flowLevel < 0 || state.flowLevel > level);
  }

  var objectOrArray = type === '[object Object]' || type === '[object Array]',
      duplicateIndex,
      duplicate;

  if (objectOrArray) {
    duplicateIndex = state.duplicates.indexOf(object);
    duplicate = duplicateIndex !== -1;
  }

  if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {
    compact = false;
  }

  if (duplicate && state.usedDuplicates[duplicateIndex]) {
    state.dump = '*ref_' + duplicateIndex;
  } else {
    if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {
      state.usedDuplicates[duplicateIndex] = true;
    }
    if (type === '[object Object]') {
      if (block && (Object.keys(state.dump).length !== 0)) {
        writeBlockMapping(state, level, state.dump, compact);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + state.dump;
        }
      } else {
        writeFlowMapping(state, level, state.dump);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
        }
      }
    } else if (type === '[object Array]') {
      var arrayLevel = (state.noArrayIndent && (level > 0)) ? level - 1 : level;
      if (block && (state.dump.length !== 0)) {
        writeBlockSequence(state, arrayLevel, state.dump, compact);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + state.dump;
        }
      } else {
        writeFlowSequence(state, arrayLevel, state.dump);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
        }
      }
    } else if (type === '[object String]') {
      if (state.tag !== '?') {
        writeScalar(state, state.dump, level, iskey);
      }
    } else {
      if (state.skipInvalid) return false;
      throw new YAMLException('unacceptable kind of an object to dump ' + type);
    }

    if (state.tag !== null && state.tag !== '?') {
      state.dump = '!<' + state.tag + '> ' + state.dump;
    }
  }

  return true;
}

function getDuplicateReferences(object, state) {
  var objects = [],
      duplicatesIndexes = [],
      index,
      length;

  inspectNode(object, objects, duplicatesIndexes);

  for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {
    state.duplicates.push(objects[duplicatesIndexes[index]]);
  }
  state.usedDuplicates = new Array(length);
}

function inspectNode(object, objects, duplicatesIndexes) {
  var objectKeyList,
      index,
      length;

  if (object !== null && typeof object === 'object') {
    index = objects.indexOf(object);
    if (index !== -1) {
      if (duplicatesIndexes.indexOf(index) === -1) {
        duplicatesIndexes.push(index);
      }
    } else {
      objects.push(object);

      if (Array.isArray(object)) {
        for (index = 0, length = object.length; index < length; index += 1) {
          inspectNode(object[index], objects, duplicatesIndexes);
        }
      } else {
        objectKeyList = Object.keys(object);

        for (index = 0, length = objectKeyList.length; index < length; index += 1) {
          inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);
        }
      }
    }
  }
}

function dump(input, options) {
  options = options || {};

  var state = new State(options);

  if (!state.noRefs) getDuplicateReferences(input, state);

  if (writeNode(state, 0, input, true, true)) return state.dump + '\n';

  return '';
}

function safeDump(input, options) {
  return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
}

module.exports.dump     = dump;
module.exports.safeDump = safeDump;

},{"./common":2,"./exception":4,"./schema/default_full":9,"./schema/default_safe":10}],4:[function(require,module,exports){
// YAML error class. http://stackoverflow.com/questions/8458984
//
'use strict';

function YAMLException(reason, mark) {
  // Super constructor
  Error.call(this);

  this.name = 'YAMLException';
  this.reason = reason;
  this.mark = mark;
  this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : '');

  // Include stack trace in error object
  if (Error.captureStackTrace) {
    // Chrome and NodeJS
    Error.captureStackTrace(this, this.constructor);
  } else {
    // FF, IE 10+ and Safari 6+. Fallback for others
    this.stack = (new Error()).stack || '';
  }
}


// Inherit from Error
YAMLException.prototype = Object.create(Error.prototype);
YAMLException.prototype.constructor = YAMLException;


YAMLException.prototype.toString = function toString(compact) {
  var result = this.name + ': ';

  result += this.reason || '(unknown reason)';

  if (!compact && this.mark) {
    result += ' ' + this.mark.toString();
  }

  return result;
};


module.exports = YAMLException;

},{}],5:[function(require,module,exports){
'use strict';

/*eslint-disable max-len,no-use-before-define*/

var common              = require('./common');
var YAMLException       = require('./exception');
var Mark                = require('./mark');
var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe');
var DEFAULT_FULL_SCHEMA = require('./schema/default_full');


var _hasOwnProperty = Object.prototype.hasOwnProperty;


var CONTEXT_FLOW_IN   = 1;
var CONTEXT_FLOW_OUT  = 2;
var CONTEXT_BLOCK_IN  = 3;
var CONTEXT_BLOCK_OUT = 4;


var CHOMPING_CLIP  = 1;
var CHOMPING_STRIP = 2;
var CHOMPING_KEEP  = 3;


var PATTERN_NON_PRINTABLE         = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/;
var PATTERN_FLOW_INDICATORS       = /[,\[\]\{\}]/;
var PATTERN_TAG_HANDLE            = /^(?:!|!!|![a-z\-]+!)$/i;
var PATTERN_TAG_URI               = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;


function _class(obj) { return Object.prototype.toString.call(obj); }

function is_EOL(c) {
  return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);
}

function is_WHITE_SPACE(c) {
  return (c === 0x09/* Tab */) || (c === 0x20/* Space */);
}

function is_WS_OR_EOL(c) {
  return (c === 0x09/* Tab */) ||
         (c === 0x20/* Space */) ||
         (c === 0x0A/* LF */) ||
         (c === 0x0D/* CR */);
}

function is_FLOW_INDICATOR(c) {
  return c === 0x2C/* , */ ||
         c === 0x5B/* [ */ ||
         c === 0x5D/* ] */ ||
         c === 0x7B/* { */ ||
         c === 0x7D/* } */;
}

function fromHexCode(c) {
  var lc;

  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
    return c - 0x30;
  }

  /*eslint-disable no-bitwise*/
  lc = c | 0x20;

  if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {
    return lc - 0x61 + 10;
  }

  return -1;
}

function escapedHexLen(c) {
  if (c === 0x78/* x */) { return 2; }
  if (c === 0x75/* u */) { return 4; }
  if (c === 0x55/* U */) { return 8; }
  return 0;
}

function fromDecimalCode(c) {
  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
    return c - 0x30;
  }

  return -1;
}

function simpleEscapeSequence(c) {
  /* eslint-disable indent */
  return (c === 0x30/* 0 */) ? '\x00' :
        (c === 0x61/* a */) ? '\x07' :
        (c === 0x62/* b */) ? '\x08' :
        (c === 0x74/* t */) ? '\x09' :
        (c === 0x09/* Tab */) ? '\x09' :
        (c === 0x6E/* n */) ? '\x0A' :
        (c === 0x76/* v */) ? '\x0B' :
        (c === 0x66/* f */) ? '\x0C' :
        (c === 0x72/* r */) ? '\x0D' :
        (c === 0x65/* e */) ? '\x1B' :
        (c === 0x20/* Space */) ? ' ' :
        (c === 0x22/* " */) ? '\x22' :
        (c === 0x2F/* / */) ? '/' :
        (c === 0x5C/* \ */) ? '\x5C' :
        (c === 0x4E/* N */) ? '\x85' :
        (c === 0x5F/* _ */) ? '\xA0' :
        (c === 0x4C/* L */) ? '\u2028' :
        (c === 0x50/* P */) ? '\u2029' : '';
}

function charFromCodepoint(c) {
  if (c <= 0xFFFF) {
    return String.fromCharCode(c);
  }
  // Encode UTF-16 surrogate pair
  // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF
  return String.fromCharCode(
    ((c - 0x010000) >> 10) + 0xD800,
    ((c - 0x010000) & 0x03FF) + 0xDC00
  );
}

var simpleEscapeCheck = new Array(256); // integer, for fast access
var simpleEscapeMap = new Array(256);
for (var i = 0; i < 256; i++) {
  simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;
  simpleEscapeMap[i] = simpleEscapeSequence(i);
}


function State(input, options) {
  this.input = input;

  this.filename  = options['filename']  || null;
  this.schema    = options['schema']    || DEFAULT_FULL_SCHEMA;
  this.onWarning = options['onWarning'] || null;
  this.legacy    = options['legacy']    || false;
  this.json      = options['json']      || false;
  this.listener  = options['listener']  || null;

  this.implicitTypes = this.schema.compiledImplicit;
  this.typeMap       = this.schema.compiledTypeMap;

  this.length     = input.length;
  this.position   = 0;
  this.line       = 0;
  this.lineStart  = 0;
  this.lineIndent = 0;

  this.documents = [];

  /*
  this.version;
  this.checkLineBreaks;
  this.tagMap;
  this.anchorMap;
  this.tag;
  this.anchor;
  this.kind;
  this.result;*/

}


function generateError(state, message) {
  return new YAMLException(
    message,
    new Mark(state.filename, state.input, state.position, state.line, (state.position - state.lineStart)));
}

function throwError(state, message) {
  throw generateError(state, message);
}

function throwWarning(state, message) {
  if (state.onWarning) {
    state.onWarning.call(null, generateError(state, message));
  }
}


var directiveHandlers = {

  YAML: function handleYamlDirective(state, name, args) {

    var match, major, minor;

    if (state.version !== null) {
      throwError(state, 'duplication of %YAML directive');
    }

    if (args.length !== 1) {
      throwError(state, 'YAML directive accepts exactly one argument');
    }

    match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]);

    if (match === null) {
      throwError(state, 'ill-formed argument of the YAML directive');
    }

    major = parseInt(match[1], 10);
    minor = parseInt(match[2], 10);

    if (major !== 1) {
      throwError(state, 'unacceptable YAML version of the document');
    }

    state.version = args[0];
    state.checkLineBreaks = (minor < 2);

    if (minor !== 1 && minor !== 2) {
      throwWarning(state, 'unsupported YAML version of the document');
    }
  },

  TAG: function handleTagDirective(state, name, args) {

    var handle, prefix;

    if (args.length !== 2) {
      throwError(state, 'TAG directive accepts exactly two arguments');
    }

    handle = args[0];
    prefix = args[1];

    if (!PATTERN_TAG_HANDLE.test(handle)) {
      throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');
    }

    if (_hasOwnProperty.call(state.tagMap, handle)) {
      throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle');
    }

    if (!PATTERN_TAG_URI.test(prefix)) {
      throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');
    }

    state.tagMap[handle] = prefix;
  }
};


function captureSegment(state, start, end, checkJson) {
  var _position, _length, _character, _result;

  if (start < end) {
    _result = state.input.slice(start, end);

    if (checkJson) {
      for (_position = 0, _length = _result.length; _position < _length; _position += 1) {
        _character = _result.charCodeAt(_position);
        if (!(_character === 0x09 ||
              (0x20 <= _character && _character <= 0x10FFFF))) {
          throwError(state, 'expected valid JSON character');
        }
      }
    } else if (PATTERN_NON_PRINTABLE.test(_result)) {
      throwError(state, 'the stream contains non-printable characters');
    }

    state.result += _result;
  }
}

function mergeMappings(state, destination, source, overridableKeys) {
  var sourceKeys, key, index, quantity;

  if (!common.isObject(source)) {
    throwError(state, 'cannot merge mappings; the provided source object is unacceptable');
  }

  sourceKeys = Object.keys(source);

  for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {
    key = sourceKeys[index];

    if (!_hasOwnProperty.call(destination, key)) {
      destination[key] = source[key];
      overridableKeys[key] = true;
    }
  }
}

function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) {
  var index, quantity;

  // The output is a plain object here, so keys can only be strings.
  // We need to convert keyNode to a string, but doing so can hang the process
  // (deeply nested arrays that explode exponentially using aliases).
  if (Array.isArray(keyNode)) {
    keyNode = Array.prototype.slice.call(keyNode);

    for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {
      if (Array.isArray(keyNode[index])) {
        throwError(state, 'nested arrays are not supported inside keys');
      }

      if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {
        keyNode[index] = '[object Object]';
      }
    }
  }

  // Avoid code execution in load() via toString property
  // (still use its own toString for arrays, timestamps,
  // and whatever user schema extensions happen to have @@toStringTag)
  if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {
    keyNode = '[object Object]';
  }


  keyNode = String(keyNode);

  if (_result === null) {
    _result = {};
  }

  if (keyTag === 'tag:yaml.org,2002:merge') {
    if (Array.isArray(valueNode)) {
      for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {
        mergeMappings(state, _result, valueNode[index], overridableKeys);
      }
    } else {
      mergeMappings(state, _result, valueNode, overridableKeys);
    }
  } else {
    if (!state.json &&
        !_hasOwnProperty.call(overridableKeys, keyNode) &&
        _hasOwnProperty.call(_result, keyNode)) {
      state.line = startLine || state.line;
      state.position = startPos || state.position;
      throwError(state, 'duplicated mapping key');
    }
    _result[keyNode] = valueNode;
    delete overridableKeys[keyNode];
  }

  return _result;
}

function readLineBreak(state) {
  var ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x0A/* LF */) {
    state.position++;
  } else if (ch === 0x0D/* CR */) {
    state.position++;
    if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {
      state.position++;
    }
  } else {
    throwError(state, 'a line break is expected');
  }

  state.line += 1;
  state.lineStart = state.position;
}

function skipSeparationSpace(state, allowComments, checkIndent) {
  var lineBreaks = 0,
      ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    while (is_WHITE_SPACE(ch)) {
      ch = state.input.charCodeAt(++state.position);
    }

    if (allowComments && ch === 0x23/* # */) {
      do {
        ch = state.input.charCodeAt(++state.position);
      } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);
    }

    if (is_EOL(ch)) {
      readLineBreak(state);

      ch = state.input.charCodeAt(state.position);
      lineBreaks++;
      state.lineIndent = 0;

      while (ch === 0x20/* Space */) {
        state.lineIndent++;
        ch = state.input.charCodeAt(++state.position);
      }
    } else {
      break;
    }
  }

  if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {
    throwWarning(state, 'deficient indentation');
  }

  return lineBreaks;
}

function testDocumentSeparator(state) {
  var _position = state.position,
      ch;

  ch = state.input.charCodeAt(_position);

  // Condition state.position === state.lineStart is tested
  // in parent on each call, for efficiency. No needs to test here again.
  if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&
      ch === state.input.charCodeAt(_position + 1) &&
      ch === state.input.charCodeAt(_position + 2)) {

    _position += 3;

    ch = state.input.charCodeAt(_position);

    if (ch === 0 || is_WS_OR_EOL(ch)) {
      return true;
    }
  }

  return false;
}

function writeFoldedLines(state, count) {
  if (count === 1) {
    state.result += ' ';
  } else if (count > 1) {
    state.result += common.repeat('\n', count - 1);
  }
}


function readPlainScalar(state, nodeIndent, withinFlowCollection) {
  var preceding,
      following,
      captureStart,
      captureEnd,
      hasPendingContent,
      _line,
      _lineStart,
      _lineIndent,
      _kind = state.kind,
      _result = state.result,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (is_WS_OR_EOL(ch)      ||
      is_FLOW_INDICATOR(ch) ||
      ch === 0x23/* # */    ||
      ch === 0x26/* & */    ||
      ch === 0x2A/* * */    ||
      ch === 0x21/* ! */    ||
      ch === 0x7C/* | */    ||
      ch === 0x3E/* > */    ||
      ch === 0x27/* ' */    ||
      ch === 0x22/* " */    ||
      ch === 0x25/* % */    ||
      ch === 0x40/* @ */    ||
      ch === 0x60/* ` */) {
    return false;
  }

  if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {
    following = state.input.charCodeAt(state.position + 1);

    if (is_WS_OR_EOL(following) ||
        withinFlowCollection && is_FLOW_INDICATOR(following)) {
      return false;
    }
  }

  state.kind = 'scalar';
  state.result = '';
  captureStart = captureEnd = state.position;
  hasPendingContent = false;

  while (ch !== 0) {
    if (ch === 0x3A/* : */) {
      following = state.input.charCodeAt(state.position + 1);

      if (is_WS_OR_EOL(following) ||
          withinFlowCollection && is_FLOW_INDICATOR(following)) {
        break;
      }

    } else if (ch === 0x23/* # */) {
      preceding = state.input.charCodeAt(state.position - 1);

      if (is_WS_OR_EOL(preceding)) {
        break;
      }

    } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||
               withinFlowCollection && is_FLOW_INDICATOR(ch)) {
      break;

    } else if (is_EOL(ch)) {
      _line = state.line;
      _lineStart = state.lineStart;
      _lineIndent = state.lineIndent;
      skipSeparationSpace(state, false, -1);

      if (state.lineIndent >= nodeIndent) {
        hasPendingContent = true;
        ch = state.input.charCodeAt(state.position);
        continue;
      } else {
        state.position = captureEnd;
        state.line = _line;
        state.lineStart = _lineStart;
        state.lineIndent = _lineIndent;
        break;
      }
    }

    if (hasPendingContent) {
      captureSegment(state, captureStart, captureEnd, false);
      writeFoldedLines(state, state.line - _line);
      captureStart = captureEnd = state.position;
      hasPendingContent = false;
    }

    if (!is_WHITE_SPACE(ch)) {
      captureEnd = state.position + 1;
    }

    ch = state.input.charCodeAt(++state.position);
  }

  captureSegment(state, captureStart, captureEnd, false);

  if (state.result) {
    return true;
  }

  state.kind = _kind;
  state.result = _result;
  return false;
}

function readSingleQuotedScalar(state, nodeIndent) {
  var ch,
      captureStart, captureEnd;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x27/* ' */) {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';
  state.position++;
  captureStart = captureEnd = state.position;

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    if (ch === 0x27/* ' */) {
      captureSegment(state, captureStart, state.position, true);
      ch = state.input.charCodeAt(++state.position);

      if (ch === 0x27/* ' */) {
        captureStart = state.position;
        state.position++;
        captureEnd = state.position;
      } else {
        return true;
      }

    } else if (is_EOL(ch)) {
      captureSegment(state, captureStart, captureEnd, true);
      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
      captureStart = captureEnd = state.position;

    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
      throwError(state, 'unexpected end of the document within a single quoted scalar');

    } else {
      state.position++;
      captureEnd = state.position;
    }
  }

  throwError(state, 'unexpected end of the stream within a single quoted scalar');
}

function readDoubleQuotedScalar(state, nodeIndent) {
  var captureStart,
      captureEnd,
      hexLength,
      hexResult,
      tmp,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x22/* " */) {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';
  state.position++;
  captureStart = captureEnd = state.position;

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    if (ch === 0x22/* " */) {
      captureSegment(state, captureStart, state.position, true);
      state.position++;
      return true;

    } else if (ch === 0x5C/* \ */) {
      captureSegment(state, captureStart, state.position, true);
      ch = state.input.charCodeAt(++state.position);

      if (is_EOL(ch)) {
        skipSeparationSpace(state, false, nodeIndent);

        // TODO: rework to inline fn with no type cast?
      } else if (ch < 256 && simpleEscapeCheck[ch]) {
        state.result += simpleEscapeMap[ch];
        state.position++;

      } else if ((tmp = escapedHexLen(ch)) > 0) {
        hexLength = tmp;
        hexResult = 0;

        for (; hexLength > 0; hexLength--) {
          ch = state.input.charCodeAt(++state.position);

          if ((tmp = fromHexCode(ch)) >= 0) {
            hexResult = (hexResult << 4) + tmp;

          } else {
            throwError(state, 'expected hexadecimal character');
          }
        }

        state.result += charFromCodepoint(hexResult);

        state.position++;

      } else {
        throwError(state, 'unknown escape sequence');
      }

      captureStart = captureEnd = state.position;

    } else if (is_EOL(ch)) {
      captureSegment(state, captureStart, captureEnd, true);
      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
      captureStart = captureEnd = state.position;

    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
      throwError(state, 'unexpected end of the document within a double quoted scalar');

    } else {
      state.position++;
      captureEnd = state.position;
    }
  }

  throwError(state, 'unexpected end of the stream within a double quoted scalar');
}

function readFlowCollection(state, nodeIndent) {
  var readNext = true,
      _line,
      _tag     = state.tag,
      _result,
      _anchor  = state.anchor,
      following,
      terminator,
      isPair,
      isExplicitPair,
      isMapping,
      overridableKeys = {},
      keyNode,
      keyTag,
      valueNode,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x5B/* [ */) {
    terminator = 0x5D;/* ] */
    isMapping = false;
    _result = [];
  } else if (ch === 0x7B/* { */) {
    terminator = 0x7D;/* } */
    isMapping = true;
    _result = {};
  } else {
    return false;
  }

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(++state.position);

  while (ch !== 0) {
    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if (ch === terminator) {
      state.position++;
      state.tag = _tag;
      state.anchor = _anchor;
      state.kind = isMapping ? 'mapping' : 'sequence';
      state.result = _result;
      return true;
    } else if (!readNext) {
      throwError(state, 'missed comma between flow collection entries');
    }

    keyTag = keyNode = valueNode = null;
    isPair = isExplicitPair = false;

    if (ch === 0x3F/* ? */) {
      following = state.input.charCodeAt(state.position + 1);

      if (is_WS_OR_EOL(following)) {
        isPair = isExplicitPair = true;
        state.position++;
        skipSeparationSpace(state, true, nodeIndent);
      }
    }

    _line = state.line;
    composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
    keyTag = state.tag;
    keyNode = state.result;
    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {
      isPair = true;
      ch = state.input.charCodeAt(++state.position);
      skipSeparationSpace(state, true, nodeIndent);
      composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
      valueNode = state.result;
    }

    if (isMapping) {
      storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode);
    } else if (isPair) {
      _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode));
    } else {
      _result.push(keyNode);
    }

    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if (ch === 0x2C/* , */) {
      readNext = true;
      ch = state.input.charCodeAt(++state.position);
    } else {
      readNext = false;
    }
  }

  throwError(state, 'unexpected end of the stream within a flow collection');
}

function readBlockScalar(state, nodeIndent) {
  var captureStart,
      folding,
      chomping       = CHOMPING_CLIP,
      didReadContent = false,
      detectedIndent = false,
      textIndent     = nodeIndent,
      emptyLines     = 0,
      atMoreIndented = false,
      tmp,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x7C/* | */) {
    folding = false;
  } else if (ch === 0x3E/* > */) {
    folding = true;
  } else {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';

  while (ch !== 0) {
    ch = state.input.charCodeAt(++state.position);

    if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {
      if (CHOMPING_CLIP === chomping) {
        chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;
      } else {
        throwError(state, 'repeat of a chomping mode identifier');
      }

    } else if ((tmp = fromDecimalCode(ch)) >= 0) {
      if (tmp === 0) {
        throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');
      } else if (!detectedIndent) {
        textIndent = nodeIndent + tmp - 1;
        detectedIndent = true;
      } else {
        throwError(state, 'repeat of an indentation width identifier');
      }

    } else {
      break;
    }
  }

  if (is_WHITE_SPACE(ch)) {
    do { ch = state.input.charCodeAt(++state.position); }
    while (is_WHITE_SPACE(ch));

    if (ch === 0x23/* # */) {
      do { ch = state.input.charCodeAt(++state.position); }
      while (!is_EOL(ch) && (ch !== 0));
    }
  }

  while (ch !== 0) {
    readLineBreak(state);
    state.lineIndent = 0;

    ch = state.input.charCodeAt(state.position);

    while ((!detectedIndent || state.lineIndent < textIndent) &&
           (ch === 0x20/* Space */)) {
      state.lineIndent++;
      ch = state.input.charCodeAt(++state.position);
    }

    if (!detectedIndent && state.lineIndent > textIndent) {
      textIndent = state.lineIndent;
    }

    if (is_EOL(ch)) {
      emptyLines++;
      continue;
    }

    // End of the scalar.
    if (state.lineIndent < textIndent) {

      // Perform the chomping.
      if (chomping === CHOMPING_KEEP) {
        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
      } else if (chomping === CHOMPING_CLIP) {
        if (didReadContent) { // i.e. only if the scalar is not empty.
          state.result += '\n';
        }
      }

      // Break this `while` cycle and go to the funciton's epilogue.
      break;
    }

    // Folded style: use fancy rules to handle line breaks.
    if (folding) {

      // Lines starting with white space characters (more-indented lines) are not folded.
      if (is_WHITE_SPACE(ch)) {
        atMoreIndented = true;
        // except for the first content line (cf. Example 8.1)
        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);

      // End of more-indented block.
      } else if (atMoreIndented) {
        atMoreIndented = false;
        state.result += common.repeat('\n', emptyLines + 1);

      // Just one line break - perceive as the same line.
      } else if (emptyLines === 0) {
        if (didReadContent) { // i.e. only if we have already read some scalar content.
          state.result += ' ';
        }

      // Several line breaks - perceive as different lines.
      } else {
        state.result += common.repeat('\n', emptyLines);
      }

    // Literal style: just add exact number of line breaks between content lines.
    } else {
      // Keep all line breaks except the header line break.
      state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
    }

    didReadContent = true;
    detectedIndent = true;
    emptyLines = 0;
    captureStart = state.position;

    while (!is_EOL(ch) && (ch !== 0)) {
      ch = state.input.charCodeAt(++state.position);
    }

    captureSegment(state, captureStart, state.position, false);
  }

  return true;
}

function readBlockSequence(state, nodeIndent) {
  var _line,
      _tag      = state.tag,
      _anchor   = state.anchor,
      _result   = [],
      following,
      detected  = false,
      ch;

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {

    if (ch !== 0x2D/* - */) {
      break;
    }

    following = state.input.charCodeAt(state.position + 1);

    if (!is_WS_OR_EOL(following)) {
      break;
    }

    detected = true;
    state.position++;

    if (skipSeparationSpace(state, true, -1)) {
      if (state.lineIndent <= nodeIndent) {
        _result.push(null);
        ch = state.input.charCodeAt(state.position);
        continue;
      }
    }

    _line = state.line;
    composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);
    _result.push(state.result);
    skipSeparationSpace(state, true, -1);

    ch = state.input.charCodeAt(state.position);

    if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {
      throwError(state, 'bad indentation of a sequence entry');
    } else if (state.lineIndent < nodeIndent) {
      break;
    }
  }

  if (detected) {
    state.tag = _tag;
    state.anchor = _anchor;
    state.kind = 'sequence';
    state.result = _result;
    return true;
  }
  return false;
}

function readBlockMapping(state, nodeIndent, flowIndent) {
  var following,
      allowCompact,
      _line,
      _pos,
      _tag          = state.tag,
      _anchor       = state.anchor,
      _result       = {},
      overridableKeys = {},
      keyTag        = null,
      keyNode       = null,
      valueNode     = null,
      atExplicitKey = false,
      detected      = false,
      ch;

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    following = state.input.charCodeAt(state.position + 1);
    _line = state.line; // Save the current line.
    _pos = state.position;

    //
    // Explicit notation case. There are two separate blocks:
    // first for the key (denoted by "?") and second for the value (denoted by ":")
    //
    if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {

      if (ch === 0x3F/* ? */) {
        if (atExplicitKey) {
          storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
          keyTag = keyNode = valueNode = null;
        }

        detected = true;
        atExplicitKey = true;
        allowCompact = true;

      } else if (atExplicitKey) {
        // i.e. 0x3A/* : */ === character after the explicit key.
        atExplicitKey = false;
        allowCompact = true;

      } else {
        throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');
      }

      state.position += 1;
      ch = following;

    //
    // Implicit notation case. Flow-style node as the key first, then ":", and the value.
    //
    } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {

      if (state.line === _line) {
        ch = state.input.charCodeAt(state.position);

        while (is_WHITE_SPACE(ch)) {
          ch = state.input.charCodeAt(++state.position);
        }

        if (ch === 0x3A/* : */) {
          ch = state.input.charCodeAt(++state.position);

          if (!is_WS_OR_EOL(ch)) {
            throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');
          }

          if (atExplicitKey) {
            storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
            keyTag = keyNode = valueNode = null;
          }

          detected = true;
          atExplicitKey = false;
          allowCompact = false;
          keyTag = state.tag;
          keyNode = state.result;

        } else if (detected) {
          throwError(state, 'can not read an implicit mapping pair; a colon is missed');

        } else {
          state.tag = _tag;
          state.anchor = _anchor;
          return true; // Keep the result of `composeNode`.
        }

      } else if (detected) {
        throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');

      } else {
        state.tag = _tag;
        state.anchor = _anchor;
        return true; // Keep the result of `composeNode`.
      }

    } else {
      break; // Reading is done. Go to the epilogue.
    }

    //
    // Common reading code for both explicit and implicit notations.
    //
    if (state.line === _line || state.lineIndent > nodeIndent) {
      if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {
        if (atExplicitKey) {
          keyNode = state.result;
        } else {
          valueNode = state.result;
        }
      }

      if (!atExplicitKey) {
        storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos);
        keyTag = keyNode = valueNode = null;
      }

      skipSeparationSpace(state, true, -1);
      ch = state.input.charCodeAt(state.position);
    }

    if (state.lineIndent > nodeIndent && (ch !== 0)) {
      throwError(state, 'bad indentation of a mapping entry');
    } else if (state.lineIndent < nodeIndent) {
      break;
    }
  }

  //
  // Epilogue.
  //

  // Special case: last mapping's node contains only the key in explicit notation.
  if (atExplicitKey) {
    storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
  }

  // Expose the resulting mapping.
  if (detected) {
    state.tag = _tag;
    state.anchor = _anchor;
    state.kind = 'mapping';
    state.result = _result;
  }

  return detected;
}

function readTagProperty(state) {
  var _position,
      isVerbatim = false,
      isNamed    = false,
      tagHandle,
      tagName,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x21/* ! */) return false;

  if (state.tag !== null) {
    throwError(state, 'duplication of a tag property');
  }

  ch = state.input.charCodeAt(++state.position);

  if (ch === 0x3C/* < */) {
    isVerbatim = true;
    ch = state.input.charCodeAt(++state.position);

  } else if (ch === 0x21/* ! */) {
    isNamed = true;
    tagHandle = '!!';
    ch = state.input.charCodeAt(++state.position);

  } else {
    tagHandle = '!';
  }

  _position = state.position;

  if (isVerbatim) {
    do { ch = state.input.charCodeAt(++state.position); }
    while (ch !== 0 && ch !== 0x3E/* > */);

    if (state.position < state.length) {
      tagName = state.input.slice(_position, state.position);
      ch = state.input.charCodeAt(++state.position);
    } else {
      throwError(state, 'unexpected end of the stream within a verbatim tag');
    }
  } else {
    while (ch !== 0 && !is_WS_OR_EOL(ch)) {

      if (ch === 0x21/* ! */) {
        if (!isNamed) {
          tagHandle = state.input.slice(_position - 1, state.position + 1);

          if (!PATTERN_TAG_HANDLE.test(tagHandle)) {
            throwError(state, 'named tag handle cannot contain such characters');
          }

          isNamed = true;
          _position = state.position + 1;
        } else {
          throwError(state, 'tag suffix cannot contain exclamation marks');
        }
      }

      ch = state.input.charCodeAt(++state.position);
    }

    tagName = state.input.slice(_position, state.position);

    if (PATTERN_FLOW_INDICATORS.test(tagName)) {
      throwError(state, 'tag suffix cannot contain flow indicator characters');
    }
  }

  if (tagName && !PATTERN_TAG_URI.test(tagName)) {
    throwError(state, 'tag name cannot contain such characters: ' + tagName);
  }

  if (isVerbatim) {
    state.tag = tagName;

  } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) {
    state.tag = state.tagMap[tagHandle] + tagName;

  } else if (tagHandle === '!') {
    state.tag = '!' + tagName;

  } else if (tagHandle === '!!') {
    state.tag = 'tag:yaml.org,2002:' + tagName;

  } else {
    throwError(state, 'undeclared tag handle "' + tagHandle + '"');
  }

  return true;
}

function readAnchorProperty(state) {
  var _position,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x26/* & */) return false;

  if (state.anchor !== null) {
    throwError(state, 'duplication of an anchor property');
  }

  ch = state.input.charCodeAt(++state.position);
  _position = state.position;

  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
    ch = state.input.charCodeAt(++state.position);
  }

  if (state.position === _position) {
    throwError(state, 'name of an anchor node must contain at least one character');
  }

  state.anchor = state.input.slice(_position, state.position);
  return true;
}

function readAlias(state) {
  var _position, alias,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x2A/* * */) return false;

  ch = state.input.charCodeAt(++state.position);
  _position = state.position;

  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
    ch = state.input.charCodeAt(++state.position);
  }

  if (state.position === _position) {
    throwError(state, 'name of an alias node must contain at least one character');
  }

  alias = state.input.slice(_position, state.position);

  if (!state.anchorMap.hasOwnProperty(alias)) {
    throwError(state, 'unidentified alias "' + alias + '"');
  }

  state.result = state.anchorMap[alias];
  skipSeparationSpace(state, true, -1);
  return true;
}

function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {
  var allowBlockStyles,
      allowBlockScalars,
      allowBlockCollections,
      indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent
      atNewLine  = false,
      hasContent = false,
      typeIndex,
      typeQuantity,
      type,
      flowIndent,
      blockIndent;

  if (state.listener !== null) {
    state.listener('open', state);
  }

  state.tag    = null;
  state.anchor = null;
  state.kind   = null;
  state.result = null;

  allowBlockStyles = allowBlockScalars = allowBlockCollections =
    CONTEXT_BLOCK_OUT === nodeContext ||
    CONTEXT_BLOCK_IN  === nodeContext;

  if (allowToSeek) {
    if (skipSeparationSpace(state, true, -1)) {
      atNewLine = true;

      if (state.lineIndent > parentIndent) {
        indentStatus = 1;
      } else if (state.lineIndent === parentIndent) {
        indentStatus = 0;
      } else if (state.lineIndent < parentIndent) {
        indentStatus = -1;
      }
    }
  }

  if (indentStatus === 1) {
    while (readTagProperty(state) || readAnchorProperty(state)) {
      if (skipSeparationSpace(state, true, -1)) {
        atNewLine = true;
        allowBlockCollections = allowBlockStyles;

        if (state.lineIndent > parentIndent) {
          indentStatus = 1;
        } else if (state.lineIndent === parentIndent) {
          indentStatus = 0;
        } else if (state.lineIndent < parentIndent) {
          indentStatus = -1;
        }
      } else {
        allowBlockCollections = false;
      }
    }
  }

  if (allowBlockCollections) {
    allowBlockCollections = atNewLine || allowCompact;
  }

  if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {
    if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {
      flowIndent = parentIndent;
    } else {
      flowIndent = parentIndent + 1;
    }

    blockIndent = state.position - state.lineStart;

    if (indentStatus === 1) {
      if (allowBlockCollections &&
          (readBlockSequence(state, blockIndent) ||
           readBlockMapping(state, blockIndent, flowIndent)) ||
          readFlowCollection(state, flowIndent)) {
        hasContent = true;
      } else {
        if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||
            readSingleQuotedScalar(state, flowIndent) ||
            readDoubleQuotedScalar(state, flowIndent)) {
          hasContent = true;

        } else if (readAlias(state)) {
          hasContent = true;

          if (state.tag !== null || state.anchor !== null) {
            throwError(state, 'alias node should not have any properties');
          }

        } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {
          hasContent = true;

          if (state.tag === null) {
            state.tag = '?';
          }
        }

        if (state.anchor !== null) {
          state.anchorMap[state.anchor] = state.result;
        }
      }
    } else if (indentStatus === 0) {
      // Special case: block sequences are allowed to have same indentation level as the parent.
      // http://www.yaml.org/spec/1.2/spec.html#id2799784
      hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);
    }
  }

  if (state.tag !== null && state.tag !== '!') {
    if (state.tag === '?') {
      // Implicit resolving is not allowed for non-scalar types, and '?'
      // non-specific tag is only automatically assigned to plain scalars.
      //
      // We only need to check kind conformity in case user explicitly assigns '?'
      // tag, for example like this: "!<?> [0]"
      //
      if (state.result !== null && state.kind !== 'scalar') {
        throwError(state, 'unacceptable node kind for !<?> tag; it should be "scalar", not "' + state.kind + '"');
      }

      for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {
        type = state.implicitTypes[typeIndex];

        if (type.resolve(state.result)) { // `state.result` updated in resolver if matched
          state.result = type.construct(state.result);
          state.tag = type.tag;
          if (state.anchor !== null) {
            state.anchorMap[state.anchor] = state.result;
          }
          break;
        }
      }
    } else if (_hasOwnProperty.call(state.typeMap[state.kind || 'fallback'], state.tag)) {
      type = state.typeMap[state.kind || 'fallback'][state.tag];

      if (state.result !== null && type.kind !== state.kind) {
        throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"');
      }

      if (!type.resolve(state.result)) { // `state.result` updated in resolver if matched
        throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');
      } else {
        state.result = type.construct(state.result);
        if (state.anchor !== null) {
          state.anchorMap[state.anchor] = state.result;
        }
      }
    } else {
      throwError(state, 'unknown tag !<' + state.tag + '>');
    }
  }

  if (state.listener !== null) {
    state.listener('close', state);
  }
  return state.tag !== null ||  state.anchor !== null || hasContent;
}

function readDocument(state) {
  var documentStart = state.position,
      _position,
      directiveName,
      directiveArgs,
      hasDirectives = false,
      ch;

  state.version = null;
  state.checkLineBreaks = state.legacy;
  state.tagMap = {};
  state.anchorMap = {};

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    skipSeparationSpace(state, true, -1);

    ch = state.input.charCodeAt(state.position);

    if (state.lineIndent > 0 || ch !== 0x25/* % */) {
      break;
    }

    hasDirectives = true;
    ch = state.input.charCodeAt(++state.position);
    _position = state.position;

    while (ch !== 0 && !is_WS_OR_EOL(ch)) {
      ch = state.input.charCodeAt(++state.position);
    }

    directiveName = state.input.slice(_position, state.position);
    directiveArgs = [];

    if (directiveName.length < 1) {
      throwError(state, 'directive name must not be less than one character in length');
    }

    while (ch !== 0) {
      while (is_WHITE_SPACE(ch)) {
        ch = state.input.charCodeAt(++state.position);
      }

      if (ch === 0x23/* # */) {
        do { ch = state.input.charCodeAt(++state.position); }
        while (ch !== 0 && !is_EOL(ch));
        break;
      }

      if (is_EOL(ch)) break;

      _position = state.position;

      while (ch !== 0 && !is_WS_OR_EOL(ch)) {
        ch = state.input.charCodeAt(++state.position);
      }

      directiveArgs.push(state.input.slice(_position, state.position));
    }

    if (ch !== 0) readLineBreak(state);

    if (_hasOwnProperty.call(directiveHandlers, directiveName)) {
      directiveHandlers[directiveName](state, directiveName, directiveArgs);
    } else {
      throwWarning(state, 'unknown document directive "' + directiveName + '"');
    }
  }

  skipSeparationSpace(state, true, -1);

  if (state.lineIndent === 0 &&
      state.input.charCodeAt(state.position)     === 0x2D/* - */ &&
      state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&
      state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {
    state.position += 3;
    skipSeparationSpace(state, true, -1);

  } else if (hasDirectives) {
    throwError(state, 'directives end mark is expected');
  }

  composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);
  skipSeparationSpace(state, true, -1);

  if (state.checkLineBreaks &&
      PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {
    throwWarning(state, 'non-ASCII line breaks are interpreted as content');
  }

  state.documents.push(state.result);

  if (state.position === state.lineStart && testDocumentSeparator(state)) {

    if (state.input.charCodeAt(state.position) === 0x2E/* . */) {
      state.position += 3;
      skipSeparationSpace(state, true, -1);
    }
    return;
  }

  if (state.position < (state.length - 1)) {
    throwError(state, 'end of the stream or a document separator is expected');
  } else {
    return;
  }
}


function loadDocuments(input, options) {
  input = String(input);
  options = options || {};

  if (input.length !== 0) {

    // Add tailing `\n` if not exists
    if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&
        input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {
      input += '\n';
    }

    // Strip BOM
    if (input.charCodeAt(0) === 0xFEFF) {
      input = input.slice(1);
    }
  }

  var state = new State(input, options);

  var nullpos = input.indexOf('\0');

  if (nullpos !== -1) {
    state.position = nullpos;
    throwError(state, 'null byte is not allowed in input');
  }

  // Use 0 as string terminator. That significantly simplifies bounds check.
  state.input += '\0';

  while (state.input.charCodeAt(state.position) === 0x20/* Space */) {
    state.lineIndent += 1;
    state.position += 1;
  }

  while (state.position < (state.length - 1)) {
    readDocument(state);
  }

  return state.documents;
}


function loadAll(input, iterator, options) {
  if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {
    options = iterator;
    iterator = null;
  }

  var documents = loadDocuments(input, options);

  if (typeof iterator !== 'function') {
    return documents;
  }

  for (var index = 0, length = documents.length; index < length; index += 1) {
    iterator(documents[index]);
  }
}


function load(input, options) {
  var documents = loadDocuments(input, options);

  if (documents.length === 0) {
    /*eslint-disable no-undefined*/
    return undefined;
  } else if (documents.length === 1) {
    return documents[0];
  }
  throw new YAMLException('expected a single document in the stream, but found more');
}


function safeLoadAll(input, iterator, options) {
  if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') {
    options = iterator;
    iterator = null;
  }

  return loadAll(input, iterator, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
}


function safeLoad(input, options) {
  return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));
}


module.exports.loadAll     = loadAll;
module.exports.load        = load;
module.exports.safeLoadAll = safeLoadAll;
module.exports.safeLoad    = safeLoad;

},{"./common":2,"./exception":4,"./mark":6,"./schema/default_full":9,"./schema/default_safe":10}],6:[function(require,module,exports){
'use strict';


var common = require('./common');


function Mark(name, buffer, position, line, column) {
  this.name     = name;
  this.buffer   = buffer;
  this.position = position;
  this.line     = line;
  this.column   = column;
}


Mark.prototype.getSnippet = function getSnippet(indent, maxLength) {
  var head, start, tail, end, snippet;

  if (!this.buffer) return null;

  indent = indent || 4;
  maxLength = maxLength || 75;

  head = '';
  start = this.position;

  while (start > 0 && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(start - 1)) === -1) {
    start -= 1;
    if (this.position - start > (maxLength / 2 - 1)) {
      head = ' ... ';
      start += 5;
      break;
    }
  }

  tail = '';
  end = this.position;

  while (end < this.buffer.length && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(end)) === -1) {
    end += 1;
    if (end - this.position > (maxLength / 2 - 1)) {
      tail = ' ... ';
      end -= 5;
      break;
    }
  }

  snippet = this.buffer.slice(start, end);

  return common.repeat(' ', indent) + head + snippet + tail + '\n' +
         common.repeat(' ', indent + this.position - start + head.length) + '^';
};


Mark.prototype.toString = function toString(compact) {
  var snippet, where = '';

  if (this.name) {
    where += 'in "' + this.name + '" ';
  }

  where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1);

  if (!compact) {
    snippet = this.getSnippet();

    if (snippet) {
      where += ':\n' + snippet;
    }
  }

  return where;
};


module.exports = Mark;

},{"./common":2}],7:[function(require,module,exports){
'use strict';

/*eslint-disable max-len*/

var common        = require('./common');
var YAMLException = require('./exception');
var Type          = require('./type');


function compileList(schema, name, result) {
  var exclude = [];

  schema.include.forEach(function (includedSchema) {
    result = compileList(includedSchema, name, result);
  });

  schema[name].forEach(function (currentType) {
    result.forEach(function (previousType, previousIndex) {
      if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) {
        exclude.push(previousIndex);
      }
    });

    result.push(currentType);
  });

  return result.filter(function (type, index) {
    return exclude.indexOf(index) === -1;
  });
}


function compileMap(/* lists... */) {
  var result = {
        scalar: {},
        sequence: {},
        mapping: {},
        fallback: {}
      }, index, length;

  function collectType(type) {
    result[type.kind][type.tag] = result['fallback'][type.tag] = type;
  }

  for (index = 0, length = arguments.length; index < length; index += 1) {
    arguments[index].forEach(collectType);
  }
  return result;
}


function Schema(definition) {
  this.include  = definition.include  || [];
  this.implicit = definition.implicit || [];
  this.explicit = definition.explicit || [];

  this.implicit.forEach(function (type) {
    if (type.loadKind && type.loadKind !== 'scalar') {
      throw new YAMLException('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');
    }
  });

  this.compiledImplicit = compileList(this, 'implicit', []);
  this.compiledExplicit = compileList(this, 'explicit', []);
  this.compiledTypeMap  = compileMap(this.compiledImplicit, this.compiledExplicit);
}


Schema.DEFAULT = null;


Schema.create = function createSchema() {
  var schemas, types;

  switch (arguments.length) {
    case 1:
      schemas = Schema.DEFAULT;
      types = arguments[0];
      break;

    case 2:
      schemas = arguments[0];
      types = arguments[1];
      break;

    default:
      throw new YAMLException('Wrong number of arguments for Schema.create function');
  }

  schemas = common.toArray(schemas);
  types = common.toArray(types);

  if (!schemas.every(function (schema) { return schema instanceof Schema; })) {
    throw new YAMLException('Specified list of super schemas (or a single Schema object) contains a non-Schema object.');
  }

  if (!types.every(function (type) { return type instanceof Type; })) {
    throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.');
  }

  return new Schema({
    include: schemas,
    explicit: types
  });
};


module.exports = Schema;

},{"./common":2,"./exception":4,"./type":13}],8:[function(require,module,exports){
// Standard YAML's Core schema.
// http://www.yaml.org/spec/1.2/spec.html#id2804923
//
// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.
// So, Core schema has no distinctions from JSON schema is JS-YAML.


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  include: [
    require('./json')
  ]
});

},{"../schema":7,"./json":12}],9:[function(require,module,exports){
// JS-YAML's default schema for `load` function.
// It is not described in the YAML specification.
//
// This schema is based on JS-YAML's default safe schema and includes
// JavaScript-specific types: !!js/undefined, !!js/regexp and !!js/function.
//
// Also this schema is used as default base schema at `Schema.create` function.


'use strict';


var Schema = require('../schema');


module.exports = Schema.DEFAULT = new Schema({
  include: [
    require('./default_safe')
  ],
  explicit: [
    require('../type/js/undefined'),
    require('../type/js/regexp'),
    require('../type/js/function')
  ]
});

},{"../schema":7,"../type/js/function":18,"../type/js/regexp":19,"../type/js/undefined":20,"./default_safe":10}],10:[function(require,module,exports){
// JS-YAML's default schema for `safeLoad` function.
// It is not described in the YAML specification.
//
// This schema is based on standard YAML's Core schema and includes most of
// extra types described at YAML tag repository. (http://yaml.org/type/)


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  include: [
    require('./core')
  ],
  implicit: [
    require('../type/timestamp'),
    require('../type/merge')
  ],
  explicit: [
    require('../type/binary'),
    require('../type/omap'),
    require('../type/pairs'),
    require('../type/set')
  ]
});

},{"../schema":7,"../type/binary":14,"../type/merge":22,"../type/omap":24,"../type/pairs":25,"../type/set":27,"../type/timestamp":29,"./core":8}],11:[function(require,module,exports){
// Standard YAML's Failsafe schema.
// http://www.yaml.org/spec/1.2/spec.html#id2802346


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  explicit: [
    require('../type/str'),
    require('../type/seq'),
    require('../type/map')
  ]
});

},{"../schema":7,"../type/map":21,"../type/seq":26,"../type/str":28}],12:[function(require,module,exports){
// Standard YAML's JSON schema.
// http://www.yaml.org/spec/1.2/spec.html#id2803231
//
// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.
// So, this schema is not such strict as defined in the YAML specification.
// It allows numbers in binary notaion, use `Null` and `NULL` as `null`, etc.


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  include: [
    require('./failsafe')
  ],
  implicit: [
    require('../type/null'),
    require('../type/bool'),
    require('../type/int'),
    require('../type/float')
  ]
});

},{"../schema":7,"../type/bool":15,"../type/float":16,"../type/int":17,"../type/null":23,"./failsafe":11}],13:[function(require,module,exports){
'use strict';

var YAMLException = require('./exception');

var TYPE_CONSTRUCTOR_OPTIONS = [
  'kind',
  'resolve',
  'construct',
  'instanceOf',
  'predicate',
  'represent',
  'defaultStyle',
  'styleAliases'
];

var YAML_NODE_KINDS = [
  'scalar',
  'sequence',
  'mapping'
];

function compileStyleAliases(map) {
  var result = {};

  if (map !== null) {
    Object.keys(map).forEach(function (style) {
      map[style].forEach(function (alias) {
        result[String(alias)] = style;
      });
    });
  }

  return result;
}

function Type(tag, options) {
  options = options || {};

  Object.keys(options).forEach(function (name) {
    if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {
      throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.');
    }
  });

  // TODO: Add tag format check.
  this.tag          = tag;
  this.kind         = options['kind']         || null;
  this.resolve      = options['resolve']      || function () { return true; };
  this.construct    = options['construct']    || function (data) { return data; };
  this.instanceOf   = options['instanceOf']   || null;
  this.predicate    = options['predicate']    || null;
  this.represent    = options['represent']    || null;
  this.defaultStyle = options['defaultStyle'] || null;
  this.styleAliases = compileStyleAliases(options['styleAliases'] || null);

  if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {
    throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
  }
}

module.exports = Type;

},{"./exception":4}],14:[function(require,module,exports){
'use strict';

/*eslint-disable no-bitwise*/

var NodeBuffer;

try {
  // A trick for browserified version, to not include `Buffer` shim
  var _require = require;
  NodeBuffer = _require('buffer').Buffer;
} catch (__) {}

var Type       = require('../type');


// [ 64, 65, 66 ] -> [ padding, CR, LF ]
var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r';


function resolveYamlBinary(data) {
  if (data === null) return false;

  var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;

  // Convert one by one.
  for (idx = 0; idx < max; idx++) {
    code = map.indexOf(data.charAt(idx));

    // Skip CR/LF
    if (code > 64) continue;

    // Fail on illegal characters
    if (code < 0) return false;

    bitlen += 6;
  }

  // If there are any bits left, source was corrupted
  return (bitlen % 8) === 0;
}

function constructYamlBinary(data) {
  var idx, tailbits,
      input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan
      max = input.length,
      map = BASE64_MAP,
      bits = 0,
      result = [];

  // Collect by 6*4 bits (3 bytes)

  for (idx = 0; idx < max; idx++) {
    if ((idx % 4 === 0) && idx) {
      result.push((bits >> 16) & 0xFF);
      result.push((bits >> 8) & 0xFF);
      result.push(bits & 0xFF);
    }

    bits = (bits << 6) | map.indexOf(input.charAt(idx));
  }

  // Dump tail

  tailbits = (max % 4) * 6;

  if (tailbits === 0) {
    result.push((bits >> 16) & 0xFF);
    result.push((bits >> 8) & 0xFF);
    result.push(bits & 0xFF);
  } else if (tailbits === 18) {
    result.push((bits >> 10) & 0xFF);
    result.push((bits >> 2) & 0xFF);
  } else if (tailbits === 12) {
    result.push((bits >> 4) & 0xFF);
  }

  // Wrap into Buffer for NodeJS and leave Array for browser
  if (NodeBuffer) {
    // Support node 6.+ Buffer API when available
    return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result);
  }

  return result;
}

function representYamlBinary(object /*, style*/) {
  var result = '', bits = 0, idx, tail,
      max = object.length,
      map = BASE64_MAP;

  // Convert every three bytes to 4 ASCII characters.

  for (idx = 0; idx < max; idx++) {
    if ((idx % 3 === 0) && idx) {
      result += map[(bits >> 18) & 0x3F];
      result += map[(bits >> 12) & 0x3F];
      result += map[(bits >> 6) & 0x3F];
      result += map[bits & 0x3F];
    }

    bits = (bits << 8) + object[idx];
  }

  // Dump tail

  tail = max % 3;

  if (tail === 0) {
    result += map[(bits >> 18) & 0x3F];
    result += map[(bits >> 12) & 0x3F];
    result += map[(bits >> 6) & 0x3F];
    result += map[bits & 0x3F];
  } else if (tail === 2) {
    result += map[(bits >> 10) & 0x3F];
    result += map[(bits >> 4) & 0x3F];
    result += map[(bits << 2) & 0x3F];
    result += map[64];
  } else if (tail === 1) {
    result += map[(bits >> 2) & 0x3F];
    result += map[(bits << 4) & 0x3F];
    result += map[64];
    result += map[64];
  }

  return result;
}

function isBinary(object) {
  return NodeBuffer && NodeBuffer.isBuffer(object);
}

module.exports = new Type('tag:yaml.org,2002:binary', {
  kind: 'scalar',
  resolve: resolveYamlBinary,
  construct: constructYamlBinary,
  predicate: isBinary,
  represent: representYamlBinary
});

},{"../type":13}],15:[function(require,module,exports){
'use strict';

var Type = require('../type');

function resolveYamlBoolean(data) {
  if (data === null) return false;

  var max = data.length;

  return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||
         (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));
}

function constructYamlBoolean(data) {
  return data === 'true' ||
         data === 'True' ||
         data === 'TRUE';
}

function isBoolean(object) {
  return Object.prototype.toString.call(object) === '[object Boolean]';
}

module.exports = new Type('tag:yaml.org,2002:bool', {
  kind: 'scalar',
  resolve: resolveYamlBoolean,
  construct: constructYamlBoolean,
  predicate: isBoolean,
  represent: {
    lowercase: function (object) { return object ? 'true' : 'false'; },
    uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },
    camelcase: function (object) { return object ? 'True' : 'False'; }
  },
  defaultStyle: 'lowercase'
});

},{"../type":13}],16:[function(require,module,exports){
'use strict';

var common = require('../common');
var Type   = require('../type');

var YAML_FLOAT_PATTERN = new RegExp(
  // 2.5e4, 2.5 and integers
  '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +
  // .2e4, .2
  // special case, seems not from spec
  '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +
  // 20:59
  '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' +
  // .inf
  '|[-+]?\\.(?:inf|Inf|INF)' +
  // .nan
  '|\\.(?:nan|NaN|NAN))$');

function resolveYamlFloat(data) {
  if (data === null) return false;

  if (!YAML_FLOAT_PATTERN.test(data) ||
      // Quick hack to not allow integers end with `_`
      // Probably should update regexp & check speed
      data[data.length - 1] === '_') {
    return false;
  }

  return true;
}

function constructYamlFloat(data) {
  var value, sign, base, digits;

  value  = data.replace(/_/g, '').toLowerCase();
  sign   = value[0] === '-' ? -1 : 1;
  digits = [];

  if ('+-'.indexOf(value[0]) >= 0) {
    value = value.slice(1);
  }

  if (value === '.inf') {
    return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;

  } else if (value === '.nan') {
    return NaN;

  } else if (value.indexOf(':') >= 0) {
    value.split(':').forEach(function (v) {
      digits.unshift(parseFloat(v, 10));
    });

    value = 0.0;
    base = 1;

    digits.forEach(function (d) {
      value += d * base;
      base *= 60;
    });

    return sign * value;

  }
  return sign * parseFloat(value, 10);
}


var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;

function representYamlFloat(object, style) {
  var res;

  if (isNaN(object)) {
    switch (style) {
      case 'lowercase': return '.nan';
      case 'uppercase': return '.NAN';
      case 'camelcase': return '.NaN';
    }
  } else if (Number.POSITIVE_INFINITY === object) {
    switch (style) {
      case 'lowercase': return '.inf';
      case 'uppercase': return '.INF';
      case 'camelcase': return '.Inf';
    }
  } else if (Number.NEGATIVE_INFINITY === object) {
    switch (style) {
      case 'lowercase': return '-.inf';
      case 'uppercase': return '-.INF';
      case 'camelcase': return '-.Inf';
    }
  } else if (common.isNegativeZero(object)) {
    return '-0.0';
  }

  res = object.toString(10);

  // JS stringifier can build scientific format without dots: 5e-100,
  // while YAML requres dot: 5.e-100. Fix it with simple hack

  return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;
}

function isFloat(object) {
  return (Object.prototype.toString.call(object) === '[object Number]') &&
         (object % 1 !== 0 || common.isNegativeZero(object));
}

module.exports = new Type('tag:yaml.org,2002:float', {
  kind: 'scalar',
  resolve: resolveYamlFloat,
  construct: constructYamlFloat,
  predicate: isFloat,
  represent: representYamlFloat,
  defaultStyle: 'lowercase'
});

},{"../common":2,"../type":13}],17:[function(require,module,exports){
'use strict';

var common = require('../common');
var Type   = require('../type');

function isHexCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||
         ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||
         ((0x61/* a */ <= c) && (c <= 0x66/* f */));
}

function isOctCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));
}

function isDecCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));
}

function resolveYamlInteger(data) {
  if (data === null) return false;

  var max = data.length,
      index = 0,
      hasDigits = false,
      ch;

  if (!max) return false;

  ch = data[index];

  // sign
  if (ch === '-' || ch === '+') {
    ch = data[++index];
  }

  if (ch === '0') {
    // 0
    if (index + 1 === max) return true;
    ch = data[++index];

    // base 2, base 8, base 16

    if (ch === 'b') {
      // base 2
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (ch !== '0' && ch !== '1') return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }


    if (ch === 'x') {
      // base 16
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (!isHexCode(data.charCodeAt(index))) return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }

    // base 8
    for (; index < max; index++) {
      ch = data[index];
      if (ch === '_') continue;
      if (!isOctCode(data.charCodeAt(index))) return false;
      hasDigits = true;
    }
    return hasDigits && ch !== '_';
  }

  // base 10 (except 0) or base 60

  // value should not start with `_`;
  if (ch === '_') return false;

  for (; index < max; index++) {
    ch = data[index];
    if (ch === '_') continue;
    if (ch === ':') break;
    if (!isDecCode(data.charCodeAt(index))) {
      return false;
    }
    hasDigits = true;
  }

  // Should have digits and should not end with `_`
  if (!hasDigits || ch === '_') return false;

  // if !base60 - done;
  if (ch !== ':') return true;

  // base60 almost not used, no needs to optimize
  return /^(:[0-5]?[0-9])+$/.test(data.slice(index));
}

function constructYamlInteger(data) {
  var value = data, sign = 1, ch, base, digits = [];

  if (value.indexOf('_') !== -1) {
    value = value.replace(/_/g, '');
  }

  ch = value[0];

  if (ch === '-' || ch === '+') {
    if (ch === '-') sign = -1;
    value = value.slice(1);
    ch = value[0];
  }

  if (value === '0') return 0;

  if (ch === '0') {
    if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);
    if (value[1] === 'x') return sign * parseInt(value, 16);
    return sign * parseInt(value, 8);
  }

  if (value.indexOf(':') !== -1) {
    value.split(':').forEach(function (v) {
      digits.unshift(parseInt(v, 10));
    });

    value = 0;
    base = 1;

    digits.forEach(function (d) {
      value += (d * base);
      base *= 60;
    });

    return sign * value;

  }

  return sign * parseInt(value, 10);
}

function isInteger(object) {
  return (Object.prototype.toString.call(object)) === '[object Number]' &&
         (object % 1 === 0 && !common.isNegativeZero(object));
}

module.exports = new Type('tag:yaml.org,2002:int', {
  kind: 'scalar',
  resolve: resolveYamlInteger,
  construct: constructYamlInteger,
  predicate: isInteger,
  represent: {
    binary:      function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },
    octal:       function (obj) { return obj >= 0 ? '0'  + obj.toString(8) : '-0'  + obj.toString(8).slice(1); },
    decimal:     function (obj) { return obj.toString(10); },
    /* eslint-disable max-len */
    hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() :  '-0x' + obj.toString(16).toUpperCase().slice(1); }
  },
  defaultStyle: 'decimal',
  styleAliases: {
    binary:      [ 2,  'bin' ],
    octal:       [ 8,  'oct' ],
    decimal:     [ 10, 'dec' ],
    hexadecimal: [ 16, 'hex' ]
  }
});

},{"../common":2,"../type":13}],18:[function(require,module,exports){
'use strict';

var esprima;

// Browserified version does not have esprima
//
// 1. For node.js just require module as deps
// 2. For browser try to require mudule via external AMD system.
//    If not found - try to fallback to window.esprima. If not
//    found too - then fail to parse.
//
try {
  // workaround to exclude package from browserify list.
  var _require = require;
  esprima = _require('esprima');
} catch (_) {
  /* eslint-disable no-redeclare */
  /* global window */
  if (typeof window !== 'undefined') esprima = window.esprima;
}

var Type = require('../../type');

function resolveJavascriptFunction(data) {
  if (data === null) return false;

  try {
    var source = '(' + data + ')',
        ast    = esprima.parse(source, { range: true });

    if (ast.type                    !== 'Program'             ||
        ast.body.length             !== 1                     ||
        ast.body[0].type            !== 'ExpressionStatement' ||
        (ast.body[0].expression.type !== 'ArrowFunctionExpression' &&
          ast.body[0].expression.type !== 'FunctionExpression')) {
      return false;
    }

    return true;
  } catch (err) {
    return false;
  }
}

function constructJavascriptFunction(data) {
  /*jslint evil:true*/

  var source = '(' + data + ')',
      ast    = esprima.parse(source, { range: true }),
      params = [],
      body;

  if (ast.type                    !== 'Program'             ||
      ast.body.length             !== 1                     ||
      ast.body[0].type            !== 'ExpressionStatement' ||
      (ast.body[0].expression.type !== 'ArrowFunctionExpression' &&
        ast.body[0].expression.type !== 'FunctionExpression')) {
    throw new Error('Failed to resolve function');
  }

  ast.body[0].expression.params.forEach(function (param) {
    params.push(param.name);
  });

  body = ast.body[0].expression.body.range;

  // Esprima's ranges include the first '{' and the last '}' characters on
  // function expressions. So cut them out.
  if (ast.body[0].expression.body.type === 'BlockStatement') {
    /*eslint-disable no-new-func*/
    return new Function(params, source.slice(body[0] + 1, body[1] - 1));
  }
  // ES6 arrow functions can omit the BlockStatement. In that case, just return
  // the body.
  /*eslint-disable no-new-func*/
  return new Function(params, 'return ' + source.slice(body[0], body[1]));
}

function representJavascriptFunction(object /*, style*/) {
  return object.toString();
}

function isFunction(object) {
  return Object.prototype.toString.call(object) === '[object Function]';
}

module.exports = new Type('tag:yaml.org,2002:js/function', {
  kind: 'scalar',
  resolve: resolveJavascriptFunction,
  construct: constructJavascriptFunction,
  predicate: isFunction,
  represent: representJavascriptFunction
});

},{"../../type":13}],19:[function(require,module,exports){
'use strict';

var Type = require('../../type');

function resolveJavascriptRegExp(data) {
  if (data === null) return false;
  if (data.length === 0) return false;

  var regexp = data,
      tail   = /\/([gim]*)$/.exec(data),
      modifiers = '';

  // if regexp starts with '/' it can have modifiers and must be properly closed
  // `/foo/gim` - modifiers tail can be maximum 3 chars
  if (regexp[0] === '/') {
    if (tail) modifiers = tail[1];

    if (modifiers.length > 3) return false;
    // if expression starts with /, is should be properly terminated
    if (regexp[regexp.length - modifiers.length - 1] !== '/') return false;
  }

  return true;
}

function constructJavascriptRegExp(data) {
  var regexp = data,
      tail   = /\/([gim]*)$/.exec(data),
      modifiers = '';

  // `/foo/gim` - tail can be maximum 4 chars
  if (regexp[0] === '/') {
    if (tail) modifiers = tail[1];
    regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
  }

  return new RegExp(regexp, modifiers);
}

function representJavascriptRegExp(object /*, style*/) {
  var result = '/' + object.source + '/';

  if (object.global) result += 'g';
  if (object.multiline) result += 'm';
  if (object.ignoreCase) result += 'i';

  return result;
}

function isRegExp(object) {
  return Object.prototype.toString.call(object) === '[object RegExp]';
}

module.exports = new Type('tag:yaml.org,2002:js/regexp', {
  kind: 'scalar',
  resolve: resolveJavascriptRegExp,
  construct: constructJavascriptRegExp,
  predicate: isRegExp,
  represent: representJavascriptRegExp
});

},{"../../type":13}],20:[function(require,module,exports){
'use strict';

var Type = require('../../type');

function resolveJavascriptUndefined() {
  return true;
}

function constructJavascriptUndefined() {
  /*eslint-disable no-undefined*/
  return undefined;
}

function representJavascriptUndefined() {
  return '';
}

function isUndefined(object) {
  return typeof object === 'undefined';
}

module.exports = new Type('tag:yaml.org,2002:js/undefined', {
  kind: 'scalar',
  resolve: resolveJavascriptUndefined,
  construct: constructJavascriptUndefined,
  predicate: isUndefined,
  represent: representJavascriptUndefined
});

},{"../../type":13}],21:[function(require,module,exports){
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:map', {
  kind: 'mapping',
  construct: function (data) { return data !== null ? data : {}; }
});

},{"../type":13}],22:[function(require,module,exports){
'use strict';

var Type = require('../type');

function resolveYamlMerge(data) {
  return data === '<<' || data === null;
}

module.exports = new Type('tag:yaml.org,2002:merge', {
  kind: 'scalar',
  resolve: resolveYamlMerge
});

},{"../type":13}],23:[function(require,module,exports){
'use strict';

var Type = require('../type');

function resolveYamlNull(data) {
  if (data === null) return true;

  var max = data.length;

  return (max === 1 && data === '~') ||
         (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));
}

function constructYamlNull() {
  return null;
}

function isNull(object) {
  return object === null;
}

module.exports = new Type('tag:yaml.org,2002:null', {
  kind: 'scalar',
  resolve: resolveYamlNull,
  construct: constructYamlNull,
  predicate: isNull,
  represent: {
    canonical: function () { return '~';    },
    lowercase: function () { return 'null'; },
    uppercase: function () { return 'NULL'; },
    camelcase: function () { return 'Null'; }
  },
  defaultStyle: 'lowercase'
});

},{"../type":13}],24:[function(require,module,exports){
'use strict';

var Type = require('../type');

var _hasOwnProperty = Object.prototype.hasOwnProperty;
var _toString       = Object.prototype.toString;

function resolveYamlOmap(data) {
  if (data === null) return true;

  var objectKeys = [], index, length, pair, pairKey, pairHasKey,
      object = data;

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];
    pairHasKey = false;

    if (_toString.call(pair) !== '[object Object]') return false;

    for (pairKey in pair) {
      if (_hasOwnProperty.call(pair, pairKey)) {
        if (!pairHasKey) pairHasKey = true;
        else return false;
      }
    }

    if (!pairHasKey) return false;

    if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);
    else return false;
  }

  return true;
}

function constructYamlOmap(data) {
  return data !== null ? data : [];
}

module.exports = new Type('tag:yaml.org,2002:omap', {
  kind: 'sequence',
  resolve: resolveYamlOmap,
  construct: constructYamlOmap
});

},{"../type":13}],25:[function(require,module,exports){
'use strict';

var Type = require('../type');

var _toString = Object.prototype.toString;

function resolveYamlPairs(data) {
  if (data === null) return true;

  var index, length, pair, keys, result,
      object = data;

  result = new Array(object.length);

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];

    if (_toString.call(pair) !== '[object Object]') return false;

    keys = Object.keys(pair);

    if (keys.length !== 1) return false;

    result[index] = [ keys[0], pair[keys[0]] ];
  }

  return true;
}

function constructYamlPairs(data) {
  if (data === null) return [];

  var index, length, pair, keys, result,
      object = data;

  result = new Array(object.length);

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];

    keys = Object.keys(pair);

    result[index] = [ keys[0], pair[keys[0]] ];
  }

  return result;
}

module.exports = new Type('tag:yaml.org,2002:pairs', {
  kind: 'sequence',
  resolve: resolveYamlPairs,
  construct: constructYamlPairs
});

},{"../type":13}],26:[function(require,module,exports){
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:seq', {
  kind: 'sequence',
  construct: function (data) { return data !== null ? data : []; }
});

},{"../type":13}],27:[function(require,module,exports){
'use strict';

var Type = require('../type');

var _hasOwnProperty = Object.prototype.hasOwnProperty;

function resolveYamlSet(data) {
  if (data === null) return true;

  var key, object = data;

  for (key in object) {
    if (_hasOwnProperty.call(object, key)) {
      if (object[key] !== null) return false;
    }
  }

  return true;
}

function constructYamlSet(data) {
  return data !== null ? data : {};
}

module.exports = new Type('tag:yaml.org,2002:set', {
  kind: 'mapping',
  resolve: resolveYamlSet,
  construct: constructYamlSet
});

},{"../type":13}],28:[function(require,module,exports){
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:str', {
  kind: 'scalar',
  construct: function (data) { return data !== null ? data : ''; }
});

},{"../type":13}],29:[function(require,module,exports){
'use strict';

var Type = require('../type');

var YAML_DATE_REGEXP = new RegExp(
  '^([0-9][0-9][0-9][0-9])'          + // [1] year
  '-([0-9][0-9])'                    + // [2] month
  '-([0-9][0-9])$');                   // [3] day

var YAML_TIMESTAMP_REGEXP = new RegExp(
  '^([0-9][0-9][0-9][0-9])'          + // [1] year
  '-([0-9][0-9]?)'                   + // [2] month
  '-([0-9][0-9]?)'                   + // [3] day
  '(?:[Tt]|[ \\t]+)'                 + // ...
  '([0-9][0-9]?)'                    + // [4] hour
  ':([0-9][0-9])'                    + // [5] minute
  ':([0-9][0-9])'                    + // [6] second
  '(?:\\.([0-9]*))?'                 + // [7] fraction
  '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour
  '(?::([0-9][0-9]))?))?$');           // [11] tz_minute

function resolveYamlTimestamp(data) {
  if (data === null) return false;
  if (YAML_DATE_REGEXP.exec(data) !== null) return true;
  if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;
  return false;
}

function constructYamlTimestamp(data) {
  var match, year, month, day, hour, minute, second, fraction = 0,
      delta = null, tz_hour, tz_minute, date;

  match = YAML_DATE_REGEXP.exec(data);
  if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);

  if (match === null) throw new Error('Date resolve error');

  // match: [1] year [2] month [3] day

  year = +(match[1]);
  month = +(match[2]) - 1; // JS month starts with 0
  day = +(match[3]);

  if (!match[4]) { // no hour
    return new Date(Date.UTC(year, month, day));
  }

  // match: [4] hour [5] minute [6] second [7] fraction

  hour = +(match[4]);
  minute = +(match[5]);
  second = +(match[6]);

  if (match[7]) {
    fraction = match[7].slice(0, 3);
    while (fraction.length < 3) { // milli-seconds
      fraction += '0';
    }
    fraction = +fraction;
  }

  // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute

  if (match[9]) {
    tz_hour = +(match[10]);
    tz_minute = +(match[11] || 0);
    delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds
    if (match[9] === '-') delta = -delta;
  }

  date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));

  if (delta) date.setTime(date.getTime() - delta);

  return date;
}

function representYamlTimestamp(object /*, style*/) {
  return object.toISOString();
}

module.exports = new Type('tag:yaml.org,2002:timestamp', {
  kind: 'scalar',
  resolve: resolveYamlTimestamp,
  construct: constructYamlTimestamp,
  instanceOf: Date,
  represent: representYamlTimestamp
});

},{"../type":13}],"/":[function(require,module,exports){
'use strict';


var yaml = require('./lib/js-yaml.js');


module.exports = yaml;

},{"./lib/js-yaml.js":1}]},{},[])("/")
});
!function(e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).jsyaml=e()}(function(){return function o(a,s,c){function u(t,e){if(!s[t]){if(!a[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(l)return l(t,!0);var i=new Error("Cannot find module '"+t+"'");throw i.code="MODULE_NOT_FOUND",i}var r=s[t]={exports:{}};a[t][0].call(r.exports,function(e){return u(a[t][1][e]||e)},r,r.exports,o,a,s,c)}return s[t].exports}for(var l="function"==typeof require&&require,e=0;e<c.length;e++)u(c[e]);return u}({1:[function(e,t,n){"use strict";var i=e("./js-yaml/loader"),r=e("./js-yaml/dumper");function o(e){return function(){throw new Error("Function "+e+" is deprecated and cannot be used.")}}t.exports.Type=e("./js-yaml/type"),t.exports.Schema=e("./js-yaml/schema"),t.exports.FAILSAFE_SCHEMA=e("./js-yaml/schema/failsafe"),t.exports.JSON_SCHEMA=e("./js-yaml/schema/json"),t.exports.CORE_SCHEMA=e("./js-yaml/schema/core"),t.exports.DEFAULT_SAFE_SCHEMA=e("./js-yaml/schema/default_safe"),t.exports.DEFAULT_FULL_SCHEMA=e("./js-yaml/schema/default_full"),t.exports.load=i.load,t.exports.loadAll=i.loadAll,t.exports.safeLoad=i.safeLoad,t.exports.safeLoadAll=i.safeLoadAll,t.exports.dump=r.dump,t.exports.safeDump=r.safeDump,t.exports.YAMLException=e("./js-yaml/exception"),t.exports.MINIMAL_SCHEMA=e("./js-yaml/schema/failsafe"),t.exports.SAFE_SCHEMA=e("./js-yaml/schema/default_safe"),t.exports.DEFAULT_SCHEMA=e("./js-yaml/schema/default_full"),t.exports.scan=o("scan"),t.exports.parse=o("parse"),t.exports.compose=o("compose"),t.exports.addConstructor=o("addConstructor")},{"./js-yaml/dumper":3,"./js-yaml/exception":4,"./js-yaml/loader":5,"./js-yaml/schema":7,"./js-yaml/schema/core":8,"./js-yaml/schema/default_full":9,"./js-yaml/schema/default_safe":10,"./js-yaml/schema/failsafe":11,"./js-yaml/schema/json":12,"./js-yaml/type":13}],2:[function(e,t,n){"use strict";function i(e){return null==e}t.exports.isNothing=i,t.exports.isObject=function(e){return"object"==typeof e&&null!==e},t.exports.toArray=function(e){return Array.isArray(e)?e:i(e)?[]:[e]},t.exports.repeat=function(e,t){for(var n="",i=0;i<t;i+=1)n+=e;return n},t.exports.isNegativeZero=function(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e},t.exports.extend=function(e,t){var n,i,r,o;if(t)for(n=0,i=(o=Object.keys(t)).length;n<i;n+=1)e[r=o[n]]=t[r];return e}},{}],3:[function(e,t,n){"use strict";var c=e("./common"),d=e("./exception"),i=e("./schema/default_full"),r=e("./schema/default_safe"),p=Object.prototype.toString,u=Object.prototype.hasOwnProperty,o=9,h=10,a=13,s=32,m=33,g=34,y=35,x=37,v=38,A=39,b=42,w=44,C=45,k=58,j=61,S=62,I=63,O=64,E=91,F=93,_=96,N=123,M=124,T=125,l={0:"\\0",7:"\\a",8:"\\b",9:"\\t",10:"\\n",11:"\\v",12:"\\f",13:"\\r",27:"\\e",34:'\\"',92:"\\\\",133:"\\N",160:"\\_",8232:"\\L",8233:"\\P"},f=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function L(e){var t,n,i=e.toString(16).toUpperCase();if(e<=255)t="x",n=2;else if(e<=65535)t="u",n=4;else{if(!(e<=4294967295))throw new d("code point within a string may not be greater than 0xFFFFFFFF");t="U",n=8}return"\\"+t+c.repeat("0",n-i.length)+i}function D(e){this.schema=e.schema||i,this.indent=Math.max(1,e.indent||2),this.noArrayIndent=e.noArrayIndent||!1,this.skipInvalid=e.skipInvalid||!1,this.flowLevel=c.isNothing(e.flowLevel)?-1:e.flowLevel,this.styleMap=function(e,t){var n,i,r,o,a,s,c;if(null===t)return{};for(n={},r=0,o=(i=Object.keys(t)).length;r<o;r+=1)a=i[r],s=String(t[a]),"!!"===a.slice(0,2)&&(a="tag:yaml.org,2002:"+a.slice(2)),(c=e.compiledTypeMap.fallback[a])&&u.call(c.styleAliases,s)&&(s=c.styleAliases[s]),n[a]=s;return n}(this.schema,e.styles||null),this.sortKeys=e.sortKeys||!1,this.lineWidth=e.lineWidth||80,this.noRefs=e.noRefs||!1,this.noCompatMode=e.noCompatMode||!1,this.condenseFlow=e.condenseFlow||!1,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function U(e,t){for(var n,i=c.repeat(" ",t),r=0,o=-1,a="",s=e.length;r<s;)r=-1===(o=e.indexOf("\n",r))?(n=e.slice(r),s):(n=e.slice(r,o+1),o+1),n.length&&"\n"!==n&&(a+=i),a+=n;return a}function q(e,t){return"\n"+c.repeat(" ",e.indent*t)}function Y(e){return e===s||e===o}function R(e){return 32<=e&&e<=126||161<=e&&e<=55295&&8232!==e&&8233!==e||57344<=e&&e<=65533&&65279!==e||65536<=e&&e<=1114111}function B(e,t){return R(e)&&65279!==e&&e!==w&&e!==E&&e!==F&&e!==N&&e!==T&&e!==k&&(e!==y||t&&(R(n=t)&&!Y(n)&&65279!==n&&n!==a&&n!==h));var n}function P(e){return/^\n* /.test(e)}var W=1,K=2,$=3,H=4,G=5;function V(e,t,n,i,r){var o,a,s,c,u=!1,l=!1,p=-1!==i,f=-1,d=R(c=e.charCodeAt(0))&&65279!==c&&!Y(c)&&c!==C&&c!==I&&c!==k&&c!==w&&c!==E&&c!==F&&c!==N&&c!==T&&c!==y&&c!==v&&c!==b&&c!==m&&c!==M&&c!==j&&c!==S&&c!==A&&c!==g&&c!==x&&c!==O&&c!==_&&!Y(e.charCodeAt(e.length-1));if(t)for(o=0;o<e.length;o++){if(!R(a=e.charCodeAt(o)))return G;s=0<o?e.charCodeAt(o-1):null,d=d&&B(a,s)}else{for(o=0;o<e.length;o++){if((a=e.charCodeAt(o))===h)u=!0,p&&(l=l||i<o-f-1&&" "!==e[f+1],f=o);else if(!R(a))return G;s=0<o?e.charCodeAt(o-1):null,d=d&&B(a,s)}l=l||p&&i<o-f-1&&" "!==e[f+1]}return u||l?9<n&&P(e)?G:l?H:$:d&&!r(e)?W:K}function Z(i,r,o,a){i.dump=function(){if(0===r.length)return"''";if(!i.noCompatMode&&-1!==f.indexOf(r))return"'"+r+"'";var e=i.indent*Math.max(1,o),t=-1===i.lineWidth?-1:Math.max(Math.min(i.lineWidth,40),i.lineWidth-e),n=a||-1<i.flowLevel&&o>=i.flowLevel;switch(V(r,n,i.indent,t,function(e){return function(e,t){for(var n=0,i=e.implicitTypes.length;n<i;n+=1)if(e.implicitTypes[n].resolve(t))return!0;return!1}(i,e)})){case W:return r;case K:return"'"+r.replace(/'/g,"''")+"'";case $:return"|"+z(r,i.indent)+J(U(r,e));case H:return">"+z(r,i.indent)+J(U(function(t,n){var e,i,r=/(\n+)([^\n]*)/g,o=function(){var e=-1!==(e=t.indexOf("\n"))?e:t.length;return r.lastIndex=e,Q(t.slice(0,e),n)}(),a="\n"===t[0]||" "===t[0];for(;i=r.exec(t);){var s=i[1],c=i[2];e=" "===c[0],o+=s+(a||e||""===c?"":"\n")+Q(c,n),a=e}return o}(r,t),e));case G:return'"'+function(e){for(var t,n,i,r="",o=0;o<e.length;o++)55296<=(t=e.charCodeAt(o))&&t<=56319&&56320<=(n=e.charCodeAt(o+1))&&n<=57343?(r+=L(1024*(t-55296)+n-56320+65536),o++):(i=l[t],r+=!i&&R(t)?e[o]:i||L(t));return r}(r)+'"';default:throw new d("impossible error: invalid scalar style")}}()}function z(e,t){var n=P(e)?String(t):"",i="\n"===e[e.length-1];return n+(i&&("\n"===e[e.length-2]||"\n"===e)?"+":i?"":"-")+"\n"}function J(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function Q(e,t){if(""===e||" "===e[0])return e;for(var n,i,r=/ [^ ]/g,o=0,a=0,s=0,c="";n=r.exec(e);)t<(s=n.index)-o&&(i=o<a?a:s,c+="\n"+e.slice(o,i),o=i+1),a=s;return c+="\n",e.length-o>t&&o<a?c+=e.slice(o,a)+"\n"+e.slice(a+1):c+=e.slice(o),c.slice(1)}function X(e,t,n){for(var i,r,o,a=n?e.explicitTypes:e.implicitTypes,s=0,c=a.length;s<c;s+=1)if(((r=a[s]).instanceOf||r.predicate)&&(!r.instanceOf||"object"==typeof t&&t instanceof r.instanceOf)&&(!r.predicate||r.predicate(t))){if(e.tag=n?r.tag:"?",r.represent){if(o=e.styleMap[r.tag]||r.defaultStyle,"[object Function]"===p.call(r.represent))i=r.represent(t,o);else{if(!u.call(r.represent,o))throw new d("!<"+r.tag+'> tag resolver accepts not "'+o+'" style');i=r.represent[o](t,o)}e.dump=i}return 1}}function ee(e,t,n,i,r,o){e.tag=null,e.dump=n,X(e,n,!1)||X(e,n,!0);var a=p.call(e.dump);i=i&&(e.flowLevel<0||e.flowLevel>t);var s,c,u="[object Object]"===a||"[object Array]"===a;if(u&&(c=-1!==(s=e.duplicates.indexOf(n))),(null!==e.tag&&"?"!==e.tag||c||2!==e.indent&&0<t)&&(r=!1),c&&e.usedDuplicates[s])e.dump="*ref_"+s;else{if(u&&c&&!e.usedDuplicates[s]&&(e.usedDuplicates[s]=!0),"[object Object]"===a)i&&0!==Object.keys(e.dump).length?(function(e,t,n,i){var r,o,a,s,c,u,l="",p=e.tag,f=Object.keys(n);if(!0===e.sortKeys)f.sort();else if("function"==typeof e.sortKeys)f.sort(e.sortKeys);else if(e.sortKeys)throw new d("sortKeys must be a boolean or a function");for(r=0,o=f.length;r<o;r+=1)u="",i&&0===r||(u+=q(e,t)),s=n[a=f[r]],ee(e,t+1,a,!0,!0,!0)&&((c=null!==e.tag&&"?"!==e.tag||e.dump&&1024<e.dump.length)&&(e.dump&&h===e.dump.charCodeAt(0)?u+="?":u+="? "),u+=e.dump,c&&(u+=q(e,t)),ee(e,t+1,s,!0,c)&&(e.dump&&h===e.dump.charCodeAt(0)?u+=":":u+=": ",l+=u+=e.dump));e.tag=p,e.dump=l||"{}"}(e,t,e.dump,r),c&&(e.dump="&ref_"+s+e.dump)):(function(e,t,n){for(var i,r,o,a="",s=e.tag,c=Object.keys(n),u=0,l=c.length;u<l;u+=1)o="",0!==u&&(o+=", "),e.condenseFlow&&(o+='"'),r=n[i=c[u]],ee(e,t,i,!1,!1)&&(1024<e.dump.length&&(o+="? "),o+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),ee(e,t,r,!1,!1)&&(a+=o+=e.dump));e.tag=s,e.dump="{"+a+"}"}(e,t,e.dump),c&&(e.dump="&ref_"+s+" "+e.dump));else if("[object Array]"===a){var l=e.noArrayIndent&&0<t?t-1:t;i&&0!==e.dump.length?(function(e,t,n,i){for(var r="",o=e.tag,a=0,s=n.length;a<s;a+=1)ee(e,t+1,n[a],!0,!0)&&(i&&0===a||(r+=q(e,t)),e.dump&&h===e.dump.charCodeAt(0)?r+="-":r+="- ",r+=e.dump);e.tag=o,e.dump=r||"[]"}(e,l,e.dump,r),c&&(e.dump="&ref_"+s+e.dump)):(function(e,t,n){for(var i="",r=e.tag,o=0,a=n.length;o<a;o+=1)ee(e,t,n[o],!1,!1)&&(0!==o&&(i+=","+(e.condenseFlow?"":" ")),i+=e.dump);e.tag=r,e.dump="["+i+"]"}(e,l,e.dump),c&&(e.dump="&ref_"+s+" "+e.dump))}else{if("[object String]"!==a){if(e.skipInvalid)return;throw new d("unacceptable kind of an object to dump "+a)}"?"!==e.tag&&Z(e,e.dump,t,o)}null!==e.tag&&"?"!==e.tag&&(e.dump="!<"+e.tag+"> "+e.dump)}return 1}function te(e,t){var n,i,r=[],o=[];for(!function e(t,n,i){var r,o,a;if(null!==t&&"object"==typeof t)if(-1!==(o=n.indexOf(t)))-1===i.indexOf(o)&&i.push(o);else if(n.push(t),Array.isArray(t))for(o=0,a=t.length;o<a;o+=1)e(t[o],n,i);else for(r=Object.keys(t),o=0,a=r.length;o<a;o+=1)e(t[r[o]],n,i)}(e,r,o),n=0,i=o.length;n<i;n+=1)t.duplicates.push(r[o[n]]);t.usedDuplicates=new Array(i)}function ne(e,t){var n=new D(t=t||{});return n.noRefs||te(e,n),ee(n,0,e,!0,!0)?n.dump+"\n":""}t.exports.dump=ne,t.exports.safeDump=function(e,t){return ne(e,c.extend({schema:r},t))}},{"./common":2,"./exception":4,"./schema/default_full":9,"./schema/default_safe":10}],4:[function(e,t,n){"use strict";function i(e,t){Error.call(this),this.name="YAMLException",this.reason=e,this.mark=t,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||""}((i.prototype=Object.create(Error.prototype)).constructor=i).prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t},t.exports=i},{}],5:[function(e,t,n){"use strict";var g=e("./common"),i=e("./exception"),r=e("./mark"),o=e("./schema/default_safe"),a=e("./schema/default_full"),y=Object.prototype.hasOwnProperty,x=1,v=2,A=3,b=4,w=1,C=2,k=3,c=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,s=/[\x85\u2028\u2029]/,j=/[,\[\]\{\}]/,S=/^(?:!|!!|![a-z\-]+!)$/i,I=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function l(e){return Object.prototype.toString.call(e)}function O(e){return 10===e||13===e}function E(e){return 9===e||32===e}function F(e){return 9===e||32===e||10===e||13===e}function _(e){return 44===e||91===e||93===e||123===e||125===e}function u(e){return 48===e?"\0":97===e?"":98===e?"\b":116===e||9===e?"\t":110===e?"\n":118===e?"\v":102===e?"\f":114===e?"\r":101===e?"":32===e?" ":34===e?'"':47===e?"/":92===e?"\\":78===e?"Â…":95===e?"Â ":76===e?"\u2028":80===e?"\u2029":""}for(var f=new Array(256),d=new Array(256),p=0;p<256;p++)f[p]=u(p)?1:0,d[p]=u(p);function h(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||a,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function m(e,t){return new i(t,new r(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function N(e,t){throw m(e,t)}function M(e,t){e.onWarning&&e.onWarning.call(null,m(e,t))}var T={YAML:function(e,t,n){var i,r,o;null!==e.version&&N(e,"duplication of %YAML directive"),1!==n.length&&N(e,"YAML directive accepts exactly one argument"),null===(i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&N(e,"ill-formed argument of the YAML directive"),r=parseInt(i[1],10),o=parseInt(i[2],10),1!==r&&N(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=o<2,1!==o&&2!==o&&M(e,"unsupported YAML version of the document")},TAG:function(e,t,n){var i,r;2!==n.length&&N(e,"TAG directive accepts exactly two arguments"),i=n[0],r=n[1],S.test(i)||N(e,"ill-formed tag handle (first argument) of the TAG directive"),y.call(e.tagMap,i)&&N(e,'there is a previously declared suffix for "'+i+'" tag handle'),I.test(r)||N(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[i]=r}};function L(e,t,n,i){var r,o,a,s;if(t<n){if(s=e.input.slice(t,n),i)for(r=0,o=s.length;r<o;r+=1)9===(a=s.charCodeAt(r))||32<=a&&a<=1114111||N(e,"expected valid JSON character");else c.test(s)&&N(e,"the stream contains non-printable characters");e.result+=s}}function D(e,t,n,i){var r,o,a,s;for(g.isObject(n)||N(e,"cannot merge mappings; the provided source object is unacceptable"),a=0,s=(r=Object.keys(n)).length;a<s;a+=1)o=r[a],y.call(t,o)||(t[o]=n[o],i[o]=!0)}function U(e,t,n,i,r,o,a,s){var c,u;if(Array.isArray(r))for(c=0,u=(r=Array.prototype.slice.call(r)).length;c<u;c+=1)Array.isArray(r[c])&&N(e,"nested arrays are not supported inside keys"),"object"==typeof r&&"[object Object]"===l(r[c])&&(r[c]="[object Object]");if("object"==typeof r&&"[object Object]"===l(r)&&(r="[object Object]"),r=String(r),null===t&&(t={}),"tag:yaml.org,2002:merge"===i)if(Array.isArray(o))for(c=0,u=o.length;c<u;c+=1)D(e,t,o[c],n);else D(e,t,o,n);else e.json||y.call(n,r)||!y.call(t,r)||(e.line=a||e.line,e.position=s||e.position,N(e,"duplicated mapping key")),t[r]=o,delete n[r];return t}function q(e){var t=e.input.charCodeAt(e.position);10===t?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):N(e,"a line break is expected"),e.line+=1,e.lineStart=e.position}function Y(e,t,n){for(var i=0,r=e.input.charCodeAt(e.position);0!==r;){for(;E(r);)r=e.input.charCodeAt(++e.position);if(t&&35===r)for(;10!==(r=e.input.charCodeAt(++e.position))&&13!==r&&0!==r;);if(!O(r))break;for(q(e),r=e.input.charCodeAt(e.position),i++,e.lineIndent=0;32===r;)e.lineIndent++,r=e.input.charCodeAt(++e.position)}return-1!==n&&0!==i&&e.lineIndent<n&&M(e,"deficient indentation"),i}function R(e){var t=e.position,n=e.input.charCodeAt(t);return 45!==n&&46!==n||n!==e.input.charCodeAt(t+1)||n!==e.input.charCodeAt(t+2)||(t+=3,0!==(n=e.input.charCodeAt(t))&&!F(n))?void 0:1}function B(e,t){1===t?e.result+=" ":1<t&&(e.result+=g.repeat("\n",t-1))}function P(e,t){var n,i,r,o,a,s,c,u,l,p=e.input.charCodeAt(e.position);if(34===p){for(e.kind="scalar",e.result="",e.position++,n=i=e.position;0!==(p=e.input.charCodeAt(e.position));){if(34===p)return L(e,n,e.position,!0),e.position++,1;if(92===p){if(L(e,n,e.position,!0),O(p=e.input.charCodeAt(++e.position)))Y(e,!1,t);else if(p<256&&f[p])e.result+=d[p],e.position++;else if(0<(a=120===(l=p)?2:117===l?4:85===l?8:0)){for(r=a,o=0;0<r;r--)p=e.input.charCodeAt(++e.position),u=void 0,0<=(a=48<=(c=p)&&c<=57?c-48:97<=(u=32|c)&&u<=102?u-97+10:-1)?o=(o<<4)+a:N(e,"expected hexadecimal character");e.result+=(s=o)<=65535?String.fromCharCode(s):String.fromCharCode(55296+(s-65536>>10),56320+(s-65536&1023)),e.position++}else N(e,"unknown escape sequence");n=i=e.position}else O(p)?(L(e,n,i,!0),B(e,Y(e,!1,t)),n=i=e.position):e.position===e.lineStart&&R(e)?N(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}N(e,"unexpected end of the stream within a double quoted scalar")}}function W(e,t){var n,i,r=e.tag,o=e.anchor,a=[],s=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=a),i=e.input.charCodeAt(e.position);0!==i&&45===i&&F(e.input.charCodeAt(e.position+1));)if(s=!0,e.position++,Y(e,!0,-1)&&e.lineIndent<=t)a.push(null),i=e.input.charCodeAt(e.position);else if(n=e.line,K(e,t,A,!1,!0),a.push(e.result),Y(e,!0,-1),i=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==i)N(e,"bad indentation of a sequence entry");else if(e.lineIndent<t)break;return!!s&&(e.tag=r,e.anchor=o,e.kind="sequence",e.result=a,!0)}function K(e,t,n,i,r){var o,a,s,c,u,l,p,f,d=1,h=!1,m=!1;if(null!==e.listener&&e.listener("open",e),e.tag=null,e.anchor=null,e.kind=null,e.result=null,o=a=s=b===n||A===n,i&&Y(e,!0,-1)&&(h=!0,e.lineIndent>t?d=1:e.lineIndent===t?d=0:e.lineIndent<t&&(d=-1)),1===d)for(;function(e){var t,n,i,r=!1,o=!1,a=e.input.charCodeAt(e.position);if(33===a){if(null!==e.tag&&N(e,"duplication of a tag property"),60===(a=e.input.charCodeAt(++e.position))?(r=!0,a=e.input.charCodeAt(++e.position)):33===a?(o=!0,n="!!",a=e.input.charCodeAt(++e.position)):n="!",t=e.position,r){for(;0!==(a=e.input.charCodeAt(++e.position))&&62!==a;);e.position<e.length?(i=e.input.slice(t,e.position),a=e.input.charCodeAt(++e.position)):N(e,"unexpected end of the stream within a verbatim tag")}else{for(;0!==a&&!F(a);)33===a&&(o?N(e,"tag suffix cannot contain exclamation marks"):(n=e.input.slice(t-1,e.position+1),S.test(n)||N(e,"named tag handle cannot contain such characters"),o=!0,t=e.position+1)),a=e.input.charCodeAt(++e.position);i=e.input.slice(t,e.position),j.test(i)&&N(e,"tag suffix cannot contain flow indicator characters")}return i&&!I.test(i)&&N(e,"tag name cannot contain such characters: "+i),r?e.tag=i:y.call(e.tagMap,n)?e.tag=e.tagMap[n]+i:"!"===n?e.tag="!"+i:"!!"===n?e.tag="tag:yaml.org,2002:"+i:N(e,'undeclared tag handle "'+n+'"'),1}}(e)||function(e){var t,n=e.input.charCodeAt(e.position);if(38===n){for(null!==e.anchor&&N(e,"duplication of an anchor property"),n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!F(n)&&!_(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&N(e,"name of an anchor node must contain at least one character"),e.anchor=e.input.slice(t,e.position),1}}(e);)Y(e,!0,-1)?(h=!0,s=o,e.lineIndent>t?d=1:e.lineIndent===t?d=0:e.lineIndent<t&&(d=-1)):s=!1;if(s=s&&(h||r),1!==d&&b!==n||(p=x===n||v===n?t:t+1,f=e.position-e.lineStart,1===d?s&&(W(e,f)||function(e,t,n){var i,r,o,a,s,c=e.tag,u=e.anchor,l={},p={},f=null,d=null,h=null,m=!1,g=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=l),s=e.input.charCodeAt(e.position);0!==s;){if(i=e.input.charCodeAt(e.position+1),o=e.line,a=e.position,63!==s&&58!==s||!F(i)){if(!K(e,n,v,!1,!0))break;if(e.line===o){for(s=e.input.charCodeAt(e.position);E(s);)s=e.input.charCodeAt(++e.position);if(58===s)F(s=e.input.charCodeAt(++e.position))||N(e,"a whitespace character is expected after the key-value separator within a block mapping"),m&&(U(e,l,p,f,d,null),f=d=h=null),r=m=!(g=!0),f=e.tag,d=e.result;else{if(!g)return e.tag=c,e.anchor=u,1;N(e,"can not read an implicit mapping pair; a colon is missed")}}else{if(!g)return e.tag=c,e.anchor=u,1;N(e,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===s?(m&&(U(e,l,p,f,d,null),f=d=h=null),r=m=g=!0):m?r=!(m=!1):N(e,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),e.position+=1,s=i;if((e.line===o||e.lineIndent>t)&&(K(e,t,b,!0,r)&&(m?d=e.result:h=e.result),m||(U(e,l,p,f,d,h,o,a),f=d=h=null),Y(e,!0,-1),s=e.input.charCodeAt(e.position)),e.lineIndent>t&&0!==s)N(e,"bad indentation of a mapping entry");else if(e.lineIndent<t)break}return m&&U(e,l,p,f,d,null),g&&(e.tag=c,e.anchor=u,e.kind="mapping",e.result=l),g}(e,f,p))||function(e,t){var n,i,r,o,a,s,c,u,l,p=!0,f=e.tag,d=e.anchor,h={},m=e.input.charCodeAt(e.position);if(91===m)s=!(r=93),i=[];else{if(123!==m)return;r=125,s=!0,i={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=i),m=e.input.charCodeAt(++e.position);0!==m;){if(Y(e,!0,t),(m=e.input.charCodeAt(e.position))===r)return e.position++,e.tag=f,e.anchor=d,e.kind=s?"mapping":"sequence",e.result=i,1;p||N(e,"missed comma between flow collection entries"),l=null,o=a=!1,63===m&&F(e.input.charCodeAt(e.position+1))&&(o=a=!0,e.position++,Y(e,!0,t)),n=e.line,K(e,t,x,!1,!0),u=e.tag,c=e.result,Y(e,!0,t),m=e.input.charCodeAt(e.position),!a&&e.line!==n||58!==m||(o=!0,m=e.input.charCodeAt(++e.position),Y(e,!0,t),K(e,t,x,!1,!0),l=e.result),s?U(e,i,h,u,c,l):o?i.push(U(e,null,h,u,c,l)):i.push(c),Y(e,!0,t),44===(m=e.input.charCodeAt(e.position))?(p=!0,m=e.input.charCodeAt(++e.position)):p=!1}N(e,"unexpected end of the stream within a flow collection")}(e,p)?m=!0:(a&&function(e,t){var n,i,r,o,a=w,s=!1,c=!1,u=t,l=0,p=!1,f=e.input.charCodeAt(e.position);if(124===f)i=!1;else{if(62!==f)return;i=!0}for(e.kind="scalar",e.result="";0!==f;)if(43===(f=e.input.charCodeAt(++e.position))||45===f)w===a?a=43===f?k:C:N(e,"repeat of a chomping mode identifier");else{if(!(0<=(r=48<=(o=f)&&o<=57?o-48:-1)))break;0==r?N(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?N(e,"repeat of an indentation width identifier"):(u=t+r-1,c=!0)}if(E(f)){for(;E(f=e.input.charCodeAt(++e.position)););if(35===f)for(;!O(f=e.input.charCodeAt(++e.position))&&0!==f;);}for(;0!==f;){for(q(e),e.lineIndent=0,f=e.input.charCodeAt(e.position);(!c||e.lineIndent<u)&&32===f;)e.lineIndent++,f=e.input.charCodeAt(++e.position);if(!c&&e.lineIndent>u&&(u=e.lineIndent),O(f))l++;else{if(e.lineIndent<u){a===k?e.result+=g.repeat("\n",s?1+l:l):a===w&&s&&(e.result+="\n");break}for(i?E(f)?(p=!0,e.result+=g.repeat("\n",s?1+l:l)):p?(p=!1,e.result+=g.repeat("\n",l+1)):0===l?s&&(e.result+=" "):e.result+=g.repeat("\n",l):e.result+=g.repeat("\n",s?1+l:l),c=s=!0,l=0,n=e.position;!O(f)&&0!==f;)f=e.input.charCodeAt(++e.position);L(e,n,e.position,!1)}}return 1}(e,p)||function(e,t){var n,i,r=e.input.charCodeAt(e.position);if(39===r){for(e.kind="scalar",e.result="",e.position++,n=i=e.position;0!==(r=e.input.charCodeAt(e.position));)if(39===r){if(L(e,n,e.position,!0),39!==(r=e.input.charCodeAt(++e.position)))return 1;n=e.position,e.position++,i=e.position}else O(r)?(L(e,n,i,!0),B(e,Y(e,!1,t)),n=i=e.position):e.position===e.lineStart&&R(e)?N(e,"unexpected end of the document within a single quoted scalar"):(e.position++,i=e.position);N(e,"unexpected end of the stream within a single quoted scalar")}}(e,p)||P(e,p)?m=!0:!function(e){var t,n,i=e.input.charCodeAt(e.position);if(42===i){for(i=e.input.charCodeAt(++e.position),t=e.position;0!==i&&!F(i)&&!_(i);)i=e.input.charCodeAt(++e.position);return e.position===t&&N(e,"name of an alias node must contain at least one character"),n=e.input.slice(t,e.position),e.anchorMap.hasOwnProperty(n)||N(e,'unidentified alias "'+n+'"'),e.result=e.anchorMap[n],Y(e,!0,-1),1}}(e)?function(e,t,n){var i,r,o,a,s,c,u,l=e.kind,p=e.result,f=e.input.charCodeAt(e.position);if(!F(f)&&!_(f)&&35!==f&&38!==f&&42!==f&&33!==f&&124!==f&&62!==f&&39!==f&&34!==f&&37!==f&&64!==f&&96!==f&&(63!==f&&45!==f||!(F(i=e.input.charCodeAt(e.position+1))||n&&_(i)))){for(e.kind="scalar",e.result="",r=o=e.position,a=!1;0!==f;){if(58===f){if(F(i=e.input.charCodeAt(e.position+1))||n&&_(i))break}else if(35===f){if(F(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&R(e)||n&&_(f))break;if(O(f)){if(s=e.line,c=e.lineStart,u=e.lineIndent,Y(e,!1,-1),e.lineIndent>=t){a=!0,f=e.input.charCodeAt(e.position);continue}e.position=o,e.line=s,e.lineStart=c,e.lineIndent=u;break}}a&&(L(e,r,o,!1),B(e,e.line-s),r=o=e.position,a=!1),E(f)||(o=e.position+1),f=e.input.charCodeAt(++e.position)}if(L(e,r,o,!1),e.result)return 1;e.kind=l,e.result=p}}(e,p,x===n)&&(m=!0,null===e.tag&&(e.tag="?")):(m=!0,null===e.tag&&null===e.anchor||N(e,"alias node should not have any properties")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===d&&(m=s&&W(e,f))),null!==e.tag&&"!"!==e.tag)if("?"===e.tag){for(null!==e.result&&"scalar"!==e.kind&&N(e,'unacceptable node kind for !<?> tag; it should be "scalar", not "'+e.kind+'"'),c=0,u=e.implicitTypes.length;c<u;c+=1)if((l=e.implicitTypes[c]).resolve(e.result)){e.result=l.construct(e.result),e.tag=l.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else y.call(e.typeMap[e.kind||"fallback"],e.tag)?(l=e.typeMap[e.kind||"fallback"][e.tag],null!==e.result&&l.kind!==e.kind&&N(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+l.kind+'", not "'+e.kind+'"'),l.resolve(e.result)?(e.result=l.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):N(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")):N(e,"unknown tag !<"+e.tag+">");return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||m}function $(e,t){t=t||{},0!==(e=String(e)).length&&(10!==e.charCodeAt(e.length-1)&&13!==e.charCodeAt(e.length-1)&&(e+="\n"),65279===e.charCodeAt(0)&&(e=e.slice(1)));var n=new h(e,t),i=e.indexOf("\0");for(-1!==i&&(n.position=i,N(n,"null byte is not allowed in input")),n.input+="\0";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)!function(e){var t,n,i,r,o=e.position,a=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};0!==(r=e.input.charCodeAt(e.position))&&(Y(e,!0,-1),r=e.input.charCodeAt(e.position),!(0<e.lineIndent||37!==r));){for(a=!0,r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!F(r);)r=e.input.charCodeAt(++e.position);for(i=[],(n=e.input.slice(t,e.position)).length<1&&N(e,"directive name must not be less than one character in length");0!==r;){for(;E(r);)r=e.input.charCodeAt(++e.position);if(35===r){for(;0!==(r=e.input.charCodeAt(++e.position))&&!O(r););break}if(O(r))break;for(t=e.position;0!==r&&!F(r);)r=e.input.charCodeAt(++e.position);i.push(e.input.slice(t,e.position))}0!==r&&q(e),y.call(T,n)?T[n](e,n,i):M(e,'unknown document directive "'+n+'"')}Y(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,Y(e,!0,-1)):a&&N(e,"directives end mark is expected"),K(e,e.lineIndent-1,b,!1,!0),Y(e,!0,-1),e.checkLineBreaks&&s.test(e.input.slice(o,e.position))&&M(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&R(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,Y(e,!0,-1)):e.position<e.length-1&&N(e,"end of the stream or a document separator is expected")}(n);return n.documents}function H(e,t,n){null!==t&&"object"==typeof t&&void 0===n&&(n=t,t=null);var i=$(e,n);if("function"!=typeof t)return i;for(var r=0,o=i.length;r<o;r+=1)t(i[r])}function G(e,t){var n=$(e,t);if(0!==n.length){if(1===n.length)return n[0];throw new i("expected a single document in the stream, but found more")}}t.exports.loadAll=H,t.exports.load=G,t.exports.safeLoadAll=function(e,t,n){return"object"==typeof t&&null!==t&&void 0===n&&(n=t,t=null),H(e,t,g.extend({schema:o},n))},t.exports.safeLoad=function(e,t){return G(e,g.extend({schema:o},t))}},{"./common":2,"./exception":4,"./mark":6,"./schema/default_full":9,"./schema/default_safe":10}],6:[function(e,t,n){"use strict";var s=e("./common");function i(e,t,n,i,r){this.name=e,this.buffer=t,this.position=n,this.line=i,this.column=r}i.prototype.getSnippet=function(e,t){var n,i,r,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,n="",i=this.position;0<i&&-1==="\0\r\nÂ…\u2028\u2029".indexOf(this.buffer.charAt(i-1));)if(--i,this.position-i>t/2-1){n=" ... ",i+=5;break}for(r="",o=this.position;o<this.buffer.length&&-1==="\0\r\nÂ…\u2028\u2029".indexOf(this.buffer.charAt(o));)if((o+=1)-this.position>t/2-1){r=" ... ",o-=5;break}return a=this.buffer.slice(i,o),s.repeat(" ",e)+n+a+r+"\n"+s.repeat(" ",e+this.position-i+n.length)+"^"},i.prototype.toString=function(e){var t,n="";return this.name&&(n+='in "'+this.name+'" '),n+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet())&&(n+=":\n"+t),n},t.exports=i},{"./common":2}],7:[function(e,t,n){"use strict";var r=e("./common"),o=e("./exception"),a=e("./type");function s(e,t,i){var r=[];return e.include.forEach(function(e){i=s(e,t,i)}),e[t].forEach(function(n){i.forEach(function(e,t){e.tag===n.tag&&e.kind===n.kind&&r.push(t)}),i.push(n)}),i.filter(function(e,t){return-1===r.indexOf(t)})}function c(e){this.include=e.include||[],this.implicit=e.implicit||[],this.explicit=e.explicit||[],this.implicit.forEach(function(e){if(e.loadKind&&"scalar"!==e.loadKind)throw new o("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")}),this.compiledImplicit=s(this,"implicit",[]),this.compiledExplicit=s(this,"explicit",[]),this.compiledTypeMap=function(){var e,t,n={scalar:{},sequence:{},mapping:{},fallback:{}};function i(e){n[e.kind][e.tag]=n.fallback[e.tag]=e}for(e=0,t=arguments.length;e<t;e+=1)arguments[e].forEach(i);return n}(this.compiledImplicit,this.compiledExplicit)}c.DEFAULT=null,c.create=function(e,t){var n,i;switch(arguments.length){case 1:n=c.DEFAULT,i=e;break;case 2:n=e,i=t;break;default:throw new o("Wrong number of arguments for Schema.create function")}if(n=r.toArray(n),i=r.toArray(i),!n.every(function(e){return e instanceof c}))throw new o("Specified list of super schemas (or a single Schema object) contains a non-Schema object.");if(!i.every(function(e){return e instanceof a}))throw new o("Specified list of YAML types (or a single Type object) contains a non-Type object.");return new c({include:n,explicit:i})},t.exports=c},{"./common":2,"./exception":4,"./type":13}],8:[function(e,t,n){"use strict";var i=e("../schema");t.exports=new i({include:[e("./json")]})},{"../schema":7,"./json":12}],9:[function(e,t,n){"use strict";var i=e("../schema");t.exports=i.DEFAULT=new i({include:[e("./default_safe")],explicit:[e("../type/js/undefined"),e("../type/js/regexp"),e("../type/js/function")]})},{"../schema":7,"../type/js/function":18,"../type/js/regexp":19,"../type/js/undefined":20,"./default_safe":10}],10:[function(e,t,n){"use strict";var i=e("../schema");t.exports=new i({include:[e("./core")],implicit:[e("../type/timestamp"),e("../type/merge")],explicit:[e("../type/binary"),e("../type/omap"),e("../type/pairs"),e("../type/set")]})},{"../schema":7,"../type/binary":14,"../type/merge":22,"../type/omap":24,"../type/pairs":25,"../type/set":27,"../type/timestamp":29,"./core":8}],11:[function(e,t,n){"use strict";var i=e("../schema");t.exports=new i({explicit:[e("../type/str"),e("../type/seq"),e("../type/map")]})},{"../schema":7,"../type/map":21,"../type/seq":26,"../type/str":28}],12:[function(e,t,n){"use strict";var i=e("../schema");t.exports=new i({include:[e("./failsafe")],implicit:[e("../type/null"),e("../type/bool"),e("../type/int"),e("../type/float")]})},{"../schema":7,"../type/bool":15,"../type/float":16,"../type/int":17,"../type/null":23,"./failsafe":11}],13:[function(e,t,n){"use strict";var r=e("./exception"),o=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],a=["scalar","sequence","mapping"];t.exports=function(t,e){var n,i;if(e=e||{},Object.keys(e).forEach(function(e){if(-1===o.indexOf(e))throw new r('Unknown option "'+e+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(e){return e},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=(n=e.styleAliases||null,i={},null!==n&&Object.keys(n).forEach(function(t){n[t].forEach(function(e){i[String(e)]=t})}),i),-1===a.indexOf(this.kind))throw new r('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}},{"./exception":4}],14:[function(e,t,n){"use strict";try{var c=e("buffer").Buffer}catch(e){}var i=e("../type"),u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";t.exports=new i("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(e){if(null===e)return!1;for(var t,n=0,i=e.length,r=u,o=0;o<i;o++)if(!(64<(t=r.indexOf(e.charAt(o))))){if(t<0)return!1;n+=6}return n%8==0},construct:function(e){for(var t,n=e.replace(/[\r\n=]/g,""),i=n.length,r=u,o=0,a=[],s=0;s<i;s++)s%4==0&&s&&(a.push(o>>16&255),a.push(o>>8&255),a.push(255&o)),o=o<<6|r.indexOf(n.charAt(s));return 0==(t=i%4*6)?(a.push(o>>16&255),a.push(o>>8&255),a.push(255&o)):18==t?(a.push(o>>10&255),a.push(o>>2&255)):12==t&&a.push(o>>4&255),c?c.from?c.from(a):new c(a):a},predicate:function(e){return c&&c.isBuffer(e)},represent:function(e){for(var t,n="",i=0,r=e.length,o=u,a=0;a<r;a++)a%3==0&&a&&(n+=o[i>>18&63],n+=o[i>>12&63],n+=o[i>>6&63],n+=o[63&i]),i=(i<<8)+e[a];return 0==(t=r%3)?(n+=o[i>>18&63],n+=o[i>>12&63],n+=o[i>>6&63],n+=o[63&i]):2==t?(n+=o[i>>10&63],n+=o[i>>4&63],n+=o[i<<2&63],n+=o[64]):1==t&&(n+=o[i>>2&63],n+=o[i<<4&63],n+=o[64],n+=o[64]),n}})},{"../type":13}],15:[function(e,t,n){"use strict";var i=e("../type");t.exports=new i("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t=e.length;return 4===t&&("true"===e||"True"===e||"TRUE"===e)||5===t&&("false"===e||"False"===e||"FALSE"===e)},construct:function(e){return"true"===e||"True"===e||"TRUE"===e},predicate:function(e){return"[object Boolean]"===Object.prototype.toString.call(e)},represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"})},{"../type":13}],16:[function(e,t,n){"use strict";var i=e("../common"),r=e("../type"),o=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var a=/^[-+]?[0-9]+e/;t.exports=new r("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!o.test(e)||"_"===e[e.length-1])},construct:function(e){var t,n=e.replace(/_/g,"").toLowerCase(),i="-"===n[0]?-1:1,r=[];return 0<="+-".indexOf(n[0])&&(n=n.slice(1)),".inf"===n?1==i?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===n?NaN:0<=n.indexOf(":")?(n.split(":").forEach(function(e){r.unshift(parseFloat(e,10))}),n=0,t=1,r.forEach(function(e){n+=e*t,t*=60}),i*n):i*parseFloat(n,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||i.isNegativeZero(e))},represent:function(e,t){var n;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(i.isNegativeZero(e))return"-0.0";return n=e.toString(10),a.test(n)?n.replace("e",".e"):n},defaultStyle:"lowercase"})},{"../common":2,"../type":13}],17:[function(e,t,n){"use strict";var i=e("../common"),r=e("../type");t.exports=new r("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,i,r,o=e.length,a=0,s=!1;if(!o)return!1;if("-"!==(t=e[a])&&"+"!==t||(t=e[++a]),"0"===t){if(a+1===o)return!0;if("b"===(t=e[++a])){for(a++;a<o;a++)if("_"!==(t=e[a])){if("0"!==t&&"1"!==t)return!1;s=!0}return s&&"_"!==t}if("x"===t){for(a++;a<o;a++)if("_"!==(t=e[a])){if(!(48<=(i=e.charCodeAt(a))&&i<=57||65<=i&&i<=70||97<=i&&i<=102))return!1;s=!0}return s&&"_"!==t}for(;a<o;a++)if("_"!==(t=e[a])){if(!(48<=(n=e.charCodeAt(a))&&n<=55))return!1;s=!0}return s&&"_"!==t}if("_"===t)return!1;for(;a<o;a++)if("_"!==(t=e[a])){if(":"===t)break;if(!(48<=(r=e.charCodeAt(a))&&r<=57))return!1;s=!0}return!(!s||"_"===t)&&(":"!==t||/^(:[0-5]?[0-9])+$/.test(e.slice(a)))},construct:function(e){var t,n,i=e,r=1,o=[];return-1!==i.indexOf("_")&&(i=i.replace(/_/g,"")),"-"!==(t=i[0])&&"+"!==t||("-"===t&&(r=-1),t=(i=i.slice(1))[0]),"0"===i?0:"0"===t?"b"===i[1]?r*parseInt(i.slice(2),2):"x"===i[1]?r*parseInt(i,16):r*parseInt(i,8):-1!==i.indexOf(":")?(i.split(":").forEach(function(e){o.unshift(parseInt(e,10))}),i=0,n=1,o.forEach(function(e){i+=e*n,n*=60}),r*i):r*parseInt(i,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&e%1==0&&!i.isNegativeZero(e)},represent:{binary:function(e){return 0<=e?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return 0<=e?"0"+e.toString(8):"-0"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return 0<=e?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})},{"../common":2,"../type":13}],18:[function(e,t,n){"use strict";try{var o=e("esprima")}catch(e){"undefined"!=typeof window&&(o=window.esprima)}var i=e("../../type");t.exports=new i("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:function(e){if(null===e)return!1;try{var t="("+e+")",n=o.parse(t,{range:!0});return"Program"!==n.type||1!==n.body.length||"ExpressionStatement"!==n.body[0].type||"ArrowFunctionExpression"!==n.body[0].expression.type&&"FunctionExpression"!==n.body[0].expression.type?!1:!0}catch(e){return!1}},construct:function(e){var t,n="("+e+")",i=o.parse(n,{range:!0}),r=[];if("Program"!==i.type||1!==i.body.length||"ExpressionStatement"!==i.body[0].type||"ArrowFunctionExpression"!==i.body[0].expression.type&&"FunctionExpression"!==i.body[0].expression.type)throw new Error("Failed to resolve function");return i.body[0].expression.params.forEach(function(e){r.push(e.name)}),t=i.body[0].expression.body.range,"BlockStatement"===i.body[0].expression.body.type?new Function(r,n.slice(t[0]+1,t[1]-1)):new Function(r,"return "+n.slice(t[0],t[1]))},predicate:function(e){return"[object Function]"===Object.prototype.toString.call(e)},represent:function(e){return e.toString()}})},{"../../type":13}],19:[function(e,t,n){"use strict";var i=e("../../type");t.exports=new i("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:function(e){if(null===e)return!1;if(0===e.length)return!1;var t=e,n=/\/([gim]*)$/.exec(e),i="";if("/"===t[0]){if(n&&(i=n[1]),3<i.length)return!1;if("/"!==t[t.length-i.length-1])return!1}return!0},construct:function(e){var t=e,n=/\/([gim]*)$/.exec(e),i="";return"/"===t[0]&&(n&&(i=n[1]),t=t.slice(1,t.length-i.length-1)),new RegExp(t,i)},predicate:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},represent:function(e){var t="/"+e.source+"/";return e.global&&(t+="g"),e.multiline&&(t+="m"),e.ignoreCase&&(t+="i"),t}})},{"../../type":13}],20:[function(e,t,n){"use strict";var i=e("../../type");t.exports=new i("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:function(){return!0},construct:function(){},predicate:function(e){return void 0===e},represent:function(){return""}})},{"../../type":13}],21:[function(e,t,n){"use strict";var i=e("../type");t.exports=new i("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return null!==e?e:{}}})},{"../type":13}],22:[function(e,t,n){"use strict";var i=e("../type");t.exports=new i("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}})},{"../type":13}],23:[function(e,t,n){"use strict";var i=e("../type");t.exports=new i("tag:yaml.org,2002:null",{kind:"scalar",resolve:function(e){if(null===e)return!0;var t=e.length;return 1===t&&"~"===e||4===t&&("null"===e||"Null"===e||"NULL"===e)},construct:function(){return null},predicate:function(e){return null===e},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})},{"../type":13}],24:[function(e,t,n){"use strict";var i=e("../type"),c=Object.prototype.hasOwnProperty,u=Object.prototype.toString;t.exports=new i("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(e){if(null===e)return!0;for(var t,n,i,r=[],o=e,a=0,s=o.length;a<s;a+=1){if(t=o[a],i=!1,"[object Object]"!==u.call(t))return!1;for(n in t)if(c.call(t,n)){if(i)return!1;i=!0}if(!i)return!1;if(-1!==r.indexOf(n))return!1;r.push(n)}return!0},construct:function(e){return null!==e?e:[]}})},{"../type":13}],25:[function(e,t,n){"use strict";var i=e("../type"),s=Object.prototype.toString;t.exports=new i("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:function(e){if(null===e)return!0;for(var t,n,i=e,r=new Array(i.length),o=0,a=i.length;o<a;o+=1){if(t=i[o],"[object Object]"!==s.call(t))return!1;if(1!==(n=Object.keys(t)).length)return!1;r[o]=[n[0],t[n[0]]]}return!0},construct:function(e){if(null===e)return[];for(var t,n,i=e,r=new Array(i.length),o=0,a=i.length;o<a;o+=1)t=i[o],n=Object.keys(t),r[o]=[n[0],t[n[0]]];return r}})},{"../type":13}],26:[function(e,t,n){"use strict";var i=e("../type");t.exports=new i("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return null!==e?e:[]}})},{"../type":13}],27:[function(e,t,n){"use strict";var i=e("../type"),r=Object.prototype.hasOwnProperty;t.exports=new i("tag:yaml.org,2002:set",{kind:"mapping",resolve:function(e){if(null===e)return!0;var t,n=e;for(t in n)if(r.call(n,t)&&null!==n[t])return!1;return!0},construct:function(e){return null!==e?e:{}}})},{"../type":13}],28:[function(e,t,n){"use strict";var i=e("../type");t.exports=new i("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return null!==e?e:""}})},{"../type":13}],29:[function(e,t,n){"use strict";var i=e("../type"),p=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),f=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");t.exports=new i("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(e){return null!==e&&(null!==p.exec(e)||null!==f.exec(e))},construct:function(e){var t,n,i,r,o,a,s,c=0,u=null,l=p.exec(e);if(null===l&&(l=f.exec(e)),null===l)throw new Error("Date resolve error");if(t=+l[1],n=l[2]-1,i=+l[3],!l[4])return new Date(Date.UTC(t,n,i));if(r=+l[4],o=+l[5],a=+l[6],l[7]){for(c=l[7].slice(0,3);c.length<3;)c+="0";c=+c}return l[9]&&(u=6e4*(60*+l[10]+ +(l[11]||0)),"-"===l[9]&&(u=-u)),s=new Date(Date.UTC(t,n,i,r,o,a,c)),u&&s.setTime(s.getTime()-u),s},instanceOf:Date,represent:function(e){return e.toISOString()}})},{"../type":13}],"/":[function(e,t,n){"use strict";var i=e("./lib/js-yaml.js");t.exports=i},{"./lib/js-yaml.js":1}]},{},[])("/")});
#!/usr/bin/env node


'use strict';

/*eslint-disable no-console*/


// stdlib
var fs    = require('fs');


// 3rd-party
var argparse = require('argparse');


// internal
var yaml = require('..');


////////////////////////////////////////////////////////////////////////////////


var cli = new argparse.ArgumentParser({
  prog:     'js-yaml',
  version:  require('../package.json').version,
  addHelp:  true
});


cli.addArgument([ '-c', '--compact' ], {
  help:   'Display errors in compact mode',
  action: 'storeTrue'
});


// deprecated (not needed after we removed output colors)
// option suppressed, but not completely removed for compatibility
cli.addArgument([ '-j', '--to-json' ], {
  help:   argparse.Const.SUPPRESS,
  dest:   'json',
  action: 'storeTrue'
});


cli.addArgument([ '-t', '--trace' ], {
  help:   'Show stack trace on error',
  action: 'storeTrue'
});

cli.addArgument([ 'file' ], {
  help:   'File to read, utf-8 encoded without BOM',
  nargs:  '?',
  defaultValue: '-'
});


////////////////////////////////////////////////////////////////////////////////


var options = cli.parseArgs();


////////////////////////////////////////////////////////////////////////////////

function readFile(filename, encoding, callback) {
  if (options.file === '-') {
    // read from stdin

    var chunks = [];

    process.stdin.on('data', function (chunk) {
      chunks.push(chunk);
    });

    process.stdin.on('end', function () {
      return callback(null, Buffer.concat(chunks).toString(encoding));
    });
  } else {
    fs.readFile(filename, encoding, callback);
  }
}

readFile(options.file, 'utf8', function (error, input) {
  var output, isYaml;

  if (error) {
    if (error.code === 'ENOENT') {
      console.error('File not found: ' + options.file);
      process.exit(2);
    }

    console.error(
      options.trace && error.stack ||
      error.message ||
      String(error));

    process.exit(1);
  }

  try {
    output = JSON.parse(input);
    isYaml = false;
  } catch (err) {
    if (err instanceof SyntaxError) {
      try {
        output = [];
        yaml.loadAll(input, function (doc) { output.push(doc); }, {});
        isYaml = true;

        if (output.length === 0) output = null;
        else if (output.length === 1) output = output[0];

      } catch (e) {
        if (options.trace && err.stack) console.error(e.stack);
        else console.error(e.toString(options.compact));

        process.exit(1);
      }
    } else {
      console.error(
        options.trace && err.stack ||
        err.message ||
        String(err));

      process.exit(1);
    }
  }

  if (isYaml) console.log(JSON.stringify(output, null, '  '));
  else console.log(yaml.dump(output));
});
Licensing
---------

This software is covered under the following copyright:

/*
 * Copyright (c) 2003-2005  Tom Wu
 * All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
 *
 * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
 * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
 * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
 * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * In addition, the following condition applies:
 *
 * All redistributions must retain an intact copy of this copyright notice
 * and disclaimer.
 */

Address all questions regarding this license to:

  Tom Wu
  tjw@cs.Stanford.EDU<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        
        
        <script src="index.js"></script>
    </body>
</html>var BigInteger = require('./');
var a = new BigInteger('91823918239182398123');
console.log(a.bitLength());(function(){

    // Copyright (c) 2005  Tom Wu
    // All Rights Reserved.
    // See "LICENSE" for details.

    // Basic JavaScript BN library - subset useful for RSA encryption.

    // Bits per digit
    var dbits;

    // JavaScript engine analysis
    var canary = 0xdeadbeefcafe;
    var j_lm = ((canary&0xffffff)==0xefcafe);

    // (public) Constructor
    function BigInteger(a,b,c) {
      if(a != null)
        if("number" == typeof a) this.fromNumber(a,b,c);
        else if(b == null && "string" != typeof a) this.fromString(a,256);
        else this.fromString(a,b);
    }

    // return new, unset BigInteger
    function nbi() { return new BigInteger(null); }

    // am: Compute w_j += (x*this_i), propagate carries,
    // c is initial carry, returns final carry.
    // c < 3*dvalue, x < 2*dvalue, this_i < dvalue
    // We need to select the fastest one that works in this environment.

    // am1: use a single mult and divide to get the high bits,
    // max digit bits should be 26 because
    // max internal value = 2*dvalue^2-2*dvalue (< 2^53)
    function am1(i,x,w,j,c,n) {
      while(--n >= 0) {
        var v = x*this[i++]+w[j]+c;
        c = Math.floor(v/0x4000000);
        w[j++] = v&0x3ffffff;
      }
      return c;
    }
    // am2 avoids a big mult-and-extract completely.
    // Max digit bits should be <= 30 because we do bitwise ops
    // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
    function am2(i,x,w,j,c,n) {
      var xl = x&0x7fff, xh = x>>15;
      while(--n >= 0) {
        var l = this[i]&0x7fff;
        var h = this[i++]>>15;
        var m = xh*l+h*xl;
        l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);
        c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);
        w[j++] = l&0x3fffffff;
      }
      return c;
    }
    // Alternately, set max digit bits to 28 since some
    // browsers slow down when dealing with 32-bit numbers.
    function am3(i,x,w,j,c,n) {
      var xl = x&0x3fff, xh = x>>14;
      while(--n >= 0) {
        var l = this[i]&0x3fff;
        var h = this[i++]>>14;
        var m = xh*l+h*xl;
        l = xl*l+((m&0x3fff)<<14)+w[j]+c;
        c = (l>>28)+(m>>14)+xh*h;
        w[j++] = l&0xfffffff;
      }
      return c;
    }
    var inBrowser = typeof navigator !== "undefined";
    if(inBrowser && j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
      BigInteger.prototype.am = am2;
      dbits = 30;
    }
    else if(inBrowser && j_lm && (navigator.appName != "Netscape")) {
      BigInteger.prototype.am = am1;
      dbits = 26;
    }
    else { // Mozilla/Netscape seems to prefer am3
      BigInteger.prototype.am = am3;
      dbits = 28;
    }

    BigInteger.prototype.DB = dbits;
    BigInteger.prototype.DM = ((1<<dbits)-1);
    BigInteger.prototype.DV = (1<<dbits);

    var BI_FP = 52;
    BigInteger.prototype.FV = Math.pow(2,BI_FP);
    BigInteger.prototype.F1 = BI_FP-dbits;
    BigInteger.prototype.F2 = 2*dbits-BI_FP;

    // Digit conversions
    var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
    var BI_RC = new Array();
    var rr,vv;
    rr = "0".charCodeAt(0);
    for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;
    rr = "a".charCodeAt(0);
    for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
    rr = "A".charCodeAt(0);
    for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;

    function int2char(n) { return BI_RM.charAt(n); }
    function intAt(s,i) {
      var c = BI_RC[s.charCodeAt(i)];
      return (c==null)?-1:c;
    }

    // (protected) copy this to r
    function bnpCopyTo(r) {
      for(var i = this.t-1; i >= 0; --i) r[i] = this[i];
      r.t = this.t;
      r.s = this.s;
    }

    // (protected) set from integer value x, -DV <= x < DV
    function bnpFromInt(x) {
      this.t = 1;
      this.s = (x<0)?-1:0;
      if(x > 0) this[0] = x;
      else if(x < -1) this[0] = x+this.DV;
      else this.t = 0;
    }

    // return bigint initialized to value
    function nbv(i) { var r = nbi(); r.fromInt(i); return r; }

    // (protected) set from string and radix
    function bnpFromString(s,b) {
      var k;
      if(b == 16) k = 4;
      else if(b == 8) k = 3;
      else if(b == 256) k = 8; // byte array
      else if(b == 2) k = 1;
      else if(b == 32) k = 5;
      else if(b == 4) k = 2;
      else { this.fromRadix(s,b); return; }
      this.t = 0;
      this.s = 0;
      var i = s.length, mi = false, sh = 0;
      while(--i >= 0) {
        var x = (k==8)?s[i]&0xff:intAt(s,i);
        if(x < 0) {
          if(s.charAt(i) == "-") mi = true;
          continue;
        }
        mi = false;
        if(sh == 0)
          this[this.t++] = x;
        else if(sh+k > this.DB) {
          this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;
          this[this.t++] = (x>>(this.DB-sh));
        }
        else
          this[this.t-1] |= x<<sh;
        sh += k;
        if(sh >= this.DB) sh -= this.DB;
      }
      if(k == 8 && (s[0]&0x80) != 0) {
        this.s = -1;
        if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;
      }
      this.clamp();
      if(mi) BigInteger.ZERO.subTo(this,this);
    }

    // (protected) clamp off excess high words
    function bnpClamp() {
      var c = this.s&this.DM;
      while(this.t > 0 && this[this.t-1] == c) --this.t;
    }

    // (public) return string representation in given radix
    function bnToString(b) {
      if(this.s < 0) return "-"+this.negate().toString(b);
      var k;
      if(b == 16) k = 4;
      else if(b == 8) k = 3;
      else if(b == 2) k = 1;
      else if(b == 32) k = 5;
      else if(b == 4) k = 2;
      else return this.toRadix(b);
      var km = (1<<k)-1, d, m = false, r = "", i = this.t;
      var p = this.DB-(i*this.DB)%k;
      if(i-- > 0) {
        if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }
        while(i >= 0) {
          if(p < k) {
            d = (this[i]&((1<<p)-1))<<(k-p);
            d |= this[--i]>>(p+=this.DB-k);
          }
          else {
            d = (this[i]>>(p-=k))&km;
            if(p <= 0) { p += this.DB; --i; }
          }
          if(d > 0) m = true;
          if(m) r += int2char(d);
        }
      }
      return m?r:"0";
    }

    // (public) -this
    function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }

    // (public) |this|
    function bnAbs() { return (this.s<0)?this.negate():this; }

    // (public) return + if this > a, - if this < a, 0 if equal
    function bnCompareTo(a) {
      var r = this.s-a.s;
      if(r != 0) return r;
      var i = this.t;
      r = i-a.t;
      if(r != 0) return (this.s<0)?-r:r;
      while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;
      return 0;
    }

    // returns bit length of the integer x
    function nbits(x) {
      var r = 1, t;
      if((t=x>>>16) != 0) { x = t; r += 16; }
      if((t=x>>8) != 0) { x = t; r += 8; }
      if((t=x>>4) != 0) { x = t; r += 4; }
      if((t=x>>2) != 0) { x = t; r += 2; }
      if((t=x>>1) != 0) { x = t; r += 1; }
      return r;
    }

    // (public) return the number of bits in "this"
    function bnBitLength() {
      if(this.t <= 0) return 0;
      return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));
    }

    // (protected) r = this << n*DB
    function bnpDLShiftTo(n,r) {
      var i;
      for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];
      for(i = n-1; i >= 0; --i) r[i] = 0;
      r.t = this.t+n;
      r.s = this.s;
    }

    // (protected) r = this >> n*DB
    function bnpDRShiftTo(n,r) {
      for(var i = n; i < this.t; ++i) r[i-n] = this[i];
      r.t = Math.max(this.t-n,0);
      r.s = this.s;
    }

    // (protected) r = this << n
    function bnpLShiftTo(n,r) {
      var bs = n%this.DB;
      var cbs = this.DB-bs;
      var bm = (1<<cbs)-1;
      var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;
      for(i = this.t-1; i >= 0; --i) {
        r[i+ds+1] = (this[i]>>cbs)|c;
        c = (this[i]&bm)<<bs;
      }
      for(i = ds-1; i >= 0; --i) r[i] = 0;
      r[ds] = c;
      r.t = this.t+ds+1;
      r.s = this.s;
      r.clamp();
    }

    // (protected) r = this >> n
    function bnpRShiftTo(n,r) {
      r.s = this.s;
      var ds = Math.floor(n/this.DB);
      if(ds >= this.t) { r.t = 0; return; }
      var bs = n%this.DB;
      var cbs = this.DB-bs;
      var bm = (1<<bs)-1;
      r[0] = this[ds]>>bs;
      for(var i = ds+1; i < this.t; ++i) {
        r[i-ds-1] |= (this[i]&bm)<<cbs;
        r[i-ds] = this[i]>>bs;
      }
      if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;
      r.t = this.t-ds;
      r.clamp();
    }

    // (protected) r = this - a
    function bnpSubTo(a,r) {
      var i = 0, c = 0, m = Math.min(a.t,this.t);
      while(i < m) {
        c += this[i]-a[i];
        r[i++] = c&this.DM;
        c >>= this.DB;
      }
      if(a.t < this.t) {
        c -= a.s;
        while(i < this.t) {
          c += this[i];
          r[i++] = c&this.DM;
          c >>= this.DB;
        }
        c += this.s;
      }
      else {
        c += this.s;
        while(i < a.t) {
          c -= a[i];
          r[i++] = c&this.DM;
          c >>= this.DB;
        }
        c -= a.s;
      }
      r.s = (c<0)?-1:0;
      if(c < -1) r[i++] = this.DV+c;
      else if(c > 0) r[i++] = c;
      r.t = i;
      r.clamp();
    }

    // (protected) r = this * a, r != this,a (HAC 14.12)
    // "this" should be the larger one if appropriate.
    function bnpMultiplyTo(a,r) {
      var x = this.abs(), y = a.abs();
      var i = x.t;
      r.t = i+y.t;
      while(--i >= 0) r[i] = 0;
      for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);
      r.s = 0;
      r.clamp();
      if(this.s != a.s) BigInteger.ZERO.subTo(r,r);
    }

    // (protected) r = this^2, r != this (HAC 14.16)
    function bnpSquareTo(r) {
      var x = this.abs();
      var i = r.t = 2*x.t;
      while(--i >= 0) r[i] = 0;
      for(i = 0; i < x.t-1; ++i) {
        var c = x.am(i,x[i],r,2*i,0,1);
        if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {
          r[i+x.t] -= x.DV;
          r[i+x.t+1] = 1;
        }
      }
      if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);
      r.s = 0;
      r.clamp();
    }

    // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
    // r != q, this != m.  q or r may be null.
    function bnpDivRemTo(m,q,r) {
      var pm = m.abs();
      if(pm.t <= 0) return;
      var pt = this.abs();
      if(pt.t < pm.t) {
        if(q != null) q.fromInt(0);
        if(r != null) this.copyTo(r);
        return;
      }
      if(r == null) r = nbi();
      var y = nbi(), ts = this.s, ms = m.s;
      var nsh = this.DB-nbits(pm[pm.t-1]);   // normalize modulus
      if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }
      else { pm.copyTo(y); pt.copyTo(r); }
      var ys = y.t;
      var y0 = y[ys-1];
      if(y0 == 0) return;
      var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);
      var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;
      var i = r.t, j = i-ys, t = (q==null)?nbi():q;
      y.dlShiftTo(j,t);
      if(r.compareTo(t) >= 0) {
        r[r.t++] = 1;
        r.subTo(t,r);
      }
      BigInteger.ONE.dlShiftTo(ys,t);
      t.subTo(y,y);  // "negative" y so we can replace sub with am later
      while(y.t < ys) y[y.t++] = 0;
      while(--j >= 0) {
        // Estimate quotient digit
        var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);
        if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) {   // Try it out
          y.dlShiftTo(j,t);
          r.subTo(t,r);
          while(r[i] < --qd) r.subTo(t,r);
        }
      }
      if(q != null) {
        r.drShiftTo(ys,q);
        if(ts != ms) BigInteger.ZERO.subTo(q,q);
      }
      r.t = ys;
      r.clamp();
      if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder
      if(ts < 0) BigInteger.ZERO.subTo(r,r);
    }

    // (public) this mod a
    function bnMod(a) {
      var r = nbi();
      this.abs().divRemTo(a,null,r);
      if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);
      return r;
    }

    // Modular reduction using "classic" algorithm
    function Classic(m) { this.m = m; }
    function cConvert(x) {
      if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);
      else return x;
    }
    function cRevert(x) { return x; }
    function cReduce(x) { x.divRemTo(this.m,null,x); }
    function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
    function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }

    Classic.prototype.convert = cConvert;
    Classic.prototype.revert = cRevert;
    Classic.prototype.reduce = cReduce;
    Classic.prototype.mulTo = cMulTo;
    Classic.prototype.sqrTo = cSqrTo;

    // (protected) return "-1/this % 2^DB"; useful for Mont. reduction
    // justification:
    //         xy == 1 (mod m)
    //         xy =  1+km
    //   xy(2-xy) = (1+km)(1-km)
    // x[y(2-xy)] = 1-k^2m^2
    // x[y(2-xy)] == 1 (mod m^2)
    // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
    // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
    // JS multiply "overflows" differently from C/C++, so care is needed here.
    function bnpInvDigit() {
      if(this.t < 1) return 0;
      var x = this[0];
      if((x&1) == 0) return 0;
      var y = x&3;       // y == 1/x mod 2^2
      y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4
      y = (y*(2-(x&0xff)*y))&0xff;   // y == 1/x mod 2^8
      y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;    // y == 1/x mod 2^16
      // last step - calculate inverse mod DV directly;
      // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
      y = (y*(2-x*y%this.DV))%this.DV;       // y == 1/x mod 2^dbits
      // we really want the negative inverse, and -DV < y < DV
      return (y>0)?this.DV-y:-y;
    }

    // Montgomery reduction
    function Montgomery(m) {
      this.m = m;
      this.mp = m.invDigit();
      this.mpl = this.mp&0x7fff;
      this.mph = this.mp>>15;
      this.um = (1<<(m.DB-15))-1;
      this.mt2 = 2*m.t;
    }

    // xR mod m
    function montConvert(x) {
      var r = nbi();
      x.abs().dlShiftTo(this.m.t,r);
      r.divRemTo(this.m,null,r);
      if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);
      return r;
    }

    // x/R mod m
    function montRevert(x) {
      var r = nbi();
      x.copyTo(r);
      this.reduce(r);
      return r;
    }

    // x = x/R mod m (HAC 14.32)
    function montReduce(x) {
      while(x.t <= this.mt2) // pad x so am has enough room later
        x[x.t++] = 0;
      for(var i = 0; i < this.m.t; ++i) {
        // faster way of calculating u0 = x[i]*mp mod DV
        var j = x[i]&0x7fff;
        var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;
        // use am to combine the multiply-shift-add into one call
        j = i+this.m.t;
        x[j] += this.m.am(0,u0,x,i,0,this.m.t);
        // propagate carry
        while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }
      }
      x.clamp();
      x.drShiftTo(this.m.t,x);
      if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
    }

    // r = "x^2/R mod m"; x != r
    function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }

    // r = "xy/R mod m"; x,y != r
    function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }

    Montgomery.prototype.convert = montConvert;
    Montgomery.prototype.revert = montRevert;
    Montgomery.prototype.reduce = montReduce;
    Montgomery.prototype.mulTo = montMulTo;
    Montgomery.prototype.sqrTo = montSqrTo;

    // (protected) true iff this is even
    function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }

    // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
    function bnpExp(e,z) {
      if(e > 0xffffffff || e < 1) return BigInteger.ONE;
      var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;
      g.copyTo(r);
      while(--i >= 0) {
        z.sqrTo(r,r2);
        if((e&(1<<i)) > 0) z.mulTo(r2,g,r);
        else { var t = r; r = r2; r2 = t; }
      }
      return z.revert(r);
    }

    // (public) this^e % m, 0 <= e < 2^32
    function bnModPowInt(e,m) {
      var z;
      if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
      return this.exp(e,z);
    }

    // protected
    BigInteger.prototype.copyTo = bnpCopyTo;
    BigInteger.prototype.fromInt = bnpFromInt;
    BigInteger.prototype.fromString = bnpFromString;
    BigInteger.prototype.clamp = bnpClamp;
    BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
    BigInteger.prototype.drShiftTo = bnpDRShiftTo;
    BigInteger.prototype.lShiftTo = bnpLShiftTo;
    BigInteger.prototype.rShiftTo = bnpRShiftTo;
    BigInteger.prototype.subTo = bnpSubTo;
    BigInteger.prototype.multiplyTo = bnpMultiplyTo;
    BigInteger.prototype.squareTo = bnpSquareTo;
    BigInteger.prototype.divRemTo = bnpDivRemTo;
    BigInteger.prototype.invDigit = bnpInvDigit;
    BigInteger.prototype.isEven = bnpIsEven;
    BigInteger.prototype.exp = bnpExp;

    // public
    BigInteger.prototype.toString = bnToString;
    BigInteger.prototype.negate = bnNegate;
    BigInteger.prototype.abs = bnAbs;
    BigInteger.prototype.compareTo = bnCompareTo;
    BigInteger.prototype.bitLength = bnBitLength;
    BigInteger.prototype.mod = bnMod;
    BigInteger.prototype.modPowInt = bnModPowInt;

    // "constants"
    BigInteger.ZERO = nbv(0);
    BigInteger.ONE = nbv(1);

    // Copyright (c) 2005-2009  Tom Wu
    // All Rights Reserved.
    // See "LICENSE" for details.

    // Extended JavaScript BN functions, required for RSA private ops.

    // Version 1.1: new BigInteger("0", 10) returns "proper" zero
    // Version 1.2: square() API, isProbablePrime fix

    // (public)
    function bnClone() { var r = nbi(); this.copyTo(r); return r; }

    // (public) return value as integer
    function bnIntValue() {
      if(this.s < 0) {
        if(this.t == 1) return this[0]-this.DV;
        else if(this.t == 0) return -1;
      }
      else if(this.t == 1) return this[0];
      else if(this.t == 0) return 0;
      // assumes 16 < DB < 32
      return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];
    }

    // (public) return value as byte
    function bnByteValue() { return (this.t==0)?this.s:(this[0]<<24)>>24; }

    // (public) return value as short (assumes DB>=16)
    function bnShortValue() { return (this.t==0)?this.s:(this[0]<<16)>>16; }

    // (protected) return x s.t. r^x < DV
    function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }

    // (public) 0 if this == 0, 1 if this > 0
    function bnSigNum() {
      if(this.s < 0) return -1;
      else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;
      else return 1;
    }

    // (protected) convert to radix string
    function bnpToRadix(b) {
      if(b == null) b = 10;
      if(this.signum() == 0 || b < 2 || b > 36) return "0";
      var cs = this.chunkSize(b);
      var a = Math.pow(b,cs);
      var d = nbv(a), y = nbi(), z = nbi(), r = "";
      this.divRemTo(d,y,z);
      while(y.signum() > 0) {
        r = (a+z.intValue()).toString(b).substr(1) + r;
        y.divRemTo(d,y,z);
      }
      return z.intValue().toString(b) + r;
    }

    // (protected) convert from radix string
    function bnpFromRadix(s,b) {
      this.fromInt(0);
      if(b == null) b = 10;
      var cs = this.chunkSize(b);
      var d = Math.pow(b,cs), mi = false, j = 0, w = 0;
      for(var i = 0; i < s.length; ++i) {
        var x = intAt(s,i);
        if(x < 0) {
          if(s.charAt(i) == "-" && this.signum() == 0) mi = true;
          continue;
        }
        w = b*w+x;
        if(++j >= cs) {
          this.dMultiply(d);
          this.dAddOffset(w,0);
          j = 0;
          w = 0;
        }
      }
      if(j > 0) {
        this.dMultiply(Math.pow(b,j));
        this.dAddOffset(w,0);
      }
      if(mi) BigInteger.ZERO.subTo(this,this);
    }

    // (protected) alternate constructor
    function bnpFromNumber(a,b,c) {
      if("number" == typeof b) {
        // new BigInteger(int,int,RNG)
        if(a < 2) this.fromInt(1);
        else {
          this.fromNumber(a,c);
          if(!this.testBit(a-1))	// force MSB set
            this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);
          if(this.isEven()) this.dAddOffset(1,0); // force odd
          while(!this.isProbablePrime(b)) {
            this.dAddOffset(2,0);
            if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);
          }
        }
      }
      else {
        // new BigInteger(int,RNG)
        var x = new Array(), t = a&7;
        x.length = (a>>3)+1;
        b.nextBytes(x);
        if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;
        this.fromString(x,256);
      }
    }

    // (public) convert to bigendian byte array
    function bnToByteArray() {
      var i = this.t, r = new Array();
      r[0] = this.s;
      var p = this.DB-(i*this.DB)%8, d, k = 0;
      if(i-- > 0) {
        if(p < this.DB && (d = this[i]>>p) != (this.s&this.DM)>>p)
          r[k++] = d|(this.s<<(this.DB-p));
        while(i >= 0) {
          if(p < 8) {
            d = (this[i]&((1<<p)-1))<<(8-p);
            d |= this[--i]>>(p+=this.DB-8);
          }
          else {
            d = (this[i]>>(p-=8))&0xff;
            if(p <= 0) { p += this.DB; --i; }
          }
          if((d&0x80) != 0) d |= -256;
          if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;
          if(k > 0 || d != this.s) r[k++] = d;
        }
      }
      return r;
    }

    function bnEquals(a) { return(this.compareTo(a)==0); }
    function bnMin(a) { return(this.compareTo(a)<0)?this:a; }
    function bnMax(a) { return(this.compareTo(a)>0)?this:a; }

    // (protected) r = this op a (bitwise)
    function bnpBitwiseTo(a,op,r) {
      var i, f, m = Math.min(a.t,this.t);
      for(i = 0; i < m; ++i) r[i] = op(this[i],a[i]);
      if(a.t < this.t) {
        f = a.s&this.DM;
        for(i = m; i < this.t; ++i) r[i] = op(this[i],f);
        r.t = this.t;
      }
      else {
        f = this.s&this.DM;
        for(i = m; i < a.t; ++i) r[i] = op(f,a[i]);
        r.t = a.t;
      }
      r.s = op(this.s,a.s);
      r.clamp();
    }

    // (public) this & a
    function op_and(x,y) { return x&y; }
    function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }

    // (public) this | a
    function op_or(x,y) { return x|y; }
    function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }

    // (public) this ^ a
    function op_xor(x,y) { return x^y; }
    function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }

    // (public) this & ~a
    function op_andnot(x,y) { return x&~y; }
    function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }

    // (public) ~this
    function bnNot() {
      var r = nbi();
      for(var i = 0; i < this.t; ++i) r[i] = this.DM&~this[i];
      r.t = this.t;
      r.s = ~this.s;
      return r;
    }

    // (public) this << n
    function bnShiftLeft(n) {
      var r = nbi();
      if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);
      return r;
    }

    // (public) this >> n
    function bnShiftRight(n) {
      var r = nbi();
      if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);
      return r;
    }

    // return index of lowest 1-bit in x, x < 2^31
    function lbit(x) {
      if(x == 0) return -1;
      var r = 0;
      if((x&0xffff) == 0) { x >>= 16; r += 16; }
      if((x&0xff) == 0) { x >>= 8; r += 8; }
      if((x&0xf) == 0) { x >>= 4; r += 4; }
      if((x&3) == 0) { x >>= 2; r += 2; }
      if((x&1) == 0) ++r;
      return r;
    }

    // (public) returns index of lowest 1-bit (or -1 if none)
    function bnGetLowestSetBit() {
      for(var i = 0; i < this.t; ++i)
        if(this[i] != 0) return i*this.DB+lbit(this[i]);
      if(this.s < 0) return this.t*this.DB;
      return -1;
    }

    // return number of 1 bits in x
    function cbit(x) {
      var r = 0;
      while(x != 0) { x &= x-1; ++r; }
      return r;
    }

    // (public) return number of set bits
    function bnBitCount() {
      var r = 0, x = this.s&this.DM;
      for(var i = 0; i < this.t; ++i) r += cbit(this[i]^x);
      return r;
    }

    // (public) true iff nth bit is set
    function bnTestBit(n) {
      var j = Math.floor(n/this.DB);
      if(j >= this.t) return(this.s!=0);
      return((this[j]&(1<<(n%this.DB)))!=0);
    }

    // (protected) this op (1<<n)
    function bnpChangeBit(n,op) {
      var r = BigInteger.ONE.shiftLeft(n);
      this.bitwiseTo(r,op,r);
      return r;
    }

    // (public) this | (1<<n)
    function bnSetBit(n) { return this.changeBit(n,op_or); }

    // (public) this & ~(1<<n)
    function bnClearBit(n) { return this.changeBit(n,op_andnot); }

    // (public) this ^ (1<<n)
    function bnFlipBit(n) { return this.changeBit(n,op_xor); }

    // (protected) r = this + a
    function bnpAddTo(a,r) {
      var i = 0, c = 0, m = Math.min(a.t,this.t);
      while(i < m) {
        c += this[i]+a[i];
        r[i++] = c&this.DM;
        c >>= this.DB;
      }
      if(a.t < this.t) {
        c += a.s;
        while(i < this.t) {
          c += this[i];
          r[i++] = c&this.DM;
          c >>= this.DB;
        }
        c += this.s;
      }
      else {
        c += this.s;
        while(i < a.t) {
          c += a[i];
          r[i++] = c&this.DM;
          c >>= this.DB;
        }
        c += a.s;
      }
      r.s = (c<0)?-1:0;
      if(c > 0) r[i++] = c;
      else if(c < -1) r[i++] = this.DV+c;
      r.t = i;
      r.clamp();
    }

    // (public) this + a
    function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }

    // (public) this - a
    function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }

    // (public) this * a
    function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }

    // (public) this^2
    function bnSquare() { var r = nbi(); this.squareTo(r); return r; }

    // (public) this / a
    function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }

    // (public) this % a
    function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }

    // (public) [this/a,this%a]
    function bnDivideAndRemainder(a) {
      var q = nbi(), r = nbi();
      this.divRemTo(a,q,r);
      return new Array(q,r);
    }

    // (protected) this *= n, this >= 0, 1 < n < DV
    function bnpDMultiply(n) {
      this[this.t] = this.am(0,n-1,this,0,0,this.t);
      ++this.t;
      this.clamp();
    }

    // (protected) this += n << w words, this >= 0
    function bnpDAddOffset(n,w) {
      if(n == 0) return;
      while(this.t <= w) this[this.t++] = 0;
      this[w] += n;
      while(this[w] >= this.DV) {
        this[w] -= this.DV;
        if(++w >= this.t) this[this.t++] = 0;
        ++this[w];
      }
    }

    // A "null" reducer
    function NullExp() {}
    function nNop(x) { return x; }
    function nMulTo(x,y,r) { x.multiplyTo(y,r); }
    function nSqrTo(x,r) { x.squareTo(r); }

    NullExp.prototype.convert = nNop;
    NullExp.prototype.revert = nNop;
    NullExp.prototype.mulTo = nMulTo;
    NullExp.prototype.sqrTo = nSqrTo;

    // (public) this^e
    function bnPow(e) { return this.exp(e,new NullExp()); }

    // (protected) r = lower n words of "this * a", a.t <= n
    // "this" should be the larger one if appropriate.
    function bnpMultiplyLowerTo(a,n,r) {
      var i = Math.min(this.t+a.t,n);
      r.s = 0; // assumes a,this >= 0
      r.t = i;
      while(i > 0) r[--i] = 0;
      var j;
      for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(0,a[i],r,i,0,this.t);
      for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a[i],r,i,0,n-i);
      r.clamp();
    }

    // (protected) r = "this * a" without lower n words, n > 0
    // "this" should be the larger one if appropriate.
    function bnpMultiplyUpperTo(a,n,r) {
      --n;
      var i = r.t = this.t+a.t-n;
      r.s = 0; // assumes a,this >= 0
      while(--i >= 0) r[i] = 0;
      for(i = Math.max(n-this.t,0); i < a.t; ++i)
        r[this.t+i-n] = this.am(n-i,a[i],r,0,0,this.t+i-n);
      r.clamp();
      r.drShiftTo(1,r);
    }

    // Barrett modular reduction
    function Barrett(m) {
      // setup Barrett
      this.r2 = nbi();
      this.q3 = nbi();
      BigInteger.ONE.dlShiftTo(2*m.t,this.r2);
      this.mu = this.r2.divide(m);
      this.m = m;
    }

    function barrettConvert(x) {
      if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);
      else if(x.compareTo(this.m) < 0) return x;
      else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
    }

    function barrettRevert(x) { return x; }

    // x = x mod m (HAC 14.42)
    function barrettReduce(x) {
      x.drShiftTo(this.m.t-1,this.r2);
      if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }
      this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);
      this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);
      while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);
      x.subTo(this.r2,x);
      while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
    }

    // r = x^2 mod m; x != r
    function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }

    // r = x*y mod m; x,y != r
    function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }

    Barrett.prototype.convert = barrettConvert;
    Barrett.prototype.revert = barrettRevert;
    Barrett.prototype.reduce = barrettReduce;
    Barrett.prototype.mulTo = barrettMulTo;
    Barrett.prototype.sqrTo = barrettSqrTo;

    // (public) this^e % m (HAC 14.85)
    function bnModPow(e,m) {
      var i = e.bitLength(), k, r = nbv(1), z;
      if(i <= 0) return r;
      else if(i < 18) k = 1;
      else if(i < 48) k = 3;
      else if(i < 144) k = 4;
      else if(i < 768) k = 5;
      else k = 6;
      if(i < 8)
        z = new Classic(m);
      else if(m.isEven())
        z = new Barrett(m);
      else
        z = new Montgomery(m);

      // precomputation
      var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;
      g[1] = z.convert(this);
      if(k > 1) {
        var g2 = nbi();
        z.sqrTo(g[1],g2);
        while(n <= km) {
          g[n] = nbi();
          z.mulTo(g2,g[n-2],g[n]);
          n += 2;
        }
      }

      var j = e.t-1, w, is1 = true, r2 = nbi(), t;
      i = nbits(e[j])-1;
      while(j >= 0) {
        if(i >= k1) w = (e[j]>>(i-k1))&km;
        else {
          w = (e[j]&((1<<(i+1))-1))<<(k1-i);
          if(j > 0) w |= e[j-1]>>(this.DB+i-k1);
        }

        n = k;
        while((w&1) == 0) { w >>= 1; --n; }
        if((i -= n) < 0) { i += this.DB; --j; }
        if(is1) {	// ret == 1, don't bother squaring or multiplying it
          g[w].copyTo(r);
          is1 = false;
        }
        else {
          while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }
          if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }
          z.mulTo(r2,g[w],r);
        }

        while(j >= 0 && (e[j]&(1<<i)) == 0) {
          z.sqrTo(r,r2); t = r; r = r2; r2 = t;
          if(--i < 0) { i = this.DB-1; --j; }
        }
      }
      return z.revert(r);
    }

    // (public) gcd(this,a) (HAC 14.54)
    function bnGCD(a) {
      var x = (this.s<0)?this.negate():this.clone();
      var y = (a.s<0)?a.negate():a.clone();
      if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }
      var i = x.getLowestSetBit(), g = y.getLowestSetBit();
      if(g < 0) return x;
      if(i < g) g = i;
      if(g > 0) {
        x.rShiftTo(g,x);
        y.rShiftTo(g,y);
      }
      while(x.signum() > 0) {
        if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);
        if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);
        if(x.compareTo(y) >= 0) {
          x.subTo(y,x);
          x.rShiftTo(1,x);
        }
        else {
          y.subTo(x,y);
          y.rShiftTo(1,y);
        }
      }
      if(g > 0) y.lShiftTo(g,y);
      return y;
    }

    // (protected) this % n, n < 2^26
    function bnpModInt(n) {
      if(n <= 0) return 0;
      var d = this.DV%n, r = (this.s<0)?n-1:0;
      if(this.t > 0)
        if(d == 0) r = this[0]%n;
        else for(var i = this.t-1; i >= 0; --i) r = (d*r+this[i])%n;
      return r;
    }

    // (public) 1/this % m (HAC 14.61)
    function bnModInverse(m) {
      var ac = m.isEven();
      if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;
      var u = m.clone(), v = this.clone();
      var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);
      while(u.signum() != 0) {
        while(u.isEven()) {
          u.rShiftTo(1,u);
          if(ac) {
            if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }
            a.rShiftTo(1,a);
          }
          else if(!b.isEven()) b.subTo(m,b);
          b.rShiftTo(1,b);
        }
        while(v.isEven()) {
          v.rShiftTo(1,v);
          if(ac) {
            if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }
            c.rShiftTo(1,c);
          }
          else if(!d.isEven()) d.subTo(m,d);
          d.rShiftTo(1,d);
        }
        if(u.compareTo(v) >= 0) {
          u.subTo(v,u);
          if(ac) a.subTo(c,a);
          b.subTo(d,b);
        }
        else {
          v.subTo(u,v);
          if(ac) c.subTo(a,c);
          d.subTo(b,d);
        }
      }
      if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;
      if(d.compareTo(m) >= 0) return d.subtract(m);
      if(d.signum() < 0) d.addTo(m,d); else return d;
      if(d.signum() < 0) return d.add(m); else return d;
    }

    var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];
    var lplim = (1<<26)/lowprimes[lowprimes.length-1];

    // (public) test primality with certainty >= 1-.5^t
    function bnIsProbablePrime(t) {
      var i, x = this.abs();
      if(x.t == 1 && x[0] <= lowprimes[lowprimes.length-1]) {
        for(i = 0; i < lowprimes.length; ++i)
          if(x[0] == lowprimes[i]) return true;
        return false;
      }
      if(x.isEven()) return false;
      i = 1;
      while(i < lowprimes.length) {
        var m = lowprimes[i], j = i+1;
        while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];
        m = x.modInt(m);
        while(i < j) if(m%lowprimes[i++] == 0) return false;
      }
      return x.millerRabin(t);
    }

    // (protected) true if probably prime (HAC 4.24, Miller-Rabin)
    function bnpMillerRabin(t) {
      var n1 = this.subtract(BigInteger.ONE);
      var k = n1.getLowestSetBit();
      if(k <= 0) return false;
      var r = n1.shiftRight(k);
      t = (t+1)>>1;
      if(t > lowprimes.length) t = lowprimes.length;
      var a = nbi();
      for(var i = 0; i < t; ++i) {
        //Pick bases at random, instead of starting at 2
        a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);
        var y = a.modPow(r,this);
        if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
          var j = 1;
          while(j++ < k && y.compareTo(n1) != 0) {
            y = y.modPowInt(2,this);
            if(y.compareTo(BigInteger.ONE) == 0) return false;
          }
          if(y.compareTo(n1) != 0) return false;
        }
      }
      return true;
    }

    // protected
    BigInteger.prototype.chunkSize = bnpChunkSize;
    BigInteger.prototype.toRadix = bnpToRadix;
    BigInteger.prototype.fromRadix = bnpFromRadix;
    BigInteger.prototype.fromNumber = bnpFromNumber;
    BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
    BigInteger.prototype.changeBit = bnpChangeBit;
    BigInteger.prototype.addTo = bnpAddTo;
    BigInteger.prototype.dMultiply = bnpDMultiply;
    BigInteger.prototype.dAddOffset = bnpDAddOffset;
    BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
    BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
    BigInteger.prototype.modInt = bnpModInt;
    BigInteger.prototype.millerRabin = bnpMillerRabin;

    // public
    BigInteger.prototype.clone = bnClone;
    BigInteger.prototype.intValue = bnIntValue;
    BigInteger.prototype.byteValue = bnByteValue;
    BigInteger.prototype.shortValue = bnShortValue;
    BigInteger.prototype.signum = bnSigNum;
    BigInteger.prototype.toByteArray = bnToByteArray;
    BigInteger.prototype.equals = bnEquals;
    BigInteger.prototype.min = bnMin;
    BigInteger.prototype.max = bnMax;
    BigInteger.prototype.and = bnAnd;
    BigInteger.prototype.or = bnOr;
    BigInteger.prototype.xor = bnXor;
    BigInteger.prototype.andNot = bnAndNot;
    BigInteger.prototype.not = bnNot;
    BigInteger.prototype.shiftLeft = bnShiftLeft;
    BigInteger.prototype.shiftRight = bnShiftRight;
    BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
    BigInteger.prototype.bitCount = bnBitCount;
    BigInteger.prototype.testBit = bnTestBit;
    BigInteger.prototype.setBit = bnSetBit;
    BigInteger.prototype.clearBit = bnClearBit;
    BigInteger.prototype.flipBit = bnFlipBit;
    BigInteger.prototype.add = bnAdd;
    BigInteger.prototype.subtract = bnSubtract;
    BigInteger.prototype.multiply = bnMultiply;
    BigInteger.prototype.divide = bnDivide;
    BigInteger.prototype.remainder = bnRemainder;
    BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
    BigInteger.prototype.modPow = bnModPow;
    BigInteger.prototype.modInverse = bnModInverse;
    BigInteger.prototype.pow = bnPow;
    BigInteger.prototype.gcd = bnGCD;
    BigInteger.prototype.isProbablePrime = bnIsProbablePrime;

    // JSBN-specific extension
    BigInteger.prototype.square = bnSquare;

    // Expose the Barrett function
    BigInteger.prototype.Barrett = Barrett

    // BigInteger interfaces not implemented in jsbn:

    // BigInteger(int signum, byte[] magnitude)
    // double doubleValue()
    // float floatValue()
    // int hashCode()
    // long longValue()
    // static BigInteger valueOf(long val)

	// Random number generator - requires a PRNG backend, e.g. prng4.js

	// For best results, put code like
	// <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>
	// in your main HTML document.

	var rng_state;
	var rng_pool;
	var rng_pptr;

	// Mix in a 32-bit integer into the pool
	function rng_seed_int(x) {
	  rng_pool[rng_pptr++] ^= x & 255;
	  rng_pool[rng_pptr++] ^= (x >> 8) & 255;
	  rng_pool[rng_pptr++] ^= (x >> 16) & 255;
	  rng_pool[rng_pptr++] ^= (x >> 24) & 255;
	  if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;
	}

	// Mix in the current time (w/milliseconds) into the pool
	function rng_seed_time() {
	  rng_seed_int(new Date().getTime());
	}

	// Initialize the pool with junk if needed.
	if(rng_pool == null) {
	  rng_pool = new Array();
	  rng_pptr = 0;
	  var t;
	  if(typeof window !== "undefined" && window.crypto) {
		if (window.crypto.getRandomValues) {
		  // Use webcrypto if available
		  var ua = new Uint8Array(32);
		  window.crypto.getRandomValues(ua);
		  for(t = 0; t < 32; ++t)
			rng_pool[rng_pptr++] = ua[t];
		}
		else if(navigator.appName == "Netscape" && navigator.appVersion < "5") {
		  // Extract entropy (256 bits) from NS4 RNG if available
		  var z = window.crypto.random(32);
		  for(t = 0; t < z.length; ++t)
			rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;
		}
	  }
	  while(rng_pptr < rng_psize) {  // extract some randomness from Math.random()
		t = Math.floor(65536 * Math.random());
		rng_pool[rng_pptr++] = t >>> 8;
		rng_pool[rng_pptr++] = t & 255;
	  }
	  rng_pptr = 0;
	  rng_seed_time();
	  //rng_seed_int(window.screenX);
	  //rng_seed_int(window.screenY);
	}

	function rng_get_byte() {
	  if(rng_state == null) {
		rng_seed_time();
		rng_state = prng_newstate();
		rng_state.init(rng_pool);
		for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)
		  rng_pool[rng_pptr] = 0;
		rng_pptr = 0;
		//rng_pool = null;
	  }
	  // TODO: allow reseeding after first request
	  return rng_state.next();
	}

	function rng_get_bytes(ba) {
	  var i;
	  for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();
	}

	function SecureRandom() {}

	SecureRandom.prototype.nextBytes = rng_get_bytes;

	// prng4.js - uses Arcfour as a PRNG

	function Arcfour() {
	  this.i = 0;
	  this.j = 0;
	  this.S = new Array();
	}

	// Initialize arcfour context from key, an array of ints, each from [0..255]
	function ARC4init(key) {
	  var i, j, t;
	  for(i = 0; i < 256; ++i)
		this.S[i] = i;
	  j = 0;
	  for(i = 0; i < 256; ++i) {
		j = (j + this.S[i] + key[i % key.length]) & 255;
		t = this.S[i];
		this.S[i] = this.S[j];
		this.S[j] = t;
	  }
	  this.i = 0;
	  this.j = 0;
	}

	function ARC4next() {
	  var t;
	  this.i = (this.i + 1) & 255;
	  this.j = (this.j + this.S[this.i]) & 255;
	  t = this.S[this.i];
	  this.S[this.i] = this.S[this.j];
	  this.S[this.j] = t;
	  return this.S[(t + this.S[this.i]) & 255];
	}

	Arcfour.prototype.init = ARC4init;
	Arcfour.prototype.next = ARC4next;

	// Plug in your RNG constructor here
	function prng_newstate() {
	  return new Arcfour();
	}

	// Pool size must be a multiple of 4 and greater than 32.
	// An array of bytes the size of the pool will be passed to init()
	var rng_psize = 256;

  BigInteger.SecureRandom = SecureRandom;
  BigInteger.BigInteger = BigInteger;
  if (typeof exports !== 'undefined') {
    exports = module.exports = BigInteger;
  } else {
    this.BigInteger = BigInteger;
    this.SecureRandom = SecureRandom;
  }

}).call(this);
{
  "author": {
    "name": "Tom Wu"
  },
  "deprecated": false,
  "description": "The jsbn library is a fast, portable implementation of large-number math in pure JavaScript, enabling public-key crypto and other applications on desktop and mobile browsers.",
  "homepage": "https://github.com/andyperlitch/jsbn#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "jsbn",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/andyperlitch/jsbn.git"
  },
  "version": "0.1.1"
}Copyright (c) 2013 Dominic Tarr

Permission is hereby granted, free of charge, 
to any person obtaining a copy of this software and 
associated documentation files (the "Software"), to 
deal in the Software without restriction, including 
without limitation the rights to use, copy, modify, 
merge, publish, distribute, sublicense, and/or sell 
copies of the Software, and to permit persons to whom 
the Software is furnished to do so, 
subject to the following conditions:

The above copyright notice and this permission notice 
shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR 
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//TODO: handle reviver/dehydrate function like normal
//and handle indentation, like normal.
//if anyone needs this... please send pull request.

exports.stringify = function stringify (o) {
  if('undefined' == typeof o) return o

  if(o && Buffer.isBuffer(o))
    return JSON.stringify(':base64:' + o.toString('base64'))

  if(o && o.toJSON)
    o =  o.toJSON()

  if(o && 'object' === typeof o) {
    var s = ''
    var array = Array.isArray(o)
    s = array ? '[' : '{'
    var first = true

    for(var k in o) {
      var ignore = 'function' == typeof o[k] || (!array && 'undefined' === typeof o[k])
      if(Object.hasOwnProperty.call(o, k) && !ignore) {
        if(!first)
          s += ','
        first = false
        if (array) {
          if(o[k] == undefined)
            s += 'null'
          else
            s += stringify(o[k])
        } else if (o[k] !== void(0)) {
          s += stringify(k) + ':' + stringify(o[k])
        }
      }
    }

    s += array ? ']' : '}'

    return s
  } else if ('string' === typeof o) {
    return JSON.stringify(/^:/.test(o) ? ':' + o : o)
  } else if ('undefined' === typeof o) {
    return 'null';
  } else
    return JSON.stringify(o)
}

exports.parse = function (s) {
  return JSON.parse(s, function (key, value) {
    if('string' === typeof value) {
      if(/^:base64:/.test(value))
        return new Buffer(value.substring(8), 'base64')
      else
        return /^:/.test(value) ? value.substring(1) : value 
    }
    return value
  })
}
{
  "author": {
    "name": "Dominic Tarr",
    "email": "dominic.tarr@gmail.com",
    "url": "http://dominictarr.com"
  },
  "deprecated": false,
  "description": "JSON parse & stringify that supports binary via bops & base64",
  "devDependencies": {
    "tape": "^4.6.3"
  },
  "homepage": "https://github.com/dominictarr/json-buffer",
  "license": "MIT",
  "name": "json-buffer",
  "repository": {
    "type": "git",
    "url": "git://github.com/dominictarr/json-buffer.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/8..latest",
      "firefox/17..latest",
      "firefox/nightly",
      "chrome/22..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  },
  "version": "3.0.0"
}<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY rfc4627 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4627.xml">
<!ENTITY rfc3986 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3986.xml">
<!ENTITY rfc2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY rfc4287 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4287.xml">
<!ENTITY rfc2616 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2616.xml">
<!ENTITY rfc3339 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3339.xml">
<!ENTITY rfc2045 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2045.xml">
<!ENTITY rfc5226 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5226.xml">
<!ENTITY rfc2396 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2396.xml">
<!ENTITY iddiscovery SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.hammer-discovery.xml">
<!ENTITY uritemplate SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.gregorio-uritemplate.xml">
<!ENTITY linkheader SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.nottingham-http-link-header.xml">
<!ENTITY html401 SYSTEM "http://xml.resource.org/public/rfc/bibxml4/reference.W3C.REC-html401-19991224.xml">
<!ENTITY css21 SYSTEM "http://xml.resource.org/public/rfc/bibxml4/reference.W3C.CR-CSS21-20070719.xml">
]>
<?rfc toc="yes"?>
<?rfc symrefs="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<?rfc strict="no"?>
<?rfc rfcedstyle="yes"?>
<rfc category="info" docName="draft-zyp-json-schema-03" ipr="trust200902">
	<front>
		<title abbrev="JSON Schema Media Type">A JSON Media Type for Describing the Structure and Meaning of JSON Documents</title>
		
		<author fullname="Kris Zyp" initials="K" role="editor" surname="Zyp">
			<organization>SitePen (USA)</organization>
			<address>
				<postal>
					<street>530 Lytton Avenue</street>
					<city>Palo Alto, CA 94301</city>
					<country>USA</country>
				</postal>
				<phone>+1 650 968 8787</phone>
				<email>kris@sitepen.com</email>
			</address>
		</author>
		
		<author fullname="Gary Court" initials="G" surname="Court">
			<address>
				<postal>
					<street></street>
					<city>Calgary, AB</city>
					<country>Canada</country>
				</postal>
				<email>gary.court@gmail.com</email>
			</address>
		</author>
		
		<date year="2011" />
		<workgroup>Internet Engineering Task Force</workgroup>
		<keyword>JSON</keyword>
		<keyword>Schema</keyword>
		<keyword>JavaScript</keyword>
		<keyword>Object</keyword>
		<keyword>Notation</keyword>
		<keyword>Hyper Schema</keyword>
		<keyword>Hypermedia</keyword>
		
		<abstract>
			<t>
				JSON (JavaScript Object Notation) Schema defines the media type "application/schema+json", 
				a JSON based format for defining 
				the structure of JSON data. JSON Schema provides a contract for what JSON 
				data is required for a given application and how to interact with it. JSON 
				Schema is intended to define validation, documentation, hyperlink 
				navigation, and interaction control of JSON data. 
			</t>
		</abstract>
	</front>
	
	<middle>
		<section title="Introduction">
			<t>
				JSON (JavaScript Object Notation) Schema is a JSON media type for defining 
				the structure of JSON data. JSON Schema provides a contract for what JSON 
				data is required for a given application and how to interact with it. JSON 
				Schema is intended to define validation, documentation, hyperlink 
				navigation, and interaction control of JSON data. 
			</t>
		</section>
		
		<section title="Conventions">
			<t>
				<!-- The text in this section has been copied from the official boilerplate, 
				and should not be modified.-->
				
				The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", 
				"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
				interpreted as described in <xref target="RFC2119">RFC 2119</xref>.
			</t>
		</section>
		
		<!-- ********************************************* -->
		
		<section title="Overview">
			<t>
				JSON Schema defines the media type "application/schema+json" for 
				describing the structure of other
				JSON documents. JSON Schema is JSON-based and includes facilities 
				for describing the structure of JSON documents in terms of
				allowable values, descriptions, and interpreting relations with other resources.
			</t>
			<t>
				JSON Schema format is organized into several separate definitions. The first 
				definition is the core schema specification. This definition is primary 
				concerned with describing a JSON structure and specifying valid elements
				in the structure. The second definition is the Hyper Schema specification
				which is intended define elements in a structure that can be interpreted as
				hyperlinks.
				Hyper Schema builds on JSON Schema to describe the hyperlink structure of 
				other JSON documents and elements of interaction. This allows user agents to be able to successfully navigate
				JSON documents based on their schemas.
			</t>
			<t>
				Cumulatively JSON Schema acts as a meta-document that can be used to define the required type and constraints on
				property values, as well as define the meaning of the property values
				for the purpose of describing a resource and determining hyperlinks
				within the representation. 
			</t>
			<figure>
				<preamble>An example JSON Schema that describes products might look like:</preamble>
				<artwork>
<![CDATA[	
{
	"title": "Product",
	"properties": {
		"id": {
			"type": "number",
			"description": "Product identifier",
			"required": true
		},
		"name": {
			"description": "Name of the product",
			"type": "string",
			"required": true
		},
		"price": {
			"required": true,
			"type": "number",
			"minimum": 0,
			"required": true
		},
		"tags": {
			"type": "array",
			"items": {
				"type": "string"
			}
		}
	},
	"links": [{
		"rel": "full",
		"href": "{id}"
	}, {
		"rel": "comments",
		"href": "comments/?id={id}"
	}]
}
]]>
				</artwork>
				<postamble>
					This schema defines the properties of the instance JSON documents, 
					the required properties (id, name, and price), as well as an optional
					property (tags). This also defines the link relations of the instance
					JSON documents.
				</postamble>
			</figure>
			
			<section title="Terminology">
				<t>
					For this specification, <spanx style="strong">schema</spanx> will be used to denote a JSON Schema 
					definition, and an <spanx style="strong">instance</spanx> refers to a JSON value that the schema 
					will be describing and validating.
				</t>
			</section>
			
			<section title="Design Considerations">
				<t>
					The JSON Schema media type does not attempt to dictate the structure of JSON
					representations that contain data, but rather provides a separate format
					for flexibly communicating how a JSON representation should be
					interpreted and validated, such that user agents can properly understand
					acceptable structures and extrapolate hyperlink information
					with the JSON document. It is acknowledged that JSON documents come
					in a variety of structures, and JSON is unique in that the structure
					of stored data structures often prescribes a non-ambiguous definite
					JSON representation. Attempting to force a specific structure is generally
					not viable, and therefore JSON Schema allows for a great flexibility
					in the structure of the JSON data that it describes.
				</t>
				<t>
					This specification is protocol agnostic.
					The underlying protocol (such as HTTP) should sufficiently define the
					semantics of the client-server interface, the retrieval of resource
					representations linked to by JSON representations, and modification of 
					those resources. The goal of this
					format is to sufficiently describe JSON structures such that one can
					utilize existing information available in existing JSON
					representations from a large variety of services that leverage a representational state transfer
					architecture using existing protocols.
				</t>
			</section>
		</section>
		
		<section title="Schema/Instance Association">
			<t>
				JSON Schema instances are correlated to their schema by the "describedby"
				relation, where the schema is defined to be the target of the relation.
				Instance representations may be of the "application/json" media type or
				any other subtype. Consequently, dictating how an instance
				representation should specify the relation to the schema is beyond the normative scope
				of this document (since this document specifically defines the JSON
				Schema media type, and no other), but it is recommended that instances
				specify their schema so that user agents can interpret the instance
				representation and messages may retain the self-descriptive
				characteristic, avoiding the need for out-of-band information about
				instance data. Two approaches are recommended for declaring the
				relation to the schema that describes the meaning of a JSON instance's (or collection 
				of instances) structure. A MIME type parameter named
				"profile" or a relation of "describedby" (which could be defined by a Link header) may be used:
				
				<figure>
					<artwork>
<![CDATA[	
Content-Type: application/my-media-type+json;
              profile=http://json.com/my-hyper-schema
]]>
					</artwork>
				</figure>
				
				or if the content is being transferred by a protocol (such as HTTP) that
				provides headers, a Link header can be used:
				
				<figure>
					<artwork>
<![CDATA[
Link: <http://json.com/my-hyper-schema>; rel="describedby"
]]>
					</artwork>
				</figure>
				
				Instances MAY specify multiple schemas, to indicate all the schemas that 
				are applicable to the data, and the data SHOULD be valid by all the schemas. 
				The instance data MAY have multiple schemas 
				that it is defined by (the instance data SHOULD be valid for those schemas). 
				Or if the document is a collection of instances, the collection MAY contain 
				instances from different schemas. When collections contain heterogeneous 
				instances, the "pathStart" attribute MAY be specified in the 
				schema to disambiguate which schema should be applied for each item in the 
				collection. However, ultimately, the mechanism for referencing a schema is up to the
				media type of the instance documents (if they choose to specify that schemas
				can be referenced).
			</t>
			
			<section title="Self-Descriptive Schema">
				<t>
					JSON Schemas can themselves be described using JSON Schemas. 
					A self-describing JSON Schema for the core JSON Schema can
					be found at <eref target="http://json-schema.org/schema">http://json-schema.org/schema</eref> for the latest version or 
					<eref target="http://json-schema.org/draft-03/schema">http://json-schema.org/draft-03/schema</eref> for the draft-03 version. The hyper schema 
					self-description can be found at <eref target="http://json-schema.org/hyper-schema">http://json-schema.org/hyper-schema</eref> 
					or <eref target="http://json-schema.org/draft-03/hyper-schema">http://json-schema.org/draft-03/hyper-schema</eref>. All schemas
					used within a protocol with media type definitions
					SHOULD include a MIME parameter that refers to the self-descriptive
					hyper schema or another schema that extends this hyper schema:
					
					<figure>
						<artwork>
<![CDATA[	
Content-Type: application/json; 
              profile=http://json-schema.org/draft-03/hyper-schema
]]>
						</artwork>
					</figure>
				</t>
			</section>
		</section>
		
		<section title="Core Schema Definition">
			<t>
				A JSON Schema is a JSON Object that defines various attributes 
				(including usage and valid values) of a JSON value. JSON
				Schema has recursive capabilities; there are a number of elements
				in the structure that allow for nested JSON Schemas.
			</t>
			
			<figure>
				<preamble>An example JSON Schema definition could look like:</preamble>
				<artwork>
<![CDATA[
{
	"description": "A person",
	"type": "object",

	"properties": {
		"name": {
			"type": "string"
		},
		"age": {
			"type": "integer",
			"maximum": 125
		}
	}
}
]]>
				</artwork>
			</figure>
			
			<t>
				A JSON Schema object may have any of the following properties, called schema
				attributes (all attributes are optional):
			</t>
			
			<section title="type">
				<t>
					This attribute defines what the primitive type or the schema of the instance MUST be in order to validate. 
					This attribute can take one of two forms:

					<list style="hanging">
						<t hangText="Simple Types">
							A string indicating a primitive or simple type. The following are acceptable string values:

							<list style="hanging">
								<t hangText="string">Value MUST be a string.</t>
								<t hangText="number">Value MUST be a number, floating point numbers are allowed. </t>
								<t hangText="integer">Value MUST be an integer, no floating point numbers are allowed. This is a subset of the number type.</t>
								<t hangText="boolean">Value MUST be a boolean. </t>
								<t hangText="object">Value MUST be an object.</t>
								<t hangText="array">Value MUST be an array.</t>
								<t hangText="null">Value MUST be null. Note this is mainly for purpose of being able use union types to define nullability. If this type is not included in a union, null values are not allowed (the primitives listed above do not allow nulls on their own).</t>
								<t hangText="any">Value MAY be of any type including null.</t>
							</list>
							
							If the property is not defined or is not in this list, then any type of value is acceptable. 
							Other type values MAY be used for custom purposes, but minimal validators of the specification 
							implementation can allow any instance value on unknown type values.
						</t>
						
						<t hangText="Union Types">
							An array of two or more simple type definitions. Each item in the array MUST be a simple type definition or a schema.
							The instance value is valid if it is of the same type as one of the simple type definitions, or valid by one of the schemas, in the array. 
						</t>
					</list>
				</t>
				
				<figure>
					<preamble>For example, a schema that defines if an instance can be a string or a number would be:</preamble>
					<artwork>
<![CDATA[
{
	"type": ["string", "number"]
}
]]></artwork>
				</figure>
			</section>
			
			<section title="properties" anchor="properties">
				<t>This attribute is an object with property definitions that define the valid values of instance object property values. When the instance value is an object, the property values of the instance object MUST conform to the property definitions in this object. In this object, each property definition's value MUST be a schema, and the property's name MUST be the name of the instance property that it defines. The instance property value MUST be valid according to the schema from the property definition. Properties are considered unordered, the order of the instance properties MAY be in any order.</t>
			</section>
			
			<section title="patternProperties">
				<t>This attribute is an object that defines the schema for a set of property names of an object instance. The name of each property of this attribute's object is a regular expression pattern in the ECMA 262/Perl 5 format, while the value is a schema. If the pattern matches the name of a property on the instance object, the value of the instance's property MUST be valid against the pattern name's schema value.</t>
			</section>
			
			<section title="additionalProperties" anchor="additionalProperties">
				<t>This attribute defines a schema for all properties that are not explicitly defined in an object type definition. If specified, the value MUST be a schema or a boolean. If false is provided, no additional properties are allowed beyond the properties defined in the schema. The default value is an empty schema which allows any value for additional properties.</t>
			</section>
			
			<section title="items">
				<t>This attribute defines the allowed items in an instance array, and MUST be a schema or an array of schemas. The default value is an empty schema which allows any value for items in the instance array.</t>
				<t>When this attribute value is a schema and the instance value is an array, then all the items in the array MUST be valid according to the schema.</t>
				<t>When this attribute value is an array of schemas and the instance value is an array, each position in the instance array MUST conform to the schema in the corresponding position for this array. This called tuple typing. When tuple typing is used, additional items are allowed, disallowed, or constrained by the <xref target="additionalItems">"additionalItems"</xref> attribute using the same rules as <xref target="additionalProperties">"additionalProperties"</xref> for objects.</t>
			</section>
			
			<section title="additionalItems" anchor="additionalItems">
				<t>This provides a definition for additional items in an array instance when tuple definitions of the items is provided. This can be false to indicate additional items in the array are not allowed, or it can be a schema that defines the schema of the additional items.</t>
			</section>
			
			<section title="required">
				<t>This attribute indicates if the instance must have a value, and not be undefined. This is false by default, making the instance optional.</t>
			</section>
			
			<section title="dependencies">
				<t>This attribute is an object that defines the requirements of a property on an instance object. If an object instance has a property with the same name as a property in this attribute's object, then the instance must be valid against the attribute's property value (hereafter referred to as the "dependency value").</t>
				<t>
					The dependency value can take one of two forms:
					
					<list style="hanging">
						<t hangText="Simple Dependency">
							If the dependency value is a string, then the instance object MUST have a property with the same name as the dependency value.
							If the dependency value is an array of strings, then the instance object MUST have a property with the same name as each string in the dependency value's array.
						</t>
						<t hangText="Schema Dependency">
							If the dependency value is a schema, then the instance object MUST be valid against the schema.
						</t>
					</list>
				</t>
			</section>
			
			<section title="minimum">
				<t>This attribute defines the minimum value of the instance property when the type of the instance value is a number.</t>
			</section>
			
			<section title="maximum">
				<t>This attribute defines the maximum value of the instance property when the type of the instance value is a number.</t>
			</section>
			
			<section title="exclusiveMinimum">
				<t>This attribute indicates if the value of the instance (if the instance is a number) can not equal the number defined by the "minimum" attribute. This is false by default, meaning the instance value can be greater then or equal to the minimum value.</t>
			</section>
			
			<section title="exclusiveMaximum">
				<t>This attribute indicates if the value of the instance (if the instance is a number) can not equal the number defined by the "maximum" attribute. This is false by default, meaning the instance value can be less then or equal to the maximum value.</t>
			</section>
			
			<section title="minItems">
				<t>This attribute defines the minimum number of values in an array when the array is the instance value.</t>
			</section>
			
			<section title="maxItems">
				<t>This attribute defines the maximum number of values in an array when the array is the instance value.</t>
			</section>
			
			<section title="uniqueItems" anchor="uniqueItems">
				<t>This attribute indicates that all items in an array instance MUST be unique (contains no two identical values).</t>
				<t>
					Two instance are consider equal if they are both of the same type and:
					
					<list>
						<t>are null; or</t>
						<t>are booleans/numbers/strings and have the same value; or</t>
						<t>are arrays, contains the same number of items, and each item in the array is equal to the corresponding item in the other array; or</t>
						<t>are objects, contains the same property names, and each property in the object is equal to the corresponding property in the other object.</t>
					</list>
				</t>
			</section>
			
			<section title="pattern">
				<t>When the instance value is a string, this provides a regular expression that a string instance MUST match in order to be valid. Regular expressions SHOULD follow the regular expression specification from ECMA 262/Perl 5</t>
			</section>
			
			<section title="minLength">
				<t>When the instance value is a string, this defines the minimum length of the string.</t>
			</section>
			
			<section title="maxLength">
				<t>When the instance value is a string, this defines the maximum length of the string.</t>
			</section>
			
			<section title="enum">
				<t>This provides an enumeration of all possible values that are valid for the instance property. This MUST be an array, and each item in the array represents a possible value for the instance value. If this attribute is defined, the instance value MUST be one of the values in the array in order for the schema to be valid. Comparison of enum values uses the same algorithm as defined in <xref target="uniqueItems">"uniqueItems"</xref>.</t>
			</section>
			
			<section title="default">
				<t>This attribute defines the default value of the instance when the instance is undefined.</t>
			</section>
			
			<section title="title">
				<t>This attribute is a string that provides a short description of the instance property.</t>
			</section>
			
			<section title="description">
				<t>This attribute is a string that provides a full description of the of purpose the instance property.</t>
			</section>
			
			<section title="format">
				<t>This property defines the type of data, content type, or microformat to be expected in the instance property values. A format attribute MAY be one of the values listed below, and if so, SHOULD adhere to the semantics describing for the format. A format SHOULD only be used to give meaning to primitive types (string, integer, number, or boolean). Validators MAY (but are not required to) validate that the instance values conform to a format.</t>
				
				<t>
					The following formats are predefined:
					
					<list style="hanging">
						<t hangText="date-time">This SHOULD be a date in ISO 8601 format of YYYY-MM-DDThh:mm:ssZ in UTC time. This is the recommended form of date/timestamp.</t>
						<t hangText="date">This SHOULD be a date in the format of YYYY-MM-DD. It is recommended that you use the "date-time" format instead of "date" unless you need to transfer only the date part.</t>
						<t hangText="time">This SHOULD be a time in the format of hh:mm:ss. It is recommended that you use the "date-time" format instead of "time" unless you need to transfer only the time part.</t>
						<t hangText="utc-millisec">This SHOULD be the difference, measured in milliseconds, between the specified time and midnight, 00:00 of January 1, 1970 UTC. The value SHOULD be a number (integer or float).</t>
						<t hangText="regex">A regular expression, following the regular expression specification from ECMA 262/Perl 5.</t>
						<t hangText="color">This is a CSS color (like "#FF0000" or "red"), based on <xref target="W3C.CR-CSS21-20070719">CSS 2.1</xref>.</t>
						<t hangText="style">This is a CSS style definition (like "color: red; background-color:#FFF"), based on <xref target="W3C.CR-CSS21-20070719">CSS 2.1</xref>.</t>
						<t hangText="phone">This SHOULD be a phone number (format MAY follow E.123).</t>
						<t hangText="uri">This value SHOULD be a URI.</t>
						<t hangText="email">This SHOULD be an email address.</t>
						<t hangText="ip-address">This SHOULD be an ip version 4 address.</t>
						<t hangText="ipv6">This SHOULD be an ip version 6 address.</t>
						<t hangText="host-name">This SHOULD be a host-name.</t>
					</list>
				</t>
				
				<t>Additional custom formats MAY be created. These custom formats MAY be expressed as an URI, and this URI MAY reference a schema of that format.</t>
			</section>
			
			<section title="divisibleBy">
				<t>This attribute defines what value the number instance must be divisible by with no remainder (the result of the division must be an integer.) The value of this attribute SHOULD NOT be 0.</t>
			</section>
			
			<section title="disallow">
				<t>This attribute takes the same values as the "type" attribute, however if the instance matches the type or if this value is an array and the instance matches any type or schema in the array, then this instance is not valid.</t>
			</section>
			
			<section title="extends">
				<t>The value of this property MUST be another schema which will provide a base schema which the current schema will inherit from. The inheritance rules are such that any instance that is valid according to the current schema MUST be valid according to the referenced schema. This MAY also be an array, in which case, the instance MUST be valid for all the schemas in the array. A schema that extends another schema MAY define additional attributes, constrain existing attributes, or add other constraints.</t>
				<t>
					Conceptually, the behavior of extends can be seen as validating an
					instance against all constraints in the extending schema as well as
					the extended schema(s). More optimized implementations that merge
					schemas are possible, but are not required. Some examples of using "extends":
					
					<figure>
						<artwork>
<![CDATA[
{
	"description": "An adult",
	"properties": {
		"age": {
			"minimum": 21
		}
	},
	"extends": {"$ref": "person"}
}
]]>
						</artwork>
					</figure>
					
					<figure>
						<artwork>
<![CDATA[
{
	"description": "Extended schema",
	"properties": {
		"deprecated": {
			"type": "boolean"
		}
	},
	"extends": {"$ref": "http://json-schema.org/draft-03/schema"}
}
]]>
						</artwork>
					</figure>
				</t>
			</section>
			
			<section title="id">
				<t>
					This attribute defines the current URI of this schema (this attribute is
					effectively a "self" link). This URI MAY be relative or absolute. If
					the URI is relative it is resolved against the current URI of the parent
					schema it is contained in. If this schema is not contained in any
					parent schema, the current URI of the parent schema is held to be the
					URI under which this schema was addressed. If id is missing, the current URI of a schema is
					defined to be that of the parent schema. The current URI of the schema
					is also used to construct relative references such as for $ref.
				</t>
			</section>
			
			<section title="$ref">
				<t>
					This attribute defines a URI of a schema that contains the full representation of this schema. 
					When a validator encounters this attribute, it SHOULD replace the current schema with the schema referenced by the value's URI (if known and available) and re-validate the instance. 
					This URI MAY be relative or absolute, and relative URIs SHOULD be resolved against the URI of the current schema.
				</t>
			</section>
			
			<section title="$schema">
				<t>
					This attribute defines a URI of a JSON Schema that is the schema of the current schema. 
					When this attribute is defined, a validator SHOULD use the schema referenced by the value's URI (if known and available) when resolving <xref target="hyper-schema">Hyper Schema</xref><xref target="links">links</xref>.
				</t>
				
				<t>
					A validator MAY use this attribute's value to determine which version of JSON Schema the current schema is written in, and provide the appropriate validation features and behavior. 
					Therefore, it is RECOMMENDED that all schema authors include this attribute in their schemas to prevent conflicts with future JSON Schema specification changes.
				</t>
			</section>
		</section>
		
		<section title="Hyper Schema" anchor="hyper-schema">
			<t>
				The following attributes are specified in addition to those
				attributes that already provided by the core schema with the specific
				purpose of informing user agents of relations between resources based
				on JSON data. Just as with JSON
				schema attributes, all the attributes in hyper schemas are optional.
				Therefore, an empty object is a valid (non-informative) schema, and
				essentially describes plain JSON (no constraints on the structures).
				Addition of attributes provides additive information for user agents.
			</t>
			
			<section title="links" anchor="links">
				<t>
					The value of the links property MUST be an array, where each item 
					in the array is a link description object which describes the link
					relations of the instances.
				</t>
				
				<section title="Link Description Object">
					<t>
						A link description object is used to describe link relations. In 
						the context of a schema, it defines the link relations of the 
						instances of the schema, and can be parameterized by the instance
						values. The link description format can be used on its own in
						regular (non-schema documents), and use of this format can
						be declared by referencing the normative link description
						schema as the the schema for the data structure that uses the 
						links. The URI of the normative link description schema is: 
						<eref target="http://json-schema.org/links">http://json-schema.org/links</eref> (latest version) or
						<eref target="http://json-schema.org/draft-03/links">http://json-schema.org/draft-03/links</eref> (draft-03 version).
					</t>
					
					<section title="href">
						<t>
							The value of the "href" link description property
							indicates the target URI of the related resource. The value
							of the instance property SHOULD be resolved as a URI-Reference per <xref target="RFC3986">RFC 3986</xref>
							and MAY be a relative URI. The base URI to be used for relative resolution
							SHOULD be the URI used to retrieve the instance object (not the schema)
							when used within a schema. Also, when links are used within a schema, the URI 
							SHOULD be parametrized by the property values of the instance 
							object, if property values exist for the corresponding variables
							in the template (otherwise they MAY be provided from alternate sources, like user input).
						</t>
						
						<t>
							Instance property values SHOULD be substituted into the URIs where
							matching braces ('{', '}') are found surrounding zero or more characters,
							creating an expanded URI. Instance property value substitutions are resolved
							by using the text between the braces to denote the property name
							from the instance to get the value to substitute. 
							
							<figure>
								<preamble>For example, if an href value is defined:</preamble>
								<artwork>
<![CDATA[
http://somesite.com/{id}
]]>
								</artwork>
								<postamble>Then it would be resolved by replace the value of the "id" property value from the instance object.</postamble>
							</figure>
							
							<figure>
								<preamble>If the value of the "id" property was "45", the expanded URI would be:</preamble>
								<artwork>
<![CDATA[
http://somesite.com/45
]]>
								</artwork>
							</figure>
							
							If matching braces are found with the string "@" (no quotes) between the braces, then the 
							actual instance value SHOULD be used to replace the braces, rather than a property value.
							This should only be used in situations where the instance is a scalar (string, 
							boolean, or number), and not for objects or arrays.
						</t>
					</section>
					
					<section title="rel">
						<t>
							The value of the "rel" property indicates the name of the 
							relation to the target resource. The relation to the target SHOULD be interpreted as specifically from the instance object that the schema (or sub-schema) applies to, not just the top level resource that contains the object within its hierarchy. If a resource JSON representation contains a sub object with a property interpreted as a link, that sub-object holds the relation with the target. A relation to target from the top level resource MUST be indicated with the schema describing the top level JSON representation.
						</t>
						
						<t>
							Relationship definitions SHOULD NOT be media type dependent, and users are encouraged to utilize existing accepted relation definitions, including those in existing relation registries (see <xref target="RFC4287">RFC 4287</xref>). However, we define these relations here for clarity of normative interpretation within the context of JSON hyper schema defined relations:
							
							<list style="hanging">
								<t hangText="self">
									If the relation value is "self", when this property is encountered in
									the instance object, the object represents a resource and the instance object is
									treated as a full representation of the target resource identified by
									the specified URI.
								</t>
								
								<t hangText="full">
									This indicates that the target of the link is the full representation for the instance object. The object that contains this link possibly may not be the full representation.
								</t>
								
								<t hangText="describedby">
									This indicates the target of the link is the schema for the instance object. This MAY be used to specifically denote the schemas of objects within a JSON object hierarchy, facilitating polymorphic type data structures.
								</t>
								
								<t hangText="root">
									This relation indicates that the target of the link
									SHOULD be treated as the root or the body of the representation for the
									purposes of user agent interaction or fragment resolution. All other
									properties of the instance objects can be regarded as meta-data
									descriptions for the data.
								</t>
							</list>
						</t>
						
						<t>
							The following relations are applicable for schemas (the schema as the "from" resource in the relation):

							<list style="hanging">
								<t hangText="instances">This indicates the target resource that represents collection of instances of a schema.</t>
								<t hangText="create">This indicates a target to use for creating new instances of a schema. This link definition SHOULD be a submission link with a non-safe method (like POST).</t>
							</list>
						</t>
						
						<t>
							<figure>
								<preamble>For example, if a schema is defined:</preamble>
								<artwork>
<![CDATA[
{
	"links": [{
		"rel": "self",
		"href": "{id}"
	}, {
		"rel": "up",
		"href": "{upId}"
	}, {
		"rel": "children",
		"href": "?upId={id}"
	}]
}
]]>
								</artwork>
							</figure>
							
							<figure>
								<preamble>And if a collection of instance resource's JSON representation was retrieved:</preamble>
								<artwork>
<![CDATA[
GET /Resource/

[{
	"id": "thing",
	"upId": "parent"
}, {
	"id": "thing2",
	"upId": "parent"
}]
]]>
								</artwork>
							</figure>

							This would indicate that for the first item in the collection, its own
							(self) URI would resolve to "/Resource/thing" and the first item's "up"
							relation SHOULD be resolved to the resource at "/Resource/parent".
							The "children" collection would be located at "/Resource/?upId=thing".
						</t>
					</section>
					
					<section title="targetSchema">
						<t>This property value is a schema that defines the expected structure of the JSON representation of the target of the link.</t>
					</section>
					
					<section title="Submission Link Properties">
						<t>
							The following properties also apply to link definition objects, and 
							provide functionality analogous to HTML forms, in providing a 
							means for submitting extra (often user supplied) information to send to a server.
						</t>
						
						<section title="method">
							<t>
								This attribute defines which method can be used to access the target resource. 
								In an HTTP environment, this would be "GET" or "POST" (other HTTP methods 
								such as "PUT" and "DELETE" have semantics that are clearly implied by 
								accessed resources, and do not need to be defined here). 
								This defaults to "GET".
							</t>
						</section>
						
						<section title="enctype">
							<t>
								If present, this property indicates a query media type format that the server
								supports for querying or posting to the collection of instances at the target 
								resource. The query can be 
								suffixed to the target URI to query the collection with
								property-based constraints on the resources that SHOULD be returned from
								the server or used to post data to the resource (depending on the method).
								
								<figure>
									<preamble>For example, with the following schema:</preamble>
									<artwork>
<![CDATA[
{
	"links": [{
		"enctype": "application/x-www-form-urlencoded",
		"method": "GET",
		"href": "/Product/",
		"properties": {
			"name": {
				"description": "name of the product"
			}
		}
	}]
}
]]>
									</artwork>
									<postamble>This indicates that the client can query the server for instances that have a specific name.</postamble>
								</figure>
								
								<figure>
									<preamble>For example:</preamble>
									<artwork>
<![CDATA[
/Product/?name=Slinky
]]>
									</artwork>
								</figure>

								If no enctype or method is specified, only the single URI specified by 
								the href property is defined. If the method is POST, "application/json" is 
								the default media type.
							</t>
						</section>
						
						<section title="schema">
							<t>
								This attribute contains a schema which defines the acceptable structure of the submitted
								request (for a GET request, this schema would define the properties for the query string 
								and for a POST request, this would define the body).
							</t>
						</section>
					</section>
				</section>
			</section>
			
			<section title="fragmentResolution">
				<t>
					This property indicates the fragment resolution protocol to use for
					resolving fragment identifiers in URIs within the instance
					representations. This applies to the instance object URIs and all
					children of the instance object's URIs. The default fragment resolution
					protocol is "slash-delimited", which is defined below. Other fragment
					resolution protocols MAY be used, but are not defined in this document.
				</t>
				
				<t>
					The fragment identifier is based on <xref target="RFC2396">RFC 2396, Sec 5</xref>, and defines the
					mechanism for resolving references to entities within a document.
				</t>
				
				<section title="slash-delimited fragment resolution">
					<t>
						With the slash-delimited fragment resolution protocol, the fragment
						identifier is interpreted as a series of property reference tokens that start with and
						are delimited by the "/" character (\x2F). Each property reference token
						is a series of unreserved or escaped URI characters. Each property
						reference token SHOULD be interpreted, starting from the beginning of
						the fragment identifier, as a path reference in the target JSON
						structure. The final target value of the fragment can be determined by
						starting with the root of the JSON structure from the representation of
						the resource identified by the pre-fragment URI. If the target is a JSON
						object, then the new target is the value of the property with the name
						identified by the next property reference token in the fragment. If the
						target is a JSON array, then the target is determined by finding the
						item in array the array with the index defined by the next property
						reference token (which MUST be a number). The target is successively
						updated for each property reference token, until the entire fragment has
						been traversed. 
					</t>
					
					<t>
						Property names SHOULD be URI-encoded. In particular, any "/" in a 
						property name MUST be encoded to avoid being interpreted as a property 
						delimiter.
					</t>
					
					<t>
						<figure>
							<preamble>For example, for the following JSON representation:</preamble>
							<artwork>
<![CDATA[
{
	"foo": {
		"anArray": [{
			"prop": 44
		}],
		"another prop": {
			"baz": "A string"
		}
	}
}
]]>
							</artwork>
						</figure>
						
						<figure>
							<preamble>The following fragment identifiers would be resolved:</preamble>
							<artwork>
<![CDATA[
fragment identifier      resolution
-------------------      ----------
#                        self, the root of the resource itself
#/foo                    the object referred to by the foo property
#/foo/another%20prop     the object referred to by the "another prop"
                         property of the object referred to by the 
                         "foo" property
#/foo/another%20prop/baz the string referred to by the value of "baz"
                         property of the "another prop" property of 
                         the object referred to by the "foo" property
#/foo/anArray/0          the first object in the "anArray" array
]]>
							</artwork>
						</figure>
					</t>
				</section>
				
				<section title="dot-delimited fragment resolution">
					<t>
						The dot-delimited fragment resolution protocol is the same as 
						slash-delimited fragment resolution protocol except that the "." character 
						(\x2E) is used as the delimiter between property names (instead of "/") and 
						the path does not need to start with a ".". For example, #.foo and #foo are a valid fragment
						identifiers for referencing the value of the foo propery.
					</t>
				</section>
			</section>
			
			<section title="readonly">
				<t>This attribute indicates that the instance property SHOULD NOT be changed. Attempts by a user agent to modify the value of this property are expected to be rejected by a server.</t>
			</section>
			
			<section title="contentEncoding">
				<t>If the instance property value is a string, this attribute defines that the string SHOULD be interpreted as binary data and decoded using the encoding named by this schema property. <xref target="RFC2045">RFC 2045, Sec 6.1</xref> lists the possible values for this property.</t>
			</section>
			
			<section title="pathStart">
				<t>
					This attribute is a URI that defines what the instance's URI MUST start with in order to validate. 
					The value of the "pathStart" attribute MUST be resolved as per <xref target="RFC3986">RFC 3986, Sec 5</xref>, 
					and is relative to the instance's URI.
				</t>
				
				<t>
					When multiple schemas have been referenced for an instance, the user agent 
					can determine if this schema is applicable for a particular instance by 
					determining if the URI of the instance begins with the the value of the "pathStart"
					attribute. If the URI of the instance does not start with this URI, 
					or if another schema specifies a starting URI that is longer and also matches the 
					instance, this schema SHOULD NOT be applied to the instance. Any schema 
					that does not have a pathStart attribute SHOULD be considered applicable 
					to all the instances for which it is referenced.
				</t>
			</section>
			
			<section title="mediaType">
				<t>This attribute defines the media type of the instance representations that this schema is defining.</t>
			</section>
		</section>
		
		<section title="Security Considerations">
			<t>
				This specification is a sub-type of the JSON format, and 
				consequently the security considerations are generally the same as <xref target="RFC4627">RFC 4627</xref>. 
				However, an additional issue is that when link relation of "self"
				is used to denote a full representation of an object, the user agent 
				SHOULD NOT consider the representation to be the authoritative representation
				of the resource denoted by the target URI if the target URI is not
				equivalent to or a sub-path of the the URI used to request the resource 
				representation which contains the target URI with the "self" link.
				
				<figure>
					<preamble>For example, if a hyper schema was defined:</preamble>
					<artwork>
<![CDATA[
{
	"links": [{
		"rel": "self",
		"href": "{id}"
	}]
}
]]>
					</artwork>
				</figure>
				
				<figure>
					<preamble>And a resource was requested from somesite.com:</preamble>
					<artwork>
<![CDATA[
GET /foo/
]]>
					</artwork>
				</figure>

				<figure>
					<preamble>With a response of:</preamble>
					<artwork>
<![CDATA[
Content-Type: application/json; profile=/schema-for-this-data

[{
	"id": "bar",
	"name": "This representation can be safely treated \
		as authoritative "
}, {
	"id": "/baz",
	"name": "This representation should not be treated as \
		authoritative the user agent should make request the resource\
		from '/baz' to ensure it has the authoritative representation"
}, {
	"id": "http://othersite.com/something",
	"name": "This representation\
		should also not be treated as authoritative and the target\
		resource representation should be retrieved for the\
		authoritative representation"
}]
]]>
					</artwork>
				</figure>
			</t>
		</section>
		
		<section title="IANA Considerations">
			<t>The proposed MIME media type for JSON Schema is "application/schema+json".</t>
			<t>Type name: application</t>
			<t>Subtype name: schema+json</t>
			<t>Required parameters: profile</t>
			<t>
				The value of the profile parameter SHOULD be a URI (relative or absolute) that 
				refers to the schema used to define the structure of this structure (the 
				meta-schema). Normally the value would be http://json-schema.org/draft-03/hyper-schema,
				but it is allowable to use other schemas that extend the hyper schema's meta-
				schema.
			</t>
			<t>Optional parameters: pretty</t>
			<t>The value of the pretty parameter MAY be true or false to indicate if additional whitespace has been included to make the JSON representation easier to read.</t>
			
			<section title="Registry of Link Relations">
				<t>
					This registry is maintained by IANA per <xref target="RFC4287">RFC 4287</xref> and this specification adds
					four values: "full", "create", "instances", "root".  New
					assignments are subject to IESG Approval, as outlined in <xref target="RFC5226">RFC 5226</xref>.
					Requests should be made by email to IANA, which will then forward the
					request to the IESG, requesting approval.
				</t>
			</section>
		</section>
	</middle>
	
	<back>
		<!-- References Section -->
		<references title="Normative References">
			&rfc2045;
			&rfc2119;
			&rfc2396;
			&rfc3339;
			&rfc3986;
			&rfc4287;
		</references>
		<references title="Informative References">
			&rfc2616;
			&rfc4627;
			&rfc5226;
			&iddiscovery;
			&uritemplate;
			&linkheader;
			&html401;
			&css21;
		</references>

		<section title="Change Log">
			<t>
				<list style="hanging">
					<t hangText="draft-03">
						<list style="symbols">
							<t>Added example and verbiage to "extends" attribute.</t>
							<t>Defined slash-delimited to use a leading slash.</t>
							<t>Made "root" a relation instead of an attribute.</t>
							<t>Removed address values, and MIME media type from format to reduce confusion (mediaType already exists, so it can be used for MIME types).</t>
							<t>Added more explanation of nullability.</t>
							<t>Removed "alternate" attribute.</t>
							<t>Upper cased many normative usages of must, may, and should.</t>
							<t>Replaced the link submission "properties" attribute to "schema" attribute.</t>
							<t>Replaced "optional" attribute with "required" attribute.</t>
							<t>Replaced "maximumCanEqual" attribute with "exclusiveMaximum" attribute.</t>
							<t>Replaced "minimumCanEqual" attribute with "exclusiveMinimum" attribute.</t>
							<t>Replaced "requires" attribute with "dependencies" attribute.</t>
							<t>Moved "contentEncoding" attribute to hyper schema.</t>
							<t>Added "additionalItems" attribute.</t>
							<t>Added "id" attribute.</t>
							<t>Switched self-referencing variable substitution from "-this" to "@" to align with reserved characters in URI template.</t>
							<t>Added "patternProperties" attribute.</t>
							<t>Schema URIs are now namespace versioned.</t>
							<t>Added "$ref" and "$schema" attributes.</t>
						</list>
					</t>
					
					<t hangText="draft-02">
						<list style="symbols">
							<t>Replaced "maxDecimal" attribute with "divisibleBy" attribute.</t>
							<t>Added slash-delimited fragment resolution protocol and made it the default.</t>
							<t>Added language about using links outside of schemas by referencing its normative URI.</t>
							<t>Added "uniqueItems" attribute.</t>
							<t>Added "targetSchema" attribute to link description object.</t>
						</list>
					</t>
					
					<t hangText="draft-01">
						<list style="symbols">
							<t>Fixed category and updates from template.</t>
						</list>
					</t>
					
					<t hangText="draft-00">
						<list style="symbols">
							<t>Initial draft.</t>
						</list>
					</t>
				</list>
			</t>
		</section>
		
		<section title="Open Issues">
			<t>
				<list>
					<t>Should we give a preference to MIME headers over Link headers (or only use one)?</t>
					<t>Should "root" be a MIME parameter?</t>
					<t>Should "format" be renamed to "mediaType" or "contentType" to reflect the usage MIME media types that are allowed?</t>
					<t>How should dates be handled?</t>
				</list>
			</t>
		</section>
	</back>
</rfc>
<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY rfc4627 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4627.xml">
<!ENTITY rfc3986 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3986.xml">
<!ENTITY rfc2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY rfc4287 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4287.xml">
<!ENTITY rfc2616 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2616.xml">
<!ENTITY rfc3339 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3339.xml">
<!ENTITY rfc2045 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2045.xml">
<!ENTITY rfc5226 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5226.xml">
<!ENTITY iddiscovery SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.hammer-discovery.xml">
<!ENTITY uritemplate SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.gregorio-uritemplate.xml">
<!ENTITY linkheader SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.nottingham-http-link-header.xml">
<!ENTITY html401 SYSTEM "http://xml.resource.org/public/rfc/bibxml4/reference.W3C.REC-html401-19991224.xml">
<!ENTITY css21 SYSTEM "http://xml.resource.org/public/rfc/bibxml4/reference.W3C.CR-CSS21-20070719.xml">
]>
<?rfc toc="yes"?>
<?rfc symrefs="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<?rfc strict="no"?>
<?rfc rfcedstyle="yes"?>
<rfc category="info" docName="draft-zyp-json-schema-04" ipr="trust200902">
	<front>
		<title abbrev="JSON Schema Media Type">A JSON Media Type for Describing the Structure and Meaning of JSON Documents</title>
		
		<author fullname="Kris Zyp" initials="K" role="editor" surname="Zyp">
			<organization>SitePen (USA)</organization>
			<address>
				<postal>
					<street>530 Lytton Avenue</street>
					<city>Palo Alto, CA 94301</city>
					<country>USA</country>
				</postal>
				<phone>+1 650 968 8787</phone>
				<email>kris@sitepen.com</email>
			</address>
		</author>
		
		<author fullname="Gary Court" initials="G" surname="Court">
			<address>
				<postal>
					<street></street>
					<city>Calgary, AB</city>
					<country>Canada</country>
				</postal>
				<email>gary.court@gmail.com</email>
			</address>
		</author>
		
		<date year="2011" />
		<workgroup>Internet Engineering Task Force</workgroup>
		<keyword>JSON</keyword>
		<keyword>Schema</keyword>
		<keyword>JavaScript</keyword>
		<keyword>Object</keyword>
		<keyword>Notation</keyword>
		<keyword>Hyper Schema</keyword>
		<keyword>Hypermedia</keyword>
		
		<abstract>
			<t>
				JSON (JavaScript Object Notation) Schema defines the media type "application/schema+json", 
				a JSON based format for defining the structure of JSON data. JSON Schema provides a contract for what JSON 
				data is required for a given application and how to interact with it. JSON 
				Schema is intended to define validation, documentation, hyperlink 
				navigation, and interaction control of JSON data. 
			</t>
		</abstract>
	</front>
	
	<middle>
		<section title="Introduction">
			<t>
				JSON (JavaScript Object Notation) Schema is a JSON media type for defining 
				the structure of JSON data. JSON Schema provides a contract for what JSON 
				data is required for a given application and how to interact with it. JSON 
				Schema is intended to define validation, documentation, hyperlink 
				navigation, and interaction control of JSON data. 
			</t>
		</section>
		
		<section title="Conventions and Terminology">
			<t>
				<!-- The text in this section has been copied from the official boilerplate, 
				and should not be modified.-->
				
				The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", 
				"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
				interpreted as described in <xref target="RFC2119">RFC 2119</xref>.
			</t>
			
			<t>
				The terms "JSON", "JSON text", "JSON value", "member", "element", "object", 
				"array", "number", "string", "boolean", "true", "false", and "null" in this 
				document are to be interpreted as defined in <xref target="RFC4627">RFC 4627</xref>.
			</t>
			
			<t>
				This specification also uses the following defined terms:
			
				<list style="hanging">
					<t hangText="schema">A JSON Schema object.</t>
					<t hangText="instance">Equivalent to "JSON value" as defined in <xref target="RFC4627">RFC 4627</xref>.</t>
					<t hangText="property">Equivalent to "member" as defined in <xref target="RFC4627">RFC 4627</xref>.</t>
					<t hangText="item">Equivalent to "element" as defined in <xref target="RFC4627">RFC 4627</xref>.</t>
					<t hangText="attribute">A property of a JSON Schema object.</t>
				</list>
			</t>
		</section>
		
		<section title="Overview">
			<t>
				JSON Schema defines the media type "application/schema+json" for 
				describing the structure of JSON text. JSON Schemas are also written in JSON and includes facilities 
				for describing the structure of JSON in terms of
				allowable values, descriptions, and interpreting relations with other resources.
			</t>
			<t>
				This document is organized into several separate definitions. The first 
				definition is the core schema specification. This definition is primary 
				concerned with describing a JSON structure and specifying valid elements
				in the structure. The second definition is the Hyper Schema specification
				which is intended to define elements in a structure that can be interpreted as
				hyperlinks.
				Hyper Schema builds on JSON Schema to describe the hyperlink structure of 
				JSON values. This allows user agents to be able to successfully navigate
				documents containing JSON based on their schemas.
			</t>
			<t>
				Cumulatively JSON Schema acts as meta-JSON that can be used to define the 
				required type and constraints on JSON values, as well as define the meaning
				of the JSON values for the purpose of describing a resource and determining
				hyperlinks within the representation. 
			</t>
			<figure>
				<preamble>An example JSON Schema that describes products might look like:</preamble>
				<artwork>
<![CDATA[	
{
	"title": "Product",
	"properties": {
		"id": {
			"title": "Product Identifier",
			"type": "number"
		},
		"name": {
			"title": "Product Name",
			"type": "string"
		},
		"price": {
			"type": "number",
			"minimum": 0
		},
		"tags": {
			"type": "array",
			"items": {
				"type": "string"
			}
		}
	},
	"required" : ["id", "name", "price"],
	"links": [{
		"rel": "full",
		"href": "{id}"
	}, {
		"rel": "comments",
		"href": "comments/?id={id}"
	}]
}
]]>
				</artwork>
				<postamble>
					This schema defines the properties of the instance, 
					the required properties (id, name, and price), as well as an optional
					property (tags). This also defines the link relations of the instance.
				</postamble>
			</figure>
			
			<section title="Design Considerations">
				<t>
					The JSON Schema media type does not attempt to dictate the structure of JSON
					values that contain data, but rather provides a separate format
					for flexibly communicating how a JSON value should be
					interpreted and validated, such that user agents can properly understand
					acceptable structures and extrapolate hyperlink information
					from the JSON. It is acknowledged that JSON values come
					in a variety of structures, and JSON is unique in that the structure
					of stored data structures often prescribes a non-ambiguous definite
					JSON representation. Attempting to force a specific structure is generally
					not viable, and therefore JSON Schema allows for a great flexibility
					in the structure of the JSON data that it describes.
				</t>
				<t>
					This specification is protocol agnostic.
					The underlying protocol (such as HTTP) should sufficiently define the
					semantics of the client-server interface, the retrieval of resource
					representations linked to by JSON representations, and modification of 
					those resources. The goal of this
					format is to sufficiently describe JSON structures such that one can
					utilize existing information available in existing JSON
					representations from a large variety of services that leverage a representational state transfer
					architecture using existing protocols.
				</t>
			</section>
		</section>
		
		<section title="Schema/Instance Association">
			<t>
				JSON values are correlated to their schema by the "describedby"
				relation, where the schema is the target of the relation.
				JSON values MUST be of the "application/json" media type or
				any other subtype. Consequently, dictating how a JSON value should 
				specify the relation to the schema is beyond the normative scope
				of this document since this document specifically defines the JSON
				Schema media type, and no other. It is RECOMMNENDED that JSON values
				specify their schema so that user agents can interpret the instance
				and retain the self-descriptive	characteristics. This avoides the need for out-of-band information about
				instance data. Two approaches are recommended for declaring the
				relation to the schema that describes the meaning of a JSON instance's (or collection 
				of instances) structure. A MIME type parameter named
				"profile" or a relation of "describedby" (which could be specified by a Link header) may be used:
				
				<figure>
					<artwork>
<![CDATA[	
Content-Type: application/my-media-type+json;
              profile=http://example.com/my-hyper-schema
]]>
					</artwork>
				</figure>
				
				or if the content is being transferred by a protocol (such as HTTP) that
				provides headers, a Link header can be used:
				
				<figure>
					<artwork>
<![CDATA[
Link: <http://example.com/my-hyper-schema>; rel="describedby"
]]>
					</artwork>
				</figure>
				
				Instances MAY specify multiple schemas, to indicate all the schemas that 
				are applicable to the data, and the data SHOULD be valid by all the schemas. 
				The instance data MAY have multiple schemas 
				that it is described by (the instance data SHOULD be valid for those schemas). 
				Or if the document is a collection of instances, the collection MAY contain 
				instances from different schemas. The mechanism for referencing a schema is 
				determined by the media type of the instance (if it provides a method for 
				referencing schemas).
			</t>
			
			<section title="Self-Descriptive Schema">
				<t>
					JSON Schemas can themselves be described using JSON Schemas. 
					A self-describing JSON Schema for the core JSON Schema can
					be found at <eref target="http://json-schema.org/schema">http://json-schema.org/schema</eref> for the latest version or 
					<eref target="http://json-schema.org/draft-04/schema">http://json-schema.org/draft-04/schema</eref> for the draft-04 version. The hyper schema 
					self-description can be found at <eref target="http://json-schema.org/hyper-schema">http://json-schema.org/hyper-schema</eref> 
					or <eref target="http://json-schema.org/draft-04/hyper-schema">http://json-schema.org/draft-04/hyper-schema</eref>. All schemas
					used within a protocol with a media type specified SHOULD include a MIME parameter that refers to the self-descriptive
					hyper schema or another schema that extends this hyper schema:
					
					<figure>
						<artwork>
<![CDATA[	
Content-Type: application/json; 
              profile=http://json-schema.org/draft-04/hyper-schema
]]>
						</artwork>
					</figure>
				</t>
			</section>
		</section>
		
		<section title="Core Schema Definition">
			<t>
				A JSON Schema is a JSON object that defines various attributes 
				(including usage and valid values) of a JSON value. JSON
				Schema has recursive capabilities; there are a number of elements
				in the structure that allow for nested JSON Schemas.
			</t>
			
			<figure>
				<preamble>An example JSON Schema could look like:</preamble>
				<artwork>
<![CDATA[
{
	"description": "A person",
	"type": "object",

	"properties": {
		"name": {
			"type": "string"
		},
		"age": {
			"type": "number",
			"divisibleBy": 1,
			"minimum": 0,
			"maximum": 125
		}
	}
}
]]>
				</artwork>
			</figure>
			
			<t>
				A JSON Schema object MAY have any of the following optional properties:
			</t>
			
			<!-- TODO: Break attributes up into type sections -->
			<!-- TODO: Add examples for (almost) every attribute -->
			
			<section title="type" anchor="type">
				<t>
					This attribute defines what the primitive type or the schema of the instance MUST be in order to validate. 
					This attribute can take one of two forms:

					<list style="hanging">
						<t hangText="Simple Types">
							A string indicating a primitive or simple type. The string MUST be one of the following values:

							<list style="hanging">
								<t hangText="object">Instance MUST be an object.</t>
								<t hangText="array">Instance MUST be an array.</t>
								<t hangText="string">Instance MUST be a string.</t>
								<t hangText="number">Instance MUST be a number, including floating point numbers.</t>
								<t hangText="boolean">Instance MUST be the JSON literal "true" or "false".</t>
								<t hangText="null">Instance MUST be the JSON literal "null". Note that without this type, null values are not allowed.</t>
								<t hangText="any">Instance MAY be of any type, including null.</t>
							</list>
						</t>
						
						<t hangText="Union Types">
							An array of one or more simple or schema types.
							The instance value is valid if it is of the same type as one of the simple types, or valid by one of the schemas, in the array. 
						</t>
					</list>
					
					If this attribute is not specified, then all value types are accepted. 
				</t>
				
				<figure>
					<preamble>For example, a schema that defines if an instance can be a string or a number would be:</preamble>
					<artwork>
<![CDATA[
{
	"type": ["string", "number"]
}
]]></artwork>
				</figure>
			</section>
			
			<section title="properties" anchor="properties">
				<t>
					This attribute is an object with properties that specify the schemas for the properties of the instance object.
					In this attribute's object, each property value MUST be a schema. 
					When the instance value is an object, the value of the instance's properties MUST be valid according to the schemas with the same property names specified in this attribute.
					Objects are unordered, so therefore the order of the instance properties or attribute properties MUST NOT determine validation success.
				</t>
			</section>
			
			<section title="patternProperties" anchor="patternProperties">
				<t>
					This attribute is an object that defines the schema for a set of property names of an object instance. 
					The name of each property of this attribute's object is a regular expression pattern in the ECMA 262/Perl 5 format, while the value is a schema. 
					If the pattern matches the name of a property on the instance object, the value of the instance's property MUST be valid against the pattern name's schema value.
				</t>
			</section>
			
			<section title="additionalProperties" anchor="additionalProperties">
				<t>This attribute specifies how any instance property that is not explicitly defined by either the <xref target="properties">"properties"</xref> or <xref target="patternProperties">"patternProperties"</xref> attributes (hereafter referred to as "additional properties") is handled. If specified, the value MUST be a schema or a boolean.</t> 
				<t>If a schema is provided, then all additional properties MUST be valid according to the schema.</t>
				<t>If false is provided, then no additional properties are allowed.</t>
				<t>The default value is an empty schema, which allows any value for additional properties.</t>
			</section>
			
			<section title="items" anchor="items">
				<t>This attribute provides the allowed items in an array instance. If specified, this attribute MUST be a schema or an array of schemas.</t>
				<t>When this attribute value is a schema and the instance value is an array, then all the items in the array MUST be valid according to the schema.</t>
				<t>When this attribute value is an array of schemas and the instance value is an array, each position in the instance array MUST be valid according to the schema in the corresponding position for this array. This called tuple typing. When tuple typing is used, additional items are allowed, disallowed, or constrained by the <xref target="additionalItems">"additionalItems"</xref> attribute the same way as <xref target="additionalProperties">"additionalProperties"</xref> for objects is.</t>
			</section>
			
			<section title="additionalItems" anchor="additionalItems">
				<t>This attribute specifies how any item in the array instance that is not explicitly defined by <xref target="items">"items"</xref> (hereafter referred to as "additional items") is handled. If specified, the value MUST be a schema or a boolean.</t>
				<t>If a schema is provided:
					<list>
						<t>If the <xref target="items">"items"</xref> attribute is unspecified, then all items in the array instance must be valid against this schema.</t>
						<t>If the <xref target="items">"items"</xref> attribute is a schema, then this attribute is ignored.</t>
						<t>If the <xref target="items">"items"</xref> attribute is an array (during tuple typing), then any additional items MUST be valid against this schema.</t>
					</list>
				</t>
				<t>If false is provided, then any additional items in the array are not allowed.</t>
				<t>The default value is an empty schema, which allows any value for additional items.</t>
			</section>
			
			<section title="required" anchor="required">
				<t>This attribute is an array of strings that defines all the property names that must exist on the object instance.</t>
			</section>
			
			<section title="dependencies" anchor="dependencies">
				<t>This attribute is an object that specifies the requirements of a property on an object instance. If an object instance has a property with the same name as a property in this attribute's object, then the instance must be valid against the attribute's property value (hereafter referred to as the "dependency value").</t>
				<t>
					The dependency value can take one of two forms:
					
					<list style="hanging">
						<t hangText="Simple Dependency">
							If the dependency value is a string, then the instance object MUST have a property with the same name as the dependency value.
							If the dependency value is an array of strings, then the instance object MUST have a property with the same name as each string in the dependency value's array.
						</t>
						<t hangText="Schema Dependency">
							If the dependency value is a schema, then the instance object MUST be valid against the schema.
						</t>
					</list>
				</t>
			</section>
			
			<section title="minimum" anchor="minimum">
				<t>This attribute defines the minimum value of the instance property when the type of the instance value is a number.</t>
			</section>
			
			<section title="maximum" anchor="maximum">
				<t>This attribute defines the maximum value of the instance property when the type of the instance value is a number.</t>
			</section>
			
			<section title="exclusiveMinimum" anchor="exclusiveMinimum">
				<t>This attribute indicates if the value of the instance (if the instance is a number) can not equal the number defined by the "minimum" attribute. This is false by default, meaning the instance value can be greater then or equal to the minimum value.</t>
			</section>
			
			<section title="exclusiveMaximum" anchor="exclusiveMaximum">
				<t>This attribute indicates if the value of the instance (if the instance is a number) can not equal the number defined by the "maximum" attribute. This is false by default, meaning the instance value can be less then or equal to the maximum value.</t>
			</section>
			
			<section title="minItems" anchor="minItems">
				<t>This attribute defines the minimum number of values in an array when the array is the instance value.</t>
			</section>
			
			<section title="maxItems" anchor="maxItems">
				<t>This attribute defines the maximum number of values in an array when the array is the instance value.</t>
			</section>
			
			<section title="minProperties" anchor="minProperties">
				<t>This attribute defines the minimum number of properties required on an object instance.</t>
			</section>
			
			<section title="maxProperties" anchor="maxProperties">
				<t>This attribute defines the maximum number of properties the object instance can have.</t>
			</section>
			
			<section title="uniqueItems" anchor="uniqueItems">
				<t>This attribute indicates that all items in an array instance MUST be unique (contains no two identical values).</t>
				<t>
					Two instance are consider equal if they are both of the same type and:
					
					<list>
						<t>are null; or</t>
						<t>are booleans/numbers/strings and have the same value; or</t>
						<t>are arrays, contains the same number of items, and each item in the array is equal to the item at the corresponding index in the other array; or</t>
						<t>are objects, contains the same property names, and each property in the object is equal to the corresponding property in the other object.</t>
					</list>
				</t>
			</section>
			
			<section title="pattern" anchor="pattern">
				<t>When the instance value is a string, this provides a regular expression that a string instance MUST match in order to be valid. Regular expressions SHOULD follow the regular expression specification from ECMA 262/Perl 5</t>
			</section>
			
			<section title="minLength" anchor="minLength">
				<t>When the instance value is a string, this defines the minimum length of the string.</t>
			</section>
			
			<section title="maxLength" anchor="maxLength">
				<t>When the instance value is a string, this defines the maximum length of the string.</t>
			</section>
			
			<section title="enum" anchor="enum">
				<t>This provides an enumeration of all possible values that are valid for the instance property. This MUST be an array, and each item in the array represents a possible value for the instance value. If this attribute is defined, the instance value MUST be one of the values in the array in order for the schema to be valid. Comparison of enum values uses the same algorithm as defined in <xref target="uniqueItems">"uniqueItems"</xref>.</t>
			</section>
			
			<section title="default" anchor="default">
				<t>This attribute defines the default value of the instance when the instance is undefined.</t>
			</section>
			
			<section title="title" anchor="title">
				<t>This attribute is a string that provides a short description of the instance property.</t>
			</section>
			
			<section title="description" anchor="description">
				<t>This attribute is a string that provides a full description of the of purpose the instance property.</t>
			</section>
			
			<section title="divisibleBy" anchor="divisibleBy">
				<t>This attribute defines what value the number instance must be divisible by with no remainder (the result of the division must be an integer.) The value of this attribute SHOULD NOT be 0.</t>
			</section>
			
			<section title="disallow" anchor="disallow">
				<t>This attribute takes the same values as the "type" attribute, however if the instance matches the type or if this value is an array and the instance matches any type or schema in the array, then this instance is not valid.</t>
			</section>
			
			<section title="extends" anchor="extends">
				<t>The value of this property MUST be another schema which will provide a base schema which the current schema will inherit from. The inheritance rules are such that any instance that is valid according to the current schema MUST be valid according to the referenced schema. This MAY also be an array, in which case, the instance MUST be valid for all the schemas in the array. A schema that extends another schema MAY define additional attributes, constrain existing attributes, or add other constraints.</t>
				<t>
					Conceptually, the behavior of extends can be seen as validating an
					instance against all constraints in the extending schema as well as
					the extended schema(s). More optimized implementations that merge
					schemas are possible, but are not required. Some examples of using "extends":
					
					<figure>
						<artwork>
<![CDATA[
{
	"description": "An adult",
	"properties": {
		"age": {
			"minimum": 21
		}
	},
	"extends": {"$ref": "person"}
}
]]>
						</artwork>
					</figure>
					
					<figure>
						<artwork>
<![CDATA[
{
	"description": "Extended schema",
	"properties": {
		"deprecated": {
			"type": "boolean"
		}
	},
	"extends": {"$ref": "http://json-schema.org/draft-04/schema"}
}
]]>
						</artwork>
					</figure>
				</t>
			</section>
			
			<section title="id" anchor="id">
				<t>
					This attribute defines the current URI of this schema (this attribute is
					effectively a "self" link). This URI MAY be relative or absolute. If
					the URI is relative it is resolved against the current URI of the parent
					schema it is contained in. If this schema is not contained in any
					parent schema, the current URI of the parent schema is held to be the
					URI under which this schema was addressed. If id is missing, the current URI of a schema is
					defined to be that of the parent schema. The current URI of the schema
					is also used to construct relative references such as for $ref.
				</t>
			</section>
			
			<section title="$ref" anchor="ref">
				<t>
					This attribute defines a URI of a schema that contains the full representation of this schema. 
					When a validator encounters this attribute, it SHOULD replace the current schema with the schema referenced by the value's URI (if known and available) and re-validate the instance. 
					This URI MAY be relative or absolute, and relative URIs SHOULD be resolved against the URI of the current schema.
				</t>
			</section>
			
			<section title="$schema" anchor="schema">
				<t>
					This attribute defines a URI of a JSON Schema that is the schema of the current schema. 
					When this attribute is defined, a validator SHOULD use the schema referenced by the value's URI (if known and available) when resolving <xref target="hyper-schema">Hyper Schema</xref><xref target="links">links</xref>.
				</t>
				
				<t>
					A validator MAY use this attribute's value to determine which version of JSON Schema the current schema is written in, and provide the appropriate validation features and behavior. 
					Therefore, it is RECOMMENDED that all schema authors include this attribute in their schemas to prevent conflicts with future JSON Schema specification changes.
				</t>
			</section>
		</section>
		
		<section title="Hyper Schema" anchor="hyper-schema">
			<t>
				The following attributes are specified in addition to those
				attributes that already provided by the core schema with the specific
				purpose of informing user agents of relations between resources based
				on JSON data. Just as with JSON
				schema attributes, all the attributes in hyper schemas are optional.
				Therefore, an empty object is a valid (non-informative) schema, and
				essentially describes plain JSON (no constraints on the structures).
				Addition of attributes provides additive information for user agents.
			</t>
			
			<section title="links" anchor="links">
				<t>
					The value of the links property MUST be an array, where each item 
					in the array is a link description object which describes the link
					relations of the instances.
				</t>
				
				<!-- TODO: Needs more clarification and examples -->
				
				<section title="Link Description Object">
					<t>
						A link description object is used to describe link relations. In 
						the context of a schema, it defines the link relations of the 
						instances of the schema, and can be parameterized by the instance
						values. The link description format can be used without JSON Schema, 
						and use of this format can
						be declared by referencing the normative link description
						schema as the the schema for the data structure that uses the 
						links. The URI of the normative link description schema is: 
						<eref target="http://json-schema.org/links">http://json-schema.org/links</eref> (latest version) or
						<eref target="http://json-schema.org/draft-04/links">http://json-schema.org/draft-04/links</eref> (draft-04 version).
					</t>
					
					<section title="href" anchor="href">
						<t>
							The value of the "href" link description property
							indicates the target URI of the related resource. The value
							of the instance property SHOULD be resolved as a URI-Reference per <xref target="RFC3986">RFC 3986</xref>
							and MAY be a relative URI. The base URI to be used for relative resolution
							SHOULD be the URI used to retrieve the instance object (not the schema)
							when used within a schema. Also, when links are used within a schema, the URI 
							SHOULD be parametrized by the property values of the instance 
							object, if property values exist for the corresponding variables
							in the template (otherwise they MAY be provided from alternate sources, like user input).
						</t>
						
						<t>
							Instance property values SHOULD be substituted into the URIs where
							matching braces ('{', '}') are found surrounding zero or more characters,
							creating an expanded URI. Instance property value substitutions are resolved
							by using the text between the braces to denote the property name
							from the instance to get the value to substitute. 
							
							<figure>
								<preamble>For example, if an href value is defined:</preamble>
								<artwork>
<![CDATA[
http://somesite.com/{id}
]]>
								</artwork>
								<postamble>Then it would be resolved by replace the value of the "id" property value from the instance object.</postamble>
							</figure>
							
							<figure>
								<preamble>If the value of the "id" property was "45", the expanded URI would be:</preamble>
								<artwork>
<![CDATA[
http://somesite.com/45
]]>
								</artwork>
							</figure>
							
							If matching braces are found with the string "@" (no quotes) between the braces, then the 
							actual instance value SHOULD be used to replace the braces, rather than a property value.
							This should only be used in situations where the instance is a scalar (string, 
							boolean, or number), and not for objects or arrays.
						</t>
					</section>
					
					<section title="rel">
						<t>
							The value of the "rel" property indicates the name of the 
							relation to the target resource. The relation to the target SHOULD be interpreted as specifically from the instance object that the schema (or sub-schema) applies to, not just the top level resource that contains the object within its hierarchy. If a resource JSON representation contains a sub object with a property interpreted as a link, that sub-object holds the relation with the target. A relation to target from the top level resource MUST be indicated with the schema describing the top level JSON representation.
						</t>
						
						<t>
							Relationship definitions SHOULD NOT be media type dependent, and users are encouraged to utilize existing accepted relation definitions, including those in existing relation registries (see <xref target="RFC4287">RFC 4287</xref>). However, we define these relations here for clarity of normative interpretation within the context of JSON hyper schema defined relations:
							
							<list style="hanging">
								<t hangText="self">
									If the relation value is "self", when this property is encountered in
									the instance object, the object represents a resource and the instance object is
									treated as a full representation of the target resource identified by
									the specified URI.
								</t>
								
								<t hangText="full">
									This indicates that the target of the link is the full representation for the instance object. The object that contains this link possibly may not be the full representation.
								</t>
								
								<t hangText="describedby">
									This indicates the target of the link is the schema for the instance object. This MAY be used to specifically denote the schemas of objects within a JSON object hierarchy, facilitating polymorphic type data structures.
								</t>
								
								<t hangText="root">
									This relation indicates that the target of the link
									SHOULD be treated as the root or the body of the representation for the
									purposes of user agent interaction or fragment resolution. All other
									properties of the instance objects can be regarded as meta-data
									descriptions for the data.
								</t>
							</list>
						</t>
						
						<t>
							The following relations are applicable for schemas (the schema as the "from" resource in the relation):

							<list style="hanging">
								<t hangText="instances">This indicates the target resource that represents collection of instances of a schema.</t>
								<t hangText="create">This indicates a target to use for creating new instances of a schema. This link definition SHOULD be a submission link with a non-safe method (like POST).</t>
							</list>
						</t>
						
						<t>
							<figure>
								<preamble>For example, if a schema is defined:</preamble>
								<artwork>
<![CDATA[
{
	"links": [{
		"rel": "self",
		"href": "{id}"
	}, {
		"rel": "up",
		"href": "{upId}"
	}, {
		"rel": "children",
		"href": "?upId={id}"
	}]
}
]]>
								</artwork>
							</figure>
							
							<figure>
								<preamble>And if a collection of instance resource's JSON representation was retrieved:</preamble>
								<artwork>
<![CDATA[
GET /Resource/

[{
	"id": "thing",
	"upId": "parent"
}, {
	"id": "thing2",
	"upId": "parent"
}]
]]>
								</artwork>
							</figure>

							This would indicate that for the first item in the collection, its own
							(self) URI would resolve to "/Resource/thing" and the first item's "up"
							relation SHOULD be resolved to the resource at "/Resource/parent".
							The "children" collection would be located at "/Resource/?upId=thing".
						</t>
					</section>
					
					<section title="template">
						<t>This property value is a string that defines the templating language used in the <xref target="href">"href"</xref> attribute. If no templating language is defined, then the default <xref target="href">Link Description Object templating langauge</xref> is used.</t>
					</section>
					
					<section title="targetSchema">
						<t>This property value is a schema that defines the expected structure of the JSON representation of the target of the link.</t>
					</section>
					
					<section title="Submission Link Properties">
						<t>
							The following properties also apply to link definition objects, and 
							provide functionality analogous to HTML forms, in providing a 
							means for submitting extra (often user supplied) information to send to a server.
						</t>
						
						<section title="method">
							<t>
								This attribute defines which method can be used to access the target resource. 
								In an HTTP environment, this would be "GET" or "POST" (other HTTP methods 
								such as "PUT" and "DELETE" have semantics that are clearly implied by 
								accessed resources, and do not need to be defined here). 
								This defaults to "GET".
							</t>
						</section>
						
						<section title="enctype">
							<t>
								If present, this property indicates a query media type format that the server
								supports for querying or posting to the collection of instances at the target 
								resource. The query can be 
								suffixed to the target URI to query the collection with
								property-based constraints on the resources that SHOULD be returned from
								the server or used to post data to the resource (depending on the method).
								
								<figure>
									<preamble>For example, with the following schema:</preamble>
									<artwork>
<![CDATA[
{
	"links": [{
		"enctype": "application/x-www-form-urlencoded",
		"method": "GET",
		"href": "/Product/",
		"properties": {
			"name": {
				"description": "name of the product"
			}
		}
	}]
}
]]>
									</artwork>
									<postamble>This indicates that the client can query the server for instances that have a specific name.</postamble>
								</figure>
								
								<figure>
									<preamble>For example:</preamble>
									<artwork>
<![CDATA[
/Product/?name=Slinky
]]>
									</artwork>
								</figure>

								If no enctype or method is specified, only the single URI specified by 
								the href property is defined. If the method is POST, "application/json" is 
								the default media type.
							</t>
						</section>
						
						<section title="schema">
							<t>
								This attribute contains a schema which defines the acceptable structure of the submitted
								request (for a GET request, this schema would define the properties for the query string 
								and for a POST request, this would define the body).
							</t>
						</section>
					</section>
				</section>
			</section>
			
			<section title="fragmentResolution">
				<t>
					This property indicates the fragment resolution protocol to use for
					resolving fragment identifiers in URIs within the instance
					representations. This applies to the instance object URIs and all
					children of the instance object's URIs. The default fragment resolution
					protocol is "json-pointer", which is defined below. Other fragment
					resolution protocols MAY be used, but are not defined in this document.
				</t>
				
				<t>
					The fragment identifier is based on <xref target="RFC3986">RFC 3986, Sec 5</xref>, and defines the
					mechanism for resolving references to entities within a document.
				</t>
				
				<section title="json-pointer fragment resolution">
					<t>The "json-pointer" fragment resolution protocol uses a <xref target="json-pointer">JSON Pointer</xref> to resolve fragment identifiers in URIs within instance representations.</t>
				</section>
			</section>
			
			<!-- TODO: Remove this? -->
			
			<section title="readonly">
				<t>This attribute indicates that the instance value SHOULD NOT be changed. Attempts by a user agent to modify the value of this property are expected to be rejected by a server.</t>
			</section>
			
			<section title="contentEncoding">
				<t>If the instance property value is a string, this attribute defines that the string SHOULD be interpreted as binary data and decoded using the encoding named by this schema property. <xref target="RFC2045">RFC 2045, Sec 6.1</xref> lists the possible values for this property.</t>
			</section>
			
			<section title="pathStart">
				<t>
					This attribute is a URI that defines what the instance's URI MUST start with in order to validate. 
					The value of the "pathStart" attribute MUST be resolved as per <xref target="RFC3986">RFC 3986, Sec 5</xref>, 
					and is relative to the instance's URI.
				</t>
				
				<t>
					When multiple schemas have been referenced for an instance, the user agent 
					can determine if this schema is applicable for a particular instance by 
					determining if the URI of the instance begins with the the value of the "pathStart"
					attribute. If the URI of the instance does not start with this URI, 
					or if another schema specifies a starting URI that is longer and also matches the 
					instance, this schema SHOULD NOT be applied to the instance. Any schema 
					that does not have a pathStart attribute SHOULD be considered applicable 
					to all the instances for which it is referenced.
				</t>
			</section>
			
			<section title="mediaType">
				<t>This attribute defines the media type of the instance representations that this schema is defining.</t>
			</section>
		</section>
		
		<section title="Security Considerations">
			<t>
				This specification is a sub-type of the JSON format, and 
				consequently the security considerations are generally the same as <xref target="RFC4627">RFC 4627</xref>. 
				However, an additional issue is that when link relation of "self"
				is used to denote a full representation of an object, the user agent 
				SHOULD NOT consider the representation to be the authoritative representation
				of the resource denoted by the target URI if the target URI is not
				equivalent to or a sub-path of the the URI used to request the resource 
				representation which contains the target URI with the "self" link.
				
				<figure>
					<preamble>For example, if a hyper schema was defined:</preamble>
					<artwork>
<![CDATA[
{
	"links": [{
		"rel": "self",
		"href": "{id}"
	}]
}
]]>
					</artwork>
				</figure>
				
				<figure>
					<preamble>And a resource was requested from somesite.com:</preamble>
					<artwork>
<![CDATA[
GET /foo/
]]>
					</artwork>
				</figure>

				<figure>
					<preamble>With a response of:</preamble>
					<artwork>
<![CDATA[
Content-Type: application/json; profile=/schema-for-this-data

[{
	"id": "bar",
	"name": "This representation can be safely treated \
		as authoritative "
}, {
	"id": "/baz",
	"name": "This representation should not be treated as \
		authoritative the user agent should make request the resource\
		from '/baz' to ensure it has the authoritative representation"
}, {
	"id": "http://othersite.com/something",
	"name": "This representation\
		should also not be treated as authoritative and the target\
		resource representation should be retrieved for the\
		authoritative representation"
}]
]]>
					</artwork>
				</figure>
			</t>
		</section>
		
		<section title="IANA Considerations">
			<t>The proposed MIME media type for JSON Schema is "application/schema+json".</t>
			<t>Type name: application</t>
			<t>Subtype name: schema+json</t>
			<t>Required parameters: profile</t>
			<t>
				The value of the profile parameter SHOULD be a URI (relative or absolute) that 
				refers to the schema used to define the structure of this structure (the 
				meta-schema). Normally the value would be http://json-schema.org/draft-04/hyper-schema,
				but it is allowable to use other schemas that extend the hyper schema's meta-
				schema.
			</t>
			<t>Optional parameters: pretty</t>
			<t>The value of the pretty parameter MAY be true or false to indicate if additional whitespace has been included to make the JSON representation easier to read.</t>
			
			<section title="Registry of Link Relations">
				<t>
					This registry is maintained by IANA per <xref target="RFC4287">RFC 4287</xref> and this specification adds
					four values: "full", "create", "instances", "root".  New
					assignments are subject to IESG Approval, as outlined in <xref target="RFC5226">RFC 5226</xref>.
					Requests should be made by email to IANA, which will then forward the
					request to the IESG, requesting approval.
				</t>
			</section>
		</section>
	</middle>
	
	<back>
		<!-- References Section -->
		<references title="Normative References">
			&rfc2045;
			&rfc2119;
			&rfc3339;
			&rfc3986;
			&rfc4287;
			<reference anchor="json-pointer" target="http://tools.ietf.org/html/draft-pbryan-zyp-json-pointer-02">
				<front>
					<title>JSON Pointer</title>
					<author initials="P." surname="Bryan">
						<organization>ForgeRock US, Inc.</organization>
					</author>
					<author initials="K." surname="Zyp">
						<organization>SitePen (USA)</organization>
					</author>
					<date year="2011" month="October" />
				</front>
			</reference>
		</references>
		<references title="Informative References">
			&rfc2616;
			&rfc4627;
			&rfc5226;
			&iddiscovery;
			&uritemplate;
			&linkheader;
			&html401;
			&css21;
		</references>

		<section title="Change Log">
			<t>
				<list style="hanging">
					<t hangText="draft-04">
						<list style="symbols">
							<t>Changed "required" attribute to an array of strings.</t>
							<t>Removed "format" attribute.</t>
							<t>Added "minProperties" and "maxProperties" attributes.</t>
							<t>Replaced "slash-delimited" fragment resolution with "json-pointer".</t>
							<t>Added "template" LDO attribute.</t>
							<t>Removed irrelevant "Open Issues" section.</t>
							<t>Merged Conventions and Terminology sections.</t>
							<t>Defined terms used in specification.</t>
							<t>Removed "integer" type in favor of {"type":"number", "divisibleBy":1}.</t>
							<t>Restricted "type" to only the core JSON types.</t>
							<t>Improved wording of many sections.</t>
						</list>
					</t>
				
					<t hangText="draft-03">
						<list style="symbols">
							<t>Added example and verbiage to "extends" attribute.</t>
							<t>Defined slash-delimited to use a leading slash.</t>
							<t>Made "root" a relation instead of an attribute.</t>
							<t>Removed address values, and MIME media type from format to reduce confusion (mediaType already exists, so it can be used for MIME types).</t>
							<t>Added more explanation of nullability.</t>
							<t>Removed "alternate" attribute.</t>
							<t>Upper cased many normative usages of must, may, and should.</t>
							<t>Replaced the link submission "properties" attribute to "schema" attribute.</t>
							<t>Replaced "optional" attribute with "required" attribute.</t>
							<t>Replaced "maximumCanEqual" attribute with "exclusiveMaximum" attribute.</t>
							<t>Replaced "minimumCanEqual" attribute with "exclusiveMinimum" attribute.</t>
							<t>Replaced "requires" attribute with "dependencies" attribute.</t>
							<t>Moved "contentEncoding" attribute to hyper schema.</t>
							<t>Added "additionalItems" attribute.</t>
							<t>Added "id" attribute.</t>
							<t>Switched self-referencing variable substitution from "-this" to "@" to align with reserved characters in URI template.</t>
							<t>Added "patternProperties" attribute.</t>
							<t>Schema URIs are now namespace versioned.</t>
							<t>Added "$ref" and "$schema" attributes.</t>
						</list>
					</t>
					
					<t hangText="draft-02">
						<list style="symbols">
							<t>Replaced "maxDecimal" attribute with "divisibleBy" attribute.</t>
							<t>Added slash-delimited fragment resolution protocol and made it the default.</t>
							<t>Added language about using links outside of schemas by referencing its normative URI.</t>
							<t>Added "uniqueItems" attribute.</t>
							<t>Added "targetSchema" attribute to link description object.</t>
						</list>
					</t>
					
					<t hangText="draft-01">
						<list style="symbols">
							<t>Fixed category and updates from template.</t>
						</list>
					</t>
					
					<t hangText="draft-00">
						<list style="symbols">
							<t>Initial draft.</t>
						</list>
					</t>
				</list>
			</t>
		</section>
	</back>
</rfc>
{
  "author": {
    "name": "Kris Zyp"
  },
  "deprecated": false,
  "description": "JSON Schema validation and specifications",
  "devDependencies": {
    "vows": "*"
  },
  "directories": {
    "lib": "./lib"
  },
  "homepage": "https://github.com/kriszyp/json-schema#readme",
  "licenses": [
    {
      "type": "AFLv2.1",
      "url": "http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE#L43"
    },
    {
      "type": "BSD",
      "url": "http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE#L13"
    }
  ],
  "main": "./lib/validate.js",
  "maintainers": [
    {
      "name": "Kris Zyp",
      "email": "kriszyp@gmail.com"
    }
  ],
  "name": "json-schema",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/kriszyp/json-schema.git"
  },
  "version": "0.2.3"
}/** 
 * JSON Schema link handler
 * Copyright (c) 2007 Kris Zyp SitePen (www.sitepen.com)
 * Licensed under the MIT (MIT-LICENSE.txt) license.
 */
(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define([], function () {
            return factory();
        });
    } else if (typeof module === 'object' && module.exports) {
        // Node. Does not work with strict CommonJS, but
        // only CommonJS-like environments that support module.exports,
        // like Node.
        module.exports = factory();
    } else {
        // Browser globals
        root.jsonSchemaLinks = factory();
    }
}(this, function () {// setup primitive classes to be JSON Schema types
var exports = {};
exports.cacheLinks = true;
exports.getLink = function(relation, instance, schema){
	// gets the URI of the link for the given relation based on the instance and schema
	// for example:
	// getLink(
	// 		"brother", 
	// 		{"brother_id":33}, 
	// 		{links:[{rel:"brother", href:"Brother/{brother_id}"}]}) ->
	//	"Brother/33"
	var links = schema.__linkTemplates; 
	if(!links){
		links = {};
		var schemaLinks = schema.links;
		if(schemaLinks && schemaLinks instanceof Array){
			schemaLinks.forEach(function(link){
	/*			// TODO: allow for multiple same-name relations
				if(links[link.rel]){
					if(!(links[link.rel] instanceof Array)){
						links[link.rel] = [links[link.rel]];
					}
				}*/
				links[link.rel] = link.href;
			});
		}
		if(exports.cacheLinks){
			schema.__linkTemplates = links;
		}
	}
	var linkTemplate = links[relation];
	return linkTemplate && exports.substitute(linkTemplate, instance);
};

exports.substitute = function(linkTemplate, instance){
	return linkTemplate.replace(/\{([^\}]*)\}/g, function(t, property){
			var value = instance[decodeURIComponent(property)];
			if(value instanceof Array){
				// the value is an array, it should produce a URI like /Table/(4,5,8) and store.get() should handle that as an array of values
				return '(' + value.join(',') + ')';
			}
			return value;
		});
};
return exports;
}));/**
 * JSONSchema Validator - Validates JavaScript objects using JSON Schemas
 *	(http://www.json.com/json-schema-proposal/)
 *
 * Copyright (c) 2007 Kris Zyp SitePen (www.sitepen.com)
 * Licensed under the MIT (MIT-LICENSE.txt) license.
To use the validator call the validate function with an instance object and an optional schema object.
If a schema is provided, it will be used to validate. If the instance object refers to a schema (self-validating),
that schema will be used to validate and the schema parameter is not necessary (if both exist,
both validations will occur).
The validate method will return an array of validation errors. If there are no errors, then an
empty list will be returned. A validation error will have two properties:
"property" which indicates which property had the error
"message" which indicates what the error was
 */
(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define([], function () {
            return factory();
        });
    } else if (typeof module === 'object' && module.exports) {
        // Node. Does not work with strict CommonJS, but
        // only CommonJS-like environments that support module.exports,
        // like Node.
        module.exports = factory();
    } else {
        // Browser globals
        root.jsonSchema = factory();
    }
}(this, function () {// setup primitive classes to be JSON Schema types
var exports = validate
exports.Integer = {type:"integer"};
var primitiveConstructors = {
	String: String,
	Boolean: Boolean,
	Number: Number,
	Object: Object,
	Array: Array,
	Date: Date
}
exports.validate = validate;
function validate(/*Any*/instance,/*Object*/schema) {
		// Summary:
		//  	To use the validator call JSONSchema.validate with an instance object and an optional schema object.
		// 		If a schema is provided, it will be used to validate. If the instance object refers to a schema (self-validating),
		// 		that schema will be used to validate and the schema parameter is not necessary (if both exist,
		// 		both validations will occur).
		// 		The validate method will return an object with two properties:
		// 			valid: A boolean indicating if the instance is valid by the schema
		// 			errors: An array of validation errors. If there are no errors, then an
		// 					empty list will be returned. A validation error will have two properties:
		// 						property: which indicates which property had the error
		// 						message: which indicates what the error was
		//
		return validate(instance, schema, {changing: false});//, coerce: false, existingOnly: false});
	};
exports.checkPropertyChange = function(/*Any*/value,/*Object*/schema, /*String*/property) {
		// Summary:
		// 		The checkPropertyChange method will check to see if an value can legally be in property with the given schema
		// 		This is slightly different than the validate method in that it will fail if the schema is readonly and it will
		// 		not check for self-validation, it is assumed that the passed in value is already internally valid.
		// 		The checkPropertyChange method will return the same object type as validate, see JSONSchema.validate for
		// 		information.
		//
		return validate(value, schema, {changing: property || "property"});
	};
var validate = exports._validate = function(/*Any*/instance,/*Object*/schema,/*Object*/options) {

	if (!options) options = {};
	var _changing = options.changing;

	function getType(schema){
		return schema.type || (primitiveConstructors[schema.name] == schema && schema.name.toLowerCase());
	}
	var errors = [];
	// validate a value against a property definition
	function checkProp(value, schema, path,i){

		var l;
		path += path ? typeof i == 'number' ? '[' + i + ']' : typeof i == 'undefined' ? '' : '.' + i : i;
		function addError(message){
			errors.push({property:path,message:message});
		}

		if((typeof schema != 'object' || schema instanceof Array) && (path || typeof schema != 'function') && !(schema && getType(schema))){
			if(typeof schema == 'function'){
				if(!(value instanceof schema)){
					addError("is not an instance of the class/constructor " + schema.name);
				}
			}else if(schema){
				addError("Invalid schema/property definition " + schema);
			}
			return null;
		}
		if(_changing && schema.readonly){
			addError("is a readonly field, it can not be changed");
		}
		if(schema['extends']){ // if it extends another schema, it must pass that schema as well
			checkProp(value,schema['extends'],path,i);
		}
		// validate a value against a type definition
		function checkType(type,value){
			if(type){
				if(typeof type == 'string' && type != 'any' &&
						(type == 'null' ? value !== null : typeof value != type) &&
						!(value instanceof Array && type == 'array') &&
						!(value instanceof Date && type == 'date') &&
						!(type == 'integer' && value%1===0)){
					return [{property:path,message:(typeof value) + " value found, but a " + type + " is required"}];
				}
				if(type instanceof Array){
					var unionErrors=[];
					for(var j = 0; j < type.length; j++){ // a union type
						if(!(unionErrors=checkType(type[j],value)).length){
							break;
						}
					}
					if(unionErrors.length){
						return unionErrors;
					}
				}else if(typeof type == 'object'){
					var priorErrors = errors;
					errors = [];
					checkProp(value,type,path);
					var theseErrors = errors;
					errors = priorErrors;
					return theseErrors;
				}
			}
			return [];
		}
		if(value === undefined){
			if(schema.required){
				addError("is missing and it is required");
			}
		}else{
			errors = errors.concat(checkType(getType(schema),value));
			if(schema.disallow && !checkType(schema.disallow,value).length){
				addError(" disallowed value was matched");
			}
			if(value !== null){
				if(value instanceof Array){
					if(schema.items){
						var itemsIsArray = schema.items instanceof Array;
						var propDef = schema.items;
						for (i = 0, l = value.length; i < l; i += 1) {
							if (itemsIsArray)
								propDef = schema.items[i];
							if (options.coerce)
								value[i] = options.coerce(value[i], propDef);
							errors.concat(checkProp(value[i],propDef,path,i));
						}
					}
					if(schema.minItems && value.length < schema.minItems){
						addError("There must be a minimum of " + schema.minItems + " in the array");
					}
					if(schema.maxItems && value.length > schema.maxItems){
						addError("There must be a maximum of " + schema.maxItems + " in the array");
					}
				}else if(schema.properties || schema.additionalProperties){
					errors.concat(checkObj(value, schema.properties, path, schema.additionalProperties));
				}
				if(schema.pattern && typeof value == 'string' && !value.match(schema.pattern)){
					addError("does not match the regex pattern " + schema.pattern);
				}
				if(schema.maxLength && typeof value == 'string' && value.length > schema.maxLength){
					addError("may only be " + schema.maxLength + " characters long");
				}
				if(schema.minLength && typeof value == 'string' && value.length < schema.minLength){
					addError("must be at least " + schema.minLength + " characters long");
				}
				if(typeof schema.minimum !== undefined && typeof value == typeof schema.minimum &&
						schema.minimum > value){
					addError("must have a minimum value of " + schema.minimum);
				}
				if(typeof schema.maximum !== undefined && typeof value == typeof schema.maximum &&
						schema.maximum < value){
					addError("must have a maximum value of " + schema.maximum);
				}
				if(schema['enum']){
					var enumer = schema['enum'];
					l = enumer.length;
					var found;
					for(var j = 0; j < l; j++){
						if(enumer[j]===value){
							found=1;
							break;
						}
					}
					if(!found){
						addError("does not have a value in the enumeration " + enumer.join(", "));
					}
				}
				if(typeof schema.maxDecimal == 'number' &&
					(value.toString().match(new RegExp("\\.[0-9]{" + (schema.maxDecimal + 1) + ",}")))){
					addError("may only have " + schema.maxDecimal + " digits of decimal places");
				}
			}
		}
		return null;
	}
	// validate an object against a schema
	function checkObj(instance,objTypeDef,path,additionalProp){

		if(typeof objTypeDef =='object'){
			if(typeof instance != 'object' || instance instanceof Array){
				errors.push({property:path,message:"an object is required"});
			}
			
			for(var i in objTypeDef){ 
				if(objTypeDef.hasOwnProperty(i)){
					var value = instance[i];
					// skip _not_ specified properties
					if (value === undefined && options.existingOnly) continue;
					var propDef = objTypeDef[i];
					// set default
					if(value === undefined && propDef["default"]){
						value = instance[i] = propDef["default"];
					}
					if(options.coerce && i in instance){
						value = instance[i] = options.coerce(value, propDef);
					}
					checkProp(value,propDef,path,i);
				}
			}
		}
		for(i in instance){
			if(instance.hasOwnProperty(i) && !(i.charAt(0) == '_' && i.charAt(1) == '_') && objTypeDef && !objTypeDef[i] && additionalProp===false){
				if (options.filter) {
					delete instance[i];
					continue;
				} else {
					errors.push({property:path,message:(typeof value) + "The property " + i +
						" is not defined in the schema and the schema does not allow additional properties"});
				}
			}
			var requires = objTypeDef && objTypeDef[i] && objTypeDef[i].requires;
			if(requires && !(requires in instance)){
				errors.push({property:path,message:"the presence of the property " + i + " requires that " + requires + " also be present"});
			}
			value = instance[i];
			if(additionalProp && (!(objTypeDef && typeof objTypeDef == 'object') || !(i in objTypeDef))){
				if(options.coerce){
					value = instance[i] = options.coerce(value, additionalProp);
				}
				checkProp(value,additionalProp,path,i);
			}
			if(!_changing && value && value.$schema){
				errors = errors.concat(checkProp(value,value.$schema,path,i));
			}
		}
		return errors;
	}
	if(schema){
		checkProp(instance,schema,'',_changing || '');
	}
	if(!_changing && instance && instance.$schema){
		checkProp(instance,instance.$schema,'','');
	}
	return {valid:!errors.length,errors:errors};
};
exports.mustBeValid = function(result){
	//	summary:
	//		This checks to ensure that the result is valid and will throw an appropriate error message if it is not
	// result: the result returned from checkPropertyChange or validate
	if(!result.valid){
		throw new TypeError(result.errors.map(function(error){return "for property " + error.property + ': ' + error.message;}).join(", \n"));
	}
}

return exports;
}));
{
	"$schema" : "http://json-schema.org/draft-04/hyper-schema#",
	"extends" : {"$ref" : "http://json-schema.org/draft-04/schema#"},
	"id" : "http://json-schema.org/draft-04/hyper-schema#",

	"properties" : {
		"links" : {
			"type" : "array",
			"items" : {"$ref" : "http://json-schema.org/draft-04/links#"}
		},

		"fragmentResolution" : {
			"type" : "string",
			"default" : "json-pointer"
		},

		"root" : {
			"type" : "boolean",
			"default" : false
		},

		"readonly" : {
			"type" : "boolean",
			"default" : false
		},

		"contentEncoding" : {
			"type" : "string"
		},

		"pathStart" : {
			"type" : "string",
			"format" : "uri"
		},

		"mediaType" : {
			"type" : "string",
			"format" : "media-type"
		}
	},

	"links" : [
		{
			"href" : "{id}",
			"rel" : "self"
		},

		{
			"href" : "{$ref}",
			"rel" : "full"
		},

		{
			"href" : "{$schema}",
			"rel" : "describedby"
		}
	],

	"fragmentResolution" : "json-pointer"
}
{
	"$schema" : "http://json-schema.org/draft-04/hyper-schema#",
	"id" : "http://json-schema.org/draft-04/links#",
	"type" : "object",
	
	"properties" : {
		"rel" : {
			"type" : "string"
		},

		"href" : {
			"type" : "string"
		},

		"template" : {
			"type" : "string"
		},
		
		"targetSchema" : {"$ref" : "http://json-schema.org/draft-04/hyper-schema#"},
		
		"method" : {
			"type" : "string",
			"default" : "GET"
		},
		
		"enctype" : {
			"type" : "string"
		},
		
		"properties" : {
			"type" : "object",
			"additionalProperties" : {"$ref" : "http://json-schema.org/draft-04/hyper-schema#"}
		}
	},
	
	"required" : ["rel", "href"],
	
	"dependencies" : {
		"enctype" : "method"
	}
}{
	"$schema" : "http://json-schema.org/draft-04/schema#",
	"id" : "http://json-schema.org/draft-04/schema#",
	"type" : "object",
	
	"properties" : {
		"type" : {
			"type" : [
				{
					"id" : "#simple-type",
					"type" : "string",
					"enum" : ["object", "array", "string", "number", "boolean", "null", "any"]
				}, 
				"array"
			],
			"items" : {
				"type" : [
					{"$ref" : "#simple-type"}, 
					{"$ref" : "#"}
				]
			},
			"uniqueItems" : true,
			"default" : "any"
		},
		
		"disallow" : {
			"type" : ["string", "array"],
			"items" : {
				"type" : ["string", {"$ref" : "#"}]
			},
			"uniqueItems" : true
		},
		
		"extends" : {
			"type" : [{"$ref" : "#"}, "array"],
			"items" : {"$ref" : "#"},
			"default" : {}
		},

		"enum" : {
			"type" : "array",
			"minItems" : 1,
			"uniqueItems" : true
		},
	
		"minimum" : {
			"type" : "number"
		},
		
		"maximum" : {
			"type" : "number"
		},
		
		"exclusiveMinimum" : {
			"type" : "boolean",
			"default" : false
		},
		
		"exclusiveMaximum" : {
			"type" : "boolean",
			"default" : false
		},
		
		"divisibleBy" : {
			"type" : "number",
			"minimum" : 0,
			"exclusiveMinimum" : true,
			"default" : 1
		},
		
		"minLength" : {
			"type" : "integer",
			"minimum" : 0,
			"default" : 0
		},
		
		"maxLength" : {
			"type" : "integer"
		},
		
		"pattern" : {
			"type" : "string"
		},
		
		"items" : {
			"type" : [{"$ref" : "#"}, "array"],
			"items" : {"$ref" : "#"},
			"default" : {}
		},
		
		"additionalItems" : {
			"type" : [{"$ref" : "#"}, "boolean"],
			"default" : {}
		},
		
		"minItems" : {
			"type" : "integer",
			"minimum" : 0,
			"default" : 0
		},
		
		"maxItems" : {
			"type" : "integer",
			"minimum" : 0
		},
		
		"uniqueItems" : {
			"type" : "boolean",
			"default" : false
		},
		
		"properties" : {
			"type" : "object",
			"additionalProperties" : {"$ref" : "#"},
			"default" : {}
		},
		
		"patternProperties" : {
			"type" : "object",
			"additionalProperties" : {"$ref" : "#"},
			"default" : {}
		},
		
		"additionalProperties" : {
			"type" : [{"$ref" : "#"}, "boolean"],
			"default" : {}
		},
		
		"minProperties" : {
			"type" : "integer",
			"minimum" : 0,
			"default" : 0
		},
		
		"maxProperties" : {
			"type" : "integer",
			"minimum" : 0
		},
		
		"required" : {
			"type" : "array",
			"items" : {
				"type" : "string"
			}
		},
		
		"dependencies" : {
			"type" : "object",
			"additionalProperties" : {
				"type" : ["string", "array", {"$ref" : "#"}],
				"items" : {
					"type" : "string"
				}
			},
			"default" : {}
		},
		
		"id" : {
			"type" : "string"
		},
		
		"$ref" : {
			"type" : "string"
		},
		
		"$schema" : {
			"type" : "string"
		},
		
		"title" : {
			"type" : "string"
		},
		
		"description" : {
			"type" : "string"
		},
		
		"default" : {
			"type" : "any"
		}
	},
	
	"dependencies" : {
		"exclusiveMinimum" : "minimum",
		"exclusiveMaximum" : "maximum"
	},
	
	"default" : {}
}{
	"$schema" : "http://json-schema.org/draft-03/hyper-schema#",
	"extends" : {"$ref" : "http://json-schema.org/draft-03/schema#"},
	"id" : "http://json-schema.org/draft-03/hyper-schema#",

	"properties" : {
		"links" : {
			"type" : "array",
			"items" : {"$ref" : "http://json-schema.org/draft-03/links#"}
		},

		"fragmentResolution" : {
			"type" : "string",
			"default" : "slash-delimited"
		},

		"root" : {
			"type" : "boolean",
			"default" : false
		},

		"readonly" : {
			"type" : "boolean",
			"default" : false
		},

		"contentEncoding" : {
			"type" : "string"
		},

		"pathStart" : {
			"type" : "string",
			"format" : "uri"
		},

		"mediaType" : {
			"type" : "string",
			"format" : "media-type"
		}
	},

	"links" : [
		{
			"href" : "{id}",
			"rel" : "self"
		},

		{
			"href" : "{$ref}",
			"rel" : "full"
		},

		{
			"href" : "{$schema}",
			"rel" : "describedby"
		}
	],

	"fragmentResolution" : "slash-delimited"
}
{
	"$schema" : "http://json-schema.org/draft-03/hyper-schema#",
	"id" : "http://json-schema.org/draft-03/json-ref#",
	
	"additionalItems" : {"$ref" : "#"},
	"additionalProperties" : {"$ref" : "#"},
	
	"links" : [
		{
			"href" : "{id}",
			"rel" : "self"
		},
		
		{
			"href" : "{$ref}",
			"rel" : "full"
		},
		
		{
			"href" : "{$schema}",
			"rel" : "describedby"
		}
	],
	
	"fragmentResolution" : "dot-delimited"
}{
	"$schema" : "http://json-schema.org/draft-03/hyper-schema#",
	"id" : "http://json-schema.org/draft-03/links#",
	"type" : "object",
	
	"properties" : {
		"href" : {
			"type" : "string",
			"required" : true,
			"format" : "link-description-object-template"
		},
		
		"rel" : {
			"type" : "string",
			"required" : true
		},
		
		"targetSchema" : {"$ref" : "http://json-schema.org/draft-03/hyper-schema#"},
		
		"method" : {
			"type" : "string",
			"default" : "GET"
		},
		
		"enctype" : {
			"type" : "string",
			"requires" : "method"
		},
		
		"properties" : {
			"type" : "object",
			"additionalProperties" : {"$ref" : "http://json-schema.org/draft-03/hyper-schema#"}
		}
	}
}{
	"$schema" : "http://json-schema.org/draft-03/schema#",
	"id" : "http://json-schema.org/draft-03/schema#",
	"type" : "object",
	
	"properties" : {
		"type" : {
			"type" : ["string", "array"],
			"items" : {
				"type" : ["string", {"$ref" : "#"}]
			},
			"uniqueItems" : true,
			"default" : "any"
		},
		
		"properties" : {
			"type" : "object",
			"additionalProperties" : {"$ref" : "#"},
			"default" : {}
		},
		
		"patternProperties" : {
			"type" : "object",
			"additionalProperties" : {"$ref" : "#"},
			"default" : {}
		},
		
		"additionalProperties" : {
			"type" : [{"$ref" : "#"}, "boolean"],
			"default" : {}
		},
		
		"items" : {
			"type" : [{"$ref" : "#"}, "array"],
			"items" : {"$ref" : "#"},
			"default" : {}
		},
		
		"additionalItems" : {
			"type" : [{"$ref" : "#"}, "boolean"],
			"default" : {}
		},
		
		"required" : {
			"type" : "boolean",
			"default" : false
		},
		
		"dependencies" : {
			"type" : "object",
			"additionalProperties" : {
				"type" : ["string", "array", {"$ref" : "#"}],
				"items" : {
					"type" : "string"
				}
			},
			"default" : {}
		},
		
		"minimum" : {
			"type" : "number"
		},
		
		"maximum" : {
			"type" : "number"
		},
		
		"exclusiveMinimum" : {
			"type" : "boolean",
			"default" : false
		},
		
		"exclusiveMaximum" : {
			"type" : "boolean",
			"default" : false
		},
		
		"minItems" : {
			"type" : "integer",
			"minimum" : 0,
			"default" : 0
		},
		
		"maxItems" : {
			"type" : "integer",
			"minimum" : 0
		},
		
		"uniqueItems" : {
			"type" : "boolean",
			"default" : false
		},
		
		"pattern" : {
			"type" : "string",
			"format" : "regex"
		},
		
		"minLength" : {
			"type" : "integer",
			"minimum" : 0,
			"default" : 0
		},
		
		"maxLength" : {
			"type" : "integer"
		},
		
		"enum" : {
			"type" : "array",
			"minItems" : 1,
			"uniqueItems" : true
		},
		
		"default" : {
			"type" : "any"
		},
		
		"title" : {
			"type" : "string"
		},
		
		"description" : {
			"type" : "string"
		},
		
		"format" : {
			"type" : "string"
		},
		
		"divisibleBy" : {
			"type" : "number",
			"minimum" : 0,
			"exclusiveMinimum" : true,
			"default" : 1
		},
		
		"disallow" : {
			"type" : ["string", "array"],
			"items" : {
				"type" : ["string", {"$ref" : "#"}]
			},
			"uniqueItems" : true
		},
		
		"extends" : {
			"type" : [{"$ref" : "#"}, "array"],
			"items" : {"$ref" : "#"},
			"default" : {}
		},
		
		"id" : {
			"type" : "string",
			"format" : "uri"
		},
		
		"$ref" : {
			"type" : "string",
			"format" : "uri"
		},
		
		"$schema" : {
			"type" : "string",
			"format" : "uri"
		}
	},
	
	"dependencies" : {
		"exclusiveMinimum" : "minimum",
		"exclusiveMaximum" : "maximum"
	},
	
	"default" : {}
}{
	"description" : "An Address following the convention of http://microformats.org/wiki/hcard",
	"type" : "object",
	"properties" : {
		"post-office-box" : { "type" : "string" },
		"extended-address" : { "type" : "string" },
		"street-address" : { "type":"string" },
		"locality" : { "type" : "string", "required" : true },
		"region" : { "type" : "string", "required" : true },
		"postal-code" : { "type" : "string" },
		"country-name" : { "type" : "string", "required" : true }
	},
	"dependencies" : {
		"post-office-box" : "street-address",
		"extended-address" : "street-address",
		"street-address" : "region",
		"locality" : "region",
		"region" : "country-name"
	}
}{
	"description" : "A representation of an event",
	"type" : "object",
	"properties" : {
		"dtstart" : {
			"format" : "date-time",
			"type" : "string",
			"description" : "Event starting time",
			"required":true
		},
		"summary" : {
			"type":"string",
			"required":true
		},
		"location" : { 
			"type" : "string" 
		},
		"url" : {
			"type" : "string", 
			"format" : "url" 
		},
		"dtend" : {
			"format" : "date-time",
			"type" : "string",
			"description" : "Event ending time"
		},
		"duration" : {
			"format" : "date",
			"type" : "string",
			"description" : "Event duration"
		},
		"rdate" : {
			"format" : "date-time",
			"type" : "string",
			"description" : "Recurrence date"
		},
		"rrule" : {
			"type" : "string",
			"description" : "Recurrence rule"
		},
		"category" : {
			"type" : "string"
		},
		"description" : {
			"type" : "string"
		},
		"geo" : { "$ref" : "http://json-schema.org/draft-03/geo" }
	}
}
		
			
			

{
   "description":"A representation of a person, company, organization, or place",
   "type":"object",
   "properties":{
      "fn":{
         "description":"Formatted Name",
         "type":"string"
      },
      "familyName":{
         "type":"string",
         "required":true
      },
      "givenName":{
         "type":"string",
         "required":true
      },
      "additionalName":{
         "type":"array",
         "items":{
            "type":"string"
         }
      },
      "honorificPrefix":{
         "type":"array",
         "items":{
            "type":"string"
         }
      },
      "honorificSuffix":{
         "type":"array",
         "items":{
            "type":"string"
         }
      },
      "nickname":{
         "type":"string"
      },
      "url":{
         "type":"string",
         "format":"url"
      },
      "email":{
         "type":"object",
         "properties":{
            "type":{
               "type":"string"
            },
            "value":{
               "type":"string",
               "format":"email"
            }
         }
      },
      "tel":{
         "type":"object",
         "properties":{
            "type":{
               "type":"string"
            },
            "value":{
               "type":"string",
               "format":"phone"
            }
         }
      },
      "adr":{"$ref" : "http://json-schema.org/address"},
      "geo":{"$ref" : "http://json-schema.org/geo"},
      "tz":{
         "type":"string"
      },
      "photo":{
         "format":"image",
         "type":"string"
      },
      "logo":{
         "format":"image",
         "type":"string"
      },
      "sound":{
         "format":"attachment",
         "type":"string"
      },
      "bday":{
         "type":"string",
         "format":"date"
      },
      "title":{
         "type":"string"
      },
      "role":{
         "type":"string"
      },
      "org":{
         "type":"object",
         "properties":{
            "organizationName":{
               "type":"string"
            },
            "organizationUnit":{
               "type":"string"
            }
         }
      }
   }
}{
	"description" : "A geographical coordinate",
	"type" : "object",
	"properties" : {
		"latitude" : { "type" : "number" },
		"longitude" : { "type" : "number" }
	}
}{
    "extends":"http://json-schema.org/hyper-schema",
    "description":"A schema for schema interface definitions that describe programmatic class structures using JSON schema syntax",
    "properties":{
        "methods":{
            "type":"object",
            "description":"This defines the set of methods available to the class instances",
            "additionalProperties":{
            	"type":"object",
            	"description":"The definition of the method",
            	"properties":{
            		"parameters":{
            			"type":"array",
            			"description":"The set of parameters that should be passed to the method when it is called",
            			"items":{"$ref":"#"},
            			"required": true
            		},
            		"returns":{"$ref":"#"}
            	}
            }
        }    
    }
}
{
	"$schema" : "http://json-schema.org/draft-02/hyper-schema#",
	"id" : "http://json-schema.org/draft-02/hyper-schema#",

	"properties" : {
		"links" : {
			"type" : "array",
			"items" : {"$ref" : "http://json-schema.org/draft-02/links#"},
			"optional" : true
		},
		
		"fragmentResolution" : {
			"type" : "string",
			"optional" : true,
			"default" : "slash-delimited"
		},
		
		"root" : {
			"type" : "boolean",
			"optional" : true,
			"default" : false
		},
		
		"readonly" : {
			"type" : "boolean",
			"optional" : true,
			"default" : false
		},
		
		"pathStart" : {
			"type" : "string",
			"optional" : true,
			"format" : "uri"
		},
		
		"mediaType" : {
			"type" : "string",
			"optional" : true,
			"format" : "media-type"
		},
		
		"alternate" : {
			"type" : "array",
			"items" : {"$ref" : "#"},
			"optional" : true
		}
	},
	
	"links" : [
		{
			"href" : "{$ref}",
			"rel" : "full"
		},
		
		{
			"href" : "{$schema}",
			"rel" : "describedby"
		},
		
		{
			"href" : "{id}",
			"rel" : "self"
		}
	],
	
	"fragmentResolution" : "slash-delimited",
	"extends" : {"$ref" : "http://json-schema.org/draft-02/schema#"}
}{
	"$schema" : "http://json-schema.org/draft-02/hyper-schema#",
	"id" : "http://json-schema.org/draft-02/json-ref#",
	
	"items" : {"$ref" : "#"},
	"additionalProperties" : {"$ref" : "#"},
	
	"links" : [
		{
			"href" : "{$ref}",
			"rel" : "full"
		},
		
		{
			"href" : "{$schema}",
			"rel" : "describedby"
		},
		
		{
			"href" : "{id}",
			"rel" : "self"
		}
	],
	
	"fragmentResolution" : "dot-delimited"
}{
	"$schema" : "http://json-schema.org/draft-02/hyper-schema#",
	"id" : "http://json-schema.org/draft-02/links#",
	"type" : "object",
	
	"properties" : {
		"href" : {
			"type" : "string"
		},
		
		"rel" : {
			"type" : "string"
		},
		
		"targetSchema" : {"$ref" : "http://json-schema.org/draft-02/hyper-schema#"},
		
		"method" : {
			"type" : "string",
			"default" : "GET",
			"optional" : true
		},
		
		"enctype" : {
			"type" : "string",
			"requires" : "method",
			"optional" : true
		},
		
		"properties" : {
			"type" : "object",
			"additionalProperties" : {"$ref" : "http://json-schema.org/draft-02/hyper-schema#"},
			"optional" : true
		}
	}
}{
	"$schema" : "http://json-schema.org/draft-02/hyper-schema#",
	"id" : "http://json-schema.org/draft-02/schema#",
	"type" : "object",
	
	"properties" : {
		"type" : {
			"type" : ["string", "array"],
			"items" : {
				"type" : ["string", {"$ref" : "#"}]
			},
			"optional" : true,
			"uniqueItems" : true,
			"default" : "any"
		},
		
		"properties" : {
			"type" : "object",
			"additionalProperties" : {"$ref" : "#"},
			"optional" : true,
			"default" : {}
		},
		
		"items" : {
			"type" : [{"$ref" : "#"}, "array"],
			"items" : {"$ref" : "#"},
			"optional" : true,
			"default" : {}
		},
		
		"optional" : {
			"type" : "boolean",
			"optional" : true,
			"default" : false
		},
		
		"additionalProperties" : {
			"type" : [{"$ref" : "#"}, "boolean"],
			"optional" : true,
			"default" : {}
		},
		
		"requires" : {
			"type" : ["string", {"$ref" : "#"}],
			"optional" : true
		},
		
		"minimum" : {
			"type" : "number",
			"optional" : true
		},
		
		"maximum" : {
			"type" : "number",
			"optional" : true
		},
		
		"minimumCanEqual" : {
			"type" : "boolean",
			"optional" : true,
			"requires" : "minimum",
			"default" : true
		},
		
		"maximumCanEqual" : {
			"type" : "boolean",
			"optional" : true,
			"requires" : "maximum",
			"default" : true
		},
		
		"minItems" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0,
			"default" : 0
		},
		
		"maxItems" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0
		},
		
		"uniqueItems" : {
			"type" : "boolean",
			"optional" : true,
			"default" : false
		},
		
		"pattern" : {
			"type" : "string",
			"optional" : true,
			"format" : "regex"
		},
		
		"minLength" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0,
			"default" : 0
		},
		
		"maxLength" : {
			"type" : "integer",
			"optional" : true
		},
		
		"enum" : {
			"type" : "array",
			"optional" : true,
			"minItems" : 1,
			"uniqueItems" : true
		},
		
		"title" : {
			"type" : "string",
			"optional" : true
		},
		
		"description" : {
			"type" : "string",
			"optional" : true
		},
		
		"format" : {
			"type" : "string",
			"optional" : true
		},
		
		"contentEncoding" : {
			"type" : "string",
			"optional" : true
		},
		
		"default" : {
			"type" : "any",
			"optional" : true
		},
		
		"divisibleBy" : {
			"type" : "number",
			"minimum" : 0,
			"minimumCanEqual" : false,
			"optional" : true,
			"default" : 1
		},
		
		"disallow" : {
			"type" : ["string", "array"],
			"items" : {"type" : "string"},
			"optional" : true,
			"uniqueItems" : true
		},
		
		"extends" : {
			"type" : [{"$ref" : "#"}, "array"],
			"items" : {"$ref" : "#"},
			"optional" : true,
			"default" : {}
		}
	},
	
	"optional" : true,
	"default" : {}
}{
	"$schema" : "http://json-schema.org/draft-01/hyper-schema#",
	"id" : "http://json-schema.org/draft-01/hyper-schema#",

	"properties" : {
		"links" : {
			"type" : "array",
			"items" : {"$ref" : "http://json-schema.org/draft-01/links#"},
			"optional" : true
		},
		
		"fragmentResolution" : {
			"type" : "string",
			"optional" : true,
			"default" : "dot-delimited"
		},
		
		"root" : {
			"type" : "boolean",
			"optional" : true,
			"default" : false
		},
		
		"readonly" : {
			"type" : "boolean",
			"optional" : true,
			"default" : false
		},
		
		"pathStart" : {
			"type" : "string",
			"optional" : true,
			"format" : "uri"
		},
		
		"mediaType" : {
			"type" : "string",
			"optional" : true,
			"format" : "media-type"
		},
		
		"alternate" : {
			"type" : "array",
			"items" : {"$ref" : "#"},
			"optional" : true
		}
	},
	
	"links" : [
		{
			"href" : "{$ref}",
			"rel" : "full"
		},
		
		{
			"href" : "{$schema}",
			"rel" : "describedby"
		},
		
		{
			"href" : "{id}",
			"rel" : "self"
		}
	],
	
	"fragmentResolution" : "dot-delimited",
	"extends" : {"$ref" : "http://json-schema.org/draft-01/schema#"}
}{
	"$schema" : "http://json-schema.org/draft-01/hyper-schema#",
	"id" : "http://json-schema.org/draft-01/json-ref#",
	
	"items" : {"$ref" : "#"},
	"additionalProperties" : {"$ref" : "#"},
	
	"links" : [
		{
			"href" : "{$ref}",
			"rel" : "full"
		},
		
		{
			"href" : "{$schema}",
			"rel" : "describedby"
		},
		
		{
			"href" : "{id}",
			"rel" : "self"
		}
	],
	
	"fragmentResolution" : "dot-delimited"
}{
	"$schema" : "http://json-schema.org/draft-01/hyper-schema#",
	"id" : "http://json-schema.org/draft-01/links#",
	"type" : "object",
	
	"properties" : {
		"href" : {
			"type" : "string"
		},
		
		"rel" : {
			"type" : "string"
		},
		
		"method" : {
			"type" : "string",
			"default" : "GET",
			"optional" : true
		},
		
		"enctype" : {
			"type" : "string",
			"requires" : "method",
			"optional" : true
		},
		
		"properties" : {
			"type" : "object",
			"additionalProperties" : {"$ref" : "http://json-schema.org/draft-01/hyper-schema#"},
			"optional" : true
		}
	}
}{
	"$schema" : "http://json-schema.org/draft-01/hyper-schema#",
	"id" : "http://json-schema.org/draft-01/schema#",
	"type" : "object",
	
	"properties" : {
		"type" : {
			"type" : ["string", "array"],
			"items" : {
				"type" : ["string", {"$ref" : "#"}]
			},
			"optional" : true,
			"default" : "any"
		},
		
		"properties" : {
			"type" : "object",
			"additionalProperties" : {"$ref" : "#"},
			"optional" : true,
			"default" : {}
		},
		
		"items" : {
			"type" : [{"$ref" : "#"}, "array"],
			"items" : {"$ref" : "#"},
			"optional" : true,
			"default" : {}
		},
		
		"optional" : {
			"type" : "boolean",
			"optional" : true,
			"default" : false
		},
		
		"additionalProperties" : {
			"type" : [{"$ref" : "#"}, "boolean"],
			"optional" : true,
			"default" : {}
		},
		
		"requires" : {
			"type" : ["string", {"$ref" : "#"}],
			"optional" : true
		},
		
		"minimum" : {
			"type" : "number",
			"optional" : true
		},
		
		"maximum" : {
			"type" : "number",
			"optional" : true
		},
		
		"minimumCanEqual" : {
			"type" : "boolean",
			"optional" : true,
			"requires" : "minimum",
			"default" : true
		},
		
		"maximumCanEqual" : {
			"type" : "boolean",
			"optional" : true,
			"requires" : "maximum",
			"default" : true
		},
		
		"minItems" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0,
			"default" : 0
		},
		
		"maxItems" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0
		},
		
		"pattern" : {
			"type" : "string",
			"optional" : true,
			"format" : "regex"
		},
		
		"minLength" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0,
			"default" : 0
		},
		
		"maxLength" : {
			"type" : "integer",
			"optional" : true
		},
		
		"enum" : {
			"type" : "array",
			"optional" : true,
			"minItems" : 1
		},
		
		"title" : {
			"type" : "string",
			"optional" : true
		},
		
		"description" : {
			"type" : "string",
			"optional" : true
		},
		
		"format" : {
			"type" : "string",
			"optional" : true
		},
		
		"contentEncoding" : {
			"type" : "string",
			"optional" : true
		},
		
		"default" : {
			"type" : "any",
			"optional" : true
		},
		
		"maxDecimal" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0
		},
		
		"disallow" : {
			"type" : ["string", "array"],
			"items" : {"type" : "string"},
			"optional" : true
		},
		
		"extends" : {
			"type" : [{"$ref" : "#"}, "array"],
			"items" : {"$ref" : "#"},
			"optional" : true,
			"default" : {}
		}
	},
	
	"optional" : true,
	"default" : {}
}{
	"$schema" : "http://json-schema.org/draft-00/hyper-schema#",
	"id" : "http://json-schema.org/draft-00/hyper-schema#",

	"properties" : {
		"links" : {
			"type" : "array",
			"items" : {"$ref" : "http://json-schema.org/draft-00/links#"},
			"optional" : true
		},
		
		"fragmentResolution" : {
			"type" : "string",
			"optional" : true,
			"default" : "dot-delimited"
		},
		
		"root" : {
			"type" : "boolean",
			"optional" : true,
			"default" : false
		},
		
		"readonly" : {
			"type" : "boolean",
			"optional" : true,
			"default" : false
		},
		
		"pathStart" : {
			"type" : "string",
			"optional" : true,
			"format" : "uri"
		},
		
		"mediaType" : {
			"type" : "string",
			"optional" : true,
			"format" : "media-type"
		},
		
		"alternate" : {
			"type" : "array",
			"items" : {"$ref" : "#"},
			"optional" : true
		}
	},
	
	"links" : [
		{
			"href" : "{$ref}",
			"rel" : "full"
		},
		
		{
			"href" : "{$schema}",
			"rel" : "describedby"
		},
		
		{
			"href" : "{id}",
			"rel" : "self"
		}
	],
	
	"fragmentResolution" : "dot-delimited",
	"extends" : {"$ref" : "http://json-schema.org/draft-00/schema#"}
}{
	"$schema" : "http://json-schema.org/draft-00/hyper-schema#",
	"id" : "http://json-schema.org/draft-00/json-ref#",
	
	"items" : {"$ref" : "#"},
	"additionalProperties" : {"$ref" : "#"},
	
	"links" : [
		{
			"href" : "{$ref}",
			"rel" : "full"
		},
		
		{
			"href" : "{$schema}",
			"rel" : "describedby"
		},
		
		{
			"href" : "{id}",
			"rel" : "self"
		}
	],
	
	"fragmentResolution" : "dot-delimited"
}{
	"$schema" : "http://json-schema.org/draft-00/hyper-schema#",
	"id" : "http://json-schema.org/draft-00/links#",
	"type" : "object",
	
	"properties" : {
		"href" : {
			"type" : "string"
		},
		
		"rel" : {
			"type" : "string"
		},
		
		"method" : {
			"type" : "string",
			"default" : "GET",
			"optional" : true
		},
		
		"enctype" : {
			"type" : "string",
			"requires" : "method",
			"optional" : true
		},
		
		"properties" : {
			"type" : "object",
			"additionalProperties" : {"$ref" : "http://json-schema.org/draft-00/hyper-schema#"},
			"optional" : true
		}
	}
}{
	"$schema" : "http://json-schema.org/draft-00/hyper-schema#",
	"id" : "http://json-schema.org/draft-00/schema#",
	"type" : "object",
	
	"properties" : {
		"type" : {
			"type" : ["string", "array"],
			"items" : {
				"type" : ["string", {"$ref" : "#"}]
			},
			"optional" : true,
			"default" : "any"
		},
		
		"properties" : {
			"type" : "object",
			"additionalProperties" : {"$ref" : "#"},
			"optional" : true,
			"default" : {}
		},
		
		"items" : {
			"type" : [{"$ref" : "#"}, "array"],
			"items" : {"$ref" : "#"},
			"optional" : true,
			"default" : {}
		},
		
		"optional" : {
			"type" : "boolean",
			"optional" : true,
			"default" : false
		},
		
		"additionalProperties" : {
			"type" : [{"$ref" : "#"}, "boolean"],
			"optional" : true,
			"default" : {}
		},
		
		"requires" : {
			"type" : ["string", {"$ref" : "#"}],
			"optional" : true
		},
		
		"minimum" : {
			"type" : "number",
			"optional" : true
		},
		
		"maximum" : {
			"type" : "number",
			"optional" : true
		},
		
		"minimumCanEqual" : {
			"type" : "boolean",
			"optional" : true,
			"requires" : "minimum",
			"default" : true
		},
		
		"maximumCanEqual" : {
			"type" : "boolean",
			"optional" : true,
			"requires" : "maximum",
			"default" : true
		},
		
		"minItems" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0,
			"default" : 0
		},
		
		"maxItems" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0
		},
		
		"pattern" : {
			"type" : "string",
			"optional" : true,
			"format" : "regex"
		},
		
		"minLength" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0,
			"default" : 0
		},
		
		"maxLength" : {
			"type" : "integer",
			"optional" : true
		},
		
		"enum" : {
			"type" : "array",
			"optional" : true,
			"minItems" : 1
		},
		
		"title" : {
			"type" : "string",
			"optional" : true
		},
		
		"description" : {
			"type" : "string",
			"optional" : true
		},
		
		"format" : {
			"type" : "string",
			"optional" : true
		},
		
		"contentEncoding" : {
			"type" : "string",
			"optional" : true
		},
		
		"default" : {
			"type" : "any",
			"optional" : true
		},
		
		"maxDecimal" : {
			"type" : "integer",
			"optional" : true,
			"minimum" : 0
		},
		
		"disallow" : {
			"type" : ["string", "array"],
			"items" : {"type" : "string"},
			"optional" : true
		},
		
		"extends" : {
			"type" : [{"$ref" : "#"}, "array"],
			"items" : {"$ref" : "#"},
			"optional" : true,
			"default" : {}
		}
	},
	
	"optional" : true,
	"default" : {}
}extends: eslint:recommended
env:
  node: true
  browser: true
rules:
  block-scoped-var: 2
  complexity: [2, 13]
  curly: [2, multi-or-nest, consistent]
  dot-location: [2, property]
  dot-notation: 2
  indent: [2, 2, SwitchCase: 1]
  linebreak-style: [2, unix]
  new-cap: 2
  no-console: [2, allow: [warn, error]]
  no-else-return: 2
  no-eq-null: 2
  no-fallthrough: 2
  no-invalid-this: 2
  no-return-assign: 2
  no-shadow: 1
  no-trailing-spaces: 2
  no-use-before-define: [2, nofunc]
  quotes: [2, single, avoid-escape]
  semi: [2, always]
  strict: [2, global]
  valid-jsdoc: [2, requireReturn: false]
  no-control-regex: 0
MIT License

Copyright (c) 2017 Evgeny Poberezkin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';

var traverse = module.exports = function (schema, opts, cb) {
  // Legacy support for v0.3.1 and earlier.
  if (typeof opts == 'function') {
    cb = opts;
    opts = {};
  }

  cb = opts.cb || cb;
  var pre = (typeof cb == 'function') ? cb : cb.pre || function() {};
  var post = cb.post || function() {};

  _traverse(opts, pre, post, schema, '', schema);
};


traverse.keywords = {
  additionalItems: true,
  items: true,
  contains: true,
  additionalProperties: true,
  propertyNames: true,
  not: true
};

traverse.arrayKeywords = {
  items: true,
  allOf: true,
  anyOf: true,
  oneOf: true
};

traverse.propsKeywords = {
  definitions: true,
  properties: true,
  patternProperties: true,
  dependencies: true
};

traverse.skipKeywords = {
  default: true,
  enum: true,
  const: true,
  required: true,
  maximum: true,
  minimum: true,
  exclusiveMaximum: true,
  exclusiveMinimum: true,
  multipleOf: true,
  maxLength: true,
  minLength: true,
  pattern: true,
  format: true,
  maxItems: true,
  minItems: true,
  uniqueItems: true,
  maxProperties: true,
  minProperties: true
};


function _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {
  if (schema && typeof schema == 'object' && !Array.isArray(schema)) {
    pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
    for (var key in schema) {
      var sch = schema[key];
      if (Array.isArray(sch)) {
        if (key in traverse.arrayKeywords) {
          for (var i=0; i<sch.length; i++)
            _traverse(opts, pre, post, sch[i], jsonPtr + '/' + key + '/' + i, rootSchema, jsonPtr, key, schema, i);
        }
      } else if (key in traverse.propsKeywords) {
        if (sch && typeof sch == 'object') {
          for (var prop in sch)
            _traverse(opts, pre, post, sch[prop], jsonPtr + '/' + key + '/' + escapeJsonPtr(prop), rootSchema, jsonPtr, key, schema, prop);
        }
      } else if (key in traverse.keywords || (opts.allKeys && !(key in traverse.skipKeywords))) {
        _traverse(opts, pre, post, sch, jsonPtr + '/' + key, rootSchema, jsonPtr, key, schema);
      }
    }
    post(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
  }
}


function escapeJsonPtr(str) {
  return str.replace(/~/g, '~0').replace(/\//g, '~1');
}
{
  "author": {
    "name": "Evgeny Poberezkin"
  },
  "deprecated": false,
  "description": "Traverse JSON Schema passing each schema object to callback",
  "devDependencies": {
    "coveralls": "^2.13.1",
    "eslint": "^3.19.0",
    "mocha": "^3.4.2",
    "nyc": "^11.0.2",
    "pre-commit": "^1.2.2"
  },
  "homepage": "https://github.com/epoberezkin/json-schema-traverse#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "json-schema-traverse",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/epoberezkin/json-schema-traverse.git"
  },
  "version": "0.4.1"
}parserOptions:
  ecmaVersion: 6
globals:
  beforeEach: false
  describe: false
  it: false
'use strict';

var traverse = require('../index');
var assert = require('assert');

describe('json-schema-traverse', function() {
  var calls;

  beforeEach(function() {
    calls = [];
  });

  it('should traverse all keywords containing schemas recursively', function() {
    var schema = require('./fixtures/schema').schema;
    var expectedCalls = require('./fixtures/schema').expectedCalls;

    traverse(schema, {cb: callback});
    assert.deepStrictEqual(calls, expectedCalls);
  });

  describe('Legacy v0.3.1 API', function() {
    it('should traverse all keywords containing schemas recursively', function() {
      var schema = require('./fixtures/schema').schema;
      var expectedCalls = require('./fixtures/schema').expectedCalls;

      traverse(schema, callback);
      assert.deepStrictEqual(calls, expectedCalls);
    });

    it('should work when an options object is provided', function() {
      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var schema = require('./fixtures/schema').schema;
      var expectedCalls = require('./fixtures/schema').expectedCalls;

      traverse(schema, {}, callback);
      assert.deepStrictEqual(calls, expectedCalls);
    });
  });


  describe('allKeys option', function() {
    var schema = {
      someObject: {
        minimum: 1,
        maximum: 2
      }
    };

    it('should traverse objects with allKeys: true option', function() {
      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var expectedCalls = [
        [schema, '', schema, undefined, undefined, undefined, undefined],
        [schema.someObject, '/someObject', schema, '', 'someObject', schema, undefined]
      ];

      traverse(schema, {allKeys: true, cb: callback});
      assert.deepStrictEqual(calls, expectedCalls);
    });


    it('should NOT traverse objects with allKeys: false option', function() {
      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var expectedCalls = [
        [schema, '', schema, undefined, undefined, undefined, undefined]
      ];

      traverse(schema, {allKeys: false, cb: callback});
      assert.deepStrictEqual(calls, expectedCalls);
    });


    it('should NOT traverse objects without allKeys option', function() {
      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var expectedCalls = [
        [schema, '', schema, undefined, undefined, undefined, undefined]
      ];

      traverse(schema, {cb: callback});
      assert.deepStrictEqual(calls, expectedCalls);
    });


    it('should NOT travers objects in standard keywords which value is not a schema', function() {
      var schema2 = {
        const: {foo: 'bar'},
        enum: ['a', 'b'],
        required: ['foo'],
        another: {

        },
        patternProperties: {}, // will not traverse - no properties
        dependencies: true, // will not traverse - invalid
        properties: {
          smaller: {
            type: 'number'
          },
          larger: {
            type: 'number',
            minimum: {$data: '1/smaller'}
          }
        }
      };

      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var expectedCalls = [
        [schema2, '', schema2, undefined, undefined, undefined, undefined],
        [schema2.another, '/another', schema2, '', 'another', schema2, undefined],
        [schema2.properties.smaller, '/properties/smaller', schema2, '', 'properties', schema2, 'smaller'],
        [schema2.properties.larger, '/properties/larger', schema2, '', 'properties', schema2, 'larger'],
      ];

      traverse(schema2, {allKeys: true, cb: callback});
      assert.deepStrictEqual(calls, expectedCalls);
    });
  });

  describe('pre and post', function() {
    var schema = {
      type: 'object',
      properties: {
        name: {type: 'string'},
        age: {type: 'number'}
      }
    };

    it('should traverse schema in pre-order', function() {
      traverse(schema, {cb: {pre}});
      var expectedCalls = [
        ['pre', schema, '', schema, undefined, undefined, undefined, undefined],
        ['pre', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'],
        ['pre', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'],
      ];
      assert.deepStrictEqual(calls, expectedCalls);
    });

    it('should traverse schema in post-order', function() {
      traverse(schema, {cb: {post}});
      var expectedCalls = [
        ['post', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'],
        ['post', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'],
        ['post', schema, '', schema, undefined, undefined, undefined, undefined],
      ];
      assert.deepStrictEqual(calls, expectedCalls);
    });

    it('should traverse schema in pre- and post-order at the same time', function() {
      traverse(schema, {cb: {pre, post}});
      var expectedCalls = [
        ['pre', schema, '', schema, undefined, undefined, undefined, undefined],
        ['pre', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'],
        ['post', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'],
        ['pre', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'],
        ['post', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'],
        ['post', schema, '', schema, undefined, undefined, undefined, undefined],
      ];
      assert.deepStrictEqual(calls, expectedCalls);
    });
  });

  function callback() {
    calls.push(Array.prototype.slice.call(arguments));
  }

  function pre() {
    calls.push(['pre'].concat(Array.prototype.slice.call(arguments)));
  }

  function post() {
    calls.push(['post'].concat(Array.prototype.slice.call(arguments)));
  }
});
'use strict';

var schema = {
  additionalItems: subschema('additionalItems'),
  items: subschema('items'),
  contains: subschema('contains'),
  additionalProperties: subschema('additionalProperties'),
  propertyNames: subschema('propertyNames'),
  not: subschema('not'),
  allOf: [
    subschema('allOf_0'),
    subschema('allOf_1'),
    {
      items: [
        subschema('items_0'),
        subschema('items_1'),
      ]
    }
  ],
  anyOf: [
    subschema('anyOf_0'),
    subschema('anyOf_1'),
  ],
  oneOf: [
    subschema('oneOf_0'),
    subschema('oneOf_1'),
  ],
  definitions: {
    foo: subschema('definitions_foo'),
    bar: subschema('definitions_bar'),
  },
  properties: {
    foo: subschema('properties_foo'),
    bar: subschema('properties_bar'),
  },
  patternProperties: {
    foo: subschema('patternProperties_foo'),
    bar: subschema('patternProperties_bar'),
  },
  dependencies: {
    foo: subschema('dependencies_foo'),
    bar: subschema('dependencies_bar'),
  },
  required: ['foo', 'bar']
};


function subschema(keyword) {
  var sch = {
    properties: {},
    additionalProperties: false,
    additionalItems: false,
    anyOf: [
      {format: 'email'},
      {format: 'hostname'}
    ]
  };
  sch.properties['foo_' + keyword] = {title: 'foo'};
  sch.properties['bar_' + keyword] = {title: 'bar'};
  return sch;
}


module.exports = {
  schema: schema,

  // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
  expectedCalls: [[schema, '', schema, undefined, undefined, undefined, undefined]]
    .concat(expectedCalls('additionalItems'))
    .concat(expectedCalls('items'))
    .concat(expectedCalls('contains'))
    .concat(expectedCalls('additionalProperties'))
    .concat(expectedCalls('propertyNames'))
    .concat(expectedCalls('not'))
    .concat(expectedCallsChild('allOf', 0))
    .concat(expectedCallsChild('allOf', 1))
    .concat([
      [schema.allOf[2], '/allOf/2', schema, '', 'allOf', schema, 2],
      [schema.allOf[2].items[0], '/allOf/2/items/0', schema, '/allOf/2', 'items', schema.allOf[2], 0],
      [schema.allOf[2].items[0].properties.foo_items_0, '/allOf/2/items/0/properties/foo_items_0', schema, '/allOf/2/items/0', 'properties', schema.allOf[2].items[0], 'foo_items_0'],
      [schema.allOf[2].items[0].properties.bar_items_0, '/allOf/2/items/0/properties/bar_items_0', schema, '/allOf/2/items/0', 'properties', schema.allOf[2].items[0], 'bar_items_0'],
      [schema.allOf[2].items[0].anyOf[0], '/allOf/2/items/0/anyOf/0', schema, '/allOf/2/items/0', 'anyOf', schema.allOf[2].items[0], 0],
      [schema.allOf[2].items[0].anyOf[1], '/allOf/2/items/0/anyOf/1', schema, '/allOf/2/items/0', 'anyOf', schema.allOf[2].items[0], 1],

      [schema.allOf[2].items[1], '/allOf/2/items/1', schema, '/allOf/2', 'items', schema.allOf[2], 1],
      [schema.allOf[2].items[1].properties.foo_items_1, '/allOf/2/items/1/properties/foo_items_1', schema, '/allOf/2/items/1', 'properties', schema.allOf[2].items[1], 'foo_items_1'],
      [schema.allOf[2].items[1].properties.bar_items_1, '/allOf/2/items/1/properties/bar_items_1', schema, '/allOf/2/items/1', 'properties', schema.allOf[2].items[1], 'bar_items_1'],
      [schema.allOf[2].items[1].anyOf[0], '/allOf/2/items/1/anyOf/0', schema, '/allOf/2/items/1', 'anyOf', schema.allOf[2].items[1], 0],
      [schema.allOf[2].items[1].anyOf[1], '/allOf/2/items/1/anyOf/1', schema, '/allOf/2/items/1', 'anyOf', schema.allOf[2].items[1], 1]
    ])
    .concat(expectedCallsChild('anyOf', 0))
    .concat(expectedCallsChild('anyOf', 1))
    .concat(expectedCallsChild('oneOf', 0))
    .concat(expectedCallsChild('oneOf', 1))
    .concat(expectedCallsChild('definitions', 'foo'))
    .concat(expectedCallsChild('definitions', 'bar'))
    .concat(expectedCallsChild('properties', 'foo'))
    .concat(expectedCallsChild('properties', 'bar'))
    .concat(expectedCallsChild('patternProperties', 'foo'))
    .concat(expectedCallsChild('patternProperties', 'bar'))
    .concat(expectedCallsChild('dependencies', 'foo'))
    .concat(expectedCallsChild('dependencies', 'bar'))
};


function expectedCalls(keyword) {
  return [
    [schema[keyword], `/${keyword}`, schema, '', keyword, schema, undefined],
    [schema[keyword].properties[`foo_${keyword}`], `/${keyword}/properties/foo_${keyword}`, schema, `/${keyword}`, 'properties', schema[keyword], `foo_${keyword}`],
    [schema[keyword].properties[`bar_${keyword}`], `/${keyword}/properties/bar_${keyword}`, schema, `/${keyword}`, 'properties', schema[keyword], `bar_${keyword}`],
    [schema[keyword].anyOf[0], `/${keyword}/anyOf/0`, schema, `/${keyword}`, 'anyOf', schema[keyword], 0],
    [schema[keyword].anyOf[1], `/${keyword}/anyOf/1`, schema, `/${keyword}`, 'anyOf', schema[keyword], 1]
  ];
}


function expectedCallsChild(keyword, i) {
  return [
    [schema[keyword][i], `/${keyword}/${i}`, schema, '', keyword, schema, i],
    [schema[keyword][i].properties[`foo_${keyword}_${i}`], `/${keyword}/${i}/properties/foo_${keyword}_${i}`, schema, `/${keyword}/${i}`, 'properties', schema[keyword][i], `foo_${keyword}_${i}`],
    [schema[keyword][i].properties[`bar_${keyword}_${i}`], `/${keyword}/${i}/properties/bar_${keyword}_${i}`, schema, `/${keyword}/${i}`, 'properties', schema[keyword][i], `bar_${keyword}_${i}`],
    [schema[keyword][i].anyOf[0], `/${keyword}/${i}/anyOf/0`, schema, `/${keyword}/${i}`, 'anyOf', schema[keyword][i], 0],
    [schema[keyword][i].anyOf[1], `/${keyword}/${i}/anyOf/1`, schema, `/${keyword}/${i}`, 'anyOf', schema[keyword][i], 1]
  ];
}
The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
NODE_OPTS =
TEST_OPTS =

love:
	@echo "Feel like makin' love."

test:
	@node $(NODE_OPTS) ./node_modules/.bin/_mocha -R dot $(TEST_OPTS)

spec:
	@node $(NODE_OPTS) ./node_modules/.bin/_mocha -R spec $(TEST_OPTS)

autotest:
	@node $(NODE_OPTS) ./node_modules/.bin/_mocha -R dot --watch $(TEST_OPTS)

autospec:
	@node $(NODE_OPTS) ./node_modules/.bin/_mocha -R spec --watch $(TEST_OPTS)

pack:
	@file=$$(npm pack); echo "$$file"; tar tf "$$file"

publish:
	npm publish

tag:
	git tag "v$$(node -e 'console.log(require("./package").version)')"

clean:
	rm -f *.tgz
	npm prune --production

.PHONY: love
.PHONY: test spec autotest autospec
.PHONY: pack publish tag
.PHONY: clean
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me"
  },
  "deprecated": false,
  "description": "Like JSON.stringify, but doesn't blow up on circular refs.",
  "devDependencies": {
    "mocha": ">= 2.1.0 < 3",
    "must": ">= 0.12 < 0.13",
    "sinon": ">= 1.12.2 < 2"
  },
  "homepage": "https://github.com/isaacs/json-stringify-safe",
  "license": "ISC",
  "main": "stringify.js",
  "name": "json-stringify-safe",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/json-stringify-safe.git"
  },
  "version": "5.0.1"
}exports = module.exports = stringify
exports.getSerialize = serializer

function stringify(obj, replacer, spaces, cycleReplacer) {
  return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces)
}

function serializer(replacer, cycleReplacer) {
  var stack = [], keys = []

  if (cycleReplacer == null) cycleReplacer = function(key, value) {
    if (stack[0] === value) return "[Circular ~]"
    return "[Circular ~." + keys.slice(0, stack.indexOf(value)).join(".") + "]"
  }

  return function(key, value) {
    if (stack.length > 0) {
      var thisPos = stack.indexOf(this)
      ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)
      ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)
      if (~stack.indexOf(value)) value = cycleReplacer.call(this, key, value)
    }
    else stack.push(value)

    return replacer == null ? value : replacer.call(this, key, value)
  }
}
MIT License

Copyright (c) 2012-2018 Aseem Kishore, and [others].

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

[others]: https://github.com/json5/json5/contributors
{
  "author": {
    "name": "Aseem Kishore",
    "email": "aseem.kishore@gmail.com"
  },
  "bin": {
    "json5": "lib/cli.js"
  },
  "browser": "dist/index.js",
  "dependencies": {
    "minimist": "^1.2.5"
  },
  "deprecated": false,
  "description": "JSON for humans.",
  "devDependencies": {
    "core-js": "^2.6.5",
    "eslint": "^5.15.3",
    "eslint-config-standard": "^12.0.0",
    "eslint-plugin-import": "^2.16.0",
    "eslint-plugin-node": "^8.0.1",
    "eslint-plugin-promise": "^4.0.1",
    "eslint-plugin-standard": "^4.0.0",
    "regenerate": "^1.4.0",
    "rollup": "^0.64.1",
    "rollup-plugin-buble": "^0.19.6",
    "rollup-plugin-commonjs": "^9.2.1",
    "rollup-plugin-node-resolve": "^3.4.0",
    "rollup-plugin-terser": "^1.0.1",
    "sinon": "^6.3.5",
    "tap": "^12.6.0",
    "unicode-10.0.0": "^0.7.5"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "lib/",
    "dist/"
  ],
  "homepage": "http://json5.org/",
  "license": "MIT",
  "main": "lib/index.js",
  "module": "dist/index.mjs",
  "name": "json5",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/json5/json5.git"
  },
  "version": "2.1.3"
}#!/usr/bin/env node

const fs = require('fs')
const path = require('path')
const minimist = require('minimist')
const pkg = require('../package.json')
const JSON5 = require('./')

const argv = minimist(process.argv.slice(2), {
    alias: {
        'convert': 'c',
        'space': 's',
        'validate': 'v',
        'out-file': 'o',
        'version': 'V',
        'help': 'h',
    },
    boolean: [
        'convert',
        'validate',
        'version',
        'help',
    ],
    string: [
        'space',
        'out-file',
    ],
})

if (argv.version) {
    version()
} else if (argv.help) {
    usage()
} else {
    const inFilename = argv._[0]

    let readStream
    if (inFilename) {
        readStream = fs.createReadStream(inFilename)
    } else {
        readStream = process.stdin
    }

    let json5 = ''
    readStream.on('data', data => {
        json5 += data
    })

    readStream.on('end', () => {
        let space
        if (argv.space === 't' || argv.space === 'tab') {
            space = '\t'
        } else {
            space = Number(argv.space)
        }

        let value
        try {
            value = JSON5.parse(json5)
            if (!argv.validate) {
                const json = JSON.stringify(value, null, space)

                let writeStream

                // --convert is for backward compatibility with v0.5.1. If
                // specified with <file> and not --out-file, then a file with
                // the same name but with a .json extension will be written.
                if (argv.convert && inFilename && !argv.o) {
                    const parsedFilename = path.parse(inFilename)
                    const outFilename = path.format(
                        Object.assign(
                            parsedFilename,
                            {base: path.basename(parsedFilename.base, parsedFilename.ext) + '.json'}
                        )
                    )

                    writeStream = fs.createWriteStream(outFilename)
                } else if (argv.o) {
                    writeStream = fs.createWriteStream(argv.o)
                } else {
                    writeStream = process.stdout
                }

                writeStream.write(json)
            }
        } catch (err) {
            console.error(err.message)
            process.exit(1)
        }
    })
}

function version () {
    console.log(pkg.version)
}

function usage () {
    console.log(
        `
  Usage: json5 [options] <file>

  If <file> is not provided, then STDIN is used.

  Options:

    -s, --space              The number of spaces to indent or 't' for tabs
    -o, --out-file [file]    Output to the specified file, otherwise STDOUT
    -v, --validate           Validate JSON5 but do not output JSON
    -V, --version            Output the version number
    -h, --help               Output usage information`
    )
}
const parse = require('./parse')
const stringify = require('./stringify')

const JSON5 = {
    parse,
    stringify,
}

module.exports = JSON5
const util = require('./util')

let source
let parseState
let stack
let pos
let line
let column
let token
let key
let root

module.exports = function parse (text, reviver) {
    source = String(text)
    parseState = 'start'
    stack = []
    pos = 0
    line = 1
    column = 0
    token = undefined
    key = undefined
    root = undefined

    do {
        token = lex()

        // This code is unreachable.
        // if (!parseStates[parseState]) {
        //     throw invalidParseState()
        // }

        parseStates[parseState]()
    } while (token.type !== 'eof')

    if (typeof reviver === 'function') {
        return internalize({'': root}, '', reviver)
    }

    return root
}

function internalize (holder, name, reviver) {
    const value = holder[name]
    if (value != null && typeof value === 'object') {
        for (const key in value) {
            const replacement = internalize(value, key, reviver)
            if (replacement === undefined) {
                delete value[key]
            } else {
                value[key] = replacement
            }
        }
    }

    return reviver.call(holder, name, value)
}

let lexState
let buffer
let doubleQuote
let sign
let c

function lex () {
    lexState = 'default'
    buffer = ''
    doubleQuote = false
    sign = 1

    for (;;) {
        c = peek()

        // This code is unreachable.
        // if (!lexStates[lexState]) {
        //     throw invalidLexState(lexState)
        // }

        const token = lexStates[lexState]()
        if (token) {
            return token
        }
    }
}

function peek () {
    if (source[pos]) {
        return String.fromCodePoint(source.codePointAt(pos))
    }
}

function read () {
    const c = peek()

    if (c === '\n') {
        line++
        column = 0
    } else if (c) {
        column += c.length
    } else {
        column++
    }

    if (c) {
        pos += c.length
    }

    return c
}

const lexStates = {
    default () {
        switch (c) {
        case '\t':
        case '\v':
        case '\f':
        case ' ':
        case '\u00A0':
        case '\uFEFF':
        case '\n':
        case '\r':
        case '\u2028':
        case '\u2029':
            read()
            return

        case '/':
            read()
            lexState = 'comment'
            return

        case undefined:
            read()
            return newToken('eof')
        }

        if (util.isSpaceSeparator(c)) {
            read()
            return
        }

        // This code is unreachable.
        // if (!lexStates[parseState]) {
        //     throw invalidLexState(parseState)
        // }

        return lexStates[parseState]()
    },

    comment () {
        switch (c) {
        case '*':
            read()
            lexState = 'multiLineComment'
            return

        case '/':
            read()
            lexState = 'singleLineComment'
            return
        }

        throw invalidChar(read())
    },

    multiLineComment () {
        switch (c) {
        case '*':
            read()
            lexState = 'multiLineCommentAsterisk'
            return

        case undefined:
            throw invalidChar(read())
        }

        read()
    },

    multiLineCommentAsterisk () {
        switch (c) {
        case '*':
            read()
            return

        case '/':
            read()
            lexState = 'default'
            return

        case undefined:
            throw invalidChar(read())
        }

        read()
        lexState = 'multiLineComment'
    },

    singleLineComment () {
        switch (c) {
        case '\n':
        case '\r':
        case '\u2028':
        case '\u2029':
            read()
            lexState = 'default'
            return

        case undefined:
            read()
            return newToken('eof')
        }

        read()
    },

    value () {
        switch (c) {
        case '{':
        case '[':
            return newToken('punctuator', read())

        case 'n':
            read()
            literal('ull')
            return newToken('null', null)

        case 't':
            read()
            literal('rue')
            return newToken('boolean', true)

        case 'f':
            read()
            literal('alse')
            return newToken('boolean', false)

        case '-':
        case '+':
            if (read() === '-') {
                sign = -1
            }

            lexState = 'sign'
            return

        case '.':
            buffer = read()
            lexState = 'decimalPointLeading'
            return

        case '0':
            buffer = read()
            lexState = 'zero'
            return

        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            buffer = read()
            lexState = 'decimalInteger'
            return

        case 'I':
            read()
            literal('nfinity')
            return newToken('numeric', Infinity)

        case 'N':
            read()
            literal('aN')
            return newToken('numeric', NaN)

        case '"':
        case "'":
            doubleQuote = (read() === '"')
            buffer = ''
            lexState = 'string'
            return
        }

        throw invalidChar(read())
    },

    identifierNameStartEscape () {
        if (c !== 'u') {
            throw invalidChar(read())
        }

        read()
        const u = unicodeEscape()
        switch (u) {
        case '$':
        case '_':
            break

        default:
            if (!util.isIdStartChar(u)) {
                throw invalidIdentifier()
            }

            break
        }

        buffer += u
        lexState = 'identifierName'
    },

    identifierName () {
        switch (c) {
        case '$':
        case '_':
        case '\u200C':
        case '\u200D':
            buffer += read()
            return

        case '\\':
            read()
            lexState = 'identifierNameEscape'
            return
        }

        if (util.isIdContinueChar(c)) {
            buffer += read()
            return
        }

        return newToken('identifier', buffer)
    },

    identifierNameEscape () {
        if (c !== 'u') {
            throw invalidChar(read())
        }

        read()
        const u = unicodeEscape()
        switch (u) {
        case '$':
        case '_':
        case '\u200C':
        case '\u200D':
            break

        default:
            if (!util.isIdContinueChar(u)) {
                throw invalidIdentifier()
            }

            break
        }

        buffer += u
        lexState = 'identifierName'
    },

    sign () {
        switch (c) {
        case '.':
            buffer = read()
            lexState = 'decimalPointLeading'
            return

        case '0':
            buffer = read()
            lexState = 'zero'
            return

        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            buffer = read()
            lexState = 'decimalInteger'
            return

        case 'I':
            read()
            literal('nfinity')
            return newToken('numeric', sign * Infinity)

        case 'N':
            read()
            literal('aN')
            return newToken('numeric', NaN)
        }

        throw invalidChar(read())
    },

    zero () {
        switch (c) {
        case '.':
            buffer += read()
            lexState = 'decimalPoint'
            return

        case 'e':
        case 'E':
            buffer += read()
            lexState = 'decimalExponent'
            return

        case 'x':
        case 'X':
            buffer += read()
            lexState = 'hexadecimal'
            return
        }

        return newToken('numeric', sign * 0)
    },

    decimalInteger () {
        switch (c) {
        case '.':
            buffer += read()
            lexState = 'decimalPoint'
            return

        case 'e':
        case 'E':
            buffer += read()
            lexState = 'decimalExponent'
            return
        }

        if (util.isDigit(c)) {
            buffer += read()
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    decimalPointLeading () {
        if (util.isDigit(c)) {
            buffer += read()
            lexState = 'decimalFraction'
            return
        }

        throw invalidChar(read())
    },

    decimalPoint () {
        switch (c) {
        case 'e':
        case 'E':
            buffer += read()
            lexState = 'decimalExponent'
            return
        }

        if (util.isDigit(c)) {
            buffer += read()
            lexState = 'decimalFraction'
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    decimalFraction () {
        switch (c) {
        case 'e':
        case 'E':
            buffer += read()
            lexState = 'decimalExponent'
            return
        }

        if (util.isDigit(c)) {
            buffer += read()
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    decimalExponent () {
        switch (c) {
        case '+':
        case '-':
            buffer += read()
            lexState = 'decimalExponentSign'
            return
        }

        if (util.isDigit(c)) {
            buffer += read()
            lexState = 'decimalExponentInteger'
            return
        }

        throw invalidChar(read())
    },

    decimalExponentSign () {
        if (util.isDigit(c)) {
            buffer += read()
            lexState = 'decimalExponentInteger'
            return
        }

        throw invalidChar(read())
    },

    decimalExponentInteger () {
        if (util.isDigit(c)) {
            buffer += read()
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    hexadecimal () {
        if (util.isHexDigit(c)) {
            buffer += read()
            lexState = 'hexadecimalInteger'
            return
        }

        throw invalidChar(read())
    },

    hexadecimalInteger () {
        if (util.isHexDigit(c)) {
            buffer += read()
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    string () {
        switch (c) {
        case '\\':
            read()
            buffer += escape()
            return

        case '"':
            if (doubleQuote) {
                read()
                return newToken('string', buffer)
            }

            buffer += read()
            return

        case "'":
            if (!doubleQuote) {
                read()
                return newToken('string', buffer)
            }

            buffer += read()
            return

        case '\n':
        case '\r':
            throw invalidChar(read())

        case '\u2028':
        case '\u2029':
            separatorChar(c)
            break

        case undefined:
            throw invalidChar(read())
        }

        buffer += read()
    },

    start () {
        switch (c) {
        case '{':
        case '[':
            return newToken('punctuator', read())

        // This code is unreachable since the default lexState handles eof.
        // case undefined:
        //     return newToken('eof')
        }

        lexState = 'value'
    },

    beforePropertyName () {
        switch (c) {
        case '$':
        case '_':
            buffer = read()
            lexState = 'identifierName'
            return

        case '\\':
            read()
            lexState = 'identifierNameStartEscape'
            return

        case '}':
            return newToken('punctuator', read())

        case '"':
        case "'":
            doubleQuote = (read() === '"')
            lexState = 'string'
            return
        }

        if (util.isIdStartChar(c)) {
            buffer += read()
            lexState = 'identifierName'
            return
        }

        throw invalidChar(read())
    },

    afterPropertyName () {
        if (c === ':') {
            return newToken('punctuator', read())
        }

        throw invalidChar(read())
    },

    beforePropertyValue () {
        lexState = 'value'
    },

    afterPropertyValue () {
        switch (c) {
        case ',':
        case '}':
            return newToken('punctuator', read())
        }

        throw invalidChar(read())
    },

    beforeArrayValue () {
        if (c === ']') {
            return newToken('punctuator', read())
        }

        lexState = 'value'
    },

    afterArrayValue () {
        switch (c) {
        case ',':
        case ']':
            return newToken('punctuator', read())
        }

        throw invalidChar(read())
    },

    end () {
        // This code is unreachable since it's handled by the default lexState.
        // if (c === undefined) {
        //     read()
        //     return newToken('eof')
        // }

        throw invalidChar(read())
    },
}

function newToken (type, value) {
    return {
        type,
        value,
        line,
        column,
    }
}

function literal (s) {
    for (const c of s) {
        const p = peek()

        if (p !== c) {
            throw invalidChar(read())
        }

        read()
    }
}

function escape () {
    const c = peek()
    switch (c) {
    case 'b':
        read()
        return '\b'

    case 'f':
        read()
        return '\f'

    case 'n':
        read()
        return '\n'

    case 'r':
        read()
        return '\r'

    case 't':
        read()
        return '\t'

    case 'v':
        read()
        return '\v'

    case '0':
        read()
        if (util.isDigit(peek())) {
            throw invalidChar(read())
        }

        return '\0'

    case 'x':
        read()
        return hexEscape()

    case 'u':
        read()
        return unicodeEscape()

    case '\n':
    case '\u2028':
    case '\u2029':
        read()
        return ''

    case '\r':
        read()
        if (peek() === '\n') {
            read()
        }

        return ''

    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
        throw invalidChar(read())

    case undefined:
        throw invalidChar(read())
    }

    return read()
}

function hexEscape () {
    let buffer = ''
    let c = peek()

    if (!util.isHexDigit(c)) {
        throw invalidChar(read())
    }

    buffer += read()

    c = peek()
    if (!util.isHexDigit(c)) {
        throw invalidChar(read())
    }

    buffer += read()

    return String.fromCodePoint(parseInt(buffer, 16))
}

function unicodeEscape () {
    let buffer = ''
    let count = 4

    while (count-- > 0) {
        const c = peek()
        if (!util.isHexDigit(c)) {
            throw invalidChar(read())
        }

        buffer += read()
    }

    return String.fromCodePoint(parseInt(buffer, 16))
}

const parseStates = {
    start () {
        if (token.type === 'eof') {
            throw invalidEOF()
        }

        push()
    },

    beforePropertyName () {
        switch (token.type) {
        case 'identifier':
        case 'string':
            key = token.value
            parseState = 'afterPropertyName'
            return

        case 'punctuator':
            // This code is unreachable since it's handled by the lexState.
            // if (token.value !== '}') {
            //     throw invalidToken()
            // }

            pop()
            return

        case 'eof':
            throw invalidEOF()
        }

        // This code is unreachable since it's handled by the lexState.
        // throw invalidToken()
    },

    afterPropertyName () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'punctuator' || token.value !== ':') {
        //     throw invalidToken()
        // }

        if (token.type === 'eof') {
            throw invalidEOF()
        }

        parseState = 'beforePropertyValue'
    },

    beforePropertyValue () {
        if (token.type === 'eof') {
            throw invalidEOF()
        }

        push()
    },

    beforeArrayValue () {
        if (token.type === 'eof') {
            throw invalidEOF()
        }

        if (token.type === 'punctuator' && token.value === ']') {
            pop()
            return
        }

        push()
    },

    afterPropertyValue () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'punctuator') {
        //     throw invalidToken()
        // }

        if (token.type === 'eof') {
            throw invalidEOF()
        }

        switch (token.value) {
        case ',':
            parseState = 'beforePropertyName'
            return

        case '}':
            pop()
        }

        // This code is unreachable since it's handled by the lexState.
        // throw invalidToken()
    },

    afterArrayValue () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'punctuator') {
        //     throw invalidToken()
        // }

        if (token.type === 'eof') {
            throw invalidEOF()
        }

        switch (token.value) {
        case ',':
            parseState = 'beforeArrayValue'
            return

        case ']':
            pop()
        }

        // This code is unreachable since it's handled by the lexState.
        // throw invalidToken()
    },

    end () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'eof') {
        //     throw invalidToken()
        // }
    },
}

function push () {
    let value

    switch (token.type) {
    case 'punctuator':
        switch (token.value) {
        case '{':
            value = {}
            break

        case '[':
            value = []
            break
        }

        break

    case 'null':
    case 'boolean':
    case 'numeric':
    case 'string':
        value = token.value
        break

    // This code is unreachable.
    // default:
    //     throw invalidToken()
    }

    if (root === undefined) {
        root = value
    } else {
        const parent = stack[stack.length - 1]
        if (Array.isArray(parent)) {
            parent.push(value)
        } else {
            parent[key] = value
        }
    }

    if (value !== null && typeof value === 'object') {
        stack.push(value)

        if (Array.isArray(value)) {
            parseState = 'beforeArrayValue'
        } else {
            parseState = 'beforePropertyName'
        }
    } else {
        const current = stack[stack.length - 1]
        if (current == null) {
            parseState = 'end'
        } else if (Array.isArray(current)) {
            parseState = 'afterArrayValue'
        } else {
            parseState = 'afterPropertyValue'
        }
    }
}

function pop () {
    stack.pop()

    const current = stack[stack.length - 1]
    if (current == null) {
        parseState = 'end'
    } else if (Array.isArray(current)) {
        parseState = 'afterArrayValue'
    } else {
        parseState = 'afterPropertyValue'
    }
}

// This code is unreachable.
// function invalidParseState () {
//     return new Error(`JSON5: invalid parse state '${parseState}'`)
// }

// This code is unreachable.
// function invalidLexState (state) {
//     return new Error(`JSON5: invalid lex state '${state}'`)
// }

function invalidChar (c) {
    if (c === undefined) {
        return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
    }

    return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
}

function invalidEOF () {
    return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
}

// This code is unreachable.
// function invalidToken () {
//     if (token.type === 'eof') {
//         return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
//     }

//     const c = String.fromCodePoint(token.value.codePointAt(0))
//     return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
// }

function invalidIdentifier () {
    column -= 5
    return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`)
}

function separatorChar (c) {
    console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`)
}

function formatChar (c) {
    const replacements = {
        "'": "\\'",
        '"': '\\"',
        '\\': '\\\\',
        '\b': '\\b',
        '\f': '\\f',
        '\n': '\\n',
        '\r': '\\r',
        '\t': '\\t',
        '\v': '\\v',
        '\0': '\\0',
        '\u2028': '\\u2028',
        '\u2029': '\\u2029',
    }

    if (replacements[c]) {
        return replacements[c]
    }

    if (c < ' ') {
        const hexString = c.charCodeAt(0).toString(16)
        return '\\x' + ('00' + hexString).substring(hexString.length)
    }

    return c
}

function syntaxError (message) {
    const err = new SyntaxError(message)
    err.lineNumber = line
    err.columnNumber = column
    return err
}
const fs = require('fs')
const JSON5 = require('./')

// eslint-disable-next-line node/no-deprecated-api
require.extensions['.json5'] = function (module, filename) {
    const content = fs.readFileSync(filename, 'utf8')
    try {
        module.exports = JSON5.parse(content)
    } catch (err) {
        err.message = filename + ': ' + err.message
        throw err
    }
}
// This file is for backward compatibility with v0.5.1.
require('./register')

console.warn("'json5/require' is deprecated. Please use 'json5/register' instead.")
const util = require('./util')

module.exports = function stringify (value, replacer, space) {
    const stack = []
    let indent = ''
    let propertyList
    let replacerFunc
    let gap = ''
    let quote

    if (
        replacer != null &&
        typeof replacer === 'object' &&
        !Array.isArray(replacer)
    ) {
        space = replacer.space
        quote = replacer.quote
        replacer = replacer.replacer
    }

    if (typeof replacer === 'function') {
        replacerFunc = replacer
    } else if (Array.isArray(replacer)) {
        propertyList = []
        for (const v of replacer) {
            let item

            if (typeof v === 'string') {
                item = v
            } else if (
                typeof v === 'number' ||
                v instanceof String ||
                v instanceof Number
            ) {
                item = String(v)
            }

            if (item !== undefined && propertyList.indexOf(item) < 0) {
                propertyList.push(item)
            }
        }
    }

    if (space instanceof Number) {
        space = Number(space)
    } else if (space instanceof String) {
        space = String(space)
    }

    if (typeof space === 'number') {
        if (space > 0) {
            space = Math.min(10, Math.floor(space))
            gap = '          '.substr(0, space)
        }
    } else if (typeof space === 'string') {
        gap = space.substr(0, 10)
    }

    return serializeProperty('', {'': value})

    function serializeProperty (key, holder) {
        let value = holder[key]
        if (value != null) {
            if (typeof value.toJSON5 === 'function') {
                value = value.toJSON5(key)
            } else if (typeof value.toJSON === 'function') {
                value = value.toJSON(key)
            }
        }

        if (replacerFunc) {
            value = replacerFunc.call(holder, key, value)
        }

        if (value instanceof Number) {
            value = Number(value)
        } else if (value instanceof String) {
            value = String(value)
        } else if (value instanceof Boolean) {
            value = value.valueOf()
        }

        switch (value) {
        case null: return 'null'
        case true: return 'true'
        case false: return 'false'
        }

        if (typeof value === 'string') {
            return quoteString(value, false)
        }

        if (typeof value === 'number') {
            return String(value)
        }

        if (typeof value === 'object') {
            return Array.isArray(value) ? serializeArray(value) : serializeObject(value)
        }

        return undefined
    }

    function quoteString (value) {
        const quotes = {
            "'": 0.1,
            '"': 0.2,
        }

        const replacements = {
            "'": "\\'",
            '"': '\\"',
            '\\': '\\\\',
            '\b': '\\b',
            '\f': '\\f',
            '\n': '\\n',
            '\r': '\\r',
            '\t': '\\t',
            '\v': '\\v',
            '\0': '\\0',
            '\u2028': '\\u2028',
            '\u2029': '\\u2029',
        }

        let product = ''

        for (let i = 0; i < value.length; i++) {
            const c = value[i]
            switch (c) {
            case "'":
            case '"':
                quotes[c]++
                product += c
                continue

            case '\0':
                if (util.isDigit(value[i + 1])) {
                    product += '\\x00'
                    continue
                }
            }

            if (replacements[c]) {
                product += replacements[c]
                continue
            }

            if (c < ' ') {
                let hexString = c.charCodeAt(0).toString(16)
                product += '\\x' + ('00' + hexString).substring(hexString.length)
                continue
            }

            product += c
        }

        const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b)

        product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar])

        return quoteChar + product + quoteChar
    }

    function serializeObject (value) {
        if (stack.indexOf(value) >= 0) {
            throw TypeError('Converting circular structure to JSON5')
        }

        stack.push(value)

        let stepback = indent
        indent = indent + gap

        let keys = propertyList || Object.keys(value)
        let partial = []
        for (const key of keys) {
            const propertyString = serializeProperty(key, value)
            if (propertyString !== undefined) {
                let member = serializeKey(key) + ':'
                if (gap !== '') {
                    member += ' '
                }
                member += propertyString
                partial.push(member)
            }
        }

        let final
        if (partial.length === 0) {
            final = '{}'
        } else {
            let properties
            if (gap === '') {
                properties = partial.join(',')
                final = '{' + properties + '}'
            } else {
                let separator = ',\n' + indent
                properties = partial.join(separator)
                final = '{\n' + indent + properties + ',\n' + stepback + '}'
            }
        }

        stack.pop()
        indent = stepback
        return final
    }

    function serializeKey (key) {
        if (key.length === 0) {
            return quoteString(key, true)
        }

        const firstChar = String.fromCodePoint(key.codePointAt(0))
        if (!util.isIdStartChar(firstChar)) {
            return quoteString(key, true)
        }

        for (let i = firstChar.length; i < key.length; i++) {
            if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {
                return quoteString(key, true)
            }
        }

        return key
    }

    function serializeArray (value) {
        if (stack.indexOf(value) >= 0) {
            throw TypeError('Converting circular structure to JSON5')
        }

        stack.push(value)

        let stepback = indent
        indent = indent + gap

        let partial = []
        for (let i = 0; i < value.length; i++) {
            const propertyString = serializeProperty(String(i), value)
            partial.push((propertyString !== undefined) ? propertyString : 'null')
        }

        let final
        if (partial.length === 0) {
            final = '[]'
        } else {
            if (gap === '') {
                let properties = partial.join(',')
                final = '[' + properties + ']'
            } else {
                let separator = ',\n' + indent
                let properties = partial.join(separator)
                final = '[\n' + indent + properties + ',\n' + stepback + ']'
            }
        }

        stack.pop()
        indent = stepback
        return final
    }
}
// This is a generated file. Do not edit.
module.exports.Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/
module.exports.ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/
module.exports.ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
const unicode = require('../lib/unicode')

module.exports = {
    isSpaceSeparator (c) {
        return typeof c === 'string' && unicode.Space_Separator.test(c)
    },

    isIdStartChar (c) {
        return typeof c === 'string' && (
            (c >= 'a' && c <= 'z') ||
        (c >= 'A' && c <= 'Z') ||
        (c === '$') || (c === '_') ||
        unicode.ID_Start.test(c)
        )
    },

    isIdContinueChar (c) {
        return typeof c === 'string' && (
            (c >= 'a' && c <= 'z') ||
        (c >= 'A' && c <= 'Z') ||
        (c >= '0' && c <= '9') ||
        (c === '$') || (c === '_') ||
        (c === '\u200C') || (c === '\u200D') ||
        unicode.ID_Continue.test(c)
        )
    },

    isDigit (c) {
        return typeof c === 'string' && /[0-9]/.test(c)
    },

    isHexDigit (c) {
        return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)
    },
}
(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
	typeof define === 'function' && define.amd ? define(factory) :
	(global.JSON5 = factory());
}(this, (function () { 'use strict';

	function createCommonjsModule(fn, module) {
		return module = { exports: {} }, fn(module, module.exports), module.exports;
	}

	var _global = createCommonjsModule(function (module) {
	// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
	var global = module.exports = typeof window != 'undefined' && window.Math == Math
	  ? window : typeof self != 'undefined' && self.Math == Math ? self
	  // eslint-disable-next-line no-new-func
	  : Function('return this')();
	if (typeof __g == 'number') { __g = global; } // eslint-disable-line no-undef
	});

	var _core = createCommonjsModule(function (module) {
	var core = module.exports = { version: '2.6.5' };
	if (typeof __e == 'number') { __e = core; } // eslint-disable-line no-undef
	});
	var _core_1 = _core.version;

	var _isObject = function (it) {
	  return typeof it === 'object' ? it !== null : typeof it === 'function';
	};

	var _anObject = function (it) {
	  if (!_isObject(it)) { throw TypeError(it + ' is not an object!'); }
	  return it;
	};

	var _fails = function (exec) {
	  try {
	    return !!exec();
	  } catch (e) {
	    return true;
	  }
	};

	// Thank's IE8 for his funny defineProperty
	var _descriptors = !_fails(function () {
	  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
	});

	var document = _global.document;
	// typeof document.createElement is 'object' in old IE
	var is = _isObject(document) && _isObject(document.createElement);
	var _domCreate = function (it) {
	  return is ? document.createElement(it) : {};
	};

	var _ie8DomDefine = !_descriptors && !_fails(function () {
	  return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;
	});

	// 7.1.1 ToPrimitive(input [, PreferredType])

	// instead of the ES6 spec version, we didn't implement @@toPrimitive case
	// and the second argument - flag - preferred type is a string
	var _toPrimitive = function (it, S) {
	  if (!_isObject(it)) { return it; }
	  var fn, val;
	  if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) { return val; }
	  if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) { return val; }
	  if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) { return val; }
	  throw TypeError("Can't convert object to primitive value");
	};

	var dP = Object.defineProperty;

	var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
	  _anObject(O);
	  P = _toPrimitive(P, true);
	  _anObject(Attributes);
	  if (_ie8DomDefine) { try {
	    return dP(O, P, Attributes);
	  } catch (e) { /* empty */ } }
	  if ('get' in Attributes || 'set' in Attributes) { throw TypeError('Accessors not supported!'); }
	  if ('value' in Attributes) { O[P] = Attributes.value; }
	  return O;
	};

	var _objectDp = {
		f: f
	};

	var _propertyDesc = function (bitmap, value) {
	  return {
	    enumerable: !(bitmap & 1),
	    configurable: !(bitmap & 2),
	    writable: !(bitmap & 4),
	    value: value
	  };
	};

	var _hide = _descriptors ? function (object, key, value) {
	  return _objectDp.f(object, key, _propertyDesc(1, value));
	} : function (object, key, value) {
	  object[key] = value;
	  return object;
	};

	var hasOwnProperty = {}.hasOwnProperty;
	var _has = function (it, key) {
	  return hasOwnProperty.call(it, key);
	};

	var id = 0;
	var px = Math.random();
	var _uid = function (key) {
	  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
	};

	var _library = false;

	var _shared = createCommonjsModule(function (module) {
	var SHARED = '__core-js_shared__';
	var store = _global[SHARED] || (_global[SHARED] = {});

	(module.exports = function (key, value) {
	  return store[key] || (store[key] = value !== undefined ? value : {});
	})('versions', []).push({
	  version: _core.version,
	  mode: _library ? 'pure' : 'global',
	  copyright: 'Â© 2019 Denis Pushkarev (zloirock.ru)'
	});
	});

	var _functionToString = _shared('native-function-to-string', Function.toString);

	var _redefine = createCommonjsModule(function (module) {
	var SRC = _uid('src');

	var TO_STRING = 'toString';
	var TPL = ('' + _functionToString).split(TO_STRING);

	_core.inspectSource = function (it) {
	  return _functionToString.call(it);
	};

	(module.exports = function (O, key, val, safe) {
	  var isFunction = typeof val == 'function';
	  if (isFunction) { _has(val, 'name') || _hide(val, 'name', key); }
	  if (O[key] === val) { return; }
	  if (isFunction) { _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); }
	  if (O === _global) {
	    O[key] = val;
	  } else if (!safe) {
	    delete O[key];
	    _hide(O, key, val);
	  } else if (O[key]) {
	    O[key] = val;
	  } else {
	    _hide(O, key, val);
	  }
	// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
	})(Function.prototype, TO_STRING, function toString() {
	  return typeof this == 'function' && this[SRC] || _functionToString.call(this);
	});
	});

	var _aFunction = function (it) {
	  if (typeof it != 'function') { throw TypeError(it + ' is not a function!'); }
	  return it;
	};

	// optional / simple context binding

	var _ctx = function (fn, that, length) {
	  _aFunction(fn);
	  if (that === undefined) { return fn; }
	  switch (length) {
	    case 1: return function (a) {
	      return fn.call(that, a);
	    };
	    case 2: return function (a, b) {
	      return fn.call(that, a, b);
	    };
	    case 3: return function (a, b, c) {
	      return fn.call(that, a, b, c);
	    };
	  }
	  return function (/* ...args */) {
	    return fn.apply(that, arguments);
	  };
	};

	var PROTOTYPE = 'prototype';

	var $export = function (type, name, source) {
	  var IS_FORCED = type & $export.F;
	  var IS_GLOBAL = type & $export.G;
	  var IS_STATIC = type & $export.S;
	  var IS_PROTO = type & $export.P;
	  var IS_BIND = type & $export.B;
	  var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE];
	  var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});
	  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
	  var key, own, out, exp;
	  if (IS_GLOBAL) { source = name; }
	  for (key in source) {
	    // contains in native
	    own = !IS_FORCED && target && target[key] !== undefined;
	    // export native or passed
	    out = (own ? target : source)[key];
	    // bind timers to global for call from export context
	    exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;
	    // extend global
	    if (target) { _redefine(target, key, out, type & $export.U); }
	    // export
	    if (exports[key] != out) { _hide(exports, key, exp); }
	    if (IS_PROTO && expProto[key] != out) { expProto[key] = out; }
	  }
	};
	_global.core = _core;
	// type bitmap
	$export.F = 1;   // forced
	$export.G = 2;   // global
	$export.S = 4;   // static
	$export.P = 8;   // proto
	$export.B = 16;  // bind
	$export.W = 32;  // wrap
	$export.U = 64;  // safe
	$export.R = 128; // real proto method for `library`
	var _export = $export;

	// 7.1.4 ToInteger
	var ceil = Math.ceil;
	var floor = Math.floor;
	var _toInteger = function (it) {
	  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
	};

	// 7.2.1 RequireObjectCoercible(argument)
	var _defined = function (it) {
	  if (it == undefined) { throw TypeError("Can't call method on  " + it); }
	  return it;
	};

	// true  -> String#at
	// false -> String#codePointAt
	var _stringAt = function (TO_STRING) {
	  return function (that, pos) {
	    var s = String(_defined(that));
	    var i = _toInteger(pos);
	    var l = s.length;
	    var a, b;
	    if (i < 0 || i >= l) { return TO_STRING ? '' : undefined; }
	    a = s.charCodeAt(i);
	    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
	      ? TO_STRING ? s.charAt(i) : a
	      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
	  };
	};

	var $at = _stringAt(false);
	_export(_export.P, 'String', {
	  // 21.1.3.3 String.prototype.codePointAt(pos)
	  codePointAt: function codePointAt(pos) {
	    return $at(this, pos);
	  }
	});

	var codePointAt = _core.String.codePointAt;

	var max = Math.max;
	var min = Math.min;
	var _toAbsoluteIndex = function (index, length) {
	  index = _toInteger(index);
	  return index < 0 ? max(index + length, 0) : min(index, length);
	};

	var fromCharCode = String.fromCharCode;
	var $fromCodePoint = String.fromCodePoint;

	// length should be 1, old FF problem
	_export(_export.S + _export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
	  // 21.1.2.2 String.fromCodePoint(...codePoints)
	  fromCodePoint: function fromCodePoint(x) {
	    var arguments$1 = arguments;
	 // eslint-disable-line no-unused-vars
	    var res = [];
	    var aLen = arguments.length;
	    var i = 0;
	    var code;
	    while (aLen > i) {
	      code = +arguments$1[i++];
	      if (_toAbsoluteIndex(code, 0x10ffff) !== code) { throw RangeError(code + ' is not a valid code point'); }
	      res.push(code < 0x10000
	        ? fromCharCode(code)
	        : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)
	      );
	    } return res.join('');
	  }
	});

	var fromCodePoint = _core.String.fromCodePoint;

	// This is a generated file. Do not edit.
	var Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/;
	var ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/;
	var ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/;

	var unicode = {
		Space_Separator: Space_Separator,
		ID_Start: ID_Start,
		ID_Continue: ID_Continue
	};

	var util = {
	    isSpaceSeparator: function isSpaceSeparator (c) {
	        return typeof c === 'string' && unicode.Space_Separator.test(c)
	    },

	    isIdStartChar: function isIdStartChar (c) {
	        return typeof c === 'string' && (
	            (c >= 'a' && c <= 'z') ||
	        (c >= 'A' && c <= 'Z') ||
	        (c === '$') || (c === '_') ||
	        unicode.ID_Start.test(c)
	        )
	    },

	    isIdContinueChar: function isIdContinueChar (c) {
	        return typeof c === 'string' && (
	            (c >= 'a' && c <= 'z') ||
	        (c >= 'A' && c <= 'Z') ||
	        (c >= '0' && c <= '9') ||
	        (c === '$') || (c === '_') ||
	        (c === '\u200C') || (c === '\u200D') ||
	        unicode.ID_Continue.test(c)
	        )
	    },

	    isDigit: function isDigit (c) {
	        return typeof c === 'string' && /[0-9]/.test(c)
	    },

	    isHexDigit: function isHexDigit (c) {
	        return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)
	    },
	};

	var source;
	var parseState;
	var stack;
	var pos;
	var line;
	var column;
	var token;
	var key;
	var root;

	var parse = function parse (text, reviver) {
	    source = String(text);
	    parseState = 'start';
	    stack = [];
	    pos = 0;
	    line = 1;
	    column = 0;
	    token = undefined;
	    key = undefined;
	    root = undefined;

	    do {
	        token = lex();

	        // This code is unreachable.
	        // if (!parseStates[parseState]) {
	        //     throw invalidParseState()
	        // }

	        parseStates[parseState]();
	    } while (token.type !== 'eof')

	    if (typeof reviver === 'function') {
	        return internalize({'': root}, '', reviver)
	    }

	    return root
	};

	function internalize (holder, name, reviver) {
	    var value = holder[name];
	    if (value != null && typeof value === 'object') {
	        for (var key in value) {
	            var replacement = internalize(value, key, reviver);
	            if (replacement === undefined) {
	                delete value[key];
	            } else {
	                value[key] = replacement;
	            }
	        }
	    }

	    return reviver.call(holder, name, value)
	}

	var lexState;
	var buffer;
	var doubleQuote;
	var sign;
	var c;

	function lex () {
	    lexState = 'default';
	    buffer = '';
	    doubleQuote = false;
	    sign = 1;

	    for (;;) {
	        c = peek();

	        // This code is unreachable.
	        // if (!lexStates[lexState]) {
	        //     throw invalidLexState(lexState)
	        // }

	        var token = lexStates[lexState]();
	        if (token) {
	            return token
	        }
	    }
	}

	function peek () {
	    if (source[pos]) {
	        return String.fromCodePoint(source.codePointAt(pos))
	    }
	}

	function read () {
	    var c = peek();

	    if (c === '\n') {
	        line++;
	        column = 0;
	    } else if (c) {
	        column += c.length;
	    } else {
	        column++;
	    }

	    if (c) {
	        pos += c.length;
	    }

	    return c
	}

	var lexStates = {
	    default: function default$1 () {
	        switch (c) {
	        case '\t':
	        case '\v':
	        case '\f':
	        case ' ':
	        case '\u00A0':
	        case '\uFEFF':
	        case '\n':
	        case '\r':
	        case '\u2028':
	        case '\u2029':
	            read();
	            return

	        case '/':
	            read();
	            lexState = 'comment';
	            return

	        case undefined:
	            read();
	            return newToken('eof')
	        }

	        if (util.isSpaceSeparator(c)) {
	            read();
	            return
	        }

	        // This code is unreachable.
	        // if (!lexStates[parseState]) {
	        //     throw invalidLexState(parseState)
	        // }

	        return lexStates[parseState]()
	    },

	    comment: function comment () {
	        switch (c) {
	        case '*':
	            read();
	            lexState = 'multiLineComment';
	            return

	        case '/':
	            read();
	            lexState = 'singleLineComment';
	            return
	        }

	        throw invalidChar(read())
	    },

	    multiLineComment: function multiLineComment () {
	        switch (c) {
	        case '*':
	            read();
	            lexState = 'multiLineCommentAsterisk';
	            return

	        case undefined:
	            throw invalidChar(read())
	        }

	        read();
	    },

	    multiLineCommentAsterisk: function multiLineCommentAsterisk () {
	        switch (c) {
	        case '*':
	            read();
	            return

	        case '/':
	            read();
	            lexState = 'default';
	            return

	        case undefined:
	            throw invalidChar(read())
	        }

	        read();
	        lexState = 'multiLineComment';
	    },

	    singleLineComment: function singleLineComment () {
	        switch (c) {
	        case '\n':
	        case '\r':
	        case '\u2028':
	        case '\u2029':
	            read();
	            lexState = 'default';
	            return

	        case undefined:
	            read();
	            return newToken('eof')
	        }

	        read();
	    },

	    value: function value () {
	        switch (c) {
	        case '{':
	        case '[':
	            return newToken('punctuator', read())

	        case 'n':
	            read();
	            literal('ull');
	            return newToken('null', null)

	        case 't':
	            read();
	            literal('rue');
	            return newToken('boolean', true)

	        case 'f':
	            read();
	            literal('alse');
	            return newToken('boolean', false)

	        case '-':
	        case '+':
	            if (read() === '-') {
	                sign = -1;
	            }

	            lexState = 'sign';
	            return

	        case '.':
	            buffer = read();
	            lexState = 'decimalPointLeading';
	            return

	        case '0':
	            buffer = read();
	            lexState = 'zero';
	            return

	        case '1':
	        case '2':
	        case '3':
	        case '4':
	        case '5':
	        case '6':
	        case '7':
	        case '8':
	        case '9':
	            buffer = read();
	            lexState = 'decimalInteger';
	            return

	        case 'I':
	            read();
	            literal('nfinity');
	            return newToken('numeric', Infinity)

	        case 'N':
	            read();
	            literal('aN');
	            return newToken('numeric', NaN)

	        case '"':
	        case "'":
	            doubleQuote = (read() === '"');
	            buffer = '';
	            lexState = 'string';
	            return
	        }

	        throw invalidChar(read())
	    },

	    identifierNameStartEscape: function identifierNameStartEscape () {
	        if (c !== 'u') {
	            throw invalidChar(read())
	        }

	        read();
	        var u = unicodeEscape();
	        switch (u) {
	        case '$':
	        case '_':
	            break

	        default:
	            if (!util.isIdStartChar(u)) {
	                throw invalidIdentifier()
	            }

	            break
	        }

	        buffer += u;
	        lexState = 'identifierName';
	    },

	    identifierName: function identifierName () {
	        switch (c) {
	        case '$':
	        case '_':
	        case '\u200C':
	        case '\u200D':
	            buffer += read();
	            return

	        case '\\':
	            read();
	            lexState = 'identifierNameEscape';
	            return
	        }

	        if (util.isIdContinueChar(c)) {
	            buffer += read();
	            return
	        }

	        return newToken('identifier', buffer)
	    },

	    identifierNameEscape: function identifierNameEscape () {
	        if (c !== 'u') {
	            throw invalidChar(read())
	        }

	        read();
	        var u = unicodeEscape();
	        switch (u) {
	        case '$':
	        case '_':
	        case '\u200C':
	        case '\u200D':
	            break

	        default:
	            if (!util.isIdContinueChar(u)) {
	                throw invalidIdentifier()
	            }

	            break
	        }

	        buffer += u;
	        lexState = 'identifierName';
	    },

	    sign: function sign$1 () {
	        switch (c) {
	        case '.':
	            buffer = read();
	            lexState = 'decimalPointLeading';
	            return

	        case '0':
	            buffer = read();
	            lexState = 'zero';
	            return

	        case '1':
	        case '2':
	        case '3':
	        case '4':
	        case '5':
	        case '6':
	        case '7':
	        case '8':
	        case '9':
	            buffer = read();
	            lexState = 'decimalInteger';
	            return

	        case 'I':
	            read();
	            literal('nfinity');
	            return newToken('numeric', sign * Infinity)

	        case 'N':
	            read();
	            literal('aN');
	            return newToken('numeric', NaN)
	        }

	        throw invalidChar(read())
	    },

	    zero: function zero () {
	        switch (c) {
	        case '.':
	            buffer += read();
	            lexState = 'decimalPoint';
	            return

	        case 'e':
	        case 'E':
	            buffer += read();
	            lexState = 'decimalExponent';
	            return

	        case 'x':
	        case 'X':
	            buffer += read();
	            lexState = 'hexadecimal';
	            return
	        }

	        return newToken('numeric', sign * 0)
	    },

	    decimalInteger: function decimalInteger () {
	        switch (c) {
	        case '.':
	            buffer += read();
	            lexState = 'decimalPoint';
	            return

	        case 'e':
	        case 'E':
	            buffer += read();
	            lexState = 'decimalExponent';
	            return
	        }

	        if (util.isDigit(c)) {
	            buffer += read();
	            return
	        }

	        return newToken('numeric', sign * Number(buffer))
	    },

	    decimalPointLeading: function decimalPointLeading () {
	        if (util.isDigit(c)) {
	            buffer += read();
	            lexState = 'decimalFraction';
	            return
	        }

	        throw invalidChar(read())
	    },

	    decimalPoint: function decimalPoint () {
	        switch (c) {
	        case 'e':
	        case 'E':
	            buffer += read();
	            lexState = 'decimalExponent';
	            return
	        }

	        if (util.isDigit(c)) {
	            buffer += read();
	            lexState = 'decimalFraction';
	            return
	        }

	        return newToken('numeric', sign * Number(buffer))
	    },

	    decimalFraction: function decimalFraction () {
	        switch (c) {
	        case 'e':
	        case 'E':
	            buffer += read();
	            lexState = 'decimalExponent';
	            return
	        }

	        if (util.isDigit(c)) {
	            buffer += read();
	            return
	        }

	        return newToken('numeric', sign * Number(buffer))
	    },

	    decimalExponent: function decimalExponent () {
	        switch (c) {
	        case '+':
	        case '-':
	            buffer += read();
	            lexState = 'decimalExponentSign';
	            return
	        }

	        if (util.isDigit(c)) {
	            buffer += read();
	            lexState = 'decimalExponentInteger';
	            return
	        }

	        throw invalidChar(read())
	    },

	    decimalExponentSign: function decimalExponentSign () {
	        if (util.isDigit(c)) {
	            buffer += read();
	            lexState = 'decimalExponentInteger';
	            return
	        }

	        throw invalidChar(read())
	    },

	    decimalExponentInteger: function decimalExponentInteger () {
	        if (util.isDigit(c)) {
	            buffer += read();
	            return
	        }

	        return newToken('numeric', sign * Number(buffer))
	    },

	    hexadecimal: function hexadecimal () {
	        if (util.isHexDigit(c)) {
	            buffer += read();
	            lexState = 'hexadecimalInteger';
	            return
	        }

	        throw invalidChar(read())
	    },

	    hexadecimalInteger: function hexadecimalInteger () {
	        if (util.isHexDigit(c)) {
	            buffer += read();
	            return
	        }

	        return newToken('numeric', sign * Number(buffer))
	    },

	    string: function string () {
	        switch (c) {
	        case '\\':
	            read();
	            buffer += escape();
	            return

	        case '"':
	            if (doubleQuote) {
	                read();
	                return newToken('string', buffer)
	            }

	            buffer += read();
	            return

	        case "'":
	            if (!doubleQuote) {
	                read();
	                return newToken('string', buffer)
	            }

	            buffer += read();
	            return

	        case '\n':
	        case '\r':
	            throw invalidChar(read())

	        case '\u2028':
	        case '\u2029':
	            separatorChar(c);
	            break

	        case undefined:
	            throw invalidChar(read())
	        }

	        buffer += read();
	    },

	    start: function start () {
	        switch (c) {
	        case '{':
	        case '[':
	            return newToken('punctuator', read())

	        // This code is unreachable since the default lexState handles eof.
	        // case undefined:
	        //     return newToken('eof')
	        }

	        lexState = 'value';
	    },

	    beforePropertyName: function beforePropertyName () {
	        switch (c) {
	        case '$':
	        case '_':
	            buffer = read();
	            lexState = 'identifierName';
	            return

	        case '\\':
	            read();
	            lexState = 'identifierNameStartEscape';
	            return

	        case '}':
	            return newToken('punctuator', read())

	        case '"':
	        case "'":
	            doubleQuote = (read() === '"');
	            lexState = 'string';
	            return
	        }

	        if (util.isIdStartChar(c)) {
	            buffer += read();
	            lexState = 'identifierName';
	            return
	        }

	        throw invalidChar(read())
	    },

	    afterPropertyName: function afterPropertyName () {
	        if (c === ':') {
	            return newToken('punctuator', read())
	        }

	        throw invalidChar(read())
	    },

	    beforePropertyValue: function beforePropertyValue () {
	        lexState = 'value';
	    },

	    afterPropertyValue: function afterPropertyValue () {
	        switch (c) {
	        case ',':
	        case '}':
	            return newToken('punctuator', read())
	        }

	        throw invalidChar(read())
	    },

	    beforeArrayValue: function beforeArrayValue () {
	        if (c === ']') {
	            return newToken('punctuator', read())
	        }

	        lexState = 'value';
	    },

	    afterArrayValue: function afterArrayValue () {
	        switch (c) {
	        case ',':
	        case ']':
	            return newToken('punctuator', read())
	        }

	        throw invalidChar(read())
	    },

	    end: function end () {
	        // This code is unreachable since it's handled by the default lexState.
	        // if (c === undefined) {
	        //     read()
	        //     return newToken('eof')
	        // }

	        throw invalidChar(read())
	    },
	};

	function newToken (type, value) {
	    return {
	        type: type,
	        value: value,
	        line: line,
	        column: column,
	    }
	}

	function literal (s) {
	    for (var i = 0, list = s; i < list.length; i += 1) {
	        var c = list[i];

	        var p = peek();

	        if (p !== c) {
	            throw invalidChar(read())
	        }

	        read();
	    }
	}

	function escape () {
	    var c = peek();
	    switch (c) {
	    case 'b':
	        read();
	        return '\b'

	    case 'f':
	        read();
	        return '\f'

	    case 'n':
	        read();
	        return '\n'

	    case 'r':
	        read();
	        return '\r'

	    case 't':
	        read();
	        return '\t'

	    case 'v':
	        read();
	        return '\v'

	    case '0':
	        read();
	        if (util.isDigit(peek())) {
	            throw invalidChar(read())
	        }

	        return '\0'

	    case 'x':
	        read();
	        return hexEscape()

	    case 'u':
	        read();
	        return unicodeEscape()

	    case '\n':
	    case '\u2028':
	    case '\u2029':
	        read();
	        return ''

	    case '\r':
	        read();
	        if (peek() === '\n') {
	            read();
	        }

	        return ''

	    case '1':
	    case '2':
	    case '3':
	    case '4':
	    case '5':
	    case '6':
	    case '7':
	    case '8':
	    case '9':
	        throw invalidChar(read())

	    case undefined:
	        throw invalidChar(read())
	    }

	    return read()
	}

	function hexEscape () {
	    var buffer = '';
	    var c = peek();

	    if (!util.isHexDigit(c)) {
	        throw invalidChar(read())
	    }

	    buffer += read();

	    c = peek();
	    if (!util.isHexDigit(c)) {
	        throw invalidChar(read())
	    }

	    buffer += read();

	    return String.fromCodePoint(parseInt(buffer, 16))
	}

	function unicodeEscape () {
	    var buffer = '';
	    var count = 4;

	    while (count-- > 0) {
	        var c = peek();
	        if (!util.isHexDigit(c)) {
	            throw invalidChar(read())
	        }

	        buffer += read();
	    }

	    return String.fromCodePoint(parseInt(buffer, 16))
	}

	var parseStates = {
	    start: function start () {
	        if (token.type === 'eof') {
	            throw invalidEOF()
	        }

	        push();
	    },

	    beforePropertyName: function beforePropertyName () {
	        switch (token.type) {
	        case 'identifier':
	        case 'string':
	            key = token.value;
	            parseState = 'afterPropertyName';
	            return

	        case 'punctuator':
	            // This code is unreachable since it's handled by the lexState.
	            // if (token.value !== '}') {
	            //     throw invalidToken()
	            // }

	            pop();
	            return

	        case 'eof':
	            throw invalidEOF()
	        }

	        // This code is unreachable since it's handled by the lexState.
	        // throw invalidToken()
	    },

	    afterPropertyName: function afterPropertyName () {
	        // This code is unreachable since it's handled by the lexState.
	        // if (token.type !== 'punctuator' || token.value !== ':') {
	        //     throw invalidToken()
	        // }

	        if (token.type === 'eof') {
	            throw invalidEOF()
	        }

	        parseState = 'beforePropertyValue';
	    },

	    beforePropertyValue: function beforePropertyValue () {
	        if (token.type === 'eof') {
	            throw invalidEOF()
	        }

	        push();
	    },

	    beforeArrayValue: function beforeArrayValue () {
	        if (token.type === 'eof') {
	            throw invalidEOF()
	        }

	        if (token.type === 'punctuator' && token.value === ']') {
	            pop();
	            return
	        }

	        push();
	    },

	    afterPropertyValue: function afterPropertyValue () {
	        // This code is unreachable since it's handled by the lexState.
	        // if (token.type !== 'punctuator') {
	        //     throw invalidToken()
	        // }

	        if (token.type === 'eof') {
	            throw invalidEOF()
	        }

	        switch (token.value) {
	        case ',':
	            parseState = 'beforePropertyName';
	            return

	        case '}':
	            pop();
	        }

	        // This code is unreachable since it's handled by the lexState.
	        // throw invalidToken()
	    },

	    afterArrayValue: function afterArrayValue () {
	        // This code is unreachable since it's handled by the lexState.
	        // if (token.type !== 'punctuator') {
	        //     throw invalidToken()
	        // }

	        if (token.type === 'eof') {
	            throw invalidEOF()
	        }

	        switch (token.value) {
	        case ',':
	            parseState = 'beforeArrayValue';
	            return

	        case ']':
	            pop();
	        }

	        // This code is unreachable since it's handled by the lexState.
	        // throw invalidToken()
	    },

	    end: function end () {
	        // This code is unreachable since it's handled by the lexState.
	        // if (token.type !== 'eof') {
	        //     throw invalidToken()
	        // }
	    },
	};

	function push () {
	    var value;

	    switch (token.type) {
	    case 'punctuator':
	        switch (token.value) {
	        case '{':
	            value = {};
	            break

	        case '[':
	            value = [];
	            break
	        }

	        break

	    case 'null':
	    case 'boolean':
	    case 'numeric':
	    case 'string':
	        value = token.value;
	        break

	    // This code is unreachable.
	    // default:
	    //     throw invalidToken()
	    }

	    if (root === undefined) {
	        root = value;
	    } else {
	        var parent = stack[stack.length - 1];
	        if (Array.isArray(parent)) {
	            parent.push(value);
	        } else {
	            parent[key] = value;
	        }
	    }

	    if (value !== null && typeof value === 'object') {
	        stack.push(value);

	        if (Array.isArray(value)) {
	            parseState = 'beforeArrayValue';
	        } else {
	            parseState = 'beforePropertyName';
	        }
	    } else {
	        var current = stack[stack.length - 1];
	        if (current == null) {
	            parseState = 'end';
	        } else if (Array.isArray(current)) {
	            parseState = 'afterArrayValue';
	        } else {
	            parseState = 'afterPropertyValue';
	        }
	    }
	}

	function pop () {
	    stack.pop();

	    var current = stack[stack.length - 1];
	    if (current == null) {
	        parseState = 'end';
	    } else if (Array.isArray(current)) {
	        parseState = 'afterArrayValue';
	    } else {
	        parseState = 'afterPropertyValue';
	    }
	}

	// This code is unreachable.
	// function invalidParseState () {
	//     return new Error(`JSON5: invalid parse state '${parseState}'`)
	// }

	// This code is unreachable.
	// function invalidLexState (state) {
	//     return new Error(`JSON5: invalid lex state '${state}'`)
	// }

	function invalidChar (c) {
	    if (c === undefined) {
	        return syntaxError(("JSON5: invalid end of input at " + line + ":" + column))
	    }

	    return syntaxError(("JSON5: invalid character '" + (formatChar(c)) + "' at " + line + ":" + column))
	}

	function invalidEOF () {
	    return syntaxError(("JSON5: invalid end of input at " + line + ":" + column))
	}

	// This code is unreachable.
	// function invalidToken () {
	//     if (token.type === 'eof') {
	//         return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
	//     }

	//     const c = String.fromCodePoint(token.value.codePointAt(0))
	//     return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
	// }

	function invalidIdentifier () {
	    column -= 5;
	    return syntaxError(("JSON5: invalid identifier character at " + line + ":" + column))
	}

	function separatorChar (c) {
	    console.warn(("JSON5: '" + (formatChar(c)) + "' in strings is not valid ECMAScript; consider escaping"));
	}

	function formatChar (c) {
	    var replacements = {
	        "'": "\\'",
	        '"': '\\"',
	        '\\': '\\\\',
	        '\b': '\\b',
	        '\f': '\\f',
	        '\n': '\\n',
	        '\r': '\\r',
	        '\t': '\\t',
	        '\v': '\\v',
	        '\0': '\\0',
	        '\u2028': '\\u2028',
	        '\u2029': '\\u2029',
	    };

	    if (replacements[c]) {
	        return replacements[c]
	    }

	    if (c < ' ') {
	        var hexString = c.charCodeAt(0).toString(16);
	        return '\\x' + ('00' + hexString).substring(hexString.length)
	    }

	    return c
	}

	function syntaxError (message) {
	    var err = new SyntaxError(message);
	    err.lineNumber = line;
	    err.columnNumber = column;
	    return err
	}

	var stringify = function stringify (value, replacer, space) {
	    var stack = [];
	    var indent = '';
	    var propertyList;
	    var replacerFunc;
	    var gap = '';
	    var quote;

	    if (
	        replacer != null &&
	        typeof replacer === 'object' &&
	        !Array.isArray(replacer)
	    ) {
	        space = replacer.space;
	        quote = replacer.quote;
	        replacer = replacer.replacer;
	    }

	    if (typeof replacer === 'function') {
	        replacerFunc = replacer;
	    } else if (Array.isArray(replacer)) {
	        propertyList = [];
	        for (var i = 0, list = replacer; i < list.length; i += 1) {
	            var v = list[i];

	            var item = (void 0);

	            if (typeof v === 'string') {
	                item = v;
	            } else if (
	                typeof v === 'number' ||
	                v instanceof String ||
	                v instanceof Number
	            ) {
	                item = String(v);
	            }

	            if (item !== undefined && propertyList.indexOf(item) < 0) {
	                propertyList.push(item);
	            }
	        }
	    }

	    if (space instanceof Number) {
	        space = Number(space);
	    } else if (space instanceof String) {
	        space = String(space);
	    }

	    if (typeof space === 'number') {
	        if (space > 0) {
	            space = Math.min(10, Math.floor(space));
	            gap = '          '.substr(0, space);
	        }
	    } else if (typeof space === 'string') {
	        gap = space.substr(0, 10);
	    }

	    return serializeProperty('', {'': value})

	    function serializeProperty (key, holder) {
	        var value = holder[key];
	        if (value != null) {
	            if (typeof value.toJSON5 === 'function') {
	                value = value.toJSON5(key);
	            } else if (typeof value.toJSON === 'function') {
	                value = value.toJSON(key);
	            }
	        }

	        if (replacerFunc) {
	            value = replacerFunc.call(holder, key, value);
	        }

	        if (value instanceof Number) {
	            value = Number(value);
	        } else if (value instanceof String) {
	            value = String(value);
	        } else if (value instanceof Boolean) {
	            value = value.valueOf();
	        }

	        switch (value) {
	        case null: return 'null'
	        case true: return 'true'
	        case false: return 'false'
	        }

	        if (typeof value === 'string') {
	            return quoteString(value, false)
	        }

	        if (typeof value === 'number') {
	            return String(value)
	        }

	        if (typeof value === 'object') {
	            return Array.isArray(value) ? serializeArray(value) : serializeObject(value)
	        }

	        return undefined
	    }

	    function quoteString (value) {
	        var quotes = {
	            "'": 0.1,
	            '"': 0.2,
	        };

	        var replacements = {
	            "'": "\\'",
	            '"': '\\"',
	            '\\': '\\\\',
	            '\b': '\\b',
	            '\f': '\\f',
	            '\n': '\\n',
	            '\r': '\\r',
	            '\t': '\\t',
	            '\v': '\\v',
	            '\0': '\\0',
	            '\u2028': '\\u2028',
	            '\u2029': '\\u2029',
	        };

	        var product = '';

	        for (var i = 0; i < value.length; i++) {
	            var c = value[i];
	            switch (c) {
	            case "'":
	            case '"':
	                quotes[c]++;
	                product += c;
	                continue

	            case '\0':
	                if (util.isDigit(value[i + 1])) {
	                    product += '\\x00';
	                    continue
	                }
	            }

	            if (replacements[c]) {
	                product += replacements[c];
	                continue
	            }

	            if (c < ' ') {
	                var hexString = c.charCodeAt(0).toString(16);
	                product += '\\x' + ('00' + hexString).substring(hexString.length);
	                continue
	            }

	            product += c;
	        }

	        var quoteChar = quote || Object.keys(quotes).reduce(function (a, b) { return (quotes[a] < quotes[b]) ? a : b; });

	        product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]);

	        return quoteChar + product + quoteChar
	    }

	    function serializeObject (value) {
	        if (stack.indexOf(value) >= 0) {
	            throw TypeError('Converting circular structure to JSON5')
	        }

	        stack.push(value);

	        var stepback = indent;
	        indent = indent + gap;

	        var keys = propertyList || Object.keys(value);
	        var partial = [];
	        for (var i = 0, list = keys; i < list.length; i += 1) {
	            var key = list[i];

	            var propertyString = serializeProperty(key, value);
	            if (propertyString !== undefined) {
	                var member = serializeKey(key) + ':';
	                if (gap !== '') {
	                    member += ' ';
	                }
	                member += propertyString;
	                partial.push(member);
	            }
	        }

	        var final;
	        if (partial.length === 0) {
	            final = '{}';
	        } else {
	            var properties;
	            if (gap === '') {
	                properties = partial.join(',');
	                final = '{' + properties + '}';
	            } else {
	                var separator = ',\n' + indent;
	                properties = partial.join(separator);
	                final = '{\n' + indent + properties + ',\n' + stepback + '}';
	            }
	        }

	        stack.pop();
	        indent = stepback;
	        return final
	    }

	    function serializeKey (key) {
	        if (key.length === 0) {
	            return quoteString(key, true)
	        }

	        var firstChar = String.fromCodePoint(key.codePointAt(0));
	        if (!util.isIdStartChar(firstChar)) {
	            return quoteString(key, true)
	        }

	        for (var i = firstChar.length; i < key.length; i++) {
	            if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {
	                return quoteString(key, true)
	            }
	        }

	        return key
	    }

	    function serializeArray (value) {
	        if (stack.indexOf(value) >= 0) {
	            throw TypeError('Converting circular structure to JSON5')
	        }

	        stack.push(value);

	        var stepback = indent;
	        indent = indent + gap;

	        var partial = [];
	        for (var i = 0; i < value.length; i++) {
	            var propertyString = serializeProperty(String(i), value);
	            partial.push((propertyString !== undefined) ? propertyString : 'null');
	        }

	        var final;
	        if (partial.length === 0) {
	            final = '[]';
	        } else {
	            if (gap === '') {
	                var properties = partial.join(',');
	                final = '[' + properties + ']';
	            } else {
	                var separator = ',\n' + indent;
	                var properties$1 = partial.join(separator);
	                final = '[\n' + indent + properties$1 + ',\n' + stepback + ']';
	            }
	        }

	        stack.pop();
	        indent = stepback;
	        return final
	    }
	};

	var JSON5 = {
	    parse: parse,
	    stringify: stringify,
	};

	var lib = JSON5;

	var es5 = lib;

	return es5;

})));
!function(u,D){"object"==typeof exports&&"undefined"!=typeof module?module.exports=D():"function"==typeof define&&define.amd?define(D):u.JSON5=D()}(this,function(){"use strict";function u(u,D){return u(D={exports:{}},D.exports),D.exports}var D=u(function(u){var D=u.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=D)}),e=u(function(u){var D=u.exports={version:"2.6.5"};"number"==typeof __e&&(__e=D)}),t=(e.version,function(u){return"object"==typeof u?null!==u:"function"==typeof u}),r=function(u){if(!t(u))throw TypeError(u+" is not an object!");return u},F=function(u){try{return!!u()}catch(u){return!0}},n=!F(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),C=D.document,A=t(C)&&t(C.createElement),i=!n&&!F(function(){return 7!=Object.defineProperty((u="div",A?C.createElement(u):{}),"a",{get:function(){return 7}}).a;var u}),E=Object.defineProperty,o={f:n?Object.defineProperty:function(u,D,e){if(r(u),D=function(u,D){if(!t(u))return u;var e,r;if(D&&"function"==typeof(e=u.toString)&&!t(r=e.call(u)))return r;if("function"==typeof(e=u.valueOf)&&!t(r=e.call(u)))return r;if(!D&&"function"==typeof(e=u.toString)&&!t(r=e.call(u)))return r;throw TypeError("Can't convert object to primitive value")}(D,!0),r(e),i)try{return E(u,D,e)}catch(u){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(u[D]=e.value),u}},a=n?function(u,D,e){return o.f(u,D,function(u,D){return{enumerable:!(1&u),configurable:!(2&u),writable:!(4&u),value:D}}(1,e))}:function(u,D,e){return u[D]=e,u},c={}.hasOwnProperty,B=function(u,D){return c.call(u,D)},s=0,f=Math.random(),l=u(function(u){var t=D["__core-js_shared__"]||(D["__core-js_shared__"]={});(u.exports=function(u,D){return t[u]||(t[u]=void 0!==D?D:{})})("versions",[]).push({version:e.version,mode:"global",copyright:"Â© 2019 Denis Pushkarev (zloirock.ru)"})})("native-function-to-string",Function.toString),d=u(function(u){var t,r="Symbol(".concat(void 0===(t="src")?"":t,")_",(++s+f).toString(36)),F=(""+l).split("toString");e.inspectSource=function(u){return l.call(u)},(u.exports=function(u,e,t,n){var C="function"==typeof t;C&&(B(t,"name")||a(t,"name",e)),u[e]!==t&&(C&&(B(t,r)||a(t,r,u[e]?""+u[e]:F.join(String(e)))),u===D?u[e]=t:n?u[e]?u[e]=t:a(u,e,t):(delete u[e],a(u,e,t)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[r]||l.call(this)})}),v=function(u,D,e){if(function(u){if("function"!=typeof u)throw TypeError(u+" is not a function!")}(u),void 0===D)return u;switch(e){case 1:return function(e){return u.call(D,e)};case 2:return function(e,t){return u.call(D,e,t)};case 3:return function(e,t,r){return u.call(D,e,t,r)}}return function(){return u.apply(D,arguments)}},p=function(u,t,r){var F,n,C,A,i=u&p.F,E=u&p.G,o=u&p.S,c=u&p.P,B=u&p.B,s=E?D:o?D[t]||(D[t]={}):(D[t]||{}).prototype,f=E?e:e[t]||(e[t]={}),l=f.prototype||(f.prototype={});for(F in E&&(r=t),r)C=((n=!i&&s&&void 0!==s[F])?s:r)[F],A=B&&n?v(C,D):c&&"function"==typeof C?v(Function.call,C):C,s&&d(s,F,C,u&p.U),f[F]!=C&&a(f,F,A),c&&l[F]!=C&&(l[F]=C)};D.core=e,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,p.U=64,p.R=128;var h,m=p,g=Math.ceil,y=Math.floor,w=function(u){return isNaN(u=+u)?0:(u>0?y:g)(u)},S=(h=!1,function(u,D){var e,t,r=String(function(u){if(null==u)throw TypeError("Can't call method on  "+u);return u}(u)),F=w(D),n=r.length;return F<0||F>=n?h?"":void 0:(e=r.charCodeAt(F))<55296||e>56319||F+1===n||(t=r.charCodeAt(F+1))<56320||t>57343?h?r.charAt(F):e:h?r.slice(F,F+2):t-56320+(e-55296<<10)+65536});m(m.P,"String",{codePointAt:function(u){return S(this,u)}});e.String.codePointAt;var b=Math.max,x=Math.min,N=String.fromCharCode,P=String.fromCodePoint;m(m.S+m.F*(!!P&&1!=P.length),"String",{fromCodePoint:function(u){for(var D,e,t,r=arguments,F=[],n=arguments.length,C=0;n>C;){if(D=+r[C++],t=1114111,((e=w(e=D))<0?b(e+t,0):x(e,t))!==D)throw RangeError(D+" is not a valid code point");F.push(D<65536?N(D):N(55296+((D-=65536)>>10),D%1024+56320))}return F.join("")}});e.String.fromCodePoint;var _,I,O,j,V,J,M,k,L,T,z,H,$,R,G={Space_Separator:/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue:/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/},U={isSpaceSeparator:function(u){return"string"==typeof u&&G.Space_Separator.test(u)},isIdStartChar:function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||G.ID_Start.test(u))},isIdContinueChar:function(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"â€Œ"===u||"â€�"===u||G.ID_Continue.test(u))},isDigit:function(u){return"string"==typeof u&&/[0-9]/.test(u)},isHexDigit:function(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)}};function Z(){for(T="default",z="",H=!1,$=1;;){R=q();var u=X[T]();if(u)return u}}function q(){if(_[j])return String.fromCodePoint(_.codePointAt(j))}function W(){var u=q();return"\n"===u?(V++,J=0):u?J+=u.length:J++,u&&(j+=u.length),u}var X={default:function(){switch(R){case"\t":case"\v":case"\f":case" ":case"Â ":case"\ufeff":case"\n":case"\r":case"\u2028":case"\u2029":return void W();case"/":return W(),void(T="comment");case void 0:return W(),K("eof")}if(!U.isSpaceSeparator(R))return X[I]();W()},comment:function(){switch(R){case"*":return W(),void(T="multiLineComment");case"/":return W(),void(T="singleLineComment")}throw tu(W())},multiLineComment:function(){switch(R){case"*":return W(),void(T="multiLineCommentAsterisk");case void 0:throw tu(W())}W()},multiLineCommentAsterisk:function(){switch(R){case"*":return void W();case"/":return W(),void(T="default");case void 0:throw tu(W())}W(),T="multiLineComment"},singleLineComment:function(){switch(R){case"\n":case"\r":case"\u2028":case"\u2029":return W(),void(T="default");case void 0:return W(),K("eof")}W()},value:function(){switch(R){case"{":case"[":return K("punctuator",W());case"n":return W(),Q("ull"),K("null",null);case"t":return W(),Q("rue"),K("boolean",!0);case"f":return W(),Q("alse"),K("boolean",!1);case"-":case"+":return"-"===W()&&($=-1),void(T="sign");case".":return z=W(),void(T="decimalPointLeading");case"0":return z=W(),void(T="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return z=W(),void(T="decimalInteger");case"I":return W(),Q("nfinity"),K("numeric",1/0);case"N":return W(),Q("aN"),K("numeric",NaN);case'"':case"'":return H='"'===W(),z="",void(T="string")}throw tu(W())},identifierNameStartEscape:function(){if("u"!==R)throw tu(W());W();var u=Y();switch(u){case"$":case"_":break;default:if(!U.isIdStartChar(u))throw Fu()}z+=u,T="identifierName"},identifierName:function(){switch(R){case"$":case"_":case"â€Œ":case"â€�":return void(z+=W());case"\\":return W(),void(T="identifierNameEscape")}if(!U.isIdContinueChar(R))return K("identifier",z);z+=W()},identifierNameEscape:function(){if("u"!==R)throw tu(W());W();var u=Y();switch(u){case"$":case"_":case"â€Œ":case"â€�":break;default:if(!U.isIdContinueChar(u))throw Fu()}z+=u,T="identifierName"},sign:function(){switch(R){case".":return z=W(),void(T="decimalPointLeading");case"0":return z=W(),void(T="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return z=W(),void(T="decimalInteger");case"I":return W(),Q("nfinity"),K("numeric",$*(1/0));case"N":return W(),Q("aN"),K("numeric",NaN)}throw tu(W())},zero:function(){switch(R){case".":return z+=W(),void(T="decimalPoint");case"e":case"E":return z+=W(),void(T="decimalExponent");case"x":case"X":return z+=W(),void(T="hexadecimal")}return K("numeric",0*$)},decimalInteger:function(){switch(R){case".":return z+=W(),void(T="decimalPoint");case"e":case"E":return z+=W(),void(T="decimalExponent")}if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},decimalPointLeading:function(){if(U.isDigit(R))return z+=W(),void(T="decimalFraction");throw tu(W())},decimalPoint:function(){switch(R){case"e":case"E":return z+=W(),void(T="decimalExponent")}return U.isDigit(R)?(z+=W(),void(T="decimalFraction")):K("numeric",$*Number(z))},decimalFraction:function(){switch(R){case"e":case"E":return z+=W(),void(T="decimalExponent")}if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},decimalExponent:function(){switch(R){case"+":case"-":return z+=W(),void(T="decimalExponentSign")}if(U.isDigit(R))return z+=W(),void(T="decimalExponentInteger");throw tu(W())},decimalExponentSign:function(){if(U.isDigit(R))return z+=W(),void(T="decimalExponentInteger");throw tu(W())},decimalExponentInteger:function(){if(!U.isDigit(R))return K("numeric",$*Number(z));z+=W()},hexadecimal:function(){if(U.isHexDigit(R))return z+=W(),void(T="hexadecimalInteger");throw tu(W())},hexadecimalInteger:function(){if(!U.isHexDigit(R))return K("numeric",$*Number(z));z+=W()},string:function(){switch(R){case"\\":return W(),void(z+=function(){switch(q()){case"b":return W(),"\b";case"f":return W(),"\f";case"n":return W(),"\n";case"r":return W(),"\r";case"t":return W(),"\t";case"v":return W(),"\v";case"0":if(W(),U.isDigit(q()))throw tu(W());return"\0";case"x":return W(),function(){var u="",D=q();if(!U.isHexDigit(D))throw tu(W());if(u+=W(),D=q(),!U.isHexDigit(D))throw tu(W());return u+=W(),String.fromCodePoint(parseInt(u,16))}();case"u":return W(),Y();case"\n":case"\u2028":case"\u2029":return W(),"";case"\r":return W(),"\n"===q()&&W(),"";case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case void 0:throw tu(W())}return W()}());case'"':return H?(W(),K("string",z)):void(z+=W());case"'":return H?void(z+=W()):(W(),K("string",z));case"\n":case"\r":throw tu(W());case"\u2028":case"\u2029":!function(u){console.warn("JSON5: '"+nu(u)+"' in strings is not valid ECMAScript; consider escaping")}(R);break;case void 0:throw tu(W())}z+=W()},start:function(){switch(R){case"{":case"[":return K("punctuator",W())}T="value"},beforePropertyName:function(){switch(R){case"$":case"_":return z=W(),void(T="identifierName");case"\\":return W(),void(T="identifierNameStartEscape");case"}":return K("punctuator",W());case'"':case"'":return H='"'===W(),void(T="string")}if(U.isIdStartChar(R))return z+=W(),void(T="identifierName");throw tu(W())},afterPropertyName:function(){if(":"===R)return K("punctuator",W());throw tu(W())},beforePropertyValue:function(){T="value"},afterPropertyValue:function(){switch(R){case",":case"}":return K("punctuator",W())}throw tu(W())},beforeArrayValue:function(){if("]"===R)return K("punctuator",W());T="value"},afterArrayValue:function(){switch(R){case",":case"]":return K("punctuator",W())}throw tu(W())},end:function(){throw tu(W())}};function K(u,D){return{type:u,value:D,line:V,column:J}}function Q(u){for(var D=0,e=u;D<e.length;D+=1){var t=e[D];if(q()!==t)throw tu(W());W()}}function Y(){for(var u="",D=4;D-- >0;){var e=q();if(!U.isHexDigit(e))throw tu(W());u+=W()}return String.fromCodePoint(parseInt(u,16))}var uu={start:function(){if("eof"===M.type)throw ru();Du()},beforePropertyName:function(){switch(M.type){case"identifier":case"string":return k=M.value,void(I="afterPropertyName");case"punctuator":return void eu();case"eof":throw ru()}},afterPropertyName:function(){if("eof"===M.type)throw ru();I="beforePropertyValue"},beforePropertyValue:function(){if("eof"===M.type)throw ru();Du()},beforeArrayValue:function(){if("eof"===M.type)throw ru();"punctuator"!==M.type||"]"!==M.value?Du():eu()},afterPropertyValue:function(){if("eof"===M.type)throw ru();switch(M.value){case",":return void(I="beforePropertyName");case"}":eu()}},afterArrayValue:function(){if("eof"===M.type)throw ru();switch(M.value){case",":return void(I="beforeArrayValue");case"]":eu()}},end:function(){}};function Du(){var u;switch(M.type){case"punctuator":switch(M.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=M.value}if(void 0===L)L=u;else{var D=O[O.length-1];Array.isArray(D)?D.push(u):D[k]=u}if(null!==u&&"object"==typeof u)O.push(u),I=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{var e=O[O.length-1];I=null==e?"end":Array.isArray(e)?"afterArrayValue":"afterPropertyValue"}}function eu(){O.pop();var u=O[O.length-1];I=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}function tu(u){return Cu(void 0===u?"JSON5: invalid end of input at "+V+":"+J:"JSON5: invalid character '"+nu(u)+"' at "+V+":"+J)}function ru(){return Cu("JSON5: invalid end of input at "+V+":"+J)}function Fu(){return Cu("JSON5: invalid identifier character at "+V+":"+(J-=5))}function nu(u){var D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){var e=u.charCodeAt(0).toString(16);return"\\x"+("00"+e).substring(e.length)}return u}function Cu(u){var D=new SyntaxError(u);return D.lineNumber=V,D.columnNumber=J,D}return{parse:function(u,D){_=String(u),I="start",O=[],j=0,V=1,J=0,M=void 0,k=void 0,L=void 0;do{M=Z(),uu[I]()}while("eof"!==M.type);return"function"==typeof D?function u(D,e,t){var r=D[e];if(null!=r&&"object"==typeof r)for(var F in r){var n=u(r,F,t);void 0===n?delete r[F]:r[F]=n}return t.call(D,e,r)}({"":L},"",D):L},stringify:function(u,D,e){var t,r,F,n=[],C="",A="";if(null==D||"object"!=typeof D||Array.isArray(D)||(e=D.space,F=D.quote,D=D.replacer),"function"==typeof D)r=D;else if(Array.isArray(D)){t=[];for(var i=0,E=D;i<E.length;i+=1){var o=E[i],a=void 0;"string"==typeof o?a=o:("number"==typeof o||o instanceof String||o instanceof Number)&&(a=String(o)),void 0!==a&&t.indexOf(a)<0&&t.push(a)}}return e instanceof Number?e=Number(e):e instanceof String&&(e=String(e)),"number"==typeof e?e>0&&(e=Math.min(10,Math.floor(e)),A="          ".substr(0,e)):"string"==typeof e&&(A=e.substr(0,10)),c("",{"":u});function c(u,D){var e=D[u];switch(null!=e&&("function"==typeof e.toJSON5?e=e.toJSON5(u):"function"==typeof e.toJSON&&(e=e.toJSON(u))),r&&(e=r.call(D,u,e)),e instanceof Number?e=Number(e):e instanceof String?e=String(e):e instanceof Boolean&&(e=e.valueOf()),e){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof e?B(e):"number"==typeof e?String(e):"object"==typeof e?Array.isArray(e)?function(u){if(n.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");n.push(u);var D=C;C+=A;for(var e,t=[],r=0;r<u.length;r++){var F=c(String(r),u);t.push(void 0!==F?F:"null")}if(0===t.length)e="[]";else if(""===A){var i=t.join(",");e="["+i+"]"}else{var E=",\n"+C,o=t.join(E);e="[\n"+C+o+",\n"+D+"]"}return n.pop(),C=D,e}(e):function(u){if(n.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");n.push(u);var D=C;C+=A;for(var e,r,F=t||Object.keys(u),i=[],E=0,o=F;E<o.length;E+=1){var a=o[E],B=c(a,u);if(void 0!==B){var f=s(a)+":";""!==A&&(f+=" "),f+=B,i.push(f)}}if(0===i.length)e="{}";else if(""===A)r=i.join(","),e="{"+r+"}";else{var l=",\n"+C;r=i.join(l),e="{\n"+C+r+",\n"+D+"}"}return n.pop(),C=D,e}(e):void 0}function B(u){for(var D={"'":.1,'"':.2},e={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"},t="",r=0;r<u.length;r++){var n=u[r];switch(n){case"'":case'"':D[n]++,t+=n;continue;case"\0":if(U.isDigit(u[r+1])){t+="\\x00";continue}}if(e[n])t+=e[n];else if(n<" "){var C=n.charCodeAt(0).toString(16);t+="\\x"+("00"+C).substring(C.length)}else t+=n}var A=F||Object.keys(D).reduce(function(u,e){return D[u]<D[e]?u:e});return A+(t=t.replace(new RegExp(A,"g"),e[A]))+A}function s(u){if(0===u.length)return B(u);var D=String.fromCodePoint(u.codePointAt(0));if(!U.isIdStartChar(D))return B(u);for(var e=D.length;e<u.length;e++)if(!U.isIdContinueChar(String.fromCodePoint(u.codePointAt(e))))return B(u);return u}}}});
var Space_Separator=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ID_Start=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ID_Continue=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/,unicode={Space_Separator:Space_Separator,ID_Start:ID_Start,ID_Continue:ID_Continue},util={isSpaceSeparator:u=>"string"==typeof u&&unicode.Space_Separator.test(u),isIdStartChar:u=>"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||unicode.ID_Start.test(u)),isIdContinueChar:u=>"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"â€Œ"===u||"â€�"===u||unicode.ID_Continue.test(u)),isDigit:u=>"string"==typeof u&&/[0-9]/.test(u),isHexDigit:u=>"string"==typeof u&&/[0-9A-Fa-f]/.test(u)};let source,parseState,stack,pos,line,column,token,key,root;var parse=function(u,D){source=String(u),parseState="start",stack=[],pos=0,line=1,column=0,token=void 0,key=void 0,root=void 0;do{token=lex(),parseStates[parseState]()}while("eof"!==token.type);return"function"==typeof D?internalize({"":root},"",D):root};function internalize(u,D,e){const r=u[D];if(null!=r&&"object"==typeof r)for(const u in r){const D=internalize(r,u,e);void 0===D?delete r[u]:r[u]=D}return e.call(u,D,r)}let lexState,buffer,doubleQuote,sign,c;function lex(){for(lexState="default",buffer="",doubleQuote=!1,sign=1;;){c=peek();const u=lexStates[lexState]();if(u)return u}}function peek(){if(source[pos])return String.fromCodePoint(source.codePointAt(pos))}function read(){const u=peek();return"\n"===u?(line++,column=0):u?column+=u.length:column++,u&&(pos+=u.length),u}const lexStates={default(){switch(c){case"\t":case"\v":case"\f":case" ":case"Â ":case"\ufeff":case"\n":case"\r":case"\u2028":case"\u2029":return void read();case"/":return read(),void(lexState="comment");case void 0:return read(),newToken("eof")}if(!util.isSpaceSeparator(c))return lexStates[parseState]();read()},comment(){switch(c){case"*":return read(),void(lexState="multiLineComment");case"/":return read(),void(lexState="singleLineComment")}throw invalidChar(read())},multiLineComment(){switch(c){case"*":return read(),void(lexState="multiLineCommentAsterisk");case void 0:throw invalidChar(read())}read()},multiLineCommentAsterisk(){switch(c){case"*":return void read();case"/":return read(),void(lexState="default");case void 0:throw invalidChar(read())}read(),lexState="multiLineComment"},singleLineComment(){switch(c){case"\n":case"\r":case"\u2028":case"\u2029":return read(),void(lexState="default");case void 0:return read(),newToken("eof")}read()},value(){switch(c){case"{":case"[":return newToken("punctuator",read());case"n":return read(),literal("ull"),newToken("null",null);case"t":return read(),literal("rue"),newToken("boolean",!0);case"f":return read(),literal("alse"),newToken("boolean",!1);case"-":case"+":return"-"===read()&&(sign=-1),void(lexState="sign");case".":return buffer=read(),void(lexState="decimalPointLeading");case"0":return buffer=read(),void(lexState="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return buffer=read(),void(lexState="decimalInteger");case"I":return read(),literal("nfinity"),newToken("numeric",1/0);case"N":return read(),literal("aN"),newToken("numeric",NaN);case'"':case"'":return doubleQuote='"'===read(),buffer="",void(lexState="string")}throw invalidChar(read())},identifierNameStartEscape(){if("u"!==c)throw invalidChar(read());read();const u=unicodeEscape();switch(u){case"$":case"_":break;default:if(!util.isIdStartChar(u))throw invalidIdentifier()}buffer+=u,lexState="identifierName"},identifierName(){switch(c){case"$":case"_":case"â€Œ":case"â€�":return void(buffer+=read());case"\\":return read(),void(lexState="identifierNameEscape")}if(!util.isIdContinueChar(c))return newToken("identifier",buffer);buffer+=read()},identifierNameEscape(){if("u"!==c)throw invalidChar(read());read();const u=unicodeEscape();switch(u){case"$":case"_":case"â€Œ":case"â€�":break;default:if(!util.isIdContinueChar(u))throw invalidIdentifier()}buffer+=u,lexState="identifierName"},sign(){switch(c){case".":return buffer=read(),void(lexState="decimalPointLeading");case"0":return buffer=read(),void(lexState="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return buffer=read(),void(lexState="decimalInteger");case"I":return read(),literal("nfinity"),newToken("numeric",sign*(1/0));case"N":return read(),literal("aN"),newToken("numeric",NaN)}throw invalidChar(read())},zero(){switch(c){case".":return buffer+=read(),void(lexState="decimalPoint");case"e":case"E":return buffer+=read(),void(lexState="decimalExponent");case"x":case"X":return buffer+=read(),void(lexState="hexadecimal")}return newToken("numeric",0*sign)},decimalInteger(){switch(c){case".":return buffer+=read(),void(lexState="decimalPoint");case"e":case"E":return buffer+=read(),void(lexState="decimalExponent")}if(!util.isDigit(c))return newToken("numeric",sign*Number(buffer));buffer+=read()},decimalPointLeading(){if(util.isDigit(c))return buffer+=read(),void(lexState="decimalFraction");throw invalidChar(read())},decimalPoint(){switch(c){case"e":case"E":return buffer+=read(),void(lexState="decimalExponent")}return util.isDigit(c)?(buffer+=read(),void(lexState="decimalFraction")):newToken("numeric",sign*Number(buffer))},decimalFraction(){switch(c){case"e":case"E":return buffer+=read(),void(lexState="decimalExponent")}if(!util.isDigit(c))return newToken("numeric",sign*Number(buffer));buffer+=read()},decimalExponent(){switch(c){case"+":case"-":return buffer+=read(),void(lexState="decimalExponentSign")}if(util.isDigit(c))return buffer+=read(),void(lexState="decimalExponentInteger");throw invalidChar(read())},decimalExponentSign(){if(util.isDigit(c))return buffer+=read(),void(lexState="decimalExponentInteger");throw invalidChar(read())},decimalExponentInteger(){if(!util.isDigit(c))return newToken("numeric",sign*Number(buffer));buffer+=read()},hexadecimal(){if(util.isHexDigit(c))return buffer+=read(),void(lexState="hexadecimalInteger");throw invalidChar(read())},hexadecimalInteger(){if(!util.isHexDigit(c))return newToken("numeric",sign*Number(buffer));buffer+=read()},string(){switch(c){case"\\":return read(),void(buffer+=escape());case'"':return doubleQuote?(read(),newToken("string",buffer)):void(buffer+=read());case"'":return doubleQuote?void(buffer+=read()):(read(),newToken("string",buffer));case"\n":case"\r":throw invalidChar(read());case"\u2028":case"\u2029":separatorChar(c);break;case void 0:throw invalidChar(read())}buffer+=read()},start(){switch(c){case"{":case"[":return newToken("punctuator",read())}lexState="value"},beforePropertyName(){switch(c){case"$":case"_":return buffer=read(),void(lexState="identifierName");case"\\":return read(),void(lexState="identifierNameStartEscape");case"}":return newToken("punctuator",read());case'"':case"'":return doubleQuote='"'===read(),void(lexState="string")}if(util.isIdStartChar(c))return buffer+=read(),void(lexState="identifierName");throw invalidChar(read())},afterPropertyName(){if(":"===c)return newToken("punctuator",read());throw invalidChar(read())},beforePropertyValue(){lexState="value"},afterPropertyValue(){switch(c){case",":case"}":return newToken("punctuator",read())}throw invalidChar(read())},beforeArrayValue(){if("]"===c)return newToken("punctuator",read());lexState="value"},afterArrayValue(){switch(c){case",":case"]":return newToken("punctuator",read())}throw invalidChar(read())},end(){throw invalidChar(read())}};function newToken(u,D){return{type:u,value:D,line:line,column:column}}function literal(u){for(const D of u){if(peek()!==D)throw invalidChar(read());read()}}function escape(){switch(peek()){case"b":return read(),"\b";case"f":return read(),"\f";case"n":return read(),"\n";case"r":return read(),"\r";case"t":return read(),"\t";case"v":return read(),"\v";case"0":if(read(),util.isDigit(peek()))throw invalidChar(read());return"\0";case"x":return read(),hexEscape();case"u":return read(),unicodeEscape();case"\n":case"\u2028":case"\u2029":return read(),"";case"\r":return read(),"\n"===peek()&&read(),"";case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case void 0:throw invalidChar(read())}return read()}function hexEscape(){let u="",D=peek();if(!util.isHexDigit(D))throw invalidChar(read());if(u+=read(),D=peek(),!util.isHexDigit(D))throw invalidChar(read());return u+=read(),String.fromCodePoint(parseInt(u,16))}function unicodeEscape(){let u="",D=4;for(;D-- >0;){const D=peek();if(!util.isHexDigit(D))throw invalidChar(read());u+=read()}return String.fromCodePoint(parseInt(u,16))}const parseStates={start(){if("eof"===token.type)throw invalidEOF();push()},beforePropertyName(){switch(token.type){case"identifier":case"string":return key=token.value,void(parseState="afterPropertyName");case"punctuator":return void pop();case"eof":throw invalidEOF()}},afterPropertyName(){if("eof"===token.type)throw invalidEOF();parseState="beforePropertyValue"},beforePropertyValue(){if("eof"===token.type)throw invalidEOF();push()},beforeArrayValue(){if("eof"===token.type)throw invalidEOF();"punctuator"!==token.type||"]"!==token.value?push():pop()},afterPropertyValue(){if("eof"===token.type)throw invalidEOF();switch(token.value){case",":return void(parseState="beforePropertyName");case"}":pop()}},afterArrayValue(){if("eof"===token.type)throw invalidEOF();switch(token.value){case",":return void(parseState="beforeArrayValue");case"]":pop()}},end(){}};function push(){let u;switch(token.type){case"punctuator":switch(token.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=token.value}if(void 0===root)root=u;else{const D=stack[stack.length-1];Array.isArray(D)?D.push(u):D[key]=u}if(null!==u&&"object"==typeof u)stack.push(u),parseState=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{const u=stack[stack.length-1];parseState=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}}function pop(){stack.pop();const u=stack[stack.length-1];parseState=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}function invalidChar(u){return syntaxError(void 0===u?`JSON5: invalid end of input at ${line}:${column}`:`JSON5: invalid character '${formatChar(u)}' at ${line}:${column}`)}function invalidEOF(){return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)}function invalidIdentifier(){return syntaxError(`JSON5: invalid identifier character at ${line}:${column-=5}`)}function separatorChar(u){console.warn(`JSON5: '${formatChar(u)}' in strings is not valid ECMAScript; consider escaping`)}function formatChar(u){const D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){const D=u.charCodeAt(0).toString(16);return"\\x"+("00"+D).substring(D.length)}return u}function syntaxError(u){const D=new SyntaxError(u);return D.lineNumber=line,D.columnNumber=column,D}var stringify=function(u,D,e){const r=[];let t,F,C,a="",A="";if(null==D||"object"!=typeof D||Array.isArray(D)||(e=D.space,C=D.quote,D=D.replacer),"function"==typeof D)F=D;else if(Array.isArray(D)){t=[];for(const u of D){let D;"string"==typeof u?D=u:("number"==typeof u||u instanceof String||u instanceof Number)&&(D=String(u)),void 0!==D&&t.indexOf(D)<0&&t.push(D)}}return e instanceof Number?e=Number(e):e instanceof String&&(e=String(e)),"number"==typeof e?e>0&&(e=Math.min(10,Math.floor(e)),A="          ".substr(0,e)):"string"==typeof e&&(A=e.substr(0,10)),E("",{"":u});function E(u,D){let e=D[u];switch(null!=e&&("function"==typeof e.toJSON5?e=e.toJSON5(u):"function"==typeof e.toJSON&&(e=e.toJSON(u))),F&&(e=F.call(D,u,e)),e instanceof Number?e=Number(e):e instanceof String?e=String(e):e instanceof Boolean&&(e=e.valueOf()),e){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof e?n(e):"number"==typeof e?String(e):"object"==typeof e?Array.isArray(e)?function(u){if(r.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");r.push(u);let D=a;a+=A;let e,t=[];for(let D=0;D<u.length;D++){const e=E(String(D),u);t.push(void 0!==e?e:"null")}if(0===t.length)e="[]";else if(""===A){let u=t.join(",");e="["+u+"]"}else{let u=",\n"+a,r=t.join(u);e="[\n"+a+r+",\n"+D+"]"}return r.pop(),a=D,e}(e):function(u){if(r.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");r.push(u);let D=a;a+=A;let e,F=t||Object.keys(u),C=[];for(const D of F){const e=E(D,u);if(void 0!==e){let u=i(D)+":";""!==A&&(u+=" "),u+=e,C.push(u)}}if(0===C.length)e="{}";else{let u;if(""===A)u=C.join(","),e="{"+u+"}";else{let r=",\n"+a;u=C.join(r),e="{\n"+a+u+",\n"+D+"}"}}return r.pop(),a=D,e}(e):void 0}function n(u){const D={"'":.1,'"':.2},e={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};let r="";for(let t=0;t<u.length;t++){const F=u[t];switch(F){case"'":case'"':D[F]++,r+=F;continue;case"\0":if(util.isDigit(u[t+1])){r+="\\x00";continue}}if(e[F])r+=e[F];else if(F<" "){let u=F.charCodeAt(0).toString(16);r+="\\x"+("00"+u).substring(u.length)}else r+=F}const t=C||Object.keys(D).reduce((u,e)=>D[u]<D[e]?u:e);return t+(r=r.replace(new RegExp(t,"g"),e[t]))+t}function i(u){if(0===u.length)return n(u);const D=String.fromCodePoint(u.codePointAt(0));if(!util.isIdStartChar(D))return n(u);for(let e=D.length;e<u.length;e++)if(!util.isIdContinueChar(String.fromCodePoint(u.codePointAt(e))))return n(u);return u}};const JSON5={parse:parse,stringify:stringify};var lib=JSON5;export default lib;
// This is a generated file. Do not edit.
var Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/;
var ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/;
var ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/;

var unicode = {
	Space_Separator: Space_Separator,
	ID_Start: ID_Start,
	ID_Continue: ID_Continue
};

var util = {
    isSpaceSeparator (c) {
        return typeof c === 'string' && unicode.Space_Separator.test(c)
    },

    isIdStartChar (c) {
        return typeof c === 'string' && (
            (c >= 'a' && c <= 'z') ||
        (c >= 'A' && c <= 'Z') ||
        (c === '$') || (c === '_') ||
        unicode.ID_Start.test(c)
        )
    },

    isIdContinueChar (c) {
        return typeof c === 'string' && (
            (c >= 'a' && c <= 'z') ||
        (c >= 'A' && c <= 'Z') ||
        (c >= '0' && c <= '9') ||
        (c === '$') || (c === '_') ||
        (c === '\u200C') || (c === '\u200D') ||
        unicode.ID_Continue.test(c)
        )
    },

    isDigit (c) {
        return typeof c === 'string' && /[0-9]/.test(c)
    },

    isHexDigit (c) {
        return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)
    },
};

let source;
let parseState;
let stack;
let pos;
let line;
let column;
let token;
let key;
let root;

var parse = function parse (text, reviver) {
    source = String(text);
    parseState = 'start';
    stack = [];
    pos = 0;
    line = 1;
    column = 0;
    token = undefined;
    key = undefined;
    root = undefined;

    do {
        token = lex();

        // This code is unreachable.
        // if (!parseStates[parseState]) {
        //     throw invalidParseState()
        // }

        parseStates[parseState]();
    } while (token.type !== 'eof')

    if (typeof reviver === 'function') {
        return internalize({'': root}, '', reviver)
    }

    return root
};

function internalize (holder, name, reviver) {
    const value = holder[name];
    if (value != null && typeof value === 'object') {
        for (const key in value) {
            const replacement = internalize(value, key, reviver);
            if (replacement === undefined) {
                delete value[key];
            } else {
                value[key] = replacement;
            }
        }
    }

    return reviver.call(holder, name, value)
}

let lexState;
let buffer;
let doubleQuote;
let sign;
let c;

function lex () {
    lexState = 'default';
    buffer = '';
    doubleQuote = false;
    sign = 1;

    for (;;) {
        c = peek();

        // This code is unreachable.
        // if (!lexStates[lexState]) {
        //     throw invalidLexState(lexState)
        // }

        const token = lexStates[lexState]();
        if (token) {
            return token
        }
    }
}

function peek () {
    if (source[pos]) {
        return String.fromCodePoint(source.codePointAt(pos))
    }
}

function read () {
    const c = peek();

    if (c === '\n') {
        line++;
        column = 0;
    } else if (c) {
        column += c.length;
    } else {
        column++;
    }

    if (c) {
        pos += c.length;
    }

    return c
}

const lexStates = {
    default () {
        switch (c) {
        case '\t':
        case '\v':
        case '\f':
        case ' ':
        case '\u00A0':
        case '\uFEFF':
        case '\n':
        case '\r':
        case '\u2028':
        case '\u2029':
            read();
            return

        case '/':
            read();
            lexState = 'comment';
            return

        case undefined:
            read();
            return newToken('eof')
        }

        if (util.isSpaceSeparator(c)) {
            read();
            return
        }

        // This code is unreachable.
        // if (!lexStates[parseState]) {
        //     throw invalidLexState(parseState)
        // }

        return lexStates[parseState]()
    },

    comment () {
        switch (c) {
        case '*':
            read();
            lexState = 'multiLineComment';
            return

        case '/':
            read();
            lexState = 'singleLineComment';
            return
        }

        throw invalidChar(read())
    },

    multiLineComment () {
        switch (c) {
        case '*':
            read();
            lexState = 'multiLineCommentAsterisk';
            return

        case undefined:
            throw invalidChar(read())
        }

        read();
    },

    multiLineCommentAsterisk () {
        switch (c) {
        case '*':
            read();
            return

        case '/':
            read();
            lexState = 'default';
            return

        case undefined:
            throw invalidChar(read())
        }

        read();
        lexState = 'multiLineComment';
    },

    singleLineComment () {
        switch (c) {
        case '\n':
        case '\r':
        case '\u2028':
        case '\u2029':
            read();
            lexState = 'default';
            return

        case undefined:
            read();
            return newToken('eof')
        }

        read();
    },

    value () {
        switch (c) {
        case '{':
        case '[':
            return newToken('punctuator', read())

        case 'n':
            read();
            literal('ull');
            return newToken('null', null)

        case 't':
            read();
            literal('rue');
            return newToken('boolean', true)

        case 'f':
            read();
            literal('alse');
            return newToken('boolean', false)

        case '-':
        case '+':
            if (read() === '-') {
                sign = -1;
            }

            lexState = 'sign';
            return

        case '.':
            buffer = read();
            lexState = 'decimalPointLeading';
            return

        case '0':
            buffer = read();
            lexState = 'zero';
            return

        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            buffer = read();
            lexState = 'decimalInteger';
            return

        case 'I':
            read();
            literal('nfinity');
            return newToken('numeric', Infinity)

        case 'N':
            read();
            literal('aN');
            return newToken('numeric', NaN)

        case '"':
        case "'":
            doubleQuote = (read() === '"');
            buffer = '';
            lexState = 'string';
            return
        }

        throw invalidChar(read())
    },

    identifierNameStartEscape () {
        if (c !== 'u') {
            throw invalidChar(read())
        }

        read();
        const u = unicodeEscape();
        switch (u) {
        case '$':
        case '_':
            break

        default:
            if (!util.isIdStartChar(u)) {
                throw invalidIdentifier()
            }

            break
        }

        buffer += u;
        lexState = 'identifierName';
    },

    identifierName () {
        switch (c) {
        case '$':
        case '_':
        case '\u200C':
        case '\u200D':
            buffer += read();
            return

        case '\\':
            read();
            lexState = 'identifierNameEscape';
            return
        }

        if (util.isIdContinueChar(c)) {
            buffer += read();
            return
        }

        return newToken('identifier', buffer)
    },

    identifierNameEscape () {
        if (c !== 'u') {
            throw invalidChar(read())
        }

        read();
        const u = unicodeEscape();
        switch (u) {
        case '$':
        case '_':
        case '\u200C':
        case '\u200D':
            break

        default:
            if (!util.isIdContinueChar(u)) {
                throw invalidIdentifier()
            }

            break
        }

        buffer += u;
        lexState = 'identifierName';
    },

    sign () {
        switch (c) {
        case '.':
            buffer = read();
            lexState = 'decimalPointLeading';
            return

        case '0':
            buffer = read();
            lexState = 'zero';
            return

        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            buffer = read();
            lexState = 'decimalInteger';
            return

        case 'I':
            read();
            literal('nfinity');
            return newToken('numeric', sign * Infinity)

        case 'N':
            read();
            literal('aN');
            return newToken('numeric', NaN)
        }

        throw invalidChar(read())
    },

    zero () {
        switch (c) {
        case '.':
            buffer += read();
            lexState = 'decimalPoint';
            return

        case 'e':
        case 'E':
            buffer += read();
            lexState = 'decimalExponent';
            return

        case 'x':
        case 'X':
            buffer += read();
            lexState = 'hexadecimal';
            return
        }

        return newToken('numeric', sign * 0)
    },

    decimalInteger () {
        switch (c) {
        case '.':
            buffer += read();
            lexState = 'decimalPoint';
            return

        case 'e':
        case 'E':
            buffer += read();
            lexState = 'decimalExponent';
            return
        }

        if (util.isDigit(c)) {
            buffer += read();
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    decimalPointLeading () {
        if (util.isDigit(c)) {
            buffer += read();
            lexState = 'decimalFraction';
            return
        }

        throw invalidChar(read())
    },

    decimalPoint () {
        switch (c) {
        case 'e':
        case 'E':
            buffer += read();
            lexState = 'decimalExponent';
            return
        }

        if (util.isDigit(c)) {
            buffer += read();
            lexState = 'decimalFraction';
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    decimalFraction () {
        switch (c) {
        case 'e':
        case 'E':
            buffer += read();
            lexState = 'decimalExponent';
            return
        }

        if (util.isDigit(c)) {
            buffer += read();
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    decimalExponent () {
        switch (c) {
        case '+':
        case '-':
            buffer += read();
            lexState = 'decimalExponentSign';
            return
        }

        if (util.isDigit(c)) {
            buffer += read();
            lexState = 'decimalExponentInteger';
            return
        }

        throw invalidChar(read())
    },

    decimalExponentSign () {
        if (util.isDigit(c)) {
            buffer += read();
            lexState = 'decimalExponentInteger';
            return
        }

        throw invalidChar(read())
    },

    decimalExponentInteger () {
        if (util.isDigit(c)) {
            buffer += read();
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    hexadecimal () {
        if (util.isHexDigit(c)) {
            buffer += read();
            lexState = 'hexadecimalInteger';
            return
        }

        throw invalidChar(read())
    },

    hexadecimalInteger () {
        if (util.isHexDigit(c)) {
            buffer += read();
            return
        }

        return newToken('numeric', sign * Number(buffer))
    },

    string () {
        switch (c) {
        case '\\':
            read();
            buffer += escape();
            return

        case '"':
            if (doubleQuote) {
                read();
                return newToken('string', buffer)
            }

            buffer += read();
            return

        case "'":
            if (!doubleQuote) {
                read();
                return newToken('string', buffer)
            }

            buffer += read();
            return

        case '\n':
        case '\r':
            throw invalidChar(read())

        case '\u2028':
        case '\u2029':
            separatorChar(c);
            break

        case undefined:
            throw invalidChar(read())
        }

        buffer += read();
    },

    start () {
        switch (c) {
        case '{':
        case '[':
            return newToken('punctuator', read())

        // This code is unreachable since the default lexState handles eof.
        // case undefined:
        //     return newToken('eof')
        }

        lexState = 'value';
    },

    beforePropertyName () {
        switch (c) {
        case '$':
        case '_':
            buffer = read();
            lexState = 'identifierName';
            return

        case '\\':
            read();
            lexState = 'identifierNameStartEscape';
            return

        case '}':
            return newToken('punctuator', read())

        case '"':
        case "'":
            doubleQuote = (read() === '"');
            lexState = 'string';
            return
        }

        if (util.isIdStartChar(c)) {
            buffer += read();
            lexState = 'identifierName';
            return
        }

        throw invalidChar(read())
    },

    afterPropertyName () {
        if (c === ':') {
            return newToken('punctuator', read())
        }

        throw invalidChar(read())
    },

    beforePropertyValue () {
        lexState = 'value';
    },

    afterPropertyValue () {
        switch (c) {
        case ',':
        case '}':
            return newToken('punctuator', read())
        }

        throw invalidChar(read())
    },

    beforeArrayValue () {
        if (c === ']') {
            return newToken('punctuator', read())
        }

        lexState = 'value';
    },

    afterArrayValue () {
        switch (c) {
        case ',':
        case ']':
            return newToken('punctuator', read())
        }

        throw invalidChar(read())
    },

    end () {
        // This code is unreachable since it's handled by the default lexState.
        // if (c === undefined) {
        //     read()
        //     return newToken('eof')
        // }

        throw invalidChar(read())
    },
};

function newToken (type, value) {
    return {
        type,
        value,
        line,
        column,
    }
}

function literal (s) {
    for (const c of s) {
        const p = peek();

        if (p !== c) {
            throw invalidChar(read())
        }

        read();
    }
}

function escape () {
    const c = peek();
    switch (c) {
    case 'b':
        read();
        return '\b'

    case 'f':
        read();
        return '\f'

    case 'n':
        read();
        return '\n'

    case 'r':
        read();
        return '\r'

    case 't':
        read();
        return '\t'

    case 'v':
        read();
        return '\v'

    case '0':
        read();
        if (util.isDigit(peek())) {
            throw invalidChar(read())
        }

        return '\0'

    case 'x':
        read();
        return hexEscape()

    case 'u':
        read();
        return unicodeEscape()

    case '\n':
    case '\u2028':
    case '\u2029':
        read();
        return ''

    case '\r':
        read();
        if (peek() === '\n') {
            read();
        }

        return ''

    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
        throw invalidChar(read())

    case undefined:
        throw invalidChar(read())
    }

    return read()
}

function hexEscape () {
    let buffer = '';
    let c = peek();

    if (!util.isHexDigit(c)) {
        throw invalidChar(read())
    }

    buffer += read();

    c = peek();
    if (!util.isHexDigit(c)) {
        throw invalidChar(read())
    }

    buffer += read();

    return String.fromCodePoint(parseInt(buffer, 16))
}

function unicodeEscape () {
    let buffer = '';
    let count = 4;

    while (count-- > 0) {
        const c = peek();
        if (!util.isHexDigit(c)) {
            throw invalidChar(read())
        }

        buffer += read();
    }

    return String.fromCodePoint(parseInt(buffer, 16))
}

const parseStates = {
    start () {
        if (token.type === 'eof') {
            throw invalidEOF()
        }

        push();
    },

    beforePropertyName () {
        switch (token.type) {
        case 'identifier':
        case 'string':
            key = token.value;
            parseState = 'afterPropertyName';
            return

        case 'punctuator':
            // This code is unreachable since it's handled by the lexState.
            // if (token.value !== '}') {
            //     throw invalidToken()
            // }

            pop();
            return

        case 'eof':
            throw invalidEOF()
        }

        // This code is unreachable since it's handled by the lexState.
        // throw invalidToken()
    },

    afterPropertyName () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'punctuator' || token.value !== ':') {
        //     throw invalidToken()
        // }

        if (token.type === 'eof') {
            throw invalidEOF()
        }

        parseState = 'beforePropertyValue';
    },

    beforePropertyValue () {
        if (token.type === 'eof') {
            throw invalidEOF()
        }

        push();
    },

    beforeArrayValue () {
        if (token.type === 'eof') {
            throw invalidEOF()
        }

        if (token.type === 'punctuator' && token.value === ']') {
            pop();
            return
        }

        push();
    },

    afterPropertyValue () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'punctuator') {
        //     throw invalidToken()
        // }

        if (token.type === 'eof') {
            throw invalidEOF()
        }

        switch (token.value) {
        case ',':
            parseState = 'beforePropertyName';
            return

        case '}':
            pop();
        }

        // This code is unreachable since it's handled by the lexState.
        // throw invalidToken()
    },

    afterArrayValue () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'punctuator') {
        //     throw invalidToken()
        // }

        if (token.type === 'eof') {
            throw invalidEOF()
        }

        switch (token.value) {
        case ',':
            parseState = 'beforeArrayValue';
            return

        case ']':
            pop();
        }

        // This code is unreachable since it's handled by the lexState.
        // throw invalidToken()
    },

    end () {
        // This code is unreachable since it's handled by the lexState.
        // if (token.type !== 'eof') {
        //     throw invalidToken()
        // }
    },
};

function push () {
    let value;

    switch (token.type) {
    case 'punctuator':
        switch (token.value) {
        case '{':
            value = {};
            break

        case '[':
            value = [];
            break
        }

        break

    case 'null':
    case 'boolean':
    case 'numeric':
    case 'string':
        value = token.value;
        break

    // This code is unreachable.
    // default:
    //     throw invalidToken()
    }

    if (root === undefined) {
        root = value;
    } else {
        const parent = stack[stack.length - 1];
        if (Array.isArray(parent)) {
            parent.push(value);
        } else {
            parent[key] = value;
        }
    }

    if (value !== null && typeof value === 'object') {
        stack.push(value);

        if (Array.isArray(value)) {
            parseState = 'beforeArrayValue';
        } else {
            parseState = 'beforePropertyName';
        }
    } else {
        const current = stack[stack.length - 1];
        if (current == null) {
            parseState = 'end';
        } else if (Array.isArray(current)) {
            parseState = 'afterArrayValue';
        } else {
            parseState = 'afterPropertyValue';
        }
    }
}

function pop () {
    stack.pop();

    const current = stack[stack.length - 1];
    if (current == null) {
        parseState = 'end';
    } else if (Array.isArray(current)) {
        parseState = 'afterArrayValue';
    } else {
        parseState = 'afterPropertyValue';
    }
}

// This code is unreachable.
// function invalidParseState () {
//     return new Error(`JSON5: invalid parse state '${parseState}'`)
// }

// This code is unreachable.
// function invalidLexState (state) {
//     return new Error(`JSON5: invalid lex state '${state}'`)
// }

function invalidChar (c) {
    if (c === undefined) {
        return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
    }

    return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
}

function invalidEOF () {
    return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
}

// This code is unreachable.
// function invalidToken () {
//     if (token.type === 'eof') {
//         return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
//     }

//     const c = String.fromCodePoint(token.value.codePointAt(0))
//     return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
// }

function invalidIdentifier () {
    column -= 5;
    return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`)
}

function separatorChar (c) {
    console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`);
}

function formatChar (c) {
    const replacements = {
        "'": "\\'",
        '"': '\\"',
        '\\': '\\\\',
        '\b': '\\b',
        '\f': '\\f',
        '\n': '\\n',
        '\r': '\\r',
        '\t': '\\t',
        '\v': '\\v',
        '\0': '\\0',
        '\u2028': '\\u2028',
        '\u2029': '\\u2029',
    };

    if (replacements[c]) {
        return replacements[c]
    }

    if (c < ' ') {
        const hexString = c.charCodeAt(0).toString(16);
        return '\\x' + ('00' + hexString).substring(hexString.length)
    }

    return c
}

function syntaxError (message) {
    const err = new SyntaxError(message);
    err.lineNumber = line;
    err.columnNumber = column;
    return err
}

var stringify = function stringify (value, replacer, space) {
    const stack = [];
    let indent = '';
    let propertyList;
    let replacerFunc;
    let gap = '';
    let quote;

    if (
        replacer != null &&
        typeof replacer === 'object' &&
        !Array.isArray(replacer)
    ) {
        space = replacer.space;
        quote = replacer.quote;
        replacer = replacer.replacer;
    }

    if (typeof replacer === 'function') {
        replacerFunc = replacer;
    } else if (Array.isArray(replacer)) {
        propertyList = [];
        for (const v of replacer) {
            let item;

            if (typeof v === 'string') {
                item = v;
            } else if (
                typeof v === 'number' ||
                v instanceof String ||
                v instanceof Number
            ) {
                item = String(v);
            }

            if (item !== undefined && propertyList.indexOf(item) < 0) {
                propertyList.push(item);
            }
        }
    }

    if (space instanceof Number) {
        space = Number(space);
    } else if (space instanceof String) {
        space = String(space);
    }

    if (typeof space === 'number') {
        if (space > 0) {
            space = Math.min(10, Math.floor(space));
            gap = '          '.substr(0, space);
        }
    } else if (typeof space === 'string') {
        gap = space.substr(0, 10);
    }

    return serializeProperty('', {'': value})

    function serializeProperty (key, holder) {
        let value = holder[key];
        if (value != null) {
            if (typeof value.toJSON5 === 'function') {
                value = value.toJSON5(key);
            } else if (typeof value.toJSON === 'function') {
                value = value.toJSON(key);
            }
        }

        if (replacerFunc) {
            value = replacerFunc.call(holder, key, value);
        }

        if (value instanceof Number) {
            value = Number(value);
        } else if (value instanceof String) {
            value = String(value);
        } else if (value instanceof Boolean) {
            value = value.valueOf();
        }

        switch (value) {
        case null: return 'null'
        case true: return 'true'
        case false: return 'false'
        }

        if (typeof value === 'string') {
            return quoteString(value, false)
        }

        if (typeof value === 'number') {
            return String(value)
        }

        if (typeof value === 'object') {
            return Array.isArray(value) ? serializeArray(value) : serializeObject(value)
        }

        return undefined
    }

    function quoteString (value) {
        const quotes = {
            "'": 0.1,
            '"': 0.2,
        };

        const replacements = {
            "'": "\\'",
            '"': '\\"',
            '\\': '\\\\',
            '\b': '\\b',
            '\f': '\\f',
            '\n': '\\n',
            '\r': '\\r',
            '\t': '\\t',
            '\v': '\\v',
            '\0': '\\0',
            '\u2028': '\\u2028',
            '\u2029': '\\u2029',
        };

        let product = '';

        for (let i = 0; i < value.length; i++) {
            const c = value[i];
            switch (c) {
            case "'":
            case '"':
                quotes[c]++;
                product += c;
                continue

            case '\0':
                if (util.isDigit(value[i + 1])) {
                    product += '\\x00';
                    continue
                }
            }

            if (replacements[c]) {
                product += replacements[c];
                continue
            }

            if (c < ' ') {
                let hexString = c.charCodeAt(0).toString(16);
                product += '\\x' + ('00' + hexString).substring(hexString.length);
                continue
            }

            product += c;
        }

        const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b);

        product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]);

        return quoteChar + product + quoteChar
    }

    function serializeObject (value) {
        if (stack.indexOf(value) >= 0) {
            throw TypeError('Converting circular structure to JSON5')
        }

        stack.push(value);

        let stepback = indent;
        indent = indent + gap;

        let keys = propertyList || Object.keys(value);
        let partial = [];
        for (const key of keys) {
            const propertyString = serializeProperty(key, value);
            if (propertyString !== undefined) {
                let member = serializeKey(key) + ':';
                if (gap !== '') {
                    member += ' ';
                }
                member += propertyString;
                partial.push(member);
            }
        }

        let final;
        if (partial.length === 0) {
            final = '{}';
        } else {
            let properties;
            if (gap === '') {
                properties = partial.join(',');
                final = '{' + properties + '}';
            } else {
                let separator = ',\n' + indent;
                properties = partial.join(separator);
                final = '{\n' + indent + properties + ',\n' + stepback + '}';
            }
        }

        stack.pop();
        indent = stepback;
        return final
    }

    function serializeKey (key) {
        if (key.length === 0) {
            return quoteString(key, true)
        }

        const firstChar = String.fromCodePoint(key.codePointAt(0));
        if (!util.isIdStartChar(firstChar)) {
            return quoteString(key, true)
        }

        for (let i = firstChar.length; i < key.length; i++) {
            if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {
                return quoteString(key, true)
            }
        }

        return key
    }

    function serializeArray (value) {
        if (stack.indexOf(value) >= 0) {
            throw TypeError('Converting circular structure to JSON5')
        }

        stack.push(value);

        let stepback = indent;
        indent = indent + gap;

        let partial = [];
        for (let i = 0; i < value.length; i++) {
            const propertyString = serializeProperty(String(i), value);
            partial.push((propertyString !== undefined) ? propertyString : 'null');
        }

        let final;
        if (partial.length === 0) {
            final = '[]';
        } else {
            if (gap === '') {
                let properties = partial.join(',');
                final = '[' + properties + ']';
            } else {
                let separator = ',\n' + indent;
                let properties = partial.join(separator);
                final = '[\n' + indent + properties + ',\n' + stepback + ']';
            }
        }

        stack.pop();
        indent = stepback;
        return final
    }
};

const JSON5 = {
    parse,
    stringify,
};

var lib = JSON5;

export default lib;
(The MIT License)

Copyright (c) 2012-2015, JP Richardson <jprichardson@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
 merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
var _fs
try {
  _fs = require('graceful-fs')
} catch (_) {
  _fs = require('fs')
}

function readFile (file, options, callback) {
  if (callback == null) {
    callback = options
    options = {}
  }

  if (typeof options === 'string') {
    options = {encoding: options}
  }

  options = options || {}
  var fs = options.fs || _fs

  var shouldThrow = true
  if ('throws' in options) {
    shouldThrow = options.throws
  }

  fs.readFile(file, options, function (err, data) {
    if (err) return callback(err)

    data = stripBom(data)

    var obj
    try {
      obj = JSON.parse(data, options ? options.reviver : null)
    } catch (err2) {
      if (shouldThrow) {
        err2.message = file + ': ' + err2.message
        return callback(err2)
      } else {
        return callback(null, null)
      }
    }

    callback(null, obj)
  })
}

function readFileSync (file, options) {
  options = options || {}
  if (typeof options === 'string') {
    options = {encoding: options}
  }

  var fs = options.fs || _fs

  var shouldThrow = true
  if ('throws' in options) {
    shouldThrow = options.throws
  }

  try {
    var content = fs.readFileSync(file, options)
    content = stripBom(content)
    return JSON.parse(content, options.reviver)
  } catch (err) {
    if (shouldThrow) {
      err.message = file + ': ' + err.message
      throw err
    } else {
      return null
    }
  }
}

function stringify (obj, options) {
  var spaces
  var EOL = '\n'
  if (typeof options === 'object' && options !== null) {
    if (options.spaces) {
      spaces = options.spaces
    }
    if (options.EOL) {
      EOL = options.EOL
    }
  }

  var str = JSON.stringify(obj, options ? options.replacer : null, spaces)

  return str.replace(/\n/g, EOL) + EOL
}

function writeFile (file, obj, options, callback) {
  if (callback == null) {
    callback = options
    options = {}
  }
  options = options || {}
  var fs = options.fs || _fs

  var str = ''
  try {
    str = stringify(obj, options)
  } catch (err) {
    // Need to return whether a callback was passed or not
    if (callback) callback(err, null)
    return
  }

  fs.writeFile(file, str, options, callback)
}

function writeFileSync (file, obj, options) {
  options = options || {}
  var fs = options.fs || _fs

  var str = stringify(obj, options)
  // not sure if fs.writeFileSync returns anything, but just in case
  return fs.writeFileSync(file, str, options)
}

function stripBom (content) {
  // we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified
  if (Buffer.isBuffer(content)) content = content.toString('utf8')
  content = content.replace(/^\uFEFF/, '')
  return content
}

var jsonfile = {
  readFile: readFile,
  readFileSync: readFileSync,
  writeFile: writeFile,
  writeFileSync: writeFileSync
}

module.exports = jsonfile
{
  "author": {
    "name": "JP Richardson",
    "email": "jprichardson@gmail.com"
  },
  "dependencies": {
    "graceful-fs": "^4.1.6"
  },
  "deprecated": false,
  "description": "Easily read/write JSON files.",
  "devDependencies": {
    "mocha": "2.x",
    "rimraf": "^2.4.0",
    "standard": "^10.0.3"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/jprichardson/node-jsonfile#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "jsonfile",
  "optionalDependencies": {
    "graceful-fs": "^4.1.6"
  },
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/jprichardson/node-jsonfile.git"
  },
  "version": "4.0.0"
}# Changelog

## not yet released

None yet.

## v1.4.1 (2017-08-02)

* #21 Update verror dep
* #22 Update extsprintf dependency
* #23 update contribution guidelines

## v1.4.0 (2017-03-13)

* #7 Add parseInteger() function for safer number parsing

## v1.3.1 (2016-09-12)

* #13 Incompatible with webpack

## v1.3.0 (2016-06-22)

* #14 add safer version of hasOwnProperty()
* #15 forEachKey() should ignore inherited properties

## v1.2.2 (2015-10-15)

* #11 NPM package shouldn't include any code that does `require('JSV')`
* #12 jsl.node.conf missing definition for "module"

## v1.2.1 (2015-10-14)

* #8 odd date parsing behaviour

## v1.2.0 (2015-10-13)

* #9 want function for returning RFC1123 dates

## v1.1.0 (2015-09-02)

* #6 a new suite of hrtime manipulation routines: `hrtimeAdd()`,
  `hrtimeAccum()`, `hrtimeNanosec()`, `hrtimeMicrosec()` and
  `hrtimeMillisec()`.

## v1.0.0 (2015-09-01)

First tracked release.  Includes everything in previous releases, plus:

* #4 want function for merging objects
# Contributing

This repository uses [cr.joyent.us](https://cr.joyent.us) (Gerrit) for new
changes.  Anyone can submit changes.  To get started, see the [cr.joyent.us user
guide](https://github.com/joyent/joyent-gerrit/blob/master/docs/user/README.md).
This repo does not use GitHub pull requests.

See the [Joyent Engineering
Guidelines](https://github.com/joyent/eng/blob/master/docs/index.md) for general
best practices expected in this repository.

Contributions should be "make prepush" clean.  The "prepush" target runs the
"check" target, which requires these separate tools:

* https://github.com/davepacheco/jsstyle
* https://github.com/davepacheco/javascriptlint

If you're changing something non-trivial or user-facing, you may want to submit
an issue first.
Copyright (c) 2012, Joyent, Inc. All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE
{
  "dependencies": {
    "assert-plus": "1.0.0",
    "extsprintf": "1.3.0",
    "json-schema": "0.2.3",
    "verror": "1.10.0"
  },
  "deprecated": false,
  "description": "utilities for primitive JavaScript types",
  "engines": [
    "node >=0.6.0"
  ],
  "homepage": "https://github.com/joyent/node-jsprim#readme",
  "license": "MIT",
  "main": "./lib/jsprim.js",
  "name": "jsprim",
  "repository": {
    "type": "git",
    "url": "git://github.com/joyent/node-jsprim.git"
  },
  "version": "1.4.1"
}/*
 * lib/jsprim.js: utilities for primitive JavaScript types
 */

var mod_assert = require('assert-plus');
var mod_util = require('util');

var mod_extsprintf = require('extsprintf');
var mod_verror = require('verror');
var mod_jsonschema = require('json-schema');

/*
 * Public interface
 */
exports.deepCopy = deepCopy;
exports.deepEqual = deepEqual;
exports.isEmpty = isEmpty;
exports.hasKey = hasKey;
exports.forEachKey = forEachKey;
exports.pluck = pluck;
exports.flattenObject = flattenObject;
exports.flattenIter = flattenIter;
exports.validateJsonObject = validateJsonObjectJS;
exports.validateJsonObjectJS = validateJsonObjectJS;
exports.randElt = randElt;
exports.extraProperties = extraProperties;
exports.mergeObjects = mergeObjects;

exports.startsWith = startsWith;
exports.endsWith = endsWith;

exports.parseInteger = parseInteger;

exports.iso8601 = iso8601;
exports.rfc1123 = rfc1123;
exports.parseDateTime = parseDateTime;

exports.hrtimediff = hrtimeDiff;
exports.hrtimeDiff = hrtimeDiff;
exports.hrtimeAccum = hrtimeAccum;
exports.hrtimeAdd = hrtimeAdd;
exports.hrtimeNanosec = hrtimeNanosec;
exports.hrtimeMicrosec = hrtimeMicrosec;
exports.hrtimeMillisec = hrtimeMillisec;


/*
 * Deep copy an acyclic *basic* Javascript object.  This only handles basic
 * scalars (strings, numbers, booleans) and arbitrarily deep arrays and objects
 * containing these.  This does *not* handle instances of other classes.
 */
function deepCopy(obj)
{
	var ret, key;
	var marker = '__deepCopy';

	if (obj && obj[marker])
		throw (new Error('attempted deep copy of cyclic object'));

	if (obj && obj.constructor == Object) {
		ret = {};
		obj[marker] = true;

		for (key in obj) {
			if (key == marker)
				continue;

			ret[key] = deepCopy(obj[key]);
		}

		delete (obj[marker]);
		return (ret);
	}

	if (obj && obj.constructor == Array) {
		ret = [];
		obj[marker] = true;

		for (key = 0; key < obj.length; key++)
			ret.push(deepCopy(obj[key]));

		delete (obj[marker]);
		return (ret);
	}

	/*
	 * It must be a primitive type -- just return it.
	 */
	return (obj);
}

function deepEqual(obj1, obj2)
{
	if (typeof (obj1) != typeof (obj2))
		return (false);

	if (obj1 === null || obj2 === null || typeof (obj1) != 'object')
		return (obj1 === obj2);

	if (obj1.constructor != obj2.constructor)
		return (false);

	var k;
	for (k in obj1) {
		if (!obj2.hasOwnProperty(k))
			return (false);

		if (!deepEqual(obj1[k], obj2[k]))
			return (false);
	}

	for (k in obj2) {
		if (!obj1.hasOwnProperty(k))
			return (false);
	}

	return (true);
}

function isEmpty(obj)
{
	var key;
	for (key in obj)
		return (false);
	return (true);
}

function hasKey(obj, key)
{
	mod_assert.equal(typeof (key), 'string');
	return (Object.prototype.hasOwnProperty.call(obj, key));
}

function forEachKey(obj, callback)
{
	for (var key in obj) {
		if (hasKey(obj, key)) {
			callback(key, obj[key]);
		}
	}
}

function pluck(obj, key)
{
	mod_assert.equal(typeof (key), 'string');
	return (pluckv(obj, key));
}

function pluckv(obj, key)
{
	if (obj === null || typeof (obj) !== 'object')
		return (undefined);

	if (obj.hasOwnProperty(key))
		return (obj[key]);

	var i = key.indexOf('.');
	if (i == -1)
		return (undefined);

	var key1 = key.substr(0, i);
	if (!obj.hasOwnProperty(key1))
		return (undefined);

	return (pluckv(obj[key1], key.substr(i + 1)));
}

/*
 * Invoke callback(row) for each entry in the array that would be returned by
 * flattenObject(data, depth).  This is just like flattenObject(data,
 * depth).forEach(callback), except that the intermediate array is never
 * created.
 */
function flattenIter(data, depth, callback)
{
	doFlattenIter(data, depth, [], callback);
}

function doFlattenIter(data, depth, accum, callback)
{
	var each;
	var key;

	if (depth === 0) {
		each = accum.slice(0);
		each.push(data);
		callback(each);
		return;
	}

	mod_assert.ok(data !== null);
	mod_assert.equal(typeof (data), 'object');
	mod_assert.equal(typeof (depth), 'number');
	mod_assert.ok(depth >= 0);

	for (key in data) {
		each = accum.slice(0);
		each.push(key);
		doFlattenIter(data[key], depth - 1, each, callback);
	}
}

function flattenObject(data, depth)
{
	if (depth === 0)
		return ([ data ]);

	mod_assert.ok(data !== null);
	mod_assert.equal(typeof (data), 'object');
	mod_assert.equal(typeof (depth), 'number');
	mod_assert.ok(depth >= 0);

	var rv = [];
	var key;

	for (key in data) {
		flattenObject(data[key], depth - 1).forEach(function (p) {
			rv.push([ key ].concat(p));
		});
	}

	return (rv);
}

function startsWith(str, prefix)
{
	return (str.substr(0, prefix.length) == prefix);
}

function endsWith(str, suffix)
{
	return (str.substr(
	    str.length - suffix.length, suffix.length) == suffix);
}

function iso8601(d)
{
	if (typeof (d) == 'number')
		d = new Date(d);
	mod_assert.ok(d.constructor === Date);
	return (mod_extsprintf.sprintf('%4d-%02d-%02dT%02d:%02d:%02d.%03dZ',
	    d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(),
	    d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(),
	    d.getUTCMilliseconds()));
}

var RFC1123_MONTHS = [
    'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
    'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var RFC1123_DAYS = [
    'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];

function rfc1123(date) {
	return (mod_extsprintf.sprintf('%s, %02d %s %04d %02d:%02d:%02d GMT',
	    RFC1123_DAYS[date.getUTCDay()], date.getUTCDate(),
	    RFC1123_MONTHS[date.getUTCMonth()], date.getUTCFullYear(),
	    date.getUTCHours(), date.getUTCMinutes(),
	    date.getUTCSeconds()));
}

/*
 * Parses a date expressed as a string, as either a number of milliseconds since
 * the epoch or any string format that Date accepts, giving preference to the
 * former where these two sets overlap (e.g., small numbers).
 */
function parseDateTime(str)
{
	/*
	 * This is irritatingly implicit, but significantly more concise than
	 * alternatives.  The "+str" will convert a string containing only a
	 * number directly to a Number, or NaN for other strings.  Thus, if the
	 * conversion succeeds, we use it (this is the milliseconds-since-epoch
	 * case).  Otherwise, we pass the string directly to the Date
	 * constructor to parse.
	 */
	var numeric = +str;
	if (!isNaN(numeric)) {
		return (new Date(numeric));
	} else {
		return (new Date(str));
	}
}


/*
 * Number.*_SAFE_INTEGER isn't present before node v0.12, so we hardcode
 * the ES6 definitions here, while allowing for them to someday be higher.
 */
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
var MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;


/*
 * Default options for parseInteger().
 */
var PI_DEFAULTS = {
	base: 10,
	allowSign: true,
	allowPrefix: false,
	allowTrailing: false,
	allowImprecise: false,
	trimWhitespace: false,
	leadingZeroIsOctal: false
};

var CP_0 = 0x30;
var CP_9 = 0x39;

var CP_A = 0x41;
var CP_B = 0x42;
var CP_O = 0x4f;
var CP_T = 0x54;
var CP_X = 0x58;
var CP_Z = 0x5a;

var CP_a = 0x61;
var CP_b = 0x62;
var CP_o = 0x6f;
var CP_t = 0x74;
var CP_x = 0x78;
var CP_z = 0x7a;

var PI_CONV_DEC = 0x30;
var PI_CONV_UC = 0x37;
var PI_CONV_LC = 0x57;


/*
 * A stricter version of parseInt() that provides options for changing what
 * is an acceptable string (for example, disallowing trailing characters).
 */
function parseInteger(str, uopts)
{
	mod_assert.string(str, 'str');
	mod_assert.optionalObject(uopts, 'options');

	var baseOverride = false;
	var options = PI_DEFAULTS;

	if (uopts) {
		baseOverride = hasKey(uopts, 'base');
		options = mergeObjects(options, uopts);
		mod_assert.number(options.base, 'options.base');
		mod_assert.ok(options.base >= 2, 'options.base >= 2');
		mod_assert.ok(options.base <= 36, 'options.base <= 36');
		mod_assert.bool(options.allowSign, 'options.allowSign');
		mod_assert.bool(options.allowPrefix, 'options.allowPrefix');
		mod_assert.bool(options.allowTrailing,
		    'options.allowTrailing');
		mod_assert.bool(options.allowImprecise,
		    'options.allowImprecise');
		mod_assert.bool(options.trimWhitespace,
		    'options.trimWhitespace');
		mod_assert.bool(options.leadingZeroIsOctal,
		    'options.leadingZeroIsOctal');

		if (options.leadingZeroIsOctal) {
			mod_assert.ok(!baseOverride,
			    '"base" and "leadingZeroIsOctal" are ' +
			    'mutually exclusive');
		}
	}

	var c;
	var pbase = -1;
	var base = options.base;
	var start;
	var mult = 1;
	var value = 0;
	var idx = 0;
	var len = str.length;

	/* Trim any whitespace on the left side. */
	if (options.trimWhitespace) {
		while (idx < len && isSpace(str.charCodeAt(idx))) {
			++idx;
		}
	}

	/* Check the number for a leading sign. */
	if (options.allowSign) {
		if (str[idx] === '-') {
			idx += 1;
			mult = -1;
		} else if (str[idx] === '+') {
			idx += 1;
		}
	}

	/* Parse the base-indicating prefix if there is one. */
	if (str[idx] === '0') {
		if (options.allowPrefix) {
			pbase = prefixToBase(str.charCodeAt(idx + 1));
			if (pbase !== -1 && (!baseOverride || pbase === base)) {
				base = pbase;
				idx += 2;
			}
		}

		if (pbase === -1 && options.leadingZeroIsOctal) {
			base = 8;
		}
	}

	/* Parse the actual digits. */
	for (start = idx; idx < len; ++idx) {
		c = translateDigit(str.charCodeAt(idx));
		if (c !== -1 && c < base) {
			value *= base;
			value += c;
		} else {
			break;
		}
	}

	/* If we didn't parse any digits, we have an invalid number. */
	if (start === idx) {
		return (new Error('invalid number: ' + JSON.stringify(str)));
	}

	/* Trim any whitespace on the right side. */
	if (options.trimWhitespace) {
		while (idx < len && isSpace(str.charCodeAt(idx))) {
			++idx;
		}
	}

	/* Check for trailing characters. */
	if (idx < len && !options.allowTrailing) {
		return (new Error('trailing characters after number: ' +
		    JSON.stringify(str.slice(idx))));
	}

	/* If our value is 0, we return now, to avoid returning -0. */
	if (value === 0) {
		return (0);
	}

	/* Calculate our final value. */
	var result = value * mult;

	/*
	 * If the string represents a value that cannot be precisely represented
	 * by JavaScript, then we want to check that:
	 *
	 * - We never increased the value past MAX_SAFE_INTEGER
	 * - We don't make the result negative and below MIN_SAFE_INTEGER
	 *
	 * Because we only ever increment the value during parsing, there's no
	 * chance of moving past MAX_SAFE_INTEGER and then dropping below it
	 * again, losing precision in the process. This means that we only need
	 * to do our checks here, at the end.
	 */
	if (!options.allowImprecise &&
	    (value > MAX_SAFE_INTEGER || result < MIN_SAFE_INTEGER)) {
		return (new Error('number is outside of the supported range: ' +
		    JSON.stringify(str.slice(start, idx))));
	}

	return (result);
}


/*
 * Interpret a character code as a base-36 digit.
 */
function translateDigit(d)
{
	if (d >= CP_0 && d <= CP_9) {
		/* '0' to '9' -> 0 to 9 */
		return (d - PI_CONV_DEC);
	} else if (d >= CP_A && d <= CP_Z) {
		/* 'A' - 'Z' -> 10 to 35 */
		return (d - PI_CONV_UC);
	} else if (d >= CP_a && d <= CP_z) {
		/* 'a' - 'z' -> 10 to 35 */
		return (d - PI_CONV_LC);
	} else {
		/* Invalid character code */
		return (-1);
	}
}


/*
 * Test if a value matches the ECMAScript definition of trimmable whitespace.
 */
function isSpace(c)
{
	return (c === 0x20) ||
	    (c >= 0x0009 && c <= 0x000d) ||
	    (c === 0x00a0) ||
	    (c === 0x1680) ||
	    (c === 0x180e) ||
	    (c >= 0x2000 && c <= 0x200a) ||
	    (c === 0x2028) ||
	    (c === 0x2029) ||
	    (c === 0x202f) ||
	    (c === 0x205f) ||
	    (c === 0x3000) ||
	    (c === 0xfeff);
}


/*
 * Determine which base a character indicates (e.g., 'x' indicates hex).
 */
function prefixToBase(c)
{
	if (c === CP_b || c === CP_B) {
		/* 0b/0B (binary) */
		return (2);
	} else if (c === CP_o || c === CP_O) {
		/* 0o/0O (octal) */
		return (8);
	} else if (c === CP_t || c === CP_T) {
		/* 0t/0T (decimal) */
		return (10);
	} else if (c === CP_x || c === CP_X) {
		/* 0x/0X (hexadecimal) */
		return (16);
	} else {
		/* Not a meaningful character */
		return (-1);
	}
}


function validateJsonObjectJS(schema, input)
{
	var report = mod_jsonschema.validate(input, schema);

	if (report.errors.length === 0)
		return (null);

	/* Currently, we only do anything useful with the first error. */
	var error = report.errors[0];

	/* The failed property is given by a URI with an irrelevant prefix. */
	var propname = error['property'];
	var reason = error['message'].toLowerCase();
	var i, j;

	/*
	 * There's at least one case where the property error message is
	 * confusing at best.  We work around this here.
	 */
	if ((i = reason.indexOf('the property ')) != -1 &&
	    (j = reason.indexOf(' is not defined in the schema and the ' +
	    'schema does not allow additional properties')) != -1) {
		i += 'the property '.length;
		if (propname === '')
			propname = reason.substr(i, j - i);
		else
			propname = propname + '.' + reason.substr(i, j - i);

		reason = 'unsupported property';
	}

	var rv = new mod_verror.VError('property "%s": %s', propname, reason);
	rv.jsv_details = error;
	return (rv);
}

function randElt(arr)
{
	mod_assert.ok(Array.isArray(arr) && arr.length > 0,
	    'randElt argument must be a non-empty array');

	return (arr[Math.floor(Math.random() * arr.length)]);
}

function assertHrtime(a)
{
	mod_assert.ok(a[0] >= 0 && a[1] >= 0,
	    'negative numbers not allowed in hrtimes');
	mod_assert.ok(a[1] < 1e9, 'nanoseconds column overflow');
}

/*
 * Compute the time elapsed between hrtime readings A and B, where A is later
 * than B.  hrtime readings come from Node's process.hrtime().  There is no
 * defined way to represent negative deltas, so it's illegal to diff B from A
 * where the time denoted by B is later than the time denoted by A.  If this
 * becomes valuable, we can define a representation and extend the
 * implementation to support it.
 */
function hrtimeDiff(a, b)
{
	assertHrtime(a);
	assertHrtime(b);
	mod_assert.ok(a[0] > b[0] || (a[0] == b[0] && a[1] >= b[1]),
	    'negative differences not allowed');

	var rv = [ a[0] - b[0], 0 ];

	if (a[1] >= b[1]) {
		rv[1] = a[1] - b[1];
	} else {
		rv[0]--;
		rv[1] = 1e9 - (b[1] - a[1]);
	}

	return (rv);
}

/*
 * Convert a hrtime reading from the array format returned by Node's
 * process.hrtime() into a scalar number of nanoseconds.
 */
function hrtimeNanosec(a)
{
	assertHrtime(a);

	return (Math.floor(a[0] * 1e9 + a[1]));
}

/*
 * Convert a hrtime reading from the array format returned by Node's
 * process.hrtime() into a scalar number of microseconds.
 */
function hrtimeMicrosec(a)
{
	assertHrtime(a);

	return (Math.floor(a[0] * 1e6 + a[1] / 1e3));
}

/*
 * Convert a hrtime reading from the array format returned by Node's
 * process.hrtime() into a scalar number of milliseconds.
 */
function hrtimeMillisec(a)
{
	assertHrtime(a);

	return (Math.floor(a[0] * 1e3 + a[1] / 1e6));
}

/*
 * Add two hrtime readings A and B, overwriting A with the result of the
 * addition.  This function is useful for accumulating several hrtime intervals
 * into a counter.  Returns A.
 */
function hrtimeAccum(a, b)
{
	assertHrtime(a);
	assertHrtime(b);

	/*
	 * Accumulate the nanosecond component.
	 */
	a[1] += b[1];
	if (a[1] >= 1e9) {
		/*
		 * The nanosecond component overflowed, so carry to the seconds
		 * field.
		 */
		a[0]++;
		a[1] -= 1e9;
	}

	/*
	 * Accumulate the seconds component.
	 */
	a[0] += b[0];

	return (a);
}

/*
 * Add two hrtime readings A and B, returning the result as a new hrtime array.
 * Does not modify either input argument.
 */
function hrtimeAdd(a, b)
{
	assertHrtime(a);

	var rv = [ a[0], a[1] ];

	return (hrtimeAccum(rv, b));
}


/*
 * Check an object for unexpected properties.  Accepts the object to check, and
 * an array of allowed property names (strings).  Returns an array of key names
 * that were found on the object, but did not appear in the list of allowed
 * properties.  If no properties were found, the returned array will be of
 * zero length.
 */
function extraProperties(obj, allowed)
{
	mod_assert.ok(typeof (obj) === 'object' && obj !== null,
	    'obj argument must be a non-null object');
	mod_assert.ok(Array.isArray(allowed),
	    'allowed argument must be an array of strings');
	for (var i = 0; i < allowed.length; i++) {
		mod_assert.ok(typeof (allowed[i]) === 'string',
		    'allowed argument must be an array of strings');
	}

	return (Object.keys(obj).filter(function (key) {
		return (allowed.indexOf(key) === -1);
	}));
}

/*
 * Given three sets of properties "provided" (may be undefined), "overrides"
 * (required), and "defaults" (may be undefined), construct an object containing
 * the union of these sets with "overrides" overriding "provided", and
 * "provided" overriding "defaults".  None of the input objects are modified.
 */
function mergeObjects(provided, overrides, defaults)
{
	var rv, k;

	rv = {};
	if (defaults) {
		for (k in defaults)
			rv[k] = defaults[k];
	}

	if (provided) {
		for (k in provided)
			rv[k] = provided[k];
	}

	if (overrides) {
		for (k in overrides)
			rv[k] = overrides[k];
	}

	return (rv);
}
MIT License

Copyright (c) 2017 Luke Childs

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "author": {
    "name": "Luke Childs",
    "email": "lukechilds123@gmail.com",
    "url": "http://lukechilds.co.uk"
  },
  "dependencies": {
    "json-buffer": "3.0.0"
  },
  "deprecated": false,
  "description": "Simple key-value storage with support for multiple backends",
  "devDependencies": {
    "@keyv/mongo": "*",
    "@keyv/mysql": "*",
    "@keyv/postgres": "*",
    "@keyv/redis": "*",
    "@keyv/sqlite": "*",
    "@keyv/test-suite": "*",
    "ava": "^0.25.0",
    "coveralls": "^3.0.0",
    "eslint-config-xo-lukechilds": "^1.0.0",
    "nyc": "^11.0.3",
    "this": "^1.0.2",
    "timekeeper": "^2.0.0",
    "xo": "^0.20.1"
  },
  "homepage": "https://github.com/lukechilds/keyv",
  "license": "MIT",
  "main": "src/index.js",
  "name": "keyv",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/lukechilds/keyv.git"
  },
  "version": "3.1.0"
}'use strict';

const EventEmitter = require('events');
const JSONB = require('json-buffer');

const loadStore = opts => {
	const adapters = {
		redis: '@keyv/redis',
		mongodb: '@keyv/mongo',
		mongo: '@keyv/mongo',
		sqlite: '@keyv/sqlite',
		postgresql: '@keyv/postgres',
		postgres: '@keyv/postgres',
		mysql: '@keyv/mysql'
	};
	if (opts.adapter || opts.uri) {
		const adapter = opts.adapter || /^[^:]*/.exec(opts.uri)[0];
		return new (require(adapters[adapter]))(opts);
	}
	return new Map();
};

class Keyv extends EventEmitter {
	constructor(uri, opts) {
		super();
		this.opts = Object.assign(
			{
				namespace: 'keyv',
				serialize: JSONB.stringify,
				deserialize: JSONB.parse
			},
			(typeof uri === 'string') ? { uri } : uri,
			opts
		);

		if (!this.opts.store) {
			const adapterOpts = Object.assign({}, this.opts);
			this.opts.store = loadStore(adapterOpts);
		}

		if (typeof this.opts.store.on === 'function') {
			this.opts.store.on('error', err => this.emit('error', err));
		}

		this.opts.store.namespace = this.opts.namespace;
	}

	_getKeyPrefix(key) {
		return `${this.opts.namespace}:${key}`;
	}

	get(key) {
		key = this._getKeyPrefix(key);
		const store = this.opts.store;
		return Promise.resolve()
			.then(() => store.get(key))
			.then(data => {
				data = (typeof data === 'string') ? this.opts.deserialize(data) : data;
				if (data === undefined) {
					return undefined;
				}
				if (typeof data.expires === 'number' && Date.now() > data.expires) {
					this.delete(key);
					return undefined;
				}
				return data.value;
			});
	}

	set(key, value, ttl) {
		key = this._getKeyPrefix(key);
		if (typeof ttl === 'undefined') {
			ttl = this.opts.ttl;
		}
		if (ttl === 0) {
			ttl = undefined;
		}
		const store = this.opts.store;

		return Promise.resolve()
			.then(() => {
				const expires = (typeof ttl === 'number') ? (Date.now() + ttl) : null;
				value = { value, expires };
				return store.set(key, this.opts.serialize(value), ttl);
			})
			.then(() => true);
	}

	delete(key) {
		key = this._getKeyPrefix(key);
		const store = this.opts.store;
		return Promise.resolve()
			.then(() => store.delete(key));
	}

	clear() {
		const store = this.opts.store;
		return Promise.resolve()
			.then(() => store.clear());
	}
}

module.exports = Keyv;
{
  "name": "kiwibridge",
  "version": "1.0.0",
  "description": "A bridge between cordova and native kiwi app.",
  "cordova": {
    "id": "cordova-plugin-kiwibridge",
    "platforms": [
      "android", "electron"
    ]
  },
  "engines": [
    {
      "name": "cordova",
      "version": ">=3.0.0"
    }
  ],
  "author": "JaromÃ­r SmrÄ�ek - 4plague@gmail.com",
  "license": "All rights reserved"
}
<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
	xmlns:android="http://schemas.android.com/apk/res/android"
	id="cordova-plugin-kiwibridge"
	version="1.0.0">      
	<name>kiwibridge</name>

	<description>
		A bridge between cordova and native kiwi app.
	</description>

	<author>JaromÃ­r SmrÄ�ek - 4plague@gmail.com</author>

	<license>All rights reserved</license>      

	<engines>
		<engine name="cordova" version=">=3.0.0"/>
	</engines>

	<js-module src="www/AppManager.js" name="kiwiApp">
		<merges target="cordova.plugins.kiwiApp" />
	</js-module>

	<js-module src="www/ControlManager.js" name="kiwiControl">
		<merges target="cordova.plugins.kiwiControl" />
	</js-module>

	<js-module src="www/DriveManager.js" name="kiwiDrive">
		<merges target="cordova.plugins.kiwiDrive" />
	</js-module>

	<js-module src="www/FileTransferManager.js" name="kiwiFileTransfer">
		<merges target="cordova.plugins.kiwiFileTransfer" />
	</js-module>

	<js-module src="www/FirmwareManager.js" name="kiwiFirmware">
		<merges target="cordova.plugins.kiwiFirmware" />
	</js-module>

	<js-module src="www/MemoryManager.js" name="kiwiMemory">
		<merges target="cordova.plugins.kiwiMemory" />
	</js-module>

	<js-module src="www/NetworkManager.js" name="kiwiNetwork">
		<merges target="cordova.plugins.kiwiNetwork" />
	</js-module>

	<js-module src="www/PowerManager.js" name="kiwiPower">
		<merges target="cordova.plugins.kiwiPower" />
	</js-module>

	<js-module src="www/ScreenManager.js" name="kiwiScreen">
		<merges target="cordova.plugins.kiwiScreen" />
	</js-module>

	<js-module src="www/SensorManager.js" name="kiwiSensor">
		<merges target="cordova.plugins.kiwiSensor" />
	</js-module>

	<js-module src="www/SoundManager.js" name="kiwiSound">
		<merges target="cordova.plugins.kiwiSound" />
	</js-module>

	<js-module src="www/TimeManager.js" name="kiwiTime">
		<merges target="cordova.plugins.kiwiTime" />
	</js-module>

	<platform name="android">
		
		<config-file target="res/xml/config.xml" parent="/*">
			<feature name="AppManager">
				<param name="android-package" value="cz.kiwi.android.light.bridge.AppManager" />
			</feature>
			<feature name="ControlManager">
				<param name="android-package" value="cz.kiwi.android.light.bridge.ControlManager" />
			</feature>
			<feature name="DriveManager">
				<param name="android-package" value="cz.kiwi.android.light.bridge.DriveManager" />
			</feature>
			<feature name="FileTransferManager">
				<param name="android-package" value="cz.kiwi.android.light.bridge.FileTransferManager" />
			</feature>
			<feature name="FirmwareManager">
				<param name="android-package" value="cz.kiwi.android.light.bridge.FirmwareManager" />
			</feature>
			<feature name="MemoryManager">
				<param name="android-package" value="cz.kiwi.android.light.bridge.MemoryManager" />
			</feature>
			<feature name="NetworkManager">
				<param name="android-package" value="cz.kiwi.android.light.bridge.NetworkManager" />
			</feature>
			<feature name="PowerManager">
				<param name="android-package" value="cz.kiwi.android.light.bridge.PowerManager" />
			</feature>
			<feature name="ScreenManager">
				<param name="android-package" value="cz.kiwi.android.light.bridge.ScreenManager" />
			</feature>
			<feature name="SensorManager">
				<param name="android-package" value="cz.kiwi.android.light.bridge.SensorManager" />
			</feature>
			<feature name="SoundManager">
				<param name="android-package" value="cz.kiwi.android.light.bridge.SoundManager" />
			</feature>
			<feature name="TimeManager">
				<param name="android-package" value="cz.kiwi.android.light.bridge.TimeManager" />
			</feature>
		</config-file>
		
		<source-file src="src/android/bridge/AppManager.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/ControlManager.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/DriveManager.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/FileTransferManager.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/FirmwareManager.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/MemoryManager.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/NetworkManager.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/PowerManager.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/ScreenManager.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/SensorManager.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/SoundManager.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/TimeManager.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		
		<source-file src="src/android/bridge/KiwiBridge.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/ErrorBridge.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/ErrorObject.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/ControlLock.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/DriveUnit.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/FileTransferRequest.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/FileTransferError.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/MemoryInfo.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/NetworkConnection.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/Orientation.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/PowerTimer.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		<source-file src="src/android/bridge/Release.java" target-dir="src/cz/kiwi/android/light/bridge/" />
		
	</platform>      
	
</plugin>      
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function AppManager() {}

AppManager.prototype.exit = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "AppManager", "exit");
};

AppManager.prototype.finishUpdate = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "AppManager", "finishUpdate");
};

AppManager.prototype.getUpdateUrl = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "AppManager", "getUpdateUrl");
};

AppManager.prototype.update = function(successCallback, errorCallback, url) {
	exec(successCallback, errorCallback, "AppManager", "update", [url]);
};

module.exports = new AppManager();
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function ControlManager() {}

ControlManager.prototype.getLocalLock = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "ControlManager", "getLocalLock");
};

ControlManager.prototype.getRemoteLock = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "ControlManager", "getRemoteLock");
};

ControlManager.prototype.setLocalLock = function(successCallback, errorCallback, lock) {
	exec(successCallback, errorCallback, "ControlManager", "setLocalLock", [lock]);
};

ControlManager.prototype.setRemoteLock = function(successCallback, errorCallback, lock) {
	exec(successCallback, errorCallback, "ControlManager", "setRemoteLock", [lock]);
};

module.exports = new ControlManager();
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function DriveManager() {}

DriveManager.prototype.getAllUnits = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "DriveManager", "getAllUnits");
};

module.exports = new DriveManager();
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function FileTransferManager() {}

FileTransferManager.prototype.download = function(successCallback, errorCallback, destination, request) {
	exec(successCallback, errorCallback, "FileTransferManager", "download", [destination, request]);
};

module.exports = new FileTransferManager();
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function FirmwareManager() {}

FirmwareManager.prototype.getInterfaceVersion = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "FirmwareManager", "getInterfaceVersion");
};

FirmwareManager.prototype.getManufacturer = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "FirmwareManager", "getManufacturer");
};

FirmwareManager.prototype.getModelName = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "FirmwareManager", "getModelName");
};

FirmwareManager.prototype.getSerialNumber = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "FirmwareManager", "getSerialNumber");
};

FirmwareManager.prototype.getVersion = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "FirmwareManager", "getVersion");
};

FirmwareManager.prototype.update = function(successCallback, errorCallback, release) {
	exec(successCallback, errorCallback, "FirmwareManager", "update", [release]);
};

module.exports = new FirmwareManager();
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function MemoryManager() {}

MemoryManager.prototype.getInfo = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "MemoryManager", "getInfo");
};

module.exports = new MemoryManager();
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function NetworkManager() {}

NetworkManager.prototype.getAllConnections = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "NetworkManager", "getAllConnections");
};

module.exports = new NetworkManager();
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function PowerManager() {}

PowerManager.prototype.createTimers = function(successCallback, errorCallback, timers) {
    exec(successCallback, errorCallback, "PowerManager", "createTimers", [timers]);
};

PowerManager.prototype.deleteAllTimers = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "PowerManager", "deleteAllTimers");
};

PowerManager.prototype.getBootDate = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "PowerManager", "getBootDate");
};

PowerManager.prototype.reboot = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "PowerManager", "reboot");
};

PowerManager.prototype.shutdown = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "PowerManager", "shutdown");
};

module.exports = new PowerManager();
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function ScreenManager() {}

ScreenManager.prototype.createScreenshot = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "ScreenManager", "createScreenshot");
};

ScreenManager.prototype.getBrightness = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "ScreenManager", "getBrightness");
};

ScreenManager.prototype.getOrientation = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "ScreenManager", "getOrientation");
};

ScreenManager.prototype.setOrientation = function(successCallback, errorCallback, orientation) {
	exec(successCallback, errorCallback, "ScreenManager", "setOrientation", [orientation]);
};

module.exports = new ScreenManager();
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function SensorManager() {}

SensorManager.prototype.getTemperature = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "SensorManager", "getTemperature");
};

module.exports = new SensorManager();
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function SoundManager() {}

SoundManager.prototype.getVolume = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "SoundManager", "getVolume");
};

SoundManager.prototype.isMuted = function(successCallback, errorCallback) {
	exec(successCallback, errorCallback, "SoundManager", "isMuted");
};

SoundManager.prototype.setVolume = function(successCallback, errorCallback, volume) {
	exec(successCallback, errorCallback, "SoundManager", "setVolume", [volume]);
};

module.exports = new SoundManager();
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

var exec = require('cordova/exec'),
    cordova = require('cordova');

function TimeManager() {}

TimeManager.prototype.getZone = function(successCallback, errorCallback) {
    exec(successCallback, errorCallback, "TimeManager", "getZone");
};

module.exports = new TimeManager();
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;

public class AppManager extends CordovaPlugin {
	
	public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
		KiwiBridge.BridgeInterface bridge = KiwiBridge.getInstance();
		try {
			switch (action) {
				case "exit":
					bridge.onAppManagerExit(cordova, callbackContext);
					return true;
				case "finishUpdate":
					bridge.onAppManagerFinishUpdate(cordova, callbackContext);
					return true;
				case "getUpdateUrl":
					bridge.onAppManagerGetUpdateUrl(cordova, callbackContext);
					return true;
				case "update":
					bridge.onAppManagerUpdate(cordova, callbackContext, args.getString(0));
					return true;
				default:
					return false;
			}
		} catch (Throwable t) {
			bridge.onError(callbackContext, t);
			return true;
		}
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.json.JSONException;
import org.json.JSONObject;

public class ControlLock {
	
	public boolean locked;
	public boolean exceptPower;  // yeah this is not future-proof
	
	public ControlLock(boolean locked, boolean exceptPower) {
		this.locked = locked;
		this.exceptPower = exceptPower;
	}
	
	ControlLock(JSONObject json) throws JSONException {
		locked = json.getBoolean("locked");
		exceptPower = false;
		if (!json.has("exceptions")) return;
		
		JSONObject exceptions = json.getJSONObject("exceptions");
		exceptPower = exceptions.optBoolean("power", false);
	}
	
	public JSONObject toJSON() {
		JSONObject json = new JSONObject();
		try {
			json.put("locked", locked);
			// if all exceptions are inactive -> do not put the object there (as per specs)
			if (exceptPower) {
				JSONObject exceptions = new JSONObject();
				exceptions.put("power", true);
				json.put("exceptions", exceptions);
			}
		} catch (JSONException ignore) {}  // only way to raise it is to pass null for the name argument (see source)
		return json;
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;

public class ControlManager extends CordovaPlugin {
	
	public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
		KiwiBridge.BridgeInterface bridge = KiwiBridge.getInstance();
		try {
			switch (action) {
				case "getLocalLock":
					bridge.onControlManagerGetLocalLock(cordova, callbackContext);
					return true;
				case "getRemoteLock":
					bridge.onControlManagerGetRemoteLock(cordova, callbackContext);
					return true;
				case "setLocalLock":
					ControlLock localLock = new ControlLock(args.getJSONObject(0));
					bridge.onControlManagerSetLocalLock(cordova, callbackContext, localLock);
					return true;
				case "setRemoteLock":
					ControlLock remoteLock = new ControlLock(args.getJSONObject(0));
					bridge.onControlManagerSetRemoteLock(cordova, callbackContext, remoteLock);
					return true;
				default:
					return false;
			}
		} catch (Throwable t) {
			bridge.onError(callbackContext, t);
			return true;
		}
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;

public class DriveManager extends CordovaPlugin {
	
	public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
		KiwiBridge.BridgeInterface bridge = KiwiBridge.getInstance();
		try {
			switch (action) {
				case "getAllUnits":
					bridge.onDriveManagerGetAllUnits(cordova, callbackContext);
					return true;
				default:
					return false;
			}
		} catch (Throwable t) {
			bridge.onError(callbackContext, t);
			return true;
		}
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.json.JSONException;
import org.json.JSONObject;

public class DriveUnit {
	
	public enum DriveType { Internal, External }
	
	String id;
	long totalBytes;
	long freeBytes;
	long usedBytes;
	DriveType type;
	
	public DriveUnit(DriveType type, String id, long total, long free) {
		this.id = id;
		this.type = type;
		this.totalBytes = total;
		this.freeBytes = free;
		this.usedBytes = total-free;
	}
	
	public JSONObject toJSON() {
		JSONObject json = new JSONObject();
		try {
			json.put("id", id)
				.put("total", totalBytes)
				.put("free", freeBytes)
				.put("used", usedBytes)
				.put("type", type);
		} catch (JSONException ignore) {}  // only way to raise it is to pass null for the name argument (see source)
		return json;
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import android.util.Log;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;

/**
 * Error implementation (every call fails).
 * Used as a template and for testing.
 */
public class ErrorBridge implements KiwiBridge.BridgeInterface {
	private static final String TAG = "kiwi";
	
	@Override
	public void onError(CallbackContext callbackContext, Throwable t) {
		Log.d(TAG, "ErrorBridge::onError " + t);
		callbackContext.error(new ErrorObject(t));
	}
	
	
	@Override
	public void onAppManagerExit(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onAppManagerExit");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onAppManagerFinishUpdate(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onAppManagerFinishUpdate");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onAppManagerGetUpdateUrl(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onAppManagerGetUpdateUrl");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onAppManagerUpdate(CordovaInterface cordova, CallbackContext callbackContext, String url) {
		Log.d(TAG, "ErrorBridge::onAppManagerUpdate("+url+")");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onControlManagerGetLocalLock(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onControlManagerGetLocalLock");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onControlManagerGetRemoteLock(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onControlManagerGetRemoteLock");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onControlManagerSetLocalLock(CordovaInterface cordova, CallbackContext callbackContext, ControlLock lock) {
		Log.d(TAG, "ErrorBridge::onControlManagerSetLocalLock(<object>)");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onControlManagerSetRemoteLock(CordovaInterface cordova, CallbackContext callbackContext, ControlLock lock) {
		Log.d(TAG, "ErrorBridge::onControlManagerSetRemoteLock(<object>)");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onDriveManagerGetAllUnits(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onDriveManagerGetAllUnits");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onFileTransferManagerDownload(CordovaInterface cordova, CallbackContext callbackContext, FileTransferRequest request) {
		Log.d(TAG, "ErrorBridge::onFileTransferManagerDownload(<object>)");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onFirmwareManagerGetInterfaceVersion(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onFirmwareManagerGetInterfaceVersion");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onFirmwareManagerGetManufacturer(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onFirmwareManagerGetManufacturer");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onFirmwareManagerGetModelName(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onFirmwareManagerGetModelName");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onFirmwareManagerGetSerialNumber(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onFirmwareManagerGetSerialNumber");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onFirmwareManagerGetVersion(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onFirmwareManagerGetVersion");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onFirmwareManagerUpdate(CordovaInterface cordova, CallbackContext callbackContext, Release release) {
		Log.d(TAG, "ErrorBridge::onFirmwareManagerUpdate(<object>)");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onMemoryManagerGetInfo(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onMemoryManagerGetInfo");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onNetworkManagerGetAllConnections(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onNetworkManagerGetAllConnections");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onPowerManagerCreateTimers(CordovaInterface cordova, CallbackContext callbackContext, PowerTimer timers[]) {
		Log.d(TAG, "ErrorBridge::onPowerManagerCreateTimers("+timers.length+")");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onPowerManagerDeleteAllTimers(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onPowerManagerDeleteAllTimers");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onPowerManagerGetBootDate(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onPowerManagerGetBootDate");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onPowerManagerReboot(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onPowerManagerReboot");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onPowerManagerShutdown(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onPowerManagerShutdown");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onScreenManagerCreateScreenshot(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onScreenManagerCreateScreenshot");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onScreenManagerGetBrightness(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onScreenManagerGetBrightness");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onScreenManagerGetOrientation(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onScreenManagerGetOrientation");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onScreenManagerSetOrientation(CordovaInterface cordova, CallbackContext callbackContext, Orientation orientation) {
		Log.d(TAG, "ErrorBridge::onScreenManagerSetOrientation("+orientation+")");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onSensorManagerGetTemperature(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onSensorManagerGetTemperature");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onSoundManagerGetVolume(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onSoundManagerGetVolume");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onSoundManagerIsMuted(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onSoundManagerIsMuted");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onSoundManagerSetVolume(CordovaInterface cordova, CallbackContext callbackContext, float volume) {
		Log.d(TAG, "ErrorBridge::onSoundManagerSetVolume("+volume+")");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
	@Override
	public void onTimeManagerGetZone(CordovaInterface cordova, CallbackContext callbackContext) {
		Log.d(TAG, "ErrorBridge::onTimeManagerGetZone");
		onError(callbackContext, new RuntimeException("Test fail"));
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.json.JSONException;
import org.json.JSONObject;

/**
 * Wrapper for proper ErrorObject creation.
 */
public class ErrorObject extends JSONObject {
	
	public enum ErrorName {
		Error,
// 		FileTransferError,
		NetworkError,
		NotFoundError,
		NotSupportedError,
		PathExistsError,
		QuotaExceededError,
		TypeError
	}
	
	public ErrorObject(String message, ErrorName name) {
		try {
			this.put("message", message);
			this.put("name", name.toString());
		} catch (JSONException ignore) {}  // the only way this happens is null-key or invalid double value (see code)
	}
	
	public ErrorObject(Throwable t) {
		this(t.getClass().getSimpleName() + ": " + t.getMessage(), ErrorName.Error);
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.json.JSONException;
import org.json.JSONObject;

/**
 * Wrapper for proper FileTransferError creation.
 */
public class FileTransferError extends JSONObject {
	
	public FileTransferError(String message, int status) {
		try {
			this.put("status", status);
			this.put("message", message);
			this.put("name", "FileTransferError");
		} catch (JSONException ignore) {}  // the only way this happens is null-key or invalid double value (see code)
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;


public class FileTransferManager extends CordovaPlugin {
	
	public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
		KiwiBridge.BridgeInterface bridge = KiwiBridge.getInstance();
		try {
			switch (action) {
				case "download":
					FileTransferRequest request = new FileTransferRequest(args);
					bridge.onFileTransferManagerDownload(cordova, callbackContext, request);
					return true;
				default:
					return false;
			}
		} catch (Throwable t) {
			bridge.onError(callbackContext, t);
			return true;
		}
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import android.util.Pair;

import org.json.JSONException;
import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Iterator;


public class FileTransferRequest {
	
	public String url;
	public String destinationPath;
	public ArrayList<Pair<String, String>> headers;
	
	FileTransferRequest(JSONArray fromJSON) throws JSONException {
	
		destinationPath = fromJSON.getString(0);
		
		JSONObject jsonRequest = fromJSON.getJSONObject(1); 
		
		url = jsonRequest.getString("url");
		
		JSONObject jsonHeaders = jsonRequest.optJSONObject("headers");
		if (jsonHeaders != null) {
			headers = new ArrayList<>();
			Iterator<String> keys = jsonHeaders.keys();
			while (keys.hasNext()) {
				String key = keys.next();
				String value = jsonHeaders.getString(key);
				headers.add(new Pair<>(key, value));
			}
		}
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;

public class FirmwareManager extends CordovaPlugin {
	
	public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
		KiwiBridge.BridgeInterface bridge = KiwiBridge.getInstance();
		try {
			switch (action) {
				case "getInterfaceVersion":
					bridge.onFirmwareManagerGetInterfaceVersion(cordova, callbackContext);
					return true;
				case "getManufacturer":
					bridge.onFirmwareManagerGetManufacturer(cordova, callbackContext);
					return true;
				case "getModelName":
					bridge.onFirmwareManagerGetModelName(cordova, callbackContext);
					return true;
				case "getSerialNumber":
					bridge.onFirmwareManagerGetSerialNumber(cordova, callbackContext);
					return true;
				case "getVersion":
					bridge.onFirmwareManagerGetVersion(cordova, callbackContext);
					return true;
				case "update":
					Release release = new Release(args.getJSONObject(0));
					bridge.onFirmwareManagerUpdate(cordova, callbackContext, release);
					return true;
				default:
					return false;
			}
		} catch (Throwable t) {
			bridge.onError(callbackContext, t);
			return true;
		}
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;

/**
 * Class to create a bridge between Cordova and native app.
 * It provides an easy way to switch implementations (e.g. for different devices, testing, etc.).
 */
public class KiwiBridge {
	
	public static final String INTERFACE_VERSION = "0.11.0";
	
	public interface BridgeInterface {
		void onError(CallbackContext callbackContext, Throwable t);
		
		void onAppManagerExit(CordovaInterface cordova, CallbackContext callbackContext);
		void onAppManagerFinishUpdate(CordovaInterface cordova, CallbackContext callbackContext);
		void onAppManagerGetUpdateUrl(CordovaInterface cordova, CallbackContext callbackContext);
		void onAppManagerUpdate(CordovaInterface cordova, CallbackContext callbackContext, String url);
		
		void onControlManagerGetLocalLock(CordovaInterface cordova, CallbackContext callbackContext);
		void onControlManagerGetRemoteLock(CordovaInterface cordova, CallbackContext callbackContext);
		void onControlManagerSetLocalLock(CordovaInterface cordova, CallbackContext callbackContext, ControlLock lock);
		void onControlManagerSetRemoteLock(CordovaInterface cordova, CallbackContext callbackContext, ControlLock lock);
		
		void onDriveManagerGetAllUnits(CordovaInterface cordova, CallbackContext callbackContext);
		
		void onFileTransferManagerDownload(CordovaInterface cordova, CallbackContext callbackContext, FileTransferRequest request);
		
		void onFirmwareManagerGetInterfaceVersion(CordovaInterface cordova, CallbackContext callbackContext);
		void onFirmwareManagerGetManufacturer(CordovaInterface cordova, CallbackContext callbackContext);
		void onFirmwareManagerGetModelName(CordovaInterface cordova, CallbackContext callbackContext);
		void onFirmwareManagerGetSerialNumber(CordovaInterface cordova, CallbackContext callbackContext);
		void onFirmwareManagerGetVersion(CordovaInterface cordova, CallbackContext callbackContext);
		void onFirmwareManagerUpdate(CordovaInterface cordova, CallbackContext callbackContext, Release release);
		
		void onMemoryManagerGetInfo(CordovaInterface cordova, CallbackContext callbackContext);
		
		void onNetworkManagerGetAllConnections(CordovaInterface cordova, CallbackContext callbackContext);
		
		void onPowerManagerCreateTimers(CordovaInterface cordova, CallbackContext callbackContext, PowerTimer timers[]);
		void onPowerManagerDeleteAllTimers(CordovaInterface cordova, CallbackContext callbackContext);
		void onPowerManagerGetBootDate(CordovaInterface cordova, CallbackContext callbackContext);
		void onPowerManagerReboot(CordovaInterface cordova, CallbackContext callbackContext);
		void onPowerManagerShutdown(CordovaInterface cordova, CallbackContext callbackContext);
		
		void onScreenManagerCreateScreenshot(CordovaInterface cordova, CallbackContext callbackContext);
		void onScreenManagerGetBrightness(CordovaInterface cordova, CallbackContext callbackContext);
		void onScreenManagerGetOrientation(CordovaInterface cordova, CallbackContext callbackContext);
		void onScreenManagerSetOrientation(CordovaInterface cordova, CallbackContext callbackContext, Orientation orientation);
		
		void onSensorManagerGetTemperature(CordovaInterface cordova, CallbackContext callbackContext);
		
		void onSoundManagerGetVolume(CordovaInterface cordova, CallbackContext callbackContext);
		void onSoundManagerIsMuted(CordovaInterface cordova, CallbackContext callbackContext);
		void onSoundManagerSetVolume(CordovaInterface cordova, CallbackContext callbackContext, float volume);
		
		void onTimeManagerGetZone(CordovaInterface cordova, CallbackContext callbackContext);
	}
	
	
	private static BridgeInterface mInstance = new ErrorBridge();
	
	/**
	 * Only call this once (preferably in app init).
	 */
	public static void setInstance(BridgeInterface implementation) {
		mInstance = implementation;
	}
	
	public static BridgeInterface getInstance() {
		return mInstance;
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.json.JSONException;
import org.json.JSONObject;

public class MemoryInfo {
	
	long totalBytes;
	long freeBytes;
	long usedBytes;
	
	public MemoryInfo(long total, long free, long used) {
		this.totalBytes = total;
		this.freeBytes = free;
		this.usedBytes = used;
	}
	
	public JSONObject toJSON() {
		JSONObject json = new JSONObject();
		try {
			json.put("total", totalBytes)
				.put("free", freeBytes)
				.put("used", usedBytes);
		} catch (JSONException ignore) {}  // only way to raise it is to pass null for the name argument (see source)
		return json;
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;

public class MemoryManager extends CordovaPlugin {
	
	public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
		KiwiBridge.BridgeInterface bridge = KiwiBridge.getInstance();
		try {
			switch (action) {
				case "getInfo":
					bridge.onMemoryManagerGetInfo(cordova, callbackContext);
					return true;
				default:
					return false;
			}
		} catch (Throwable t) {
			bridge.onError(callbackContext, t);
			return true;
		}
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.json.JSONException;
import org.json.JSONObject;

public class NetworkConnection {
	
	public enum NetworkType { Ethernet, Wifi }

	String ip;
	String mac;
	NetworkType type;
	
	public NetworkConnection(String ip, String mac, NetworkType type) {
		this.ip = ip;
		this.mac = mac;
		this.type = type;
	}
	
	public JSONObject toJSON() {
		JSONObject json = new JSONObject();
		try {
			if (ip != null)
				json.put("ip", ip);
			json.put("mac", mac);
			json.put("type", type);
		} catch (JSONException ignore) {}  // only way to raise it is to pass null for the name argument (see source)
		return json;
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;

public class NetworkManager extends CordovaPlugin {
	
	public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
		KiwiBridge.BridgeInterface bridge = KiwiBridge.getInstance();
		try {
			switch (action) {
				case "getAllConnections":
					bridge.onNetworkManagerGetAllConnections(cordova, callbackContext);
					return true;
				default:
					return false;
			}
		} catch (Throwable t) {
			bridge.onError(callbackContext, t);
			return true;
		}
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import android.view.Surface;

public enum Orientation {

	Clockwise0,
	Clockwise90,
	Clockwise180,
	Clockwise270;
	
	public int toRotation() {
		switch (this) {
			case Clockwise0:	return Surface.ROTATION_0;
			case Clockwise90:	return Surface.ROTATION_270;
			case Clockwise180:	return Surface.ROTATION_180;
			case Clockwise270:	return Surface.ROTATION_90;
		}
		// java being stupid here
		return Surface.ROTATION_0;
	}

}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONObject;

public class PowerManager extends CordovaPlugin {
	
	public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
		KiwiBridge.BridgeInterface bridge = KiwiBridge.getInstance();
		try {
			switch (action) {
				case "createTimers":
					JSONArray jsonArray = args.getJSONArray(0);
					int length = jsonArray.length();
					PowerTimer timers[] = new PowerTimer[length];
					for (int i = 0; i < length; ++i) {
						JSONObject json = jsonArray.getJSONObject(i);
						timers[i] = new PowerTimer(json);
					}
					bridge.onPowerManagerCreateTimers(cordova, callbackContext, timers);
					return true;
				case "deleteAllTimers":
					bridge.onPowerManagerDeleteAllTimers(cordova, callbackContext);
					return true;
				case "getBootDate":
					bridge.onPowerManagerGetBootDate(cordova, callbackContext);
					return true;
				case "reboot":
					bridge.onPowerManagerReboot(cordova, callbackContext);
					return true;
				case "shutdown":
					bridge.onPowerManagerShutdown(cordova, callbackContext);
					return true;
				default:
					return false;
			}
		} catch (Throwable t) {
			bridge.onError(callbackContext, t);
			return true;
		}
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.json.JSONException;
import org.json.JSONObject;

public class PowerTimer {
	
	public enum Command { On, Off }
	
	public Command command;
	public int millis;	// relative unix millis from start of week
	
	PowerTimer(JSONObject fromJSON) throws JSONException, IllegalArgumentException {
		int day = fromJSON.getInt("day");
		if (day < 0 || day > 6) throw new IllegalArgumentException("Day not in range 0..6");
		int hour = fromJSON.getInt("hour");
		if (hour < 0 || hour > 23) throw new IllegalArgumentException("Hour not in range 0..23");
		int minute = fromJSON.getInt("minute");
		if (minute < 0 || minute > 59) throw new IllegalArgumentException("Minute not in range 0..59");
		int second = fromJSON.getInt("second");
		if (second < 0 || second > 59) throw new IllegalArgumentException("Second not in range 0..59");
		
		millis = (((day*24 + hour)*60 + minute)*60 + second)*1000;
		
		command = Command.valueOf(fromJSON.getString("command"));
	}
	
	public PowerTimer(Command command, int millis) {
		this.command = command;
		this.millis = millis;
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.json.JSONException;
import org.json.JSONObject;

public class Release {
	
	public int size;
	public String url;
	
	public Release(JSONObject fromJSON) throws JSONException {
		size = fromJSON.getInt("size");
		url = fromJSON.getString("url");
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;

public class ScreenManager extends CordovaPlugin {
	
	public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
		KiwiBridge.BridgeInterface bridge = KiwiBridge.getInstance();
		try {
			switch (action) {
				case "createScreenshot":
					bridge.onScreenManagerCreateScreenshot(cordova, callbackContext);
					return true;
				case "getBrightness":
					bridge.onScreenManagerGetBrightness(cordova, callbackContext);
					return true;
				case "getOrientation":
					bridge.onScreenManagerGetOrientation(cordova, callbackContext);
					return true;
				case "setOrientation":
					Orientation orientation = Orientation.valueOf(args.getString(0));
					bridge.onScreenManagerSetOrientation(cordova, callbackContext, orientation);
					return true;
				default:
					return false;
			}
		} catch (Throwable t) {
			bridge.onError(callbackContext, t);
			return true;
		}
	}

}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;

public class SensorManager extends CordovaPlugin {
	
	public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
		KiwiBridge.BridgeInterface bridge = KiwiBridge.getInstance();
		try {
			switch (action) {
				case "getTemperature":
					bridge.onSensorManagerGetTemperature(cordova, callbackContext);
					return true;
				default:
					return false;
			}
		} catch (Throwable t) {
			bridge.onError(callbackContext, t);
			return true;
		}
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;

public class SoundManager extends CordovaPlugin {
	
	public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
		KiwiBridge.BridgeInterface bridge = KiwiBridge.getInstance();
		try {
			switch (action) {
				case "getVolume":
					bridge.onSoundManagerGetVolume(cordova, callbackContext);
					return true;
				case "isMuted":
					bridge.onSoundManagerIsMuted(cordova, callbackContext);
					return true;
				case "setVolume":
					bridge.onSoundManagerSetVolume(cordova, callbackContext, (float)args.getDouble(0));
					return true;
				default:
					return false;
			}
		} catch (Throwable t) {
			bridge.onError(callbackContext, t);
			return true;
		}
	}
	
}
/**
 * @author JaromÃ­r SmrÄ�ek <4plague@gmail.com>
 * @copyright Ki-Wi Digital s.r.o.
 * @license
 * All Rights Reserved.
 * Unauthorized copying of this file is strictly prohibited.
 * Proprietary and confidential.
 */

package cz.kiwi.android.light.bridge;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;

public class TimeManager extends CordovaPlugin {
	
	public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
		KiwiBridge.BridgeInterface bridge = KiwiBridge.getInstance();
		try {
			switch (action) {
				case "getZone":
					bridge.onTimeManagerGetZone(cordova, callbackContext);
					return true;
				default:
					return false;
			}
		} catch (Throwable t) {
			bridge.onError(callbackContext, t);
			return true;
		}
	}
	
}
'use strict';
const packageJson = require('package-json');

const lastestVersion = async (packageName, options) => {
	const {version} = await packageJson(packageName.toLowerCase(), options);
	return version;
};

module.exports = lastestVersion;
// TODO: Remove this for the next major release
module.exports.default = lastestVersion;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "package-json": "^6.3.0"
  },
  "deprecated": false,
  "description": "Get the latest version of an npm package",
  "devDependencies": {
    "ava": "^1.4.1",
    "semver": "^6.0.0",
    "semver-regex": "^2.0.0",
    "tsd": "^0.7.2",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/sindresorhus/latest-version#readme",
  "license": "MIT",
  "name": "latest-version",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/latest-version.git"
  },
  "version": "5.1.0"
}{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "babel": {
    "presets": [
      "babel-preset-ts-node6-bluebird"
    ]
  },
  "deprecated": false,
  "description": "Lazy value.",
  "devDependencies": {
    "babel-preset-ts-node6-bluebird": "^3.0.1",
    "ts-babel": "^6.1.2",
    "typescript": "^3.3.3333"
  },
  "files": [
    "out"
  ],
  "homepage": "https://github.com/develar/lazy-val",
  "license": "MIT",
  "main": "out/main.js",
  "name": "lazy-val",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/develar/lazy-val.git"
  },
  "typings": "./out/main.d.ts",
  "version": "1.0.4"
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Lazy = void 0;

class Lazy {
  constructor(creator) {
    this._value = null;
    this.creator = creator;
  }

  get hasValue() {
    return this.creator == null;
  }

  get value() {
    if (this.creator == null) {
      return this._value;
    }

    const result = this.creator();
    this.value = result;
    return result;
  }

  set value(value) {
    this._value = value;
    this.creator = null;
  }

} exports.Lazy = Lazy;
// __ts-babel@6.0.4
//# sourceMappingURL=main.js.map{"version":3,"sources":["../src/main.ts"],"names":[],"mappings":";;;;;;;AAAM,MAAO,IAAP,CAAW;AAIf,EAAA,WAAA,CAAY,OAAZ,EAAqC;AAH7B,SAAA,MAAA,GAA4B,IAA5B;AAIN,SAAK,OAAL,GAAe,OAAf;AACD;;AAED,MAAI,QAAJ,GAAY;AACV,WAAO,KAAK,OAAL,IAAgB,IAAvB;AACD;;AAED,MAAI,KAAJ,GAAS;AACP,QAAI,KAAK,OAAL,IAAgB,IAApB,EAA0B;AACxB,aAAO,KAAK,MAAZ;AACD;;AAED,UAAM,MAAM,GAAG,KAAK,OAAL,EAAf;AACA,SAAK,KAAL,GAAa,MAAb;AACA,WAAO,MAAP;AACD;;AAED,MAAI,KAAJ,CAAU,KAAV,EAA2B;AACzB,SAAK,MAAL,GAAc,KAAd;AACA,SAAK,OAAL,GAAe,IAAf;AACD;;AAzBc,C","sourcesContent":["export class Lazy<T> {\n  private _value: Promise<T> | null = null\n  private creator: (() => Promise<T>) | null\n\n  constructor(creator: () => Promise<T>) {\n    this.creator = creator\n  }\n\n  get hasValue() {\n    return this.creator == null\n  }\n\n  get value(): Promise<T> {\n    if (this.creator == null) {\n      return this._value!!\n    }\n\n    const result = this.creator()\n    this.value = result\n    return result\n  }\n\n  set value(value: Promise<T>) {\n    this._value = value\n    this.creator = null\n  }\n}"],"sourceRoot":""}
'use strict';
var path = require('path');
var fs = require('graceful-fs');
var stripBom = require('strip-bom');
var parseJson = require('parse-json');
var Promise = require('pinkie-promise');
var pify = require('pify');

function parse(x, fp) {
	return parseJson(stripBom(x), path.relative(process.cwd(), fp));
}

module.exports = function (fp) {
	return pify(fs.readFile, Promise)(fp, 'utf8').then(function (data) {
		return parse(data, fp);
	});
};

module.exports.sync = function (fp) {
	return parse(fs.readFileSync(fp, 'utf8'), fp);
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "graceful-fs": "^4.1.2",
    "parse-json": "^2.2.0",
    "pify": "^2.0.0",
    "pinkie-promise": "^2.0.0",
    "strip-bom": "^2.0.0"
  },
  "deprecated": false,
  "description": "Read and parse a JSON file",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/load-json-file#readme",
  "license": "MIT",
  "name": "load-json-file",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/load-json-file.git"
  },
  "version": "1.1.0"
}'use strict';
const path = require('path');
const pathExists = require('path-exists');
const pLocate = require('p-locate');

module.exports = (iterable, options) => {
	options = Object.assign({
		cwd: process.cwd()
	}, options);

	return pLocate(iterable, el => pathExists(path.resolve(options.cwd, el)), options);
};

module.exports.sync = (iterable, options) => {
	options = Object.assign({
		cwd: process.cwd()
	}, options);

	for (const el of iterable) {
		if (pathExists.sync(path.resolve(options.cwd, el))) {
			return el;
		}
	}
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "p-locate": "^3.0.0",
    "path-exists": "^3.0.0"
  },
  "deprecated": false,
  "description": "Get the first path that exists on disk of multiple paths",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/locate-path#readme",
  "license": "MIT",
  "name": "locate-path",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/locate-path.git"
  },
  "version": "3.0.0"
}'use strict';
var util = require('util');
var currentlyUnhandled = require('currently-unhandled');

// WARNING: This undocumented API is subject to change.

module.exports = util.deprecate(function (process) {
	return {
		currentlyUnhandled: currentlyUnhandled(process)
	};
}, 'loudRejection/api is deprecated. Use the currently-unhandled module instead.');
'use strict';
var util = require('util');
var onExit = require('signal-exit');
var currentlyUnhandled = require('currently-unhandled');

var installed = false;

module.exports = function (log) {
	if (installed) {
		return;
	}

	installed = true;

	log = log || console.error;

	var listUnhandled = currentlyUnhandled();

	onExit(function () {
		var unhandledRejections = listUnhandled();

		if (unhandledRejections.length > 0) {
			unhandledRejections.forEach(function (x) {
				var err = x.reason;

				if (!(err instanceof Error)) {
					err = new Error('Promise rejected with value: ' + util.inspect(err));
				}

				log(err.stack);
			});

			process.exitCode = 1;
		}
	});
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "currently-unhandled": "^0.4.1",
    "signal-exit": "^3.0.0"
  },
  "deprecated": false,
  "description": "Make unhandled promise rejections fail loudly instead of the default silent fail",
  "devDependencies": {
    "ava": "*",
    "bluebird": "^3.0.5",
    "coveralls": "^2.11.4",
    "delay": "^1.0.0",
    "execa": "^0.4.0",
    "get-stream": "^2.0.0",
    "nyc": "^6.2.1",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js",
    "register.js",
    "api.js"
  ],
  "homepage": "https://github.com/sindresorhus/loud-rejection#readme",
  "license": "MIT",
  "name": "loud-rejection",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/loud-rejection.git"
  },
  "version": "1.6.0"
}'use strict';
require('./')();
'use strict';
module.exports = function (obj) {
	var ret = {};
	var keys = Object.keys(Object(obj));

	for (var i = 0; i < keys.length; i++) {
		ret[keys[i].toLowerCase()] = obj[keys[i]];
	}

	return ret;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Lowercase the keys of an object",
  "devDependencies": {
    "ava": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/lowercase-keys#readme",
  "license": "MIT",
  "name": "lowercase-keys",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/lowercase-keys.git"
  },
  "version": "1.0.1"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
'use strict'

module.exports = LRUCache

// This will be a proper iterable 'Map' in engines that support it,
// or a fakey-fake PseudoMap in older versions.
var Map = require('pseudomap')
var util = require('util')

// A linked list to keep track of recently-used-ness
var Yallist = require('yallist')

// use symbols if possible, otherwise just _props
var hasSymbol = typeof Symbol === 'function' && process.env._nodeLRUCacheForceNoSymbol !== '1'
var makeSymbol
if (hasSymbol) {
  makeSymbol = function (key) {
    return Symbol(key)
  }
} else {
  makeSymbol = function (key) {
    return '_' + key
  }
}

var MAX = makeSymbol('max')
var LENGTH = makeSymbol('length')
var LENGTH_CALCULATOR = makeSymbol('lengthCalculator')
var ALLOW_STALE = makeSymbol('allowStale')
var MAX_AGE = makeSymbol('maxAge')
var DISPOSE = makeSymbol('dispose')
var NO_DISPOSE_ON_SET = makeSymbol('noDisposeOnSet')
var LRU_LIST = makeSymbol('lruList')
var CACHE = makeSymbol('cache')

function naiveLength () { return 1 }

// lruList is a yallist where the head is the youngest
// item, and the tail is the oldest.  the list contains the Hit
// objects as the entries.
// Each Hit object has a reference to its Yallist.Node.  This
// never changes.
//
// cache is a Map (or PseudoMap) that matches the keys to
// the Yallist.Node object.
function LRUCache (options) {
  if (!(this instanceof LRUCache)) {
    return new LRUCache(options)
  }

  if (typeof options === 'number') {
    options = { max: options }
  }

  if (!options) {
    options = {}
  }

  var max = this[MAX] = options.max
  // Kind of weird to have a default max of Infinity, but oh well.
  if (!max ||
      !(typeof max === 'number') ||
      max <= 0) {
    this[MAX] = Infinity
  }

  var lc = options.length || naiveLength
  if (typeof lc !== 'function') {
    lc = naiveLength
  }
  this[LENGTH_CALCULATOR] = lc

  this[ALLOW_STALE] = options.stale || false
  this[MAX_AGE] = options.maxAge || 0
  this[DISPOSE] = options.dispose
  this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false
  this.reset()
}

// resize the cache when the max changes.
Object.defineProperty(LRUCache.prototype, 'max', {
  set: function (mL) {
    if (!mL || !(typeof mL === 'number') || mL <= 0) {
      mL = Infinity
    }
    this[MAX] = mL
    trim(this)
  },
  get: function () {
    return this[MAX]
  },
  enumerable: true
})

Object.defineProperty(LRUCache.prototype, 'allowStale', {
  set: function (allowStale) {
    this[ALLOW_STALE] = !!allowStale
  },
  get: function () {
    return this[ALLOW_STALE]
  },
  enumerable: true
})

Object.defineProperty(LRUCache.prototype, 'maxAge', {
  set: function (mA) {
    if (!mA || !(typeof mA === 'number') || mA < 0) {
      mA = 0
    }
    this[MAX_AGE] = mA
    trim(this)
  },
  get: function () {
    return this[MAX_AGE]
  },
  enumerable: true
})

// resize the cache when the lengthCalculator changes.
Object.defineProperty(LRUCache.prototype, 'lengthCalculator', {
  set: function (lC) {
    if (typeof lC !== 'function') {
      lC = naiveLength
    }
    if (lC !== this[LENGTH_CALCULATOR]) {
      this[LENGTH_CALCULATOR] = lC
      this[LENGTH] = 0
      this[LRU_LIST].forEach(function (hit) {
        hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key)
        this[LENGTH] += hit.length
      }, this)
    }
    trim(this)
  },
  get: function () { return this[LENGTH_CALCULATOR] },
  enumerable: true
})

Object.defineProperty(LRUCache.prototype, 'length', {
  get: function () { return this[LENGTH] },
  enumerable: true
})

Object.defineProperty(LRUCache.prototype, 'itemCount', {
  get: function () { return this[LRU_LIST].length },
  enumerable: true
})

LRUCache.prototype.rforEach = function (fn, thisp) {
  thisp = thisp || this
  for (var walker = this[LRU_LIST].tail; walker !== null;) {
    var prev = walker.prev
    forEachStep(this, fn, walker, thisp)
    walker = prev
  }
}

function forEachStep (self, fn, node, thisp) {
  var hit = node.value
  if (isStale(self, hit)) {
    del(self, node)
    if (!self[ALLOW_STALE]) {
      hit = undefined
    }
  }
  if (hit) {
    fn.call(thisp, hit.value, hit.key, self)
  }
}

LRUCache.prototype.forEach = function (fn, thisp) {
  thisp = thisp || this
  for (var walker = this[LRU_LIST].head; walker !== null;) {
    var next = walker.next
    forEachStep(this, fn, walker, thisp)
    walker = next
  }
}

LRUCache.prototype.keys = function () {
  return this[LRU_LIST].toArray().map(function (k) {
    return k.key
  }, this)
}

LRUCache.prototype.values = function () {
  return this[LRU_LIST].toArray().map(function (k) {
    return k.value
  }, this)
}

LRUCache.prototype.reset = function () {
  if (this[DISPOSE] &&
      this[LRU_LIST] &&
      this[LRU_LIST].length) {
    this[LRU_LIST].forEach(function (hit) {
      this[DISPOSE](hit.key, hit.value)
    }, this)
  }

  this[CACHE] = new Map() // hash of items by key
  this[LRU_LIST] = new Yallist() // list of items in order of use recency
  this[LENGTH] = 0 // length of items in the list
}

LRUCache.prototype.dump = function () {
  return this[LRU_LIST].map(function (hit) {
    if (!isStale(this, hit)) {
      return {
        k: hit.key,
        v: hit.value,
        e: hit.now + (hit.maxAge || 0)
      }
    }
  }, this).toArray().filter(function (h) {
    return h
  })
}

LRUCache.prototype.dumpLru = function () {
  return this[LRU_LIST]
}

/* istanbul ignore next */
LRUCache.prototype.inspect = function (n, opts) {
  var str = 'LRUCache {'
  var extras = false

  var as = this[ALLOW_STALE]
  if (as) {
    str += '\n  allowStale: true'
    extras = true
  }

  var max = this[MAX]
  if (max && max !== Infinity) {
    if (extras) {
      str += ','
    }
    str += '\n  max: ' + util.inspect(max, opts)
    extras = true
  }

  var maxAge = this[MAX_AGE]
  if (maxAge) {
    if (extras) {
      str += ','
    }
    str += '\n  maxAge: ' + util.inspect(maxAge, opts)
    extras = true
  }

  var lc = this[LENGTH_CALCULATOR]
  if (lc && lc !== naiveLength) {
    if (extras) {
      str += ','
    }
    str += '\n  length: ' + util.inspect(this[LENGTH], opts)
    extras = true
  }

  var didFirst = false
  this[LRU_LIST].forEach(function (item) {
    if (didFirst) {
      str += ',\n  '
    } else {
      if (extras) {
        str += ',\n'
      }
      didFirst = true
      str += '\n  '
    }
    var key = util.inspect(item.key).split('\n').join('\n  ')
    var val = { value: item.value }
    if (item.maxAge !== maxAge) {
      val.maxAge = item.maxAge
    }
    if (lc !== naiveLength) {
      val.length = item.length
    }
    if (isStale(this, item)) {
      val.stale = true
    }

    val = util.inspect(val, opts).split('\n').join('\n  ')
    str += key + ' => ' + val
  })

  if (didFirst || extras) {
    str += '\n'
  }
  str += '}'

  return str
}

LRUCache.prototype.set = function (key, value, maxAge) {
  maxAge = maxAge || this[MAX_AGE]

  var now = maxAge ? Date.now() : 0
  var len = this[LENGTH_CALCULATOR](value, key)

  if (this[CACHE].has(key)) {
    if (len > this[MAX]) {
      del(this, this[CACHE].get(key))
      return false
    }

    var node = this[CACHE].get(key)
    var item = node.value

    // dispose of the old one before overwriting
    // split out into 2 ifs for better coverage tracking
    if (this[DISPOSE]) {
      if (!this[NO_DISPOSE_ON_SET]) {
        this[DISPOSE](key, item.value)
      }
    }

    item.now = now
    item.maxAge = maxAge
    item.value = value
    this[LENGTH] += len - item.length
    item.length = len
    this.get(key)
    trim(this)
    return true
  }

  var hit = new Entry(key, value, len, now, maxAge)

  // oversized objects fall out of cache automatically.
  if (hit.length > this[MAX]) {
    if (this[DISPOSE]) {
      this[DISPOSE](key, value)
    }
    return false
  }

  this[LENGTH] += hit.length
  this[LRU_LIST].unshift(hit)
  this[CACHE].set(key, this[LRU_LIST].head)
  trim(this)
  return true
}

LRUCache.prototype.has = function (key) {
  if (!this[CACHE].has(key)) return false
  var hit = this[CACHE].get(key).value
  if (isStale(this, hit)) {
    return false
  }
  return true
}

LRUCache.prototype.get = function (key) {
  return get(this, key, true)
}

LRUCache.prototype.peek = function (key) {
  return get(this, key, false)
}

LRUCache.prototype.pop = function () {
  var node = this[LRU_LIST].tail
  if (!node) return null
  del(this, node)
  return node.value
}

LRUCache.prototype.del = function (key) {
  del(this, this[CACHE].get(key))
}

LRUCache.prototype.load = function (arr) {
  // reset the cache
  this.reset()

  var now = Date.now()
  // A previous serialized cache has the most recent items first
  for (var l = arr.length - 1; l >= 0; l--) {
    var hit = arr[l]
    var expiresAt = hit.e || 0
    if (expiresAt === 0) {
      // the item was created without expiration in a non aged cache
      this.set(hit.k, hit.v)
    } else {
      var maxAge = expiresAt - now
      // dont add already expired items
      if (maxAge > 0) {
        this.set(hit.k, hit.v, maxAge)
      }
    }
  }
}

LRUCache.prototype.prune = function () {
  var self = this
  this[CACHE].forEach(function (value, key) {
    get(self, key, false)
  })
}

function get (self, key, doUse) {
  var node = self[CACHE].get(key)
  if (node) {
    var hit = node.value
    if (isStale(self, hit)) {
      del(self, node)
      if (!self[ALLOW_STALE]) hit = undefined
    } else {
      if (doUse) {
        self[LRU_LIST].unshiftNode(node)
      }
    }
    if (hit) hit = hit.value
  }
  return hit
}

function isStale (self, hit) {
  if (!hit || (!hit.maxAge && !self[MAX_AGE])) {
    return false
  }
  var stale = false
  var diff = Date.now() - hit.now
  if (hit.maxAge) {
    stale = diff > hit.maxAge
  } else {
    stale = self[MAX_AGE] && (diff > self[MAX_AGE])
  }
  return stale
}

function trim (self) {
  if (self[LENGTH] > self[MAX]) {
    for (var walker = self[LRU_LIST].tail;
      self[LENGTH] > self[MAX] && walker !== null;) {
      // We know that we're about to delete this one, and also
      // what the next least recently used key will be, so just
      // go ahead and set it now.
      var prev = walker.prev
      del(self, walker)
      walker = prev
    }
  }
}

function del (self, node) {
  if (node) {
    var hit = node.value
    if (self[DISPOSE]) {
      self[DISPOSE](hit.key, hit.value)
    }
    self[LENGTH] -= hit.length
    self[CACHE].delete(hit.key)
    self[LRU_LIST].removeNode(node)
  }
}

// classy, since V8 prefers predictable objects.
function Entry (key, value, length, now, maxAge) {
  this.key = key
  this.value = value
  this.length = length
  this.now = now
  this.maxAge = maxAge || 0
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me"
  },
  "dependencies": {
    "pseudomap": "^1.0.2",
    "yallist": "^2.1.2"
  },
  "deprecated": false,
  "description": "A cache object that deletes the least-recently-used items.",
  "devDependencies": {
    "benchmark": "^2.1.4",
    "standard": "^12.0.1",
    "tap": "^12.1.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/isaacs/node-lru-cache#readme",
  "license": "ISC",
  "main": "index.js",
  "name": "lru-cache",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/node-lru-cache.git"
  },
  "version": "4.1.5"
}'use strict';
const fs = require('fs');
const path = require('path');
const pify = require('pify');

const defaults = {
	mode: 0o777 & (~process.umask()),
	fs
};

// https://github.com/nodejs/node/issues/8987
// https://github.com/libuv/libuv/pull/1088
const checkPath = pth => {
	if (process.platform === 'win32') {
		const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, ''));

		if (pathHasInvalidWinCharacters) {
			const err = new Error(`Path contains invalid characters: ${pth}`);
			err.code = 'EINVAL';
			throw err;
		}
	}
};

module.exports = (input, opts) => Promise.resolve().then(() => {
	checkPath(input);
	opts = Object.assign({}, defaults, opts);

	const mkdir = pify(opts.fs.mkdir);
	const stat = pify(opts.fs.stat);

	const make = pth => {
		return mkdir(pth, opts.mode)
			.then(() => pth)
			.catch(err => {
				if (err.code === 'ENOENT') {
					if (err.message.includes('null bytes') || path.dirname(pth) === pth) {
						throw err;
					}

					return make(path.dirname(pth)).then(() => make(pth));
				}

				return stat(pth)
					.then(stats => stats.isDirectory() ? pth : Promise.reject())
					.catch(() => {
						throw err;
					});
			});
	};

	return make(path.resolve(input));
});

module.exports.sync = (input, opts) => {
	checkPath(input);
	opts = Object.assign({}, defaults, opts);

	const make = pth => {
		try {
			opts.fs.mkdirSync(pth, opts.mode);
		} catch (err) {
			if (err.code === 'ENOENT') {
				if (err.message.includes('null bytes') || path.dirname(pth) === pth) {
					throw err;
				}

				make(path.dirname(pth));
				return make(pth);
			}

			try {
				if (!opts.fs.statSync(pth).isDirectory()) {
					throw new Error('The path is not a directory');
				}
			} catch (_) {
				throw err;
			}
		}

		return pth;
	};

	return make(path.resolve(input));
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "pify": "^3.0.0"
  },
  "deprecated": false,
  "description": "Make a directory and its parents if needed - Think `mkdir -p`",
  "devDependencies": {
    "ava": "*",
    "codecov": "^3.0.0",
    "graceful-fs": "^4.1.11",
    "nyc": "^11.3.0",
    "path-type": "^3.0.0",
    "tempy": "^0.2.1",
    "xo": "^0.20.0"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/make-dir#readme",
  "license": "MIT",
  "name": "make-dir",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/make-dir.git"
  },
  "version": "1.3.0"
}'use strict';
module.exports = function (obj, cb) {
	var ret = {};
	var keys = Object.keys(obj);

	for (var i = 0; i < keys.length; i++) {
		var key = keys[i];
		var res = cb(key, obj[key], obj);
		ret[res[0]] = res[1];
	}

	return ret;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Map object keys and values into a new object",
  "devDependencies": {
    "ava": "0.0.4"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/map-obj#readme",
  "license": "MIT",
  "name": "map-obj",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/map-obj.git"
  },
  "version": "1.0.1"
}'use strict';
var path = require('path');
var minimist = require('minimist');
var objectAssign = require('object-assign');
var camelcaseKeys = require('camelcase-keys');
var decamelize = require('decamelize');
var mapObj = require('map-obj');
var trimNewlines = require('trim-newlines');
var redent = require('redent');
var readPkgUp = require('read-pkg-up');
var loudRejection = require('loud-rejection');
var normalizePackageData = require('normalize-package-data');

// get the uncached parent
delete require.cache[__filename];
var parentDir = path.dirname(module.parent.filename);

module.exports = function (opts, minimistOpts) {
	loudRejection();

	if (Array.isArray(opts) || typeof opts === 'string') {
		opts = {help: opts};
	}

	opts = objectAssign({
		pkg: readPkgUp.sync({
			cwd: parentDir,
			normalize: false
		}).pkg,
		argv: process.argv.slice(2)
	}, opts);

	minimistOpts = objectAssign({}, minimistOpts);

	minimistOpts.default = mapObj(minimistOpts.default || {}, function (key, value) {
		return [decamelize(key, '-'), value];
	});

	if (Array.isArray(opts.help)) {
		opts.help = opts.help.join('\n');
	}

	var pkg = typeof opts.pkg === 'string' ? require(path.join(parentDir, opts.pkg)) : opts.pkg;
	var argv = minimist(opts.argv, minimistOpts);
	var help = redent(trimNewlines(opts.help || ''), 2);

	normalizePackageData(pkg);

	process.title = pkg.bin ? Object.keys(pkg.bin)[0] : pkg.name;

	var description = opts.description;
	if (!description && description !== false) {
		description = pkg.description;
	}

	help = (description ? '\n  ' + description + '\n' : '') + (help ? '\n' + help : '\n');

	var showHelp = function (code) {
		console.log(help);
		process.exit(code || 0);
	};

	if (argv.version && opts.version !== false) {
		console.log(typeof opts.version === 'string' ? opts.version : pkg.version);
		process.exit();
	}

	if (argv.help && opts.help !== false) {
		showHelp();
	}

	var _ = argv._;
	delete argv._;

	return {
		input: _,
		flags: camelcaseKeys(argv),
		pkg: pkg,
		help: help,
		showHelp: showHelp
	};
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "camelcase-keys": "^2.0.0",
    "decamelize": "^1.1.2",
    "loud-rejection": "^1.0.0",
    "map-obj": "^1.0.1",
    "minimist": "^1.1.3",
    "normalize-package-data": "^2.3.4",
    "object-assign": "^4.0.1",
    "read-pkg-up": "^1.0.1",
    "redent": "^1.0.0",
    "trim-newlines": "^1.0.0"
  },
  "deprecated": false,
  "description": "CLI app helper",
  "devDependencies": {
    "ava": "*",
    "execa": "^0.1.1",
    "indent-string": "^2.1.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/meow#readme",
  "license": "MIT",
  "name": "meow",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/meow.git"
  },
  "version": "3.7.0"
}The MIT License (MIT)

Copyright (c) 2010 Benjamin Thomas, Robert Kieffer

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'use strict';

/**
 * @param typeMap [Object] Map of MIME type -> Array[extensions]
 * @param ...
 */
function Mime() {
  this._types = Object.create(null);
  this._extensions = Object.create(null);

  for (var i = 0; i < arguments.length; i++) {
    this.define(arguments[i]);
  }

  this.define = this.define.bind(this);
  this.getType = this.getType.bind(this);
  this.getExtension = this.getExtension.bind(this);
}

/**
 * Define mimetype -> extension mappings.  Each key is a mime-type that maps
 * to an array of extensions associated with the type.  The first extension is
 * used as the default extension for the type.
 *
 * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']});
 *
 * If a type declares an extension that has already been defined, an error will
 * be thrown.  To suppress this error and force the extension to be associated
 * with the new type, pass `force`=true.  Alternatively, you may prefix the
 * extension with "*" to map the type to extension, without mapping the
 * extension to the type.
 *
 * e.g. mime.define({'audio/wav', ['wav']}, {'audio/x-wav', ['*wav']});
 *
 *
 * @param map (Object) type definitions
 * @param force (Boolean) if true, force overriding of existing definitions
 */
Mime.prototype.define = function(typeMap, force) {
  for (var type in typeMap) {
    var extensions = typeMap[type].map(function(t) {return t.toLowerCase()});
    type = type.toLowerCase();

    for (var i = 0; i < extensions.length; i++) {
      var ext = extensions[i];

      // '*' prefix = not the preferred type for this extension.  So fixup the
      // extension, and skip it.
      if (ext[0] == '*') {
        continue;
      }

      if (!force && (ext in this._types)) {
        throw new Error(
          'Attempt to change mapping for "' + ext +
          '" extension from "' + this._types[ext] + '" to "' + type +
          '". Pass `force=true` to allow this, otherwise remove "' + ext +
          '" from the list of extensions for "' + type + '".'
        );
      }

      this._types[ext] = type;
    }

    // Use first extension as default
    if (force || !this._extensions[type]) {
      var ext = extensions[0];
      this._extensions[type] = (ext[0] != '*') ? ext : ext.substr(1)
    }
  }
};

/**
 * Lookup a mime type based on extension
 */
Mime.prototype.getType = function(path) {
  path = String(path);
  var last = path.replace(/^.*[/\\]/, '').toLowerCase();
  var ext = last.replace(/^.*\./, '').toLowerCase();

  var hasPath = last.length < path.length;
  var hasDot = ext.length < last.length - 1;

  return (hasDot || !hasPath) && this._types[ext] || null;
};

/**
 * Return file extension associated with a mime type
 */
Mime.prototype.getExtension = function(type) {
  type = /^\s*([^;\s]*)/.test(type) && RegExp.$1;
  return type && this._extensions[type.toLowerCase()] || null;
};

module.exports = Mime;
#!/usr/bin/env node

'use strict';

var mime = require('.');
var file = process.argv[2];
var type = mime.getType(file);

process.stdout.write(type + '\n');

'use strict';

var Mime = require('./Mime');
module.exports = new Mime(require('./types/standard'), require('./types/other'));
'use strict';

var Mime = require('./Mime');
module.exports = new Mime(require('./types/standard'));
{
  "author": {
    "name": "Robert Kieffer",
    "email": "robert@broofa.com",
    "url": "http://github.com/broofa"
  },
  "bin": {
    "mime": "cli.js"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "A comprehensive library for mime-type mapping",
  "devDependencies": {
    "benchmark": "*",
    "chalk": "*",
    "eslint": "*",
    "mime-db": "1.44.0",
    "mime-score": "1.2.0",
    "mime-types": "2.1.27",
    "mocha": "7.1.2",
    "runmd": "*",
    "standard-version": "7.1.0"
  },
  "engines": {
    "node": ">=4.0.0"
  },
  "files": [
    "index.js",
    "lite.js",
    "Mime.js",
    "cli.js",
    "/types"
  ],
  "homepage": "https://github.com/broofa/mime#readme",
  "license": "MIT",
  "name": "mime",
  "repository": {
    "url": "git+https://github.com/broofa/mime.git",
    "type": "git"
  },
  "version": "2.4.6"
}module.exports = {"application/prs.cww":["cww"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["keynote"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["*iso"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]};module.exports = {"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma","es"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/mrb-consumer+xml":["*xdf"],"application/mrb-publish+xml":["*xdf"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["*xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/ttml+xml":["ttml"],"application/urc-ressheet+xml":["rsheet"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-error+xml":["xer"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/adpcm":["adp"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/stl":["stl"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]};1.44.0 / 2020-04-22
===================

  * Add charsets from IANA
  * Add extension `.cjs` to `application/node`
  * Add new upstream MIME types

1.43.0 / 2020-01-05
===================

  * Add `application/x-keepass2` with extension `.kdbx`
  * Add extension `.mxmf` to `audio/mobile-xmf`
  * Add extensions from IANA for `application/*+xml` types
  * Add new upstream MIME types

1.42.0 / 2019-09-25
===================

  * Add `image/vnd.ms-dds` with extension `.dds`
  * Add new upstream MIME types
  * Remove compressible from `multipart/mixed`

1.41.0 / 2019-08-30
===================

  * Add new upstream MIME types
  * Add `application/toml` with extension `.toml`
  * Mark `font/ttf` as compressible

1.40.0 / 2019-04-20
===================

  * Add extensions from IANA for `model/*` types
  * Add `text/mdx` with extension `.mdx`

1.39.0 / 2019-04-04
===================

  * Add extensions `.siv` and `.sieve` to `application/sieve`
  * Add new upstream MIME types

1.38.0 / 2019-02-04
===================

  * Add extension `.nq` to `application/n-quads`
  * Add extension `.nt` to `application/n-triples`
  * Add new upstream MIME types
  * Mark `text/less` as compressible

1.37.0 / 2018-10-19
===================

  * Add extensions to HEIC image types
  * Add new upstream MIME types

1.36.0 / 2018-08-20
===================

  * Add Apple file extensions from IANA
  * Add extensions from IANA for `image/*` types
  * Add new upstream MIME types

1.35.0 / 2018-07-15
===================

  * Add extension `.owl` to `application/rdf+xml`
  * Add new upstream MIME types
    - Removes extension `.woff` from `application/font-woff`

1.34.0 / 2018-06-03
===================

  * Add extension `.csl` to `application/vnd.citationstyles.style+xml`
  * Add extension `.es` to `application/ecmascript`
  * Add new upstream MIME types
  * Add `UTF-8` as default charset for `text/turtle`
  * Mark all XML-derived types as compressible

1.33.0 / 2018-02-15
===================

  * Add extensions from IANA for `message/*` types
  * Add new upstream MIME types
  * Fix some incorrect OOXML types
  * Remove `application/font-woff2`

1.32.0 / 2017-11-29
===================

  * Add new upstream MIME types
  * Update `text/hjson` to registered `application/hjson`
  * Add `text/shex` with extension `.shex`

1.31.0 / 2017-10-25
===================

  * Add `application/raml+yaml` with extension `.raml`
  * Add `application/wasm` with extension `.wasm`
  * Add new `font` type from IANA
  * Add new upstream font extensions
  * Add new upstream MIME types
  * Add extensions for JPEG-2000 images

1.30.0 / 2017-08-27
===================

  * Add `application/vnd.ms-outlook`
  * Add `application/x-arj`
  * Add extension `.mjs` to `application/javascript`
  * Add glTF types and extensions
  * Add new upstream MIME types
  * Add `text/x-org`
  * Add VirtualBox MIME types
  * Fix `source` records for `video/*` types that are IANA
  * Update `font/opentype` to registered `font/otf`

1.29.0 / 2017-07-10
===================

  * Add `application/fido.trusted-apps+json`
  * Add extension `.wadl` to `application/vnd.sun.wadl+xml`
  * Add new upstream MIME types
  * Add `UTF-8` as default charset for `text/css`

1.28.0 / 2017-05-14
===================

  * Add new upstream MIME types
  * Add extension `.gz` to `application/gzip`
  * Update extensions `.md` and `.markdown` to be `text/markdown`

1.27.0 / 2017-03-16
===================

  * Add new upstream MIME types
  * Add `image/apng` with extension `.apng`

1.26.0 / 2017-01-14
===================

  * Add new upstream MIME types
  * Add extension `.geojson` to `application/geo+json`

1.25.0 / 2016-11-11
===================

  * Add new upstream MIME types

1.24.0 / 2016-09-18
===================

  * Add `audio/mp3`
  * Add new upstream MIME types

1.23.0 / 2016-05-01
===================

  * Add new upstream MIME types
  * Add extension `.3gpp` to `audio/3gpp`

1.22.0 / 2016-02-15
===================

  * Add `text/slim`
  * Add extension `.rng` to `application/xml`
  * Add new upstream MIME types
  * Fix extension of `application/dash+xml` to be `.mpd`
  * Update primary extension to `.m4a` for `audio/mp4`

1.21.0 / 2016-01-06
===================

  * Add Google document types
  * Add new upstream MIME types

1.20.0 / 2015-11-10
===================

  * Add `text/x-suse-ymp`
  * Add new upstream MIME types

1.19.0 / 2015-09-17
===================

  * Add `application/vnd.apple.pkpass`
  * Add new upstream MIME types

1.18.0 / 2015-09-03
===================

  * Add new upstream MIME types

1.17.0 / 2015-08-13
===================

  * Add `application/x-msdos-program`
  * Add `audio/g711-0`
  * Add `image/vnd.mozilla.apng`
  * Add extension `.exe` to `application/x-msdos-program`

1.16.0 / 2015-07-29
===================

  * Add `application/vnd.uri-map`

1.15.0 / 2015-07-13
===================

  * Add `application/x-httpd-php`

1.14.0 / 2015-06-25
===================

  * Add `application/scim+json`
  * Add `application/vnd.3gpp.ussd+xml`
  * Add `application/vnd.biopax.rdf+xml`
  * Add `text/x-processing`

1.13.0 / 2015-06-07
===================

  * Add nginx as a source
  * Add `application/x-cocoa`
  * Add `application/x-java-archive-diff`
  * Add `application/x-makeself`
  * Add `application/x-perl`
  * Add `application/x-pilot`
  * Add `application/x-redhat-package-manager`
  * Add `application/x-sea`
  * Add `audio/x-m4a`
  * Add `audio/x-realaudio`
  * Add `image/x-jng`
  * Add `text/mathml`

1.12.0 / 2015-06-05
===================

  * Add `application/bdoc`
  * Add `application/vnd.hyperdrive+json`
  * Add `application/x-bdoc`
  * Add extension `.rtf` to `text/rtf`

1.11.0 / 2015-05-31
===================

  * Add `audio/wav`
  * Add `audio/wave`
  * Add extension `.litcoffee` to `text/coffeescript`
  * Add extension `.sfd-hdstx` to `application/vnd.hydrostatix.sof-data`
  * Add extension `.n-gage` to `application/vnd.nokia.n-gage.symbian.install`

1.10.0 / 2015-05-19
===================

  * Add `application/vnd.balsamiq.bmpr`
  * Add `application/vnd.microsoft.portable-executable`
  * Add `application/x-ns-proxy-autoconfig`

1.9.1 / 2015-04-19
==================

  * Remove `.json` extension from `application/manifest+json`
    - This is causing bugs downstream

1.9.0 / 2015-04-19
==================

  * Add `application/manifest+json`
  * Add `application/vnd.micro+json`
  * Add `image/vnd.zbrush.pcx`
  * Add `image/x-ms-bmp`

1.8.0 / 2015-03-13
==================

  * Add `application/vnd.citationstyles.style+xml`
  * Add `application/vnd.fastcopy-disk-image`
  * Add `application/vnd.gov.sk.xmldatacontainer+xml`
  * Add extension `.jsonld` to `application/ld+json`

1.7.0 / 2015-02-08
==================

  * Add `application/vnd.gerber`
  * Add `application/vnd.msa-disk-image`

1.6.1 / 2015-02-05
==================

  * Community extensions ownership transferred from `node-mime`

1.6.0 / 2015-01-29
==================

  * Add `application/jose`
  * Add `application/jose+json`
  * Add `application/json-seq`
  * Add `application/jwk+json`
  * Add `application/jwk-set+json`
  * Add `application/jwt`
  * Add `application/rdap+json`
  * Add `application/vnd.gov.sk.e-form+xml`
  * Add `application/vnd.ims.imsccv1p3`

1.5.0 / 2014-12-30
==================

  * Add `application/vnd.oracle.resource+json`
  * Fix various invalid MIME type entries
    - `application/mbox+xml`
    - `application/oscp-response`
    - `application/vwg-multiplexed`
    - `audio/g721`

1.4.0 / 2014-12-21
==================

  * Add `application/vnd.ims.imsccv1p2`
  * Fix various invalid MIME type entries
    - `application/vnd-acucobol`
    - `application/vnd-curl`
    - `application/vnd-dart`
    - `application/vnd-dxr`
    - `application/vnd-fdf`
    - `application/vnd-mif`
    - `application/vnd-sema`
    - `application/vnd-wap-wmlc`
    - `application/vnd.adobe.flash-movie`
    - `application/vnd.dece-zip`
    - `application/vnd.dvb_service`
    - `application/vnd.micrografx-igx`
    - `application/vnd.sealed-doc`
    - `application/vnd.sealed-eml`
    - `application/vnd.sealed-mht`
    - `application/vnd.sealed-ppt`
    - `application/vnd.sealed-tiff`
    - `application/vnd.sealed-xls`
    - `application/vnd.sealedmedia.softseal-html`
    - `application/vnd.sealedmedia.softseal-pdf`
    - `application/vnd.wap-slc`
    - `application/vnd.wap-wbxml`
    - `audio/vnd.sealedmedia.softseal-mpeg`
    - `image/vnd-djvu`
    - `image/vnd-svf`
    - `image/vnd-wap-wbmp`
    - `image/vnd.sealed-png`
    - `image/vnd.sealedmedia.softseal-gif`
    - `image/vnd.sealedmedia.softseal-jpg`
    - `model/vnd-dwf`
    - `model/vnd.parasolid.transmit-binary`
    - `model/vnd.parasolid.transmit-text`
    - `text/vnd-a`
    - `text/vnd-curl`
    - `text/vnd.wap-wml`
  * Remove example template MIME types
    - `application/example`
    - `audio/example`
    - `image/example`
    - `message/example`
    - `model/example`
    - `multipart/example`
    - `text/example`
    - `video/example`

1.3.1 / 2014-12-16
==================

  * Fix missing extensions
    - `application/json5`
    - `text/hjson`

1.3.0 / 2014-12-07
==================

  * Add `application/a2l`
  * Add `application/aml`
  * Add `application/atfx`
  * Add `application/atxml`
  * Add `application/cdfx+xml`
  * Add `application/dii`
  * Add `application/json5`
  * Add `application/lxf`
  * Add `application/mf4`
  * Add `application/vnd.apache.thrift.compact`
  * Add `application/vnd.apache.thrift.json`
  * Add `application/vnd.coffeescript`
  * Add `application/vnd.enphase.envoy`
  * Add `application/vnd.ims.imsccv1p1`
  * Add `text/csv-schema`
  * Add `text/hjson`
  * Add `text/markdown`
  * Add `text/yaml`

1.2.0 / 2014-11-09
==================

  * Add `application/cea`
  * Add `application/dit`
  * Add `application/vnd.gov.sk.e-form+zip`
  * Add `application/vnd.tmd.mediaflex.api+xml`
  * Type `application/epub+zip` is now IANA-registered

1.1.2 / 2014-10-23
==================

  * Rebuild database for `application/x-www-form-urlencoded` change

1.1.1 / 2014-10-20
==================

  * Mark `application/x-www-form-urlencoded` as compressible.

1.1.0 / 2014-09-28
==================

  * Add `application/font-woff2`

1.0.3 / 2014-09-25
==================

  * Fix engine requirement in package

1.0.2 / 2014-09-25
==================

  * Add `application/coap-group+json`
  * Add `application/dcd`
  * Add `application/vnd.apache.thrift.binary`
  * Add `image/vnd.tencent.tap`
  * Mark all JSON-derived types as compressible
  * Update `text/vtt` data

1.0.1 / 2014-08-30
==================

  * Fix extension ordering

1.0.0 / 2014-08-30
==================

  * Add `application/atf`
  * Add `application/merge-patch+json`
  * Add `multipart/x-mixed-replace`
  * Add `source: 'apache'` metadata
  * Add `source: 'iana'` metadata
  * Remove badly-assumed charset data

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong me@jongleberry.com

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "application/1d-interleaved-parityfec": {
    "source": "iana"
  },
  "application/3gpdash-qoe-report+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/3gpp-ims+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/a2l": {
    "source": "iana"
  },
  "application/activemessage": {
    "source": "iana"
  },
  "application/activity+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-costmap+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-costmapfilter+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-directory+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-endpointcost+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-endpointcostparams+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-endpointprop+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-endpointpropparams+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-error+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-networkmap+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-networkmapfilter+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-updatestreamcontrol+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-updatestreamparams+json": {
    "source": "iana",
    "compressible": true
  },
  "application/aml": {
    "source": "iana"
  },
  "application/andrew-inset": {
    "source": "iana",
    "extensions": ["ez"]
  },
  "application/applefile": {
    "source": "iana"
  },
  "application/applixware": {
    "source": "apache",
    "extensions": ["aw"]
  },
  "application/atf": {
    "source": "iana"
  },
  "application/atfx": {
    "source": "iana"
  },
  "application/atom+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["atom"]
  },
  "application/atomcat+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["atomcat"]
  },
  "application/atomdeleted+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["atomdeleted"]
  },
  "application/atomicmail": {
    "source": "iana"
  },
  "application/atomsvc+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["atomsvc"]
  },
  "application/atsc-dwd+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dwd"]
  },
  "application/atsc-dynamic-event-message": {
    "source": "iana"
  },
  "application/atsc-held+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["held"]
  },
  "application/atsc-rdt+json": {
    "source": "iana",
    "compressible": true
  },
  "application/atsc-rsat+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rsat"]
  },
  "application/atxml": {
    "source": "iana"
  },
  "application/auth-policy+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/bacnet-xdd+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/batch-smtp": {
    "source": "iana"
  },
  "application/bdoc": {
    "compressible": false,
    "extensions": ["bdoc"]
  },
  "application/beep+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/calendar+json": {
    "source": "iana",
    "compressible": true
  },
  "application/calendar+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xcs"]
  },
  "application/call-completion": {
    "source": "iana"
  },
  "application/cals-1840": {
    "source": "iana"
  },
  "application/cap+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/cbor": {
    "source": "iana"
  },
  "application/cbor-seq": {
    "source": "iana"
  },
  "application/cccex": {
    "source": "iana"
  },
  "application/ccmp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/ccxml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ccxml"]
  },
  "application/cdfx+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["cdfx"]
  },
  "application/cdmi-capability": {
    "source": "iana",
    "extensions": ["cdmia"]
  },
  "application/cdmi-container": {
    "source": "iana",
    "extensions": ["cdmic"]
  },
  "application/cdmi-domain": {
    "source": "iana",
    "extensions": ["cdmid"]
  },
  "application/cdmi-object": {
    "source": "iana",
    "extensions": ["cdmio"]
  },
  "application/cdmi-queue": {
    "source": "iana",
    "extensions": ["cdmiq"]
  },
  "application/cdni": {
    "source": "iana"
  },
  "application/cea": {
    "source": "iana"
  },
  "application/cea-2018+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cellml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cfw": {
    "source": "iana"
  },
  "application/clue+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/clue_info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cms": {
    "source": "iana"
  },
  "application/cnrp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/coap-group+json": {
    "source": "iana",
    "compressible": true
  },
  "application/coap-payload": {
    "source": "iana"
  },
  "application/commonground": {
    "source": "iana"
  },
  "application/conference-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cose": {
    "source": "iana"
  },
  "application/cose-key": {
    "source": "iana"
  },
  "application/cose-key-set": {
    "source": "iana"
  },
  "application/cpl+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/csrattrs": {
    "source": "iana"
  },
  "application/csta+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cstadata+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/csvm+json": {
    "source": "iana",
    "compressible": true
  },
  "application/cu-seeme": {
    "source": "apache",
    "extensions": ["cu"]
  },
  "application/cwt": {
    "source": "iana"
  },
  "application/cybercash": {
    "source": "iana"
  },
  "application/dart": {
    "compressible": true
  },
  "application/dash+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mpd"]
  },
  "application/dashdelta": {
    "source": "iana"
  },
  "application/davmount+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["davmount"]
  },
  "application/dca-rft": {
    "source": "iana"
  },
  "application/dcd": {
    "source": "iana"
  },
  "application/dec-dx": {
    "source": "iana"
  },
  "application/dialog-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/dicom": {
    "source": "iana"
  },
  "application/dicom+json": {
    "source": "iana",
    "compressible": true
  },
  "application/dicom+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/dii": {
    "source": "iana"
  },
  "application/dit": {
    "source": "iana"
  },
  "application/dns": {
    "source": "iana"
  },
  "application/dns+json": {
    "source": "iana",
    "compressible": true
  },
  "application/dns-message": {
    "source": "iana"
  },
  "application/docbook+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["dbk"]
  },
  "application/dots+cbor": {
    "source": "iana"
  },
  "application/dskpp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/dssc+der": {
    "source": "iana",
    "extensions": ["dssc"]
  },
  "application/dssc+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xdssc"]
  },
  "application/dvcs": {
    "source": "iana"
  },
  "application/ecmascript": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ecma","es"]
  },
  "application/edi-consent": {
    "source": "iana"
  },
  "application/edi-x12": {
    "source": "iana",
    "compressible": false
  },
  "application/edifact": {
    "source": "iana",
    "compressible": false
  },
  "application/efi": {
    "source": "iana"
  },
  "application/emergencycalldata.comment+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.control+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.deviceinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.ecall.msd": {
    "source": "iana"
  },
  "application/emergencycalldata.providerinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.serviceinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.subscriberinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.veds+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emma+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["emma"]
  },
  "application/emotionml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["emotionml"]
  },
  "application/encaprtp": {
    "source": "iana"
  },
  "application/epp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/epub+zip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["epub"]
  },
  "application/eshop": {
    "source": "iana"
  },
  "application/exi": {
    "source": "iana",
    "extensions": ["exi"]
  },
  "application/expect-ct-report+json": {
    "source": "iana",
    "compressible": true
  },
  "application/fastinfoset": {
    "source": "iana"
  },
  "application/fastsoap": {
    "source": "iana"
  },
  "application/fdt+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["fdt"]
  },
  "application/fhir+json": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/fhir+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/fido.trusted-apps+json": {
    "compressible": true
  },
  "application/fits": {
    "source": "iana"
  },
  "application/flexfec": {
    "source": "iana"
  },
  "application/font-sfnt": {
    "source": "iana"
  },
  "application/font-tdpfr": {
    "source": "iana",
    "extensions": ["pfr"]
  },
  "application/font-woff": {
    "source": "iana",
    "compressible": false
  },
  "application/framework-attributes+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/geo+json": {
    "source": "iana",
    "compressible": true,
    "extensions": ["geojson"]
  },
  "application/geo+json-seq": {
    "source": "iana"
  },
  "application/geopackage+sqlite3": {
    "source": "iana"
  },
  "application/geoxacml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/gltf-buffer": {
    "source": "iana"
  },
  "application/gml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["gml"]
  },
  "application/gpx+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["gpx"]
  },
  "application/gxf": {
    "source": "apache",
    "extensions": ["gxf"]
  },
  "application/gzip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["gz"]
  },
  "application/h224": {
    "source": "iana"
  },
  "application/held+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/hjson": {
    "extensions": ["hjson"]
  },
  "application/http": {
    "source": "iana"
  },
  "application/hyperstudio": {
    "source": "iana",
    "extensions": ["stk"]
  },
  "application/ibe-key-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/ibe-pkg-reply+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/ibe-pp-data": {
    "source": "iana"
  },
  "application/iges": {
    "source": "iana"
  },
  "application/im-iscomposing+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/index": {
    "source": "iana"
  },
  "application/index.cmd": {
    "source": "iana"
  },
  "application/index.obj": {
    "source": "iana"
  },
  "application/index.response": {
    "source": "iana"
  },
  "application/index.vnd": {
    "source": "iana"
  },
  "application/inkml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ink","inkml"]
  },
  "application/iotp": {
    "source": "iana"
  },
  "application/ipfix": {
    "source": "iana",
    "extensions": ["ipfix"]
  },
  "application/ipp": {
    "source": "iana"
  },
  "application/isup": {
    "source": "iana"
  },
  "application/its+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["its"]
  },
  "application/java-archive": {
    "source": "apache",
    "compressible": false,
    "extensions": ["jar","war","ear"]
  },
  "application/java-serialized-object": {
    "source": "apache",
    "compressible": false,
    "extensions": ["ser"]
  },
  "application/java-vm": {
    "source": "apache",
    "compressible": false,
    "extensions": ["class"]
  },
  "application/javascript": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["js","mjs"]
  },
  "application/jf2feed+json": {
    "source": "iana",
    "compressible": true
  },
  "application/jose": {
    "source": "iana"
  },
  "application/jose+json": {
    "source": "iana",
    "compressible": true
  },
  "application/jrd+json": {
    "source": "iana",
    "compressible": true
  },
  "application/json": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["json","map"]
  },
  "application/json-patch+json": {
    "source": "iana",
    "compressible": true
  },
  "application/json-seq": {
    "source": "iana"
  },
  "application/json5": {
    "extensions": ["json5"]
  },
  "application/jsonml+json": {
    "source": "apache",
    "compressible": true,
    "extensions": ["jsonml"]
  },
  "application/jwk+json": {
    "source": "iana",
    "compressible": true
  },
  "application/jwk-set+json": {
    "source": "iana",
    "compressible": true
  },
  "application/jwt": {
    "source": "iana"
  },
  "application/kpml-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/kpml-response+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/ld+json": {
    "source": "iana",
    "compressible": true,
    "extensions": ["jsonld"]
  },
  "application/lgr+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["lgr"]
  },
  "application/link-format": {
    "source": "iana"
  },
  "application/load-control+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/lost+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["lostxml"]
  },
  "application/lostsync+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/lpf+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/lxf": {
    "source": "iana"
  },
  "application/mac-binhex40": {
    "source": "iana",
    "extensions": ["hqx"]
  },
  "application/mac-compactpro": {
    "source": "apache",
    "extensions": ["cpt"]
  },
  "application/macwriteii": {
    "source": "iana"
  },
  "application/mads+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mads"]
  },
  "application/manifest+json": {
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["webmanifest"]
  },
  "application/marc": {
    "source": "iana",
    "extensions": ["mrc"]
  },
  "application/marcxml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mrcx"]
  },
  "application/mathematica": {
    "source": "iana",
    "extensions": ["ma","nb","mb"]
  },
  "application/mathml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mathml"]
  },
  "application/mathml-content+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mathml-presentation+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-associated-procedure-description+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-deregister+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-envelope+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-msk+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-msk-response+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-protection-description+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-reception-report+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-register+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-register-response+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-schedule+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-user-service-description+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbox": {
    "source": "iana",
    "extensions": ["mbox"]
  },
  "application/media-policy-dataset+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/media_control+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mediaservercontrol+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mscml"]
  },
  "application/merge-patch+json": {
    "source": "iana",
    "compressible": true
  },
  "application/metalink+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["metalink"]
  },
  "application/metalink4+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["meta4"]
  },
  "application/mets+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mets"]
  },
  "application/mf4": {
    "source": "iana"
  },
  "application/mikey": {
    "source": "iana"
  },
  "application/mipc": {
    "source": "iana"
  },
  "application/mmt-aei+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["maei"]
  },
  "application/mmt-usd+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["musd"]
  },
  "application/mods+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mods"]
  },
  "application/moss-keys": {
    "source": "iana"
  },
  "application/moss-signature": {
    "source": "iana"
  },
  "application/mosskey-data": {
    "source": "iana"
  },
  "application/mosskey-request": {
    "source": "iana"
  },
  "application/mp21": {
    "source": "iana",
    "extensions": ["m21","mp21"]
  },
  "application/mp4": {
    "source": "iana",
    "extensions": ["mp4s","m4p"]
  },
  "application/mpeg4-generic": {
    "source": "iana"
  },
  "application/mpeg4-iod": {
    "source": "iana"
  },
  "application/mpeg4-iod-xmt": {
    "source": "iana"
  },
  "application/mrb-consumer+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xdf"]
  },
  "application/mrb-publish+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xdf"]
  },
  "application/msc-ivr+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/msc-mixer+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/msword": {
    "source": "iana",
    "compressible": false,
    "extensions": ["doc","dot"]
  },
  "application/mud+json": {
    "source": "iana",
    "compressible": true
  },
  "application/multipart-core": {
    "source": "iana"
  },
  "application/mxf": {
    "source": "iana",
    "extensions": ["mxf"]
  },
  "application/n-quads": {
    "source": "iana",
    "extensions": ["nq"]
  },
  "application/n-triples": {
    "source": "iana",
    "extensions": ["nt"]
  },
  "application/nasdata": {
    "source": "iana"
  },
  "application/news-checkgroups": {
    "source": "iana",
    "charset": "US-ASCII"
  },
  "application/news-groupinfo": {
    "source": "iana",
    "charset": "US-ASCII"
  },
  "application/news-transmission": {
    "source": "iana"
  },
  "application/nlsml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/node": {
    "source": "iana",
    "extensions": ["cjs"]
  },
  "application/nss": {
    "source": "iana"
  },
  "application/ocsp-request": {
    "source": "iana"
  },
  "application/ocsp-response": {
    "source": "iana"
  },
  "application/octet-stream": {
    "source": "iana",
    "compressible": false,
    "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]
  },
  "application/oda": {
    "source": "iana",
    "extensions": ["oda"]
  },
  "application/odm+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/odx": {
    "source": "iana"
  },
  "application/oebps-package+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["opf"]
  },
  "application/ogg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["ogx"]
  },
  "application/omdoc+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["omdoc"]
  },
  "application/onenote": {
    "source": "apache",
    "extensions": ["onetoc","onetoc2","onetmp","onepkg"]
  },
  "application/oscore": {
    "source": "iana"
  },
  "application/oxps": {
    "source": "iana",
    "extensions": ["oxps"]
  },
  "application/p2p-overlay+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["relo"]
  },
  "application/parityfec": {
    "source": "iana"
  },
  "application/passport": {
    "source": "iana"
  },
  "application/patch-ops-error+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xer"]
  },
  "application/pdf": {
    "source": "iana",
    "compressible": false,
    "extensions": ["pdf"]
  },
  "application/pdx": {
    "source": "iana"
  },
  "application/pem-certificate-chain": {
    "source": "iana"
  },
  "application/pgp-encrypted": {
    "source": "iana",
    "compressible": false,
    "extensions": ["pgp"]
  },
  "application/pgp-keys": {
    "source": "iana"
  },
  "application/pgp-signature": {
    "source": "iana",
    "extensions": ["asc","sig"]
  },
  "application/pics-rules": {
    "source": "apache",
    "extensions": ["prf"]
  },
  "application/pidf+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/pidf-diff+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/pkcs10": {
    "source": "iana",
    "extensions": ["p10"]
  },
  "application/pkcs12": {
    "source": "iana"
  },
  "application/pkcs7-mime": {
    "source": "iana",
    "extensions": ["p7m","p7c"]
  },
  "application/pkcs7-signature": {
    "source": "iana",
    "extensions": ["p7s"]
  },
  "application/pkcs8": {
    "source": "iana",
    "extensions": ["p8"]
  },
  "application/pkcs8-encrypted": {
    "source": "iana"
  },
  "application/pkix-attr-cert": {
    "source": "iana",
    "extensions": ["ac"]
  },
  "application/pkix-cert": {
    "source": "iana",
    "extensions": ["cer"]
  },
  "application/pkix-crl": {
    "source": "iana",
    "extensions": ["crl"]
  },
  "application/pkix-pkipath": {
    "source": "iana",
    "extensions": ["pkipath"]
  },
  "application/pkixcmp": {
    "source": "iana",
    "extensions": ["pki"]
  },
  "application/pls+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["pls"]
  },
  "application/poc-settings+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/postscript": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ai","eps","ps"]
  },
  "application/ppsp-tracker+json": {
    "source": "iana",
    "compressible": true
  },
  "application/problem+json": {
    "source": "iana",
    "compressible": true
  },
  "application/problem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/provenance+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["provx"]
  },
  "application/prs.alvestrand.titrax-sheet": {
    "source": "iana"
  },
  "application/prs.cww": {
    "source": "iana",
    "extensions": ["cww"]
  },
  "application/prs.hpub+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/prs.nprend": {
    "source": "iana"
  },
  "application/prs.plucker": {
    "source": "iana"
  },
  "application/prs.rdf-xml-crypt": {
    "source": "iana"
  },
  "application/prs.xsf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/pskc+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["pskcxml"]
  },
  "application/pvd+json": {
    "source": "iana",
    "compressible": true
  },
  "application/qsig": {
    "source": "iana"
  },
  "application/raml+yaml": {
    "compressible": true,
    "extensions": ["raml"]
  },
  "application/raptorfec": {
    "source": "iana"
  },
  "application/rdap+json": {
    "source": "iana",
    "compressible": true
  },
  "application/rdf+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rdf","owl"]
  },
  "application/reginfo+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rif"]
  },
  "application/relax-ng-compact-syntax": {
    "source": "iana",
    "extensions": ["rnc"]
  },
  "application/remote-printing": {
    "source": "iana"
  },
  "application/reputon+json": {
    "source": "iana",
    "compressible": true
  },
  "application/resource-lists+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rl"]
  },
  "application/resource-lists-diff+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rld"]
  },
  "application/rfc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/riscos": {
    "source": "iana"
  },
  "application/rlmi+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/rls-services+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rs"]
  },
  "application/route-apd+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rapd"]
  },
  "application/route-s-tsid+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sls"]
  },
  "application/route-usd+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rusd"]
  },
  "application/rpki-ghostbusters": {
    "source": "iana",
    "extensions": ["gbr"]
  },
  "application/rpki-manifest": {
    "source": "iana",
    "extensions": ["mft"]
  },
  "application/rpki-publication": {
    "source": "iana"
  },
  "application/rpki-roa": {
    "source": "iana",
    "extensions": ["roa"]
  },
  "application/rpki-updown": {
    "source": "iana"
  },
  "application/rsd+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["rsd"]
  },
  "application/rss+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["rss"]
  },
  "application/rtf": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rtf"]
  },
  "application/rtploopback": {
    "source": "iana"
  },
  "application/rtx": {
    "source": "iana"
  },
  "application/samlassertion+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/samlmetadata+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/sbe": {
    "source": "iana"
  },
  "application/sbml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sbml"]
  },
  "application/scaip+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/scim+json": {
    "source": "iana",
    "compressible": true
  },
  "application/scvp-cv-request": {
    "source": "iana",
    "extensions": ["scq"]
  },
  "application/scvp-cv-response": {
    "source": "iana",
    "extensions": ["scs"]
  },
  "application/scvp-vp-request": {
    "source": "iana",
    "extensions": ["spq"]
  },
  "application/scvp-vp-response": {
    "source": "iana",
    "extensions": ["spp"]
  },
  "application/sdp": {
    "source": "iana",
    "extensions": ["sdp"]
  },
  "application/secevent+jwt": {
    "source": "iana"
  },
  "application/senml+cbor": {
    "source": "iana"
  },
  "application/senml+json": {
    "source": "iana",
    "compressible": true
  },
  "application/senml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["senmlx"]
  },
  "application/senml-etch+cbor": {
    "source": "iana"
  },
  "application/senml-etch+json": {
    "source": "iana",
    "compressible": true
  },
  "application/senml-exi": {
    "source": "iana"
  },
  "application/sensml+cbor": {
    "source": "iana"
  },
  "application/sensml+json": {
    "source": "iana",
    "compressible": true
  },
  "application/sensml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sensmlx"]
  },
  "application/sensml-exi": {
    "source": "iana"
  },
  "application/sep+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/sep-exi": {
    "source": "iana"
  },
  "application/session-info": {
    "source": "iana"
  },
  "application/set-payment": {
    "source": "iana"
  },
  "application/set-payment-initiation": {
    "source": "iana",
    "extensions": ["setpay"]
  },
  "application/set-registration": {
    "source": "iana"
  },
  "application/set-registration-initiation": {
    "source": "iana",
    "extensions": ["setreg"]
  },
  "application/sgml": {
    "source": "iana"
  },
  "application/sgml-open-catalog": {
    "source": "iana"
  },
  "application/shf+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["shf"]
  },
  "application/sieve": {
    "source": "iana",
    "extensions": ["siv","sieve"]
  },
  "application/simple-filter+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/simple-message-summary": {
    "source": "iana"
  },
  "application/simplesymbolcontainer": {
    "source": "iana"
  },
  "application/sipc": {
    "source": "iana"
  },
  "application/slate": {
    "source": "iana"
  },
  "application/smil": {
    "source": "iana"
  },
  "application/smil+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["smi","smil"]
  },
  "application/smpte336m": {
    "source": "iana"
  },
  "application/soap+fastinfoset": {
    "source": "iana"
  },
  "application/soap+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/sparql-query": {
    "source": "iana",
    "extensions": ["rq"]
  },
  "application/sparql-results+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["srx"]
  },
  "application/spirits-event+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/sql": {
    "source": "iana"
  },
  "application/srgs": {
    "source": "iana",
    "extensions": ["gram"]
  },
  "application/srgs+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["grxml"]
  },
  "application/sru+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sru"]
  },
  "application/ssdl+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["ssdl"]
  },
  "application/ssml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ssml"]
  },
  "application/stix+json": {
    "source": "iana",
    "compressible": true
  },
  "application/swid+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["swidtag"]
  },
  "application/tamp-apex-update": {
    "source": "iana"
  },
  "application/tamp-apex-update-confirm": {
    "source": "iana"
  },
  "application/tamp-community-update": {
    "source": "iana"
  },
  "application/tamp-community-update-confirm": {
    "source": "iana"
  },
  "application/tamp-error": {
    "source": "iana"
  },
  "application/tamp-sequence-adjust": {
    "source": "iana"
  },
  "application/tamp-sequence-adjust-confirm": {
    "source": "iana"
  },
  "application/tamp-status-query": {
    "source": "iana"
  },
  "application/tamp-status-response": {
    "source": "iana"
  },
  "application/tamp-update": {
    "source": "iana"
  },
  "application/tamp-update-confirm": {
    "source": "iana"
  },
  "application/tar": {
    "compressible": true
  },
  "application/taxii+json": {
    "source": "iana",
    "compressible": true
  },
  "application/td+json": {
    "source": "iana",
    "compressible": true
  },
  "application/tei+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["tei","teicorpus"]
  },
  "application/tetra_isi": {
    "source": "iana"
  },
  "application/thraud+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["tfi"]
  },
  "application/timestamp-query": {
    "source": "iana"
  },
  "application/timestamp-reply": {
    "source": "iana"
  },
  "application/timestamped-data": {
    "source": "iana",
    "extensions": ["tsd"]
  },
  "application/tlsrpt+gzip": {
    "source": "iana"
  },
  "application/tlsrpt+json": {
    "source": "iana",
    "compressible": true
  },
  "application/tnauthlist": {
    "source": "iana"
  },
  "application/toml": {
    "compressible": true,
    "extensions": ["toml"]
  },
  "application/trickle-ice-sdpfrag": {
    "source": "iana"
  },
  "application/trig": {
    "source": "iana"
  },
  "application/ttml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ttml"]
  },
  "application/tve-trigger": {
    "source": "iana"
  },
  "application/tzif": {
    "source": "iana"
  },
  "application/tzif-leap": {
    "source": "iana"
  },
  "application/ulpfec": {
    "source": "iana"
  },
  "application/urc-grpsheet+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/urc-ressheet+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rsheet"]
  },
  "application/urc-targetdesc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/urc-uisocketdesc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vcard+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vcard+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vemmi": {
    "source": "iana"
  },
  "application/vividence.scriptfile": {
    "source": "apache"
  },
  "application/vnd.1000minds.decision-model+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["1km"]
  },
  "application/vnd.3gpp-prose+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp-prose-pc3ch+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp-v2x-local-service-information": {
    "source": "iana"
  },
  "application/vnd.3gpp.access-transfer-events+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.bsf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.gmop+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mc-signalling-ear": {
    "source": "iana"
  },
  "application/vnd.3gpp.mcdata-affiliation-command+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcdata-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcdata-payload": {
    "source": "iana"
  },
  "application/vnd.3gpp.mcdata-service-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcdata-signalling": {
    "source": "iana"
  },
  "application/vnd.3gpp.mcdata-ue-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcdata-user-profile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-affiliation-command+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-floor-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-location-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-mbms-usage-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-service-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-signed+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-ue-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-ue-init-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-user-profile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-affiliation-command+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-affiliation-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-location-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-mbms-usage-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-service-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-transmission-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-ue-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-user-profile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mid-call+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.pic-bw-large": {
    "source": "iana",
    "extensions": ["plb"]
  },
  "application/vnd.3gpp.pic-bw-small": {
    "source": "iana",
    "extensions": ["psb"]
  },
  "application/vnd.3gpp.pic-bw-var": {
    "source": "iana",
    "extensions": ["pvb"]
  },
  "application/vnd.3gpp.sms": {
    "source": "iana"
  },
  "application/vnd.3gpp.sms+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.srvcc-ext+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.srvcc-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.state-and-event-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.ussd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp2.bcmcsinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp2.sms": {
    "source": "iana"
  },
  "application/vnd.3gpp2.tcap": {
    "source": "iana",
    "extensions": ["tcap"]
  },
  "application/vnd.3lightssoftware.imagescal": {
    "source": "iana"
  },
  "application/vnd.3m.post-it-notes": {
    "source": "iana",
    "extensions": ["pwn"]
  },
  "application/vnd.accpac.simply.aso": {
    "source": "iana",
    "extensions": ["aso"]
  },
  "application/vnd.accpac.simply.imp": {
    "source": "iana",
    "extensions": ["imp"]
  },
  "application/vnd.acucobol": {
    "source": "iana",
    "extensions": ["acu"]
  },
  "application/vnd.acucorp": {
    "source": "iana",
    "extensions": ["atc","acutc"]
  },
  "application/vnd.adobe.air-application-installer-package+zip": {
    "source": "apache",
    "compressible": false,
    "extensions": ["air"]
  },
  "application/vnd.adobe.flash.movie": {
    "source": "iana"
  },
  "application/vnd.adobe.formscentral.fcdt": {
    "source": "iana",
    "extensions": ["fcdt"]
  },
  "application/vnd.adobe.fxp": {
    "source": "iana",
    "extensions": ["fxp","fxpl"]
  },
  "application/vnd.adobe.partial-upload": {
    "source": "iana"
  },
  "application/vnd.adobe.xdp+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xdp"]
  },
  "application/vnd.adobe.xfdf": {
    "source": "iana",
    "extensions": ["xfdf"]
  },
  "application/vnd.aether.imp": {
    "source": "iana"
  },
  "application/vnd.afpc.afplinedata": {
    "source": "iana"
  },
  "application/vnd.afpc.afplinedata-pagedef": {
    "source": "iana"
  },
  "application/vnd.afpc.foca-charset": {
    "source": "iana"
  },
  "application/vnd.afpc.foca-codedfont": {
    "source": "iana"
  },
  "application/vnd.afpc.foca-codepage": {
    "source": "iana"
  },
  "application/vnd.afpc.modca": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-formdef": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-mediummap": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-objectcontainer": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-overlay": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-pagesegment": {
    "source": "iana"
  },
  "application/vnd.ah-barcode": {
    "source": "iana"
  },
  "application/vnd.ahead.space": {
    "source": "iana",
    "extensions": ["ahead"]
  },
  "application/vnd.airzip.filesecure.azf": {
    "source": "iana",
    "extensions": ["azf"]
  },
  "application/vnd.airzip.filesecure.azs": {
    "source": "iana",
    "extensions": ["azs"]
  },
  "application/vnd.amadeus+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.amazon.ebook": {
    "source": "apache",
    "extensions": ["azw"]
  },
  "application/vnd.amazon.mobi8-ebook": {
    "source": "iana"
  },
  "application/vnd.americandynamics.acc": {
    "source": "iana",
    "extensions": ["acc"]
  },
  "application/vnd.amiga.ami": {
    "source": "iana",
    "extensions": ["ami"]
  },
  "application/vnd.amundsen.maze+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.android.ota": {
    "source": "iana"
  },
  "application/vnd.android.package-archive": {
    "source": "apache",
    "compressible": false,
    "extensions": ["apk"]
  },
  "application/vnd.anki": {
    "source": "iana"
  },
  "application/vnd.anser-web-certificate-issue-initiation": {
    "source": "iana",
    "extensions": ["cii"]
  },
  "application/vnd.anser-web-funds-transfer-initiation": {
    "source": "apache",
    "extensions": ["fti"]
  },
  "application/vnd.antix.game-component": {
    "source": "iana",
    "extensions": ["atx"]
  },
  "application/vnd.apache.thrift.binary": {
    "source": "iana"
  },
  "application/vnd.apache.thrift.compact": {
    "source": "iana"
  },
  "application/vnd.apache.thrift.json": {
    "source": "iana"
  },
  "application/vnd.api+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.aplextor.warrp+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.apothekende.reservation+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.apple.installer+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mpkg"]
  },
  "application/vnd.apple.keynote": {
    "source": "iana",
    "extensions": ["keynote"]
  },
  "application/vnd.apple.mpegurl": {
    "source": "iana",
    "extensions": ["m3u8"]
  },
  "application/vnd.apple.numbers": {
    "source": "iana",
    "extensions": ["numbers"]
  },
  "application/vnd.apple.pages": {
    "source": "iana",
    "extensions": ["pages"]
  },
  "application/vnd.apple.pkpass": {
    "compressible": false,
    "extensions": ["pkpass"]
  },
  "application/vnd.arastra.swi": {
    "source": "iana"
  },
  "application/vnd.aristanetworks.swi": {
    "source": "iana",
    "extensions": ["swi"]
  },
  "application/vnd.artisan+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.artsquare": {
    "source": "iana"
  },
  "application/vnd.astraea-software.iota": {
    "source": "iana",
    "extensions": ["iota"]
  },
  "application/vnd.audiograph": {
    "source": "iana",
    "extensions": ["aep"]
  },
  "application/vnd.autopackage": {
    "source": "iana"
  },
  "application/vnd.avalon+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.avistar+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.balsamiq.bmml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["bmml"]
  },
  "application/vnd.balsamiq.bmpr": {
    "source": "iana"
  },
  "application/vnd.banana-accounting": {
    "source": "iana"
  },
  "application/vnd.bbf.usp.error": {
    "source": "iana"
  },
  "application/vnd.bbf.usp.msg": {
    "source": "iana"
  },
  "application/vnd.bbf.usp.msg+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.bekitzur-stech+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.bint.med-content": {
    "source": "iana"
  },
  "application/vnd.biopax.rdf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.blink-idb-value-wrapper": {
    "source": "iana"
  },
  "application/vnd.blueice.multipass": {
    "source": "iana",
    "extensions": ["mpm"]
  },
  "application/vnd.bluetooth.ep.oob": {
    "source": "iana"
  },
  "application/vnd.bluetooth.le.oob": {
    "source": "iana"
  },
  "application/vnd.bmi": {
    "source": "iana",
    "extensions": ["bmi"]
  },
  "application/vnd.bpf": {
    "source": "iana"
  },
  "application/vnd.bpf3": {
    "source": "iana"
  },
  "application/vnd.businessobjects": {
    "source": "iana",
    "extensions": ["rep"]
  },
  "application/vnd.byu.uapi+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cab-jscript": {
    "source": "iana"
  },
  "application/vnd.canon-cpdl": {
    "source": "iana"
  },
  "application/vnd.canon-lips": {
    "source": "iana"
  },
  "application/vnd.capasystems-pg+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cendio.thinlinc.clientconf": {
    "source": "iana"
  },
  "application/vnd.century-systems.tcp_stream": {
    "source": "iana"
  },
  "application/vnd.chemdraw+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["cdxml"]
  },
  "application/vnd.chess-pgn": {
    "source": "iana"
  },
  "application/vnd.chipnuts.karaoke-mmd": {
    "source": "iana",
    "extensions": ["mmd"]
  },
  "application/vnd.ciedi": {
    "source": "iana"
  },
  "application/vnd.cinderella": {
    "source": "iana",
    "extensions": ["cdy"]
  },
  "application/vnd.cirpack.isdn-ext": {
    "source": "iana"
  },
  "application/vnd.citationstyles.style+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["csl"]
  },
  "application/vnd.claymore": {
    "source": "iana",
    "extensions": ["cla"]
  },
  "application/vnd.cloanto.rp9": {
    "source": "iana",
    "extensions": ["rp9"]
  },
  "application/vnd.clonk.c4group": {
    "source": "iana",
    "extensions": ["c4g","c4d","c4f","c4p","c4u"]
  },
  "application/vnd.cluetrust.cartomobile-config": {
    "source": "iana",
    "extensions": ["c11amc"]
  },
  "application/vnd.cluetrust.cartomobile-config-pkg": {
    "source": "iana",
    "extensions": ["c11amz"]
  },
  "application/vnd.coffeescript": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.document": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.document-template": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.presentation": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.presentation-template": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.spreadsheet": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.spreadsheet-template": {
    "source": "iana"
  },
  "application/vnd.collection+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.collection.doc+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.collection.next+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.comicbook+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.comicbook-rar": {
    "source": "iana"
  },
  "application/vnd.commerce-battelle": {
    "source": "iana"
  },
  "application/vnd.commonspace": {
    "source": "iana",
    "extensions": ["csp"]
  },
  "application/vnd.contact.cmsg": {
    "source": "iana",
    "extensions": ["cdbcmsg"]
  },
  "application/vnd.coreos.ignition+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cosmocaller": {
    "source": "iana",
    "extensions": ["cmc"]
  },
  "application/vnd.crick.clicker": {
    "source": "iana",
    "extensions": ["clkx"]
  },
  "application/vnd.crick.clicker.keyboard": {
    "source": "iana",
    "extensions": ["clkk"]
  },
  "application/vnd.crick.clicker.palette": {
    "source": "iana",
    "extensions": ["clkp"]
  },
  "application/vnd.crick.clicker.template": {
    "source": "iana",
    "extensions": ["clkt"]
  },
  "application/vnd.crick.clicker.wordbank": {
    "source": "iana",
    "extensions": ["clkw"]
  },
  "application/vnd.criticaltools.wbs+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wbs"]
  },
  "application/vnd.cryptii.pipe+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.crypto-shade-file": {
    "source": "iana"
  },
  "application/vnd.ctc-posml": {
    "source": "iana",
    "extensions": ["pml"]
  },
  "application/vnd.ctct.ws+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cups-pdf": {
    "source": "iana"
  },
  "application/vnd.cups-postscript": {
    "source": "iana"
  },
  "application/vnd.cups-ppd": {
    "source": "iana",
    "extensions": ["ppd"]
  },
  "application/vnd.cups-raster": {
    "source": "iana"
  },
  "application/vnd.cups-raw": {
    "source": "iana"
  },
  "application/vnd.curl": {
    "source": "iana"
  },
  "application/vnd.curl.car": {
    "source": "apache",
    "extensions": ["car"]
  },
  "application/vnd.curl.pcurl": {
    "source": "apache",
    "extensions": ["pcurl"]
  },
  "application/vnd.cyan.dean.root+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cybank": {
    "source": "iana"
  },
  "application/vnd.d2l.coursepackage1p0+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.dart": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dart"]
  },
  "application/vnd.data-vision.rdz": {
    "source": "iana",
    "extensions": ["rdz"]
  },
  "application/vnd.datapackage+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dataresource+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dbf": {
    "source": "iana"
  },
  "application/vnd.debian.binary-package": {
    "source": "iana"
  },
  "application/vnd.dece.data": {
    "source": "iana",
    "extensions": ["uvf","uvvf","uvd","uvvd"]
  },
  "application/vnd.dece.ttml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["uvt","uvvt"]
  },
  "application/vnd.dece.unspecified": {
    "source": "iana",
    "extensions": ["uvx","uvvx"]
  },
  "application/vnd.dece.zip": {
    "source": "iana",
    "extensions": ["uvz","uvvz"]
  },
  "application/vnd.denovo.fcselayout-link": {
    "source": "iana",
    "extensions": ["fe_launch"]
  },
  "application/vnd.desmume.movie": {
    "source": "iana"
  },
  "application/vnd.dir-bi.plate-dl-nosuffix": {
    "source": "iana"
  },
  "application/vnd.dm.delegation+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dna": {
    "source": "iana",
    "extensions": ["dna"]
  },
  "application/vnd.document+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dolby.mlp": {
    "source": "apache",
    "extensions": ["mlp"]
  },
  "application/vnd.dolby.mobile.1": {
    "source": "iana"
  },
  "application/vnd.dolby.mobile.2": {
    "source": "iana"
  },
  "application/vnd.doremir.scorecloud-binary-document": {
    "source": "iana"
  },
  "application/vnd.dpgraph": {
    "source": "iana",
    "extensions": ["dpg"]
  },
  "application/vnd.dreamfactory": {
    "source": "iana",
    "extensions": ["dfac"]
  },
  "application/vnd.drive+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ds-keypoint": {
    "source": "apache",
    "extensions": ["kpxx"]
  },
  "application/vnd.dtg.local": {
    "source": "iana"
  },
  "application/vnd.dtg.local.flash": {
    "source": "iana"
  },
  "application/vnd.dtg.local.html": {
    "source": "iana"
  },
  "application/vnd.dvb.ait": {
    "source": "iana",
    "extensions": ["ait"]
  },
  "application/vnd.dvb.dvbisl+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.dvbj": {
    "source": "iana"
  },
  "application/vnd.dvb.esgcontainer": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcdftnotifaccess": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcesgaccess": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcesgaccess2": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcesgpdd": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcroaming": {
    "source": "iana"
  },
  "application/vnd.dvb.iptv.alfec-base": {
    "source": "iana"
  },
  "application/vnd.dvb.iptv.alfec-enhancement": {
    "source": "iana"
  },
  "application/vnd.dvb.notif-aggregate-root+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-container+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-generic+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-ia-msglist+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-ia-registration-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-ia-registration-response+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-init+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.pfr": {
    "source": "iana"
  },
  "application/vnd.dvb.service": {
    "source": "iana",
    "extensions": ["svc"]
  },
  "application/vnd.dxr": {
    "source": "iana"
  },
  "application/vnd.dynageo": {
    "source": "iana",
    "extensions": ["geo"]
  },
  "application/vnd.dzr": {
    "source": "iana"
  },
  "application/vnd.easykaraoke.cdgdownload": {
    "source": "iana"
  },
  "application/vnd.ecdis-update": {
    "source": "iana"
  },
  "application/vnd.ecip.rlp": {
    "source": "iana"
  },
  "application/vnd.ecowin.chart": {
    "source": "iana",
    "extensions": ["mag"]
  },
  "application/vnd.ecowin.filerequest": {
    "source": "iana"
  },
  "application/vnd.ecowin.fileupdate": {
    "source": "iana"
  },
  "application/vnd.ecowin.series": {
    "source": "iana"
  },
  "application/vnd.ecowin.seriesrequest": {
    "source": "iana"
  },
  "application/vnd.ecowin.seriesupdate": {
    "source": "iana"
  },
  "application/vnd.efi.img": {
    "source": "iana"
  },
  "application/vnd.efi.iso": {
    "source": "iana"
  },
  "application/vnd.emclient.accessrequest+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.enliven": {
    "source": "iana",
    "extensions": ["nml"]
  },
  "application/vnd.enphase.envoy": {
    "source": "iana"
  },
  "application/vnd.eprints.data+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.epson.esf": {
    "source": "iana",
    "extensions": ["esf"]
  },
  "application/vnd.epson.msf": {
    "source": "iana",
    "extensions": ["msf"]
  },
  "application/vnd.epson.quickanime": {
    "source": "iana",
    "extensions": ["qam"]
  },
  "application/vnd.epson.salt": {
    "source": "iana",
    "extensions": ["slt"]
  },
  "application/vnd.epson.ssf": {
    "source": "iana",
    "extensions": ["ssf"]
  },
  "application/vnd.ericsson.quickcall": {
    "source": "iana"
  },
  "application/vnd.espass-espass+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.eszigno3+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["es3","et3"]
  },
  "application/vnd.etsi.aoc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.asic-e+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.etsi.asic-s+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.etsi.cug+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvcommand+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvdiscovery+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvprofile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvsad-bc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvsad-cod+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvsad-npvr+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvservice+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvsync+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvueprofile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.mcid+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.mheg5": {
    "source": "iana"
  },
  "application/vnd.etsi.overload-control-policy-dataset+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.pstn+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.sci+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.simservs+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.timestamp-token": {
    "source": "iana"
  },
  "application/vnd.etsi.tsl+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.tsl.der": {
    "source": "iana"
  },
  "application/vnd.eudora.data": {
    "source": "iana"
  },
  "application/vnd.evolv.ecig.profile": {
    "source": "iana"
  },
  "application/vnd.evolv.ecig.settings": {
    "source": "iana"
  },
  "application/vnd.evolv.ecig.theme": {
    "source": "iana"
  },
  "application/vnd.exstream-empower+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.exstream-package": {
    "source": "iana"
  },
  "application/vnd.ezpix-album": {
    "source": "iana",
    "extensions": ["ez2"]
  },
  "application/vnd.ezpix-package": {
    "source": "iana",
    "extensions": ["ez3"]
  },
  "application/vnd.f-secure.mobile": {
    "source": "iana"
  },
  "application/vnd.fastcopy-disk-image": {
    "source": "iana"
  },
  "application/vnd.fdf": {
    "source": "iana",
    "extensions": ["fdf"]
  },
  "application/vnd.fdsn.mseed": {
    "source": "iana",
    "extensions": ["mseed"]
  },
  "application/vnd.fdsn.seed": {
    "source": "iana",
    "extensions": ["seed","dataless"]
  },
  "application/vnd.ffsns": {
    "source": "iana"
  },
  "application/vnd.ficlab.flb+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.filmit.zfc": {
    "source": "iana"
  },
  "application/vnd.fints": {
    "source": "iana"
  },
  "application/vnd.firemonkeys.cloudcell": {
    "source": "iana"
  },
  "application/vnd.flographit": {
    "source": "iana",
    "extensions": ["gph"]
  },
  "application/vnd.fluxtime.clip": {
    "source": "iana",
    "extensions": ["ftc"]
  },
  "application/vnd.font-fontforge-sfd": {
    "source": "iana"
  },
  "application/vnd.framemaker": {
    "source": "iana",
    "extensions": ["fm","frame","maker","book"]
  },
  "application/vnd.frogans.fnc": {
    "source": "iana",
    "extensions": ["fnc"]
  },
  "application/vnd.frogans.ltf": {
    "source": "iana",
    "extensions": ["ltf"]
  },
  "application/vnd.fsc.weblaunch": {
    "source": "iana",
    "extensions": ["fsc"]
  },
  "application/vnd.fujitsu.oasys": {
    "source": "iana",
    "extensions": ["oas"]
  },
  "application/vnd.fujitsu.oasys2": {
    "source": "iana",
    "extensions": ["oa2"]
  },
  "application/vnd.fujitsu.oasys3": {
    "source": "iana",
    "extensions": ["oa3"]
  },
  "application/vnd.fujitsu.oasysgp": {
    "source": "iana",
    "extensions": ["fg5"]
  },
  "application/vnd.fujitsu.oasysprs": {
    "source": "iana",
    "extensions": ["bh2"]
  },
  "application/vnd.fujixerox.art-ex": {
    "source": "iana"
  },
  "application/vnd.fujixerox.art4": {
    "source": "iana"
  },
  "application/vnd.fujixerox.ddd": {
    "source": "iana",
    "extensions": ["ddd"]
  },
  "application/vnd.fujixerox.docuworks": {
    "source": "iana",
    "extensions": ["xdw"]
  },
  "application/vnd.fujixerox.docuworks.binder": {
    "source": "iana",
    "extensions": ["xbd"]
  },
  "application/vnd.fujixerox.docuworks.container": {
    "source": "iana"
  },
  "application/vnd.fujixerox.hbpl": {
    "source": "iana"
  },
  "application/vnd.fut-misnet": {
    "source": "iana"
  },
  "application/vnd.futoin+cbor": {
    "source": "iana"
  },
  "application/vnd.futoin+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.fuzzysheet": {
    "source": "iana",
    "extensions": ["fzs"]
  },
  "application/vnd.genomatix.tuxedo": {
    "source": "iana",
    "extensions": ["txd"]
  },
  "application/vnd.gentics.grd+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.geo+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.geocube+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.geogebra.file": {
    "source": "iana",
    "extensions": ["ggb"]
  },
  "application/vnd.geogebra.tool": {
    "source": "iana",
    "extensions": ["ggt"]
  },
  "application/vnd.geometry-explorer": {
    "source": "iana",
    "extensions": ["gex","gre"]
  },
  "application/vnd.geonext": {
    "source": "iana",
    "extensions": ["gxt"]
  },
  "application/vnd.geoplan": {
    "source": "iana",
    "extensions": ["g2w"]
  },
  "application/vnd.geospace": {
    "source": "iana",
    "extensions": ["g3w"]
  },
  "application/vnd.gerber": {
    "source": "iana"
  },
  "application/vnd.globalplatform.card-content-mgt": {
    "source": "iana"
  },
  "application/vnd.globalplatform.card-content-mgt-response": {
    "source": "iana"
  },
  "application/vnd.gmx": {
    "source": "iana",
    "extensions": ["gmx"]
  },
  "application/vnd.google-apps.document": {
    "compressible": false,
    "extensions": ["gdoc"]
  },
  "application/vnd.google-apps.presentation": {
    "compressible": false,
    "extensions": ["gslides"]
  },
  "application/vnd.google-apps.spreadsheet": {
    "compressible": false,
    "extensions": ["gsheet"]
  },
  "application/vnd.google-earth.kml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["kml"]
  },
  "application/vnd.google-earth.kmz": {
    "source": "iana",
    "compressible": false,
    "extensions": ["kmz"]
  },
  "application/vnd.gov.sk.e-form+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.gov.sk.e-form+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.gov.sk.xmldatacontainer+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.grafeq": {
    "source": "iana",
    "extensions": ["gqf","gqs"]
  },
  "application/vnd.gridmp": {
    "source": "iana"
  },
  "application/vnd.groove-account": {
    "source": "iana",
    "extensions": ["gac"]
  },
  "application/vnd.groove-help": {
    "source": "iana",
    "extensions": ["ghf"]
  },
  "application/vnd.groove-identity-message": {
    "source": "iana",
    "extensions": ["gim"]
  },
  "application/vnd.groove-injector": {
    "source": "iana",
    "extensions": ["grv"]
  },
  "application/vnd.groove-tool-message": {
    "source": "iana",
    "extensions": ["gtm"]
  },
  "application/vnd.groove-tool-template": {
    "source": "iana",
    "extensions": ["tpl"]
  },
  "application/vnd.groove-vcard": {
    "source": "iana",
    "extensions": ["vcg"]
  },
  "application/vnd.hal+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hal+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["hal"]
  },
  "application/vnd.handheld-entertainment+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["zmm"]
  },
  "application/vnd.hbci": {
    "source": "iana",
    "extensions": ["hbci"]
  },
  "application/vnd.hc+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hcl-bireports": {
    "source": "iana"
  },
  "application/vnd.hdt": {
    "source": "iana"
  },
  "application/vnd.heroku+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hhe.lesson-player": {
    "source": "iana",
    "extensions": ["les"]
  },
  "application/vnd.hp-hpgl": {
    "source": "iana",
    "extensions": ["hpgl"]
  },
  "application/vnd.hp-hpid": {
    "source": "iana",
    "extensions": ["hpid"]
  },
  "application/vnd.hp-hps": {
    "source": "iana",
    "extensions": ["hps"]
  },
  "application/vnd.hp-jlyt": {
    "source": "iana",
    "extensions": ["jlt"]
  },
  "application/vnd.hp-pcl": {
    "source": "iana",
    "extensions": ["pcl"]
  },
  "application/vnd.hp-pclxl": {
    "source": "iana",
    "extensions": ["pclxl"]
  },
  "application/vnd.httphone": {
    "source": "iana"
  },
  "application/vnd.hydrostatix.sof-data": {
    "source": "iana",
    "extensions": ["sfd-hdstx"]
  },
  "application/vnd.hyper+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hyper-item+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hyperdrive+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hzn-3d-crossword": {
    "source": "iana"
  },
  "application/vnd.ibm.afplinedata": {
    "source": "iana"
  },
  "application/vnd.ibm.electronic-media": {
    "source": "iana"
  },
  "application/vnd.ibm.minipay": {
    "source": "iana",
    "extensions": ["mpy"]
  },
  "application/vnd.ibm.modcap": {
    "source": "iana",
    "extensions": ["afp","listafp","list3820"]
  },
  "application/vnd.ibm.rights-management": {
    "source": "iana",
    "extensions": ["irm"]
  },
  "application/vnd.ibm.secure-container": {
    "source": "iana",
    "extensions": ["sc"]
  },
  "application/vnd.iccprofile": {
    "source": "iana",
    "extensions": ["icc","icm"]
  },
  "application/vnd.ieee.1905": {
    "source": "iana"
  },
  "application/vnd.igloader": {
    "source": "iana",
    "extensions": ["igl"]
  },
  "application/vnd.imagemeter.folder+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.imagemeter.image+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.immervision-ivp": {
    "source": "iana",
    "extensions": ["ivp"]
  },
  "application/vnd.immervision-ivu": {
    "source": "iana",
    "extensions": ["ivu"]
  },
  "application/vnd.ims.imsccv1p1": {
    "source": "iana"
  },
  "application/vnd.ims.imsccv1p2": {
    "source": "iana"
  },
  "application/vnd.ims.imsccv1p3": {
    "source": "iana"
  },
  "application/vnd.ims.lis.v2.result+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolconsumerprofile+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolproxy+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolproxy.id+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolsettings+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolsettings.simple+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.informedcontrol.rms+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.informix-visionary": {
    "source": "iana"
  },
  "application/vnd.infotech.project": {
    "source": "iana"
  },
  "application/vnd.infotech.project+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.innopath.wamp.notification": {
    "source": "iana"
  },
  "application/vnd.insors.igm": {
    "source": "iana",
    "extensions": ["igm"]
  },
  "application/vnd.intercon.formnet": {
    "source": "iana",
    "extensions": ["xpw","xpx"]
  },
  "application/vnd.intergeo": {
    "source": "iana",
    "extensions": ["i2g"]
  },
  "application/vnd.intertrust.digibox": {
    "source": "iana"
  },
  "application/vnd.intertrust.nncp": {
    "source": "iana"
  },
  "application/vnd.intu.qbo": {
    "source": "iana",
    "extensions": ["qbo"]
  },
  "application/vnd.intu.qfx": {
    "source": "iana",
    "extensions": ["qfx"]
  },
  "application/vnd.iptc.g2.catalogitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.conceptitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.knowledgeitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.newsitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.newsmessage+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.packageitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.planningitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ipunplugged.rcprofile": {
    "source": "iana",
    "extensions": ["rcprofile"]
  },
  "application/vnd.irepository.package+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["irp"]
  },
  "application/vnd.is-xpr": {
    "source": "iana",
    "extensions": ["xpr"]
  },
  "application/vnd.isac.fcs": {
    "source": "iana",
    "extensions": ["fcs"]
  },
  "application/vnd.iso11783-10+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.jam": {
    "source": "iana",
    "extensions": ["jam"]
  },
  "application/vnd.japannet-directory-service": {
    "source": "iana"
  },
  "application/vnd.japannet-jpnstore-wakeup": {
    "source": "iana"
  },
  "application/vnd.japannet-payment-wakeup": {
    "source": "iana"
  },
  "application/vnd.japannet-registration": {
    "source": "iana"
  },
  "application/vnd.japannet-registration-wakeup": {
    "source": "iana"
  },
  "application/vnd.japannet-setstore-wakeup": {
    "source": "iana"
  },
  "application/vnd.japannet-verification": {
    "source": "iana"
  },
  "application/vnd.japannet-verification-wakeup": {
    "source": "iana"
  },
  "application/vnd.jcp.javame.midlet-rms": {
    "source": "iana",
    "extensions": ["rms"]
  },
  "application/vnd.jisp": {
    "source": "iana",
    "extensions": ["jisp"]
  },
  "application/vnd.joost.joda-archive": {
    "source": "iana",
    "extensions": ["joda"]
  },
  "application/vnd.jsk.isdn-ngn": {
    "source": "iana"
  },
  "application/vnd.kahootz": {
    "source": "iana",
    "extensions": ["ktz","ktr"]
  },
  "application/vnd.kde.karbon": {
    "source": "iana",
    "extensions": ["karbon"]
  },
  "application/vnd.kde.kchart": {
    "source": "iana",
    "extensions": ["chrt"]
  },
  "application/vnd.kde.kformula": {
    "source": "iana",
    "extensions": ["kfo"]
  },
  "application/vnd.kde.kivio": {
    "source": "iana",
    "extensions": ["flw"]
  },
  "application/vnd.kde.kontour": {
    "source": "iana",
    "extensions": ["kon"]
  },
  "application/vnd.kde.kpresenter": {
    "source": "iana",
    "extensions": ["kpr","kpt"]
  },
  "application/vnd.kde.kspread": {
    "source": "iana",
    "extensions": ["ksp"]
  },
  "application/vnd.kde.kword": {
    "source": "iana",
    "extensions": ["kwd","kwt"]
  },
  "application/vnd.kenameaapp": {
    "source": "iana",
    "extensions": ["htke"]
  },
  "application/vnd.kidspiration": {
    "source": "iana",
    "extensions": ["kia"]
  },
  "application/vnd.kinar": {
    "source": "iana",
    "extensions": ["kne","knp"]
  },
  "application/vnd.koan": {
    "source": "iana",
    "extensions": ["skp","skd","skt","skm"]
  },
  "application/vnd.kodak-descriptor": {
    "source": "iana",
    "extensions": ["sse"]
  },
  "application/vnd.las": {
    "source": "iana"
  },
  "application/vnd.las.las+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.las.las+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["lasxml"]
  },
  "application/vnd.laszip": {
    "source": "iana"
  },
  "application/vnd.leap+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.liberty-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.llamagraphics.life-balance.desktop": {
    "source": "iana",
    "extensions": ["lbd"]
  },
  "application/vnd.llamagraphics.life-balance.exchange+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["lbe"]
  },
  "application/vnd.logipipe.circuit+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.loom": {
    "source": "iana"
  },
  "application/vnd.lotus-1-2-3": {
    "source": "iana",
    "extensions": ["123"]
  },
  "application/vnd.lotus-approach": {
    "source": "iana",
    "extensions": ["apr"]
  },
  "application/vnd.lotus-freelance": {
    "source": "iana",
    "extensions": ["pre"]
  },
  "application/vnd.lotus-notes": {
    "source": "iana",
    "extensions": ["nsf"]
  },
  "application/vnd.lotus-organizer": {
    "source": "iana",
    "extensions": ["org"]
  },
  "application/vnd.lotus-screencam": {
    "source": "iana",
    "extensions": ["scm"]
  },
  "application/vnd.lotus-wordpro": {
    "source": "iana",
    "extensions": ["lwp"]
  },
  "application/vnd.macports.portpkg": {
    "source": "iana",
    "extensions": ["portpkg"]
  },
  "application/vnd.mapbox-vector-tile": {
    "source": "iana"
  },
  "application/vnd.marlin.drm.actiontoken+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.marlin.drm.conftoken+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.marlin.drm.license+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.marlin.drm.mdcf": {
    "source": "iana"
  },
  "application/vnd.mason+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.maxmind.maxmind-db": {
    "source": "iana"
  },
  "application/vnd.mcd": {
    "source": "iana",
    "extensions": ["mcd"]
  },
  "application/vnd.medcalcdata": {
    "source": "iana",
    "extensions": ["mc1"]
  },
  "application/vnd.mediastation.cdkey": {
    "source": "iana",
    "extensions": ["cdkey"]
  },
  "application/vnd.meridian-slingshot": {
    "source": "iana"
  },
  "application/vnd.mfer": {
    "source": "iana",
    "extensions": ["mwf"]
  },
  "application/vnd.mfmp": {
    "source": "iana",
    "extensions": ["mfm"]
  },
  "application/vnd.micro+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.micrografx.flo": {
    "source": "iana",
    "extensions": ["flo"]
  },
  "application/vnd.micrografx.igx": {
    "source": "iana",
    "extensions": ["igx"]
  },
  "application/vnd.microsoft.portable-executable": {
    "source": "iana"
  },
  "application/vnd.microsoft.windows.thumbnail-cache": {
    "source": "iana"
  },
  "application/vnd.miele+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.mif": {
    "source": "iana",
    "extensions": ["mif"]
  },
  "application/vnd.minisoft-hp3000-save": {
    "source": "iana"
  },
  "application/vnd.mitsubishi.misty-guard.trustweb": {
    "source": "iana"
  },
  "application/vnd.mobius.daf": {
    "source": "iana",
    "extensions": ["daf"]
  },
  "application/vnd.mobius.dis": {
    "source": "iana",
    "extensions": ["dis"]
  },
  "application/vnd.mobius.mbk": {
    "source": "iana",
    "extensions": ["mbk"]
  },
  "application/vnd.mobius.mqy": {
    "source": "iana",
    "extensions": ["mqy"]
  },
  "application/vnd.mobius.msl": {
    "source": "iana",
    "extensions": ["msl"]
  },
  "application/vnd.mobius.plc": {
    "source": "iana",
    "extensions": ["plc"]
  },
  "application/vnd.mobius.txf": {
    "source": "iana",
    "extensions": ["txf"]
  },
  "application/vnd.mophun.application": {
    "source": "iana",
    "extensions": ["mpn"]
  },
  "application/vnd.mophun.certificate": {
    "source": "iana",
    "extensions": ["mpc"]
  },
  "application/vnd.motorola.flexsuite": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.adsi": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.fis": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.gotap": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.kmr": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.ttc": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.wem": {
    "source": "iana"
  },
  "application/vnd.motorola.iprm": {
    "source": "iana"
  },
  "application/vnd.mozilla.xul+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xul"]
  },
  "application/vnd.ms-3mfdocument": {
    "source": "iana"
  },
  "application/vnd.ms-artgalry": {
    "source": "iana",
    "extensions": ["cil"]
  },
  "application/vnd.ms-asf": {
    "source": "iana"
  },
  "application/vnd.ms-cab-compressed": {
    "source": "iana",
    "extensions": ["cab"]
  },
  "application/vnd.ms-color.iccprofile": {
    "source": "apache"
  },
  "application/vnd.ms-excel": {
    "source": "iana",
    "compressible": false,
    "extensions": ["xls","xlm","xla","xlc","xlt","xlw"]
  },
  "application/vnd.ms-excel.addin.macroenabled.12": {
    "source": "iana",
    "extensions": ["xlam"]
  },
  "application/vnd.ms-excel.sheet.binary.macroenabled.12": {
    "source": "iana",
    "extensions": ["xlsb"]
  },
  "application/vnd.ms-excel.sheet.macroenabled.12": {
    "source": "iana",
    "extensions": ["xlsm"]
  },
  "application/vnd.ms-excel.template.macroenabled.12": {
    "source": "iana",
    "extensions": ["xltm"]
  },
  "application/vnd.ms-fontobject": {
    "source": "iana",
    "compressible": true,
    "extensions": ["eot"]
  },
  "application/vnd.ms-htmlhelp": {
    "source": "iana",
    "extensions": ["chm"]
  },
  "application/vnd.ms-ims": {
    "source": "iana",
    "extensions": ["ims"]
  },
  "application/vnd.ms-lrm": {
    "source": "iana",
    "extensions": ["lrm"]
  },
  "application/vnd.ms-office.activex+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ms-officetheme": {
    "source": "iana",
    "extensions": ["thmx"]
  },
  "application/vnd.ms-opentype": {
    "source": "apache",
    "compressible": true
  },
  "application/vnd.ms-outlook": {
    "compressible": false,
    "extensions": ["msg"]
  },
  "application/vnd.ms-package.obfuscated-opentype": {
    "source": "apache"
  },
  "application/vnd.ms-pki.seccat": {
    "source": "apache",
    "extensions": ["cat"]
  },
  "application/vnd.ms-pki.stl": {
    "source": "apache",
    "extensions": ["stl"]
  },
  "application/vnd.ms-playready.initiator+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ms-powerpoint": {
    "source": "iana",
    "compressible": false,
    "extensions": ["ppt","pps","pot"]
  },
  "application/vnd.ms-powerpoint.addin.macroenabled.12": {
    "source": "iana",
    "extensions": ["ppam"]
  },
  "application/vnd.ms-powerpoint.presentation.macroenabled.12": {
    "source": "iana",
    "extensions": ["pptm"]
  },
  "application/vnd.ms-powerpoint.slide.macroenabled.12": {
    "source": "iana",
    "extensions": ["sldm"]
  },
  "application/vnd.ms-powerpoint.slideshow.macroenabled.12": {
    "source": "iana",
    "extensions": ["ppsm"]
  },
  "application/vnd.ms-powerpoint.template.macroenabled.12": {
    "source": "iana",
    "extensions": ["potm"]
  },
  "application/vnd.ms-printdevicecapabilities+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ms-printing.printticket+xml": {
    "source": "apache",
    "compressible": true
  },
  "application/vnd.ms-printschematicket+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ms-project": {
    "source": "iana",
    "extensions": ["mpp","mpt"]
  },
  "application/vnd.ms-tnef": {
    "source": "iana"
  },
  "application/vnd.ms-windows.devicepairing": {
    "source": "iana"
  },
  "application/vnd.ms-windows.nwprinting.oob": {
    "source": "iana"
  },
  "application/vnd.ms-windows.printerpairing": {
    "source": "iana"
  },
  "application/vnd.ms-windows.wsd.oob": {
    "source": "iana"
  },
  "application/vnd.ms-wmdrm.lic-chlg-req": {
    "source": "iana"
  },
  "application/vnd.ms-wmdrm.lic-resp": {
    "source": "iana"
  },
  "application/vnd.ms-wmdrm.meter-chlg-req": {
    "source": "iana"
  },
  "application/vnd.ms-wmdrm.meter-resp": {
    "source": "iana"
  },
  "application/vnd.ms-word.document.macroenabled.12": {
    "source": "iana",
    "extensions": ["docm"]
  },
  "application/vnd.ms-word.template.macroenabled.12": {
    "source": "iana",
    "extensions": ["dotm"]
  },
  "application/vnd.ms-works": {
    "source": "iana",
    "extensions": ["wps","wks","wcm","wdb"]
  },
  "application/vnd.ms-wpl": {
    "source": "iana",
    "extensions": ["wpl"]
  },
  "application/vnd.ms-xpsdocument": {
    "source": "iana",
    "compressible": false,
    "extensions": ["xps"]
  },
  "application/vnd.msa-disk-image": {
    "source": "iana"
  },
  "application/vnd.mseq": {
    "source": "iana",
    "extensions": ["mseq"]
  },
  "application/vnd.msign": {
    "source": "iana"
  },
  "application/vnd.multiad.creator": {
    "source": "iana"
  },
  "application/vnd.multiad.creator.cif": {
    "source": "iana"
  },
  "application/vnd.music-niff": {
    "source": "iana"
  },
  "application/vnd.musician": {
    "source": "iana",
    "extensions": ["mus"]
  },
  "application/vnd.muvee.style": {
    "source": "iana",
    "extensions": ["msty"]
  },
  "application/vnd.mynfc": {
    "source": "iana",
    "extensions": ["taglet"]
  },
  "application/vnd.ncd.control": {
    "source": "iana"
  },
  "application/vnd.ncd.reference": {
    "source": "iana"
  },
  "application/vnd.nearst.inv+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nervana": {
    "source": "iana"
  },
  "application/vnd.netfpx": {
    "source": "iana"
  },
  "application/vnd.neurolanguage.nlu": {
    "source": "iana",
    "extensions": ["nlu"]
  },
  "application/vnd.nimn": {
    "source": "iana"
  },
  "application/vnd.nintendo.nitro.rom": {
    "source": "iana"
  },
  "application/vnd.nintendo.snes.rom": {
    "source": "iana"
  },
  "application/vnd.nitf": {
    "source": "iana",
    "extensions": ["ntf","nitf"]
  },
  "application/vnd.noblenet-directory": {
    "source": "iana",
    "extensions": ["nnd"]
  },
  "application/vnd.noblenet-sealer": {
    "source": "iana",
    "extensions": ["nns"]
  },
  "application/vnd.noblenet-web": {
    "source": "iana",
    "extensions": ["nnw"]
  },
  "application/vnd.nokia.catalogs": {
    "source": "iana"
  },
  "application/vnd.nokia.conml+wbxml": {
    "source": "iana"
  },
  "application/vnd.nokia.conml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.iptv.config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.isds-radio-presets": {
    "source": "iana"
  },
  "application/vnd.nokia.landmark+wbxml": {
    "source": "iana"
  },
  "application/vnd.nokia.landmark+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.landmarkcollection+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.n-gage.ac+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ac"]
  },
  "application/vnd.nokia.n-gage.data": {
    "source": "iana",
    "extensions": ["ngdat"]
  },
  "application/vnd.nokia.n-gage.symbian.install": {
    "source": "iana",
    "extensions": ["n-gage"]
  },
  "application/vnd.nokia.ncd": {
    "source": "iana"
  },
  "application/vnd.nokia.pcd+wbxml": {
    "source": "iana"
  },
  "application/vnd.nokia.pcd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.radio-preset": {
    "source": "iana",
    "extensions": ["rpst"]
  },
  "application/vnd.nokia.radio-presets": {
    "source": "iana",
    "extensions": ["rpss"]
  },
  "application/vnd.novadigm.edm": {
    "source": "iana",
    "extensions": ["edm"]
  },
  "application/vnd.novadigm.edx": {
    "source": "iana",
    "extensions": ["edx"]
  },
  "application/vnd.novadigm.ext": {
    "source": "iana",
    "extensions": ["ext"]
  },
  "application/vnd.ntt-local.content-share": {
    "source": "iana"
  },
  "application/vnd.ntt-local.file-transfer": {
    "source": "iana"
  },
  "application/vnd.ntt-local.ogw_remote-access": {
    "source": "iana"
  },
  "application/vnd.ntt-local.sip-ta_remote": {
    "source": "iana"
  },
  "application/vnd.ntt-local.sip-ta_tcp_stream": {
    "source": "iana"
  },
  "application/vnd.oasis.opendocument.chart": {
    "source": "iana",
    "extensions": ["odc"]
  },
  "application/vnd.oasis.opendocument.chart-template": {
    "source": "iana",
    "extensions": ["otc"]
  },
  "application/vnd.oasis.opendocument.database": {
    "source": "iana",
    "extensions": ["odb"]
  },
  "application/vnd.oasis.opendocument.formula": {
    "source": "iana",
    "extensions": ["odf"]
  },
  "application/vnd.oasis.opendocument.formula-template": {
    "source": "iana",
    "extensions": ["odft"]
  },
  "application/vnd.oasis.opendocument.graphics": {
    "source": "iana",
    "compressible": false,
    "extensions": ["odg"]
  },
  "application/vnd.oasis.opendocument.graphics-template": {
    "source": "iana",
    "extensions": ["otg"]
  },
  "application/vnd.oasis.opendocument.image": {
    "source": "iana",
    "extensions": ["odi"]
  },
  "application/vnd.oasis.opendocument.image-template": {
    "source": "iana",
    "extensions": ["oti"]
  },
  "application/vnd.oasis.opendocument.presentation": {
    "source": "iana",
    "compressible": false,
    "extensions": ["odp"]
  },
  "application/vnd.oasis.opendocument.presentation-template": {
    "source": "iana",
    "extensions": ["otp"]
  },
  "application/vnd.oasis.opendocument.spreadsheet": {
    "source": "iana",
    "compressible": false,
    "extensions": ["ods"]
  },
  "application/vnd.oasis.opendocument.spreadsheet-template": {
    "source": "iana",
    "extensions": ["ots"]
  },
  "application/vnd.oasis.opendocument.text": {
    "source": "iana",
    "compressible": false,
    "extensions": ["odt"]
  },
  "application/vnd.oasis.opendocument.text-master": {
    "source": "iana",
    "extensions": ["odm"]
  },
  "application/vnd.oasis.opendocument.text-template": {
    "source": "iana",
    "extensions": ["ott"]
  },
  "application/vnd.oasis.opendocument.text-web": {
    "source": "iana",
    "extensions": ["oth"]
  },
  "application/vnd.obn": {
    "source": "iana"
  },
  "application/vnd.ocf+cbor": {
    "source": "iana"
  },
  "application/vnd.oci.image.manifest.v1+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oftn.l10n+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.contentaccessdownload+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.contentaccessstreaming+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.cspg-hexbinary": {
    "source": "iana"
  },
  "application/vnd.oipf.dae.svg+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.dae.xhtml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.mippvcontrolmessage+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.pae.gem": {
    "source": "iana"
  },
  "application/vnd.oipf.spdiscovery+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.spdlist+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.ueprofile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.userprofile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.olpc-sugar": {
    "source": "iana",
    "extensions": ["xo"]
  },
  "application/vnd.oma-scws-config": {
    "source": "iana"
  },
  "application/vnd.oma-scws-http-request": {
    "source": "iana"
  },
  "application/vnd.oma-scws-http-response": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.associated-procedure-parameter+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.drm-trigger+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.imd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.ltkm": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.notification+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.provisioningtrigger": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.sgboot": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.sgdd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.sgdu": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.simple-symbol-container": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.smartcard-trigger+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.sprov+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.stkm": {
    "source": "iana"
  },
  "application/vnd.oma.cab-address-book+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.cab-feature-handler+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.cab-pcc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.cab-subs-invite+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.cab-user-prefs+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.dcd": {
    "source": "iana"
  },
  "application/vnd.oma.dcdc": {
    "source": "iana"
  },
  "application/vnd.oma.dd2+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dd2"]
  },
  "application/vnd.oma.drm.risd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.group-usage-list+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.lwm2m+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.lwm2m+tlv": {
    "source": "iana"
  },
  "application/vnd.oma.pal+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.detailed-progress-report+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.final-report+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.groups+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.invocation-descriptor+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.optimized-progress-report+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.push": {
    "source": "iana"
  },
  "application/vnd.oma.scidm.messages+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.xcap-directory+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.omads-email+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.omads-file+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.omads-folder+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.omaloc-supl-init": {
    "source": "iana"
  },
  "application/vnd.onepager": {
    "source": "iana"
  },
  "application/vnd.onepagertamp": {
    "source": "iana"
  },
  "application/vnd.onepagertamx": {
    "source": "iana"
  },
  "application/vnd.onepagertat": {
    "source": "iana"
  },
  "application/vnd.onepagertatp": {
    "source": "iana"
  },
  "application/vnd.onepagertatx": {
    "source": "iana"
  },
  "application/vnd.openblox.game+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["obgx"]
  },
  "application/vnd.openblox.game-binary": {
    "source": "iana"
  },
  "application/vnd.openeye.oeb": {
    "source": "iana"
  },
  "application/vnd.openofficeorg.extension": {
    "source": "apache",
    "extensions": ["oxt"]
  },
  "application/vnd.openstreetmap.data+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["osm"]
  },
  "application/vnd.openxmlformats-officedocument.custom-properties+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawing+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.extended-properties+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.presentation": {
    "source": "iana",
    "compressible": false,
    "extensions": ["pptx"]
  },
  "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slide": {
    "source": "iana",
    "extensions": ["sldx"]
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slideshow": {
    "source": "iana",
    "extensions": ["ppsx"]
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.template": {
    "source": "iana",
    "extensions": ["potx"]
  },
  "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
    "source": "iana",
    "compressible": false,
    "extensions": ["xlsx"]
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.template": {
    "source": "iana",
    "extensions": ["xltx"]
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.theme+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.themeoverride+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.vmldrawing": {
    "source": "iana"
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.document": {
    "source": "iana",
    "compressible": false,
    "extensions": ["docx"]
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.template": {
    "source": "iana",
    "extensions": ["dotx"]
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-package.core-properties+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-package.relationships+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oracle.resource+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.orange.indata": {
    "source": "iana"
  },
  "application/vnd.osa.netdeploy": {
    "source": "iana"
  },
  "application/vnd.osgeo.mapguide.package": {
    "source": "iana",
    "extensions": ["mgp"]
  },
  "application/vnd.osgi.bundle": {
    "source": "iana"
  },
  "application/vnd.osgi.dp": {
    "source": "iana",
    "extensions": ["dp"]
  },
  "application/vnd.osgi.subsystem": {
    "source": "iana",
    "extensions": ["esa"]
  },
  "application/vnd.otps.ct-kip+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oxli.countgraph": {
    "source": "iana"
  },
  "application/vnd.pagerduty+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.palm": {
    "source": "iana",
    "extensions": ["pdb","pqa","oprc"]
  },
  "application/vnd.panoply": {
    "source": "iana"
  },
  "application/vnd.paos.xml": {
    "source": "iana"
  },
  "application/vnd.patentdive": {
    "source": "iana"
  },
  "application/vnd.patientecommsdoc": {
    "source": "iana"
  },
  "application/vnd.pawaafile": {
    "source": "iana",
    "extensions": ["paw"]
  },
  "application/vnd.pcos": {
    "source": "iana"
  },
  "application/vnd.pg.format": {
    "source": "iana",
    "extensions": ["str"]
  },
  "application/vnd.pg.osasli": {
    "source": "iana",
    "extensions": ["ei6"]
  },
  "application/vnd.piaccess.application-licence": {
    "source": "iana"
  },
  "application/vnd.picsel": {
    "source": "iana",
    "extensions": ["efif"]
  },
  "application/vnd.pmi.widget": {
    "source": "iana",
    "extensions": ["wg"]
  },
  "application/vnd.poc.group-advertisement+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.pocketlearn": {
    "source": "iana",
    "extensions": ["plf"]
  },
  "application/vnd.powerbuilder6": {
    "source": "iana",
    "extensions": ["pbd"]
  },
  "application/vnd.powerbuilder6-s": {
    "source": "iana"
  },
  "application/vnd.powerbuilder7": {
    "source": "iana"
  },
  "application/vnd.powerbuilder7-s": {
    "source": "iana"
  },
  "application/vnd.powerbuilder75": {
    "source": "iana"
  },
  "application/vnd.powerbuilder75-s": {
    "source": "iana"
  },
  "application/vnd.preminet": {
    "source": "iana"
  },
  "application/vnd.previewsystems.box": {
    "source": "iana",
    "extensions": ["box"]
  },
  "application/vnd.proteus.magazine": {
    "source": "iana",
    "extensions": ["mgz"]
  },
  "application/vnd.psfs": {
    "source": "iana"
  },
  "application/vnd.publishare-delta-tree": {
    "source": "iana",
    "extensions": ["qps"]
  },
  "application/vnd.pvi.ptid1": {
    "source": "iana",
    "extensions": ["ptid"]
  },
  "application/vnd.pwg-multiplexed": {
    "source": "iana"
  },
  "application/vnd.pwg-xhtml-print+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.qualcomm.brew-app-res": {
    "source": "iana"
  },
  "application/vnd.quarantainenet": {
    "source": "iana"
  },
  "application/vnd.quark.quarkxpress": {
    "source": "iana",
    "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"]
  },
  "application/vnd.quobject-quoxdocument": {
    "source": "iana"
  },
  "application/vnd.radisys.moml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit-conf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit-conn+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit-dialog+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit-stream+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-conf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-base+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-fax-detect+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-group+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-speech+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-transform+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.rainstor.data": {
    "source": "iana"
  },
  "application/vnd.rapid": {
    "source": "iana"
  },
  "application/vnd.rar": {
    "source": "iana"
  },
  "application/vnd.realvnc.bed": {
    "source": "iana",
    "extensions": ["bed"]
  },
  "application/vnd.recordare.musicxml": {
    "source": "iana",
    "extensions": ["mxl"]
  },
  "application/vnd.recordare.musicxml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["musicxml"]
  },
  "application/vnd.renlearn.rlprint": {
    "source": "iana"
  },
  "application/vnd.restful+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.rig.cryptonote": {
    "source": "iana",
    "extensions": ["cryptonote"]
  },
  "application/vnd.rim.cod": {
    "source": "apache",
    "extensions": ["cod"]
  },
  "application/vnd.rn-realmedia": {
    "source": "apache",
    "extensions": ["rm"]
  },
  "application/vnd.rn-realmedia-vbr": {
    "source": "apache",
    "extensions": ["rmvb"]
  },
  "application/vnd.route66.link66+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["link66"]
  },
  "application/vnd.rs-274x": {
    "source": "iana"
  },
  "application/vnd.ruckus.download": {
    "source": "iana"
  },
  "application/vnd.s3sms": {
    "source": "iana"
  },
  "application/vnd.sailingtracker.track": {
    "source": "iana",
    "extensions": ["st"]
  },
  "application/vnd.sar": {
    "source": "iana"
  },
  "application/vnd.sbm.cid": {
    "source": "iana"
  },
  "application/vnd.sbm.mid2": {
    "source": "iana"
  },
  "application/vnd.scribus": {
    "source": "iana"
  },
  "application/vnd.sealed.3df": {
    "source": "iana"
  },
  "application/vnd.sealed.csf": {
    "source": "iana"
  },
  "application/vnd.sealed.doc": {
    "source": "iana"
  },
  "application/vnd.sealed.eml": {
    "source": "iana"
  },
  "application/vnd.sealed.mht": {
    "source": "iana"
  },
  "application/vnd.sealed.net": {
    "source": "iana"
  },
  "application/vnd.sealed.ppt": {
    "source": "iana"
  },
  "application/vnd.sealed.tiff": {
    "source": "iana"
  },
  "application/vnd.sealed.xls": {
    "source": "iana"
  },
  "application/vnd.sealedmedia.softseal.html": {
    "source": "iana"
  },
  "application/vnd.sealedmedia.softseal.pdf": {
    "source": "iana"
  },
  "application/vnd.seemail": {
    "source": "iana",
    "extensions": ["see"]
  },
  "application/vnd.sema": {
    "source": "iana",
    "extensions": ["sema"]
  },
  "application/vnd.semd": {
    "source": "iana",
    "extensions": ["semd"]
  },
  "application/vnd.semf": {
    "source": "iana",
    "extensions": ["semf"]
  },
  "application/vnd.shade-save-file": {
    "source": "iana"
  },
  "application/vnd.shana.informed.formdata": {
    "source": "iana",
    "extensions": ["ifm"]
  },
  "application/vnd.shana.informed.formtemplate": {
    "source": "iana",
    "extensions": ["itp"]
  },
  "application/vnd.shana.informed.interchange": {
    "source": "iana",
    "extensions": ["iif"]
  },
  "application/vnd.shana.informed.package": {
    "source": "iana",
    "extensions": ["ipk"]
  },
  "application/vnd.shootproof+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.shopkick+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.shp": {
    "source": "iana"
  },
  "application/vnd.shx": {
    "source": "iana"
  },
  "application/vnd.sigrok.session": {
    "source": "iana"
  },
  "application/vnd.simtech-mindmapper": {
    "source": "iana",
    "extensions": ["twd","twds"]
  },
  "application/vnd.siren+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.smaf": {
    "source": "iana",
    "extensions": ["mmf"]
  },
  "application/vnd.smart.notebook": {
    "source": "iana"
  },
  "application/vnd.smart.teacher": {
    "source": "iana",
    "extensions": ["teacher"]
  },
  "application/vnd.snesdev-page-table": {
    "source": "iana"
  },
  "application/vnd.software602.filler.form+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["fo"]
  },
  "application/vnd.software602.filler.form-xml-zip": {
    "source": "iana"
  },
  "application/vnd.solent.sdkm+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sdkm","sdkd"]
  },
  "application/vnd.spotfire.dxp": {
    "source": "iana",
    "extensions": ["dxp"]
  },
  "application/vnd.spotfire.sfs": {
    "source": "iana",
    "extensions": ["sfs"]
  },
  "application/vnd.sqlite3": {
    "source": "iana"
  },
  "application/vnd.sss-cod": {
    "source": "iana"
  },
  "application/vnd.sss-dtf": {
    "source": "iana"
  },
  "application/vnd.sss-ntf": {
    "source": "iana"
  },
  "application/vnd.stardivision.calc": {
    "source": "apache",
    "extensions": ["sdc"]
  },
  "application/vnd.stardivision.draw": {
    "source": "apache",
    "extensions": ["sda"]
  },
  "application/vnd.stardivision.impress": {
    "source": "apache",
    "extensions": ["sdd"]
  },
  "application/vnd.stardivision.math": {
    "source": "apache",
    "extensions": ["smf"]
  },
  "application/vnd.stardivision.writer": {
    "source": "apache",
    "extensions": ["sdw","vor"]
  },
  "application/vnd.stardivision.writer-global": {
    "source": "apache",
    "extensions": ["sgl"]
  },
  "application/vnd.stepmania.package": {
    "source": "iana",
    "extensions": ["smzip"]
  },
  "application/vnd.stepmania.stepchart": {
    "source": "iana",
    "extensions": ["sm"]
  },
  "application/vnd.street-stream": {
    "source": "iana"
  },
  "application/vnd.sun.wadl+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wadl"]
  },
  "application/vnd.sun.xml.calc": {
    "source": "apache",
    "extensions": ["sxc"]
  },
  "application/vnd.sun.xml.calc.template": {
    "source": "apache",
    "extensions": ["stc"]
  },
  "application/vnd.sun.xml.draw": {
    "source": "apache",
    "extensions": ["sxd"]
  },
  "application/vnd.sun.xml.draw.template": {
    "source": "apache",
    "extensions": ["std"]
  },
  "application/vnd.sun.xml.impress": {
    "source": "apache",
    "extensions": ["sxi"]
  },
  "application/vnd.sun.xml.impress.template": {
    "source": "apache",
    "extensions": ["sti"]
  },
  "application/vnd.sun.xml.math": {
    "source": "apache",
    "extensions": ["sxm"]
  },
  "application/vnd.sun.xml.writer": {
    "source": "apache",
    "extensions": ["sxw"]
  },
  "application/vnd.sun.xml.writer.global": {
    "source": "apache",
    "extensions": ["sxg"]
  },
  "application/vnd.sun.xml.writer.template": {
    "source": "apache",
    "extensions": ["stw"]
  },
  "application/vnd.sus-calendar": {
    "source": "iana",
    "extensions": ["sus","susp"]
  },
  "application/vnd.svd": {
    "source": "iana",
    "extensions": ["svd"]
  },
  "application/vnd.swiftview-ics": {
    "source": "iana"
  },
  "application/vnd.symbian.install": {
    "source": "apache",
    "extensions": ["sis","sisx"]
  },
  "application/vnd.syncml+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["xsm"]
  },
  "application/vnd.syncml.dm+wbxml": {
    "source": "iana",
    "charset": "UTF-8",
    "extensions": ["bdm"]
  },
  "application/vnd.syncml.dm+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["xdm"]
  },
  "application/vnd.syncml.dm.notification": {
    "source": "iana"
  },
  "application/vnd.syncml.dmddf+wbxml": {
    "source": "iana"
  },
  "application/vnd.syncml.dmddf+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["ddf"]
  },
  "application/vnd.syncml.dmtnds+wbxml": {
    "source": "iana"
  },
  "application/vnd.syncml.dmtnds+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.syncml.ds.notification": {
    "source": "iana"
  },
  "application/vnd.tableschema+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.tao.intent-module-archive": {
    "source": "iana",
    "extensions": ["tao"]
  },
  "application/vnd.tcpdump.pcap": {
    "source": "iana",
    "extensions": ["pcap","cap","dmp"]
  },
  "application/vnd.think-cell.ppttc+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.tmd.mediaflex.api+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.tml": {
    "source": "iana"
  },
  "application/vnd.tmobile-livetv": {
    "source": "iana",
    "extensions": ["tmo"]
  },
  "application/vnd.tri.onesource": {
    "source": "iana"
  },
  "application/vnd.trid.tpt": {
    "source": "iana",
    "extensions": ["tpt"]
  },
  "application/vnd.triscape.mxs": {
    "source": "iana",
    "extensions": ["mxs"]
  },
  "application/vnd.trueapp": {
    "source": "iana",
    "extensions": ["tra"]
  },
  "application/vnd.truedoc": {
    "source": "iana"
  },
  "application/vnd.ubisoft.webplayer": {
    "source": "iana"
  },
  "application/vnd.ufdl": {
    "source": "iana",
    "extensions": ["ufd","ufdl"]
  },
  "application/vnd.uiq.theme": {
    "source": "iana",
    "extensions": ["utz"]
  },
  "application/vnd.umajin": {
    "source": "iana",
    "extensions": ["umj"]
  },
  "application/vnd.unity": {
    "source": "iana",
    "extensions": ["unityweb"]
  },
  "application/vnd.uoml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["uoml"]
  },
  "application/vnd.uplanet.alert": {
    "source": "iana"
  },
  "application/vnd.uplanet.alert-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.bearer-choice": {
    "source": "iana"
  },
  "application/vnd.uplanet.bearer-choice-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.cacheop": {
    "source": "iana"
  },
  "application/vnd.uplanet.cacheop-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.channel": {
    "source": "iana"
  },
  "application/vnd.uplanet.channel-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.list": {
    "source": "iana"
  },
  "application/vnd.uplanet.list-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.listcmd": {
    "source": "iana"
  },
  "application/vnd.uplanet.listcmd-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.signal": {
    "source": "iana"
  },
  "application/vnd.uri-map": {
    "source": "iana"
  },
  "application/vnd.valve.source.material": {
    "source": "iana"
  },
  "application/vnd.vcx": {
    "source": "iana",
    "extensions": ["vcx"]
  },
  "application/vnd.vd-study": {
    "source": "iana"
  },
  "application/vnd.vectorworks": {
    "source": "iana"
  },
  "application/vnd.vel+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.verimatrix.vcas": {
    "source": "iana"
  },
  "application/vnd.veryant.thin": {
    "source": "iana"
  },
  "application/vnd.ves.encrypted": {
    "source": "iana"
  },
  "application/vnd.vidsoft.vidconference": {
    "source": "iana"
  },
  "application/vnd.visio": {
    "source": "iana",
    "extensions": ["vsd","vst","vss","vsw"]
  },
  "application/vnd.visionary": {
    "source": "iana",
    "extensions": ["vis"]
  },
  "application/vnd.vividence.scriptfile": {
    "source": "iana"
  },
  "application/vnd.vsf": {
    "source": "iana",
    "extensions": ["vsf"]
  },
  "application/vnd.wap.sic": {
    "source": "iana"
  },
  "application/vnd.wap.slc": {
    "source": "iana"
  },
  "application/vnd.wap.wbxml": {
    "source": "iana",
    "charset": "UTF-8",
    "extensions": ["wbxml"]
  },
  "application/vnd.wap.wmlc": {
    "source": "iana",
    "extensions": ["wmlc"]
  },
  "application/vnd.wap.wmlscriptc": {
    "source": "iana",
    "extensions": ["wmlsc"]
  },
  "application/vnd.webturbo": {
    "source": "iana",
    "extensions": ["wtb"]
  },
  "application/vnd.wfa.p2p": {
    "source": "iana"
  },
  "application/vnd.wfa.wsc": {
    "source": "iana"
  },
  "application/vnd.windows.devicepairing": {
    "source": "iana"
  },
  "application/vnd.wmc": {
    "source": "iana"
  },
  "application/vnd.wmf.bootstrap": {
    "source": "iana"
  },
  "application/vnd.wolfram.mathematica": {
    "source": "iana"
  },
  "application/vnd.wolfram.mathematica.package": {
    "source": "iana"
  },
  "application/vnd.wolfram.player": {
    "source": "iana",
    "extensions": ["nbp"]
  },
  "application/vnd.wordperfect": {
    "source": "iana",
    "extensions": ["wpd"]
  },
  "application/vnd.wqd": {
    "source": "iana",
    "extensions": ["wqd"]
  },
  "application/vnd.wrq-hp3000-labelled": {
    "source": "iana"
  },
  "application/vnd.wt.stf": {
    "source": "iana",
    "extensions": ["stf"]
  },
  "application/vnd.wv.csp+wbxml": {
    "source": "iana"
  },
  "application/vnd.wv.csp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.wv.ssp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.xacml+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.xara": {
    "source": "iana",
    "extensions": ["xar"]
  },
  "application/vnd.xfdl": {
    "source": "iana",
    "extensions": ["xfdl"]
  },
  "application/vnd.xfdl.webform": {
    "source": "iana"
  },
  "application/vnd.xmi+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.xmpie.cpkg": {
    "source": "iana"
  },
  "application/vnd.xmpie.dpkg": {
    "source": "iana"
  },
  "application/vnd.xmpie.plan": {
    "source": "iana"
  },
  "application/vnd.xmpie.ppkg": {
    "source": "iana"
  },
  "application/vnd.xmpie.xlim": {
    "source": "iana"
  },
  "application/vnd.yamaha.hv-dic": {
    "source": "iana",
    "extensions": ["hvd"]
  },
  "application/vnd.yamaha.hv-script": {
    "source": "iana",
    "extensions": ["hvs"]
  },
  "application/vnd.yamaha.hv-voice": {
    "source": "iana",
    "extensions": ["hvp"]
  },
  "application/vnd.yamaha.openscoreformat": {
    "source": "iana",
    "extensions": ["osf"]
  },
  "application/vnd.yamaha.openscoreformat.osfpvg+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["osfpvg"]
  },
  "application/vnd.yamaha.remote-setup": {
    "source": "iana"
  },
  "application/vnd.yamaha.smaf-audio": {
    "source": "iana",
    "extensions": ["saf"]
  },
  "application/vnd.yamaha.smaf-phrase": {
    "source": "iana",
    "extensions": ["spf"]
  },
  "application/vnd.yamaha.through-ngn": {
    "source": "iana"
  },
  "application/vnd.yamaha.tunnel-udpencap": {
    "source": "iana"
  },
  "application/vnd.yaoweme": {
    "source": "iana"
  },
  "application/vnd.yellowriver-custom-menu": {
    "source": "iana",
    "extensions": ["cmp"]
  },
  "application/vnd.youtube.yt": {
    "source": "iana"
  },
  "application/vnd.zul": {
    "source": "iana",
    "extensions": ["zir","zirz"]
  },
  "application/vnd.zzazz.deck+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["zaz"]
  },
  "application/voicexml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["vxml"]
  },
  "application/voucher-cms+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vq-rtcpxr": {
    "source": "iana"
  },
  "application/wasm": {
    "compressible": true,
    "extensions": ["wasm"]
  },
  "application/watcherinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/webpush-options+json": {
    "source": "iana",
    "compressible": true
  },
  "application/whoispp-query": {
    "source": "iana"
  },
  "application/whoispp-response": {
    "source": "iana"
  },
  "application/widget": {
    "source": "iana",
    "extensions": ["wgt"]
  },
  "application/winhlp": {
    "source": "apache",
    "extensions": ["hlp"]
  },
  "application/wita": {
    "source": "iana"
  },
  "application/wordperfect5.1": {
    "source": "iana"
  },
  "application/wsdl+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wsdl"]
  },
  "application/wspolicy+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wspolicy"]
  },
  "application/x-7z-compressed": {
    "source": "apache",
    "compressible": false,
    "extensions": ["7z"]
  },
  "application/x-abiword": {
    "source": "apache",
    "extensions": ["abw"]
  },
  "application/x-ace-compressed": {
    "source": "apache",
    "extensions": ["ace"]
  },
  "application/x-amf": {
    "source": "apache"
  },
  "application/x-apple-diskimage": {
    "source": "apache",
    "extensions": ["dmg"]
  },
  "application/x-arj": {
    "compressible": false,
    "extensions": ["arj"]
  },
  "application/x-authorware-bin": {
    "source": "apache",
    "extensions": ["aab","x32","u32","vox"]
  },
  "application/x-authorware-map": {
    "source": "apache",
    "extensions": ["aam"]
  },
  "application/x-authorware-seg": {
    "source": "apache",
    "extensions": ["aas"]
  },
  "application/x-bcpio": {
    "source": "apache",
    "extensions": ["bcpio"]
  },
  "application/x-bdoc": {
    "compressible": false,
    "extensions": ["bdoc"]
  },
  "application/x-bittorrent": {
    "source": "apache",
    "extensions": ["torrent"]
  },
  "application/x-blorb": {
    "source": "apache",
    "extensions": ["blb","blorb"]
  },
  "application/x-bzip": {
    "source": "apache",
    "compressible": false,
    "extensions": ["bz"]
  },
  "application/x-bzip2": {
    "source": "apache",
    "compressible": false,
    "extensions": ["bz2","boz"]
  },
  "application/x-cbr": {
    "source": "apache",
    "extensions": ["cbr","cba","cbt","cbz","cb7"]
  },
  "application/x-cdlink": {
    "source": "apache",
    "extensions": ["vcd"]
  },
  "application/x-cfs-compressed": {
    "source": "apache",
    "extensions": ["cfs"]
  },
  "application/x-chat": {
    "source": "apache",
    "extensions": ["chat"]
  },
  "application/x-chess-pgn": {
    "source": "apache",
    "extensions": ["pgn"]
  },
  "application/x-chrome-extension": {
    "extensions": ["crx"]
  },
  "application/x-cocoa": {
    "source": "nginx",
    "extensions": ["cco"]
  },
  "application/x-compress": {
    "source": "apache"
  },
  "application/x-conference": {
    "source": "apache",
    "extensions": ["nsc"]
  },
  "application/x-cpio": {
    "source": "apache",
    "extensions": ["cpio"]
  },
  "application/x-csh": {
    "source": "apache",
    "extensions": ["csh"]
  },
  "application/x-deb": {
    "compressible": false
  },
  "application/x-debian-package": {
    "source": "apache",
    "extensions": ["deb","udeb"]
  },
  "application/x-dgc-compressed": {
    "source": "apache",
    "extensions": ["dgc"]
  },
  "application/x-director": {
    "source": "apache",
    "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]
  },
  "application/x-doom": {
    "source": "apache",
    "extensions": ["wad"]
  },
  "application/x-dtbncx+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["ncx"]
  },
  "application/x-dtbook+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["dtb"]
  },
  "application/x-dtbresource+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["res"]
  },
  "application/x-dvi": {
    "source": "apache",
    "compressible": false,
    "extensions": ["dvi"]
  },
  "application/x-envoy": {
    "source": "apache",
    "extensions": ["evy"]
  },
  "application/x-eva": {
    "source": "apache",
    "extensions": ["eva"]
  },
  "application/x-font-bdf": {
    "source": "apache",
    "extensions": ["bdf"]
  },
  "application/x-font-dos": {
    "source": "apache"
  },
  "application/x-font-framemaker": {
    "source": "apache"
  },
  "application/x-font-ghostscript": {
    "source": "apache",
    "extensions": ["gsf"]
  },
  "application/x-font-libgrx": {
    "source": "apache"
  },
  "application/x-font-linux-psf": {
    "source": "apache",
    "extensions": ["psf"]
  },
  "application/x-font-pcf": {
    "source": "apache",
    "extensions": ["pcf"]
  },
  "application/x-font-snf": {
    "source": "apache",
    "extensions": ["snf"]
  },
  "application/x-font-speedo": {
    "source": "apache"
  },
  "application/x-font-sunos-news": {
    "source": "apache"
  },
  "application/x-font-type1": {
    "source": "apache",
    "extensions": ["pfa","pfb","pfm","afm"]
  },
  "application/x-font-vfont": {
    "source": "apache"
  },
  "application/x-freearc": {
    "source": "apache",
    "extensions": ["arc"]
  },
  "application/x-futuresplash": {
    "source": "apache",
    "extensions": ["spl"]
  },
  "application/x-gca-compressed": {
    "source": "apache",
    "extensions": ["gca"]
  },
  "application/x-glulx": {
    "source": "apache",
    "extensions": ["ulx"]
  },
  "application/x-gnumeric": {
    "source": "apache",
    "extensions": ["gnumeric"]
  },
  "application/x-gramps-xml": {
    "source": "apache",
    "extensions": ["gramps"]
  },
  "application/x-gtar": {
    "source": "apache",
    "extensions": ["gtar"]
  },
  "application/x-gzip": {
    "source": "apache"
  },
  "application/x-hdf": {
    "source": "apache",
    "extensions": ["hdf"]
  },
  "application/x-httpd-php": {
    "compressible": true,
    "extensions": ["php"]
  },
  "application/x-install-instructions": {
    "source": "apache",
    "extensions": ["install"]
  },
  "application/x-iso9660-image": {
    "source": "apache",
    "extensions": ["iso"]
  },
  "application/x-java-archive-diff": {
    "source": "nginx",
    "extensions": ["jardiff"]
  },
  "application/x-java-jnlp-file": {
    "source": "apache",
    "compressible": false,
    "extensions": ["jnlp"]
  },
  "application/x-javascript": {
    "compressible": true
  },
  "application/x-keepass2": {
    "extensions": ["kdbx"]
  },
  "application/x-latex": {
    "source": "apache",
    "compressible": false,
    "extensions": ["latex"]
  },
  "application/x-lua-bytecode": {
    "extensions": ["luac"]
  },
  "application/x-lzh-compressed": {
    "source": "apache",
    "extensions": ["lzh","lha"]
  },
  "application/x-makeself": {
    "source": "nginx",
    "extensions": ["run"]
  },
  "application/x-mie": {
    "source": "apache",
    "extensions": ["mie"]
  },
  "application/x-mobipocket-ebook": {
    "source": "apache",
    "extensions": ["prc","mobi"]
  },
  "application/x-mpegurl": {
    "compressible": false
  },
  "application/x-ms-application": {
    "source": "apache",
    "extensions": ["application"]
  },
  "application/x-ms-shortcut": {
    "source": "apache",
    "extensions": ["lnk"]
  },
  "application/x-ms-wmd": {
    "source": "apache",
    "extensions": ["wmd"]
  },
  "application/x-ms-wmz": {
    "source": "apache",
    "extensions": ["wmz"]
  },
  "application/x-ms-xbap": {
    "source": "apache",
    "extensions": ["xbap"]
  },
  "application/x-msaccess": {
    "source": "apache",
    "extensions": ["mdb"]
  },
  "application/x-msbinder": {
    "source": "apache",
    "extensions": ["obd"]
  },
  "application/x-mscardfile": {
    "source": "apache",
    "extensions": ["crd"]
  },
  "application/x-msclip": {
    "source": "apache",
    "extensions": ["clp"]
  },
  "application/x-msdos-program": {
    "extensions": ["exe"]
  },
  "application/x-msdownload": {
    "source": "apache",
    "extensions": ["exe","dll","com","bat","msi"]
  },
  "application/x-msmediaview": {
    "source": "apache",
    "extensions": ["mvb","m13","m14"]
  },
  "application/x-msmetafile": {
    "source": "apache",
    "extensions": ["wmf","wmz","emf","emz"]
  },
  "application/x-msmoney": {
    "source": "apache",
    "extensions": ["mny"]
  },
  "application/x-mspublisher": {
    "source": "apache",
    "extensions": ["pub"]
  },
  "application/x-msschedule": {
    "source": "apache",
    "extensions": ["scd"]
  },
  "application/x-msterminal": {
    "source": "apache",
    "extensions": ["trm"]
  },
  "application/x-mswrite": {
    "source": "apache",
    "extensions": ["wri"]
  },
  "application/x-netcdf": {
    "source": "apache",
    "extensions": ["nc","cdf"]
  },
  "application/x-ns-proxy-autoconfig": {
    "compressible": true,
    "extensions": ["pac"]
  },
  "application/x-nzb": {
    "source": "apache",
    "extensions": ["nzb"]
  },
  "application/x-perl": {
    "source": "nginx",
    "extensions": ["pl","pm"]
  },
  "application/x-pilot": {
    "source": "nginx",
    "extensions": ["prc","pdb"]
  },
  "application/x-pkcs12": {
    "source": "apache",
    "compressible": false,
    "extensions": ["p12","pfx"]
  },
  "application/x-pkcs7-certificates": {
    "source": "apache",
    "extensions": ["p7b","spc"]
  },
  "application/x-pkcs7-certreqresp": {
    "source": "apache",
    "extensions": ["p7r"]
  },
  "application/x-pki-message": {
    "source": "iana"
  },
  "application/x-rar-compressed": {
    "source": "apache",
    "compressible": false,
    "extensions": ["rar"]
  },
  "application/x-redhat-package-manager": {
    "source": "nginx",
    "extensions": ["rpm"]
  },
  "application/x-research-info-systems": {
    "source": "apache",
    "extensions": ["ris"]
  },
  "application/x-sea": {
    "source": "nginx",
    "extensions": ["sea"]
  },
  "application/x-sh": {
    "source": "apache",
    "compressible": true,
    "extensions": ["sh"]
  },
  "application/x-shar": {
    "source": "apache",
    "extensions": ["shar"]
  },
  "application/x-shockwave-flash": {
    "source": "apache",
    "compressible": false,
    "extensions": ["swf"]
  },
  "application/x-silverlight-app": {
    "source": "apache",
    "extensions": ["xap"]
  },
  "application/x-sql": {
    "source": "apache",
    "extensions": ["sql"]
  },
  "application/x-stuffit": {
    "source": "apache",
    "compressible": false,
    "extensions": ["sit"]
  },
  "application/x-stuffitx": {
    "source": "apache",
    "extensions": ["sitx"]
  },
  "application/x-subrip": {
    "source": "apache",
    "extensions": ["srt"]
  },
  "application/x-sv4cpio": {
    "source": "apache",
    "extensions": ["sv4cpio"]
  },
  "application/x-sv4crc": {
    "source": "apache",
    "extensions": ["sv4crc"]
  },
  "application/x-t3vm-image": {
    "source": "apache",
    "extensions": ["t3"]
  },
  "application/x-tads": {
    "source": "apache",
    "extensions": ["gam"]
  },
  "application/x-tar": {
    "source": "apache",
    "compressible": true,
    "extensions": ["tar"]
  },
  "application/x-tcl": {
    "source": "apache",
    "extensions": ["tcl","tk"]
  },
  "application/x-tex": {
    "source": "apache",
    "extensions": ["tex"]
  },
  "application/x-tex-tfm": {
    "source": "apache",
    "extensions": ["tfm"]
  },
  "application/x-texinfo": {
    "source": "apache",
    "extensions": ["texinfo","texi"]
  },
  "application/x-tgif": {
    "source": "apache",
    "extensions": ["obj"]
  },
  "application/x-ustar": {
    "source": "apache",
    "extensions": ["ustar"]
  },
  "application/x-virtualbox-hdd": {
    "compressible": true,
    "extensions": ["hdd"]
  },
  "application/x-virtualbox-ova": {
    "compressible": true,
    "extensions": ["ova"]
  },
  "application/x-virtualbox-ovf": {
    "compressible": true,
    "extensions": ["ovf"]
  },
  "application/x-virtualbox-vbox": {
    "compressible": true,
    "extensions": ["vbox"]
  },
  "application/x-virtualbox-vbox-extpack": {
    "compressible": false,
    "extensions": ["vbox-extpack"]
  },
  "application/x-virtualbox-vdi": {
    "compressible": true,
    "extensions": ["vdi"]
  },
  "application/x-virtualbox-vhd": {
    "compressible": true,
    "extensions": ["vhd"]
  },
  "application/x-virtualbox-vmdk": {
    "compressible": true,
    "extensions": ["vmdk"]
  },
  "application/x-wais-source": {
    "source": "apache",
    "extensions": ["src"]
  },
  "application/x-web-app-manifest+json": {
    "compressible": true,
    "extensions": ["webapp"]
  },
  "application/x-www-form-urlencoded": {
    "source": "iana",
    "compressible": true
  },
  "application/x-x509-ca-cert": {
    "source": "iana",
    "extensions": ["der","crt","pem"]
  },
  "application/x-x509-ca-ra-cert": {
    "source": "iana"
  },
  "application/x-x509-next-ca-cert": {
    "source": "iana"
  },
  "application/x-xfig": {
    "source": "apache",
    "extensions": ["fig"]
  },
  "application/x-xliff+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["xlf"]
  },
  "application/x-xpinstall": {
    "source": "apache",
    "compressible": false,
    "extensions": ["xpi"]
  },
  "application/x-xz": {
    "source": "apache",
    "extensions": ["xz"]
  },
  "application/x-zmachine": {
    "source": "apache",
    "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"]
  },
  "application/x400-bp": {
    "source": "iana"
  },
  "application/xacml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xaml+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["xaml"]
  },
  "application/xcap-att+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xav"]
  },
  "application/xcap-caps+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xca"]
  },
  "application/xcap-diff+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xdf"]
  },
  "application/xcap-el+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xel"]
  },
  "application/xcap-error+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xer"]
  },
  "application/xcap-ns+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xns"]
  },
  "application/xcon-conference-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xcon-conference-info-diff+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xenc+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xenc"]
  },
  "application/xhtml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xhtml","xht"]
  },
  "application/xhtml-voice+xml": {
    "source": "apache",
    "compressible": true
  },
  "application/xliff+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xlf"]
  },
  "application/xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xml","xsl","xsd","rng"]
  },
  "application/xml-dtd": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dtd"]
  },
  "application/xml-external-parsed-entity": {
    "source": "iana"
  },
  "application/xml-patch+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xmpp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xop+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xop"]
  },
  "application/xproc+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["xpl"]
  },
  "application/xslt+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xslt"]
  },
  "application/xspf+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["xspf"]
  },
  "application/xv+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mxml","xhvml","xvml","xvm"]
  },
  "application/yang": {
    "source": "iana",
    "extensions": ["yang"]
  },
  "application/yang-data+json": {
    "source": "iana",
    "compressible": true
  },
  "application/yang-data+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/yang-patch+json": {
    "source": "iana",
    "compressible": true
  },
  "application/yang-patch+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/yin+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["yin"]
  },
  "application/zip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["zip"]
  },
  "application/zlib": {
    "source": "iana"
  },
  "application/zstd": {
    "source": "iana"
  },
  "audio/1d-interleaved-parityfec": {
    "source": "iana"
  },
  "audio/32kadpcm": {
    "source": "iana"
  },
  "audio/3gpp": {
    "source": "iana",
    "compressible": false,
    "extensions": ["3gpp"]
  },
  "audio/3gpp2": {
    "source": "iana"
  },
  "audio/aac": {
    "source": "iana"
  },
  "audio/ac3": {
    "source": "iana"
  },
  "audio/adpcm": {
    "source": "apache",
    "extensions": ["adp"]
  },
  "audio/amr": {
    "source": "iana"
  },
  "audio/amr-wb": {
    "source": "iana"
  },
  "audio/amr-wb+": {
    "source": "iana"
  },
  "audio/aptx": {
    "source": "iana"
  },
  "audio/asc": {
    "source": "iana"
  },
  "audio/atrac-advanced-lossless": {
    "source": "iana"
  },
  "audio/atrac-x": {
    "source": "iana"
  },
  "audio/atrac3": {
    "source": "iana"
  },
  "audio/basic": {
    "source": "iana",
    "compressible": false,
    "extensions": ["au","snd"]
  },
  "audio/bv16": {
    "source": "iana"
  },
  "audio/bv32": {
    "source": "iana"
  },
  "audio/clearmode": {
    "source": "iana"
  },
  "audio/cn": {
    "source": "iana"
  },
  "audio/dat12": {
    "source": "iana"
  },
  "audio/dls": {
    "source": "iana"
  },
  "audio/dsr-es201108": {
    "source": "iana"
  },
  "audio/dsr-es202050": {
    "source": "iana"
  },
  "audio/dsr-es202211": {
    "source": "iana"
  },
  "audio/dsr-es202212": {
    "source": "iana"
  },
  "audio/dv": {
    "source": "iana"
  },
  "audio/dvi4": {
    "source": "iana"
  },
  "audio/eac3": {
    "source": "iana"
  },
  "audio/encaprtp": {
    "source": "iana"
  },
  "audio/evrc": {
    "source": "iana"
  },
  "audio/evrc-qcp": {
    "source": "iana"
  },
  "audio/evrc0": {
    "source": "iana"
  },
  "audio/evrc1": {
    "source": "iana"
  },
  "audio/evrcb": {
    "source": "iana"
  },
  "audio/evrcb0": {
    "source": "iana"
  },
  "audio/evrcb1": {
    "source": "iana"
  },
  "audio/evrcnw": {
    "source": "iana"
  },
  "audio/evrcnw0": {
    "source": "iana"
  },
  "audio/evrcnw1": {
    "source": "iana"
  },
  "audio/evrcwb": {
    "source": "iana"
  },
  "audio/evrcwb0": {
    "source": "iana"
  },
  "audio/evrcwb1": {
    "source": "iana"
  },
  "audio/evs": {
    "source": "iana"
  },
  "audio/flexfec": {
    "source": "iana"
  },
  "audio/fwdred": {
    "source": "iana"
  },
  "audio/g711-0": {
    "source": "iana"
  },
  "audio/g719": {
    "source": "iana"
  },
  "audio/g722": {
    "source": "iana"
  },
  "audio/g7221": {
    "source": "iana"
  },
  "audio/g723": {
    "source": "iana"
  },
  "audio/g726-16": {
    "source": "iana"
  },
  "audio/g726-24": {
    "source": "iana"
  },
  "audio/g726-32": {
    "source": "iana"
  },
  "audio/g726-40": {
    "source": "iana"
  },
  "audio/g728": {
    "source": "iana"
  },
  "audio/g729": {
    "source": "iana"
  },
  "audio/g7291": {
    "source": "iana"
  },
  "audio/g729d": {
    "source": "iana"
  },
  "audio/g729e": {
    "source": "iana"
  },
  "audio/gsm": {
    "source": "iana"
  },
  "audio/gsm-efr": {
    "source": "iana"
  },
  "audio/gsm-hr-08": {
    "source": "iana"
  },
  "audio/ilbc": {
    "source": "iana"
  },
  "audio/ip-mr_v2.5": {
    "source": "iana"
  },
  "audio/isac": {
    "source": "apache"
  },
  "audio/l16": {
    "source": "iana"
  },
  "audio/l20": {
    "source": "iana"
  },
  "audio/l24": {
    "source": "iana",
    "compressible": false
  },
  "audio/l8": {
    "source": "iana"
  },
  "audio/lpc": {
    "source": "iana"
  },
  "audio/melp": {
    "source": "iana"
  },
  "audio/melp1200": {
    "source": "iana"
  },
  "audio/melp2400": {
    "source": "iana"
  },
  "audio/melp600": {
    "source": "iana"
  },
  "audio/mhas": {
    "source": "iana"
  },
  "audio/midi": {
    "source": "apache",
    "extensions": ["mid","midi","kar","rmi"]
  },
  "audio/mobile-xmf": {
    "source": "iana",
    "extensions": ["mxmf"]
  },
  "audio/mp3": {
    "compressible": false,
    "extensions": ["mp3"]
  },
  "audio/mp4": {
    "source": "iana",
    "compressible": false,
    "extensions": ["m4a","mp4a"]
  },
  "audio/mp4a-latm": {
    "source": "iana"
  },
  "audio/mpa": {
    "source": "iana"
  },
  "audio/mpa-robust": {
    "source": "iana"
  },
  "audio/mpeg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"]
  },
  "audio/mpeg4-generic": {
    "source": "iana"
  },
  "audio/musepack": {
    "source": "apache"
  },
  "audio/ogg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["oga","ogg","spx"]
  },
  "audio/opus": {
    "source": "iana"
  },
  "audio/parityfec": {
    "source": "iana"
  },
  "audio/pcma": {
    "source": "iana"
  },
  "audio/pcma-wb": {
    "source": "iana"
  },
  "audio/pcmu": {
    "source": "iana"
  },
  "audio/pcmu-wb": {
    "source": "iana"
  },
  "audio/prs.sid": {
    "source": "iana"
  },
  "audio/qcelp": {
    "source": "iana"
  },
  "audio/raptorfec": {
    "source": "iana"
  },
  "audio/red": {
    "source": "iana"
  },
  "audio/rtp-enc-aescm128": {
    "source": "iana"
  },
  "audio/rtp-midi": {
    "source": "iana"
  },
  "audio/rtploopback": {
    "source": "iana"
  },
  "audio/rtx": {
    "source": "iana"
  },
  "audio/s3m": {
    "source": "apache",
    "extensions": ["s3m"]
  },
  "audio/silk": {
    "source": "apache",
    "extensions": ["sil"]
  },
  "audio/smv": {
    "source": "iana"
  },
  "audio/smv-qcp": {
    "source": "iana"
  },
  "audio/smv0": {
    "source": "iana"
  },
  "audio/sp-midi": {
    "source": "iana"
  },
  "audio/speex": {
    "source": "iana"
  },
  "audio/t140c": {
    "source": "iana"
  },
  "audio/t38": {
    "source": "iana"
  },
  "audio/telephone-event": {
    "source": "iana"
  },
  "audio/tetra_acelp": {
    "source": "iana"
  },
  "audio/tetra_acelp_bb": {
    "source": "iana"
  },
  "audio/tone": {
    "source": "iana"
  },
  "audio/uemclip": {
    "source": "iana"
  },
  "audio/ulpfec": {
    "source": "iana"
  },
  "audio/usac": {
    "source": "iana"
  },
  "audio/vdvi": {
    "source": "iana"
  },
  "audio/vmr-wb": {
    "source": "iana"
  },
  "audio/vnd.3gpp.iufp": {
    "source": "iana"
  },
  "audio/vnd.4sb": {
    "source": "iana"
  },
  "audio/vnd.audiokoz": {
    "source": "iana"
  },
  "audio/vnd.celp": {
    "source": "iana"
  },
  "audio/vnd.cisco.nse": {
    "source": "iana"
  },
  "audio/vnd.cmles.radio-events": {
    "source": "iana"
  },
  "audio/vnd.cns.anp1": {
    "source": "iana"
  },
  "audio/vnd.cns.inf1": {
    "source": "iana"
  },
  "audio/vnd.dece.audio": {
    "source": "iana",
    "extensions": ["uva","uvva"]
  },
  "audio/vnd.digital-winds": {
    "source": "iana",
    "extensions": ["eol"]
  },
  "audio/vnd.dlna.adts": {
    "source": "iana"
  },
  "audio/vnd.dolby.heaac.1": {
    "source": "iana"
  },
  "audio/vnd.dolby.heaac.2": {
    "source": "iana"
  },
  "audio/vnd.dolby.mlp": {
    "source": "iana"
  },
  "audio/vnd.dolby.mps": {
    "source": "iana"
  },
  "audio/vnd.dolby.pl2": {
    "source": "iana"
  },
  "audio/vnd.dolby.pl2x": {
    "source": "iana"
  },
  "audio/vnd.dolby.pl2z": {
    "source": "iana"
  },
  "audio/vnd.dolby.pulse.1": {
    "source": "iana"
  },
  "audio/vnd.dra": {
    "source": "iana",
    "extensions": ["dra"]
  },
  "audio/vnd.dts": {
    "source": "iana",
    "extensions": ["dts"]
  },
  "audio/vnd.dts.hd": {
    "source": "iana",
    "extensions": ["dtshd"]
  },
  "audio/vnd.dts.uhd": {
    "source": "iana"
  },
  "audio/vnd.dvb.file": {
    "source": "iana"
  },
  "audio/vnd.everad.plj": {
    "source": "iana"
  },
  "audio/vnd.hns.audio": {
    "source": "iana"
  },
  "audio/vnd.lucent.voice": {
    "source": "iana",
    "extensions": ["lvp"]
  },
  "audio/vnd.ms-playready.media.pya": {
    "source": "iana",
    "extensions": ["pya"]
  },
  "audio/vnd.nokia.mobile-xmf": {
    "source": "iana"
  },
  "audio/vnd.nortel.vbk": {
    "source": "iana"
  },
  "audio/vnd.nuera.ecelp4800": {
    "source": "iana",
    "extensions": ["ecelp4800"]
  },
  "audio/vnd.nuera.ecelp7470": {
    "source": "iana",
    "extensions": ["ecelp7470"]
  },
  "audio/vnd.nuera.ecelp9600": {
    "source": "iana",
    "extensions": ["ecelp9600"]
  },
  "audio/vnd.octel.sbc": {
    "source": "iana"
  },
  "audio/vnd.presonus.multitrack": {
    "source": "iana"
  },
  "audio/vnd.qcelp": {
    "source": "iana"
  },
  "audio/vnd.rhetorex.32kadpcm": {
    "source": "iana"
  },
  "audio/vnd.rip": {
    "source": "iana",
    "extensions": ["rip"]
  },
  "audio/vnd.rn-realaudio": {
    "compressible": false
  },
  "audio/vnd.sealedmedia.softseal.mpeg": {
    "source": "iana"
  },
  "audio/vnd.vmx.cvsd": {
    "source": "iana"
  },
  "audio/vnd.wave": {
    "compressible": false
  },
  "audio/vorbis": {
    "source": "iana",
    "compressible": false
  },
  "audio/vorbis-config": {
    "source": "iana"
  },
  "audio/wav": {
    "compressible": false,
    "extensions": ["wav"]
  },
  "audio/wave": {
    "compressible": false,
    "extensions": ["wav"]
  },
  "audio/webm": {
    "source": "apache",
    "compressible": false,
    "extensions": ["weba"]
  },
  "audio/x-aac": {
    "source": "apache",
    "compressible": false,
    "extensions": ["aac"]
  },
  "audio/x-aiff": {
    "source": "apache",
    "extensions": ["aif","aiff","aifc"]
  },
  "audio/x-caf": {
    "source": "apache",
    "compressible": false,
    "extensions": ["caf"]
  },
  "audio/x-flac": {
    "source": "apache",
    "extensions": ["flac"]
  },
  "audio/x-m4a": {
    "source": "nginx",
    "extensions": ["m4a"]
  },
  "audio/x-matroska": {
    "source": "apache",
    "extensions": ["mka"]
  },
  "audio/x-mpegurl": {
    "source": "apache",
    "extensions": ["m3u"]
  },
  "audio/x-ms-wax": {
    "source": "apache",
    "extensions": ["wax"]
  },
  "audio/x-ms-wma": {
    "source": "apache",
    "extensions": ["wma"]
  },
  "audio/x-pn-realaudio": {
    "source": "apache",
    "extensions": ["ram","ra"]
  },
  "audio/x-pn-realaudio-plugin": {
    "source": "apache",
    "extensions": ["rmp"]
  },
  "audio/x-realaudio": {
    "source": "nginx",
    "extensions": ["ra"]
  },
  "audio/x-tta": {
    "source": "apache"
  },
  "audio/x-wav": {
    "source": "apache",
    "extensions": ["wav"]
  },
  "audio/xm": {
    "source": "apache",
    "extensions": ["xm"]
  },
  "chemical/x-cdx": {
    "source": "apache",
    "extensions": ["cdx"]
  },
  "chemical/x-cif": {
    "source": "apache",
    "extensions": ["cif"]
  },
  "chemical/x-cmdf": {
    "source": "apache",
    "extensions": ["cmdf"]
  },
  "chemical/x-cml": {
    "source": "apache",
    "extensions": ["cml"]
  },
  "chemical/x-csml": {
    "source": "apache",
    "extensions": ["csml"]
  },
  "chemical/x-pdb": {
    "source": "apache"
  },
  "chemical/x-xyz": {
    "source": "apache",
    "extensions": ["xyz"]
  },
  "font/collection": {
    "source": "iana",
    "extensions": ["ttc"]
  },
  "font/otf": {
    "source": "iana",
    "compressible": true,
    "extensions": ["otf"]
  },
  "font/sfnt": {
    "source": "iana"
  },
  "font/ttf": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ttf"]
  },
  "font/woff": {
    "source": "iana",
    "extensions": ["woff"]
  },
  "font/woff2": {
    "source": "iana",
    "extensions": ["woff2"]
  },
  "image/aces": {
    "source": "iana",
    "extensions": ["exr"]
  },
  "image/apng": {
    "compressible": false,
    "extensions": ["apng"]
  },
  "image/avci": {
    "source": "iana"
  },
  "image/avcs": {
    "source": "iana"
  },
  "image/bmp": {
    "source": "iana",
    "compressible": true,
    "extensions": ["bmp"]
  },
  "image/cgm": {
    "source": "iana",
    "extensions": ["cgm"]
  },
  "image/dicom-rle": {
    "source": "iana",
    "extensions": ["drle"]
  },
  "image/emf": {
    "source": "iana",
    "extensions": ["emf"]
  },
  "image/fits": {
    "source": "iana",
    "extensions": ["fits"]
  },
  "image/g3fax": {
    "source": "iana",
    "extensions": ["g3"]
  },
  "image/gif": {
    "source": "iana",
    "compressible": false,
    "extensions": ["gif"]
  },
  "image/heic": {
    "source": "iana",
    "extensions": ["heic"]
  },
  "image/heic-sequence": {
    "source": "iana",
    "extensions": ["heics"]
  },
  "image/heif": {
    "source": "iana",
    "extensions": ["heif"]
  },
  "image/heif-sequence": {
    "source": "iana",
    "extensions": ["heifs"]
  },
  "image/hej2k": {
    "source": "iana",
    "extensions": ["hej2"]
  },
  "image/hsj2": {
    "source": "iana",
    "extensions": ["hsj2"]
  },
  "image/ief": {
    "source": "iana",
    "extensions": ["ief"]
  },
  "image/jls": {
    "source": "iana",
    "extensions": ["jls"]
  },
  "image/jp2": {
    "source": "iana",
    "compressible": false,
    "extensions": ["jp2","jpg2"]
  },
  "image/jpeg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["jpeg","jpg","jpe"]
  },
  "image/jph": {
    "source": "iana",
    "extensions": ["jph"]
  },
  "image/jphc": {
    "source": "iana",
    "extensions": ["jhc"]
  },
  "image/jpm": {
    "source": "iana",
    "compressible": false,
    "extensions": ["jpm"]
  },
  "image/jpx": {
    "source": "iana",
    "compressible": false,
    "extensions": ["jpx","jpf"]
  },
  "image/jxr": {
    "source": "iana",
    "extensions": ["jxr"]
  },
  "image/jxra": {
    "source": "iana",
    "extensions": ["jxra"]
  },
  "image/jxrs": {
    "source": "iana",
    "extensions": ["jxrs"]
  },
  "image/jxs": {
    "source": "iana",
    "extensions": ["jxs"]
  },
  "image/jxsc": {
    "source": "iana",
    "extensions": ["jxsc"]
  },
  "image/jxsi": {
    "source": "iana",
    "extensions": ["jxsi"]
  },
  "image/jxss": {
    "source": "iana",
    "extensions": ["jxss"]
  },
  "image/ktx": {
    "source": "iana",
    "extensions": ["ktx"]
  },
  "image/naplps": {
    "source": "iana"
  },
  "image/pjpeg": {
    "compressible": false
  },
  "image/png": {
    "source": "iana",
    "compressible": false,
    "extensions": ["png"]
  },
  "image/prs.btif": {
    "source": "iana",
    "extensions": ["btif"]
  },
  "image/prs.pti": {
    "source": "iana",
    "extensions": ["pti"]
  },
  "image/pwg-raster": {
    "source": "iana"
  },
  "image/sgi": {
    "source": "apache",
    "extensions": ["sgi"]
  },
  "image/svg+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["svg","svgz"]
  },
  "image/t38": {
    "source": "iana",
    "extensions": ["t38"]
  },
  "image/tiff": {
    "source": "iana",
    "compressible": false,
    "extensions": ["tif","tiff"]
  },
  "image/tiff-fx": {
    "source": "iana",
    "extensions": ["tfx"]
  },
  "image/vnd.adobe.photoshop": {
    "source": "iana",
    "compressible": true,
    "extensions": ["psd"]
  },
  "image/vnd.airzip.accelerator.azv": {
    "source": "iana",
    "extensions": ["azv"]
  },
  "image/vnd.cns.inf2": {
    "source": "iana"
  },
  "image/vnd.dece.graphic": {
    "source": "iana",
    "extensions": ["uvi","uvvi","uvg","uvvg"]
  },
  "image/vnd.djvu": {
    "source": "iana",
    "extensions": ["djvu","djv"]
  },
  "image/vnd.dvb.subtitle": {
    "source": "iana",
    "extensions": ["sub"]
  },
  "image/vnd.dwg": {
    "source": "iana",
    "extensions": ["dwg"]
  },
  "image/vnd.dxf": {
    "source": "iana",
    "extensions": ["dxf"]
  },
  "image/vnd.fastbidsheet": {
    "source": "iana",
    "extensions": ["fbs"]
  },
  "image/vnd.fpx": {
    "source": "iana",
    "extensions": ["fpx"]
  },
  "image/vnd.fst": {
    "source": "iana",
    "extensions": ["fst"]
  },
  "image/vnd.fujixerox.edmics-mmr": {
    "source": "iana",
    "extensions": ["mmr"]
  },
  "image/vnd.fujixerox.edmics-rlc": {
    "source": "iana",
    "extensions": ["rlc"]
  },
  "image/vnd.globalgraphics.pgb": {
    "source": "iana"
  },
  "image/vnd.microsoft.icon": {
    "source": "iana",
    "extensions": ["ico"]
  },
  "image/vnd.mix": {
    "source": "iana"
  },
  "image/vnd.mozilla.apng": {
    "source": "iana"
  },
  "image/vnd.ms-dds": {
    "extensions": ["dds"]
  },
  "image/vnd.ms-modi": {
    "source": "iana",
    "extensions": ["mdi"]
  },
  "image/vnd.ms-photo": {
    "source": "apache",
    "extensions": ["wdp"]
  },
  "image/vnd.net-fpx": {
    "source": "iana",
    "extensions": ["npx"]
  },
  "image/vnd.radiance": {
    "source": "iana"
  },
  "image/vnd.sealed.png": {
    "source": "iana"
  },
  "image/vnd.sealedmedia.softseal.gif": {
    "source": "iana"
  },
  "image/vnd.sealedmedia.softseal.jpg": {
    "source": "iana"
  },
  "image/vnd.svf": {
    "source": "iana"
  },
  "image/vnd.tencent.tap": {
    "source": "iana",
    "extensions": ["tap"]
  },
  "image/vnd.valve.source.texture": {
    "source": "iana",
    "extensions": ["vtf"]
  },
  "image/vnd.wap.wbmp": {
    "source": "iana",
    "extensions": ["wbmp"]
  },
  "image/vnd.xiff": {
    "source": "iana",
    "extensions": ["xif"]
  },
  "image/vnd.zbrush.pcx": {
    "source": "iana",
    "extensions": ["pcx"]
  },
  "image/webp": {
    "source": "apache",
    "extensions": ["webp"]
  },
  "image/wmf": {
    "source": "iana",
    "extensions": ["wmf"]
  },
  "image/x-3ds": {
    "source": "apache",
    "extensions": ["3ds"]
  },
  "image/x-cmu-raster": {
    "source": "apache",
    "extensions": ["ras"]
  },
  "image/x-cmx": {
    "source": "apache",
    "extensions": ["cmx"]
  },
  "image/x-freehand": {
    "source": "apache",
    "extensions": ["fh","fhc","fh4","fh5","fh7"]
  },
  "image/x-icon": {
    "source": "apache",
    "compressible": true,
    "extensions": ["ico"]
  },
  "image/x-jng": {
    "source": "nginx",
    "extensions": ["jng"]
  },
  "image/x-mrsid-image": {
    "source": "apache",
    "extensions": ["sid"]
  },
  "image/x-ms-bmp": {
    "source": "nginx",
    "compressible": true,
    "extensions": ["bmp"]
  },
  "image/x-pcx": {
    "source": "apache",
    "extensions": ["pcx"]
  },
  "image/x-pict": {
    "source": "apache",
    "extensions": ["pic","pct"]
  },
  "image/x-portable-anymap": {
    "source": "apache",
    "extensions": ["pnm"]
  },
  "image/x-portable-bitmap": {
    "source": "apache",
    "extensions": ["pbm"]
  },
  "image/x-portable-graymap": {
    "source": "apache",
    "extensions": ["pgm"]
  },
  "image/x-portable-pixmap": {
    "source": "apache",
    "extensions": ["ppm"]
  },
  "image/x-rgb": {
    "source": "apache",
    "extensions": ["rgb"]
  },
  "image/x-tga": {
    "source": "apache",
    "extensions": ["tga"]
  },
  "image/x-xbitmap": {
    "source": "apache",
    "extensions": ["xbm"]
  },
  "image/x-xcf": {
    "compressible": false
  },
  "image/x-xpixmap": {
    "source": "apache",
    "extensions": ["xpm"]
  },
  "image/x-xwindowdump": {
    "source": "apache",
    "extensions": ["xwd"]
  },
  "message/cpim": {
    "source": "iana"
  },
  "message/delivery-status": {
    "source": "iana"
  },
  "message/disposition-notification": {
    "source": "iana",
    "extensions": [
      "disposition-notification"
    ]
  },
  "message/external-body": {
    "source": "iana"
  },
  "message/feedback-report": {
    "source": "iana"
  },
  "message/global": {
    "source": "iana",
    "extensions": ["u8msg"]
  },
  "message/global-delivery-status": {
    "source": "iana",
    "extensions": ["u8dsn"]
  },
  "message/global-disposition-notification": {
    "source": "iana",
    "extensions": ["u8mdn"]
  },
  "message/global-headers": {
    "source": "iana",
    "extensions": ["u8hdr"]
  },
  "message/http": {
    "source": "iana",
    "compressible": false
  },
  "message/imdn+xml": {
    "source": "iana",
    "compressible": true
  },
  "message/news": {
    "source": "iana"
  },
  "message/partial": {
    "source": "iana",
    "compressible": false
  },
  "message/rfc822": {
    "source": "iana",
    "compressible": true,
    "extensions": ["eml","mime"]
  },
  "message/s-http": {
    "source": "iana"
  },
  "message/sip": {
    "source": "iana"
  },
  "message/sipfrag": {
    "source": "iana"
  },
  "message/tracking-status": {
    "source": "iana"
  },
  "message/vnd.si.simp": {
    "source": "iana"
  },
  "message/vnd.wfa.wsc": {
    "source": "iana",
    "extensions": ["wsc"]
  },
  "model/3mf": {
    "source": "iana",
    "extensions": ["3mf"]
  },
  "model/gltf+json": {
    "source": "iana",
    "compressible": true,
    "extensions": ["gltf"]
  },
  "model/gltf-binary": {
    "source": "iana",
    "compressible": true,
    "extensions": ["glb"]
  },
  "model/iges": {
    "source": "iana",
    "compressible": false,
    "extensions": ["igs","iges"]
  },
  "model/mesh": {
    "source": "iana",
    "compressible": false,
    "extensions": ["msh","mesh","silo"]
  },
  "model/mtl": {
    "source": "iana",
    "extensions": ["mtl"]
  },
  "model/obj": {
    "source": "iana",
    "extensions": ["obj"]
  },
  "model/stl": {
    "source": "iana",
    "extensions": ["stl"]
  },
  "model/vnd.collada+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dae"]
  },
  "model/vnd.dwf": {
    "source": "iana",
    "extensions": ["dwf"]
  },
  "model/vnd.flatland.3dml": {
    "source": "iana"
  },
  "model/vnd.gdl": {
    "source": "iana",
    "extensions": ["gdl"]
  },
  "model/vnd.gs-gdl": {
    "source": "apache"
  },
  "model/vnd.gs.gdl": {
    "source": "iana"
  },
  "model/vnd.gtw": {
    "source": "iana",
    "extensions": ["gtw"]
  },
  "model/vnd.moml+xml": {
    "source": "iana",
    "compressible": true
  },
  "model/vnd.mts": {
    "source": "iana",
    "extensions": ["mts"]
  },
  "model/vnd.opengex": {
    "source": "iana",
    "extensions": ["ogex"]
  },
  "model/vnd.parasolid.transmit.binary": {
    "source": "iana",
    "extensions": ["x_b"]
  },
  "model/vnd.parasolid.transmit.text": {
    "source": "iana",
    "extensions": ["x_t"]
  },
  "model/vnd.rosette.annotated-data-model": {
    "source": "iana"
  },
  "model/vnd.usdz+zip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["usdz"]
  },
  "model/vnd.valve.source.compiled-map": {
    "source": "iana",
    "extensions": ["bsp"]
  },
  "model/vnd.vtu": {
    "source": "iana",
    "extensions": ["vtu"]
  },
  "model/vrml": {
    "source": "iana",
    "compressible": false,
    "extensions": ["wrl","vrml"]
  },
  "model/x3d+binary": {
    "source": "apache",
    "compressible": false,
    "extensions": ["x3db","x3dbz"]
  },
  "model/x3d+fastinfoset": {
    "source": "iana",
    "extensions": ["x3db"]
  },
  "model/x3d+vrml": {
    "source": "apache",
    "compressible": false,
    "extensions": ["x3dv","x3dvz"]
  },
  "model/x3d+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["x3d","x3dz"]
  },
  "model/x3d-vrml": {
    "source": "iana",
    "extensions": ["x3dv"]
  },
  "multipart/alternative": {
    "source": "iana",
    "compressible": false
  },
  "multipart/appledouble": {
    "source": "iana"
  },
  "multipart/byteranges": {
    "source": "iana"
  },
  "multipart/digest": {
    "source": "iana"
  },
  "multipart/encrypted": {
    "source": "iana",
    "compressible": false
  },
  "multipart/form-data": {
    "source": "iana",
    "compressible": false
  },
  "multipart/header-set": {
    "source": "iana"
  },
  "multipart/mixed": {
    "source": "iana"
  },
  "multipart/multilingual": {
    "source": "iana"
  },
  "multipart/parallel": {
    "source": "iana"
  },
  "multipart/related": {
    "source": "iana",
    "compressible": false
  },
  "multipart/report": {
    "source": "iana"
  },
  "multipart/signed": {
    "source": "iana",
    "compressible": false
  },
  "multipart/vnd.bint.med-plus": {
    "source": "iana"
  },
  "multipart/voice-message": {
    "source": "iana"
  },
  "multipart/x-mixed-replace": {
    "source": "iana"
  },
  "text/1d-interleaved-parityfec": {
    "source": "iana"
  },
  "text/cache-manifest": {
    "source": "iana",
    "compressible": true,
    "extensions": ["appcache","manifest"]
  },
  "text/calendar": {
    "source": "iana",
    "extensions": ["ics","ifb"]
  },
  "text/calender": {
    "compressible": true
  },
  "text/cmd": {
    "compressible": true
  },
  "text/coffeescript": {
    "extensions": ["coffee","litcoffee"]
  },
  "text/css": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["css"]
  },
  "text/csv": {
    "source": "iana",
    "compressible": true,
    "extensions": ["csv"]
  },
  "text/csv-schema": {
    "source": "iana"
  },
  "text/directory": {
    "source": "iana"
  },
  "text/dns": {
    "source": "iana"
  },
  "text/ecmascript": {
    "source": "iana"
  },
  "text/encaprtp": {
    "source": "iana"
  },
  "text/enriched": {
    "source": "iana"
  },
  "text/flexfec": {
    "source": "iana"
  },
  "text/fwdred": {
    "source": "iana"
  },
  "text/grammar-ref-list": {
    "source": "iana"
  },
  "text/html": {
    "source": "iana",
    "compressible": true,
    "extensions": ["html","htm","shtml"]
  },
  "text/jade": {
    "extensions": ["jade"]
  },
  "text/javascript": {
    "source": "iana",
    "compressible": true
  },
  "text/jcr-cnd": {
    "source": "iana"
  },
  "text/jsx": {
    "compressible": true,
    "extensions": ["jsx"]
  },
  "text/less": {
    "compressible": true,
    "extensions": ["less"]
  },
  "text/markdown": {
    "source": "iana",
    "compressible": true,
    "extensions": ["markdown","md"]
  },
  "text/mathml": {
    "source": "nginx",
    "extensions": ["mml"]
  },
  "text/mdx": {
    "compressible": true,
    "extensions": ["mdx"]
  },
  "text/mizar": {
    "source": "iana"
  },
  "text/n3": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["n3"]
  },
  "text/parameters": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/parityfec": {
    "source": "iana"
  },
  "text/plain": {
    "source": "iana",
    "compressible": true,
    "extensions": ["txt","text","conf","def","list","log","in","ini"]
  },
  "text/provenance-notation": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/prs.fallenstein.rst": {
    "source": "iana"
  },
  "text/prs.lines.tag": {
    "source": "iana",
    "extensions": ["dsc"]
  },
  "text/prs.prop.logic": {
    "source": "iana"
  },
  "text/raptorfec": {
    "source": "iana"
  },
  "text/red": {
    "source": "iana"
  },
  "text/rfc822-headers": {
    "source": "iana"
  },
  "text/richtext": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rtx"]
  },
  "text/rtf": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rtf"]
  },
  "text/rtp-enc-aescm128": {
    "source": "iana"
  },
  "text/rtploopback": {
    "source": "iana"
  },
  "text/rtx": {
    "source": "iana"
  },
  "text/sgml": {
    "source": "iana",
    "extensions": ["sgml","sgm"]
  },
  "text/shex": {
    "extensions": ["shex"]
  },
  "text/slim": {
    "extensions": ["slim","slm"]
  },
  "text/strings": {
    "source": "iana"
  },
  "text/stylus": {
    "extensions": ["stylus","styl"]
  },
  "text/t140": {
    "source": "iana"
  },
  "text/tab-separated-values": {
    "source": "iana",
    "compressible": true,
    "extensions": ["tsv"]
  },
  "text/troff": {
    "source": "iana",
    "extensions": ["t","tr","roff","man","me","ms"]
  },
  "text/turtle": {
    "source": "iana",
    "charset": "UTF-8",
    "extensions": ["ttl"]
  },
  "text/ulpfec": {
    "source": "iana"
  },
  "text/uri-list": {
    "source": "iana",
    "compressible": true,
    "extensions": ["uri","uris","urls"]
  },
  "text/vcard": {
    "source": "iana",
    "compressible": true,
    "extensions": ["vcard"]
  },
  "text/vnd.a": {
    "source": "iana"
  },
  "text/vnd.abc": {
    "source": "iana"
  },
  "text/vnd.ascii-art": {
    "source": "iana"
  },
  "text/vnd.curl": {
    "source": "iana",
    "extensions": ["curl"]
  },
  "text/vnd.curl.dcurl": {
    "source": "apache",
    "extensions": ["dcurl"]
  },
  "text/vnd.curl.mcurl": {
    "source": "apache",
    "extensions": ["mcurl"]
  },
  "text/vnd.curl.scurl": {
    "source": "apache",
    "extensions": ["scurl"]
  },
  "text/vnd.debian.copyright": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/vnd.dmclientscript": {
    "source": "iana"
  },
  "text/vnd.dvb.subtitle": {
    "source": "iana",
    "extensions": ["sub"]
  },
  "text/vnd.esmertec.theme-descriptor": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/vnd.ficlab.flt": {
    "source": "iana"
  },
  "text/vnd.fly": {
    "source": "iana",
    "extensions": ["fly"]
  },
  "text/vnd.fmi.flexstor": {
    "source": "iana",
    "extensions": ["flx"]
  },
  "text/vnd.gml": {
    "source": "iana"
  },
  "text/vnd.graphviz": {
    "source": "iana",
    "extensions": ["gv"]
  },
  "text/vnd.hgl": {
    "source": "iana"
  },
  "text/vnd.in3d.3dml": {
    "source": "iana",
    "extensions": ["3dml"]
  },
  "text/vnd.in3d.spot": {
    "source": "iana",
    "extensions": ["spot"]
  },
  "text/vnd.iptc.newsml": {
    "source": "iana"
  },
  "text/vnd.iptc.nitf": {
    "source": "iana"
  },
  "text/vnd.latex-z": {
    "source": "iana"
  },
  "text/vnd.motorola.reflex": {
    "source": "iana"
  },
  "text/vnd.ms-mediapackage": {
    "source": "iana"
  },
  "text/vnd.net2phone.commcenter.command": {
    "source": "iana"
  },
  "text/vnd.radisys.msml-basic-layout": {
    "source": "iana"
  },
  "text/vnd.senx.warpscript": {
    "source": "iana"
  },
  "text/vnd.si.uricatalogue": {
    "source": "iana"
  },
  "text/vnd.sosi": {
    "source": "iana"
  },
  "text/vnd.sun.j2me.app-descriptor": {
    "source": "iana",
    "charset": "UTF-8",
    "extensions": ["jad"]
  },
  "text/vnd.trolltech.linguist": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/vnd.wap.si": {
    "source": "iana"
  },
  "text/vnd.wap.sl": {
    "source": "iana"
  },
  "text/vnd.wap.wml": {
    "source": "iana",
    "extensions": ["wml"]
  },
  "text/vnd.wap.wmlscript": {
    "source": "iana",
    "extensions": ["wmls"]
  },
  "text/vtt": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["vtt"]
  },
  "text/x-asm": {
    "source": "apache",
    "extensions": ["s","asm"]
  },
  "text/x-c": {
    "source": "apache",
    "extensions": ["c","cc","cxx","cpp","h","hh","dic"]
  },
  "text/x-component": {
    "source": "nginx",
    "extensions": ["htc"]
  },
  "text/x-fortran": {
    "source": "apache",
    "extensions": ["f","for","f77","f90"]
  },
  "text/x-gwt-rpc": {
    "compressible": true
  },
  "text/x-handlebars-template": {
    "extensions": ["hbs"]
  },
  "text/x-java-source": {
    "source": "apache",
    "extensions": ["java"]
  },
  "text/x-jquery-tmpl": {
    "compressible": true
  },
  "text/x-lua": {
    "extensions": ["lua"]
  },
  "text/x-markdown": {
    "compressible": true,
    "extensions": ["mkd"]
  },
  "text/x-nfo": {
    "source": "apache",
    "extensions": ["nfo"]
  },
  "text/x-opml": {
    "source": "apache",
    "extensions": ["opml"]
  },
  "text/x-org": {
    "compressible": true,
    "extensions": ["org"]
  },
  "text/x-pascal": {
    "source": "apache",
    "extensions": ["p","pas"]
  },
  "text/x-processing": {
    "compressible": true,
    "extensions": ["pde"]
  },
  "text/x-sass": {
    "extensions": ["sass"]
  },
  "text/x-scss": {
    "extensions": ["scss"]
  },
  "text/x-setext": {
    "source": "apache",
    "extensions": ["etx"]
  },
  "text/x-sfv": {
    "source": "apache",
    "extensions": ["sfv"]
  },
  "text/x-suse-ymp": {
    "compressible": true,
    "extensions": ["ymp"]
  },
  "text/x-uuencode": {
    "source": "apache",
    "extensions": ["uu"]
  },
  "text/x-vcalendar": {
    "source": "apache",
    "extensions": ["vcs"]
  },
  "text/x-vcard": {
    "source": "apache",
    "extensions": ["vcf"]
  },
  "text/xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xml"]
  },
  "text/xml-external-parsed-entity": {
    "source": "iana"
  },
  "text/yaml": {
    "extensions": ["yaml","yml"]
  },
  "video/1d-interleaved-parityfec": {
    "source": "iana"
  },
  "video/3gpp": {
    "source": "iana",
    "extensions": ["3gp","3gpp"]
  },
  "video/3gpp-tt": {
    "source": "iana"
  },
  "video/3gpp2": {
    "source": "iana",
    "extensions": ["3g2"]
  },
  "video/bmpeg": {
    "source": "iana"
  },
  "video/bt656": {
    "source": "iana"
  },
  "video/celb": {
    "source": "iana"
  },
  "video/dv": {
    "source": "iana"
  },
  "video/encaprtp": {
    "source": "iana"
  },
  "video/flexfec": {
    "source": "iana"
  },
  "video/h261": {
    "source": "iana",
    "extensions": ["h261"]
  },
  "video/h263": {
    "source": "iana",
    "extensions": ["h263"]
  },
  "video/h263-1998": {
    "source": "iana"
  },
  "video/h263-2000": {
    "source": "iana"
  },
  "video/h264": {
    "source": "iana",
    "extensions": ["h264"]
  },
  "video/h264-rcdo": {
    "source": "iana"
  },
  "video/h264-svc": {
    "source": "iana"
  },
  "video/h265": {
    "source": "iana"
  },
  "video/iso.segment": {
    "source": "iana"
  },
  "video/jpeg": {
    "source": "iana",
    "extensions": ["jpgv"]
  },
  "video/jpeg2000": {
    "source": "iana"
  },
  "video/jpm": {
    "source": "apache",
    "extensions": ["jpm","jpgm"]
  },
  "video/mj2": {
    "source": "iana",
    "extensions": ["mj2","mjp2"]
  },
  "video/mp1s": {
    "source": "iana"
  },
  "video/mp2p": {
    "source": "iana"
  },
  "video/mp2t": {
    "source": "iana",
    "extensions": ["ts"]
  },
  "video/mp4": {
    "source": "iana",
    "compressible": false,
    "extensions": ["mp4","mp4v","mpg4"]
  },
  "video/mp4v-es": {
    "source": "iana"
  },
  "video/mpeg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["mpeg","mpg","mpe","m1v","m2v"]
  },
  "video/mpeg4-generic": {
    "source": "iana"
  },
  "video/mpv": {
    "source": "iana"
  },
  "video/nv": {
    "source": "iana"
  },
  "video/ogg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["ogv"]
  },
  "video/parityfec": {
    "source": "iana"
  },
  "video/pointer": {
    "source": "iana"
  },
  "video/quicktime": {
    "source": "iana",
    "compressible": false,
    "extensions": ["qt","mov"]
  },
  "video/raptorfec": {
    "source": "iana"
  },
  "video/raw": {
    "source": "iana"
  },
  "video/rtp-enc-aescm128": {
    "source": "iana"
  },
  "video/rtploopback": {
    "source": "iana"
  },
  "video/rtx": {
    "source": "iana"
  },
  "video/smpte291": {
    "source": "iana"
  },
  "video/smpte292m": {
    "source": "iana"
  },
  "video/ulpfec": {
    "source": "iana"
  },
  "video/vc1": {
    "source": "iana"
  },
  "video/vc2": {
    "source": "iana"
  },
  "video/vnd.cctv": {
    "source": "iana"
  },
  "video/vnd.dece.hd": {
    "source": "iana",
    "extensions": ["uvh","uvvh"]
  },
  "video/vnd.dece.mobile": {
    "source": "iana",
    "extensions": ["uvm","uvvm"]
  },
  "video/vnd.dece.mp4": {
    "source": "iana"
  },
  "video/vnd.dece.pd": {
    "source": "iana",
    "extensions": ["uvp","uvvp"]
  },
  "video/vnd.dece.sd": {
    "source": "iana",
    "extensions": ["uvs","uvvs"]
  },
  "video/vnd.dece.video": {
    "source": "iana",
    "extensions": ["uvv","uvvv"]
  },
  "video/vnd.directv.mpeg": {
    "source": "iana"
  },
  "video/vnd.directv.mpeg-tts": {
    "source": "iana"
  },
  "video/vnd.dlna.mpeg-tts": {
    "source": "iana"
  },
  "video/vnd.dvb.file": {
    "source": "iana",
    "extensions": ["dvb"]
  },
  "video/vnd.fvt": {
    "source": "iana",
    "extensions": ["fvt"]
  },
  "video/vnd.hns.video": {
    "source": "iana"
  },
  "video/vnd.iptvforum.1dparityfec-1010": {
    "source": "iana"
  },
  "video/vnd.iptvforum.1dparityfec-2005": {
    "source": "iana"
  },
  "video/vnd.iptvforum.2dparityfec-1010": {
    "source": "iana"
  },
  "video/vnd.iptvforum.2dparityfec-2005": {
    "source": "iana"
  },
  "video/vnd.iptvforum.ttsavc": {
    "source": "iana"
  },
  "video/vnd.iptvforum.ttsmpeg2": {
    "source": "iana"
  },
  "video/vnd.motorola.video": {
    "source": "iana"
  },
  "video/vnd.motorola.videop": {
    "source": "iana"
  },
  "video/vnd.mpegurl": {
    "source": "iana",
    "extensions": ["mxu","m4u"]
  },
  "video/vnd.ms-playready.media.pyv": {
    "source": "iana",
    "extensions": ["pyv"]
  },
  "video/vnd.nokia.interleaved-multimedia": {
    "source": "iana"
  },
  "video/vnd.nokia.mp4vr": {
    "source": "iana"
  },
  "video/vnd.nokia.videovoip": {
    "source": "iana"
  },
  "video/vnd.objectvideo": {
    "source": "iana"
  },
  "video/vnd.radgamettools.bink": {
    "source": "iana"
  },
  "video/vnd.radgamettools.smacker": {
    "source": "iana"
  },
  "video/vnd.sealed.mpeg1": {
    "source": "iana"
  },
  "video/vnd.sealed.mpeg4": {
    "source": "iana"
  },
  "video/vnd.sealed.swf": {
    "source": "iana"
  },
  "video/vnd.sealedmedia.softseal.mov": {
    "source": "iana"
  },
  "video/vnd.uvvu.mp4": {
    "source": "iana",
    "extensions": ["uvu","uvvu"]
  },
  "video/vnd.vivo": {
    "source": "iana",
    "extensions": ["viv"]
  },
  "video/vnd.youtube.yt": {
    "source": "iana"
  },
  "video/vp8": {
    "source": "iana"
  },
  "video/webm": {
    "source": "apache",
    "compressible": false,
    "extensions": ["webm"]
  },
  "video/x-f4v": {
    "source": "apache",
    "extensions": ["f4v"]
  },
  "video/x-fli": {
    "source": "apache",
    "extensions": ["fli"]
  },
  "video/x-flv": {
    "source": "apache",
    "compressible": false,
    "extensions": ["flv"]
  },
  "video/x-m4v": {
    "source": "apache",
    "extensions": ["m4v"]
  },
  "video/x-matroska": {
    "source": "apache",
    "compressible": false,
    "extensions": ["mkv","mk3d","mks"]
  },
  "video/x-mng": {
    "source": "apache",
    "extensions": ["mng"]
  },
  "video/x-ms-asf": {
    "source": "apache",
    "extensions": ["asf","asx"]
  },
  "video/x-ms-vob": {
    "source": "apache",
    "extensions": ["vob"]
  },
  "video/x-ms-wm": {
    "source": "apache",
    "extensions": ["wm"]
  },
  "video/x-ms-wmv": {
    "source": "apache",
    "compressible": false,
    "extensions": ["wmv"]
  },
  "video/x-ms-wmx": {
    "source": "apache",
    "extensions": ["wmx"]
  },
  "video/x-ms-wvx": {
    "source": "apache",
    "extensions": ["wvx"]
  },
  "video/x-msvideo": {
    "source": "apache",
    "extensions": ["avi"]
  },
  "video/x-sgi-movie": {
    "source": "apache",
    "extensions": ["movie"]
  },
  "video/x-smv": {
    "source": "apache",
    "extensions": ["smv"]
  },
  "x-conference/x-cooltalk": {
    "source": "apache",
    "extensions": ["ice"]
  },
  "x-shader/x-fragment": {
    "compressible": true
  },
  "x-shader/x-vertex": {
    "compressible": true
  }
}
/*!
 * mime-db
 * Copyright(c) 2014 Jonathan Ong
 * MIT Licensed
 */

/**
 * Module exports.
 */

module.exports = require('./db.json')
{
  "deprecated": false,
  "description": "Media Type Database",
  "devDependencies": {
    "bluebird": "3.7.2",
    "co": "4.6.0",
    "cogent": "1.0.1",
    "csv-parse": "4.8.9",
    "eslint": "6.8.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.20.2",
    "eslint-plugin-markdown": "1.0.2",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "4.2.1",
    "eslint-plugin-standard": "4.0.1",
    "gnode": "0.1.2",
    "mocha": "7.1.1",
    "nyc": "15.0.1",
    "raw-body": "2.4.1",
    "stream-to-array": "2.3.0"
  },
  "engines": {
    "node": ">= 0.6"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "README.md",
    "db.json",
    "index.js"
  ],
  "homepage": "https://github.com/jshttp/mime-db#readme",
  "license": "MIT",
  "name": "mime-db",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jshttp/mime-db.git"
  },
  "version": "1.44.0"
}2.1.27 / 2020-04-23
===================

  * deps: mime-db@1.44.0
    - Add charsets from IANA
    - Add extension `.cjs` to `application/node`
    - Add new upstream MIME types

2.1.26 / 2020-01-05
===================

  * deps: mime-db@1.43.0
    - Add `application/x-keepass2` with extension `.kdbx`
    - Add extension `.mxmf` to `audio/mobile-xmf`
    - Add extensions from IANA for `application/*+xml` types
    - Add new upstream MIME types

2.1.25 / 2019-11-12
===================

  * deps: mime-db@1.42.0
    - Add new upstream MIME types
    - Add `application/toml` with extension `.toml`
    - Add `image/vnd.ms-dds` with extension `.dds`

2.1.24 / 2019-04-20
===================

  * deps: mime-db@1.40.0
    - Add extensions from IANA for `model/*` types
    - Add `text/mdx` with extension `.mdx`

2.1.23 / 2019-04-17
===================

  * deps: mime-db@~1.39.0
    - Add extensions `.siv` and `.sieve` to `application/sieve`
    - Add new upstream MIME types

2.1.22 / 2019-02-14
===================

  * deps: mime-db@~1.38.0
    - Add extension `.nq` to `application/n-quads`
    - Add extension `.nt` to `application/n-triples`
    - Add new upstream MIME types
    - Mark `text/less` as compressible

2.1.21 / 2018-10-19
===================

  * deps: mime-db@~1.37.0
    - Add extensions to HEIC image types
    - Add new upstream MIME types

2.1.20 / 2018-08-26
===================

  * deps: mime-db@~1.36.0
    - Add Apple file extensions from IANA
    - Add extensions from IANA for `image/*` types
    - Add new upstream MIME types

2.1.19 / 2018-07-17
===================

  * deps: mime-db@~1.35.0
    - Add extension `.csl` to `application/vnd.citationstyles.style+xml`
    - Add extension `.es` to `application/ecmascript`
    - Add extension `.owl` to `application/rdf+xml`
    - Add new upstream MIME types
    - Add UTF-8 as default charset for `text/turtle`

2.1.18 / 2018-02-16
===================

  * deps: mime-db@~1.33.0
    - Add `application/raml+yaml` with extension `.raml`
    - Add `application/wasm` with extension `.wasm`
    - Add `text/shex` with extension `.shex`
    - Add extensions for JPEG-2000 images
    - Add extensions from IANA for `message/*` types
    - Add new upstream MIME types
    - Update font MIME types
    - Update `text/hjson` to registered `application/hjson`

2.1.17 / 2017-09-01
===================

  * deps: mime-db@~1.30.0
    - Add `application/vnd.ms-outlook`
    - Add `application/x-arj`
    - Add extension `.mjs` to `application/javascript`
    - Add glTF types and extensions
    - Add new upstream MIME types
    - Add `text/x-org`
    - Add VirtualBox MIME types
    - Fix `source` records for `video/*` types that are IANA
    - Update `font/opentype` to registered `font/otf`

2.1.16 / 2017-07-24
===================

  * deps: mime-db@~1.29.0
    - Add `application/fido.trusted-apps+json`
    - Add extension `.wadl` to `application/vnd.sun.wadl+xml`
    - Add extension `.gz` to `application/gzip`
    - Add new upstream MIME types
    - Update extensions `.md` and `.markdown` to be `text/markdown`

2.1.15 / 2017-03-23
===================

  * deps: mime-db@~1.27.0
    - Add new mime types
    - Add `image/apng`

2.1.14 / 2017-01-14
===================

  * deps: mime-db@~1.26.0
    - Add new mime types

2.1.13 / 2016-11-18
===================

  * deps: mime-db@~1.25.0
    - Add new mime types

2.1.12 / 2016-09-18
===================

  * deps: mime-db@~1.24.0
    - Add new mime types
    - Add `audio/mp3`

2.1.11 / 2016-05-01
===================

  * deps: mime-db@~1.23.0
    - Add new mime types

2.1.10 / 2016-02-15
===================

  * deps: mime-db@~1.22.0
    - Add new mime types
    - Fix extension of `application/dash+xml`
    - Update primary extension for `audio/mp4`

2.1.9 / 2016-01-06
==================

  * deps: mime-db@~1.21.0
    - Add new mime types

2.1.8 / 2015-11-30
==================

  * deps: mime-db@~1.20.0
    - Add new mime types

2.1.7 / 2015-09-20
==================

  * deps: mime-db@~1.19.0
    - Add new mime types

2.1.6 / 2015-09-03
==================

  * deps: mime-db@~1.18.0
    - Add new mime types

2.1.5 / 2015-08-20
==================

  * deps: mime-db@~1.17.0
    - Add new mime types

2.1.4 / 2015-07-30
==================

  * deps: mime-db@~1.16.0
    - Add new mime types

2.1.3 / 2015-07-13
==================

  * deps: mime-db@~1.15.0
    - Add new mime types

2.1.2 / 2015-06-25
==================

  * deps: mime-db@~1.14.0
    - Add new mime types

2.1.1 / 2015-06-08
==================

  * perf: fix deopt during mapping

2.1.0 / 2015-06-07
==================

  * Fix incorrectly treating extension-less file name as extension
    - i.e. `'path/to/json'` will no longer return `application/json`
  * Fix `.charset(type)` to accept parameters
  * Fix `.charset(type)` to match case-insensitive
  * Improve generation of extension to MIME mapping
  * Refactor internals for readability and no argument reassignment
  * Prefer `application/*` MIME types from the same source
  * Prefer any type over `application/octet-stream`
  * deps: mime-db@~1.13.0
    - Add nginx as a source
    - Add new mime types

2.0.14 / 2015-06-06
===================

  * deps: mime-db@~1.12.0
    - Add new mime types

2.0.13 / 2015-05-31
===================

  * deps: mime-db@~1.11.0
    - Add new mime types

2.0.12 / 2015-05-19
===================

  * deps: mime-db@~1.10.0
    - Add new mime types

2.0.11 / 2015-05-05
===================

  * deps: mime-db@~1.9.1
    - Add new mime types

2.0.10 / 2015-03-13
===================

  * deps: mime-db@~1.8.0
    - Add new mime types

2.0.9 / 2015-02-09
==================

  * deps: mime-db@~1.7.0
    - Add new mime types
    - Community extensions ownership transferred from `node-mime`

2.0.8 / 2015-01-29
==================

  * deps: mime-db@~1.6.0
    - Add new mime types

2.0.7 / 2014-12-30
==================

  * deps: mime-db@~1.5.0
    - Add new mime types
    - Fix various invalid MIME type entries

2.0.6 / 2014-12-30
==================

  * deps: mime-db@~1.4.0
    - Add new mime types
    - Fix various invalid MIME type entries
    - Remove example template MIME types

2.0.5 / 2014-12-29
==================

  * deps: mime-db@~1.3.1
    - Fix missing extensions

2.0.4 / 2014-12-10
==================

  * deps: mime-db@~1.3.0
    - Add new mime types

2.0.3 / 2014-11-09
==================

  * deps: mime-db@~1.2.0
    - Add new mime types

2.0.2 / 2014-09-28
==================

  * deps: mime-db@~1.1.0
    - Add new mime types
    - Add additional compressible
    - Update charsets

2.0.1 / 2014-09-07
==================

  * Support Node.js 0.6

2.0.0 / 2014-09-02
==================

  * Use `mime-db`
  * Remove `.define()`

1.0.2 / 2014-08-04
==================

  * Set charset=utf-8 for `text/javascript`

1.0.1 / 2014-06-24
==================

  * Add `text/jsx` type

1.0.0 / 2014-05-12
==================

  * Return `false` for unknown types
  * Set charset=utf-8 for `application/json`

0.1.0 / 2014-05-02
==================

  * Initial release
(The MIT License)

Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
/*!
 * mime-types
 * Copyright(c) 2014 Jonathan Ong
 * Copyright(c) 2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var db = require('mime-db')
var extname = require('path').extname

/**
 * Module variables.
 * @private
 */

var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/
var TEXT_TYPE_REGEXP = /^text\//i

/**
 * Module exports.
 * @public
 */

exports.charset = charset
exports.charsets = { lookup: charset }
exports.contentType = contentType
exports.extension = extension
exports.extensions = Object.create(null)
exports.lookup = lookup
exports.types = Object.create(null)

// Populate the extensions/types maps
populateMaps(exports.extensions, exports.types)

/**
 * Get the default charset for a MIME type.
 *
 * @param {string} type
 * @return {boolean|string}
 */

function charset (type) {
  if (!type || typeof type !== 'string') {
    return false
  }

  // TODO: use media-typer
  var match = EXTRACT_TYPE_REGEXP.exec(type)
  var mime = match && db[match[1].toLowerCase()]

  if (mime && mime.charset) {
    return mime.charset
  }

  // default text/* to utf-8
  if (match && TEXT_TYPE_REGEXP.test(match[1])) {
    return 'UTF-8'
  }

  return false
}

/**
 * Create a full Content-Type header given a MIME type or extension.
 *
 * @param {string} str
 * @return {boolean|string}
 */

function contentType (str) {
  // TODO: should this even be in this module?
  if (!str || typeof str !== 'string') {
    return false
  }

  var mime = str.indexOf('/') === -1
    ? exports.lookup(str)
    : str

  if (!mime) {
    return false
  }

  // TODO: use content-type or other module
  if (mime.indexOf('charset') === -1) {
    var charset = exports.charset(mime)
    if (charset) mime += '; charset=' + charset.toLowerCase()
  }

  return mime
}

/**
 * Get the default extension for a MIME type.
 *
 * @param {string} type
 * @return {boolean|string}
 */

function extension (type) {
  if (!type || typeof type !== 'string') {
    return false
  }

  // TODO: use media-typer
  var match = EXTRACT_TYPE_REGEXP.exec(type)

  // get extensions
  var exts = match && exports.extensions[match[1].toLowerCase()]

  if (!exts || !exts.length) {
    return false
  }

  return exts[0]
}

/**
 * Lookup the MIME type for a file path/extension.
 *
 * @param {string} path
 * @return {boolean|string}
 */

function lookup (path) {
  if (!path || typeof path !== 'string') {
    return false
  }

  // get the extension ("ext" or ".ext" or full path)
  var extension = extname('x.' + path)
    .toLowerCase()
    .substr(1)

  if (!extension) {
    return false
  }

  return exports.types[extension] || false
}

/**
 * Populate the extensions and types maps.
 * @private
 */

function populateMaps (extensions, types) {
  // source preference (least -> most)
  var preference = ['nginx', 'apache', undefined, 'iana']

  Object.keys(db).forEach(function forEachMimeType (type) {
    var mime = db[type]
    var exts = mime.extensions

    if (!exts || !exts.length) {
      return
    }

    // mime -> extensions
    extensions[type] = exts

    // extension -> mime
    for (var i = 0; i < exts.length; i++) {
      var extension = exts[i]

      if (types[extension]) {
        var from = preference.indexOf(db[types[extension]].source)
        var to = preference.indexOf(mime.source)

        if (types[extension] !== 'application/octet-stream' &&
          (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) {
          // skip the remapping
          continue
        }
      }

      // set the extension -> mime
      types[extension] = type
    }
  })
}
{
  "dependencies": {
    "mime-db": "1.44.0"
  },
  "deprecated": false,
  "description": "The ultimate javascript content-type utility.",
  "devDependencies": {
    "eslint": "6.8.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.20.2",
    "eslint-plugin-markdown": "1.0.2",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "4.2.1",
    "eslint-plugin-standard": "4.0.1",
    "mocha": "7.1.1",
    "nyc": "15.0.1"
  },
  "engines": {
    "node": ">= 0.6"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "index.js"
  ],
  "homepage": "https://github.com/jshttp/mime-types#readme",
  "license": "MIT",
  "name": "mime-types",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jshttp/mime-types.git"
  },
  "version": "2.1.27"
}'use strict';

// We define these manually to ensure they're always copied
// even if they would move up the prototype chain
// https://nodejs.org/api/http.html#http_class_http_incomingmessage
const knownProps = [
	'destroy',
	'setTimeout',
	'socket',
	'headers',
	'trailers',
	'rawHeaders',
	'statusCode',
	'httpVersion',
	'httpVersionMinor',
	'httpVersionMajor',
	'rawTrailers',
	'statusMessage'
];

module.exports = (fromStream, toStream) => {
	const fromProps = new Set(Object.keys(fromStream).concat(knownProps));

	for (const prop of fromProps) {
		// Don't overwrite existing properties
		if (prop in toStream) {
			continue;
		}

		toStream[prop] = typeof fromStream[prop] === 'function' ? fromStream[prop].bind(fromStream) : fromStream[prop];
	}
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Mimic a Node.js HTTP response stream",
  "devDependencies": {
    "ava": "*",
    "create-test-server": "^0.1.0",
    "pify": "^3.0.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/mimic-response#readme",
  "license": "MIT",
  "name": "mimic-response",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/mimic-response.git"
  },
  "version": "1.0.1"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
module.exports = minimatch
minimatch.Minimatch = Minimatch

var path = { sep: '/' }
try {
  path = require('path')
} catch (er) {}

var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
var expand = require('brace-expansion')

var plTypes = {
  '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
  '?': { open: '(?:', close: ')?' },
  '+': { open: '(?:', close: ')+' },
  '*': { open: '(?:', close: ')*' },
  '@': { open: '(?:', close: ')' }
}

// any single thing other than /
// don't need to escape / when using new RegExp()
var qmark = '[^/]'

// * => any number of characters
var star = qmark + '*?'

// ** when dots are allowed.  Anything goes, except .. and .
// not (^ or / followed by one or two dots followed by $ or /),
// followed by anything, any number of times.
var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'

// not a ^ or / followed by a dot,
// followed by anything, any number of times.
var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'

// characters that need to be escaped in RegExp.
var reSpecials = charSet('().*{}+?[]^$\\!')

// "abc" -> { a:true, b:true, c:true }
function charSet (s) {
  return s.split('').reduce(function (set, c) {
    set[c] = true
    return set
  }, {})
}

// normalizes slashes.
var slashSplit = /\/+/

minimatch.filter = filter
function filter (pattern, options) {
  options = options || {}
  return function (p, i, list) {
    return minimatch(p, pattern, options)
  }
}

function ext (a, b) {
  a = a || {}
  b = b || {}
  var t = {}
  Object.keys(b).forEach(function (k) {
    t[k] = b[k]
  })
  Object.keys(a).forEach(function (k) {
    t[k] = a[k]
  })
  return t
}

minimatch.defaults = function (def) {
  if (!def || !Object.keys(def).length) return minimatch

  var orig = minimatch

  var m = function minimatch (p, pattern, options) {
    return orig.minimatch(p, pattern, ext(def, options))
  }

  m.Minimatch = function Minimatch (pattern, options) {
    return new orig.Minimatch(pattern, ext(def, options))
  }

  return m
}

Minimatch.defaults = function (def) {
  if (!def || !Object.keys(def).length) return Minimatch
  return minimatch.defaults(def).Minimatch
}

function minimatch (p, pattern, options) {
  if (typeof pattern !== 'string') {
    throw new TypeError('glob pattern string required')
  }

  if (!options) options = {}

  // shortcut: comments match nothing.
  if (!options.nocomment && pattern.charAt(0) === '#') {
    return false
  }

  // "" only matches ""
  if (pattern.trim() === '') return p === ''

  return new Minimatch(pattern, options).match(p)
}

function Minimatch (pattern, options) {
  if (!(this instanceof Minimatch)) {
    return new Minimatch(pattern, options)
  }

  if (typeof pattern !== 'string') {
    throw new TypeError('glob pattern string required')
  }

  if (!options) options = {}
  pattern = pattern.trim()

  // windows support: need to use /, not \
  if (path.sep !== '/') {
    pattern = pattern.split(path.sep).join('/')
  }

  this.options = options
  this.set = []
  this.pattern = pattern
  this.regexp = null
  this.negate = false
  this.comment = false
  this.empty = false

  // make the set of regexps etc.
  this.make()
}

Minimatch.prototype.debug = function () {}

Minimatch.prototype.make = make
function make () {
  // don't do it more than once.
  if (this._made) return

  var pattern = this.pattern
  var options = this.options

  // empty patterns and comments match nothing.
  if (!options.nocomment && pattern.charAt(0) === '#') {
    this.comment = true
    return
  }
  if (!pattern) {
    this.empty = true
    return
  }

  // step 1: figure out negation, etc.
  this.parseNegate()

  // step 2: expand braces
  var set = this.globSet = this.braceExpand()

  if (options.debug) this.debug = console.error

  this.debug(this.pattern, set)

  // step 3: now we have a set, so turn each one into a series of path-portion
  // matching patterns.
  // These will be regexps, except in the case of "**", which is
  // set to the GLOBSTAR object for globstar behavior,
  // and will not contain any / characters
  set = this.globParts = set.map(function (s) {
    return s.split(slashSplit)
  })

  this.debug(this.pattern, set)

  // glob --> regexps
  set = set.map(function (s, si, set) {
    return s.map(this.parse, this)
  }, this)

  this.debug(this.pattern, set)

  // filter out everything that didn't compile properly.
  set = set.filter(function (s) {
    return s.indexOf(false) === -1
  })

  this.debug(this.pattern, set)

  this.set = set
}

Minimatch.prototype.parseNegate = parseNegate
function parseNegate () {
  var pattern = this.pattern
  var negate = false
  var options = this.options
  var negateOffset = 0

  if (options.nonegate) return

  for (var i = 0, l = pattern.length
    ; i < l && pattern.charAt(i) === '!'
    ; i++) {
    negate = !negate
    negateOffset++
  }

  if (negateOffset) this.pattern = pattern.substr(negateOffset)
  this.negate = negate
}

// Brace expansion:
// a{b,c}d -> abd acd
// a{b,}c -> abc ac
// a{0..3}d -> a0d a1d a2d a3d
// a{b,c{d,e}f}g -> abg acdfg acefg
// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
//
// Invalid sets are not expanded.
// a{2..}b -> a{2..}b
// a{b}c -> a{b}c
minimatch.braceExpand = function (pattern, options) {
  return braceExpand(pattern, options)
}

Minimatch.prototype.braceExpand = braceExpand

function braceExpand (pattern, options) {
  if (!options) {
    if (this instanceof Minimatch) {
      options = this.options
    } else {
      options = {}
    }
  }

  pattern = typeof pattern === 'undefined'
    ? this.pattern : pattern

  if (typeof pattern === 'undefined') {
    throw new TypeError('undefined pattern')
  }

  if (options.nobrace ||
    !pattern.match(/\{.*\}/)) {
    // shortcut. no need to expand.
    return [pattern]
  }

  return expand(pattern)
}

// parse a component of the expanded set.
// At this point, no pattern may contain "/" in it
// so we're going to return a 2d array, where each entry is the full
// pattern, split on '/', and then turned into a regular expression.
// A regexp is made at the end which joins each array with an
// escaped /, and another full one which joins each regexp with |.
//
// Following the lead of Bash 4.1, note that "**" only has special meaning
// when it is the *only* thing in a path portion.  Otherwise, any series
// of * is equivalent to a single *.  Globstar behavior is enabled by
// default, and can be disabled by setting options.noglobstar.
Minimatch.prototype.parse = parse
var SUBPARSE = {}
function parse (pattern, isSub) {
  if (pattern.length > 1024 * 64) {
    throw new TypeError('pattern is too long')
  }

  var options = this.options

  // shortcuts
  if (!options.noglobstar && pattern === '**') return GLOBSTAR
  if (pattern === '') return ''

  var re = ''
  var hasMagic = !!options.nocase
  var escaping = false
  // ? => one single character
  var patternListStack = []
  var negativeLists = []
  var stateChar
  var inClass = false
  var reClassStart = -1
  var classStart = -1
  // . and .. never match anything that doesn't start with .,
  // even when options.dot is set.
  var patternStart = pattern.charAt(0) === '.' ? '' // anything
  // not (start or / followed by . or .. followed by / or end)
  : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
  : '(?!\\.)'
  var self = this

  function clearStateChar () {
    if (stateChar) {
      // we had some state-tracking character
      // that wasn't consumed by this pass.
      switch (stateChar) {
        case '*':
          re += star
          hasMagic = true
        break
        case '?':
          re += qmark
          hasMagic = true
        break
        default:
          re += '\\' + stateChar
        break
      }
      self.debug('clearStateChar %j %j', stateChar, re)
      stateChar = false
    }
  }

  for (var i = 0, len = pattern.length, c
    ; (i < len) && (c = pattern.charAt(i))
    ; i++) {
    this.debug('%s\t%s %s %j', pattern, i, re, c)

    // skip over any that are escaped.
    if (escaping && reSpecials[c]) {
      re += '\\' + c
      escaping = false
      continue
    }

    switch (c) {
      case '/':
        // completely not allowed, even escaped.
        // Should already be path-split by now.
        return false

      case '\\':
        clearStateChar()
        escaping = true
      continue

      // the various stateChar values
      // for the "extglob" stuff.
      case '?':
      case '*':
      case '+':
      case '@':
      case '!':
        this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)

        // all of those are literals inside a class, except that
        // the glob [!a] means [^a] in regexp
        if (inClass) {
          this.debug('  in class')
          if (c === '!' && i === classStart + 1) c = '^'
          re += c
          continue
        }

        // if we already have a stateChar, then it means
        // that there was something like ** or +? in there.
        // Handle the stateChar, then proceed with this one.
        self.debug('call clearStateChar %j', stateChar)
        clearStateChar()
        stateChar = c
        // if extglob is disabled, then +(asdf|foo) isn't a thing.
        // just clear the statechar *now*, rather than even diving into
        // the patternList stuff.
        if (options.noext) clearStateChar()
      continue

      case '(':
        if (inClass) {
          re += '('
          continue
        }

        if (!stateChar) {
          re += '\\('
          continue
        }

        patternListStack.push({
          type: stateChar,
          start: i - 1,
          reStart: re.length,
          open: plTypes[stateChar].open,
          close: plTypes[stateChar].close
        })
        // negation is (?:(?!js)[^/]*)
        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
        this.debug('plType %j %j', stateChar, re)
        stateChar = false
      continue

      case ')':
        if (inClass || !patternListStack.length) {
          re += '\\)'
          continue
        }

        clearStateChar()
        hasMagic = true
        var pl = patternListStack.pop()
        // negation is (?:(?!js)[^/]*)
        // The others are (?:<pattern>)<type>
        re += pl.close
        if (pl.type === '!') {
          negativeLists.push(pl)
        }
        pl.reEnd = re.length
      continue

      case '|':
        if (inClass || !patternListStack.length || escaping) {
          re += '\\|'
          escaping = false
          continue
        }

        clearStateChar()
        re += '|'
      continue

      // these are mostly the same in regexp and glob
      case '[':
        // swallow any state-tracking char before the [
        clearStateChar()

        if (inClass) {
          re += '\\' + c
          continue
        }

        inClass = true
        classStart = i
        reClassStart = re.length
        re += c
      continue

      case ']':
        //  a right bracket shall lose its special
        //  meaning and represent itself in
        //  a bracket expression if it occurs
        //  first in the list.  -- POSIX.2 2.8.3.2
        if (i === classStart + 1 || !inClass) {
          re += '\\' + c
          escaping = false
          continue
        }

        // handle the case where we left a class open.
        // "[z-a]" is valid, equivalent to "\[z-a\]"
        if (inClass) {
          // split where the last [ was, make sure we don't have
          // an invalid re. if so, re-walk the contents of the
          // would-be class to re-translate any characters that
          // were passed through as-is
          // TODO: It would probably be faster to determine this
          // without a try/catch and a new RegExp, but it's tricky
          // to do safely.  For now, this is safe and works.
          var cs = pattern.substring(classStart + 1, i)
          try {
            RegExp('[' + cs + ']')
          } catch (er) {
            // not a valid class!
            var sp = this.parse(cs, SUBPARSE)
            re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
            hasMagic = hasMagic || sp[1]
            inClass = false
            continue
          }
        }

        // finish up the class.
        hasMagic = true
        inClass = false
        re += c
      continue

      default:
        // swallow any state char that wasn't consumed
        clearStateChar()

        if (escaping) {
          // no need
          escaping = false
        } else if (reSpecials[c]
          && !(c === '^' && inClass)) {
          re += '\\'
        }

        re += c

    } // switch
  } // for

  // handle the case where we left a class open.
  // "[abc" is valid, equivalent to "\[abc"
  if (inClass) {
    // split where the last [ was, and escape it
    // this is a huge pita.  We now have to re-walk
    // the contents of the would-be class to re-translate
    // any characters that were passed through as-is
    cs = pattern.substr(classStart + 1)
    sp = this.parse(cs, SUBPARSE)
    re = re.substr(0, reClassStart) + '\\[' + sp[0]
    hasMagic = hasMagic || sp[1]
  }

  // handle the case where we had a +( thing at the *end*
  // of the pattern.
  // each pattern list stack adds 3 chars, and we need to go through
  // and escape any | chars that were passed through as-is for the regexp.
  // Go through and escape them, taking care not to double-escape any
  // | chars that were already escaped.
  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
    var tail = re.slice(pl.reStart + pl.open.length)
    this.debug('setting tail', re, pl)
    // maybe some even number of \, then maybe 1 \, followed by a |
    tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
      if (!$2) {
        // the | isn't already escaped, so escape it.
        $2 = '\\'
      }

      // need to escape all those slashes *again*, without escaping the
      // one that we need for escaping the | character.  As it works out,
      // escaping an even number of slashes can be done by simply repeating
      // it exactly after itself.  That's why this trick works.
      //
      // I am sorry that you have to see this.
      return $1 + $1 + $2 + '|'
    })

    this.debug('tail=%j\n   %s', tail, tail, pl, re)
    var t = pl.type === '*' ? star
      : pl.type === '?' ? qmark
      : '\\' + pl.type

    hasMagic = true
    re = re.slice(0, pl.reStart) + t + '\\(' + tail
  }

  // handle trailing things that only matter at the very end.
  clearStateChar()
  if (escaping) {
    // trailing \\
    re += '\\\\'
  }

  // only need to apply the nodot start if the re starts with
  // something that could conceivably capture a dot
  var addPatternStart = false
  switch (re.charAt(0)) {
    case '.':
    case '[':
    case '(': addPatternStart = true
  }

  // Hack to work around lack of negative lookbehind in JS
  // A pattern like: *.!(x).!(y|z) needs to ensure that a name
  // like 'a.xyz.yz' doesn't match.  So, the first negative
  // lookahead, has to look ALL the way ahead, to the end of
  // the pattern.
  for (var n = negativeLists.length - 1; n > -1; n--) {
    var nl = negativeLists[n]

    var nlBefore = re.slice(0, nl.reStart)
    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
    var nlAfter = re.slice(nl.reEnd)

    nlLast += nlAfter

    // Handle nested stuff like *(*.js|!(*.json)), where open parens
    // mean that we should *not* include the ) in the bit that is considered
    // "after" the negated section.
    var openParensBefore = nlBefore.split('(').length - 1
    var cleanAfter = nlAfter
    for (i = 0; i < openParensBefore; i++) {
      cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
    }
    nlAfter = cleanAfter

    var dollar = ''
    if (nlAfter === '' && isSub !== SUBPARSE) {
      dollar = '$'
    }
    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
    re = newRe
  }

  // if the re is not "" at this point, then we need to make sure
  // it doesn't match against an empty path part.
  // Otherwise a/* will match a/, which it should not.
  if (re !== '' && hasMagic) {
    re = '(?=.)' + re
  }

  if (addPatternStart) {
    re = patternStart + re
  }

  // parsing just a piece of a larger pattern.
  if (isSub === SUBPARSE) {
    return [re, hasMagic]
  }

  // skip the regexp for non-magical patterns
  // unescape anything in it, though, so that it'll be
  // an exact match against a file etc.
  if (!hasMagic) {
    return globUnescape(pattern)
  }

  var flags = options.nocase ? 'i' : ''
  try {
    var regExp = new RegExp('^' + re + '$', flags)
  } catch (er) {
    // If it was an invalid regular expression, then it can't match
    // anything.  This trick looks for a character after the end of
    // the string, which is of course impossible, except in multi-line
    // mode, but it's not a /m regex.
    return new RegExp('$.')
  }

  regExp._glob = pattern
  regExp._src = re

  return regExp
}

minimatch.makeRe = function (pattern, options) {
  return new Minimatch(pattern, options || {}).makeRe()
}

Minimatch.prototype.makeRe = makeRe
function makeRe () {
  if (this.regexp || this.regexp === false) return this.regexp

  // at this point, this.set is a 2d array of partial
  // pattern strings, or "**".
  //
  // It's better to use .match().  This function shouldn't
  // be used, really, but it's pretty convenient sometimes,
  // when you just want to work with a regex.
  var set = this.set

  if (!set.length) {
    this.regexp = false
    return this.regexp
  }
  var options = this.options

  var twoStar = options.noglobstar ? star
    : options.dot ? twoStarDot
    : twoStarNoDot
  var flags = options.nocase ? 'i' : ''

  var re = set.map(function (pattern) {
    return pattern.map(function (p) {
      return (p === GLOBSTAR) ? twoStar
      : (typeof p === 'string') ? regExpEscape(p)
      : p._src
    }).join('\\\/')
  }).join('|')

  // must match entire pattern
  // ending in a * or ** will make it less strict.
  re = '^(?:' + re + ')$'

  // can match anything, as long as it's not this.
  if (this.negate) re = '^(?!' + re + ').*$'

  try {
    this.regexp = new RegExp(re, flags)
  } catch (ex) {
    this.regexp = false
  }
  return this.regexp
}

minimatch.match = function (list, pattern, options) {
  options = options || {}
  var mm = new Minimatch(pattern, options)
  list = list.filter(function (f) {
    return mm.match(f)
  })
  if (mm.options.nonull && !list.length) {
    list.push(pattern)
  }
  return list
}

Minimatch.prototype.match = match
function match (f, partial) {
  this.debug('match', f, this.pattern)
  // short-circuit in the case of busted things.
  // comments, etc.
  if (this.comment) return false
  if (this.empty) return f === ''

  if (f === '/' && partial) return true

  var options = this.options

  // windows: need to use /, not \
  if (path.sep !== '/') {
    f = f.split(path.sep).join('/')
  }

  // treat the test path as a set of pathparts.
  f = f.split(slashSplit)
  this.debug(this.pattern, 'split', f)

  // just ONE of the pattern sets in this.set needs to match
  // in order for it to be valid.  If negating, then just one
  // match means that we have failed.
  // Either way, return on the first hit.

  var set = this.set
  this.debug(this.pattern, 'set', set)

  // Find the basename of the path by looking for the last non-empty segment
  var filename
  var i
  for (i = f.length - 1; i >= 0; i--) {
    filename = f[i]
    if (filename) break
  }

  for (i = 0; i < set.length; i++) {
    var pattern = set[i]
    var file = f
    if (options.matchBase && pattern.length === 1) {
      file = [filename]
    }
    var hit = this.matchOne(file, pattern, partial)
    if (hit) {
      if (options.flipNegate) return true
      return !this.negate
    }
  }

  // didn't get any hits.  this is success if it's a negative
  // pattern, failure otherwise.
  if (options.flipNegate) return false
  return this.negate
}

// set partial to true to test if, for example,
// "/a/b" matches the start of "/*/b/*/d"
// Partial means, if you run out of file before you run
// out of pattern, then that's fine, as long as all
// the parts match.
Minimatch.prototype.matchOne = function (file, pattern, partial) {
  var options = this.options

  this.debug('matchOne',
    { 'this': this, file: file, pattern: pattern })

  this.debug('matchOne', file.length, pattern.length)

  for (var fi = 0,
      pi = 0,
      fl = file.length,
      pl = pattern.length
      ; (fi < fl) && (pi < pl)
      ; fi++, pi++) {
    this.debug('matchOne loop')
    var p = pattern[pi]
    var f = file[fi]

    this.debug(pattern, p, f)

    // should be impossible.
    // some invalid regexp stuff in the set.
    if (p === false) return false

    if (p === GLOBSTAR) {
      this.debug('GLOBSTAR', [pattern, p, f])

      // "**"
      // a/**/b/**/c would match the following:
      // a/b/x/y/z/c
      // a/x/y/z/b/c
      // a/b/x/b/x/c
      // a/b/c
      // To do this, take the rest of the pattern after
      // the **, and see if it would match the file remainder.
      // If so, return success.
      // If not, the ** "swallows" a segment, and try again.
      // This is recursively awful.
      //
      // a/**/b/**/c matching a/b/x/y/z/c
      // - a matches a
      // - doublestar
      //   - matchOne(b/x/y/z/c, b/**/c)
      //     - b matches b
      //     - doublestar
      //       - matchOne(x/y/z/c, c) -> no
      //       - matchOne(y/z/c, c) -> no
      //       - matchOne(z/c, c) -> no
      //       - matchOne(c, c) yes, hit
      var fr = fi
      var pr = pi + 1
      if (pr === pl) {
        this.debug('** at the end')
        // a ** at the end will just swallow the rest.
        // We have found a match.
        // however, it will not swallow /.x, unless
        // options.dot is set.
        // . and .. are *never* matched by **, for explosively
        // exponential reasons.
        for (; fi < fl; fi++) {
          if (file[fi] === '.' || file[fi] === '..' ||
            (!options.dot && file[fi].charAt(0) === '.')) return false
        }
        return true
      }

      // ok, let's see if we can swallow whatever we can.
      while (fr < fl) {
        var swallowee = file[fr]

        this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)

        // XXX remove this slice.  Just pass the start index.
        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
          this.debug('globstar found match!', fr, fl, swallowee)
          // found a match.
          return true
        } else {
          // can't swallow "." or ".." ever.
          // can only swallow ".foo" when explicitly asked.
          if (swallowee === '.' || swallowee === '..' ||
            (!options.dot && swallowee.charAt(0) === '.')) {
            this.debug('dot detected!', file, fr, pattern, pr)
            break
          }

          // ** swallows a segment, and continue.
          this.debug('globstar swallow a segment, and continue')
          fr++
        }
      }

      // no match was found.
      // However, in partial mode, we can't say this is necessarily over.
      // If there's more *pattern* left, then
      if (partial) {
        // ran out of file
        this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
        if (fr === fl) return true
      }
      return false
    }

    // something other than **
    // non-magic patterns just have to match exactly
    // patterns with magic have been turned into regexps.
    var hit
    if (typeof p === 'string') {
      if (options.nocase) {
        hit = f.toLowerCase() === p.toLowerCase()
      } else {
        hit = f === p
      }
      this.debug('string match', p, f, hit)
    } else {
      hit = f.match(p)
      this.debug('pattern match', p, f, hit)
    }

    if (!hit) return false
  }

  // Note: ending in / means that we'll get a final ""
  // at the end of the pattern.  This can only match a
  // corresponding "" at the end of the file.
  // If the file ends in /, then it can only match a
  // a pattern that ends in /, unless the pattern just
  // doesn't have any more for it. But, a/b/ should *not*
  // match "a/b/*", even though "" matches against the
  // [^/]*? pattern, except in partial mode, where it might
  // simply not be reached yet.
  // However, a/b/ should still satisfy a/*

  // now either we fell off the end of the pattern, or we're done.
  if (fi === fl && pi === pl) {
    // ran out of pattern and filename at the same time.
    // an exact hit!
    return true
  } else if (fi === fl) {
    // ran out of file, but still had pattern left.
    // this is ok if we're doing the match as part of
    // a glob fs traversal.
    return partial
  } else if (pi === pl) {
    // ran out of pattern, still have file left.
    // this is only acceptable if we're on the very last
    // empty segment of a file with a trailing slash.
    // a/* should match a/b/
    var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')
    return emptyFileEnd
  }

  // should be unreachable.
  throw new Error('wtf?')
}

// replace stuff like \* with *
function globUnescape (s) {
  return s.replace(/\\(.)/g, '$1')
}

function regExpEscape (s) {
  return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me"
  },
  "dependencies": {
    "brace-expansion": "^1.1.7"
  },
  "deprecated": false,
  "description": "a glob matcher in javascript",
  "devDependencies": {
    "tap": "^10.3.2"
  },
  "engines": {
    "node": "*"
  },
  "files": [
    "minimatch.js"
  ],
  "homepage": "https://github.com/isaacs/minimatch#readme",
  "license": "ISC",
  "main": "minimatch.js",
  "name": "minimatch",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/minimatch.git"
  },
  "version": "3.0.4"
}This software is released under the MIT license:

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
module.exports = function (args, opts) {
    if (!opts) opts = {};
    
    var flags = { bools : {}, strings : {}, unknownFn: null };

    if (typeof opts['unknown'] === 'function') {
        flags.unknownFn = opts['unknown'];
    }

    if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {
      flags.allBools = true;
    } else {
      [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
          flags.bools[key] = true;
      });
    }
    
    var aliases = {};
    Object.keys(opts.alias || {}).forEach(function (key) {
        aliases[key] = [].concat(opts.alias[key]);
        aliases[key].forEach(function (x) {
            aliases[x] = [key].concat(aliases[key].filter(function (y) {
                return x !== y;
            }));
        });
    });

    [].concat(opts.string).filter(Boolean).forEach(function (key) {
        flags.strings[key] = true;
        if (aliases[key]) {
            flags.strings[aliases[key]] = true;
        }
     });

    var defaults = opts['default'] || {};
    
    var argv = { _ : [] };
    Object.keys(flags.bools).forEach(function (key) {
        setArg(key, defaults[key] === undefined ? false : defaults[key]);
    });
    
    var notFlags = [];

    if (args.indexOf('--') !== -1) {
        notFlags = args.slice(args.indexOf('--')+1);
        args = args.slice(0, args.indexOf('--'));
    }

    function argDefined(key, arg) {
        return (flags.allBools && /^--[^=]+$/.test(arg)) ||
            flags.strings[key] || flags.bools[key] || aliases[key];
    }

    function setArg (key, val, arg) {
        if (arg && flags.unknownFn && !argDefined(key, arg)) {
            if (flags.unknownFn(arg) === false) return;
        }

        var value = !flags.strings[key] && isNumber(val)
            ? Number(val) : val
        ;
        setKey(argv, key.split('.'), value);
        
        (aliases[key] || []).forEach(function (x) {
            setKey(argv, x.split('.'), value);
        });
    }

    function setKey (obj, keys, value) {
        var o = obj;
        for (var i = 0; i < keys.length-1; i++) {
            var key = keys[i];
            if (key === '__proto__') return;
            if (o[key] === undefined) o[key] = {};
            if (o[key] === Object.prototype || o[key] === Number.prototype
                || o[key] === String.prototype) o[key] = {};
            if (o[key] === Array.prototype) o[key] = [];
            o = o[key];
        }

        var key = keys[keys.length - 1];
        if (key === '__proto__') return;
        if (o === Object.prototype || o === Number.prototype
            || o === String.prototype) o = {};
        if (o === Array.prototype) o = [];
        if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') {
            o[key] = value;
        }
        else if (Array.isArray(o[key])) {
            o[key].push(value);
        }
        else {
            o[key] = [ o[key], value ];
        }
    }
    
    function aliasIsBoolean(key) {
      return aliases[key].some(function (x) {
          return flags.bools[x];
      });
    }

    for (var i = 0; i < args.length; i++) {
        var arg = args[i];
        
        if (/^--.+=/.test(arg)) {
            // Using [\s\S] instead of . because js doesn't support the
            // 'dotall' regex modifier. See:
            // http://stackoverflow.com/a/1068308/13216
            var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
            var key = m[1];
            var value = m[2];
            if (flags.bools[key]) {
                value = value !== 'false';
            }
            setArg(key, value, arg);
        }
        else if (/^--no-.+/.test(arg)) {
            var key = arg.match(/^--no-(.+)/)[1];
            setArg(key, false, arg);
        }
        else if (/^--.+/.test(arg)) {
            var key = arg.match(/^--(.+)/)[1];
            var next = args[i + 1];
            if (next !== undefined && !/^-/.test(next)
            && !flags.bools[key]
            && !flags.allBools
            && (aliases[key] ? !aliasIsBoolean(key) : true)) {
                setArg(key, next, arg);
                i++;
            }
            else if (/^(true|false)$/.test(next)) {
                setArg(key, next === 'true', arg);
                i++;
            }
            else {
                setArg(key, flags.strings[key] ? '' : true, arg);
            }
        }
        else if (/^-[^-]+/.test(arg)) {
            var letters = arg.slice(1,-1).split('');
            
            var broken = false;
            for (var j = 0; j < letters.length; j++) {
                var next = arg.slice(j+2);
                
                if (next === '-') {
                    setArg(letters[j], next, arg)
                    continue;
                }
                
                if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) {
                    setArg(letters[j], next.split('=')[1], arg);
                    broken = true;
                    break;
                }
                
                if (/[A-Za-z]/.test(letters[j])
                && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
                    setArg(letters[j], next, arg);
                    broken = true;
                    break;
                }
                
                if (letters[j+1] && letters[j+1].match(/\W/)) {
                    setArg(letters[j], arg.slice(j+2), arg);
                    broken = true;
                    break;
                }
                else {
                    setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
                }
            }
            
            var key = arg.slice(-1)[0];
            if (!broken && key !== '-') {
                if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
                && !flags.bools[key]
                && (aliases[key] ? !aliasIsBoolean(key) : true)) {
                    setArg(key, args[i+1], arg);
                    i++;
                }
                else if (args[i+1] && /^(true|false)$/.test(args[i+1])) {
                    setArg(key, args[i+1] === 'true', arg);
                    i++;
                }
                else {
                    setArg(key, flags.strings[key] ? '' : true, arg);
                }
            }
        }
        else {
            if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
                argv._.push(
                    flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
                );
            }
            if (opts.stopEarly) {
                argv._.push.apply(argv._, args.slice(i + 1));
                break;
            }
        }
    }
    
    Object.keys(defaults).forEach(function (key) {
        if (!hasKey(argv, key.split('.'))) {
            setKey(argv, key.split('.'), defaults[key]);
            
            (aliases[key] || []).forEach(function (x) {
                setKey(argv, x.split('.'), defaults[key]);
            });
        }
    });
    
    if (opts['--']) {
        argv['--'] = new Array();
        notFlags.forEach(function(key) {
            argv['--'].push(key);
        });
    }
    else {
        notFlags.forEach(function(key) {
            argv._.push(key);
        });
    }

    return argv;
};

function hasKey (obj, keys) {
    var o = obj;
    keys.slice(0,-1).forEach(function (key) {
        o = (o[key] || {});
    });

    var key = keys[keys.length - 1];
    return key in o;
}

function isNumber (x) {
    if (typeof x === 'number') return true;
    if (/^0x[0-9a-f]+$/i.test(x)) return true;
    return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
}

{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "deprecated": false,
  "description": "parse argument options",
  "devDependencies": {
    "covert": "^1.0.0",
    "tap": "~0.4.0",
    "tape": "^3.5.0"
  },
  "homepage": "https://github.com/substack/minimist",
  "license": "MIT",
  "main": "index.js",
  "name": "minimist",
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/minimist.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/6..latest",
      "ff/5",
      "firefox/latest",
      "chrome/10",
      "chrome/latest",
      "safari/5.1",
      "safari/latest",
      "opera/12"
    ]
  },
  "version": "1.2.5"
}Copyright 2010 James Halliday (mail@substack.net)

This project is free software released under the MIT/X11 license:

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
var path = require('path');
var fs = require('fs');
var _0777 = parseInt('0777', 8);

module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;

function mkdirP (p, opts, f, made) {
    if (typeof opts === 'function') {
        f = opts;
        opts = {};
    }
    else if (!opts || typeof opts !== 'object') {
        opts = { mode: opts };
    }
    
    var mode = opts.mode;
    var xfs = opts.fs || fs;
    
    if (mode === undefined) {
        mode = _0777
    }
    if (!made) made = null;
    
    var cb = f || function () {};
    p = path.resolve(p);
    
    xfs.mkdir(p, mode, function (er) {
        if (!er) {
            made = made || p;
            return cb(null, made);
        }
        switch (er.code) {
            case 'ENOENT':
                if (path.dirname(p) === p) return cb(er);
                mkdirP(path.dirname(p), opts, function (er, made) {
                    if (er) cb(er, made);
                    else mkdirP(p, opts, cb, made);
                });
                break;

            // In the case of any other error, just see if there's a dir
            // there already.  If so, then hooray!  If not, then something
            // is borked.
            default:
                xfs.stat(p, function (er2, stat) {
                    // if the stat fails, then that's super weird.
                    // let the original error be the failure reason.
                    if (er2 || !stat.isDirectory()) cb(er, made)
                    else cb(null, made);
                });
                break;
        }
    });
}

mkdirP.sync = function sync (p, opts, made) {
    if (!opts || typeof opts !== 'object') {
        opts = { mode: opts };
    }
    
    var mode = opts.mode;
    var xfs = opts.fs || fs;
    
    if (mode === undefined) {
        mode = _0777
    }
    if (!made) made = null;

    p = path.resolve(p);

    try {
        xfs.mkdirSync(p, mode);
        made = made || p;
    }
    catch (err0) {
        switch (err0.code) {
            case 'ENOENT' :
                made = sync(path.dirname(p), opts, made);
                sync(p, opts, made);
                break;

            // In the case of any other error, just see if there's a dir
            // there already.  If so, then hooray!  If not, then something
            // is borked.
            default:
                var stat;
                try {
                    stat = xfs.statSync(p);
                }
                catch (err1) {
                    throw err0;
                }
                if (!stat.isDirectory()) throw err0;
                break;
        }
    }

    return made;
};
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "bin": {
    "mkdirp": "bin/cmd.js"
  },
  "dependencies": {
    "minimist": "^1.2.5"
  },
  "deprecated": false,
  "description": "Recursively mkdir, like `mkdir -p`",
  "devDependencies": {
    "mock-fs": "^3.7.0",
    "tap": "^5.4.2"
  },
  "files": [
    "bin",
    "index.js"
  ],
  "homepage": "https://github.com/substack/node-mkdirp#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "mkdirp",
  "publishConfig": {
    "tag": "legacy"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/substack/node-mkdirp.git"
  },
  "version": "0.5.5"
}#!/usr/bin/env node

var mkdirp = require('../');
var minimist = require('minimist');
var fs = require('fs');

var argv = minimist(process.argv.slice(2), {
    alias: { m: 'mode', h: 'help' },
    string: [ 'mode' ]
});
if (argv.help) {
    fs.createReadStream(__dirname + '/usage.txt').pipe(process.stdout);
    return;
}

var paths = argv._.slice();
var mode = argv.mode ? parseInt(argv.mode, 8) : undefined;

(function next () {
    if (paths.length === 0) return;
    var p = paths.shift();
    
    if (mode === undefined) mkdirp(p, cb)
    else mkdirp(p, mode, cb)
    
    function cb (err) {
        if (err) {
            console.error(err.message);
            process.exit(1);
        }
        else next();
    }
})();
usage: mkdirp [DIR1,DIR2..] {OPTIONS}

  Create each supplied directory including any necessary parent directories that
  don't yet exist.
  
  If the directory already exists, do nothing.

OPTIONS are:

  -m, --mode   If a directory needs to be created, set the mode as an octal
               permission string.

/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var w = d * 7;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function(val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isFinite(val)) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'weeks':
    case 'week':
    case 'w':
      return n * w;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  var msAbs = Math.abs(ms);
  if (msAbs >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (msAbs >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (msAbs >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (msAbs >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  var msAbs = Math.abs(ms);
  if (msAbs >= d) {
    return plural(ms, msAbs, d, 'day');
  }
  if (msAbs >= h) {
    return plural(ms, msAbs, h, 'hour');
  }
  if (msAbs >= m) {
    return plural(ms, msAbs, m, 'minute');
  }
  if (msAbs >= s) {
    return plural(ms, msAbs, s, 'second');
  }
  return ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, msAbs, n, name) {
  var isPlural = msAbs >= n * 1.5;
  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
}
The MIT License (MIT)

Copyright (c) 2016 Zeit, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "deprecated": false,
  "description": "Tiny millisecond conversion utility",
  "devDependencies": {
    "eslint": "4.12.1",
    "expect.js": "0.3.1",
    "husky": "0.14.3",
    "lint-staged": "5.0.0",
    "mocha": "4.0.1"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/zeit/ms#readme",
  "license": "MIT",
  "lint-staged": {
    "*.js": [
      "npm run lint",
      "prettier --single-quote --write",
      "git add"
    ]
  },
  "main": "./index",
  "name": "ms",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/zeit/ms.git"
  },
  "version": "2.1.2"
}The MIT License (MIT)

Copyright (c) 2018 Tobias Reich

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "authors": [
    "Tobias Reich <tobias@electerious.com>"
  ],
  "deprecated": false,
  "description": "Tries to execute a function and discards any error that occurs",
  "devDependencies": {
    "chai": "^4.1.2",
    "coveralls": "^3.0.0",
    "mocha": "^5.1.1",
    "nyc": "^12.0.1"
  },
  "files": [
    "src"
  ],
  "homepage": "https://github.com/electerious/nice-try",
  "license": "MIT",
  "main": "src/index.js",
  "name": "nice-try",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electerious/nice-try.git"
  },
  "version": "1.0.5"
}'use strict'

/**
 * Tries to execute a function and discards any error that occurs.
 * @param {Function} fn - Function that might or might not throw an error.
 * @returns {?*} Return-value of the function when no error occurred.
 */
module.exports = function(fn) {

	try { return fn() } catch (e) {}

}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "bin": {
    "nopt": "bin/nopt.js"
  },
  "dependencies": {
    "abbrev": "1",
    "osenv": "^0.1.4"
  },
  "deprecated": false,
  "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.",
  "devDependencies": {
    "tap": "^14.10.6"
  },
  "files": [
    "bin",
    "lib"
  ],
  "homepage": "https://github.com/npm/nopt#readme",
  "license": "ISC",
  "main": "lib/nopt.js",
  "name": "nopt",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/nopt.git"
  },
  "version": "4.0.3"
}// info about each config option.

var debug = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG
  ? function () { console.error.apply(console, arguments) }
  : function () {}

var url = require("url")
  , path = require("path")
  , Stream = require("stream").Stream
  , abbrev = require("abbrev")
  , osenv = require("osenv")

module.exports = exports = nopt
exports.clean = clean

exports.typeDefs =
  { String  : { type: String,  validate: validateString  }
  , Boolean : { type: Boolean, validate: validateBoolean }
  , url     : { type: url,     validate: validateUrl     }
  , Number  : { type: Number,  validate: validateNumber  }
  , path    : { type: path,    validate: validatePath    }
  , Stream  : { type: Stream,  validate: validateStream  }
  , Date    : { type: Date,    validate: validateDate    }
  }

function nopt (types, shorthands, args, slice) {
  args = args || process.argv
  types = types || {}
  shorthands = shorthands || {}
  if (typeof slice !== "number") slice = 2

  debug(types, shorthands, args, slice)

  args = args.slice(slice)
  var data = {}
    , key
    , argv = {
        remain: [],
        cooked: args,
        original: args.slice(0)
      }

  parse(args, data, argv.remain, types, shorthands)
  // now data is full
  clean(data, types, exports.typeDefs)
  data.argv = argv
  Object.defineProperty(data.argv, 'toString', { value: function () {
    return this.original.map(JSON.stringify).join(" ")
  }, enumerable: false })
  return data
}

function clean (data, types, typeDefs) {
  typeDefs = typeDefs || exports.typeDefs
  var remove = {}
    , typeDefault = [false, true, null, String, Array]

  Object.keys(data).forEach(function (k) {
    if (k === "argv") return
    var val = data[k]
      , isArray = Array.isArray(val)
      , type = types[k]
    if (!isArray) val = [val]
    if (!type) type = typeDefault
    if (type === Array) type = typeDefault.concat(Array)
    if (!Array.isArray(type)) type = [type]

    debug("val=%j", val)
    debug("types=", type)
    val = val.map(function (val) {
      // if it's an unknown value, then parse false/true/null/numbers/dates
      if (typeof val === "string") {
        debug("string %j", val)
        val = val.trim()
        if ((val === "null" && ~type.indexOf(null))
            || (val === "true" &&
               (~type.indexOf(true) || ~type.indexOf(Boolean)))
            || (val === "false" &&
               (~type.indexOf(false) || ~type.indexOf(Boolean)))) {
          val = JSON.parse(val)
          debug("jsonable %j", val)
        } else if (~type.indexOf(Number) && !isNaN(val)) {
          debug("convert to number", val)
          val = +val
        } else if (~type.indexOf(Date) && !isNaN(Date.parse(val))) {
          debug("convert to date", val)
          val = new Date(val)
        }
      }

      if (!types.hasOwnProperty(k)) {
        return val
      }

      // allow `--no-blah` to set 'blah' to null if null is allowed
      if (val === false && ~type.indexOf(null) &&
          !(~type.indexOf(false) || ~type.indexOf(Boolean))) {
        val = null
      }

      var d = {}
      d[k] = val
      debug("prevalidated val", d, val, types[k])
      if (!validate(d, k, val, types[k], typeDefs)) {
        if (exports.invalidHandler) {
          exports.invalidHandler(k, val, types[k], data)
        } else if (exports.invalidHandler !== false) {
          debug("invalid: "+k+"="+val, types[k])
        }
        return remove
      }
      debug("validated val", d, val, types[k])
      return d[k]
    }).filter(function (val) { return val !== remove })

    // if we allow Array specifically, then an empty array is how we
    // express 'no value here', not null.  Allow it.
    if (!val.length && type.indexOf(Array) === -1) {
      debug('VAL HAS NO LENGTH, DELETE IT', val, k, type.indexOf(Array))
      delete data[k]
    }
    else if (isArray) {
      debug(isArray, data[k], val)
      data[k] = val
    } else data[k] = val[0]

    debug("k=%s val=%j", k, val, data[k])
  })
}

function validateString (data, k, val) {
  data[k] = String(val)
}

function validatePath (data, k, val) {
  if (val === true) return false
  if (val === null) return true

  val = String(val)

  var isWin       = process.platform === 'win32'
    , homePattern = isWin ? /^~(\/|\\)/ : /^~\//
    , home        = osenv.home()

  if (home && val.match(homePattern)) {
    data[k] = path.resolve(home, val.substr(2))
  } else {
    data[k] = path.resolve(val)
  }
  return true
}

function validateNumber (data, k, val) {
  debug("validate Number %j %j %j", k, val, isNaN(val))
  if (isNaN(val)) return false
  data[k] = +val
}

function validateDate (data, k, val) {
  var s = Date.parse(val)
  debug("validate Date %j %j %j", k, val, s)
  if (isNaN(s)) return false
  data[k] = new Date(val)
}

function validateBoolean (data, k, val) {
  if (val instanceof Boolean) val = val.valueOf()
  else if (typeof val === "string") {
    if (!isNaN(val)) val = !!(+val)
    else if (val === "null" || val === "false") val = false
    else val = true
  } else val = !!val
  data[k] = val
}

function validateUrl (data, k, val) {
  val = url.parse(String(val))
  if (!val.host) return false
  data[k] = val.href
}

function validateStream (data, k, val) {
  if (!(val instanceof Stream)) return false
  data[k] = val
}

function validate (data, k, val, type, typeDefs) {
  // arrays are lists of types.
  if (Array.isArray(type)) {
    for (var i = 0, l = type.length; i < l; i ++) {
      if (type[i] === Array) continue
      if (validate(data, k, val, type[i], typeDefs)) return true
    }
    delete data[k]
    return false
  }

  // an array of anything?
  if (type === Array) return true

  // NaN is poisonous.  Means that something is not allowed.
  if (type !== type) {
    debug("Poison NaN", k, val, type)
    delete data[k]
    return false
  }

  // explicit list of values
  if (val === type) {
    debug("Explicitly allowed %j", val)
    // if (isArray) (data[k] = data[k] || []).push(val)
    // else data[k] = val
    data[k] = val
    return true
  }

  // now go through the list of typeDefs, validate against each one.
  var ok = false
    , types = Object.keys(typeDefs)
  for (var i = 0, l = types.length; i < l; i ++) {
    debug("test type %j %j %j", k, val, types[i])
    var t = typeDefs[types[i]]
    if (t &&
      ((type && type.name && t.type && t.type.name) ? (type.name === t.type.name) : (type === t.type))) {
      var d = {}
      ok = false !== t.validate(d, k, val)
      val = d[k]
      if (ok) {
        // if (isArray) (data[k] = data[k] || []).push(val)
        // else data[k] = val
        data[k] = val
        break
      }
    }
  }
  debug("OK? %j (%j %j %j)", ok, k, val, types[i])

  if (!ok) delete data[k]
  return ok
}

function parse (args, data, remain, types, shorthands) {
  debug("parse", args, data, remain)

  var key = null
    , abbrevs = abbrev(Object.keys(types))
    , shortAbbr = abbrev(Object.keys(shorthands))

  for (var i = 0; i < args.length; i ++) {
    var arg = args[i]
    debug("arg", arg)

    if (arg.match(/^-{2,}$/)) {
      // done with keys.
      // the rest are args.
      remain.push.apply(remain, args.slice(i + 1))
      args[i] = "--"
      break
    }
    var hadEq = false
    if (arg.charAt(0) === "-" && arg.length > 1) {
      var at = arg.indexOf('=')
      if (at > -1) {
        hadEq = true
        var v = arg.substr(at + 1)
        arg = arg.substr(0, at)
        args.splice(i, 1, arg, v)
      }

      // see if it's a shorthand
      // if so, splice and back up to re-parse it.
      var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs)
      debug("arg=%j shRes=%j", arg, shRes)
      if (shRes) {
        debug(arg, shRes)
        args.splice.apply(args, [i, 1].concat(shRes))
        if (arg !== shRes[0]) {
          i --
          continue
        }
      }
      arg = arg.replace(/^-+/, "")
      var no = null
      while (arg.toLowerCase().indexOf("no-") === 0) {
        no = !no
        arg = arg.substr(3)
      }

      if (abbrevs[arg]) arg = abbrevs[arg]

      var argType = types[arg]
      var isTypeArray = Array.isArray(argType)
      if (isTypeArray && argType.length === 1) {
        isTypeArray = false
        argType = argType[0]
      }

      var isArray = argType === Array ||
        isTypeArray && argType.indexOf(Array) !== -1

      // allow unknown things to be arrays if specified multiple times.
      if (!types.hasOwnProperty(arg) && data.hasOwnProperty(arg)) {
        if (!Array.isArray(data[arg]))
          data[arg] = [data[arg]]
        isArray = true
      }

      var val
        , la = args[i + 1]

      var isBool = typeof no === 'boolean' ||
        argType === Boolean ||
        isTypeArray && argType.indexOf(Boolean) !== -1 ||
        (typeof argType === 'undefined' && !hadEq) ||
        (la === "false" &&
         (argType === null ||
          isTypeArray && ~argType.indexOf(null)))

      if (isBool) {
        // just set and move along
        val = !no
        // however, also support --bool true or --bool false
        if (la === "true" || la === "false") {
          val = JSON.parse(la)
          la = null
          if (no) val = !val
          i ++
        }

        // also support "foo":[Boolean, "bar"] and "--foo bar"
        if (isTypeArray && la) {
          if (~argType.indexOf(la)) {
            // an explicit type
            val = la
            i ++
          } else if ( la === "null" && ~argType.indexOf(null) ) {
            // null allowed
            val = null
            i ++
          } else if ( !la.match(/^-{2,}[^-]/) &&
                      !isNaN(la) &&
                      ~argType.indexOf(Number) ) {
            // number
            val = +la
            i ++
          } else if ( !la.match(/^-[^-]/) && ~argType.indexOf(String) ) {
            // string
            val = la
            i ++
          }
        }

        if (isArray) (data[arg] = data[arg] || []).push(val)
        else data[arg] = val

        continue
      }

      if (argType === String) {
        if (la === undefined) {
          la = ""
        } else if (la.match(/^-{1,2}[^-]+/)) {
          la = ""
          i --
        }
      }

      if (la && la.match(/^-{2,}$/)) {
        la = undefined
        i --
      }

      val = la === undefined ? true : la
      if (isArray) (data[arg] = data[arg] || []).push(val)
      else data[arg] = val

      i ++
      continue
    }
    remain.push(arg)
  }
}

function resolveShort (arg, shorthands, shortAbbr, abbrevs) {
  // handle single-char shorthands glommed together, like
  // npm ls -glp, but only if there is one dash, and only if
  // all of the chars are single-char shorthands, and it's
  // not a match to some other abbrev.
  arg = arg.replace(/^-+/, '')

  // if it's an exact known option, then don't go any further
  if (abbrevs[arg] === arg)
    return null

  // if it's an exact known shortopt, same deal
  if (shorthands[arg]) {
    // make it an array, if it's a list of words
    if (shorthands[arg] && !Array.isArray(shorthands[arg]))
      shorthands[arg] = shorthands[arg].split(/\s+/)

    return shorthands[arg]
  }

  // first check to see if this arg is a set of single-char shorthands
  var singles = shorthands.___singles
  if (!singles) {
    singles = Object.keys(shorthands).filter(function (s) {
      return s.length === 1
    }).reduce(function (l,r) {
      l[r] = true
      return l
    }, {})
    shorthands.___singles = singles
    debug('shorthand singles', singles)
  }

  var chrs = arg.split("").filter(function (c) {
    return singles[c]
  })

  if (chrs.join("") === arg) return chrs.map(function (c) {
    return shorthands[c]
  }).reduce(function (l, r) {
    return l.concat(r)
  }, [])


  // if it's an arg abbrev, and not a literal shorthand, then prefer the arg
  if (abbrevs[arg] && !shorthands[arg])
    return null

  // if it's an abbr for a shorthand, then use that
  if (shortAbbr[arg])
    arg = shortAbbr[arg]

  // make it an array, if it's a list of words
  if (shorthands[arg] && !Array.isArray(shorthands[arg]))
    shorthands[arg] = shorthands[arg].split(/\s+/)

  return shorthands[arg]
}
#!/usr/bin/env node
var nopt = require("../lib/nopt")
  , path = require("path")
  , types = { num: Number
            , bool: Boolean
            , help: Boolean
            , list: Array
            , "num-list": [Number, Array]
            , "str-list": [String, Array]
            , "bool-list": [Boolean, Array]
            , str: String
            , clear: Boolean
            , config: Boolean
            , length: Number
            , file: path
            }
  , shorthands = { s: [ "--str", "astring" ]
                 , b: [ "--bool" ]
                 , nb: [ "--no-bool" ]
                 , tft: [ "--bool-list", "--no-bool-list", "--bool-list", "true" ]
                 , "?": ["--help"]
                 , h: ["--help"]
                 , H: ["--help"]
                 , n: [ "--num", "125" ]
                 , c: ["--config"]
                 , l: ["--length"]
                 , f: ["--file"]
                 }
  , parsed = nopt( types
                 , shorthands
                 , process.argv
                 , 2 )

console.log("parsed", parsed)

if (parsed.help) {
  console.log("")
  console.log("nopt cli tester")
  console.log("")
  console.log("types")
  console.log(Object.keys(types).map(function M (t) {
    var type = types[t]
    if (Array.isArray(type)) {
      return [t, type.map(function (type) { return type.name })]
    }
    return [t, type && type.name]
  }).reduce(function (s, i) {
    s[i[0]] = i[1]
    return s
  }, {}))
  console.log("")
  console.log("shorthands")
  console.log(shorthands)
}
# Names sorted by how much code was originally theirs.
Isaac Z. Schlueter <i@izs.me>
Meryn Stol <merynstol@gmail.com>
Robert Kowalski <rok@kowalski.gd>
This package contains code originally written by Isaac Z. Schlueter.
Used with permission.

Copyright (c) Meryn Stol ("Author")
All rights reserved.

The BSD License

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
  "author": {
    "name": "Meryn Stol",
    "email": "merynstol@gmail.com"
  },
  "dependencies": {
    "hosted-git-info": "^2.1.4",
    "resolve": "^1.10.0",
    "semver": "2 || 3 || 4 || 5",
    "validate-npm-package-license": "^3.0.1"
  },
  "deprecated": false,
  "description": "Normalizes data that can be found in package.json files.",
  "devDependencies": {
    "async": "^2.6.1",
    "tap": "^12.4.0",
    "underscore": "^1.8.3"
  },
  "files": [
    "lib/*.js",
    "lib/*.json",
    "AUTHORS"
  ],
  "homepage": "https://github.com/npm/normalize-package-data#readme",
  "license": "BSD-2-Clause",
  "main": "lib/normalize.js",
  "name": "normalize-package-data",
  "repository": {
    "type": "git",
    "url": "git://github.com/npm/normalize-package-data.git"
  },
  "version": "2.5.0"
}module.exports = extractDescription

// Extracts description from contents of a readme file in markdown format
function extractDescription (d) {
  if (!d) return;
  if (d === "ERROR: No README data found!") return;
  // the first block of text before the first heading
  // that isn't the first line heading
  d = d.trim().split('\n')
  for (var s = 0; d[s] && d[s].trim().match(/^(#|$)/); s ++);
  var l = d.length
  for (var e = s + 1; e < l && d[e].trim(); e ++);
  return d.slice(s, e).join(' ').trim()
}
var semver = require("semver")
var validateLicense = require('validate-npm-package-license');
var hostedGitInfo = require("hosted-git-info")
var isBuiltinModule = require("resolve").isCore
var depTypes = ["dependencies","devDependencies","optionalDependencies"]
var extractDescription = require("./extract_description")
var url = require("url")
var typos = require("./typos.json")

var fixer = module.exports = {
  // default warning function
  warn: function() {},

  fixRepositoryField: function(data) {
    if (data.repositories) {
      this.warn("repositories");
      data.repository = data.repositories[0]
    }
    if (!data.repository) return this.warn("missingRepository")
    if (typeof data.repository === "string") {
      data.repository = {
        type: "git",
        url: data.repository
      }
    }
    var r = data.repository.url || ""
    if (r) {
      var hosted = hostedGitInfo.fromUrl(r)
      if (hosted) {
        r = data.repository.url
          = hosted.getDefaultRepresentation() == "shortcut" ? hosted.https() : hosted.toString()
      }
    }

    if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) {
      this.warn("brokenGitUrl", r)
    }
  }

, fixTypos: function(data) {
    Object.keys(typos.topLevel).forEach(function (d) {
      if (data.hasOwnProperty(d)) {
        this.warn("typo", d, typos.topLevel[d])
      }
    }, this)
  }

, fixScriptsField: function(data) {
    if (!data.scripts) return
    if (typeof data.scripts !== "object") {
      this.warn("nonObjectScripts")
      delete data.scripts
      return
    }
    Object.keys(data.scripts).forEach(function (k) {
      if (typeof data.scripts[k] !== "string") {
        this.warn("nonStringScript")
        delete data.scripts[k]
      } else if (typos.script[k] && !data.scripts[typos.script[k]]) {
        this.warn("typo", k, typos.script[k], "scripts")
      }
    }, this)
  }

, fixFilesField: function(data) {
    var files = data.files
    if (files && !Array.isArray(files)) {
      this.warn("nonArrayFiles")
      delete data.files
    } else if (data.files) {
      data.files = data.files.filter(function(file) {
        if (!file || typeof file !== "string") {
          this.warn("invalidFilename", file)
          return false
        } else {
          return true
        }
      }, this)
    }
  }

, fixBinField: function(data) {
    if (!data.bin) return;
    if (typeof data.bin === "string") {
      var b = {}
      var match
      if (match = data.name.match(/^@[^/]+[/](.*)$/)) {
        b[match[1]] = data.bin
      } else {
        b[data.name] = data.bin
      }
      data.bin = b
    }
  }

, fixManField: function(data) {
    if (!data.man) return;
    if (typeof data.man === "string") {
      data.man = [ data.man ]
    }
  }
, fixBundleDependenciesField: function(data) {
    var bdd = "bundledDependencies"
    var bd = "bundleDependencies"
    if (data[bdd] && !data[bd]) {
      data[bd] = data[bdd]
      delete data[bdd]
    }
    if (data[bd] && !Array.isArray(data[bd])) {
      this.warn("nonArrayBundleDependencies")
      delete data[bd]
    } else if (data[bd]) {
      data[bd] = data[bd].filter(function(bd) {
        if (!bd || typeof bd !== 'string') {
          this.warn("nonStringBundleDependency", bd)
          return false
        } else {
          if (!data.dependencies) {
            data.dependencies = {}
          }
          if (!data.dependencies.hasOwnProperty(bd)) {
            this.warn("nonDependencyBundleDependency", bd)
            data.dependencies[bd] = "*"
          }
          return true
        }
      }, this)
    }
  }

, fixDependencies: function(data, strict) {
    var loose = !strict
    objectifyDeps(data, this.warn)
    addOptionalDepsToDeps(data, this.warn)
    this.fixBundleDependenciesField(data)

    ;['dependencies','devDependencies'].forEach(function(deps) {
      if (!(deps in data)) return
      if (!data[deps] || typeof data[deps] !== "object") {
        this.warn("nonObjectDependencies", deps)
        delete data[deps]
        return
      }
      Object.keys(data[deps]).forEach(function (d) {
        var r = data[deps][d]
        if (typeof r !== 'string') {
          this.warn("nonStringDependency", d, JSON.stringify(r))
          delete data[deps][d]
        }
        var hosted = hostedGitInfo.fromUrl(data[deps][d])
        if (hosted) data[deps][d] = hosted.toString()
      }, this)
    }, this)
  }

, fixModulesField: function (data) {
    if (data.modules) {
      this.warn("deprecatedModules")
      delete data.modules
    }
  }

, fixKeywordsField: function (data) {
    if (typeof data.keywords === "string") {
      data.keywords = data.keywords.split(/,\s+/)
    }
    if (data.keywords && !Array.isArray(data.keywords)) {
      delete data.keywords
      this.warn("nonArrayKeywords")
    } else if (data.keywords) {
      data.keywords = data.keywords.filter(function(kw) {
        if (typeof kw !== "string" || !kw) {
          this.warn("nonStringKeyword");
          return false
        } else {
          return true
        }
      }, this)
    }
  }

, fixVersionField: function(data, strict) {
    // allow "loose" semver 1.0 versions in non-strict mode
    // enforce strict semver 2.0 compliance in strict mode
    var loose = !strict
    if (!data.version) {
      data.version = ""
      return true
    }
    if (!semver.valid(data.version, loose)) {
      throw new Error('Invalid version: "'+ data.version + '"')
    }
    data.version = semver.clean(data.version, loose)
    return true
  }

, fixPeople: function(data) {
    modifyPeople(data, unParsePerson)
    modifyPeople(data, parsePerson)
  }

, fixNameField: function(data, options) {
    if (typeof options === "boolean") options = {strict: options}
    else if (typeof options === "undefined") options = {}
    var strict = options.strict
    if (!data.name && !strict) {
      data.name = ""
      return
    }
    if (typeof data.name !== "string") {
      throw new Error("name field must be a string.")
    }
    if (!strict)
      data.name = data.name.trim()
    ensureValidName(data.name, strict, options.allowLegacyCase)
    if (isBuiltinModule(data.name))
      this.warn("conflictingName", data.name)
  }


, fixDescriptionField: function (data) {
    if (data.description && typeof data.description !== 'string') {
      this.warn("nonStringDescription")
      delete data.description
    }
    if (data.readme && !data.description)
      data.description = extractDescription(data.readme)
      if(data.description === undefined) delete data.description;
    if (!data.description) this.warn("missingDescription")
  }

, fixReadmeField: function (data) {
    if (!data.readme) {
      this.warn("missingReadme")
      data.readme = "ERROR: No README data found!"
    }
  }

, fixBugsField: function(data) {
    if (!data.bugs && data.repository && data.repository.url) {
      var hosted = hostedGitInfo.fromUrl(data.repository.url)
      if(hosted && hosted.bugs()) {
        data.bugs = {url: hosted.bugs()}
      }
    }
    else if(data.bugs) {
      var emailRe = /^.+@.*\..+$/
      if(typeof data.bugs == "string") {
        if(emailRe.test(data.bugs))
          data.bugs = {email:data.bugs}
        else if(url.parse(data.bugs).protocol)
          data.bugs = {url: data.bugs}
        else
          this.warn("nonEmailUrlBugsString")
      }
      else {
        bugsTypos(data.bugs, this.warn)
        var oldBugs = data.bugs
        data.bugs = {}
        if(oldBugs.url) {
          if(typeof(oldBugs.url) == "string" && url.parse(oldBugs.url).protocol)
            data.bugs.url = oldBugs.url
          else
            this.warn("nonUrlBugsUrlField")
        }
        if(oldBugs.email) {
          if(typeof(oldBugs.email) == "string" && emailRe.test(oldBugs.email))
            data.bugs.email = oldBugs.email
          else
            this.warn("nonEmailBugsEmailField")
        }
      }
      if(!data.bugs.email && !data.bugs.url) {
        delete data.bugs
        this.warn("emptyNormalizedBugs")
      }
    }
  }

, fixHomepageField: function(data) {
    if (!data.homepage && data.repository && data.repository.url) {
      var hosted = hostedGitInfo.fromUrl(data.repository.url)
      if (hosted && hosted.docs()) data.homepage = hosted.docs()
    }
    if (!data.homepage) return

    if(typeof data.homepage !== "string") {
      this.warn("nonUrlHomepage")
      return delete data.homepage
    }
    if(!url.parse(data.homepage).protocol) {
      data.homepage = "http://" + data.homepage
    }
  }

, fixLicenseField: function(data) {
    if (!data.license) {
      return this.warn("missingLicense")
    } else{
      if (
        typeof(data.license) !== 'string' ||
        data.license.length < 1 ||
        data.license.trim() === ''
      ) {
        this.warn("invalidLicense")
      } else {
        if (!validateLicense(data.license).validForNewPackages)
          this.warn("invalidLicense")
      }
    }
  }
}

function isValidScopedPackageName(spec) {
  if (spec.charAt(0) !== '@') return false

  var rest = spec.slice(1).split('/')
  if (rest.length !== 2) return false

  return rest[0] && rest[1] &&
    rest[0] === encodeURIComponent(rest[0]) &&
    rest[1] === encodeURIComponent(rest[1])
}

function isCorrectlyEncodedName(spec) {
  return !spec.match(/[\/@\s\+%:]/) &&
    spec === encodeURIComponent(spec)
}

function ensureValidName (name, strict, allowLegacyCase) {
  if (name.charAt(0) === "." ||
      !(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) ||
      (strict && (!allowLegacyCase) && name !== name.toLowerCase()) ||
      name.toLowerCase() === "node_modules" ||
      name.toLowerCase() === "favicon.ico") {
        throw new Error("Invalid name: " + JSON.stringify(name))
  }
}

function modifyPeople (data, fn) {
  if (data.author) data.author = fn(data.author)
  ;["maintainers", "contributors"].forEach(function (set) {
    if (!Array.isArray(data[set])) return;
    data[set] = data[set].map(fn)
  })
  return data
}

function unParsePerson (person) {
  if (typeof person === "string") return person
  var name = person.name || ""
  var u = person.url || person.web
  var url = u ? (" ("+u+")") : ""
  var e = person.email || person.mail
  var email = e ? (" <"+e+">") : ""
  return name+email+url
}

function parsePerson (person) {
  if (typeof person !== "string") return person
  var name = person.match(/^([^\(<]+)/)
  var url = person.match(/\(([^\)]+)\)/)
  var email = person.match(/<([^>]+)>/)
  var obj = {}
  if (name && name[0].trim()) obj.name = name[0].trim()
  if (email) obj.email = email[1];
  if (url) obj.url = url[1];
  return obj
}

function addOptionalDepsToDeps (data, warn) {
  var o = data.optionalDependencies
  if (!o) return;
  var d = data.dependencies || {}
  Object.keys(o).forEach(function (k) {
    d[k] = o[k]
  })
  data.dependencies = d
}

function depObjectify (deps, type, warn) {
  if (!deps) return {}
  if (typeof deps === "string") {
    deps = deps.trim().split(/[\n\r\s\t ,]+/)
  }
  if (!Array.isArray(deps)) return deps
  warn("deprecatedArrayDependencies", type)
  var o = {}
  deps.filter(function (d) {
    return typeof d === "string"
  }).forEach(function(d) {
    d = d.trim().split(/(:?[@\s><=])/)
    var dn = d.shift()
    var dv = d.join("")
    dv = dv.trim()
    dv = dv.replace(/^@/, "")
    o[dn] = dv
  })
  return o
}

function objectifyDeps (data, warn) {
  depTypes.forEach(function (type) {
    if (!data[type]) return;
    data[type] = depObjectify(data[type], type, warn)
  })
}

function bugsTypos(bugs, warn) {
  if (!bugs) return
  Object.keys(bugs).forEach(function (k) {
    if (typos.bugs[k]) {
      warn("typo", k, typos.bugs[k], "bugs")
      bugs[typos.bugs[k]] = bugs[k]
      delete bugs[k]
    }
  })
}
var util = require("util")
var messages = require("./warning_messages.json")

module.exports = function() {
  var args = Array.prototype.slice.call(arguments, 0)
  var warningName = args.shift()
  if (warningName == "typo") {
    return makeTypoWarning.apply(null,args)
  }
  else {
    var msgTemplate = messages[warningName] ? messages[warningName] : warningName + ": '%s'"
    args.unshift(msgTemplate)
    return util.format.apply(null, args)
  }
}

function makeTypoWarning (providedName, probableName, field) {
  if (field) {
    providedName = field + "['" + providedName + "']"
    probableName = field + "['" + probableName + "']"
  }
  return util.format(messages.typo, providedName, probableName)
}
module.exports = normalize

var fixer = require("./fixer")
normalize.fixer = fixer

var makeWarning = require("./make_warning")

var fieldsToFix = ['name','version','description','repository','modules','scripts'
                  ,'files','bin','man','bugs','keywords','readme','homepage','license']
var otherThingsToFix = ['dependencies','people', 'typos']

var thingsToFix = fieldsToFix.map(function(fieldName) {
  return ucFirst(fieldName) + "Field"
})
// two ways to do this in CoffeeScript on only one line, sub-70 chars:
// thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field"
// thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix)
thingsToFix = thingsToFix.concat(otherThingsToFix)

function normalize (data, warn, strict) {
  if(warn === true) warn = null, strict = true
  if(!strict) strict = false
  if(!warn || data.private) warn = function(msg) { /* noop */ }

  if (data.scripts &&
      data.scripts.install === "node-gyp rebuild" &&
      !data.scripts.preinstall) {
    data.gypfile = true
  }
  fixer.warn = function() { warn(makeWarning.apply(null, arguments)) }
  thingsToFix.forEach(function(thingName) {
    fixer["fix" + ucFirst(thingName)](data, strict)
  })
  data._id = data.name + "@" + data.version
}

function ucFirst (string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}
var util = require('util')

module.exports = function() {
  var args = Array.prototype.slice.call(arguments, 0)
  args.forEach(function(arg) {
    if (!arg) throw new TypeError('Bad arguments.')
  })
  return util.format.apply(null, arguments)
}
{
  "topLevel": {
    "dependancies": "dependencies"
   ,"dependecies": "dependencies"
   ,"depdenencies": "dependencies"
   ,"devEependencies": "devDependencies"
   ,"depends": "dependencies"
   ,"dev-dependencies": "devDependencies"
   ,"devDependences": "devDependencies"
   ,"devDepenencies": "devDependencies"
   ,"devdependencies": "devDependencies"
   ,"repostitory": "repository"
   ,"repo": "repository"
   ,"prefereGlobal": "preferGlobal"
   ,"hompage": "homepage"
   ,"hampage": "homepage"
   ,"autohr": "author"
   ,"autor": "author"
   ,"contributers": "contributors"
   ,"publicationConfig": "publishConfig"
   ,"script": "scripts"
  },
  "bugs": { "web": "url", "name": "url" },
  "script": { "server": "start", "tests": "test" }
}
{
  "repositories": "'repositories' (plural) Not supported. Please pick one as the 'repository' field"
  ,"missingRepository": "No repository field."
  ,"brokenGitUrl": "Probably broken git url: %s"
  ,"nonObjectScripts": "scripts must be an object"
  ,"nonStringScript": "script values must be string commands"
  ,"nonArrayFiles": "Invalid 'files' member"
  ,"invalidFilename": "Invalid filename in 'files' list: %s"
  ,"nonArrayBundleDependencies": "Invalid 'bundleDependencies' list. Must be array of package names"
  ,"nonStringBundleDependency": "Invalid bundleDependencies member: %s"
  ,"nonDependencyBundleDependency": "Non-dependency in bundleDependencies: %s"
  ,"nonObjectDependencies": "%s field must be an object"
  ,"nonStringDependency": "Invalid dependency: %s %s"
  ,"deprecatedArrayDependencies": "specifying %s as array is deprecated"
  ,"deprecatedModules": "modules field is deprecated"
  ,"nonArrayKeywords": "keywords should be an array of strings"
  ,"nonStringKeyword": "keywords should be an array of strings"
  ,"conflictingName": "%s is also the name of a node core module."
  ,"nonStringDescription": "'description' field should be a string"
  ,"missingDescription": "No description"
  ,"missingReadme": "No README data"
  ,"missingLicense": "No license field."
  ,"nonEmailUrlBugsString": "Bug string field must be url, email, or {email,url}"
  ,"nonUrlBugsUrlField": "bugs.url field must be a string url. Deleted."
  ,"nonEmailBugsEmailField": "bugs.email field must be a string email. Deleted."
  ,"emptyNormalizedBugs": "Normalized value of bugs field is an empty object. Deleted."
  ,"nonUrlHomepage": "homepage field must be a string url. Deleted."
  ,"invalidLicense": "license should be a valid SPDX license expression"
  ,"typo": "%s should probably be %s."
}
'use strict';
// TODO: Use the `URL` global when targeting Node.js 10
const URLParser = typeof URL === 'undefined' ? require('url').URL : URL;

// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs
const DATA_URL_DEFAULT_MIME_TYPE = 'text/plain';
const DATA_URL_DEFAULT_CHARSET = 'us-ascii';

const testParameter = (name, filters) => {
	return filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);
};

const normalizeDataURL = (urlString, {stripHash}) => {
	const parts = urlString.match(/^data:(.*?),(.*?)(?:#(.*))?$/);

	if (!parts) {
		throw new Error(`Invalid URL: ${urlString}`);
	}

	const mediaType = parts[1].split(';');
	const body = parts[2];
	const hash = stripHash ? '' : parts[3];

	let base64 = false;

	if (mediaType[mediaType.length - 1] === 'base64') {
		mediaType.pop();
		base64 = true;
	}

	// Lowercase MIME type
	const mimeType = (mediaType.shift() || '').toLowerCase();
	const attributes = mediaType
		.map(attribute => {
			let [key, value = ''] = attribute.split('=').map(string => string.trim());

			// Lowercase `charset`
			if (key === 'charset') {
				value = value.toLowerCase();

				if (value === DATA_URL_DEFAULT_CHARSET) {
					return '';
				}
			}

			return `${key}${value ? `=${value}` : ''}`;
		})
		.filter(Boolean);

	const normalizedMediaType = [
		...attributes
	];

	if (base64) {
		normalizedMediaType.push('base64');
	}

	if (normalizedMediaType.length !== 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) {
		normalizedMediaType.unshift(mimeType);
	}

	return `data:${normalizedMediaType.join(';')},${base64 ? body.trim() : body}${hash ? `#${hash}` : ''}`;
};

const normalizeUrl = (urlString, options) => {
	options = {
		defaultProtocol: 'http:',
		normalizeProtocol: true,
		forceHttp: false,
		forceHttps: false,
		stripAuthentication: true,
		stripHash: false,
		stripWWW: true,
		removeQueryParameters: [/^utm_\w+/i],
		removeTrailingSlash: true,
		removeDirectoryIndex: false,
		sortQueryParameters: true,
		...options
	};

	// TODO: Remove this at some point in the future
	if (Reflect.has(options, 'normalizeHttps')) {
		throw new Error('options.normalizeHttps is renamed to options.forceHttp');
	}

	if (Reflect.has(options, 'normalizeHttp')) {
		throw new Error('options.normalizeHttp is renamed to options.forceHttps');
	}

	if (Reflect.has(options, 'stripFragment')) {
		throw new Error('options.stripFragment is renamed to options.stripHash');
	}

	urlString = urlString.trim();

	// Data URL
	if (/^data:/i.test(urlString)) {
		return normalizeDataURL(urlString, options);
	}

	const hasRelativeProtocol = urlString.startsWith('//');
	const isRelativeUrl = !hasRelativeProtocol && /^\.*\//.test(urlString);

	// Prepend protocol
	if (!isRelativeUrl) {
		urlString = urlString.replace(/^(?!(?:\w+:)?\/\/)|^\/\//, options.defaultProtocol);
	}

	const urlObj = new URLParser(urlString);

	if (options.forceHttp && options.forceHttps) {
		throw new Error('The `forceHttp` and `forceHttps` options cannot be used together');
	}

	if (options.forceHttp && urlObj.protocol === 'https:') {
		urlObj.protocol = 'http:';
	}

	if (options.forceHttps && urlObj.protocol === 'http:') {
		urlObj.protocol = 'https:';
	}

	// Remove auth
	if (options.stripAuthentication) {
		urlObj.username = '';
		urlObj.password = '';
	}

	// Remove hash
	if (options.stripHash) {
		urlObj.hash = '';
	}

	// Remove duplicate slashes if not preceded by a protocol
	if (urlObj.pathname) {
		// TODO: Use the following instead when targeting Node.js 10
		// `urlObj.pathname = urlObj.pathname.replace(/(?<!https?:)\/{2,}/g, '/');`
		urlObj.pathname = urlObj.pathname.replace(/((?!:).|^)\/{2,}/g, (_, p1) => {
			if (/^(?!\/)/g.test(p1)) {
				return `${p1}/`;
			}

			return '/';
		});
	}

	// Decode URI octets
	if (urlObj.pathname) {
		urlObj.pathname = decodeURI(urlObj.pathname);
	}

	// Remove directory index
	if (options.removeDirectoryIndex === true) {
		options.removeDirectoryIndex = [/^index\.[a-z]+$/];
	}

	if (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) {
		let pathComponents = urlObj.pathname.split('/');
		const lastComponent = pathComponents[pathComponents.length - 1];

		if (testParameter(lastComponent, options.removeDirectoryIndex)) {
			pathComponents = pathComponents.slice(0, pathComponents.length - 1);
			urlObj.pathname = pathComponents.slice(1).join('/') + '/';
		}
	}

	if (urlObj.hostname) {
		// Remove trailing dot
		urlObj.hostname = urlObj.hostname.replace(/\.$/, '');

		// Remove `www.`
		if (options.stripWWW && /^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(urlObj.hostname)) {
			// Each label should be max 63 at length (min: 2).
			// The extension should be max 5 at length (min: 2).
			// Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names
			urlObj.hostname = urlObj.hostname.replace(/^www\./, '');
		}
	}

	// Remove query unwanted parameters
	if (Array.isArray(options.removeQueryParameters)) {
		for (const key of [...urlObj.searchParams.keys()]) {
			if (testParameter(key, options.removeQueryParameters)) {
				urlObj.searchParams.delete(key);
			}
		}
	}

	// Sort query parameters
	if (options.sortQueryParameters) {
		urlObj.searchParams.sort();
	}

	if (options.removeTrailingSlash) {
		urlObj.pathname = urlObj.pathname.replace(/\/$/, '');
	}

	// Take advantage of many of the Node `url` normalizations
	urlString = urlObj.toString();

	// Remove ending `/`
	if ((options.removeTrailingSlash || urlObj.pathname === '/') && urlObj.hash === '') {
		urlString = urlString.replace(/\/$/, '');
	}

	// Restore relative protocol, if applicable
	if (hasRelativeProtocol && !options.normalizeProtocol) {
		urlString = urlString.replace(/^http:\/\//, '//');
	}

	// Remove http/https
	if (options.stripProtocol) {
		urlString = urlString.replace(/^(?:https?:)?\/\//, '');
	}

	return urlString;
};

module.exports = normalizeUrl;
// TODO: Remove this for the next major release
module.exports.default = normalizeUrl;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Normalize a URL",
  "devDependencies": {
    "ava": "^2.4.0",
    "coveralls": "^3.0.6",
    "nyc": "^14.1.1",
    "tsd": "^0.8.0",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/sindresorhus/normalize-url#readme",
  "license": "MIT",
  "name": "normalize-url",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/normalize-url.git"
  },
  "version": "4.5.0"
}'use strict';
const path = require('path');
const pathKey = require('path-key');

module.exports = opts => {
	opts = Object.assign({
		cwd: process.cwd(),
		path: process.env[pathKey()]
	}, opts);

	let prev;
	let pth = path.resolve(opts.cwd);
	const ret = [];

	while (prev !== pth) {
		ret.push(path.join(pth, 'node_modules/.bin'));
		prev = pth;
		pth = path.resolve(pth, '..');
	}

	// ensure the running `node` binary is used
	ret.push(path.dirname(process.execPath));

	return ret.concat(opts.path).join(path.delimiter);
};

module.exports.env = opts => {
	opts = Object.assign({
		env: process.env
	}, opts);

	const env = Object.assign({}, opts.env);
	const path = pathKey({env});

	opts.path = env[path];
	env[path] = module.exports(opts);

	return env;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "path-key": "^2.0.0"
  },
  "deprecated": false,
  "description": "Get your PATH prepended with locally installed binaries",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/npm-run-path#readme",
  "license": "MIT",
  "name": "npm-run-path",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/npm-run-path.git"
  },
  "version": "2.0.2"
}#!/usr/bin/env node

var fs = require('fs')
var path = require('path')
var nugget = require('./')
var args = require('minimist')(process.argv.slice(2))

var urls = args._
if (urls.length === 0) {
  console.log(fs.readFileSync(path.join(__dirname, 'usage.txt')).toString())
  process.exit(1)
}

var opts = {
  target: args.o || args.O || args.out,
  dir: args.d || args.dir,
  resume: args.c || args.continue,
  force: args.f || args.force,
  sockets: args.s || args.sockets,
  quiet: args.q || args.quiet,
  frequency: args.frequency ? +args.frequency : null,
  proxy: args.proxy ? args.proxy : null,
  strictSSL: args['strict-ssl']
}

nugget(urls, opts, function (err) {
  if (err) {
    console.error('Error:', err)
    process.exit(1)
  }
  process.exit(0)
})
## Collaborators

nugget is only possible due to the excellent work of the following collaborators:

<table><tbody><tr><th align="left">maxogden</th><td><a href="https://github.com/maxogden">GitHub/maxogden</a></td></tr>
<tr><th align="left">grncdr</th><td><a href="https://github.com/grncdr">GitHub/grncdr</a></td></tr>
<tr><th align="left">mafintosh</th><td><a href="https://github.com/mafintosh">GitHub/mafintosh</a></td></tr>
<tr><th align="left">jlord</th><td><a href="https://github.com/jlord">GitHub/jlord</a></td></tr>
</tbody></table>
var request = require('request')
var fs = require('fs')
var path = require('path')
var log = require('single-line-log').stdout
var progress = require('progress-stream')
var prettyBytes = require('pretty-bytes')
var throttle = require('throttleit')
var EventEmitter = require('events').EventEmitter
var debug = require('debug')('nugget')

function noop () {}

module.exports = function (urls, opts, cb) {
  if (!Array.isArray(urls)) urls = [urls]
  if (urls.length === 1) opts.singleTarget = true

  var defaultProps = {}

  if (opts.sockets) {
    var sockets = +opts.sockets
    defaultProps.pool = {maxSockets: sockets}
  }

  if (opts.proxy) {
    defaultProps.proxy = opts.proxy
  }

  if (opts.strictSSL !== null) {
    defaultProps.strictSSL = opts.strictSSL
  }

  if (Object.keys(defaultProps).length > 0) {
    request = request.defaults(defaultProps)
  }

  var downloads = []
  var errors = []
  var pending = 0
  var truncated = urls.length * 2 >= (process.stdout.rows - 15)

  urls.forEach(function (url) {
    debug('start dl', url)
    pending++
    var dl = startDownload(url, opts, function done (err) {
      debug('done dl', url, pending)
      if (err) {
        debug('error dl', url, err)
        errors.push(err)
        dl.error = err.message
      }
      if (truncated) {
        var i = downloads.indexOf(dl)
        downloads.splice(i, 1)
        downloads.push(dl)
      }
      if (--pending === 0) {
        render()
        cb(errors.length ? errors : undefined)
      }
    })

    downloads.push(dl)

    dl.on('start', function (progressStream) {
      throttledRender()
    })

    dl.on('progress', function (data) {
      debug('progress', url, data.percentage)

      dl.speed = data.speed
      if (dl.percentage === 100) render()
      else throttledRender()
    })
  })

  var _log = opts.quiet ? noop : log
  render()
  var throttledRender = throttle(render, opts.frequency || 250)

  if (opts.singleTarget) return downloads[0]
  else return downloads

  function render () {
    var height = process.stdout.rows
    var rendered = 0
    var output = ''
    var totalSpeed = 0
    downloads.forEach(function (dl) {
      if (2 * rendered >= height - 15) return
      rendered++
      if (dl.error) {
        output += 'Downloading ' + path.basename(dl.target) + '\n'
        output += 'Error: ' + dl.error + '\n'
        return
      }
      var pct = dl.percentage
      var speed = dl.speed
      var total = dl.fileSize
      totalSpeed += speed
      var bar = Array(Math.floor(45 * pct / 100)).join('=') + '>'
      while (bar.length < 45) bar += ' '
      output += 'Downloading ' + path.basename(dl.target) + '\n' +
      '[' + bar + '] ' + pct.toFixed(1) + '%'
      if (total) output += ' of ' + prettyBytes(total)
      output += ' (' + prettyBytes(speed) + '/s)\n'
    })
    if (rendered < downloads.length) output += '\n... and ' + (downloads.length - rendered) + ' more\n'
    if (downloads.length > 1) output += '\nCombined Speed: ' + prettyBytes(totalSpeed) + '/s\n'
    _log(output)
  }

  function startDownload (url, opts, cb) {
    var targetName = path.basename(url).split('?')[0]
    if (opts.singleTarget && opts.target) targetName = opts.target
    var target = path.resolve(opts.dir || process.cwd(), targetName)
    if (opts.resume) {
      resume(url, opts, cb)
    } else {
      download(url, opts, cb)
    }

    var progressEmitter = new EventEmitter()
    progressEmitter.target = target
    progressEmitter.speed = 0
    progressEmitter.percentage = 0

    return progressEmitter

    function resume (url, opts, cb) {
      fs.stat(target, function (err, stats) {
        if (err && err.code === 'ENOENT') {
          return download(url, opts, cb)
        }
        if (err) {
          return cb(err)
        }
        var offset = stats.size
        var req = request.get(url)

        req.on('error', cb)
        req.on('response', function (resp) {
          resp.destroy()

          var length = parseInt(resp.headers['content-length'], 10)

          // file is already downloaded.
          if (length === offset) return cb()

          if (!isNaN(length) && length > offset && /bytes/.test(resp.headers['accept-ranges'])) {
            opts.range = [offset, length]
          }

          download(url, opts, cb)
        })
      })
    }

    function download (url, opts, cb) {
      var headers = opts.headers || {}
      if (opts.range) {
        headers.Range = 'bytes=' + opts.range[0] + '-' + opts.range[1]
      }
      var read = request(url, { headers: headers })

      read.on('error', cb)
      read.on('response', function (resp) {
        debug('response', url, resp.statusCode)
        if (resp.statusCode > 299 && !opts.force) return cb(new Error('GET ' + url + ' returned ' + resp.statusCode))
        var write = fs.createWriteStream(target, {flags: opts.resume ? 'a' : 'w'})
        write.on('error', cb)
        write.on('finish', cb)

        var fullLen
        var contentLen = Number(resp.headers['content-length'])
        var range = resp.headers['content-range']
        if (range) {
          fullLen = Number(range.split('/')[1])
        } else {
          fullLen = contentLen
        }

        progressEmitter.fileSize = fullLen
        if (range) {
          var downloaded = fullLen - contentLen
        }
        var progressStream = progress({ length: fullLen, transferred: downloaded }, onprogress)
        progressEmitter.emit('start', progressStream)

        resp
          .pipe(progressStream)
          .pipe(write)
      })

      function onprogress (p) {
        var pct = p.percentage
        progressEmitter.progress = p
        progressEmitter.percentage = pct
        progressEmitter.emit('progress', p)
      }
    }
  }
}
‰PNG

   IHDR  N   �   Bl÷]  "iCCPICC Profile  X…•yTM³vÏÎX–%çœ“d–(9çœXrÎ•(TE@$‚ˆ"‚
	’

(r‡ ï÷¿÷¿çžÛçÌðluUÍÓ]ÕÝS ¬äˆˆ- ¡a1Q6†:¼NÎ.¼¸w @8‰ì¡meeþÇ¶<„h#í¹ä¦¯ÿYïÿÛè||£½€¬ìåíŠàF ÐìÞQ1 `ú¹@|LÄ&^D0cB ,Å&ößÆœ›ØkËléØÙè"X 
™å qÓ?oœ·?â‡�ôÑ‡ù†!ª™Öð û ÀÞ‰èì
ßÄóõú?þÿ�O¯¿>Édÿ¿x{,[�B/0:"„œøœŽÿ½…†Äþy?r¢Œl6ÇŒÌÛ…àpÓML@p{˜—…%‚éü0ÐgK¿ˆ5²ßÑŸóŽÖEæ0€>d=S#s‰bŽ¶×ÞÁrä¨-[Decl·ƒ½¢Âmvü£â|£õmÿà _c³ŸÙa!ð)¿@c#™†jL
°sÜæ‰êŒt°@0ÁýÑÁ¶¦;ú£Iºt¢bm69"xÑ/ÊÀf[f�þ3.XÊ›¼Å�ÁZ1vFÛ¶°“o´“Ùn>¾zúÛ`ß0ûÎ0’]:6;¶Y!V;úð)ßC›íy†¯DÇÙþ±}ƒ$Øö<ÀAd«mþðrDŒ•Ý674˜] xA,ry�pûæZæ�_Û=€¢€?ð’;’?Ž[=aÈÝ$�ÏòÑít¶z}A"_ÿ+Ý¾K¿­Þ¸-‹`ðÁ¡hv´Zm†Üµ�K­ŒVùcÇKóç©X}¬Ök€ûËÃa‚\Q ð¿Ëþ±Ä|Ä`&0ƒ˜1Ì+`Šôú"cÞdöwdàý–—�ß�éQÿbÎÌÁbg°3:/Äzú�ZaMBë Õþw43šH¢�‘h£5‘±‘é2ŒýËâŸ¹ü÷ó6ùýçwäDq"i‡…×_þºµþíE÷?æÈùkúoM8¾wÃ÷à¸n¼ð¸î…omâ¿™ð~+þ<Íf‹[0â'ð�ŽÌE™i™µÿötòƒ¨­xƒß„˜Í¡‘èÃ«�ìÈ¾¼ÆaÞR»xåddI lîïÛÛÇw›­}b~ú�Ìw
€ÝHŽSöÿ#:@] ,¹ÿÈ„]`ÛÀÕgÞ±QqÛ2ôæð€Yl€ QdLr@¨- L€%°ÎÀ™õ Š°Ž{AÈyà(('Áip\ —Á5ÐÚÁ=ð <ý`¼Arã˜ó`¬B„ƒ¨!ˆâ�„ 	HR†4 }È²�œ!OÈ
ƒb¡½P”B'¡J¨º
Ý€îA=Ð ô
‡¦¡oÐ/Œ" Q\(a”4J¥�2EÙ¡ö üQ‘¨$T&êêª
u	ÕŒº‡zŒD�¡fQK0€©`f˜–„•a]Øv�ýà(x?œ—ÀUp=Ü†Äú9<ÏÁ+h,šÍ‹–DòÓm�öFG¢÷£¡O¢/ ›Ñ�èçèqô<ú7†Ã‰‘À¨bŒ1NL<&S‚©Æ4aº�õ³ŒÅb™±"X%dm:cƒ°ÉØCØ
lö.v ;‰]Âápl8	œ:ÎGÆÅà²p¥¸K¸;¸g¸¸ŸT<r.aé%u·)žQ|¢X¥¤¥¢T¥´¤ô¡L¤Ì§<GÙFù”òå*ž/‚WÇÛáƒðiøøz|~ÿ�ŠŠŠŸJ…Êš*�*•êÕª‡TãT+z‚8A—àFˆ%!Ôî^¾SSSSkQ»PÇP¡®¥¾O=Jý“È@”"}ˆ)Ä2b3ññ%��6�;MM	Íuš§4s´”´Â´º´dÚý´e´7h‡i—èèdé,éBéÑÕÑõÐMÑãè…éõé}è3éÏÒß§Ÿd€t¼2Î1t1|`Ä2Š031æ1^fìcœg¢gR`r`J`*cºÅ4Æ333‡0ç3_cbþÅÂÅ¢ÍâË’ÃRÏòŒå+««/k.kë ë/6^6}¶`¶¶¶·ìhvqvköxöSì]ìsŒjÞ¹×8^s¢8Å9m8“9Ïrör.qqsrEp•rÝçšãfæÖââ.â¾Í=ÍÃÀ£ÁÈSÄs‡g†—‰W›7„÷o'ï<'Ÿ_,_%_ß*¿¿=:ÿ[¼€²€Ÿ@‘@‡À¼ � ¹à^Á‹‚¯…(…”…„Žuýv>(Ü"<%Â*b,’$rQdD”ZTS4R´Jô…VLY,X¬B¬_%N/*�’P””¨�Ø…Ù¥²+lWÕ®aI‚¤¶dœäEÉq)f)3©t©©/Ò‚Ò.ÒÒÝÒ¿eH2!2çdÞÈÒËšÈ¦Ë¶É~“—ó–+“{!O-o Ÿ"ß*¿  ¡à«pJá%‰�dN:Hê ­+*)F)Ö+N+	*y*•++3*[)R~¨‚QÑQIQiWYQUT�Q½¦úUMR-X­Nmj·ÈnßÝçvOªó«“Õ+ÕÇ4x5<5ÎhŒiòi’5«4'´´|´ªµ>i‹ii_Òþ¢#£¥Ó¤óCWUwŸî]=XÏP/W¯OŸ^ß^ÿ¤þ¨¿�¿ÁEƒyC’a²á]#Œ‘©Q�Ñ°1—±·q­ñ¼‰’É>“NS‚©­éIÓ	3q³(³6s”¹‰ù1ó!‹0‹K`ilyÌò­•ˆU¤ÕMk¬µ•u™õGY›½6Ý¶¶¶u¶Ëv:vùvoìEící;hÜj~8ê9:Ž9I;íszìÌîèÜê‚sqp©vYrÕw-výàFrËrÚ#²'aO�;»{ˆû-²ÇuOŒ§£g�çÙ’\E^ò2ö*÷š÷Öõ>î=ë£åSä3í«î[èûÉOÝ¯ÐoÊ_Ýÿ˜ÿt€f@IÀ\ nàÉÀ… £ ÓA?‚-ƒk‚7BCB)B=Co„Ñ‡‡u†s‡'„DHDdEŒEªFGÎG™FUGCÑ{¢[c‘W�ÞXÑØ±ãqqeq?ãâ¯'Ð%„%ô&Š'æ$~J2H:ŸŒNöNîØË·7mïø>í}•û¡ý^û;RR2S>¤¦^HÃ§§=I—I/L_ÌpÌhËäÊLÍœ<`xàb1+*kø ÚÁÓÙèìÀì¾ùœÒœß¹>¹�òdòJòÖyztXöð‰ÃGüŽôå+æŸ:Š=vt¨@³àB!]aRáä1ócÍE¼E¹E‹ÅÅ=%
%§�ã�Ç;av¢µT°ôhéÚÉ€“ƒe:eåœå9å?*|*ž�Ò:UšëtÞé_gÏ¼¬4¬l®®*9‹=wöã9‡sÝç•Ï×V³WçU¯×„ÕŒ]°¹ÐY«T[[ÇY—u1öâô%·Ký—õ.·ÖKÖW607ä]Wb¯Ì\õ¼:tÍôZÇuåëõ�B�åMM¹ÍPsbó|K@ËX«sëÀ“mjmM7¥nÖ´óµ—Ýbº•;óöÆ�¤;Kw#îÎÝó¿7ÙáÑñæ¾Óý�Ö�}]¦]<¸ß­Ý}ç¡úÃöÕž�”µ<V|ÜÜKêmzBzÒÔ§Ø×üTéik¿JÛÀî�ÛÏ4ŸÝ{®÷üÁã�-†ì‡^»�½ôy9õ*äÕÂë¸×«oRG0#¹oiß–ŒrŽV½{×0¦8vk\o¼wÂvâÍ¤÷äìûè÷k2?R,ùÄó©vJnª}Ú`ºÆuæÃlÄìê\ÖgºÏå_D¿4~ÕúÚ;ï4ÿa!jaãÛ¡ïlßk;–¬–F—C—WäþdûyaEy¥û—ã¯O«ñk¸µëbëm¿M�l„nlD�£È[¯0r¡üü øV µ3 H‡'n×_;†6Ë  }”6¬ŒfÅà±8
gÊü–šLl¡ÅÓ…Ð?b$1•³ Ö`¶>EÎ£\³<Z¼ù|xA!gá`‘PQ71q.ñ‰»J%ƒ¥Ô¥©¥ßÉ4È¦ÊYËóÉV¸A: h­Ä©ôA¹^%AU[¯ö|w¹º�Æ.�oš-Z{µut:ïtoëÕéWî7"kš°š,˜öšÕ›WXTZ¶[MÚ`lÙìØíi`‡5ÇUgàBéJt£ÞƒÞ³ä>áÑïy—|Ý«Ú»Ô'×7ÑÏßß.@'P!H<˜/„-”&[Ÿˆè�¼u.úHLJlV\S:Ñ7éî^°Ox¿jŠqªkZlú‘ŒâÌä
&³òZeåPå‚<Ô!ºÃ¢G4ò-Ž:¸ºs*r(¶+±>nqÂ´Ôð¤N™F¹J…ü)ÉÓâgd*M«2ÎŽ�7®¾T3[KW'tQö’Úe½zóÇ+W®E\�oÜß”Þ| %»5ïF~[ñÍòöê[�·»îß»7ÔÑpß¯“µóaWÉƒøn¿‡{zY?6í5|bÔg÷4²ÿÌÀ«çT/¤u‡Œ‡õ_*¿zM|½òfjäåÛ{£gßeŒù�ÛOXLš¿·ü`ùÑä“ÊËÔØtîŒÂÌØì…¹¤ÏF_(¾Ô~5ü:9v!á›ûwËEó¥ åŽŸµ¬ëmlìÄ_FÃÓè1Ì$vž¦TÄP•Æˆâ4ñ´èÙ_0Ë±¤³¾e'qdqös³ó8ñðµó�,	.Í?9+%¦!N!þBâô® I’äo©ÒGdeyd?ÉÕËÇ)¨“ R—b®’¥2ƒò�J©ª«—Ú’nlÃšÇµ\µ…µWuu¯êÒ÷5ØmHgøÑ¨Ý¸Ø$ÎÔ×ÌË<À"Ü2ÔÊËÚÒFÍVÜŽÃžè€rXvüä4ä|ß¥ÞµÌ-wO’{ ‡“§YÚ‹Õòžñôíôkò¯(	Ì
vÑ
	£F2a<b4r1š/Æ#¶4î^üË„ÉÄ¹¤•½Tû¸÷‹¦ð¦bSß¥5¥çgDeº°Ïr:˜�‘S‘{9¯éPóáÆ#Wó/­-8_xæXYQqq~IÎñô‰¥á'ýËËS+îœ;s¡Jälá¹ççWjˆØkêÄ‘<Pº¬Q¯×`~ÅùjÈµ¬ëgo74�¶Lµ~oƒo²´KÜR»­uGé.ß=Ô½‰ŽîûM�5]eŽvx˜Ôõ(æqNo{óÓ}ýoŸ±?×|a7è7”:|þåÓW‹oèG$ßš�F¼;>vsüÙÄèäÄûÙ�$úiÓ³ts2ŸI_„¿Ò|ý9ÿqaøÛ£ï7+—R–~ˆüXþÙ¾’ôKm•°¦·>½)hU»£Å08Ìv7C1A¹@…'Qk]hÒh/ÑÐo0
1é3±`=ÍÖÈÞÅñ�ó×MîJž^Þ_|çøMùg²E;„Ü…V„‹DdD‰ú‹áÄjÄ�Ä?IdíÝÕ%é-¤*¤wK¿”‰EÞnäÌä¦ä3¸ZI6¤9ÅJ<J-È[Ë”JŠ*³êE5mµg»½wQOÖÀi”i*hi%isk·êXê¼ÒÐÝÐ«Ò·2 4¸o¸×HÁhÆ¸ÊÄÍ”ÕtÈ¬ØÜÖ‚Æ¢Ç2ÃJÍjÑºÁ&ØVÄö½]¥ý6‡ŽùNFNÎM.!®‚®oÝJöXìYv/òòhôÔö|MNðâ÷z‰ì#¾†~Jþ*Æ�ä Ð`rˆf(mèHØùðÐRÄZäý¨Üh«¦˜7±§ã|â…ã?&œJÔOI
IfL~¾÷æ¾Ûû;Sî§ÞH«M/ÉÈÈ?àš¥P<“ý"§4×%O0oõÐØá'GnäŸ9º¿ÀµPõû±•¢¡âk%Ç�>QXZyòzÙƒò—3§VÏPWòVÉŸ5:çv>¼zMÎ…Cµ©uä‹J—ˆ—¾]þ\¿r…p•ûšÜu«Æä¦ÆæŸ­*7"ÚJo^io½uóvÏ�¥{†7:m»–ºKzä½è=ÜçÙoüLû…ÎPÈ+âÈìDßÌÒâÊfü·ÿ·Ù°Š KC*Ô, ì5(èDêÌA¤îÄ`E€�
@	û¡@ªãÏ9m°€
ÐVÀD€PEjcKàü�š8äƒS ÜOÁ8XD*GNH2„< x¨ º=„>¢°(Q”*U�ÔyH]ß€£ÑÇÐyL6æV[Š]E*¬GJ5””x*|žê(��PC­@ÝNT'¶Ñ(ÓÜ¤5¢}CCOK™A�a€ÑŽq€É’é³óO–RVuÖQ¶}ììmîœ”œí\qÜ
Üßy®ñFñ‘øÖø»J„v…ÇD®‹f‹y‰kKï"îZ•ü"õ^zP¦I6YNVnT>[�¤ð•ÔªX¨”¨ì£b¦*£Æ²›¨.¥Q¦%¡}X§G÷«>…“!›§± ‰‚©…Y¤ù	‹NËoÖ6Ž¶GìºÐŽzNYÎ½®Ìn^{êÜß{bÉt^X¯%ï>#¾3þ4¦�ÅAŸBv‡…}‰0‰¬‹&ÄDÆ¾Ž7HhM’L®ÞÇ»¿,•9­ Ÿ™v`é`PölnÞ¡Ð#MtÇØ‹>—Ôžð8É\Ö_qø´á™¥ªüsŒç³«—/×~»xô²~Ý•…k§šg[?µM¶/Üa¹§{ß½Ë³Û¶Gó±ô±§ŠaÏ£_SŽœ~Ç0~ûqjï¬öç†¯«ß–ñ?ÿ|´2õëÃê«µÆõ£¿½6d¶ö�Íøã Ð6ÀÄ�<PFÀx‚P�r@)¨7ÀcðÌCˆ’ÙŠ~"T]�ú Ï(”<Ê•�º†ú óÀð9x­ˆÎDbÄ0i˜$öe8€ÀRèS´RJSÖáÅð—¨¨î¬“Ô	DJb1Í¤~}COÏLßÂàÀð™qžé³$ó#–pVÖ»l�ìŒìw9Â99G¸J¹�xXy^ñVðùðË �‚…2…ÝD�ZnF¬Wü:rŠåKfHí•Ž‘ñ–Õ’#ÈõÉç*˜’XHŠ¯”º•›UªT©%íŽSÏÑhÕü¡-¯ã£›§W­ßlpÓð¦Ñ-ã“q3”¹¸…ƒå«ë9[A;û
‡Q'~ç —f7ÜG÷“]žä¯ZïlŸ@_?#ç€ôÀ»ÁÔ!^¡íáìI‘o£ubjãhâ#'ñ%ÇííßOJ9—Æ‘^”‰?�œ5—MÎ™ÈK:,“�:ú¶ðjQ\‰Âño¥WËb+TOý:S]%w¶âÜ§j‘š€WêX.–_V¯ÿ|¥ôšÊõ¾&rójkU›u;¸U{ÇìîBÇéN¯ªù¡?y÷ÛŸûŒð¼jÐcØüUÈ›š·ŸÆx&¬Þ§}¼=Í2{ô‹ðü“ïEË‡VŒWåÖN­¿ÿ½°4 ´Èêç@è+àŽÄ~²ò+A#xF‘uO€„!-h”•A· q%u2ªÕ3Á¾ð-4':=ƒqÆ<ÁêboáÔq÷(Ì(ÞRFãiðW¨0¡…:’(KüIÓE[JKïÌ`ÌhÂdÍlÂ¢Ä*ÆFb÷àHäŒáòâ¶ã±à5ç3ç70´òŽ9,Z'öP|zµ¤’”ŸôI™!9vy…Òª’•òÕœÝÎÍ£Zk:¦ºH[Úoõ¯ššš5[HY^²–²i¶ÓµruÆ»\rsp§ó¤òòðqõ}ï¯�ø1Ø&¤7Ì<üY¤kÔTLrwühâƒä»û*RìS¥Wf:dñœÏ¹•wè°_¾a[áã"¿âåã¥t'«Ê+žœö«„ªÊÏ)Ÿ¬‰­å¨{x)¥ÞðŠô5ƒÆ”æªÖü6çv–[ÃwÊî9ßÇuž Ð}³GÿÑpoBŸt?<0ÿ|jp`¸à•ÈëŠ7¿ßê�æ¾{<N3a?yæýôGÙOÁSg¦ÎÌÌa>s~‘ùª7ï¸@þæóÝj‘qiéð2çrÝ•'¬ütüÙ¼Â¼µÒ¼²úKëWæ¯žUâªíêñÕþ5Š5­µ„µ«kÓë|ëÎë…ë�Ö×Ëþöù}ü÷ãß¿7d7|7NlônÆ?ÚO^nëø€: `F76¾€+`½`ccµjccý,RlŒ p7dûÛÎÖYC@ùæ7ð¸õWê¿¿±üj¼ÆÒ¯õ¡Ï  �iTXtXML:com.adobe.xmp     <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:exif="http://ns.adobe.com/exif/1.0/">
         <exif:PixelXDimension>590</exif:PixelXDimension>
         <exif:PixelYDimension>157</exif:PixelYDimension>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
hR(  @ IDATxí½tT×yïý§‘b‰D²»(¾ÀÅ¸à[êW¼±q:r–½+­Ø”ÄZ¦iÖ{]º\±lšŽîîz¥Q½Ò‘×r†Æˆ6åJ´©È‡¤xüÑÑuF£Ô£ÆRÅ–jKF
313Î¨Ù÷ÙçÌ™9óyŽ¾°�žÃsæì½ŸýìßÞgïgöç2AøbL€	0&À˜ 0$ð†>Ø`L€	0&À˜€B€'.L€	0&À˜ 0I€'“ Ø`L€	0&ÀØpâ2À˜ `K–@l|¯t_BïÀä¢a0Úß‹îWz14[4iZH	Y¶P&‡ÿú×¿Æ;ÿ~wÝcÁ²�}l!1út™Bÿ¥vŒ¯{Õ›*>‚øç?Êñ¾‹¸˜@EõÉÍ�àÑª5ó©.†Âñß,üc�@¥X½¦Eºô©·S˜ŸÄTQ	VUHÒ™×lÃgÊ›þ÷©É!üà•Qlÿ½�X•�€éœ£…Ë`änV�…š~³úßìþ"gP¾ù š§âÙªd’¦bLND€Òôþ”$Ÿß¨3ñÇ&G1•*®FE‰öEÐ¼µGª¦mƒQ<¾áÆë£8}$ñHÃi!\×Ã¿¾|i!¨2g:DC]Âél#ñéŠ Ðà+ÐH¾‘{AáÓrŒ‹ékq‹pÎpÙî�]®æTþ¬þœ¡æóaáøÍñŸ­~³ÉŸ1«°%ø)-ÑŠ¦TŠ‡DƒMå+Ý­umiy3Ûð©ˆä]vþ¦»çÿö9•2àÍ]pòœg—ÂåC#w³ê-Ôô›Ñ6å×ŒüÙú1£Ÿße¥òç¾‘	�'*jzwÜvù\ÿþ´Š±¤BaáÑ½[š?—Ž
±aüR‘°èl°¥éèèâ�GÅÄ`—¨•ï¾ëÆ×¯IT‹ôó•®£×Å¿ÿÈ+~1þ®é(z/ž\›0í¡{ŒÝT°-Â¯kÏÌén+xw  w#ùFî…OÃ1jS^`g×HÎPùÝ£j:?²;_üæøçLì4Î<Æ„SVê¶cTAÚå÷Ú6¡µ„!«h„D°«AÉ›G+O³ŸžÈüù›î/ç·èˆðyýbbÚ?.rJ›ã‡ùÊ‡�‘»æ¯Àç‚N½Éiæå·°Ü¹r5£_ÀMRæ¾°_Ø-µÂÓéÁÁAákSßŸ”¢Ö°»…Ïï^¯—þ|"ž£Bl¿>Åàƒp¶Q¼!Ò±£Utê'bTx¨±|dõë\åäÂ“3o†ÓÀ«âÿë1ÑßÞ,®þÇÏSÿ0&¼gÿqÍ”¡mu6Q[ç›Ei,6§$m.rwØD]Û`2Þ`[�°Õu$zéÇ|¢.¶:árÚE­³Ó´»ˆ�ˆ¶†T¯‰ÍáÁD¹�[…•&«EÕ+ÝCØ“WR­<7‰_4V‡pÔf§ÏH¾‘»üµ"ùYk)Íôb)=T	fxÑ`›¨µIÎi½éJGE›]ÊhÐý"Óû(äž0Pr½ØáAá¦<Ô~ÍÕ:ÛÄXF½4âkö„þÒ@u¸}Ô÷!¯¸ðµ61O…ÏÕó—/þÂü•(ô‹�„K§?¬vÑ5¢6Î%‘—4 J–Í¢ŠÔ)Ë‰K(¯ ¹ËÞ¨ÚÖ "(ÔQ—àP'BÐlÃ«ê%þÏÈ_’í òÞªÿõ›ð9HzXí­jY’þ¬a£2hw¸D0£ìâ§ˆ+ðþ¥©—óËlË‡&4Gù¹)Ò¯ê?Ó÷ÇlùÕ(eÕ?fò'*:¨s¸Û„ÇY›(ßôC�*±éèpScI¼7ÙŠ&žÄE«ìaJúSóýÆ$ñÇƒJO’½-¤ê—Q/¦’‘(Ÿ?ÀSþSwFíc°ÕA<¨]³ÒŸl#jÕv"ã5N	\dwy§	Ñéª#ÑæOuPšMûµk“âµó�â/7‹†|âÊ›?oõ½,®ô´ŠŸ¿|VŒ¼ö·â_‡ýñÄHÀ+~xEôýÃ_‰Þ¿w™Œ"ÕUÚÐƒþ6uØ¢®+ž
5šú‚­þ²Ð^��¨“¿Ð­NáQ#›hX¬nµáFîÂ­tÕÚE'ý¢ù„S6àôb)´èWd ¤_*R®Ex¼øE0”ù‹ _rÒg$ßÈ�š.UÉ/èT^DÔ¶&G©YØïR+¤d…‘­o|0ÑÛäÍ]N
»'^ì,ÃiB¸ƒ¨–øŠ ×C†(ñ­ëL*0æMô¢ÐPh0o«°Û=‰ü“†³]¸:¼bpd$•¾dùÐÄä‹ß€?Åb¤Ÿ:`Þ`H„¢ÍåmIËÚ\ùÈÏ?*:ëäPB­h£Þ_§KXˆ�½U5¤dÃ!Fw�jÔ±NåÞ¢‘6áSŠàlÃküÈDÍÊb“ñî©¾ÉÀª¥<´w¨Æm|Bü~Ñ¥ÙZz¥ääGü¾)1yîf[>4±¹ÊÏÍ�~*³yë�O¾O£úÇLþ¤ÞQýhõ¢ÓÓ@=¬ôÓÁ´~cj9Ê¨÷²´žð)íKV�“¬“Wg¢îÉ
=ûñGï\-Õqò½Wt ÿ¾Ì_–²ž—õ¨öcÅ´&Fíµ¡ ðÓûR;'�(ÒÃâìJüp5ÑMë1§áäU~½R��CçuûÕ®œ1êò·»¼†‰}ÿ½1ÑûòwÅ¿ýèuñA˜Âþç¯„ø`LDÿÏþÞÿ×¾Kßoï_jïþïgÄØ…§Å«Ï?%¢¿ŒÊV=¨Â¢›äk _ÜÉ>»BÓwÉ†r�–€fS—¦4„Èp’íŠ‘»Ö0¡®•
uÓúü¢Co¶¯ŠJQ3ªÕYg<T—?}*#ùùÝ³ù�tJ#/½‹Žø„ÛånêÖH©1kÿ'z,½MyÝ³óI‘L…¬|)˜Ê/CØ,ÕpZ~iÚd~NÐËííê¢üñÒœÊßdùÐ|æ‰?Qáäåo¨Ÿê;D†Ó •û<¿óç�ª_!þ#Þ„Q«UœôÙ‘èª×*V�Ÿz½Èˆ±º"ô(ù«MÃ˜mø„†jocFþ*FÐoå½²*ïiHé%st¦ç&dü¦(ÄÏèý›t	�Ç#Z[[Óþä³Î@ÊÀŸyù(\~~úçæýIæ]Få`Ì_�_ÿ~åª
çÉ�u¶-ß¼J²ŸòÕ¿Ô+¨m+ïŽEtfqiùKŸ4ßÈ©üèpèzä£ÂÛê]þ “E§[5¬Æm£N²¹Ûñkï7@½ØôÃldÐ+ê¤Žï¡Œ ìPÚ:Å¸ªõ(í›QÄFí_ZøhP8$G’�ª­Ó|,Ê/Ú4|âš¸¦†pád .ÿ«8²­»³m_�kn^?ü4Â.¿æ3ïçÊÕ«P^aExrãÿñX»q#þ“ÖüLß
ÜJQ"vñ«ocÙo|E/Áõe¿�’O|2¯Ì\+KŠ“�—ßºžîoÉ±²HóR®Ý$>­¸o�¶Ò wÊà—õ^ò»Çã´Ò‚®Ú«o ¥åe5Ðòõp8îE<LË?+0âqÕ‰–=ZT‰Gf>ŒÒg$ßÈ]/¿lõ�ŠJ)¢¤òš*:’Ze’©slèö¼@ƒtÞƒX•éHß�ÜsQE®ôB.ùRqªxÞyßgèÉ%(iJ°´ÖÜ¯¬ÊË–3Ž–«qø,™‚µvl½}9Þ‹|­,T>²¥èùèË—ýîÛ×GÏÃxèn$/k|gO¢jMª åO^þ‘^ì~è(ì?ZžÜFÂ#¸tâAì¾û+Œ· 2þK%ÊƒÛÉü´4`ìÈ„Zž¥gåJQÄlÃ+ÒóçïÆk€£¯âÍá{ÑÞôt|�m…$ÑiY�­~$¤=
ñ3zÿÂ#?B{{?î¸cyšÔëï½‡{VìÄ®-˜“ò‘&\÷eá§_-ƒ³}’y—Q¿óWã×¿_éõ�É÷7L¯UÞ: j]!ó%C?”lÆÿ	á©¡}è Üßy»rÕsSÃ8½}Nìð‡‘Z˜V‚�ûžLæøÚCÏ¡£¯	¶ÖÅäñ�˜³uÐùâ¿®¾ßuF«®×�kq¨Þ�S¶KøYä8V%ÐNá�¶&r·¢Õû<°áZköÊßþ%%�~õU›Ñdq"ôÒ“s—îd÷&Õ2i:m@£îøº�ÇÿÞÕN<uð(ÕÁ�xéˆ¬¨�¯ââb¬\½‘k“øàÚ5ÜRü1üê×E(ýÄJ,»¥áè(¹EPAFÖÛ?Œ�ãï¿‹ÛnWpã2}Ð[”yÝ’2F¨_¹[ç£?ÅPµE¾ÄSx÷ŠÎI¹5rvoÄ¾™á2¿—ƒPÌÁ•#}ŠT#ùùÝ¯ê´šúàšòMÖ1Ú55Þ�þ—+øxÅ=øÜÎMFi¾¶Ÿf¾¼3§Ùdà.c¡2RIë•1-Jå³ì®Oƒšü´ëj°Ÿ¾SZtO{º0Eå1³Ç¾¯M­Á(ömR+éîM8ëÓVnsÇŸéKýžâoF¿²ÕhìhœŠ`8øž±ì†ý¬—�g¢ùó'ÿÈ[ªayl‡F©›wT“š—ñ>-MÞ°n;h5ÎR…ÙõªHéþí¥þ[q;Õœ‘ÀìÂ“ ºòçÙÆaÃQ8ŸêÜhxûøÓ¯õP',kÒs+™ŸÉE8ÌðËûþ­=Žö]ªœ\ÿÇÎÍQùÈ]~zú¥¡-¯Ù¿?RJvù]»«0-þ|õ�ù÷WÆoteëª1V­YKOâTC#v¼Ø‹I2œÒžØ€bœD‚Ñ¯#Q�ä‰ŒÊtº�®øºÔŒç¿{¥ë?�“Gveýv.è^ þ’�z¿€èÇó¨“|Å[==TEû±�êïÌ«`ü0jÿ&qæ 4*ÄçY2Ý–ÖebL²®Ÿü:.“1õÒñ]y~áç‡ö©µëñÞ»ïbê?�Ë?¿†àx¡É"_/‡¸õSˆüb?ûüöúxç_�_Ð´\ŠQ&äo·£<‚Ñ¾sxZÞÔé4Ee[vÑë ~ö9ô£ïüs8Hv•y÷/P ìÿâ	¼24ŽÉÉqõ]Âéæ‹‰*‰“Wz~Ø�ÑÑaŒNÎÇfdFòs»ßB,Gâ|ÿ(&GûðÜS'é‡É^Ü“üµB/æÛ=°ÙlØýÔ÷²Ò¸€ýgi:òÒ+œDº�ÜUo%ø­©
hrãbß †(/”*}Õ<NŽ~¥IÉ¿É¡n4¤Èjkq¯¢_v9¨ƒ¸c?Nžyã‘&‡{Ñ|Zå_²r…"þ'?yÚ‹e€*°‡OÑ#Jsú•'þtOÙßõ‹¡»¥{0-ÆŠ•J½ºòÖµ+rç�Œ4ÿ²õŸ&“hl|T¾eþ}ë›²€oÄ­ò'eÉFØh,B&øW×'1Ú{Û�öÀê:€TÇÏ6¼”\0Ë6¢†²µãlªŸØ‡½¶Ê½Åù äïcyÅè�GhD5šß	�ÒžTT•W¤0¿²-ÓyÿÔøôÿÏ]ùÈS~xú©ÌÑû#©æ/¿zæ™÷…êóù“)5×÷Âúé{’“¡=)4ðWãÀ[}èë£¿þa¥ý Â�–ÓçÐ70Œñña¼r®6zý,�:­.¼>Ü�¦¦&œjÿ)è÷LÖ•×Ý(~z¿_V›OSû5<‰ˆ|ÿ)XjÒêoùÃôŠueVÌêƒ|ñµ�²í®²Jvu=…•Ã¦?ª‹–Ìu# ß¹ò3ñ¦¿W|ûÅ1þ®º=Á‡±¸xÓû�¢ÿïO‰ínÿö¿ÿR¼ñw§ÄÄØ{&TJÌMÑ­PæÀ$æ(I~OjâÍÝQV�ÙRc¼ñ/-9¥±Y9>KKO•ÕYÓp�´}r¤‹#µjOMÄÍ}ÒV|�»nNVáD§Ïœü|ñ§&V*éWÆúi>NÆäBm¬:.j¼QÑ*'úZµÉö™©1r×ù…+±r�,·ä$a%½yD«&µ¹Õjè¸ðk“ú5m9¾Üã$Å]ÊUó?Ç|ˆœñó/¬Íýr$VTjº‘þ‰©‚ºÄçËÕK~þB„¼nuÂ¼&Ÿ&ŠwèQº”	w‹C¿ÍlÃçoÀ-ù×
eáH‡:gM·€@�ü�ÈÛd´ym&ø™zÿt¨Óng[>tÂr–ÚçiA§_ê?ïOáò«£”qkTÿ˜É’AŸS¶3¢P¾ë§–Ã:Ôï‡AÛ�]¢¶úOmŽ$Í‘’û#¥êNZÁêìÈšã£–ò—Uªºæu7Š_ÒÞoX¨þN¬ÚU¥Ó/Z9.çråc”7~P¸}LÌ/Ë``4çTÓk1|æœ>×	ûIßÿCÿ¯v}W\�~�?ú™xýÿ$~õ«_Ñ”§ëâÇ¯þ@/Ïáf]Ñ°£�Í’1æ»Q÷cÑ¯ÂK÷™ß=<AûèLÈÍÓÒC,ìozÃ j’Q*Eê¤KW¶% x2rOI2º‹“!-ùfÌÖSòxL„sì¡¥…	æò_/p:÷úÉMè¨|LÒ:Ñeù%ù	>¹‹éGe3ü3?wù›• ô&øÍæý›ÿò‘žœi›çô+ú|$ï�¹úçFä�Üòƒ¼#Èü[I..¢á°òþMä¨{¦�×3
�¨¨�KÿU¾ªagú�qgOþöoFâA y?reìÝQŒü|wþf%FÞÆ}ÿÏ}¬¿_Ã¿ÿ[ «î¨Äù¯ÿ•òøÙ[Ô¥IßþÛÖmÊ÷ùü¯¯¹ÛÛ×ÃýG÷ãÚËxú… <�0žÜ¢ŽU¹Ï§nó/;‚Ú’ÿû}9æÜ˜ˆ�†¿F'¦òóAá�ÜMDÁ^0Îßœ97ƒj³¬æ:‰4qtdÅåw|$G«Ìur¤<yË{4>¸bõ”Ñðüt¯ÅÝþM—F¶ÿ�}�®ìÇs÷äÃX•ŸZ‹eË–áŽßüJJÔyý¿úðC|²¼¿ù©»t‘ý·ß¹†&SgÌÕù˜«Û¢å·áö_áG?|CŸ| Mžx|Kjz ‘û\éñÑÈx?òÖþÎçPµþ¶é«PtÊÊJ‘w‚œ‘ûôcä‰ çïBÊ�›P—YÖ?s�âß úì¶Ûð‰ÒXs­ËÉ+*-Ãmee¸%o%]8¢ÅÝþN»×yïq2£ûaL€	0&À˜ÀÍ@`†öèÍ�4Ö‘	0&À˜ `sK€§¹åÉÒ˜ `L€	0�EL€§Eœ¹œ4&À˜ `L`n	,ØÙpã}q!0¡l¸ùÉÍ�àÑ*më¼¹ I§,_þÅF<^�¾øÔä~ðÊ(¶ÿÞN¬Z€´ª~Fùgä®å‹ÑçBM¿‘Þ‹Á}ŠV×MNÐ¦w¥+Íj¤Å�/œ&Àæ—@Î§ØÀeœ\	§üÕÃ¥�ÉùÕ$Cú»�ïàðÁƒØOM/¿›á:÷_ß~õiìyø�™ÊèOÏa·í!äÚúuîÕ˜¶Ä…ªŸQþ¹›±PÓoFÿí,\_£r;ûxåÕ�v6n9T�âÒr¬®¬Äê¥¨>qãÉ4Dp¦&Qwhu}6÷-¡�…“,ø†	0�ÅF §á�¨¤ÓîéBÀ×	gYvo^�Ó¯¤ªÆù±åÉÚœ3
·<[¢d¾c££†Êé”_Ë­Yçž•mý|^?~[ÝEaþ™fU?£ü3r7‹a¡¦ßŒþEÑ·pòdÞ] †S^ý¢WÑç«„§Ó‹àà |mè9µ{›û’ÉVŽÆ³»áóûàõzéÏÛÆú%µæ&À˜€1�œ†“lÛöÏ`KÕ.<ûRÚcþé‡1¬9F†Ðr¬&Ù3u þ<ÆeëÇ±­Õ8×Ÿýërèâ	T:Gç‘EpþDœ¨Ç±š­ŠŒ­5õèÏìîQÏr×bLÿÌ¿âk
½çN£fkêWï�Œ_öSã½8¡Å}à¾ÕE‡Õ­ÔE!ÓQ½5_þs|óÂ«x/­q3Ö_/YÍ	4×Â�úKt4ªÁeŠÉ(¨�&Dô6ëògYõ!t�êbŸÅùÓ‡’ùWs¬ÙY–GYc¾j@ý‘Á¹Dåp¿)Ò¯¦e´÷<Ukel+ŽµôªgYÑÿ…ÊŸ<d¶zÙV<²÷$(€íUÕ¨¦²zèL.H9ž©å¯ú •©DüÕ‡Z0”ÌÞÂñ«c¸Hïà±–ó8S Qªqž„êW¶-—_Â“»vbÓ†¨züOÐJgTô¼øjZ�­å¿Ý�ªmUØ¹s'ýUaí4vâ3zÎÃ2ªgª«é¯†ê’²>¹hü~å É�˜ `Ó"�k÷síŒ,ý‘�<{J;KlB¸èœ yUg`P½õÜ¬ºNGnt\öñ%tþ”<ßÌÞAÛÃ§Î*jèˆA›z6P]W†:‰­ù]™Ç°Š_ŠÓYaváêðŠÁ‘
tªg%å‡òKg­9…/>�C=wÈ¦;Ë,>!~¿èòØuéÖÔ3Ò_'�äkgªÑYzšˆ¼ŸføQà‚ú	¡žÁDçC"4m.§hKže6!Ü6™vÊ¿�ùÔs�è,¦±¼zéŒøj~óå_!÷›!ýBŒy”2cs¶Š •¡€·UØížDþð‰Žˆ@ (|mu$Ã"<Þ€ü$§ÀÑ22å“¸*ùGg»Ñû“,ßµ­‰ã…âOÈð$dXnáD§§A´¨„NW¿	Ÿòþ¦ÎÄÒù Ë„ÃÕi¢ìk‰4~Â¡ ðÓûÇVõýµ8»2ŽžÐäñ'`L`îä<«.—áT'›ðËº�*Jy¾Oƒ/e(‡ì‚Üé`8¥Ñ¶¸©�
Y9[•ÃmCÊ�ƒŽÎ V¬ú³�|t(ªvˆb2}y^ƒøµàT¹z»º„×çn;Uà	ùZúÜÊ	¤Ò·zO®C
Õs¹¬jº5Áúç’¯4RºCˆ“¢rÜóKÊ­Ÿ^§<d–§Á±¬sô¢ÁV¥1C]+5>^âã§ÃˆmJ#î¥,�t	�Ç#Z[[Óþä³Î@Ê´ÊÇ7¥]žüKzÈí¾ðÓ¯ê�«¼$“F7F|’y—q˜¢15~ýû3Ò)�0í‡�ªEáøI†4œô?ôÊÓ}>ýÒ¼ÅCÂ©–íƒÉtD…·Õ#ºüA¢w°Ó­6ÖoZÐ|_¦õþDƒÂ!ÕjFk>©üœ	0&07L¯SUÂÊàYäJ/0 _*N¿ó¾ÏÐ“Kˆ“Ç{¬Ž¾Š7‡ïE;�€õt|�mÅä£Ó²šþWgZ¯,I­²üVšc„[²æÑÃ¬Ë(~”Œ£åÀj>KMI­[o_Ž÷ß"1+õò­¸�6yªkw�»/+*%=ÙOÕ'…õ·â>�ü;eò.ç“”þ|£!¿”É;×uß¾F8zÆCwKêtYëà;{UkJ(Mê˜\íÕ7ÐÒò²ê¾|=Ž{ÇùÚÛûqÇËU·Äÿ×ß{÷¬Ø‰][`‚oZÐi}YøéWË�µæ~eÕgvâÌ”?¤Ê–ÌC­(Ò­1Õ³¾ü•­¾SQC}£ÌÅ�0‹¼iÈ¯_2½4Iüôöu8°ÃnÄ†dJ°sß“Iok=‡Ž¾&ØZÿ“Çw"u°QÒKŽïÅ__µM'B/=iRnŽ¨ø`L`R–OŽ@·k“9#ð·“‚:ÜIgà–ÝõiP�SÚu5(çg”CVÜe„Gá|f„‚¸Ñðö7ð§_ë!',kòEIµxÖUŒ••dx]Ks1Š?6ð}ÅhjF±o“Z›wŸhÂYŸ^L#1lSÜ£~Sï–ºW"úž¼I¹¥ßeêßƒ‡b¨Ú"ãŸÂ»WÒ}ú6~Iµ’7ªä²Õhìh¤,‡ƒ¯áËnØÏÚÒõÝ}¼ûÒw_P¯=Žö]ù5”s`¤QZ˜¯Ÿ;ÿR’s»/ôôƒæèÉ«§{ SG¶eûæÊŸF�Þ™Œ¼[»«0-þ«šúœúàšòMÚ`Ó‹_'$çm¶~Š·Ø€b´œ¤:!ý:¯YN	�„ÒmpÅßÐ¥f<ÿÝ+(]ÿyœ<²Ko;’»Ñû3‰3¥Ñæ øŸÅÚ<1óc&À˜À\(89¼ïõ×ÑßGK¦”ã õ9»žR+¨Uð8irô+Mè§½\†ºÑx�ZÒÚZÜK†YN¨¡É¢g{PýÄ>ìµíPî-Î0½Ý˜Jð[’ &7.ö`hhXm²â/Y¹Báô“Ÿ¼‰í53@ôÃ§èQ¹òe›?;Ý6¶ü†#1uÿ5Súä¥Í�MŽct|¡Õh{'4ŠñÑQL&'àªþsý_¶e5'ÀágŸC/éÜwþ9…ŸŒ_“Ÿ+\ò™	~…õ‹¡»¥{0-ÆŠ•J»µòVµõ*Ûò2a�ý_<�W†Æ1Ii¢}¬N7_L˜IMrÞñMÊ“IyÜxú©€c—ƒˆ:öãä™W0Nehr¸Í§U~æùHèùa?FG‡1j¦p%ØÝBe)pô Î÷S™íÃsO�¤î£½¸‡Þ¿éÅŸÌŒ<79ôKôôœ ®Æ'€·úÐ×GýÃjù&£ªåô9ôc||¯œ«‡­‰fs=þé´^¡ë´CSSNµÿ4Ñ­ª`üþL¡»þ1È*ÇEuÒÊ‰aÓÕE|1&Àæ�@®¿hÐCó%ÔI�òÓbsˆÝÜ&>âUæ,%ýÙœ"9÷˜Ün9™¼V(ÓˆF:Ô9Q^m~Lbn‹;�Œ^™#•kP8(\µr¾ŽÔ'5‡£püaÑÙ ã×Ò`µr2»n>G8Ð¦NhWüX„Mq÷Ðì%õR'WkáSŸê¼.cýý”¹ÖR+ìò“	ÏsS˜Ÿ6ù;¥—–VU?šˆïÐ˜%üPþøSSÒäD&Ñ�˜¬…µ8:“‹ó(•|lÌ7å5wþ¹/ìôKíãÂ¯Mú×Ê™£-ÁÏ,Ÿ	š[–*§ú9KI>9oR‹´¼Sæ³�Å¾ÍÄO2¨L¦&tçŠ(�~a¿2<w¢Œis£u1†Æ…>k�Y“ÃÕ<¦°¶Ô{§iQøýIÌÏÒÉWtÉUhù“	0&0G–I9TéÌðšÂäø$¦ŠJhç`ÙÕt£¯ÂñÇ"“ÔãDý«*2†zÒ0Ö8ýÊ/©X…i¬”žA"ch©.Å7jü¸LC;7ìš¢ž�ˆü^‚Š<ù¡Þ¦¥”•#Q™ÎeÈw:ÂæÃï<§_Q™z4e�SII1L8|"TžÊñí½tÚH½:Ñœe|þâ7“YSˆE¢ˆÆè$6lÌHHùùˆÞŸ”|Ç˜ HH¯é“�ÍÞ¡bÕ*³žçÁ_áøK¤1PÈž+*ÃªU…<Ì\å¾ælo_÷Ý�k/7àéÀãÚ8s�3	ImE…:Ç+_ð2i4æs4xnÈ× ü¼;Ïsúý©€­ÊSÈæ•ÏUàêµë¤ýhY•;�ç5~ÃÌ+¢w¯Lù3ôšÃÃ‚xrèÅ�˜ `û]Œaî	-¿·ÿb?úákúähò\Àã[Ì­'š{mXââ" ð~ä¬ý�Ï¡jým‹+i‰Ôðû³(³•Å�YÕ-
œ&À˜ `L€	˜"PpU�)	ì‰	0&À˜ `K„ NK$£9™L€	0&À˜Àì	NŸšÅð„ºÓwyåZškdöZ±&À˜ X¼äÆ¼ÃcÊ¾_Eå•X›g�Ãâ�JÙ$íá-«ÄšY­<MÉ[wSî�6É�O±a�Sà¥ZÜ}÷ÝÊŸû2o0wã³ˆcdL€	,.‘À_c]¢]yÔsyq%n:©‰ôâw+×á¹×ÒOÇPD�q©lŒ;:™S¢ÜnDÙ”Yî¹³ä®)|ÿè:¬þòys›JÏ1CÃ©XnQLûLB#xj+¯
›cþ,Ž	0&°ä”YŽ`lÄ¯œ° ?sÑ<ˆú/µ fë2,[v }i¿é#8S#Ÿ§ÿ5§{*•QøIôžoAsíŽ?:;£¥ÿÜ):÷Õ‰¯îJ?Sc²ï¶—£’ŒªÊÊØzì’æíÌŒÒ]Z¾«++±¢¼Õ‡Z0dZ£ô@CgK¨l«q~8a¬‡Ö‰|ˆõá@ûêCÍèŸÌwnÆ.£¼ÚÚbêä
U»|ñ/Z�³{Ð>œOn¡tÌÎÍÐp¢#Gé¬„ÕX·v¶š�&š	0&À–¹iòš{q�u&ÉU7€µì>ŒðJ	H³š�R³»>¿^¯—þ|°mÔÎ^5Ž3ø)\:¶;ê€±—±½²
Ý£3l¸É zžÎúªmÝ“~Y¤·ïWôÒ‘_ƒ>2šöã`K¿ªxQ)îßïF§Ï�ÁÐ ü�.\}á0¾ü7	wãä!úLV6þëA}‡ÚS8úz;^È&sÄáéB à‡·³•/…å±SÆŸÎÿÔp»r$“³ñÓÚS°dÓn¸(û÷|ë_tÒnÐ­Ñä·•Žq'�"1ò3¸<va«óßàœÁ`L€	Üx‰£«\þiFA¯W„¢tð‘r<˜Uøµ³²Iª\Ë´åjj
?!è¨§_¶QAg’
§/y|JØïJ;FL‹];òÌ­œW¦>õ5È#´œbDó”öWŽO"Ìô‘Yn:nif|ôÇ=9HŸ¨h¥£»,6²`Só!êWŽ3sS0”#Õ¤;åYúEÇƒÙå‘MB;�MºÇÇÂå°ÑóÄqNV»èÉ
,B%^ªtñóôÍD�S¶×ßR“Õªu‹6÷Mb¡»ß¹ý¿cý›�Øq÷j/ÛŠú–‹ÍþÕ’�r~Â˜ `-�"lÚ¹kiRp4þa^UG·'Û©cÍ—röväL¹ÃWà³tÈçÉíÛqàÀïájñÀí4t×Œž*þ‰Ls½ÑMß7âÖâ´ÇˆçHÓ¯°’<ùñ¶®™šèEw÷%œ©?ˆƒ=dz| ÷Ñbéâ“ßr§/éœ÷FöVÙ\mpZ›ðü™ÐÐQ‹ú#{É¿ìæS/9ÁçÛ�'qúôiœ8V‹ìYóœÄ¶Œ‰ÜSCÿ„=Ô]åô„þ’ÀßÅÑ¦;à† ­æS˜Ç5ñÉÏ;Öo¢û0®g;%ýÌÇÍŒ–Èmü¢�Ïþ2ò åË×•aÅ]Û}UÙ£hlÏEFxãuœÿv6¶Ñ�¤�]Ø%ßH¾˜ `Là&$PŒ{ÿÈƒ®¿Ü�doi.ÔîÃ»q9æE÷ñ�&ÒS8|ÕñvŒ|î"žol"Y<|÷::ÇÝ‰çƒchß¤oþ�¢"CÃZƒuÍMÙÆûA­?ÿ7øìŸ}ÅoÉ3»è©¾Í}Ç÷M<|Ð§è Ý>»¥Ò(Â„{áô™Rþ[Øç°ãnÛQ ®;×þ<;ØòR:Ã³¥¥w(n#?ý¯Û�š)Cûé=Ôî6àðÎtn\£3¥È¨DñrZ8·�Ù’-Ÿž¨öRzßšDÕ¶”äœžçðáŒ§¢’åXY®ÏÂ”F¥ÅEtdìÂv×´-*[ƒõ›~;¶m¥GT0/àÝð_Ò}FIÖð'`L€	,p%Ø¹ïÉ¤Žk=‡Ž¾&ØZÿ“d87¯…Âß�Þú?Àî“°ÚÐÑ±ßyö ^8{�LÀ÷íçPµÊl³Jý2=ÿ‚ÐÔ“Ø¤R²ž@ŽXlØLs—¤QTç°á”´Ót×–'[ ž¤S£h~¼;>÷"Â—™˜'T(}føPÙ|þàI³°û‰Ï ,þ–N3µïiï~‡¶¨méáÝŸÂê‡ö óKQìÛ >‹]Pz›2z›¤ ûö5ÂÑó0º;1{ÊZ1®Z“Þ6«VˆU�s5MÁY~Ñg—iQÏ^l?*-àì«Á7�Ïõ.l÷#w½ƒçÿGåŠ2xkëÐáÂº}x+�ì<å'L€	0�…H Xûý®}æT’š¹åÙC—šñüw¯ týçqòÈ®?—õáK`ÙS��ã<ÖRc1zñlë[É`ù}¼ÙüvüÉ?C¼ôhvd9ž¬»¿šž¶ãšÜ&Q™p�òT±åQ¼$<4ï¼ˆ¢ï>±§,n¬Ïð§„(ZƒGvSÕáŒ‘­›YúR:¾£¾ž’*´“ŽòŠôgûþPéR�ŠU«ï¼O‰U§.|m?5¾.|9£·Iz,ÛP�Æn�F¹ßWð5<cÙûY.¯J‹è½+4IåH–ƒ4×ùû2#ÃiÛ‘nˆ#”ªZØî}§Ãþ§+áéôá‘¶óÆc²’�˜ `óEà–
žŠ#ðV“„«4å¢øÄrlÜF?~iµZKsîôÜECußÿ–²jËâütZoÓõán45uÐpÙz|Uo8„¯Ø”6Šþò:påŒMŽá½w©3á®gL§¨l£•fHÅ7¿;„ªÇ7¤…í½„�â�ØrW)ú/ü9>E#b�»ýcCá|q¶'vâ®;Kqµÿq”æ¡¶•º}¦éKSd†_¨/WúLi¸×¯�à;Ï¦'XîR-¿ØÀì?¸|ÒòD�.†î–ðËûÁÎ{×aÅÊ
Åî]yk¦õ;‰KMÔGC…™s§f¨¶ù`F“Î•Ùð–181!ÂÙ“Ú�‚³;`L€	0�tñ¨O…“VMYg°úM]‘–Xq¥­¼‚U(Ü¢Q›|¦ú©uvˆ‰tDÀ]+»KlžôUã&Ã+ââ#Âc—+ÞHŽµNøÇR+É2¢ËùÕ/W­çX-ðèV”‘ìºÖÔÊÃè`›²jM‰3‘NK­KS‹û”¸æ$}YZ'VBºi.á€›Ò‘ZU—ÉßbsˆÎ€¶nŽVâÕJ^®¬<Q…ÒJ;G‚i"}°9…?#£ƒ­
÷¶Ðô˜§)>Ã/Ëd¸Bf–\!'gÄËKÃ¯º±c‰…tc7&À˜ ¸ùDú[Pn‘½Ôáãò£ûÈ¶9NÄb‘(¢1Ú¤±¤Úø•éXfÞdD´ydM©÷v�àëÕkÒMÅ"˜¤]Á‹ÊVåÜC1FîQ¹kxI¥/}îOš œ_nPúrÄhAéæÃpù'p¤Ð„î©¥_.#,AEEæeç”bÏí�ˆ7î¢yÕ7ö24œhæb18¥«ˆfÈßho,Ž�	0&Àn�)2j”–…6Ã\ÒG ’�0EÆ�œË´$.2øF'¦°zMÅ¬ì	Y~hÙÞ¬dÌ”·	Ãi¦¢9`L€	0&À�m€¹¸pj˜ `L€	0&`Ž Næ8±/&À˜ `L€	€'.L€	0&À˜ 0I€'“ Ø`L€	0&Àì<þñ¾‹¸˜P6TýäæGðhUúRÍ¹Îºñ¾KxùñxuúFdS“CøÁ+£Øþ{;az'ý¹V®€¼…ªŸQþ¹HršÓBMš’‹ô‹²\z‚–—®ÀªŠÜË¡c“£˜ Í‚KW¬¦%Õ¶ºY¤9ÄÉbL`>äìqŠœIž*½ŒN|^Vs—&ç#þ¼2ß|‡Ä~úkzùÝ¼þæÊáíWŸÆž‡ÿ!ëíèOÏa·í!ÈmñàµPõ3Ê?#w³¨júÍè£�‹ëëÏaTÝíÃL�ê'¯~SÃh9T�âÒr¬®¬Äê¥¨>qãiÚEpétL•¨$?+J‹ÑÒ/÷dá‹	0&psÈi8Åã*©²{ºðuÂYÖ„Ý›Wàô+éUã|&]9ÀPDá¶R,¹ÌÎiôËË×ÓŽð·fí	Q¶õKðyýøíÒ9�nÎ„-TýŒòÏÈÝ, …š~3úEßÂÉ“xw�Nyõ‹^EŸOYäEpp¾¶ôœÚ�½tÌ…võ6Û°ûé8Û|…ÈOG+6fž˜ yæO&À˜ÀMD §á¤é¿mûg°¥jž})O-ðôC��')Wd-Çj’=SêÏc\6 ´ê±­Õ8—ã×åÐÅ¨>túwþDœ¨Ç±š­ŠŒ­5õèÏêÔ¢ƒó]ùâWüO¡÷ÜiÔl¥Þ2ÙcF2~ÙO�÷â„÷�øVíŽNç%/™Žê­¨ùòŸã›^Å{i�›±þzùËjN ¹þép	´eWáË?QP?Ú¶t¼ÍºüYV}Ý£ºØéDíó§%ùÔkÁ€éc¾j"äŸâ!‡ûM‘~5u£½çq¨Z+c[q¬¥WÝÐ�þ/TþbçP½l+ÙûÀöªjTSY=t¦_lø¿ZþªP™JÄ_}¨CÉì-¿*>†‹ôk9�3õå çIˆ¡~eÛÐrù%<¹k'6mØ@çlý	ZéŒÑž_U{l§ð<noáÙÇ«°¶’ü<ºÕ2wÿÍŸP£÷gàÜ1,£z¦ºšþj¨.9 ë“‹ÆïWþ(Ù…	0&`Ž@®£ZÔsg hKô¤sÀ#ÏõIœD'Ì¸¬ò Z:fP½õìœºNòOnKÖùCtþŒ<ŸÆÞ!ât2�Ç&ÃC4tÄ ¿MP½+è°¾d|êMâ\œ,Y…â—!ÃtÖ�]¸:¼bpdD„�êÙEIù!Q'ã³:…/>�CÑ6wêÌ¢ø„øý¢Ëc×¥[SÏH�üA’ßZ§Ê·ºóœÍ£É•Ÿfø‘·‚ú	áwÉ3�ìÂ‰Ð`@´¹œ¢-y˜Ñ„p+üí”!1ò	§ÌO‹Kh§	é5Ê¾7â«…È—…Üo†ô1æmPòÔælA*Co«°Û=‰ü5à�@PøÚd¹°�7 ‚?ÉÉ8lJÃ”õI\uïO²|×¶
õ8Iƒøy©2lq¸…/�žÑ w~ºúMø”÷W;sLž¥%ßíZz-ò=“¶:á3}Ž—ñû…ŸÞÏ@�8¶ªï¯ÅÙEu_L€	0�ù%€\âsNAÅpJâG¥¬éìºdpå0`yÈÕÜJ£mqS%U$kƒ�ü…„�Â8:Gè^mP-ÊsU„¯�õ£†;%Q>ÏÓðÄ¯J$„*WoW—ðú¼ÂmW)_KŸ; �Z4$H†”ÎpJ‰åá…VáOkÓ
ëŸK¾b(æ�¯éªÿ4æ—ò�[?!¼NyH"Nƒc"šÑšDƒêáˆ¨k¥ÆÇK|ü¢£A*i^4è�G´¶¶¦ýÉg©ƒóóMi—'ÿ’r»/üô«zç*/É¤ÑM¾ò§ùIæ�VÆü³ËßH§4Â´6ª Âñ“i|é,hŠ%>óé—æ-Nú¡8Ä`"šá$Ë_î#ƒ^Q'ýÐaáfói½?Ñ pHÃ¬Ö“Qw¤iÉ_˜ `sFÀô2uP%ù¹ÒKÀ—ŠSÁï¼ï3ôäâäáÞk€£¯âÍá{ÑN#`=ßÃÀc[ñùè´¬¦ÿÕ™Ö+KŠé^½–ßJsŒpKÖ#Í]ÿi?JÆÑr`5Ÿ¥¦¤ÖŽ­·/Çûo‘„•zùVÜ¿N›<U„µ;ÈÝ§�E½—éÉwÖßŠûtòï”É»œORúó�†üRþóéwß¾F8zÆCwKêtYëà;{UkJ(�Ô1¹Ú«o ¥åeÕ}ùz8÷"Ž!<ò#´·÷ãŽ;Ò'¥\ï=Ü³b'vm�	¾ªØ™ü¿ðÓ¯–kÍýÊªÏì4š)PÞ%¬,cZQ¤[cþªg}ù+[}§"J}£ÌÅ�0‹¼iÈ¯Ÿ‘ü�&‰ŸÞ¾'vøÃ�Ø ¥áú//u†êMr5ìZªwà”í~9ŽU¦FìL¼?}Õf4Yœ½ô$øøq;ÿÇ˜À<HY>9"º¥X›�¿�¬ÔáNªôÊîú4¨Ç)íº”ó3Ê!+î²�Â†£p>3BAÜhxûøÓ¯õ�‹–5ù¢¤Z<ë*ÆÊJ2¼®Œ¥¹Åø¾b4µ£Ø·I­Í»O4á¬O/¦�‘¶)îQ¿©wKÝ«}OÞ¤ÜÒï2õïÁ�C1Tm‘ñOáÝ+é¾}›¿¤ZÉUrÙ†j4v4NE0|ÏXvÃ~Ö†ËÇ«’Qï>Þˆ}é»/¨nk�£}WÒ[Ö�œ#�ÒÂ|e°Üù—˜Û}¡§Ÿ~:(IèéÀ�êžY¢Í•?�½3y·vWaþZüW5ô9õÁ5å›´Á¦¿NHÎÛlýo±Åh9IuB0úu$^3Å©d£…Þúyôñœ“‡.5ãùï^AéúÏãä‘]zÛ‘ü½?“8sPmŠÿY2ÍøbL€	Ü'‡÷½þ:úûhÉô�r¤ž#g×Sjµj'ýŽ~¥	ýãLu£ñ µ¤µµ¸Wþš,Ûˆª9;Îö ú‰}ØkÛ¡Ü[œ@þþ4•à·$AMn\ìÀÐÐ°ÚdÄ_²r…ÅO~ò&"tó UÐŸ¢GåjÌe›?6DcËßa8ÃP÷_ã0¥O^ÚðØä8FÇÇQ�¶wB£Ådr®ê?×ÿe[vQs~ö9ô’Î}çŸSøÉø5ù¹Â%Ÿ™àWX¿º[šq±w “Ñb¬XYÙw´òVµ©lËÈ„öñ^Ç$¥uˆö±:Ý|1a$5ÉycÄ7(Oþ%=äq_àé§Ž] êØ�“g^Á8•¡Éá^4ŸVù™ç#At ç‡ýÆ¨™Â•`w•¥ÀÑƒ8ßOer´Ï=u’º�öâzÿ¦23òÜäÐ/ÑÓs2 ¸Ÿ ÞêC_ýõ«å»d#~_¾¶OSùžD„ôûVS�×(úi]§íšèù©öŸ&ú Uã÷g
Ýõ�AV9.ª“VNcx˜þ¨.â‹	0&0ïrúEƒš³ ç-¨›CtÒg'ÄG¼Êœ%ÍlN‘œ{LBn9™¼V(ÓˆF:Ô9Q^MFbn‹;�Œ^™#•kP8(\µr¾ŽÔ%5‡£püaÑÙ ã×Ò`µr“n>G8Ð¦NhWüX„Mq÷$'‡«“«µð©Ou^—±þŠ~ÊÜ
k©öùÉ„ç¹)ÌO›ü�ÒKK«ªMÄwhÌ~(tsýåD&Ñ�˜`¬…µ8:“‹ó(•|lÌ7å5wþ¹/ìôKíãÂ¯Mú×Ê™£-99Û¨ü©éŸ ¹e©rªŸó—ä“ó&5±[Ë;e>[ròµ™ü!T&µ	Ý9£¡YC9õûÕÅZºµOýÅp@]p�t£ùv#é“¹Ô<¦òiK½wš…ßŸÄü,M¶ö™«þÐò'`L`Ž,“r¨ò�á5…ÉñIL•ÐÎÁ²«éF_…ã�Eè×.õ•­ªÈHèIÃXãô+¿¤bÊ2Ç[æ4)1´T—â5~\¦¡�vMQOHDþ
/AEžü‰PoSŒ›ÊÊˆÑ4ò½a	ÍÑ<§_‰•z4e�SII1L8|"TžÊñí½tÚˆññhÎ2>ñçá�õ8ñ~Rùª w0�N–ç>¢÷§€FìÄ˜ÀÒ%0óºLa&+ÄU!½Âñ—Hc �=WT†UæfªN;�}Í5ØÞ¾î?º×^nÀÓ=€ÇµqÚrf€ÚŠ<GahrË¤Ñ¨}™æ§!ßiÊ›sïóœ~E_*`«ò²yås¸zí:©@?ZV©óø2ùÍkü™‘åü^øýÌ$ñpA¼?…d7&À–,��}�®%›úyLxÑòÛpû/†ð£¾†¡O>€&Ï<¾…×ýÌ#ò%$ZàýÈXû;ŸCÕúÛeºùýY”ÙÊ‰b‹‚À,‡êN`L€	0&ÀL(¸ªÎ”öÄ˜ `L€	0�%B€§%’ÑœL&À˜ `L`ö'‡OMŽbxBÝé»¼r-M„52{­X`L€	,^rcÞá1eß¯¢òJ¬Í³ÀañH¥l’öp‹–UbMÆªÜ”¾›>�)Œ� wH›eú¡�Bö8^ªÅÝwß­ü¹/ósF@Ù�	0&À
ˆþëíÊ£žË…=/f×H/~·rž{-ýt%Éd\*ãŽNæ$ ·Q6e–{îÌÃ5%·Z¡MŸå–=7ß5…ï]‡Õ_>onÓéi&ÐÐp*–[Ó>Ó�ÐžÚÊ«Â¦É—½3&À˜@�2ËŒ�ø•ôg.fx+ð5‚þK-¨ÙºË–@_ÚoúÎÔÈçéÍéž
Ê.~½ç[ÐÜr}£³3*úÏ�¢s_�øê®ô35&ûÎakq9*É¨ª¬\�­ÇÎ!i>ÑqGÇ(Ý¥å+°º²+ÊKQ}¨C¦U1àC'´ªFqi¹"õ
’âÆK9i²«q~8¡P¬‡”¼HäS¬2ò¦úP3ú'ó�«1…‹Ç(/·¶˜:ÙBÕ¥_ü‹Vàì´ç“›Òzºw††9JG%¬Æºµk`°%ÐtãfÿL€	0&°	ÈM“×Ü‹{¬3I¼º¬e÷a„WZH@šÕ¤ü�š-ØÝðù}ðz½ôçƒm£vöªqœùÃOáÒ±ØQ? Œ½Œí•Uè�aÃLÐótÖWmëžô£È"}8¸}¿¢�Žüô‘Ð´[úUÅ‹Jqÿ~7:}~†áïtáê‡ñå¿I¸'ùÓG�£WÑç«„§Ó‹àà |mè9µ{›ûLH&/ÊÆ€=¨ïP{G_oÇ!eŽ9<]üðv¶¢ò…£°<öbÊ8ÔùŸn‡�Nlr6~aZ{–lÚ�=ßú�´9º5Ú�<à¶Ò‘!îäQ$Fþo÷€Ç.luá£ƒ3øbL€	0�O qt•Ë?Í¨ã"èõŠ�àWŽ³
X/B•k™¶\MF¡ð¢�ŽøqúeËt&©púR‘Ç§Ñ „ý®´cÄ´Øµ#ÏÜÊyeêS_ƒ<BË)F4OiŸqåø$²ÀL™å¦ã–Ìó‰‹Vy<—þH¥´øõ_ôÇA9Hß¨Öb#;65Ÿ¢~å¸3w0K9rMº§ŸÊD‚éø0»<6¬Ah¶ÉØâcárØèyâH1«]teé$ý…:J¼:”òñ¬/=NÙZKMV7¨Ö-ÚÜ7‰…î~çöÿŽõo6bÇÝ«Q¼l+ê[.b`4ûWKvÊù	`L€	|´Š°içN¬¥I¿Ñø‡yU	Ýžl§Ž5_ÊÙ›‘709ä_�ÏÒ!Ÿ'·oÇ�¿‡S¨Å·OÐÐ]3jhø©ø\,$2Í-ôF7}ßˆ[‹Ó#ž#M¿ÂJòäÇÛºfjr ÝÝ—p¦þ ö�iqð�ÜG‹¥‹O~Ë�¾¤sêfÒ�¿ï “b¿ô ÌLÖ‘½Y6WœÖ&<æ4tÔ¢þÈ^’'»ÕKN úvãIœ>}'ŽÕÀ"{Þ<'±-c"÷ÔÐ?auW9½¡?£$ð·Gq´éxƒ!„h«ù&ÂqM|òóŽõ›è>ŒëÙNI?3¹™Ñ¹�_t!ðÙ¿@F~¤\ùº2¬¸ka»¯*{�í�â¹È(o¼ŽóßnÂæÃtœ»ÅŽÎ‹.ì’o$_L€	0&p(Æ½äA×_îÀ²7‚4j÷áÝ¸ó¢ûøNé)¾êx;F>wÏ7Ò¼}ü¹  .IDATøÍPzøîutŽ»ÏÇÐ¾Iß¼EE†„µë2š›²�÷ƒZ#~þoðÙ?û"Šßþ’gvÑS}›ûŽï›xø OÑAº}vK¥Q„	÷ÂéKBó�êw:àÀ }[šSÁ/å¿…};î¶êº°síÏ³½//¥3>KPZz‡â6òÓŸ‘q»MgœÅÐ~zµË8¼3�ë×èÌ)2:Q¼œÎ­ÅãG¶dË§'ª½ÔƒÞ·&QµÍŒÙ—SLöC£>«\Cuñð˜Éù7!»O¸»>Í#AÑá–Ýyj—Ÿ'�êvÕûã{&À˜ ˜K3ªKé¸©îÎªK¹«wqÑ!‡{L5e†•ßõá£¢Ó©Yí¢£Ã#ìm¸È!|c©á§\’ôÏÔá)»Ð�X%�'¢V†¢!¬:eX*1Ô•ô•¸‰�—2”6Ó)5úôé„ÇC¢AI›=c(Tç'ëVËÓ �²ù€B9Æƒº|Ò†êtãgc^§Ò·¦Æê¢ƒ­Ê³¯~�N�0<Ø%4Ü¨µÛ°Ö	_Ž¡ºh¢|èFS³4žÉƒõ8<{±ýhO¶FO|ø\ïÂv?r×;¸pþoÑpT®h ƒ¶¶¾ ¬Û7�·ÒÈ™­ü�	0&°àk]0ÚgN©™[ží0t©Ï÷
J×'�ì*0Ì¥_Ëžz„ç±–‹Ñ‹‡`[ßŠðåßÇ›Í�`ÇŸü3ÄK�fG–ãÉºû«éi;®Ém•	Õ)O[ÅKBÀCóÎ‹(úîËpÊâÆúJˆ¢5xd7™(‡0Fþµ6lféKè@×ë«6ã$­{F¿ŽM½b)MóÝQ_OIÚ)òŠôgûûPéRW¬Z­xxç}‚±A>‹áÂ×öSãìÂ—3z›¤Ç²Õhìh”û�_Ã3–Ý°Ÿµáòñ*EŽöß{Wh?Ê‘,'šÃ,?gd8m;Òq¤@ÌUÛ½ïôcØÿ´\5àÃ#lç�Ç
d%;1&Àæ‹À-3<Fà­0>&	WiÊEð‰åØ¸�~üR£ßB+ÀîôÜECußÿ–²*Ëâü´n¸>Ü�¦&9yg=¾ª7œÂWlJEy¸òÆ&ÇðÞ»Ô™p×3¦ST¶ÑJ3¤Žâ›ßBÕãÒÂ�ö^Â@ñFl¹«ýþŸ¢¯Î]Šþ±¡‹p¾8Û;q×�¥¸Úÿ�8Js„PÛ†J]‹>ÓôAÏI£‰z\]O oõ¡OŽy¯„eËZè¢HÓy:_ä§+ý?¦4Þ†ë×Fð�çÓ,w©–alàöŸ¥ø}ÒòL�#†î–ðËûÁÎ{×aÅÊ
Å.^yk¦u<‰KM4œJC…™s§¦£kN¿FÝTJw¢¥ANLˆpªÍ(»3&À˜ ÈM á‰ pÒPŽu«ßÔiº¡eXË*”!™h@7Ì¥ú©uvˆ‰MîZu¨ÇæI_5n2¼"Ž†É<v¹â�â¡á"ÿ4†êdx¿\µžcµ\À£[1F²ëZS+£ƒmÊª4%N%Ý´B®Ö%‚³Lfœ¾°_bÓËWîMu&†êÜ4T§»Ô!ÕÔªºÔ0¤š?›Ct´!9Z‰W+yº²òLI+í	æ‰ôÃæþŒÖ†úÚBæ‡Ou*¼]&]	JÞK®�“3Þå%‡áŽWÍá«¼±²`L€	,V‘þ”[d/uø¸üè>2�‰Ç¦ L!‰"£MK*P¡�_™
+=Í6¼ÉˆhsÈšRîíÁ×«Ó7Á”;wOÒ®àEe«rî¡#÷¨Ü5¼¤ŒÒ§y™ŒõÆ¥Ï¼BIŸ±�”n>—G
MèžŠ¹Ì°™c˜1œ?PŠ=·w"Þ¸kNzÉ’
Ò�¡á¤ œÒUD3àç¢›NÆÿ1&À˜À’%0EF�Ò²Ðf˜KúT2 ¦¨ñ—s™ø"dŽNLaõšŠYÙ²|Ñ²½YÉÈ—&§|Aù9`L€	0&À–�m€¹´qj™ `L€	0& `Ã‰K`L€	0&ÀL`ÃÉ$(öÆ˜ `L€	06œ¸0&À˜ `LÀ$6œL‚boL€	0&À˜ `Ã‰Ë `L€	0&ÀL`ÃÉ$(öÆ˜ `L€	06œ¸0&À˜ `LÀ$6œL‚boL€	0&À˜ `Ã‰Ë `L€	0&ÀL`ÃÉ$(öÆ˜ `L€	06œ¸0&À˜ `LÀ$6œL‚boL€	0&À˜ `Ã‰Ë `L€	0&ÀL`ÃÉ$(öÆ˜ `L€	06œ¸0&À˜ `LÀ$6œL‚boL€	0&À˜ `Ã‰Ë `L€	0&ÀL`ÃÉ$(öÆ˜ `L€	06œ¸0&À˜ `LÀ$6œL‚boL€	0&À˜ 06œb“ÅødliM¡ÿÒytLÊœšÂ¥‹¯`|ÊÐë¬<Œ÷]Âùî¡iÊˆa\²ŸÄ\Ò™¦Š÷™é?“˜ôaÔô�ŽNb~²g
“ããTö"úH“÷S±ˆÊNËfR<ß0&À˜ È"PÐpê?_�e¥+PYY‰Õ+J±ìÐù92¢èÙ½_üi–B™¢?=‡Ý¶‡0Ít™Ûïo¿ú4ö<ü06åÔx#q`Y)VK6«W tÙ2Ô_ž[¥¦!mºú‹Ž�qÛ‚š­Ë°lÙôeØ.ã}çP“Heå
o=†îaÕ|Œô·P.óï úÍZ˜SÃ8]SŒ«WSÙ+Gõ‰óHª@n-‡ªQ\Z®ò§²Y}âÆ�E>"8S#õªÆù„¾ˆõã�¢k"�±>ÊÛtÝ«5£2Ÿy8…‹ÇÈÿÖ–”Ž¦taOL€	0&p³Èk8]<Ëž“¨uu"42‚ ¯u+…¹²_n±Ö[—ò*Ûú%ø¼~üv©¡×YyX^¾°ÜŠ"3R¦ð•Í6œµ»à!4@§§Ñ‰°™ÐóâgZújAKu9,»#¼ÒB¾“&K"ä8ÜÛ÷£ÃÖ€ÀÈÆ»`4áágþI1¬ËÖí¢<óÂ«üùà÷¶‚²°Û°±$!¢à"_]‡§;¬h„ìj@Ï©=8p¦_½Š>_%<�^ák“îû±·¹¯ Ô¤c™¼ëA}ÇeåÑèëíx!é¨ÞÈ;<]üðv¶¢ò…£°<öbNÃzj¸¶&ÀÙø(¢3dñW&À˜ XDD®+>(€€½CÄs¹ËgáAávØ¡Pþj�mb,á9l6‹UX-äf­uuµŠ‹½UL(òÂÂc“ál¢Öª†·Ú]"ÖE‡Õ"lµvaw�[Tç&Â¢­ŽÂÖ9…ÃfQeÛœ" 
W=ÆGD[ƒ]q“:Úî4ùñ1Ÿ¨ÓÂÖÖ‰ºZ©«›$›¸Æº™¢ÁŸ¦”. ªŸ•tO¥Ï-õÞôîfô—ùPk“œ:Ì¥+™‚¸z½"DúÆƒbh~=Ê;¥ßÒH†ð9e>¸ù›|¬ÜÄ[•|pôBÒý¤}#ù6’_ÛT‡:êùX'B9d\´ÊòdÉšl"¡–=YîbDD•°›•¾ÛÔtFý‚=á¦"¸eY'w}*‚£¢Í.e5ˆ1]Dñ±€péÞXí¢k$+°.ß2&À˜ÀÍ@ 9•û”†£Á§·Dô>'„K1xjEg`�Y�âu�Š§pÀE‰U´ùºD�4žl.á÷«�g«b=¤¯†Î€;E-5T°yR||Bü~Ñå‘Æ�UøÒÚÜôðƒ~2Ôdøº®„’Â­fvÒ/$ÆB>á”úRÃª6n!Q'ý[�Â
	ŸÇAqÈøMNÔ°*ñYìÂÓáÁ�l~õW8?W2}�Dúj[þŒô3r7§Ø/óAMw¾œÔk�ë>p+üÓ'JEg�44jE›×/|�.Å�´·¦©”¬¸jXXÒ‹”{ö]4˜0´¤á2Ö©¤Á"Ë.éå vÂ§ä‡ÕåÏ–õ„ò†Ê‚ÍÕ¦”‰:�Ô½VttéÒ™È_«½N444ˆº„TëÉ–lSôszõf“~—äcÞ`HP�¤hs9E[Ú/ƒ,Åø`L€	ÜrNñP‡Ò¸Ò[ËTr¨¡Rz\t†•þ¹b8YÜä?.<ÔàYÝAº*�[ƒ_6ájãeqz“2Ç¼NŠ3Ó@"Ô5hIß‰ð¾ä_õx$z´†u­d°y…×ç²ÇÀ"¼½jP�B@3w¢JcjºÇ‰b#cHëíR{Ýl¢Õ7’Ð'[¿‘NÙk¢¦ÏH?#w³úGG|Âír	w›/Ã°Kb3¼Ém8	1âMeÒ0Küu¦Y·ªìÕðqt„ãÒ<DÆˆÇO½6²ü¸"œ«çKˆ‡„S1ªé=zš°¬Ï„áä	ˆÁŽD�$Üƒºž5Ípr8…‹ø9ëTÖº¶ŒµDoS£Ð«ôÀ‘á48&¢©Ž«,mø`L€	Ü\rNé)Zq‡2'%Ï=6r¥j-¿Tœ
~ç}Ÿ¡'—�Ó‡¼Ò|—"l~Ü‚«×Ô‡r�~ŠËÊ[?¡x•ÿ•|âå¾8ùD½IÊËx.¿®,Iù^~+ÍQÂ-Ê¥x\�“S{õ´´¼¬†\¾Ç½ˆ‡µÙÉVÜ¿NÓ¦kw�7ŸêÕÌÿ«¶ìBcû.<G+»ÆB?Æ‹ÿßCØ¿c=�X› ×¯lõ�ÊS©±‘~FîªxcýKÖTáÐ‘ª„6søéÅî‡ŽÂîñ£åÉm$8‚K'Äî»¿‚Áx6¤ŠzÏž&÷Züá#zÄ©x:¸�ÌsKÆŽlA¨åYzV­x)äòíëp2`‡?ÜˆZvšˆ"L…qÃü!l4»i÷ŸAYü­´P²¬îýÃ¯âÐUèáÝŸÂê‡ö óKQìKDº€=49ªÁ{«ÒB÷ík„£ça<twbö”µ¾³'QµfJfÈä¯L€	0&ðÑÐ5q:eJoÇVúúôß½‚ãU�êÔÛ²»>jÒÒ®«A9q·)SFu^~ëJä[Šw5¦oÕEÿDJHÊKÞ¨r³ÿ—M]úµûx#5réÏä·ˆT•&FbØ¶IÆÅð›òÙô¯¢’2¬Ù´Ž?wâdOÞ%›mmb†ðU�¸©®)ßôé+¬PØÝXÿ©ñ~üó¿\ÁÇ+îÁçvn27ñ]§³¼-Ö¸kŸô,ò–j8Û¡•‚2lÞQM.—ñ>­Ø Í�¦ÕjÏ?ÝC¶�	ûCŠL^C—šñüw¯ týçqòÈ®¤Q]²n;™ZÀY2ß»~p\1JÞþPæïVÜ®-ˆ ¾j3N¢Áè×¡dcR²™Ê‰’*´Ùa¦•‰ôp*fšZ.+V­VßQ(ŸÅpákûÉ°sáË;3Í& lC5»§"¾†g,»a?kÃåãó`È¦«Íß˜ `L`	ä^UW´‡Ziúo“‡Zº1:9‰áþK¨¯?¯®*Zµ�“RG¿Ò„þñ&‡ºÑxð,u,Ôâ^­Ñ4Pú–rê”zÚŽsýãˆŒ÷áÔÁ£4’Uƒ{ác“ã¥=|B´jK^ï„h¿$Ú3ÉÌ–=e[¾ '…ÙÿÅxeh“$kˆöi:Ý|QYV¶ù³ Ô¡±åï0‰a¨û¯q¸CÆsûEúp¬æ.ööc˜tz§þì$…N5ìJúŽÄù~Òy´Ï=EîÖ½Júõ›#ý£o÷Àf³a÷SßËZ§$¶ÀS‘aôõõã�¾aòu�7úèû€Êoý§•ÉÆÆ1 óŸÒ÷­oÒ²2lÄ­šaCß†þéy2~€ú½ÿ/ýŸ}]îFSSNµÿ4}µfÉFØd‘!þ«ë´�Xïl?Ú«ë€Ú›E=MŠÑ éè�O oIÝè¯Ø\þe«’õ„Š'®ôÿýèë½„Sÿë0=±Àr—Z@c°Ÿçzá *²BÇÐÝÒLåc “QÚRaeäúÑ•&V‘f‰âL€	0&°°äYŒ«¶š)1�ÅÞ–œ+ñ*+«(5êZÕ¦Í}Uç8¹¿š$k¡9*rŽ“œ ®Î›JMîN†—iGR“AÔÉµ©ù3š?uÂº:OÅêNMFVæXéWÅMDƒ2A<%ÃâèHê´©Úýiõžœ<®ŸœžÍ«Ì’š(Þ™œã“'}Ú²C)Û@?#w3úks¡L§K—æäÄr-•ÏÔ´�×­ã'Ók­ (rÆÔÉ	ñ:á‰Û€[]m™S¿pP�ÐŸˆßâhM­Z'&ç§éF:˜\U''‡ëËŽTGe•ZU§,VÐÉ·Ø´Ð@› N+ñ”U˜ùVñÑÜ'‡ºÚS+· ÷C™Þ—��Ÿ0&À˜ÀMD`™Ô•*÷ü—Ü�™zeJhHª¬L¶Hy–;;Ó®ÑE%XUa²«)X½SäO¡lUEr¨&ÓËl¾G¨·IÎµ*+#ù™“4Œ"wD/©X…²L7‘NÅbˆD#ÔË‘™~u¤oï ûÐFÚY<š7}õ#
ºÏRI4ð£ü§ôSþWPþÏ ¡�|*_Ê®áEŠ|Ï7Ì96Ð‚ÒÍ‡áòOàÈ¶ìþ¦¤"SÄ'Bc·T>$¾˜ `Làæ'`l8ÝüiüR@†ÓÖr|c¿�ç´|ôç=J2öG'¦°zMÅ<‹ó®=GÀ˜ `³ 0÷�³Pfñ-ÆÚý|éwÔ•t‹']œ…€\°†Y0&À˜ÀR$À=NK1×9ÍL€	0&À˜ÀŒä^U7#Qˆ	0&À˜ `‹› N‹;9uL€	0&À˜À`Ãia²(&À˜ `L`q`Ãiqç/§Ž	0&À˜ ˜Cl8Í!LÅ˜ `L€	,nl8-îüåÔ1&À˜ `sH€§9„É¢˜ `L€	0�ÅM€§Å�¿œ:&À˜ `L`	°á4‡0Y`L€	0&°¸	°á´¸ó—SÇ˜ `L€	Ì!6œæ&‹bL€	0&À76œwþrê˜ `L€	0�9$À†ÓÂdQL€	0&À˜Àâ&À†ÓâÎ_N`L€	0&0‡ØpšC˜,Š	0&À˜ XÜŠr%ï¯þê¯r=N>ûã?þãä=ß0&À˜ `L`©X&èZ*‰åt2&À˜ `L`6x¨n6ô8,`L€	0&°¤°á´¤²›Ë˜ `L€	Ì† N³¡Ça™ `L€	0�%E€§%•ÝœX&À˜ `L`6Øpš=Ë˜ `L€	,)l8-©ìæÄ2&À˜ `³!À†ÓlèqX&À˜ `L`I`ÃiIe7'–	0&À˜ ˜6œfC�Ã2&À˜ `KŠ NK*»9±L€	0&À˜Àl°á4z–	0&À˜ XRØpZRÙÍ‰eL€	0&ÀfC€§ÙÐã°L€	0&À˜À’"À†Ó’ÊnN,`L€	0&0l8Í†‡eL€	0&À–6œ–Tvsb™ `L€	0�Ù`Ãi6ô8,`L€	0&°¤°á´¤²›Ë˜ `L€	Ì† N³¡Ça™ `L€	0�%Eàÿön¿%hæÌ?    IEND®B`‚{
  "author": {
    "name": "max ogden"
  },
  "bin": {
    "nugget": "bin.js"
  },
  "dependencies": {
    "debug": "^2.1.3",
    "minimist": "^1.1.0",
    "pretty-bytes": "^1.0.2",
    "progress-stream": "^1.1.0",
    "request": "^2.45.0",
    "single-line-log": "^1.1.2",
    "throttleit": "0.0.2"
  },
  "deprecated": false,
  "description": "minimalist wget clone written in node. HTTP GETs a file and saves it to the current working directory",
  "devDependencies": {
    "standard": "^6.0.5",
    "tape": "^3.0.1",
    "tape-spawn": "^1.4.2"
  },
  "directories": {
    "test": "test"
  },
  "homepage": "https://github.com/maxogden/nugget",
  "license": "BSD",
  "main": "index.js",
  "name": "nugget",
  "repository": {
    "type": "git",
    "url": "git://github.com/maxogden/nugget.git"
  },
  "version": "2.0.1"
}Usage: nugget <urls> [options]
  -o         output filename
  -d         output parent directory
  -c         resume aborted download
  -f         ignore response codes > 299
  -s         concurrent socket limit (default infinity)
  -q         disable logging
  --stdin    download all urls written to stdin (newline delimited)'use strict';
module.exports = Number.isNaN || function (x) {
	return x !== x;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "ES2015 Number.isNaN() ponyfill",
  "devDependencies": {
    "ava": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/number-is-nan#readme",
  "license": "MIT",
  "name": "number-is-nan",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/number-is-nan.git"
  },
  "version": "1.0.1"
}Apache License

Version 2.0, January 2004

http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

You must give any other recipients of the Work or Derivative Works a copy of this License; and

You must cause any modified files to carry prominent notices stating that You changed the files; and

You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONSvar crypto = require('crypto')

function sha (key, body, algorithm) {
  return crypto.createHmac(algorithm, key).update(body).digest('base64')
}

function rsa (key, body) {
  return crypto.createSign('RSA-SHA1').update(body).sign(key, 'base64')
}

function rfc3986 (str) {
  return encodeURIComponent(str)
    .replace(/!/g,'%21')
    .replace(/\*/g,'%2A')
    .replace(/\(/g,'%28')
    .replace(/\)/g,'%29')
    .replace(/'/g,'%27')
}

// Maps object to bi-dimensional array
// Converts { foo: 'A', bar: [ 'b', 'B' ]} to
// [ ['foo', 'A'], ['bar', 'b'], ['bar', 'B'] ]
function map (obj) {
  var key, val, arr = []
  for (key in obj) {
    val = obj[key]
    if (Array.isArray(val))
      for (var i = 0; i < val.length; i++)
        arr.push([key, val[i]])
    else if (typeof val === 'object')
      for (var prop in val)
        arr.push([key + '[' + prop + ']', val[prop]])
    else
      arr.push([key, val])
  }
  return arr
}

// Compare function for sort
function compare (a, b) {
  return a > b ? 1 : a < b ? -1 : 0
}

function generateBase (httpMethod, base_uri, params) {
  // adapted from https://dev.twitter.com/docs/auth/oauth and 
  // https://dev.twitter.com/docs/auth/creating-signature

  // Parameter normalization
  // http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2
  var normalized = map(params)
  // 1.  First, the name and value of each parameter are encoded
  .map(function (p) {
    return [ rfc3986(p[0]), rfc3986(p[1] || '') ]
  })
  // 2.  The parameters are sorted by name, using ascending byte value
  //     ordering.  If two or more parameters share the same name, they
  //     are sorted by their value.
  .sort(function (a, b) {
    return compare(a[0], b[0]) || compare(a[1], b[1])
  })
  // 3.  The name of each parameter is concatenated to its corresponding
  //     value using an "=" character (ASCII code 61) as a separator, even
  //     if the value is empty.
  .map(function (p) { return p.join('=') })
   // 4.  The sorted name/value pairs are concatenated together into a
   //     single string by using an "&" character (ASCII code 38) as
   //     separator.
  .join('&')

  var base = [
    rfc3986(httpMethod ? httpMethod.toUpperCase() : 'GET'),
    rfc3986(base_uri),
    rfc3986(normalized)
  ].join('&')

  return base
}

function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) {
  var base = generateBase(httpMethod, base_uri, params)
  var key = [
    consumer_secret || '',
    token_secret || ''
  ].map(rfc3986).join('&')

  return sha(key, base, 'sha1')
}

function hmacsign256 (httpMethod, base_uri, params, consumer_secret, token_secret) {
  var base = generateBase(httpMethod, base_uri, params)
  var key = [
    consumer_secret || '',
    token_secret || ''
  ].map(rfc3986).join('&')

  return sha(key, base, 'sha256')
}

function rsasign (httpMethod, base_uri, params, private_key, token_secret) {
  var base = generateBase(httpMethod, base_uri, params)
  var key = private_key || ''

  return rsa(key, base)
}

function plaintext (consumer_secret, token_secret) {
  var key = [
    consumer_secret || '',
    token_secret || ''
  ].map(rfc3986).join('&')

  return key
}

function sign (signMethod, httpMethod, base_uri, params, consumer_secret, token_secret) {
  var method
  var skipArgs = 1

  switch (signMethod) {
    case 'RSA-SHA1':
      method = rsasign
      break
    case 'HMAC-SHA1':
      method = hmacsign
      break
    case 'HMAC-SHA256':
      method = hmacsign256
      break
    case 'PLAINTEXT':
      method = plaintext
      skipArgs = 4
      break
    default:
     throw new Error('Signature method not supported: ' + signMethod)
  }

  return method.apply(null, [].slice.call(arguments, skipArgs))
}

exports.hmacsign = hmacsign
exports.hmacsign256 = hmacsign256
exports.rsasign = rsasign
exports.plaintext = plaintext
exports.sign = sign
exports.rfc3986 = rfc3986
exports.generateBase = generateBase{
  "author": {
    "name": "Mikeal Rogers",
    "email": "mikeal.rogers@gmail.com",
    "url": "http://www.futurealoof.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "OAuth 1 signing. Formerly a vendor lib in mikeal/request, now a standalone module.",
  "devDependencies": {},
  "engines": {
    "node": "*"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/mikeal/oauth-sign#readme",
  "license": "Apache-2.0",
  "main": "index.js",
  "name": "oauth-sign",
  "optionalDependencies": {},
  "repository": {
    "url": "git+https://github.com/mikeal/oauth-sign.git"
  },
  "version": "0.9.0"
}/*
object-assign
(c) Sindre Sorhus
@license MIT
*/

'use strict';
/* eslint-disable no-unused-vars */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;

function toObject(val) {
	if (val === null || val === undefined) {
		throw new TypeError('Object.assign cannot be called with null or undefined');
	}

	return Object(val);
}

function shouldUseNative() {
	try {
		if (!Object.assign) {
			return false;
		}

		// Detect buggy property enumeration order in older V8 versions.

		// https://bugs.chromium.org/p/v8/issues/detail?id=4118
		var test1 = new String('abc');  // eslint-disable-line no-new-wrappers
		test1[5] = 'de';
		if (Object.getOwnPropertyNames(test1)[0] === '5') {
			return false;
		}

		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
		var test2 = {};
		for (var i = 0; i < 10; i++) {
			test2['_' + String.fromCharCode(i)] = i;
		}
		var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
			return test2[n];
		});
		if (order2.join('') !== '0123456789') {
			return false;
		}

		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
		var test3 = {};
		'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
			test3[letter] = letter;
		});
		if (Object.keys(Object.assign({}, test3)).join('') !==
				'abcdefghijklmnopqrst') {
			return false;
		}

		return true;
	} catch (err) {
		// We don't expect any of the above to throw, but better to be safe.
		return false;
	}
}

module.exports = shouldUseNative() ? Object.assign : function (target, source) {
	var from;
	var to = toObject(target);
	var symbols;

	for (var s = 1; s < arguments.length; s++) {
		from = Object(arguments[s]);

		for (var key in from) {
			if (hasOwnProperty.call(from, key)) {
				to[key] = from[key];
			}
		}

		if (getOwnPropertySymbols) {
			symbols = getOwnPropertySymbols(from);
			for (var i = 0; i < symbols.length; i++) {
				if (propIsEnumerable.call(from, symbols[i])) {
					to[symbols[i]] = from[symbols[i]];
				}
			}
		}
	}

	return to;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "ES2015 `Object.assign()` ponyfill",
  "devDependencies": {
    "ava": "^0.16.0",
    "lodash": "^4.16.4",
    "matcha": "^0.7.0",
    "xo": "^0.16.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/object-assign#readme",
  "license": "MIT",
  "name": "object-assign",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/object-assign.git"
  },
  "version": "4.1.1"
}var hasOwn = Object.prototype.hasOwnProperty;
var toString = Object.prototype.toString;

var isFunction = function (fn) {
	var isFunc = (typeof fn === 'function' && !(fn instanceof RegExp)) || toString.call(fn) === '[object Function]';
	if (!isFunc && typeof window !== 'undefined') {
		isFunc = fn === window.setTimeout || fn === window.alert || fn === window.confirm || fn === window.prompt;
	}
	return isFunc;
};

module.exports = function forEach(obj, fn) {
	if (!isFunction(fn)) {
		throw new TypeError('iterator must be a function');
	}
	var i, k,
		isString = typeof obj === 'string',
		l = obj.length,
		context = arguments.length > 2 ? arguments[2] : null;
	if (l === +l) {
		for (i = 0; i < l; i++) {
			if (context === null) {
				fn(isString ? obj.charAt(i) : obj[i], i, obj);
			} else {
				fn.call(context, isString ? obj.charAt(i) : obj[i], i, obj);
			}
		}
	} else {
		for (k in obj) {
			if (hasOwn.call(obj, k)) {
				if (context === null) {
					fn(obj[k], k, obj);
				} else {
					fn.call(context, obj[k], k, obj);
				}
			}
		}
	}
};

module.exports = Object.keys || require('./shim');

var toString = Object.prototype.toString;

module.exports = function isArguments(value) {
	var str = toString.call(value);
	var isArguments = str === '[object Arguments]';
	if (!isArguments) {
		isArguments = str !== '[object Array]'
			&& value !== null
			&& typeof value === 'object'
			&& typeof value.length === 'number'
			&& value.length >= 0
			&& toString.call(value.callee) === '[object Function]';
	}
	return isArguments;
};

{
  "author": {
    "name": "Jordan Harband"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "An Object.keys replacement, in case Object.keys is not available. From https://github.com/kriskowal/es5-shim",
  "devDependencies": {
    "foreach": "~2.0.3",
    "indexof": "~0.0.1",
    "is": "~0.2.6",
    "tape": "~1.0.4"
  },
  "homepage": "https://github.com/ljharb/object-keys#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "object-keys",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/object-keys.git"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "version": "0.4.0"
}(function () {
	"use strict";

	// modified from https://github.com/kriskowal/es5-shim
	var has = Object.prototype.hasOwnProperty,
		toString = Object.prototype.toString,
		forEach = require('./foreach'),
		isArgs = require('./isArguments'),
		hasDontEnumBug = !({'toString': null}).propertyIsEnumerable('toString'),
		hasProtoEnumBug = (function () {}).propertyIsEnumerable('prototype'),
		dontEnums = [
			"toString",
			"toLocaleString",
			"valueOf",
			"hasOwnProperty",
			"isPrototypeOf",
			"propertyIsEnumerable",
			"constructor"
		],
		keysShim;

	keysShim = function keys(object) {
		var isObject = object !== null && typeof object === 'object',
			isFunction = toString.call(object) === '[object Function]',
			isArguments = isArgs(object),
			theKeys = [];

		if (!isObject && !isFunction && !isArguments) {
			throw new TypeError("Object.keys called on a non-object");
		}

		if (isArguments) {
			forEach(object, function (value) {
				theKeys.push(value);
			});
		} else {
			var name,
				skipProto = hasProtoEnumBug && isFunction;

			for (name in object) {
				if (!(skipProto && name === 'prototype') && has.call(object, name)) {
					theKeys.push(name);
				}
			}
		}

		if (hasDontEnumBug) {
			var ctor = object.constructor,
				skipConstructor = ctor && ctor.prototype === object;

			forEach(dontEnums, function (dontEnum) {
				if (!(skipConstructor && dontEnum === 'constructor') && has.call(object, dontEnum)) {
					theKeys.push(dontEnum);
				}
			});
		}
		return theKeys;
	};

	module.exports = keysShim;
}());

The MIT License (MIT)

Copyright (c) 2017 Zhou Hancheng (z308114274@gmail.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
module.exports = (val) => {
  return val != null && typeof val === 'object' && val.constructor !== RegExp
}
{
  "author": {
    "name": "zhouhancheng",
    "email": "z308114274@gmail.com"
  },
  "deprecated": false,
  "description": "Is the value an object or an array but not null?",
  "devDependencies": {
    "tape": "^4.8.0"
  },
  "homepage": "https://github.com/ZhouHansen/objectnotnull#readme",
  "license": "ISC",
  "main": "dist/index.js",
  "name": "objectorarray",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ZhouHansen/objectnotnull.git"
  },
  "version": "1.0.4"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
var wrappy = require('wrappy')
module.exports = wrappy(once)
module.exports.strict = wrappy(onceStrict)

once.proto = once(function () {
  Object.defineProperty(Function.prototype, 'once', {
    value: function () {
      return once(this)
    },
    configurable: true
  })

  Object.defineProperty(Function.prototype, 'onceStrict', {
    value: function () {
      return onceStrict(this)
    },
    configurable: true
  })
})

function once (fn) {
  var f = function () {
    if (f.called) return f.value
    f.called = true
    return f.value = fn.apply(this, arguments)
  }
  f.called = false
  return f
}

function onceStrict (fn) {
  var f = function () {
    if (f.called)
      throw new Error(f.onceError)
    f.called = true
    return f.value = fn.apply(this, arguments)
  }
  var name = fn.name || 'Function wrapped with `once`'
  f.onceError = name + " shouldn't be called more than once"
  f.called = false
  return f
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {
    "wrappy": "1"
  },
  "deprecated": false,
  "description": "Run a function exactly one time",
  "devDependencies": {
    "tap": "^7.0.1"
  },
  "directories": {
    "test": "test"
  },
  "files": [
    "once.js"
  ],
  "homepage": "https://github.com/isaacs/once#readme",
  "license": "ISC",
  "main": "once.js",
  "name": "once",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/once.git"
  },
  "version": "1.4.0"
}'use strict';
var os = require('os');

function homedir() {
	var env = process.env;
	var home = env.HOME;
	var user = env.LOGNAME || env.USER || env.LNAME || env.USERNAME;

	if (process.platform === 'win32') {
		return env.USERPROFILE || env.HOMEDRIVE + env.HOMEPATH || home || null;
	}

	if (process.platform === 'darwin') {
		return home || (user ? '/Users/' + user : null);
	}

	if (process.platform === 'linux') {
		return home || (process.getuid() === 0 ? '/root' : (user ? '/home/' + user : null));
	}

	return home || null;
}

module.exports = typeof os.homedir === 'function' ? os.homedir : homedir;
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Node.js 4 `os.homedir()` ponyfill",
  "devDependencies": {
    "ava": "*",
    "path-exists": "^2.0.0",
    "xo": "^0.16.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/os-homedir#readme",
  "license": "MIT",
  "name": "os-homedir",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/os-homedir.git"
  },
  "version": "1.0.2"
}'use strict';
var isWindows = process.platform === 'win32';
var trailingSlashRe = isWindows ? /[^:]\\$/ : /.\/$/;

// https://github.com/nodejs/node/blob/3e7a14381497a3b73dda68d05b5130563cdab420/lib/os.js#L25-L43
module.exports = function () {
	var path;

	if (isWindows) {
		path = process.env.TEMP ||
			process.env.TMP ||
			(process.env.SystemRoot || process.env.windir) + '\\temp';
	} else {
		path = process.env.TMPDIR ||
			process.env.TMP ||
			process.env.TEMP ||
			'/tmp';
	}

	if (trailingSlashRe.test(path)) {
		path = path.slice(0, -1);
	}

	return path;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Node.js os.tmpdir() ponyfill",
  "devDependencies": {
    "ava": "*",
    "xo": "^0.16.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/os-tmpdir#readme",
  "license": "MIT",
  "name": "os-tmpdir",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/os-tmpdir.git"
  },
  "version": "1.0.2"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
var isWindows = process.platform === 'win32'
var path = require('path')
var exec = require('child_process').exec
var osTmpdir = require('os-tmpdir')
var osHomedir = require('os-homedir')

// looking up envs is a bit costly.
// Also, sometimes we want to have a fallback
// Pass in a callback to wait for the fallback on failures
// After the first lookup, always returns the same thing.
function memo (key, lookup, fallback) {
  var fell = false
  var falling = false
  exports[key] = function (cb) {
    var val = lookup()
    if (!val && !fell && !falling && fallback) {
      fell = true
      falling = true
      exec(fallback, function (er, output, stderr) {
        falling = false
        if (er) return // oh well, we tried
        val = output.trim()
      })
    }
    exports[key] = function (cb) {
      if (cb) process.nextTick(cb.bind(null, null, val))
      return val
    }
    if (cb && !falling) process.nextTick(cb.bind(null, null, val))
    return val
  }
}

memo('user', function () {
  return ( isWindows
         ? process.env.USERDOMAIN + '\\' + process.env.USERNAME
         : process.env.USER
         )
}, 'whoami')

memo('prompt', function () {
  return isWindows ? process.env.PROMPT : process.env.PS1
})

memo('hostname', function () {
  return isWindows ? process.env.COMPUTERNAME : process.env.HOSTNAME
}, 'hostname')

memo('tmpdir', function () {
  return osTmpdir()
})

memo('home', function () {
  return osHomedir()
})

memo('path', function () {
  return (process.env.PATH ||
          process.env.Path ||
          process.env.path).split(isWindows ? ';' : ':')
})

memo('editor', function () {
  return process.env.EDITOR ||
         process.env.VISUAL ||
         (isWindows ? 'notepad.exe' : 'vi')
})

memo('shell', function () {
  return isWindows ? process.env.ComSpec || 'cmd'
         : process.env.SHELL || 'bash'
})
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {
    "os-homedir": "^1.0.0",
    "os-tmpdir": "^1.0.0"
  },
  "deprecated": false,
  "description": "Look up environment settings specific to different operating systems",
  "devDependencies": {
    "tap": "^11.1.0"
  },
  "directories": {
    "test": "test"
  },
  "files": [
    "osenv.js"
  ],
  "homepage": "https://github.com/npm/osenv#readme",
  "license": "ISC",
  "main": "osenv.js",
  "name": "osenv",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/osenv.git"
  },
  "version": "0.1.5"
}'use strict';

class CancelError extends Error {
	constructor(reason) {
		super(reason || 'Promise was canceled');
		this.name = 'CancelError';
	}

	get isCanceled() {
		return true;
	}
}

class PCancelable {
	static fn(userFn) {
		return (...args) => {
			return new PCancelable((resolve, reject, onCancel) => {
				args.push(onCancel);
				userFn(...args).then(resolve, reject);
			});
		};
	}

	constructor(executor) {
		this._cancelHandlers = [];
		this._isPending = true;
		this._isCanceled = false;
		this._rejectOnCancel = true;

		this._promise = new Promise((resolve, reject) => {
			this._reject = reject;

			const onResolve = value => {
				this._isPending = false;
				resolve(value);
			};

			const onReject = error => {
				this._isPending = false;
				reject(error);
			};

			const onCancel = handler => {
				this._cancelHandlers.push(handler);
			};

			Object.defineProperties(onCancel, {
				shouldReject: {
					get: () => this._rejectOnCancel,
					set: bool => {
						this._rejectOnCancel = bool;
					}
				}
			});

			return executor(onResolve, onReject, onCancel);
		});
	}

	then(onFulfilled, onRejected) {
		return this._promise.then(onFulfilled, onRejected);
	}

	catch(onRejected) {
		return this._promise.catch(onRejected);
	}

	finally(onFinally) {
		return this._promise.finally(onFinally);
	}

	cancel(reason) {
		if (!this._isPending || this._isCanceled) {
			return;
		}

		if (this._cancelHandlers.length > 0) {
			try {
				for (const handler of this._cancelHandlers) {
					handler();
				}
			} catch (error) {
				this._reject(error);
			}
		}

		this._isCanceled = true;
		if (this._rejectOnCancel) {
			this._reject(new CancelError(reason));
		}
	}

	get isCanceled() {
		return this._isCanceled;
	}
}

Object.setPrototypeOf(PCancelable.prototype, Promise.prototype);

module.exports = PCancelable;
module.exports.default = PCancelable;

module.exports.CancelError = CancelError;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Create a promise that can be canceled",
  "devDependencies": {
    "ava": "^1.3.1",
    "delay": "^4.1.0",
    "promise.prototype.finally": "^3.1.0",
    "tsd-check": "^0.3.0",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/sindresorhus/p-cancelable#readme",
  "license": "MIT",
  "name": "p-cancelable",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/p-cancelable.git"
  },
  "version": "1.1.0"
}'use strict';
module.exports = (promise, onFinally) => {
	onFinally = onFinally || (() => {});

	return promise.then(
		val => new Promise(resolve => {
			resolve(onFinally());
		}).then(() => val),
		err => new Promise(resolve => {
			resolve(onFinally());
		}).then(() => {
			throw err;
		})
	);
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "`Promise#finally()` ponyfill - Invoked when the promise is settled regardless of outcome",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/p-finally#readme",
  "license": "MIT",
  "name": "p-finally",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/p-finally.git"
  },
  "version": "1.0.0"
}'use strict';
const pTry = require('p-try');

const pLimit = concurrency => {
	if (!((Number.isInteger(concurrency) || concurrency === Infinity) && concurrency > 0)) {
		return Promise.reject(new TypeError('Expected `concurrency` to be a number from 1 and up'));
	}

	const queue = [];
	let activeCount = 0;

	const next = () => {
		activeCount--;

		if (queue.length > 0) {
			queue.shift()();
		}
	};

	const run = (fn, resolve, ...args) => {
		activeCount++;

		const result = pTry(fn, ...args);

		resolve(result);

		result.then(next, next);
	};

	const enqueue = (fn, resolve, ...args) => {
		if (activeCount < concurrency) {
			run(fn, resolve, ...args);
		} else {
			queue.push(run.bind(null, fn, resolve, ...args));
		}
	};

	const generator = (fn, ...args) => new Promise(resolve => enqueue(fn, resolve, ...args));
	Object.defineProperties(generator, {
		activeCount: {
			get: () => activeCount
		},
		pendingCount: {
			get: () => queue.length
		},
		clearQueue: {
			value: () => {
				queue.length = 0;
			}
		}
	});

	return generator;
};

module.exports = pLimit;
module.exports.default = pLimit;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "p-try": "^2.0.0"
  },
  "deprecated": false,
  "description": "Run multiple promise-returning & async functions with limited concurrency",
  "devDependencies": {
    "ava": "^1.2.1",
    "delay": "^4.1.0",
    "in-range": "^1.0.0",
    "random-int": "^1.0.0",
    "time-span": "^2.0.0",
    "tsd-check": "^0.3.0",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "funding": "https://github.com/sponsors/sindresorhus",
  "homepage": "https://github.com/sindresorhus/p-limit#readme",
  "license": "MIT",
  "name": "p-limit",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/p-limit.git"
  },
  "version": "2.3.0"
}'use strict';
const pLimit = require('p-limit');

class EndError extends Error {
	constructor(value) {
		super();
		this.value = value;
	}
}

// The input can also be a promise, so we `Promise.resolve()` it
const testElement = (el, tester) => Promise.resolve(el).then(tester);

// The input can also be a promise, so we `Promise.all()` them both
const finder = el => Promise.all(el).then(val => val[1] === true && Promise.reject(new EndError(val[0])));

module.exports = (iterable, tester, opts) => {
	opts = Object.assign({
		concurrency: Infinity,
		preserveOrder: true
	}, opts);

	const limit = pLimit(opts.concurrency);

	// Start all the promises concurrently with optional limit
	const items = [...iterable].map(el => [el, limit(testElement, el, tester)]);

	// Check the promises either serially or concurrently
	const checkLimit = pLimit(opts.preserveOrder ? 1 : Infinity);

	return Promise.all(items.map(el => checkLimit(finder, el)))
		.then(() => {})
		.catch(err => err instanceof EndError ? err.value : Promise.reject(err));
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "p-limit": "^2.0.0"
  },
  "deprecated": false,
  "description": "Get the first fulfilled promise that satisfies the provided testing function",
  "devDependencies": {
    "ava": "*",
    "delay": "^3.0.0",
    "in-range": "^1.0.0",
    "time-span": "^2.0.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/p-locate#readme",
  "license": "MIT",
  "name": "p-locate",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/p-locate.git"
  },
  "version": "3.0.0"
}'use strict';

const pTry = (fn, ...arguments_) => new Promise(resolve => {
	resolve(fn(...arguments_));
});

module.exports = pTry;
// TODO: remove this in the next major version
module.exports.default = pTry;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "`Start a promise chain",
  "devDependencies": {
    "ava": "^1.4.1",
    "tsd": "^0.7.1",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/sindresorhus/p-try#readme",
  "license": "MIT",
  "name": "p-try",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/p-try.git"
  },
  "version": "2.2.0"
}'use strict';
const {URL} = require('url');
const {Agent: HttpAgent} = require('http');
const {Agent: HttpsAgent} = require('https');
const got = require('got');
const registryUrl = require('registry-url');
const registryAuthToken = require('registry-auth-token');
const semver = require('semver');

// These agent options are chosen to match the npm client defaults and help with performance
// See: `npm config get maxsockets` and #50
const agentOptions = {
	keepAlive: true,
	maxSockets: 50
};
const httpAgent = new HttpAgent(agentOptions);
const httpsAgent = new HttpsAgent(agentOptions);

class PackageNotFoundError extends Error {
	constructor(packageName) {
		super(`Package \`${packageName}\` could not be found`);
		this.name = 'PackageNotFoundError';
	}
}

class VersionNotFoundError extends Error {
	constructor(packageName, version) {
		super(`Version \`${version}\` for package \`${packageName}\` could not be found`);
		this.name = 'VersionNotFoundError';
	}
}

const packageJson = async (packageName, options) => {
	options = {
		version: 'latest',
		...options
	};

	const scope = packageName.split('/')[0];
	const registryUrl_ = options.registryUrl || registryUrl(scope);
	const packageUrl = new URL(encodeURIComponent(packageName).replace(/^%40/, '@'), registryUrl_);
	const authInfo = registryAuthToken(registryUrl_.toString(), {recursive: true});

	const headers = {
		accept: 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*'
	};

	if (options.fullMetadata) {
		delete headers.accept;
	}

	if (authInfo) {
		headers.authorization = `${authInfo.type} ${authInfo.token}`;
	}

	const gotOptions = {
		json: true,
		headers,
		agent: {
			http: httpAgent,
			https: httpsAgent
		}
	};

	if (options.agent) {
		gotOptions.agent = options.agent;
	}

	let response;
	try {
		response = await got(packageUrl, gotOptions);
	} catch (error) {
		if (error.statusCode === 404) {
			throw new PackageNotFoundError(packageName);
		}

		throw error;
	}

	let data = response.body;

	if (options.allVersions) {
		return data;
	}

	let {version} = options;
	const versionError = new VersionNotFoundError(packageName, version);

	if (data['dist-tags'][version]) {
		data = data.versions[data['dist-tags'][version]];
	} else if (version) {
		if (!data.versions[version]) {
			const versions = Object.keys(data.versions);
			version = semver.maxSatisfying(versions, version);

			if (!version) {
				throw versionError;
			}
		}

		data = data.versions[version];

		if (!data) {
			throw versionError;
		}
	}

	return data;
};

module.exports = packageJson;
// TODO: remove this in the next major version
module.exports.default = packageJson;
module.exports.PackageNotFoundError = PackageNotFoundError;
module.exports.VersionNotFoundError = VersionNotFoundError;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "got": "^9.6.0",
    "registry-auth-token": "^4.0.0",
    "registry-url": "^5.0.0",
    "semver": "^6.2.0"
  },
  "deprecated": false,
  "description": "Get metadata of a package from the npm registry",
  "devDependencies": {
    "@types/node": "^12.6.8",
    "ava": "^2.2.0",
    "mock-private-registry": "^1.1.2",
    "tsd": "^0.7.4",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/sindresorhus/package-json#readme",
  "license": "MIT",
  "name": "package-json",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/package-json.git"
  },
  "version": "6.5.0"
}This software is released under the MIT license:

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
var convert = require('color-convert');

module.exports = function (cstr) {
    var m, conv, parts, alpha;
    if (m = /^((?:rgb|hs[lv]|cmyk|xyz|lab)a?)\s*\(([^\)]*)\)/.exec(cstr)) {
        var name = m[1];
        var base = name.replace(/a$/, '');
        var size = base === 'cmyk' ? 4 : 3;
        conv = convert[base];
        
        parts = m[2].replace(/^\s+|\s+$/g, '')
            .split(/\s*,\s*/)
            .map(function (x, i) {
                if (/%$/.test(x) && i === size) {
                    return parseFloat(x) / 100;
                }
                else if (/%$/.test(x)) {
                    return parseFloat(x);
                }
                return parseFloat(x);
            })
        ;
        if (name === base) parts.push(1);
        alpha = parts[size] === undefined ? 1 : parts[size];
        parts = parts.slice(0, size);
        
        conv[base] = function () { return parts };
    }
    else if (/^#[A-Fa-f0-9]+$/.test(cstr)) {
        var base = cstr.replace(/^#/,'');
        var size = base.length;
        conv = convert.rgb;
        parts = base.split(size === 3 ? /(.)/ : /(..)/);
        parts = parts.filter(Boolean)
            .map(function (x) {
                if (size === 3) {
                    return parseInt(x + x, 16);
                }
                else {
                    return parseInt(x, 16)
                }
            })
        ;
        alpha = 1;
        conv.rgb = function () { return parts };
        if (!parts[0]) parts[0] = 0;
        if (!parts[1]) parts[1] = 0;
        if (!parts[2]) parts[2] = 0;
    }
    else {
        conv = convert.keyword;
        conv.keyword = function () { return cstr };
        parts = cstr;
        alpha = 1;
    }
    
    var res = {
        rgb: undefined,
        hsl: undefined,
        hsv: undefined,
        cmyk: undefined,
        keyword: undefined,
        hex: undefined
    };
    try { res.rgb = conv.rgb(parts) } catch (e) {}
    try { res.hsl = conv.hsl(parts) } catch (e) {}
    try { res.hsv = conv.hsv(parts) } catch (e) {}
    try { res.cmyk = conv.cmyk(parts) } catch (e) {}
    try { res.keyword = conv.keyword(parts) } catch (e) {}
    
    if (res.rgb) res.hex = '#' + res.rgb.map(function (x) {
        var s = x.toString(16);
        if (s.length === 1) return '0' + s;
        return s;
    }).join('');
    
    if (res.rgb) res.rgba = res.rgb.concat(alpha);
    if (res.hsl) res.hsla = res.hsl.concat(alpha);
    if (res.hsv) res.hsva = res.hsv.concat(alpha);
    if (res.cmyk) res.cmyka = res.cmyk.concat(alpha);
    
    return res;
};
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "dependencies": {
    "color-convert": "~0.5.0"
  },
  "deprecated": false,
  "description": "parse a css color string (plus hsv and cmyk) into an object",
  "devDependencies": {
    "tape": "~1.0.4"
  },
  "homepage": "https://github.com/substack/parse-color",
  "license": "MIT",
  "main": "index.js",
  "name": "parse-color",
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/parse-color.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/8..latest",
      "firefox/16..latest",
      "firefox/nightly",
      "chrome/22..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  },
  "version": "1.0.0"
}'use strict';
var errorEx = require('error-ex');
var fallback = require('./vendor/parse');

var JSONError = errorEx('JSONError', {
	fileName: errorEx.append('in %s')
});

module.exports = function (x, reviver, filename) {
	if (typeof reviver === 'string') {
		filename = reviver;
		reviver = null;
	}

	try {
		try {
			return JSON.parse(x, reviver);
		} catch (err) {
			fallback.parse(x, {
				mode: 'json',
				reviver: reviver
			});

			throw err;
		}
	} catch (err) {
		var jsonErr = new JSONError(err);

		if (filename) {
			jsonErr.fileName = filename;
		}

		throw jsonErr;
	}
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "error-ex": "^1.2.0"
  },
  "deprecated": false,
  "description": "Parse JSON with more helpful errors",
  "devDependencies": {
    "ava": "0.0.4",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js",
    "vendor"
  ],
  "homepage": "https://github.com/sindresorhus/parse-json#readme",
  "license": "MIT",
  "name": "parse-json",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/parse-json.git"
  },
  "version": "2.2.0"
}/*
 * Author: Alex Kocharin <alex@kocharin.ru>
 * GIT: https://github.com/rlidwka/jju
 * License: WTFPL, grab your copy here: http://www.wtfpl.net/txt/copying/
 */

// RTFM: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

var Uni = require('./unicode')

function isHexDigit(x) {
  return (x >= '0' && x <= '9')
      || (x >= 'A' && x <= 'F')
      || (x >= 'a' && x <= 'f')
}

function isOctDigit(x) {
  return x >= '0' && x <= '7'
}

function isDecDigit(x) {
  return x >= '0' && x <= '9'
}

var unescapeMap = {
  '\'': '\'',
  '"' : '"',
  '\\': '\\',
  'b' : '\b',
  'f' : '\f',
  'n' : '\n',
  'r' : '\r',
  't' : '\t',
  'v' : '\v',
  '/' : '/',
}

function formatError(input, msg, position, lineno, column, json5) {
  var result = msg + ' at ' + (lineno + 1) + ':' + (column + 1)
    , tmppos = position - column - 1
    , srcline = ''
    , underline = ''

  var isLineTerminator = json5 ? Uni.isLineTerminator : Uni.isLineTerminatorJSON

  // output no more than 70 characters before the wrong ones
  if (tmppos < position - 70) {
    tmppos = position - 70
  }

  while (1) {
    var chr = input[++tmppos]

    if (isLineTerminator(chr) || tmppos === input.length) {
      if (position >= tmppos) {
        // ending line error, so show it after the last char
        underline += '^'
      }
      break
    }
    srcline += chr

    if (position === tmppos) {
      underline += '^'
    } else if (position > tmppos) {
      underline += input[tmppos] === '\t' ? '\t' : ' '
    }

    // output no more than 78 characters on the string
    if (srcline.length > 78) break
  }

  return result + '\n' + srcline + '\n' + underline
}

function parse(input, options) {
  // parse as a standard JSON mode
  var json5 = !(options.mode === 'json' || options.legacy)
  var isLineTerminator = json5 ? Uni.isLineTerminator : Uni.isLineTerminatorJSON
  var isWhiteSpace = json5 ? Uni.isWhiteSpace : Uni.isWhiteSpaceJSON

  var length = input.length
    , lineno = 0
    , linestart = 0
    , position = 0
    , stack = []

  var tokenStart = function() {}
  var tokenEnd = function(v) {return v}

  /* tokenize({
       raw: '...',
       type: 'whitespace'|'comment'|'key'|'literal'|'separator'|'newline',
       value: 'number'|'string'|'whatever',
       path: [...],
     })
  */
  if (options._tokenize) {
    ;(function() {
      var start = null
      tokenStart = function() {
        if (start !== null) throw Error('internal error, token overlap')
        start = position
      }

      tokenEnd = function(v, type) {
        if (start != position) {
          var hash = {
            raw: input.substr(start, position-start),
            type: type,
            stack: stack.slice(0),
          }
          if (v !== undefined) hash.value = v
          options._tokenize.call(null, hash)
        }
        start = null
        return v
      }
    })()
  }

  function fail(msg) {
    var column = position - linestart

    if (!msg) {
      if (position < length) {
        var token = '\'' +
          JSON
            .stringify(input[position])
            .replace(/^"|"$/g, '')
            .replace(/'/g, "\\'")
            .replace(/\\"/g, '"')
          + '\''

        if (!msg) msg = 'Unexpected token ' + token
      } else {
        if (!msg) msg = 'Unexpected end of input'
      }
    }

    var error = SyntaxError(formatError(input, msg, position, lineno, column, json5))
    error.row = lineno + 1
    error.column = column + 1
    throw error
  }

  function newline(chr) {
    // account for <cr><lf>
    if (chr === '\r' && input[position] === '\n') position++
    linestart = position
    lineno++
  }

  function parseGeneric() {
    var result

    while (position < length) {
      tokenStart()
      var chr = input[position++]

      if (chr === '"' || (chr === '\'' && json5)) {
        return tokenEnd(parseString(chr), 'literal')

      } else if (chr === '{') {
        tokenEnd(undefined, 'separator')
        return parseObject()

      } else if (chr === '[') {
        tokenEnd(undefined, 'separator')
        return parseArray()

      } else if (chr === '-'
             ||  chr === '.'
             ||  isDecDigit(chr)
                 //           + number       Infinity          NaN
             ||  (json5 && (chr === '+' || chr === 'I' || chr === 'N'))
      ) {
        return tokenEnd(parseNumber(), 'literal')

      } else if (chr === 'n') {
        parseKeyword('null')
        return tokenEnd(null, 'literal')

      } else if (chr === 't') {
        parseKeyword('true')
        return tokenEnd(true, 'literal')

      } else if (chr === 'f') {
        parseKeyword('false')
        return tokenEnd(false, 'literal')

      } else {
        position--
        return tokenEnd(undefined)
      }
    }
  }

  function parseKey() {
    var result

    while (position < length) {
      tokenStart()
      var chr = input[position++]

      if (chr === '"' || (chr === '\'' && json5)) {
        return tokenEnd(parseString(chr), 'key')

      } else if (chr === '{') {
        tokenEnd(undefined, 'separator')
        return parseObject()

      } else if (chr === '[') {
        tokenEnd(undefined, 'separator')
        return parseArray()

      } else if (chr === '.'
             ||  isDecDigit(chr)
      ) {
        return tokenEnd(parseNumber(true), 'key')

      } else if (json5
             &&  Uni.isIdentifierStart(chr) || (chr === '\\' && input[position] === 'u')) {
        // unicode char or a unicode sequence
        var rollback = position - 1
        var result = parseIdentifier()

        if (result === undefined) {
          position = rollback
          return tokenEnd(undefined)
        } else {
          return tokenEnd(result, 'key')
        }

      } else {
        position--
        return tokenEnd(undefined)
      }
    }
  }

  function skipWhiteSpace() {
    tokenStart()
    while (position < length) {
      var chr = input[position++]

      if (isLineTerminator(chr)) {
        position--
        tokenEnd(undefined, 'whitespace')
        tokenStart()
        position++
        newline(chr)
        tokenEnd(undefined, 'newline')
        tokenStart()

      } else if (isWhiteSpace(chr)) {
        // nothing

      } else if (chr === '/'
             && json5
             && (input[position] === '/' || input[position] === '*')
      ) {
        position--
        tokenEnd(undefined, 'whitespace')
        tokenStart()
        position++
        skipComment(input[position++] === '*')
        tokenEnd(undefined, 'comment')
        tokenStart()

      } else {
        position--
        break
      }
    }
    return tokenEnd(undefined, 'whitespace')
  }

  function skipComment(multi) {
    while (position < length) {
      var chr = input[position++]

      if (isLineTerminator(chr)) {
        // LineTerminator is an end of singleline comment
        if (!multi) {
          // let parent function deal with newline
          position--
          return
        }

        newline(chr)

      } else if (chr === '*' && multi) {
        // end of multiline comment
        if (input[position] === '/') {
          position++
          return
        }

      } else {
        // nothing
      }
    }

    if (multi) {
      fail('Unclosed multiline comment')
    }
  }

  function parseKeyword(keyword) {
    // keyword[0] is not checked because it should've checked earlier
    var _pos = position
    var len = keyword.length
    for (var i=1; i<len; i++) {
      if (position >= length || keyword[i] != input[position]) {
        position = _pos-1
        fail()
      }
      position++
    }
  }

  function parseObject() {
    var result = options.null_prototype ? Object.create(null) : {}
      , empty_object = {}
      , is_non_empty = false

    while (position < length) {
      skipWhiteSpace()
      var item1 = parseKey()
      skipWhiteSpace()
      tokenStart()
      var chr = input[position++]
      tokenEnd(undefined, 'separator')

      if (chr === '}' && item1 === undefined) {
        if (!json5 && is_non_empty) {
          position--
          fail('Trailing comma in object')
        }
        return result

      } else if (chr === ':' && item1 !== undefined) {
        skipWhiteSpace()
        stack.push(item1)
        var item2 = parseGeneric()
        stack.pop()

        if (item2 === undefined) fail('No value found for key ' + item1)
        if (typeof(item1) !== 'string') {
          if (!json5 || typeof(item1) !== 'number') {
            fail('Wrong key type: ' + item1)
          }
        }

        if ((item1 in empty_object || empty_object[item1] != null) && options.reserved_keys !== 'replace') {
          if (options.reserved_keys === 'throw') {
            fail('Reserved key: ' + item1)
          } else {
            // silently ignore it
          }
        } else {
          if (typeof(options.reviver) === 'function') {
            item2 = options.reviver.call(null, item1, item2)
          }

          if (item2 !== undefined) {
            is_non_empty = true
            Object.defineProperty(result, item1, {
              value: item2,
              enumerable: true,
              configurable: true,
              writable: true,
            })
          }
        }

        skipWhiteSpace()

        tokenStart()
        var chr = input[position++]
        tokenEnd(undefined, 'separator')

        if (chr === ',') {
          continue

        } else if (chr === '}') {
          return result

        } else {
          fail()
        }

      } else {
        position--
        fail()
      }
    }

    fail()
  }

  function parseArray() {
    var result = []

    while (position < length) {
      skipWhiteSpace()
      stack.push(result.length)
      var item = parseGeneric()
      stack.pop()
      skipWhiteSpace()
      tokenStart()
      var chr = input[position++]
      tokenEnd(undefined, 'separator')

      if (item !== undefined) {
        if (typeof(options.reviver) === 'function') {
          item = options.reviver.call(null, String(result.length), item)
        }
        if (item === undefined) {
          result.length++
          item = true // hack for check below, not included into result
        } else {
          result.push(item)
        }
      }

      if (chr === ',') {
        if (item === undefined) {
          fail('Elisions are not supported')
        }

      } else if (chr === ']') {
        if (!json5 && item === undefined && result.length) {
          position--
          fail('Trailing comma in array')
        }
        return result

      } else {
        position--
        fail()
      }
    }
  }

  function parseNumber() {
    // rewind because we don't know first char
    position--

    var start = position
      , chr = input[position++]
      , t

    var to_num = function(is_octal) {
      var str = input.substr(start, position - start)

      if (is_octal) {
        var result = parseInt(str.replace(/^0o?/, ''), 8)
      } else {
        var result = Number(str)
      }

      if (Number.isNaN(result)) {
        position--
        fail('Bad numeric literal - "' + input.substr(start, position - start + 1) + '"')
      } else if (!json5 && !str.match(/^-?(0|[1-9][0-9]*)(\.[0-9]+)?(e[+-]?[0-9]+)?$/i)) {
        // additional restrictions imposed by json
        position--
        fail('Non-json numeric literal - "' + input.substr(start, position - start + 1) + '"')
      } else {
        return result
      }
    }

    // ex: -5982475.249875e+29384
    //     ^ skipping this
    if (chr === '-' || (chr === '+' && json5)) chr = input[position++]

    if (chr === 'N' && json5) {
      parseKeyword('NaN')
      return NaN
    }

    if (chr === 'I' && json5) {
      parseKeyword('Infinity')

      // returning +inf or -inf
      return to_num()
    }

    if (chr >= '1' && chr <= '9') {
      // ex: -5982475.249875e+29384
      //        ^^^ skipping these
      while (position < length && isDecDigit(input[position])) position++
      chr = input[position++]
    }

    // special case for leading zero: 0.123456
    if (chr === '0') {
      chr = input[position++]

      //             new syntax, "0o777"           old syntax, "0777"
      var is_octal = chr === 'o' || chr === 'O' || isOctDigit(chr)
      var is_hex = chr === 'x' || chr === 'X'

      if (json5 && (is_octal || is_hex)) {
        while (position < length
           &&  (is_hex ? isHexDigit : isOctDigit)( input[position] )
        ) position++

        var sign = 1
        if (input[start] === '-') {
          sign = -1
          start++
        } else if (input[start] === '+') {
          start++
        }

        return sign * to_num(is_octal)
      }
    }

    if (chr === '.') {
      // ex: -5982475.249875e+29384
      //                ^^^ skipping these
      while (position < length && isDecDigit(input[position])) position++
      chr = input[position++]
    }

    if (chr === 'e' || chr === 'E') {
      chr = input[position++]
      if (chr === '-' || chr === '+') position++
      // ex: -5982475.249875e+29384
      //                       ^^^ skipping these
      while (position < length && isDecDigit(input[position])) position++
      chr = input[position++]
    }

    // we have char in the buffer, so count for it
    position--
    return to_num()
  }

  function parseIdentifier() {
    // rewind because we don't know first char
    position--

    var result = ''

    while (position < length) {
      var chr = input[position++]

      if (chr === '\\'
      &&  input[position] === 'u'
      &&  isHexDigit(input[position+1])
      &&  isHexDigit(input[position+2])
      &&  isHexDigit(input[position+3])
      &&  isHexDigit(input[position+4])
      ) {
        // UnicodeEscapeSequence
        chr = String.fromCharCode(parseInt(input.substr(position+1, 4), 16))
        position += 5
      }

      if (result.length) {
        // identifier started
        if (Uni.isIdentifierPart(chr)) {
          result += chr
        } else {
          position--
          return result
        }

      } else {
        if (Uni.isIdentifierStart(chr)) {
          result += chr
        } else {
          return undefined
        }
      }
    }

    fail()
  }

  function parseString(endChar) {
    // 7.8.4 of ES262 spec
    var result = ''

    while (position < length) {
      var chr = input[position++]

      if (chr === endChar) {
        return result

      } else if (chr === '\\') {
        if (position >= length) fail()
        chr = input[position++]

        if (unescapeMap[chr] && (json5 || (chr != 'v' && chr != "'"))) {
          result += unescapeMap[chr]

        } else if (json5 && isLineTerminator(chr)) {
          // line continuation
          newline(chr)

        } else if (chr === 'u' || (chr === 'x' && json5)) {
          // unicode/character escape sequence
          var off = chr === 'u' ? 4 : 2

          // validation for \uXXXX
          for (var i=0; i<off; i++) {
            if (position >= length) fail()
            if (!isHexDigit(input[position])) fail('Bad escape sequence')
            position++
          }

          result += String.fromCharCode(parseInt(input.substr(position-off, off), 16))
        } else if (json5 && isOctDigit(chr)) {
          if (chr < '4' && isOctDigit(input[position]) && isOctDigit(input[position+1])) {
            // three-digit octal
            var digits = 3
          } else if (isOctDigit(input[position])) {
            // two-digit octal
            var digits = 2
          } else {
            var digits = 1
          }
          position += digits - 1
          result += String.fromCharCode(parseInt(input.substr(position-digits, digits), 8))
          /*if (!isOctDigit(input[position])) {
            // \0 is allowed still
            result += '\0'
          } else {
            fail('Octal literals are not supported')
          }*/

        } else if (json5) {
          // \X -> x
          result += chr

        } else {
          position--
          fail()
        }

      } else if (isLineTerminator(chr)) {
        fail()

      } else {
        if (!json5 && chr.charCodeAt(0) < 32) {
          position--
          fail('Unexpected control character')
        }

        // SourceCharacter but not one of " or \ or LineTerminator
        result += chr
      }
    }

    fail()
  }

  skipWhiteSpace()
  var return_value = parseGeneric()
  if (return_value !== undefined || position < length) {
    skipWhiteSpace()

    if (position >= length) {
      if (typeof(options.reviver) === 'function') {
        return_value = options.reviver.call(null, '', return_value)
      }
      return return_value
    } else {
      fail()
    }

  } else {
    if (position) {
      fail('No data, only a whitespace')
    } else {
      fail('No data, empty input')
    }
  }
}

/*
 * parse(text, options)
 * or
 * parse(text, reviver)
 *
 * where:
 * text - string
 * options - object
 * reviver - function
 */
module.exports.parse = function parseJSON(input, options) {
  // support legacy functions
  if (typeof(options) === 'function') {
    options = {
      reviver: options
    }
  }

  if (input === undefined) {
    // parse(stringify(x)) should be equal x
    // with JSON functions it is not 'cause of undefined
    // so we're fixing it
    return undefined
  }

  // JSON.parse compat
  if (typeof(input) !== 'string') input = String(input)
  if (options == null) options = {}
  if (options.reserved_keys == null) options.reserved_keys = 'ignore'

  if (options.reserved_keys === 'throw' || options.reserved_keys === 'ignore') {
    if (options.null_prototype == null) {
      options.null_prototype = true
    }
  }

  try {
    return parse(input, options)
  } catch(err) {
    // jju is a recursive parser, so JSON.parse("{{{{{{{") could blow up the stack
    //
    // this catch is used to skip all those internal calls
    if (err instanceof SyntaxError && err.row != null && err.column != null) {
      var old_err = err
      err = SyntaxError(old_err.message)
      err.column = old_err.column
      err.row = old_err.row
    }
    throw err
  }
}

module.exports.tokenize = function tokenizeJSON(input, options) {
  if (options == null) options = {}

  options._tokenize = function(smth) {
    if (options._addstack) smth.stack.unshift.apply(smth.stack, options._addstack)
    tokens.push(smth)
  }

  var tokens = []
  tokens.data = module.exports.parse(input, options)
  return tokens
}


// This is autogenerated with esprima tools, see:
// https://github.com/ariya/esprima/blob/master/esprima.js
//
// PS: oh God, I hate Unicode

// ECMAScript 5.1/Unicode v6.3.0 NonAsciiIdentifierStart:

var Uni = module.exports

module.exports.isWhiteSpace = function isWhiteSpace(x) {
  // section 7.2, table 2
  return x === '\u0020'
      || x === '\u00A0'
      || x === '\uFEFF' // <-- this is not a Unicode WS, only a JS one
      || (x >= '\u0009' && x <= '\u000D') // 9 A B C D

      // + whitespace characters from unicode, category Zs
      || x === '\u1680'
      || x === '\u180E'
      || (x >= '\u2000' && x <= '\u200A') // 0 1 2 3 4 5 6 7 8 9 A
      || x === '\u2028'
      || x === '\u2029'
      || x === '\u202F'
      || x === '\u205F'
      || x === '\u3000'
}

module.exports.isWhiteSpaceJSON = function isWhiteSpaceJSON(x) {
  return x === '\u0020'
      || x === '\u0009'
      || x === '\u000A'
      || x === '\u000D'
}

module.exports.isLineTerminator = function isLineTerminator(x) {
  // ok, here is the part when JSON is wrong
  // section 7.3, table 3
  return x === '\u000A'
      || x === '\u000D'
      || x === '\u2028'
      || x === '\u2029'
}

module.exports.isLineTerminatorJSON = function isLineTerminatorJSON(x) {
  return x === '\u000A'
      || x === '\u000D'
}

module.exports.isIdentifierStart = function isIdentifierStart(x) {
  return x === '$'
      || x === '_'
      || (x >= 'A' && x <= 'Z')
      || (x >= 'a' && x <= 'z')
      || (x >= '\u0080' && Uni.NonAsciiIdentifierStart.test(x))
}

module.exports.isIdentifierPart = function isIdentifierPart(x) {
  return x === '$'
      || x === '_'
      || (x >= 'A' && x <= 'Z')
      || (x >= 'a' && x <= 'z')
      || (x >= '0' && x <= '9') // <-- addition to Start
      || (x >= '\u0080' && Uni.NonAsciiIdentifierPart.test(x))
}

module.exports.NonAsciiIdentifierStart = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/

// ECMAScript 5.1/Unicode v6.3.0 NonAsciiIdentifierPart:

module.exports.NonAsciiIdentifierPart = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0\u08A2-\u08AC\u08E4-\u08FE\u0900-\u0963\u0966-\u096F\u0971-\u0977\u0979-\u097F\u0981-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C82\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D02\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191C\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1D00-\u1DE6\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA697\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7B\uAA80-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE26\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/
'use strict';
const fs = require('fs');

module.exports = fp => new Promise(resolve => {
	fs.access(fp, err => {
		resolve(!err);
	});
});

module.exports.sync = fp => {
	try {
		fs.accessSync(fp);
		return true;
	} catch (err) {
		return false;
	}
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if a path exists",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/path-exists#readme",
  "license": "MIT",
  "name": "path-exists",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/path-exists.git"
  },
  "version": "3.0.0"
}'use strict';

function posix(path) {
	return path.charAt(0) === '/';
}

function win32(path) {
	// https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56
	var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;
	var result = splitDeviceRe.exec(path);
	var device = result[1] || '';
	var isUnc = Boolean(device && device.charAt(1) !== ':');

	// UNC paths are always absolute
	return Boolean(result[2] || isUnc);
}

module.exports = process.platform === 'win32' ? win32 : posix;
module.exports.posix = posix;
module.exports.win32 = win32;
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Node.js 0.12 path.isAbsolute() ponyfill",
  "devDependencies": {
    "xo": "^0.16.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/path-is-absolute#readme",
  "license": "MIT",
  "name": "path-is-absolute",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/path-is-absolute.git"
  },
  "version": "1.0.1"
}Dual licensed under WTFPL and MIT:

---

Copyright Â© 2013â€“2016 Domenic Denicola <d@domenic.me>

This work is free. You can redistribute it and/or modify it under the
terms of the Do What The Fuck You Want To Public License, Version 2,
as published by Sam Hocevar. See below for more details.

        DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
                    Version 2, December 2004

 Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>

 Everyone is permitted to copy and distribute verbatim or modified
 copies of this license document, and changing it is allowed as long
 as the name is changed.

            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. You just DO WHAT THE FUCK YOU WANT TO.

---

The MIT License (MIT)

Copyright Â© 2013â€“2016 Domenic Denicola <d@domenic.me>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "author": {
    "name": "Domenic Denicola",
    "email": "d@domenic.me",
    "url": "https://domenic.me"
  },
  "deprecated": false,
  "description": "Tests whether one path is inside another path",
  "devDependencies": {
    "jshint": "~2.3.0",
    "mocha": "~1.15.1"
  },
  "files": [
    "lib"
  ],
  "homepage": "https://github.com/domenic/path-is-inside#readme",
  "license": "(WTFPL OR MIT)",
  "main": "lib/path-is-inside.js",
  "name": "path-is-inside",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/domenic/path-is-inside.git"
  },
  "version": "1.0.2"
}"use strict";

var path = require("path");

module.exports = function (thePath, potentialParent) {
    // For inside-directory checking, we want to allow trailing slashes, so normalize.
    thePath = stripTrailingSep(thePath);
    potentialParent = stripTrailingSep(potentialParent);

    // Node treats only Windows as case-insensitive in its path module; we follow those conventions.
    if (process.platform === "win32") {
        thePath = thePath.toLowerCase();
        potentialParent = potentialParent.toLowerCase();
    }

    return thePath.lastIndexOf(potentialParent, 0) === 0 &&
		(
			thePath[potentialParent.length] === path.sep ||
			thePath[potentialParent.length] === undefined
		);
};

function stripTrailingSep(thePath) {
    if (thePath[thePath.length - 1] === path.sep) {
        return thePath.slice(0, -1);
    }
    return thePath;
}
'use strict';
module.exports = opts => {
	opts = opts || {};

	const env = opts.env || process.env;
	const platform = opts.platform || process.platform;

	if (platform !== 'win32') {
		return 'PATH';
	}

	return Object.keys(env).find(x => x.toUpperCase() === 'PATH') || 'Path';
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Get the PATH environment variable key cross-platform",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/path-key#readme",
  "license": "MIT",
  "name": "path-key",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/path-key.git"
  },
  "version": "2.0.1"
}The MIT License (MIT)

Copyright (c) 2015 Javier Blanco

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';

var isWindows = process.platform === 'win32';

// Regex to split a windows path into three parts: [*, device, slash,
// tail] windows-only
var splitDeviceRe =
    /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;

// Regex to split the tail part of the above into [*, dir, basename, ext]
var splitTailRe =
    /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/;

var win32 = {};

// Function to split a filename into [root, dir, basename, ext]
function win32SplitPath(filename) {
  // Separate device+slash from tail
  var result = splitDeviceRe.exec(filename),
      device = (result[1] || '') + (result[2] || ''),
      tail = result[3] || '';
  // Split the tail into dir, basename and extension
  var result2 = splitTailRe.exec(tail),
      dir = result2[1],
      basename = result2[2],
      ext = result2[3];
  return [device, dir, basename, ext];
}

win32.parse = function(pathString) {
  if (typeof pathString !== 'string') {
    throw new TypeError(
        "Parameter 'pathString' must be a string, not " + typeof pathString
    );
  }
  var allParts = win32SplitPath(pathString);
  if (!allParts || allParts.length !== 4) {
    throw new TypeError("Invalid path '" + pathString + "'");
  }
  return {
    root: allParts[0],
    dir: allParts[0] + allParts[1].slice(0, -1),
    base: allParts[2],
    ext: allParts[3],
    name: allParts[2].slice(0, allParts[2].length - allParts[3].length)
  };
};



// Split a filename into [root, dir, basename, ext], unix version
// 'root' is just a slash, or nothing.
var splitPathRe =
    /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
var posix = {};


function posixSplitPath(filename) {
  return splitPathRe.exec(filename).slice(1);
}


posix.parse = function(pathString) {
  if (typeof pathString !== 'string') {
    throw new TypeError(
        "Parameter 'pathString' must be a string, not " + typeof pathString
    );
  }
  var allParts = posixSplitPath(pathString);
  if (!allParts || allParts.length !== 4) {
    throw new TypeError("Invalid path '" + pathString + "'");
  }
  allParts[1] = allParts[1] || '';
  allParts[2] = allParts[2] || '';
  allParts[3] = allParts[3] || '';

  return {
    root: allParts[0],
    dir: allParts[0] + allParts[1].slice(0, -1),
    base: allParts[2],
    ext: allParts[3],
    name: allParts[2].slice(0, allParts[2].length - allParts[3].length)
  };
};


if (isWindows)
  module.exports = win32.parse;
else /* posix */
  module.exports = posix.parse;

module.exports.posix = posix.parse;
module.exports.win32 = win32.parse;
{
  "author": {
    "name": "Javier Blanco",
    "email": "http://jbgutierrez.info"
  },
  "deprecated": false,
  "description": "Node.js path.parse() ponyfill",
  "homepage": "https://github.com/jbgutierrez/path-parse#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "path-parse",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jbgutierrez/path-parse.git"
  },
  "version": "1.0.6"
}'use strict';
var fs = require('graceful-fs');
var Promise = require('pinkie-promise');
var pify = require('pify');

function type(fn, fn2, fp) {
	if (typeof fp !== 'string') {
		return Promise.reject(new TypeError('Expected a string'));
	}

	return pify(fs[fn], Promise)(fp).then(function (stats) {
		return stats[fn2]();
	});
}

function typeSync(fn, fn2, fp) {
	if (typeof fp !== 'string') {
		throw new TypeError('Expected a string');
	}

	return fs[fn](fp)[fn2]();
}

exports.file = type.bind(null, 'stat', 'isFile');
exports.dir = type.bind(null, 'stat', 'isDirectory');
exports.symlink = type.bind(null, 'lstat', 'isSymbolicLink');
exports.fileSync = typeSync.bind(null, 'statSync', 'isFile');
exports.dirSync = typeSync.bind(null, 'statSync', 'isDirectory');
exports.symlinkSync = typeSync.bind(null, 'lstatSync', 'isSymbolicLink');
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "graceful-fs": "^4.1.2",
    "pify": "^2.0.0",
    "pinkie-promise": "^2.0.0"
  },
  "deprecated": false,
  "description": "Check if a path is a file, directory, or symlink",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/path-type#readme",
  "license": "MIT",
  "name": "path-type",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/path-type.git"
  },
  "version": "1.1.0"
}The MIT License (Expat)

Copyright (c) 2014 Andrew Kelley

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
module.exports = Pend;

function Pend() {
  this.pending = 0;
  this.max = Infinity;
  this.listeners = [];
  this.waiting = [];
  this.error = null;
}

Pend.prototype.go = function(fn) {
  if (this.pending < this.max) {
    pendGo(this, fn);
  } else {
    this.waiting.push(fn);
  }
};

Pend.prototype.wait = function(cb) {
  if (this.pending === 0) {
    cb(this.error);
  } else {
    this.listeners.push(cb);
  }
};

Pend.prototype.hold = function() {
  return pendHold(this);
};

function pendHold(self) {
  self.pending += 1;
  var called = false;
  return onCb;
  function onCb(err) {
    if (called) throw new Error("callback called twice");
    called = true;
    self.error = self.error || err;
    self.pending -= 1;
    if (self.waiting.length > 0 && self.pending < self.max) {
      pendGo(self, self.waiting.shift());
    } else if (self.pending === 0) {
      var listeners = self.listeners;
      self.listeners = [];
      listeners.forEach(cbListener);
    }
  }
  function cbListener(listener) {
    listener(self.error);
  }
}

function pendGo(self, fn) {
  fn(pendHold(self));
}
{
  "author": {
    "name": "Andrew Kelley",
    "email": "superjoe30@gmail.com"
  },
  "deprecated": false,
  "description": "dead-simple optimistic async helper",
  "homepage": "https://github.com/andrewrk/node-pend#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "pend",
  "repository": {
    "type": "git",
    "url": "git://github.com/andrewrk/node-pend.git"
  },
  "version": "1.2.0"
}excludeDirectories = "{.git,node_modules}"
excludeInFolderSearch = "{excludeDirectories,lib}"

includeFiles = "{.gitignore,.npmignore,.travis.yml}"

[ attr.untitled ]
fileType = 'source.coffee'Copyright (c) 2013 Braveg1rl

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.{
  "author": {
    "name": "Braveg1rl",
    "email": "braveg1rl@outlook.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Implements performance.now (based on process.hrtime).",
  "devDependencies": {
    "bluebird": "^3.4.7",
    "call-delayed": "^1.0.0",
    "chai": "^3.5.0",
    "chai-increasing": "^1.2.0",
    "coffee-script": "~1.12.2",
    "mocha": "~3.2.0",
    "pre-commit": "^1.2.2"
  },
  "homepage": "https://github.com/braveg1rl/performance-now",
  "license": "MIT",
  "main": "lib/performance-now.js",
  "name": "performance-now",
  "optionalDependencies": {},
  "private": false,
  "repository": {
    "type": "git",
    "url": "git://github.com/braveg1rl/performance-now.git"
  },
  "typings": "src/index.d.ts",
  "version": "2.1.0"
}if performance? and performance.now
  module.exports = -> performance.now()
else if process? and process.hrtime
  module.exports = -> (getNanoSeconds() - nodeLoadTime) / 1e6
  hrtime = process.hrtime
  getNanoSeconds = ->
    hr = hrtime()
    hr[0] * 1e9 + hr[1]
  moduleLoadTime = getNanoSeconds()
  upTime = process.uptime() * 1e9
  nodeLoadTime = moduleLoadTime - upTime
else if Date.now
  module.exports = -> Date.now() - loadTime
  loadTime = Date.now()
else
  module.exports = -> new Date().getTime() - loadTime
  loadTime = new Date().getTime()
// Generated by CoffeeScript 1.12.2
(function() {
  var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;

  if ((typeof performance !== "undefined" && performance !== null) && performance.now) {
    module.exports = function() {
      return performance.now();
    };
  } else if ((typeof process !== "undefined" && process !== null) && process.hrtime) {
    module.exports = function() {
      return (getNanoSeconds() - nodeLoadTime) / 1e6;
    };
    hrtime = process.hrtime;
    getNanoSeconds = function() {
      var hr;
      hr = hrtime();
      return hr[0] * 1e9 + hr[1];
    };
    moduleLoadTime = getNanoSeconds();
    upTime = process.uptime() * 1e9;
    nodeLoadTime = moduleLoadTime - upTime;
  } else if (Date.now) {
    module.exports = function() {
      return Date.now() - loadTime;
    };
    loadTime = Date.now();
  } else {
    module.exports = function() {
      return new Date().getTime() - loadTime;
    };
    loadTime = new Date().getTime();
  }

}).call(this);

//# sourceMappingURL=performance-now.js.map
{
  "version": 3,
  "file": "performance-now.js",
  "sourceRoot": "..",
  "sources": [
    "src/performance-now.coffee"
  ],
  "names": [],
  "mappings": ";AAAA;AAAA,MAAA;;EAAA,IAAG,4DAAA,IAAiB,WAAW,CAAC,GAAhC;IACE,MAAM,CAAC,OAAP,GAAiB,SAAA;aAAG,WAAW,CAAC,GAAZ,CAAA;IAAH,EADnB;GAAA,MAEK,IAAG,oDAAA,IAAa,OAAO,CAAC,MAAxB;IACH,MAAM,CAAC,OAAP,GAAiB,SAAA;aAAG,CAAC,cAAA,CAAA,CAAA,GAAmB,YAApB,CAAA,GAAoC;IAAvC;IACjB,MAAA,GAAS,OAAO,CAAC;IACjB,cAAA,GAAiB,SAAA;AACf,UAAA;MAAA,EAAA,GAAK,MAAA,CAAA;aACL,EAAG,CAAA,CAAA,CAAH,GAAQ,GAAR,GAAc,EAAG,CAAA,CAAA;IAFF;IAGjB,cAAA,GAAiB,cAAA,CAAA;IACjB,MAAA,GAAS,OAAO,CAAC,MAAR,CAAA,CAAA,GAAmB;IAC5B,YAAA,GAAe,cAAA,GAAiB,OAR7B;GAAA,MASA,IAAG,IAAI,CAAC,GAAR;IACH,MAAM,CAAC,OAAP,GAAiB,SAAA;aAAG,IAAI,CAAC,GAAL,CAAA,CAAA,GAAa;IAAhB;IACjB,QAAA,GAAW,IAAI,CAAC,GAAL,CAAA,EAFR;GAAA,MAAA;IAIH,MAAM,CAAC,OAAP,GAAiB,SAAA;aAAO,IAAA,IAAA,CAAA,CAAM,CAAC,OAAP,CAAA,CAAJ,GAAuB;IAA1B;IACjB,QAAA,GAAe,IAAA,IAAA,CAAA,CAAM,CAAC,OAAP,CAAA,EALZ;;AAXL"
}'use strict';

var processFn = function (fn, P, opts) {
	return function () {
		var that = this;
		var args = new Array(arguments.length);

		for (var i = 0; i < arguments.length; i++) {
			args[i] = arguments[i];
		}

		return new P(function (resolve, reject) {
			args.push(function (err, result) {
				if (err) {
					reject(err);
				} else if (opts.multiArgs) {
					var results = new Array(arguments.length - 1);

					for (var i = 1; i < arguments.length; i++) {
						results[i - 1] = arguments[i];
					}

					resolve(results);
				} else {
					resolve(result);
				}
			});

			fn.apply(that, args);
		});
	};
};

var pify = module.exports = function (obj, P, opts) {
	if (typeof P !== 'function') {
		opts = P;
		P = Promise;
	}

	opts = opts || {};
	opts.exclude = opts.exclude || [/.+Sync$/];

	var filter = function (key) {
		var match = function (pattern) {
			return typeof pattern === 'string' ? key === pattern : pattern.test(key);
		};

		return opts.include ? opts.include.some(match) : !opts.exclude.some(match);
	};

	var ret = typeof obj === 'function' ? function () {
		if (opts.excludeMain) {
			return obj.apply(this, arguments);
		}

		return processFn(obj, P, opts).apply(this, arguments);
	} : {};

	return Object.keys(obj).reduce(function (ret, key) {
		var x = obj[key];

		ret[key] = typeof x === 'function' && filter(key) ? processFn(x, P, opts) : x;

		return ret;
	}, ret);
};

pify.all = pify;
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Promisify a callback-style function",
  "devDependencies": {
    "ava": "*",
    "pinkie-promise": "^1.0.0",
    "v8-natives": "0.0.2",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/pify#readme",
  "license": "MIT",
  "name": "pify",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/pify.git"
  },
  "version": "2.3.0"
}'use strict';

var PENDING = 'pending';
var SETTLED = 'settled';
var FULFILLED = 'fulfilled';
var REJECTED = 'rejected';
var NOOP = function () {};
var isNode = typeof global !== 'undefined' && typeof global.process !== 'undefined' && typeof global.process.emit === 'function';

var asyncSetTimer = typeof setImmediate === 'undefined' ? setTimeout : setImmediate;
var asyncQueue = [];
var asyncTimer;

function asyncFlush() {
	// run promise callbacks
	for (var i = 0; i < asyncQueue.length; i++) {
		asyncQueue[i][0](asyncQueue[i][1]);
	}

	// reset async asyncQueue
	asyncQueue = [];
	asyncTimer = false;
}

function asyncCall(callback, arg) {
	asyncQueue.push([callback, arg]);

	if (!asyncTimer) {
		asyncTimer = true;
		asyncSetTimer(asyncFlush, 0);
	}
}

function invokeResolver(resolver, promise) {
	function resolvePromise(value) {
		resolve(promise, value);
	}

	function rejectPromise(reason) {
		reject(promise, reason);
	}

	try {
		resolver(resolvePromise, rejectPromise);
	} catch (e) {
		rejectPromise(e);
	}
}

function invokeCallback(subscriber) {
	var owner = subscriber.owner;
	var settled = owner._state;
	var value = owner._data;
	var callback = subscriber[settled];
	var promise = subscriber.then;

	if (typeof callback === 'function') {
		settled = FULFILLED;
		try {
			value = callback(value);
		} catch (e) {
			reject(promise, e);
		}
	}

	if (!handleThenable(promise, value)) {
		if (settled === FULFILLED) {
			resolve(promise, value);
		}

		if (settled === REJECTED) {
			reject(promise, value);
		}
	}
}

function handleThenable(promise, value) {
	var resolved;

	try {
		if (promise === value) {
			throw new TypeError('A promises callback cannot return that same promise.');
		}

		if (value && (typeof value === 'function' || typeof value === 'object')) {
			// then should be retrieved only once
			var then = value.then;

			if (typeof then === 'function') {
				then.call(value, function (val) {
					if (!resolved) {
						resolved = true;

						if (value === val) {
							fulfill(promise, val);
						} else {
							resolve(promise, val);
						}
					}
				}, function (reason) {
					if (!resolved) {
						resolved = true;

						reject(promise, reason);
					}
				});

				return true;
			}
		}
	} catch (e) {
		if (!resolved) {
			reject(promise, e);
		}

		return true;
	}

	return false;
}

function resolve(promise, value) {
	if (promise === value || !handleThenable(promise, value)) {
		fulfill(promise, value);
	}
}

function fulfill(promise, value) {
	if (promise._state === PENDING) {
		promise._state = SETTLED;
		promise._data = value;

		asyncCall(publishFulfillment, promise);
	}
}

function reject(promise, reason) {
	if (promise._state === PENDING) {
		promise._state = SETTLED;
		promise._data = reason;

		asyncCall(publishRejection, promise);
	}
}

function publish(promise) {
	promise._then = promise._then.forEach(invokeCallback);
}

function publishFulfillment(promise) {
	promise._state = FULFILLED;
	publish(promise);
}

function publishRejection(promise) {
	promise._state = REJECTED;
	publish(promise);
	if (!promise._handled && isNode) {
		global.process.emit('unhandledRejection', promise._data, promise);
	}
}

function notifyRejectionHandled(promise) {
	global.process.emit('rejectionHandled', promise);
}

/**
 * @class
 */
function Promise(resolver) {
	if (typeof resolver !== 'function') {
		throw new TypeError('Promise resolver ' + resolver + ' is not a function');
	}

	if (this instanceof Promise === false) {
		throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.');
	}

	this._then = [];

	invokeResolver(resolver, this);
}

Promise.prototype = {
	constructor: Promise,

	_state: PENDING,
	_then: null,
	_data: undefined,
	_handled: false,

	then: function (onFulfillment, onRejection) {
		var subscriber = {
			owner: this,
			then: new this.constructor(NOOP),
			fulfilled: onFulfillment,
			rejected: onRejection
		};

		if ((onRejection || onFulfillment) && !this._handled) {
			this._handled = true;
			if (this._state === REJECTED && isNode) {
				asyncCall(notifyRejectionHandled, this);
			}
		}

		if (this._state === FULFILLED || this._state === REJECTED) {
			// already resolved, call callback async
			asyncCall(invokeCallback, subscriber);
		} else {
			// subscribe
			this._then.push(subscriber);
		}

		return subscriber.then;
	},

	catch: function (onRejection) {
		return this.then(null, onRejection);
	}
};

Promise.all = function (promises) {
	if (!Array.isArray(promises)) {
		throw new TypeError('You must pass an array to Promise.all().');
	}

	return new Promise(function (resolve, reject) {
		var results = [];
		var remaining = 0;

		function resolver(index) {
			remaining++;
			return function (value) {
				results[index] = value;
				if (!--remaining) {
					resolve(results);
				}
			};
		}

		for (var i = 0, promise; i < promises.length; i++) {
			promise = promises[i];

			if (promise && typeof promise.then === 'function') {
				promise.then(resolver(i), reject);
			} else {
				results[i] = promise;
			}
		}

		if (!remaining) {
			resolve(results);
		}
	});
};

Promise.race = function (promises) {
	if (!Array.isArray(promises)) {
		throw new TypeError('You must pass an array to Promise.race().');
	}

	return new Promise(function (resolve, reject) {
		for (var i = 0, promise; i < promises.length; i++) {
			promise = promises[i];

			if (promise && typeof promise.then === 'function') {
				promise.then(resolve, reject);
			} else {
				resolve(promise);
			}
		}
	});
};

Promise.resolve = function (value) {
	if (value && typeof value === 'object' && value.constructor === Promise) {
		return value;
	}

	return new Promise(function (resolve) {
		resolve(value);
	});
};

Promise.reject = function (reason) {
	return new Promise(function (resolve, reject) {
		reject(reason);
	});
};

module.exports = Promise;
The MIT License (MIT)

Copyright (c) Vsevolod Strukchinsky <floatdrop@gmail.com> (github.com/floatdrop)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Vsevolod Strukchinsky",
    "email": "floatdrop@gmail.com",
    "url": "github.com/floatdrop"
  },
  "deprecated": false,
  "description": "Itty bitty little widdle twinkie pinkie ES2015 Promise implementation",
  "devDependencies": {
    "core-assert": "^0.1.1",
    "coveralls": "^2.11.4",
    "mocha": "*",
    "nyc": "^3.2.2",
    "promises-aplus-tests": "*",
    "xo": "^0.10.1"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/floatdrop/pinkie#readme",
  "license": "MIT",
  "name": "pinkie",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/floatdrop/pinkie.git"
  },
  "version": "2.0.4"
}'use strict';

module.exports = typeof Promise === 'function' ? Promise : require('pinkie');
The MIT License (MIT)

Copyright (c) Vsevolod Strukchinsky <floatdrop@gmail.com> (github.com/floatdrop)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Vsevolod Strukchinsky",
    "email": "floatdrop@gmail.com",
    "url": "github.com/floatdrop"
  },
  "dependencies": {
    "pinkie": "^2.0.0"
  },
  "deprecated": false,
  "description": "ES2015 Promise ponyfill",
  "devDependencies": {
    "mocha": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/floatdrop/pinkie-promise#readme",
  "license": "MIT",
  "name": "pinkie-promise",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/floatdrop/pinkie-promise.git"
  },
  "version": "2.0.1"
}3.0.0 / 2018-03-18
==================
* [[`cb0d8f1bc6`]](https://github.com/TooTallNate/plist.js/commit/cb0d8f1bc60dee423f8fc2cfcac427452dfaddb0) update Makefile, rebuild dist/ (Mike Reinstein)
* [[`9dfeffe73f`]](https://github.com/TooTallNate/plist.js/commit/9dfeffe73fdb447ac5a87ee364a1472975f12adf) remove unsupported browser versions from travis (Mike Reinstein)
* [[`c962bfe1ea`]](https://github.com/TooTallNate/plist.js/commit/c962bfe1ea04dd87966250253d33738bceecab61) update module deps, remove support for node < 6 (Mike Reinstein)


2.1.0 / 2017-05-04
==================

* [[`e4f06669bb`]](https://github.com/TooTallNate/plist.js/commit/e4f06669bb51d2e65654df7c39aab52bc3bf4e8a) - update license (extend copyright term) (Mike Reinstein)
* [[`edc6e41035`]](https://github.com/TooTallNate/plist.js/commit/edc6e4103546b1d7518a577e7c202c305a8abec0) - update module deps (Mike Reinstein)
* [[`85d11c48ef`](https://github.com/TooTallNate/plist.js/commit/85d11c48eff02312cbdd67f46fd8e74b0d372ca1)] - Harden test-cases and implementation to align with other implementations (BjÃ¶rn Brauer)
* [[`7619537eaa`]](https://github.com/TooTallNate/plist.js/commit/7619537eaa9e3e5a80829e759c004d2e017a07d2) review feedback: early returns and constants for nodeTypes (BjÃ¶rn Brauer)


2.0.1 / 2016-08-16
==================

* [[`de136c8388`](https://github.com/TooTallNate/plist/commit/de136c8388)] - bad npm releaseâ€¦ (Nathan Rajlich)


2.0.0 / 2016-08-16
==================

* [[`90deef5d43`](https://github.com/TooTallNate/plist/commit/90deef5d43)] - remove deprecated functions (Nathan Rajlich)
* [[`d475cd8ce9`](https://github.com/TooTallNate/plist/commit/d475cd8ce9)] - Added travis ci support for node 6 (Amila Welihinda)
* [[`04c8ee7646`](https://github.com/TooTallNate/plist/commit/04c8ee7646)] - update dependencies (Mitchell Hentges)
* [[`97c02b3f05`](https://github.com/TooTallNate/plist/commit/97c02b3f05)] - **travis**: add `sudo: false` and test more node versions (Nathan Rajlich)
* [[`54c821ec29`](https://github.com/TooTallNate/plist/commit/54c821ec29)] - #71 - fixed and added test (Andrew Goldis)
* [[`4afb7c5079`](https://github.com/TooTallNate/plist/commit/4afb7c5079)] - fix `Cannot read property 'nodeValue' of undefined exception` that is thrown when a `<key></key>` construct appears in plist (Chris Kinsman)
* [[`f360d7d685`](https://github.com/TooTallNate/plist/commit/f360d7d685)] - #66 - fixed empty keys and added tests (Andrew Goldis)
* [[`421c7f26e9`](https://github.com/TooTallNate/plist/commit/421c7f26e9)] - #66 - fixed empty key (Andrew Goldis)
* [[`a88aa4dca7`](https://github.com/TooTallNate/plist/commit/a88aa4dca7)] - add verbose examples (mrzmyr)


1.2.0 / 2015-11-10
==================

  * package: update "browserify" to v12.0.1
  * package: update "zuul" to v3.7.2
  * package: update "xmlbuilder" to v4.0.0
  * package: update "util-deprecate" to v1.0.2
  * package: update "mocha" to v2.3.3
  * package: update "base64-js" to v0.0.8
  * build: omit undefined values
  * travis: add node 4.0 and 4.1 to test matrix


1.1.0 / 2014-08-27
==================

  * package: update "browserify" to v5.10.1
  * package: update "zuul" to v1.10.2
  * README: add "Sauce Test Status" build badge
  * travis: use new "plistjs" sauce credentials
  * travis: set up zuul saucelabs automated testing


1.0.1 / 2014-06-25
==================

  * add .zuul.yml file for browser testing
  * remove Testling stuff
  * build: fix global variable `val` leak
  * package: use --check-leaks when running mocha tests
  * README: update examples to use preferred API
  * package: add "browser" keyword


1.0.0 / 2014-05-20
==================

  * package: remove "android-browser"
  * test: add <dict> build() test
  * test: re-add the empty string build() test
  * test: remove "fixtures" and legacy "tests" dir
  * test: add some more build() tests
  * test: add a parse() CDATA test
  * test: starting on build() tests
  * test: more parse() tests
  * package: attempt to fix "android-browser" testling
  * parse: better <data> with newline handling
  * README: add Testling badge
  * test: add <data> node tests
  * test: add a <date> parse() test
  * travis: don't test node v0.6 or v0.8
  * test: some more parse() tests
  * test: add simple <string> parsing test
  * build: add support for an optional "opts" object
  * package: test mobile devices
  * test: use multiline to inline the XML
  * package: beautify
  * package: fix "mocha" harness
  * package: more testling browsers
  * build: add the "version=1.0" attribute
  * beginnings of "mocha" tests
  * build: more JSDocs
  * tests: add test that ensures that empty string conversion works
  * build: update "xmlbuilder" to v2.2.1
  * parse: ignore comment and cdata nodes
  * tests: make the "Newlines" test actually contain a newline
  * parse: lint
  * test travis
  * README: add Travis CI badge
  * add .travis.yml file
  * build: updated DTD to reflect name change
  * parse: return falsey values in an Array plist
  * build: fix encoding a typed array in the browser
  * build: add support for Typed Arrays and ArrayBuffers
  * build: more lint
  * build: slight cleanup and optimizations
  * build: use .txt() for the "date" value
  * parse: always return a Buffer for <data> nodes
  * build: don't interpret Strings as base64
  * dist: commit prebuilt plist*.js files
  * parse: fix typo in deprecate message
  * parse: fix parse() return value
  * parse: add jsdoc comments for the deprecated APIs
  * parse: add `parse()` function
  * node, parse: use `util-deprecate` module
  * re-implemented parseFile to be asynchronous
  * node: fix jsdoc comment
  * Makefile: fix "node" require stubbing
  * examples: add "browser" example
  * package: tweak "main"
  * package: remove "engines" field
  * Makefile: fix --exclude command for browserify
  * package: update "description"
  * lib: more styling
  * Makefile: add -build.js and -parse.js dist files
  * lib: separate out the parse and build logic into their own files
  * Makefile: add makefile with browserify build rules
  * package: add "browserify" as a dev dependency
  * plist: tabs to spaces (again)
  * add a .jshintrc file
  * LICENSE: update
  * node-webkit support
  * Ignore tests/ in .npmignore file
  * Remove duplicate devDependencies key
  * Remove trailing whitespace
  * adding recent contributors. Bumping npm package number (patch release)
  * Fixed node.js string handling
  * bumping version number
  * Fixed global variable plist leak
  * patch release 0.4.1
  * removed temporary debug output file
  * flipping the cases for writing data and string elements in build(). removed the 125 length check. Added validation of base64 encoding for data fields when parsing. added unit tests.
  * fixed syntax errors in README examples (issue #20)
  * added Sync versions of calls. added deprecation warnings for old method calls. updated documentation. If the resulting object from parseStringSync is an array with 1 element, return just the element. If a plist string or file doesnt have a <plist> tag as the document root element, fail noisily (issue #15)
  * incrementing package version
  * added cross platform base64 encode/decode for data elements (issue #17.) Comments and hygiene.
  * refactored the code to use a DOM parser instead of SAX. closes issues #5 and #16
  * rolling up package version
  * updated base64 detection regexp. updated README. hygiene.
  * refactored the build function. Fixes issue #14
  * refactored tests. Modified tests from issue #9. thanks @sylvinus
  * upgrade xmlbuilder package version. this is why .end() was needed in last commit; breaking change to xmlbuilder lib. :/
  * bug fix in build function, forgot to call .end() Refactored tests to use nodeunit
  * Implemented support for real, identity tests
  * Refactored base64 detection - still sloppy, fixed date building. Passing tests OK.
  * Implemented basic plist builder that turns an existing JS object into plist XML. date, real and data types still need to be implemented.
(The MIT License)

Copyright (c) 2010-2017 Nathan Rajlich <nathan@tootallnate.net>

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)

# BIN directory
BIN := $(THIS_DIR)/node_modules/.bin

# applications
NODE ?= node
NPM ?= $(NODE) $(shell which npm)
BROWSERIFY ?= $(NODE) $(BIN)/browserify
MOCHA ?= $(NODE) $(BIN)/mocha
ZUUL ?= $(NODE) $(BIN)/zuul

REPORTER ?= spec

all: dist/plist.js dist/plist-build.js dist/plist-parse.js

install: node_modules

clean:
	@rm -rf node_modules dist

dist:
	@mkdir -p $@

dist/plist-build.js: node_modules lib/build.js dist
	@$(BROWSERIFY) \
		--standalone plist \
		lib/build.js > $@

dist/plist-parse.js: node_modules lib/parse.js dist
	@$(BROWSERIFY) \
		--standalone plist \
		lib/parse.js > $@

dist/plist.js: node_modules lib/*.js dist
	@$(BROWSERIFY) \
		--standalone plist \
		index.js > $@

node_modules: package.json
	@NODE_ENV= $(NPM) install
	@touch node_modules

test:
	@if [ "x$(BROWSER_NAME)" = "x" ]; then \
		$(MAKE) test-node; \
		else \
		$(MAKE) test-zuul; \
	fi

test-node:
	@$(MOCHA) \
		--reporter $(REPORTER) \
		test/*.js

test-zuul:
	@if [ "x$(BROWSER_PLATFORM)" = "x" ]; then \
		$(ZUUL) \
		--ui mocha-bdd \
		--browser-name $(BROWSER_NAME) \
		--browser-version $(BROWSER_VERSION) \
		test/*.js; \
		else \
		$(ZUUL) \
		--ui mocha-bdd \
		--browser-name $(BROWSER_NAME) \
		--browser-version $(BROWSER_VERSION) \
		--browser-platform "$(BROWSER_PLATFORM)" \
		test/*.js; \
	fi

.PHONY: all install clean test test-node test-zuul
/**
 * Parser functions.
 */

var parserFunctions = require('./lib/parse');
Object.keys(parserFunctions).forEach(function (k) { exports[k] = parserFunctions[k]; });

/**
 * Builder functions.
 */

var builderFunctions = require('./lib/build');
Object.keys(builderFunctions).forEach(function (k) { exports[k] = builderFunctions[k]; });
{
  "author": {
    "name": "Nathan Rajlich",
    "email": "nathan@tootallnate.net"
  },
  "dependencies": {
    "base64-js": "^1.2.3",
    "xmlbuilder": "^9.0.7",
    "xmldom": "0.1.x"
  },
  "deprecated": false,
  "description": "Mac OS X Plist parser/builder for Node.js and browsers",
  "devDependencies": {
    "browserify": "^16.1.1",
    "mocha": "^5.0.4",
    "multiline": "^1.0.2",
    "zuul": "^3.10.1"
  },
  "engines": {
    "node": ">=6"
  },
  "homepage": "https://github.com/TooTallNate/node-plist#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "plist",
  "repository": {
    "type": "git",
    "url": "git://github.com/TooTallNate/node-plist.git"
  },
  "version": "3.0.1"
}/**
 * Module dependencies.
 */

var base64 = require('base64-js');
var xmlbuilder = require('xmlbuilder');

/**
 * Module exports.
 */

exports.build = build;

/**
 * Accepts a `Date` instance and returns an ISO date string.
 *
 * @param {Date} d - Date instance to serialize
 * @returns {String} ISO date string representation of `d`
 * @api private
 */

function ISODateString(d){
  function pad(n){
    return n < 10 ? '0' + n : n;
  }
  return d.getUTCFullYear()+'-'
    + pad(d.getUTCMonth()+1)+'-'
    + pad(d.getUTCDate())+'T'
    + pad(d.getUTCHours())+':'
    + pad(d.getUTCMinutes())+':'
    + pad(d.getUTCSeconds())+'Z';
}

/**
 * Returns the internal "type" of `obj` via the
 * `Object.prototype.toString()` trick.
 *
 * @param {Mixed} obj - any value
 * @returns {String} the internal "type" name
 * @api private
 */

var toString = Object.prototype.toString;
function type (obj) {
  var m = toString.call(obj).match(/\[object (.*)\]/);
  return m ? m[1] : m;
}

/**
 * Generate an XML plist string from the input object `obj`.
 *
 * @param {Object} obj - the object to convert
 * @param {Object} [opts] - optional options object
 * @returns {String} converted plist XML string
 * @api public
 */

function build (obj, opts) {
  var XMLHDR = {
    version: '1.0',
    encoding: 'UTF-8'
  };

  var XMLDTD = {
    pubid: '-//Apple//DTD PLIST 1.0//EN',
    sysid: 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'
  };

  var doc = xmlbuilder.create('plist');

  doc.dec(XMLHDR.version, XMLHDR.encoding, XMLHDR.standalone);
  doc.dtd(XMLDTD.pubid, XMLDTD.sysid);
  doc.att('version', '1.0');

  walk_obj(obj, doc);

  if (!opts) opts = {};
  // default `pretty` to `true`
  opts.pretty = opts.pretty !== false;
  return doc.end(opts);
}

/**
 * depth first, recursive traversal of a javascript object. when complete,
 * next_child contains a reference to the build XML object.
 *
 * @api private
 */

function walk_obj(next, next_child) {
  var tag_type, i, prop;
  var name = type(next);

  if ('Undefined' == name) {
    return;
  } else if (Array.isArray(next)) {
    next_child = next_child.ele('array');
    for (i = 0; i < next.length; i++) {
      walk_obj(next[i], next_child);
    }

  } else if (Buffer.isBuffer(next)) {
    next_child.ele('data').raw(next.toString('base64'));

  } else if ('Object' == name) {
    next_child = next_child.ele('dict');
    for (prop in next) {
      if (next.hasOwnProperty(prop)) {
        next_child.ele('key').txt(prop);
        walk_obj(next[prop], next_child);
      }
    }

  } else if ('Number' == name) {
    // detect if this is an integer or real
    // TODO: add an ability to force one way or another via a "cast"
    tag_type = (next % 1 === 0) ? 'integer' : 'real';
    next_child.ele(tag_type).txt(next.toString());

  } else if ('Date' == name) {
    next_child.ele('date').txt(ISODateString(new Date(next)));

  } else if ('Boolean' == name) {
    next_child.ele(next ? 'true' : 'false');

  } else if ('String' == name) {
    next_child.ele('string').txt(next);

  } else if ('ArrayBuffer' == name) {
    next_child.ele('data').raw(base64.fromByteArray(next));

  } else if (next && next.buffer && 'ArrayBuffer' == type(next.buffer)) {
    // a typed array
    next_child.ele('data').raw(base64.fromByteArray(new Uint8Array(next.buffer), next_child));

  }
}
/**
 * Module dependencies.
 */

var DOMParser = require('xmldom').DOMParser;

/**
 * Module exports.
 */

exports.parse = parse;

var TEXT_NODE = 3;
var CDATA_NODE = 4;
var COMMENT_NODE = 8;


/**
 * We ignore raw text (usually whitespace), <!-- xml comments -->,
 * and raw CDATA nodes.
 *
 * @param {Element} node
 * @returns {Boolean}
 * @api private
 */

function shouldIgnoreNode (node) {
  return node.nodeType === TEXT_NODE
    || node.nodeType === COMMENT_NODE
    || node.nodeType === CDATA_NODE;
}

/**
 * Check if the node is empty. Some plist file has such node:
 * <key />
 * this node shoud be ignored.
 *
 * @see https://github.com/TooTallNate/plist.js/issues/66
 * @param {Element} node
 * @returns {Boolean}
 * @api private
 */
function isEmptyNode(node){
  if(!node.childNodes || node.childNodes.length === 0) {
    return true;
  } else {
    return false;
  }
}

function invariant(test, message) {
  if (!test) {
    throw new Error(message);
  }
}

/**
 * Parses a Plist XML string. Returns an Object.
 *
 * @param {String} xml - the XML String to decode
 * @returns {Mixed} the decoded value from the Plist XML
 * @api public
 */

function parse (xml) {
  var doc = new DOMParser().parseFromString(xml);
  invariant(
    doc.documentElement.nodeName === 'plist',
    'malformed document. First element should be <plist>'
  );
  var plist = parsePlistXML(doc.documentElement);

  // the root <plist> node gets interpreted as an Array,
  // so pull out the inner data first
  if (plist.length == 1) plist = plist[0];

  return plist;
}

/**
 * Convert an XML based plist document into a JSON representation.
 *
 * @param {Object} xml_node - current XML node in the plist
 * @returns {Mixed} built up JSON object
 * @api private
 */

function parsePlistXML (node) {
  var i, new_obj, key, val, new_arr, res, counter, type;

  if (!node)
    return null;

  if (node.nodeName === 'plist') {
    new_arr = [];
    if (isEmptyNode(node)) {
      return new_arr;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (!shouldIgnoreNode(node.childNodes[i])) {
        new_arr.push( parsePlistXML(node.childNodes[i]));
      }
    }
    return new_arr;
  } else if (node.nodeName === 'dict') {
    new_obj = {};
    key = null;
    counter = 0;
    if (isEmptyNode(node)) {
      return new_obj;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (shouldIgnoreNode(node.childNodes[i])) continue;
      if (counter % 2 === 0) {
        invariant(
          node.childNodes[i].nodeName === 'key',
          'Missing key while parsing <dict/>.'
        );
        key = parsePlistXML(node.childNodes[i]);
      } else {
        invariant(
          node.childNodes[i].nodeName !== 'key',
          'Unexpected key "'
            + parsePlistXML(node.childNodes[i])
            + '" while parsing <dict/>.'
        );
        new_obj[key] = parsePlistXML(node.childNodes[i]);
      }
      counter += 1;
    }
    if (counter % 2 === 1) {
      throw new Error('Missing value for "' + key + '" while parsing <dict/>');
    }
    return new_obj;

  } else if (node.nodeName === 'array') {
    new_arr = [];
    if (isEmptyNode(node)) {
      return new_arr;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (!shouldIgnoreNode(node.childNodes[i])) {
        res = parsePlistXML(node.childNodes[i]);
        if (null != res) new_arr.push(res);
      }
    }
    return new_arr;

  } else if (node.nodeName === '#text') {
    // TODO: what should we do with text types? (CDATA sections)

  } else if (node.nodeName === 'key') {
    if (isEmptyNode(node)) {
      return '';
    }
    return node.childNodes[0].nodeValue;
  } else if (node.nodeName === 'string') {
    res = '';
    if (isEmptyNode(node)) {
      return res;
    }
    for (i=0; i < node.childNodes.length; i++) {
      var type = node.childNodes[i].nodeType;
      if (type === TEXT_NODE || type === CDATA_NODE) {
        res += node.childNodes[i].nodeValue;
      }
    }
    return res;

  } else if (node.nodeName === 'integer') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as integer.'
    );
    return parseInt(node.childNodes[0].nodeValue, 10);

  } else if (node.nodeName === 'real') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as real.'
    );
    res = '';
    for (i=0; i < node.childNodes.length; i++) {
      if (node.childNodes[i].nodeType === TEXT_NODE) {
        res += node.childNodes[i].nodeValue;
      }
    }
    return parseFloat(res);

  } else if (node.nodeName === 'data') {
    res = '';
    if (isEmptyNode(node)) {
      return Buffer.from(res, 'base64');
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (node.childNodes[i].nodeType === TEXT_NODE) {
        res += node.childNodes[i].nodeValue.replace(/\s+/g, '');
      }
    }
    return Buffer.from(res, 'base64');

  } else if (node.nodeName === 'date') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as Date.'
    )
    return new Date(node.childNodes[0].nodeValue);

  } else if (node.nodeName === 'true') {
    return true;

  } else if (node.nodeName === 'false') {
    return false;
  }
}
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.plist = f()}})(function(){var define,module,exports;return (function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(require,module,exports){
(function (Buffer){
/**
 * Module dependencies.
 */

var base64 = require('base64-js');
var xmlbuilder = require('xmlbuilder');

/**
 * Module exports.
 */

exports.build = build;

/**
 * Accepts a `Date` instance and returns an ISO date string.
 *
 * @param {Date} d - Date instance to serialize
 * @returns {String} ISO date string representation of `d`
 * @api private
 */

function ISODateString(d){
  function pad(n){
    return n < 10 ? '0' + n : n;
  }
  return d.getUTCFullYear()+'-'
    + pad(d.getUTCMonth()+1)+'-'
    + pad(d.getUTCDate())+'T'
    + pad(d.getUTCHours())+':'
    + pad(d.getUTCMinutes())+':'
    + pad(d.getUTCSeconds())+'Z';
}

/**
 * Returns the internal "type" of `obj` via the
 * `Object.prototype.toString()` trick.
 *
 * @param {Mixed} obj - any value
 * @returns {String} the internal "type" name
 * @api private
 */

var toString = Object.prototype.toString;
function type (obj) {
  var m = toString.call(obj).match(/\[object (.*)\]/);
  return m ? m[1] : m;
}

/**
 * Generate an XML plist string from the input object `obj`.
 *
 * @param {Object} obj - the object to convert
 * @param {Object} [opts] - optional options object
 * @returns {String} converted plist XML string
 * @api public
 */

function build (obj, opts) {
  var XMLHDR = {
    version: '1.0',
    encoding: 'UTF-8'
  };

  var XMLDTD = {
    pubid: '-//Apple//DTD PLIST 1.0//EN',
    sysid: 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'
  };

  var doc = xmlbuilder.create('plist');

  doc.dec(XMLHDR.version, XMLHDR.encoding, XMLHDR.standalone);
  doc.dtd(XMLDTD.pubid, XMLDTD.sysid);
  doc.att('version', '1.0');

  walk_obj(obj, doc);

  if (!opts) opts = {};
  // default `pretty` to `true`
  opts.pretty = opts.pretty !== false;
  return doc.end(opts);
}

/**
 * depth first, recursive traversal of a javascript object. when complete,
 * next_child contains a reference to the build XML object.
 *
 * @api private
 */

function walk_obj(next, next_child) {
  var tag_type, i, prop;
  var name = type(next);

  if ('Undefined' == name) {
    return;
  } else if (Array.isArray(next)) {
    next_child = next_child.ele('array');
    for (i = 0; i < next.length; i++) {
      walk_obj(next[i], next_child);
    }

  } else if (Buffer.isBuffer(next)) {
    next_child.ele('data').raw(next.toString('base64'));

  } else if ('Object' == name) {
    next_child = next_child.ele('dict');
    for (prop in next) {
      if (next.hasOwnProperty(prop)) {
        next_child.ele('key').txt(prop);
        walk_obj(next[prop], next_child);
      }
    }

  } else if ('Number' == name) {
    // detect if this is an integer or real
    // TODO: add an ability to force one way or another via a "cast"
    tag_type = (next % 1 === 0) ? 'integer' : 'real';
    next_child.ele(tag_type).txt(next.toString());

  } else if ('Date' == name) {
    next_child.ele('date').txt(ISODateString(new Date(next)));

  } else if ('Boolean' == name) {
    next_child.ele(next ? 'true' : 'false');

  } else if ('String' == name) {
    next_child.ele('string').txt(next);

  } else if ('ArrayBuffer' == name) {
    next_child.ele('data').raw(base64.fromByteArray(next));

  } else if (next && next.buffer && 'ArrayBuffer' == type(next.buffer)) {
    // a typed array
    next_child.ele('data').raw(base64.fromByteArray(new Uint8Array(next.buffer), next_child));

  }
}

}).call(this,{"isBuffer":require("../node_modules/is-buffer/index.js")})
},{"../node_modules/is-buffer/index.js":3,"base64-js":2,"xmlbuilder":25}],2:[function(require,module,exports){
'use strict'

exports.byteLength = byteLength
exports.toByteArray = toByteArray
exports.fromByteArray = fromByteArray

var lookup = []
var revLookup = []
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array

var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, len = code.length; i < len; ++i) {
  lookup[i] = code[i]
  revLookup[code.charCodeAt(i)] = i
}

// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
revLookup['-'.charCodeAt(0)] = 62
revLookup['_'.charCodeAt(0)] = 63

function placeHoldersCount (b64) {
  var len = b64.length
  if (len % 4 > 0) {
    throw new Error('Invalid string. Length must be a multiple of 4')
  }

  // the number of equal signs (place holders)
  // if there are two placeholders, than the two characters before it
  // represent one byte
  // if there is only one, then the three characters before it represent 2 bytes
  // this is just a cheap hack to not do indexOf twice
  return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
}

function byteLength (b64) {
  // base64 is 4/3 + up to two characters of the original data
  return (b64.length * 3 / 4) - placeHoldersCount(b64)
}

function toByteArray (b64) {
  var i, l, tmp, placeHolders, arr
  var len = b64.length
  placeHolders = placeHoldersCount(b64)

  arr = new Arr((len * 3 / 4) - placeHolders)

  // if there are placeholders, only get up to the last complete 4 chars
  l = placeHolders > 0 ? len - 4 : len

  var L = 0

  for (i = 0; i < l; i += 4) {
    tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
    arr[L++] = (tmp >> 16) & 0xFF
    arr[L++] = (tmp >> 8) & 0xFF
    arr[L++] = tmp & 0xFF
  }

  if (placeHolders === 2) {
    tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
    arr[L++] = tmp & 0xFF
  } else if (placeHolders === 1) {
    tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
    arr[L++] = (tmp >> 8) & 0xFF
    arr[L++] = tmp & 0xFF
  }

  return arr
}

function tripletToBase64 (num) {
  return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
}

function encodeChunk (uint8, start, end) {
  var tmp
  var output = []
  for (var i = start; i < end; i += 3) {
    tmp = ((uint8[i] << 16) & 0xFF0000) + ((uint8[i + 1] << 8) & 0xFF00) + (uint8[i + 2] & 0xFF)
    output.push(tripletToBase64(tmp))
  }
  return output.join('')
}

function fromByteArray (uint8) {
  var tmp
  var len = uint8.length
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  var output = ''
  var parts = []
  var maxChunkLength = 16383 // must be multiple of 3

  // go through the array every three bytes, we'll deal with trailing stuff later
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
  }

  // pad the end with zeros, but make sure to not forget the extra bytes
  if (extraBytes === 1) {
    tmp = uint8[len - 1]
    output += lookup[tmp >> 2]
    output += lookup[(tmp << 4) & 0x3F]
    output += '=='
  } else if (extraBytes === 2) {
    tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
    output += lookup[tmp >> 10]
    output += lookup[(tmp >> 4) & 0x3F]
    output += lookup[(tmp << 2) & 0x3F]
    output += '='
  }

  parts.push(output)

  return parts.join('')
}

},{}],3:[function(require,module,exports){
/*!
 * Determine if an object is a Buffer
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */

// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
module.exports = function (obj) {
  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
}

function isBuffer (obj) {
  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
}

// For Node v0.10 support. Remove this eventually.
function isSlowBuffer (obj) {
  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
}

},{}],4:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var assign, isArray, isEmpty, isFunction, isObject, isPlainObject,
    slice = [].slice,
    hasProp = {}.hasOwnProperty;

  assign = function() {
    var i, key, len, source, sources, target;
    target = arguments[0], sources = 2 <= arguments.length ? slice.call(arguments, 1) : [];
    if (isFunction(Object.assign)) {
      Object.assign.apply(null, arguments);
    } else {
      for (i = 0, len = sources.length; i < len; i++) {
        source = sources[i];
        if (source != null) {
          for (key in source) {
            if (!hasProp.call(source, key)) continue;
            target[key] = source[key];
          }
        }
      }
    }
    return target;
  };

  isFunction = function(val) {
    return !!val && Object.prototype.toString.call(val) === '[object Function]';
  };

  isObject = function(val) {
    var ref;
    return !!val && ((ref = typeof val) === 'function' || ref === 'object');
  };

  isArray = function(val) {
    if (isFunction(Array.isArray)) {
      return Array.isArray(val);
    } else {
      return Object.prototype.toString.call(val) === '[object Array]';
    }
  };

  isEmpty = function(val) {
    var key;
    if (isArray(val)) {
      return !val.length;
    } else {
      for (key in val) {
        if (!hasProp.call(val, key)) continue;
        return false;
      }
      return true;
    }
  };

  isPlainObject = function(val) {
    var ctor, proto;
    return isObject(val) && (proto = Object.getPrototypeOf(val)) && (ctor = proto.constructor) && (typeof ctor === 'function') && (ctor instanceof ctor) && (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object));
  };

  module.exports.assign = assign;

  module.exports.isFunction = isFunction;

  module.exports.isObject = isObject;

  module.exports.isArray = isArray;

  module.exports.isEmpty = isEmpty;

  module.exports.isPlainObject = isPlainObject;

}).call(this);

},{}],5:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute;

  module.exports = XMLAttribute = (function() {
    function XMLAttribute(parent, name, value) {
      this.options = parent.options;
      this.stringify = parent.stringify;
      if (name == null) {
        throw new Error("Missing attribute name of element " + parent.name);
      }
      if (value == null) {
        throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name);
      }
      this.name = this.stringify.attName(name);
      this.value = this.stringify.attValue(value);
    }

    XMLAttribute.prototype.clone = function() {
      return Object.create(this);
    };

    XMLAttribute.prototype.toString = function(options) {
      return this.options.writer.set(options).attribute(this);
    };

    return XMLAttribute;

  })();

}).call(this);

},{}],6:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLCData = (function(superClass) {
    extend(XMLCData, superClass);

    function XMLCData(parent, text) {
      XMLCData.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing CDATA text");
      }
      this.text = this.stringify.cdata(text);
    }

    XMLCData.prototype.clone = function() {
      return Object.create(this);
    };

    XMLCData.prototype.toString = function(options) {
      return this.options.writer.set(options).cdata(this);
    };

    return XMLCData;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],7:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLComment, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLComment = (function(superClass) {
    extend(XMLComment, superClass);

    function XMLComment(parent, text) {
      XMLComment.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing comment text");
      }
      this.text = this.stringify.comment(text);
    }

    XMLComment.prototype.clone = function() {
      return Object.create(this);
    };

    XMLComment.prototype.toString = function(options) {
      return this.options.writer.set(options).comment(this);
    };

    return XMLComment;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],8:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDAttList, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDAttList = (function(superClass) {
    extend(XMLDTDAttList, superClass);

    function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      XMLDTDAttList.__super__.constructor.call(this, parent);
      if (elementName == null) {
        throw new Error("Missing DTD element name");
      }
      if (attributeName == null) {
        throw new Error("Missing DTD attribute name");
      }
      if (!attributeType) {
        throw new Error("Missing DTD attribute type");
      }
      if (!defaultValueType) {
        throw new Error("Missing DTD attribute default");
      }
      if (defaultValueType.indexOf('#') !== 0) {
        defaultValueType = '#' + defaultValueType;
      }
      if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {
        throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT");
      }
      if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {
        throw new Error("Default value only applies to #FIXED or #DEFAULT");
      }
      this.elementName = this.stringify.eleName(elementName);
      this.attributeName = this.stringify.attName(attributeName);
      this.attributeType = this.stringify.dtdAttType(attributeType);
      this.defaultValue = this.stringify.dtdAttDefault(defaultValue);
      this.defaultValueType = defaultValueType;
    }

    XMLDTDAttList.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdAttList(this);
    };

    return XMLDTDAttList;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],9:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDElement, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDElement = (function(superClass) {
    extend(XMLDTDElement, superClass);

    function XMLDTDElement(parent, name, value) {
      XMLDTDElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing DTD element name");
      }
      if (!value) {
        value = '(#PCDATA)';
      }
      if (Array.isArray(value)) {
        value = '(' + value.join(',') + ')';
      }
      this.name = this.stringify.eleName(name);
      this.value = this.stringify.dtdElementValue(value);
    }

    XMLDTDElement.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdElement(this);
    };

    return XMLDTDElement;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],10:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDEntity, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDEntity = (function(superClass) {
    extend(XMLDTDEntity, superClass);

    function XMLDTDEntity(parent, pe, name, value) {
      XMLDTDEntity.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing entity name");
      }
      if (value == null) {
        throw new Error("Missing entity value");
      }
      this.pe = !!pe;
      this.name = this.stringify.eleName(name);
      if (!isObject(value)) {
        this.value = this.stringify.dtdEntityValue(value);
      } else {
        if (!value.pubID && !value.sysID) {
          throw new Error("Public and/or system identifiers are required for an external entity");
        }
        if (value.pubID && !value.sysID) {
          throw new Error("System identifier is required for a public external entity");
        }
        if (value.pubID != null) {
          this.pubID = this.stringify.dtdPubID(value.pubID);
        }
        if (value.sysID != null) {
          this.sysID = this.stringify.dtdSysID(value.sysID);
        }
        if (value.nData != null) {
          this.nData = this.stringify.dtdNData(value.nData);
        }
        if (this.pe && this.nData) {
          throw new Error("Notation declaration is not allowed in a parameter entity");
        }
      }
    }

    XMLDTDEntity.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdEntity(this);
    };

    return XMLDTDEntity;

  })(XMLNode);

}).call(this);

},{"./Utility":4,"./XMLNode":17}],11:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDNotation, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDNotation = (function(superClass) {
    extend(XMLDTDNotation, superClass);

    function XMLDTDNotation(parent, name, value) {
      XMLDTDNotation.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing notation name");
      }
      if (!value.pubID && !value.sysID) {
        throw new Error("Public or system identifiers are required for an external entity");
      }
      this.name = this.stringify.eleName(name);
      if (value.pubID != null) {
        this.pubID = this.stringify.dtdPubID(value.pubID);
      }
      if (value.sysID != null) {
        this.sysID = this.stringify.dtdSysID(value.sysID);
      }
    }

    XMLDTDNotation.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdNotation(this);
    };

    return XMLDTDNotation;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],12:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDeclaration, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  module.exports = XMLDeclaration = (function(superClass) {
    extend(XMLDeclaration, superClass);

    function XMLDeclaration(parent, version, encoding, standalone) {
      var ref;
      XMLDeclaration.__super__.constructor.call(this, parent);
      if (isObject(version)) {
        ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;
      }
      if (!version) {
        version = '1.0';
      }
      this.version = this.stringify.xmlVersion(version);
      if (encoding != null) {
        this.encoding = this.stringify.xmlEncoding(encoding);
      }
      if (standalone != null) {
        this.standalone = this.stringify.xmlStandalone(standalone);
      }
    }

    XMLDeclaration.prototype.toString = function(options) {
      return this.options.writer.set(options).declaration(this);
    };

    return XMLDeclaration;

  })(XMLNode);

}).call(this);

},{"./Utility":4,"./XMLNode":17}],13:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  module.exports = XMLDocType = (function(superClass) {
    extend(XMLDocType, superClass);

    function XMLDocType(parent, pubID, sysID) {
      var ref, ref1;
      XMLDocType.__super__.constructor.call(this, parent);
      this.documentObject = parent;
      if (isObject(pubID)) {
        ref = pubID, pubID = ref.pubID, sysID = ref.sysID;
      }
      if (sysID == null) {
        ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1];
      }
      if (pubID != null) {
        this.pubID = this.stringify.dtdPubID(pubID);
      }
      if (sysID != null) {
        this.sysID = this.stringify.dtdSysID(sysID);
      }
    }

    XMLDocType.prototype.element = function(name, value) {
      var child;
      child = new XMLDTDElement(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var child;
      child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.entity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, false, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.pEntity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, true, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.notation = function(name, value) {
      var child;
      child = new XMLDTDNotation(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.toString = function(options) {
      return this.options.writer.set(options).docType(this);
    };

    XMLDocType.prototype.ele = function(name, value) {
      return this.element(name, value);
    };

    XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);
    };

    XMLDocType.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocType.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocType.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    XMLDocType.prototype.up = function() {
      return this.root() || this.documentObject;
    };

    return XMLDocType;

  })(XMLNode);

}).call(this);

},{"./Utility":4,"./XMLDTDAttList":8,"./XMLDTDElement":9,"./XMLDTDEntity":10,"./XMLDTDNotation":11,"./XMLNode":17}],14:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDocument, XMLNode, XMLStringWriter, XMLStringifier, isPlainObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isPlainObject = require('./Utility').isPlainObject;

  XMLNode = require('./XMLNode');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  module.exports = XMLDocument = (function(superClass) {
    extend(XMLDocument, superClass);

    function XMLDocument(options) {
      XMLDocument.__super__.constructor.call(this, null);
      options || (options = {});
      if (!options.writer) {
        options.writer = new XMLStringWriter();
      }
      this.options = options;
      this.stringify = new XMLStringifier(options);
      this.isDocument = true;
    }

    XMLDocument.prototype.end = function(writer) {
      var writerOptions;
      if (!writer) {
        writer = this.options.writer;
      } else if (isPlainObject(writer)) {
        writerOptions = writer;
        writer = this.options.writer.set(writerOptions);
      }
      return writer.document(this);
    };

    XMLDocument.prototype.toString = function(options) {
      return this.options.writer.set(options).document(this);
    };

    return XMLDocument;

  })(XMLNode);

}).call(this);

},{"./Utility":4,"./XMLNode":17,"./XMLStringWriter":21,"./XMLStringifier":22}],15:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute, XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLDocumentCB, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLStringifier, XMLText, isFunction, isObject, isPlainObject, ref,
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isPlainObject = ref.isPlainObject;

  XMLElement = require('./XMLElement');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLAttribute = require('./XMLAttribute');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  module.exports = XMLDocumentCB = (function() {
    function XMLDocumentCB(options, onData, onEnd) {
      var writerOptions;
      options || (options = {});
      if (!options.writer) {
        options.writer = new XMLStringWriter(options);
      } else if (isPlainObject(options.writer)) {
        writerOptions = options.writer;
        options.writer = new XMLStringWriter(writerOptions);
      }
      this.options = options;
      this.writer = options.writer;
      this.stringify = new XMLStringifier(options);
      this.onDataCallback = onData || function() {};
      this.onEndCallback = onEnd || function() {};
      this.currentNode = null;
      this.currentLevel = -1;
      this.openTags = {};
      this.documentStarted = false;
      this.documentCompleted = false;
      this.root = null;
    }

    XMLDocumentCB.prototype.node = function(name, attributes, text) {
      var ref1;
      if (name == null) {
        throw new Error("Missing node name");
      }
      if (this.root && this.currentLevel === -1) {
        throw new Error("Document can only have one root node");
      }
      this.openCurrent();
      name = name.valueOf();
      if (attributes == null) {
        attributes = {};
      }
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      this.currentNode = new XMLElement(this, name, attributes);
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      if (text != null) {
        this.text(text);
      }
      return this;
    };

    XMLDocumentCB.prototype.element = function(name, attributes, text) {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.dtdElement.apply(this, arguments);
      } else {
        return this.node(name, attributes, text);
      }
    };

    XMLDocumentCB.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (!this.currentNode || this.currentNode.children) {
        throw new Error("att() can only be used immediately after an ele() call in callback mode");
      }
      if (name != null) {
        name = name.valueOf();
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (!this.options.skipNullAttributes || (value != null)) {
          this.currentNode.attributes[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLDocumentCB.prototype.text = function(value) {
      var node;
      this.openCurrent();
      node = new XMLText(this, value);
      this.onData(this.writer.text(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.cdata = function(value) {
      var node;
      this.openCurrent();
      node = new XMLCData(this, value);
      this.onData(this.writer.cdata(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.comment = function(value) {
      var node;
      this.openCurrent();
      node = new XMLComment(this, value);
      this.onData(this.writer.comment(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.raw = function(value) {
      var node;
      this.openCurrent();
      node = new XMLRaw(this, value);
      this.onData(this.writer.raw(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.instruction = function(target, value) {
      var i, insTarget, insValue, len, node;
      this.openCurrent();
      if (target != null) {
        target = target.valueOf();
      }
      if (value != null) {
        value = value.valueOf();
      }
      if (Array.isArray(target)) {
        for (i = 0, len = target.length; i < len; i++) {
          insTarget = target[i];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        node = new XMLProcessingInstruction(this, target, value);
        this.onData(this.writer.processingInstruction(node, this.currentLevel + 1));
      }
      return this;
    };

    XMLDocumentCB.prototype.declaration = function(version, encoding, standalone) {
      var node;
      this.openCurrent();
      if (this.documentStarted) {
        throw new Error("declaration() must be the first node");
      }
      node = new XMLDeclaration(this, version, encoding, standalone);
      this.onData(this.writer.declaration(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.doctype = function(root, pubID, sysID) {
      this.openCurrent();
      if (root == null) {
        throw new Error("Missing root node name");
      }
      if (this.root) {
        throw new Error("dtd() must come before the root node");
      }
      this.currentNode = new XMLDocType(this, pubID, sysID);
      this.currentNode.rootNodeName = root;
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      return this;
    };

    XMLDocumentCB.prototype.dtdElement = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDElement(this, name, value);
      this.onData(this.writer.dtdElement(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var node;
      this.openCurrent();
      node = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.onData(this.writer.dtdAttList(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.entity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, false, name, value);
      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.pEntity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, true, name, value);
      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.notation = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDNotation(this, name, value);
      this.onData(this.writer.dtdNotation(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.up = function() {
      if (this.currentLevel < 0) {
        throw new Error("The document node has no parent");
      }
      if (this.currentNode) {
        if (this.currentNode.children) {
          this.closeNode(this.currentNode);
        } else {
          this.openNode(this.currentNode);
        }
        this.currentNode = null;
      } else {
        this.closeNode(this.openTags[this.currentLevel]);
      }
      delete this.openTags[this.currentLevel];
      this.currentLevel--;
      return this;
    };

    XMLDocumentCB.prototype.end = function() {
      while (this.currentLevel >= 0) {
        this.up();
      }
      return this.onEnd();
    };

    XMLDocumentCB.prototype.openCurrent = function() {
      if (this.currentNode) {
        this.currentNode.children = true;
        return this.openNode(this.currentNode);
      }
    };

    XMLDocumentCB.prototype.openNode = function(node) {
      if (!node.isOpen) {
        if (!this.root && this.currentLevel === 0 && node instanceof XMLElement) {
          this.root = node;
        }
        this.onData(this.writer.openNode(node, this.currentLevel));
        return node.isOpen = true;
      }
    };

    XMLDocumentCB.prototype.closeNode = function(node) {
      if (!node.isClosed) {
        this.onData(this.writer.closeNode(node, this.currentLevel));
        return node.isClosed = true;
      }
    };

    XMLDocumentCB.prototype.onData = function(chunk) {
      this.documentStarted = true;
      return this.onDataCallback(chunk);
    };

    XMLDocumentCB.prototype.onEnd = function() {
      this.documentCompleted = true;
      return this.onEndCallback();
    };

    XMLDocumentCB.prototype.ele = function() {
      return this.element.apply(this, arguments);
    };

    XMLDocumentCB.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLDocumentCB.prototype.dtd = function(root, pubID, sysID) {
      return this.doctype(root, pubID, sysID);
    };

    XMLDocumentCB.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLDocumentCB.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.t = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLDocumentCB.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.att = function() {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.a = function() {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocumentCB.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocumentCB.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    return XMLDocumentCB;

  })();

}).call(this);

},{"./Utility":4,"./XMLAttribute":5,"./XMLCData":6,"./XMLComment":7,"./XMLDTDAttList":8,"./XMLDTDElement":9,"./XMLDTDEntity":10,"./XMLDTDNotation":11,"./XMLDeclaration":12,"./XMLDocType":13,"./XMLElement":16,"./XMLProcessingInstruction":18,"./XMLRaw":19,"./XMLStringWriter":21,"./XMLStringifier":22,"./XMLText":23}],16:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute, XMLElement, XMLNode, isFunction, isObject, ref,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction;

  XMLNode = require('./XMLNode');

  XMLAttribute = require('./XMLAttribute');

  module.exports = XMLElement = (function(superClass) {
    extend(XMLElement, superClass);

    function XMLElement(parent, name, attributes) {
      XMLElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing element name");
      }
      this.name = this.stringify.eleName(name);
      this.attributes = {};
      if (attributes != null) {
        this.attribute(attributes);
      }
      if (parent.isDocument) {
        this.isRoot = true;
        this.documentObject = parent;
        parent.rootObject = this;
      }
    }

    XMLElement.prototype.clone = function() {
      var att, attName, clonedSelf, ref1;
      clonedSelf = Object.create(this);
      if (clonedSelf.isRoot) {
        clonedSelf.documentObject = null;
      }
      clonedSelf.attributes = {};
      ref1 = this.attributes;
      for (attName in ref1) {
        if (!hasProp.call(ref1, attName)) continue;
        att = ref1[attName];
        clonedSelf.attributes[attName] = att.clone();
      }
      clonedSelf.children = [];
      this.children.forEach(function(child) {
        var clonedChild;
        clonedChild = child.clone();
        clonedChild.parent = clonedSelf;
        return clonedSelf.children.push(clonedChild);
      });
      return clonedSelf;
    };

    XMLElement.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (name != null) {
        name = name.valueOf();
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (!this.options.skipNullAttributes || (value != null)) {
          this.attributes[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLElement.prototype.removeAttribute = function(name) {
      var attName, i, len;
      if (name == null) {
        throw new Error("Missing attribute name");
      }
      name = name.valueOf();
      if (Array.isArray(name)) {
        for (i = 0, len = name.length; i < len; i++) {
          attName = name[i];
          delete this.attributes[attName];
        }
      } else {
        delete this.attributes[name];
      }
      return this;
    };

    XMLElement.prototype.toString = function(options) {
      return this.options.writer.set(options).element(this);
    };

    XMLElement.prototype.att = function(name, value) {
      return this.attribute(name, value);
    };

    XMLElement.prototype.a = function(name, value) {
      return this.attribute(name, value);
    };

    return XMLElement;

  })(XMLNode);

}).call(this);

},{"./Utility":4,"./XMLAttribute":5,"./XMLNode":17}],17:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLProcessingInstruction, XMLRaw, XMLText, isEmpty, isFunction, isObject, ref,
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isEmpty = ref.isEmpty;

  XMLElement = null;

  XMLCData = null;

  XMLComment = null;

  XMLDeclaration = null;

  XMLDocType = null;

  XMLRaw = null;

  XMLText = null;

  XMLProcessingInstruction = null;

  module.exports = XMLNode = (function() {
    function XMLNode(parent) {
      this.parent = parent;
      if (this.parent) {
        this.options = this.parent.options;
        this.stringify = this.parent.stringify;
      }
      this.children = [];
      if (!XMLElement) {
        XMLElement = require('./XMLElement');
        XMLCData = require('./XMLCData');
        XMLComment = require('./XMLComment');
        XMLDeclaration = require('./XMLDeclaration');
        XMLDocType = require('./XMLDocType');
        XMLRaw = require('./XMLRaw');
        XMLText = require('./XMLText');
        XMLProcessingInstruction = require('./XMLProcessingInstruction');
      }
    }

    XMLNode.prototype.element = function(name, attributes, text) {
      var childNode, item, j, k, key, lastChild, len, len1, ref1, val;
      lastChild = null;
      if (attributes == null) {
        attributes = {};
      }
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      if (name != null) {
        name = name.valueOf();
      }
      if (Array.isArray(name)) {
        for (j = 0, len = name.length; j < len; j++) {
          item = name[j];
          lastChild = this.element(item);
        }
      } else if (isFunction(name)) {
        lastChild = this.element(name.apply());
      } else if (isObject(name)) {
        for (key in name) {
          if (!hasProp.call(name, key)) continue;
          val = name[key];
          if (isFunction(val)) {
            val = val.apply();
          }
          if ((isObject(val)) && (isEmpty(val))) {
            val = null;
          }
          if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {
            lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);
          } else if (!this.options.separateArrayItems && Array.isArray(val)) {
            for (k = 0, len1 = val.length; k < len1; k++) {
              item = val[k];
              childNode = {};
              childNode[key] = item;
              lastChild = this.element(childNode);
            }
          } else if (isObject(val)) {
            lastChild = this.element(key);
            lastChild.element(val);
          } else {
            lastChild = this.element(key, val);
          }
        }
      } else {
        if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {
          lastChild = this.text(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {
          lastChild = this.cdata(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {
          lastChild = this.comment(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {
          lastChild = this.raw(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) {
          lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text);
        } else {
          lastChild = this.node(name, attributes, text);
        }
      }
      if (lastChild == null) {
        throw new Error("Could not create any elements with: " + name);
      }
      return lastChild;
    };

    XMLNode.prototype.insertBefore = function(name, attributes, text) {
      var child, i, removed;
      if (this.isRoot) {
        throw new Error("Cannot insert elements at root level");
      }
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.element(name, attributes, text);
      Array.prototype.push.apply(this.parent.children, removed);
      return child;
    };

    XMLNode.prototype.insertAfter = function(name, attributes, text) {
      var child, i, removed;
      if (this.isRoot) {
        throw new Error("Cannot insert elements at root level");
      }
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.element(name, attributes, text);
      Array.prototype.push.apply(this.parent.children, removed);
      return child;
    };

    XMLNode.prototype.remove = function() {
      var i, ref1;
      if (this.isRoot) {
        throw new Error("Cannot remove the root element");
      }
      i = this.parent.children.indexOf(this);
      [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref1 = [])), ref1;
      return this.parent;
    };

    XMLNode.prototype.node = function(name, attributes, text) {
      var child, ref1;
      if (name != null) {
        name = name.valueOf();
      }
      attributes || (attributes = {});
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      child = new XMLElement(this, name, attributes);
      if (text != null) {
        child.text(text);
      }
      this.children.push(child);
      return child;
    };

    XMLNode.prototype.text = function(value) {
      var child;
      child = new XMLText(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.cdata = function(value) {
      var child;
      child = new XMLCData(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.comment = function(value) {
      var child;
      child = new XMLComment(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.commentBefore = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.commentAfter = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.raw = function(value) {
      var child;
      child = new XMLRaw(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.instruction = function(target, value) {
      var insTarget, insValue, instruction, j, len;
      if (target != null) {
        target = target.valueOf();
      }
      if (value != null) {
        value = value.valueOf();
      }
      if (Array.isArray(target)) {
        for (j = 0, len = target.length; j < len; j++) {
          insTarget = target[j];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        instruction = new XMLProcessingInstruction(this, target, value);
        this.children.push(instruction);
      }
      return this;
    };

    XMLNode.prototype.instructionBefore = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.instructionAfter = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.declaration = function(version, encoding, standalone) {
      var doc, xmldec;
      doc = this.document();
      xmldec = new XMLDeclaration(doc, version, encoding, standalone);
      if (doc.children[0] instanceof XMLDeclaration) {
        doc.children[0] = xmldec;
      } else {
        doc.children.unshift(xmldec);
      }
      return doc.root() || doc;
    };

    XMLNode.prototype.doctype = function(pubID, sysID) {
      var child, doc, doctype, i, j, k, len, len1, ref1, ref2;
      doc = this.document();
      doctype = new XMLDocType(doc, pubID, sysID);
      ref1 = doc.children;
      for (i = j = 0, len = ref1.length; j < len; i = ++j) {
        child = ref1[i];
        if (child instanceof XMLDocType) {
          doc.children[i] = doctype;
          return doctype;
        }
      }
      ref2 = doc.children;
      for (i = k = 0, len1 = ref2.length; k < len1; i = ++k) {
        child = ref2[i];
        if (child.isRoot) {
          doc.children.splice(i, 0, doctype);
          return doctype;
        }
      }
      doc.children.push(doctype);
      return doctype;
    };

    XMLNode.prototype.up = function() {
      if (this.isRoot) {
        throw new Error("The root node has no parent. Use doc() if you need to get the document object.");
      }
      return this.parent;
    };

    XMLNode.prototype.root = function() {
      var node;
      node = this;
      while (node) {
        if (node.isDocument) {
          return node.rootObject;
        } else if (node.isRoot) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.document = function() {
      var node;
      node = this;
      while (node) {
        if (node.isDocument) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.end = function(options) {
      return this.document().end(options);
    };

    XMLNode.prototype.prev = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i < 1) {
        throw new Error("Already at the first node");
      }
      return this.parent.children[i - 1];
    };

    XMLNode.prototype.next = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i === -1 || i === this.parent.children.length - 1) {
        throw new Error("Already at the last node");
      }
      return this.parent.children[i + 1];
    };

    XMLNode.prototype.importDocument = function(doc) {
      var clonedRoot;
      clonedRoot = doc.root().clone();
      clonedRoot.parent = this;
      clonedRoot.isRoot = false;
      this.children.push(clonedRoot);
      return this;
    };

    XMLNode.prototype.ele = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.doc = function() {
      return this.document();
    };

    XMLNode.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLNode.prototype.dtd = function(pubID, sysID) {
      return this.doctype(pubID, sysID);
    };

    XMLNode.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.t = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLNode.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.u = function() {
      return this.up();
    };

    XMLNode.prototype.importXMLBuilder = function(doc) {
      return this.importDocument(doc);
    };

    return XMLNode;

  })();

}).call(this);

},{"./Utility":4,"./XMLCData":6,"./XMLComment":7,"./XMLDeclaration":12,"./XMLDocType":13,"./XMLElement":16,"./XMLProcessingInstruction":18,"./XMLRaw":19,"./XMLText":23}],18:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLProcessingInstruction,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLProcessingInstruction = (function(superClass) {
    extend(XMLProcessingInstruction, superClass);

    function XMLProcessingInstruction(parent, target, value) {
      XMLProcessingInstruction.__super__.constructor.call(this, parent);
      if (target == null) {
        throw new Error("Missing instruction target");
      }
      this.target = this.stringify.insTarget(target);
      if (value) {
        this.value = this.stringify.insValue(value);
      }
    }

    XMLProcessingInstruction.prototype.clone = function() {
      return Object.create(this);
    };

    XMLProcessingInstruction.prototype.toString = function(options) {
      return this.options.writer.set(options).processingInstruction(this);
    };

    return XMLProcessingInstruction;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],19:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLRaw,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLRaw = (function(superClass) {
    extend(XMLRaw, superClass);

    function XMLRaw(parent, text) {
      XMLRaw.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing raw text");
      }
      this.value = this.stringify.raw(text);
    }

    XMLRaw.prototype.clone = function() {
      return Object.create(this);
    };

    XMLRaw.prototype.toString = function(options) {
      return this.options.writer.set(options).raw(this);
    };

    return XMLRaw;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],20:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStreamWriter, XMLText, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLElement = require('./XMLElement');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLWriterBase = require('./XMLWriterBase');

  module.exports = XMLStreamWriter = (function(superClass) {
    extend(XMLStreamWriter, superClass);

    function XMLStreamWriter(stream, options) {
      XMLStreamWriter.__super__.constructor.call(this, options);
      this.stream = stream;
    }

    XMLStreamWriter.prototype.document = function(doc) {
      var child, i, j, len, len1, ref, ref1, results;
      ref = doc.children;
      for (i = 0, len = ref.length; i < len; i++) {
        child = ref[i];
        child.isLastRootNode = false;
      }
      doc.children[doc.children.length - 1].isLastRootNode = true;
      ref1 = doc.children;
      results = [];
      for (j = 0, len1 = ref1.length; j < len1; j++) {
        child = ref1[j];
        switch (false) {
          case !(child instanceof XMLDeclaration):
            results.push(this.declaration(child));
            break;
          case !(child instanceof XMLDocType):
            results.push(this.docType(child));
            break;
          case !(child instanceof XMLComment):
            results.push(this.comment(child));
            break;
          case !(child instanceof XMLProcessingInstruction):
            results.push(this.processingInstruction(child));
            break;
          default:
            results.push(this.element(child));
        }
      }
      return results;
    };

    XMLStreamWriter.prototype.attribute = function(att) {
      return this.stream.write(' ' + att.name + '="' + att.value + '"');
    };

    XMLStreamWriter.prototype.cdata = function(node, level) {
      return this.stream.write(this.space(level) + '<![CDATA[' + node.text + ']]>' + this.endline(node));
    };

    XMLStreamWriter.prototype.comment = function(node, level) {
      return this.stream.write(this.space(level) + '<!-- ' + node.text + ' -->' + this.endline(node));
    };

    XMLStreamWriter.prototype.declaration = function(node, level) {
      this.stream.write(this.space(level));
      this.stream.write('<?xml version="' + node.version + '"');
      if (node.encoding != null) {
        this.stream.write(' encoding="' + node.encoding + '"');
      }
      if (node.standalone != null) {
        this.stream.write(' standalone="' + node.standalone + '"');
      }
      this.stream.write(this.spacebeforeslash + '?>');
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.docType = function(node, level) {
      var child, i, len, ref;
      level || (level = 0);
      this.stream.write(this.space(level));
      this.stream.write('<!DOCTYPE ' + node.root().name);
      if (node.pubID && node.sysID) {
        this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
      } else if (node.sysID) {
        this.stream.write(' SYSTEM "' + node.sysID + '"');
      }
      if (node.children.length > 0) {
        this.stream.write(' [');
        this.stream.write(this.endline(node));
        ref = node.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          switch (false) {
            case !(child instanceof XMLDTDAttList):
              this.dtdAttList(child, level + 1);
              break;
            case !(child instanceof XMLDTDElement):
              this.dtdElement(child, level + 1);
              break;
            case !(child instanceof XMLDTDEntity):
              this.dtdEntity(child, level + 1);
              break;
            case !(child instanceof XMLDTDNotation):
              this.dtdNotation(child, level + 1);
              break;
            case !(child instanceof XMLCData):
              this.cdata(child, level + 1);
              break;
            case !(child instanceof XMLComment):
              this.comment(child, level + 1);
              break;
            case !(child instanceof XMLProcessingInstruction):
              this.processingInstruction(child, level + 1);
              break;
            default:
              throw new Error("Unknown DTD node type: " + child.constructor.name);
          }
        }
        this.stream.write(']');
      }
      this.stream.write(this.spacebeforeslash + '>');
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.element = function(node, level) {
      var att, child, i, len, name, ref, ref1, space;
      level || (level = 0);
      space = this.space(level);
      this.stream.write(space + '<' + node.name);
      ref = node.attributes;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        this.attribute(att);
      }
      if (node.children.length === 0 || node.children.every(function(e) {
        return e.value === '';
      })) {
        if (this.allowEmpty) {
          this.stream.write('></' + node.name + '>');
        } else {
          this.stream.write(this.spacebeforeslash + '/>');
        }
      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {
        this.stream.write('>');
        this.stream.write(node.children[0].value);
        this.stream.write('</' + node.name + '>');
      } else {
        this.stream.write('>' + this.newline);
        ref1 = node.children;
        for (i = 0, len = ref1.length; i < len; i++) {
          child = ref1[i];
          switch (false) {
            case !(child instanceof XMLCData):
              this.cdata(child, level + 1);
              break;
            case !(child instanceof XMLComment):
              this.comment(child, level + 1);
              break;
            case !(child instanceof XMLElement):
              this.element(child, level + 1);
              break;
            case !(child instanceof XMLRaw):
              this.raw(child, level + 1);
              break;
            case !(child instanceof XMLText):
              this.text(child, level + 1);
              break;
            case !(child instanceof XMLProcessingInstruction):
              this.processingInstruction(child, level + 1);
              break;
            default:
              throw new Error("Unknown XML node type: " + child.constructor.name);
          }
        }
        this.stream.write(space + '</' + node.name + '>');
      }
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.processingInstruction = function(node, level) {
      this.stream.write(this.space(level) + '<?' + node.target);
      if (node.value) {
        this.stream.write(' ' + node.value);
      }
      return this.stream.write(this.spacebeforeslash + '?>' + this.endline(node));
    };

    XMLStreamWriter.prototype.raw = function(node, level) {
      return this.stream.write(this.space(level) + node.value + this.endline(node));
    };

    XMLStreamWriter.prototype.text = function(node, level) {
      return this.stream.write(this.space(level) + node.value + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdAttList = function(node, level) {
      this.stream.write(this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType);
      if (node.defaultValueType !== '#DEFAULT') {
        this.stream.write(' ' + node.defaultValueType);
      }
      if (node.defaultValue) {
        this.stream.write(' "' + node.defaultValue + '"');
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdElement = function(node, level) {
      this.stream.write(this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value);
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdEntity = function(node, level) {
      this.stream.write(this.space(level) + '<!ENTITY');
      if (node.pe) {
        this.stream.write(' %');
      }
      this.stream.write(' ' + node.name);
      if (node.value) {
        this.stream.write(' "' + node.value + '"');
      } else {
        if (node.pubID && node.sysID) {
          this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
        } else if (node.sysID) {
          this.stream.write(' SYSTEM "' + node.sysID + '"');
        }
        if (node.nData) {
          this.stream.write(' NDATA ' + node.nData);
        }
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdNotation = function(node, level) {
      this.stream.write(this.space(level) + '<!NOTATION ' + node.name);
      if (node.pubID && node.sysID) {
        this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
      } else if (node.pubID) {
        this.stream.write(' PUBLIC "' + node.pubID + '"');
      } else if (node.sysID) {
        this.stream.write(' SYSTEM "' + node.sysID + '"');
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.endline = function(node) {
      if (!node.isLastRootNode) {
        return this.newline;
      } else {
        return '';
      }
    };

    return XMLStreamWriter;

  })(XMLWriterBase);

}).call(this);

},{"./XMLCData":6,"./XMLComment":7,"./XMLDTDAttList":8,"./XMLDTDElement":9,"./XMLDTDEntity":10,"./XMLDTDNotation":11,"./XMLDeclaration":12,"./XMLDocType":13,"./XMLElement":16,"./XMLProcessingInstruction":18,"./XMLRaw":19,"./XMLText":23,"./XMLWriterBase":24}],21:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLText, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLElement = require('./XMLElement');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLWriterBase = require('./XMLWriterBase');

  module.exports = XMLStringWriter = (function(superClass) {
    extend(XMLStringWriter, superClass);

    function XMLStringWriter(options) {
      XMLStringWriter.__super__.constructor.call(this, options);
    }

    XMLStringWriter.prototype.document = function(doc) {
      var child, i, len, r, ref;
      this.textispresent = false;
      r = '';
      ref = doc.children;
      for (i = 0, len = ref.length; i < len; i++) {
        child = ref[i];
        r += (function() {
          switch (false) {
            case !(child instanceof XMLDeclaration):
              return this.declaration(child);
            case !(child instanceof XMLDocType):
              return this.docType(child);
            case !(child instanceof XMLComment):
              return this.comment(child);
            case !(child instanceof XMLProcessingInstruction):
              return this.processingInstruction(child);
            default:
              return this.element(child, 0);
          }
        }).call(this);
      }
      if (this.pretty && r.slice(-this.newline.length) === this.newline) {
        r = r.slice(0, -this.newline.length);
      }
      return r;
    };

    XMLStringWriter.prototype.attribute = function(att) {
      return ' ' + att.name + '="' + att.value + '"';
    };

    XMLStringWriter.prototype.cdata = function(node, level) {
      return this.space(level) + '<![CDATA[' + node.text + ']]>' + this.newline;
    };

    XMLStringWriter.prototype.comment = function(node, level) {
      return this.space(level) + '<!-- ' + node.text + ' -->' + this.newline;
    };

    XMLStringWriter.prototype.declaration = function(node, level) {
      var r;
      r = this.space(level);
      r += '<?xml version="' + node.version + '"';
      if (node.encoding != null) {
        r += ' encoding="' + node.encoding + '"';
      }
      if (node.standalone != null) {
        r += ' standalone="' + node.standalone + '"';
      }
      r += this.spacebeforeslash + '?>';
      r += this.newline;
      return r;
    };

    XMLStringWriter.prototype.docType = function(node, level) {
      var child, i, len, r, ref;
      level || (level = 0);
      r = this.space(level);
      r += '<!DOCTYPE ' + node.root().name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      if (node.children.length > 0) {
        r += ' [';
        r += this.newline;
        ref = node.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          r += (function() {
            switch (false) {
              case !(child instanceof XMLDTDAttList):
                return this.dtdAttList(child, level + 1);
              case !(child instanceof XMLDTDElement):
                return this.dtdElement(child, level + 1);
              case !(child instanceof XMLDTDEntity):
                return this.dtdEntity(child, level + 1);
              case !(child instanceof XMLDTDNotation):
                return this.dtdNotation(child, level + 1);
              case !(child instanceof XMLCData):
                return this.cdata(child, level + 1);
              case !(child instanceof XMLComment):
                return this.comment(child, level + 1);
              case !(child instanceof XMLProcessingInstruction):
                return this.processingInstruction(child, level + 1);
              default:
                throw new Error("Unknown DTD node type: " + child.constructor.name);
            }
          }).call(this);
        }
        r += ']';
      }
      r += this.spacebeforeslash + '>';
      r += this.newline;
      return r;
    };

    XMLStringWriter.prototype.element = function(node, level) {
      var att, child, i, j, len, len1, name, r, ref, ref1, ref2, space, textispresentwasset;
      level || (level = 0);
      textispresentwasset = false;
      if (this.textispresent) {
        this.newline = '';
        this.pretty = false;
      } else {
        this.newline = this.newlinedefault;
        this.pretty = this.prettydefault;
      }
      space = this.space(level);
      r = '';
      r += space + '<' + node.name;
      ref = node.attributes;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        r += this.attribute(att);
      }
      if (node.children.length === 0 || node.children.every(function(e) {
        return e.value === '';
      })) {
        if (this.allowEmpty) {
          r += '></' + node.name + '>' + this.newline;
        } else {
          r += this.spacebeforeslash + '/>' + this.newline;
        }
      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {
        r += '>';
        r += node.children[0].value;
        r += '</' + node.name + '>' + this.newline;
      } else {
        if (this.dontprettytextnodes) {
          ref1 = node.children;
          for (i = 0, len = ref1.length; i < len; i++) {
            child = ref1[i];
            if (child.value != null) {
              this.textispresent++;
              textispresentwasset = true;
              break;
            }
          }
        }
        if (this.textispresent) {
          this.newline = '';
          this.pretty = false;
          space = this.space(level);
        }
        r += '>' + this.newline;
        ref2 = node.children;
        for (j = 0, len1 = ref2.length; j < len1; j++) {
          child = ref2[j];
          r += (function() {
            switch (false) {
              case !(child instanceof XMLCData):
                return this.cdata(child, level + 1);
              case !(child instanceof XMLComment):
                return this.comment(child, level + 1);
              case !(child instanceof XMLElement):
                return this.element(child, level + 1);
              case !(child instanceof XMLRaw):
                return this.raw(child, level + 1);
              case !(child instanceof XMLText):
                return this.text(child, level + 1);
              case !(child instanceof XMLProcessingInstruction):
                return this.processingInstruction(child, level + 1);
              default:
                throw new Error("Unknown XML node type: " + child.constructor.name);
            }
          }).call(this);
        }
        if (textispresentwasset) {
          this.textispresent--;
        }
        if (!this.textispresent) {
          this.newline = this.newlinedefault;
          this.pretty = this.prettydefault;
        }
        r += space + '</' + node.name + '>' + this.newline;
      }
      return r;
    };

    XMLStringWriter.prototype.processingInstruction = function(node, level) {
      var r;
      r = this.space(level) + '<?' + node.target;
      if (node.value) {
        r += ' ' + node.value;
      }
      r += this.spacebeforeslash + '?>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.raw = function(node, level) {
      return this.space(level) + node.value + this.newline;
    };

    XMLStringWriter.prototype.text = function(node, level) {
      return this.space(level) + node.value + this.newline;
    };

    XMLStringWriter.prototype.dtdAttList = function(node, level) {
      var r;
      r = this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType;
      if (node.defaultValueType !== '#DEFAULT') {
        r += ' ' + node.defaultValueType;
      }
      if (node.defaultValue) {
        r += ' "' + node.defaultValue + '"';
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.dtdElement = function(node, level) {
      return this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value + this.spacebeforeslash + '>' + this.newline;
    };

    XMLStringWriter.prototype.dtdEntity = function(node, level) {
      var r;
      r = this.space(level) + '<!ENTITY';
      if (node.pe) {
        r += ' %';
      }
      r += ' ' + node.name;
      if (node.value) {
        r += ' "' + node.value + '"';
      } else {
        if (node.pubID && node.sysID) {
          r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
        } else if (node.sysID) {
          r += ' SYSTEM "' + node.sysID + '"';
        }
        if (node.nData) {
          r += ' NDATA ' + node.nData;
        }
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.dtdNotation = function(node, level) {
      var r;
      r = this.space(level) + '<!NOTATION ' + node.name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.pubID) {
        r += ' PUBLIC "' + node.pubID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.openNode = function(node, level) {
      var att, name, r, ref;
      level || (level = 0);
      if (node instanceof XMLElement) {
        r = this.space(level) + '<' + node.name;
        ref = node.attributes;
        for (name in ref) {
          if (!hasProp.call(ref, name)) continue;
          att = ref[name];
          r += this.attribute(att);
        }
        r += (node.children ? '>' : '/>') + this.newline;
        return r;
      } else {
        r = this.space(level) + '<!DOCTYPE ' + node.rootNodeName;
        if (node.pubID && node.sysID) {
          r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
        } else if (node.sysID) {
          r += ' SYSTEM "' + node.sysID + '"';
        }
        r += (node.children ? ' [' : '>') + this.newline;
        return r;
      }
    };

    XMLStringWriter.prototype.closeNode = function(node, level) {
      level || (level = 0);
      switch (false) {
        case !(node instanceof XMLElement):
          return this.space(level) + '</' + node.name + '>' + this.newline;
        case !(node instanceof XMLDocType):
          return this.space(level) + ']>' + this.newline;
      }
    };

    return XMLStringWriter;

  })(XMLWriterBase);

}).call(this);

},{"./XMLCData":6,"./XMLComment":7,"./XMLDTDAttList":8,"./XMLDTDElement":9,"./XMLDTDEntity":10,"./XMLDTDNotation":11,"./XMLDeclaration":12,"./XMLDocType":13,"./XMLElement":16,"./XMLProcessingInstruction":18,"./XMLRaw":19,"./XMLText":23,"./XMLWriterBase":24}],22:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLStringifier,
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    hasProp = {}.hasOwnProperty;

  module.exports = XMLStringifier = (function() {
    function XMLStringifier(options) {
      this.assertLegalChar = bind(this.assertLegalChar, this);
      var key, ref, value;
      options || (options = {});
      this.noDoubleEncoding = options.noDoubleEncoding;
      ref = options.stringify || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this[key] = value;
      }
    }

    XMLStringifier.prototype.eleName = function(val) {
      val = '' + val || '';
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.eleText = function(val) {
      val = '' + val || '';
      return this.assertLegalChar(this.elEscape(val));
    };

    XMLStringifier.prototype.cdata = function(val) {
      val = '' + val || '';
      val = val.replace(']]>', ']]]]><![CDATA[>');
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.comment = function(val) {
      val = '' + val || '';
      if (val.match(/--/)) {
        throw new Error("Comment text cannot contain double-hypen: " + val);
      }
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.raw = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.attName = function(val) {
      return val = '' + val || '';
    };

    XMLStringifier.prototype.attValue = function(val) {
      val = '' + val || '';
      return this.attEscape(val);
    };

    XMLStringifier.prototype.insTarget = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.insValue = function(val) {
      val = '' + val || '';
      if (val.match(/\?>/)) {
        throw new Error("Invalid processing instruction value: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlVersion = function(val) {
      val = '' + val || '';
      if (!val.match(/1\.[0-9]+/)) {
        throw new Error("Invalid version number: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlEncoding = function(val) {
      val = '' + val || '';
      if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/)) {
        throw new Error("Invalid encoding: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlStandalone = function(val) {
      if (val) {
        return "yes";
      } else {
        return "no";
      }
    };

    XMLStringifier.prototype.dtdPubID = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdSysID = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdElementValue = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdAttType = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdAttDefault = function(val) {
      if (val != null) {
        return '' + val || '';
      } else {
        return val;
      }
    };

    XMLStringifier.prototype.dtdEntityValue = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdNData = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.convertAttKey = '@';

    XMLStringifier.prototype.convertPIKey = '?';

    XMLStringifier.prototype.convertTextKey = '#text';

    XMLStringifier.prototype.convertCDataKey = '#cdata';

    XMLStringifier.prototype.convertCommentKey = '#comment';

    XMLStringifier.prototype.convertRawKey = '#raw';

    XMLStringifier.prototype.assertLegalChar = function(str) {
      var res;
      res = str.match(/[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/);
      if (res) {
        throw new Error("Invalid character in string: " + str + " at index " + res.index);
      }
      return str;
    };

    XMLStringifier.prototype.elEscape = function(str) {
      var ampregex;
      ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\r/g, '&#xD;');
    };

    XMLStringifier.prototype.attEscape = function(str) {
      var ampregex;
      ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/\t/g, '&#x9;').replace(/\n/g, '&#xA;').replace(/\r/g, '&#xD;');
    };

    return XMLStringifier;

  })();

}).call(this);

},{}],23:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLText,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLText = (function(superClass) {
    extend(XMLText, superClass);

    function XMLText(parent, text) {
      XMLText.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing element text");
      }
      this.value = this.stringify.eleText(text);
    }

    XMLText.prototype.clone = function() {
      return Object.create(this);
    };

    XMLText.prototype.toString = function(options) {
      return this.options.writer.set(options).text(this);
    };

    return XMLText;

  })(XMLNode);

}).call(this);

},{"./XMLNode":17}],24:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLWriterBase,
    hasProp = {}.hasOwnProperty;

  module.exports = XMLWriterBase = (function() {
    function XMLWriterBase(options) {
      var key, ref, ref1, ref2, ref3, ref4, ref5, ref6, value;
      options || (options = {});
      this.pretty = options.pretty || false;
      this.allowEmpty = (ref = options.allowEmpty) != null ? ref : false;
      if (this.pretty) {
        this.indent = (ref1 = options.indent) != null ? ref1 : '  ';
        this.newline = (ref2 = options.newline) != null ? ref2 : '\n';
        this.offset = (ref3 = options.offset) != null ? ref3 : 0;
        this.dontprettytextnodes = (ref4 = options.dontprettytextnodes) != null ? ref4 : 0;
      } else {
        this.indent = '';
        this.newline = '';
        this.offset = 0;
        this.dontprettytextnodes = 0;
      }
      this.spacebeforeslash = (ref5 = options.spacebeforeslash) != null ? ref5 : '';
      if (this.spacebeforeslash === true) {
        this.spacebeforeslash = ' ';
      }
      this.newlinedefault = this.newline;
      this.prettydefault = this.pretty;
      ref6 = options.writer || {};
      for (key in ref6) {
        if (!hasProp.call(ref6, key)) continue;
        value = ref6[key];
        this[key] = value;
      }
    }

    XMLWriterBase.prototype.set = function(options) {
      var key, ref, value;
      options || (options = {});
      if ("pretty" in options) {
        this.pretty = options.pretty;
      }
      if ("allowEmpty" in options) {
        this.allowEmpty = options.allowEmpty;
      }
      if (this.pretty) {
        this.indent = "indent" in options ? options.indent : '  ';
        this.newline = "newline" in options ? options.newline : '\n';
        this.offset = "offset" in options ? options.offset : 0;
        this.dontprettytextnodes = "dontprettytextnodes" in options ? options.dontprettytextnodes : 0;
      } else {
        this.indent = '';
        this.newline = '';
        this.offset = 0;
        this.dontprettytextnodes = 0;
      }
      this.spacebeforeslash = "spacebeforeslash" in options ? options.spacebeforeslash : '';
      if (this.spacebeforeslash === true) {
        this.spacebeforeslash = ' ';
      }
      this.newlinedefault = this.newline;
      this.prettydefault = this.pretty;
      ref = options.writer || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this[key] = value;
      }
      return this;
    };

    XMLWriterBase.prototype.space = function(level) {
      var indent;
      if (this.pretty) {
        indent = (level || 0) + this.offset + 1;
        if (indent > 0) {
          return new Array(indent).join(this.indent);
        } else {
          return '';
        }
      } else {
        return '';
      }
    };

    return XMLWriterBase;

  })();

}).call(this);

},{}],25:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDocument, XMLDocumentCB, XMLStreamWriter, XMLStringWriter, assign, isFunction, ref;

  ref = require('./Utility'), assign = ref.assign, isFunction = ref.isFunction;

  XMLDocument = require('./XMLDocument');

  XMLDocumentCB = require('./XMLDocumentCB');

  XMLStringWriter = require('./XMLStringWriter');

  XMLStreamWriter = require('./XMLStreamWriter');

  module.exports.create = function(name, xmldec, doctype, options) {
    var doc, root;
    if (name == null) {
      throw new Error("Root element needs a name");
    }
    options = assign({}, xmldec, doctype, options);
    doc = new XMLDocument(options);
    root = doc.element(name);
    if (!options.headless) {
      doc.declaration(options);
      if ((options.pubID != null) || (options.sysID != null)) {
        doc.doctype(options);
      }
    }
    return root;
  };

  module.exports.begin = function(options, onData, onEnd) {
    var ref1;
    if (isFunction(options)) {
      ref1 = [options, onData], onData = ref1[0], onEnd = ref1[1];
      options = {};
    }
    if (onData) {
      return new XMLDocumentCB(options, onData, onEnd);
    } else {
      return new XMLDocument(options);
    }
  };

  module.exports.stringWriter = function(options) {
    return new XMLStringWriter(options);
  };

  module.exports.streamWriter = function(stream, options) {
    return new XMLStreamWriter(stream, options);
  };

}).call(this);

},{"./Utility":4,"./XMLDocument":14,"./XMLDocumentCB":15,"./XMLStreamWriter":20,"./XMLStringWriter":21}]},{},[1])(1)
});
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.plist = f()}})(function(){var define,module,exports;return (function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(require,module,exports){
(function (Buffer){
/**
 * Module dependencies.
 */

var DOMParser = require('xmldom').DOMParser;

/**
 * Module exports.
 */

exports.parse = parse;

var TEXT_NODE = 3;
var CDATA_NODE = 4;
var COMMENT_NODE = 8;


/**
 * We ignore raw text (usually whitespace), <!-- xml comments -->,
 * and raw CDATA nodes.
 *
 * @param {Element} node
 * @returns {Boolean}
 * @api private
 */

function shouldIgnoreNode (node) {
  return node.nodeType === TEXT_NODE
    || node.nodeType === COMMENT_NODE
    || node.nodeType === CDATA_NODE;
}

/**
 * Check if the node is empty. Some plist file has such node:
 * <key />
 * this node shoud be ignored.
 *
 * @see https://github.com/TooTallNate/plist.js/issues/66
 * @param {Element} node
 * @returns {Boolean}
 * @api private
 */
function isEmptyNode(node){
  if(!node.childNodes || node.childNodes.length === 0) {
    return true;
  } else {
    return false;
  }
}

function invariant(test, message) {
  if (!test) {
    throw new Error(message);
  }
}

/**
 * Parses a Plist XML string. Returns an Object.
 *
 * @param {String} xml - the XML String to decode
 * @returns {Mixed} the decoded value from the Plist XML
 * @api public
 */

function parse (xml) {
  var doc = new DOMParser().parseFromString(xml);
  invariant(
    doc.documentElement.nodeName === 'plist',
    'malformed document. First element should be <plist>'
  );
  var plist = parsePlistXML(doc.documentElement);

  // the root <plist> node gets interpreted as an Array,
  // so pull out the inner data first
  if (plist.length == 1) plist = plist[0];

  return plist;
}

/**
 * Convert an XML based plist document into a JSON representation.
 *
 * @param {Object} xml_node - current XML node in the plist
 * @returns {Mixed} built up JSON object
 * @api private
 */

function parsePlistXML (node) {
  var i, new_obj, key, val, new_arr, res, counter, type;

  if (!node)
    return null;

  if (node.nodeName === 'plist') {
    new_arr = [];
    if (isEmptyNode(node)) {
      return new_arr;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (!shouldIgnoreNode(node.childNodes[i])) {
        new_arr.push( parsePlistXML(node.childNodes[i]));
      }
    }
    return new_arr;
  } else if (node.nodeName === 'dict') {
    new_obj = {};
    key = null;
    counter = 0;
    if (isEmptyNode(node)) {
      return new_obj;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (shouldIgnoreNode(node.childNodes[i])) continue;
      if (counter % 2 === 0) {
        invariant(
          node.childNodes[i].nodeName === 'key',
          'Missing key while parsing <dict/>.'
        );
        key = parsePlistXML(node.childNodes[i]);
      } else {
        invariant(
          node.childNodes[i].nodeName !== 'key',
          'Unexpected key "'
            + parsePlistXML(node.childNodes[i])
            + '" while parsing <dict/>.'
        );
        new_obj[key] = parsePlistXML(node.childNodes[i]);
      }
      counter += 1;
    }
    if (counter % 2 === 1) {
      throw new Error('Missing value for "' + key + '" while parsing <dict/>');
    }
    return new_obj;

  } else if (node.nodeName === 'array') {
    new_arr = [];
    if (isEmptyNode(node)) {
      return new_arr;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (!shouldIgnoreNode(node.childNodes[i])) {
        res = parsePlistXML(node.childNodes[i]);
        if (null != res) new_arr.push(res);
      }
    }
    return new_arr;

  } else if (node.nodeName === '#text') {
    // TODO: what should we do with text types? (CDATA sections)

  } else if (node.nodeName === 'key') {
    if (isEmptyNode(node)) {
      return '';
    }
    return node.childNodes[0].nodeValue;
  } else if (node.nodeName === 'string') {
    res = '';
    if (isEmptyNode(node)) {
      return res;
    }
    for (i=0; i < node.childNodes.length; i++) {
      var type = node.childNodes[i].nodeType;
      if (type === TEXT_NODE || type === CDATA_NODE) {
        res += node.childNodes[i].nodeValue;
      }
    }
    return res;

  } else if (node.nodeName === 'integer') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as integer.'
    );
    return parseInt(node.childNodes[0].nodeValue, 10);

  } else if (node.nodeName === 'real') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as real.'
    );
    res = '';
    for (i=0; i < node.childNodes.length; i++) {
      if (node.childNodes[i].nodeType === TEXT_NODE) {
        res += node.childNodes[i].nodeValue;
      }
    }
    return parseFloat(res);

  } else if (node.nodeName === 'data') {
    res = '';
    if (isEmptyNode(node)) {
      return Buffer.from(res, 'base64');
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (node.childNodes[i].nodeType === TEXT_NODE) {
        res += node.childNodes[i].nodeValue.replace(/\s+/g, '');
      }
    }
    return Buffer.from(res, 'base64');

  } else if (node.nodeName === 'date') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as Date.'
    )
    return new Date(node.childNodes[0].nodeValue);

  } else if (node.nodeName === 'true') {
    return true;

  } else if (node.nodeName === 'false') {
    return false;
  }
}

}).call(this,require("buffer").Buffer)
},{"buffer":3,"xmldom":5}],2:[function(require,module,exports){
'use strict'

exports.byteLength = byteLength
exports.toByteArray = toByteArray
exports.fromByteArray = fromByteArray

var lookup = []
var revLookup = []
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array

var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, len = code.length; i < len; ++i) {
  lookup[i] = code[i]
  revLookup[code.charCodeAt(i)] = i
}

// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
revLookup['-'.charCodeAt(0)] = 62
revLookup['_'.charCodeAt(0)] = 63

function placeHoldersCount (b64) {
  var len = b64.length
  if (len % 4 > 0) {
    throw new Error('Invalid string. Length must be a multiple of 4')
  }

  // the number of equal signs (place holders)
  // if there are two placeholders, than the two characters before it
  // represent one byte
  // if there is only one, then the three characters before it represent 2 bytes
  // this is just a cheap hack to not do indexOf twice
  return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
}

function byteLength (b64) {
  // base64 is 4/3 + up to two characters of the original data
  return (b64.length * 3 / 4) - placeHoldersCount(b64)
}

function toByteArray (b64) {
  var i, l, tmp, placeHolders, arr
  var len = b64.length
  placeHolders = placeHoldersCount(b64)

  arr = new Arr((len * 3 / 4) - placeHolders)

  // if there are placeholders, only get up to the last complete 4 chars
  l = placeHolders > 0 ? len - 4 : len

  var L = 0

  for (i = 0; i < l; i += 4) {
    tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
    arr[L++] = (tmp >> 16) & 0xFF
    arr[L++] = (tmp >> 8) & 0xFF
    arr[L++] = tmp & 0xFF
  }

  if (placeHolders === 2) {
    tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
    arr[L++] = tmp & 0xFF
  } else if (placeHolders === 1) {
    tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
    arr[L++] = (tmp >> 8) & 0xFF
    arr[L++] = tmp & 0xFF
  }

  return arr
}

function tripletToBase64 (num) {
  return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
}

function encodeChunk (uint8, start, end) {
  var tmp
  var output = []
  for (var i = start; i < end; i += 3) {
    tmp = ((uint8[i] << 16) & 0xFF0000) + ((uint8[i + 1] << 8) & 0xFF00) + (uint8[i + 2] & 0xFF)
    output.push(tripletToBase64(tmp))
  }
  return output.join('')
}

function fromByteArray (uint8) {
  var tmp
  var len = uint8.length
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  var output = ''
  var parts = []
  var maxChunkLength = 16383 // must be multiple of 3

  // go through the array every three bytes, we'll deal with trailing stuff later
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
  }

  // pad the end with zeros, but make sure to not forget the extra bytes
  if (extraBytes === 1) {
    tmp = uint8[len - 1]
    output += lookup[tmp >> 2]
    output += lookup[(tmp << 4) & 0x3F]
    output += '=='
  } else if (extraBytes === 2) {
    tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
    output += lookup[tmp >> 10]
    output += lookup[(tmp >> 4) & 0x3F]
    output += lookup[(tmp << 2) & 0x3F]
    output += '='
  }

  parts.push(output)

  return parts.join('')
}

},{}],3:[function(require,module,exports){
/*!
 * The buffer module from node.js, for the browser.
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */
/* eslint-disable no-proto */

'use strict'

var base64 = require('base64-js')
var ieee754 = require('ieee754')

exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50

var K_MAX_LENGTH = 0x7fffffff
exports.kMaxLength = K_MAX_LENGTH

/**
 * If `Buffer.TYPED_ARRAY_SUPPORT`:
 *   === true    Use Uint8Array implementation (fastest)
 *   === false   Print warning and recommend using `buffer` v4.x which has an Object
 *               implementation (most compatible, even IE6)
 *
 * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
 * Opera 11.6+, iOS 4.2+.
 *
 * We report that the browser does not support typed arrays if the are not subclassable
 * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
 * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
 * for __proto__ and has a buggy typed array implementation.
 */
Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()

if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
    typeof console.error === 'function') {
  console.error(
    'This browser lacks typed array (Uint8Array) support which is required by ' +
    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
  )
}

function typedArraySupport () {
  // Can typed array instances can be augmented?
  try {
    var arr = new Uint8Array(1)
    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
    return arr.foo() === 42
  } catch (e) {
    return false
  }
}

Object.defineProperty(Buffer.prototype, 'parent', {
  get: function () {
    if (!(this instanceof Buffer)) {
      return undefined
    }
    return this.buffer
  }
})

Object.defineProperty(Buffer.prototype, 'offset', {
  get: function () {
    if (!(this instanceof Buffer)) {
      return undefined
    }
    return this.byteOffset
  }
})

function createBuffer (length) {
  if (length > K_MAX_LENGTH) {
    throw new RangeError('Invalid typed array length')
  }
  // Return an augmented `Uint8Array` instance
  var buf = new Uint8Array(length)
  buf.__proto__ = Buffer.prototype
  return buf
}

/**
 * The Buffer constructor returns instances of `Uint8Array` that have their
 * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
 * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
 * and the `Uint8Array` methods. Square bracket notation works as expected -- it
 * returns a single octet.
 *
 * The `Uint8Array` prototype remains unmodified.
 */

function Buffer (arg, encodingOrOffset, length) {
  // Common case.
  if (typeof arg === 'number') {
    if (typeof encodingOrOffset === 'string') {
      throw new Error(
        'If encoding is specified then the first argument must be a string'
      )
    }
    return allocUnsafe(arg)
  }
  return from(arg, encodingOrOffset, length)
}

// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
if (typeof Symbol !== 'undefined' && Symbol.species &&
    Buffer[Symbol.species] === Buffer) {
  Object.defineProperty(Buffer, Symbol.species, {
    value: null,
    configurable: true,
    enumerable: false,
    writable: false
  })
}

Buffer.poolSize = 8192 // not used by this implementation

function from (value, encodingOrOffset, length) {
  if (typeof value === 'number') {
    throw new TypeError('"value" argument must not be a number')
  }

  if (isArrayBuffer(value) || (value && isArrayBuffer(value.buffer))) {
    return fromArrayBuffer(value, encodingOrOffset, length)
  }

  if (typeof value === 'string') {
    return fromString(value, encodingOrOffset)
  }

  return fromObject(value)
}

/**
 * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
 * if value is a number.
 * Buffer.from(str[, encoding])
 * Buffer.from(array)
 * Buffer.from(buffer)
 * Buffer.from(arrayBuffer[, byteOffset[, length]])
 **/
Buffer.from = function (value, encodingOrOffset, length) {
  return from(value, encodingOrOffset, length)
}

// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
// https://github.com/feross/buffer/pull/148
Buffer.prototype.__proto__ = Uint8Array.prototype
Buffer.__proto__ = Uint8Array

function assertSize (size) {
  if (typeof size !== 'number') {
    throw new TypeError('"size" argument must be of type number')
  } else if (size < 0) {
    throw new RangeError('"size" argument must not be negative')
  }
}

function alloc (size, fill, encoding) {
  assertSize(size)
  if (size <= 0) {
    return createBuffer(size)
  }
  if (fill !== undefined) {
    // Only pay attention to encoding if it's a string. This
    // prevents accidentally sending in a number that would
    // be interpretted as a start offset.
    return typeof encoding === 'string'
      ? createBuffer(size).fill(fill, encoding)
      : createBuffer(size).fill(fill)
  }
  return createBuffer(size)
}

/**
 * Creates a new filled Buffer instance.
 * alloc(size[, fill[, encoding]])
 **/
Buffer.alloc = function (size, fill, encoding) {
  return alloc(size, fill, encoding)
}

function allocUnsafe (size) {
  assertSize(size)
  return createBuffer(size < 0 ? 0 : checked(size) | 0)
}

/**
 * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
 * */
Buffer.allocUnsafe = function (size) {
  return allocUnsafe(size)
}
/**
 * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
 */
Buffer.allocUnsafeSlow = function (size) {
  return allocUnsafe(size)
}

function fromString (string, encoding) {
  if (typeof encoding !== 'string' || encoding === '') {
    encoding = 'utf8'
  }

  if (!Buffer.isEncoding(encoding)) {
    throw new TypeError('Unknown encoding: ' + encoding)
  }

  var length = byteLength(string, encoding) | 0
  var buf = createBuffer(length)

  var actual = buf.write(string, encoding)

  if (actual !== length) {
    // Writing a hex string, for example, that contains invalid characters will
    // cause everything after the first invalid character to be ignored. (e.g.
    // 'abxxcd' will be treated as 'ab')
    buf = buf.slice(0, actual)
  }

  return buf
}

function fromArrayLike (array) {
  var length = array.length < 0 ? 0 : checked(array.length) | 0
  var buf = createBuffer(length)
  for (var i = 0; i < length; i += 1) {
    buf[i] = array[i] & 255
  }
  return buf
}

function fromArrayBuffer (array, byteOffset, length) {
  if (byteOffset < 0 || array.byteLength < byteOffset) {
    throw new RangeError('"offset" is outside of buffer bounds')
  }

  if (array.byteLength < byteOffset + (length || 0)) {
    throw new RangeError('"length" is outside of buffer bounds')
  }

  var buf
  if (byteOffset === undefined && length === undefined) {
    buf = new Uint8Array(array)
  } else if (length === undefined) {
    buf = new Uint8Array(array, byteOffset)
  } else {
    buf = new Uint8Array(array, byteOffset, length)
  }

  // Return an augmented `Uint8Array` instance
  buf.__proto__ = Buffer.prototype
  return buf
}

function fromObject (obj) {
  if (Buffer.isBuffer(obj)) {
    var len = checked(obj.length) | 0
    var buf = createBuffer(len)

    if (buf.length === 0) {
      return buf
    }

    obj.copy(buf, 0, 0, len)
    return buf
  }

  if (obj) {
    if (ArrayBuffer.isView(obj) || 'length' in obj) {
      if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
        return createBuffer(0)
      }
      return fromArrayLike(obj)
    }

    if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
      return fromArrayLike(obj.data)
    }
  }

  throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object.')
}

function checked (length) {
  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
  // length is NaN (which is otherwise coerced to zero.)
  if (length >= K_MAX_LENGTH) {
    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
  }
  return length | 0
}

function SlowBuffer (length) {
  if (+length != length) { // eslint-disable-line eqeqeq
    length = 0
  }
  return Buffer.alloc(+length)
}

Buffer.isBuffer = function isBuffer (b) {
  return b != null && b._isBuffer === true
}

Buffer.compare = function compare (a, b) {
  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
    throw new TypeError('Arguments must be Buffers')
  }

  if (a === b) return 0

  var x = a.length
  var y = b.length

  for (var i = 0, len = Math.min(x, y); i < len; ++i) {
    if (a[i] !== b[i]) {
      x = a[i]
      y = b[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

Buffer.isEncoding = function isEncoding (encoding) {
  switch (String(encoding).toLowerCase()) {
    case 'hex':
    case 'utf8':
    case 'utf-8':
    case 'ascii':
    case 'latin1':
    case 'binary':
    case 'base64':
    case 'ucs2':
    case 'ucs-2':
    case 'utf16le':
    case 'utf-16le':
      return true
    default:
      return false
  }
}

Buffer.concat = function concat (list, length) {
  if (!Array.isArray(list)) {
    throw new TypeError('"list" argument must be an Array of Buffers')
  }

  if (list.length === 0) {
    return Buffer.alloc(0)
  }

  var i
  if (length === undefined) {
    length = 0
    for (i = 0; i < list.length; ++i) {
      length += list[i].length
    }
  }

  var buffer = Buffer.allocUnsafe(length)
  var pos = 0
  for (i = 0; i < list.length; ++i) {
    var buf = list[i]
    if (ArrayBuffer.isView(buf)) {
      buf = Buffer.from(buf)
    }
    if (!Buffer.isBuffer(buf)) {
      throw new TypeError('"list" argument must be an Array of Buffers')
    }
    buf.copy(buffer, pos)
    pos += buf.length
  }
  return buffer
}

function byteLength (string, encoding) {
  if (Buffer.isBuffer(string)) {
    return string.length
  }
  if (ArrayBuffer.isView(string) || isArrayBuffer(string)) {
    return string.byteLength
  }
  if (typeof string !== 'string') {
    string = '' + string
  }

  var len = string.length
  if (len === 0) return 0

  // Use a for loop to avoid recursion
  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'ascii':
      case 'latin1':
      case 'binary':
        return len
      case 'utf8':
      case 'utf-8':
      case undefined:
        return utf8ToBytes(string).length
      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return len * 2
      case 'hex':
        return len >>> 1
      case 'base64':
        return base64ToBytes(string).length
      default:
        if (loweredCase) return utf8ToBytes(string).length // assume utf8
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}
Buffer.byteLength = byteLength

function slowToString (encoding, start, end) {
  var loweredCase = false

  // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
  // property of a typed array.

  // This behaves neither like String nor Uint8Array in that we set start/end
  // to their upper/lower bounds if the value passed is out of range.
  // undefined is handled specially as per ECMA-262 6th Edition,
  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
  if (start === undefined || start < 0) {
    start = 0
  }
  // Return early if start > this.length. Done here to prevent potential uint32
  // coercion fail below.
  if (start > this.length) {
    return ''
  }

  if (end === undefined || end > this.length) {
    end = this.length
  }

  if (end <= 0) {
    return ''
  }

  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
  end >>>= 0
  start >>>= 0

  if (end <= start) {
    return ''
  }

  if (!encoding) encoding = 'utf8'

  while (true) {
    switch (encoding) {
      case 'hex':
        return hexSlice(this, start, end)

      case 'utf8':
      case 'utf-8':
        return utf8Slice(this, start, end)

      case 'ascii':
        return asciiSlice(this, start, end)

      case 'latin1':
      case 'binary':
        return latin1Slice(this, start, end)

      case 'base64':
        return base64Slice(this, start, end)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return utf16leSlice(this, start, end)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = (encoding + '').toLowerCase()
        loweredCase = true
    }
  }
}

// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
// reliably in a browserify context because there could be multiple different
// copies of the 'buffer' package in use. This method works even for Buffer
// instances that were created from another copy of the `buffer` package.
// See: https://github.com/feross/buffer/issues/154
Buffer.prototype._isBuffer = true

function swap (b, n, m) {
  var i = b[n]
  b[n] = b[m]
  b[m] = i
}

Buffer.prototype.swap16 = function swap16 () {
  var len = this.length
  if (len % 2 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 16-bits')
  }
  for (var i = 0; i < len; i += 2) {
    swap(this, i, i + 1)
  }
  return this
}

Buffer.prototype.swap32 = function swap32 () {
  var len = this.length
  if (len % 4 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 32-bits')
  }
  for (var i = 0; i < len; i += 4) {
    swap(this, i, i + 3)
    swap(this, i + 1, i + 2)
  }
  return this
}

Buffer.prototype.swap64 = function swap64 () {
  var len = this.length
  if (len % 8 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 64-bits')
  }
  for (var i = 0; i < len; i += 8) {
    swap(this, i, i + 7)
    swap(this, i + 1, i + 6)
    swap(this, i + 2, i + 5)
    swap(this, i + 3, i + 4)
  }
  return this
}

Buffer.prototype.toString = function toString () {
  var length = this.length
  if (length === 0) return ''
  if (arguments.length === 0) return utf8Slice(this, 0, length)
  return slowToString.apply(this, arguments)
}

Buffer.prototype.toLocaleString = Buffer.prototype.toString

Buffer.prototype.equals = function equals (b) {
  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
  if (this === b) return true
  return Buffer.compare(this, b) === 0
}

Buffer.prototype.inspect = function inspect () {
  var str = ''
  var max = exports.INSPECT_MAX_BYTES
  if (this.length > 0) {
    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
    if (this.length > max) str += ' ... '
  }
  return '<Buffer ' + str + '>'
}

Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
  if (!Buffer.isBuffer(target)) {
    throw new TypeError('Argument must be a Buffer')
  }

  if (start === undefined) {
    start = 0
  }
  if (end === undefined) {
    end = target ? target.length : 0
  }
  if (thisStart === undefined) {
    thisStart = 0
  }
  if (thisEnd === undefined) {
    thisEnd = this.length
  }

  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
    throw new RangeError('out of range index')
  }

  if (thisStart >= thisEnd && start >= end) {
    return 0
  }
  if (thisStart >= thisEnd) {
    return -1
  }
  if (start >= end) {
    return 1
  }

  start >>>= 0
  end >>>= 0
  thisStart >>>= 0
  thisEnd >>>= 0

  if (this === target) return 0

  var x = thisEnd - thisStart
  var y = end - start
  var len = Math.min(x, y)

  var thisCopy = this.slice(thisStart, thisEnd)
  var targetCopy = target.slice(start, end)

  for (var i = 0; i < len; ++i) {
    if (thisCopy[i] !== targetCopy[i]) {
      x = thisCopy[i]
      y = targetCopy[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
//
// Arguments:
// - buffer - a Buffer to search
// - val - a string, Buffer, or number
// - byteOffset - an index into `buffer`; will be clamped to an int32
// - encoding - an optional encoding, relevant is val is a string
// - dir - true for indexOf, false for lastIndexOf
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  // Empty buffer means no match
  if (buffer.length === 0) return -1

  // Normalize byteOffset
  if (typeof byteOffset === 'string') {
    encoding = byteOffset
    byteOffset = 0
  } else if (byteOffset > 0x7fffffff) {
    byteOffset = 0x7fffffff
  } else if (byteOffset < -0x80000000) {
    byteOffset = -0x80000000
  }
  byteOffset = +byteOffset  // Coerce to Number.
  if (numberIsNaN(byteOffset)) {
    // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
    byteOffset = dir ? 0 : (buffer.length - 1)
  }

  // Normalize byteOffset: negative offsets start from the end of the buffer
  if (byteOffset < 0) byteOffset = buffer.length + byteOffset
  if (byteOffset >= buffer.length) {
    if (dir) return -1
    else byteOffset = buffer.length - 1
  } else if (byteOffset < 0) {
    if (dir) byteOffset = 0
    else return -1
  }

  // Normalize val
  if (typeof val === 'string') {
    val = Buffer.from(val, encoding)
  }

  // Finally, search either indexOf (if dir is true) or lastIndexOf
  if (Buffer.isBuffer(val)) {
    // Special case: looking for empty string/buffer always fails
    if (val.length === 0) {
      return -1
    }
    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
  } else if (typeof val === 'number') {
    val = val & 0xFF // Search for a byte value [0-255]
    if (typeof Uint8Array.prototype.indexOf === 'function') {
      if (dir) {
        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
      } else {
        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
      }
    }
    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
  }

  throw new TypeError('val must be string, number or Buffer')
}

function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  var indexSize = 1
  var arrLength = arr.length
  var valLength = val.length

  if (encoding !== undefined) {
    encoding = String(encoding).toLowerCase()
    if (encoding === 'ucs2' || encoding === 'ucs-2' ||
        encoding === 'utf16le' || encoding === 'utf-16le') {
      if (arr.length < 2 || val.length < 2) {
        return -1
      }
      indexSize = 2
      arrLength /= 2
      valLength /= 2
      byteOffset /= 2
    }
  }

  function read (buf, i) {
    if (indexSize === 1) {
      return buf[i]
    } else {
      return buf.readUInt16BE(i * indexSize)
    }
  }

  var i
  if (dir) {
    var foundIndex = -1
    for (i = byteOffset; i < arrLength; i++) {
      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
        if (foundIndex === -1) foundIndex = i
        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
      } else {
        if (foundIndex !== -1) i -= i - foundIndex
        foundIndex = -1
      }
    }
  } else {
    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
    for (i = byteOffset; i >= 0; i--) {
      var found = true
      for (var j = 0; j < valLength; j++) {
        if (read(arr, i + j) !== read(val, j)) {
          found = false
          break
        }
      }
      if (found) return i
    }
  }

  return -1
}

Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
  return this.indexOf(val, byteOffset, encoding) !== -1
}

Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
}

Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
}

function hexWrite (buf, string, offset, length) {
  offset = Number(offset) || 0
  var remaining = buf.length - offset
  if (!length) {
    length = remaining
  } else {
    length = Number(length)
    if (length > remaining) {
      length = remaining
    }
  }

  var strLen = string.length

  if (length > strLen / 2) {
    length = strLen / 2
  }
  for (var i = 0; i < length; ++i) {
    var parsed = parseInt(string.substr(i * 2, 2), 16)
    if (numberIsNaN(parsed)) return i
    buf[offset + i] = parsed
  }
  return i
}

function utf8Write (buf, string, offset, length) {
  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}

function asciiWrite (buf, string, offset, length) {
  return blitBuffer(asciiToBytes(string), buf, offset, length)
}

function latin1Write (buf, string, offset, length) {
  return asciiWrite(buf, string, offset, length)
}

function base64Write (buf, string, offset, length) {
  return blitBuffer(base64ToBytes(string), buf, offset, length)
}

function ucs2Write (buf, string, offset, length) {
  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}

Buffer.prototype.write = function write (string, offset, length, encoding) {
  // Buffer#write(string)
  if (offset === undefined) {
    encoding = 'utf8'
    length = this.length
    offset = 0
  // Buffer#write(string, encoding)
  } else if (length === undefined && typeof offset === 'string') {
    encoding = offset
    length = this.length
    offset = 0
  // Buffer#write(string, offset[, length][, encoding])
  } else if (isFinite(offset)) {
    offset = offset >>> 0
    if (isFinite(length)) {
      length = length >>> 0
      if (encoding === undefined) encoding = 'utf8'
    } else {
      encoding = length
      length = undefined
    }
  } else {
    throw new Error(
      'Buffer.write(string, encoding, offset[, length]) is no longer supported'
    )
  }

  var remaining = this.length - offset
  if (length === undefined || length > remaining) length = remaining

  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
    throw new RangeError('Attempt to write outside buffer bounds')
  }

  if (!encoding) encoding = 'utf8'

  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'hex':
        return hexWrite(this, string, offset, length)

      case 'utf8':
      case 'utf-8':
        return utf8Write(this, string, offset, length)

      case 'ascii':
        return asciiWrite(this, string, offset, length)

      case 'latin1':
      case 'binary':
        return latin1Write(this, string, offset, length)

      case 'base64':
        // Warning: maxLength not taken into account in base64Write
        return base64Write(this, string, offset, length)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return ucs2Write(this, string, offset, length)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}

Buffer.prototype.toJSON = function toJSON () {
  return {
    type: 'Buffer',
    data: Array.prototype.slice.call(this._arr || this, 0)
  }
}

function base64Slice (buf, start, end) {
  if (start === 0 && end === buf.length) {
    return base64.fromByteArray(buf)
  } else {
    return base64.fromByteArray(buf.slice(start, end))
  }
}

function utf8Slice (buf, start, end) {
  end = Math.min(buf.length, end)
  var res = []

  var i = start
  while (i < end) {
    var firstByte = buf[i]
    var codePoint = null
    var bytesPerSequence = (firstByte > 0xEF) ? 4
      : (firstByte > 0xDF) ? 3
      : (firstByte > 0xBF) ? 2
      : 1

    if (i + bytesPerSequence <= end) {
      var secondByte, thirdByte, fourthByte, tempCodePoint

      switch (bytesPerSequence) {
        case 1:
          if (firstByte < 0x80) {
            codePoint = firstByte
          }
          break
        case 2:
          secondByte = buf[i + 1]
          if ((secondByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
            if (tempCodePoint > 0x7F) {
              codePoint = tempCodePoint
            }
          }
          break
        case 3:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
              codePoint = tempCodePoint
            }
          }
          break
        case 4:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          fourthByte = buf[i + 3]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
              codePoint = tempCodePoint
            }
          }
      }
    }

    if (codePoint === null) {
      // we did not generate a valid codePoint so insert a
      // replacement char (U+FFFD) and advance only 1 byte
      codePoint = 0xFFFD
      bytesPerSequence = 1
    } else if (codePoint > 0xFFFF) {
      // encode to utf16 (surrogate pair dance)
      codePoint -= 0x10000
      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
      codePoint = 0xDC00 | codePoint & 0x3FF
    }

    res.push(codePoint)
    i += bytesPerSequence
  }

  return decodeCodePointsArray(res)
}

// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000

function decodeCodePointsArray (codePoints) {
  var len = codePoints.length
  if (len <= MAX_ARGUMENTS_LENGTH) {
    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
  }

  // Decode in chunks to avoid "call stack size exceeded".
  var res = ''
  var i = 0
  while (i < len) {
    res += String.fromCharCode.apply(
      String,
      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
    )
  }
  return res
}

function asciiSlice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i] & 0x7F)
  }
  return ret
}

function latin1Slice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i])
  }
  return ret
}

function hexSlice (buf, start, end) {
  var len = buf.length

  if (!start || start < 0) start = 0
  if (!end || end < 0 || end > len) end = len

  var out = ''
  for (var i = start; i < end; ++i) {
    out += toHex(buf[i])
  }
  return out
}

function utf16leSlice (buf, start, end) {
  var bytes = buf.slice(start, end)
  var res = ''
  for (var i = 0; i < bytes.length; i += 2) {
    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
  }
  return res
}

Buffer.prototype.slice = function slice (start, end) {
  var len = this.length
  start = ~~start
  end = end === undefined ? len : ~~end

  if (start < 0) {
    start += len
    if (start < 0) start = 0
  } else if (start > len) {
    start = len
  }

  if (end < 0) {
    end += len
    if (end < 0) end = 0
  } else if (end > len) {
    end = len
  }

  if (end < start) end = start

  var newBuf = this.subarray(start, end)
  // Return an augmented `Uint8Array` instance
  newBuf.__proto__ = Buffer.prototype
  return newBuf
}

/*
 * Need to make sure that buffer isn't trying to write out of bounds.
 */
function checkOffset (offset, ext, length) {
  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}

Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }

  return val
}

Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    checkOffset(offset, byteLength, this.length)
  }

  var val = this[offset + --byteLength]
  var mul = 1
  while (byteLength > 0 && (mul *= 0x100)) {
    val += this[offset + --byteLength] * mul
  }

  return val
}

Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  return this[offset]
}

Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return this[offset] | (this[offset + 1] << 8)
}

Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return (this[offset] << 8) | this[offset + 1]
}

Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return ((this[offset]) |
      (this[offset + 1] << 8) |
      (this[offset + 2] << 16)) +
      (this[offset + 3] * 0x1000000)
}

Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] * 0x1000000) +
    ((this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    this[offset + 3])
}

Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var i = byteLength
  var mul = 1
  var val = this[offset + --i]
  while (i > 0 && (mul *= 0x100)) {
    val += this[offset + --i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  if (!(this[offset] & 0x80)) return (this[offset])
  return ((0xff - this[offset] + 1) * -1)
}

Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset] | (this[offset + 1] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset + 1] | (this[offset] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset]) |
    (this[offset + 1] << 8) |
    (this[offset + 2] << 16) |
    (this[offset + 3] << 24)
}

Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] << 24) |
    (this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    (this[offset + 3])
}

Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, true, 23, 4)
}

Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, false, 23, 4)
}

Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, true, 52, 8)
}

Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, false, 52, 8)
}

function checkInt (buf, value, offset, ext, max, min) {
  if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
  if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
}

Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var mul = 1
  var i = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var i = byteLength - 1
  var mul = 1
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset + 3] = (value >>> 24)
  this[offset + 2] = (value >>> 16)
  this[offset + 1] = (value >>> 8)
  this[offset] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = 0
  var mul = 1
  var sub = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = byteLength - 1
  var mul = 1
  var sub = 0
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
  if (value < 0) value = 0xff + value + 1
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  this[offset + 2] = (value >>> 16)
  this[offset + 3] = (value >>> 24)
  return offset + 4
}

Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  if (value < 0) value = 0xffffffff + value + 1
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

function checkIEEE754 (buf, value, offset, ext, max, min) {
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
  if (offset < 0) throw new RangeError('Index out of range')
}

function writeFloat (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
  }
  ieee754.write(buf, value, offset, littleEndian, 23, 4)
  return offset + 4
}

Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
  return writeFloat(this, value, offset, true, noAssert)
}

Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
  return writeFloat(this, value, offset, false, noAssert)
}

function writeDouble (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
  }
  ieee754.write(buf, value, offset, littleEndian, 52, 8)
  return offset + 8
}

Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
  return writeDouble(this, value, offset, true, noAssert)
}

Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
  return writeDouble(this, value, offset, false, noAssert)
}

// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
  if (!start) start = 0
  if (!end && end !== 0) end = this.length
  if (targetStart >= target.length) targetStart = target.length
  if (!targetStart) targetStart = 0
  if (end > 0 && end < start) end = start

  // Copy 0 bytes; we're done
  if (end === start) return 0
  if (target.length === 0 || this.length === 0) return 0

  // Fatal error conditions
  if (targetStart < 0) {
    throw new RangeError('targetStart out of bounds')
  }
  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
  if (end < 0) throw new RangeError('sourceEnd out of bounds')

  // Are we oob?
  if (end > this.length) end = this.length
  if (target.length - targetStart < end - start) {
    end = target.length - targetStart + start
  }

  var len = end - start

  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
    // Use built-in when available, missing from IE11
    this.copyWithin(targetStart, start, end)
  } else if (this === target && start < targetStart && targetStart < end) {
    // descending copy from end
    for (var i = len - 1; i >= 0; --i) {
      target[i + targetStart] = this[i + start]
    }
  } else {
    Uint8Array.prototype.set.call(
      target,
      this.subarray(start, end),
      targetStart
    )
  }

  return len
}

// Usage:
//    buffer.fill(number[, offset[, end]])
//    buffer.fill(buffer[, offset[, end]])
//    buffer.fill(string[, offset[, end]][, encoding])
Buffer.prototype.fill = function fill (val, start, end, encoding) {
  // Handle string cases:
  if (typeof val === 'string') {
    if (typeof start === 'string') {
      encoding = start
      start = 0
      end = this.length
    } else if (typeof end === 'string') {
      encoding = end
      end = this.length
    }
    if (encoding !== undefined && typeof encoding !== 'string') {
      throw new TypeError('encoding must be a string')
    }
    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
      throw new TypeError('Unknown encoding: ' + encoding)
    }
    if (val.length === 1) {
      var code = val.charCodeAt(0)
      if ((encoding === 'utf8' && code < 128) ||
          encoding === 'latin1') {
        // Fast path: If `val` fits into a single byte, use that numeric value.
        val = code
      }
    }
  } else if (typeof val === 'number') {
    val = val & 255
  }

  // Invalid ranges are not set to a default, so can range check early.
  if (start < 0 || this.length < start || this.length < end) {
    throw new RangeError('Out of range index')
  }

  if (end <= start) {
    return this
  }

  start = start >>> 0
  end = end === undefined ? this.length : end >>> 0

  if (!val) val = 0

  var i
  if (typeof val === 'number') {
    for (i = start; i < end; ++i) {
      this[i] = val
    }
  } else {
    var bytes = Buffer.isBuffer(val)
      ? val
      : new Buffer(val, encoding)
    var len = bytes.length
    if (len === 0) {
      throw new TypeError('The value "' + val +
        '" is invalid for argument "value"')
    }
    for (i = 0; i < end - start; ++i) {
      this[i + start] = bytes[i % len]
    }
  }

  return this
}

// HELPER FUNCTIONS
// ================

var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g

function base64clean (str) {
  // Node takes equal signs as end of the Base64 encoding
  str = str.split('=')[0]
  // Node strips out invalid characters like \n and \t from the string, base64-js does not
  str = str.trim().replace(INVALID_BASE64_RE, '')
  // Node converts strings with length < 2 to ''
  if (str.length < 2) return ''
  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
  while (str.length % 4 !== 0) {
    str = str + '='
  }
  return str
}

function toHex (n) {
  if (n < 16) return '0' + n.toString(16)
  return n.toString(16)
}

function utf8ToBytes (string, units) {
  units = units || Infinity
  var codePoint
  var length = string.length
  var leadSurrogate = null
  var bytes = []

  for (var i = 0; i < length; ++i) {
    codePoint = string.charCodeAt(i)

    // is surrogate component
    if (codePoint > 0xD7FF && codePoint < 0xE000) {
      // last char was a lead
      if (!leadSurrogate) {
        // no lead yet
        if (codePoint > 0xDBFF) {
          // unexpected trail
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        } else if (i + 1 === length) {
          // unpaired lead
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        }

        // valid lead
        leadSurrogate = codePoint

        continue
      }

      // 2 leads in a row
      if (codePoint < 0xDC00) {
        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
        leadSurrogate = codePoint
        continue
      }

      // valid surrogate pair
      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
    } else if (leadSurrogate) {
      // valid bmp char, but last char was a lead
      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
    }

    leadSurrogate = null

    // encode utf8
    if (codePoint < 0x80) {
      if ((units -= 1) < 0) break
      bytes.push(codePoint)
    } else if (codePoint < 0x800) {
      if ((units -= 2) < 0) break
      bytes.push(
        codePoint >> 0x6 | 0xC0,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x10000) {
      if ((units -= 3) < 0) break
      bytes.push(
        codePoint >> 0xC | 0xE0,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x110000) {
      if ((units -= 4) < 0) break
      bytes.push(
        codePoint >> 0x12 | 0xF0,
        codePoint >> 0xC & 0x3F | 0x80,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else {
      throw new Error('Invalid code point')
    }
  }

  return bytes
}

function asciiToBytes (str) {
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    // Node's code seems to be doing this and not & 0x7F..
    byteArray.push(str.charCodeAt(i) & 0xFF)
  }
  return byteArray
}

function utf16leToBytes (str, units) {
  var c, hi, lo
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    if ((units -= 2) < 0) break

    c = str.charCodeAt(i)
    hi = c >> 8
    lo = c % 256
    byteArray.push(lo)
    byteArray.push(hi)
  }

  return byteArray
}

function base64ToBytes (str) {
  return base64.toByteArray(base64clean(str))
}

function blitBuffer (src, dst, offset, length) {
  for (var i = 0; i < length; ++i) {
    if ((i + offset >= dst.length) || (i >= src.length)) break
    dst[i + offset] = src[i]
  }
  return i
}

// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check
// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166
function isArrayBuffer (obj) {
  return obj instanceof ArrayBuffer ||
    (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' &&
      typeof obj.byteLength === 'number')
}

function numberIsNaN (obj) {
  return obj !== obj // eslint-disable-line no-self-compare
}

},{"base64-js":2,"ieee754":4}],4:[function(require,module,exports){
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
  var e, m
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var nBits = -7
  var i = isLE ? (nBytes - 1) : 0
  var d = isLE ? -1 : 1
  var s = buffer[offset + i]

  i += d

  e = s & ((1 << (-nBits)) - 1)
  s >>= (-nBits)
  nBits += eLen
  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  m = e & ((1 << (-nBits)) - 1)
  e >>= (-nBits)
  nBits += mLen
  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  if (e === 0) {
    e = 1 - eBias
  } else if (e === eMax) {
    return m ? NaN : ((s ? -1 : 1) * Infinity)
  } else {
    m = m + Math.pow(2, mLen)
    e = e - eBias
  }
  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
}

exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
  var e, m, c
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
  var i = isLE ? 0 : (nBytes - 1)
  var d = isLE ? 1 : -1
  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0

  value = Math.abs(value)

  if (isNaN(value) || value === Infinity) {
    m = isNaN(value) ? 1 : 0
    e = eMax
  } else {
    e = Math.floor(Math.log(value) / Math.LN2)
    if (value * (c = Math.pow(2, -e)) < 1) {
      e--
      c *= 2
    }
    if (e + eBias >= 1) {
      value += rt / c
    } else {
      value += rt * Math.pow(2, 1 - eBias)
    }
    if (value * c >= 2) {
      e++
      c /= 2
    }

    if (e + eBias >= eMax) {
      m = 0
      e = eMax
    } else if (e + eBias >= 1) {
      m = ((value * c) - 1) * Math.pow(2, mLen)
      e = e + eBias
    } else {
      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
      e = 0
    }
  }

  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}

  e = (e << mLen) | m
  eLen += mLen
  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}

  buffer[offset + i - d] |= s * 128
}

},{}],5:[function(require,module,exports){
function DOMParser(options){
	this.options = options ||{locator:{}};
	
}
DOMParser.prototype.parseFromString = function(source,mimeType){
	var options = this.options;
	var sax =  new XMLReader();
	var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
	var errorHandler = options.errorHandler;
	var locator = options.locator;
	var defaultNSMap = options.xmlns||{};
	var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
	if(locator){
		domBuilder.setDocumentLocator(locator)
	}
	
	sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
	sax.domBuilder = options.domBuilder || domBuilder;
	if(/\/x?html?$/.test(mimeType)){
		entityMap.nbsp = '\xa0';
		entityMap.copy = '\xa9';
		defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
	}
	defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
	if(source){
		sax.parse(source,defaultNSMap,entityMap);
	}else{
		sax.errorHandler.error("invalid doc source");
	}
	return domBuilder.doc;
}
function buildErrorHandler(errorImpl,domBuilder,locator){
	if(!errorImpl){
		if(domBuilder instanceof DOMHandler){
			return domBuilder;
		}
		errorImpl = domBuilder ;
	}
	var errorHandler = {}
	var isCallback = errorImpl instanceof Function;
	locator = locator||{}
	function build(key){
		var fn = errorImpl[key];
		if(!fn && isCallback){
			fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
		}
		errorHandler[key] = fn && function(msg){
			fn('[xmldom '+key+']\t'+msg+_locator(locator));
		}||function(){};
	}
	build('warning');
	build('error');
	build('fatalError');
	return errorHandler;
}

//console.log('#\n\n\n\n\n\n\n####')
/**
 * +ContentHandler+ErrorHandler
 * +LexicalHandler+EntityResolver2
 * -DeclHandler-DTDHandler 
 * 
 * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
 * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
 * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
 */
function DOMHandler() {
    this.cdata = false;
}
function position(locator,node){
	node.lineNumber = locator.lineNumber;
	node.columnNumber = locator.columnNumber;
}
/**
 * @see org.xml.sax.ContentHandler#startDocument
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
 */ 
DOMHandler.prototype = {
	startDocument : function() {
    	this.doc = new DOMImplementation().createDocument(null, null, null);
    	if (this.locator) {
        	this.doc.documentURI = this.locator.systemId;
    	}
	},
	startElement:function(namespaceURI, localName, qName, attrs) {
		var doc = this.doc;
	    var el = doc.createElementNS(namespaceURI, qName||localName);
	    var len = attrs.length;
	    appendElement(this, el);
	    this.currentElement = el;
	    
		this.locator && position(this.locator,el)
	    for (var i = 0 ; i < len; i++) {
	        var namespaceURI = attrs.getURI(i);
	        var value = attrs.getValue(i);
	        var qName = attrs.getQName(i);
			var attr = doc.createAttributeNS(namespaceURI, qName);
			this.locator &&position(attrs.getLocator(i),attr);
			attr.value = attr.nodeValue = value;
			el.setAttributeNode(attr)
	    }
	},
	endElement:function(namespaceURI, localName, qName) {
		var current = this.currentElement
		var tagName = current.tagName;
		this.currentElement = current.parentNode;
	},
	startPrefixMapping:function(prefix, uri) {
	},
	endPrefixMapping:function(prefix) {
	},
	processingInstruction:function(target, data) {
	    var ins = this.doc.createProcessingInstruction(target, data);
	    this.locator && position(this.locator,ins)
	    appendElement(this, ins);
	},
	ignorableWhitespace:function(ch, start, length) {
	},
	characters:function(chars, start, length) {
		chars = _toString.apply(this,arguments)
		//console.log(chars)
		if(chars){
			if (this.cdata) {
				var charNode = this.doc.createCDATASection(chars);
			} else {
				var charNode = this.doc.createTextNode(chars);
			}
			if(this.currentElement){
				this.currentElement.appendChild(charNode);
			}else if(/^\s*$/.test(chars)){
				this.doc.appendChild(charNode);
				//process xml
			}
			this.locator && position(this.locator,charNode)
		}
	},
	skippedEntity:function(name) {
	},
	endDocument:function() {
		this.doc.normalize();
	},
	setDocumentLocator:function (locator) {
	    if(this.locator = locator){// && !('lineNumber' in locator)){
	    	locator.lineNumber = 0;
	    }
	},
	//LexicalHandler
	comment:function(chars, start, length) {
		chars = _toString.apply(this,arguments)
	    var comm = this.doc.createComment(chars);
	    this.locator && position(this.locator,comm)
	    appendElement(this, comm);
	},
	
	startCDATA:function() {
	    //used in characters() methods
	    this.cdata = true;
	},
	endCDATA:function() {
	    this.cdata = false;
	},
	
	startDTD:function(name, publicId, systemId) {
		var impl = this.doc.implementation;
	    if (impl && impl.createDocumentType) {
	        var dt = impl.createDocumentType(name, publicId, systemId);
	        this.locator && position(this.locator,dt)
	        appendElement(this, dt);
	    }
	},
	/**
	 * @see org.xml.sax.ErrorHandler
	 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
	 */
	warning:function(error) {
		console.warn('[xmldom warning]\t'+error,_locator(this.locator));
	},
	error:function(error) {
		console.error('[xmldom error]\t'+error,_locator(this.locator));
	},
	fatalError:function(error) {
		console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
	    throw error;
	}
}
function _locator(l){
	if(l){
		return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
	}
}
function _toString(chars,start,length){
	if(typeof chars == 'string'){
		return chars.substr(start,length)
	}else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
		if(chars.length >= start+length || start){
			return new java.lang.String(chars,start,length)+'';
		}
		return chars;
	}
}

/*
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
 * used method of org.xml.sax.ext.LexicalHandler:
 *  #comment(chars, start, length)
 *  #startCDATA()
 *  #endCDATA()
 *  #startDTD(name, publicId, systemId)
 *
 *
 * IGNORED method of org.xml.sax.ext.LexicalHandler:
 *  #endDTD()
 *  #startEntity(name)
 *  #endEntity(name)
 *
 *
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
 * IGNORED method of org.xml.sax.ext.DeclHandler
 * 	#attributeDecl(eName, aName, type, mode, value)
 *  #elementDecl(name, model)
 *  #externalEntityDecl(name, publicId, systemId)
 *  #internalEntityDecl(name, value)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
 * IGNORED method of org.xml.sax.EntityResolver2
 *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
 *  #resolveEntity(publicId, systemId)
 *  #getExternalSubset(name, baseURI)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
 * IGNORED method of org.xml.sax.DTDHandler
 *  #notationDecl(name, publicId, systemId) {};
 *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
 */
"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
	DOMHandler.prototype[key] = function(){return null}
})

/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
function appendElement (hander,node) {
    if (!hander.currentElement) {
        hander.doc.appendChild(node);
    } else {
        hander.currentElement.appendChild(node);
    }
}//appendChild and setAttributeNS are preformance key

//if(typeof require == 'function'){
	var XMLReader = require('./sax').XMLReader;
	var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;
	exports.XMLSerializer = require('./dom').XMLSerializer ;
	exports.DOMParser = DOMParser;
//}

},{"./dom":6,"./sax":7}],6:[function(require,module,exports){
/*
 * DOM Level 2
 * Object DOMException
 * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
 */

function copy(src,dest){
	for(var p in src){
		dest[p] = src[p];
	}
}
/**
^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
 */
function _extends(Class,Super){
	var pt = Class.prototype;
	if(Object.create){
		var ppt = Object.create(Super.prototype)
		pt.__proto__ = ppt;
	}
	if(!(pt instanceof Super)){
		function t(){};
		t.prototype = Super.prototype;
		t = new t();
		copy(pt,t);
		Class.prototype = pt = t;
	}
	if(pt.constructor != Class){
		if(typeof Class != 'function'){
			console.error("unknow Class:"+Class)
		}
		pt.constructor = Class
	}
}
var htmlns = 'http://www.w3.org/1999/xhtml' ;
// Node Types
var NodeType = {}
var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;

// ExceptionCode
var ExceptionCode = {}
var ExceptionMessage = {};
var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
//level2
var INVALID_STATE_ERR        	= ExceptionCode.INVALID_STATE_ERR        	= ((ExceptionMessage[11]="Invalid state"),11);
var SYNTAX_ERR               	= ExceptionCode.SYNTAX_ERR               	= ((ExceptionMessage[12]="Syntax error"),12);
var INVALID_MODIFICATION_ERR 	= ExceptionCode.INVALID_MODIFICATION_ERR 	= ((ExceptionMessage[13]="Invalid modification"),13);
var NAMESPACE_ERR            	= ExceptionCode.NAMESPACE_ERR           	= ((ExceptionMessage[14]="Invalid namespace"),14);
var INVALID_ACCESS_ERR       	= ExceptionCode.INVALID_ACCESS_ERR      	= ((ExceptionMessage[15]="Invalid access"),15);


function DOMException(code, message) {
	if(message instanceof Error){
		var error = message;
	}else{
		error = this;
		Error.call(this, ExceptionMessage[code]);
		this.message = ExceptionMessage[code];
		if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
	}
	error.code = code;
	if(message) this.message = this.message + ": " + message;
	return error;
};
DOMException.prototype = Error.prototype;
copy(ExceptionCode,DOMException)
/**
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
 * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
 * The items in the NodeList are accessible via an integral index, starting from 0.
 */
function NodeList() {
};
NodeList.prototype = {
	/**
	 * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
	 * @standard level1
	 */
	length:0, 
	/**
	 * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
	 * @standard level1
	 * @param index  unsigned long 
	 *   Index into the collection.
	 * @return Node
	 * 	The node at the indexth position in the NodeList, or null if that is not a valid index. 
	 */
	item: function(index) {
		return this[index] || null;
	},
	toString:function(isHTML,nodeFilter){
		for(var buf = [], i = 0;i<this.length;i++){
			serializeToString(this[i],buf,isHTML,nodeFilter);
		}
		return buf.join('');
	}
};
function LiveNodeList(node,refresh){
	this._node = node;
	this._refresh = refresh
	_updateLiveList(this);
}
function _updateLiveList(list){
	var inc = list._node._inc || list._node.ownerDocument._inc;
	if(list._inc != inc){
		var ls = list._refresh(list._node);
		//console.log(ls.length)
		__set__(list,'length',ls.length);
		copy(ls,list);
		list._inc = inc;
	}
}
LiveNodeList.prototype.item = function(i){
	_updateLiveList(this);
	return this[i];
}

_extends(LiveNodeList,NodeList);
/**
 * 
 * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
 * NamedNodeMap objects in the DOM are live.
 * used for attributes or DocumentType entities 
 */
function NamedNodeMap() {
};

function _findNodeIndex(list,node){
	var i = list.length;
	while(i--){
		if(list[i] === node){return i}
	}
}

function _addNamedNode(el,list,newAttr,oldAttr){
	if(oldAttr){
		list[_findNodeIndex(list,oldAttr)] = newAttr;
	}else{
		list[list.length++] = newAttr;
	}
	if(el){
		newAttr.ownerElement = el;
		var doc = el.ownerDocument;
		if(doc){
			oldAttr && _onRemoveAttribute(doc,el,oldAttr);
			_onAddAttribute(doc,el,newAttr);
		}
	}
}
function _removeNamedNode(el,list,attr){
	//console.log('remove attr:'+attr)
	var i = _findNodeIndex(list,attr);
	if(i>=0){
		var lastIndex = list.length-1
		while(i<lastIndex){
			list[i] = list[++i]
		}
		list.length = lastIndex;
		if(el){
			var doc = el.ownerDocument;
			if(doc){
				_onRemoveAttribute(doc,el,attr);
				attr.ownerElement = null;
			}
		}
	}else{
		throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
	}
}
NamedNodeMap.prototype = {
	length:0,
	item:NodeList.prototype.item,
	getNamedItem: function(key) {
//		if(key.indexOf(':')>0 || key == 'xmlns'){
//			return null;
//		}
		//console.log()
		var i = this.length;
		while(i--){
			var attr = this[i];
			//console.log(attr.nodeName,key)
			if(attr.nodeName == key){
				return attr;
			}
		}
	},
	setNamedItem: function(attr) {
		var el = attr.ownerElement;
		if(el && el!=this._ownerElement){
			throw new DOMException(INUSE_ATTRIBUTE_ERR);
		}
		var oldAttr = this.getNamedItem(attr.nodeName);
		_addNamedNode(this._ownerElement,this,attr,oldAttr);
		return oldAttr;
	},
	/* returns Node */
	setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
		var el = attr.ownerElement, oldAttr;
		if(el && el!=this._ownerElement){
			throw new DOMException(INUSE_ATTRIBUTE_ERR);
		}
		oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
		_addNamedNode(this._ownerElement,this,attr,oldAttr);
		return oldAttr;
	},

	/* returns Node */
	removeNamedItem: function(key) {
		var attr = this.getNamedItem(key);
		_removeNamedNode(this._ownerElement,this,attr);
		return attr;
		
		
	},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
	
	//for level2
	removeNamedItemNS:function(namespaceURI,localName){
		var attr = this.getNamedItemNS(namespaceURI,localName);
		_removeNamedNode(this._ownerElement,this,attr);
		return attr;
	},
	getNamedItemNS: function(namespaceURI, localName) {
		var i = this.length;
		while(i--){
			var node = this[i];
			if(node.localName == localName && node.namespaceURI == namespaceURI){
				return node;
			}
		}
		return null;
	}
};
/**
 * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
 */
function DOMImplementation(/* Object */ features) {
	this._features = {};
	if (features) {
		for (var feature in features) {
			 this._features = features[feature];
		}
	}
};

DOMImplementation.prototype = {
	hasFeature: function(/* string */ feature, /* string */ version) {
		var versions = this._features[feature.toLowerCase()];
		if (versions && (!version || version in versions)) {
			return true;
		} else {
			return false;
		}
	},
	// Introduced in DOM Level 2:
	createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
		var doc = new Document();
		doc.implementation = this;
		doc.childNodes = new NodeList();
		doc.doctype = doctype;
		if(doctype){
			doc.appendChild(doctype);
		}
		if(qualifiedName){
			var root = doc.createElementNS(namespaceURI,qualifiedName);
			doc.appendChild(root);
		}
		return doc;
	},
	// Introduced in DOM Level 2:
	createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
		var node = new DocumentType();
		node.name = qualifiedName;
		node.nodeName = qualifiedName;
		node.publicId = publicId;
		node.systemId = systemId;
		// Introduced in DOM Level 2:
		//readonly attribute DOMString        internalSubset;
		
		//TODO:..
		//  readonly attribute NamedNodeMap     entities;
		//  readonly attribute NamedNodeMap     notations;
		return node;
	}
};


/**
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
 */

function Node() {
};

Node.prototype = {
	firstChild : null,
	lastChild : null,
	previousSibling : null,
	nextSibling : null,
	attributes : null,
	parentNode : null,
	childNodes : null,
	ownerDocument : null,
	nodeValue : null,
	namespaceURI : null,
	prefix : null,
	localName : null,
	// Modified in DOM Level 2:
	insertBefore:function(newChild, refChild){//raises 
		return _insertBefore(this,newChild,refChild);
	},
	replaceChild:function(newChild, oldChild){//raises 
		this.insertBefore(newChild,oldChild);
		if(oldChild){
			this.removeChild(oldChild);
		}
	},
	removeChild:function(oldChild){
		return _removeChild(this,oldChild);
	},
	appendChild:function(newChild){
		return this.insertBefore(newChild,null);
	},
	hasChildNodes:function(){
		return this.firstChild != null;
	},
	cloneNode:function(deep){
		return cloneNode(this.ownerDocument||this,this,deep);
	},
	// Modified in DOM Level 2:
	normalize:function(){
		var child = this.firstChild;
		while(child){
			var next = child.nextSibling;
			if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
				this.removeChild(next);
				child.appendData(next.data);
			}else{
				child.normalize();
				child = next;
			}
		}
	},
  	// Introduced in DOM Level 2:
	isSupported:function(feature, version){
		return this.ownerDocument.implementation.hasFeature(feature,version);
	},
    // Introduced in DOM Level 2:
    hasAttributes:function(){
    	return this.attributes.length>0;
    },
    lookupPrefix:function(namespaceURI){
    	var el = this;
    	while(el){
    		var map = el._nsMap;
    		//console.dir(map)
    		if(map){
    			for(var n in map){
    				if(map[n] == namespaceURI){
    					return n;
    				}
    			}
    		}
    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
    	}
    	return null;
    },
    // Introduced in DOM Level 3:
    lookupNamespaceURI:function(prefix){
    	var el = this;
    	while(el){
    		var map = el._nsMap;
    		//console.dir(map)
    		if(map){
    			if(prefix in map){
    				return map[prefix] ;
    			}
    		}
    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
    	}
    	return null;
    },
    // Introduced in DOM Level 3:
    isDefaultNamespace:function(namespaceURI){
    	var prefix = this.lookupPrefix(namespaceURI);
    	return prefix == null;
    }
};


function _xmlEncoder(c){
	return c == '<' && '&lt;' ||
         c == '>' && '&gt;' ||
         c == '&' && '&amp;' ||
         c == '"' && '&quot;' ||
         '&#'+c.charCodeAt()+';'
}


copy(NodeType,Node);
copy(NodeType,Node.prototype);

/**
 * @param callback return true for continue,false for break
 * @return boolean true: break visit;
 */
function _visitNode(node,callback){
	if(callback(node)){
		return true;
	}
	if(node = node.firstChild){
		do{
			if(_visitNode(node,callback)){return true}
        }while(node=node.nextSibling)
    }
}



function Document(){
}
function _onAddAttribute(doc,el,newAttr){
	doc && doc._inc++;
	var ns = newAttr.namespaceURI ;
	if(ns == 'http://www.w3.org/2000/xmlns/'){
		//update namespace
		el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value
	}
}
function _onRemoveAttribute(doc,el,newAttr,remove){
	doc && doc._inc++;
	var ns = newAttr.namespaceURI ;
	if(ns == 'http://www.w3.org/2000/xmlns/'){
		//update namespace
		delete el._nsMap[newAttr.prefix?newAttr.localName:'']
	}
}
function _onUpdateChild(doc,el,newChild){
	if(doc && doc._inc){
		doc._inc++;
		//update childNodes
		var cs = el.childNodes;
		if(newChild){
			cs[cs.length++] = newChild;
		}else{
			//console.log(1)
			var child = el.firstChild;
			var i = 0;
			while(child){
				cs[i++] = child;
				child =child.nextSibling;
			}
			cs.length = i;
		}
	}
}

/**
 * attributes;
 * children;
 * 
 * writeable properties:
 * nodeValue,Attr:value,CharacterData:data
 * prefix
 */
function _removeChild(parentNode,child){
	var previous = child.previousSibling;
	var next = child.nextSibling;
	if(previous){
		previous.nextSibling = next;
	}else{
		parentNode.firstChild = next
	}
	if(next){
		next.previousSibling = previous;
	}else{
		parentNode.lastChild = previous;
	}
	_onUpdateChild(parentNode.ownerDocument,parentNode);
	return child;
}
/**
 * preformance key(refChild == null)
 */
function _insertBefore(parentNode,newChild,nextChild){
	var cp = newChild.parentNode;
	if(cp){
		cp.removeChild(newChild);//remove and update
	}
	if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
		var newFirst = newChild.firstChild;
		if (newFirst == null) {
			return newChild;
		}
		var newLast = newChild.lastChild;
	}else{
		newFirst = newLast = newChild;
	}
	var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;

	newFirst.previousSibling = pre;
	newLast.nextSibling = nextChild;
	
	
	if(pre){
		pre.nextSibling = newFirst;
	}else{
		parentNode.firstChild = newFirst;
	}
	if(nextChild == null){
		parentNode.lastChild = newLast;
	}else{
		nextChild.previousSibling = newLast;
	}
	do{
		newFirst.parentNode = parentNode;
	}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
	_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
	//console.log(parentNode.lastChild.nextSibling == null)
	if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
		newChild.firstChild = newChild.lastChild = null;
	}
	return newChild;
}
function _appendSingleChild(parentNode,newChild){
	var cp = newChild.parentNode;
	if(cp){
		var pre = parentNode.lastChild;
		cp.removeChild(newChild);//remove and update
		var pre = parentNode.lastChild;
	}
	var pre = parentNode.lastChild;
	newChild.parentNode = parentNode;
	newChild.previousSibling = pre;
	newChild.nextSibling = null;
	if(pre){
		pre.nextSibling = newChild;
	}else{
		parentNode.firstChild = newChild;
	}
	parentNode.lastChild = newChild;
	_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
	return newChild;
	//console.log("__aa",parentNode.lastChild.nextSibling == null)
}
Document.prototype = {
	//implementation : null,
	nodeName :  '#document',
	nodeType :  DOCUMENT_NODE,
	doctype :  null,
	documentElement :  null,
	_inc : 1,
	
	insertBefore :  function(newChild, refChild){//raises 
		if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
			var child = newChild.firstChild;
			while(child){
				var next = child.nextSibling;
				this.insertBefore(child,refChild);
				child = next;
			}
			return newChild;
		}
		if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
			this.documentElement = newChild;
		}
		
		return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
	},
	removeChild :  function(oldChild){
		if(this.documentElement == oldChild){
			this.documentElement = null;
		}
		return _removeChild(this,oldChild);
	},
	// Introduced in DOM Level 2:
	importNode : function(importedNode,deep){
		return importNode(this,importedNode,deep);
	},
	// Introduced in DOM Level 2:
	getElementById :	function(id){
		var rtv = null;
		_visitNode(this.documentElement,function(node){
			if(node.nodeType == ELEMENT_NODE){
				if(node.getAttribute('id') == id){
					rtv = node;
					return true;
				}
			}
		})
		return rtv;
	},
	
	//document factory method:
	createElement :	function(tagName){
		var node = new Element();
		node.ownerDocument = this;
		node.nodeName = tagName;
		node.tagName = tagName;
		node.childNodes = new NodeList();
		var attrs	= node.attributes = new NamedNodeMap();
		attrs._ownerElement = node;
		return node;
	},
	createDocumentFragment :	function(){
		var node = new DocumentFragment();
		node.ownerDocument = this;
		node.childNodes = new NodeList();
		return node;
	},
	createTextNode :	function(data){
		var node = new Text();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createComment :	function(data){
		var node = new Comment();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createCDATASection :	function(data){
		var node = new CDATASection();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createProcessingInstruction :	function(target,data){
		var node = new ProcessingInstruction();
		node.ownerDocument = this;
		node.tagName = node.target = target;
		node.nodeValue= node.data = data;
		return node;
	},
	createAttribute :	function(name){
		var node = new Attr();
		node.ownerDocument	= this;
		node.name = name;
		node.nodeName	= name;
		node.localName = name;
		node.specified = true;
		return node;
	},
	createEntityReference :	function(name){
		var node = new EntityReference();
		node.ownerDocument	= this;
		node.nodeName	= name;
		return node;
	},
	// Introduced in DOM Level 2:
	createElementNS :	function(namespaceURI,qualifiedName){
		var node = new Element();
		var pl = qualifiedName.split(':');
		var attrs	= node.attributes = new NamedNodeMap();
		node.childNodes = new NodeList();
		node.ownerDocument = this;
		node.nodeName = qualifiedName;
		node.tagName = qualifiedName;
		node.namespaceURI = namespaceURI;
		if(pl.length == 2){
			node.prefix = pl[0];
			node.localName = pl[1];
		}else{
			//el.prefix = null;
			node.localName = qualifiedName;
		}
		attrs._ownerElement = node;
		return node;
	},
	// Introduced in DOM Level 2:
	createAttributeNS :	function(namespaceURI,qualifiedName){
		var node = new Attr();
		var pl = qualifiedName.split(':');
		node.ownerDocument = this;
		node.nodeName = qualifiedName;
		node.name = qualifiedName;
		node.namespaceURI = namespaceURI;
		node.specified = true;
		if(pl.length == 2){
			node.prefix = pl[0];
			node.localName = pl[1];
		}else{
			//el.prefix = null;
			node.localName = qualifiedName;
		}
		return node;
	}
};
_extends(Document,Node);


function Element() {
	this._nsMap = {};
};
Element.prototype = {
	nodeType : ELEMENT_NODE,
	hasAttribute : function(name){
		return this.getAttributeNode(name)!=null;
	},
	getAttribute : function(name){
		var attr = this.getAttributeNode(name);
		return attr && attr.value || '';
	},
	getAttributeNode : function(name){
		return this.attributes.getNamedItem(name);
	},
	setAttribute : function(name, value){
		var attr = this.ownerDocument.createAttribute(name);
		attr.value = attr.nodeValue = "" + value;
		this.setAttributeNode(attr)
	},
	removeAttribute : function(name){
		var attr = this.getAttributeNode(name)
		attr && this.removeAttributeNode(attr);
	},
	
	//four real opeartion method
	appendChild:function(newChild){
		if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
			return this.insertBefore(newChild,null);
		}else{
			return _appendSingleChild(this,newChild);
		}
	},
	setAttributeNode : function(newAttr){
		return this.attributes.setNamedItem(newAttr);
	},
	setAttributeNodeNS : function(newAttr){
		return this.attributes.setNamedItemNS(newAttr);
	},
	removeAttributeNode : function(oldAttr){
		//console.log(this == oldAttr.ownerElement)
		return this.attributes.removeNamedItem(oldAttr.nodeName);
	},
	//get real attribute name,and remove it by removeAttributeNode
	removeAttributeNS : function(namespaceURI, localName){
		var old = this.getAttributeNodeNS(namespaceURI, localName);
		old && this.removeAttributeNode(old);
	},
	
	hasAttributeNS : function(namespaceURI, localName){
		return this.getAttributeNodeNS(namespaceURI, localName)!=null;
	},
	getAttributeNS : function(namespaceURI, localName){
		var attr = this.getAttributeNodeNS(namespaceURI, localName);
		return attr && attr.value || '';
	},
	setAttributeNS : function(namespaceURI, qualifiedName, value){
		var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
		attr.value = attr.nodeValue = "" + value;
		this.setAttributeNode(attr)
	},
	getAttributeNodeNS : function(namespaceURI, localName){
		return this.attributes.getNamedItemNS(namespaceURI, localName);
	},
	
	getElementsByTagName : function(tagName){
		return new LiveNodeList(this,function(base){
			var ls = [];
			_visitNode(base,function(node){
				if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
					ls.push(node);
				}
			});
			return ls;
		});
	},
	getElementsByTagNameNS : function(namespaceURI, localName){
		return new LiveNodeList(this,function(base){
			var ls = [];
			_visitNode(base,function(node){
				if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
					ls.push(node);
				}
			});
			return ls;
			
		});
	}
};
Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;


_extends(Element,Node);
function Attr() {
};
Attr.prototype.nodeType = ATTRIBUTE_NODE;
_extends(Attr,Node);


function CharacterData() {
};
CharacterData.prototype = {
	data : '',
	substringData : function(offset, count) {
		return this.data.substring(offset, offset+count);
	},
	appendData: function(text) {
		text = this.data+text;
		this.nodeValue = this.data = text;
		this.length = text.length;
	},
	insertData: function(offset,text) {
		this.replaceData(offset,0,text);
	
	},
	appendChild:function(newChild){
		throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
	},
	deleteData: function(offset, count) {
		this.replaceData(offset,count,"");
	},
	replaceData: function(offset, count, text) {
		var start = this.data.substring(0,offset);
		var end = this.data.substring(offset+count);
		text = start + text + end;
		this.nodeValue = this.data = text;
		this.length = text.length;
	}
}
_extends(CharacterData,Node);
function Text() {
};
Text.prototype = {
	nodeName : "#text",
	nodeType : TEXT_NODE,
	splitText : function(offset) {
		var text = this.data;
		var newText = text.substring(offset);
		text = text.substring(0, offset);
		this.data = this.nodeValue = text;
		this.length = text.length;
		var newNode = this.ownerDocument.createTextNode(newText);
		if(this.parentNode){
			this.parentNode.insertBefore(newNode, this.nextSibling);
		}
		return newNode;
	}
}
_extends(Text,CharacterData);
function Comment() {
};
Comment.prototype = {
	nodeName : "#comment",
	nodeType : COMMENT_NODE
}
_extends(Comment,CharacterData);

function CDATASection() {
};
CDATASection.prototype = {
	nodeName : "#cdata-section",
	nodeType : CDATA_SECTION_NODE
}
_extends(CDATASection,CharacterData);


function DocumentType() {
};
DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
_extends(DocumentType,Node);

function Notation() {
};
Notation.prototype.nodeType = NOTATION_NODE;
_extends(Notation,Node);

function Entity() {
};
Entity.prototype.nodeType = ENTITY_NODE;
_extends(Entity,Node);

function EntityReference() {
};
EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
_extends(EntityReference,Node);

function DocumentFragment() {
};
DocumentFragment.prototype.nodeName =	"#document-fragment";
DocumentFragment.prototype.nodeType =	DOCUMENT_FRAGMENT_NODE;
_extends(DocumentFragment,Node);


function ProcessingInstruction() {
}
ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
_extends(ProcessingInstruction,Node);
function XMLSerializer(){}
XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){
	return nodeSerializeToString.call(node,isHtml,nodeFilter);
}
Node.prototype.toString = nodeSerializeToString;
function nodeSerializeToString(isHtml,nodeFilter){
	var buf = [];
	var refNode = this.nodeType == 9?this.documentElement:this;
	var prefix = refNode.prefix;
	var uri = refNode.namespaceURI;
	
	if(uri && prefix == null){
		//console.log(prefix)
		var prefix = refNode.lookupPrefix(uri);
		if(prefix == null){
			//isHTML = true;
			var visibleNamespaces=[
			{namespace:uri,prefix:null}
			//{namespace:uri,prefix:''}
			]
		}
	}
	serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
	//console.log('###',this.nodeType,uri,prefix,buf.join(''))
	return buf.join('');
}
function needNamespaceDefine(node,isHTML, visibleNamespaces) {
	var prefix = node.prefix||'';
	var uri = node.namespaceURI;
	if (!prefix && !uri){
		return false;
	}
	if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
		|| uri == 'http://www.w3.org/2000/xmlns/'){
		return false;
	}
	
	var i = visibleNamespaces.length 
	//console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
	while (i--) {
		var ns = visibleNamespaces[i];
		// get namespace prefix
		//console.log(node.nodeType,node.tagName,ns.prefix,prefix)
		if (ns.prefix == prefix){
			return ns.namespace != uri;
		}
	}
	//console.log(isHTML,uri,prefix=='')
	//if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
	//	return false;
	//}
	//node.flag = '11111'
	//console.error(3,true,node.flag,node.prefix,node.namespaceURI)
	return true;
}
function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
	if(nodeFilter){
		node = nodeFilter(node);
		if(node){
			if(typeof node == 'string'){
				buf.push(node);
				return;
			}
		}else{
			return;
		}
		//buf.sort.apply(attrs, attributeSorter);
	}
	switch(node.nodeType){
	case ELEMENT_NODE:
		if (!visibleNamespaces) visibleNamespaces = [];
		var startVisibleNamespaces = visibleNamespaces.length;
		var attrs = node.attributes;
		var len = attrs.length;
		var child = node.firstChild;
		var nodeName = node.tagName;
		
		isHTML =  (htmlns === node.namespaceURI) ||isHTML 
		buf.push('<',nodeName);
		
		
		
		for(var i=0;i<len;i++){
			// add namespaces for attributes
			var attr = attrs.item(i);
			if (attr.prefix == 'xmlns') {
				visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
			}else if(attr.nodeName == 'xmlns'){
				visibleNamespaces.push({ prefix: '', namespace: attr.value });
			}
		}
		for(var i=0;i<len;i++){
			var attr = attrs.item(i);
			if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
				var prefix = attr.prefix||'';
				var uri = attr.namespaceURI;
				var ns = prefix ? ' xmlns:' + prefix : " xmlns";
				buf.push(ns, '="' , uri , '"');
				visibleNamespaces.push({ prefix: prefix, namespace:uri });
			}
			serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
		}
		// add namespace for current node		
		if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
			var prefix = node.prefix||'';
			var uri = node.namespaceURI;
			var ns = prefix ? ' xmlns:' + prefix : " xmlns";
			buf.push(ns, '="' , uri , '"');
			visibleNamespaces.push({ prefix: prefix, namespace:uri });
		}
		
		if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
			buf.push('>');
			//if is cdata child node
			if(isHTML && /^script$/i.test(nodeName)){
				while(child){
					if(child.data){
						buf.push(child.data);
					}else{
						serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
					}
					child = child.nextSibling;
				}
			}else
			{
				while(child){
					serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
					child = child.nextSibling;
				}
			}
			buf.push('</',nodeName,'>');
		}else{
			buf.push('/>');
		}
		// remove added visible namespaces
		//visibleNamespaces.length = startVisibleNamespaces;
		return;
	case DOCUMENT_NODE:
	case DOCUMENT_FRAGMENT_NODE:
		var child = node.firstChild;
		while(child){
			serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
			child = child.nextSibling;
		}
		return;
	case ATTRIBUTE_NODE:
		return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
	case TEXT_NODE:
		return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
	case CDATA_SECTION_NODE:
		return buf.push( '<![CDATA[',node.data,']]>');
	case COMMENT_NODE:
		return buf.push( "<!--",node.data,"-->");
	case DOCUMENT_TYPE_NODE:
		var pubid = node.publicId;
		var sysid = node.systemId;
		buf.push('<!DOCTYPE ',node.name);
		if(pubid){
			buf.push(' PUBLIC "',pubid);
			if (sysid && sysid!='.') {
				buf.push( '" "',sysid);
			}
			buf.push('">');
		}else if(sysid && sysid!='.'){
			buf.push(' SYSTEM "',sysid,'">');
		}else{
			var sub = node.internalSubset;
			if(sub){
				buf.push(" [",sub,"]");
			}
			buf.push(">");
		}
		return;
	case PROCESSING_INSTRUCTION_NODE:
		return buf.push( "<?",node.target," ",node.data,"?>");
	case ENTITY_REFERENCE_NODE:
		return buf.push( '&',node.nodeName,';');
	//case ENTITY_NODE:
	//case NOTATION_NODE:
	default:
		buf.push('??',node.nodeName);
	}
}
function importNode(doc,node,deep){
	var node2;
	switch (node.nodeType) {
	case ELEMENT_NODE:
		node2 = node.cloneNode(false);
		node2.ownerDocument = doc;
		//var attrs = node2.attributes;
		//var len = attrs.length;
		//for(var i=0;i<len;i++){
			//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
		//}
	case DOCUMENT_FRAGMENT_NODE:
		break;
	case ATTRIBUTE_NODE:
		deep = true;
		break;
	//case ENTITY_REFERENCE_NODE:
	//case PROCESSING_INSTRUCTION_NODE:
	////case TEXT_NODE:
	//case CDATA_SECTION_NODE:
	//case COMMENT_NODE:
	//	deep = false;
	//	break;
	//case DOCUMENT_NODE:
	//case DOCUMENT_TYPE_NODE:
	//cannot be imported.
	//case ENTITY_NODE:
	//case NOTATION_NODEï¼š
	//can not hit in level3
	//default:throw e;
	}
	if(!node2){
		node2 = node.cloneNode(false);//false
	}
	node2.ownerDocument = doc;
	node2.parentNode = null;
	if(deep){
		var child = node.firstChild;
		while(child){
			node2.appendChild(importNode(doc,child,deep));
			child = child.nextSibling;
		}
	}
	return node2;
}
//
//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
//					attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
function cloneNode(doc,node,deep){
	var node2 = new node.constructor();
	for(var n in node){
		var v = node[n];
		if(typeof v != 'object' ){
			if(v != node2[n]){
				node2[n] = v;
			}
		}
	}
	if(node.childNodes){
		node2.childNodes = new NodeList();
	}
	node2.ownerDocument = doc;
	switch (node2.nodeType) {
	case ELEMENT_NODE:
		var attrs	= node.attributes;
		var attrs2	= node2.attributes = new NamedNodeMap();
		var len = attrs.length
		attrs2._ownerElement = node2;
		for(var i=0;i<len;i++){
			node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
		}
		break;;
	case ATTRIBUTE_NODE:
		deep = true;
	}
	if(deep){
		var child = node.firstChild;
		while(child){
			node2.appendChild(cloneNode(doc,child,deep));
			child = child.nextSibling;
		}
	}
	return node2;
}

function __set__(object,key,value){
	object[key] = value
}
//do dynamic
try{
	if(Object.defineProperty){
		Object.defineProperty(LiveNodeList.prototype,'length',{
			get:function(){
				_updateLiveList(this);
				return this.$$length;
			}
		});
		Object.defineProperty(Node.prototype,'textContent',{
			get:function(){
				return getTextContent(this);
			},
			set:function(data){
				switch(this.nodeType){
				case ELEMENT_NODE:
				case DOCUMENT_FRAGMENT_NODE:
					while(this.firstChild){
						this.removeChild(this.firstChild);
					}
					if(data || String(data)){
						this.appendChild(this.ownerDocument.createTextNode(data));
					}
					break;
				default:
					//TODO:
					this.data = data;
					this.value = data;
					this.nodeValue = data;
				}
			}
		})
		
		function getTextContent(node){
			switch(node.nodeType){
			case ELEMENT_NODE:
			case DOCUMENT_FRAGMENT_NODE:
				var buf = [];
				node = node.firstChild;
				while(node){
					if(node.nodeType!==7 && node.nodeType !==8){
						buf.push(getTextContent(node));
					}
					node = node.nextSibling;
				}
				return buf.join('');
			default:
				return node.nodeValue;
			}
		}
		__set__ = function(object,key,value){
			//console.log(value)
			object['$$'+key] = value
		}
	}
}catch(e){//ie8
}

//if(typeof require == 'function'){
	exports.DOMImplementation = DOMImplementation;
	exports.XMLSerializer = XMLSerializer;
//}

},{}],7:[function(require,module,exports){
//[4]   	NameStartChar	   ::=   	":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
//[4a]   	NameChar	   ::=   	NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
//[5]   	Name	   ::=   	NameStartChar (NameChar)*
var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF
var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')

//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
var S_TAG = 0;//tag name offerring
var S_ATTR = 1;//attr name offerring 
var S_ATTR_SPACE=2;//attr name end and space offer
var S_EQ = 3;//=space?
var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
var S_ATTR_END = 5;//attr value end and no space(quot end)
var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
var S_TAG_CLOSE = 7;//closed el<el />

function XMLReader(){
	
}

XMLReader.prototype = {
	parse:function(source,defaultNSMap,entityMap){
		var domBuilder = this.domBuilder;
		domBuilder.startDocument();
		_copy(defaultNSMap ,defaultNSMap = {})
		parse(source,defaultNSMap,entityMap,
				domBuilder,this.errorHandler);
		domBuilder.endDocument();
	}
}
function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
	function fixedFromCharCode(code) {
		// String.prototype.fromCharCode does not supports
		// > 2 bytes unicode chars directly
		if (code > 0xffff) {
			code -= 0x10000;
			var surrogate1 = 0xd800 + (code >> 10)
				, surrogate2 = 0xdc00 + (code & 0x3ff);

			return String.fromCharCode(surrogate1, surrogate2);
		} else {
			return String.fromCharCode(code);
		}
	}
	function entityReplacer(a){
		var k = a.slice(1,-1);
		if(k in entityMap){
			return entityMap[k]; 
		}else if(k.charAt(0) === '#'){
			return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
		}else{
			errorHandler.error('entity not found:'+a);
			return a;
		}
	}
	function appendText(end){//has some bugs
		if(end>start){
			var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
			locator&&position(start);
			domBuilder.characters(xt,0,end-start);
			start = end
		}
	}
	function position(p,m){
		while(p>=lineEnd && (m = linePattern.exec(source))){
			lineStart = m.index;
			lineEnd = lineStart + m[0].length;
			locator.lineNumber++;
			//console.log('line++:',locator,startPos,endPos)
		}
		locator.columnNumber = p-lineStart+1;
	}
	var lineStart = 0;
	var lineEnd = 0;
	var linePattern = /.*(?:\r\n?|\n)|.*$/g
	var locator = domBuilder.locator;
	
	var parseStack = [{currentNSMap:defaultNSMapCopy}]
	var closeMap = {};
	var start = 0;
	while(true){
		try{
			var tagStart = source.indexOf('<',start);
			if(tagStart<0){
				if(!source.substr(start).match(/^\s*$/)){
					var doc = domBuilder.doc;
	    			var text = doc.createTextNode(source.substr(start));
	    			doc.appendChild(text);
	    			domBuilder.currentElement = text;
				}
				return;
			}
			if(tagStart>start){
				appendText(tagStart);
			}
			switch(source.charAt(tagStart+1)){
			case '/':
				var end = source.indexOf('>',tagStart+3);
				var tagName = source.substring(tagStart+2,end);
				var config = parseStack.pop();
				if(end<0){
					
	        		tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
	        		//console.error('#@@@@@@'+tagName)
	        		errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
	        		end = tagStart+1+tagName.length;
	        	}else if(tagName.match(/\s</)){
	        		tagName = tagName.replace(/[\s<].*/,'');
	        		errorHandler.error("end tag name: "+tagName+' maybe not complete');
	        		end = tagStart+1+tagName.length;
				}
				//console.error(parseStack.length,parseStack)
				//console.error(config);
				var localNSMap = config.localNSMap;
				var endMatch = config.tagName == tagName;
				var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()
		        if(endIgnoreCaseMach){
		        	domBuilder.endElement(config.uri,config.localName,tagName);
					if(localNSMap){
						for(var prefix in localNSMap){
							domBuilder.endPrefixMapping(prefix) ;
						}
					}
					if(!endMatch){
		            	errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
					}
		        }else{
		        	parseStack.push(config)
		        }
				
				end++;
				break;
				// end elment
			case '?':// <?...?>
				locator&&position(tagStart);
				end = parseInstruction(source,tagStart,domBuilder);
				break;
			case '!':// <!doctype,<![CDATA,<!--
				locator&&position(tagStart);
				end = parseDCC(source,tagStart,domBuilder,errorHandler);
				break;
			default:
				locator&&position(tagStart);
				var el = new ElementAttributes();
				var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
				//elStartEnd
				var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
				var len = el.length;
				
				
				if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
					el.closed = true;
					if(!entityMap.nbsp){
						errorHandler.warning('unclosed xml attribute');
					}
				}
				if(locator && len){
					var locator2 = copyLocator(locator,{});
					//try{//attribute position fixed
					for(var i = 0;i<len;i++){
						var a = el[i];
						position(a.offset);
						a.locator = copyLocator(locator,{});
					}
					//}catch(e){console.error('@@@@@'+e)}
					domBuilder.locator = locator2
					if(appendElement(el,domBuilder,currentNSMap)){
						parseStack.push(el)
					}
					domBuilder.locator = locator;
				}else{
					if(appendElement(el,domBuilder,currentNSMap)){
						parseStack.push(el)
					}
				}
				
				
				
				if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
					end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)
				}else{
					end++;
				}
			}
		}catch(e){
			errorHandler.error('element parse error: '+e)
			//errorHandler.error('element parse error: '+e);
			end = -1;
			//throw e;
		}
		if(end>start){
			start = end;
		}else{
			//TODO: è¿™é‡Œæœ‰å�¯èƒ½saxå›žé€€ï¼Œæœ‰ä½�ç½®é”™è¯¯é£Žé™©
			appendText(Math.max(tagStart,start)+1);
		}
	}
}
function copyLocator(f,t){
	t.lineNumber = f.lineNumber;
	t.columnNumber = f.columnNumber;
	return t;
}

/**
 * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
 * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
 */
function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
	var attrName;
	var value;
	var p = ++start;
	var s = S_TAG;//status
	while(true){
		var c = source.charAt(p);
		switch(c){
		case '=':
			if(s === S_ATTR){//attrName
				attrName = source.slice(start,p);
				s = S_EQ;
			}else if(s === S_ATTR_SPACE){
				s = S_EQ;
			}else{
				//fatalError: equal must after attrName or space after attrName
				throw new Error('attribute equal must after attrName');
			}
			break;
		case '\'':
		case '"':
			if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
				){//equal
				if(s === S_ATTR){
					errorHandler.warning('attribute value must after "="')
					attrName = source.slice(start,p)
				}
				start = p+1;
				p = source.indexOf(c,start)
				if(p>0){
					value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
					el.add(attrName,value,start-1);
					s = S_ATTR_END;
				}else{
					//fatalError: no end quot match
					throw new Error('attribute value no end \''+c+'\' match');
				}
			}else if(s == S_ATTR_NOQUOT_VALUE){
				value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
				//console.log(attrName,value,start,p)
				el.add(attrName,value,start);
				//console.dir(el)
				errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
				start = p+1;
				s = S_ATTR_END
			}else{
				//fatalError: no equal before
				throw new Error('attribute value must after "="');
			}
			break;
		case '/':
			switch(s){
			case S_TAG:
				el.setTagName(source.slice(start,p));
			case S_ATTR_END:
			case S_TAG_SPACE:
			case S_TAG_CLOSE:
				s =S_TAG_CLOSE;
				el.closed = true;
			case S_ATTR_NOQUOT_VALUE:
			case S_ATTR:
			case S_ATTR_SPACE:
				break;
			//case S_EQ:
			default:
				throw new Error("attribute invalid close char('/')")
			}
			break;
		case ''://end document
			//throw new Error('unexpected end of input')
			errorHandler.error('unexpected end of input');
			if(s == S_TAG){
				el.setTagName(source.slice(start,p));
			}
			return p;
		case '>':
			switch(s){
			case S_TAG:
				el.setTagName(source.slice(start,p));
			case S_ATTR_END:
			case S_TAG_SPACE:
			case S_TAG_CLOSE:
				break;//normal
			case S_ATTR_NOQUOT_VALUE://Compatible state
			case S_ATTR:
				value = source.slice(start,p);
				if(value.slice(-1) === '/'){
					el.closed  = true;
					value = value.slice(0,-1)
				}
			case S_ATTR_SPACE:
				if(s === S_ATTR_SPACE){
					value = attrName;
				}
				if(s == S_ATTR_NOQUOT_VALUE){
					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
					el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start)
				}else{
					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
						errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
					}
					el.add(value,value,start)
				}
				break;
			case S_EQ:
				throw new Error('attribute value missed!!');
			}
//			console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
			return p;
		/*xml space '\x20' | #x9 | #xD | #xA; */
		case '\u0080':
			c = ' ';
		default:
			if(c<= ' '){//space
				switch(s){
				case S_TAG:
					el.setTagName(source.slice(start,p));//tagName
					s = S_TAG_SPACE;
					break;
				case S_ATTR:
					attrName = source.slice(start,p)
					s = S_ATTR_SPACE;
					break;
				case S_ATTR_NOQUOT_VALUE:
					var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
					el.add(attrName,value,start)
				case S_ATTR_END:
					s = S_TAG_SPACE;
					break;
				//case S_TAG_SPACE:
				//case S_EQ:
				//case S_ATTR_SPACE:
				//	void();break;
				//case S_TAG_CLOSE:
					//ignore warning
				}
			}else{//not space
//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
				switch(s){
				//case S_TAG:void();break;
				//case S_ATTR:void();break;
				//case S_ATTR_NOQUOT_VALUE:void();break;
				case S_ATTR_SPACE:
					var tagName =  el.tagName;
					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
						errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!')
					}
					el.add(attrName,attrName,start);
					start = p;
					s = S_ATTR;
					break;
				case S_ATTR_END:
					errorHandler.warning('attribute space is required"'+attrName+'"!!')
				case S_TAG_SPACE:
					s = S_ATTR;
					start = p;
					break;
				case S_EQ:
					s = S_ATTR_NOQUOT_VALUE;
					start = p;
					break;
				case S_TAG_CLOSE:
					throw new Error("elements closed character '/' and '>' must be connected to");
				}
			}
		}//end outer switch
		//console.log('p++',p)
		p++;
	}
}
/**
 * @return true if has new namespace define
 */
function appendElement(el,domBuilder,currentNSMap){
	var tagName = el.tagName;
	var localNSMap = null;
	//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
	var i = el.length;
	while(i--){
		var a = el[i];
		var qName = a.qName;
		var value = a.value;
		var nsp = qName.indexOf(':');
		if(nsp>0){
			var prefix = a.prefix = qName.slice(0,nsp);
			var localName = qName.slice(nsp+1);
			var nsPrefix = prefix === 'xmlns' && localName
		}else{
			localName = qName;
			prefix = null
			nsPrefix = qName === 'xmlns' && ''
		}
		//can not set prefix,because prefix !== ''
		a.localName = localName ;
		//prefix == null for no ns prefix attribute 
		if(nsPrefix !== false){//hack!!
			if(localNSMap == null){
				localNSMap = {}
				//console.log(currentNSMap,0)
				_copy(currentNSMap,currentNSMap={})
				//console.log(currentNSMap,1)
			}
			currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
			a.uri = 'http://www.w3.org/2000/xmlns/'
			domBuilder.startPrefixMapping(nsPrefix, value) 
		}
	}
	var i = el.length;
	while(i--){
		a = el[i];
		var prefix = a.prefix;
		if(prefix){//no prefix attribute has no namespace
			if(prefix === 'xml'){
				a.uri = 'http://www.w3.org/XML/1998/namespace';
			}if(prefix !== 'xmlns'){
				a.uri = currentNSMap[prefix || '']
				
				//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
			}
		}
	}
	var nsp = tagName.indexOf(':');
	if(nsp>0){
		prefix = el.prefix = tagName.slice(0,nsp);
		localName = el.localName = tagName.slice(nsp+1);
	}else{
		prefix = null;//important!!
		localName = el.localName = tagName;
	}
	//no prefix element has default namespace
	var ns = el.uri = currentNSMap[prefix || ''];
	domBuilder.startElement(ns,localName,tagName,el);
	//endPrefixMapping and startPrefixMapping have not any help for dom builder
	//localNSMap = null
	if(el.closed){
		domBuilder.endElement(ns,localName,tagName);
		if(localNSMap){
			for(prefix in localNSMap){
				domBuilder.endPrefixMapping(prefix) 
			}
		}
	}else{
		el.currentNSMap = currentNSMap;
		el.localNSMap = localNSMap;
		//parseStack.push(el);
		return true;
	}
}
function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
	if(/^(?:script|textarea)$/i.test(tagName)){
		var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
		var text = source.substring(elStartEnd+1,elEndStart);
		if(/[&<]/.test(text)){
			if(/^script$/i.test(tagName)){
				//if(!/\]\]>/.test(text)){
					//lexHandler.startCDATA();
					domBuilder.characters(text,0,text.length);
					//lexHandler.endCDATA();
					return elEndStart;
				//}
			}//}else{//text area
				text = text.replace(/&#?\w+;/g,entityReplacer);
				domBuilder.characters(text,0,text.length);
				return elEndStart;
			//}
			
		}
	}
	return elStartEnd+1;
}
function fixSelfClosed(source,elStartEnd,tagName,closeMap){
	//if(tagName in closeMap){
	var pos = closeMap[tagName];
	if(pos == null){
		//console.log(tagName)
		pos =  source.lastIndexOf('</'+tagName+'>')
		if(pos<elStartEnd){//å¿˜è®°é—­å�ˆ
			pos = source.lastIndexOf('</'+tagName)
		}
		closeMap[tagName] =pos
	}
	return pos<elStartEnd;
	//} 
}
function _copy(source,target){
	for(var n in source){target[n] = source[n]}
}
function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
	var next= source.charAt(start+2)
	switch(next){
	case '-':
		if(source.charAt(start + 3) === '-'){
			var end = source.indexOf('-->',start+4);
			//append comment source.substring(4,end)//<!--
			if(end>start){
				domBuilder.comment(source,start+4,end-start-4);
				return end+3;
			}else{
				errorHandler.error("Unclosed comment");
				return -1;
			}
		}else{
			//error
			return -1;
		}
	default:
		if(source.substr(start+3,6) == 'CDATA['){
			var end = source.indexOf(']]>',start+9);
			domBuilder.startCDATA();
			domBuilder.characters(source,start+9,end-start-9);
			domBuilder.endCDATA() 
			return end+3;
		}
		//<!DOCTYPE
		//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
		var matchs = split(source,start);
		var len = matchs.length;
		if(len>1 && /!doctype/i.test(matchs[0][0])){
			var name = matchs[1][0];
			var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0]
			var sysid = len>4 && matchs[4][0];
			var lastMatch = matchs[len-1]
			domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
					sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
			domBuilder.endDTD();
			
			return lastMatch.index+lastMatch[0].length
		}
	}
	return -1;
}



function parseInstruction(source,start,domBuilder){
	var end = source.indexOf('?>',start);
	if(end){
		var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
		if(match){
			var len = match[0].length;
			domBuilder.processingInstruction(match[1], match[2]) ;
			return end+2;
		}else{//error
			return -1;
		}
	}
	return -1;
}

/**
 * @param source
 */
function ElementAttributes(source){
	
}
ElementAttributes.prototype = {
	setTagName:function(tagName){
		if(!tagNamePattern.test(tagName)){
			throw new Error('invalid tagName:'+tagName)
		}
		this.tagName = tagName
	},
	add:function(qName,value,offset){
		if(!tagNamePattern.test(qName)){
			throw new Error('invalid attribute:'+qName)
		}
		this[this.length++] = {qName:qName,value:value,offset:offset}
	},
	length:0,
	getLocalName:function(i){return this[i].localName},
	getLocator:function(i){return this[i].locator},
	getQName:function(i){return this[i].qName},
	getURI:function(i){return this[i].uri},
	getValue:function(i){return this[i].value}
//	,getIndex:function(uri, localName)){
//		if(localName){
//			
//		}else{
//			var qName = uri
//		}
//	},
//	getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
//	getType:function(uri,localName){}
//	getType:function(i){},
}




function _set_proto_(thiz,parent){
	thiz.__proto__ = parent;
	return thiz;
}
if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
	_set_proto_ = function(thiz,parent){
		function p(){};
		p.prototype = parent;
		p = new p();
		for(parent in thiz){
			p[parent] = thiz[parent];
		}
		return p;
	}
}

function split(source,start){
	var match;
	var buf = [];
	var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
	reg.lastIndex = start;
	reg.exec(source);//skip <
	while(match = reg.exec(source)){
		buf.push(match);
		if(match[1])return buf;
	}
}

exports.XMLReader = XMLReader;


},{}]},{},[1])(1)
});
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.plist = f()}})(function(){var define,module,exports;return (function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(require,module,exports){
/**
 * Parser functions.
 */

var parserFunctions = require('./lib/parse');
Object.keys(parserFunctions).forEach(function (k) { exports[k] = parserFunctions[k]; });

/**
 * Builder functions.
 */

var builderFunctions = require('./lib/build');
Object.keys(builderFunctions).forEach(function (k) { exports[k] = builderFunctions[k]; });

},{"./lib/build":2,"./lib/parse":3}],2:[function(require,module,exports){
(function (Buffer){
/**
 * Module dependencies.
 */

var base64 = require('base64-js');
var xmlbuilder = require('xmlbuilder');

/**
 * Module exports.
 */

exports.build = build;

/**
 * Accepts a `Date` instance and returns an ISO date string.
 *
 * @param {Date} d - Date instance to serialize
 * @returns {String} ISO date string representation of `d`
 * @api private
 */

function ISODateString(d){
  function pad(n){
    return n < 10 ? '0' + n : n;
  }
  return d.getUTCFullYear()+'-'
    + pad(d.getUTCMonth()+1)+'-'
    + pad(d.getUTCDate())+'T'
    + pad(d.getUTCHours())+':'
    + pad(d.getUTCMinutes())+':'
    + pad(d.getUTCSeconds())+'Z';
}

/**
 * Returns the internal "type" of `obj` via the
 * `Object.prototype.toString()` trick.
 *
 * @param {Mixed} obj - any value
 * @returns {String} the internal "type" name
 * @api private
 */

var toString = Object.prototype.toString;
function type (obj) {
  var m = toString.call(obj).match(/\[object (.*)\]/);
  return m ? m[1] : m;
}

/**
 * Generate an XML plist string from the input object `obj`.
 *
 * @param {Object} obj - the object to convert
 * @param {Object} [opts] - optional options object
 * @returns {String} converted plist XML string
 * @api public
 */

function build (obj, opts) {
  var XMLHDR = {
    version: '1.0',
    encoding: 'UTF-8'
  };

  var XMLDTD = {
    pubid: '-//Apple//DTD PLIST 1.0//EN',
    sysid: 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'
  };

  var doc = xmlbuilder.create('plist');

  doc.dec(XMLHDR.version, XMLHDR.encoding, XMLHDR.standalone);
  doc.dtd(XMLDTD.pubid, XMLDTD.sysid);
  doc.att('version', '1.0');

  walk_obj(obj, doc);

  if (!opts) opts = {};
  // default `pretty` to `true`
  opts.pretty = opts.pretty !== false;
  return doc.end(opts);
}

/**
 * depth first, recursive traversal of a javascript object. when complete,
 * next_child contains a reference to the build XML object.
 *
 * @api private
 */

function walk_obj(next, next_child) {
  var tag_type, i, prop;
  var name = type(next);

  if ('Undefined' == name) {
    return;
  } else if (Array.isArray(next)) {
    next_child = next_child.ele('array');
    for (i = 0; i < next.length; i++) {
      walk_obj(next[i], next_child);
    }

  } else if (Buffer.isBuffer(next)) {
    next_child.ele('data').raw(next.toString('base64'));

  } else if ('Object' == name) {
    next_child = next_child.ele('dict');
    for (prop in next) {
      if (next.hasOwnProperty(prop)) {
        next_child.ele('key').txt(prop);
        walk_obj(next[prop], next_child);
      }
    }

  } else if ('Number' == name) {
    // detect if this is an integer or real
    // TODO: add an ability to force one way or another via a "cast"
    tag_type = (next % 1 === 0) ? 'integer' : 'real';
    next_child.ele(tag_type).txt(next.toString());

  } else if ('Date' == name) {
    next_child.ele('date').txt(ISODateString(new Date(next)));

  } else if ('Boolean' == name) {
    next_child.ele(next ? 'true' : 'false');

  } else if ('String' == name) {
    next_child.ele('string').txt(next);

  } else if ('ArrayBuffer' == name) {
    next_child.ele('data').raw(base64.fromByteArray(next));

  } else if (next && next.buffer && 'ArrayBuffer' == type(next.buffer)) {
    // a typed array
    next_child.ele('data').raw(base64.fromByteArray(new Uint8Array(next.buffer), next_child));

  }
}

}).call(this,{"isBuffer":require("../node_modules/is-buffer/index.js")})
},{"../node_modules/is-buffer/index.js":7,"base64-js":4,"xmlbuilder":29}],3:[function(require,module,exports){
(function (Buffer){
/**
 * Module dependencies.
 */

var DOMParser = require('xmldom').DOMParser;

/**
 * Module exports.
 */

exports.parse = parse;

var TEXT_NODE = 3;
var CDATA_NODE = 4;
var COMMENT_NODE = 8;


/**
 * We ignore raw text (usually whitespace), <!-- xml comments -->,
 * and raw CDATA nodes.
 *
 * @param {Element} node
 * @returns {Boolean}
 * @api private
 */

function shouldIgnoreNode (node) {
  return node.nodeType === TEXT_NODE
    || node.nodeType === COMMENT_NODE
    || node.nodeType === CDATA_NODE;
}

/**
 * Check if the node is empty. Some plist file has such node:
 * <key />
 * this node shoud be ignored.
 *
 * @see https://github.com/TooTallNate/plist.js/issues/66
 * @param {Element} node
 * @returns {Boolean}
 * @api private
 */
function isEmptyNode(node){
  if(!node.childNodes || node.childNodes.length === 0) {
    return true;
  } else {
    return false;
  }
}

function invariant(test, message) {
  if (!test) {
    throw new Error(message);
  }
}

/**
 * Parses a Plist XML string. Returns an Object.
 *
 * @param {String} xml - the XML String to decode
 * @returns {Mixed} the decoded value from the Plist XML
 * @api public
 */

function parse (xml) {
  var doc = new DOMParser().parseFromString(xml);
  invariant(
    doc.documentElement.nodeName === 'plist',
    'malformed document. First element should be <plist>'
  );
  var plist = parsePlistXML(doc.documentElement);

  // the root <plist> node gets interpreted as an Array,
  // so pull out the inner data first
  if (plist.length == 1) plist = plist[0];

  return plist;
}

/**
 * Convert an XML based plist document into a JSON representation.
 *
 * @param {Object} xml_node - current XML node in the plist
 * @returns {Mixed} built up JSON object
 * @api private
 */

function parsePlistXML (node) {
  var i, new_obj, key, val, new_arr, res, counter, type;

  if (!node)
    return null;

  if (node.nodeName === 'plist') {
    new_arr = [];
    if (isEmptyNode(node)) {
      return new_arr;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (!shouldIgnoreNode(node.childNodes[i])) {
        new_arr.push( parsePlistXML(node.childNodes[i]));
      }
    }
    return new_arr;
  } else if (node.nodeName === 'dict') {
    new_obj = {};
    key = null;
    counter = 0;
    if (isEmptyNode(node)) {
      return new_obj;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (shouldIgnoreNode(node.childNodes[i])) continue;
      if (counter % 2 === 0) {
        invariant(
          node.childNodes[i].nodeName === 'key',
          'Missing key while parsing <dict/>.'
        );
        key = parsePlistXML(node.childNodes[i]);
      } else {
        invariant(
          node.childNodes[i].nodeName !== 'key',
          'Unexpected key "'
            + parsePlistXML(node.childNodes[i])
            + '" while parsing <dict/>.'
        );
        new_obj[key] = parsePlistXML(node.childNodes[i]);
      }
      counter += 1;
    }
    if (counter % 2 === 1) {
      throw new Error('Missing value for "' + key + '" while parsing <dict/>');
    }
    return new_obj;

  } else if (node.nodeName === 'array') {
    new_arr = [];
    if (isEmptyNode(node)) {
      return new_arr;
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (!shouldIgnoreNode(node.childNodes[i])) {
        res = parsePlistXML(node.childNodes[i]);
        if (null != res) new_arr.push(res);
      }
    }
    return new_arr;

  } else if (node.nodeName === '#text') {
    // TODO: what should we do with text types? (CDATA sections)

  } else if (node.nodeName === 'key') {
    if (isEmptyNode(node)) {
      return '';
    }
    return node.childNodes[0].nodeValue;
  } else if (node.nodeName === 'string') {
    res = '';
    if (isEmptyNode(node)) {
      return res;
    }
    for (i=0; i < node.childNodes.length; i++) {
      var type = node.childNodes[i].nodeType;
      if (type === TEXT_NODE || type === CDATA_NODE) {
        res += node.childNodes[i].nodeValue;
      }
    }
    return res;

  } else if (node.nodeName === 'integer') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as integer.'
    );
    return parseInt(node.childNodes[0].nodeValue, 10);

  } else if (node.nodeName === 'real') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as real.'
    );
    res = '';
    for (i=0; i < node.childNodes.length; i++) {
      if (node.childNodes[i].nodeType === TEXT_NODE) {
        res += node.childNodes[i].nodeValue;
      }
    }
    return parseFloat(res);

  } else if (node.nodeName === 'data') {
    res = '';
    if (isEmptyNode(node)) {
      return Buffer.from(res, 'base64');
    }
    for (i=0; i < node.childNodes.length; i++) {
      if (node.childNodes[i].nodeType === TEXT_NODE) {
        res += node.childNodes[i].nodeValue.replace(/\s+/g, '');
      }
    }
    return Buffer.from(res, 'base64');

  } else if (node.nodeName === 'date') {
    invariant(
      !isEmptyNode(node),
      'Cannot parse "" as Date.'
    )
    return new Date(node.childNodes[0].nodeValue);

  } else if (node.nodeName === 'true') {
    return true;

  } else if (node.nodeName === 'false') {
    return false;
  }
}

}).call(this,require("buffer").Buffer)
},{"buffer":5,"xmldom":30}],4:[function(require,module,exports){
'use strict'

exports.byteLength = byteLength
exports.toByteArray = toByteArray
exports.fromByteArray = fromByteArray

var lookup = []
var revLookup = []
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array

var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, len = code.length; i < len; ++i) {
  lookup[i] = code[i]
  revLookup[code.charCodeAt(i)] = i
}

// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
revLookup['-'.charCodeAt(0)] = 62
revLookup['_'.charCodeAt(0)] = 63

function placeHoldersCount (b64) {
  var len = b64.length
  if (len % 4 > 0) {
    throw new Error('Invalid string. Length must be a multiple of 4')
  }

  // the number of equal signs (place holders)
  // if there are two placeholders, than the two characters before it
  // represent one byte
  // if there is only one, then the three characters before it represent 2 bytes
  // this is just a cheap hack to not do indexOf twice
  return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
}

function byteLength (b64) {
  // base64 is 4/3 + up to two characters of the original data
  return (b64.length * 3 / 4) - placeHoldersCount(b64)
}

function toByteArray (b64) {
  var i, l, tmp, placeHolders, arr
  var len = b64.length
  placeHolders = placeHoldersCount(b64)

  arr = new Arr((len * 3 / 4) - placeHolders)

  // if there are placeholders, only get up to the last complete 4 chars
  l = placeHolders > 0 ? len - 4 : len

  var L = 0

  for (i = 0; i < l; i += 4) {
    tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
    arr[L++] = (tmp >> 16) & 0xFF
    arr[L++] = (tmp >> 8) & 0xFF
    arr[L++] = tmp & 0xFF
  }

  if (placeHolders === 2) {
    tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
    arr[L++] = tmp & 0xFF
  } else if (placeHolders === 1) {
    tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
    arr[L++] = (tmp >> 8) & 0xFF
    arr[L++] = tmp & 0xFF
  }

  return arr
}

function tripletToBase64 (num) {
  return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
}

function encodeChunk (uint8, start, end) {
  var tmp
  var output = []
  for (var i = start; i < end; i += 3) {
    tmp = ((uint8[i] << 16) & 0xFF0000) + ((uint8[i + 1] << 8) & 0xFF00) + (uint8[i + 2] & 0xFF)
    output.push(tripletToBase64(tmp))
  }
  return output.join('')
}

function fromByteArray (uint8) {
  var tmp
  var len = uint8.length
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  var output = ''
  var parts = []
  var maxChunkLength = 16383 // must be multiple of 3

  // go through the array every three bytes, we'll deal with trailing stuff later
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
  }

  // pad the end with zeros, but make sure to not forget the extra bytes
  if (extraBytes === 1) {
    tmp = uint8[len - 1]
    output += lookup[tmp >> 2]
    output += lookup[(tmp << 4) & 0x3F]
    output += '=='
  } else if (extraBytes === 2) {
    tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
    output += lookup[tmp >> 10]
    output += lookup[(tmp >> 4) & 0x3F]
    output += lookup[(tmp << 2) & 0x3F]
    output += '='
  }

  parts.push(output)

  return parts.join('')
}

},{}],5:[function(require,module,exports){
/*!
 * The buffer module from node.js, for the browser.
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */
/* eslint-disable no-proto */

'use strict'

var base64 = require('base64-js')
var ieee754 = require('ieee754')

exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50

var K_MAX_LENGTH = 0x7fffffff
exports.kMaxLength = K_MAX_LENGTH

/**
 * If `Buffer.TYPED_ARRAY_SUPPORT`:
 *   === true    Use Uint8Array implementation (fastest)
 *   === false   Print warning and recommend using `buffer` v4.x which has an Object
 *               implementation (most compatible, even IE6)
 *
 * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
 * Opera 11.6+, iOS 4.2+.
 *
 * We report that the browser does not support typed arrays if the are not subclassable
 * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
 * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
 * for __proto__ and has a buggy typed array implementation.
 */
Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()

if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
    typeof console.error === 'function') {
  console.error(
    'This browser lacks typed array (Uint8Array) support which is required by ' +
    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
  )
}

function typedArraySupport () {
  // Can typed array instances can be augmented?
  try {
    var arr = new Uint8Array(1)
    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
    return arr.foo() === 42
  } catch (e) {
    return false
  }
}

Object.defineProperty(Buffer.prototype, 'parent', {
  get: function () {
    if (!(this instanceof Buffer)) {
      return undefined
    }
    return this.buffer
  }
})

Object.defineProperty(Buffer.prototype, 'offset', {
  get: function () {
    if (!(this instanceof Buffer)) {
      return undefined
    }
    return this.byteOffset
  }
})

function createBuffer (length) {
  if (length > K_MAX_LENGTH) {
    throw new RangeError('Invalid typed array length')
  }
  // Return an augmented `Uint8Array` instance
  var buf = new Uint8Array(length)
  buf.__proto__ = Buffer.prototype
  return buf
}

/**
 * The Buffer constructor returns instances of `Uint8Array` that have their
 * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
 * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
 * and the `Uint8Array` methods. Square bracket notation works as expected -- it
 * returns a single octet.
 *
 * The `Uint8Array` prototype remains unmodified.
 */

function Buffer (arg, encodingOrOffset, length) {
  // Common case.
  if (typeof arg === 'number') {
    if (typeof encodingOrOffset === 'string') {
      throw new Error(
        'If encoding is specified then the first argument must be a string'
      )
    }
    return allocUnsafe(arg)
  }
  return from(arg, encodingOrOffset, length)
}

// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
if (typeof Symbol !== 'undefined' && Symbol.species &&
    Buffer[Symbol.species] === Buffer) {
  Object.defineProperty(Buffer, Symbol.species, {
    value: null,
    configurable: true,
    enumerable: false,
    writable: false
  })
}

Buffer.poolSize = 8192 // not used by this implementation

function from (value, encodingOrOffset, length) {
  if (typeof value === 'number') {
    throw new TypeError('"value" argument must not be a number')
  }

  if (isArrayBuffer(value) || (value && isArrayBuffer(value.buffer))) {
    return fromArrayBuffer(value, encodingOrOffset, length)
  }

  if (typeof value === 'string') {
    return fromString(value, encodingOrOffset)
  }

  return fromObject(value)
}

/**
 * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
 * if value is a number.
 * Buffer.from(str[, encoding])
 * Buffer.from(array)
 * Buffer.from(buffer)
 * Buffer.from(arrayBuffer[, byteOffset[, length]])
 **/
Buffer.from = function (value, encodingOrOffset, length) {
  return from(value, encodingOrOffset, length)
}

// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
// https://github.com/feross/buffer/pull/148
Buffer.prototype.__proto__ = Uint8Array.prototype
Buffer.__proto__ = Uint8Array

function assertSize (size) {
  if (typeof size !== 'number') {
    throw new TypeError('"size" argument must be of type number')
  } else if (size < 0) {
    throw new RangeError('"size" argument must not be negative')
  }
}

function alloc (size, fill, encoding) {
  assertSize(size)
  if (size <= 0) {
    return createBuffer(size)
  }
  if (fill !== undefined) {
    // Only pay attention to encoding if it's a string. This
    // prevents accidentally sending in a number that would
    // be interpretted as a start offset.
    return typeof encoding === 'string'
      ? createBuffer(size).fill(fill, encoding)
      : createBuffer(size).fill(fill)
  }
  return createBuffer(size)
}

/**
 * Creates a new filled Buffer instance.
 * alloc(size[, fill[, encoding]])
 **/
Buffer.alloc = function (size, fill, encoding) {
  return alloc(size, fill, encoding)
}

function allocUnsafe (size) {
  assertSize(size)
  return createBuffer(size < 0 ? 0 : checked(size) | 0)
}

/**
 * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
 * */
Buffer.allocUnsafe = function (size) {
  return allocUnsafe(size)
}
/**
 * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
 */
Buffer.allocUnsafeSlow = function (size) {
  return allocUnsafe(size)
}

function fromString (string, encoding) {
  if (typeof encoding !== 'string' || encoding === '') {
    encoding = 'utf8'
  }

  if (!Buffer.isEncoding(encoding)) {
    throw new TypeError('Unknown encoding: ' + encoding)
  }

  var length = byteLength(string, encoding) | 0
  var buf = createBuffer(length)

  var actual = buf.write(string, encoding)

  if (actual !== length) {
    // Writing a hex string, for example, that contains invalid characters will
    // cause everything after the first invalid character to be ignored. (e.g.
    // 'abxxcd' will be treated as 'ab')
    buf = buf.slice(0, actual)
  }

  return buf
}

function fromArrayLike (array) {
  var length = array.length < 0 ? 0 : checked(array.length) | 0
  var buf = createBuffer(length)
  for (var i = 0; i < length; i += 1) {
    buf[i] = array[i] & 255
  }
  return buf
}

function fromArrayBuffer (array, byteOffset, length) {
  if (byteOffset < 0 || array.byteLength < byteOffset) {
    throw new RangeError('"offset" is outside of buffer bounds')
  }

  if (array.byteLength < byteOffset + (length || 0)) {
    throw new RangeError('"length" is outside of buffer bounds')
  }

  var buf
  if (byteOffset === undefined && length === undefined) {
    buf = new Uint8Array(array)
  } else if (length === undefined) {
    buf = new Uint8Array(array, byteOffset)
  } else {
    buf = new Uint8Array(array, byteOffset, length)
  }

  // Return an augmented `Uint8Array` instance
  buf.__proto__ = Buffer.prototype
  return buf
}

function fromObject (obj) {
  if (Buffer.isBuffer(obj)) {
    var len = checked(obj.length) | 0
    var buf = createBuffer(len)

    if (buf.length === 0) {
      return buf
    }

    obj.copy(buf, 0, 0, len)
    return buf
  }

  if (obj) {
    if (ArrayBuffer.isView(obj) || 'length' in obj) {
      if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
        return createBuffer(0)
      }
      return fromArrayLike(obj)
    }

    if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
      return fromArrayLike(obj.data)
    }
  }

  throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object.')
}

function checked (length) {
  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
  // length is NaN (which is otherwise coerced to zero.)
  if (length >= K_MAX_LENGTH) {
    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
  }
  return length | 0
}

function SlowBuffer (length) {
  if (+length != length) { // eslint-disable-line eqeqeq
    length = 0
  }
  return Buffer.alloc(+length)
}

Buffer.isBuffer = function isBuffer (b) {
  return b != null && b._isBuffer === true
}

Buffer.compare = function compare (a, b) {
  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
    throw new TypeError('Arguments must be Buffers')
  }

  if (a === b) return 0

  var x = a.length
  var y = b.length

  for (var i = 0, len = Math.min(x, y); i < len; ++i) {
    if (a[i] !== b[i]) {
      x = a[i]
      y = b[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

Buffer.isEncoding = function isEncoding (encoding) {
  switch (String(encoding).toLowerCase()) {
    case 'hex':
    case 'utf8':
    case 'utf-8':
    case 'ascii':
    case 'latin1':
    case 'binary':
    case 'base64':
    case 'ucs2':
    case 'ucs-2':
    case 'utf16le':
    case 'utf-16le':
      return true
    default:
      return false
  }
}

Buffer.concat = function concat (list, length) {
  if (!Array.isArray(list)) {
    throw new TypeError('"list" argument must be an Array of Buffers')
  }

  if (list.length === 0) {
    return Buffer.alloc(0)
  }

  var i
  if (length === undefined) {
    length = 0
    for (i = 0; i < list.length; ++i) {
      length += list[i].length
    }
  }

  var buffer = Buffer.allocUnsafe(length)
  var pos = 0
  for (i = 0; i < list.length; ++i) {
    var buf = list[i]
    if (ArrayBuffer.isView(buf)) {
      buf = Buffer.from(buf)
    }
    if (!Buffer.isBuffer(buf)) {
      throw new TypeError('"list" argument must be an Array of Buffers')
    }
    buf.copy(buffer, pos)
    pos += buf.length
  }
  return buffer
}

function byteLength (string, encoding) {
  if (Buffer.isBuffer(string)) {
    return string.length
  }
  if (ArrayBuffer.isView(string) || isArrayBuffer(string)) {
    return string.byteLength
  }
  if (typeof string !== 'string') {
    string = '' + string
  }

  var len = string.length
  if (len === 0) return 0

  // Use a for loop to avoid recursion
  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'ascii':
      case 'latin1':
      case 'binary':
        return len
      case 'utf8':
      case 'utf-8':
      case undefined:
        return utf8ToBytes(string).length
      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return len * 2
      case 'hex':
        return len >>> 1
      case 'base64':
        return base64ToBytes(string).length
      default:
        if (loweredCase) return utf8ToBytes(string).length // assume utf8
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}
Buffer.byteLength = byteLength

function slowToString (encoding, start, end) {
  var loweredCase = false

  // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
  // property of a typed array.

  // This behaves neither like String nor Uint8Array in that we set start/end
  // to their upper/lower bounds if the value passed is out of range.
  // undefined is handled specially as per ECMA-262 6th Edition,
  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
  if (start === undefined || start < 0) {
    start = 0
  }
  // Return early if start > this.length. Done here to prevent potential uint32
  // coercion fail below.
  if (start > this.length) {
    return ''
  }

  if (end === undefined || end > this.length) {
    end = this.length
  }

  if (end <= 0) {
    return ''
  }

  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
  end >>>= 0
  start >>>= 0

  if (end <= start) {
    return ''
  }

  if (!encoding) encoding = 'utf8'

  while (true) {
    switch (encoding) {
      case 'hex':
        return hexSlice(this, start, end)

      case 'utf8':
      case 'utf-8':
        return utf8Slice(this, start, end)

      case 'ascii':
        return asciiSlice(this, start, end)

      case 'latin1':
      case 'binary':
        return latin1Slice(this, start, end)

      case 'base64':
        return base64Slice(this, start, end)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return utf16leSlice(this, start, end)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = (encoding + '').toLowerCase()
        loweredCase = true
    }
  }
}

// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
// reliably in a browserify context because there could be multiple different
// copies of the 'buffer' package in use. This method works even for Buffer
// instances that were created from another copy of the `buffer` package.
// See: https://github.com/feross/buffer/issues/154
Buffer.prototype._isBuffer = true

function swap (b, n, m) {
  var i = b[n]
  b[n] = b[m]
  b[m] = i
}

Buffer.prototype.swap16 = function swap16 () {
  var len = this.length
  if (len % 2 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 16-bits')
  }
  for (var i = 0; i < len; i += 2) {
    swap(this, i, i + 1)
  }
  return this
}

Buffer.prototype.swap32 = function swap32 () {
  var len = this.length
  if (len % 4 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 32-bits')
  }
  for (var i = 0; i < len; i += 4) {
    swap(this, i, i + 3)
    swap(this, i + 1, i + 2)
  }
  return this
}

Buffer.prototype.swap64 = function swap64 () {
  var len = this.length
  if (len % 8 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 64-bits')
  }
  for (var i = 0; i < len; i += 8) {
    swap(this, i, i + 7)
    swap(this, i + 1, i + 6)
    swap(this, i + 2, i + 5)
    swap(this, i + 3, i + 4)
  }
  return this
}

Buffer.prototype.toString = function toString () {
  var length = this.length
  if (length === 0) return ''
  if (arguments.length === 0) return utf8Slice(this, 0, length)
  return slowToString.apply(this, arguments)
}

Buffer.prototype.toLocaleString = Buffer.prototype.toString

Buffer.prototype.equals = function equals (b) {
  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
  if (this === b) return true
  return Buffer.compare(this, b) === 0
}

Buffer.prototype.inspect = function inspect () {
  var str = ''
  var max = exports.INSPECT_MAX_BYTES
  if (this.length > 0) {
    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
    if (this.length > max) str += ' ... '
  }
  return '<Buffer ' + str + '>'
}

Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
  if (!Buffer.isBuffer(target)) {
    throw new TypeError('Argument must be a Buffer')
  }

  if (start === undefined) {
    start = 0
  }
  if (end === undefined) {
    end = target ? target.length : 0
  }
  if (thisStart === undefined) {
    thisStart = 0
  }
  if (thisEnd === undefined) {
    thisEnd = this.length
  }

  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
    throw new RangeError('out of range index')
  }

  if (thisStart >= thisEnd && start >= end) {
    return 0
  }
  if (thisStart >= thisEnd) {
    return -1
  }
  if (start >= end) {
    return 1
  }

  start >>>= 0
  end >>>= 0
  thisStart >>>= 0
  thisEnd >>>= 0

  if (this === target) return 0

  var x = thisEnd - thisStart
  var y = end - start
  var len = Math.min(x, y)

  var thisCopy = this.slice(thisStart, thisEnd)
  var targetCopy = target.slice(start, end)

  for (var i = 0; i < len; ++i) {
    if (thisCopy[i] !== targetCopy[i]) {
      x = thisCopy[i]
      y = targetCopy[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
//
// Arguments:
// - buffer - a Buffer to search
// - val - a string, Buffer, or number
// - byteOffset - an index into `buffer`; will be clamped to an int32
// - encoding - an optional encoding, relevant is val is a string
// - dir - true for indexOf, false for lastIndexOf
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  // Empty buffer means no match
  if (buffer.length === 0) return -1

  // Normalize byteOffset
  if (typeof byteOffset === 'string') {
    encoding = byteOffset
    byteOffset = 0
  } else if (byteOffset > 0x7fffffff) {
    byteOffset = 0x7fffffff
  } else if (byteOffset < -0x80000000) {
    byteOffset = -0x80000000
  }
  byteOffset = +byteOffset  // Coerce to Number.
  if (numberIsNaN(byteOffset)) {
    // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
    byteOffset = dir ? 0 : (buffer.length - 1)
  }

  // Normalize byteOffset: negative offsets start from the end of the buffer
  if (byteOffset < 0) byteOffset = buffer.length + byteOffset
  if (byteOffset >= buffer.length) {
    if (dir) return -1
    else byteOffset = buffer.length - 1
  } else if (byteOffset < 0) {
    if (dir) byteOffset = 0
    else return -1
  }

  // Normalize val
  if (typeof val === 'string') {
    val = Buffer.from(val, encoding)
  }

  // Finally, search either indexOf (if dir is true) or lastIndexOf
  if (Buffer.isBuffer(val)) {
    // Special case: looking for empty string/buffer always fails
    if (val.length === 0) {
      return -1
    }
    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
  } else if (typeof val === 'number') {
    val = val & 0xFF // Search for a byte value [0-255]
    if (typeof Uint8Array.prototype.indexOf === 'function') {
      if (dir) {
        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
      } else {
        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
      }
    }
    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
  }

  throw new TypeError('val must be string, number or Buffer')
}

function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  var indexSize = 1
  var arrLength = arr.length
  var valLength = val.length

  if (encoding !== undefined) {
    encoding = String(encoding).toLowerCase()
    if (encoding === 'ucs2' || encoding === 'ucs-2' ||
        encoding === 'utf16le' || encoding === 'utf-16le') {
      if (arr.length < 2 || val.length < 2) {
        return -1
      }
      indexSize = 2
      arrLength /= 2
      valLength /= 2
      byteOffset /= 2
    }
  }

  function read (buf, i) {
    if (indexSize === 1) {
      return buf[i]
    } else {
      return buf.readUInt16BE(i * indexSize)
    }
  }

  var i
  if (dir) {
    var foundIndex = -1
    for (i = byteOffset; i < arrLength; i++) {
      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
        if (foundIndex === -1) foundIndex = i
        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
      } else {
        if (foundIndex !== -1) i -= i - foundIndex
        foundIndex = -1
      }
    }
  } else {
    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
    for (i = byteOffset; i >= 0; i--) {
      var found = true
      for (var j = 0; j < valLength; j++) {
        if (read(arr, i + j) !== read(val, j)) {
          found = false
          break
        }
      }
      if (found) return i
    }
  }

  return -1
}

Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
  return this.indexOf(val, byteOffset, encoding) !== -1
}

Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
}

Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
}

function hexWrite (buf, string, offset, length) {
  offset = Number(offset) || 0
  var remaining = buf.length - offset
  if (!length) {
    length = remaining
  } else {
    length = Number(length)
    if (length > remaining) {
      length = remaining
    }
  }

  var strLen = string.length

  if (length > strLen / 2) {
    length = strLen / 2
  }
  for (var i = 0; i < length; ++i) {
    var parsed = parseInt(string.substr(i * 2, 2), 16)
    if (numberIsNaN(parsed)) return i
    buf[offset + i] = parsed
  }
  return i
}

function utf8Write (buf, string, offset, length) {
  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}

function asciiWrite (buf, string, offset, length) {
  return blitBuffer(asciiToBytes(string), buf, offset, length)
}

function latin1Write (buf, string, offset, length) {
  return asciiWrite(buf, string, offset, length)
}

function base64Write (buf, string, offset, length) {
  return blitBuffer(base64ToBytes(string), buf, offset, length)
}

function ucs2Write (buf, string, offset, length) {
  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}

Buffer.prototype.write = function write (string, offset, length, encoding) {
  // Buffer#write(string)
  if (offset === undefined) {
    encoding = 'utf8'
    length = this.length
    offset = 0
  // Buffer#write(string, encoding)
  } else if (length === undefined && typeof offset === 'string') {
    encoding = offset
    length = this.length
    offset = 0
  // Buffer#write(string, offset[, length][, encoding])
  } else if (isFinite(offset)) {
    offset = offset >>> 0
    if (isFinite(length)) {
      length = length >>> 0
      if (encoding === undefined) encoding = 'utf8'
    } else {
      encoding = length
      length = undefined
    }
  } else {
    throw new Error(
      'Buffer.write(string, encoding, offset[, length]) is no longer supported'
    )
  }

  var remaining = this.length - offset
  if (length === undefined || length > remaining) length = remaining

  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
    throw new RangeError('Attempt to write outside buffer bounds')
  }

  if (!encoding) encoding = 'utf8'

  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'hex':
        return hexWrite(this, string, offset, length)

      case 'utf8':
      case 'utf-8':
        return utf8Write(this, string, offset, length)

      case 'ascii':
        return asciiWrite(this, string, offset, length)

      case 'latin1':
      case 'binary':
        return latin1Write(this, string, offset, length)

      case 'base64':
        // Warning: maxLength not taken into account in base64Write
        return base64Write(this, string, offset, length)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return ucs2Write(this, string, offset, length)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}

Buffer.prototype.toJSON = function toJSON () {
  return {
    type: 'Buffer',
    data: Array.prototype.slice.call(this._arr || this, 0)
  }
}

function base64Slice (buf, start, end) {
  if (start === 0 && end === buf.length) {
    return base64.fromByteArray(buf)
  } else {
    return base64.fromByteArray(buf.slice(start, end))
  }
}

function utf8Slice (buf, start, end) {
  end = Math.min(buf.length, end)
  var res = []

  var i = start
  while (i < end) {
    var firstByte = buf[i]
    var codePoint = null
    var bytesPerSequence = (firstByte > 0xEF) ? 4
      : (firstByte > 0xDF) ? 3
      : (firstByte > 0xBF) ? 2
      : 1

    if (i + bytesPerSequence <= end) {
      var secondByte, thirdByte, fourthByte, tempCodePoint

      switch (bytesPerSequence) {
        case 1:
          if (firstByte < 0x80) {
            codePoint = firstByte
          }
          break
        case 2:
          secondByte = buf[i + 1]
          if ((secondByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
            if (tempCodePoint > 0x7F) {
              codePoint = tempCodePoint
            }
          }
          break
        case 3:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
              codePoint = tempCodePoint
            }
          }
          break
        case 4:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          fourthByte = buf[i + 3]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
              codePoint = tempCodePoint
            }
          }
      }
    }

    if (codePoint === null) {
      // we did not generate a valid codePoint so insert a
      // replacement char (U+FFFD) and advance only 1 byte
      codePoint = 0xFFFD
      bytesPerSequence = 1
    } else if (codePoint > 0xFFFF) {
      // encode to utf16 (surrogate pair dance)
      codePoint -= 0x10000
      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
      codePoint = 0xDC00 | codePoint & 0x3FF
    }

    res.push(codePoint)
    i += bytesPerSequence
  }

  return decodeCodePointsArray(res)
}

// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000

function decodeCodePointsArray (codePoints) {
  var len = codePoints.length
  if (len <= MAX_ARGUMENTS_LENGTH) {
    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
  }

  // Decode in chunks to avoid "call stack size exceeded".
  var res = ''
  var i = 0
  while (i < len) {
    res += String.fromCharCode.apply(
      String,
      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
    )
  }
  return res
}

function asciiSlice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i] & 0x7F)
  }
  return ret
}

function latin1Slice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i])
  }
  return ret
}

function hexSlice (buf, start, end) {
  var len = buf.length

  if (!start || start < 0) start = 0
  if (!end || end < 0 || end > len) end = len

  var out = ''
  for (var i = start; i < end; ++i) {
    out += toHex(buf[i])
  }
  return out
}

function utf16leSlice (buf, start, end) {
  var bytes = buf.slice(start, end)
  var res = ''
  for (var i = 0; i < bytes.length; i += 2) {
    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
  }
  return res
}

Buffer.prototype.slice = function slice (start, end) {
  var len = this.length
  start = ~~start
  end = end === undefined ? len : ~~end

  if (start < 0) {
    start += len
    if (start < 0) start = 0
  } else if (start > len) {
    start = len
  }

  if (end < 0) {
    end += len
    if (end < 0) end = 0
  } else if (end > len) {
    end = len
  }

  if (end < start) end = start

  var newBuf = this.subarray(start, end)
  // Return an augmented `Uint8Array` instance
  newBuf.__proto__ = Buffer.prototype
  return newBuf
}

/*
 * Need to make sure that buffer isn't trying to write out of bounds.
 */
function checkOffset (offset, ext, length) {
  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}

Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }

  return val
}

Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    checkOffset(offset, byteLength, this.length)
  }

  var val = this[offset + --byteLength]
  var mul = 1
  while (byteLength > 0 && (mul *= 0x100)) {
    val += this[offset + --byteLength] * mul
  }

  return val
}

Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  return this[offset]
}

Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return this[offset] | (this[offset + 1] << 8)
}

Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return (this[offset] << 8) | this[offset + 1]
}

Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return ((this[offset]) |
      (this[offset + 1] << 8) |
      (this[offset + 2] << 16)) +
      (this[offset + 3] * 0x1000000)
}

Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] * 0x1000000) +
    ((this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    this[offset + 3])
}

Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var i = byteLength
  var mul = 1
  var val = this[offset + --i]
  while (i > 0 && (mul *= 0x100)) {
    val += this[offset + --i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  if (!(this[offset] & 0x80)) return (this[offset])
  return ((0xff - this[offset] + 1) * -1)
}

Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset] | (this[offset + 1] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset + 1] | (this[offset] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset]) |
    (this[offset + 1] << 8) |
    (this[offset + 2] << 16) |
    (this[offset + 3] << 24)
}

Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] << 24) |
    (this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    (this[offset + 3])
}

Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, true, 23, 4)
}

Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, false, 23, 4)
}

Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, true, 52, 8)
}

Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, false, 52, 8)
}

function checkInt (buf, value, offset, ext, max, min) {
  if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
  if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
}

Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var mul = 1
  var i = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var i = byteLength - 1
  var mul = 1
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset + 3] = (value >>> 24)
  this[offset + 2] = (value >>> 16)
  this[offset + 1] = (value >>> 8)
  this[offset] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = 0
  var mul = 1
  var sub = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = byteLength - 1
  var mul = 1
  var sub = 0
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
  if (value < 0) value = 0xff + value + 1
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  this[offset + 2] = (value >>> 16)
  this[offset + 3] = (value >>> 24)
  return offset + 4
}

Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  if (value < 0) value = 0xffffffff + value + 1
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

function checkIEEE754 (buf, value, offset, ext, max, min) {
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
  if (offset < 0) throw new RangeError('Index out of range')
}

function writeFloat (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
  }
  ieee754.write(buf, value, offset, littleEndian, 23, 4)
  return offset + 4
}

Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
  return writeFloat(this, value, offset, true, noAssert)
}

Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
  return writeFloat(this, value, offset, false, noAssert)
}

function writeDouble (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
  }
  ieee754.write(buf, value, offset, littleEndian, 52, 8)
  return offset + 8
}

Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
  return writeDouble(this, value, offset, true, noAssert)
}

Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
  return writeDouble(this, value, offset, false, noAssert)
}

// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
  if (!start) start = 0
  if (!end && end !== 0) end = this.length
  if (targetStart >= target.length) targetStart = target.length
  if (!targetStart) targetStart = 0
  if (end > 0 && end < start) end = start

  // Copy 0 bytes; we're done
  if (end === start) return 0
  if (target.length === 0 || this.length === 0) return 0

  // Fatal error conditions
  if (targetStart < 0) {
    throw new RangeError('targetStart out of bounds')
  }
  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
  if (end < 0) throw new RangeError('sourceEnd out of bounds')

  // Are we oob?
  if (end > this.length) end = this.length
  if (target.length - targetStart < end - start) {
    end = target.length - targetStart + start
  }

  var len = end - start

  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
    // Use built-in when available, missing from IE11
    this.copyWithin(targetStart, start, end)
  } else if (this === target && start < targetStart && targetStart < end) {
    // descending copy from end
    for (var i = len - 1; i >= 0; --i) {
      target[i + targetStart] = this[i + start]
    }
  } else {
    Uint8Array.prototype.set.call(
      target,
      this.subarray(start, end),
      targetStart
    )
  }

  return len
}

// Usage:
//    buffer.fill(number[, offset[, end]])
//    buffer.fill(buffer[, offset[, end]])
//    buffer.fill(string[, offset[, end]][, encoding])
Buffer.prototype.fill = function fill (val, start, end, encoding) {
  // Handle string cases:
  if (typeof val === 'string') {
    if (typeof start === 'string') {
      encoding = start
      start = 0
      end = this.length
    } else if (typeof end === 'string') {
      encoding = end
      end = this.length
    }
    if (encoding !== undefined && typeof encoding !== 'string') {
      throw new TypeError('encoding must be a string')
    }
    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
      throw new TypeError('Unknown encoding: ' + encoding)
    }
    if (val.length === 1) {
      var code = val.charCodeAt(0)
      if ((encoding === 'utf8' && code < 128) ||
          encoding === 'latin1') {
        // Fast path: If `val` fits into a single byte, use that numeric value.
        val = code
      }
    }
  } else if (typeof val === 'number') {
    val = val & 255
  }

  // Invalid ranges are not set to a default, so can range check early.
  if (start < 0 || this.length < start || this.length < end) {
    throw new RangeError('Out of range index')
  }

  if (end <= start) {
    return this
  }

  start = start >>> 0
  end = end === undefined ? this.length : end >>> 0

  if (!val) val = 0

  var i
  if (typeof val === 'number') {
    for (i = start; i < end; ++i) {
      this[i] = val
    }
  } else {
    var bytes = Buffer.isBuffer(val)
      ? val
      : new Buffer(val, encoding)
    var len = bytes.length
    if (len === 0) {
      throw new TypeError('The value "' + val +
        '" is invalid for argument "value"')
    }
    for (i = 0; i < end - start; ++i) {
      this[i + start] = bytes[i % len]
    }
  }

  return this
}

// HELPER FUNCTIONS
// ================

var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g

function base64clean (str) {
  // Node takes equal signs as end of the Base64 encoding
  str = str.split('=')[0]
  // Node strips out invalid characters like \n and \t from the string, base64-js does not
  str = str.trim().replace(INVALID_BASE64_RE, '')
  // Node converts strings with length < 2 to ''
  if (str.length < 2) return ''
  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
  while (str.length % 4 !== 0) {
    str = str + '='
  }
  return str
}

function toHex (n) {
  if (n < 16) return '0' + n.toString(16)
  return n.toString(16)
}

function utf8ToBytes (string, units) {
  units = units || Infinity
  var codePoint
  var length = string.length
  var leadSurrogate = null
  var bytes = []

  for (var i = 0; i < length; ++i) {
    codePoint = string.charCodeAt(i)

    // is surrogate component
    if (codePoint > 0xD7FF && codePoint < 0xE000) {
      // last char was a lead
      if (!leadSurrogate) {
        // no lead yet
        if (codePoint > 0xDBFF) {
          // unexpected trail
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        } else if (i + 1 === length) {
          // unpaired lead
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        }

        // valid lead
        leadSurrogate = codePoint

        continue
      }

      // 2 leads in a row
      if (codePoint < 0xDC00) {
        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
        leadSurrogate = codePoint
        continue
      }

      // valid surrogate pair
      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
    } else if (leadSurrogate) {
      // valid bmp char, but last char was a lead
      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
    }

    leadSurrogate = null

    // encode utf8
    if (codePoint < 0x80) {
      if ((units -= 1) < 0) break
      bytes.push(codePoint)
    } else if (codePoint < 0x800) {
      if ((units -= 2) < 0) break
      bytes.push(
        codePoint >> 0x6 | 0xC0,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x10000) {
      if ((units -= 3) < 0) break
      bytes.push(
        codePoint >> 0xC | 0xE0,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x110000) {
      if ((units -= 4) < 0) break
      bytes.push(
        codePoint >> 0x12 | 0xF0,
        codePoint >> 0xC & 0x3F | 0x80,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else {
      throw new Error('Invalid code point')
    }
  }

  return bytes
}

function asciiToBytes (str) {
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    // Node's code seems to be doing this and not & 0x7F..
    byteArray.push(str.charCodeAt(i) & 0xFF)
  }
  return byteArray
}

function utf16leToBytes (str, units) {
  var c, hi, lo
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    if ((units -= 2) < 0) break

    c = str.charCodeAt(i)
    hi = c >> 8
    lo = c % 256
    byteArray.push(lo)
    byteArray.push(hi)
  }

  return byteArray
}

function base64ToBytes (str) {
  return base64.toByteArray(base64clean(str))
}

function blitBuffer (src, dst, offset, length) {
  for (var i = 0; i < length; ++i) {
    if ((i + offset >= dst.length) || (i >= src.length)) break
    dst[i + offset] = src[i]
  }
  return i
}

// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check
// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166
function isArrayBuffer (obj) {
  return obj instanceof ArrayBuffer ||
    (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' &&
      typeof obj.byteLength === 'number')
}

function numberIsNaN (obj) {
  return obj !== obj // eslint-disable-line no-self-compare
}

},{"base64-js":4,"ieee754":6}],6:[function(require,module,exports){
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
  var e, m
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var nBits = -7
  var i = isLE ? (nBytes - 1) : 0
  var d = isLE ? -1 : 1
  var s = buffer[offset + i]

  i += d

  e = s & ((1 << (-nBits)) - 1)
  s >>= (-nBits)
  nBits += eLen
  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  m = e & ((1 << (-nBits)) - 1)
  e >>= (-nBits)
  nBits += mLen
  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  if (e === 0) {
    e = 1 - eBias
  } else if (e === eMax) {
    return m ? NaN : ((s ? -1 : 1) * Infinity)
  } else {
    m = m + Math.pow(2, mLen)
    e = e - eBias
  }
  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
}

exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
  var e, m, c
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
  var i = isLE ? 0 : (nBytes - 1)
  var d = isLE ? 1 : -1
  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0

  value = Math.abs(value)

  if (isNaN(value) || value === Infinity) {
    m = isNaN(value) ? 1 : 0
    e = eMax
  } else {
    e = Math.floor(Math.log(value) / Math.LN2)
    if (value * (c = Math.pow(2, -e)) < 1) {
      e--
      c *= 2
    }
    if (e + eBias >= 1) {
      value += rt / c
    } else {
      value += rt * Math.pow(2, 1 - eBias)
    }
    if (value * c >= 2) {
      e++
      c /= 2
    }

    if (e + eBias >= eMax) {
      m = 0
      e = eMax
    } else if (e + eBias >= 1) {
      m = ((value * c) - 1) * Math.pow(2, mLen)
      e = e + eBias
    } else {
      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
      e = 0
    }
  }

  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}

  e = (e << mLen) | m
  eLen += mLen
  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}

  buffer[offset + i - d] |= s * 128
}

},{}],7:[function(require,module,exports){
/*!
 * Determine if an object is a Buffer
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */

// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
module.exports = function (obj) {
  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
}

function isBuffer (obj) {
  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
}

// For Node v0.10 support. Remove this eventually.
function isSlowBuffer (obj) {
  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
}

},{}],8:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var assign, isArray, isEmpty, isFunction, isObject, isPlainObject,
    slice = [].slice,
    hasProp = {}.hasOwnProperty;

  assign = function() {
    var i, key, len, source, sources, target;
    target = arguments[0], sources = 2 <= arguments.length ? slice.call(arguments, 1) : [];
    if (isFunction(Object.assign)) {
      Object.assign.apply(null, arguments);
    } else {
      for (i = 0, len = sources.length; i < len; i++) {
        source = sources[i];
        if (source != null) {
          for (key in source) {
            if (!hasProp.call(source, key)) continue;
            target[key] = source[key];
          }
        }
      }
    }
    return target;
  };

  isFunction = function(val) {
    return !!val && Object.prototype.toString.call(val) === '[object Function]';
  };

  isObject = function(val) {
    var ref;
    return !!val && ((ref = typeof val) === 'function' || ref === 'object');
  };

  isArray = function(val) {
    if (isFunction(Array.isArray)) {
      return Array.isArray(val);
    } else {
      return Object.prototype.toString.call(val) === '[object Array]';
    }
  };

  isEmpty = function(val) {
    var key;
    if (isArray(val)) {
      return !val.length;
    } else {
      for (key in val) {
        if (!hasProp.call(val, key)) continue;
        return false;
      }
      return true;
    }
  };

  isPlainObject = function(val) {
    var ctor, proto;
    return isObject(val) && (proto = Object.getPrototypeOf(val)) && (ctor = proto.constructor) && (typeof ctor === 'function') && (ctor instanceof ctor) && (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object));
  };

  module.exports.assign = assign;

  module.exports.isFunction = isFunction;

  module.exports.isObject = isObject;

  module.exports.isArray = isArray;

  module.exports.isEmpty = isEmpty;

  module.exports.isPlainObject = isPlainObject;

}).call(this);

},{}],9:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute;

  module.exports = XMLAttribute = (function() {
    function XMLAttribute(parent, name, value) {
      this.options = parent.options;
      this.stringify = parent.stringify;
      if (name == null) {
        throw new Error("Missing attribute name of element " + parent.name);
      }
      if (value == null) {
        throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name);
      }
      this.name = this.stringify.attName(name);
      this.value = this.stringify.attValue(value);
    }

    XMLAttribute.prototype.clone = function() {
      return Object.create(this);
    };

    XMLAttribute.prototype.toString = function(options) {
      return this.options.writer.set(options).attribute(this);
    };

    return XMLAttribute;

  })();

}).call(this);

},{}],10:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLCData = (function(superClass) {
    extend(XMLCData, superClass);

    function XMLCData(parent, text) {
      XMLCData.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing CDATA text");
      }
      this.text = this.stringify.cdata(text);
    }

    XMLCData.prototype.clone = function() {
      return Object.create(this);
    };

    XMLCData.prototype.toString = function(options) {
      return this.options.writer.set(options).cdata(this);
    };

    return XMLCData;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],11:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLComment, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLComment = (function(superClass) {
    extend(XMLComment, superClass);

    function XMLComment(parent, text) {
      XMLComment.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing comment text");
      }
      this.text = this.stringify.comment(text);
    }

    XMLComment.prototype.clone = function() {
      return Object.create(this);
    };

    XMLComment.prototype.toString = function(options) {
      return this.options.writer.set(options).comment(this);
    };

    return XMLComment;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],12:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDAttList, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDAttList = (function(superClass) {
    extend(XMLDTDAttList, superClass);

    function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      XMLDTDAttList.__super__.constructor.call(this, parent);
      if (elementName == null) {
        throw new Error("Missing DTD element name");
      }
      if (attributeName == null) {
        throw new Error("Missing DTD attribute name");
      }
      if (!attributeType) {
        throw new Error("Missing DTD attribute type");
      }
      if (!defaultValueType) {
        throw new Error("Missing DTD attribute default");
      }
      if (defaultValueType.indexOf('#') !== 0) {
        defaultValueType = '#' + defaultValueType;
      }
      if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {
        throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT");
      }
      if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {
        throw new Error("Default value only applies to #FIXED or #DEFAULT");
      }
      this.elementName = this.stringify.eleName(elementName);
      this.attributeName = this.stringify.attName(attributeName);
      this.attributeType = this.stringify.dtdAttType(attributeType);
      this.defaultValue = this.stringify.dtdAttDefault(defaultValue);
      this.defaultValueType = defaultValueType;
    }

    XMLDTDAttList.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdAttList(this);
    };

    return XMLDTDAttList;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],13:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDElement, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDElement = (function(superClass) {
    extend(XMLDTDElement, superClass);

    function XMLDTDElement(parent, name, value) {
      XMLDTDElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing DTD element name");
      }
      if (!value) {
        value = '(#PCDATA)';
      }
      if (Array.isArray(value)) {
        value = '(' + value.join(',') + ')';
      }
      this.name = this.stringify.eleName(name);
      this.value = this.stringify.dtdElementValue(value);
    }

    XMLDTDElement.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdElement(this);
    };

    return XMLDTDElement;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],14:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDEntity, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDEntity = (function(superClass) {
    extend(XMLDTDEntity, superClass);

    function XMLDTDEntity(parent, pe, name, value) {
      XMLDTDEntity.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing entity name");
      }
      if (value == null) {
        throw new Error("Missing entity value");
      }
      this.pe = !!pe;
      this.name = this.stringify.eleName(name);
      if (!isObject(value)) {
        this.value = this.stringify.dtdEntityValue(value);
      } else {
        if (!value.pubID && !value.sysID) {
          throw new Error("Public and/or system identifiers are required for an external entity");
        }
        if (value.pubID && !value.sysID) {
          throw new Error("System identifier is required for a public external entity");
        }
        if (value.pubID != null) {
          this.pubID = this.stringify.dtdPubID(value.pubID);
        }
        if (value.sysID != null) {
          this.sysID = this.stringify.dtdSysID(value.sysID);
        }
        if (value.nData != null) {
          this.nData = this.stringify.dtdNData(value.nData);
        }
        if (this.pe && this.nData) {
          throw new Error("Notation declaration is not allowed in a parameter entity");
        }
      }
    }

    XMLDTDEntity.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdEntity(this);
    };

    return XMLDTDEntity;

  })(XMLNode);

}).call(this);

},{"./Utility":8,"./XMLNode":21}],15:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDNotation, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDNotation = (function(superClass) {
    extend(XMLDTDNotation, superClass);

    function XMLDTDNotation(parent, name, value) {
      XMLDTDNotation.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing notation name");
      }
      if (!value.pubID && !value.sysID) {
        throw new Error("Public or system identifiers are required for an external entity");
      }
      this.name = this.stringify.eleName(name);
      if (value.pubID != null) {
        this.pubID = this.stringify.dtdPubID(value.pubID);
      }
      if (value.sysID != null) {
        this.sysID = this.stringify.dtdSysID(value.sysID);
      }
    }

    XMLDTDNotation.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdNotation(this);
    };

    return XMLDTDNotation;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],16:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDeclaration, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  module.exports = XMLDeclaration = (function(superClass) {
    extend(XMLDeclaration, superClass);

    function XMLDeclaration(parent, version, encoding, standalone) {
      var ref;
      XMLDeclaration.__super__.constructor.call(this, parent);
      if (isObject(version)) {
        ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;
      }
      if (!version) {
        version = '1.0';
      }
      this.version = this.stringify.xmlVersion(version);
      if (encoding != null) {
        this.encoding = this.stringify.xmlEncoding(encoding);
      }
      if (standalone != null) {
        this.standalone = this.stringify.xmlStandalone(standalone);
      }
    }

    XMLDeclaration.prototype.toString = function(options) {
      return this.options.writer.set(options).declaration(this);
    };

    return XMLDeclaration;

  })(XMLNode);

}).call(this);

},{"./Utility":8,"./XMLNode":21}],17:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  module.exports = XMLDocType = (function(superClass) {
    extend(XMLDocType, superClass);

    function XMLDocType(parent, pubID, sysID) {
      var ref, ref1;
      XMLDocType.__super__.constructor.call(this, parent);
      this.documentObject = parent;
      if (isObject(pubID)) {
        ref = pubID, pubID = ref.pubID, sysID = ref.sysID;
      }
      if (sysID == null) {
        ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1];
      }
      if (pubID != null) {
        this.pubID = this.stringify.dtdPubID(pubID);
      }
      if (sysID != null) {
        this.sysID = this.stringify.dtdSysID(sysID);
      }
    }

    XMLDocType.prototype.element = function(name, value) {
      var child;
      child = new XMLDTDElement(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var child;
      child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.entity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, false, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.pEntity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, true, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.notation = function(name, value) {
      var child;
      child = new XMLDTDNotation(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.toString = function(options) {
      return this.options.writer.set(options).docType(this);
    };

    XMLDocType.prototype.ele = function(name, value) {
      return this.element(name, value);
    };

    XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);
    };

    XMLDocType.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocType.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocType.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    XMLDocType.prototype.up = function() {
      return this.root() || this.documentObject;
    };

    return XMLDocType;

  })(XMLNode);

}).call(this);

},{"./Utility":8,"./XMLDTDAttList":12,"./XMLDTDElement":13,"./XMLDTDEntity":14,"./XMLDTDNotation":15,"./XMLNode":21}],18:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDocument, XMLNode, XMLStringWriter, XMLStringifier, isPlainObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isPlainObject = require('./Utility').isPlainObject;

  XMLNode = require('./XMLNode');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  module.exports = XMLDocument = (function(superClass) {
    extend(XMLDocument, superClass);

    function XMLDocument(options) {
      XMLDocument.__super__.constructor.call(this, null);
      options || (options = {});
      if (!options.writer) {
        options.writer = new XMLStringWriter();
      }
      this.options = options;
      this.stringify = new XMLStringifier(options);
      this.isDocument = true;
    }

    XMLDocument.prototype.end = function(writer) {
      var writerOptions;
      if (!writer) {
        writer = this.options.writer;
      } else if (isPlainObject(writer)) {
        writerOptions = writer;
        writer = this.options.writer.set(writerOptions);
      }
      return writer.document(this);
    };

    XMLDocument.prototype.toString = function(options) {
      return this.options.writer.set(options).document(this);
    };

    return XMLDocument;

  })(XMLNode);

}).call(this);

},{"./Utility":8,"./XMLNode":21,"./XMLStringWriter":25,"./XMLStringifier":26}],19:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute, XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLDocumentCB, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLStringifier, XMLText, isFunction, isObject, isPlainObject, ref,
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isPlainObject = ref.isPlainObject;

  XMLElement = require('./XMLElement');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLAttribute = require('./XMLAttribute');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  module.exports = XMLDocumentCB = (function() {
    function XMLDocumentCB(options, onData, onEnd) {
      var writerOptions;
      options || (options = {});
      if (!options.writer) {
        options.writer = new XMLStringWriter(options);
      } else if (isPlainObject(options.writer)) {
        writerOptions = options.writer;
        options.writer = new XMLStringWriter(writerOptions);
      }
      this.options = options;
      this.writer = options.writer;
      this.stringify = new XMLStringifier(options);
      this.onDataCallback = onData || function() {};
      this.onEndCallback = onEnd || function() {};
      this.currentNode = null;
      this.currentLevel = -1;
      this.openTags = {};
      this.documentStarted = false;
      this.documentCompleted = false;
      this.root = null;
    }

    XMLDocumentCB.prototype.node = function(name, attributes, text) {
      var ref1;
      if (name == null) {
        throw new Error("Missing node name");
      }
      if (this.root && this.currentLevel === -1) {
        throw new Error("Document can only have one root node");
      }
      this.openCurrent();
      name = name.valueOf();
      if (attributes == null) {
        attributes = {};
      }
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      this.currentNode = new XMLElement(this, name, attributes);
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      if (text != null) {
        this.text(text);
      }
      return this;
    };

    XMLDocumentCB.prototype.element = function(name, attributes, text) {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.dtdElement.apply(this, arguments);
      } else {
        return this.node(name, attributes, text);
      }
    };

    XMLDocumentCB.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (!this.currentNode || this.currentNode.children) {
        throw new Error("att() can only be used immediately after an ele() call in callback mode");
      }
      if (name != null) {
        name = name.valueOf();
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (!this.options.skipNullAttributes || (value != null)) {
          this.currentNode.attributes[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLDocumentCB.prototype.text = function(value) {
      var node;
      this.openCurrent();
      node = new XMLText(this, value);
      this.onData(this.writer.text(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.cdata = function(value) {
      var node;
      this.openCurrent();
      node = new XMLCData(this, value);
      this.onData(this.writer.cdata(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.comment = function(value) {
      var node;
      this.openCurrent();
      node = new XMLComment(this, value);
      this.onData(this.writer.comment(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.raw = function(value) {
      var node;
      this.openCurrent();
      node = new XMLRaw(this, value);
      this.onData(this.writer.raw(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.instruction = function(target, value) {
      var i, insTarget, insValue, len, node;
      this.openCurrent();
      if (target != null) {
        target = target.valueOf();
      }
      if (value != null) {
        value = value.valueOf();
      }
      if (Array.isArray(target)) {
        for (i = 0, len = target.length; i < len; i++) {
          insTarget = target[i];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        node = new XMLProcessingInstruction(this, target, value);
        this.onData(this.writer.processingInstruction(node, this.currentLevel + 1));
      }
      return this;
    };

    XMLDocumentCB.prototype.declaration = function(version, encoding, standalone) {
      var node;
      this.openCurrent();
      if (this.documentStarted) {
        throw new Error("declaration() must be the first node");
      }
      node = new XMLDeclaration(this, version, encoding, standalone);
      this.onData(this.writer.declaration(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.doctype = function(root, pubID, sysID) {
      this.openCurrent();
      if (root == null) {
        throw new Error("Missing root node name");
      }
      if (this.root) {
        throw new Error("dtd() must come before the root node");
      }
      this.currentNode = new XMLDocType(this, pubID, sysID);
      this.currentNode.rootNodeName = root;
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      return this;
    };

    XMLDocumentCB.prototype.dtdElement = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDElement(this, name, value);
      this.onData(this.writer.dtdElement(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var node;
      this.openCurrent();
      node = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.onData(this.writer.dtdAttList(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.entity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, false, name, value);
      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.pEntity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, true, name, value);
      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.notation = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDNotation(this, name, value);
      this.onData(this.writer.dtdNotation(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.up = function() {
      if (this.currentLevel < 0) {
        throw new Error("The document node has no parent");
      }
      if (this.currentNode) {
        if (this.currentNode.children) {
          this.closeNode(this.currentNode);
        } else {
          this.openNode(this.currentNode);
        }
        this.currentNode = null;
      } else {
        this.closeNode(this.openTags[this.currentLevel]);
      }
      delete this.openTags[this.currentLevel];
      this.currentLevel--;
      return this;
    };

    XMLDocumentCB.prototype.end = function() {
      while (this.currentLevel >= 0) {
        this.up();
      }
      return this.onEnd();
    };

    XMLDocumentCB.prototype.openCurrent = function() {
      if (this.currentNode) {
        this.currentNode.children = true;
        return this.openNode(this.currentNode);
      }
    };

    XMLDocumentCB.prototype.openNode = function(node) {
      if (!node.isOpen) {
        if (!this.root && this.currentLevel === 0 && node instanceof XMLElement) {
          this.root = node;
        }
        this.onData(this.writer.openNode(node, this.currentLevel));
        return node.isOpen = true;
      }
    };

    XMLDocumentCB.prototype.closeNode = function(node) {
      if (!node.isClosed) {
        this.onData(this.writer.closeNode(node, this.currentLevel));
        return node.isClosed = true;
      }
    };

    XMLDocumentCB.prototype.onData = function(chunk) {
      this.documentStarted = true;
      return this.onDataCallback(chunk);
    };

    XMLDocumentCB.prototype.onEnd = function() {
      this.documentCompleted = true;
      return this.onEndCallback();
    };

    XMLDocumentCB.prototype.ele = function() {
      return this.element.apply(this, arguments);
    };

    XMLDocumentCB.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLDocumentCB.prototype.dtd = function(root, pubID, sysID) {
      return this.doctype(root, pubID, sysID);
    };

    XMLDocumentCB.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLDocumentCB.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.t = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLDocumentCB.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.att = function() {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.a = function() {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocumentCB.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocumentCB.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    return XMLDocumentCB;

  })();

}).call(this);

},{"./Utility":8,"./XMLAttribute":9,"./XMLCData":10,"./XMLComment":11,"./XMLDTDAttList":12,"./XMLDTDElement":13,"./XMLDTDEntity":14,"./XMLDTDNotation":15,"./XMLDeclaration":16,"./XMLDocType":17,"./XMLElement":20,"./XMLProcessingInstruction":22,"./XMLRaw":23,"./XMLStringWriter":25,"./XMLStringifier":26,"./XMLText":27}],20:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute, XMLElement, XMLNode, isFunction, isObject, ref,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction;

  XMLNode = require('./XMLNode');

  XMLAttribute = require('./XMLAttribute');

  module.exports = XMLElement = (function(superClass) {
    extend(XMLElement, superClass);

    function XMLElement(parent, name, attributes) {
      XMLElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing element name");
      }
      this.name = this.stringify.eleName(name);
      this.attributes = {};
      if (attributes != null) {
        this.attribute(attributes);
      }
      if (parent.isDocument) {
        this.isRoot = true;
        this.documentObject = parent;
        parent.rootObject = this;
      }
    }

    XMLElement.prototype.clone = function() {
      var att, attName, clonedSelf, ref1;
      clonedSelf = Object.create(this);
      if (clonedSelf.isRoot) {
        clonedSelf.documentObject = null;
      }
      clonedSelf.attributes = {};
      ref1 = this.attributes;
      for (attName in ref1) {
        if (!hasProp.call(ref1, attName)) continue;
        att = ref1[attName];
        clonedSelf.attributes[attName] = att.clone();
      }
      clonedSelf.children = [];
      this.children.forEach(function(child) {
        var clonedChild;
        clonedChild = child.clone();
        clonedChild.parent = clonedSelf;
        return clonedSelf.children.push(clonedChild);
      });
      return clonedSelf;
    };

    XMLElement.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (name != null) {
        name = name.valueOf();
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (!this.options.skipNullAttributes || (value != null)) {
          this.attributes[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLElement.prototype.removeAttribute = function(name) {
      var attName, i, len;
      if (name == null) {
        throw new Error("Missing attribute name");
      }
      name = name.valueOf();
      if (Array.isArray(name)) {
        for (i = 0, len = name.length; i < len; i++) {
          attName = name[i];
          delete this.attributes[attName];
        }
      } else {
        delete this.attributes[name];
      }
      return this;
    };

    XMLElement.prototype.toString = function(options) {
      return this.options.writer.set(options).element(this);
    };

    XMLElement.prototype.att = function(name, value) {
      return this.attribute(name, value);
    };

    XMLElement.prototype.a = function(name, value) {
      return this.attribute(name, value);
    };

    return XMLElement;

  })(XMLNode);

}).call(this);

},{"./Utility":8,"./XMLAttribute":9,"./XMLNode":21}],21:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLProcessingInstruction, XMLRaw, XMLText, isEmpty, isFunction, isObject, ref,
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isEmpty = ref.isEmpty;

  XMLElement = null;

  XMLCData = null;

  XMLComment = null;

  XMLDeclaration = null;

  XMLDocType = null;

  XMLRaw = null;

  XMLText = null;

  XMLProcessingInstruction = null;

  module.exports = XMLNode = (function() {
    function XMLNode(parent) {
      this.parent = parent;
      if (this.parent) {
        this.options = this.parent.options;
        this.stringify = this.parent.stringify;
      }
      this.children = [];
      if (!XMLElement) {
        XMLElement = require('./XMLElement');
        XMLCData = require('./XMLCData');
        XMLComment = require('./XMLComment');
        XMLDeclaration = require('./XMLDeclaration');
        XMLDocType = require('./XMLDocType');
        XMLRaw = require('./XMLRaw');
        XMLText = require('./XMLText');
        XMLProcessingInstruction = require('./XMLProcessingInstruction');
      }
    }

    XMLNode.prototype.element = function(name, attributes, text) {
      var childNode, item, j, k, key, lastChild, len, len1, ref1, val;
      lastChild = null;
      if (attributes == null) {
        attributes = {};
      }
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      if (name != null) {
        name = name.valueOf();
      }
      if (Array.isArray(name)) {
        for (j = 0, len = name.length; j < len; j++) {
          item = name[j];
          lastChild = this.element(item);
        }
      } else if (isFunction(name)) {
        lastChild = this.element(name.apply());
      } else if (isObject(name)) {
        for (key in name) {
          if (!hasProp.call(name, key)) continue;
          val = name[key];
          if (isFunction(val)) {
            val = val.apply();
          }
          if ((isObject(val)) && (isEmpty(val))) {
            val = null;
          }
          if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {
            lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);
          } else if (!this.options.separateArrayItems && Array.isArray(val)) {
            for (k = 0, len1 = val.length; k < len1; k++) {
              item = val[k];
              childNode = {};
              childNode[key] = item;
              lastChild = this.element(childNode);
            }
          } else if (isObject(val)) {
            lastChild = this.element(key);
            lastChild.element(val);
          } else {
            lastChild = this.element(key, val);
          }
        }
      } else {
        if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {
          lastChild = this.text(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {
          lastChild = this.cdata(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {
          lastChild = this.comment(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {
          lastChild = this.raw(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) {
          lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text);
        } else {
          lastChild = this.node(name, attributes, text);
        }
      }
      if (lastChild == null) {
        throw new Error("Could not create any elements with: " + name);
      }
      return lastChild;
    };

    XMLNode.prototype.insertBefore = function(name, attributes, text) {
      var child, i, removed;
      if (this.isRoot) {
        throw new Error("Cannot insert elements at root level");
      }
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.element(name, attributes, text);
      Array.prototype.push.apply(this.parent.children, removed);
      return child;
    };

    XMLNode.prototype.insertAfter = function(name, attributes, text) {
      var child, i, removed;
      if (this.isRoot) {
        throw new Error("Cannot insert elements at root level");
      }
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.element(name, attributes, text);
      Array.prototype.push.apply(this.parent.children, removed);
      return child;
    };

    XMLNode.prototype.remove = function() {
      var i, ref1;
      if (this.isRoot) {
        throw new Error("Cannot remove the root element");
      }
      i = this.parent.children.indexOf(this);
      [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref1 = [])), ref1;
      return this.parent;
    };

    XMLNode.prototype.node = function(name, attributes, text) {
      var child, ref1;
      if (name != null) {
        name = name.valueOf();
      }
      attributes || (attributes = {});
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      child = new XMLElement(this, name, attributes);
      if (text != null) {
        child.text(text);
      }
      this.children.push(child);
      return child;
    };

    XMLNode.prototype.text = function(value) {
      var child;
      child = new XMLText(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.cdata = function(value) {
      var child;
      child = new XMLCData(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.comment = function(value) {
      var child;
      child = new XMLComment(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.commentBefore = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.commentAfter = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.raw = function(value) {
      var child;
      child = new XMLRaw(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.instruction = function(target, value) {
      var insTarget, insValue, instruction, j, len;
      if (target != null) {
        target = target.valueOf();
      }
      if (value != null) {
        value = value.valueOf();
      }
      if (Array.isArray(target)) {
        for (j = 0, len = target.length; j < len; j++) {
          insTarget = target[j];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        instruction = new XMLProcessingInstruction(this, target, value);
        this.children.push(instruction);
      }
      return this;
    };

    XMLNode.prototype.instructionBefore = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.instructionAfter = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.declaration = function(version, encoding, standalone) {
      var doc, xmldec;
      doc = this.document();
      xmldec = new XMLDeclaration(doc, version, encoding, standalone);
      if (doc.children[0] instanceof XMLDeclaration) {
        doc.children[0] = xmldec;
      } else {
        doc.children.unshift(xmldec);
      }
      return doc.root() || doc;
    };

    XMLNode.prototype.doctype = function(pubID, sysID) {
      var child, doc, doctype, i, j, k, len, len1, ref1, ref2;
      doc = this.document();
      doctype = new XMLDocType(doc, pubID, sysID);
      ref1 = doc.children;
      for (i = j = 0, len = ref1.length; j < len; i = ++j) {
        child = ref1[i];
        if (child instanceof XMLDocType) {
          doc.children[i] = doctype;
          return doctype;
        }
      }
      ref2 = doc.children;
      for (i = k = 0, len1 = ref2.length; k < len1; i = ++k) {
        child = ref2[i];
        if (child.isRoot) {
          doc.children.splice(i, 0, doctype);
          return doctype;
        }
      }
      doc.children.push(doctype);
      return doctype;
    };

    XMLNode.prototype.up = function() {
      if (this.isRoot) {
        throw new Error("The root node has no parent. Use doc() if you need to get the document object.");
      }
      return this.parent;
    };

    XMLNode.prototype.root = function() {
      var node;
      node = this;
      while (node) {
        if (node.isDocument) {
          return node.rootObject;
        } else if (node.isRoot) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.document = function() {
      var node;
      node = this;
      while (node) {
        if (node.isDocument) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.end = function(options) {
      return this.document().end(options);
    };

    XMLNode.prototype.prev = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i < 1) {
        throw new Error("Already at the first node");
      }
      return this.parent.children[i - 1];
    };

    XMLNode.prototype.next = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i === -1 || i === this.parent.children.length - 1) {
        throw new Error("Already at the last node");
      }
      return this.parent.children[i + 1];
    };

    XMLNode.prototype.importDocument = function(doc) {
      var clonedRoot;
      clonedRoot = doc.root().clone();
      clonedRoot.parent = this;
      clonedRoot.isRoot = false;
      this.children.push(clonedRoot);
      return this;
    };

    XMLNode.prototype.ele = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.doc = function() {
      return this.document();
    };

    XMLNode.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLNode.prototype.dtd = function(pubID, sysID) {
      return this.doctype(pubID, sysID);
    };

    XMLNode.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.t = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLNode.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.u = function() {
      return this.up();
    };

    XMLNode.prototype.importXMLBuilder = function(doc) {
      return this.importDocument(doc);
    };

    return XMLNode;

  })();

}).call(this);

},{"./Utility":8,"./XMLCData":10,"./XMLComment":11,"./XMLDeclaration":16,"./XMLDocType":17,"./XMLElement":20,"./XMLProcessingInstruction":22,"./XMLRaw":23,"./XMLText":27}],22:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLProcessingInstruction,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLProcessingInstruction = (function(superClass) {
    extend(XMLProcessingInstruction, superClass);

    function XMLProcessingInstruction(parent, target, value) {
      XMLProcessingInstruction.__super__.constructor.call(this, parent);
      if (target == null) {
        throw new Error("Missing instruction target");
      }
      this.target = this.stringify.insTarget(target);
      if (value) {
        this.value = this.stringify.insValue(value);
      }
    }

    XMLProcessingInstruction.prototype.clone = function() {
      return Object.create(this);
    };

    XMLProcessingInstruction.prototype.toString = function(options) {
      return this.options.writer.set(options).processingInstruction(this);
    };

    return XMLProcessingInstruction;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],23:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLRaw,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLRaw = (function(superClass) {
    extend(XMLRaw, superClass);

    function XMLRaw(parent, text) {
      XMLRaw.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing raw text");
      }
      this.value = this.stringify.raw(text);
    }

    XMLRaw.prototype.clone = function() {
      return Object.create(this);
    };

    XMLRaw.prototype.toString = function(options) {
      return this.options.writer.set(options).raw(this);
    };

    return XMLRaw;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],24:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStreamWriter, XMLText, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLElement = require('./XMLElement');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLWriterBase = require('./XMLWriterBase');

  module.exports = XMLStreamWriter = (function(superClass) {
    extend(XMLStreamWriter, superClass);

    function XMLStreamWriter(stream, options) {
      XMLStreamWriter.__super__.constructor.call(this, options);
      this.stream = stream;
    }

    XMLStreamWriter.prototype.document = function(doc) {
      var child, i, j, len, len1, ref, ref1, results;
      ref = doc.children;
      for (i = 0, len = ref.length; i < len; i++) {
        child = ref[i];
        child.isLastRootNode = false;
      }
      doc.children[doc.children.length - 1].isLastRootNode = true;
      ref1 = doc.children;
      results = [];
      for (j = 0, len1 = ref1.length; j < len1; j++) {
        child = ref1[j];
        switch (false) {
          case !(child instanceof XMLDeclaration):
            results.push(this.declaration(child));
            break;
          case !(child instanceof XMLDocType):
            results.push(this.docType(child));
            break;
          case !(child instanceof XMLComment):
            results.push(this.comment(child));
            break;
          case !(child instanceof XMLProcessingInstruction):
            results.push(this.processingInstruction(child));
            break;
          default:
            results.push(this.element(child));
        }
      }
      return results;
    };

    XMLStreamWriter.prototype.attribute = function(att) {
      return this.stream.write(' ' + att.name + '="' + att.value + '"');
    };

    XMLStreamWriter.prototype.cdata = function(node, level) {
      return this.stream.write(this.space(level) + '<![CDATA[' + node.text + ']]>' + this.endline(node));
    };

    XMLStreamWriter.prototype.comment = function(node, level) {
      return this.stream.write(this.space(level) + '<!-- ' + node.text + ' -->' + this.endline(node));
    };

    XMLStreamWriter.prototype.declaration = function(node, level) {
      this.stream.write(this.space(level));
      this.stream.write('<?xml version="' + node.version + '"');
      if (node.encoding != null) {
        this.stream.write(' encoding="' + node.encoding + '"');
      }
      if (node.standalone != null) {
        this.stream.write(' standalone="' + node.standalone + '"');
      }
      this.stream.write(this.spacebeforeslash + '?>');
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.docType = function(node, level) {
      var child, i, len, ref;
      level || (level = 0);
      this.stream.write(this.space(level));
      this.stream.write('<!DOCTYPE ' + node.root().name);
      if (node.pubID && node.sysID) {
        this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
      } else if (node.sysID) {
        this.stream.write(' SYSTEM "' + node.sysID + '"');
      }
      if (node.children.length > 0) {
        this.stream.write(' [');
        this.stream.write(this.endline(node));
        ref = node.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          switch (false) {
            case !(child instanceof XMLDTDAttList):
              this.dtdAttList(child, level + 1);
              break;
            case !(child instanceof XMLDTDElement):
              this.dtdElement(child, level + 1);
              break;
            case !(child instanceof XMLDTDEntity):
              this.dtdEntity(child, level + 1);
              break;
            case !(child instanceof XMLDTDNotation):
              this.dtdNotation(child, level + 1);
              break;
            case !(child instanceof XMLCData):
              this.cdata(child, level + 1);
              break;
            case !(child instanceof XMLComment):
              this.comment(child, level + 1);
              break;
            case !(child instanceof XMLProcessingInstruction):
              this.processingInstruction(child, level + 1);
              break;
            default:
              throw new Error("Unknown DTD node type: " + child.constructor.name);
          }
        }
        this.stream.write(']');
      }
      this.stream.write(this.spacebeforeslash + '>');
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.element = function(node, level) {
      var att, child, i, len, name, ref, ref1, space;
      level || (level = 0);
      space = this.space(level);
      this.stream.write(space + '<' + node.name);
      ref = node.attributes;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        this.attribute(att);
      }
      if (node.children.length === 0 || node.children.every(function(e) {
        return e.value === '';
      })) {
        if (this.allowEmpty) {
          this.stream.write('></' + node.name + '>');
        } else {
          this.stream.write(this.spacebeforeslash + '/>');
        }
      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {
        this.stream.write('>');
        this.stream.write(node.children[0].value);
        this.stream.write('</' + node.name + '>');
      } else {
        this.stream.write('>' + this.newline);
        ref1 = node.children;
        for (i = 0, len = ref1.length; i < len; i++) {
          child = ref1[i];
          switch (false) {
            case !(child instanceof XMLCData):
              this.cdata(child, level + 1);
              break;
            case !(child instanceof XMLComment):
              this.comment(child, level + 1);
              break;
            case !(child instanceof XMLElement):
              this.element(child, level + 1);
              break;
            case !(child instanceof XMLRaw):
              this.raw(child, level + 1);
              break;
            case !(child instanceof XMLText):
              this.text(child, level + 1);
              break;
            case !(child instanceof XMLProcessingInstruction):
              this.processingInstruction(child, level + 1);
              break;
            default:
              throw new Error("Unknown XML node type: " + child.constructor.name);
          }
        }
        this.stream.write(space + '</' + node.name + '>');
      }
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.processingInstruction = function(node, level) {
      this.stream.write(this.space(level) + '<?' + node.target);
      if (node.value) {
        this.stream.write(' ' + node.value);
      }
      return this.stream.write(this.spacebeforeslash + '?>' + this.endline(node));
    };

    XMLStreamWriter.prototype.raw = function(node, level) {
      return this.stream.write(this.space(level) + node.value + this.endline(node));
    };

    XMLStreamWriter.prototype.text = function(node, level) {
      return this.stream.write(this.space(level) + node.value + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdAttList = function(node, level) {
      this.stream.write(this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType);
      if (node.defaultValueType !== '#DEFAULT') {
        this.stream.write(' ' + node.defaultValueType);
      }
      if (node.defaultValue) {
        this.stream.write(' "' + node.defaultValue + '"');
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdElement = function(node, level) {
      this.stream.write(this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value);
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdEntity = function(node, level) {
      this.stream.write(this.space(level) + '<!ENTITY');
      if (node.pe) {
        this.stream.write(' %');
      }
      this.stream.write(' ' + node.name);
      if (node.value) {
        this.stream.write(' "' + node.value + '"');
      } else {
        if (node.pubID && node.sysID) {
          this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
        } else if (node.sysID) {
          this.stream.write(' SYSTEM "' + node.sysID + '"');
        }
        if (node.nData) {
          this.stream.write(' NDATA ' + node.nData);
        }
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdNotation = function(node, level) {
      this.stream.write(this.space(level) + '<!NOTATION ' + node.name);
      if (node.pubID && node.sysID) {
        this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
      } else if (node.pubID) {
        this.stream.write(' PUBLIC "' + node.pubID + '"');
      } else if (node.sysID) {
        this.stream.write(' SYSTEM "' + node.sysID + '"');
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.endline = function(node) {
      if (!node.isLastRootNode) {
        return this.newline;
      } else {
        return '';
      }
    };

    return XMLStreamWriter;

  })(XMLWriterBase);

}).call(this);

},{"./XMLCData":10,"./XMLComment":11,"./XMLDTDAttList":12,"./XMLDTDElement":13,"./XMLDTDEntity":14,"./XMLDTDNotation":15,"./XMLDeclaration":16,"./XMLDocType":17,"./XMLElement":20,"./XMLProcessingInstruction":22,"./XMLRaw":23,"./XMLText":27,"./XMLWriterBase":28}],25:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLText, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLElement = require('./XMLElement');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLWriterBase = require('./XMLWriterBase');

  module.exports = XMLStringWriter = (function(superClass) {
    extend(XMLStringWriter, superClass);

    function XMLStringWriter(options) {
      XMLStringWriter.__super__.constructor.call(this, options);
    }

    XMLStringWriter.prototype.document = function(doc) {
      var child, i, len, r, ref;
      this.textispresent = false;
      r = '';
      ref = doc.children;
      for (i = 0, len = ref.length; i < len; i++) {
        child = ref[i];
        r += (function() {
          switch (false) {
            case !(child instanceof XMLDeclaration):
              return this.declaration(child);
            case !(child instanceof XMLDocType):
              return this.docType(child);
            case !(child instanceof XMLComment):
              return this.comment(child);
            case !(child instanceof XMLProcessingInstruction):
              return this.processingInstruction(child);
            default:
              return this.element(child, 0);
          }
        }).call(this);
      }
      if (this.pretty && r.slice(-this.newline.length) === this.newline) {
        r = r.slice(0, -this.newline.length);
      }
      return r;
    };

    XMLStringWriter.prototype.attribute = function(att) {
      return ' ' + att.name + '="' + att.value + '"';
    };

    XMLStringWriter.prototype.cdata = function(node, level) {
      return this.space(level) + '<![CDATA[' + node.text + ']]>' + this.newline;
    };

    XMLStringWriter.prototype.comment = function(node, level) {
      return this.space(level) + '<!-- ' + node.text + ' -->' + this.newline;
    };

    XMLStringWriter.prototype.declaration = function(node, level) {
      var r;
      r = this.space(level);
      r += '<?xml version="' + node.version + '"';
      if (node.encoding != null) {
        r += ' encoding="' + node.encoding + '"';
      }
      if (node.standalone != null) {
        r += ' standalone="' + node.standalone + '"';
      }
      r += this.spacebeforeslash + '?>';
      r += this.newline;
      return r;
    };

    XMLStringWriter.prototype.docType = function(node, level) {
      var child, i, len, r, ref;
      level || (level = 0);
      r = this.space(level);
      r += '<!DOCTYPE ' + node.root().name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      if (node.children.length > 0) {
        r += ' [';
        r += this.newline;
        ref = node.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          r += (function() {
            switch (false) {
              case !(child instanceof XMLDTDAttList):
                return this.dtdAttList(child, level + 1);
              case !(child instanceof XMLDTDElement):
                return this.dtdElement(child, level + 1);
              case !(child instanceof XMLDTDEntity):
                return this.dtdEntity(child, level + 1);
              case !(child instanceof XMLDTDNotation):
                return this.dtdNotation(child, level + 1);
              case !(child instanceof XMLCData):
                return this.cdata(child, level + 1);
              case !(child instanceof XMLComment):
                return this.comment(child, level + 1);
              case !(child instanceof XMLProcessingInstruction):
                return this.processingInstruction(child, level + 1);
              default:
                throw new Error("Unknown DTD node type: " + child.constructor.name);
            }
          }).call(this);
        }
        r += ']';
      }
      r += this.spacebeforeslash + '>';
      r += this.newline;
      return r;
    };

    XMLStringWriter.prototype.element = function(node, level) {
      var att, child, i, j, len, len1, name, r, ref, ref1, ref2, space, textispresentwasset;
      level || (level = 0);
      textispresentwasset = false;
      if (this.textispresent) {
        this.newline = '';
        this.pretty = false;
      } else {
        this.newline = this.newlinedefault;
        this.pretty = this.prettydefault;
      }
      space = this.space(level);
      r = '';
      r += space + '<' + node.name;
      ref = node.attributes;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        r += this.attribute(att);
      }
      if (node.children.length === 0 || node.children.every(function(e) {
        return e.value === '';
      })) {
        if (this.allowEmpty) {
          r += '></' + node.name + '>' + this.newline;
        } else {
          r += this.spacebeforeslash + '/>' + this.newline;
        }
      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {
        r += '>';
        r += node.children[0].value;
        r += '</' + node.name + '>' + this.newline;
      } else {
        if (this.dontprettytextnodes) {
          ref1 = node.children;
          for (i = 0, len = ref1.length; i < len; i++) {
            child = ref1[i];
            if (child.value != null) {
              this.textispresent++;
              textispresentwasset = true;
              break;
            }
          }
        }
        if (this.textispresent) {
          this.newline = '';
          this.pretty = false;
          space = this.space(level);
        }
        r += '>' + this.newline;
        ref2 = node.children;
        for (j = 0, len1 = ref2.length; j < len1; j++) {
          child = ref2[j];
          r += (function() {
            switch (false) {
              case !(child instanceof XMLCData):
                return this.cdata(child, level + 1);
              case !(child instanceof XMLComment):
                return this.comment(child, level + 1);
              case !(child instanceof XMLElement):
                return this.element(child, level + 1);
              case !(child instanceof XMLRaw):
                return this.raw(child, level + 1);
              case !(child instanceof XMLText):
                return this.text(child, level + 1);
              case !(child instanceof XMLProcessingInstruction):
                return this.processingInstruction(child, level + 1);
              default:
                throw new Error("Unknown XML node type: " + child.constructor.name);
            }
          }).call(this);
        }
        if (textispresentwasset) {
          this.textispresent--;
        }
        if (!this.textispresent) {
          this.newline = this.newlinedefault;
          this.pretty = this.prettydefault;
        }
        r += space + '</' + node.name + '>' + this.newline;
      }
      return r;
    };

    XMLStringWriter.prototype.processingInstruction = function(node, level) {
      var r;
      r = this.space(level) + '<?' + node.target;
      if (node.value) {
        r += ' ' + node.value;
      }
      r += this.spacebeforeslash + '?>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.raw = function(node, level) {
      return this.space(level) + node.value + this.newline;
    };

    XMLStringWriter.prototype.text = function(node, level) {
      return this.space(level) + node.value + this.newline;
    };

    XMLStringWriter.prototype.dtdAttList = function(node, level) {
      var r;
      r = this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType;
      if (node.defaultValueType !== '#DEFAULT') {
        r += ' ' + node.defaultValueType;
      }
      if (node.defaultValue) {
        r += ' "' + node.defaultValue + '"';
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.dtdElement = function(node, level) {
      return this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value + this.spacebeforeslash + '>' + this.newline;
    };

    XMLStringWriter.prototype.dtdEntity = function(node, level) {
      var r;
      r = this.space(level) + '<!ENTITY';
      if (node.pe) {
        r += ' %';
      }
      r += ' ' + node.name;
      if (node.value) {
        r += ' "' + node.value + '"';
      } else {
        if (node.pubID && node.sysID) {
          r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
        } else if (node.sysID) {
          r += ' SYSTEM "' + node.sysID + '"';
        }
        if (node.nData) {
          r += ' NDATA ' + node.nData;
        }
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.dtdNotation = function(node, level) {
      var r;
      r = this.space(level) + '<!NOTATION ' + node.name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.pubID) {
        r += ' PUBLIC "' + node.pubID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.openNode = function(node, level) {
      var att, name, r, ref;
      level || (level = 0);
      if (node instanceof XMLElement) {
        r = this.space(level) + '<' + node.name;
        ref = node.attributes;
        for (name in ref) {
          if (!hasProp.call(ref, name)) continue;
          att = ref[name];
          r += this.attribute(att);
        }
        r += (node.children ? '>' : '/>') + this.newline;
        return r;
      } else {
        r = this.space(level) + '<!DOCTYPE ' + node.rootNodeName;
        if (node.pubID && node.sysID) {
          r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
        } else if (node.sysID) {
          r += ' SYSTEM "' + node.sysID + '"';
        }
        r += (node.children ? ' [' : '>') + this.newline;
        return r;
      }
    };

    XMLStringWriter.prototype.closeNode = function(node, level) {
      level || (level = 0);
      switch (false) {
        case !(node instanceof XMLElement):
          return this.space(level) + '</' + node.name + '>' + this.newline;
        case !(node instanceof XMLDocType):
          return this.space(level) + ']>' + this.newline;
      }
    };

    return XMLStringWriter;

  })(XMLWriterBase);

}).call(this);

},{"./XMLCData":10,"./XMLComment":11,"./XMLDTDAttList":12,"./XMLDTDElement":13,"./XMLDTDEntity":14,"./XMLDTDNotation":15,"./XMLDeclaration":16,"./XMLDocType":17,"./XMLElement":20,"./XMLProcessingInstruction":22,"./XMLRaw":23,"./XMLText":27,"./XMLWriterBase":28}],26:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLStringifier,
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    hasProp = {}.hasOwnProperty;

  module.exports = XMLStringifier = (function() {
    function XMLStringifier(options) {
      this.assertLegalChar = bind(this.assertLegalChar, this);
      var key, ref, value;
      options || (options = {});
      this.noDoubleEncoding = options.noDoubleEncoding;
      ref = options.stringify || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this[key] = value;
      }
    }

    XMLStringifier.prototype.eleName = function(val) {
      val = '' + val || '';
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.eleText = function(val) {
      val = '' + val || '';
      return this.assertLegalChar(this.elEscape(val));
    };

    XMLStringifier.prototype.cdata = function(val) {
      val = '' + val || '';
      val = val.replace(']]>', ']]]]><![CDATA[>');
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.comment = function(val) {
      val = '' + val || '';
      if (val.match(/--/)) {
        throw new Error("Comment text cannot contain double-hypen: " + val);
      }
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.raw = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.attName = function(val) {
      return val = '' + val || '';
    };

    XMLStringifier.prototype.attValue = function(val) {
      val = '' + val || '';
      return this.attEscape(val);
    };

    XMLStringifier.prototype.insTarget = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.insValue = function(val) {
      val = '' + val || '';
      if (val.match(/\?>/)) {
        throw new Error("Invalid processing instruction value: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlVersion = function(val) {
      val = '' + val || '';
      if (!val.match(/1\.[0-9]+/)) {
        throw new Error("Invalid version number: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlEncoding = function(val) {
      val = '' + val || '';
      if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/)) {
        throw new Error("Invalid encoding: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlStandalone = function(val) {
      if (val) {
        return "yes";
      } else {
        return "no";
      }
    };

    XMLStringifier.prototype.dtdPubID = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdSysID = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdElementValue = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdAttType = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdAttDefault = function(val) {
      if (val != null) {
        return '' + val || '';
      } else {
        return val;
      }
    };

    XMLStringifier.prototype.dtdEntityValue = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdNData = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.convertAttKey = '@';

    XMLStringifier.prototype.convertPIKey = '?';

    XMLStringifier.prototype.convertTextKey = '#text';

    XMLStringifier.prototype.convertCDataKey = '#cdata';

    XMLStringifier.prototype.convertCommentKey = '#comment';

    XMLStringifier.prototype.convertRawKey = '#raw';

    XMLStringifier.prototype.assertLegalChar = function(str) {
      var res;
      res = str.match(/[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/);
      if (res) {
        throw new Error("Invalid character in string: " + str + " at index " + res.index);
      }
      return str;
    };

    XMLStringifier.prototype.elEscape = function(str) {
      var ampregex;
      ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\r/g, '&#xD;');
    };

    XMLStringifier.prototype.attEscape = function(str) {
      var ampregex;
      ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/\t/g, '&#x9;').replace(/\n/g, '&#xA;').replace(/\r/g, '&#xD;');
    };

    return XMLStringifier;

  })();

}).call(this);

},{}],27:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLText,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLText = (function(superClass) {
    extend(XMLText, superClass);

    function XMLText(parent, text) {
      XMLText.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing element text");
      }
      this.value = this.stringify.eleText(text);
    }

    XMLText.prototype.clone = function() {
      return Object.create(this);
    };

    XMLText.prototype.toString = function(options) {
      return this.options.writer.set(options).text(this);
    };

    return XMLText;

  })(XMLNode);

}).call(this);

},{"./XMLNode":21}],28:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLWriterBase,
    hasProp = {}.hasOwnProperty;

  module.exports = XMLWriterBase = (function() {
    function XMLWriterBase(options) {
      var key, ref, ref1, ref2, ref3, ref4, ref5, ref6, value;
      options || (options = {});
      this.pretty = options.pretty || false;
      this.allowEmpty = (ref = options.allowEmpty) != null ? ref : false;
      if (this.pretty) {
        this.indent = (ref1 = options.indent) != null ? ref1 : '  ';
        this.newline = (ref2 = options.newline) != null ? ref2 : '\n';
        this.offset = (ref3 = options.offset) != null ? ref3 : 0;
        this.dontprettytextnodes = (ref4 = options.dontprettytextnodes) != null ? ref4 : 0;
      } else {
        this.indent = '';
        this.newline = '';
        this.offset = 0;
        this.dontprettytextnodes = 0;
      }
      this.spacebeforeslash = (ref5 = options.spacebeforeslash) != null ? ref5 : '';
      if (this.spacebeforeslash === true) {
        this.spacebeforeslash = ' ';
      }
      this.newlinedefault = this.newline;
      this.prettydefault = this.pretty;
      ref6 = options.writer || {};
      for (key in ref6) {
        if (!hasProp.call(ref6, key)) continue;
        value = ref6[key];
        this[key] = value;
      }
    }

    XMLWriterBase.prototype.set = function(options) {
      var key, ref, value;
      options || (options = {});
      if ("pretty" in options) {
        this.pretty = options.pretty;
      }
      if ("allowEmpty" in options) {
        this.allowEmpty = options.allowEmpty;
      }
      if (this.pretty) {
        this.indent = "indent" in options ? options.indent : '  ';
        this.newline = "newline" in options ? options.newline : '\n';
        this.offset = "offset" in options ? options.offset : 0;
        this.dontprettytextnodes = "dontprettytextnodes" in options ? options.dontprettytextnodes : 0;
      } else {
        this.indent = '';
        this.newline = '';
        this.offset = 0;
        this.dontprettytextnodes = 0;
      }
      this.spacebeforeslash = "spacebeforeslash" in options ? options.spacebeforeslash : '';
      if (this.spacebeforeslash === true) {
        this.spacebeforeslash = ' ';
      }
      this.newlinedefault = this.newline;
      this.prettydefault = this.pretty;
      ref = options.writer || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this[key] = value;
      }
      return this;
    };

    XMLWriterBase.prototype.space = function(level) {
      var indent;
      if (this.pretty) {
        indent = (level || 0) + this.offset + 1;
        if (indent > 0) {
          return new Array(indent).join(this.indent);
        } else {
          return '';
        }
      } else {
        return '';
      }
    };

    return XMLWriterBase;

  })();

}).call(this);

},{}],29:[function(require,module,exports){
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDocument, XMLDocumentCB, XMLStreamWriter, XMLStringWriter, assign, isFunction, ref;

  ref = require('./Utility'), assign = ref.assign, isFunction = ref.isFunction;

  XMLDocument = require('./XMLDocument');

  XMLDocumentCB = require('./XMLDocumentCB');

  XMLStringWriter = require('./XMLStringWriter');

  XMLStreamWriter = require('./XMLStreamWriter');

  module.exports.create = function(name, xmldec, doctype, options) {
    var doc, root;
    if (name == null) {
      throw new Error("Root element needs a name");
    }
    options = assign({}, xmldec, doctype, options);
    doc = new XMLDocument(options);
    root = doc.element(name);
    if (!options.headless) {
      doc.declaration(options);
      if ((options.pubID != null) || (options.sysID != null)) {
        doc.doctype(options);
      }
    }
    return root;
  };

  module.exports.begin = function(options, onData, onEnd) {
    var ref1;
    if (isFunction(options)) {
      ref1 = [options, onData], onData = ref1[0], onEnd = ref1[1];
      options = {};
    }
    if (onData) {
      return new XMLDocumentCB(options, onData, onEnd);
    } else {
      return new XMLDocument(options);
    }
  };

  module.exports.stringWriter = function(options) {
    return new XMLStringWriter(options);
  };

  module.exports.streamWriter = function(stream, options) {
    return new XMLStreamWriter(stream, options);
  };

}).call(this);

},{"./Utility":8,"./XMLDocument":18,"./XMLDocumentCB":19,"./XMLStreamWriter":24,"./XMLStringWriter":25}],30:[function(require,module,exports){
function DOMParser(options){
	this.options = options ||{locator:{}};
	
}
DOMParser.prototype.parseFromString = function(source,mimeType){
	var options = this.options;
	var sax =  new XMLReader();
	var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
	var errorHandler = options.errorHandler;
	var locator = options.locator;
	var defaultNSMap = options.xmlns||{};
	var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
	if(locator){
		domBuilder.setDocumentLocator(locator)
	}
	
	sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
	sax.domBuilder = options.domBuilder || domBuilder;
	if(/\/x?html?$/.test(mimeType)){
		entityMap.nbsp = '\xa0';
		entityMap.copy = '\xa9';
		defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
	}
	defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
	if(source){
		sax.parse(source,defaultNSMap,entityMap);
	}else{
		sax.errorHandler.error("invalid doc source");
	}
	return domBuilder.doc;
}
function buildErrorHandler(errorImpl,domBuilder,locator){
	if(!errorImpl){
		if(domBuilder instanceof DOMHandler){
			return domBuilder;
		}
		errorImpl = domBuilder ;
	}
	var errorHandler = {}
	var isCallback = errorImpl instanceof Function;
	locator = locator||{}
	function build(key){
		var fn = errorImpl[key];
		if(!fn && isCallback){
			fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
		}
		errorHandler[key] = fn && function(msg){
			fn('[xmldom '+key+']\t'+msg+_locator(locator));
		}||function(){};
	}
	build('warning');
	build('error');
	build('fatalError');
	return errorHandler;
}

//console.log('#\n\n\n\n\n\n\n####')
/**
 * +ContentHandler+ErrorHandler
 * +LexicalHandler+EntityResolver2
 * -DeclHandler-DTDHandler 
 * 
 * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
 * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
 * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
 */
function DOMHandler() {
    this.cdata = false;
}
function position(locator,node){
	node.lineNumber = locator.lineNumber;
	node.columnNumber = locator.columnNumber;
}
/**
 * @see org.xml.sax.ContentHandler#startDocument
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
 */ 
DOMHandler.prototype = {
	startDocument : function() {
    	this.doc = new DOMImplementation().createDocument(null, null, null);
    	if (this.locator) {
        	this.doc.documentURI = this.locator.systemId;
    	}
	},
	startElement:function(namespaceURI, localName, qName, attrs) {
		var doc = this.doc;
	    var el = doc.createElementNS(namespaceURI, qName||localName);
	    var len = attrs.length;
	    appendElement(this, el);
	    this.currentElement = el;
	    
		this.locator && position(this.locator,el)
	    for (var i = 0 ; i < len; i++) {
	        var namespaceURI = attrs.getURI(i);
	        var value = attrs.getValue(i);
	        var qName = attrs.getQName(i);
			var attr = doc.createAttributeNS(namespaceURI, qName);
			this.locator &&position(attrs.getLocator(i),attr);
			attr.value = attr.nodeValue = value;
			el.setAttributeNode(attr)
	    }
	},
	endElement:function(namespaceURI, localName, qName) {
		var current = this.currentElement
		var tagName = current.tagName;
		this.currentElement = current.parentNode;
	},
	startPrefixMapping:function(prefix, uri) {
	},
	endPrefixMapping:function(prefix) {
	},
	processingInstruction:function(target, data) {
	    var ins = this.doc.createProcessingInstruction(target, data);
	    this.locator && position(this.locator,ins)
	    appendElement(this, ins);
	},
	ignorableWhitespace:function(ch, start, length) {
	},
	characters:function(chars, start, length) {
		chars = _toString.apply(this,arguments)
		//console.log(chars)
		if(chars){
			if (this.cdata) {
				var charNode = this.doc.createCDATASection(chars);
			} else {
				var charNode = this.doc.createTextNode(chars);
			}
			if(this.currentElement){
				this.currentElement.appendChild(charNode);
			}else if(/^\s*$/.test(chars)){
				this.doc.appendChild(charNode);
				//process xml
			}
			this.locator && position(this.locator,charNode)
		}
	},
	skippedEntity:function(name) {
	},
	endDocument:function() {
		this.doc.normalize();
	},
	setDocumentLocator:function (locator) {
	    if(this.locator = locator){// && !('lineNumber' in locator)){
	    	locator.lineNumber = 0;
	    }
	},
	//LexicalHandler
	comment:function(chars, start, length) {
		chars = _toString.apply(this,arguments)
	    var comm = this.doc.createComment(chars);
	    this.locator && position(this.locator,comm)
	    appendElement(this, comm);
	},
	
	startCDATA:function() {
	    //used in characters() methods
	    this.cdata = true;
	},
	endCDATA:function() {
	    this.cdata = false;
	},
	
	startDTD:function(name, publicId, systemId) {
		var impl = this.doc.implementation;
	    if (impl && impl.createDocumentType) {
	        var dt = impl.createDocumentType(name, publicId, systemId);
	        this.locator && position(this.locator,dt)
	        appendElement(this, dt);
	    }
	},
	/**
	 * @see org.xml.sax.ErrorHandler
	 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
	 */
	warning:function(error) {
		console.warn('[xmldom warning]\t'+error,_locator(this.locator));
	},
	error:function(error) {
		console.error('[xmldom error]\t'+error,_locator(this.locator));
	},
	fatalError:function(error) {
		console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
	    throw error;
	}
}
function _locator(l){
	if(l){
		return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
	}
}
function _toString(chars,start,length){
	if(typeof chars == 'string'){
		return chars.substr(start,length)
	}else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
		if(chars.length >= start+length || start){
			return new java.lang.String(chars,start,length)+'';
		}
		return chars;
	}
}

/*
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
 * used method of org.xml.sax.ext.LexicalHandler:
 *  #comment(chars, start, length)
 *  #startCDATA()
 *  #endCDATA()
 *  #startDTD(name, publicId, systemId)
 *
 *
 * IGNORED method of org.xml.sax.ext.LexicalHandler:
 *  #endDTD()
 *  #startEntity(name)
 *  #endEntity(name)
 *
 *
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
 * IGNORED method of org.xml.sax.ext.DeclHandler
 * 	#attributeDecl(eName, aName, type, mode, value)
 *  #elementDecl(name, model)
 *  #externalEntityDecl(name, publicId, systemId)
 *  #internalEntityDecl(name, value)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
 * IGNORED method of org.xml.sax.EntityResolver2
 *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
 *  #resolveEntity(publicId, systemId)
 *  #getExternalSubset(name, baseURI)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
 * IGNORED method of org.xml.sax.DTDHandler
 *  #notationDecl(name, publicId, systemId) {};
 *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
 */
"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
	DOMHandler.prototype[key] = function(){return null}
})

/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
function appendElement (hander,node) {
    if (!hander.currentElement) {
        hander.doc.appendChild(node);
    } else {
        hander.currentElement.appendChild(node);
    }
}//appendChild and setAttributeNS are preformance key

//if(typeof require == 'function'){
	var XMLReader = require('./sax').XMLReader;
	var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;
	exports.XMLSerializer = require('./dom').XMLSerializer ;
	exports.DOMParser = DOMParser;
//}

},{"./dom":31,"./sax":32}],31:[function(require,module,exports){
/*
 * DOM Level 2
 * Object DOMException
 * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
 */

function copy(src,dest){
	for(var p in src){
		dest[p] = src[p];
	}
}
/**
^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
 */
function _extends(Class,Super){
	var pt = Class.prototype;
	if(Object.create){
		var ppt = Object.create(Super.prototype)
		pt.__proto__ = ppt;
	}
	if(!(pt instanceof Super)){
		function t(){};
		t.prototype = Super.prototype;
		t = new t();
		copy(pt,t);
		Class.prototype = pt = t;
	}
	if(pt.constructor != Class){
		if(typeof Class != 'function'){
			console.error("unknow Class:"+Class)
		}
		pt.constructor = Class
	}
}
var htmlns = 'http://www.w3.org/1999/xhtml' ;
// Node Types
var NodeType = {}
var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;

// ExceptionCode
var ExceptionCode = {}
var ExceptionMessage = {};
var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
//level2
var INVALID_STATE_ERR        	= ExceptionCode.INVALID_STATE_ERR        	= ((ExceptionMessage[11]="Invalid state"),11);
var SYNTAX_ERR               	= ExceptionCode.SYNTAX_ERR               	= ((ExceptionMessage[12]="Syntax error"),12);
var INVALID_MODIFICATION_ERR 	= ExceptionCode.INVALID_MODIFICATION_ERR 	= ((ExceptionMessage[13]="Invalid modification"),13);
var NAMESPACE_ERR            	= ExceptionCode.NAMESPACE_ERR           	= ((ExceptionMessage[14]="Invalid namespace"),14);
var INVALID_ACCESS_ERR       	= ExceptionCode.INVALID_ACCESS_ERR      	= ((ExceptionMessage[15]="Invalid access"),15);


function DOMException(code, message) {
	if(message instanceof Error){
		var error = message;
	}else{
		error = this;
		Error.call(this, ExceptionMessage[code]);
		this.message = ExceptionMessage[code];
		if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
	}
	error.code = code;
	if(message) this.message = this.message + ": " + message;
	return error;
};
DOMException.prototype = Error.prototype;
copy(ExceptionCode,DOMException)
/**
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
 * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
 * The items in the NodeList are accessible via an integral index, starting from 0.
 */
function NodeList() {
};
NodeList.prototype = {
	/**
	 * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
	 * @standard level1
	 */
	length:0, 
	/**
	 * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
	 * @standard level1
	 * @param index  unsigned long 
	 *   Index into the collection.
	 * @return Node
	 * 	The node at the indexth position in the NodeList, or null if that is not a valid index. 
	 */
	item: function(index) {
		return this[index] || null;
	},
	toString:function(isHTML,nodeFilter){
		for(var buf = [], i = 0;i<this.length;i++){
			serializeToString(this[i],buf,isHTML,nodeFilter);
		}
		return buf.join('');
	}
};
function LiveNodeList(node,refresh){
	this._node = node;
	this._refresh = refresh
	_updateLiveList(this);
}
function _updateLiveList(list){
	var inc = list._node._inc || list._node.ownerDocument._inc;
	if(list._inc != inc){
		var ls = list._refresh(list._node);
		//console.log(ls.length)
		__set__(list,'length',ls.length);
		copy(ls,list);
		list._inc = inc;
	}
}
LiveNodeList.prototype.item = function(i){
	_updateLiveList(this);
	return this[i];
}

_extends(LiveNodeList,NodeList);
/**
 * 
 * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
 * NamedNodeMap objects in the DOM are live.
 * used for attributes or DocumentType entities 
 */
function NamedNodeMap() {
};

function _findNodeIndex(list,node){
	var i = list.length;
	while(i--){
		if(list[i] === node){return i}
	}
}

function _addNamedNode(el,list,newAttr,oldAttr){
	if(oldAttr){
		list[_findNodeIndex(list,oldAttr)] = newAttr;
	}else{
		list[list.length++] = newAttr;
	}
	if(el){
		newAttr.ownerElement = el;
		var doc = el.ownerDocument;
		if(doc){
			oldAttr && _onRemoveAttribute(doc,el,oldAttr);
			_onAddAttribute(doc,el,newAttr);
		}
	}
}
function _removeNamedNode(el,list,attr){
	//console.log('remove attr:'+attr)
	var i = _findNodeIndex(list,attr);
	if(i>=0){
		var lastIndex = list.length-1
		while(i<lastIndex){
			list[i] = list[++i]
		}
		list.length = lastIndex;
		if(el){
			var doc = el.ownerDocument;
			if(doc){
				_onRemoveAttribute(doc,el,attr);
				attr.ownerElement = null;
			}
		}
	}else{
		throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
	}
}
NamedNodeMap.prototype = {
	length:0,
	item:NodeList.prototype.item,
	getNamedItem: function(key) {
//		if(key.indexOf(':')>0 || key == 'xmlns'){
//			return null;
//		}
		//console.log()
		var i = this.length;
		while(i--){
			var attr = this[i];
			//console.log(attr.nodeName,key)
			if(attr.nodeName == key){
				return attr;
			}
		}
	},
	setNamedItem: function(attr) {
		var el = attr.ownerElement;
		if(el && el!=this._ownerElement){
			throw new DOMException(INUSE_ATTRIBUTE_ERR);
		}
		var oldAttr = this.getNamedItem(attr.nodeName);
		_addNamedNode(this._ownerElement,this,attr,oldAttr);
		return oldAttr;
	},
	/* returns Node */
	setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
		var el = attr.ownerElement, oldAttr;
		if(el && el!=this._ownerElement){
			throw new DOMException(INUSE_ATTRIBUTE_ERR);
		}
		oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
		_addNamedNode(this._ownerElement,this,attr,oldAttr);
		return oldAttr;
	},

	/* returns Node */
	removeNamedItem: function(key) {
		var attr = this.getNamedItem(key);
		_removeNamedNode(this._ownerElement,this,attr);
		return attr;
		
		
	},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
	
	//for level2
	removeNamedItemNS:function(namespaceURI,localName){
		var attr = this.getNamedItemNS(namespaceURI,localName);
		_removeNamedNode(this._ownerElement,this,attr);
		return attr;
	},
	getNamedItemNS: function(namespaceURI, localName) {
		var i = this.length;
		while(i--){
			var node = this[i];
			if(node.localName == localName && node.namespaceURI == namespaceURI){
				return node;
			}
		}
		return null;
	}
};
/**
 * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
 */
function DOMImplementation(/* Object */ features) {
	this._features = {};
	if (features) {
		for (var feature in features) {
			 this._features = features[feature];
		}
	}
};

DOMImplementation.prototype = {
	hasFeature: function(/* string */ feature, /* string */ version) {
		var versions = this._features[feature.toLowerCase()];
		if (versions && (!version || version in versions)) {
			return true;
		} else {
			return false;
		}
	},
	// Introduced in DOM Level 2:
	createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
		var doc = new Document();
		doc.implementation = this;
		doc.childNodes = new NodeList();
		doc.doctype = doctype;
		if(doctype){
			doc.appendChild(doctype);
		}
		if(qualifiedName){
			var root = doc.createElementNS(namespaceURI,qualifiedName);
			doc.appendChild(root);
		}
		return doc;
	},
	// Introduced in DOM Level 2:
	createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
		var node = new DocumentType();
		node.name = qualifiedName;
		node.nodeName = qualifiedName;
		node.publicId = publicId;
		node.systemId = systemId;
		// Introduced in DOM Level 2:
		//readonly attribute DOMString        internalSubset;
		
		//TODO:..
		//  readonly attribute NamedNodeMap     entities;
		//  readonly attribute NamedNodeMap     notations;
		return node;
	}
};


/**
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
 */

function Node() {
};

Node.prototype = {
	firstChild : null,
	lastChild : null,
	previousSibling : null,
	nextSibling : null,
	attributes : null,
	parentNode : null,
	childNodes : null,
	ownerDocument : null,
	nodeValue : null,
	namespaceURI : null,
	prefix : null,
	localName : null,
	// Modified in DOM Level 2:
	insertBefore:function(newChild, refChild){//raises 
		return _insertBefore(this,newChild,refChild);
	},
	replaceChild:function(newChild, oldChild){//raises 
		this.insertBefore(newChild,oldChild);
		if(oldChild){
			this.removeChild(oldChild);
		}
	},
	removeChild:function(oldChild){
		return _removeChild(this,oldChild);
	},
	appendChild:function(newChild){
		return this.insertBefore(newChild,null);
	},
	hasChildNodes:function(){
		return this.firstChild != null;
	},
	cloneNode:function(deep){
		return cloneNode(this.ownerDocument||this,this,deep);
	},
	// Modified in DOM Level 2:
	normalize:function(){
		var child = this.firstChild;
		while(child){
			var next = child.nextSibling;
			if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
				this.removeChild(next);
				child.appendData(next.data);
			}else{
				child.normalize();
				child = next;
			}
		}
	},
  	// Introduced in DOM Level 2:
	isSupported:function(feature, version){
		return this.ownerDocument.implementation.hasFeature(feature,version);
	},
    // Introduced in DOM Level 2:
    hasAttributes:function(){
    	return this.attributes.length>0;
    },
    lookupPrefix:function(namespaceURI){
    	var el = this;
    	while(el){
    		var map = el._nsMap;
    		//console.dir(map)
    		if(map){
    			for(var n in map){
    				if(map[n] == namespaceURI){
    					return n;
    				}
    			}
    		}
    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
    	}
    	return null;
    },
    // Introduced in DOM Level 3:
    lookupNamespaceURI:function(prefix){
    	var el = this;
    	while(el){
    		var map = el._nsMap;
    		//console.dir(map)
    		if(map){
    			if(prefix in map){
    				return map[prefix] ;
    			}
    		}
    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
    	}
    	return null;
    },
    // Introduced in DOM Level 3:
    isDefaultNamespace:function(namespaceURI){
    	var prefix = this.lookupPrefix(namespaceURI);
    	return prefix == null;
    }
};


function _xmlEncoder(c){
	return c == '<' && '&lt;' ||
         c == '>' && '&gt;' ||
         c == '&' && '&amp;' ||
         c == '"' && '&quot;' ||
         '&#'+c.charCodeAt()+';'
}


copy(NodeType,Node);
copy(NodeType,Node.prototype);

/**
 * @param callback return true for continue,false for break
 * @return boolean true: break visit;
 */
function _visitNode(node,callback){
	if(callback(node)){
		return true;
	}
	if(node = node.firstChild){
		do{
			if(_visitNode(node,callback)){return true}
        }while(node=node.nextSibling)
    }
}



function Document(){
}
function _onAddAttribute(doc,el,newAttr){
	doc && doc._inc++;
	var ns = newAttr.namespaceURI ;
	if(ns == 'http://www.w3.org/2000/xmlns/'){
		//update namespace
		el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value
	}
}
function _onRemoveAttribute(doc,el,newAttr,remove){
	doc && doc._inc++;
	var ns = newAttr.namespaceURI ;
	if(ns == 'http://www.w3.org/2000/xmlns/'){
		//update namespace
		delete el._nsMap[newAttr.prefix?newAttr.localName:'']
	}
}
function _onUpdateChild(doc,el,newChild){
	if(doc && doc._inc){
		doc._inc++;
		//update childNodes
		var cs = el.childNodes;
		if(newChild){
			cs[cs.length++] = newChild;
		}else{
			//console.log(1)
			var child = el.firstChild;
			var i = 0;
			while(child){
				cs[i++] = child;
				child =child.nextSibling;
			}
			cs.length = i;
		}
	}
}

/**
 * attributes;
 * children;
 * 
 * writeable properties:
 * nodeValue,Attr:value,CharacterData:data
 * prefix
 */
function _removeChild(parentNode,child){
	var previous = child.previousSibling;
	var next = child.nextSibling;
	if(previous){
		previous.nextSibling = next;
	}else{
		parentNode.firstChild = next
	}
	if(next){
		next.previousSibling = previous;
	}else{
		parentNode.lastChild = previous;
	}
	_onUpdateChild(parentNode.ownerDocument,parentNode);
	return child;
}
/**
 * preformance key(refChild == null)
 */
function _insertBefore(parentNode,newChild,nextChild){
	var cp = newChild.parentNode;
	if(cp){
		cp.removeChild(newChild);//remove and update
	}
	if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
		var newFirst = newChild.firstChild;
		if (newFirst == null) {
			return newChild;
		}
		var newLast = newChild.lastChild;
	}else{
		newFirst = newLast = newChild;
	}
	var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;

	newFirst.previousSibling = pre;
	newLast.nextSibling = nextChild;
	
	
	if(pre){
		pre.nextSibling = newFirst;
	}else{
		parentNode.firstChild = newFirst;
	}
	if(nextChild == null){
		parentNode.lastChild = newLast;
	}else{
		nextChild.previousSibling = newLast;
	}
	do{
		newFirst.parentNode = parentNode;
	}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
	_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
	//console.log(parentNode.lastChild.nextSibling == null)
	if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
		newChild.firstChild = newChild.lastChild = null;
	}
	return newChild;
}
function _appendSingleChild(parentNode,newChild){
	var cp = newChild.parentNode;
	if(cp){
		var pre = parentNode.lastChild;
		cp.removeChild(newChild);//remove and update
		var pre = parentNode.lastChild;
	}
	var pre = parentNode.lastChild;
	newChild.parentNode = parentNode;
	newChild.previousSibling = pre;
	newChild.nextSibling = null;
	if(pre){
		pre.nextSibling = newChild;
	}else{
		parentNode.firstChild = newChild;
	}
	parentNode.lastChild = newChild;
	_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
	return newChild;
	//console.log("__aa",parentNode.lastChild.nextSibling == null)
}
Document.prototype = {
	//implementation : null,
	nodeName :  '#document',
	nodeType :  DOCUMENT_NODE,
	doctype :  null,
	documentElement :  null,
	_inc : 1,
	
	insertBefore :  function(newChild, refChild){//raises 
		if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
			var child = newChild.firstChild;
			while(child){
				var next = child.nextSibling;
				this.insertBefore(child,refChild);
				child = next;
			}
			return newChild;
		}
		if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
			this.documentElement = newChild;
		}
		
		return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
	},
	removeChild :  function(oldChild){
		if(this.documentElement == oldChild){
			this.documentElement = null;
		}
		return _removeChild(this,oldChild);
	},
	// Introduced in DOM Level 2:
	importNode : function(importedNode,deep){
		return importNode(this,importedNode,deep);
	},
	// Introduced in DOM Level 2:
	getElementById :	function(id){
		var rtv = null;
		_visitNode(this.documentElement,function(node){
			if(node.nodeType == ELEMENT_NODE){
				if(node.getAttribute('id') == id){
					rtv = node;
					return true;
				}
			}
		})
		return rtv;
	},
	
	//document factory method:
	createElement :	function(tagName){
		var node = new Element();
		node.ownerDocument = this;
		node.nodeName = tagName;
		node.tagName = tagName;
		node.childNodes = new NodeList();
		var attrs	= node.attributes = new NamedNodeMap();
		attrs._ownerElement = node;
		return node;
	},
	createDocumentFragment :	function(){
		var node = new DocumentFragment();
		node.ownerDocument = this;
		node.childNodes = new NodeList();
		return node;
	},
	createTextNode :	function(data){
		var node = new Text();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createComment :	function(data){
		var node = new Comment();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createCDATASection :	function(data){
		var node = new CDATASection();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createProcessingInstruction :	function(target,data){
		var node = new ProcessingInstruction();
		node.ownerDocument = this;
		node.tagName = node.target = target;
		node.nodeValue= node.data = data;
		return node;
	},
	createAttribute :	function(name){
		var node = new Attr();
		node.ownerDocument	= this;
		node.name = name;
		node.nodeName	= name;
		node.localName = name;
		node.specified = true;
		return node;
	},
	createEntityReference :	function(name){
		var node = new EntityReference();
		node.ownerDocument	= this;
		node.nodeName	= name;
		return node;
	},
	// Introduced in DOM Level 2:
	createElementNS :	function(namespaceURI,qualifiedName){
		var node = new Element();
		var pl = qualifiedName.split(':');
		var attrs	= node.attributes = new NamedNodeMap();
		node.childNodes = new NodeList();
		node.ownerDocument = this;
		node.nodeName = qualifiedName;
		node.tagName = qualifiedName;
		node.namespaceURI = namespaceURI;
		if(pl.length == 2){
			node.prefix = pl[0];
			node.localName = pl[1];
		}else{
			//el.prefix = null;
			node.localName = qualifiedName;
		}
		attrs._ownerElement = node;
		return node;
	},
	// Introduced in DOM Level 2:
	createAttributeNS :	function(namespaceURI,qualifiedName){
		var node = new Attr();
		var pl = qualifiedName.split(':');
		node.ownerDocument = this;
		node.nodeName = qualifiedName;
		node.name = qualifiedName;
		node.namespaceURI = namespaceURI;
		node.specified = true;
		if(pl.length == 2){
			node.prefix = pl[0];
			node.localName = pl[1];
		}else{
			//el.prefix = null;
			node.localName = qualifiedName;
		}
		return node;
	}
};
_extends(Document,Node);


function Element() {
	this._nsMap = {};
};
Element.prototype = {
	nodeType : ELEMENT_NODE,
	hasAttribute : function(name){
		return this.getAttributeNode(name)!=null;
	},
	getAttribute : function(name){
		var attr = this.getAttributeNode(name);
		return attr && attr.value || '';
	},
	getAttributeNode : function(name){
		return this.attributes.getNamedItem(name);
	},
	setAttribute : function(name, value){
		var attr = this.ownerDocument.createAttribute(name);
		attr.value = attr.nodeValue = "" + value;
		this.setAttributeNode(attr)
	},
	removeAttribute : function(name){
		var attr = this.getAttributeNode(name)
		attr && this.removeAttributeNode(attr);
	},
	
	//four real opeartion method
	appendChild:function(newChild){
		if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
			return this.insertBefore(newChild,null);
		}else{
			return _appendSingleChild(this,newChild);
		}
	},
	setAttributeNode : function(newAttr){
		return this.attributes.setNamedItem(newAttr);
	},
	setAttributeNodeNS : function(newAttr){
		return this.attributes.setNamedItemNS(newAttr);
	},
	removeAttributeNode : function(oldAttr){
		//console.log(this == oldAttr.ownerElement)
		return this.attributes.removeNamedItem(oldAttr.nodeName);
	},
	//get real attribute name,and remove it by removeAttributeNode
	removeAttributeNS : function(namespaceURI, localName){
		var old = this.getAttributeNodeNS(namespaceURI, localName);
		old && this.removeAttributeNode(old);
	},
	
	hasAttributeNS : function(namespaceURI, localName){
		return this.getAttributeNodeNS(namespaceURI, localName)!=null;
	},
	getAttributeNS : function(namespaceURI, localName){
		var attr = this.getAttributeNodeNS(namespaceURI, localName);
		return attr && attr.value || '';
	},
	setAttributeNS : function(namespaceURI, qualifiedName, value){
		var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
		attr.value = attr.nodeValue = "" + value;
		this.setAttributeNode(attr)
	},
	getAttributeNodeNS : function(namespaceURI, localName){
		return this.attributes.getNamedItemNS(namespaceURI, localName);
	},
	
	getElementsByTagName : function(tagName){
		return new LiveNodeList(this,function(base){
			var ls = [];
			_visitNode(base,function(node){
				if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
					ls.push(node);
				}
			});
			return ls;
		});
	},
	getElementsByTagNameNS : function(namespaceURI, localName){
		return new LiveNodeList(this,function(base){
			var ls = [];
			_visitNode(base,function(node){
				if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
					ls.push(node);
				}
			});
			return ls;
			
		});
	}
};
Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;


_extends(Element,Node);
function Attr() {
};
Attr.prototype.nodeType = ATTRIBUTE_NODE;
_extends(Attr,Node);


function CharacterData() {
};
CharacterData.prototype = {
	data : '',
	substringData : function(offset, count) {
		return this.data.substring(offset, offset+count);
	},
	appendData: function(text) {
		text = this.data+text;
		this.nodeValue = this.data = text;
		this.length = text.length;
	},
	insertData: function(offset,text) {
		this.replaceData(offset,0,text);
	
	},
	appendChild:function(newChild){
		throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
	},
	deleteData: function(offset, count) {
		this.replaceData(offset,count,"");
	},
	replaceData: function(offset, count, text) {
		var start = this.data.substring(0,offset);
		var end = this.data.substring(offset+count);
		text = start + text + end;
		this.nodeValue = this.data = text;
		this.length = text.length;
	}
}
_extends(CharacterData,Node);
function Text() {
};
Text.prototype = {
	nodeName : "#text",
	nodeType : TEXT_NODE,
	splitText : function(offset) {
		var text = this.data;
		var newText = text.substring(offset);
		text = text.substring(0, offset);
		this.data = this.nodeValue = text;
		this.length = text.length;
		var newNode = this.ownerDocument.createTextNode(newText);
		if(this.parentNode){
			this.parentNode.insertBefore(newNode, this.nextSibling);
		}
		return newNode;
	}
}
_extends(Text,CharacterData);
function Comment() {
};
Comment.prototype = {
	nodeName : "#comment",
	nodeType : COMMENT_NODE
}
_extends(Comment,CharacterData);

function CDATASection() {
};
CDATASection.prototype = {
	nodeName : "#cdata-section",
	nodeType : CDATA_SECTION_NODE
}
_extends(CDATASection,CharacterData);


function DocumentType() {
};
DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
_extends(DocumentType,Node);

function Notation() {
};
Notation.prototype.nodeType = NOTATION_NODE;
_extends(Notation,Node);

function Entity() {
};
Entity.prototype.nodeType = ENTITY_NODE;
_extends(Entity,Node);

function EntityReference() {
};
EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
_extends(EntityReference,Node);

function DocumentFragment() {
};
DocumentFragment.prototype.nodeName =	"#document-fragment";
DocumentFragment.prototype.nodeType =	DOCUMENT_FRAGMENT_NODE;
_extends(DocumentFragment,Node);


function ProcessingInstruction() {
}
ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
_extends(ProcessingInstruction,Node);
function XMLSerializer(){}
XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){
	return nodeSerializeToString.call(node,isHtml,nodeFilter);
}
Node.prototype.toString = nodeSerializeToString;
function nodeSerializeToString(isHtml,nodeFilter){
	var buf = [];
	var refNode = this.nodeType == 9?this.documentElement:this;
	var prefix = refNode.prefix;
	var uri = refNode.namespaceURI;
	
	if(uri && prefix == null){
		//console.log(prefix)
		var prefix = refNode.lookupPrefix(uri);
		if(prefix == null){
			//isHTML = true;
			var visibleNamespaces=[
			{namespace:uri,prefix:null}
			//{namespace:uri,prefix:''}
			]
		}
	}
	serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
	//console.log('###',this.nodeType,uri,prefix,buf.join(''))
	return buf.join('');
}
function needNamespaceDefine(node,isHTML, visibleNamespaces) {
	var prefix = node.prefix||'';
	var uri = node.namespaceURI;
	if (!prefix && !uri){
		return false;
	}
	if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
		|| uri == 'http://www.w3.org/2000/xmlns/'){
		return false;
	}
	
	var i = visibleNamespaces.length 
	//console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
	while (i--) {
		var ns = visibleNamespaces[i];
		// get namespace prefix
		//console.log(node.nodeType,node.tagName,ns.prefix,prefix)
		if (ns.prefix == prefix){
			return ns.namespace != uri;
		}
	}
	//console.log(isHTML,uri,prefix=='')
	//if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
	//	return false;
	//}
	//node.flag = '11111'
	//console.error(3,true,node.flag,node.prefix,node.namespaceURI)
	return true;
}
function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
	if(nodeFilter){
		node = nodeFilter(node);
		if(node){
			if(typeof node == 'string'){
				buf.push(node);
				return;
			}
		}else{
			return;
		}
		//buf.sort.apply(attrs, attributeSorter);
	}
	switch(node.nodeType){
	case ELEMENT_NODE:
		if (!visibleNamespaces) visibleNamespaces = [];
		var startVisibleNamespaces = visibleNamespaces.length;
		var attrs = node.attributes;
		var len = attrs.length;
		var child = node.firstChild;
		var nodeName = node.tagName;
		
		isHTML =  (htmlns === node.namespaceURI) ||isHTML 
		buf.push('<',nodeName);
		
		
		
		for(var i=0;i<len;i++){
			// add namespaces for attributes
			var attr = attrs.item(i);
			if (attr.prefix == 'xmlns') {
				visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
			}else if(attr.nodeName == 'xmlns'){
				visibleNamespaces.push({ prefix: '', namespace: attr.value });
			}
		}
		for(var i=0;i<len;i++){
			var attr = attrs.item(i);
			if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
				var prefix = attr.prefix||'';
				var uri = attr.namespaceURI;
				var ns = prefix ? ' xmlns:' + prefix : " xmlns";
				buf.push(ns, '="' , uri , '"');
				visibleNamespaces.push({ prefix: prefix, namespace:uri });
			}
			serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
		}
		// add namespace for current node		
		if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
			var prefix = node.prefix||'';
			var uri = node.namespaceURI;
			var ns = prefix ? ' xmlns:' + prefix : " xmlns";
			buf.push(ns, '="' , uri , '"');
			visibleNamespaces.push({ prefix: prefix, namespace:uri });
		}
		
		if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
			buf.push('>');
			//if is cdata child node
			if(isHTML && /^script$/i.test(nodeName)){
				while(child){
					if(child.data){
						buf.push(child.data);
					}else{
						serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
					}
					child = child.nextSibling;
				}
			}else
			{
				while(child){
					serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
					child = child.nextSibling;
				}
			}
			buf.push('</',nodeName,'>');
		}else{
			buf.push('/>');
		}
		// remove added visible namespaces
		//visibleNamespaces.length = startVisibleNamespaces;
		return;
	case DOCUMENT_NODE:
	case DOCUMENT_FRAGMENT_NODE:
		var child = node.firstChild;
		while(child){
			serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
			child = child.nextSibling;
		}
		return;
	case ATTRIBUTE_NODE:
		return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
	case TEXT_NODE:
		return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
	case CDATA_SECTION_NODE:
		return buf.push( '<![CDATA[',node.data,']]>');
	case COMMENT_NODE:
		return buf.push( "<!--",node.data,"-->");
	case DOCUMENT_TYPE_NODE:
		var pubid = node.publicId;
		var sysid = node.systemId;
		buf.push('<!DOCTYPE ',node.name);
		if(pubid){
			buf.push(' PUBLIC "',pubid);
			if (sysid && sysid!='.') {
				buf.push( '" "',sysid);
			}
			buf.push('">');
		}else if(sysid && sysid!='.'){
			buf.push(' SYSTEM "',sysid,'">');
		}else{
			var sub = node.internalSubset;
			if(sub){
				buf.push(" [",sub,"]");
			}
			buf.push(">");
		}
		return;
	case PROCESSING_INSTRUCTION_NODE:
		return buf.push( "<?",node.target," ",node.data,"?>");
	case ENTITY_REFERENCE_NODE:
		return buf.push( '&',node.nodeName,';');
	//case ENTITY_NODE:
	//case NOTATION_NODE:
	default:
		buf.push('??',node.nodeName);
	}
}
function importNode(doc,node,deep){
	var node2;
	switch (node.nodeType) {
	case ELEMENT_NODE:
		node2 = node.cloneNode(false);
		node2.ownerDocument = doc;
		//var attrs = node2.attributes;
		//var len = attrs.length;
		//for(var i=0;i<len;i++){
			//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
		//}
	case DOCUMENT_FRAGMENT_NODE:
		break;
	case ATTRIBUTE_NODE:
		deep = true;
		break;
	//case ENTITY_REFERENCE_NODE:
	//case PROCESSING_INSTRUCTION_NODE:
	////case TEXT_NODE:
	//case CDATA_SECTION_NODE:
	//case COMMENT_NODE:
	//	deep = false;
	//	break;
	//case DOCUMENT_NODE:
	//case DOCUMENT_TYPE_NODE:
	//cannot be imported.
	//case ENTITY_NODE:
	//case NOTATION_NODEï¼š
	//can not hit in level3
	//default:throw e;
	}
	if(!node2){
		node2 = node.cloneNode(false);//false
	}
	node2.ownerDocument = doc;
	node2.parentNode = null;
	if(deep){
		var child = node.firstChild;
		while(child){
			node2.appendChild(importNode(doc,child,deep));
			child = child.nextSibling;
		}
	}
	return node2;
}
//
//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
//					attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
function cloneNode(doc,node,deep){
	var node2 = new node.constructor();
	for(var n in node){
		var v = node[n];
		if(typeof v != 'object' ){
			if(v != node2[n]){
				node2[n] = v;
			}
		}
	}
	if(node.childNodes){
		node2.childNodes = new NodeList();
	}
	node2.ownerDocument = doc;
	switch (node2.nodeType) {
	case ELEMENT_NODE:
		var attrs	= node.attributes;
		var attrs2	= node2.attributes = new NamedNodeMap();
		var len = attrs.length
		attrs2._ownerElement = node2;
		for(var i=0;i<len;i++){
			node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
		}
		break;;
	case ATTRIBUTE_NODE:
		deep = true;
	}
	if(deep){
		var child = node.firstChild;
		while(child){
			node2.appendChild(cloneNode(doc,child,deep));
			child = child.nextSibling;
		}
	}
	return node2;
}

function __set__(object,key,value){
	object[key] = value
}
//do dynamic
try{
	if(Object.defineProperty){
		Object.defineProperty(LiveNodeList.prototype,'length',{
			get:function(){
				_updateLiveList(this);
				return this.$$length;
			}
		});
		Object.defineProperty(Node.prototype,'textContent',{
			get:function(){
				return getTextContent(this);
			},
			set:function(data){
				switch(this.nodeType){
				case ELEMENT_NODE:
				case DOCUMENT_FRAGMENT_NODE:
					while(this.firstChild){
						this.removeChild(this.firstChild);
					}
					if(data || String(data)){
						this.appendChild(this.ownerDocument.createTextNode(data));
					}
					break;
				default:
					//TODO:
					this.data = data;
					this.value = data;
					this.nodeValue = data;
				}
			}
		})
		
		function getTextContent(node){
			switch(node.nodeType){
			case ELEMENT_NODE:
			case DOCUMENT_FRAGMENT_NODE:
				var buf = [];
				node = node.firstChild;
				while(node){
					if(node.nodeType!==7 && node.nodeType !==8){
						buf.push(getTextContent(node));
					}
					node = node.nextSibling;
				}
				return buf.join('');
			default:
				return node.nodeValue;
			}
		}
		__set__ = function(object,key,value){
			//console.log(value)
			object['$$'+key] = value
		}
	}
}catch(e){//ie8
}

//if(typeof require == 'function'){
	exports.DOMImplementation = DOMImplementation;
	exports.XMLSerializer = XMLSerializer;
//}

},{}],32:[function(require,module,exports){
//[4]   	NameStartChar	   ::=   	":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
//[4a]   	NameChar	   ::=   	NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
//[5]   	Name	   ::=   	NameStartChar (NameChar)*
var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF
var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')

//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
var S_TAG = 0;//tag name offerring
var S_ATTR = 1;//attr name offerring 
var S_ATTR_SPACE=2;//attr name end and space offer
var S_EQ = 3;//=space?
var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
var S_ATTR_END = 5;//attr value end and no space(quot end)
var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
var S_TAG_CLOSE = 7;//closed el<el />

function XMLReader(){
	
}

XMLReader.prototype = {
	parse:function(source,defaultNSMap,entityMap){
		var domBuilder = this.domBuilder;
		domBuilder.startDocument();
		_copy(defaultNSMap ,defaultNSMap = {})
		parse(source,defaultNSMap,entityMap,
				domBuilder,this.errorHandler);
		domBuilder.endDocument();
	}
}
function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
	function fixedFromCharCode(code) {
		// String.prototype.fromCharCode does not supports
		// > 2 bytes unicode chars directly
		if (code > 0xffff) {
			code -= 0x10000;
			var surrogate1 = 0xd800 + (code >> 10)
				, surrogate2 = 0xdc00 + (code & 0x3ff);

			return String.fromCharCode(surrogate1, surrogate2);
		} else {
			return String.fromCharCode(code);
		}
	}
	function entityReplacer(a){
		var k = a.slice(1,-1);
		if(k in entityMap){
			return entityMap[k]; 
		}else if(k.charAt(0) === '#'){
			return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
		}else{
			errorHandler.error('entity not found:'+a);
			return a;
		}
	}
	function appendText(end){//has some bugs
		if(end>start){
			var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
			locator&&position(start);
			domBuilder.characters(xt,0,end-start);
			start = end
		}
	}
	function position(p,m){
		while(p>=lineEnd && (m = linePattern.exec(source))){
			lineStart = m.index;
			lineEnd = lineStart + m[0].length;
			locator.lineNumber++;
			//console.log('line++:',locator,startPos,endPos)
		}
		locator.columnNumber = p-lineStart+1;
	}
	var lineStart = 0;
	var lineEnd = 0;
	var linePattern = /.*(?:\r\n?|\n)|.*$/g
	var locator = domBuilder.locator;
	
	var parseStack = [{currentNSMap:defaultNSMapCopy}]
	var closeMap = {};
	var start = 0;
	while(true){
		try{
			var tagStart = source.indexOf('<',start);
			if(tagStart<0){
				if(!source.substr(start).match(/^\s*$/)){
					var doc = domBuilder.doc;
	    			var text = doc.createTextNode(source.substr(start));
	    			doc.appendChild(text);
	    			domBuilder.currentElement = text;
				}
				return;
			}
			if(tagStart>start){
				appendText(tagStart);
			}
			switch(source.charAt(tagStart+1)){
			case '/':
				var end = source.indexOf('>',tagStart+3);
				var tagName = source.substring(tagStart+2,end);
				var config = parseStack.pop();
				if(end<0){
					
	        		tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
	        		//console.error('#@@@@@@'+tagName)
	        		errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
	        		end = tagStart+1+tagName.length;
	        	}else if(tagName.match(/\s</)){
	        		tagName = tagName.replace(/[\s<].*/,'');
	        		errorHandler.error("end tag name: "+tagName+' maybe not complete');
	        		end = tagStart+1+tagName.length;
				}
				//console.error(parseStack.length,parseStack)
				//console.error(config);
				var localNSMap = config.localNSMap;
				var endMatch = config.tagName == tagName;
				var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()
		        if(endIgnoreCaseMach){
		        	domBuilder.endElement(config.uri,config.localName,tagName);
					if(localNSMap){
						for(var prefix in localNSMap){
							domBuilder.endPrefixMapping(prefix) ;
						}
					}
					if(!endMatch){
		            	errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
					}
		        }else{
		        	parseStack.push(config)
		        }
				
				end++;
				break;
				// end elment
			case '?':// <?...?>
				locator&&position(tagStart);
				end = parseInstruction(source,tagStart,domBuilder);
				break;
			case '!':// <!doctype,<![CDATA,<!--
				locator&&position(tagStart);
				end = parseDCC(source,tagStart,domBuilder,errorHandler);
				break;
			default:
				locator&&position(tagStart);
				var el = new ElementAttributes();
				var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
				//elStartEnd
				var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
				var len = el.length;
				
				
				if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
					el.closed = true;
					if(!entityMap.nbsp){
						errorHandler.warning('unclosed xml attribute');
					}
				}
				if(locator && len){
					var locator2 = copyLocator(locator,{});
					//try{//attribute position fixed
					for(var i = 0;i<len;i++){
						var a = el[i];
						position(a.offset);
						a.locator = copyLocator(locator,{});
					}
					//}catch(e){console.error('@@@@@'+e)}
					domBuilder.locator = locator2
					if(appendElement(el,domBuilder,currentNSMap)){
						parseStack.push(el)
					}
					domBuilder.locator = locator;
				}else{
					if(appendElement(el,domBuilder,currentNSMap)){
						parseStack.push(el)
					}
				}
				
				
				
				if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
					end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)
				}else{
					end++;
				}
			}
		}catch(e){
			errorHandler.error('element parse error: '+e)
			//errorHandler.error('element parse error: '+e);
			end = -1;
			//throw e;
		}
		if(end>start){
			start = end;
		}else{
			//TODO: è¿™é‡Œæœ‰å�¯èƒ½saxå›žé€€ï¼Œæœ‰ä½�ç½®é”™è¯¯é£Žé™©
			appendText(Math.max(tagStart,start)+1);
		}
	}
}
function copyLocator(f,t){
	t.lineNumber = f.lineNumber;
	t.columnNumber = f.columnNumber;
	return t;
}

/**
 * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
 * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
 */
function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
	var attrName;
	var value;
	var p = ++start;
	var s = S_TAG;//status
	while(true){
		var c = source.charAt(p);
		switch(c){
		case '=':
			if(s === S_ATTR){//attrName
				attrName = source.slice(start,p);
				s = S_EQ;
			}else if(s === S_ATTR_SPACE){
				s = S_EQ;
			}else{
				//fatalError: equal must after attrName or space after attrName
				throw new Error('attribute equal must after attrName');
			}
			break;
		case '\'':
		case '"':
			if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
				){//equal
				if(s === S_ATTR){
					errorHandler.warning('attribute value must after "="')
					attrName = source.slice(start,p)
				}
				start = p+1;
				p = source.indexOf(c,start)
				if(p>0){
					value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
					el.add(attrName,value,start-1);
					s = S_ATTR_END;
				}else{
					//fatalError: no end quot match
					throw new Error('attribute value no end \''+c+'\' match');
				}
			}else if(s == S_ATTR_NOQUOT_VALUE){
				value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
				//console.log(attrName,value,start,p)
				el.add(attrName,value,start);
				//console.dir(el)
				errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
				start = p+1;
				s = S_ATTR_END
			}else{
				//fatalError: no equal before
				throw new Error('attribute value must after "="');
			}
			break;
		case '/':
			switch(s){
			case S_TAG:
				el.setTagName(source.slice(start,p));
			case S_ATTR_END:
			case S_TAG_SPACE:
			case S_TAG_CLOSE:
				s =S_TAG_CLOSE;
				el.closed = true;
			case S_ATTR_NOQUOT_VALUE:
			case S_ATTR:
			case S_ATTR_SPACE:
				break;
			//case S_EQ:
			default:
				throw new Error("attribute invalid close char('/')")
			}
			break;
		case ''://end document
			//throw new Error('unexpected end of input')
			errorHandler.error('unexpected end of input');
			if(s == S_TAG){
				el.setTagName(source.slice(start,p));
			}
			return p;
		case '>':
			switch(s){
			case S_TAG:
				el.setTagName(source.slice(start,p));
			case S_ATTR_END:
			case S_TAG_SPACE:
			case S_TAG_CLOSE:
				break;//normal
			case S_ATTR_NOQUOT_VALUE://Compatible state
			case S_ATTR:
				value = source.slice(start,p);
				if(value.slice(-1) === '/'){
					el.closed  = true;
					value = value.slice(0,-1)
				}
			case S_ATTR_SPACE:
				if(s === S_ATTR_SPACE){
					value = attrName;
				}
				if(s == S_ATTR_NOQUOT_VALUE){
					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
					el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start)
				}else{
					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
						errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
					}
					el.add(value,value,start)
				}
				break;
			case S_EQ:
				throw new Error('attribute value missed!!');
			}
//			console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
			return p;
		/*xml space '\x20' | #x9 | #xD | #xA; */
		case '\u0080':
			c = ' ';
		default:
			if(c<= ' '){//space
				switch(s){
				case S_TAG:
					el.setTagName(source.slice(start,p));//tagName
					s = S_TAG_SPACE;
					break;
				case S_ATTR:
					attrName = source.slice(start,p)
					s = S_ATTR_SPACE;
					break;
				case S_ATTR_NOQUOT_VALUE:
					var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
					el.add(attrName,value,start)
				case S_ATTR_END:
					s = S_TAG_SPACE;
					break;
				//case S_TAG_SPACE:
				//case S_EQ:
				//case S_ATTR_SPACE:
				//	void();break;
				//case S_TAG_CLOSE:
					//ignore warning
				}
			}else{//not space
//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
				switch(s){
				//case S_TAG:void();break;
				//case S_ATTR:void();break;
				//case S_ATTR_NOQUOT_VALUE:void();break;
				case S_ATTR_SPACE:
					var tagName =  el.tagName;
					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
						errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!')
					}
					el.add(attrName,attrName,start);
					start = p;
					s = S_ATTR;
					break;
				case S_ATTR_END:
					errorHandler.warning('attribute space is required"'+attrName+'"!!')
				case S_TAG_SPACE:
					s = S_ATTR;
					start = p;
					break;
				case S_EQ:
					s = S_ATTR_NOQUOT_VALUE;
					start = p;
					break;
				case S_TAG_CLOSE:
					throw new Error("elements closed character '/' and '>' must be connected to");
				}
			}
		}//end outer switch
		//console.log('p++',p)
		p++;
	}
}
/**
 * @return true if has new namespace define
 */
function appendElement(el,domBuilder,currentNSMap){
	var tagName = el.tagName;
	var localNSMap = null;
	//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
	var i = el.length;
	while(i--){
		var a = el[i];
		var qName = a.qName;
		var value = a.value;
		var nsp = qName.indexOf(':');
		if(nsp>0){
			var prefix = a.prefix = qName.slice(0,nsp);
			var localName = qName.slice(nsp+1);
			var nsPrefix = prefix === 'xmlns' && localName
		}else{
			localName = qName;
			prefix = null
			nsPrefix = qName === 'xmlns' && ''
		}
		//can not set prefix,because prefix !== ''
		a.localName = localName ;
		//prefix == null for no ns prefix attribute 
		if(nsPrefix !== false){//hack!!
			if(localNSMap == null){
				localNSMap = {}
				//console.log(currentNSMap,0)
				_copy(currentNSMap,currentNSMap={})
				//console.log(currentNSMap,1)
			}
			currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
			a.uri = 'http://www.w3.org/2000/xmlns/'
			domBuilder.startPrefixMapping(nsPrefix, value) 
		}
	}
	var i = el.length;
	while(i--){
		a = el[i];
		var prefix = a.prefix;
		if(prefix){//no prefix attribute has no namespace
			if(prefix === 'xml'){
				a.uri = 'http://www.w3.org/XML/1998/namespace';
			}if(prefix !== 'xmlns'){
				a.uri = currentNSMap[prefix || '']
				
				//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
			}
		}
	}
	var nsp = tagName.indexOf(':');
	if(nsp>0){
		prefix = el.prefix = tagName.slice(0,nsp);
		localName = el.localName = tagName.slice(nsp+1);
	}else{
		prefix = null;//important!!
		localName = el.localName = tagName;
	}
	//no prefix element has default namespace
	var ns = el.uri = currentNSMap[prefix || ''];
	domBuilder.startElement(ns,localName,tagName,el);
	//endPrefixMapping and startPrefixMapping have not any help for dom builder
	//localNSMap = null
	if(el.closed){
		domBuilder.endElement(ns,localName,tagName);
		if(localNSMap){
			for(prefix in localNSMap){
				domBuilder.endPrefixMapping(prefix) 
			}
		}
	}else{
		el.currentNSMap = currentNSMap;
		el.localNSMap = localNSMap;
		//parseStack.push(el);
		return true;
	}
}
function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
	if(/^(?:script|textarea)$/i.test(tagName)){
		var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
		var text = source.substring(elStartEnd+1,elEndStart);
		if(/[&<]/.test(text)){
			if(/^script$/i.test(tagName)){
				//if(!/\]\]>/.test(text)){
					//lexHandler.startCDATA();
					domBuilder.characters(text,0,text.length);
					//lexHandler.endCDATA();
					return elEndStart;
				//}
			}//}else{//text area
				text = text.replace(/&#?\w+;/g,entityReplacer);
				domBuilder.characters(text,0,text.length);
				return elEndStart;
			//}
			
		}
	}
	return elStartEnd+1;
}
function fixSelfClosed(source,elStartEnd,tagName,closeMap){
	//if(tagName in closeMap){
	var pos = closeMap[tagName];
	if(pos == null){
		//console.log(tagName)
		pos =  source.lastIndexOf('</'+tagName+'>')
		if(pos<elStartEnd){//å¿˜è®°é—­å�ˆ
			pos = source.lastIndexOf('</'+tagName)
		}
		closeMap[tagName] =pos
	}
	return pos<elStartEnd;
	//} 
}
function _copy(source,target){
	for(var n in source){target[n] = source[n]}
}
function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
	var next= source.charAt(start+2)
	switch(next){
	case '-':
		if(source.charAt(start + 3) === '-'){
			var end = source.indexOf('-->',start+4);
			//append comment source.substring(4,end)//<!--
			if(end>start){
				domBuilder.comment(source,start+4,end-start-4);
				return end+3;
			}else{
				errorHandler.error("Unclosed comment");
				return -1;
			}
		}else{
			//error
			return -1;
		}
	default:
		if(source.substr(start+3,6) == 'CDATA['){
			var end = source.indexOf(']]>',start+9);
			domBuilder.startCDATA();
			domBuilder.characters(source,start+9,end-start-9);
			domBuilder.endCDATA() 
			return end+3;
		}
		//<!DOCTYPE
		//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
		var matchs = split(source,start);
		var len = matchs.length;
		if(len>1 && /!doctype/i.test(matchs[0][0])){
			var name = matchs[1][0];
			var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0]
			var sysid = len>4 && matchs[4][0];
			var lastMatch = matchs[len-1]
			domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
					sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
			domBuilder.endDTD();
			
			return lastMatch.index+lastMatch[0].length
		}
	}
	return -1;
}



function parseInstruction(source,start,domBuilder){
	var end = source.indexOf('?>',start);
	if(end){
		var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
		if(match){
			var len = match[0].length;
			domBuilder.processingInstruction(match[1], match[2]) ;
			return end+2;
		}else{//error
			return -1;
		}
	}
	return -1;
}

/**
 * @param source
 */
function ElementAttributes(source){
	
}
ElementAttributes.prototype = {
	setTagName:function(tagName){
		if(!tagNamePattern.test(tagName)){
			throw new Error('invalid tagName:'+tagName)
		}
		this.tagName = tagName
	},
	add:function(qName,value,offset){
		if(!tagNamePattern.test(qName)){
			throw new Error('invalid attribute:'+qName)
		}
		this[this.length++] = {qName:qName,value:value,offset:offset}
	},
	length:0,
	getLocalName:function(i){return this[i].localName},
	getLocator:function(i){return this[i].locator},
	getQName:function(i){return this[i].qName},
	getURI:function(i){return this[i].uri},
	getValue:function(i){return this[i].value}
//	,getIndex:function(uri, localName)){
//		if(localName){
//			
//		}else{
//			var qName = uri
//		}
//	},
//	getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
//	getType:function(uri,localName){}
//	getType:function(i){},
}




function _set_proto_(thiz,parent){
	thiz.__proto__ = parent;
	return thiz;
}
if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
	_set_proto_ = function(thiz,parent){
		function p(){};
		p.prototype = parent;
		p = new p();
		for(parent in thiz){
			p[parent] = thiz[parent];
		}
		return p;
	}
}

function split(source,start){
	var match;
	var buf = [];
	var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
	reg.lastIndex = start;
	reg.exec(source);//skip <
	while(match = reg.exec(source)){
		buf.push(match);
		if(match[1])return buf;
	}
}

exports.XMLReader = XMLReader;


},{}]},{},[1])(1)
});
'use strict';
module.exports = (url, opts) => {
	if (typeof url !== 'string') {
		throw new TypeError(`Expected \`url\` to be of type \`string\`, got \`${typeof url}\``);
	}

	url = url.trim();
	opts = Object.assign({https: false}, opts);

	if (/^\.*\/|^(?!localhost)\w+:/.test(url)) {
		return url;
	}

	return url.replace(/^(?!(?:\w+:)?\/\/)/, opts.https ? 'https://' : 'http://');
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Prepend `http://` to humanized URLs like todomvc.com and localhost",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/prepend-http#readme",
  "license": "MIT",
  "name": "prepend-http",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/prepend-http.git"
  },
  "version": "2.0.0"
}#!/usr/bin/env node
'use strict';
var getStdin = require('get-stdin');
var meow = require('meow');
var prettyBytes = require('./pretty-bytes');

var cli = meow({
	help: [
		'Usage',
		'  $ pretty-bytes <number>',
		'  $ echo <number> | pretty-bytes',
		'',
		'Example',
		'  $ pretty-bytes 1337',
		'  1.34 kB'
	].join('\n')
});

function init(data) {
	console.log(prettyBytes(Number(data)));
}

if (process.stdin.isTTY) {
	if (!cli.input[0]) {
		console.error('Number required');
		process.exit(1);
	}

	init(cli.input[0]);
} else {
	getStdin(init);
}
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "http://sindresorhus.com"
  },
  "bin": {
    "pretty-bytes": "cli.js"
  },
  "dependencies": {
    "get-stdin": "^4.0.1",
    "meow": "^3.1.0"
  },
  "deprecated": false,
  "description": "Convert bytes to a human readable string: 1337 â†’ 1.34 kB",
  "devDependencies": {
    "mocha": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "pretty-bytes.js",
    "cli.js"
  ],
  "homepage": "https://github.com/sindresorhus/pretty-bytes#readme",
  "license": "MIT",
  "main": "pretty-bytes.js",
  "name": "pretty-bytes",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/pretty-bytes.git"
  },
  "version": "1.0.4"
}/*!
	pretty-bytes
	Convert bytes to a human readable string: 1337 â†’ 1.34 kB
	https://github.com/sindresorhus/pretty-bytes
	by Sindre Sorhus
	MIT License
*/
(function () {
	'use strict';

	// Number.isNaN() polyfill
	var isNaN = function (val) {
		return val !== val;
	};

	var prettyBytes = function (num) {
		if (typeof num !== 'number' || isNaN(num)) {
			throw new TypeError('Expected a number');
		}

		var exponent;
		var unit;
		var neg = num < 0;
		var units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

		if (neg) {
			num = -num;
		}

		if (num < 1) {
			return (neg ? '-' : '') + num + ' B';
		}

		exponent = Math.min(Math.floor(Math.log(num) / Math.log(1000)), units.length - 1);
		num = (num / Math.pow(1000, exponent)).toFixed(2) * 1;
		unit = units[exponent];

		return (neg ? '-' : '') + num + ' ' + unit;
	};

	if (typeof module !== 'undefined' && module.exports) {
		module.exports = prettyBytes;
	} else {
		self.prettyBytes = prettyBytes;
	}
})();
'use strict';

if (typeof process === 'undefined' ||
    !process.version ||
    process.version.indexOf('v0.') === 0 ||
    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
  module.exports = { nextTick: nextTick };
} else {
  module.exports = process
}

function nextTick(fn, arg1, arg2, arg3) {
  if (typeof fn !== 'function') {
    throw new TypeError('"callback" argument must be a function');
  }
  var len = arguments.length;
  var args, i;
  switch (len) {
  case 0:
  case 1:
    return process.nextTick(fn);
  case 2:
    return process.nextTick(function afterTickOne() {
      fn.call(null, arg1);
    });
  case 3:
    return process.nextTick(function afterTickTwo() {
      fn.call(null, arg1, arg2);
    });
  case 4:
    return process.nextTick(function afterTickThree() {
      fn.call(null, arg1, arg2, arg3);
    });
  default:
    args = new Array(len - 1);
    i = 0;
    while (i < args.length) {
      args[i++] = arguments[i];
    }
    return process.nextTick(function afterTick() {
      fn.apply(null, args);
    });
  }
}

# Copyright (c) 2015 Calvin Metcalf

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.**
{
  "author": "",
  "deprecated": false,
  "description": "process.nextTick but always with args",
  "devDependencies": {
    "tap": "~0.2.6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/calvinmetcalf/process-nextick-args",
  "license": "MIT",
  "main": "index.js",
  "name": "process-nextick-args",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/calvinmetcalf/process-nextick-args.git"
  },
  "version": "2.0.1"
}Copyright (c) Tobias BaunbÃ¦k <freeall@gmail.com>

All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

- Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
  list of conditions and the following disclaimer in the documentation and/or
  other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
var through = require('through2');
var speedometer = require('speedometer');

module.exports = function(options, onprogress) {
	if (typeof options === 'function') return module.exports(null, options);
	options = options || {};

	var length = options.length || 0;
	var time = options.time || 0;
	var drain = options.drain || false;
	var transferred = options.transferred || 0;
	var nextUpdate = Date.now()+time;
	var delta = 0;
	var speed = speedometer(options.speed || 5000);
	var startTime = Date.now();

	var update = {
		percentage: 0,
		transferred: transferred,
		length: length,
		remaining: length,
		eta: 0,
		runtime: 0
	};

	var emit = function(ended) {
		update.delta = delta;
		update.percentage = ended ? 100 : (length ? transferred/length*100 : 0);
		update.speed = speed(delta);
		update.eta = Math.round(update.remaining / update.speed);
		update.runtime = parseInt((Date.now() - startTime)/1000);
		nextUpdate = Date.now()+time;

		delta = 0;

		tr.emit('progress', update);
	};
	var write = function(chunk, enc, callback) {
		var len = options.objectMode ? 1 : chunk.length;
		transferred += len;
		delta += len;
		update.transferred = transferred;
		update.remaining = length >= transferred ? length - transferred : 0;

		if (Date.now() >= nextUpdate) emit(false);
		callback(null, chunk);
	};
	var end = function(callback) {
		emit(true);
		callback();
	};

	var tr = through(options.objectMode ? {objectMode:true, highWaterMark:16} : {}, write, end);
	var onlength = function(newLength) {
		length = newLength;
		update.length = length;
		update.remaining = length - update.transferred;
		tr.emit('length', length);
	};
	
	// Expose `onlength()` handler as `setLength()` to support custom use cases where length
	// is not known until after a few chunks have already been pumped, or is
	// calculated on the fly.
	tr.setLength = onlength;
	
	tr.on('pipe', function(stream) {
		if (typeof length === 'number') return;
		// Support http module
		if (stream.readable && !stream.writable && stream.headers) {
			return onlength(parseInt(stream.headers['content-length'] || 0));
		}

		// Support streams with a length property
		if (typeof stream.length === 'number') {
			return onlength(stream.length);
		}

		// Support request module
		stream.on('response', function(res) {
			if (!res || !res.headers) return;
			if (res.headers['content-encoding'] === 'gzip') return;
			if (res.headers['content-length']) {
				return onlength(parseInt(res.headers['content-length']));
			}
		});
	});

	if (drain) tr.resume();
	if (onprogress) tr.on('progress', onprogress);

	tr.progress = function() {
		update.speed = speed(0);
		update.eta = Math.round(update.remaining / update.speed);

		return update;
	};
	return tr;
};
{
  "author": {
    "name": "freeall",
    "email": "freeall@gmail.com"
  },
  "dependencies": {
    "speedometer": "~0.1.2",
    "through2": "~0.2.3"
  },
  "deprecated": false,
  "description": "Read the progress of a stream",
  "devDependencies": {
    "numeral": "~1.5.2",
    "request": "~2.29.0",
    "single-line-log": "~1.0.0"
  },
  "homepage": "https://github.com/freeall/progress-stream#readme",
  "license": "BSD-2-Clause",
  "main": "index.js",
  "name": "progress-stream",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/freeall/progress-stream.git"
  },
  "version": "1.2.0"
}# node-properties-parser

A parser for [.properties](http://en.wikipedia.org/wiki/.properties) files written in javascript.  Properties files store key-value pairs.  They are typically used for configuration and internationalization in Java applications as well as in Actionscript projects.  Here's an example of the format:

	# You are reading the ".properties" entry.
	! The exclamation mark can also mark text as comments.
	website = http://en.wikipedia.org/
	language = English
	# The backslash below tells the application to continue reading
	# the value onto the next line.
	message = Welcome to \
	          Wikipedia!
	# Add spaces to the key
	key\ with\ spaces = This is the value that could be looked up with the key "key with spaces".
	# Unicode
	tab : \u0009
*(taken from [Wikipedia](http://en.wikipedia.org/wiki/.properties#Format))*

Currently works with any version of node.js.

## The API

- `parse(text)`: Parses `text` into key-value pairs.  Returns an object containing the key-value pairs.
- `read(path[, callback])`: Opens the file specified by `path` and calls `parse` on its content.  If the optional `callback` parameter is provided, the result is then passed to it as the second parameter.  If an error occurs, the error object is passed to `callback` as the first parameter. If `callback` is not provided, the file specified by `path` is synchronously read and calls `parse` on its contents.  The resulting object is immediately returned.
- `createEditor([path][, options][, callback]])`:  If neither `path` or `callback` are provided an empty editor object is returned synchronously.  If only `path` is provided, the file specified by `path` is synchronously read and parsed.  An editor object with the results in then immediately returned.  If both `path` and `callback` are provided, the file specified by `path` is read and parsed asynchronously.  An editor object with the results are then passed to `callback` as the second parameters.  If an error occurs, the error object is passed to `callback` as the first parameter.  The following options are supported:
	- `options.separator`: The character used to separate key/values.  Defaults to "=".
	- `options.path`: Treated the same way as the optional `path` argument.  If both are provided the arguement wins.
	- `options.callback`: Treated the same way as the optional `callback` parameter.  If both are provided the arguement wins.
- `Editor`: The editor object is returned by `createEditor`.  Has the following API:
	- `get(key)`: Returns the value currently associated with `key`.
	- `set(key, [value[, comment]])`: Associates `key` with `value`. An optional comment can be provided. If `value` is not specified or is `null`, then `key` is unset.
	- `unset(key)`: Unsets the specified `key`.
	- `save([path][, callback]])`: Writes the current contents of this editor object to a file specified by `path`.  If `path` is not provided, then it'll be defaulted to the `path` value passed to `createEditor`.  The `callback` parameter is called when the file has been written to disk.
	- `addHeadComment`: Added a comment to the head of the file.
	- `toString`: Returns the string representation of this properties editor object.  This string will be written to a file if `save` is called.

## Getting node-properties-parser

The easiest way to get node-properties-parser is with [npm](http://npmjs.org/):

	npm install properties-parser

Alternatively you can clone this git repository:

	git://github.com/xavi-/node-properties-parser.git

## Developed by
* Xavi Ramirez

## License
This project is released under [The MIT License](http://www.opensource.org/licenses/mit-license.php).require("string.prototype.codepointat");
var fs = require("fs");

function Iterator(text) {
	var pos = 0, length = text.length;

	this.peek = function(num) {
		num = num || 0;
		if(pos + num >= length) { return null; }

		return text.charAt(pos + num);
	};
	this.next = function(inc) {
		inc = inc || 1;

		if(pos >= length) { return null; }

		return text.charAt((pos += inc) - inc);
	};
	this.pos = function() {
		return pos;
	};
}

var rWhitespace = /\s/;
function isWhitespace(chr) {
	return rWhitespace.test(chr);
}
function consumeWhiteSpace(iter) {
	var start = iter.pos();

	while(isWhitespace(iter.peek())) { iter.next(); }

	return { type: "whitespace", start: start, end: iter.pos() };
}

function startsComment(chr) {
	return chr === "!" || chr === "#";
}
function isEOL(chr) {
	return chr == null || chr === "\n" || chr === "\r";
}
function consumeComment(iter) {
	var start = iter.pos();

	while(!isEOL(iter.peek())) { iter.next(); }

	return { type: "comment", start: start, end: iter.pos() };
}

function startsKeyVal(chr) {
	return !isWhitespace(chr) && !startsComment(chr);
}
function startsSeparator(chr) {
	return chr === "=" || chr === ":" || isWhitespace(chr);
}
function startsEscapedVal(chr) {
	return chr === "\\";
}
function consumeEscapedVal(iter) {
	var start = iter.pos();

	iter.next(); // move past "\"
	var curChar = iter.next();
	if(curChar === "u") { // encoded unicode char
		iter.next(4); // Read in the 4 hex values
	}

	return { type: "escaped-value", start: start, end: iter.pos() };
}
function consumeKey(iter) {
	var start = iter.pos(), children = [];

	var curChar;
	while((curChar = iter.peek()) !== null) {
		if(startsSeparator(curChar)) { break; }
		if(startsEscapedVal(curChar)) { children.push(consumeEscapedVal(iter)); continue; }

		iter.next();
	}

	return { type: "key", start: start, end: iter.pos(), children: children };
}
function consumeKeyValSeparator(iter) {
	var start = iter.pos();

	var seenHardSep = false, curChar;
	while((curChar = iter.peek()) !== null) {
		if(isEOL(curChar)) { break; }

		if(isWhitespace(curChar)) { iter.next(); continue; }

		if(seenHardSep) { break; }

		seenHardSep = (curChar === ":" || curChar === "=");
		if(seenHardSep) { iter.next(); continue; }

		break; // curChar is a non-separtor char
	}

	return { type: "key-value-separator", start: start, end: iter.pos() };
}
function startsLineBreak(iter) {
	return iter.peek() === "\\" && isEOL(iter.peek(1));
}
function consumeLineBreak(iter) {
	var start = iter.pos();

	iter.next(); // consume \
	if(iter.peek() === "\r") { iter.next(); }
	iter.next(); // consume \n

	var curChar;
	while((curChar = iter.peek()) !== null) {
		if(isEOL(curChar)) { break; }
		if(!isWhitespace(curChar)) { break; }

		iter.next();
	}

	return { type: "line-break", start: start, end: iter.pos() };
}
function consumeVal(iter) {
	var start = iter.pos(), children = [];

	var curChar;
	while((curChar = iter.peek()) !== null) {
		if(startsLineBreak(iter)) { children.push(consumeLineBreak(iter)); continue; }
		if(startsEscapedVal(curChar)) { children.push(consumeEscapedVal(iter)); continue; }
		if(isEOL(curChar)) { break; }

		iter.next();
	}

	return { type: "value", start: start, end: iter.pos(), children: children };
}
function consumeKeyVal(iter) {
	return {
		type: "key-value",
		start: iter.pos(),
		children: [
			consumeKey(iter),
			consumeKeyValSeparator(iter),
			consumeVal(iter)
		],
		end: iter.pos()
	};
}

var renderChild = {
	"escaped-value": function(child, text) {
		var type = text.charAt(child.start + 1);

		if(type === "t") { return "\t"; }
		if(type === "r") { return "\r"; }
		if(type === "n") { return "\n"; }
		if(type === "f") { return "\f"; }
		if(type !== "u") { return type; }

		return String.fromCharCode(parseInt(text.substr(child.start + 2, 4), 16));
	},
	"line-break": function (child, text) {
		return "";
	}
};
function rangeToBuffer(range, text) {
	var start = range.start, buffer = [];

	for(var i = 0; i < range.children.length; i++) {
		var child = range.children[i];

		buffer.push(text.substring(start, child.start));
		buffer.push(renderChild[child.type](child, text));
		start = child.end;
	}
	buffer.push(text.substring(start, range.end));

	return buffer;
}
function rangesToObject(ranges, text) {
	var obj = Object.create(null); // Creates to a true hash map

	for(var i = 0; i < ranges.length; i++) {
		var range = ranges[i];

		if(range.type !== "key-value") { continue; }

		var key = rangeToBuffer(range.children[0], text).join("");
		var val = rangeToBuffer(range.children[2], text).join("");
		obj[key] = val;
	}

	return obj;
}

function stringToRanges(text) {
	var iter = new Iterator(text), ranges = [];

	var curChar;
	while((curChar = iter.peek()) !== null) {
		if(isWhitespace(curChar)) { ranges.push(consumeWhiteSpace(iter)); continue; }
		if(startsComment(curChar)) { ranges.push(consumeComment(iter)); continue; }
		if(startsKeyVal(curChar)) { ranges.push(consumeKeyVal(iter)); continue; }

		throw Error("Something crazy happened. text: '" + text + "'; curChar: '" + curChar + "'");
	}

	return ranges;
}

function isNewLineRange(range) {
	if(!range) { return false; }

	if(range.type === "whitespace") { return true; }

	if(range.type === "literal") {
		return isWhitespace(range.text) && range.text.indexOf("\n") > -1;
	}

	return false;
}

function escapeMaker(escapes) {
	return function escapeKey(key) {
		var zeros = [ "", "0", "00", "000" ];
		var buf = [];

		for(var i = 0; i < key.length; i++) {
			var chr = key.charAt(i);

			if(escapes[chr]) { buf.push(escapes[chr]); continue; }

			var code = chr.codePointAt(0);

			if(code <= 0x7F) { buf.push(chr); continue; }

			var hex = code.toString(16);

			buf.push("\\u");
			buf.push(zeros[4 - hex.length]);
			buf.push(hex);
		}

		return buf.join("");
	};
}

var escapeKey = escapeMaker({ " ": "\\ ", "\n": "\\n", ":": "\\:", "=": "\\=" });
var escapeVal = escapeMaker({ "\n": "\\n" });

function Editor(text, options) {
    if (typeof text === 'object') {
        options = text;
        text = null;
    }
	text = text || "";
    var path = options.path;
    var separator = options.separator || '=';

	var ranges = stringToRanges(text);
	var obj = rangesToObject(ranges, text);
	var keyRange = Object.create(null); // Creates to a true hash map

	for(var i = 0; i < ranges.length; i++) {
		var range = ranges[i];

		if(range.type !== "key-value") { continue; }

		var key = rangeToBuffer(range.children[0], text).join("");
		keyRange[key] = range;
	}

	this.addHeadComment = function(comment) {
		if(comment == null) { return; }

		ranges.unshift({ type: "literal", text: "# " + comment.replace(/\n/g, "\n# ") + "\n" });
	};

	this.get = function(key) { return obj[key]; };
	this.set = function(key, val, comment) {
		if(val == null) { this.unset(key); return; }

		obj[key] = val;
		var escapedKey = escapeKey(key);
		var escapedVal = escapeVal(val);

		var range = keyRange[key];
		if(!range) {
			keyRange[key] = range = {
				type: "literal",
				text: escapedKey + separator + escapedVal
			};

			var prevRange = ranges[ranges.length - 1];
			if(prevRange != null && !isNewLineRange(prevRange)) {
				ranges.push({ type: "literal", text: "\n" });
			}
			ranges.push(range);
		}

		// comment === null deletes comment. if comment === undefined, it's left alone
		if(comment !== undefined) {
			range.comment = comment && "# " + comment.replace(/\n/g, "\n# ") + "\n";
		}

		if(range.type === "literal") {
			range.text = escapedKey + separator + escapedVal;
			if(range.comment != null) { range.text = range.comment + range.text; }
		} else if(range.type === "key-value") {
			range.children[2] = { type: "literal", text: escapedVal };
		} else {
			throw "Unknown node type: " + range.type;
		}
	};
	this.unset = function(key) {
		if(!(key in obj)) { return; }

		var range = keyRange[key];
		var idx = ranges.indexOf(range);

		ranges.splice(idx, (isNewLineRange(ranges[idx + 1]) ? 2 : 1));

		delete keyRange[key];
		delete obj[key];
	};
	this.valueOf = this.toString = function() {
		var buffer = [], stack = [].concat(ranges);

		var node;
		while((node = stack.shift()) != null) {
			switch(node.type) {
				case "literal":
					buffer.push(node.text);
					break;
				case "key":
				case "value":
				case "comment":
				case "whitespace":
				case "key-value-separator":
				case "escaped-value":
				case "line-break":
					buffer.push(text.substring(node.start, node.end));
					break;
				case "key-value":
					Array.prototype.unshift.apply(stack, node.children);
					if(node.comment) { stack.unshift({ type: "literal", text: node.comment }); }
					break;
			}
		}

		return buffer.join("");
	};
	this.save = function(newPath, callback) {
		if(typeof newPath === 'function') {
			callback = newPath;
			newPath = path;
		}
		newPath = newPath || path;

		if(!newPath) {
            if (callback) {
                return callback("Unknown path");
            }
            throw new Error("Unknown path");
        }

        if (callback) {
            fs.writeFile(newPath, this.toString(), callback);
        } else {
            fs.writeFileSync(newPath, this.toString());
        }

	};
}
function createEditor(/*path, options, callback*/) {
    var path, options, callback;
    var args = Array.prototype.slice.call(arguments);
    for (var i = 0; i < args.length; i ++) {
        var arg = args[i];
        if (!path && typeof arg === 'string') {
            path = arg;
        } else if (!options && typeof arg === 'object') {
            options = arg;
        } else if (!callback && typeof arg === 'function') {
            callback = arg;
        }
    }
    options = options || {};
    path = path || options.path;
    callback = callback || options.callback;
    options.path = path;

	if(!path) { return new Editor(options); }

	if(!callback) { return new Editor(fs.readFileSync(path).toString(), options); }

	return fs.readFile(path, function(err, text) {
		if(err) { return callback(err, null); }

		text = text.toString();
		return callback(null, new Editor(text, options));
	});
}

function parse(text) {
	text = text.toString();
	var ranges = stringToRanges(text);
	return rangesToObject(ranges, text);
}

function read(path, callback) {
	if(!callback) { return parse(fs.readFileSync(path)); }

	return fs.readFile(path, function(err, data) {
		if(err) { return callback(err, null); }

		return callback(null, parse(data));
	});
}

module.exports = { parse: parse, read: read, createEditor: createEditor };
{
  "dependencies": {
    "string.prototype.codepointat": "^0.2.0"
  },
  "deprecated": false,
  "description": "A parser for .properties files written in javascript",
  "engines": {
    "node": ">= 0.3.1"
  },
  "homepage": "https://github.com/xavi-/node-properties-parser#readme",
  "license": "MIT",
  "main": "./index.js",
  "maintainers": [
    {
      "name": "Xavi",
      "email": "xavi.rmz@gmail.com",
      "url": "http://xavi.co"
    }
  ],
  "name": "properties-parser",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/xavi-/node-properties-parser.git"
  },
  "version": "0.3.1"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
if (process.env.npm_package_name === 'pseudomap' &&
    process.env.npm_lifecycle_script === 'test')
  process.env.TEST_PSEUDOMAP = 'true'

if (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {
  module.exports = Map
} else {
  module.exports = require('./pseudomap')
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "deprecated": false,
  "description": "A thing that is a lot like ES6 `Map`, but without iterators, for use in environments where `for..of` syntax and `Map` are not available.",
  "devDependencies": {
    "tap": "^2.3.1"
  },
  "directories": {
    "test": "test"
  },
  "homepage": "https://github.com/isaacs/pseudomap#readme",
  "license": "ISC",
  "main": "map.js",
  "name": "pseudomap",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/pseudomap.git"
  },
  "version": "1.0.2"
}var hasOwnProperty = Object.prototype.hasOwnProperty

module.exports = PseudoMap

function PseudoMap (set) {
  if (!(this instanceof PseudoMap)) // whyyyyyyy
    throw new TypeError("Constructor PseudoMap requires 'new'")

  this.clear()

  if (set) {
    if ((set instanceof PseudoMap) ||
        (typeof Map === 'function' && set instanceof Map))
      set.forEach(function (value, key) {
        this.set(key, value)
      }, this)
    else if (Array.isArray(set))
      set.forEach(function (kv) {
        this.set(kv[0], kv[1])
      }, this)
    else
      throw new TypeError('invalid argument')
  }
}

PseudoMap.prototype.forEach = function (fn, thisp) {
  thisp = thisp || this
  Object.keys(this._data).forEach(function (k) {
    if (k !== 'size')
      fn.call(thisp, this._data[k].value, this._data[k].key)
  }, this)
}

PseudoMap.prototype.has = function (k) {
  return !!find(this._data, k)
}

PseudoMap.prototype.get = function (k) {
  var res = find(this._data, k)
  return res && res.value
}

PseudoMap.prototype.set = function (k, v) {
  set(this._data, k, v)
}

PseudoMap.prototype.delete = function (k) {
  var res = find(this._data, k)
  if (res) {
    delete this._data[res._index]
    this._data.size--
  }
}

PseudoMap.prototype.clear = function () {
  var data = Object.create(null)
  data.size = 0

  Object.defineProperty(this, '_data', {
    value: data,
    enumerable: false,
    configurable: true,
    writable: false
  })
}

Object.defineProperty(PseudoMap.prototype, 'size', {
  get: function () {
    return this._data.size
  },
  set: function (n) {},
  enumerable: true,
  configurable: true
})

PseudoMap.prototype.values =
PseudoMap.prototype.keys =
PseudoMap.prototype.entries = function () {
  throw new Error('iterators are not implemented in this version')
}

// Either identical, or both NaN
function same (a, b) {
  return a === b || a !== a && b !== b
}

function Entry (k, v, i) {
  this.key = k
  this.value = v
  this._index = i
}

function find (data, k) {
  for (var i = 0, s = '_' + k, key = s;
       hasOwnProperty.call(data, key);
       key = s + i++) {
    if (same(data[key].key, k))
      return data[key]
  }
}

function set (data, k, v) {
  for (var i = 0, s = '_' + k, key = s;
       hasOwnProperty.call(data, key);
       key = s + i++) {
    if (same(data[key].key, k)) {
      data[key].value = v
      return
    }
  }
  data.size++
  data[key] = new Entry(k, v, key)
}
The MIT License (MIT)

Copyright (c) 2017 Lupo Montero lupomontero@gmail.com

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 490.1 105.6" style="enable-background:new 0 0 490.1 105.6;" xml:space="preserve">
<style type="text/css">
	.st0{fill:#F4B960;}
	.st1{fill:#E66F32;}
	.st2{fill:#E43C41;}
	.st3{fill:#BDD041;}
	.st4{fill:#6DB54C;}
	.st5{fill:#AEDAE6;}
	.st6{fill:#56B8DE;}
	.st7{fill:#00B1D5;}
	.st8{fill:url(#SVGID_1_);}
	.st9{fill:#221F1F;}
	.st10{fill:#FFFFFF;}
	.st11{fill:#000111;}
</style>
<title>Browserstack-logo-white</title>
<circle class="st0" cx="52.8" cy="52.8" r="52.8"/>
<circle class="st1" cx="47.5" cy="47.5" r="47.5"/>
<circle class="st2" cx="53.8" cy="41.1" r="41.1"/>
<circle class="st3" cx="57.1" cy="44.4" r="37.8"/>
<circle class="st4" cx="54.3" cy="47.2" r="35.1"/>
<circle class="st5" cx="48.8" cy="41.7" r="29.5"/>
<circle class="st6" cx="53.6" cy="36.8" r="24.7"/>
<circle class="st7" cx="56.6" cy="39.9" r="21.7"/>
<radialGradient id="SVGID_1_" cx="53.45" cy="63.02" r="18.57" gradientTransform="matrix(1 0 0 -1 0 106)" gradientUnits="userSpaceOnUse">
	<stop  offset="0" style="stop-color:#797979"/>
	<stop  offset="1" style="stop-color:#4C4C4C"/>
</radialGradient>
<circle class="st8" cx="53.5" cy="43" r="18.6"/>
<circle class="st9" cx="53.5" cy="43" r="18.6"/>
<ellipse transform="matrix(0.4094 -0.9123 0.9123 0.4094 2.8913 76.9251)" class="st10" cx="60.9" cy="36.2" rx="5.7" ry="3.7"/>
<path class="st11" d="M122.5,32.6c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h16.6c9.5,0,13.9,4.4,13.9,11c0.2,3.7-1.8,7.2-5.2,8.8v0.1
	c3.7,1.5,6.1,5.2,6,9.3c0,8.2-5.6,12.2-15.4,12.2h-16c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1L122.5,32.6L122.5,32.6z M139.6,49.1
	c3.9,0,6.4-2.2,6.4-5.4s-2.4-5.5-6.4-5.5h-8.9c-0.2,0-0.4,0.1-0.4,0.3c0,0,0,0,0,0.1v10.2c0,0.2,0.1,0.3,0.3,0.4c0,0,0,0,0.1,0
	H139.6L139.6,49.1z M130.6,66.9h9.3c4.3,0,6.8-2.3,6.8-5.8s-2.4-5.7-6.7-5.7h-9.3c-0.2,0-0.4,0.1-0.4,0.3c0,0,0,0,0,0.1v10.7
	C130.3,66.8,130.4,66.9,130.6,66.9C130.6,66.9,130.6,66.9,130.6,66.9L130.6,66.9z"/>
<path class="st11" d="M159.9,73.3c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1V44.6c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h6
	c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v2.5h0.1c1.5-2.2,4.2-3.8,8.2-3.8c2.4,0,4.8,0.8,6.6,2.4c0.3,0.3,0.4,0.5,0.1,0.8l-3.5,4.1
	c-0.2,0.3-0.6,0.4-0.9,0.2c0,0,0,0-0.1,0c-1.4-0.9-3-1.4-4.7-1.4c-4.1,0-6,2.7-6,7.4v15.9c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0
	H159.9L159.9,73.3z"/>
<path class="st11" d="M182.9,65.8c-0.8-2.3-1.1-4.8-1.1-7.2c-0.1-2.5,0.3-4.9,1.1-7.2c1.8-5.1,6.6-8.1,13.1-8.1s11.2,3,13,8.1
	c0.8,2.3,1.1,4.8,1.1,7.2c0.1,2.5-0.3,4.9-1.1,7.2c-1.8,5.1-6.6,8.1-13,8.1S184.7,71,182.9,65.8z M201.9,64c0.5-1.7,0.8-3.6,0.7-5.4
	c0.1-1.8-0.1-3.7-0.7-5.4c-0.9-2.5-3.3-4-5.9-3.8c-2.6-0.2-5.1,1.4-6,3.8c-0.5,1.8-0.8,3.6-0.7,5.4c-0.1,1.8,0.1,3.7,0.7,5.4
	c0.9,2.5,3.4,4,6,3.8C198.6,68,201,66.5,201.9,64L201.9,64z"/>
<path class="st11" d="M241.9,73.3c-0.4,0-0.7-0.3-0.8-0.6L235,53.9h-0.1l-6.2,18.7c-0.1,0.4-0.4,0.6-0.8,0.6h-5.4
	c-0.4,0-0.7-0.3-0.8-0.6l-10-28.1c-0.1-0.2,0-0.5,0.2-0.6c0.1,0,0.2-0.1,0.3,0h6.3c0.4,0,0.8,0.2,0.9,0.6l6.1,19.3h0.1l6-19.3
	c0.1-0.4,0.5-0.6,0.9-0.6h4.7c0.4,0,0.7,0.2,0.9,0.6l6.4,19.3h0.1l5.8-19.3c0.1-0.4,0.5-0.7,0.9-0.6h6.3c0.2-0.1,0.5,0.1,0.5,0.3
	c0,0.1,0,0.2,0,0.3l-10,28.1c-0.1,0.4-0.4,0.6-0.8,0.6L241.9,73.3L241.9,73.3z"/>
<path class="st11" d="M259.3,69.3c-0.2-0.2-0.3-0.6-0.1-0.8c0,0,0,0,0.1-0.1l3.7-3.6c0.3-0.2,0.7-0.2,0.9,0c2.6,2.1,5.9,3.3,9.3,3.3
	c3.9,0,5.9-1.5,5.9-3.5c0-1.8-1.1-2.9-5.2-3.2l-3.4-0.3c-6.4-0.6-9.7-3.6-9.7-8.6c0-5.7,4.4-9.2,12.3-9.2c4.2-0.1,8.4,1.2,11.9,3.6
	c0.3,0.2,0.3,0.5,0.2,0.8c0,0,0,0,0,0.1l-3.2,3.6c-0.2,0.3-0.6,0.3-0.9,0.1c-2.5-1.5-5.4-2.4-8.3-2.4c-3.1,0-4.8,1.3-4.8,3
	s1.1,2.7,5.2,3.1l3.4,0.3c6.6,0.6,9.8,3.8,9.8,8.6c0,5.8-4.6,9.9-13.3,9.9C268,74,263.2,72.4,259.3,69.3z"/>
<path class="st11" d="M291.2,65.8c-0.8-2.3-1.2-4.7-1.1-7.2c-0.1-2.5,0.3-4.9,1-7.2c1.8-5.1,6.6-8.1,12.9-8.1c6.5,0,11.2,3.1,13,8.1
	c0.7,2.1,1,4.1,1,8.8c0,0.3-0.3,0.6-0.6,0.6c0,0-0.1,0-0.1,0h-19.5c-0.2,0-0.4,0.1-0.4,0.3c0,0,0,0,0,0.1c0,0.8,0.2,1.5,0.5,2.2
	c1,2.9,3.5,4.4,7.1,4.4c2.7,0.1,5.4-0.9,7.4-2.8c0.2-0.3,0.7-0.4,1-0.1c0,0,0,0,0,0l3.9,3.2c0.2,0.1,0.3,0.5,0.2,0.7
	c0,0.1-0.1,0.1-0.1,0.1c-2.7,2.9-7.2,5-13,5C297.8,73.9,293,70.9,291.2,65.8z M310.4,52.8c-0.9-2.4-3.2-3.8-6.2-3.8
	s-5.4,1.4-6.2,3.8c-0.3,0.8-0.4,1.6-0.4,2.5c0,0.2,0.1,0.3,0.3,0.4c0,0,0,0,0.1,0h12.4c0.2,0,0.4-0.1,0.4-0.3c0,0,0,0,0-0.1
	C310.8,54.5,310.6,53.6,310.4,52.8L310.4,52.8z"/>
<path class="st11" d="M323.6,73.3c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1V44.6c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h6
	c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v2.5h0.1c1.5-2.2,4.2-3.8,8.2-3.8c2.4,0,4.8,0.8,6.6,2.4c0.3,0.3,0.4,0.5,0.1,0.8l-3.5,4.1
	c-0.2,0.3-0.6,0.4-0.9,0.2c0,0,0,0-0.1,0c-1.4-0.9-3-1.4-4.7-1.4c-4.1,0-6,2.7-6,7.4v15.9c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0
	H323.6L323.6,73.3z"/>
<path class="st11" d="M346.5,68.5c-0.3-0.2-0.4-0.6-0.2-0.9c0,0,0,0,0,0l4.1-4.4c0.2-0.3,0.6-0.3,0.9-0.1c0,0,0,0,0,0
	c3.5,2.7,7.7,4.2,12.1,4.4c5.3,0,8.4-2.5,8.4-6c0-3-2-4.9-8.1-5.7l-2.4-0.3c-8.6-1.1-13.5-4.9-13.5-11.8c0-7.5,5.9-12.4,15.1-12.4
	c5.1-0.1,10.1,1.4,14.5,4.2c0.3,0.1,0.4,0.4,0.2,0.7c0,0.1-0.1,0.1-0.1,0.2l-3.1,4.5c-0.2,0.3-0.6,0.4-0.9,0.2
	c-3.2-2.1-6.9-3.2-10.7-3.2c-4.5,0-7,2.3-7,5.5c0,2.9,2.2,4.8,8.2,5.6l2.4,0.3c8.6,1.1,13.3,4.9,13.3,12c0,7.3-5.7,12.8-16.8,12.8
	C356.3,73.9,350,71.5,346.5,68.5z"/>
<path class="st11" d="M393.3,73.8c-6.4,0-8.8-2.9-8.8-8.6V49.8c0-0.2-0.1-0.3-0.3-0.4c0,0,0,0-0.1,0H382c-0.3,0-0.6-0.2-0.7-0.5
	c0,0,0,0,0-0.1v-4.1c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h2.1c0.2,0,0.4-0.1,0.4-0.3c0,0,0,0,0-0.1v-8c0-0.3,0.3-0.6,0.6-0.6
	c0,0,0,0,0.1,0h6c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v8c0,0.2,0.1,0.3,0.3,0.4c0,0,0,0,0.1,0h4.2c0.3,0,0.6,0.2,0.7,0.5
	c0,0,0,0,0,0.1v4.1c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0h-4.2c-0.2,0-0.4,0.1-0.4,0.3c0,0,0,0,0,0.1V65c0,2.1,0.9,2.7,3,2.7h1.6
	c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v4.9c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0L393.3,73.8L393.3,73.8z"/>
<path class="st11" d="M421.2,73.3c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1v-2.1h0c-1.5,2-4.5,3.4-8.9,3.4c-5.8,0-10.6-2.8-10.6-8.9
	c0-6.4,4.9-9.3,12.7-9.3h6.4c0.2,0,0.4-0.1,0.4-0.3c0,0,0,0,0-0.1v-1.4c0-3.3-1.7-4.9-7-4.9c-2.6-0.1-5.1,0.6-7.2,2
	c-0.3,0.2-0.7,0.2-0.9-0.1c0,0,0,0,0-0.1l-2.4-4c-0.2-0.2-0.1-0.6,0.1-0.8c0,0,0,0,0,0c2.6-1.7,6-2.9,11.2-2.9
	c9.6,0,13.2,3,13.2,10.2v19.1c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0H421.2L421.2,73.3z M420.4,63.4v-2.2c0-0.2-0.1-0.3-0.3-0.4
	c0,0,0,0-0.1,0h-5.2c-4.7,0-6.8,1.2-6.8,3.9c0,2.4,1.9,3.6,5.5,3.6C417.9,68.4,420.4,66.8,420.4,63.4L420.4,63.4z"/>
<path class="st11" d="M433.1,65.8c-0.7-2.3-1.1-4.8-1-7.2c-0.1-2.4,0.3-4.9,1-7.2c1.8-5.2,6.7-8.1,13.1-8.1c4.2-0.2,8.2,1.5,11,4.6
	c0.2,0.2,0.2,0.6,0,0.8c0,0,0,0-0.1,0.1l-4.1,3.3c-0.3,0.2-0.7,0.2-0.9-0.1c0,0,0,0,0-0.1c-1.5-1.7-3.6-2.6-5.9-2.5
	c-2.8,0-5,1.3-5.9,3.8c-0.5,1.8-0.8,3.6-0.7,5.4c-0.1,1.8,0.1,3.7,0.7,5.5c0.9,2.5,3.1,3.8,5.9,3.8c2.2,0.1,4.4-0.9,5.9-2.6
	c0.2-0.3,0.6-0.3,0.9-0.1c0,0,0,0,0,0l4.1,3.3c0.3,0.2,0.3,0.5,0.1,0.8c0,0,0,0-0.1,0.1c-2.9,3-6.9,4.6-11,4.5
	C439.8,73.9,435,71.1,433.1,65.8z"/>
<path class="st11" d="M482.8,73.3c-0.4,0-0.8-0.2-1-0.6l-8-12.3l-4.3,4.6v7.7c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0h-6
	c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1V32.6c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h6c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v23.8
	l10.8-11.8c0.3-0.4,0.8-0.6,1.2-0.6h6.7c0.2,0,0.4,0.1,0.4,0.3c0,0.1,0,0.3-0.1,0.3l-10.1,10.7L490,72.7c0.1,0.2,0.1,0.4,0,0.5
	c-0.1,0.1-0.2,0.1-0.3,0.1H482.8L482.8,73.3z"/>
</svg>
/*eslint no-var:0, prefer-arrow-callback: 0, object-shorthand: 0 */
'use strict';


var Punycode = require('punycode');


var internals = {};


//
// Read rules from file.
//
internals.rules = require('./data/rules.json').map(function (rule) {

  return {
    rule: rule,
    suffix: rule.replace(/^(\*\.|\!)/, ''),
    punySuffix: -1,
    wildcard: rule.charAt(0) === '*',
    exception: rule.charAt(0) === '!'
  };
});


//
// Check is given string ends with `suffix`.
//
internals.endsWith = function (str, suffix) {

  return str.indexOf(suffix, str.length - suffix.length) !== -1;
};


//
// Find rule for a given domain.
//
internals.findRule = function (domain) {

  var punyDomain = Punycode.toASCII(domain);
  return internals.rules.reduce(function (memo, rule) {

    if (rule.punySuffix === -1){
      rule.punySuffix = Punycode.toASCII(rule.suffix);
    }
    if (!internals.endsWith(punyDomain, '.' + rule.punySuffix) && punyDomain !== rule.punySuffix) {
      return memo;
    }
    // This has been commented out as it never seems to run. This is because
    // sub tlds always appear after their parents and we never find a shorter
    // match.
    //if (memo) {
    //  var memoSuffix = Punycode.toASCII(memo.suffix);
    //  if (memoSuffix.length >= punySuffix.length) {
    //    return memo;
    //  }
    //}
    return rule;
  }, null);
};


//
// Error codes and messages.
//
exports.errorCodes = {
  DOMAIN_TOO_SHORT: 'Domain name too short.',
  DOMAIN_TOO_LONG: 'Domain name too long. It should be no more than 255 chars.',
  LABEL_STARTS_WITH_DASH: 'Domain name label can not start with a dash.',
  LABEL_ENDS_WITH_DASH: 'Domain name label can not end with a dash.',
  LABEL_TOO_LONG: 'Domain name label should be at most 63 chars long.',
  LABEL_TOO_SHORT: 'Domain name label should be at least 1 character long.',
  LABEL_INVALID_CHARS: 'Domain name label can only contain alphanumeric characters or dashes.'
};


//
// Validate domain name and throw if not valid.
//
// From wikipedia:
//
// Hostnames are composed of series of labels concatenated with dots, as are all
// domain names. Each label must be between 1 and 63 characters long, and the
// entire hostname (including the delimiting dots) has a maximum of 255 chars.
//
// Allowed chars:
//
// * `a-z`
// * `0-9`
// * `-` but not as a starting or ending character
// * `.` as a separator for the textual portions of a domain name
//
// * http://en.wikipedia.org/wiki/Domain_name
// * http://en.wikipedia.org/wiki/Hostname
//
internals.validate = function (input) {

  // Before we can validate we need to take care of IDNs with unicode chars.
  var ascii = Punycode.toASCII(input);

  if (ascii.length < 1) {
    return 'DOMAIN_TOO_SHORT';
  }
  if (ascii.length > 255) {
    return 'DOMAIN_TOO_LONG';
  }

  // Check each part's length and allowed chars.
  var labels = ascii.split('.');
  var label;

  for (var i = 0; i < labels.length; ++i) {
    label = labels[i];
    if (!label.length) {
      return 'LABEL_TOO_SHORT';
    }
    if (label.length > 63) {
      return 'LABEL_TOO_LONG';
    }
    if (label.charAt(0) === '-') {
      return 'LABEL_STARTS_WITH_DASH';
    }
    if (label.charAt(label.length - 1) === '-') {
      return 'LABEL_ENDS_WITH_DASH';
    }
    if (!/^[a-z0-9\-]+$/.test(label)) {
      return 'LABEL_INVALID_CHARS';
    }
  }
};


//
// Public API
//


//
// Parse domain.
//
exports.parse = function (input) {

  if (typeof input !== 'string') {
    throw new TypeError('Domain name must be a string.');
  }

  // Force domain to lowercase.
  var domain = input.slice(0).toLowerCase();

  // Handle FQDN.
  // TODO: Simply remove trailing dot?
  if (domain.charAt(domain.length - 1) === '.') {
    domain = domain.slice(0, domain.length - 1);
  }

  // Validate and sanitise input.
  var error = internals.validate(domain);
  if (error) {
    return {
      input: input,
      error: {
        message: exports.errorCodes[error],
        code: error
      }
    };
  }

  var parsed = {
    input: input,
    tld: null,
    sld: null,
    domain: null,
    subdomain: null,
    listed: false
  };

  var domainParts = domain.split('.');

  // Non-Internet TLD
  if (domainParts[domainParts.length - 1] === 'local') {
    return parsed;
  }

  var handlePunycode = function () {

    if (!/xn--/.test(domain)) {
      return parsed;
    }
    if (parsed.domain) {
      parsed.domain = Punycode.toASCII(parsed.domain);
    }
    if (parsed.subdomain) {
      parsed.subdomain = Punycode.toASCII(parsed.subdomain);
    }
    return parsed;
  };

  var rule = internals.findRule(domain);

  // Unlisted tld.
  if (!rule) {
    if (domainParts.length < 2) {
      return parsed;
    }
    parsed.tld = domainParts.pop();
    parsed.sld = domainParts.pop();
    parsed.domain = [parsed.sld, parsed.tld].join('.');
    if (domainParts.length) {
      parsed.subdomain = domainParts.pop();
    }
    return handlePunycode();
  }

  // At this point we know the public suffix is listed.
  parsed.listed = true;

  var tldParts = rule.suffix.split('.');
  var privateParts = domainParts.slice(0, domainParts.length - tldParts.length);

  if (rule.exception) {
    privateParts.push(tldParts.shift());
  }

  parsed.tld = tldParts.join('.');

  if (!privateParts.length) {
    return handlePunycode();
  }

  if (rule.wildcard) {
    tldParts.unshift(privateParts.pop());
    parsed.tld = tldParts.join('.');
  }

  if (!privateParts.length) {
    return handlePunycode();
  }

  parsed.sld = privateParts.pop();
  parsed.domain = [parsed.sld,  parsed.tld].join('.');

  if (privateParts.length) {
    parsed.subdomain = privateParts.join('.');
  }

  return handlePunycode();
};


//
// Get domain.
//
exports.get = function (domain) {

  if (!domain) {
    return null;
  }
  return exports.parse(domain).domain || null;
};


//
// Check whether domain belongs to a known public suffix.
//
exports.isValid = function (domain) {

  var parsed = exports.parse(domain);
  return Boolean(parsed.domain && parsed.listed);
};
{
  "author": {
    "name": "Lupo Montero",
    "email": "lupomontero@gmail.com",
    "url": "https://lupomontero.com/"
  },
  "deprecated": false,
  "description": "Domain name parser based on the Public Suffix List",
  "devDependencies": {
    "JSONStream": "^1.3.5",
    "browserify": "^16.5.0",
    "commit-and-pr": "^1.0.4",
    "eslint": "^6.8.0",
    "eslint-config-hapi": "^12.0.0",
    "eslint-plugin-hapi": "^4.1.0",
    "karma": "^4.4.1",
    "karma-browserify": "^7.0.0",
    "karma-mocha": "^1.3.0",
    "karma-mocha-reporter": "^2.2.5",
    "karma-phantomjs-launcher": "^1.0.4",
    "mocha": "^7.1.1",
    "phantomjs-prebuilt": "^2.1.16",
    "request": "^2.88.2",
    "uglify-js": "^3.8.0",
    "watchify": "^3.11.1"
  },
  "homepage": "https://github.com/lupomontero/psl#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "psl",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/lupomontero/psl.git"
  },
  "version": "1.8.0"
}(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.psl = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
module.exports=[
"ac",
"com.ac",
"edu.ac",
"gov.ac",
"net.ac",
"mil.ac",
"org.ac",
"ad",
"nom.ad",
"ae",
"co.ae",
"net.ae",
"org.ae",
"sch.ae",
"ac.ae",
"gov.ae",
"mil.ae",
"aero",
"accident-investigation.aero",
"accident-prevention.aero",
"aerobatic.aero",
"aeroclub.aero",
"aerodrome.aero",
"agents.aero",
"aircraft.aero",
"airline.aero",
"airport.aero",
"air-surveillance.aero",
"airtraffic.aero",
"air-traffic-control.aero",
"ambulance.aero",
"amusement.aero",
"association.aero",
"author.aero",
"ballooning.aero",
"broker.aero",
"caa.aero",
"cargo.aero",
"catering.aero",
"certification.aero",
"championship.aero",
"charter.aero",
"civilaviation.aero",
"club.aero",
"conference.aero",
"consultant.aero",
"consulting.aero",
"control.aero",
"council.aero",
"crew.aero",
"design.aero",
"dgca.aero",
"educator.aero",
"emergency.aero",
"engine.aero",
"engineer.aero",
"entertainment.aero",
"equipment.aero",
"exchange.aero",
"express.aero",
"federation.aero",
"flight.aero",
"freight.aero",
"fuel.aero",
"gliding.aero",
"government.aero",
"groundhandling.aero",
"group.aero",
"hanggliding.aero",
"homebuilt.aero",
"insurance.aero",
"journal.aero",
"journalist.aero",
"leasing.aero",
"logistics.aero",
"magazine.aero",
"maintenance.aero",
"media.aero",
"microlight.aero",
"modelling.aero",
"navigation.aero",
"parachuting.aero",
"paragliding.aero",
"passenger-association.aero",
"pilot.aero",
"press.aero",
"production.aero",
"recreation.aero",
"repbody.aero",
"res.aero",
"research.aero",
"rotorcraft.aero",
"safety.aero",
"scientist.aero",
"services.aero",
"show.aero",
"skydiving.aero",
"software.aero",
"student.aero",
"trader.aero",
"trading.aero",
"trainer.aero",
"union.aero",
"workinggroup.aero",
"works.aero",
"af",
"gov.af",
"com.af",
"org.af",
"net.af",
"edu.af",
"ag",
"com.ag",
"org.ag",
"net.ag",
"co.ag",
"nom.ag",
"ai",
"off.ai",
"com.ai",
"net.ai",
"org.ai",
"al",
"com.al",
"edu.al",
"gov.al",
"mil.al",
"net.al",
"org.al",
"am",
"co.am",
"com.am",
"commune.am",
"net.am",
"org.am",
"ao",
"ed.ao",
"gv.ao",
"og.ao",
"co.ao",
"pb.ao",
"it.ao",
"aq",
"ar",
"com.ar",
"edu.ar",
"gob.ar",
"gov.ar",
"int.ar",
"mil.ar",
"musica.ar",
"net.ar",
"org.ar",
"tur.ar",
"arpa",
"e164.arpa",
"in-addr.arpa",
"ip6.arpa",
"iris.arpa",
"uri.arpa",
"urn.arpa",
"as",
"gov.as",
"asia",
"at",
"ac.at",
"co.at",
"gv.at",
"or.at",
"au",
"com.au",
"net.au",
"org.au",
"edu.au",
"gov.au",
"asn.au",
"id.au",
"info.au",
"conf.au",
"oz.au",
"act.au",
"nsw.au",
"nt.au",
"qld.au",
"sa.au",
"tas.au",
"vic.au",
"wa.au",
"act.edu.au",
"catholic.edu.au",
"nsw.edu.au",
"nt.edu.au",
"qld.edu.au",
"sa.edu.au",
"tas.edu.au",
"vic.edu.au",
"wa.edu.au",
"qld.gov.au",
"sa.gov.au",
"tas.gov.au",
"vic.gov.au",
"wa.gov.au",
"education.tas.edu.au",
"schools.nsw.edu.au",
"aw",
"com.aw",
"ax",
"az",
"com.az",
"net.az",
"int.az",
"gov.az",
"org.az",
"edu.az",
"info.az",
"pp.az",
"mil.az",
"name.az",
"pro.az",
"biz.az",
"ba",
"com.ba",
"edu.ba",
"gov.ba",
"mil.ba",
"net.ba",
"org.ba",
"bb",
"biz.bb",
"co.bb",
"com.bb",
"edu.bb",
"gov.bb",
"info.bb",
"net.bb",
"org.bb",
"store.bb",
"tv.bb",
"*.bd",
"be",
"ac.be",
"bf",
"gov.bf",
"bg",
"a.bg",
"b.bg",
"c.bg",
"d.bg",
"e.bg",
"f.bg",
"g.bg",
"h.bg",
"i.bg",
"j.bg",
"k.bg",
"l.bg",
"m.bg",
"n.bg",
"o.bg",
"p.bg",
"q.bg",
"r.bg",
"s.bg",
"t.bg",
"u.bg",
"v.bg",
"w.bg",
"x.bg",
"y.bg",
"z.bg",
"0.bg",
"1.bg",
"2.bg",
"3.bg",
"4.bg",
"5.bg",
"6.bg",
"7.bg",
"8.bg",
"9.bg",
"bh",
"com.bh",
"edu.bh",
"net.bh",
"org.bh",
"gov.bh",
"bi",
"co.bi",
"com.bi",
"edu.bi",
"or.bi",
"org.bi",
"biz",
"bj",
"asso.bj",
"barreau.bj",
"gouv.bj",
"bm",
"com.bm",
"edu.bm",
"gov.bm",
"net.bm",
"org.bm",
"bn",
"com.bn",
"edu.bn",
"gov.bn",
"net.bn",
"org.bn",
"bo",
"com.bo",
"edu.bo",
"gob.bo",
"int.bo",
"org.bo",
"net.bo",
"mil.bo",
"tv.bo",
"web.bo",
"academia.bo",
"agro.bo",
"arte.bo",
"blog.bo",
"bolivia.bo",
"ciencia.bo",
"cooperativa.bo",
"democracia.bo",
"deporte.bo",
"ecologia.bo",
"economia.bo",
"empresa.bo",
"indigena.bo",
"industria.bo",
"info.bo",
"medicina.bo",
"movimiento.bo",
"musica.bo",
"natural.bo",
"nombre.bo",
"noticias.bo",
"patria.bo",
"politica.bo",
"profesional.bo",
"plurinacional.bo",
"pueblo.bo",
"revista.bo",
"salud.bo",
"tecnologia.bo",
"tksat.bo",
"transporte.bo",
"wiki.bo",
"br",
"9guacu.br",
"abc.br",
"adm.br",
"adv.br",
"agr.br",
"aju.br",
"am.br",
"anani.br",
"aparecida.br",
"arq.br",
"art.br",
"ato.br",
"b.br",
"barueri.br",
"belem.br",
"bhz.br",
"bio.br",
"blog.br",
"bmd.br",
"boavista.br",
"bsb.br",
"campinagrande.br",
"campinas.br",
"caxias.br",
"cim.br",
"cng.br",
"cnt.br",
"com.br",
"contagem.br",
"coop.br",
"cri.br",
"cuiaba.br",
"curitiba.br",
"def.br",
"ecn.br",
"eco.br",
"edu.br",
"emp.br",
"eng.br",
"esp.br",
"etc.br",
"eti.br",
"far.br",
"feira.br",
"flog.br",
"floripa.br",
"fm.br",
"fnd.br",
"fortal.br",
"fot.br",
"foz.br",
"fst.br",
"g12.br",
"ggf.br",
"goiania.br",
"gov.br",
"ac.gov.br",
"al.gov.br",
"am.gov.br",
"ap.gov.br",
"ba.gov.br",
"ce.gov.br",
"df.gov.br",
"es.gov.br",
"go.gov.br",
"ma.gov.br",
"mg.gov.br",
"ms.gov.br",
"mt.gov.br",
"pa.gov.br",
"pb.gov.br",
"pe.gov.br",
"pi.gov.br",
"pr.gov.br",
"rj.gov.br",
"rn.gov.br",
"ro.gov.br",
"rr.gov.br",
"rs.gov.br",
"sc.gov.br",
"se.gov.br",
"sp.gov.br",
"to.gov.br",
"gru.br",
"imb.br",
"ind.br",
"inf.br",
"jab.br",
"jampa.br",
"jdf.br",
"joinville.br",
"jor.br",
"jus.br",
"leg.br",
"lel.br",
"londrina.br",
"macapa.br",
"maceio.br",
"manaus.br",
"maringa.br",
"mat.br",
"med.br",
"mil.br",
"morena.br",
"mp.br",
"mus.br",
"natal.br",
"net.br",
"niteroi.br",
"*.nom.br",
"not.br",
"ntr.br",
"odo.br",
"ong.br",
"org.br",
"osasco.br",
"palmas.br",
"poa.br",
"ppg.br",
"pro.br",
"psc.br",
"psi.br",
"pvh.br",
"qsl.br",
"radio.br",
"rec.br",
"recife.br",
"ribeirao.br",
"rio.br",
"riobranco.br",
"riopreto.br",
"salvador.br",
"sampa.br",
"santamaria.br",
"santoandre.br",
"saobernardo.br",
"saogonca.br",
"sjc.br",
"slg.br",
"slz.br",
"sorocaba.br",
"srv.br",
"taxi.br",
"tc.br",
"teo.br",
"the.br",
"tmp.br",
"trd.br",
"tur.br",
"tv.br",
"udi.br",
"vet.br",
"vix.br",
"vlog.br",
"wiki.br",
"zlg.br",
"bs",
"com.bs",
"net.bs",
"org.bs",
"edu.bs",
"gov.bs",
"bt",
"com.bt",
"edu.bt",
"gov.bt",
"net.bt",
"org.bt",
"bv",
"bw",
"co.bw",
"org.bw",
"by",
"gov.by",
"mil.by",
"com.by",
"of.by",
"bz",
"com.bz",
"net.bz",
"org.bz",
"edu.bz",
"gov.bz",
"ca",
"ab.ca",
"bc.ca",
"mb.ca",
"nb.ca",
"nf.ca",
"nl.ca",
"ns.ca",
"nt.ca",
"nu.ca",
"on.ca",
"pe.ca",
"qc.ca",
"sk.ca",
"yk.ca",
"gc.ca",
"cat",
"cc",
"cd",
"gov.cd",
"cf",
"cg",
"ch",
"ci",
"org.ci",
"or.ci",
"com.ci",
"co.ci",
"edu.ci",
"ed.ci",
"ac.ci",
"net.ci",
"go.ci",
"asso.ci",
"aÃ©roport.ci",
"int.ci",
"presse.ci",
"md.ci",
"gouv.ci",
"*.ck",
"!www.ck",
"cl",
"aprendemas.cl",
"co.cl",
"gob.cl",
"gov.cl",
"mil.cl",
"cm",
"co.cm",
"com.cm",
"gov.cm",
"net.cm",
"cn",
"ac.cn",
"com.cn",
"edu.cn",
"gov.cn",
"net.cn",
"org.cn",
"mil.cn",
"å…¬å�¸.cn",
"ç½‘ç»œ.cn",
"ç¶²çµ¡.cn",
"ah.cn",
"bj.cn",
"cq.cn",
"fj.cn",
"gd.cn",
"gs.cn",
"gz.cn",
"gx.cn",
"ha.cn",
"hb.cn",
"he.cn",
"hi.cn",
"hl.cn",
"hn.cn",
"jl.cn",
"js.cn",
"jx.cn",
"ln.cn",
"nm.cn",
"nx.cn",
"qh.cn",
"sc.cn",
"sd.cn",
"sh.cn",
"sn.cn",
"sx.cn",
"tj.cn",
"xj.cn",
"xz.cn",
"yn.cn",
"zj.cn",
"hk.cn",
"mo.cn",
"tw.cn",
"co",
"arts.co",
"com.co",
"edu.co",
"firm.co",
"gov.co",
"info.co",
"int.co",
"mil.co",
"net.co",
"nom.co",
"org.co",
"rec.co",
"web.co",
"com",
"coop",
"cr",
"ac.cr",
"co.cr",
"ed.cr",
"fi.cr",
"go.cr",
"or.cr",
"sa.cr",
"cu",
"com.cu",
"edu.cu",
"org.cu",
"net.cu",
"gov.cu",
"inf.cu",
"cv",
"cw",
"com.cw",
"edu.cw",
"net.cw",
"org.cw",
"cx",
"gov.cx",
"cy",
"ac.cy",
"biz.cy",
"com.cy",
"ekloges.cy",
"gov.cy",
"ltd.cy",
"name.cy",
"net.cy",
"org.cy",
"parliament.cy",
"press.cy",
"pro.cy",
"tm.cy",
"cz",
"de",
"dj",
"dk",
"dm",
"com.dm",
"net.dm",
"org.dm",
"edu.dm",
"gov.dm",
"do",
"art.do",
"com.do",
"edu.do",
"gob.do",
"gov.do",
"mil.do",
"net.do",
"org.do",
"sld.do",
"web.do",
"dz",
"com.dz",
"org.dz",
"net.dz",
"gov.dz",
"edu.dz",
"asso.dz",
"pol.dz",
"art.dz",
"ec",
"com.ec",
"info.ec",
"net.ec",
"fin.ec",
"k12.ec",
"med.ec",
"pro.ec",
"org.ec",
"edu.ec",
"gov.ec",
"gob.ec",
"mil.ec",
"edu",
"ee",
"edu.ee",
"gov.ee",
"riik.ee",
"lib.ee",
"med.ee",
"com.ee",
"pri.ee",
"aip.ee",
"org.ee",
"fie.ee",
"eg",
"com.eg",
"edu.eg",
"eun.eg",
"gov.eg",
"mil.eg",
"name.eg",
"net.eg",
"org.eg",
"sci.eg",
"*.er",
"es",
"com.es",
"nom.es",
"org.es",
"gob.es",
"edu.es",
"et",
"com.et",
"gov.et",
"org.et",
"edu.et",
"biz.et",
"name.et",
"info.et",
"net.et",
"eu",
"fi",
"aland.fi",
"fj",
"ac.fj",
"biz.fj",
"com.fj",
"gov.fj",
"info.fj",
"mil.fj",
"name.fj",
"net.fj",
"org.fj",
"pro.fj",
"*.fk",
"fm",
"fo",
"fr",
"asso.fr",
"com.fr",
"gouv.fr",
"nom.fr",
"prd.fr",
"tm.fr",
"aeroport.fr",
"avocat.fr",
"avoues.fr",
"cci.fr",
"chambagri.fr",
"chirurgiens-dentistes.fr",
"experts-comptables.fr",
"geometre-expert.fr",
"greta.fr",
"huissier-justice.fr",
"medecin.fr",
"notaires.fr",
"pharmacien.fr",
"port.fr",
"veterinaire.fr",
"ga",
"gb",
"gd",
"ge",
"com.ge",
"edu.ge",
"gov.ge",
"org.ge",
"mil.ge",
"net.ge",
"pvt.ge",
"gf",
"gg",
"co.gg",
"net.gg",
"org.gg",
"gh",
"com.gh",
"edu.gh",
"gov.gh",
"org.gh",
"mil.gh",
"gi",
"com.gi",
"ltd.gi",
"gov.gi",
"mod.gi",
"edu.gi",
"org.gi",
"gl",
"co.gl",
"com.gl",
"edu.gl",
"net.gl",
"org.gl",
"gm",
"gn",
"ac.gn",
"com.gn",
"edu.gn",
"gov.gn",
"org.gn",
"net.gn",
"gov",
"gp",
"com.gp",
"net.gp",
"mobi.gp",
"edu.gp",
"org.gp",
"asso.gp",
"gq",
"gr",
"com.gr",
"edu.gr",
"net.gr",
"org.gr",
"gov.gr",
"gs",
"gt",
"com.gt",
"edu.gt",
"gob.gt",
"ind.gt",
"mil.gt",
"net.gt",
"org.gt",
"gu",
"com.gu",
"edu.gu",
"gov.gu",
"guam.gu",
"info.gu",
"net.gu",
"org.gu",
"web.gu",
"gw",
"gy",
"co.gy",
"com.gy",
"edu.gy",
"gov.gy",
"net.gy",
"org.gy",
"hk",
"com.hk",
"edu.hk",
"gov.hk",
"idv.hk",
"net.hk",
"org.hk",
"å…¬å�¸.hk",
"æ•™è‚².hk",
"æ•Žè‚².hk",
"æ”¿åºœ.hk",
"å€‹äºº.hk",
"ä¸ªäºº.hk",
"ç®‡äºº.hk",
"ç¶²ç»œ.hk",
"ç½‘ç»œ.hk",
"ç»„ç¹”.hk",
"ç¶²çµ¡.hk",
"ç½‘çµ¡.hk",
"ç»„ç»‡.hk",
"çµ„ç¹”.hk",
"çµ„ç»‡.hk",
"hm",
"hn",
"com.hn",
"edu.hn",
"org.hn",
"net.hn",
"mil.hn",
"gob.hn",
"hr",
"iz.hr",
"from.hr",
"name.hr",
"com.hr",
"ht",
"com.ht",
"shop.ht",
"firm.ht",
"info.ht",
"adult.ht",
"net.ht",
"pro.ht",
"org.ht",
"med.ht",
"art.ht",
"coop.ht",
"pol.ht",
"asso.ht",
"edu.ht",
"rel.ht",
"gouv.ht",
"perso.ht",
"hu",
"co.hu",
"info.hu",
"org.hu",
"priv.hu",
"sport.hu",
"tm.hu",
"2000.hu",
"agrar.hu",
"bolt.hu",
"casino.hu",
"city.hu",
"erotica.hu",
"erotika.hu",
"film.hu",
"forum.hu",
"games.hu",
"hotel.hu",
"ingatlan.hu",
"jogasz.hu",
"konyvelo.hu",
"lakas.hu",
"media.hu",
"news.hu",
"reklam.hu",
"sex.hu",
"shop.hu",
"suli.hu",
"szex.hu",
"tozsde.hu",
"utazas.hu",
"video.hu",
"id",
"ac.id",
"biz.id",
"co.id",
"desa.id",
"go.id",
"mil.id",
"my.id",
"net.id",
"or.id",
"ponpes.id",
"sch.id",
"web.id",
"ie",
"gov.ie",
"il",
"ac.il",
"co.il",
"gov.il",
"idf.il",
"k12.il",
"muni.il",
"net.il",
"org.il",
"im",
"ac.im",
"co.im",
"com.im",
"ltd.co.im",
"net.im",
"org.im",
"plc.co.im",
"tt.im",
"tv.im",
"in",
"co.in",
"firm.in",
"net.in",
"org.in",
"gen.in",
"ind.in",
"nic.in",
"ac.in",
"edu.in",
"res.in",
"gov.in",
"mil.in",
"info",
"int",
"eu.int",
"io",
"com.io",
"iq",
"gov.iq",
"edu.iq",
"mil.iq",
"com.iq",
"org.iq",
"net.iq",
"ir",
"ac.ir",
"co.ir",
"gov.ir",
"id.ir",
"net.ir",
"org.ir",
"sch.ir",
"Ø§ÛŒØ±Ø§Ù†.ir",
"Ø§ÙŠØ±Ø§Ù†.ir",
"is",
"net.is",
"com.is",
"edu.is",
"gov.is",
"org.is",
"int.is",
"it",
"gov.it",
"edu.it",
"abr.it",
"abruzzo.it",
"aosta-valley.it",
"aostavalley.it",
"bas.it",
"basilicata.it",
"cal.it",
"calabria.it",
"cam.it",
"campania.it",
"emilia-romagna.it",
"emiliaromagna.it",
"emr.it",
"friuli-v-giulia.it",
"friuli-ve-giulia.it",
"friuli-vegiulia.it",
"friuli-venezia-giulia.it",
"friuli-veneziagiulia.it",
"friuli-vgiulia.it",
"friuliv-giulia.it",
"friulive-giulia.it",
"friulivegiulia.it",
"friulivenezia-giulia.it",
"friuliveneziagiulia.it",
"friulivgiulia.it",
"fvg.it",
"laz.it",
"lazio.it",
"lig.it",
"liguria.it",
"lom.it",
"lombardia.it",
"lombardy.it",
"lucania.it",
"mar.it",
"marche.it",
"mol.it",
"molise.it",
"piedmont.it",
"piemonte.it",
"pmn.it",
"pug.it",
"puglia.it",
"sar.it",
"sardegna.it",
"sardinia.it",
"sic.it",
"sicilia.it",
"sicily.it",
"taa.it",
"tos.it",
"toscana.it",
"trentin-sud-tirol.it",
"trentin-sÃ¼d-tirol.it",
"trentin-sudtirol.it",
"trentin-sÃ¼dtirol.it",
"trentin-sued-tirol.it",
"trentin-suedtirol.it",
"trentino-a-adige.it",
"trentino-aadige.it",
"trentino-alto-adige.it",
"trentino-altoadige.it",
"trentino-s-tirol.it",
"trentino-stirol.it",
"trentino-sud-tirol.it",
"trentino-sÃ¼d-tirol.it",
"trentino-sudtirol.it",
"trentino-sÃ¼dtirol.it",
"trentino-sued-tirol.it",
"trentino-suedtirol.it",
"trentino.it",
"trentinoa-adige.it",
"trentinoaadige.it",
"trentinoalto-adige.it",
"trentinoaltoadige.it",
"trentinos-tirol.it",
"trentinostirol.it",
"trentinosud-tirol.it",
"trentinosÃ¼d-tirol.it",
"trentinosudtirol.it",
"trentinosÃ¼dtirol.it",
"trentinosued-tirol.it",
"trentinosuedtirol.it",
"trentinsud-tirol.it",
"trentinsÃ¼d-tirol.it",
"trentinsudtirol.it",
"trentinsÃ¼dtirol.it",
"trentinsued-tirol.it",
"trentinsuedtirol.it",
"tuscany.it",
"umb.it",
"umbria.it",
"val-d-aosta.it",
"val-daosta.it",
"vald-aosta.it",
"valdaosta.it",
"valle-aosta.it",
"valle-d-aosta.it",
"valle-daosta.it",
"valleaosta.it",
"valled-aosta.it",
"valledaosta.it",
"vallee-aoste.it",
"vallÃ©e-aoste.it",
"vallee-d-aoste.it",
"vallÃ©e-d-aoste.it",
"valleeaoste.it",
"vallÃ©eaoste.it",
"valleedaoste.it",
"vallÃ©edaoste.it",
"vao.it",
"vda.it",
"ven.it",
"veneto.it",
"ag.it",
"agrigento.it",
"al.it",
"alessandria.it",
"alto-adige.it",
"altoadige.it",
"an.it",
"ancona.it",
"andria-barletta-trani.it",
"andria-trani-barletta.it",
"andriabarlettatrani.it",
"andriatranibarletta.it",
"ao.it",
"aosta.it",
"aoste.it",
"ap.it",
"aq.it",
"aquila.it",
"ar.it",
"arezzo.it",
"ascoli-piceno.it",
"ascolipiceno.it",
"asti.it",
"at.it",
"av.it",
"avellino.it",
"ba.it",
"balsan-sudtirol.it",
"balsan-sÃ¼dtirol.it",
"balsan-suedtirol.it",
"balsan.it",
"bari.it",
"barletta-trani-andria.it",
"barlettatraniandria.it",
"belluno.it",
"benevento.it",
"bergamo.it",
"bg.it",
"bi.it",
"biella.it",
"bl.it",
"bn.it",
"bo.it",
"bologna.it",
"bolzano-altoadige.it",
"bolzano.it",
"bozen-sudtirol.it",
"bozen-sÃ¼dtirol.it",
"bozen-suedtirol.it",
"bozen.it",
"br.it",
"brescia.it",
"brindisi.it",
"bs.it",
"bt.it",
"bulsan-sudtirol.it",
"bulsan-sÃ¼dtirol.it",
"bulsan-suedtirol.it",
"bulsan.it",
"bz.it",
"ca.it",
"cagliari.it",
"caltanissetta.it",
"campidano-medio.it",
"campidanomedio.it",
"campobasso.it",
"carbonia-iglesias.it",
"carboniaiglesias.it",
"carrara-massa.it",
"carraramassa.it",
"caserta.it",
"catania.it",
"catanzaro.it",
"cb.it",
"ce.it",
"cesena-forli.it",
"cesena-forlÃ¬.it",
"cesenaforli.it",
"cesenaforlÃ¬.it",
"ch.it",
"chieti.it",
"ci.it",
"cl.it",
"cn.it",
"co.it",
"como.it",
"cosenza.it",
"cr.it",
"cremona.it",
"crotone.it",
"cs.it",
"ct.it",
"cuneo.it",
"cz.it",
"dell-ogliastra.it",
"dellogliastra.it",
"en.it",
"enna.it",
"fc.it",
"fe.it",
"fermo.it",
"ferrara.it",
"fg.it",
"fi.it",
"firenze.it",
"florence.it",
"fm.it",
"foggia.it",
"forli-cesena.it",
"forlÃ¬-cesena.it",
"forlicesena.it",
"forlÃ¬cesena.it",
"fr.it",
"frosinone.it",
"ge.it",
"genoa.it",
"genova.it",
"go.it",
"gorizia.it",
"gr.it",
"grosseto.it",
"iglesias-carbonia.it",
"iglesiascarbonia.it",
"im.it",
"imperia.it",
"is.it",
"isernia.it",
"kr.it",
"la-spezia.it",
"laquila.it",
"laspezia.it",
"latina.it",
"lc.it",
"le.it",
"lecce.it",
"lecco.it",
"li.it",
"livorno.it",
"lo.it",
"lodi.it",
"lt.it",
"lu.it",
"lucca.it",
"macerata.it",
"mantova.it",
"massa-carrara.it",
"massacarrara.it",
"matera.it",
"mb.it",
"mc.it",
"me.it",
"medio-campidano.it",
"mediocampidano.it",
"messina.it",
"mi.it",
"milan.it",
"milano.it",
"mn.it",
"mo.it",
"modena.it",
"monza-brianza.it",
"monza-e-della-brianza.it",
"monza.it",
"monzabrianza.it",
"monzaebrianza.it",
"monzaedellabrianza.it",
"ms.it",
"mt.it",
"na.it",
"naples.it",
"napoli.it",
"no.it",
"novara.it",
"nu.it",
"nuoro.it",
"og.it",
"ogliastra.it",
"olbia-tempio.it",
"olbiatempio.it",
"or.it",
"oristano.it",
"ot.it",
"pa.it",
"padova.it",
"padua.it",
"palermo.it",
"parma.it",
"pavia.it",
"pc.it",
"pd.it",
"pe.it",
"perugia.it",
"pesaro-urbino.it",
"pesarourbino.it",
"pescara.it",
"pg.it",
"pi.it",
"piacenza.it",
"pisa.it",
"pistoia.it",
"pn.it",
"po.it",
"pordenone.it",
"potenza.it",
"pr.it",
"prato.it",
"pt.it",
"pu.it",
"pv.it",
"pz.it",
"ra.it",
"ragusa.it",
"ravenna.it",
"rc.it",
"re.it",
"reggio-calabria.it",
"reggio-emilia.it",
"reggiocalabria.it",
"reggioemilia.it",
"rg.it",
"ri.it",
"rieti.it",
"rimini.it",
"rm.it",
"rn.it",
"ro.it",
"roma.it",
"rome.it",
"rovigo.it",
"sa.it",
"salerno.it",
"sassari.it",
"savona.it",
"si.it",
"siena.it",
"siracusa.it",
"so.it",
"sondrio.it",
"sp.it",
"sr.it",
"ss.it",
"suedtirol.it",
"sÃ¼dtirol.it",
"sv.it",
"ta.it",
"taranto.it",
"te.it",
"tempio-olbia.it",
"tempioolbia.it",
"teramo.it",
"terni.it",
"tn.it",
"to.it",
"torino.it",
"tp.it",
"tr.it",
"trani-andria-barletta.it",
"trani-barletta-andria.it",
"traniandriabarletta.it",
"tranibarlettaandria.it",
"trapani.it",
"trento.it",
"treviso.it",
"trieste.it",
"ts.it",
"turin.it",
"tv.it",
"ud.it",
"udine.it",
"urbino-pesaro.it",
"urbinopesaro.it",
"va.it",
"varese.it",
"vb.it",
"vc.it",
"ve.it",
"venezia.it",
"venice.it",
"verbania.it",
"vercelli.it",
"verona.it",
"vi.it",
"vibo-valentia.it",
"vibovalentia.it",
"vicenza.it",
"viterbo.it",
"vr.it",
"vs.it",
"vt.it",
"vv.it",
"je",
"co.je",
"net.je",
"org.je",
"*.jm",
"jo",
"com.jo",
"org.jo",
"net.jo",
"edu.jo",
"sch.jo",
"gov.jo",
"mil.jo",
"name.jo",
"jobs",
"jp",
"ac.jp",
"ad.jp",
"co.jp",
"ed.jp",
"go.jp",
"gr.jp",
"lg.jp",
"ne.jp",
"or.jp",
"aichi.jp",
"akita.jp",
"aomori.jp",
"chiba.jp",
"ehime.jp",
"fukui.jp",
"fukuoka.jp",
"fukushima.jp",
"gifu.jp",
"gunma.jp",
"hiroshima.jp",
"hokkaido.jp",
"hyogo.jp",
"ibaraki.jp",
"ishikawa.jp",
"iwate.jp",
"kagawa.jp",
"kagoshima.jp",
"kanagawa.jp",
"kochi.jp",
"kumamoto.jp",
"kyoto.jp",
"mie.jp",
"miyagi.jp",
"miyazaki.jp",
"nagano.jp",
"nagasaki.jp",
"nara.jp",
"niigata.jp",
"oita.jp",
"okayama.jp",
"okinawa.jp",
"osaka.jp",
"saga.jp",
"saitama.jp",
"shiga.jp",
"shimane.jp",
"shizuoka.jp",
"tochigi.jp",
"tokushima.jp",
"tokyo.jp",
"tottori.jp",
"toyama.jp",
"wakayama.jp",
"yamagata.jp",
"yamaguchi.jp",
"yamanashi.jp",
"æ ƒæœ¨.jp",
"æ„›çŸ¥.jp",
"æ„›åª›.jp",
"å…µåº«.jp",
"ç†Šæœ¬.jp",
"èŒ¨åŸŽ.jp",
"åŒ—æµ·é�“.jp",
"å�ƒè‘‰.jp",
"å’Œæ­Œå±±.jp",
"é•·å´Ž.jp",
"é•·é‡Ž.jp",
"æ–°æ½Ÿ.jp",
"é�’æ£®.jp",
"é�™å²¡.jp",
"æ�±äº¬.jp",
"çŸ³å·�.jp",
"åŸ¼çŽ‰.jp",
"ä¸‰é‡�.jp",
"äº¬éƒ½.jp",
"ä½�è³€.jp",
"å¤§åˆ†.jp",
"å¤§é˜ª.jp",
"å¥ˆè‰¯.jp",
"å®®åŸŽ.jp",
"å®®å´Ž.jp",
"å¯Œå±±.jp",
"å±±å�£.jp",
"å±±å½¢.jp",
"å±±æ¢¨.jp",
"å²©æ‰‹.jp",
"å²�é˜œ.jp",
"å²¡å±±.jp",
"å³¶æ ¹.jp",
"åºƒå³¶.jp",
"å¾³å³¶.jp",
"æ²–ç¸„.jp",
"æ»‹è³€.jp",
"ç¥žå¥ˆå·�.jp",
"ç¦�äº•.jp",
"ç¦�å²¡.jp",
"ç¦�å³¶.jp",
"ç§‹ç”°.jp",
"ç¾¤é¦¬.jp",
"é¦™å·�.jp",
"é«˜çŸ¥.jp",
"é³¥å�–.jp",
"é¹¿å…�å³¶.jp",
"*.kawasaki.jp",
"*.kitakyushu.jp",
"*.kobe.jp",
"*.nagoya.jp",
"*.sapporo.jp",
"*.sendai.jp",
"*.yokohama.jp",
"!city.kawasaki.jp",
"!city.kitakyushu.jp",
"!city.kobe.jp",
"!city.nagoya.jp",
"!city.sapporo.jp",
"!city.sendai.jp",
"!city.yokohama.jp",
"aisai.aichi.jp",
"ama.aichi.jp",
"anjo.aichi.jp",
"asuke.aichi.jp",
"chiryu.aichi.jp",
"chita.aichi.jp",
"fuso.aichi.jp",
"gamagori.aichi.jp",
"handa.aichi.jp",
"hazu.aichi.jp",
"hekinan.aichi.jp",
"higashiura.aichi.jp",
"ichinomiya.aichi.jp",
"inazawa.aichi.jp",
"inuyama.aichi.jp",
"isshiki.aichi.jp",
"iwakura.aichi.jp",
"kanie.aichi.jp",
"kariya.aichi.jp",
"kasugai.aichi.jp",
"kira.aichi.jp",
"kiyosu.aichi.jp",
"komaki.aichi.jp",
"konan.aichi.jp",
"kota.aichi.jp",
"mihama.aichi.jp",
"miyoshi.aichi.jp",
"nishio.aichi.jp",
"nisshin.aichi.jp",
"obu.aichi.jp",
"oguchi.aichi.jp",
"oharu.aichi.jp",
"okazaki.aichi.jp",
"owariasahi.aichi.jp",
"seto.aichi.jp",
"shikatsu.aichi.jp",
"shinshiro.aichi.jp",
"shitara.aichi.jp",
"tahara.aichi.jp",
"takahama.aichi.jp",
"tobishima.aichi.jp",
"toei.aichi.jp",
"togo.aichi.jp",
"tokai.aichi.jp",
"tokoname.aichi.jp",
"toyoake.aichi.jp",
"toyohashi.aichi.jp",
"toyokawa.aichi.jp",
"toyone.aichi.jp",
"toyota.aichi.jp",
"tsushima.aichi.jp",
"yatomi.aichi.jp",
"akita.akita.jp",
"daisen.akita.jp",
"fujisato.akita.jp",
"gojome.akita.jp",
"hachirogata.akita.jp",
"happou.akita.jp",
"higashinaruse.akita.jp",
"honjo.akita.jp",
"honjyo.akita.jp",
"ikawa.akita.jp",
"kamikoani.akita.jp",
"kamioka.akita.jp",
"katagami.akita.jp",
"kazuno.akita.jp",
"kitaakita.akita.jp",
"kosaka.akita.jp",
"kyowa.akita.jp",
"misato.akita.jp",
"mitane.akita.jp",
"moriyoshi.akita.jp",
"nikaho.akita.jp",
"noshiro.akita.jp",
"odate.akita.jp",
"oga.akita.jp",
"ogata.akita.jp",
"semboku.akita.jp",
"yokote.akita.jp",
"yurihonjo.akita.jp",
"aomori.aomori.jp",
"gonohe.aomori.jp",
"hachinohe.aomori.jp",
"hashikami.aomori.jp",
"hiranai.aomori.jp",
"hirosaki.aomori.jp",
"itayanagi.aomori.jp",
"kuroishi.aomori.jp",
"misawa.aomori.jp",
"mutsu.aomori.jp",
"nakadomari.aomori.jp",
"noheji.aomori.jp",
"oirase.aomori.jp",
"owani.aomori.jp",
"rokunohe.aomori.jp",
"sannohe.aomori.jp",
"shichinohe.aomori.jp",
"shingo.aomori.jp",
"takko.aomori.jp",
"towada.aomori.jp",
"tsugaru.aomori.jp",
"tsuruta.aomori.jp",
"abiko.chiba.jp",
"asahi.chiba.jp",
"chonan.chiba.jp",
"chosei.chiba.jp",
"choshi.chiba.jp",
"chuo.chiba.jp",
"funabashi.chiba.jp",
"futtsu.chiba.jp",
"hanamigawa.chiba.jp",
"ichihara.chiba.jp",
"ichikawa.chiba.jp",
"ichinomiya.chiba.jp",
"inzai.chiba.jp",
"isumi.chiba.jp",
"kamagaya.chiba.jp",
"kamogawa.chiba.jp",
"kashiwa.chiba.jp",
"katori.chiba.jp",
"katsuura.chiba.jp",
"kimitsu.chiba.jp",
"kisarazu.chiba.jp",
"kozaki.chiba.jp",
"kujukuri.chiba.jp",
"kyonan.chiba.jp",
"matsudo.chiba.jp",
"midori.chiba.jp",
"mihama.chiba.jp",
"minamiboso.chiba.jp",
"mobara.chiba.jp",
"mutsuzawa.chiba.jp",
"nagara.chiba.jp",
"nagareyama.chiba.jp",
"narashino.chiba.jp",
"narita.chiba.jp",
"noda.chiba.jp",
"oamishirasato.chiba.jp",
"omigawa.chiba.jp",
"onjuku.chiba.jp",
"otaki.chiba.jp",
"sakae.chiba.jp",
"sakura.chiba.jp",
"shimofusa.chiba.jp",
"shirako.chiba.jp",
"shiroi.chiba.jp",
"shisui.chiba.jp",
"sodegaura.chiba.jp",
"sosa.chiba.jp",
"tako.chiba.jp",
"tateyama.chiba.jp",
"togane.chiba.jp",
"tohnosho.chiba.jp",
"tomisato.chiba.jp",
"urayasu.chiba.jp",
"yachimata.chiba.jp",
"yachiyo.chiba.jp",
"yokaichiba.chiba.jp",
"yokoshibahikari.chiba.jp",
"yotsukaido.chiba.jp",
"ainan.ehime.jp",
"honai.ehime.jp",
"ikata.ehime.jp",
"imabari.ehime.jp",
"iyo.ehime.jp",
"kamijima.ehime.jp",
"kihoku.ehime.jp",
"kumakogen.ehime.jp",
"masaki.ehime.jp",
"matsuno.ehime.jp",
"matsuyama.ehime.jp",
"namikata.ehime.jp",
"niihama.ehime.jp",
"ozu.ehime.jp",
"saijo.ehime.jp",
"seiyo.ehime.jp",
"shikokuchuo.ehime.jp",
"tobe.ehime.jp",
"toon.ehime.jp",
"uchiko.ehime.jp",
"uwajima.ehime.jp",
"yawatahama.ehime.jp",
"echizen.fukui.jp",
"eiheiji.fukui.jp",
"fukui.fukui.jp",
"ikeda.fukui.jp",
"katsuyama.fukui.jp",
"mihama.fukui.jp",
"minamiechizen.fukui.jp",
"obama.fukui.jp",
"ohi.fukui.jp",
"ono.fukui.jp",
"sabae.fukui.jp",
"sakai.fukui.jp",
"takahama.fukui.jp",
"tsuruga.fukui.jp",
"wakasa.fukui.jp",
"ashiya.fukuoka.jp",
"buzen.fukuoka.jp",
"chikugo.fukuoka.jp",
"chikuho.fukuoka.jp",
"chikujo.fukuoka.jp",
"chikushino.fukuoka.jp",
"chikuzen.fukuoka.jp",
"chuo.fukuoka.jp",
"dazaifu.fukuoka.jp",
"fukuchi.fukuoka.jp",
"hakata.fukuoka.jp",
"higashi.fukuoka.jp",
"hirokawa.fukuoka.jp",
"hisayama.fukuoka.jp",
"iizuka.fukuoka.jp",
"inatsuki.fukuoka.jp",
"kaho.fukuoka.jp",
"kasuga.fukuoka.jp",
"kasuya.fukuoka.jp",
"kawara.fukuoka.jp",
"keisen.fukuoka.jp",
"koga.fukuoka.jp",
"kurate.fukuoka.jp",
"kurogi.fukuoka.jp",
"kurume.fukuoka.jp",
"minami.fukuoka.jp",
"miyako.fukuoka.jp",
"miyama.fukuoka.jp",
"miyawaka.fukuoka.jp",
"mizumaki.fukuoka.jp",
"munakata.fukuoka.jp",
"nakagawa.fukuoka.jp",
"nakama.fukuoka.jp",
"nishi.fukuoka.jp",
"nogata.fukuoka.jp",
"ogori.fukuoka.jp",
"okagaki.fukuoka.jp",
"okawa.fukuoka.jp",
"oki.fukuoka.jp",
"omuta.fukuoka.jp",
"onga.fukuoka.jp",
"onojo.fukuoka.jp",
"oto.fukuoka.jp",
"saigawa.fukuoka.jp",
"sasaguri.fukuoka.jp",
"shingu.fukuoka.jp",
"shinyoshitomi.fukuoka.jp",
"shonai.fukuoka.jp",
"soeda.fukuoka.jp",
"sue.fukuoka.jp",
"tachiarai.fukuoka.jp",
"tagawa.fukuoka.jp",
"takata.fukuoka.jp",
"toho.fukuoka.jp",
"toyotsu.fukuoka.jp",
"tsuiki.fukuoka.jp",
"ukiha.fukuoka.jp",
"umi.fukuoka.jp",
"usui.fukuoka.jp",
"yamada.fukuoka.jp",
"yame.fukuoka.jp",
"yanagawa.fukuoka.jp",
"yukuhashi.fukuoka.jp",
"aizubange.fukushima.jp",
"aizumisato.fukushima.jp",
"aizuwakamatsu.fukushima.jp",
"asakawa.fukushima.jp",
"bandai.fukushima.jp",
"date.fukushima.jp",
"fukushima.fukushima.jp",
"furudono.fukushima.jp",
"futaba.fukushima.jp",
"hanawa.fukushima.jp",
"higashi.fukushima.jp",
"hirata.fukushima.jp",
"hirono.fukushima.jp",
"iitate.fukushima.jp",
"inawashiro.fukushima.jp",
"ishikawa.fukushima.jp",
"iwaki.fukushima.jp",
"izumizaki.fukushima.jp",
"kagamiishi.fukushima.jp",
"kaneyama.fukushima.jp",
"kawamata.fukushima.jp",
"kitakata.fukushima.jp",
"kitashiobara.fukushima.jp",
"koori.fukushima.jp",
"koriyama.fukushima.jp",
"kunimi.fukushima.jp",
"miharu.fukushima.jp",
"mishima.fukushima.jp",
"namie.fukushima.jp",
"nango.fukushima.jp",
"nishiaizu.fukushima.jp",
"nishigo.fukushima.jp",
"okuma.fukushima.jp",
"omotego.fukushima.jp",
"ono.fukushima.jp",
"otama.fukushima.jp",
"samegawa.fukushima.jp",
"shimogo.fukushima.jp",
"shirakawa.fukushima.jp",
"showa.fukushima.jp",
"soma.fukushima.jp",
"sukagawa.fukushima.jp",
"taishin.fukushima.jp",
"tamakawa.fukushima.jp",
"tanagura.fukushima.jp",
"tenei.fukushima.jp",
"yabuki.fukushima.jp",
"yamato.fukushima.jp",
"yamatsuri.fukushima.jp",
"yanaizu.fukushima.jp",
"yugawa.fukushima.jp",
"anpachi.gifu.jp",
"ena.gifu.jp",
"gifu.gifu.jp",
"ginan.gifu.jp",
"godo.gifu.jp",
"gujo.gifu.jp",
"hashima.gifu.jp",
"hichiso.gifu.jp",
"hida.gifu.jp",
"higashishirakawa.gifu.jp",
"ibigawa.gifu.jp",
"ikeda.gifu.jp",
"kakamigahara.gifu.jp",
"kani.gifu.jp",
"kasahara.gifu.jp",
"kasamatsu.gifu.jp",
"kawaue.gifu.jp",
"kitagata.gifu.jp",
"mino.gifu.jp",
"minokamo.gifu.jp",
"mitake.gifu.jp",
"mizunami.gifu.jp",
"motosu.gifu.jp",
"nakatsugawa.gifu.jp",
"ogaki.gifu.jp",
"sakahogi.gifu.jp",
"seki.gifu.jp",
"sekigahara.gifu.jp",
"shirakawa.gifu.jp",
"tajimi.gifu.jp",
"takayama.gifu.jp",
"tarui.gifu.jp",
"toki.gifu.jp",
"tomika.gifu.jp",
"wanouchi.gifu.jp",
"yamagata.gifu.jp",
"yaotsu.gifu.jp",
"yoro.gifu.jp",
"annaka.gunma.jp",
"chiyoda.gunma.jp",
"fujioka.gunma.jp",
"higashiagatsuma.gunma.jp",
"isesaki.gunma.jp",
"itakura.gunma.jp",
"kanna.gunma.jp",
"kanra.gunma.jp",
"katashina.gunma.jp",
"kawaba.gunma.jp",
"kiryu.gunma.jp",
"kusatsu.gunma.jp",
"maebashi.gunma.jp",
"meiwa.gunma.jp",
"midori.gunma.jp",
"minakami.gunma.jp",
"naganohara.gunma.jp",
"nakanojo.gunma.jp",
"nanmoku.gunma.jp",
"numata.gunma.jp",
"oizumi.gunma.jp",
"ora.gunma.jp",
"ota.gunma.jp",
"shibukawa.gunma.jp",
"shimonita.gunma.jp",
"shinto.gunma.jp",
"showa.gunma.jp",
"takasaki.gunma.jp",
"takayama.gunma.jp",
"tamamura.gunma.jp",
"tatebayashi.gunma.jp",
"tomioka.gunma.jp",
"tsukiyono.gunma.jp",
"tsumagoi.gunma.jp",
"ueno.gunma.jp",
"yoshioka.gunma.jp",
"asaminami.hiroshima.jp",
"daiwa.hiroshima.jp",
"etajima.hiroshima.jp",
"fuchu.hiroshima.jp",
"fukuyama.hiroshima.jp",
"hatsukaichi.hiroshima.jp",
"higashihiroshima.hiroshima.jp",
"hongo.hiroshima.jp",
"jinsekikogen.hiroshima.jp",
"kaita.hiroshima.jp",
"kui.hiroshima.jp",
"kumano.hiroshima.jp",
"kure.hiroshima.jp",
"mihara.hiroshima.jp",
"miyoshi.hiroshima.jp",
"naka.hiroshima.jp",
"onomichi.hiroshima.jp",
"osakikamijima.hiroshima.jp",
"otake.hiroshima.jp",
"saka.hiroshima.jp",
"sera.hiroshima.jp",
"seranishi.hiroshima.jp",
"shinichi.hiroshima.jp",
"shobara.hiroshima.jp",
"takehara.hiroshima.jp",
"abashiri.hokkaido.jp",
"abira.hokkaido.jp",
"aibetsu.hokkaido.jp",
"akabira.hokkaido.jp",
"akkeshi.hokkaido.jp",
"asahikawa.hokkaido.jp",
"ashibetsu.hokkaido.jp",
"ashoro.hokkaido.jp",
"assabu.hokkaido.jp",
"atsuma.hokkaido.jp",
"bibai.hokkaido.jp",
"biei.hokkaido.jp",
"bifuka.hokkaido.jp",
"bihoro.hokkaido.jp",
"biratori.hokkaido.jp",
"chippubetsu.hokkaido.jp",
"chitose.hokkaido.jp",
"date.hokkaido.jp",
"ebetsu.hokkaido.jp",
"embetsu.hokkaido.jp",
"eniwa.hokkaido.jp",
"erimo.hokkaido.jp",
"esan.hokkaido.jp",
"esashi.hokkaido.jp",
"fukagawa.hokkaido.jp",
"fukushima.hokkaido.jp",
"furano.hokkaido.jp",
"furubira.hokkaido.jp",
"haboro.hokkaido.jp",
"hakodate.hokkaido.jp",
"hamatonbetsu.hokkaido.jp",
"hidaka.hokkaido.jp",
"higashikagura.hokkaido.jp",
"higashikawa.hokkaido.jp",
"hiroo.hokkaido.jp",
"hokuryu.hokkaido.jp",
"hokuto.hokkaido.jp",
"honbetsu.hokkaido.jp",
"horokanai.hokkaido.jp",
"horonobe.hokkaido.jp",
"ikeda.hokkaido.jp",
"imakane.hokkaido.jp",
"ishikari.hokkaido.jp",
"iwamizawa.hokkaido.jp",
"iwanai.hokkaido.jp",
"kamifurano.hokkaido.jp",
"kamikawa.hokkaido.jp",
"kamishihoro.hokkaido.jp",
"kamisunagawa.hokkaido.jp",
"kamoenai.hokkaido.jp",
"kayabe.hokkaido.jp",
"kembuchi.hokkaido.jp",
"kikonai.hokkaido.jp",
"kimobetsu.hokkaido.jp",
"kitahiroshima.hokkaido.jp",
"kitami.hokkaido.jp",
"kiyosato.hokkaido.jp",
"koshimizu.hokkaido.jp",
"kunneppu.hokkaido.jp",
"kuriyama.hokkaido.jp",
"kuromatsunai.hokkaido.jp",
"kushiro.hokkaido.jp",
"kutchan.hokkaido.jp",
"kyowa.hokkaido.jp",
"mashike.hokkaido.jp",
"matsumae.hokkaido.jp",
"mikasa.hokkaido.jp",
"minamifurano.hokkaido.jp",
"mombetsu.hokkaido.jp",
"moseushi.hokkaido.jp",
"mukawa.hokkaido.jp",
"muroran.hokkaido.jp",
"naie.hokkaido.jp",
"nakagawa.hokkaido.jp",
"nakasatsunai.hokkaido.jp",
"nakatombetsu.hokkaido.jp",
"nanae.hokkaido.jp",
"nanporo.hokkaido.jp",
"nayoro.hokkaido.jp",
"nemuro.hokkaido.jp",
"niikappu.hokkaido.jp",
"niki.hokkaido.jp",
"nishiokoppe.hokkaido.jp",
"noboribetsu.hokkaido.jp",
"numata.hokkaido.jp",
"obihiro.hokkaido.jp",
"obira.hokkaido.jp",
"oketo.hokkaido.jp",
"okoppe.hokkaido.jp",
"otaru.hokkaido.jp",
"otobe.hokkaido.jp",
"otofuke.hokkaido.jp",
"otoineppu.hokkaido.jp",
"oumu.hokkaido.jp",
"ozora.hokkaido.jp",
"pippu.hokkaido.jp",
"rankoshi.hokkaido.jp",
"rebun.hokkaido.jp",
"rikubetsu.hokkaido.jp",
"rishiri.hokkaido.jp",
"rishirifuji.hokkaido.jp",
"saroma.hokkaido.jp",
"sarufutsu.hokkaido.jp",
"shakotan.hokkaido.jp",
"shari.hokkaido.jp",
"shibecha.hokkaido.jp",
"shibetsu.hokkaido.jp",
"shikabe.hokkaido.jp",
"shikaoi.hokkaido.jp",
"shimamaki.hokkaido.jp",
"shimizu.hokkaido.jp",
"shimokawa.hokkaido.jp",
"shinshinotsu.hokkaido.jp",
"shintoku.hokkaido.jp",
"shiranuka.hokkaido.jp",
"shiraoi.hokkaido.jp",
"shiriuchi.hokkaido.jp",
"sobetsu.hokkaido.jp",
"sunagawa.hokkaido.jp",
"taiki.hokkaido.jp",
"takasu.hokkaido.jp",
"takikawa.hokkaido.jp",
"takinoue.hokkaido.jp",
"teshikaga.hokkaido.jp",
"tobetsu.hokkaido.jp",
"tohma.hokkaido.jp",
"tomakomai.hokkaido.jp",
"tomari.hokkaido.jp",
"toya.hokkaido.jp",
"toyako.hokkaido.jp",
"toyotomi.hokkaido.jp",
"toyoura.hokkaido.jp",
"tsubetsu.hokkaido.jp",
"tsukigata.hokkaido.jp",
"urakawa.hokkaido.jp",
"urausu.hokkaido.jp",
"uryu.hokkaido.jp",
"utashinai.hokkaido.jp",
"wakkanai.hokkaido.jp",
"wassamu.hokkaido.jp",
"yakumo.hokkaido.jp",
"yoichi.hokkaido.jp",
"aioi.hyogo.jp",
"akashi.hyogo.jp",
"ako.hyogo.jp",
"amagasaki.hyogo.jp",
"aogaki.hyogo.jp",
"asago.hyogo.jp",
"ashiya.hyogo.jp",
"awaji.hyogo.jp",
"fukusaki.hyogo.jp",
"goshiki.hyogo.jp",
"harima.hyogo.jp",
"himeji.hyogo.jp",
"ichikawa.hyogo.jp",
"inagawa.hyogo.jp",
"itami.hyogo.jp",
"kakogawa.hyogo.jp",
"kamigori.hyogo.jp",
"kamikawa.hyogo.jp",
"kasai.hyogo.jp",
"kasuga.hyogo.jp",
"kawanishi.hyogo.jp",
"miki.hyogo.jp",
"minamiawaji.hyogo.jp",
"nishinomiya.hyogo.jp",
"nishiwaki.hyogo.jp",
"ono.hyogo.jp",
"sanda.hyogo.jp",
"sannan.hyogo.jp",
"sasayama.hyogo.jp",
"sayo.hyogo.jp",
"shingu.hyogo.jp",
"shinonsen.hyogo.jp",
"shiso.hyogo.jp",
"sumoto.hyogo.jp",
"taishi.hyogo.jp",
"taka.hyogo.jp",
"takarazuka.hyogo.jp",
"takasago.hyogo.jp",
"takino.hyogo.jp",
"tamba.hyogo.jp",
"tatsuno.hyogo.jp",
"toyooka.hyogo.jp",
"yabu.hyogo.jp",
"yashiro.hyogo.jp",
"yoka.hyogo.jp",
"yokawa.hyogo.jp",
"ami.ibaraki.jp",
"asahi.ibaraki.jp",
"bando.ibaraki.jp",
"chikusei.ibaraki.jp",
"daigo.ibaraki.jp",
"fujishiro.ibaraki.jp",
"hitachi.ibaraki.jp",
"hitachinaka.ibaraki.jp",
"hitachiomiya.ibaraki.jp",
"hitachiota.ibaraki.jp",
"ibaraki.ibaraki.jp",
"ina.ibaraki.jp",
"inashiki.ibaraki.jp",
"itako.ibaraki.jp",
"iwama.ibaraki.jp",
"joso.ibaraki.jp",
"kamisu.ibaraki.jp",
"kasama.ibaraki.jp",
"kashima.ibaraki.jp",
"kasumigaura.ibaraki.jp",
"koga.ibaraki.jp",
"miho.ibaraki.jp",
"mito.ibaraki.jp",
"moriya.ibaraki.jp",
"naka.ibaraki.jp",
"namegata.ibaraki.jp",
"oarai.ibaraki.jp",
"ogawa.ibaraki.jp",
"omitama.ibaraki.jp",
"ryugasaki.ibaraki.jp",
"sakai.ibaraki.jp",
"sakuragawa.ibaraki.jp",
"shimodate.ibaraki.jp",
"shimotsuma.ibaraki.jp",
"shirosato.ibaraki.jp",
"sowa.ibaraki.jp",
"suifu.ibaraki.jp",
"takahagi.ibaraki.jp",
"tamatsukuri.ibaraki.jp",
"tokai.ibaraki.jp",
"tomobe.ibaraki.jp",
"tone.ibaraki.jp",
"toride.ibaraki.jp",
"tsuchiura.ibaraki.jp",
"tsukuba.ibaraki.jp",
"uchihara.ibaraki.jp",
"ushiku.ibaraki.jp",
"yachiyo.ibaraki.jp",
"yamagata.ibaraki.jp",
"yawara.ibaraki.jp",
"yuki.ibaraki.jp",
"anamizu.ishikawa.jp",
"hakui.ishikawa.jp",
"hakusan.ishikawa.jp",
"kaga.ishikawa.jp",
"kahoku.ishikawa.jp",
"kanazawa.ishikawa.jp",
"kawakita.ishikawa.jp",
"komatsu.ishikawa.jp",
"nakanoto.ishikawa.jp",
"nanao.ishikawa.jp",
"nomi.ishikawa.jp",
"nonoichi.ishikawa.jp",
"noto.ishikawa.jp",
"shika.ishikawa.jp",
"suzu.ishikawa.jp",
"tsubata.ishikawa.jp",
"tsurugi.ishikawa.jp",
"uchinada.ishikawa.jp",
"wajima.ishikawa.jp",
"fudai.iwate.jp",
"fujisawa.iwate.jp",
"hanamaki.iwate.jp",
"hiraizumi.iwate.jp",
"hirono.iwate.jp",
"ichinohe.iwate.jp",
"ichinoseki.iwate.jp",
"iwaizumi.iwate.jp",
"iwate.iwate.jp",
"joboji.iwate.jp",
"kamaishi.iwate.jp",
"kanegasaki.iwate.jp",
"karumai.iwate.jp",
"kawai.iwate.jp",
"kitakami.iwate.jp",
"kuji.iwate.jp",
"kunohe.iwate.jp",
"kuzumaki.iwate.jp",
"miyako.iwate.jp",
"mizusawa.iwate.jp",
"morioka.iwate.jp",
"ninohe.iwate.jp",
"noda.iwate.jp",
"ofunato.iwate.jp",
"oshu.iwate.jp",
"otsuchi.iwate.jp",
"rikuzentakata.iwate.jp",
"shiwa.iwate.jp",
"shizukuishi.iwate.jp",
"sumita.iwate.jp",
"tanohata.iwate.jp",
"tono.iwate.jp",
"yahaba.iwate.jp",
"yamada.iwate.jp",
"ayagawa.kagawa.jp",
"higashikagawa.kagawa.jp",
"kanonji.kagawa.jp",
"kotohira.kagawa.jp",
"manno.kagawa.jp",
"marugame.kagawa.jp",
"mitoyo.kagawa.jp",
"naoshima.kagawa.jp",
"sanuki.kagawa.jp",
"tadotsu.kagawa.jp",
"takamatsu.kagawa.jp",
"tonosho.kagawa.jp",
"uchinomi.kagawa.jp",
"utazu.kagawa.jp",
"zentsuji.kagawa.jp",
"akune.kagoshima.jp",
"amami.kagoshima.jp",
"hioki.kagoshima.jp",
"isa.kagoshima.jp",
"isen.kagoshima.jp",
"izumi.kagoshima.jp",
"kagoshima.kagoshima.jp",
"kanoya.kagoshima.jp",
"kawanabe.kagoshima.jp",
"kinko.kagoshima.jp",
"kouyama.kagoshima.jp",
"makurazaki.kagoshima.jp",
"matsumoto.kagoshima.jp",
"minamitane.kagoshima.jp",
"nakatane.kagoshima.jp",
"nishinoomote.kagoshima.jp",
"satsumasendai.kagoshima.jp",
"soo.kagoshima.jp",
"tarumizu.kagoshima.jp",
"yusui.kagoshima.jp",
"aikawa.kanagawa.jp",
"atsugi.kanagawa.jp",
"ayase.kanagawa.jp",
"chigasaki.kanagawa.jp",
"ebina.kanagawa.jp",
"fujisawa.kanagawa.jp",
"hadano.kanagawa.jp",
"hakone.kanagawa.jp",
"hiratsuka.kanagawa.jp",
"isehara.kanagawa.jp",
"kaisei.kanagawa.jp",
"kamakura.kanagawa.jp",
"kiyokawa.kanagawa.jp",
"matsuda.kanagawa.jp",
"minamiashigara.kanagawa.jp",
"miura.kanagawa.jp",
"nakai.kanagawa.jp",
"ninomiya.kanagawa.jp",
"odawara.kanagawa.jp",
"oi.kanagawa.jp",
"oiso.kanagawa.jp",
"sagamihara.kanagawa.jp",
"samukawa.kanagawa.jp",
"tsukui.kanagawa.jp",
"yamakita.kanagawa.jp",
"yamato.kanagawa.jp",
"yokosuka.kanagawa.jp",
"yugawara.kanagawa.jp",
"zama.kanagawa.jp",
"zushi.kanagawa.jp",
"aki.kochi.jp",
"geisei.kochi.jp",
"hidaka.kochi.jp",
"higashitsuno.kochi.jp",
"ino.kochi.jp",
"kagami.kochi.jp",
"kami.kochi.jp",
"kitagawa.kochi.jp",
"kochi.kochi.jp",
"mihara.kochi.jp",
"motoyama.kochi.jp",
"muroto.kochi.jp",
"nahari.kochi.jp",
"nakamura.kochi.jp",
"nankoku.kochi.jp",
"nishitosa.kochi.jp",
"niyodogawa.kochi.jp",
"ochi.kochi.jp",
"okawa.kochi.jp",
"otoyo.kochi.jp",
"otsuki.kochi.jp",
"sakawa.kochi.jp",
"sukumo.kochi.jp",
"susaki.kochi.jp",
"tosa.kochi.jp",
"tosashimizu.kochi.jp",
"toyo.kochi.jp",
"tsuno.kochi.jp",
"umaji.kochi.jp",
"yasuda.kochi.jp",
"yusuhara.kochi.jp",
"amakusa.kumamoto.jp",
"arao.kumamoto.jp",
"aso.kumamoto.jp",
"choyo.kumamoto.jp",
"gyokuto.kumamoto.jp",
"kamiamakusa.kumamoto.jp",
"kikuchi.kumamoto.jp",
"kumamoto.kumamoto.jp",
"mashiki.kumamoto.jp",
"mifune.kumamoto.jp",
"minamata.kumamoto.jp",
"minamioguni.kumamoto.jp",
"nagasu.kumamoto.jp",
"nishihara.kumamoto.jp",
"oguni.kumamoto.jp",
"ozu.kumamoto.jp",
"sumoto.kumamoto.jp",
"takamori.kumamoto.jp",
"uki.kumamoto.jp",
"uto.kumamoto.jp",
"yamaga.kumamoto.jp",
"yamato.kumamoto.jp",
"yatsushiro.kumamoto.jp",
"ayabe.kyoto.jp",
"fukuchiyama.kyoto.jp",
"higashiyama.kyoto.jp",
"ide.kyoto.jp",
"ine.kyoto.jp",
"joyo.kyoto.jp",
"kameoka.kyoto.jp",
"kamo.kyoto.jp",
"kita.kyoto.jp",
"kizu.kyoto.jp",
"kumiyama.kyoto.jp",
"kyotamba.kyoto.jp",
"kyotanabe.kyoto.jp",
"kyotango.kyoto.jp",
"maizuru.kyoto.jp",
"minami.kyoto.jp",
"minamiyamashiro.kyoto.jp",
"miyazu.kyoto.jp",
"muko.kyoto.jp",
"nagaokakyo.kyoto.jp",
"nakagyo.kyoto.jp",
"nantan.kyoto.jp",
"oyamazaki.kyoto.jp",
"sakyo.kyoto.jp",
"seika.kyoto.jp",
"tanabe.kyoto.jp",
"uji.kyoto.jp",
"ujitawara.kyoto.jp",
"wazuka.kyoto.jp",
"yamashina.kyoto.jp",
"yawata.kyoto.jp",
"asahi.mie.jp",
"inabe.mie.jp",
"ise.mie.jp",
"kameyama.mie.jp",
"kawagoe.mie.jp",
"kiho.mie.jp",
"kisosaki.mie.jp",
"kiwa.mie.jp",
"komono.mie.jp",
"kumano.mie.jp",
"kuwana.mie.jp",
"matsusaka.mie.jp",
"meiwa.mie.jp",
"mihama.mie.jp",
"minamiise.mie.jp",
"misugi.mie.jp",
"miyama.mie.jp",
"nabari.mie.jp",
"shima.mie.jp",
"suzuka.mie.jp",
"tado.mie.jp",
"taiki.mie.jp",
"taki.mie.jp",
"tamaki.mie.jp",
"toba.mie.jp",
"tsu.mie.jp",
"udono.mie.jp",
"ureshino.mie.jp",
"watarai.mie.jp",
"yokkaichi.mie.jp",
"furukawa.miyagi.jp",
"higashimatsushima.miyagi.jp",
"ishinomaki.miyagi.jp",
"iwanuma.miyagi.jp",
"kakuda.miyagi.jp",
"kami.miyagi.jp",
"kawasaki.miyagi.jp",
"marumori.miyagi.jp",
"matsushima.miyagi.jp",
"minamisanriku.miyagi.jp",
"misato.miyagi.jp",
"murata.miyagi.jp",
"natori.miyagi.jp",
"ogawara.miyagi.jp",
"ohira.miyagi.jp",
"onagawa.miyagi.jp",
"osaki.miyagi.jp",
"rifu.miyagi.jp",
"semine.miyagi.jp",
"shibata.miyagi.jp",
"shichikashuku.miyagi.jp",
"shikama.miyagi.jp",
"shiogama.miyagi.jp",
"shiroishi.miyagi.jp",
"tagajo.miyagi.jp",
"taiwa.miyagi.jp",
"tome.miyagi.jp",
"tomiya.miyagi.jp",
"wakuya.miyagi.jp",
"watari.miyagi.jp",
"yamamoto.miyagi.jp",
"zao.miyagi.jp",
"aya.miyazaki.jp",
"ebino.miyazaki.jp",
"gokase.miyazaki.jp",
"hyuga.miyazaki.jp",
"kadogawa.miyazaki.jp",
"kawaminami.miyazaki.jp",
"kijo.miyazaki.jp",
"kitagawa.miyazaki.jp",
"kitakata.miyazaki.jp",
"kitaura.miyazaki.jp",
"kobayashi.miyazaki.jp",
"kunitomi.miyazaki.jp",
"kushima.miyazaki.jp",
"mimata.miyazaki.jp",
"miyakonojo.miyazaki.jp",
"miyazaki.miyazaki.jp",
"morotsuka.miyazaki.jp",
"nichinan.miyazaki.jp",
"nishimera.miyazaki.jp",
"nobeoka.miyazaki.jp",
"saito.miyazaki.jp",
"shiiba.miyazaki.jp",
"shintomi.miyazaki.jp",
"takaharu.miyazaki.jp",
"takanabe.miyazaki.jp",
"takazaki.miyazaki.jp",
"tsuno.miyazaki.jp",
"achi.nagano.jp",
"agematsu.nagano.jp",
"anan.nagano.jp",
"aoki.nagano.jp",
"asahi.nagano.jp",
"azumino.nagano.jp",
"chikuhoku.nagano.jp",
"chikuma.nagano.jp",
"chino.nagano.jp",
"fujimi.nagano.jp",
"hakuba.nagano.jp",
"hara.nagano.jp",
"hiraya.nagano.jp",
"iida.nagano.jp",
"iijima.nagano.jp",
"iiyama.nagano.jp",
"iizuna.nagano.jp",
"ikeda.nagano.jp",
"ikusaka.nagano.jp",
"ina.nagano.jp",
"karuizawa.nagano.jp",
"kawakami.nagano.jp",
"kiso.nagano.jp",
"kisofukushima.nagano.jp",
"kitaaiki.nagano.jp",
"komagane.nagano.jp",
"komoro.nagano.jp",
"matsukawa.nagano.jp",
"matsumoto.nagano.jp",
"miasa.nagano.jp",
"minamiaiki.nagano.jp",
"minamimaki.nagano.jp",
"minamiminowa.nagano.jp",
"minowa.nagano.jp",
"miyada.nagano.jp",
"miyota.nagano.jp",
"mochizuki.nagano.jp",
"nagano.nagano.jp",
"nagawa.nagano.jp",
"nagiso.nagano.jp",
"nakagawa.nagano.jp",
"nakano.nagano.jp",
"nozawaonsen.nagano.jp",
"obuse.nagano.jp",
"ogawa.nagano.jp",
"okaya.nagano.jp",
"omachi.nagano.jp",
"omi.nagano.jp",
"ookuwa.nagano.jp",
"ooshika.nagano.jp",
"otaki.nagano.jp",
"otari.nagano.jp",
"sakae.nagano.jp",
"sakaki.nagano.jp",
"saku.nagano.jp",
"sakuho.nagano.jp",
"shimosuwa.nagano.jp",
"shinanomachi.nagano.jp",
"shiojiri.nagano.jp",
"suwa.nagano.jp",
"suzaka.nagano.jp",
"takagi.nagano.jp",
"takamori.nagano.jp",
"takayama.nagano.jp",
"tateshina.nagano.jp",
"tatsuno.nagano.jp",
"togakushi.nagano.jp",
"togura.nagano.jp",
"tomi.nagano.jp",
"ueda.nagano.jp",
"wada.nagano.jp",
"yamagata.nagano.jp",
"yamanouchi.nagano.jp",
"yasaka.nagano.jp",
"yasuoka.nagano.jp",
"chijiwa.nagasaki.jp",
"futsu.nagasaki.jp",
"goto.nagasaki.jp",
"hasami.nagasaki.jp",
"hirado.nagasaki.jp",
"iki.nagasaki.jp",
"isahaya.nagasaki.jp",
"kawatana.nagasaki.jp",
"kuchinotsu.nagasaki.jp",
"matsuura.nagasaki.jp",
"nagasaki.nagasaki.jp",
"obama.nagasaki.jp",
"omura.nagasaki.jp",
"oseto.nagasaki.jp",
"saikai.nagasaki.jp",
"sasebo.nagasaki.jp",
"seihi.nagasaki.jp",
"shimabara.nagasaki.jp",
"shinkamigoto.nagasaki.jp",
"togitsu.nagasaki.jp",
"tsushima.nagasaki.jp",
"unzen.nagasaki.jp",
"ando.nara.jp",
"gose.nara.jp",
"heguri.nara.jp",
"higashiyoshino.nara.jp",
"ikaruga.nara.jp",
"ikoma.nara.jp",
"kamikitayama.nara.jp",
"kanmaki.nara.jp",
"kashiba.nara.jp",
"kashihara.nara.jp",
"katsuragi.nara.jp",
"kawai.nara.jp",
"kawakami.nara.jp",
"kawanishi.nara.jp",
"koryo.nara.jp",
"kurotaki.nara.jp",
"mitsue.nara.jp",
"miyake.nara.jp",
"nara.nara.jp",
"nosegawa.nara.jp",
"oji.nara.jp",
"ouda.nara.jp",
"oyodo.nara.jp",
"sakurai.nara.jp",
"sango.nara.jp",
"shimoichi.nara.jp",
"shimokitayama.nara.jp",
"shinjo.nara.jp",
"soni.nara.jp",
"takatori.nara.jp",
"tawaramoto.nara.jp",
"tenkawa.nara.jp",
"tenri.nara.jp",
"uda.nara.jp",
"yamatokoriyama.nara.jp",
"yamatotakada.nara.jp",
"yamazoe.nara.jp",
"yoshino.nara.jp",
"aga.niigata.jp",
"agano.niigata.jp",
"gosen.niigata.jp",
"itoigawa.niigata.jp",
"izumozaki.niigata.jp",
"joetsu.niigata.jp",
"kamo.niigata.jp",
"kariwa.niigata.jp",
"kashiwazaki.niigata.jp",
"minamiuonuma.niigata.jp",
"mitsuke.niigata.jp",
"muika.niigata.jp",
"murakami.niigata.jp",
"myoko.niigata.jp",
"nagaoka.niigata.jp",
"niigata.niigata.jp",
"ojiya.niigata.jp",
"omi.niigata.jp",
"sado.niigata.jp",
"sanjo.niigata.jp",
"seiro.niigata.jp",
"seirou.niigata.jp",
"sekikawa.niigata.jp",
"shibata.niigata.jp",
"tagami.niigata.jp",
"tainai.niigata.jp",
"tochio.niigata.jp",
"tokamachi.niigata.jp",
"tsubame.niigata.jp",
"tsunan.niigata.jp",
"uonuma.niigata.jp",
"yahiko.niigata.jp",
"yoita.niigata.jp",
"yuzawa.niigata.jp",
"beppu.oita.jp",
"bungoono.oita.jp",
"bungotakada.oita.jp",
"hasama.oita.jp",
"hiji.oita.jp",
"himeshima.oita.jp",
"hita.oita.jp",
"kamitsue.oita.jp",
"kokonoe.oita.jp",
"kuju.oita.jp",
"kunisaki.oita.jp",
"kusu.oita.jp",
"oita.oita.jp",
"saiki.oita.jp",
"taketa.oita.jp",
"tsukumi.oita.jp",
"usa.oita.jp",
"usuki.oita.jp",
"yufu.oita.jp",
"akaiwa.okayama.jp",
"asakuchi.okayama.jp",
"bizen.okayama.jp",
"hayashima.okayama.jp",
"ibara.okayama.jp",
"kagamino.okayama.jp",
"kasaoka.okayama.jp",
"kibichuo.okayama.jp",
"kumenan.okayama.jp",
"kurashiki.okayama.jp",
"maniwa.okayama.jp",
"misaki.okayama.jp",
"nagi.okayama.jp",
"niimi.okayama.jp",
"nishiawakura.okayama.jp",
"okayama.okayama.jp",
"satosho.okayama.jp",
"setouchi.okayama.jp",
"shinjo.okayama.jp",
"shoo.okayama.jp",
"soja.okayama.jp",
"takahashi.okayama.jp",
"tamano.okayama.jp",
"tsuyama.okayama.jp",
"wake.okayama.jp",
"yakage.okayama.jp",
"aguni.okinawa.jp",
"ginowan.okinawa.jp",
"ginoza.okinawa.jp",
"gushikami.okinawa.jp",
"haebaru.okinawa.jp",
"higashi.okinawa.jp",
"hirara.okinawa.jp",
"iheya.okinawa.jp",
"ishigaki.okinawa.jp",
"ishikawa.okinawa.jp",
"itoman.okinawa.jp",
"izena.okinawa.jp",
"kadena.okinawa.jp",
"kin.okinawa.jp",
"kitadaito.okinawa.jp",
"kitanakagusuku.okinawa.jp",
"kumejima.okinawa.jp",
"kunigami.okinawa.jp",
"minamidaito.okinawa.jp",
"motobu.okinawa.jp",
"nago.okinawa.jp",
"naha.okinawa.jp",
"nakagusuku.okinawa.jp",
"nakijin.okinawa.jp",
"nanjo.okinawa.jp",
"nishihara.okinawa.jp",
"ogimi.okinawa.jp",
"okinawa.okinawa.jp",
"onna.okinawa.jp",
"shimoji.okinawa.jp",
"taketomi.okinawa.jp",
"tarama.okinawa.jp",
"tokashiki.okinawa.jp",
"tomigusuku.okinawa.jp",
"tonaki.okinawa.jp",
"urasoe.okinawa.jp",
"uruma.okinawa.jp",
"yaese.okinawa.jp",
"yomitan.okinawa.jp",
"yonabaru.okinawa.jp",
"yonaguni.okinawa.jp",
"zamami.okinawa.jp",
"abeno.osaka.jp",
"chihayaakasaka.osaka.jp",
"chuo.osaka.jp",
"daito.osaka.jp",
"fujiidera.osaka.jp",
"habikino.osaka.jp",
"hannan.osaka.jp",
"higashiosaka.osaka.jp",
"higashisumiyoshi.osaka.jp",
"higashiyodogawa.osaka.jp",
"hirakata.osaka.jp",
"ibaraki.osaka.jp",
"ikeda.osaka.jp",
"izumi.osaka.jp",
"izumiotsu.osaka.jp",
"izumisano.osaka.jp",
"kadoma.osaka.jp",
"kaizuka.osaka.jp",
"kanan.osaka.jp",
"kashiwara.osaka.jp",
"katano.osaka.jp",
"kawachinagano.osaka.jp",
"kishiwada.osaka.jp",
"kita.osaka.jp",
"kumatori.osaka.jp",
"matsubara.osaka.jp",
"minato.osaka.jp",
"minoh.osaka.jp",
"misaki.osaka.jp",
"moriguchi.osaka.jp",
"neyagawa.osaka.jp",
"nishi.osaka.jp",
"nose.osaka.jp",
"osakasayama.osaka.jp",
"sakai.osaka.jp",
"sayama.osaka.jp",
"sennan.osaka.jp",
"settsu.osaka.jp",
"shijonawate.osaka.jp",
"shimamoto.osaka.jp",
"suita.osaka.jp",
"tadaoka.osaka.jp",
"taishi.osaka.jp",
"tajiri.osaka.jp",
"takaishi.osaka.jp",
"takatsuki.osaka.jp",
"tondabayashi.osaka.jp",
"toyonaka.osaka.jp",
"toyono.osaka.jp",
"yao.osaka.jp",
"ariake.saga.jp",
"arita.saga.jp",
"fukudomi.saga.jp",
"genkai.saga.jp",
"hamatama.saga.jp",
"hizen.saga.jp",
"imari.saga.jp",
"kamimine.saga.jp",
"kanzaki.saga.jp",
"karatsu.saga.jp",
"kashima.saga.jp",
"kitagata.saga.jp",
"kitahata.saga.jp",
"kiyama.saga.jp",
"kouhoku.saga.jp",
"kyuragi.saga.jp",
"nishiarita.saga.jp",
"ogi.saga.jp",
"omachi.saga.jp",
"ouchi.saga.jp",
"saga.saga.jp",
"shiroishi.saga.jp",
"taku.saga.jp",
"tara.saga.jp",
"tosu.saga.jp",
"yoshinogari.saga.jp",
"arakawa.saitama.jp",
"asaka.saitama.jp",
"chichibu.saitama.jp",
"fujimi.saitama.jp",
"fujimino.saitama.jp",
"fukaya.saitama.jp",
"hanno.saitama.jp",
"hanyu.saitama.jp",
"hasuda.saitama.jp",
"hatogaya.saitama.jp",
"hatoyama.saitama.jp",
"hidaka.saitama.jp",
"higashichichibu.saitama.jp",
"higashimatsuyama.saitama.jp",
"honjo.saitama.jp",
"ina.saitama.jp",
"iruma.saitama.jp",
"iwatsuki.saitama.jp",
"kamiizumi.saitama.jp",
"kamikawa.saitama.jp",
"kamisato.saitama.jp",
"kasukabe.saitama.jp",
"kawagoe.saitama.jp",
"kawaguchi.saitama.jp",
"kawajima.saitama.jp",
"kazo.saitama.jp",
"kitamoto.saitama.jp",
"koshigaya.saitama.jp",
"kounosu.saitama.jp",
"kuki.saitama.jp",
"kumagaya.saitama.jp",
"matsubushi.saitama.jp",
"minano.saitama.jp",
"misato.saitama.jp",
"miyashiro.saitama.jp",
"miyoshi.saitama.jp",
"moroyama.saitama.jp",
"nagatoro.saitama.jp",
"namegawa.saitama.jp",
"niiza.saitama.jp",
"ogano.saitama.jp",
"ogawa.saitama.jp",
"ogose.saitama.jp",
"okegawa.saitama.jp",
"omiya.saitama.jp",
"otaki.saitama.jp",
"ranzan.saitama.jp",
"ryokami.saitama.jp",
"saitama.saitama.jp",
"sakado.saitama.jp",
"satte.saitama.jp",
"sayama.saitama.jp",
"shiki.saitama.jp",
"shiraoka.saitama.jp",
"soka.saitama.jp",
"sugito.saitama.jp",
"toda.saitama.jp",
"tokigawa.saitama.jp",
"tokorozawa.saitama.jp",
"tsurugashima.saitama.jp",
"urawa.saitama.jp",
"warabi.saitama.jp",
"yashio.saitama.jp",
"yokoze.saitama.jp",
"yono.saitama.jp",
"yorii.saitama.jp",
"yoshida.saitama.jp",
"yoshikawa.saitama.jp",
"yoshimi.saitama.jp",
"aisho.shiga.jp",
"gamo.shiga.jp",
"higashiomi.shiga.jp",
"hikone.shiga.jp",
"koka.shiga.jp",
"konan.shiga.jp",
"kosei.shiga.jp",
"koto.shiga.jp",
"kusatsu.shiga.jp",
"maibara.shiga.jp",
"moriyama.shiga.jp",
"nagahama.shiga.jp",
"nishiazai.shiga.jp",
"notogawa.shiga.jp",
"omihachiman.shiga.jp",
"otsu.shiga.jp",
"ritto.shiga.jp",
"ryuoh.shiga.jp",
"takashima.shiga.jp",
"takatsuki.shiga.jp",
"torahime.shiga.jp",
"toyosato.shiga.jp",
"yasu.shiga.jp",
"akagi.shimane.jp",
"ama.shimane.jp",
"gotsu.shimane.jp",
"hamada.shimane.jp",
"higashiizumo.shimane.jp",
"hikawa.shimane.jp",
"hikimi.shimane.jp",
"izumo.shimane.jp",
"kakinoki.shimane.jp",
"masuda.shimane.jp",
"matsue.shimane.jp",
"misato.shimane.jp",
"nishinoshima.shimane.jp",
"ohda.shimane.jp",
"okinoshima.shimane.jp",
"okuizumo.shimane.jp",
"shimane.shimane.jp",
"tamayu.shimane.jp",
"tsuwano.shimane.jp",
"unnan.shimane.jp",
"yakumo.shimane.jp",
"yasugi.shimane.jp",
"yatsuka.shimane.jp",
"arai.shizuoka.jp",
"atami.shizuoka.jp",
"fuji.shizuoka.jp",
"fujieda.shizuoka.jp",
"fujikawa.shizuoka.jp",
"fujinomiya.shizuoka.jp",
"fukuroi.shizuoka.jp",
"gotemba.shizuoka.jp",
"haibara.shizuoka.jp",
"hamamatsu.shizuoka.jp",
"higashiizu.shizuoka.jp",
"ito.shizuoka.jp",
"iwata.shizuoka.jp",
"izu.shizuoka.jp",
"izunokuni.shizuoka.jp",
"kakegawa.shizuoka.jp",
"kannami.shizuoka.jp",
"kawanehon.shizuoka.jp",
"kawazu.shizuoka.jp",
"kikugawa.shizuoka.jp",
"kosai.shizuoka.jp",
"makinohara.shizuoka.jp",
"matsuzaki.shizuoka.jp",
"minamiizu.shizuoka.jp",
"mishima.shizuoka.jp",
"morimachi.shizuoka.jp",
"nishiizu.shizuoka.jp",
"numazu.shizuoka.jp",
"omaezaki.shizuoka.jp",
"shimada.shizuoka.jp",
"shimizu.shizuoka.jp",
"shimoda.shizuoka.jp",
"shizuoka.shizuoka.jp",
"susono.shizuoka.jp",
"yaizu.shizuoka.jp",
"yoshida.shizuoka.jp",
"ashikaga.tochigi.jp",
"bato.tochigi.jp",
"haga.tochigi.jp",
"ichikai.tochigi.jp",
"iwafune.tochigi.jp",
"kaminokawa.tochigi.jp",
"kanuma.tochigi.jp",
"karasuyama.tochigi.jp",
"kuroiso.tochigi.jp",
"mashiko.tochigi.jp",
"mibu.tochigi.jp",
"moka.tochigi.jp",
"motegi.tochigi.jp",
"nasu.tochigi.jp",
"nasushiobara.tochigi.jp",
"nikko.tochigi.jp",
"nishikata.tochigi.jp",
"nogi.tochigi.jp",
"ohira.tochigi.jp",
"ohtawara.tochigi.jp",
"oyama.tochigi.jp",
"sakura.tochigi.jp",
"sano.tochigi.jp",
"shimotsuke.tochigi.jp",
"shioya.tochigi.jp",
"takanezawa.tochigi.jp",
"tochigi.tochigi.jp",
"tsuga.tochigi.jp",
"ujiie.tochigi.jp",
"utsunomiya.tochigi.jp",
"yaita.tochigi.jp",
"aizumi.tokushima.jp",
"anan.tokushima.jp",
"ichiba.tokushima.jp",
"itano.tokushima.jp",
"kainan.tokushima.jp",
"komatsushima.tokushima.jp",
"matsushige.tokushima.jp",
"mima.tokushima.jp",
"minami.tokushima.jp",
"miyoshi.tokushima.jp",
"mugi.tokushima.jp",
"nakagawa.tokushima.jp",
"naruto.tokushima.jp",
"sanagochi.tokushima.jp",
"shishikui.tokushima.jp",
"tokushima.tokushima.jp",
"wajiki.tokushima.jp",
"adachi.tokyo.jp",
"akiruno.tokyo.jp",
"akishima.tokyo.jp",
"aogashima.tokyo.jp",
"arakawa.tokyo.jp",
"bunkyo.tokyo.jp",
"chiyoda.tokyo.jp",
"chofu.tokyo.jp",
"chuo.tokyo.jp",
"edogawa.tokyo.jp",
"fuchu.tokyo.jp",
"fussa.tokyo.jp",
"hachijo.tokyo.jp",
"hachioji.tokyo.jp",
"hamura.tokyo.jp",
"higashikurume.tokyo.jp",
"higashimurayama.tokyo.jp",
"higashiyamato.tokyo.jp",
"hino.tokyo.jp",
"hinode.tokyo.jp",
"hinohara.tokyo.jp",
"inagi.tokyo.jp",
"itabashi.tokyo.jp",
"katsushika.tokyo.jp",
"kita.tokyo.jp",
"kiyose.tokyo.jp",
"kodaira.tokyo.jp",
"koganei.tokyo.jp",
"kokubunji.tokyo.jp",
"komae.tokyo.jp",
"koto.tokyo.jp",
"kouzushima.tokyo.jp",
"kunitachi.tokyo.jp",
"machida.tokyo.jp",
"meguro.tokyo.jp",
"minato.tokyo.jp",
"mitaka.tokyo.jp",
"mizuho.tokyo.jp",
"musashimurayama.tokyo.jp",
"musashino.tokyo.jp",
"nakano.tokyo.jp",
"nerima.tokyo.jp",
"ogasawara.tokyo.jp",
"okutama.tokyo.jp",
"ome.tokyo.jp",
"oshima.tokyo.jp",
"ota.tokyo.jp",
"setagaya.tokyo.jp",
"shibuya.tokyo.jp",
"shinagawa.tokyo.jp",
"shinjuku.tokyo.jp",
"suginami.tokyo.jp",
"sumida.tokyo.jp",
"tachikawa.tokyo.jp",
"taito.tokyo.jp",
"tama.tokyo.jp",
"toshima.tokyo.jp",
"chizu.tottori.jp",
"hino.tottori.jp",
"kawahara.tottori.jp",
"koge.tottori.jp",
"kotoura.tottori.jp",
"misasa.tottori.jp",
"nanbu.tottori.jp",
"nichinan.tottori.jp",
"sakaiminato.tottori.jp",
"tottori.tottori.jp",
"wakasa.tottori.jp",
"yazu.tottori.jp",
"yonago.tottori.jp",
"asahi.toyama.jp",
"fuchu.toyama.jp",
"fukumitsu.toyama.jp",
"funahashi.toyama.jp",
"himi.toyama.jp",
"imizu.toyama.jp",
"inami.toyama.jp",
"johana.toyama.jp",
"kamiichi.toyama.jp",
"kurobe.toyama.jp",
"nakaniikawa.toyama.jp",
"namerikawa.toyama.jp",
"nanto.toyama.jp",
"nyuzen.toyama.jp",
"oyabe.toyama.jp",
"taira.toyama.jp",
"takaoka.toyama.jp",
"tateyama.toyama.jp",
"toga.toyama.jp",
"tonami.toyama.jp",
"toyama.toyama.jp",
"unazuki.toyama.jp",
"uozu.toyama.jp",
"yamada.toyama.jp",
"arida.wakayama.jp",
"aridagawa.wakayama.jp",
"gobo.wakayama.jp",
"hashimoto.wakayama.jp",
"hidaka.wakayama.jp",
"hirogawa.wakayama.jp",
"inami.wakayama.jp",
"iwade.wakayama.jp",
"kainan.wakayama.jp",
"kamitonda.wakayama.jp",
"katsuragi.wakayama.jp",
"kimino.wakayama.jp",
"kinokawa.wakayama.jp",
"kitayama.wakayama.jp",
"koya.wakayama.jp",
"koza.wakayama.jp",
"kozagawa.wakayama.jp",
"kudoyama.wakayama.jp",
"kushimoto.wakayama.jp",
"mihama.wakayama.jp",
"misato.wakayama.jp",
"nachikatsuura.wakayama.jp",
"shingu.wakayama.jp",
"shirahama.wakayama.jp",
"taiji.wakayama.jp",
"tanabe.wakayama.jp",
"wakayama.wakayama.jp",
"yuasa.wakayama.jp",
"yura.wakayama.jp",
"asahi.yamagata.jp",
"funagata.yamagata.jp",
"higashine.yamagata.jp",
"iide.yamagata.jp",
"kahoku.yamagata.jp",
"kaminoyama.yamagata.jp",
"kaneyama.yamagata.jp",
"kawanishi.yamagata.jp",
"mamurogawa.yamagata.jp",
"mikawa.yamagata.jp",
"murayama.yamagata.jp",
"nagai.yamagata.jp",
"nakayama.yamagata.jp",
"nanyo.yamagata.jp",
"nishikawa.yamagata.jp",
"obanazawa.yamagata.jp",
"oe.yamagata.jp",
"oguni.yamagata.jp",
"ohkura.yamagata.jp",
"oishida.yamagata.jp",
"sagae.yamagata.jp",
"sakata.yamagata.jp",
"sakegawa.yamagata.jp",
"shinjo.yamagata.jp",
"shirataka.yamagata.jp",
"shonai.yamagata.jp",
"takahata.yamagata.jp",
"tendo.yamagata.jp",
"tozawa.yamagata.jp",
"tsuruoka.yamagata.jp",
"yamagata.yamagata.jp",
"yamanobe.yamagata.jp",
"yonezawa.yamagata.jp",
"yuza.yamagata.jp",
"abu.yamaguchi.jp",
"hagi.yamaguchi.jp",
"hikari.yamaguchi.jp",
"hofu.yamaguchi.jp",
"iwakuni.yamaguchi.jp",
"kudamatsu.yamaguchi.jp",
"mitou.yamaguchi.jp",
"nagato.yamaguchi.jp",
"oshima.yamaguchi.jp",
"shimonoseki.yamaguchi.jp",
"shunan.yamaguchi.jp",
"tabuse.yamaguchi.jp",
"tokuyama.yamaguchi.jp",
"toyota.yamaguchi.jp",
"ube.yamaguchi.jp",
"yuu.yamaguchi.jp",
"chuo.yamanashi.jp",
"doshi.yamanashi.jp",
"fuefuki.yamanashi.jp",
"fujikawa.yamanashi.jp",
"fujikawaguchiko.yamanashi.jp",
"fujiyoshida.yamanashi.jp",
"hayakawa.yamanashi.jp",
"hokuto.yamanashi.jp",
"ichikawamisato.yamanashi.jp",
"kai.yamanashi.jp",
"kofu.yamanashi.jp",
"koshu.yamanashi.jp",
"kosuge.yamanashi.jp",
"minami-alps.yamanashi.jp",
"minobu.yamanashi.jp",
"nakamichi.yamanashi.jp",
"nanbu.yamanashi.jp",
"narusawa.yamanashi.jp",
"nirasaki.yamanashi.jp",
"nishikatsura.yamanashi.jp",
"oshino.yamanashi.jp",
"otsuki.yamanashi.jp",
"showa.yamanashi.jp",
"tabayama.yamanashi.jp",
"tsuru.yamanashi.jp",
"uenohara.yamanashi.jp",
"yamanakako.yamanashi.jp",
"yamanashi.yamanashi.jp",
"ke",
"ac.ke",
"co.ke",
"go.ke",
"info.ke",
"me.ke",
"mobi.ke",
"ne.ke",
"or.ke",
"sc.ke",
"kg",
"org.kg",
"net.kg",
"com.kg",
"edu.kg",
"gov.kg",
"mil.kg",
"*.kh",
"ki",
"edu.ki",
"biz.ki",
"net.ki",
"org.ki",
"gov.ki",
"info.ki",
"com.ki",
"km",
"org.km",
"nom.km",
"gov.km",
"prd.km",
"tm.km",
"edu.km",
"mil.km",
"ass.km",
"com.km",
"coop.km",
"asso.km",
"presse.km",
"medecin.km",
"notaires.km",
"pharmaciens.km",
"veterinaire.km",
"gouv.km",
"kn",
"net.kn",
"org.kn",
"edu.kn",
"gov.kn",
"kp",
"com.kp",
"edu.kp",
"gov.kp",
"org.kp",
"rep.kp",
"tra.kp",
"kr",
"ac.kr",
"co.kr",
"es.kr",
"go.kr",
"hs.kr",
"kg.kr",
"mil.kr",
"ms.kr",
"ne.kr",
"or.kr",
"pe.kr",
"re.kr",
"sc.kr",
"busan.kr",
"chungbuk.kr",
"chungnam.kr",
"daegu.kr",
"daejeon.kr",
"gangwon.kr",
"gwangju.kr",
"gyeongbuk.kr",
"gyeonggi.kr",
"gyeongnam.kr",
"incheon.kr",
"jeju.kr",
"jeonbuk.kr",
"jeonnam.kr",
"seoul.kr",
"ulsan.kr",
"kw",
"com.kw",
"edu.kw",
"emb.kw",
"gov.kw",
"ind.kw",
"net.kw",
"org.kw",
"ky",
"edu.ky",
"gov.ky",
"com.ky",
"org.ky",
"net.ky",
"kz",
"org.kz",
"edu.kz",
"net.kz",
"gov.kz",
"mil.kz",
"com.kz",
"la",
"int.la",
"net.la",
"info.la",
"edu.la",
"gov.la",
"per.la",
"com.la",
"org.la",
"lb",
"com.lb",
"edu.lb",
"gov.lb",
"net.lb",
"org.lb",
"lc",
"com.lc",
"net.lc",
"co.lc",
"org.lc",
"edu.lc",
"gov.lc",
"li",
"lk",
"gov.lk",
"sch.lk",
"net.lk",
"int.lk",
"com.lk",
"org.lk",
"edu.lk",
"ngo.lk",
"soc.lk",
"web.lk",
"ltd.lk",
"assn.lk",
"grp.lk",
"hotel.lk",
"ac.lk",
"lr",
"com.lr",
"edu.lr",
"gov.lr",
"org.lr",
"net.lr",
"ls",
"ac.ls",
"biz.ls",
"co.ls",
"edu.ls",
"gov.ls",
"info.ls",
"net.ls",
"org.ls",
"sc.ls",
"lt",
"gov.lt",
"lu",
"lv",
"com.lv",
"edu.lv",
"gov.lv",
"org.lv",
"mil.lv",
"id.lv",
"net.lv",
"asn.lv",
"conf.lv",
"ly",
"com.ly",
"net.ly",
"gov.ly",
"plc.ly",
"edu.ly",
"sch.ly",
"med.ly",
"org.ly",
"id.ly",
"ma",
"co.ma",
"net.ma",
"gov.ma",
"org.ma",
"ac.ma",
"press.ma",
"mc",
"tm.mc",
"asso.mc",
"md",
"me",
"co.me",
"net.me",
"org.me",
"edu.me",
"ac.me",
"gov.me",
"its.me",
"priv.me",
"mg",
"org.mg",
"nom.mg",
"gov.mg",
"prd.mg",
"tm.mg",
"edu.mg",
"mil.mg",
"com.mg",
"co.mg",
"mh",
"mil",
"mk",
"com.mk",
"org.mk",
"net.mk",
"edu.mk",
"gov.mk",
"inf.mk",
"name.mk",
"ml",
"com.ml",
"edu.ml",
"gouv.ml",
"gov.ml",
"net.ml",
"org.ml",
"presse.ml",
"*.mm",
"mn",
"gov.mn",
"edu.mn",
"org.mn",
"mo",
"com.mo",
"net.mo",
"org.mo",
"edu.mo",
"gov.mo",
"mobi",
"mp",
"mq",
"mr",
"gov.mr",
"ms",
"com.ms",
"edu.ms",
"gov.ms",
"net.ms",
"org.ms",
"mt",
"com.mt",
"edu.mt",
"net.mt",
"org.mt",
"mu",
"com.mu",
"net.mu",
"org.mu",
"gov.mu",
"ac.mu",
"co.mu",
"or.mu",
"museum",
"academy.museum",
"agriculture.museum",
"air.museum",
"airguard.museum",
"alabama.museum",
"alaska.museum",
"amber.museum",
"ambulance.museum",
"american.museum",
"americana.museum",
"americanantiques.museum",
"americanart.museum",
"amsterdam.museum",
"and.museum",
"annefrank.museum",
"anthro.museum",
"anthropology.museum",
"antiques.museum",
"aquarium.museum",
"arboretum.museum",
"archaeological.museum",
"archaeology.museum",
"architecture.museum",
"art.museum",
"artanddesign.museum",
"artcenter.museum",
"artdeco.museum",
"arteducation.museum",
"artgallery.museum",
"arts.museum",
"artsandcrafts.museum",
"asmatart.museum",
"assassination.museum",
"assisi.museum",
"association.museum",
"astronomy.museum",
"atlanta.museum",
"austin.museum",
"australia.museum",
"automotive.museum",
"aviation.museum",
"axis.museum",
"badajoz.museum",
"baghdad.museum",
"bahn.museum",
"bale.museum",
"baltimore.museum",
"barcelona.museum",
"baseball.museum",
"basel.museum",
"baths.museum",
"bauern.museum",
"beauxarts.museum",
"beeldengeluid.museum",
"bellevue.museum",
"bergbau.museum",
"berkeley.museum",
"berlin.museum",
"bern.museum",
"bible.museum",
"bilbao.museum",
"bill.museum",
"birdart.museum",
"birthplace.museum",
"bonn.museum",
"boston.museum",
"botanical.museum",
"botanicalgarden.museum",
"botanicgarden.museum",
"botany.museum",
"brandywinevalley.museum",
"brasil.museum",
"bristol.museum",
"british.museum",
"britishcolumbia.museum",
"broadcast.museum",
"brunel.museum",
"brussel.museum",
"brussels.museum",
"bruxelles.museum",
"building.museum",
"burghof.museum",
"bus.museum",
"bushey.museum",
"cadaques.museum",
"california.museum",
"cambridge.museum",
"can.museum",
"canada.museum",
"capebreton.museum",
"carrier.museum",
"cartoonart.museum",
"casadelamoneda.museum",
"castle.museum",
"castres.museum",
"celtic.museum",
"center.museum",
"chattanooga.museum",
"cheltenham.museum",
"chesapeakebay.museum",
"chicago.museum",
"children.museum",
"childrens.museum",
"childrensgarden.museum",
"chiropractic.museum",
"chocolate.museum",
"christiansburg.museum",
"cincinnati.museum",
"cinema.museum",
"circus.museum",
"civilisation.museum",
"civilization.museum",
"civilwar.museum",
"clinton.museum",
"clock.museum",
"coal.museum",
"coastaldefence.museum",
"cody.museum",
"coldwar.museum",
"collection.museum",
"colonialwilliamsburg.museum",
"coloradoplateau.museum",
"columbia.museum",
"columbus.museum",
"communication.museum",
"communications.museum",
"community.museum",
"computer.museum",
"computerhistory.museum",
"comunicaÃ§Ãµes.museum",
"contemporary.museum",
"contemporaryart.museum",
"convent.museum",
"copenhagen.museum",
"corporation.museum",
"correios-e-telecomunicaÃ§Ãµes.museum",
"corvette.museum",
"costume.museum",
"countryestate.museum",
"county.museum",
"crafts.museum",
"cranbrook.museum",
"creation.museum",
"cultural.museum",
"culturalcenter.museum",
"culture.museum",
"cyber.museum",
"cymru.museum",
"dali.museum",
"dallas.museum",
"database.museum",
"ddr.museum",
"decorativearts.museum",
"delaware.museum",
"delmenhorst.museum",
"denmark.museum",
"depot.museum",
"design.museum",
"detroit.museum",
"dinosaur.museum",
"discovery.museum",
"dolls.museum",
"donostia.museum",
"durham.museum",
"eastafrica.museum",
"eastcoast.museum",
"education.museum",
"educational.museum",
"egyptian.museum",
"eisenbahn.museum",
"elburg.museum",
"elvendrell.museum",
"embroidery.museum",
"encyclopedic.museum",
"england.museum",
"entomology.museum",
"environment.museum",
"environmentalconservation.museum",
"epilepsy.museum",
"essex.museum",
"estate.museum",
"ethnology.museum",
"exeter.museum",
"exhibition.museum",
"family.museum",
"farm.museum",
"farmequipment.museum",
"farmers.museum",
"farmstead.museum",
"field.museum",
"figueres.museum",
"filatelia.museum",
"film.museum",
"fineart.museum",
"finearts.museum",
"finland.museum",
"flanders.museum",
"florida.museum",
"force.museum",
"fortmissoula.museum",
"fortworth.museum",
"foundation.museum",
"francaise.museum",
"frankfurt.museum",
"franziskaner.museum",
"freemasonry.museum",
"freiburg.museum",
"fribourg.museum",
"frog.museum",
"fundacio.museum",
"furniture.museum",
"gallery.museum",
"garden.museum",
"gateway.museum",
"geelvinck.museum",
"gemological.museum",
"geology.museum",
"georgia.museum",
"giessen.museum",
"glas.museum",
"glass.museum",
"gorge.museum",
"grandrapids.museum",
"graz.museum",
"guernsey.museum",
"halloffame.museum",
"hamburg.museum",
"handson.museum",
"harvestcelebration.museum",
"hawaii.museum",
"health.museum",
"heimatunduhren.museum",
"hellas.museum",
"helsinki.museum",
"hembygdsforbund.museum",
"heritage.museum",
"histoire.museum",
"historical.museum",
"historicalsociety.museum",
"historichouses.museum",
"historisch.museum",
"historisches.museum",
"history.museum",
"historyofscience.museum",
"horology.museum",
"house.museum",
"humanities.museum",
"illustration.museum",
"imageandsound.museum",
"indian.museum",
"indiana.museum",
"indianapolis.museum",
"indianmarket.museum",
"intelligence.museum",
"interactive.museum",
"iraq.museum",
"iron.museum",
"isleofman.museum",
"jamison.museum",
"jefferson.museum",
"jerusalem.museum",
"jewelry.museum",
"jewish.museum",
"jewishart.museum",
"jfk.museum",
"journalism.museum",
"judaica.museum",
"judygarland.museum",
"juedisches.museum",
"juif.museum",
"karate.museum",
"karikatur.museum",
"kids.museum",
"koebenhavn.museum",
"koeln.museum",
"kunst.museum",
"kunstsammlung.museum",
"kunstunddesign.museum",
"labor.museum",
"labour.museum",
"lajolla.museum",
"lancashire.museum",
"landes.museum",
"lans.museum",
"lÃ¤ns.museum",
"larsson.museum",
"lewismiller.museum",
"lincoln.museum",
"linz.museum",
"living.museum",
"livinghistory.museum",
"localhistory.museum",
"london.museum",
"losangeles.museum",
"louvre.museum",
"loyalist.museum",
"lucerne.museum",
"luxembourg.museum",
"luzern.museum",
"mad.museum",
"madrid.museum",
"mallorca.museum",
"manchester.museum",
"mansion.museum",
"mansions.museum",
"manx.museum",
"marburg.museum",
"maritime.museum",
"maritimo.museum",
"maryland.museum",
"marylhurst.museum",
"media.museum",
"medical.museum",
"medizinhistorisches.museum",
"meeres.museum",
"memorial.museum",
"mesaverde.museum",
"michigan.museum",
"midatlantic.museum",
"military.museum",
"mill.museum",
"miners.museum",
"mining.museum",
"minnesota.museum",
"missile.museum",
"missoula.museum",
"modern.museum",
"moma.museum",
"money.museum",
"monmouth.museum",
"monticello.museum",
"montreal.museum",
"moscow.museum",
"motorcycle.museum",
"muenchen.museum",
"muenster.museum",
"mulhouse.museum",
"muncie.museum",
"museet.museum",
"museumcenter.museum",
"museumvereniging.museum",
"music.museum",
"national.museum",
"nationalfirearms.museum",
"nationalheritage.museum",
"nativeamerican.museum",
"naturalhistory.museum",
"naturalhistorymuseum.museum",
"naturalsciences.museum",
"nature.museum",
"naturhistorisches.museum",
"natuurwetenschappen.museum",
"naumburg.museum",
"naval.museum",
"nebraska.museum",
"neues.museum",
"newhampshire.museum",
"newjersey.museum",
"newmexico.museum",
"newport.museum",
"newspaper.museum",
"newyork.museum",
"niepce.museum",
"norfolk.museum",
"north.museum",
"nrw.museum",
"nyc.museum",
"nyny.museum",
"oceanographic.museum",
"oceanographique.museum",
"omaha.museum",
"online.museum",
"ontario.museum",
"openair.museum",
"oregon.museum",
"oregontrail.museum",
"otago.museum",
"oxford.museum",
"pacific.museum",
"paderborn.museum",
"palace.museum",
"paleo.museum",
"palmsprings.museum",
"panama.museum",
"paris.museum",
"pasadena.museum",
"pharmacy.museum",
"philadelphia.museum",
"philadelphiaarea.museum",
"philately.museum",
"phoenix.museum",
"photography.museum",
"pilots.museum",
"pittsburgh.museum",
"planetarium.museum",
"plantation.museum",
"plants.museum",
"plaza.museum",
"portal.museum",
"portland.museum",
"portlligat.museum",
"posts-and-telecommunications.museum",
"preservation.museum",
"presidio.museum",
"press.museum",
"project.museum",
"public.museum",
"pubol.museum",
"quebec.museum",
"railroad.museum",
"railway.museum",
"research.museum",
"resistance.museum",
"riodejaneiro.museum",
"rochester.museum",
"rockart.museum",
"roma.museum",
"russia.museum",
"saintlouis.museum",
"salem.museum",
"salvadordali.museum",
"salzburg.museum",
"sandiego.museum",
"sanfrancisco.museum",
"santabarbara.museum",
"santacruz.museum",
"santafe.museum",
"saskatchewan.museum",
"satx.museum",
"savannahga.museum",
"schlesisches.museum",
"schoenbrunn.museum",
"schokoladen.museum",
"school.museum",
"schweiz.museum",
"science.museum",
"scienceandhistory.museum",
"scienceandindustry.museum",
"sciencecenter.museum",
"sciencecenters.museum",
"science-fiction.museum",
"sciencehistory.museum",
"sciences.museum",
"sciencesnaturelles.museum",
"scotland.museum",
"seaport.museum",
"settlement.museum",
"settlers.museum",
"shell.museum",
"sherbrooke.museum",
"sibenik.museum",
"silk.museum",
"ski.museum",
"skole.museum",
"society.museum",
"sologne.museum",
"soundandvision.museum",
"southcarolina.museum",
"southwest.museum",
"space.museum",
"spy.museum",
"square.museum",
"stadt.museum",
"stalbans.museum",
"starnberg.museum",
"state.museum",
"stateofdelaware.museum",
"station.museum",
"steam.museum",
"steiermark.museum",
"stjohn.museum",
"stockholm.museum",
"stpetersburg.museum",
"stuttgart.museum",
"suisse.museum",
"surgeonshall.museum",
"surrey.museum",
"svizzera.museum",
"sweden.museum",
"sydney.museum",
"tank.museum",
"tcm.museum",
"technology.museum",
"telekommunikation.museum",
"television.museum",
"texas.museum",
"textile.museum",
"theater.museum",
"time.museum",
"timekeeping.museum",
"topology.museum",
"torino.museum",
"touch.museum",
"town.museum",
"transport.museum",
"tree.museum",
"trolley.museum",
"trust.museum",
"trustee.museum",
"uhren.museum",
"ulm.museum",
"undersea.museum",
"university.museum",
"usa.museum",
"usantiques.museum",
"usarts.museum",
"uscountryestate.museum",
"usculture.museum",
"usdecorativearts.museum",
"usgarden.museum",
"ushistory.museum",
"ushuaia.museum",
"uslivinghistory.museum",
"utah.museum",
"uvic.museum",
"valley.museum",
"vantaa.museum",
"versailles.museum",
"viking.museum",
"village.museum",
"virginia.museum",
"virtual.museum",
"virtuel.museum",
"vlaanderen.museum",
"volkenkunde.museum",
"wales.museum",
"wallonie.museum",
"war.museum",
"washingtondc.museum",
"watchandclock.museum",
"watch-and-clock.museum",
"western.museum",
"westfalen.museum",
"whaling.museum",
"wildlife.museum",
"williamsburg.museum",
"windmill.museum",
"workshop.museum",
"york.museum",
"yorkshire.museum",
"yosemite.museum",
"youth.museum",
"zoological.museum",
"zoology.museum",
"×™×¨×•×©×œ×™×�.museum",
"Ð¸ÐºÐ¾Ð¼.museum",
"mv",
"aero.mv",
"biz.mv",
"com.mv",
"coop.mv",
"edu.mv",
"gov.mv",
"info.mv",
"int.mv",
"mil.mv",
"museum.mv",
"name.mv",
"net.mv",
"org.mv",
"pro.mv",
"mw",
"ac.mw",
"biz.mw",
"co.mw",
"com.mw",
"coop.mw",
"edu.mw",
"gov.mw",
"int.mw",
"museum.mw",
"net.mw",
"org.mw",
"mx",
"com.mx",
"org.mx",
"gob.mx",
"edu.mx",
"net.mx",
"my",
"com.my",
"net.my",
"org.my",
"gov.my",
"edu.my",
"mil.my",
"name.my",
"mz",
"ac.mz",
"adv.mz",
"co.mz",
"edu.mz",
"gov.mz",
"mil.mz",
"net.mz",
"org.mz",
"na",
"info.na",
"pro.na",
"name.na",
"school.na",
"or.na",
"dr.na",
"us.na",
"mx.na",
"ca.na",
"in.na",
"cc.na",
"tv.na",
"ws.na",
"mobi.na",
"co.na",
"com.na",
"org.na",
"name",
"nc",
"asso.nc",
"nom.nc",
"ne",
"net",
"nf",
"com.nf",
"net.nf",
"per.nf",
"rec.nf",
"web.nf",
"arts.nf",
"firm.nf",
"info.nf",
"other.nf",
"store.nf",
"ng",
"com.ng",
"edu.ng",
"gov.ng",
"i.ng",
"mil.ng",
"mobi.ng",
"name.ng",
"net.ng",
"org.ng",
"sch.ng",
"ni",
"ac.ni",
"biz.ni",
"co.ni",
"com.ni",
"edu.ni",
"gob.ni",
"in.ni",
"info.ni",
"int.ni",
"mil.ni",
"net.ni",
"nom.ni",
"org.ni",
"web.ni",
"nl",
"no",
"fhs.no",
"vgs.no",
"fylkesbibl.no",
"folkebibl.no",
"museum.no",
"idrett.no",
"priv.no",
"mil.no",
"stat.no",
"dep.no",
"kommune.no",
"herad.no",
"aa.no",
"ah.no",
"bu.no",
"fm.no",
"hl.no",
"hm.no",
"jan-mayen.no",
"mr.no",
"nl.no",
"nt.no",
"of.no",
"ol.no",
"oslo.no",
"rl.no",
"sf.no",
"st.no",
"svalbard.no",
"tm.no",
"tr.no",
"va.no",
"vf.no",
"gs.aa.no",
"gs.ah.no",
"gs.bu.no",
"gs.fm.no",
"gs.hl.no",
"gs.hm.no",
"gs.jan-mayen.no",
"gs.mr.no",
"gs.nl.no",
"gs.nt.no",
"gs.of.no",
"gs.ol.no",
"gs.oslo.no",
"gs.rl.no",
"gs.sf.no",
"gs.st.no",
"gs.svalbard.no",
"gs.tm.no",
"gs.tr.no",
"gs.va.no",
"gs.vf.no",
"akrehamn.no",
"Ã¥krehamn.no",
"algard.no",
"Ã¥lgÃ¥rd.no",
"arna.no",
"brumunddal.no",
"bryne.no",
"bronnoysund.no",
"brÃ¸nnÃ¸ysund.no",
"drobak.no",
"drÃ¸bak.no",
"egersund.no",
"fetsund.no",
"floro.no",
"florÃ¸.no",
"fredrikstad.no",
"hokksund.no",
"honefoss.no",
"hÃ¸nefoss.no",
"jessheim.no",
"jorpeland.no",
"jÃ¸rpeland.no",
"kirkenes.no",
"kopervik.no",
"krokstadelva.no",
"langevag.no",
"langevÃ¥g.no",
"leirvik.no",
"mjondalen.no",
"mjÃ¸ndalen.no",
"mo-i-rana.no",
"mosjoen.no",
"mosjÃ¸en.no",
"nesoddtangen.no",
"orkanger.no",
"osoyro.no",
"osÃ¸yro.no",
"raholt.no",
"rÃ¥holt.no",
"sandnessjoen.no",
"sandnessjÃ¸en.no",
"skedsmokorset.no",
"slattum.no",
"spjelkavik.no",
"stathelle.no",
"stavern.no",
"stjordalshalsen.no",
"stjÃ¸rdalshalsen.no",
"tananger.no",
"tranby.no",
"vossevangen.no",
"afjord.no",
"Ã¥fjord.no",
"agdenes.no",
"al.no",
"Ã¥l.no",
"alesund.no",
"Ã¥lesund.no",
"alstahaug.no",
"alta.no",
"Ã¡ltÃ¡.no",
"alaheadju.no",
"Ã¡laheadju.no",
"alvdal.no",
"amli.no",
"Ã¥mli.no",
"amot.no",
"Ã¥mot.no",
"andebu.no",
"andoy.no",
"andÃ¸y.no",
"andasuolo.no",
"ardal.no",
"Ã¥rdal.no",
"aremark.no",
"arendal.no",
"Ã¥s.no",
"aseral.no",
"Ã¥seral.no",
"asker.no",
"askim.no",
"askvoll.no",
"askoy.no",
"askÃ¸y.no",
"asnes.no",
"Ã¥snes.no",
"audnedaln.no",
"aukra.no",
"aure.no",
"aurland.no",
"aurskog-holand.no",
"aurskog-hÃ¸land.no",
"austevoll.no",
"austrheim.no",
"averoy.no",
"averÃ¸y.no",
"balestrand.no",
"ballangen.no",
"balat.no",
"bÃ¡lÃ¡t.no",
"balsfjord.no",
"bahccavuotna.no",
"bÃ¡hccavuotna.no",
"bamble.no",
"bardu.no",
"beardu.no",
"beiarn.no",
"bajddar.no",
"bÃ¡jddar.no",
"baidar.no",
"bÃ¡idÃ¡r.no",
"berg.no",
"bergen.no",
"berlevag.no",
"berlevÃ¥g.no",
"bearalvahki.no",
"bearalvÃ¡hki.no",
"bindal.no",
"birkenes.no",
"bjarkoy.no",
"bjarkÃ¸y.no",
"bjerkreim.no",
"bjugn.no",
"bodo.no",
"bodÃ¸.no",
"badaddja.no",
"bÃ¥dÃ¥ddjÃ¥.no",
"budejju.no",
"bokn.no",
"bremanger.no",
"bronnoy.no",
"brÃ¸nnÃ¸y.no",
"bygland.no",
"bykle.no",
"barum.no",
"bÃ¦rum.no",
"bo.telemark.no",
"bÃ¸.telemark.no",
"bo.nordland.no",
"bÃ¸.nordland.no",
"bievat.no",
"bievÃ¡t.no",
"bomlo.no",
"bÃ¸mlo.no",
"batsfjord.no",
"bÃ¥tsfjord.no",
"bahcavuotna.no",
"bÃ¡hcavuotna.no",
"dovre.no",
"drammen.no",
"drangedal.no",
"dyroy.no",
"dyrÃ¸y.no",
"donna.no",
"dÃ¸nna.no",
"eid.no",
"eidfjord.no",
"eidsberg.no",
"eidskog.no",
"eidsvoll.no",
"eigersund.no",
"elverum.no",
"enebakk.no",
"engerdal.no",
"etne.no",
"etnedal.no",
"evenes.no",
"evenassi.no",
"evenÃ¡Å¡Å¡i.no",
"evje-og-hornnes.no",
"farsund.no",
"fauske.no",
"fuossko.no",
"fuoisku.no",
"fedje.no",
"fet.no",
"finnoy.no",
"finnÃ¸y.no",
"fitjar.no",
"fjaler.no",
"fjell.no",
"flakstad.no",
"flatanger.no",
"flekkefjord.no",
"flesberg.no",
"flora.no",
"fla.no",
"flÃ¥.no",
"folldal.no",
"forsand.no",
"fosnes.no",
"frei.no",
"frogn.no",
"froland.no",
"frosta.no",
"frana.no",
"frÃ¦na.no",
"froya.no",
"frÃ¸ya.no",
"fusa.no",
"fyresdal.no",
"forde.no",
"fÃ¸rde.no",
"gamvik.no",
"gangaviika.no",
"gÃ¡Å‹gaviika.no",
"gaular.no",
"gausdal.no",
"gildeskal.no",
"gildeskÃ¥l.no",
"giske.no",
"gjemnes.no",
"gjerdrum.no",
"gjerstad.no",
"gjesdal.no",
"gjovik.no",
"gjÃ¸vik.no",
"gloppen.no",
"gol.no",
"gran.no",
"grane.no",
"granvin.no",
"gratangen.no",
"grimstad.no",
"grong.no",
"kraanghke.no",
"krÃ¥anghke.no",
"grue.no",
"gulen.no",
"hadsel.no",
"halden.no",
"halsa.no",
"hamar.no",
"hamaroy.no",
"habmer.no",
"hÃ¡bmer.no",
"hapmir.no",
"hÃ¡pmir.no",
"hammerfest.no",
"hammarfeasta.no",
"hÃ¡mmÃ¡rfeasta.no",
"haram.no",
"hareid.no",
"harstad.no",
"hasvik.no",
"aknoluokta.no",
"Ã¡kÅ‹oluokta.no",
"hattfjelldal.no",
"aarborte.no",
"haugesund.no",
"hemne.no",
"hemnes.no",
"hemsedal.no",
"heroy.more-og-romsdal.no",
"herÃ¸y.mÃ¸re-og-romsdal.no",
"heroy.nordland.no",
"herÃ¸y.nordland.no",
"hitra.no",
"hjartdal.no",
"hjelmeland.no",
"hobol.no",
"hobÃ¸l.no",
"hof.no",
"hol.no",
"hole.no",
"holmestrand.no",
"holtalen.no",
"holtÃ¥len.no",
"hornindal.no",
"horten.no",
"hurdal.no",
"hurum.no",
"hvaler.no",
"hyllestad.no",
"hagebostad.no",
"hÃ¦gebostad.no",
"hoyanger.no",
"hÃ¸yanger.no",
"hoylandet.no",
"hÃ¸ylandet.no",
"ha.no",
"hÃ¥.no",
"ibestad.no",
"inderoy.no",
"inderÃ¸y.no",
"iveland.no",
"jevnaker.no",
"jondal.no",
"jolster.no",
"jÃ¸lster.no",
"karasjok.no",
"karasjohka.no",
"kÃ¡rÃ¡Å¡johka.no",
"karlsoy.no",
"galsa.no",
"gÃ¡lsÃ¡.no",
"karmoy.no",
"karmÃ¸y.no",
"kautokeino.no",
"guovdageaidnu.no",
"klepp.no",
"klabu.no",
"klÃ¦bu.no",
"kongsberg.no",
"kongsvinger.no",
"kragero.no",
"kragerÃ¸.no",
"kristiansand.no",
"kristiansund.no",
"krodsherad.no",
"krÃ¸dsherad.no",
"kvalsund.no",
"rahkkeravju.no",
"rÃ¡hkkerÃ¡vju.no",
"kvam.no",
"kvinesdal.no",
"kvinnherad.no",
"kviteseid.no",
"kvitsoy.no",
"kvitsÃ¸y.no",
"kvafjord.no",
"kvÃ¦fjord.no",
"giehtavuoatna.no",
"kvanangen.no",
"kvÃ¦nangen.no",
"navuotna.no",
"nÃ¡vuotna.no",
"kafjord.no",
"kÃ¥fjord.no",
"gaivuotna.no",
"gÃ¡ivuotna.no",
"larvik.no",
"lavangen.no",
"lavagis.no",
"loabat.no",
"loabÃ¡t.no",
"lebesby.no",
"davvesiida.no",
"leikanger.no",
"leirfjord.no",
"leka.no",
"leksvik.no",
"lenvik.no",
"leangaviika.no",
"leaÅ‹gaviika.no",
"lesja.no",
"levanger.no",
"lier.no",
"lierne.no",
"lillehammer.no",
"lillesand.no",
"lindesnes.no",
"lindas.no",
"lindÃ¥s.no",
"lom.no",
"loppa.no",
"lahppi.no",
"lÃ¡hppi.no",
"lund.no",
"lunner.no",
"luroy.no",
"lurÃ¸y.no",
"luster.no",
"lyngdal.no",
"lyngen.no",
"ivgu.no",
"lardal.no",
"lerdal.no",
"lÃ¦rdal.no",
"lodingen.no",
"lÃ¸dingen.no",
"lorenskog.no",
"lÃ¸renskog.no",
"loten.no",
"lÃ¸ten.no",
"malvik.no",
"masoy.no",
"mÃ¥sÃ¸y.no",
"muosat.no",
"muosÃ¡t.no",
"mandal.no",
"marker.no",
"marnardal.no",
"masfjorden.no",
"meland.no",
"meldal.no",
"melhus.no",
"meloy.no",
"melÃ¸y.no",
"meraker.no",
"merÃ¥ker.no",
"moareke.no",
"moÃ¥reke.no",
"midsund.no",
"midtre-gauldal.no",
"modalen.no",
"modum.no",
"molde.no",
"moskenes.no",
"moss.no",
"mosvik.no",
"malselv.no",
"mÃ¥lselv.no",
"malatvuopmi.no",
"mÃ¡latvuopmi.no",
"namdalseid.no",
"aejrie.no",
"namsos.no",
"namsskogan.no",
"naamesjevuemie.no",
"nÃ¥Ã¥mesjevuemie.no",
"laakesvuemie.no",
"nannestad.no",
"narvik.no",
"narviika.no",
"naustdal.no",
"nedre-eiker.no",
"nes.akershus.no",
"nes.buskerud.no",
"nesna.no",
"nesodden.no",
"nesseby.no",
"unjarga.no",
"unjÃ¡rga.no",
"nesset.no",
"nissedal.no",
"nittedal.no",
"nord-aurdal.no",
"nord-fron.no",
"nord-odal.no",
"norddal.no",
"nordkapp.no",
"davvenjarga.no",
"davvenjÃ¡rga.no",
"nordre-land.no",
"nordreisa.no",
"raisa.no",
"rÃ¡isa.no",
"nore-og-uvdal.no",
"notodden.no",
"naroy.no",
"nÃ¦rÃ¸y.no",
"notteroy.no",
"nÃ¸tterÃ¸y.no",
"odda.no",
"oksnes.no",
"Ã¸ksnes.no",
"oppdal.no",
"oppegard.no",
"oppegÃ¥rd.no",
"orkdal.no",
"orland.no",
"Ã¸rland.no",
"orskog.no",
"Ã¸rskog.no",
"orsta.no",
"Ã¸rsta.no",
"os.hedmark.no",
"os.hordaland.no",
"osen.no",
"osteroy.no",
"osterÃ¸y.no",
"ostre-toten.no",
"Ã¸stre-toten.no",
"overhalla.no",
"ovre-eiker.no",
"Ã¸vre-eiker.no",
"oyer.no",
"Ã¸yer.no",
"oygarden.no",
"Ã¸ygarden.no",
"oystre-slidre.no",
"Ã¸ystre-slidre.no",
"porsanger.no",
"porsangu.no",
"porsÃ¡Å‹gu.no",
"porsgrunn.no",
"radoy.no",
"radÃ¸y.no",
"rakkestad.no",
"rana.no",
"ruovat.no",
"randaberg.no",
"rauma.no",
"rendalen.no",
"rennebu.no",
"rennesoy.no",
"rennesÃ¸y.no",
"rindal.no",
"ringebu.no",
"ringerike.no",
"ringsaker.no",
"rissa.no",
"risor.no",
"risÃ¸r.no",
"roan.no",
"rollag.no",
"rygge.no",
"ralingen.no",
"rÃ¦lingen.no",
"rodoy.no",
"rÃ¸dÃ¸y.no",
"romskog.no",
"rÃ¸mskog.no",
"roros.no",
"rÃ¸ros.no",
"rost.no",
"rÃ¸st.no",
"royken.no",
"rÃ¸yken.no",
"royrvik.no",
"rÃ¸yrvik.no",
"rade.no",
"rÃ¥de.no",
"salangen.no",
"siellak.no",
"saltdal.no",
"salat.no",
"sÃ¡lÃ¡t.no",
"sÃ¡lat.no",
"samnanger.no",
"sande.more-og-romsdal.no",
"sande.mÃ¸re-og-romsdal.no",
"sande.vestfold.no",
"sandefjord.no",
"sandnes.no",
"sandoy.no",
"sandÃ¸y.no",
"sarpsborg.no",
"sauda.no",
"sauherad.no",
"sel.no",
"selbu.no",
"selje.no",
"seljord.no",
"sigdal.no",
"siljan.no",
"sirdal.no",
"skaun.no",
"skedsmo.no",
"ski.no",
"skien.no",
"skiptvet.no",
"skjervoy.no",
"skjervÃ¸y.no",
"skierva.no",
"skiervÃ¡.no",
"skjak.no",
"skjÃ¥k.no",
"skodje.no",
"skanland.no",
"skÃ¥nland.no",
"skanit.no",
"skÃ¡nit.no",
"smola.no",
"smÃ¸la.no",
"snillfjord.no",
"snasa.no",
"snÃ¥sa.no",
"snoasa.no",
"snaase.no",
"snÃ¥ase.no",
"sogndal.no",
"sokndal.no",
"sola.no",
"solund.no",
"songdalen.no",
"sortland.no",
"spydeberg.no",
"stange.no",
"stavanger.no",
"steigen.no",
"steinkjer.no",
"stjordal.no",
"stjÃ¸rdal.no",
"stokke.no",
"stor-elvdal.no",
"stord.no",
"stordal.no",
"storfjord.no",
"omasvuotna.no",
"strand.no",
"stranda.no",
"stryn.no",
"sula.no",
"suldal.no",
"sund.no",
"sunndal.no",
"surnadal.no",
"sveio.no",
"svelvik.no",
"sykkylven.no",
"sogne.no",
"sÃ¸gne.no",
"somna.no",
"sÃ¸mna.no",
"sondre-land.no",
"sÃ¸ndre-land.no",
"sor-aurdal.no",
"sÃ¸r-aurdal.no",
"sor-fron.no",
"sÃ¸r-fron.no",
"sor-odal.no",
"sÃ¸r-odal.no",
"sor-varanger.no",
"sÃ¸r-varanger.no",
"matta-varjjat.no",
"mÃ¡tta-vÃ¡rjjat.no",
"sorfold.no",
"sÃ¸rfold.no",
"sorreisa.no",
"sÃ¸rreisa.no",
"sorum.no",
"sÃ¸rum.no",
"tana.no",
"deatnu.no",
"time.no",
"tingvoll.no",
"tinn.no",
"tjeldsund.no",
"dielddanuorri.no",
"tjome.no",
"tjÃ¸me.no",
"tokke.no",
"tolga.no",
"torsken.no",
"tranoy.no",
"tranÃ¸y.no",
"tromso.no",
"tromsÃ¸.no",
"tromsa.no",
"romsa.no",
"trondheim.no",
"troandin.no",
"trysil.no",
"trana.no",
"trÃ¦na.no",
"trogstad.no",
"trÃ¸gstad.no",
"tvedestrand.no",
"tydal.no",
"tynset.no",
"tysfjord.no",
"divtasvuodna.no",
"divttasvuotna.no",
"tysnes.no",
"tysvar.no",
"tysvÃ¦r.no",
"tonsberg.no",
"tÃ¸nsberg.no",
"ullensaker.no",
"ullensvang.no",
"ulvik.no",
"utsira.no",
"vadso.no",
"vadsÃ¸.no",
"cahcesuolo.no",
"Ä�Ã¡hcesuolo.no",
"vaksdal.no",
"valle.no",
"vang.no",
"vanylven.no",
"vardo.no",
"vardÃ¸.no",
"varggat.no",
"vÃ¡rggÃ¡t.no",
"vefsn.no",
"vaapste.no",
"vega.no",
"vegarshei.no",
"vegÃ¥rshei.no",
"vennesla.no",
"verdal.no",
"verran.no",
"vestby.no",
"vestnes.no",
"vestre-slidre.no",
"vestre-toten.no",
"vestvagoy.no",
"vestvÃ¥gÃ¸y.no",
"vevelstad.no",
"vik.no",
"vikna.no",
"vindafjord.no",
"volda.no",
"voss.no",
"varoy.no",
"vÃ¦rÃ¸y.no",
"vagan.no",
"vÃ¥gan.no",
"voagat.no",
"vagsoy.no",
"vÃ¥gsÃ¸y.no",
"vaga.no",
"vÃ¥gÃ¥.no",
"valer.ostfold.no",
"vÃ¥ler.Ã¸stfold.no",
"valer.hedmark.no",
"vÃ¥ler.hedmark.no",
"*.np",
"nr",
"biz.nr",
"info.nr",
"gov.nr",
"edu.nr",
"org.nr",
"net.nr",
"com.nr",
"nu",
"nz",
"ac.nz",
"co.nz",
"cri.nz",
"geek.nz",
"gen.nz",
"govt.nz",
"health.nz",
"iwi.nz",
"kiwi.nz",
"maori.nz",
"mil.nz",
"mÄ�ori.nz",
"net.nz",
"org.nz",
"parliament.nz",
"school.nz",
"om",
"co.om",
"com.om",
"edu.om",
"gov.om",
"med.om",
"museum.om",
"net.om",
"org.om",
"pro.om",
"onion",
"org",
"pa",
"ac.pa",
"gob.pa",
"com.pa",
"org.pa",
"sld.pa",
"edu.pa",
"net.pa",
"ing.pa",
"abo.pa",
"med.pa",
"nom.pa",
"pe",
"edu.pe",
"gob.pe",
"nom.pe",
"mil.pe",
"org.pe",
"com.pe",
"net.pe",
"pf",
"com.pf",
"org.pf",
"edu.pf",
"*.pg",
"ph",
"com.ph",
"net.ph",
"org.ph",
"gov.ph",
"edu.ph",
"ngo.ph",
"mil.ph",
"i.ph",
"pk",
"com.pk",
"net.pk",
"edu.pk",
"org.pk",
"fam.pk",
"biz.pk",
"web.pk",
"gov.pk",
"gob.pk",
"gok.pk",
"gon.pk",
"gop.pk",
"gos.pk",
"info.pk",
"pl",
"com.pl",
"net.pl",
"org.pl",
"aid.pl",
"agro.pl",
"atm.pl",
"auto.pl",
"biz.pl",
"edu.pl",
"gmina.pl",
"gsm.pl",
"info.pl",
"mail.pl",
"miasta.pl",
"media.pl",
"mil.pl",
"nieruchomosci.pl",
"nom.pl",
"pc.pl",
"powiat.pl",
"priv.pl",
"realestate.pl",
"rel.pl",
"sex.pl",
"shop.pl",
"sklep.pl",
"sos.pl",
"szkola.pl",
"targi.pl",
"tm.pl",
"tourism.pl",
"travel.pl",
"turystyka.pl",
"gov.pl",
"ap.gov.pl",
"ic.gov.pl",
"is.gov.pl",
"us.gov.pl",
"kmpsp.gov.pl",
"kppsp.gov.pl",
"kwpsp.gov.pl",
"psp.gov.pl",
"wskr.gov.pl",
"kwp.gov.pl",
"mw.gov.pl",
"ug.gov.pl",
"um.gov.pl",
"umig.gov.pl",
"ugim.gov.pl",
"upow.gov.pl",
"uw.gov.pl",
"starostwo.gov.pl",
"pa.gov.pl",
"po.gov.pl",
"psse.gov.pl",
"pup.gov.pl",
"rzgw.gov.pl",
"sa.gov.pl",
"so.gov.pl",
"sr.gov.pl",
"wsa.gov.pl",
"sko.gov.pl",
"uzs.gov.pl",
"wiih.gov.pl",
"winb.gov.pl",
"pinb.gov.pl",
"wios.gov.pl",
"witd.gov.pl",
"wzmiuw.gov.pl",
"piw.gov.pl",
"wiw.gov.pl",
"griw.gov.pl",
"wif.gov.pl",
"oum.gov.pl",
"sdn.gov.pl",
"zp.gov.pl",
"uppo.gov.pl",
"mup.gov.pl",
"wuoz.gov.pl",
"konsulat.gov.pl",
"oirm.gov.pl",
"augustow.pl",
"babia-gora.pl",
"bedzin.pl",
"beskidy.pl",
"bialowieza.pl",
"bialystok.pl",
"bielawa.pl",
"bieszczady.pl",
"boleslawiec.pl",
"bydgoszcz.pl",
"bytom.pl",
"cieszyn.pl",
"czeladz.pl",
"czest.pl",
"dlugoleka.pl",
"elblag.pl",
"elk.pl",
"glogow.pl",
"gniezno.pl",
"gorlice.pl",
"grajewo.pl",
"ilawa.pl",
"jaworzno.pl",
"jelenia-gora.pl",
"jgora.pl",
"kalisz.pl",
"kazimierz-dolny.pl",
"karpacz.pl",
"kartuzy.pl",
"kaszuby.pl",
"katowice.pl",
"kepno.pl",
"ketrzyn.pl",
"klodzko.pl",
"kobierzyce.pl",
"kolobrzeg.pl",
"konin.pl",
"konskowola.pl",
"kutno.pl",
"lapy.pl",
"lebork.pl",
"legnica.pl",
"lezajsk.pl",
"limanowa.pl",
"lomza.pl",
"lowicz.pl",
"lubin.pl",
"lukow.pl",
"malbork.pl",
"malopolska.pl",
"mazowsze.pl",
"mazury.pl",
"mielec.pl",
"mielno.pl",
"mragowo.pl",
"naklo.pl",
"nowaruda.pl",
"nysa.pl",
"olawa.pl",
"olecko.pl",
"olkusz.pl",
"olsztyn.pl",
"opoczno.pl",
"opole.pl",
"ostroda.pl",
"ostroleka.pl",
"ostrowiec.pl",
"ostrowwlkp.pl",
"pila.pl",
"pisz.pl",
"podhale.pl",
"podlasie.pl",
"polkowice.pl",
"pomorze.pl",
"pomorskie.pl",
"prochowice.pl",
"pruszkow.pl",
"przeworsk.pl",
"pulawy.pl",
"radom.pl",
"rawa-maz.pl",
"rybnik.pl",
"rzeszow.pl",
"sanok.pl",
"sejny.pl",
"slask.pl",
"slupsk.pl",
"sosnowiec.pl",
"stalowa-wola.pl",
"skoczow.pl",
"starachowice.pl",
"stargard.pl",
"suwalki.pl",
"swidnica.pl",
"swiebodzin.pl",
"swinoujscie.pl",
"szczecin.pl",
"szczytno.pl",
"tarnobrzeg.pl",
"tgory.pl",
"turek.pl",
"tychy.pl",
"ustka.pl",
"walbrzych.pl",
"warmia.pl",
"warszawa.pl",
"waw.pl",
"wegrow.pl",
"wielun.pl",
"wlocl.pl",
"wloclawek.pl",
"wodzislaw.pl",
"wolomin.pl",
"wroclaw.pl",
"zachpomor.pl",
"zagan.pl",
"zarow.pl",
"zgora.pl",
"zgorzelec.pl",
"pm",
"pn",
"gov.pn",
"co.pn",
"org.pn",
"edu.pn",
"net.pn",
"post",
"pr",
"com.pr",
"net.pr",
"org.pr",
"gov.pr",
"edu.pr",
"isla.pr",
"pro.pr",
"biz.pr",
"info.pr",
"name.pr",
"est.pr",
"prof.pr",
"ac.pr",
"pro",
"aaa.pro",
"aca.pro",
"acct.pro",
"avocat.pro",
"bar.pro",
"cpa.pro",
"eng.pro",
"jur.pro",
"law.pro",
"med.pro",
"recht.pro",
"ps",
"edu.ps",
"gov.ps",
"sec.ps",
"plo.ps",
"com.ps",
"org.ps",
"net.ps",
"pt",
"net.pt",
"gov.pt",
"org.pt",
"edu.pt",
"int.pt",
"publ.pt",
"com.pt",
"nome.pt",
"pw",
"co.pw",
"ne.pw",
"or.pw",
"ed.pw",
"go.pw",
"belau.pw",
"py",
"com.py",
"coop.py",
"edu.py",
"gov.py",
"mil.py",
"net.py",
"org.py",
"qa",
"com.qa",
"edu.qa",
"gov.qa",
"mil.qa",
"name.qa",
"net.qa",
"org.qa",
"sch.qa",
"re",
"asso.re",
"com.re",
"nom.re",
"ro",
"arts.ro",
"com.ro",
"firm.ro",
"info.ro",
"nom.ro",
"nt.ro",
"org.ro",
"rec.ro",
"store.ro",
"tm.ro",
"www.ro",
"rs",
"ac.rs",
"co.rs",
"edu.rs",
"gov.rs",
"in.rs",
"org.rs",
"ru",
"rw",
"ac.rw",
"co.rw",
"coop.rw",
"gov.rw",
"mil.rw",
"net.rw",
"org.rw",
"sa",
"com.sa",
"net.sa",
"org.sa",
"gov.sa",
"med.sa",
"pub.sa",
"edu.sa",
"sch.sa",
"sb",
"com.sb",
"edu.sb",
"gov.sb",
"net.sb",
"org.sb",
"sc",
"com.sc",
"gov.sc",
"net.sc",
"org.sc",
"edu.sc",
"sd",
"com.sd",
"net.sd",
"org.sd",
"edu.sd",
"med.sd",
"tv.sd",
"gov.sd",
"info.sd",
"se",
"a.se",
"ac.se",
"b.se",
"bd.se",
"brand.se",
"c.se",
"d.se",
"e.se",
"f.se",
"fh.se",
"fhsk.se",
"fhv.se",
"g.se",
"h.se",
"i.se",
"k.se",
"komforb.se",
"kommunalforbund.se",
"komvux.se",
"l.se",
"lanbib.se",
"m.se",
"n.se",
"naturbruksgymn.se",
"o.se",
"org.se",
"p.se",
"parti.se",
"pp.se",
"press.se",
"r.se",
"s.se",
"t.se",
"tm.se",
"u.se",
"w.se",
"x.se",
"y.se",
"z.se",
"sg",
"com.sg",
"net.sg",
"org.sg",
"gov.sg",
"edu.sg",
"per.sg",
"sh",
"com.sh",
"net.sh",
"gov.sh",
"org.sh",
"mil.sh",
"si",
"sj",
"sk",
"sl",
"com.sl",
"net.sl",
"edu.sl",
"gov.sl",
"org.sl",
"sm",
"sn",
"art.sn",
"com.sn",
"edu.sn",
"gouv.sn",
"org.sn",
"perso.sn",
"univ.sn",
"so",
"com.so",
"edu.so",
"gov.so",
"me.so",
"net.so",
"org.so",
"sr",
"ss",
"biz.ss",
"com.ss",
"edu.ss",
"gov.ss",
"net.ss",
"org.ss",
"st",
"co.st",
"com.st",
"consulado.st",
"edu.st",
"embaixada.st",
"gov.st",
"mil.st",
"net.st",
"org.st",
"principe.st",
"saotome.st",
"store.st",
"su",
"sv",
"com.sv",
"edu.sv",
"gob.sv",
"org.sv",
"red.sv",
"sx",
"gov.sx",
"sy",
"edu.sy",
"gov.sy",
"net.sy",
"mil.sy",
"com.sy",
"org.sy",
"sz",
"co.sz",
"ac.sz",
"org.sz",
"tc",
"td",
"tel",
"tf",
"tg",
"th",
"ac.th",
"co.th",
"go.th",
"in.th",
"mi.th",
"net.th",
"or.th",
"tj",
"ac.tj",
"biz.tj",
"co.tj",
"com.tj",
"edu.tj",
"go.tj",
"gov.tj",
"int.tj",
"mil.tj",
"name.tj",
"net.tj",
"nic.tj",
"org.tj",
"test.tj",
"web.tj",
"tk",
"tl",
"gov.tl",
"tm",
"com.tm",
"co.tm",
"org.tm",
"net.tm",
"nom.tm",
"gov.tm",
"mil.tm",
"edu.tm",
"tn",
"com.tn",
"ens.tn",
"fin.tn",
"gov.tn",
"ind.tn",
"intl.tn",
"nat.tn",
"net.tn",
"org.tn",
"info.tn",
"perso.tn",
"tourism.tn",
"edunet.tn",
"rnrt.tn",
"rns.tn",
"rnu.tn",
"mincom.tn",
"agrinet.tn",
"defense.tn",
"turen.tn",
"to",
"com.to",
"gov.to",
"net.to",
"org.to",
"edu.to",
"mil.to",
"tr",
"av.tr",
"bbs.tr",
"bel.tr",
"biz.tr",
"com.tr",
"dr.tr",
"edu.tr",
"gen.tr",
"gov.tr",
"info.tr",
"mil.tr",
"k12.tr",
"kep.tr",
"name.tr",
"net.tr",
"org.tr",
"pol.tr",
"tel.tr",
"tsk.tr",
"tv.tr",
"web.tr",
"nc.tr",
"gov.nc.tr",
"tt",
"co.tt",
"com.tt",
"org.tt",
"net.tt",
"biz.tt",
"info.tt",
"pro.tt",
"int.tt",
"coop.tt",
"jobs.tt",
"mobi.tt",
"travel.tt",
"museum.tt",
"aero.tt",
"name.tt",
"gov.tt",
"edu.tt",
"tv",
"tw",
"edu.tw",
"gov.tw",
"mil.tw",
"com.tw",
"net.tw",
"org.tw",
"idv.tw",
"game.tw",
"ebiz.tw",
"club.tw",
"ç¶²è·¯.tw",
"çµ„ç¹”.tw",
"å•†æ¥­.tw",
"tz",
"ac.tz",
"co.tz",
"go.tz",
"hotel.tz",
"info.tz",
"me.tz",
"mil.tz",
"mobi.tz",
"ne.tz",
"or.tz",
"sc.tz",
"tv.tz",
"ua",
"com.ua",
"edu.ua",
"gov.ua",
"in.ua",
"net.ua",
"org.ua",
"cherkassy.ua",
"cherkasy.ua",
"chernigov.ua",
"chernihiv.ua",
"chernivtsi.ua",
"chernovtsy.ua",
"ck.ua",
"cn.ua",
"cr.ua",
"crimea.ua",
"cv.ua",
"dn.ua",
"dnepropetrovsk.ua",
"dnipropetrovsk.ua",
"dominic.ua",
"donetsk.ua",
"dp.ua",
"if.ua",
"ivano-frankivsk.ua",
"kh.ua",
"kharkiv.ua",
"kharkov.ua",
"kherson.ua",
"khmelnitskiy.ua",
"khmelnytskyi.ua",
"kiev.ua",
"kirovograd.ua",
"km.ua",
"kr.ua",
"krym.ua",
"ks.ua",
"kv.ua",
"kyiv.ua",
"lg.ua",
"lt.ua",
"lugansk.ua",
"lutsk.ua",
"lv.ua",
"lviv.ua",
"mk.ua",
"mykolaiv.ua",
"nikolaev.ua",
"od.ua",
"odesa.ua",
"odessa.ua",
"pl.ua",
"poltava.ua",
"rivne.ua",
"rovno.ua",
"rv.ua",
"sb.ua",
"sebastopol.ua",
"sevastopol.ua",
"sm.ua",
"sumy.ua",
"te.ua",
"ternopil.ua",
"uz.ua",
"uzhgorod.ua",
"vinnica.ua",
"vinnytsia.ua",
"vn.ua",
"volyn.ua",
"yalta.ua",
"zaporizhzhe.ua",
"zaporizhzhia.ua",
"zhitomir.ua",
"zhytomyr.ua",
"zp.ua",
"zt.ua",
"ug",
"co.ug",
"or.ug",
"ac.ug",
"sc.ug",
"go.ug",
"ne.ug",
"com.ug",
"org.ug",
"uk",
"ac.uk",
"co.uk",
"gov.uk",
"ltd.uk",
"me.uk",
"net.uk",
"nhs.uk",
"org.uk",
"plc.uk",
"police.uk",
"*.sch.uk",
"us",
"dni.us",
"fed.us",
"isa.us",
"kids.us",
"nsn.us",
"ak.us",
"al.us",
"ar.us",
"as.us",
"az.us",
"ca.us",
"co.us",
"ct.us",
"dc.us",
"de.us",
"fl.us",
"ga.us",
"gu.us",
"hi.us",
"ia.us",
"id.us",
"il.us",
"in.us",
"ks.us",
"ky.us",
"la.us",
"ma.us",
"md.us",
"me.us",
"mi.us",
"mn.us",
"mo.us",
"ms.us",
"mt.us",
"nc.us",
"nd.us",
"ne.us",
"nh.us",
"nj.us",
"nm.us",
"nv.us",
"ny.us",
"oh.us",
"ok.us",
"or.us",
"pa.us",
"pr.us",
"ri.us",
"sc.us",
"sd.us",
"tn.us",
"tx.us",
"ut.us",
"vi.us",
"vt.us",
"va.us",
"wa.us",
"wi.us",
"wv.us",
"wy.us",
"k12.ak.us",
"k12.al.us",
"k12.ar.us",
"k12.as.us",
"k12.az.us",
"k12.ca.us",
"k12.co.us",
"k12.ct.us",
"k12.dc.us",
"k12.de.us",
"k12.fl.us",
"k12.ga.us",
"k12.gu.us",
"k12.ia.us",
"k12.id.us",
"k12.il.us",
"k12.in.us",
"k12.ks.us",
"k12.ky.us",
"k12.la.us",
"k12.ma.us",
"k12.md.us",
"k12.me.us",
"k12.mi.us",
"k12.mn.us",
"k12.mo.us",
"k12.ms.us",
"k12.mt.us",
"k12.nc.us",
"k12.ne.us",
"k12.nh.us",
"k12.nj.us",
"k12.nm.us",
"k12.nv.us",
"k12.ny.us",
"k12.oh.us",
"k12.ok.us",
"k12.or.us",
"k12.pa.us",
"k12.pr.us",
"k12.ri.us",
"k12.sc.us",
"k12.tn.us",
"k12.tx.us",
"k12.ut.us",
"k12.vi.us",
"k12.vt.us",
"k12.va.us",
"k12.wa.us",
"k12.wi.us",
"k12.wy.us",
"cc.ak.us",
"cc.al.us",
"cc.ar.us",
"cc.as.us",
"cc.az.us",
"cc.ca.us",
"cc.co.us",
"cc.ct.us",
"cc.dc.us",
"cc.de.us",
"cc.fl.us",
"cc.ga.us",
"cc.gu.us",
"cc.hi.us",
"cc.ia.us",
"cc.id.us",
"cc.il.us",
"cc.in.us",
"cc.ks.us",
"cc.ky.us",
"cc.la.us",
"cc.ma.us",
"cc.md.us",
"cc.me.us",
"cc.mi.us",
"cc.mn.us",
"cc.mo.us",
"cc.ms.us",
"cc.mt.us",
"cc.nc.us",
"cc.nd.us",
"cc.ne.us",
"cc.nh.us",
"cc.nj.us",
"cc.nm.us",
"cc.nv.us",
"cc.ny.us",
"cc.oh.us",
"cc.ok.us",
"cc.or.us",
"cc.pa.us",
"cc.pr.us",
"cc.ri.us",
"cc.sc.us",
"cc.sd.us",
"cc.tn.us",
"cc.tx.us",
"cc.ut.us",
"cc.vi.us",
"cc.vt.us",
"cc.va.us",
"cc.wa.us",
"cc.wi.us",
"cc.wv.us",
"cc.wy.us",
"lib.ak.us",
"lib.al.us",
"lib.ar.us",
"lib.as.us",
"lib.az.us",
"lib.ca.us",
"lib.co.us",
"lib.ct.us",
"lib.dc.us",
"lib.fl.us",
"lib.ga.us",
"lib.gu.us",
"lib.hi.us",
"lib.ia.us",
"lib.id.us",
"lib.il.us",
"lib.in.us",
"lib.ks.us",
"lib.ky.us",
"lib.la.us",
"lib.ma.us",
"lib.md.us",
"lib.me.us",
"lib.mi.us",
"lib.mn.us",
"lib.mo.us",
"lib.ms.us",
"lib.mt.us",
"lib.nc.us",
"lib.nd.us",
"lib.ne.us",
"lib.nh.us",
"lib.nj.us",
"lib.nm.us",
"lib.nv.us",
"lib.ny.us",
"lib.oh.us",
"lib.ok.us",
"lib.or.us",
"lib.pa.us",
"lib.pr.us",
"lib.ri.us",
"lib.sc.us",
"lib.sd.us",
"lib.tn.us",
"lib.tx.us",
"lib.ut.us",
"lib.vi.us",
"lib.vt.us",
"lib.va.us",
"lib.wa.us",
"lib.wi.us",
"lib.wy.us",
"pvt.k12.ma.us",
"chtr.k12.ma.us",
"paroch.k12.ma.us",
"ann-arbor.mi.us",
"cog.mi.us",
"dst.mi.us",
"eaton.mi.us",
"gen.mi.us",
"mus.mi.us",
"tec.mi.us",
"washtenaw.mi.us",
"uy",
"com.uy",
"edu.uy",
"gub.uy",
"mil.uy",
"net.uy",
"org.uy",
"uz",
"co.uz",
"com.uz",
"net.uz",
"org.uz",
"va",
"vc",
"com.vc",
"net.vc",
"org.vc",
"gov.vc",
"mil.vc",
"edu.vc",
"ve",
"arts.ve",
"co.ve",
"com.ve",
"e12.ve",
"edu.ve",
"firm.ve",
"gob.ve",
"gov.ve",
"info.ve",
"int.ve",
"mil.ve",
"net.ve",
"org.ve",
"rec.ve",
"store.ve",
"tec.ve",
"web.ve",
"vg",
"vi",
"co.vi",
"com.vi",
"k12.vi",
"net.vi",
"org.vi",
"vn",
"com.vn",
"net.vn",
"org.vn",
"edu.vn",
"gov.vn",
"int.vn",
"ac.vn",
"biz.vn",
"info.vn",
"name.vn",
"pro.vn",
"health.vn",
"vu",
"com.vu",
"edu.vu",
"net.vu",
"org.vu",
"wf",
"ws",
"com.ws",
"net.ws",
"org.ws",
"gov.ws",
"edu.ws",
"yt",
"Ø§Ù…Ø§Ø±Ø§Øª",
"Õ°Õ¡Õµ",
"à¦¬à¦¾à¦‚à¦²à¦¾",
"Ð±Ð³",
"Ð±ÐµÐ»",
"ä¸­å›½",
"ä¸­åœ‹",
"Ø§Ù„Ø¬Ø²Ø§Ø¦Ø±",
"Ù…ØµØ±",
"ÐµÑŽ",
"ÎµÏ…",
"Ù…ÙˆØ±ÙŠØªØ§Ù†ÙŠØ§",
"áƒ’áƒ”",
"ÎµÎ»",
"é¦™æ¸¯",
"å…¬å�¸.é¦™æ¸¯",
"æ•™è‚².é¦™æ¸¯",
"æ”¿åºœ.é¦™æ¸¯",
"å€‹äºº.é¦™æ¸¯",
"ç¶²çµ¡.é¦™æ¸¯",
"çµ„ç¹”.é¦™æ¸¯",
"à²­à²¾à²°à²¤",
"à¬­à¬¾à¬°à¬¤",
"à¦­à¦¾à§°à¦¤",
"à¤­à¤¾à¤°à¤¤à¤®à¥�",
"à¤­à¤¾à¤°à¥‹à¤¤",
"Ú€Ø§Ø±Øª",
"à´­à´¾à´°à´¤à´‚",
"à¤­à¤¾à¤°à¤¤",
"Ø¨Ø§Ø±Øª",
"Ø¨Ú¾Ø§Ø±Øª",
"à°­à°¾à°°à°¤à±�",
"àª­àª¾àª°àª¤",
"à¨­à¨¾à¨°à¨¤",
"à¦­à¦¾à¦°à¦¤",
"à®‡à®¨à¯�à®¤à®¿à®¯à®¾",
"Ø§ÛŒØ±Ø§Ù†",
"Ø§ÙŠØ±Ø§Ù†",
"Ø¹Ø±Ø§Ù‚",
"Ø§Ù„Ø§Ø±Ø¯Ù†",
"í•œêµ­",
"Ò›Ð°Ð·",
"à¶½à¶‚à¶šà·�",
"à®‡à®²à®™à¯�à®•à¯ˆ",
"Ø§Ù„Ù…ØºØ±Ø¨",
"Ð¼ÐºÐ´",
"Ð¼Ð¾Ð½",
"æ¾³é–€",
"æ¾³é—¨",
"Ù…Ù„ÙŠØ³ÙŠØ§",
"Ø¹Ù…Ø§Ù†",
"Ù¾Ø§Ú©Ø³ØªØ§Ù†",
"Ù¾Ø§ÙƒØ³ØªØ§Ù†",
"Ù�Ù„Ø³Ø·ÙŠÙ†",
"Ñ�Ñ€Ð±",
"Ð¿Ñ€.Ñ�Ñ€Ð±",
"Ð¾Ñ€Ð³.Ñ�Ñ€Ð±",
"Ð¾Ð±Ñ€.Ñ�Ñ€Ð±",
"Ð¾Ð´.Ñ�Ñ€Ð±",
"ÑƒÐ¿Ñ€.Ñ�Ñ€Ð±",
"Ð°Ðº.Ñ�Ñ€Ð±",
"Ñ€Ñ„",
"Ù‚Ø·Ø±",
"Ø§Ù„Ø³Ø¹ÙˆØ¯ÙŠØ©",
"Ø§Ù„Ø³Ø¹ÙˆØ¯ÛŒØ©",
"Ø§Ù„Ø³Ø¹ÙˆØ¯ÛŒÛƒ",
"Ø§Ù„Ø³Ø¹ÙˆØ¯ÙŠÙ‡",
"Ø³ÙˆØ¯Ø§Ù†",
"æ–°åŠ å�¡",
"à®šà®¿à®™à¯�à®•à®ªà¯�à®ªà¯‚à®°à¯�",
"Ø³ÙˆØ±ÙŠØ©",
"Ø³ÙˆØ±ÙŠØ§",
"à¹„à¸—à¸¢",
"à¸¨à¸¶à¸�à¸©à¸².à¹„à¸—à¸¢",
"à¸˜à¸¸à¸£à¸�à¸´à¸ˆ.à¹„à¸—à¸¢",
"à¸£à¸±à¸�à¸šà¸²à¸¥.à¹„à¸—à¸¢",
"à¸—à¸«à¸²à¸£.à¹„à¸—à¸¢",
"à¹€à¸™à¹‡à¸•.à¹„à¸—à¸¢",
"à¸­à¸‡à¸„à¹Œà¸�à¸£.à¹„à¸—à¸¢",
"ØªÙˆÙ†Ø³",
"å�°ç�£",
"å�°æ¹¾",
"è‡ºç�£",
"ÑƒÐºÑ€",
"Ø§Ù„ÙŠÙ…Ù†",
"xxx",
"*.ye",
"ac.za",
"agric.za",
"alt.za",
"co.za",
"edu.za",
"gov.za",
"grondar.za",
"law.za",
"mil.za",
"net.za",
"ngo.za",
"nic.za",
"nis.za",
"nom.za",
"org.za",
"school.za",
"tm.za",
"web.za",
"zm",
"ac.zm",
"biz.zm",
"co.zm",
"com.zm",
"edu.zm",
"gov.zm",
"info.zm",
"mil.zm",
"net.zm",
"org.zm",
"sch.zm",
"zw",
"ac.zw",
"co.zw",
"gov.zw",
"mil.zw",
"org.zw",
"aaa",
"aarp",
"abarth",
"abb",
"abbott",
"abbvie",
"abc",
"able",
"abogado",
"abudhabi",
"academy",
"accenture",
"accountant",
"accountants",
"aco",
"actor",
"adac",
"ads",
"adult",
"aeg",
"aetna",
"afamilycompany",
"afl",
"africa",
"agakhan",
"agency",
"aig",
"aigo",
"airbus",
"airforce",
"airtel",
"akdn",
"alfaromeo",
"alibaba",
"alipay",
"allfinanz",
"allstate",
"ally",
"alsace",
"alstom",
"amazon",
"americanexpress",
"americanfamily",
"amex",
"amfam",
"amica",
"amsterdam",
"analytics",
"android",
"anquan",
"anz",
"aol",
"apartments",
"app",
"apple",
"aquarelle",
"arab",
"aramco",
"archi",
"army",
"art",
"arte",
"asda",
"associates",
"athleta",
"attorney",
"auction",
"audi",
"audible",
"audio",
"auspost",
"author",
"auto",
"autos",
"avianca",
"aws",
"axa",
"azure",
"baby",
"baidu",
"banamex",
"bananarepublic",
"band",
"bank",
"bar",
"barcelona",
"barclaycard",
"barclays",
"barefoot",
"bargains",
"baseball",
"basketball",
"bauhaus",
"bayern",
"bbc",
"bbt",
"bbva",
"bcg",
"bcn",
"beats",
"beauty",
"beer",
"bentley",
"berlin",
"best",
"bestbuy",
"bet",
"bharti",
"bible",
"bid",
"bike",
"bing",
"bingo",
"bio",
"black",
"blackfriday",
"blockbuster",
"blog",
"bloomberg",
"blue",
"bms",
"bmw",
"bnpparibas",
"boats",
"boehringer",
"bofa",
"bom",
"bond",
"boo",
"book",
"booking",
"bosch",
"bostik",
"boston",
"bot",
"boutique",
"box",
"bradesco",
"bridgestone",
"broadway",
"broker",
"brother",
"brussels",
"budapest",
"bugatti",
"build",
"builders",
"business",
"buy",
"buzz",
"bzh",
"cab",
"cafe",
"cal",
"call",
"calvinklein",
"cam",
"camera",
"camp",
"cancerresearch",
"canon",
"capetown",
"capital",
"capitalone",
"car",
"caravan",
"cards",
"care",
"career",
"careers",
"cars",
"casa",
"case",
"caseih",
"cash",
"casino",
"catering",
"catholic",
"cba",
"cbn",
"cbre",
"cbs",
"ceb",
"center",
"ceo",
"cern",
"cfa",
"cfd",
"chanel",
"channel",
"charity",
"chase",
"chat",
"cheap",
"chintai",
"christmas",
"chrome",
"church",
"cipriani",
"circle",
"cisco",
"citadel",
"citi",
"citic",
"city",
"cityeats",
"claims",
"cleaning",
"click",
"clinic",
"clinique",
"clothing",
"cloud",
"club",
"clubmed",
"coach",
"codes",
"coffee",
"college",
"cologne",
"comcast",
"commbank",
"community",
"company",
"compare",
"computer",
"comsec",
"condos",
"construction",
"consulting",
"contact",
"contractors",
"cooking",
"cookingchannel",
"cool",
"corsica",
"country",
"coupon",
"coupons",
"courses",
"cpa",
"credit",
"creditcard",
"creditunion",
"cricket",
"crown",
"crs",
"cruise",
"cruises",
"csc",
"cuisinella",
"cymru",
"cyou",
"dabur",
"dad",
"dance",
"data",
"date",
"dating",
"datsun",
"day",
"dclk",
"dds",
"deal",
"dealer",
"deals",
"degree",
"delivery",
"dell",
"deloitte",
"delta",
"democrat",
"dental",
"dentist",
"desi",
"design",
"dev",
"dhl",
"diamonds",
"diet",
"digital",
"direct",
"directory",
"discount",
"discover",
"dish",
"diy",
"dnp",
"docs",
"doctor",
"dog",
"domains",
"dot",
"download",
"drive",
"dtv",
"dubai",
"duck",
"dunlop",
"dupont",
"durban",
"dvag",
"dvr",
"earth",
"eat",
"eco",
"edeka",
"education",
"email",
"emerck",
"energy",
"engineer",
"engineering",
"enterprises",
"epson",
"equipment",
"ericsson",
"erni",
"esq",
"estate",
"esurance",
"etisalat",
"eurovision",
"eus",
"events",
"exchange",
"expert",
"exposed",
"express",
"extraspace",
"fage",
"fail",
"fairwinds",
"faith",
"family",
"fan",
"fans",
"farm",
"farmers",
"fashion",
"fast",
"fedex",
"feedback",
"ferrari",
"ferrero",
"fiat",
"fidelity",
"fido",
"film",
"final",
"finance",
"financial",
"fire",
"firestone",
"firmdale",
"fish",
"fishing",
"fit",
"fitness",
"flickr",
"flights",
"flir",
"florist",
"flowers",
"fly",
"foo",
"food",
"foodnetwork",
"football",
"ford",
"forex",
"forsale",
"forum",
"foundation",
"fox",
"free",
"fresenius",
"frl",
"frogans",
"frontdoor",
"frontier",
"ftr",
"fujitsu",
"fujixerox",
"fun",
"fund",
"furniture",
"futbol",
"fyi",
"gal",
"gallery",
"gallo",
"gallup",
"game",
"games",
"gap",
"garden",
"gay",
"gbiz",
"gdn",
"gea",
"gent",
"genting",
"george",
"ggee",
"gift",
"gifts",
"gives",
"giving",
"glade",
"glass",
"gle",
"global",
"globo",
"gmail",
"gmbh",
"gmo",
"gmx",
"godaddy",
"gold",
"goldpoint",
"golf",
"goo",
"goodyear",
"goog",
"google",
"gop",
"got",
"grainger",
"graphics",
"gratis",
"green",
"gripe",
"grocery",
"group",
"guardian",
"gucci",
"guge",
"guide",
"guitars",
"guru",
"hair",
"hamburg",
"hangout",
"haus",
"hbo",
"hdfc",
"hdfcbank",
"health",
"healthcare",
"help",
"helsinki",
"here",
"hermes",
"hgtv",
"hiphop",
"hisamitsu",
"hitachi",
"hiv",
"hkt",
"hockey",
"holdings",
"holiday",
"homedepot",
"homegoods",
"homes",
"homesense",
"honda",
"horse",
"hospital",
"host",
"hosting",
"hot",
"hoteles",
"hotels",
"hotmail",
"house",
"how",
"hsbc",
"hughes",
"hyatt",
"hyundai",
"ibm",
"icbc",
"ice",
"icu",
"ieee",
"ifm",
"ikano",
"imamat",
"imdb",
"immo",
"immobilien",
"inc",
"industries",
"infiniti",
"ing",
"ink",
"institute",
"insurance",
"insure",
"intel",
"international",
"intuit",
"investments",
"ipiranga",
"irish",
"ismaili",
"ist",
"istanbul",
"itau",
"itv",
"iveco",
"jaguar",
"java",
"jcb",
"jcp",
"jeep",
"jetzt",
"jewelry",
"jio",
"jll",
"jmp",
"jnj",
"joburg",
"jot",
"joy",
"jpmorgan",
"jprs",
"juegos",
"juniper",
"kaufen",
"kddi",
"kerryhotels",
"kerrylogistics",
"kerryproperties",
"kfh",
"kia",
"kim",
"kinder",
"kindle",
"kitchen",
"kiwi",
"koeln",
"komatsu",
"kosher",
"kpmg",
"kpn",
"krd",
"kred",
"kuokgroup",
"kyoto",
"lacaixa",
"lamborghini",
"lamer",
"lancaster",
"lancia",
"land",
"landrover",
"lanxess",
"lasalle",
"lat",
"latino",
"latrobe",
"law",
"lawyer",
"lds",
"lease",
"leclerc",
"lefrak",
"legal",
"lego",
"lexus",
"lgbt",
"lidl",
"life",
"lifeinsurance",
"lifestyle",
"lighting",
"like",
"lilly",
"limited",
"limo",
"lincoln",
"linde",
"link",
"lipsy",
"live",
"living",
"lixil",
"llc",
"llp",
"loan",
"loans",
"locker",
"locus",
"loft",
"lol",
"london",
"lotte",
"lotto",
"love",
"lpl",
"lplfinancial",
"ltd",
"ltda",
"lundbeck",
"lupin",
"luxe",
"luxury",
"macys",
"madrid",
"maif",
"maison",
"makeup",
"man",
"management",
"mango",
"map",
"market",
"marketing",
"markets",
"marriott",
"marshalls",
"maserati",
"mattel",
"mba",
"mckinsey",
"med",
"media",
"meet",
"melbourne",
"meme",
"memorial",
"men",
"menu",
"merckmsd",
"metlife",
"miami",
"microsoft",
"mini",
"mint",
"mit",
"mitsubishi",
"mlb",
"mls",
"mma",
"mobile",
"moda",
"moe",
"moi",
"mom",
"monash",
"money",
"monster",
"mormon",
"mortgage",
"moscow",
"moto",
"motorcycles",
"mov",
"movie",
"msd",
"mtn",
"mtr",
"mutual",
"nab",
"nadex",
"nagoya",
"nationwide",
"natura",
"navy",
"nba",
"nec",
"netbank",
"netflix",
"network",
"neustar",
"new",
"newholland",
"news",
"next",
"nextdirect",
"nexus",
"nfl",
"ngo",
"nhk",
"nico",
"nike",
"nikon",
"ninja",
"nissan",
"nissay",
"nokia",
"northwesternmutual",
"norton",
"now",
"nowruz",
"nowtv",
"nra",
"nrw",
"ntt",
"nyc",
"obi",
"observer",
"off",
"office",
"okinawa",
"olayan",
"olayangroup",
"oldnavy",
"ollo",
"omega",
"one",
"ong",
"onl",
"online",
"onyourside",
"ooo",
"open",
"oracle",
"orange",
"organic",
"origins",
"osaka",
"otsuka",
"ott",
"ovh",
"page",
"panasonic",
"paris",
"pars",
"partners",
"parts",
"party",
"passagens",
"pay",
"pccw",
"pet",
"pfizer",
"pharmacy",
"phd",
"philips",
"phone",
"photo",
"photography",
"photos",
"physio",
"pics",
"pictet",
"pictures",
"pid",
"pin",
"ping",
"pink",
"pioneer",
"pizza",
"place",
"play",
"playstation",
"plumbing",
"plus",
"pnc",
"pohl",
"poker",
"politie",
"porn",
"pramerica",
"praxi",
"press",
"prime",
"prod",
"productions",
"prof",
"progressive",
"promo",
"properties",
"property",
"protection",
"pru",
"prudential",
"pub",
"pwc",
"qpon",
"quebec",
"quest",
"qvc",
"racing",
"radio",
"raid",
"read",
"realestate",
"realtor",
"realty",
"recipes",
"red",
"redstone",
"redumbrella",
"rehab",
"reise",
"reisen",
"reit",
"reliance",
"ren",
"rent",
"rentals",
"repair",
"report",
"republican",
"rest",
"restaurant",
"review",
"reviews",
"rexroth",
"rich",
"richardli",
"ricoh",
"rightathome",
"ril",
"rio",
"rip",
"rmit",
"rocher",
"rocks",
"rodeo",
"rogers",
"room",
"rsvp",
"rugby",
"ruhr",
"run",
"rwe",
"ryukyu",
"saarland",
"safe",
"safety",
"sakura",
"sale",
"salon",
"samsclub",
"samsung",
"sandvik",
"sandvikcoromant",
"sanofi",
"sap",
"sarl",
"sas",
"save",
"saxo",
"sbi",
"sbs",
"sca",
"scb",
"schaeffler",
"schmidt",
"scholarships",
"school",
"schule",
"schwarz",
"science",
"scjohnson",
"scor",
"scot",
"search",
"seat",
"secure",
"security",
"seek",
"select",
"sener",
"services",
"ses",
"seven",
"sew",
"sex",
"sexy",
"sfr",
"shangrila",
"sharp",
"shaw",
"shell",
"shia",
"shiksha",
"shoes",
"shop",
"shopping",
"shouji",
"show",
"showtime",
"shriram",
"silk",
"sina",
"singles",
"site",
"ski",
"skin",
"sky",
"skype",
"sling",
"smart",
"smile",
"sncf",
"soccer",
"social",
"softbank",
"software",
"sohu",
"solar",
"solutions",
"song",
"sony",
"soy",
"spa",
"space",
"sport",
"spot",
"spreadbetting",
"srl",
"stada",
"staples",
"star",
"statebank",
"statefarm",
"stc",
"stcgroup",
"stockholm",
"storage",
"store",
"stream",
"studio",
"study",
"style",
"sucks",
"supplies",
"supply",
"support",
"surf",
"surgery",
"suzuki",
"swatch",
"swiftcover",
"swiss",
"sydney",
"symantec",
"systems",
"tab",
"taipei",
"talk",
"taobao",
"target",
"tatamotors",
"tatar",
"tattoo",
"tax",
"taxi",
"tci",
"tdk",
"team",
"tech",
"technology",
"temasek",
"tennis",
"teva",
"thd",
"theater",
"theatre",
"tiaa",
"tickets",
"tienda",
"tiffany",
"tips",
"tires",
"tirol",
"tjmaxx",
"tjx",
"tkmaxx",
"tmall",
"today",
"tokyo",
"tools",
"top",
"toray",
"toshiba",
"total",
"tours",
"town",
"toyota",
"toys",
"trade",
"trading",
"training",
"travel",
"travelchannel",
"travelers",
"travelersinsurance",
"trust",
"trv",
"tube",
"tui",
"tunes",
"tushu",
"tvs",
"ubank",
"ubs",
"unicom",
"university",
"uno",
"uol",
"ups",
"vacations",
"vana",
"vanguard",
"vegas",
"ventures",
"verisign",
"versicherung",
"vet",
"viajes",
"video",
"vig",
"viking",
"villas",
"vin",
"vip",
"virgin",
"visa",
"vision",
"viva",
"vivo",
"vlaanderen",
"vodka",
"volkswagen",
"volvo",
"vote",
"voting",
"voto",
"voyage",
"vuelos",
"wales",
"walmart",
"walter",
"wang",
"wanggou",
"watch",
"watches",
"weather",
"weatherchannel",
"webcam",
"weber",
"website",
"wed",
"wedding",
"weibo",
"weir",
"whoswho",
"wien",
"wiki",
"williamhill",
"win",
"windows",
"wine",
"winners",
"wme",
"wolterskluwer",
"woodside",
"work",
"works",
"world",
"wow",
"wtc",
"wtf",
"xbox",
"xerox",
"xfinity",
"xihuan",
"xin",
"à¤•à¥‰à¤®",
"ã‚»ãƒ¼ãƒ«",
"ä½›å±±",
"æ…ˆå–„",
"é›†å›¢",
"åœ¨çº¿",
"å¤§ä¼—æ±½è½¦",
"ç‚¹çœ‹",
"à¸„à¸­à¸¡",
"å…«å�¦",
"Ù…ÙˆÙ‚Ø¹",
"å…¬ç›Š",
"å…¬å�¸",
"é¦™æ ¼é‡Œæ‹‰",
"ç½‘ç«™",
"ç§»åŠ¨",
"æˆ‘çˆ±ä½ ",
"Ð¼Ð¾Ñ�ÐºÐ²Ð°",
"ÐºÐ°Ñ‚Ð¾Ð»Ð¸Ðº",
"Ð¾Ð½Ð»Ð°Ð¹Ð½",
"Ñ�Ð°Ð¹Ñ‚",
"è�”é€š",
"×§×•×�",
"æ—¶å°š",
"å¾®å�š",
"æ·¡é©¬é”¡",
"ãƒ•ã‚¡ãƒƒã‚·ãƒ§ãƒ³",
"Ð¾Ñ€Ð³",
"à¤¨à¥‡à¤Ÿ",
"ã‚¹ãƒˆã‚¢",
"ã‚¢ãƒžã‚¾ãƒ³",
"ì‚¼ì„±",
"å•†æ ‡",
"å•†åº—",
"å•†åŸŽ",
"Ð´ÐµÑ‚Ð¸",
"ãƒ�ã‚¤ãƒ³ãƒˆ",
"æ–°é—»",
"å·¥è¡Œ",
"å®¶é›»",
"ÙƒÙˆÙ…",
"ä¸­æ–‡ç½‘",
"ä¸­ä¿¡",
"å¨±ä¹�",
"è°·æ­Œ",
"é›»è¨Šç›ˆç§‘",
"è´­ç‰©",
"ã‚¯ãƒ©ã‚¦ãƒ‰",
"é€šè²©",
"ç½‘åº—",
"à¤¸à¤‚à¤—à¤ à¤¨",
"é¤�åŽ…",
"ç½‘ç»œ",
"ÐºÐ¾Ð¼",
"äºšé©¬é€Š",
"è¯ºåŸºäºš",
"é£Ÿå“�",
"é£žåˆ©æµ¦",
"æ‰‹è¡¨",
"æ‰‹æœº",
"Ø§Ø±Ø§Ù…ÙƒÙˆ",
"Ø§Ù„Ø¹Ù„ÙŠØ§Ù†",
"Ø§ØªØµØ§Ù„Ø§Øª",
"Ø¨Ø§Ø²Ø§Ø±",
"Ø§Ø¨ÙˆØ¸Ø¨ÙŠ",
"ÙƒØ§Ø«ÙˆÙ„ÙŠÙƒ",
"Ù‡Ù…Ø±Ø§Ù‡",
"ë‹·ì»´",
"æ”¿åºœ",
"Ø´Ø¨ÙƒØ©",
"Ø¨ÙŠØªÙƒ",
"Ø¹Ø±Ø¨",
"æœºæž„",
"ç»„ç»‡æœºæž„",
"å�¥åº·",
"æ‹›è�˜",
"Ñ€ÑƒÑ�",
"ç� å®�",
"å¤§æ‹¿",
"ã�¿ã‚“ã�ª",
"ã‚°ãƒ¼ã‚°ãƒ«",
"ä¸–ç•Œ",
"æ›¸ç±�",
"ç½‘å�€",
"ë‹·ë„·",
"ã‚³ãƒ ",
"å¤©ä¸»æ•™",
"æ¸¸æˆ�",
"vermÃ¶gensberater",
"vermÃ¶gensberatung",
"ä¼�ä¸š",
"ä¿¡æ�¯",
"å˜‰é‡Œå¤§é…’åº—",
"å˜‰é‡Œ",
"å¹¿ä¸œ",
"æ”¿åŠ¡",
"xyz",
"yachts",
"yahoo",
"yamaxun",
"yandex",
"yodobashi",
"yoga",
"yokohama",
"you",
"youtube",
"yun",
"zappos",
"zara",
"zero",
"zip",
"zone",
"zuerich",
"cc.ua",
"inf.ua",
"ltd.ua",
"adobeaemcloud.com",
"adobeaemcloud.net",
"*.dev.adobeaemcloud.com",
"beep.pl",
"barsy.ca",
"*.compute.estate",
"*.alces.network",
"altervista.org",
"alwaysdata.net",
"cloudfront.net",
"*.compute.amazonaws.com",
"*.compute-1.amazonaws.com",
"*.compute.amazonaws.com.cn",
"us-east-1.amazonaws.com",
"cn-north-1.eb.amazonaws.com.cn",
"cn-northwest-1.eb.amazonaws.com.cn",
"elasticbeanstalk.com",
"ap-northeast-1.elasticbeanstalk.com",
"ap-northeast-2.elasticbeanstalk.com",
"ap-northeast-3.elasticbeanstalk.com",
"ap-south-1.elasticbeanstalk.com",
"ap-southeast-1.elasticbeanstalk.com",
"ap-southeast-2.elasticbeanstalk.com",
"ca-central-1.elasticbeanstalk.com",
"eu-central-1.elasticbeanstalk.com",
"eu-west-1.elasticbeanstalk.com",
"eu-west-2.elasticbeanstalk.com",
"eu-west-3.elasticbeanstalk.com",
"sa-east-1.elasticbeanstalk.com",
"us-east-1.elasticbeanstalk.com",
"us-east-2.elasticbeanstalk.com",
"us-gov-west-1.elasticbeanstalk.com",
"us-west-1.elasticbeanstalk.com",
"us-west-2.elasticbeanstalk.com",
"*.elb.amazonaws.com",
"*.elb.amazonaws.com.cn",
"s3.amazonaws.com",
"s3-ap-northeast-1.amazonaws.com",
"s3-ap-northeast-2.amazonaws.com",
"s3-ap-south-1.amazonaws.com",
"s3-ap-southeast-1.amazonaws.com",
"s3-ap-southeast-2.amazonaws.com",
"s3-ca-central-1.amazonaws.com",
"s3-eu-central-1.amazonaws.com",
"s3-eu-west-1.amazonaws.com",
"s3-eu-west-2.amazonaws.com",
"s3-eu-west-3.amazonaws.com",
"s3-external-1.amazonaws.com",
"s3-fips-us-gov-west-1.amazonaws.com",
"s3-sa-east-1.amazonaws.com",
"s3-us-gov-west-1.amazonaws.com",
"s3-us-east-2.amazonaws.com",
"s3-us-west-1.amazonaws.com",
"s3-us-west-2.amazonaws.com",
"s3.ap-northeast-2.amazonaws.com",
"s3.ap-south-1.amazonaws.com",
"s3.cn-north-1.amazonaws.com.cn",
"s3.ca-central-1.amazonaws.com",
"s3.eu-central-1.amazonaws.com",
"s3.eu-west-2.amazonaws.com",
"s3.eu-west-3.amazonaws.com",
"s3.us-east-2.amazonaws.com",
"s3.dualstack.ap-northeast-1.amazonaws.com",
"s3.dualstack.ap-northeast-2.amazonaws.com",
"s3.dualstack.ap-south-1.amazonaws.com",
"s3.dualstack.ap-southeast-1.amazonaws.com",
"s3.dualstack.ap-southeast-2.amazonaws.com",
"s3.dualstack.ca-central-1.amazonaws.com",
"s3.dualstack.eu-central-1.amazonaws.com",
"s3.dualstack.eu-west-1.amazonaws.com",
"s3.dualstack.eu-west-2.amazonaws.com",
"s3.dualstack.eu-west-3.amazonaws.com",
"s3.dualstack.sa-east-1.amazonaws.com",
"s3.dualstack.us-east-1.amazonaws.com",
"s3.dualstack.us-east-2.amazonaws.com",
"s3-website-us-east-1.amazonaws.com",
"s3-website-us-west-1.amazonaws.com",
"s3-website-us-west-2.amazonaws.com",
"s3-website-ap-northeast-1.amazonaws.com",
"s3-website-ap-southeast-1.amazonaws.com",
"s3-website-ap-southeast-2.amazonaws.com",
"s3-website-eu-west-1.amazonaws.com",
"s3-website-sa-east-1.amazonaws.com",
"s3-website.ap-northeast-2.amazonaws.com",
"s3-website.ap-south-1.amazonaws.com",
"s3-website.ca-central-1.amazonaws.com",
"s3-website.eu-central-1.amazonaws.com",
"s3-website.eu-west-2.amazonaws.com",
"s3-website.eu-west-3.amazonaws.com",
"s3-website.us-east-2.amazonaws.com",
"amsw.nl",
"t3l3p0rt.net",
"tele.amune.org",
"apigee.io",
"on-aptible.com",
"user.aseinet.ne.jp",
"gv.vc",
"d.gv.vc",
"user.party.eus",
"pimienta.org",
"poivron.org",
"potager.org",
"sweetpepper.org",
"myasustor.com",
"myfritz.net",
"*.awdev.ca",
"*.advisor.ws",
"b-data.io",
"backplaneapp.io",
"balena-devices.com",
"app.banzaicloud.io",
"betainabox.com",
"bnr.la",
"blackbaudcdn.net",
"boomla.net",
"boxfuse.io",
"square7.ch",
"bplaced.com",
"bplaced.de",
"square7.de",
"bplaced.net",
"square7.net",
"browsersafetymark.io",
"uk0.bigv.io",
"dh.bytemark.co.uk",
"vm.bytemark.co.uk",
"mycd.eu",
"carrd.co",
"crd.co",
"uwu.ai",
"ae.org",
"ar.com",
"br.com",
"cn.com",
"com.de",
"com.se",
"de.com",
"eu.com",
"gb.com",
"gb.net",
"hu.com",
"hu.net",
"jp.net",
"jpn.com",
"kr.com",
"mex.com",
"no.com",
"qc.com",
"ru.com",
"sa.com",
"se.net",
"uk.com",
"uk.net",
"us.com",
"uy.com",
"za.bz",
"za.com",
"africa.com",
"gr.com",
"in.net",
"us.org",
"co.com",
"c.la",
"certmgr.org",
"xenapponazure.com",
"discourse.group",
"discourse.team",
"virtueeldomein.nl",
"cleverapps.io",
"*.lcl.dev",
"*.stg.dev",
"c66.me",
"cloud66.ws",
"cloud66.zone",
"jdevcloud.com",
"wpdevcloud.com",
"cloudaccess.host",
"freesite.host",
"cloudaccess.net",
"cloudcontrolled.com",
"cloudcontrolapp.com",
"cloudera.site",
"trycloudflare.com",
"workers.dev",
"wnext.app",
"co.ca",
"*.otap.co",
"co.cz",
"c.cdn77.org",
"cdn77-ssl.net",
"r.cdn77.net",
"rsc.cdn77.org",
"ssl.origin.cdn77-secure.org",
"cloudns.asia",
"cloudns.biz",
"cloudns.club",
"cloudns.cc",
"cloudns.eu",
"cloudns.in",
"cloudns.info",
"cloudns.org",
"cloudns.pro",
"cloudns.pw",
"cloudns.us",
"cloudeity.net",
"cnpy.gdn",
"co.nl",
"co.no",
"webhosting.be",
"hosting-cluster.nl",
"ac.ru",
"edu.ru",
"gov.ru",
"int.ru",
"mil.ru",
"test.ru",
"dyn.cosidns.de",
"dynamisches-dns.de",
"dnsupdater.de",
"internet-dns.de",
"l-o-g-i-n.de",
"dynamic-dns.info",
"feste-ip.net",
"knx-server.net",
"static-access.net",
"realm.cz",
"*.cryptonomic.net",
"cupcake.is",
"*.customer-oci.com",
"*.oci.customer-oci.com",
"*.ocp.customer-oci.com",
"*.ocs.customer-oci.com",
"cyon.link",
"cyon.site",
"daplie.me",
"localhost.daplie.me",
"dattolocal.com",
"dattorelay.com",
"dattoweb.com",
"mydatto.com",
"dattolocal.net",
"mydatto.net",
"biz.dk",
"co.dk",
"firm.dk",
"reg.dk",
"store.dk",
"*.dapps.earth",
"*.bzz.dapps.earth",
"builtwithdark.com",
"edgestack.me",
"debian.net",
"dedyn.io",
"dnshome.de",
"online.th",
"shop.th",
"drayddns.com",
"dreamhosters.com",
"mydrobo.com",
"drud.io",
"drud.us",
"duckdns.org",
"dy.fi",
"tunk.org",
"dyndns-at-home.com",
"dyndns-at-work.com",
"dyndns-blog.com",
"dyndns-free.com",
"dyndns-home.com",
"dyndns-ip.com",
"dyndns-mail.com",
"dyndns-office.com",
"dyndns-pics.com",
"dyndns-remote.com",
"dyndns-server.com",
"dyndns-web.com",
"dyndns-wiki.com",
"dyndns-work.com",
"dyndns.biz",
"dyndns.info",
"dyndns.org",
"dyndns.tv",
"at-band-camp.net",
"ath.cx",
"barrel-of-knowledge.info",
"barrell-of-knowledge.info",
"better-than.tv",
"blogdns.com",
"blogdns.net",
"blogdns.org",
"blogsite.org",
"boldlygoingnowhere.org",
"broke-it.net",
"buyshouses.net",
"cechire.com",
"dnsalias.com",
"dnsalias.net",
"dnsalias.org",
"dnsdojo.com",
"dnsdojo.net",
"dnsdojo.org",
"does-it.net",
"doesntexist.com",
"doesntexist.org",
"dontexist.com",
"dontexist.net",
"dontexist.org",
"doomdns.com",
"doomdns.org",
"dvrdns.org",
"dyn-o-saur.com",
"dynalias.com",
"dynalias.net",
"dynalias.org",
"dynathome.net",
"dyndns.ws",
"endofinternet.net",
"endofinternet.org",
"endoftheinternet.org",
"est-a-la-maison.com",
"est-a-la-masion.com",
"est-le-patron.com",
"est-mon-blogueur.com",
"for-better.biz",
"for-more.biz",
"for-our.info",
"for-some.biz",
"for-the.biz",
"forgot.her.name",
"forgot.his.name",
"from-ak.com",
"from-al.com",
"from-ar.com",
"from-az.net",
"from-ca.com",
"from-co.net",
"from-ct.com",
"from-dc.com",
"from-de.com",
"from-fl.com",
"from-ga.com",
"from-hi.com",
"from-ia.com",
"from-id.com",
"from-il.com",
"from-in.com",
"from-ks.com",
"from-ky.com",
"from-la.net",
"from-ma.com",
"from-md.com",
"from-me.org",
"from-mi.com",
"from-mn.com",
"from-mo.com",
"from-ms.com",
"from-mt.com",
"from-nc.com",
"from-nd.com",
"from-ne.com",
"from-nh.com",
"from-nj.com",
"from-nm.com",
"from-nv.com",
"from-ny.net",
"from-oh.com",
"from-ok.com",
"from-or.com",
"from-pa.com",
"from-pr.com",
"from-ri.com",
"from-sc.com",
"from-sd.com",
"from-tn.com",
"from-tx.com",
"from-ut.com",
"from-va.com",
"from-vt.com",
"from-wa.com",
"from-wi.com",
"from-wv.com",
"from-wy.com",
"ftpaccess.cc",
"fuettertdasnetz.de",
"game-host.org",
"game-server.cc",
"getmyip.com",
"gets-it.net",
"go.dyndns.org",
"gotdns.com",
"gotdns.org",
"groks-the.info",
"groks-this.info",
"ham-radio-op.net",
"here-for-more.info",
"hobby-site.com",
"hobby-site.org",
"home.dyndns.org",
"homedns.org",
"homeftp.net",
"homeftp.org",
"homeip.net",
"homelinux.com",
"homelinux.net",
"homelinux.org",
"homeunix.com",
"homeunix.net",
"homeunix.org",
"iamallama.com",
"in-the-band.net",
"is-a-anarchist.com",
"is-a-blogger.com",
"is-a-bookkeeper.com",
"is-a-bruinsfan.org",
"is-a-bulls-fan.com",
"is-a-candidate.org",
"is-a-caterer.com",
"is-a-celticsfan.org",
"is-a-chef.com",
"is-a-chef.net",
"is-a-chef.org",
"is-a-conservative.com",
"is-a-cpa.com",
"is-a-cubicle-slave.com",
"is-a-democrat.com",
"is-a-designer.com",
"is-a-doctor.com",
"is-a-financialadvisor.com",
"is-a-geek.com",
"is-a-geek.net",
"is-a-geek.org",
"is-a-green.com",
"is-a-guru.com",
"is-a-hard-worker.com",
"is-a-hunter.com",
"is-a-knight.org",
"is-a-landscaper.com",
"is-a-lawyer.com",
"is-a-liberal.com",
"is-a-libertarian.com",
"is-a-linux-user.org",
"is-a-llama.com",
"is-a-musician.com",
"is-a-nascarfan.com",
"is-a-nurse.com",
"is-a-painter.com",
"is-a-patsfan.org",
"is-a-personaltrainer.com",
"is-a-photographer.com",
"is-a-player.com",
"is-a-republican.com",
"is-a-rockstar.com",
"is-a-socialist.com",
"is-a-soxfan.org",
"is-a-student.com",
"is-a-teacher.com",
"is-a-techie.com",
"is-a-therapist.com",
"is-an-accountant.com",
"is-an-actor.com",
"is-an-actress.com",
"is-an-anarchist.com",
"is-an-artist.com",
"is-an-engineer.com",
"is-an-entertainer.com",
"is-by.us",
"is-certified.com",
"is-found.org",
"is-gone.com",
"is-into-anime.com",
"is-into-cars.com",
"is-into-cartoons.com",
"is-into-games.com",
"is-leet.com",
"is-lost.org",
"is-not-certified.com",
"is-saved.org",
"is-slick.com",
"is-uberleet.com",
"is-very-bad.org",
"is-very-evil.org",
"is-very-good.org",
"is-very-nice.org",
"is-very-sweet.org",
"is-with-theband.com",
"isa-geek.com",
"isa-geek.net",
"isa-geek.org",
"isa-hockeynut.com",
"issmarterthanyou.com",
"isteingeek.de",
"istmein.de",
"kicks-ass.net",
"kicks-ass.org",
"knowsitall.info",
"land-4-sale.us",
"lebtimnetz.de",
"leitungsen.de",
"likes-pie.com",
"likescandy.com",
"merseine.nu",
"mine.nu",
"misconfused.org",
"mypets.ws",
"myphotos.cc",
"neat-url.com",
"office-on-the.net",
"on-the-web.tv",
"podzone.net",
"podzone.org",
"readmyblog.org",
"saves-the-whales.com",
"scrapper-site.net",
"scrapping.cc",
"selfip.biz",
"selfip.com",
"selfip.info",
"selfip.net",
"selfip.org",
"sells-for-less.com",
"sells-for-u.com",
"sells-it.net",
"sellsyourhome.org",
"servebbs.com",
"servebbs.net",
"servebbs.org",
"serveftp.net",
"serveftp.org",
"servegame.org",
"shacknet.nu",
"simple-url.com",
"space-to-rent.com",
"stuff-4-sale.org",
"stuff-4-sale.us",
"teaches-yoga.com",
"thruhere.net",
"traeumtgerade.de",
"webhop.biz",
"webhop.info",
"webhop.net",
"webhop.org",
"worse-than.tv",
"writesthisblog.com",
"ddnss.de",
"dyn.ddnss.de",
"dyndns.ddnss.de",
"dyndns1.de",
"dyn-ip24.de",
"home-webserver.de",
"dyn.home-webserver.de",
"myhome-server.de",
"ddnss.org",
"definima.net",
"definima.io",
"bci.dnstrace.pro",
"ddnsfree.com",
"ddnsgeek.com",
"giize.com",
"gleeze.com",
"kozow.com",
"loseyourip.com",
"ooguy.com",
"theworkpc.com",
"casacam.net",
"dynu.net",
"accesscam.org",
"camdvr.org",
"freeddns.org",
"mywire.org",
"webredirect.org",
"myddns.rocks",
"blogsite.xyz",
"dynv6.net",
"e4.cz",
"en-root.fr",
"mytuleap.com",
"onred.one",
"staging.onred.one",
"enonic.io",
"customer.enonic.io",
"eu.org",
"al.eu.org",
"asso.eu.org",
"at.eu.org",
"au.eu.org",
"be.eu.org",
"bg.eu.org",
"ca.eu.org",
"cd.eu.org",
"ch.eu.org",
"cn.eu.org",
"cy.eu.org",
"cz.eu.org",
"de.eu.org",
"dk.eu.org",
"edu.eu.org",
"ee.eu.org",
"es.eu.org",
"fi.eu.org",
"fr.eu.org",
"gr.eu.org",
"hr.eu.org",
"hu.eu.org",
"ie.eu.org",
"il.eu.org",
"in.eu.org",
"int.eu.org",
"is.eu.org",
"it.eu.org",
"jp.eu.org",
"kr.eu.org",
"lt.eu.org",
"lu.eu.org",
"lv.eu.org",
"mc.eu.org",
"me.eu.org",
"mk.eu.org",
"mt.eu.org",
"my.eu.org",
"net.eu.org",
"ng.eu.org",
"nl.eu.org",
"no.eu.org",
"nz.eu.org",
"paris.eu.org",
"pl.eu.org",
"pt.eu.org",
"q-a.eu.org",
"ro.eu.org",
"ru.eu.org",
"se.eu.org",
"si.eu.org",
"sk.eu.org",
"tr.eu.org",
"uk.eu.org",
"us.eu.org",
"eu-1.evennode.com",
"eu-2.evennode.com",
"eu-3.evennode.com",
"eu-4.evennode.com",
"us-1.evennode.com",
"us-2.evennode.com",
"us-3.evennode.com",
"us-4.evennode.com",
"twmail.cc",
"twmail.net",
"twmail.org",
"mymailer.com.tw",
"url.tw",
"apps.fbsbx.com",
"ru.net",
"adygeya.ru",
"bashkiria.ru",
"bir.ru",
"cbg.ru",
"com.ru",
"dagestan.ru",
"grozny.ru",
"kalmykia.ru",
"kustanai.ru",
"marine.ru",
"mordovia.ru",
"msk.ru",
"mytis.ru",
"nalchik.ru",
"nov.ru",
"pyatigorsk.ru",
"spb.ru",
"vladikavkaz.ru",
"vladimir.ru",
"abkhazia.su",
"adygeya.su",
"aktyubinsk.su",
"arkhangelsk.su",
"armenia.su",
"ashgabad.su",
"azerbaijan.su",
"balashov.su",
"bashkiria.su",
"bryansk.su",
"bukhara.su",
"chimkent.su",
"dagestan.su",
"east-kazakhstan.su",
"exnet.su",
"georgia.su",
"grozny.su",
"ivanovo.su",
"jambyl.su",
"kalmykia.su",
"kaluga.su",
"karacol.su",
"karaganda.su",
"karelia.su",
"khakassia.su",
"krasnodar.su",
"kurgan.su",
"kustanai.su",
"lenug.su",
"mangyshlak.su",
"mordovia.su",
"msk.su",
"murmansk.su",
"nalchik.su",
"navoi.su",
"north-kazakhstan.su",
"nov.su",
"obninsk.su",
"penza.su",
"pokrovsk.su",
"sochi.su",
"spb.su",
"tashkent.su",
"termez.su",
"togliatti.su",
"troitsk.su",
"tselinograd.su",
"tula.su",
"tuva.su",
"vladikavkaz.su",
"vladimir.su",
"vologda.su",
"channelsdvr.net",
"u.channelsdvr.net",
"fastly-terrarium.com",
"fastlylb.net",
"map.fastlylb.net",
"freetls.fastly.net",
"map.fastly.net",
"a.prod.fastly.net",
"global.prod.fastly.net",
"a.ssl.fastly.net",
"b.ssl.fastly.net",
"global.ssl.fastly.net",
"fastpanel.direct",
"fastvps-server.com",
"fhapp.xyz",
"fedorainfracloud.org",
"fedorapeople.org",
"cloud.fedoraproject.org",
"app.os.fedoraproject.org",
"app.os.stg.fedoraproject.org",
"mydobiss.com",
"filegear.me",
"filegear-au.me",
"filegear-de.me",
"filegear-gb.me",
"filegear-ie.me",
"filegear-jp.me",
"filegear-sg.me",
"firebaseapp.com",
"flynnhub.com",
"flynnhosting.net",
"0e.vc",
"freebox-os.com",
"freeboxos.com",
"fbx-os.fr",
"fbxos.fr",
"freebox-os.fr",
"freeboxos.fr",
"freedesktop.org",
"*.futurecms.at",
"*.ex.futurecms.at",
"*.in.futurecms.at",
"futurehosting.at",
"futuremailing.at",
"*.ex.ortsinfo.at",
"*.kunden.ortsinfo.at",
"*.statics.cloud",
"service.gov.uk",
"gehirn.ne.jp",
"usercontent.jp",
"gentapps.com",
"lab.ms",
"github.io",
"githubusercontent.com",
"gitlab.io",
"glitch.me",
"lolipop.io",
"cloudapps.digital",
"london.cloudapps.digital",
"homeoffice.gov.uk",
"ro.im",
"shop.ro",
"goip.de",
"run.app",
"a.run.app",
"web.app",
"*.0emm.com",
"appspot.com",
"*.r.appspot.com",
"blogspot.ae",
"blogspot.al",
"blogspot.am",
"blogspot.ba",
"blogspot.be",
"blogspot.bg",
"blogspot.bj",
"blogspot.ca",
"blogspot.cf",
"blogspot.ch",
"blogspot.cl",
"blogspot.co.at",
"blogspot.co.id",
"blogspot.co.il",
"blogspot.co.ke",
"blogspot.co.nz",
"blogspot.co.uk",
"blogspot.co.za",
"blogspot.com",
"blogspot.com.ar",
"blogspot.com.au",
"blogspot.com.br",
"blogspot.com.by",
"blogspot.com.co",
"blogspot.com.cy",
"blogspot.com.ee",
"blogspot.com.eg",
"blogspot.com.es",
"blogspot.com.mt",
"blogspot.com.ng",
"blogspot.com.tr",
"blogspot.com.uy",
"blogspot.cv",
"blogspot.cz",
"blogspot.de",
"blogspot.dk",
"blogspot.fi",
"blogspot.fr",
"blogspot.gr",
"blogspot.hk",
"blogspot.hr",
"blogspot.hu",
"blogspot.ie",
"blogspot.in",
"blogspot.is",
"blogspot.it",
"blogspot.jp",
"blogspot.kr",
"blogspot.li",
"blogspot.lt",
"blogspot.lu",
"blogspot.md",
"blogspot.mk",
"blogspot.mr",
"blogspot.mx",
"blogspot.my",
"blogspot.nl",
"blogspot.no",
"blogspot.pe",
"blogspot.pt",
"blogspot.qa",
"blogspot.re",
"blogspot.ro",
"blogspot.rs",
"blogspot.ru",
"blogspot.se",
"blogspot.sg",
"blogspot.si",
"blogspot.sk",
"blogspot.sn",
"blogspot.td",
"blogspot.tw",
"blogspot.ug",
"blogspot.vn",
"cloudfunctions.net",
"cloud.goog",
"codespot.com",
"googleapis.com",
"googlecode.com",
"pagespeedmobilizer.com",
"publishproxy.com",
"withgoogle.com",
"withyoutube.com",
"awsmppl.com",
"fin.ci",
"free.hr",
"caa.li",
"ua.rs",
"conf.se",
"hs.zone",
"hs.run",
"hashbang.sh",
"hasura.app",
"hasura-app.io",
"hepforge.org",
"herokuapp.com",
"herokussl.com",
"myravendb.com",
"ravendb.community",
"ravendb.me",
"development.run",
"ravendb.run",
"bpl.biz",
"orx.biz",
"ng.city",
"biz.gl",
"ng.ink",
"col.ng",
"firm.ng",
"gen.ng",
"ltd.ng",
"ngo.ng",
"ng.school",
"sch.so",
"hÃ¤kkinen.fi",
"*.moonscale.io",
"moonscale.net",
"iki.fi",
"dyn-berlin.de",
"in-berlin.de",
"in-brb.de",
"in-butter.de",
"in-dsl.de",
"in-dsl.net",
"in-dsl.org",
"in-vpn.de",
"in-vpn.net",
"in-vpn.org",
"biz.at",
"info.at",
"info.cx",
"ac.leg.br",
"al.leg.br",
"am.leg.br",
"ap.leg.br",
"ba.leg.br",
"ce.leg.br",
"df.leg.br",
"es.leg.br",
"go.leg.br",
"ma.leg.br",
"mg.leg.br",
"ms.leg.br",
"mt.leg.br",
"pa.leg.br",
"pb.leg.br",
"pe.leg.br",
"pi.leg.br",
"pr.leg.br",
"rj.leg.br",
"rn.leg.br",
"ro.leg.br",
"rr.leg.br",
"rs.leg.br",
"sc.leg.br",
"se.leg.br",
"sp.leg.br",
"to.leg.br",
"pixolino.com",
"ipifony.net",
"mein-iserv.de",
"test-iserv.de",
"iserv.dev",
"iobb.net",
"myjino.ru",
"*.hosting.myjino.ru",
"*.landing.myjino.ru",
"*.spectrum.myjino.ru",
"*.vps.myjino.ru",
"*.triton.zone",
"*.cns.joyent.com",
"js.org",
"kaas.gg",
"khplay.nl",
"keymachine.de",
"kinghost.net",
"uni5.net",
"knightpoint.systems",
"oya.to",
"co.krd",
"edu.krd",
"git-repos.de",
"lcube-server.de",
"svn-repos.de",
"leadpages.co",
"lpages.co",
"lpusercontent.com",
"lelux.site",
"co.business",
"co.education",
"co.events",
"co.financial",
"co.network",
"co.place",
"co.technology",
"app.lmpm.com",
"linkitools.space",
"linkyard.cloud",
"linkyard-cloud.ch",
"members.linode.com",
"nodebalancer.linode.com",
"we.bs",
"loginline.app",
"loginline.dev",
"loginline.io",
"loginline.services",
"loginline.site",
"krasnik.pl",
"leczna.pl",
"lubartow.pl",
"lublin.pl",
"poniatowa.pl",
"swidnik.pl",
"uklugs.org",
"glug.org.uk",
"lug.org.uk",
"lugs.org.uk",
"barsy.bg",
"barsy.co.uk",
"barsyonline.co.uk",
"barsycenter.com",
"barsyonline.com",
"barsy.club",
"barsy.de",
"barsy.eu",
"barsy.in",
"barsy.info",
"barsy.io",
"barsy.me",
"barsy.menu",
"barsy.mobi",
"barsy.net",
"barsy.online",
"barsy.org",
"barsy.pro",
"barsy.pub",
"barsy.shop",
"barsy.site",
"barsy.support",
"barsy.uk",
"*.magentosite.cloud",
"mayfirst.info",
"mayfirst.org",
"hb.cldmail.ru",
"miniserver.com",
"memset.net",
"cloud.metacentrum.cz",
"custom.metacentrum.cz",
"flt.cloud.muni.cz",
"usr.cloud.muni.cz",
"meteorapp.com",
"eu.meteorapp.com",
"co.pl",
"azurecontainer.io",
"azurewebsites.net",
"azure-mobile.net",
"cloudapp.net",
"mozilla-iot.org",
"bmoattachments.org",
"net.ru",
"org.ru",
"pp.ru",
"ui.nabu.casa",
"pony.club",
"of.fashion",
"on.fashion",
"of.football",
"in.london",
"of.london",
"for.men",
"and.mom",
"for.mom",
"for.one",
"for.sale",
"of.work",
"to.work",
"nctu.me",
"bitballoon.com",
"netlify.com",
"4u.com",
"ngrok.io",
"nh-serv.co.uk",
"nfshost.com",
"dnsking.ch",
"mypi.co",
"n4t.co",
"001www.com",
"ddnslive.com",
"myiphost.com",
"forumz.info",
"16-b.it",
"32-b.it",
"64-b.it",
"soundcast.me",
"tcp4.me",
"dnsup.net",
"hicam.net",
"now-dns.net",
"ownip.net",
"vpndns.net",
"dynserv.org",
"now-dns.org",
"x443.pw",
"now-dns.top",
"ntdll.top",
"freeddns.us",
"crafting.xyz",
"zapto.xyz",
"nsupdate.info",
"nerdpol.ovh",
"blogsyte.com",
"brasilia.me",
"cable-modem.org",
"ciscofreak.com",
"collegefan.org",
"couchpotatofries.org",
"damnserver.com",
"ddns.me",
"ditchyourip.com",
"dnsfor.me",
"dnsiskinky.com",
"dvrcam.info",
"dynns.com",
"eating-organic.net",
"fantasyleague.cc",
"geekgalaxy.com",
"golffan.us",
"health-carereform.com",
"homesecuritymac.com",
"homesecuritypc.com",
"hopto.me",
"ilovecollege.info",
"loginto.me",
"mlbfan.org",
"mmafan.biz",
"myactivedirectory.com",
"mydissent.net",
"myeffect.net",
"mymediapc.net",
"mypsx.net",
"mysecuritycamera.com",
"mysecuritycamera.net",
"mysecuritycamera.org",
"net-freaks.com",
"nflfan.org",
"nhlfan.net",
"no-ip.ca",
"no-ip.co.uk",
"no-ip.net",
"noip.us",
"onthewifi.com",
"pgafan.net",
"point2this.com",
"pointto.us",
"privatizehealthinsurance.net",
"quicksytes.com",
"read-books.org",
"securitytactics.com",
"serveexchange.com",
"servehumour.com",
"servep2p.com",
"servesarcasm.com",
"stufftoread.com",
"ufcfan.org",
"unusualperson.com",
"workisboring.com",
"3utilities.com",
"bounceme.net",
"ddns.net",
"ddnsking.com",
"gotdns.ch",
"hopto.org",
"myftp.biz",
"myftp.org",
"myvnc.com",
"no-ip.biz",
"no-ip.info",
"no-ip.org",
"noip.me",
"redirectme.net",
"servebeer.com",
"serveblog.net",
"servecounterstrike.com",
"serveftp.com",
"servegame.com",
"servehalflife.com",
"servehttp.com",
"serveirc.com",
"serveminecraft.net",
"servemp3.com",
"servepics.com",
"servequake.com",
"sytes.net",
"webhop.me",
"zapto.org",
"stage.nodeart.io",
"nodum.co",
"nodum.io",
"pcloud.host",
"nyc.mn",
"nom.ae",
"nom.af",
"nom.ai",
"nom.al",
"nym.by",
"nom.bz",
"nym.bz",
"nom.cl",
"nym.ec",
"nom.gd",
"nom.ge",
"nom.gl",
"nym.gr",
"nom.gt",
"nym.gy",
"nym.hk",
"nom.hn",
"nym.ie",
"nom.im",
"nom.ke",
"nym.kz",
"nym.la",
"nym.lc",
"nom.li",
"nym.li",
"nym.lt",
"nym.lu",
"nom.lv",
"nym.me",
"nom.mk",
"nym.mn",
"nym.mx",
"nom.nu",
"nym.nz",
"nym.pe",
"nym.pt",
"nom.pw",
"nom.qa",
"nym.ro",
"nom.rs",
"nom.si",
"nym.sk",
"nom.st",
"nym.su",
"nym.sx",
"nom.tj",
"nym.tw",
"nom.ug",
"nom.uy",
"nom.vc",
"nom.vg",
"static.observableusercontent.com",
"cya.gg",
"cloudycluster.net",
"nid.io",
"opencraft.hosting",
"operaunite.com",
"skygearapp.com",
"outsystemscloud.com",
"ownprovider.com",
"own.pm",
"ox.rs",
"oy.lc",
"pgfog.com",
"pagefrontapp.com",
"art.pl",
"gliwice.pl",
"krakow.pl",
"poznan.pl",
"wroc.pl",
"zakopane.pl",
"pantheonsite.io",
"gotpantheon.com",
"mypep.link",
"perspecta.cloud",
"on-web.fr",
"*.platform.sh",
"*.platformsh.site",
"dyn53.io",
"co.bn",
"xen.prgmr.com",
"priv.at",
"prvcy.page",
"*.dweb.link",
"protonet.io",
"chirurgiens-dentistes-en-france.fr",
"byen.site",
"pubtls.org",
"qualifioapp.com",
"qbuser.com",
"instantcloud.cn",
"ras.ru",
"qa2.com",
"qcx.io",
"*.sys.qcx.io",
"dev-myqnapcloud.com",
"alpha-myqnapcloud.com",
"myqnapcloud.com",
"*.quipelements.com",
"vapor.cloud",
"vaporcloud.io",
"rackmaze.com",
"rackmaze.net",
"*.on-k3s.io",
"*.on-rancher.cloud",
"*.on-rio.io",
"readthedocs.io",
"rhcloud.com",
"app.render.com",
"onrender.com",
"repl.co",
"repl.run",
"resindevice.io",
"devices.resinstaging.io",
"hzc.io",
"wellbeingzone.eu",
"ptplus.fit",
"wellbeingzone.co.uk",
"git-pages.rit.edu",
"sandcats.io",
"logoip.de",
"logoip.com",
"schokokeks.net",
"gov.scot",
"scrysec.com",
"firewall-gateway.com",
"firewall-gateway.de",
"my-gateway.de",
"my-router.de",
"spdns.de",
"spdns.eu",
"firewall-gateway.net",
"my-firewall.org",
"myfirewall.org",
"spdns.org",
"senseering.net",
"biz.ua",
"co.ua",
"pp.ua",
"shiftedit.io",
"myshopblocks.com",
"shopitsite.com",
"mo-siemens.io",
"1kapp.com",
"appchizi.com",
"applinzi.com",
"sinaapp.com",
"vipsinaapp.com",
"siteleaf.net",
"bounty-full.com",
"alpha.bounty-full.com",
"beta.bounty-full.com",
"stackhero-network.com",
"static.land",
"dev.static.land",
"sites.static.land",
"apps.lair.io",
"*.stolos.io",
"spacekit.io",
"customer.speedpartner.de",
"api.stdlib.com",
"storj.farm",
"utwente.io",
"soc.srcf.net",
"user.srcf.net",
"temp-dns.com",
"applicationcloud.io",
"scapp.io",
"*.s5y.io",
"*.sensiosite.cloud",
"syncloud.it",
"diskstation.me",
"dscloud.biz",
"dscloud.me",
"dscloud.mobi",
"dsmynas.com",
"dsmynas.net",
"dsmynas.org",
"familyds.com",
"familyds.net",
"familyds.org",
"i234.me",
"myds.me",
"synology.me",
"vpnplus.to",
"direct.quickconnect.to",
"taifun-dns.de",
"gda.pl",
"gdansk.pl",
"gdynia.pl",
"med.pl",
"sopot.pl",
"edugit.org",
"telebit.app",
"telebit.io",
"*.telebit.xyz",
"gwiddle.co.uk",
"thingdustdata.com",
"cust.dev.thingdust.io",
"cust.disrec.thingdust.io",
"cust.prod.thingdust.io",
"cust.testing.thingdust.io",
"arvo.network",
"azimuth.network",
"bloxcms.com",
"townnews-staging.com",
"12hp.at",
"2ix.at",
"4lima.at",
"lima-city.at",
"12hp.ch",
"2ix.ch",
"4lima.ch",
"lima-city.ch",
"trafficplex.cloud",
"de.cool",
"12hp.de",
"2ix.de",
"4lima.de",
"lima-city.de",
"1337.pictures",
"clan.rip",
"lima-city.rocks",
"webspace.rocks",
"lima.zone",
"*.transurl.be",
"*.transurl.eu",
"*.transurl.nl",
"tuxfamily.org",
"dd-dns.de",
"diskstation.eu",
"diskstation.org",
"dray-dns.de",
"draydns.de",
"dyn-vpn.de",
"dynvpn.de",
"mein-vigor.de",
"my-vigor.de",
"my-wan.de",
"syno-ds.de",
"synology-diskstation.de",
"synology-ds.de",
"uber.space",
"*.uberspace.de",
"hk.com",
"hk.org",
"ltd.hk",
"inc.hk",
"virtualuser.de",
"virtual-user.de",
"urown.cloud",
"dnsupdate.info",
"lib.de.us",
"2038.io",
"router.management",
"v-info.info",
"voorloper.cloud",
"v.ua",
"wafflecell.com",
"*.webhare.dev",
"wedeploy.io",
"wedeploy.me",
"wedeploy.sh",
"remotewd.com",
"wmflabs.org",
"myforum.community",
"community-pro.de",
"diskussionsbereich.de",
"community-pro.net",
"meinforum.net",
"half.host",
"xnbay.com",
"u2.xnbay.com",
"u2-local.xnbay.com",
"cistron.nl",
"demon.nl",
"xs4all.space",
"yandexcloud.net",
"storage.yandexcloud.net",
"website.yandexcloud.net",
"official.academy",
"yolasite.com",
"ybo.faith",
"yombo.me",
"homelink.one",
"ybo.party",
"ybo.review",
"ybo.science",
"ybo.trade",
"nohost.me",
"noho.st",
"za.net",
"za.org",
"now.sh",
"bss.design",
"basicserver.io",
"virtualserver.io",
"enterprisecloud.nu"
]
},{}],2:[function(require,module,exports){
/*eslint no-var:0, prefer-arrow-callback: 0, object-shorthand: 0 */
'use strict';


var Punycode = require('punycode');


var internals = {};


//
// Read rules from file.
//
internals.rules = require('./data/rules.json').map(function (rule) {

  return {
    rule: rule,
    suffix: rule.replace(/^(\*\.|\!)/, ''),
    punySuffix: -1,
    wildcard: rule.charAt(0) === '*',
    exception: rule.charAt(0) === '!'
  };
});


//
// Check is given string ends with `suffix`.
//
internals.endsWith = function (str, suffix) {

  return str.indexOf(suffix, str.length - suffix.length) !== -1;
};


//
// Find rule for a given domain.
//
internals.findRule = function (domain) {

  var punyDomain = Punycode.toASCII(domain);
  return internals.rules.reduce(function (memo, rule) {

    if (rule.punySuffix === -1){
      rule.punySuffix = Punycode.toASCII(rule.suffix);
    }
    if (!internals.endsWith(punyDomain, '.' + rule.punySuffix) && punyDomain !== rule.punySuffix) {
      return memo;
    }
    // This has been commented out as it never seems to run. This is because
    // sub tlds always appear after their parents and we never find a shorter
    // match.
    //if (memo) {
    //  var memoSuffix = Punycode.toASCII(memo.suffix);
    //  if (memoSuffix.length >= punySuffix.length) {
    //    return memo;
    //  }
    //}
    return rule;
  }, null);
};


//
// Error codes and messages.
//
exports.errorCodes = {
  DOMAIN_TOO_SHORT: 'Domain name too short.',
  DOMAIN_TOO_LONG: 'Domain name too long. It should be no more than 255 chars.',
  LABEL_STARTS_WITH_DASH: 'Domain name label can not start with a dash.',
  LABEL_ENDS_WITH_DASH: 'Domain name label can not end with a dash.',
  LABEL_TOO_LONG: 'Domain name label should be at most 63 chars long.',
  LABEL_TOO_SHORT: 'Domain name label should be at least 1 character long.',
  LABEL_INVALID_CHARS: 'Domain name label can only contain alphanumeric characters or dashes.'
};


//
// Validate domain name and throw if not valid.
//
// From wikipedia:
//
// Hostnames are composed of series of labels concatenated with dots, as are all
// domain names. Each label must be between 1 and 63 characters long, and the
// entire hostname (including the delimiting dots) has a maximum of 255 chars.
//
// Allowed chars:
//
// * `a-z`
// * `0-9`
// * `-` but not as a starting or ending character
// * `.` as a separator for the textual portions of a domain name
//
// * http://en.wikipedia.org/wiki/Domain_name
// * http://en.wikipedia.org/wiki/Hostname
//
internals.validate = function (input) {

  // Before we can validate we need to take care of IDNs with unicode chars.
  var ascii = Punycode.toASCII(input);

  if (ascii.length < 1) {
    return 'DOMAIN_TOO_SHORT';
  }
  if (ascii.length > 255) {
    return 'DOMAIN_TOO_LONG';
  }

  // Check each part's length and allowed chars.
  var labels = ascii.split('.');
  var label;

  for (var i = 0; i < labels.length; ++i) {
    label = labels[i];
    if (!label.length) {
      return 'LABEL_TOO_SHORT';
    }
    if (label.length > 63) {
      return 'LABEL_TOO_LONG';
    }
    if (label.charAt(0) === '-') {
      return 'LABEL_STARTS_WITH_DASH';
    }
    if (label.charAt(label.length - 1) === '-') {
      return 'LABEL_ENDS_WITH_DASH';
    }
    if (!/^[a-z0-9\-]+$/.test(label)) {
      return 'LABEL_INVALID_CHARS';
    }
  }
};


//
// Public API
//


//
// Parse domain.
//
exports.parse = function (input) {

  if (typeof input !== 'string') {
    throw new TypeError('Domain name must be a string.');
  }

  // Force domain to lowercase.
  var domain = input.slice(0).toLowerCase();

  // Handle FQDN.
  // TODO: Simply remove trailing dot?
  if (domain.charAt(domain.length - 1) === '.') {
    domain = domain.slice(0, domain.length - 1);
  }

  // Validate and sanitise input.
  var error = internals.validate(domain);
  if (error) {
    return {
      input: input,
      error: {
        message: exports.errorCodes[error],
        code: error
      }
    };
  }

  var parsed = {
    input: input,
    tld: null,
    sld: null,
    domain: null,
    subdomain: null,
    listed: false
  };

  var domainParts = domain.split('.');

  // Non-Internet TLD
  if (domainParts[domainParts.length - 1] === 'local') {
    return parsed;
  }

  var handlePunycode = function () {

    if (!/xn--/.test(domain)) {
      return parsed;
    }
    if (parsed.domain) {
      parsed.domain = Punycode.toASCII(parsed.domain);
    }
    if (parsed.subdomain) {
      parsed.subdomain = Punycode.toASCII(parsed.subdomain);
    }
    return parsed;
  };

  var rule = internals.findRule(domain);

  // Unlisted tld.
  if (!rule) {
    if (domainParts.length < 2) {
      return parsed;
    }
    parsed.tld = domainParts.pop();
    parsed.sld = domainParts.pop();
    parsed.domain = [parsed.sld, parsed.tld].join('.');
    if (domainParts.length) {
      parsed.subdomain = domainParts.pop();
    }
    return handlePunycode();
  }

  // At this point we know the public suffix is listed.
  parsed.listed = true;

  var tldParts = rule.suffix.split('.');
  var privateParts = domainParts.slice(0, domainParts.length - tldParts.length);

  if (rule.exception) {
    privateParts.push(tldParts.shift());
  }

  parsed.tld = tldParts.join('.');

  if (!privateParts.length) {
    return handlePunycode();
  }

  if (rule.wildcard) {
    tldParts.unshift(privateParts.pop());
    parsed.tld = tldParts.join('.');
  }

  if (!privateParts.length) {
    return handlePunycode();
  }

  parsed.sld = privateParts.pop();
  parsed.domain = [parsed.sld,  parsed.tld].join('.');

  if (privateParts.length) {
    parsed.subdomain = privateParts.join('.');
  }

  return handlePunycode();
};


//
// Get domain.
//
exports.get = function (domain) {

  if (!domain) {
    return null;
  }
  return exports.parse(domain).domain || null;
};


//
// Check whether domain belongs to a known public suffix.
//
exports.isValid = function (domain) {

  var parsed = exports.parse(domain);
  return Boolean(parsed.domain && parsed.listed);
};

},{"./data/rules.json":1,"punycode":3}],3:[function(require,module,exports){
(function (global){
/*! https://mths.be/punycode v1.4.1 by @mathias */
;(function(root) {

	/** Detect free variables */
	var freeExports = typeof exports == 'object' && exports &&
		!exports.nodeType && exports;
	var freeModule = typeof module == 'object' && module &&
		!module.nodeType && module;
	var freeGlobal = typeof global == 'object' && global;
	if (
		freeGlobal.global === freeGlobal ||
		freeGlobal.window === freeGlobal ||
		freeGlobal.self === freeGlobal
	) {
		root = freeGlobal;
	}

	/**
	 * The `punycode` object.
	 * @name punycode
	 * @type Object
	 */
	var punycode,

	/** Highest positive signed 32-bit float value */
	maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1

	/** Bootstring parameters */
	base = 36,
	tMin = 1,
	tMax = 26,
	skew = 38,
	damp = 700,
	initialBias = 72,
	initialN = 128, // 0x80
	delimiter = '-', // '\x2D'

	/** Regular expressions */
	regexPunycode = /^xn--/,
	regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
	regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators

	/** Error messages */
	errors = {
		'overflow': 'Overflow: input needs wider integers to process',
		'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
		'invalid-input': 'Invalid input'
	},

	/** Convenience shortcuts */
	baseMinusTMin = base - tMin,
	floor = Math.floor,
	stringFromCharCode = String.fromCharCode,

	/** Temporary variable */
	key;

	/*--------------------------------------------------------------------------*/

	/**
	 * A generic error utility function.
	 * @private
	 * @param {String} type The error type.
	 * @returns {Error} Throws a `RangeError` with the applicable error message.
	 */
	function error(type) {
		throw new RangeError(errors[type]);
	}

	/**
	 * A generic `Array#map` utility function.
	 * @private
	 * @param {Array} array The array to iterate over.
	 * @param {Function} callback The function that gets called for every array
	 * item.
	 * @returns {Array} A new array of values returned by the callback function.
	 */
	function map(array, fn) {
		var length = array.length;
		var result = [];
		while (length--) {
			result[length] = fn(array[length]);
		}
		return result;
	}

	/**
	 * A simple `Array#map`-like wrapper to work with domain name strings or email
	 * addresses.
	 * @private
	 * @param {String} domain The domain name or email address.
	 * @param {Function} callback The function that gets called for every
	 * character.
	 * @returns {Array} A new string of characters returned by the callback
	 * function.
	 */
	function mapDomain(string, fn) {
		var parts = string.split('@');
		var result = '';
		if (parts.length > 1) {
			// In email addresses, only the domain name should be punycoded. Leave
			// the local part (i.e. everything up to `@`) intact.
			result = parts[0] + '@';
			string = parts[1];
		}
		// Avoid `split(regex)` for IE8 compatibility. See #17.
		string = string.replace(regexSeparators, '\x2E');
		var labels = string.split('.');
		var encoded = map(labels, fn).join('.');
		return result + encoded;
	}

	/**
	 * Creates an array containing the numeric code points of each Unicode
	 * character in the string. While JavaScript uses UCS-2 internally,
	 * this function will convert a pair of surrogate halves (each of which
	 * UCS-2 exposes as separate characters) into a single code point,
	 * matching UTF-16.
	 * @see `punycode.ucs2.encode`
	 * @see <https://mathiasbynens.be/notes/javascript-encoding>
	 * @memberOf punycode.ucs2
	 * @name decode
	 * @param {String} string The Unicode input string (UCS-2).
	 * @returns {Array} The new array of code points.
	 */
	function ucs2decode(string) {
		var output = [],
		    counter = 0,
		    length = string.length,
		    value,
		    extra;
		while (counter < length) {
			value = string.charCodeAt(counter++);
			if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
				// high surrogate, and there is a next character
				extra = string.charCodeAt(counter++);
				if ((extra & 0xFC00) == 0xDC00) { // low surrogate
					output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
				} else {
					// unmatched surrogate; only append this code unit, in case the next
					// code unit is the high surrogate of a surrogate pair
					output.push(value);
					counter--;
				}
			} else {
				output.push(value);
			}
		}
		return output;
	}

	/**
	 * Creates a string based on an array of numeric code points.
	 * @see `punycode.ucs2.decode`
	 * @memberOf punycode.ucs2
	 * @name encode
	 * @param {Array} codePoints The array of numeric code points.
	 * @returns {String} The new Unicode string (UCS-2).
	 */
	function ucs2encode(array) {
		return map(array, function(value) {
			var output = '';
			if (value > 0xFFFF) {
				value -= 0x10000;
				output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
				value = 0xDC00 | value & 0x3FF;
			}
			output += stringFromCharCode(value);
			return output;
		}).join('');
	}

	/**
	 * Converts a basic code point into a digit/integer.
	 * @see `digitToBasic()`
	 * @private
	 * @param {Number} codePoint The basic numeric code point value.
	 * @returns {Number} The numeric value of a basic code point (for use in
	 * representing integers) in the range `0` to `base - 1`, or `base` if
	 * the code point does not represent a value.
	 */
	function basicToDigit(codePoint) {
		if (codePoint - 48 < 10) {
			return codePoint - 22;
		}
		if (codePoint - 65 < 26) {
			return codePoint - 65;
		}
		if (codePoint - 97 < 26) {
			return codePoint - 97;
		}
		return base;
	}

	/**
	 * Converts a digit/integer into a basic code point.
	 * @see `basicToDigit()`
	 * @private
	 * @param {Number} digit The numeric value of a basic code point.
	 * @returns {Number} The basic code point whose value (when used for
	 * representing integers) is `digit`, which needs to be in the range
	 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
	 * used; else, the lowercase form is used. The behavior is undefined
	 * if `flag` is non-zero and `digit` has no uppercase form.
	 */
	function digitToBasic(digit, flag) {
		//  0..25 map to ASCII a..z or A..Z
		// 26..35 map to ASCII 0..9
		return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
	}

	/**
	 * Bias adaptation function as per section 3.4 of RFC 3492.
	 * https://tools.ietf.org/html/rfc3492#section-3.4
	 * @private
	 */
	function adapt(delta, numPoints, firstTime) {
		var k = 0;
		delta = firstTime ? floor(delta / damp) : delta >> 1;
		delta += floor(delta / numPoints);
		for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
			delta = floor(delta / baseMinusTMin);
		}
		return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
	}

	/**
	 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
	 * symbols.
	 * @memberOf punycode
	 * @param {String} input The Punycode string of ASCII-only symbols.
	 * @returns {String} The resulting string of Unicode symbols.
	 */
	function decode(input) {
		// Don't use UCS-2
		var output = [],
		    inputLength = input.length,
		    out,
		    i = 0,
		    n = initialN,
		    bias = initialBias,
		    basic,
		    j,
		    index,
		    oldi,
		    w,
		    k,
		    digit,
		    t,
		    /** Cached calculation results */
		    baseMinusT;

		// Handle the basic code points: let `basic` be the number of input code
		// points before the last delimiter, or `0` if there is none, then copy
		// the first basic code points to the output.

		basic = input.lastIndexOf(delimiter);
		if (basic < 0) {
			basic = 0;
		}

		for (j = 0; j < basic; ++j) {
			// if it's not a basic code point
			if (input.charCodeAt(j) >= 0x80) {
				error('not-basic');
			}
			output.push(input.charCodeAt(j));
		}

		// Main decoding loop: start just after the last delimiter if any basic code
		// points were copied; start at the beginning otherwise.

		for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {

			// `index` is the index of the next character to be consumed.
			// Decode a generalized variable-length integer into `delta`,
			// which gets added to `i`. The overflow checking is easier
			// if we increase `i` as we go, then subtract off its starting
			// value at the end to obtain `delta`.
			for (oldi = i, w = 1, k = base; /* no condition */; k += base) {

				if (index >= inputLength) {
					error('invalid-input');
				}

				digit = basicToDigit(input.charCodeAt(index++));

				if (digit >= base || digit > floor((maxInt - i) / w)) {
					error('overflow');
				}

				i += digit * w;
				t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);

				if (digit < t) {
					break;
				}

				baseMinusT = base - t;
				if (w > floor(maxInt / baseMinusT)) {
					error('overflow');
				}

				w *= baseMinusT;

			}

			out = output.length + 1;
			bias = adapt(i - oldi, out, oldi == 0);

			// `i` was supposed to wrap around from `out` to `0`,
			// incrementing `n` each time, so we'll fix that now:
			if (floor(i / out) > maxInt - n) {
				error('overflow');
			}

			n += floor(i / out);
			i %= out;

			// Insert `n` at position `i` of the output
			output.splice(i++, 0, n);

		}

		return ucs2encode(output);
	}

	/**
	 * Converts a string of Unicode symbols (e.g. a domain name label) to a
	 * Punycode string of ASCII-only symbols.
	 * @memberOf punycode
	 * @param {String} input The string of Unicode symbols.
	 * @returns {String} The resulting Punycode string of ASCII-only symbols.
	 */
	function encode(input) {
		var n,
		    delta,
		    handledCPCount,
		    basicLength,
		    bias,
		    j,
		    m,
		    q,
		    k,
		    t,
		    currentValue,
		    output = [],
		    /** `inputLength` will hold the number of code points in `input`. */
		    inputLength,
		    /** Cached calculation results */
		    handledCPCountPlusOne,
		    baseMinusT,
		    qMinusT;

		// Convert the input in UCS-2 to Unicode
		input = ucs2decode(input);

		// Cache the length
		inputLength = input.length;

		// Initialize the state
		n = initialN;
		delta = 0;
		bias = initialBias;

		// Handle the basic code points
		for (j = 0; j < inputLength; ++j) {
			currentValue = input[j];
			if (currentValue < 0x80) {
				output.push(stringFromCharCode(currentValue));
			}
		}

		handledCPCount = basicLength = output.length;

		// `handledCPCount` is the number of code points that have been handled;
		// `basicLength` is the number of basic code points.

		// Finish the basic string - if it is not empty - with a delimiter
		if (basicLength) {
			output.push(delimiter);
		}

		// Main encoding loop:
		while (handledCPCount < inputLength) {

			// All non-basic code points < n have been handled already. Find the next
			// larger one:
			for (m = maxInt, j = 0; j < inputLength; ++j) {
				currentValue = input[j];
				if (currentValue >= n && currentValue < m) {
					m = currentValue;
				}
			}

			// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
			// but guard against overflow
			handledCPCountPlusOne = handledCPCount + 1;
			if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
				error('overflow');
			}

			delta += (m - n) * handledCPCountPlusOne;
			n = m;

			for (j = 0; j < inputLength; ++j) {
				currentValue = input[j];

				if (currentValue < n && ++delta > maxInt) {
					error('overflow');
				}

				if (currentValue == n) {
					// Represent delta as a generalized variable-length integer
					for (q = delta, k = base; /* no condition */; k += base) {
						t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
						if (q < t) {
							break;
						}
						qMinusT = q - t;
						baseMinusT = base - t;
						output.push(
							stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
						);
						q = floor(qMinusT / baseMinusT);
					}

					output.push(stringFromCharCode(digitToBasic(q, 0)));
					bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
					delta = 0;
					++handledCPCount;
				}
			}

			++delta;
			++n;

		}
		return output.join('');
	}

	/**
	 * Converts a Punycode string representing a domain name or an email address
	 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
	 * it doesn't matter if you call it on a string that has already been
	 * converted to Unicode.
	 * @memberOf punycode
	 * @param {String} input The Punycoded domain name or email address to
	 * convert to Unicode.
	 * @returns {String} The Unicode representation of the given Punycode
	 * string.
	 */
	function toUnicode(input) {
		return mapDomain(input, function(string) {
			return regexPunycode.test(string)
				? decode(string.slice(4).toLowerCase())
				: string;
		});
	}

	/**
	 * Converts a Unicode string representing a domain name or an email address to
	 * Punycode. Only the non-ASCII parts of the domain name will be converted,
	 * i.e. it doesn't matter if you call it with a domain that's already in
	 * ASCII.
	 * @memberOf punycode
	 * @param {String} input The domain name or email address to convert, as a
	 * Unicode string.
	 * @returns {String} The Punycode representation of the given domain name or
	 * email address.
	 */
	function toASCII(input) {
		return mapDomain(input, function(string) {
			return regexNonASCII.test(string)
				? 'xn--' + encode(string)
				: string;
		});
	}

	/*--------------------------------------------------------------------------*/

	/** Define the public API */
	punycode = {
		/**
		 * A string representing the current Punycode.js version number.
		 * @memberOf punycode
		 * @type String
		 */
		'version': '1.4.1',
		/**
		 * An object of methods to convert from JavaScript's internal character
		 * representation (UCS-2) to Unicode code points, and back.
		 * @see <https://mathiasbynens.be/notes/javascript-encoding>
		 * @memberOf punycode
		 * @type Object
		 */
		'ucs2': {
			'decode': ucs2decode,
			'encode': ucs2encode
		},
		'decode': decode,
		'encode': encode,
		'toASCII': toASCII,
		'toUnicode': toUnicode
	};

	/** Expose `punycode` */
	// Some AMD build optimizers, like r.js, check for specific condition patterns
	// like the following:
	if (
		typeof define == 'function' &&
		typeof define.amd == 'object' &&
		define.amd
	) {
		define('punycode', function() {
			return punycode;
		});
	} else if (freeExports && freeModule) {
		if (module.exports == freeExports) {
			// in Node.js, io.js, or RingoJS v0.8.0+
			freeModule.exports = punycode;
		} else {
			// in Narwhal or RingoJS v0.7.0-
			for (key in punycode) {
				punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
			}
		}
	} else {
		// in Rhino or a web browser
		root.punycode = punycode;
	}

}(this));

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}]},{},[2])(2)
});
!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).psl=a()}}(function(){return function s(m,t,u){function r(o,a){if(!t[o]){if(!m[o]){var i="function"==typeof require&&require;if(!a&&i)return i(o,!0);if(p)return p(o,!0);var e=new Error("Cannot find module '"+o+"'");throw e.code="MODULE_NOT_FOUND",e}var n=t[o]={exports:{}};m[o][0].call(n.exports,function(a){return r(m[o][1][a]||a)},n,n.exports,s,m,t,u)}return t[o].exports}for(var p="function"==typeof require&&require,a=0;a<u.length;a++)r(u[a]);return r}({1:[function(a,o,i){o.exports=["ac","com.ac","edu.ac","gov.ac","net.ac","mil.ac","org.ac","ad","nom.ad","ae","co.ae","net.ae","org.ae","sch.ae","ac.ae","gov.ae","mil.ae","aero","accident-investigation.aero","accident-prevention.aero","aerobatic.aero","aeroclub.aero","aerodrome.aero","agents.aero","aircraft.aero","airline.aero","airport.aero","air-surveillance.aero","airtraffic.aero","air-traffic-control.aero","ambulance.aero","amusement.aero","association.aero","author.aero","ballooning.aero","broker.aero","caa.aero","cargo.aero","catering.aero","certification.aero","championship.aero","charter.aero","civilaviation.aero","club.aero","conference.aero","consultant.aero","consulting.aero","control.aero","council.aero","crew.aero","design.aero","dgca.aero","educator.aero","emergency.aero","engine.aero","engineer.aero","entertainment.aero","equipment.aero","exchange.aero","express.aero","federation.aero","flight.aero","freight.aero","fuel.aero","gliding.aero","government.aero","groundhandling.aero","group.aero","hanggliding.aero","homebuilt.aero","insurance.aero","journal.aero","journalist.aero","leasing.aero","logistics.aero","magazine.aero","maintenance.aero","media.aero","microlight.aero","modelling.aero","navigation.aero","parachuting.aero","paragliding.aero","passenger-association.aero","pilot.aero","press.aero","production.aero","recreation.aero","repbody.aero","res.aero","research.aero","rotorcraft.aero","safety.aero","scientist.aero","services.aero","show.aero","skydiving.aero","software.aero","student.aero","trader.aero","trading.aero","trainer.aero","union.aero","workinggroup.aero","works.aero","af","gov.af","com.af","org.af","net.af","edu.af","ag","com.ag","org.ag","net.ag","co.ag","nom.ag","ai","off.ai","com.ai","net.ai","org.ai","al","com.al","edu.al","gov.al","mil.al","net.al","org.al","am","co.am","com.am","commune.am","net.am","org.am","ao","ed.ao","gv.ao","og.ao","co.ao","pb.ao","it.ao","aq","ar","com.ar","edu.ar","gob.ar","gov.ar","int.ar","mil.ar","musica.ar","net.ar","org.ar","tur.ar","arpa","e164.arpa","in-addr.arpa","ip6.arpa","iris.arpa","uri.arpa","urn.arpa","as","gov.as","asia","at","ac.at","co.at","gv.at","or.at","au","com.au","net.au","org.au","edu.au","gov.au","asn.au","id.au","info.au","conf.au","oz.au","act.au","nsw.au","nt.au","qld.au","sa.au","tas.au","vic.au","wa.au","act.edu.au","catholic.edu.au","nsw.edu.au","nt.edu.au","qld.edu.au","sa.edu.au","tas.edu.au","vic.edu.au","wa.edu.au","qld.gov.au","sa.gov.au","tas.gov.au","vic.gov.au","wa.gov.au","education.tas.edu.au","schools.nsw.edu.au","aw","com.aw","ax","az","com.az","net.az","int.az","gov.az","org.az","edu.az","info.az","pp.az","mil.az","name.az","pro.az","biz.az","ba","com.ba","edu.ba","gov.ba","mil.ba","net.ba","org.ba","bb","biz.bb","co.bb","com.bb","edu.bb","gov.bb","info.bb","net.bb","org.bb","store.bb","tv.bb","*.bd","be","ac.be","bf","gov.bf","bg","a.bg","b.bg","c.bg","d.bg","e.bg","f.bg","g.bg","h.bg","i.bg","j.bg","k.bg","l.bg","m.bg","n.bg","o.bg","p.bg","q.bg","r.bg","s.bg","t.bg","u.bg","v.bg","w.bg","x.bg","y.bg","z.bg","0.bg","1.bg","2.bg","3.bg","4.bg","5.bg","6.bg","7.bg","8.bg","9.bg","bh","com.bh","edu.bh","net.bh","org.bh","gov.bh","bi","co.bi","com.bi","edu.bi","or.bi","org.bi","biz","bj","asso.bj","barreau.bj","gouv.bj","bm","com.bm","edu.bm","gov.bm","net.bm","org.bm","bn","com.bn","edu.bn","gov.bn","net.bn","org.bn","bo","com.bo","edu.bo","gob.bo","int.bo","org.bo","net.bo","mil.bo","tv.bo","web.bo","academia.bo","agro.bo","arte.bo","blog.bo","bolivia.bo","ciencia.bo","cooperativa.bo","democracia.bo","deporte.bo","ecologia.bo","economia.bo","empresa.bo","indigena.bo","industria.bo","info.bo","medicina.bo","movimiento.bo","musica.bo","natural.bo","nombre.bo","noticias.bo","patria.bo","politica.bo","profesional.bo","plurinacional.bo","pueblo.bo","revista.bo","salud.bo","tecnologia.bo","tksat.bo","transporte.bo","wiki.bo","br","9guacu.br","abc.br","adm.br","adv.br","agr.br","aju.br","am.br","anani.br","aparecida.br","arq.br","art.br","ato.br","b.br","barueri.br","belem.br","bhz.br","bio.br","blog.br","bmd.br","boavista.br","bsb.br","campinagrande.br","campinas.br","caxias.br","cim.br","cng.br","cnt.br","com.br","contagem.br","coop.br","cri.br","cuiaba.br","curitiba.br","def.br","ecn.br","eco.br","edu.br","emp.br","eng.br","esp.br","etc.br","eti.br","far.br","feira.br","flog.br","floripa.br","fm.br","fnd.br","fortal.br","fot.br","foz.br","fst.br","g12.br","ggf.br","goiania.br","gov.br","ac.gov.br","al.gov.br","am.gov.br","ap.gov.br","ba.gov.br","ce.gov.br","df.gov.br","es.gov.br","go.gov.br","ma.gov.br","mg.gov.br","ms.gov.br","mt.gov.br","pa.gov.br","pb.gov.br","pe.gov.br","pi.gov.br","pr.gov.br","rj.gov.br","rn.gov.br","ro.gov.br","rr.gov.br","rs.gov.br","sc.gov.br","se.gov.br","sp.gov.br","to.gov.br","gru.br","imb.br","ind.br","inf.br","jab.br","jampa.br","jdf.br","joinville.br","jor.br","jus.br","leg.br","lel.br","londrina.br","macapa.br","maceio.br","manaus.br","maringa.br","mat.br","med.br","mil.br","morena.br","mp.br","mus.br","natal.br","net.br","niteroi.br","*.nom.br","not.br","ntr.br","odo.br","ong.br","org.br","osasco.br","palmas.br","poa.br","ppg.br","pro.br","psc.br","psi.br","pvh.br","qsl.br","radio.br","rec.br","recife.br","ribeirao.br","rio.br","riobranco.br","riopreto.br","salvador.br","sampa.br","santamaria.br","santoandre.br","saobernardo.br","saogonca.br","sjc.br","slg.br","slz.br","sorocaba.br","srv.br","taxi.br","tc.br","teo.br","the.br","tmp.br","trd.br","tur.br","tv.br","udi.br","vet.br","vix.br","vlog.br","wiki.br","zlg.br","bs","com.bs","net.bs","org.bs","edu.bs","gov.bs","bt","com.bt","edu.bt","gov.bt","net.bt","org.bt","bv","bw","co.bw","org.bw","by","gov.by","mil.by","com.by","of.by","bz","com.bz","net.bz","org.bz","edu.bz","gov.bz","ca","ab.ca","bc.ca","mb.ca","nb.ca","nf.ca","nl.ca","ns.ca","nt.ca","nu.ca","on.ca","pe.ca","qc.ca","sk.ca","yk.ca","gc.ca","cat","cc","cd","gov.cd","cf","cg","ch","ci","org.ci","or.ci","com.ci","co.ci","edu.ci","ed.ci","ac.ci","net.ci","go.ci","asso.ci","aÃ©roport.ci","int.ci","presse.ci","md.ci","gouv.ci","*.ck","!www.ck","cl","aprendemas.cl","co.cl","gob.cl","gov.cl","mil.cl","cm","co.cm","com.cm","gov.cm","net.cm","cn","ac.cn","com.cn","edu.cn","gov.cn","net.cn","org.cn","mil.cn","å…¬å�¸.cn","ç½‘ç»œ.cn","ç¶²çµ¡.cn","ah.cn","bj.cn","cq.cn","fj.cn","gd.cn","gs.cn","gz.cn","gx.cn","ha.cn","hb.cn","he.cn","hi.cn","hl.cn","hn.cn","jl.cn","js.cn","jx.cn","ln.cn","nm.cn","nx.cn","qh.cn","sc.cn","sd.cn","sh.cn","sn.cn","sx.cn","tj.cn","xj.cn","xz.cn","yn.cn","zj.cn","hk.cn","mo.cn","tw.cn","co","arts.co","com.co","edu.co","firm.co","gov.co","info.co","int.co","mil.co","net.co","nom.co","org.co","rec.co","web.co","com","coop","cr","ac.cr","co.cr","ed.cr","fi.cr","go.cr","or.cr","sa.cr","cu","com.cu","edu.cu","org.cu","net.cu","gov.cu","inf.cu","cv","cw","com.cw","edu.cw","net.cw","org.cw","cx","gov.cx","cy","ac.cy","biz.cy","com.cy","ekloges.cy","gov.cy","ltd.cy","name.cy","net.cy","org.cy","parliament.cy","press.cy","pro.cy","tm.cy","cz","de","dj","dk","dm","com.dm","net.dm","org.dm","edu.dm","gov.dm","do","art.do","com.do","edu.do","gob.do","gov.do","mil.do","net.do","org.do","sld.do","web.do","dz","com.dz","org.dz","net.dz","gov.dz","edu.dz","asso.dz","pol.dz","art.dz","ec","com.ec","info.ec","net.ec","fin.ec","k12.ec","med.ec","pro.ec","org.ec","edu.ec","gov.ec","gob.ec","mil.ec","edu","ee","edu.ee","gov.ee","riik.ee","lib.ee","med.ee","com.ee","pri.ee","aip.ee","org.ee","fie.ee","eg","com.eg","edu.eg","eun.eg","gov.eg","mil.eg","name.eg","net.eg","org.eg","sci.eg","*.er","es","com.es","nom.es","org.es","gob.es","edu.es","et","com.et","gov.et","org.et","edu.et","biz.et","name.et","info.et","net.et","eu","fi","aland.fi","fj","ac.fj","biz.fj","com.fj","gov.fj","info.fj","mil.fj","name.fj","net.fj","org.fj","pro.fj","*.fk","fm","fo","fr","asso.fr","com.fr","gouv.fr","nom.fr","prd.fr","tm.fr","aeroport.fr","avocat.fr","avoues.fr","cci.fr","chambagri.fr","chirurgiens-dentistes.fr","experts-comptables.fr","geometre-expert.fr","greta.fr","huissier-justice.fr","medecin.fr","notaires.fr","pharmacien.fr","port.fr","veterinaire.fr","ga","gb","gd","ge","com.ge","edu.ge","gov.ge","org.ge","mil.ge","net.ge","pvt.ge","gf","gg","co.gg","net.gg","org.gg","gh","com.gh","edu.gh","gov.gh","org.gh","mil.gh","gi","com.gi","ltd.gi","gov.gi","mod.gi","edu.gi","org.gi","gl","co.gl","com.gl","edu.gl","net.gl","org.gl","gm","gn","ac.gn","com.gn","edu.gn","gov.gn","org.gn","net.gn","gov","gp","com.gp","net.gp","mobi.gp","edu.gp","org.gp","asso.gp","gq","gr","com.gr","edu.gr","net.gr","org.gr","gov.gr","gs","gt","com.gt","edu.gt","gob.gt","ind.gt","mil.gt","net.gt","org.gt","gu","com.gu","edu.gu","gov.gu","guam.gu","info.gu","net.gu","org.gu","web.gu","gw","gy","co.gy","com.gy","edu.gy","gov.gy","net.gy","org.gy","hk","com.hk","edu.hk","gov.hk","idv.hk","net.hk","org.hk","å…¬å�¸.hk","æ•™è‚².hk","æ•Žè‚².hk","æ”¿åºœ.hk","å€‹äºº.hk","ä¸ªäºº.hk","ç®‡äºº.hk","ç¶²ç»œ.hk","ç½‘ç»œ.hk","ç»„ç¹”.hk","ç¶²çµ¡.hk","ç½‘çµ¡.hk","ç»„ç»‡.hk","çµ„ç¹”.hk","çµ„ç»‡.hk","hm","hn","com.hn","edu.hn","org.hn","net.hn","mil.hn","gob.hn","hr","iz.hr","from.hr","name.hr","com.hr","ht","com.ht","shop.ht","firm.ht","info.ht","adult.ht","net.ht","pro.ht","org.ht","med.ht","art.ht","coop.ht","pol.ht","asso.ht","edu.ht","rel.ht","gouv.ht","perso.ht","hu","co.hu","info.hu","org.hu","priv.hu","sport.hu","tm.hu","2000.hu","agrar.hu","bolt.hu","casino.hu","city.hu","erotica.hu","erotika.hu","film.hu","forum.hu","games.hu","hotel.hu","ingatlan.hu","jogasz.hu","konyvelo.hu","lakas.hu","media.hu","news.hu","reklam.hu","sex.hu","shop.hu","suli.hu","szex.hu","tozsde.hu","utazas.hu","video.hu","id","ac.id","biz.id","co.id","desa.id","go.id","mil.id","my.id","net.id","or.id","ponpes.id","sch.id","web.id","ie","gov.ie","il","ac.il","co.il","gov.il","idf.il","k12.il","muni.il","net.il","org.il","im","ac.im","co.im","com.im","ltd.co.im","net.im","org.im","plc.co.im","tt.im","tv.im","in","co.in","firm.in","net.in","org.in","gen.in","ind.in","nic.in","ac.in","edu.in","res.in","gov.in","mil.in","info","int","eu.int","io","com.io","iq","gov.iq","edu.iq","mil.iq","com.iq","org.iq","net.iq","ir","ac.ir","co.ir","gov.ir","id.ir","net.ir","org.ir","sch.ir","Ø§ÛŒØ±Ø§Ù†.ir","Ø§ÙŠØ±Ø§Ù†.ir","is","net.is","com.is","edu.is","gov.is","org.is","int.is","it","gov.it","edu.it","abr.it","abruzzo.it","aosta-valley.it","aostavalley.it","bas.it","basilicata.it","cal.it","calabria.it","cam.it","campania.it","emilia-romagna.it","emiliaromagna.it","emr.it","friuli-v-giulia.it","friuli-ve-giulia.it","friuli-vegiulia.it","friuli-venezia-giulia.it","friuli-veneziagiulia.it","friuli-vgiulia.it","friuliv-giulia.it","friulive-giulia.it","friulivegiulia.it","friulivenezia-giulia.it","friuliveneziagiulia.it","friulivgiulia.it","fvg.it","laz.it","lazio.it","lig.it","liguria.it","lom.it","lombardia.it","lombardy.it","lucania.it","mar.it","marche.it","mol.it","molise.it","piedmont.it","piemonte.it","pmn.it","pug.it","puglia.it","sar.it","sardegna.it","sardinia.it","sic.it","sicilia.it","sicily.it","taa.it","tos.it","toscana.it","trentin-sud-tirol.it","trentin-sÃ¼d-tirol.it","trentin-sudtirol.it","trentin-sÃ¼dtirol.it","trentin-sued-tirol.it","trentin-suedtirol.it","trentino-a-adige.it","trentino-aadige.it","trentino-alto-adige.it","trentino-altoadige.it","trentino-s-tirol.it","trentino-stirol.it","trentino-sud-tirol.it","trentino-sÃ¼d-tirol.it","trentino-sudtirol.it","trentino-sÃ¼dtirol.it","trentino-sued-tirol.it","trentino-suedtirol.it","trentino.it","trentinoa-adige.it","trentinoaadige.it","trentinoalto-adige.it","trentinoaltoadige.it","trentinos-tirol.it","trentinostirol.it","trentinosud-tirol.it","trentinosÃ¼d-tirol.it","trentinosudtirol.it","trentinosÃ¼dtirol.it","trentinosued-tirol.it","trentinosuedtirol.it","trentinsud-tirol.it","trentinsÃ¼d-tirol.it","trentinsudtirol.it","trentinsÃ¼dtirol.it","trentinsued-tirol.it","trentinsuedtirol.it","tuscany.it","umb.it","umbria.it","val-d-aosta.it","val-daosta.it","vald-aosta.it","valdaosta.it","valle-aosta.it","valle-d-aosta.it","valle-daosta.it","valleaosta.it","valled-aosta.it","valledaosta.it","vallee-aoste.it","vallÃ©e-aoste.it","vallee-d-aoste.it","vallÃ©e-d-aoste.it","valleeaoste.it","vallÃ©eaoste.it","valleedaoste.it","vallÃ©edaoste.it","vao.it","vda.it","ven.it","veneto.it","ag.it","agrigento.it","al.it","alessandria.it","alto-adige.it","altoadige.it","an.it","ancona.it","andria-barletta-trani.it","andria-trani-barletta.it","andriabarlettatrani.it","andriatranibarletta.it","ao.it","aosta.it","aoste.it","ap.it","aq.it","aquila.it","ar.it","arezzo.it","ascoli-piceno.it","ascolipiceno.it","asti.it","at.it","av.it","avellino.it","ba.it","balsan-sudtirol.it","balsan-sÃ¼dtirol.it","balsan-suedtirol.it","balsan.it","bari.it","barletta-trani-andria.it","barlettatraniandria.it","belluno.it","benevento.it","bergamo.it","bg.it","bi.it","biella.it","bl.it","bn.it","bo.it","bologna.it","bolzano-altoadige.it","bolzano.it","bozen-sudtirol.it","bozen-sÃ¼dtirol.it","bozen-suedtirol.it","bozen.it","br.it","brescia.it","brindisi.it","bs.it","bt.it","bulsan-sudtirol.it","bulsan-sÃ¼dtirol.it","bulsan-suedtirol.it","bulsan.it","bz.it","ca.it","cagliari.it","caltanissetta.it","campidano-medio.it","campidanomedio.it","campobasso.it","carbonia-iglesias.it","carboniaiglesias.it","carrara-massa.it","carraramassa.it","caserta.it","catania.it","catanzaro.it","cb.it","ce.it","cesena-forli.it","cesena-forlÃ¬.it","cesenaforli.it","cesenaforlÃ¬.it","ch.it","chieti.it","ci.it","cl.it","cn.it","co.it","como.it","cosenza.it","cr.it","cremona.it","crotone.it","cs.it","ct.it","cuneo.it","cz.it","dell-ogliastra.it","dellogliastra.it","en.it","enna.it","fc.it","fe.it","fermo.it","ferrara.it","fg.it","fi.it","firenze.it","florence.it","fm.it","foggia.it","forli-cesena.it","forlÃ¬-cesena.it","forlicesena.it","forlÃ¬cesena.it","fr.it","frosinone.it","ge.it","genoa.it","genova.it","go.it","gorizia.it","gr.it","grosseto.it","iglesias-carbonia.it","iglesiascarbonia.it","im.it","imperia.it","is.it","isernia.it","kr.it","la-spezia.it","laquila.it","laspezia.it","latina.it","lc.it","le.it","lecce.it","lecco.it","li.it","livorno.it","lo.it","lodi.it","lt.it","lu.it","lucca.it","macerata.it","mantova.it","massa-carrara.it","massacarrara.it","matera.it","mb.it","mc.it","me.it","medio-campidano.it","mediocampidano.it","messina.it","mi.it","milan.it","milano.it","mn.it","mo.it","modena.it","monza-brianza.it","monza-e-della-brianza.it","monza.it","monzabrianza.it","monzaebrianza.it","monzaedellabrianza.it","ms.it","mt.it","na.it","naples.it","napoli.it","no.it","novara.it","nu.it","nuoro.it","og.it","ogliastra.it","olbia-tempio.it","olbiatempio.it","or.it","oristano.it","ot.it","pa.it","padova.it","padua.it","palermo.it","parma.it","pavia.it","pc.it","pd.it","pe.it","perugia.it","pesaro-urbino.it","pesarourbino.it","pescara.it","pg.it","pi.it","piacenza.it","pisa.it","pistoia.it","pn.it","po.it","pordenone.it","potenza.it","pr.it","prato.it","pt.it","pu.it","pv.it","pz.it","ra.it","ragusa.it","ravenna.it","rc.it","re.it","reggio-calabria.it","reggio-emilia.it","reggiocalabria.it","reggioemilia.it","rg.it","ri.it","rieti.it","rimini.it","rm.it","rn.it","ro.it","roma.it","rome.it","rovigo.it","sa.it","salerno.it","sassari.it","savona.it","si.it","siena.it","siracusa.it","so.it","sondrio.it","sp.it","sr.it","ss.it","suedtirol.it","sÃ¼dtirol.it","sv.it","ta.it","taranto.it","te.it","tempio-olbia.it","tempioolbia.it","teramo.it","terni.it","tn.it","to.it","torino.it","tp.it","tr.it","trani-andria-barletta.it","trani-barletta-andria.it","traniandriabarletta.it","tranibarlettaandria.it","trapani.it","trento.it","treviso.it","trieste.it","ts.it","turin.it","tv.it","ud.it","udine.it","urbino-pesaro.it","urbinopesaro.it","va.it","varese.it","vb.it","vc.it","ve.it","venezia.it","venice.it","verbania.it","vercelli.it","verona.it","vi.it","vibo-valentia.it","vibovalentia.it","vicenza.it","viterbo.it","vr.it","vs.it","vt.it","vv.it","je","co.je","net.je","org.je","*.jm","jo","com.jo","org.jo","net.jo","edu.jo","sch.jo","gov.jo","mil.jo","name.jo","jobs","jp","ac.jp","ad.jp","co.jp","ed.jp","go.jp","gr.jp","lg.jp","ne.jp","or.jp","aichi.jp","akita.jp","aomori.jp","chiba.jp","ehime.jp","fukui.jp","fukuoka.jp","fukushima.jp","gifu.jp","gunma.jp","hiroshima.jp","hokkaido.jp","hyogo.jp","ibaraki.jp","ishikawa.jp","iwate.jp","kagawa.jp","kagoshima.jp","kanagawa.jp","kochi.jp","kumamoto.jp","kyoto.jp","mie.jp","miyagi.jp","miyazaki.jp","nagano.jp","nagasaki.jp","nara.jp","niigata.jp","oita.jp","okayama.jp","okinawa.jp","osaka.jp","saga.jp","saitama.jp","shiga.jp","shimane.jp","shizuoka.jp","tochigi.jp","tokushima.jp","tokyo.jp","tottori.jp","toyama.jp","wakayama.jp","yamagata.jp","yamaguchi.jp","yamanashi.jp","æ ƒæœ¨.jp","æ„›çŸ¥.jp","æ„›åª›.jp","å…µåº«.jp","ç†Šæœ¬.jp","èŒ¨åŸŽ.jp","åŒ—æµ·é�“.jp","å�ƒè‘‰.jp","å’Œæ­Œå±±.jp","é•·å´Ž.jp","é•·é‡Ž.jp","æ–°æ½Ÿ.jp","é�’æ£®.jp","é�™å²¡.jp","æ�±äº¬.jp","çŸ³å·�.jp","åŸ¼çŽ‰.jp","ä¸‰é‡�.jp","äº¬éƒ½.jp","ä½�è³€.jp","å¤§åˆ†.jp","å¤§é˜ª.jp","å¥ˆè‰¯.jp","å®®åŸŽ.jp","å®®å´Ž.jp","å¯Œå±±.jp","å±±å�£.jp","å±±å½¢.jp","å±±æ¢¨.jp","å²©æ‰‹.jp","å²�é˜œ.jp","å²¡å±±.jp","å³¶æ ¹.jp","åºƒå³¶.jp","å¾³å³¶.jp","æ²–ç¸„.jp","æ»‹è³€.jp","ç¥žå¥ˆå·�.jp","ç¦�äº•.jp","ç¦�å²¡.jp","ç¦�å³¶.jp","ç§‹ç”°.jp","ç¾¤é¦¬.jp","é¦™å·�.jp","é«˜çŸ¥.jp","é³¥å�–.jp","é¹¿å…�å³¶.jp","*.kawasaki.jp","*.kitakyushu.jp","*.kobe.jp","*.nagoya.jp","*.sapporo.jp","*.sendai.jp","*.yokohama.jp","!city.kawasaki.jp","!city.kitakyushu.jp","!city.kobe.jp","!city.nagoya.jp","!city.sapporo.jp","!city.sendai.jp","!city.yokohama.jp","aisai.aichi.jp","ama.aichi.jp","anjo.aichi.jp","asuke.aichi.jp","chiryu.aichi.jp","chita.aichi.jp","fuso.aichi.jp","gamagori.aichi.jp","handa.aichi.jp","hazu.aichi.jp","hekinan.aichi.jp","higashiura.aichi.jp","ichinomiya.aichi.jp","inazawa.aichi.jp","inuyama.aichi.jp","isshiki.aichi.jp","iwakura.aichi.jp","kanie.aichi.jp","kariya.aichi.jp","kasugai.aichi.jp","kira.aichi.jp","kiyosu.aichi.jp","komaki.aichi.jp","konan.aichi.jp","kota.aichi.jp","mihama.aichi.jp","miyoshi.aichi.jp","nishio.aichi.jp","nisshin.aichi.jp","obu.aichi.jp","oguchi.aichi.jp","oharu.aichi.jp","okazaki.aichi.jp","owariasahi.aichi.jp","seto.aichi.jp","shikatsu.aichi.jp","shinshiro.aichi.jp","shitara.aichi.jp","tahara.aichi.jp","takahama.aichi.jp","tobishima.aichi.jp","toei.aichi.jp","togo.aichi.jp","tokai.aichi.jp","tokoname.aichi.jp","toyoake.aichi.jp","toyohashi.aichi.jp","toyokawa.aichi.jp","toyone.aichi.jp","toyota.aichi.jp","tsushima.aichi.jp","yatomi.aichi.jp","akita.akita.jp","daisen.akita.jp","fujisato.akita.jp","gojome.akita.jp","hachirogata.akita.jp","happou.akita.jp","higashinaruse.akita.jp","honjo.akita.jp","honjyo.akita.jp","ikawa.akita.jp","kamikoani.akita.jp","kamioka.akita.jp","katagami.akita.jp","kazuno.akita.jp","kitaakita.akita.jp","kosaka.akita.jp","kyowa.akita.jp","misato.akita.jp","mitane.akita.jp","moriyoshi.akita.jp","nikaho.akita.jp","noshiro.akita.jp","odate.akita.jp","oga.akita.jp","ogata.akita.jp","semboku.akita.jp","yokote.akita.jp","yurihonjo.akita.jp","aomori.aomori.jp","gonohe.aomori.jp","hachinohe.aomori.jp","hashikami.aomori.jp","hiranai.aomori.jp","hirosaki.aomori.jp","itayanagi.aomori.jp","kuroishi.aomori.jp","misawa.aomori.jp","mutsu.aomori.jp","nakadomari.aomori.jp","noheji.aomori.jp","oirase.aomori.jp","owani.aomori.jp","rokunohe.aomori.jp","sannohe.aomori.jp","shichinohe.aomori.jp","shingo.aomori.jp","takko.aomori.jp","towada.aomori.jp","tsugaru.aomori.jp","tsuruta.aomori.jp","abiko.chiba.jp","asahi.chiba.jp","chonan.chiba.jp","chosei.chiba.jp","choshi.chiba.jp","chuo.chiba.jp","funabashi.chiba.jp","futtsu.chiba.jp","hanamigawa.chiba.jp","ichihara.chiba.jp","ichikawa.chiba.jp","ichinomiya.chiba.jp","inzai.chiba.jp","isumi.chiba.jp","kamagaya.chiba.jp","kamogawa.chiba.jp","kashiwa.chiba.jp","katori.chiba.jp","katsuura.chiba.jp","kimitsu.chiba.jp","kisarazu.chiba.jp","kozaki.chiba.jp","kujukuri.chiba.jp","kyonan.chiba.jp","matsudo.chiba.jp","midori.chiba.jp","mihama.chiba.jp","minamiboso.chiba.jp","mobara.chiba.jp","mutsuzawa.chiba.jp","nagara.chiba.jp","nagareyama.chiba.jp","narashino.chiba.jp","narita.chiba.jp","noda.chiba.jp","oamishirasato.chiba.jp","omigawa.chiba.jp","onjuku.chiba.jp","otaki.chiba.jp","sakae.chiba.jp","sakura.chiba.jp","shimofusa.chiba.jp","shirako.chiba.jp","shiroi.chiba.jp","shisui.chiba.jp","sodegaura.chiba.jp","sosa.chiba.jp","tako.chiba.jp","tateyama.chiba.jp","togane.chiba.jp","tohnosho.chiba.jp","tomisato.chiba.jp","urayasu.chiba.jp","yachimata.chiba.jp","yachiyo.chiba.jp","yokaichiba.chiba.jp","yokoshibahikari.chiba.jp","yotsukaido.chiba.jp","ainan.ehime.jp","honai.ehime.jp","ikata.ehime.jp","imabari.ehime.jp","iyo.ehime.jp","kamijima.ehime.jp","kihoku.ehime.jp","kumakogen.ehime.jp","masaki.ehime.jp","matsuno.ehime.jp","matsuyama.ehime.jp","namikata.ehime.jp","niihama.ehime.jp","ozu.ehime.jp","saijo.ehime.jp","seiyo.ehime.jp","shikokuchuo.ehime.jp","tobe.ehime.jp","toon.ehime.jp","uchiko.ehime.jp","uwajima.ehime.jp","yawatahama.ehime.jp","echizen.fukui.jp","eiheiji.fukui.jp","fukui.fukui.jp","ikeda.fukui.jp","katsuyama.fukui.jp","mihama.fukui.jp","minamiechizen.fukui.jp","obama.fukui.jp","ohi.fukui.jp","ono.fukui.jp","sabae.fukui.jp","sakai.fukui.jp","takahama.fukui.jp","tsuruga.fukui.jp","wakasa.fukui.jp","ashiya.fukuoka.jp","buzen.fukuoka.jp","chikugo.fukuoka.jp","chikuho.fukuoka.jp","chikujo.fukuoka.jp","chikushino.fukuoka.jp","chikuzen.fukuoka.jp","chuo.fukuoka.jp","dazaifu.fukuoka.jp","fukuchi.fukuoka.jp","hakata.fukuoka.jp","higashi.fukuoka.jp","hirokawa.fukuoka.jp","hisayama.fukuoka.jp","iizuka.fukuoka.jp","inatsuki.fukuoka.jp","kaho.fukuoka.jp","kasuga.fukuoka.jp","kasuya.fukuoka.jp","kawara.fukuoka.jp","keisen.fukuoka.jp","koga.fukuoka.jp","kurate.fukuoka.jp","kurogi.fukuoka.jp","kurume.fukuoka.jp","minami.fukuoka.jp","miyako.fukuoka.jp","miyama.fukuoka.jp","miyawaka.fukuoka.jp","mizumaki.fukuoka.jp","munakata.fukuoka.jp","nakagawa.fukuoka.jp","nakama.fukuoka.jp","nishi.fukuoka.jp","nogata.fukuoka.jp","ogori.fukuoka.jp","okagaki.fukuoka.jp","okawa.fukuoka.jp","oki.fukuoka.jp","omuta.fukuoka.jp","onga.fukuoka.jp","onojo.fukuoka.jp","oto.fukuoka.jp","saigawa.fukuoka.jp","sasaguri.fukuoka.jp","shingu.fukuoka.jp","shinyoshitomi.fukuoka.jp","shonai.fukuoka.jp","soeda.fukuoka.jp","sue.fukuoka.jp","tachiarai.fukuoka.jp","tagawa.fukuoka.jp","takata.fukuoka.jp","toho.fukuoka.jp","toyotsu.fukuoka.jp","tsuiki.fukuoka.jp","ukiha.fukuoka.jp","umi.fukuoka.jp","usui.fukuoka.jp","yamada.fukuoka.jp","yame.fukuoka.jp","yanagawa.fukuoka.jp","yukuhashi.fukuoka.jp","aizubange.fukushima.jp","aizumisato.fukushima.jp","aizuwakamatsu.fukushima.jp","asakawa.fukushima.jp","bandai.fukushima.jp","date.fukushima.jp","fukushima.fukushima.jp","furudono.fukushima.jp","futaba.fukushima.jp","hanawa.fukushima.jp","higashi.fukushima.jp","hirata.fukushima.jp","hirono.fukushima.jp","iitate.fukushima.jp","inawashiro.fukushima.jp","ishikawa.fukushima.jp","iwaki.fukushima.jp","izumizaki.fukushima.jp","kagamiishi.fukushima.jp","kaneyama.fukushima.jp","kawamata.fukushima.jp","kitakata.fukushima.jp","kitashiobara.fukushima.jp","koori.fukushima.jp","koriyama.fukushima.jp","kunimi.fukushima.jp","miharu.fukushima.jp","mishima.fukushima.jp","namie.fukushima.jp","nango.fukushima.jp","nishiaizu.fukushima.jp","nishigo.fukushima.jp","okuma.fukushima.jp","omotego.fukushima.jp","ono.fukushima.jp","otama.fukushima.jp","samegawa.fukushima.jp","shimogo.fukushima.jp","shirakawa.fukushima.jp","showa.fukushima.jp","soma.fukushima.jp","sukagawa.fukushima.jp","taishin.fukushima.jp","tamakawa.fukushima.jp","tanagura.fukushima.jp","tenei.fukushima.jp","yabuki.fukushima.jp","yamato.fukushima.jp","yamatsuri.fukushima.jp","yanaizu.fukushima.jp","yugawa.fukushima.jp","anpachi.gifu.jp","ena.gifu.jp","gifu.gifu.jp","ginan.gifu.jp","godo.gifu.jp","gujo.gifu.jp","hashima.gifu.jp","hichiso.gifu.jp","hida.gifu.jp","higashishirakawa.gifu.jp","ibigawa.gifu.jp","ikeda.gifu.jp","kakamigahara.gifu.jp","kani.gifu.jp","kasahara.gifu.jp","kasamatsu.gifu.jp","kawaue.gifu.jp","kitagata.gifu.jp","mino.gifu.jp","minokamo.gifu.jp","mitake.gifu.jp","mizunami.gifu.jp","motosu.gifu.jp","nakatsugawa.gifu.jp","ogaki.gifu.jp","sakahogi.gifu.jp","seki.gifu.jp","sekigahara.gifu.jp","shirakawa.gifu.jp","tajimi.gifu.jp","takayama.gifu.jp","tarui.gifu.jp","toki.gifu.jp","tomika.gifu.jp","wanouchi.gifu.jp","yamagata.gifu.jp","yaotsu.gifu.jp","yoro.gifu.jp","annaka.gunma.jp","chiyoda.gunma.jp","fujioka.gunma.jp","higashiagatsuma.gunma.jp","isesaki.gunma.jp","itakura.gunma.jp","kanna.gunma.jp","kanra.gunma.jp","katashina.gunma.jp","kawaba.gunma.jp","kiryu.gunma.jp","kusatsu.gunma.jp","maebashi.gunma.jp","meiwa.gunma.jp","midori.gunma.jp","minakami.gunma.jp","naganohara.gunma.jp","nakanojo.gunma.jp","nanmoku.gunma.jp","numata.gunma.jp","oizumi.gunma.jp","ora.gunma.jp","ota.gunma.jp","shibukawa.gunma.jp","shimonita.gunma.jp","shinto.gunma.jp","showa.gunma.jp","takasaki.gunma.jp","takayama.gunma.jp","tamamura.gunma.jp","tatebayashi.gunma.jp","tomioka.gunma.jp","tsukiyono.gunma.jp","tsumagoi.gunma.jp","ueno.gunma.jp","yoshioka.gunma.jp","asaminami.hiroshima.jp","daiwa.hiroshima.jp","etajima.hiroshima.jp","fuchu.hiroshima.jp","fukuyama.hiroshima.jp","hatsukaichi.hiroshima.jp","higashihiroshima.hiroshima.jp","hongo.hiroshima.jp","jinsekikogen.hiroshima.jp","kaita.hiroshima.jp","kui.hiroshima.jp","kumano.hiroshima.jp","kure.hiroshima.jp","mihara.hiroshima.jp","miyoshi.hiroshima.jp","naka.hiroshima.jp","onomichi.hiroshima.jp","osakikamijima.hiroshima.jp","otake.hiroshima.jp","saka.hiroshima.jp","sera.hiroshima.jp","seranishi.hiroshima.jp","shinichi.hiroshima.jp","shobara.hiroshima.jp","takehara.hiroshima.jp","abashiri.hokkaido.jp","abira.hokkaido.jp","aibetsu.hokkaido.jp","akabira.hokkaido.jp","akkeshi.hokkaido.jp","asahikawa.hokkaido.jp","ashibetsu.hokkaido.jp","ashoro.hokkaido.jp","assabu.hokkaido.jp","atsuma.hokkaido.jp","bibai.hokkaido.jp","biei.hokkaido.jp","bifuka.hokkaido.jp","bihoro.hokkaido.jp","biratori.hokkaido.jp","chippubetsu.hokkaido.jp","chitose.hokkaido.jp","date.hokkaido.jp","ebetsu.hokkaido.jp","embetsu.hokkaido.jp","eniwa.hokkaido.jp","erimo.hokkaido.jp","esan.hokkaido.jp","esashi.hokkaido.jp","fukagawa.hokkaido.jp","fukushima.hokkaido.jp","furano.hokkaido.jp","furubira.hokkaido.jp","haboro.hokkaido.jp","hakodate.hokkaido.jp","hamatonbetsu.hokkaido.jp","hidaka.hokkaido.jp","higashikagura.hokkaido.jp","higashikawa.hokkaido.jp","hiroo.hokkaido.jp","hokuryu.hokkaido.jp","hokuto.hokkaido.jp","honbetsu.hokkaido.jp","horokanai.hokkaido.jp","horonobe.hokkaido.jp","ikeda.hokkaido.jp","imakane.hokkaido.jp","ishikari.hokkaido.jp","iwamizawa.hokkaido.jp","iwanai.hokkaido.jp","kamifurano.hokkaido.jp","kamikawa.hokkaido.jp","kamishihoro.hokkaido.jp","kamisunagawa.hokkaido.jp","kamoenai.hokkaido.jp","kayabe.hokkaido.jp","kembuchi.hokkaido.jp","kikonai.hokkaido.jp","kimobetsu.hokkaido.jp","kitahiroshima.hokkaido.jp","kitami.hokkaido.jp","kiyosato.hokkaido.jp","koshimizu.hokkaido.jp","kunneppu.hokkaido.jp","kuriyama.hokkaido.jp","kuromatsunai.hokkaido.jp","kushiro.hokkaido.jp","kutchan.hokkaido.jp","kyowa.hokkaido.jp","mashike.hokkaido.jp","matsumae.hokkaido.jp","mikasa.hokkaido.jp","minamifurano.hokkaido.jp","mombetsu.hokkaido.jp","moseushi.hokkaido.jp","mukawa.hokkaido.jp","muroran.hokkaido.jp","naie.hokkaido.jp","nakagawa.hokkaido.jp","nakasatsunai.hokkaido.jp","nakatombetsu.hokkaido.jp","nanae.hokkaido.jp","nanporo.hokkaido.jp","nayoro.hokkaido.jp","nemuro.hokkaido.jp","niikappu.hokkaido.jp","niki.hokkaido.jp","nishiokoppe.hokkaido.jp","noboribetsu.hokkaido.jp","numata.hokkaido.jp","obihiro.hokkaido.jp","obira.hokkaido.jp","oketo.hokkaido.jp","okoppe.hokkaido.jp","otaru.hokkaido.jp","otobe.hokkaido.jp","otofuke.hokkaido.jp","otoineppu.hokkaido.jp","oumu.hokkaido.jp","ozora.hokkaido.jp","pippu.hokkaido.jp","rankoshi.hokkaido.jp","rebun.hokkaido.jp","rikubetsu.hokkaido.jp","rishiri.hokkaido.jp","rishirifuji.hokkaido.jp","saroma.hokkaido.jp","sarufutsu.hokkaido.jp","shakotan.hokkaido.jp","shari.hokkaido.jp","shibecha.hokkaido.jp","shibetsu.hokkaido.jp","shikabe.hokkaido.jp","shikaoi.hokkaido.jp","shimamaki.hokkaido.jp","shimizu.hokkaido.jp","shimokawa.hokkaido.jp","shinshinotsu.hokkaido.jp","shintoku.hokkaido.jp","shiranuka.hokkaido.jp","shiraoi.hokkaido.jp","shiriuchi.hokkaido.jp","sobetsu.hokkaido.jp","sunagawa.hokkaido.jp","taiki.hokkaido.jp","takasu.hokkaido.jp","takikawa.hokkaido.jp","takinoue.hokkaido.jp","teshikaga.hokkaido.jp","tobetsu.hokkaido.jp","tohma.hokkaido.jp","tomakomai.hokkaido.jp","tomari.hokkaido.jp","toya.hokkaido.jp","toyako.hokkaido.jp","toyotomi.hokkaido.jp","toyoura.hokkaido.jp","tsubetsu.hokkaido.jp","tsukigata.hokkaido.jp","urakawa.hokkaido.jp","urausu.hokkaido.jp","uryu.hokkaido.jp","utashinai.hokkaido.jp","wakkanai.hokkaido.jp","wassamu.hokkaido.jp","yakumo.hokkaido.jp","yoichi.hokkaido.jp","aioi.hyogo.jp","akashi.hyogo.jp","ako.hyogo.jp","amagasaki.hyogo.jp","aogaki.hyogo.jp","asago.hyogo.jp","ashiya.hyogo.jp","awaji.hyogo.jp","fukusaki.hyogo.jp","goshiki.hyogo.jp","harima.hyogo.jp","himeji.hyogo.jp","ichikawa.hyogo.jp","inagawa.hyogo.jp","itami.hyogo.jp","kakogawa.hyogo.jp","kamigori.hyogo.jp","kamikawa.hyogo.jp","kasai.hyogo.jp","kasuga.hyogo.jp","kawanishi.hyogo.jp","miki.hyogo.jp","minamiawaji.hyogo.jp","nishinomiya.hyogo.jp","nishiwaki.hyogo.jp","ono.hyogo.jp","sanda.hyogo.jp","sannan.hyogo.jp","sasayama.hyogo.jp","sayo.hyogo.jp","shingu.hyogo.jp","shinonsen.hyogo.jp","shiso.hyogo.jp","sumoto.hyogo.jp","taishi.hyogo.jp","taka.hyogo.jp","takarazuka.hyogo.jp","takasago.hyogo.jp","takino.hyogo.jp","tamba.hyogo.jp","tatsuno.hyogo.jp","toyooka.hyogo.jp","yabu.hyogo.jp","yashiro.hyogo.jp","yoka.hyogo.jp","yokawa.hyogo.jp","ami.ibaraki.jp","asahi.ibaraki.jp","bando.ibaraki.jp","chikusei.ibaraki.jp","daigo.ibaraki.jp","fujishiro.ibaraki.jp","hitachi.ibaraki.jp","hitachinaka.ibaraki.jp","hitachiomiya.ibaraki.jp","hitachiota.ibaraki.jp","ibaraki.ibaraki.jp","ina.ibaraki.jp","inashiki.ibaraki.jp","itako.ibaraki.jp","iwama.ibaraki.jp","joso.ibaraki.jp","kamisu.ibaraki.jp","kasama.ibaraki.jp","kashima.ibaraki.jp","kasumigaura.ibaraki.jp","koga.ibaraki.jp","miho.ibaraki.jp","mito.ibaraki.jp","moriya.ibaraki.jp","naka.ibaraki.jp","namegata.ibaraki.jp","oarai.ibaraki.jp","ogawa.ibaraki.jp","omitama.ibaraki.jp","ryugasaki.ibaraki.jp","sakai.ibaraki.jp","sakuragawa.ibaraki.jp","shimodate.ibaraki.jp","shimotsuma.ibaraki.jp","shirosato.ibaraki.jp","sowa.ibaraki.jp","suifu.ibaraki.jp","takahagi.ibaraki.jp","tamatsukuri.ibaraki.jp","tokai.ibaraki.jp","tomobe.ibaraki.jp","tone.ibaraki.jp","toride.ibaraki.jp","tsuchiura.ibaraki.jp","tsukuba.ibaraki.jp","uchihara.ibaraki.jp","ushiku.ibaraki.jp","yachiyo.ibaraki.jp","yamagata.ibaraki.jp","yawara.ibaraki.jp","yuki.ibaraki.jp","anamizu.ishikawa.jp","hakui.ishikawa.jp","hakusan.ishikawa.jp","kaga.ishikawa.jp","kahoku.ishikawa.jp","kanazawa.ishikawa.jp","kawakita.ishikawa.jp","komatsu.ishikawa.jp","nakanoto.ishikawa.jp","nanao.ishikawa.jp","nomi.ishikawa.jp","nonoichi.ishikawa.jp","noto.ishikawa.jp","shika.ishikawa.jp","suzu.ishikawa.jp","tsubata.ishikawa.jp","tsurugi.ishikawa.jp","uchinada.ishikawa.jp","wajima.ishikawa.jp","fudai.iwate.jp","fujisawa.iwate.jp","hanamaki.iwate.jp","hiraizumi.iwate.jp","hirono.iwate.jp","ichinohe.iwate.jp","ichinoseki.iwate.jp","iwaizumi.iwate.jp","iwate.iwate.jp","joboji.iwate.jp","kamaishi.iwate.jp","kanegasaki.iwate.jp","karumai.iwate.jp","kawai.iwate.jp","kitakami.iwate.jp","kuji.iwate.jp","kunohe.iwate.jp","kuzumaki.iwate.jp","miyako.iwate.jp","mizusawa.iwate.jp","morioka.iwate.jp","ninohe.iwate.jp","noda.iwate.jp","ofunato.iwate.jp","oshu.iwate.jp","otsuchi.iwate.jp","rikuzentakata.iwate.jp","shiwa.iwate.jp","shizukuishi.iwate.jp","sumita.iwate.jp","tanohata.iwate.jp","tono.iwate.jp","yahaba.iwate.jp","yamada.iwate.jp","ayagawa.kagawa.jp","higashikagawa.kagawa.jp","kanonji.kagawa.jp","kotohira.kagawa.jp","manno.kagawa.jp","marugame.kagawa.jp","mitoyo.kagawa.jp","naoshima.kagawa.jp","sanuki.kagawa.jp","tadotsu.kagawa.jp","takamatsu.kagawa.jp","tonosho.kagawa.jp","uchinomi.kagawa.jp","utazu.kagawa.jp","zentsuji.kagawa.jp","akune.kagoshima.jp","amami.kagoshima.jp","hioki.kagoshima.jp","isa.kagoshima.jp","isen.kagoshima.jp","izumi.kagoshima.jp","kagoshima.kagoshima.jp","kanoya.kagoshima.jp","kawanabe.kagoshima.jp","kinko.kagoshima.jp","kouyama.kagoshima.jp","makurazaki.kagoshima.jp","matsumoto.kagoshima.jp","minamitane.kagoshima.jp","nakatane.kagoshima.jp","nishinoomote.kagoshima.jp","satsumasendai.kagoshima.jp","soo.kagoshima.jp","tarumizu.kagoshima.jp","yusui.kagoshima.jp","aikawa.kanagawa.jp","atsugi.kanagawa.jp","ayase.kanagawa.jp","chigasaki.kanagawa.jp","ebina.kanagawa.jp","fujisawa.kanagawa.jp","hadano.kanagawa.jp","hakone.kanagawa.jp","hiratsuka.kanagawa.jp","isehara.kanagawa.jp","kaisei.kanagawa.jp","kamakura.kanagawa.jp","kiyokawa.kanagawa.jp","matsuda.kanagawa.jp","minamiashigara.kanagawa.jp","miura.kanagawa.jp","nakai.kanagawa.jp","ninomiya.kanagawa.jp","odawara.kanagawa.jp","oi.kanagawa.jp","oiso.kanagawa.jp","sagamihara.kanagawa.jp","samukawa.kanagawa.jp","tsukui.kanagawa.jp","yamakita.kanagawa.jp","yamato.kanagawa.jp","yokosuka.kanagawa.jp","yugawara.kanagawa.jp","zama.kanagawa.jp","zushi.kanagawa.jp","aki.kochi.jp","geisei.kochi.jp","hidaka.kochi.jp","higashitsuno.kochi.jp","ino.kochi.jp","kagami.kochi.jp","kami.kochi.jp","kitagawa.kochi.jp","kochi.kochi.jp","mihara.kochi.jp","motoyama.kochi.jp","muroto.kochi.jp","nahari.kochi.jp","nakamura.kochi.jp","nankoku.kochi.jp","nishitosa.kochi.jp","niyodogawa.kochi.jp","ochi.kochi.jp","okawa.kochi.jp","otoyo.kochi.jp","otsuki.kochi.jp","sakawa.kochi.jp","sukumo.kochi.jp","susaki.kochi.jp","tosa.kochi.jp","tosashimizu.kochi.jp","toyo.kochi.jp","tsuno.kochi.jp","umaji.kochi.jp","yasuda.kochi.jp","yusuhara.kochi.jp","amakusa.kumamoto.jp","arao.kumamoto.jp","aso.kumamoto.jp","choyo.kumamoto.jp","gyokuto.kumamoto.jp","kamiamakusa.kumamoto.jp","kikuchi.kumamoto.jp","kumamoto.kumamoto.jp","mashiki.kumamoto.jp","mifune.kumamoto.jp","minamata.kumamoto.jp","minamioguni.kumamoto.jp","nagasu.kumamoto.jp","nishihara.kumamoto.jp","oguni.kumamoto.jp","ozu.kumamoto.jp","sumoto.kumamoto.jp","takamori.kumamoto.jp","uki.kumamoto.jp","uto.kumamoto.jp","yamaga.kumamoto.jp","yamato.kumamoto.jp","yatsushiro.kumamoto.jp","ayabe.kyoto.jp","fukuchiyama.kyoto.jp","higashiyama.kyoto.jp","ide.kyoto.jp","ine.kyoto.jp","joyo.kyoto.jp","kameoka.kyoto.jp","kamo.kyoto.jp","kita.kyoto.jp","kizu.kyoto.jp","kumiyama.kyoto.jp","kyotamba.kyoto.jp","kyotanabe.kyoto.jp","kyotango.kyoto.jp","maizuru.kyoto.jp","minami.kyoto.jp","minamiyamashiro.kyoto.jp","miyazu.kyoto.jp","muko.kyoto.jp","nagaokakyo.kyoto.jp","nakagyo.kyoto.jp","nantan.kyoto.jp","oyamazaki.kyoto.jp","sakyo.kyoto.jp","seika.kyoto.jp","tanabe.kyoto.jp","uji.kyoto.jp","ujitawara.kyoto.jp","wazuka.kyoto.jp","yamashina.kyoto.jp","yawata.kyoto.jp","asahi.mie.jp","inabe.mie.jp","ise.mie.jp","kameyama.mie.jp","kawagoe.mie.jp","kiho.mie.jp","kisosaki.mie.jp","kiwa.mie.jp","komono.mie.jp","kumano.mie.jp","kuwana.mie.jp","matsusaka.mie.jp","meiwa.mie.jp","mihama.mie.jp","minamiise.mie.jp","misugi.mie.jp","miyama.mie.jp","nabari.mie.jp","shima.mie.jp","suzuka.mie.jp","tado.mie.jp","taiki.mie.jp","taki.mie.jp","tamaki.mie.jp","toba.mie.jp","tsu.mie.jp","udono.mie.jp","ureshino.mie.jp","watarai.mie.jp","yokkaichi.mie.jp","furukawa.miyagi.jp","higashimatsushima.miyagi.jp","ishinomaki.miyagi.jp","iwanuma.miyagi.jp","kakuda.miyagi.jp","kami.miyagi.jp","kawasaki.miyagi.jp","marumori.miyagi.jp","matsushima.miyagi.jp","minamisanriku.miyagi.jp","misato.miyagi.jp","murata.miyagi.jp","natori.miyagi.jp","ogawara.miyagi.jp","ohira.miyagi.jp","onagawa.miyagi.jp","osaki.miyagi.jp","rifu.miyagi.jp","semine.miyagi.jp","shibata.miyagi.jp","shichikashuku.miyagi.jp","shikama.miyagi.jp","shiogama.miyagi.jp","shiroishi.miyagi.jp","tagajo.miyagi.jp","taiwa.miyagi.jp","tome.miyagi.jp","tomiya.miyagi.jp","wakuya.miyagi.jp","watari.miyagi.jp","yamamoto.miyagi.jp","zao.miyagi.jp","aya.miyazaki.jp","ebino.miyazaki.jp","gokase.miyazaki.jp","hyuga.miyazaki.jp","kadogawa.miyazaki.jp","kawaminami.miyazaki.jp","kijo.miyazaki.jp","kitagawa.miyazaki.jp","kitakata.miyazaki.jp","kitaura.miyazaki.jp","kobayashi.miyazaki.jp","kunitomi.miyazaki.jp","kushima.miyazaki.jp","mimata.miyazaki.jp","miyakonojo.miyazaki.jp","miyazaki.miyazaki.jp","morotsuka.miyazaki.jp","nichinan.miyazaki.jp","nishimera.miyazaki.jp","nobeoka.miyazaki.jp","saito.miyazaki.jp","shiiba.miyazaki.jp","shintomi.miyazaki.jp","takaharu.miyazaki.jp","takanabe.miyazaki.jp","takazaki.miyazaki.jp","tsuno.miyazaki.jp","achi.nagano.jp","agematsu.nagano.jp","anan.nagano.jp","aoki.nagano.jp","asahi.nagano.jp","azumino.nagano.jp","chikuhoku.nagano.jp","chikuma.nagano.jp","chino.nagano.jp","fujimi.nagano.jp","hakuba.nagano.jp","hara.nagano.jp","hiraya.nagano.jp","iida.nagano.jp","iijima.nagano.jp","iiyama.nagano.jp","iizuna.nagano.jp","ikeda.nagano.jp","ikusaka.nagano.jp","ina.nagano.jp","karuizawa.nagano.jp","kawakami.nagano.jp","kiso.nagano.jp","kisofukushima.nagano.jp","kitaaiki.nagano.jp","komagane.nagano.jp","komoro.nagano.jp","matsukawa.nagano.jp","matsumoto.nagano.jp","miasa.nagano.jp","minamiaiki.nagano.jp","minamimaki.nagano.jp","minamiminowa.nagano.jp","minowa.nagano.jp","miyada.nagano.jp","miyota.nagano.jp","mochizuki.nagano.jp","nagano.nagano.jp","nagawa.nagano.jp","nagiso.nagano.jp","nakagawa.nagano.jp","nakano.nagano.jp","nozawaonsen.nagano.jp","obuse.nagano.jp","ogawa.nagano.jp","okaya.nagano.jp","omachi.nagano.jp","omi.nagano.jp","ookuwa.nagano.jp","ooshika.nagano.jp","otaki.nagano.jp","otari.nagano.jp","sakae.nagano.jp","sakaki.nagano.jp","saku.nagano.jp","sakuho.nagano.jp","shimosuwa.nagano.jp","shinanomachi.nagano.jp","shiojiri.nagano.jp","suwa.nagano.jp","suzaka.nagano.jp","takagi.nagano.jp","takamori.nagano.jp","takayama.nagano.jp","tateshina.nagano.jp","tatsuno.nagano.jp","togakushi.nagano.jp","togura.nagano.jp","tomi.nagano.jp","ueda.nagano.jp","wada.nagano.jp","yamagata.nagano.jp","yamanouchi.nagano.jp","yasaka.nagano.jp","yasuoka.nagano.jp","chijiwa.nagasaki.jp","futsu.nagasaki.jp","goto.nagasaki.jp","hasami.nagasaki.jp","hirado.nagasaki.jp","iki.nagasaki.jp","isahaya.nagasaki.jp","kawatana.nagasaki.jp","kuchinotsu.nagasaki.jp","matsuura.nagasaki.jp","nagasaki.nagasaki.jp","obama.nagasaki.jp","omura.nagasaki.jp","oseto.nagasaki.jp","saikai.nagasaki.jp","sasebo.nagasaki.jp","seihi.nagasaki.jp","shimabara.nagasaki.jp","shinkamigoto.nagasaki.jp","togitsu.nagasaki.jp","tsushima.nagasaki.jp","unzen.nagasaki.jp","ando.nara.jp","gose.nara.jp","heguri.nara.jp","higashiyoshino.nara.jp","ikaruga.nara.jp","ikoma.nara.jp","kamikitayama.nara.jp","kanmaki.nara.jp","kashiba.nara.jp","kashihara.nara.jp","katsuragi.nara.jp","kawai.nara.jp","kawakami.nara.jp","kawanishi.nara.jp","koryo.nara.jp","kurotaki.nara.jp","mitsue.nara.jp","miyake.nara.jp","nara.nara.jp","nosegawa.nara.jp","oji.nara.jp","ouda.nara.jp","oyodo.nara.jp","sakurai.nara.jp","sango.nara.jp","shimoichi.nara.jp","shimokitayama.nara.jp","shinjo.nara.jp","soni.nara.jp","takatori.nara.jp","tawaramoto.nara.jp","tenkawa.nara.jp","tenri.nara.jp","uda.nara.jp","yamatokoriyama.nara.jp","yamatotakada.nara.jp","yamazoe.nara.jp","yoshino.nara.jp","aga.niigata.jp","agano.niigata.jp","gosen.niigata.jp","itoigawa.niigata.jp","izumozaki.niigata.jp","joetsu.niigata.jp","kamo.niigata.jp","kariwa.niigata.jp","kashiwazaki.niigata.jp","minamiuonuma.niigata.jp","mitsuke.niigata.jp","muika.niigata.jp","murakami.niigata.jp","myoko.niigata.jp","nagaoka.niigata.jp","niigata.niigata.jp","ojiya.niigata.jp","omi.niigata.jp","sado.niigata.jp","sanjo.niigata.jp","seiro.niigata.jp","seirou.niigata.jp","sekikawa.niigata.jp","shibata.niigata.jp","tagami.niigata.jp","tainai.niigata.jp","tochio.niigata.jp","tokamachi.niigata.jp","tsubame.niigata.jp","tsunan.niigata.jp","uonuma.niigata.jp","yahiko.niigata.jp","yoita.niigata.jp","yuzawa.niigata.jp","beppu.oita.jp","bungoono.oita.jp","bungotakada.oita.jp","hasama.oita.jp","hiji.oita.jp","himeshima.oita.jp","hita.oita.jp","kamitsue.oita.jp","kokonoe.oita.jp","kuju.oita.jp","kunisaki.oita.jp","kusu.oita.jp","oita.oita.jp","saiki.oita.jp","taketa.oita.jp","tsukumi.oita.jp","usa.oita.jp","usuki.oita.jp","yufu.oita.jp","akaiwa.okayama.jp","asakuchi.okayama.jp","bizen.okayama.jp","hayashima.okayama.jp","ibara.okayama.jp","kagamino.okayama.jp","kasaoka.okayama.jp","kibichuo.okayama.jp","kumenan.okayama.jp","kurashiki.okayama.jp","maniwa.okayama.jp","misaki.okayama.jp","nagi.okayama.jp","niimi.okayama.jp","nishiawakura.okayama.jp","okayama.okayama.jp","satosho.okayama.jp","setouchi.okayama.jp","shinjo.okayama.jp","shoo.okayama.jp","soja.okayama.jp","takahashi.okayama.jp","tamano.okayama.jp","tsuyama.okayama.jp","wake.okayama.jp","yakage.okayama.jp","aguni.okinawa.jp","ginowan.okinawa.jp","ginoza.okinawa.jp","gushikami.okinawa.jp","haebaru.okinawa.jp","higashi.okinawa.jp","hirara.okinawa.jp","iheya.okinawa.jp","ishigaki.okinawa.jp","ishikawa.okinawa.jp","itoman.okinawa.jp","izena.okinawa.jp","kadena.okinawa.jp","kin.okinawa.jp","kitadaito.okinawa.jp","kitanakagusuku.okinawa.jp","kumejima.okinawa.jp","kunigami.okinawa.jp","minamidaito.okinawa.jp","motobu.okinawa.jp","nago.okinawa.jp","naha.okinawa.jp","nakagusuku.okinawa.jp","nakijin.okinawa.jp","nanjo.okinawa.jp","nishihara.okinawa.jp","ogimi.okinawa.jp","okinawa.okinawa.jp","onna.okinawa.jp","shimoji.okinawa.jp","taketomi.okinawa.jp","tarama.okinawa.jp","tokashiki.okinawa.jp","tomigusuku.okinawa.jp","tonaki.okinawa.jp","urasoe.okinawa.jp","uruma.okinawa.jp","yaese.okinawa.jp","yomitan.okinawa.jp","yonabaru.okinawa.jp","yonaguni.okinawa.jp","zamami.okinawa.jp","abeno.osaka.jp","chihayaakasaka.osaka.jp","chuo.osaka.jp","daito.osaka.jp","fujiidera.osaka.jp","habikino.osaka.jp","hannan.osaka.jp","higashiosaka.osaka.jp","higashisumiyoshi.osaka.jp","higashiyodogawa.osaka.jp","hirakata.osaka.jp","ibaraki.osaka.jp","ikeda.osaka.jp","izumi.osaka.jp","izumiotsu.osaka.jp","izumisano.osaka.jp","kadoma.osaka.jp","kaizuka.osaka.jp","kanan.osaka.jp","kashiwara.osaka.jp","katano.osaka.jp","kawachinagano.osaka.jp","kishiwada.osaka.jp","kita.osaka.jp","kumatori.osaka.jp","matsubara.osaka.jp","minato.osaka.jp","minoh.osaka.jp","misaki.osaka.jp","moriguchi.osaka.jp","neyagawa.osaka.jp","nishi.osaka.jp","nose.osaka.jp","osakasayama.osaka.jp","sakai.osaka.jp","sayama.osaka.jp","sennan.osaka.jp","settsu.osaka.jp","shijonawate.osaka.jp","shimamoto.osaka.jp","suita.osaka.jp","tadaoka.osaka.jp","taishi.osaka.jp","tajiri.osaka.jp","takaishi.osaka.jp","takatsuki.osaka.jp","tondabayashi.osaka.jp","toyonaka.osaka.jp","toyono.osaka.jp","yao.osaka.jp","ariake.saga.jp","arita.saga.jp","fukudomi.saga.jp","genkai.saga.jp","hamatama.saga.jp","hizen.saga.jp","imari.saga.jp","kamimine.saga.jp","kanzaki.saga.jp","karatsu.saga.jp","kashima.saga.jp","kitagata.saga.jp","kitahata.saga.jp","kiyama.saga.jp","kouhoku.saga.jp","kyuragi.saga.jp","nishiarita.saga.jp","ogi.saga.jp","omachi.saga.jp","ouchi.saga.jp","saga.saga.jp","shiroishi.saga.jp","taku.saga.jp","tara.saga.jp","tosu.saga.jp","yoshinogari.saga.jp","arakawa.saitama.jp","asaka.saitama.jp","chichibu.saitama.jp","fujimi.saitama.jp","fujimino.saitama.jp","fukaya.saitama.jp","hanno.saitama.jp","hanyu.saitama.jp","hasuda.saitama.jp","hatogaya.saitama.jp","hatoyama.saitama.jp","hidaka.saitama.jp","higashichichibu.saitama.jp","higashimatsuyama.saitama.jp","honjo.saitama.jp","ina.saitama.jp","iruma.saitama.jp","iwatsuki.saitama.jp","kamiizumi.saitama.jp","kamikawa.saitama.jp","kamisato.saitama.jp","kasukabe.saitama.jp","kawagoe.saitama.jp","kawaguchi.saitama.jp","kawajima.saitama.jp","kazo.saitama.jp","kitamoto.saitama.jp","koshigaya.saitama.jp","kounosu.saitama.jp","kuki.saitama.jp","kumagaya.saitama.jp","matsubushi.saitama.jp","minano.saitama.jp","misato.saitama.jp","miyashiro.saitama.jp","miyoshi.saitama.jp","moroyama.saitama.jp","nagatoro.saitama.jp","namegawa.saitama.jp","niiza.saitama.jp","ogano.saitama.jp","ogawa.saitama.jp","ogose.saitama.jp","okegawa.saitama.jp","omiya.saitama.jp","otaki.saitama.jp","ranzan.saitama.jp","ryokami.saitama.jp","saitama.saitama.jp","sakado.saitama.jp","satte.saitama.jp","sayama.saitama.jp","shiki.saitama.jp","shiraoka.saitama.jp","soka.saitama.jp","sugito.saitama.jp","toda.saitama.jp","tokigawa.saitama.jp","tokorozawa.saitama.jp","tsurugashima.saitama.jp","urawa.saitama.jp","warabi.saitama.jp","yashio.saitama.jp","yokoze.saitama.jp","yono.saitama.jp","yorii.saitama.jp","yoshida.saitama.jp","yoshikawa.saitama.jp","yoshimi.saitama.jp","aisho.shiga.jp","gamo.shiga.jp","higashiomi.shiga.jp","hikone.shiga.jp","koka.shiga.jp","konan.shiga.jp","kosei.shiga.jp","koto.shiga.jp","kusatsu.shiga.jp","maibara.shiga.jp","moriyama.shiga.jp","nagahama.shiga.jp","nishiazai.shiga.jp","notogawa.shiga.jp","omihachiman.shiga.jp","otsu.shiga.jp","ritto.shiga.jp","ryuoh.shiga.jp","takashima.shiga.jp","takatsuki.shiga.jp","torahime.shiga.jp","toyosato.shiga.jp","yasu.shiga.jp","akagi.shimane.jp","ama.shimane.jp","gotsu.shimane.jp","hamada.shimane.jp","higashiizumo.shimane.jp","hikawa.shimane.jp","hikimi.shimane.jp","izumo.shimane.jp","kakinoki.shimane.jp","masuda.shimane.jp","matsue.shimane.jp","misato.shimane.jp","nishinoshima.shimane.jp","ohda.shimane.jp","okinoshima.shimane.jp","okuizumo.shimane.jp","shimane.shimane.jp","tamayu.shimane.jp","tsuwano.shimane.jp","unnan.shimane.jp","yakumo.shimane.jp","yasugi.shimane.jp","yatsuka.shimane.jp","arai.shizuoka.jp","atami.shizuoka.jp","fuji.shizuoka.jp","fujieda.shizuoka.jp","fujikawa.shizuoka.jp","fujinomiya.shizuoka.jp","fukuroi.shizuoka.jp","gotemba.shizuoka.jp","haibara.shizuoka.jp","hamamatsu.shizuoka.jp","higashiizu.shizuoka.jp","ito.shizuoka.jp","iwata.shizuoka.jp","izu.shizuoka.jp","izunokuni.shizuoka.jp","kakegawa.shizuoka.jp","kannami.shizuoka.jp","kawanehon.shizuoka.jp","kawazu.shizuoka.jp","kikugawa.shizuoka.jp","kosai.shizuoka.jp","makinohara.shizuoka.jp","matsuzaki.shizuoka.jp","minamiizu.shizuoka.jp","mishima.shizuoka.jp","morimachi.shizuoka.jp","nishiizu.shizuoka.jp","numazu.shizuoka.jp","omaezaki.shizuoka.jp","shimada.shizuoka.jp","shimizu.shizuoka.jp","shimoda.shizuoka.jp","shizuoka.shizuoka.jp","susono.shizuoka.jp","yaizu.shizuoka.jp","yoshida.shizuoka.jp","ashikaga.tochigi.jp","bato.tochigi.jp","haga.tochigi.jp","ichikai.tochigi.jp","iwafune.tochigi.jp","kaminokawa.tochigi.jp","kanuma.tochigi.jp","karasuyama.tochigi.jp","kuroiso.tochigi.jp","mashiko.tochigi.jp","mibu.tochigi.jp","moka.tochigi.jp","motegi.tochigi.jp","nasu.tochigi.jp","nasushiobara.tochigi.jp","nikko.tochigi.jp","nishikata.tochigi.jp","nogi.tochigi.jp","ohira.tochigi.jp","ohtawara.tochigi.jp","oyama.tochigi.jp","sakura.tochigi.jp","sano.tochigi.jp","shimotsuke.tochigi.jp","shioya.tochigi.jp","takanezawa.tochigi.jp","tochigi.tochigi.jp","tsuga.tochigi.jp","ujiie.tochigi.jp","utsunomiya.tochigi.jp","yaita.tochigi.jp","aizumi.tokushima.jp","anan.tokushima.jp","ichiba.tokushima.jp","itano.tokushima.jp","kainan.tokushima.jp","komatsushima.tokushima.jp","matsushige.tokushima.jp","mima.tokushima.jp","minami.tokushima.jp","miyoshi.tokushima.jp","mugi.tokushima.jp","nakagawa.tokushima.jp","naruto.tokushima.jp","sanagochi.tokushima.jp","shishikui.tokushima.jp","tokushima.tokushima.jp","wajiki.tokushima.jp","adachi.tokyo.jp","akiruno.tokyo.jp","akishima.tokyo.jp","aogashima.tokyo.jp","arakawa.tokyo.jp","bunkyo.tokyo.jp","chiyoda.tokyo.jp","chofu.tokyo.jp","chuo.tokyo.jp","edogawa.tokyo.jp","fuchu.tokyo.jp","fussa.tokyo.jp","hachijo.tokyo.jp","hachioji.tokyo.jp","hamura.tokyo.jp","higashikurume.tokyo.jp","higashimurayama.tokyo.jp","higashiyamato.tokyo.jp","hino.tokyo.jp","hinode.tokyo.jp","hinohara.tokyo.jp","inagi.tokyo.jp","itabashi.tokyo.jp","katsushika.tokyo.jp","kita.tokyo.jp","kiyose.tokyo.jp","kodaira.tokyo.jp","koganei.tokyo.jp","kokubunji.tokyo.jp","komae.tokyo.jp","koto.tokyo.jp","kouzushima.tokyo.jp","kunitachi.tokyo.jp","machida.tokyo.jp","meguro.tokyo.jp","minato.tokyo.jp","mitaka.tokyo.jp","mizuho.tokyo.jp","musashimurayama.tokyo.jp","musashino.tokyo.jp","nakano.tokyo.jp","nerima.tokyo.jp","ogasawara.tokyo.jp","okutama.tokyo.jp","ome.tokyo.jp","oshima.tokyo.jp","ota.tokyo.jp","setagaya.tokyo.jp","shibuya.tokyo.jp","shinagawa.tokyo.jp","shinjuku.tokyo.jp","suginami.tokyo.jp","sumida.tokyo.jp","tachikawa.tokyo.jp","taito.tokyo.jp","tama.tokyo.jp","toshima.tokyo.jp","chizu.tottori.jp","hino.tottori.jp","kawahara.tottori.jp","koge.tottori.jp","kotoura.tottori.jp","misasa.tottori.jp","nanbu.tottori.jp","nichinan.tottori.jp","sakaiminato.tottori.jp","tottori.tottori.jp","wakasa.tottori.jp","yazu.tottori.jp","yonago.tottori.jp","asahi.toyama.jp","fuchu.toyama.jp","fukumitsu.toyama.jp","funahashi.toyama.jp","himi.toyama.jp","imizu.toyama.jp","inami.toyama.jp","johana.toyama.jp","kamiichi.toyama.jp","kurobe.toyama.jp","nakaniikawa.toyama.jp","namerikawa.toyama.jp","nanto.toyama.jp","nyuzen.toyama.jp","oyabe.toyama.jp","taira.toyama.jp","takaoka.toyama.jp","tateyama.toyama.jp","toga.toyama.jp","tonami.toyama.jp","toyama.toyama.jp","unazuki.toyama.jp","uozu.toyama.jp","yamada.toyama.jp","arida.wakayama.jp","aridagawa.wakayama.jp","gobo.wakayama.jp","hashimoto.wakayama.jp","hidaka.wakayama.jp","hirogawa.wakayama.jp","inami.wakayama.jp","iwade.wakayama.jp","kainan.wakayama.jp","kamitonda.wakayama.jp","katsuragi.wakayama.jp","kimino.wakayama.jp","kinokawa.wakayama.jp","kitayama.wakayama.jp","koya.wakayama.jp","koza.wakayama.jp","kozagawa.wakayama.jp","kudoyama.wakayama.jp","kushimoto.wakayama.jp","mihama.wakayama.jp","misato.wakayama.jp","nachikatsuura.wakayama.jp","shingu.wakayama.jp","shirahama.wakayama.jp","taiji.wakayama.jp","tanabe.wakayama.jp","wakayama.wakayama.jp","yuasa.wakayama.jp","yura.wakayama.jp","asahi.yamagata.jp","funagata.yamagata.jp","higashine.yamagata.jp","iide.yamagata.jp","kahoku.yamagata.jp","kaminoyama.yamagata.jp","kaneyama.yamagata.jp","kawanishi.yamagata.jp","mamurogawa.yamagata.jp","mikawa.yamagata.jp","murayama.yamagata.jp","nagai.yamagata.jp","nakayama.yamagata.jp","nanyo.yamagata.jp","nishikawa.yamagata.jp","obanazawa.yamagata.jp","oe.yamagata.jp","oguni.yamagata.jp","ohkura.yamagata.jp","oishida.yamagata.jp","sagae.yamagata.jp","sakata.yamagata.jp","sakegawa.yamagata.jp","shinjo.yamagata.jp","shirataka.yamagata.jp","shonai.yamagata.jp","takahata.yamagata.jp","tendo.yamagata.jp","tozawa.yamagata.jp","tsuruoka.yamagata.jp","yamagata.yamagata.jp","yamanobe.yamagata.jp","yonezawa.yamagata.jp","yuza.yamagata.jp","abu.yamaguchi.jp","hagi.yamaguchi.jp","hikari.yamaguchi.jp","hofu.yamaguchi.jp","iwakuni.yamaguchi.jp","kudamatsu.yamaguchi.jp","mitou.yamaguchi.jp","nagato.yamaguchi.jp","oshima.yamaguchi.jp","shimonoseki.yamaguchi.jp","shunan.yamaguchi.jp","tabuse.yamaguchi.jp","tokuyama.yamaguchi.jp","toyota.yamaguchi.jp","ube.yamaguchi.jp","yuu.yamaguchi.jp","chuo.yamanashi.jp","doshi.yamanashi.jp","fuefuki.yamanashi.jp","fujikawa.yamanashi.jp","fujikawaguchiko.yamanashi.jp","fujiyoshida.yamanashi.jp","hayakawa.yamanashi.jp","hokuto.yamanashi.jp","ichikawamisato.yamanashi.jp","kai.yamanashi.jp","kofu.yamanashi.jp","koshu.yamanashi.jp","kosuge.yamanashi.jp","minami-alps.yamanashi.jp","minobu.yamanashi.jp","nakamichi.yamanashi.jp","nanbu.yamanashi.jp","narusawa.yamanashi.jp","nirasaki.yamanashi.jp","nishikatsura.yamanashi.jp","oshino.yamanashi.jp","otsuki.yamanashi.jp","showa.yamanashi.jp","tabayama.yamanashi.jp","tsuru.yamanashi.jp","uenohara.yamanashi.jp","yamanakako.yamanashi.jp","yamanashi.yamanashi.jp","ke","ac.ke","co.ke","go.ke","info.ke","me.ke","mobi.ke","ne.ke","or.ke","sc.ke","kg","org.kg","net.kg","com.kg","edu.kg","gov.kg","mil.kg","*.kh","ki","edu.ki","biz.ki","net.ki","org.ki","gov.ki","info.ki","com.ki","km","org.km","nom.km","gov.km","prd.km","tm.km","edu.km","mil.km","ass.km","com.km","coop.km","asso.km","presse.km","medecin.km","notaires.km","pharmaciens.km","veterinaire.km","gouv.km","kn","net.kn","org.kn","edu.kn","gov.kn","kp","com.kp","edu.kp","gov.kp","org.kp","rep.kp","tra.kp","kr","ac.kr","co.kr","es.kr","go.kr","hs.kr","kg.kr","mil.kr","ms.kr","ne.kr","or.kr","pe.kr","re.kr","sc.kr","busan.kr","chungbuk.kr","chungnam.kr","daegu.kr","daejeon.kr","gangwon.kr","gwangju.kr","gyeongbuk.kr","gyeonggi.kr","gyeongnam.kr","incheon.kr","jeju.kr","jeonbuk.kr","jeonnam.kr","seoul.kr","ulsan.kr","kw","com.kw","edu.kw","emb.kw","gov.kw","ind.kw","net.kw","org.kw","ky","edu.ky","gov.ky","com.ky","org.ky","net.ky","kz","org.kz","edu.kz","net.kz","gov.kz","mil.kz","com.kz","la","int.la","net.la","info.la","edu.la","gov.la","per.la","com.la","org.la","lb","com.lb","edu.lb","gov.lb","net.lb","org.lb","lc","com.lc","net.lc","co.lc","org.lc","edu.lc","gov.lc","li","lk","gov.lk","sch.lk","net.lk","int.lk","com.lk","org.lk","edu.lk","ngo.lk","soc.lk","web.lk","ltd.lk","assn.lk","grp.lk","hotel.lk","ac.lk","lr","com.lr","edu.lr","gov.lr","org.lr","net.lr","ls","ac.ls","biz.ls","co.ls","edu.ls","gov.ls","info.ls","net.ls","org.ls","sc.ls","lt","gov.lt","lu","lv","com.lv","edu.lv","gov.lv","org.lv","mil.lv","id.lv","net.lv","asn.lv","conf.lv","ly","com.ly","net.ly","gov.ly","plc.ly","edu.ly","sch.ly","med.ly","org.ly","id.ly","ma","co.ma","net.ma","gov.ma","org.ma","ac.ma","press.ma","mc","tm.mc","asso.mc","md","me","co.me","net.me","org.me","edu.me","ac.me","gov.me","its.me","priv.me","mg","org.mg","nom.mg","gov.mg","prd.mg","tm.mg","edu.mg","mil.mg","com.mg","co.mg","mh","mil","mk","com.mk","org.mk","net.mk","edu.mk","gov.mk","inf.mk","name.mk","ml","com.ml","edu.ml","gouv.ml","gov.ml","net.ml","org.ml","presse.ml","*.mm","mn","gov.mn","edu.mn","org.mn","mo","com.mo","net.mo","org.mo","edu.mo","gov.mo","mobi","mp","mq","mr","gov.mr","ms","com.ms","edu.ms","gov.ms","net.ms","org.ms","mt","com.mt","edu.mt","net.mt","org.mt","mu","com.mu","net.mu","org.mu","gov.mu","ac.mu","co.mu","or.mu","museum","academy.museum","agriculture.museum","air.museum","airguard.museum","alabama.museum","alaska.museum","amber.museum","ambulance.museum","american.museum","americana.museum","americanantiques.museum","americanart.museum","amsterdam.museum","and.museum","annefrank.museum","anthro.museum","anthropology.museum","antiques.museum","aquarium.museum","arboretum.museum","archaeological.museum","archaeology.museum","architecture.museum","art.museum","artanddesign.museum","artcenter.museum","artdeco.museum","arteducation.museum","artgallery.museum","arts.museum","artsandcrafts.museum","asmatart.museum","assassination.museum","assisi.museum","association.museum","astronomy.museum","atlanta.museum","austin.museum","australia.museum","automotive.museum","aviation.museum","axis.museum","badajoz.museum","baghdad.museum","bahn.museum","bale.museum","baltimore.museum","barcelona.museum","baseball.museum","basel.museum","baths.museum","bauern.museum","beauxarts.museum","beeldengeluid.museum","bellevue.museum","bergbau.museum","berkeley.museum","berlin.museum","bern.museum","bible.museum","bilbao.museum","bill.museum","birdart.museum","birthplace.museum","bonn.museum","boston.museum","botanical.museum","botanicalgarden.museum","botanicgarden.museum","botany.museum","brandywinevalley.museum","brasil.museum","bristol.museum","british.museum","britishcolumbia.museum","broadcast.museum","brunel.museum","brussel.museum","brussels.museum","bruxelles.museum","building.museum","burghof.museum","bus.museum","bushey.museum","cadaques.museum","california.museum","cambridge.museum","can.museum","canada.museum","capebreton.museum","carrier.museum","cartoonart.museum","casadelamoneda.museum","castle.museum","castres.museum","celtic.museum","center.museum","chattanooga.museum","cheltenham.museum","chesapeakebay.museum","chicago.museum","children.museum","childrens.museum","childrensgarden.museum","chiropractic.museum","chocolate.museum","christiansburg.museum","cincinnati.museum","cinema.museum","circus.museum","civilisation.museum","civilization.museum","civilwar.museum","clinton.museum","clock.museum","coal.museum","coastaldefence.museum","cody.museum","coldwar.museum","collection.museum","colonialwilliamsburg.museum","coloradoplateau.museum","columbia.museum","columbus.museum","communication.museum","communications.museum","community.museum","computer.museum","computerhistory.museum","comunicaÃ§Ãµes.museum","contemporary.museum","contemporaryart.museum","convent.museum","copenhagen.museum","corporation.museum","correios-e-telecomunicaÃ§Ãµes.museum","corvette.museum","costume.museum","countryestate.museum","county.museum","crafts.museum","cranbrook.museum","creation.museum","cultural.museum","culturalcenter.museum","culture.museum","cyber.museum","cymru.museum","dali.museum","dallas.museum","database.museum","ddr.museum","decorativearts.museum","delaware.museum","delmenhorst.museum","denmark.museum","depot.museum","design.museum","detroit.museum","dinosaur.museum","discovery.museum","dolls.museum","donostia.museum","durham.museum","eastafrica.museum","eastcoast.museum","education.museum","educational.museum","egyptian.museum","eisenbahn.museum","elburg.museum","elvendrell.museum","embroidery.museum","encyclopedic.museum","england.museum","entomology.museum","environment.museum","environmentalconservation.museum","epilepsy.museum","essex.museum","estate.museum","ethnology.museum","exeter.museum","exhibition.museum","family.museum","farm.museum","farmequipment.museum","farmers.museum","farmstead.museum","field.museum","figueres.museum","filatelia.museum","film.museum","fineart.museum","finearts.museum","finland.museum","flanders.museum","florida.museum","force.museum","fortmissoula.museum","fortworth.museum","foundation.museum","francaise.museum","frankfurt.museum","franziskaner.museum","freemasonry.museum","freiburg.museum","fribourg.museum","frog.museum","fundacio.museum","furniture.museum","gallery.museum","garden.museum","gateway.museum","geelvinck.museum","gemological.museum","geology.museum","georgia.museum","giessen.museum","glas.museum","glass.museum","gorge.museum","grandrapids.museum","graz.museum","guernsey.museum","halloffame.museum","hamburg.museum","handson.museum","harvestcelebration.museum","hawaii.museum","health.museum","heimatunduhren.museum","hellas.museum","helsinki.museum","hembygdsforbund.museum","heritage.museum","histoire.museum","historical.museum","historicalsociety.museum","historichouses.museum","historisch.museum","historisches.museum","history.museum","historyofscience.museum","horology.museum","house.museum","humanities.museum","illustration.museum","imageandsound.museum","indian.museum","indiana.museum","indianapolis.museum","indianmarket.museum","intelligence.museum","interactive.museum","iraq.museum","iron.museum","isleofman.museum","jamison.museum","jefferson.museum","jerusalem.museum","jewelry.museum","jewish.museum","jewishart.museum","jfk.museum","journalism.museum","judaica.museum","judygarland.museum","juedisches.museum","juif.museum","karate.museum","karikatur.museum","kids.museum","koebenhavn.museum","koeln.museum","kunst.museum","kunstsammlung.museum","kunstunddesign.museum","labor.museum","labour.museum","lajolla.museum","lancashire.museum","landes.museum","lans.museum","lÃ¤ns.museum","larsson.museum","lewismiller.museum","lincoln.museum","linz.museum","living.museum","livinghistory.museum","localhistory.museum","london.museum","losangeles.museum","louvre.museum","loyalist.museum","lucerne.museum","luxembourg.museum","luzern.museum","mad.museum","madrid.museum","mallorca.museum","manchester.museum","mansion.museum","mansions.museum","manx.museum","marburg.museum","maritime.museum","maritimo.museum","maryland.museum","marylhurst.museum","media.museum","medical.museum","medizinhistorisches.museum","meeres.museum","memorial.museum","mesaverde.museum","michigan.museum","midatlantic.museum","military.museum","mill.museum","miners.museum","mining.museum","minnesota.museum","missile.museum","missoula.museum","modern.museum","moma.museum","money.museum","monmouth.museum","monticello.museum","montreal.museum","moscow.museum","motorcycle.museum","muenchen.museum","muenster.museum","mulhouse.museum","muncie.museum","museet.museum","museumcenter.museum","museumvereniging.museum","music.museum","national.museum","nationalfirearms.museum","nationalheritage.museum","nativeamerican.museum","naturalhistory.museum","naturalhistorymuseum.museum","naturalsciences.museum","nature.museum","naturhistorisches.museum","natuurwetenschappen.museum","naumburg.museum","naval.museum","nebraska.museum","neues.museum","newhampshire.museum","newjersey.museum","newmexico.museum","newport.museum","newspaper.museum","newyork.museum","niepce.museum","norfolk.museum","north.museum","nrw.museum","nyc.museum","nyny.museum","oceanographic.museum","oceanographique.museum","omaha.museum","online.museum","ontario.museum","openair.museum","oregon.museum","oregontrail.museum","otago.museum","oxford.museum","pacific.museum","paderborn.museum","palace.museum","paleo.museum","palmsprings.museum","panama.museum","paris.museum","pasadena.museum","pharmacy.museum","philadelphia.museum","philadelphiaarea.museum","philately.museum","phoenix.museum","photography.museum","pilots.museum","pittsburgh.museum","planetarium.museum","plantation.museum","plants.museum","plaza.museum","portal.museum","portland.museum","portlligat.museum","posts-and-telecommunications.museum","preservation.museum","presidio.museum","press.museum","project.museum","public.museum","pubol.museum","quebec.museum","railroad.museum","railway.museum","research.museum","resistance.museum","riodejaneiro.museum","rochester.museum","rockart.museum","roma.museum","russia.museum","saintlouis.museum","salem.museum","salvadordali.museum","salzburg.museum","sandiego.museum","sanfrancisco.museum","santabarbara.museum","santacruz.museum","santafe.museum","saskatchewan.museum","satx.museum","savannahga.museum","schlesisches.museum","schoenbrunn.museum","schokoladen.museum","school.museum","schweiz.museum","science.museum","scienceandhistory.museum","scienceandindustry.museum","sciencecenter.museum","sciencecenters.museum","science-fiction.museum","sciencehistory.museum","sciences.museum","sciencesnaturelles.museum","scotland.museum","seaport.museum","settlement.museum","settlers.museum","shell.museum","sherbrooke.museum","sibenik.museum","silk.museum","ski.museum","skole.museum","society.museum","sologne.museum","soundandvision.museum","southcarolina.museum","southwest.museum","space.museum","spy.museum","square.museum","stadt.museum","stalbans.museum","starnberg.museum","state.museum","stateofdelaware.museum","station.museum","steam.museum","steiermark.museum","stjohn.museum","stockholm.museum","stpetersburg.museum","stuttgart.museum","suisse.museum","surgeonshall.museum","surrey.museum","svizzera.museum","sweden.museum","sydney.museum","tank.museum","tcm.museum","technology.museum","telekommunikation.museum","television.museum","texas.museum","textile.museum","theater.museum","time.museum","timekeeping.museum","topology.museum","torino.museum","touch.museum","town.museum","transport.museum","tree.museum","trolley.museum","trust.museum","trustee.museum","uhren.museum","ulm.museum","undersea.museum","university.museum","usa.museum","usantiques.museum","usarts.museum","uscountryestate.museum","usculture.museum","usdecorativearts.museum","usgarden.museum","ushistory.museum","ushuaia.museum","uslivinghistory.museum","utah.museum","uvic.museum","valley.museum","vantaa.museum","versailles.museum","viking.museum","village.museum","virginia.museum","virtual.museum","virtuel.museum","vlaanderen.museum","volkenkunde.museum","wales.museum","wallonie.museum","war.museum","washingtondc.museum","watchandclock.museum","watch-and-clock.museum","western.museum","westfalen.museum","whaling.museum","wildlife.museum","williamsburg.museum","windmill.museum","workshop.museum","york.museum","yorkshire.museum","yosemite.museum","youth.museum","zoological.museum","zoology.museum","×™×¨×•×©×œ×™×�.museum","Ð¸ÐºÐ¾Ð¼.museum","mv","aero.mv","biz.mv","com.mv","coop.mv","edu.mv","gov.mv","info.mv","int.mv","mil.mv","museum.mv","name.mv","net.mv","org.mv","pro.mv","mw","ac.mw","biz.mw","co.mw","com.mw","coop.mw","edu.mw","gov.mw","int.mw","museum.mw","net.mw","org.mw","mx","com.mx","org.mx","gob.mx","edu.mx","net.mx","my","com.my","net.my","org.my","gov.my","edu.my","mil.my","name.my","mz","ac.mz","adv.mz","co.mz","edu.mz","gov.mz","mil.mz","net.mz","org.mz","na","info.na","pro.na","name.na","school.na","or.na","dr.na","us.na","mx.na","ca.na","in.na","cc.na","tv.na","ws.na","mobi.na","co.na","com.na","org.na","name","nc","asso.nc","nom.nc","ne","net","nf","com.nf","net.nf","per.nf","rec.nf","web.nf","arts.nf","firm.nf","info.nf","other.nf","store.nf","ng","com.ng","edu.ng","gov.ng","i.ng","mil.ng","mobi.ng","name.ng","net.ng","org.ng","sch.ng","ni","ac.ni","biz.ni","co.ni","com.ni","edu.ni","gob.ni","in.ni","info.ni","int.ni","mil.ni","net.ni","nom.ni","org.ni","web.ni","nl","no","fhs.no","vgs.no","fylkesbibl.no","folkebibl.no","museum.no","idrett.no","priv.no","mil.no","stat.no","dep.no","kommune.no","herad.no","aa.no","ah.no","bu.no","fm.no","hl.no","hm.no","jan-mayen.no","mr.no","nl.no","nt.no","of.no","ol.no","oslo.no","rl.no","sf.no","st.no","svalbard.no","tm.no","tr.no","va.no","vf.no","gs.aa.no","gs.ah.no","gs.bu.no","gs.fm.no","gs.hl.no","gs.hm.no","gs.jan-mayen.no","gs.mr.no","gs.nl.no","gs.nt.no","gs.of.no","gs.ol.no","gs.oslo.no","gs.rl.no","gs.sf.no","gs.st.no","gs.svalbard.no","gs.tm.no","gs.tr.no","gs.va.no","gs.vf.no","akrehamn.no","Ã¥krehamn.no","algard.no","Ã¥lgÃ¥rd.no","arna.no","brumunddal.no","bryne.no","bronnoysund.no","brÃ¸nnÃ¸ysund.no","drobak.no","drÃ¸bak.no","egersund.no","fetsund.no","floro.no","florÃ¸.no","fredrikstad.no","hokksund.no","honefoss.no","hÃ¸nefoss.no","jessheim.no","jorpeland.no","jÃ¸rpeland.no","kirkenes.no","kopervik.no","krokstadelva.no","langevag.no","langevÃ¥g.no","leirvik.no","mjondalen.no","mjÃ¸ndalen.no","mo-i-rana.no","mosjoen.no","mosjÃ¸en.no","nesoddtangen.no","orkanger.no","osoyro.no","osÃ¸yro.no","raholt.no","rÃ¥holt.no","sandnessjoen.no","sandnessjÃ¸en.no","skedsmokorset.no","slattum.no","spjelkavik.no","stathelle.no","stavern.no","stjordalshalsen.no","stjÃ¸rdalshalsen.no","tananger.no","tranby.no","vossevangen.no","afjord.no","Ã¥fjord.no","agdenes.no","al.no","Ã¥l.no","alesund.no","Ã¥lesund.no","alstahaug.no","alta.no","Ã¡ltÃ¡.no","alaheadju.no","Ã¡laheadju.no","alvdal.no","amli.no","Ã¥mli.no","amot.no","Ã¥mot.no","andebu.no","andoy.no","andÃ¸y.no","andasuolo.no","ardal.no","Ã¥rdal.no","aremark.no","arendal.no","Ã¥s.no","aseral.no","Ã¥seral.no","asker.no","askim.no","askvoll.no","askoy.no","askÃ¸y.no","asnes.no","Ã¥snes.no","audnedaln.no","aukra.no","aure.no","aurland.no","aurskog-holand.no","aurskog-hÃ¸land.no","austevoll.no","austrheim.no","averoy.no","averÃ¸y.no","balestrand.no","ballangen.no","balat.no","bÃ¡lÃ¡t.no","balsfjord.no","bahccavuotna.no","bÃ¡hccavuotna.no","bamble.no","bardu.no","beardu.no","beiarn.no","bajddar.no","bÃ¡jddar.no","baidar.no","bÃ¡idÃ¡r.no","berg.no","bergen.no","berlevag.no","berlevÃ¥g.no","bearalvahki.no","bearalvÃ¡hki.no","bindal.no","birkenes.no","bjarkoy.no","bjarkÃ¸y.no","bjerkreim.no","bjugn.no","bodo.no","bodÃ¸.no","badaddja.no","bÃ¥dÃ¥ddjÃ¥.no","budejju.no","bokn.no","bremanger.no","bronnoy.no","brÃ¸nnÃ¸y.no","bygland.no","bykle.no","barum.no","bÃ¦rum.no","bo.telemark.no","bÃ¸.telemark.no","bo.nordland.no","bÃ¸.nordland.no","bievat.no","bievÃ¡t.no","bomlo.no","bÃ¸mlo.no","batsfjord.no","bÃ¥tsfjord.no","bahcavuotna.no","bÃ¡hcavuotna.no","dovre.no","drammen.no","drangedal.no","dyroy.no","dyrÃ¸y.no","donna.no","dÃ¸nna.no","eid.no","eidfjord.no","eidsberg.no","eidskog.no","eidsvoll.no","eigersund.no","elverum.no","enebakk.no","engerdal.no","etne.no","etnedal.no","evenes.no","evenassi.no","evenÃ¡Å¡Å¡i.no","evje-og-hornnes.no","farsund.no","fauske.no","fuossko.no","fuoisku.no","fedje.no","fet.no","finnoy.no","finnÃ¸y.no","fitjar.no","fjaler.no","fjell.no","flakstad.no","flatanger.no","flekkefjord.no","flesberg.no","flora.no","fla.no","flÃ¥.no","folldal.no","forsand.no","fosnes.no","frei.no","frogn.no","froland.no","frosta.no","frana.no","frÃ¦na.no","froya.no","frÃ¸ya.no","fusa.no","fyresdal.no","forde.no","fÃ¸rde.no","gamvik.no","gangaviika.no","gÃ¡Å‹gaviika.no","gaular.no","gausdal.no","gildeskal.no","gildeskÃ¥l.no","giske.no","gjemnes.no","gjerdrum.no","gjerstad.no","gjesdal.no","gjovik.no","gjÃ¸vik.no","gloppen.no","gol.no","gran.no","grane.no","granvin.no","gratangen.no","grimstad.no","grong.no","kraanghke.no","krÃ¥anghke.no","grue.no","gulen.no","hadsel.no","halden.no","halsa.no","hamar.no","hamaroy.no","habmer.no","hÃ¡bmer.no","hapmir.no","hÃ¡pmir.no","hammerfest.no","hammarfeasta.no","hÃ¡mmÃ¡rfeasta.no","haram.no","hareid.no","harstad.no","hasvik.no","aknoluokta.no","Ã¡kÅ‹oluokta.no","hattfjelldal.no","aarborte.no","haugesund.no","hemne.no","hemnes.no","hemsedal.no","heroy.more-og-romsdal.no","herÃ¸y.mÃ¸re-og-romsdal.no","heroy.nordland.no","herÃ¸y.nordland.no","hitra.no","hjartdal.no","hjelmeland.no","hobol.no","hobÃ¸l.no","hof.no","hol.no","hole.no","holmestrand.no","holtalen.no","holtÃ¥len.no","hornindal.no","horten.no","hurdal.no","hurum.no","hvaler.no","hyllestad.no","hagebostad.no","hÃ¦gebostad.no","hoyanger.no","hÃ¸yanger.no","hoylandet.no","hÃ¸ylandet.no","ha.no","hÃ¥.no","ibestad.no","inderoy.no","inderÃ¸y.no","iveland.no","jevnaker.no","jondal.no","jolster.no","jÃ¸lster.no","karasjok.no","karasjohka.no","kÃ¡rÃ¡Å¡johka.no","karlsoy.no","galsa.no","gÃ¡lsÃ¡.no","karmoy.no","karmÃ¸y.no","kautokeino.no","guovdageaidnu.no","klepp.no","klabu.no","klÃ¦bu.no","kongsberg.no","kongsvinger.no","kragero.no","kragerÃ¸.no","kristiansand.no","kristiansund.no","krodsherad.no","krÃ¸dsherad.no","kvalsund.no","rahkkeravju.no","rÃ¡hkkerÃ¡vju.no","kvam.no","kvinesdal.no","kvinnherad.no","kviteseid.no","kvitsoy.no","kvitsÃ¸y.no","kvafjord.no","kvÃ¦fjord.no","giehtavuoatna.no","kvanangen.no","kvÃ¦nangen.no","navuotna.no","nÃ¡vuotna.no","kafjord.no","kÃ¥fjord.no","gaivuotna.no","gÃ¡ivuotna.no","larvik.no","lavangen.no","lavagis.no","loabat.no","loabÃ¡t.no","lebesby.no","davvesiida.no","leikanger.no","leirfjord.no","leka.no","leksvik.no","lenvik.no","leangaviika.no","leaÅ‹gaviika.no","lesja.no","levanger.no","lier.no","lierne.no","lillehammer.no","lillesand.no","lindesnes.no","lindas.no","lindÃ¥s.no","lom.no","loppa.no","lahppi.no","lÃ¡hppi.no","lund.no","lunner.no","luroy.no","lurÃ¸y.no","luster.no","lyngdal.no","lyngen.no","ivgu.no","lardal.no","lerdal.no","lÃ¦rdal.no","lodingen.no","lÃ¸dingen.no","lorenskog.no","lÃ¸renskog.no","loten.no","lÃ¸ten.no","malvik.no","masoy.no","mÃ¥sÃ¸y.no","muosat.no","muosÃ¡t.no","mandal.no","marker.no","marnardal.no","masfjorden.no","meland.no","meldal.no","melhus.no","meloy.no","melÃ¸y.no","meraker.no","merÃ¥ker.no","moareke.no","moÃ¥reke.no","midsund.no","midtre-gauldal.no","modalen.no","modum.no","molde.no","moskenes.no","moss.no","mosvik.no","malselv.no","mÃ¥lselv.no","malatvuopmi.no","mÃ¡latvuopmi.no","namdalseid.no","aejrie.no","namsos.no","namsskogan.no","naamesjevuemie.no","nÃ¥Ã¥mesjevuemie.no","laakesvuemie.no","nannestad.no","narvik.no","narviika.no","naustdal.no","nedre-eiker.no","nes.akershus.no","nes.buskerud.no","nesna.no","nesodden.no","nesseby.no","unjarga.no","unjÃ¡rga.no","nesset.no","nissedal.no","nittedal.no","nord-aurdal.no","nord-fron.no","nord-odal.no","norddal.no","nordkapp.no","davvenjarga.no","davvenjÃ¡rga.no","nordre-land.no","nordreisa.no","raisa.no","rÃ¡isa.no","nore-og-uvdal.no","notodden.no","naroy.no","nÃ¦rÃ¸y.no","notteroy.no","nÃ¸tterÃ¸y.no","odda.no","oksnes.no","Ã¸ksnes.no","oppdal.no","oppegard.no","oppegÃ¥rd.no","orkdal.no","orland.no","Ã¸rland.no","orskog.no","Ã¸rskog.no","orsta.no","Ã¸rsta.no","os.hedmark.no","os.hordaland.no","osen.no","osteroy.no","osterÃ¸y.no","ostre-toten.no","Ã¸stre-toten.no","overhalla.no","ovre-eiker.no","Ã¸vre-eiker.no","oyer.no","Ã¸yer.no","oygarden.no","Ã¸ygarden.no","oystre-slidre.no","Ã¸ystre-slidre.no","porsanger.no","porsangu.no","porsÃ¡Å‹gu.no","porsgrunn.no","radoy.no","radÃ¸y.no","rakkestad.no","rana.no","ruovat.no","randaberg.no","rauma.no","rendalen.no","rennebu.no","rennesoy.no","rennesÃ¸y.no","rindal.no","ringebu.no","ringerike.no","ringsaker.no","rissa.no","risor.no","risÃ¸r.no","roan.no","rollag.no","rygge.no","ralingen.no","rÃ¦lingen.no","rodoy.no","rÃ¸dÃ¸y.no","romskog.no","rÃ¸mskog.no","roros.no","rÃ¸ros.no","rost.no","rÃ¸st.no","royken.no","rÃ¸yken.no","royrvik.no","rÃ¸yrvik.no","rade.no","rÃ¥de.no","salangen.no","siellak.no","saltdal.no","salat.no","sÃ¡lÃ¡t.no","sÃ¡lat.no","samnanger.no","sande.more-og-romsdal.no","sande.mÃ¸re-og-romsdal.no","sande.vestfold.no","sandefjord.no","sandnes.no","sandoy.no","sandÃ¸y.no","sarpsborg.no","sauda.no","sauherad.no","sel.no","selbu.no","selje.no","seljord.no","sigdal.no","siljan.no","sirdal.no","skaun.no","skedsmo.no","ski.no","skien.no","skiptvet.no","skjervoy.no","skjervÃ¸y.no","skierva.no","skiervÃ¡.no","skjak.no","skjÃ¥k.no","skodje.no","skanland.no","skÃ¥nland.no","skanit.no","skÃ¡nit.no","smola.no","smÃ¸la.no","snillfjord.no","snasa.no","snÃ¥sa.no","snoasa.no","snaase.no","snÃ¥ase.no","sogndal.no","sokndal.no","sola.no","solund.no","songdalen.no","sortland.no","spydeberg.no","stange.no","stavanger.no","steigen.no","steinkjer.no","stjordal.no","stjÃ¸rdal.no","stokke.no","stor-elvdal.no","stord.no","stordal.no","storfjord.no","omasvuotna.no","strand.no","stranda.no","stryn.no","sula.no","suldal.no","sund.no","sunndal.no","surnadal.no","sveio.no","svelvik.no","sykkylven.no","sogne.no","sÃ¸gne.no","somna.no","sÃ¸mna.no","sondre-land.no","sÃ¸ndre-land.no","sor-aurdal.no","sÃ¸r-aurdal.no","sor-fron.no","sÃ¸r-fron.no","sor-odal.no","sÃ¸r-odal.no","sor-varanger.no","sÃ¸r-varanger.no","matta-varjjat.no","mÃ¡tta-vÃ¡rjjat.no","sorfold.no","sÃ¸rfold.no","sorreisa.no","sÃ¸rreisa.no","sorum.no","sÃ¸rum.no","tana.no","deatnu.no","time.no","tingvoll.no","tinn.no","tjeldsund.no","dielddanuorri.no","tjome.no","tjÃ¸me.no","tokke.no","tolga.no","torsken.no","tranoy.no","tranÃ¸y.no","tromso.no","tromsÃ¸.no","tromsa.no","romsa.no","trondheim.no","troandin.no","trysil.no","trana.no","trÃ¦na.no","trogstad.no","trÃ¸gstad.no","tvedestrand.no","tydal.no","tynset.no","tysfjord.no","divtasvuodna.no","divttasvuotna.no","tysnes.no","tysvar.no","tysvÃ¦r.no","tonsberg.no","tÃ¸nsberg.no","ullensaker.no","ullensvang.no","ulvik.no","utsira.no","vadso.no","vadsÃ¸.no","cahcesuolo.no","Ä�Ã¡hcesuolo.no","vaksdal.no","valle.no","vang.no","vanylven.no","vardo.no","vardÃ¸.no","varggat.no","vÃ¡rggÃ¡t.no","vefsn.no","vaapste.no","vega.no","vegarshei.no","vegÃ¥rshei.no","vennesla.no","verdal.no","verran.no","vestby.no","vestnes.no","vestre-slidre.no","vestre-toten.no","vestvagoy.no","vestvÃ¥gÃ¸y.no","vevelstad.no","vik.no","vikna.no","vindafjord.no","volda.no","voss.no","varoy.no","vÃ¦rÃ¸y.no","vagan.no","vÃ¥gan.no","voagat.no","vagsoy.no","vÃ¥gsÃ¸y.no","vaga.no","vÃ¥gÃ¥.no","valer.ostfold.no","vÃ¥ler.Ã¸stfold.no","valer.hedmark.no","vÃ¥ler.hedmark.no","*.np","nr","biz.nr","info.nr","gov.nr","edu.nr","org.nr","net.nr","com.nr","nu","nz","ac.nz","co.nz","cri.nz","geek.nz","gen.nz","govt.nz","health.nz","iwi.nz","kiwi.nz","maori.nz","mil.nz","mÄ�ori.nz","net.nz","org.nz","parliament.nz","school.nz","om","co.om","com.om","edu.om","gov.om","med.om","museum.om","net.om","org.om","pro.om","onion","org","pa","ac.pa","gob.pa","com.pa","org.pa","sld.pa","edu.pa","net.pa","ing.pa","abo.pa","med.pa","nom.pa","pe","edu.pe","gob.pe","nom.pe","mil.pe","org.pe","com.pe","net.pe","pf","com.pf","org.pf","edu.pf","*.pg","ph","com.ph","net.ph","org.ph","gov.ph","edu.ph","ngo.ph","mil.ph","i.ph","pk","com.pk","net.pk","edu.pk","org.pk","fam.pk","biz.pk","web.pk","gov.pk","gob.pk","gok.pk","gon.pk","gop.pk","gos.pk","info.pk","pl","com.pl","net.pl","org.pl","aid.pl","agro.pl","atm.pl","auto.pl","biz.pl","edu.pl","gmina.pl","gsm.pl","info.pl","mail.pl","miasta.pl","media.pl","mil.pl","nieruchomosci.pl","nom.pl","pc.pl","powiat.pl","priv.pl","realestate.pl","rel.pl","sex.pl","shop.pl","sklep.pl","sos.pl","szkola.pl","targi.pl","tm.pl","tourism.pl","travel.pl","turystyka.pl","gov.pl","ap.gov.pl","ic.gov.pl","is.gov.pl","us.gov.pl","kmpsp.gov.pl","kppsp.gov.pl","kwpsp.gov.pl","psp.gov.pl","wskr.gov.pl","kwp.gov.pl","mw.gov.pl","ug.gov.pl","um.gov.pl","umig.gov.pl","ugim.gov.pl","upow.gov.pl","uw.gov.pl","starostwo.gov.pl","pa.gov.pl","po.gov.pl","psse.gov.pl","pup.gov.pl","rzgw.gov.pl","sa.gov.pl","so.gov.pl","sr.gov.pl","wsa.gov.pl","sko.gov.pl","uzs.gov.pl","wiih.gov.pl","winb.gov.pl","pinb.gov.pl","wios.gov.pl","witd.gov.pl","wzmiuw.gov.pl","piw.gov.pl","wiw.gov.pl","griw.gov.pl","wif.gov.pl","oum.gov.pl","sdn.gov.pl","zp.gov.pl","uppo.gov.pl","mup.gov.pl","wuoz.gov.pl","konsulat.gov.pl","oirm.gov.pl","augustow.pl","babia-gora.pl","bedzin.pl","beskidy.pl","bialowieza.pl","bialystok.pl","bielawa.pl","bieszczady.pl","boleslawiec.pl","bydgoszcz.pl","bytom.pl","cieszyn.pl","czeladz.pl","czest.pl","dlugoleka.pl","elblag.pl","elk.pl","glogow.pl","gniezno.pl","gorlice.pl","grajewo.pl","ilawa.pl","jaworzno.pl","jelenia-gora.pl","jgora.pl","kalisz.pl","kazimierz-dolny.pl","karpacz.pl","kartuzy.pl","kaszuby.pl","katowice.pl","kepno.pl","ketrzyn.pl","klodzko.pl","kobierzyce.pl","kolobrzeg.pl","konin.pl","konskowola.pl","kutno.pl","lapy.pl","lebork.pl","legnica.pl","lezajsk.pl","limanowa.pl","lomza.pl","lowicz.pl","lubin.pl","lukow.pl","malbork.pl","malopolska.pl","mazowsze.pl","mazury.pl","mielec.pl","mielno.pl","mragowo.pl","naklo.pl","nowaruda.pl","nysa.pl","olawa.pl","olecko.pl","olkusz.pl","olsztyn.pl","opoczno.pl","opole.pl","ostroda.pl","ostroleka.pl","ostrowiec.pl","ostrowwlkp.pl","pila.pl","pisz.pl","podhale.pl","podlasie.pl","polkowice.pl","pomorze.pl","pomorskie.pl","prochowice.pl","pruszkow.pl","przeworsk.pl","pulawy.pl","radom.pl","rawa-maz.pl","rybnik.pl","rzeszow.pl","sanok.pl","sejny.pl","slask.pl","slupsk.pl","sosnowiec.pl","stalowa-wola.pl","skoczow.pl","starachowice.pl","stargard.pl","suwalki.pl","swidnica.pl","swiebodzin.pl","swinoujscie.pl","szczecin.pl","szczytno.pl","tarnobrzeg.pl","tgory.pl","turek.pl","tychy.pl","ustka.pl","walbrzych.pl","warmia.pl","warszawa.pl","waw.pl","wegrow.pl","wielun.pl","wlocl.pl","wloclawek.pl","wodzislaw.pl","wolomin.pl","wroclaw.pl","zachpomor.pl","zagan.pl","zarow.pl","zgora.pl","zgorzelec.pl","pm","pn","gov.pn","co.pn","org.pn","edu.pn","net.pn","post","pr","com.pr","net.pr","org.pr","gov.pr","edu.pr","isla.pr","pro.pr","biz.pr","info.pr","name.pr","est.pr","prof.pr","ac.pr","pro","aaa.pro","aca.pro","acct.pro","avocat.pro","bar.pro","cpa.pro","eng.pro","jur.pro","law.pro","med.pro","recht.pro","ps","edu.ps","gov.ps","sec.ps","plo.ps","com.ps","org.ps","net.ps","pt","net.pt","gov.pt","org.pt","edu.pt","int.pt","publ.pt","com.pt","nome.pt","pw","co.pw","ne.pw","or.pw","ed.pw","go.pw","belau.pw","py","com.py","coop.py","edu.py","gov.py","mil.py","net.py","org.py","qa","com.qa","edu.qa","gov.qa","mil.qa","name.qa","net.qa","org.qa","sch.qa","re","asso.re","com.re","nom.re","ro","arts.ro","com.ro","firm.ro","info.ro","nom.ro","nt.ro","org.ro","rec.ro","store.ro","tm.ro","www.ro","rs","ac.rs","co.rs","edu.rs","gov.rs","in.rs","org.rs","ru","rw","ac.rw","co.rw","coop.rw","gov.rw","mil.rw","net.rw","org.rw","sa","com.sa","net.sa","org.sa","gov.sa","med.sa","pub.sa","edu.sa","sch.sa","sb","com.sb","edu.sb","gov.sb","net.sb","org.sb","sc","com.sc","gov.sc","net.sc","org.sc","edu.sc","sd","com.sd","net.sd","org.sd","edu.sd","med.sd","tv.sd","gov.sd","info.sd","se","a.se","ac.se","b.se","bd.se","brand.se","c.se","d.se","e.se","f.se","fh.se","fhsk.se","fhv.se","g.se","h.se","i.se","k.se","komforb.se","kommunalforbund.se","komvux.se","l.se","lanbib.se","m.se","n.se","naturbruksgymn.se","o.se","org.se","p.se","parti.se","pp.se","press.se","r.se","s.se","t.se","tm.se","u.se","w.se","x.se","y.se","z.se","sg","com.sg","net.sg","org.sg","gov.sg","edu.sg","per.sg","sh","com.sh","net.sh","gov.sh","org.sh","mil.sh","si","sj","sk","sl","com.sl","net.sl","edu.sl","gov.sl","org.sl","sm","sn","art.sn","com.sn","edu.sn","gouv.sn","org.sn","perso.sn","univ.sn","so","com.so","edu.so","gov.so","me.so","net.so","org.so","sr","ss","biz.ss","com.ss","edu.ss","gov.ss","net.ss","org.ss","st","co.st","com.st","consulado.st","edu.st","embaixada.st","gov.st","mil.st","net.st","org.st","principe.st","saotome.st","store.st","su","sv","com.sv","edu.sv","gob.sv","org.sv","red.sv","sx","gov.sx","sy","edu.sy","gov.sy","net.sy","mil.sy","com.sy","org.sy","sz","co.sz","ac.sz","org.sz","tc","td","tel","tf","tg","th","ac.th","co.th","go.th","in.th","mi.th","net.th","or.th","tj","ac.tj","biz.tj","co.tj","com.tj","edu.tj","go.tj","gov.tj","int.tj","mil.tj","name.tj","net.tj","nic.tj","org.tj","test.tj","web.tj","tk","tl","gov.tl","tm","com.tm","co.tm","org.tm","net.tm","nom.tm","gov.tm","mil.tm","edu.tm","tn","com.tn","ens.tn","fin.tn","gov.tn","ind.tn","intl.tn","nat.tn","net.tn","org.tn","info.tn","perso.tn","tourism.tn","edunet.tn","rnrt.tn","rns.tn","rnu.tn","mincom.tn","agrinet.tn","defense.tn","turen.tn","to","com.to","gov.to","net.to","org.to","edu.to","mil.to","tr","av.tr","bbs.tr","bel.tr","biz.tr","com.tr","dr.tr","edu.tr","gen.tr","gov.tr","info.tr","mil.tr","k12.tr","kep.tr","name.tr","net.tr","org.tr","pol.tr","tel.tr","tsk.tr","tv.tr","web.tr","nc.tr","gov.nc.tr","tt","co.tt","com.tt","org.tt","net.tt","biz.tt","info.tt","pro.tt","int.tt","coop.tt","jobs.tt","mobi.tt","travel.tt","museum.tt","aero.tt","name.tt","gov.tt","edu.tt","tv","tw","edu.tw","gov.tw","mil.tw","com.tw","net.tw","org.tw","idv.tw","game.tw","ebiz.tw","club.tw","ç¶²è·¯.tw","çµ„ç¹”.tw","å•†æ¥­.tw","tz","ac.tz","co.tz","go.tz","hotel.tz","info.tz","me.tz","mil.tz","mobi.tz","ne.tz","or.tz","sc.tz","tv.tz","ua","com.ua","edu.ua","gov.ua","in.ua","net.ua","org.ua","cherkassy.ua","cherkasy.ua","chernigov.ua","chernihiv.ua","chernivtsi.ua","chernovtsy.ua","ck.ua","cn.ua","cr.ua","crimea.ua","cv.ua","dn.ua","dnepropetrovsk.ua","dnipropetrovsk.ua","dominic.ua","donetsk.ua","dp.ua","if.ua","ivano-frankivsk.ua","kh.ua","kharkiv.ua","kharkov.ua","kherson.ua","khmelnitskiy.ua","khmelnytskyi.ua","kiev.ua","kirovograd.ua","km.ua","kr.ua","krym.ua","ks.ua","kv.ua","kyiv.ua","lg.ua","lt.ua","lugansk.ua","lutsk.ua","lv.ua","lviv.ua","mk.ua","mykolaiv.ua","nikolaev.ua","od.ua","odesa.ua","odessa.ua","pl.ua","poltava.ua","rivne.ua","rovno.ua","rv.ua","sb.ua","sebastopol.ua","sevastopol.ua","sm.ua","sumy.ua","te.ua","ternopil.ua","uz.ua","uzhgorod.ua","vinnica.ua","vinnytsia.ua","vn.ua","volyn.ua","yalta.ua","zaporizhzhe.ua","zaporizhzhia.ua","zhitomir.ua","zhytomyr.ua","zp.ua","zt.ua","ug","co.ug","or.ug","ac.ug","sc.ug","go.ug","ne.ug","com.ug","org.ug","uk","ac.uk","co.uk","gov.uk","ltd.uk","me.uk","net.uk","nhs.uk","org.uk","plc.uk","police.uk","*.sch.uk","us","dni.us","fed.us","isa.us","kids.us","nsn.us","ak.us","al.us","ar.us","as.us","az.us","ca.us","co.us","ct.us","dc.us","de.us","fl.us","ga.us","gu.us","hi.us","ia.us","id.us","il.us","in.us","ks.us","ky.us","la.us","ma.us","md.us","me.us","mi.us","mn.us","mo.us","ms.us","mt.us","nc.us","nd.us","ne.us","nh.us","nj.us","nm.us","nv.us","ny.us","oh.us","ok.us","or.us","pa.us","pr.us","ri.us","sc.us","sd.us","tn.us","tx.us","ut.us","vi.us","vt.us","va.us","wa.us","wi.us","wv.us","wy.us","k12.ak.us","k12.al.us","k12.ar.us","k12.as.us","k12.az.us","k12.ca.us","k12.co.us","k12.ct.us","k12.dc.us","k12.de.us","k12.fl.us","k12.ga.us","k12.gu.us","k12.ia.us","k12.id.us","k12.il.us","k12.in.us","k12.ks.us","k12.ky.us","k12.la.us","k12.ma.us","k12.md.us","k12.me.us","k12.mi.us","k12.mn.us","k12.mo.us","k12.ms.us","k12.mt.us","k12.nc.us","k12.ne.us","k12.nh.us","k12.nj.us","k12.nm.us","k12.nv.us","k12.ny.us","k12.oh.us","k12.ok.us","k12.or.us","k12.pa.us","k12.pr.us","k12.ri.us","k12.sc.us","k12.tn.us","k12.tx.us","k12.ut.us","k12.vi.us","k12.vt.us","k12.va.us","k12.wa.us","k12.wi.us","k12.wy.us","cc.ak.us","cc.al.us","cc.ar.us","cc.as.us","cc.az.us","cc.ca.us","cc.co.us","cc.ct.us","cc.dc.us","cc.de.us","cc.fl.us","cc.ga.us","cc.gu.us","cc.hi.us","cc.ia.us","cc.id.us","cc.il.us","cc.in.us","cc.ks.us","cc.ky.us","cc.la.us","cc.ma.us","cc.md.us","cc.me.us","cc.mi.us","cc.mn.us","cc.mo.us","cc.ms.us","cc.mt.us","cc.nc.us","cc.nd.us","cc.ne.us","cc.nh.us","cc.nj.us","cc.nm.us","cc.nv.us","cc.ny.us","cc.oh.us","cc.ok.us","cc.or.us","cc.pa.us","cc.pr.us","cc.ri.us","cc.sc.us","cc.sd.us","cc.tn.us","cc.tx.us","cc.ut.us","cc.vi.us","cc.vt.us","cc.va.us","cc.wa.us","cc.wi.us","cc.wv.us","cc.wy.us","lib.ak.us","lib.al.us","lib.ar.us","lib.as.us","lib.az.us","lib.ca.us","lib.co.us","lib.ct.us","lib.dc.us","lib.fl.us","lib.ga.us","lib.gu.us","lib.hi.us","lib.ia.us","lib.id.us","lib.il.us","lib.in.us","lib.ks.us","lib.ky.us","lib.la.us","lib.ma.us","lib.md.us","lib.me.us","lib.mi.us","lib.mn.us","lib.mo.us","lib.ms.us","lib.mt.us","lib.nc.us","lib.nd.us","lib.ne.us","lib.nh.us","lib.nj.us","lib.nm.us","lib.nv.us","lib.ny.us","lib.oh.us","lib.ok.us","lib.or.us","lib.pa.us","lib.pr.us","lib.ri.us","lib.sc.us","lib.sd.us","lib.tn.us","lib.tx.us","lib.ut.us","lib.vi.us","lib.vt.us","lib.va.us","lib.wa.us","lib.wi.us","lib.wy.us","pvt.k12.ma.us","chtr.k12.ma.us","paroch.k12.ma.us","ann-arbor.mi.us","cog.mi.us","dst.mi.us","eaton.mi.us","gen.mi.us","mus.mi.us","tec.mi.us","washtenaw.mi.us","uy","com.uy","edu.uy","gub.uy","mil.uy","net.uy","org.uy","uz","co.uz","com.uz","net.uz","org.uz","va","vc","com.vc","net.vc","org.vc","gov.vc","mil.vc","edu.vc","ve","arts.ve","co.ve","com.ve","e12.ve","edu.ve","firm.ve","gob.ve","gov.ve","info.ve","int.ve","mil.ve","net.ve","org.ve","rec.ve","store.ve","tec.ve","web.ve","vg","vi","co.vi","com.vi","k12.vi","net.vi","org.vi","vn","com.vn","net.vn","org.vn","edu.vn","gov.vn","int.vn","ac.vn","biz.vn","info.vn","name.vn","pro.vn","health.vn","vu","com.vu","edu.vu","net.vu","org.vu","wf","ws","com.ws","net.ws","org.ws","gov.ws","edu.ws","yt","Ø§Ù…Ø§Ø±Ø§Øª","Õ°Õ¡Õµ","à¦¬à¦¾à¦‚à¦²à¦¾","Ð±Ð³","Ð±ÐµÐ»","ä¸­å›½","ä¸­åœ‹","Ø§Ù„Ø¬Ø²Ø§Ø¦Ø±","Ù…ØµØ±","ÐµÑŽ","ÎµÏ…","Ù…ÙˆØ±ÙŠØªØ§Ù†ÙŠØ§","áƒ’áƒ”","ÎµÎ»","é¦™æ¸¯","å…¬å�¸.é¦™æ¸¯","æ•™è‚².é¦™æ¸¯","æ”¿åºœ.é¦™æ¸¯","å€‹äºº.é¦™æ¸¯","ç¶²çµ¡.é¦™æ¸¯","çµ„ç¹”.é¦™æ¸¯","à²­à²¾à²°à²¤","à¬­à¬¾à¬°à¬¤","à¦­à¦¾à§°à¦¤","à¤­à¤¾à¤°à¤¤à¤®à¥�","à¤­à¤¾à¤°à¥‹à¤¤","Ú€Ø§Ø±Øª","à´­à´¾à´°à´¤à´‚","à¤­à¤¾à¤°à¤¤","Ø¨Ø§Ø±Øª","Ø¨Ú¾Ø§Ø±Øª","à°­à°¾à°°à°¤à±�","àª­àª¾àª°àª¤","à¨­à¨¾à¨°à¨¤","à¦­à¦¾à¦°à¦¤","à®‡à®¨à¯�à®¤à®¿à®¯à®¾","Ø§ÛŒØ±Ø§Ù†","Ø§ÙŠØ±Ø§Ù†","Ø¹Ø±Ø§Ù‚","Ø§Ù„Ø§Ø±Ø¯Ù†","í•œêµ­","Ò›Ð°Ð·","à¶½à¶‚à¶šà·�","à®‡à®²à®™à¯�à®•à¯ˆ","Ø§Ù„Ù…ØºØ±Ø¨","Ð¼ÐºÐ´","Ð¼Ð¾Ð½","æ¾³é–€","æ¾³é—¨","Ù…Ù„ÙŠØ³ÙŠØ§","Ø¹Ù…Ø§Ù†","Ù¾Ø§Ú©Ø³ØªØ§Ù†","Ù¾Ø§ÙƒØ³ØªØ§Ù†","Ù�Ù„Ø³Ø·ÙŠÙ†","Ñ�Ñ€Ð±","Ð¿Ñ€.Ñ�Ñ€Ð±","Ð¾Ñ€Ð³.Ñ�Ñ€Ð±","Ð¾Ð±Ñ€.Ñ�Ñ€Ð±","Ð¾Ð´.Ñ�Ñ€Ð±","ÑƒÐ¿Ñ€.Ñ�Ñ€Ð±","Ð°Ðº.Ñ�Ñ€Ð±","Ñ€Ñ„","Ù‚Ø·Ø±","Ø§Ù„Ø³Ø¹ÙˆØ¯ÙŠØ©","Ø§Ù„Ø³Ø¹ÙˆØ¯ÛŒØ©","Ø§Ù„Ø³Ø¹ÙˆØ¯ÛŒÛƒ","Ø§Ù„Ø³Ø¹ÙˆØ¯ÙŠÙ‡","Ø³ÙˆØ¯Ø§Ù†","æ–°åŠ å�¡","à®šà®¿à®™à¯�à®•à®ªà¯�à®ªà¯‚à®°à¯�","Ø³ÙˆØ±ÙŠØ©","Ø³ÙˆØ±ÙŠØ§","à¹„à¸—à¸¢","à¸¨à¸¶à¸�à¸©à¸².à¹„à¸—à¸¢","à¸˜à¸¸à¸£à¸�à¸´à¸ˆ.à¹„à¸—à¸¢","à¸£à¸±à¸�à¸šà¸²à¸¥.à¹„à¸—à¸¢","à¸—à¸«à¸²à¸£.à¹„à¸—à¸¢","à¹€à¸™à¹‡à¸•.à¹„à¸—à¸¢","à¸­à¸‡à¸„à¹Œà¸�à¸£.à¹„à¸—à¸¢","ØªÙˆÙ†Ø³","å�°ç�£","å�°æ¹¾","è‡ºç�£","ÑƒÐºÑ€","Ø§Ù„ÙŠÙ…Ù†","xxx","*.ye","ac.za","agric.za","alt.za","co.za","edu.za","gov.za","grondar.za","law.za","mil.za","net.za","ngo.za","nic.za","nis.za","nom.za","org.za","school.za","tm.za","web.za","zm","ac.zm","biz.zm","co.zm","com.zm","edu.zm","gov.zm","info.zm","mil.zm","net.zm","org.zm","sch.zm","zw","ac.zw","co.zw","gov.zw","mil.zw","org.zw","aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","academy","accenture","accountant","accountants","aco","actor","adac","ads","adult","aeg","aetna","afamilycompany","afl","africa","agakhan","agency","aig","aigo","airbus","airforce","airtel","akdn","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","amazon","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","aol","apartments","app","apple","aquarelle","arab","aramco","archi","army","art","arte","asda","associates","athleta","attorney","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aws","axa","azure","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bbc","bbt","bbva","bcg","bcn","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bharti","bible","bid","bike","bing","bingo","bio","black","blackfriday","blockbuster","blog","bloomberg","blue","bms","bmw","bnpparibas","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","bradesco","bridgestone","broadway","broker","brother","brussels","budapest","bugatti","build","builders","business","buy","buzz","bzh","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","casa","case","caseih","cash","casino","catering","catholic","cba","cbn","cbre","cbs","ceb","center","ceo","cern","cfa","cfd","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","church","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","coach","codes","coffee","college","cologne","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","corsica","country","coupon","coupons","courses","cpa","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cuisinella","cymru","cyou","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dnp","docs","doctor","dog","domains","dot","download","drive","dtv","dubai","duck","dunlop","dupont","durban","dvag","dvr","earth","eat","eco","edeka","education","email","emerck","energy","engineer","engineering","enterprises","epson","equipment","ericsson","erni","esq","estate","esurance","etisalat","eurovision","eus","events","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","flickr","flights","flir","florist","flowers","fly","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","gal","gallery","gallo","gallup","game","games","gap","garden","gay","gbiz","gdn","gea","gent","genting","george","ggee","gift","gifts","gives","giving","glade","glass","gle","global","globo","gmail","gmbh","gmo","gmx","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","grainger","graphics","gratis","green","gripe","grocery","group","guardian","gucci","guge","guide","guitars","guru","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hkt","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hsbc","hughes","hyatt","hyundai","ibm","icbc","ice","icu","ieee","ifm","ikano","imamat","imdb","immo","immobilien","inc","industries","infiniti","ing","ink","institute","insurance","insure","intel","international","intuit","investments","ipiranga","irish","ismaili","ist","istanbul","itau","itv","iveco","jaguar","java","jcb","jcp","jeep","jetzt","jewelry","jio","jll","jmp","jnj","joburg","jot","joy","jpmorgan","jprs","juegos","juniper","kaufen","kddi","kerryhotels","kerrylogistics","kerryproperties","kfh","kia","kim","kinder","kindle","kitchen","kiwi","koeln","komatsu","kosher","kpmg","kpn","krd","kred","kuokgroup","kyoto","lacaixa","lamborghini","lamer","lancaster","lancia","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","llc","llp","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","ltd","ltda","lundbeck","lupin","luxe","luxury","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mckinsey","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","miami","microsoft","mini","mint","mit","mitsubishi","mlb","mls","mma","mobile","moda","moe","moi","mom","monash","money","monster","mormon","mortgage","moscow","moto","motorcycles","mov","movie","msd","mtn","mtr","mutual","nab","nadex","nagoya","nationwide","natura","navy","nba","nec","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nfl","ngo","nhk","nico","nike","nikon","ninja","nissan","nissay","nokia","northwesternmutual","norton","now","nowruz","nowtv","nra","nrw","ntt","nyc","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","organic","origins","osaka","otsuka","ott","ovh","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pet","pfizer","pharmacy","phd","philips","phone","photo","photography","photos","physio","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","place","play","playstation","plumbing","plus","pnc","pohl","poker","politie","porn","pramerica","praxi","press","prime","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","pub","pwc","qpon","quebec","quest","qvc","racing","radio","raid","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","rocher","rocks","rodeo","rogers","room","rsvp","rugby","ruhr","run","rwe","ryukyu","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sbi","sbs","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","silk","sina","singles","site","ski","skin","sky","skype","sling","smart","smile","sncf","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","spa","space","sport","spot","spreadbetting","srl","stada","staples","star","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","sucks","supplies","supply","support","surf","surgery","suzuki","swatch","swiftcover","swiss","sydney","symantec","systems","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tci","tdk","team","tech","technology","temasek","tennis","teva","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tjmaxx","tjx","tkmaxx","tmall","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tube","tui","tunes","tushu","tvs","ubank","ubs","unicom","university","uno","uol","ups","vacations","vana","vanguard","vegas","ventures","verisign","versicherung","vet","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","viva","vivo","vlaanderen","vodka","volkswagen","volvo","vote","voting","voto","voyage","vuelos","wales","walmart","walter","wang","wanggou","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","à¤•à¥‰à¤®","ã‚»ãƒ¼ãƒ«","ä½›å±±","æ…ˆå–„","é›†å›¢","åœ¨çº¿","å¤§ä¼—æ±½è½¦","ç‚¹çœ‹","à¸„à¸­à¸¡","å…«å�¦","Ù…ÙˆÙ‚Ø¹","å…¬ç›Š","å…¬å�¸","é¦™æ ¼é‡Œæ‹‰","ç½‘ç«™","ç§»åŠ¨","æˆ‘çˆ±ä½ ","Ð¼Ð¾Ñ�ÐºÐ²Ð°","ÐºÐ°Ñ‚Ð¾Ð»Ð¸Ðº","Ð¾Ð½Ð»Ð°Ð¹Ð½","Ñ�Ð°Ð¹Ñ‚","è�”é€š","×§×•×�","æ—¶å°š","å¾®å�š","æ·¡é©¬é”¡","ãƒ•ã‚¡ãƒƒã‚·ãƒ§ãƒ³","Ð¾Ñ€Ð³","à¤¨à¥‡à¤Ÿ","ã‚¹ãƒˆã‚¢","ã‚¢ãƒžã‚¾ãƒ³","ì‚¼ì„±","å•†æ ‡","å•†åº—","å•†åŸŽ","Ð´ÐµÑ‚Ð¸","ãƒ�ã‚¤ãƒ³ãƒˆ","æ–°é—»","å·¥è¡Œ","å®¶é›»","ÙƒÙˆÙ…","ä¸­æ–‡ç½‘","ä¸­ä¿¡","å¨±ä¹�","è°·æ­Œ","é›»è¨Šç›ˆç§‘","è´­ç‰©","ã‚¯ãƒ©ã‚¦ãƒ‰","é€šè²©","ç½‘åº—","à¤¸à¤‚à¤—à¤ à¤¨","é¤�åŽ…","ç½‘ç»œ","ÐºÐ¾Ð¼","äºšé©¬é€Š","è¯ºåŸºäºš","é£Ÿå“�","é£žåˆ©æµ¦","æ‰‹è¡¨","æ‰‹æœº","Ø§Ø±Ø§Ù…ÙƒÙˆ","Ø§Ù„Ø¹Ù„ÙŠØ§Ù†","Ø§ØªØµØ§Ù„Ø§Øª","Ø¨Ø§Ø²Ø§Ø±","Ø§Ø¨ÙˆØ¸Ø¨ÙŠ","ÙƒØ§Ø«ÙˆÙ„ÙŠÙƒ","Ù‡Ù…Ø±Ø§Ù‡","ë‹·ì»´","æ”¿åºœ","Ø´Ø¨ÙƒØ©","Ø¨ÙŠØªÙƒ","Ø¹Ø±Ø¨","æœºæž„","ç»„ç»‡æœºæž„","å�¥åº·","æ‹›è�˜","Ñ€ÑƒÑ�","ç� å®�","å¤§æ‹¿","ã�¿ã‚“ã�ª","ã‚°ãƒ¼ã‚°ãƒ«","ä¸–ç•Œ","æ›¸ç±�","ç½‘å�€","ë‹·ë„·","ã‚³ãƒ ","å¤©ä¸»æ•™","æ¸¸æˆ�","vermÃ¶gensberater","vermÃ¶gensberatung","ä¼�ä¸š","ä¿¡æ�¯","å˜‰é‡Œå¤§é…’åº—","å˜‰é‡Œ","å¹¿ä¸œ","æ”¿åŠ¡","xyz","yachts","yahoo","yamaxun","yandex","yodobashi","yoga","yokohama","you","youtube","yun","zappos","zara","zero","zip","zone","zuerich","cc.ua","inf.ua","ltd.ua","adobeaemcloud.com","adobeaemcloud.net","*.dev.adobeaemcloud.com","beep.pl","barsy.ca","*.compute.estate","*.alces.network","altervista.org","alwaysdata.net","cloudfront.net","*.compute.amazonaws.com","*.compute-1.amazonaws.com","*.compute.amazonaws.com.cn","us-east-1.amazonaws.com","cn-north-1.eb.amazonaws.com.cn","cn-northwest-1.eb.amazonaws.com.cn","elasticbeanstalk.com","ap-northeast-1.elasticbeanstalk.com","ap-northeast-2.elasticbeanstalk.com","ap-northeast-3.elasticbeanstalk.com","ap-south-1.elasticbeanstalk.com","ap-southeast-1.elasticbeanstalk.com","ap-southeast-2.elasticbeanstalk.com","ca-central-1.elasticbeanstalk.com","eu-central-1.elasticbeanstalk.com","eu-west-1.elasticbeanstalk.com","eu-west-2.elasticbeanstalk.com","eu-west-3.elasticbeanstalk.com","sa-east-1.elasticbeanstalk.com","us-east-1.elasticbeanstalk.com","us-east-2.elasticbeanstalk.com","us-gov-west-1.elasticbeanstalk.com","us-west-1.elasticbeanstalk.com","us-west-2.elasticbeanstalk.com","*.elb.amazonaws.com","*.elb.amazonaws.com.cn","s3.amazonaws.com","s3-ap-northeast-1.amazonaws.com","s3-ap-northeast-2.amazonaws.com","s3-ap-south-1.amazonaws.com","s3-ap-southeast-1.amazonaws.com","s3-ap-southeast-2.amazonaws.com","s3-ca-central-1.amazonaws.com","s3-eu-central-1.amazonaws.com","s3-eu-west-1.amazonaws.com","s3-eu-west-2.amazonaws.com","s3-eu-west-3.amazonaws.com","s3-external-1.amazonaws.com","s3-fips-us-gov-west-1.amazonaws.com","s3-sa-east-1.amazonaws.com","s3-us-gov-west-1.amazonaws.com","s3-us-east-2.amazonaws.com","s3-us-west-1.amazonaws.com","s3-us-west-2.amazonaws.com","s3.ap-northeast-2.amazonaws.com","s3.ap-south-1.amazonaws.com","s3.cn-north-1.amazonaws.com.cn","s3.ca-central-1.amazonaws.com","s3.eu-central-1.amazonaws.com","s3.eu-west-2.amazonaws.com","s3.eu-west-3.amazonaws.com","s3.us-east-2.amazonaws.com","s3.dualstack.ap-northeast-1.amazonaws.com","s3.dualstack.ap-northeast-2.amazonaws.com","s3.dualstack.ap-south-1.amazonaws.com","s3.dualstack.ap-southeast-1.amazonaws.com","s3.dualstack.ap-southeast-2.amazonaws.com","s3.dualstack.ca-central-1.amazonaws.com","s3.dualstack.eu-central-1.amazonaws.com","s3.dualstack.eu-west-1.amazonaws.com","s3.dualstack.eu-west-2.amazonaws.com","s3.dualstack.eu-west-3.amazonaws.com","s3.dualstack.sa-east-1.amazonaws.com","s3.dualstack.us-east-1.amazonaws.com","s3.dualstack.us-east-2.amazonaws.com","s3-website-us-east-1.amazonaws.com","s3-website-us-west-1.amazonaws.com","s3-website-us-west-2.amazonaws.com","s3-website-ap-northeast-1.amazonaws.com","s3-website-ap-southeast-1.amazonaws.com","s3-website-ap-southeast-2.amazonaws.com","s3-website-eu-west-1.amazonaws.com","s3-website-sa-east-1.amazonaws.com","s3-website.ap-northeast-2.amazonaws.com","s3-website.ap-south-1.amazonaws.com","s3-website.ca-central-1.amazonaws.com","s3-website.eu-central-1.amazonaws.com","s3-website.eu-west-2.amazonaws.com","s3-website.eu-west-3.amazonaws.com","s3-website.us-east-2.amazonaws.com","amsw.nl","t3l3p0rt.net","tele.amune.org","apigee.io","on-aptible.com","user.aseinet.ne.jp","gv.vc","d.gv.vc","user.party.eus","pimienta.org","poivron.org","potager.org","sweetpepper.org","myasustor.com","myfritz.net","*.awdev.ca","*.advisor.ws","b-data.io","backplaneapp.io","balena-devices.com","app.banzaicloud.io","betainabox.com","bnr.la","blackbaudcdn.net","boomla.net","boxfuse.io","square7.ch","bplaced.com","bplaced.de","square7.de","bplaced.net","square7.net","browsersafetymark.io","uk0.bigv.io","dh.bytemark.co.uk","vm.bytemark.co.uk","mycd.eu","carrd.co","crd.co","uwu.ai","ae.org","ar.com","br.com","cn.com","com.de","com.se","de.com","eu.com","gb.com","gb.net","hu.com","hu.net","jp.net","jpn.com","kr.com","mex.com","no.com","qc.com","ru.com","sa.com","se.net","uk.com","uk.net","us.com","uy.com","za.bz","za.com","africa.com","gr.com","in.net","us.org","co.com","c.la","certmgr.org","xenapponazure.com","discourse.group","discourse.team","virtueeldomein.nl","cleverapps.io","*.lcl.dev","*.stg.dev","c66.me","cloud66.ws","cloud66.zone","jdevcloud.com","wpdevcloud.com","cloudaccess.host","freesite.host","cloudaccess.net","cloudcontrolled.com","cloudcontrolapp.com","cloudera.site","trycloudflare.com","workers.dev","wnext.app","co.ca","*.otap.co","co.cz","c.cdn77.org","cdn77-ssl.net","r.cdn77.net","rsc.cdn77.org","ssl.origin.cdn77-secure.org","cloudns.asia","cloudns.biz","cloudns.club","cloudns.cc","cloudns.eu","cloudns.in","cloudns.info","cloudns.org","cloudns.pro","cloudns.pw","cloudns.us","cloudeity.net","cnpy.gdn","co.nl","co.no","webhosting.be","hosting-cluster.nl","ac.ru","edu.ru","gov.ru","int.ru","mil.ru","test.ru","dyn.cosidns.de","dynamisches-dns.de","dnsupdater.de","internet-dns.de","l-o-g-i-n.de","dynamic-dns.info","feste-ip.net","knx-server.net","static-access.net","realm.cz","*.cryptonomic.net","cupcake.is","*.customer-oci.com","*.oci.customer-oci.com","*.ocp.customer-oci.com","*.ocs.customer-oci.com","cyon.link","cyon.site","daplie.me","localhost.daplie.me","dattolocal.com","dattorelay.com","dattoweb.com","mydatto.com","dattolocal.net","mydatto.net","biz.dk","co.dk","firm.dk","reg.dk","store.dk","*.dapps.earth","*.bzz.dapps.earth","builtwithdark.com","edgestack.me","debian.net","dedyn.io","dnshome.de","online.th","shop.th","drayddns.com","dreamhosters.com","mydrobo.com","drud.io","drud.us","duckdns.org","dy.fi","tunk.org","dyndns-at-home.com","dyndns-at-work.com","dyndns-blog.com","dyndns-free.com","dyndns-home.com","dyndns-ip.com","dyndns-mail.com","dyndns-office.com","dyndns-pics.com","dyndns-remote.com","dyndns-server.com","dyndns-web.com","dyndns-wiki.com","dyndns-work.com","dyndns.biz","dyndns.info","dyndns.org","dyndns.tv","at-band-camp.net","ath.cx","barrel-of-knowledge.info","barrell-of-knowledge.info","better-than.tv","blogdns.com","blogdns.net","blogdns.org","blogsite.org","boldlygoingnowhere.org","broke-it.net","buyshouses.net","cechire.com","dnsalias.com","dnsalias.net","dnsalias.org","dnsdojo.com","dnsdojo.net","dnsdojo.org","does-it.net","doesntexist.com","doesntexist.org","dontexist.com","dontexist.net","dontexist.org","doomdns.com","doomdns.org","dvrdns.org","dyn-o-saur.com","dynalias.com","dynalias.net","dynalias.org","dynathome.net","dyndns.ws","endofinternet.net","endofinternet.org","endoftheinternet.org","est-a-la-maison.com","est-a-la-masion.com","est-le-patron.com","est-mon-blogueur.com","for-better.biz","for-more.biz","for-our.info","for-some.biz","for-the.biz","forgot.her.name","forgot.his.name","from-ak.com","from-al.com","from-ar.com","from-az.net","from-ca.com","from-co.net","from-ct.com","from-dc.com","from-de.com","from-fl.com","from-ga.com","from-hi.com","from-ia.com","from-id.com","from-il.com","from-in.com","from-ks.com","from-ky.com","from-la.net","from-ma.com","from-md.com","from-me.org","from-mi.com","from-mn.com","from-mo.com","from-ms.com","from-mt.com","from-nc.com","from-nd.com","from-ne.com","from-nh.com","from-nj.com","from-nm.com","from-nv.com","from-ny.net","from-oh.com","from-ok.com","from-or.com","from-pa.com","from-pr.com","from-ri.com","from-sc.com","from-sd.com","from-tn.com","from-tx.com","from-ut.com","from-va.com","from-vt.com","from-wa.com","from-wi.com","from-wv.com","from-wy.com","ftpaccess.cc","fuettertdasnetz.de","game-host.org","game-server.cc","getmyip.com","gets-it.net","go.dyndns.org","gotdns.com","gotdns.org","groks-the.info","groks-this.info","ham-radio-op.net","here-for-more.info","hobby-site.com","hobby-site.org","home.dyndns.org","homedns.org","homeftp.net","homeftp.org","homeip.net","homelinux.com","homelinux.net","homelinux.org","homeunix.com","homeunix.net","homeunix.org","iamallama.com","in-the-band.net","is-a-anarchist.com","is-a-blogger.com","is-a-bookkeeper.com","is-a-bruinsfan.org","is-a-bulls-fan.com","is-a-candidate.org","is-a-caterer.com","is-a-celticsfan.org","is-a-chef.com","is-a-chef.net","is-a-chef.org","is-a-conservative.com","is-a-cpa.com","is-a-cubicle-slave.com","is-a-democrat.com","is-a-designer.com","is-a-doctor.com","is-a-financialadvisor.com","is-a-geek.com","is-a-geek.net","is-a-geek.org","is-a-green.com","is-a-guru.com","is-a-hard-worker.com","is-a-hunter.com","is-a-knight.org","is-a-landscaper.com","is-a-lawyer.com","is-a-liberal.com","is-a-libertarian.com","is-a-linux-user.org","is-a-llama.com","is-a-musician.com","is-a-nascarfan.com","is-a-nurse.com","is-a-painter.com","is-a-patsfan.org","is-a-personaltrainer.com","is-a-photographer.com","is-a-player.com","is-a-republican.com","is-a-rockstar.com","is-a-socialist.com","is-a-soxfan.org","is-a-student.com","is-a-teacher.com","is-a-techie.com","is-a-therapist.com","is-an-accountant.com","is-an-actor.com","is-an-actress.com","is-an-anarchist.com","is-an-artist.com","is-an-engineer.com","is-an-entertainer.com","is-by.us","is-certified.com","is-found.org","is-gone.com","is-into-anime.com","is-into-cars.com","is-into-cartoons.com","is-into-games.com","is-leet.com","is-lost.org","is-not-certified.com","is-saved.org","is-slick.com","is-uberleet.com","is-very-bad.org","is-very-evil.org","is-very-good.org","is-very-nice.org","is-very-sweet.org","is-with-theband.com","isa-geek.com","isa-geek.net","isa-geek.org","isa-hockeynut.com","issmarterthanyou.com","isteingeek.de","istmein.de","kicks-ass.net","kicks-ass.org","knowsitall.info","land-4-sale.us","lebtimnetz.de","leitungsen.de","likes-pie.com","likescandy.com","merseine.nu","mine.nu","misconfused.org","mypets.ws","myphotos.cc","neat-url.com","office-on-the.net","on-the-web.tv","podzone.net","podzone.org","readmyblog.org","saves-the-whales.com","scrapper-site.net","scrapping.cc","selfip.biz","selfip.com","selfip.info","selfip.net","selfip.org","sells-for-less.com","sells-for-u.com","sells-it.net","sellsyourhome.org","servebbs.com","servebbs.net","servebbs.org","serveftp.net","serveftp.org","servegame.org","shacknet.nu","simple-url.com","space-to-rent.com","stuff-4-sale.org","stuff-4-sale.us","teaches-yoga.com","thruhere.net","traeumtgerade.de","webhop.biz","webhop.info","webhop.net","webhop.org","worse-than.tv","writesthisblog.com","ddnss.de","dyn.ddnss.de","dyndns.ddnss.de","dyndns1.de","dyn-ip24.de","home-webserver.de","dyn.home-webserver.de","myhome-server.de","ddnss.org","definima.net","definima.io","bci.dnstrace.pro","ddnsfree.com","ddnsgeek.com","giize.com","gleeze.com","kozow.com","loseyourip.com","ooguy.com","theworkpc.com","casacam.net","dynu.net","accesscam.org","camdvr.org","freeddns.org","mywire.org","webredirect.org","myddns.rocks","blogsite.xyz","dynv6.net","e4.cz","en-root.fr","mytuleap.com","onred.one","staging.onred.one","enonic.io","customer.enonic.io","eu.org","al.eu.org","asso.eu.org","at.eu.org","au.eu.org","be.eu.org","bg.eu.org","ca.eu.org","cd.eu.org","ch.eu.org","cn.eu.org","cy.eu.org","cz.eu.org","de.eu.org","dk.eu.org","edu.eu.org","ee.eu.org","es.eu.org","fi.eu.org","fr.eu.org","gr.eu.org","hr.eu.org","hu.eu.org","ie.eu.org","il.eu.org","in.eu.org","int.eu.org","is.eu.org","it.eu.org","jp.eu.org","kr.eu.org","lt.eu.org","lu.eu.org","lv.eu.org","mc.eu.org","me.eu.org","mk.eu.org","mt.eu.org","my.eu.org","net.eu.org","ng.eu.org","nl.eu.org","no.eu.org","nz.eu.org","paris.eu.org","pl.eu.org","pt.eu.org","q-a.eu.org","ro.eu.org","ru.eu.org","se.eu.org","si.eu.org","sk.eu.org","tr.eu.org","uk.eu.org","us.eu.org","eu-1.evennode.com","eu-2.evennode.com","eu-3.evennode.com","eu-4.evennode.com","us-1.evennode.com","us-2.evennode.com","us-3.evennode.com","us-4.evennode.com","twmail.cc","twmail.net","twmail.org","mymailer.com.tw","url.tw","apps.fbsbx.com","ru.net","adygeya.ru","bashkiria.ru","bir.ru","cbg.ru","com.ru","dagestan.ru","grozny.ru","kalmykia.ru","kustanai.ru","marine.ru","mordovia.ru","msk.ru","mytis.ru","nalchik.ru","nov.ru","pyatigorsk.ru","spb.ru","vladikavkaz.ru","vladimir.ru","abkhazia.su","adygeya.su","aktyubinsk.su","arkhangelsk.su","armenia.su","ashgabad.su","azerbaijan.su","balashov.su","bashkiria.su","bryansk.su","bukhara.su","chimkent.su","dagestan.su","east-kazakhstan.su","exnet.su","georgia.su","grozny.su","ivanovo.su","jambyl.su","kalmykia.su","kaluga.su","karacol.su","karaganda.su","karelia.su","khakassia.su","krasnodar.su","kurgan.su","kustanai.su","lenug.su","mangyshlak.su","mordovia.su","msk.su","murmansk.su","nalchik.su","navoi.su","north-kazakhstan.su","nov.su","obninsk.su","penza.su","pokrovsk.su","sochi.su","spb.su","tashkent.su","termez.su","togliatti.su","troitsk.su","tselinograd.su","tula.su","tuva.su","vladikavkaz.su","vladimir.su","vologda.su","channelsdvr.net","u.channelsdvr.net","fastly-terrarium.com","fastlylb.net","map.fastlylb.net","freetls.fastly.net","map.fastly.net","a.prod.fastly.net","global.prod.fastly.net","a.ssl.fastly.net","b.ssl.fastly.net","global.ssl.fastly.net","fastpanel.direct","fastvps-server.com","fhapp.xyz","fedorainfracloud.org","fedorapeople.org","cloud.fedoraproject.org","app.os.fedoraproject.org","app.os.stg.fedoraproject.org","mydobiss.com","filegear.me","filegear-au.me","filegear-de.me","filegear-gb.me","filegear-ie.me","filegear-jp.me","filegear-sg.me","firebaseapp.com","flynnhub.com","flynnhosting.net","0e.vc","freebox-os.com","freeboxos.com","fbx-os.fr","fbxos.fr","freebox-os.fr","freeboxos.fr","freedesktop.org","*.futurecms.at","*.ex.futurecms.at","*.in.futurecms.at","futurehosting.at","futuremailing.at","*.ex.ortsinfo.at","*.kunden.ortsinfo.at","*.statics.cloud","service.gov.uk","gehirn.ne.jp","usercontent.jp","gentapps.com","lab.ms","github.io","githubusercontent.com","gitlab.io","glitch.me","lolipop.io","cloudapps.digital","london.cloudapps.digital","homeoffice.gov.uk","ro.im","shop.ro","goip.de","run.app","a.run.app","web.app","*.0emm.com","appspot.com","*.r.appspot.com","blogspot.ae","blogspot.al","blogspot.am","blogspot.ba","blogspot.be","blogspot.bg","blogspot.bj","blogspot.ca","blogspot.cf","blogspot.ch","blogspot.cl","blogspot.co.at","blogspot.co.id","blogspot.co.il","blogspot.co.ke","blogspot.co.nz","blogspot.co.uk","blogspot.co.za","blogspot.com","blogspot.com.ar","blogspot.com.au","blogspot.com.br","blogspot.com.by","blogspot.com.co","blogspot.com.cy","blogspot.com.ee","blogspot.com.eg","blogspot.com.es","blogspot.com.mt","blogspot.com.ng","blogspot.com.tr","blogspot.com.uy","blogspot.cv","blogspot.cz","blogspot.de","blogspot.dk","blogspot.fi","blogspot.fr","blogspot.gr","blogspot.hk","blogspot.hr","blogspot.hu","blogspot.ie","blogspot.in","blogspot.is","blogspot.it","blogspot.jp","blogspot.kr","blogspot.li","blogspot.lt","blogspot.lu","blogspot.md","blogspot.mk","blogspot.mr","blogspot.mx","blogspot.my","blogspot.nl","blogspot.no","blogspot.pe","blogspot.pt","blogspot.qa","blogspot.re","blogspot.ro","blogspot.rs","blogspot.ru","blogspot.se","blogspot.sg","blogspot.si","blogspot.sk","blogspot.sn","blogspot.td","blogspot.tw","blogspot.ug","blogspot.vn","cloudfunctions.net","cloud.goog","codespot.com","googleapis.com","googlecode.com","pagespeedmobilizer.com","publishproxy.com","withgoogle.com","withyoutube.com","awsmppl.com","fin.ci","free.hr","caa.li","ua.rs","conf.se","hs.zone","hs.run","hashbang.sh","hasura.app","hasura-app.io","hepforge.org","herokuapp.com","herokussl.com","myravendb.com","ravendb.community","ravendb.me","development.run","ravendb.run","bpl.biz","orx.biz","ng.city","biz.gl","ng.ink","col.ng","firm.ng","gen.ng","ltd.ng","ngo.ng","ng.school","sch.so","hÃ¤kkinen.fi","*.moonscale.io","moonscale.net","iki.fi","dyn-berlin.de","in-berlin.de","in-brb.de","in-butter.de","in-dsl.de","in-dsl.net","in-dsl.org","in-vpn.de","in-vpn.net","in-vpn.org","biz.at","info.at","info.cx","ac.leg.br","al.leg.br","am.leg.br","ap.leg.br","ba.leg.br","ce.leg.br","df.leg.br","es.leg.br","go.leg.br","ma.leg.br","mg.leg.br","ms.leg.br","mt.leg.br","pa.leg.br","pb.leg.br","pe.leg.br","pi.leg.br","pr.leg.br","rj.leg.br","rn.leg.br","ro.leg.br","rr.leg.br","rs.leg.br","sc.leg.br","se.leg.br","sp.leg.br","to.leg.br","pixolino.com","ipifony.net","mein-iserv.de","test-iserv.de","iserv.dev","iobb.net","myjino.ru","*.hosting.myjino.ru","*.landing.myjino.ru","*.spectrum.myjino.ru","*.vps.myjino.ru","*.triton.zone","*.cns.joyent.com","js.org","kaas.gg","khplay.nl","keymachine.de","kinghost.net","uni5.net","knightpoint.systems","oya.to","co.krd","edu.krd","git-repos.de","lcube-server.de","svn-repos.de","leadpages.co","lpages.co","lpusercontent.com","lelux.site","co.business","co.education","co.events","co.financial","co.network","co.place","co.technology","app.lmpm.com","linkitools.space","linkyard.cloud","linkyard-cloud.ch","members.linode.com","nodebalancer.linode.com","we.bs","loginline.app","loginline.dev","loginline.io","loginline.services","loginline.site","krasnik.pl","leczna.pl","lubartow.pl","lublin.pl","poniatowa.pl","swidnik.pl","uklugs.org","glug.org.uk","lug.org.uk","lugs.org.uk","barsy.bg","barsy.co.uk","barsyonline.co.uk","barsycenter.com","barsyonline.com","barsy.club","barsy.de","barsy.eu","barsy.in","barsy.info","barsy.io","barsy.me","barsy.menu","barsy.mobi","barsy.net","barsy.online","barsy.org","barsy.pro","barsy.pub","barsy.shop","barsy.site","barsy.support","barsy.uk","*.magentosite.cloud","mayfirst.info","mayfirst.org","hb.cldmail.ru","miniserver.com","memset.net","cloud.metacentrum.cz","custom.metacentrum.cz","flt.cloud.muni.cz","usr.cloud.muni.cz","meteorapp.com","eu.meteorapp.com","co.pl","azurecontainer.io","azurewebsites.net","azure-mobile.net","cloudapp.net","mozilla-iot.org","bmoattachments.org","net.ru","org.ru","pp.ru","ui.nabu.casa","pony.club","of.fashion","on.fashion","of.football","in.london","of.london","for.men","and.mom","for.mom","for.one","for.sale","of.work","to.work","nctu.me","bitballoon.com","netlify.com","4u.com","ngrok.io","nh-serv.co.uk","nfshost.com","dnsking.ch","mypi.co","n4t.co","001www.com","ddnslive.com","myiphost.com","forumz.info","16-b.it","32-b.it","64-b.it","soundcast.me","tcp4.me","dnsup.net","hicam.net","now-dns.net","ownip.net","vpndns.net","dynserv.org","now-dns.org","x443.pw","now-dns.top","ntdll.top","freeddns.us","crafting.xyz","zapto.xyz","nsupdate.info","nerdpol.ovh","blogsyte.com","brasilia.me","cable-modem.org","ciscofreak.com","collegefan.org","couchpotatofries.org","damnserver.com","ddns.me","ditchyourip.com","dnsfor.me","dnsiskinky.com","dvrcam.info","dynns.com","eating-organic.net","fantasyleague.cc","geekgalaxy.com","golffan.us","health-carereform.com","homesecuritymac.com","homesecuritypc.com","hopto.me","ilovecollege.info","loginto.me","mlbfan.org","mmafan.biz","myactivedirectory.com","mydissent.net","myeffect.net","mymediapc.net","mypsx.net","mysecuritycamera.com","mysecuritycamera.net","mysecuritycamera.org","net-freaks.com","nflfan.org","nhlfan.net","no-ip.ca","no-ip.co.uk","no-ip.net","noip.us","onthewifi.com","pgafan.net","point2this.com","pointto.us","privatizehealthinsurance.net","quicksytes.com","read-books.org","securitytactics.com","serveexchange.com","servehumour.com","servep2p.com","servesarcasm.com","stufftoread.com","ufcfan.org","unusualperson.com","workisboring.com","3utilities.com","bounceme.net","ddns.net","ddnsking.com","gotdns.ch","hopto.org","myftp.biz","myftp.org","myvnc.com","no-ip.biz","no-ip.info","no-ip.org","noip.me","redirectme.net","servebeer.com","serveblog.net","servecounterstrike.com","serveftp.com","servegame.com","servehalflife.com","servehttp.com","serveirc.com","serveminecraft.net","servemp3.com","servepics.com","servequake.com","sytes.net","webhop.me","zapto.org","stage.nodeart.io","nodum.co","nodum.io","pcloud.host","nyc.mn","nom.ae","nom.af","nom.ai","nom.al","nym.by","nom.bz","nym.bz","nom.cl","nym.ec","nom.gd","nom.ge","nom.gl","nym.gr","nom.gt","nym.gy","nym.hk","nom.hn","nym.ie","nom.im","nom.ke","nym.kz","nym.la","nym.lc","nom.li","nym.li","nym.lt","nym.lu","nom.lv","nym.me","nom.mk","nym.mn","nym.mx","nom.nu","nym.nz","nym.pe","nym.pt","nom.pw","nom.qa","nym.ro","nom.rs","nom.si","nym.sk","nom.st","nym.su","nym.sx","nom.tj","nym.tw","nom.ug","nom.uy","nom.vc","nom.vg","static.observableusercontent.com","cya.gg","cloudycluster.net","nid.io","opencraft.hosting","operaunite.com","skygearapp.com","outsystemscloud.com","ownprovider.com","own.pm","ox.rs","oy.lc","pgfog.com","pagefrontapp.com","art.pl","gliwice.pl","krakow.pl","poznan.pl","wroc.pl","zakopane.pl","pantheonsite.io","gotpantheon.com","mypep.link","perspecta.cloud","on-web.fr","*.platform.sh","*.platformsh.site","dyn53.io","co.bn","xen.prgmr.com","priv.at","prvcy.page","*.dweb.link","protonet.io","chirurgiens-dentistes-en-france.fr","byen.site","pubtls.org","qualifioapp.com","qbuser.com","instantcloud.cn","ras.ru","qa2.com","qcx.io","*.sys.qcx.io","dev-myqnapcloud.com","alpha-myqnapcloud.com","myqnapcloud.com","*.quipelements.com","vapor.cloud","vaporcloud.io","rackmaze.com","rackmaze.net","*.on-k3s.io","*.on-rancher.cloud","*.on-rio.io","readthedocs.io","rhcloud.com","app.render.com","onrender.com","repl.co","repl.run","resindevice.io","devices.resinstaging.io","hzc.io","wellbeingzone.eu","ptplus.fit","wellbeingzone.co.uk","git-pages.rit.edu","sandcats.io","logoip.de","logoip.com","schokokeks.net","gov.scot","scrysec.com","firewall-gateway.com","firewall-gateway.de","my-gateway.de","my-router.de","spdns.de","spdns.eu","firewall-gateway.net","my-firewall.org","myfirewall.org","spdns.org","senseering.net","biz.ua","co.ua","pp.ua","shiftedit.io","myshopblocks.com","shopitsite.com","mo-siemens.io","1kapp.com","appchizi.com","applinzi.com","sinaapp.com","vipsinaapp.com","siteleaf.net","bounty-full.com","alpha.bounty-full.com","beta.bounty-full.com","stackhero-network.com","static.land","dev.static.land","sites.static.land","apps.lair.io","*.stolos.io","spacekit.io","customer.speedpartner.de","api.stdlib.com","storj.farm","utwente.io","soc.srcf.net","user.srcf.net","temp-dns.com","applicationcloud.io","scapp.io","*.s5y.io","*.sensiosite.cloud","syncloud.it","diskstation.me","dscloud.biz","dscloud.me","dscloud.mobi","dsmynas.com","dsmynas.net","dsmynas.org","familyds.com","familyds.net","familyds.org","i234.me","myds.me","synology.me","vpnplus.to","direct.quickconnect.to","taifun-dns.de","gda.pl","gdansk.pl","gdynia.pl","med.pl","sopot.pl","edugit.org","telebit.app","telebit.io","*.telebit.xyz","gwiddle.co.uk","thingdustdata.com","cust.dev.thingdust.io","cust.disrec.thingdust.io","cust.prod.thingdust.io","cust.testing.thingdust.io","arvo.network","azimuth.network","bloxcms.com","townnews-staging.com","12hp.at","2ix.at","4lima.at","lima-city.at","12hp.ch","2ix.ch","4lima.ch","lima-city.ch","trafficplex.cloud","de.cool","12hp.de","2ix.de","4lima.de","lima-city.de","1337.pictures","clan.rip","lima-city.rocks","webspace.rocks","lima.zone","*.transurl.be","*.transurl.eu","*.transurl.nl","tuxfamily.org","dd-dns.de","diskstation.eu","diskstation.org","dray-dns.de","draydns.de","dyn-vpn.de","dynvpn.de","mein-vigor.de","my-vigor.de","my-wan.de","syno-ds.de","synology-diskstation.de","synology-ds.de","uber.space","*.uberspace.de","hk.com","hk.org","ltd.hk","inc.hk","virtualuser.de","virtual-user.de","urown.cloud","dnsupdate.info","lib.de.us","2038.io","router.management","v-info.info","voorloper.cloud","v.ua","wafflecell.com","*.webhare.dev","wedeploy.io","wedeploy.me","wedeploy.sh","remotewd.com","wmflabs.org","myforum.community","community-pro.de","diskussionsbereich.de","community-pro.net","meinforum.net","half.host","xnbay.com","u2.xnbay.com","u2-local.xnbay.com","cistron.nl","demon.nl","xs4all.space","yandexcloud.net","storage.yandexcloud.net","website.yandexcloud.net","official.academy","yolasite.com","ybo.faith","yombo.me","homelink.one","ybo.party","ybo.review","ybo.science","ybo.trade","nohost.me","noho.st","za.net","za.org","now.sh","bss.design","basicserver.io","virtualserver.io","enterprisecloud.nu"]},{}],2:[function(a,o,r){"use strict";var p=a("punycode"),k={};k.rules=a("./data/rules.json").map(function(a){return{rule:a,suffix:a.replace(/^(\*\.|\!)/,""),punySuffix:-1,wildcard:"*"===a.charAt(0),exception:"!"===a.charAt(0)}}),k.endsWith=function(a,o){return-1!==a.indexOf(o,a.length-o.length)},k.findRule=function(a){var i=p.toASCII(a);return k.rules.reduce(function(a,o){return-1===o.punySuffix&&(o.punySuffix=p.toASCII(o.suffix)),k.endsWith(i,"."+o.punySuffix)||i===o.punySuffix?o:a},null)},r.errorCodes={DOMAIN_TOO_SHORT:"Domain name too short.",DOMAIN_TOO_LONG:"Domain name too long. It should be no more than 255 chars.",LABEL_STARTS_WITH_DASH:"Domain name label can not start with a dash.",LABEL_ENDS_WITH_DASH:"Domain name label can not end with a dash.",LABEL_TOO_LONG:"Domain name label should be at most 63 chars long.",LABEL_TOO_SHORT:"Domain name label should be at least 1 character long.",LABEL_INVALID_CHARS:"Domain name label can only contain alphanumeric characters or dashes."},k.validate=function(a){var o=p.toASCII(a);if(o.length<1)return"DOMAIN_TOO_SHORT";if(255<o.length)return"DOMAIN_TOO_LONG";for(var i,e=o.split("."),n=0;n<e.length;++n){if(!(i=e[n]).length)return"LABEL_TOO_SHORT";if(63<i.length)return"LABEL_TOO_LONG";if("-"===i.charAt(0))return"LABEL_STARTS_WITH_DASH";if("-"===i.charAt(i.length-1))return"LABEL_ENDS_WITH_DASH";if(!/^[a-z0-9\-]+$/.test(i))return"LABEL_INVALID_CHARS"}},r.parse=function(a){if("string"!=typeof a)throw new TypeError("Domain name must be a string.");var o=a.slice(0).toLowerCase();"."===o.charAt(o.length-1)&&(o=o.slice(0,o.length-1));var i=k.validate(o);if(i)return{input:a,error:{message:r.errorCodes[i],code:i}};var e={input:a,tld:null,sld:null,domain:null,subdomain:null,listed:!1},n=o.split(".");if("local"===n[n.length-1])return e;function s(){return/xn--/.test(o)&&(e.domain&&(e.domain=p.toASCII(e.domain)),e.subdomain&&(e.subdomain=p.toASCII(e.subdomain))),e}var m=k.findRule(o);if(!m)return n.length<2?e:(e.tld=n.pop(),e.sld=n.pop(),e.domain=[e.sld,e.tld].join("."),n.length&&(e.subdomain=n.pop()),s());e.listed=!0;var t=m.suffix.split("."),u=n.slice(0,n.length-t.length);return m.exception&&u.push(t.shift()),e.tld=t.join("."),u.length?(m.wildcard&&(t.unshift(u.pop()),e.tld=t.join(".")),u.length&&(e.sld=u.pop(),e.domain=[e.sld,e.tld].join("."),u.length&&(e.subdomain=u.join("."))),s()):s()},r.get=function(a){return a&&r.parse(a).domain||null},r.isValid=function(a){var o=r.parse(a);return Boolean(o.domain&&o.listed)}},{"./data/rules.json":1,punycode:3}],3:[function(a,T,D){(function(S){!function(a){var o="object"==typeof D&&D&&!D.nodeType&&D,i="object"==typeof T&&T&&!T.nodeType&&T,e="object"==typeof S&&S;e.global!==e&&e.window!==e&&e.self!==e||(a=e);var n,s,d=2147483647,b=36,y=1,f=26,m=38,t=700,v=72,w=128,z="-",u=/^xn--/,r=/[^\x20-\x7E]/,p=/[\x2E\u3002\uFF0E\uFF61]/g,k={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},c=b-y,x=Math.floor,q=String.fromCharCode;function A(a){throw new RangeError(k[a])}function l(a,o){for(var i=a.length,e=[];i--;)e[i]=o(a[i]);return e}function g(a,o){var i=a.split("@"),e="";return 1<i.length&&(e=i[0]+"@",a=i[1]),e+l((a=a.replace(p,".")).split("."),o).join(".")}function O(a){for(var o,i,e=[],n=0,s=a.length;n<s;)55296<=(o=a.charCodeAt(n++))&&o<=56319&&n<s?56320==(64512&(i=a.charCodeAt(n++)))?e.push(((1023&o)<<10)+(1023&i)+65536):(e.push(o),n--):e.push(o);return e}function _(a){return l(a,function(a){var o="";return 65535<a&&(o+=q((a-=65536)>>>10&1023|55296),a=56320|1023&a),o+=q(a)}).join("")}function L(a,o){return a+22+75*(a<26)-((0!=o)<<5)}function I(a,o,i){var e=0;for(a=i?x(a/t):a>>1,a+=x(a/o);c*f>>1<a;e+=b)a=x(a/c);return x(e+(c+1)*a/(a+m))}function h(a){var o,i,e,n,s,m,t,u,r,p,k,c=[],l=a.length,g=0,h=w,j=v;for((i=a.lastIndexOf(z))<0&&(i=0),e=0;e<i;++e)128<=a.charCodeAt(e)&&A("not-basic"),c.push(a.charCodeAt(e));for(n=0<i?i+1:0;n<l;){for(s=g,m=1,t=b;l<=n&&A("invalid-input"),k=a.charCodeAt(n++),(b<=(u=k-48<10?k-22:k-65<26?k-65:k-97<26?k-97:b)||u>x((d-g)/m))&&A("overflow"),g+=u*m,!(u<(r=t<=j?y:j+f<=t?f:t-j));t+=b)m>x(d/(p=b-r))&&A("overflow"),m*=p;j=I(g-s,o=c.length+1,0==s),x(g/o)>d-h&&A("overflow"),h+=x(g/o),g%=o,c.splice(g++,0,h)}return _(c)}function j(a){var o,i,e,n,s,m,t,u,r,p,k,c,l,g,h,j=[];for(c=(a=O(a)).length,o=w,s=v,m=i=0;m<c;++m)(k=a[m])<128&&j.push(q(k));for(e=n=j.length,n&&j.push(z);e<c;){for(t=d,m=0;m<c;++m)o<=(k=a[m])&&k<t&&(t=k);for(t-o>x((d-i)/(l=e+1))&&A("overflow"),i+=(t-o)*l,o=t,m=0;m<c;++m)if((k=a[m])<o&&++i>d&&A("overflow"),k==o){for(u=i,r=b;!(u<(p=r<=s?y:s+f<=r?f:r-s));r+=b)h=u-p,g=b-p,j.push(q(L(p+h%g,0))),u=x(h/g);j.push(q(L(u,0))),s=I(i,l,e==n),i=0,++e}++i,++o}return j.join("")}if(n={version:"1.4.1",ucs2:{decode:O,encode:_},decode:h,encode:j,toASCII:function(a){return g(a,function(a){return r.test(a)?"xn--"+j(a):a})},toUnicode:function(a){return g(a,function(a){return u.test(a)?h(a.slice(4).toLowerCase()):a})}},0,o&&i)if(T.exports==o)i.exports=n;else for(s in n)n.hasOwnProperty(s)&&(o[s]=n[s]);else a.punycode=n}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[2])(2)});
[
"ac",
"com.ac",
"edu.ac",
"gov.ac",
"net.ac",
"mil.ac",
"org.ac",
"ad",
"nom.ad",
"ae",
"co.ae",
"net.ae",
"org.ae",
"sch.ae",
"ac.ae",
"gov.ae",
"mil.ae",
"aero",
"accident-investigation.aero",
"accident-prevention.aero",
"aerobatic.aero",
"aeroclub.aero",
"aerodrome.aero",
"agents.aero",
"aircraft.aero",
"airline.aero",
"airport.aero",
"air-surveillance.aero",
"airtraffic.aero",
"air-traffic-control.aero",
"ambulance.aero",
"amusement.aero",
"association.aero",
"author.aero",
"ballooning.aero",
"broker.aero",
"caa.aero",
"cargo.aero",
"catering.aero",
"certification.aero",
"championship.aero",
"charter.aero",
"civilaviation.aero",
"club.aero",
"conference.aero",
"consultant.aero",
"consulting.aero",
"control.aero",
"council.aero",
"crew.aero",
"design.aero",
"dgca.aero",
"educator.aero",
"emergency.aero",
"engine.aero",
"engineer.aero",
"entertainment.aero",
"equipment.aero",
"exchange.aero",
"express.aero",
"federation.aero",
"flight.aero",
"freight.aero",
"fuel.aero",
"gliding.aero",
"government.aero",
"groundhandling.aero",
"group.aero",
"hanggliding.aero",
"homebuilt.aero",
"insurance.aero",
"journal.aero",
"journalist.aero",
"leasing.aero",
"logistics.aero",
"magazine.aero",
"maintenance.aero",
"media.aero",
"microlight.aero",
"modelling.aero",
"navigation.aero",
"parachuting.aero",
"paragliding.aero",
"passenger-association.aero",
"pilot.aero",
"press.aero",
"production.aero",
"recreation.aero",
"repbody.aero",
"res.aero",
"research.aero",
"rotorcraft.aero",
"safety.aero",
"scientist.aero",
"services.aero",
"show.aero",
"skydiving.aero",
"software.aero",
"student.aero",
"trader.aero",
"trading.aero",
"trainer.aero",
"union.aero",
"workinggroup.aero",
"works.aero",
"af",
"gov.af",
"com.af",
"org.af",
"net.af",
"edu.af",
"ag",
"com.ag",
"org.ag",
"net.ag",
"co.ag",
"nom.ag",
"ai",
"off.ai",
"com.ai",
"net.ai",
"org.ai",
"al",
"com.al",
"edu.al",
"gov.al",
"mil.al",
"net.al",
"org.al",
"am",
"co.am",
"com.am",
"commune.am",
"net.am",
"org.am",
"ao",
"ed.ao",
"gv.ao",
"og.ao",
"co.ao",
"pb.ao",
"it.ao",
"aq",
"ar",
"com.ar",
"edu.ar",
"gob.ar",
"gov.ar",
"int.ar",
"mil.ar",
"musica.ar",
"net.ar",
"org.ar",
"tur.ar",
"arpa",
"e164.arpa",
"in-addr.arpa",
"ip6.arpa",
"iris.arpa",
"uri.arpa",
"urn.arpa",
"as",
"gov.as",
"asia",
"at",
"ac.at",
"co.at",
"gv.at",
"or.at",
"au",
"com.au",
"net.au",
"org.au",
"edu.au",
"gov.au",
"asn.au",
"id.au",
"info.au",
"conf.au",
"oz.au",
"act.au",
"nsw.au",
"nt.au",
"qld.au",
"sa.au",
"tas.au",
"vic.au",
"wa.au",
"act.edu.au",
"catholic.edu.au",
"nsw.edu.au",
"nt.edu.au",
"qld.edu.au",
"sa.edu.au",
"tas.edu.au",
"vic.edu.au",
"wa.edu.au",
"qld.gov.au",
"sa.gov.au",
"tas.gov.au",
"vic.gov.au",
"wa.gov.au",
"education.tas.edu.au",
"schools.nsw.edu.au",
"aw",
"com.aw",
"ax",
"az",
"com.az",
"net.az",
"int.az",
"gov.az",
"org.az",
"edu.az",
"info.az",
"pp.az",
"mil.az",
"name.az",
"pro.az",
"biz.az",
"ba",
"com.ba",
"edu.ba",
"gov.ba",
"mil.ba",
"net.ba",
"org.ba",
"bb",
"biz.bb",
"co.bb",
"com.bb",
"edu.bb",
"gov.bb",
"info.bb",
"net.bb",
"org.bb",
"store.bb",
"tv.bb",
"*.bd",
"be",
"ac.be",
"bf",
"gov.bf",
"bg",
"a.bg",
"b.bg",
"c.bg",
"d.bg",
"e.bg",
"f.bg",
"g.bg",
"h.bg",
"i.bg",
"j.bg",
"k.bg",
"l.bg",
"m.bg",
"n.bg",
"o.bg",
"p.bg",
"q.bg",
"r.bg",
"s.bg",
"t.bg",
"u.bg",
"v.bg",
"w.bg",
"x.bg",
"y.bg",
"z.bg",
"0.bg",
"1.bg",
"2.bg",
"3.bg",
"4.bg",
"5.bg",
"6.bg",
"7.bg",
"8.bg",
"9.bg",
"bh",
"com.bh",
"edu.bh",
"net.bh",
"org.bh",
"gov.bh",
"bi",
"co.bi",
"com.bi",
"edu.bi",
"or.bi",
"org.bi",
"biz",
"bj",
"asso.bj",
"barreau.bj",
"gouv.bj",
"bm",
"com.bm",
"edu.bm",
"gov.bm",
"net.bm",
"org.bm",
"bn",
"com.bn",
"edu.bn",
"gov.bn",
"net.bn",
"org.bn",
"bo",
"com.bo",
"edu.bo",
"gob.bo",
"int.bo",
"org.bo",
"net.bo",
"mil.bo",
"tv.bo",
"web.bo",
"academia.bo",
"agro.bo",
"arte.bo",
"blog.bo",
"bolivia.bo",
"ciencia.bo",
"cooperativa.bo",
"democracia.bo",
"deporte.bo",
"ecologia.bo",
"economia.bo",
"empresa.bo",
"indigena.bo",
"industria.bo",
"info.bo",
"medicina.bo",
"movimiento.bo",
"musica.bo",
"natural.bo",
"nombre.bo",
"noticias.bo",
"patria.bo",
"politica.bo",
"profesional.bo",
"plurinacional.bo",
"pueblo.bo",
"revista.bo",
"salud.bo",
"tecnologia.bo",
"tksat.bo",
"transporte.bo",
"wiki.bo",
"br",
"9guacu.br",
"abc.br",
"adm.br",
"adv.br",
"agr.br",
"aju.br",
"am.br",
"anani.br",
"aparecida.br",
"arq.br",
"art.br",
"ato.br",
"b.br",
"barueri.br",
"belem.br",
"bhz.br",
"bio.br",
"blog.br",
"bmd.br",
"boavista.br",
"bsb.br",
"campinagrande.br",
"campinas.br",
"caxias.br",
"cim.br",
"cng.br",
"cnt.br",
"com.br",
"contagem.br",
"coop.br",
"cri.br",
"cuiaba.br",
"curitiba.br",
"def.br",
"ecn.br",
"eco.br",
"edu.br",
"emp.br",
"eng.br",
"esp.br",
"etc.br",
"eti.br",
"far.br",
"feira.br",
"flog.br",
"floripa.br",
"fm.br",
"fnd.br",
"fortal.br",
"fot.br",
"foz.br",
"fst.br",
"g12.br",
"ggf.br",
"goiania.br",
"gov.br",
"ac.gov.br",
"al.gov.br",
"am.gov.br",
"ap.gov.br",
"ba.gov.br",
"ce.gov.br",
"df.gov.br",
"es.gov.br",
"go.gov.br",
"ma.gov.br",
"mg.gov.br",
"ms.gov.br",
"mt.gov.br",
"pa.gov.br",
"pb.gov.br",
"pe.gov.br",
"pi.gov.br",
"pr.gov.br",
"rj.gov.br",
"rn.gov.br",
"ro.gov.br",
"rr.gov.br",
"rs.gov.br",
"sc.gov.br",
"se.gov.br",
"sp.gov.br",
"to.gov.br",
"gru.br",
"imb.br",
"ind.br",
"inf.br",
"jab.br",
"jampa.br",
"jdf.br",
"joinville.br",
"jor.br",
"jus.br",
"leg.br",
"lel.br",
"londrina.br",
"macapa.br",
"maceio.br",
"manaus.br",
"maringa.br",
"mat.br",
"med.br",
"mil.br",
"morena.br",
"mp.br",
"mus.br",
"natal.br",
"net.br",
"niteroi.br",
"*.nom.br",
"not.br",
"ntr.br",
"odo.br",
"ong.br",
"org.br",
"osasco.br",
"palmas.br",
"poa.br",
"ppg.br",
"pro.br",
"psc.br",
"psi.br",
"pvh.br",
"qsl.br",
"radio.br",
"rec.br",
"recife.br",
"ribeirao.br",
"rio.br",
"riobranco.br",
"riopreto.br",
"salvador.br",
"sampa.br",
"santamaria.br",
"santoandre.br",
"saobernardo.br",
"saogonca.br",
"sjc.br",
"slg.br",
"slz.br",
"sorocaba.br",
"srv.br",
"taxi.br",
"tc.br",
"teo.br",
"the.br",
"tmp.br",
"trd.br",
"tur.br",
"tv.br",
"udi.br",
"vet.br",
"vix.br",
"vlog.br",
"wiki.br",
"zlg.br",
"bs",
"com.bs",
"net.bs",
"org.bs",
"edu.bs",
"gov.bs",
"bt",
"com.bt",
"edu.bt",
"gov.bt",
"net.bt",
"org.bt",
"bv",
"bw",
"co.bw",
"org.bw",
"by",
"gov.by",
"mil.by",
"com.by",
"of.by",
"bz",
"com.bz",
"net.bz",
"org.bz",
"edu.bz",
"gov.bz",
"ca",
"ab.ca",
"bc.ca",
"mb.ca",
"nb.ca",
"nf.ca",
"nl.ca",
"ns.ca",
"nt.ca",
"nu.ca",
"on.ca",
"pe.ca",
"qc.ca",
"sk.ca",
"yk.ca",
"gc.ca",
"cat",
"cc",
"cd",
"gov.cd",
"cf",
"cg",
"ch",
"ci",
"org.ci",
"or.ci",
"com.ci",
"co.ci",
"edu.ci",
"ed.ci",
"ac.ci",
"net.ci",
"go.ci",
"asso.ci",
"aÃ©roport.ci",
"int.ci",
"presse.ci",
"md.ci",
"gouv.ci",
"*.ck",
"!www.ck",
"cl",
"aprendemas.cl",
"co.cl",
"gob.cl",
"gov.cl",
"mil.cl",
"cm",
"co.cm",
"com.cm",
"gov.cm",
"net.cm",
"cn",
"ac.cn",
"com.cn",
"edu.cn",
"gov.cn",
"net.cn",
"org.cn",
"mil.cn",
"å…¬å�¸.cn",
"ç½‘ç»œ.cn",
"ç¶²çµ¡.cn",
"ah.cn",
"bj.cn",
"cq.cn",
"fj.cn",
"gd.cn",
"gs.cn",
"gz.cn",
"gx.cn",
"ha.cn",
"hb.cn",
"he.cn",
"hi.cn",
"hl.cn",
"hn.cn",
"jl.cn",
"js.cn",
"jx.cn",
"ln.cn",
"nm.cn",
"nx.cn",
"qh.cn",
"sc.cn",
"sd.cn",
"sh.cn",
"sn.cn",
"sx.cn",
"tj.cn",
"xj.cn",
"xz.cn",
"yn.cn",
"zj.cn",
"hk.cn",
"mo.cn",
"tw.cn",
"co",
"arts.co",
"com.co",
"edu.co",
"firm.co",
"gov.co",
"info.co",
"int.co",
"mil.co",
"net.co",
"nom.co",
"org.co",
"rec.co",
"web.co",
"com",
"coop",
"cr",
"ac.cr",
"co.cr",
"ed.cr",
"fi.cr",
"go.cr",
"or.cr",
"sa.cr",
"cu",
"com.cu",
"edu.cu",
"org.cu",
"net.cu",
"gov.cu",
"inf.cu",
"cv",
"cw",
"com.cw",
"edu.cw",
"net.cw",
"org.cw",
"cx",
"gov.cx",
"cy",
"ac.cy",
"biz.cy",
"com.cy",
"ekloges.cy",
"gov.cy",
"ltd.cy",
"name.cy",
"net.cy",
"org.cy",
"parliament.cy",
"press.cy",
"pro.cy",
"tm.cy",
"cz",
"de",
"dj",
"dk",
"dm",
"com.dm",
"net.dm",
"org.dm",
"edu.dm",
"gov.dm",
"do",
"art.do",
"com.do",
"edu.do",
"gob.do",
"gov.do",
"mil.do",
"net.do",
"org.do",
"sld.do",
"web.do",
"dz",
"com.dz",
"org.dz",
"net.dz",
"gov.dz",
"edu.dz",
"asso.dz",
"pol.dz",
"art.dz",
"ec",
"com.ec",
"info.ec",
"net.ec",
"fin.ec",
"k12.ec",
"med.ec",
"pro.ec",
"org.ec",
"edu.ec",
"gov.ec",
"gob.ec",
"mil.ec",
"edu",
"ee",
"edu.ee",
"gov.ee",
"riik.ee",
"lib.ee",
"med.ee",
"com.ee",
"pri.ee",
"aip.ee",
"org.ee",
"fie.ee",
"eg",
"com.eg",
"edu.eg",
"eun.eg",
"gov.eg",
"mil.eg",
"name.eg",
"net.eg",
"org.eg",
"sci.eg",
"*.er",
"es",
"com.es",
"nom.es",
"org.es",
"gob.es",
"edu.es",
"et",
"com.et",
"gov.et",
"org.et",
"edu.et",
"biz.et",
"name.et",
"info.et",
"net.et",
"eu",
"fi",
"aland.fi",
"fj",
"ac.fj",
"biz.fj",
"com.fj",
"gov.fj",
"info.fj",
"mil.fj",
"name.fj",
"net.fj",
"org.fj",
"pro.fj",
"*.fk",
"fm",
"fo",
"fr",
"asso.fr",
"com.fr",
"gouv.fr",
"nom.fr",
"prd.fr",
"tm.fr",
"aeroport.fr",
"avocat.fr",
"avoues.fr",
"cci.fr",
"chambagri.fr",
"chirurgiens-dentistes.fr",
"experts-comptables.fr",
"geometre-expert.fr",
"greta.fr",
"huissier-justice.fr",
"medecin.fr",
"notaires.fr",
"pharmacien.fr",
"port.fr",
"veterinaire.fr",
"ga",
"gb",
"gd",
"ge",
"com.ge",
"edu.ge",
"gov.ge",
"org.ge",
"mil.ge",
"net.ge",
"pvt.ge",
"gf",
"gg",
"co.gg",
"net.gg",
"org.gg",
"gh",
"com.gh",
"edu.gh",
"gov.gh",
"org.gh",
"mil.gh",
"gi",
"com.gi",
"ltd.gi",
"gov.gi",
"mod.gi",
"edu.gi",
"org.gi",
"gl",
"co.gl",
"com.gl",
"edu.gl",
"net.gl",
"org.gl",
"gm",
"gn",
"ac.gn",
"com.gn",
"edu.gn",
"gov.gn",
"org.gn",
"net.gn",
"gov",
"gp",
"com.gp",
"net.gp",
"mobi.gp",
"edu.gp",
"org.gp",
"asso.gp",
"gq",
"gr",
"com.gr",
"edu.gr",
"net.gr",
"org.gr",
"gov.gr",
"gs",
"gt",
"com.gt",
"edu.gt",
"gob.gt",
"ind.gt",
"mil.gt",
"net.gt",
"org.gt",
"gu",
"com.gu",
"edu.gu",
"gov.gu",
"guam.gu",
"info.gu",
"net.gu",
"org.gu",
"web.gu",
"gw",
"gy",
"co.gy",
"com.gy",
"edu.gy",
"gov.gy",
"net.gy",
"org.gy",
"hk",
"com.hk",
"edu.hk",
"gov.hk",
"idv.hk",
"net.hk",
"org.hk",
"å…¬å�¸.hk",
"æ•™è‚².hk",
"æ•Žè‚².hk",
"æ”¿åºœ.hk",
"å€‹äºº.hk",
"ä¸ªäºº.hk",
"ç®‡äºº.hk",
"ç¶²ç»œ.hk",
"ç½‘ç»œ.hk",
"ç»„ç¹”.hk",
"ç¶²çµ¡.hk",
"ç½‘çµ¡.hk",
"ç»„ç»‡.hk",
"çµ„ç¹”.hk",
"çµ„ç»‡.hk",
"hm",
"hn",
"com.hn",
"edu.hn",
"org.hn",
"net.hn",
"mil.hn",
"gob.hn",
"hr",
"iz.hr",
"from.hr",
"name.hr",
"com.hr",
"ht",
"com.ht",
"shop.ht",
"firm.ht",
"info.ht",
"adult.ht",
"net.ht",
"pro.ht",
"org.ht",
"med.ht",
"art.ht",
"coop.ht",
"pol.ht",
"asso.ht",
"edu.ht",
"rel.ht",
"gouv.ht",
"perso.ht",
"hu",
"co.hu",
"info.hu",
"org.hu",
"priv.hu",
"sport.hu",
"tm.hu",
"2000.hu",
"agrar.hu",
"bolt.hu",
"casino.hu",
"city.hu",
"erotica.hu",
"erotika.hu",
"film.hu",
"forum.hu",
"games.hu",
"hotel.hu",
"ingatlan.hu",
"jogasz.hu",
"konyvelo.hu",
"lakas.hu",
"media.hu",
"news.hu",
"reklam.hu",
"sex.hu",
"shop.hu",
"suli.hu",
"szex.hu",
"tozsde.hu",
"utazas.hu",
"video.hu",
"id",
"ac.id",
"biz.id",
"co.id",
"desa.id",
"go.id",
"mil.id",
"my.id",
"net.id",
"or.id",
"ponpes.id",
"sch.id",
"web.id",
"ie",
"gov.ie",
"il",
"ac.il",
"co.il",
"gov.il",
"idf.il",
"k12.il",
"muni.il",
"net.il",
"org.il",
"im",
"ac.im",
"co.im",
"com.im",
"ltd.co.im",
"net.im",
"org.im",
"plc.co.im",
"tt.im",
"tv.im",
"in",
"co.in",
"firm.in",
"net.in",
"org.in",
"gen.in",
"ind.in",
"nic.in",
"ac.in",
"edu.in",
"res.in",
"gov.in",
"mil.in",
"info",
"int",
"eu.int",
"io",
"com.io",
"iq",
"gov.iq",
"edu.iq",
"mil.iq",
"com.iq",
"org.iq",
"net.iq",
"ir",
"ac.ir",
"co.ir",
"gov.ir",
"id.ir",
"net.ir",
"org.ir",
"sch.ir",
"Ø§ÛŒØ±Ø§Ù†.ir",
"Ø§ÙŠØ±Ø§Ù†.ir",
"is",
"net.is",
"com.is",
"edu.is",
"gov.is",
"org.is",
"int.is",
"it",
"gov.it",
"edu.it",
"abr.it",
"abruzzo.it",
"aosta-valley.it",
"aostavalley.it",
"bas.it",
"basilicata.it",
"cal.it",
"calabria.it",
"cam.it",
"campania.it",
"emilia-romagna.it",
"emiliaromagna.it",
"emr.it",
"friuli-v-giulia.it",
"friuli-ve-giulia.it",
"friuli-vegiulia.it",
"friuli-venezia-giulia.it",
"friuli-veneziagiulia.it",
"friuli-vgiulia.it",
"friuliv-giulia.it",
"friulive-giulia.it",
"friulivegiulia.it",
"friulivenezia-giulia.it",
"friuliveneziagiulia.it",
"friulivgiulia.it",
"fvg.it",
"laz.it",
"lazio.it",
"lig.it",
"liguria.it",
"lom.it",
"lombardia.it",
"lombardy.it",
"lucania.it",
"mar.it",
"marche.it",
"mol.it",
"molise.it",
"piedmont.it",
"piemonte.it",
"pmn.it",
"pug.it",
"puglia.it",
"sar.it",
"sardegna.it",
"sardinia.it",
"sic.it",
"sicilia.it",
"sicily.it",
"taa.it",
"tos.it",
"toscana.it",
"trentin-sud-tirol.it",
"trentin-sÃ¼d-tirol.it",
"trentin-sudtirol.it",
"trentin-sÃ¼dtirol.it",
"trentin-sued-tirol.it",
"trentin-suedtirol.it",
"trentino-a-adige.it",
"trentino-aadige.it",
"trentino-alto-adige.it",
"trentino-altoadige.it",
"trentino-s-tirol.it",
"trentino-stirol.it",
"trentino-sud-tirol.it",
"trentino-sÃ¼d-tirol.it",
"trentino-sudtirol.it",
"trentino-sÃ¼dtirol.it",
"trentino-sued-tirol.it",
"trentino-suedtirol.it",
"trentino.it",
"trentinoa-adige.it",
"trentinoaadige.it",
"trentinoalto-adige.it",
"trentinoaltoadige.it",
"trentinos-tirol.it",
"trentinostirol.it",
"trentinosud-tirol.it",
"trentinosÃ¼d-tirol.it",
"trentinosudtirol.it",
"trentinosÃ¼dtirol.it",
"trentinosued-tirol.it",
"trentinosuedtirol.it",
"trentinsud-tirol.it",
"trentinsÃ¼d-tirol.it",
"trentinsudtirol.it",
"trentinsÃ¼dtirol.it",
"trentinsued-tirol.it",
"trentinsuedtirol.it",
"tuscany.it",
"umb.it",
"umbria.it",
"val-d-aosta.it",
"val-daosta.it",
"vald-aosta.it",
"valdaosta.it",
"valle-aosta.it",
"valle-d-aosta.it",
"valle-daosta.it",
"valleaosta.it",
"valled-aosta.it",
"valledaosta.it",
"vallee-aoste.it",
"vallÃ©e-aoste.it",
"vallee-d-aoste.it",
"vallÃ©e-d-aoste.it",
"valleeaoste.it",
"vallÃ©eaoste.it",
"valleedaoste.it",
"vallÃ©edaoste.it",
"vao.it",
"vda.it",
"ven.it",
"veneto.it",
"ag.it",
"agrigento.it",
"al.it",
"alessandria.it",
"alto-adige.it",
"altoadige.it",
"an.it",
"ancona.it",
"andria-barletta-trani.it",
"andria-trani-barletta.it",
"andriabarlettatrani.it",
"andriatranibarletta.it",
"ao.it",
"aosta.it",
"aoste.it",
"ap.it",
"aq.it",
"aquila.it",
"ar.it",
"arezzo.it",
"ascoli-piceno.it",
"ascolipiceno.it",
"asti.it",
"at.it",
"av.it",
"avellino.it",
"ba.it",
"balsan-sudtirol.it",
"balsan-sÃ¼dtirol.it",
"balsan-suedtirol.it",
"balsan.it",
"bari.it",
"barletta-trani-andria.it",
"barlettatraniandria.it",
"belluno.it",
"benevento.it",
"bergamo.it",
"bg.it",
"bi.it",
"biella.it",
"bl.it",
"bn.it",
"bo.it",
"bologna.it",
"bolzano-altoadige.it",
"bolzano.it",
"bozen-sudtirol.it",
"bozen-sÃ¼dtirol.it",
"bozen-suedtirol.it",
"bozen.it",
"br.it",
"brescia.it",
"brindisi.it",
"bs.it",
"bt.it",
"bulsan-sudtirol.it",
"bulsan-sÃ¼dtirol.it",
"bulsan-suedtirol.it",
"bulsan.it",
"bz.it",
"ca.it",
"cagliari.it",
"caltanissetta.it",
"campidano-medio.it",
"campidanomedio.it",
"campobasso.it",
"carbonia-iglesias.it",
"carboniaiglesias.it",
"carrara-massa.it",
"carraramassa.it",
"caserta.it",
"catania.it",
"catanzaro.it",
"cb.it",
"ce.it",
"cesena-forli.it",
"cesena-forlÃ¬.it",
"cesenaforli.it",
"cesenaforlÃ¬.it",
"ch.it",
"chieti.it",
"ci.it",
"cl.it",
"cn.it",
"co.it",
"como.it",
"cosenza.it",
"cr.it",
"cremona.it",
"crotone.it",
"cs.it",
"ct.it",
"cuneo.it",
"cz.it",
"dell-ogliastra.it",
"dellogliastra.it",
"en.it",
"enna.it",
"fc.it",
"fe.it",
"fermo.it",
"ferrara.it",
"fg.it",
"fi.it",
"firenze.it",
"florence.it",
"fm.it",
"foggia.it",
"forli-cesena.it",
"forlÃ¬-cesena.it",
"forlicesena.it",
"forlÃ¬cesena.it",
"fr.it",
"frosinone.it",
"ge.it",
"genoa.it",
"genova.it",
"go.it",
"gorizia.it",
"gr.it",
"grosseto.it",
"iglesias-carbonia.it",
"iglesiascarbonia.it",
"im.it",
"imperia.it",
"is.it",
"isernia.it",
"kr.it",
"la-spezia.it",
"laquila.it",
"laspezia.it",
"latina.it",
"lc.it",
"le.it",
"lecce.it",
"lecco.it",
"li.it",
"livorno.it",
"lo.it",
"lodi.it",
"lt.it",
"lu.it",
"lucca.it",
"macerata.it",
"mantova.it",
"massa-carrara.it",
"massacarrara.it",
"matera.it",
"mb.it",
"mc.it",
"me.it",
"medio-campidano.it",
"mediocampidano.it",
"messina.it",
"mi.it",
"milan.it",
"milano.it",
"mn.it",
"mo.it",
"modena.it",
"monza-brianza.it",
"monza-e-della-brianza.it",
"monza.it",
"monzabrianza.it",
"monzaebrianza.it",
"monzaedellabrianza.it",
"ms.it",
"mt.it",
"na.it",
"naples.it",
"napoli.it",
"no.it",
"novara.it",
"nu.it",
"nuoro.it",
"og.it",
"ogliastra.it",
"olbia-tempio.it",
"olbiatempio.it",
"or.it",
"oristano.it",
"ot.it",
"pa.it",
"padova.it",
"padua.it",
"palermo.it",
"parma.it",
"pavia.it",
"pc.it",
"pd.it",
"pe.it",
"perugia.it",
"pesaro-urbino.it",
"pesarourbino.it",
"pescara.it",
"pg.it",
"pi.it",
"piacenza.it",
"pisa.it",
"pistoia.it",
"pn.it",
"po.it",
"pordenone.it",
"potenza.it",
"pr.it",
"prato.it",
"pt.it",
"pu.it",
"pv.it",
"pz.it",
"ra.it",
"ragusa.it",
"ravenna.it",
"rc.it",
"re.it",
"reggio-calabria.it",
"reggio-emilia.it",
"reggiocalabria.it",
"reggioemilia.it",
"rg.it",
"ri.it",
"rieti.it",
"rimini.it",
"rm.it",
"rn.it",
"ro.it",
"roma.it",
"rome.it",
"rovigo.it",
"sa.it",
"salerno.it",
"sassari.it",
"savona.it",
"si.it",
"siena.it",
"siracusa.it",
"so.it",
"sondrio.it",
"sp.it",
"sr.it",
"ss.it",
"suedtirol.it",
"sÃ¼dtirol.it",
"sv.it",
"ta.it",
"taranto.it",
"te.it",
"tempio-olbia.it",
"tempioolbia.it",
"teramo.it",
"terni.it",
"tn.it",
"to.it",
"torino.it",
"tp.it",
"tr.it",
"trani-andria-barletta.it",
"trani-barletta-andria.it",
"traniandriabarletta.it",
"tranibarlettaandria.it",
"trapani.it",
"trento.it",
"treviso.it",
"trieste.it",
"ts.it",
"turin.it",
"tv.it",
"ud.it",
"udine.it",
"urbino-pesaro.it",
"urbinopesaro.it",
"va.it",
"varese.it",
"vb.it",
"vc.it",
"ve.it",
"venezia.it",
"venice.it",
"verbania.it",
"vercelli.it",
"verona.it",
"vi.it",
"vibo-valentia.it",
"vibovalentia.it",
"vicenza.it",
"viterbo.it",
"vr.it",
"vs.it",
"vt.it",
"vv.it",
"je",
"co.je",
"net.je",
"org.je",
"*.jm",
"jo",
"com.jo",
"org.jo",
"net.jo",
"edu.jo",
"sch.jo",
"gov.jo",
"mil.jo",
"name.jo",
"jobs",
"jp",
"ac.jp",
"ad.jp",
"co.jp",
"ed.jp",
"go.jp",
"gr.jp",
"lg.jp",
"ne.jp",
"or.jp",
"aichi.jp",
"akita.jp",
"aomori.jp",
"chiba.jp",
"ehime.jp",
"fukui.jp",
"fukuoka.jp",
"fukushima.jp",
"gifu.jp",
"gunma.jp",
"hiroshima.jp",
"hokkaido.jp",
"hyogo.jp",
"ibaraki.jp",
"ishikawa.jp",
"iwate.jp",
"kagawa.jp",
"kagoshima.jp",
"kanagawa.jp",
"kochi.jp",
"kumamoto.jp",
"kyoto.jp",
"mie.jp",
"miyagi.jp",
"miyazaki.jp",
"nagano.jp",
"nagasaki.jp",
"nara.jp",
"niigata.jp",
"oita.jp",
"okayama.jp",
"okinawa.jp",
"osaka.jp",
"saga.jp",
"saitama.jp",
"shiga.jp",
"shimane.jp",
"shizuoka.jp",
"tochigi.jp",
"tokushima.jp",
"tokyo.jp",
"tottori.jp",
"toyama.jp",
"wakayama.jp",
"yamagata.jp",
"yamaguchi.jp",
"yamanashi.jp",
"æ ƒæœ¨.jp",
"æ„›çŸ¥.jp",
"æ„›åª›.jp",
"å…µåº«.jp",
"ç†Šæœ¬.jp",
"èŒ¨åŸŽ.jp",
"åŒ—æµ·é�“.jp",
"å�ƒè‘‰.jp",
"å’Œæ­Œå±±.jp",
"é•·å´Ž.jp",
"é•·é‡Ž.jp",
"æ–°æ½Ÿ.jp",
"é�’æ£®.jp",
"é�™å²¡.jp",
"æ�±äº¬.jp",
"çŸ³å·�.jp",
"åŸ¼çŽ‰.jp",
"ä¸‰é‡�.jp",
"äº¬éƒ½.jp",
"ä½�è³€.jp",
"å¤§åˆ†.jp",
"å¤§é˜ª.jp",
"å¥ˆè‰¯.jp",
"å®®åŸŽ.jp",
"å®®å´Ž.jp",
"å¯Œå±±.jp",
"å±±å�£.jp",
"å±±å½¢.jp",
"å±±æ¢¨.jp",
"å²©æ‰‹.jp",
"å²�é˜œ.jp",
"å²¡å±±.jp",
"å³¶æ ¹.jp",
"åºƒå³¶.jp",
"å¾³å³¶.jp",
"æ²–ç¸„.jp",
"æ»‹è³€.jp",
"ç¥žå¥ˆå·�.jp",
"ç¦�äº•.jp",
"ç¦�å²¡.jp",
"ç¦�å³¶.jp",
"ç§‹ç”°.jp",
"ç¾¤é¦¬.jp",
"é¦™å·�.jp",
"é«˜çŸ¥.jp",
"é³¥å�–.jp",
"é¹¿å…�å³¶.jp",
"*.kawasaki.jp",
"*.kitakyushu.jp",
"*.kobe.jp",
"*.nagoya.jp",
"*.sapporo.jp",
"*.sendai.jp",
"*.yokohama.jp",
"!city.kawasaki.jp",
"!city.kitakyushu.jp",
"!city.kobe.jp",
"!city.nagoya.jp",
"!city.sapporo.jp",
"!city.sendai.jp",
"!city.yokohama.jp",
"aisai.aichi.jp",
"ama.aichi.jp",
"anjo.aichi.jp",
"asuke.aichi.jp",
"chiryu.aichi.jp",
"chita.aichi.jp",
"fuso.aichi.jp",
"gamagori.aichi.jp",
"handa.aichi.jp",
"hazu.aichi.jp",
"hekinan.aichi.jp",
"higashiura.aichi.jp",
"ichinomiya.aichi.jp",
"inazawa.aichi.jp",
"inuyama.aichi.jp",
"isshiki.aichi.jp",
"iwakura.aichi.jp",
"kanie.aichi.jp",
"kariya.aichi.jp",
"kasugai.aichi.jp",
"kira.aichi.jp",
"kiyosu.aichi.jp",
"komaki.aichi.jp",
"konan.aichi.jp",
"kota.aichi.jp",
"mihama.aichi.jp",
"miyoshi.aichi.jp",
"nishio.aichi.jp",
"nisshin.aichi.jp",
"obu.aichi.jp",
"oguchi.aichi.jp",
"oharu.aichi.jp",
"okazaki.aichi.jp",
"owariasahi.aichi.jp",
"seto.aichi.jp",
"shikatsu.aichi.jp",
"shinshiro.aichi.jp",
"shitara.aichi.jp",
"tahara.aichi.jp",
"takahama.aichi.jp",
"tobishima.aichi.jp",
"toei.aichi.jp",
"togo.aichi.jp",
"tokai.aichi.jp",
"tokoname.aichi.jp",
"toyoake.aichi.jp",
"toyohashi.aichi.jp",
"toyokawa.aichi.jp",
"toyone.aichi.jp",
"toyota.aichi.jp",
"tsushima.aichi.jp",
"yatomi.aichi.jp",
"akita.akita.jp",
"daisen.akita.jp",
"fujisato.akita.jp",
"gojome.akita.jp",
"hachirogata.akita.jp",
"happou.akita.jp",
"higashinaruse.akita.jp",
"honjo.akita.jp",
"honjyo.akita.jp",
"ikawa.akita.jp",
"kamikoani.akita.jp",
"kamioka.akita.jp",
"katagami.akita.jp",
"kazuno.akita.jp",
"kitaakita.akita.jp",
"kosaka.akita.jp",
"kyowa.akita.jp",
"misato.akita.jp",
"mitane.akita.jp",
"moriyoshi.akita.jp",
"nikaho.akita.jp",
"noshiro.akita.jp",
"odate.akita.jp",
"oga.akita.jp",
"ogata.akita.jp",
"semboku.akita.jp",
"yokote.akita.jp",
"yurihonjo.akita.jp",
"aomori.aomori.jp",
"gonohe.aomori.jp",
"hachinohe.aomori.jp",
"hashikami.aomori.jp",
"hiranai.aomori.jp",
"hirosaki.aomori.jp",
"itayanagi.aomori.jp",
"kuroishi.aomori.jp",
"misawa.aomori.jp",
"mutsu.aomori.jp",
"nakadomari.aomori.jp",
"noheji.aomori.jp",
"oirase.aomori.jp",
"owani.aomori.jp",
"rokunohe.aomori.jp",
"sannohe.aomori.jp",
"shichinohe.aomori.jp",
"shingo.aomori.jp",
"takko.aomori.jp",
"towada.aomori.jp",
"tsugaru.aomori.jp",
"tsuruta.aomori.jp",
"abiko.chiba.jp",
"asahi.chiba.jp",
"chonan.chiba.jp",
"chosei.chiba.jp",
"choshi.chiba.jp",
"chuo.chiba.jp",
"funabashi.chiba.jp",
"futtsu.chiba.jp",
"hanamigawa.chiba.jp",
"ichihara.chiba.jp",
"ichikawa.chiba.jp",
"ichinomiya.chiba.jp",
"inzai.chiba.jp",
"isumi.chiba.jp",
"kamagaya.chiba.jp",
"kamogawa.chiba.jp",
"kashiwa.chiba.jp",
"katori.chiba.jp",
"katsuura.chiba.jp",
"kimitsu.chiba.jp",
"kisarazu.chiba.jp",
"kozaki.chiba.jp",
"kujukuri.chiba.jp",
"kyonan.chiba.jp",
"matsudo.chiba.jp",
"midori.chiba.jp",
"mihama.chiba.jp",
"minamiboso.chiba.jp",
"mobara.chiba.jp",
"mutsuzawa.chiba.jp",
"nagara.chiba.jp",
"nagareyama.chiba.jp",
"narashino.chiba.jp",
"narita.chiba.jp",
"noda.chiba.jp",
"oamishirasato.chiba.jp",
"omigawa.chiba.jp",
"onjuku.chiba.jp",
"otaki.chiba.jp",
"sakae.chiba.jp",
"sakura.chiba.jp",
"shimofusa.chiba.jp",
"shirako.chiba.jp",
"shiroi.chiba.jp",
"shisui.chiba.jp",
"sodegaura.chiba.jp",
"sosa.chiba.jp",
"tako.chiba.jp",
"tateyama.chiba.jp",
"togane.chiba.jp",
"tohnosho.chiba.jp",
"tomisato.chiba.jp",
"urayasu.chiba.jp",
"yachimata.chiba.jp",
"yachiyo.chiba.jp",
"yokaichiba.chiba.jp",
"yokoshibahikari.chiba.jp",
"yotsukaido.chiba.jp",
"ainan.ehime.jp",
"honai.ehime.jp",
"ikata.ehime.jp",
"imabari.ehime.jp",
"iyo.ehime.jp",
"kamijima.ehime.jp",
"kihoku.ehime.jp",
"kumakogen.ehime.jp",
"masaki.ehime.jp",
"matsuno.ehime.jp",
"matsuyama.ehime.jp",
"namikata.ehime.jp",
"niihama.ehime.jp",
"ozu.ehime.jp",
"saijo.ehime.jp",
"seiyo.ehime.jp",
"shikokuchuo.ehime.jp",
"tobe.ehime.jp",
"toon.ehime.jp",
"uchiko.ehime.jp",
"uwajima.ehime.jp",
"yawatahama.ehime.jp",
"echizen.fukui.jp",
"eiheiji.fukui.jp",
"fukui.fukui.jp",
"ikeda.fukui.jp",
"katsuyama.fukui.jp",
"mihama.fukui.jp",
"minamiechizen.fukui.jp",
"obama.fukui.jp",
"ohi.fukui.jp",
"ono.fukui.jp",
"sabae.fukui.jp",
"sakai.fukui.jp",
"takahama.fukui.jp",
"tsuruga.fukui.jp",
"wakasa.fukui.jp",
"ashiya.fukuoka.jp",
"buzen.fukuoka.jp",
"chikugo.fukuoka.jp",
"chikuho.fukuoka.jp",
"chikujo.fukuoka.jp",
"chikushino.fukuoka.jp",
"chikuzen.fukuoka.jp",
"chuo.fukuoka.jp",
"dazaifu.fukuoka.jp",
"fukuchi.fukuoka.jp",
"hakata.fukuoka.jp",
"higashi.fukuoka.jp",
"hirokawa.fukuoka.jp",
"hisayama.fukuoka.jp",
"iizuka.fukuoka.jp",
"inatsuki.fukuoka.jp",
"kaho.fukuoka.jp",
"kasuga.fukuoka.jp",
"kasuya.fukuoka.jp",
"kawara.fukuoka.jp",
"keisen.fukuoka.jp",
"koga.fukuoka.jp",
"kurate.fukuoka.jp",
"kurogi.fukuoka.jp",
"kurume.fukuoka.jp",
"minami.fukuoka.jp",
"miyako.fukuoka.jp",
"miyama.fukuoka.jp",
"miyawaka.fukuoka.jp",
"mizumaki.fukuoka.jp",
"munakata.fukuoka.jp",
"nakagawa.fukuoka.jp",
"nakama.fukuoka.jp",
"nishi.fukuoka.jp",
"nogata.fukuoka.jp",
"ogori.fukuoka.jp",
"okagaki.fukuoka.jp",
"okawa.fukuoka.jp",
"oki.fukuoka.jp",
"omuta.fukuoka.jp",
"onga.fukuoka.jp",
"onojo.fukuoka.jp",
"oto.fukuoka.jp",
"saigawa.fukuoka.jp",
"sasaguri.fukuoka.jp",
"shingu.fukuoka.jp",
"shinyoshitomi.fukuoka.jp",
"shonai.fukuoka.jp",
"soeda.fukuoka.jp",
"sue.fukuoka.jp",
"tachiarai.fukuoka.jp",
"tagawa.fukuoka.jp",
"takata.fukuoka.jp",
"toho.fukuoka.jp",
"toyotsu.fukuoka.jp",
"tsuiki.fukuoka.jp",
"ukiha.fukuoka.jp",
"umi.fukuoka.jp",
"usui.fukuoka.jp",
"yamada.fukuoka.jp",
"yame.fukuoka.jp",
"yanagawa.fukuoka.jp",
"yukuhashi.fukuoka.jp",
"aizubange.fukushima.jp",
"aizumisato.fukushima.jp",
"aizuwakamatsu.fukushima.jp",
"asakawa.fukushima.jp",
"bandai.fukushima.jp",
"date.fukushima.jp",
"fukushima.fukushima.jp",
"furudono.fukushima.jp",
"futaba.fukushima.jp",
"hanawa.fukushima.jp",
"higashi.fukushima.jp",
"hirata.fukushima.jp",
"hirono.fukushima.jp",
"iitate.fukushima.jp",
"inawashiro.fukushima.jp",
"ishikawa.fukushima.jp",
"iwaki.fukushima.jp",
"izumizaki.fukushima.jp",
"kagamiishi.fukushima.jp",
"kaneyama.fukushima.jp",
"kawamata.fukushima.jp",
"kitakata.fukushima.jp",
"kitashiobara.fukushima.jp",
"koori.fukushima.jp",
"koriyama.fukushima.jp",
"kunimi.fukushima.jp",
"miharu.fukushima.jp",
"mishima.fukushima.jp",
"namie.fukushima.jp",
"nango.fukushima.jp",
"nishiaizu.fukushima.jp",
"nishigo.fukushima.jp",
"okuma.fukushima.jp",
"omotego.fukushima.jp",
"ono.fukushima.jp",
"otama.fukushima.jp",
"samegawa.fukushima.jp",
"shimogo.fukushima.jp",
"shirakawa.fukushima.jp",
"showa.fukushima.jp",
"soma.fukushima.jp",
"sukagawa.fukushima.jp",
"taishin.fukushima.jp",
"tamakawa.fukushima.jp",
"tanagura.fukushima.jp",
"tenei.fukushima.jp",
"yabuki.fukushima.jp",
"yamato.fukushima.jp",
"yamatsuri.fukushima.jp",
"yanaizu.fukushima.jp",
"yugawa.fukushima.jp",
"anpachi.gifu.jp",
"ena.gifu.jp",
"gifu.gifu.jp",
"ginan.gifu.jp",
"godo.gifu.jp",
"gujo.gifu.jp",
"hashima.gifu.jp",
"hichiso.gifu.jp",
"hida.gifu.jp",
"higashishirakawa.gifu.jp",
"ibigawa.gifu.jp",
"ikeda.gifu.jp",
"kakamigahara.gifu.jp",
"kani.gifu.jp",
"kasahara.gifu.jp",
"kasamatsu.gifu.jp",
"kawaue.gifu.jp",
"kitagata.gifu.jp",
"mino.gifu.jp",
"minokamo.gifu.jp",
"mitake.gifu.jp",
"mizunami.gifu.jp",
"motosu.gifu.jp",
"nakatsugawa.gifu.jp",
"ogaki.gifu.jp",
"sakahogi.gifu.jp",
"seki.gifu.jp",
"sekigahara.gifu.jp",
"shirakawa.gifu.jp",
"tajimi.gifu.jp",
"takayama.gifu.jp",
"tarui.gifu.jp",
"toki.gifu.jp",
"tomika.gifu.jp",
"wanouchi.gifu.jp",
"yamagata.gifu.jp",
"yaotsu.gifu.jp",
"yoro.gifu.jp",
"annaka.gunma.jp",
"chiyoda.gunma.jp",
"fujioka.gunma.jp",
"higashiagatsuma.gunma.jp",
"isesaki.gunma.jp",
"itakura.gunma.jp",
"kanna.gunma.jp",
"kanra.gunma.jp",
"katashina.gunma.jp",
"kawaba.gunma.jp",
"kiryu.gunma.jp",
"kusatsu.gunma.jp",
"maebashi.gunma.jp",
"meiwa.gunma.jp",
"midori.gunma.jp",
"minakami.gunma.jp",
"naganohara.gunma.jp",
"nakanojo.gunma.jp",
"nanmoku.gunma.jp",
"numata.gunma.jp",
"oizumi.gunma.jp",
"ora.gunma.jp",
"ota.gunma.jp",
"shibukawa.gunma.jp",
"shimonita.gunma.jp",
"shinto.gunma.jp",
"showa.gunma.jp",
"takasaki.gunma.jp",
"takayama.gunma.jp",
"tamamura.gunma.jp",
"tatebayashi.gunma.jp",
"tomioka.gunma.jp",
"tsukiyono.gunma.jp",
"tsumagoi.gunma.jp",
"ueno.gunma.jp",
"yoshioka.gunma.jp",
"asaminami.hiroshima.jp",
"daiwa.hiroshima.jp",
"etajima.hiroshima.jp",
"fuchu.hiroshima.jp",
"fukuyama.hiroshima.jp",
"hatsukaichi.hiroshima.jp",
"higashihiroshima.hiroshima.jp",
"hongo.hiroshima.jp",
"jinsekikogen.hiroshima.jp",
"kaita.hiroshima.jp",
"kui.hiroshima.jp",
"kumano.hiroshima.jp",
"kure.hiroshima.jp",
"mihara.hiroshima.jp",
"miyoshi.hiroshima.jp",
"naka.hiroshima.jp",
"onomichi.hiroshima.jp",
"osakikamijima.hiroshima.jp",
"otake.hiroshima.jp",
"saka.hiroshima.jp",
"sera.hiroshima.jp",
"seranishi.hiroshima.jp",
"shinichi.hiroshima.jp",
"shobara.hiroshima.jp",
"takehara.hiroshima.jp",
"abashiri.hokkaido.jp",
"abira.hokkaido.jp",
"aibetsu.hokkaido.jp",
"akabira.hokkaido.jp",
"akkeshi.hokkaido.jp",
"asahikawa.hokkaido.jp",
"ashibetsu.hokkaido.jp",
"ashoro.hokkaido.jp",
"assabu.hokkaido.jp",
"atsuma.hokkaido.jp",
"bibai.hokkaido.jp",
"biei.hokkaido.jp",
"bifuka.hokkaido.jp",
"bihoro.hokkaido.jp",
"biratori.hokkaido.jp",
"chippubetsu.hokkaido.jp",
"chitose.hokkaido.jp",
"date.hokkaido.jp",
"ebetsu.hokkaido.jp",
"embetsu.hokkaido.jp",
"eniwa.hokkaido.jp",
"erimo.hokkaido.jp",
"esan.hokkaido.jp",
"esashi.hokkaido.jp",
"fukagawa.hokkaido.jp",
"fukushima.hokkaido.jp",
"furano.hokkaido.jp",
"furubira.hokkaido.jp",
"haboro.hokkaido.jp",
"hakodate.hokkaido.jp",
"hamatonbetsu.hokkaido.jp",
"hidaka.hokkaido.jp",
"higashikagura.hokkaido.jp",
"higashikawa.hokkaido.jp",
"hiroo.hokkaido.jp",
"hokuryu.hokkaido.jp",
"hokuto.hokkaido.jp",
"honbetsu.hokkaido.jp",
"horokanai.hokkaido.jp",
"horonobe.hokkaido.jp",
"ikeda.hokkaido.jp",
"imakane.hokkaido.jp",
"ishikari.hokkaido.jp",
"iwamizawa.hokkaido.jp",
"iwanai.hokkaido.jp",
"kamifurano.hokkaido.jp",
"kamikawa.hokkaido.jp",
"kamishihoro.hokkaido.jp",
"kamisunagawa.hokkaido.jp",
"kamoenai.hokkaido.jp",
"kayabe.hokkaido.jp",
"kembuchi.hokkaido.jp",
"kikonai.hokkaido.jp",
"kimobetsu.hokkaido.jp",
"kitahiroshima.hokkaido.jp",
"kitami.hokkaido.jp",
"kiyosato.hokkaido.jp",
"koshimizu.hokkaido.jp",
"kunneppu.hokkaido.jp",
"kuriyama.hokkaido.jp",
"kuromatsunai.hokkaido.jp",
"kushiro.hokkaido.jp",
"kutchan.hokkaido.jp",
"kyowa.hokkaido.jp",
"mashike.hokkaido.jp",
"matsumae.hokkaido.jp",
"mikasa.hokkaido.jp",
"minamifurano.hokkaido.jp",
"mombetsu.hokkaido.jp",
"moseushi.hokkaido.jp",
"mukawa.hokkaido.jp",
"muroran.hokkaido.jp",
"naie.hokkaido.jp",
"nakagawa.hokkaido.jp",
"nakasatsunai.hokkaido.jp",
"nakatombetsu.hokkaido.jp",
"nanae.hokkaido.jp",
"nanporo.hokkaido.jp",
"nayoro.hokkaido.jp",
"nemuro.hokkaido.jp",
"niikappu.hokkaido.jp",
"niki.hokkaido.jp",
"nishiokoppe.hokkaido.jp",
"noboribetsu.hokkaido.jp",
"numata.hokkaido.jp",
"obihiro.hokkaido.jp",
"obira.hokkaido.jp",
"oketo.hokkaido.jp",
"okoppe.hokkaido.jp",
"otaru.hokkaido.jp",
"otobe.hokkaido.jp",
"otofuke.hokkaido.jp",
"otoineppu.hokkaido.jp",
"oumu.hokkaido.jp",
"ozora.hokkaido.jp",
"pippu.hokkaido.jp",
"rankoshi.hokkaido.jp",
"rebun.hokkaido.jp",
"rikubetsu.hokkaido.jp",
"rishiri.hokkaido.jp",
"rishirifuji.hokkaido.jp",
"saroma.hokkaido.jp",
"sarufutsu.hokkaido.jp",
"shakotan.hokkaido.jp",
"shari.hokkaido.jp",
"shibecha.hokkaido.jp",
"shibetsu.hokkaido.jp",
"shikabe.hokkaido.jp",
"shikaoi.hokkaido.jp",
"shimamaki.hokkaido.jp",
"shimizu.hokkaido.jp",
"shimokawa.hokkaido.jp",
"shinshinotsu.hokkaido.jp",
"shintoku.hokkaido.jp",
"shiranuka.hokkaido.jp",
"shiraoi.hokkaido.jp",
"shiriuchi.hokkaido.jp",
"sobetsu.hokkaido.jp",
"sunagawa.hokkaido.jp",
"taiki.hokkaido.jp",
"takasu.hokkaido.jp",
"takikawa.hokkaido.jp",
"takinoue.hokkaido.jp",
"teshikaga.hokkaido.jp",
"tobetsu.hokkaido.jp",
"tohma.hokkaido.jp",
"tomakomai.hokkaido.jp",
"tomari.hokkaido.jp",
"toya.hokkaido.jp",
"toyako.hokkaido.jp",
"toyotomi.hokkaido.jp",
"toyoura.hokkaido.jp",
"tsubetsu.hokkaido.jp",
"tsukigata.hokkaido.jp",
"urakawa.hokkaido.jp",
"urausu.hokkaido.jp",
"uryu.hokkaido.jp",
"utashinai.hokkaido.jp",
"wakkanai.hokkaido.jp",
"wassamu.hokkaido.jp",
"yakumo.hokkaido.jp",
"yoichi.hokkaido.jp",
"aioi.hyogo.jp",
"akashi.hyogo.jp",
"ako.hyogo.jp",
"amagasaki.hyogo.jp",
"aogaki.hyogo.jp",
"asago.hyogo.jp",
"ashiya.hyogo.jp",
"awaji.hyogo.jp",
"fukusaki.hyogo.jp",
"goshiki.hyogo.jp",
"harima.hyogo.jp",
"himeji.hyogo.jp",
"ichikawa.hyogo.jp",
"inagawa.hyogo.jp",
"itami.hyogo.jp",
"kakogawa.hyogo.jp",
"kamigori.hyogo.jp",
"kamikawa.hyogo.jp",
"kasai.hyogo.jp",
"kasuga.hyogo.jp",
"kawanishi.hyogo.jp",
"miki.hyogo.jp",
"minamiawaji.hyogo.jp",
"nishinomiya.hyogo.jp",
"nishiwaki.hyogo.jp",
"ono.hyogo.jp",
"sanda.hyogo.jp",
"sannan.hyogo.jp",
"sasayama.hyogo.jp",
"sayo.hyogo.jp",
"shingu.hyogo.jp",
"shinonsen.hyogo.jp",
"shiso.hyogo.jp",
"sumoto.hyogo.jp",
"taishi.hyogo.jp",
"taka.hyogo.jp",
"takarazuka.hyogo.jp",
"takasago.hyogo.jp",
"takino.hyogo.jp",
"tamba.hyogo.jp",
"tatsuno.hyogo.jp",
"toyooka.hyogo.jp",
"yabu.hyogo.jp",
"yashiro.hyogo.jp",
"yoka.hyogo.jp",
"yokawa.hyogo.jp",
"ami.ibaraki.jp",
"asahi.ibaraki.jp",
"bando.ibaraki.jp",
"chikusei.ibaraki.jp",
"daigo.ibaraki.jp",
"fujishiro.ibaraki.jp",
"hitachi.ibaraki.jp",
"hitachinaka.ibaraki.jp",
"hitachiomiya.ibaraki.jp",
"hitachiota.ibaraki.jp",
"ibaraki.ibaraki.jp",
"ina.ibaraki.jp",
"inashiki.ibaraki.jp",
"itako.ibaraki.jp",
"iwama.ibaraki.jp",
"joso.ibaraki.jp",
"kamisu.ibaraki.jp",
"kasama.ibaraki.jp",
"kashima.ibaraki.jp",
"kasumigaura.ibaraki.jp",
"koga.ibaraki.jp",
"miho.ibaraki.jp",
"mito.ibaraki.jp",
"moriya.ibaraki.jp",
"naka.ibaraki.jp",
"namegata.ibaraki.jp",
"oarai.ibaraki.jp",
"ogawa.ibaraki.jp",
"omitama.ibaraki.jp",
"ryugasaki.ibaraki.jp",
"sakai.ibaraki.jp",
"sakuragawa.ibaraki.jp",
"shimodate.ibaraki.jp",
"shimotsuma.ibaraki.jp",
"shirosato.ibaraki.jp",
"sowa.ibaraki.jp",
"suifu.ibaraki.jp",
"takahagi.ibaraki.jp",
"tamatsukuri.ibaraki.jp",
"tokai.ibaraki.jp",
"tomobe.ibaraki.jp",
"tone.ibaraki.jp",
"toride.ibaraki.jp",
"tsuchiura.ibaraki.jp",
"tsukuba.ibaraki.jp",
"uchihara.ibaraki.jp",
"ushiku.ibaraki.jp",
"yachiyo.ibaraki.jp",
"yamagata.ibaraki.jp",
"yawara.ibaraki.jp",
"yuki.ibaraki.jp",
"anamizu.ishikawa.jp",
"hakui.ishikawa.jp",
"hakusan.ishikawa.jp",
"kaga.ishikawa.jp",
"kahoku.ishikawa.jp",
"kanazawa.ishikawa.jp",
"kawakita.ishikawa.jp",
"komatsu.ishikawa.jp",
"nakanoto.ishikawa.jp",
"nanao.ishikawa.jp",
"nomi.ishikawa.jp",
"nonoichi.ishikawa.jp",
"noto.ishikawa.jp",
"shika.ishikawa.jp",
"suzu.ishikawa.jp",
"tsubata.ishikawa.jp",
"tsurugi.ishikawa.jp",
"uchinada.ishikawa.jp",
"wajima.ishikawa.jp",
"fudai.iwate.jp",
"fujisawa.iwate.jp",
"hanamaki.iwate.jp",
"hiraizumi.iwate.jp",
"hirono.iwate.jp",
"ichinohe.iwate.jp",
"ichinoseki.iwate.jp",
"iwaizumi.iwate.jp",
"iwate.iwate.jp",
"joboji.iwate.jp",
"kamaishi.iwate.jp",
"kanegasaki.iwate.jp",
"karumai.iwate.jp",
"kawai.iwate.jp",
"kitakami.iwate.jp",
"kuji.iwate.jp",
"kunohe.iwate.jp",
"kuzumaki.iwate.jp",
"miyako.iwate.jp",
"mizusawa.iwate.jp",
"morioka.iwate.jp",
"ninohe.iwate.jp",
"noda.iwate.jp",
"ofunato.iwate.jp",
"oshu.iwate.jp",
"otsuchi.iwate.jp",
"rikuzentakata.iwate.jp",
"shiwa.iwate.jp",
"shizukuishi.iwate.jp",
"sumita.iwate.jp",
"tanohata.iwate.jp",
"tono.iwate.jp",
"yahaba.iwate.jp",
"yamada.iwate.jp",
"ayagawa.kagawa.jp",
"higashikagawa.kagawa.jp",
"kanonji.kagawa.jp",
"kotohira.kagawa.jp",
"manno.kagawa.jp",
"marugame.kagawa.jp",
"mitoyo.kagawa.jp",
"naoshima.kagawa.jp",
"sanuki.kagawa.jp",
"tadotsu.kagawa.jp",
"takamatsu.kagawa.jp",
"tonosho.kagawa.jp",
"uchinomi.kagawa.jp",
"utazu.kagawa.jp",
"zentsuji.kagawa.jp",
"akune.kagoshima.jp",
"amami.kagoshima.jp",
"hioki.kagoshima.jp",
"isa.kagoshima.jp",
"isen.kagoshima.jp",
"izumi.kagoshima.jp",
"kagoshima.kagoshima.jp",
"kanoya.kagoshima.jp",
"kawanabe.kagoshima.jp",
"kinko.kagoshima.jp",
"kouyama.kagoshima.jp",
"makurazaki.kagoshima.jp",
"matsumoto.kagoshima.jp",
"minamitane.kagoshima.jp",
"nakatane.kagoshima.jp",
"nishinoomote.kagoshima.jp",
"satsumasendai.kagoshima.jp",
"soo.kagoshima.jp",
"tarumizu.kagoshima.jp",
"yusui.kagoshima.jp",
"aikawa.kanagawa.jp",
"atsugi.kanagawa.jp",
"ayase.kanagawa.jp",
"chigasaki.kanagawa.jp",
"ebina.kanagawa.jp",
"fujisawa.kanagawa.jp",
"hadano.kanagawa.jp",
"hakone.kanagawa.jp",
"hiratsuka.kanagawa.jp",
"isehara.kanagawa.jp",
"kaisei.kanagawa.jp",
"kamakura.kanagawa.jp",
"kiyokawa.kanagawa.jp",
"matsuda.kanagawa.jp",
"minamiashigara.kanagawa.jp",
"miura.kanagawa.jp",
"nakai.kanagawa.jp",
"ninomiya.kanagawa.jp",
"odawara.kanagawa.jp",
"oi.kanagawa.jp",
"oiso.kanagawa.jp",
"sagamihara.kanagawa.jp",
"samukawa.kanagawa.jp",
"tsukui.kanagawa.jp",
"yamakita.kanagawa.jp",
"yamato.kanagawa.jp",
"yokosuka.kanagawa.jp",
"yugawara.kanagawa.jp",
"zama.kanagawa.jp",
"zushi.kanagawa.jp",
"aki.kochi.jp",
"geisei.kochi.jp",
"hidaka.kochi.jp",
"higashitsuno.kochi.jp",
"ino.kochi.jp",
"kagami.kochi.jp",
"kami.kochi.jp",
"kitagawa.kochi.jp",
"kochi.kochi.jp",
"mihara.kochi.jp",
"motoyama.kochi.jp",
"muroto.kochi.jp",
"nahari.kochi.jp",
"nakamura.kochi.jp",
"nankoku.kochi.jp",
"nishitosa.kochi.jp",
"niyodogawa.kochi.jp",
"ochi.kochi.jp",
"okawa.kochi.jp",
"otoyo.kochi.jp",
"otsuki.kochi.jp",
"sakawa.kochi.jp",
"sukumo.kochi.jp",
"susaki.kochi.jp",
"tosa.kochi.jp",
"tosashimizu.kochi.jp",
"toyo.kochi.jp",
"tsuno.kochi.jp",
"umaji.kochi.jp",
"yasuda.kochi.jp",
"yusuhara.kochi.jp",
"amakusa.kumamoto.jp",
"arao.kumamoto.jp",
"aso.kumamoto.jp",
"choyo.kumamoto.jp",
"gyokuto.kumamoto.jp",
"kamiamakusa.kumamoto.jp",
"kikuchi.kumamoto.jp",
"kumamoto.kumamoto.jp",
"mashiki.kumamoto.jp",
"mifune.kumamoto.jp",
"minamata.kumamoto.jp",
"minamioguni.kumamoto.jp",
"nagasu.kumamoto.jp",
"nishihara.kumamoto.jp",
"oguni.kumamoto.jp",
"ozu.kumamoto.jp",
"sumoto.kumamoto.jp",
"takamori.kumamoto.jp",
"uki.kumamoto.jp",
"uto.kumamoto.jp",
"yamaga.kumamoto.jp",
"yamato.kumamoto.jp",
"yatsushiro.kumamoto.jp",
"ayabe.kyoto.jp",
"fukuchiyama.kyoto.jp",
"higashiyama.kyoto.jp",
"ide.kyoto.jp",
"ine.kyoto.jp",
"joyo.kyoto.jp",
"kameoka.kyoto.jp",
"kamo.kyoto.jp",
"kita.kyoto.jp",
"kizu.kyoto.jp",
"kumiyama.kyoto.jp",
"kyotamba.kyoto.jp",
"kyotanabe.kyoto.jp",
"kyotango.kyoto.jp",
"maizuru.kyoto.jp",
"minami.kyoto.jp",
"minamiyamashiro.kyoto.jp",
"miyazu.kyoto.jp",
"muko.kyoto.jp",
"nagaokakyo.kyoto.jp",
"nakagyo.kyoto.jp",
"nantan.kyoto.jp",
"oyamazaki.kyoto.jp",
"sakyo.kyoto.jp",
"seika.kyoto.jp",
"tanabe.kyoto.jp",
"uji.kyoto.jp",
"ujitawara.kyoto.jp",
"wazuka.kyoto.jp",
"yamashina.kyoto.jp",
"yawata.kyoto.jp",
"asahi.mie.jp",
"inabe.mie.jp",
"ise.mie.jp",
"kameyama.mie.jp",
"kawagoe.mie.jp",
"kiho.mie.jp",
"kisosaki.mie.jp",
"kiwa.mie.jp",
"komono.mie.jp",
"kumano.mie.jp",
"kuwana.mie.jp",
"matsusaka.mie.jp",
"meiwa.mie.jp",
"mihama.mie.jp",
"minamiise.mie.jp",
"misugi.mie.jp",
"miyama.mie.jp",
"nabari.mie.jp",
"shima.mie.jp",
"suzuka.mie.jp",
"tado.mie.jp",
"taiki.mie.jp",
"taki.mie.jp",
"tamaki.mie.jp",
"toba.mie.jp",
"tsu.mie.jp",
"udono.mie.jp",
"ureshino.mie.jp",
"watarai.mie.jp",
"yokkaichi.mie.jp",
"furukawa.miyagi.jp",
"higashimatsushima.miyagi.jp",
"ishinomaki.miyagi.jp",
"iwanuma.miyagi.jp",
"kakuda.miyagi.jp",
"kami.miyagi.jp",
"kawasaki.miyagi.jp",
"marumori.miyagi.jp",
"matsushima.miyagi.jp",
"minamisanriku.miyagi.jp",
"misato.miyagi.jp",
"murata.miyagi.jp",
"natori.miyagi.jp",
"ogawara.miyagi.jp",
"ohira.miyagi.jp",
"onagawa.miyagi.jp",
"osaki.miyagi.jp",
"rifu.miyagi.jp",
"semine.miyagi.jp",
"shibata.miyagi.jp",
"shichikashuku.miyagi.jp",
"shikama.miyagi.jp",
"shiogama.miyagi.jp",
"shiroishi.miyagi.jp",
"tagajo.miyagi.jp",
"taiwa.miyagi.jp",
"tome.miyagi.jp",
"tomiya.miyagi.jp",
"wakuya.miyagi.jp",
"watari.miyagi.jp",
"yamamoto.miyagi.jp",
"zao.miyagi.jp",
"aya.miyazaki.jp",
"ebino.miyazaki.jp",
"gokase.miyazaki.jp",
"hyuga.miyazaki.jp",
"kadogawa.miyazaki.jp",
"kawaminami.miyazaki.jp",
"kijo.miyazaki.jp",
"kitagawa.miyazaki.jp",
"kitakata.miyazaki.jp",
"kitaura.miyazaki.jp",
"kobayashi.miyazaki.jp",
"kunitomi.miyazaki.jp",
"kushima.miyazaki.jp",
"mimata.miyazaki.jp",
"miyakonojo.miyazaki.jp",
"miyazaki.miyazaki.jp",
"morotsuka.miyazaki.jp",
"nichinan.miyazaki.jp",
"nishimera.miyazaki.jp",
"nobeoka.miyazaki.jp",
"saito.miyazaki.jp",
"shiiba.miyazaki.jp",
"shintomi.miyazaki.jp",
"takaharu.miyazaki.jp",
"takanabe.miyazaki.jp",
"takazaki.miyazaki.jp",
"tsuno.miyazaki.jp",
"achi.nagano.jp",
"agematsu.nagano.jp",
"anan.nagano.jp",
"aoki.nagano.jp",
"asahi.nagano.jp",
"azumino.nagano.jp",
"chikuhoku.nagano.jp",
"chikuma.nagano.jp",
"chino.nagano.jp",
"fujimi.nagano.jp",
"hakuba.nagano.jp",
"hara.nagano.jp",
"hiraya.nagano.jp",
"iida.nagano.jp",
"iijima.nagano.jp",
"iiyama.nagano.jp",
"iizuna.nagano.jp",
"ikeda.nagano.jp",
"ikusaka.nagano.jp",
"ina.nagano.jp",
"karuizawa.nagano.jp",
"kawakami.nagano.jp",
"kiso.nagano.jp",
"kisofukushima.nagano.jp",
"kitaaiki.nagano.jp",
"komagane.nagano.jp",
"komoro.nagano.jp",
"matsukawa.nagano.jp",
"matsumoto.nagano.jp",
"miasa.nagano.jp",
"minamiaiki.nagano.jp",
"minamimaki.nagano.jp",
"minamiminowa.nagano.jp",
"minowa.nagano.jp",
"miyada.nagano.jp",
"miyota.nagano.jp",
"mochizuki.nagano.jp",
"nagano.nagano.jp",
"nagawa.nagano.jp",
"nagiso.nagano.jp",
"nakagawa.nagano.jp",
"nakano.nagano.jp",
"nozawaonsen.nagano.jp",
"obuse.nagano.jp",
"ogawa.nagano.jp",
"okaya.nagano.jp",
"omachi.nagano.jp",
"omi.nagano.jp",
"ookuwa.nagano.jp",
"ooshika.nagano.jp",
"otaki.nagano.jp",
"otari.nagano.jp",
"sakae.nagano.jp",
"sakaki.nagano.jp",
"saku.nagano.jp",
"sakuho.nagano.jp",
"shimosuwa.nagano.jp",
"shinanomachi.nagano.jp",
"shiojiri.nagano.jp",
"suwa.nagano.jp",
"suzaka.nagano.jp",
"takagi.nagano.jp",
"takamori.nagano.jp",
"takayama.nagano.jp",
"tateshina.nagano.jp",
"tatsuno.nagano.jp",
"togakushi.nagano.jp",
"togura.nagano.jp",
"tomi.nagano.jp",
"ueda.nagano.jp",
"wada.nagano.jp",
"yamagata.nagano.jp",
"yamanouchi.nagano.jp",
"yasaka.nagano.jp",
"yasuoka.nagano.jp",
"chijiwa.nagasaki.jp",
"futsu.nagasaki.jp",
"goto.nagasaki.jp",
"hasami.nagasaki.jp",
"hirado.nagasaki.jp",
"iki.nagasaki.jp",
"isahaya.nagasaki.jp",
"kawatana.nagasaki.jp",
"kuchinotsu.nagasaki.jp",
"matsuura.nagasaki.jp",
"nagasaki.nagasaki.jp",
"obama.nagasaki.jp",
"omura.nagasaki.jp",
"oseto.nagasaki.jp",
"saikai.nagasaki.jp",
"sasebo.nagasaki.jp",
"seihi.nagasaki.jp",
"shimabara.nagasaki.jp",
"shinkamigoto.nagasaki.jp",
"togitsu.nagasaki.jp",
"tsushima.nagasaki.jp",
"unzen.nagasaki.jp",
"ando.nara.jp",
"gose.nara.jp",
"heguri.nara.jp",
"higashiyoshino.nara.jp",
"ikaruga.nara.jp",
"ikoma.nara.jp",
"kamikitayama.nara.jp",
"kanmaki.nara.jp",
"kashiba.nara.jp",
"kashihara.nara.jp",
"katsuragi.nara.jp",
"kawai.nara.jp",
"kawakami.nara.jp",
"kawanishi.nara.jp",
"koryo.nara.jp",
"kurotaki.nara.jp",
"mitsue.nara.jp",
"miyake.nara.jp",
"nara.nara.jp",
"nosegawa.nara.jp",
"oji.nara.jp",
"ouda.nara.jp",
"oyodo.nara.jp",
"sakurai.nara.jp",
"sango.nara.jp",
"shimoichi.nara.jp",
"shimokitayama.nara.jp",
"shinjo.nara.jp",
"soni.nara.jp",
"takatori.nara.jp",
"tawaramoto.nara.jp",
"tenkawa.nara.jp",
"tenri.nara.jp",
"uda.nara.jp",
"yamatokoriyama.nara.jp",
"yamatotakada.nara.jp",
"yamazoe.nara.jp",
"yoshino.nara.jp",
"aga.niigata.jp",
"agano.niigata.jp",
"gosen.niigata.jp",
"itoigawa.niigata.jp",
"izumozaki.niigata.jp",
"joetsu.niigata.jp",
"kamo.niigata.jp",
"kariwa.niigata.jp",
"kashiwazaki.niigata.jp",
"minamiuonuma.niigata.jp",
"mitsuke.niigata.jp",
"muika.niigata.jp",
"murakami.niigata.jp",
"myoko.niigata.jp",
"nagaoka.niigata.jp",
"niigata.niigata.jp",
"ojiya.niigata.jp",
"omi.niigata.jp",
"sado.niigata.jp",
"sanjo.niigata.jp",
"seiro.niigata.jp",
"seirou.niigata.jp",
"sekikawa.niigata.jp",
"shibata.niigata.jp",
"tagami.niigata.jp",
"tainai.niigata.jp",
"tochio.niigata.jp",
"tokamachi.niigata.jp",
"tsubame.niigata.jp",
"tsunan.niigata.jp",
"uonuma.niigata.jp",
"yahiko.niigata.jp",
"yoita.niigata.jp",
"yuzawa.niigata.jp",
"beppu.oita.jp",
"bungoono.oita.jp",
"bungotakada.oita.jp",
"hasama.oita.jp",
"hiji.oita.jp",
"himeshima.oita.jp",
"hita.oita.jp",
"kamitsue.oita.jp",
"kokonoe.oita.jp",
"kuju.oita.jp",
"kunisaki.oita.jp",
"kusu.oita.jp",
"oita.oita.jp",
"saiki.oita.jp",
"taketa.oita.jp",
"tsukumi.oita.jp",
"usa.oita.jp",
"usuki.oita.jp",
"yufu.oita.jp",
"akaiwa.okayama.jp",
"asakuchi.okayama.jp",
"bizen.okayama.jp",
"hayashima.okayama.jp",
"ibara.okayama.jp",
"kagamino.okayama.jp",
"kasaoka.okayama.jp",
"kibichuo.okayama.jp",
"kumenan.okayama.jp",
"kurashiki.okayama.jp",
"maniwa.okayama.jp",
"misaki.okayama.jp",
"nagi.okayama.jp",
"niimi.okayama.jp",
"nishiawakura.okayama.jp",
"okayama.okayama.jp",
"satosho.okayama.jp",
"setouchi.okayama.jp",
"shinjo.okayama.jp",
"shoo.okayama.jp",
"soja.okayama.jp",
"takahashi.okayama.jp",
"tamano.okayama.jp",
"tsuyama.okayama.jp",
"wake.okayama.jp",
"yakage.okayama.jp",
"aguni.okinawa.jp",
"ginowan.okinawa.jp",
"ginoza.okinawa.jp",
"gushikami.okinawa.jp",
"haebaru.okinawa.jp",
"higashi.okinawa.jp",
"hirara.okinawa.jp",
"iheya.okinawa.jp",
"ishigaki.okinawa.jp",
"ishikawa.okinawa.jp",
"itoman.okinawa.jp",
"izena.okinawa.jp",
"kadena.okinawa.jp",
"kin.okinawa.jp",
"kitadaito.okinawa.jp",
"kitanakagusuku.okinawa.jp",
"kumejima.okinawa.jp",
"kunigami.okinawa.jp",
"minamidaito.okinawa.jp",
"motobu.okinawa.jp",
"nago.okinawa.jp",
"naha.okinawa.jp",
"nakagusuku.okinawa.jp",
"nakijin.okinawa.jp",
"nanjo.okinawa.jp",
"nishihara.okinawa.jp",
"ogimi.okinawa.jp",
"okinawa.okinawa.jp",
"onna.okinawa.jp",
"shimoji.okinawa.jp",
"taketomi.okinawa.jp",
"tarama.okinawa.jp",
"tokashiki.okinawa.jp",
"tomigusuku.okinawa.jp",
"tonaki.okinawa.jp",
"urasoe.okinawa.jp",
"uruma.okinawa.jp",
"yaese.okinawa.jp",
"yomitan.okinawa.jp",
"yonabaru.okinawa.jp",
"yonaguni.okinawa.jp",
"zamami.okinawa.jp",
"abeno.osaka.jp",
"chihayaakasaka.osaka.jp",
"chuo.osaka.jp",
"daito.osaka.jp",
"fujiidera.osaka.jp",
"habikino.osaka.jp",
"hannan.osaka.jp",
"higashiosaka.osaka.jp",
"higashisumiyoshi.osaka.jp",
"higashiyodogawa.osaka.jp",
"hirakata.osaka.jp",
"ibaraki.osaka.jp",
"ikeda.osaka.jp",
"izumi.osaka.jp",
"izumiotsu.osaka.jp",
"izumisano.osaka.jp",
"kadoma.osaka.jp",
"kaizuka.osaka.jp",
"kanan.osaka.jp",
"kashiwara.osaka.jp",
"katano.osaka.jp",
"kawachinagano.osaka.jp",
"kishiwada.osaka.jp",
"kita.osaka.jp",
"kumatori.osaka.jp",
"matsubara.osaka.jp",
"minato.osaka.jp",
"minoh.osaka.jp",
"misaki.osaka.jp",
"moriguchi.osaka.jp",
"neyagawa.osaka.jp",
"nishi.osaka.jp",
"nose.osaka.jp",
"osakasayama.osaka.jp",
"sakai.osaka.jp",
"sayama.osaka.jp",
"sennan.osaka.jp",
"settsu.osaka.jp",
"shijonawate.osaka.jp",
"shimamoto.osaka.jp",
"suita.osaka.jp",
"tadaoka.osaka.jp",
"taishi.osaka.jp",
"tajiri.osaka.jp",
"takaishi.osaka.jp",
"takatsuki.osaka.jp",
"tondabayashi.osaka.jp",
"toyonaka.osaka.jp",
"toyono.osaka.jp",
"yao.osaka.jp",
"ariake.saga.jp",
"arita.saga.jp",
"fukudomi.saga.jp",
"genkai.saga.jp",
"hamatama.saga.jp",
"hizen.saga.jp",
"imari.saga.jp",
"kamimine.saga.jp",
"kanzaki.saga.jp",
"karatsu.saga.jp",
"kashima.saga.jp",
"kitagata.saga.jp",
"kitahata.saga.jp",
"kiyama.saga.jp",
"kouhoku.saga.jp",
"kyuragi.saga.jp",
"nishiarita.saga.jp",
"ogi.saga.jp",
"omachi.saga.jp",
"ouchi.saga.jp",
"saga.saga.jp",
"shiroishi.saga.jp",
"taku.saga.jp",
"tara.saga.jp",
"tosu.saga.jp",
"yoshinogari.saga.jp",
"arakawa.saitama.jp",
"asaka.saitama.jp",
"chichibu.saitama.jp",
"fujimi.saitama.jp",
"fujimino.saitama.jp",
"fukaya.saitama.jp",
"hanno.saitama.jp",
"hanyu.saitama.jp",
"hasuda.saitama.jp",
"hatogaya.saitama.jp",
"hatoyama.saitama.jp",
"hidaka.saitama.jp",
"higashichichibu.saitama.jp",
"higashimatsuyama.saitama.jp",
"honjo.saitama.jp",
"ina.saitama.jp",
"iruma.saitama.jp",
"iwatsuki.saitama.jp",
"kamiizumi.saitama.jp",
"kamikawa.saitama.jp",
"kamisato.saitama.jp",
"kasukabe.saitama.jp",
"kawagoe.saitama.jp",
"kawaguchi.saitama.jp",
"kawajima.saitama.jp",
"kazo.saitama.jp",
"kitamoto.saitama.jp",
"koshigaya.saitama.jp",
"kounosu.saitama.jp",
"kuki.saitama.jp",
"kumagaya.saitama.jp",
"matsubushi.saitama.jp",
"minano.saitama.jp",
"misato.saitama.jp",
"miyashiro.saitama.jp",
"miyoshi.saitama.jp",
"moroyama.saitama.jp",
"nagatoro.saitama.jp",
"namegawa.saitama.jp",
"niiza.saitama.jp",
"ogano.saitama.jp",
"ogawa.saitama.jp",
"ogose.saitama.jp",
"okegawa.saitama.jp",
"omiya.saitama.jp",
"otaki.saitama.jp",
"ranzan.saitama.jp",
"ryokami.saitama.jp",
"saitama.saitama.jp",
"sakado.saitama.jp",
"satte.saitama.jp",
"sayama.saitama.jp",
"shiki.saitama.jp",
"shiraoka.saitama.jp",
"soka.saitama.jp",
"sugito.saitama.jp",
"toda.saitama.jp",
"tokigawa.saitama.jp",
"tokorozawa.saitama.jp",
"tsurugashima.saitama.jp",
"urawa.saitama.jp",
"warabi.saitama.jp",
"yashio.saitama.jp",
"yokoze.saitama.jp",
"yono.saitama.jp",
"yorii.saitama.jp",
"yoshida.saitama.jp",
"yoshikawa.saitama.jp",
"yoshimi.saitama.jp",
"aisho.shiga.jp",
"gamo.shiga.jp",
"higashiomi.shiga.jp",
"hikone.shiga.jp",
"koka.shiga.jp",
"konan.shiga.jp",
"kosei.shiga.jp",
"koto.shiga.jp",
"kusatsu.shiga.jp",
"maibara.shiga.jp",
"moriyama.shiga.jp",
"nagahama.shiga.jp",
"nishiazai.shiga.jp",
"notogawa.shiga.jp",
"omihachiman.shiga.jp",
"otsu.shiga.jp",
"ritto.shiga.jp",
"ryuoh.shiga.jp",
"takashima.shiga.jp",
"takatsuki.shiga.jp",
"torahime.shiga.jp",
"toyosato.shiga.jp",
"yasu.shiga.jp",
"akagi.shimane.jp",
"ama.shimane.jp",
"gotsu.shimane.jp",
"hamada.shimane.jp",
"higashiizumo.shimane.jp",
"hikawa.shimane.jp",
"hikimi.shimane.jp",
"izumo.shimane.jp",
"kakinoki.shimane.jp",
"masuda.shimane.jp",
"matsue.shimane.jp",
"misato.shimane.jp",
"nishinoshima.shimane.jp",
"ohda.shimane.jp",
"okinoshima.shimane.jp",
"okuizumo.shimane.jp",
"shimane.shimane.jp",
"tamayu.shimane.jp",
"tsuwano.shimane.jp",
"unnan.shimane.jp",
"yakumo.shimane.jp",
"yasugi.shimane.jp",
"yatsuka.shimane.jp",
"arai.shizuoka.jp",
"atami.shizuoka.jp",
"fuji.shizuoka.jp",
"fujieda.shizuoka.jp",
"fujikawa.shizuoka.jp",
"fujinomiya.shizuoka.jp",
"fukuroi.shizuoka.jp",
"gotemba.shizuoka.jp",
"haibara.shizuoka.jp",
"hamamatsu.shizuoka.jp",
"higashiizu.shizuoka.jp",
"ito.shizuoka.jp",
"iwata.shizuoka.jp",
"izu.shizuoka.jp",
"izunokuni.shizuoka.jp",
"kakegawa.shizuoka.jp",
"kannami.shizuoka.jp",
"kawanehon.shizuoka.jp",
"kawazu.shizuoka.jp",
"kikugawa.shizuoka.jp",
"kosai.shizuoka.jp",
"makinohara.shizuoka.jp",
"matsuzaki.shizuoka.jp",
"minamiizu.shizuoka.jp",
"mishima.shizuoka.jp",
"morimachi.shizuoka.jp",
"nishiizu.shizuoka.jp",
"numazu.shizuoka.jp",
"omaezaki.shizuoka.jp",
"shimada.shizuoka.jp",
"shimizu.shizuoka.jp",
"shimoda.shizuoka.jp",
"shizuoka.shizuoka.jp",
"susono.shizuoka.jp",
"yaizu.shizuoka.jp",
"yoshida.shizuoka.jp",
"ashikaga.tochigi.jp",
"bato.tochigi.jp",
"haga.tochigi.jp",
"ichikai.tochigi.jp",
"iwafune.tochigi.jp",
"kaminokawa.tochigi.jp",
"kanuma.tochigi.jp",
"karasuyama.tochigi.jp",
"kuroiso.tochigi.jp",
"mashiko.tochigi.jp",
"mibu.tochigi.jp",
"moka.tochigi.jp",
"motegi.tochigi.jp",
"nasu.tochigi.jp",
"nasushiobara.tochigi.jp",
"nikko.tochigi.jp",
"nishikata.tochigi.jp",
"nogi.tochigi.jp",
"ohira.tochigi.jp",
"ohtawara.tochigi.jp",
"oyama.tochigi.jp",
"sakura.tochigi.jp",
"sano.tochigi.jp",
"shimotsuke.tochigi.jp",
"shioya.tochigi.jp",
"takanezawa.tochigi.jp",
"tochigi.tochigi.jp",
"tsuga.tochigi.jp",
"ujiie.tochigi.jp",
"utsunomiya.tochigi.jp",
"yaita.tochigi.jp",
"aizumi.tokushima.jp",
"anan.tokushima.jp",
"ichiba.tokushima.jp",
"itano.tokushima.jp",
"kainan.tokushima.jp",
"komatsushima.tokushima.jp",
"matsushige.tokushima.jp",
"mima.tokushima.jp",
"minami.tokushima.jp",
"miyoshi.tokushima.jp",
"mugi.tokushima.jp",
"nakagawa.tokushima.jp",
"naruto.tokushima.jp",
"sanagochi.tokushima.jp",
"shishikui.tokushima.jp",
"tokushima.tokushima.jp",
"wajiki.tokushima.jp",
"adachi.tokyo.jp",
"akiruno.tokyo.jp",
"akishima.tokyo.jp",
"aogashima.tokyo.jp",
"arakawa.tokyo.jp",
"bunkyo.tokyo.jp",
"chiyoda.tokyo.jp",
"chofu.tokyo.jp",
"chuo.tokyo.jp",
"edogawa.tokyo.jp",
"fuchu.tokyo.jp",
"fussa.tokyo.jp",
"hachijo.tokyo.jp",
"hachioji.tokyo.jp",
"hamura.tokyo.jp",
"higashikurume.tokyo.jp",
"higashimurayama.tokyo.jp",
"higashiyamato.tokyo.jp",
"hino.tokyo.jp",
"hinode.tokyo.jp",
"hinohara.tokyo.jp",
"inagi.tokyo.jp",
"itabashi.tokyo.jp",
"katsushika.tokyo.jp",
"kita.tokyo.jp",
"kiyose.tokyo.jp",
"kodaira.tokyo.jp",
"koganei.tokyo.jp",
"kokubunji.tokyo.jp",
"komae.tokyo.jp",
"koto.tokyo.jp",
"kouzushima.tokyo.jp",
"kunitachi.tokyo.jp",
"machida.tokyo.jp",
"meguro.tokyo.jp",
"minato.tokyo.jp",
"mitaka.tokyo.jp",
"mizuho.tokyo.jp",
"musashimurayama.tokyo.jp",
"musashino.tokyo.jp",
"nakano.tokyo.jp",
"nerima.tokyo.jp",
"ogasawara.tokyo.jp",
"okutama.tokyo.jp",
"ome.tokyo.jp",
"oshima.tokyo.jp",
"ota.tokyo.jp",
"setagaya.tokyo.jp",
"shibuya.tokyo.jp",
"shinagawa.tokyo.jp",
"shinjuku.tokyo.jp",
"suginami.tokyo.jp",
"sumida.tokyo.jp",
"tachikawa.tokyo.jp",
"taito.tokyo.jp",
"tama.tokyo.jp",
"toshima.tokyo.jp",
"chizu.tottori.jp",
"hino.tottori.jp",
"kawahara.tottori.jp",
"koge.tottori.jp",
"kotoura.tottori.jp",
"misasa.tottori.jp",
"nanbu.tottori.jp",
"nichinan.tottori.jp",
"sakaiminato.tottori.jp",
"tottori.tottori.jp",
"wakasa.tottori.jp",
"yazu.tottori.jp",
"yonago.tottori.jp",
"asahi.toyama.jp",
"fuchu.toyama.jp",
"fukumitsu.toyama.jp",
"funahashi.toyama.jp",
"himi.toyama.jp",
"imizu.toyama.jp",
"inami.toyama.jp",
"johana.toyama.jp",
"kamiichi.toyama.jp",
"kurobe.toyama.jp",
"nakaniikawa.toyama.jp",
"namerikawa.toyama.jp",
"nanto.toyama.jp",
"nyuzen.toyama.jp",
"oyabe.toyama.jp",
"taira.toyama.jp",
"takaoka.toyama.jp",
"tateyama.toyama.jp",
"toga.toyama.jp",
"tonami.toyama.jp",
"toyama.toyama.jp",
"unazuki.toyama.jp",
"uozu.toyama.jp",
"yamada.toyama.jp",
"arida.wakayama.jp",
"aridagawa.wakayama.jp",
"gobo.wakayama.jp",
"hashimoto.wakayama.jp",
"hidaka.wakayama.jp",
"hirogawa.wakayama.jp",
"inami.wakayama.jp",
"iwade.wakayama.jp",
"kainan.wakayama.jp",
"kamitonda.wakayama.jp",
"katsuragi.wakayama.jp",
"kimino.wakayama.jp",
"kinokawa.wakayama.jp",
"kitayama.wakayama.jp",
"koya.wakayama.jp",
"koza.wakayama.jp",
"kozagawa.wakayama.jp",
"kudoyama.wakayama.jp",
"kushimoto.wakayama.jp",
"mihama.wakayama.jp",
"misato.wakayama.jp",
"nachikatsuura.wakayama.jp",
"shingu.wakayama.jp",
"shirahama.wakayama.jp",
"taiji.wakayama.jp",
"tanabe.wakayama.jp",
"wakayama.wakayama.jp",
"yuasa.wakayama.jp",
"yura.wakayama.jp",
"asahi.yamagata.jp",
"funagata.yamagata.jp",
"higashine.yamagata.jp",
"iide.yamagata.jp",
"kahoku.yamagata.jp",
"kaminoyama.yamagata.jp",
"kaneyama.yamagata.jp",
"kawanishi.yamagata.jp",
"mamurogawa.yamagata.jp",
"mikawa.yamagata.jp",
"murayama.yamagata.jp",
"nagai.yamagata.jp",
"nakayama.yamagata.jp",
"nanyo.yamagata.jp",
"nishikawa.yamagata.jp",
"obanazawa.yamagata.jp",
"oe.yamagata.jp",
"oguni.yamagata.jp",
"ohkura.yamagata.jp",
"oishida.yamagata.jp",
"sagae.yamagata.jp",
"sakata.yamagata.jp",
"sakegawa.yamagata.jp",
"shinjo.yamagata.jp",
"shirataka.yamagata.jp",
"shonai.yamagata.jp",
"takahata.yamagata.jp",
"tendo.yamagata.jp",
"tozawa.yamagata.jp",
"tsuruoka.yamagata.jp",
"yamagata.yamagata.jp",
"yamanobe.yamagata.jp",
"yonezawa.yamagata.jp",
"yuza.yamagata.jp",
"abu.yamaguchi.jp",
"hagi.yamaguchi.jp",
"hikari.yamaguchi.jp",
"hofu.yamaguchi.jp",
"iwakuni.yamaguchi.jp",
"kudamatsu.yamaguchi.jp",
"mitou.yamaguchi.jp",
"nagato.yamaguchi.jp",
"oshima.yamaguchi.jp",
"shimonoseki.yamaguchi.jp",
"shunan.yamaguchi.jp",
"tabuse.yamaguchi.jp",
"tokuyama.yamaguchi.jp",
"toyota.yamaguchi.jp",
"ube.yamaguchi.jp",
"yuu.yamaguchi.jp",
"chuo.yamanashi.jp",
"doshi.yamanashi.jp",
"fuefuki.yamanashi.jp",
"fujikawa.yamanashi.jp",
"fujikawaguchiko.yamanashi.jp",
"fujiyoshida.yamanashi.jp",
"hayakawa.yamanashi.jp",
"hokuto.yamanashi.jp",
"ichikawamisato.yamanashi.jp",
"kai.yamanashi.jp",
"kofu.yamanashi.jp",
"koshu.yamanashi.jp",
"kosuge.yamanashi.jp",
"minami-alps.yamanashi.jp",
"minobu.yamanashi.jp",
"nakamichi.yamanashi.jp",
"nanbu.yamanashi.jp",
"narusawa.yamanashi.jp",
"nirasaki.yamanashi.jp",
"nishikatsura.yamanashi.jp",
"oshino.yamanashi.jp",
"otsuki.yamanashi.jp",
"showa.yamanashi.jp",
"tabayama.yamanashi.jp",
"tsuru.yamanashi.jp",
"uenohara.yamanashi.jp",
"yamanakako.yamanashi.jp",
"yamanashi.yamanashi.jp",
"ke",
"ac.ke",
"co.ke",
"go.ke",
"info.ke",
"me.ke",
"mobi.ke",
"ne.ke",
"or.ke",
"sc.ke",
"kg",
"org.kg",
"net.kg",
"com.kg",
"edu.kg",
"gov.kg",
"mil.kg",
"*.kh",
"ki",
"edu.ki",
"biz.ki",
"net.ki",
"org.ki",
"gov.ki",
"info.ki",
"com.ki",
"km",
"org.km",
"nom.km",
"gov.km",
"prd.km",
"tm.km",
"edu.km",
"mil.km",
"ass.km",
"com.km",
"coop.km",
"asso.km",
"presse.km",
"medecin.km",
"notaires.km",
"pharmaciens.km",
"veterinaire.km",
"gouv.km",
"kn",
"net.kn",
"org.kn",
"edu.kn",
"gov.kn",
"kp",
"com.kp",
"edu.kp",
"gov.kp",
"org.kp",
"rep.kp",
"tra.kp",
"kr",
"ac.kr",
"co.kr",
"es.kr",
"go.kr",
"hs.kr",
"kg.kr",
"mil.kr",
"ms.kr",
"ne.kr",
"or.kr",
"pe.kr",
"re.kr",
"sc.kr",
"busan.kr",
"chungbuk.kr",
"chungnam.kr",
"daegu.kr",
"daejeon.kr",
"gangwon.kr",
"gwangju.kr",
"gyeongbuk.kr",
"gyeonggi.kr",
"gyeongnam.kr",
"incheon.kr",
"jeju.kr",
"jeonbuk.kr",
"jeonnam.kr",
"seoul.kr",
"ulsan.kr",
"kw",
"com.kw",
"edu.kw",
"emb.kw",
"gov.kw",
"ind.kw",
"net.kw",
"org.kw",
"ky",
"edu.ky",
"gov.ky",
"com.ky",
"org.ky",
"net.ky",
"kz",
"org.kz",
"edu.kz",
"net.kz",
"gov.kz",
"mil.kz",
"com.kz",
"la",
"int.la",
"net.la",
"info.la",
"edu.la",
"gov.la",
"per.la",
"com.la",
"org.la",
"lb",
"com.lb",
"edu.lb",
"gov.lb",
"net.lb",
"org.lb",
"lc",
"com.lc",
"net.lc",
"co.lc",
"org.lc",
"edu.lc",
"gov.lc",
"li",
"lk",
"gov.lk",
"sch.lk",
"net.lk",
"int.lk",
"com.lk",
"org.lk",
"edu.lk",
"ngo.lk",
"soc.lk",
"web.lk",
"ltd.lk",
"assn.lk",
"grp.lk",
"hotel.lk",
"ac.lk",
"lr",
"com.lr",
"edu.lr",
"gov.lr",
"org.lr",
"net.lr",
"ls",
"ac.ls",
"biz.ls",
"co.ls",
"edu.ls",
"gov.ls",
"info.ls",
"net.ls",
"org.ls",
"sc.ls",
"lt",
"gov.lt",
"lu",
"lv",
"com.lv",
"edu.lv",
"gov.lv",
"org.lv",
"mil.lv",
"id.lv",
"net.lv",
"asn.lv",
"conf.lv",
"ly",
"com.ly",
"net.ly",
"gov.ly",
"plc.ly",
"edu.ly",
"sch.ly",
"med.ly",
"org.ly",
"id.ly",
"ma",
"co.ma",
"net.ma",
"gov.ma",
"org.ma",
"ac.ma",
"press.ma",
"mc",
"tm.mc",
"asso.mc",
"md",
"me",
"co.me",
"net.me",
"org.me",
"edu.me",
"ac.me",
"gov.me",
"its.me",
"priv.me",
"mg",
"org.mg",
"nom.mg",
"gov.mg",
"prd.mg",
"tm.mg",
"edu.mg",
"mil.mg",
"com.mg",
"co.mg",
"mh",
"mil",
"mk",
"com.mk",
"org.mk",
"net.mk",
"edu.mk",
"gov.mk",
"inf.mk",
"name.mk",
"ml",
"com.ml",
"edu.ml",
"gouv.ml",
"gov.ml",
"net.ml",
"org.ml",
"presse.ml",
"*.mm",
"mn",
"gov.mn",
"edu.mn",
"org.mn",
"mo",
"com.mo",
"net.mo",
"org.mo",
"edu.mo",
"gov.mo",
"mobi",
"mp",
"mq",
"mr",
"gov.mr",
"ms",
"com.ms",
"edu.ms",
"gov.ms",
"net.ms",
"org.ms",
"mt",
"com.mt",
"edu.mt",
"net.mt",
"org.mt",
"mu",
"com.mu",
"net.mu",
"org.mu",
"gov.mu",
"ac.mu",
"co.mu",
"or.mu",
"museum",
"academy.museum",
"agriculture.museum",
"air.museum",
"airguard.museum",
"alabama.museum",
"alaska.museum",
"amber.museum",
"ambulance.museum",
"american.museum",
"americana.museum",
"americanantiques.museum",
"americanart.museum",
"amsterdam.museum",
"and.museum",
"annefrank.museum",
"anthro.museum",
"anthropology.museum",
"antiques.museum",
"aquarium.museum",
"arboretum.museum",
"archaeological.museum",
"archaeology.museum",
"architecture.museum",
"art.museum",
"artanddesign.museum",
"artcenter.museum",
"artdeco.museum",
"arteducation.museum",
"artgallery.museum",
"arts.museum",
"artsandcrafts.museum",
"asmatart.museum",
"assassination.museum",
"assisi.museum",
"association.museum",
"astronomy.museum",
"atlanta.museum",
"austin.museum",
"australia.museum",
"automotive.museum",
"aviation.museum",
"axis.museum",
"badajoz.museum",
"baghdad.museum",
"bahn.museum",
"bale.museum",
"baltimore.museum",
"barcelona.museum",
"baseball.museum",
"basel.museum",
"baths.museum",
"bauern.museum",
"beauxarts.museum",
"beeldengeluid.museum",
"bellevue.museum",
"bergbau.museum",
"berkeley.museum",
"berlin.museum",
"bern.museum",
"bible.museum",
"bilbao.museum",
"bill.museum",
"birdart.museum",
"birthplace.museum",
"bonn.museum",
"boston.museum",
"botanical.museum",
"botanicalgarden.museum",
"botanicgarden.museum",
"botany.museum",
"brandywinevalley.museum",
"brasil.museum",
"bristol.museum",
"british.museum",
"britishcolumbia.museum",
"broadcast.museum",
"brunel.museum",
"brussel.museum",
"brussels.museum",
"bruxelles.museum",
"building.museum",
"burghof.museum",
"bus.museum",
"bushey.museum",
"cadaques.museum",
"california.museum",
"cambridge.museum",
"can.museum",
"canada.museum",
"capebreton.museum",
"carrier.museum",
"cartoonart.museum",
"casadelamoneda.museum",
"castle.museum",
"castres.museum",
"celtic.museum",
"center.museum",
"chattanooga.museum",
"cheltenham.museum",
"chesapeakebay.museum",
"chicago.museum",
"children.museum",
"childrens.museum",
"childrensgarden.museum",
"chiropractic.museum",
"chocolate.museum",
"christiansburg.museum",
"cincinnati.museum",
"cinema.museum",
"circus.museum",
"civilisation.museum",
"civilization.museum",
"civilwar.museum",
"clinton.museum",
"clock.museum",
"coal.museum",
"coastaldefence.museum",
"cody.museum",
"coldwar.museum",
"collection.museum",
"colonialwilliamsburg.museum",
"coloradoplateau.museum",
"columbia.museum",
"columbus.museum",
"communication.museum",
"communications.museum",
"community.museum",
"computer.museum",
"computerhistory.museum",
"comunicaÃ§Ãµes.museum",
"contemporary.museum",
"contemporaryart.museum",
"convent.museum",
"copenhagen.museum",
"corporation.museum",
"correios-e-telecomunicaÃ§Ãµes.museum",
"corvette.museum",
"costume.museum",
"countryestate.museum",
"county.museum",
"crafts.museum",
"cranbrook.museum",
"creation.museum",
"cultural.museum",
"culturalcenter.museum",
"culture.museum",
"cyber.museum",
"cymru.museum",
"dali.museum",
"dallas.museum",
"database.museum",
"ddr.museum",
"decorativearts.museum",
"delaware.museum",
"delmenhorst.museum",
"denmark.museum",
"depot.museum",
"design.museum",
"detroit.museum",
"dinosaur.museum",
"discovery.museum",
"dolls.museum",
"donostia.museum",
"durham.museum",
"eastafrica.museum",
"eastcoast.museum",
"education.museum",
"educational.museum",
"egyptian.museum",
"eisenbahn.museum",
"elburg.museum",
"elvendrell.museum",
"embroidery.museum",
"encyclopedic.museum",
"england.museum",
"entomology.museum",
"environment.museum",
"environmentalconservation.museum",
"epilepsy.museum",
"essex.museum",
"estate.museum",
"ethnology.museum",
"exeter.museum",
"exhibition.museum",
"family.museum",
"farm.museum",
"farmequipment.museum",
"farmers.museum",
"farmstead.museum",
"field.museum",
"figueres.museum",
"filatelia.museum",
"film.museum",
"fineart.museum",
"finearts.museum",
"finland.museum",
"flanders.museum",
"florida.museum",
"force.museum",
"fortmissoula.museum",
"fortworth.museum",
"foundation.museum",
"francaise.museum",
"frankfurt.museum",
"franziskaner.museum",
"freemasonry.museum",
"freiburg.museum",
"fribourg.museum",
"frog.museum",
"fundacio.museum",
"furniture.museum",
"gallery.museum",
"garden.museum",
"gateway.museum",
"geelvinck.museum",
"gemological.museum",
"geology.museum",
"georgia.museum",
"giessen.museum",
"glas.museum",
"glass.museum",
"gorge.museum",
"grandrapids.museum",
"graz.museum",
"guernsey.museum",
"halloffame.museum",
"hamburg.museum",
"handson.museum",
"harvestcelebration.museum",
"hawaii.museum",
"health.museum",
"heimatunduhren.museum",
"hellas.museum",
"helsinki.museum",
"hembygdsforbund.museum",
"heritage.museum",
"histoire.museum",
"historical.museum",
"historicalsociety.museum",
"historichouses.museum",
"historisch.museum",
"historisches.museum",
"history.museum",
"historyofscience.museum",
"horology.museum",
"house.museum",
"humanities.museum",
"illustration.museum",
"imageandsound.museum",
"indian.museum",
"indiana.museum",
"indianapolis.museum",
"indianmarket.museum",
"intelligence.museum",
"interactive.museum",
"iraq.museum",
"iron.museum",
"isleofman.museum",
"jamison.museum",
"jefferson.museum",
"jerusalem.museum",
"jewelry.museum",
"jewish.museum",
"jewishart.museum",
"jfk.museum",
"journalism.museum",
"judaica.museum",
"judygarland.museum",
"juedisches.museum",
"juif.museum",
"karate.museum",
"karikatur.museum",
"kids.museum",
"koebenhavn.museum",
"koeln.museum",
"kunst.museum",
"kunstsammlung.museum",
"kunstunddesign.museum",
"labor.museum",
"labour.museum",
"lajolla.museum",
"lancashire.museum",
"landes.museum",
"lans.museum",
"lÃ¤ns.museum",
"larsson.museum",
"lewismiller.museum",
"lincoln.museum",
"linz.museum",
"living.museum",
"livinghistory.museum",
"localhistory.museum",
"london.museum",
"losangeles.museum",
"louvre.museum",
"loyalist.museum",
"lucerne.museum",
"luxembourg.museum",
"luzern.museum",
"mad.museum",
"madrid.museum",
"mallorca.museum",
"manchester.museum",
"mansion.museum",
"mansions.museum",
"manx.museum",
"marburg.museum",
"maritime.museum",
"maritimo.museum",
"maryland.museum",
"marylhurst.museum",
"media.museum",
"medical.museum",
"medizinhistorisches.museum",
"meeres.museum",
"memorial.museum",
"mesaverde.museum",
"michigan.museum",
"midatlantic.museum",
"military.museum",
"mill.museum",
"miners.museum",
"mining.museum",
"minnesota.museum",
"missile.museum",
"missoula.museum",
"modern.museum",
"moma.museum",
"money.museum",
"monmouth.museum",
"monticello.museum",
"montreal.museum",
"moscow.museum",
"motorcycle.museum",
"muenchen.museum",
"muenster.museum",
"mulhouse.museum",
"muncie.museum",
"museet.museum",
"museumcenter.museum",
"museumvereniging.museum",
"music.museum",
"national.museum",
"nationalfirearms.museum",
"nationalheritage.museum",
"nativeamerican.museum",
"naturalhistory.museum",
"naturalhistorymuseum.museum",
"naturalsciences.museum",
"nature.museum",
"naturhistorisches.museum",
"natuurwetenschappen.museum",
"naumburg.museum",
"naval.museum",
"nebraska.museum",
"neues.museum",
"newhampshire.museum",
"newjersey.museum",
"newmexico.museum",
"newport.museum",
"newspaper.museum",
"newyork.museum",
"niepce.museum",
"norfolk.museum",
"north.museum",
"nrw.museum",
"nyc.museum",
"nyny.museum",
"oceanographic.museum",
"oceanographique.museum",
"omaha.museum",
"online.museum",
"ontario.museum",
"openair.museum",
"oregon.museum",
"oregontrail.museum",
"otago.museum",
"oxford.museum",
"pacific.museum",
"paderborn.museum",
"palace.museum",
"paleo.museum",
"palmsprings.museum",
"panama.museum",
"paris.museum",
"pasadena.museum",
"pharmacy.museum",
"philadelphia.museum",
"philadelphiaarea.museum",
"philately.museum",
"phoenix.museum",
"photography.museum",
"pilots.museum",
"pittsburgh.museum",
"planetarium.museum",
"plantation.museum",
"plants.museum",
"plaza.museum",
"portal.museum",
"portland.museum",
"portlligat.museum",
"posts-and-telecommunications.museum",
"preservation.museum",
"presidio.museum",
"press.museum",
"project.museum",
"public.museum",
"pubol.museum",
"quebec.museum",
"railroad.museum",
"railway.museum",
"research.museum",
"resistance.museum",
"riodejaneiro.museum",
"rochester.museum",
"rockart.museum",
"roma.museum",
"russia.museum",
"saintlouis.museum",
"salem.museum",
"salvadordali.museum",
"salzburg.museum",
"sandiego.museum",
"sanfrancisco.museum",
"santabarbara.museum",
"santacruz.museum",
"santafe.museum",
"saskatchewan.museum",
"satx.museum",
"savannahga.museum",
"schlesisches.museum",
"schoenbrunn.museum",
"schokoladen.museum",
"school.museum",
"schweiz.museum",
"science.museum",
"scienceandhistory.museum",
"scienceandindustry.museum",
"sciencecenter.museum",
"sciencecenters.museum",
"science-fiction.museum",
"sciencehistory.museum",
"sciences.museum",
"sciencesnaturelles.museum",
"scotland.museum",
"seaport.museum",
"settlement.museum",
"settlers.museum",
"shell.museum",
"sherbrooke.museum",
"sibenik.museum",
"silk.museum",
"ski.museum",
"skole.museum",
"society.museum",
"sologne.museum",
"soundandvision.museum",
"southcarolina.museum",
"southwest.museum",
"space.museum",
"spy.museum",
"square.museum",
"stadt.museum",
"stalbans.museum",
"starnberg.museum",
"state.museum",
"stateofdelaware.museum",
"station.museum",
"steam.museum",
"steiermark.museum",
"stjohn.museum",
"stockholm.museum",
"stpetersburg.museum",
"stuttgart.museum",
"suisse.museum",
"surgeonshall.museum",
"surrey.museum",
"svizzera.museum",
"sweden.museum",
"sydney.museum",
"tank.museum",
"tcm.museum",
"technology.museum",
"telekommunikation.museum",
"television.museum",
"texas.museum",
"textile.museum",
"theater.museum",
"time.museum",
"timekeeping.museum",
"topology.museum",
"torino.museum",
"touch.museum",
"town.museum",
"transport.museum",
"tree.museum",
"trolley.museum",
"trust.museum",
"trustee.museum",
"uhren.museum",
"ulm.museum",
"undersea.museum",
"university.museum",
"usa.museum",
"usantiques.museum",
"usarts.museum",
"uscountryestate.museum",
"usculture.museum",
"usdecorativearts.museum",
"usgarden.museum",
"ushistory.museum",
"ushuaia.museum",
"uslivinghistory.museum",
"utah.museum",
"uvic.museum",
"valley.museum",
"vantaa.museum",
"versailles.museum",
"viking.museum",
"village.museum",
"virginia.museum",
"virtual.museum",
"virtuel.museum",
"vlaanderen.museum",
"volkenkunde.museum",
"wales.museum",
"wallonie.museum",
"war.museum",
"washingtondc.museum",
"watchandclock.museum",
"watch-and-clock.museum",
"western.museum",
"westfalen.museum",
"whaling.museum",
"wildlife.museum",
"williamsburg.museum",
"windmill.museum",
"workshop.museum",
"york.museum",
"yorkshire.museum",
"yosemite.museum",
"youth.museum",
"zoological.museum",
"zoology.museum",
"×™×¨×•×©×œ×™×�.museum",
"Ð¸ÐºÐ¾Ð¼.museum",
"mv",
"aero.mv",
"biz.mv",
"com.mv",
"coop.mv",
"edu.mv",
"gov.mv",
"info.mv",
"int.mv",
"mil.mv",
"museum.mv",
"name.mv",
"net.mv",
"org.mv",
"pro.mv",
"mw",
"ac.mw",
"biz.mw",
"co.mw",
"com.mw",
"coop.mw",
"edu.mw",
"gov.mw",
"int.mw",
"museum.mw",
"net.mw",
"org.mw",
"mx",
"com.mx",
"org.mx",
"gob.mx",
"edu.mx",
"net.mx",
"my",
"com.my",
"net.my",
"org.my",
"gov.my",
"edu.my",
"mil.my",
"name.my",
"mz",
"ac.mz",
"adv.mz",
"co.mz",
"edu.mz",
"gov.mz",
"mil.mz",
"net.mz",
"org.mz",
"na",
"info.na",
"pro.na",
"name.na",
"school.na",
"or.na",
"dr.na",
"us.na",
"mx.na",
"ca.na",
"in.na",
"cc.na",
"tv.na",
"ws.na",
"mobi.na",
"co.na",
"com.na",
"org.na",
"name",
"nc",
"asso.nc",
"nom.nc",
"ne",
"net",
"nf",
"com.nf",
"net.nf",
"per.nf",
"rec.nf",
"web.nf",
"arts.nf",
"firm.nf",
"info.nf",
"other.nf",
"store.nf",
"ng",
"com.ng",
"edu.ng",
"gov.ng",
"i.ng",
"mil.ng",
"mobi.ng",
"name.ng",
"net.ng",
"org.ng",
"sch.ng",
"ni",
"ac.ni",
"biz.ni",
"co.ni",
"com.ni",
"edu.ni",
"gob.ni",
"in.ni",
"info.ni",
"int.ni",
"mil.ni",
"net.ni",
"nom.ni",
"org.ni",
"web.ni",
"nl",
"no",
"fhs.no",
"vgs.no",
"fylkesbibl.no",
"folkebibl.no",
"museum.no",
"idrett.no",
"priv.no",
"mil.no",
"stat.no",
"dep.no",
"kommune.no",
"herad.no",
"aa.no",
"ah.no",
"bu.no",
"fm.no",
"hl.no",
"hm.no",
"jan-mayen.no",
"mr.no",
"nl.no",
"nt.no",
"of.no",
"ol.no",
"oslo.no",
"rl.no",
"sf.no",
"st.no",
"svalbard.no",
"tm.no",
"tr.no",
"va.no",
"vf.no",
"gs.aa.no",
"gs.ah.no",
"gs.bu.no",
"gs.fm.no",
"gs.hl.no",
"gs.hm.no",
"gs.jan-mayen.no",
"gs.mr.no",
"gs.nl.no",
"gs.nt.no",
"gs.of.no",
"gs.ol.no",
"gs.oslo.no",
"gs.rl.no",
"gs.sf.no",
"gs.st.no",
"gs.svalbard.no",
"gs.tm.no",
"gs.tr.no",
"gs.va.no",
"gs.vf.no",
"akrehamn.no",
"Ã¥krehamn.no",
"algard.no",
"Ã¥lgÃ¥rd.no",
"arna.no",
"brumunddal.no",
"bryne.no",
"bronnoysund.no",
"brÃ¸nnÃ¸ysund.no",
"drobak.no",
"drÃ¸bak.no",
"egersund.no",
"fetsund.no",
"floro.no",
"florÃ¸.no",
"fredrikstad.no",
"hokksund.no",
"honefoss.no",
"hÃ¸nefoss.no",
"jessheim.no",
"jorpeland.no",
"jÃ¸rpeland.no",
"kirkenes.no",
"kopervik.no",
"krokstadelva.no",
"langevag.no",
"langevÃ¥g.no",
"leirvik.no",
"mjondalen.no",
"mjÃ¸ndalen.no",
"mo-i-rana.no",
"mosjoen.no",
"mosjÃ¸en.no",
"nesoddtangen.no",
"orkanger.no",
"osoyro.no",
"osÃ¸yro.no",
"raholt.no",
"rÃ¥holt.no",
"sandnessjoen.no",
"sandnessjÃ¸en.no",
"skedsmokorset.no",
"slattum.no",
"spjelkavik.no",
"stathelle.no",
"stavern.no",
"stjordalshalsen.no",
"stjÃ¸rdalshalsen.no",
"tananger.no",
"tranby.no",
"vossevangen.no",
"afjord.no",
"Ã¥fjord.no",
"agdenes.no",
"al.no",
"Ã¥l.no",
"alesund.no",
"Ã¥lesund.no",
"alstahaug.no",
"alta.no",
"Ã¡ltÃ¡.no",
"alaheadju.no",
"Ã¡laheadju.no",
"alvdal.no",
"amli.no",
"Ã¥mli.no",
"amot.no",
"Ã¥mot.no",
"andebu.no",
"andoy.no",
"andÃ¸y.no",
"andasuolo.no",
"ardal.no",
"Ã¥rdal.no",
"aremark.no",
"arendal.no",
"Ã¥s.no",
"aseral.no",
"Ã¥seral.no",
"asker.no",
"askim.no",
"askvoll.no",
"askoy.no",
"askÃ¸y.no",
"asnes.no",
"Ã¥snes.no",
"audnedaln.no",
"aukra.no",
"aure.no",
"aurland.no",
"aurskog-holand.no",
"aurskog-hÃ¸land.no",
"austevoll.no",
"austrheim.no",
"averoy.no",
"averÃ¸y.no",
"balestrand.no",
"ballangen.no",
"balat.no",
"bÃ¡lÃ¡t.no",
"balsfjord.no",
"bahccavuotna.no",
"bÃ¡hccavuotna.no",
"bamble.no",
"bardu.no",
"beardu.no",
"beiarn.no",
"bajddar.no",
"bÃ¡jddar.no",
"baidar.no",
"bÃ¡idÃ¡r.no",
"berg.no",
"bergen.no",
"berlevag.no",
"berlevÃ¥g.no",
"bearalvahki.no",
"bearalvÃ¡hki.no",
"bindal.no",
"birkenes.no",
"bjarkoy.no",
"bjarkÃ¸y.no",
"bjerkreim.no",
"bjugn.no",
"bodo.no",
"bodÃ¸.no",
"badaddja.no",
"bÃ¥dÃ¥ddjÃ¥.no",
"budejju.no",
"bokn.no",
"bremanger.no",
"bronnoy.no",
"brÃ¸nnÃ¸y.no",
"bygland.no",
"bykle.no",
"barum.no",
"bÃ¦rum.no",
"bo.telemark.no",
"bÃ¸.telemark.no",
"bo.nordland.no",
"bÃ¸.nordland.no",
"bievat.no",
"bievÃ¡t.no",
"bomlo.no",
"bÃ¸mlo.no",
"batsfjord.no",
"bÃ¥tsfjord.no",
"bahcavuotna.no",
"bÃ¡hcavuotna.no",
"dovre.no",
"drammen.no",
"drangedal.no",
"dyroy.no",
"dyrÃ¸y.no",
"donna.no",
"dÃ¸nna.no",
"eid.no",
"eidfjord.no",
"eidsberg.no",
"eidskog.no",
"eidsvoll.no",
"eigersund.no",
"elverum.no",
"enebakk.no",
"engerdal.no",
"etne.no",
"etnedal.no",
"evenes.no",
"evenassi.no",
"evenÃ¡Å¡Å¡i.no",
"evje-og-hornnes.no",
"farsund.no",
"fauske.no",
"fuossko.no",
"fuoisku.no",
"fedje.no",
"fet.no",
"finnoy.no",
"finnÃ¸y.no",
"fitjar.no",
"fjaler.no",
"fjell.no",
"flakstad.no",
"flatanger.no",
"flekkefjord.no",
"flesberg.no",
"flora.no",
"fla.no",
"flÃ¥.no",
"folldal.no",
"forsand.no",
"fosnes.no",
"frei.no",
"frogn.no",
"froland.no",
"frosta.no",
"frana.no",
"frÃ¦na.no",
"froya.no",
"frÃ¸ya.no",
"fusa.no",
"fyresdal.no",
"forde.no",
"fÃ¸rde.no",
"gamvik.no",
"gangaviika.no",
"gÃ¡Å‹gaviika.no",
"gaular.no",
"gausdal.no",
"gildeskal.no",
"gildeskÃ¥l.no",
"giske.no",
"gjemnes.no",
"gjerdrum.no",
"gjerstad.no",
"gjesdal.no",
"gjovik.no",
"gjÃ¸vik.no",
"gloppen.no",
"gol.no",
"gran.no",
"grane.no",
"granvin.no",
"gratangen.no",
"grimstad.no",
"grong.no",
"kraanghke.no",
"krÃ¥anghke.no",
"grue.no",
"gulen.no",
"hadsel.no",
"halden.no",
"halsa.no",
"hamar.no",
"hamaroy.no",
"habmer.no",
"hÃ¡bmer.no",
"hapmir.no",
"hÃ¡pmir.no",
"hammerfest.no",
"hammarfeasta.no",
"hÃ¡mmÃ¡rfeasta.no",
"haram.no",
"hareid.no",
"harstad.no",
"hasvik.no",
"aknoluokta.no",
"Ã¡kÅ‹oluokta.no",
"hattfjelldal.no",
"aarborte.no",
"haugesund.no",
"hemne.no",
"hemnes.no",
"hemsedal.no",
"heroy.more-og-romsdal.no",
"herÃ¸y.mÃ¸re-og-romsdal.no",
"heroy.nordland.no",
"herÃ¸y.nordland.no",
"hitra.no",
"hjartdal.no",
"hjelmeland.no",
"hobol.no",
"hobÃ¸l.no",
"hof.no",
"hol.no",
"hole.no",
"holmestrand.no",
"holtalen.no",
"holtÃ¥len.no",
"hornindal.no",
"horten.no",
"hurdal.no",
"hurum.no",
"hvaler.no",
"hyllestad.no",
"hagebostad.no",
"hÃ¦gebostad.no",
"hoyanger.no",
"hÃ¸yanger.no",
"hoylandet.no",
"hÃ¸ylandet.no",
"ha.no",
"hÃ¥.no",
"ibestad.no",
"inderoy.no",
"inderÃ¸y.no",
"iveland.no",
"jevnaker.no",
"jondal.no",
"jolster.no",
"jÃ¸lster.no",
"karasjok.no",
"karasjohka.no",
"kÃ¡rÃ¡Å¡johka.no",
"karlsoy.no",
"galsa.no",
"gÃ¡lsÃ¡.no",
"karmoy.no",
"karmÃ¸y.no",
"kautokeino.no",
"guovdageaidnu.no",
"klepp.no",
"klabu.no",
"klÃ¦bu.no",
"kongsberg.no",
"kongsvinger.no",
"kragero.no",
"kragerÃ¸.no",
"kristiansand.no",
"kristiansund.no",
"krodsherad.no",
"krÃ¸dsherad.no",
"kvalsund.no",
"rahkkeravju.no",
"rÃ¡hkkerÃ¡vju.no",
"kvam.no",
"kvinesdal.no",
"kvinnherad.no",
"kviteseid.no",
"kvitsoy.no",
"kvitsÃ¸y.no",
"kvafjord.no",
"kvÃ¦fjord.no",
"giehtavuoatna.no",
"kvanangen.no",
"kvÃ¦nangen.no",
"navuotna.no",
"nÃ¡vuotna.no",
"kafjord.no",
"kÃ¥fjord.no",
"gaivuotna.no",
"gÃ¡ivuotna.no",
"larvik.no",
"lavangen.no",
"lavagis.no",
"loabat.no",
"loabÃ¡t.no",
"lebesby.no",
"davvesiida.no",
"leikanger.no",
"leirfjord.no",
"leka.no",
"leksvik.no",
"lenvik.no",
"leangaviika.no",
"leaÅ‹gaviika.no",
"lesja.no",
"levanger.no",
"lier.no",
"lierne.no",
"lillehammer.no",
"lillesand.no",
"lindesnes.no",
"lindas.no",
"lindÃ¥s.no",
"lom.no",
"loppa.no",
"lahppi.no",
"lÃ¡hppi.no",
"lund.no",
"lunner.no",
"luroy.no",
"lurÃ¸y.no",
"luster.no",
"lyngdal.no",
"lyngen.no",
"ivgu.no",
"lardal.no",
"lerdal.no",
"lÃ¦rdal.no",
"lodingen.no",
"lÃ¸dingen.no",
"lorenskog.no",
"lÃ¸renskog.no",
"loten.no",
"lÃ¸ten.no",
"malvik.no",
"masoy.no",
"mÃ¥sÃ¸y.no",
"muosat.no",
"muosÃ¡t.no",
"mandal.no",
"marker.no",
"marnardal.no",
"masfjorden.no",
"meland.no",
"meldal.no",
"melhus.no",
"meloy.no",
"melÃ¸y.no",
"meraker.no",
"merÃ¥ker.no",
"moareke.no",
"moÃ¥reke.no",
"midsund.no",
"midtre-gauldal.no",
"modalen.no",
"modum.no",
"molde.no",
"moskenes.no",
"moss.no",
"mosvik.no",
"malselv.no",
"mÃ¥lselv.no",
"malatvuopmi.no",
"mÃ¡latvuopmi.no",
"namdalseid.no",
"aejrie.no",
"namsos.no",
"namsskogan.no",
"naamesjevuemie.no",
"nÃ¥Ã¥mesjevuemie.no",
"laakesvuemie.no",
"nannestad.no",
"narvik.no",
"narviika.no",
"naustdal.no",
"nedre-eiker.no",
"nes.akershus.no",
"nes.buskerud.no",
"nesna.no",
"nesodden.no",
"nesseby.no",
"unjarga.no",
"unjÃ¡rga.no",
"nesset.no",
"nissedal.no",
"nittedal.no",
"nord-aurdal.no",
"nord-fron.no",
"nord-odal.no",
"norddal.no",
"nordkapp.no",
"davvenjarga.no",
"davvenjÃ¡rga.no",
"nordre-land.no",
"nordreisa.no",
"raisa.no",
"rÃ¡isa.no",
"nore-og-uvdal.no",
"notodden.no",
"naroy.no",
"nÃ¦rÃ¸y.no",
"notteroy.no",
"nÃ¸tterÃ¸y.no",
"odda.no",
"oksnes.no",
"Ã¸ksnes.no",
"oppdal.no",
"oppegard.no",
"oppegÃ¥rd.no",
"orkdal.no",
"orland.no",
"Ã¸rland.no",
"orskog.no",
"Ã¸rskog.no",
"orsta.no",
"Ã¸rsta.no",
"os.hedmark.no",
"os.hordaland.no",
"osen.no",
"osteroy.no",
"osterÃ¸y.no",
"ostre-toten.no",
"Ã¸stre-toten.no",
"overhalla.no",
"ovre-eiker.no",
"Ã¸vre-eiker.no",
"oyer.no",
"Ã¸yer.no",
"oygarden.no",
"Ã¸ygarden.no",
"oystre-slidre.no",
"Ã¸ystre-slidre.no",
"porsanger.no",
"porsangu.no",
"porsÃ¡Å‹gu.no",
"porsgrunn.no",
"radoy.no",
"radÃ¸y.no",
"rakkestad.no",
"rana.no",
"ruovat.no",
"randaberg.no",
"rauma.no",
"rendalen.no",
"rennebu.no",
"rennesoy.no",
"rennesÃ¸y.no",
"rindal.no",
"ringebu.no",
"ringerike.no",
"ringsaker.no",
"rissa.no",
"risor.no",
"risÃ¸r.no",
"roan.no",
"rollag.no",
"rygge.no",
"ralingen.no",
"rÃ¦lingen.no",
"rodoy.no",
"rÃ¸dÃ¸y.no",
"romskog.no",
"rÃ¸mskog.no",
"roros.no",
"rÃ¸ros.no",
"rost.no",
"rÃ¸st.no",
"royken.no",
"rÃ¸yken.no",
"royrvik.no",
"rÃ¸yrvik.no",
"rade.no",
"rÃ¥de.no",
"salangen.no",
"siellak.no",
"saltdal.no",
"salat.no",
"sÃ¡lÃ¡t.no",
"sÃ¡lat.no",
"samnanger.no",
"sande.more-og-romsdal.no",
"sande.mÃ¸re-og-romsdal.no",
"sande.vestfold.no",
"sandefjord.no",
"sandnes.no",
"sandoy.no",
"sandÃ¸y.no",
"sarpsborg.no",
"sauda.no",
"sauherad.no",
"sel.no",
"selbu.no",
"selje.no",
"seljord.no",
"sigdal.no",
"siljan.no",
"sirdal.no",
"skaun.no",
"skedsmo.no",
"ski.no",
"skien.no",
"skiptvet.no",
"skjervoy.no",
"skjervÃ¸y.no",
"skierva.no",
"skiervÃ¡.no",
"skjak.no",
"skjÃ¥k.no",
"skodje.no",
"skanland.no",
"skÃ¥nland.no",
"skanit.no",
"skÃ¡nit.no",
"smola.no",
"smÃ¸la.no",
"snillfjord.no",
"snasa.no",
"snÃ¥sa.no",
"snoasa.no",
"snaase.no",
"snÃ¥ase.no",
"sogndal.no",
"sokndal.no",
"sola.no",
"solund.no",
"songdalen.no",
"sortland.no",
"spydeberg.no",
"stange.no",
"stavanger.no",
"steigen.no",
"steinkjer.no",
"stjordal.no",
"stjÃ¸rdal.no",
"stokke.no",
"stor-elvdal.no",
"stord.no",
"stordal.no",
"storfjord.no",
"omasvuotna.no",
"strand.no",
"stranda.no",
"stryn.no",
"sula.no",
"suldal.no",
"sund.no",
"sunndal.no",
"surnadal.no",
"sveio.no",
"svelvik.no",
"sykkylven.no",
"sogne.no",
"sÃ¸gne.no",
"somna.no",
"sÃ¸mna.no",
"sondre-land.no",
"sÃ¸ndre-land.no",
"sor-aurdal.no",
"sÃ¸r-aurdal.no",
"sor-fron.no",
"sÃ¸r-fron.no",
"sor-odal.no",
"sÃ¸r-odal.no",
"sor-varanger.no",
"sÃ¸r-varanger.no",
"matta-varjjat.no",
"mÃ¡tta-vÃ¡rjjat.no",
"sorfold.no",
"sÃ¸rfold.no",
"sorreisa.no",
"sÃ¸rreisa.no",
"sorum.no",
"sÃ¸rum.no",
"tana.no",
"deatnu.no",
"time.no",
"tingvoll.no",
"tinn.no",
"tjeldsund.no",
"dielddanuorri.no",
"tjome.no",
"tjÃ¸me.no",
"tokke.no",
"tolga.no",
"torsken.no",
"tranoy.no",
"tranÃ¸y.no",
"tromso.no",
"tromsÃ¸.no",
"tromsa.no",
"romsa.no",
"trondheim.no",
"troandin.no",
"trysil.no",
"trana.no",
"trÃ¦na.no",
"trogstad.no",
"trÃ¸gstad.no",
"tvedestrand.no",
"tydal.no",
"tynset.no",
"tysfjord.no",
"divtasvuodna.no",
"divttasvuotna.no",
"tysnes.no",
"tysvar.no",
"tysvÃ¦r.no",
"tonsberg.no",
"tÃ¸nsberg.no",
"ullensaker.no",
"ullensvang.no",
"ulvik.no",
"utsira.no",
"vadso.no",
"vadsÃ¸.no",
"cahcesuolo.no",
"Ä�Ã¡hcesuolo.no",
"vaksdal.no",
"valle.no",
"vang.no",
"vanylven.no",
"vardo.no",
"vardÃ¸.no",
"varggat.no",
"vÃ¡rggÃ¡t.no",
"vefsn.no",
"vaapste.no",
"vega.no",
"vegarshei.no",
"vegÃ¥rshei.no",
"vennesla.no",
"verdal.no",
"verran.no",
"vestby.no",
"vestnes.no",
"vestre-slidre.no",
"vestre-toten.no",
"vestvagoy.no",
"vestvÃ¥gÃ¸y.no",
"vevelstad.no",
"vik.no",
"vikna.no",
"vindafjord.no",
"volda.no",
"voss.no",
"varoy.no",
"vÃ¦rÃ¸y.no",
"vagan.no",
"vÃ¥gan.no",
"voagat.no",
"vagsoy.no",
"vÃ¥gsÃ¸y.no",
"vaga.no",
"vÃ¥gÃ¥.no",
"valer.ostfold.no",
"vÃ¥ler.Ã¸stfold.no",
"valer.hedmark.no",
"vÃ¥ler.hedmark.no",
"*.np",
"nr",
"biz.nr",
"info.nr",
"gov.nr",
"edu.nr",
"org.nr",
"net.nr",
"com.nr",
"nu",
"nz",
"ac.nz",
"co.nz",
"cri.nz",
"geek.nz",
"gen.nz",
"govt.nz",
"health.nz",
"iwi.nz",
"kiwi.nz",
"maori.nz",
"mil.nz",
"mÄ�ori.nz",
"net.nz",
"org.nz",
"parliament.nz",
"school.nz",
"om",
"co.om",
"com.om",
"edu.om",
"gov.om",
"med.om",
"museum.om",
"net.om",
"org.om",
"pro.om",
"onion",
"org",
"pa",
"ac.pa",
"gob.pa",
"com.pa",
"org.pa",
"sld.pa",
"edu.pa",
"net.pa",
"ing.pa",
"abo.pa",
"med.pa",
"nom.pa",
"pe",
"edu.pe",
"gob.pe",
"nom.pe",
"mil.pe",
"org.pe",
"com.pe",
"net.pe",
"pf",
"com.pf",
"org.pf",
"edu.pf",
"*.pg",
"ph",
"com.ph",
"net.ph",
"org.ph",
"gov.ph",
"edu.ph",
"ngo.ph",
"mil.ph",
"i.ph",
"pk",
"com.pk",
"net.pk",
"edu.pk",
"org.pk",
"fam.pk",
"biz.pk",
"web.pk",
"gov.pk",
"gob.pk",
"gok.pk",
"gon.pk",
"gop.pk",
"gos.pk",
"info.pk",
"pl",
"com.pl",
"net.pl",
"org.pl",
"aid.pl",
"agro.pl",
"atm.pl",
"auto.pl",
"biz.pl",
"edu.pl",
"gmina.pl",
"gsm.pl",
"info.pl",
"mail.pl",
"miasta.pl",
"media.pl",
"mil.pl",
"nieruchomosci.pl",
"nom.pl",
"pc.pl",
"powiat.pl",
"priv.pl",
"realestate.pl",
"rel.pl",
"sex.pl",
"shop.pl",
"sklep.pl",
"sos.pl",
"szkola.pl",
"targi.pl",
"tm.pl",
"tourism.pl",
"travel.pl",
"turystyka.pl",
"gov.pl",
"ap.gov.pl",
"ic.gov.pl",
"is.gov.pl",
"us.gov.pl",
"kmpsp.gov.pl",
"kppsp.gov.pl",
"kwpsp.gov.pl",
"psp.gov.pl",
"wskr.gov.pl",
"kwp.gov.pl",
"mw.gov.pl",
"ug.gov.pl",
"um.gov.pl",
"umig.gov.pl",
"ugim.gov.pl",
"upow.gov.pl",
"uw.gov.pl",
"starostwo.gov.pl",
"pa.gov.pl",
"po.gov.pl",
"psse.gov.pl",
"pup.gov.pl",
"rzgw.gov.pl",
"sa.gov.pl",
"so.gov.pl",
"sr.gov.pl",
"wsa.gov.pl",
"sko.gov.pl",
"uzs.gov.pl",
"wiih.gov.pl",
"winb.gov.pl",
"pinb.gov.pl",
"wios.gov.pl",
"witd.gov.pl",
"wzmiuw.gov.pl",
"piw.gov.pl",
"wiw.gov.pl",
"griw.gov.pl",
"wif.gov.pl",
"oum.gov.pl",
"sdn.gov.pl",
"zp.gov.pl",
"uppo.gov.pl",
"mup.gov.pl",
"wuoz.gov.pl",
"konsulat.gov.pl",
"oirm.gov.pl",
"augustow.pl",
"babia-gora.pl",
"bedzin.pl",
"beskidy.pl",
"bialowieza.pl",
"bialystok.pl",
"bielawa.pl",
"bieszczady.pl",
"boleslawiec.pl",
"bydgoszcz.pl",
"bytom.pl",
"cieszyn.pl",
"czeladz.pl",
"czest.pl",
"dlugoleka.pl",
"elblag.pl",
"elk.pl",
"glogow.pl",
"gniezno.pl",
"gorlice.pl",
"grajewo.pl",
"ilawa.pl",
"jaworzno.pl",
"jelenia-gora.pl",
"jgora.pl",
"kalisz.pl",
"kazimierz-dolny.pl",
"karpacz.pl",
"kartuzy.pl",
"kaszuby.pl",
"katowice.pl",
"kepno.pl",
"ketrzyn.pl",
"klodzko.pl",
"kobierzyce.pl",
"kolobrzeg.pl",
"konin.pl",
"konskowola.pl",
"kutno.pl",
"lapy.pl",
"lebork.pl",
"legnica.pl",
"lezajsk.pl",
"limanowa.pl",
"lomza.pl",
"lowicz.pl",
"lubin.pl",
"lukow.pl",
"malbork.pl",
"malopolska.pl",
"mazowsze.pl",
"mazury.pl",
"mielec.pl",
"mielno.pl",
"mragowo.pl",
"naklo.pl",
"nowaruda.pl",
"nysa.pl",
"olawa.pl",
"olecko.pl",
"olkusz.pl",
"olsztyn.pl",
"opoczno.pl",
"opole.pl",
"ostroda.pl",
"ostroleka.pl",
"ostrowiec.pl",
"ostrowwlkp.pl",
"pila.pl",
"pisz.pl",
"podhale.pl",
"podlasie.pl",
"polkowice.pl",
"pomorze.pl",
"pomorskie.pl",
"prochowice.pl",
"pruszkow.pl",
"przeworsk.pl",
"pulawy.pl",
"radom.pl",
"rawa-maz.pl",
"rybnik.pl",
"rzeszow.pl",
"sanok.pl",
"sejny.pl",
"slask.pl",
"slupsk.pl",
"sosnowiec.pl",
"stalowa-wola.pl",
"skoczow.pl",
"starachowice.pl",
"stargard.pl",
"suwalki.pl",
"swidnica.pl",
"swiebodzin.pl",
"swinoujscie.pl",
"szczecin.pl",
"szczytno.pl",
"tarnobrzeg.pl",
"tgory.pl",
"turek.pl",
"tychy.pl",
"ustka.pl",
"walbrzych.pl",
"warmia.pl",
"warszawa.pl",
"waw.pl",
"wegrow.pl",
"wielun.pl",
"wlocl.pl",
"wloclawek.pl",
"wodzislaw.pl",
"wolomin.pl",
"wroclaw.pl",
"zachpomor.pl",
"zagan.pl",
"zarow.pl",
"zgora.pl",
"zgorzelec.pl",
"pm",
"pn",
"gov.pn",
"co.pn",
"org.pn",
"edu.pn",
"net.pn",
"post",
"pr",
"com.pr",
"net.pr",
"org.pr",
"gov.pr",
"edu.pr",
"isla.pr",
"pro.pr",
"biz.pr",
"info.pr",
"name.pr",
"est.pr",
"prof.pr",
"ac.pr",
"pro",
"aaa.pro",
"aca.pro",
"acct.pro",
"avocat.pro",
"bar.pro",
"cpa.pro",
"eng.pro",
"jur.pro",
"law.pro",
"med.pro",
"recht.pro",
"ps",
"edu.ps",
"gov.ps",
"sec.ps",
"plo.ps",
"com.ps",
"org.ps",
"net.ps",
"pt",
"net.pt",
"gov.pt",
"org.pt",
"edu.pt",
"int.pt",
"publ.pt",
"com.pt",
"nome.pt",
"pw",
"co.pw",
"ne.pw",
"or.pw",
"ed.pw",
"go.pw",
"belau.pw",
"py",
"com.py",
"coop.py",
"edu.py",
"gov.py",
"mil.py",
"net.py",
"org.py",
"qa",
"com.qa",
"edu.qa",
"gov.qa",
"mil.qa",
"name.qa",
"net.qa",
"org.qa",
"sch.qa",
"re",
"asso.re",
"com.re",
"nom.re",
"ro",
"arts.ro",
"com.ro",
"firm.ro",
"info.ro",
"nom.ro",
"nt.ro",
"org.ro",
"rec.ro",
"store.ro",
"tm.ro",
"www.ro",
"rs",
"ac.rs",
"co.rs",
"edu.rs",
"gov.rs",
"in.rs",
"org.rs",
"ru",
"rw",
"ac.rw",
"co.rw",
"coop.rw",
"gov.rw",
"mil.rw",
"net.rw",
"org.rw",
"sa",
"com.sa",
"net.sa",
"org.sa",
"gov.sa",
"med.sa",
"pub.sa",
"edu.sa",
"sch.sa",
"sb",
"com.sb",
"edu.sb",
"gov.sb",
"net.sb",
"org.sb",
"sc",
"com.sc",
"gov.sc",
"net.sc",
"org.sc",
"edu.sc",
"sd",
"com.sd",
"net.sd",
"org.sd",
"edu.sd",
"med.sd",
"tv.sd",
"gov.sd",
"info.sd",
"se",
"a.se",
"ac.se",
"b.se",
"bd.se",
"brand.se",
"c.se",
"d.se",
"e.se",
"f.se",
"fh.se",
"fhsk.se",
"fhv.se",
"g.se",
"h.se",
"i.se",
"k.se",
"komforb.se",
"kommunalforbund.se",
"komvux.se",
"l.se",
"lanbib.se",
"m.se",
"n.se",
"naturbruksgymn.se",
"o.se",
"org.se",
"p.se",
"parti.se",
"pp.se",
"press.se",
"r.se",
"s.se",
"t.se",
"tm.se",
"u.se",
"w.se",
"x.se",
"y.se",
"z.se",
"sg",
"com.sg",
"net.sg",
"org.sg",
"gov.sg",
"edu.sg",
"per.sg",
"sh",
"com.sh",
"net.sh",
"gov.sh",
"org.sh",
"mil.sh",
"si",
"sj",
"sk",
"sl",
"com.sl",
"net.sl",
"edu.sl",
"gov.sl",
"org.sl",
"sm",
"sn",
"art.sn",
"com.sn",
"edu.sn",
"gouv.sn",
"org.sn",
"perso.sn",
"univ.sn",
"so",
"com.so",
"edu.so",
"gov.so",
"me.so",
"net.so",
"org.so",
"sr",
"ss",
"biz.ss",
"com.ss",
"edu.ss",
"gov.ss",
"net.ss",
"org.ss",
"st",
"co.st",
"com.st",
"consulado.st",
"edu.st",
"embaixada.st",
"gov.st",
"mil.st",
"net.st",
"org.st",
"principe.st",
"saotome.st",
"store.st",
"su",
"sv",
"com.sv",
"edu.sv",
"gob.sv",
"org.sv",
"red.sv",
"sx",
"gov.sx",
"sy",
"edu.sy",
"gov.sy",
"net.sy",
"mil.sy",
"com.sy",
"org.sy",
"sz",
"co.sz",
"ac.sz",
"org.sz",
"tc",
"td",
"tel",
"tf",
"tg",
"th",
"ac.th",
"co.th",
"go.th",
"in.th",
"mi.th",
"net.th",
"or.th",
"tj",
"ac.tj",
"biz.tj",
"co.tj",
"com.tj",
"edu.tj",
"go.tj",
"gov.tj",
"int.tj",
"mil.tj",
"name.tj",
"net.tj",
"nic.tj",
"org.tj",
"test.tj",
"web.tj",
"tk",
"tl",
"gov.tl",
"tm",
"com.tm",
"co.tm",
"org.tm",
"net.tm",
"nom.tm",
"gov.tm",
"mil.tm",
"edu.tm",
"tn",
"com.tn",
"ens.tn",
"fin.tn",
"gov.tn",
"ind.tn",
"intl.tn",
"nat.tn",
"net.tn",
"org.tn",
"info.tn",
"perso.tn",
"tourism.tn",
"edunet.tn",
"rnrt.tn",
"rns.tn",
"rnu.tn",
"mincom.tn",
"agrinet.tn",
"defense.tn",
"turen.tn",
"to",
"com.to",
"gov.to",
"net.to",
"org.to",
"edu.to",
"mil.to",
"tr",
"av.tr",
"bbs.tr",
"bel.tr",
"biz.tr",
"com.tr",
"dr.tr",
"edu.tr",
"gen.tr",
"gov.tr",
"info.tr",
"mil.tr",
"k12.tr",
"kep.tr",
"name.tr",
"net.tr",
"org.tr",
"pol.tr",
"tel.tr",
"tsk.tr",
"tv.tr",
"web.tr",
"nc.tr",
"gov.nc.tr",
"tt",
"co.tt",
"com.tt",
"org.tt",
"net.tt",
"biz.tt",
"info.tt",
"pro.tt",
"int.tt",
"coop.tt",
"jobs.tt",
"mobi.tt",
"travel.tt",
"museum.tt",
"aero.tt",
"name.tt",
"gov.tt",
"edu.tt",
"tv",
"tw",
"edu.tw",
"gov.tw",
"mil.tw",
"com.tw",
"net.tw",
"org.tw",
"idv.tw",
"game.tw",
"ebiz.tw",
"club.tw",
"ç¶²è·¯.tw",
"çµ„ç¹”.tw",
"å•†æ¥­.tw",
"tz",
"ac.tz",
"co.tz",
"go.tz",
"hotel.tz",
"info.tz",
"me.tz",
"mil.tz",
"mobi.tz",
"ne.tz",
"or.tz",
"sc.tz",
"tv.tz",
"ua",
"com.ua",
"edu.ua",
"gov.ua",
"in.ua",
"net.ua",
"org.ua",
"cherkassy.ua",
"cherkasy.ua",
"chernigov.ua",
"chernihiv.ua",
"chernivtsi.ua",
"chernovtsy.ua",
"ck.ua",
"cn.ua",
"cr.ua",
"crimea.ua",
"cv.ua",
"dn.ua",
"dnepropetrovsk.ua",
"dnipropetrovsk.ua",
"dominic.ua",
"donetsk.ua",
"dp.ua",
"if.ua",
"ivano-frankivsk.ua",
"kh.ua",
"kharkiv.ua",
"kharkov.ua",
"kherson.ua",
"khmelnitskiy.ua",
"khmelnytskyi.ua",
"kiev.ua",
"kirovograd.ua",
"km.ua",
"kr.ua",
"krym.ua",
"ks.ua",
"kv.ua",
"kyiv.ua",
"lg.ua",
"lt.ua",
"lugansk.ua",
"lutsk.ua",
"lv.ua",
"lviv.ua",
"mk.ua",
"mykolaiv.ua",
"nikolaev.ua",
"od.ua",
"odesa.ua",
"odessa.ua",
"pl.ua",
"poltava.ua",
"rivne.ua",
"rovno.ua",
"rv.ua",
"sb.ua",
"sebastopol.ua",
"sevastopol.ua",
"sm.ua",
"sumy.ua",
"te.ua",
"ternopil.ua",
"uz.ua",
"uzhgorod.ua",
"vinnica.ua",
"vinnytsia.ua",
"vn.ua",
"volyn.ua",
"yalta.ua",
"zaporizhzhe.ua",
"zaporizhzhia.ua",
"zhitomir.ua",
"zhytomyr.ua",
"zp.ua",
"zt.ua",
"ug",
"co.ug",
"or.ug",
"ac.ug",
"sc.ug",
"go.ug",
"ne.ug",
"com.ug",
"org.ug",
"uk",
"ac.uk",
"co.uk",
"gov.uk",
"ltd.uk",
"me.uk",
"net.uk",
"nhs.uk",
"org.uk",
"plc.uk",
"police.uk",
"*.sch.uk",
"us",
"dni.us",
"fed.us",
"isa.us",
"kids.us",
"nsn.us",
"ak.us",
"al.us",
"ar.us",
"as.us",
"az.us",
"ca.us",
"co.us",
"ct.us",
"dc.us",
"de.us",
"fl.us",
"ga.us",
"gu.us",
"hi.us",
"ia.us",
"id.us",
"il.us",
"in.us",
"ks.us",
"ky.us",
"la.us",
"ma.us",
"md.us",
"me.us",
"mi.us",
"mn.us",
"mo.us",
"ms.us",
"mt.us",
"nc.us",
"nd.us",
"ne.us",
"nh.us",
"nj.us",
"nm.us",
"nv.us",
"ny.us",
"oh.us",
"ok.us",
"or.us",
"pa.us",
"pr.us",
"ri.us",
"sc.us",
"sd.us",
"tn.us",
"tx.us",
"ut.us",
"vi.us",
"vt.us",
"va.us",
"wa.us",
"wi.us",
"wv.us",
"wy.us",
"k12.ak.us",
"k12.al.us",
"k12.ar.us",
"k12.as.us",
"k12.az.us",
"k12.ca.us",
"k12.co.us",
"k12.ct.us",
"k12.dc.us",
"k12.de.us",
"k12.fl.us",
"k12.ga.us",
"k12.gu.us",
"k12.ia.us",
"k12.id.us",
"k12.il.us",
"k12.in.us",
"k12.ks.us",
"k12.ky.us",
"k12.la.us",
"k12.ma.us",
"k12.md.us",
"k12.me.us",
"k12.mi.us",
"k12.mn.us",
"k12.mo.us",
"k12.ms.us",
"k12.mt.us",
"k12.nc.us",
"k12.ne.us",
"k12.nh.us",
"k12.nj.us",
"k12.nm.us",
"k12.nv.us",
"k12.ny.us",
"k12.oh.us",
"k12.ok.us",
"k12.or.us",
"k12.pa.us",
"k12.pr.us",
"k12.ri.us",
"k12.sc.us",
"k12.tn.us",
"k12.tx.us",
"k12.ut.us",
"k12.vi.us",
"k12.vt.us",
"k12.va.us",
"k12.wa.us",
"k12.wi.us",
"k12.wy.us",
"cc.ak.us",
"cc.al.us",
"cc.ar.us",
"cc.as.us",
"cc.az.us",
"cc.ca.us",
"cc.co.us",
"cc.ct.us",
"cc.dc.us",
"cc.de.us",
"cc.fl.us",
"cc.ga.us",
"cc.gu.us",
"cc.hi.us",
"cc.ia.us",
"cc.id.us",
"cc.il.us",
"cc.in.us",
"cc.ks.us",
"cc.ky.us",
"cc.la.us",
"cc.ma.us",
"cc.md.us",
"cc.me.us",
"cc.mi.us",
"cc.mn.us",
"cc.mo.us",
"cc.ms.us",
"cc.mt.us",
"cc.nc.us",
"cc.nd.us",
"cc.ne.us",
"cc.nh.us",
"cc.nj.us",
"cc.nm.us",
"cc.nv.us",
"cc.ny.us",
"cc.oh.us",
"cc.ok.us",
"cc.or.us",
"cc.pa.us",
"cc.pr.us",
"cc.ri.us",
"cc.sc.us",
"cc.sd.us",
"cc.tn.us",
"cc.tx.us",
"cc.ut.us",
"cc.vi.us",
"cc.vt.us",
"cc.va.us",
"cc.wa.us",
"cc.wi.us",
"cc.wv.us",
"cc.wy.us",
"lib.ak.us",
"lib.al.us",
"lib.ar.us",
"lib.as.us",
"lib.az.us",
"lib.ca.us",
"lib.co.us",
"lib.ct.us",
"lib.dc.us",
"lib.fl.us",
"lib.ga.us",
"lib.gu.us",
"lib.hi.us",
"lib.ia.us",
"lib.id.us",
"lib.il.us",
"lib.in.us",
"lib.ks.us",
"lib.ky.us",
"lib.la.us",
"lib.ma.us",
"lib.md.us",
"lib.me.us",
"lib.mi.us",
"lib.mn.us",
"lib.mo.us",
"lib.ms.us",
"lib.mt.us",
"lib.nc.us",
"lib.nd.us",
"lib.ne.us",
"lib.nh.us",
"lib.nj.us",
"lib.nm.us",
"lib.nv.us",
"lib.ny.us",
"lib.oh.us",
"lib.ok.us",
"lib.or.us",
"lib.pa.us",
"lib.pr.us",
"lib.ri.us",
"lib.sc.us",
"lib.sd.us",
"lib.tn.us",
"lib.tx.us",
"lib.ut.us",
"lib.vi.us",
"lib.vt.us",
"lib.va.us",
"lib.wa.us",
"lib.wi.us",
"lib.wy.us",
"pvt.k12.ma.us",
"chtr.k12.ma.us",
"paroch.k12.ma.us",
"ann-arbor.mi.us",
"cog.mi.us",
"dst.mi.us",
"eaton.mi.us",
"gen.mi.us",
"mus.mi.us",
"tec.mi.us",
"washtenaw.mi.us",
"uy",
"com.uy",
"edu.uy",
"gub.uy",
"mil.uy",
"net.uy",
"org.uy",
"uz",
"co.uz",
"com.uz",
"net.uz",
"org.uz",
"va",
"vc",
"com.vc",
"net.vc",
"org.vc",
"gov.vc",
"mil.vc",
"edu.vc",
"ve",
"arts.ve",
"co.ve",
"com.ve",
"e12.ve",
"edu.ve",
"firm.ve",
"gob.ve",
"gov.ve",
"info.ve",
"int.ve",
"mil.ve",
"net.ve",
"org.ve",
"rec.ve",
"store.ve",
"tec.ve",
"web.ve",
"vg",
"vi",
"co.vi",
"com.vi",
"k12.vi",
"net.vi",
"org.vi",
"vn",
"com.vn",
"net.vn",
"org.vn",
"edu.vn",
"gov.vn",
"int.vn",
"ac.vn",
"biz.vn",
"info.vn",
"name.vn",
"pro.vn",
"health.vn",
"vu",
"com.vu",
"edu.vu",
"net.vu",
"org.vu",
"wf",
"ws",
"com.ws",
"net.ws",
"org.ws",
"gov.ws",
"edu.ws",
"yt",
"Ø§Ù…Ø§Ø±Ø§Øª",
"Õ°Õ¡Õµ",
"à¦¬à¦¾à¦‚à¦²à¦¾",
"Ð±Ð³",
"Ð±ÐµÐ»",
"ä¸­å›½",
"ä¸­åœ‹",
"Ø§Ù„Ø¬Ø²Ø§Ø¦Ø±",
"Ù…ØµØ±",
"ÐµÑŽ",
"ÎµÏ…",
"Ù…ÙˆØ±ÙŠØªØ§Ù†ÙŠØ§",
"áƒ’áƒ”",
"ÎµÎ»",
"é¦™æ¸¯",
"å…¬å�¸.é¦™æ¸¯",
"æ•™è‚².é¦™æ¸¯",
"æ”¿åºœ.é¦™æ¸¯",
"å€‹äºº.é¦™æ¸¯",
"ç¶²çµ¡.é¦™æ¸¯",
"çµ„ç¹”.é¦™æ¸¯",
"à²­à²¾à²°à²¤",
"à¬­à¬¾à¬°à¬¤",
"à¦­à¦¾à§°à¦¤",
"à¤­à¤¾à¤°à¤¤à¤®à¥�",
"à¤­à¤¾à¤°à¥‹à¤¤",
"Ú€Ø§Ø±Øª",
"à´­à´¾à´°à´¤à´‚",
"à¤­à¤¾à¤°à¤¤",
"Ø¨Ø§Ø±Øª",
"Ø¨Ú¾Ø§Ø±Øª",
"à°­à°¾à°°à°¤à±�",
"àª­àª¾àª°àª¤",
"à¨­à¨¾à¨°à¨¤",
"à¦­à¦¾à¦°à¦¤",
"à®‡à®¨à¯�à®¤à®¿à®¯à®¾",
"Ø§ÛŒØ±Ø§Ù†",
"Ø§ÙŠØ±Ø§Ù†",
"Ø¹Ø±Ø§Ù‚",
"Ø§Ù„Ø§Ø±Ø¯Ù†",
"í•œêµ­",
"Ò›Ð°Ð·",
"à¶½à¶‚à¶šà·�",
"à®‡à®²à®™à¯�à®•à¯ˆ",
"Ø§Ù„Ù…ØºØ±Ø¨",
"Ð¼ÐºÐ´",
"Ð¼Ð¾Ð½",
"æ¾³é–€",
"æ¾³é—¨",
"Ù…Ù„ÙŠØ³ÙŠØ§",
"Ø¹Ù…Ø§Ù†",
"Ù¾Ø§Ú©Ø³ØªØ§Ù†",
"Ù¾Ø§ÙƒØ³ØªØ§Ù†",
"Ù�Ù„Ø³Ø·ÙŠÙ†",
"Ñ�Ñ€Ð±",
"Ð¿Ñ€.Ñ�Ñ€Ð±",
"Ð¾Ñ€Ð³.Ñ�Ñ€Ð±",
"Ð¾Ð±Ñ€.Ñ�Ñ€Ð±",
"Ð¾Ð´.Ñ�Ñ€Ð±",
"ÑƒÐ¿Ñ€.Ñ�Ñ€Ð±",
"Ð°Ðº.Ñ�Ñ€Ð±",
"Ñ€Ñ„",
"Ù‚Ø·Ø±",
"Ø§Ù„Ø³Ø¹ÙˆØ¯ÙŠØ©",
"Ø§Ù„Ø³Ø¹ÙˆØ¯ÛŒØ©",
"Ø§Ù„Ø³Ø¹ÙˆØ¯ÛŒÛƒ",
"Ø§Ù„Ø³Ø¹ÙˆØ¯ÙŠÙ‡",
"Ø³ÙˆØ¯Ø§Ù†",
"æ–°åŠ å�¡",
"à®šà®¿à®™à¯�à®•à®ªà¯�à®ªà¯‚à®°à¯�",
"Ø³ÙˆØ±ÙŠØ©",
"Ø³ÙˆØ±ÙŠØ§",
"à¹„à¸—à¸¢",
"à¸¨à¸¶à¸�à¸©à¸².à¹„à¸—à¸¢",
"à¸˜à¸¸à¸£à¸�à¸´à¸ˆ.à¹„à¸—à¸¢",
"à¸£à¸±à¸�à¸šà¸²à¸¥.à¹„à¸—à¸¢",
"à¸—à¸«à¸²à¸£.à¹„à¸—à¸¢",
"à¹€à¸™à¹‡à¸•.à¹„à¸—à¸¢",
"à¸­à¸‡à¸„à¹Œà¸�à¸£.à¹„à¸—à¸¢",
"ØªÙˆÙ†Ø³",
"å�°ç�£",
"å�°æ¹¾",
"è‡ºç�£",
"ÑƒÐºÑ€",
"Ø§Ù„ÙŠÙ…Ù†",
"xxx",
"*.ye",
"ac.za",
"agric.za",
"alt.za",
"co.za",
"edu.za",
"gov.za",
"grondar.za",
"law.za",
"mil.za",
"net.za",
"ngo.za",
"nic.za",
"nis.za",
"nom.za",
"org.za",
"school.za",
"tm.za",
"web.za",
"zm",
"ac.zm",
"biz.zm",
"co.zm",
"com.zm",
"edu.zm",
"gov.zm",
"info.zm",
"mil.zm",
"net.zm",
"org.zm",
"sch.zm",
"zw",
"ac.zw",
"co.zw",
"gov.zw",
"mil.zw",
"org.zw",
"aaa",
"aarp",
"abarth",
"abb",
"abbott",
"abbvie",
"abc",
"able",
"abogado",
"abudhabi",
"academy",
"accenture",
"accountant",
"accountants",
"aco",
"actor",
"adac",
"ads",
"adult",
"aeg",
"aetna",
"afamilycompany",
"afl",
"africa",
"agakhan",
"agency",
"aig",
"aigo",
"airbus",
"airforce",
"airtel",
"akdn",
"alfaromeo",
"alibaba",
"alipay",
"allfinanz",
"allstate",
"ally",
"alsace",
"alstom",
"amazon",
"americanexpress",
"americanfamily",
"amex",
"amfam",
"amica",
"amsterdam",
"analytics",
"android",
"anquan",
"anz",
"aol",
"apartments",
"app",
"apple",
"aquarelle",
"arab",
"aramco",
"archi",
"army",
"art",
"arte",
"asda",
"associates",
"athleta",
"attorney",
"auction",
"audi",
"audible",
"audio",
"auspost",
"author",
"auto",
"autos",
"avianca",
"aws",
"axa",
"azure",
"baby",
"baidu",
"banamex",
"bananarepublic",
"band",
"bank",
"bar",
"barcelona",
"barclaycard",
"barclays",
"barefoot",
"bargains",
"baseball",
"basketball",
"bauhaus",
"bayern",
"bbc",
"bbt",
"bbva",
"bcg",
"bcn",
"beats",
"beauty",
"beer",
"bentley",
"berlin",
"best",
"bestbuy",
"bet",
"bharti",
"bible",
"bid",
"bike",
"bing",
"bingo",
"bio",
"black",
"blackfriday",
"blockbuster",
"blog",
"bloomberg",
"blue",
"bms",
"bmw",
"bnpparibas",
"boats",
"boehringer",
"bofa",
"bom",
"bond",
"boo",
"book",
"booking",
"bosch",
"bostik",
"boston",
"bot",
"boutique",
"box",
"bradesco",
"bridgestone",
"broadway",
"broker",
"brother",
"brussels",
"budapest",
"bugatti",
"build",
"builders",
"business",
"buy",
"buzz",
"bzh",
"cab",
"cafe",
"cal",
"call",
"calvinklein",
"cam",
"camera",
"camp",
"cancerresearch",
"canon",
"capetown",
"capital",
"capitalone",
"car",
"caravan",
"cards",
"care",
"career",
"careers",
"cars",
"casa",
"case",
"caseih",
"cash",
"casino",
"catering",
"catholic",
"cba",
"cbn",
"cbre",
"cbs",
"ceb",
"center",
"ceo",
"cern",
"cfa",
"cfd",
"chanel",
"channel",
"charity",
"chase",
"chat",
"cheap",
"chintai",
"christmas",
"chrome",
"church",
"cipriani",
"circle",
"cisco",
"citadel",
"citi",
"citic",
"city",
"cityeats",
"claims",
"cleaning",
"click",
"clinic",
"clinique",
"clothing",
"cloud",
"club",
"clubmed",
"coach",
"codes",
"coffee",
"college",
"cologne",
"comcast",
"commbank",
"community",
"company",
"compare",
"computer",
"comsec",
"condos",
"construction",
"consulting",
"contact",
"contractors",
"cooking",
"cookingchannel",
"cool",
"corsica",
"country",
"coupon",
"coupons",
"courses",
"cpa",
"credit",
"creditcard",
"creditunion",
"cricket",
"crown",
"crs",
"cruise",
"cruises",
"csc",
"cuisinella",
"cymru",
"cyou",
"dabur",
"dad",
"dance",
"data",
"date",
"dating",
"datsun",
"day",
"dclk",
"dds",
"deal",
"dealer",
"deals",
"degree",
"delivery",
"dell",
"deloitte",
"delta",
"democrat",
"dental",
"dentist",
"desi",
"design",
"dev",
"dhl",
"diamonds",
"diet",
"digital",
"direct",
"directory",
"discount",
"discover",
"dish",
"diy",
"dnp",
"docs",
"doctor",
"dog",
"domains",
"dot",
"download",
"drive",
"dtv",
"dubai",
"duck",
"dunlop",
"dupont",
"durban",
"dvag",
"dvr",
"earth",
"eat",
"eco",
"edeka",
"education",
"email",
"emerck",
"energy",
"engineer",
"engineering",
"enterprises",
"epson",
"equipment",
"ericsson",
"erni",
"esq",
"estate",
"esurance",
"etisalat",
"eurovision",
"eus",
"events",
"exchange",
"expert",
"exposed",
"express",
"extraspace",
"fage",
"fail",
"fairwinds",
"faith",
"family",
"fan",
"fans",
"farm",
"farmers",
"fashion",
"fast",
"fedex",
"feedback",
"ferrari",
"ferrero",
"fiat",
"fidelity",
"fido",
"film",
"final",
"finance",
"financial",
"fire",
"firestone",
"firmdale",
"fish",
"fishing",
"fit",
"fitness",
"flickr",
"flights",
"flir",
"florist",
"flowers",
"fly",
"foo",
"food",
"foodnetwork",
"football",
"ford",
"forex",
"forsale",
"forum",
"foundation",
"fox",
"free",
"fresenius",
"frl",
"frogans",
"frontdoor",
"frontier",
"ftr",
"fujitsu",
"fujixerox",
"fun",
"fund",
"furniture",
"futbol",
"fyi",
"gal",
"gallery",
"gallo",
"gallup",
"game",
"games",
"gap",
"garden",
"gay",
"gbiz",
"gdn",
"gea",
"gent",
"genting",
"george",
"ggee",
"gift",
"gifts",
"gives",
"giving",
"glade",
"glass",
"gle",
"global",
"globo",
"gmail",
"gmbh",
"gmo",
"gmx",
"godaddy",
"gold",
"goldpoint",
"golf",
"goo",
"goodyear",
"goog",
"google",
"gop",
"got",
"grainger",
"graphics",
"gratis",
"green",
"gripe",
"grocery",
"group",
"guardian",
"gucci",
"guge",
"guide",
"guitars",
"guru",
"hair",
"hamburg",
"hangout",
"haus",
"hbo",
"hdfc",
"hdfcbank",
"health",
"healthcare",
"help",
"helsinki",
"here",
"hermes",
"hgtv",
"hiphop",
"hisamitsu",
"hitachi",
"hiv",
"hkt",
"hockey",
"holdings",
"holiday",
"homedepot",
"homegoods",
"homes",
"homesense",
"honda",
"horse",
"hospital",
"host",
"hosting",
"hot",
"hoteles",
"hotels",
"hotmail",
"house",
"how",
"hsbc",
"hughes",
"hyatt",
"hyundai",
"ibm",
"icbc",
"ice",
"icu",
"ieee",
"ifm",
"ikano",
"imamat",
"imdb",
"immo",
"immobilien",
"inc",
"industries",
"infiniti",
"ing",
"ink",
"institute",
"insurance",
"insure",
"intel",
"international",
"intuit",
"investments",
"ipiranga",
"irish",
"ismaili",
"ist",
"istanbul",
"itau",
"itv",
"iveco",
"jaguar",
"java",
"jcb",
"jcp",
"jeep",
"jetzt",
"jewelry",
"jio",
"jll",
"jmp",
"jnj",
"joburg",
"jot",
"joy",
"jpmorgan",
"jprs",
"juegos",
"juniper",
"kaufen",
"kddi",
"kerryhotels",
"kerrylogistics",
"kerryproperties",
"kfh",
"kia",
"kim",
"kinder",
"kindle",
"kitchen",
"kiwi",
"koeln",
"komatsu",
"kosher",
"kpmg",
"kpn",
"krd",
"kred",
"kuokgroup",
"kyoto",
"lacaixa",
"lamborghini",
"lamer",
"lancaster",
"lancia",
"land",
"landrover",
"lanxess",
"lasalle",
"lat",
"latino",
"latrobe",
"law",
"lawyer",
"lds",
"lease",
"leclerc",
"lefrak",
"legal",
"lego",
"lexus",
"lgbt",
"lidl",
"life",
"lifeinsurance",
"lifestyle",
"lighting",
"like",
"lilly",
"limited",
"limo",
"lincoln",
"linde",
"link",
"lipsy",
"live",
"living",
"lixil",
"llc",
"llp",
"loan",
"loans",
"locker",
"locus",
"loft",
"lol",
"london",
"lotte",
"lotto",
"love",
"lpl",
"lplfinancial",
"ltd",
"ltda",
"lundbeck",
"lupin",
"luxe",
"luxury",
"macys",
"madrid",
"maif",
"maison",
"makeup",
"man",
"management",
"mango",
"map",
"market",
"marketing",
"markets",
"marriott",
"marshalls",
"maserati",
"mattel",
"mba",
"mckinsey",
"med",
"media",
"meet",
"melbourne",
"meme",
"memorial",
"men",
"menu",
"merckmsd",
"metlife",
"miami",
"microsoft",
"mini",
"mint",
"mit",
"mitsubishi",
"mlb",
"mls",
"mma",
"mobile",
"moda",
"moe",
"moi",
"mom",
"monash",
"money",
"monster",
"mormon",
"mortgage",
"moscow",
"moto",
"motorcycles",
"mov",
"movie",
"msd",
"mtn",
"mtr",
"mutual",
"nab",
"nadex",
"nagoya",
"nationwide",
"natura",
"navy",
"nba",
"nec",
"netbank",
"netflix",
"network",
"neustar",
"new",
"newholland",
"news",
"next",
"nextdirect",
"nexus",
"nfl",
"ngo",
"nhk",
"nico",
"nike",
"nikon",
"ninja",
"nissan",
"nissay",
"nokia",
"northwesternmutual",
"norton",
"now",
"nowruz",
"nowtv",
"nra",
"nrw",
"ntt",
"nyc",
"obi",
"observer",
"off",
"office",
"okinawa",
"olayan",
"olayangroup",
"oldnavy",
"ollo",
"omega",
"one",
"ong",
"onl",
"online",
"onyourside",
"ooo",
"open",
"oracle",
"orange",
"organic",
"origins",
"osaka",
"otsuka",
"ott",
"ovh",
"page",
"panasonic",
"paris",
"pars",
"partners",
"parts",
"party",
"passagens",
"pay",
"pccw",
"pet",
"pfizer",
"pharmacy",
"phd",
"philips",
"phone",
"photo",
"photography",
"photos",
"physio",
"pics",
"pictet",
"pictures",
"pid",
"pin",
"ping",
"pink",
"pioneer",
"pizza",
"place",
"play",
"playstation",
"plumbing",
"plus",
"pnc",
"pohl",
"poker",
"politie",
"porn",
"pramerica",
"praxi",
"press",
"prime",
"prod",
"productions",
"prof",
"progressive",
"promo",
"properties",
"property",
"protection",
"pru",
"prudential",
"pub",
"pwc",
"qpon",
"quebec",
"quest",
"qvc",
"racing",
"radio",
"raid",
"read",
"realestate",
"realtor",
"realty",
"recipes",
"red",
"redstone",
"redumbrella",
"rehab",
"reise",
"reisen",
"reit",
"reliance",
"ren",
"rent",
"rentals",
"repair",
"report",
"republican",
"rest",
"restaurant",
"review",
"reviews",
"rexroth",
"rich",
"richardli",
"ricoh",
"rightathome",
"ril",
"rio",
"rip",
"rmit",
"rocher",
"rocks",
"rodeo",
"rogers",
"room",
"rsvp",
"rugby",
"ruhr",
"run",
"rwe",
"ryukyu",
"saarland",
"safe",
"safety",
"sakura",
"sale",
"salon",
"samsclub",
"samsung",
"sandvik",
"sandvikcoromant",
"sanofi",
"sap",
"sarl",
"sas",
"save",
"saxo",
"sbi",
"sbs",
"sca",
"scb",
"schaeffler",
"schmidt",
"scholarships",
"school",
"schule",
"schwarz",
"science",
"scjohnson",
"scor",
"scot",
"search",
"seat",
"secure",
"security",
"seek",
"select",
"sener",
"services",
"ses",
"seven",
"sew",
"sex",
"sexy",
"sfr",
"shangrila",
"sharp",
"shaw",
"shell",
"shia",
"shiksha",
"shoes",
"shop",
"shopping",
"shouji",
"show",
"showtime",
"shriram",
"silk",
"sina",
"singles",
"site",
"ski",
"skin",
"sky",
"skype",
"sling",
"smart",
"smile",
"sncf",
"soccer",
"social",
"softbank",
"software",
"sohu",
"solar",
"solutions",
"song",
"sony",
"soy",
"spa",
"space",
"sport",
"spot",
"spreadbetting",
"srl",
"stada",
"staples",
"star",
"statebank",
"statefarm",
"stc",
"stcgroup",
"stockholm",
"storage",
"store",
"stream",
"studio",
"study",
"style",
"sucks",
"supplies",
"supply",
"support",
"surf",
"surgery",
"suzuki",
"swatch",
"swiftcover",
"swiss",
"sydney",
"symantec",
"systems",
"tab",
"taipei",
"talk",
"taobao",
"target",
"tatamotors",
"tatar",
"tattoo",
"tax",
"taxi",
"tci",
"tdk",
"team",
"tech",
"technology",
"temasek",
"tennis",
"teva",
"thd",
"theater",
"theatre",
"tiaa",
"tickets",
"tienda",
"tiffany",
"tips",
"tires",
"tirol",
"tjmaxx",
"tjx",
"tkmaxx",
"tmall",
"today",
"tokyo",
"tools",
"top",
"toray",
"toshiba",
"total",
"tours",
"town",
"toyota",
"toys",
"trade",
"trading",
"training",
"travel",
"travelchannel",
"travelers",
"travelersinsurance",
"trust",
"trv",
"tube",
"tui",
"tunes",
"tushu",
"tvs",
"ubank",
"ubs",
"unicom",
"university",
"uno",
"uol",
"ups",
"vacations",
"vana",
"vanguard",
"vegas",
"ventures",
"verisign",
"versicherung",
"vet",
"viajes",
"video",
"vig",
"viking",
"villas",
"vin",
"vip",
"virgin",
"visa",
"vision",
"viva",
"vivo",
"vlaanderen",
"vodka",
"volkswagen",
"volvo",
"vote",
"voting",
"voto",
"voyage",
"vuelos",
"wales",
"walmart",
"walter",
"wang",
"wanggou",
"watch",
"watches",
"weather",
"weatherchannel",
"webcam",
"weber",
"website",
"wed",
"wedding",
"weibo",
"weir",
"whoswho",
"wien",
"wiki",
"williamhill",
"win",
"windows",
"wine",
"winners",
"wme",
"wolterskluwer",
"woodside",
"work",
"works",
"world",
"wow",
"wtc",
"wtf",
"xbox",
"xerox",
"xfinity",
"xihuan",
"xin",
"à¤•à¥‰à¤®",
"ã‚»ãƒ¼ãƒ«",
"ä½›å±±",
"æ…ˆå–„",
"é›†å›¢",
"åœ¨çº¿",
"å¤§ä¼—æ±½è½¦",
"ç‚¹çœ‹",
"à¸„à¸­à¸¡",
"å…«å�¦",
"Ù…ÙˆÙ‚Ø¹",
"å…¬ç›Š",
"å…¬å�¸",
"é¦™æ ¼é‡Œæ‹‰",
"ç½‘ç«™",
"ç§»åŠ¨",
"æˆ‘çˆ±ä½ ",
"Ð¼Ð¾Ñ�ÐºÐ²Ð°",
"ÐºÐ°Ñ‚Ð¾Ð»Ð¸Ðº",
"Ð¾Ð½Ð»Ð°Ð¹Ð½",
"Ñ�Ð°Ð¹Ñ‚",
"è�”é€š",
"×§×•×�",
"æ—¶å°š",
"å¾®å�š",
"æ·¡é©¬é”¡",
"ãƒ•ã‚¡ãƒƒã‚·ãƒ§ãƒ³",
"Ð¾Ñ€Ð³",
"à¤¨à¥‡à¤Ÿ",
"ã‚¹ãƒˆã‚¢",
"ã‚¢ãƒžã‚¾ãƒ³",
"ì‚¼ì„±",
"å•†æ ‡",
"å•†åº—",
"å•†åŸŽ",
"Ð´ÐµÑ‚Ð¸",
"ãƒ�ã‚¤ãƒ³ãƒˆ",
"æ–°é—»",
"å·¥è¡Œ",
"å®¶é›»",
"ÙƒÙˆÙ…",
"ä¸­æ–‡ç½‘",
"ä¸­ä¿¡",
"å¨±ä¹�",
"è°·æ­Œ",
"é›»è¨Šç›ˆç§‘",
"è´­ç‰©",
"ã‚¯ãƒ©ã‚¦ãƒ‰",
"é€šè²©",
"ç½‘åº—",
"à¤¸à¤‚à¤—à¤ à¤¨",
"é¤�åŽ…",
"ç½‘ç»œ",
"ÐºÐ¾Ð¼",
"äºšé©¬é€Š",
"è¯ºåŸºäºš",
"é£Ÿå“�",
"é£žåˆ©æµ¦",
"æ‰‹è¡¨",
"æ‰‹æœº",
"Ø§Ø±Ø§Ù…ÙƒÙˆ",
"Ø§Ù„Ø¹Ù„ÙŠØ§Ù†",
"Ø§ØªØµØ§Ù„Ø§Øª",
"Ø¨Ø§Ø²Ø§Ø±",
"Ø§Ø¨ÙˆØ¸Ø¨ÙŠ",
"ÙƒØ§Ø«ÙˆÙ„ÙŠÙƒ",
"Ù‡Ù…Ø±Ø§Ù‡",
"ë‹·ì»´",
"æ”¿åºœ",
"Ø´Ø¨ÙƒØ©",
"Ø¨ÙŠØªÙƒ",
"Ø¹Ø±Ø¨",
"æœºæž„",
"ç»„ç»‡æœºæž„",
"å�¥åº·",
"æ‹›è�˜",
"Ñ€ÑƒÑ�",
"ç� å®�",
"å¤§æ‹¿",
"ã�¿ã‚“ã�ª",
"ã‚°ãƒ¼ã‚°ãƒ«",
"ä¸–ç•Œ",
"æ›¸ç±�",
"ç½‘å�€",
"ë‹·ë„·",
"ã‚³ãƒ ",
"å¤©ä¸»æ•™",
"æ¸¸æˆ�",
"vermÃ¶gensberater",
"vermÃ¶gensberatung",
"ä¼�ä¸š",
"ä¿¡æ�¯",
"å˜‰é‡Œå¤§é…’åº—",
"å˜‰é‡Œ",
"å¹¿ä¸œ",
"æ”¿åŠ¡",
"xyz",
"yachts",
"yahoo",
"yamaxun",
"yandex",
"yodobashi",
"yoga",
"yokohama",
"you",
"youtube",
"yun",
"zappos",
"zara",
"zero",
"zip",
"zone",
"zuerich",
"cc.ua",
"inf.ua",
"ltd.ua",
"adobeaemcloud.com",
"adobeaemcloud.net",
"*.dev.adobeaemcloud.com",
"beep.pl",
"barsy.ca",
"*.compute.estate",
"*.alces.network",
"altervista.org",
"alwaysdata.net",
"cloudfront.net",
"*.compute.amazonaws.com",
"*.compute-1.amazonaws.com",
"*.compute.amazonaws.com.cn",
"us-east-1.amazonaws.com",
"cn-north-1.eb.amazonaws.com.cn",
"cn-northwest-1.eb.amazonaws.com.cn",
"elasticbeanstalk.com",
"ap-northeast-1.elasticbeanstalk.com",
"ap-northeast-2.elasticbeanstalk.com",
"ap-northeast-3.elasticbeanstalk.com",
"ap-south-1.elasticbeanstalk.com",
"ap-southeast-1.elasticbeanstalk.com",
"ap-southeast-2.elasticbeanstalk.com",
"ca-central-1.elasticbeanstalk.com",
"eu-central-1.elasticbeanstalk.com",
"eu-west-1.elasticbeanstalk.com",
"eu-west-2.elasticbeanstalk.com",
"eu-west-3.elasticbeanstalk.com",
"sa-east-1.elasticbeanstalk.com",
"us-east-1.elasticbeanstalk.com",
"us-east-2.elasticbeanstalk.com",
"us-gov-west-1.elasticbeanstalk.com",
"us-west-1.elasticbeanstalk.com",
"us-west-2.elasticbeanstalk.com",
"*.elb.amazonaws.com",
"*.elb.amazonaws.com.cn",
"s3.amazonaws.com",
"s3-ap-northeast-1.amazonaws.com",
"s3-ap-northeast-2.amazonaws.com",
"s3-ap-south-1.amazonaws.com",
"s3-ap-southeast-1.amazonaws.com",
"s3-ap-southeast-2.amazonaws.com",
"s3-ca-central-1.amazonaws.com",
"s3-eu-central-1.amazonaws.com",
"s3-eu-west-1.amazonaws.com",
"s3-eu-west-2.amazonaws.com",
"s3-eu-west-3.amazonaws.com",
"s3-external-1.amazonaws.com",
"s3-fips-us-gov-west-1.amazonaws.com",
"s3-sa-east-1.amazonaws.com",
"s3-us-gov-west-1.amazonaws.com",
"s3-us-east-2.amazonaws.com",
"s3-us-west-1.amazonaws.com",
"s3-us-west-2.amazonaws.com",
"s3.ap-northeast-2.amazonaws.com",
"s3.ap-south-1.amazonaws.com",
"s3.cn-north-1.amazonaws.com.cn",
"s3.ca-central-1.amazonaws.com",
"s3.eu-central-1.amazonaws.com",
"s3.eu-west-2.amazonaws.com",
"s3.eu-west-3.amazonaws.com",
"s3.us-east-2.amazonaws.com",
"s3.dualstack.ap-northeast-1.amazonaws.com",
"s3.dualstack.ap-northeast-2.amazonaws.com",
"s3.dualstack.ap-south-1.amazonaws.com",
"s3.dualstack.ap-southeast-1.amazonaws.com",
"s3.dualstack.ap-southeast-2.amazonaws.com",
"s3.dualstack.ca-central-1.amazonaws.com",
"s3.dualstack.eu-central-1.amazonaws.com",
"s3.dualstack.eu-west-1.amazonaws.com",
"s3.dualstack.eu-west-2.amazonaws.com",
"s3.dualstack.eu-west-3.amazonaws.com",
"s3.dualstack.sa-east-1.amazonaws.com",
"s3.dualstack.us-east-1.amazonaws.com",
"s3.dualstack.us-east-2.amazonaws.com",
"s3-website-us-east-1.amazonaws.com",
"s3-website-us-west-1.amazonaws.com",
"s3-website-us-west-2.amazonaws.com",
"s3-website-ap-northeast-1.amazonaws.com",
"s3-website-ap-southeast-1.amazonaws.com",
"s3-website-ap-southeast-2.amazonaws.com",
"s3-website-eu-west-1.amazonaws.com",
"s3-website-sa-east-1.amazonaws.com",
"s3-website.ap-northeast-2.amazonaws.com",
"s3-website.ap-south-1.amazonaws.com",
"s3-website.ca-central-1.amazonaws.com",
"s3-website.eu-central-1.amazonaws.com",
"s3-website.eu-west-2.amazonaws.com",
"s3-website.eu-west-3.amazonaws.com",
"s3-website.us-east-2.amazonaws.com",
"amsw.nl",
"t3l3p0rt.net",
"tele.amune.org",
"apigee.io",
"on-aptible.com",
"user.aseinet.ne.jp",
"gv.vc",
"d.gv.vc",
"user.party.eus",
"pimienta.org",
"poivron.org",
"potager.org",
"sweetpepper.org",
"myasustor.com",
"myfritz.net",
"*.awdev.ca",
"*.advisor.ws",
"b-data.io",
"backplaneapp.io",
"balena-devices.com",
"app.banzaicloud.io",
"betainabox.com",
"bnr.la",
"blackbaudcdn.net",
"boomla.net",
"boxfuse.io",
"square7.ch",
"bplaced.com",
"bplaced.de",
"square7.de",
"bplaced.net",
"square7.net",
"browsersafetymark.io",
"uk0.bigv.io",
"dh.bytemark.co.uk",
"vm.bytemark.co.uk",
"mycd.eu",
"carrd.co",
"crd.co",
"uwu.ai",
"ae.org",
"ar.com",
"br.com",
"cn.com",
"com.de",
"com.se",
"de.com",
"eu.com",
"gb.com",
"gb.net",
"hu.com",
"hu.net",
"jp.net",
"jpn.com",
"kr.com",
"mex.com",
"no.com",
"qc.com",
"ru.com",
"sa.com",
"se.net",
"uk.com",
"uk.net",
"us.com",
"uy.com",
"za.bz",
"za.com",
"africa.com",
"gr.com",
"in.net",
"us.org",
"co.com",
"c.la",
"certmgr.org",
"xenapponazure.com",
"discourse.group",
"discourse.team",
"virtueeldomein.nl",
"cleverapps.io",
"*.lcl.dev",
"*.stg.dev",
"c66.me",
"cloud66.ws",
"cloud66.zone",
"jdevcloud.com",
"wpdevcloud.com",
"cloudaccess.host",
"freesite.host",
"cloudaccess.net",
"cloudcontrolled.com",
"cloudcontrolapp.com",
"cloudera.site",
"trycloudflare.com",
"workers.dev",
"wnext.app",
"co.ca",
"*.otap.co",
"co.cz",
"c.cdn77.org",
"cdn77-ssl.net",
"r.cdn77.net",
"rsc.cdn77.org",
"ssl.origin.cdn77-secure.org",
"cloudns.asia",
"cloudns.biz",
"cloudns.club",
"cloudns.cc",
"cloudns.eu",
"cloudns.in",
"cloudns.info",
"cloudns.org",
"cloudns.pro",
"cloudns.pw",
"cloudns.us",
"cloudeity.net",
"cnpy.gdn",
"co.nl",
"co.no",
"webhosting.be",
"hosting-cluster.nl",
"ac.ru",
"edu.ru",
"gov.ru",
"int.ru",
"mil.ru",
"test.ru",
"dyn.cosidns.de",
"dynamisches-dns.de",
"dnsupdater.de",
"internet-dns.de",
"l-o-g-i-n.de",
"dynamic-dns.info",
"feste-ip.net",
"knx-server.net",
"static-access.net",
"realm.cz",
"*.cryptonomic.net",
"cupcake.is",
"*.customer-oci.com",
"*.oci.customer-oci.com",
"*.ocp.customer-oci.com",
"*.ocs.customer-oci.com",
"cyon.link",
"cyon.site",
"daplie.me",
"localhost.daplie.me",
"dattolocal.com",
"dattorelay.com",
"dattoweb.com",
"mydatto.com",
"dattolocal.net",
"mydatto.net",
"biz.dk",
"co.dk",
"firm.dk",
"reg.dk",
"store.dk",
"*.dapps.earth",
"*.bzz.dapps.earth",
"builtwithdark.com",
"edgestack.me",
"debian.net",
"dedyn.io",
"dnshome.de",
"online.th",
"shop.th",
"drayddns.com",
"dreamhosters.com",
"mydrobo.com",
"drud.io",
"drud.us",
"duckdns.org",
"dy.fi",
"tunk.org",
"dyndns-at-home.com",
"dyndns-at-work.com",
"dyndns-blog.com",
"dyndns-free.com",
"dyndns-home.com",
"dyndns-ip.com",
"dyndns-mail.com",
"dyndns-office.com",
"dyndns-pics.com",
"dyndns-remote.com",
"dyndns-server.com",
"dyndns-web.com",
"dyndns-wiki.com",
"dyndns-work.com",
"dyndns.biz",
"dyndns.info",
"dyndns.org",
"dyndns.tv",
"at-band-camp.net",
"ath.cx",
"barrel-of-knowledge.info",
"barrell-of-knowledge.info",
"better-than.tv",
"blogdns.com",
"blogdns.net",
"blogdns.org",
"blogsite.org",
"boldlygoingnowhere.org",
"broke-it.net",
"buyshouses.net",
"cechire.com",
"dnsalias.com",
"dnsalias.net",
"dnsalias.org",
"dnsdojo.com",
"dnsdojo.net",
"dnsdojo.org",
"does-it.net",
"doesntexist.com",
"doesntexist.org",
"dontexist.com",
"dontexist.net",
"dontexist.org",
"doomdns.com",
"doomdns.org",
"dvrdns.org",
"dyn-o-saur.com",
"dynalias.com",
"dynalias.net",
"dynalias.org",
"dynathome.net",
"dyndns.ws",
"endofinternet.net",
"endofinternet.org",
"endoftheinternet.org",
"est-a-la-maison.com",
"est-a-la-masion.com",
"est-le-patron.com",
"est-mon-blogueur.com",
"for-better.biz",
"for-more.biz",
"for-our.info",
"for-some.biz",
"for-the.biz",
"forgot.her.name",
"forgot.his.name",
"from-ak.com",
"from-al.com",
"from-ar.com",
"from-az.net",
"from-ca.com",
"from-co.net",
"from-ct.com",
"from-dc.com",
"from-de.com",
"from-fl.com",
"from-ga.com",
"from-hi.com",
"from-ia.com",
"from-id.com",
"from-il.com",
"from-in.com",
"from-ks.com",
"from-ky.com",
"from-la.net",
"from-ma.com",
"from-md.com",
"from-me.org",
"from-mi.com",
"from-mn.com",
"from-mo.com",
"from-ms.com",
"from-mt.com",
"from-nc.com",
"from-nd.com",
"from-ne.com",
"from-nh.com",
"from-nj.com",
"from-nm.com",
"from-nv.com",
"from-ny.net",
"from-oh.com",
"from-ok.com",
"from-or.com",
"from-pa.com",
"from-pr.com",
"from-ri.com",
"from-sc.com",
"from-sd.com",
"from-tn.com",
"from-tx.com",
"from-ut.com",
"from-va.com",
"from-vt.com",
"from-wa.com",
"from-wi.com",
"from-wv.com",
"from-wy.com",
"ftpaccess.cc",
"fuettertdasnetz.de",
"game-host.org",
"game-server.cc",
"getmyip.com",
"gets-it.net",
"go.dyndns.org",
"gotdns.com",
"gotdns.org",
"groks-the.info",
"groks-this.info",
"ham-radio-op.net",
"here-for-more.info",
"hobby-site.com",
"hobby-site.org",
"home.dyndns.org",
"homedns.org",
"homeftp.net",
"homeftp.org",
"homeip.net",
"homelinux.com",
"homelinux.net",
"homelinux.org",
"homeunix.com",
"homeunix.net",
"homeunix.org",
"iamallama.com",
"in-the-band.net",
"is-a-anarchist.com",
"is-a-blogger.com",
"is-a-bookkeeper.com",
"is-a-bruinsfan.org",
"is-a-bulls-fan.com",
"is-a-candidate.org",
"is-a-caterer.com",
"is-a-celticsfan.org",
"is-a-chef.com",
"is-a-chef.net",
"is-a-chef.org",
"is-a-conservative.com",
"is-a-cpa.com",
"is-a-cubicle-slave.com",
"is-a-democrat.com",
"is-a-designer.com",
"is-a-doctor.com",
"is-a-financialadvisor.com",
"is-a-geek.com",
"is-a-geek.net",
"is-a-geek.org",
"is-a-green.com",
"is-a-guru.com",
"is-a-hard-worker.com",
"is-a-hunter.com",
"is-a-knight.org",
"is-a-landscaper.com",
"is-a-lawyer.com",
"is-a-liberal.com",
"is-a-libertarian.com",
"is-a-linux-user.org",
"is-a-llama.com",
"is-a-musician.com",
"is-a-nascarfan.com",
"is-a-nurse.com",
"is-a-painter.com",
"is-a-patsfan.org",
"is-a-personaltrainer.com",
"is-a-photographer.com",
"is-a-player.com",
"is-a-republican.com",
"is-a-rockstar.com",
"is-a-socialist.com",
"is-a-soxfan.org",
"is-a-student.com",
"is-a-teacher.com",
"is-a-techie.com",
"is-a-therapist.com",
"is-an-accountant.com",
"is-an-actor.com",
"is-an-actress.com",
"is-an-anarchist.com",
"is-an-artist.com",
"is-an-engineer.com",
"is-an-entertainer.com",
"is-by.us",
"is-certified.com",
"is-found.org",
"is-gone.com",
"is-into-anime.com",
"is-into-cars.com",
"is-into-cartoons.com",
"is-into-games.com",
"is-leet.com",
"is-lost.org",
"is-not-certified.com",
"is-saved.org",
"is-slick.com",
"is-uberleet.com",
"is-very-bad.org",
"is-very-evil.org",
"is-very-good.org",
"is-very-nice.org",
"is-very-sweet.org",
"is-with-theband.com",
"isa-geek.com",
"isa-geek.net",
"isa-geek.org",
"isa-hockeynut.com",
"issmarterthanyou.com",
"isteingeek.de",
"istmein.de",
"kicks-ass.net",
"kicks-ass.org",
"knowsitall.info",
"land-4-sale.us",
"lebtimnetz.de",
"leitungsen.de",
"likes-pie.com",
"likescandy.com",
"merseine.nu",
"mine.nu",
"misconfused.org",
"mypets.ws",
"myphotos.cc",
"neat-url.com",
"office-on-the.net",
"on-the-web.tv",
"podzone.net",
"podzone.org",
"readmyblog.org",
"saves-the-whales.com",
"scrapper-site.net",
"scrapping.cc",
"selfip.biz",
"selfip.com",
"selfip.info",
"selfip.net",
"selfip.org",
"sells-for-less.com",
"sells-for-u.com",
"sells-it.net",
"sellsyourhome.org",
"servebbs.com",
"servebbs.net",
"servebbs.org",
"serveftp.net",
"serveftp.org",
"servegame.org",
"shacknet.nu",
"simple-url.com",
"space-to-rent.com",
"stuff-4-sale.org",
"stuff-4-sale.us",
"teaches-yoga.com",
"thruhere.net",
"traeumtgerade.de",
"webhop.biz",
"webhop.info",
"webhop.net",
"webhop.org",
"worse-than.tv",
"writesthisblog.com",
"ddnss.de",
"dyn.ddnss.de",
"dyndns.ddnss.de",
"dyndns1.de",
"dyn-ip24.de",
"home-webserver.de",
"dyn.home-webserver.de",
"myhome-server.de",
"ddnss.org",
"definima.net",
"definima.io",
"bci.dnstrace.pro",
"ddnsfree.com",
"ddnsgeek.com",
"giize.com",
"gleeze.com",
"kozow.com",
"loseyourip.com",
"ooguy.com",
"theworkpc.com",
"casacam.net",
"dynu.net",
"accesscam.org",
"camdvr.org",
"freeddns.org",
"mywire.org",
"webredirect.org",
"myddns.rocks",
"blogsite.xyz",
"dynv6.net",
"e4.cz",
"en-root.fr",
"mytuleap.com",
"onred.one",
"staging.onred.one",
"enonic.io",
"customer.enonic.io",
"eu.org",
"al.eu.org",
"asso.eu.org",
"at.eu.org",
"au.eu.org",
"be.eu.org",
"bg.eu.org",
"ca.eu.org",
"cd.eu.org",
"ch.eu.org",
"cn.eu.org",
"cy.eu.org",
"cz.eu.org",
"de.eu.org",
"dk.eu.org",
"edu.eu.org",
"ee.eu.org",
"es.eu.org",
"fi.eu.org",
"fr.eu.org",
"gr.eu.org",
"hr.eu.org",
"hu.eu.org",
"ie.eu.org",
"il.eu.org",
"in.eu.org",
"int.eu.org",
"is.eu.org",
"it.eu.org",
"jp.eu.org",
"kr.eu.org",
"lt.eu.org",
"lu.eu.org",
"lv.eu.org",
"mc.eu.org",
"me.eu.org",
"mk.eu.org",
"mt.eu.org",
"my.eu.org",
"net.eu.org",
"ng.eu.org",
"nl.eu.org",
"no.eu.org",
"nz.eu.org",
"paris.eu.org",
"pl.eu.org",
"pt.eu.org",
"q-a.eu.org",
"ro.eu.org",
"ru.eu.org",
"se.eu.org",
"si.eu.org",
"sk.eu.org",
"tr.eu.org",
"uk.eu.org",
"us.eu.org",
"eu-1.evennode.com",
"eu-2.evennode.com",
"eu-3.evennode.com",
"eu-4.evennode.com",
"us-1.evennode.com",
"us-2.evennode.com",
"us-3.evennode.com",
"us-4.evennode.com",
"twmail.cc",
"twmail.net",
"twmail.org",
"mymailer.com.tw",
"url.tw",
"apps.fbsbx.com",
"ru.net",
"adygeya.ru",
"bashkiria.ru",
"bir.ru",
"cbg.ru",
"com.ru",
"dagestan.ru",
"grozny.ru",
"kalmykia.ru",
"kustanai.ru",
"marine.ru",
"mordovia.ru",
"msk.ru",
"mytis.ru",
"nalchik.ru",
"nov.ru",
"pyatigorsk.ru",
"spb.ru",
"vladikavkaz.ru",
"vladimir.ru",
"abkhazia.su",
"adygeya.su",
"aktyubinsk.su",
"arkhangelsk.su",
"armenia.su",
"ashgabad.su",
"azerbaijan.su",
"balashov.su",
"bashkiria.su",
"bryansk.su",
"bukhara.su",
"chimkent.su",
"dagestan.su",
"east-kazakhstan.su",
"exnet.su",
"georgia.su",
"grozny.su",
"ivanovo.su",
"jambyl.su",
"kalmykia.su",
"kaluga.su",
"karacol.su",
"karaganda.su",
"karelia.su",
"khakassia.su",
"krasnodar.su",
"kurgan.su",
"kustanai.su",
"lenug.su",
"mangyshlak.su",
"mordovia.su",
"msk.su",
"murmansk.su",
"nalchik.su",
"navoi.su",
"north-kazakhstan.su",
"nov.su",
"obninsk.su",
"penza.su",
"pokrovsk.su",
"sochi.su",
"spb.su",
"tashkent.su",
"termez.su",
"togliatti.su",
"troitsk.su",
"tselinograd.su",
"tula.su",
"tuva.su",
"vladikavkaz.su",
"vladimir.su",
"vologda.su",
"channelsdvr.net",
"u.channelsdvr.net",
"fastly-terrarium.com",
"fastlylb.net",
"map.fastlylb.net",
"freetls.fastly.net",
"map.fastly.net",
"a.prod.fastly.net",
"global.prod.fastly.net",
"a.ssl.fastly.net",
"b.ssl.fastly.net",
"global.ssl.fastly.net",
"fastpanel.direct",
"fastvps-server.com",
"fhapp.xyz",
"fedorainfracloud.org",
"fedorapeople.org",
"cloud.fedoraproject.org",
"app.os.fedoraproject.org",
"app.os.stg.fedoraproject.org",
"mydobiss.com",
"filegear.me",
"filegear-au.me",
"filegear-de.me",
"filegear-gb.me",
"filegear-ie.me",
"filegear-jp.me",
"filegear-sg.me",
"firebaseapp.com",
"flynnhub.com",
"flynnhosting.net",
"0e.vc",
"freebox-os.com",
"freeboxos.com",
"fbx-os.fr",
"fbxos.fr",
"freebox-os.fr",
"freeboxos.fr",
"freedesktop.org",
"*.futurecms.at",
"*.ex.futurecms.at",
"*.in.futurecms.at",
"futurehosting.at",
"futuremailing.at",
"*.ex.ortsinfo.at",
"*.kunden.ortsinfo.at",
"*.statics.cloud",
"service.gov.uk",
"gehirn.ne.jp",
"usercontent.jp",
"gentapps.com",
"lab.ms",
"github.io",
"githubusercontent.com",
"gitlab.io",
"glitch.me",
"lolipop.io",
"cloudapps.digital",
"london.cloudapps.digital",
"homeoffice.gov.uk",
"ro.im",
"shop.ro",
"goip.de",
"run.app",
"a.run.app",
"web.app",
"*.0emm.com",
"appspot.com",
"*.r.appspot.com",
"blogspot.ae",
"blogspot.al",
"blogspot.am",
"blogspot.ba",
"blogspot.be",
"blogspot.bg",
"blogspot.bj",
"blogspot.ca",
"blogspot.cf",
"blogspot.ch",
"blogspot.cl",
"blogspot.co.at",
"blogspot.co.id",
"blogspot.co.il",
"blogspot.co.ke",
"blogspot.co.nz",
"blogspot.co.uk",
"blogspot.co.za",
"blogspot.com",
"blogspot.com.ar",
"blogspot.com.au",
"blogspot.com.br",
"blogspot.com.by",
"blogspot.com.co",
"blogspot.com.cy",
"blogspot.com.ee",
"blogspot.com.eg",
"blogspot.com.es",
"blogspot.com.mt",
"blogspot.com.ng",
"blogspot.com.tr",
"blogspot.com.uy",
"blogspot.cv",
"blogspot.cz",
"blogspot.de",
"blogspot.dk",
"blogspot.fi",
"blogspot.fr",
"blogspot.gr",
"blogspot.hk",
"blogspot.hr",
"blogspot.hu",
"blogspot.ie",
"blogspot.in",
"blogspot.is",
"blogspot.it",
"blogspot.jp",
"blogspot.kr",
"blogspot.li",
"blogspot.lt",
"blogspot.lu",
"blogspot.md",
"blogspot.mk",
"blogspot.mr",
"blogspot.mx",
"blogspot.my",
"blogspot.nl",
"blogspot.no",
"blogspot.pe",
"blogspot.pt",
"blogspot.qa",
"blogspot.re",
"blogspot.ro",
"blogspot.rs",
"blogspot.ru",
"blogspot.se",
"blogspot.sg",
"blogspot.si",
"blogspot.sk",
"blogspot.sn",
"blogspot.td",
"blogspot.tw",
"blogspot.ug",
"blogspot.vn",
"cloudfunctions.net",
"cloud.goog",
"codespot.com",
"googleapis.com",
"googlecode.com",
"pagespeedmobilizer.com",
"publishproxy.com",
"withgoogle.com",
"withyoutube.com",
"awsmppl.com",
"fin.ci",
"free.hr",
"caa.li",
"ua.rs",
"conf.se",
"hs.zone",
"hs.run",
"hashbang.sh",
"hasura.app",
"hasura-app.io",
"hepforge.org",
"herokuapp.com",
"herokussl.com",
"myravendb.com",
"ravendb.community",
"ravendb.me",
"development.run",
"ravendb.run",
"bpl.biz",
"orx.biz",
"ng.city",
"biz.gl",
"ng.ink",
"col.ng",
"firm.ng",
"gen.ng",
"ltd.ng",
"ngo.ng",
"ng.school",
"sch.so",
"hÃ¤kkinen.fi",
"*.moonscale.io",
"moonscale.net",
"iki.fi",
"dyn-berlin.de",
"in-berlin.de",
"in-brb.de",
"in-butter.de",
"in-dsl.de",
"in-dsl.net",
"in-dsl.org",
"in-vpn.de",
"in-vpn.net",
"in-vpn.org",
"biz.at",
"info.at",
"info.cx",
"ac.leg.br",
"al.leg.br",
"am.leg.br",
"ap.leg.br",
"ba.leg.br",
"ce.leg.br",
"df.leg.br",
"es.leg.br",
"go.leg.br",
"ma.leg.br",
"mg.leg.br",
"ms.leg.br",
"mt.leg.br",
"pa.leg.br",
"pb.leg.br",
"pe.leg.br",
"pi.leg.br",
"pr.leg.br",
"rj.leg.br",
"rn.leg.br",
"ro.leg.br",
"rr.leg.br",
"rs.leg.br",
"sc.leg.br",
"se.leg.br",
"sp.leg.br",
"to.leg.br",
"pixolino.com",
"ipifony.net",
"mein-iserv.de",
"test-iserv.de",
"iserv.dev",
"iobb.net",
"myjino.ru",
"*.hosting.myjino.ru",
"*.landing.myjino.ru",
"*.spectrum.myjino.ru",
"*.vps.myjino.ru",
"*.triton.zone",
"*.cns.joyent.com",
"js.org",
"kaas.gg",
"khplay.nl",
"keymachine.de",
"kinghost.net",
"uni5.net",
"knightpoint.systems",
"oya.to",
"co.krd",
"edu.krd",
"git-repos.de",
"lcube-server.de",
"svn-repos.de",
"leadpages.co",
"lpages.co",
"lpusercontent.com",
"lelux.site",
"co.business",
"co.education",
"co.events",
"co.financial",
"co.network",
"co.place",
"co.technology",
"app.lmpm.com",
"linkitools.space",
"linkyard.cloud",
"linkyard-cloud.ch",
"members.linode.com",
"nodebalancer.linode.com",
"we.bs",
"loginline.app",
"loginline.dev",
"loginline.io",
"loginline.services",
"loginline.site",
"krasnik.pl",
"leczna.pl",
"lubartow.pl",
"lublin.pl",
"poniatowa.pl",
"swidnik.pl",
"uklugs.org",
"glug.org.uk",
"lug.org.uk",
"lugs.org.uk",
"barsy.bg",
"barsy.co.uk",
"barsyonline.co.uk",
"barsycenter.com",
"barsyonline.com",
"barsy.club",
"barsy.de",
"barsy.eu",
"barsy.in",
"barsy.info",
"barsy.io",
"barsy.me",
"barsy.menu",
"barsy.mobi",
"barsy.net",
"barsy.online",
"barsy.org",
"barsy.pro",
"barsy.pub",
"barsy.shop",
"barsy.site",
"barsy.support",
"barsy.uk",
"*.magentosite.cloud",
"mayfirst.info",
"mayfirst.org",
"hb.cldmail.ru",
"miniserver.com",
"memset.net",
"cloud.metacentrum.cz",
"custom.metacentrum.cz",
"flt.cloud.muni.cz",
"usr.cloud.muni.cz",
"meteorapp.com",
"eu.meteorapp.com",
"co.pl",
"azurecontainer.io",
"azurewebsites.net",
"azure-mobile.net",
"cloudapp.net",
"mozilla-iot.org",
"bmoattachments.org",
"net.ru",
"org.ru",
"pp.ru",
"ui.nabu.casa",
"pony.club",
"of.fashion",
"on.fashion",
"of.football",
"in.london",
"of.london",
"for.men",
"and.mom",
"for.mom",
"for.one",
"for.sale",
"of.work",
"to.work",
"nctu.me",
"bitballoon.com",
"netlify.com",
"4u.com",
"ngrok.io",
"nh-serv.co.uk",
"nfshost.com",
"dnsking.ch",
"mypi.co",
"n4t.co",
"001www.com",
"ddnslive.com",
"myiphost.com",
"forumz.info",
"16-b.it",
"32-b.it",
"64-b.it",
"soundcast.me",
"tcp4.me",
"dnsup.net",
"hicam.net",
"now-dns.net",
"ownip.net",
"vpndns.net",
"dynserv.org",
"now-dns.org",
"x443.pw",
"now-dns.top",
"ntdll.top",
"freeddns.us",
"crafting.xyz",
"zapto.xyz",
"nsupdate.info",
"nerdpol.ovh",
"blogsyte.com",
"brasilia.me",
"cable-modem.org",
"ciscofreak.com",
"collegefan.org",
"couchpotatofries.org",
"damnserver.com",
"ddns.me",
"ditchyourip.com",
"dnsfor.me",
"dnsiskinky.com",
"dvrcam.info",
"dynns.com",
"eating-organic.net",
"fantasyleague.cc",
"geekgalaxy.com",
"golffan.us",
"health-carereform.com",
"homesecuritymac.com",
"homesecuritypc.com",
"hopto.me",
"ilovecollege.info",
"loginto.me",
"mlbfan.org",
"mmafan.biz",
"myactivedirectory.com",
"mydissent.net",
"myeffect.net",
"mymediapc.net",
"mypsx.net",
"mysecuritycamera.com",
"mysecuritycamera.net",
"mysecuritycamera.org",
"net-freaks.com",
"nflfan.org",
"nhlfan.net",
"no-ip.ca",
"no-ip.co.uk",
"no-ip.net",
"noip.us",
"onthewifi.com",
"pgafan.net",
"point2this.com",
"pointto.us",
"privatizehealthinsurance.net",
"quicksytes.com",
"read-books.org",
"securitytactics.com",
"serveexchange.com",
"servehumour.com",
"servep2p.com",
"servesarcasm.com",
"stufftoread.com",
"ufcfan.org",
"unusualperson.com",
"workisboring.com",
"3utilities.com",
"bounceme.net",
"ddns.net",
"ddnsking.com",
"gotdns.ch",
"hopto.org",
"myftp.biz",
"myftp.org",
"myvnc.com",
"no-ip.biz",
"no-ip.info",
"no-ip.org",
"noip.me",
"redirectme.net",
"servebeer.com",
"serveblog.net",
"servecounterstrike.com",
"serveftp.com",
"servegame.com",
"servehalflife.com",
"servehttp.com",
"serveirc.com",
"serveminecraft.net",
"servemp3.com",
"servepics.com",
"servequake.com",
"sytes.net",
"webhop.me",
"zapto.org",
"stage.nodeart.io",
"nodum.co",
"nodum.io",
"pcloud.host",
"nyc.mn",
"nom.ae",
"nom.af",
"nom.ai",
"nom.al",
"nym.by",
"nom.bz",
"nym.bz",
"nom.cl",
"nym.ec",
"nom.gd",
"nom.ge",
"nom.gl",
"nym.gr",
"nom.gt",
"nym.gy",
"nym.hk",
"nom.hn",
"nym.ie",
"nom.im",
"nom.ke",
"nym.kz",
"nym.la",
"nym.lc",
"nom.li",
"nym.li",
"nym.lt",
"nym.lu",
"nom.lv",
"nym.me",
"nom.mk",
"nym.mn",
"nym.mx",
"nom.nu",
"nym.nz",
"nym.pe",
"nym.pt",
"nom.pw",
"nom.qa",
"nym.ro",
"nom.rs",
"nom.si",
"nym.sk",
"nom.st",
"nym.su",
"nym.sx",
"nom.tj",
"nym.tw",
"nom.ug",
"nom.uy",
"nom.vc",
"nom.vg",
"static.observableusercontent.com",
"cya.gg",
"cloudycluster.net",
"nid.io",
"opencraft.hosting",
"operaunite.com",
"skygearapp.com",
"outsystemscloud.com",
"ownprovider.com",
"own.pm",
"ox.rs",
"oy.lc",
"pgfog.com",
"pagefrontapp.com",
"art.pl",
"gliwice.pl",
"krakow.pl",
"poznan.pl",
"wroc.pl",
"zakopane.pl",
"pantheonsite.io",
"gotpantheon.com",
"mypep.link",
"perspecta.cloud",
"on-web.fr",
"*.platform.sh",
"*.platformsh.site",
"dyn53.io",
"co.bn",
"xen.prgmr.com",
"priv.at",
"prvcy.page",
"*.dweb.link",
"protonet.io",
"chirurgiens-dentistes-en-france.fr",
"byen.site",
"pubtls.org",
"qualifioapp.com",
"qbuser.com",
"instantcloud.cn",
"ras.ru",
"qa2.com",
"qcx.io",
"*.sys.qcx.io",
"dev-myqnapcloud.com",
"alpha-myqnapcloud.com",
"myqnapcloud.com",
"*.quipelements.com",
"vapor.cloud",
"vaporcloud.io",
"rackmaze.com",
"rackmaze.net",
"*.on-k3s.io",
"*.on-rancher.cloud",
"*.on-rio.io",
"readthedocs.io",
"rhcloud.com",
"app.render.com",
"onrender.com",
"repl.co",
"repl.run",
"resindevice.io",
"devices.resinstaging.io",
"hzc.io",
"wellbeingzone.eu",
"ptplus.fit",
"wellbeingzone.co.uk",
"git-pages.rit.edu",
"sandcats.io",
"logoip.de",
"logoip.com",
"schokokeks.net",
"gov.scot",
"scrysec.com",
"firewall-gateway.com",
"firewall-gateway.de",
"my-gateway.de",
"my-router.de",
"spdns.de",
"spdns.eu",
"firewall-gateway.net",
"my-firewall.org",
"myfirewall.org",
"spdns.org",
"senseering.net",
"biz.ua",
"co.ua",
"pp.ua",
"shiftedit.io",
"myshopblocks.com",
"shopitsite.com",
"mo-siemens.io",
"1kapp.com",
"appchizi.com",
"applinzi.com",
"sinaapp.com",
"vipsinaapp.com",
"siteleaf.net",
"bounty-full.com",
"alpha.bounty-full.com",
"beta.bounty-full.com",
"stackhero-network.com",
"static.land",
"dev.static.land",
"sites.static.land",
"apps.lair.io",
"*.stolos.io",
"spacekit.io",
"customer.speedpartner.de",
"api.stdlib.com",
"storj.farm",
"utwente.io",
"soc.srcf.net",
"user.srcf.net",
"temp-dns.com",
"applicationcloud.io",
"scapp.io",
"*.s5y.io",
"*.sensiosite.cloud",
"syncloud.it",
"diskstation.me",
"dscloud.biz",
"dscloud.me",
"dscloud.mobi",
"dsmynas.com",
"dsmynas.net",
"dsmynas.org",
"familyds.com",
"familyds.net",
"familyds.org",
"i234.me",
"myds.me",
"synology.me",
"vpnplus.to",
"direct.quickconnect.to",
"taifun-dns.de",
"gda.pl",
"gdansk.pl",
"gdynia.pl",
"med.pl",
"sopot.pl",
"edugit.org",
"telebit.app",
"telebit.io",
"*.telebit.xyz",
"gwiddle.co.uk",
"thingdustdata.com",
"cust.dev.thingdust.io",
"cust.disrec.thingdust.io",
"cust.prod.thingdust.io",
"cust.testing.thingdust.io",
"arvo.network",
"azimuth.network",
"bloxcms.com",
"townnews-staging.com",
"12hp.at",
"2ix.at",
"4lima.at",
"lima-city.at",
"12hp.ch",
"2ix.ch",
"4lima.ch",
"lima-city.ch",
"trafficplex.cloud",
"de.cool",
"12hp.de",
"2ix.de",
"4lima.de",
"lima-city.de",
"1337.pictures",
"clan.rip",
"lima-city.rocks",
"webspace.rocks",
"lima.zone",
"*.transurl.be",
"*.transurl.eu",
"*.transurl.nl",
"tuxfamily.org",
"dd-dns.de",
"diskstation.eu",
"diskstation.org",
"dray-dns.de",
"draydns.de",
"dyn-vpn.de",
"dynvpn.de",
"mein-vigor.de",
"my-vigor.de",
"my-wan.de",
"syno-ds.de",
"synology-diskstation.de",
"synology-ds.de",
"uber.space",
"*.uberspace.de",
"hk.com",
"hk.org",
"ltd.hk",
"inc.hk",
"virtualuser.de",
"virtual-user.de",
"urown.cloud",
"dnsupdate.info",
"lib.de.us",
"2038.io",
"router.management",
"v-info.info",
"voorloper.cloud",
"v.ua",
"wafflecell.com",
"*.webhare.dev",
"wedeploy.io",
"wedeploy.me",
"wedeploy.sh",
"remotewd.com",
"wmflabs.org",
"myforum.community",
"community-pro.de",
"diskussionsbereich.de",
"community-pro.net",
"meinforum.net",
"half.host",
"xnbay.com",
"u2.xnbay.com",
"u2-local.xnbay.com",
"cistron.nl",
"demon.nl",
"xs4all.space",
"yandexcloud.net",
"storage.yandexcloud.net",
"website.yandexcloud.net",
"official.academy",
"yolasite.com",
"ybo.faith",
"yombo.me",
"homelink.one",
"ybo.party",
"ybo.review",
"ybo.science",
"ybo.trade",
"nohost.me",
"noho.st",
"za.net",
"za.org",
"now.sh",
"bss.design",
"basicserver.io",
"virtualserver.io",
"enterprisecloud.nu"
]The MIT License (MIT)

Copyright (c) 2014 Mathias Buus

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.var once = require('once')
var eos = require('end-of-stream')
var fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes

var noop = function () {}
var ancient = /^v?\.0/.test(process.version)

var isFn = function (fn) {
  return typeof fn === 'function'
}

var isFS = function (stream) {
  if (!ancient) return false // newer node version do not need to care about fs is a special way
  if (!fs) return false // browser
  return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close)
}

var isRequest = function (stream) {
  return stream.setHeader && isFn(stream.abort)
}

var destroyer = function (stream, reading, writing, callback) {
  callback = once(callback)

  var closed = false
  stream.on('close', function () {
    closed = true
  })

  eos(stream, {readable: reading, writable: writing}, function (err) {
    if (err) return callback(err)
    closed = true
    callback()
  })

  var destroyed = false
  return function (err) {
    if (closed) return
    if (destroyed) return
    destroyed = true

    if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks
    if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want

    if (isFn(stream.destroy)) return stream.destroy()

    callback(err || new Error('stream was destroyed'))
  }
}

var call = function (fn) {
  fn()
}

var pipe = function (from, to) {
  return from.pipe(to)
}

var pump = function () {
  var streams = Array.prototype.slice.call(arguments)
  var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop

  if (Array.isArray(streams[0])) streams = streams[0]
  if (streams.length < 2) throw new Error('pump requires two streams per minimum')

  var error
  var destroys = streams.map(function (stream, i) {
    var reading = i < streams.length - 1
    var writing = i > 0
    return destroyer(stream, reading, writing, function (err) {
      if (!error) error = err
      if (err) destroys.forEach(call)
      if (reading) return
      destroys.forEach(call)
      callback(error)
    })
  })

  return streams.reduce(pipe)
}

module.exports = pump
{
  "author": {
    "name": "Mathias Buus Madsen",
    "email": "mathiasbuus@gmail.com"
  },
  "browser": {
    "fs": false
  },
  "dependencies": {
    "end-of-stream": "^1.1.0",
    "once": "^1.3.1"
  },
  "deprecated": false,
  "description": "pipe streams together and close all of them if one of them closes",
  "homepage": "https://github.com/mafintosh/pump#readme",
  "license": "MIT",
  "name": "pump",
  "repository": {
    "type": "git",
    "url": "git://github.com/mafintosh/pump.git"
  },
  "version": "3.0.0"
}var stream = require('stream')
var pump = require('./index')

var rs = new stream.Readable()
var ws = new stream.Writable()

rs._read = function (size) {
  this.push(Buffer(size).fill('abc'))
}

ws._write = function (chunk, encoding, cb) {
  setTimeout(function () {
    cb()
  }, 100)
}

var toHex = function () {
  var reverse = new (require('stream').Transform)()

  reverse._transform = function (chunk, enc, callback) {
    reverse.push(chunk.toString('hex'))
    callback()
  }

  return reverse
}

var wsClosed = false
var rsClosed = false
var callbackCalled = false

var check = function () {
  if (wsClosed && rsClosed && callbackCalled) {
    console.log('test-browser.js passes')
    clearTimeout(timeout)
  }
}

ws.on('finish', function () {
  wsClosed = true
  check()
})

rs.on('end', function () {
  rsClosed = true
  check()
})

var res = pump(rs, toHex(), toHex(), toHex(), ws, function () {
  callbackCalled = true
  check()
})

if (res !== ws) {
  throw new Error('should return last stream')
}

setTimeout(function () {
  rs.push(null)
  rs.emit('close')
}, 1000)

var timeout = setTimeout(function () {
  check()
  throw new Error('timeout')
}, 5000)
var pump = require('./index')

var rs = require('fs').createReadStream('/dev/random')
var ws = require('fs').createWriteStream('/dev/null')

var toHex = function () {
  var reverse = new (require('stream').Transform)()

  reverse._transform = function (chunk, enc, callback) {
    reverse.push(chunk.toString('hex'))
    callback()
  }

  return reverse
}

var wsClosed = false
var rsClosed = false
var callbackCalled = false

var check = function () {
  if (wsClosed && rsClosed && callbackCalled) {
    console.log('test-node.js passes')
    clearTimeout(timeout)
  }
}

ws.on('close', function () {
  wsClosed = true
  check()
})

rs.on('close', function () {
  rsClosed = true
  check()
})

var res = pump(rs, toHex(), toHex(), toHex(), ws, function () {
  callbackCalled = true
  check()
})

if (res !== ws) {
  throw new Error('should return last stream')
}

setTimeout(function () {
  rs.destroy()
}, 1000)

var timeout = setTimeout(function () {
  throw new Error('timeout')
}, 5000)
Copyright Mathias Bynens <https://mathiasbynens.be/>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Mathias Bynens",
    "url": "https://mathiasbynens.be/"
  },
  "deprecated": false,
  "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.",
  "devDependencies": {
    "codecov": "^1.0.1",
    "istanbul": "^0.4.1",
    "mocha": "^2.5.3"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "LICENSE-MIT.txt",
    "punycode.js",
    "punycode.es6.js"
  ],
  "homepage": "https://mths.be/punycode",
  "jsnext:main": "punycode.es6.js",
  "license": "MIT",
  "main": "punycode.js",
  "module": "punycode.es6.js",
  "name": "punycode",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/bestiejs/punycode.js.git"
  },
  "version": "2.1.1"
}'use strict';

/** Highest positive signed 32-bit float value */
const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1

/** Bootstring parameters */
const base = 36;
const tMin = 1;
const tMax = 26;
const skew = 38;
const damp = 700;
const initialBias = 72;
const initialN = 128; // 0x80
const delimiter = '-'; // '\x2D'

/** Regular expressions */
const regexPunycode = /^xn--/;
const regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars
const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators

/** Error messages */
const errors = {
	'overflow': 'Overflow: input needs wider integers to process',
	'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
	'invalid-input': 'Invalid input'
};

/** Convenience shortcuts */
const baseMinusTMin = base - tMin;
const floor = Math.floor;
const stringFromCharCode = String.fromCharCode;

/*--------------------------------------------------------------------------*/

/**
 * A generic error utility function.
 * @private
 * @param {String} type The error type.
 * @returns {Error} Throws a `RangeError` with the applicable error message.
 */
function error(type) {
	throw new RangeError(errors[type]);
}

/**
 * A generic `Array#map` utility function.
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} callback The function that gets called for every array
 * item.
 * @returns {Array} A new array of values returned by the callback function.
 */
function map(array, fn) {
	const result = [];
	let length = array.length;
	while (length--) {
		result[length] = fn(array[length]);
	}
	return result;
}

/**
 * A simple `Array#map`-like wrapper to work with domain name strings or email
 * addresses.
 * @private
 * @param {String} domain The domain name or email address.
 * @param {Function} callback The function that gets called for every
 * character.
 * @returns {Array} A new string of characters returned by the callback
 * function.
 */
function mapDomain(string, fn) {
	const parts = string.split('@');
	let result = '';
	if (parts.length > 1) {
		// In email addresses, only the domain name should be punycoded. Leave
		// the local part (i.e. everything up to `@`) intact.
		result = parts[0] + '@';
		string = parts[1];
	}
	// Avoid `split(regex)` for IE8 compatibility. See #17.
	string = string.replace(regexSeparators, '\x2E');
	const labels = string.split('.');
	const encoded = map(labels, fn).join('.');
	return result + encoded;
}

/**
 * Creates an array containing the numeric code points of each Unicode
 * character in the string. While JavaScript uses UCS-2 internally,
 * this function will convert a pair of surrogate halves (each of which
 * UCS-2 exposes as separate characters) into a single code point,
 * matching UTF-16.
 * @see `punycode.ucs2.encode`
 * @see <https://mathiasbynens.be/notes/javascript-encoding>
 * @memberOf punycode.ucs2
 * @name decode
 * @param {String} string The Unicode input string (UCS-2).
 * @returns {Array} The new array of code points.
 */
function ucs2decode(string) {
	const output = [];
	let counter = 0;
	const length = string.length;
	while (counter < length) {
		const value = string.charCodeAt(counter++);
		if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
			// It's a high surrogate, and there is a next character.
			const extra = string.charCodeAt(counter++);
			if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.
				output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
			} else {
				// It's an unmatched surrogate; only append this code unit, in case the
				// next code unit is the high surrogate of a surrogate pair.
				output.push(value);
				counter--;
			}
		} else {
			output.push(value);
		}
	}
	return output;
}

/**
 * Creates a string based on an array of numeric code points.
 * @see `punycode.ucs2.decode`
 * @memberOf punycode.ucs2
 * @name encode
 * @param {Array} codePoints The array of numeric code points.
 * @returns {String} The new Unicode string (UCS-2).
 */
const ucs2encode = array => String.fromCodePoint(...array);

/**
 * Converts a basic code point into a digit/integer.
 * @see `digitToBasic()`
 * @private
 * @param {Number} codePoint The basic numeric code point value.
 * @returns {Number} The numeric value of a basic code point (for use in
 * representing integers) in the range `0` to `base - 1`, or `base` if
 * the code point does not represent a value.
 */
const basicToDigit = function(codePoint) {
	if (codePoint - 0x30 < 0x0A) {
		return codePoint - 0x16;
	}
	if (codePoint - 0x41 < 0x1A) {
		return codePoint - 0x41;
	}
	if (codePoint - 0x61 < 0x1A) {
		return codePoint - 0x61;
	}
	return base;
};

/**
 * Converts a digit/integer into a basic code point.
 * @see `basicToDigit()`
 * @private
 * @param {Number} digit The numeric value of a basic code point.
 * @returns {Number} The basic code point whose value (when used for
 * representing integers) is `digit`, which needs to be in the range
 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
 * used; else, the lowercase form is used. The behavior is undefined
 * if `flag` is non-zero and `digit` has no uppercase form.
 */
const digitToBasic = function(digit, flag) {
	//  0..25 map to ASCII a..z or A..Z
	// 26..35 map to ASCII 0..9
	return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
};

/**
 * Bias adaptation function as per section 3.4 of RFC 3492.
 * https://tools.ietf.org/html/rfc3492#section-3.4
 * @private
 */
const adapt = function(delta, numPoints, firstTime) {
	let k = 0;
	delta = firstTime ? floor(delta / damp) : delta >> 1;
	delta += floor(delta / numPoints);
	for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
		delta = floor(delta / baseMinusTMin);
	}
	return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
};

/**
 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
 * symbols.
 * @memberOf punycode
 * @param {String} input The Punycode string of ASCII-only symbols.
 * @returns {String} The resulting string of Unicode symbols.
 */
const decode = function(input) {
	// Don't use UCS-2.
	const output = [];
	const inputLength = input.length;
	let i = 0;
	let n = initialN;
	let bias = initialBias;

	// Handle the basic code points: let `basic` be the number of input code
	// points before the last delimiter, or `0` if there is none, then copy
	// the first basic code points to the output.

	let basic = input.lastIndexOf(delimiter);
	if (basic < 0) {
		basic = 0;
	}

	for (let j = 0; j < basic; ++j) {
		// if it's not a basic code point
		if (input.charCodeAt(j) >= 0x80) {
			error('not-basic');
		}
		output.push(input.charCodeAt(j));
	}

	// Main decoding loop: start just after the last delimiter if any basic code
	// points were copied; start at the beginning otherwise.

	for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {

		// `index` is the index of the next character to be consumed.
		// Decode a generalized variable-length integer into `delta`,
		// which gets added to `i`. The overflow checking is easier
		// if we increase `i` as we go, then subtract off its starting
		// value at the end to obtain `delta`.
		let oldi = i;
		for (let w = 1, k = base; /* no condition */; k += base) {

			if (index >= inputLength) {
				error('invalid-input');
			}

			const digit = basicToDigit(input.charCodeAt(index++));

			if (digit >= base || digit > floor((maxInt - i) / w)) {
				error('overflow');
			}

			i += digit * w;
			const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);

			if (digit < t) {
				break;
			}

			const baseMinusT = base - t;
			if (w > floor(maxInt / baseMinusT)) {
				error('overflow');
			}

			w *= baseMinusT;

		}

		const out = output.length + 1;
		bias = adapt(i - oldi, out, oldi == 0);

		// `i` was supposed to wrap around from `out` to `0`,
		// incrementing `n` each time, so we'll fix that now:
		if (floor(i / out) > maxInt - n) {
			error('overflow');
		}

		n += floor(i / out);
		i %= out;

		// Insert `n` at position `i` of the output.
		output.splice(i++, 0, n);

	}

	return String.fromCodePoint(...output);
};

/**
 * Converts a string of Unicode symbols (e.g. a domain name label) to a
 * Punycode string of ASCII-only symbols.
 * @memberOf punycode
 * @param {String} input The string of Unicode symbols.
 * @returns {String} The resulting Punycode string of ASCII-only symbols.
 */
const encode = function(input) {
	const output = [];

	// Convert the input in UCS-2 to an array of Unicode code points.
	input = ucs2decode(input);

	// Cache the length.
	let inputLength = input.length;

	// Initialize the state.
	let n = initialN;
	let delta = 0;
	let bias = initialBias;

	// Handle the basic code points.
	for (const currentValue of input) {
		if (currentValue < 0x80) {
			output.push(stringFromCharCode(currentValue));
		}
	}

	let basicLength = output.length;
	let handledCPCount = basicLength;

	// `handledCPCount` is the number of code points that have been handled;
	// `basicLength` is the number of basic code points.

	// Finish the basic string with a delimiter unless it's empty.
	if (basicLength) {
		output.push(delimiter);
	}

	// Main encoding loop:
	while (handledCPCount < inputLength) {

		// All non-basic code points < n have been handled already. Find the next
		// larger one:
		let m = maxInt;
		for (const currentValue of input) {
			if (currentValue >= n && currentValue < m) {
				m = currentValue;
			}
		}

		// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
		// but guard against overflow.
		const handledCPCountPlusOne = handledCPCount + 1;
		if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
			error('overflow');
		}

		delta += (m - n) * handledCPCountPlusOne;
		n = m;

		for (const currentValue of input) {
			if (currentValue < n && ++delta > maxInt) {
				error('overflow');
			}
			if (currentValue == n) {
				// Represent delta as a generalized variable-length integer.
				let q = delta;
				for (let k = base; /* no condition */; k += base) {
					const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
					if (q < t) {
						break;
					}
					const qMinusT = q - t;
					const baseMinusT = base - t;
					output.push(
						stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
					);
					q = floor(qMinusT / baseMinusT);
				}

				output.push(stringFromCharCode(digitToBasic(q, 0)));
				bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
				delta = 0;
				++handledCPCount;
			}
		}

		++delta;
		++n;

	}
	return output.join('');
};

/**
 * Converts a Punycode string representing a domain name or an email address
 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
 * it doesn't matter if you call it on a string that has already been
 * converted to Unicode.
 * @memberOf punycode
 * @param {String} input The Punycoded domain name or email address to
 * convert to Unicode.
 * @returns {String} The Unicode representation of the given Punycode
 * string.
 */
const toUnicode = function(input) {
	return mapDomain(input, function(string) {
		return regexPunycode.test(string)
			? decode(string.slice(4).toLowerCase())
			: string;
	});
};

/**
 * Converts a Unicode string representing a domain name or an email address to
 * Punycode. Only the non-ASCII parts of the domain name will be converted,
 * i.e. it doesn't matter if you call it with a domain that's already in
 * ASCII.
 * @memberOf punycode
 * @param {String} input The domain name or email address to convert, as a
 * Unicode string.
 * @returns {String} The Punycode representation of the given domain name or
 * email address.
 */
const toASCII = function(input) {
	return mapDomain(input, function(string) {
		return regexNonASCII.test(string)
			? 'xn--' + encode(string)
			: string;
	});
};

/*--------------------------------------------------------------------------*/

/** Define the public API */
const punycode = {
	/**
	 * A string representing the current Punycode.js version number.
	 * @memberOf punycode
	 * @type String
	 */
	'version': '2.1.0',
	/**
	 * An object of methods to convert from JavaScript's internal character
	 * representation (UCS-2) to Unicode code points, and back.
	 * @see <https://mathiasbynens.be/notes/javascript-encoding>
	 * @memberOf punycode
	 * @type Object
	 */
	'ucs2': {
		'decode': ucs2decode,
		'encode': ucs2encode
	},
	'decode': decode,
	'encode': encode,
	'toASCII': toASCII,
	'toUnicode': toUnicode
};

export { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode };
export default punycode;
'use strict';

/** Highest positive signed 32-bit float value */
const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1

/** Bootstring parameters */
const base = 36;
const tMin = 1;
const tMax = 26;
const skew = 38;
const damp = 700;
const initialBias = 72;
const initialN = 128; // 0x80
const delimiter = '-'; // '\x2D'

/** Regular expressions */
const regexPunycode = /^xn--/;
const regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars
const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators

/** Error messages */
const errors = {
	'overflow': 'Overflow: input needs wider integers to process',
	'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
	'invalid-input': 'Invalid input'
};

/** Convenience shortcuts */
const baseMinusTMin = base - tMin;
const floor = Math.floor;
const stringFromCharCode = String.fromCharCode;

/*--------------------------------------------------------------------------*/

/**
 * A generic error utility function.
 * @private
 * @param {String} type The error type.
 * @returns {Error} Throws a `RangeError` with the applicable error message.
 */
function error(type) {
	throw new RangeError(errors[type]);
}

/**
 * A generic `Array#map` utility function.
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} callback The function that gets called for every array
 * item.
 * @returns {Array} A new array of values returned by the callback function.
 */
function map(array, fn) {
	const result = [];
	let length = array.length;
	while (length--) {
		result[length] = fn(array[length]);
	}
	return result;
}

/**
 * A simple `Array#map`-like wrapper to work with domain name strings or email
 * addresses.
 * @private
 * @param {String} domain The domain name or email address.
 * @param {Function} callback The function that gets called for every
 * character.
 * @returns {Array} A new string of characters returned by the callback
 * function.
 */
function mapDomain(string, fn) {
	const parts = string.split('@');
	let result = '';
	if (parts.length > 1) {
		// In email addresses, only the domain name should be punycoded. Leave
		// the local part (i.e. everything up to `@`) intact.
		result = parts[0] + '@';
		string = parts[1];
	}
	// Avoid `split(regex)` for IE8 compatibility. See #17.
	string = string.replace(regexSeparators, '\x2E');
	const labels = string.split('.');
	const encoded = map(labels, fn).join('.');
	return result + encoded;
}

/**
 * Creates an array containing the numeric code points of each Unicode
 * character in the string. While JavaScript uses UCS-2 internally,
 * this function will convert a pair of surrogate halves (each of which
 * UCS-2 exposes as separate characters) into a single code point,
 * matching UTF-16.
 * @see `punycode.ucs2.encode`
 * @see <https://mathiasbynens.be/notes/javascript-encoding>
 * @memberOf punycode.ucs2
 * @name decode
 * @param {String} string The Unicode input string (UCS-2).
 * @returns {Array} The new array of code points.
 */
function ucs2decode(string) {
	const output = [];
	let counter = 0;
	const length = string.length;
	while (counter < length) {
		const value = string.charCodeAt(counter++);
		if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
			// It's a high surrogate, and there is a next character.
			const extra = string.charCodeAt(counter++);
			if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.
				output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
			} else {
				// It's an unmatched surrogate; only append this code unit, in case the
				// next code unit is the high surrogate of a surrogate pair.
				output.push(value);
				counter--;
			}
		} else {
			output.push(value);
		}
	}
	return output;
}

/**
 * Creates a string based on an array of numeric code points.
 * @see `punycode.ucs2.decode`
 * @memberOf punycode.ucs2
 * @name encode
 * @param {Array} codePoints The array of numeric code points.
 * @returns {String} The new Unicode string (UCS-2).
 */
const ucs2encode = array => String.fromCodePoint(...array);

/**
 * Converts a basic code point into a digit/integer.
 * @see `digitToBasic()`
 * @private
 * @param {Number} codePoint The basic numeric code point value.
 * @returns {Number} The numeric value of a basic code point (for use in
 * representing integers) in the range `0` to `base - 1`, or `base` if
 * the code point does not represent a value.
 */
const basicToDigit = function(codePoint) {
	if (codePoint - 0x30 < 0x0A) {
		return codePoint - 0x16;
	}
	if (codePoint - 0x41 < 0x1A) {
		return codePoint - 0x41;
	}
	if (codePoint - 0x61 < 0x1A) {
		return codePoint - 0x61;
	}
	return base;
};

/**
 * Converts a digit/integer into a basic code point.
 * @see `basicToDigit()`
 * @private
 * @param {Number} digit The numeric value of a basic code point.
 * @returns {Number} The basic code point whose value (when used for
 * representing integers) is `digit`, which needs to be in the range
 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
 * used; else, the lowercase form is used. The behavior is undefined
 * if `flag` is non-zero and `digit` has no uppercase form.
 */
const digitToBasic = function(digit, flag) {
	//  0..25 map to ASCII a..z or A..Z
	// 26..35 map to ASCII 0..9
	return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
};

/**
 * Bias adaptation function as per section 3.4 of RFC 3492.
 * https://tools.ietf.org/html/rfc3492#section-3.4
 * @private
 */
const adapt = function(delta, numPoints, firstTime) {
	let k = 0;
	delta = firstTime ? floor(delta / damp) : delta >> 1;
	delta += floor(delta / numPoints);
	for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
		delta = floor(delta / baseMinusTMin);
	}
	return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
};

/**
 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
 * symbols.
 * @memberOf punycode
 * @param {String} input The Punycode string of ASCII-only symbols.
 * @returns {String} The resulting string of Unicode symbols.
 */
const decode = function(input) {
	// Don't use UCS-2.
	const output = [];
	const inputLength = input.length;
	let i = 0;
	let n = initialN;
	let bias = initialBias;

	// Handle the basic code points: let `basic` be the number of input code
	// points before the last delimiter, or `0` if there is none, then copy
	// the first basic code points to the output.

	let basic = input.lastIndexOf(delimiter);
	if (basic < 0) {
		basic = 0;
	}

	for (let j = 0; j < basic; ++j) {
		// if it's not a basic code point
		if (input.charCodeAt(j) >= 0x80) {
			error('not-basic');
		}
		output.push(input.charCodeAt(j));
	}

	// Main decoding loop: start just after the last delimiter if any basic code
	// points were copied; start at the beginning otherwise.

	for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {

		// `index` is the index of the next character to be consumed.
		// Decode a generalized variable-length integer into `delta`,
		// which gets added to `i`. The overflow checking is easier
		// if we increase `i` as we go, then subtract off its starting
		// value at the end to obtain `delta`.
		let oldi = i;
		for (let w = 1, k = base; /* no condition */; k += base) {

			if (index >= inputLength) {
				error('invalid-input');
			}

			const digit = basicToDigit(input.charCodeAt(index++));

			if (digit >= base || digit > floor((maxInt - i) / w)) {
				error('overflow');
			}

			i += digit * w;
			const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);

			if (digit < t) {
				break;
			}

			const baseMinusT = base - t;
			if (w > floor(maxInt / baseMinusT)) {
				error('overflow');
			}

			w *= baseMinusT;

		}

		const out = output.length + 1;
		bias = adapt(i - oldi, out, oldi == 0);

		// `i` was supposed to wrap around from `out` to `0`,
		// incrementing `n` each time, so we'll fix that now:
		if (floor(i / out) > maxInt - n) {
			error('overflow');
		}

		n += floor(i / out);
		i %= out;

		// Insert `n` at position `i` of the output.
		output.splice(i++, 0, n);

	}

	return String.fromCodePoint(...output);
};

/**
 * Converts a string of Unicode symbols (e.g. a domain name label) to a
 * Punycode string of ASCII-only symbols.
 * @memberOf punycode
 * @param {String} input The string of Unicode symbols.
 * @returns {String} The resulting Punycode string of ASCII-only symbols.
 */
const encode = function(input) {
	const output = [];

	// Convert the input in UCS-2 to an array of Unicode code points.
	input = ucs2decode(input);

	// Cache the length.
	let inputLength = input.length;

	// Initialize the state.
	let n = initialN;
	let delta = 0;
	let bias = initialBias;

	// Handle the basic code points.
	for (const currentValue of input) {
		if (currentValue < 0x80) {
			output.push(stringFromCharCode(currentValue));
		}
	}

	let basicLength = output.length;
	let handledCPCount = basicLength;

	// `handledCPCount` is the number of code points that have been handled;
	// `basicLength` is the number of basic code points.

	// Finish the basic string with a delimiter unless it's empty.
	if (basicLength) {
		output.push(delimiter);
	}

	// Main encoding loop:
	while (handledCPCount < inputLength) {

		// All non-basic code points < n have been handled already. Find the next
		// larger one:
		let m = maxInt;
		for (const currentValue of input) {
			if (currentValue >= n && currentValue < m) {
				m = currentValue;
			}
		}

		// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
		// but guard against overflow.
		const handledCPCountPlusOne = handledCPCount + 1;
		if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
			error('overflow');
		}

		delta += (m - n) * handledCPCountPlusOne;
		n = m;

		for (const currentValue of input) {
			if (currentValue < n && ++delta > maxInt) {
				error('overflow');
			}
			if (currentValue == n) {
				// Represent delta as a generalized variable-length integer.
				let q = delta;
				for (let k = base; /* no condition */; k += base) {
					const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
					if (q < t) {
						break;
					}
					const qMinusT = q - t;
					const baseMinusT = base - t;
					output.push(
						stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
					);
					q = floor(qMinusT / baseMinusT);
				}

				output.push(stringFromCharCode(digitToBasic(q, 0)));
				bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
				delta = 0;
				++handledCPCount;
			}
		}

		++delta;
		++n;

	}
	return output.join('');
};

/**
 * Converts a Punycode string representing a domain name or an email address
 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
 * it doesn't matter if you call it on a string that has already been
 * converted to Unicode.
 * @memberOf punycode
 * @param {String} input The Punycoded domain name or email address to
 * convert to Unicode.
 * @returns {String} The Unicode representation of the given Punycode
 * string.
 */
const toUnicode = function(input) {
	return mapDomain(input, function(string) {
		return regexPunycode.test(string)
			? decode(string.slice(4).toLowerCase())
			: string;
	});
};

/**
 * Converts a Unicode string representing a domain name or an email address to
 * Punycode. Only the non-ASCII parts of the domain name will be converted,
 * i.e. it doesn't matter if you call it with a domain that's already in
 * ASCII.
 * @memberOf punycode
 * @param {String} input The domain name or email address to convert, as a
 * Unicode string.
 * @returns {String} The Punycode representation of the given domain name or
 * email address.
 */
const toASCII = function(input) {
	return mapDomain(input, function(string) {
		return regexNonASCII.test(string)
			? 'xn--' + encode(string)
			: string;
	});
};

/*--------------------------------------------------------------------------*/

/** Define the public API */
const punycode = {
	/**
	 * A string representing the current Punycode.js version number.
	 * @memberOf punycode
	 * @type String
	 */
	'version': '2.1.0',
	/**
	 * An object of methods to convert from JavaScript's internal character
	 * representation (UCS-2) to Unicode code points, and back.
	 * @see <https://mathiasbynens.be/notes/javascript-encoding>
	 * @memberOf punycode
	 * @type Object
	 */
	'ucs2': {
		'decode': ucs2decode,
		'encode': ucs2encode
	},
	'decode': decode,
	'encode': encode,
	'toASCII': toASCII,
	'toUnicode': toUnicode
};

module.exports = punycode;

## 1.5.1

 - Q.any now annotates its error message to clarify that Q.any was involved and
   includes only the last error emitted. (Ivan Etchart)
 - Avoid domain.dispose during tests in preparation for Node.js 9. (Anna
   Henningsen)

## 1.5.0

 - Q.any gives an error message from the last rejected promise
 - Throw if callback supplied to "finally" is invalid (@grahamrhay)
 - Long stack trace improvements, can now construct long stack traces
   across rethrows.

## 1.4.1

 - Address an issue that prevented Q from being used as a `<script>` for
   Firefox add-ons. Q can now be used in any environment that provides `window`
   or `self` globals, favoring `window` since add-ons have an an immutable
   `self` that is distinct from `window`.

## 1.4.0

 - Add `noConflict` support for use in `<script>` (@jahnjw).

## 1.3.0

 - Add tracking for unhandled and handled rejections in Node.js (@benjamingr).

## 1.2.1

 - Fix Node.js environment detection for modern Browserify (@kahnjw).

## 1.2.0

 - Added Q.any(promisesArray) method (@vergara).
   Returns a promise fulfilled with the value of the first resolved promise in
   promisesArray. If all promises in promisesArray are rejected, it returns
   a rejected promise.

## 1.1.2

 - Removed extraneous files from the npm package by using the "files"
   whitelist in package.json instead of the .npmignore blacklist.
   (@anton-rudeshko)

## 1.1.1

 - Fix a pair of regressions in bootstrapping, one which precluded
   WebWorker support, and another that precluded support in
   ``<script>`` usage outright. #607

## 1.1.0

 - Adds support for enabling long stack traces in node.js by setting
   environment variable `Q_DEBUG=1`.
 - Introduces the `tap` method to promises, which will see a value
   pass through without alteration.
 - Use instanceof to recognize own promise instances as opposed to
   thenables.
 - Construct timeout errors with `code === ETIMEDOUT` (Kornel LesiÅ„ski)
 - More descriminant CommonJS module environment detection.
 - Dropped continuous integration for Node.js 0.6 and 0.8 because of
   changes to npm that preclude the use of new `^` version predicate
   operator in any transitive dependency.
 - Users can now override `Q.nextTick`.

## 1.0.1

 - Adds support for `Q.Promise`, which implements common usage of the
   ES6 `Promise` constructor and its methods. `Promise` does not have
   a valid promise constructor and a proper implementation awaits
   version 2 of Q.
 - Removes the console stopgap for a promise inspector. This no longer
   works with any degree of reliability.
 - Fixes support for content security policies that forbid eval. Now
   using the `StopIteration` global to distinguish SpiderMonkey
   generators from ES6 generators, assuming that they will never
   coexist.

## 1.0.0

:cake: This is all but a re-release of version 0.9, which has settled
into a gentle maintenance mode and rightly deserves an official 1.0.
An ambitious 2.0 release is already around the corner, but 0.9/1.0
have been distributed far and wide and demand long term support.

 - Q will now attempt to post a debug message in browsers regardless
   of whether window.Touch is defined. Chrome at least now has this
   property regardless of whether touch is supported by the underlying
   hardware.
 - Remove deprecation warning from `promise.valueOf`. The function is
   called by the browser in various ways so there is no way to
   distinguish usage that should be migrated from usage that cannot be
   altered.

## 0.9.7

 - :warning: `q.min.js` is no longer checked-in.  It is however still
   created by Grunt and NPM.
 - Fixes a bug that inhibited `Q.async` with implementations of the new
   ES6 generators.
 - Fixes a bug with `nextTick` affecting Safari 6.0.5 the first time a
   page loads when an `iframe` is involved.
 - Introduces `passByCopy`, `join`, and `race`.
 - Shows stack traces or error messages on the console, instead of
   `Error` objects.
 - Elimintates wrapper methods for improved performance.
 - `Q.all` now propagates progress notifications of the form you might
   expect of ES6 iterations, `{value, index}` where the `value` is the
   progress notification from the promise at `index`.

## 0.9.6

 - Fixes a bug in recognizing the difference between compatible Q
   promises, and Q promises from before the implementation of "inspect".
   The latter are now coerced.
 - Fixes an infinite asynchronous coercion cycle introduced by former
   solution, in two independently sufficient ways.  1.) All promises
   returned by makePromise now implement "inspect", albeit a default
   that reports that the promise has an "unknown" state.  2.) The
   implementation of "then/when" is now in "then" instead of "when", so
   that the responsibility to "coerce" the given promise rests solely in
   the "when" method and the "then" method may assume that "this" is a
   promise of the right type.
 - Refactors `nextTick` to use an unrolled microtask within Q regardless
   of how new ticks a requested. #316 @rkatic

## 0.9.5

 - Introduces `inspect` for getting the state of a promise as
   `{state: "fulfilled" | "rejected" | "pending", value | reason}`.
 - Introduces `allSettled` which produces an array of promises states
   for the input promises once they have all "settled".  This is in
   accordance with a discussion on Promises/A+ that "settled" refers to
   a promise that is "fulfilled" or "rejected".  "resolved" refers to a
   deferred promise that has been "resolved" to another promise,
   "sealing its fate" to the fate of the successor promise.
 - Long stack traces are now off by default.  Set `Q.longStackSupport`
   to true to enable long stack traces.
 - Long stack traces can now follow the entire asynchronous history of a
   promise, not just a single jump.
 - Introduces `spawn` for an immediately invoked asychronous generator.
   @jlongster
 - Support for *experimental* synonyms `mapply`, `mcall`, `nmapply`,
   `nmcall` for method invocation.

## 0.9.4

 - `isPromise` and `isPromiseAlike` now always returns a boolean
   (even for falsy values). #284 @lfac-pt
 - Support for ES6 Generators in `async` #288 @andywingo
 - Clear duplicate promise rejections from dispatch methods #238 @SLaks
 - Unhandled rejection API #296 @domenic
   `stopUnhandledRejectionTracking`, `getUnhandledReasons`,
   `resetUnhandledRejections`.

## 0.9.3

 - Add the ability to give `Q.timeout`'s errors a custom error message. #270
   @jgrenon
 - Fix Q's call-stack busting behavior in Node.js 0.10, by switching from
   `process.nextTick` to `setImmediate`. #254 #259
 - Fix Q's behavior when used with the Mocha test runner in the browser, since
   Mocha introduces a fake `process` global without a `nextTick` property. #267
 - Fix some, but not all, cases wherein Q would give false positives in its
   unhandled rejection detection (#252). A fix for other cases (#238) is
   hopefully coming soon.
 - Made `Q.promise` throw early if given a non-function.

## 0.9.2

 - Pass through progress notifications when using `timeout`. #229 @omares
 - Pass through progress notifications when using `delay`.
 - Fix `nbind` to actually bind the `thisArg`. #232 @davidpadbury

## 0.9.1

 - Made the AMD detection compatible with the RequireJS optimizer's `namespace`
   option. #225 @terinjokes
 - Fix side effects from `valueOf`, and thus from `isFulfilled`, `isRejected`,
   and `isPending`. #226 @benjamn

## 0.9.0

This release removes many layers of deprecated methods and brings Q closer to
alignment with Mark Millerâ€™s TC39 [strawman][] for concurrency. At the same
time, it fixes many bugs and adds a few features around error handling. Finally,
it comes with an updated and comprehensive [API Reference][].

[strawman]: http://wiki.ecmascript.org/doku.php?id=strawman:concurrency
[API Reference]: https://github.com/kriskowal/q/wiki/API-Reference

### API Cleanup

The following deprecated or undocumented methods have been removed.
Their replacements are listed here:

<table>
   <thead>
      <tr>
         <th>0.8.x method</th>
         <th>0.9 replacement</th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td><code>Q.ref</code></td>
         <td><code>Q</code></td>
      </tr>
      <tr>
         <td><code>call</code>, <code>apply</code>, <code>bind</code> (*)</td>
         <td><code>fcall</code>/<code>invoke</code>, <code>fapply</code>/<code>post</code>, <code>fbind</code></td>
      </tr>
      <tr>
         <td><code>ncall</code>, <code>napply</code> (*)</td>
         <td><code>nfcall</code>/<code>ninvoke</code>, <code>nfapply</code>/<code>npost</code></td>
      </tr>
      <tr>
         <td><code>end</code></td>
         <td><code>done</code></td>
      </tr>
      <tr>
         <td><code>put</code></td>
         <td><code>set</code></td>
      </tr>
      <tr>
         <td><code>node</code></td>
         <td><code>nbind</code></td>
      </tr>
      <tr>
         <td><code>nend</code></td>
         <td><code>nodeify</code></td>
      </tr>
      <tr>
         <td><code>isResolved</code></td>
         <td><code>isPending</code></td>
      </tr>
      <tr>
         <td><code>deferred.node</code></td>
         <td><code>deferred.makeNodeResolver</code></td>
      </tr>
      <tr>
         <td><code>Method</code>, <code>sender</code></td>
         <td><code>dispatcher</code></td>
      </tr>
      <tr>
         <td><code>send</code></td>
         <td><code>dispatch</code></td>
      </tr>
      <tr>
         <td><code>view</code>, <code>viewInfo</code></td>
         <td>(none)</td>
      </tr>
   </tbody>
</table>


(*) Use of ``thisp`` is discouraged. For calling methods, use ``post`` or
``invoke``.

### Alignment with the Concurrency Strawman

-   Q now exports a `Q(value)` function, an alias for `resolve`.
    `Q.call`, `Q.apply`, and `Q.bind` were removed to make room for the
    same methods on the function prototype.
-   `invoke` has been aliased to `send` in all its forms.
-   `post` with no method name acts like `fapply`.

### Error Handling

-   Long stack traces can be turned off by setting `Q.stackJumpLimit` to zero.
    In the future, this property will be used to fine tune how many stack jumps
    are retained in long stack traces; for now, anything nonzero is treated as
    one (since Q only tracks one stack jump at the moment, see #144). #168
-   In Node.js, if there are unhandled rejections when the process exits, they
    are output to the console. #115

### Other

-   `delete` and `set` (nÃ©e `put`) no longer have a fulfillment value.
-   Q promises are no longer frozen, which
    [helps with performance](http://code.google.com/p/v8/issues/detail?id=1858).
-   `thenReject` is now included, as a counterpart to `thenResolve`.
-   The included browser `nextTick` shim is now faster. #195 @rkatic.

### Bug Fixes

-   Q now works in Internet Explorer 10. #186 @ForbesLindesay
-   `fbind` no longer hard-binds the returned function's `this` to `undefined`.
    #202
-   `Q.reject` no longer leaks memory. #148
-   `npost` with no arguments now works. #207
-   `allResolved` now works with non-Q promises ("thenables"). #179
-   `keys` behavior is now correct even in browsers without native
    `Object.keys`. #192 @rkatic
-   `isRejected` and the `exception` property now work correctly if the
    rejection reason is falsy. #198

### Internals and Advanced

-   The internal interface for a promise now uses
    `dispatchPromise(resolve, op, operands)` instead of `sendPromise(op,
    resolve, ...operands)`, which reduces the cases where Q needs to do
    argument slicing.
-   The internal protocol uses different operands. "put" is now "set".
    "del" is now "delete". "view" and "viewInfo" have been removed.
-   `Q.fulfill` has been added. It is distinct from `Q.resolve` in that
    it does not pass promises through, nor coerces promises from other
    systems. The promise becomes the fulfillment value. This is only
    recommended for use when trying to fulfill a promise with an object that has
    a `then` function that is at the same time not a promise.

## 0.8.12
- Treat foreign promises as unresolved in `Q.isFulfilled`; this lets `Q.all`
  work on arrays containing foreign promises. #154
- Fix minor incompliances with the [Promises/A+ spec][] and [test suite][]. #157
  #158

[Promises/A+ spec]: http://promises-aplus.github.com/promises-spec/
[test suite]: https://github.com/promises-aplus/promises-tests

## 0.8.11

 - Added ``nfcall``, ``nfapply``, and ``nfbind`` as ``thisp``-less versions of
   ``ncall``, ``napply``, and ``nbind``. The latter are now deprecated. #142
 - Long stack traces no longer cause linearly-growing memory usage when chaining
   promises together. #111
 - Inspecting ``error.stack`` in a rejection handler will now give a long stack
   trace. #103
 - Fixed ``Q.timeout`` to clear its timeout handle when the promise is rejected;
   previously, it kept the event loop alive until the timeout period expired.
   #145 @dfilatov
 - Added `q/queue` module, which exports an infinite promise queue
   constructor.

## 0.8.10

 - Added ``done`` as a replacement for ``end``, taking the usual fulfillment,
   rejection, and progress handlers. It's essentially equivalent to
   ``then(f, r, p).end()``.
 - Added ``Q.onerror``, a settable error trap that you can use to get full stack
   traces for uncaught errors. #94
 - Added ``thenResolve`` as a shortcut for returning a constant value once a
   promise is fulfilled. #108 @ForbesLindesay
 - Various tweaks to progress notification, including propagation and
   transformation of progress values and only forwarding a single progress
   object.
 - Renamed ``nend`` to ``nodeify``. It no longer returns an always-fulfilled
   promise when a Node callback is passed.
 - ``deferred.resolve`` and ``deferred.reject`` no longer (sometimes) return
   ``deferred.promise``.
 - Fixed stack traces getting mangled if they hit ``end`` twice. #116 #121 @ef4
 - Fixed ``ninvoke`` and ``npost`` to work on promises for objects with Node
   methods. #134
 - Fixed accidental coercion of objects with nontrivial ``valueOf`` methods,
   like ``Date``s, by the promise's ``valueOf`` method. #135
 - Fixed ``spread`` not calling the passed rejection handler if given a rejected
   promise.

## 0.8.9

 - Added ``nend``
 - Added preliminary progress notification support, via
   ``promise.then(onFulfilled, onRejected, onProgress)``,
   ``promise.progress(onProgress)``, and ``deferred.notify(...progressData)``.
 - Made ``put`` and ``del`` return the object acted upon for easier chaining.
   #84
 - Fixed coercion cycles with cooperating promises. #106

## 0.8.7

 - Support [Montage Require](http://github.com/kriskowal/mr)

## 0.8.6

 - Fixed ``npost`` and ``ninvoke`` to pass the correct ``thisp``. #74
 - Fixed various cases involving unorthodox rejection reasons. #73 #90
   @ef4
 - Fixed double-resolving of misbehaved custom promises. #75
 - Sped up ``Q.all`` for arrays contain already-resolved promises or scalar
   values. @ForbesLindesay
 - Made stack trace filtering work when concatenating assets. #93 @ef4
 - Added warnings for deprecated methods. @ForbesLindesay
 - Added ``.npmignore`` file so that dependent packages get a slimmer
   ``node_modules`` directory.

## 0.8.5

 - Added preliminary support for long traces (@domenic)
 - Added ``fapply``, ``fcall``, ``fbind`` for non-thisp
   promised function calls.
 - Added ``return`` for async generators, where generators
   are implemented.
 - Rejected promises now have an "exception" property.  If an object
   isRejected(object), then object.valueOf().exception will
   be the wrapped error.
 - Added Jasmine specifications
 - Support Internet Explorers 7â€“9 (with multiple bug fixes @domenic)
 - Support Firefox 12
 - Support Safari 5.1.5
 - Support Chrome 18

## 0.8.4

 - WARNING: ``promise.timeout`` is now rejected with an ``Error`` object
   and the message now includes the duration of the timeout in
   miliseconds.  This doesn't constitute (in my opinion) a
   backward-incompatibility since it is a change of an undocumented and
   unspecified public behavior, but if you happened to depend on the
   exception being a string, you will need to revise your code.
 - Added ``deferred.makeNodeResolver()`` to replace the more cryptic
   ``deferred.node()`` method.
 - Added experimental ``Q.promise(maker(resolve, reject))`` to make a
   promise inside a callback, such that thrown exceptions in the
   callback are converted and the resolver and rejecter are arguments.
   This is a shorthand for making a deferred directly and inspired by
   @gozalaâ€™s stream constructor pattern and the Microsoft Windows Metro
   Promise constructor interface.
 - Added experimental ``Q.begin()`` that is intended to kick off chains
   of ``.then`` so that each of these can be reordered without having to
   edit the new and former first step.

## 0.8.3

 - Added ``isFulfilled``, ``isRejected``, and ``isResolved``
   to the promise prototype.
 - Added ``allResolved`` for waiting for every promise to either be
   fulfilled or rejected, without propagating an error. @utvara #53
 - Added ``Q.bind`` as a method to transform functions that
   return and throw into promise-returning functions. See
   [an example](https://gist.github.com/1782808). @domenic
 - Renamed ``node`` export to ``nbind``, and added ``napply`` to
   complete the set. ``node`` remains as deprecated. @domenic #58
 - Renamed ``Method`` export to ``sender``.  ``Method``
   remains as deprecated and will be removed in the next
   major version since I expect it has very little usage.
 - Added browser console message indicating a live list of
   unhandled errors.
 - Added support for ``msSetImmediate`` (IE10) or ``setImmediate``
   (available via [polyfill](https://github.com/NobleJS/setImmediate))
   as a browser-side ``nextTick`` implementation. #44 #50 #59
 - Stopped using the event-queue dependency, which was in place for
   Narwhal support: now directly using ``process.nextTick``.
 - WARNING: EXPERIMENTAL: added ``finally`` alias for ``fin``, ``catch``
   alias for ``fail``, ``try`` alias for ``call``, and ``delete`` alias
   for ``del``.  These properties are enquoted in the library for
   cross-browser compatibility, but may be used as property names in
   modern engines.

## 0.8.2

 - Deprecated ``ref`` in favor of ``resolve`` as recommended by
   @domenic.
 - Update event-queue dependency.

## 0.8.1

 - Fixed Opera bug. #35 @cadorn
 - Fixed ``Q.all([])`` #32 @domenic

## 0.8.0

 - WARNING: ``enqueue`` removed.  Use ``nextTick`` instead.
   This is more consistent with NodeJS and (subjectively)
   more explicit and intuitive.
 - WARNING: ``def`` removed.  Use ``master`` instead.  The
   term ``def`` was too confusing to new users.
 - WARNING: ``spy`` removed in favor of ``fin``.
 - WARNING: ``wait`` removed. Do ``all(args).get(0)`` instead.
 - WARNING: ``join`` removed. Do ``all(args).spread(callback)`` instead.
 - WARNING: Removed the ``Q`` function module.exports alias
   for ``Q.ref``. It conflicts with ``Q.apply`` in weird
   ways, making it uncallable.
 - Revised ``delay`` so that it accepts both ``(value,
   timeout)`` and ``(timeout)`` variations based on
   arguments length.
 - Added ``ref().spread(cb(...args))``, a variant of
   ``then`` that spreads an array across multiple arguments.
   Useful with ``all()``.
 - Added ``defer().node()`` Node callback generator.  The
   callback accepts ``(error, value)`` or ``(error,
   ...values)``.  For multiple value arguments, the
   fulfillment value is an array, useful in conjunction with
   ``spread``.
 - Added ``node`` and ``ncall``, both with the signature
   ``(fun, thisp_opt, ...args)``.  The former is a decorator
   and the latter calls immediately.  ``node`` optional
   binds and partially applies.  ``ncall`` can bind and pass
   arguments.

## 0.7.2

 - Fixed thenable promise assimilation.

## 0.7.1

 - Stopped shimming ``Array.prototype.reduce``. The
   enumerable property has bad side-effects.  Libraries that
   depend on this (for example, QQ) will need to be revised.

## 0.7.0 - BACKWARD INCOMPATIBILITY

 - WARNING: Removed ``report`` and ``asap``
 - WARNING: The ``callback`` argument of the ``fin``
   function no longer receives any arguments. Thus, it can
   be used to call functions that should not receive
   arguments on resolution.  Use ``when``, ``then``, or
   ``fail`` if you need a value.
 - IMPORTANT: Fixed a bug in the use of ``MessageChannel``
   for ``nextTick``.
 - Renamed ``enqueue`` to ``nextTick``.
 - Added experimental ``view`` and ``viewInfo`` for creating
   views of promises either when or before they're
   fulfilled.
 - Shims are now externally applied so subsequent scripts or
   dependees can use them.
 - Improved minification results.
 - Improved readability.

## 0.6.0 - BACKWARD INCOMPATIBILITY

 - WARNING: In practice, the implementation of ``spy`` and
   the name ``fin`` were useful.  I've removed the old
   ``fin`` implementation and renamed/aliased ``spy``.
 - The "q" module now exports its ``ref`` function as a "Q"
   constructor, with module systems that support exports
   assignment including NodeJS, RequireJS, and when used as
   a ``<script>`` tag. Notably, strictly compliant CommonJS
   does not support this, but UncommonJS does.
 - Added ``async`` decorator for generators that use yield
   to "trampoline" promises. In engines that support
   generators (SpiderMonkey), this will greatly reduce the
   need for nested callbacks.
 - Made ``when`` chainable.
 - Made ``all`` chainable.

## 0.5.3

 - Added ``all`` and refactored ``join`` and ``wait`` to use
   it.  All of these will now reject at the earliest
   rejection.

## 0.5.2

 - Minor improvement to ``spy``; now waits for resolution of
   callback promise.

## 0.5.1

 - Made most Q API methods chainable on promise objects, and
   turned the previous promise-methods of ``join``,
   ``wait``, and ``report`` into Q API methods.
 - Added ``apply`` and ``call`` to the Q API, and ``apply``
   as a promise handler.
 - Added ``fail``, ``fin``, and ``spy`` to Q and the promise
   prototype for convenience when observing rejection,
   fulfillment and rejection, or just observing without
   affecting the resolution.
 - Renamed ``def`` (although ``def`` remains shimmed until
   the next major release) to ``master``.
 - Switched to using ``MessageChannel`` for next tick task
   enqueue in browsers that support it.

## 0.5.0 - MINOR BACKWARD INCOMPATIBILITY

 - Exceptions are no longer reported when consumed.
 - Removed ``error`` from the API.  Since exceptions are
   getting consumed, throwing them in an errback causes the
   exception to silently disappear.  Use ``end``.
 - Added ``end`` as both an API method and a promise-chain
   ending method.  It causes propagated rejections to be
   thrown, which allows Node to write stack traces and
   emit ``uncaughtException`` events, and browsers to
   likewise emit ``onerror`` and log to the console.
 - Added ``join`` and ``wait`` as promise chain functions,
   so you can wait for variadic promises, returning your own
   promise back, or join variadic promises, resolving with a
   callback that receives variadic fulfillment values.

## 0.4.4

 - ``end`` no longer returns a promise. It is the end of the
   promise chain.
 - Stopped reporting thrown exceptions in ``when`` callbacks
   and errbacks.  These must be explicitly reported through
   ``.end()``, ``.then(null, Q.error)``, or some other
   mechanism.
 - Added ``report`` as an API method, which can be used as
   an errback to report and propagate an error.
 - Added ``report`` as a promise-chain method, so an error
   can be reported if it passes such a gate.

## 0.4.3

 - Fixed ``<script>`` support that regressed with 0.4.2
   because of "use strict" in the module system
   multi-plexer.

## 0.4.2

 - Added support for RequireJS (jburke)

## 0.4.1

 - Added an "end" method to the promise prototype,
   as a shorthand for waiting for the promise to
   be resolved gracefully, and failing to do so,
   to dump an error message.

## 0.4.0 - BACKWARD INCOMPATIBLE*

 - *Removed the utility modules. NPM and Node no longer
   expose any module except the main module.  These have
   been moved and merged into the "qq" package.
 - *In a non-CommonJS browser, q.js can be used as a script.
   It now creates a Q global variable.
 - Fixed thenable assimilation.
 - Fixed some issues with asap, when it resolves to
   undefined, or throws an exception.

## 0.3.0 - BACKWARD-INCOMPATIBLE

 - The `post` method has been reverted to its original
   signature, as provided in Tyler Close's `ref_send` API.
   That is, `post` accepts two arguments, the second of
   which is an arbitrary object, but usually invocation
   arguments as an `Array`.  To provide variadic arguments
   to `post`, there is a new `invoke` function that posts
   the variadic arguments to the value given in the first
   argument.
 - The `defined` method has been moved from `q` to `q/util`
   since it gets no use in practice but is still
   theoretically useful.
 - The `Promise` constructor has been renamed to
   `makePromise` to be consistent with the convention that
   functions that do not require the `new` keyword to be
   used as constructors have camelCase names.
 - The `isResolved` function has been renamed to
   `isFulfilled`.  There is a new `isResolved` function that
   indicates whether a value is not a promise or, if it is a
   promise, whether it has been either fulfilled or
   rejected.  The code has been revised to reflect this
   nuance in terminology.

## 0.2.10

 - Added `join` to `"q/util"` for variadically joining
   multiple promises.

## 0.2.9

 - The future-compatible `invoke` method has been added,
   to replace `post`, since `post` will become backward-
   incompatible in the next major release.
 - Exceptions thrown in the callbacks of a `when` call are
   now emitted to Node's `"uncaughtException"` `process`
   event in addition to being returned as a rejection reason.

## 0.2.8

 - Exceptions thrown in the callbacks of a `when` call
   are now consumed, warned, and transformed into
   rejections of the promise returned by `when`.

## 0.2.7

 - Fixed a minor bug in thenable assimilation, regressed
   because of the change in the forwarding protocol.
 - Fixed behavior of "q/util" `deep` method on dates and
   other primitives. Github issue #11.

## 0.2.6

 - Thenables (objects with a "then" method) are accepted
   and provided, bringing this implementation of Q
   into conformance with Promises/A, B, and D.
 - Added `makePromise`, to replace the `Promise` function
   eventually.
 - Rejections are now also duck-typed. A rejection is a
   promise with a valueOf method that returns a rejection
   descriptor. A rejection descriptor has a
   "promiseRejected" property equal to "true" and a
   "reason" property corresponding to the rejection reason.
 - Altered the `makePromise` API such that the `fallback`
   method no longer receives a superfluous `resolved` method
   after the `operator`.  The fallback method is responsible
   only for returning a resolution.  This breaks an
   undocumented API, so third-party API's depending on the
   previous undocumented behavior may break.

## 0.2.5

 - Changed promises into a duck-type such that multiple
   instances of the Q module can exchange promise objects.
   A promise is now defined as "an object that implements the
   `promiseSend(op, resolved, ...)` method and `valueOf`".
 - Exceptions in promises are now captured and returned
   as rejections.

## 0.2.4

 - Fixed bug in `ref` that prevented `del` messages from
   being received (gozala)
 - Fixed a conflict with FireFox 4; constructor property
   is now read-only.

## 0.2.3

 - Added `keys` message to promises and to the promise API.

## 0.2.2

 - Added boilerplate to `q/queue` and `q/util`.
 - Fixed missing dependency to `q/queue`.

## 0.2.1

 - The `resolve` and `reject` methods of `defer` objects now
   return the resolution promise for convenience.
 - Added `q/util`, which provides `step`, `delay`, `shallow`,
   `deep`, and three reduction orders.
 - Added `q/queue` module for a promise `Queue`.
 - Added `q-comm` to the list of compatible libraries.
 - Deprecated `defined` from `q`, with intent to move it to
   `q/util`.

## 0.2.0 - BACKWARD INCOMPATIBLE

 - Changed post(ref, name, args) to variadic
   post(ref, name, ...args). BACKWARD INCOMPATIBLE
 - Added a def(value) method to annotate an object as being
   necessarily a local value that cannot be serialized, such
   that inter-process/worker/vat promise communication
   libraries will send messages to it, but never send it
   back.
 - Added a send(value, op, ...args) method to the public API, for
   forwarding messages to a value or promise in a future turn.

## 0.1.9

 - Added isRejected() for testing whether a value is a rejected
   promise.  isResolved() retains the behavior of stating
   that rejected promises are not resolved.

## 0.1.8

 - Fixed isResolved(null) and isResolved(undefined) [issue #9]
 - Fixed a problem with the Object.create shim

## 0.1.7

 - shimmed ES5 Object.create in addition to Object.freeze
   for compatibility on non-ES5 engines (gozala)

## 0.1.6

 - Q.isResolved added
 - promise.valueOf() now returns the value of resolved
   and near values
 - asap retried
 - promises are frozen when possible

## 0.1.5

 - fixed dependency list for Teleport (gozala)
 - all unit tests now pass (gozala)

## 0.1.4

 - added support for Teleport as an engine (gozala)
 - simplified and updated methods for getting internal
   print and enqueue functions universally (gozala)

## 0.1.3

 - fixed erroneous link to the q module in package.json

## 0.1.2

 - restructured for overlay style package compatibility

## 0.1.0

 - removed asap because it was broken, probably down to the
   philosophy.

## 0.0.3

 - removed q-util
 - fixed asap so it returns a value if completed

## 0.0.2

 - added q-util

## 0.0.1

 - initial version
Copyright 2009â€“2017 Kristopher Michael Kowal. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
{
  "author": {
    "name": "Kris Kowal",
    "email": "kris@cixar.com",
    "url": "https://github.com/kriskowal"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "A library for promises (CommonJS/Promises/A,B,D)",
  "devDependencies": {
    "cover": "*",
    "grunt": "~0.4.1",
    "grunt-cli": "~0.1.9",
    "grunt-contrib-uglify": "~0.9.1",
    "jasmine-node": "1.11.0",
    "jshint": "~2.1.9",
    "matcha": "~0.2.0",
    "opener": "*",
    "promises-aplus-tests": "1.x"
  },
  "directories": {
    "test": "./spec"
  },
  "engines": {
    "node": ">=0.6.0",
    "teleport": ">=0.2.0"
  },
  "files": [
    "LICENSE",
    "q.js",
    "queue.js"
  ],
  "homepage": "https://github.com/kriskowal/q",
  "license": "MIT",
  "main": "q.js",
  "name": "q",
  "overlay": {
    "teleport": {
      "dependencies": {
        "system": ">=0.0.4"
      }
    }
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/kriskowal/q.git"
  },
  "version": "1.5.1"
}// vim:ts=4:sts=4:sw=4:
/*!
 *
 * Copyright 2009-2017 Kris Kowal under the terms of the MIT
 * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
 *
 * With parts by Tyler Close
 * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
 * at http://www.opensource.org/licenses/mit-license.html
 * Forked at ref_send.js version: 2009-05-11
 *
 * With parts by Mark Miller
 * Copyright (C) 2011 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

(function (definition) {
    "use strict";

    // This file will function properly as a <script> tag, or a module
    // using CommonJS and NodeJS or RequireJS module formats.  In
    // Common/Node/RequireJS, the module exports the Q API and when
    // executed as a simple <script>, it creates a Q global instead.

    // Montage Require
    if (typeof bootstrap === "function") {
        bootstrap("promise", definition);

    // CommonJS
    } else if (typeof exports === "object" && typeof module === "object") {
        module.exports = definition();

    // RequireJS
    } else if (typeof define === "function" && define.amd) {
        define(definition);

    // SES (Secure EcmaScript)
    } else if (typeof ses !== "undefined") {
        if (!ses.ok()) {
            return;
        } else {
            ses.makeQ = definition;
        }

    // <script>
    } else if (typeof window !== "undefined" || typeof self !== "undefined") {
        // Prefer window over self for add-on scripts. Use self for
        // non-windowed contexts.
        var global = typeof window !== "undefined" ? window : self;

        // Get the `window` object, save the previous Q global
        // and initialize Q as a global.
        var previousQ = global.Q;
        global.Q = definition();

        // Add a noConflict function so Q can be removed from the
        // global namespace.
        global.Q.noConflict = function () {
            global.Q = previousQ;
            return this;
        };

    } else {
        throw new Error("This environment was not anticipated by Q. Please file a bug.");
    }

})(function () {
"use strict";

var hasStacks = false;
try {
    throw new Error();
} catch (e) {
    hasStacks = !!e.stack;
}

// All code after this point will be filtered from stack traces reported
// by Q.
var qStartingLine = captureLine();
var qFileName;

// shims

// used for fallback in "allResolved"
var noop = function () {};

// Use the fastest possible means to execute a task in a future turn
// of the event loop.
var nextTick =(function () {
    // linked list of tasks (single, with head node)
    var head = {task: void 0, next: null};
    var tail = head;
    var flushing = false;
    var requestTick = void 0;
    var isNodeJS = false;
    // queue for late tasks, used by unhandled rejection tracking
    var laterQueue = [];

    function flush() {
        /* jshint loopfunc: true */
        var task, domain;

        while (head.next) {
            head = head.next;
            task = head.task;
            head.task = void 0;
            domain = head.domain;

            if (domain) {
                head.domain = void 0;
                domain.enter();
            }
            runSingle(task, domain);

        }
        while (laterQueue.length) {
            task = laterQueue.pop();
            runSingle(task);
        }
        flushing = false;
    }
    // runs a single function in the async queue
    function runSingle(task, domain) {
        try {
            task();

        } catch (e) {
            if (isNodeJS) {
                // In node, uncaught exceptions are considered fatal errors.
                // Re-throw them synchronously to interrupt flushing!

                // Ensure continuation if the uncaught exception is suppressed
                // listening "uncaughtException" events (as domains does).
                // Continue in next event to avoid tick recursion.
                if (domain) {
                    domain.exit();
                }
                setTimeout(flush, 0);
                if (domain) {
                    domain.enter();
                }

                throw e;

            } else {
                // In browsers, uncaught exceptions are not fatal.
                // Re-throw them asynchronously to avoid slow-downs.
                setTimeout(function () {
                    throw e;
                }, 0);
            }
        }

        if (domain) {
            domain.exit();
        }
    }

    nextTick = function (task) {
        tail = tail.next = {
            task: task,
            domain: isNodeJS && process.domain,
            next: null
        };

        if (!flushing) {
            flushing = true;
            requestTick();
        }
    };

    if (typeof process === "object" &&
        process.toString() === "[object process]" && process.nextTick) {
        // Ensure Q is in a real Node environment, with a `process.nextTick`.
        // To see through fake Node environments:
        // * Mocha test runner - exposes a `process` global without a `nextTick`
        // * Browserify - exposes a `process.nexTick` function that uses
        //   `setTimeout`. In this case `setImmediate` is preferred because
        //    it is faster. Browserify's `process.toString()` yields
        //   "[object Object]", while in a real Node environment
        //   `process.toString()` yields "[object process]".
        isNodeJS = true;

        requestTick = function () {
            process.nextTick(flush);
        };

    } else if (typeof setImmediate === "function") {
        // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
        if (typeof window !== "undefined") {
            requestTick = setImmediate.bind(window, flush);
        } else {
            requestTick = function () {
                setImmediate(flush);
            };
        }

    } else if (typeof MessageChannel !== "undefined") {
        // modern browsers
        // http://www.nonblocking.io/2011/06/windownexttick.html
        var channel = new MessageChannel();
        // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
        // working message ports the first time a page loads.
        channel.port1.onmessage = function () {
            requestTick = requestPortTick;
            channel.port1.onmessage = flush;
            flush();
        };
        var requestPortTick = function () {
            // Opera requires us to provide a message payload, regardless of
            // whether we use it.
            channel.port2.postMessage(0);
        };
        requestTick = function () {
            setTimeout(flush, 0);
            requestPortTick();
        };

    } else {
        // old browsers
        requestTick = function () {
            setTimeout(flush, 0);
        };
    }
    // runs a task after all other tasks have been run
    // this is useful for unhandled rejection tracking that needs to happen
    // after all `then`d tasks have been run.
    nextTick.runAfter = function (task) {
        laterQueue.push(task);
        if (!flushing) {
            flushing = true;
            requestTick();
        }
    };
    return nextTick;
})();

// Attempt to make generics safe in the face of downstream
// modifications.
// There is no situation where this is necessary.
// If you need a security guarantee, these primordials need to be
// deeply frozen anyway, and if you donâ€™t need a security guarantee,
// this is just plain paranoid.
// However, this **might** have the nice side-effect of reducing the size of
// the minified code by reducing x.call() to merely x()
// See Mark Millerâ€™s explanation of what this does.
// http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
var call = Function.call;
function uncurryThis(f) {
    return function () {
        return call.apply(f, arguments);
    };
}
// This is equivalent, but slower:
// uncurryThis = Function_bind.bind(Function_bind.call);
// http://jsperf.com/uncurrythis

var array_slice = uncurryThis(Array.prototype.slice);

var array_reduce = uncurryThis(
    Array.prototype.reduce || function (callback, basis) {
        var index = 0,
            length = this.length;
        // concerning the initial value, if one is not provided
        if (arguments.length === 1) {
            // seek to the first value in the array, accounting
            // for the possibility that is is a sparse array
            do {
                if (index in this) {
                    basis = this[index++];
                    break;
                }
                if (++index >= length) {
                    throw new TypeError();
                }
            } while (1);
        }
        // reduce
        for (; index < length; index++) {
            // account for the possibility that the array is sparse
            if (index in this) {
                basis = callback(basis, this[index], index);
            }
        }
        return basis;
    }
);

var array_indexOf = uncurryThis(
    Array.prototype.indexOf || function (value) {
        // not a very good shim, but good enough for our one use of it
        for (var i = 0; i < this.length; i++) {
            if (this[i] === value) {
                return i;
            }
        }
        return -1;
    }
);

var array_map = uncurryThis(
    Array.prototype.map || function (callback, thisp) {
        var self = this;
        var collect = [];
        array_reduce(self, function (undefined, value, index) {
            collect.push(callback.call(thisp, value, index, self));
        }, void 0);
        return collect;
    }
);

var object_create = Object.create || function (prototype) {
    function Type() { }
    Type.prototype = prototype;
    return new Type();
};

var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
    obj[prop] = descriptor.value;
    return obj;
};

var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);

var object_keys = Object.keys || function (object) {
    var keys = [];
    for (var key in object) {
        if (object_hasOwnProperty(object, key)) {
            keys.push(key);
        }
    }
    return keys;
};

var object_toString = uncurryThis(Object.prototype.toString);

function isObject(value) {
    return value === Object(value);
}

// generator related shims

// FIXME: Remove this function once ES6 generators are in SpiderMonkey.
function isStopIteration(exception) {
    return (
        object_toString(exception) === "[object StopIteration]" ||
        exception instanceof QReturnValue
    );
}

// FIXME: Remove this helper and Q.return once ES6 generators are in
// SpiderMonkey.
var QReturnValue;
if (typeof ReturnValue !== "undefined") {
    QReturnValue = ReturnValue;
} else {
    QReturnValue = function (value) {
        this.value = value;
    };
}

// long stack traces

var STACK_JUMP_SEPARATOR = "From previous event:";

function makeStackTraceLong(error, promise) {
    // If possible, transform the error stack trace by removing Node and Q
    // cruft, then concatenating with the stack trace of `promise`. See #57.
    if (hasStacks &&
        promise.stack &&
        typeof error === "object" &&
        error !== null &&
        error.stack
    ) {
        var stacks = [];
        for (var p = promise; !!p; p = p.source) {
            if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
                object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
                stacks.unshift(p.stack);
            }
        }
        stacks.unshift(error.stack);

        var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
        var stack = filterStackString(concatedStacks);
        object_defineProperty(error, "stack", {value: stack, configurable: true});
    }
}

function filterStackString(stackString) {
    var lines = stackString.split("\n");
    var desiredLines = [];
    for (var i = 0; i < lines.length; ++i) {
        var line = lines[i];

        if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
            desiredLines.push(line);
        }
    }
    return desiredLines.join("\n");
}

function isNodeFrame(stackLine) {
    return stackLine.indexOf("(module.js:") !== -1 ||
           stackLine.indexOf("(node.js:") !== -1;
}

function getFileNameAndLineNumber(stackLine) {
    // Named functions: "at functionName (filename:lineNumber:columnNumber)"
    // In IE10 function name can have spaces ("Anonymous function") O_o
    var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
    if (attempt1) {
        return [attempt1[1], Number(attempt1[2])];
    }

    // Anonymous functions: "at filename:lineNumber:columnNumber"
    var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
    if (attempt2) {
        return [attempt2[1], Number(attempt2[2])];
    }

    // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
    var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
    if (attempt3) {
        return [attempt3[1], Number(attempt3[2])];
    }
}

function isInternalFrame(stackLine) {
    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);

    if (!fileNameAndLineNumber) {
        return false;
    }

    var fileName = fileNameAndLineNumber[0];
    var lineNumber = fileNameAndLineNumber[1];

    return fileName === qFileName &&
        lineNumber >= qStartingLine &&
        lineNumber <= qEndingLine;
}

// discover own file name and line number range for filtering stack
// traces
function captureLine() {
    if (!hasStacks) {
        return;
    }

    try {
        throw new Error();
    } catch (e) {
        var lines = e.stack.split("\n");
        var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
        var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
        if (!fileNameAndLineNumber) {
            return;
        }

        qFileName = fileNameAndLineNumber[0];
        return fileNameAndLineNumber[1];
    }
}

function deprecate(callback, name, alternative) {
    return function () {
        if (typeof console !== "undefined" &&
            typeof console.warn === "function") {
            console.warn(name + " is deprecated, use " + alternative +
                         " instead.", new Error("").stack);
        }
        return callback.apply(callback, arguments);
    };
}

// end of shims
// beginning of real work

/**
 * Constructs a promise for an immediate reference, passes promises through, or
 * coerces promises from different systems.
 * @param value immediate reference or promise
 */
function Q(value) {
    // If the object is already a Promise, return it directly.  This enables
    // the resolve function to both be used to created references from objects,
    // but to tolerably coerce non-promises to promises.
    if (value instanceof Promise) {
        return value;
    }

    // assimilate thenables
    if (isPromiseAlike(value)) {
        return coerce(value);
    } else {
        return fulfill(value);
    }
}
Q.resolve = Q;

/**
 * Performs a task in a future turn of the event loop.
 * @param {Function} task
 */
Q.nextTick = nextTick;

/**
 * Controls whether or not long stack traces will be on
 */
Q.longStackSupport = false;

/**
 * The counter is used to determine the stopping point for building
 * long stack traces. In makeStackTraceLong we walk backwards through
 * the linked list of promises, only stacks which were created before
 * the rejection are concatenated.
 */
var longStackCounter = 1;

// enable long stacks if Q_DEBUG is set
if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
    Q.longStackSupport = true;
}

/**
 * Constructs a {promise, resolve, reject} object.
 *
 * `resolve` is a callback to invoke with a more resolved value for the
 * promise. To fulfill the promise, invoke `resolve` with any value that is
 * not a thenable. To reject the promise, invoke `resolve` with a rejected
 * thenable, or invoke `reject` with the reason directly. To resolve the
 * promise to another thenable, thus putting it in the same state, invoke
 * `resolve` with that other thenable.
 */
Q.defer = defer;
function defer() {
    // if "messages" is an "Array", that indicates that the promise has not yet
    // been resolved.  If it is "undefined", it has been resolved.  Each
    // element of the messages array is itself an array of complete arguments to
    // forward to the resolved promise.  We coerce the resolution value to a
    // promise using the `resolve` function because it handles both fully
    // non-thenable values and other thenables gracefully.
    var messages = [], progressListeners = [], resolvedPromise;

    var deferred = object_create(defer.prototype);
    var promise = object_create(Promise.prototype);

    promise.promiseDispatch = function (resolve, op, operands) {
        var args = array_slice(arguments);
        if (messages) {
            messages.push(args);
            if (op === "when" && operands[1]) { // progress operand
                progressListeners.push(operands[1]);
            }
        } else {
            Q.nextTick(function () {
                resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
            });
        }
    };

    // XXX deprecated
    promise.valueOf = function () {
        if (messages) {
            return promise;
        }
        var nearerValue = nearer(resolvedPromise);
        if (isPromise(nearerValue)) {
            resolvedPromise = nearerValue; // shorten chain
        }
        return nearerValue;
    };

    promise.inspect = function () {
        if (!resolvedPromise) {
            return { state: "pending" };
        }
        return resolvedPromise.inspect();
    };

    if (Q.longStackSupport && hasStacks) {
        try {
            throw new Error();
        } catch (e) {
            // NOTE: don't try to use `Error.captureStackTrace` or transfer the
            // accessor around; that causes memory leaks as per GH-111. Just
            // reify the stack trace as a string ASAP.
            //
            // At the same time, cut off the first line; it's always just
            // "[object Promise]\n", as per the `toString`.
            promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
            promise.stackCounter = longStackCounter++;
        }
    }

    // NOTE: we do the checks for `resolvedPromise` in each method, instead of
    // consolidating them into `become`, since otherwise we'd create new
    // promises with the lines `become(whatever(value))`. See e.g. GH-252.

    function become(newPromise) {
        resolvedPromise = newPromise;

        if (Q.longStackSupport && hasStacks) {
            // Only hold a reference to the new promise if long stacks
            // are enabled to reduce memory usage
            promise.source = newPromise;
        }

        array_reduce(messages, function (undefined, message) {
            Q.nextTick(function () {
                newPromise.promiseDispatch.apply(newPromise, message);
            });
        }, void 0);

        messages = void 0;
        progressListeners = void 0;
    }

    deferred.promise = promise;
    deferred.resolve = function (value) {
        if (resolvedPromise) {
            return;
        }

        become(Q(value));
    };

    deferred.fulfill = function (value) {
        if (resolvedPromise) {
            return;
        }

        become(fulfill(value));
    };
    deferred.reject = function (reason) {
        if (resolvedPromise) {
            return;
        }

        become(reject(reason));
    };
    deferred.notify = function (progress) {
        if (resolvedPromise) {
            return;
        }

        array_reduce(progressListeners, function (undefined, progressListener) {
            Q.nextTick(function () {
                progressListener(progress);
            });
        }, void 0);
    };

    return deferred;
}

/**
 * Creates a Node-style callback that will resolve or reject the deferred
 * promise.
 * @returns a nodeback
 */
defer.prototype.makeNodeResolver = function () {
    var self = this;
    return function (error, value) {
        if (error) {
            self.reject(error);
        } else if (arguments.length > 2) {
            self.resolve(array_slice(arguments, 1));
        } else {
            self.resolve(value);
        }
    };
};

/**
 * @param resolver {Function} a function that returns nothing and accepts
 * the resolve, reject, and notify functions for a deferred.
 * @returns a promise that may be resolved with the given resolve and reject
 * functions, or rejected by a thrown exception in resolver
 */
Q.Promise = promise; // ES6
Q.promise = promise;
function promise(resolver) {
    if (typeof resolver !== "function") {
        throw new TypeError("resolver must be a function.");
    }
    var deferred = defer();
    try {
        resolver(deferred.resolve, deferred.reject, deferred.notify);
    } catch (reason) {
        deferred.reject(reason);
    }
    return deferred.promise;
}

promise.race = race; // ES6
promise.all = all; // ES6
promise.reject = reject; // ES6
promise.resolve = Q; // ES6

// XXX experimental.  This method is a way to denote that a local value is
// serializable and should be immediately dispatched to a remote upon request,
// instead of passing a reference.
Q.passByCopy = function (object) {
    //freeze(object);
    //passByCopies.set(object, true);
    return object;
};

Promise.prototype.passByCopy = function () {
    //freeze(object);
    //passByCopies.set(object, true);
    return this;
};

/**
 * If two promises eventually fulfill to the same value, promises that value,
 * but otherwise rejects.
 * @param x {Any*}
 * @param y {Any*}
 * @returns {Any*} a promise for x and y if they are the same, but a rejection
 * otherwise.
 *
 */
Q.join = function (x, y) {
    return Q(x).join(y);
};

Promise.prototype.join = function (that) {
    return Q([this, that]).spread(function (x, y) {
        if (x === y) {
            // TODO: "===" should be Object.is or equiv
            return x;
        } else {
            throw new Error("Q can't join: not the same: " + x + " " + y);
        }
    });
};

/**
 * Returns a promise for the first of an array of promises to become settled.
 * @param answers {Array[Any*]} promises to race
 * @returns {Any*} the first promise to be settled
 */
Q.race = race;
function race(answerPs) {
    return promise(function (resolve, reject) {
        // Switch to this once we can assume at least ES5
        // answerPs.forEach(function (answerP) {
        //     Q(answerP).then(resolve, reject);
        // });
        // Use this in the meantime
        for (var i = 0, len = answerPs.length; i < len; i++) {
            Q(answerPs[i]).then(resolve, reject);
        }
    });
}

Promise.prototype.race = function () {
    return this.then(Q.race);
};

/**
 * Constructs a Promise with a promise descriptor object and optional fallback
 * function.  The descriptor contains methods like when(rejected), get(name),
 * set(name, value), post(name, args), and delete(name), which all
 * return either a value, a promise for a value, or a rejection.  The fallback
 * accepts the operation name, a resolver, and any further arguments that would
 * have been forwarded to the appropriate method above had a method been
 * provided with the proper name.  The API makes no guarantees about the nature
 * of the returned object, apart from that it is usable whereever promises are
 * bought and sold.
 */
Q.makePromise = Promise;
function Promise(descriptor, fallback, inspect) {
    if (fallback === void 0) {
        fallback = function (op) {
            return reject(new Error(
                "Promise does not support operation: " + op
            ));
        };
    }
    if (inspect === void 0) {
        inspect = function () {
            return {state: "unknown"};
        };
    }

    var promise = object_create(Promise.prototype);

    promise.promiseDispatch = function (resolve, op, args) {
        var result;
        try {
            if (descriptor[op]) {
                result = descriptor[op].apply(promise, args);
            } else {
                result = fallback.call(promise, op, args);
            }
        } catch (exception) {
            result = reject(exception);
        }
        if (resolve) {
            resolve(result);
        }
    };

    promise.inspect = inspect;

    // XXX deprecated `valueOf` and `exception` support
    if (inspect) {
        var inspected = inspect();
        if (inspected.state === "rejected") {
            promise.exception = inspected.reason;
        }

        promise.valueOf = function () {
            var inspected = inspect();
            if (inspected.state === "pending" ||
                inspected.state === "rejected") {
                return promise;
            }
            return inspected.value;
        };
    }

    return promise;
}

Promise.prototype.toString = function () {
    return "[object Promise]";
};

Promise.prototype.then = function (fulfilled, rejected, progressed) {
    var self = this;
    var deferred = defer();
    var done = false;   // ensure the untrusted promise makes at most a
                        // single call to one of the callbacks

    function _fulfilled(value) {
        try {
            return typeof fulfilled === "function" ? fulfilled(value) : value;
        } catch (exception) {
            return reject(exception);
        }
    }

    function _rejected(exception) {
        if (typeof rejected === "function") {
            makeStackTraceLong(exception, self);
            try {
                return rejected(exception);
            } catch (newException) {
                return reject(newException);
            }
        }
        return reject(exception);
    }

    function _progressed(value) {
        return typeof progressed === "function" ? progressed(value) : value;
    }

    Q.nextTick(function () {
        self.promiseDispatch(function (value) {
            if (done) {
                return;
            }
            done = true;

            deferred.resolve(_fulfilled(value));
        }, "when", [function (exception) {
            if (done) {
                return;
            }
            done = true;

            deferred.resolve(_rejected(exception));
        }]);
    });

    // Progress propagator need to be attached in the current tick.
    self.promiseDispatch(void 0, "when", [void 0, function (value) {
        var newValue;
        var threw = false;
        try {
            newValue = _progressed(value);
        } catch (e) {
            threw = true;
            if (Q.onerror) {
                Q.onerror(e);
            } else {
                throw e;
            }
        }

        if (!threw) {
            deferred.notify(newValue);
        }
    }]);

    return deferred.promise;
};

Q.tap = function (promise, callback) {
    return Q(promise).tap(callback);
};

/**
 * Works almost like "finally", but not called for rejections.
 * Original resolution value is passed through callback unaffected.
 * Callback may return a promise that will be awaited for.
 * @param {Function} callback
 * @returns {Q.Promise}
 * @example
 * doSomething()
 *   .then(...)
 *   .tap(console.log)
 *   .then(...);
 */
Promise.prototype.tap = function (callback) {
    callback = Q(callback);

    return this.then(function (value) {
        return callback.fcall(value).thenResolve(value);
    });
};

/**
 * Registers an observer on a promise.
 *
 * Guarantees:
 *
 * 1. that fulfilled and rejected will be called only once.
 * 2. that either the fulfilled callback or the rejected callback will be
 *    called, but not both.
 * 3. that fulfilled and rejected will not be called in this turn.
 *
 * @param value      promise or immediate reference to observe
 * @param fulfilled  function to be called with the fulfilled value
 * @param rejected   function to be called with the rejection exception
 * @param progressed function to be called on any progress notifications
 * @return promise for the return value from the invoked callback
 */
Q.when = when;
function when(value, fulfilled, rejected, progressed) {
    return Q(value).then(fulfilled, rejected, progressed);
}

Promise.prototype.thenResolve = function (value) {
    return this.then(function () { return value; });
};

Q.thenResolve = function (promise, value) {
    return Q(promise).thenResolve(value);
};

Promise.prototype.thenReject = function (reason) {
    return this.then(function () { throw reason; });
};

Q.thenReject = function (promise, reason) {
    return Q(promise).thenReject(reason);
};

/**
 * If an object is not a promise, it is as "near" as possible.
 * If a promise is rejected, it is as "near" as possible too.
 * If itâ€™s a fulfilled promise, the fulfillment value is nearer.
 * If itâ€™s a deferred promise and the deferred has been resolved, the
 * resolution is "nearer".
 * @param object
 * @returns most resolved (nearest) form of the object
 */

// XXX should we re-do this?
Q.nearer = nearer;
function nearer(value) {
    if (isPromise(value)) {
        var inspected = value.inspect();
        if (inspected.state === "fulfilled") {
            return inspected.value;
        }
    }
    return value;
}

/**
 * @returns whether the given object is a promise.
 * Otherwise it is a fulfilled value.
 */
Q.isPromise = isPromise;
function isPromise(object) {
    return object instanceof Promise;
}

Q.isPromiseAlike = isPromiseAlike;
function isPromiseAlike(object) {
    return isObject(object) && typeof object.then === "function";
}

/**
 * @returns whether the given object is a pending promise, meaning not
 * fulfilled or rejected.
 */
Q.isPending = isPending;
function isPending(object) {
    return isPromise(object) && object.inspect().state === "pending";
}

Promise.prototype.isPending = function () {
    return this.inspect().state === "pending";
};

/**
 * @returns whether the given object is a value or fulfilled
 * promise.
 */
Q.isFulfilled = isFulfilled;
function isFulfilled(object) {
    return !isPromise(object) || object.inspect().state === "fulfilled";
}

Promise.prototype.isFulfilled = function () {
    return this.inspect().state === "fulfilled";
};

/**
 * @returns whether the given object is a rejected promise.
 */
Q.isRejected = isRejected;
function isRejected(object) {
    return isPromise(object) && object.inspect().state === "rejected";
}

Promise.prototype.isRejected = function () {
    return this.inspect().state === "rejected";
};

//// BEGIN UNHANDLED REJECTION TRACKING

// This promise library consumes exceptions thrown in handlers so they can be
// handled by a subsequent promise.  The exceptions get added to this array when
// they are created, and removed when they are handled.  Note that in ES6 or
// shimmed environments, this would naturally be a `Set`.
var unhandledReasons = [];
var unhandledRejections = [];
var reportedUnhandledRejections = [];
var trackUnhandledRejections = true;

function resetUnhandledRejections() {
    unhandledReasons.length = 0;
    unhandledRejections.length = 0;

    if (!trackUnhandledRejections) {
        trackUnhandledRejections = true;
    }
}

function trackRejection(promise, reason) {
    if (!trackUnhandledRejections) {
        return;
    }
    if (typeof process === "object" && typeof process.emit === "function") {
        Q.nextTick.runAfter(function () {
            if (array_indexOf(unhandledRejections, promise) !== -1) {
                process.emit("unhandledRejection", reason, promise);
                reportedUnhandledRejections.push(promise);
            }
        });
    }

    unhandledRejections.push(promise);
    if (reason && typeof reason.stack !== "undefined") {
        unhandledReasons.push(reason.stack);
    } else {
        unhandledReasons.push("(no stack) " + reason);
    }
}

function untrackRejection(promise) {
    if (!trackUnhandledRejections) {
        return;
    }

    var at = array_indexOf(unhandledRejections, promise);
    if (at !== -1) {
        if (typeof process === "object" && typeof process.emit === "function") {
            Q.nextTick.runAfter(function () {
                var atReport = array_indexOf(reportedUnhandledRejections, promise);
                if (atReport !== -1) {
                    process.emit("rejectionHandled", unhandledReasons[at], promise);
                    reportedUnhandledRejections.splice(atReport, 1);
                }
            });
        }
        unhandledRejections.splice(at, 1);
        unhandledReasons.splice(at, 1);
    }
}

Q.resetUnhandledRejections = resetUnhandledRejections;

Q.getUnhandledReasons = function () {
    // Make a copy so that consumers can't interfere with our internal state.
    return unhandledReasons.slice();
};

Q.stopUnhandledRejectionTracking = function () {
    resetUnhandledRejections();
    trackUnhandledRejections = false;
};

resetUnhandledRejections();

//// END UNHANDLED REJECTION TRACKING

/**
 * Constructs a rejected promise.
 * @param reason value describing the failure
 */
Q.reject = reject;
function reject(reason) {
    var rejection = Promise({
        "when": function (rejected) {
            // note that the error has been handled
            if (rejected) {
                untrackRejection(this);
            }
            return rejected ? rejected(reason) : this;
        }
    }, function fallback() {
        return this;
    }, function inspect() {
        return { state: "rejected", reason: reason };
    });

    // Note that the reason has not been handled.
    trackRejection(rejection, reason);

    return rejection;
}

/**
 * Constructs a fulfilled promise for an immediate reference.
 * @param value immediate reference
 */
Q.fulfill = fulfill;
function fulfill(value) {
    return Promise({
        "when": function () {
            return value;
        },
        "get": function (name) {
            return value[name];
        },
        "set": function (name, rhs) {
            value[name] = rhs;
        },
        "delete": function (name) {
            delete value[name];
        },
        "post": function (name, args) {
            // Mark Miller proposes that post with no name should apply a
            // promised function.
            if (name === null || name === void 0) {
                return value.apply(void 0, args);
            } else {
                return value[name].apply(value, args);
            }
        },
        "apply": function (thisp, args) {
            return value.apply(thisp, args);
        },
        "keys": function () {
            return object_keys(value);
        }
    }, void 0, function inspect() {
        return { state: "fulfilled", value: value };
    });
}

/**
 * Converts thenables to Q promises.
 * @param promise thenable promise
 * @returns a Q promise
 */
function coerce(promise) {
    var deferred = defer();
    Q.nextTick(function () {
        try {
            promise.then(deferred.resolve, deferred.reject, deferred.notify);
        } catch (exception) {
            deferred.reject(exception);
        }
    });
    return deferred.promise;
}

/**
 * Annotates an object such that it will never be
 * transferred away from this process over any promise
 * communication channel.
 * @param object
 * @returns promise a wrapping of that object that
 * additionally responds to the "isDef" message
 * without a rejection.
 */
Q.master = master;
function master(object) {
    return Promise({
        "isDef": function () {}
    }, function fallback(op, args) {
        return dispatch(object, op, args);
    }, function () {
        return Q(object).inspect();
    });
}

/**
 * Spreads the values of a promised array of arguments into the
 * fulfillment callback.
 * @param fulfilled callback that receives variadic arguments from the
 * promised array
 * @param rejected callback that receives the exception if the promise
 * is rejected.
 * @returns a promise for the return value or thrown exception of
 * either callback.
 */
Q.spread = spread;
function spread(value, fulfilled, rejected) {
    return Q(value).spread(fulfilled, rejected);
}

Promise.prototype.spread = function (fulfilled, rejected) {
    return this.all().then(function (array) {
        return fulfilled.apply(void 0, array);
    }, rejected);
};

/**
 * The async function is a decorator for generator functions, turning
 * them into asynchronous generators.  Although generators are only part
 * of the newest ECMAScript 6 drafts, this code does not cause syntax
 * errors in older engines.  This code should continue to work and will
 * in fact improve over time as the language improves.
 *
 * ES6 generators are currently part of V8 version 3.19 with the
 * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
 * for longer, but under an older Python-inspired form.  This function
 * works on both kinds of generators.
 *
 * Decorates a generator function such that:
 *  - it may yield promises
 *  - execution will continue when that promise is fulfilled
 *  - the value of the yield expression will be the fulfilled value
 *  - it returns a promise for the return value (when the generator
 *    stops iterating)
 *  - the decorated function returns a promise for the return value
 *    of the generator or the first rejected promise among those
 *    yielded.
 *  - if an error is thrown in the generator, it propagates through
 *    every following yield until it is caught, or until it escapes
 *    the generator function altogether, and is translated into a
 *    rejection for the promise returned by the decorated generator.
 */
Q.async = async;
function async(makeGenerator) {
    return function () {
        // when verb is "send", arg is a value
        // when verb is "throw", arg is an exception
        function continuer(verb, arg) {
            var result;

            // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
            // engine that has a deployed base of browsers that support generators.
            // However, SM's generators use the Python-inspired semantics of
            // outdated ES6 drafts.  We would like to support ES6, but we'd also
            // like to make it possible to use generators in deployed browsers, so
            // we also support Python-style generators.  At some point we can remove
            // this block.

            if (typeof StopIteration === "undefined") {
                // ES6 Generators
                try {
                    result = generator[verb](arg);
                } catch (exception) {
                    return reject(exception);
                }
                if (result.done) {
                    return Q(result.value);
                } else {
                    return when(result.value, callback, errback);
                }
            } else {
                // SpiderMonkey Generators
                // FIXME: Remove this case when SM does ES6 generators.
                try {
                    result = generator[verb](arg);
                } catch (exception) {
                    if (isStopIteration(exception)) {
                        return Q(exception.value);
                    } else {
                        return reject(exception);
                    }
                }
                return when(result, callback, errback);
            }
        }
        var generator = makeGenerator.apply(this, arguments);
        var callback = continuer.bind(continuer, "next");
        var errback = continuer.bind(continuer, "throw");
        return callback();
    };
}

/**
 * The spawn function is a small wrapper around async that immediately
 * calls the generator and also ends the promise chain, so that any
 * unhandled errors are thrown instead of forwarded to the error
 * handler. This is useful because it's extremely common to run
 * generators at the top-level to work with libraries.
 */
Q.spawn = spawn;
function spawn(makeGenerator) {
    Q.done(Q.async(makeGenerator)());
}

// FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
/**
 * Throws a ReturnValue exception to stop an asynchronous generator.
 *
 * This interface is a stop-gap measure to support generator return
 * values in older Firefox/SpiderMonkey.  In browsers that support ES6
 * generators like Chromium 29, just use "return" in your generator
 * functions.
 *
 * @param value the return value for the surrounding generator
 * @throws ReturnValue exception with the value.
 * @example
 * // ES6 style
 * Q.async(function* () {
 *      var foo = yield getFooPromise();
 *      var bar = yield getBarPromise();
 *      return foo + bar;
 * })
 * // Older SpiderMonkey style
 * Q.async(function () {
 *      var foo = yield getFooPromise();
 *      var bar = yield getBarPromise();
 *      Q.return(foo + bar);
 * })
 */
Q["return"] = _return;
function _return(value) {
    throw new QReturnValue(value);
}

/**
 * The promised function decorator ensures that any promise arguments
 * are settled and passed as values (`this` is also settled and passed
 * as a value).  It will also ensure that the result of a function is
 * always a promise.
 *
 * @example
 * var add = Q.promised(function (a, b) {
 *     return a + b;
 * });
 * add(Q(a), Q(B));
 *
 * @param {function} callback The function to decorate
 * @returns {function} a function that has been decorated.
 */
Q.promised = promised;
function promised(callback) {
    return function () {
        return spread([this, all(arguments)], function (self, args) {
            return callback.apply(self, args);
        });
    };
}

/**
 * sends a message to a value in a future turn
 * @param object* the recipient
 * @param op the name of the message operation, e.g., "when",
 * @param args further arguments to be forwarded to the operation
 * @returns result {Promise} a promise for the result of the operation
 */
Q.dispatch = dispatch;
function dispatch(object, op, args) {
    return Q(object).dispatch(op, args);
}

Promise.prototype.dispatch = function (op, args) {
    var self = this;
    var deferred = defer();
    Q.nextTick(function () {
        self.promiseDispatch(deferred.resolve, op, args);
    });
    return deferred.promise;
};

/**
 * Gets the value of a property in a future turn.
 * @param object    promise or immediate reference for target object
 * @param name      name of property to get
 * @return promise for the property value
 */
Q.get = function (object, key) {
    return Q(object).dispatch("get", [key]);
};

Promise.prototype.get = function (key) {
    return this.dispatch("get", [key]);
};

/**
 * Sets the value of a property in a future turn.
 * @param object    promise or immediate reference for object object
 * @param name      name of property to set
 * @param value     new value of property
 * @return promise for the return value
 */
Q.set = function (object, key, value) {
    return Q(object).dispatch("set", [key, value]);
};

Promise.prototype.set = function (key, value) {
    return this.dispatch("set", [key, value]);
};

/**
 * Deletes a property in a future turn.
 * @param object    promise or immediate reference for target object
 * @param name      name of property to delete
 * @return promise for the return value
 */
Q.del = // XXX legacy
Q["delete"] = function (object, key) {
    return Q(object).dispatch("delete", [key]);
};

Promise.prototype.del = // XXX legacy
Promise.prototype["delete"] = function (key) {
    return this.dispatch("delete", [key]);
};

/**
 * Invokes a method in a future turn.
 * @param object    promise or immediate reference for target object
 * @param name      name of method to invoke
 * @param value     a value to post, typically an array of
 *                  invocation arguments for promises that
 *                  are ultimately backed with `resolve` values,
 *                  as opposed to those backed with URLs
 *                  wherein the posted value can be any
 *                  JSON serializable object.
 * @return promise for the return value
 */
// bound locally because it is used by other methods
Q.mapply = // XXX As proposed by "Redsandro"
Q.post = function (object, name, args) {
    return Q(object).dispatch("post", [name, args]);
};

Promise.prototype.mapply = // XXX As proposed by "Redsandro"
Promise.prototype.post = function (name, args) {
    return this.dispatch("post", [name, args]);
};

/**
 * Invokes a method in a future turn.
 * @param object    promise or immediate reference for target object
 * @param name      name of method to invoke
 * @param ...args   array of invocation arguments
 * @return promise for the return value
 */
Q.send = // XXX Mark Miller's proposed parlance
Q.mcall = // XXX As proposed by "Redsandro"
Q.invoke = function (object, name /*...args*/) {
    return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
};

Promise.prototype.send = // XXX Mark Miller's proposed parlance
Promise.prototype.mcall = // XXX As proposed by "Redsandro"
Promise.prototype.invoke = function (name /*...args*/) {
    return this.dispatch("post", [name, array_slice(arguments, 1)]);
};

/**
 * Applies the promised function in a future turn.
 * @param object    promise or immediate reference for target function
 * @param args      array of application arguments
 */
Q.fapply = function (object, args) {
    return Q(object).dispatch("apply", [void 0, args]);
};

Promise.prototype.fapply = function (args) {
    return this.dispatch("apply", [void 0, args]);
};

/**
 * Calls the promised function in a future turn.
 * @param object    promise or immediate reference for target function
 * @param ...args   array of application arguments
 */
Q["try"] =
Q.fcall = function (object /* ...args*/) {
    return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
};

Promise.prototype.fcall = function (/*...args*/) {
    return this.dispatch("apply", [void 0, array_slice(arguments)]);
};

/**
 * Binds the promised function, transforming return values into a fulfilled
 * promise and thrown errors into a rejected one.
 * @param object    promise or immediate reference for target function
 * @param ...args   array of application arguments
 */
Q.fbind = function (object /*...args*/) {
    var promise = Q(object);
    var args = array_slice(arguments, 1);
    return function fbound() {
        return promise.dispatch("apply", [
            this,
            args.concat(array_slice(arguments))
        ]);
    };
};
Promise.prototype.fbind = function (/*...args*/) {
    var promise = this;
    var args = array_slice(arguments);
    return function fbound() {
        return promise.dispatch("apply", [
            this,
            args.concat(array_slice(arguments))
        ]);
    };
};

/**
 * Requests the names of the owned properties of a promised
 * object in a future turn.
 * @param object    promise or immediate reference for target object
 * @return promise for the keys of the eventually settled object
 */
Q.keys = function (object) {
    return Q(object).dispatch("keys", []);
};

Promise.prototype.keys = function () {
    return this.dispatch("keys", []);
};

/**
 * Turns an array of promises into a promise for an array.  If any of
 * the promises gets rejected, the whole array is rejected immediately.
 * @param {Array*} an array (or promise for an array) of values (or
 * promises for values)
 * @returns a promise for an array of the corresponding values
 */
// By Mark Miller
// http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
Q.all = all;
function all(promises) {
    return when(promises, function (promises) {
        var pendingCount = 0;
        var deferred = defer();
        array_reduce(promises, function (undefined, promise, index) {
            var snapshot;
            if (
                isPromise(promise) &&
                (snapshot = promise.inspect()).state === "fulfilled"
            ) {
                promises[index] = snapshot.value;
            } else {
                ++pendingCount;
                when(
                    promise,
                    function (value) {
                        promises[index] = value;
                        if (--pendingCount === 0) {
                            deferred.resolve(promises);
                        }
                    },
                    deferred.reject,
                    function (progress) {
                        deferred.notify({ index: index, value: progress });
                    }
                );
            }
        }, void 0);
        if (pendingCount === 0) {
            deferred.resolve(promises);
        }
        return deferred.promise;
    });
}

Promise.prototype.all = function () {
    return all(this);
};

/**
 * Returns the first resolved promise of an array. Prior rejected promises are
 * ignored.  Rejects only if all promises are rejected.
 * @param {Array*} an array containing values or promises for values
 * @returns a promise fulfilled with the value of the first resolved promise,
 * or a rejected promise if all promises are rejected.
 */
Q.any = any;

function any(promises) {
    if (promises.length === 0) {
        return Q.resolve();
    }

    var deferred = Q.defer();
    var pendingCount = 0;
    array_reduce(promises, function (prev, current, index) {
        var promise = promises[index];

        pendingCount++;

        when(promise, onFulfilled, onRejected, onProgress);
        function onFulfilled(result) {
            deferred.resolve(result);
        }
        function onRejected(err) {
            pendingCount--;
            if (pendingCount === 0) {
                var rejection = err || new Error("" + err);

                rejection.message = ("Q can't get fulfillment value from any promise, all " +
                    "promises were rejected. Last error message: " + rejection.message);

                deferred.reject(rejection);
            }
        }
        function onProgress(progress) {
            deferred.notify({
                index: index,
                value: progress
            });
        }
    }, undefined);

    return deferred.promise;
}

Promise.prototype.any = function () {
    return any(this);
};

/**
 * Waits for all promises to be settled, either fulfilled or
 * rejected.  This is distinct from `all` since that would stop
 * waiting at the first rejection.  The promise returned by
 * `allResolved` will never be rejected.
 * @param promises a promise for an array (or an array) of promises
 * (or values)
 * @return a promise for an array of promises
 */
Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
function allResolved(promises) {
    return when(promises, function (promises) {
        promises = array_map(promises, Q);
        return when(all(array_map(promises, function (promise) {
            return when(promise, noop, noop);
        })), function () {
            return promises;
        });
    });
}

Promise.prototype.allResolved = function () {
    return allResolved(this);
};

/**
 * @see Promise#allSettled
 */
Q.allSettled = allSettled;
function allSettled(promises) {
    return Q(promises).allSettled();
}

/**
 * Turns an array of promises into a promise for an array of their states (as
 * returned by `inspect`) when they have all settled.
 * @param {Array[Any*]} values an array (or promise for an array) of values (or
 * promises for values)
 * @returns {Array[State]} an array of states for the respective values.
 */
Promise.prototype.allSettled = function () {
    return this.then(function (promises) {
        return all(array_map(promises, function (promise) {
            promise = Q(promise);
            function regardless() {
                return promise.inspect();
            }
            return promise.then(regardless, regardless);
        }));
    });
};

/**
 * Captures the failure of a promise, giving an oportunity to recover
 * with a callback.  If the given promise is fulfilled, the returned
 * promise is fulfilled.
 * @param {Any*} promise for something
 * @param {Function} callback to fulfill the returned promise if the
 * given promise is rejected
 * @returns a promise for the return value of the callback
 */
Q.fail = // XXX legacy
Q["catch"] = function (object, rejected) {
    return Q(object).then(void 0, rejected);
};

Promise.prototype.fail = // XXX legacy
Promise.prototype["catch"] = function (rejected) {
    return this.then(void 0, rejected);
};

/**
 * Attaches a listener that can respond to progress notifications from a
 * promise's originating deferred. This listener receives the exact arguments
 * passed to ``deferred.notify``.
 * @param {Any*} promise for something
 * @param {Function} callback to receive any progress notifications
 * @returns the given promise, unchanged
 */
Q.progress = progress;
function progress(object, progressed) {
    return Q(object).then(void 0, void 0, progressed);
}

Promise.prototype.progress = function (progressed) {
    return this.then(void 0, void 0, progressed);
};

/**
 * Provides an opportunity to observe the settling of a promise,
 * regardless of whether the promise is fulfilled or rejected.  Forwards
 * the resolution to the returned promise when the callback is done.
 * The callback can return a promise to defer completion.
 * @param {Any*} promise
 * @param {Function} callback to observe the resolution of the given
 * promise, takes no arguments.
 * @returns a promise for the resolution of the given promise when
 * ``fin`` is done.
 */
Q.fin = // XXX legacy
Q["finally"] = function (object, callback) {
    return Q(object)["finally"](callback);
};

Promise.prototype.fin = // XXX legacy
Promise.prototype["finally"] = function (callback) {
    if (!callback || typeof callback.apply !== "function") {
        throw new Error("Q can't apply finally callback");
    }
    callback = Q(callback);
    return this.then(function (value) {
        return callback.fcall().then(function () {
            return value;
        });
    }, function (reason) {
        // TODO attempt to recycle the rejection with "this".
        return callback.fcall().then(function () {
            throw reason;
        });
    });
};

/**
 * Terminates a chain of promises, forcing rejections to be
 * thrown as exceptions.
 * @param {Any*} promise at the end of a chain of promises
 * @returns nothing
 */
Q.done = function (object, fulfilled, rejected, progress) {
    return Q(object).done(fulfilled, rejected, progress);
};

Promise.prototype.done = function (fulfilled, rejected, progress) {
    var onUnhandledError = function (error) {
        // forward to a future turn so that ``when``
        // does not catch it and turn it into a rejection.
        Q.nextTick(function () {
            makeStackTraceLong(error, promise);
            if (Q.onerror) {
                Q.onerror(error);
            } else {
                throw error;
            }
        });
    };

    // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
    var promise = fulfilled || rejected || progress ?
        this.then(fulfilled, rejected, progress) :
        this;

    if (typeof process === "object" && process && process.domain) {
        onUnhandledError = process.domain.bind(onUnhandledError);
    }

    promise.then(void 0, onUnhandledError);
};

/**
 * Causes a promise to be rejected if it does not get fulfilled before
 * some milliseconds time out.
 * @param {Any*} promise
 * @param {Number} milliseconds timeout
 * @param {Any*} custom error message or Error object (optional)
 * @returns a promise for the resolution of the given promise if it is
 * fulfilled before the timeout, otherwise rejected.
 */
Q.timeout = function (object, ms, error) {
    return Q(object).timeout(ms, error);
};

Promise.prototype.timeout = function (ms, error) {
    var deferred = defer();
    var timeoutId = setTimeout(function () {
        if (!error || "string" === typeof error) {
            error = new Error(error || "Timed out after " + ms + " ms");
            error.code = "ETIMEDOUT";
        }
        deferred.reject(error);
    }, ms);

    this.then(function (value) {
        clearTimeout(timeoutId);
        deferred.resolve(value);
    }, function (exception) {
        clearTimeout(timeoutId);
        deferred.reject(exception);
    }, deferred.notify);

    return deferred.promise;
};

/**
 * Returns a promise for the given value (or promised value), some
 * milliseconds after it resolved. Passes rejections immediately.
 * @param {Any*} promise
 * @param {Number} milliseconds
 * @returns a promise for the resolution of the given promise after milliseconds
 * time has elapsed since the resolution of the given promise.
 * If the given promise rejects, that is passed immediately.
 */
Q.delay = function (object, timeout) {
    if (timeout === void 0) {
        timeout = object;
        object = void 0;
    }
    return Q(object).delay(timeout);
};

Promise.prototype.delay = function (timeout) {
    return this.then(function (value) {
        var deferred = defer();
        setTimeout(function () {
            deferred.resolve(value);
        }, timeout);
        return deferred.promise;
    });
};

/**
 * Passes a continuation to a Node function, which is called with the given
 * arguments provided as an array, and returns a promise.
 *
 *      Q.nfapply(FS.readFile, [__filename])
 *      .then(function (content) {
 *      })
 *
 */
Q.nfapply = function (callback, args) {
    return Q(callback).nfapply(args);
};

Promise.prototype.nfapply = function (args) {
    var deferred = defer();
    var nodeArgs = array_slice(args);
    nodeArgs.push(deferred.makeNodeResolver());
    this.fapply(nodeArgs).fail(deferred.reject);
    return deferred.promise;
};

/**
 * Passes a continuation to a Node function, which is called with the given
 * arguments provided individually, and returns a promise.
 * @example
 * Q.nfcall(FS.readFile, __filename)
 * .then(function (content) {
 * })
 *
 */
Q.nfcall = function (callback /*...args*/) {
    var args = array_slice(arguments, 1);
    return Q(callback).nfapply(args);
};

Promise.prototype.nfcall = function (/*...args*/) {
    var nodeArgs = array_slice(arguments);
    var deferred = defer();
    nodeArgs.push(deferred.makeNodeResolver());
    this.fapply(nodeArgs).fail(deferred.reject);
    return deferred.promise;
};

/**
 * Wraps a NodeJS continuation passing function and returns an equivalent
 * version that returns a promise.
 * @example
 * Q.nfbind(FS.readFile, __filename)("utf-8")
 * .then(console.log)
 * .done()
 */
Q.nfbind =
Q.denodeify = function (callback /*...args*/) {
    if (callback === undefined) {
        throw new Error("Q can't wrap an undefined function");
    }
    var baseArgs = array_slice(arguments, 1);
    return function () {
        var nodeArgs = baseArgs.concat(array_slice(arguments));
        var deferred = defer();
        nodeArgs.push(deferred.makeNodeResolver());
        Q(callback).fapply(nodeArgs).fail(deferred.reject);
        return deferred.promise;
    };
};

Promise.prototype.nfbind =
Promise.prototype.denodeify = function (/*...args*/) {
    var args = array_slice(arguments);
    args.unshift(this);
    return Q.denodeify.apply(void 0, args);
};

Q.nbind = function (callback, thisp /*...args*/) {
    var baseArgs = array_slice(arguments, 2);
    return function () {
        var nodeArgs = baseArgs.concat(array_slice(arguments));
        var deferred = defer();
        nodeArgs.push(deferred.makeNodeResolver());
        function bound() {
            return callback.apply(thisp, arguments);
        }
        Q(bound).fapply(nodeArgs).fail(deferred.reject);
        return deferred.promise;
    };
};

Promise.prototype.nbind = function (/*thisp, ...args*/) {
    var args = array_slice(arguments, 0);
    args.unshift(this);
    return Q.nbind.apply(void 0, args);
};

/**
 * Calls a method of a Node-style object that accepts a Node-style
 * callback with a given array of arguments, plus a provided callback.
 * @param object an object that has the named method
 * @param {String} name name of the method of object
 * @param {Array} args arguments to pass to the method; the callback
 * will be provided by Q and appended to these arguments.
 * @returns a promise for the value or error
 */
Q.nmapply = // XXX As proposed by "Redsandro"
Q.npost = function (object, name, args) {
    return Q(object).npost(name, args);
};

Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
Promise.prototype.npost = function (name, args) {
    var nodeArgs = array_slice(args || []);
    var deferred = defer();
    nodeArgs.push(deferred.makeNodeResolver());
    this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
    return deferred.promise;
};

/**
 * Calls a method of a Node-style object that accepts a Node-style
 * callback, forwarding the given variadic arguments, plus a provided
 * callback argument.
 * @param object an object that has the named method
 * @param {String} name name of the method of object
 * @param ...args arguments to pass to the method; the callback will
 * be provided by Q and appended to these arguments.
 * @returns a promise for the value or error
 */
Q.nsend = // XXX Based on Mark Miller's proposed "send"
Q.nmcall = // XXX Based on "Redsandro's" proposal
Q.ninvoke = function (object, name /*...args*/) {
    var nodeArgs = array_slice(arguments, 2);
    var deferred = defer();
    nodeArgs.push(deferred.makeNodeResolver());
    Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
    return deferred.promise;
};

Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
Promise.prototype.ninvoke = function (name /*...args*/) {
    var nodeArgs = array_slice(arguments, 1);
    var deferred = defer();
    nodeArgs.push(deferred.makeNodeResolver());
    this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
    return deferred.promise;
};

/**
 * If a function would like to support both Node continuation-passing-style and
 * promise-returning-style, it can end its internal promise chain with
 * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
 * elects to use a nodeback, the result will be sent there.  If they do not
 * pass a nodeback, they will receive the result promise.
 * @param object a result (or a promise for a result)
 * @param {Function} nodeback a Node.js-style callback
 * @returns either the promise or nothing
 */
Q.nodeify = nodeify;
function nodeify(object, nodeback) {
    return Q(object).nodeify(nodeback);
}

Promise.prototype.nodeify = function (nodeback) {
    if (nodeback) {
        this.then(function (value) {
            Q.nextTick(function () {
                nodeback(null, value);
            });
        }, function (error) {
            Q.nextTick(function () {
                nodeback(error);
            });
        });
    } else {
        return this;
    }
};

Q.noConflict = function() {
    throw new Error("Q.noConflict only works when Q is used as a global");
};

// All code before this point will be filtered from stack traces.
var qEndingLine = captureLine();

return Q;

});

var Q = require("./q");

module.exports = Queue;
function Queue() {
    var ends = Q.defer();
    var closed = Q.defer();
    return {
        put: function (value) {
            var next = Q.defer();
            ends.resolve({
                head: value,
                tail: next.promise
            });
            ends.resolve = next.resolve;
        },
        get: function () {
            var result = ends.promise.get("head");
            ends.promise = ends.promise.get("tail");
            return result.fail(function (error) {
                closed.resolve(error);
                throw error;
            });
        },
        closed: closed.promise,
        close: function (error) {
            error = error || new Error("Can't get value from closed queue");
            var end = {head: Q.reject(error)};
            end.tail = end;
            ends.resolve(end);
            return closed.promise;
        }
    };
}

root = true

[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 140

[test/*]
max_line_length = off

[*.md]
max_line_length = off

[*.json]
max_line_length = off

[Makefile]
max_line_length = off

[CHANGELOG.md]
indent_style = space
indent_size = 2

[LICENSE]
indent_size = 2
max_line_length = off
dist
Copyright (c) 2014 Nathan LaFreniere and other contributors.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
    * The names of any contributors may not be used to endorse or promote
      products derived from this software without specific prior written
      permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

                                  *   *   *

The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors
{
  "dependencies": {},
  "deprecated": false,
  "description": "A querystring parser that supports nesting and arrays, with a depth limit",
  "devDependencies": {
    "@ljharb/eslint-config": "^12.2.1",
    "browserify": "^16.2.0",
    "covert": "^1.1.0",
    "editorconfig-tools": "^0.1.1",
    "eslint": "^4.19.1",
    "evalmd": "^0.0.17",
    "iconv-lite": "^0.4.21",
    "mkdirp": "^0.5.1",
    "qs-iconv": "^1.0.4",
    "safe-publish-latest": "^1.1.1",
    "safer-buffer": "^2.1.2",
    "tape": "^4.9.0"
  },
  "engines": {
    "node": ">=0.6"
  },
  "homepage": "https://github.com/ljharb/qs",
  "license": "BSD-3-Clause",
  "main": "lib/index.js",
  "name": "qs",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ljharb/qs.git"
  },
  "version": "6.5.2"
}'use strict';

var replace = String.prototype.replace;
var percentTwenties = /%20/g;

module.exports = {
    'default': 'RFC3986',
    formatters: {
        RFC1738: function (value) {
            return replace.call(value, percentTwenties, '+');
        },
        RFC3986: function (value) {
            return value;
        }
    },
    RFC1738: 'RFC1738',
    RFC3986: 'RFC3986'
};
'use strict';

var stringify = require('./stringify');
var parse = require('./parse');
var formats = require('./formats');

module.exports = {
    formats: formats,
    parse: parse,
    stringify: stringify
};
'use strict';

var utils = require('./utils');

var has = Object.prototype.hasOwnProperty;

var defaults = {
    allowDots: false,
    allowPrototypes: false,
    arrayLimit: 20,
    decoder: utils.decode,
    delimiter: '&',
    depth: 5,
    parameterLimit: 1000,
    plainObjects: false,
    strictNullHandling: false
};

var parseValues = function parseQueryStringValues(str, options) {
    var obj = {};
    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
    var parts = cleanStr.split(options.delimiter, limit);

    for (var i = 0; i < parts.length; ++i) {
        var part = parts[i];

        var bracketEqualsPos = part.indexOf(']=');
        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;

        var key, val;
        if (pos === -1) {
            key = options.decoder(part, defaults.decoder);
            val = options.strictNullHandling ? null : '';
        } else {
            key = options.decoder(part.slice(0, pos), defaults.decoder);
            val = options.decoder(part.slice(pos + 1), defaults.decoder);
        }
        if (has.call(obj, key)) {
            obj[key] = [].concat(obj[key]).concat(val);
        } else {
            obj[key] = val;
        }
    }

    return obj;
};

var parseObject = function (chain, val, options) {
    var leaf = val;

    for (var i = chain.length - 1; i >= 0; --i) {
        var obj;
        var root = chain[i];

        if (root === '[]') {
            obj = [];
            obj = obj.concat(leaf);
        } else {
            obj = options.plainObjects ? Object.create(null) : {};
            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
            var index = parseInt(cleanRoot, 10);
            if (
                !isNaN(index)
                && root !== cleanRoot
                && String(index) === cleanRoot
                && index >= 0
                && (options.parseArrays && index <= options.arrayLimit)
            ) {
                obj = [];
                obj[index] = leaf;
            } else {
                obj[cleanRoot] = leaf;
            }
        }

        leaf = obj;
    }

    return leaf;
};

var parseKeys = function parseQueryStringKeys(givenKey, val, options) {
    if (!givenKey) {
        return;
    }

    // Transform dot notation to bracket notation
    var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;

    // The regex chunks

    var brackets = /(\[[^[\]]*])/;
    var child = /(\[[^[\]]*])/g;

    // Get the parent

    var segment = brackets.exec(key);
    var parent = segment ? key.slice(0, segment.index) : key;

    // Stash the parent if it exists

    var keys = [];
    if (parent) {
        // If we aren't using plain objects, optionally prefix keys
        // that would overwrite object prototype properties
        if (!options.plainObjects && has.call(Object.prototype, parent)) {
            if (!options.allowPrototypes) {
                return;
            }
        }

        keys.push(parent);
    }

    // Loop through children appending to the array until we hit depth

    var i = 0;
    while ((segment = child.exec(key)) !== null && i < options.depth) {
        i += 1;
        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
            if (!options.allowPrototypes) {
                return;
            }
        }
        keys.push(segment[1]);
    }

    // If there's a remainder, just add whatever is left

    if (segment) {
        keys.push('[' + key.slice(segment.index) + ']');
    }

    return parseObject(keys, val, options);
};

module.exports = function (str, opts) {
    var options = opts ? utils.assign({}, opts) : {};

    if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {
        throw new TypeError('Decoder has to be a function.');
    }

    options.ignoreQueryPrefix = options.ignoreQueryPrefix === true;
    options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;
    options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;
    options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;
    options.parseArrays = options.parseArrays !== false;
    options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;
    options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;
    options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;
    options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;
    options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;
    options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;

    if (str === '' || str === null || typeof str === 'undefined') {
        return options.plainObjects ? Object.create(null) : {};
    }

    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
    var obj = options.plainObjects ? Object.create(null) : {};

    // Iterate over the keys and setup the new object

    var keys = Object.keys(tempObj);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var newObj = parseKeys(key, tempObj[key], options);
        obj = utils.merge(obj, newObj, options);
    }

    return utils.compact(obj);
};
'use strict';

var utils = require('./utils');
var formats = require('./formats');

var arrayPrefixGenerators = {
    brackets: function brackets(prefix) { // eslint-disable-line func-name-matching
        return prefix + '[]';
    },
    indices: function indices(prefix, key) { // eslint-disable-line func-name-matching
        return prefix + '[' + key + ']';
    },
    repeat: function repeat(prefix) { // eslint-disable-line func-name-matching
        return prefix;
    }
};

var toISO = Date.prototype.toISOString;

var defaults = {
    delimiter: '&',
    encode: true,
    encoder: utils.encode,
    encodeValuesOnly: false,
    serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching
        return toISO.call(date);
    },
    skipNulls: false,
    strictNullHandling: false
};

var stringify = function stringify( // eslint-disable-line func-name-matching
    object,
    prefix,
    generateArrayPrefix,
    strictNullHandling,
    skipNulls,
    encoder,
    filter,
    sort,
    allowDots,
    serializeDate,
    formatter,
    encodeValuesOnly
) {
    var obj = object;
    if (typeof filter === 'function') {
        obj = filter(prefix, obj);
    } else if (obj instanceof Date) {
        obj = serializeDate(obj);
    } else if (obj === null) {
        if (strictNullHandling) {
            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix;
        }

        obj = '';
    }

    if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {
        if (encoder) {
            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder);
            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))];
        }
        return [formatter(prefix) + '=' + formatter(String(obj))];
    }

    var values = [];

    if (typeof obj === 'undefined') {
        return values;
    }

    var objKeys;
    if (Array.isArray(filter)) {
        objKeys = filter;
    } else {
        var keys = Object.keys(obj);
        objKeys = sort ? keys.sort(sort) : keys;
    }

    for (var i = 0; i < objKeys.length; ++i) {
        var key = objKeys[i];

        if (skipNulls && obj[key] === null) {
            continue;
        }

        if (Array.isArray(obj)) {
            values = values.concat(stringify(
                obj[key],
                generateArrayPrefix(prefix, key),
                generateArrayPrefix,
                strictNullHandling,
                skipNulls,
                encoder,
                filter,
                sort,
                allowDots,
                serializeDate,
                formatter,
                encodeValuesOnly
            ));
        } else {
            values = values.concat(stringify(
                obj[key],
                prefix + (allowDots ? '.' + key : '[' + key + ']'),
                generateArrayPrefix,
                strictNullHandling,
                skipNulls,
                encoder,
                filter,
                sort,
                allowDots,
                serializeDate,
                formatter,
                encodeValuesOnly
            ));
        }
    }

    return values;
};

module.exports = function (object, opts) {
    var obj = object;
    var options = opts ? utils.assign({}, opts) : {};

    if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {
        throw new TypeError('Encoder has to be a function.');
    }

    var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;
    var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
    var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;
    var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;
    var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder;
    var sort = typeof options.sort === 'function' ? options.sort : null;
    var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;
    var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate;
    var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly;
    if (typeof options.format === 'undefined') {
        options.format = formats['default'];
    } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {
        throw new TypeError('Unknown format option provided.');
    }
    var formatter = formats.formatters[options.format];
    var objKeys;
    var filter;

    if (typeof options.filter === 'function') {
        filter = options.filter;
        obj = filter('', obj);
    } else if (Array.isArray(options.filter)) {
        filter = options.filter;
        objKeys = filter;
    }

    var keys = [];

    if (typeof obj !== 'object' || obj === null) {
        return '';
    }

    var arrayFormat;
    if (options.arrayFormat in arrayPrefixGenerators) {
        arrayFormat = options.arrayFormat;
    } else if ('indices' in options) {
        arrayFormat = options.indices ? 'indices' : 'repeat';
    } else {
        arrayFormat = 'indices';
    }

    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];

    if (!objKeys) {
        objKeys = Object.keys(obj);
    }

    if (sort) {
        objKeys.sort(sort);
    }

    for (var i = 0; i < objKeys.length; ++i) {
        var key = objKeys[i];

        if (skipNulls && obj[key] === null) {
            continue;
        }

        keys = keys.concat(stringify(
            obj[key],
            key,
            generateArrayPrefix,
            strictNullHandling,
            skipNulls,
            encode ? encoder : null,
            filter,
            sort,
            allowDots,
            serializeDate,
            formatter,
            encodeValuesOnly
        ));
    }

    var joined = keys.join(delimiter);
    var prefix = options.addQueryPrefix === true ? '?' : '';

    return joined.length > 0 ? prefix + joined : '';
};
'use strict';

var has = Object.prototype.hasOwnProperty;

var hexTable = (function () {
    var array = [];
    for (var i = 0; i < 256; ++i) {
        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
    }

    return array;
}());

var compactQueue = function compactQueue(queue) {
    var obj;

    while (queue.length) {
        var item = queue.pop();
        obj = item.obj[item.prop];

        if (Array.isArray(obj)) {
            var compacted = [];

            for (var j = 0; j < obj.length; ++j) {
                if (typeof obj[j] !== 'undefined') {
                    compacted.push(obj[j]);
                }
            }

            item.obj[item.prop] = compacted;
        }
    }

    return obj;
};

var arrayToObject = function arrayToObject(source, options) {
    var obj = options && options.plainObjects ? Object.create(null) : {};
    for (var i = 0; i < source.length; ++i) {
        if (typeof source[i] !== 'undefined') {
            obj[i] = source[i];
        }
    }

    return obj;
};

var merge = function merge(target, source, options) {
    if (!source) {
        return target;
    }

    if (typeof source !== 'object') {
        if (Array.isArray(target)) {
            target.push(source);
        } else if (typeof target === 'object') {
            if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) {
                target[source] = true;
            }
        } else {
            return [target, source];
        }

        return target;
    }

    if (typeof target !== 'object') {
        return [target].concat(source);
    }

    var mergeTarget = target;
    if (Array.isArray(target) && !Array.isArray(source)) {
        mergeTarget = arrayToObject(target, options);
    }

    if (Array.isArray(target) && Array.isArray(source)) {
        source.forEach(function (item, i) {
            if (has.call(target, i)) {
                if (target[i] && typeof target[i] === 'object') {
                    target[i] = merge(target[i], item, options);
                } else {
                    target.push(item);
                }
            } else {
                target[i] = item;
            }
        });
        return target;
    }

    return Object.keys(source).reduce(function (acc, key) {
        var value = source[key];

        if (has.call(acc, key)) {
            acc[key] = merge(acc[key], value, options);
        } else {
            acc[key] = value;
        }
        return acc;
    }, mergeTarget);
};

var assign = function assignSingleSource(target, source) {
    return Object.keys(source).reduce(function (acc, key) {
        acc[key] = source[key];
        return acc;
    }, target);
};

var decode = function (str) {
    try {
        return decodeURIComponent(str.replace(/\+/g, ' '));
    } catch (e) {
        return str;
    }
};

var encode = function encode(str) {
    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
    // It has been adapted here for stricter adherence to RFC 3986
    if (str.length === 0) {
        return str;
    }

    var string = typeof str === 'string' ? str : String(str);

    var out = '';
    for (var i = 0; i < string.length; ++i) {
        var c = string.charCodeAt(i);

        if (
            c === 0x2D // -
            || c === 0x2E // .
            || c === 0x5F // _
            || c === 0x7E // ~
            || (c >= 0x30 && c <= 0x39) // 0-9
            || (c >= 0x41 && c <= 0x5A) // a-z
            || (c >= 0x61 && c <= 0x7A) // A-Z
        ) {
            out += string.charAt(i);
            continue;
        }

        if (c < 0x80) {
            out = out + hexTable[c];
            continue;
        }

        if (c < 0x800) {
            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        if (c < 0xD800 || c >= 0xE000) {
            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        i += 1;
        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
        out += hexTable[0xF0 | (c >> 18)]
            + hexTable[0x80 | ((c >> 12) & 0x3F)]
            + hexTable[0x80 | ((c >> 6) & 0x3F)]
            + hexTable[0x80 | (c & 0x3F)];
    }

    return out;
};

var compact = function compact(value) {
    var queue = [{ obj: { o: value }, prop: 'o' }];
    var refs = [];

    for (var i = 0; i < queue.length; ++i) {
        var item = queue[i];
        var obj = item.obj[item.prop];

        var keys = Object.keys(obj);
        for (var j = 0; j < keys.length; ++j) {
            var key = keys[j];
            var val = obj[key];
            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
                queue.push({ obj: obj, prop: key });
                refs.push(val);
            }
        }
    }

    return compactQueue(queue);
};

var isRegExp = function isRegExp(obj) {
    return Object.prototype.toString.call(obj) === '[object RegExp]';
};

var isBuffer = function isBuffer(obj) {
    if (obj === null || typeof obj === 'undefined') {
        return false;
    }

    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};

module.exports = {
    arrayToObject: arrayToObject,
    assign: assign,
    compact: compact,
    decode: decode,
    encode: encode,
    isBuffer: isBuffer,
    isRegExp: isRegExp,
    merge: merge
};
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
'use strict';

var replace = String.prototype.replace;
var percentTwenties = /%20/g;

module.exports = {
    'default': 'RFC3986',
    formatters: {
        RFC1738: function (value) {
            return replace.call(value, percentTwenties, '+');
        },
        RFC3986: function (value) {
            return value;
        }
    },
    RFC1738: 'RFC1738',
    RFC3986: 'RFC3986'
};

},{}],2:[function(require,module,exports){
'use strict';

var stringify = require('./stringify');
var parse = require('./parse');
var formats = require('./formats');

module.exports = {
    formats: formats,
    parse: parse,
    stringify: stringify
};

},{"./formats":1,"./parse":3,"./stringify":4}],3:[function(require,module,exports){
'use strict';

var utils = require('./utils');

var has = Object.prototype.hasOwnProperty;

var defaults = {
    allowDots: false,
    allowPrototypes: false,
    arrayLimit: 20,
    decoder: utils.decode,
    delimiter: '&',
    depth: 5,
    parameterLimit: 1000,
    plainObjects: false,
    strictNullHandling: false
};

var parseValues = function parseQueryStringValues(str, options) {
    var obj = {};
    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
    var parts = cleanStr.split(options.delimiter, limit);

    for (var i = 0; i < parts.length; ++i) {
        var part = parts[i];

        var bracketEqualsPos = part.indexOf(']=');
        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;

        var key, val;
        if (pos === -1) {
            key = options.decoder(part, defaults.decoder);
            val = options.strictNullHandling ? null : '';
        } else {
            key = options.decoder(part.slice(0, pos), defaults.decoder);
            val = options.decoder(part.slice(pos + 1), defaults.decoder);
        }
        if (has.call(obj, key)) {
            obj[key] = [].concat(obj[key]).concat(val);
        } else {
            obj[key] = val;
        }
    }

    return obj;
};

var parseObject = function (chain, val, options) {
    var leaf = val;

    for (var i = chain.length - 1; i >= 0; --i) {
        var obj;
        var root = chain[i];

        if (root === '[]') {
            obj = [];
            obj = obj.concat(leaf);
        } else {
            obj = options.plainObjects ? Object.create(null) : {};
            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
            var index = parseInt(cleanRoot, 10);
            if (
                !isNaN(index)
                && root !== cleanRoot
                && String(index) === cleanRoot
                && index >= 0
                && (options.parseArrays && index <= options.arrayLimit)
            ) {
                obj = [];
                obj[index] = leaf;
            } else {
                obj[cleanRoot] = leaf;
            }
        }

        leaf = obj;
    }

    return leaf;
};

var parseKeys = function parseQueryStringKeys(givenKey, val, options) {
    if (!givenKey) {
        return;
    }

    // Transform dot notation to bracket notation
    var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;

    // The regex chunks

    var brackets = /(\[[^[\]]*])/;
    var child = /(\[[^[\]]*])/g;

    // Get the parent

    var segment = brackets.exec(key);
    var parent = segment ? key.slice(0, segment.index) : key;

    // Stash the parent if it exists

    var keys = [];
    if (parent) {
        // If we aren't using plain objects, optionally prefix keys
        // that would overwrite object prototype properties
        if (!options.plainObjects && has.call(Object.prototype, parent)) {
            if (!options.allowPrototypes) {
                return;
            }
        }

        keys.push(parent);
    }

    // Loop through children appending to the array until we hit depth

    var i = 0;
    while ((segment = child.exec(key)) !== null && i < options.depth) {
        i += 1;
        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
            if (!options.allowPrototypes) {
                return;
            }
        }
        keys.push(segment[1]);
    }

    // If there's a remainder, just add whatever is left

    if (segment) {
        keys.push('[' + key.slice(segment.index) + ']');
    }

    return parseObject(keys, val, options);
};

module.exports = function (str, opts) {
    var options = opts ? utils.assign({}, opts) : {};

    if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {
        throw new TypeError('Decoder has to be a function.');
    }

    options.ignoreQueryPrefix = options.ignoreQueryPrefix === true;
    options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;
    options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;
    options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;
    options.parseArrays = options.parseArrays !== false;
    options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;
    options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;
    options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;
    options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;
    options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;
    options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;

    if (str === '' || str === null || typeof str === 'undefined') {
        return options.plainObjects ? Object.create(null) : {};
    }

    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
    var obj = options.plainObjects ? Object.create(null) : {};

    // Iterate over the keys and setup the new object

    var keys = Object.keys(tempObj);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var newObj = parseKeys(key, tempObj[key], options);
        obj = utils.merge(obj, newObj, options);
    }

    return utils.compact(obj);
};

},{"./utils":5}],4:[function(require,module,exports){
'use strict';

var utils = require('./utils');
var formats = require('./formats');

var arrayPrefixGenerators = {
    brackets: function brackets(prefix) { // eslint-disable-line func-name-matching
        return prefix + '[]';
    },
    indices: function indices(prefix, key) { // eslint-disable-line func-name-matching
        return prefix + '[' + key + ']';
    },
    repeat: function repeat(prefix) { // eslint-disable-line func-name-matching
        return prefix;
    }
};

var toISO = Date.prototype.toISOString;

var defaults = {
    delimiter: '&',
    encode: true,
    encoder: utils.encode,
    encodeValuesOnly: false,
    serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching
        return toISO.call(date);
    },
    skipNulls: false,
    strictNullHandling: false
};

var stringify = function stringify( // eslint-disable-line func-name-matching
    object,
    prefix,
    generateArrayPrefix,
    strictNullHandling,
    skipNulls,
    encoder,
    filter,
    sort,
    allowDots,
    serializeDate,
    formatter,
    encodeValuesOnly
) {
    var obj = object;
    if (typeof filter === 'function') {
        obj = filter(prefix, obj);
    } else if (obj instanceof Date) {
        obj = serializeDate(obj);
    } else if (obj === null) {
        if (strictNullHandling) {
            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix;
        }

        obj = '';
    }

    if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {
        if (encoder) {
            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder);
            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))];
        }
        return [formatter(prefix) + '=' + formatter(String(obj))];
    }

    var values = [];

    if (typeof obj === 'undefined') {
        return values;
    }

    var objKeys;
    if (Array.isArray(filter)) {
        objKeys = filter;
    } else {
        var keys = Object.keys(obj);
        objKeys = sort ? keys.sort(sort) : keys;
    }

    for (var i = 0; i < objKeys.length; ++i) {
        var key = objKeys[i];

        if (skipNulls && obj[key] === null) {
            continue;
        }

        if (Array.isArray(obj)) {
            values = values.concat(stringify(
                obj[key],
                generateArrayPrefix(prefix, key),
                generateArrayPrefix,
                strictNullHandling,
                skipNulls,
                encoder,
                filter,
                sort,
                allowDots,
                serializeDate,
                formatter,
                encodeValuesOnly
            ));
        } else {
            values = values.concat(stringify(
                obj[key],
                prefix + (allowDots ? '.' + key : '[' + key + ']'),
                generateArrayPrefix,
                strictNullHandling,
                skipNulls,
                encoder,
                filter,
                sort,
                allowDots,
                serializeDate,
                formatter,
                encodeValuesOnly
            ));
        }
    }

    return values;
};

module.exports = function (object, opts) {
    var obj = object;
    var options = opts ? utils.assign({}, opts) : {};

    if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {
        throw new TypeError('Encoder has to be a function.');
    }

    var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;
    var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
    var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;
    var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;
    var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder;
    var sort = typeof options.sort === 'function' ? options.sort : null;
    var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;
    var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate;
    var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly;
    if (typeof options.format === 'undefined') {
        options.format = formats['default'];
    } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {
        throw new TypeError('Unknown format option provided.');
    }
    var formatter = formats.formatters[options.format];
    var objKeys;
    var filter;

    if (typeof options.filter === 'function') {
        filter = options.filter;
        obj = filter('', obj);
    } else if (Array.isArray(options.filter)) {
        filter = options.filter;
        objKeys = filter;
    }

    var keys = [];

    if (typeof obj !== 'object' || obj === null) {
        return '';
    }

    var arrayFormat;
    if (options.arrayFormat in arrayPrefixGenerators) {
        arrayFormat = options.arrayFormat;
    } else if ('indices' in options) {
        arrayFormat = options.indices ? 'indices' : 'repeat';
    } else {
        arrayFormat = 'indices';
    }

    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];

    if (!objKeys) {
        objKeys = Object.keys(obj);
    }

    if (sort) {
        objKeys.sort(sort);
    }

    for (var i = 0; i < objKeys.length; ++i) {
        var key = objKeys[i];

        if (skipNulls && obj[key] === null) {
            continue;
        }

        keys = keys.concat(stringify(
            obj[key],
            key,
            generateArrayPrefix,
            strictNullHandling,
            skipNulls,
            encode ? encoder : null,
            filter,
            sort,
            allowDots,
            serializeDate,
            formatter,
            encodeValuesOnly
        ));
    }

    var joined = keys.join(delimiter);
    var prefix = options.addQueryPrefix === true ? '?' : '';

    return joined.length > 0 ? prefix + joined : '';
};

},{"./formats":1,"./utils":5}],5:[function(require,module,exports){
'use strict';

var has = Object.prototype.hasOwnProperty;

var hexTable = (function () {
    var array = [];
    for (var i = 0; i < 256; ++i) {
        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
    }

    return array;
}());

var compactQueue = function compactQueue(queue) {
    var obj;

    while (queue.length) {
        var item = queue.pop();
        obj = item.obj[item.prop];

        if (Array.isArray(obj)) {
            var compacted = [];

            for (var j = 0; j < obj.length; ++j) {
                if (typeof obj[j] !== 'undefined') {
                    compacted.push(obj[j]);
                }
            }

            item.obj[item.prop] = compacted;
        }
    }

    return obj;
};

var arrayToObject = function arrayToObject(source, options) {
    var obj = options && options.plainObjects ? Object.create(null) : {};
    for (var i = 0; i < source.length; ++i) {
        if (typeof source[i] !== 'undefined') {
            obj[i] = source[i];
        }
    }

    return obj;
};

var merge = function merge(target, source, options) {
    if (!source) {
        return target;
    }

    if (typeof source !== 'object') {
        if (Array.isArray(target)) {
            target.push(source);
        } else if (typeof target === 'object') {
            if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) {
                target[source] = true;
            }
        } else {
            return [target, source];
        }

        return target;
    }

    if (typeof target !== 'object') {
        return [target].concat(source);
    }

    var mergeTarget = target;
    if (Array.isArray(target) && !Array.isArray(source)) {
        mergeTarget = arrayToObject(target, options);
    }

    if (Array.isArray(target) && Array.isArray(source)) {
        source.forEach(function (item, i) {
            if (has.call(target, i)) {
                if (target[i] && typeof target[i] === 'object') {
                    target[i] = merge(target[i], item, options);
                } else {
                    target.push(item);
                }
            } else {
                target[i] = item;
            }
        });
        return target;
    }

    return Object.keys(source).reduce(function (acc, key) {
        var value = source[key];

        if (has.call(acc, key)) {
            acc[key] = merge(acc[key], value, options);
        } else {
            acc[key] = value;
        }
        return acc;
    }, mergeTarget);
};

var assign = function assignSingleSource(target, source) {
    return Object.keys(source).reduce(function (acc, key) {
        acc[key] = source[key];
        return acc;
    }, target);
};

var decode = function (str) {
    try {
        return decodeURIComponent(str.replace(/\+/g, ' '));
    } catch (e) {
        return str;
    }
};

var encode = function encode(str) {
    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
    // It has been adapted here for stricter adherence to RFC 3986
    if (str.length === 0) {
        return str;
    }

    var string = typeof str === 'string' ? str : String(str);

    var out = '';
    for (var i = 0; i < string.length; ++i) {
        var c = string.charCodeAt(i);

        if (
            c === 0x2D // -
            || c === 0x2E // .
            || c === 0x5F // _
            || c === 0x7E // ~
            || (c >= 0x30 && c <= 0x39) // 0-9
            || (c >= 0x41 && c <= 0x5A) // a-z
            || (c >= 0x61 && c <= 0x7A) // A-Z
        ) {
            out += string.charAt(i);
            continue;
        }

        if (c < 0x80) {
            out = out + hexTable[c];
            continue;
        }

        if (c < 0x800) {
            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        if (c < 0xD800 || c >= 0xE000) {
            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        i += 1;
        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
        out += hexTable[0xF0 | (c >> 18)]
            + hexTable[0x80 | ((c >> 12) & 0x3F)]
            + hexTable[0x80 | ((c >> 6) & 0x3F)]
            + hexTable[0x80 | (c & 0x3F)];
    }

    return out;
};

var compact = function compact(value) {
    var queue = [{ obj: { o: value }, prop: 'o' }];
    var refs = [];

    for (var i = 0; i < queue.length; ++i) {
        var item = queue[i];
        var obj = item.obj[item.prop];

        var keys = Object.keys(obj);
        for (var j = 0; j < keys.length; ++j) {
            var key = keys[j];
            var val = obj[key];
            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
                queue.push({ obj: obj, prop: key });
                refs.push(val);
            }
        }
    }

    return compactQueue(queue);
};

var isRegExp = function isRegExp(obj) {
    return Object.prototype.toString.call(obj) === '[object RegExp]';
};

var isBuffer = function isBuffer(obj) {
    if (obj === null || typeof obj === 'undefined') {
        return false;
    }

    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};

module.exports = {
    arrayToObject: arrayToObject,
    assign: assign,
    compact: compact,
    decode: decode,
    encode: encode,
    isBuffer: isBuffer,
    isRegExp: isRegExp,
    merge: merge
};

},{}]},{},[2])(2)
});
Apache License, Version 2.0

Copyright (c) 2011 Dominic Tarr

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Copyright (c) 2013, Dominic Tarr
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: 

1. Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer. 
2. Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution. 

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies, 
either expressed or implied, of the FreeBSD Project.
The MIT License

Copyright (c) 2011 Dominic Tarr

Permission is hereby granted, free of charge, 
to any person obtaining a copy of this software and 
associated documentation files (the "Software"), to 
deal in the Software without restriction, including 
without limitation the rights to use, copy, modify, 
merge, publish, distribute, sublicense, and/or sell 
copies of the Software, and to permit persons to whom 
the Software is furnished to do so, 
subject to the following conditions:

The above copyright notice and this permission notice 
shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR 
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

// when this is loaded into the browser, 
// just use the defaults...

module.exports = function (name, defaults) {
  return defaults
}
#! /usr/bin/env node
var rc = require('./index')

console.log(JSON.stringify(rc(process.argv[2]), false, 2))
var cc   = require('./lib/utils')
var join = require('path').join
var deepExtend = require('deep-extend')
var etc = '/etc'
var win = process.platform === "win32"
var home = win
           ? process.env.USERPROFILE
           : process.env.HOME

module.exports = function (name, defaults, argv, parse) {
  if('string' !== typeof name)
    throw new Error('rc(name): name *must* be string')
  if(!argv)
    argv = require('minimist')(process.argv.slice(2))
  defaults = (
      'string' === typeof defaults
    ? cc.json(defaults) : defaults
    ) || {}

  parse = parse || cc.parse

  var env = cc.env(name + '_')

  var configs = [defaults]
  var configFiles = []
  function addConfigFile (file) {
    if (configFiles.indexOf(file) >= 0) return
    var fileConfig = cc.file(file)
    if (fileConfig) {
      configs.push(parse(fileConfig))
      configFiles.push(file)
    }
  }

  // which files do we look at?
  if (!win)
   [join(etc, name, 'config'),
    join(etc, name + 'rc')].forEach(addConfigFile)
  if (home)
   [join(home, '.config', name, 'config'),
    join(home, '.config', name),
    join(home, '.' + name, 'config'),
    join(home, '.' + name + 'rc')].forEach(addConfigFile)
  addConfigFile(cc.find('.'+name+'rc'))
  if (env.config) addConfigFile(env.config)
  if (argv.config) addConfigFile(argv.config)

  return deepExtend.apply(null, configs.concat([
    env,
    argv,
    configFiles.length ? {configs: configFiles, config: configFiles[configFiles.length - 1]} : undefined,
  ]))
}
{
  "author": {
    "name": "Dominic Tarr",
    "email": "dominic.tarr@gmail.com",
    "url": "dominictarr.com"
  },
  "bin": {
    "rc": "cli.js"
  },
  "browser": "browser.js",
  "dependencies": {
    "deep-extend": "^0.6.0",
    "ini": "~1.3.0",
    "minimist": "^1.2.0",
    "strip-json-comments": "~2.0.1"
  },
  "deprecated": false,
  "description": "hardwired configuration loader",
  "homepage": "https://github.com/dominictarr/rc#readme",
  "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
  "main": "index.js",
  "name": "rc",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/dominictarr/rc.git"
  },
  "version": "1.2.8"
}'use strict';
var fs   = require('fs')
var ini  = require('ini')
var path = require('path')
var stripJsonComments = require('strip-json-comments')

var parse = exports.parse = function (content) {

  //if it ends in .json or starts with { then it must be json.
  //must be done this way, because ini accepts everything.
  //can't just try and parse it and let it throw if it's not ini.
  //everything is ini. even json with a syntax error.

  if(/^\s*{/.test(content))
    return JSON.parse(stripJsonComments(content))
  return ini.parse(content)

}

var file = exports.file = function () {
  var args = [].slice.call(arguments).filter(function (arg) { return arg != null })

  //path.join breaks if it's a not a string, so just skip this.
  for(var i in args)
    if('string' !== typeof args[i])
      return

  var file = path.join.apply(null, args)
  var content
  try {
    return fs.readFileSync(file,'utf-8')
  } catch (err) {
    return
  }
}

var json = exports.json = function () {
  var content = file.apply(null, arguments)
  return content ? parse(content) : null
}

var env = exports.env = function (prefix, env) {
  env = env || process.env
  var obj = {}
  var l = prefix.length
  for(var k in env) {
    if(k.toLowerCase().indexOf(prefix.toLowerCase()) === 0) {

      var keypath = k.substring(l).split('__')

      // Trim empty strings from keypath array
      var _emptyStringIndex
      while ((_emptyStringIndex=keypath.indexOf('')) > -1) {
        keypath.splice(_emptyStringIndex, 1)
      }

      var cursor = obj
      keypath.forEach(function _buildSubObj(_subkey,i){

        // (check for _subkey first so we ignore empty strings)
        // (check for cursor to avoid assignment to primitive objects)
        if (!_subkey || typeof cursor !== 'object')
          return

        // If this is the last key, just stuff the value in there
        // Assigns actual value from env variable to final key
        // (unless it's just an empty string- in that case use the last valid key)
        if (i === keypath.length-1)
          cursor[_subkey] = env[k]


        // Build sub-object if nothing already exists at the keypath
        if (cursor[_subkey] === undefined)
          cursor[_subkey] = {}

        // Increment cursor used to track the object at the current depth
        cursor = cursor[_subkey]

      })

    }

  }

  return obj
}

var find = exports.find = function () {
  var rel = path.join.apply(null, [].slice.call(arguments))

  function find(start, rel) {
    var file = path.join(start, rel)
    try {
      fs.statSync(file)
      return file
    } catch (err) {
      if(path.dirname(start) !== start) // root
        return find(path.dirname(start), rel)
    }
  }
  return find(process.cwd(), rel)
}


{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "ajv": "^6.9.2",
    "ajv-keywords": "^3.4.0",
    "bluebird-lst": "^1.0.7",
    "dotenv": "^6.2.0",
    "dotenv-expand": "^4.2.0",
    "fs-extra-p": "^7.0.1",
    "js-yaml": "^3.12.1",
    "json5": "^2.1.0",
    "lazy-val": "^1.0.4"
  },
  "deprecated": false,
  "description": "Read configuration file in various formats:",
  "devDependencies": {
    "@types/dotenv": "^6.1.0",
    "@types/js-yaml": "^3.12.0",
    "@types/node": "^11.9.5",
    "babel-preset-ts-node6-bluebird": "^3.0.2",
    "ts-babel": "^6.1.4",
    "typescript": "^3.3.3333"
  },
  "files": [
    "out"
  ],
  "homepage": "https://github.com/develar/read-config-file",
  "license": "MIT",
  "main": "out/main.js",
  "name": "read-config-file",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/develar/read-config-file.git"
  },
  "typings": "./out/main.d.ts",
  "version": "3.2.2"
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.normaliseErrorMessages = normaliseErrorMessages;

function normaliseErrorMessages(errors, schemeData) {
  const printer = new SchemeErrorPrinter(schemeData);
  return "Configuration is invalid.\n" + filterErrors(errors).map(it => " - " + indent(printer.formatValidationError(it), "   ", false)).join("\n");
}

class SchemeErrorPrinter {
  constructor(schemeData) {
    this.schemeData = schemeData;
  }

  formatValidationError(error) {
    const dataPath = `configuration${error.dataPath}`;

    if (error.keyword === "additionalProperties") {
      return `${dataPath} has an unknown property '${error.params.additionalProperty}'. These properties are valid:\n${this.getSchemaPartText(error.parentSchema)}`;
    } else if (error.keyword === "oneOf" || error.keyword === "anyOf") {
      const children = error.children;

      if (children && children.length > 0) {
        // use set to remove duplicated messages like "should be an object."
        return `${dataPath} should be one of these:\n${this.getSchemaPartText(error.parentSchema)}\n` + `Details:\n${Array.from(new Set(children.map(it => " * " + indent(this.formatValidationError(it), "   ", false)))).join("\n")}`;
      }

      return `${dataPath} should be one of these:\n${this.getSchemaPartText(error.parentSchema)}`;
    } else if (error.keyword === "enum") {
      if (error.parentSchema && error.parentSchema.enum && error.parentSchema.enum.length === 1) {
        return `${dataPath} should be ${this.getSchemaPartText(error.parentSchema)}`;
      }

      return `${dataPath} should be one of these:\n${this.getSchemaPartText(error.parentSchema)}`;
    } else if (error.keyword === "allOf") {
      return `${dataPath} should be:\n${this.getSchemaPartText(error.parentSchema)}`;
    } else if (error.keyword === "type") {
      switch (error.params.type) {
        case "object":
          return `${dataPath} should be an object.`;

        case "string":
          return `${dataPath} should be a string.`;

        case "boolean":
          return `${dataPath} should be a boolean.`;

        case "number":
          return `${dataPath} should be a number.`;

        case "array":
          return `${dataPath} should be an array:\n${this.getSchemaPartText(error.parentSchema)}`;
      }

      return `${dataPath} should be ${error.params.type}:\n${this.getSchemaPartText(error.parentSchema)}`;
    } else if (error.keyword === "instanceof") {
      return `${dataPath} should be an instance of ${this.getSchemaPartText(error.parentSchema)}.`;
    } else if (error.keyword === "required") {
      const missingProperty = error.params.missingProperty.replace(/^\./, "");
      return `${dataPath} misses the property '${missingProperty}'.\n${this.getSchemaPartText(error.parentSchema, ["properties", missingProperty])}`;
    } else if (error.keyword === "minLength" || error.keyword === "minItems") {
      if (error.params.limit === 1) {
        return `${dataPath} should not be empty.`;
      } else {
        return `${dataPath} ${error.message}`;
      }
    } else if (error.keyword === "absolutePath") {
      const baseMessage = `${dataPath}: ${error.message}`;

      if (dataPath === "configuration.output.filename") {
        return `${baseMessage}\n` + "Please use output.path to specify absolute path and output.filename for the file name.";
      }

      return baseMessage;
    } else {
      // eslint-disable-line no-fallthrough
      return `${dataPath} ${error.message} (${JSON.stringify(error, null, 2)}).\n${this.getSchemaPartText(error.parentSchema)}`;
    }
  }

  getSchemaPart(path) {
    const pathList = path.split("/").slice(0, path.length);
    let schemaPart = this.schemeData;

    for (let i = 1; i < pathList.length; i++) {
      const inner = schemaPart[pathList[i]];

      if (inner) {
        schemaPart = inner;
      }
    }

    return schemaPart;
  }

  getSchemaPartText(schemaPart, additionalPath = null) {
    if (additionalPath != null) {
      for (const p of additionalPath) {
        const inner = schemaPart[p];

        if (inner) {
          schemaPart = inner;
        }
      }
    }

    while (schemaPart.$ref != null) {
      schemaPart = this.getSchemaPart(schemaPart.$ref);
    }

    let schemaText = this.formatSchema(schemaPart);
    let description = schemaPart.description;

    if (description != null) {
      description = description.trim();
      const twoLineBreakPosition = description.indexOf("\n\n");
      description = twoLineBreakPosition < 0 ? description : description.substring(0, twoLineBreakPosition);
      schemaText += `\n${description}\n`;
    }

    return schemaText;
  }

  formatSchema(schema, prevSchemas) {
    prevSchemas = prevSchemas || [];

    const formatInnerSchema = (innerSchema, isAddSelf = false) => {
      if (!isAddSelf) {
        return this.formatSchema(innerSchema, prevSchemas);
      }

      if (prevSchemas.indexOf(innerSchema) >= 0) {
        return "(recursive)";
      }

      return this.formatSchema(innerSchema, prevSchemas.concat(schema));
    };

    if (schema.type === "string") {
      if (schema.minLength === 1) {
        return "non-empty string";
      } else if (schema.minLength > 1) {
        return `string (min length ${schema.minLength})`;
      } else {
        return "string";
      }
    } else if (schema.type === "boolean") {
      return "boolean";
    } else if (schema.type === "number") {
      return "number";
    } else if (schema.type === "object") {
      if (schema.properties) {
        const required = schema.required || [];
        return `object { ${Object.keys(schema.properties).map(property => {
          if (required.indexOf(property) < 0) {
            return property + "?";
          }

          return property;
        }).concat(schema.additionalProperties ? ["..."] : []).join(", ")} }`;
      }

      if (schema.additionalProperties) {
        return `object { <key>: ${formatInnerSchema(schema.additionalProperties)} }`;
      }

      return "object";
    } else if (schema.type === "array") {
      return `[${formatInnerSchema(schema.items)}]`;
    }

    switch (schema.instanceof) {
      case "Function":
        return "function";

      case "RegExp":
        return "RegExp";
    }

    if (schema.$ref != null) {
      return formatInnerSchema(this.getSchemaPart(schema.$ref), true);
    }

    if (schema.allOf) {
      return schema.allOf.map(formatInnerSchema).join(" & ");
    }

    if (schema.oneOf) {
      return schema.oneOf.map(formatInnerSchema).join(" | ");
    }

    if (schema.anyOf) {
      return schema.anyOf.map(formatInnerSchema).join(" | ");
    }

    if (schema.enum) {
      return schema.enum.map(it => JSON.stringify(it)).join(" | ");
    }

    return JSON.stringify(schema, null, 2);
  }

}

function indent(str, prefix, isFirstLine) {
  if (isFirstLine) {
    return prefix + str.replace(/\n(?!$)/g, "\n" + prefix);
  } else {
    return str.replace(/\n(?!$)/g, `\n${prefix}`);
  }
}

function filterErrors(errors) {
  let newErrors = [];

  for (const error of errors) {
    const dataPath = error.dataPath;
    let children = [];
    newErrors = newErrors.filter(oldError => {
      if (!oldError.dataPath.includes(dataPath)) {
        return true;
      }

      if (oldError.children != null) {
        children = children.concat(oldError.children.slice(0));
      }

      oldError.children = null;
      children.push(oldError);
      return false;
    });

    if (children.length > 0) {
      error.children = children;
    }

    newErrors.push(error);
  }

  return newErrors;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=ajvErrorNormalizer.js.map{"version":3,"sources":["../src/ajvErrorNormalizer.ts"],"names":[],"mappings":"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","sourcesContent":["import { AdditionalPropertiesParams, ComparisonParams, DependenciesParams, ErrorObject, TypeParams } from \"ajv\"\n\nexport function normaliseErrorMessages(errors: Array<ErrorObject>, schemeData: object) {\n  const printer = new SchemeErrorPrinter(schemeData)\n  return \"Configuration is invalid.\\n\" +\n    filterErrors(errors)\n      .map(it => \" - \" + indent(printer.formatValidationError(it), \"   \", false))\n      .join(\"\\n\")\n}\n\n//tslint:disable-next-line:no-empty-interface\ninterface Scheme {\n  // to ensure that proper arg is passed\n}\n\nclass SchemeErrorPrinter {\n  constructor(readonly schemeData: Scheme) {\n  }\n\n  formatValidationError(error: ErrorObject) {\n    const dataPath = `configuration${error.dataPath}`\n    if (error.keyword === \"additionalProperties\") {\n      return `${dataPath} has an unknown property '${(error.params as AdditionalPropertiesParams).additionalProperty}'. These properties are valid:\\n${this.getSchemaPartText(error.parentSchema)}`\n    }\n    else if (error.keyword === \"oneOf\" || error.keyword === \"anyOf\") {\n      const children = (error as any).children\n      if (children && children.length > 0) {\n        // use set to remove duplicated messages like \"should be an object.\"\n        return `${dataPath} should be one of these:\\n${this.getSchemaPartText(error.parentSchema)}\\n` +\n          `Details:\\n${Array.from(new Set(children.map((it: ErrorObject) => \" * \" + indent(this.formatValidationError(it), \"   \", false)))).join(\"\\n\")}`\n      }\n      return `${dataPath} should be one of these:\\n${this.getSchemaPartText(error.parentSchema)}`\n\n    }\n    else if (error.keyword === \"enum\") {\n      if (error.parentSchema && (error.parentSchema as any).enum && (error.parentSchema as any).enum.length === 1) {\n        return `${dataPath} should be ${this.getSchemaPartText(error.parentSchema)}`\n      }\n      return `${dataPath} should be one of these:\\n${this.getSchemaPartText(error.parentSchema)}`\n    }\n    else if (error.keyword === \"allOf\") {\n      return `${dataPath} should be:\\n${this.getSchemaPartText(error.parentSchema)}`\n    }\n    else if (error.keyword === \"type\") {\n      switch ((error.params as TypeParams).type) {\n        case \"object\":\n          return `${dataPath} should be an object.`\n        case \"string\":\n          return `${dataPath} should be a string.`\n        case \"boolean\":\n          return `${dataPath} should be a boolean.`\n        case \"number\":\n          return `${dataPath} should be a number.`\n        case \"array\":\n          return `${dataPath} should be an array:\\n${this.getSchemaPartText(error.parentSchema)}`\n      }\n      return `${dataPath} should be ${(error.params as TypeParams).type}:\\n${this.getSchemaPartText(error.parentSchema)}`\n    }\n    else if (error.keyword === \"instanceof\") {\n      return `${dataPath} should be an instance of ${this.getSchemaPartText(error.parentSchema)}.`\n    }\n    else if (error.keyword === \"required\") {\n      const missingProperty = (error.params as DependenciesParams).missingProperty.replace(/^\\./, \"\")\n      return `${dataPath} misses the property '${missingProperty}'.\\n${this.getSchemaPartText(error.parentSchema, [\"properties\", missingProperty])}`\n    }\n    else if (error.keyword === \"minLength\" || error.keyword === \"minItems\") {\n      if ((error.params as ComparisonParams).limit === 1) {\n        return `${dataPath} should not be empty.`\n      }\n      else {\n        return `${dataPath} ${error.message}`\n      }\n    }\n    else if (error.keyword === \"absolutePath\") {\n      const baseMessage = `${dataPath}: ${error.message}`\n      if (dataPath === \"configuration.output.filename\") {\n        return `${baseMessage}\\n` +\n          \"Please use output.path to specify absolute path and output.filename for the file name.\"\n      }\n      return baseMessage\n    }\n    else {\n      // eslint-disable-line no-fallthrough\n      return `${dataPath} ${error.message} (${JSON.stringify(error, null, 2)}).\\n${this.getSchemaPartText(error.parentSchema)}`\n    }\n  }\n\n  private getSchemaPart(path: string) {\n    const pathList = path.split(\"/\").slice(0, path.length)\n    let schemaPart = this.schemeData as any\n    for (let i = 1; i < pathList.length; i++) {\n      const inner = schemaPart[pathList[i]]\n      if (inner) {\n        schemaPart = inner\n      }\n    }\n    return schemaPart\n  }\n\n  private getSchemaPartText(schemaPart: any, additionalPath: Array<string> | null = null) {\n    if (additionalPath != null) {\n      for (const p of additionalPath) {\n        const inner = schemaPart[p]\n        if (inner) {\n          schemaPart = inner\n        }\n      }\n    }\n\n    while (schemaPart.$ref != null) {\n      schemaPart = this.getSchemaPart(schemaPart.$ref)\n    }\n\n    let schemaText = this.formatSchema(schemaPart)\n    let description = schemaPart.description\n    if (description != null) {\n      description = description.trim()\n      const twoLineBreakPosition = description.indexOf(\"\\n\\n\")\n      description = twoLineBreakPosition < 0 ? description : description.substring(0, twoLineBreakPosition)\n      schemaText += `\\n${description}\\n`\n    }\n    return schemaText\n  }\n\n  private formatSchema(schema: any, prevSchemas?: any) {\n    prevSchemas = prevSchemas || []\n\n    const formatInnerSchema = (innerSchema: any, isAddSelf = false): string => {\n      if (!isAddSelf) {\n        return this.formatSchema(innerSchema, prevSchemas)\n      }\n      if (prevSchemas.indexOf(innerSchema) >= 0) {\n        return \"(recursive)\"\n      }\n      return this.formatSchema(innerSchema, prevSchemas.concat(schema))\n    }\n\n    if (schema.type === \"string\") {\n      if (schema.minLength === 1) {\n        return \"non-empty string\"\n      }\n      else if (schema.minLength > 1) {\n        return `string (min length ${schema.minLength})`\n      }\n      else {\n        return \"string\"\n      }\n    }\n    else if (schema.type === \"boolean\") {\n      return \"boolean\"\n    }\n    else if (schema.type === \"number\") {\n      return \"number\"\n    }\n    else if (schema.type === \"object\") {\n      if (schema.properties) {\n        const required = schema.required || []\n        return `object { ${Object.keys(schema.properties).map(property => {\n          if (required.indexOf(property) < 0) {\n            return property + \"?\"\n          }\n          return property\n        }).concat(schema.additionalProperties ? [\"...\"] : []).join(\", \")} }`\n      }\n      if (schema.additionalProperties) {\n        return `object { <key>: ${formatInnerSchema(schema.additionalProperties)} }`\n      }\n      return \"object\"\n    }\n    else if (schema.type === \"array\") {\n      return `[${formatInnerSchema(schema.items)}]`\n    }\n\n    switch (schema.instanceof) {\n      case \"Function\":\n        return \"function\"\n      case \"RegExp\":\n        return \"RegExp\"\n    }\n\n    if (schema.$ref != null) {\n      return formatInnerSchema(this.getSchemaPart(schema.$ref), true)\n    }\n    if (schema.allOf) {\n      return schema.allOf.map(formatInnerSchema).join(\" & \")\n    }\n    if (schema.oneOf) {\n      return schema.oneOf.map(formatInnerSchema).join(\" | \")\n    }\n    if (schema.anyOf) {\n      return schema.anyOf.map(formatInnerSchema).join(\" | \")\n    }\n    if (schema.enum) {\n      return schema.enum.map((it: object) => JSON.stringify(it)).join(\" | \")\n    }\n    return JSON.stringify(schema, null, 2)\n  }\n}\n\nfunction indent(str: string, prefix: string, isFirstLine: boolean) {\n  if (isFirstLine) {\n    return prefix + str.replace(/\\n(?!$)/g, \"\\n\" + prefix)\n  }\n  else {\n    return str.replace(/\\n(?!$)/g, `\\n${prefix}`)\n  }\n}\n\nfunction filterErrors(errors: Array<ErrorObject>) {\n  let newErrors: Array<any> = []\n  for (const error of errors) {\n    const dataPath = error.dataPath\n    let children: Array<ErrorObject> = []\n    newErrors = newErrors.filter(oldError => {\n      if (!oldError.dataPath.includes(dataPath)) {\n        return true\n      }\n\n      if (oldError.children != null) {\n        children = children.concat(oldError.children.slice(0))\n      }\n      oldError.children = null\n      children.push(oldError)\n      return false\n    })\n\n    if (children.length > 0) {\n      (error as any).children = children\n    }\n    newErrors.push(error)\n  }\n  return newErrors\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.deepAssign = deepAssign;

function isObject(x) {
  if (Array.isArray(x)) {
    return false;
  }

  const type = typeof x;
  return type === "object" || type === "function";
}

function assignKey(target, from, key) {
  const value = from[key]; // https://github.com/electron-userland/electron-builder/pull/562

  if (value === undefined) {
    return;
  }

  const prevValue = target[key];

  if (prevValue == null || value == null || !isObject(prevValue) || !isObject(value)) {
    target[key] = value;
  } else {
    target[key] = assign(prevValue, value);
  }
}

function assign(to, from) {
  if (to !== from) {
    for (const key of Object.getOwnPropertyNames(from)) {
      assignKey(to, from, key);
    }
  }

  return to;
}

function deepAssign(target, ...objects) {
  for (const o of objects) {
    if (o != null) {
      assign(target, o);
    }
  }

  return target;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=deepAssign.js.map{"version":3,"sources":["../src/deepAssign.ts"],"names":[],"mappings":";;;;;;;AAAA,SAAS,QAAT,CAAkB,CAAlB,EAAwB;AACtB,MAAI,KAAK,CAAC,OAAN,CAAc,CAAd,CAAJ,EAAsB;AACpB,WAAO,KAAP;AACD;;AAED,QAAM,IAAI,GAAG,OAAO,CAApB;AACA,SAAO,IAAI,KAAK,QAAT,IAAqB,IAAI,KAAK,UAArC;AACD;;AAED,SAAS,SAAT,CAAmB,MAAnB,EAAgC,IAAhC,EAA2C,GAA3C,EAAsD;AACpD,QAAM,KAAK,GAAG,IAAI,CAAC,GAAD,CAAlB,CADoD,CAEpD;;AACA,MAAI,KAAK,KAAK,SAAd,EAAyB;AACvB;AACD;;AAED,QAAM,SAAS,GAAG,MAAM,CAAC,GAAD,CAAxB;;AACA,MAAI,SAAS,IAAI,IAAb,IAAqB,KAAK,IAAI,IAA9B,IAAsC,CAAC,QAAQ,CAAC,SAAD,CAA/C,IAA8D,CAAC,QAAQ,CAAC,KAAD,CAA3E,EAAoF;AAClF,IAAA,MAAM,CAAC,GAAD,CAAN,GAAc,KAAd;AACD,GAFD,MAGK;AACH,IAAA,MAAM,CAAC,GAAD,CAAN,GAAc,MAAM,CAAC,SAAD,EAAY,KAAZ,CAApB;AACD;AACF;;AAED,SAAS,MAAT,CAAgB,EAAhB,EAAyB,IAAzB,EAAkC;AAChC,MAAI,EAAE,KAAK,IAAX,EAAiB;AACf,SAAK,MAAM,GAAX,IAAkB,MAAM,CAAC,mBAAP,CAA2B,IAA3B,CAAlB,EAAoD;AAClD,MAAA,SAAS,CAAC,EAAD,EAAK,IAAL,EAAW,GAAX,CAAT;AACD;AACF;;AACD,SAAO,EAAP;AACD;;AAEK,SAAU,UAAV,CAAwB,MAAxB,EAAmC,GAAG,OAAtC,EAAyD;AAC7D,OAAK,MAAM,CAAX,IAAgB,OAAhB,EAAyB;AACvB,QAAI,CAAC,IAAI,IAAT,EAAe;AACb,MAAA,MAAM,CAAC,MAAD,EAAS,CAAT,CAAN;AACD;AACF;;AACD,SAAO,MAAP;AACD,C","sourcesContent":["function isObject(x: any) {\n  if (Array.isArray(x)) {\n    return false\n  }\n\n  const type = typeof x\n  return type === \"object\" || type === \"function\"\n}\n\nfunction assignKey(target: any, from: any, key: string) {\n  const value = from[key]\n  // https://github.com/electron-userland/electron-builder/pull/562\n  if (value === undefined) {\n    return\n  }\n\n  const prevValue = target[key]\n  if (prevValue == null || value == null || !isObject(prevValue) || !isObject(value)) {\n    target[key] = value\n  }\n  else {\n    target[key] = assign(prevValue, value)\n  }\n}\n\nfunction assign(to: any, from: any) {\n  if (to !== from) {\n    for (const key of Object.getOwnPropertyNames(from)) {\n      assignKey(to, from, key)\n    }\n  }\n  return to\n}\n\nexport function deepAssign<T>(target: T, ...objects: Array<any>): T {\n  for (const o of objects) {\n    if (o != null) {\n      assign(target, o)\n    }\n  }\n  return target\n}"],"sourceRoot":""}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.findAndReadConfig = findAndReadConfig;
exports.orNullIfFileNotExist = orNullIfFileNotExist;
exports.orIfFileNotExist = orIfFileNotExist;
exports.loadConfig = loadConfig;
exports.getConfig = getConfig;
exports.loadParentConfig = loadParentConfig;
exports.validateConfig = validateConfig;
exports.loadEnv = loadEnv;

function _fsExtraP() {
  const data = require("fs-extra-p");

  _fsExtraP = function () {
    return data;
  };

  return data;
}

function _jsYaml() {
  const data = require("js-yaml");

  _jsYaml = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _ajv() {
  const data = _interopRequireDefault(require("ajv"));

  _ajv = function () {
    return data;
  };

  return data;
}

function _ajvErrorNormalizer() {
  const data = require("./ajvErrorNormalizer");

  _ajvErrorNormalizer = function () {
    return data;
  };

  return data;
}

function _dotenv() {
  const data = require("dotenv");

  _dotenv = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

async function readConfig(configFile, request) {
  const data = await (0, _fsExtraP().readFile)(configFile, "utf8");
  let result;

  if (configFile.endsWith(".json5") || configFile.endsWith(".json")) {
    result = require("json5").parse(data);
  } else if (configFile.endsWith(".js")) {
    result = require(configFile);

    if (result.default != null) {
      result = result.default;
    }

    if (typeof result === "function") {
      result = result(request);
    }

    result = await Promise.resolve(result);
  } else if (configFile.endsWith(".toml")) {
    result = require("toml").parse(data);
  } else {
    result = (0, _jsYaml().safeLoad)(data);
  }

  return {
    result,
    configFile
  };
}

async function findAndReadConfig(request) {
  const prefix = request.configFilename;

  for (const configFile of [`${prefix}.yml`, `${prefix}.yaml`, `${prefix}.json`, `${prefix}.json5`, `${prefix}.toml`, `${prefix}.js`]) {
    const data = await orNullIfFileNotExist(readConfig(path.join(request.projectDir, configFile), request));

    if (data != null) {
      return data;
    }
  }

  return null;
}

function orNullIfFileNotExist(promise) {
  return orIfFileNotExist(promise, null);
}

function orIfFileNotExist(promise, fallbackValue) {
  return promise.catch(e => {
    if (e.code === "ENOENT" || e.code === "ENOTDIR") {
      return fallbackValue;
    }

    throw e;
  });
}

async function loadConfig(request) {
  let packageMetadata = request.packageMetadata == null ? null : await request.packageMetadata.value;

  if (packageMetadata == null) {
    packageMetadata = await orNullIfFileNotExist((0, _fsExtraP().readJson)(path.join(request.projectDir, "package.json")));
  }

  const data = packageMetadata == null ? null : packageMetadata[request.packageKey];
  return data == null ? findAndReadConfig(request) : {
    result: data,
    configFile: null
  };
}

function getConfig(request, configPath) {
  if (configPath == null) {
    return loadConfig(request);
  } else {
    return readConfig(path.resolve(request.projectDir, configPath), request);
  }
}

async function loadParentConfig(request, spec) {
  let isFileSpec;

  if (spec.startsWith("file:")) {
    spec = spec.substring("file:".length);
    isFileSpec = true;
  }

  let parentConfig = await orNullIfFileNotExist(readConfig(path.resolve(request.projectDir, spec), request));

  if (parentConfig == null && isFileSpec !== true) {
    let resolved = null;

    try {
      resolved = require.resolve(spec);
    } catch (e) {// ignore
    }

    if (resolved != null) {
      parentConfig = await readConfig(resolved, request);
    }
  }

  if (parentConfig == null) {
    throw new Error(`Cannot find parent config file: ${spec}`);
  }

  return parentConfig;
}

async function validateConfig(config, scheme, errorMessage) {
  const ajv = new (_ajv().default)({
    allErrors: true,
    coerceTypes: true,
    verbose: true,
    errorDataPath: "configuration"
  });

  require("ajv-keywords")(ajv, ["typeof"]);

  const schema = await scheme.value;
  const validator = ajv.compile(schema);

  if (!validator(config)) {
    const error = new Error(errorMessage((0, _ajvErrorNormalizer().normaliseErrorMessages)(validator.errors, schema), validator.errors));
    error.code = "ERR_CONFIG_INVALID";
    throw error;
  }
}

async function loadEnv(envFile) {
  const data = await orNullIfFileNotExist((0, _fsExtraP().readFile)(envFile, "utf8"));

  if (data == null) {
    return null;
  }

  const parsed = (0, _dotenv().parse)(data);

  for (const key of Object.keys(parsed)) {
    if (!process.env.hasOwnProperty(key)) {
      process.env[key] = parsed[key];
    }
  }

  require("dotenv-expand")(parsed);

  return parsed;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=main.js.map{"version":3,"sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["import {readFile, readJson} from \"fs-extra-p\"\nimport {safeLoad} from \"js-yaml\"\nimport * as path from \"path\"\nimport {Lazy} from \"lazy-val\"\nimport Ajv, {ErrorObject} from \"ajv\"\nimport {normaliseErrorMessages} from \"./ajvErrorNormalizer\"\nimport {parse as parseEnv} from \"dotenv\"\n\nexport interface ReadConfigResult<T> {\n  readonly result: T\n  readonly configFile: string | null\n}\n\nasync function readConfig<T>(configFile: string, request: ReadConfigRequest): Promise<ReadConfigResult<T>> {\n  const data = await readFile(configFile, \"utf8\")\n  let result\n  if (configFile.endsWith(\".json5\") || configFile.endsWith(\".json\")) {\n    result = require(\"json5\").parse(data)\n  }\n  else if (configFile.endsWith(\".js\")) {\n    result = require(configFile)\n    if (result.default != null) {\n      result = result.default\n    }\n    if (typeof result === \"function\") {\n      result = result(request)\n    }\n    result = await Promise.resolve(result)\n  }\n  else if (configFile.endsWith(\".toml\")) {\n    result = require(\"toml\").parse(data)\n  }\n  else {\n    result = safeLoad(data)\n  }\n  return {result, configFile}\n}\n\nexport async function findAndReadConfig<T>(request: ReadConfigRequest): Promise<ReadConfigResult<T> | null> {\n  const prefix = request.configFilename\n  for (const configFile of [`${prefix}.yml`, `${prefix}.yaml`, `${prefix}.json`, `${prefix}.json5`, `${prefix}.toml`, `${prefix}.js`]) {\n    const data = await orNullIfFileNotExist(readConfig<T>(path.join(request.projectDir, configFile), request))\n    if (data != null) {\n      return data\n    }\n  }\n\n  return null\n}\n\nexport function orNullIfFileNotExist<T>(promise: Promise<T>): Promise<T | null> {\n  return orIfFileNotExist(promise, null)\n}\n\nexport function orIfFileNotExist<T>(promise: Promise<T>, fallbackValue: T): Promise<T> {\n  return promise\n    .catch(e => {\n      if (e.code === \"ENOENT\" || e.code === \"ENOTDIR\") {\n        return fallbackValue\n      }\n      throw e\n    })\n}\n\nexport interface ReadConfigRequest {\n  packageKey: string\n  configFilename: string\n\n  projectDir: string\n  packageMetadata: Lazy<{ [key: string]: any } | null> | null\n}\n\nexport async function loadConfig<T>(request: ReadConfigRequest): Promise<ReadConfigResult<T> | null> {\n  let packageMetadata = request.packageMetadata == null ? null : await request.packageMetadata.value\n  if (packageMetadata == null) {\n    packageMetadata = await orNullIfFileNotExist(readJson(path.join(request.projectDir, \"package.json\")))\n  }\n\n  const data: T = packageMetadata == null ? null : packageMetadata[request.packageKey]\n  return data == null ? findAndReadConfig<T>(request) : {result: data, configFile: null}\n}\n\nexport function getConfig<T>(request: ReadConfigRequest, configPath?: string | null): Promise<ReadConfigResult<T> | null> {\n  if (configPath == null) {\n    return loadConfig<T>(request)\n  }\n  else {\n    return readConfig<T>(path.resolve(request.projectDir, configPath), request)\n  }\n}\n\nexport async function loadParentConfig<T>(request: ReadConfigRequest, spec: string): Promise<ReadConfigResult<T>> {\n  let isFileSpec: boolean | undefined\n  if (spec.startsWith(\"file:\")) {\n    spec = spec.substring(\"file:\".length)\n    isFileSpec = true\n  }\n\n  let parentConfig = await orNullIfFileNotExist(readConfig<T>(path.resolve(request.projectDir, spec), request))\n  if (parentConfig == null && isFileSpec !== true) {\n    let resolved: string | null = null\n    try {\n      resolved = require.resolve(spec)\n    }\n    catch (e) {\n      // ignore\n    }\n\n    if (resolved != null) {\n      parentConfig = await readConfig<T>(resolved, request)\n    }\n  }\n\n  if (parentConfig == null) {\n    throw new Error(`Cannot find parent config file: ${spec}`)\n  }\n\n  return parentConfig\n}\n\nexport async function validateConfig(config: any, scheme: Lazy<any>, errorMessage: (error: string, errors: Array<ErrorObject>) => string) {\n  const ajv = new Ajv({\n    allErrors: true,\n    coerceTypes: true,\n    verbose: true,\n    errorDataPath: \"configuration\",\n  })\n  require(\"ajv-keywords\")(ajv, [\"typeof\"])\n  const schema = await scheme.value\n  const validator = ajv.compile(schema)\n\n  if (!validator(config)) {\n    const error = new Error(errorMessage(normaliseErrorMessages(validator.errors!, schema), validator.errors!!));\n    (error as any).code = \"ERR_CONFIG_INVALID\"\n    throw error\n  }\n}\n\nexport async function loadEnv(envFile: string) {\n  const data = await orNullIfFileNotExist(readFile(envFile, \"utf8\"))\n  if (data == null) {\n    return null\n  }\n\n  const parsed = parseEnv(data)\n  for (const key of Object.keys(parsed)) {\n    if (!process.env.hasOwnProperty(key)) {\n      process.env[key] = parsed[key]\n    }\n  }\n  require(\"dotenv-expand\")(parsed)\n  return parsed\n}"],"sourceRoot":""}
'use strict';
var path = require('path');
var loadJsonFile = require('load-json-file');
var normalizePackageData = require('normalize-package-data');
var pathType = require('path-type');

module.exports = function (fp, opts) {
	if (typeof fp !== 'string') {
		opts = fp;
		fp = '.';
	}

	opts = opts || {};

	return pathType.dir(fp)
		.then(function (isDir) {
			if (isDir) {
				fp = path.join(fp, 'package.json');
			}

			return loadJsonFile(fp);
		})
		.then(function (x) {
			if (opts.normalize !== false) {
				normalizePackageData(x);
			}

			return x;
		});
};

module.exports.sync = function (fp, opts) {
	if (typeof fp !== 'string') {
		opts = fp;
		fp = '.';
	}

	opts = opts || {};
	fp = pathType.dirSync(fp) ? path.join(fp, 'package.json') : fp;

	var x = loadJsonFile.sync(fp);

	if (opts.normalize !== false) {
		normalizePackageData(x);
	}

	return x;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "load-json-file": "^1.0.0",
    "normalize-package-data": "^2.3.2",
    "path-type": "^1.0.0"
  },
  "deprecated": false,
  "description": "Read a package.json file",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/read-pkg#readme",
  "license": "MIT",
  "name": "read-pkg",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/read-pkg.git"
  },
  "version": "1.1.0"
}'use strict';
var findUp = require('find-up');
var readPkg = require('read-pkg');

module.exports = function (opts) {
	return findUp('package.json', opts).then(function (fp) {
		if (!fp) {
			return {};
		}

		return readPkg(fp, opts).then(function (pkg) {
			return {
				pkg: pkg,
				path: fp
			};
		});
	});
};

module.exports.sync = function (opts) {
	var fp = findUp.sync('package.json', opts);

	if (!fp) {
		return {};
	}

	return {
		pkg: readPkg.sync(fp, opts),
		path: fp
	};
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "find-up": "^1.0.0",
    "read-pkg": "^1.0.0"
  },
  "deprecated": false,
  "description": "Read the closest package.json file",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/read-pkg-up#readme",
  "license": "MIT",
  "name": "read-pkg-up",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/read-pkg-up.git"
  },
  "version": "1.0.1"
}Copyright Joyent, Inc. and other Node contributors. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
module.exports = require("./lib/_stream_duplex.js")
diff --git a/lib/_stream_duplex.js b/lib/_stream_duplex.js
index c5a741c..a2e0d8e 100644
--- a/lib/_stream_duplex.js
+++ b/lib/_stream_duplex.js
@@ -26,8 +26,8 @@
 
 module.exports = Duplex;
 var util = require('util');
-var Readable = require('_stream_readable');
-var Writable = require('_stream_writable');
+var Readable = require('./_stream_readable');
+var Writable = require('./_stream_writable');
 
 util.inherits(Duplex, Readable);
 
diff --git a/lib/_stream_passthrough.js b/lib/_stream_passthrough.js
index a5e9864..330c247 100644
--- a/lib/_stream_passthrough.js
+++ b/lib/_stream_passthrough.js
@@ -25,7 +25,7 @@
 
 module.exports = PassThrough;
 
-var Transform = require('_stream_transform');
+var Transform = require('./_stream_transform');
 var util = require('util');
 util.inherits(PassThrough, Transform);
 
diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js
index 0c3fe3e..90a8298 100644
--- a/lib/_stream_readable.js
+++ b/lib/_stream_readable.js
@@ -23,10 +23,34 @@ module.exports = Readable;
 Readable.ReadableState = ReadableState;
 
 var EE = require('events').EventEmitter;
+if (!EE.listenerCount) EE.listenerCount = function(emitter, type) {
+  return emitter.listeners(type).length;
+};
+
+if (!global.setImmediate) global.setImmediate = function setImmediate(fn) {
+  return setTimeout(fn, 0);
+};
+if (!global.clearImmediate) global.clearImmediate = function clearImmediate(i) {
+  return clearTimeout(i);
+};
+
 var Stream = require('stream');
 var util = require('util');
+if (!util.isUndefined) {
+  var utilIs = require('core-util-is');
+  for (var f in utilIs) {
+    util[f] = utilIs[f];
+  }
+}
 var StringDecoder;
-var debug = util.debuglog('stream');
+var debug;
+if (util.debuglog)
+  debug = util.debuglog('stream');
+else try {
+  debug = require('debuglog')('stream');
+} catch (er) {
+  debug = function() {};
+}
 
 util.inherits(Readable, Stream);
 
@@ -380,7 +404,7 @@ function chunkInvalid(state, chunk) {
 
 
 function onEofChunk(stream, state) {
-  if (state.decoder && !state.ended) {
+  if (state.decoder && !state.ended && state.decoder.end) {
     var chunk = state.decoder.end();
     if (chunk && chunk.length) {
       state.buffer.push(chunk);
diff --git a/lib/_stream_transform.js b/lib/_stream_transform.js
index b1f9fcc..b0caf57 100644
--- a/lib/_stream_transform.js
+++ b/lib/_stream_transform.js
@@ -64,8 +64,14 @@
 
 module.exports = Transform;
 
-var Duplex = require('_stream_duplex');
+var Duplex = require('./_stream_duplex');
 var util = require('util');
+if (!util.isUndefined) {
+  var utilIs = require('core-util-is');
+  for (var f in utilIs) {
+    util[f] = utilIs[f];
+  }
+}
 util.inherits(Transform, Duplex);
 
 
diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js
index ba2e920..f49288b 100644
--- a/lib/_stream_writable.js
+++ b/lib/_stream_writable.js
@@ -27,6 +27,12 @@ module.exports = Writable;
 Writable.WritableState = WritableState;
 
 var util = require('util');
+if (!util.isUndefined) {
+  var utilIs = require('core-util-is');
+  for (var f in utilIs) {
+    util[f] = utilIs[f];
+  }
+}
 var Stream = require('stream');
 
 util.inherits(Writable, Stream);
@@ -119,7 +125,7 @@ function WritableState(options, stream) {
 function Writable(options) {
   // Writable ctor is applied to Duplexes, though they're not
   // instanceof Writable, they're instanceof Readable.
-  if (!(this instanceof Writable) && !(this instanceof Stream.Duplex))
+  if (!(this instanceof Writable) && !(this instanceof require('./_stream_duplex')))
     return new Writable(options);
 
   this._writableState = new WritableState(options, this);
diff --git a/test/simple/test-stream-big-push.js b/test/simple/test-stream-big-push.js
index e3787e4..8cd2127 100644
--- a/test/simple/test-stream-big-push.js
+++ b/test/simple/test-stream-big-push.js
@@ -21,7 +21,7 @@
 
 var common = require('../common');
 var assert = require('assert');
-var stream = require('stream');
+var stream = require('../../');
 var str = 'asdfasdfasdfasdfasdf';
 
 var r = new stream.Readable({
diff --git a/test/simple/test-stream-end-paused.js b/test/simple/test-stream-end-paused.js
index bb73777..d40efc7 100644
--- a/test/simple/test-stream-end-paused.js
+++ b/test/simple/test-stream-end-paused.js
@@ -25,7 +25,7 @@ var gotEnd = false;
 
 // Make sure we don't miss the end event for paused 0-length streams
 
-var Readable = require('stream').Readable;
+var Readable = require('../../').Readable;
 var stream = new Readable();
 var calledRead = false;
 stream._read = function() {
diff --git a/test/simple/test-stream-pipe-after-end.js b/test/simple/test-stream-pipe-after-end.js
index b46ee90..0be8366 100644
--- a/test/simple/test-stream-pipe-after-end.js
+++ b/test/simple/test-stream-pipe-after-end.js
@@ -22,8 +22,8 @@
 var common = require('../common');
 var assert = require('assert');
 
-var Readable = require('_stream_readable');
-var Writable = require('_stream_writable');
+var Readable = require('../../lib/_stream_readable');
+var Writable = require('../../lib/_stream_writable');
 var util = require('util');
 
 util.inherits(TestReadable, Readable);
diff --git a/test/simple/test-stream-pipe-cleanup.js b/test/simple/test-stream-pipe-cleanup.js
deleted file mode 100644
index f689358..0000000
--- a/test/simple/test-stream-pipe-cleanup.js
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// This test asserts that Stream.prototype.pipe does not leave listeners
-// hanging on the source or dest.
-
-var common = require('../common');
-var stream = require('stream');
-var assert = require('assert');
-var util = require('util');
-
-function Writable() {
-  this.writable = true;
-  this.endCalls = 0;
-  stream.Stream.call(this);
-}
-util.inherits(Writable, stream.Stream);
-Writable.prototype.end = function() {
-  this.endCalls++;
-};
-
-Writable.prototype.destroy = function() {
-  this.endCalls++;
-};
-
-function Readable() {
-  this.readable = true;
-  stream.Stream.call(this);
-}
-util.inherits(Readable, stream.Stream);
-
-function Duplex() {
-  this.readable = true;
-  Writable.call(this);
-}
-util.inherits(Duplex, Writable);
-
-var i = 0;
-var limit = 100;
-
-var w = new Writable();
-
-var r;
-
-for (i = 0; i < limit; i++) {
-  r = new Readable();
-  r.pipe(w);
-  r.emit('end');
-}
-assert.equal(0, r.listeners('end').length);
-assert.equal(limit, w.endCalls);
-
-w.endCalls = 0;
-
-for (i = 0; i < limit; i++) {
-  r = new Readable();
-  r.pipe(w);
-  r.emit('close');
-}
-assert.equal(0, r.listeners('close').length);
-assert.equal(limit, w.endCalls);
-
-w.endCalls = 0;
-
-r = new Readable();
-
-for (i = 0; i < limit; i++) {
-  w = new Writable();
-  r.pipe(w);
-  w.emit('close');
-}
-assert.equal(0, w.listeners('close').length);
-
-r = new Readable();
-w = new Writable();
-var d = new Duplex();
-r.pipe(d); // pipeline A
-d.pipe(w); // pipeline B
-assert.equal(r.listeners('end').length, 2);   // A.onend, A.cleanup
-assert.equal(r.listeners('close').length, 2); // A.onclose, A.cleanup
-assert.equal(d.listeners('end').length, 2);   // B.onend, B.cleanup
-assert.equal(d.listeners('close').length, 3); // A.cleanup, B.onclose, B.cleanup
-assert.equal(w.listeners('end').length, 0);
-assert.equal(w.listeners('close').length, 1); // B.cleanup
-
-r.emit('end');
-assert.equal(d.endCalls, 1);
-assert.equal(w.endCalls, 0);
-assert.equal(r.listeners('end').length, 0);
-assert.equal(r.listeners('close').length, 0);
-assert.equal(d.listeners('end').length, 2);   // B.onend, B.cleanup
-assert.equal(d.listeners('close').length, 2); // B.onclose, B.cleanup
-assert.equal(w.listeners('end').length, 0);
-assert.equal(w.listeners('close').length, 1); // B.cleanup
-
-d.emit('end');
-assert.equal(d.endCalls, 1);
-assert.equal(w.endCalls, 1);
-assert.equal(r.listeners('end').length, 0);
-assert.equal(r.listeners('close').length, 0);
-assert.equal(d.listeners('end').length, 0);
-assert.equal(d.listeners('close').length, 0);
-assert.equal(w.listeners('end').length, 0);
-assert.equal(w.listeners('close').length, 0);
diff --git a/test/simple/test-stream-pipe-error-handling.js b/test/simple/test-stream-pipe-error-handling.js
index c5d724b..c7d6b7d 100644
--- a/test/simple/test-stream-pipe-error-handling.js
+++ b/test/simple/test-stream-pipe-error-handling.js
@@ -21,7 +21,7 @@
 
 var common = require('../common');
 var assert = require('assert');
-var Stream = require('stream').Stream;
+var Stream = require('../../').Stream;
 
 (function testErrorListenerCatches() {
   var source = new Stream();
diff --git a/test/simple/test-stream-pipe-event.js b/test/simple/test-stream-pipe-event.js
index cb9d5fe..56f8d61 100644
--- a/test/simple/test-stream-pipe-event.js
+++ b/test/simple/test-stream-pipe-event.js
@@ -20,7 +20,7 @@
 // USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 var common = require('../common');
-var stream = require('stream');
+var stream = require('../../');
 var assert = require('assert');
 var util = require('util');
 
diff --git a/test/simple/test-stream-push-order.js b/test/simple/test-stream-push-order.js
index f2e6ec2..a5c9bf9 100644
--- a/test/simple/test-stream-push-order.js
+++ b/test/simple/test-stream-push-order.js
@@ -20,7 +20,7 @@
 // USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 var common = require('../common.js');
-var Readable = require('stream').Readable;
+var Readable = require('../../').Readable;
 var assert = require('assert');
 
 var s = new Readable({
diff --git a/test/simple/test-stream-push-strings.js b/test/simple/test-stream-push-strings.js
index 06f43dc..1701a9a 100644
--- a/test/simple/test-stream-push-strings.js
+++ b/test/simple/test-stream-push-strings.js
@@ -22,7 +22,7 @@
 var common = require('../common');
 var assert = require('assert');
 
-var Readable = require('stream').Readable;
+var Readable = require('../../').Readable;
 var util = require('util');
 
 util.inherits(MyStream, Readable);
diff --git a/test/simple/test-stream-readable-event.js b/test/simple/test-stream-readable-event.js
index ba6a577..a8e6f7b 100644
--- a/test/simple/test-stream-readable-event.js
+++ b/test/simple/test-stream-readable-event.js
@@ -22,7 +22,7 @@
 var common = require('../common');
 var assert = require('assert');
 
-var Readable = require('stream').Readable;
+var Readable = require('../../').Readable;
 
 (function first() {
   // First test, not reading when the readable is added.
diff --git a/test/simple/test-stream-readable-flow-recursion.js b/test/simple/test-stream-readable-flow-recursion.js
index 2891ad6..11689ba 100644
--- a/test/simple/test-stream-readable-flow-recursion.js
+++ b/test/simple/test-stream-readable-flow-recursion.js
@@ -27,7 +27,7 @@ var assert = require('assert');
 // more data continuously, but without triggering a nextTick
 // warning or RangeError.
 
-var Readable = require('stream').Readable;
+var Readable = require('../../').Readable;
 
 // throw an error if we trigger a nextTick warning.
 process.throwDeprecation = true;
diff --git a/test/simple/test-stream-unshift-empty-chunk.js b/test/simple/test-stream-unshift-empty-chunk.js
index 0c96476..7827538 100644
--- a/test/simple/test-stream-unshift-empty-chunk.js
+++ b/test/simple/test-stream-unshift-empty-chunk.js
@@ -24,7 +24,7 @@ var assert = require('assert');
 
 // This test verifies that stream.unshift(Buffer(0)) or 
 // stream.unshift('') does not set state.reading=false.
-var Readable = require('stream').Readable;
+var Readable = require('../../').Readable;
 
 var r = new Readable();
 var nChunks = 10;
diff --git a/test/simple/test-stream-unshift-read-race.js b/test/simple/test-stream-unshift-read-race.js
index 83fd9fa..17c18aa 100644
--- a/test/simple/test-stream-unshift-read-race.js
+++ b/test/simple/test-stream-unshift-read-race.js
@@ -29,7 +29,7 @@ var assert = require('assert');
 // 3. push() after the EOF signaling null is an error.
 // 4. _read() is not called after pushing the EOF null chunk.
 
-var stream = require('stream');
+var stream = require('../../');
 var hwm = 10;
 var r = stream.Readable({ highWaterMark: hwm });
 var chunks = 10;
@@ -51,7 +51,14 @@ r._read = function(n) {
 
   function push(fast) {
     assert(!pushedNull, 'push() after null push');
-    var c = pos >= data.length ? null : data.slice(pos, pos + n);
+    var c;
+    if (pos >= data.length)
+      c = null;
+    else {
+      if (n + pos > data.length)
+        n = data.length - pos;
+      c = data.slice(pos, pos + n);
+    }
     pushedNull = c === null;
     if (fast) {
       pos += n;
diff --git a/test/simple/test-stream-writev.js b/test/simple/test-stream-writev.js
index 5b49e6e..b5321f3 100644
--- a/test/simple/test-stream-writev.js
+++ b/test/simple/test-stream-writev.js
@@ -22,7 +22,7 @@
 var common = require('../common');
 var assert = require('assert');
 
-var stream = require('stream');
+var stream = require('../../');
 
 var queue = [];
 for (var decode = 0; decode < 2; decode++) {
diff --git a/test/simple/test-stream2-basic.js b/test/simple/test-stream2-basic.js
index 3814bf0..248c1be 100644
--- a/test/simple/test-stream2-basic.js
+++ b/test/simple/test-stream2-basic.js
@@ -21,7 +21,7 @@
 
 
 var common = require('../common.js');
-var R = require('_stream_readable');
+var R = require('../../lib/_stream_readable');
 var assert = require('assert');
 
 var util = require('util');
diff --git a/test/simple/test-stream2-compatibility.js b/test/simple/test-stream2-compatibility.js
index 6cdd4e9..f0fa84b 100644
--- a/test/simple/test-stream2-compatibility.js
+++ b/test/simple/test-stream2-compatibility.js
@@ -21,7 +21,7 @@
 
 
 var common = require('../common.js');
-var R = require('_stream_readable');
+var R = require('../../lib/_stream_readable');
 var assert = require('assert');
 
 var util = require('util');
diff --git a/test/simple/test-stream2-finish-pipe.js b/test/simple/test-stream2-finish-pipe.js
index 39b274f..006a19b 100644
--- a/test/simple/test-stream2-finish-pipe.js
+++ b/test/simple/test-stream2-finish-pipe.js
@@ -20,7 +20,7 @@
 // USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 var common = require('../common.js');
-var stream = require('stream');
+var stream = require('../../');
 var Buffer = require('buffer').Buffer;
 
 var r = new stream.Readable();
diff --git a/test/simple/test-stream2-fs.js b/test/simple/test-stream2-fs.js
deleted file mode 100644
index e162406..0000000
--- a/test/simple/test-stream2-fs.js
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-var common = require('../common.js');
-var R = require('_stream_readable');
-var assert = require('assert');
-
-var fs = require('fs');
-var FSReadable = fs.ReadStream;
-
-var path = require('path');
-var file = path.resolve(common.fixturesDir, 'x1024.txt');
-
-var size = fs.statSync(file).size;
-
-var expectLengths = [1024];
-
-var util = require('util');
-var Stream = require('stream');
-
-util.inherits(TestWriter, Stream);
-
-function TestWriter() {
-  Stream.apply(this);
-  this.buffer = [];
-  this.length = 0;
-}
-
-TestWriter.prototype.write = function(c) {
-  this.buffer.push(c.toString());
-  this.length += c.length;
-  return true;
-};
-
-TestWriter.prototype.end = function(c) {
-  if (c) this.buffer.push(c.toString());
-  this.emit('results', this.buffer);
-}
-
-var r = new FSReadable(file);
-var w = new TestWriter();
-
-w.on('results', function(res) {
-  console.error(res, w.length);
-  assert.equal(w.length, size);
-  var l = 0;
-  assert.deepEqual(res.map(function (c) {
-    return c.length;
-  }), expectLengths);
-  console.log('ok');
-});
-
-r.pipe(w);
diff --git a/test/simple/test-stream2-httpclient-response-end.js b/test/simple/test-stream2-httpclient-response-end.js
deleted file mode 100644
index 15cffc2..0000000
--- a/test/simple/test-stream2-httpclient-response-end.js
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var common = require('../common.js');
-var assert = require('assert');
-var http = require('http');
-var msg = 'Hello';
-var readable_event = false;
-var end_event = false;
-var server = http.createServer(function(req, res) {
-  res.writeHead(200, {'Content-Type': 'text/plain'});
-  res.end(msg);
-}).listen(common.PORT, function() {
-  http.get({port: common.PORT}, function(res) {
-    var data = '';
-    res.on('readable', function() {
-      console.log('readable event');
-      readable_event = true;
-      data += res.read();
-    });
-    res.on('end', function() {
-      console.log('end event');
-      end_event = true;
-      assert.strictEqual(msg, data);
-      server.close();
-    });
-  });
-});
-
-process.on('exit', function() {
-  assert(readable_event);
-  assert(end_event);
-});
-
diff --git a/test/simple/test-stream2-large-read-stall.js b/test/simple/test-stream2-large-read-stall.js
index 2fbfbca..667985b 100644
--- a/test/simple/test-stream2-large-read-stall.js
+++ b/test/simple/test-stream2-large-read-stall.js
@@ -30,7 +30,7 @@ var PUSHSIZE = 20;
 var PUSHCOUNT = 1000;
 var HWM = 50;
 
-var Readable = require('stream').Readable;
+var Readable = require('../../').Readable;
 var r = new Readable({
   highWaterMark: HWM
 });
@@ -39,23 +39,23 @@ var rs = r._readableState;
 r._read = push;
 
 r.on('readable', function() {
-  console.error('>> readable');
+  //console.error('>> readable');
   do {
-    console.error('  > read(%d)', READSIZE);
+    //console.error('  > read(%d)', READSIZE);
     var ret = r.read(READSIZE);
-    console.error('  < %j (%d remain)', ret && ret.length, rs.length);
+    //console.error('  < %j (%d remain)', ret && ret.length, rs.length);
   } while (ret && ret.length === READSIZE);
 
-  console.error('<< after read()',
-                ret && ret.length,
-                rs.needReadable,
-                rs.length);
+  //console.error('<< after read()',
+  //              ret && ret.length,
+  //              rs.needReadable,
+  //              rs.length);
 });
 
 var endEmitted = false;
 r.on('end', function() {
   endEmitted = true;
-  console.error('end');
+  //console.error('end');
 });
 
 var pushes = 0;
@@ -64,11 +64,11 @@ function push() {
     return;
 
   if (pushes++ === PUSHCOUNT) {
-    console.error('   push(EOF)');
+    //console.error('   push(EOF)');
     return r.push(null);
   }
 
-  console.error('   push #%d', pushes);
+  //console.error('   push #%d', pushes);
   if (r.push(new Buffer(PUSHSIZE)))
     setTimeout(push);
 }
diff --git a/test/simple/test-stream2-objects.js b/test/simple/test-stream2-objects.js
index 3e6931d..ff47d89 100644
--- a/test/simple/test-stream2-objects.js
+++ b/test/simple/test-stream2-objects.js
@@ -21,8 +21,8 @@
 
 
 var common = require('../common.js');
-var Readable = require('_stream_readable');
-var Writable = require('_stream_writable');
+var Readable = require('../../lib/_stream_readable');
+var Writable = require('../../lib/_stream_writable');
 var assert = require('assert');
 
 // tiny node-tap lookalike.
diff --git a/test/simple/test-stream2-pipe-error-handling.js b/test/simple/test-stream2-pipe-error-handling.js
index cf7531c..e3f3e4e 100644
--- a/test/simple/test-stream2-pipe-error-handling.js
+++ b/test/simple/test-stream2-pipe-error-handling.js
@@ -21,7 +21,7 @@
 
 var common = require('../common');
 var assert = require('assert');
-var stream = require('stream');
+var stream = require('../../');
 
 (function testErrorListenerCatches() {
   var count = 1000;
diff --git a/test/simple/test-stream2-pipe-error-once-listener.js b/test/simple/test-stream2-pipe-error-once-listener.js
index 5e8e3cb..53b2616 100755
--- a/test/simple/test-stream2-pipe-error-once-listener.js
+++ b/test/simple/test-stream2-pipe-error-once-listener.js
@@ -24,7 +24,7 @@ var common = require('../common.js');
 var assert = require('assert');
 
 var util = require('util');
-var stream = require('stream');
+var stream = require('../../');
 
 
 var Read = function() {
diff --git a/test/simple/test-stream2-push.js b/test/simple/test-stream2-push.js
index b63edc3..eb2b0e9 100644
--- a/test/simple/test-stream2-push.js
+++ b/test/simple/test-stream2-push.js
@@ -20,7 +20,7 @@
 // USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 var common = require('../common.js');
-var stream = require('stream');
+var stream = require('../../');
 var Readable = stream.Readable;
 var Writable = stream.Writable;
 var assert = require('assert');
diff --git a/test/simple/test-stream2-read-sync-stack.js b/test/simple/test-stream2-read-sync-stack.js
index e8a7305..9740a47 100644
--- a/test/simple/test-stream2-read-sync-stack.js
+++ b/test/simple/test-stream2-read-sync-stack.js
@@ -21,7 +21,7 @@
 
 var common = require('../common');
 var assert = require('assert');
-var Readable = require('stream').Readable;
+var Readable = require('../../').Readable;
 var r = new Readable();
 var N = 256 * 1024;
 
diff --git a/test/simple/test-stream2-readable-empty-buffer-no-eof.js b/test/simple/test-stream2-readable-empty-buffer-no-eof.js
index cd30178..4b1659d 100644
--- a/test/simple/test-stream2-readable-empty-buffer-no-eof.js
+++ b/test/simple/test-stream2-readable-empty-buffer-no-eof.js
@@ -22,10 +22,9 @@
 var common = require('../common');
 var assert = require('assert');
 
-var Readable = require('stream').Readable;
+var Readable = require('../../').Readable;
 
 test1();
-test2();
 
 function test1() {
   var r = new Readable();
@@ -88,31 +87,3 @@ function test1() {
     console.log('ok');
   });
 }
-
-function test2() {
-  var r = new Readable({ encoding: 'base64' });
-  var reads = 5;
-  r._read = function(n) {
-    if (!reads--)
-      return r.push(null); // EOF
-    else
-      return r.push(new Buffer('x'));
-  };
-
-  var results = [];
-  function flow() {
-    var chunk;
-    while (null !== (chunk = r.read()))
-      results.push(chunk + '');
-  }
-  r.on('readable', flow);
-  r.on('end', function() {
-    results.push('EOF');
-  });
-  flow();
-
-  process.on('exit', function() {
-    assert.deepEqual(results, [ 'eHh4', 'eHg=', 'EOF' ]);
-    console.log('ok');
-  });
-}
diff --git a/test/simple/test-stream2-readable-from-list.js b/test/simple/test-stream2-readable-from-list.js
index 7c96ffe..04a96f5 100644
--- a/test/simple/test-stream2-readable-from-list.js
+++ b/test/simple/test-stream2-readable-from-list.js
@@ -21,7 +21,7 @@
 
 var assert = require('assert');
 var common = require('../common.js');
-var fromList = require('_stream_readable')._fromList;
+var fromList = require('../../lib/_stream_readable')._fromList;
 
 // tiny node-tap lookalike.
 var tests = [];
diff --git a/test/simple/test-stream2-readable-legacy-drain.js b/test/simple/test-stream2-readable-legacy-drain.js
index 675da8e..51fd3d5 100644
--- a/test/simple/test-stream2-readable-legacy-drain.js
+++ b/test/simple/test-stream2-readable-legacy-drain.js
@@ -22,7 +22,7 @@
 var common = require('../common');
 var assert = require('assert');
 
-var Stream = require('stream');
+var Stream = require('../../');
 var Readable = Stream.Readable;
 
 var r = new Readable();
diff --git a/test/simple/test-stream2-readable-non-empty-end.js b/test/simple/test-stream2-readable-non-empty-end.js
index 7314ae7..c971898 100644
--- a/test/simple/test-stream2-readable-non-empty-end.js
+++ b/test/simple/test-stream2-readable-non-empty-end.js
@@ -21,7 +21,7 @@
 
 var assert = require('assert');
 var common = require('../common.js');
-var Readable = require('_stream_readable');
+var Readable = require('../../lib/_stream_readable');
 
 var len = 0;
 var chunks = new Array(10);
diff --git a/test/simple/test-stream2-readable-wrap-empty.js b/test/simple/test-stream2-readable-wrap-empty.js
index 2e5cf25..fd8a3dc 100644
--- a/test/simple/test-stream2-readable-wrap-empty.js
+++ b/test/simple/test-stream2-readable-wrap-empty.js
@@ -22,7 +22,7 @@
 var common = require('../common');
 var assert = require('assert');
 
-var Readable = require('_stream_readable');
+var Readable = require('../../lib/_stream_readable');
 var EE = require('events').EventEmitter;
 
 var oldStream = new EE();
diff --git a/test/simple/test-stream2-readable-wrap.js b/test/simple/test-stream2-readable-wrap.js
index 90eea01..6b177f7 100644
--- a/test/simple/test-stream2-readable-wrap.js
+++ b/test/simple/test-stream2-readable-wrap.js
@@ -22,8 +22,8 @@
 var common = require('../common');
 var assert = require('assert');
 
-var Readable = require('_stream_readable');
-var Writable = require('_stream_writable');
+var Readable = require('../../lib/_stream_readable');
+var Writable = require('../../lib/_stream_writable');
 var EE = require('events').EventEmitter;
 
 var testRuns = 0, completedRuns = 0;
diff --git a/test/simple/test-stream2-set-encoding.js b/test/simple/test-stream2-set-encoding.js
index 5d2c32a..685531b 100644
--- a/test/simple/test-stream2-set-encoding.js
+++ b/test/simple/test-stream2-set-encoding.js
@@ -22,7 +22,7 @@
 
 var common = require('../common.js');
 var assert = require('assert');
-var R = require('_stream_readable');
+var R = require('../../lib/_stream_readable');
 var util = require('util');
 
 // tiny node-tap lookalike.
diff --git a/test/simple/test-stream2-transform.js b/test/simple/test-stream2-transform.js
index 9c9ddd8..a0cacc6 100644
--- a/test/simple/test-stream2-transform.js
+++ b/test/simple/test-stream2-transform.js
@@ -21,8 +21,8 @@
 
 var assert = require('assert');
 var common = require('../common.js');
-var PassThrough = require('_stream_passthrough');
-var Transform = require('_stream_transform');
+var PassThrough = require('../../').PassThrough;
+var Transform = require('../../').Transform;
 
 // tiny node-tap lookalike.
 var tests = [];
diff --git a/test/simple/test-stream2-unpipe-drain.js b/test/simple/test-stream2-unpipe-drain.js
index d66dc3c..365b327 100644
--- a/test/simple/test-stream2-unpipe-drain.js
+++ b/test/simple/test-stream2-unpipe-drain.js
@@ -22,7 +22,7 @@
 
 var common = require('../common.js');
 var assert = require('assert');
-var stream = require('stream');
+var stream = require('../../');
 var crypto = require('crypto');
 
 var util = require('util');
diff --git a/test/simple/test-stream2-unpipe-leak.js b/test/simple/test-stream2-unpipe-leak.js
index 99f8746..17c92ae 100644
--- a/test/simple/test-stream2-unpipe-leak.js
+++ b/test/simple/test-stream2-unpipe-leak.js
@@ -22,7 +22,7 @@
 
 var common = require('../common.js');
 var assert = require('assert');
-var stream = require('stream');
+var stream = require('../../');
 
 var chunk = new Buffer('hallo');
 
diff --git a/test/simple/test-stream2-writable.js b/test/simple/test-stream2-writable.js
index 704100c..209c3a6 100644
--- a/test/simple/test-stream2-writable.js
+++ b/test/simple/test-stream2-writable.js
@@ -20,8 +20,8 @@
 // USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 var common = require('../common.js');
-var W = require('_stream_writable');
-var D = require('_stream_duplex');
+var W = require('../../').Writable;
+var D = require('../../').Duplex;
 var assert = require('assert');
 
 var util = require('util');
diff --git a/test/simple/test-stream3-pause-then-read.js b/test/simple/test-stream3-pause-then-read.js
index b91bde3..2f72c15 100644
--- a/test/simple/test-stream3-pause-then-read.js
+++ b/test/simple/test-stream3-pause-then-read.js
@@ -22,7 +22,7 @@
 var common = require('../common');
 var assert = require('assert');
 
-var stream = require('stream');
+var stream = require('../../');
 var Readable = stream.Readable;
 var Writable = stream.Writable;
 
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "browser": {
    "util": false
  },
  "dependencies": {
    "core-util-is": "~1.0.0",
    "inherits": "~2.0.1",
    "isarray": "0.0.1",
    "string_decoder": "~0.10.x"
  },
  "deprecated": false,
  "description": "Streams3, a user-land copy of the stream library from Node.js v0.11.x",
  "devDependencies": {
    "tap": "~0.2.6"
  },
  "homepage": "https://github.com/isaacs/readable-stream#readme",
  "license": "MIT",
  "main": "readable.js",
  "name": "readable-stream",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/readable-stream.git"
  },
  "version": "1.1.14"
}module.exports = require("./lib/_stream_passthrough.js")
exports = module.exports = require('./lib/_stream_readable.js');
exports.Stream = require('stream');
exports.Readable = exports;
exports.Writable = require('./lib/_stream_writable.js');
exports.Duplex = require('./lib/_stream_duplex.js');
exports.Transform = require('./lib/_stream_transform.js');
exports.PassThrough = require('./lib/_stream_passthrough.js');
if (!process.browser && process.env.READABLE_STREAM === 'disable') {
  module.exports = require('stream');
}
module.exports = require("./lib/_stream_transform.js")
module.exports = require("./lib/_stream_writable.js")
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a duplex stream is just a stream that is both readable and writable.
// Since JS doesn't have multiple prototypal inheritance, this class
// prototypally inherits from Readable, and then parasitically from
// Writable.

module.exports = Duplex;

/*<replacement>*/
var objectKeys = Object.keys || function (obj) {
  var keys = [];
  for (var key in obj) keys.push(key);
  return keys;
}
/*</replacement>*/


/*<replacement>*/
var util = require('core-util-is');
util.inherits = require('inherits');
/*</replacement>*/

var Readable = require('./_stream_readable');
var Writable = require('./_stream_writable');

util.inherits(Duplex, Readable);

forEach(objectKeys(Writable.prototype), function(method) {
  if (!Duplex.prototype[method])
    Duplex.prototype[method] = Writable.prototype[method];
});

function Duplex(options) {
  if (!(this instanceof Duplex))
    return new Duplex(options);

  Readable.call(this, options);
  Writable.call(this, options);

  if (options && options.readable === false)
    this.readable = false;

  if (options && options.writable === false)
    this.writable = false;

  this.allowHalfOpen = true;
  if (options && options.allowHalfOpen === false)
    this.allowHalfOpen = false;

  this.once('end', onend);
}

// the no-half-open enforcer
function onend() {
  // if we allow half-open state, or if the writable side ended,
  // then we're ok.
  if (this.allowHalfOpen || this._writableState.ended)
    return;

  // no more data can be written.
  // But allow more writes to happen in this tick.
  process.nextTick(this.end.bind(this));
}

function forEach (xs, f) {
  for (var i = 0, l = xs.length; i < l; i++) {
    f(xs[i], i);
  }
}
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a passthrough stream.
// basically just the most minimal sort of Transform stream.
// Every written chunk gets output as-is.

module.exports = PassThrough;

var Transform = require('./_stream_transform');

/*<replacement>*/
var util = require('core-util-is');
util.inherits = require('inherits');
/*</replacement>*/

util.inherits(PassThrough, Transform);

function PassThrough(options) {
  if (!(this instanceof PassThrough))
    return new PassThrough(options);

  Transform.call(this, options);
}

PassThrough.prototype._transform = function(chunk, encoding, cb) {
  cb(null, chunk);
};
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

module.exports = Readable;

/*<replacement>*/
var isArray = require('isarray');
/*</replacement>*/


/*<replacement>*/
var Buffer = require('buffer').Buffer;
/*</replacement>*/

Readable.ReadableState = ReadableState;

var EE = require('events').EventEmitter;

/*<replacement>*/
if (!EE.listenerCount) EE.listenerCount = function(emitter, type) {
  return emitter.listeners(type).length;
};
/*</replacement>*/

var Stream = require('stream');

/*<replacement>*/
var util = require('core-util-is');
util.inherits = require('inherits');
/*</replacement>*/

var StringDecoder;


/*<replacement>*/
var debug = require('util');
if (debug && debug.debuglog) {
  debug = debug.debuglog('stream');
} else {
  debug = function () {};
}
/*</replacement>*/


util.inherits(Readable, Stream);

function ReadableState(options, stream) {
  var Duplex = require('./_stream_duplex');

  options = options || {};

  // the point at which it stops calling _read() to fill the buffer
  // Note: 0 is a valid value, means "don't call _read preemptively ever"
  var hwm = options.highWaterMark;
  var defaultHwm = options.objectMode ? 16 : 16 * 1024;
  this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm;

  // cast to ints.
  this.highWaterMark = ~~this.highWaterMark;

  this.buffer = [];
  this.length = 0;
  this.pipes = null;
  this.pipesCount = 0;
  this.flowing = null;
  this.ended = false;
  this.endEmitted = false;
  this.reading = false;

  // a flag to be able to tell if the onwrite cb is called immediately,
  // or on a later tick.  We set this to true at first, because any
  // actions that shouldn't happen until "later" should generally also
  // not happen before the first write call.
  this.sync = true;

  // whenever we return null, then we set a flag to say
  // that we're awaiting a 'readable' event emission.
  this.needReadable = false;
  this.emittedReadable = false;
  this.readableListening = false;


  // object stream flag. Used to make read(n) ignore n and to
  // make all the buffer merging and length checks go away
  this.objectMode = !!options.objectMode;

  if (stream instanceof Duplex)
    this.objectMode = this.objectMode || !!options.readableObjectMode;

  // Crypto is kind of old and crusty.  Historically, its default string
  // encoding is 'binary' so we have to make this configurable.
  // Everything else in the universe uses 'utf8', though.
  this.defaultEncoding = options.defaultEncoding || 'utf8';

  // when piping, we only care about 'readable' events that happen
  // after read()ing all the bytes and not getting any pushback.
  this.ranOut = false;

  // the number of writers that are awaiting a drain event in .pipe()s
  this.awaitDrain = 0;

  // if true, a maybeReadMore has been scheduled
  this.readingMore = false;

  this.decoder = null;
  this.encoding = null;
  if (options.encoding) {
    if (!StringDecoder)
      StringDecoder = require('string_decoder/').StringDecoder;
    this.decoder = new StringDecoder(options.encoding);
    this.encoding = options.encoding;
  }
}

function Readable(options) {
  var Duplex = require('./_stream_duplex');

  if (!(this instanceof Readable))
    return new Readable(options);

  this._readableState = new ReadableState(options, this);

  // legacy
  this.readable = true;

  Stream.call(this);
}

// Manually shove something into the read() buffer.
// This returns true if the highWaterMark has not been hit yet,
// similar to how Writable.write() returns true if you should
// write() some more.
Readable.prototype.push = function(chunk, encoding) {
  var state = this._readableState;

  if (util.isString(chunk) && !state.objectMode) {
    encoding = encoding || state.defaultEncoding;
    if (encoding !== state.encoding) {
      chunk = new Buffer(chunk, encoding);
      encoding = '';
    }
  }

  return readableAddChunk(this, state, chunk, encoding, false);
};

// Unshift should *always* be something directly out of read()
Readable.prototype.unshift = function(chunk) {
  var state = this._readableState;
  return readableAddChunk(this, state, chunk, '', true);
};

function readableAddChunk(stream, state, chunk, encoding, addToFront) {
  var er = chunkInvalid(state, chunk);
  if (er) {
    stream.emit('error', er);
  } else if (util.isNullOrUndefined(chunk)) {
    state.reading = false;
    if (!state.ended)
      onEofChunk(stream, state);
  } else if (state.objectMode || chunk && chunk.length > 0) {
    if (state.ended && !addToFront) {
      var e = new Error('stream.push() after EOF');
      stream.emit('error', e);
    } else if (state.endEmitted && addToFront) {
      var e = new Error('stream.unshift() after end event');
      stream.emit('error', e);
    } else {
      if (state.decoder && !addToFront && !encoding)
        chunk = state.decoder.write(chunk);

      if (!addToFront)
        state.reading = false;

      // if we want the data now, just emit it.
      if (state.flowing && state.length === 0 && !state.sync) {
        stream.emit('data', chunk);
        stream.read(0);
      } else {
        // update the buffer info.
        state.length += state.objectMode ? 1 : chunk.length;
        if (addToFront)
          state.buffer.unshift(chunk);
        else
          state.buffer.push(chunk);

        if (state.needReadable)
          emitReadable(stream);
      }

      maybeReadMore(stream, state);
    }
  } else if (!addToFront) {
    state.reading = false;
  }

  return needMoreData(state);
}



// if it's past the high water mark, we can push in some more.
// Also, if we have no data yet, we can stand some
// more bytes.  This is to work around cases where hwm=0,
// such as the repl.  Also, if the push() triggered a
// readable event, and the user called read(largeNumber) such that
// needReadable was set, then we ought to push more, so that another
// 'readable' event will be triggered.
function needMoreData(state) {
  return !state.ended &&
         (state.needReadable ||
          state.length < state.highWaterMark ||
          state.length === 0);
}

// backwards compatibility.
Readable.prototype.setEncoding = function(enc) {
  if (!StringDecoder)
    StringDecoder = require('string_decoder/').StringDecoder;
  this._readableState.decoder = new StringDecoder(enc);
  this._readableState.encoding = enc;
  return this;
};

// Don't raise the hwm > 128MB
var MAX_HWM = 0x800000;
function roundUpToNextPowerOf2(n) {
  if (n >= MAX_HWM) {
    n = MAX_HWM;
  } else {
    // Get the next highest power of 2
    n--;
    for (var p = 1; p < 32; p <<= 1) n |= n >> p;
    n++;
  }
  return n;
}

function howMuchToRead(n, state) {
  if (state.length === 0 && state.ended)
    return 0;

  if (state.objectMode)
    return n === 0 ? 0 : 1;

  if (isNaN(n) || util.isNull(n)) {
    // only flow one buffer at a time
    if (state.flowing && state.buffer.length)
      return state.buffer[0].length;
    else
      return state.length;
  }

  if (n <= 0)
    return 0;

  // If we're asking for more than the target buffer level,
  // then raise the water mark.  Bump up to the next highest
  // power of 2, to prevent increasing it excessively in tiny
  // amounts.
  if (n > state.highWaterMark)
    state.highWaterMark = roundUpToNextPowerOf2(n);

  // don't have that much.  return null, unless we've ended.
  if (n > state.length) {
    if (!state.ended) {
      state.needReadable = true;
      return 0;
    } else
      return state.length;
  }

  return n;
}

// you can override either this method, or the async _read(n) below.
Readable.prototype.read = function(n) {
  debug('read', n);
  var state = this._readableState;
  var nOrig = n;

  if (!util.isNumber(n) || n > 0)
    state.emittedReadable = false;

  // if we're doing read(0) to trigger a readable event, but we
  // already have a bunch of data in the buffer, then just trigger
  // the 'readable' event and move on.
  if (n === 0 &&
      state.needReadable &&
      (state.length >= state.highWaterMark || state.ended)) {
    debug('read: emitReadable', state.length, state.ended);
    if (state.length === 0 && state.ended)
      endReadable(this);
    else
      emitReadable(this);
    return null;
  }

  n = howMuchToRead(n, state);

  // if we've ended, and we're now clear, then finish it up.
  if (n === 0 && state.ended) {
    if (state.length === 0)
      endReadable(this);
    return null;
  }

  // All the actual chunk generation logic needs to be
  // *below* the call to _read.  The reason is that in certain
  // synthetic stream cases, such as passthrough streams, _read
  // may be a completely synchronous operation which may change
  // the state of the read buffer, providing enough data when
  // before there was *not* enough.
  //
  // So, the steps are:
  // 1. Figure out what the state of things will be after we do
  // a read from the buffer.
  //
  // 2. If that resulting state will trigger a _read, then call _read.
  // Note that this may be asynchronous, or synchronous.  Yes, it is
  // deeply ugly to write APIs this way, but that still doesn't mean
  // that the Readable class should behave improperly, as streams are
  // designed to be sync/async agnostic.
  // Take note if the _read call is sync or async (ie, if the read call
  // has returned yet), so that we know whether or not it's safe to emit
  // 'readable' etc.
  //
  // 3. Actually pull the requested chunks out of the buffer and return.

  // if we need a readable event, then we need to do some reading.
  var doRead = state.needReadable;
  debug('need readable', doRead);

  // if we currently have less than the highWaterMark, then also read some
  if (state.length === 0 || state.length - n < state.highWaterMark) {
    doRead = true;
    debug('length less than watermark', doRead);
  }

  // however, if we've ended, then there's no point, and if we're already
  // reading, then it's unnecessary.
  if (state.ended || state.reading) {
    doRead = false;
    debug('reading or ended', doRead);
  }

  if (doRead) {
    debug('do read');
    state.reading = true;
    state.sync = true;
    // if the length is currently zero, then we *need* a readable event.
    if (state.length === 0)
      state.needReadable = true;
    // call internal read method
    this._read(state.highWaterMark);
    state.sync = false;
  }

  // If _read pushed data synchronously, then `reading` will be false,
  // and we need to re-evaluate how much data we can return to the user.
  if (doRead && !state.reading)
    n = howMuchToRead(nOrig, state);

  var ret;
  if (n > 0)
    ret = fromList(n, state);
  else
    ret = null;

  if (util.isNull(ret)) {
    state.needReadable = true;
    n = 0;
  }

  state.length -= n;

  // If we have nothing in the buffer, then we want to know
  // as soon as we *do* get something into the buffer.
  if (state.length === 0 && !state.ended)
    state.needReadable = true;

  // If we tried to read() past the EOF, then emit end on the next tick.
  if (nOrig !== n && state.ended && state.length === 0)
    endReadable(this);

  if (!util.isNull(ret))
    this.emit('data', ret);

  return ret;
};

function chunkInvalid(state, chunk) {
  var er = null;
  if (!util.isBuffer(chunk) &&
      !util.isString(chunk) &&
      !util.isNullOrUndefined(chunk) &&
      !state.objectMode) {
    er = new TypeError('Invalid non-string/buffer chunk');
  }
  return er;
}


function onEofChunk(stream, state) {
  if (state.decoder && !state.ended) {
    var chunk = state.decoder.end();
    if (chunk && chunk.length) {
      state.buffer.push(chunk);
      state.length += state.objectMode ? 1 : chunk.length;
    }
  }
  state.ended = true;

  // emit 'readable' now to make sure it gets picked up.
  emitReadable(stream);
}

// Don't emit readable right away in sync mode, because this can trigger
// another read() call => stack overflow.  This way, it might trigger
// a nextTick recursion warning, but that's not so bad.
function emitReadable(stream) {
  var state = stream._readableState;
  state.needReadable = false;
  if (!state.emittedReadable) {
    debug('emitReadable', state.flowing);
    state.emittedReadable = true;
    if (state.sync)
      process.nextTick(function() {
        emitReadable_(stream);
      });
    else
      emitReadable_(stream);
  }
}

function emitReadable_(stream) {
  debug('emit readable');
  stream.emit('readable');
  flow(stream);
}


// at this point, the user has presumably seen the 'readable' event,
// and called read() to consume some data.  that may have triggered
// in turn another _read(n) call, in which case reading = true if
// it's in progress.
// However, if we're not ended, or reading, and the length < hwm,
// then go ahead and try to read some more preemptively.
function maybeReadMore(stream, state) {
  if (!state.readingMore) {
    state.readingMore = true;
    process.nextTick(function() {
      maybeReadMore_(stream, state);
    });
  }
}

function maybeReadMore_(stream, state) {
  var len = state.length;
  while (!state.reading && !state.flowing && !state.ended &&
         state.length < state.highWaterMark) {
    debug('maybeReadMore read 0');
    stream.read(0);
    if (len === state.length)
      // didn't get any data, stop spinning.
      break;
    else
      len = state.length;
  }
  state.readingMore = false;
}

// abstract method.  to be overridden in specific implementation classes.
// call cb(er, data) where data is <= n in length.
// for virtual (non-string, non-buffer) streams, "length" is somewhat
// arbitrary, and perhaps not very meaningful.
Readable.prototype._read = function(n) {
  this.emit('error', new Error('not implemented'));
};

Readable.prototype.pipe = function(dest, pipeOpts) {
  var src = this;
  var state = this._readableState;

  switch (state.pipesCount) {
    case 0:
      state.pipes = dest;
      break;
    case 1:
      state.pipes = [state.pipes, dest];
      break;
    default:
      state.pipes.push(dest);
      break;
  }
  state.pipesCount += 1;
  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);

  var doEnd = (!pipeOpts || pipeOpts.end !== false) &&
              dest !== process.stdout &&
              dest !== process.stderr;

  var endFn = doEnd ? onend : cleanup;
  if (state.endEmitted)
    process.nextTick(endFn);
  else
    src.once('end', endFn);

  dest.on('unpipe', onunpipe);
  function onunpipe(readable) {
    debug('onunpipe');
    if (readable === src) {
      cleanup();
    }
  }

  function onend() {
    debug('onend');
    dest.end();
  }

  // when the dest drains, it reduces the awaitDrain counter
  // on the source.  This would be more elegant with a .once()
  // handler in flow(), but adding and removing repeatedly is
  // too slow.
  var ondrain = pipeOnDrain(src);
  dest.on('drain', ondrain);

  function cleanup() {
    debug('cleanup');
    // cleanup event handlers once the pipe is broken
    dest.removeListener('close', onclose);
    dest.removeListener('finish', onfinish);
    dest.removeListener('drain', ondrain);
    dest.removeListener('error', onerror);
    dest.removeListener('unpipe', onunpipe);
    src.removeListener('end', onend);
    src.removeListener('end', cleanup);
    src.removeListener('data', ondata);

    // if the reader is waiting for a drain event from this
    // specific writer, then it would cause it to never start
    // flowing again.
    // So, if this is awaiting a drain, then we just call it now.
    // If we don't know, then assume that we are waiting for one.
    if (state.awaitDrain &&
        (!dest._writableState || dest._writableState.needDrain))
      ondrain();
  }

  src.on('data', ondata);
  function ondata(chunk) {
    debug('ondata');
    var ret = dest.write(chunk);
    if (false === ret) {
      debug('false write response, pause',
            src._readableState.awaitDrain);
      src._readableState.awaitDrain++;
      src.pause();
    }
  }

  // if the dest has an error, then stop piping into it.
  // however, don't suppress the throwing behavior for this.
  function onerror(er) {
    debug('onerror', er);
    unpipe();
    dest.removeListener('error', onerror);
    if (EE.listenerCount(dest, 'error') === 0)
      dest.emit('error', er);
  }
  // This is a brutally ugly hack to make sure that our error handler
  // is attached before any userland ones.  NEVER DO THIS.
  if (!dest._events || !dest._events.error)
    dest.on('error', onerror);
  else if (isArray(dest._events.error))
    dest._events.error.unshift(onerror);
  else
    dest._events.error = [onerror, dest._events.error];



  // Both close and finish should trigger unpipe, but only once.
  function onclose() {
    dest.removeListener('finish', onfinish);
    unpipe();
  }
  dest.once('close', onclose);
  function onfinish() {
    debug('onfinish');
    dest.removeListener('close', onclose);
    unpipe();
  }
  dest.once('finish', onfinish);

  function unpipe() {
    debug('unpipe');
    src.unpipe(dest);
  }

  // tell the dest that it's being piped to
  dest.emit('pipe', src);

  // start the flow if it hasn't been started already.
  if (!state.flowing) {
    debug('pipe resume');
    src.resume();
  }

  return dest;
};

function pipeOnDrain(src) {
  return function() {
    var state = src._readableState;
    debug('pipeOnDrain', state.awaitDrain);
    if (state.awaitDrain)
      state.awaitDrain--;
    if (state.awaitDrain === 0 && EE.listenerCount(src, 'data')) {
      state.flowing = true;
      flow(src);
    }
  };
}


Readable.prototype.unpipe = function(dest) {
  var state = this._readableState;

  // if we're not piping anywhere, then do nothing.
  if (state.pipesCount === 0)
    return this;

  // just one destination.  most common case.
  if (state.pipesCount === 1) {
    // passed in one, but it's not the right one.
    if (dest && dest !== state.pipes)
      return this;

    if (!dest)
      dest = state.pipes;

    // got a match.
    state.pipes = null;
    state.pipesCount = 0;
    state.flowing = false;
    if (dest)
      dest.emit('unpipe', this);
    return this;
  }

  // slow case. multiple pipe destinations.

  if (!dest) {
    // remove all.
    var dests = state.pipes;
    var len = state.pipesCount;
    state.pipes = null;
    state.pipesCount = 0;
    state.flowing = false;

    for (var i = 0; i < len; i++)
      dests[i].emit('unpipe', this);
    return this;
  }

  // try to find the right one.
  var i = indexOf(state.pipes, dest);
  if (i === -1)
    return this;

  state.pipes.splice(i, 1);
  state.pipesCount -= 1;
  if (state.pipesCount === 1)
    state.pipes = state.pipes[0];

  dest.emit('unpipe', this);

  return this;
};

// set up data events if they are asked for
// Ensure readable listeners eventually get something
Readable.prototype.on = function(ev, fn) {
  var res = Stream.prototype.on.call(this, ev, fn);

  // If listening to data, and it has not explicitly been paused,
  // then call resume to start the flow of data on the next tick.
  if (ev === 'data' && false !== this._readableState.flowing) {
    this.resume();
  }

  if (ev === 'readable' && this.readable) {
    var state = this._readableState;
    if (!state.readableListening) {
      state.readableListening = true;
      state.emittedReadable = false;
      state.needReadable = true;
      if (!state.reading) {
        var self = this;
        process.nextTick(function() {
          debug('readable nexttick read 0');
          self.read(0);
        });
      } else if (state.length) {
        emitReadable(this, state);
      }
    }
  }

  return res;
};
Readable.prototype.addListener = Readable.prototype.on;

// pause() and resume() are remnants of the legacy readable stream API
// If the user uses them, then switch into old mode.
Readable.prototype.resume = function() {
  var state = this._readableState;
  if (!state.flowing) {
    debug('resume');
    state.flowing = true;
    if (!state.reading) {
      debug('resume read 0');
      this.read(0);
    }
    resume(this, state);
  }
  return this;
};

function resume(stream, state) {
  if (!state.resumeScheduled) {
    state.resumeScheduled = true;
    process.nextTick(function() {
      resume_(stream, state);
    });
  }
}

function resume_(stream, state) {
  state.resumeScheduled = false;
  stream.emit('resume');
  flow(stream);
  if (state.flowing && !state.reading)
    stream.read(0);
}

Readable.prototype.pause = function() {
  debug('call pause flowing=%j', this._readableState.flowing);
  if (false !== this._readableState.flowing) {
    debug('pause');
    this._readableState.flowing = false;
    this.emit('pause');
  }
  return this;
};

function flow(stream) {
  var state = stream._readableState;
  debug('flow', state.flowing);
  if (state.flowing) {
    do {
      var chunk = stream.read();
    } while (null !== chunk && state.flowing);
  }
}

// wrap an old-style stream as the async data source.
// This is *not* part of the readable stream interface.
// It is an ugly unfortunate mess of history.
Readable.prototype.wrap = function(stream) {
  var state = this._readableState;
  var paused = false;

  var self = this;
  stream.on('end', function() {
    debug('wrapped end');
    if (state.decoder && !state.ended) {
      var chunk = state.decoder.end();
      if (chunk && chunk.length)
        self.push(chunk);
    }

    self.push(null);
  });

  stream.on('data', function(chunk) {
    debug('wrapped data');
    if (state.decoder)
      chunk = state.decoder.write(chunk);
    if (!chunk || !state.objectMode && !chunk.length)
      return;

    var ret = self.push(chunk);
    if (!ret) {
      paused = true;
      stream.pause();
    }
  });

  // proxy all the other methods.
  // important when wrapping filters and duplexes.
  for (var i in stream) {
    if (util.isFunction(stream[i]) && util.isUndefined(this[i])) {
      this[i] = function(method) { return function() {
        return stream[method].apply(stream, arguments);
      }}(i);
    }
  }

  // proxy certain important events.
  var events = ['error', 'close', 'destroy', 'pause', 'resume'];
  forEach(events, function(ev) {
    stream.on(ev, self.emit.bind(self, ev));
  });

  // when we try to consume some more bytes, simply unpause the
  // underlying stream.
  self._read = function(n) {
    debug('wrapped _read', n);
    if (paused) {
      paused = false;
      stream.resume();
    }
  };

  return self;
};



// exposed for testing purposes only.
Readable._fromList = fromList;

// Pluck off n bytes from an array of buffers.
// Length is the combined lengths of all the buffers in the list.
function fromList(n, state) {
  var list = state.buffer;
  var length = state.length;
  var stringMode = !!state.decoder;
  var objectMode = !!state.objectMode;
  var ret;

  // nothing in the list, definitely empty.
  if (list.length === 0)
    return null;

  if (length === 0)
    ret = null;
  else if (objectMode)
    ret = list.shift();
  else if (!n || n >= length) {
    // read it all, truncate the array.
    if (stringMode)
      ret = list.join('');
    else
      ret = Buffer.concat(list, length);
    list.length = 0;
  } else {
    // read just some of it.
    if (n < list[0].length) {
      // just take a part of the first list item.
      // slice is the same for buffers and strings.
      var buf = list[0];
      ret = buf.slice(0, n);
      list[0] = buf.slice(n);
    } else if (n === list[0].length) {
      // first list is a perfect match
      ret = list.shift();
    } else {
      // complex case.
      // we have enough to cover it, but it spans past the first buffer.
      if (stringMode)
        ret = '';
      else
        ret = new Buffer(n);

      var c = 0;
      for (var i = 0, l = list.length; i < l && c < n; i++) {
        var buf = list[0];
        var cpy = Math.min(n - c, buf.length);

        if (stringMode)
          ret += buf.slice(0, cpy);
        else
          buf.copy(ret, c, 0, cpy);

        if (cpy < buf.length)
          list[0] = buf.slice(cpy);
        else
          list.shift();

        c += cpy;
      }
    }
  }

  return ret;
}

function endReadable(stream) {
  var state = stream._readableState;

  // If we get here before consuming all the bytes, then that is a
  // bug in node.  Should never happen.
  if (state.length > 0)
    throw new Error('endReadable called on non-empty stream');

  if (!state.endEmitted) {
    state.ended = true;
    process.nextTick(function() {
      // Check that we didn't get one last unshift.
      if (!state.endEmitted && state.length === 0) {
        state.endEmitted = true;
        stream.readable = false;
        stream.emit('end');
      }
    });
  }
}

function forEach (xs, f) {
  for (var i = 0, l = xs.length; i < l; i++) {
    f(xs[i], i);
  }
}

function indexOf (xs, x) {
  for (var i = 0, l = xs.length; i < l; i++) {
    if (xs[i] === x) return i;
  }
  return -1;
}
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.


// a transform stream is a readable/writable stream where you do
// something with the data.  Sometimes it's called a "filter",
// but that's not a great name for it, since that implies a thing where
// some bits pass through, and others are simply ignored.  (That would
// be a valid example of a transform, of course.)
//
// While the output is causally related to the input, it's not a
// necessarily symmetric or synchronous transformation.  For example,
// a zlib stream might take multiple plain-text writes(), and then
// emit a single compressed chunk some time in the future.
//
// Here's how this works:
//
// The Transform stream has all the aspects of the readable and writable
// stream classes.  When you write(chunk), that calls _write(chunk,cb)
// internally, and returns false if there's a lot of pending writes
// buffered up.  When you call read(), that calls _read(n) until
// there's enough pending readable data buffered up.
//
// In a transform stream, the written data is placed in a buffer.  When
// _read(n) is called, it transforms the queued up data, calling the
// buffered _write cb's as it consumes chunks.  If consuming a single
// written chunk would result in multiple output chunks, then the first
// outputted bit calls the readcb, and subsequent chunks just go into
// the read buffer, and will cause it to emit 'readable' if necessary.
//
// This way, back-pressure is actually determined by the reading side,
// since _read has to be called to start processing a new chunk.  However,
// a pathological inflate type of transform can cause excessive buffering
// here.  For example, imagine a stream where every byte of input is
// interpreted as an integer from 0-255, and then results in that many
// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
// 1kb of data being output.  In this case, you could write a very small
// amount of input, and end up with a very large amount of output.  In
// such a pathological inflating mechanism, there'd be no way to tell
// the system to stop doing the transform.  A single 4MB write could
// cause the system to run out of memory.
//
// However, even in such a pathological case, only a single written chunk
// would be consumed, and then the rest would wait (un-transformed) until
// the results of the previous transformed chunk were consumed.

module.exports = Transform;

var Duplex = require('./_stream_duplex');

/*<replacement>*/
var util = require('core-util-is');
util.inherits = require('inherits');
/*</replacement>*/

util.inherits(Transform, Duplex);


function TransformState(options, stream) {
  this.afterTransform = function(er, data) {
    return afterTransform(stream, er, data);
  };

  this.needTransform = false;
  this.transforming = false;
  this.writecb = null;
  this.writechunk = null;
}

function afterTransform(stream, er, data) {
  var ts = stream._transformState;
  ts.transforming = false;

  var cb = ts.writecb;

  if (!cb)
    return stream.emit('error', new Error('no writecb in Transform class'));

  ts.writechunk = null;
  ts.writecb = null;

  if (!util.isNullOrUndefined(data))
    stream.push(data);

  if (cb)
    cb(er);

  var rs = stream._readableState;
  rs.reading = false;
  if (rs.needReadable || rs.length < rs.highWaterMark) {
    stream._read(rs.highWaterMark);
  }
}


function Transform(options) {
  if (!(this instanceof Transform))
    return new Transform(options);

  Duplex.call(this, options);

  this._transformState = new TransformState(options, this);

  // when the writable side finishes, then flush out anything remaining.
  var stream = this;

  // start out asking for a readable event once data is transformed.
  this._readableState.needReadable = true;

  // we have implemented the _read method, and done the other things
  // that Readable wants before the first _read call, so unset the
  // sync guard flag.
  this._readableState.sync = false;

  this.once('prefinish', function() {
    if (util.isFunction(this._flush))
      this._flush(function(er) {
        done(stream, er);
      });
    else
      done(stream);
  });
}

Transform.prototype.push = function(chunk, encoding) {
  this._transformState.needTransform = false;
  return Duplex.prototype.push.call(this, chunk, encoding);
};

// This is the part where you do stuff!
// override this function in implementation classes.
// 'chunk' is an input chunk.
//
// Call `push(newChunk)` to pass along transformed output
// to the readable side.  You may call 'push' zero or more times.
//
// Call `cb(err)` when you are done with this chunk.  If you pass
// an error, then that'll put the hurt on the whole operation.  If you
// never call cb(), then you'll never get another chunk.
Transform.prototype._transform = function(chunk, encoding, cb) {
  throw new Error('not implemented');
};

Transform.prototype._write = function(chunk, encoding, cb) {
  var ts = this._transformState;
  ts.writecb = cb;
  ts.writechunk = chunk;
  ts.writeencoding = encoding;
  if (!ts.transforming) {
    var rs = this._readableState;
    if (ts.needTransform ||
        rs.needReadable ||
        rs.length < rs.highWaterMark)
      this._read(rs.highWaterMark);
  }
};

// Doesn't matter what the args are here.
// _transform does all the work.
// That we got here means that the readable side wants more data.
Transform.prototype._read = function(n) {
  var ts = this._transformState;

  if (!util.isNull(ts.writechunk) && ts.writecb && !ts.transforming) {
    ts.transforming = true;
    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
  } else {
    // mark that we need a transform, so that any data that comes in
    // will get processed, now that we've asked for it.
    ts.needTransform = true;
  }
};


function done(stream, er) {
  if (er)
    return stream.emit('error', er);

  // if there's nothing in the write buffer, then that means
  // that nothing more will ever be provided
  var ws = stream._writableState;
  var ts = stream._transformState;

  if (ws.length)
    throw new Error('calling transform done when ws.length != 0');

  if (ts.transforming)
    throw new Error('calling transform done when still transforming');

  return stream.push(null);
}
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// A bit simpler than readable streams.
// Implement an async ._write(chunk, cb), and it'll handle all
// the drain event emission and buffering.

module.exports = Writable;

/*<replacement>*/
var Buffer = require('buffer').Buffer;
/*</replacement>*/

Writable.WritableState = WritableState;


/*<replacement>*/
var util = require('core-util-is');
util.inherits = require('inherits');
/*</replacement>*/

var Stream = require('stream');

util.inherits(Writable, Stream);

function WriteReq(chunk, encoding, cb) {
  this.chunk = chunk;
  this.encoding = encoding;
  this.callback = cb;
}

function WritableState(options, stream) {
  var Duplex = require('./_stream_duplex');

  options = options || {};

  // the point at which write() starts returning false
  // Note: 0 is a valid value, means that we always return false if
  // the entire buffer is not flushed immediately on write()
  var hwm = options.highWaterMark;
  var defaultHwm = options.objectMode ? 16 : 16 * 1024;
  this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm;

  // object stream flag to indicate whether or not this stream
  // contains buffers or objects.
  this.objectMode = !!options.objectMode;

  if (stream instanceof Duplex)
    this.objectMode = this.objectMode || !!options.writableObjectMode;

  // cast to ints.
  this.highWaterMark = ~~this.highWaterMark;

  this.needDrain = false;
  // at the start of calling end()
  this.ending = false;
  // when end() has been called, and returned
  this.ended = false;
  // when 'finish' is emitted
  this.finished = false;

  // should we decode strings into buffers before passing to _write?
  // this is here so that some node-core streams can optimize string
  // handling at a lower level.
  var noDecode = options.decodeStrings === false;
  this.decodeStrings = !noDecode;

  // Crypto is kind of old and crusty.  Historically, its default string
  // encoding is 'binary' so we have to make this configurable.
  // Everything else in the universe uses 'utf8', though.
  this.defaultEncoding = options.defaultEncoding || 'utf8';

  // not an actual buffer we keep track of, but a measurement
  // of how much we're waiting to get pushed to some underlying
  // socket or file.
  this.length = 0;

  // a flag to see when we're in the middle of a write.
  this.writing = false;

  // when true all writes will be buffered until .uncork() call
  this.corked = 0;

  // a flag to be able to tell if the onwrite cb is called immediately,
  // or on a later tick.  We set this to true at first, because any
  // actions that shouldn't happen until "later" should generally also
  // not happen before the first write call.
  this.sync = true;

  // a flag to know if we're processing previously buffered items, which
  // may call the _write() callback in the same tick, so that we don't
  // end up in an overlapped onwrite situation.
  this.bufferProcessing = false;

  // the callback that's passed to _write(chunk,cb)
  this.onwrite = function(er) {
    onwrite(stream, er);
  };

  // the callback that the user supplies to write(chunk,encoding,cb)
  this.writecb = null;

  // the amount that is being written when _write is called.
  this.writelen = 0;

  this.buffer = [];

  // number of pending user-supplied write callbacks
  // this must be 0 before 'finish' can be emitted
  this.pendingcb = 0;

  // emit prefinish if the only thing we're waiting for is _write cbs
  // This is relevant for synchronous Transform streams
  this.prefinished = false;

  // True if the error was already emitted and should not be thrown again
  this.errorEmitted = false;
}

function Writable(options) {
  var Duplex = require('./_stream_duplex');

  // Writable ctor is applied to Duplexes, though they're not
  // instanceof Writable, they're instanceof Readable.
  if (!(this instanceof Writable) && !(this instanceof Duplex))
    return new Writable(options);

  this._writableState = new WritableState(options, this);

  // legacy.
  this.writable = true;

  Stream.call(this);
}

// Otherwise people can pipe Writable streams, which is just wrong.
Writable.prototype.pipe = function() {
  this.emit('error', new Error('Cannot pipe. Not readable.'));
};


function writeAfterEnd(stream, state, cb) {
  var er = new Error('write after end');
  // TODO: defer error events consistently everywhere, not just the cb
  stream.emit('error', er);
  process.nextTick(function() {
    cb(er);
  });
}

// If we get something that is not a buffer, string, null, or undefined,
// and we're not in objectMode, then that's an error.
// Otherwise stream chunks are all considered to be of length=1, and the
// watermarks determine how many objects to keep in the buffer, rather than
// how many bytes or characters.
function validChunk(stream, state, chunk, cb) {
  var valid = true;
  if (!util.isBuffer(chunk) &&
      !util.isString(chunk) &&
      !util.isNullOrUndefined(chunk) &&
      !state.objectMode) {
    var er = new TypeError('Invalid non-string/buffer chunk');
    stream.emit('error', er);
    process.nextTick(function() {
      cb(er);
    });
    valid = false;
  }
  return valid;
}

Writable.prototype.write = function(chunk, encoding, cb) {
  var state = this._writableState;
  var ret = false;

  if (util.isFunction(encoding)) {
    cb = encoding;
    encoding = null;
  }

  if (util.isBuffer(chunk))
    encoding = 'buffer';
  else if (!encoding)
    encoding = state.defaultEncoding;

  if (!util.isFunction(cb))
    cb = function() {};

  if (state.ended)
    writeAfterEnd(this, state, cb);
  else if (validChunk(this, state, chunk, cb)) {
    state.pendingcb++;
    ret = writeOrBuffer(this, state, chunk, encoding, cb);
  }

  return ret;
};

Writable.prototype.cork = function() {
  var state = this._writableState;

  state.corked++;
};

Writable.prototype.uncork = function() {
  var state = this._writableState;

  if (state.corked) {
    state.corked--;

    if (!state.writing &&
        !state.corked &&
        !state.finished &&
        !state.bufferProcessing &&
        state.buffer.length)
      clearBuffer(this, state);
  }
};

function decodeChunk(state, chunk, encoding) {
  if (!state.objectMode &&
      state.decodeStrings !== false &&
      util.isString(chunk)) {
    chunk = new Buffer(chunk, encoding);
  }
  return chunk;
}

// if we're already writing something, then just put this
// in the queue, and wait our turn.  Otherwise, call _write
// If we return false, then we need a drain event, so set that flag.
function writeOrBuffer(stream, state, chunk, encoding, cb) {
  chunk = decodeChunk(state, chunk, encoding);
  if (util.isBuffer(chunk))
    encoding = 'buffer';
  var len = state.objectMode ? 1 : chunk.length;

  state.length += len;

  var ret = state.length < state.highWaterMark;
  // we must ensure that previous needDrain will not be reset to false.
  if (!ret)
    state.needDrain = true;

  if (state.writing || state.corked)
    state.buffer.push(new WriteReq(chunk, encoding, cb));
  else
    doWrite(stream, state, false, len, chunk, encoding, cb);

  return ret;
}

function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  state.writelen = len;
  state.writecb = cb;
  state.writing = true;
  state.sync = true;
  if (writev)
    stream._writev(chunk, state.onwrite);
  else
    stream._write(chunk, encoding, state.onwrite);
  state.sync = false;
}

function onwriteError(stream, state, sync, er, cb) {
  if (sync)
    process.nextTick(function() {
      state.pendingcb--;
      cb(er);
    });
  else {
    state.pendingcb--;
    cb(er);
  }

  stream._writableState.errorEmitted = true;
  stream.emit('error', er);
}

function onwriteStateUpdate(state) {
  state.writing = false;
  state.writecb = null;
  state.length -= state.writelen;
  state.writelen = 0;
}

function onwrite(stream, er) {
  var state = stream._writableState;
  var sync = state.sync;
  var cb = state.writecb;

  onwriteStateUpdate(state);

  if (er)
    onwriteError(stream, state, sync, er, cb);
  else {
    // Check if we're actually ready to finish, but don't emit yet
    var finished = needFinish(stream, state);

    if (!finished &&
        !state.corked &&
        !state.bufferProcessing &&
        state.buffer.length) {
      clearBuffer(stream, state);
    }

    if (sync) {
      process.nextTick(function() {
        afterWrite(stream, state, finished, cb);
      });
    } else {
      afterWrite(stream, state, finished, cb);
    }
  }
}

function afterWrite(stream, state, finished, cb) {
  if (!finished)
    onwriteDrain(stream, state);
  state.pendingcb--;
  cb();
  finishMaybe(stream, state);
}

// Must force callback to be called on nextTick, so that we don't
// emit 'drain' before the write() consumer gets the 'false' return
// value, and has a chance to attach a 'drain' listener.
function onwriteDrain(stream, state) {
  if (state.length === 0 && state.needDrain) {
    state.needDrain = false;
    stream.emit('drain');
  }
}


// if there's something in the buffer waiting, then process it
function clearBuffer(stream, state) {
  state.bufferProcessing = true;

  if (stream._writev && state.buffer.length > 1) {
    // Fast case, write everything using _writev()
    var cbs = [];
    for (var c = 0; c < state.buffer.length; c++)
      cbs.push(state.buffer[c].callback);

    // count the one we are adding, as well.
    // TODO(isaacs) clean this up
    state.pendingcb++;
    doWrite(stream, state, true, state.length, state.buffer, '', function(err) {
      for (var i = 0; i < cbs.length; i++) {
        state.pendingcb--;
        cbs[i](err);
      }
    });

    // Clear buffer
    state.buffer = [];
  } else {
    // Slow case, write chunks one-by-one
    for (var c = 0; c < state.buffer.length; c++) {
      var entry = state.buffer[c];
      var chunk = entry.chunk;
      var encoding = entry.encoding;
      var cb = entry.callback;
      var len = state.objectMode ? 1 : chunk.length;

      doWrite(stream, state, false, len, chunk, encoding, cb);

      // if we didn't call the onwrite immediately, then
      // it means that we need to wait until it does.
      // also, that means that the chunk and cb are currently
      // being processed, so move the buffer counter past them.
      if (state.writing) {
        c++;
        break;
      }
    }

    if (c < state.buffer.length)
      state.buffer = state.buffer.slice(c);
    else
      state.buffer.length = 0;
  }

  state.bufferProcessing = false;
}

Writable.prototype._write = function(chunk, encoding, cb) {
  cb(new Error('not implemented'));

};

Writable.prototype._writev = null;

Writable.prototype.end = function(chunk, encoding, cb) {
  var state = this._writableState;

  if (util.isFunction(chunk)) {
    cb = chunk;
    chunk = null;
    encoding = null;
  } else if (util.isFunction(encoding)) {
    cb = encoding;
    encoding = null;
  }

  if (!util.isNullOrUndefined(chunk))
    this.write(chunk, encoding);

  // .end() fully uncorks
  if (state.corked) {
    state.corked = 1;
    this.uncork();
  }

  // ignore unnecessary end() calls.
  if (!state.ending && !state.finished)
    endWritable(this, state, cb);
};


function needFinish(stream, state) {
  return (state.ending &&
          state.length === 0 &&
          !state.finished &&
          !state.writing);
}

function prefinish(stream, state) {
  if (!state.prefinished) {
    state.prefinished = true;
    stream.emit('prefinish');
  }
}

function finishMaybe(stream, state) {
  var need = needFinish(stream, state);
  if (need) {
    if (state.pendingcb === 0) {
      prefinish(stream, state);
      state.finished = true;
      stream.emit('finish');
    } else
      prefinish(stream, state);
  }
  return need;
}

function endWritable(stream, state, cb) {
  state.ending = true;
  finishMaybe(stream, state);
  if (cb) {
    if (state.finished)
      process.nextTick(cb);
    else
      stream.once('finish', cb);
  }
  state.ended = true;
}
'use strict';
var stripIndent = require('strip-indent');
var indentString = require('indent-string');

module.exports = function (str, count, indent) {
	return indentString(stripIndent(str), indent || ' ', count || 0);
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "indent-string": "^2.1.0",
    "strip-indent": "^1.0.1"
  },
  "deprecated": false,
  "description": "Strip redundant indentation and indent the string",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/redent#readme",
  "license": "MIT",
  "name": "redent",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/redent.git"
  },
  "version": "1.0.0"
}The MIT License (MIT)

Copyright (c) 2016 Espen Hovlandsdal

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
function decodeBase64 (base64) {
  return Buffer.from(base64, 'base64').toString('utf8')
}

function encodeBase64 (string) {
  return Buffer.from(string, 'utf8').toString('base64')
}

module.exports = {
  decodeBase64: decodeBase64,
  encodeBase64: encodeBase64
}
var url = require('url')
var base64 = require('./base64')

var decodeBase64 = base64.decodeBase64
var encodeBase64 = base64.encodeBase64

var tokenKey = ':_authToken'
var legacyTokenKey = ':_auth'
var userKey = ':username'
var passwordKey = ':_password'

module.exports = function () {
  var checkUrl
  var options
  if (arguments.length >= 2) {
    checkUrl = arguments[0]
    options = arguments[1]
  } else if (typeof arguments[0] === 'string') {
    checkUrl = arguments[0]
  } else {
    options = arguments[0]
  }
  options = options || {}
  options.npmrc = options.npmrc || require('rc')('npm', { registry: 'https://registry.npmjs.org/' }, {
    config: process.env.npm_config_userconfig || process.env.NPM_CONFIG_USERCONFIG
  })
  checkUrl = checkUrl || options.npmrc.registry
  return getRegistryAuthInfo(checkUrl, options) || getLegacyAuthInfo(options.npmrc)
}

function getRegistryAuthInfo (checkUrl, options) {
  var parsed = url.parse(checkUrl, false, true)
  var pathname

  while (pathname !== '/' && parsed.pathname !== pathname) {
    pathname = parsed.pathname || '/'

    var regUrl = '//' + parsed.host + pathname.replace(/\/$/, '')
    var authInfo = getAuthInfoForUrl(regUrl, options.npmrc)
    if (authInfo) {
      return authInfo
    }

    // break if not recursive
    if (!options.recursive) {
      return /\/$/.test(checkUrl)
        ? undefined
        : getRegistryAuthInfo(url.resolve(checkUrl, '.'), options)
    }

    parsed.pathname = url.resolve(normalizePath(pathname), '..') || '/'
  }

  return undefined
}

function getLegacyAuthInfo (npmrc) {
  if (!npmrc._auth) {
    return undefined
  }

  var token = replaceEnvironmentVariable(npmrc._auth)

  return { token: token, type: 'Basic' }
}

function normalizePath (path) {
  return path[path.length - 1] === '/' ? path : path + '/'
}

function getAuthInfoForUrl (regUrl, npmrc) {
  // try to get bearer token
  var bearerAuth = getBearerToken(npmrc[regUrl + tokenKey] || npmrc[regUrl + '/' + tokenKey])
  if (bearerAuth) {
    return bearerAuth
  }

  // try to get basic token
  var username = npmrc[regUrl + userKey] || npmrc[regUrl + '/' + userKey]
  var password = npmrc[regUrl + passwordKey] || npmrc[regUrl + '/' + passwordKey]
  var basicAuth = getTokenForUsernameAndPassword(username, password)
  if (basicAuth) {
    return basicAuth
  }

  var basicAuthWithToken = getLegacyAuthToken(npmrc[regUrl + legacyTokenKey] || npmrc[regUrl + '/' + legacyTokenKey])
  if (basicAuthWithToken) {
    return basicAuthWithToken
  }

  return undefined
}

function replaceEnvironmentVariable (token) {
  return token.replace(/^\$\{?([^}]*)\}?$/, function (fullMatch, envVar) {
    return process.env[envVar]
  })
}

function getBearerToken (tok) {
  if (!tok) {
    return undefined
  }

  // check if bearer token is set as environment variable
  var token = replaceEnvironmentVariable(tok)

  return { token: token, type: 'Bearer' }
}

function getTokenForUsernameAndPassword (username, password) {
  if (!username || !password) {
    return undefined
  }

  // passwords are base64 encoded, so we need to decode it
  // See https://github.com/npm/npm/blob/v3.10.6/lib/config/set-credentials-by-uri.js#L26
  var pass = decodeBase64(replaceEnvironmentVariable(password))

  // a basic auth token is base64 encoded 'username:password'
  // See https://github.com/npm/npm/blob/v3.10.6/lib/config/get-credentials-by-uri.js#L70
  var token = encodeBase64(username + ':' + pass)

  // we found a basicToken token so let's exit the loop
  return {
    token: token,
    type: 'Basic',
    password: pass,
    username: username
  }
}

function getLegacyAuthToken (tok) {
  if (!tok) {
    return undefined
  }

  // check if legacy auth token is set as environment variable
  var token = replaceEnvironmentVariable(tok)

  return { token: token, type: 'Basic' }
}
{
  "author": {
    "name": "Espen Hovlandsdal",
    "email": "espen@hovlandsdal.com"
  },
  "dependencies": {
    "rc": "^1.2.8"
  },
  "deprecated": false,
  "description": "Get the auth token set for an npm registry (if any)",
  "devDependencies": {
    "istanbul": "^0.4.2",
    "mocha": "^6.1.4",
    "require-uncached": "^1.0.2",
    "standard": "^12.0.1"
  },
  "engines": {
    "node": ">=6.0.0"
  },
  "homepage": "https://github.com/rexxars/registry-auth-token#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "registry-auth-token",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/rexxars/registry-auth-token.git"
  },
  "standard": {
    "ignore": [
      "coverage/**"
    ]
  },
  "version": "4.2.0"
}module.exports = function (scope, npmrc) {
  var rc = npmrc || require('rc')('npm', { registry: 'https://registry.npmjs.org/' })
  var url = rc[scope + ':registry'] || rc.registry
  return url.slice(-1) === '/' ? url : url + '/'
}
'use strict';
const rc = require('rc');

const registryUrl = scope => {
	const result = rc('npm', {registry: 'https://registry.npmjs.org/'});
	const url = result[`${scope}:registry`] || result.config_registry || result.registry;
	return url.slice(-1) === '/' ? url : `${url}/`;
};

module.exports = registryUrl;
// TODO: Remove this for the next major release
module.exports.default = registryUrl;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "rc": "^1.2.8"
  },
  "deprecated": false,
  "description": "Get the set npm registry URL",
  "devDependencies": {
    "ava": "^1.4.1",
    "import-fresh": "^3.0.0",
    "tsd": "^0.7.2",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/sindresorhus/registry-url#readme",
  "license": "MIT",
  "name": "registry-url",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/registry-url.git"
  },
  "version": "5.1.0"
}'use strict';
var isFinite = require('is-finite');

module.exports = function (str, n) {
	if (typeof str !== 'string') {
		throw new TypeError('Expected `input` to be a string');
	}

	if (n < 0 || !isFinite(n)) {
		throw new TypeError('Expected `count` to be a positive finite number');
	}

	var ret = '';

	do {
		if (n & 1) {
			ret += str;
		}

		str += str;
	} while ((n >>= 1));

	return ret;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "is-finite": "^1.0.0"
  },
  "deprecated": false,
  "description": "Repeat a string - fast",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/repeating#readme",
  "license": "MIT",
  "name": "repeating",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/repeating.git"
  },
  "version": "2.0.1"
}Apache License

Version 2.0, January 2004

http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

You must give any other recipients of the Work or Derivative Works a copy of this License; and

You must cause any modified files to carry prominent notices stating that You changed the files; and

You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS// Copyright 2010-2012 Mikeal Rogers
//
//    Licensed under the Apache License, Version 2.0 (the "License");
//    you may not use this file except in compliance with the License.
//    You may obtain a copy of the License at
//
//        http://www.apache.org/licenses/LICENSE-2.0
//
//    Unless required by applicable law or agreed to in writing, software
//    distributed under the License is distributed on an "AS IS" BASIS,
//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//    See the License for the specific language governing permissions and
//    limitations under the License.

'use strict'

var extend = require('extend')
var cookies = require('./lib/cookies')
var helpers = require('./lib/helpers')

var paramsHaveRequestBody = helpers.paramsHaveRequestBody

// organize params for patch, post, put, head, del
function initParams (uri, options, callback) {
  if (typeof options === 'function') {
    callback = options
  }

  var params = {}
  if (options !== null && typeof options === 'object') {
    extend(params, options, {uri: uri})
  } else if (typeof uri === 'string') {
    extend(params, {uri: uri})
  } else {
    extend(params, uri)
  }

  params.callback = callback || params.callback
  return params
}

function request (uri, options, callback) {
  if (typeof uri === 'undefined') {
    throw new Error('undefined is not a valid uri or options object.')
  }

  var params = initParams(uri, options, callback)

  if (params.method === 'HEAD' && paramsHaveRequestBody(params)) {
    throw new Error('HTTP HEAD requests MUST NOT include a request body.')
  }

  return new request.Request(params)
}

function verbFunc (verb) {
  var method = verb.toUpperCase()
  return function (uri, options, callback) {
    var params = initParams(uri, options, callback)
    params.method = method
    return request(params, params.callback)
  }
}

// define like this to please codeintel/intellisense IDEs
request.get = verbFunc('get')
request.head = verbFunc('head')
request.options = verbFunc('options')
request.post = verbFunc('post')
request.put = verbFunc('put')
request.patch = verbFunc('patch')
request.del = verbFunc('delete')
request['delete'] = verbFunc('delete')

request.jar = function (store) {
  return cookies.jar(store)
}

request.cookie = function (str) {
  return cookies.parse(str)
}

function wrapRequestMethod (method, options, requester, verb) {
  return function (uri, opts, callback) {
    var params = initParams(uri, opts, callback)

    var target = {}
    extend(true, target, options, params)

    target.pool = params.pool || options.pool

    if (verb) {
      target.method = verb.toUpperCase()
    }

    if (typeof requester === 'function') {
      method = requester
    }

    return method(target, target.callback)
  }
}

request.defaults = function (options, requester) {
  var self = this

  options = options || {}

  if (typeof options === 'function') {
    requester = options
    options = {}
  }

  var defaults = wrapRequestMethod(self, options, requester)

  var verbs = ['get', 'head', 'post', 'put', 'patch', 'del', 'delete']
  verbs.forEach(function (verb) {
    defaults[verb] = wrapRequestMethod(self[verb], options, requester, verb)
  })

  defaults.cookie = wrapRequestMethod(self.cookie, options, requester)
  defaults.jar = self.jar
  defaults.defaults = self.defaults
  return defaults
}

request.forever = function (agentOptions, optionsArg) {
  var options = {}
  if (optionsArg) {
    extend(options, optionsArg)
  }
  if (agentOptions) {
    options.agentOptions = agentOptions
  }

  options.forever = true
  return request.defaults(options)
}

// Exports

module.exports = request
request.Request = require('./request')
request.initParams = initParams

// Backwards compatibility for request.debug
Object.defineProperty(request, 'debug', {
  enumerable: true,
  get: function () {
    return request.Request.debug
  },
  set: function (debug) {
    request.Request.debug = debug
  }
})
{
  "author": {
    "name": "Mikeal Rogers",
    "email": "mikeal.rogers@gmail.com"
  },
  "dependencies": {
    "aws-sign2": "~0.7.0",
    "aws4": "^1.8.0",
    "caseless": "~0.12.0",
    "combined-stream": "~1.0.6",
    "extend": "~3.0.2",
    "forever-agent": "~0.6.1",
    "form-data": "~2.3.2",
    "har-validator": "~5.1.3",
    "http-signature": "~1.2.0",
    "is-typedarray": "~1.0.0",
    "isstream": "~0.1.2",
    "json-stringify-safe": "~5.0.1",
    "mime-types": "~2.1.19",
    "oauth-sign": "~0.9.0",
    "performance-now": "^2.1.0",
    "qs": "~6.5.2",
    "safe-buffer": "^5.1.2",
    "tough-cookie": "~2.5.0",
    "tunnel-agent": "^0.6.0",
    "uuid": "^3.3.2"
  },
  "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
  "description": "Simplified HTTP request client.",
  "devDependencies": {
    "bluebird": "^3.2.1",
    "browserify": "^13.0.1",
    "browserify-istanbul": "^2.0.0",
    "buffer-equal": "^1.0.0",
    "codecov": "^3.0.4",
    "coveralls": "^3.0.2",
    "function-bind": "^1.0.2",
    "karma": "^3.0.0",
    "karma-browserify": "^5.0.1",
    "karma-cli": "^1.0.0",
    "karma-coverage": "^1.0.0",
    "karma-phantomjs-launcher": "^1.0.0",
    "karma-tap": "^3.0.1",
    "nyc": "^14.1.1",
    "phantomjs-prebuilt": "^2.1.3",
    "rimraf": "^2.2.8",
    "server-destroy": "^1.0.1",
    "standard": "^9.0.0",
    "tape": "^4.6.0",
    "taper": "^0.5.0"
  },
  "engines": {
    "node": ">= 6"
  },
  "files": [
    "lib/",
    "index.js",
    "request.js"
  ],
  "greenkeeper": {
    "ignore": [
      "hawk",
      "har-validator"
    ]
  },
  "homepage": "https://github.com/request/request#readme",
  "license": "Apache-2.0",
  "main": "index.js",
  "name": "request",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/request/request.git"
  },
  "version": "2.88.2"
}'use strict'

var http = require('http')
var https = require('https')
var url = require('url')
var util = require('util')
var stream = require('stream')
var zlib = require('zlib')
var aws2 = require('aws-sign2')
var aws4 = require('aws4')
var httpSignature = require('http-signature')
var mime = require('mime-types')
var caseless = require('caseless')
var ForeverAgent = require('forever-agent')
var FormData = require('form-data')
var extend = require('extend')
var isstream = require('isstream')
var isTypedArray = require('is-typedarray').strict
var helpers = require('./lib/helpers')
var cookies = require('./lib/cookies')
var getProxyFromURI = require('./lib/getProxyFromURI')
var Querystring = require('./lib/querystring').Querystring
var Har = require('./lib/har').Har
var Auth = require('./lib/auth').Auth
var OAuth = require('./lib/oauth').OAuth
var hawk = require('./lib/hawk')
var Multipart = require('./lib/multipart').Multipart
var Redirect = require('./lib/redirect').Redirect
var Tunnel = require('./lib/tunnel').Tunnel
var now = require('performance-now')
var Buffer = require('safe-buffer').Buffer

var safeStringify = helpers.safeStringify
var isReadStream = helpers.isReadStream
var toBase64 = helpers.toBase64
var defer = helpers.defer
var copy = helpers.copy
var version = helpers.version
var globalCookieJar = cookies.jar()

var globalPool = {}

function filterForNonReserved (reserved, options) {
  // Filter out properties that are not reserved.
  // Reserved values are passed in at call site.

  var object = {}
  for (var i in options) {
    var notReserved = (reserved.indexOf(i) === -1)
    if (notReserved) {
      object[i] = options[i]
    }
  }
  return object
}

function filterOutReservedFunctions (reserved, options) {
  // Filter out properties that are functions and are reserved.
  // Reserved values are passed in at call site.

  var object = {}
  for (var i in options) {
    var isReserved = !(reserved.indexOf(i) === -1)
    var isFunction = (typeof options[i] === 'function')
    if (!(isReserved && isFunction)) {
      object[i] = options[i]
    }
  }
  return object
}

// Return a simpler request object to allow serialization
function requestToJSON () {
  var self = this
  return {
    uri: self.uri,
    method: self.method,
    headers: self.headers
  }
}

// Return a simpler response object to allow serialization
function responseToJSON () {
  var self = this
  return {
    statusCode: self.statusCode,
    body: self.body,
    headers: self.headers,
    request: requestToJSON.call(self.request)
  }
}

function Request (options) {
  // if given the method property in options, set property explicitMethod to true

  // extend the Request instance with any non-reserved properties
  // remove any reserved functions from the options object
  // set Request instance to be readable and writable
  // call init

  var self = this

  // start with HAR, then override with additional options
  if (options.har) {
    self._har = new Har(self)
    options = self._har.options(options)
  }

  stream.Stream.call(self)
  var reserved = Object.keys(Request.prototype)
  var nonReserved = filterForNonReserved(reserved, options)

  extend(self, nonReserved)
  options = filterOutReservedFunctions(reserved, options)

  self.readable = true
  self.writable = true
  if (options.method) {
    self.explicitMethod = true
  }
  self._qs = new Querystring(self)
  self._auth = new Auth(self)
  self._oauth = new OAuth(self)
  self._multipart = new Multipart(self)
  self._redirect = new Redirect(self)
  self._tunnel = new Tunnel(self)
  self.init(options)
}

util.inherits(Request, stream.Stream)

// Debugging
Request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG)
function debug () {
  if (Request.debug) {
    console.error('REQUEST %s', util.format.apply(util, arguments))
  }
}
Request.prototype.debug = debug

Request.prototype.init = function (options) {
  // init() contains all the code to setup the request object.
  // the actual outgoing request is not started until start() is called
  // this function is called from both the constructor and on redirect.
  var self = this
  if (!options) {
    options = {}
  }
  self.headers = self.headers ? copy(self.headers) : {}

  // Delete headers with value undefined since they break
  // ClientRequest.OutgoingMessage.setHeader in node 0.12
  for (var headerName in self.headers) {
    if (typeof self.headers[headerName] === 'undefined') {
      delete self.headers[headerName]
    }
  }

  caseless.httpify(self, self.headers)

  if (!self.method) {
    self.method = options.method || 'GET'
  }
  if (!self.localAddress) {
    self.localAddress = options.localAddress
  }

  self._qs.init(options)

  debug(options)
  if (!self.pool && self.pool !== false) {
    self.pool = globalPool
  }
  self.dests = self.dests || []
  self.__isRequestRequest = true

  // Protect against double callback
  if (!self._callback && self.callback) {
    self._callback = self.callback
    self.callback = function () {
      if (self._callbackCalled) {
        return // Print a warning maybe?
      }
      self._callbackCalled = true
      self._callback.apply(self, arguments)
    }
    self.on('error', self.callback.bind())
    self.on('complete', self.callback.bind(self, null))
  }

  // People use this property instead all the time, so support it
  if (!self.uri && self.url) {
    self.uri = self.url
    delete self.url
  }

  // If there's a baseUrl, then use it as the base URL (i.e. uri must be
  // specified as a relative path and is appended to baseUrl).
  if (self.baseUrl) {
    if (typeof self.baseUrl !== 'string') {
      return self.emit('error', new Error('options.baseUrl must be a string'))
    }

    if (typeof self.uri !== 'string') {
      return self.emit('error', new Error('options.uri must be a string when using options.baseUrl'))
    }

    if (self.uri.indexOf('//') === 0 || self.uri.indexOf('://') !== -1) {
      return self.emit('error', new Error('options.uri must be a path when using options.baseUrl'))
    }

    // Handle all cases to make sure that there's only one slash between
    // baseUrl and uri.
    var baseUrlEndsWithSlash = self.baseUrl.lastIndexOf('/') === self.baseUrl.length - 1
    var uriStartsWithSlash = self.uri.indexOf('/') === 0

    if (baseUrlEndsWithSlash && uriStartsWithSlash) {
      self.uri = self.baseUrl + self.uri.slice(1)
    } else if (baseUrlEndsWithSlash || uriStartsWithSlash) {
      self.uri = self.baseUrl + self.uri
    } else if (self.uri === '') {
      self.uri = self.baseUrl
    } else {
      self.uri = self.baseUrl + '/' + self.uri
    }
    delete self.baseUrl
  }

  // A URI is needed by this point, emit error if we haven't been able to get one
  if (!self.uri) {
    return self.emit('error', new Error('options.uri is a required argument'))
  }

  // If a string URI/URL was given, parse it into a URL object
  if (typeof self.uri === 'string') {
    self.uri = url.parse(self.uri)
  }

  // Some URL objects are not from a URL parsed string and need href added
  if (!self.uri.href) {
    self.uri.href = url.format(self.uri)
  }

  // DEPRECATED: Warning for users of the old Unix Sockets URL Scheme
  if (self.uri.protocol === 'unix:') {
    return self.emit('error', new Error('`unix://` URL scheme is no longer supported. Please use the format `http://unix:SOCKET:PATH`'))
  }

  // Support Unix Sockets
  if (self.uri.host === 'unix') {
    self.enableUnixSocket()
  }

  if (self.strictSSL === false) {
    self.rejectUnauthorized = false
  }

  if (!self.uri.pathname) { self.uri.pathname = '/' }

  if (!(self.uri.host || (self.uri.hostname && self.uri.port)) && !self.uri.isUnix) {
    // Invalid URI: it may generate lot of bad errors, like 'TypeError: Cannot call method `indexOf` of undefined' in CookieJar
    // Detect and reject it as soon as possible
    var faultyUri = url.format(self.uri)
    var message = 'Invalid URI "' + faultyUri + '"'
    if (Object.keys(options).length === 0) {
      // No option ? This can be the sign of a redirect
      // As this is a case where the user cannot do anything (they didn't call request directly with this URL)
      // they should be warned that it can be caused by a redirection (can save some hair)
      message += '. This can be caused by a crappy redirection.'
    }
    // This error was fatal
    self.abort()
    return self.emit('error', new Error(message))
  }

  if (!self.hasOwnProperty('proxy')) {
    self.proxy = getProxyFromURI(self.uri)
  }

  self.tunnel = self._tunnel.isEnabled()
  if (self.proxy) {
    self._tunnel.setup(options)
  }

  self._redirect.onRequest(options)

  self.setHost = false
  if (!self.hasHeader('host')) {
    var hostHeaderName = self.originalHostHeaderName || 'host'
    self.setHeader(hostHeaderName, self.uri.host)
    // Drop :port suffix from Host header if known protocol.
    if (self.uri.port) {
      if ((self.uri.port === '80' && self.uri.protocol === 'http:') ||
          (self.uri.port === '443' && self.uri.protocol === 'https:')) {
        self.setHeader(hostHeaderName, self.uri.hostname)
      }
    }
    self.setHost = true
  }

  self.jar(self._jar || options.jar)

  if (!self.uri.port) {
    if (self.uri.protocol === 'http:') { self.uri.port = 80 } else if (self.uri.protocol === 'https:') { self.uri.port = 443 }
  }

  if (self.proxy && !self.tunnel) {
    self.port = self.proxy.port
    self.host = self.proxy.hostname
  } else {
    self.port = self.uri.port
    self.host = self.uri.hostname
  }

  if (options.form) {
    self.form(options.form)
  }

  if (options.formData) {
    var formData = options.formData
    var requestForm = self.form()
    var appendFormValue = function (key, value) {
      if (value && value.hasOwnProperty('value') && value.hasOwnProperty('options')) {
        requestForm.append(key, value.value, value.options)
      } else {
        requestForm.append(key, value)
      }
    }
    for (var formKey in formData) {
      if (formData.hasOwnProperty(formKey)) {
        var formValue = formData[formKey]
        if (formValue instanceof Array) {
          for (var j = 0; j < formValue.length; j++) {
            appendFormValue(formKey, formValue[j])
          }
        } else {
          appendFormValue(formKey, formValue)
        }
      }
    }
  }

  if (options.qs) {
    self.qs(options.qs)
  }

  if (self.uri.path) {
    self.path = self.uri.path
  } else {
    self.path = self.uri.pathname + (self.uri.search || '')
  }

  if (self.path.length === 0) {
    self.path = '/'
  }

  // Auth must happen last in case signing is dependent on other headers
  if (options.aws) {
    self.aws(options.aws)
  }

  if (options.hawk) {
    self.hawk(options.hawk)
  }

  if (options.httpSignature) {
    self.httpSignature(options.httpSignature)
  }

  if (options.auth) {
    if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) {
      options.auth.user = options.auth.username
    }
    if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) {
      options.auth.pass = options.auth.password
    }

    self.auth(
      options.auth.user,
      options.auth.pass,
      options.auth.sendImmediately,
      options.auth.bearer
    )
  }

  if (self.gzip && !self.hasHeader('accept-encoding')) {
    self.setHeader('accept-encoding', 'gzip, deflate')
  }

  if (self.uri.auth && !self.hasHeader('authorization')) {
    var uriAuthPieces = self.uri.auth.split(':').map(function (item) { return self._qs.unescape(item) })
    self.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(':'), true)
  }

  if (!self.tunnel && self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization')) {
    var proxyAuthPieces = self.proxy.auth.split(':').map(function (item) { return self._qs.unescape(item) })
    var authHeader = 'Basic ' + toBase64(proxyAuthPieces.join(':'))
    self.setHeader('proxy-authorization', authHeader)
  }

  if (self.proxy && !self.tunnel) {
    self.path = (self.uri.protocol + '//' + self.uri.host + self.path)
  }

  if (options.json) {
    self.json(options.json)
  }
  if (options.multipart) {
    self.multipart(options.multipart)
  }

  if (options.time) {
    self.timing = true

    // NOTE: elapsedTime is deprecated in favor of .timings
    self.elapsedTime = self.elapsedTime || 0
  }

  function setContentLength () {
    if (isTypedArray(self.body)) {
      self.body = Buffer.from(self.body)
    }

    if (!self.hasHeader('content-length')) {
      var length
      if (typeof self.body === 'string') {
        length = Buffer.byteLength(self.body)
      } else if (Array.isArray(self.body)) {
        length = self.body.reduce(function (a, b) { return a + b.length }, 0)
      } else {
        length = self.body.length
      }

      if (length) {
        self.setHeader('content-length', length)
      } else {
        self.emit('error', new Error('Argument error, options.body.'))
      }
    }
  }
  if (self.body && !isstream(self.body)) {
    setContentLength()
  }

  if (options.oauth) {
    self.oauth(options.oauth)
  } else if (self._oauth.params && self.hasHeader('authorization')) {
    self.oauth(self._oauth.params)
  }

  var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol
  var defaultModules = {'http:': http, 'https:': https}
  var httpModules = self.httpModules || {}

  self.httpModule = httpModules[protocol] || defaultModules[protocol]

  if (!self.httpModule) {
    return self.emit('error', new Error('Invalid protocol: ' + protocol))
  }

  if (options.ca) {
    self.ca = options.ca
  }

  if (!self.agent) {
    if (options.agentOptions) {
      self.agentOptions = options.agentOptions
    }

    if (options.agentClass) {
      self.agentClass = options.agentClass
    } else if (options.forever) {
      var v = version()
      // use ForeverAgent in node 0.10- only
      if (v.major === 0 && v.minor <= 10) {
        self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL
      } else {
        self.agentClass = self.httpModule.Agent
        self.agentOptions = self.agentOptions || {}
        self.agentOptions.keepAlive = true
      }
    } else {
      self.agentClass = self.httpModule.Agent
    }
  }

  if (self.pool === false) {
    self.agent = false
  } else {
    self.agent = self.agent || self.getNewAgent()
  }

  self.on('pipe', function (src) {
    if (self.ntick && self._started) {
      self.emit('error', new Error('You cannot pipe to this stream after the outbound request has started.'))
    }
    self.src = src
    if (isReadStream(src)) {
      if (!self.hasHeader('content-type')) {
        self.setHeader('content-type', mime.lookup(src.path))
      }
    } else {
      if (src.headers) {
        for (var i in src.headers) {
          if (!self.hasHeader(i)) {
            self.setHeader(i, src.headers[i])
          }
        }
      }
      if (self._json && !self.hasHeader('content-type')) {
        self.setHeader('content-type', 'application/json')
      }
      if (src.method && !self.explicitMethod) {
        self.method = src.method
      }
    }

  // self.on('pipe', function () {
  //   console.error('You have already piped to this stream. Pipeing twice is likely to break the request.')
  // })
  })

  defer(function () {
    if (self._aborted) {
      return
    }

    var end = function () {
      if (self._form) {
        if (!self._auth.hasAuth) {
          self._form.pipe(self)
        } else if (self._auth.hasAuth && self._auth.sentAuth) {
          self._form.pipe(self)
        }
      }
      if (self._multipart && self._multipart.chunked) {
        self._multipart.body.pipe(self)
      }
      if (self.body) {
        if (isstream(self.body)) {
          self.body.pipe(self)
        } else {
          setContentLength()
          if (Array.isArray(self.body)) {
            self.body.forEach(function (part) {
              self.write(part)
            })
          } else {
            self.write(self.body)
          }
          self.end()
        }
      } else if (self.requestBodyStream) {
        console.warn('options.requestBodyStream is deprecated, please pass the request object to stream.pipe.')
        self.requestBodyStream.pipe(self)
      } else if (!self.src) {
        if (self._auth.hasAuth && !self._auth.sentAuth) {
          self.end()
          return
        }
        if (self.method !== 'GET' && typeof self.method !== 'undefined') {
          self.setHeader('content-length', 0)
        }
        self.end()
      }
    }

    if (self._form && !self.hasHeader('content-length')) {
      // Before ending the request, we had to compute the length of the whole form, asyncly
      self.setHeader(self._form.getHeaders(), true)
      self._form.getLength(function (err, length) {
        if (!err && !isNaN(length)) {
          self.setHeader('content-length', length)
        }
        end()
      })
    } else {
      end()
    }

    self.ntick = true
  })
}

Request.prototype.getNewAgent = function () {
  var self = this
  var Agent = self.agentClass
  var options = {}
  if (self.agentOptions) {
    for (var i in self.agentOptions) {
      options[i] = self.agentOptions[i]
    }
  }
  if (self.ca) {
    options.ca = self.ca
  }
  if (self.ciphers) {
    options.ciphers = self.ciphers
  }
  if (self.secureProtocol) {
    options.secureProtocol = self.secureProtocol
  }
  if (self.secureOptions) {
    options.secureOptions = self.secureOptions
  }
  if (typeof self.rejectUnauthorized !== 'undefined') {
    options.rejectUnauthorized = self.rejectUnauthorized
  }

  if (self.cert && self.key) {
    options.key = self.key
    options.cert = self.cert
  }

  if (self.pfx) {
    options.pfx = self.pfx
  }

  if (self.passphrase) {
    options.passphrase = self.passphrase
  }

  var poolKey = ''

  // different types of agents are in different pools
  if (Agent !== self.httpModule.Agent) {
    poolKey += Agent.name
  }

  // ca option is only relevant if proxy or destination are https
  var proxy = self.proxy
  if (typeof proxy === 'string') {
    proxy = url.parse(proxy)
  }
  var isHttps = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:'

  if (isHttps) {
    if (options.ca) {
      if (poolKey) {
        poolKey += ':'
      }
      poolKey += options.ca
    }

    if (typeof options.rejectUnauthorized !== 'undefined') {
      if (poolKey) {
        poolKey += ':'
      }
      poolKey += options.rejectUnauthorized
    }

    if (options.cert) {
      if (poolKey) {
        poolKey += ':'
      }
      poolKey += options.cert.toString('ascii') + options.key.toString('ascii')
    }

    if (options.pfx) {
      if (poolKey) {
        poolKey += ':'
      }
      poolKey += options.pfx.toString('ascii')
    }

    if (options.ciphers) {
      if (poolKey) {
        poolKey += ':'
      }
      poolKey += options.ciphers
    }

    if (options.secureProtocol) {
      if (poolKey) {
        poolKey += ':'
      }
      poolKey += options.secureProtocol
    }

    if (options.secureOptions) {
      if (poolKey) {
        poolKey += ':'
      }
      poolKey += options.secureOptions
    }
  }

  if (self.pool === globalPool && !poolKey && Object.keys(options).length === 0 && self.httpModule.globalAgent) {
    // not doing anything special.  Use the globalAgent
    return self.httpModule.globalAgent
  }

  // we're using a stored agent.  Make sure it's protocol-specific
  poolKey = self.uri.protocol + poolKey

  // generate a new agent for this setting if none yet exists
  if (!self.pool[poolKey]) {
    self.pool[poolKey] = new Agent(options)
    // properly set maxSockets on new agents
    if (self.pool.maxSockets) {
      self.pool[poolKey].maxSockets = self.pool.maxSockets
    }
  }

  return self.pool[poolKey]
}

Request.prototype.start = function () {
  // start() is called once we are ready to send the outgoing HTTP request.
  // this is usually called on the first write(), end() or on nextTick()
  var self = this

  if (self.timing) {
    // All timings will be relative to this request's startTime.  In order to do this,
    // we need to capture the wall-clock start time (via Date), immediately followed
    // by the high-resolution timer (via now()).  While these two won't be set
    // at the _exact_ same time, they should be close enough to be able to calculate
    // high-resolution, monotonically non-decreasing timestamps relative to startTime.
    var startTime = new Date().getTime()
    var startTimeNow = now()
  }

  if (self._aborted) {
    return
  }

  self._started = true
  self.method = self.method || 'GET'
  self.href = self.uri.href

  if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) {
    self.setHeader('content-length', self.src.stat.size)
  }
  if (self._aws) {
    self.aws(self._aws, true)
  }

  // We have a method named auth, which is completely different from the http.request
  // auth option.  If we don't remove it, we're gonna have a bad time.
  var reqOptions = copy(self)
  delete reqOptions.auth

  debug('make request', self.uri.href)

  // node v6.8.0 now supports a `timeout` value in `http.request()`, but we
  // should delete it for now since we handle timeouts manually for better
  // consistency with node versions before v6.8.0
  delete reqOptions.timeout

  try {
    self.req = self.httpModule.request(reqOptions)
  } catch (err) {
    self.emit('error', err)
    return
  }

  if (self.timing) {
    self.startTime = startTime
    self.startTimeNow = startTimeNow

    // Timing values will all be relative to startTime (by comparing to startTimeNow
    // so we have an accurate clock)
    self.timings = {}
  }

  var timeout
  if (self.timeout && !self.timeoutTimer) {
    if (self.timeout < 0) {
      timeout = 0
    } else if (typeof self.timeout === 'number' && isFinite(self.timeout)) {
      timeout = self.timeout
    }
  }

  self.req.on('response', self.onRequestResponse.bind(self))
  self.req.on('error', self.onRequestError.bind(self))
  self.req.on('drain', function () {
    self.emit('drain')
  })

  self.req.on('socket', function (socket) {
    // `._connecting` was the old property which was made public in node v6.1.0
    var isConnecting = socket._connecting || socket.connecting
    if (self.timing) {
      self.timings.socket = now() - self.startTimeNow

      if (isConnecting) {
        var onLookupTiming = function () {
          self.timings.lookup = now() - self.startTimeNow
        }

        var onConnectTiming = function () {
          self.timings.connect = now() - self.startTimeNow
        }

        socket.once('lookup', onLookupTiming)
        socket.once('connect', onConnectTiming)

        // clean up timing event listeners if needed on error
        self.req.once('error', function () {
          socket.removeListener('lookup', onLookupTiming)
          socket.removeListener('connect', onConnectTiming)
        })
      }
    }

    var setReqTimeout = function () {
      // This timeout sets the amount of time to wait *between* bytes sent
      // from the server once connected.
      //
      // In particular, it's useful for erroring if the server fails to send
      // data halfway through streaming a response.
      self.req.setTimeout(timeout, function () {
        if (self.req) {
          self.abort()
          var e = new Error('ESOCKETTIMEDOUT')
          e.code = 'ESOCKETTIMEDOUT'
          e.connect = false
          self.emit('error', e)
        }
      })
    }
    if (timeout !== undefined) {
      // Only start the connection timer if we're actually connecting a new
      // socket, otherwise if we're already connected (because this is a
      // keep-alive connection) do not bother. This is important since we won't
      // get a 'connect' event for an already connected socket.
      if (isConnecting) {
        var onReqSockConnect = function () {
          socket.removeListener('connect', onReqSockConnect)
          self.clearTimeout()
          setReqTimeout()
        }

        socket.on('connect', onReqSockConnect)

        self.req.on('error', function (err) { // eslint-disable-line handle-callback-err
          socket.removeListener('connect', onReqSockConnect)
        })

        // Set a timeout in memory - this block will throw if the server takes more
        // than `timeout` to write the HTTP status and headers (corresponding to
        // the on('response') event on the client). NB: this measures wall-clock
        // time, not the time between bytes sent by the server.
        self.timeoutTimer = setTimeout(function () {
          socket.removeListener('connect', onReqSockConnect)
          self.abort()
          var e = new Error('ETIMEDOUT')
          e.code = 'ETIMEDOUT'
          e.connect = true
          self.emit('error', e)
        }, timeout)
      } else {
        // We're already connected
        setReqTimeout()
      }
    }
    self.emit('socket', socket)
  })

  self.emit('request', self.req)
}

Request.prototype.onRequestError = function (error) {
  var self = this
  if (self._aborted) {
    return
  }
  if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET' &&
    self.agent.addRequestNoreuse) {
    self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) }
    self.start()
    self.req.end()
    return
  }
  self.clearTimeout()
  self.emit('error', error)
}

Request.prototype.onRequestResponse = function (response) {
  var self = this

  if (self.timing) {
    self.timings.response = now() - self.startTimeNow
  }

  debug('onRequestResponse', self.uri.href, response.statusCode, response.headers)
  response.on('end', function () {
    if (self.timing) {
      self.timings.end = now() - self.startTimeNow
      response.timingStart = self.startTime

      // fill in the blanks for any periods that didn't trigger, such as
      // no lookup or connect due to keep alive
      if (!self.timings.socket) {
        self.timings.socket = 0
      }
      if (!self.timings.lookup) {
        self.timings.lookup = self.timings.socket
      }
      if (!self.timings.connect) {
        self.timings.connect = self.timings.lookup
      }
      if (!self.timings.response) {
        self.timings.response = self.timings.connect
      }

      debug('elapsed time', self.timings.end)

      // elapsedTime includes all redirects
      self.elapsedTime += Math.round(self.timings.end)

      // NOTE: elapsedTime is deprecated in favor of .timings
      response.elapsedTime = self.elapsedTime

      // timings is just for the final fetch
      response.timings = self.timings

      // pre-calculate phase timings as well
      response.timingPhases = {
        wait: self.timings.socket,
        dns: self.timings.lookup - self.timings.socket,
        tcp: self.timings.connect - self.timings.lookup,
        firstByte: self.timings.response - self.timings.connect,
        download: self.timings.end - self.timings.response,
        total: self.timings.end
      }
    }
    debug('response end', self.uri.href, response.statusCode, response.headers)
  })

  if (self._aborted) {
    debug('aborted', self.uri.href)
    response.resume()
    return
  }

  self.response = response
  response.request = self
  response.toJSON = responseToJSON

  // XXX This is different on 0.10, because SSL is strict by default
  if (self.httpModule === https &&
    self.strictSSL && (!response.hasOwnProperty('socket') ||
    !response.socket.authorized)) {
    debug('strict ssl error', self.uri.href)
    var sslErr = response.hasOwnProperty('socket') ? response.socket.authorizationError : self.uri.href + ' does not support SSL'
    self.emit('error', new Error('SSL Error: ' + sslErr))
    return
  }

  // Save the original host before any redirect (if it changes, we need to
  // remove any authorization headers).  Also remember the case of the header
  // name because lots of broken servers expect Host instead of host and we
  // want the caller to be able to specify this.
  self.originalHost = self.getHeader('host')
  if (!self.originalHostHeaderName) {
    self.originalHostHeaderName = self.hasHeader('host')
  }
  if (self.setHost) {
    self.removeHeader('host')
  }
  self.clearTimeout()

  var targetCookieJar = (self._jar && self._jar.setCookie) ? self._jar : globalCookieJar
  var addCookie = function (cookie) {
    // set the cookie if it's domain in the href's domain.
    try {
      targetCookieJar.setCookie(cookie, self.uri.href, {ignoreError: true})
    } catch (e) {
      self.emit('error', e)
    }
  }

  response.caseless = caseless(response.headers)

  if (response.caseless.has('set-cookie') && (!self._disableCookies)) {
    var headerName = response.caseless.has('set-cookie')
    if (Array.isArray(response.headers[headerName])) {
      response.headers[headerName].forEach(addCookie)
    } else {
      addCookie(response.headers[headerName])
    }
  }

  if (self._redirect.onResponse(response)) {
    return // Ignore the rest of the response
  } else {
    // Be a good stream and emit end when the response is finished.
    // Hack to emit end on close because of a core bug that never fires end
    response.on('close', function () {
      if (!self._ended) {
        self.response.emit('end')
      }
    })

    response.once('end', function () {
      self._ended = true
    })

    var noBody = function (code) {
      return (
        self.method === 'HEAD' ||
        // Informational
        (code >= 100 && code < 200) ||
        // No Content
        code === 204 ||
        // Not Modified
        code === 304
      )
    }

    var responseContent
    if (self.gzip && !noBody(response.statusCode)) {
      var contentEncoding = response.headers['content-encoding'] || 'identity'
      contentEncoding = contentEncoding.trim().toLowerCase()

      // Be more lenient with decoding compressed responses, since (very rarely)
      // servers send slightly invalid gzip responses that are still accepted
      // by common browsers.
      // Always using Z_SYNC_FLUSH is what cURL does.
      var zlibOptions = {
        flush: zlib.Z_SYNC_FLUSH,
        finishFlush: zlib.Z_SYNC_FLUSH
      }

      if (contentEncoding === 'gzip') {
        responseContent = zlib.createGunzip(zlibOptions)
        response.pipe(responseContent)
      } else if (contentEncoding === 'deflate') {
        responseContent = zlib.createInflate(zlibOptions)
        response.pipe(responseContent)
      } else {
        // Since previous versions didn't check for Content-Encoding header,
        // ignore any invalid values to preserve backwards-compatibility
        if (contentEncoding !== 'identity') {
          debug('ignoring unrecognized Content-Encoding ' + contentEncoding)
        }
        responseContent = response
      }
    } else {
      responseContent = response
    }

    if (self.encoding) {
      if (self.dests.length !== 0) {
        console.error('Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.')
      } else {
        responseContent.setEncoding(self.encoding)
      }
    }

    if (self._paused) {
      responseContent.pause()
    }

    self.responseContent = responseContent

    self.emit('response', response)

    self.dests.forEach(function (dest) {
      self.pipeDest(dest)
    })

    responseContent.on('data', function (chunk) {
      if (self.timing && !self.responseStarted) {
        self.responseStartTime = (new Date()).getTime()

        // NOTE: responseStartTime is deprecated in favor of .timings
        response.responseStartTime = self.responseStartTime
      }
      self._destdata = true
      self.emit('data', chunk)
    })
    responseContent.once('end', function (chunk) {
      self.emit('end', chunk)
    })
    responseContent.on('error', function (error) {
      self.emit('error', error)
    })
    responseContent.on('close', function () { self.emit('close') })

    if (self.callback) {
      self.readResponseBody(response)
    } else { // if no callback
      self.on('end', function () {
        if (self._aborted) {
          debug('aborted', self.uri.href)
          return
        }
        self.emit('complete', response)
      })
    }
  }
  debug('finish init function', self.uri.href)
}

Request.prototype.readResponseBody = function (response) {
  var self = this
  debug("reading response's body")
  var buffers = []
  var bufferLength = 0
  var strings = []

  self.on('data', function (chunk) {
    if (!Buffer.isBuffer(chunk)) {
      strings.push(chunk)
    } else if (chunk.length) {
      bufferLength += chunk.length
      buffers.push(chunk)
    }
  })
  self.on('end', function () {
    debug('end event', self.uri.href)
    if (self._aborted) {
      debug('aborted', self.uri.href)
      // `buffer` is defined in the parent scope and used in a closure it exists for the life of the request.
      // This can lead to leaky behavior if the user retains a reference to the request object.
      buffers = []
      bufferLength = 0
      return
    }

    if (bufferLength) {
      debug('has body', self.uri.href, bufferLength)
      response.body = Buffer.concat(buffers, bufferLength)
      if (self.encoding !== null) {
        response.body = response.body.toString(self.encoding)
      }
      // `buffer` is defined in the parent scope and used in a closure it exists for the life of the Request.
      // This can lead to leaky behavior if the user retains a reference to the request object.
      buffers = []
      bufferLength = 0
    } else if (strings.length) {
      // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation.
      // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse().
      if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\uFEFF') {
        strings[0] = strings[0].substring(1)
      }
      response.body = strings.join('')
    }

    if (self._json) {
      try {
        response.body = JSON.parse(response.body, self._jsonReviver)
      } catch (e) {
        debug('invalid JSON received', self.uri.href)
      }
    }
    debug('emitting complete', self.uri.href)
    if (typeof response.body === 'undefined' && !self._json) {
      response.body = self.encoding === null ? Buffer.alloc(0) : ''
    }
    self.emit('complete', response, response.body)
  })
}

Request.prototype.abort = function () {
  var self = this
  self._aborted = true

  if (self.req) {
    self.req.abort()
  } else if (self.response) {
    self.response.destroy()
  }

  self.clearTimeout()
  self.emit('abort')
}

Request.prototype.pipeDest = function (dest) {
  var self = this
  var response = self.response
  // Called after the response is received
  if (dest.headers && !dest.headersSent) {
    if (response.caseless.has('content-type')) {
      var ctname = response.caseless.has('content-type')
      if (dest.setHeader) {
        dest.setHeader(ctname, response.headers[ctname])
      } else {
        dest.headers[ctname] = response.headers[ctname]
      }
    }

    if (response.caseless.has('content-length')) {
      var clname = response.caseless.has('content-length')
      if (dest.setHeader) {
        dest.setHeader(clname, response.headers[clname])
      } else {
        dest.headers[clname] = response.headers[clname]
      }
    }
  }
  if (dest.setHeader && !dest.headersSent) {
    for (var i in response.headers) {
      // If the response content is being decoded, the Content-Encoding header
      // of the response doesn't represent the piped content, so don't pass it.
      if (!self.gzip || i !== 'content-encoding') {
        dest.setHeader(i, response.headers[i])
      }
    }
    dest.statusCode = response.statusCode
  }
  if (self.pipefilter) {
    self.pipefilter(response, dest)
  }
}

Request.prototype.qs = function (q, clobber) {
  var self = this
  var base
  if (!clobber && self.uri.query) {
    base = self._qs.parse(self.uri.query)
  } else {
    base = {}
  }

  for (var i in q) {
    base[i] = q[i]
  }

  var qs = self._qs.stringify(base)

  if (qs === '') {
    return self
  }

  self.uri = url.parse(self.uri.href.split('?')[0] + '?' + qs)
  self.url = self.uri
  self.path = self.uri.path

  if (self.uri.host === 'unix') {
    self.enableUnixSocket()
  }

  return self
}
Request.prototype.form = function (form) {
  var self = this
  if (form) {
    if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) {
      self.setHeader('content-type', 'application/x-www-form-urlencoded')
    }
    self.body = (typeof form === 'string')
      ? self._qs.rfc3986(form.toString('utf8'))
      : self._qs.stringify(form).toString('utf8')
    return self
  }
  // create form-data object
  self._form = new FormData()
  self._form.on('error', function (err) {
    err.message = 'form-data: ' + err.message
    self.emit('error', err)
    self.abort()
  })
  return self._form
}
Request.prototype.multipart = function (multipart) {
  var self = this

  self._multipart.onRequest(multipart)

  if (!self._multipart.chunked) {
    self.body = self._multipart.body
  }

  return self
}
Request.prototype.json = function (val) {
  var self = this

  if (!self.hasHeader('accept')) {
    self.setHeader('accept', 'application/json')
  }

  if (typeof self.jsonReplacer === 'function') {
    self._jsonReplacer = self.jsonReplacer
  }

  self._json = true
  if (typeof val === 'boolean') {
    if (self.body !== undefined) {
      if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) {
        self.body = safeStringify(self.body, self._jsonReplacer)
      } else {
        self.body = self._qs.rfc3986(self.body)
      }
      if (!self.hasHeader('content-type')) {
        self.setHeader('content-type', 'application/json')
      }
    }
  } else {
    self.body = safeStringify(val, self._jsonReplacer)
    if (!self.hasHeader('content-type')) {
      self.setHeader('content-type', 'application/json')
    }
  }

  if (typeof self.jsonReviver === 'function') {
    self._jsonReviver = self.jsonReviver
  }

  return self
}
Request.prototype.getHeader = function (name, headers) {
  var self = this
  var result, re, match
  if (!headers) {
    headers = self.headers
  }
  Object.keys(headers).forEach(function (key) {
    if (key.length !== name.length) {
      return
    }
    re = new RegExp(name, 'i')
    match = key.match(re)
    if (match) {
      result = headers[key]
    }
  })
  return result
}
Request.prototype.enableUnixSocket = function () {
  // Get the socket & request paths from the URL
  var unixParts = this.uri.path.split(':')
  var host = unixParts[0]
  var path = unixParts[1]
  // Apply unix properties to request
  this.socketPath = host
  this.uri.pathname = path
  this.uri.path = path
  this.uri.host = host
  this.uri.hostname = host
  this.uri.isUnix = true
}

Request.prototype.auth = function (user, pass, sendImmediately, bearer) {
  var self = this

  self._auth.onRequest(user, pass, sendImmediately, bearer)

  return self
}
Request.prototype.aws = function (opts, now) {
  var self = this

  if (!now) {
    self._aws = opts
    return self
  }

  if (opts.sign_version === 4 || opts.sign_version === '4') {
    // use aws4
    var options = {
      host: self.uri.host,
      path: self.uri.path,
      method: self.method,
      headers: self.headers,
      body: self.body
    }
    if (opts.service) {
      options.service = opts.service
    }
    var signRes = aws4.sign(options, {
      accessKeyId: opts.key,
      secretAccessKey: opts.secret,
      sessionToken: opts.session
    })
    self.setHeader('authorization', signRes.headers.Authorization)
    self.setHeader('x-amz-date', signRes.headers['X-Amz-Date'])
    if (signRes.headers['X-Amz-Security-Token']) {
      self.setHeader('x-amz-security-token', signRes.headers['X-Amz-Security-Token'])
    }
  } else {
    // default: use aws-sign2
    var date = new Date()
    self.setHeader('date', date.toUTCString())
    var auth = {
      key: opts.key,
      secret: opts.secret,
      verb: self.method.toUpperCase(),
      date: date,
      contentType: self.getHeader('content-type') || '',
      md5: self.getHeader('content-md5') || '',
      amazonHeaders: aws2.canonicalizeHeaders(self.headers)
    }
    var path = self.uri.path
    if (opts.bucket && path) {
      auth.resource = '/' + opts.bucket + path
    } else if (opts.bucket && !path) {
      auth.resource = '/' + opts.bucket
    } else if (!opts.bucket && path) {
      auth.resource = path
    } else if (!opts.bucket && !path) {
      auth.resource = '/'
    }
    auth.resource = aws2.canonicalizeResource(auth.resource)
    self.setHeader('authorization', aws2.authorization(auth))
  }

  return self
}
Request.prototype.httpSignature = function (opts) {
  var self = this
  httpSignature.signRequest({
    getHeader: function (header) {
      return self.getHeader(header, self.headers)
    },
    setHeader: function (header, value) {
      self.setHeader(header, value)
    },
    method: self.method,
    path: self.path
  }, opts)
  debug('httpSignature authorization', self.getHeader('authorization'))

  return self
}
Request.prototype.hawk = function (opts) {
  var self = this
  self.setHeader('Authorization', hawk.header(self.uri, self.method, opts))
}
Request.prototype.oauth = function (_oauth) {
  var self = this

  self._oauth.onRequest(_oauth)

  return self
}

Request.prototype.jar = function (jar) {
  var self = this
  var cookies

  if (self._redirect.redirectsFollowed === 0) {
    self.originalCookieHeader = self.getHeader('cookie')
  }

  if (!jar) {
    // disable cookies
    cookies = false
    self._disableCookies = true
  } else {
    var targetCookieJar = jar.getCookieString ? jar : globalCookieJar
    var urihref = self.uri.href
    // fetch cookie in the Specified host
    if (targetCookieJar) {
      cookies = targetCookieJar.getCookieString(urihref)
    }
  }

  // if need cookie and cookie is not empty
  if (cookies && cookies.length) {
    if (self.originalCookieHeader) {
      // Don't overwrite existing Cookie header
      self.setHeader('cookie', self.originalCookieHeader + '; ' + cookies)
    } else {
      self.setHeader('cookie', cookies)
    }
  }
  self._jar = jar
  return self
}

// Stream API
Request.prototype.pipe = function (dest, opts) {
  var self = this

  if (self.response) {
    if (self._destdata) {
      self.emit('error', new Error('You cannot pipe after data has been emitted from the response.'))
    } else if (self._ended) {
      self.emit('error', new Error('You cannot pipe after the response has been ended.'))
    } else {
      stream.Stream.prototype.pipe.call(self, dest, opts)
      self.pipeDest(dest)
      return dest
    }
  } else {
    self.dests.push(dest)
    stream.Stream.prototype.pipe.call(self, dest, opts)
    return dest
  }
}
Request.prototype.write = function () {
  var self = this
  if (self._aborted) { return }

  if (!self._started) {
    self.start()
  }
  if (self.req) {
    return self.req.write.apply(self.req, arguments)
  }
}
Request.prototype.end = function (chunk) {
  var self = this
  if (self._aborted) { return }

  if (chunk) {
    self.write(chunk)
  }
  if (!self._started) {
    self.start()
  }
  if (self.req) {
    self.req.end()
  }
}
Request.prototype.pause = function () {
  var self = this
  if (!self.responseContent) {
    self._paused = true
  } else {
    self.responseContent.pause.apply(self.responseContent, arguments)
  }
}
Request.prototype.resume = function () {
  var self = this
  if (!self.responseContent) {
    self._paused = false
  } else {
    self.responseContent.resume.apply(self.responseContent, arguments)
  }
}
Request.prototype.destroy = function () {
  var self = this
  this.clearTimeout()
  if (!self._ended) {
    self.end()
  } else if (self.response) {
    self.response.destroy()
  }
}

Request.prototype.clearTimeout = function () {
  if (this.timeoutTimer) {
    clearTimeout(this.timeoutTimer)
    this.timeoutTimer = null
  }
}

Request.defaultProxyHeaderWhiteList =
  Tunnel.defaultProxyHeaderWhiteList.slice()

Request.defaultProxyHeaderExclusiveList =
  Tunnel.defaultProxyHeaderExclusiveList.slice()

// Exports

Request.prototype.toJSON = requestToJSON
module.exports = Request
'use strict'

var caseless = require('caseless')
var uuid = require('uuid/v4')
var helpers = require('./helpers')

var md5 = helpers.md5
var toBase64 = helpers.toBase64

function Auth (request) {
  // define all public properties here
  this.request = request
  this.hasAuth = false
  this.sentAuth = false
  this.bearerToken = null
  this.user = null
  this.pass = null
}

Auth.prototype.basic = function (user, pass, sendImmediately) {
  var self = this
  if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) {
    self.request.emit('error', new Error('auth() received invalid user or password'))
  }
  self.user = user
  self.pass = pass
  self.hasAuth = true
  var header = user + ':' + (pass || '')
  if (sendImmediately || typeof sendImmediately === 'undefined') {
    var authHeader = 'Basic ' + toBase64(header)
    self.sentAuth = true
    return authHeader
  }
}

Auth.prototype.bearer = function (bearer, sendImmediately) {
  var self = this
  self.bearerToken = bearer
  self.hasAuth = true
  if (sendImmediately || typeof sendImmediately === 'undefined') {
    if (typeof bearer === 'function') {
      bearer = bearer()
    }
    var authHeader = 'Bearer ' + (bearer || '')
    self.sentAuth = true
    return authHeader
  }
}

Auth.prototype.digest = function (method, path, authHeader) {
  // TODO: More complete implementation of RFC 2617.
  //   - handle challenge.domain
  //   - support qop="auth-int" only
  //   - handle Authentication-Info (not necessarily?)
  //   - check challenge.stale (not necessarily?)
  //   - increase nc (not necessarily?)
  // For reference:
  // http://tools.ietf.org/html/rfc2617#section-3
  // https://github.com/bagder/curl/blob/master/lib/http_digest.c

  var self = this

  var challenge = {}
  var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi
  while (true) {
    var match = re.exec(authHeader)
    if (!match) {
      break
    }
    challenge[match[1]] = match[2] || match[3]
  }

  /**
   * RFC 2617: handle both MD5 and MD5-sess algorithms.
   *
   * If the algorithm directive's value is "MD5" or unspecified, then HA1 is
   *   HA1=MD5(username:realm:password)
   * If the algorithm directive's value is "MD5-sess", then HA1 is
   *   HA1=MD5(MD5(username:realm:password):nonce:cnonce)
   */
  var ha1Compute = function (algorithm, user, realm, pass, nonce, cnonce) {
    var ha1 = md5(user + ':' + realm + ':' + pass)
    if (algorithm && algorithm.toLowerCase() === 'md5-sess') {
      return md5(ha1 + ':' + nonce + ':' + cnonce)
    } else {
      return ha1
    }
  }

  var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && 'auth'
  var nc = qop && '00000001'
  var cnonce = qop && uuid().replace(/-/g, '')
  var ha1 = ha1Compute(challenge.algorithm, self.user, challenge.realm, self.pass, challenge.nonce, cnonce)
  var ha2 = md5(method + ':' + path)
  var digestResponse = qop
    ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2)
    : md5(ha1 + ':' + challenge.nonce + ':' + ha2)
  var authValues = {
    username: self.user,
    realm: challenge.realm,
    nonce: challenge.nonce,
    uri: path,
    qop: qop,
    response: digestResponse,
    nc: nc,
    cnonce: cnonce,
    algorithm: challenge.algorithm,
    opaque: challenge.opaque
  }

  authHeader = []
  for (var k in authValues) {
    if (authValues[k]) {
      if (k === 'qop' || k === 'nc' || k === 'algorithm') {
        authHeader.push(k + '=' + authValues[k])
      } else {
        authHeader.push(k + '="' + authValues[k] + '"')
      }
    }
  }
  authHeader = 'Digest ' + authHeader.join(', ')
  self.sentAuth = true
  return authHeader
}

Auth.prototype.onRequest = function (user, pass, sendImmediately, bearer) {
  var self = this
  var request = self.request

  var authHeader
  if (bearer === undefined && user === undefined) {
    self.request.emit('error', new Error('no auth mechanism defined'))
  } else if (bearer !== undefined) {
    authHeader = self.bearer(bearer, sendImmediately)
  } else {
    authHeader = self.basic(user, pass, sendImmediately)
  }
  if (authHeader) {
    request.setHeader('authorization', authHeader)
  }
}

Auth.prototype.onResponse = function (response) {
  var self = this
  var request = self.request

  if (!self.hasAuth || self.sentAuth) { return null }

  var c = caseless(response.headers)

  var authHeader = c.get('www-authenticate')
  var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase()
  request.debug('reauth', authVerb)

  switch (authVerb) {
    case 'basic':
      return self.basic(self.user, self.pass, true)

    case 'bearer':
      return self.bearer(self.bearerToken, true)

    case 'digest':
      return self.digest(request.method, request.path, authHeader)
  }
}

exports.Auth = Auth
'use strict'

var tough = require('tough-cookie')

var Cookie = tough.Cookie
var CookieJar = tough.CookieJar

exports.parse = function (str) {
  if (str && str.uri) {
    str = str.uri
  }
  if (typeof str !== 'string') {
    throw new Error('The cookie function only accepts STRING as param')
  }
  return Cookie.parse(str, {loose: true})
}

// Adapt the sometimes-Async api of tough.CookieJar to our requirements
function RequestJar (store) {
  var self = this
  self._jar = new CookieJar(store, {looseMode: true})
}
RequestJar.prototype.setCookie = function (cookieOrStr, uri, options) {
  var self = this
  return self._jar.setCookieSync(cookieOrStr, uri, options || {})
}
RequestJar.prototype.getCookieString = function (uri) {
  var self = this
  return self._jar.getCookieStringSync(uri)
}
RequestJar.prototype.getCookies = function (uri) {
  var self = this
  return self._jar.getCookiesSync(uri)
}

exports.jar = function (store) {
  return new RequestJar(store)
}
'use strict'

function formatHostname (hostname) {
  // canonicalize the hostname, so that 'oogle.com' won't match 'google.com'
  return hostname.replace(/^\.*/, '.').toLowerCase()
}

function parseNoProxyZone (zone) {
  zone = zone.trim().toLowerCase()

  var zoneParts = zone.split(':', 2)
  var zoneHost = formatHostname(zoneParts[0])
  var zonePort = zoneParts[1]
  var hasPort = zone.indexOf(':') > -1

  return {hostname: zoneHost, port: zonePort, hasPort: hasPort}
}

function uriInNoProxy (uri, noProxy) {
  var port = uri.port || (uri.protocol === 'https:' ? '443' : '80')
  var hostname = formatHostname(uri.hostname)
  var noProxyList = noProxy.split(',')

  // iterate through the noProxyList until it finds a match.
  return noProxyList.map(parseNoProxyZone).some(function (noProxyZone) {
    var isMatchedAt = hostname.indexOf(noProxyZone.hostname)
    var hostnameMatched = (
      isMatchedAt > -1 &&
        (isMatchedAt === hostname.length - noProxyZone.hostname.length)
    )

    if (noProxyZone.hasPort) {
      return (port === noProxyZone.port) && hostnameMatched
    }

    return hostnameMatched
  })
}

function getProxyFromURI (uri) {
  // Decide the proper request proxy to use based on the request URI object and the
  // environmental variables (NO_PROXY, HTTP_PROXY, etc.)
  // respect NO_PROXY environment variables (see: https://lynx.invisible-island.net/lynx2.8.7/breakout/lynx_help/keystrokes/environments.html)

  var noProxy = process.env.NO_PROXY || process.env.no_proxy || ''

  // if the noProxy is a wildcard then return null

  if (noProxy === '*') {
    return null
  }

  // if the noProxy is not empty and the uri is found return null

  if (noProxy !== '' && uriInNoProxy(uri, noProxy)) {
    return null
  }

  // Check for HTTP or HTTPS Proxy in environment Else default to null

  if (uri.protocol === 'http:') {
    return process.env.HTTP_PROXY ||
      process.env.http_proxy || null
  }

  if (uri.protocol === 'https:') {
    return process.env.HTTPS_PROXY ||
      process.env.https_proxy ||
      process.env.HTTP_PROXY ||
      process.env.http_proxy || null
  }

  // if none of that works, return null
  // (What uri protocol are you using then?)

  return null
}

module.exports = getProxyFromURI
'use strict'

var fs = require('fs')
var qs = require('querystring')
var validate = require('har-validator')
var extend = require('extend')

function Har (request) {
  this.request = request
}

Har.prototype.reducer = function (obj, pair) {
  // new property ?
  if (obj[pair.name] === undefined) {
    obj[pair.name] = pair.value
    return obj
  }

  // existing? convert to array
  var arr = [
    obj[pair.name],
    pair.value
  ]

  obj[pair.name] = arr

  return obj
}

Har.prototype.prep = function (data) {
  // construct utility properties
  data.queryObj = {}
  data.headersObj = {}
  data.postData.jsonObj = false
  data.postData.paramsObj = false

  // construct query objects
  if (data.queryString && data.queryString.length) {
    data.queryObj = data.queryString.reduce(this.reducer, {})
  }

  // construct headers objects
  if (data.headers && data.headers.length) {
    // loweCase header keys
    data.headersObj = data.headers.reduceRight(function (headers, header) {
      headers[header.name] = header.value
      return headers
    }, {})
  }

  // construct Cookie header
  if (data.cookies && data.cookies.length) {
    var cookies = data.cookies.map(function (cookie) {
      return cookie.name + '=' + cookie.value
    })

    if (cookies.length) {
      data.headersObj.cookie = cookies.join('; ')
    }
  }

  // prep body
  function some (arr) {
    return arr.some(function (type) {
      return data.postData.mimeType.indexOf(type) === 0
    })
  }

  if (some([
    'multipart/mixed',
    'multipart/related',
    'multipart/form-data',
    'multipart/alternative'])) {
    // reset values
    data.postData.mimeType = 'multipart/form-data'
  } else if (some([
    'application/x-www-form-urlencoded'])) {
    if (!data.postData.params) {
      data.postData.text = ''
    } else {
      data.postData.paramsObj = data.postData.params.reduce(this.reducer, {})

      // always overwrite
      data.postData.text = qs.stringify(data.postData.paramsObj)
    }
  } else if (some([
    'text/json',
    'text/x-json',
    'application/json',
    'application/x-json'])) {
    data.postData.mimeType = 'application/json'

    if (data.postData.text) {
      try {
        data.postData.jsonObj = JSON.parse(data.postData.text)
      } catch (e) {
        this.request.debug(e)

        // force back to text/plain
        data.postData.mimeType = 'text/plain'
      }
    }
  }

  return data
}

Har.prototype.options = function (options) {
  // skip if no har property defined
  if (!options.har) {
    return options
  }

  var har = {}
  extend(har, options.har)

  // only process the first entry
  if (har.log && har.log.entries) {
    har = har.log.entries[0]
  }

  // add optional properties to make validation successful
  har.url = har.url || options.url || options.uri || options.baseUrl || '/'
  har.httpVersion = har.httpVersion || 'HTTP/1.1'
  har.queryString = har.queryString || []
  har.headers = har.headers || []
  har.cookies = har.cookies || []
  har.postData = har.postData || {}
  har.postData.mimeType = har.postData.mimeType || 'application/octet-stream'

  har.bodySize = 0
  har.headersSize = 0
  har.postData.size = 0

  if (!validate.request(har)) {
    return options
  }

  // clean up and get some utility properties
  var req = this.prep(har)

  // construct new options
  if (req.url) {
    options.url = req.url
  }

  if (req.method) {
    options.method = req.method
  }

  if (Object.keys(req.queryObj).length) {
    options.qs = req.queryObj
  }

  if (Object.keys(req.headersObj).length) {
    options.headers = req.headersObj
  }

  function test (type) {
    return req.postData.mimeType.indexOf(type) === 0
  }
  if (test('application/x-www-form-urlencoded')) {
    options.form = req.postData.paramsObj
  } else if (test('application/json')) {
    if (req.postData.jsonObj) {
      options.body = req.postData.jsonObj
      options.json = true
    }
  } else if (test('multipart/form-data')) {
    options.formData = {}

    req.postData.params.forEach(function (param) {
      var attachment = {}

      if (!param.fileName && !param.contentType) {
        options.formData[param.name] = param.value
        return
      }

      // attempt to read from disk!
      if (param.fileName && !param.value) {
        attachment.value = fs.createReadStream(param.fileName)
      } else if (param.value) {
        attachment.value = param.value
      }

      if (param.fileName) {
        attachment.options = {
          filename: param.fileName,
          contentType: param.contentType ? param.contentType : null
        }
      }

      options.formData[param.name] = attachment
    })
  } else {
    if (req.postData.text) {
      options.body = req.postData.text
    }
  }

  return options
}

exports.Har = Har
'use strict'

var crypto = require('crypto')

function randomString (size) {
  var bits = (size + 1) * 6
  var buffer = crypto.randomBytes(Math.ceil(bits / 8))
  var string = buffer.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '')
  return string.slice(0, size)
}

function calculatePayloadHash (payload, algorithm, contentType) {
  var hash = crypto.createHash(algorithm)
  hash.update('hawk.1.payload\n')
  hash.update((contentType ? contentType.split(';')[0].trim().toLowerCase() : '') + '\n')
  hash.update(payload || '')
  hash.update('\n')
  return hash.digest('base64')
}

exports.calculateMac = function (credentials, opts) {
  var normalized = 'hawk.1.header\n' +
    opts.ts + '\n' +
    opts.nonce + '\n' +
    (opts.method || '').toUpperCase() + '\n' +
    opts.resource + '\n' +
    opts.host.toLowerCase() + '\n' +
    opts.port + '\n' +
    (opts.hash || '') + '\n'

  if (opts.ext) {
    normalized = normalized + opts.ext.replace('\\', '\\\\').replace('\n', '\\n')
  }

  normalized = normalized + '\n'

  if (opts.app) {
    normalized = normalized + opts.app + '\n' + (opts.dlg || '') + '\n'
  }

  var hmac = crypto.createHmac(credentials.algorithm, credentials.key).update(normalized)
  var digest = hmac.digest('base64')
  return digest
}

exports.header = function (uri, method, opts) {
  var timestamp = opts.timestamp || Math.floor((Date.now() + (opts.localtimeOffsetMsec || 0)) / 1000)
  var credentials = opts.credentials
  if (!credentials || !credentials.id || !credentials.key || !credentials.algorithm) {
    return ''
  }

  if (['sha1', 'sha256'].indexOf(credentials.algorithm) === -1) {
    return ''
  }

  var artifacts = {
    ts: timestamp,
    nonce: opts.nonce || randomString(6),
    method: method,
    resource: uri.pathname + (uri.search || ''),
    host: uri.hostname,
    port: uri.port || (uri.protocol === 'http:' ? 80 : 443),
    hash: opts.hash,
    ext: opts.ext,
    app: opts.app,
    dlg: opts.dlg
  }

  if (!artifacts.hash && (opts.payload || opts.payload === '')) {
    artifacts.hash = calculatePayloadHash(opts.payload, credentials.algorithm, opts.contentType)
  }

  var mac = exports.calculateMac(credentials, artifacts)

  var hasExt = artifacts.ext !== null && artifacts.ext !== undefined && artifacts.ext !== ''
  var header = 'Hawk id="' + credentials.id +
    '", ts="' + artifacts.ts +
    '", nonce="' + artifacts.nonce +
    (artifacts.hash ? '", hash="' + artifacts.hash : '') +
    (hasExt ? '", ext="' + artifacts.ext.replace(/\\/g, '\\\\').replace(/"/g, '\\"') : '') +
    '", mac="' + mac + '"'

  if (artifacts.app) {
    header = header + ', app="' + artifacts.app + (artifacts.dlg ? '", dlg="' + artifacts.dlg : '') + '"'
  }

  return header
}
'use strict'

var jsonSafeStringify = require('json-stringify-safe')
var crypto = require('crypto')
var Buffer = require('safe-buffer').Buffer

var defer = typeof setImmediate === 'undefined'
  ? process.nextTick
  : setImmediate

function paramsHaveRequestBody (params) {
  return (
    params.body ||
    params.requestBodyStream ||
    (params.json && typeof params.json !== 'boolean') ||
    params.multipart
  )
}

function safeStringify (obj, replacer) {
  var ret
  try {
    ret = JSON.stringify(obj, replacer)
  } catch (e) {
    ret = jsonSafeStringify(obj, replacer)
  }
  return ret
}

function md5 (str) {
  return crypto.createHash('md5').update(str).digest('hex')
}

function isReadStream (rs) {
  return rs.readable && rs.path && rs.mode
}

function toBase64 (str) {
  return Buffer.from(str || '', 'utf8').toString('base64')
}

function copy (obj) {
  var o = {}
  Object.keys(obj).forEach(function (i) {
    o[i] = obj[i]
  })
  return o
}

function version () {
  var numbers = process.version.replace('v', '').split('.')
  return {
    major: parseInt(numbers[0], 10),
    minor: parseInt(numbers[1], 10),
    patch: parseInt(numbers[2], 10)
  }
}

exports.paramsHaveRequestBody = paramsHaveRequestBody
exports.safeStringify = safeStringify
exports.md5 = md5
exports.isReadStream = isReadStream
exports.toBase64 = toBase64
exports.copy = copy
exports.version = version
exports.defer = defer
'use strict'

var uuid = require('uuid/v4')
var CombinedStream = require('combined-stream')
var isstream = require('isstream')
var Buffer = require('safe-buffer').Buffer

function Multipart (request) {
  this.request = request
  this.boundary = uuid()
  this.chunked = false
  this.body = null
}

Multipart.prototype.isChunked = function (options) {
  var self = this
  var chunked = false
  var parts = options.data || options

  if (!parts.forEach) {
    self.request.emit('error', new Error('Argument error, options.multipart.'))
  }

  if (options.chunked !== undefined) {
    chunked = options.chunked
  }

  if (self.request.getHeader('transfer-encoding') === 'chunked') {
    chunked = true
  }

  if (!chunked) {
    parts.forEach(function (part) {
      if (typeof part.body === 'undefined') {
        self.request.emit('error', new Error('Body attribute missing in multipart.'))
      }
      if (isstream(part.body)) {
        chunked = true
      }
    })
  }

  return chunked
}

Multipart.prototype.setHeaders = function (chunked) {
  var self = this

  if (chunked && !self.request.hasHeader('transfer-encoding')) {
    self.request.setHeader('transfer-encoding', 'chunked')
  }

  var header = self.request.getHeader('content-type')

  if (!header || header.indexOf('multipart') === -1) {
    self.request.setHeader('content-type', 'multipart/related; boundary=' + self.boundary)
  } else {
    if (header.indexOf('boundary') !== -1) {
      self.boundary = header.replace(/.*boundary=([^\s;]+).*/, '$1')
    } else {
      self.request.setHeader('content-type', header + '; boundary=' + self.boundary)
    }
  }
}

Multipart.prototype.build = function (parts, chunked) {
  var self = this
  var body = chunked ? new CombinedStream() : []

  function add (part) {
    if (typeof part === 'number') {
      part = part.toString()
    }
    return chunked ? body.append(part) : body.push(Buffer.from(part))
  }

  if (self.request.preambleCRLF) {
    add('\r\n')
  }

  parts.forEach(function (part) {
    var preamble = '--' + self.boundary + '\r\n'
    Object.keys(part).forEach(function (key) {
      if (key === 'body') { return }
      preamble += key + ': ' + part[key] + '\r\n'
    })
    preamble += '\r\n'
    add(preamble)
    add(part.body)
    add('\r\n')
  })
  add('--' + self.boundary + '--')

  if (self.request.postambleCRLF) {
    add('\r\n')
  }

  return body
}

Multipart.prototype.onRequest = function (options) {
  var self = this

  var chunked = self.isChunked(options)
  var parts = options.data || options

  self.setHeaders(chunked)
  self.chunked = chunked
  self.body = self.build(parts, chunked)
}

exports.Multipart = Multipart
'use strict'

var url = require('url')
var qs = require('qs')
var caseless = require('caseless')
var uuid = require('uuid/v4')
var oauth = require('oauth-sign')
var crypto = require('crypto')
var Buffer = require('safe-buffer').Buffer

function OAuth (request) {
  this.request = request
  this.params = null
}

OAuth.prototype.buildParams = function (_oauth, uri, method, query, form, qsLib) {
  var oa = {}
  for (var i in _oauth) {
    oa['oauth_' + i] = _oauth[i]
  }
  if (!oa.oauth_version) {
    oa.oauth_version = '1.0'
  }
  if (!oa.oauth_timestamp) {
    oa.oauth_timestamp = Math.floor(Date.now() / 1000).toString()
  }
  if (!oa.oauth_nonce) {
    oa.oauth_nonce = uuid().replace(/-/g, '')
  }
  if (!oa.oauth_signature_method) {
    oa.oauth_signature_method = 'HMAC-SHA1'
  }

  var consumer_secret_or_private_key = oa.oauth_consumer_secret || oa.oauth_private_key // eslint-disable-line camelcase
  delete oa.oauth_consumer_secret
  delete oa.oauth_private_key

  var token_secret = oa.oauth_token_secret // eslint-disable-line camelcase
  delete oa.oauth_token_secret

  var realm = oa.oauth_realm
  delete oa.oauth_realm
  delete oa.oauth_transport_method

  var baseurl = uri.protocol + '//' + uri.host + uri.pathname
  var params = qsLib.parse([].concat(query, form, qsLib.stringify(oa)).join('&'))

  oa.oauth_signature = oauth.sign(
    oa.oauth_signature_method,
    method,
    baseurl,
    params,
    consumer_secret_or_private_key, // eslint-disable-line camelcase
    token_secret // eslint-disable-line camelcase
  )

  if (realm) {
    oa.realm = realm
  }

  return oa
}

OAuth.prototype.buildBodyHash = function (_oauth, body) {
  if (['HMAC-SHA1', 'RSA-SHA1'].indexOf(_oauth.signature_method || 'HMAC-SHA1') < 0) {
    this.request.emit('error', new Error('oauth: ' + _oauth.signature_method +
      ' signature_method not supported with body_hash signing.'))
  }

  var shasum = crypto.createHash('sha1')
  shasum.update(body || '')
  var sha1 = shasum.digest('hex')

  return Buffer.from(sha1, 'hex').toString('base64')
}

OAuth.prototype.concatParams = function (oa, sep, wrap) {
  wrap = wrap || ''

  var params = Object.keys(oa).filter(function (i) {
    return i !== 'realm' && i !== 'oauth_signature'
  }).sort()

  if (oa.realm) {
    params.splice(0, 0, 'realm')
  }
  params.push('oauth_signature')

  return params.map(function (i) {
    return i + '=' + wrap + oauth.rfc3986(oa[i]) + wrap
  }).join(sep)
}

OAuth.prototype.onRequest = function (_oauth) {
  var self = this
  self.params = _oauth

  var uri = self.request.uri || {}
  var method = self.request.method || ''
  var headers = caseless(self.request.headers)
  var body = self.request.body || ''
  var qsLib = self.request.qsLib || qs

  var form
  var query
  var contentType = headers.get('content-type') || ''
  var formContentType = 'application/x-www-form-urlencoded'
  var transport = _oauth.transport_method || 'header'

  if (contentType.slice(0, formContentType.length) === formContentType) {
    contentType = formContentType
    form = body
  }
  if (uri.query) {
    query = uri.query
  }
  if (transport === 'body' && (method !== 'POST' || contentType !== formContentType)) {
    self.request.emit('error', new Error('oauth: transport_method of body requires POST ' +
      'and content-type ' + formContentType))
  }

  if (!form && typeof _oauth.body_hash === 'boolean') {
    _oauth.body_hash = self.buildBodyHash(_oauth, self.request.body.toString())
  }

  var oa = self.buildParams(_oauth, uri, method, query, form, qsLib)

  switch (transport) {
    case 'header':
      self.request.setHeader('Authorization', 'OAuth ' + self.concatParams(oa, ',', '"'))
      break

    case 'query':
      var href = self.request.uri.href += (query ? '&' : '?') + self.concatParams(oa, '&')
      self.request.uri = url.parse(href)
      self.request.path = self.request.uri.path
      break

    case 'body':
      self.request.body = (form ? form + '&' : '') + self.concatParams(oa, '&')
      break

    default:
      self.request.emit('error', new Error('oauth: transport_method invalid'))
  }
}

exports.OAuth = OAuth
'use strict'

var qs = require('qs')
var querystring = require('querystring')

function Querystring (request) {
  this.request = request
  this.lib = null
  this.useQuerystring = null
  this.parseOptions = null
  this.stringifyOptions = null
}

Querystring.prototype.init = function (options) {
  if (this.lib) { return }

  this.useQuerystring = options.useQuerystring
  this.lib = (this.useQuerystring ? querystring : qs)

  this.parseOptions = options.qsParseOptions || {}
  this.stringifyOptions = options.qsStringifyOptions || {}
}

Querystring.prototype.stringify = function (obj) {
  return (this.useQuerystring)
    ? this.rfc3986(this.lib.stringify(obj,
      this.stringifyOptions.sep || null,
      this.stringifyOptions.eq || null,
      this.stringifyOptions))
    : this.lib.stringify(obj, this.stringifyOptions)
}

Querystring.prototype.parse = function (str) {
  return (this.useQuerystring)
    ? this.lib.parse(str,
      this.parseOptions.sep || null,
      this.parseOptions.eq || null,
      this.parseOptions)
    : this.lib.parse(str, this.parseOptions)
}

Querystring.prototype.rfc3986 = function (str) {
  return str.replace(/[!'()*]/g, function (c) {
    return '%' + c.charCodeAt(0).toString(16).toUpperCase()
  })
}

Querystring.prototype.unescape = querystring.unescape

exports.Querystring = Querystring
'use strict'

var url = require('url')
var isUrl = /^https?:/

function Redirect (request) {
  this.request = request
  this.followRedirect = true
  this.followRedirects = true
  this.followAllRedirects = false
  this.followOriginalHttpMethod = false
  this.allowRedirect = function () { return true }
  this.maxRedirects = 10
  this.redirects = []
  this.redirectsFollowed = 0
  this.removeRefererHeader = false
}

Redirect.prototype.onRequest = function (options) {
  var self = this

  if (options.maxRedirects !== undefined) {
    self.maxRedirects = options.maxRedirects
  }
  if (typeof options.followRedirect === 'function') {
    self.allowRedirect = options.followRedirect
  }
  if (options.followRedirect !== undefined) {
    self.followRedirects = !!options.followRedirect
  }
  if (options.followAllRedirects !== undefined) {
    self.followAllRedirects = options.followAllRedirects
  }
  if (self.followRedirects || self.followAllRedirects) {
    self.redirects = self.redirects || []
  }
  if (options.removeRefererHeader !== undefined) {
    self.removeRefererHeader = options.removeRefererHeader
  }
  if (options.followOriginalHttpMethod !== undefined) {
    self.followOriginalHttpMethod = options.followOriginalHttpMethod
  }
}

Redirect.prototype.redirectTo = function (response) {
  var self = this
  var request = self.request

  var redirectTo = null
  if (response.statusCode >= 300 && response.statusCode < 400 && response.caseless.has('location')) {
    var location = response.caseless.get('location')
    request.debug('redirect', location)

    if (self.followAllRedirects) {
      redirectTo = location
    } else if (self.followRedirects) {
      switch (request.method) {
        case 'PATCH':
        case 'PUT':
        case 'POST':
        case 'DELETE':
          // Do not follow redirects
          break
        default:
          redirectTo = location
          break
      }
    }
  } else if (response.statusCode === 401) {
    var authHeader = request._auth.onResponse(response)
    if (authHeader) {
      request.setHeader('authorization', authHeader)
      redirectTo = request.uri
    }
  }
  return redirectTo
}

Redirect.prototype.onResponse = function (response) {
  var self = this
  var request = self.request

  var redirectTo = self.redirectTo(response)
  if (!redirectTo || !self.allowRedirect.call(request, response)) {
    return false
  }

  request.debug('redirect to', redirectTo)

  // ignore any potential response body.  it cannot possibly be useful
  // to us at this point.
  // response.resume should be defined, but check anyway before calling. Workaround for browserify.
  if (response.resume) {
    response.resume()
  }

  if (self.redirectsFollowed >= self.maxRedirects) {
    request.emit('error', new Error('Exceeded maxRedirects. Probably stuck in a redirect loop ' + request.uri.href))
    return false
  }
  self.redirectsFollowed += 1

  if (!isUrl.test(redirectTo)) {
    redirectTo = url.resolve(request.uri.href, redirectTo)
  }

  var uriPrev = request.uri
  request.uri = url.parse(redirectTo)

  // handle the case where we change protocol from https to http or vice versa
  if (request.uri.protocol !== uriPrev.protocol) {
    delete request.agent
  }

  self.redirects.push({ statusCode: response.statusCode, redirectUri: redirectTo })

  if (self.followAllRedirects && request.method !== 'HEAD' &&
    response.statusCode !== 401 && response.statusCode !== 307) {
    request.method = self.followOriginalHttpMethod ? request.method : 'GET'
  }
  // request.method = 'GET' // Force all redirects to use GET || commented out fixes #215
  delete request.src
  delete request.req
  delete request._started
  if (response.statusCode !== 401 && response.statusCode !== 307) {
    // Remove parameters from the previous response, unless this is the second request
    // for a server that requires digest authentication.
    delete request.body
    delete request._form
    if (request.headers) {
      request.removeHeader('host')
      request.removeHeader('content-type')
      request.removeHeader('content-length')
      if (request.uri.hostname !== request.originalHost.split(':')[0]) {
        // Remove authorization if changing hostnames (but not if just
        // changing ports or protocols).  This matches the behavior of curl:
        // https://github.com/bagder/curl/blob/6beb0eee/lib/http.c#L710
        request.removeHeader('authorization')
      }
    }
  }

  if (!self.removeRefererHeader) {
    request.setHeader('referer', uriPrev.href)
  }

  request.emit('redirect')

  request.init()

  return true
}

exports.Redirect = Redirect
'use strict'

var url = require('url')
var tunnel = require('tunnel-agent')

var defaultProxyHeaderWhiteList = [
  'accept',
  'accept-charset',
  'accept-encoding',
  'accept-language',
  'accept-ranges',
  'cache-control',
  'content-encoding',
  'content-language',
  'content-location',
  'content-md5',
  'content-range',
  'content-type',
  'connection',
  'date',
  'expect',
  'max-forwards',
  'pragma',
  'referer',
  'te',
  'user-agent',
  'via'
]

var defaultProxyHeaderExclusiveList = [
  'proxy-authorization'
]

function constructProxyHost (uriObject) {
  var port = uriObject.port
  var protocol = uriObject.protocol
  var proxyHost = uriObject.hostname + ':'

  if (port) {
    proxyHost += port
  } else if (protocol === 'https:') {
    proxyHost += '443'
  } else {
    proxyHost += '80'
  }

  return proxyHost
}

function constructProxyHeaderWhiteList (headers, proxyHeaderWhiteList) {
  var whiteList = proxyHeaderWhiteList
    .reduce(function (set, header) {
      set[header.toLowerCase()] = true
      return set
    }, {})

  return Object.keys(headers)
    .filter(function (header) {
      return whiteList[header.toLowerCase()]
    })
    .reduce(function (set, header) {
      set[header] = headers[header]
      return set
    }, {})
}

function constructTunnelOptions (request, proxyHeaders) {
  var proxy = request.proxy

  var tunnelOptions = {
    proxy: {
      host: proxy.hostname,
      port: +proxy.port,
      proxyAuth: proxy.auth,
      headers: proxyHeaders
    },
    headers: request.headers,
    ca: request.ca,
    cert: request.cert,
    key: request.key,
    passphrase: request.passphrase,
    pfx: request.pfx,
    ciphers: request.ciphers,
    rejectUnauthorized: request.rejectUnauthorized,
    secureOptions: request.secureOptions,
    secureProtocol: request.secureProtocol
  }

  return tunnelOptions
}

function constructTunnelFnName (uri, proxy) {
  var uriProtocol = (uri.protocol === 'https:' ? 'https' : 'http')
  var proxyProtocol = (proxy.protocol === 'https:' ? 'Https' : 'Http')
  return [uriProtocol, proxyProtocol].join('Over')
}

function getTunnelFn (request) {
  var uri = request.uri
  var proxy = request.proxy
  var tunnelFnName = constructTunnelFnName(uri, proxy)
  return tunnel[tunnelFnName]
}

function Tunnel (request) {
  this.request = request
  this.proxyHeaderWhiteList = defaultProxyHeaderWhiteList
  this.proxyHeaderExclusiveList = []
  if (typeof request.tunnel !== 'undefined') {
    this.tunnelOverride = request.tunnel
  }
}

Tunnel.prototype.isEnabled = function () {
  var self = this
  var request = self.request
    // Tunnel HTTPS by default. Allow the user to override this setting.

  // If self.tunnelOverride is set (the user specified a value), use it.
  if (typeof self.tunnelOverride !== 'undefined') {
    return self.tunnelOverride
  }

  // If the destination is HTTPS, tunnel.
  if (request.uri.protocol === 'https:') {
    return true
  }

  // Otherwise, do not use tunnel.
  return false
}

Tunnel.prototype.setup = function (options) {
  var self = this
  var request = self.request

  options = options || {}

  if (typeof request.proxy === 'string') {
    request.proxy = url.parse(request.proxy)
  }

  if (!request.proxy || !request.tunnel) {
    return false
  }

  // Setup Proxy Header Exclusive List and White List
  if (options.proxyHeaderWhiteList) {
    self.proxyHeaderWhiteList = options.proxyHeaderWhiteList
  }
  if (options.proxyHeaderExclusiveList) {
    self.proxyHeaderExclusiveList = options.proxyHeaderExclusiveList
  }

  var proxyHeaderExclusiveList = self.proxyHeaderExclusiveList.concat(defaultProxyHeaderExclusiveList)
  var proxyHeaderWhiteList = self.proxyHeaderWhiteList.concat(proxyHeaderExclusiveList)

  // Setup Proxy Headers and Proxy Headers Host
  // Only send the Proxy White Listed Header names
  var proxyHeaders = constructProxyHeaderWhiteList(request.headers, proxyHeaderWhiteList)
  proxyHeaders.host = constructProxyHost(request.uri)

  proxyHeaderExclusiveList.forEach(request.removeHeader, request)

  // Set Agent from Tunnel Data
  var tunnelFn = getTunnelFn(request)
  var tunnelOptions = constructTunnelOptions(request, proxyHeaders)
  request.agent = tunnelFn(tunnelOptions)

  return true
}

Tunnel.defaultProxyHeaderWhiteList = defaultProxyHeaderWhiteList
Tunnel.defaultProxyHeaderExclusiveList = defaultProxyHeaderExclusiveList
exports.Tunnel = Tunnel
The MIT License (MIT)

Copyright (c) 2011 Troy Goode <troygoode@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# require-directory

Recursively iterates over specified directory, `require()`'ing each file, and returning a nested hash structure containing those modules.

**[Follow me (@troygoode) on Twitter!](https://twitter.com/intent/user?screen_name=troygoode)**

[![NPM](https://nodei.co/npm/require-directory.png?downloads=true&stars=true)](https://nodei.co/npm/require-directory/)

[![build status](https://secure.travis-ci.org/troygoode/node-require-directory.png)](http://travis-ci.org/troygoode/node-require-directory)

## How To Use

### Installation (via [npm](https://npmjs.org/package/require-directory))

```bash
$ npm install require-directory
```

### Usage

A common pattern in node.js is to include an index file which creates a hash of the files in its current directory. Given a directory structure like so:

* app.js
* routes/
  * index.js
  * home.js
  * auth/
    * login.js
    * logout.js
    * register.js

`routes/index.js` uses `require-directory` to build the hash (rather than doing so manually) like so:

```javascript
var requireDirectory = require('require-directory');
module.exports = requireDirectory(module);
```

`app.js` references `routes/index.js` like any other module, but it now has a hash/tree of the exports from the `./routes/` directory:

```javascript
var routes = require('./routes');

// snip

app.get('/', routes.home);
app.get('/register', routes.auth.register);
app.get('/login', routes.auth.login);
app.get('/logout', routes.auth.logout);
```

The `routes` variable above is the equivalent of this:

```javascript
var routes = {
  home: require('routes/home.js'),
  auth: {
    login: require('routes/auth/login.js'),
    logout: require('routes/auth/logout.js'),
    register: require('routes/auth/register.js')
  }
};
```

*Note that `routes.index` will be `undefined` as you would hope.*

### Specifying Another Directory

You can specify which directory you want to build a tree of (if it isn't the current directory for whatever reason) by passing it as the second parameter. Not specifying the path (`requireDirectory(module)`) is the equivelant of `requireDirectory(module, __dirname)`:

```javascript
var requireDirectory = require('require-directory');
module.exports = requireDirectory(module, './some/subdirectory');
```

For example, in the [example in the Usage section](#usage) we could have avoided creating `routes/index.js` and instead changed the first lines of `app.js` to:

```javascript
var requireDirectory = require('require-directory');
var routes = requireDirectory(module, './routes');
```

## Options

You can pass an options hash to `require-directory` as the 2nd parameter (or 3rd if you're passing the path to another directory as the 2nd parameter already). Here are the available options:

### Whitelisting

Whitelisting (either via RegExp or function) allows you to specify that only certain files be loaded.

```javascript
var requireDirectory = require('require-directory'),
  whitelist = /onlyinclude.js$/,
  hash = requireDirectory(module, {include: whitelist});
```

```javascript
var requireDirectory = require('require-directory'),
  check = function(path){
    if(/onlyinclude.js$/.test(path)){
      return true; // don't include
    }else{
      return false; // go ahead and include
    }
  },
  hash = requireDirectory(module, {include: check});
```

### Blacklisting

Blacklisting (either via RegExp or function) allows you to specify that all but certain files should be loaded.

```javascript
var requireDirectory = require('require-directory'),
  blacklist = /dontinclude\.js$/,
  hash = requireDirectory(module, {exclude: blacklist});
```

```javascript
var requireDirectory = require('require-directory'),
  check = function(path){
    if(/dontinclude\.js$/.test(path)){
      return false; // don't include
    }else{
      return true; // go ahead and include
    }
  },
  hash = requireDirectory(module, {exclude: check});
```

### Visiting Objects As They're Loaded

`require-directory` takes a function as the `visit` option that will be called for each module that is added to module.exports.

```javascript
var requireDirectory = require('require-directory'),
  visitor = function(obj) {
    console.log(obj); // will be called for every module that is loaded
  },
  hash = requireDirectory(module, {visit: visitor});
```

The visitor can also transform the objects by returning a value:

```javascript
var requireDirectory = require('require-directory'),
  visitor = function(obj) {
    return obj(new Date());
  },
  hash = requireDirectory(module, {visit: visitor});
```

### Renaming Keys

```javascript
var requireDirectory = require('require-directory'),
  renamer = function(name) {
    return name.toUpperCase();
  },
  hash = requireDirectory(module, {rename: renamer});
```

### No Recursion

```javascript
var requireDirectory = require('require-directory'),
  hash = requireDirectory(module, {recurse: false});
```

## Run Unit Tests

```bash
$ npm run lint
$ npm test
```

## License

[MIT License](http://www.opensource.org/licenses/mit-license.php)

## Author

[Troy Goode](https://github.com/TroyGoode) ([troygoode@gmail.com](mailto:troygoode@gmail.com))

'use strict';

var fs = require('fs'),
  join = require('path').join,
  resolve = require('path').resolve,
  dirname = require('path').dirname,
  defaultOptions = {
    extensions: ['js', 'json', 'coffee'],
    recurse: true,
    rename: function (name) {
      return name;
    },
    visit: function (obj) {
      return obj;
    }
  };

function checkFileInclusion(path, filename, options) {
  return (
    // verify file has valid extension
    (new RegExp('\\.(' + options.extensions.join('|') + ')$', 'i').test(filename)) &&

    // if options.include is a RegExp, evaluate it and make sure the path passes
    !(options.include && options.include instanceof RegExp && !options.include.test(path)) &&

    // if options.include is a function, evaluate it and make sure the path passes
    !(options.include && typeof options.include === 'function' && !options.include(path, filename)) &&

    // if options.exclude is a RegExp, evaluate it and make sure the path doesn't pass
    !(options.exclude && options.exclude instanceof RegExp && options.exclude.test(path)) &&

    // if options.exclude is a function, evaluate it and make sure the path doesn't pass
    !(options.exclude && typeof options.exclude === 'function' && options.exclude(path, filename))
  );
}

function requireDirectory(m, path, options) {
  var retval = {};

  // path is optional
  if (path && !options && typeof path !== 'string') {
    options = path;
    path = null;
  }

  // default options
  options = options || {};
  for (var prop in defaultOptions) {
    if (typeof options[prop] === 'undefined') {
      options[prop] = defaultOptions[prop];
    }
  }

  // if no path was passed in, assume the equivelant of __dirname from caller
  // otherwise, resolve path relative to the equivalent of __dirname
  path = !path ? dirname(m.filename) : resolve(dirname(m.filename), path);

  // get the path of each file in specified directory, append to current tree node, recurse
  fs.readdirSync(path).forEach(function (filename) {
    var joined = join(path, filename),
      files,
      key,
      obj;

    if (fs.statSync(joined).isDirectory() && options.recurse) {
      // this node is a directory; recurse
      files = requireDirectory(m, joined, options);
      // exclude empty directories
      if (Object.keys(files).length) {
        retval[options.rename(filename, joined, filename)] = files;
      }
    } else {
      if (joined !== m.filename && checkFileInclusion(joined, filename, options)) {
        // hash node key shouldn't include file extension
        key = filename.substring(0, filename.lastIndexOf('.'));
        obj = m.require(joined);
        retval[options.rename(key, joined, filename)] = options.visit(obj, joined, filename) || obj;
      }
    }
  });

  return retval;
}

module.exports = requireDirectory;
module.exports.defaults = defaultOptions;
{
  "author": {
    "name": "Troy Goode",
    "email": "troygoode@gmail.com",
    "url": "http://github.com/troygoode/"
  },
  "deprecated": false,
  "description": "Recursively iterates over specified directory, require()'ing each file, and returning a nested hash structure containing those modules.",
  "devDependencies": {
    "jshint": "^2.6.0",
    "mocha": "^2.1.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "homepage": "https://github.com/troygoode/node-require-directory/",
  "license": "MIT",
  "main": "index.js",
  "name": "require-directory",
  "repository": {
    "type": "git",
    "url": "git://github.com/troygoode/node-require-directory.git"
  },
  "version": "2.1.1"
}Copyright (c) 2016, Contributors

Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice
appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
module.exports = function (_require) {
  _require = _require || require
  var main = _require.main
  if (main && isIISNode(main)) return handleIISNode(main)
  else return main ? main.filename : process.cwd()
}

function isIISNode (main) {
  return /\\iisnode\\/.test(main.filename)
}

function handleIISNode (main) {
  if (!main.children.length) {
    return main.filename
  } else {
    return main.children[0].filename
  }
}
{
  "author": {
    "name": "Ben Coe",
    "email": "ben@npmjs.com"
  },
  "deprecated": false,
  "description": "shim for require.main.filename() that works in as many environments as possible",
  "devDependencies": {
    "chai": "^4.0.0",
    "standard": "^10.0.3",
    "standard-version": "^4.0.0",
    "tap": "^11.0.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/yargs/require-main-filename#readme",
  "license": "ISC",
  "main": "index.js",
  "name": "require-main-filename",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/yargs/require-main-filename.git"
  },
  "version": "2.0.0"
}root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
node_modules
MIT License

Copyright (c) 2012 James Halliday

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var async = require('./lib/async');
async.core = require('./lib/core');
async.isCore = require('./lib/is-core');
async.sync = require('./lib/sync');

module.exports = async;
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "dependencies": {
    "path-parse": "^1.0.6"
  },
  "deprecated": false,
  "description": "resolve like require.resolve() on behalf of files asynchronously and synchronously",
  "devDependencies": {
    "@ljharb/eslint-config": "^16.0.0",
    "array.prototype.map": "^1.0.2",
    "eslint": "^6.8.0",
    "object-keys": "^1.1.1",
    "safe-publish-latest": "^1.1.4",
    "tap": "0.4.13",
    "tape": "^5.0.0-next.5"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "homepage": "https://github.com/browserify/resolve#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "resolve",
  "repository": {
    "type": "git",
    "url": "git://github.com/browserify/resolve.git"
  },
  "version": "1.17.0"
}var fs = require('fs');
var path = require('path');
var caller = require('./caller.js');
var nodeModulesPaths = require('./node-modules-paths.js');
var normalizeOptions = require('./normalize-options.js');
var isCore = require('./is-core');

var realpathFS = fs.realpath && typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath;

var defaultIsFile = function isFile(file, cb) {
    fs.stat(file, function (err, stat) {
        if (!err) {
            return cb(null, stat.isFile() || stat.isFIFO());
        }
        if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false);
        return cb(err);
    });
};

var defaultIsDir = function isDirectory(dir, cb) {
    fs.stat(dir, function (err, stat) {
        if (!err) {
            return cb(null, stat.isDirectory());
        }
        if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false);
        return cb(err);
    });
};

var defaultRealpath = function realpath(x, cb) {
    realpathFS(x, function (realpathErr, realPath) {
        if (realpathErr && realpathErr.code !== 'ENOENT') cb(realpathErr);
        else cb(null, realpathErr ? x : realPath);
    });
};

var maybeRealpath = function maybeRealpath(realpath, x, opts, cb) {
    if (opts && opts.preserveSymlinks === false) {
        realpath(x, cb);
    } else {
        cb(null, x);
    }
};

var getPackageCandidates = function getPackageCandidates(x, start, opts) {
    var dirs = nodeModulesPaths(start, opts, x);
    for (var i = 0; i < dirs.length; i++) {
        dirs[i] = path.join(dirs[i], x);
    }
    return dirs;
};

module.exports = function resolve(x, options, callback) {
    var cb = callback;
    var opts = options;
    if (typeof options === 'function') {
        cb = opts;
        opts = {};
    }
    if (typeof x !== 'string') {
        var err = new TypeError('Path must be a string.');
        return process.nextTick(function () {
            cb(err);
        });
    }

    opts = normalizeOptions(x, opts);

    var isFile = opts.isFile || defaultIsFile;
    var isDirectory = opts.isDirectory || defaultIsDir;
    var readFile = opts.readFile || fs.readFile;
    var realpath = opts.realpath || defaultRealpath;
    var packageIterator = opts.packageIterator;

    var extensions = opts.extensions || ['.js'];
    var basedir = opts.basedir || path.dirname(caller());
    var parent = opts.filename || basedir;

    opts.paths = opts.paths || [];

    // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory
    var absoluteStart = path.resolve(basedir);

    maybeRealpath(
        realpath,
        absoluteStart,
        opts,
        function (err, realStart) {
            if (err) cb(err);
            else init(realStart);
        }
    );

    var res;
    function init(basedir) {
        if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) {
            res = path.resolve(basedir, x);
            if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/';
            if ((/\/$/).test(x) && res === basedir) {
                loadAsDirectory(res, opts.package, onfile);
            } else loadAsFile(res, opts.package, onfile);
        } else if (isCore(x)) {
            return cb(null, x);
        } else loadNodeModules(x, basedir, function (err, n, pkg) {
            if (err) cb(err);
            else if (n) {
                return maybeRealpath(realpath, n, opts, function (err, realN) {
                    if (err) {
                        cb(err);
                    } else {
                        cb(null, realN, pkg);
                    }
                });
            } else {
                var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'");
                moduleError.code = 'MODULE_NOT_FOUND';
                cb(moduleError);
            }
        });
    }

    function onfile(err, m, pkg) {
        if (err) cb(err);
        else if (m) cb(null, m, pkg);
        else loadAsDirectory(res, function (err, d, pkg) {
            if (err) cb(err);
            else if (d) {
                maybeRealpath(realpath, d, opts, function (err, realD) {
                    if (err) {
                        cb(err);
                    } else {
                        cb(null, realD, pkg);
                    }
                });
            } else {
                var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'");
                moduleError.code = 'MODULE_NOT_FOUND';
                cb(moduleError);
            }
        });
    }

    function loadAsFile(x, thePackage, callback) {
        var loadAsFilePackage = thePackage;
        var cb = callback;
        if (typeof loadAsFilePackage === 'function') {
            cb = loadAsFilePackage;
            loadAsFilePackage = undefined;
        }

        var exts = [''].concat(extensions);
        load(exts, x, loadAsFilePackage);

        function load(exts, x, loadPackage) {
            if (exts.length === 0) return cb(null, undefined, loadPackage);
            var file = x + exts[0];

            var pkg = loadPackage;
            if (pkg) onpkg(null, pkg);
            else loadpkg(path.dirname(file), onpkg);

            function onpkg(err, pkg_, dir) {
                pkg = pkg_;
                if (err) return cb(err);
                if (dir && pkg && opts.pathFilter) {
                    var rfile = path.relative(dir, file);
                    var rel = rfile.slice(0, rfile.length - exts[0].length);
                    var r = opts.pathFilter(pkg, x, rel);
                    if (r) return load(
                        [''].concat(extensions.slice()),
                        path.resolve(dir, r),
                        pkg
                    );
                }
                isFile(file, onex);
            }
            function onex(err, ex) {
                if (err) return cb(err);
                if (ex) return cb(null, file, pkg);
                load(exts.slice(1), x, pkg);
            }
        }
    }

    function loadpkg(dir, cb) {
        if (dir === '' || dir === '/') return cb(null);
        if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) {
            return cb(null);
        }
        if ((/[/\\]node_modules[/\\]*$/).test(dir)) return cb(null);

        maybeRealpath(realpath, dir, opts, function (unwrapErr, pkgdir) {
            if (unwrapErr) return loadpkg(path.dirname(dir), cb);
            var pkgfile = path.join(pkgdir, 'package.json');
            isFile(pkgfile, function (err, ex) {
                // on err, ex is false
                if (!ex) return loadpkg(path.dirname(dir), cb);

                readFile(pkgfile, function (err, body) {
                    if (err) cb(err);
                    try { var pkg = JSON.parse(body); } catch (jsonErr) {}

                    if (pkg && opts.packageFilter) {
                        pkg = opts.packageFilter(pkg, pkgfile);
                    }
                    cb(null, pkg, dir);
                });
            });
        });
    }

    function loadAsDirectory(x, loadAsDirectoryPackage, callback) {
        var cb = callback;
        var fpkg = loadAsDirectoryPackage;
        if (typeof fpkg === 'function') {
            cb = fpkg;
            fpkg = opts.package;
        }

        maybeRealpath(realpath, x, opts, function (unwrapErr, pkgdir) {
            if (unwrapErr) return cb(unwrapErr);
            var pkgfile = path.join(pkgdir, 'package.json');
            isFile(pkgfile, function (err, ex) {
                if (err) return cb(err);
                if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb);

                readFile(pkgfile, function (err, body) {
                    if (err) return cb(err);
                    try {
                        var pkg = JSON.parse(body);
                    } catch (jsonErr) {}

                    if (pkg && opts.packageFilter) {
                        pkg = opts.packageFilter(pkg, pkgfile);
                    }

                    if (pkg && pkg.main) {
                        if (typeof pkg.main !== 'string') {
                            var mainError = new TypeError('package â€œ' + pkg.name + 'â€� `main` must be a string');
                            mainError.code = 'INVALID_PACKAGE_MAIN';
                            return cb(mainError);
                        }
                        if (pkg.main === '.' || pkg.main === './') {
                            pkg.main = 'index';
                        }
                        loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) {
                            if (err) return cb(err);
                            if (m) return cb(null, m, pkg);
                            if (!pkg) return loadAsFile(path.join(x, 'index'), pkg, cb);

                            var dir = path.resolve(x, pkg.main);
                            loadAsDirectory(dir, pkg, function (err, n, pkg) {
                                if (err) return cb(err);
                                if (n) return cb(null, n, pkg);
                                loadAsFile(path.join(x, 'index'), pkg, cb);
                            });
                        });
                        return;
                    }

                    loadAsFile(path.join(x, '/index'), pkg, cb);
                });
            });
        });
    }

    function processDirs(cb, dirs) {
        if (dirs.length === 0) return cb(null, undefined);
        var dir = dirs[0];

        isDirectory(path.dirname(dir), isdir);

        function isdir(err, isdir) {
            if (err) return cb(err);
            if (!isdir) return processDirs(cb, dirs.slice(1));
            loadAsFile(dir, opts.package, onfile);
        }

        function onfile(err, m, pkg) {
            if (err) return cb(err);
            if (m) return cb(null, m, pkg);
            loadAsDirectory(dir, opts.package, ondir);
        }

        function ondir(err, n, pkg) {
            if (err) return cb(err);
            if (n) return cb(null, n, pkg);
            processDirs(cb, dirs.slice(1));
        }
    }
    function loadNodeModules(x, start, cb) {
        var thunk = function () { return getPackageCandidates(x, start, opts); };
        processDirs(
            cb,
            packageIterator ? packageIterator(x, start, thunk, opts) : thunk()
        );
    }
};
module.exports = function () {
    // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
    var origPrepareStackTrace = Error.prepareStackTrace;
    Error.prepareStackTrace = function (_, stack) { return stack; };
    var stack = (new Error()).stack;
    Error.prepareStackTrace = origPrepareStackTrace;
    return stack[2].getFileName();
};
var current = (process.versions && process.versions.node && process.versions.node.split('.')) || [];

function specifierIncluded(specifier) {
    var parts = specifier.split(' ');
    var op = parts.length > 1 ? parts[0] : '=';
    var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.');

    for (var i = 0; i < 3; ++i) {
        var cur = Number(current[i] || 0);
        var ver = Number(versionParts[i] || 0);
        if (cur === ver) {
            continue; // eslint-disable-line no-restricted-syntax, no-continue
        }
        if (op === '<') {
            return cur < ver;
        } else if (op === '>=') {
            return cur >= ver;
        } else {
            return false;
        }
    }
    return op === '>=';
}

function matchesRange(range) {
    var specifiers = range.split(/ ?&& ?/);
    if (specifiers.length === 0) { return false; }
    for (var i = 0; i < specifiers.length; ++i) {
        if (!specifierIncluded(specifiers[i])) { return false; }
    }
    return true;
}

function versionIncluded(specifierValue) {
    if (typeof specifierValue === 'boolean') { return specifierValue; }
    if (specifierValue && typeof specifierValue === 'object') {
        for (var i = 0; i < specifierValue.length; ++i) {
            if (matchesRange(specifierValue[i])) { return true; }
        }
        return false;
    }
    return matchesRange(specifierValue);
}

var data = require('./core.json');

var core = {};
for (var mod in data) { // eslint-disable-line no-restricted-syntax
    if (Object.prototype.hasOwnProperty.call(data, mod)) {
        core[mod] = versionIncluded(data[mod]);
    }
}
module.exports = core;
{
    "assert": true,
    "async_hooks": ">= 8",
    "buffer_ieee754": "< 0.9.7",
    "buffer": true,
    "child_process": true,
    "cluster": true,
    "console": true,
    "constants": true,
    "crypto": true,
    "_debug_agent": ">= 1 && < 8",
    "_debugger": "< 8",
    "dgram": true,
    "dns": true,
    "domain": true,
    "events": true,
    "freelist": "< 6",
    "fs": true,
    "fs/promises": [">= 10 && < 10.1", ">= 14"],
    "_http_agent": ">= 0.11.1",
    "_http_client": ">= 0.11.1",
    "_http_common": ">= 0.11.1",
    "_http_incoming": ">= 0.11.1",
    "_http_outgoing": ">= 0.11.1",
    "_http_server": ">= 0.11.1",
    "http": true,
    "http2": ">= 8.8",
    "https": true,
    "inspector": ">= 8.0.0",
    "_linklist": "< 8",
    "module": true,
    "net": true,
    "node-inspect/lib/_inspect": ">= 7.6.0 && < 12",
    "node-inspect/lib/internal/inspect_client": ">= 7.6.0 && < 12",
    "node-inspect/lib/internal/inspect_repl": ">= 7.6.0 && < 12",
    "os": true,
    "path": true,
    "perf_hooks": ">= 8.5",
    "process": ">= 1",
    "punycode": true,
    "querystring": true,
    "readline": true,
    "repl": true,
    "smalloc": ">= 0.11.5 && < 3",
    "_stream_duplex": ">= 0.9.4",
    "_stream_transform": ">= 0.9.4",
    "_stream_wrap": ">= 1.4.1",
    "_stream_passthrough": ">= 0.9.4",
    "_stream_readable": ">= 0.9.4",
    "_stream_writable": ">= 0.9.4",
    "stream": true,
    "string_decoder": true,
    "sys": true,
    "timers": true,
    "_tls_common": ">= 0.11.13",
    "_tls_legacy": ">= 0.11.3 && < 10",
    "_tls_wrap": ">= 0.11.3",
    "tls": true,
    "trace_events": ">= 10",
    "tty": true,
    "url": true,
    "util": true,
    "v8/tools/arguments": ">= 10 && < 12",
    "v8/tools/codemap": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
    "v8/tools/consarray": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
    "v8/tools/csvparser": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
    "v8/tools/logreader": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
    "v8/tools/profile_view": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
    "v8/tools/splaytree": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
    "v8": ">= 1",
    "vm": true,
    "wasi": ">= 13.4 && < 13.5",
    "worker_threads": ">= 11.7",
    "zlib": true
}
var core = require('./core');

module.exports = function isCore(x) {
    return Object.prototype.hasOwnProperty.call(core, x);
};
var path = require('path');
var parse = path.parse || require('path-parse');

var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) {
    var prefix = '/';
    if ((/^([A-Za-z]:)/).test(absoluteStart)) {
        prefix = '';
    } else if ((/^\\\\/).test(absoluteStart)) {
        prefix = '\\\\';
    }

    var paths = [absoluteStart];
    var parsed = parse(absoluteStart);
    while (parsed.dir !== paths[paths.length - 1]) {
        paths.push(parsed.dir);
        parsed = parse(parsed.dir);
    }

    return paths.reduce(function (dirs, aPath) {
        return dirs.concat(modules.map(function (moduleDir) {
            return path.resolve(prefix, aPath, moduleDir);
        }));
    }, []);
};

module.exports = function nodeModulesPaths(start, opts, request) {
    var modules = opts && opts.moduleDirectory
        ? [].concat(opts.moduleDirectory)
        : ['node_modules'];

    if (opts && typeof opts.paths === 'function') {
        return opts.paths(
            request,
            start,
            function () { return getNodeModulesDirs(start, modules); },
            opts
        );
    }

    var dirs = getNodeModulesDirs(start, modules);
    return opts && opts.paths ? dirs.concat(opts.paths) : dirs;
};
module.exports = function (x, opts) {
    /**
     * This file is purposefully a passthrough. It's expected that third-party
     * environments will override it at runtime in order to inject special logic
     * into `resolve` (by manipulating the options). One such example is the PnP
     * code path in Yarn.
     */

    return opts || {};
};
var isCore = require('./is-core');
var fs = require('fs');
var path = require('path');
var caller = require('./caller.js');
var nodeModulesPaths = require('./node-modules-paths.js');
var normalizeOptions = require('./normalize-options.js');

var realpathFS = fs.realpathSync && typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync;

var defaultIsFile = function isFile(file) {
    try {
        var stat = fs.statSync(file);
    } catch (e) {
        if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
        throw e;
    }
    return stat.isFile() || stat.isFIFO();
};

var defaultIsDir = function isDirectory(dir) {
    try {
        var stat = fs.statSync(dir);
    } catch (e) {
        if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
        throw e;
    }
    return stat.isDirectory();
};

var defaultRealpathSync = function realpathSync(x) {
    try {
        return realpathFS(x);
    } catch (realpathErr) {
        if (realpathErr.code !== 'ENOENT') {
            throw realpathErr;
        }
    }
    return x;
};

var maybeRealpathSync = function maybeRealpathSync(realpathSync, x, opts) {
    if (opts && opts.preserveSymlinks === false) {
        return realpathSync(x);
    }
    return x;
};

var getPackageCandidates = function getPackageCandidates(x, start, opts) {
    var dirs = nodeModulesPaths(start, opts, x);
    for (var i = 0; i < dirs.length; i++) {
        dirs[i] = path.join(dirs[i], x);
    }
    return dirs;
};

module.exports = function resolveSync(x, options) {
    if (typeof x !== 'string') {
        throw new TypeError('Path must be a string.');
    }
    var opts = normalizeOptions(x, options);

    var isFile = opts.isFile || defaultIsFile;
    var readFileSync = opts.readFileSync || fs.readFileSync;
    var isDirectory = opts.isDirectory || defaultIsDir;
    var realpathSync = opts.realpathSync || defaultRealpathSync;
    var packageIterator = opts.packageIterator;

    var extensions = opts.extensions || ['.js'];
    var basedir = opts.basedir || path.dirname(caller());
    var parent = opts.filename || basedir;

    opts.paths = opts.paths || [];

    // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory
    var absoluteStart = maybeRealpathSync(realpathSync, path.resolve(basedir), opts);

    if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) {
        var res = path.resolve(absoluteStart, x);
        if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/';
        var m = loadAsFileSync(res) || loadAsDirectorySync(res);
        if (m) return maybeRealpathSync(realpathSync, m, opts);
    } else if (isCore(x)) {
        return x;
    } else {
        var n = loadNodeModulesSync(x, absoluteStart);
        if (n) return maybeRealpathSync(realpathSync, n, opts);
    }

    var err = new Error("Cannot find module '" + x + "' from '" + parent + "'");
    err.code = 'MODULE_NOT_FOUND';
    throw err;

    function loadAsFileSync(x) {
        var pkg = loadpkg(path.dirname(x));

        if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) {
            var rfile = path.relative(pkg.dir, x);
            var r = opts.pathFilter(pkg.pkg, x, rfile);
            if (r) {
                x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign
            }
        }

        if (isFile(x)) {
            return x;
        }

        for (var i = 0; i < extensions.length; i++) {
            var file = x + extensions[i];
            if (isFile(file)) {
                return file;
            }
        }
    }

    function loadpkg(dir) {
        if (dir === '' || dir === '/') return;
        if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) {
            return;
        }
        if ((/[/\\]node_modules[/\\]*$/).test(dir)) return;

        var pkgfile = path.join(maybeRealpathSync(realpathSync, dir, opts), 'package.json');

        if (!isFile(pkgfile)) {
            return loadpkg(path.dirname(dir));
        }

        var body = readFileSync(pkgfile);

        try {
            var pkg = JSON.parse(body);
        } catch (jsonErr) {}

        if (pkg && opts.packageFilter) {
            // v2 will pass pkgfile
            pkg = opts.packageFilter(pkg, /*pkgfile,*/ dir); // eslint-disable-line spaced-comment
        }

        return { pkg: pkg, dir: dir };
    }

    function loadAsDirectorySync(x) {
        var pkgfile = path.join(maybeRealpathSync(realpathSync, x, opts), '/package.json');
        if (isFile(pkgfile)) {
            try {
                var body = readFileSync(pkgfile, 'UTF8');
                var pkg = JSON.parse(body);
            } catch (e) {}

            if (pkg && opts.packageFilter) {
                // v2 will pass pkgfile
                pkg = opts.packageFilter(pkg, /*pkgfile,*/ x); // eslint-disable-line spaced-comment
            }

            if (pkg && pkg.main) {
                if (typeof pkg.main !== 'string') {
                    var mainError = new TypeError('package â€œ' + pkg.name + 'â€� `main` must be a string');
                    mainError.code = 'INVALID_PACKAGE_MAIN';
                    throw mainError;
                }
                if (pkg.main === '.' || pkg.main === './') {
                    pkg.main = 'index';
                }
                try {
                    var m = loadAsFileSync(path.resolve(x, pkg.main));
                    if (m) return m;
                    var n = loadAsDirectorySync(path.resolve(x, pkg.main));
                    if (n) return n;
                } catch (e) {}
            }
        }

        return loadAsFileSync(path.join(x, '/index'));
    }

    function loadNodeModulesSync(x, start) {
        var thunk = function () { return getPackageCandidates(x, start, opts); };
        var dirs = packageIterator ? packageIterator(x, start, thunk, opts) : thunk();

        for (var i = 0; i < dirs.length; i++) {
            var dir = dirs[i];
            if (isDirectory(path.dirname(dir))) {
                var m = loadAsFileSync(dir);
                if (m) return m;
                var n = loadAsDirectorySync(dir);
                if (n) return n;
            }
        }
    }
};
Copyright (c) 2017 Luke Childs

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "lukechilds"
  },
  "dependencies": {
    "lowercase-keys": "^1.0.0"
  },
  "deprecated": false,
  "description": "A response-like object for mocking a Node.js HTTP response stream",
  "devDependencies": {
    "ava": "^0.22.0",
    "coveralls": "^2.13.1",
    "eslint-config-xo-lukechilds": "^1.0.0",
    "get-stream": "^3.0.0",
    "nyc": "^11.1.0",
    "xo": "^0.19.0"
  },
  "homepage": "https://github.com/lukechilds/responselike#readme",
  "license": "MIT",
  "main": "src/index.js",
  "name": "responselike",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/lukechilds/responselike.git"
  },
  "version": "1.0.2"
}'use strict';

const Readable = require('stream').Readable;
const lowercaseKeys = require('lowercase-keys');

class Response extends Readable {
	constructor(statusCode, headers, body, url) {
		if (typeof statusCode !== 'number') {
			throw new TypeError('Argument `statusCode` should be a number');
		}
		if (typeof headers !== 'object') {
			throw new TypeError('Argument `headers` should be an object');
		}
		if (!(body instanceof Buffer)) {
			throw new TypeError('Argument `body` should be a buffer');
		}
		if (typeof url !== 'string') {
			throw new TypeError('Argument `url` should be a string');
		}

		super();
		this.statusCode = statusCode;
		this.headers = lowercaseKeys(headers);
		this.body = body;
		this.url = url;
	}

	_read() {
		this.push(this.body);
		this.push(null);
	}
}

module.exports = Response;
The MIT License (MIT)

Copyright (c) Feross Aboukhadijeh

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
/* eslint-disable node/no-deprecated-api */
var buffer = require('buffer')
var Buffer = buffer.Buffer

// alternative to using Object.keys for old browsers
function copyProps (src, dst) {
  for (var key in src) {
    dst[key] = src[key]
  }
}
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
  module.exports = buffer
} else {
  // Copy properties from require('buffer')
  copyProps(buffer, exports)
  exports.Buffer = SafeBuffer
}

function SafeBuffer (arg, encodingOrOffset, length) {
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.prototype = Object.create(Buffer.prototype)

// Copy static methods from Buffer
copyProps(Buffer, SafeBuffer)

SafeBuffer.from = function (arg, encodingOrOffset, length) {
  if (typeof arg === 'number') {
    throw new TypeError('Argument must not be a number')
  }
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.alloc = function (size, fill, encoding) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  var buf = Buffer(size)
  if (fill !== undefined) {
    if (typeof encoding === 'string') {
      buf.fill(fill, encoding)
    } else {
      buf.fill(fill)
    }
  } else {
    buf.fill(0)
  }
  return buf
}

SafeBuffer.allocUnsafe = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return Buffer(size)
}

SafeBuffer.allocUnsafeSlow = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return buffer.SlowBuffer(size)
}
{
  "author": {
    "name": "Feross Aboukhadijeh",
    "email": "feross@feross.org",
    "url": "https://feross.org"
  },
  "deprecated": false,
  "description": "Safer Node.js Buffer API",
  "devDependencies": {
    "standard": "*",
    "tape": "^5.0.0"
  },
  "funding": [
    {
      "type": "github",
      "url": "https://github.com/sponsors/feross"
    },
    {
      "type": "patreon",
      "url": "https://www.patreon.com/feross"
    },
    {
      "type": "consulting",
      "url": "https://feross.org/support"
    }
  ],
  "homepage": "https://github.com/feross/safe-buffer",
  "license": "MIT",
  "main": "index.js",
  "name": "safe-buffer",
  "repository": {
    "type": "git",
    "url": "git://github.com/feross/safe-buffer.git"
  },
  "types": "index.d.ts",
  "version": "5.2.1"
}MIT License

Copyright (c) 2018 Nikita Skovoroda <chalkerx@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
# Porting to the Buffer.from/Buffer.alloc API

<a id="overview"></a>
## Overview

- [Variant 1: Drop support for Node.js â‰¤ 4.4.x and 5.0.0 â€” 5.9.x.](#variant-1) (*recommended*)
- [Variant 2: Use a polyfill](#variant-2)
- [Variant 3: manual detection, with safeguards](#variant-3)

### Finding problematic bits of code using grep

Just run `grep -nrE '[^a-zA-Z](Slow)?Buffer\s*\(' --exclude-dir node_modules`.

It will find all the potentially unsafe places in your own code (with some considerably unlikely
exceptions).

### Finding problematic bits of code using Node.js 8

If youâ€™re using Node.js â‰¥ 8.0.0 (which is recommended), Node.js exposes multiple options that help with finding the relevant pieces of code:

- `--trace-warnings` will make Node.js show a stack trace for this warning and other warnings that are printed by Node.js.
- `--trace-deprecation` does the same thing, but only for deprecation warnings.
- `--pending-deprecation` will show more types of deprecation warnings. In particular, it will show the `Buffer()` deprecation warning, even on Node.js 8.

You can set these flags using an environment variable:

```console
$ export NODE_OPTIONS='--trace-warnings --pending-deprecation'
$ cat example.js
'use strict';
const foo = new Buffer('foo');
$ node example.js
(node:7147) [DEP0005] DeprecationWarning: The Buffer() and new Buffer() constructors are not recommended for use due to security and usability concerns. Please use the new Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() construction methods instead.
    at showFlaggedDeprecation (buffer.js:127:13)
    at new Buffer (buffer.js:148:3)
    at Object.<anonymous> (/path/to/example.js:2:13)
    [... more stack trace lines ...]
```

### Finding problematic bits of code using linters

Eslint rules [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor)
or
[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md)
also find calls to deprecated `Buffer()` API. Those rules are included in some pre-sets.

There is a drawback, though, that it doesn't always
[work correctly](https://github.com/chalker/safer-buffer#why-not-safe-buffer) when `Buffer` is
overriden e.g. with a polyfill, so recommended is a combination of this and some other method
described above.

<a id="variant-1"></a>
## Variant 1: Drop support for Node.js â‰¤ 4.4.x and 5.0.0 â€” 5.9.x.

This is the recommended solution nowadays that would imply only minimal overhead.

The Node.js 5.x release line has been unsupported since July 2016, and the Node.js 4.x release line reaches its End of Life in April 2018 (â†’ [Schedule](https://github.com/nodejs/Release#release-schedule)). This means that these versions of Node.js will *not* receive any updates, even in case of security issues, so using these release lines should be avoided, if at all possible.

What you would do in this case is to convert all `new Buffer()` or `Buffer()` calls to use `Buffer.alloc()` or `Buffer.from()`, in the following way:

- For `new Buffer(number)`, replace it with `Buffer.alloc(number)`.
- For `new Buffer(string)` (or `new Buffer(string, encoding)`), replace it with `Buffer.from(string)` (or `Buffer.from(string, encoding)`).
- For all other combinations of arguments (these are much rarer), also replace `new Buffer(...arguments)` with `Buffer.from(...arguments)`.

Note that `Buffer.alloc()` is also _faster_ on the current Node.js versions than
`new Buffer(size).fill(0)`, which is what you would otherwise need to ensure zero-filling.

Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor)
or
[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md)
is recommended to avoid accidential unsafe Buffer API usage.

There is also a [JSCodeshift codemod](https://github.com/joyeecheung/node-dep-codemod#dep005)
for automatically migrating Buffer constructors to `Buffer.alloc()` or `Buffer.from()`.
Note that it currently only works with cases where the arguments are literals or where the
constructor is invoked with two arguments.

_If you currently support those older Node.js versions and dropping them would be a semver-major change
for you, or if you support older branches of your packages, consider using [Variant 2](#variant-2)
or [Variant 3](#variant-3) on older branches, so people using those older branches will also receive
the fix. That way, you will eradicate potential issues caused by unguarded Buffer API usage and
your users will not observe a runtime deprecation warning when running your code on Node.js 10._

<a id="variant-2"></a>
## Variant 2: Use a polyfill

Utilize [safer-buffer](https://www.npmjs.com/package/safer-buffer) as a polyfill to support older
Node.js versions.

You would take exacly the same steps as in [Variant 1](#variant-1), but with a polyfill
`const Buffer = require('safer-buffer').Buffer` in all files where you use the new `Buffer` api.

Make sure that you do not use old `new Buffer` API â€” in any files where the line above is added,
using old `new Buffer()` API will _throw_. It will be easy to notice that in CI, though.

Alternatively, you could use [buffer-from](https://www.npmjs.com/package/buffer-from) and/or
[buffer-alloc](https://www.npmjs.com/package/buffer-alloc) [ponyfills](https://ponyfill.com/) â€”
those are great, the only downsides being 4 deps in the tree and slightly more code changes to
migrate off them (as you would be using e.g. `Buffer.from` under a different name). If you need only
`Buffer.from` polyfilled â€” `buffer-from` alone which comes with no extra dependencies.

_Alternatively, you could use [safe-buffer](https://www.npmjs.com/package/safe-buffer) â€” it also
provides a polyfill, but takes a different approach which has
[it's drawbacks](https://github.com/chalker/safer-buffer#why-not-safe-buffer). It will allow you
to also use the older `new Buffer()` API in your code, though â€” but that's arguably a benefit, as
it is problematic, can cause issues in your code, and will start emitting runtime deprecation
warnings starting with Node.js 10._

Note that in either case, it is important that you also remove all calls to the old Buffer
API manually â€” just throwing in `safe-buffer` doesn't fix the problem by itself, it just provides
a polyfill for the new API. I have seen people doing that mistake.

Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor)
or
[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md)
is recommended.

_Don't forget to drop the polyfill usage once you drop support for Node.js < 4.5.0._

<a id="variant-3"></a>
## Variant 3 â€” manual detection, with safeguards

This is useful if you create Buffer instances in only a few places (e.g. one), or you have your own
wrapper around them.

### Buffer(0)

This special case for creating empty buffers can be safely replaced with `Buffer.concat([])`, which
returns the same result all the way down to Node.js 0.8.x.

### Buffer(notNumber)

Before:

```js
var buf = new Buffer(notNumber, encoding);
```

After:

```js
var buf;
if (Buffer.from && Buffer.from !== Uint8Array.from) {
  buf = Buffer.from(notNumber, encoding);
} else {
  if (typeof notNumber === 'number')
    throw new Error('The "size" argument must be of type number.');
  buf = new Buffer(notNumber, encoding);
}
```

`encoding` is optional.

Note that the `typeof notNumber` before `new Buffer` is required (for cases when `notNumber` argument is not
hard-coded) and _is not caused by the deprecation of Buffer constructor_ â€” it's exactly _why_ the
Buffer constructor is deprecated. Ecosystem packages lacking this type-check caused numereous
security issues â€” situations when unsanitized user input could end up in the `Buffer(arg)` create
problems ranging from DoS to leaking sensitive information to the attacker from the process memory.

When `notNumber` argument is hardcoded (e.g. literal `"abc"` or `[0,1,2]`), the `typeof` check can
be omitted.

Also note that using TypeScript does not fix this problem for you â€” when libs written in
`TypeScript` are used from JS, or when user input ends up there â€” it behaves exactly as pure JS, as
all type checks are translation-time only and are not present in the actual JS code which TS
compiles to.

### Buffer(number)

For Node.js 0.10.x (and below) support:

```js
var buf;
if (Buffer.alloc) {
  buf = Buffer.alloc(number);
} else {
  buf = new Buffer(number);
  buf.fill(0);
}
```

Otherwise (Node.js â‰¥ 0.12.x):

```js
const buf = Buffer.alloc ? Buffer.alloc(number) : new Buffer(number).fill(0);
```

## Regarding Buffer.allocUnsafe

Be extra cautious when using `Buffer.allocUnsafe`:
 * Don't use it if you don't have a good reason to
   * e.g. you probably won't ever see a performance difference for small buffers, in fact, those
     might be even faster with `Buffer.alloc()`,
   * if your code is not in the hot code path â€” you also probably won't notice a difference,
   * keep in mind that zero-filling minimizes the potential risks.
 * If you use it, make sure that you never return the buffer in a partially-filled state,
   * if you are writing to it sequentially â€” always truncate it to the actuall written length

Errors in handling buffers allocated with `Buffer.allocUnsafe` could result in various issues,
ranged from undefined behaviour of your code to sensitive data (user input, passwords, certs)
leaking to the remote attacker.

_Note that the same applies to `new Buffer` usage without zero-filling, depending on the Node.js
version (and lacking type checks also adds DoS to the list of potential problems)._

<a id="faq"></a>
## FAQ

<a id="design-flaws"></a>
### What is wrong with the `Buffer` constructor?

The `Buffer` constructor could be used to create a buffer in many different ways:

- `new Buffer(42)` creates a `Buffer` of 42 bytes. Before Node.js 8, this buffer contained
  *arbitrary memory* for performance reasons, which could include anything ranging from
  program source code to passwords and encryption keys.
- `new Buffer('abc')` creates a `Buffer` that contains the UTF-8-encoded version of
  the string `'abc'`. A second argument could specify another encoding: For example,
  `new Buffer(string, 'base64')` could be used to convert a Base64 string into the original
  sequence of bytes that it represents.
- There are several other combinations of arguments.

This meant that, in code like `var buffer = new Buffer(foo);`, *it is not possible to tell
what exactly the contents of the generated buffer are* without knowing the type of `foo`.

Sometimes, the value of `foo` comes from an external source. For example, this function
could be exposed as a service on a web server, converting a UTF-8 string into its Base64 form:

```
function stringToBase64(req, res) {
  // The request body should have the format of `{ string: 'foobar' }`
  const rawBytes = new Buffer(req.body.string)
  const encoded = rawBytes.toString('base64')
  res.end({ encoded: encoded })
}
```

Note that this code does *not* validate the type of `req.body.string`:

- `req.body.string` is expected to be a string. If this is the case, all goes well.
- `req.body.string` is controlled by the client that sends the request.
- If `req.body.string` is the *number* `50`, the `rawBytes` would be 50 bytes:
  - Before Node.js 8, the content would be uninitialized
  - After Node.js 8, the content would be `50` bytes with the value `0`

Because of the missing type check, an attacker could intentionally send a number
as part of the request. Using this, they can either:

- Read uninitialized memory. This **will** leak passwords, encryption keys and other
  kinds of sensitive information. (Information leak)
- Force the program to allocate a large amount of memory. For example, when specifying
  `500000000` as the input value, each request will allocate 500MB of memory.
  This can be used to either exhaust the memory available of a program completely
  and make it crash, or slow it down significantly. (Denial of Service)

Both of these scenarios are considered serious security issues in a real-world
web server context.

when using `Buffer.from(req.body.string)` instead, passing a number will always
throw an exception instead, giving a controlled behaviour that can always be
handled by the program.

<a id="ecosystem-usage"></a>
### The `Buffer()` constructor has been deprecated for a while. Is this really an issue?

Surveys of code in the `npm` ecosystem have shown that the `Buffer()` constructor is still
widely used. This includes new code, and overall usage of such code has actually been
*increasing*.
# safer-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![javascript style guide][standard-image]][standard-url] [![Security Responsible Disclosure][secuirty-image]][secuirty-url]

[travis-image]: https://travis-ci.org/ChALkeR/safer-buffer.svg?branch=master
[travis-url]: https://travis-ci.org/ChALkeR/safer-buffer
[npm-image]: https://img.shields.io/npm/v/safer-buffer.svg
[npm-url]: https://npmjs.org/package/safer-buffer
[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg
[standard-url]: https://standardjs.com
[secuirty-image]: https://img.shields.io/badge/Security-Responsible%20Disclosure-green.svg
[secuirty-url]: https://github.com/nodejs/security-wg/blob/master/processes/responsible_disclosure_template.md

Modern Buffer API polyfill without footguns, working on Node.js from 0.8 to current.

## How to use?

First, port all `Buffer()` and `new Buffer()` calls to `Buffer.alloc()` and `Buffer.from()` API.

Then, to achieve compatibility with outdated Node.js versions (`<4.5.0` and 5.x `<5.9.0`), use
`const Buffer = require('safer-buffer').Buffer` in all files where you make calls to the new
Buffer API. _Use `var` instead of `const` if you need that for your Node.js version range support._

Also, see the
[porting Buffer](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md) guide.

## Do I need it?

Hopefully, not â€” dropping support for outdated Node.js versions should be fine nowdays, and that
is the recommended path forward. You _do_ need to port to the `Buffer.alloc()` and `Buffer.from()`
though.

See the [porting guide](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md)
for a better description.

## Why not [safe-buffer](https://npmjs.com/safe-buffer)?

_In short: while `safe-buffer` serves as a polyfill for the new API, it allows old API usage and
itself contains footguns._

`safe-buffer` could be used safely to get the new API while still keeping support for older
Node.js versions (like this module), but while analyzing ecosystem usage of the old Buffer API
I found out that `safe-buffer` is itself causing problems in some cases.

For example, consider the following snippet:

```console
$ cat example.unsafe.js
console.log(Buffer(20))
$ ./node-v6.13.0-linux-x64/bin/node example.unsafe.js
<Buffer 0a 00 00 00 00 00 00 00 28 13 de 02 00 00 00 00 05 00 00 00>
$ standard example.unsafe.js
standard: Use JavaScript Standard Style (https://standardjs.com)
  /home/chalker/repo/safer-buffer/example.unsafe.js:2:13: 'Buffer()' was deprecated since v6. Use 'Buffer.alloc()' or 'Buffer.from()' (use 'https://www.npmjs.com/package/safe-buffer' for '<4.5.0') instead.
```

This is allocates and writes to console an uninitialized chunk of memory.
[standard](https://www.npmjs.com/package/standard) linter (among others) catch that and warn people
to avoid using unsafe API.

Let's now throw in `safe-buffer`!

```console
$ cat example.safe-buffer.js
const Buffer = require('safe-buffer').Buffer
console.log(Buffer(20))
$ standard example.safe-buffer.js
$ ./node-v6.13.0-linux-x64/bin/node example.safe-buffer.js
<Buffer 08 00 00 00 00 00 00 00 28 58 01 82 fe 7f 00 00 00 00 00 00>
```

See the problem? Adding in `safe-buffer` _magically removes the lint warning_, but the behavior
remains identiÑ�al to what we had before, and when launched on Node.js 6.x LTS â€” this dumps out
chunks of uninitialized memory.
_And this code will still emit runtime warnings on Node.js 10.x and above._

That was done by design. I first considered changing `safe-buffer`, prohibiting old API usage or
emitting warnings on it, but that significantly diverges from `safe-buffer` design. After some
discussion, it was decided to move my approach into a separate package, and _this is that separate
package_.

This footgun is not imaginary â€” I observed top-downloaded packages doing that kind of thing,
Â«fixingÂ» the lint warning by blindly including `safe-buffer` without any actual changes.

Also in some cases, even if the API _was_ migrated to use of safe Buffer API â€” a random pull request
can bring unsafe Buffer API usage back to the codebase by adding new calls â€” and that could go
unnoticed even if you have a linter prohibiting that (becase of the reason stated above), and even
pass CI. _I also observed that being done in popular packages._

Some examples:
 * [webdriverio](https://github.com/webdriverio/webdriverio/commit/05cbd3167c12e4930f09ef7cf93b127ba4effae4#diff-124380949022817b90b622871837d56cR31)
   (a module with 548 759 downloads/month),
 * [websocket-stream](https://github.com/maxogden/websocket-stream/commit/c9312bd24d08271687d76da0fe3c83493871cf61)
   (218 288 d/m, fix in [maxogden/websocket-stream#142](https://github.com/maxogden/websocket-stream/pull/142)),
 * [node-serialport](https://github.com/node-serialport/node-serialport/commit/e8d9d2b16c664224920ce1c895199b1ce2def48c)
   (113 138 d/m, fix in [node-serialport/node-serialport#1510](https://github.com/node-serialport/node-serialport/pull/1510)),
 * [karma](https://github.com/karma-runner/karma/commit/3d94b8cf18c695104ca195334dc75ff054c74eec)
   (3 973 193 d/m, fix in [karma-runner/karma#2947](https://github.com/karma-runner/karma/pull/2947)),
 * [spdy-transport](https://github.com/spdy-http2/spdy-transport/commit/5375ac33f4a62a4f65bcfc2827447d42a5dbe8b1)
   (5 970 727 d/m, fix in [spdy-http2/spdy-transport#53](https://github.com/spdy-http2/spdy-transport/pull/53)).
 * And there are a lot more over the ecosystem.

I filed a PR at
[mysticatea/eslint-plugin-node#110](https://github.com/mysticatea/eslint-plugin-node/pull/110) to
partially fix that (for cases when that lint rule is used), but it is a semver-major change for
linter rules and presets, so it would take significant time for that to reach actual setups.
_It also hasn't been released yet (2018-03-20)._

Also, `safer-buffer` discourages the usage of `.allocUnsafe()`, which is often done by a mistake.
It still supports it with an explicit concern barier, by placing it under
`require('safer-buffer/dangereous')`.

## But isn't throwing bad?

Not really. It's an error that could be noticed and fixed early, instead of causing havoc later like
unguarded `new Buffer()` calls that end up receiving user input can do.

This package affects only the files where `var Buffer = require('safer-buffer').Buffer` was done, so
it is really simple to keep track of things and make sure that you don't mix old API usage with that.
Also, CI should hint anything that you might have missed.

New commits, if tested, won't land new usage of unsafe Buffer API this way.
_Node.js 10.x also deals with that by printing a runtime depecation warning._

### Would it affect third-party modules?

No, unless you explicitly do an awful thing like monkey-patching or overriding the built-in `Buffer`.
Don't do that.

### But I don't want throwingâ€¦

That is also fine!

Also, it could be better in some cases when you don't comprehensive enough test coverage.

In that case â€” just don't override `Buffer` and use
`var SaferBuffer = require('safer-buffer').Buffer` instead.

That way, everything using `Buffer` natively would still work, but there would be two drawbacks:

* `Buffer.from`/`Buffer.alloc` won't be polyfilled â€” use `SaferBuffer.from` and
  `SaferBuffer.alloc` instead.
* You are still open to accidentally using the insecure deprecated API â€” use a linter to catch that.

Note that using a linter to catch accidential `Buffer` constructor usage in this case is strongly
recommended. `Buffer` is not overriden in this usecase, so linters won't get confused.

## Â«Without footgunsÂ»?

Well, it is still possible to do _some_ things with `Buffer` API, e.g. accessing `.buffer` property
on older versions and duping things from there. You shouldn't do that in your code, probabably.

The intention is to remove the most significant footguns that affect lots of packages in the
ecosystem, and to do it in the proper way.

Also, this package doesn't protect against security issues affecting some Node.js versions, so for
usage in your own production code, it is still recommended to update to a Node.js version
[supported by upstream](https://github.com/nodejs/release#release-schedule).
/* eslint-disable node/no-deprecated-api */

'use strict'

var buffer = require('buffer')
var Buffer = buffer.Buffer
var safer = require('./safer.js')
var Safer = safer.Buffer

var dangerous = {}

var key

for (key in safer) {
  if (!safer.hasOwnProperty(key)) continue
  dangerous[key] = safer[key]
}

var Dangereous = dangerous.Buffer = {}

// Copy Safer API
for (key in Safer) {
  if (!Safer.hasOwnProperty(key)) continue
  Dangereous[key] = Safer[key]
}

// Copy those missing unsafe methods, if they are present
for (key in Buffer) {
  if (!Buffer.hasOwnProperty(key)) continue
  if (Dangereous.hasOwnProperty(key)) continue
  Dangereous[key] = Buffer[key]
}

if (!Dangereous.allocUnsafe) {
  Dangereous.allocUnsafe = function (size) {
    if (typeof size !== 'number') {
      throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size)
    }
    if (size < 0 || size >= 2 * (1 << 30)) {
      throw new RangeError('The value "' + size + '" is invalid for option "size"')
    }
    return Buffer(size)
  }
}

if (!Dangereous.allocUnsafeSlow) {
  Dangereous.allocUnsafeSlow = function (size) {
    if (typeof size !== 'number') {
      throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size)
    }
    if (size < 0 || size >= 2 * (1 << 30)) {
      throw new RangeError('The value "' + size + '" is invalid for option "size"')
    }
    return buffer.SlowBuffer(size)
  }
}

module.exports = dangerous
{
  "author": {
    "name": "Nikita Skovoroda",
    "email": "chalkerx@gmail.com",
    "url": "https://github.com/ChALkeR"
  },
  "deprecated": false,
  "description": "Modern Buffer API polyfill without footguns",
  "devDependencies": {
    "standard": "^11.0.1",
    "tape": "^4.9.0"
  },
  "files": [
    "Porting-Buffer.md",
    "Readme.md",
    "tests.js",
    "dangerous.js",
    "safer.js"
  ],
  "homepage": "https://github.com/ChALkeR/safer-buffer#readme",
  "license": "MIT",
  "main": "safer.js",
  "name": "safer-buffer",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ChALkeR/safer-buffer.git"
  },
  "version": "2.1.2"
}/* eslint-disable node/no-deprecated-api */

'use strict'

var buffer = require('buffer')
var Buffer = buffer.Buffer

var safer = {}

var key

for (key in buffer) {
  if (!buffer.hasOwnProperty(key)) continue
  if (key === 'SlowBuffer' || key === 'Buffer') continue
  safer[key] = buffer[key]
}

var Safer = safer.Buffer = {}
for (key in Buffer) {
  if (!Buffer.hasOwnProperty(key)) continue
  if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue
  Safer[key] = Buffer[key]
}

safer.Buffer.prototype = Buffer.prototype

if (!Safer.from || Safer.from === Uint8Array.from) {
  Safer.from = function (value, encodingOrOffset, length) {
    if (typeof value === 'number') {
      throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value)
    }
    if (value && typeof value.length === 'undefined') {
      throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value)
    }
    return Buffer(value, encodingOrOffset, length)
  }
}

if (!Safer.alloc) {
  Safer.alloc = function (size, fill, encoding) {
    if (typeof size !== 'number') {
      throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size)
    }
    if (size < 0 || size >= 2 * (1 << 30)) {
      throw new RangeError('The value "' + size + '" is invalid for option "size"')
    }
    var buf = Buffer(size)
    if (!fill || fill.length === 0) {
      buf.fill(0)
    } else if (typeof encoding === 'string') {
      buf.fill(fill, encoding)
    } else {
      buf.fill(fill)
    }
    return buf
  }
}

if (!safer.kStringMaxLength) {
  try {
    safer.kStringMaxLength = process.binding('buffer').kStringMaxLength
  } catch (e) {
    // we can't determine kStringMaxLength in environments where process.binding
    // is unsupported, so let's not set it
  }
}

if (!safer.constants) {
  safer.constants = {
    MAX_LENGTH: safer.kMaxLength
  }
  if (safer.kStringMaxLength) {
    safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength
  }
}

module.exports = safer
/* eslint-disable node/no-deprecated-api */

'use strict'

var test = require('tape')

var buffer = require('buffer')

var index = require('./')
var safer = require('./safer')
var dangerous = require('./dangerous')

/* Inheritance tests */

test('Default is Safer', function (t) {
  t.equal(index, safer)
  t.notEqual(safer, dangerous)
  t.notEqual(index, dangerous)
  t.end()
})

test('Is not a function', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(typeof impl, 'object')
    t.equal(typeof impl.Buffer, 'object')
  });
  [buffer].forEach(function (impl) {
    t.equal(typeof impl, 'object')
    t.equal(typeof impl.Buffer, 'function')
  })
  t.end()
})

test('Constructor throws', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.throws(function () { impl.Buffer() })
    t.throws(function () { impl.Buffer(0) })
    t.throws(function () { impl.Buffer('a') })
    t.throws(function () { impl.Buffer('a', 'utf-8') })
    t.throws(function () { return new impl.Buffer() })
    t.throws(function () { return new impl.Buffer(0) })
    t.throws(function () { return new impl.Buffer('a') })
    t.throws(function () { return new impl.Buffer('a', 'utf-8') })
  })
  t.end()
})

test('Safe methods exist', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(typeof impl.Buffer.alloc, 'function', 'alloc')
    t.equal(typeof impl.Buffer.from, 'function', 'from')
  })
  t.end()
})

test('Unsafe methods exist only in Dangerous', function (t) {
  [index, safer].forEach(function (impl) {
    t.equal(typeof impl.Buffer.allocUnsafe, 'undefined')
    t.equal(typeof impl.Buffer.allocUnsafeSlow, 'undefined')
  });
  [dangerous].forEach(function (impl) {
    t.equal(typeof impl.Buffer.allocUnsafe, 'function')
    t.equal(typeof impl.Buffer.allocUnsafeSlow, 'function')
  })
  t.end()
})

test('Generic methods/properties are defined and equal', function (t) {
  ['poolSize', 'isBuffer', 'concat', 'byteLength'].forEach(function (method) {
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl.Buffer[method], buffer.Buffer[method], method)
      t.notEqual(typeof impl.Buffer[method], 'undefined', method)
    })
  })
  t.end()
})

test('Built-in buffer static methods/properties are inherited', function (t) {
  Object.keys(buffer).forEach(function (method) {
    if (method === 'SlowBuffer' || method === 'Buffer') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl[method], buffer[method], method)
      t.notEqual(typeof impl[method], 'undefined', method)
    })
  })
  t.end()
})

test('Built-in Buffer static methods/properties are inherited', function (t) {
  Object.keys(buffer.Buffer).forEach(function (method) {
    if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl.Buffer[method], buffer.Buffer[method], method)
      t.notEqual(typeof impl.Buffer[method], 'undefined', method)
    })
  })
  t.end()
})

test('.prototype property of Buffer is inherited', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(impl.Buffer.prototype, buffer.Buffer.prototype, 'prototype')
    t.notEqual(typeof impl.Buffer.prototype, 'undefined', 'prototype')
  })
  t.end()
})

test('All Safer methods are present in Dangerous', function (t) {
  Object.keys(safer).forEach(function (method) {
    if (method === 'Buffer') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl[method], safer[method], method)
      if (method !== 'kStringMaxLength') {
        t.notEqual(typeof impl[method], 'undefined', method)
      }
    })
  })
  Object.keys(safer.Buffer).forEach(function (method) {
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl.Buffer[method], safer.Buffer[method], method)
      t.notEqual(typeof impl.Buffer[method], 'undefined', method)
    })
  })
  t.end()
})

test('Safe methods from Dangerous methods are present in Safer', function (t) {
  Object.keys(dangerous).forEach(function (method) {
    if (method === 'Buffer') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl[method], dangerous[method], method)
      if (method !== 'kStringMaxLength') {
        t.notEqual(typeof impl[method], 'undefined', method)
      }
    })
  })
  Object.keys(dangerous.Buffer).forEach(function (method) {
    if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl.Buffer[method], dangerous.Buffer[method], method)
      t.notEqual(typeof impl.Buffer[method], 'undefined', method)
    })
  })
  t.end()
})

/* Behaviour tests */

test('Methods return Buffers', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0)))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 10)))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 'a')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10)))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10, 'x')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(9, 'ab')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string', 'utf-8')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([0, 42, 3])))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(new Uint8Array([0, 42, 3]))))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([])))
  });
  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {
    t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](0)))
    t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](10)))
  })
  t.end()
})

test('Constructor is buffer.Buffer', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(impl.Buffer.alloc(0).constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(0, 10).constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(0, 'a').constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(10).constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(10, 'x').constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(9, 'ab').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from('').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from('string').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from('string', 'utf-8').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from([0, 42, 3]).constructor, buffer.Buffer)
    t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).constructor, buffer.Buffer)
    t.equal(impl.Buffer.from([]).constructor, buffer.Buffer)
  });
  [0, 10, 100].forEach(function (arg) {
    t.equal(dangerous.Buffer.allocUnsafe(arg).constructor, buffer.Buffer)
    t.equal(dangerous.Buffer.allocUnsafeSlow(arg).constructor, buffer.SlowBuffer(0).constructor)
  })
  t.end()
})

test('Invalid calls throw', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.throws(function () { impl.Buffer.from(0) })
    t.throws(function () { impl.Buffer.from(10) })
    t.throws(function () { impl.Buffer.from(10, 'utf-8') })
    t.throws(function () { impl.Buffer.from('string', 'invalid encoding') })
    t.throws(function () { impl.Buffer.from(-10) })
    t.throws(function () { impl.Buffer.from(1e90) })
    t.throws(function () { impl.Buffer.from(Infinity) })
    t.throws(function () { impl.Buffer.from(-Infinity) })
    t.throws(function () { impl.Buffer.from(NaN) })
    t.throws(function () { impl.Buffer.from(null) })
    t.throws(function () { impl.Buffer.from(undefined) })
    t.throws(function () { impl.Buffer.from() })
    t.throws(function () { impl.Buffer.from({}) })
    t.throws(function () { impl.Buffer.alloc('') })
    t.throws(function () { impl.Buffer.alloc('string') })
    t.throws(function () { impl.Buffer.alloc('string', 'utf-8') })
    t.throws(function () { impl.Buffer.alloc('b25ldHdvdGhyZWU=', 'base64') })
    t.throws(function () { impl.Buffer.alloc(-10) })
    t.throws(function () { impl.Buffer.alloc(1e90) })
    t.throws(function () { impl.Buffer.alloc(2 * (1 << 30)) })
    t.throws(function () { impl.Buffer.alloc(Infinity) })
    t.throws(function () { impl.Buffer.alloc(-Infinity) })
    t.throws(function () { impl.Buffer.alloc(null) })
    t.throws(function () { impl.Buffer.alloc(undefined) })
    t.throws(function () { impl.Buffer.alloc() })
    t.throws(function () { impl.Buffer.alloc([]) })
    t.throws(function () { impl.Buffer.alloc([0, 42, 3]) })
    t.throws(function () { impl.Buffer.alloc({}) })
  });
  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {
    t.throws(function () { dangerous.Buffer[method]('') })
    t.throws(function () { dangerous.Buffer[method]('string') })
    t.throws(function () { dangerous.Buffer[method]('string', 'utf-8') })
    t.throws(function () { dangerous.Buffer[method](2 * (1 << 30)) })
    t.throws(function () { dangerous.Buffer[method](Infinity) })
    if (dangerous.Buffer[method] === buffer.Buffer.allocUnsafe) {
      t.skip('Skipping, older impl of allocUnsafe coerced negative sizes to 0')
    } else {
      t.throws(function () { dangerous.Buffer[method](-10) })
      t.throws(function () { dangerous.Buffer[method](-1e90) })
      t.throws(function () { dangerous.Buffer[method](-Infinity) })
    }
    t.throws(function () { dangerous.Buffer[method](null) })
    t.throws(function () { dangerous.Buffer[method](undefined) })
    t.throws(function () { dangerous.Buffer[method]() })
    t.throws(function () { dangerous.Buffer[method]([]) })
    t.throws(function () { dangerous.Buffer[method]([0, 42, 3]) })
    t.throws(function () { dangerous.Buffer[method]({}) })
  })
  t.end()
})

test('Buffers have appropriate lengths', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(impl.Buffer.alloc(0).length, 0)
    t.equal(impl.Buffer.alloc(10).length, 10)
    t.equal(impl.Buffer.from('').length, 0)
    t.equal(impl.Buffer.from('string').length, 6)
    t.equal(impl.Buffer.from('string', 'utf-8').length, 6)
    t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').length, 11)
    t.equal(impl.Buffer.from([0, 42, 3]).length, 3)
    t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).length, 3)
    t.equal(impl.Buffer.from([]).length, 0)
  });
  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {
    t.equal(dangerous.Buffer[method](0).length, 0)
    t.equal(dangerous.Buffer[method](10).length, 10)
  })
  t.end()
})

test('Buffers have appropriate lengths (2)', function (t) {
  t.equal(index.Buffer.alloc, safer.Buffer.alloc)
  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)
  var ok = true;
  [ safer.Buffer.alloc,
    dangerous.Buffer.allocUnsafe,
    dangerous.Buffer.allocUnsafeSlow
  ].forEach(function (method) {
    for (var i = 0; i < 1e2; i++) {
      var length = Math.round(Math.random() * 1e5)
      var buf = method(length)
      if (!buffer.Buffer.isBuffer(buf)) ok = false
      if (buf.length !== length) ok = false
    }
  })
  t.ok(ok)
  t.end()
})

test('.alloc(size) is zero-filled and has correct length', function (t) {
  t.equal(index.Buffer.alloc, safer.Buffer.alloc)
  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)
  var ok = true
  for (var i = 0; i < 1e2; i++) {
    var length = Math.round(Math.random() * 2e6)
    var buf = index.Buffer.alloc(length)
    if (!buffer.Buffer.isBuffer(buf)) ok = false
    if (buf.length !== length) ok = false
    var j
    for (j = 0; j < length; j++) {
      if (buf[j] !== 0) ok = false
    }
    buf.fill(1)
    for (j = 0; j < length; j++) {
      if (buf[j] !== 1) ok = false
    }
  }
  t.ok(ok)
  t.end()
})

test('.allocUnsafe / .allocUnsafeSlow are fillable and have correct lengths', function (t) {
  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {
    var ok = true
    for (var i = 0; i < 1e2; i++) {
      var length = Math.round(Math.random() * 2e6)
      var buf = dangerous.Buffer[method](length)
      if (!buffer.Buffer.isBuffer(buf)) ok = false
      if (buf.length !== length) ok = false
      buf.fill(0, 0, length)
      var j
      for (j = 0; j < length; j++) {
        if (buf[j] !== 0) ok = false
      }
      buf.fill(1, 0, length)
      for (j = 0; j < length; j++) {
        if (buf[j] !== 1) ok = false
      }
    }
    t.ok(ok, method)
  })
  t.end()
})

test('.alloc(size, fill) is `fill`-filled', function (t) {
  t.equal(index.Buffer.alloc, safer.Buffer.alloc)
  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)
  var ok = true
  for (var i = 0; i < 1e2; i++) {
    var length = Math.round(Math.random() * 2e6)
    var fill = Math.round(Math.random() * 255)
    var buf = index.Buffer.alloc(length, fill)
    if (!buffer.Buffer.isBuffer(buf)) ok = false
    if (buf.length !== length) ok = false
    for (var j = 0; j < length; j++) {
      if (buf[j] !== fill) ok = false
    }
  }
  t.ok(ok)
  t.end()
})

test('.alloc(size, fill) is `fill`-filled', function (t) {
  t.equal(index.Buffer.alloc, safer.Buffer.alloc)
  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)
  var ok = true
  for (var i = 0; i < 1e2; i++) {
    var length = Math.round(Math.random() * 2e6)
    var fill = Math.round(Math.random() * 255)
    var buf = index.Buffer.alloc(length, fill)
    if (!buffer.Buffer.isBuffer(buf)) ok = false
    if (buf.length !== length) ok = false
    for (var j = 0; j < length; j++) {
      if (buf[j] !== fill) ok = false
    }
  }
  t.ok(ok)
  t.deepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 97))
  t.notDeepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 98))

  var tmp = new buffer.Buffer(2)
  tmp.fill('ok')
  if (tmp[1] === tmp[0]) {
    // Outdated Node.js
    t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('ooooo'))
  } else {
    t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('okoko'))
  }
  t.notDeepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('kokok'))

  t.end()
})

test('safer.Buffer.from returns results same as Buffer constructor', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.deepEqual(impl.Buffer.from(''), new buffer.Buffer(''))
    t.deepEqual(impl.Buffer.from('string'), new buffer.Buffer('string'))
    t.deepEqual(impl.Buffer.from('string', 'utf-8'), new buffer.Buffer('string', 'utf-8'))
    t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), new buffer.Buffer('b25ldHdvdGhyZWU=', 'base64'))
    t.deepEqual(impl.Buffer.from([0, 42, 3]), new buffer.Buffer([0, 42, 3]))
    t.deepEqual(impl.Buffer.from(new Uint8Array([0, 42, 3])), new buffer.Buffer(new Uint8Array([0, 42, 3])))
    t.deepEqual(impl.Buffer.from([]), new buffer.Buffer([]))
  })
  t.end()
})

test('safer.Buffer.from returns consistent results', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.deepEqual(impl.Buffer.from(''), impl.Buffer.alloc(0))
    t.deepEqual(impl.Buffer.from([]), impl.Buffer.alloc(0))
    t.deepEqual(impl.Buffer.from(new Uint8Array([])), impl.Buffer.alloc(0))
    t.deepEqual(impl.Buffer.from('string', 'utf-8'), impl.Buffer.from('string'))
    t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from([115, 116, 114, 105, 110, 103]))
    t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from(impl.Buffer.from('string')))
    t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), impl.Buffer.from('onetwothree'))
    t.notDeepEqual(impl.Buffer.from('b25ldHdvdGhyZWU='), impl.Buffer.from('onetwothree'))
  })
  t.end()
})
loopback: airtap.local
browsers:
  - name: chrome
    version: latest
  - name: firefox
    version: latest
  - name: ie
    version: latest
  - name: microsoftedge
    version: latest
  - name: safari
    version: latest
  - name: iphone
    version: latest
  - name: android
    version: latest
[submodule "big-list-of-naughty-strings"]
	path = vendor/big-list-of-naughty-strings
	url = https://github.com/minimaxir/big-list-of-naughty-strings.git
Parsha Pourkhomami <parshap@gmail.com>
Joel Mukuthu <joelmukuthu@gmail.com>
## 1.2.0

Check for reserved Windows filenames (`CON`, `PRN`, `AUX`, `NUL`,
`COM1`, `LPT1`, etc). See [1].

[1] https://github.com/parshap/node-sanitize-filename/issues/9
This project is licensed under the [WTFPL][] and [ISC][] licenses.

[WTFPL]: https://en.wikipedia.org/wiki/WTFPL
[ISC]: https://opensource.org/licenses/ISC

## WTFPL

DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004

Copyright (C) 2004 Sam Hocevar \<sam@hocevar.net>

Everyone is permitted to copy and distribute verbatim or modified copies
of this license document, and changing it is allowed as long as the name
is changed.

DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR
COPYING, DISTRIBUTION AND MODIFICATION

0. You just DO WHAT THE FUCK YOU WANT TO.

## ISC

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
/*jshint node:true*/
'use strict';

/**
 * Replaces characters in strings that are illegal/unsafe for filenames.
 * Unsafe characters are either removed or replaced by a substitute set
 * in the optional `options` object.
 *
 * Illegal Characters on Various Operating Systems
 * / ? < > \ : * | "
 * https://kb.acronis.com/content/39790
 *
 * Unicode Control codes
 * C0 0x00-0x1f & C1 (0x80-0x9f)
 * http://en.wikipedia.org/wiki/C0_and_C1_control_codes
 *
 * Reserved filenames on Unix-based systems (".", "..")
 * Reserved filenames in Windows ("CON", "PRN", "AUX", "NUL", "COM1",
 * "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9",
 * "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", and
 * "LPT9") case-insesitively and with or without filename extensions.
 *
 * Capped at 255 characters in length.
 * http://unix.stackexchange.com/questions/32795/what-is-the-maximum-allowed-filename-and-folder-size-with-ecryptfs
 *
 * @param  {String} input   Original filename
 * @param  {Object} options {replacement: String | Function }
 * @return {String}         Sanitized filename
 */

var truncate = require("truncate-utf8-bytes");

var illegalRe = /[\/\?<>\\:\*\|"]/g;
var controlRe = /[\x00-\x1f\x80-\x9f]/g;
var reservedRe = /^\.+$/;
var windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i;
var windowsTrailingRe = /[\. ]+$/;

function sanitize(input, replacement) {
  if (typeof input !== 'string') {
    throw new Error('Input must be string');
  }
  var sanitized = input
    .replace(illegalRe, replacement)
    .replace(controlRe, replacement)
    .replace(reservedRe, replacement)
    .replace(windowsReservedRe, replacement)
    .replace(windowsTrailingRe, replacement);
  return truncate(sanitized, 255);
}

module.exports = function (input, options) {
  var replacement = (options && options.replacement) || '';
  var output = sanitize(input, replacement);
  if (replacement === '') {
    return output;
  }
  return sanitize(output, '');
};
{
  "author": {
    "name": "Parsha Pourkhomami"
  },
  "dependencies": {
    "truncate-utf8-bytes": "^1.0.0"
  },
  "deprecated": false,
  "description": "Sanitize a string for use as a filename",
  "devDependencies": {
    "airtap": "^2.0.3",
    "browserify": "^14.0.0",
    "concat-stream": "^1.5.1",
    "mktemp": "^0.4.0",
    "tape": "^4.2.2"
  },
  "homepage": "https://github.com/parshap/node-sanitize-filename#readme",
  "license": "WTFPL OR ISC",
  "main": "index.js",
  "name": "sanitize-filename",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/parshap/node-sanitize-filename.git"
  },
  "types": "index.d.ts",
  "version": "1.6.3"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

====

`String.fromCodePoint` by Mathias Bynens used according to terms of MIT
License, as follows:

    Copyright Mathias Bynens <https://mathiasbynens.be/>

    Permission is hereby granted, free of charge, to any person obtaining
    a copy of this software and associated documentation files (the
    "Software"), to deal in the Software without restriction, including
    without limitation the rights to use, copy, modify, merge, publish,
    distribute, sublicense, and/or sell copies of the Software, and to
    permit persons to whom the Software is furnished to do so, subject to
    the following conditions:

    The above copyright notice and this permission notice shall be
    included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta name="generator" content="HTML Tidy for Mac OS X (vers 31 October 2006 - Apple Inc. build 13), see www.w3.org" /><title>W3C Software Notice and License</title><link rel="stylesheet" href="/2008/site/css/minimum" type="text/css" media="handheld, all" /><style type="text/css" media="print, screen and (min-width: 481px)" xml:space="preserve">
     @import url("/2008/site/css/advanced");
</style><link href="/2008/site/css/minimum" rel="stylesheet" type="text/css" media="handheld, only screen and (max-device-width: 480px)" /><meta name="viewport" content="width=device-width" /><link rel="stylesheet" href="/2008/site/css/print" type="text/css" media="print" /><link rel="shortcut icon" href="/2008/site/images/favicon.ico" type="image/x-icon" /></head><body id="www-w3-org" class="w3c_public"><div id="w3c_container">
    
    

         <div id="w3c_mast">
            <h1 class="logo">
               <a tabindex="2" accesskey="1" href="/"><img src="/2008/site/images/logo-w3c-mobile-lg" width="90" height="53" alt="W3C" /></a>
               <span class="alt-logo">W3C</span>
            </h1>

            <div id="w3c_nav">
               
               

               <form action="/Help/search" method="get" enctype="application/x-www-form-urlencoded"><div class="w3c_sec_nav"><!-- --></div><ul class="main_nav"><li class="first-item">
                        <a href="/standards/">Standards</a>
                     </li><li>
                        <a href="/participate/">Participate</a>
                     </li><li>
                        <a href="/Consortium/membership">Membership</a>
                     </li><li class="last-item">
                        <a href="/Consortium/">About W3C</a>
                     </li><li class="search-item">
                        <div id="search-form">
                           <input tabindex="3" class="text" name="q" value="" title="Search" type="text" />
                           <button id="search-submit" name="search-submit" type="submit"><img class="submit" src="/2008/site/images/search-button" alt="Search" width="21" height="17" /></button>
                        </div>
                     </li></ul></form>
            </div>
            
         </div>
         

         <div id="w3c_main">
            <div id="w3c_logo_shadow" class="w3c_leftCol">
               <img height="32" alt="" src="/2008/site/images/logo-shadow" />
            </div>
            
            <div class="w3c_leftCol"><h2 class="offscreen">Site Navigation</h2>
    <h3 class="category"><span class="ribbon"><a href="/Consortium/Legal/ipr-notice.html" title="Up to Policies and Legal Information">Policies and Legal Information <img src="/2008/site/images/header-link" alt="Header link" width="13" height="13" class="header-link" /></a></span></h3>
       <ul class="theme">
        <li><a href="/Consortium/Legal/2008/04-testsuite-copyright.html">Licenses for W3C Test Suites</a></li>
        <li><a href="/2004/10/27-testcases.html">Policies for Contribution of Test Cases to W3C</a></li>
        <li><a href="/Consortium/Legal/IPR-FAQ-20000620.html">Intellectual Rights FAQ</a></li>
        <li><a href="/Consortium/Legal/privacy-statement-20000612.html">W3C Privacy Statements</a></li>
        <li><a href="/Consortium/Legal/2002/copyright-documents-20021231.html">W3C Document License</a></li>
        <li><a href="/Consortium/Legal/2002/trademarks-20021231.html">W3C Trademarks and Generic Terms</a></li>
        <li><a href="/Consortium/Legal/2002/trademark-license-20021231.html">W3C&#xAE; Trademark and Service Mark License</a></li>
        <li><a class="current">W3C Software Notice and License</a></li>
        <li><a href="/Consortium/Legal/2002/collaborators-agreement-20021231.html">W3C Invited Expert and Collaborators Agreement</a></li>
        <li><a href="/Consortium/Persistence.html">W3C URI Persistence Policy</a></li>
        <li><a href="/1999/10/21-mirroring-policy.html">Mirroring the W3C Site</a></li>
        <li><a href="/Consortium/Legal/2006/08-copyright-translations.html">Translations of the Copyright Notice</a></li>
       </ul>
       <br /></div>
            <div class="w3c_mainCol">
               <div id="w3c_crumbs">
       <div id="w3c_crumbs_frame">
        <ul class="bct"> <!-- .bct / Breadcrumbs -->
          <li class="skip"><a tabindex="1" accesskey="2" title="Skip to content (e.g., when browsing via audio)" href="#w3c_content_body">Skip</a></li>
          <li><a href="/">W3C</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
          <li><a href="/Consortium/">About&#xA0;W3C</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
          <li><a href="/Consortium/facts.html">Facts&#xA0;About&#xA0;W3C</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
          <li><a href="/Consortium/Legal/ipr-notice.html">Policies&#xA0;and&#xA0;Legal&#xA0;Information</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
          <li class="current">W3C Software Notice and License</li>
        </ul>            
     </div>
    </div>
               <h1 class="title">W3C Software Notice and License</h1>
               <div id="w3c_content_body">
                  <div class="line">
                     <p class="intro tPadding">This work (and included software, documentation such as READMEs, or other
related items) is being provided by the copyright holders under the following
license.</p>
<h2>License</h2>
                     
                     <p class="tPadding">
By obtaining, using and/or copying this work, you (the licensee)
agree that you have read, understood, and will comply with the following
terms and conditions.</p>

                     <p>Permission to copy, modify, and distribute this software and its
documentation, with or without modification,&#xA0;for any purpose and without
fee or royalty is hereby granted, provided that you include the following on
ALL copies of the software and documentation or portions thereof, including
modifications:</p>

                     <ul class="show_items"><li>The full text of this NOTICE in a location viewable to users of the
    redistributed or derivative work.</li><li>Any pre-existing intellectual property disclaimers, notices, or terms
    and conditions. If none exist, the <a href="copyright-software-short-notice-20021231.html">W3C Software Short
    Notice</a> should be included (hypertext is preferred, text is permitted)
    within the body of any redistributed or derivative code.</li><li>Notice of any changes or modifications to the files, including the date
    changes were made. (We recommend you provide URIs to the location from
    which the code is derived.)</li></ul>

<h2>Disclaimers</h2>

                     <p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE
ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>

                     <p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
DOCUMENTATION.</p>

                     <p>The name and trademarks of copyright holders may NOT be used in
advertising or publicity pertaining to the software without specific, written
prior permission. Title to copyright in this software and any associated
documentation will at all times remain with copyright holders.</p>

                     <h2>Notes</h2>

	                    <p>This version: http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231</p>

                     <p>This formulation of W3C's notice and license became active on December 31
2002. This version removes the copyright ownership notice such that this
license can be used with materials other than those owned by the W3C,
reflects that ERCIM is now a host of the W3C, includes references to this
specific dated version of the license, and removes the ambiguous grant of
"use". Otherwise, this version is the same as the <a href="http://www.w3.org/Consortium/Legal/copyright-software-19980720">previous
version</a> and is written so as to preserve the <a href="http://www.gnu.org/philosophy/license-list.html#GPLCompatibleLicenses">Free
Software Foundation's assessment of GPL compatibility</a> and <a href="http://www.opensource.org/licenses/W3C.php">OSI's certification</a>
under the <a href="http://www.opensource.org/docs/definition.php">Open Source
Definition</a>.</p>
                  </div>
               </div>
            </div>
         </div>
         
         
         
      </div><div id="w3c_footer">
         <div id="w3c_footer-inner">
            <h2 class="offscreen">Footer Navigation</h2>
            <div class="w3c_footer-nav">
               <h3>Navigation</h3>
               <ul class="footer_top_nav"><li>
                     <a href="/">Home</a>
                  </li><li>
                     <a href="/standards/">Standards</a>
                  </li><li>
                     <a href="/participate/">Participate</a>
                  </li><li>
                     <a href="/Consortium/membership">Membership</a>
                  </li><li class="last-item">
                     <a href="/Consortium/">About W3C</a>
                  </li></ul>
            </div>
            <div class="w3c_footer-nav">
               <h3>Contact W3C</h3>
               <ul class="footer_bottom_nav"><li>
                     <a href="/Consortium/contact">Contact</a>
                  </li><li>
                     <a accesskey="0" href="/Help/">Help and FAQ</a>
                  </li><li>
                     <a href="/Consortium/sponsor/">Sponsor / Donate</a>
                  </li><li>
                     <a href="/Consortium/siteindex">Site Map</a>
                  </li><li>
                     <address id="w3c_signature">
                        <a href="http://lists.w3.org/Archives/Public/site-comments/">Feedback</a></address>
                  </li></ul>
            </div>
            <div class="w3c_footer-nav">
               <h3>W3C Updates</h3>
               <ul class="footer_follow_nav"><li>
                     <a href="http://twitter.com/W3C" title="Follow W3C on Twitter">
                        <img src="/2008/site/images/twitter-bird" alt="Twitter" width="78" height="83" class="social-icon" />
                     </a>
                     <a href="http://identi.ca/w3c" title="See W3C on Identica">
                        <img src="/2008/site/images/identica-logo" alt="Identica" width="91" height="83" class="social-icon" />
                     </a>
                  </li></ul>
            </div>
            <p class="copyright">Copyright &#xA9; 2012 W3C <sup>&#xAE;</sup> (<a href="http://www.csail.mit.edu/">
                  <acronym title="Massachusetts Institute of Technology">MIT</acronym>
               </a>, <a href="http://www.ercim.org/">
                  <acronym title="European Research Consortium for Informatics and Mathematics"> ERCIM</acronym>
               </a>, <a href="http://www.keio.ac.jp/">Keio</a>) <a href="/Consortium/Legal/ipr-notice">Usage policies apply</a>.</p>
         </div>
      </div><!-- Generated from data/scripts.php, ../../smarty/{scripts.tpl} --><!-- At the bottom for performance reasons --><div id="w3c_scripts">
         <script type="text/javascript" src="/2008/site/js/main" xml:space="preserve"><!-- --></script>
      </div></body></html>
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "deprecated": false,
  "description": "An evented streaming XML parser in JavaScript",
  "devDependencies": {
    "standard": "^5.3.1",
    "tap": "^2.1.1"
  },
  "files": [
    "lib/sax.js",
    "LICENSE",
    "LICENSE-W3C.html",
    "README.md"
  ],
  "homepage": "https://github.com/isaacs/sax-js#readme",
  "license": "ISC",
  "main": "lib/sax.js",
  "name": "sax",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/sax-js.git"
  },
  "version": "1.1.4"
};(function (sax) { // wrapper for non-node envs
  sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
  sax.SAXParser = SAXParser
  sax.SAXStream = SAXStream
  sax.createStream = createStream

  // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
  // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
  // since that's the earliest that a buffer overrun could occur.  This way, checks are
  // as rare as required, but as often as necessary to ensure never crossing this bound.
  // Furthermore, buffers are only tested at most once per write(), so passing a very
  // large string into write() might have undesirable effects, but this is manageable by
  // the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme
  // edge case, result in creating at most one complete copy of the string passed in.
  // Set to Infinity to have unlimited buffers.
  sax.MAX_BUFFER_LENGTH = 64 * 1024

  var buffers = [
    'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',
    'procInstName', 'procInstBody', 'entity', 'attribName',
    'attribValue', 'cdata', 'script'
  ]

  sax.EVENTS = [
    'text',
    'processinginstruction',
    'sgmldeclaration',
    'doctype',
    'comment',
    'attribute',
    'opentag',
    'closetag',
    'opencdata',
    'cdata',
    'closecdata',
    'error',
    'end',
    'ready',
    'script',
    'opennamespace',
    'closenamespace'
  ]

  function SAXParser (strict, opt) {
    if (!(this instanceof SAXParser)) {
      return new SAXParser(strict, opt)
    }

    var parser = this
    clearBuffers(parser)
    parser.q = parser.c = ''
    parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
    parser.opt = opt || {}
    parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
    parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'
    parser.tags = []
    parser.closed = parser.closedRoot = parser.sawRoot = false
    parser.tag = parser.error = null
    parser.strict = !!strict
    parser.noscript = !!(strict || parser.opt.noscript)
    parser.state = S.BEGIN
    parser.strictEntities = parser.opt.strictEntities
    parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)
    parser.attribList = []

    // namespaces form a prototype chain.
    // it always points at the current tag,
    // which protos to its parent tag.
    if (parser.opt.xmlns) {
      parser.ns = Object.create(rootNS)
    }

    // mostly just for error reporting
    parser.trackPosition = parser.opt.position !== false
    if (parser.trackPosition) {
      parser.position = parser.line = parser.column = 0
    }
    emit(parser, 'onready')
  }

  if (!Object.create) {
    Object.create = function (o) {
      function F () {}
      F.prototype = o
      var newf = new F()
      return newf
    }
  }

  if (!Object.keys) {
    Object.keys = function (o) {
      var a = []
      for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
      return a
    }
  }

  function checkBufferLength (parser) {
    var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
    var maxActual = 0
    for (var i = 0, l = buffers.length; i < l; i++) {
      var len = parser[buffers[i]].length
      if (len > maxAllowed) {
        // Text/cdata nodes can get big, and since they're buffered,
        // we can get here under normal conditions.
        // Avoid issues by emitting the text node now,
        // so at least it won't get any bigger.
        switch (buffers[i]) {
          case 'textNode':
            closeText(parser)
            break

          case 'cdata':
            emitNode(parser, 'oncdata', parser.cdata)
            parser.cdata = ''
            break

          case 'script':
            emitNode(parser, 'onscript', parser.script)
            parser.script = ''
            break

          default:
            error(parser, 'Max buffer length exceeded: ' + buffers[i])
        }
      }
      maxActual = Math.max(maxActual, len)
    }
    // schedule the next check for the earliest possible buffer overrun.
    var m = sax.MAX_BUFFER_LENGTH - maxActual
    parser.bufferCheckPosition = m + parser.position
  }

  function clearBuffers (parser) {
    for (var i = 0, l = buffers.length; i < l; i++) {
      parser[buffers[i]] = ''
    }
  }

  function flushBuffers (parser) {
    closeText(parser)
    if (parser.cdata !== '') {
      emitNode(parser, 'oncdata', parser.cdata)
      parser.cdata = ''
    }
    if (parser.script !== '') {
      emitNode(parser, 'onscript', parser.script)
      parser.script = ''
    }
  }

  SAXParser.prototype = {
    end: function () { end(this) },
    write: write,
    resume: function () { this.error = null; return this },
    close: function () { return this.write(null) },
    flush: function () { flushBuffers(this) }
  }

  var Stream
  try {
    Stream = require('stream').Stream
  } catch (ex) {
    Stream = function () {}
  }

  var streamWraps = sax.EVENTS.filter(function (ev) {
    return ev !== 'error' && ev !== 'end'
  })

  function createStream (strict, opt) {
    return new SAXStream(strict, opt)
  }

  function SAXStream (strict, opt) {
    if (!(this instanceof SAXStream)) {
      return new SAXStream(strict, opt)
    }

    Stream.apply(this)

    this._parser = new SAXParser(strict, opt)
    this.writable = true
    this.readable = true

    var me = this

    this._parser.onend = function () {
      me.emit('end')
    }

    this._parser.onerror = function (er) {
      me.emit('error', er)

      // if didn't throw, then means error was handled.
      // go ahead and clear error, so we can write again.
      me._parser.error = null
    }

    this._decoder = null

    streamWraps.forEach(function (ev) {
      Object.defineProperty(me, 'on' + ev, {
        get: function () {
          return me._parser['on' + ev]
        },
        set: function (h) {
          if (!h) {
            me.removeAllListeners(ev)
            me._parser['on' + ev] = h
            return h
          }
          me.on(ev, h)
        },
        enumerable: true,
        configurable: false
      })
    })
  }

  SAXStream.prototype = Object.create(Stream.prototype, {
    constructor: {
      value: SAXStream
    }
  })

  SAXStream.prototype.write = function (data) {
    if (typeof Buffer === 'function' &&
      typeof Buffer.isBuffer === 'function' &&
      Buffer.isBuffer(data)) {
      if (!this._decoder) {
        var SD = require('string_decoder').StringDecoder
        this._decoder = new SD('utf8')
      }
      data = this._decoder.write(data)
    }

    this._parser.write(data.toString())
    this.emit('data', data)
    return true
  }

  SAXStream.prototype.end = function (chunk) {
    if (chunk && chunk.length) {
      this.write(chunk)
    }
    this._parser.end()
    return true
  }

  SAXStream.prototype.on = function (ev, handler) {
    var me = this
    if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {
      me._parser['on' + ev] = function () {
        var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)
        args.splice(0, 0, ev)
        me.emit.apply(me, args)
      }
    }

    return Stream.prototype.on.call(me, ev, handler)
  }

  // character classes and tokens
  var whitespace = '\r\n\t '

  // this really needs to be replaced with character classes.
  // XML allows all manner of ridiculous numbers and digits.
  var number = '0124356789'
  var letter = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

  // (Letter | "_" | ":")
  var quote = '\'"'
  var attribEnd = whitespace + '>'
  var CDATA = '[CDATA['
  var DOCTYPE = 'DOCTYPE'
  var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'
  var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'
  var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }

  // turn all the string character sets into character class objects.
  whitespace = charClass(whitespace)
  number = charClass(number)
  letter = charClass(letter)

  // http://www.w3.org/TR/REC-xml/#NT-NameStartChar
  // This implementation works on strings, a single character at a time
  // as such, it cannot ever support astral-plane characters (10000-EFFFF)
  // without a significant breaking change to either this  parser, or the
  // JavaScript language.  Implementation of an emoji-capable xml parser
  // is left as an exercise for the reader.
  var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/

  var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/

  var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
  var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/

  quote = charClass(quote)
  attribEnd = charClass(attribEnd)

  function charClass (str) {
    return str.split('').reduce(function (s, c) {
      s[c] = true
      return s
    }, {})
  }

  function isRegExp (c) {
    return Object.prototype.toString.call(c) === '[object RegExp]'
  }

  function is (charclass, c) {
    return isRegExp(charclass) ? !!c.match(charclass) : charclass[c]
  }

  function not (charclass, c) {
    return !is(charclass, c)
  }

  var S = 0
  sax.STATE = {
    BEGIN: S++, // leading byte order mark or whitespace
    BEGIN_WHITESPACE: S++, // leading whitespace
    TEXT: S++, // general stuff
    TEXT_ENTITY: S++, // &amp and such.
    OPEN_WAKA: S++, // <
    SGML_DECL: S++, // <!BLARG
    SGML_DECL_QUOTED: S++, // <!BLARG foo "bar
    DOCTYPE: S++, // <!DOCTYPE
    DOCTYPE_QUOTED: S++, // <!DOCTYPE "//blah
    DOCTYPE_DTD: S++, // <!DOCTYPE "//blah" [ ...
    DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE "//blah" [ "foo
    COMMENT_STARTING: S++, // <!-
    COMMENT: S++, // <!--
    COMMENT_ENDING: S++, // <!-- blah -
    COMMENT_ENDED: S++, // <!-- blah --
    CDATA: S++, // <![CDATA[ something
    CDATA_ENDING: S++, // ]
    CDATA_ENDING_2: S++, // ]]
    PROC_INST: S++, // <?hi
    PROC_INST_BODY: S++, // <?hi there
    PROC_INST_ENDING: S++, // <?hi "there" ?
    OPEN_TAG: S++, // <strong
    OPEN_TAG_SLASH: S++, // <strong /
    ATTRIB: S++, // <a
    ATTRIB_NAME: S++, // <a foo
    ATTRIB_NAME_SAW_WHITE: S++, // <a foo _
    ATTRIB_VALUE: S++, // <a foo=
    ATTRIB_VALUE_QUOTED: S++, // <a foo="bar
    ATTRIB_VALUE_CLOSED: S++, // <a foo="bar"
    ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar
    ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar="&quot;"
    ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot
    CLOSE_TAG: S++, // </a
    CLOSE_TAG_SAW_WHITE: S++, // </a   >
    SCRIPT: S++, // <script> ...
    SCRIPT_ENDING: S++ // <script> ... <
  }

  sax.XML_ENTITIES = {
    'amp': '&',
    'gt': '>',
    'lt': '<',
    'quot': '"',
    'apos': "'"
  }

  sax.ENTITIES = {
    'amp': '&',
    'gt': '>',
    'lt': '<',
    'quot': '"',
    'apos': "'",
    'AElig': 198,
    'Aacute': 193,
    'Acirc': 194,
    'Agrave': 192,
    'Aring': 197,
    'Atilde': 195,
    'Auml': 196,
    'Ccedil': 199,
    'ETH': 208,
    'Eacute': 201,
    'Ecirc': 202,
    'Egrave': 200,
    'Euml': 203,
    'Iacute': 205,
    'Icirc': 206,
    'Igrave': 204,
    'Iuml': 207,
    'Ntilde': 209,
    'Oacute': 211,
    'Ocirc': 212,
    'Ograve': 210,
    'Oslash': 216,
    'Otilde': 213,
    'Ouml': 214,
    'THORN': 222,
    'Uacute': 218,
    'Ucirc': 219,
    'Ugrave': 217,
    'Uuml': 220,
    'Yacute': 221,
    'aacute': 225,
    'acirc': 226,
    'aelig': 230,
    'agrave': 224,
    'aring': 229,
    'atilde': 227,
    'auml': 228,
    'ccedil': 231,
    'eacute': 233,
    'ecirc': 234,
    'egrave': 232,
    'eth': 240,
    'euml': 235,
    'iacute': 237,
    'icirc': 238,
    'igrave': 236,
    'iuml': 239,
    'ntilde': 241,
    'oacute': 243,
    'ocirc': 244,
    'ograve': 242,
    'oslash': 248,
    'otilde': 245,
    'ouml': 246,
    'szlig': 223,
    'thorn': 254,
    'uacute': 250,
    'ucirc': 251,
    'ugrave': 249,
    'uuml': 252,
    'yacute': 253,
    'yuml': 255,
    'copy': 169,
    'reg': 174,
    'nbsp': 160,
    'iexcl': 161,
    'cent': 162,
    'pound': 163,
    'curren': 164,
    'yen': 165,
    'brvbar': 166,
    'sect': 167,
    'uml': 168,
    'ordf': 170,
    'laquo': 171,
    'not': 172,
    'shy': 173,
    'macr': 175,
    'deg': 176,
    'plusmn': 177,
    'sup1': 185,
    'sup2': 178,
    'sup3': 179,
    'acute': 180,
    'micro': 181,
    'para': 182,
    'middot': 183,
    'cedil': 184,
    'ordm': 186,
    'raquo': 187,
    'frac14': 188,
    'frac12': 189,
    'frac34': 190,
    'iquest': 191,
    'times': 215,
    'divide': 247,
    'OElig': 338,
    'oelig': 339,
    'Scaron': 352,
    'scaron': 353,
    'Yuml': 376,
    'fnof': 402,
    'circ': 710,
    'tilde': 732,
    'Alpha': 913,
    'Beta': 914,
    'Gamma': 915,
    'Delta': 916,
    'Epsilon': 917,
    'Zeta': 918,
    'Eta': 919,
    'Theta': 920,
    'Iota': 921,
    'Kappa': 922,
    'Lambda': 923,
    'Mu': 924,
    'Nu': 925,
    'Xi': 926,
    'Omicron': 927,
    'Pi': 928,
    'Rho': 929,
    'Sigma': 931,
    'Tau': 932,
    'Upsilon': 933,
    'Phi': 934,
    'Chi': 935,
    'Psi': 936,
    'Omega': 937,
    'alpha': 945,
    'beta': 946,
    'gamma': 947,
    'delta': 948,
    'epsilon': 949,
    'zeta': 950,
    'eta': 951,
    'theta': 952,
    'iota': 953,
    'kappa': 954,
    'lambda': 955,
    'mu': 956,
    'nu': 957,
    'xi': 958,
    'omicron': 959,
    'pi': 960,
    'rho': 961,
    'sigmaf': 962,
    'sigma': 963,
    'tau': 964,
    'upsilon': 965,
    'phi': 966,
    'chi': 967,
    'psi': 968,
    'omega': 969,
    'thetasym': 977,
    'upsih': 978,
    'piv': 982,
    'ensp': 8194,
    'emsp': 8195,
    'thinsp': 8201,
    'zwnj': 8204,
    'zwj': 8205,
    'lrm': 8206,
    'rlm': 8207,
    'ndash': 8211,
    'mdash': 8212,
    'lsquo': 8216,
    'rsquo': 8217,
    'sbquo': 8218,
    'ldquo': 8220,
    'rdquo': 8221,
    'bdquo': 8222,
    'dagger': 8224,
    'Dagger': 8225,
    'bull': 8226,
    'hellip': 8230,
    'permil': 8240,
    'prime': 8242,
    'Prime': 8243,
    'lsaquo': 8249,
    'rsaquo': 8250,
    'oline': 8254,
    'frasl': 8260,
    'euro': 8364,
    'image': 8465,
    'weierp': 8472,
    'real': 8476,
    'trade': 8482,
    'alefsym': 8501,
    'larr': 8592,
    'uarr': 8593,
    'rarr': 8594,
    'darr': 8595,
    'harr': 8596,
    'crarr': 8629,
    'lArr': 8656,
    'uArr': 8657,
    'rArr': 8658,
    'dArr': 8659,
    'hArr': 8660,
    'forall': 8704,
    'part': 8706,
    'exist': 8707,
    'empty': 8709,
    'nabla': 8711,
    'isin': 8712,
    'notin': 8713,
    'ni': 8715,
    'prod': 8719,
    'sum': 8721,
    'minus': 8722,
    'lowast': 8727,
    'radic': 8730,
    'prop': 8733,
    'infin': 8734,
    'ang': 8736,
    'and': 8743,
    'or': 8744,
    'cap': 8745,
    'cup': 8746,
    'int': 8747,
    'there4': 8756,
    'sim': 8764,
    'cong': 8773,
    'asymp': 8776,
    'ne': 8800,
    'equiv': 8801,
    'le': 8804,
    'ge': 8805,
    'sub': 8834,
    'sup': 8835,
    'nsub': 8836,
    'sube': 8838,
    'supe': 8839,
    'oplus': 8853,
    'otimes': 8855,
    'perp': 8869,
    'sdot': 8901,
    'lceil': 8968,
    'rceil': 8969,
    'lfloor': 8970,
    'rfloor': 8971,
    'lang': 9001,
    'rang': 9002,
    'loz': 9674,
    'spades': 9824,
    'clubs': 9827,
    'hearts': 9829,
    'diams': 9830
  }

  Object.keys(sax.ENTITIES).forEach(function (key) {
    var e = sax.ENTITIES[key]
    var s = typeof e === 'number' ? String.fromCharCode(e) : e
    sax.ENTITIES[key] = s
  })

  for (var s in sax.STATE) {
    sax.STATE[sax.STATE[s]] = s
  }

  // shorthand
  S = sax.STATE

  function emit (parser, event, data) {
    parser[event] && parser[event](data)
  }

  function emitNode (parser, nodeType, data) {
    if (parser.textNode) closeText(parser)
    emit(parser, nodeType, data)
  }

  function closeText (parser) {
    parser.textNode = textopts(parser.opt, parser.textNode)
    if (parser.textNode) emit(parser, 'ontext', parser.textNode)
    parser.textNode = ''
  }

  function textopts (opt, text) {
    if (opt.trim) text = text.trim()
    if (opt.normalize) text = text.replace(/\s+/g, ' ')
    return text
  }

  function error (parser, er) {
    closeText(parser)
    if (parser.trackPosition) {
      er += '\nLine: ' + parser.line +
        '\nColumn: ' + parser.column +
        '\nChar: ' + parser.c
    }
    er = new Error(er)
    parser.error = er
    emit(parser, 'onerror', er)
    return parser
  }

  function end (parser) {
    if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')
    if ((parser.state !== S.BEGIN) &&
      (parser.state !== S.BEGIN_WHITESPACE) &&
      (parser.state !== S.TEXT)) {
      error(parser, 'Unexpected end')
    }
    closeText(parser)
    parser.c = ''
    parser.closed = true
    emit(parser, 'onend')
    SAXParser.call(parser, parser.strict, parser.opt)
    return parser
  }

  function strictFail (parser, message) {
    if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {
      throw new Error('bad call to strictFail')
    }
    if (parser.strict) {
      error(parser, message)
    }
  }

  function newTag (parser) {
    if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()
    var parent = parser.tags[parser.tags.length - 1] || parser
    var tag = parser.tag = { name: parser.tagName, attributes: {} }

    // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
    if (parser.opt.xmlns) {
      tag.ns = parent.ns
    }
    parser.attribList.length = 0
  }

  function qname (name, attribute) {
    var i = name.indexOf(':')
    var qualName = i < 0 ? [ '', name ] : name.split(':')
    var prefix = qualName[0]
    var local = qualName[1]

    // <x "xmlns"="http://foo">
    if (attribute && name === 'xmlns') {
      prefix = 'xmlns'
      local = ''
    }

    return { prefix: prefix, local: local }
  }

  function attrib (parser) {
    if (!parser.strict) {
      parser.attribName = parser.attribName[parser.looseCase]()
    }

    if (parser.attribList.indexOf(parser.attribName) !== -1 ||
      parser.tag.attributes.hasOwnProperty(parser.attribName)) {
      parser.attribName = parser.attribValue = ''
      return
    }

    if (parser.opt.xmlns) {
      var qn = qname(parser.attribName, true)
      var prefix = qn.prefix
      var local = qn.local

      if (prefix === 'xmlns') {
        // namespace binding attribute. push the binding into scope
        if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {
          strictFail(parser,
            'xml: prefix must be bound to ' + XML_NAMESPACE + '\n' +
            'Actual: ' + parser.attribValue)
        } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {
          strictFail(parser,
            'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\n' +
            'Actual: ' + parser.attribValue)
        } else {
          var tag = parser.tag
          var parent = parser.tags[parser.tags.length - 1] || parser
          if (tag.ns === parent.ns) {
            tag.ns = Object.create(parent.ns)
          }
          tag.ns[local] = parser.attribValue
        }
      }

      // defer onattribute events until all attributes have been seen
      // so any new bindings can take effect. preserve attribute order
      // so deferred events can be emitted in document order
      parser.attribList.push([parser.attribName, parser.attribValue])
    } else {
      // in non-xmlns mode, we can emit the event right away
      parser.tag.attributes[parser.attribName] = parser.attribValue
      emitNode(parser, 'onattribute', {
        name: parser.attribName,
        value: parser.attribValue
      })
    }

    parser.attribName = parser.attribValue = ''
  }

  function openTag (parser, selfClosing) {
    if (parser.opt.xmlns) {
      // emit namespace binding events
      var tag = parser.tag

      // add namespace info to tag
      var qn = qname(parser.tagName)
      tag.prefix = qn.prefix
      tag.local = qn.local
      tag.uri = tag.ns[qn.prefix] || ''

      if (tag.prefix && !tag.uri) {
        strictFail(parser, 'Unbound namespace prefix: ' +
          JSON.stringify(parser.tagName))
        tag.uri = qn.prefix
      }

      var parent = parser.tags[parser.tags.length - 1] || parser
      if (tag.ns && parent.ns !== tag.ns) {
        Object.keys(tag.ns).forEach(function (p) {
          emitNode(parser, 'onopennamespace', {
            prefix: p,
            uri: tag.ns[p]
          })
        })
      }

      // handle deferred onattribute events
      // Note: do not apply default ns to attributes:
      //   http://www.w3.org/TR/REC-xml-names/#defaulting
      for (var i = 0, l = parser.attribList.length; i < l; i++) {
        var nv = parser.attribList[i]
        var name = nv[0]
        var value = nv[1]
        var qualName = qname(name, true)
        var prefix = qualName.prefix
        var local = qualName.local
        var uri = prefix === '' ? '' : (tag.ns[prefix] || '')
        var a = {
          name: name,
          value: value,
          prefix: prefix,
          local: local,
          uri: uri
        }

        // if there's any attributes with an undefined namespace,
        // then fail on them now.
        if (prefix && prefix !== 'xmlns' && !uri) {
          strictFail(parser, 'Unbound namespace prefix: ' +
            JSON.stringify(prefix))
          a.uri = prefix
        }
        parser.tag.attributes[name] = a
        emitNode(parser, 'onattribute', a)
      }
      parser.attribList.length = 0
    }

    parser.tag.isSelfClosing = !!selfClosing

    // process the tag
    parser.sawRoot = true
    parser.tags.push(parser.tag)
    emitNode(parser, 'onopentag', parser.tag)
    if (!selfClosing) {
      // special case for <script> in non-strict mode.
      if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {
        parser.state = S.SCRIPT
      } else {
        parser.state = S.TEXT
      }
      parser.tag = null
      parser.tagName = ''
    }
    parser.attribName = parser.attribValue = ''
    parser.attribList.length = 0
  }

  function closeTag (parser) {
    if (!parser.tagName) {
      strictFail(parser, 'Weird empty close tag.')
      parser.textNode += '</>'
      parser.state = S.TEXT
      return
    }

    if (parser.script) {
      if (parser.tagName !== 'script') {
        parser.script += '</' + parser.tagName + '>'
        parser.tagName = ''
        parser.state = S.SCRIPT
        return
      }
      emitNode(parser, 'onscript', parser.script)
      parser.script = ''
    }

    // first make sure that the closing tag actually exists.
    // <a><b></c></b></a> will close everything, otherwise.
    var t = parser.tags.length
    var tagName = parser.tagName
    if (!parser.strict) {
      tagName = tagName[parser.looseCase]()
    }
    var closeTo = tagName
    while (t--) {
      var close = parser.tags[t]
      if (close.name !== closeTo) {
        // fail the first time in strict mode
        strictFail(parser, 'Unexpected close tag')
      } else {
        break
      }
    }

    // didn't find it.  we already failed for strict, so just abort.
    if (t < 0) {
      strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)
      parser.textNode += '</' + parser.tagName + '>'
      parser.state = S.TEXT
      return
    }
    parser.tagName = tagName
    var s = parser.tags.length
    while (s-- > t) {
      var tag = parser.tag = parser.tags.pop()
      parser.tagName = parser.tag.name
      emitNode(parser, 'onclosetag', parser.tagName)

      var x = {}
      for (var i in tag.ns) {
        x[i] = tag.ns[i]
      }

      var parent = parser.tags[parser.tags.length - 1] || parser
      if (parser.opt.xmlns && tag.ns !== parent.ns) {
        // remove namespace bindings introduced by tag
        Object.keys(tag.ns).forEach(function (p) {
          var n = tag.ns[p]
          emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })
        })
      }
    }
    if (t === 0) parser.closedRoot = true
    parser.tagName = parser.attribValue = parser.attribName = ''
    parser.attribList.length = 0
    parser.state = S.TEXT
  }

  function parseEntity (parser) {
    var entity = parser.entity
    var entityLC = entity.toLowerCase()
    var num
    var numStr = ''

    if (parser.ENTITIES[entity]) {
      return parser.ENTITIES[entity]
    }
    if (parser.ENTITIES[entityLC]) {
      return parser.ENTITIES[entityLC]
    }
    entity = entityLC
    if (entity.charAt(0) === '#') {
      if (entity.charAt(1) === 'x') {
        entity = entity.slice(2)
        num = parseInt(entity, 16)
        numStr = num.toString(16)
      } else {
        entity = entity.slice(1)
        num = parseInt(entity, 10)
        numStr = num.toString(10)
      }
    }
    entity = entity.replace(/^0+/, '')
    if (numStr.toLowerCase() !== entity) {
      strictFail(parser, 'Invalid character entity')
      return '&' + parser.entity + ';'
    }

    return String.fromCodePoint(num)
  }

  function beginWhiteSpace (parser, c) {
    if (c === '<') {
      parser.state = S.OPEN_WAKA
      parser.startTagPosition = parser.position
    } else if (not(whitespace, c)) {
      // have to process this as a text node.
      // weird, but happens.
      strictFail(parser, 'Non-whitespace before first tag.')
      parser.textNode = c
      parser.state = S.TEXT
    }
  }

  function write (chunk) {
    var parser = this
    if (this.error) {
      throw this.error
    }
    if (parser.closed) {
      return error(parser,
        'Cannot write after close. Assign an onready handler.')
    }
    if (chunk === null) {
      return end(parser)
    }
    var i = 0
    var c = ''
    while (true) {
      c = chunk.charAt(i++)
      parser.c = c
      if (!c) {
        break
      }
      if (parser.trackPosition) {
        parser.position++
        if (c === '\n') {
          parser.line++
          parser.column = 0
        } else {
          parser.column++
        }
      }
      switch (parser.state) {
        case S.BEGIN:
          parser.state = S.BEGIN_WHITESPACE
          if (c === '\uFEFF') {
            continue
          }
          beginWhiteSpace(parser, c)
          continue

        case S.BEGIN_WHITESPACE:
          beginWhiteSpace(parser, c)
          continue

        case S.TEXT:
          if (parser.sawRoot && !parser.closedRoot) {
            var starti = i - 1
            while (c && c !== '<' && c !== '&') {
              c = chunk.charAt(i++)
              if (c && parser.trackPosition) {
                parser.position++
                if (c === '\n') {
                  parser.line++
                  parser.column = 0
                } else {
                  parser.column++
                }
              }
            }
            parser.textNode += chunk.substring(starti, i - 1)
          }
          if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {
            parser.state = S.OPEN_WAKA
            parser.startTagPosition = parser.position
          } else {
            if (not(whitespace, c) && (!parser.sawRoot || parser.closedRoot)) {
              strictFail(parser, 'Text data outside of root node.')
            }
            if (c === '&') {
              parser.state = S.TEXT_ENTITY
            } else {
              parser.textNode += c
            }
          }
          continue

        case S.SCRIPT:
          // only non-strict
          if (c === '<') {
            parser.state = S.SCRIPT_ENDING
          } else {
            parser.script += c
          }
          continue

        case S.SCRIPT_ENDING:
          if (c === '/') {
            parser.state = S.CLOSE_TAG
          } else {
            parser.script += '<' + c
            parser.state = S.SCRIPT
          }
          continue

        case S.OPEN_WAKA:
          // either a /, ?, !, or text is coming next.
          if (c === '!') {
            parser.state = S.SGML_DECL
            parser.sgmlDecl = ''
          } else if (is(whitespace, c)) {
            // wait for it...
          } else if (is(nameStart, c)) {
            parser.state = S.OPEN_TAG
            parser.tagName = c
          } else if (c === '/') {
            parser.state = S.CLOSE_TAG
            parser.tagName = ''
          } else if (c === '?') {
            parser.state = S.PROC_INST
            parser.procInstName = parser.procInstBody = ''
          } else {
            strictFail(parser, 'Unencoded <')
            // if there was some whitespace, then add that in.
            if (parser.startTagPosition + 1 < parser.position) {
              var pad = parser.position - parser.startTagPosition
              c = new Array(pad).join(' ') + c
            }
            parser.textNode += '<' + c
            parser.state = S.TEXT
          }
          continue

        case S.SGML_DECL:
          if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {
            emitNode(parser, 'onopencdata')
            parser.state = S.CDATA
            parser.sgmlDecl = ''
            parser.cdata = ''
          } else if (parser.sgmlDecl + c === '--') {
            parser.state = S.COMMENT
            parser.comment = ''
            parser.sgmlDecl = ''
          } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {
            parser.state = S.DOCTYPE
            if (parser.doctype || parser.sawRoot) {
              strictFail(parser,
                'Inappropriately located doctype declaration')
            }
            parser.doctype = ''
            parser.sgmlDecl = ''
          } else if (c === '>') {
            emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)
            parser.sgmlDecl = ''
            parser.state = S.TEXT
          } else if (is(quote, c)) {
            parser.state = S.SGML_DECL_QUOTED
            parser.sgmlDecl += c
          } else {
            parser.sgmlDecl += c
          }
          continue

        case S.SGML_DECL_QUOTED:
          if (c === parser.q) {
            parser.state = S.SGML_DECL
            parser.q = ''
          }
          parser.sgmlDecl += c
          continue

        case S.DOCTYPE:
          if (c === '>') {
            parser.state = S.TEXT
            emitNode(parser, 'ondoctype', parser.doctype)
            parser.doctype = true // just remember that we saw it.
          } else {
            parser.doctype += c
            if (c === '[') {
              parser.state = S.DOCTYPE_DTD
            } else if (is(quote, c)) {
              parser.state = S.DOCTYPE_QUOTED
              parser.q = c
            }
          }
          continue

        case S.DOCTYPE_QUOTED:
          parser.doctype += c
          if (c === parser.q) {
            parser.q = ''
            parser.state = S.DOCTYPE
          }
          continue

        case S.DOCTYPE_DTD:
          parser.doctype += c
          if (c === ']') {
            parser.state = S.DOCTYPE
          } else if (is(quote, c)) {
            parser.state = S.DOCTYPE_DTD_QUOTED
            parser.q = c
          }
          continue

        case S.DOCTYPE_DTD_QUOTED:
          parser.doctype += c
          if (c === parser.q) {
            parser.state = S.DOCTYPE_DTD
            parser.q = ''
          }
          continue

        case S.COMMENT:
          if (c === '-') {
            parser.state = S.COMMENT_ENDING
          } else {
            parser.comment += c
          }
          continue

        case S.COMMENT_ENDING:
          if (c === '-') {
            parser.state = S.COMMENT_ENDED
            parser.comment = textopts(parser.opt, parser.comment)
            if (parser.comment) {
              emitNode(parser, 'oncomment', parser.comment)
            }
            parser.comment = ''
          } else {
            parser.comment += '-' + c
            parser.state = S.COMMENT
          }
          continue

        case S.COMMENT_ENDED:
          if (c !== '>') {
            strictFail(parser, 'Malformed comment')
            // allow <!-- blah -- bloo --> in non-strict mode,
            // which is a comment of " blah -- bloo "
            parser.comment += '--' + c
            parser.state = S.COMMENT
          } else {
            parser.state = S.TEXT
          }
          continue

        case S.CDATA:
          if (c === ']') {
            parser.state = S.CDATA_ENDING
          } else {
            parser.cdata += c
          }
          continue

        case S.CDATA_ENDING:
          if (c === ']') {
            parser.state = S.CDATA_ENDING_2
          } else {
            parser.cdata += ']' + c
            parser.state = S.CDATA
          }
          continue

        case S.CDATA_ENDING_2:
          if (c === '>') {
            if (parser.cdata) {
              emitNode(parser, 'oncdata', parser.cdata)
            }
            emitNode(parser, 'onclosecdata')
            parser.cdata = ''
            parser.state = S.TEXT
          } else if (c === ']') {
            parser.cdata += ']'
          } else {
            parser.cdata += ']]' + c
            parser.state = S.CDATA
          }
          continue

        case S.PROC_INST:
          if (c === '?') {
            parser.state = S.PROC_INST_ENDING
          } else if (is(whitespace, c)) {
            parser.state = S.PROC_INST_BODY
          } else {
            parser.procInstName += c
          }
          continue

        case S.PROC_INST_BODY:
          if (!parser.procInstBody && is(whitespace, c)) {
            continue
          } else if (c === '?') {
            parser.state = S.PROC_INST_ENDING
          } else {
            parser.procInstBody += c
          }
          continue

        case S.PROC_INST_ENDING:
          if (c === '>') {
            emitNode(parser, 'onprocessinginstruction', {
              name: parser.procInstName,
              body: parser.procInstBody
            })
            parser.procInstName = parser.procInstBody = ''
            parser.state = S.TEXT
          } else {
            parser.procInstBody += '?' + c
            parser.state = S.PROC_INST_BODY
          }
          continue

        case S.OPEN_TAG:
          if (is(nameBody, c)) {
            parser.tagName += c
          } else {
            newTag(parser)
            if (c === '>') {
              openTag(parser)
            } else if (c === '/') {
              parser.state = S.OPEN_TAG_SLASH
            } else {
              if (not(whitespace, c)) {
                strictFail(parser, 'Invalid character in tag name')
              }
              parser.state = S.ATTRIB
            }
          }
          continue

        case S.OPEN_TAG_SLASH:
          if (c === '>') {
            openTag(parser, true)
            closeTag(parser)
          } else {
            strictFail(parser, 'Forward-slash in opening tag not followed by >')
            parser.state = S.ATTRIB
          }
          continue

        case S.ATTRIB:
          // haven't read the attribute name yet.
          if (is(whitespace, c)) {
            continue
          } else if (c === '>') {
            openTag(parser)
          } else if (c === '/') {
            parser.state = S.OPEN_TAG_SLASH
          } else if (is(nameStart, c)) {
            parser.attribName = c
            parser.attribValue = ''
            parser.state = S.ATTRIB_NAME
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_NAME:
          if (c === '=') {
            parser.state = S.ATTRIB_VALUE
          } else if (c === '>') {
            strictFail(parser, 'Attribute without value')
            parser.attribValue = parser.attribName
            attrib(parser)
            openTag(parser)
          } else if (is(whitespace, c)) {
            parser.state = S.ATTRIB_NAME_SAW_WHITE
          } else if (is(nameBody, c)) {
            parser.attribName += c
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_NAME_SAW_WHITE:
          if (c === '=') {
            parser.state = S.ATTRIB_VALUE
          } else if (is(whitespace, c)) {
            continue
          } else {
            strictFail(parser, 'Attribute without value')
            parser.tag.attributes[parser.attribName] = ''
            parser.attribValue = ''
            emitNode(parser, 'onattribute', {
              name: parser.attribName,
              value: ''
            })
            parser.attribName = ''
            if (c === '>') {
              openTag(parser)
            } else if (is(nameStart, c)) {
              parser.attribName = c
              parser.state = S.ATTRIB_NAME
            } else {
              strictFail(parser, 'Invalid attribute name')
              parser.state = S.ATTRIB
            }
          }
          continue

        case S.ATTRIB_VALUE:
          if (is(whitespace, c)) {
            continue
          } else if (is(quote, c)) {
            parser.q = c
            parser.state = S.ATTRIB_VALUE_QUOTED
          } else {
            strictFail(parser, 'Unquoted attribute value')
            parser.state = S.ATTRIB_VALUE_UNQUOTED
            parser.attribValue = c
          }
          continue

        case S.ATTRIB_VALUE_QUOTED:
          if (c !== parser.q) {
            if (c === '&') {
              parser.state = S.ATTRIB_VALUE_ENTITY_Q
            } else {
              parser.attribValue += c
            }
            continue
          }
          attrib(parser)
          parser.q = ''
          parser.state = S.ATTRIB_VALUE_CLOSED
          continue

        case S.ATTRIB_VALUE_CLOSED:
          if (is(whitespace, c)) {
            parser.state = S.ATTRIB
          } else if (c === '>') {
            openTag(parser)
          } else if (c === '/') {
            parser.state = S.OPEN_TAG_SLASH
          } else if (is(nameStart, c)) {
            strictFail(parser, 'No whitespace between attributes')
            parser.attribName = c
            parser.attribValue = ''
            parser.state = S.ATTRIB_NAME
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_VALUE_UNQUOTED:
          if (not(attribEnd, c)) {
            if (c === '&') {
              parser.state = S.ATTRIB_VALUE_ENTITY_U
            } else {
              parser.attribValue += c
            }
            continue
          }
          attrib(parser)
          if (c === '>') {
            openTag(parser)
          } else {
            parser.state = S.ATTRIB
          }
          continue

        case S.CLOSE_TAG:
          if (!parser.tagName) {
            if (is(whitespace, c)) {
              continue
            } else if (not(nameStart, c)) {
              if (parser.script) {
                parser.script += '</' + c
                parser.state = S.SCRIPT
              } else {
                strictFail(parser, 'Invalid tagname in closing tag.')
              }
            } else {
              parser.tagName = c
            }
          } else if (c === '>') {
            closeTag(parser)
          } else if (is(nameBody, c)) {
            parser.tagName += c
          } else if (parser.script) {
            parser.script += '</' + parser.tagName
            parser.tagName = ''
            parser.state = S.SCRIPT
          } else {
            if (not(whitespace, c)) {
              strictFail(parser, 'Invalid tagname in closing tag')
            }
            parser.state = S.CLOSE_TAG_SAW_WHITE
          }
          continue

        case S.CLOSE_TAG_SAW_WHITE:
          if (is(whitespace, c)) {
            continue
          }
          if (c === '>') {
            closeTag(parser)
          } else {
            strictFail(parser, 'Invalid characters in closing tag')
          }
          continue

        case S.TEXT_ENTITY:
        case S.ATTRIB_VALUE_ENTITY_Q:
        case S.ATTRIB_VALUE_ENTITY_U:
          var returnState
          var buffer
          switch (parser.state) {
            case S.TEXT_ENTITY:
              returnState = S.TEXT
              buffer = 'textNode'
              break

            case S.ATTRIB_VALUE_ENTITY_Q:
              returnState = S.ATTRIB_VALUE_QUOTED
              buffer = 'attribValue'
              break

            case S.ATTRIB_VALUE_ENTITY_U:
              returnState = S.ATTRIB_VALUE_UNQUOTED
              buffer = 'attribValue'
              break
          }

          if (c === ';') {
            parser[buffer] += parseEntity(parser)
            parser.entity = ''
            parser.state = returnState
          } else if (is(parser.entity.length ? entityBody : entityStart, c)) {
            parser.entity += c
          } else {
            strictFail(parser, 'Invalid character in entity name')
            parser[buffer] += '&' + parser.entity + c
            parser.entity = ''
            parser.state = returnState
          }

          continue

        default:
          throw new Error(parser, 'Unknown state: ' + parser.state)
      }
    } // while

    if (parser.position >= parser.bufferCheckPosition) {
      checkBufferLength(parser)
    }
    return parser
  }

  /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
  if (!String.fromCodePoint) {
    (function () {
      var stringFromCharCode = String.fromCharCode
      var floor = Math.floor
      var fromCodePoint = function () {
        var MAX_SIZE = 0x4000
        var codeUnits = []
        var highSurrogate
        var lowSurrogate
        var index = -1
        var length = arguments.length
        if (!length) {
          return ''
        }
        var result = ''
        while (++index < length) {
          var codePoint = Number(arguments[index])
          if (
            !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`
            codePoint < 0 || // not a valid Unicode code point
            codePoint > 0x10FFFF || // not a valid Unicode code point
            floor(codePoint) !== codePoint // not an integer
          ) {
            throw RangeError('Invalid code point: ' + codePoint)
          }
          if (codePoint <= 0xFFFF) { // BMP code point
            codeUnits.push(codePoint)
          } else { // Astral code point; split in surrogate halves
            // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
            codePoint -= 0x10000
            highSurrogate = (codePoint >> 10) + 0xD800
            lowSurrogate = (codePoint % 0x400) + 0xDC00
            codeUnits.push(highSurrogate, lowSurrogate)
          }
          if (index + 1 === length || codeUnits.length > MAX_SIZE) {
            result += stringFromCharCode.apply(null, codeUnits)
            codeUnits.length = 0
          }
        }
        return result
      }
      if (Object.defineProperty) {
        Object.defineProperty(String, 'fromCodePoint', {
          value: fromCodePoint,
          configurable: true,
          writable: true
        })
      } else {
        String.fromCodePoint = fromCodePoint
      }
    }())
  }
})(typeof exports === 'undefined' ? this.sax = {} : exports)
The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
{
  "bin": {
    "semver": "bin/semver"
  },
  "deprecated": false,
  "description": "The semantic version parser used by npm.",
  "devDependencies": {
    "tap": "^13.0.0-rc.18"
  },
  "files": [
    "bin",
    "range.bnf",
    "semver.js"
  ],
  "homepage": "https://github.com/npm/node-semver#readme",
  "license": "ISC",
  "main": "semver.js",
  "name": "semver",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/node-semver.git"
  },
  "tap": {
    "check-coverage": true
  },
  "version": "5.7.1"
}range-set  ::= range ( logical-or range ) *
logical-or ::= ( ' ' ) * '||' ( ' ' ) *
range      ::= hyphen | simple ( ' ' simple ) * | ''
hyphen     ::= partial ' - ' partial
simple     ::= primitive | partial | tilde | caret
primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
xr         ::= 'x' | 'X' | '*' | nr
nr         ::= '0' | [1-9] ( [0-9] ) *
tilde      ::= '~' partial
caret      ::= '^' partial
qualifier  ::= ( '-' pre )? ( '+' build )?
pre        ::= parts
build      ::= parts
parts      ::= part ( '.' part ) *
part       ::= nr | [-0-9A-Za-z]+
exports = module.exports = SemVer

var debug
/* istanbul ignore next */
if (typeof process === 'object' &&
    process.env &&
    process.env.NODE_DEBUG &&
    /\bsemver\b/i.test(process.env.NODE_DEBUG)) {
  debug = function () {
    var args = Array.prototype.slice.call(arguments, 0)
    args.unshift('SEMVER')
    console.log.apply(console, args)
  }
} else {
  debug = function () {}
}

// Note: this is the semver.org version of the spec that it implements
// Not necessarily the package version of this code.
exports.SEMVER_SPEC_VERSION = '2.0.0'

var MAX_LENGTH = 256
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
  /* istanbul ignore next */ 9007199254740991

// Max safe segment length for coercion.
var MAX_SAFE_COMPONENT_LENGTH = 16

// The actual regexps go on exports.re
var re = exports.re = []
var src = exports.src = []
var R = 0

// The following Regular Expressions can be used for tokenizing,
// validating, and parsing SemVer version strings.

// ## Numeric Identifier
// A single `0`, or a non-zero digit followed by zero or more digits.

var NUMERICIDENTIFIER = R++
src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'
var NUMERICIDENTIFIERLOOSE = R++
src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'

// ## Non-numeric Identifier
// Zero or more digits, followed by a letter or hyphen, and then zero or
// more letters, digits, or hyphens.

var NONNUMERICIDENTIFIER = R++
src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'

// ## Main Version
// Three dot-separated numeric identifiers.

var MAINVERSION = R++
src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[NUMERICIDENTIFIER] + ')'

var MAINVERSIONLOOSE = R++
src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')'

// ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier.

var PRERELEASEIDENTIFIER = R++
src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
                            '|' + src[NONNUMERICIDENTIFIER] + ')'

var PRERELEASEIDENTIFIERLOOSE = R++
src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
                                 '|' + src[NONNUMERICIDENTIFIER] + ')'

// ## Pre-release Version
// Hyphen, followed by one or more dot-separated pre-release version
// identifiers.

var PRERELEASE = R++
src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
                  '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'

var PRERELEASELOOSE = R++
src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
                       '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'

// ## Build Metadata Identifier
// Any combination of digits, letters, or hyphens.

var BUILDIDENTIFIER = R++
src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'

// ## Build Metadata
// Plus sign, followed by one or more period-separated build metadata
// identifiers.

var BUILD = R++
src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
             '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'

// ## Full Version String
// A main version, followed optionally by a pre-release version and
// build metadata.

// Note that the only major, minor, patch, and pre-release sections of
// the version string are capturing groups.  The build metadata is not a
// capturing group, because it should not ever be used in version
// comparison.

var FULL = R++
var FULLPLAIN = 'v?' + src[MAINVERSION] +
                src[PRERELEASE] + '?' +
                src[BUILD] + '?'

src[FULL] = '^' + FULLPLAIN + '$'

// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
// common in the npm registry.
var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
                 src[PRERELEASELOOSE] + '?' +
                 src[BUILD] + '?'

var LOOSE = R++
src[LOOSE] = '^' + LOOSEPLAIN + '$'

var GTLT = R++
src[GTLT] = '((?:<|>)?=?)'

// Something like "2.*" or "1.2.x".
// Note that "x.x" is a valid xRange identifer, meaning "any version"
// Only the first item is strictly required.
var XRANGEIDENTIFIERLOOSE = R++
src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'
var XRANGEIDENTIFIER = R++
src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'

var XRANGEPLAIN = R++
src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
                   '(?:' + src[PRERELEASE] + ')?' +
                   src[BUILD] + '?' +
                   ')?)?'

var XRANGEPLAINLOOSE = R++
src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:' + src[PRERELEASELOOSE] + ')?' +
                        src[BUILD] + '?' +
                        ')?)?'

var XRANGE = R++
src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'
var XRANGELOOSE = R++
src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'

// Coercion.
// Extract anything that could conceivably be a part of a valid semver
var COERCE = R++
src[COERCE] = '(?:^|[^\\d])' +
              '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:$|[^\\d])'

// Tilde ranges.
// Meaning is "reasonably at or greater than"
var LONETILDE = R++
src[LONETILDE] = '(?:~>?)'

var TILDETRIM = R++
src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'
re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g')
var tildeTrimReplace = '$1~'

var TILDE = R++
src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'
var TILDELOOSE = R++
src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'

// Caret ranges.
// Meaning is "at least and backwards compatible with"
var LONECARET = R++
src[LONECARET] = '(?:\\^)'

var CARETTRIM = R++
src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'
re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g')
var caretTrimReplace = '$1^'

var CARET = R++
src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'
var CARETLOOSE = R++
src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'

// A simple gt/lt/eq thing, or just "" to indicate "any version"
var COMPARATORLOOSE = R++
src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'
var COMPARATOR = R++
src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'

// An expression to strip any whitespace between the gtlt and the thing
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
var COMPARATORTRIM = R++
src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
                      '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'

// this one has to use the /g flag
re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g')
var comparatorTrimReplace = '$1$2$3'

// Something like `1.2.3 - 1.2.4`
// Note that these all use the loose form, because they'll be
// checked against either the strict or loose comparator form
// later.
var HYPHENRANGE = R++
src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
                   '\\s+-\\s+' +
                   '(' + src[XRANGEPLAIN] + ')' +
                   '\\s*$'

var HYPHENRANGELOOSE = R++
src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
                        '\\s+-\\s+' +
                        '(' + src[XRANGEPLAINLOOSE] + ')' +
                        '\\s*$'

// Star ranges basically just allow anything at all.
var STAR = R++
src[STAR] = '(<|>)?=?\\s*\\*'

// Compile to actual regexp objects.
// All are flag-free, unless they were created above with a flag.
for (var i = 0; i < R; i++) {
  debug(i, src[i])
  if (!re[i]) {
    re[i] = new RegExp(src[i])
  }
}

exports.parse = parse
function parse (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (version instanceof SemVer) {
    return version
  }

  if (typeof version !== 'string') {
    return null
  }

  if (version.length > MAX_LENGTH) {
    return null
  }

  var r = options.loose ? re[LOOSE] : re[FULL]
  if (!r.test(version)) {
    return null
  }

  try {
    return new SemVer(version, options)
  } catch (er) {
    return null
  }
}

exports.valid = valid
function valid (version, options) {
  var v = parse(version, options)
  return v ? v.version : null
}

exports.clean = clean
function clean (version, options) {
  var s = parse(version.trim().replace(/^[=v]+/, ''), options)
  return s ? s.version : null
}

exports.SemVer = SemVer

function SemVer (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }
  if (version instanceof SemVer) {
    if (version.loose === options.loose) {
      return version
    } else {
      version = version.version
    }
  } else if (typeof version !== 'string') {
    throw new TypeError('Invalid Version: ' + version)
  }

  if (version.length > MAX_LENGTH) {
    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
  }

  if (!(this instanceof SemVer)) {
    return new SemVer(version, options)
  }

  debug('SemVer', version, options)
  this.options = options
  this.loose = !!options.loose

  var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL])

  if (!m) {
    throw new TypeError('Invalid Version: ' + version)
  }

  this.raw = version

  // these are actually numbers
  this.major = +m[1]
  this.minor = +m[2]
  this.patch = +m[3]

  if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
    throw new TypeError('Invalid major version')
  }

  if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
    throw new TypeError('Invalid minor version')
  }

  if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
    throw new TypeError('Invalid patch version')
  }

  // numberify any prerelease numeric ids
  if (!m[4]) {
    this.prerelease = []
  } else {
    this.prerelease = m[4].split('.').map(function (id) {
      if (/^[0-9]+$/.test(id)) {
        var num = +id
        if (num >= 0 && num < MAX_SAFE_INTEGER) {
          return num
        }
      }
      return id
    })
  }

  this.build = m[5] ? m[5].split('.') : []
  this.format()
}

SemVer.prototype.format = function () {
  this.version = this.major + '.' + this.minor + '.' + this.patch
  if (this.prerelease.length) {
    this.version += '-' + this.prerelease.join('.')
  }
  return this.version
}

SemVer.prototype.toString = function () {
  return this.version
}

SemVer.prototype.compare = function (other) {
  debug('SemVer.compare', this.version, this.options, other)
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  return this.compareMain(other) || this.comparePre(other)
}

SemVer.prototype.compareMain = function (other) {
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  return compareIdentifiers(this.major, other.major) ||
         compareIdentifiers(this.minor, other.minor) ||
         compareIdentifiers(this.patch, other.patch)
}

SemVer.prototype.comparePre = function (other) {
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  // NOT having a prerelease is > having one
  if (this.prerelease.length && !other.prerelease.length) {
    return -1
  } else if (!this.prerelease.length && other.prerelease.length) {
    return 1
  } else if (!this.prerelease.length && !other.prerelease.length) {
    return 0
  }

  var i = 0
  do {
    var a = this.prerelease[i]
    var b = other.prerelease[i]
    debug('prerelease compare', i, a, b)
    if (a === undefined && b === undefined) {
      return 0
    } else if (b === undefined) {
      return 1
    } else if (a === undefined) {
      return -1
    } else if (a === b) {
      continue
    } else {
      return compareIdentifiers(a, b)
    }
  } while (++i)
}

// preminor will bump the version up to the next minor release, and immediately
// down to pre-release. premajor and prepatch work the same way.
SemVer.prototype.inc = function (release, identifier) {
  switch (release) {
    case 'premajor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor = 0
      this.major++
      this.inc('pre', identifier)
      break
    case 'preminor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor++
      this.inc('pre', identifier)
      break
    case 'prepatch':
      // If this is already a prerelease, it will bump to the next version
      // drop any prereleases that might already exist, since they are not
      // relevant at this point.
      this.prerelease.length = 0
      this.inc('patch', identifier)
      this.inc('pre', identifier)
      break
    // If the input is a non-prerelease version, this acts the same as
    // prepatch.
    case 'prerelease':
      if (this.prerelease.length === 0) {
        this.inc('patch', identifier)
      }
      this.inc('pre', identifier)
      break

    case 'major':
      // If this is a pre-major version, bump up to the same major version.
      // Otherwise increment major.
      // 1.0.0-5 bumps to 1.0.0
      // 1.1.0 bumps to 2.0.0
      if (this.minor !== 0 ||
          this.patch !== 0 ||
          this.prerelease.length === 0) {
        this.major++
      }
      this.minor = 0
      this.patch = 0
      this.prerelease = []
      break
    case 'minor':
      // If this is a pre-minor version, bump up to the same minor version.
      // Otherwise increment minor.
      // 1.2.0-5 bumps to 1.2.0
      // 1.2.1 bumps to 1.3.0
      if (this.patch !== 0 || this.prerelease.length === 0) {
        this.minor++
      }
      this.patch = 0
      this.prerelease = []
      break
    case 'patch':
      // If this is not a pre-release version, it will increment the patch.
      // If it is a pre-release it will bump up to the same patch version.
      // 1.2.0-5 patches to 1.2.0
      // 1.2.0 patches to 1.2.1
      if (this.prerelease.length === 0) {
        this.patch++
      }
      this.prerelease = []
      break
    // This probably shouldn't be used publicly.
    // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
    case 'pre':
      if (this.prerelease.length === 0) {
        this.prerelease = [0]
      } else {
        var i = this.prerelease.length
        while (--i >= 0) {
          if (typeof this.prerelease[i] === 'number') {
            this.prerelease[i]++
            i = -2
          }
        }
        if (i === -1) {
          // didn't increment anything
          this.prerelease.push(0)
        }
      }
      if (identifier) {
        // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
        // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
        if (this.prerelease[0] === identifier) {
          if (isNaN(this.prerelease[1])) {
            this.prerelease = [identifier, 0]
          }
        } else {
          this.prerelease = [identifier, 0]
        }
      }
      break

    default:
      throw new Error('invalid increment argument: ' + release)
  }
  this.format()
  this.raw = this.version
  return this
}

exports.inc = inc
function inc (version, release, loose, identifier) {
  if (typeof (loose) === 'string') {
    identifier = loose
    loose = undefined
  }

  try {
    return new SemVer(version, loose).inc(release, identifier).version
  } catch (er) {
    return null
  }
}

exports.diff = diff
function diff (version1, version2) {
  if (eq(version1, version2)) {
    return null
  } else {
    var v1 = parse(version1)
    var v2 = parse(version2)
    var prefix = ''
    if (v1.prerelease.length || v2.prerelease.length) {
      prefix = 'pre'
      var defaultResult = 'prerelease'
    }
    for (var key in v1) {
      if (key === 'major' || key === 'minor' || key === 'patch') {
        if (v1[key] !== v2[key]) {
          return prefix + key
        }
      }
    }
    return defaultResult // may be undefined
  }
}

exports.compareIdentifiers = compareIdentifiers

var numeric = /^[0-9]+$/
function compareIdentifiers (a, b) {
  var anum = numeric.test(a)
  var bnum = numeric.test(b)

  if (anum && bnum) {
    a = +a
    b = +b
  }

  return a === b ? 0
    : (anum && !bnum) ? -1
    : (bnum && !anum) ? 1
    : a < b ? -1
    : 1
}

exports.rcompareIdentifiers = rcompareIdentifiers
function rcompareIdentifiers (a, b) {
  return compareIdentifiers(b, a)
}

exports.major = major
function major (a, loose) {
  return new SemVer(a, loose).major
}

exports.minor = minor
function minor (a, loose) {
  return new SemVer(a, loose).minor
}

exports.patch = patch
function patch (a, loose) {
  return new SemVer(a, loose).patch
}

exports.compare = compare
function compare (a, b, loose) {
  return new SemVer(a, loose).compare(new SemVer(b, loose))
}

exports.compareLoose = compareLoose
function compareLoose (a, b) {
  return compare(a, b, true)
}

exports.rcompare = rcompare
function rcompare (a, b, loose) {
  return compare(b, a, loose)
}

exports.sort = sort
function sort (list, loose) {
  return list.sort(function (a, b) {
    return exports.compare(a, b, loose)
  })
}

exports.rsort = rsort
function rsort (list, loose) {
  return list.sort(function (a, b) {
    return exports.rcompare(a, b, loose)
  })
}

exports.gt = gt
function gt (a, b, loose) {
  return compare(a, b, loose) > 0
}

exports.lt = lt
function lt (a, b, loose) {
  return compare(a, b, loose) < 0
}

exports.eq = eq
function eq (a, b, loose) {
  return compare(a, b, loose) === 0
}

exports.neq = neq
function neq (a, b, loose) {
  return compare(a, b, loose) !== 0
}

exports.gte = gte
function gte (a, b, loose) {
  return compare(a, b, loose) >= 0
}

exports.lte = lte
function lte (a, b, loose) {
  return compare(a, b, loose) <= 0
}

exports.cmp = cmp
function cmp (a, op, b, loose) {
  switch (op) {
    case '===':
      if (typeof a === 'object')
        a = a.version
      if (typeof b === 'object')
        b = b.version
      return a === b

    case '!==':
      if (typeof a === 'object')
        a = a.version
      if (typeof b === 'object')
        b = b.version
      return a !== b

    case '':
    case '=':
    case '==':
      return eq(a, b, loose)

    case '!=':
      return neq(a, b, loose)

    case '>':
      return gt(a, b, loose)

    case '>=':
      return gte(a, b, loose)

    case '<':
      return lt(a, b, loose)

    case '<=':
      return lte(a, b, loose)

    default:
      throw new TypeError('Invalid operator: ' + op)
  }
}

exports.Comparator = Comparator
function Comparator (comp, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (comp instanceof Comparator) {
    if (comp.loose === !!options.loose) {
      return comp
    } else {
      comp = comp.value
    }
  }

  if (!(this instanceof Comparator)) {
    return new Comparator(comp, options)
  }

  debug('comparator', comp, options)
  this.options = options
  this.loose = !!options.loose
  this.parse(comp)

  if (this.semver === ANY) {
    this.value = ''
  } else {
    this.value = this.operator + this.semver.version
  }

  debug('comp', this)
}

var ANY = {}
Comparator.prototype.parse = function (comp) {
  var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]
  var m = comp.match(r)

  if (!m) {
    throw new TypeError('Invalid comparator: ' + comp)
  }

  this.operator = m[1]
  if (this.operator === '=') {
    this.operator = ''
  }

  // if it literally is just '>' or '' then allow anything.
  if (!m[2]) {
    this.semver = ANY
  } else {
    this.semver = new SemVer(m[2], this.options.loose)
  }
}

Comparator.prototype.toString = function () {
  return this.value
}

Comparator.prototype.test = function (version) {
  debug('Comparator.test', version, this.options.loose)

  if (this.semver === ANY) {
    return true
  }

  if (typeof version === 'string') {
    version = new SemVer(version, this.options)
  }

  return cmp(version, this.operator, this.semver, this.options)
}

Comparator.prototype.intersects = function (comp, options) {
  if (!(comp instanceof Comparator)) {
    throw new TypeError('a Comparator is required')
  }

  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  var rangeTmp

  if (this.operator === '') {
    rangeTmp = new Range(comp.value, options)
    return satisfies(this.value, rangeTmp, options)
  } else if (comp.operator === '') {
    rangeTmp = new Range(this.value, options)
    return satisfies(comp.semver, rangeTmp, options)
  }

  var sameDirectionIncreasing =
    (this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '>=' || comp.operator === '>')
  var sameDirectionDecreasing =
    (this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '<=' || comp.operator === '<')
  var sameSemVer = this.semver.version === comp.semver.version
  var differentDirectionsInclusive =
    (this.operator === '>=' || this.operator === '<=') &&
    (comp.operator === '>=' || comp.operator === '<=')
  var oppositeDirectionsLessThan =
    cmp(this.semver, '<', comp.semver, options) &&
    ((this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '<=' || comp.operator === '<'))
  var oppositeDirectionsGreaterThan =
    cmp(this.semver, '>', comp.semver, options) &&
    ((this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '>=' || comp.operator === '>'))

  return sameDirectionIncreasing || sameDirectionDecreasing ||
    (sameSemVer && differentDirectionsInclusive) ||
    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan
}

exports.Range = Range
function Range (range, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (range instanceof Range) {
    if (range.loose === !!options.loose &&
        range.includePrerelease === !!options.includePrerelease) {
      return range
    } else {
      return new Range(range.raw, options)
    }
  }

  if (range instanceof Comparator) {
    return new Range(range.value, options)
  }

  if (!(this instanceof Range)) {
    return new Range(range, options)
  }

  this.options = options
  this.loose = !!options.loose
  this.includePrerelease = !!options.includePrerelease

  // First, split based on boolean or ||
  this.raw = range
  this.set = range.split(/\s*\|\|\s*/).map(function (range) {
    return this.parseRange(range.trim())
  }, this).filter(function (c) {
    // throw out any that are not relevant for whatever reason
    return c.length
  })

  if (!this.set.length) {
    throw new TypeError('Invalid SemVer Range: ' + range)
  }

  this.format()
}

Range.prototype.format = function () {
  this.range = this.set.map(function (comps) {
    return comps.join(' ').trim()
  }).join('||').trim()
  return this.range
}

Range.prototype.toString = function () {
  return this.range
}

Range.prototype.parseRange = function (range) {
  var loose = this.options.loose
  range = range.trim()
  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
  var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]
  range = range.replace(hr, hyphenReplace)
  debug('hyphen replace', range)
  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
  range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace)
  debug('comparator trim', range, re[COMPARATORTRIM])

  // `~ 1.2.3` => `~1.2.3`
  range = range.replace(re[TILDETRIM], tildeTrimReplace)

  // `^ 1.2.3` => `^1.2.3`
  range = range.replace(re[CARETTRIM], caretTrimReplace)

  // normalize spaces
  range = range.split(/\s+/).join(' ')

  // At this point, the range is completely trimmed and
  // ready to be split into comparators.

  var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]
  var set = range.split(' ').map(function (comp) {
    return parseComparator(comp, this.options)
  }, this).join(' ').split(/\s+/)
  if (this.options.loose) {
    // in loose mode, throw out any that are not valid comparators
    set = set.filter(function (comp) {
      return !!comp.match(compRe)
    })
  }
  set = set.map(function (comp) {
    return new Comparator(comp, this.options)
  }, this)

  return set
}

Range.prototype.intersects = function (range, options) {
  if (!(range instanceof Range)) {
    throw new TypeError('a Range is required')
  }

  return this.set.some(function (thisComparators) {
    return thisComparators.every(function (thisComparator) {
      return range.set.some(function (rangeComparators) {
        return rangeComparators.every(function (rangeComparator) {
          return thisComparator.intersects(rangeComparator, options)
        })
      })
    })
  })
}

// Mostly just for testing and legacy API reasons
exports.toComparators = toComparators
function toComparators (range, options) {
  return new Range(range, options).set.map(function (comp) {
    return comp.map(function (c) {
      return c.value
    }).join(' ').trim().split(' ')
  })
}

// comprised of xranges, tildes, stars, and gtlt's at this point.
// already replaced the hyphen ranges
// turn into a set of JUST comparators.
function parseComparator (comp, options) {
  debug('comp', comp, options)
  comp = replaceCarets(comp, options)
  debug('caret', comp)
  comp = replaceTildes(comp, options)
  debug('tildes', comp)
  comp = replaceXRanges(comp, options)
  debug('xrange', comp)
  comp = replaceStars(comp, options)
  debug('stars', comp)
  return comp
}

function isX (id) {
  return !id || id.toLowerCase() === 'x' || id === '*'
}

// ~, ~> --> * (any, kinda silly)
// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
function replaceTildes (comp, options) {
  return comp.trim().split(/\s+/).map(function (comp) {
    return replaceTilde(comp, options)
  }).join(' ')
}

function replaceTilde (comp, options) {
  var r = options.loose ? re[TILDELOOSE] : re[TILDE]
  return comp.replace(r, function (_, M, m, p, pr) {
    debug('tilde', comp, _, M, m, p, pr)
    var ret

    if (isX(M)) {
      ret = ''
    } else if (isX(m)) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
    } else if (isX(p)) {
      // ~1.2 == >=1.2.0 <1.3.0
      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
    } else if (pr) {
      debug('replaceTilde pr', pr)
      ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
            ' <' + M + '.' + (+m + 1) + '.0'
    } else {
      // ~1.2.3 == >=1.2.3 <1.3.0
      ret = '>=' + M + '.' + m + '.' + p +
            ' <' + M + '.' + (+m + 1) + '.0'
    }

    debug('tilde return', ret)
    return ret
  })
}

// ^ --> * (any, kinda silly)
// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
// ^1.2.3 --> >=1.2.3 <2.0.0
// ^1.2.0 --> >=1.2.0 <2.0.0
function replaceCarets (comp, options) {
  return comp.trim().split(/\s+/).map(function (comp) {
    return replaceCaret(comp, options)
  }).join(' ')
}

function replaceCaret (comp, options) {
  debug('caret', comp, options)
  var r = options.loose ? re[CARETLOOSE] : re[CARET]
  return comp.replace(r, function (_, M, m, p, pr) {
    debug('caret', comp, _, M, m, p, pr)
    var ret

    if (isX(M)) {
      ret = ''
    } else if (isX(m)) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
    } else if (isX(p)) {
      if (M === '0') {
        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
      } else {
        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'
      }
    } else if (pr) {
      debug('replaceCaret pr', pr)
      if (M === '0') {
        if (m === '0') {
          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
                ' <' + M + '.' + m + '.' + (+p + 1)
        } else {
          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
                ' <' + M + '.' + (+m + 1) + '.0'
        }
      } else {
        ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
              ' <' + (+M + 1) + '.0.0'
      }
    } else {
      debug('no pr')
      if (M === '0') {
        if (m === '0') {
          ret = '>=' + M + '.' + m + '.' + p +
                ' <' + M + '.' + m + '.' + (+p + 1)
        } else {
          ret = '>=' + M + '.' + m + '.' + p +
                ' <' + M + '.' + (+m + 1) + '.0'
        }
      } else {
        ret = '>=' + M + '.' + m + '.' + p +
              ' <' + (+M + 1) + '.0.0'
      }
    }

    debug('caret return', ret)
    return ret
  })
}

function replaceXRanges (comp, options) {
  debug('replaceXRanges', comp, options)
  return comp.split(/\s+/).map(function (comp) {
    return replaceXRange(comp, options)
  }).join(' ')
}

function replaceXRange (comp, options) {
  comp = comp.trim()
  var r = options.loose ? re[XRANGELOOSE] : re[XRANGE]
  return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
    debug('xRange', comp, ret, gtlt, M, m, p, pr)
    var xM = isX(M)
    var xm = xM || isX(m)
    var xp = xm || isX(p)
    var anyX = xp

    if (gtlt === '=' && anyX) {
      gtlt = ''
    }

    if (xM) {
      if (gtlt === '>' || gtlt === '<') {
        // nothing is allowed
        ret = '<0.0.0'
      } else {
        // nothing is forbidden
        ret = '*'
      }
    } else if (gtlt && anyX) {
      // we know patch is an x, because we have any x at all.
      // replace X with 0
      if (xm) {
        m = 0
      }
      p = 0

      if (gtlt === '>') {
        // >1 => >=2.0.0
        // >1.2 => >=1.3.0
        // >1.2.3 => >= 1.2.4
        gtlt = '>='
        if (xm) {
          M = +M + 1
          m = 0
          p = 0
        } else {
          m = +m + 1
          p = 0
        }
      } else if (gtlt === '<=') {
        // <=0.7.x is actually <0.8.0, since any 0.7.x should
        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
        gtlt = '<'
        if (xm) {
          M = +M + 1
        } else {
          m = +m + 1
        }
      }

      ret = gtlt + M + '.' + m + '.' + p
    } else if (xm) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
    } else if (xp) {
      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
    }

    debug('xRange return', ret)

    return ret
  })
}

// Because * is AND-ed with everything else in the comparator,
// and '' means "any version", just remove the *s entirely.
function replaceStars (comp, options) {
  debug('replaceStars', comp, options)
  // Looseness is ignored here.  star is always as loose as it gets!
  return comp.trim().replace(re[STAR], '')
}

// This function is passed to string.replace(re[HYPHENRANGE])
// M, m, patch, prerelease, build
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
// 1.2 - 3.4 => >=1.2.0 <3.5.0
function hyphenReplace ($0,
  from, fM, fm, fp, fpr, fb,
  to, tM, tm, tp, tpr, tb) {
  if (isX(fM)) {
    from = ''
  } else if (isX(fm)) {
    from = '>=' + fM + '.0.0'
  } else if (isX(fp)) {
    from = '>=' + fM + '.' + fm + '.0'
  } else {
    from = '>=' + from
  }

  if (isX(tM)) {
    to = ''
  } else if (isX(tm)) {
    to = '<' + (+tM + 1) + '.0.0'
  } else if (isX(tp)) {
    to = '<' + tM + '.' + (+tm + 1) + '.0'
  } else if (tpr) {
    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr
  } else {
    to = '<=' + to
  }

  return (from + ' ' + to).trim()
}

// if ANY of the sets match ALL of its comparators, then pass
Range.prototype.test = function (version) {
  if (!version) {
    return false
  }

  if (typeof version === 'string') {
    version = new SemVer(version, this.options)
  }

  for (var i = 0; i < this.set.length; i++) {
    if (testSet(this.set[i], version, this.options)) {
      return true
    }
  }
  return false
}

function testSet (set, version, options) {
  for (var i = 0; i < set.length; i++) {
    if (!set[i].test(version)) {
      return false
    }
  }

  if (version.prerelease.length && !options.includePrerelease) {
    // Find the set of versions that are allowed to have prereleases
    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
    // That should allow `1.2.3-pr.2` to pass.
    // However, `1.2.4-alpha.notready` should NOT be allowed,
    // even though it's within the range set by the comparators.
    for (i = 0; i < set.length; i++) {
      debug(set[i].semver)
      if (set[i].semver === ANY) {
        continue
      }

      if (set[i].semver.prerelease.length > 0) {
        var allowed = set[i].semver
        if (allowed.major === version.major &&
            allowed.minor === version.minor &&
            allowed.patch === version.patch) {
          return true
        }
      }
    }

    // Version has a -pre, but it's not one of the ones we like.
    return false
  }

  return true
}

exports.satisfies = satisfies
function satisfies (version, range, options) {
  try {
    range = new Range(range, options)
  } catch (er) {
    return false
  }
  return range.test(version)
}

exports.maxSatisfying = maxSatisfying
function maxSatisfying (versions, range, options) {
  var max = null
  var maxSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (v) {
    if (rangeObj.test(v)) {
      // satisfies(v, range, options)
      if (!max || maxSV.compare(v) === -1) {
        // compare(max, v, true)
        max = v
        maxSV = new SemVer(max, options)
      }
    }
  })
  return max
}

exports.minSatisfying = minSatisfying
function minSatisfying (versions, range, options) {
  var min = null
  var minSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (v) {
    if (rangeObj.test(v)) {
      // satisfies(v, range, options)
      if (!min || minSV.compare(v) === 1) {
        // compare(min, v, true)
        min = v
        minSV = new SemVer(min, options)
      }
    }
  })
  return min
}

exports.minVersion = minVersion
function minVersion (range, loose) {
  range = new Range(range, loose)

  var minver = new SemVer('0.0.0')
  if (range.test(minver)) {
    return minver
  }

  minver = new SemVer('0.0.0-0')
  if (range.test(minver)) {
    return minver
  }

  minver = null
  for (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    comparators.forEach(function (comparator) {
      // Clone to avoid manipulating the comparator's semver object.
      var compver = new SemVer(comparator.semver.version)
      switch (comparator.operator) {
        case '>':
          if (compver.prerelease.length === 0) {
            compver.patch++
          } else {
            compver.prerelease.push(0)
          }
          compver.raw = compver.format()
          /* fallthrough */
        case '':
        case '>=':
          if (!minver || gt(minver, compver)) {
            minver = compver
          }
          break
        case '<':
        case '<=':
          /* Ignore maximum versions */
          break
        /* istanbul ignore next */
        default:
          throw new Error('Unexpected operation: ' + comparator.operator)
      }
    })
  }

  if (minver && range.test(minver)) {
    return minver
  }

  return null
}

exports.validRange = validRange
function validRange (range, options) {
  try {
    // Return '*' instead of '' so that truthiness works.
    // This will throw if it's invalid anyway
    return new Range(range, options).range || '*'
  } catch (er) {
    return null
  }
}

// Determine if version is less than all the versions possible in the range
exports.ltr = ltr
function ltr (version, range, options) {
  return outside(version, range, '<', options)
}

// Determine if version is greater than all the versions possible in the range.
exports.gtr = gtr
function gtr (version, range, options) {
  return outside(version, range, '>', options)
}

exports.outside = outside
function outside (version, range, hilo, options) {
  version = new SemVer(version, options)
  range = new Range(range, options)

  var gtfn, ltefn, ltfn, comp, ecomp
  switch (hilo) {
    case '>':
      gtfn = gt
      ltefn = lte
      ltfn = lt
      comp = '>'
      ecomp = '>='
      break
    case '<':
      gtfn = lt
      ltefn = gte
      ltfn = gt
      comp = '<'
      ecomp = '<='
      break
    default:
      throw new TypeError('Must provide a hilo val of "<" or ">"')
  }

  // If it satisifes the range it is not outside
  if (satisfies(version, range, options)) {
    return false
  }

  // From now on, variable terms are as if we're in "gtr" mode.
  // but note that everything is flipped for the "ltr" function.

  for (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    var high = null
    var low = null

    comparators.forEach(function (comparator) {
      if (comparator.semver === ANY) {
        comparator = new Comparator('>=0.0.0')
      }
      high = high || comparator
      low = low || comparator
      if (gtfn(comparator.semver, high.semver, options)) {
        high = comparator
      } else if (ltfn(comparator.semver, low.semver, options)) {
        low = comparator
      }
    })

    // If the edge version comparator has a operator then our version
    // isn't outside it
    if (high.operator === comp || high.operator === ecomp) {
      return false
    }

    // If the lowest version comparator has an operator and our version
    // is less than it then it isn't higher than the range
    if ((!low.operator || low.operator === comp) &&
        ltefn(version, low.semver)) {
      return false
    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
      return false
    }
  }
  return true
}

exports.prerelease = prerelease
function prerelease (version, options) {
  var parsed = parse(version, options)
  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
}

exports.intersects = intersects
function intersects (r1, r2, options) {
  r1 = new Range(r1, options)
  r2 = new Range(r2, options)
  return r1.intersects(r2)
}

exports.coerce = coerce
function coerce (version) {
  if (version instanceof SemVer) {
    return version
  }

  if (typeof version !== 'string') {
    return null
  }

  var match = version.match(re[COERCE])

  if (match == null) {
    return null
  }

  return parse(match[1] +
    '.' + (match[2] || '0') +
    '.' + (match[3] || '0'))
}
#!/usr/bin/env node
// Standalone semver comparison program.
// Exits successfully and prints matching version(s) if
// any supplied version is valid and passes all tests.

var argv = process.argv.slice(2)

var versions = []

var range = []

var inc = null

var version = require('../package.json').version

var loose = false

var includePrerelease = false

var coerce = false

var identifier

var semver = require('../semver')

var reverse = false

var options = {}

main()

function main () {
  if (!argv.length) return help()
  while (argv.length) {
    var a = argv.shift()
    var indexOfEqualSign = a.indexOf('=')
    if (indexOfEqualSign !== -1) {
      a = a.slice(0, indexOfEqualSign)
      argv.unshift(a.slice(indexOfEqualSign + 1))
    }
    switch (a) {
      case '-rv': case '-rev': case '--rev': case '--reverse':
        reverse = true
        break
      case '-l': case '--loose':
        loose = true
        break
      case '-p': case '--include-prerelease':
        includePrerelease = true
        break
      case '-v': case '--version':
        versions.push(argv.shift())
        break
      case '-i': case '--inc': case '--increment':
        switch (argv[0]) {
          case 'major': case 'minor': case 'patch': case 'prerelease':
          case 'premajor': case 'preminor': case 'prepatch':
            inc = argv.shift()
            break
          default:
            inc = 'patch'
            break
        }
        break
      case '--preid':
        identifier = argv.shift()
        break
      case '-r': case '--range':
        range.push(argv.shift())
        break
      case '-c': case '--coerce':
        coerce = true
        break
      case '-h': case '--help': case '-?':
        return help()
      default:
        versions.push(a)
        break
    }
  }

  var options = { loose: loose, includePrerelease: includePrerelease }

  versions = versions.map(function (v) {
    return coerce ? (semver.coerce(v) || { version: v }).version : v
  }).filter(function (v) {
    return semver.valid(v)
  })
  if (!versions.length) return fail()
  if (inc && (versions.length !== 1 || range.length)) { return failInc() }

  for (var i = 0, l = range.length; i < l; i++) {
    versions = versions.filter(function (v) {
      return semver.satisfies(v, range[i], options)
    })
    if (!versions.length) return fail()
  }
  return success(versions)
}

function failInc () {
  console.error('--inc can only be used on a single version with no range')
  fail()
}

function fail () { process.exit(1) }

function success () {
  var compare = reverse ? 'rcompare' : 'compare'
  versions.sort(function (a, b) {
    return semver[compare](a, b, options)
  }).map(function (v) {
    return semver.clean(v, options)
  }).map(function (v) {
    return inc ? semver.inc(v, inc, options, identifier) : v
  }).forEach(function (v, i, _) { console.log(v) })
}

function help () {
  console.log(['SemVer ' + version,
    '',
    'A JavaScript implementation of the https://semver.org/ specification',
    'Copyright Isaac Z. Schlueter',
    '',
    'Usage: semver [options] <version> [<version> [...]]',
    'Prints valid versions sorted by SemVer precedence',
    '',
    'Options:',
    '-r --range <range>',
    '        Print versions that match the specified range.',
    '',
    '-i --increment [<level>]',
    '        Increment a version by the specified level.  Level can',
    '        be one of: major, minor, patch, premajor, preminor,',
    "        prepatch, or prerelease.  Default level is 'patch'.",
    '        Only one version may be specified.',
    '',
    '--preid <identifier>',
    '        Identifier to be used to prefix premajor, preminor,',
    '        prepatch or prerelease version increments.',
    '',
    '-l --loose',
    '        Interpret versions and ranges loosely',
    '',
    '-p --include-prerelease',
    '        Always include prerelease versions in range matching',
    '',
    '-c --coerce',
    '        Coerce a string into SemVer if possible',
    '        (does not imply --loose)',
    '',
    'Program exits successfully if any valid version satisfies',
    'all supplied ranges, and prints all satisfying versions.',
    '',
    'If no satisfying versions are found, then exits failure.',
    '',
    'Versions are printed in ascending order, so supplying',
    'multiple versions to the utility will just sort them.'
  ].join('\n'))
}
'use strict';
var semver = require('semver');

module.exports = function (a, b) {
	if (semver.gt(a, b)) {
		return null;
	}

	a = semver.parse(a);
	b = semver.parse(b);

	for (var key in a) {
		if (key === 'major' || key === 'minor' || key === 'patch') {
			if (a[key] !== b[key]) {
				return key;
			}
		}

		if (key === 'prerelease' || key === 'build') {
			if (JSON.stringify(a[key]) !== JSON.stringify(b[key])) {
				return key;
			}
		}
	}

	return null;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "http://sindresorhus.com"
  },
  "dependencies": {
    "semver": "^5.0.3"
  },
  "deprecated": false,
  "description": "Get the diff type of two semver versions: 0.0.1 0.0.2 â†’ patch",
  "devDependencies": {
    "mocha": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/semver-diff#readme",
  "license": "MIT",
  "name": "semver-diff",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/semver-diff.git"
  },
  "version": "2.1.0"
}Copyright (c) 2016, Contributors

Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice
appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
module.exports = function (blocking) {
  [process.stdout, process.stderr].forEach(function (stream) {
    if (stream._handle && stream.isTTY && typeof stream._handle.setBlocking === 'function') {
      stream._handle.setBlocking(blocking)
    }
  })
}
{
  "author": {
    "name": "Ben Coe",
    "email": "ben@npmjs.com"
  },
  "deprecated": false,
  "description": "set blocking stdio and stderr ensuring that terminal output does not truncate",
  "devDependencies": {
    "chai": "^3.5.0",
    "coveralls": "^2.11.9",
    "mocha": "^2.4.5",
    "nyc": "^6.4.4",
    "standard": "^7.0.1",
    "standard-version": "^2.2.1"
  },
  "files": [
    "index.js",
    "LICENSE.txt"
  ],
  "homepage": "https://github.com/yargs/set-blocking#readme",
  "license": "ISC",
  "main": "index.js",
  "name": "set-blocking",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/yargs/set-blocking.git"
  },
  "version": "2.0.0"
}'use strict';
var shebangRegex = require('shebang-regex');

module.exports = function (str) {
	var match = str.match(shebangRegex);

	if (!match) {
		return null;
	}

	var arr = match[0].replace(/#! ?/, '').split(' ');
	var bin = arr[0].split('/').pop();
	var arg = arr[1];

	return (bin === 'env' ?
		arg :
		bin + (arg ? ' ' + arg : '')
	);
};
The MIT License (MIT)

Copyright (c) Kevin Martensson <kevinmartensson@gmail.com> (github.com/kevva)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Kevin Martensson",
    "email": "kevinmartensson@gmail.com",
    "url": "github.com/kevva"
  },
  "dependencies": {
    "shebang-regex": "^1.0.0"
  },
  "deprecated": false,
  "description": "Get the command from a shebang",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/kevva/shebang-command#readme",
  "license": "MIT",
  "name": "shebang-command",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/kevva/shebang-command.git"
  },
  "version": "1.2.0"
}'use strict';
module.exports = /^#!.*/;
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Regular expression for matching a shebang",
  "devDependencies": {
    "ava": "0.0.4"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/shebang-regex#readme",
  "license": "MIT",
  "name": "shebang-regex",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/shebang-regex.git"
  },
  "version": "1.0.0"
}{
  "name": "ShellJS",
  "twitter": [
    "r2r"
  ]
}
Copyright (c) 2012, Artur Adib <aadib@mozilla.com>
All rights reserved.

You may use this project under the terms of the New BSD license as follows:

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
    * Neither the name of Artur Adib nor the
      names of the contributors may be used to endorse or promote products
      derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Release steps

* Ensure master passes CI tests
* Bump version in package.json. Any breaking change or new feature should bump minor (or even major). Non-breaking changes or fixes can just bump patch.
* Update README manually if the changes are not documented in-code. If so, run `scripts/generate-docs.js`
* Commit
* `$ git tag <version>` (see `git tag -l` for latest)
* `$ git push origin master --tags`
* `$ npm publish .`
var shell = require('./shell.js');
for (var cmd in shell)
  global[cmd] = shell[cmd];
require('./global');

global.config.fatal = true;
global.target = {};

var args = process.argv.slice(2),
  targetArgs,
  dashesLoc = args.indexOf('--');

// split args, everything after -- if only for targets
if (dashesLoc > -1) {
  targetArgs = args.slice(dashesLoc + 1, args.length);
  args = args.slice(0, dashesLoc);
}

// This ensures we only execute the script targets after the entire script has
// been evaluated
setTimeout(function() {
  var t;

  if (args.length === 1 && args[0] === '--help') {
    console.log('Available targets:');
    for (t in global.target)
      console.log('  ' + t);
    return;
  }

  // Wrap targets to prevent duplicate execution
  for (t in global.target) {
    (function(t, oldTarget){

      // Wrap it
      global.target[t] = function() {
        if (oldTarget.done)
          return;
        oldTarget.done = true;
        return oldTarget.apply(oldTarget, arguments);
      };

    })(t, global.target[t]);
  }

  // Execute desired targets
  if (args.length > 0) {
    args.forEach(function(arg) {
      if (arg in global.target)
        global.target[arg](targetArgs);
      else {
        console.log('no such target: ' + arg);
      }
    });
  } else if ('all' in global.target) {
    global.target.all(targetArgs);
  }

}, 0);
{
  "author": {
    "name": "Artur Adib",
    "email": "arturadib@gmail.com"
  },
  "bin": {
    "shjs": "bin/shjs"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Portable Unix shell commands for Node.js",
  "devDependencies": {
    "jshint": "~2.1.11"
  },
  "engines": {
    "node": ">=0.8.0"
  },
  "homepage": "http://github.com/arturadib/shelljs",
  "license": "BSD*",
  "main": "./shell.js",
  "name": "shelljs",
  "optionalDependencies": {},
  "repository": {
    "type": "git",
    "url": "git://github.com/arturadib/shelljs.git"
  },
  "version": "0.5.3"
}//
// ShellJS
// Unix shell commands on top of Node's API
//
// Copyright (c) 2012 Artur Adib
// http://github.com/arturadib/shelljs
//

var common = require('./src/common');


//@
//@ All commands run synchronously, unless otherwise stated.
//@

//@include ./src/cd
var _cd = require('./src/cd');
exports.cd = common.wrap('cd', _cd);

//@include ./src/pwd
var _pwd = require('./src/pwd');
exports.pwd = common.wrap('pwd', _pwd);

//@include ./src/ls
var _ls = require('./src/ls');
exports.ls = common.wrap('ls', _ls);

//@include ./src/find
var _find = require('./src/find');
exports.find = common.wrap('find', _find);

//@include ./src/cp
var _cp = require('./src/cp');
exports.cp = common.wrap('cp', _cp);

//@include ./src/rm
var _rm = require('./src/rm');
exports.rm = common.wrap('rm', _rm);

//@include ./src/mv
var _mv = require('./src/mv');
exports.mv = common.wrap('mv', _mv);

//@include ./src/mkdir
var _mkdir = require('./src/mkdir');
exports.mkdir = common.wrap('mkdir', _mkdir);

//@include ./src/test
var _test = require('./src/test');
exports.test = common.wrap('test', _test);

//@include ./src/cat
var _cat = require('./src/cat');
exports.cat = common.wrap('cat', _cat);

//@include ./src/to
var _to = require('./src/to');
String.prototype.to = common.wrap('to', _to);

//@include ./src/toEnd
var _toEnd = require('./src/toEnd');
String.prototype.toEnd = common.wrap('toEnd', _toEnd);

//@include ./src/sed
var _sed = require('./src/sed');
exports.sed = common.wrap('sed', _sed);

//@include ./src/grep
var _grep = require('./src/grep');
exports.grep = common.wrap('grep', _grep);

//@include ./src/which
var _which = require('./src/which');
exports.which = common.wrap('which', _which);

//@include ./src/echo
var _echo = require('./src/echo');
exports.echo = _echo; // don't common.wrap() as it could parse '-options'

//@include ./src/dirs
var _dirs = require('./src/dirs').dirs;
exports.dirs = common.wrap("dirs", _dirs);
var _pushd = require('./src/dirs').pushd;
exports.pushd = common.wrap('pushd', _pushd);
var _popd = require('./src/dirs').popd;
exports.popd = common.wrap("popd", _popd);

//@include ./src/ln
var _ln = require('./src/ln');
exports.ln = common.wrap('ln', _ln);

//@
//@ ### exit(code)
//@ Exits the current process with the given exit code.
exports.exit = process.exit;

//@
//@ ### env['VAR_NAME']
//@ Object containing environment variables (both getter and setter). Shortcut to process.env.
exports.env = process.env;

//@include ./src/exec
var _exec = require('./src/exec');
exports.exec = common.wrap('exec', _exec, {notUnix:true});

//@include ./src/chmod
var _chmod = require('./src/chmod');
exports.chmod = common.wrap('chmod', _chmod);



//@
//@ ## Non-Unix commands
//@

//@include ./src/tempdir
var _tempDir = require('./src/tempdir');
exports.tempdir = common.wrap('tempdir', _tempDir);


//@include ./src/error
var _error = require('./src/error');
exports.error = _error;



//@
//@ ## Configuration
//@

exports.config = common.config;

//@
//@ ### config.silent
//@ Example:
//@
//@ ```javascript
//@ var sh = require('shelljs');
//@ var silentState = sh.config.silent; // save old silent state
//@ sh.config.silent = true;
//@ /* ... */
//@ sh.config.silent = silentState; // restore old silent state
//@ ```
//@
//@ Suppresses all command output if `true`, except for `echo()` calls.
//@ Default is `false`.

//@
//@ ### config.fatal
//@ Example:
//@
//@ ```javascript
//@ require('shelljs/global');
//@ config.fatal = true;
//@ cp('this_file_does_not_exist', '/dev/null'); // dies here
//@ /* more commands... */
//@ ```
//@
//@ If `true` the script will die on errors. Default is `false`.
var common = require('./common');
var fs = require('fs');

//@
//@ ### cat(file [, file ...])
//@ ### cat(file_array)
//@
//@ Examples:
//@
//@ ```javascript
//@ var str = cat('file*.txt');
//@ var str = cat('file1', 'file2');
//@ var str = cat(['file1', 'file2']); // same as above
//@ ```
//@
//@ Returns a string containing the given file, or a concatenated string
//@ containing the files if more than one file is given (a new line character is
//@ introduced between each file). Wildcard `*` accepted.
function _cat(options, files) {
  var cat = '';

  if (!files)
    common.error('no paths given');

  if (typeof files === 'string')
    files = [].slice.call(arguments, 1);
  // if it's array leave it as it is

  files = common.expand(files);

  files.forEach(function(file) {
    if (!fs.existsSync(file))
      common.error('no such file or directory: ' + file);

    cat += fs.readFileSync(file, 'utf8') + '\n';
  });

  if (cat[cat.length-1] === '\n')
    cat = cat.substring(0, cat.length-1);

  return common.ShellString(cat);
}
module.exports = _cat;
var fs = require('fs');
var common = require('./common');

//@
//@ ### cd('dir')
//@ Changes to directory `dir` for the duration of the script
function _cd(options, dir) {
  if (!dir)
    common.error('directory not specified');

  if (!fs.existsSync(dir))
    common.error('no such file or directory: ' + dir);

  if (!fs.statSync(dir).isDirectory())
    common.error('not a directory: ' + dir);

  process.chdir(dir);
}
module.exports = _cd;
var common = require('./common');
var fs = require('fs');
var path = require('path');

var PERMS = (function (base) {
  return {
    OTHER_EXEC  : base.EXEC,
    OTHER_WRITE : base.WRITE,
    OTHER_READ  : base.READ,

    GROUP_EXEC  : base.EXEC  << 3,
    GROUP_WRITE : base.WRITE << 3,
    GROUP_READ  : base.READ << 3,

    OWNER_EXEC  : base.EXEC << 6,
    OWNER_WRITE : base.WRITE << 6,
    OWNER_READ  : base.READ << 6,

    // Literal octal numbers are apparently not allowed in "strict" javascript.  Using parseInt is
    // the preferred way, else a jshint warning is thrown.
    STICKY      : parseInt('01000', 8),
    SETGID      : parseInt('02000', 8),
    SETUID      : parseInt('04000', 8),

    TYPE_MASK   : parseInt('0770000', 8)
  };
})({
  EXEC  : 1,
  WRITE : 2,
  READ  : 4
});

//@
//@ ### chmod(octal_mode || octal_string, file)
//@ ### chmod(symbolic_mode, file)
//@
//@ Available options:
//@
//@ + `-v`: output a diagnostic for every file processed//@
//@ + `-c`: like verbose but report only when a change is made//@
//@ + `-R`: change files and directories recursively//@
//@
//@ Examples:
//@
//@ ```javascript
//@ chmod(755, '/Users/brandon');
//@ chmod('755', '/Users/brandon'); // same as above
//@ chmod('u+x', '/Users/brandon');
//@ ```
//@
//@ Alters the permissions of a file or directory by either specifying the
//@ absolute permissions in octal form or expressing the changes in symbols.
//@ This command tries to mimic the POSIX behavior as much as possible.
//@ Notable exceptions:
//@
//@ + In symbolic modes, 'a-r' and '-r' are identical.  No consideration is
//@   given to the umask.
//@ + There is no "quiet" option since default behavior is to run silent.
function _chmod(options, mode, filePattern) {
  if (!filePattern) {
    if (options.length > 0 && options.charAt(0) === '-') {
      // Special case where the specified file permissions started with - to subtract perms, which
      // get picked up by the option parser as command flags.
      // If we are down by one argument and options starts with -, shift everything over.
      filePattern = mode;
      mode = options;
      options = '';
    }
    else {
      common.error('You must specify a file.');
    }
  }

  options = common.parseOptions(options, {
    'R': 'recursive',
    'c': 'changes',
    'v': 'verbose'
  });

  if (typeof filePattern === 'string') {
    filePattern = [ filePattern ];
  }

  var files;

  if (options.recursive) {
    files = [];
    common.expand(filePattern).forEach(function addFile(expandedFile) {
      var stat = fs.lstatSync(expandedFile);

      if (!stat.isSymbolicLink()) {
        files.push(expandedFile);

        if (stat.isDirectory()) {  // intentionally does not follow symlinks.
          fs.readdirSync(expandedFile).forEach(function (child) {
            addFile(expandedFile + '/' + child);
          });
        }
      }
    });
  }
  else {
    files = common.expand(filePattern);
  }

  files.forEach(function innerChmod(file) {
    file = path.resolve(file);
    if (!fs.existsSync(file)) {
      common.error('File not found: ' + file);
    }

    // When recursing, don't follow symlinks.
    if (options.recursive && fs.lstatSync(file).isSymbolicLink()) {
      return;
    }

    var perms = fs.statSync(file).mode;
    var type = perms & PERMS.TYPE_MASK;

    var newPerms = perms;

    if (isNaN(parseInt(mode, 8))) {
      // parse options
      mode.split(',').forEach(function (symbolicMode) {
        /*jshint regexdash:true */
        var pattern = /([ugoa]*)([=\+-])([rwxXst]*)/i;
        var matches = pattern.exec(symbolicMode);

        if (matches) {
          var applyTo = matches[1];
          var operator = matches[2];
          var change = matches[3];

          var changeOwner = applyTo.indexOf('u') != -1 || applyTo === 'a' || applyTo === '';
          var changeGroup = applyTo.indexOf('g') != -1 || applyTo === 'a' || applyTo === '';
          var changeOther = applyTo.indexOf('o') != -1 || applyTo === 'a' || applyTo === '';

          var changeRead   = change.indexOf('r') != -1;
          var changeWrite  = change.indexOf('w') != -1;
          var changeExec   = change.indexOf('x') != -1;
          var changeSticky = change.indexOf('t') != -1;
          var changeSetuid = change.indexOf('s') != -1;

          var mask = 0;
          if (changeOwner) {
            mask |= (changeRead ? PERMS.OWNER_READ : 0) + (changeWrite ? PERMS.OWNER_WRITE : 0) + (changeExec ? PERMS.OWNER_EXEC : 0) + (changeSetuid ? PERMS.SETUID : 0);
          }
          if (changeGroup) {
            mask |= (changeRead ? PERMS.GROUP_READ : 0) + (changeWrite ? PERMS.GROUP_WRITE : 0) + (changeExec ? PERMS.GROUP_EXEC : 0) + (changeSetuid ? PERMS.SETGID : 0);
          }
          if (changeOther) {
            mask |= (changeRead ? PERMS.OTHER_READ : 0) + (changeWrite ? PERMS.OTHER_WRITE : 0) + (changeExec ? PERMS.OTHER_EXEC : 0);
          }

          // Sticky bit is special - it's not tied to user, group or other.
          if (changeSticky) {
            mask |= PERMS.STICKY;
          }

          switch (operator) {
            case '+':
              newPerms |= mask;
              break;

            case '-':
              newPerms &= ~mask;
              break;

            case '=':
              newPerms = type + mask;

              // According to POSIX, when using = to explicitly set the permissions, setuid and setgid can never be cleared.
              if (fs.statSync(file).isDirectory()) {
                newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms;
              }
              break;
          }

          if (options.verbose) {
            log(file + ' -> ' + newPerms.toString(8));
          }

          if (perms != newPerms) {
            if (!options.verbose && options.changes) {
              log(file + ' -> ' + newPerms.toString(8));
            }
            fs.chmodSync(file, newPerms);
          }
        }
        else {
          common.error('Invalid symbolic mode change: ' + symbolicMode);
        }
      });
    }
    else {
      // they gave us a full number
      newPerms = type + parseInt(mode, 8);

      // POSIX rules are that setuid and setgid can only be added using numeric form, but not cleared.
      if (fs.statSync(file).isDirectory()) {
        newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms;
      }

      fs.chmodSync(file, newPerms);
    }
  });
}
module.exports = _chmod;
var os = require('os');
var fs = require('fs');
var _ls = require('./ls');

// Module globals
var config = {
  silent: false,
  fatal: false
};
exports.config = config;

var state = {
  error: null,
  currentCmd: 'shell.js',
  tempDir: null
};
exports.state = state;

var platform = os.type().match(/^Win/) ? 'win' : 'unix';
exports.platform = platform;

function log() {
  if (!config.silent)
    console.log.apply(this, arguments);
}
exports.log = log;

// Shows error message. Throws unless _continue or config.fatal are true
function error(msg, _continue) {
  if (state.error === null)
    state.error = '';
  state.error += state.currentCmd + ': ' + msg + '\n';

  if (msg.length > 0)
    log(state.error);

  if (config.fatal)
    process.exit(1);

  if (!_continue)
    throw '';
}
exports.error = error;

// In the future, when Proxies are default, we can add methods like `.to()` to primitive strings.
// For now, this is a dummy function to bookmark places we need such strings
function ShellString(str) {
  return str;
}
exports.ShellString = ShellString;

// Returns {'alice': true, 'bob': false} when passed a dictionary, e.g.:
//   parseOptions('-a', {'a':'alice', 'b':'bob'});
function parseOptions(str, map) {
  if (!map)
    error('parseOptions() internal error: no map given');

  // All options are false by default
  var options = {};
  for (var letter in map)
    options[map[letter]] = false;

  if (!str)
    return options; // defaults

  if (typeof str !== 'string')
    error('parseOptions() internal error: wrong str');

  // e.g. match[1] = 'Rf' for str = '-Rf'
  var match = str.match(/^\-(.+)/);
  if (!match)
    return options;

  // e.g. chars = ['R', 'f']
  var chars = match[1].split('');

  chars.forEach(function(c) {
    if (c in map)
      options[map[c]] = true;
    else
      error('option not recognized: '+c);
  });

  return options;
}
exports.parseOptions = parseOptions;

// Expands wildcards with matching (ie. existing) file names.
// For example:
//   expand(['file*.js']) = ['file1.js', 'file2.js', ...]
//   (if the files 'file1.js', 'file2.js', etc, exist in the current dir)
function expand(list) {
  var expanded = [];
  list.forEach(function(listEl) {
    // Wildcard present on directory names ?
    if(listEl.search(/\*[^\/]*\//) > -1 || listEl.search(/\*\*[^\/]*\//) > -1) {
      var match = listEl.match(/^([^*]+\/|)(.*)/);
      var root = match[1];
      var rest = match[2];
      var restRegex = rest.replace(/\*\*/g, ".*").replace(/\*/g, "[^\\/]*");
      restRegex = new RegExp(restRegex);
      
      _ls('-R', root).filter(function (e) {
        return restRegex.test(e);
      }).forEach(function(file) {
        expanded.push(file);
      });
    }
    // Wildcard present on file names ?
    else if (listEl.search(/\*/) > -1) {
      _ls('', listEl).forEach(function(file) {
        expanded.push(file);
      });
    } else {
      expanded.push(listEl);
    }
  });
  return expanded;
}
exports.expand = expand;

// Normalizes _unlinkSync() across platforms to match Unix behavior, i.e.
// file can be unlinked even if it's read-only, see https://github.com/joyent/node/issues/3006
function unlinkSync(file) {
  try {
    fs.unlinkSync(file);
  } catch(e) {
    // Try to override file permission
    if (e.code === 'EPERM') {
      fs.chmodSync(file, '0666');
      fs.unlinkSync(file);
    } else {
      throw e;
    }
  }
}
exports.unlinkSync = unlinkSync;

// e.g. 'shelljs_a5f185d0443ca...'
function randomFileName() {
  function randomHash(count) {
    if (count === 1)
      return parseInt(16*Math.random(), 10).toString(16);
    else {
      var hash = '';
      for (var i=0; i<count; i++)
        hash += randomHash(1);
      return hash;
    }
  }

  return 'shelljs_'+randomHash(20);
}
exports.randomFileName = randomFileName;

// extend(target_obj, source_obj1 [, source_obj2 ...])
// Shallow extend, e.g.:
//    extend({A:1}, {b:2}, {c:3}) returns {A:1, b:2, c:3}
function extend(target) {
  var sources = [].slice.call(arguments, 1);
  sources.forEach(function(source) {
    for (var key in source)
      target[key] = source[key];
  });

  return target;
}
exports.extend = extend;

// Common wrapper for all Unix-like commands
function wrap(cmd, fn, options) {
  return function() {
    var retValue = null;

    state.currentCmd = cmd;
    state.error = null;

    try {
      var args = [].slice.call(arguments, 0);

      if (options && options.notUnix) {
        retValue = fn.apply(this, args);
      } else {
        if (args.length === 0 || typeof args[0] !== 'string' || args[0][0] !== '-')
          args.unshift(''); // only add dummy option if '-option' not already present
        retValue = fn.apply(this, args);
      }
    } catch (e) {
      if (!state.error) {
        // If state.error hasn't been set it's an error thrown by Node, not us - probably a bug...
        console.log('shell.js: internal error');
        console.log(e.stack || e);
        process.exit(1);
      }
      if (config.fatal)
        throw e;
    }

    state.currentCmd = 'shell.js';
    return retValue;
  };
} // wrap
exports.wrap = wrap;
var fs = require('fs');
var path = require('path');
var common = require('./common');
var os = require('os');

// Buffered file copy, synchronous
// (Using readFileSync() + writeFileSync() could easily cause a memory overflow
//  with large files)
function copyFileSync(srcFile, destFile) {
  if (!fs.existsSync(srcFile))
    common.error('copyFileSync: no such file or directory: ' + srcFile);

  var BUF_LENGTH = 64*1024,
      buf = new Buffer(BUF_LENGTH),
      bytesRead = BUF_LENGTH,
      pos = 0,
      fdr = null,
      fdw = null;

  try {
    fdr = fs.openSync(srcFile, 'r');
  } catch(e) {
    common.error('copyFileSync: could not read src file ('+srcFile+')');
  }

  try {
    fdw = fs.openSync(destFile, 'w');
  } catch(e) {
    common.error('copyFileSync: could not write to dest file (code='+e.code+'):'+destFile);
  }

  while (bytesRead === BUF_LENGTH) {
    bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos);
    fs.writeSync(fdw, buf, 0, bytesRead);
    pos += bytesRead;
  }

  fs.closeSync(fdr);
  fs.closeSync(fdw);

  fs.chmodSync(destFile, fs.statSync(srcFile).mode);
}

// Recursively copies 'sourceDir' into 'destDir'
// Adapted from https://github.com/ryanmcgrath/wrench-js
//
// Copyright (c) 2010 Ryan McGrath
// Copyright (c) 2012 Artur Adib
//
// Licensed under the MIT License
// http://www.opensource.org/licenses/mit-license.php
function cpdirSyncRecursive(sourceDir, destDir, opts) {
  if (!opts) opts = {};

  /* Create the directory where all our junk is moving to; read the mode of the source directory and mirror it */
  var checkDir = fs.statSync(sourceDir);
  try {
    fs.mkdirSync(destDir, checkDir.mode);
  } catch (e) {
    //if the directory already exists, that's okay
    if (e.code !== 'EEXIST') throw e;
  }

  var files = fs.readdirSync(sourceDir);

  for (var i = 0; i < files.length; i++) {
    var srcFile = sourceDir + "/" + files[i];
    var destFile = destDir + "/" + files[i];
    var srcFileStat = fs.lstatSync(srcFile);

    if (srcFileStat.isDirectory()) {
      /* recursion this thing right on back. */
      cpdirSyncRecursive(srcFile, destFile, opts);
    } else if (srcFileStat.isSymbolicLink()) {
      var symlinkFull = fs.readlinkSync(srcFile);
      fs.symlinkSync(symlinkFull, destFile, os.platform() === "win32" ? "junction" : null);
    } else {
      /* At this point, we've hit a file actually worth copying... so copy it on over. */
      if (fs.existsSync(destFile) && !opts.force) {
        common.log('skipping existing file: ' + files[i]);
      } else {
        copyFileSync(srcFile, destFile);
      }
    }

  } // for files
} // cpdirSyncRecursive


//@
//@ ### cp([options ,] source [,source ...], dest)
//@ ### cp([options ,] source_array, dest)
//@ Available options:
//@
//@ + `-f`: force
//@ + `-r, -R`: recursive
//@
//@ Examples:
//@
//@ ```javascript
//@ cp('file1', 'dir1');
//@ cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp');
//@ cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above
//@ ```
//@
//@ Copies files. The wildcard `*` is accepted.
function _cp(options, sources, dest) {
  options = common.parseOptions(options, {
    'f': 'force',
    'R': 'recursive',
    'r': 'recursive'
  });

  // Get sources, dest
  if (arguments.length < 3) {
    common.error('missing <source> and/or <dest>');
  } else if (arguments.length > 3) {
    sources = [].slice.call(arguments, 1, arguments.length - 1);
    dest = arguments[arguments.length - 1];
  } else if (typeof sources === 'string') {
    sources = [sources];
  } else if ('length' in sources) {
    sources = sources; // no-op for array
  } else {
    common.error('invalid arguments');
  }

  var exists = fs.existsSync(dest),
      stats = exists && fs.statSync(dest);

  // Dest is not existing dir, but multiple sources given
  if ((!exists || !stats.isDirectory()) && sources.length > 1)
    common.error('dest is not a directory (too many sources)');

  // Dest is an existing file, but no -f given
  if (exists && stats.isFile() && !options.force)
    common.error('dest file already exists: ' + dest);

  if (options.recursive) {
    // Recursive allows the shortcut syntax "sourcedir/" for "sourcedir/*"
    // (see Github issue #15)
    sources.forEach(function(src, i) {
      if (src[src.length - 1] === '/')
        sources[i] += '*';
    });

    // Create dest
    try {
      fs.mkdirSync(dest, parseInt('0777', 8));
    } catch (e) {
      // like Unix's cp, keep going even if we can't create dest dir
    }
  }

  sources = common.expand(sources);

  sources.forEach(function(src) {
    if (!fs.existsSync(src)) {
      common.error('no such file or directory: '+src, true);
      return; // skip file
    }

    // If here, src exists
    if (fs.statSync(src).isDirectory()) {
      if (!options.recursive) {
        // Non-Recursive
        common.log(src + ' is a directory (not copied)');
      } else {
        // Recursive
        // 'cp /a/source dest' should create 'source' in 'dest'
        var newDest = path.join(dest, path.basename(src)),
            checkDir = fs.statSync(src);
        try {
          fs.mkdirSync(newDest, checkDir.mode);
        } catch (e) {
          //if the directory already exists, that's okay
          if (e.code !== 'EEXIST') {
            common.error('dest file no such file or directory: ' + newDest, true);
            throw e;
          }
        }

        cpdirSyncRecursive(src, newDest, {force: options.force});
      }
      return; // done with dir
    }

    // If here, src is a file

    // When copying to '/path/dir':
    //    thisDest = '/path/dir/file1'
    var thisDest = dest;
    if (fs.existsSync(dest) && fs.statSync(dest).isDirectory())
      thisDest = path.normalize(dest + '/' + path.basename(src));

    if (fs.existsSync(thisDest) && !options.force) {
      common.error('dest file already exists: ' + thisDest, true);
      return; // skip file
    }

    copyFileSync(src, thisDest);
  }); // forEach(src)
}
module.exports = _cp;
var common = require('./common');
var _cd = require('./cd');
var path = require('path');

// Pushd/popd/dirs internals
var _dirStack = [];

function _isStackIndex(index) {
  return (/^[\-+]\d+$/).test(index);
}

function _parseStackIndex(index) {
  if (_isStackIndex(index)) {
    if (Math.abs(index) < _dirStack.length + 1) { // +1 for pwd
      return (/^-/).test(index) ? Number(index) - 1 : Number(index);
    } else {
      common.error(index + ': directory stack index out of range');
    }
  } else {
    common.error(index + ': invalid number');
  }
}

function _actualDirStack() {
  return [process.cwd()].concat(_dirStack);
}

//@
//@ ### pushd([options,] [dir | '-N' | '+N'])
//@
//@ Available options:
//@
//@ + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated.
//@
//@ Arguments:
//@
//@ + `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`.
//@ + `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.
//@ + `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.
//@
//@ Examples:
//@
//@ ```javascript
//@ // process.cwd() === '/usr'
//@ pushd('/etc'); // Returns /etc /usr
//@ pushd('+1');   // Returns /usr /etc
//@ ```
//@
//@ Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack.
function _pushd(options, dir) {
  if (_isStackIndex(options)) {
    dir = options;
    options = '';
  }

  options = common.parseOptions(options, {
    'n' : 'no-cd'
  });

  var dirs = _actualDirStack();

  if (dir === '+0') {
    return dirs; // +0 is a noop
  } else if (!dir) {
    if (dirs.length > 1) {
      dirs = dirs.splice(1, 1).concat(dirs);
    } else {
      return common.error('no other directory');
    }
  } else if (_isStackIndex(dir)) {
    var n = _parseStackIndex(dir);
    dirs = dirs.slice(n).concat(dirs.slice(0, n));
  } else {
    if (options['no-cd']) {
      dirs.splice(1, 0, dir);
    } else {
      dirs.unshift(dir);
    }
  }

  if (options['no-cd']) {
    dirs = dirs.slice(1);
  } else {
    dir = path.resolve(dirs.shift());
    _cd('', dir);
  }

  _dirStack = dirs;
  return _dirs('');
}
exports.pushd = _pushd;

//@
//@ ### popd([options,] ['-N' | '+N'])
//@
//@ Available options:
//@
//@ + `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated.
//@
//@ Arguments:
//@
//@ + `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero.
//@ + `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero.
//@
//@ Examples:
//@
//@ ```javascript
//@ echo(process.cwd()); // '/usr'
//@ pushd('/etc');       // '/etc /usr'
//@ echo(process.cwd()); // '/etc'
//@ popd();              // '/usr'
//@ echo(process.cwd()); // '/usr'
//@ ```
//@
//@ When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack.
function _popd(options, index) {
  if (_isStackIndex(options)) {
    index = options;
    options = '';
  }

  options = common.parseOptions(options, {
    'n' : 'no-cd'
  });

  if (!_dirStack.length) {
    return common.error('directory stack empty');
  }

  index = _parseStackIndex(index || '+0');

  if (options['no-cd'] || index > 0 || _dirStack.length + index === 0) {
    index = index > 0 ? index - 1 : index;
    _dirStack.splice(index, 1);
  } else {
    var dir = path.resolve(_dirStack.shift());
    _cd('', dir);
  }

  return _dirs('');
}
exports.popd = _popd;

//@
//@ ### dirs([options | '+N' | '-N'])
//@
//@ Available options:
//@
//@ + `-c`: Clears the directory stack by deleting all of the elements.
//@
//@ Arguments:
//@
//@ + `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero.
//@ + `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero.
//@
//@ Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified.
//@
//@ See also: pushd, popd
function _dirs(options, index) {
  if (_isStackIndex(options)) {
    index = options;
    options = '';
  }

  options = common.parseOptions(options, {
    'c' : 'clear'
  });

  if (options['clear']) {
    _dirStack = [];
    return _dirStack;
  }

  var stack = _actualDirStack();

  if (index) {
    index = _parseStackIndex(index);

    if (index < 0) {
      index = stack.length + index;
    }

    common.log(stack[index]);
    return stack[index];
  }

  common.log(stack.join(' '));

  return stack;
}
exports.dirs = _dirs;
var common = require('./common');

//@
//@ ### echo(string [,string ...])
//@
//@ Examples:
//@
//@ ```javascript
//@ echo('hello world');
//@ var str = echo('hello world');
//@ ```
//@
//@ Prints string to stdout, and returns string with additional utility methods
//@ like `.to()`.
function _echo() {
  var messages = [].slice.call(arguments, 0);
  console.log.apply(this, messages);
  return common.ShellString(messages.join(' '));
}
module.exports = _echo;
var common = require('./common');

//@
//@ ### error()
//@ Tests if error occurred in the last command. Returns `null` if no error occurred,
//@ otherwise returns string explaining the error
function error() {
  return common.state.error;
};
module.exports = error;
var common = require('./common');
var _tempDir = require('./tempdir');
var _pwd = require('./pwd');
var path = require('path');
var fs = require('fs');
var child = require('child_process');

// Hack to run child_process.exec() synchronously (sync avoids callback hell)
// Uses a custom wait loop that checks for a flag file, created when the child process is done.
// (Can't do a wait loop that checks for internal Node variables/messages as
// Node is single-threaded; callbacks and other internal state changes are done in the
// event loop).
function execSync(cmd, opts) {
  var tempDir = _tempDir();
  var stdoutFile = path.resolve(tempDir+'/'+common.randomFileName()),
      codeFile = path.resolve(tempDir+'/'+common.randomFileName()),
      scriptFile = path.resolve(tempDir+'/'+common.randomFileName()),
      sleepFile = path.resolve(tempDir+'/'+common.randomFileName());

  var options = common.extend({
    silent: common.config.silent
  }, opts);

  var previousStdoutContent = '';
  // Echoes stdout changes from running process, if not silent
  function updateStdout() {
    if (options.silent || !fs.existsSync(stdoutFile))
      return;

    var stdoutContent = fs.readFileSync(stdoutFile, 'utf8');
    // No changes since last time?
    if (stdoutContent.length <= previousStdoutContent.length)
      return;

    process.stdout.write(stdoutContent.substr(previousStdoutContent.length));
    previousStdoutContent = stdoutContent;
  }

  function escape(str) {
    return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0");
  }

  if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile);
  if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile);
  if (fs.existsSync(codeFile)) common.unlinkSync(codeFile);

  var execCommand = '"'+process.execPath+'" '+scriptFile;
  var execOptions = {
    env: process.env,
    cwd: _pwd(),
    maxBuffer: 20*1024*1024
  };

  if (typeof child.execSync === 'function') {
    var script = [
      "var child = require('child_process')",
      "  , fs = require('fs');",
      "var childProcess = child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {",
      "  fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');",
      "});",
      "var stdoutStream = fs.createWriteStream('"+escape(stdoutFile)+"');",
      "childProcess.stdout.pipe(stdoutStream, {end: false});",
      "childProcess.stderr.pipe(stdoutStream, {end: false});",
      "childProcess.stdout.pipe(process.stdout);",
      "childProcess.stderr.pipe(process.stderr);",
      "var stdoutEnded = false, stderrEnded = false;",
      "function tryClosing(){ if(stdoutEnded && stderrEnded){ stdoutStream.end(); } }",
      "childProcess.stdout.on('end', function(){ stdoutEnded = true; tryClosing(); });",
      "childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosing(); });"
    ].join('\n');

    fs.writeFileSync(scriptFile, script);

    if (options.silent) {
      execOptions.stdio = 'ignore';
    } else {
      execOptions.stdio = [0, 1, 2];
    }

    // Welcome to the future
    child.execSync(execCommand, execOptions);
  } else {
    cmd += ' > '+stdoutFile+' 2>&1'; // works on both win/unix

    var script = [
      "var child = require('child_process')",
      "  , fs = require('fs');",
      "var childProcess = child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {",
      "  fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');",
      "});"
    ].join('\n');

    fs.writeFileSync(scriptFile, script);

    child.exec(execCommand, execOptions);

    // The wait loop
    // sleepFile is used as a dummy I/O op to mitigate unnecessary CPU usage
    // (tried many I/O sync ops, writeFileSync() seems to be only one that is effective in reducing
    // CPU usage, though apparently not so much on Windows)
    while (!fs.existsSync(codeFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); }
    while (!fs.existsSync(stdoutFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); }
  }

  // At this point codeFile exists, but it's not necessarily flushed yet.
  // Keep reading it until it is.
  var code = parseInt('', 10);
  while (isNaN(code)) {
    code = parseInt(fs.readFileSync(codeFile, 'utf8'), 10);
  }

  var stdout = fs.readFileSync(stdoutFile, 'utf8');

  // No biggie if we can't erase the files now -- they're in a temp dir anyway
  try { common.unlinkSync(scriptFile); } catch(e) {}
  try { common.unlinkSync(stdoutFile); } catch(e) {}
  try { common.unlinkSync(codeFile); } catch(e) {}
  try { common.unlinkSync(sleepFile); } catch(e) {}

  // some shell return codes are defined as errors, per http://tldp.org/LDP/abs/html/exitcodes.html
  if (code === 1 || code === 2 || code >= 126)  {
      common.error('', true); // unix/shell doesn't really give an error message after non-zero exit codes
  }
  // True if successful, false if not
  var obj = {
    code: code,
    output: stdout
  };
  return obj;
} // execSync()

// Wrapper around exec() to enable echoing output to console in real time
function execAsync(cmd, opts, callback) {
  var output = '';

  var options = common.extend({
    silent: common.config.silent
  }, opts);

  var c = child.exec(cmd, {env: process.env, maxBuffer: 20*1024*1024}, function(err) {
    if (callback)
      callback(err ? err.code : 0, output);
  });

  c.stdout.on('data', function(data) {
    output += data;
    if (!options.silent)
      process.stdout.write(data);
  });

  c.stderr.on('data', function(data) {
    output += data;
    if (!options.silent)
      process.stdout.write(data);
  });

  return c;
}

//@
//@ ### exec(command [, options] [, callback])
//@ Available options (all `false` by default):
//@
//@ + `async`: Asynchronous execution. Defaults to true if a callback is provided.
//@ + `silent`: Do not echo program output to console.
//@
//@ Examples:
//@
//@ ```javascript
//@ var version = exec('node --version', {silent:true}).output;
//@
//@ var child = exec('some_long_running_process', {async:true});
//@ child.stdout.on('data', function(data) {
//@   /* ... do something with data ... */
//@ });
//@
//@ exec('some_long_running_process', function(code, output) {
//@   console.log('Exit code:', code);
//@   console.log('Program output:', output);
//@ });
//@ ```
//@
//@ Executes the given `command` _synchronously_, unless otherwise specified.
//@ When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's
//@ `output` (stdout + stderr)  and its exit `code`. Otherwise returns the child process object, and
//@ the `callback` gets the arguments `(code, output)`.
//@
//@ **Note:** For long-lived processes, it's best to run `exec()` asynchronously as
//@ the current synchronous implementation uses a lot of CPU. This should be getting
//@ fixed soon.
function _exec(command, options, callback) {
  if (!command)
    common.error('must specify command');

  // Callback is defined instead of options.
  if (typeof options === 'function') {
    callback = options;
    options = { async: true };
  }

  // Callback is defined with options.
  if (typeof options === 'object' && typeof callback === 'function') {
    options.async = true;
  }

  options = common.extend({
    silent: common.config.silent,
    async: false
  }, options);

  if (options.async)
    return execAsync(command, options, callback);
  else
    return execSync(command, options);
}
module.exports = _exec;
var fs = require('fs');
var common = require('./common');
var _ls = require('./ls');

//@
//@ ### find(path [,path ...])
//@ ### find(path_array)
//@ Examples:
//@
//@ ```javascript
//@ find('src', 'lib');
//@ find(['src', 'lib']); // same as above
//@ find('.').filter(function(file) { return file.match(/\.js$/); });
//@ ```
//@
//@ Returns array of all files (however deep) in the given paths.
//@
//@ The main difference from `ls('-R', path)` is that the resulting file names
//@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`.
function _find(options, paths) {
  if (!paths)
    common.error('no path specified');
  else if (typeof paths === 'object')
    paths = paths; // assume array
  else if (typeof paths === 'string')
    paths = [].slice.call(arguments, 1);

  var list = [];

  function pushFile(file) {
    if (common.platform === 'win')
      file = file.replace(/\\/g, '/');
    list.push(file);
  }

  // why not simply do ls('-R', paths)? because the output wouldn't give the base dirs
  // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory

  paths.forEach(function(file) {
    pushFile(file);

    if (fs.statSync(file).isDirectory()) {
      _ls('-RA', file+'/*').forEach(function(subfile) {
        pushFile(subfile);
      });
    }
  });

  return list;
}
module.exports = _find;
var common = require('./common');
var fs = require('fs');

//@
//@ ### grep([options ,] regex_filter, file [, file ...])
//@ ### grep([options ,] regex_filter, file_array)
//@ Available options:
//@
//@ + `-v`: Inverse the sense of the regex and print the lines not matching the criteria.
//@
//@ Examples:
//@
//@ ```javascript
//@ grep('-v', 'GLOBAL_VARIABLE', '*.js');
//@ grep('GLOBAL_VARIABLE', '*.js');
//@ ```
//@
//@ Reads input string from given files and returns a string containing all lines of the
//@ file that match the given `regex_filter`. Wildcard `*` accepted.
function _grep(options, regex, files) {
  options = common.parseOptions(options, {
    'v': 'inverse'
  });

  if (!files)
    common.error('no paths given');

  if (typeof files === 'string')
    files = [].slice.call(arguments, 2);
  // if it's array leave it as it is

  files = common.expand(files);

  var grep = '';
  files.forEach(function(file) {
    if (!fs.existsSync(file)) {
      common.error('no such file or directory: ' + file, true);
      return;
    }

    var contents = fs.readFileSync(file, 'utf8'),
        lines = contents.split(/\r*\n/);
    lines.forEach(function(line) {
      var matched = line.match(regex);
      if ((options.inverse && !matched) || (!options.inverse && matched))
        grep += line + '\n';
    });
  });

  return common.ShellString(grep);
}
module.exports = _grep;
var fs = require('fs');
var path = require('path');
var common = require('./common');
var os = require('os');

//@
//@ ### ln(options, source, dest)
//@ ### ln(source, dest)
//@ Available options:
//@
//@ + `s`: symlink
//@ + `f`: force
//@
//@ Examples:
//@
//@ ```javascript
//@ ln('file', 'newlink');
//@ ln('-sf', 'file', 'existing');
//@ ```
//@
//@ Links source to dest. Use -f to force the link, should dest already exist.
function _ln(options, source, dest) {
  options = common.parseOptions(options, {
    's': 'symlink',
    'f': 'force'
  });

  if (!source || !dest) {
    common.error('Missing <source> and/or <dest>');
  }

  source = path.resolve(process.cwd(), String(source));
  dest = path.resolve(process.cwd(), String(dest));

  if (!fs.existsSync(source)) {
    common.error('Source file does not exist', true);
  }

  if (fs.existsSync(dest)) {
    if (!options.force) {
      common.error('Destination file exists', true);
    }

    fs.unlinkSync(dest);
  }

  if (options.symlink) {
    fs.symlinkSync(source, dest, os.platform() === "win32" ? "junction" : null);
  } else {
    fs.linkSync(source, dest, os.platform() === "win32" ? "junction" : null);
  }
}
module.exports = _ln;
var path = require('path');
var fs = require('fs');
var common = require('./common');
var _cd = require('./cd');
var _pwd = require('./pwd');

//@
//@ ### ls([options ,] path [,path ...])
//@ ### ls([options ,] path_array)
//@ Available options:
//@
//@ + `-R`: recursive
//@ + `-A`: all files (include files beginning with `.`, except for `.` and `..`)
//@
//@ Examples:
//@
//@ ```javascript
//@ ls('projs/*.js');
//@ ls('-R', '/users/me', '/tmp');
//@ ls('-R', ['/users/me', '/tmp']); // same as above
//@ ```
//@
//@ Returns array of files in the given path, or in current directory if no path provided.
function _ls(options, paths) {
  options = common.parseOptions(options, {
    'R': 'recursive',
    'A': 'all',
    'a': 'all_deprecated'
  });

  if (options.all_deprecated) {
    // We won't support the -a option as it's hard to image why it's useful
    // (it includes '.' and '..' in addition to '.*' files)
    // For backwards compatibility we'll dump a deprecated message and proceed as before
    common.log('ls: Option -a is deprecated. Use -A instead');
    options.all = true;
  }

  if (!paths)
    paths = ['.'];
  else if (typeof paths === 'object')
    paths = paths; // assume array
  else if (typeof paths === 'string')
    paths = [].slice.call(arguments, 1);

  var list = [];

  // Conditionally pushes file to list - returns true if pushed, false otherwise
  // (e.g. prevents hidden files to be included unless explicitly told so)
  function pushFile(file, query) {
    // hidden file?
    if (path.basename(file)[0] === '.') {
      // not explicitly asking for hidden files?
      if (!options.all && !(path.basename(query)[0] === '.' && path.basename(query).length > 1))
        return false;
    }

    if (common.platform === 'win')
      file = file.replace(/\\/g, '/');

    list.push(file);
    return true;
  }

  paths.forEach(function(p) {
    if (fs.existsSync(p)) {
      var stats = fs.statSync(p);
      // Simple file?
      if (stats.isFile()) {
        pushFile(p, p);
        return; // continue
      }

      // Simple dir?
      if (stats.isDirectory()) {
        // Iterate over p contents
        fs.readdirSync(p).forEach(function(file) {
          if (!pushFile(file, p))
            return;

          // Recursive?
          if (options.recursive) {
            var oldDir = _pwd();
            _cd('', p);
            if (fs.statSync(file).isDirectory())
              list = list.concat(_ls('-R'+(options.all?'A':''), file+'/*'));
            _cd('', oldDir);
          }
        });
        return; // continue
      }
    }

    // p does not exist - possible wildcard present

    var basename = path.basename(p);
    var dirname = path.dirname(p);
    // Wildcard present on an existing dir? (e.g. '/tmp/*.js')
    if (basename.search(/\*/) > -1 && fs.existsSync(dirname) && fs.statSync(dirname).isDirectory) {
      // Escape special regular expression chars
      var regexp = basename.replace(/(\^|\$|\(|\)|<|>|\[|\]|\{|\}|\.|\+|\?)/g, '\\$1');
      // Translates wildcard into regex
      regexp = '^' + regexp.replace(/\*/g, '.*') + '$';
      // Iterate over directory contents
      fs.readdirSync(dirname).forEach(function(file) {
        if (file.match(new RegExp(regexp))) {
          if (!pushFile(path.normalize(dirname+'/'+file), basename))
            return;

          // Recursive?
          if (options.recursive) {
            var pp = dirname + '/' + file;
            if (fs.lstatSync(pp).isDirectory())
              list = list.concat(_ls('-R'+(options.all?'A':''), pp+'/*'));
          } // recursive
        } // if file matches
      }); // forEach
      return;
    }

    common.error('no such file or directory: ' + p, true);
  });

  return list;
}
module.exports = _ls;
var common = require('./common');
var fs = require('fs');
var path = require('path');

// Recursively creates 'dir'
function mkdirSyncRecursive(dir) {
  var baseDir = path.dirname(dir);

  // Base dir exists, no recursion necessary
  if (fs.existsSync(baseDir)) {
    fs.mkdirSync(dir, parseInt('0777', 8));
    return;
  }

  // Base dir does not exist, go recursive
  mkdirSyncRecursive(baseDir);

  // Base dir created, can create dir
  fs.mkdirSync(dir, parseInt('0777', 8));
}

//@
//@ ### mkdir([options ,] dir [, dir ...])
//@ ### mkdir([options ,] dir_array)
//@ Available options:
//@
//@ + `p`: full path (will create intermediate dirs if necessary)
//@
//@ Examples:
//@
//@ ```javascript
//@ mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g');
//@ mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above
//@ ```
//@
//@ Creates directories.
function _mkdir(options, dirs) {
  options = common.parseOptions(options, {
    'p': 'fullpath'
  });
  if (!dirs)
    common.error('no paths given');

  if (typeof dirs === 'string')
    dirs = [].slice.call(arguments, 1);
  // if it's array leave it as it is

  dirs.forEach(function(dir) {
    if (fs.existsSync(dir)) {
      if (!options.fullpath)
          common.error('path already exists: ' + dir, true);
      return; // skip dir
    }

    // Base dir does not exist, and no -p option given
    var baseDir = path.dirname(dir);
    if (!fs.existsSync(baseDir) && !options.fullpath) {
      common.error('no such file or directory: ' + baseDir, true);
      return; // skip dir
    }

    if (options.fullpath)
      mkdirSyncRecursive(dir);
    else
      fs.mkdirSync(dir, parseInt('0777', 8));
  });
} // mkdir
module.exports = _mkdir;
var fs = require('fs');
var path = require('path');
var common = require('./common');

//@
//@ ### mv(source [, source ...], dest')
//@ ### mv(source_array, dest')
//@ Available options:
//@
//@ + `f`: force
//@
//@ Examples:
//@
//@ ```javascript
//@ mv('-f', 'file', 'dir/');
//@ mv('file1', 'file2', 'dir/');
//@ mv(['file1', 'file2'], 'dir/'); // same as above
//@ ```
//@
//@ Moves files. The wildcard `*` is accepted.
function _mv(options, sources, dest) {
  options = common.parseOptions(options, {
    'f': 'force'
  });

  // Get sources, dest
  if (arguments.length < 3) {
    common.error('missing <source> and/or <dest>');
  } else if (arguments.length > 3) {
    sources = [].slice.call(arguments, 1, arguments.length - 1);
    dest = arguments[arguments.length - 1];
  } else if (typeof sources === 'string') {
    sources = [sources];
  } else if ('length' in sources) {
    sources = sources; // no-op for array
  } else {
    common.error('invalid arguments');
  }

  sources = common.expand(sources);

  var exists = fs.existsSync(dest),
      stats = exists && fs.statSync(dest);

  // Dest is not existing dir, but multiple sources given
  if ((!exists || !stats.isDirectory()) && sources.length > 1)
    common.error('dest is not a directory (too many sources)');

  // Dest is an existing file, but no -f given
  if (exists && stats.isFile() && !options.force)
    common.error('dest file already exists: ' + dest);

  sources.forEach(function(src) {
    if (!fs.existsSync(src)) {
      common.error('no such file or directory: '+src, true);
      return; // skip file
    }

    // If here, src exists

    // When copying to '/path/dir':
    //    thisDest = '/path/dir/file1'
    var thisDest = dest;
    if (fs.existsSync(dest) && fs.statSync(dest).isDirectory())
      thisDest = path.normalize(dest + '/' + path.basename(src));

    if (fs.existsSync(thisDest) && !options.force) {
      common.error('dest file already exists: ' + thisDest, true);
      return; // skip file
    }

    if (path.resolve(src) === path.dirname(path.resolve(thisDest))) {
      common.error('cannot move to self: '+src, true);
      return; // skip file
    }

    fs.renameSync(src, thisDest);
  }); // forEach(src)
} // mv
module.exports = _mv;
// see dirs.js// see dirs.jsvar path = require('path');
var common = require('./common');

//@
//@ ### pwd()
//@ Returns the current directory.
function _pwd(options) {
  var pwd = path.resolve(process.cwd());
  return common.ShellString(pwd);
}
module.exports = _pwd;
var common = require('./common');
var fs = require('fs');

// Recursively removes 'dir'
// Adapted from https://github.com/ryanmcgrath/wrench-js
//
// Copyright (c) 2010 Ryan McGrath
// Copyright (c) 2012 Artur Adib
//
// Licensed under the MIT License
// http://www.opensource.org/licenses/mit-license.php
function rmdirSyncRecursive(dir, force) {
  var files;

  files = fs.readdirSync(dir);

  // Loop through and delete everything in the sub-tree after checking it
  for(var i = 0; i < files.length; i++) {
    var file = dir + "/" + files[i],
        currFile = fs.lstatSync(file);

    if(currFile.isDirectory()) { // Recursive function back to the beginning
      rmdirSyncRecursive(file, force);
    }

    else if(currFile.isSymbolicLink()) { // Unlink symlinks
      if (force || isWriteable(file)) {
        try {
          common.unlinkSync(file);
        } catch (e) {
          common.error('could not remove file (code '+e.code+'): ' + file, true);
        }
      }
    }

    else // Assume it's a file - perhaps a try/catch belongs here?
      if (force || isWriteable(file)) {
        try {
          common.unlinkSync(file);
        } catch (e) {
          common.error('could not remove file (code '+e.code+'): ' + file, true);
        }
      }
  }

  // Now that we know everything in the sub-tree has been deleted, we can delete the main directory.
  // Huzzah for the shopkeep.

  var result;
  try {
    // Retry on windows, sometimes it takes a little time before all the files in the directory are gone
    var start = Date.now();
    while (true) {
      try {
        result = fs.rmdirSync(dir);
        if (fs.existsSync(dir)) throw { code: "EAGAIN" }
        break;
      } catch(er) {
        // In addition to error codes, also check if the directory still exists and loop again if true
        if (process.platform === "win32" && (er.code === "ENOTEMPTY" || er.code === "EBUSY" || er.code === "EPERM" || er.code === "EAGAIN")) {
          if (Date.now() - start > 1000) throw er;
        } else if (er.code === "ENOENT") {
          // Directory did not exist, deletion was successful
          break;
        } else {
          throw er;
        }
      }
    }
  } catch(e) {
    common.error('could not remove directory (code '+e.code+'): ' + dir, true);
  }

  return result;
} // rmdirSyncRecursive

// Hack to determine if file has write permissions for current user
// Avoids having to check user, group, etc, but it's probably slow
function isWriteable(file) {
  var writePermission = true;
  try {
    var __fd = fs.openSync(file, 'a');
    fs.closeSync(__fd);
  } catch(e) {
    writePermission = false;
  }

  return writePermission;
}

//@
//@ ### rm([options ,] file [, file ...])
//@ ### rm([options ,] file_array)
//@ Available options:
//@
//@ + `-f`: force
//@ + `-r, -R`: recursive
//@
//@ Examples:
//@
//@ ```javascript
//@ rm('-rf', '/tmp/*');
//@ rm('some_file.txt', 'another_file.txt');
//@ rm(['some_file.txt', 'another_file.txt']); // same as above
//@ ```
//@
//@ Removes files. The wildcard `*` is accepted.
function _rm(options, files) {
  options = common.parseOptions(options, {
    'f': 'force',
    'r': 'recursive',
    'R': 'recursive'
  });
  if (!files)
    common.error('no paths given');

  if (typeof files === 'string')
    files = [].slice.call(arguments, 1);
  // if it's array leave it as it is

  files = common.expand(files);

  files.forEach(function(file) {
    if (!fs.existsSync(file)) {
      // Path does not exist, no force flag given
      if (!options.force)
        common.error('no such file or directory: '+file, true);

      return; // skip file
    }

    // If here, path exists

    var stats = fs.lstatSync(file);
    if (stats.isFile() || stats.isSymbolicLink()) {

      // Do not check for file writing permissions
      if (options.force) {
        common.unlinkSync(file);
        return;
      }

      if (isWriteable(file))
        common.unlinkSync(file);
      else
        common.error('permission denied: '+file, true);

      return;
    } // simple file

    // Path is an existing directory, but no -r flag given
    if (stats.isDirectory() && !options.recursive) {
      common.error('path is a directory', true);
      return; // skip path
    }

    // Recursively remove existing directory
    if (stats.isDirectory() && options.recursive) {
      rmdirSyncRecursive(file, options.force);
    }
  }); // forEach(file)
} // rm
module.exports = _rm;
var common = require('./common');
var fs = require('fs');

//@
//@ ### sed([options ,] search_regex, replacement, file)
//@ Available options:
//@
//@ + `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_
//@
//@ Examples:
//@
//@ ```javascript
//@ sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js');
//@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js');
//@ ```
//@
//@ Reads an input string from `file` and performs a JavaScript `replace()` on the input
//@ using the given search regex and replacement string or function. Returns the new string after replacement.
function _sed(options, regex, replacement, file) {
  options = common.parseOptions(options, {
    'i': 'inplace'
  });

  if (typeof replacement === 'string' || typeof replacement === 'function')
    replacement = replacement; // no-op
  else if (typeof replacement === 'number')
    replacement = replacement.toString(); // fallback
  else
    common.error('invalid replacement string');

  if (!file)
    common.error('no file given');

  if (!fs.existsSync(file))
    common.error('no such file or directory: ' + file);

  var result = fs.readFileSync(file, 'utf8').replace(regex, replacement);
  if (options.inplace)
    fs.writeFileSync(file, result, 'utf8');

  return common.ShellString(result);
}
module.exports = _sed;
var common = require('./common');
var os = require('os');
var fs = require('fs');

// Returns false if 'dir' is not a writeable directory, 'dir' otherwise
function writeableDir(dir) {
  if (!dir || !fs.existsSync(dir))
    return false;

  if (!fs.statSync(dir).isDirectory())
    return false;

  var testFile = dir+'/'+common.randomFileName();
  try {
    fs.writeFileSync(testFile, ' ');
    common.unlinkSync(testFile);
    return dir;
  } catch (e) {
    return false;
  }
}


//@
//@ ### tempdir()
//@
//@ Examples:
//@
//@ ```javascript
//@ var tmp = tempdir(); // "/tmp" for most *nix platforms
//@ ```
//@
//@ Searches and returns string containing a writeable, platform-dependent temporary directory.
//@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir).
function _tempDir() {
  var state = common.state;
  if (state.tempDir)
    return state.tempDir; // from cache

  state.tempDir = writeableDir(os.tempDir && os.tempDir()) || // node 0.8+
                  writeableDir(process.env['TMPDIR']) ||
                  writeableDir(process.env['TEMP']) ||
                  writeableDir(process.env['TMP']) ||
                  writeableDir(process.env['Wimp$ScrapDir']) || // RiscOS
                  writeableDir('C:\\TEMP') || // Windows
                  writeableDir('C:\\TMP') || // Windows
                  writeableDir('\\TEMP') || // Windows
                  writeableDir('\\TMP') || // Windows
                  writeableDir('/tmp') ||
                  writeableDir('/var/tmp') ||
                  writeableDir('/usr/tmp') ||
                  writeableDir('.'); // last resort

  return state.tempDir;
}
module.exports = _tempDir;
var common = require('./common');
var fs = require('fs');

//@
//@ ### test(expression)
//@ Available expression primaries:
//@
//@ + `'-b', 'path'`: true if path is a block device
//@ + `'-c', 'path'`: true if path is a character device
//@ + `'-d', 'path'`: true if path is a directory
//@ + `'-e', 'path'`: true if path exists
//@ + `'-f', 'path'`: true if path is a regular file
//@ + `'-L', 'path'`: true if path is a symboilc link
//@ + `'-p', 'path'`: true if path is a pipe (FIFO)
//@ + `'-S', 'path'`: true if path is a socket
//@
//@ Examples:
//@
//@ ```javascript
//@ if (test('-d', path)) { /* do something with dir */ };
//@ if (!test('-f', path)) continue; // skip if it's a regular file
//@ ```
//@
//@ Evaluates expression using the available primaries and returns corresponding value.
function _test(options, path) {
  if (!path)
    common.error('no path given');

  // hack - only works with unary primaries
  options = common.parseOptions(options, {
    'b': 'block',
    'c': 'character',
    'd': 'directory',
    'e': 'exists',
    'f': 'file',
    'L': 'link',
    'p': 'pipe',
    'S': 'socket'
  });

  var canInterpret = false;
  for (var key in options)
    if (options[key] === true) {
      canInterpret = true;
      break;
    }

  if (!canInterpret)
    common.error('could not interpret expression');

  if (options.link) {
    try {
      return fs.lstatSync(path).isSymbolicLink();
    } catch(e) {
      return false;
    }
  }

  if (!fs.existsSync(path))
    return false;

  if (options.exists)
    return true;

  var stats = fs.statSync(path);

  if (options.block)
    return stats.isBlockDevice();

  if (options.character)
    return stats.isCharacterDevice();

  if (options.directory)
    return stats.isDirectory();

  if (options.file)
    return stats.isFile();

  if (options.pipe)
    return stats.isFIFO();

  if (options.socket)
    return stats.isSocket();
} // test
module.exports = _test;
var common = require('./common');
var fs = require('fs');
var path = require('path');

//@
//@ ### 'string'.to(file)
//@
//@ Examples:
//@
//@ ```javascript
//@ cat('input.txt').to('output.txt');
//@ ```
//@
//@ Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as
//@ those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_
function _to(options, file) {
  if (!file)
    common.error('wrong arguments');

  if (!fs.existsSync( path.dirname(file) ))
      common.error('no such file or directory: ' + path.dirname(file));

  try {
    fs.writeFileSync(file, this.toString(), 'utf8');
  } catch(e) {
    common.error('could not write to file (code '+e.code+'): '+file, true);
  }
}
module.exports = _to;
var common = require('./common');
var fs = require('fs');
var path = require('path');

//@
//@ ### 'string'.toEnd(file)
//@
//@ Examples:
//@
//@ ```javascript
//@ cat('input.txt').toEnd('output.txt');
//@ ```
//@
//@ Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as
//@ those returned by `cat`, `grep`, etc).
function _toEnd(options, file) {
  if (!file)
    common.error('wrong arguments');

  if (!fs.existsSync( path.dirname(file) ))
      common.error('no such file or directory: ' + path.dirname(file));

  try {
    fs.appendFileSync(file, this.toString(), 'utf8');
  } catch(e) {
    common.error('could not append to file (code '+e.code+'): '+file, true);
  }
}
module.exports = _toEnd;
var common = require('./common');
var fs = require('fs');
var path = require('path');

// Cross-platform method for splitting environment PATH variables
function splitPath(p) {
  for (i=1;i<2;i++) {}

  if (!p)
    return [];

  if (common.platform === 'win')
    return p.split(';');
  else
    return p.split(':');
}

function checkPath(path) {
  return fs.existsSync(path) && fs.statSync(path).isDirectory() == false;
}

//@
//@ ### which(command)
//@
//@ Examples:
//@
//@ ```javascript
//@ var nodeExec = which('node');
//@ ```
//@
//@ Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions.
//@ Returns string containing the absolute path to the command.
function _which(options, cmd) {
  if (!cmd)
    common.error('must specify command');

  var pathEnv = process.env.path || process.env.Path || process.env.PATH,
      pathArray = splitPath(pathEnv),
      where = null;

  // No relative/absolute paths provided?
  if (cmd.search(/\//) === -1) {
    // Search for command in PATH
    pathArray.forEach(function(dir) {
      if (where)
        return; // already found it

      var attempt = path.resolve(dir + '/' + cmd);
      if (checkPath(attempt)) {
        where = attempt;
        return;
      }

      if (common.platform === 'win') {
        var baseAttempt = attempt;
        attempt = baseAttempt + '.exe';
        if (checkPath(attempt)) {
          where = attempt;
          return;
        }
        attempt = baseAttempt + '.cmd';
        if (checkPath(attempt)) {
          where = attempt;
          return;
        }
        attempt = baseAttempt + '.bat';
        if (checkPath(attempt)) {
          where = attempt;
          return;
        }
      } // if 'win'
    });
  }

  // Command not found anywhere?
  if (!checkPath(cmd) && !where)
    return null;

  where = where || path.resolve(cmd);

  return common.ShellString(where);
}
module.exports = _which;
#!/usr/bin/env node
require('../global');

echo('Appending docs to README.md');

cd(__dirname + '/..');

// Extract docs from shell.js
var docs = grep('//@', 'shell.js');

docs = docs.replace(/\/\/\@include (.+)/g, function(match, path) {
  var file = path.match('.js$') ? path : path+'.js';
  return grep('//@', file);
});

// Remove '//@'
docs = docs.replace(/\/\/\@ ?/g, '');
// Append docs to README
sed('-i', /## Command reference(.|\n)*/, '## Command reference\n\n' + docs, 'README.md');

echo('All done.');
#!/usr/bin/env node
require('../global');

var path = require('path');

var failed = false;

//
// Lint
//
JSHINT_BIN = './node_modules/jshint/bin/jshint';
cd(__dirname + '/..');

if (!test('-f', JSHINT_BIN)) {
  echo('JSHint not found. Run `npm install` in the root dir first.');
  exit(1);
}

if (exec(JSHINT_BIN + ' *.js test/*.js').code !== 0) {
  failed = true;
  echo('*** JSHINT FAILED! (return code != 0)');
  echo();
} else {
  echo('All JSHint tests passed');
  echo();
}

//
// Unit tests
//
cd(__dirname + '/../test');
ls('*.js').forEach(function(file) {
  echo('Running test:', file);
  if (exec('node ' + file).code !== 123) { // 123 avoids false positives (e.g. premature exit)
    failed = true;
    echo('*** TEST FAILED! (missing exit code "123")');
    echo();
  }
});

if (failed) {
  echo();
  echo('*******************************************************');
  echo('WARNING: Some tests did not pass!');
  echo('*******************************************************');
  exit(1);
} else {
  echo();
  echo('All tests passed.');
}
#!/usr/bin/env node
require('../global');

if (process.argv.length < 3) {
  console.log('ShellJS: missing argument (script name)');
  console.log();
  process.exit(1);
}

var args,
  scriptName = process.argv[2];
env['NODE_PATH'] = __dirname + '/../..';

if (!scriptName.match(/\.js/) && !scriptName.match(/\.coffee/)) {
  if (test('-f', scriptName + '.js'))
    scriptName += '.js';
  if (test('-f', scriptName + '.coffee'))
    scriptName += '.coffee';
}

if (!test('-f', scriptName)) {
  console.log('ShellJS: script not found ('+scriptName+')');
  console.log();
  process.exit(1);
}

args = process.argv.slice(3);

for (var i = 0, l = args.length; i < l; i++) {
  if (args[i][0] !== "-"){
    args[i] = '"' + args[i] + '"'; // fixes arguments with multiple words
  }
}

if (scriptName.match(/\.coffee$/)) {
  //
  // CoffeeScript
  //
  if (which('coffee')) {
    exec('coffee ' + scriptName + ' ' + args.join(' '), { async: true });
  } else {
    console.log('ShellJS: CoffeeScript interpreter not found');
    console.log();
    process.exit(1);
  }
} else {
  //
  // JavaScript
  //
  exec('node ' + scriptName + ' ' + args.join(' '), { async: true });
}
The ISC License

Copyright (c) 2015, Contributors

Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice
appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
// Note: since nyc uses this module to output coverage, any lines
// that are in the direct sync flow of nyc's outputCoverage are
// ignored, since we can never get coverage for them.
var assert = require('assert')
var signals = require('./signals.js')
var isWin = /^win/i.test(process.platform)

var EE = require('events')
/* istanbul ignore if */
if (typeof EE !== 'function') {
  EE = EE.EventEmitter
}

var emitter
if (process.__signal_exit_emitter__) {
  emitter = process.__signal_exit_emitter__
} else {
  emitter = process.__signal_exit_emitter__ = new EE()
  emitter.count = 0
  emitter.emitted = {}
}

// Because this emitter is a global, we have to check to see if a
// previous version of this library failed to enable infinite listeners.
// I know what you're about to say.  But literally everything about
// signal-exit is a compromise with evil.  Get used to it.
if (!emitter.infinite) {
  emitter.setMaxListeners(Infinity)
  emitter.infinite = true
}

module.exports = function (cb, opts) {
  assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler')

  if (loaded === false) {
    load()
  }

  var ev = 'exit'
  if (opts && opts.alwaysLast) {
    ev = 'afterexit'
  }

  var remove = function () {
    emitter.removeListener(ev, cb)
    if (emitter.listeners('exit').length === 0 &&
        emitter.listeners('afterexit').length === 0) {
      unload()
    }
  }
  emitter.on(ev, cb)

  return remove
}

module.exports.unload = unload
function unload () {
  if (!loaded) {
    return
  }
  loaded = false

  signals.forEach(function (sig) {
    try {
      process.removeListener(sig, sigListeners[sig])
    } catch (er) {}
  })
  process.emit = originalProcessEmit
  process.reallyExit = originalProcessReallyExit
  emitter.count -= 1
}

function emit (event, code, signal) {
  if (emitter.emitted[event]) {
    return
  }
  emitter.emitted[event] = true
  emitter.emit(event, code, signal)
}

// { <signal>: <listener fn>, ... }
var sigListeners = {}
signals.forEach(function (sig) {
  sigListeners[sig] = function listener () {
    // If there are no other listeners, an exit is coming!
    // Simplest way: remove us and then re-send the signal.
    // We know that this will kill the process, so we can
    // safely emit now.
    var listeners = process.listeners(sig)
    if (listeners.length === emitter.count) {
      unload()
      emit('exit', null, sig)
      /* istanbul ignore next */
      emit('afterexit', null, sig)
      /* istanbul ignore next */
      if (isWin && sig === 'SIGHUP') {
        // "SIGHUP" throws an `ENOSYS` error on Windows,
        // so use a supported signal instead
        sig = 'SIGINT'
      }
      process.kill(process.pid, sig)
    }
  }
})

module.exports.signals = function () {
  return signals
}

module.exports.load = load

var loaded = false

function load () {
  if (loaded) {
    return
  }
  loaded = true

  // This is the number of onSignalExit's that are in play.
  // It's important so that we can count the correct number of
  // listeners on signals, and don't wait for the other one to
  // handle it instead of us.
  emitter.count += 1

  signals = signals.filter(function (sig) {
    try {
      process.on(sig, sigListeners[sig])
      return true
    } catch (er) {
      return false
    }
  })

  process.emit = processEmit
  process.reallyExit = processReallyExit
}

var originalProcessReallyExit = process.reallyExit
function processReallyExit (code) {
  process.exitCode = code || 0
  emit('exit', process.exitCode, null)
  /* istanbul ignore next */
  emit('afterexit', process.exitCode, null)
  /* istanbul ignore next */
  originalProcessReallyExit.call(process, process.exitCode)
}

var originalProcessEmit = process.emit
function processEmit (ev, arg) {
  if (ev === 'exit') {
    if (arg !== undefined) {
      process.exitCode = arg
    }
    var ret = originalProcessEmit.apply(this, arguments)
    emit('exit', process.exitCode, null)
    /* istanbul ignore next */
    emit('afterexit', process.exitCode, null)
    return ret
  } else {
    return originalProcessEmit.apply(this, arguments)
  }
}
{
  "author": {
    "name": "Ben Coe",
    "email": "ben@npmjs.com"
  },
  "deprecated": false,
  "description": "when you want to fire an event no matter how a process exits.",
  "devDependencies": {
    "chai": "^3.5.0",
    "coveralls": "^2.11.10",
    "nyc": "^8.1.0",
    "standard": "^8.1.0",
    "standard-version": "^2.3.0",
    "tap": "^8.0.1"
  },
  "files": [
    "index.js",
    "signals.js"
  ],
  "homepage": "https://github.com/tapjs/signal-exit",
  "license": "ISC",
  "main": "index.js",
  "name": "signal-exit",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/tapjs/signal-exit.git"
  },
  "version": "3.0.3"
}// This is not the set of all possible signals.
//
// It IS, however, the set of all signals that trigger
// an exit on either Linux or BSD systems.  Linux is a
// superset of the signal names supported on BSD, and
// the unknown signals just fail to register, so we can
// catch that easily enough.
//
// Don't bother with SIGKILL.  It's uncatchable, which
// means that we can't fire any callbacks anyway.
//
// If a user does happen to register a handler on a non-
// fatal signal like SIGWINCH or something, and then
// exit, it'll end up firing `process.emit('exit')`, so
// the handler will be fired anyway.
//
// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised
// artificially, inherently leave the process in a
// state from which it is not safe to try and enter JS
// listeners.
module.exports = [
  'SIGABRT',
  'SIGALRM',
  'SIGHUP',
  'SIGINT',
  'SIGTERM'
]

if (process.platform !== 'win32') {
  module.exports.push(
    'SIGVTALRM',
    'SIGXCPU',
    'SIGXFSZ',
    'SIGUSR2',
    'SIGTRAP',
    'SIGSYS',
    'SIGQUIT',
    'SIGIOT'
    // should detect profiler and enable/disable accordingly.
    // see #21
    // 'SIGPROF'
  )
}

if (process.platform === 'linux') {
  module.exports.push(
    'SIGIO',
    'SIGPOLL',
    'SIGPWR',
    'SIGSTKFLT',
    'SIGUNUSED'
  )
}
The MIT License (MIT)

Copyright (c) Tobias BaunbÃ¦k <freeall@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
var MOVE_LEFT = new Buffer('1b5b3130303044', 'hex').toString();
var MOVE_UP = new Buffer('1b5b3141', 'hex').toString();
var CLEAR_LINE = new Buffer('1b5b304b', 'hex').toString();
var stringWidth = require('string-width');

module.exports = function(stream) {
	var write = stream.write;
	var str;

	stream.write = function(data) {
		if (str && data !== str) str = null;
		return write.apply(this, arguments);
	};

	if (stream === process.stderr || stream === process.stdout) {
		process.on('exit', function() {
			if (str !== null) stream.write('');
		});
	}

	var prevLineCount = 0;
	var log = function() {
		str = '';
		var nextStr = Array.prototype.join.call(arguments, ' ');

		// Clear screen
		for (var i=0; i<prevLineCount; i++) {
			str += MOVE_LEFT + CLEAR_LINE + (i < prevLineCount-1 ? MOVE_UP : '');
		}

		// Actual log output
		str += nextStr;
		stream.write(str);

		// How many lines to remove on next clear screen
		var prevLines = nextStr.split('\n');
		prevLineCount = 0;
		for (var i=0; i < prevLines.length; i++) {
			prevLineCount += Math.ceil(stringWidth(prevLines[i]) / stream.columns) || 1;
		}
	};

	log.clear = function() {
		stream.write('');
	};

	return log;
};

module.exports.stdout = module.exports(process.stdout);
module.exports.stderr = module.exports(process.stderr);
{
  "author": {
    "name": "Tobias BaunbÃ¦k",
    "email": "freeall@gmail.com"
  },
  "dependencies": {
    "string-width": "^1.0.1"
  },
  "deprecated": false,
  "description": "Keep writing to the same line in the terminal. Very useful when you write progress bars, or a status message during longer operations",
  "homepage": "https://github.com/freeall/single-line-log#readme",
  "license": "MIT",
  "name": "single-line-log",
  "repository": {
    "type": "git",
    "url": "git://github.com/freeall/single-line-log.git"
  },
  "version": "1.1.2"
}
Copyright (c) 2009-2011, Mozilla Foundation and contributors
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the names of the Mozilla Foundation nor the names of project
  contributors may be used to endorse or promote products derived from this
  software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
  "author": {
    "name": "Nick Fitzgerald",
    "email": "nfitzgerald@mozilla.com"
  },
  "deprecated": false,
  "description": "Generates and consumes source maps",
  "devDependencies": {
    "doctoc": "^0.15.0",
    "webpack": "^1.12.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "source-map.js",
    "source-map.d.ts",
    "lib/",
    "dist/source-map.debug.js",
    "dist/source-map.js",
    "dist/source-map.min.js",
    "dist/source-map.min.js.map"
  ],
  "homepage": "https://github.com/mozilla/source-map",
  "license": "BSD-3-Clause",
  "main": "./source-map.js",
  "name": "source-map",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/mozilla/source-map.git"
  },
  "typings": "source-map",
  "version": "0.6.1"
}/*
 * Copyright 2009-2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE.txt or:
 * http://opensource.org/licenses/BSD-3-Clause
 */
exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;
exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;
exports.SourceNode = require('./lib/source-node').SourceNode;
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var util = require('./util');
var has = Object.prototype.hasOwnProperty;
var hasNativeMap = typeof Map !== "undefined";

/**
 * A data structure which is a combination of an array and a set. Adding a new
 * member is O(1), testing for membership is O(1), and finding the index of an
 * element is O(1). Removing elements from the set is not supported. Only
 * strings are supported for membership.
 */
function ArraySet() {
  this._array = [];
  this._set = hasNativeMap ? new Map() : Object.create(null);
}

/**
 * Static method for creating ArraySet instances from an existing array.
 */
ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
  var set = new ArraySet();
  for (var i = 0, len = aArray.length; i < len; i++) {
    set.add(aArray[i], aAllowDuplicates);
  }
  return set;
};

/**
 * Return how many unique items are in this ArraySet. If duplicates have been
 * added, than those do not count towards the size.
 *
 * @returns Number
 */
ArraySet.prototype.size = function ArraySet_size() {
  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
};

/**
 * Add the given string to this set.
 *
 * @param String aStr
 */
ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
  var idx = this._array.length;
  if (!isDuplicate || aAllowDuplicates) {
    this._array.push(aStr);
  }
  if (!isDuplicate) {
    if (hasNativeMap) {
      this._set.set(aStr, idx);
    } else {
      this._set[sStr] = idx;
    }
  }
};

/**
 * Is the given string a member of this set?
 *
 * @param String aStr
 */
ArraySet.prototype.has = function ArraySet_has(aStr) {
  if (hasNativeMap) {
    return this._set.has(aStr);
  } else {
    var sStr = util.toSetString(aStr);
    return has.call(this._set, sStr);
  }
};

/**
 * What is the index of the given string in the array?
 *
 * @param String aStr
 */
ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
  if (hasNativeMap) {
    var idx = this._set.get(aStr);
    if (idx >= 0) {
        return idx;
    }
  } else {
    var sStr = util.toSetString(aStr);
    if (has.call(this._set, sStr)) {
      return this._set[sStr];
    }
  }

  throw new Error('"' + aStr + '" is not in the set.');
};

/**
 * What is the element at the given index?
 *
 * @param Number aIdx
 */
ArraySet.prototype.at = function ArraySet_at(aIdx) {
  if (aIdx >= 0 && aIdx < this._array.length) {
    return this._array[aIdx];
  }
  throw new Error('No element indexed by ' + aIdx);
};

/**
 * Returns the array representation of this set (which has the proper indices
 * indicated by indexOf). Note that this is a copy of the internal array used
 * for storing the members so that no one can mess with internal state.
 */
ArraySet.prototype.toArray = function ArraySet_toArray() {
  return this._array.slice();
};

exports.ArraySet = ArraySet;
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 *
 * Based on the Base 64 VLQ implementation in Closure Compiler:
 * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
 *
 * Copyright 2011 The Closure Compiler Authors. All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following
 *    disclaimer in the documentation and/or other materials provided
 *    with the distribution.
 *  * Neither the name of Google Inc. nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

var base64 = require('./base64');

// A single base 64 digit can contain 6 bits of data. For the base 64 variable
// length quantities we use in the source map spec, the first bit is the sign,
// the next four bits are the actual value, and the 6th bit is the
// continuation bit. The continuation bit tells us whether there are more
// digits in this value following this digit.
//
//   Continuation
//   |    Sign
//   |    |
//   V    V
//   101011

var VLQ_BASE_SHIFT = 5;

// binary: 100000
var VLQ_BASE = 1 << VLQ_BASE_SHIFT;

// binary: 011111
var VLQ_BASE_MASK = VLQ_BASE - 1;

// binary: 100000
var VLQ_CONTINUATION_BIT = VLQ_BASE;

/**
 * Converts from a two-complement value to a value where the sign bit is
 * placed in the least significant bit.  For example, as decimals:
 *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
 *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
 */
function toVLQSigned(aValue) {
  return aValue < 0
    ? ((-aValue) << 1) + 1
    : (aValue << 1) + 0;
}

/**
 * Converts to a two-complement value from a value where the sign bit is
 * placed in the least significant bit.  For example, as decimals:
 *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1
 *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2
 */
function fromVLQSigned(aValue) {
  var isNegative = (aValue & 1) === 1;
  var shifted = aValue >> 1;
  return isNegative
    ? -shifted
    : shifted;
}

/**
 * Returns the base 64 VLQ encoded value.
 */
exports.encode = function base64VLQ_encode(aValue) {
  var encoded = "";
  var digit;

  var vlq = toVLQSigned(aValue);

  do {
    digit = vlq & VLQ_BASE_MASK;
    vlq >>>= VLQ_BASE_SHIFT;
    if (vlq > 0) {
      // There are still more digits in this value, so we must make sure the
      // continuation bit is marked.
      digit |= VLQ_CONTINUATION_BIT;
    }
    encoded += base64.encode(digit);
  } while (vlq > 0);

  return encoded;
};

/**
 * Decodes the next base 64 VLQ value from the given string and returns the
 * value and the rest of the string via the out parameter.
 */
exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
  var strLen = aStr.length;
  var result = 0;
  var shift = 0;
  var continuation, digit;

  do {
    if (aIndex >= strLen) {
      throw new Error("Expected more digits in base 64 VLQ value.");
    }

    digit = base64.decode(aStr.charCodeAt(aIndex++));
    if (digit === -1) {
      throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
    }

    continuation = !!(digit & VLQ_CONTINUATION_BIT);
    digit &= VLQ_BASE_MASK;
    result = result + (digit << shift);
    shift += VLQ_BASE_SHIFT;
  } while (continuation);

  aOutParam.value = fromVLQSigned(result);
  aOutParam.rest = aIndex;
};
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');

/**
 * Encode an integer in the range of 0 to 63 to a single base 64 digit.
 */
exports.encode = function (number) {
  if (0 <= number && number < intToCharMap.length) {
    return intToCharMap[number];
  }
  throw new TypeError("Must be between 0 and 63: " + number);
};

/**
 * Decode a single base 64 character code digit to an integer. Returns -1 on
 * failure.
 */
exports.decode = function (charCode) {
  var bigA = 65;     // 'A'
  var bigZ = 90;     // 'Z'

  var littleA = 97;  // 'a'
  var littleZ = 122; // 'z'

  var zero = 48;     // '0'
  var nine = 57;     // '9'

  var plus = 43;     // '+'
  var slash = 47;    // '/'

  var littleOffset = 26;
  var numberOffset = 52;

  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
  if (bigA <= charCode && charCode <= bigZ) {
    return (charCode - bigA);
  }

  // 26 - 51: abcdefghijklmnopqrstuvwxyz
  if (littleA <= charCode && charCode <= littleZ) {
    return (charCode - littleA + littleOffset);
  }

  // 52 - 61: 0123456789
  if (zero <= charCode && charCode <= nine) {
    return (charCode - zero + numberOffset);
  }

  // 62: +
  if (charCode == plus) {
    return 62;
  }

  // 63: /
  if (charCode == slash) {
    return 63;
  }

  // Invalid base64 digit.
  return -1;
};
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

exports.GREATEST_LOWER_BOUND = 1;
exports.LEAST_UPPER_BOUND = 2;

/**
 * Recursive implementation of binary search.
 *
 * @param aLow Indices here and lower do not contain the needle.
 * @param aHigh Indices here and higher do not contain the needle.
 * @param aNeedle The element being searched for.
 * @param aHaystack The non-empty array being searched.
 * @param aCompare Function which takes two elements and returns -1, 0, or 1.
 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
 *     closest element that is smaller than or greater than the one we are
 *     searching for, respectively, if the exact element cannot be found.
 */
function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
  // This function terminates when one of the following is true:
  //
  //   1. We find the exact element we are looking for.
  //
  //   2. We did not find the exact element, but we can return the index of
  //      the next-closest element.
  //
  //   3. We did not find the exact element, and there is no next-closest
  //      element than the one we are searching for, so we return -1.
  var mid = Math.floor((aHigh - aLow) / 2) + aLow;
  var cmp = aCompare(aNeedle, aHaystack[mid], true);
  if (cmp === 0) {
    // Found the element we are looking for.
    return mid;
  }
  else if (cmp > 0) {
    // Our needle is greater than aHaystack[mid].
    if (aHigh - mid > 1) {
      // The element is in the upper half.
      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
    }

    // The exact needle element was not found in this haystack. Determine if
    // we are in termination case (3) or (2) and return the appropriate thing.
    if (aBias == exports.LEAST_UPPER_BOUND) {
      return aHigh < aHaystack.length ? aHigh : -1;
    } else {
      return mid;
    }
  }
  else {
    // Our needle is less than aHaystack[mid].
    if (mid - aLow > 1) {
      // The element is in the lower half.
      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
    }

    // we are in termination case (3) or (2) and return the appropriate thing.
    if (aBias == exports.LEAST_UPPER_BOUND) {
      return mid;
    } else {
      return aLow < 0 ? -1 : aLow;
    }
  }
}

/**
 * This is an implementation of binary search which will always try and return
 * the index of the closest element if there is no exact hit. This is because
 * mappings between original and generated line/col pairs are single points,
 * and there is an implicit region between each of them, so a miss just means
 * that you aren't on the very start of a region.
 *
 * @param aNeedle The element you are looking for.
 * @param aHaystack The array that is being searched.
 * @param aCompare A function which takes the needle and an element in the
 *     array and returns -1, 0, or 1 depending on whether the needle is less
 *     than, equal to, or greater than the element, respectively.
 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
 *     closest element that is smaller than or greater than the one we are
 *     searching for, respectively, if the exact element cannot be found.
 *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
 */
exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
  if (aHaystack.length === 0) {
    return -1;
  }

  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);
  if (index < 0) {
    return -1;
  }

  // We have found either the exact element, or the next-closest element than
  // the one we are searching for. However, there may be more than one such
  // element. Make sure we always return the smallest of these.
  while (index - 1 >= 0) {
    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
      break;
    }
    --index;
  }

  return index;
};
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2014 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var util = require('./util');

/**
 * Determine whether mappingB is after mappingA with respect to generated
 * position.
 */
function generatedPositionAfter(mappingA, mappingB) {
  // Optimized for most common case
  var lineA = mappingA.generatedLine;
  var lineB = mappingB.generatedLine;
  var columnA = mappingA.generatedColumn;
  var columnB = mappingB.generatedColumn;
  return lineB > lineA || lineB == lineA && columnB >= columnA ||
         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
}

/**
 * A data structure to provide a sorted view of accumulated mappings in a
 * performance conscious manner. It trades a neglibable overhead in general
 * case for a large speedup in case of mappings being added in order.
 */
function MappingList() {
  this._array = [];
  this._sorted = true;
  // Serves as infimum
  this._last = {generatedLine: -1, generatedColumn: 0};
}

/**
 * Iterate through internal items. This method takes the same arguments that
 * `Array.prototype.forEach` takes.
 *
 * NOTE: The order of the mappings is NOT guaranteed.
 */
MappingList.prototype.unsortedForEach =
  function MappingList_forEach(aCallback, aThisArg) {
    this._array.forEach(aCallback, aThisArg);
  };

/**
 * Add the given source mapping.
 *
 * @param Object aMapping
 */
MappingList.prototype.add = function MappingList_add(aMapping) {
  if (generatedPositionAfter(this._last, aMapping)) {
    this._last = aMapping;
    this._array.push(aMapping);
  } else {
    this._sorted = false;
    this._array.push(aMapping);
  }
};

/**
 * Returns the flat, sorted array of mappings. The mappings are sorted by
 * generated position.
 *
 * WARNING: This method returns internal data without copying, for
 * performance. The return value must NOT be mutated, and should be treated as
 * an immutable borrow. If you want to take ownership, you must make your own
 * copy.
 */
MappingList.prototype.toArray = function MappingList_toArray() {
  if (!this._sorted) {
    this._array.sort(util.compareByGeneratedPositionsInflated);
    this._sorted = true;
  }
  return this._array;
};

exports.MappingList = MappingList;
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

// It turns out that some (most?) JavaScript engines don't self-host
// `Array.prototype.sort`. This makes sense because C++ will likely remain
// faster than JS when doing raw CPU-intensive sorting. However, when using a
// custom comparator function, calling back and forth between the VM's C++ and
// JIT'd JS is rather slow *and* loses JIT type information, resulting in
// worse generated code for the comparator function than would be optimal. In
// fact, when sorting with a comparator, these costs outweigh the benefits of
// sorting in C++. By using our own JS-implemented Quick Sort (below), we get
// a ~3500ms mean speed-up in `bench/bench.html`.

/**
 * Swap the elements indexed by `x` and `y` in the array `ary`.
 *
 * @param {Array} ary
 *        The array.
 * @param {Number} x
 *        The index of the first item.
 * @param {Number} y
 *        The index of the second item.
 */
function swap(ary, x, y) {
  var temp = ary[x];
  ary[x] = ary[y];
  ary[y] = temp;
}

/**
 * Returns a random integer within the range `low .. high` inclusive.
 *
 * @param {Number} low
 *        The lower bound on the range.
 * @param {Number} high
 *        The upper bound on the range.
 */
function randomIntInRange(low, high) {
  return Math.round(low + (Math.random() * (high - low)));
}

/**
 * The Quick Sort algorithm.
 *
 * @param {Array} ary
 *        An array to sort.
 * @param {function} comparator
 *        Function to use to compare two items.
 * @param {Number} p
 *        Start index of the array
 * @param {Number} r
 *        End index of the array
 */
function doQuickSort(ary, comparator, p, r) {
  // If our lower bound is less than our upper bound, we (1) partition the
  // array into two pieces and (2) recurse on each half. If it is not, this is
  // the empty array and our base case.

  if (p < r) {
    // (1) Partitioning.
    //
    // The partitioning chooses a pivot between `p` and `r` and moves all
    // elements that are less than or equal to the pivot to the before it, and
    // all the elements that are greater than it after it. The effect is that
    // once partition is done, the pivot is in the exact place it will be when
    // the array is put in sorted order, and it will not need to be moved
    // again. This runs in O(n) time.

    // Always choose a random pivot so that an input array which is reverse
    // sorted does not cause O(n^2) running time.
    var pivotIndex = randomIntInRange(p, r);
    var i = p - 1;

    swap(ary, pivotIndex, r);
    var pivot = ary[r];

    // Immediately after `j` is incremented in this loop, the following hold
    // true:
    //
    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.
    //
    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
    for (var j = p; j < r; j++) {
      if (comparator(ary[j], pivot) <= 0) {
        i += 1;
        swap(ary, i, j);
      }
    }

    swap(ary, i + 1, j);
    var q = i + 1;

    // (2) Recurse on each half.

    doQuickSort(ary, comparator, p, q - 1);
    doQuickSort(ary, comparator, q + 1, r);
  }
}

/**
 * Sort the given array in-place with the given comparator function.
 *
 * @param {Array} ary
 *        An array to sort.
 * @param {function} comparator
 *        Function to use to compare two items.
 */
exports.quickSort = function (ary, comparator) {
  doQuickSort(ary, comparator, 0, ary.length - 1);
};
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var util = require('./util');
var binarySearch = require('./binary-search');
var ArraySet = require('./array-set').ArraySet;
var base64VLQ = require('./base64-vlq');
var quickSort = require('./quick-sort').quickSort;

function SourceMapConsumer(aSourceMap, aSourceMapURL) {
  var sourceMap = aSourceMap;
  if (typeof aSourceMap === 'string') {
    sourceMap = util.parseSourceMapInput(aSourceMap);
  }

  return sourceMap.sections != null
    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
}

SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
}

/**
 * The version of the source mapping spec that we are consuming.
 */
SourceMapConsumer.prototype._version = 3;

// `__generatedMappings` and `__originalMappings` are arrays that hold the
// parsed mapping coordinates from the source map's "mappings" attribute. They
// are lazily instantiated, accessed via the `_generatedMappings` and
// `_originalMappings` getters respectively, and we only parse the mappings
// and create these arrays once queried for a source location. We jump through
// these hoops because there can be many thousands of mappings, and parsing
// them is expensive, so we only want to do it if we must.
//
// Each object in the arrays is of the form:
//
//     {
//       generatedLine: The line number in the generated code,
//       generatedColumn: The column number in the generated code,
//       source: The path to the original source file that generated this
//               chunk of code,
//       originalLine: The line number in the original source that
//                     corresponds to this chunk of generated code,
//       originalColumn: The column number in the original source that
//                       corresponds to this chunk of generated code,
//       name: The name of the original symbol which generated this chunk of
//             code.
//     }
//
// All properties except for `generatedLine` and `generatedColumn` can be
// `null`.
//
// `_generatedMappings` is ordered by the generated positions.
//
// `_originalMappings` is ordered by the original positions.

SourceMapConsumer.prototype.__generatedMappings = null;
Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
  configurable: true,
  enumerable: true,
  get: function () {
    if (!this.__generatedMappings) {
      this._parseMappings(this._mappings, this.sourceRoot);
    }

    return this.__generatedMappings;
  }
});

SourceMapConsumer.prototype.__originalMappings = null;
Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
  configurable: true,
  enumerable: true,
  get: function () {
    if (!this.__originalMappings) {
      this._parseMappings(this._mappings, this.sourceRoot);
    }

    return this.__originalMappings;
  }
});

SourceMapConsumer.prototype._charIsMappingSeparator =
  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
    var c = aStr.charAt(index);
    return c === ";" || c === ",";
  };

/**
 * Parse the mappings in a string in to a data structure which we can easily
 * query (the ordered arrays in the `this.__generatedMappings` and
 * `this.__originalMappings` properties).
 */
SourceMapConsumer.prototype._parseMappings =
  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
    throw new Error("Subclasses must implement _parseMappings");
  };

SourceMapConsumer.GENERATED_ORDER = 1;
SourceMapConsumer.ORIGINAL_ORDER = 2;

SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
SourceMapConsumer.LEAST_UPPER_BOUND = 2;

/**
 * Iterate over each mapping between an original source/line/column and a
 * generated line/column in this source map.
 *
 * @param Function aCallback
 *        The function that is called with each mapping.
 * @param Object aContext
 *        Optional. If specified, this object will be the value of `this` every
 *        time that `aCallback` is called.
 * @param aOrder
 *        Either `SourceMapConsumer.GENERATED_ORDER` or
 *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
 *        iterate over the mappings sorted by the generated file's line/column
 *        order or the original's source/line/column order, respectively. Defaults to
 *        `SourceMapConsumer.GENERATED_ORDER`.
 */
SourceMapConsumer.prototype.eachMapping =
  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
    var context = aContext || null;
    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;

    var mappings;
    switch (order) {
    case SourceMapConsumer.GENERATED_ORDER:
      mappings = this._generatedMappings;
      break;
    case SourceMapConsumer.ORIGINAL_ORDER:
      mappings = this._originalMappings;
      break;
    default:
      throw new Error("Unknown order of iteration.");
    }

    var sourceRoot = this.sourceRoot;
    mappings.map(function (mapping) {
      var source = mapping.source === null ? null : this._sources.at(mapping.source);
      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
      return {
        source: source,
        generatedLine: mapping.generatedLine,
        generatedColumn: mapping.generatedColumn,
        originalLine: mapping.originalLine,
        originalColumn: mapping.originalColumn,
        name: mapping.name === null ? null : this._names.at(mapping.name)
      };
    }, this).forEach(aCallback, context);
  };

/**
 * Returns all generated line and column information for the original source,
 * line, and column provided. If no column is provided, returns all mappings
 * corresponding to a either the line we are searching for or the next
 * closest line that has any mappings. Otherwise, returns all mappings
 * corresponding to the given line and either the column we are searching for
 * or the next closest column that has any offsets.
 *
 * The only argument is an object with the following properties:
 *
 *   - source: The filename of the original source.
 *   - line: The line number in the original source.  The line number is 1-based.
 *   - column: Optional. the column number in the original source.
 *    The column number is 0-based.
 *
 * and an array of objects is returned, each with the following properties:
 *
 *   - line: The line number in the generated source, or null.  The
 *    line number is 1-based.
 *   - column: The column number in the generated source, or null.
 *    The column number is 0-based.
 */
SourceMapConsumer.prototype.allGeneratedPositionsFor =
  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
    var line = util.getArg(aArgs, 'line');

    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
    // returns the index of the closest mapping less than the needle. By
    // setting needle.originalColumn to 0, we thus find the last mapping for
    // the given line, provided such a mapping exists.
    var needle = {
      source: util.getArg(aArgs, 'source'),
      originalLine: line,
      originalColumn: util.getArg(aArgs, 'column', 0)
    };

    needle.source = this._findSourceIndex(needle.source);
    if (needle.source < 0) {
      return [];
    }

    var mappings = [];

    var index = this._findMapping(needle,
                                  this._originalMappings,
                                  "originalLine",
                                  "originalColumn",
                                  util.compareByOriginalPositions,
                                  binarySearch.LEAST_UPPER_BOUND);
    if (index >= 0) {
      var mapping = this._originalMappings[index];

      if (aArgs.column === undefined) {
        var originalLine = mapping.originalLine;

        // Iterate until either we run out of mappings, or we run into
        // a mapping for a different line than the one we found. Since
        // mappings are sorted, this is guaranteed to find all mappings for
        // the line we found.
        while (mapping && mapping.originalLine === originalLine) {
          mappings.push({
            line: util.getArg(mapping, 'generatedLine', null),
            column: util.getArg(mapping, 'generatedColumn', null),
            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
          });

          mapping = this._originalMappings[++index];
        }
      } else {
        var originalColumn = mapping.originalColumn;

        // Iterate until either we run out of mappings, or we run into
        // a mapping for a different line than the one we were searching for.
        // Since mappings are sorted, this is guaranteed to find all mappings for
        // the line we are searching for.
        while (mapping &&
               mapping.originalLine === line &&
               mapping.originalColumn == originalColumn) {
          mappings.push({
            line: util.getArg(mapping, 'generatedLine', null),
            column: util.getArg(mapping, 'generatedColumn', null),
            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
          });

          mapping = this._originalMappings[++index];
        }
      }
    }

    return mappings;
  };

exports.SourceMapConsumer = SourceMapConsumer;

/**
 * A BasicSourceMapConsumer instance represents a parsed source map which we can
 * query for information about the original file positions by giving it a file
 * position in the generated source.
 *
 * The first parameter is the raw source map (either as a JSON string, or
 * already parsed to an object). According to the spec, source maps have the
 * following attributes:
 *
 *   - version: Which version of the source map spec this map is following.
 *   - sources: An array of URLs to the original source files.
 *   - names: An array of identifiers which can be referrenced by individual mappings.
 *   - sourceRoot: Optional. The URL root from which all sources are relative.
 *   - sourcesContent: Optional. An array of contents of the original source files.
 *   - mappings: A string of base64 VLQs which contain the actual mappings.
 *   - file: Optional. The generated file this source map is associated with.
 *
 * Here is an example source map, taken from the source map spec[0]:
 *
 *     {
 *       version : 3,
 *       file: "out.js",
 *       sourceRoot : "",
 *       sources: ["foo.js", "bar.js"],
 *       names: ["src", "maps", "are", "fun"],
 *       mappings: "AA,AB;;ABCDE;"
 *     }
 *
 * The second parameter, if given, is a string whose value is the URL
 * at which the source map was found.  This URL is used to compute the
 * sources array.
 *
 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
 */
function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
  var sourceMap = aSourceMap;
  if (typeof aSourceMap === 'string') {
    sourceMap = util.parseSourceMapInput(aSourceMap);
  }

  var version = util.getArg(sourceMap, 'version');
  var sources = util.getArg(sourceMap, 'sources');
  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
  // requires the array) to play nice here.
  var names = util.getArg(sourceMap, 'names', []);
  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
  var mappings = util.getArg(sourceMap, 'mappings');
  var file = util.getArg(sourceMap, 'file', null);

  // Once again, Sass deviates from the spec and supplies the version as a
  // string rather than a number, so we use loose equality checking here.
  if (version != this._version) {
    throw new Error('Unsupported version: ' + version);
  }

  if (sourceRoot) {
    sourceRoot = util.normalize(sourceRoot);
  }

  sources = sources
    .map(String)
    // Some source maps produce relative source paths like "./foo.js" instead of
    // "foo.js".  Normalize these first so that future comparisons will succeed.
    // See bugzil.la/1090768.
    .map(util.normalize)
    // Always ensure that absolute sources are internally stored relative to
    // the source root, if the source root is absolute. Not doing this would
    // be particularly problematic when the source root is a prefix of the
    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
    .map(function (source) {
      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
        ? util.relative(sourceRoot, source)
        : source;
    });

  // Pass `true` below to allow duplicate names and sources. While source maps
  // are intended to be compressed and deduplicated, the TypeScript compiler
  // sometimes generates source maps with duplicates in them. See Github issue
  // #72 and bugzil.la/889492.
  this._names = ArraySet.fromArray(names.map(String), true);
  this._sources = ArraySet.fromArray(sources, true);

  this._absoluteSources = this._sources.toArray().map(function (s) {
    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
  });

  this.sourceRoot = sourceRoot;
  this.sourcesContent = sourcesContent;
  this._mappings = mappings;
  this._sourceMapURL = aSourceMapURL;
  this.file = file;
}

BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;

/**
 * Utility function to find the index of a source.  Returns -1 if not
 * found.
 */
BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
  var relativeSource = aSource;
  if (this.sourceRoot != null) {
    relativeSource = util.relative(this.sourceRoot, relativeSource);
  }

  if (this._sources.has(relativeSource)) {
    return this._sources.indexOf(relativeSource);
  }

  // Maybe aSource is an absolute URL as returned by |sources|.  In
  // this case we can't simply undo the transform.
  var i;
  for (i = 0; i < this._absoluteSources.length; ++i) {
    if (this._absoluteSources[i] == aSource) {
      return i;
    }
  }

  return -1;
};

/**
 * Create a BasicSourceMapConsumer from a SourceMapGenerator.
 *
 * @param SourceMapGenerator aSourceMap
 *        The source map that will be consumed.
 * @param String aSourceMapURL
 *        The URL at which the source map can be found (optional)
 * @returns BasicSourceMapConsumer
 */
BasicSourceMapConsumer.fromSourceMap =
  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
    var smc = Object.create(BasicSourceMapConsumer.prototype);

    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
    smc.sourceRoot = aSourceMap._sourceRoot;
    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
                                                            smc.sourceRoot);
    smc.file = aSourceMap._file;
    smc._sourceMapURL = aSourceMapURL;
    smc._absoluteSources = smc._sources.toArray().map(function (s) {
      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
    });

    // Because we are modifying the entries (by converting string sources and
    // names to indices into the sources and names ArraySets), we have to make
    // a copy of the entry or else bad things happen. Shared mutable state
    // strikes again! See github issue #191.

    var generatedMappings = aSourceMap._mappings.toArray().slice();
    var destGeneratedMappings = smc.__generatedMappings = [];
    var destOriginalMappings = smc.__originalMappings = [];

    for (var i = 0, length = generatedMappings.length; i < length; i++) {
      var srcMapping = generatedMappings[i];
      var destMapping = new Mapping;
      destMapping.generatedLine = srcMapping.generatedLine;
      destMapping.generatedColumn = srcMapping.generatedColumn;

      if (srcMapping.source) {
        destMapping.source = sources.indexOf(srcMapping.source);
        destMapping.originalLine = srcMapping.originalLine;
        destMapping.originalColumn = srcMapping.originalColumn;

        if (srcMapping.name) {
          destMapping.name = names.indexOf(srcMapping.name);
        }

        destOriginalMappings.push(destMapping);
      }

      destGeneratedMappings.push(destMapping);
    }

    quickSort(smc.__originalMappings, util.compareByOriginalPositions);

    return smc;
  };

/**
 * The version of the source mapping spec that we are consuming.
 */
BasicSourceMapConsumer.prototype._version = 3;

/**
 * The list of original sources.
 */
Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
  get: function () {
    return this._absoluteSources.slice();
  }
});

/**
 * Provide the JIT with a nice shape / hidden class.
 */
function Mapping() {
  this.generatedLine = 0;
  this.generatedColumn = 0;
  this.source = null;
  this.originalLine = null;
  this.originalColumn = null;
  this.name = null;
}

/**
 * Parse the mappings in a string in to a data structure which we can easily
 * query (the ordered arrays in the `this.__generatedMappings` and
 * `this.__originalMappings` properties).
 */
BasicSourceMapConsumer.prototype._parseMappings =
  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
    var generatedLine = 1;
    var previousGeneratedColumn = 0;
    var previousOriginalLine = 0;
    var previousOriginalColumn = 0;
    var previousSource = 0;
    var previousName = 0;
    var length = aStr.length;
    var index = 0;
    var cachedSegments = {};
    var temp = {};
    var originalMappings = [];
    var generatedMappings = [];
    var mapping, str, segment, end, value;

    while (index < length) {
      if (aStr.charAt(index) === ';') {
        generatedLine++;
        index++;
        previousGeneratedColumn = 0;
      }
      else if (aStr.charAt(index) === ',') {
        index++;
      }
      else {
        mapping = new Mapping();
        mapping.generatedLine = generatedLine;

        // Because each offset is encoded relative to the previous one,
        // many segments often have the same encoding. We can exploit this
        // fact by caching the parsed variable length fields of each segment,
        // allowing us to avoid a second parse if we encounter the same
        // segment again.
        for (end = index; end < length; end++) {
          if (this._charIsMappingSeparator(aStr, end)) {
            break;
          }
        }
        str = aStr.slice(index, end);

        segment = cachedSegments[str];
        if (segment) {
          index += str.length;
        } else {
          segment = [];
          while (index < end) {
            base64VLQ.decode(aStr, index, temp);
            value = temp.value;
            index = temp.rest;
            segment.push(value);
          }

          if (segment.length === 2) {
            throw new Error('Found a source, but no line and column');
          }

          if (segment.length === 3) {
            throw new Error('Found a source and line, but no column');
          }

          cachedSegments[str] = segment;
        }

        // Generated column.
        mapping.generatedColumn = previousGeneratedColumn + segment[0];
        previousGeneratedColumn = mapping.generatedColumn;

        if (segment.length > 1) {
          // Original source.
          mapping.source = previousSource + segment[1];
          previousSource += segment[1];

          // Original line.
          mapping.originalLine = previousOriginalLine + segment[2];
          previousOriginalLine = mapping.originalLine;
          // Lines are stored 0-based
          mapping.originalLine += 1;

          // Original column.
          mapping.originalColumn = previousOriginalColumn + segment[3];
          previousOriginalColumn = mapping.originalColumn;

          if (segment.length > 4) {
            // Original name.
            mapping.name = previousName + segment[4];
            previousName += segment[4];
          }
        }

        generatedMappings.push(mapping);
        if (typeof mapping.originalLine === 'number') {
          originalMappings.push(mapping);
        }
      }
    }

    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
    this.__generatedMappings = generatedMappings;

    quickSort(originalMappings, util.compareByOriginalPositions);
    this.__originalMappings = originalMappings;
  };

/**
 * Find the mapping that best matches the hypothetical "needle" mapping that
 * we are searching for in the given "haystack" of mappings.
 */
BasicSourceMapConsumer.prototype._findMapping =
  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
                                         aColumnName, aComparator, aBias) {
    // To return the position we are searching for, we must first find the
    // mapping for the given position and then return the opposite position it
    // points to. Because the mappings are sorted, we can use binary search to
    // find the best mapping.

    if (aNeedle[aLineName] <= 0) {
      throw new TypeError('Line must be greater than or equal to 1, got '
                          + aNeedle[aLineName]);
    }
    if (aNeedle[aColumnName] < 0) {
      throw new TypeError('Column must be greater than or equal to 0, got '
                          + aNeedle[aColumnName]);
    }

    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
  };

/**
 * Compute the last column for each generated mapping. The last column is
 * inclusive.
 */
BasicSourceMapConsumer.prototype.computeColumnSpans =
  function SourceMapConsumer_computeColumnSpans() {
    for (var index = 0; index < this._generatedMappings.length; ++index) {
      var mapping = this._generatedMappings[index];

      // Mappings do not contain a field for the last generated columnt. We
      // can come up with an optimistic estimate, however, by assuming that
      // mappings are contiguous (i.e. given two consecutive mappings, the
      // first mapping ends where the second one starts).
      if (index + 1 < this._generatedMappings.length) {
        var nextMapping = this._generatedMappings[index + 1];

        if (mapping.generatedLine === nextMapping.generatedLine) {
          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
          continue;
        }
      }

      // The last mapping for each line spans the entire line.
      mapping.lastGeneratedColumn = Infinity;
    }
  };

/**
 * Returns the original source, line, and column information for the generated
 * source's line and column positions provided. The only argument is an object
 * with the following properties:
 *
 *   - line: The line number in the generated source.  The line number
 *     is 1-based.
 *   - column: The column number in the generated source.  The column
 *     number is 0-based.
 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
 *     closest element that is smaller than or greater than the one we are
 *     searching for, respectively, if the exact element cannot be found.
 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
 *
 * and an object is returned with the following properties:
 *
 *   - source: The original source file, or null.
 *   - line: The line number in the original source, or null.  The
 *     line number is 1-based.
 *   - column: The column number in the original source, or null.  The
 *     column number is 0-based.
 *   - name: The original identifier, or null.
 */
BasicSourceMapConsumer.prototype.originalPositionFor =
  function SourceMapConsumer_originalPositionFor(aArgs) {
    var needle = {
      generatedLine: util.getArg(aArgs, 'line'),
      generatedColumn: util.getArg(aArgs, 'column')
    };

    var index = this._findMapping(
      needle,
      this._generatedMappings,
      "generatedLine",
      "generatedColumn",
      util.compareByGeneratedPositionsDeflated,
      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
    );

    if (index >= 0) {
      var mapping = this._generatedMappings[index];

      if (mapping.generatedLine === needle.generatedLine) {
        var source = util.getArg(mapping, 'source', null);
        if (source !== null) {
          source = this._sources.at(source);
          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
        }
        var name = util.getArg(mapping, 'name', null);
        if (name !== null) {
          name = this._names.at(name);
        }
        return {
          source: source,
          line: util.getArg(mapping, 'originalLine', null),
          column: util.getArg(mapping, 'originalColumn', null),
          name: name
        };
      }
    }

    return {
      source: null,
      line: null,
      column: null,
      name: null
    };
  };

/**
 * Return true if we have the source content for every source in the source
 * map, false otherwise.
 */
BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
  function BasicSourceMapConsumer_hasContentsOfAllSources() {
    if (!this.sourcesContent) {
      return false;
    }
    return this.sourcesContent.length >= this._sources.size() &&
      !this.sourcesContent.some(function (sc) { return sc == null; });
  };

/**
 * Returns the original source content. The only argument is the url of the
 * original source file. Returns null if no original source content is
 * available.
 */
BasicSourceMapConsumer.prototype.sourceContentFor =
  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
    if (!this.sourcesContent) {
      return null;
    }

    var index = this._findSourceIndex(aSource);
    if (index >= 0) {
      return this.sourcesContent[index];
    }

    var relativeSource = aSource;
    if (this.sourceRoot != null) {
      relativeSource = util.relative(this.sourceRoot, relativeSource);
    }

    var url;
    if (this.sourceRoot != null
        && (url = util.urlParse(this.sourceRoot))) {
      // XXX: file:// URIs and absolute paths lead to unexpected behavior for
      // many users. We can help them out when they expect file:// URIs to
      // behave like it would if they were running a local HTTP server. See
      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
      var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
      if (url.scheme == "file"
          && this._sources.has(fileUriAbsPath)) {
        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
      }

      if ((!url.path || url.path == "/")
          && this._sources.has("/" + relativeSource)) {
        return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
      }
    }

    // This function is used recursively from
    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
    // don't want to throw if we can't find the source - we just want to
    // return null, so we provide a flag to exit gracefully.
    if (nullOnMissing) {
      return null;
    }
    else {
      throw new Error('"' + relativeSource + '" is not in the SourceMap.');
    }
  };

/**
 * Returns the generated line and column information for the original source,
 * line, and column positions provided. The only argument is an object with
 * the following properties:
 *
 *   - source: The filename of the original source.
 *   - line: The line number in the original source.  The line number
 *     is 1-based.
 *   - column: The column number in the original source.  The column
 *     number is 0-based.
 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
 *     closest element that is smaller than or greater than the one we are
 *     searching for, respectively, if the exact element cannot be found.
 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
 *
 * and an object is returned with the following properties:
 *
 *   - line: The line number in the generated source, or null.  The
 *     line number is 1-based.
 *   - column: The column number in the generated source, or null.
 *     The column number is 0-based.
 */
BasicSourceMapConsumer.prototype.generatedPositionFor =
  function SourceMapConsumer_generatedPositionFor(aArgs) {
    var source = util.getArg(aArgs, 'source');
    source = this._findSourceIndex(source);
    if (source < 0) {
      return {
        line: null,
        column: null,
        lastColumn: null
      };
    }

    var needle = {
      source: source,
      originalLine: util.getArg(aArgs, 'line'),
      originalColumn: util.getArg(aArgs, 'column')
    };

    var index = this._findMapping(
      needle,
      this._originalMappings,
      "originalLine",
      "originalColumn",
      util.compareByOriginalPositions,
      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
    );

    if (index >= 0) {
      var mapping = this._originalMappings[index];

      if (mapping.source === needle.source) {
        return {
          line: util.getArg(mapping, 'generatedLine', null),
          column: util.getArg(mapping, 'generatedColumn', null),
          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
        };
      }
    }

    return {
      line: null,
      column: null,
      lastColumn: null
    };
  };

exports.BasicSourceMapConsumer = BasicSourceMapConsumer;

/**
 * An IndexedSourceMapConsumer instance represents a parsed source map which
 * we can query for information. It differs from BasicSourceMapConsumer in
 * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
 * input.
 *
 * The first parameter is a raw source map (either as a JSON string, or already
 * parsed to an object). According to the spec for indexed source maps, they
 * have the following attributes:
 *
 *   - version: Which version of the source map spec this map is following.
 *   - file: Optional. The generated file this source map is associated with.
 *   - sections: A list of section definitions.
 *
 * Each value under the "sections" field has two fields:
 *   - offset: The offset into the original specified at which this section
 *       begins to apply, defined as an object with a "line" and "column"
 *       field.
 *   - map: A source map definition. This source map could also be indexed,
 *       but doesn't have to be.
 *
 * Instead of the "map" field, it's also possible to have a "url" field
 * specifying a URL to retrieve a source map from, but that's currently
 * unsupported.
 *
 * Here's an example source map, taken from the source map spec[0], but
 * modified to omit a section which uses the "url" field.
 *
 *  {
 *    version : 3,
 *    file: "app.js",
 *    sections: [{
 *      offset: {line:100, column:10},
 *      map: {
 *        version : 3,
 *        file: "section.js",
 *        sources: ["foo.js", "bar.js"],
 *        names: ["src", "maps", "are", "fun"],
 *        mappings: "AAAA,E;;ABCDE;"
 *      }
 *    }],
 *  }
 *
 * The second parameter, if given, is a string whose value is the URL
 * at which the source map was found.  This URL is used to compute the
 * sources array.
 *
 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
 */
function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
  var sourceMap = aSourceMap;
  if (typeof aSourceMap === 'string') {
    sourceMap = util.parseSourceMapInput(aSourceMap);
  }

  var version = util.getArg(sourceMap, 'version');
  var sections = util.getArg(sourceMap, 'sections');

  if (version != this._version) {
    throw new Error('Unsupported version: ' + version);
  }

  this._sources = new ArraySet();
  this._names = new ArraySet();

  var lastOffset = {
    line: -1,
    column: 0
  };
  this._sections = sections.map(function (s) {
    if (s.url) {
      // The url field will require support for asynchronicity.
      // See https://github.com/mozilla/source-map/issues/16
      throw new Error('Support for url field in sections not implemented.');
    }
    var offset = util.getArg(s, 'offset');
    var offsetLine = util.getArg(offset, 'line');
    var offsetColumn = util.getArg(offset, 'column');

    if (offsetLine < lastOffset.line ||
        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
      throw new Error('Section offsets must be ordered and non-overlapping.');
    }
    lastOffset = offset;

    return {
      generatedOffset: {
        // The offset fields are 0-based, but we use 1-based indices when
        // encoding/decoding from VLQ.
        generatedLine: offsetLine + 1,
        generatedColumn: offsetColumn + 1
      },
      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)
    }
  });
}

IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;

/**
 * The version of the source mapping spec that we are consuming.
 */
IndexedSourceMapConsumer.prototype._version = 3;

/**
 * The list of original sources.
 */
Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
  get: function () {
    var sources = [];
    for (var i = 0; i < this._sections.length; i++) {
      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
        sources.push(this._sections[i].consumer.sources[j]);
      }
    }
    return sources;
  }
});

/**
 * Returns the original source, line, and column information for the generated
 * source's line and column positions provided. The only argument is an object
 * with the following properties:
 *
 *   - line: The line number in the generated source.  The line number
 *     is 1-based.
 *   - column: The column number in the generated source.  The column
 *     number is 0-based.
 *
 * and an object is returned with the following properties:
 *
 *   - source: The original source file, or null.
 *   - line: The line number in the original source, or null.  The
 *     line number is 1-based.
 *   - column: The column number in the original source, or null.  The
 *     column number is 0-based.
 *   - name: The original identifier, or null.
 */
IndexedSourceMapConsumer.prototype.originalPositionFor =
  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
    var needle = {
      generatedLine: util.getArg(aArgs, 'line'),
      generatedColumn: util.getArg(aArgs, 'column')
    };

    // Find the section containing the generated position we're trying to map
    // to an original position.
    var sectionIndex = binarySearch.search(needle, this._sections,
      function(needle, section) {
        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
        if (cmp) {
          return cmp;
        }

        return (needle.generatedColumn -
                section.generatedOffset.generatedColumn);
      });
    var section = this._sections[sectionIndex];

    if (!section) {
      return {
        source: null,
        line: null,
        column: null,
        name: null
      };
    }

    return section.consumer.originalPositionFor({
      line: needle.generatedLine -
        (section.generatedOffset.generatedLine - 1),
      column: needle.generatedColumn -
        (section.generatedOffset.generatedLine === needle.generatedLine
         ? section.generatedOffset.generatedColumn - 1
         : 0),
      bias: aArgs.bias
    });
  };

/**
 * Return true if we have the source content for every source in the source
 * map, false otherwise.
 */
IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
  function IndexedSourceMapConsumer_hasContentsOfAllSources() {
    return this._sections.every(function (s) {
      return s.consumer.hasContentsOfAllSources();
    });
  };

/**
 * Returns the original source content. The only argument is the url of the
 * original source file. Returns null if no original source content is
 * available.
 */
IndexedSourceMapConsumer.prototype.sourceContentFor =
  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
    for (var i = 0; i < this._sections.length; i++) {
      var section = this._sections[i];

      var content = section.consumer.sourceContentFor(aSource, true);
      if (content) {
        return content;
      }
    }
    if (nullOnMissing) {
      return null;
    }
    else {
      throw new Error('"' + aSource + '" is not in the SourceMap.');
    }
  };

/**
 * Returns the generated line and column information for the original source,
 * line, and column positions provided. The only argument is an object with
 * the following properties:
 *
 *   - source: The filename of the original source.
 *   - line: The line number in the original source.  The line number
 *     is 1-based.
 *   - column: The column number in the original source.  The column
 *     number is 0-based.
 *
 * and an object is returned with the following properties:
 *
 *   - line: The line number in the generated source, or null.  The
 *     line number is 1-based. 
 *   - column: The column number in the generated source, or null.
 *     The column number is 0-based.
 */
IndexedSourceMapConsumer.prototype.generatedPositionFor =
  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
    for (var i = 0; i < this._sections.length; i++) {
      var section = this._sections[i];

      // Only consider this section if the requested source is in the list of
      // sources of the consumer.
      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
        continue;
      }
      var generatedPosition = section.consumer.generatedPositionFor(aArgs);
      if (generatedPosition) {
        var ret = {
          line: generatedPosition.line +
            (section.generatedOffset.generatedLine - 1),
          column: generatedPosition.column +
            (section.generatedOffset.generatedLine === generatedPosition.line
             ? section.generatedOffset.generatedColumn - 1
             : 0)
        };
        return ret;
      }
    }

    return {
      line: null,
      column: null
    };
  };

/**
 * Parse the mappings in a string in to a data structure which we can easily
 * query (the ordered arrays in the `this.__generatedMappings` and
 * `this.__originalMappings` properties).
 */
IndexedSourceMapConsumer.prototype._parseMappings =
  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
    this.__generatedMappings = [];
    this.__originalMappings = [];
    for (var i = 0; i < this._sections.length; i++) {
      var section = this._sections[i];
      var sectionMappings = section.consumer._generatedMappings;
      for (var j = 0; j < sectionMappings.length; j++) {
        var mapping = sectionMappings[j];

        var source = section.consumer._sources.at(mapping.source);
        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
        this._sources.add(source);
        source = this._sources.indexOf(source);

        var name = null;
        if (mapping.name) {
          name = section.consumer._names.at(mapping.name);
          this._names.add(name);
          name = this._names.indexOf(name);
        }

        // The mappings coming from the consumer for the section have
        // generated positions relative to the start of the section, so we
        // need to offset them to be relative to the start of the concatenated
        // generated file.
        var adjustedMapping = {
          source: source,
          generatedLine: mapping.generatedLine +
            (section.generatedOffset.generatedLine - 1),
          generatedColumn: mapping.generatedColumn +
            (section.generatedOffset.generatedLine === mapping.generatedLine
            ? section.generatedOffset.generatedColumn - 1
            : 0),
          originalLine: mapping.originalLine,
          originalColumn: mapping.originalColumn,
          name: name
        };

        this.__generatedMappings.push(adjustedMapping);
        if (typeof adjustedMapping.originalLine === 'number') {
          this.__originalMappings.push(adjustedMapping);
        }
      }
    }

    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
    quickSort(this.__originalMappings, util.compareByOriginalPositions);
  };

exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var base64VLQ = require('./base64-vlq');
var util = require('./util');
var ArraySet = require('./array-set').ArraySet;
var MappingList = require('./mapping-list').MappingList;

/**
 * An instance of the SourceMapGenerator represents a source map which is
 * being built incrementally. You may pass an object with the following
 * properties:
 *
 *   - file: The filename of the generated source.
 *   - sourceRoot: A root for all relative URLs in this source map.
 */
function SourceMapGenerator(aArgs) {
  if (!aArgs) {
    aArgs = {};
  }
  this._file = util.getArg(aArgs, 'file', null);
  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
  this._sources = new ArraySet();
  this._names = new ArraySet();
  this._mappings = new MappingList();
  this._sourcesContents = null;
}

SourceMapGenerator.prototype._version = 3;

/**
 * Creates a new SourceMapGenerator based on a SourceMapConsumer
 *
 * @param aSourceMapConsumer The SourceMap.
 */
SourceMapGenerator.fromSourceMap =
  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
    var sourceRoot = aSourceMapConsumer.sourceRoot;
    var generator = new SourceMapGenerator({
      file: aSourceMapConsumer.file,
      sourceRoot: sourceRoot
    });
    aSourceMapConsumer.eachMapping(function (mapping) {
      var newMapping = {
        generated: {
          line: mapping.generatedLine,
          column: mapping.generatedColumn
        }
      };

      if (mapping.source != null) {
        newMapping.source = mapping.source;
        if (sourceRoot != null) {
          newMapping.source = util.relative(sourceRoot, newMapping.source);
        }

        newMapping.original = {
          line: mapping.originalLine,
          column: mapping.originalColumn
        };

        if (mapping.name != null) {
          newMapping.name = mapping.name;
        }
      }

      generator.addMapping(newMapping);
    });
    aSourceMapConsumer.sources.forEach(function (sourceFile) {
      var sourceRelative = sourceFile;
      if (sourceRoot !== null) {
        sourceRelative = util.relative(sourceRoot, sourceFile);
      }

      if (!generator._sources.has(sourceRelative)) {
        generator._sources.add(sourceRelative);
      }

      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
      if (content != null) {
        generator.setSourceContent(sourceFile, content);
      }
    });
    return generator;
  };

/**
 * Add a single mapping from original source line and column to the generated
 * source's line and column for this source map being created. The mapping
 * object should have the following properties:
 *
 *   - generated: An object with the generated line and column positions.
 *   - original: An object with the original line and column positions.
 *   - source: The original source file (relative to the sourceRoot).
 *   - name: An optional original token name for this mapping.
 */
SourceMapGenerator.prototype.addMapping =
  function SourceMapGenerator_addMapping(aArgs) {
    var generated = util.getArg(aArgs, 'generated');
    var original = util.getArg(aArgs, 'original', null);
    var source = util.getArg(aArgs, 'source', null);
    var name = util.getArg(aArgs, 'name', null);

    if (!this._skipValidation) {
      this._validateMapping(generated, original, source, name);
    }

    if (source != null) {
      source = String(source);
      if (!this._sources.has(source)) {
        this._sources.add(source);
      }
    }

    if (name != null) {
      name = String(name);
      if (!this._names.has(name)) {
        this._names.add(name);
      }
    }

    this._mappings.add({
      generatedLine: generated.line,
      generatedColumn: generated.column,
      originalLine: original != null && original.line,
      originalColumn: original != null && original.column,
      source: source,
      name: name
    });
  };

/**
 * Set the source content for a source file.
 */
SourceMapGenerator.prototype.setSourceContent =
  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
    var source = aSourceFile;
    if (this._sourceRoot != null) {
      source = util.relative(this._sourceRoot, source);
    }

    if (aSourceContent != null) {
      // Add the source content to the _sourcesContents map.
      // Create a new _sourcesContents map if the property is null.
      if (!this._sourcesContents) {
        this._sourcesContents = Object.create(null);
      }
      this._sourcesContents[util.toSetString(source)] = aSourceContent;
    } else if (this._sourcesContents) {
      // Remove the source file from the _sourcesContents map.
      // If the _sourcesContents map is empty, set the property to null.
      delete this._sourcesContents[util.toSetString(source)];
      if (Object.keys(this._sourcesContents).length === 0) {
        this._sourcesContents = null;
      }
    }
  };

/**
 * Applies the mappings of a sub-source-map for a specific source file to the
 * source map being generated. Each mapping to the supplied source file is
 * rewritten using the supplied source map. Note: The resolution for the
 * resulting mappings is the minimium of this map and the supplied map.
 *
 * @param aSourceMapConsumer The source map to be applied.
 * @param aSourceFile Optional. The filename of the source file.
 *        If omitted, SourceMapConsumer's file property will be used.
 * @param aSourceMapPath Optional. The dirname of the path to the source map
 *        to be applied. If relative, it is relative to the SourceMapConsumer.
 *        This parameter is needed when the two source maps aren't in the same
 *        directory, and the source map to be applied contains relative source
 *        paths. If so, those relative source paths need to be rewritten
 *        relative to the SourceMapGenerator.
 */
SourceMapGenerator.prototype.applySourceMap =
  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
    var sourceFile = aSourceFile;
    // If aSourceFile is omitted, we will use the file property of the SourceMap
    if (aSourceFile == null) {
      if (aSourceMapConsumer.file == null) {
        throw new Error(
          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
          'or the source map\'s "file" property. Both were omitted.'
        );
      }
      sourceFile = aSourceMapConsumer.file;
    }
    var sourceRoot = this._sourceRoot;
    // Make "sourceFile" relative if an absolute Url is passed.
    if (sourceRoot != null) {
      sourceFile = util.relative(sourceRoot, sourceFile);
    }
    // Applying the SourceMap can add and remove items from the sources and
    // the names array.
    var newSources = new ArraySet();
    var newNames = new ArraySet();

    // Find mappings for the "sourceFile"
    this._mappings.unsortedForEach(function (mapping) {
      if (mapping.source === sourceFile && mapping.originalLine != null) {
        // Check if it can be mapped by the source map, then update the mapping.
        var original = aSourceMapConsumer.originalPositionFor({
          line: mapping.originalLine,
          column: mapping.originalColumn
        });
        if (original.source != null) {
          // Copy mapping
          mapping.source = original.source;
          if (aSourceMapPath != null) {
            mapping.source = util.join(aSourceMapPath, mapping.source)
          }
          if (sourceRoot != null) {
            mapping.source = util.relative(sourceRoot, mapping.source);
          }
          mapping.originalLine = original.line;
          mapping.originalColumn = original.column;
          if (original.name != null) {
            mapping.name = original.name;
          }
        }
      }

      var source = mapping.source;
      if (source != null && !newSources.has(source)) {
        newSources.add(source);
      }

      var name = mapping.name;
      if (name != null && !newNames.has(name)) {
        newNames.add(name);
      }

    }, this);
    this._sources = newSources;
    this._names = newNames;

    // Copy sourcesContents of applied map.
    aSourceMapConsumer.sources.forEach(function (sourceFile) {
      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
      if (content != null) {
        if (aSourceMapPath != null) {
          sourceFile = util.join(aSourceMapPath, sourceFile);
        }
        if (sourceRoot != null) {
          sourceFile = util.relative(sourceRoot, sourceFile);
        }
        this.setSourceContent(sourceFile, content);
      }
    }, this);
  };

/**
 * A mapping can have one of the three levels of data:
 *
 *   1. Just the generated position.
 *   2. The Generated position, original position, and original source.
 *   3. Generated and original position, original source, as well as a name
 *      token.
 *
 * To maintain consistency, we validate that any new mapping being added falls
 * in to one of these categories.
 */
SourceMapGenerator.prototype._validateMapping =
  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
                                              aName) {
    // When aOriginal is truthy but has empty values for .line and .column,
    // it is most likely a programmer error. In this case we throw a very
    // specific error message to try to guide them the right way.
    // For example: https://github.com/Polymer/polymer-bundler/pull/519
    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
        throw new Error(
            'original.line and original.column are not numbers -- you probably meant to omit ' +
            'the original mapping entirely and only map the generated position. If so, pass ' +
            'null for the original mapping instead of an object with empty or null values.'
        );
    }

    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
        && aGenerated.line > 0 && aGenerated.column >= 0
        && !aOriginal && !aSource && !aName) {
      // Case 1.
      return;
    }
    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
             && aOriginal && 'line' in aOriginal && 'column' in aOriginal
             && aGenerated.line > 0 && aGenerated.column >= 0
             && aOriginal.line > 0 && aOriginal.column >= 0
             && aSource) {
      // Cases 2 and 3.
      return;
    }
    else {
      throw new Error('Invalid mapping: ' + JSON.stringify({
        generated: aGenerated,
        source: aSource,
        original: aOriginal,
        name: aName
      }));
    }
  };

/**
 * Serialize the accumulated mappings in to the stream of base 64 VLQs
 * specified by the source map format.
 */
SourceMapGenerator.prototype._serializeMappings =
  function SourceMapGenerator_serializeMappings() {
    var previousGeneratedColumn = 0;
    var previousGeneratedLine = 1;
    var previousOriginalColumn = 0;
    var previousOriginalLine = 0;
    var previousName = 0;
    var previousSource = 0;
    var result = '';
    var next;
    var mapping;
    var nameIdx;
    var sourceIdx;

    var mappings = this._mappings.toArray();
    for (var i = 0, len = mappings.length; i < len; i++) {
      mapping = mappings[i];
      next = ''

      if (mapping.generatedLine !== previousGeneratedLine) {
        previousGeneratedColumn = 0;
        while (mapping.generatedLine !== previousGeneratedLine) {
          next += ';';
          previousGeneratedLine++;
        }
      }
      else {
        if (i > 0) {
          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
            continue;
          }
          next += ',';
        }
      }

      next += base64VLQ.encode(mapping.generatedColumn
                                 - previousGeneratedColumn);
      previousGeneratedColumn = mapping.generatedColumn;

      if (mapping.source != null) {
        sourceIdx = this._sources.indexOf(mapping.source);
        next += base64VLQ.encode(sourceIdx - previousSource);
        previousSource = sourceIdx;

        // lines are stored 0-based in SourceMap spec version 3
        next += base64VLQ.encode(mapping.originalLine - 1
                                   - previousOriginalLine);
        previousOriginalLine = mapping.originalLine - 1;

        next += base64VLQ.encode(mapping.originalColumn
                                   - previousOriginalColumn);
        previousOriginalColumn = mapping.originalColumn;

        if (mapping.name != null) {
          nameIdx = this._names.indexOf(mapping.name);
          next += base64VLQ.encode(nameIdx - previousName);
          previousName = nameIdx;
        }
      }

      result += next;
    }

    return result;
  };

SourceMapGenerator.prototype._generateSourcesContent =
  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
    return aSources.map(function (source) {
      if (!this._sourcesContents) {
        return null;
      }
      if (aSourceRoot != null) {
        source = util.relative(aSourceRoot, source);
      }
      var key = util.toSetString(source);
      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
        ? this._sourcesContents[key]
        : null;
    }, this);
  };

/**
 * Externalize the source map.
 */
SourceMapGenerator.prototype.toJSON =
  function SourceMapGenerator_toJSON() {
    var map = {
      version: this._version,
      sources: this._sources.toArray(),
      names: this._names.toArray(),
      mappings: this._serializeMappings()
    };
    if (this._file != null) {
      map.file = this._file;
    }
    if (this._sourceRoot != null) {
      map.sourceRoot = this._sourceRoot;
    }
    if (this._sourcesContents) {
      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
    }

    return map;
  };

/**
 * Render the source map being generated to a string.
 */
SourceMapGenerator.prototype.toString =
  function SourceMapGenerator_toString() {
    return JSON.stringify(this.toJSON());
  };

exports.SourceMapGenerator = SourceMapGenerator;
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;
var util = require('./util');

// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
// operating systems these days (capturing the result).
var REGEX_NEWLINE = /(\r?\n)/;

// Newline character code for charCodeAt() comparisons
var NEWLINE_CODE = 10;

// Private symbol for identifying `SourceNode`s when multiple versions of
// the source-map library are loaded. This MUST NOT CHANGE across
// versions!
var isSourceNode = "$$$isSourceNode$$$";

/**
 * SourceNodes provide a way to abstract over interpolating/concatenating
 * snippets of generated JavaScript source code while maintaining the line and
 * column information associated with the original source code.
 *
 * @param aLine The original line number.
 * @param aColumn The original column number.
 * @param aSource The original source's filename.
 * @param aChunks Optional. An array of strings which are snippets of
 *        generated JS, or other SourceNodes.
 * @param aName The original identifier.
 */
function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
  this.children = [];
  this.sourceContents = {};
  this.line = aLine == null ? null : aLine;
  this.column = aColumn == null ? null : aColumn;
  this.source = aSource == null ? null : aSource;
  this.name = aName == null ? null : aName;
  this[isSourceNode] = true;
  if (aChunks != null) this.add(aChunks);
}

/**
 * Creates a SourceNode from generated code and a SourceMapConsumer.
 *
 * @param aGeneratedCode The generated code
 * @param aSourceMapConsumer The SourceMap for the generated code
 * @param aRelativePath Optional. The path that relative sources in the
 *        SourceMapConsumer should be relative to.
 */
SourceNode.fromStringWithSourceMap =
  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
    // The SourceNode we want to fill with the generated code
    // and the SourceMap
    var node = new SourceNode();

    // All even indices of this array are one line of the generated code,
    // while all odd indices are the newlines between two adjacent lines
    // (since `REGEX_NEWLINE` captures its match).
    // Processed fragments are accessed by calling `shiftNextLine`.
    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
    var remainingLinesIndex = 0;
    var shiftNextLine = function() {
      var lineContents = getNextLine();
      // The last line of a file might not have a newline.
      var newLine = getNextLine() || "";
      return lineContents + newLine;

      function getNextLine() {
        return remainingLinesIndex < remainingLines.length ?
            remainingLines[remainingLinesIndex++] : undefined;
      }
    };

    // We need to remember the position of "remainingLines"
    var lastGeneratedLine = 1, lastGeneratedColumn = 0;

    // The generate SourceNodes we need a code range.
    // To extract it current and last mapping is used.
    // Here we store the last mapping.
    var lastMapping = null;

    aSourceMapConsumer.eachMapping(function (mapping) {
      if (lastMapping !== null) {
        // We add the code from "lastMapping" to "mapping":
        // First check if there is a new line in between.
        if (lastGeneratedLine < mapping.generatedLine) {
          // Associate first line with "lastMapping"
          addMappingWithCode(lastMapping, shiftNextLine());
          lastGeneratedLine++;
          lastGeneratedColumn = 0;
          // The remaining code is added without mapping
        } else {
          // There is no new line in between.
          // Associate the code between "lastGeneratedColumn" and
          // "mapping.generatedColumn" with "lastMapping"
          var nextLine = remainingLines[remainingLinesIndex] || '';
          var code = nextLine.substr(0, mapping.generatedColumn -
                                        lastGeneratedColumn);
          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
                                              lastGeneratedColumn);
          lastGeneratedColumn = mapping.generatedColumn;
          addMappingWithCode(lastMapping, code);
          // No more remaining code, continue
          lastMapping = mapping;
          return;
        }
      }
      // We add the generated code until the first mapping
      // to the SourceNode without any mapping.
      // Each line is added as separate string.
      while (lastGeneratedLine < mapping.generatedLine) {
        node.add(shiftNextLine());
        lastGeneratedLine++;
      }
      if (lastGeneratedColumn < mapping.generatedColumn) {
        var nextLine = remainingLines[remainingLinesIndex] || '';
        node.add(nextLine.substr(0, mapping.generatedColumn));
        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
        lastGeneratedColumn = mapping.generatedColumn;
      }
      lastMapping = mapping;
    }, this);
    // We have processed all mappings.
    if (remainingLinesIndex < remainingLines.length) {
      if (lastMapping) {
        // Associate the remaining code in the current line with "lastMapping"
        addMappingWithCode(lastMapping, shiftNextLine());
      }
      // and add the remaining lines without any mapping
      node.add(remainingLines.splice(remainingLinesIndex).join(""));
    }

    // Copy sourcesContent into SourceNode
    aSourceMapConsumer.sources.forEach(function (sourceFile) {
      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
      if (content != null) {
        if (aRelativePath != null) {
          sourceFile = util.join(aRelativePath, sourceFile);
        }
        node.setSourceContent(sourceFile, content);
      }
    });

    return node;

    function addMappingWithCode(mapping, code) {
      if (mapping === null || mapping.source === undefined) {
        node.add(code);
      } else {
        var source = aRelativePath
          ? util.join(aRelativePath, mapping.source)
          : mapping.source;
        node.add(new SourceNode(mapping.originalLine,
                                mapping.originalColumn,
                                source,
                                code,
                                mapping.name));
      }
    }
  };

/**
 * Add a chunk of generated JS to this source node.
 *
 * @param aChunk A string snippet of generated JS code, another instance of
 *        SourceNode, or an array where each member is one of those things.
 */
SourceNode.prototype.add = function SourceNode_add(aChunk) {
  if (Array.isArray(aChunk)) {
    aChunk.forEach(function (chunk) {
      this.add(chunk);
    }, this);
  }
  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
    if (aChunk) {
      this.children.push(aChunk);
    }
  }
  else {
    throw new TypeError(
      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
    );
  }
  return this;
};

/**
 * Add a chunk of generated JS to the beginning of this source node.
 *
 * @param aChunk A string snippet of generated JS code, another instance of
 *        SourceNode, or an array where each member is one of those things.
 */
SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
  if (Array.isArray(aChunk)) {
    for (var i = aChunk.length-1; i >= 0; i--) {
      this.prepend(aChunk[i]);
    }
  }
  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
    this.children.unshift(aChunk);
  }
  else {
    throw new TypeError(
      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
    );
  }
  return this;
};

/**
 * Walk over the tree of JS snippets in this node and its children. The
 * walking function is called once for each snippet of JS and is passed that
 * snippet and the its original associated source's line/column location.
 *
 * @param aFn The traversal function.
 */
SourceNode.prototype.walk = function SourceNode_walk(aFn) {
  var chunk;
  for (var i = 0, len = this.children.length; i < len; i++) {
    chunk = this.children[i];
    if (chunk[isSourceNode]) {
      chunk.walk(aFn);
    }
    else {
      if (chunk !== '') {
        aFn(chunk, { source: this.source,
                     line: this.line,
                     column: this.column,
                     name: this.name });
      }
    }
  }
};

/**
 * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
 * each of `this.children`.
 *
 * @param aSep The separator.
 */
SourceNode.prototype.join = function SourceNode_join(aSep) {
  var newChildren;
  var i;
  var len = this.children.length;
  if (len > 0) {
    newChildren = [];
    for (i = 0; i < len-1; i++) {
      newChildren.push(this.children[i]);
      newChildren.push(aSep);
    }
    newChildren.push(this.children[i]);
    this.children = newChildren;
  }
  return this;
};

/**
 * Call String.prototype.replace on the very right-most source snippet. Useful
 * for trimming whitespace from the end of a source node, etc.
 *
 * @param aPattern The pattern to replace.
 * @param aReplacement The thing to replace the pattern with.
 */
SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
  var lastChild = this.children[this.children.length - 1];
  if (lastChild[isSourceNode]) {
    lastChild.replaceRight(aPattern, aReplacement);
  }
  else if (typeof lastChild === 'string') {
    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
  }
  else {
    this.children.push(''.replace(aPattern, aReplacement));
  }
  return this;
};

/**
 * Set the source content for a source file. This will be added to the SourceMapGenerator
 * in the sourcesContent field.
 *
 * @param aSourceFile The filename of the source file
 * @param aSourceContent The content of the source file
 */
SourceNode.prototype.setSourceContent =
  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
  };

/**
 * Walk over the tree of SourceNodes. The walking function is called for each
 * source file content and is passed the filename and source content.
 *
 * @param aFn The traversal function.
 */
SourceNode.prototype.walkSourceContents =
  function SourceNode_walkSourceContents(aFn) {
    for (var i = 0, len = this.children.length; i < len; i++) {
      if (this.children[i][isSourceNode]) {
        this.children[i].walkSourceContents(aFn);
      }
    }

    var sources = Object.keys(this.sourceContents);
    for (var i = 0, len = sources.length; i < len; i++) {
      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
    }
  };

/**
 * Return the string representation of this source node. Walks over the tree
 * and concatenates all the various snippets together to one string.
 */
SourceNode.prototype.toString = function SourceNode_toString() {
  var str = "";
  this.walk(function (chunk) {
    str += chunk;
  });
  return str;
};

/**
 * Returns the string representation of this source node along with a source
 * map.
 */
SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
  var generated = {
    code: "",
    line: 1,
    column: 0
  };
  var map = new SourceMapGenerator(aArgs);
  var sourceMappingActive = false;
  var lastOriginalSource = null;
  var lastOriginalLine = null;
  var lastOriginalColumn = null;
  var lastOriginalName = null;
  this.walk(function (chunk, original) {
    generated.code += chunk;
    if (original.source !== null
        && original.line !== null
        && original.column !== null) {
      if(lastOriginalSource !== original.source
         || lastOriginalLine !== original.line
         || lastOriginalColumn !== original.column
         || lastOriginalName !== original.name) {
        map.addMapping({
          source: original.source,
          original: {
            line: original.line,
            column: original.column
          },
          generated: {
            line: generated.line,
            column: generated.column
          },
          name: original.name
        });
      }
      lastOriginalSource = original.source;
      lastOriginalLine = original.line;
      lastOriginalColumn = original.column;
      lastOriginalName = original.name;
      sourceMappingActive = true;
    } else if (sourceMappingActive) {
      map.addMapping({
        generated: {
          line: generated.line,
          column: generated.column
        }
      });
      lastOriginalSource = null;
      sourceMappingActive = false;
    }
    for (var idx = 0, length = chunk.length; idx < length; idx++) {
      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
        generated.line++;
        generated.column = 0;
        // Mappings end at eol
        if (idx + 1 === length) {
          lastOriginalSource = null;
          sourceMappingActive = false;
        } else if (sourceMappingActive) {
          map.addMapping({
            source: original.source,
            original: {
              line: original.line,
              column: original.column
            },
            generated: {
              line: generated.line,
              column: generated.column
            },
            name: original.name
          });
        }
      } else {
        generated.column++;
      }
    }
  });
  this.walkSourceContents(function (sourceFile, sourceContent) {
    map.setSourceContent(sourceFile, sourceContent);
  });

  return { code: generated.code, map: map };
};

exports.SourceNode = SourceNode;
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
 * Copyright 2011 Mozilla Foundation and contributors
 * Licensed under the New BSD license. See LICENSE or:
 * http://opensource.org/licenses/BSD-3-Clause
 */

/**
 * This is a helper function for getting values from parameter/options
 * objects.
 *
 * @param args The object we are extracting values from
 * @param name The name of the property we are getting.
 * @param defaultValue An optional value to return if the property is missing
 * from the object. If this is not specified and the property is missing, an
 * error will be thrown.
 */
function getArg(aArgs, aName, aDefaultValue) {
  if (aName in aArgs) {
    return aArgs[aName];
  } else if (arguments.length === 3) {
    return aDefaultValue;
  } else {
    throw new Error('"' + aName + '" is a required argument.');
  }
}
exports.getArg = getArg;

var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
var dataUrlRegexp = /^data:.+\,.+$/;

function urlParse(aUrl) {
  var match = aUrl.match(urlRegexp);
  if (!match) {
    return null;
  }
  return {
    scheme: match[1],
    auth: match[2],
    host: match[3],
    port: match[4],
    path: match[5]
  };
}
exports.urlParse = urlParse;

function urlGenerate(aParsedUrl) {
  var url = '';
  if (aParsedUrl.scheme) {
    url += aParsedUrl.scheme + ':';
  }
  url += '//';
  if (aParsedUrl.auth) {
    url += aParsedUrl.auth + '@';
  }
  if (aParsedUrl.host) {
    url += aParsedUrl.host;
  }
  if (aParsedUrl.port) {
    url += ":" + aParsedUrl.port
  }
  if (aParsedUrl.path) {
    url += aParsedUrl.path;
  }
  return url;
}
exports.urlGenerate = urlGenerate;

/**
 * Normalizes a path, or the path portion of a URL:
 *
 * - Replaces consecutive slashes with one slash.
 * - Removes unnecessary '.' parts.
 * - Removes unnecessary '<dir>/..' parts.
 *
 * Based on code in the Node.js 'path' core module.
 *
 * @param aPath The path or url to normalize.
 */
function normalize(aPath) {
  var path = aPath;
  var url = urlParse(aPath);
  if (url) {
    if (!url.path) {
      return aPath;
    }
    path = url.path;
  }
  var isAbsolute = exports.isAbsolute(path);

  var parts = path.split(/\/+/);
  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
    part = parts[i];
    if (part === '.') {
      parts.splice(i, 1);
    } else if (part === '..') {
      up++;
    } else if (up > 0) {
      if (part === '') {
        // The first part is blank if the path is absolute. Trying to go
        // above the root is a no-op. Therefore we can remove all '..' parts
        // directly after the root.
        parts.splice(i + 1, up);
        up = 0;
      } else {
        parts.splice(i, 2);
        up--;
      }
    }
  }
  path = parts.join('/');

  if (path === '') {
    path = isAbsolute ? '/' : '.';
  }

  if (url) {
    url.path = path;
    return urlGenerate(url);
  }
  return path;
}
exports.normalize = normalize;

/**
 * Joins two paths/URLs.
 *
 * @param aRoot The root path or URL.
 * @param aPath The path or URL to be joined with the root.
 *
 * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
 *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended
 *   first.
 * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
 *   is updated with the result and aRoot is returned. Otherwise the result
 *   is returned.
 *   - If aPath is absolute, the result is aPath.
 *   - Otherwise the two paths are joined with a slash.
 * - Joining for example 'http://' and 'www.example.com' is also supported.
 */
function join(aRoot, aPath) {
  if (aRoot === "") {
    aRoot = ".";
  }
  if (aPath === "") {
    aPath = ".";
  }
  var aPathUrl = urlParse(aPath);
  var aRootUrl = urlParse(aRoot);
  if (aRootUrl) {
    aRoot = aRootUrl.path || '/';
  }

  // `join(foo, '//www.example.org')`
  if (aPathUrl && !aPathUrl.scheme) {
    if (aRootUrl) {
      aPathUrl.scheme = aRootUrl.scheme;
    }
    return urlGenerate(aPathUrl);
  }

  if (aPathUrl || aPath.match(dataUrlRegexp)) {
    return aPath;
  }

  // `join('http://', 'www.example.com')`
  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
    aRootUrl.host = aPath;
    return urlGenerate(aRootUrl);
  }

  var joined = aPath.charAt(0) === '/'
    ? aPath
    : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);

  if (aRootUrl) {
    aRootUrl.path = joined;
    return urlGenerate(aRootUrl);
  }
  return joined;
}
exports.join = join;

exports.isAbsolute = function (aPath) {
  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
};

/**
 * Make a path relative to a URL or another path.
 *
 * @param aRoot The root path or URL.
 * @param aPath The path or URL to be made relative to aRoot.
 */
function relative(aRoot, aPath) {
  if (aRoot === "") {
    aRoot = ".";
  }

  aRoot = aRoot.replace(/\/$/, '');

  // It is possible for the path to be above the root. In this case, simply
  // checking whether the root is a prefix of the path won't work. Instead, we
  // need to remove components from the root one by one, until either we find
  // a prefix that fits, or we run out of components to remove.
  var level = 0;
  while (aPath.indexOf(aRoot + '/') !== 0) {
    var index = aRoot.lastIndexOf("/");
    if (index < 0) {
      return aPath;
    }

    // If the only part of the root that is left is the scheme (i.e. http://,
    // file:///, etc.), one or more slashes (/), or simply nothing at all, we
    // have exhausted all components, so the path is not relative to the root.
    aRoot = aRoot.slice(0, index);
    if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
      return aPath;
    }

    ++level;
  }

  // Make sure we add a "../" for each component we removed from the root.
  return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
}
exports.relative = relative;

var supportsNullProto = (function () {
  var obj = Object.create(null);
  return !('__proto__' in obj);
}());

function identity (s) {
  return s;
}

/**
 * Because behavior goes wacky when you set `__proto__` on objects, we
 * have to prefix all the strings in our set with an arbitrary character.
 *
 * See https://github.com/mozilla/source-map/pull/31 and
 * https://github.com/mozilla/source-map/issues/30
 *
 * @param String aStr
 */
function toSetString(aStr) {
  if (isProtoString(aStr)) {
    return '$' + aStr;
  }

  return aStr;
}
exports.toSetString = supportsNullProto ? identity : toSetString;

function fromSetString(aStr) {
  if (isProtoString(aStr)) {
    return aStr.slice(1);
  }

  return aStr;
}
exports.fromSetString = supportsNullProto ? identity : fromSetString;

function isProtoString(s) {
  if (!s) {
    return false;
  }

  var length = s.length;

  if (length < 9 /* "__proto__".length */) {
    return false;
  }

  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||
      s.charCodeAt(length - 2) !== 95  /* '_' */ ||
      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
      s.charCodeAt(length - 4) !== 116 /* 't' */ ||
      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
      s.charCodeAt(length - 8) !== 95  /* '_' */ ||
      s.charCodeAt(length - 9) !== 95  /* '_' */) {
    return false;
  }

  for (var i = length - 10; i >= 0; i--) {
    if (s.charCodeAt(i) !== 36 /* '$' */) {
      return false;
    }
  }

  return true;
}

/**
 * Comparator between two mappings where the original positions are compared.
 *
 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
 * mappings with the same original source/line/column, but different generated
 * line and column the same. Useful when searching for a mapping with a
 * stubbed out mapping.
 */
function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
  var cmp = strcmp(mappingA.source, mappingB.source);
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalLine - mappingB.originalLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalColumn - mappingB.originalColumn;
  if (cmp !== 0 || onlyCompareOriginal) {
    return cmp;
  }

  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.generatedLine - mappingB.generatedLine;
  if (cmp !== 0) {
    return cmp;
  }

  return strcmp(mappingA.name, mappingB.name);
}
exports.compareByOriginalPositions = compareByOriginalPositions;

/**
 * Comparator between two mappings with deflated source and name indices where
 * the generated positions are compared.
 *
 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
 * mappings with the same generated line and column, but different
 * source/name/original line and column the same. Useful when searching for a
 * mapping with a stubbed out mapping.
 */
function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
  var cmp = mappingA.generatedLine - mappingB.generatedLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
  if (cmp !== 0 || onlyCompareGenerated) {
    return cmp;
  }

  cmp = strcmp(mappingA.source, mappingB.source);
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalLine - mappingB.originalLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalColumn - mappingB.originalColumn;
  if (cmp !== 0) {
    return cmp;
  }

  return strcmp(mappingA.name, mappingB.name);
}
exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;

function strcmp(aStr1, aStr2) {
  if (aStr1 === aStr2) {
    return 0;
  }

  if (aStr1 === null) {
    return 1; // aStr2 !== null
  }

  if (aStr2 === null) {
    return -1; // aStr1 !== null
  }

  if (aStr1 > aStr2) {
    return 1;
  }

  return -1;
}

/**
 * Comparator between two mappings with inflated source and name strings where
 * the generated positions are compared.
 */
function compareByGeneratedPositionsInflated(mappingA, mappingB) {
  var cmp = mappingA.generatedLine - mappingB.generatedLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = strcmp(mappingA.source, mappingB.source);
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalLine - mappingB.originalLine;
  if (cmp !== 0) {
    return cmp;
  }

  cmp = mappingA.originalColumn - mappingB.originalColumn;
  if (cmp !== 0) {
    return cmp;
  }

  return strcmp(mappingA.name, mappingB.name);
}
exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;

/**
 * Strip any JSON XSSI avoidance prefix from the string (as documented
 * in the source maps specification), and then parse the string as
 * JSON.
 */
function parseSourceMapInput(str) {
  return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
}
exports.parseSourceMapInput = parseSourceMapInput;

/**
 * Compute the URL of a source given the the source root, the source's
 * URL, and the source map's URL.
 */
function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
  sourceURL = sourceURL || '';

  if (sourceRoot) {
    // This follows what Chrome does.
    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
      sourceRoot += '/';
    }
    // The spec says:
    //   Line 4: An optional source root, useful for relocating source
    //   files on a server or removing repeated values in the
    //   â€œsourcesâ€� entry.  This value is prepended to the individual
    //   entries in the â€œsourceâ€� field.
    sourceURL = sourceRoot + sourceURL;
  }

  // Historically, SourceMapConsumer did not take the sourceMapURL as
  // a parameter.  This mode is still somewhat supported, which is why
  // this code block is conditional.  However, it's preferable to pass
  // the source map URL to SourceMapConsumer, so that this function
  // can implement the source URL resolution algorithm as outlined in
  // the spec.  This block is basically the equivalent of:
  //    new URL(sourceURL, sourceMapURL).toString()
  // ... except it avoids using URL, which wasn't available in the
  // older releases of node still supported by this library.
  //
  // The spec says:
  //   If the sources are not absolute URLs after prepending of the
  //   â€œsourceRootâ€�, the sources are resolved relative to the
  //   SourceMap (like resolving script src in a html document).
  if (sourceMapURL) {
    var parsed = urlParse(sourceMapURL);
    if (!parsed) {
      throw new Error("sourceMapURL could not be parsed");
    }
    if (parsed.path) {
      // Strip the last path component, but keep the "/".
      var index = parsed.path.lastIndexOf('/');
      if (index >= 0) {
        parsed.path = parsed.path.substring(0, index + 1);
      }
    }
    sourceURL = join(urlGenerate(parsed), sourceURL);
  }

  return normalize(sourceURL);
}
exports.computeSourceURL = computeSourceURL;
(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define([], factory);
	else if(typeof exports === 'object')
		exports["sourceMap"] = factory();
	else
		root["sourceMap"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;
/******/
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

	/*
	 * Copyright 2009-2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE.txt or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
	exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;
	exports.SourceNode = __webpack_require__(10).SourceNode;


/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	var base64VLQ = __webpack_require__(2);
	var util = __webpack_require__(4);
	var ArraySet = __webpack_require__(5).ArraySet;
	var MappingList = __webpack_require__(6).MappingList;
	
	/**
	 * An instance of the SourceMapGenerator represents a source map which is
	 * being built incrementally. You may pass an object with the following
	 * properties:
	 *
	 *   - file: The filename of the generated source.
	 *   - sourceRoot: A root for all relative URLs in this source map.
	 */
	function SourceMapGenerator(aArgs) {
	  if (!aArgs) {
	    aArgs = {};
	  }
	  this._file = util.getArg(aArgs, 'file', null);
	  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
	  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
	  this._sources = new ArraySet();
	  this._names = new ArraySet();
	  this._mappings = new MappingList();
	  this._sourcesContents = null;
	}
	
	SourceMapGenerator.prototype._version = 3;
	
	/**
	 * Creates a new SourceMapGenerator based on a SourceMapConsumer
	 *
	 * @param aSourceMapConsumer The SourceMap.
	 */
	SourceMapGenerator.fromSourceMap =
	  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
	    var sourceRoot = aSourceMapConsumer.sourceRoot;
	    var generator = new SourceMapGenerator({
	      file: aSourceMapConsumer.file,
	      sourceRoot: sourceRoot
	    });
	    aSourceMapConsumer.eachMapping(function (mapping) {
	      var newMapping = {
	        generated: {
	          line: mapping.generatedLine,
	          column: mapping.generatedColumn
	        }
	      };
	
	      if (mapping.source != null) {
	        newMapping.source = mapping.source;
	        if (sourceRoot != null) {
	          newMapping.source = util.relative(sourceRoot, newMapping.source);
	        }
	
	        newMapping.original = {
	          line: mapping.originalLine,
	          column: mapping.originalColumn
	        };
	
	        if (mapping.name != null) {
	          newMapping.name = mapping.name;
	        }
	      }
	
	      generator.addMapping(newMapping);
	    });
	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
	      var sourceRelative = sourceFile;
	      if (sourceRoot !== null) {
	        sourceRelative = util.relative(sourceRoot, sourceFile);
	      }
	
	      if (!generator._sources.has(sourceRelative)) {
	        generator._sources.add(sourceRelative);
	      }
	
	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
	      if (content != null) {
	        generator.setSourceContent(sourceFile, content);
	      }
	    });
	    return generator;
	  };
	
	/**
	 * Add a single mapping from original source line and column to the generated
	 * source's line and column for this source map being created. The mapping
	 * object should have the following properties:
	 *
	 *   - generated: An object with the generated line and column positions.
	 *   - original: An object with the original line and column positions.
	 *   - source: The original source file (relative to the sourceRoot).
	 *   - name: An optional original token name for this mapping.
	 */
	SourceMapGenerator.prototype.addMapping =
	  function SourceMapGenerator_addMapping(aArgs) {
	    var generated = util.getArg(aArgs, 'generated');
	    var original = util.getArg(aArgs, 'original', null);
	    var source = util.getArg(aArgs, 'source', null);
	    var name = util.getArg(aArgs, 'name', null);
	
	    if (!this._skipValidation) {
	      this._validateMapping(generated, original, source, name);
	    }
	
	    if (source != null) {
	      source = String(source);
	      if (!this._sources.has(source)) {
	        this._sources.add(source);
	      }
	    }
	
	    if (name != null) {
	      name = String(name);
	      if (!this._names.has(name)) {
	        this._names.add(name);
	      }
	    }
	
	    this._mappings.add({
	      generatedLine: generated.line,
	      generatedColumn: generated.column,
	      originalLine: original != null && original.line,
	      originalColumn: original != null && original.column,
	      source: source,
	      name: name
	    });
	  };
	
	/**
	 * Set the source content for a source file.
	 */
	SourceMapGenerator.prototype.setSourceContent =
	  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
	    var source = aSourceFile;
	    if (this._sourceRoot != null) {
	      source = util.relative(this._sourceRoot, source);
	    }
	
	    if (aSourceContent != null) {
	      // Add the source content to the _sourcesContents map.
	      // Create a new _sourcesContents map if the property is null.
	      if (!this._sourcesContents) {
	        this._sourcesContents = Object.create(null);
	      }
	      this._sourcesContents[util.toSetString(source)] = aSourceContent;
	    } else if (this._sourcesContents) {
	      // Remove the source file from the _sourcesContents map.
	      // If the _sourcesContents map is empty, set the property to null.
	      delete this._sourcesContents[util.toSetString(source)];
	      if (Object.keys(this._sourcesContents).length === 0) {
	        this._sourcesContents = null;
	      }
	    }
	  };
	
	/**
	 * Applies the mappings of a sub-source-map for a specific source file to the
	 * source map being generated. Each mapping to the supplied source file is
	 * rewritten using the supplied source map. Note: The resolution for the
	 * resulting mappings is the minimium of this map and the supplied map.
	 *
	 * @param aSourceMapConsumer The source map to be applied.
	 * @param aSourceFile Optional. The filename of the source file.
	 *        If omitted, SourceMapConsumer's file property will be used.
	 * @param aSourceMapPath Optional. The dirname of the path to the source map
	 *        to be applied. If relative, it is relative to the SourceMapConsumer.
	 *        This parameter is needed when the two source maps aren't in the same
	 *        directory, and the source map to be applied contains relative source
	 *        paths. If so, those relative source paths need to be rewritten
	 *        relative to the SourceMapGenerator.
	 */
	SourceMapGenerator.prototype.applySourceMap =
	  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
	    var sourceFile = aSourceFile;
	    // If aSourceFile is omitted, we will use the file property of the SourceMap
	    if (aSourceFile == null) {
	      if (aSourceMapConsumer.file == null) {
	        throw new Error(
	          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
	          'or the source map\'s "file" property. Both were omitted.'
	        );
	      }
	      sourceFile = aSourceMapConsumer.file;
	    }
	    var sourceRoot = this._sourceRoot;
	    // Make "sourceFile" relative if an absolute Url is passed.
	    if (sourceRoot != null) {
	      sourceFile = util.relative(sourceRoot, sourceFile);
	    }
	    // Applying the SourceMap can add and remove items from the sources and
	    // the names array.
	    var newSources = new ArraySet();
	    var newNames = new ArraySet();
	
	    // Find mappings for the "sourceFile"
	    this._mappings.unsortedForEach(function (mapping) {
	      if (mapping.source === sourceFile && mapping.originalLine != null) {
	        // Check if it can be mapped by the source map, then update the mapping.
	        var original = aSourceMapConsumer.originalPositionFor({
	          line: mapping.originalLine,
	          column: mapping.originalColumn
	        });
	        if (original.source != null) {
	          // Copy mapping
	          mapping.source = original.source;
	          if (aSourceMapPath != null) {
	            mapping.source = util.join(aSourceMapPath, mapping.source)
	          }
	          if (sourceRoot != null) {
	            mapping.source = util.relative(sourceRoot, mapping.source);
	          }
	          mapping.originalLine = original.line;
	          mapping.originalColumn = original.column;
	          if (original.name != null) {
	            mapping.name = original.name;
	          }
	        }
	      }
	
	      var source = mapping.source;
	      if (source != null && !newSources.has(source)) {
	        newSources.add(source);
	      }
	
	      var name = mapping.name;
	      if (name != null && !newNames.has(name)) {
	        newNames.add(name);
	      }
	
	    }, this);
	    this._sources = newSources;
	    this._names = newNames;
	
	    // Copy sourcesContents of applied map.
	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
	      if (content != null) {
	        if (aSourceMapPath != null) {
	          sourceFile = util.join(aSourceMapPath, sourceFile);
	        }
	        if (sourceRoot != null) {
	          sourceFile = util.relative(sourceRoot, sourceFile);
	        }
	        this.setSourceContent(sourceFile, content);
	      }
	    }, this);
	  };
	
	/**
	 * A mapping can have one of the three levels of data:
	 *
	 *   1. Just the generated position.
	 *   2. The Generated position, original position, and original source.
	 *   3. Generated and original position, original source, as well as a name
	 *      token.
	 *
	 * To maintain consistency, we validate that any new mapping being added falls
	 * in to one of these categories.
	 */
	SourceMapGenerator.prototype._validateMapping =
	  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
	                                              aName) {
	    // When aOriginal is truthy but has empty values for .line and .column,
	    // it is most likely a programmer error. In this case we throw a very
	    // specific error message to try to guide them the right way.
	    // For example: https://github.com/Polymer/polymer-bundler/pull/519
	    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
	        throw new Error(
	            'original.line and original.column are not numbers -- you probably meant to omit ' +
	            'the original mapping entirely and only map the generated position. If so, pass ' +
	            'null for the original mapping instead of an object with empty or null values.'
	        );
	    }
	
	    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
	        && aGenerated.line > 0 && aGenerated.column >= 0
	        && !aOriginal && !aSource && !aName) {
	      // Case 1.
	      return;
	    }
	    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
	             && aOriginal && 'line' in aOriginal && 'column' in aOriginal
	             && aGenerated.line > 0 && aGenerated.column >= 0
	             && aOriginal.line > 0 && aOriginal.column >= 0
	             && aSource) {
	      // Cases 2 and 3.
	      return;
	    }
	    else {
	      throw new Error('Invalid mapping: ' + JSON.stringify({
	        generated: aGenerated,
	        source: aSource,
	        original: aOriginal,
	        name: aName
	      }));
	    }
	  };
	
	/**
	 * Serialize the accumulated mappings in to the stream of base 64 VLQs
	 * specified by the source map format.
	 */
	SourceMapGenerator.prototype._serializeMappings =
	  function SourceMapGenerator_serializeMappings() {
	    var previousGeneratedColumn = 0;
	    var previousGeneratedLine = 1;
	    var previousOriginalColumn = 0;
	    var previousOriginalLine = 0;
	    var previousName = 0;
	    var previousSource = 0;
	    var result = '';
	    var next;
	    var mapping;
	    var nameIdx;
	    var sourceIdx;
	
	    var mappings = this._mappings.toArray();
	    for (var i = 0, len = mappings.length; i < len; i++) {
	      mapping = mappings[i];
	      next = ''
	
	      if (mapping.generatedLine !== previousGeneratedLine) {
	        previousGeneratedColumn = 0;
	        while (mapping.generatedLine !== previousGeneratedLine) {
	          next += ';';
	          previousGeneratedLine++;
	        }
	      }
	      else {
	        if (i > 0) {
	          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
	            continue;
	          }
	          next += ',';
	        }
	      }
	
	      next += base64VLQ.encode(mapping.generatedColumn
	                                 - previousGeneratedColumn);
	      previousGeneratedColumn = mapping.generatedColumn;
	
	      if (mapping.source != null) {
	        sourceIdx = this._sources.indexOf(mapping.source);
	        next += base64VLQ.encode(sourceIdx - previousSource);
	        previousSource = sourceIdx;
	
	        // lines are stored 0-based in SourceMap spec version 3
	        next += base64VLQ.encode(mapping.originalLine - 1
	                                   - previousOriginalLine);
	        previousOriginalLine = mapping.originalLine - 1;
	
	        next += base64VLQ.encode(mapping.originalColumn
	                                   - previousOriginalColumn);
	        previousOriginalColumn = mapping.originalColumn;
	
	        if (mapping.name != null) {
	          nameIdx = this._names.indexOf(mapping.name);
	          next += base64VLQ.encode(nameIdx - previousName);
	          previousName = nameIdx;
	        }
	      }
	
	      result += next;
	    }
	
	    return result;
	  };
	
	SourceMapGenerator.prototype._generateSourcesContent =
	  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
	    return aSources.map(function (source) {
	      if (!this._sourcesContents) {
	        return null;
	      }
	      if (aSourceRoot != null) {
	        source = util.relative(aSourceRoot, source);
	      }
	      var key = util.toSetString(source);
	      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
	        ? this._sourcesContents[key]
	        : null;
	    }, this);
	  };
	
	/**
	 * Externalize the source map.
	 */
	SourceMapGenerator.prototype.toJSON =
	  function SourceMapGenerator_toJSON() {
	    var map = {
	      version: this._version,
	      sources: this._sources.toArray(),
	      names: this._names.toArray(),
	      mappings: this._serializeMappings()
	    };
	    if (this._file != null) {
	      map.file = this._file;
	    }
	    if (this._sourceRoot != null) {
	      map.sourceRoot = this._sourceRoot;
	    }
	    if (this._sourcesContents) {
	      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
	    }
	
	    return map;
	  };
	
	/**
	 * Render the source map being generated to a string.
	 */
	SourceMapGenerator.prototype.toString =
	  function SourceMapGenerator_toString() {
	    return JSON.stringify(this.toJSON());
	  };
	
	exports.SourceMapGenerator = SourceMapGenerator;


/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 *
	 * Based on the Base 64 VLQ implementation in Closure Compiler:
	 * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
	 *
	 * Copyright 2011 The Closure Compiler Authors. All rights reserved.
	 * Redistribution and use in source and binary forms, with or without
	 * modification, are permitted provided that the following conditions are
	 * met:
	 *
	 *  * Redistributions of source code must retain the above copyright
	 *    notice, this list of conditions and the following disclaimer.
	 *  * Redistributions in binary form must reproduce the above
	 *    copyright notice, this list of conditions and the following
	 *    disclaimer in the documentation and/or other materials provided
	 *    with the distribution.
	 *  * Neither the name of Google Inc. nor the names of its
	 *    contributors may be used to endorse or promote products derived
	 *    from this software without specific prior written permission.
	 *
	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
	 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
	 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
	 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
	 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
	 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
	 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
	 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
	 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
	 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
	 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
	 */
	
	var base64 = __webpack_require__(3);
	
	// A single base 64 digit can contain 6 bits of data. For the base 64 variable
	// length quantities we use in the source map spec, the first bit is the sign,
	// the next four bits are the actual value, and the 6th bit is the
	// continuation bit. The continuation bit tells us whether there are more
	// digits in this value following this digit.
	//
	//   Continuation
	//   |    Sign
	//   |    |
	//   V    V
	//   101011
	
	var VLQ_BASE_SHIFT = 5;
	
	// binary: 100000
	var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
	
	// binary: 011111
	var VLQ_BASE_MASK = VLQ_BASE - 1;
	
	// binary: 100000
	var VLQ_CONTINUATION_BIT = VLQ_BASE;
	
	/**
	 * Converts from a two-complement value to a value where the sign bit is
	 * placed in the least significant bit.  For example, as decimals:
	 *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
	 *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
	 */
	function toVLQSigned(aValue) {
	  return aValue < 0
	    ? ((-aValue) << 1) + 1
	    : (aValue << 1) + 0;
	}
	
	/**
	 * Converts to a two-complement value from a value where the sign bit is
	 * placed in the least significant bit.  For example, as decimals:
	 *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1
	 *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2
	 */
	function fromVLQSigned(aValue) {
	  var isNegative = (aValue & 1) === 1;
	  var shifted = aValue >> 1;
	  return isNegative
	    ? -shifted
	    : shifted;
	}
	
	/**
	 * Returns the base 64 VLQ encoded value.
	 */
	exports.encode = function base64VLQ_encode(aValue) {
	  var encoded = "";
	  var digit;
	
	  var vlq = toVLQSigned(aValue);
	
	  do {
	    digit = vlq & VLQ_BASE_MASK;
	    vlq >>>= VLQ_BASE_SHIFT;
	    if (vlq > 0) {
	      // There are still more digits in this value, so we must make sure the
	      // continuation bit is marked.
	      digit |= VLQ_CONTINUATION_BIT;
	    }
	    encoded += base64.encode(digit);
	  } while (vlq > 0);
	
	  return encoded;
	};
	
	/**
	 * Decodes the next base 64 VLQ value from the given string and returns the
	 * value and the rest of the string via the out parameter.
	 */
	exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
	  var strLen = aStr.length;
	  var result = 0;
	  var shift = 0;
	  var continuation, digit;
	
	  do {
	    if (aIndex >= strLen) {
	      throw new Error("Expected more digits in base 64 VLQ value.");
	    }
	
	    digit = base64.decode(aStr.charCodeAt(aIndex++));
	    if (digit === -1) {
	      throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
	    }
	
	    continuation = !!(digit & VLQ_CONTINUATION_BIT);
	    digit &= VLQ_BASE_MASK;
	    result = result + (digit << shift);
	    shift += VLQ_BASE_SHIFT;
	  } while (continuation);
	
	  aOutParam.value = fromVLQSigned(result);
	  aOutParam.rest = aIndex;
	};


/***/ }),
/* 3 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
	
	/**
	 * Encode an integer in the range of 0 to 63 to a single base 64 digit.
	 */
	exports.encode = function (number) {
	  if (0 <= number && number < intToCharMap.length) {
	    return intToCharMap[number];
	  }
	  throw new TypeError("Must be between 0 and 63: " + number);
	};
	
	/**
	 * Decode a single base 64 character code digit to an integer. Returns -1 on
	 * failure.
	 */
	exports.decode = function (charCode) {
	  var bigA = 65;     // 'A'
	  var bigZ = 90;     // 'Z'
	
	  var littleA = 97;  // 'a'
	  var littleZ = 122; // 'z'
	
	  var zero = 48;     // '0'
	  var nine = 57;     // '9'
	
	  var plus = 43;     // '+'
	  var slash = 47;    // '/'
	
	  var littleOffset = 26;
	  var numberOffset = 52;
	
	  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
	  if (bigA <= charCode && charCode <= bigZ) {
	    return (charCode - bigA);
	  }
	
	  // 26 - 51: abcdefghijklmnopqrstuvwxyz
	  if (littleA <= charCode && charCode <= littleZ) {
	    return (charCode - littleA + littleOffset);
	  }
	
	  // 52 - 61: 0123456789
	  if (zero <= charCode && charCode <= nine) {
	    return (charCode - zero + numberOffset);
	  }
	
	  // 62: +
	  if (charCode == plus) {
	    return 62;
	  }
	
	  // 63: /
	  if (charCode == slash) {
	    return 63;
	  }
	
	  // Invalid base64 digit.
	  return -1;
	};


/***/ }),
/* 4 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	/**
	 * This is a helper function for getting values from parameter/options
	 * objects.
	 *
	 * @param args The object we are extracting values from
	 * @param name The name of the property we are getting.
	 * @param defaultValue An optional value to return if the property is missing
	 * from the object. If this is not specified and the property is missing, an
	 * error will be thrown.
	 */
	function getArg(aArgs, aName, aDefaultValue) {
	  if (aName in aArgs) {
	    return aArgs[aName];
	  } else if (arguments.length === 3) {
	    return aDefaultValue;
	  } else {
	    throw new Error('"' + aName + '" is a required argument.');
	  }
	}
	exports.getArg = getArg;
	
	var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
	var dataUrlRegexp = /^data:.+\,.+$/;
	
	function urlParse(aUrl) {
	  var match = aUrl.match(urlRegexp);
	  if (!match) {
	    return null;
	  }
	  return {
	    scheme: match[1],
	    auth: match[2],
	    host: match[3],
	    port: match[4],
	    path: match[5]
	  };
	}
	exports.urlParse = urlParse;
	
	function urlGenerate(aParsedUrl) {
	  var url = '';
	  if (aParsedUrl.scheme) {
	    url += aParsedUrl.scheme + ':';
	  }
	  url += '//';
	  if (aParsedUrl.auth) {
	    url += aParsedUrl.auth + '@';
	  }
	  if (aParsedUrl.host) {
	    url += aParsedUrl.host;
	  }
	  if (aParsedUrl.port) {
	    url += ":" + aParsedUrl.port
	  }
	  if (aParsedUrl.path) {
	    url += aParsedUrl.path;
	  }
	  return url;
	}
	exports.urlGenerate = urlGenerate;
	
	/**
	 * Normalizes a path, or the path portion of a URL:
	 *
	 * - Replaces consecutive slashes with one slash.
	 * - Removes unnecessary '.' parts.
	 * - Removes unnecessary '<dir>/..' parts.
	 *
	 * Based on code in the Node.js 'path' core module.
	 *
	 * @param aPath The path or url to normalize.
	 */
	function normalize(aPath) {
	  var path = aPath;
	  var url = urlParse(aPath);
	  if (url) {
	    if (!url.path) {
	      return aPath;
	    }
	    path = url.path;
	  }
	  var isAbsolute = exports.isAbsolute(path);
	
	  var parts = path.split(/\/+/);
	  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
	    part = parts[i];
	    if (part === '.') {
	      parts.splice(i, 1);
	    } else if (part === '..') {
	      up++;
	    } else if (up > 0) {
	      if (part === '') {
	        // The first part is blank if the path is absolute. Trying to go
	        // above the root is a no-op. Therefore we can remove all '..' parts
	        // directly after the root.
	        parts.splice(i + 1, up);
	        up = 0;
	      } else {
	        parts.splice(i, 2);
	        up--;
	      }
	    }
	  }
	  path = parts.join('/');
	
	  if (path === '') {
	    path = isAbsolute ? '/' : '.';
	  }
	
	  if (url) {
	    url.path = path;
	    return urlGenerate(url);
	  }
	  return path;
	}
	exports.normalize = normalize;
	
	/**
	 * Joins two paths/URLs.
	 *
	 * @param aRoot The root path or URL.
	 * @param aPath The path or URL to be joined with the root.
	 *
	 * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
	 *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended
	 *   first.
	 * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
	 *   is updated with the result and aRoot is returned. Otherwise the result
	 *   is returned.
	 *   - If aPath is absolute, the result is aPath.
	 *   - Otherwise the two paths are joined with a slash.
	 * - Joining for example 'http://' and 'www.example.com' is also supported.
	 */
	function join(aRoot, aPath) {
	  if (aRoot === "") {
	    aRoot = ".";
	  }
	  if (aPath === "") {
	    aPath = ".";
	  }
	  var aPathUrl = urlParse(aPath);
	  var aRootUrl = urlParse(aRoot);
	  if (aRootUrl) {
	    aRoot = aRootUrl.path || '/';
	  }
	
	  // `join(foo, '//www.example.org')`
	  if (aPathUrl && !aPathUrl.scheme) {
	    if (aRootUrl) {
	      aPathUrl.scheme = aRootUrl.scheme;
	    }
	    return urlGenerate(aPathUrl);
	  }
	
	  if (aPathUrl || aPath.match(dataUrlRegexp)) {
	    return aPath;
	  }
	
	  // `join('http://', 'www.example.com')`
	  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
	    aRootUrl.host = aPath;
	    return urlGenerate(aRootUrl);
	  }
	
	  var joined = aPath.charAt(0) === '/'
	    ? aPath
	    : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
	
	  if (aRootUrl) {
	    aRootUrl.path = joined;
	    return urlGenerate(aRootUrl);
	  }
	  return joined;
	}
	exports.join = join;
	
	exports.isAbsolute = function (aPath) {
	  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
	};
	
	/**
	 * Make a path relative to a URL or another path.
	 *
	 * @param aRoot The root path or URL.
	 * @param aPath The path or URL to be made relative to aRoot.
	 */
	function relative(aRoot, aPath) {
	  if (aRoot === "") {
	    aRoot = ".";
	  }
	
	  aRoot = aRoot.replace(/\/$/, '');
	
	  // It is possible for the path to be above the root. In this case, simply
	  // checking whether the root is a prefix of the path won't work. Instead, we
	  // need to remove components from the root one by one, until either we find
	  // a prefix that fits, or we run out of components to remove.
	  var level = 0;
	  while (aPath.indexOf(aRoot + '/') !== 0) {
	    var index = aRoot.lastIndexOf("/");
	    if (index < 0) {
	      return aPath;
	    }
	
	    // If the only part of the root that is left is the scheme (i.e. http://,
	    // file:///, etc.), one or more slashes (/), or simply nothing at all, we
	    // have exhausted all components, so the path is not relative to the root.
	    aRoot = aRoot.slice(0, index);
	    if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
	      return aPath;
	    }
	
	    ++level;
	  }
	
	  // Make sure we add a "../" for each component we removed from the root.
	  return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
	}
	exports.relative = relative;
	
	var supportsNullProto = (function () {
	  var obj = Object.create(null);
	  return !('__proto__' in obj);
	}());
	
	function identity (s) {
	  return s;
	}
	
	/**
	 * Because behavior goes wacky when you set `__proto__` on objects, we
	 * have to prefix all the strings in our set with an arbitrary character.
	 *
	 * See https://github.com/mozilla/source-map/pull/31 and
	 * https://github.com/mozilla/source-map/issues/30
	 *
	 * @param String aStr
	 */
	function toSetString(aStr) {
	  if (isProtoString(aStr)) {
	    return '$' + aStr;
	  }
	
	  return aStr;
	}
	exports.toSetString = supportsNullProto ? identity : toSetString;
	
	function fromSetString(aStr) {
	  if (isProtoString(aStr)) {
	    return aStr.slice(1);
	  }
	
	  return aStr;
	}
	exports.fromSetString = supportsNullProto ? identity : fromSetString;
	
	function isProtoString(s) {
	  if (!s) {
	    return false;
	  }
	
	  var length = s.length;
	
	  if (length < 9 /* "__proto__".length */) {
	    return false;
	  }
	
	  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||
	      s.charCodeAt(length - 2) !== 95  /* '_' */ ||
	      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
	      s.charCodeAt(length - 4) !== 116 /* 't' */ ||
	      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
	      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
	      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
	      s.charCodeAt(length - 8) !== 95  /* '_' */ ||
	      s.charCodeAt(length - 9) !== 95  /* '_' */) {
	    return false;
	  }
	
	  for (var i = length - 10; i >= 0; i--) {
	    if (s.charCodeAt(i) !== 36 /* '$' */) {
	      return false;
	    }
	  }
	
	  return true;
	}
	
	/**
	 * Comparator between two mappings where the original positions are compared.
	 *
	 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
	 * mappings with the same original source/line/column, but different generated
	 * line and column the same. Useful when searching for a mapping with a
	 * stubbed out mapping.
	 */
	function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
	  var cmp = strcmp(mappingA.source, mappingB.source);
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.originalLine - mappingB.originalLine;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.originalColumn - mappingB.originalColumn;
	  if (cmp !== 0 || onlyCompareOriginal) {
	    return cmp;
	  }
	
	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.generatedLine - mappingB.generatedLine;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  return strcmp(mappingA.name, mappingB.name);
	}
	exports.compareByOriginalPositions = compareByOriginalPositions;
	
	/**
	 * Comparator between two mappings with deflated source and name indices where
	 * the generated positions are compared.
	 *
	 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
	 * mappings with the same generated line and column, but different
	 * source/name/original line and column the same. Useful when searching for a
	 * mapping with a stubbed out mapping.
	 */
	function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
	  var cmp = mappingA.generatedLine - mappingB.generatedLine;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
	  if (cmp !== 0 || onlyCompareGenerated) {
	    return cmp;
	  }
	
	  cmp = strcmp(mappingA.source, mappingB.source);
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.originalLine - mappingB.originalLine;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.originalColumn - mappingB.originalColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  return strcmp(mappingA.name, mappingB.name);
	}
	exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
	
	function strcmp(aStr1, aStr2) {
	  if (aStr1 === aStr2) {
	    return 0;
	  }
	
	  if (aStr1 === null) {
	    return 1; // aStr2 !== null
	  }
	
	  if (aStr2 === null) {
	    return -1; // aStr1 !== null
	  }
	
	  if (aStr1 > aStr2) {
	    return 1;
	  }
	
	  return -1;
	}
	
	/**
	 * Comparator between two mappings with inflated source and name strings where
	 * the generated positions are compared.
	 */
	function compareByGeneratedPositionsInflated(mappingA, mappingB) {
	  var cmp = mappingA.generatedLine - mappingB.generatedLine;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = strcmp(mappingA.source, mappingB.source);
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.originalLine - mappingB.originalLine;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  cmp = mappingA.originalColumn - mappingB.originalColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }
	
	  return strcmp(mappingA.name, mappingB.name);
	}
	exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
	
	/**
	 * Strip any JSON XSSI avoidance prefix from the string (as documented
	 * in the source maps specification), and then parse the string as
	 * JSON.
	 */
	function parseSourceMapInput(str) {
	  return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
	}
	exports.parseSourceMapInput = parseSourceMapInput;
	
	/**
	 * Compute the URL of a source given the the source root, the source's
	 * URL, and the source map's URL.
	 */
	function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
	  sourceURL = sourceURL || '';
	
	  if (sourceRoot) {
	    // This follows what Chrome does.
	    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
	      sourceRoot += '/';
	    }
	    // The spec says:
	    //   Line 4: An optional source root, useful for relocating source
	    //   files on a server or removing repeated values in the
	    //   â€œsourcesâ€� entry.  This value is prepended to the individual
	    //   entries in the â€œsourceâ€� field.
	    sourceURL = sourceRoot + sourceURL;
	  }
	
	  // Historically, SourceMapConsumer did not take the sourceMapURL as
	  // a parameter.  This mode is still somewhat supported, which is why
	  // this code block is conditional.  However, it's preferable to pass
	  // the source map URL to SourceMapConsumer, so that this function
	  // can implement the source URL resolution algorithm as outlined in
	  // the spec.  This block is basically the equivalent of:
	  //    new URL(sourceURL, sourceMapURL).toString()
	  // ... except it avoids using URL, which wasn't available in the
	  // older releases of node still supported by this library.
	  //
	  // The spec says:
	  //   If the sources are not absolute URLs after prepending of the
	  //   â€œsourceRootâ€�, the sources are resolved relative to the
	  //   SourceMap (like resolving script src in a html document).
	  if (sourceMapURL) {
	    var parsed = urlParse(sourceMapURL);
	    if (!parsed) {
	      throw new Error("sourceMapURL could not be parsed");
	    }
	    if (parsed.path) {
	      // Strip the last path component, but keep the "/".
	      var index = parsed.path.lastIndexOf('/');
	      if (index >= 0) {
	        parsed.path = parsed.path.substring(0, index + 1);
	      }
	    }
	    sourceURL = join(urlGenerate(parsed), sourceURL);
	  }
	
	  return normalize(sourceURL);
	}
	exports.computeSourceURL = computeSourceURL;


/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	var util = __webpack_require__(4);
	var has = Object.prototype.hasOwnProperty;
	var hasNativeMap = typeof Map !== "undefined";
	
	/**
	 * A data structure which is a combination of an array and a set. Adding a new
	 * member is O(1), testing for membership is O(1), and finding the index of an
	 * element is O(1). Removing elements from the set is not supported. Only
	 * strings are supported for membership.
	 */
	function ArraySet() {
	  this._array = [];
	  this._set = hasNativeMap ? new Map() : Object.create(null);
	}
	
	/**
	 * Static method for creating ArraySet instances from an existing array.
	 */
	ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
	  var set = new ArraySet();
	  for (var i = 0, len = aArray.length; i < len; i++) {
	    set.add(aArray[i], aAllowDuplicates);
	  }
	  return set;
	};
	
	/**
	 * Return how many unique items are in this ArraySet. If duplicates have been
	 * added, than those do not count towards the size.
	 *
	 * @returns Number
	 */
	ArraySet.prototype.size = function ArraySet_size() {
	  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
	};
	
	/**
	 * Add the given string to this set.
	 *
	 * @param String aStr
	 */
	ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
	  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
	  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
	  var idx = this._array.length;
	  if (!isDuplicate || aAllowDuplicates) {
	    this._array.push(aStr);
	  }
	  if (!isDuplicate) {
	    if (hasNativeMap) {
	      this._set.set(aStr, idx);
	    } else {
	      this._set[sStr] = idx;
	    }
	  }
	};
	
	/**
	 * Is the given string a member of this set?
	 *
	 * @param String aStr
	 */
	ArraySet.prototype.has = function ArraySet_has(aStr) {
	  if (hasNativeMap) {
	    return this._set.has(aStr);
	  } else {
	    var sStr = util.toSetString(aStr);
	    return has.call(this._set, sStr);
	  }
	};
	
	/**
	 * What is the index of the given string in the array?
	 *
	 * @param String aStr
	 */
	ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
	  if (hasNativeMap) {
	    var idx = this._set.get(aStr);
	    if (idx >= 0) {
	        return idx;
	    }
	  } else {
	    var sStr = util.toSetString(aStr);
	    if (has.call(this._set, sStr)) {
	      return this._set[sStr];
	    }
	  }
	
	  throw new Error('"' + aStr + '" is not in the set.');
	};
	
	/**
	 * What is the element at the given index?
	 *
	 * @param Number aIdx
	 */
	ArraySet.prototype.at = function ArraySet_at(aIdx) {
	  if (aIdx >= 0 && aIdx < this._array.length) {
	    return this._array[aIdx];
	  }
	  throw new Error('No element indexed by ' + aIdx);
	};
	
	/**
	 * Returns the array representation of this set (which has the proper indices
	 * indicated by indexOf). Note that this is a copy of the internal array used
	 * for storing the members so that no one can mess with internal state.
	 */
	ArraySet.prototype.toArray = function ArraySet_toArray() {
	  return this._array.slice();
	};
	
	exports.ArraySet = ArraySet;


/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2014 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	var util = __webpack_require__(4);
	
	/**
	 * Determine whether mappingB is after mappingA with respect to generated
	 * position.
	 */
	function generatedPositionAfter(mappingA, mappingB) {
	  // Optimized for most common case
	  var lineA = mappingA.generatedLine;
	  var lineB = mappingB.generatedLine;
	  var columnA = mappingA.generatedColumn;
	  var columnB = mappingB.generatedColumn;
	  return lineB > lineA || lineB == lineA && columnB >= columnA ||
	         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
	}
	
	/**
	 * A data structure to provide a sorted view of accumulated mappings in a
	 * performance conscious manner. It trades a neglibable overhead in general
	 * case for a large speedup in case of mappings being added in order.
	 */
	function MappingList() {
	  this._array = [];
	  this._sorted = true;
	  // Serves as infimum
	  this._last = {generatedLine: -1, generatedColumn: 0};
	}
	
	/**
	 * Iterate through internal items. This method takes the same arguments that
	 * `Array.prototype.forEach` takes.
	 *
	 * NOTE: The order of the mappings is NOT guaranteed.
	 */
	MappingList.prototype.unsortedForEach =
	  function MappingList_forEach(aCallback, aThisArg) {
	    this._array.forEach(aCallback, aThisArg);
	  };
	
	/**
	 * Add the given source mapping.
	 *
	 * @param Object aMapping
	 */
	MappingList.prototype.add = function MappingList_add(aMapping) {
	  if (generatedPositionAfter(this._last, aMapping)) {
	    this._last = aMapping;
	    this._array.push(aMapping);
	  } else {
	    this._sorted = false;
	    this._array.push(aMapping);
	  }
	};
	
	/**
	 * Returns the flat, sorted array of mappings. The mappings are sorted by
	 * generated position.
	 *
	 * WARNING: This method returns internal data without copying, for
	 * performance. The return value must NOT be mutated, and should be treated as
	 * an immutable borrow. If you want to take ownership, you must make your own
	 * copy.
	 */
	MappingList.prototype.toArray = function MappingList_toArray() {
	  if (!this._sorted) {
	    this._array.sort(util.compareByGeneratedPositionsInflated);
	    this._sorted = true;
	  }
	  return this._array;
	};
	
	exports.MappingList = MappingList;


/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	var util = __webpack_require__(4);
	var binarySearch = __webpack_require__(8);
	var ArraySet = __webpack_require__(5).ArraySet;
	var base64VLQ = __webpack_require__(2);
	var quickSort = __webpack_require__(9).quickSort;
	
	function SourceMapConsumer(aSourceMap, aSourceMapURL) {
	  var sourceMap = aSourceMap;
	  if (typeof aSourceMap === 'string') {
	    sourceMap = util.parseSourceMapInput(aSourceMap);
	  }
	
	  return sourceMap.sections != null
	    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
	    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
	}
	
	SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
	  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
	}
	
	/**
	 * The version of the source mapping spec that we are consuming.
	 */
	SourceMapConsumer.prototype._version = 3;
	
	// `__generatedMappings` and `__originalMappings` are arrays that hold the
	// parsed mapping coordinates from the source map's "mappings" attribute. They
	// are lazily instantiated, accessed via the `_generatedMappings` and
	// `_originalMappings` getters respectively, and we only parse the mappings
	// and create these arrays once queried for a source location. We jump through
	// these hoops because there can be many thousands of mappings, and parsing
	// them is expensive, so we only want to do it if we must.
	//
	// Each object in the arrays is of the form:
	//
	//     {
	//       generatedLine: The line number in the generated code,
	//       generatedColumn: The column number in the generated code,
	//       source: The path to the original source file that generated this
	//               chunk of code,
	//       originalLine: The line number in the original source that
	//                     corresponds to this chunk of generated code,
	//       originalColumn: The column number in the original source that
	//                       corresponds to this chunk of generated code,
	//       name: The name of the original symbol which generated this chunk of
	//             code.
	//     }
	//
	// All properties except for `generatedLine` and `generatedColumn` can be
	// `null`.
	//
	// `_generatedMappings` is ordered by the generated positions.
	//
	// `_originalMappings` is ordered by the original positions.
	
	SourceMapConsumer.prototype.__generatedMappings = null;
	Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
	  configurable: true,
	  enumerable: true,
	  get: function () {
	    if (!this.__generatedMappings) {
	      this._parseMappings(this._mappings, this.sourceRoot);
	    }
	
	    return this.__generatedMappings;
	  }
	});
	
	SourceMapConsumer.prototype.__originalMappings = null;
	Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
	  configurable: true,
	  enumerable: true,
	  get: function () {
	    if (!this.__originalMappings) {
	      this._parseMappings(this._mappings, this.sourceRoot);
	    }
	
	    return this.__originalMappings;
	  }
	});
	
	SourceMapConsumer.prototype._charIsMappingSeparator =
	  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
	    var c = aStr.charAt(index);
	    return c === ";" || c === ",";
	  };
	
	/**
	 * Parse the mappings in a string in to a data structure which we can easily
	 * query (the ordered arrays in the `this.__generatedMappings` and
	 * `this.__originalMappings` properties).
	 */
	SourceMapConsumer.prototype._parseMappings =
	  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
	    throw new Error("Subclasses must implement _parseMappings");
	  };
	
	SourceMapConsumer.GENERATED_ORDER = 1;
	SourceMapConsumer.ORIGINAL_ORDER = 2;
	
	SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
	SourceMapConsumer.LEAST_UPPER_BOUND = 2;
	
	/**
	 * Iterate over each mapping between an original source/line/column and a
	 * generated line/column in this source map.
	 *
	 * @param Function aCallback
	 *        The function that is called with each mapping.
	 * @param Object aContext
	 *        Optional. If specified, this object will be the value of `this` every
	 *        time that `aCallback` is called.
	 * @param aOrder
	 *        Either `SourceMapConsumer.GENERATED_ORDER` or
	 *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
	 *        iterate over the mappings sorted by the generated file's line/column
	 *        order or the original's source/line/column order, respectively. Defaults to
	 *        `SourceMapConsumer.GENERATED_ORDER`.
	 */
	SourceMapConsumer.prototype.eachMapping =
	  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
	    var context = aContext || null;
	    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;
	
	    var mappings;
	    switch (order) {
	    case SourceMapConsumer.GENERATED_ORDER:
	      mappings = this._generatedMappings;
	      break;
	    case SourceMapConsumer.ORIGINAL_ORDER:
	      mappings = this._originalMappings;
	      break;
	    default:
	      throw new Error("Unknown order of iteration.");
	    }
	
	    var sourceRoot = this.sourceRoot;
	    mappings.map(function (mapping) {
	      var source = mapping.source === null ? null : this._sources.at(mapping.source);
	      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
	      return {
	        source: source,
	        generatedLine: mapping.generatedLine,
	        generatedColumn: mapping.generatedColumn,
	        originalLine: mapping.originalLine,
	        originalColumn: mapping.originalColumn,
	        name: mapping.name === null ? null : this._names.at(mapping.name)
	      };
	    }, this).forEach(aCallback, context);
	  };
	
	/**
	 * Returns all generated line and column information for the original source,
	 * line, and column provided. If no column is provided, returns all mappings
	 * corresponding to a either the line we are searching for or the next
	 * closest line that has any mappings. Otherwise, returns all mappings
	 * corresponding to the given line and either the column we are searching for
	 * or the next closest column that has any offsets.
	 *
	 * The only argument is an object with the following properties:
	 *
	 *   - source: The filename of the original source.
	 *   - line: The line number in the original source.  The line number is 1-based.
	 *   - column: Optional. the column number in the original source.
	 *    The column number is 0-based.
	 *
	 * and an array of objects is returned, each with the following properties:
	 *
	 *   - line: The line number in the generated source, or null.  The
	 *    line number is 1-based.
	 *   - column: The column number in the generated source, or null.
	 *    The column number is 0-based.
	 */
	SourceMapConsumer.prototype.allGeneratedPositionsFor =
	  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
	    var line = util.getArg(aArgs, 'line');
	
	    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
	    // returns the index of the closest mapping less than the needle. By
	    // setting needle.originalColumn to 0, we thus find the last mapping for
	    // the given line, provided such a mapping exists.
	    var needle = {
	      source: util.getArg(aArgs, 'source'),
	      originalLine: line,
	      originalColumn: util.getArg(aArgs, 'column', 0)
	    };
	
	    needle.source = this._findSourceIndex(needle.source);
	    if (needle.source < 0) {
	      return [];
	    }
	
	    var mappings = [];
	
	    var index = this._findMapping(needle,
	                                  this._originalMappings,
	                                  "originalLine",
	                                  "originalColumn",
	                                  util.compareByOriginalPositions,
	                                  binarySearch.LEAST_UPPER_BOUND);
	    if (index >= 0) {
	      var mapping = this._originalMappings[index];
	
	      if (aArgs.column === undefined) {
	        var originalLine = mapping.originalLine;
	
	        // Iterate until either we run out of mappings, or we run into
	        // a mapping for a different line than the one we found. Since
	        // mappings are sorted, this is guaranteed to find all mappings for
	        // the line we found.
	        while (mapping && mapping.originalLine === originalLine) {
	          mappings.push({
	            line: util.getArg(mapping, 'generatedLine', null),
	            column: util.getArg(mapping, 'generatedColumn', null),
	            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
	          });
	
	          mapping = this._originalMappings[++index];
	        }
	      } else {
	        var originalColumn = mapping.originalColumn;
	
	        // Iterate until either we run out of mappings, or we run into
	        // a mapping for a different line than the one we were searching for.
	        // Since mappings are sorted, this is guaranteed to find all mappings for
	        // the line we are searching for.
	        while (mapping &&
	               mapping.originalLine === line &&
	               mapping.originalColumn == originalColumn) {
	          mappings.push({
	            line: util.getArg(mapping, 'generatedLine', null),
	            column: util.getArg(mapping, 'generatedColumn', null),
	            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
	          });
	
	          mapping = this._originalMappings[++index];
	        }
	      }
	    }
	
	    return mappings;
	  };
	
	exports.SourceMapConsumer = SourceMapConsumer;
	
	/**
	 * A BasicSourceMapConsumer instance represents a parsed source map which we can
	 * query for information about the original file positions by giving it a file
	 * position in the generated source.
	 *
	 * The first parameter is the raw source map (either as a JSON string, or
	 * already parsed to an object). According to the spec, source maps have the
	 * following attributes:
	 *
	 *   - version: Which version of the source map spec this map is following.
	 *   - sources: An array of URLs to the original source files.
	 *   - names: An array of identifiers which can be referrenced by individual mappings.
	 *   - sourceRoot: Optional. The URL root from which all sources are relative.
	 *   - sourcesContent: Optional. An array of contents of the original source files.
	 *   - mappings: A string of base64 VLQs which contain the actual mappings.
	 *   - file: Optional. The generated file this source map is associated with.
	 *
	 * Here is an example source map, taken from the source map spec[0]:
	 *
	 *     {
	 *       version : 3,
	 *       file: "out.js",
	 *       sourceRoot : "",
	 *       sources: ["foo.js", "bar.js"],
	 *       names: ["src", "maps", "are", "fun"],
	 *       mappings: "AA,AB;;ABCDE;"
	 *     }
	 *
	 * The second parameter, if given, is a string whose value is the URL
	 * at which the source map was found.  This URL is used to compute the
	 * sources array.
	 *
	 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
	 */
	function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
	  var sourceMap = aSourceMap;
	  if (typeof aSourceMap === 'string') {
	    sourceMap = util.parseSourceMapInput(aSourceMap);
	  }
	
	  var version = util.getArg(sourceMap, 'version');
	  var sources = util.getArg(sourceMap, 'sources');
	  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
	  // requires the array) to play nice here.
	  var names = util.getArg(sourceMap, 'names', []);
	  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
	  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
	  var mappings = util.getArg(sourceMap, 'mappings');
	  var file = util.getArg(sourceMap, 'file', null);
	
	  // Once again, Sass deviates from the spec and supplies the version as a
	  // string rather than a number, so we use loose equality checking here.
	  if (version != this._version) {
	    throw new Error('Unsupported version: ' + version);
	  }
	
	  if (sourceRoot) {
	    sourceRoot = util.normalize(sourceRoot);
	  }
	
	  sources = sources
	    .map(String)
	    // Some source maps produce relative source paths like "./foo.js" instead of
	    // "foo.js".  Normalize these first so that future comparisons will succeed.
	    // See bugzil.la/1090768.
	    .map(util.normalize)
	    // Always ensure that absolute sources are internally stored relative to
	    // the source root, if the source root is absolute. Not doing this would
	    // be particularly problematic when the source root is a prefix of the
	    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
	    .map(function (source) {
	      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
	        ? util.relative(sourceRoot, source)
	        : source;
	    });
	
	  // Pass `true` below to allow duplicate names and sources. While source maps
	  // are intended to be compressed and deduplicated, the TypeScript compiler
	  // sometimes generates source maps with duplicates in them. See Github issue
	  // #72 and bugzil.la/889492.
	  this._names = ArraySet.fromArray(names.map(String), true);
	  this._sources = ArraySet.fromArray(sources, true);
	
	  this._absoluteSources = this._sources.toArray().map(function (s) {
	    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
	  });
	
	  this.sourceRoot = sourceRoot;
	  this.sourcesContent = sourcesContent;
	  this._mappings = mappings;
	  this._sourceMapURL = aSourceMapURL;
	  this.file = file;
	}
	
	BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
	BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
	
	/**
	 * Utility function to find the index of a source.  Returns -1 if not
	 * found.
	 */
	BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
	  var relativeSource = aSource;
	  if (this.sourceRoot != null) {
	    relativeSource = util.relative(this.sourceRoot, relativeSource);
	  }
	
	  if (this._sources.has(relativeSource)) {
	    return this._sources.indexOf(relativeSource);
	  }
	
	  // Maybe aSource is an absolute URL as returned by |sources|.  In
	  // this case we can't simply undo the transform.
	  var i;
	  for (i = 0; i < this._absoluteSources.length; ++i) {
	    if (this._absoluteSources[i] == aSource) {
	      return i;
	    }
	  }
	
	  return -1;
	};
	
	/**
	 * Create a BasicSourceMapConsumer from a SourceMapGenerator.
	 *
	 * @param SourceMapGenerator aSourceMap
	 *        The source map that will be consumed.
	 * @param String aSourceMapURL
	 *        The URL at which the source map can be found (optional)
	 * @returns BasicSourceMapConsumer
	 */
	BasicSourceMapConsumer.fromSourceMap =
	  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
	    var smc = Object.create(BasicSourceMapConsumer.prototype);
	
	    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
	    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
	    smc.sourceRoot = aSourceMap._sourceRoot;
	    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
	                                                            smc.sourceRoot);
	    smc.file = aSourceMap._file;
	    smc._sourceMapURL = aSourceMapURL;
	    smc._absoluteSources = smc._sources.toArray().map(function (s) {
	      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
	    });
	
	    // Because we are modifying the entries (by converting string sources and
	    // names to indices into the sources and names ArraySets), we have to make
	    // a copy of the entry or else bad things happen. Shared mutable state
	    // strikes again! See github issue #191.
	
	    var generatedMappings = aSourceMap._mappings.toArray().slice();
	    var destGeneratedMappings = smc.__generatedMappings = [];
	    var destOriginalMappings = smc.__originalMappings = [];
	
	    for (var i = 0, length = generatedMappings.length; i < length; i++) {
	      var srcMapping = generatedMappings[i];
	      var destMapping = new Mapping;
	      destMapping.generatedLine = srcMapping.generatedLine;
	      destMapping.generatedColumn = srcMapping.generatedColumn;
	
	      if (srcMapping.source) {
	        destMapping.source = sources.indexOf(srcMapping.source);
	        destMapping.originalLine = srcMapping.originalLine;
	        destMapping.originalColumn = srcMapping.originalColumn;
	
	        if (srcMapping.name) {
	          destMapping.name = names.indexOf(srcMapping.name);
	        }
	
	        destOriginalMappings.push(destMapping);
	      }
	
	      destGeneratedMappings.push(destMapping);
	    }
	
	    quickSort(smc.__originalMappings, util.compareByOriginalPositions);
	
	    return smc;
	  };
	
	/**
	 * The version of the source mapping spec that we are consuming.
	 */
	BasicSourceMapConsumer.prototype._version = 3;
	
	/**
	 * The list of original sources.
	 */
	Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
	  get: function () {
	    return this._absoluteSources.slice();
	  }
	});
	
	/**
	 * Provide the JIT with a nice shape / hidden class.
	 */
	function Mapping() {
	  this.generatedLine = 0;
	  this.generatedColumn = 0;
	  this.source = null;
	  this.originalLine = null;
	  this.originalColumn = null;
	  this.name = null;
	}
	
	/**
	 * Parse the mappings in a string in to a data structure which we can easily
	 * query (the ordered arrays in the `this.__generatedMappings` and
	 * `this.__originalMappings` properties).
	 */
	BasicSourceMapConsumer.prototype._parseMappings =
	  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
	    var generatedLine = 1;
	    var previousGeneratedColumn = 0;
	    var previousOriginalLine = 0;
	    var previousOriginalColumn = 0;
	    var previousSource = 0;
	    var previousName = 0;
	    var length = aStr.length;
	    var index = 0;
	    var cachedSegments = {};
	    var temp = {};
	    var originalMappings = [];
	    var generatedMappings = [];
	    var mapping, str, segment, end, value;
	
	    while (index < length) {
	      if (aStr.charAt(index) === ';') {
	        generatedLine++;
	        index++;
	        previousGeneratedColumn = 0;
	      }
	      else if (aStr.charAt(index) === ',') {
	        index++;
	      }
	      else {
	        mapping = new Mapping();
	        mapping.generatedLine = generatedLine;
	
	        // Because each offset is encoded relative to the previous one,
	        // many segments often have the same encoding. We can exploit this
	        // fact by caching the parsed variable length fields of each segment,
	        // allowing us to avoid a second parse if we encounter the same
	        // segment again.
	        for (end = index; end < length; end++) {
	          if (this._charIsMappingSeparator(aStr, end)) {
	            break;
	          }
	        }
	        str = aStr.slice(index, end);
	
	        segment = cachedSegments[str];
	        if (segment) {
	          index += str.length;
	        } else {
	          segment = [];
	          while (index < end) {
	            base64VLQ.decode(aStr, index, temp);
	            value = temp.value;
	            index = temp.rest;
	            segment.push(value);
	          }
	
	          if (segment.length === 2) {
	            throw new Error('Found a source, but no line and column');
	          }
	
	          if (segment.length === 3) {
	            throw new Error('Found a source and line, but no column');
	          }
	
	          cachedSegments[str] = segment;
	        }
	
	        // Generated column.
	        mapping.generatedColumn = previousGeneratedColumn + segment[0];
	        previousGeneratedColumn = mapping.generatedColumn;
	
	        if (segment.length > 1) {
	          // Original source.
	          mapping.source = previousSource + segment[1];
	          previousSource += segment[1];
	
	          // Original line.
	          mapping.originalLine = previousOriginalLine + segment[2];
	          previousOriginalLine = mapping.originalLine;
	          // Lines are stored 0-based
	          mapping.originalLine += 1;
	
	          // Original column.
	          mapping.originalColumn = previousOriginalColumn + segment[3];
	          previousOriginalColumn = mapping.originalColumn;
	
	          if (segment.length > 4) {
	            // Original name.
	            mapping.name = previousName + segment[4];
	            previousName += segment[4];
	          }
	        }
	
	        generatedMappings.push(mapping);
	        if (typeof mapping.originalLine === 'number') {
	          originalMappings.push(mapping);
	        }
	      }
	    }
	
	    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
	    this.__generatedMappings = generatedMappings;
	
	    quickSort(originalMappings, util.compareByOriginalPositions);
	    this.__originalMappings = originalMappings;
	  };
	
	/**
	 * Find the mapping that best matches the hypothetical "needle" mapping that
	 * we are searching for in the given "haystack" of mappings.
	 */
	BasicSourceMapConsumer.prototype._findMapping =
	  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
	                                         aColumnName, aComparator, aBias) {
	    // To return the position we are searching for, we must first find the
	    // mapping for the given position and then return the opposite position it
	    // points to. Because the mappings are sorted, we can use binary search to
	    // find the best mapping.
	
	    if (aNeedle[aLineName] <= 0) {
	      throw new TypeError('Line must be greater than or equal to 1, got '
	                          + aNeedle[aLineName]);
	    }
	    if (aNeedle[aColumnName] < 0) {
	      throw new TypeError('Column must be greater than or equal to 0, got '
	                          + aNeedle[aColumnName]);
	    }
	
	    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
	  };
	
	/**
	 * Compute the last column for each generated mapping. The last column is
	 * inclusive.
	 */
	BasicSourceMapConsumer.prototype.computeColumnSpans =
	  function SourceMapConsumer_computeColumnSpans() {
	    for (var index = 0; index < this._generatedMappings.length; ++index) {
	      var mapping = this._generatedMappings[index];
	
	      // Mappings do not contain a field for the last generated columnt. We
	      // can come up with an optimistic estimate, however, by assuming that
	      // mappings are contiguous (i.e. given two consecutive mappings, the
	      // first mapping ends where the second one starts).
	      if (index + 1 < this._generatedMappings.length) {
	        var nextMapping = this._generatedMappings[index + 1];
	
	        if (mapping.generatedLine === nextMapping.generatedLine) {
	          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
	          continue;
	        }
	      }
	
	      // The last mapping for each line spans the entire line.
	      mapping.lastGeneratedColumn = Infinity;
	    }
	  };
	
	/**
	 * Returns the original source, line, and column information for the generated
	 * source's line and column positions provided. The only argument is an object
	 * with the following properties:
	 *
	 *   - line: The line number in the generated source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the generated source.  The column
	 *     number is 0-based.
	 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
	 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - source: The original source file, or null.
	 *   - line: The line number in the original source, or null.  The
	 *     line number is 1-based.
	 *   - column: The column number in the original source, or null.  The
	 *     column number is 0-based.
	 *   - name: The original identifier, or null.
	 */
	BasicSourceMapConsumer.prototype.originalPositionFor =
	  function SourceMapConsumer_originalPositionFor(aArgs) {
	    var needle = {
	      generatedLine: util.getArg(aArgs, 'line'),
	      generatedColumn: util.getArg(aArgs, 'column')
	    };
	
	    var index = this._findMapping(
	      needle,
	      this._generatedMappings,
	      "generatedLine",
	      "generatedColumn",
	      util.compareByGeneratedPositionsDeflated,
	      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
	    );
	
	    if (index >= 0) {
	      var mapping = this._generatedMappings[index];
	
	      if (mapping.generatedLine === needle.generatedLine) {
	        var source = util.getArg(mapping, 'source', null);
	        if (source !== null) {
	          source = this._sources.at(source);
	          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
	        }
	        var name = util.getArg(mapping, 'name', null);
	        if (name !== null) {
	          name = this._names.at(name);
	        }
	        return {
	          source: source,
	          line: util.getArg(mapping, 'originalLine', null),
	          column: util.getArg(mapping, 'originalColumn', null),
	          name: name
	        };
	      }
	    }
	
	    return {
	      source: null,
	      line: null,
	      column: null,
	      name: null
	    };
	  };
	
	/**
	 * Return true if we have the source content for every source in the source
	 * map, false otherwise.
	 */
	BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
	  function BasicSourceMapConsumer_hasContentsOfAllSources() {
	    if (!this.sourcesContent) {
	      return false;
	    }
	    return this.sourcesContent.length >= this._sources.size() &&
	      !this.sourcesContent.some(function (sc) { return sc == null; });
	  };
	
	/**
	 * Returns the original source content. The only argument is the url of the
	 * original source file. Returns null if no original source content is
	 * available.
	 */
	BasicSourceMapConsumer.prototype.sourceContentFor =
	  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
	    if (!this.sourcesContent) {
	      return null;
	    }
	
	    var index = this._findSourceIndex(aSource);
	    if (index >= 0) {
	      return this.sourcesContent[index];
	    }
	
	    var relativeSource = aSource;
	    if (this.sourceRoot != null) {
	      relativeSource = util.relative(this.sourceRoot, relativeSource);
	    }
	
	    var url;
	    if (this.sourceRoot != null
	        && (url = util.urlParse(this.sourceRoot))) {
	      // XXX: file:// URIs and absolute paths lead to unexpected behavior for
	      // many users. We can help them out when they expect file:// URIs to
	      // behave like it would if they were running a local HTTP server. See
	      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
	      var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
	      if (url.scheme == "file"
	          && this._sources.has(fileUriAbsPath)) {
	        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
	      }
	
	      if ((!url.path || url.path == "/")
	          && this._sources.has("/" + relativeSource)) {
	        return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
	      }
	    }
	
	    // This function is used recursively from
	    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
	    // don't want to throw if we can't find the source - we just want to
	    // return null, so we provide a flag to exit gracefully.
	    if (nullOnMissing) {
	      return null;
	    }
	    else {
	      throw new Error('"' + relativeSource + '" is not in the SourceMap.');
	    }
	  };
	
	/**
	 * Returns the generated line and column information for the original source,
	 * line, and column positions provided. The only argument is an object with
	 * the following properties:
	 *
	 *   - source: The filename of the original source.
	 *   - line: The line number in the original source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the original source.  The column
	 *     number is 0-based.
	 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
	 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - line: The line number in the generated source, or null.  The
	 *     line number is 1-based.
	 *   - column: The column number in the generated source, or null.
	 *     The column number is 0-based.
	 */
	BasicSourceMapConsumer.prototype.generatedPositionFor =
	  function SourceMapConsumer_generatedPositionFor(aArgs) {
	    var source = util.getArg(aArgs, 'source');
	    source = this._findSourceIndex(source);
	    if (source < 0) {
	      return {
	        line: null,
	        column: null,
	        lastColumn: null
	      };
	    }
	
	    var needle = {
	      source: source,
	      originalLine: util.getArg(aArgs, 'line'),
	      originalColumn: util.getArg(aArgs, 'column')
	    };
	
	    var index = this._findMapping(
	      needle,
	      this._originalMappings,
	      "originalLine",
	      "originalColumn",
	      util.compareByOriginalPositions,
	      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
	    );
	
	    if (index >= 0) {
	      var mapping = this._originalMappings[index];
	
	      if (mapping.source === needle.source) {
	        return {
	          line: util.getArg(mapping, 'generatedLine', null),
	          column: util.getArg(mapping, 'generatedColumn', null),
	          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
	        };
	      }
	    }
	
	    return {
	      line: null,
	      column: null,
	      lastColumn: null
	    };
	  };
	
	exports.BasicSourceMapConsumer = BasicSourceMapConsumer;
	
	/**
	 * An IndexedSourceMapConsumer instance represents a parsed source map which
	 * we can query for information. It differs from BasicSourceMapConsumer in
	 * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
	 * input.
	 *
	 * The first parameter is a raw source map (either as a JSON string, or already
	 * parsed to an object). According to the spec for indexed source maps, they
	 * have the following attributes:
	 *
	 *   - version: Which version of the source map spec this map is following.
	 *   - file: Optional. The generated file this source map is associated with.
	 *   - sections: A list of section definitions.
	 *
	 * Each value under the "sections" field has two fields:
	 *   - offset: The offset into the original specified at which this section
	 *       begins to apply, defined as an object with a "line" and "column"
	 *       field.
	 *   - map: A source map definition. This source map could also be indexed,
	 *       but doesn't have to be.
	 *
	 * Instead of the "map" field, it's also possible to have a "url" field
	 * specifying a URL to retrieve a source map from, but that's currently
	 * unsupported.
	 *
	 * Here's an example source map, taken from the source map spec[0], but
	 * modified to omit a section which uses the "url" field.
	 *
	 *  {
	 *    version : 3,
	 *    file: "app.js",
	 *    sections: [{
	 *      offset: {line:100, column:10},
	 *      map: {
	 *        version : 3,
	 *        file: "section.js",
	 *        sources: ["foo.js", "bar.js"],
	 *        names: ["src", "maps", "are", "fun"],
	 *        mappings: "AAAA,E;;ABCDE;"
	 *      }
	 *    }],
	 *  }
	 *
	 * The second parameter, if given, is a string whose value is the URL
	 * at which the source map was found.  This URL is used to compute the
	 * sources array.
	 *
	 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
	 */
	function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
	  var sourceMap = aSourceMap;
	  if (typeof aSourceMap === 'string') {
	    sourceMap = util.parseSourceMapInput(aSourceMap);
	  }
	
	  var version = util.getArg(sourceMap, 'version');
	  var sections = util.getArg(sourceMap, 'sections');
	
	  if (version != this._version) {
	    throw new Error('Unsupported version: ' + version);
	  }
	
	  this._sources = new ArraySet();
	  this._names = new ArraySet();
	
	  var lastOffset = {
	    line: -1,
	    column: 0
	  };
	  this._sections = sections.map(function (s) {
	    if (s.url) {
	      // The url field will require support for asynchronicity.
	      // See https://github.com/mozilla/source-map/issues/16
	      throw new Error('Support for url field in sections not implemented.');
	    }
	    var offset = util.getArg(s, 'offset');
	    var offsetLine = util.getArg(offset, 'line');
	    var offsetColumn = util.getArg(offset, 'column');
	
	    if (offsetLine < lastOffset.line ||
	        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
	      throw new Error('Section offsets must be ordered and non-overlapping.');
	    }
	    lastOffset = offset;
	
	    return {
	      generatedOffset: {
	        // The offset fields are 0-based, but we use 1-based indices when
	        // encoding/decoding from VLQ.
	        generatedLine: offsetLine + 1,
	        generatedColumn: offsetColumn + 1
	      },
	      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)
	    }
	  });
	}
	
	IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
	IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;
	
	/**
	 * The version of the source mapping spec that we are consuming.
	 */
	IndexedSourceMapConsumer.prototype._version = 3;
	
	/**
	 * The list of original sources.
	 */
	Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
	  get: function () {
	    var sources = [];
	    for (var i = 0; i < this._sections.length; i++) {
	      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
	        sources.push(this._sections[i].consumer.sources[j]);
	      }
	    }
	    return sources;
	  }
	});
	
	/**
	 * Returns the original source, line, and column information for the generated
	 * source's line and column positions provided. The only argument is an object
	 * with the following properties:
	 *
	 *   - line: The line number in the generated source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the generated source.  The column
	 *     number is 0-based.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - source: The original source file, or null.
	 *   - line: The line number in the original source, or null.  The
	 *     line number is 1-based.
	 *   - column: The column number in the original source, or null.  The
	 *     column number is 0-based.
	 *   - name: The original identifier, or null.
	 */
	IndexedSourceMapConsumer.prototype.originalPositionFor =
	  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
	    var needle = {
	      generatedLine: util.getArg(aArgs, 'line'),
	      generatedColumn: util.getArg(aArgs, 'column')
	    };
	
	    // Find the section containing the generated position we're trying to map
	    // to an original position.
	    var sectionIndex = binarySearch.search(needle, this._sections,
	      function(needle, section) {
	        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
	        if (cmp) {
	          return cmp;
	        }
	
	        return (needle.generatedColumn -
	                section.generatedOffset.generatedColumn);
	      });
	    var section = this._sections[sectionIndex];
	
	    if (!section) {
	      return {
	        source: null,
	        line: null,
	        column: null,
	        name: null
	      };
	    }
	
	    return section.consumer.originalPositionFor({
	      line: needle.generatedLine -
	        (section.generatedOffset.generatedLine - 1),
	      column: needle.generatedColumn -
	        (section.generatedOffset.generatedLine === needle.generatedLine
	         ? section.generatedOffset.generatedColumn - 1
	         : 0),
	      bias: aArgs.bias
	    });
	  };
	
	/**
	 * Return true if we have the source content for every source in the source
	 * map, false otherwise.
	 */
	IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
	  function IndexedSourceMapConsumer_hasContentsOfAllSources() {
	    return this._sections.every(function (s) {
	      return s.consumer.hasContentsOfAllSources();
	    });
	  };
	
	/**
	 * Returns the original source content. The only argument is the url of the
	 * original source file. Returns null if no original source content is
	 * available.
	 */
	IndexedSourceMapConsumer.prototype.sourceContentFor =
	  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
	    for (var i = 0; i < this._sections.length; i++) {
	      var section = this._sections[i];
	
	      var content = section.consumer.sourceContentFor(aSource, true);
	      if (content) {
	        return content;
	      }
	    }
	    if (nullOnMissing) {
	      return null;
	    }
	    else {
	      throw new Error('"' + aSource + '" is not in the SourceMap.');
	    }
	  };
	
	/**
	 * Returns the generated line and column information for the original source,
	 * line, and column positions provided. The only argument is an object with
	 * the following properties:
	 *
	 *   - source: The filename of the original source.
	 *   - line: The line number in the original source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the original source.  The column
	 *     number is 0-based.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - line: The line number in the generated source, or null.  The
	 *     line number is 1-based. 
	 *   - column: The column number in the generated source, or null.
	 *     The column number is 0-based.
	 */
	IndexedSourceMapConsumer.prototype.generatedPositionFor =
	  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
	    for (var i = 0; i < this._sections.length; i++) {
	      var section = this._sections[i];
	
	      // Only consider this section if the requested source is in the list of
	      // sources of the consumer.
	      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
	        continue;
	      }
	      var generatedPosition = section.consumer.generatedPositionFor(aArgs);
	      if (generatedPosition) {
	        var ret = {
	          line: generatedPosition.line +
	            (section.generatedOffset.generatedLine - 1),
	          column: generatedPosition.column +
	            (section.generatedOffset.generatedLine === generatedPosition.line
	             ? section.generatedOffset.generatedColumn - 1
	             : 0)
	        };
	        return ret;
	      }
	    }
	
	    return {
	      line: null,
	      column: null
	    };
	  };
	
	/**
	 * Parse the mappings in a string in to a data structure which we can easily
	 * query (the ordered arrays in the `this.__generatedMappings` and
	 * `this.__originalMappings` properties).
	 */
	IndexedSourceMapConsumer.prototype._parseMappings =
	  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
	    this.__generatedMappings = [];
	    this.__originalMappings = [];
	    for (var i = 0; i < this._sections.length; i++) {
	      var section = this._sections[i];
	      var sectionMappings = section.consumer._generatedMappings;
	      for (var j = 0; j < sectionMappings.length; j++) {
	        var mapping = sectionMappings[j];
	
	        var source = section.consumer._sources.at(mapping.source);
	        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
	        this._sources.add(source);
	        source = this._sources.indexOf(source);
	
	        var name = null;
	        if (mapping.name) {
	          name = section.consumer._names.at(mapping.name);
	          this._names.add(name);
	          name = this._names.indexOf(name);
	        }
	
	        // The mappings coming from the consumer for the section have
	        // generated positions relative to the start of the section, so we
	        // need to offset them to be relative to the start of the concatenated
	        // generated file.
	        var adjustedMapping = {
	          source: source,
	          generatedLine: mapping.generatedLine +
	            (section.generatedOffset.generatedLine - 1),
	          generatedColumn: mapping.generatedColumn +
	            (section.generatedOffset.generatedLine === mapping.generatedLine
	            ? section.generatedOffset.generatedColumn - 1
	            : 0),
	          originalLine: mapping.originalLine,
	          originalColumn: mapping.originalColumn,
	          name: name
	        };
	
	        this.__generatedMappings.push(adjustedMapping);
	        if (typeof adjustedMapping.originalLine === 'number') {
	          this.__originalMappings.push(adjustedMapping);
	        }
	      }
	    }
	
	    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
	    quickSort(this.__originalMappings, util.compareByOriginalPositions);
	  };
	
	exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;


/***/ }),
/* 8 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	exports.GREATEST_LOWER_BOUND = 1;
	exports.LEAST_UPPER_BOUND = 2;
	
	/**
	 * Recursive implementation of binary search.
	 *
	 * @param aLow Indices here and lower do not contain the needle.
	 * @param aHigh Indices here and higher do not contain the needle.
	 * @param aNeedle The element being searched for.
	 * @param aHaystack The non-empty array being searched.
	 * @param aCompare Function which takes two elements and returns -1, 0, or 1.
	 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
	 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 */
	function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
	  // This function terminates when one of the following is true:
	  //
	  //   1. We find the exact element we are looking for.
	  //
	  //   2. We did not find the exact element, but we can return the index of
	  //      the next-closest element.
	  //
	  //   3. We did not find the exact element, and there is no next-closest
	  //      element than the one we are searching for, so we return -1.
	  var mid = Math.floor((aHigh - aLow) / 2) + aLow;
	  var cmp = aCompare(aNeedle, aHaystack[mid], true);
	  if (cmp === 0) {
	    // Found the element we are looking for.
	    return mid;
	  }
	  else if (cmp > 0) {
	    // Our needle is greater than aHaystack[mid].
	    if (aHigh - mid > 1) {
	      // The element is in the upper half.
	      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
	    }
	
	    // The exact needle element was not found in this haystack. Determine if
	    // we are in termination case (3) or (2) and return the appropriate thing.
	    if (aBias == exports.LEAST_UPPER_BOUND) {
	      return aHigh < aHaystack.length ? aHigh : -1;
	    } else {
	      return mid;
	    }
	  }
	  else {
	    // Our needle is less than aHaystack[mid].
	    if (mid - aLow > 1) {
	      // The element is in the lower half.
	      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
	    }
	
	    // we are in termination case (3) or (2) and return the appropriate thing.
	    if (aBias == exports.LEAST_UPPER_BOUND) {
	      return mid;
	    } else {
	      return aLow < 0 ? -1 : aLow;
	    }
	  }
	}
	
	/**
	 * This is an implementation of binary search which will always try and return
	 * the index of the closest element if there is no exact hit. This is because
	 * mappings between original and generated line/col pairs are single points,
	 * and there is an implicit region between each of them, so a miss just means
	 * that you aren't on the very start of a region.
	 *
	 * @param aNeedle The element you are looking for.
	 * @param aHaystack The array that is being searched.
	 * @param aCompare A function which takes the needle and an element in the
	 *     array and returns -1, 0, or 1 depending on whether the needle is less
	 *     than, equal to, or greater than the element, respectively.
	 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
	 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
	 */
	exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
	  if (aHaystack.length === 0) {
	    return -1;
	  }
	
	  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
	                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);
	  if (index < 0) {
	    return -1;
	  }
	
	  // We have found either the exact element, or the next-closest element than
	  // the one we are searching for. However, there may be more than one such
	  // element. Make sure we always return the smallest of these.
	  while (index - 1 >= 0) {
	    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
	      break;
	    }
	    --index;
	  }
	
	  return index;
	};


/***/ }),
/* 9 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	// It turns out that some (most?) JavaScript engines don't self-host
	// `Array.prototype.sort`. This makes sense because C++ will likely remain
	// faster than JS when doing raw CPU-intensive sorting. However, when using a
	// custom comparator function, calling back and forth between the VM's C++ and
	// JIT'd JS is rather slow *and* loses JIT type information, resulting in
	// worse generated code for the comparator function than would be optimal. In
	// fact, when sorting with a comparator, these costs outweigh the benefits of
	// sorting in C++. By using our own JS-implemented Quick Sort (below), we get
	// a ~3500ms mean speed-up in `bench/bench.html`.
	
	/**
	 * Swap the elements indexed by `x` and `y` in the array `ary`.
	 *
	 * @param {Array} ary
	 *        The array.
	 * @param {Number} x
	 *        The index of the first item.
	 * @param {Number} y
	 *        The index of the second item.
	 */
	function swap(ary, x, y) {
	  var temp = ary[x];
	  ary[x] = ary[y];
	  ary[y] = temp;
	}
	
	/**
	 * Returns a random integer within the range `low .. high` inclusive.
	 *
	 * @param {Number} low
	 *        The lower bound on the range.
	 * @param {Number} high
	 *        The upper bound on the range.
	 */
	function randomIntInRange(low, high) {
	  return Math.round(low + (Math.random() * (high - low)));
	}
	
	/**
	 * The Quick Sort algorithm.
	 *
	 * @param {Array} ary
	 *        An array to sort.
	 * @param {function} comparator
	 *        Function to use to compare two items.
	 * @param {Number} p
	 *        Start index of the array
	 * @param {Number} r
	 *        End index of the array
	 */
	function doQuickSort(ary, comparator, p, r) {
	  // If our lower bound is less than our upper bound, we (1) partition the
	  // array into two pieces and (2) recurse on each half. If it is not, this is
	  // the empty array and our base case.
	
	  if (p < r) {
	    // (1) Partitioning.
	    //
	    // The partitioning chooses a pivot between `p` and `r` and moves all
	    // elements that are less than or equal to the pivot to the before it, and
	    // all the elements that are greater than it after it. The effect is that
	    // once partition is done, the pivot is in the exact place it will be when
	    // the array is put in sorted order, and it will not need to be moved
	    // again. This runs in O(n) time.
	
	    // Always choose a random pivot so that an input array which is reverse
	    // sorted does not cause O(n^2) running time.
	    var pivotIndex = randomIntInRange(p, r);
	    var i = p - 1;
	
	    swap(ary, pivotIndex, r);
	    var pivot = ary[r];
	
	    // Immediately after `j` is incremented in this loop, the following hold
	    // true:
	    //
	    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.
	    //
	    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
	    for (var j = p; j < r; j++) {
	      if (comparator(ary[j], pivot) <= 0) {
	        i += 1;
	        swap(ary, i, j);
	      }
	    }
	
	    swap(ary, i + 1, j);
	    var q = i + 1;
	
	    // (2) Recurse on each half.
	
	    doQuickSort(ary, comparator, p, q - 1);
	    doQuickSort(ary, comparator, q + 1, r);
	  }
	}
	
	/**
	 * Sort the given array in-place with the given comparator function.
	 *
	 * @param {Array} ary
	 *        An array to sort.
	 * @param {function} comparator
	 *        Function to use to compare two items.
	 */
	exports.quickSort = function (ary, comparator) {
	  doQuickSort(ary, comparator, 0, ary.length - 1);
	};


/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	
	var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
	var util = __webpack_require__(4);
	
	// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
	// operating systems these days (capturing the result).
	var REGEX_NEWLINE = /(\r?\n)/;
	
	// Newline character code for charCodeAt() comparisons
	var NEWLINE_CODE = 10;
	
	// Private symbol for identifying `SourceNode`s when multiple versions of
	// the source-map library are loaded. This MUST NOT CHANGE across
	// versions!
	var isSourceNode = "$$$isSourceNode$$$";
	
	/**
	 * SourceNodes provide a way to abstract over interpolating/concatenating
	 * snippets of generated JavaScript source code while maintaining the line and
	 * column information associated with the original source code.
	 *
	 * @param aLine The original line number.
	 * @param aColumn The original column number.
	 * @param aSource The original source's filename.
	 * @param aChunks Optional. An array of strings which are snippets of
	 *        generated JS, or other SourceNodes.
	 * @param aName The original identifier.
	 */
	function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
	  this.children = [];
	  this.sourceContents = {};
	  this.line = aLine == null ? null : aLine;
	  this.column = aColumn == null ? null : aColumn;
	  this.source = aSource == null ? null : aSource;
	  this.name = aName == null ? null : aName;
	  this[isSourceNode] = true;
	  if (aChunks != null) this.add(aChunks);
	}
	
	/**
	 * Creates a SourceNode from generated code and a SourceMapConsumer.
	 *
	 * @param aGeneratedCode The generated code
	 * @param aSourceMapConsumer The SourceMap for the generated code
	 * @param aRelativePath Optional. The path that relative sources in the
	 *        SourceMapConsumer should be relative to.
	 */
	SourceNode.fromStringWithSourceMap =
	  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
	    // The SourceNode we want to fill with the generated code
	    // and the SourceMap
	    var node = new SourceNode();
	
	    // All even indices of this array are one line of the generated code,
	    // while all odd indices are the newlines between two adjacent lines
	    // (since `REGEX_NEWLINE` captures its match).
	    // Processed fragments are accessed by calling `shiftNextLine`.
	    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
	    var remainingLinesIndex = 0;
	    var shiftNextLine = function() {
	      var lineContents = getNextLine();
	      // The last line of a file might not have a newline.
	      var newLine = getNextLine() || "";
	      return lineContents + newLine;
	
	      function getNextLine() {
	        return remainingLinesIndex < remainingLines.length ?
	            remainingLines[remainingLinesIndex++] : undefined;
	      }
	    };
	
	    // We need to remember the position of "remainingLines"
	    var lastGeneratedLine = 1, lastGeneratedColumn = 0;
	
	    // The generate SourceNodes we need a code range.
	    // To extract it current and last mapping is used.
	    // Here we store the last mapping.
	    var lastMapping = null;
	
	    aSourceMapConsumer.eachMapping(function (mapping) {
	      if (lastMapping !== null) {
	        // We add the code from "lastMapping" to "mapping":
	        // First check if there is a new line in between.
	        if (lastGeneratedLine < mapping.generatedLine) {
	          // Associate first line with "lastMapping"
	          addMappingWithCode(lastMapping, shiftNextLine());
	          lastGeneratedLine++;
	          lastGeneratedColumn = 0;
	          // The remaining code is added without mapping
	        } else {
	          // There is no new line in between.
	          // Associate the code between "lastGeneratedColumn" and
	          // "mapping.generatedColumn" with "lastMapping"
	          var nextLine = remainingLines[remainingLinesIndex] || '';
	          var code = nextLine.substr(0, mapping.generatedColumn -
	                                        lastGeneratedColumn);
	          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
	                                              lastGeneratedColumn);
	          lastGeneratedColumn = mapping.generatedColumn;
	          addMappingWithCode(lastMapping, code);
	          // No more remaining code, continue
	          lastMapping = mapping;
	          return;
	        }
	      }
	      // We add the generated code until the first mapping
	      // to the SourceNode without any mapping.
	      // Each line is added as separate string.
	      while (lastGeneratedLine < mapping.generatedLine) {
	        node.add(shiftNextLine());
	        lastGeneratedLine++;
	      }
	      if (lastGeneratedColumn < mapping.generatedColumn) {
	        var nextLine = remainingLines[remainingLinesIndex] || '';
	        node.add(nextLine.substr(0, mapping.generatedColumn));
	        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
	        lastGeneratedColumn = mapping.generatedColumn;
	      }
	      lastMapping = mapping;
	    }, this);
	    // We have processed all mappings.
	    if (remainingLinesIndex < remainingLines.length) {
	      if (lastMapping) {
	        // Associate the remaining code in the current line with "lastMapping"
	        addMappingWithCode(lastMapping, shiftNextLine());
	      }
	      // and add the remaining lines without any mapping
	      node.add(remainingLines.splice(remainingLinesIndex).join(""));
	    }
	
	    // Copy sourcesContent into SourceNode
	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
	      if (content != null) {
	        if (aRelativePath != null) {
	          sourceFile = util.join(aRelativePath, sourceFile);
	        }
	        node.setSourceContent(sourceFile, content);
	      }
	    });
	
	    return node;
	
	    function addMappingWithCode(mapping, code) {
	      if (mapping === null || mapping.source === undefined) {
	        node.add(code);
	      } else {
	        var source = aRelativePath
	          ? util.join(aRelativePath, mapping.source)
	          : mapping.source;
	        node.add(new SourceNode(mapping.originalLine,
	                                mapping.originalColumn,
	                                source,
	                                code,
	                                mapping.name));
	      }
	    }
	  };
	
	/**
	 * Add a chunk of generated JS to this source node.
	 *
	 * @param aChunk A string snippet of generated JS code, another instance of
	 *        SourceNode, or an array where each member is one of those things.
	 */
	SourceNode.prototype.add = function SourceNode_add(aChunk) {
	  if (Array.isArray(aChunk)) {
	    aChunk.forEach(function (chunk) {
	      this.add(chunk);
	    }, this);
	  }
	  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
	    if (aChunk) {
	      this.children.push(aChunk);
	    }
	  }
	  else {
	    throw new TypeError(
	      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
	    );
	  }
	  return this;
	};
	
	/**
	 * Add a chunk of generated JS to the beginning of this source node.
	 *
	 * @param aChunk A string snippet of generated JS code, another instance of
	 *        SourceNode, or an array where each member is one of those things.
	 */
	SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
	  if (Array.isArray(aChunk)) {
	    for (var i = aChunk.length-1; i >= 0; i--) {
	      this.prepend(aChunk[i]);
	    }
	  }
	  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
	    this.children.unshift(aChunk);
	  }
	  else {
	    throw new TypeError(
	      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
	    );
	  }
	  return this;
	};
	
	/**
	 * Walk over the tree of JS snippets in this node and its children. The
	 * walking function is called once for each snippet of JS and is passed that
	 * snippet and the its original associated source's line/column location.
	 *
	 * @param aFn The traversal function.
	 */
	SourceNode.prototype.walk = function SourceNode_walk(aFn) {
	  var chunk;
	  for (var i = 0, len = this.children.length; i < len; i++) {
	    chunk = this.children[i];
	    if (chunk[isSourceNode]) {
	      chunk.walk(aFn);
	    }
	    else {
	      if (chunk !== '') {
	        aFn(chunk, { source: this.source,
	                     line: this.line,
	                     column: this.column,
	                     name: this.name });
	      }
	    }
	  }
	};
	
	/**
	 * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
	 * each of `this.children`.
	 *
	 * @param aSep The separator.
	 */
	SourceNode.prototype.join = function SourceNode_join(aSep) {
	  var newChildren;
	  var i;
	  var len = this.children.length;
	  if (len > 0) {
	    newChildren = [];
	    for (i = 0; i < len-1; i++) {
	      newChildren.push(this.children[i]);
	      newChildren.push(aSep);
	    }
	    newChildren.push(this.children[i]);
	    this.children = newChildren;
	  }
	  return this;
	};
	
	/**
	 * Call String.prototype.replace on the very right-most source snippet. Useful
	 * for trimming whitespace from the end of a source node, etc.
	 *
	 * @param aPattern The pattern to replace.
	 * @param aReplacement The thing to replace the pattern with.
	 */
	SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
	  var lastChild = this.children[this.children.length - 1];
	  if (lastChild[isSourceNode]) {
	    lastChild.replaceRight(aPattern, aReplacement);
	  }
	  else if (typeof lastChild === 'string') {
	    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
	  }
	  else {
	    this.children.push(''.replace(aPattern, aReplacement));
	  }
	  return this;
	};
	
	/**
	 * Set the source content for a source file. This will be added to the SourceMapGenerator
	 * in the sourcesContent field.
	 *
	 * @param aSourceFile The filename of the source file
	 * @param aSourceContent The content of the source file
	 */
	SourceNode.prototype.setSourceContent =
	  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
	    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
	  };
	
	/**
	 * Walk over the tree of SourceNodes. The walking function is called for each
	 * source file content and is passed the filename and source content.
	 *
	 * @param aFn The traversal function.
	 */
	SourceNode.prototype.walkSourceContents =
	  function SourceNode_walkSourceContents(aFn) {
	    for (var i = 0, len = this.children.length; i < len; i++) {
	      if (this.children[i][isSourceNode]) {
	        this.children[i].walkSourceContents(aFn);
	      }
	    }
	
	    var sources = Object.keys(this.sourceContents);
	    for (var i = 0, len = sources.length; i < len; i++) {
	      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
	    }
	  };
	
	/**
	 * Return the string representation of this source node. Walks over the tree
	 * and concatenates all the various snippets together to one string.
	 */
	SourceNode.prototype.toString = function SourceNode_toString() {
	  var str = "";
	  this.walk(function (chunk) {
	    str += chunk;
	  });
	  return str;
	};
	
	/**
	 * Returns the string representation of this source node along with a source
	 * map.
	 */
	SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
	  var generated = {
	    code: "",
	    line: 1,
	    column: 0
	  };
	  var map = new SourceMapGenerator(aArgs);
	  var sourceMappingActive = false;
	  var lastOriginalSource = null;
	  var lastOriginalLine = null;
	  var lastOriginalColumn = null;
	  var lastOriginalName = null;
	  this.walk(function (chunk, original) {
	    generated.code += chunk;
	    if (original.source !== null
	        && original.line !== null
	        && original.column !== null) {
	      if(lastOriginalSource !== original.source
	         || lastOriginalLine !== original.line
	         || lastOriginalColumn !== original.column
	         || lastOriginalName !== original.name) {
	        map.addMapping({
	          source: original.source,
	          original: {
	            line: original.line,
	            column: original.column
	          },
	          generated: {
	            line: generated.line,
	            column: generated.column
	          },
	          name: original.name
	        });
	      }
	      lastOriginalSource = original.source;
	      lastOriginalLine = original.line;
	      lastOriginalColumn = original.column;
	      lastOriginalName = original.name;
	      sourceMappingActive = true;
	    } else if (sourceMappingActive) {
	      map.addMapping({
	        generated: {
	          line: generated.line,
	          column: generated.column
	        }
	      });
	      lastOriginalSource = null;
	      sourceMappingActive = false;
	    }
	    for (var idx = 0, length = chunk.length; idx < length; idx++) {
	      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
	        generated.line++;
	        generated.column = 0;
	        // Mappings end at eol
	        if (idx + 1 === length) {
	          lastOriginalSource = null;
	          sourceMappingActive = false;
	        } else if (sourceMappingActive) {
	          map.addMapping({
	            source: original.source,
	            original: {
	              line: original.line,
	              column: original.column
	            },
	            generated: {
	              line: generated.line,
	              column: generated.column
	            },
	            name: original.name
	          });
	        }
	      } else {
	        generated.column++;
	      }
	    }
	  });
	  this.walkSourceContents(function (sourceFile, sourceContent) {
	    map.setSourceContent(sourceFile, sourceContent);
	  });
	
	  return { code: generated.code, map: map };
	};
	
	exports.SourceNode = SourceNode;


/***/ })
/******/ ])
});
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIndlYnBhY2s6Ly8vLi9zb3VyY2UtbWFwLmpzIiwid2VicGFjazovLy8uL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LXZscS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LmpzIiwid2VicGFjazovLy8uL2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21hcHBpbmctbGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcXVpY2stc29ydC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW5vZGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNQQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEwQyxTQUFTO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3hhQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBMkQ7QUFDM0QscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBOzs7Ozs7O0FDM0lBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLG9CQUFtQjtBQUNuQixxQkFBb0I7O0FBRXBCLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLGlCQUFnQjtBQUNoQixrQkFBaUI7O0FBRWpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDbEVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBMkIsUUFBUTtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWE7QUFDYjs7QUFFQTtBQUNBLGVBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDdmVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQyxTQUFTO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUN4SEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUM5RUEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7O0FBRVg7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWEsa0NBQWtDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUFzRCxZQUFZO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBeUIsY0FBYztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLHdDQUF3QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUErQyxtQkFBbUIsRUFBRTtBQUNwRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsb0JBQW9CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBNkIsTUFBTTtBQUNuQztBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsMkJBQTJC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Q0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNqSEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWlDLFFBQVE7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLFNBQVM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQSx1Q0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQStDLFNBQVM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBeUMsU0FBUztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsNkNBQTRDLGNBQWM7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxjQUFhO0FBQ2I7QUFDQSxZQUFXO0FBQ1g7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQSxJQUFHOztBQUVILFdBQVU7QUFDVjs7QUFFQSIsImZpbGUiOiJzb3VyY2UtbWFwLmRlYnVnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic291cmNlTWFwXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInNvdXJjZU1hcFwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1jb25zdW1lcicpLlNvdXJjZU1hcENvbnN1bWVyO1xuZXhwb3J0cy5Tb3VyY2VOb2RlID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW5vZGUnKS5Tb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zb3VyY2UtbWFwLmpzXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gc291cmNlUm9vdDogQSByb290IGZvciBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICBpZiAoIWFBcmdzKSB7XG4gICAgYUFyZ3MgPSB7fTtcbiAgfVxuICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdmaWxlJywgbnVsbCk7XG4gIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG59XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7XG4gICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICBmaWxlOiBhU291cmNlTWFwQ29uc3VtZXIuZmlsZSxcbiAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICB9KTtcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld01hcHBpbmcub3JpZ2luYWwgPSB7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBzb3VyY2VSZWxhdGl2ZSA9IHNvdXJjZUZpbGU7XG4gICAgICBpZiAoc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VSZWxhdGl2ZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdG9yLl9zb3VyY2VzLmhhcyhzb3VyY2VSZWxhdGl2ZSkpIHtcbiAgICAgICAgZ2VuZXJhdG9yLl9zb3VyY2VzLmFkZChzb3VyY2VSZWxhdGl2ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH07XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZ2VuZXJhdGVkJyk7XG4gICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICduYW1lJywgbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IFN0cmluZyhzb3VyY2UpO1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICAgIGlmICghdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9tYXBwaW5ncy5hZGQoe1xuICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAqIHJld3JpdHRlbiB1c2luZyB0aGUgc3VwcGxpZWQgc291cmNlIG1hcC4gTm90ZTogVGhlIHJlc29sdXRpb24gZm9yIHRoZVxuICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAqIEBwYXJhbSBhU291cmNlTWFwUGF0aCBPcHRpb25hbC4gVGhlIGRpcm5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBtYXBcbiAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gKiAgICAgICAgZGlyZWN0b3J5LCBhbmQgdGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZCBjb250YWlucyByZWxhdGl2ZSBzb3VyY2VcbiAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICB2YXIgc291cmNlRmlsZSA9IGFTb3VyY2VGaWxlO1xuICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgJ29yIHRoZSBzb3VyY2UgbWFwXFwncyBcImZpbGVcIiBwcm9wZXJ0eS4gQm90aCB3ZXJlIG9taXR0ZWQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc291cmNlRmlsZSA9IGFTb3VyY2VNYXBDb25zdW1lci5maWxlO1xuICAgIH1cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgLy8gTWFrZSBcInNvdXJjZUZpbGVcIiByZWxhdGl2ZSBpZiBhbiBhYnNvbHV0ZSBVcmwgaXMgcGFzc2VkLlxuICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgIH1cbiAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICB2YXIgbmV3U291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgdGhpcy5fbWFwcGluZ3MudW5zb3J0ZWRGb3JFYWNoKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgdmFyIG9yaWdpbmFsID0gYVNvdXJjZU1hcENvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFuZXdTb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH07XG5cbi8qKlxuICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gKlxuICogICAxLiBKdXN0IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gKiAgICAgIHRva2VuLlxuICpcbiAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICogaW4gdG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl92YWxpZGF0ZU1hcHBpbmcoYUdlbmVyYXRlZCwgYU9yaWdpbmFsLCBhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgLy8gV2hlbiBhT3JpZ2luYWwgaXMgdHJ1dGh5IGJ1dCBoYXMgZW1wdHkgdmFsdWVzIGZvciAubGluZSBhbmQgLmNvbHVtbixcbiAgICAvLyBpdCBpcyBtb3N0IGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IuIEluIHRoaXMgY2FzZSB3ZSB0aHJvdyBhIHZlcnlcbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIHRvIHRyeSB0byBndWlkZSB0aGVtIHRoZSByaWdodCB3YXkuXG4gICAgLy8gRm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyL3BvbHltZXItYnVuZGxlci9wdWxsLzUxOVxuICAgIGlmIChhT3JpZ2luYWwgJiYgdHlwZW9mIGFPcmlnaW5hbC5saW5lICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYU9yaWdpbmFsLmNvbHVtbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ29yaWdpbmFsLmxpbmUgYW5kIG9yaWdpbmFsLmNvbHVtbiBhcmUgbm90IG51bWJlcnMgLS0geW91IHByb2JhYmx5IG1lYW50IHRvIG9taXQgJyArXG4gICAgICAgICAgICAndGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50aXJlbHkgYW5kIG9ubHkgbWFwIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uIElmIHNvLCBwYXNzICcgK1xuICAgICAgICAgICAgJ251bGwgZm9yIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGluc3RlYWQgb2YgYW4gb2JqZWN0IHdpdGggZW1wdHkgb3IgbnVsbCB2YWx1ZXMuJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAvLyBDYXNlIDEuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbC5saW5lID4gMCAmJiBhT3JpZ2luYWwuY29sdW1uID49IDBcbiAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtYXBwaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCxcbiAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiB0byB0aGUgc3RyZWFtIG9mIGJhc2UgNjQgVkxRc1xuICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgIHZhciByZXN1bHQgPSAnJztcbiAgICB2YXIgbmV4dDtcbiAgICB2YXIgbWFwcGluZztcbiAgICB2YXIgbmFtZUlkeDtcbiAgICB2YXIgc291cmNlSWR4O1xuXG4gICAgdmFyIG1hcHBpbmdzID0gdGhpcy5fbWFwcGluZ3MudG9BcnJheSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgbWFwcGluZyA9IG1hcHBpbmdzW2ldO1xuICAgICAgbmV4dCA9ICcnXG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5leHQgKz0gJzsnO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgaWYgKCF1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmcsIG1hcHBpbmdzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0ICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlSWR4ID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKHNvdXJjZUlkeCAtIHByZXZpb3VzU291cmNlKTtcbiAgICAgICAgcHJldmlvdXNTb3VyY2UgPSBzb3VyY2VJZHg7XG5cbiAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTtcblxuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4pO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuYW1lSWR4ID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShuYW1lSWR4IC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICBwcmV2aW91c05hbWUgPSBuYW1lSWR4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCArPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFTb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cywga2V5KVxuICAgICAgICA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgIHZhciBtYXAgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICBuYW1lczogdGhpcy5fbmFtZXMudG9BcnJheSgpLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLl9maWxlICE9IG51bGwpIHtcbiAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvU3RyaW5nKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKTtcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qc1xuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICpcbiAqIEJhc2VkIG9uIHRoZSBCYXNlIDY0IFZMUSBpbXBsZW1lbnRhdGlvbiBpbiBDbG9zdXJlIENvbXBpbGVyOlxuICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jbG9zdXJlLWNvbXBpbGVyL3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL2NvbS9nb29nbGUvZGVidWdnaW5nL3NvdXJjZW1hcC9CYXNlNjRWTFEuamF2YVxuICpcbiAqIENvcHlyaWdodCAyMDExIFRoZSBDbG9zdXJlIENvbXBpbGVyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZFxuICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xuXG4vLyBBIHNpbmdsZSBiYXNlIDY0IGRpZ2l0IGNhbiBjb250YWluIDYgYml0cyBvZiBkYXRhLiBGb3IgdGhlIGJhc2UgNjQgdmFyaWFibGVcbi8vIGxlbmd0aCBxdWFudGl0aWVzIHdlIHVzZSBpbiB0aGUgc291cmNlIG1hcCBzcGVjLCB0aGUgZmlyc3QgYml0IGlzIHRoZSBzaWduLFxuLy8gdGhlIG5leHQgZm91ciBiaXRzIGFyZSB0aGUgYWN0dWFsIHZhbHVlLCBhbmQgdGhlIDZ0aCBiaXQgaXMgdGhlXG4vLyBjb250aW51YXRpb24gYml0LiBUaGUgY29udGludWF0aW9uIGJpdCB0ZWxscyB1cyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlXG4vLyBkaWdpdHMgaW4gdGhpcyB2YWx1ZSBmb2xsb3dpbmcgdGhpcyBkaWdpdC5cbi8vXG4vLyAgIENvbnRpbnVhdGlvblxuLy8gICB8ICAgIFNpZ25cbi8vICAgfCAgICB8XG4vLyAgIFYgICAgVlxuLy8gICAxMDEwMTFcblxudmFyIFZMUV9CQVNFX1NISUZUID0gNTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQkFTRSA9IDEgPDwgVkxRX0JBU0VfU0hJRlQ7XG5cbi8vIGJpbmFyeTogMDExMTExXG52YXIgVkxRX0JBU0VfTUFTSyA9IFZMUV9CQVNFIC0gMTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQ09OVElOVUFUSU9OX0JJVCA9IFZMUV9CQVNFO1xuXG4vKipcbiAqIENvbnZlcnRzIGZyb20gYSB0d28tY29tcGxlbWVudCB2YWx1ZSB0byBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDEgYmVjb21lcyAyICgxMCBiaW5hcnkpLCAtMSBiZWNvbWVzIDMgKDExIGJpbmFyeSlcbiAqICAgMiBiZWNvbWVzIDQgKDEwMCBiaW5hcnkpLCAtMiBiZWNvbWVzIDUgKDEwMSBiaW5hcnkpXG4gKi9cbmZ1bmN0aW9uIHRvVkxRU2lnbmVkKGFWYWx1ZSkge1xuICByZXR1cm4gYVZhbHVlIDwgMFxuICAgID8gKCgtYVZhbHVlKSA8PCAxKSArIDFcbiAgICA6IChhVmFsdWUgPDwgMSkgKyAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRvIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgZnJvbSBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDIgKDEwIGJpbmFyeSkgYmVjb21lcyAxLCAzICgxMSBiaW5hcnkpIGJlY29tZXMgLTFcbiAqICAgNCAoMTAwIGJpbmFyeSkgYmVjb21lcyAyLCA1ICgxMDEgYmluYXJ5KSBiZWNvbWVzIC0yXG4gKi9cbmZ1bmN0aW9uIGZyb21WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHZhciBpc05lZ2F0aXZlID0gKGFWYWx1ZSAmIDEpID09PSAxO1xuICB2YXIgc2hpZnRlZCA9IGFWYWx1ZSA+PiAxO1xuICByZXR1cm4gaXNOZWdhdGl2ZVxuICAgID8gLXNoaWZ0ZWRcbiAgICA6IHNoaWZ0ZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmFzZSA2NCBWTFEgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZW5jb2RlKGFWYWx1ZSkge1xuICB2YXIgZW5jb2RlZCA9IFwiXCI7XG4gIHZhciBkaWdpdDtcblxuICB2YXIgdmxxID0gdG9WTFFTaWduZWQoYVZhbHVlKTtcblxuICBkbyB7XG4gICAgZGlnaXQgPSB2bHEgJiBWTFFfQkFTRV9NQVNLO1xuICAgIHZscSA+Pj49IFZMUV9CQVNFX1NISUZUO1xuICAgIGlmICh2bHEgPiAwKSB7XG4gICAgICAvLyBUaGVyZSBhcmUgc3RpbGwgbW9yZSBkaWdpdHMgaW4gdGhpcyB2YWx1ZSwgc28gd2UgbXVzdCBtYWtlIHN1cmUgdGhlXG4gICAgICAvLyBjb250aW51YXRpb24gYml0IGlzIG1hcmtlZC5cbiAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUO1xuICAgIH1cbiAgICBlbmNvZGVkICs9IGJhc2U2NC5lbmNvZGUoZGlnaXQpO1xuICB9IHdoaWxlICh2bHEgPiAwKTtcblxuICByZXR1cm4gZW5jb2RlZDtcbn07XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgbmV4dCBiYXNlIDY0IFZMUSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgdGhlXG4gKiB2YWx1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB2aWEgdGhlIG91dCBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2RlY29kZShhU3RyLCBhSW5kZXgsIGFPdXRQYXJhbSkge1xuICB2YXIgc3RyTGVuID0gYVN0ci5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSAwO1xuICB2YXIgc2hpZnQgPSAwO1xuICB2YXIgY29udGludWF0aW9uLCBkaWdpdDtcblxuICBkbyB7XG4gICAgaWYgKGFJbmRleCA+PSBzdHJMZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG1vcmUgZGlnaXRzIGluIGJhc2UgNjQgVkxRIHZhbHVlLlwiKTtcbiAgICB9XG5cbiAgICBkaWdpdCA9IGJhc2U2NC5kZWNvZGUoYVN0ci5jaGFyQ29kZUF0KGFJbmRleCsrKSk7XG4gICAgaWYgKGRpZ2l0ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYXNlNjQgZGlnaXQ6IFwiICsgYVN0ci5jaGFyQXQoYUluZGV4IC0gMSkpO1xuICAgIH1cblxuICAgIGNvbnRpbnVhdGlvbiA9ICEhKGRpZ2l0ICYgVkxRX0NPTlRJTlVBVElPTl9CSVQpO1xuICAgIGRpZ2l0ICY9IFZMUV9CQVNFX01BU0s7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICsgKGRpZ2l0IDw8IHNoaWZ0KTtcbiAgICBzaGlmdCArPSBWTFFfQkFTRV9TSElGVDtcbiAgfSB3aGlsZSAoY29udGludWF0aW9uKTtcblxuICBhT3V0UGFyYW0udmFsdWUgPSBmcm9tVkxRU2lnbmVkKHJlc3VsdCk7XG4gIGFPdXRQYXJhbS5yZXN0ID0gYUluZGV4O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC12bHEuanNcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgaW50VG9DaGFyTWFwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLnNwbGl0KCcnKTtcblxuLyoqXG4gKiBFbmNvZGUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2Ugb2YgMCB0byA2MyB0byBhIHNpbmdsZSBiYXNlIDY0IGRpZ2l0LlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgaWYgKDAgPD0gbnVtYmVyICYmIG51bWJlciA8IGludFRvQ2hhck1hcC5sZW5ndGgpIHtcbiAgICByZXR1cm4gaW50VG9DaGFyTWFwW251bWJlcl07XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk11c3QgYmUgYmV0d2VlbiAwIGFuZCA2MzogXCIgKyBudW1iZXIpO1xufTtcblxuLyoqXG4gKiBEZWNvZGUgYSBzaW5nbGUgYmFzZSA2NCBjaGFyYWN0ZXIgY29kZSBkaWdpdCB0byBhbiBpbnRlZ2VyLiBSZXR1cm5zIC0xIG9uXG4gKiBmYWlsdXJlLlxuICovXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICB2YXIgYmlnQSA9IDY1OyAgICAgLy8gJ0EnXG4gIHZhciBiaWdaID0gOTA7ICAgICAvLyAnWidcblxuICB2YXIgbGl0dGxlQSA9IDk3OyAgLy8gJ2EnXG4gIHZhciBsaXR0bGVaID0gMTIyOyAvLyAneidcblxuICB2YXIgemVybyA9IDQ4OyAgICAgLy8gJzAnXG4gIHZhciBuaW5lID0gNTc7ICAgICAvLyAnOSdcblxuICB2YXIgcGx1cyA9IDQzOyAgICAgLy8gJysnXG4gIHZhciBzbGFzaCA9IDQ3OyAgICAvLyAnLydcblxuICB2YXIgbGl0dGxlT2Zmc2V0ID0gMjY7XG4gIHZhciBudW1iZXJPZmZzZXQgPSA1MjtcblxuICAvLyAwIC0gMjU6IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXG4gIGlmIChiaWdBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGJpZ1opIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gYmlnQSk7XG4gIH1cblxuICAvLyAyNiAtIDUxOiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxuICBpZiAobGl0dGxlQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBsaXR0bGVaKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIGxpdHRsZUEgKyBsaXR0bGVPZmZzZXQpO1xuICB9XG5cbiAgLy8gNTIgLSA2MTogMDEyMzQ1Njc4OVxuICBpZiAoemVybyA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBuaW5lKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIHplcm8gKyBudW1iZXJPZmZzZXQpO1xuICB9XG5cbiAgLy8gNjI6ICtcbiAgaWYgKGNoYXJDb2RlID09IHBsdXMpIHtcbiAgICByZXR1cm4gNjI7XG4gIH1cblxuICAvLyA2MzogL1xuICBpZiAoY2hhckNvZGUgPT0gc2xhc2gpIHtcbiAgICByZXR1cm4gNjM7XG4gIH1cblxuICAvLyBJbnZhbGlkIGJhc2U2NCBkaWdpdC5cbiAgcmV0dXJuIC0xO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC5qc1xuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXIvb3B0aW9uc1xuICogb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gYXJncyBUaGUgb2JqZWN0IHdlIGFyZSBleHRyYWN0aW5nIHZhbHVlcyBmcm9tXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2UgYXJlIGdldHRpbmcuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIEFuIG9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZ1xuICogZnJvbSB0aGUgb2JqZWN0LiBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nLCBhblxuICogZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIGdldEFyZyhhQXJncywgYU5hbWUsIGFEZWZhdWx0VmFsdWUpIHtcbiAgaWYgKGFOYW1lIGluIGFBcmdzKSB7XG4gICAgcmV0dXJuIGFBcmdzW2FOYW1lXTtcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgcmV0dXJuIGFEZWZhdWx0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhTmFtZSArICdcIiBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LicpO1xuICB9XG59XG5leHBvcnRzLmdldEFyZyA9IGdldEFyZztcblxudmFyIHVybFJlZ2V4cCA9IC9eKD86KFtcXHcrXFwtLl0rKTopP1xcL1xcLyg/OihcXHcrOlxcdyspQCk/KFtcXHcuLV0qKSg/OjooXFxkKykpPyguKikkLztcbnZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXFwsLiskLztcblxuZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICB2YXIgbWF0Y2ggPSBhVXJsLm1hdGNoKHVybFJlZ2V4cCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgYXV0aDogbWF0Y2hbMl0sXG4gICAgaG9zdDogbWF0Y2hbM10sXG4gICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV1cbiAgfTtcbn1cbmV4cG9ydHMudXJsUGFyc2UgPSB1cmxQYXJzZTtcblxuZnVuY3Rpb24gdXJsR2VuZXJhdGUoYVBhcnNlZFVybCkge1xuICB2YXIgdXJsID0gJyc7XG4gIGlmIChhUGFyc2VkVXJsLnNjaGVtZSkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnNjaGVtZSArICc6JztcbiAgfVxuICB1cmwgKz0gJy8vJztcbiAgaWYgKGFQYXJzZWRVcmwuYXV0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwuaG9zdCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucG9ydCkge1xuICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBhdGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5leHBvcnRzLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gKlxuICogLSBSZXBsYWNlcyBjb25zZWN1dGl2ZSBzbGFzaGVzIHdpdGggb25lIHNsYXNoLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnPGRpcj4vLi4nIHBhcnRzLlxuICpcbiAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciB1cmwgdG8gbm9ybWFsaXplLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemUoYVBhdGgpIHtcbiAgdmFyIHBhdGggPSBhUGF0aDtcbiAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgaWYgKHVybCkge1xuICAgIGlmICghdXJsLnBhdGgpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG4gICAgcGF0aCA9IHVybC5wYXRoO1xuICB9XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpO1xuXG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoL1xcLysvKTtcbiAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgaWYgKHBhcnQgPT09ICcnKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJsYW5rIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLiBUcnlpbmcgdG8gZ29cbiAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHJvb3QuXG4gICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApO1xuICAgICAgICB1cCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7XG4gICAgICAgIHVwLS07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gIH1cblxuICBpZiAodXJsKSB7XG4gICAgdXJsLnBhdGggPSBwYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZSh1cmwpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbi8qKlxuICogSm9pbnMgdHdvIHBhdGhzL1VSTHMuXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBqb2luZWQgd2l0aCB0aGUgcm9vdC5cbiAqXG4gKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICogICBzY2hlbWUtcmVsYXRpdmUgVVJMOiBUaGVuIHRoZSBzY2hlbWUgb2YgYVJvb3QsIGlmIGFueSwgaXMgcHJlcGVuZGVkXG4gKiAgIGZpcnN0LlxuICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gKiAgIGlzIHVwZGF0ZWQgd2l0aCB0aGUgcmVzdWx0IGFuZCBhUm9vdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXN1bHRcbiAqICAgaXMgcmV0dXJuZWQuXG4gKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gKiAgIC0gT3RoZXJ3aXNlIHRoZSB0d28gcGF0aHMgYXJlIGpvaW5lZCB3aXRoIGEgc2xhc2guXG4gKiAtIEpvaW5pbmcgZm9yIGV4YW1wbGUgJ2h0dHA6Ly8nIGFuZCAnd3d3LmV4YW1wbGUuY29tJyBpcyBhbHNvIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gam9pbihhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuICBpZiAoYVBhdGggPT09IFwiXCIpIHtcbiAgICBhUGF0aCA9IFwiLlwiO1xuICB9XG4gIHZhciBhUGF0aFVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdCA9IGFSb290VXJsLnBhdGggfHwgJy8nO1xuICB9XG5cbiAgLy8gYGpvaW4oZm9vLCAnLy93d3cuZXhhbXBsZS5vcmcnKWBcbiAgaWYgKGFQYXRoVXJsICYmICFhUGF0aFVybC5zY2hlbWUpIHtcbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFQYXRoVXJsLnNjaGVtZSA9IGFSb290VXJsLnNjaGVtZTtcbiAgICB9XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgfVxuXG4gIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkge1xuICAgIHJldHVybiBhUGF0aDtcbiAgfVxuXG4gIC8vIGBqb2luKCdodHRwOi8vJywgJ3d3dy5leGFtcGxlLmNvbScpYFxuICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuXG4gIHZhciBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgID8gYVBhdGhcbiAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdFVybC5wYXRoID0gam9pbmVkO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uIChhUGF0aCkge1xuICByZXR1cm4gYVBhdGguY2hhckF0KDApID09PSAnLycgfHwgdXJsUmVnZXhwLnRlc3QoYVBhdGgpO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICovXG5mdW5jdGlvbiByZWxhdGl2ZShhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuXG4gIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHBhdGggdG8gYmUgYWJvdmUgdGhlIHJvb3QuIEluIHRoaXMgY2FzZSwgc2ltcGx5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgdGhlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlIHBhdGggd29uJ3Qgd29yay4gSW5zdGVhZCwgd2VcbiAgLy8gbmVlZCB0byByZW1vdmUgY29tcG9uZW50cyBmcm9tIHRoZSByb290IG9uZSBieSBvbmUsIHVudGlsIGVpdGhlciB3ZSBmaW5kXG4gIC8vIGEgcHJlZml4IHRoYXQgZml0cywgb3Igd2UgcnVuIG91dCBvZiBjb21wb25lbnRzIHRvIHJlbW92ZS5cbiAgdmFyIGxldmVsID0gMDtcbiAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpICE9PSAwKSB7XG4gICAgdmFyIGluZGV4ID0gYVJvb3QubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb25seSBwYXJ0IG9mIHRoZSByb290IHRoYXQgaXMgbGVmdCBpcyB0aGUgc2NoZW1lIChpLmUuIGh0dHA6Ly8sXG4gICAgLy8gZmlsZTovLy8sIGV0Yy4pLCBvbmUgb3IgbW9yZSBzbGFzaGVzICgvKSwgb3Igc2ltcGx5IG5vdGhpbmcgYXQgYWxsLCB3ZVxuICAgIC8vIGhhdmUgZXhoYXVzdGVkIGFsbCBjb21wb25lbnRzLCBzbyB0aGUgcGF0aCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHJvb3QuXG4gICAgYVJvb3QgPSBhUm9vdC5zbGljZSgwLCBpbmRleCk7XG4gICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXFwvXSs6XFwvKT9cXC8qJC8pKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgKytsZXZlbDtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBhZGQgYSBcIi4uL1wiIGZvciBlYWNoIGNvbXBvbmVudCB3ZSByZW1vdmVkIGZyb20gdGhlIHJvb3QuXG4gIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4oXCIuLi9cIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7XG59XG5leHBvcnRzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG5cbnZhciBzdXBwb3J0c051bGxQcm90byA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gISgnX19wcm90b19fJyBpbiBvYmopO1xufSgpKTtcblxuZnVuY3Rpb24gaWRlbnRpdHkgKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogQmVjYXVzZSBiZWhhdmlvciBnb2VzIHdhY2t5IHdoZW4geW91IHNldCBgX19wcm90b19fYCBvbiBvYmplY3RzLCB3ZVxuICogaGF2ZSB0byBwcmVmaXggYWxsIHRoZSBzdHJpbmdzIGluIG91ciBzZXQgd2l0aCBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL3B1bGwvMzEgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8zMFxuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5mdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMudG9TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogdG9TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiBhU3RyLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLmZyb21TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogZnJvbVNldFN0cmluZztcblxuZnVuY3Rpb24gaXNQcm90b1N0cmluZyhzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBzLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOSAvKiBcIl9fcHJvdG9fX1wiLmxlbmd0aCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMSkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAyKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDMpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNCkgIT09IDExNiAvKiAndCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA1KSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDYpICE9PSAxMTQgLyogJ3InICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNykgIT09IDExMiAvKiAncCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA4KSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDkpICE9PSA5NSAgLyogJ18nICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IGxlbmd0aCAtIDEwOyBpID49IDA7IGktLSkge1xuICAgIGlmIChzLmNoYXJDb2RlQXQoaSkgIT09IDM2IC8qICckJyAqLykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4sIGJ1dCBkaWZmZXJlbnQgZ2VuZXJhdGVkXG4gKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICogc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gIHZhciBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zID0gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnM7XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGRlZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBpbmRpY2VzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uLCBidXQgZGlmZmVyZW50XG4gKiBzb3VyY2UvbmFtZS9vcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYVxuICogbWFwcGluZyB3aXRoIGEgc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZDtcblxuZnVuY3Rpb24gc3RyY21wKGFTdHIxLCBhU3RyMikge1xuICBpZiAoYVN0cjEgPT09IGFTdHIyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAoYVN0cjEgPT09IG51bGwpIHtcbiAgICByZXR1cm4gMTsgLy8gYVN0cjIgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMiA9PT0gbnVsbCkge1xuICAgIHJldHVybiAtMTsgLy8gYVN0cjEgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMSA+IGFTdHIyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGluZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBzdHJpbmdzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZDtcblxuLyoqXG4gKiBTdHJpcCBhbnkgSlNPTiBYU1NJIGF2b2lkYW5jZSBwcmVmaXggZnJvbSB0aGUgc3RyaW5nIChhcyBkb2N1bWVudGVkXG4gKiBpbiB0aGUgc291cmNlIG1hcHMgc3BlY2lmaWNhdGlvbiksIGFuZCB0aGVuIHBhcnNlIHRoZSBzdHJpbmcgYXNcbiAqIEpTT04uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU291cmNlTWFwSW5wdXQoc3RyKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKHN0ci5yZXBsYWNlKC9eXFwpXX0nW15cXG5dKlxcbi8sICcnKSk7XG59XG5leHBvcnRzLnBhcnNlU291cmNlTWFwSW5wdXQgPSBwYXJzZVNvdXJjZU1hcElucHV0O1xuXG4vKipcbiAqIENvbXB1dGUgdGhlIFVSTCBvZiBhIHNvdXJjZSBnaXZlbiB0aGUgdGhlIHNvdXJjZSByb290LCB0aGUgc291cmNlJ3NcbiAqIFVSTCwgYW5kIHRoZSBzb3VyY2UgbWFwJ3MgVVJMLlxuICovXG5mdW5jdGlvbiBjb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKSB7XG4gIHNvdXJjZVVSTCA9IHNvdXJjZVVSTCB8fCAnJztcblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIC8vIFRoaXMgZm9sbG93cyB3aGF0IENocm9tZSBkb2VzLlxuICAgIGlmIChzb3VyY2VSb290W3NvdXJjZVJvb3QubGVuZ3RoIC0gMV0gIT09ICcvJyAmJiBzb3VyY2VVUkxbMF0gIT09ICcvJykge1xuICAgICAgc291cmNlUm9vdCArPSAnLyc7XG4gICAgfVxuICAgIC8vIFRoZSBzcGVjIHNheXM6XG4gICAgLy8gICBMaW5lIDQ6IEFuIG9wdGlvbmFsIHNvdXJjZSByb290LCB1c2VmdWwgZm9yIHJlbG9jYXRpbmcgc291cmNlXG4gICAgLy8gICBmaWxlcyBvbiBhIHNlcnZlciBvciByZW1vdmluZyByZXBlYXRlZCB2YWx1ZXMgaW4gdGhlXG4gICAgLy8gICDigJxzb3VyY2Vz4oCdIGVudHJ5LiAgVGhpcyB2YWx1ZSBpcyBwcmVwZW5kZWQgdG8gdGhlIGluZGl2aWR1YWxcbiAgICAvLyAgIGVudHJpZXMgaW4gdGhlIOKAnHNvdXJjZeKAnSBmaWVsZC5cbiAgICBzb3VyY2VVUkwgPSBzb3VyY2VSb290ICsgc291cmNlVVJMO1xuICB9XG5cbiAgLy8gSGlzdG9yaWNhbGx5LCBTb3VyY2VNYXBDb25zdW1lciBkaWQgbm90IHRha2UgdGhlIHNvdXJjZU1hcFVSTCBhc1xuICAvLyBhIHBhcmFtZXRlci4gIFRoaXMgbW9kZSBpcyBzdGlsbCBzb21ld2hhdCBzdXBwb3J0ZWQsIHdoaWNoIGlzIHdoeVxuICAvLyB0aGlzIGNvZGUgYmxvY2sgaXMgY29uZGl0aW9uYWwuICBIb3dldmVyLCBpdCdzIHByZWZlcmFibGUgdG8gcGFzc1xuICAvLyB0aGUgc291cmNlIG1hcCBVUkwgdG8gU291cmNlTWFwQ29uc3VtZXIsIHNvIHRoYXQgdGhpcyBmdW5jdGlvblxuICAvLyBjYW4gaW1wbGVtZW50IHRoZSBzb3VyY2UgVVJMIHJlc29sdXRpb24gYWxnb3JpdGhtIGFzIG91dGxpbmVkIGluXG4gIC8vIHRoZSBzcGVjLiAgVGhpcyBibG9jayBpcyBiYXNpY2FsbHkgdGhlIGVxdWl2YWxlbnQgb2Y6XG4gIC8vICAgIG5ldyBVUkwoc291cmNlVVJMLCBzb3VyY2VNYXBVUkwpLnRvU3RyaW5nKClcbiAgLy8gLi4uIGV4Y2VwdCBpdCBhdm9pZHMgdXNpbmcgVVJMLCB3aGljaCB3YXNuJ3QgYXZhaWxhYmxlIGluIHRoZVxuICAvLyBvbGRlciByZWxlYXNlcyBvZiBub2RlIHN0aWxsIHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnkuXG4gIC8vXG4gIC8vIFRoZSBzcGVjIHNheXM6XG4gIC8vICAgSWYgdGhlIHNvdXJjZXMgYXJlIG5vdCBhYnNvbHV0ZSBVUkxzIGFmdGVyIHByZXBlbmRpbmcgb2YgdGhlXG4gIC8vICAg4oCcc291cmNlUm9vdOKAnSwgdGhlIHNvdXJjZXMgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZVxuICAvLyAgIFNvdXJjZU1hcCAobGlrZSByZXNvbHZpbmcgc2NyaXB0IHNyYyBpbiBhIGh0bWwgZG9jdW1lbnQpLlxuICBpZiAoc291cmNlTWFwVVJMKSB7XG4gICAgdmFyIHBhcnNlZCA9IHVybFBhcnNlKHNvdXJjZU1hcFVSTCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNvdXJjZU1hcFVSTCBjb3VsZCBub3QgYmUgcGFyc2VkXCIpO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLnBhdGgpIHtcbiAgICAgIC8vIFN0cmlwIHRoZSBsYXN0IHBhdGggY29tcG9uZW50LCBidXQga2VlcCB0aGUgXCIvXCIuXG4gICAgICB2YXIgaW5kZXggPSBwYXJzZWQucGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgcGFyc2VkLnBhdGggPSBwYXJzZWQucGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlVVJMID0gam9pbih1cmxHZW5lcmF0ZShwYXJzZWQpLCBzb3VyY2VVUkwpO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZShzb3VyY2VVUkwpO1xufVxuZXhwb3J0cy5jb21wdXRlU291cmNlVVJMID0gY29tcHV0ZVNvdXJjZVVSTDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL3V0aWwuanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2FycmF5LXNldC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICogcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG59XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG59XG5cbi8qKlxuICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAqXG4gKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgfTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICogY29weS5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCk7XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyYXk7XG59O1xuXG5leHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9tYXBwaW5nLWxpc3QuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICByZXR1cm4gc291cmNlTWFwLnNlY3Rpb25zICE9IG51bGxcbiAgICA/IG5ldyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKVxuICAgIDogbmV3IEJhc2ljU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcCA9IGZ1bmN0aW9uKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgcmV0dXJuIEJhc2ljU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8vIGBfX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmQgYF9fb3JpZ2luYWxNYXBwaW5nc2AgYXJlIGFycmF5cyB0aGF0IGhvbGQgdGhlXG4vLyBwYXJzZWQgbWFwcGluZyBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgbWFwJ3MgXCJtYXBwaW5nc1wiIGF0dHJpYnV0ZS4gVGhleVxuLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGdldHRlcnMgcmVzcGVjdGl2ZWx5LCBhbmQgd2Ugb25seSBwYXJzZSB0aGUgbWFwcGluZ3Ncbi8vIGFuZCBjcmVhdGUgdGhlc2UgYXJyYXlzIG9uY2UgcXVlcmllZCBmb3IgYSBzb3VyY2UgbG9jYXRpb24uIFdlIGp1bXAgdGhyb3VnaFxuLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nXG4vLyB0aGVtIGlzIGV4cGVuc2l2ZSwgc28gd2Ugb25seSB3YW50IHRvIGRvIGl0IGlmIHdlIG11c3QuXG4vL1xuLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybTpcbi8vXG4vLyAgICAge1xuLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIGdlbmVyYXRlZENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgc291cmNlOiBUaGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhpc1xuLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxMaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhpcyBjaHVuayBvZiBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBzeW1ib2wgd2hpY2ggZ2VuZXJhdGVkIHRoaXMgY2h1bmsgb2Zcbi8vICAgICAgICAgICAgIGNvZGUuXG4vLyAgICAgfVxuLy9cbi8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmVcbi8vIGBudWxsYC5cbi8vXG4vLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLlxuLy9cbi8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zLlxuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX2dlbmVyYXRlZE1hcHBpbmdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19vcmlnaW5hbE1hcHBpbmdzID0gbnVsbDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfb3JpZ2luYWxNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZSwgdGhpcy5fc291cmNlTWFwVVJMKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IE9wdGlvbmFsLiB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yKGFBcmdzKSB7XG4gICAgdmFyIGxpbmUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKTtcblxuICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gZXhhY3QgbWF0Y2gsIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kTWFwcGluZ1xuICAgIC8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hcHBpbmcgbGVzcyB0aGFuIHRoZSBuZWVkbGUuIEJ5XG4gICAgLy8gc2V0dGluZyBuZWVkbGUub3JpZ2luYWxDb2x1bW4gdG8gMCwgd2UgdGh1cyBmaW5kIHRoZSBsYXN0IG1hcHBpbmcgZm9yXG4gICAgLy8gdGhlIGdpdmVuIGxpbmUsIHByb3ZpZGVkIHN1Y2ggYSBtYXBwaW5nIGV4aXN0cy5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpLFxuICAgICAgb3JpZ2luYWxMaW5lOiBsaW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJywgMClcbiAgICB9O1xuXG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChuZWVkbGUuc291cmNlKTtcbiAgICBpZiAobmVlZGxlLnNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgbWFwcGluZ3MgPSBbXTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKGFBcmdzLmNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZTtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIGZvdW5kLiBTaW5jZVxuICAgICAgICAvLyBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGZvdW5kLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gb3JpZ2luYWxMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIHdlcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgLy8gU2luY2UgbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBsaW5lICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID09IG9yaWdpbmFsQ29sdW1uKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXBwaW5ncztcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2ggd2UgY2FuXG4gKiBxdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGZpbGUgcG9zaXRpb25zIGJ5IGdpdmluZyBpdCBhIGZpbGVcbiAqIHBvc2l0aW9uIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3JcbiAqIGFscmVhZHkgcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYywgc291cmNlIG1hcHMgaGF2ZSB0aGVcbiAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIHNvdXJjZXM6IEFuIGFycmF5IG9mIFVSTHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAqICAgLSBuYW1lczogQW4gYXJyYXkgb2YgaWRlbnRpZmllcnMgd2hpY2ggY2FuIGJlIHJlZmVycmVuY2VkIGJ5IGluZGl2aWR1YWwgbWFwcGluZ3MuXG4gKiAgIC0gc291cmNlUm9vdDogT3B0aW9uYWwuIFRoZSBVUkwgcm9vdCBmcm9tIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSByZWxhdGl2ZS5cbiAqICAgLSBzb3VyY2VzQ29udGVudDogT3B0aW9uYWwuIEFuIGFycmF5IG9mIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbWFwcGluZ3M6IEEgc3RyaW5nIG9mIGJhc2U2NCBWTFFzIHdoaWNoIGNvbnRhaW4gdGhlIGFjdHVhbCBtYXBwaW5ncy5cbiAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKlxuICogSGVyZSBpcyBhbiBleGFtcGxlIHNvdXJjZSBtYXAsIHRha2VuIGZyb20gdGhlIHNvdXJjZSBtYXAgc3BlY1swXTpcbiAqXG4gKiAgICAge1xuICogICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICBmaWxlOiBcIm91dC5qc1wiLFxuICogICAgICAgc291cmNlUm9vdCA6IFwiXCIsXG4gKiAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAqICAgICAgIG1hcHBpbmdzOiBcIkFBLEFCOztBQkNERTtcIlxuICogICAgIH1cbiAqXG4gKiBUaGUgc2Vjb25kIHBhcmFtZXRlciwgaWYgZ2l2ZW4sIGlzIGEgc3RyaW5nIHdob3NlIHZhbHVlIGlzIHRoZSBVUkxcbiAqIGF0IHdoaWNoIHRoZSBzb3VyY2UgbWFwIHdhcyBmb3VuZC4gIFRoaXMgVVJMIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGVcbiAqIHNvdXJjZXMgYXJyYXkuXG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IHV0aWwucGFyc2VTb3VyY2VNYXBJbnB1dChhU291cmNlTWFwKTtcbiAgfVxuXG4gIHZhciB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAndmVyc2lvbicpO1xuICB2YXIgc291cmNlcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXMnKTtcbiAgLy8gU2FzcyAzLjMgbGVhdmVzIG91dCB0aGUgJ25hbWVzJyBhcnJheSwgc28gd2UgZGV2aWF0ZSBmcm9tIHRoZSBzcGVjICh3aGljaFxuICAvLyByZXF1aXJlcyB0aGUgYXJyYXkpIHRvIHBsYXkgbmljZSBoZXJlLlxuICB2YXIgbmFtZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICduYW1lcycsIFtdKTtcbiAgdmFyIHNvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VSb290JywgbnVsbCk7XG4gIHZhciBzb3VyY2VzQ29udGVudCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXNDb250ZW50JywgbnVsbCk7XG4gIHZhciBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ21hcHBpbmdzJyk7XG4gIHZhciBmaWxlID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnZmlsZScsIG51bGwpO1xuXG4gIC8vIE9uY2UgYWdhaW4sIFNhc3MgZGV2aWF0ZXMgZnJvbSB0aGUgc3BlYyBhbmQgc3VwcGxpZXMgdGhlIHZlcnNpb24gYXMgYVxuICAvLyBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIsIHNvIHdlIHVzZSBsb29zZSBlcXVhbGl0eSBjaGVja2luZyBoZXJlLlxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIHNvdXJjZVJvb3QgPSB1dGlsLm5vcm1hbGl6ZShzb3VyY2VSb290KTtcbiAgfVxuXG4gIHNvdXJjZXMgPSBzb3VyY2VzXG4gICAgLm1hcChTdHJpbmcpXG4gICAgLy8gU29tZSBzb3VyY2UgbWFwcyBwcm9kdWNlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBsaWtlIFwiLi9mb28uanNcIiBpbnN0ZWFkIG9mXG4gICAgLy8gXCJmb28uanNcIi4gIE5vcm1hbGl6ZSB0aGVzZSBmaXJzdCBzbyB0aGF0IGZ1dHVyZSBjb21wYXJpc29ucyB3aWxsIHN1Y2NlZWQuXG4gICAgLy8gU2VlIGJ1Z3ppbC5sYS8xMDkwNzY4LlxuICAgIC5tYXAodXRpbC5ub3JtYWxpemUpXG4gICAgLy8gQWx3YXlzIGVuc3VyZSB0aGF0IGFic29sdXRlIHNvdXJjZXMgYXJlIGludGVybmFsbHkgc3RvcmVkIHJlbGF0aXZlIHRvXG4gICAgLy8gdGhlIHNvdXJjZSByb290LCBpZiB0aGUgc291cmNlIHJvb3QgaXMgYWJzb2x1dGUuIE5vdCBkb2luZyB0aGlzIHdvdWxkXG4gICAgLy8gYmUgcGFydGljdWxhcmx5IHByb2JsZW1hdGljIHdoZW4gdGhlIHNvdXJjZSByb290IGlzIGEgcHJlZml4IG9mIHRoZVxuICAgIC8vIHNvdXJjZSAodmFsaWQsIGJ1dCB3aHk/PykuIFNlZSBnaXRodWIgaXNzdWUgIzE5OSBhbmQgYnVnemlsLmxhLzExODg5ODIuXG4gICAgLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlUm9vdCAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlUm9vdCkgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZSlcbiAgICAgICAgPyB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZSlcbiAgICAgICAgOiBzb3VyY2U7XG4gICAgfSk7XG5cbiAgLy8gUGFzcyBgdHJ1ZWAgYmVsb3cgdG8gYWxsb3cgZHVwbGljYXRlIG5hbWVzIGFuZCBzb3VyY2VzLiBXaGlsZSBzb3VyY2UgbWFwc1xuICAvLyBhcmUgaW50ZW5kZWQgdG8gYmUgY29tcHJlc3NlZCBhbmQgZGVkdXBsaWNhdGVkLCB0aGUgVHlwZVNjcmlwdCBjb21waWxlclxuICAvLyBzb21ldGltZXMgZ2VuZXJhdGVzIHNvdXJjZSBtYXBzIHdpdGggZHVwbGljYXRlcyBpbiB0aGVtLiBTZWUgR2l0aHViIGlzc3VlXG4gIC8vICM3MiBhbmQgYnVnemlsLmxhLzg4OTQ5Mi5cbiAgdGhpcy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkobmFtZXMubWFwKFN0cmluZyksIHRydWUpO1xuICB0aGlzLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KHNvdXJjZXMsIHRydWUpO1xuXG4gIHRoaXMuX2Fic29sdXRlU291cmNlcyA9IHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gIH0pO1xuXG4gIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7XG4gIHRoaXMuc291cmNlc0NvbnRlbnQgPSBzb3VyY2VzQ29udGVudDtcbiAgdGhpcy5fbWFwcGluZ3MgPSBtYXBwaW5ncztcbiAgdGhpcy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgdGhpcy5maWxlID0gZmlsZTtcbn1cblxuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB0aGUgaW5kZXggb2YgYSBzb3VyY2UuICBSZXR1cm5zIC0xIGlmIG5vdFxuICogZm91bmQuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kU291cmNlSW5kZXggPSBmdW5jdGlvbihhU291cmNlKSB7XG4gIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgIHJlbGF0aXZlU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhyZWxhdGl2ZVNvdXJjZSkpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlcy5pbmRleE9mKHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIC8vIE1heWJlIGFTb3VyY2UgaXMgYW4gYWJzb2x1dGUgVVJMIGFzIHJldHVybmVkIGJ5IHxzb3VyY2VzfC4gIEluXG4gIC8vIHRoaXMgY2FzZSB3ZSBjYW4ndCBzaW1wbHkgdW5kbyB0aGUgdHJhbnNmb3JtLlxuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2Fic29sdXRlU291cmNlcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0aGlzLl9hYnNvbHV0ZVNvdXJjZXNbaV0gPT0gYVNvdXJjZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGZyb20gYSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKlxuICogQHBhcmFtIFNvdXJjZU1hcEdlbmVyYXRvciBhU291cmNlTWFwXG4gKiAgICAgICAgVGhlIHNvdXJjZSBtYXAgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLlxuICogQHBhcmFtIFN0cmluZyBhU291cmNlTWFwVVJMXG4gKiAgICAgICAgVGhlIFVSTCBhdCB3aGljaCB0aGUgc291cmNlIG1hcCBjYW4gYmUgZm91bmQgKG9wdGlvbmFsKVxuICogQHJldHVybnMgQmFzaWNTb3VyY2VNYXBDb25zdW1lclxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgICB2YXIgc21jID0gT2JqZWN0LmNyZWF0ZShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5cbiAgICB2YXIgbmFtZXMgPSBzbWMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX25hbWVzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgdmFyIHNvdXJjZXMgPSBzbWMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fc291cmNlcy50b0FycmF5KCksIHRydWUpO1xuICAgIHNtYy5zb3VyY2VSb290ID0gYVNvdXJjZU1hcC5fc291cmNlUm9vdDtcbiAgICBzbWMuc291cmNlc0NvbnRlbnQgPSBhU291cmNlTWFwLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KHNtYy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWMuc291cmNlUm9vdCk7XG4gICAgc21jLmZpbGUgPSBhU291cmNlTWFwLl9maWxlO1xuICAgIHNtYy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgICBzbWMuX2Fic29sdXRlU291cmNlcyA9IHNtYy5fc291cmNlcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNtYy5zb3VyY2VSb290LCBzLCBhU291cmNlTWFwVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fic29sdXRlU291cmNlcy5zbGljZSgpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyXG4gKiAgICAgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9vcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIGdlbmVyYXRlZExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgZ2VuZXJhdGVkQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MsXG4gICAgICBcImdlbmVyYXRlZExpbmVcIixcbiAgICAgIFwiZ2VuZXJhdGVkQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdzb3VyY2UnLCBudWxsKTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuYXQoc291cmNlKTtcbiAgICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwodGhpcy5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbmFtZScsIG51bGwpO1xuICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5hdChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbExpbmUnLCBudWxsKSxcbiAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIG5hbWU6IG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlOiBudWxsLFxuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIG5hbWU6IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgdGhlIHNvdXJjZSBjb250ZW50IGZvciBldmVyeSBzb3VyY2UgaW4gdGhlIHNvdXJjZVxuICogbWFwLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnQubGVuZ3RoID49IHRoaXMuX3NvdXJjZXMuc2l6ZSgpICYmXG4gICAgICAhdGhpcy5zb3VyY2VzQ29udGVudC5zb21lKGZ1bmN0aW9uIChzYykgeyByZXR1cm4gc2MgPT0gbnVsbDsgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChhU291cmNlKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbaW5kZXhdO1xuICAgIH1cblxuICAgIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIHVybDtcbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGxcbiAgICAgICAgJiYgKHVybCA9IHV0aWwudXJsUGFyc2UodGhpcy5zb3VyY2VSb290KSkpIHtcbiAgICAgIC8vIFhYWDogZmlsZTovLyBVUklzIGFuZCBhYnNvbHV0ZSBwYXRocyBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZm9yXG4gICAgICAvLyBtYW55IHVzZXJzLiBXZSBjYW4gaGVscCB0aGVtIG91dCB3aGVuIHRoZXkgZXhwZWN0IGZpbGU6Ly8gVVJJcyB0b1xuICAgICAgLy8gYmVoYXZlIGxpa2UgaXQgd291bGQgaWYgdGhleSB3ZXJlIHJ1bm5pbmcgYSBsb2NhbCBIVFRQIHNlcnZlci4gU2VlXG4gICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODU1OTcuXG4gICAgICB2YXIgZmlsZVVyaUFic1BhdGggPSByZWxhdGl2ZVNvdXJjZS5yZXBsYWNlKC9eZmlsZTpcXC9cXC8vLCBcIlwiKTtcbiAgICAgIGlmICh1cmwuc2NoZW1lID09IFwiZmlsZVwiXG4gICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoZmlsZVVyaUFic1BhdGgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihmaWxlVXJpQWJzUGF0aCldXG4gICAgICB9XG5cbiAgICAgIGlmICgoIXVybC5wYXRoIHx8IHVybC5wYXRoID09IFwiL1wiKVxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKFwiL1wiICsgcmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIHJlbGF0aXZlU291cmNlKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHJlY3Vyc2l2ZWx5IGZyb21cbiAgICAvLyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IuIEluIHRoYXQgY2FzZSwgd2VcbiAgICAvLyBkb24ndCB3YW50IHRvIHRocm93IGlmIHdlIGNhbid0IGZpbmQgdGhlIHNvdXJjZSAtIHdlIGp1c3Qgd2FudCB0b1xuICAgIC8vIHJldHVybiBudWxsLCBzbyB3ZSBwcm92aWRlIGEgZmxhZyB0byBleGl0IGdyYWNlZnVsbHkuXG4gICAgaWYgKG51bGxPbk1pc3NpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgcmVsYXRpdmVTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgc291cmNlID0gdGhpcy5fZmluZFNvdXJjZUluZGV4KHNvdXJjZSk7XG4gICAgaWYgKHNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoXG4gICAgICBuZWVkbGUsXG4gICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICB1dGlsLmdldEFyZyhhQXJncywgJ2JpYXMnLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORClcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gbmVlZGxlLnNvdXJjZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgIH07XG4gIH07XG5cbmV4cG9ydHMuQmFzaWNTb3VyY2VNYXBDb25zdW1lciA9IEJhc2ljU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQW4gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaFxuICogd2UgY2FuIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbi4gSXQgZGlmZmVycyBmcm9tIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5cbiAqIHRoYXQgaXQgdGFrZXMgXCJpbmRleGVkXCIgc291cmNlIG1hcHMgKGkuZS4gb25lcyB3aXRoIGEgXCJzZWN0aW9uc1wiIGZpZWxkKSBhc1xuICogaW5wdXQuXG4gKlxuICogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0I2hlYWRpbmc9aC41MzVlczN4ZXByZ3RcbiAqL1xuZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSwgYVNvdXJjZU1hcFVSTClcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICAvLyBGaW5kIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbiB3ZSdyZSB0cnlpbmcgdG8gbWFwXG4gICAgLy8gdG8gYW4gb3JpZ2luYWwgcG9zaXRpb24uXG4gICAgdmFyIHNlY3Rpb25JbmRleCA9IGJpbmFyeVNlYXJjaC5zZWFyY2gobmVlZGxlLCB0aGlzLl9zZWN0aW9ucyxcbiAgICAgIGZ1bmN0aW9uKG5lZWRsZSwgc2VjdGlvbikge1xuICAgICAgICB2YXIgY21wID0gbmVlZGxlLmdlbmVyYXRlZExpbmUgLSBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lO1xuICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgcmV0dXJuIGNtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAobmVlZGxlLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgIH0pO1xuICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcblxuICAgIGlmICghc2VjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIG5hbWU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlY3Rpb24uY29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICBsaW5lOiBuZWVkbGUuZ2VuZXJhdGVkTGluZSAtXG4gICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICBjb2x1bW46IG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmVcbiAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgOiAwKSxcbiAgICAgIGJpYXM6IGFBcmdzLmJpYXNcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWN0aW9ucy5ldmVyeShmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHMuY29uc3VtZXIuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKTtcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIHZhciBjb250ZW50ID0gc2VjdGlvbi5jb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIHRydWUpO1xuICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuIFxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIC8vIE9ubHkgY29uc2lkZXIgdGhpcyBzZWN0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgc291cmNlIGlzIGluIHRoZSBsaXN0IG9mXG4gICAgICAvLyBzb3VyY2VzIG9mIHRoZSBjb25zdW1lci5cbiAgICAgIGlmIChzZWN0aW9uLmNvbnN1bWVyLl9maW5kU291cmNlSW5kZXgodXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSkgPT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGdlbmVyYXRlZFBvc2l0aW9uID0gc2VjdGlvbi5jb25zdW1lci5nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncyk7XG4gICAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb24pIHtcbiAgICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWRQb3NpdGlvbi5jb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IGdlbmVyYXRlZFBvc2l0aW9uLmxpbmVcbiAgICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgICA6IDApXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fcGFyc2VNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuICAgICAgdmFyIHNlY3Rpb25NYXBwaW5ncyA9IHNlY3Rpb24uY29uc3VtZXIuX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWN0aW9uTWFwcGluZ3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSBzZWN0aW9uTWFwcGluZ3Nbal07XG5cbiAgICAgICAgdmFyIHNvdXJjZSA9IHNlY3Rpb24uY29uc3VtZXIuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc2VjdGlvbi5jb25zdW1lci5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgICAgIHZhciBuYW1lID0gbnVsbDtcbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmluYXJ5LXNlYXJjaC5qc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvcXVpY2stc29ydC5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdIHx8ICcnO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGFDaHVuaykge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgdmFyIGNodW5rO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICpcbiAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICB2YXIgbmV3Q2hpbGRyZW47XG4gIHZhciBpO1xuICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgfVxuICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gKlxuICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gIH07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gXCJcIjtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHN0ciArPSBjaHVuaztcbiAgfSk7XG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAqIG1hcC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICBjb2RlOiBcIlwiLFxuICAgIGxpbmU6IDEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG59O1xuXG5leHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW5vZGUuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define([], factory);
	else if(typeof exports === 'object')
		exports["sourceMap"] = factory();
	else
		root["sourceMap"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};

/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {

/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;

/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};

/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;

/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}


/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;

/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;

/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";

/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

	/*
	 * Copyright 2009-2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE.txt or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */
	exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
	exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;
	exports.SourceNode = __webpack_require__(10).SourceNode;


/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	var base64VLQ = __webpack_require__(2);
	var util = __webpack_require__(4);
	var ArraySet = __webpack_require__(5).ArraySet;
	var MappingList = __webpack_require__(6).MappingList;

	/**
	 * An instance of the SourceMapGenerator represents a source map which is
	 * being built incrementally. You may pass an object with the following
	 * properties:
	 *
	 *   - file: The filename of the generated source.
	 *   - sourceRoot: A root for all relative URLs in this source map.
	 */
	function SourceMapGenerator(aArgs) {
	  if (!aArgs) {
	    aArgs = {};
	  }
	  this._file = util.getArg(aArgs, 'file', null);
	  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
	  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
	  this._sources = new ArraySet();
	  this._names = new ArraySet();
	  this._mappings = new MappingList();
	  this._sourcesContents = null;
	}

	SourceMapGenerator.prototype._version = 3;

	/**
	 * Creates a new SourceMapGenerator based on a SourceMapConsumer
	 *
	 * @param aSourceMapConsumer The SourceMap.
	 */
	SourceMapGenerator.fromSourceMap =
	  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
	    var sourceRoot = aSourceMapConsumer.sourceRoot;
	    var generator = new SourceMapGenerator({
	      file: aSourceMapConsumer.file,
	      sourceRoot: sourceRoot
	    });
	    aSourceMapConsumer.eachMapping(function (mapping) {
	      var newMapping = {
	        generated: {
	          line: mapping.generatedLine,
	          column: mapping.generatedColumn
	        }
	      };

	      if (mapping.source != null) {
	        newMapping.source = mapping.source;
	        if (sourceRoot != null) {
	          newMapping.source = util.relative(sourceRoot, newMapping.source);
	        }

	        newMapping.original = {
	          line: mapping.originalLine,
	          column: mapping.originalColumn
	        };

	        if (mapping.name != null) {
	          newMapping.name = mapping.name;
	        }
	      }

	      generator.addMapping(newMapping);
	    });
	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
	      var sourceRelative = sourceFile;
	      if (sourceRoot !== null) {
	        sourceRelative = util.relative(sourceRoot, sourceFile);
	      }

	      if (!generator._sources.has(sourceRelative)) {
	        generator._sources.add(sourceRelative);
	      }

	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
	      if (content != null) {
	        generator.setSourceContent(sourceFile, content);
	      }
	    });
	    return generator;
	  };

	/**
	 * Add a single mapping from original source line and column to the generated
	 * source's line and column for this source map being created. The mapping
	 * object should have the following properties:
	 *
	 *   - generated: An object with the generated line and column positions.
	 *   - original: An object with the original line and column positions.
	 *   - source: The original source file (relative to the sourceRoot).
	 *   - name: An optional original token name for this mapping.
	 */
	SourceMapGenerator.prototype.addMapping =
	  function SourceMapGenerator_addMapping(aArgs) {
	    var generated = util.getArg(aArgs, 'generated');
	    var original = util.getArg(aArgs, 'original', null);
	    var source = util.getArg(aArgs, 'source', null);
	    var name = util.getArg(aArgs, 'name', null);

	    if (!this._skipValidation) {
	      this._validateMapping(generated, original, source, name);
	    }

	    if (source != null) {
	      source = String(source);
	      if (!this._sources.has(source)) {
	        this._sources.add(source);
	      }
	    }

	    if (name != null) {
	      name = String(name);
	      if (!this._names.has(name)) {
	        this._names.add(name);
	      }
	    }

	    this._mappings.add({
	      generatedLine: generated.line,
	      generatedColumn: generated.column,
	      originalLine: original != null && original.line,
	      originalColumn: original != null && original.column,
	      source: source,
	      name: name
	    });
	  };

	/**
	 * Set the source content for a source file.
	 */
	SourceMapGenerator.prototype.setSourceContent =
	  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
	    var source = aSourceFile;
	    if (this._sourceRoot != null) {
	      source = util.relative(this._sourceRoot, source);
	    }

	    if (aSourceContent != null) {
	      // Add the source content to the _sourcesContents map.
	      // Create a new _sourcesContents map if the property is null.
	      if (!this._sourcesContents) {
	        this._sourcesContents = Object.create(null);
	      }
	      this._sourcesContents[util.toSetString(source)] = aSourceContent;
	    } else if (this._sourcesContents) {
	      // Remove the source file from the _sourcesContents map.
	      // If the _sourcesContents map is empty, set the property to null.
	      delete this._sourcesContents[util.toSetString(source)];
	      if (Object.keys(this._sourcesContents).length === 0) {
	        this._sourcesContents = null;
	      }
	    }
	  };

	/**
	 * Applies the mappings of a sub-source-map for a specific source file to the
	 * source map being generated. Each mapping to the supplied source file is
	 * rewritten using the supplied source map. Note: The resolution for the
	 * resulting mappings is the minimium of this map and the supplied map.
	 *
	 * @param aSourceMapConsumer The source map to be applied.
	 * @param aSourceFile Optional. The filename of the source file.
	 *        If omitted, SourceMapConsumer's file property will be used.
	 * @param aSourceMapPath Optional. The dirname of the path to the source map
	 *        to be applied. If relative, it is relative to the SourceMapConsumer.
	 *        This parameter is needed when the two source maps aren't in the same
	 *        directory, and the source map to be applied contains relative source
	 *        paths. If so, those relative source paths need to be rewritten
	 *        relative to the SourceMapGenerator.
	 */
	SourceMapGenerator.prototype.applySourceMap =
	  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
	    var sourceFile = aSourceFile;
	    // If aSourceFile is omitted, we will use the file property of the SourceMap
	    if (aSourceFile == null) {
	      if (aSourceMapConsumer.file == null) {
	        throw new Error(
	          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
	          'or the source map\'s "file" property. Both were omitted.'
	        );
	      }
	      sourceFile = aSourceMapConsumer.file;
	    }
	    var sourceRoot = this._sourceRoot;
	    // Make "sourceFile" relative if an absolute Url is passed.
	    if (sourceRoot != null) {
	      sourceFile = util.relative(sourceRoot, sourceFile);
	    }
	    // Applying the SourceMap can add and remove items from the sources and
	    // the names array.
	    var newSources = new ArraySet();
	    var newNames = new ArraySet();

	    // Find mappings for the "sourceFile"
	    this._mappings.unsortedForEach(function (mapping) {
	      if (mapping.source === sourceFile && mapping.originalLine != null) {
	        // Check if it can be mapped by the source map, then update the mapping.
	        var original = aSourceMapConsumer.originalPositionFor({
	          line: mapping.originalLine,
	          column: mapping.originalColumn
	        });
	        if (original.source != null) {
	          // Copy mapping
	          mapping.source = original.source;
	          if (aSourceMapPath != null) {
	            mapping.source = util.join(aSourceMapPath, mapping.source)
	          }
	          if (sourceRoot != null) {
	            mapping.source = util.relative(sourceRoot, mapping.source);
	          }
	          mapping.originalLine = original.line;
	          mapping.originalColumn = original.column;
	          if (original.name != null) {
	            mapping.name = original.name;
	          }
	        }
	      }

	      var source = mapping.source;
	      if (source != null && !newSources.has(source)) {
	        newSources.add(source);
	      }

	      var name = mapping.name;
	      if (name != null && !newNames.has(name)) {
	        newNames.add(name);
	      }

	    }, this);
	    this._sources = newSources;
	    this._names = newNames;

	    // Copy sourcesContents of applied map.
	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
	      if (content != null) {
	        if (aSourceMapPath != null) {
	          sourceFile = util.join(aSourceMapPath, sourceFile);
	        }
	        if (sourceRoot != null) {
	          sourceFile = util.relative(sourceRoot, sourceFile);
	        }
	        this.setSourceContent(sourceFile, content);
	      }
	    }, this);
	  };

	/**
	 * A mapping can have one of the three levels of data:
	 *
	 *   1. Just the generated position.
	 *   2. The Generated position, original position, and original source.
	 *   3. Generated and original position, original source, as well as a name
	 *      token.
	 *
	 * To maintain consistency, we validate that any new mapping being added falls
	 * in to one of these categories.
	 */
	SourceMapGenerator.prototype._validateMapping =
	  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
	                                              aName) {
	    // When aOriginal is truthy but has empty values for .line and .column,
	    // it is most likely a programmer error. In this case we throw a very
	    // specific error message to try to guide them the right way.
	    // For example: https://github.com/Polymer/polymer-bundler/pull/519
	    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
	        throw new Error(
	            'original.line and original.column are not numbers -- you probably meant to omit ' +
	            'the original mapping entirely and only map the generated position. If so, pass ' +
	            'null for the original mapping instead of an object with empty or null values.'
	        );
	    }

	    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
	        && aGenerated.line > 0 && aGenerated.column >= 0
	        && !aOriginal && !aSource && !aName) {
	      // Case 1.
	      return;
	    }
	    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
	             && aOriginal && 'line' in aOriginal && 'column' in aOriginal
	             && aGenerated.line > 0 && aGenerated.column >= 0
	             && aOriginal.line > 0 && aOriginal.column >= 0
	             && aSource) {
	      // Cases 2 and 3.
	      return;
	    }
	    else {
	      throw new Error('Invalid mapping: ' + JSON.stringify({
	        generated: aGenerated,
	        source: aSource,
	        original: aOriginal,
	        name: aName
	      }));
	    }
	  };

	/**
	 * Serialize the accumulated mappings in to the stream of base 64 VLQs
	 * specified by the source map format.
	 */
	SourceMapGenerator.prototype._serializeMappings =
	  function SourceMapGenerator_serializeMappings() {
	    var previousGeneratedColumn = 0;
	    var previousGeneratedLine = 1;
	    var previousOriginalColumn = 0;
	    var previousOriginalLine = 0;
	    var previousName = 0;
	    var previousSource = 0;
	    var result = '';
	    var next;
	    var mapping;
	    var nameIdx;
	    var sourceIdx;

	    var mappings = this._mappings.toArray();
	    for (var i = 0, len = mappings.length; i < len; i++) {
	      mapping = mappings[i];
	      next = ''

	      if (mapping.generatedLine !== previousGeneratedLine) {
	        previousGeneratedColumn = 0;
	        while (mapping.generatedLine !== previousGeneratedLine) {
	          next += ';';
	          previousGeneratedLine++;
	        }
	      }
	      else {
	        if (i > 0) {
	          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
	            continue;
	          }
	          next += ',';
	        }
	      }

	      next += base64VLQ.encode(mapping.generatedColumn
	                                 - previousGeneratedColumn);
	      previousGeneratedColumn = mapping.generatedColumn;

	      if (mapping.source != null) {
	        sourceIdx = this._sources.indexOf(mapping.source);
	        next += base64VLQ.encode(sourceIdx - previousSource);
	        previousSource = sourceIdx;

	        // lines are stored 0-based in SourceMap spec version 3
	        next += base64VLQ.encode(mapping.originalLine - 1
	                                   - previousOriginalLine);
	        previousOriginalLine = mapping.originalLine - 1;

	        next += base64VLQ.encode(mapping.originalColumn
	                                   - previousOriginalColumn);
	        previousOriginalColumn = mapping.originalColumn;

	        if (mapping.name != null) {
	          nameIdx = this._names.indexOf(mapping.name);
	          next += base64VLQ.encode(nameIdx - previousName);
	          previousName = nameIdx;
	        }
	      }

	      result += next;
	    }

	    return result;
	  };

	SourceMapGenerator.prototype._generateSourcesContent =
	  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
	    return aSources.map(function (source) {
	      if (!this._sourcesContents) {
	        return null;
	      }
	      if (aSourceRoot != null) {
	        source = util.relative(aSourceRoot, source);
	      }
	      var key = util.toSetString(source);
	      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
	        ? this._sourcesContents[key]
	        : null;
	    }, this);
	  };

	/**
	 * Externalize the source map.
	 */
	SourceMapGenerator.prototype.toJSON =
	  function SourceMapGenerator_toJSON() {
	    var map = {
	      version: this._version,
	      sources: this._sources.toArray(),
	      names: this._names.toArray(),
	      mappings: this._serializeMappings()
	    };
	    if (this._file != null) {
	      map.file = this._file;
	    }
	    if (this._sourceRoot != null) {
	      map.sourceRoot = this._sourceRoot;
	    }
	    if (this._sourcesContents) {
	      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
	    }

	    return map;
	  };

	/**
	 * Render the source map being generated to a string.
	 */
	SourceMapGenerator.prototype.toString =
	  function SourceMapGenerator_toString() {
	    return JSON.stringify(this.toJSON());
	  };

	exports.SourceMapGenerator = SourceMapGenerator;


/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 *
	 * Based on the Base 64 VLQ implementation in Closure Compiler:
	 * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
	 *
	 * Copyright 2011 The Closure Compiler Authors. All rights reserved.
	 * Redistribution and use in source and binary forms, with or without
	 * modification, are permitted provided that the following conditions are
	 * met:
	 *
	 *  * Redistributions of source code must retain the above copyright
	 *    notice, this list of conditions and the following disclaimer.
	 *  * Redistributions in binary form must reproduce the above
	 *    copyright notice, this list of conditions and the following
	 *    disclaimer in the documentation and/or other materials provided
	 *    with the distribution.
	 *  * Neither the name of Google Inc. nor the names of its
	 *    contributors may be used to endorse or promote products derived
	 *    from this software without specific prior written permission.
	 *
	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
	 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
	 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
	 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
	 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
	 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
	 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
	 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
	 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
	 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
	 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
	 */

	var base64 = __webpack_require__(3);

	// A single base 64 digit can contain 6 bits of data. For the base 64 variable
	// length quantities we use in the source map spec, the first bit is the sign,
	// the next four bits are the actual value, and the 6th bit is the
	// continuation bit. The continuation bit tells us whether there are more
	// digits in this value following this digit.
	//
	//   Continuation
	//   |    Sign
	//   |    |
	//   V    V
	//   101011

	var VLQ_BASE_SHIFT = 5;

	// binary: 100000
	var VLQ_BASE = 1 << VLQ_BASE_SHIFT;

	// binary: 011111
	var VLQ_BASE_MASK = VLQ_BASE - 1;

	// binary: 100000
	var VLQ_CONTINUATION_BIT = VLQ_BASE;

	/**
	 * Converts from a two-complement value to a value where the sign bit is
	 * placed in the least significant bit.  For example, as decimals:
	 *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
	 *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
	 */
	function toVLQSigned(aValue) {
	  return aValue < 0
	    ? ((-aValue) << 1) + 1
	    : (aValue << 1) + 0;
	}

	/**
	 * Converts to a two-complement value from a value where the sign bit is
	 * placed in the least significant bit.  For example, as decimals:
	 *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1
	 *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2
	 */
	function fromVLQSigned(aValue) {
	  var isNegative = (aValue & 1) === 1;
	  var shifted = aValue >> 1;
	  return isNegative
	    ? -shifted
	    : shifted;
	}

	/**
	 * Returns the base 64 VLQ encoded value.
	 */
	exports.encode = function base64VLQ_encode(aValue) {
	  var encoded = "";
	  var digit;

	  var vlq = toVLQSigned(aValue);

	  do {
	    digit = vlq & VLQ_BASE_MASK;
	    vlq >>>= VLQ_BASE_SHIFT;
	    if (vlq > 0) {
	      // There are still more digits in this value, so we must make sure the
	      // continuation bit is marked.
	      digit |= VLQ_CONTINUATION_BIT;
	    }
	    encoded += base64.encode(digit);
	  } while (vlq > 0);

	  return encoded;
	};

	/**
	 * Decodes the next base 64 VLQ value from the given string and returns the
	 * value and the rest of the string via the out parameter.
	 */
	exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
	  var strLen = aStr.length;
	  var result = 0;
	  var shift = 0;
	  var continuation, digit;

	  do {
	    if (aIndex >= strLen) {
	      throw new Error("Expected more digits in base 64 VLQ value.");
	    }

	    digit = base64.decode(aStr.charCodeAt(aIndex++));
	    if (digit === -1) {
	      throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
	    }

	    continuation = !!(digit & VLQ_CONTINUATION_BIT);
	    digit &= VLQ_BASE_MASK;
	    result = result + (digit << shift);
	    shift += VLQ_BASE_SHIFT;
	  } while (continuation);

	  aOutParam.value = fromVLQSigned(result);
	  aOutParam.rest = aIndex;
	};


/***/ }),
/* 3 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');

	/**
	 * Encode an integer in the range of 0 to 63 to a single base 64 digit.
	 */
	exports.encode = function (number) {
	  if (0 <= number && number < intToCharMap.length) {
	    return intToCharMap[number];
	  }
	  throw new TypeError("Must be between 0 and 63: " + number);
	};

	/**
	 * Decode a single base 64 character code digit to an integer. Returns -1 on
	 * failure.
	 */
	exports.decode = function (charCode) {
	  var bigA = 65;     // 'A'
	  var bigZ = 90;     // 'Z'

	  var littleA = 97;  // 'a'
	  var littleZ = 122; // 'z'

	  var zero = 48;     // '0'
	  var nine = 57;     // '9'

	  var plus = 43;     // '+'
	  var slash = 47;    // '/'

	  var littleOffset = 26;
	  var numberOffset = 52;

	  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
	  if (bigA <= charCode && charCode <= bigZ) {
	    return (charCode - bigA);
	  }

	  // 26 - 51: abcdefghijklmnopqrstuvwxyz
	  if (littleA <= charCode && charCode <= littleZ) {
	    return (charCode - littleA + littleOffset);
	  }

	  // 52 - 61: 0123456789
	  if (zero <= charCode && charCode <= nine) {
	    return (charCode - zero + numberOffset);
	  }

	  // 62: +
	  if (charCode == plus) {
	    return 62;
	  }

	  // 63: /
	  if (charCode == slash) {
	    return 63;
	  }

	  // Invalid base64 digit.
	  return -1;
	};


/***/ }),
/* 4 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	/**
	 * This is a helper function for getting values from parameter/options
	 * objects.
	 *
	 * @param args The object we are extracting values from
	 * @param name The name of the property we are getting.
	 * @param defaultValue An optional value to return if the property is missing
	 * from the object. If this is not specified and the property is missing, an
	 * error will be thrown.
	 */
	function getArg(aArgs, aName, aDefaultValue) {
	  if (aName in aArgs) {
	    return aArgs[aName];
	  } else if (arguments.length === 3) {
	    return aDefaultValue;
	  } else {
	    throw new Error('"' + aName + '" is a required argument.');
	  }
	}
	exports.getArg = getArg;

	var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
	var dataUrlRegexp = /^data:.+\,.+$/;

	function urlParse(aUrl) {
	  var match = aUrl.match(urlRegexp);
	  if (!match) {
	    return null;
	  }
	  return {
	    scheme: match[1],
	    auth: match[2],
	    host: match[3],
	    port: match[4],
	    path: match[5]
	  };
	}
	exports.urlParse = urlParse;

	function urlGenerate(aParsedUrl) {
	  var url = '';
	  if (aParsedUrl.scheme) {
	    url += aParsedUrl.scheme + ':';
	  }
	  url += '//';
	  if (aParsedUrl.auth) {
	    url += aParsedUrl.auth + '@';
	  }
	  if (aParsedUrl.host) {
	    url += aParsedUrl.host;
	  }
	  if (aParsedUrl.port) {
	    url += ":" + aParsedUrl.port
	  }
	  if (aParsedUrl.path) {
	    url += aParsedUrl.path;
	  }
	  return url;
	}
	exports.urlGenerate = urlGenerate;

	/**
	 * Normalizes a path, or the path portion of a URL:
	 *
	 * - Replaces consecutive slashes with one slash.
	 * - Removes unnecessary '.' parts.
	 * - Removes unnecessary '<dir>/..' parts.
	 *
	 * Based on code in the Node.js 'path' core module.
	 *
	 * @param aPath The path or url to normalize.
	 */
	function normalize(aPath) {
	  var path = aPath;
	  var url = urlParse(aPath);
	  if (url) {
	    if (!url.path) {
	      return aPath;
	    }
	    path = url.path;
	  }
	  var isAbsolute = exports.isAbsolute(path);

	  var parts = path.split(/\/+/);
	  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
	    part = parts[i];
	    if (part === '.') {
	      parts.splice(i, 1);
	    } else if (part === '..') {
	      up++;
	    } else if (up > 0) {
	      if (part === '') {
	        // The first part is blank if the path is absolute. Trying to go
	        // above the root is a no-op. Therefore we can remove all '..' parts
	        // directly after the root.
	        parts.splice(i + 1, up);
	        up = 0;
	      } else {
	        parts.splice(i, 2);
	        up--;
	      }
	    }
	  }
	  path = parts.join('/');

	  if (path === '') {
	    path = isAbsolute ? '/' : '.';
	  }

	  if (url) {
	    url.path = path;
	    return urlGenerate(url);
	  }
	  return path;
	}
	exports.normalize = normalize;

	/**
	 * Joins two paths/URLs.
	 *
	 * @param aRoot The root path or URL.
	 * @param aPath The path or URL to be joined with the root.
	 *
	 * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
	 *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended
	 *   first.
	 * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
	 *   is updated with the result and aRoot is returned. Otherwise the result
	 *   is returned.
	 *   - If aPath is absolute, the result is aPath.
	 *   - Otherwise the two paths are joined with a slash.
	 * - Joining for example 'http://' and 'www.example.com' is also supported.
	 */
	function join(aRoot, aPath) {
	  if (aRoot === "") {
	    aRoot = ".";
	  }
	  if (aPath === "") {
	    aPath = ".";
	  }
	  var aPathUrl = urlParse(aPath);
	  var aRootUrl = urlParse(aRoot);
	  if (aRootUrl) {
	    aRoot = aRootUrl.path || '/';
	  }

	  // `join(foo, '//www.example.org')`
	  if (aPathUrl && !aPathUrl.scheme) {
	    if (aRootUrl) {
	      aPathUrl.scheme = aRootUrl.scheme;
	    }
	    return urlGenerate(aPathUrl);
	  }

	  if (aPathUrl || aPath.match(dataUrlRegexp)) {
	    return aPath;
	  }

	  // `join('http://', 'www.example.com')`
	  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
	    aRootUrl.host = aPath;
	    return urlGenerate(aRootUrl);
	  }

	  var joined = aPath.charAt(0) === '/'
	    ? aPath
	    : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);

	  if (aRootUrl) {
	    aRootUrl.path = joined;
	    return urlGenerate(aRootUrl);
	  }
	  return joined;
	}
	exports.join = join;

	exports.isAbsolute = function (aPath) {
	  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
	};

	/**
	 * Make a path relative to a URL or another path.
	 *
	 * @param aRoot The root path or URL.
	 * @param aPath The path or URL to be made relative to aRoot.
	 */
	function relative(aRoot, aPath) {
	  if (aRoot === "") {
	    aRoot = ".";
	  }

	  aRoot = aRoot.replace(/\/$/, '');

	  // It is possible for the path to be above the root. In this case, simply
	  // checking whether the root is a prefix of the path won't work. Instead, we
	  // need to remove components from the root one by one, until either we find
	  // a prefix that fits, or we run out of components to remove.
	  var level = 0;
	  while (aPath.indexOf(aRoot + '/') !== 0) {
	    var index = aRoot.lastIndexOf("/");
	    if (index < 0) {
	      return aPath;
	    }

	    // If the only part of the root that is left is the scheme (i.e. http://,
	    // file:///, etc.), one or more slashes (/), or simply nothing at all, we
	    // have exhausted all components, so the path is not relative to the root.
	    aRoot = aRoot.slice(0, index);
	    if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
	      return aPath;
	    }

	    ++level;
	  }

	  // Make sure we add a "../" for each component we removed from the root.
	  return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
	}
	exports.relative = relative;

	var supportsNullProto = (function () {
	  var obj = Object.create(null);
	  return !('__proto__' in obj);
	}());

	function identity (s) {
	  return s;
	}

	/**
	 * Because behavior goes wacky when you set `__proto__` on objects, we
	 * have to prefix all the strings in our set with an arbitrary character.
	 *
	 * See https://github.com/mozilla/source-map/pull/31 and
	 * https://github.com/mozilla/source-map/issues/30
	 *
	 * @param String aStr
	 */
	function toSetString(aStr) {
	  if (isProtoString(aStr)) {
	    return '$' + aStr;
	  }

	  return aStr;
	}
	exports.toSetString = supportsNullProto ? identity : toSetString;

	function fromSetString(aStr) {
	  if (isProtoString(aStr)) {
	    return aStr.slice(1);
	  }

	  return aStr;
	}
	exports.fromSetString = supportsNullProto ? identity : fromSetString;

	function isProtoString(s) {
	  if (!s) {
	    return false;
	  }

	  var length = s.length;

	  if (length < 9 /* "__proto__".length */) {
	    return false;
	  }

	  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||
	      s.charCodeAt(length - 2) !== 95  /* '_' */ ||
	      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
	      s.charCodeAt(length - 4) !== 116 /* 't' */ ||
	      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
	      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
	      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
	      s.charCodeAt(length - 8) !== 95  /* '_' */ ||
	      s.charCodeAt(length - 9) !== 95  /* '_' */) {
	    return false;
	  }

	  for (var i = length - 10; i >= 0; i--) {
	    if (s.charCodeAt(i) !== 36 /* '$' */) {
	      return false;
	    }
	  }

	  return true;
	}

	/**
	 * Comparator between two mappings where the original positions are compared.
	 *
	 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
	 * mappings with the same original source/line/column, but different generated
	 * line and column the same. Useful when searching for a mapping with a
	 * stubbed out mapping.
	 */
	function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
	  var cmp = strcmp(mappingA.source, mappingB.source);
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.originalLine - mappingB.originalLine;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.originalColumn - mappingB.originalColumn;
	  if (cmp !== 0 || onlyCompareOriginal) {
	    return cmp;
	  }

	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.generatedLine - mappingB.generatedLine;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  return strcmp(mappingA.name, mappingB.name);
	}
	exports.compareByOriginalPositions = compareByOriginalPositions;

	/**
	 * Comparator between two mappings with deflated source and name indices where
	 * the generated positions are compared.
	 *
	 * Optionally pass in `true` as `onlyCompareGenerated` to consider two
	 * mappings with the same generated line and column, but different
	 * source/name/original line and column the same. Useful when searching for a
	 * mapping with a stubbed out mapping.
	 */
	function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
	  var cmp = mappingA.generatedLine - mappingB.generatedLine;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
	  if (cmp !== 0 || onlyCompareGenerated) {
	    return cmp;
	  }

	  cmp = strcmp(mappingA.source, mappingB.source);
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.originalLine - mappingB.originalLine;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.originalColumn - mappingB.originalColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  return strcmp(mappingA.name, mappingB.name);
	}
	exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;

	function strcmp(aStr1, aStr2) {
	  if (aStr1 === aStr2) {
	    return 0;
	  }

	  if (aStr1 === null) {
	    return 1; // aStr2 !== null
	  }

	  if (aStr2 === null) {
	    return -1; // aStr1 !== null
	  }

	  if (aStr1 > aStr2) {
	    return 1;
	  }

	  return -1;
	}

	/**
	 * Comparator between two mappings with inflated source and name strings where
	 * the generated positions are compared.
	 */
	function compareByGeneratedPositionsInflated(mappingA, mappingB) {
	  var cmp = mappingA.generatedLine - mappingB.generatedLine;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.generatedColumn - mappingB.generatedColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = strcmp(mappingA.source, mappingB.source);
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.originalLine - mappingB.originalLine;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  cmp = mappingA.originalColumn - mappingB.originalColumn;
	  if (cmp !== 0) {
	    return cmp;
	  }

	  return strcmp(mappingA.name, mappingB.name);
	}
	exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;

	/**
	 * Strip any JSON XSSI avoidance prefix from the string (as documented
	 * in the source maps specification), and then parse the string as
	 * JSON.
	 */
	function parseSourceMapInput(str) {
	  return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
	}
	exports.parseSourceMapInput = parseSourceMapInput;

	/**
	 * Compute the URL of a source given the the source root, the source's
	 * URL, and the source map's URL.
	 */
	function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
	  sourceURL = sourceURL || '';

	  if (sourceRoot) {
	    // This follows what Chrome does.
	    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
	      sourceRoot += '/';
	    }
	    // The spec says:
	    //   Line 4: An optional source root, useful for relocating source
	    //   files on a server or removing repeated values in the
	    //   â€œsourcesâ€� entry.  This value is prepended to the individual
	    //   entries in the â€œsourceâ€� field.
	    sourceURL = sourceRoot + sourceURL;
	  }

	  // Historically, SourceMapConsumer did not take the sourceMapURL as
	  // a parameter.  This mode is still somewhat supported, which is why
	  // this code block is conditional.  However, it's preferable to pass
	  // the source map URL to SourceMapConsumer, so that this function
	  // can implement the source URL resolution algorithm as outlined in
	  // the spec.  This block is basically the equivalent of:
	  //    new URL(sourceURL, sourceMapURL).toString()
	  // ... except it avoids using URL, which wasn't available in the
	  // older releases of node still supported by this library.
	  //
	  // The spec says:
	  //   If the sources are not absolute URLs after prepending of the
	  //   â€œsourceRootâ€�, the sources are resolved relative to the
	  //   SourceMap (like resolving script src in a html document).
	  if (sourceMapURL) {
	    var parsed = urlParse(sourceMapURL);
	    if (!parsed) {
	      throw new Error("sourceMapURL could not be parsed");
	    }
	    if (parsed.path) {
	      // Strip the last path component, but keep the "/".
	      var index = parsed.path.lastIndexOf('/');
	      if (index >= 0) {
	        parsed.path = parsed.path.substring(0, index + 1);
	      }
	    }
	    sourceURL = join(urlGenerate(parsed), sourceURL);
	  }

	  return normalize(sourceURL);
	}
	exports.computeSourceURL = computeSourceURL;


/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	var util = __webpack_require__(4);
	var has = Object.prototype.hasOwnProperty;
	var hasNativeMap = typeof Map !== "undefined";

	/**
	 * A data structure which is a combination of an array and a set. Adding a new
	 * member is O(1), testing for membership is O(1), and finding the index of an
	 * element is O(1). Removing elements from the set is not supported. Only
	 * strings are supported for membership.
	 */
	function ArraySet() {
	  this._array = [];
	  this._set = hasNativeMap ? new Map() : Object.create(null);
	}

	/**
	 * Static method for creating ArraySet instances from an existing array.
	 */
	ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
	  var set = new ArraySet();
	  for (var i = 0, len = aArray.length; i < len; i++) {
	    set.add(aArray[i], aAllowDuplicates);
	  }
	  return set;
	};

	/**
	 * Return how many unique items are in this ArraySet. If duplicates have been
	 * added, than those do not count towards the size.
	 *
	 * @returns Number
	 */
	ArraySet.prototype.size = function ArraySet_size() {
	  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
	};

	/**
	 * Add the given string to this set.
	 *
	 * @param String aStr
	 */
	ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
	  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
	  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
	  var idx = this._array.length;
	  if (!isDuplicate || aAllowDuplicates) {
	    this._array.push(aStr);
	  }
	  if (!isDuplicate) {
	    if (hasNativeMap) {
	      this._set.set(aStr, idx);
	    } else {
	      this._set[sStr] = idx;
	    }
	  }
	};

	/**
	 * Is the given string a member of this set?
	 *
	 * @param String aStr
	 */
	ArraySet.prototype.has = function ArraySet_has(aStr) {
	  if (hasNativeMap) {
	    return this._set.has(aStr);
	  } else {
	    var sStr = util.toSetString(aStr);
	    return has.call(this._set, sStr);
	  }
	};

	/**
	 * What is the index of the given string in the array?
	 *
	 * @param String aStr
	 */
	ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
	  if (hasNativeMap) {
	    var idx = this._set.get(aStr);
	    if (idx >= 0) {
	        return idx;
	    }
	  } else {
	    var sStr = util.toSetString(aStr);
	    if (has.call(this._set, sStr)) {
	      return this._set[sStr];
	    }
	  }

	  throw new Error('"' + aStr + '" is not in the set.');
	};

	/**
	 * What is the element at the given index?
	 *
	 * @param Number aIdx
	 */
	ArraySet.prototype.at = function ArraySet_at(aIdx) {
	  if (aIdx >= 0 && aIdx < this._array.length) {
	    return this._array[aIdx];
	  }
	  throw new Error('No element indexed by ' + aIdx);
	};

	/**
	 * Returns the array representation of this set (which has the proper indices
	 * indicated by indexOf). Note that this is a copy of the internal array used
	 * for storing the members so that no one can mess with internal state.
	 */
	ArraySet.prototype.toArray = function ArraySet_toArray() {
	  return this._array.slice();
	};

	exports.ArraySet = ArraySet;


/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2014 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	var util = __webpack_require__(4);

	/**
	 * Determine whether mappingB is after mappingA with respect to generated
	 * position.
	 */
	function generatedPositionAfter(mappingA, mappingB) {
	  // Optimized for most common case
	  var lineA = mappingA.generatedLine;
	  var lineB = mappingB.generatedLine;
	  var columnA = mappingA.generatedColumn;
	  var columnB = mappingB.generatedColumn;
	  return lineB > lineA || lineB == lineA && columnB >= columnA ||
	         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
	}

	/**
	 * A data structure to provide a sorted view of accumulated mappings in a
	 * performance conscious manner. It trades a neglibable overhead in general
	 * case for a large speedup in case of mappings being added in order.
	 */
	function MappingList() {
	  this._array = [];
	  this._sorted = true;
	  // Serves as infimum
	  this._last = {generatedLine: -1, generatedColumn: 0};
	}

	/**
	 * Iterate through internal items. This method takes the same arguments that
	 * `Array.prototype.forEach` takes.
	 *
	 * NOTE: The order of the mappings is NOT guaranteed.
	 */
	MappingList.prototype.unsortedForEach =
	  function MappingList_forEach(aCallback, aThisArg) {
	    this._array.forEach(aCallback, aThisArg);
	  };

	/**
	 * Add the given source mapping.
	 *
	 * @param Object aMapping
	 */
	MappingList.prototype.add = function MappingList_add(aMapping) {
	  if (generatedPositionAfter(this._last, aMapping)) {
	    this._last = aMapping;
	    this._array.push(aMapping);
	  } else {
	    this._sorted = false;
	    this._array.push(aMapping);
	  }
	};

	/**
	 * Returns the flat, sorted array of mappings. The mappings are sorted by
	 * generated position.
	 *
	 * WARNING: This method returns internal data without copying, for
	 * performance. The return value must NOT be mutated, and should be treated as
	 * an immutable borrow. If you want to take ownership, you must make your own
	 * copy.
	 */
	MappingList.prototype.toArray = function MappingList_toArray() {
	  if (!this._sorted) {
	    this._array.sort(util.compareByGeneratedPositionsInflated);
	    this._sorted = true;
	  }
	  return this._array;
	};

	exports.MappingList = MappingList;


/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	var util = __webpack_require__(4);
	var binarySearch = __webpack_require__(8);
	var ArraySet = __webpack_require__(5).ArraySet;
	var base64VLQ = __webpack_require__(2);
	var quickSort = __webpack_require__(9).quickSort;

	function SourceMapConsumer(aSourceMap, aSourceMapURL) {
	  var sourceMap = aSourceMap;
	  if (typeof aSourceMap === 'string') {
	    sourceMap = util.parseSourceMapInput(aSourceMap);
	  }

	  return sourceMap.sections != null
	    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
	    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
	}

	SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
	  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
	}

	/**
	 * The version of the source mapping spec that we are consuming.
	 */
	SourceMapConsumer.prototype._version = 3;

	// `__generatedMappings` and `__originalMappings` are arrays that hold the
	// parsed mapping coordinates from the source map's "mappings" attribute. They
	// are lazily instantiated, accessed via the `_generatedMappings` and
	// `_originalMappings` getters respectively, and we only parse the mappings
	// and create these arrays once queried for a source location. We jump through
	// these hoops because there can be many thousands of mappings, and parsing
	// them is expensive, so we only want to do it if we must.
	//
	// Each object in the arrays is of the form:
	//
	//     {
	//       generatedLine: The line number in the generated code,
	//       generatedColumn: The column number in the generated code,
	//       source: The path to the original source file that generated this
	//               chunk of code,
	//       originalLine: The line number in the original source that
	//                     corresponds to this chunk of generated code,
	//       originalColumn: The column number in the original source that
	//                       corresponds to this chunk of generated code,
	//       name: The name of the original symbol which generated this chunk of
	//             code.
	//     }
	//
	// All properties except for `generatedLine` and `generatedColumn` can be
	// `null`.
	//
	// `_generatedMappings` is ordered by the generated positions.
	//
	// `_originalMappings` is ordered by the original positions.

	SourceMapConsumer.prototype.__generatedMappings = null;
	Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
	  configurable: true,
	  enumerable: true,
	  get: function () {
	    if (!this.__generatedMappings) {
	      this._parseMappings(this._mappings, this.sourceRoot);
	    }

	    return this.__generatedMappings;
	  }
	});

	SourceMapConsumer.prototype.__originalMappings = null;
	Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
	  configurable: true,
	  enumerable: true,
	  get: function () {
	    if (!this.__originalMappings) {
	      this._parseMappings(this._mappings, this.sourceRoot);
	    }

	    return this.__originalMappings;
	  }
	});

	SourceMapConsumer.prototype._charIsMappingSeparator =
	  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
	    var c = aStr.charAt(index);
	    return c === ";" || c === ",";
	  };

	/**
	 * Parse the mappings in a string in to a data structure which we can easily
	 * query (the ordered arrays in the `this.__generatedMappings` and
	 * `this.__originalMappings` properties).
	 */
	SourceMapConsumer.prototype._parseMappings =
	  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
	    throw new Error("Subclasses must implement _parseMappings");
	  };

	SourceMapConsumer.GENERATED_ORDER = 1;
	SourceMapConsumer.ORIGINAL_ORDER = 2;

	SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
	SourceMapConsumer.LEAST_UPPER_BOUND = 2;

	/**
	 * Iterate over each mapping between an original source/line/column and a
	 * generated line/column in this source map.
	 *
	 * @param Function aCallback
	 *        The function that is called with each mapping.
	 * @param Object aContext
	 *        Optional. If specified, this object will be the value of `this` every
	 *        time that `aCallback` is called.
	 * @param aOrder
	 *        Either `SourceMapConsumer.GENERATED_ORDER` or
	 *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
	 *        iterate over the mappings sorted by the generated file's line/column
	 *        order or the original's source/line/column order, respectively. Defaults to
	 *        `SourceMapConsumer.GENERATED_ORDER`.
	 */
	SourceMapConsumer.prototype.eachMapping =
	  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
	    var context = aContext || null;
	    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;

	    var mappings;
	    switch (order) {
	    case SourceMapConsumer.GENERATED_ORDER:
	      mappings = this._generatedMappings;
	      break;
	    case SourceMapConsumer.ORIGINAL_ORDER:
	      mappings = this._originalMappings;
	      break;
	    default:
	      throw new Error("Unknown order of iteration.");
	    }

	    var sourceRoot = this.sourceRoot;
	    mappings.map(function (mapping) {
	      var source = mapping.source === null ? null : this._sources.at(mapping.source);
	      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
	      return {
	        source: source,
	        generatedLine: mapping.generatedLine,
	        generatedColumn: mapping.generatedColumn,
	        originalLine: mapping.originalLine,
	        originalColumn: mapping.originalColumn,
	        name: mapping.name === null ? null : this._names.at(mapping.name)
	      };
	    }, this).forEach(aCallback, context);
	  };

	/**
	 * Returns all generated line and column information for the original source,
	 * line, and column provided. If no column is provided, returns all mappings
	 * corresponding to a either the line we are searching for or the next
	 * closest line that has any mappings. Otherwise, returns all mappings
	 * corresponding to the given line and either the column we are searching for
	 * or the next closest column that has any offsets.
	 *
	 * The only argument is an object with the following properties:
	 *
	 *   - source: The filename of the original source.
	 *   - line: The line number in the original source.  The line number is 1-based.
	 *   - column: Optional. the column number in the original source.
	 *    The column number is 0-based.
	 *
	 * and an array of objects is returned, each with the following properties:
	 *
	 *   - line: The line number in the generated source, or null.  The
	 *    line number is 1-based.
	 *   - column: The column number in the generated source, or null.
	 *    The column number is 0-based.
	 */
	SourceMapConsumer.prototype.allGeneratedPositionsFor =
	  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
	    var line = util.getArg(aArgs, 'line');

	    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
	    // returns the index of the closest mapping less than the needle. By
	    // setting needle.originalColumn to 0, we thus find the last mapping for
	    // the given line, provided such a mapping exists.
	    var needle = {
	      source: util.getArg(aArgs, 'source'),
	      originalLine: line,
	      originalColumn: util.getArg(aArgs, 'column', 0)
	    };

	    needle.source = this._findSourceIndex(needle.source);
	    if (needle.source < 0) {
	      return [];
	    }

	    var mappings = [];

	    var index = this._findMapping(needle,
	                                  this._originalMappings,
	                                  "originalLine",
	                                  "originalColumn",
	                                  util.compareByOriginalPositions,
	                                  binarySearch.LEAST_UPPER_BOUND);
	    if (index >= 0) {
	      var mapping = this._originalMappings[index];

	      if (aArgs.column === undefined) {
	        var originalLine = mapping.originalLine;

	        // Iterate until either we run out of mappings, or we run into
	        // a mapping for a different line than the one we found. Since
	        // mappings are sorted, this is guaranteed to find all mappings for
	        // the line we found.
	        while (mapping && mapping.originalLine === originalLine) {
	          mappings.push({
	            line: util.getArg(mapping, 'generatedLine', null),
	            column: util.getArg(mapping, 'generatedColumn', null),
	            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
	          });

	          mapping = this._originalMappings[++index];
	        }
	      } else {
	        var originalColumn = mapping.originalColumn;

	        // Iterate until either we run out of mappings, or we run into
	        // a mapping for a different line than the one we were searching for.
	        // Since mappings are sorted, this is guaranteed to find all mappings for
	        // the line we are searching for.
	        while (mapping &&
	               mapping.originalLine === line &&
	               mapping.originalColumn == originalColumn) {
	          mappings.push({
	            line: util.getArg(mapping, 'generatedLine', null),
	            column: util.getArg(mapping, 'generatedColumn', null),
	            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
	          });

	          mapping = this._originalMappings[++index];
	        }
	      }
	    }

	    return mappings;
	  };

	exports.SourceMapConsumer = SourceMapConsumer;

	/**
	 * A BasicSourceMapConsumer instance represents a parsed source map which we can
	 * query for information about the original file positions by giving it a file
	 * position in the generated source.
	 *
	 * The first parameter is the raw source map (either as a JSON string, or
	 * already parsed to an object). According to the spec, source maps have the
	 * following attributes:
	 *
	 *   - version: Which version of the source map spec this map is following.
	 *   - sources: An array of URLs to the original source files.
	 *   - names: An array of identifiers which can be referrenced by individual mappings.
	 *   - sourceRoot: Optional. The URL root from which all sources are relative.
	 *   - sourcesContent: Optional. An array of contents of the original source files.
	 *   - mappings: A string of base64 VLQs which contain the actual mappings.
	 *   - file: Optional. The generated file this source map is associated with.
	 *
	 * Here is an example source map, taken from the source map spec[0]:
	 *
	 *     {
	 *       version : 3,
	 *       file: "out.js",
	 *       sourceRoot : "",
	 *       sources: ["foo.js", "bar.js"],
	 *       names: ["src", "maps", "are", "fun"],
	 *       mappings: "AA,AB;;ABCDE;"
	 *     }
	 *
	 * The second parameter, if given, is a string whose value is the URL
	 * at which the source map was found.  This URL is used to compute the
	 * sources array.
	 *
	 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
	 */
	function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
	  var sourceMap = aSourceMap;
	  if (typeof aSourceMap === 'string') {
	    sourceMap = util.parseSourceMapInput(aSourceMap);
	  }

	  var version = util.getArg(sourceMap, 'version');
	  var sources = util.getArg(sourceMap, 'sources');
	  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
	  // requires the array) to play nice here.
	  var names = util.getArg(sourceMap, 'names', []);
	  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
	  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
	  var mappings = util.getArg(sourceMap, 'mappings');
	  var file = util.getArg(sourceMap, 'file', null);

	  // Once again, Sass deviates from the spec and supplies the version as a
	  // string rather than a number, so we use loose equality checking here.
	  if (version != this._version) {
	    throw new Error('Unsupported version: ' + version);
	  }

	  if (sourceRoot) {
	    sourceRoot = util.normalize(sourceRoot);
	  }

	  sources = sources
	    .map(String)
	    // Some source maps produce relative source paths like "./foo.js" instead of
	    // "foo.js".  Normalize these first so that future comparisons will succeed.
	    // See bugzil.la/1090768.
	    .map(util.normalize)
	    // Always ensure that absolute sources are internally stored relative to
	    // the source root, if the source root is absolute. Not doing this would
	    // be particularly problematic when the source root is a prefix of the
	    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
	    .map(function (source) {
	      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
	        ? util.relative(sourceRoot, source)
	        : source;
	    });

	  // Pass `true` below to allow duplicate names and sources. While source maps
	  // are intended to be compressed and deduplicated, the TypeScript compiler
	  // sometimes generates source maps with duplicates in them. See Github issue
	  // #72 and bugzil.la/889492.
	  this._names = ArraySet.fromArray(names.map(String), true);
	  this._sources = ArraySet.fromArray(sources, true);

	  this._absoluteSources = this._sources.toArray().map(function (s) {
	    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
	  });

	  this.sourceRoot = sourceRoot;
	  this.sourcesContent = sourcesContent;
	  this._mappings = mappings;
	  this._sourceMapURL = aSourceMapURL;
	  this.file = file;
	}

	BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
	BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;

	/**
	 * Utility function to find the index of a source.  Returns -1 if not
	 * found.
	 */
	BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
	  var relativeSource = aSource;
	  if (this.sourceRoot != null) {
	    relativeSource = util.relative(this.sourceRoot, relativeSource);
	  }

	  if (this._sources.has(relativeSource)) {
	    return this._sources.indexOf(relativeSource);
	  }

	  // Maybe aSource is an absolute URL as returned by |sources|.  In
	  // this case we can't simply undo the transform.
	  var i;
	  for (i = 0; i < this._absoluteSources.length; ++i) {
	    if (this._absoluteSources[i] == aSource) {
	      return i;
	    }
	  }

	  return -1;
	};

	/**
	 * Create a BasicSourceMapConsumer from a SourceMapGenerator.
	 *
	 * @param SourceMapGenerator aSourceMap
	 *        The source map that will be consumed.
	 * @param String aSourceMapURL
	 *        The URL at which the source map can be found (optional)
	 * @returns BasicSourceMapConsumer
	 */
	BasicSourceMapConsumer.fromSourceMap =
	  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
	    var smc = Object.create(BasicSourceMapConsumer.prototype);

	    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
	    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
	    smc.sourceRoot = aSourceMap._sourceRoot;
	    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
	                                                            smc.sourceRoot);
	    smc.file = aSourceMap._file;
	    smc._sourceMapURL = aSourceMapURL;
	    smc._absoluteSources = smc._sources.toArray().map(function (s) {
	      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
	    });

	    // Because we are modifying the entries (by converting string sources and
	    // names to indices into the sources and names ArraySets), we have to make
	    // a copy of the entry or else bad things happen. Shared mutable state
	    // strikes again! See github issue #191.

	    var generatedMappings = aSourceMap._mappings.toArray().slice();
	    var destGeneratedMappings = smc.__generatedMappings = [];
	    var destOriginalMappings = smc.__originalMappings = [];

	    for (var i = 0, length = generatedMappings.length; i < length; i++) {
	      var srcMapping = generatedMappings[i];
	      var destMapping = new Mapping;
	      destMapping.generatedLine = srcMapping.generatedLine;
	      destMapping.generatedColumn = srcMapping.generatedColumn;

	      if (srcMapping.source) {
	        destMapping.source = sources.indexOf(srcMapping.source);
	        destMapping.originalLine = srcMapping.originalLine;
	        destMapping.originalColumn = srcMapping.originalColumn;

	        if (srcMapping.name) {
	          destMapping.name = names.indexOf(srcMapping.name);
	        }

	        destOriginalMappings.push(destMapping);
	      }

	      destGeneratedMappings.push(destMapping);
	    }

	    quickSort(smc.__originalMappings, util.compareByOriginalPositions);

	    return smc;
	  };

	/**
	 * The version of the source mapping spec that we are consuming.
	 */
	BasicSourceMapConsumer.prototype._version = 3;

	/**
	 * The list of original sources.
	 */
	Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
	  get: function () {
	    return this._absoluteSources.slice();
	  }
	});

	/**
	 * Provide the JIT with a nice shape / hidden class.
	 */
	function Mapping() {
	  this.generatedLine = 0;
	  this.generatedColumn = 0;
	  this.source = null;
	  this.originalLine = null;
	  this.originalColumn = null;
	  this.name = null;
	}

	/**
	 * Parse the mappings in a string in to a data structure which we can easily
	 * query (the ordered arrays in the `this.__generatedMappings` and
	 * `this.__originalMappings` properties).
	 */
	BasicSourceMapConsumer.prototype._parseMappings =
	  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
	    var generatedLine = 1;
	    var previousGeneratedColumn = 0;
	    var previousOriginalLine = 0;
	    var previousOriginalColumn = 0;
	    var previousSource = 0;
	    var previousName = 0;
	    var length = aStr.length;
	    var index = 0;
	    var cachedSegments = {};
	    var temp = {};
	    var originalMappings = [];
	    var generatedMappings = [];
	    var mapping, str, segment, end, value;

	    while (index < length) {
	      if (aStr.charAt(index) === ';') {
	        generatedLine++;
	        index++;
	        previousGeneratedColumn = 0;
	      }
	      else if (aStr.charAt(index) === ',') {
	        index++;
	      }
	      else {
	        mapping = new Mapping();
	        mapping.generatedLine = generatedLine;

	        // Because each offset is encoded relative to the previous one,
	        // many segments often have the same encoding. We can exploit this
	        // fact by caching the parsed variable length fields of each segment,
	        // allowing us to avoid a second parse if we encounter the same
	        // segment again.
	        for (end = index; end < length; end++) {
	          if (this._charIsMappingSeparator(aStr, end)) {
	            break;
	          }
	        }
	        str = aStr.slice(index, end);

	        segment = cachedSegments[str];
	        if (segment) {
	          index += str.length;
	        } else {
	          segment = [];
	          while (index < end) {
	            base64VLQ.decode(aStr, index, temp);
	            value = temp.value;
	            index = temp.rest;
	            segment.push(value);
	          }

	          if (segment.length === 2) {
	            throw new Error('Found a source, but no line and column');
	          }

	          if (segment.length === 3) {
	            throw new Error('Found a source and line, but no column');
	          }

	          cachedSegments[str] = segment;
	        }

	        // Generated column.
	        mapping.generatedColumn = previousGeneratedColumn + segment[0];
	        previousGeneratedColumn = mapping.generatedColumn;

	        if (segment.length > 1) {
	          // Original source.
	          mapping.source = previousSource + segment[1];
	          previousSource += segment[1];

	          // Original line.
	          mapping.originalLine = previousOriginalLine + segment[2];
	          previousOriginalLine = mapping.originalLine;
	          // Lines are stored 0-based
	          mapping.originalLine += 1;

	          // Original column.
	          mapping.originalColumn = previousOriginalColumn + segment[3];
	          previousOriginalColumn = mapping.originalColumn;

	          if (segment.length > 4) {
	            // Original name.
	            mapping.name = previousName + segment[4];
	            previousName += segment[4];
	          }
	        }

	        generatedMappings.push(mapping);
	        if (typeof mapping.originalLine === 'number') {
	          originalMappings.push(mapping);
	        }
	      }
	    }

	    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
	    this.__generatedMappings = generatedMappings;

	    quickSort(originalMappings, util.compareByOriginalPositions);
	    this.__originalMappings = originalMappings;
	  };

	/**
	 * Find the mapping that best matches the hypothetical "needle" mapping that
	 * we are searching for in the given "haystack" of mappings.
	 */
	BasicSourceMapConsumer.prototype._findMapping =
	  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
	                                         aColumnName, aComparator, aBias) {
	    // To return the position we are searching for, we must first find the
	    // mapping for the given position and then return the opposite position it
	    // points to. Because the mappings are sorted, we can use binary search to
	    // find the best mapping.

	    if (aNeedle[aLineName] <= 0) {
	      throw new TypeError('Line must be greater than or equal to 1, got '
	                          + aNeedle[aLineName]);
	    }
	    if (aNeedle[aColumnName] < 0) {
	      throw new TypeError('Column must be greater than or equal to 0, got '
	                          + aNeedle[aColumnName]);
	    }

	    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
	  };

	/**
	 * Compute the last column for each generated mapping. The last column is
	 * inclusive.
	 */
	BasicSourceMapConsumer.prototype.computeColumnSpans =
	  function SourceMapConsumer_computeColumnSpans() {
	    for (var index = 0; index < this._generatedMappings.length; ++index) {
	      var mapping = this._generatedMappings[index];

	      // Mappings do not contain a field for the last generated columnt. We
	      // can come up with an optimistic estimate, however, by assuming that
	      // mappings are contiguous (i.e. given two consecutive mappings, the
	      // first mapping ends where the second one starts).
	      if (index + 1 < this._generatedMappings.length) {
	        var nextMapping = this._generatedMappings[index + 1];

	        if (mapping.generatedLine === nextMapping.generatedLine) {
	          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
	          continue;
	        }
	      }

	      // The last mapping for each line spans the entire line.
	      mapping.lastGeneratedColumn = Infinity;
	    }
	  };

	/**
	 * Returns the original source, line, and column information for the generated
	 * source's line and column positions provided. The only argument is an object
	 * with the following properties:
	 *
	 *   - line: The line number in the generated source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the generated source.  The column
	 *     number is 0-based.
	 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
	 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - source: The original source file, or null.
	 *   - line: The line number in the original source, or null.  The
	 *     line number is 1-based.
	 *   - column: The column number in the original source, or null.  The
	 *     column number is 0-based.
	 *   - name: The original identifier, or null.
	 */
	BasicSourceMapConsumer.prototype.originalPositionFor =
	  function SourceMapConsumer_originalPositionFor(aArgs) {
	    var needle = {
	      generatedLine: util.getArg(aArgs, 'line'),
	      generatedColumn: util.getArg(aArgs, 'column')
	    };

	    var index = this._findMapping(
	      needle,
	      this._generatedMappings,
	      "generatedLine",
	      "generatedColumn",
	      util.compareByGeneratedPositionsDeflated,
	      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
	    );

	    if (index >= 0) {
	      var mapping = this._generatedMappings[index];

	      if (mapping.generatedLine === needle.generatedLine) {
	        var source = util.getArg(mapping, 'source', null);
	        if (source !== null) {
	          source = this._sources.at(source);
	          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
	        }
	        var name = util.getArg(mapping, 'name', null);
	        if (name !== null) {
	          name = this._names.at(name);
	        }
	        return {
	          source: source,
	          line: util.getArg(mapping, 'originalLine', null),
	          column: util.getArg(mapping, 'originalColumn', null),
	          name: name
	        };
	      }
	    }

	    return {
	      source: null,
	      line: null,
	      column: null,
	      name: null
	    };
	  };

	/**
	 * Return true if we have the source content for every source in the source
	 * map, false otherwise.
	 */
	BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
	  function BasicSourceMapConsumer_hasContentsOfAllSources() {
	    if (!this.sourcesContent) {
	      return false;
	    }
	    return this.sourcesContent.length >= this._sources.size() &&
	      !this.sourcesContent.some(function (sc) { return sc == null; });
	  };

	/**
	 * Returns the original source content. The only argument is the url of the
	 * original source file. Returns null if no original source content is
	 * available.
	 */
	BasicSourceMapConsumer.prototype.sourceContentFor =
	  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
	    if (!this.sourcesContent) {
	      return null;
	    }

	    var index = this._findSourceIndex(aSource);
	    if (index >= 0) {
	      return this.sourcesContent[index];
	    }

	    var relativeSource = aSource;
	    if (this.sourceRoot != null) {
	      relativeSource = util.relative(this.sourceRoot, relativeSource);
	    }

	    var url;
	    if (this.sourceRoot != null
	        && (url = util.urlParse(this.sourceRoot))) {
	      // XXX: file:// URIs and absolute paths lead to unexpected behavior for
	      // many users. We can help them out when they expect file:// URIs to
	      // behave like it would if they were running a local HTTP server. See
	      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
	      var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
	      if (url.scheme == "file"
	          && this._sources.has(fileUriAbsPath)) {
	        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
	      }

	      if ((!url.path || url.path == "/")
	          && this._sources.has("/" + relativeSource)) {
	        return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
	      }
	    }

	    // This function is used recursively from
	    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
	    // don't want to throw if we can't find the source - we just want to
	    // return null, so we provide a flag to exit gracefully.
	    if (nullOnMissing) {
	      return null;
	    }
	    else {
	      throw new Error('"' + relativeSource + '" is not in the SourceMap.');
	    }
	  };

	/**
	 * Returns the generated line and column information for the original source,
	 * line, and column positions provided. The only argument is an object with
	 * the following properties:
	 *
	 *   - source: The filename of the original source.
	 *   - line: The line number in the original source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the original source.  The column
	 *     number is 0-based.
	 *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
	 *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - line: The line number in the generated source, or null.  The
	 *     line number is 1-based.
	 *   - column: The column number in the generated source, or null.
	 *     The column number is 0-based.
	 */
	BasicSourceMapConsumer.prototype.generatedPositionFor =
	  function SourceMapConsumer_generatedPositionFor(aArgs) {
	    var source = util.getArg(aArgs, 'source');
	    source = this._findSourceIndex(source);
	    if (source < 0) {
	      return {
	        line: null,
	        column: null,
	        lastColumn: null
	      };
	    }

	    var needle = {
	      source: source,
	      originalLine: util.getArg(aArgs, 'line'),
	      originalColumn: util.getArg(aArgs, 'column')
	    };

	    var index = this._findMapping(
	      needle,
	      this._originalMappings,
	      "originalLine",
	      "originalColumn",
	      util.compareByOriginalPositions,
	      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
	    );

	    if (index >= 0) {
	      var mapping = this._originalMappings[index];

	      if (mapping.source === needle.source) {
	        return {
	          line: util.getArg(mapping, 'generatedLine', null),
	          column: util.getArg(mapping, 'generatedColumn', null),
	          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
	        };
	      }
	    }

	    return {
	      line: null,
	      column: null,
	      lastColumn: null
	    };
	  };

	exports.BasicSourceMapConsumer = BasicSourceMapConsumer;

	/**
	 * An IndexedSourceMapConsumer instance represents a parsed source map which
	 * we can query for information. It differs from BasicSourceMapConsumer in
	 * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
	 * input.
	 *
	 * The first parameter is a raw source map (either as a JSON string, or already
	 * parsed to an object). According to the spec for indexed source maps, they
	 * have the following attributes:
	 *
	 *   - version: Which version of the source map spec this map is following.
	 *   - file: Optional. The generated file this source map is associated with.
	 *   - sections: A list of section definitions.
	 *
	 * Each value under the "sections" field has two fields:
	 *   - offset: The offset into the original specified at which this section
	 *       begins to apply, defined as an object with a "line" and "column"
	 *       field.
	 *   - map: A source map definition. This source map could also be indexed,
	 *       but doesn't have to be.
	 *
	 * Instead of the "map" field, it's also possible to have a "url" field
	 * specifying a URL to retrieve a source map from, but that's currently
	 * unsupported.
	 *
	 * Here's an example source map, taken from the source map spec[0], but
	 * modified to omit a section which uses the "url" field.
	 *
	 *  {
	 *    version : 3,
	 *    file: "app.js",
	 *    sections: [{
	 *      offset: {line:100, column:10},
	 *      map: {
	 *        version : 3,
	 *        file: "section.js",
	 *        sources: ["foo.js", "bar.js"],
	 *        names: ["src", "maps", "are", "fun"],
	 *        mappings: "AAAA,E;;ABCDE;"
	 *      }
	 *    }],
	 *  }
	 *
	 * The second parameter, if given, is a string whose value is the URL
	 * at which the source map was found.  This URL is used to compute the
	 * sources array.
	 *
	 * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
	 */
	function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
	  var sourceMap = aSourceMap;
	  if (typeof aSourceMap === 'string') {
	    sourceMap = util.parseSourceMapInput(aSourceMap);
	  }

	  var version = util.getArg(sourceMap, 'version');
	  var sections = util.getArg(sourceMap, 'sections');

	  if (version != this._version) {
	    throw new Error('Unsupported version: ' + version);
	  }

	  this._sources = new ArraySet();
	  this._names = new ArraySet();

	  var lastOffset = {
	    line: -1,
	    column: 0
	  };
	  this._sections = sections.map(function (s) {
	    if (s.url) {
	      // The url field will require support for asynchronicity.
	      // See https://github.com/mozilla/source-map/issues/16
	      throw new Error('Support for url field in sections not implemented.');
	    }
	    var offset = util.getArg(s, 'offset');
	    var offsetLine = util.getArg(offset, 'line');
	    var offsetColumn = util.getArg(offset, 'column');

	    if (offsetLine < lastOffset.line ||
	        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
	      throw new Error('Section offsets must be ordered and non-overlapping.');
	    }
	    lastOffset = offset;

	    return {
	      generatedOffset: {
	        // The offset fields are 0-based, but we use 1-based indices when
	        // encoding/decoding from VLQ.
	        generatedLine: offsetLine + 1,
	        generatedColumn: offsetColumn + 1
	      },
	      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)
	    }
	  });
	}

	IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
	IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;

	/**
	 * The version of the source mapping spec that we are consuming.
	 */
	IndexedSourceMapConsumer.prototype._version = 3;

	/**
	 * The list of original sources.
	 */
	Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
	  get: function () {
	    var sources = [];
	    for (var i = 0; i < this._sections.length; i++) {
	      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
	        sources.push(this._sections[i].consumer.sources[j]);
	      }
	    }
	    return sources;
	  }
	});

	/**
	 * Returns the original source, line, and column information for the generated
	 * source's line and column positions provided. The only argument is an object
	 * with the following properties:
	 *
	 *   - line: The line number in the generated source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the generated source.  The column
	 *     number is 0-based.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - source: The original source file, or null.
	 *   - line: The line number in the original source, or null.  The
	 *     line number is 1-based.
	 *   - column: The column number in the original source, or null.  The
	 *     column number is 0-based.
	 *   - name: The original identifier, or null.
	 */
	IndexedSourceMapConsumer.prototype.originalPositionFor =
	  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
	    var needle = {
	      generatedLine: util.getArg(aArgs, 'line'),
	      generatedColumn: util.getArg(aArgs, 'column')
	    };

	    // Find the section containing the generated position we're trying to map
	    // to an original position.
	    var sectionIndex = binarySearch.search(needle, this._sections,
	      function(needle, section) {
	        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
	        if (cmp) {
	          return cmp;
	        }

	        return (needle.generatedColumn -
	                section.generatedOffset.generatedColumn);
	      });
	    var section = this._sections[sectionIndex];

	    if (!section) {
	      return {
	        source: null,
	        line: null,
	        column: null,
	        name: null
	      };
	    }

	    return section.consumer.originalPositionFor({
	      line: needle.generatedLine -
	        (section.generatedOffset.generatedLine - 1),
	      column: needle.generatedColumn -
	        (section.generatedOffset.generatedLine === needle.generatedLine
	         ? section.generatedOffset.generatedColumn - 1
	         : 0),
	      bias: aArgs.bias
	    });
	  };

	/**
	 * Return true if we have the source content for every source in the source
	 * map, false otherwise.
	 */
	IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
	  function IndexedSourceMapConsumer_hasContentsOfAllSources() {
	    return this._sections.every(function (s) {
	      return s.consumer.hasContentsOfAllSources();
	    });
	  };

	/**
	 * Returns the original source content. The only argument is the url of the
	 * original source file. Returns null if no original source content is
	 * available.
	 */
	IndexedSourceMapConsumer.prototype.sourceContentFor =
	  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
	    for (var i = 0; i < this._sections.length; i++) {
	      var section = this._sections[i];

	      var content = section.consumer.sourceContentFor(aSource, true);
	      if (content) {
	        return content;
	      }
	    }
	    if (nullOnMissing) {
	      return null;
	    }
	    else {
	      throw new Error('"' + aSource + '" is not in the SourceMap.');
	    }
	  };

	/**
	 * Returns the generated line and column information for the original source,
	 * line, and column positions provided. The only argument is an object with
	 * the following properties:
	 *
	 *   - source: The filename of the original source.
	 *   - line: The line number in the original source.  The line number
	 *     is 1-based.
	 *   - column: The column number in the original source.  The column
	 *     number is 0-based.
	 *
	 * and an object is returned with the following properties:
	 *
	 *   - line: The line number in the generated source, or null.  The
	 *     line number is 1-based. 
	 *   - column: The column number in the generated source, or null.
	 *     The column number is 0-based.
	 */
	IndexedSourceMapConsumer.prototype.generatedPositionFor =
	  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
	    for (var i = 0; i < this._sections.length; i++) {
	      var section = this._sections[i];

	      // Only consider this section if the requested source is in the list of
	      // sources of the consumer.
	      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
	        continue;
	      }
	      var generatedPosition = section.consumer.generatedPositionFor(aArgs);
	      if (generatedPosition) {
	        var ret = {
	          line: generatedPosition.line +
	            (section.generatedOffset.generatedLine - 1),
	          column: generatedPosition.column +
	            (section.generatedOffset.generatedLine === generatedPosition.line
	             ? section.generatedOffset.generatedColumn - 1
	             : 0)
	        };
	        return ret;
	      }
	    }

	    return {
	      line: null,
	      column: null
	    };
	  };

	/**
	 * Parse the mappings in a string in to a data structure which we can easily
	 * query (the ordered arrays in the `this.__generatedMappings` and
	 * `this.__originalMappings` properties).
	 */
	IndexedSourceMapConsumer.prototype._parseMappings =
	  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
	    this.__generatedMappings = [];
	    this.__originalMappings = [];
	    for (var i = 0; i < this._sections.length; i++) {
	      var section = this._sections[i];
	      var sectionMappings = section.consumer._generatedMappings;
	      for (var j = 0; j < sectionMappings.length; j++) {
	        var mapping = sectionMappings[j];

	        var source = section.consumer._sources.at(mapping.source);
	        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
	        this._sources.add(source);
	        source = this._sources.indexOf(source);

	        var name = null;
	        if (mapping.name) {
	          name = section.consumer._names.at(mapping.name);
	          this._names.add(name);
	          name = this._names.indexOf(name);
	        }

	        // The mappings coming from the consumer for the section have
	        // generated positions relative to the start of the section, so we
	        // need to offset them to be relative to the start of the concatenated
	        // generated file.
	        var adjustedMapping = {
	          source: source,
	          generatedLine: mapping.generatedLine +
	            (section.generatedOffset.generatedLine - 1),
	          generatedColumn: mapping.generatedColumn +
	            (section.generatedOffset.generatedLine === mapping.generatedLine
	            ? section.generatedOffset.generatedColumn - 1
	            : 0),
	          originalLine: mapping.originalLine,
	          originalColumn: mapping.originalColumn,
	          name: name
	        };

	        this.__generatedMappings.push(adjustedMapping);
	        if (typeof adjustedMapping.originalLine === 'number') {
	          this.__originalMappings.push(adjustedMapping);
	        }
	      }
	    }

	    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
	    quickSort(this.__originalMappings, util.compareByOriginalPositions);
	  };

	exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;


/***/ }),
/* 8 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	exports.GREATEST_LOWER_BOUND = 1;
	exports.LEAST_UPPER_BOUND = 2;

	/**
	 * Recursive implementation of binary search.
	 *
	 * @param aLow Indices here and lower do not contain the needle.
	 * @param aHigh Indices here and higher do not contain the needle.
	 * @param aNeedle The element being searched for.
	 * @param aHaystack The non-empty array being searched.
	 * @param aCompare Function which takes two elements and returns -1, 0, or 1.
	 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
	 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 */
	function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
	  // This function terminates when one of the following is true:
	  //
	  //   1. We find the exact element we are looking for.
	  //
	  //   2. We did not find the exact element, but we can return the index of
	  //      the next-closest element.
	  //
	  //   3. We did not find the exact element, and there is no next-closest
	  //      element than the one we are searching for, so we return -1.
	  var mid = Math.floor((aHigh - aLow) / 2) + aLow;
	  var cmp = aCompare(aNeedle, aHaystack[mid], true);
	  if (cmp === 0) {
	    // Found the element we are looking for.
	    return mid;
	  }
	  else if (cmp > 0) {
	    // Our needle is greater than aHaystack[mid].
	    if (aHigh - mid > 1) {
	      // The element is in the upper half.
	      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
	    }

	    // The exact needle element was not found in this haystack. Determine if
	    // we are in termination case (3) or (2) and return the appropriate thing.
	    if (aBias == exports.LEAST_UPPER_BOUND) {
	      return aHigh < aHaystack.length ? aHigh : -1;
	    } else {
	      return mid;
	    }
	  }
	  else {
	    // Our needle is less than aHaystack[mid].
	    if (mid - aLow > 1) {
	      // The element is in the lower half.
	      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
	    }

	    // we are in termination case (3) or (2) and return the appropriate thing.
	    if (aBias == exports.LEAST_UPPER_BOUND) {
	      return mid;
	    } else {
	      return aLow < 0 ? -1 : aLow;
	    }
	  }
	}

	/**
	 * This is an implementation of binary search which will always try and return
	 * the index of the closest element if there is no exact hit. This is because
	 * mappings between original and generated line/col pairs are single points,
	 * and there is an implicit region between each of them, so a miss just means
	 * that you aren't on the very start of a region.
	 *
	 * @param aNeedle The element you are looking for.
	 * @param aHaystack The array that is being searched.
	 * @param aCompare A function which takes the needle and an element in the
	 *     array and returns -1, 0, or 1 depending on whether the needle is less
	 *     than, equal to, or greater than the element, respectively.
	 * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
	 *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
	 *     closest element that is smaller than or greater than the one we are
	 *     searching for, respectively, if the exact element cannot be found.
	 *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
	 */
	exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
	  if (aHaystack.length === 0) {
	    return -1;
	  }

	  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
	                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);
	  if (index < 0) {
	    return -1;
	  }

	  // We have found either the exact element, or the next-closest element than
	  // the one we are searching for. However, there may be more than one such
	  // element. Make sure we always return the smallest of these.
	  while (index - 1 >= 0) {
	    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
	      break;
	    }
	    --index;
	  }

	  return index;
	};


/***/ }),
/* 9 */
/***/ (function(module, exports) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	// It turns out that some (most?) JavaScript engines don't self-host
	// `Array.prototype.sort`. This makes sense because C++ will likely remain
	// faster than JS when doing raw CPU-intensive sorting. However, when using a
	// custom comparator function, calling back and forth between the VM's C++ and
	// JIT'd JS is rather slow *and* loses JIT type information, resulting in
	// worse generated code for the comparator function than would be optimal. In
	// fact, when sorting with a comparator, these costs outweigh the benefits of
	// sorting in C++. By using our own JS-implemented Quick Sort (below), we get
	// a ~3500ms mean speed-up in `bench/bench.html`.

	/**
	 * Swap the elements indexed by `x` and `y` in the array `ary`.
	 *
	 * @param {Array} ary
	 *        The array.
	 * @param {Number} x
	 *        The index of the first item.
	 * @param {Number} y
	 *        The index of the second item.
	 */
	function swap(ary, x, y) {
	  var temp = ary[x];
	  ary[x] = ary[y];
	  ary[y] = temp;
	}

	/**
	 * Returns a random integer within the range `low .. high` inclusive.
	 *
	 * @param {Number} low
	 *        The lower bound on the range.
	 * @param {Number} high
	 *        The upper bound on the range.
	 */
	function randomIntInRange(low, high) {
	  return Math.round(low + (Math.random() * (high - low)));
	}

	/**
	 * The Quick Sort algorithm.
	 *
	 * @param {Array} ary
	 *        An array to sort.
	 * @param {function} comparator
	 *        Function to use to compare two items.
	 * @param {Number} p
	 *        Start index of the array
	 * @param {Number} r
	 *        End index of the array
	 */
	function doQuickSort(ary, comparator, p, r) {
	  // If our lower bound is less than our upper bound, we (1) partition the
	  // array into two pieces and (2) recurse on each half. If it is not, this is
	  // the empty array and our base case.

	  if (p < r) {
	    // (1) Partitioning.
	    //
	    // The partitioning chooses a pivot between `p` and `r` and moves all
	    // elements that are less than or equal to the pivot to the before it, and
	    // all the elements that are greater than it after it. The effect is that
	    // once partition is done, the pivot is in the exact place it will be when
	    // the array is put in sorted order, and it will not need to be moved
	    // again. This runs in O(n) time.

	    // Always choose a random pivot so that an input array which is reverse
	    // sorted does not cause O(n^2) running time.
	    var pivotIndex = randomIntInRange(p, r);
	    var i = p - 1;

	    swap(ary, pivotIndex, r);
	    var pivot = ary[r];

	    // Immediately after `j` is incremented in this loop, the following hold
	    // true:
	    //
	    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.
	    //
	    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
	    for (var j = p; j < r; j++) {
	      if (comparator(ary[j], pivot) <= 0) {
	        i += 1;
	        swap(ary, i, j);
	      }
	    }

	    swap(ary, i + 1, j);
	    var q = i + 1;

	    // (2) Recurse on each half.

	    doQuickSort(ary, comparator, p, q - 1);
	    doQuickSort(ary, comparator, q + 1, r);
	  }
	}

	/**
	 * Sort the given array in-place with the given comparator function.
	 *
	 * @param {Array} ary
	 *        An array to sort.
	 * @param {function} comparator
	 *        Function to use to compare two items.
	 */
	exports.quickSort = function (ary, comparator) {
	  doQuickSort(ary, comparator, 0, ary.length - 1);
	};


/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {

	/* -*- Mode: js; js-indent-level: 2; -*- */
	/*
	 * Copyright 2011 Mozilla Foundation and contributors
	 * Licensed under the New BSD license. See LICENSE or:
	 * http://opensource.org/licenses/BSD-3-Clause
	 */

	var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
	var util = __webpack_require__(4);

	// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
	// operating systems these days (capturing the result).
	var REGEX_NEWLINE = /(\r?\n)/;

	// Newline character code for charCodeAt() comparisons
	var NEWLINE_CODE = 10;

	// Private symbol for identifying `SourceNode`s when multiple versions of
	// the source-map library are loaded. This MUST NOT CHANGE across
	// versions!
	var isSourceNode = "$$$isSourceNode$$$";

	/**
	 * SourceNodes provide a way to abstract over interpolating/concatenating
	 * snippets of generated JavaScript source code while maintaining the line and
	 * column information associated with the original source code.
	 *
	 * @param aLine The original line number.
	 * @param aColumn The original column number.
	 * @param aSource The original source's filename.
	 * @param aChunks Optional. An array of strings which are snippets of
	 *        generated JS, or other SourceNodes.
	 * @param aName The original identifier.
	 */
	function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
	  this.children = [];
	  this.sourceContents = {};
	  this.line = aLine == null ? null : aLine;
	  this.column = aColumn == null ? null : aColumn;
	  this.source = aSource == null ? null : aSource;
	  this.name = aName == null ? null : aName;
	  this[isSourceNode] = true;
	  if (aChunks != null) this.add(aChunks);
	}

	/**
	 * Creates a SourceNode from generated code and a SourceMapConsumer.
	 *
	 * @param aGeneratedCode The generated code
	 * @param aSourceMapConsumer The SourceMap for the generated code
	 * @param aRelativePath Optional. The path that relative sources in the
	 *        SourceMapConsumer should be relative to.
	 */
	SourceNode.fromStringWithSourceMap =
	  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
	    // The SourceNode we want to fill with the generated code
	    // and the SourceMap
	    var node = new SourceNode();

	    // All even indices of this array are one line of the generated code,
	    // while all odd indices are the newlines between two adjacent lines
	    // (since `REGEX_NEWLINE` captures its match).
	    // Processed fragments are accessed by calling `shiftNextLine`.
	    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
	    var remainingLinesIndex = 0;
	    var shiftNextLine = function() {
	      var lineContents = getNextLine();
	      // The last line of a file might not have a newline.
	      var newLine = getNextLine() || "";
	      return lineContents + newLine;

	      function getNextLine() {
	        return remainingLinesIndex < remainingLines.length ?
	            remainingLines[remainingLinesIndex++] : undefined;
	      }
	    };

	    // We need to remember the position of "remainingLines"
	    var lastGeneratedLine = 1, lastGeneratedColumn = 0;

	    // The generate SourceNodes we need a code range.
	    // To extract it current and last mapping is used.
	    // Here we store the last mapping.
	    var lastMapping = null;

	    aSourceMapConsumer.eachMapping(function (mapping) {
	      if (lastMapping !== null) {
	        // We add the code from "lastMapping" to "mapping":
	        // First check if there is a new line in between.
	        if (lastGeneratedLine < mapping.generatedLine) {
	          // Associate first line with "lastMapping"
	          addMappingWithCode(lastMapping, shiftNextLine());
	          lastGeneratedLine++;
	          lastGeneratedColumn = 0;
	          // The remaining code is added without mapping
	        } else {
	          // There is no new line in between.
	          // Associate the code between "lastGeneratedColumn" and
	          // "mapping.generatedColumn" with "lastMapping"
	          var nextLine = remainingLines[remainingLinesIndex] || '';
	          var code = nextLine.substr(0, mapping.generatedColumn -
	                                        lastGeneratedColumn);
	          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
	                                              lastGeneratedColumn);
	          lastGeneratedColumn = mapping.generatedColumn;
	          addMappingWithCode(lastMapping, code);
	          // No more remaining code, continue
	          lastMapping = mapping;
	          return;
	        }
	      }
	      // We add the generated code until the first mapping
	      // to the SourceNode without any mapping.
	      // Each line is added as separate string.
	      while (lastGeneratedLine < mapping.generatedLine) {
	        node.add(shiftNextLine());
	        lastGeneratedLine++;
	      }
	      if (lastGeneratedColumn < mapping.generatedColumn) {
	        var nextLine = remainingLines[remainingLinesIndex] || '';
	        node.add(nextLine.substr(0, mapping.generatedColumn));
	        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
	        lastGeneratedColumn = mapping.generatedColumn;
	      }
	      lastMapping = mapping;
	    }, this);
	    // We have processed all mappings.
	    if (remainingLinesIndex < remainingLines.length) {
	      if (lastMapping) {
	        // Associate the remaining code in the current line with "lastMapping"
	        addMappingWithCode(lastMapping, shiftNextLine());
	      }
	      // and add the remaining lines without any mapping
	      node.add(remainingLines.splice(remainingLinesIndex).join(""));
	    }

	    // Copy sourcesContent into SourceNode
	    aSourceMapConsumer.sources.forEach(function (sourceFile) {
	      var content = aSourceMapConsumer.sourceContentFor(sourceFile);
	      if (content != null) {
	        if (aRelativePath != null) {
	          sourceFile = util.join(aRelativePath, sourceFile);
	        }
	        node.setSourceContent(sourceFile, content);
	      }
	    });

	    return node;

	    function addMappingWithCode(mapping, code) {
	      if (mapping === null || mapping.source === undefined) {
	        node.add(code);
	      } else {
	        var source = aRelativePath
	          ? util.join(aRelativePath, mapping.source)
	          : mapping.source;
	        node.add(new SourceNode(mapping.originalLine,
	                                mapping.originalColumn,
	                                source,
	                                code,
	                                mapping.name));
	      }
	    }
	  };

	/**
	 * Add a chunk of generated JS to this source node.
	 *
	 * @param aChunk A string snippet of generated JS code, another instance of
	 *        SourceNode, or an array where each member is one of those things.
	 */
	SourceNode.prototype.add = function SourceNode_add(aChunk) {
	  if (Array.isArray(aChunk)) {
	    aChunk.forEach(function (chunk) {
	      this.add(chunk);
	    }, this);
	  }
	  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
	    if (aChunk) {
	      this.children.push(aChunk);
	    }
	  }
	  else {
	    throw new TypeError(
	      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
	    );
	  }
	  return this;
	};

	/**
	 * Add a chunk of generated JS to the beginning of this source node.
	 *
	 * @param aChunk A string snippet of generated JS code, another instance of
	 *        SourceNode, or an array where each member is one of those things.
	 */
	SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
	  if (Array.isArray(aChunk)) {
	    for (var i = aChunk.length-1; i >= 0; i--) {
	      this.prepend(aChunk[i]);
	    }
	  }
	  else if (aChunk[isSourceNode] || typeof aChunk === "string") {
	    this.children.unshift(aChunk);
	  }
	  else {
	    throw new TypeError(
	      "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
	    );
	  }
	  return this;
	};

	/**
	 * Walk over the tree of JS snippets in this node and its children. The
	 * walking function is called once for each snippet of JS and is passed that
	 * snippet and the its original associated source's line/column location.
	 *
	 * @param aFn The traversal function.
	 */
	SourceNode.prototype.walk = function SourceNode_walk(aFn) {
	  var chunk;
	  for (var i = 0, len = this.children.length; i < len; i++) {
	    chunk = this.children[i];
	    if (chunk[isSourceNode]) {
	      chunk.walk(aFn);
	    }
	    else {
	      if (chunk !== '') {
	        aFn(chunk, { source: this.source,
	                     line: this.line,
	                     column: this.column,
	                     name: this.name });
	      }
	    }
	  }
	};

	/**
	 * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
	 * each of `this.children`.
	 *
	 * @param aSep The separator.
	 */
	SourceNode.prototype.join = function SourceNode_join(aSep) {
	  var newChildren;
	  var i;
	  var len = this.children.length;
	  if (len > 0) {
	    newChildren = [];
	    for (i = 0; i < len-1; i++) {
	      newChildren.push(this.children[i]);
	      newChildren.push(aSep);
	    }
	    newChildren.push(this.children[i]);
	    this.children = newChildren;
	  }
	  return this;
	};

	/**
	 * Call String.prototype.replace on the very right-most source snippet. Useful
	 * for trimming whitespace from the end of a source node, etc.
	 *
	 * @param aPattern The pattern to replace.
	 * @param aReplacement The thing to replace the pattern with.
	 */
	SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
	  var lastChild = this.children[this.children.length - 1];
	  if (lastChild[isSourceNode]) {
	    lastChild.replaceRight(aPattern, aReplacement);
	  }
	  else if (typeof lastChild === 'string') {
	    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
	  }
	  else {
	    this.children.push(''.replace(aPattern, aReplacement));
	  }
	  return this;
	};

	/**
	 * Set the source content for a source file. This will be added to the SourceMapGenerator
	 * in the sourcesContent field.
	 *
	 * @param aSourceFile The filename of the source file
	 * @param aSourceContent The content of the source file
	 */
	SourceNode.prototype.setSourceContent =
	  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
	    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
	  };

	/**
	 * Walk over the tree of SourceNodes. The walking function is called for each
	 * source file content and is passed the filename and source content.
	 *
	 * @param aFn The traversal function.
	 */
	SourceNode.prototype.walkSourceContents =
	  function SourceNode_walkSourceContents(aFn) {
	    for (var i = 0, len = this.children.length; i < len; i++) {
	      if (this.children[i][isSourceNode]) {
	        this.children[i].walkSourceContents(aFn);
	      }
	    }

	    var sources = Object.keys(this.sourceContents);
	    for (var i = 0, len = sources.length; i < len; i++) {
	      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
	    }
	  };

	/**
	 * Return the string representation of this source node. Walks over the tree
	 * and concatenates all the various snippets together to one string.
	 */
	SourceNode.prototype.toString = function SourceNode_toString() {
	  var str = "";
	  this.walk(function (chunk) {
	    str += chunk;
	  });
	  return str;
	};

	/**
	 * Returns the string representation of this source node along with a source
	 * map.
	 */
	SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
	  var generated = {
	    code: "",
	    line: 1,
	    column: 0
	  };
	  var map = new SourceMapGenerator(aArgs);
	  var sourceMappingActive = false;
	  var lastOriginalSource = null;
	  var lastOriginalLine = null;
	  var lastOriginalColumn = null;
	  var lastOriginalName = null;
	  this.walk(function (chunk, original) {
	    generated.code += chunk;
	    if (original.source !== null
	        && original.line !== null
	        && original.column !== null) {
	      if(lastOriginalSource !== original.source
	         || lastOriginalLine !== original.line
	         || lastOriginalColumn !== original.column
	         || lastOriginalName !== original.name) {
	        map.addMapping({
	          source: original.source,
	          original: {
	            line: original.line,
	            column: original.column
	          },
	          generated: {
	            line: generated.line,
	            column: generated.column
	          },
	          name: original.name
	        });
	      }
	      lastOriginalSource = original.source;
	      lastOriginalLine = original.line;
	      lastOriginalColumn = original.column;
	      lastOriginalName = original.name;
	      sourceMappingActive = true;
	    } else if (sourceMappingActive) {
	      map.addMapping({
	        generated: {
	          line: generated.line,
	          column: generated.column
	        }
	      });
	      lastOriginalSource = null;
	      sourceMappingActive = false;
	    }
	    for (var idx = 0, length = chunk.length; idx < length; idx++) {
	      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
	        generated.line++;
	        generated.column = 0;
	        // Mappings end at eol
	        if (idx + 1 === length) {
	          lastOriginalSource = null;
	          sourceMappingActive = false;
	        } else if (sourceMappingActive) {
	          map.addMapping({
	            source: original.source,
	            original: {
	              line: original.line,
	              column: original.column
	            },
	            generated: {
	              line: generated.line,
	              column: generated.column
	            },
	            name: original.name
	          });
	        }
	      } else {
	        generated.column++;
	      }
	    }
	  });
	  this.walkSourceContents(function (sourceFile, sourceContent) {
	    map.setSourceContent(sourceFile, sourceContent);
	  });

	  return { code: generated.code, map: map };
	};

	exports.SourceNode = SourceNode;


/***/ })
/******/ ])
});
;!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.sourceMap=n():e.sourceMap=n()}(this,function(){return function(e){function n(t){if(r[t])return r[t].exports;var o=r[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var r={};return n.m=e,n.c=r,n.p="",n(0)}([function(e,n,r){n.SourceMapGenerator=r(1).SourceMapGenerator,n.SourceMapConsumer=r(7).SourceMapConsumer,n.SourceNode=r(10).SourceNode},function(e,n,r){function t(e){e||(e={}),this._file=i.getArg(e,"file",null),this._sourceRoot=i.getArg(e,"sourceRoot",null),this._skipValidation=i.getArg(e,"skipValidation",!1),this._sources=new s,this._names=new s,this._mappings=new a,this._sourcesContents=null}var o=r(2),i=r(4),s=r(5).ArraySet,a=r(6).MappingList;t.prototype._version=3,t.fromSourceMap=function(e){var n=e.sourceRoot,r=new t({file:e.file,sourceRoot:n});return e.eachMapping(function(e){var t={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(t.source=e.source,null!=n&&(t.source=i.relative(n,t.source)),t.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(t.name=e.name)),r.addMapping(t)}),e.sources.forEach(function(t){var o=t;null!==n&&(o=i.relative(n,t)),r._sources.has(o)||r._sources.add(o);var s=e.sourceContentFor(t);null!=s&&r.setSourceContent(t,s)}),r},t.prototype.addMapping=function(e){var n=i.getArg(e,"generated"),r=i.getArg(e,"original",null),t=i.getArg(e,"source",null),o=i.getArg(e,"name",null);this._skipValidation||this._validateMapping(n,r,t,o),null!=t&&(t=String(t),this._sources.has(t)||this._sources.add(t)),null!=o&&(o=String(o),this._names.has(o)||this._names.add(o)),this._mappings.add({generatedLine:n.line,generatedColumn:n.column,originalLine:null!=r&&r.line,originalColumn:null!=r&&r.column,source:t,name:o})},t.prototype.setSourceContent=function(e,n){var r=e;null!=this._sourceRoot&&(r=i.relative(this._sourceRoot,r)),null!=n?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[i.toSetString(r)]=n):this._sourcesContents&&(delete this._sourcesContents[i.toSetString(r)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},t.prototype.applySourceMap=function(e,n,r){var t=n;if(null==n){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');t=e.file}var o=this._sourceRoot;null!=o&&(t=i.relative(o,t));var a=new s,u=new s;this._mappings.unsortedForEach(function(n){if(n.source===t&&null!=n.originalLine){var s=e.originalPositionFor({line:n.originalLine,column:n.originalColumn});null!=s.source&&(n.source=s.source,null!=r&&(n.source=i.join(r,n.source)),null!=o&&(n.source=i.relative(o,n.source)),n.originalLine=s.line,n.originalColumn=s.column,null!=s.name&&(n.name=s.name))}var l=n.source;null==l||a.has(l)||a.add(l);var c=n.name;null==c||u.has(c)||u.add(c)},this),this._sources=a,this._names=u,e.sources.forEach(function(n){var t=e.sourceContentFor(n);null!=t&&(null!=r&&(n=i.join(r,n)),null!=o&&(n=i.relative(o,n)),this.setSourceContent(n,t))},this)},t.prototype._validateMapping=function(e,n,r,t){if(n&&"number"!=typeof n.line&&"number"!=typeof n.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||n||r||t)&&!(e&&"line"in e&&"column"in e&&n&&"line"in n&&"column"in n&&e.line>0&&e.column>=0&&n.line>0&&n.column>=0&&r))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:r,original:n,name:t}))},t.prototype._serializeMappings=function(){for(var e,n,r,t,s=0,a=1,u=0,l=0,c=0,g=0,p="",h=this._mappings.toArray(),f=0,d=h.length;f<d;f++){if(n=h[f],e="",n.generatedLine!==a)for(s=0;n.generatedLine!==a;)e+=";",a++;else if(f>0){if(!i.compareByGeneratedPositionsInflated(n,h[f-1]))continue;e+=","}e+=o.encode(n.generatedColumn-s),s=n.generatedColumn,null!=n.source&&(t=this._sources.indexOf(n.source),e+=o.encode(t-g),g=t,e+=o.encode(n.originalLine-1-l),l=n.originalLine-1,e+=o.encode(n.originalColumn-u),u=n.originalColumn,null!=n.name&&(r=this._names.indexOf(n.name),e+=o.encode(r-c),c=r)),p+=e}return p},t.prototype._generateSourcesContent=function(e,n){return e.map(function(e){if(!this._sourcesContents)return null;null!=n&&(e=i.relative(n,e));var r=i.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,r)?this._sourcesContents[r]:null},this)},t.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},t.prototype.toString=function(){return JSON.stringify(this.toJSON())},n.SourceMapGenerator=t},function(e,n,r){function t(e){return e<0?(-e<<1)+1:(e<<1)+0}function o(e){var n=1===(1&e),r=e>>1;return n?-r:r}var i=r(3),s=5,a=1<<s,u=a-1,l=a;n.encode=function(e){var n,r="",o=t(e);do n=o&u,o>>>=s,o>0&&(n|=l),r+=i.encode(n);while(o>0);return r},n.decode=function(e,n,r){var t,a,c=e.length,g=0,p=0;do{if(n>=c)throw new Error("Expected more digits in base 64 VLQ value.");if(a=i.decode(e.charCodeAt(n++)),a===-1)throw new Error("Invalid base64 digit: "+e.charAt(n-1));t=!!(a&l),a&=u,g+=a<<p,p+=s}while(t);r.value=o(g),r.rest=n}},function(e,n){var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");n.encode=function(e){if(0<=e&&e<r.length)return r[e];throw new TypeError("Must be between 0 and 63: "+e)},n.decode=function(e){var n=65,r=90,t=97,o=122,i=48,s=57,a=43,u=47,l=26,c=52;return n<=e&&e<=r?e-n:t<=e&&e<=o?e-t+l:i<=e&&e<=s?e-i+c:e==a?62:e==u?63:-1}},function(e,n){function r(e,n,r){if(n in e)return e[n];if(3===arguments.length)return r;throw new Error('"'+n+'" is a required argument.')}function t(e){var n=e.match(v);return n?{scheme:n[1],auth:n[2],host:n[3],port:n[4],path:n[5]}:null}function o(e){var n="";return e.scheme&&(n+=e.scheme+":"),n+="//",e.auth&&(n+=e.auth+"@"),e.host&&(n+=e.host),e.port&&(n+=":"+e.port),e.path&&(n+=e.path),n}function i(e){var r=e,i=t(e);if(i){if(!i.path)return e;r=i.path}for(var s,a=n.isAbsolute(r),u=r.split(/\/+/),l=0,c=u.length-1;c>=0;c--)s=u[c],"."===s?u.splice(c,1):".."===s?l++:l>0&&(""===s?(u.splice(c+1,l),l=0):(u.splice(c,2),l--));return r=u.join("/"),""===r&&(r=a?"/":"."),i?(i.path=r,o(i)):r}function s(e,n){""===e&&(e="."),""===n&&(n=".");var r=t(n),s=t(e);if(s&&(e=s.path||"/"),r&&!r.scheme)return s&&(r.scheme=s.scheme),o(r);if(r||n.match(y))return n;if(s&&!s.host&&!s.path)return s.host=n,o(s);var a="/"===n.charAt(0)?n:i(e.replace(/\/+$/,"")+"/"+n);return s?(s.path=a,o(s)):a}function a(e,n){""===e&&(e="."),e=e.replace(/\/$/,"");for(var r=0;0!==n.indexOf(e+"/");){var t=e.lastIndexOf("/");if(t<0)return n;if(e=e.slice(0,t),e.match(/^([^\/]+:\/)?\/*$/))return n;++r}return Array(r+1).join("../")+n.substr(e.length+1)}function u(e){return e}function l(e){return g(e)?"$"+e:e}function c(e){return g(e)?e.slice(1):e}function g(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function p(e,n,r){var t=f(e.source,n.source);return 0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t||r?t:(t=e.generatedColumn-n.generatedColumn,0!==t?t:(t=e.generatedLine-n.generatedLine,0!==t?t:f(e.name,n.name)))))}function h(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:(t=e.generatedColumn-n.generatedColumn,0!==t||r?t:(t=f(e.source,n.source),0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t?t:f(e.name,n.name)))))}function f(e,n){return e===n?0:null===e?1:null===n?-1:e>n?1:-1}function d(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:(r=e.generatedColumn-n.generatedColumn,0!==r?r:(r=f(e.source,n.source),0!==r?r:(r=e.originalLine-n.originalLine,0!==r?r:(r=e.originalColumn-n.originalColumn,0!==r?r:f(e.name,n.name)))))}function m(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))}function _(e,n,r){if(n=n||"",e&&("/"!==e[e.length-1]&&"/"!==n[0]&&(e+="/"),n=e+n),r){var a=t(r);if(!a)throw new Error("sourceMapURL could not be parsed");if(a.path){var u=a.path.lastIndexOf("/");u>=0&&(a.path=a.path.substring(0,u+1))}n=s(o(a),n)}return i(n)}n.getArg=r;var v=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,y=/^data:.+\,.+$/;n.urlParse=t,n.urlGenerate=o,n.normalize=i,n.join=s,n.isAbsolute=function(e){return"/"===e.charAt(0)||v.test(e)},n.relative=a;var C=function(){var e=Object.create(null);return!("__proto__"in e)}();n.toSetString=C?u:l,n.fromSetString=C?u:c,n.compareByOriginalPositions=p,n.compareByGeneratedPositionsDeflated=h,n.compareByGeneratedPositionsInflated=d,n.parseSourceMapInput=m,n.computeSourceURL=_},function(e,n,r){function t(){this._array=[],this._set=s?new Map:Object.create(null)}var o=r(4),i=Object.prototype.hasOwnProperty,s="undefined"!=typeof Map;t.fromArray=function(e,n){for(var r=new t,o=0,i=e.length;o<i;o++)r.add(e[o],n);return r},t.prototype.size=function(){return s?this._set.size:Object.getOwnPropertyNames(this._set).length},t.prototype.add=function(e,n){var r=s?e:o.toSetString(e),t=s?this.has(e):i.call(this._set,r),a=this._array.length;t&&!n||this._array.push(e),t||(s?this._set.set(e,a):this._set[r]=a)},t.prototype.has=function(e){if(s)return this._set.has(e);var n=o.toSetString(e);return i.call(this._set,n)},t.prototype.indexOf=function(e){if(s){var n=this._set.get(e);if(n>=0)return n}else{var r=o.toSetString(e);if(i.call(this._set,r))return this._set[r]}throw new Error('"'+e+'" is not in the set.')},t.prototype.at=function(e){if(e>=0&&e<this._array.length)return this._array[e];throw new Error("No element indexed by "+e)},t.prototype.toArray=function(){return this._array.slice()},n.ArraySet=t},function(e,n,r){function t(e,n){var r=e.generatedLine,t=n.generatedLine,o=e.generatedColumn,s=n.generatedColumn;return t>r||t==r&&s>=o||i.compareByGeneratedPositionsInflated(e,n)<=0}function o(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}var i=r(4);o.prototype.unsortedForEach=function(e,n){this._array.forEach(e,n)},o.prototype.add=function(e){t(this._last,e)?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},o.prototype.toArray=function(){return this._sorted||(this._array.sort(i.compareByGeneratedPositionsInflated),this._sorted=!0),this._array},n.MappingList=o},function(e,n,r){function t(e,n){var r=e;return"string"==typeof e&&(r=a.parseSourceMapInput(e)),null!=r.sections?new s(r,n):new o(r,n)}function o(e,n){var r=e;"string"==typeof e&&(r=a.parseSourceMapInput(e));var t=a.getArg(r,"version"),o=a.getArg(r,"sources"),i=a.getArg(r,"names",[]),s=a.getArg(r,"sourceRoot",null),u=a.getArg(r,"sourcesContent",null),c=a.getArg(r,"mappings"),g=a.getArg(r,"file",null);if(t!=this._version)throw new Error("Unsupported version: "+t);s&&(s=a.normalize(s)),o=o.map(String).map(a.normalize).map(function(e){return s&&a.isAbsolute(s)&&a.isAbsolute(e)?a.relative(s,e):e}),this._names=l.fromArray(i.map(String),!0),this._sources=l.fromArray(o,!0),this._absoluteSources=this._sources.toArray().map(function(e){return a.computeSourceURL(s,e,n)}),this.sourceRoot=s,this.sourcesContent=u,this._mappings=c,this._sourceMapURL=n,this.file=g}function i(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function s(e,n){var r=e;"string"==typeof e&&(r=a.parseSourceMapInput(e));var o=a.getArg(r,"version"),i=a.getArg(r,"sections");if(o!=this._version)throw new Error("Unsupported version: "+o);this._sources=new l,this._names=new l;var s={line:-1,column:0};this._sections=i.map(function(e){if(e.url)throw new Error("Support for url field in sections not implemented.");var r=a.getArg(e,"offset"),o=a.getArg(r,"line"),i=a.getArg(r,"column");if(o<s.line||o===s.line&&i<s.column)throw new Error("Section offsets must be ordered and non-overlapping.");return s=r,{generatedOffset:{generatedLine:o+1,generatedColumn:i+1},consumer:new t(a.getArg(e,"map"),n)}})}var a=r(4),u=r(8),l=r(5).ArraySet,c=r(2),g=r(9).quickSort;t.fromSourceMap=function(e,n){return o.fromSourceMap(e,n)},t.prototype._version=3,t.prototype.__generatedMappings=null,Object.defineProperty(t.prototype,"_generatedMappings",{configurable:!0,enumerable:!0,get:function(){return this.__generatedMappings||this._parseMappings(this._mappings,this.sourceRoot),this.__generatedMappings}}),t.prototype.__originalMappings=null,Object.defineProperty(t.prototype,"_originalMappings",{configurable:!0,enumerable:!0,get:function(){return this.__originalMappings||this._parseMappings(this._mappings,this.sourceRoot),this.__originalMappings}}),t.prototype._charIsMappingSeparator=function(e,n){var r=e.charAt(n);return";"===r||","===r},t.prototype._parseMappings=function(e,n){throw new Error("Subclasses must implement _parseMappings")},t.GENERATED_ORDER=1,t.ORIGINAL_ORDER=2,t.GREATEST_LOWER_BOUND=1,t.LEAST_UPPER_BOUND=2,t.prototype.eachMapping=function(e,n,r){var o,i=n||null,s=r||t.GENERATED_ORDER;switch(s){case t.GENERATED_ORDER:o=this._generatedMappings;break;case t.ORIGINAL_ORDER:o=this._originalMappings;break;default:throw new Error("Unknown order of iteration.")}var u=this.sourceRoot;o.map(function(e){var n=null===e.source?null:this._sources.at(e.source);return n=a.computeSourceURL(u,n,this._sourceMapURL),{source:n,generatedLine:e.generatedLine,generatedColumn:e.generatedColumn,originalLine:e.originalLine,originalColumn:e.originalColumn,name:null===e.name?null:this._names.at(e.name)}},this).forEach(e,i)},t.prototype.allGeneratedPositionsFor=function(e){var n=a.getArg(e,"line"),r={source:a.getArg(e,"source"),originalLine:n,originalColumn:a.getArg(e,"column",0)};if(r.source=this._findSourceIndex(r.source),r.source<0)return[];var t=[],o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",a.compareByOriginalPositions,u.LEAST_UPPER_BOUND);if(o>=0){var i=this._originalMappings[o];if(void 0===e.column)for(var s=i.originalLine;i&&i.originalLine===s;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o];else for(var l=i.originalColumn;i&&i.originalLine===n&&i.originalColumn==l;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o]}return t},n.SourceMapConsumer=t,o.prototype=Object.create(t.prototype),o.prototype.consumer=t,o.prototype._findSourceIndex=function(e){var n=e;if(null!=this.sourceRoot&&(n=a.relative(this.sourceRoot,n)),this._sources.has(n))return this._sources.indexOf(n);var r;for(r=0;r<this._absoluteSources.length;++r)if(this._absoluteSources[r]==e)return r;return-1},o.fromSourceMap=function(e,n){var r=Object.create(o.prototype),t=r._names=l.fromArray(e._names.toArray(),!0),s=r._sources=l.fromArray(e._sources.toArray(),!0);r.sourceRoot=e._sourceRoot,r.sourcesContent=e._generateSourcesContent(r._sources.toArray(),r.sourceRoot),r.file=e._file,r._sourceMapURL=n,r._absoluteSources=r._sources.toArray().map(function(e){return a.computeSourceURL(r.sourceRoot,e,n)});for(var u=e._mappings.toArray().slice(),c=r.__generatedMappings=[],p=r.__originalMappings=[],h=0,f=u.length;h<f;h++){var d=u[h],m=new i;m.generatedLine=d.generatedLine,m.generatedColumn=d.generatedColumn,d.source&&(m.source=s.indexOf(d.source),m.originalLine=d.originalLine,m.originalColumn=d.originalColumn,d.name&&(m.name=t.indexOf(d.name)),p.push(m)),c.push(m)}return g(r.__originalMappings,a.compareByOriginalPositions),r},o.prototype._version=3,Object.defineProperty(o.prototype,"sources",{get:function(){return this._absoluteSources.slice()}}),o.prototype._parseMappings=function(e,n){for(var r,t,o,s,u,l=1,p=0,h=0,f=0,d=0,m=0,_=e.length,v=0,y={},C={},S=[],A=[];v<_;)if(";"===e.charAt(v))l++,v++,p=0;else if(","===e.charAt(v))v++;else{for(r=new i,r.generatedLine=l,s=v;s<_&&!this._charIsMappingSeparator(e,s);s++);if(t=e.slice(v,s),o=y[t])v+=t.length;else{for(o=[];v<s;)c.decode(e,v,C),u=C.value,v=C.rest,o.push(u);if(2===o.length)throw new Error("Found a source, but no line and column");if(3===o.length)throw new Error("Found a source and line, but no column");y[t]=o}r.generatedColumn=p+o[0],p=r.generatedColumn,o.length>1&&(r.source=d+o[1],d+=o[1],r.originalLine=h+o[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+o[3],f=r.originalColumn,o.length>4&&(r.name=m+o[4],m+=o[4])),A.push(r),"number"==typeof r.originalLine&&S.push(r)}g(A,a.compareByGeneratedPositionsDeflated),this.__generatedMappings=A,g(S,a.compareByOriginalPositions),this.__originalMappings=S},o.prototype._findMapping=function(e,n,r,t,o,i){if(e[r]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[r]);if(e[t]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[t]);return u.search(e,n,o,i)},o.prototype.computeColumnSpans=function(){for(var e=0;e<this._generatedMappings.length;++e){var n=this._generatedMappings[e];if(e+1<this._generatedMappings.length){var r=this._generatedMappings[e+1];if(n.generatedLine===r.generatedLine){n.lastGeneratedColumn=r.generatedColumn-1;continue}}n.lastGeneratedColumn=1/0}},o.prototype.originalPositionFor=function(e){var n={generatedLine:a.getArg(e,"line"),generatedColumn:a.getArg(e,"column")},r=this._findMapping(n,this._generatedMappings,"generatedLine","generatedColumn",a.compareByGeneratedPositionsDeflated,a.getArg(e,"bias",t.GREATEST_LOWER_BOUND));if(r>=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=a.getArg(o,"source",null);null!==i&&(i=this._sources.at(i),i=a.computeSourceURL(this.sourceRoot,i,this._sourceMapURL));var s=a.getArg(o,"name",null);return null!==s&&(s=this._names.at(s)),{source:i,line:a.getArg(o,"originalLine",null),column:a.getArg(o,"originalColumn",null),name:s}}}return{source:null,line:null,column:null,name:null}},o.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},o.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;var r=this._findSourceIndex(e);if(r>=0)return this.sourcesContent[r];var t=e;null!=this.sourceRoot&&(t=a.relative(this.sourceRoot,t));var o;if(null!=this.sourceRoot&&(o=a.urlParse(this.sourceRoot))){var i=t.replace(/^file:\/\//,"");if("file"==o.scheme&&this._sources.has(i))return this.sourcesContent[this._sources.indexOf(i)];if((!o.path||"/"==o.path)&&this._sources.has("/"+t))return this.sourcesContent[this._sources.indexOf("/"+t)]}if(n)return null;throw new Error('"'+t+'" is not in the SourceMap.')},o.prototype.generatedPositionFor=function(e){var n=a.getArg(e,"source");if(n=this._findSourceIndex(n),n<0)return{line:null,column:null,lastColumn:null};var r={source:n,originalLine:a.getArg(e,"line"),originalColumn:a.getArg(e,"column")},o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",a.compareByOriginalPositions,a.getArg(e,"bias",t.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=o,s.prototype=Object.create(t.prototype),s.prototype.constructor=t,s.prototype._version=3,Object.defineProperty(s.prototype,"sources",{get:function(){for(var e=[],n=0;n<this._sections.length;n++)for(var r=0;r<this._sections[n].consumer.sources.length;r++)e.push(this._sections[n].consumer.sources[r]);return e}}),s.prototype.originalPositionFor=function(e){var n={generatedLine:a.getArg(e,"line"),generatedColumn:a.getArg(e,"column")},r=u.search(n,this._sections,function(e,n){var r=e.generatedLine-n.generatedOffset.generatedLine;return r?r:e.generatedColumn-n.generatedOffset.generatedColumn}),t=this._sections[r];return t?t.consumer.originalPositionFor({line:n.generatedLine-(t.generatedOffset.generatedLine-1),column:n.generatedColumn-(t.generatedOffset.generatedLine===n.generatedLine?t.generatedOffset.generatedColumn-1:0),bias:e.bias}):{source:null,line:null,column:null,name:null}},s.prototype.hasContentsOfAllSources=function(){return this._sections.every(function(e){return e.consumer.hasContentsOfAllSources()})},s.prototype.sourceContentFor=function(e,n){for(var r=0;r<this._sections.length;r++){var t=this._sections[r],o=t.consumer.sourceContentFor(e,!0);if(o)return o}if(n)return null;throw new Error('"'+e+'" is not in the SourceMap.')},s.prototype.generatedPositionFor=function(e){for(var n=0;n<this._sections.length;n++){var r=this._sections[n];if(r.consumer._findSourceIndex(a.getArg(e,"source"))!==-1){var t=r.consumer.generatedPositionFor(e);if(t){var o={line:t.line+(r.generatedOffset.generatedLine-1),column:t.column+(r.generatedOffset.generatedLine===t.line?r.generatedOffset.generatedColumn-1:0)};return o}}}return{line:null,column:null}},s.prototype._parseMappings=function(e,n){this.__generatedMappings=[],this.__originalMappings=[];for(var r=0;r<this._sections.length;r++)for(var t=this._sections[r],o=t.consumer._generatedMappings,i=0;i<o.length;i++){var s=o[i],u=t.consumer._sources.at(s.source);u=a.computeSourceURL(t.consumer.sourceRoot,u,this._sourceMapURL),this._sources.add(u),u=this._sources.indexOf(u);var l=null;s.name&&(l=t.consumer._names.at(s.name),this._names.add(l),l=this._names.indexOf(l));var c={source:u,generatedLine:s.generatedLine+(t.generatedOffset.generatedLine-1),generatedColumn:s.generatedColumn+(t.generatedOffset.generatedLine===s.generatedLine?t.generatedOffset.generatedColumn-1:0),originalLine:s.originalLine,originalColumn:s.originalColumn,name:l};this.__generatedMappings.push(c),"number"==typeof c.originalLine&&this.__originalMappings.push(c)}g(this.__generatedMappings,a.compareByGeneratedPositionsDeflated),g(this.__originalMappings,a.compareByOriginalPositions)},n.IndexedSourceMapConsumer=s},function(e,n){function r(e,t,o,i,s,a){var u=Math.floor((t-e)/2)+e,l=s(o,i[u],!0);return 0===l?u:l>0?t-u>1?r(u,t,o,i,s,a):a==n.LEAST_UPPER_BOUND?t<i.length?t:-1:u:u-e>1?r(e,u,o,i,s,a):a==n.LEAST_UPPER_BOUND?u:e<0?-1:e}n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,t,o,i){if(0===t.length)return-1;var s=r(-1,t.length,e,t,o,i||n.GREATEST_LOWER_BOUND);if(s<0)return-1;for(;s-1>=0&&0===o(t[s],t[s-1],!0);)--s;return s}},function(e,n){function r(e,n,r){var t=e[n];e[n]=e[r],e[r]=t}function t(e,n){return Math.round(e+Math.random()*(n-e))}function o(e,n,i,s){if(i<s){var a=t(i,s),u=i-1;r(e,a,s);for(var l=e[s],c=i;c<s;c++)n(e[c],l)<=0&&(u+=1,r(e,u,c));r(e,u+1,c);var g=u+1;o(e,n,i,g-1),o(e,n,g+1,s)}}n.quickSort=function(e,n){o(e,n,0,e.length-1)}},function(e,n,r){function t(e,n,r,t,o){this.children=[],this.sourceContents={},this.line=null==e?null:e,this.column=null==n?null:n,this.source=null==r?null:r,this.name=null==o?null:o,this[u]=!0,null!=t&&this.add(t)}var o=r(1).SourceMapGenerator,i=r(4),s=/(\r?\n)/,a=10,u="$$$isSourceNode$$$";t.fromStringWithSourceMap=function(e,n,r){function o(e,n){if(null===e||void 0===e.source)a.add(n);else{var o=r?i.join(r,e.source):e.source;a.add(new t(e.originalLine,e.originalColumn,o,n,e.name))}}var a=new t,u=e.split(s),l=0,c=function(){function e(){return l<u.length?u[l++]:void 0}var n=e(),r=e()||"";return n+r},g=1,p=0,h=null;return n.eachMapping(function(e){if(null!==h){if(!(g<e.generatedLine)){var n=u[l]||"",r=n.substr(0,e.generatedColumn-p);return u[l]=n.substr(e.generatedColumn-p),p=e.generatedColumn,o(h,r),void(h=e)}o(h,c()),g++,p=0}for(;g<e.generatedLine;)a.add(c()),g++;if(p<e.generatedColumn){var n=u[l]||"";a.add(n.substr(0,e.generatedColumn)),u[l]=n.substr(e.generatedColumn),p=e.generatedColumn}h=e},this),l<u.length&&(h&&o(h,c()),a.add(u.splice(l).join(""))),n.sources.forEach(function(e){var t=n.sourceContentFor(e);null!=t&&(null!=r&&(e=i.join(r,e)),a.setSourceContent(e,t))}),a},t.prototype.add=function(e){if(Array.isArray(e))e.forEach(function(e){this.add(e)},this);else{if(!e[u]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);e&&this.children.push(e)}return this},t.prototype.prepend=function(e){if(Array.isArray(e))for(var n=e.length-1;n>=0;n--)this.prepend(e[n]);else{if(!e[u]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);this.children.unshift(e)}return this},t.prototype.walk=function(e){for(var n,r=0,t=this.children.length;r<t;r++)n=this.children[r],n[u]?n.walk(e):""!==n&&e(n,{source:this.source,line:this.line,column:this.column,name:this.name})},t.prototype.join=function(e){var n,r,t=this.children.length;if(t>0){for(n=[],r=0;r<t-1;r++)n.push(this.children[r]),n.push(e);n.push(this.children[r]),this.children=n}return this},t.prototype.replaceRight=function(e,n){var r=this.children[this.children.length-1];return r[u]?r.replaceRight(e,n):"string"==typeof r?this.children[this.children.length-1]=r.replace(e,n):this.children.push("".replace(e,n)),this},t.prototype.setSourceContent=function(e,n){this.sourceContents[i.toSetString(e)]=n},t.prototype.walkSourceContents=function(e){for(var n=0,r=this.children.length;n<r;n++)this.children[n][u]&&this.children[n].walkSourceContents(e);for(var t=Object.keys(this.sourceContents),n=0,r=t.length;n<r;n++)e(i.fromSetString(t[n]),this.sourceContents[t[n]])},t.prototype.toString=function(){var e="";return this.walk(function(n){e+=n}),e},t.prototype.toStringWithSourceMap=function(e){var n={code:"",line:1,column:0},r=new o(e),t=!1,i=null,s=null,u=null,l=null;return this.walk(function(e,o){n.code+=e,null!==o.source&&null!==o.line&&null!==o.column?(i===o.source&&s===o.line&&u===o.column&&l===o.name||r.addMapping({source:o.source,original:{line:o.line,column:o.column},generated:{line:n.line,column:n.column},name:o.name}),i=o.source,s=o.line,u=o.column,l=o.name,t=!0):t&&(r.addMapping({generated:{line:n.line,column:n.column}}),i=null,t=!1);for(var c=0,g=e.length;c<g;c++)e.charCodeAt(c)===a?(n.line++,n.column=0,c+1===g?(i=null,t=!1):t&&r.addMapping({source:o.source,original:{line:o.line,column:o.column},generated:{line:n.line,column:n.column},name:o.name})):n.column++}),this.walkSourceContents(function(e,n){r.setSourceContent(e,n)}),{code:n.code,map:r}},n.SourceNode=t}])});
//# sourceMappingURL=source-map.min.js.map{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///source-map.min.js","webpack:///webpack/bootstrap 0fd5815da764db5fb9fe","webpack:///./source-map.js","webpack:///./lib/source-map-generator.js","webpack:///./lib/base64-vlq.js","webpack:///./lib/base64.js","webpack:///./lib/util.js","webpack:///./lib/array-set.js","webpack:///./lib/mapping-list.js","webpack:///./lib/source-map-consumer.js","webpack:///./lib/binary-search.js","webpack:///./lib/quick-sort.js","webpack:///./lib/source-node.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","SourceMapGenerator","SourceMapConsumer","SourceNode","aArgs","_file","util","getArg","_sourceRoot","_skipValidation","_sources","ArraySet","_names","_mappings","MappingList","_sourcesContents","base64VLQ","prototype","_version","fromSourceMap","aSourceMapConsumer","sourceRoot","generator","file","eachMapping","mapping","newMapping","generated","line","generatedLine","column","generatedColumn","source","relative","original","originalLine","originalColumn","name","addMapping","sources","forEach","sourceFile","sourceRelative","has","add","content","sourceContentFor","setSourceContent","_validateMapping","String","aSourceFile","aSourceContent","Object","create","toSetString","keys","length","applySourceMap","aSourceMapPath","Error","newSources","newNames","unsortedForEach","originalPositionFor","join","aGenerated","aOriginal","aSource","aName","JSON","stringify","_serializeMappings","next","nameIdx","sourceIdx","previousGeneratedColumn","previousGeneratedLine","previousOriginalColumn","previousOriginalLine","previousName","previousSource","result","mappings","toArray","i","len","compareByGeneratedPositionsInflated","encode","indexOf","_generateSourcesContent","aSources","aSourceRoot","map","key","hasOwnProperty","toJSON","version","names","sourcesContent","toString","toVLQSigned","aValue","fromVLQSigned","isNegative","shifted","base64","VLQ_BASE_SHIFT","VLQ_BASE","VLQ_BASE_MASK","VLQ_CONTINUATION_BIT","digit","encoded","vlq","decode","aStr","aIndex","aOutParam","continuation","strLen","shift","charCodeAt","charAt","value","rest","intToCharMap","split","number","TypeError","charCode","bigA","bigZ","littleA","littleZ","zero","nine","plus","slash","littleOffset","numberOffset","aDefaultValue","arguments","urlParse","aUrl","match","urlRegexp","scheme","auth","host","port","path","urlGenerate","aParsedUrl","url","normalize","aPath","part","isAbsolute","parts","up","splice","aRoot","aPathUrl","aRootUrl","dataUrlRegexp","joined","replace","level","index","lastIndexOf","slice","Array","substr","identity","s","isProtoString","fromSetString","compareByOriginalPositions","mappingA","mappingB","onlyCompareOriginal","cmp","strcmp","compareByGeneratedPositionsDeflated","onlyCompareGenerated","aStr1","aStr2","parseSourceMapInput","str","parse","computeSourceURL","sourceURL","sourceMapURL","parsed","substring","test","supportsNullProto","obj","_array","_set","hasNativeMap","Map","fromArray","aArray","aAllowDuplicates","set","size","getOwnPropertyNames","sStr","isDuplicate","idx","push","get","at","aIdx","generatedPositionAfter","lineA","lineB","columnA","columnB","_sorted","_last","aCallback","aThisArg","aMapping","sort","aSourceMap","aSourceMapURL","sourceMap","sections","IndexedSourceMapConsumer","BasicSourceMapConsumer","_absoluteSources","_sourceMapURL","Mapping","lastOffset","_sections","offset","offsetLine","offsetColumn","generatedOffset","consumer","binarySearch","quickSort","__generatedMappings","defineProperty","configurable","enumerable","_parseMappings","__originalMappings","_charIsMappingSeparator","GENERATED_ORDER","ORIGINAL_ORDER","GREATEST_LOWER_BOUND","LEAST_UPPER_BOUND","aContext","aOrder","context","order","_generatedMappings","_originalMappings","allGeneratedPositionsFor","needle","_findSourceIndex","_findMapping","undefined","lastColumn","relativeSource","smc","generatedMappings","destGeneratedMappings","destOriginalMappings","srcMapping","destMapping","segment","end","cachedSegments","temp","originalMappings","aNeedle","aMappings","aLineName","aColumnName","aComparator","aBias","search","computeColumnSpans","nextMapping","lastGeneratedColumn","Infinity","hasContentsOfAllSources","some","sc","nullOnMissing","fileUriAbsPath","generatedPositionFor","constructor","j","sectionIndex","section","bias","every","generatedPosition","ret","sectionMappings","adjustedMapping","recursiveSearch","aLow","aHigh","aHaystack","aCompare","mid","Math","floor","swap","ary","x","y","randomIntInRange","low","high","round","random","doQuickSort","comparator","r","pivotIndex","pivot","q","aLine","aColumn","aChunks","children","sourceContents","isSourceNode","REGEX_NEWLINE","NEWLINE_CODE","fromStringWithSourceMap","aGeneratedCode","aRelativePath","addMappingWithCode","code","node","remainingLines","remainingLinesIndex","shiftNextLine","getNextLine","lineContents","newLine","lastGeneratedLine","lastMapping","nextLine","aChunk","isArray","chunk","prepend","unshift","walk","aFn","aSep","newChildren","replaceRight","aPattern","aReplacement","lastChild","walkSourceContents","toStringWithSourceMap","sourceMappingActive","lastOriginalSource","lastOriginalLine","lastOriginalColumn","lastOriginalName","sourceContent"],"mappings":"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","file":"source-map.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sourceMap\"] = factory();\n\telse\n\t\troot[\"sourceMap\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sourceMap\"] = factory();\n\telse\n\t\troot[\"sourceMap\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t * Copyright 2009-2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE.txt or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\texports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\texports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;\n\texports.SourceNode = __webpack_require__(10).SourceNode;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar base64VLQ = __webpack_require__(2);\n\tvar util = __webpack_require__(4);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar MappingList = __webpack_require__(6).MappingList;\n\t\n\t/**\n\t * An instance of the SourceMapGenerator represents a source map which is\n\t * being built incrementally. You may pass an object with the following\n\t * properties:\n\t *\n\t *   - file: The filename of the generated source.\n\t *   - sourceRoot: A root for all relative URLs in this source map.\n\t */\n\tfunction SourceMapGenerator(aArgs) {\n\t  if (!aArgs) {\n\t    aArgs = {};\n\t  }\n\t  this._file = util.getArg(aArgs, 'file', null);\n\t  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n\t  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n\t  this._sources = new ArraySet();\n\t  this._names = new ArraySet();\n\t  this._mappings = new MappingList();\n\t  this._sourcesContents = null;\n\t}\n\t\n\tSourceMapGenerator.prototype._version = 3;\n\t\n\t/**\n\t * Creates a new SourceMapGenerator based on a SourceMapConsumer\n\t *\n\t * @param aSourceMapConsumer The SourceMap.\n\t */\n\tSourceMapGenerator.fromSourceMap =\n\t  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n\t    var sourceRoot = aSourceMapConsumer.sourceRoot;\n\t    var generator = new SourceMapGenerator({\n\t      file: aSourceMapConsumer.file,\n\t      sourceRoot: sourceRoot\n\t    });\n\t    aSourceMapConsumer.eachMapping(function (mapping) {\n\t      var newMapping = {\n\t        generated: {\n\t          line: mapping.generatedLine,\n\t          column: mapping.generatedColumn\n\t        }\n\t      };\n\t\n\t      if (mapping.source != null) {\n\t        newMapping.source = mapping.source;\n\t        if (sourceRoot != null) {\n\t          newMapping.source = util.relative(sourceRoot, newMapping.source);\n\t        }\n\t\n\t        newMapping.original = {\n\t          line: mapping.originalLine,\n\t          column: mapping.originalColumn\n\t        };\n\t\n\t        if (mapping.name != null) {\n\t          newMapping.name = mapping.name;\n\t        }\n\t      }\n\t\n\t      generator.addMapping(newMapping);\n\t    });\n\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t      var sourceRelative = sourceFile;\n\t      if (sourceRoot !== null) {\n\t        sourceRelative = util.relative(sourceRoot, sourceFile);\n\t      }\n\t\n\t      if (!generator._sources.has(sourceRelative)) {\n\t        generator._sources.add(sourceRelative);\n\t      }\n\t\n\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t      if (content != null) {\n\t        generator.setSourceContent(sourceFile, content);\n\t      }\n\t    });\n\t    return generator;\n\t  };\n\t\n\t/**\n\t * Add a single mapping from original source line and column to the generated\n\t * source's line and column for this source map being created. The mapping\n\t * object should have the following properties:\n\t *\n\t *   - generated: An object with the generated line and column positions.\n\t *   - original: An object with the original line and column positions.\n\t *   - source: The original source file (relative to the sourceRoot).\n\t *   - name: An optional original token name for this mapping.\n\t */\n\tSourceMapGenerator.prototype.addMapping =\n\t  function SourceMapGenerator_addMapping(aArgs) {\n\t    var generated = util.getArg(aArgs, 'generated');\n\t    var original = util.getArg(aArgs, 'original', null);\n\t    var source = util.getArg(aArgs, 'source', null);\n\t    var name = util.getArg(aArgs, 'name', null);\n\t\n\t    if (!this._skipValidation) {\n\t      this._validateMapping(generated, original, source, name);\n\t    }\n\t\n\t    if (source != null) {\n\t      source = String(source);\n\t      if (!this._sources.has(source)) {\n\t        this._sources.add(source);\n\t      }\n\t    }\n\t\n\t    if (name != null) {\n\t      name = String(name);\n\t      if (!this._names.has(name)) {\n\t        this._names.add(name);\n\t      }\n\t    }\n\t\n\t    this._mappings.add({\n\t      generatedLine: generated.line,\n\t      generatedColumn: generated.column,\n\t      originalLine: original != null && original.line,\n\t      originalColumn: original != null && original.column,\n\t      source: source,\n\t      name: name\n\t    });\n\t  };\n\t\n\t/**\n\t * Set the source content for a source file.\n\t */\n\tSourceMapGenerator.prototype.setSourceContent =\n\t  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n\t    var source = aSourceFile;\n\t    if (this._sourceRoot != null) {\n\t      source = util.relative(this._sourceRoot, source);\n\t    }\n\t\n\t    if (aSourceContent != null) {\n\t      // Add the source content to the _sourcesContents map.\n\t      // Create a new _sourcesContents map if the property is null.\n\t      if (!this._sourcesContents) {\n\t        this._sourcesContents = Object.create(null);\n\t      }\n\t      this._sourcesContents[util.toSetString(source)] = aSourceContent;\n\t    } else if (this._sourcesContents) {\n\t      // Remove the source file from the _sourcesContents map.\n\t      // If the _sourcesContents map is empty, set the property to null.\n\t      delete this._sourcesContents[util.toSetString(source)];\n\t      if (Object.keys(this._sourcesContents).length === 0) {\n\t        this._sourcesContents = null;\n\t      }\n\t    }\n\t  };\n\t\n\t/**\n\t * Applies the mappings of a sub-source-map for a specific source file to the\n\t * source map being generated. Each mapping to the supplied source file is\n\t * rewritten using the supplied source map. Note: The resolution for the\n\t * resulting mappings is the minimium of this map and the supplied map.\n\t *\n\t * @param aSourceMapConsumer The source map to be applied.\n\t * @param aSourceFile Optional. The filename of the source file.\n\t *        If omitted, SourceMapConsumer's file property will be used.\n\t * @param aSourceMapPath Optional. The dirname of the path to the source map\n\t *        to be applied. If relative, it is relative to the SourceMapConsumer.\n\t *        This parameter is needed when the two source maps aren't in the same\n\t *        directory, and the source map to be applied contains relative source\n\t *        paths. If so, those relative source paths need to be rewritten\n\t *        relative to the SourceMapGenerator.\n\t */\n\tSourceMapGenerator.prototype.applySourceMap =\n\t  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n\t    var sourceFile = aSourceFile;\n\t    // If aSourceFile is omitted, we will use the file property of the SourceMap\n\t    if (aSourceFile == null) {\n\t      if (aSourceMapConsumer.file == null) {\n\t        throw new Error(\n\t          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n\t          'or the source map\\'s \"file\" property. Both were omitted.'\n\t        );\n\t      }\n\t      sourceFile = aSourceMapConsumer.file;\n\t    }\n\t    var sourceRoot = this._sourceRoot;\n\t    // Make \"sourceFile\" relative if an absolute Url is passed.\n\t    if (sourceRoot != null) {\n\t      sourceFile = util.relative(sourceRoot, sourceFile);\n\t    }\n\t    // Applying the SourceMap can add and remove items from the sources and\n\t    // the names array.\n\t    var newSources = new ArraySet();\n\t    var newNames = new ArraySet();\n\t\n\t    // Find mappings for the \"sourceFile\"\n\t    this._mappings.unsortedForEach(function (mapping) {\n\t      if (mapping.source === sourceFile && mapping.originalLine != null) {\n\t        // Check if it can be mapped by the source map, then update the mapping.\n\t        var original = aSourceMapConsumer.originalPositionFor({\n\t          line: mapping.originalLine,\n\t          column: mapping.originalColumn\n\t        });\n\t        if (original.source != null) {\n\t          // Copy mapping\n\t          mapping.source = original.source;\n\t          if (aSourceMapPath != null) {\n\t            mapping.source = util.join(aSourceMapPath, mapping.source)\n\t          }\n\t          if (sourceRoot != null) {\n\t            mapping.source = util.relative(sourceRoot, mapping.source);\n\t          }\n\t          mapping.originalLine = original.line;\n\t          mapping.originalColumn = original.column;\n\t          if (original.name != null) {\n\t            mapping.name = original.name;\n\t          }\n\t        }\n\t      }\n\t\n\t      var source = mapping.source;\n\t      if (source != null && !newSources.has(source)) {\n\t        newSources.add(source);\n\t      }\n\t\n\t      var name = mapping.name;\n\t      if (name != null && !newNames.has(name)) {\n\t        newNames.add(name);\n\t      }\n\t\n\t    }, this);\n\t    this._sources = newSources;\n\t    this._names = newNames;\n\t\n\t    // Copy sourcesContents of applied map.\n\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t      if (content != null) {\n\t        if (aSourceMapPath != null) {\n\t          sourceFile = util.join(aSourceMapPath, sourceFile);\n\t        }\n\t        if (sourceRoot != null) {\n\t          sourceFile = util.relative(sourceRoot, sourceFile);\n\t        }\n\t        this.setSourceContent(sourceFile, content);\n\t      }\n\t    }, this);\n\t  };\n\t\n\t/**\n\t * A mapping can have one of the three levels of data:\n\t *\n\t *   1. Just the generated position.\n\t *   2. The Generated position, original position, and original source.\n\t *   3. Generated and original position, original source, as well as a name\n\t *      token.\n\t *\n\t * To maintain consistency, we validate that any new mapping being added falls\n\t * in to one of these categories.\n\t */\n\tSourceMapGenerator.prototype._validateMapping =\n\t  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n\t                                              aName) {\n\t    // When aOriginal is truthy but has empty values for .line and .column,\n\t    // it is most likely a programmer error. In this case we throw a very\n\t    // specific error message to try to guide them the right way.\n\t    // For example: https://github.com/Polymer/polymer-bundler/pull/519\n\t    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n\t        throw new Error(\n\t            'original.line and original.column are not numbers -- you probably meant to omit ' +\n\t            'the original mapping entirely and only map the generated position. If so, pass ' +\n\t            'null for the original mapping instead of an object with empty or null values.'\n\t        );\n\t    }\n\t\n\t    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t        && aGenerated.line > 0 && aGenerated.column >= 0\n\t        && !aOriginal && !aSource && !aName) {\n\t      // Case 1.\n\t      return;\n\t    }\n\t    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t             && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n\t             && aGenerated.line > 0 && aGenerated.column >= 0\n\t             && aOriginal.line > 0 && aOriginal.column >= 0\n\t             && aSource) {\n\t      // Cases 2 and 3.\n\t      return;\n\t    }\n\t    else {\n\t      throw new Error('Invalid mapping: ' + JSON.stringify({\n\t        generated: aGenerated,\n\t        source: aSource,\n\t        original: aOriginal,\n\t        name: aName\n\t      }));\n\t    }\n\t  };\n\t\n\t/**\n\t * Serialize the accumulated mappings in to the stream of base 64 VLQs\n\t * specified by the source map format.\n\t */\n\tSourceMapGenerator.prototype._serializeMappings =\n\t  function SourceMapGenerator_serializeMappings() {\n\t    var previousGeneratedColumn = 0;\n\t    var previousGeneratedLine = 1;\n\t    var previousOriginalColumn = 0;\n\t    var previousOriginalLine = 0;\n\t    var previousName = 0;\n\t    var previousSource = 0;\n\t    var result = '';\n\t    var next;\n\t    var mapping;\n\t    var nameIdx;\n\t    var sourceIdx;\n\t\n\t    var mappings = this._mappings.toArray();\n\t    for (var i = 0, len = mappings.length; i < len; i++) {\n\t      mapping = mappings[i];\n\t      next = ''\n\t\n\t      if (mapping.generatedLine !== previousGeneratedLine) {\n\t        previousGeneratedColumn = 0;\n\t        while (mapping.generatedLine !== previousGeneratedLine) {\n\t          next += ';';\n\t          previousGeneratedLine++;\n\t        }\n\t      }\n\t      else {\n\t        if (i > 0) {\n\t          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n\t            continue;\n\t          }\n\t          next += ',';\n\t        }\n\t      }\n\t\n\t      next += base64VLQ.encode(mapping.generatedColumn\n\t                                 - previousGeneratedColumn);\n\t      previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t      if (mapping.source != null) {\n\t        sourceIdx = this._sources.indexOf(mapping.source);\n\t        next += base64VLQ.encode(sourceIdx - previousSource);\n\t        previousSource = sourceIdx;\n\t\n\t        // lines are stored 0-based in SourceMap spec version 3\n\t        next += base64VLQ.encode(mapping.originalLine - 1\n\t                                   - previousOriginalLine);\n\t        previousOriginalLine = mapping.originalLine - 1;\n\t\n\t        next += base64VLQ.encode(mapping.originalColumn\n\t                                   - previousOriginalColumn);\n\t        previousOriginalColumn = mapping.originalColumn;\n\t\n\t        if (mapping.name != null) {\n\t          nameIdx = this._names.indexOf(mapping.name);\n\t          next += base64VLQ.encode(nameIdx - previousName);\n\t          previousName = nameIdx;\n\t        }\n\t      }\n\t\n\t      result += next;\n\t    }\n\t\n\t    return result;\n\t  };\n\t\n\tSourceMapGenerator.prototype._generateSourcesContent =\n\t  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n\t    return aSources.map(function (source) {\n\t      if (!this._sourcesContents) {\n\t        return null;\n\t      }\n\t      if (aSourceRoot != null) {\n\t        source = util.relative(aSourceRoot, source);\n\t      }\n\t      var key = util.toSetString(source);\n\t      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n\t        ? this._sourcesContents[key]\n\t        : null;\n\t    }, this);\n\t  };\n\t\n\t/**\n\t * Externalize the source map.\n\t */\n\tSourceMapGenerator.prototype.toJSON =\n\t  function SourceMapGenerator_toJSON() {\n\t    var map = {\n\t      version: this._version,\n\t      sources: this._sources.toArray(),\n\t      names: this._names.toArray(),\n\t      mappings: this._serializeMappings()\n\t    };\n\t    if (this._file != null) {\n\t      map.file = this._file;\n\t    }\n\t    if (this._sourceRoot != null) {\n\t      map.sourceRoot = this._sourceRoot;\n\t    }\n\t    if (this._sourcesContents) {\n\t      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n\t    }\n\t\n\t    return map;\n\t  };\n\t\n\t/**\n\t * Render the source map being generated to a string.\n\t */\n\tSourceMapGenerator.prototype.toString =\n\t  function SourceMapGenerator_toString() {\n\t    return JSON.stringify(this.toJSON());\n\t  };\n\t\n\texports.SourceMapGenerator = SourceMapGenerator;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t *\n\t * Based on the Base 64 VLQ implementation in Closure Compiler:\n\t * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n\t *\n\t * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n\t * Redistribution and use in source and binary forms, with or without\n\t * modification, are permitted provided that the following conditions are\n\t * met:\n\t *\n\t *  * Redistributions of source code must retain the above copyright\n\t *    notice, this list of conditions and the following disclaimer.\n\t *  * Redistributions in binary form must reproduce the above\n\t *    copyright notice, this list of conditions and the following\n\t *    disclaimer in the documentation and/or other materials provided\n\t *    with the distribution.\n\t *  * Neither the name of Google Inc. nor the names of its\n\t *    contributors may be used to endorse or promote products derived\n\t *    from this software without specific prior written permission.\n\t *\n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\t * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n\t * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n\t * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n\t * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n\t * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n\t * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n\t * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n\t * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t */\n\t\n\tvar base64 = __webpack_require__(3);\n\t\n\t// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n\t// length quantities we use in the source map spec, the first bit is the sign,\n\t// the next four bits are the actual value, and the 6th bit is the\n\t// continuation bit. The continuation bit tells us whether there are more\n\t// digits in this value following this digit.\n\t//\n\t//   Continuation\n\t//   |    Sign\n\t//   |    |\n\t//   V    V\n\t//   101011\n\t\n\tvar VLQ_BASE_SHIFT = 5;\n\t\n\t// binary: 100000\n\tvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\t\n\t// binary: 011111\n\tvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\t\n\t// binary: 100000\n\tvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\t\n\t/**\n\t * Converts from a two-complement value to a value where the sign bit is\n\t * placed in the least significant bit.  For example, as decimals:\n\t *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n\t *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n\t */\n\tfunction toVLQSigned(aValue) {\n\t  return aValue < 0\n\t    ? ((-aValue) << 1) + 1\n\t    : (aValue << 1) + 0;\n\t}\n\t\n\t/**\n\t * Converts to a two-complement value from a value where the sign bit is\n\t * placed in the least significant bit.  For example, as decimals:\n\t *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n\t *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n\t */\n\tfunction fromVLQSigned(aValue) {\n\t  var isNegative = (aValue & 1) === 1;\n\t  var shifted = aValue >> 1;\n\t  return isNegative\n\t    ? -shifted\n\t    : shifted;\n\t}\n\t\n\t/**\n\t * Returns the base 64 VLQ encoded value.\n\t */\n\texports.encode = function base64VLQ_encode(aValue) {\n\t  var encoded = \"\";\n\t  var digit;\n\t\n\t  var vlq = toVLQSigned(aValue);\n\t\n\t  do {\n\t    digit = vlq & VLQ_BASE_MASK;\n\t    vlq >>>= VLQ_BASE_SHIFT;\n\t    if (vlq > 0) {\n\t      // There are still more digits in this value, so we must make sure the\n\t      // continuation bit is marked.\n\t      digit |= VLQ_CONTINUATION_BIT;\n\t    }\n\t    encoded += base64.encode(digit);\n\t  } while (vlq > 0);\n\t\n\t  return encoded;\n\t};\n\t\n\t/**\n\t * Decodes the next base 64 VLQ value from the given string and returns the\n\t * value and the rest of the string via the out parameter.\n\t */\n\texports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n\t  var strLen = aStr.length;\n\t  var result = 0;\n\t  var shift = 0;\n\t  var continuation, digit;\n\t\n\t  do {\n\t    if (aIndex >= strLen) {\n\t      throw new Error(\"Expected more digits in base 64 VLQ value.\");\n\t    }\n\t\n\t    digit = base64.decode(aStr.charCodeAt(aIndex++));\n\t    if (digit === -1) {\n\t      throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n\t    }\n\t\n\t    continuation = !!(digit & VLQ_CONTINUATION_BIT);\n\t    digit &= VLQ_BASE_MASK;\n\t    result = result + (digit << shift);\n\t    shift += VLQ_BASE_SHIFT;\n\t  } while (continuation);\n\t\n\t  aOutParam.value = fromVLQSigned(result);\n\t  aOutParam.rest = aIndex;\n\t};\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\t\n\t/**\n\t * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n\t */\n\texports.encode = function (number) {\n\t  if (0 <= number && number < intToCharMap.length) {\n\t    return intToCharMap[number];\n\t  }\n\t  throw new TypeError(\"Must be between 0 and 63: \" + number);\n\t};\n\t\n\t/**\n\t * Decode a single base 64 character code digit to an integer. Returns -1 on\n\t * failure.\n\t */\n\texports.decode = function (charCode) {\n\t  var bigA = 65;     // 'A'\n\t  var bigZ = 90;     // 'Z'\n\t\n\t  var littleA = 97;  // 'a'\n\t  var littleZ = 122; // 'z'\n\t\n\t  var zero = 48;     // '0'\n\t  var nine = 57;     // '9'\n\t\n\t  var plus = 43;     // '+'\n\t  var slash = 47;    // '/'\n\t\n\t  var littleOffset = 26;\n\t  var numberOffset = 52;\n\t\n\t  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n\t  if (bigA <= charCode && charCode <= bigZ) {\n\t    return (charCode - bigA);\n\t  }\n\t\n\t  // 26 - 51: abcdefghijklmnopqrstuvwxyz\n\t  if (littleA <= charCode && charCode <= littleZ) {\n\t    return (charCode - littleA + littleOffset);\n\t  }\n\t\n\t  // 52 - 61: 0123456789\n\t  if (zero <= charCode && charCode <= nine) {\n\t    return (charCode - zero + numberOffset);\n\t  }\n\t\n\t  // 62: +\n\t  if (charCode == plus) {\n\t    return 62;\n\t  }\n\t\n\t  // 63: /\n\t  if (charCode == slash) {\n\t    return 63;\n\t  }\n\t\n\t  // Invalid base64 digit.\n\t  return -1;\n\t};\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t/**\n\t * This is a helper function for getting values from parameter/options\n\t * objects.\n\t *\n\t * @param args The object we are extracting values from\n\t * @param name The name of the property we are getting.\n\t * @param defaultValue An optional value to return if the property is missing\n\t * from the object. If this is not specified and the property is missing, an\n\t * error will be thrown.\n\t */\n\tfunction getArg(aArgs, aName, aDefaultValue) {\n\t  if (aName in aArgs) {\n\t    return aArgs[aName];\n\t  } else if (arguments.length === 3) {\n\t    return aDefaultValue;\n\t  } else {\n\t    throw new Error('\"' + aName + '\" is a required argument.');\n\t  }\n\t}\n\texports.getArg = getArg;\n\t\n\tvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\n\tvar dataUrlRegexp = /^data:.+\\,.+$/;\n\t\n\tfunction urlParse(aUrl) {\n\t  var match = aUrl.match(urlRegexp);\n\t  if (!match) {\n\t    return null;\n\t  }\n\t  return {\n\t    scheme: match[1],\n\t    auth: match[2],\n\t    host: match[3],\n\t    port: match[4],\n\t    path: match[5]\n\t  };\n\t}\n\texports.urlParse = urlParse;\n\t\n\tfunction urlGenerate(aParsedUrl) {\n\t  var url = '';\n\t  if (aParsedUrl.scheme) {\n\t    url += aParsedUrl.scheme + ':';\n\t  }\n\t  url += '//';\n\t  if (aParsedUrl.auth) {\n\t    url += aParsedUrl.auth + '@';\n\t  }\n\t  if (aParsedUrl.host) {\n\t    url += aParsedUrl.host;\n\t  }\n\t  if (aParsedUrl.port) {\n\t    url += \":\" + aParsedUrl.port\n\t  }\n\t  if (aParsedUrl.path) {\n\t    url += aParsedUrl.path;\n\t  }\n\t  return url;\n\t}\n\texports.urlGenerate = urlGenerate;\n\t\n\t/**\n\t * Normalizes a path, or the path portion of a URL:\n\t *\n\t * - Replaces consecutive slashes with one slash.\n\t * - Removes unnecessary '.' parts.\n\t * - Removes unnecessary '<dir>/..' parts.\n\t *\n\t * Based on code in the Node.js 'path' core module.\n\t *\n\t * @param aPath The path or url to normalize.\n\t */\n\tfunction normalize(aPath) {\n\t  var path = aPath;\n\t  var url = urlParse(aPath);\n\t  if (url) {\n\t    if (!url.path) {\n\t      return aPath;\n\t    }\n\t    path = url.path;\n\t  }\n\t  var isAbsolute = exports.isAbsolute(path);\n\t\n\t  var parts = path.split(/\\/+/);\n\t  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n\t    part = parts[i];\n\t    if (part === '.') {\n\t      parts.splice(i, 1);\n\t    } else if (part === '..') {\n\t      up++;\n\t    } else if (up > 0) {\n\t      if (part === '') {\n\t        // The first part is blank if the path is absolute. Trying to go\n\t        // above the root is a no-op. Therefore we can remove all '..' parts\n\t        // directly after the root.\n\t        parts.splice(i + 1, up);\n\t        up = 0;\n\t      } else {\n\t        parts.splice(i, 2);\n\t        up--;\n\t      }\n\t    }\n\t  }\n\t  path = parts.join('/');\n\t\n\t  if (path === '') {\n\t    path = isAbsolute ? '/' : '.';\n\t  }\n\t\n\t  if (url) {\n\t    url.path = path;\n\t    return urlGenerate(url);\n\t  }\n\t  return path;\n\t}\n\texports.normalize = normalize;\n\t\n\t/**\n\t * Joins two paths/URLs.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be joined with the root.\n\t *\n\t * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n\t *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n\t *   first.\n\t * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n\t *   is updated with the result and aRoot is returned. Otherwise the result\n\t *   is returned.\n\t *   - If aPath is absolute, the result is aPath.\n\t *   - Otherwise the two paths are joined with a slash.\n\t * - Joining for example 'http://' and 'www.example.com' is also supported.\n\t */\n\tfunction join(aRoot, aPath) {\n\t  if (aRoot === \"\") {\n\t    aRoot = \".\";\n\t  }\n\t  if (aPath === \"\") {\n\t    aPath = \".\";\n\t  }\n\t  var aPathUrl = urlParse(aPath);\n\t  var aRootUrl = urlParse(aRoot);\n\t  if (aRootUrl) {\n\t    aRoot = aRootUrl.path || '/';\n\t  }\n\t\n\t  // `join(foo, '//www.example.org')`\n\t  if (aPathUrl && !aPathUrl.scheme) {\n\t    if (aRootUrl) {\n\t      aPathUrl.scheme = aRootUrl.scheme;\n\t    }\n\t    return urlGenerate(aPathUrl);\n\t  }\n\t\n\t  if (aPathUrl || aPath.match(dataUrlRegexp)) {\n\t    return aPath;\n\t  }\n\t\n\t  // `join('http://', 'www.example.com')`\n\t  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n\t    aRootUrl.host = aPath;\n\t    return urlGenerate(aRootUrl);\n\t  }\n\t\n\t  var joined = aPath.charAt(0) === '/'\n\t    ? aPath\n\t    : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\t\n\t  if (aRootUrl) {\n\t    aRootUrl.path = joined;\n\t    return urlGenerate(aRootUrl);\n\t  }\n\t  return joined;\n\t}\n\texports.join = join;\n\t\n\texports.isAbsolute = function (aPath) {\n\t  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\n\t};\n\t\n\t/**\n\t * Make a path relative to a URL or another path.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be made relative to aRoot.\n\t */\n\tfunction relative(aRoot, aPath) {\n\t  if (aRoot === \"\") {\n\t    aRoot = \".\";\n\t  }\n\t\n\t  aRoot = aRoot.replace(/\\/$/, '');\n\t\n\t  // It is possible for the path to be above the root. In this case, simply\n\t  // checking whether the root is a prefix of the path won't work. Instead, we\n\t  // need to remove components from the root one by one, until either we find\n\t  // a prefix that fits, or we run out of components to remove.\n\t  var level = 0;\n\t  while (aPath.indexOf(aRoot + '/') !== 0) {\n\t    var index = aRoot.lastIndexOf(\"/\");\n\t    if (index < 0) {\n\t      return aPath;\n\t    }\n\t\n\t    // If the only part of the root that is left is the scheme (i.e. http://,\n\t    // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n\t    // have exhausted all components, so the path is not relative to the root.\n\t    aRoot = aRoot.slice(0, index);\n\t    if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n\t      return aPath;\n\t    }\n\t\n\t    ++level;\n\t  }\n\t\n\t  // Make sure we add a \"../\" for each component we removed from the root.\n\t  return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n\t}\n\texports.relative = relative;\n\t\n\tvar supportsNullProto = (function () {\n\t  var obj = Object.create(null);\n\t  return !('__proto__' in obj);\n\t}());\n\t\n\tfunction identity (s) {\n\t  return s;\n\t}\n\t\n\t/**\n\t * Because behavior goes wacky when you set `__proto__` on objects, we\n\t * have to prefix all the strings in our set with an arbitrary character.\n\t *\n\t * See https://github.com/mozilla/source-map/pull/31 and\n\t * https://github.com/mozilla/source-map/issues/30\n\t *\n\t * @param String aStr\n\t */\n\tfunction toSetString(aStr) {\n\t  if (isProtoString(aStr)) {\n\t    return '$' + aStr;\n\t  }\n\t\n\t  return aStr;\n\t}\n\texports.toSetString = supportsNullProto ? identity : toSetString;\n\t\n\tfunction fromSetString(aStr) {\n\t  if (isProtoString(aStr)) {\n\t    return aStr.slice(1);\n\t  }\n\t\n\t  return aStr;\n\t}\n\texports.fromSetString = supportsNullProto ? identity : fromSetString;\n\t\n\tfunction isProtoString(s) {\n\t  if (!s) {\n\t    return false;\n\t  }\n\t\n\t  var length = s.length;\n\t\n\t  if (length < 9 /* \"__proto__\".length */) {\n\t    return false;\n\t  }\n\t\n\t  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||\n\t      s.charCodeAt(length - 2) !== 95  /* '_' */ ||\n\t      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n\t      s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n\t      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n\t      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n\t      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n\t      s.charCodeAt(length - 8) !== 95  /* '_' */ ||\n\t      s.charCodeAt(length - 9) !== 95  /* '_' */) {\n\t    return false;\n\t  }\n\t\n\t  for (var i = length - 10; i >= 0; i--) {\n\t    if (s.charCodeAt(i) !== 36 /* '$' */) {\n\t      return false;\n\t    }\n\t  }\n\t\n\t  return true;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings where the original positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same original source/line/column, but different generated\n\t * line and column the same. Useful when searching for a mapping with a\n\t * stubbed out mapping.\n\t */\n\tfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n\t  var cmp = strcmp(mappingA.source, mappingB.source);\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalLine - mappingB.originalLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t  if (cmp !== 0 || onlyCompareOriginal) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByOriginalPositions = compareByOriginalPositions;\n\t\n\t/**\n\t * Comparator between two mappings with deflated source and name indices where\n\t * the generated positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same generated line and column, but different\n\t * source/name/original line and column the same. Useful when searching for a\n\t * mapping with a stubbed out mapping.\n\t */\n\tfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n\t  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t  if (cmp !== 0 || onlyCompareGenerated) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = strcmp(mappingA.source, mappingB.source);\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalLine - mappingB.originalLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\t\n\tfunction strcmp(aStr1, aStr2) {\n\t  if (aStr1 === aStr2) {\n\t    return 0;\n\t  }\n\t\n\t  if (aStr1 === null) {\n\t    return 1; // aStr2 !== null\n\t  }\n\t\n\t  if (aStr2 === null) {\n\t    return -1; // aStr1 !== null\n\t  }\n\t\n\t  if (aStr1 > aStr2) {\n\t    return 1;\n\t  }\n\t\n\t  return -1;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings with inflated source and name strings where\n\t * the generated positions are compared.\n\t */\n\tfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n\t  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = strcmp(mappingA.source, mappingB.source);\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalLine - mappingB.originalLine;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t  if (cmp !== 0) {\n\t    return cmp;\n\t  }\n\t\n\t  return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\t\n\t/**\n\t * Strip any JSON XSSI avoidance prefix from the string (as documented\n\t * in the source maps specification), and then parse the string as\n\t * JSON.\n\t */\n\tfunction parseSourceMapInput(str) {\n\t  return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n\t}\n\texports.parseSourceMapInput = parseSourceMapInput;\n\t\n\t/**\n\t * Compute the URL of a source given the the source root, the source's\n\t * URL, and the source map's URL.\n\t */\n\tfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n\t  sourceURL = sourceURL || '';\n\t\n\t  if (sourceRoot) {\n\t    // This follows what Chrome does.\n\t    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n\t      sourceRoot += '/';\n\t    }\n\t    // The spec says:\n\t    //   Line 4: An optional source root, useful for relocating source\n\t    //   files on a server or removing repeated values in the\n\t    //   â€œsourcesâ€� entry.  This value is prepended to the individual\n\t    //   entries in the â€œsourceâ€� field.\n\t    sourceURL = sourceRoot + sourceURL;\n\t  }\n\t\n\t  // Historically, SourceMapConsumer did not take the sourceMapURL as\n\t  // a parameter.  This mode is still somewhat supported, which is why\n\t  // this code block is conditional.  However, it's preferable to pass\n\t  // the source map URL to SourceMapConsumer, so that this function\n\t  // can implement the source URL resolution algorithm as outlined in\n\t  // the spec.  This block is basically the equivalent of:\n\t  //    new URL(sourceURL, sourceMapURL).toString()\n\t  // ... except it avoids using URL, which wasn't available in the\n\t  // older releases of node still supported by this library.\n\t  //\n\t  // The spec says:\n\t  //   If the sources are not absolute URLs after prepending of the\n\t  //   â€œsourceRootâ€�, the sources are resolved relative to the\n\t  //   SourceMap (like resolving script src in a html document).\n\t  if (sourceMapURL) {\n\t    var parsed = urlParse(sourceMapURL);\n\t    if (!parsed) {\n\t      throw new Error(\"sourceMapURL could not be parsed\");\n\t    }\n\t    if (parsed.path) {\n\t      // Strip the last path component, but keep the \"/\".\n\t      var index = parsed.path.lastIndexOf('/');\n\t      if (index >= 0) {\n\t        parsed.path = parsed.path.substring(0, index + 1);\n\t      }\n\t    }\n\t    sourceURL = join(urlGenerate(parsed), sourceURL);\n\t  }\n\t\n\t  return normalize(sourceURL);\n\t}\n\texports.computeSourceURL = computeSourceURL;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar hasNativeMap = typeof Map !== \"undefined\";\n\t\n\t/**\n\t * A data structure which is a combination of an array and a set. Adding a new\n\t * member is O(1), testing for membership is O(1), and finding the index of an\n\t * element is O(1). Removing elements from the set is not supported. Only\n\t * strings are supported for membership.\n\t */\n\tfunction ArraySet() {\n\t  this._array = [];\n\t  this._set = hasNativeMap ? new Map() : Object.create(null);\n\t}\n\t\n\t/**\n\t * Static method for creating ArraySet instances from an existing array.\n\t */\n\tArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n\t  var set = new ArraySet();\n\t  for (var i = 0, len = aArray.length; i < len; i++) {\n\t    set.add(aArray[i], aAllowDuplicates);\n\t  }\n\t  return set;\n\t};\n\t\n\t/**\n\t * Return how many unique items are in this ArraySet. If duplicates have been\n\t * added, than those do not count towards the size.\n\t *\n\t * @returns Number\n\t */\n\tArraySet.prototype.size = function ArraySet_size() {\n\t  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n\t};\n\t\n\t/**\n\t * Add the given string to this set.\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n\t  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n\t  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n\t  var idx = this._array.length;\n\t  if (!isDuplicate || aAllowDuplicates) {\n\t    this._array.push(aStr);\n\t  }\n\t  if (!isDuplicate) {\n\t    if (hasNativeMap) {\n\t      this._set.set(aStr, idx);\n\t    } else {\n\t      this._set[sStr] = idx;\n\t    }\n\t  }\n\t};\n\t\n\t/**\n\t * Is the given string a member of this set?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.has = function ArraySet_has(aStr) {\n\t  if (hasNativeMap) {\n\t    return this._set.has(aStr);\n\t  } else {\n\t    var sStr = util.toSetString(aStr);\n\t    return has.call(this._set, sStr);\n\t  }\n\t};\n\t\n\t/**\n\t * What is the index of the given string in the array?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n\t  if (hasNativeMap) {\n\t    var idx = this._set.get(aStr);\n\t    if (idx >= 0) {\n\t        return idx;\n\t    }\n\t  } else {\n\t    var sStr = util.toSetString(aStr);\n\t    if (has.call(this._set, sStr)) {\n\t      return this._set[sStr];\n\t    }\n\t  }\n\t\n\t  throw new Error('\"' + aStr + '\" is not in the set.');\n\t};\n\t\n\t/**\n\t * What is the element at the given index?\n\t *\n\t * @param Number aIdx\n\t */\n\tArraySet.prototype.at = function ArraySet_at(aIdx) {\n\t  if (aIdx >= 0 && aIdx < this._array.length) {\n\t    return this._array[aIdx];\n\t  }\n\t  throw new Error('No element indexed by ' + aIdx);\n\t};\n\t\n\t/**\n\t * Returns the array representation of this set (which has the proper indices\n\t * indicated by indexOf). Note that this is a copy of the internal array used\n\t * for storing the members so that no one can mess with internal state.\n\t */\n\tArraySet.prototype.toArray = function ArraySet_toArray() {\n\t  return this._array.slice();\n\t};\n\t\n\texports.ArraySet = ArraySet;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2014 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\t\n\t/**\n\t * Determine whether mappingB is after mappingA with respect to generated\n\t * position.\n\t */\n\tfunction generatedPositionAfter(mappingA, mappingB) {\n\t  // Optimized for most common case\n\t  var lineA = mappingA.generatedLine;\n\t  var lineB = mappingB.generatedLine;\n\t  var columnA = mappingA.generatedColumn;\n\t  var columnB = mappingB.generatedColumn;\n\t  return lineB > lineA || lineB == lineA && columnB >= columnA ||\n\t         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n\t}\n\t\n\t/**\n\t * A data structure to provide a sorted view of accumulated mappings in a\n\t * performance conscious manner. It trades a neglibable overhead in general\n\t * case for a large speedup in case of mappings being added in order.\n\t */\n\tfunction MappingList() {\n\t  this._array = [];\n\t  this._sorted = true;\n\t  // Serves as infimum\n\t  this._last = {generatedLine: -1, generatedColumn: 0};\n\t}\n\t\n\t/**\n\t * Iterate through internal items. This method takes the same arguments that\n\t * `Array.prototype.forEach` takes.\n\t *\n\t * NOTE: The order of the mappings is NOT guaranteed.\n\t */\n\tMappingList.prototype.unsortedForEach =\n\t  function MappingList_forEach(aCallback, aThisArg) {\n\t    this._array.forEach(aCallback, aThisArg);\n\t  };\n\t\n\t/**\n\t * Add the given source mapping.\n\t *\n\t * @param Object aMapping\n\t */\n\tMappingList.prototype.add = function MappingList_add(aMapping) {\n\t  if (generatedPositionAfter(this._last, aMapping)) {\n\t    this._last = aMapping;\n\t    this._array.push(aMapping);\n\t  } else {\n\t    this._sorted = false;\n\t    this._array.push(aMapping);\n\t  }\n\t};\n\t\n\t/**\n\t * Returns the flat, sorted array of mappings. The mappings are sorted by\n\t * generated position.\n\t *\n\t * WARNING: This method returns internal data without copying, for\n\t * performance. The return value must NOT be mutated, and should be treated as\n\t * an immutable borrow. If you want to take ownership, you must make your own\n\t * copy.\n\t */\n\tMappingList.prototype.toArray = function MappingList_toArray() {\n\t  if (!this._sorted) {\n\t    this._array.sort(util.compareByGeneratedPositionsInflated);\n\t    this._sorted = true;\n\t  }\n\t  return this._array;\n\t};\n\t\n\texports.MappingList = MappingList;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar binarySearch = __webpack_require__(8);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar base64VLQ = __webpack_require__(2);\n\tvar quickSort = __webpack_require__(9).quickSort;\n\t\n\tfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t  var sourceMap = aSourceMap;\n\t  if (typeof aSourceMap === 'string') {\n\t    sourceMap = util.parseSourceMapInput(aSourceMap);\n\t  }\n\t\n\t  return sourceMap.sections != null\n\t    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n\t    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n\t}\n\t\n\tSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n\t  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\n\t}\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tSourceMapConsumer.prototype._version = 3;\n\t\n\t// `__generatedMappings` and `__originalMappings` are arrays that hold the\n\t// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n\t// are lazily instantiated, accessed via the `_generatedMappings` and\n\t// `_originalMappings` getters respectively, and we only parse the mappings\n\t// and create these arrays once queried for a source location. We jump through\n\t// these hoops because there can be many thousands of mappings, and parsing\n\t// them is expensive, so we only want to do it if we must.\n\t//\n\t// Each object in the arrays is of the form:\n\t//\n\t//     {\n\t//       generatedLine: The line number in the generated code,\n\t//       generatedColumn: The column number in the generated code,\n\t//       source: The path to the original source file that generated this\n\t//               chunk of code,\n\t//       originalLine: The line number in the original source that\n\t//                     corresponds to this chunk of generated code,\n\t//       originalColumn: The column number in the original source that\n\t//                       corresponds to this chunk of generated code,\n\t//       name: The name of the original symbol which generated this chunk of\n\t//             code.\n\t//     }\n\t//\n\t// All properties except for `generatedLine` and `generatedColumn` can be\n\t// `null`.\n\t//\n\t// `_generatedMappings` is ordered by the generated positions.\n\t//\n\t// `_originalMappings` is ordered by the original positions.\n\t\n\tSourceMapConsumer.prototype.__generatedMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n\t  configurable: true,\n\t  enumerable: true,\n\t  get: function () {\n\t    if (!this.__generatedMappings) {\n\t      this._parseMappings(this._mappings, this.sourceRoot);\n\t    }\n\t\n\t    return this.__generatedMappings;\n\t  }\n\t});\n\t\n\tSourceMapConsumer.prototype.__originalMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n\t  configurable: true,\n\t  enumerable: true,\n\t  get: function () {\n\t    if (!this.__originalMappings) {\n\t      this._parseMappings(this._mappings, this.sourceRoot);\n\t    }\n\t\n\t    return this.__originalMappings;\n\t  }\n\t});\n\t\n\tSourceMapConsumer.prototype._charIsMappingSeparator =\n\t  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n\t    var c = aStr.charAt(index);\n\t    return c === \";\" || c === \",\";\n\t  };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tSourceMapConsumer.prototype._parseMappings =\n\t  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t    throw new Error(\"Subclasses must implement _parseMappings\");\n\t  };\n\t\n\tSourceMapConsumer.GENERATED_ORDER = 1;\n\tSourceMapConsumer.ORIGINAL_ORDER = 2;\n\t\n\tSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\n\tSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Iterate over each mapping between an original source/line/column and a\n\t * generated line/column in this source map.\n\t *\n\t * @param Function aCallback\n\t *        The function that is called with each mapping.\n\t * @param Object aContext\n\t *        Optional. If specified, this object will be the value of `this` every\n\t *        time that `aCallback` is called.\n\t * @param aOrder\n\t *        Either `SourceMapConsumer.GENERATED_ORDER` or\n\t *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n\t *        iterate over the mappings sorted by the generated file's line/column\n\t *        order or the original's source/line/column order, respectively. Defaults to\n\t *        `SourceMapConsumer.GENERATED_ORDER`.\n\t */\n\tSourceMapConsumer.prototype.eachMapping =\n\t  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n\t    var context = aContext || null;\n\t    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\t\n\t    var mappings;\n\t    switch (order) {\n\t    case SourceMapConsumer.GENERATED_ORDER:\n\t      mappings = this._generatedMappings;\n\t      break;\n\t    case SourceMapConsumer.ORIGINAL_ORDER:\n\t      mappings = this._originalMappings;\n\t      break;\n\t    default:\n\t      throw new Error(\"Unknown order of iteration.\");\n\t    }\n\t\n\t    var sourceRoot = this.sourceRoot;\n\t    mappings.map(function (mapping) {\n\t      var source = mapping.source === null ? null : this._sources.at(mapping.source);\n\t      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\n\t      return {\n\t        source: source,\n\t        generatedLine: mapping.generatedLine,\n\t        generatedColumn: mapping.generatedColumn,\n\t        originalLine: mapping.originalLine,\n\t        originalColumn: mapping.originalColumn,\n\t        name: mapping.name === null ? null : this._names.at(mapping.name)\n\t      };\n\t    }, this).forEach(aCallback, context);\n\t  };\n\t\n\t/**\n\t * Returns all generated line and column information for the original source,\n\t * line, and column provided. If no column is provided, returns all mappings\n\t * corresponding to a either the line we are searching for or the next\n\t * closest line that has any mappings. Otherwise, returns all mappings\n\t * corresponding to the given line and either the column we are searching for\n\t * or the next closest column that has any offsets.\n\t *\n\t * The only argument is an object with the following properties:\n\t *\n\t *   - source: The filename of the original source.\n\t *   - line: The line number in the original source.  The line number is 1-based.\n\t *   - column: Optional. the column number in the original source.\n\t *    The column number is 0-based.\n\t *\n\t * and an array of objects is returned, each with the following properties:\n\t *\n\t *   - line: The line number in the generated source, or null.  The\n\t *    line number is 1-based.\n\t *   - column: The column number in the generated source, or null.\n\t *    The column number is 0-based.\n\t */\n\tSourceMapConsumer.prototype.allGeneratedPositionsFor =\n\t  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n\t    var line = util.getArg(aArgs, 'line');\n\t\n\t    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n\t    // returns the index of the closest mapping less than the needle. By\n\t    // setting needle.originalColumn to 0, we thus find the last mapping for\n\t    // the given line, provided such a mapping exists.\n\t    var needle = {\n\t      source: util.getArg(aArgs, 'source'),\n\t      originalLine: line,\n\t      originalColumn: util.getArg(aArgs, 'column', 0)\n\t    };\n\t\n\t    needle.source = this._findSourceIndex(needle.source);\n\t    if (needle.source < 0) {\n\t      return [];\n\t    }\n\t\n\t    var mappings = [];\n\t\n\t    var index = this._findMapping(needle,\n\t                                  this._originalMappings,\n\t                                  \"originalLine\",\n\t                                  \"originalColumn\",\n\t                                  util.compareByOriginalPositions,\n\t                                  binarySearch.LEAST_UPPER_BOUND);\n\t    if (index >= 0) {\n\t      var mapping = this._originalMappings[index];\n\t\n\t      if (aArgs.column === undefined) {\n\t        var originalLine = mapping.originalLine;\n\t\n\t        // Iterate until either we run out of mappings, or we run into\n\t        // a mapping for a different line than the one we found. Since\n\t        // mappings are sorted, this is guaranteed to find all mappings for\n\t        // the line we found.\n\t        while (mapping && mapping.originalLine === originalLine) {\n\t          mappings.push({\n\t            line: util.getArg(mapping, 'generatedLine', null),\n\t            column: util.getArg(mapping, 'generatedColumn', null),\n\t            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t          });\n\t\n\t          mapping = this._originalMappings[++index];\n\t        }\n\t      } else {\n\t        var originalColumn = mapping.originalColumn;\n\t\n\t        // Iterate until either we run out of mappings, or we run into\n\t        // a mapping for a different line than the one we were searching for.\n\t        // Since mappings are sorted, this is guaranteed to find all mappings for\n\t        // the line we are searching for.\n\t        while (mapping &&\n\t               mapping.originalLine === line &&\n\t               mapping.originalColumn == originalColumn) {\n\t          mappings.push({\n\t            line: util.getArg(mapping, 'generatedLine', null),\n\t            column: util.getArg(mapping, 'generatedColumn', null),\n\t            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t          });\n\t\n\t          mapping = this._originalMappings[++index];\n\t        }\n\t      }\n\t    }\n\t\n\t    return mappings;\n\t  };\n\t\n\texports.SourceMapConsumer = SourceMapConsumer;\n\t\n\t/**\n\t * A BasicSourceMapConsumer instance represents a parsed source map which we can\n\t * query for information about the original file positions by giving it a file\n\t * position in the generated source.\n\t *\n\t * The first parameter is the raw source map (either as a JSON string, or\n\t * already parsed to an object). According to the spec, source maps have the\n\t * following attributes:\n\t *\n\t *   - version: Which version of the source map spec this map is following.\n\t *   - sources: An array of URLs to the original source files.\n\t *   - names: An array of identifiers which can be referrenced by individual mappings.\n\t *   - sourceRoot: Optional. The URL root from which all sources are relative.\n\t *   - sourcesContent: Optional. An array of contents of the original source files.\n\t *   - mappings: A string of base64 VLQs which contain the actual mappings.\n\t *   - file: Optional. The generated file this source map is associated with.\n\t *\n\t * Here is an example source map, taken from the source map spec[0]:\n\t *\n\t *     {\n\t *       version : 3,\n\t *       file: \"out.js\",\n\t *       sourceRoot : \"\",\n\t *       sources: [\"foo.js\", \"bar.js\"],\n\t *       names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t *       mappings: \"AA,AB;;ABCDE;\"\n\t *     }\n\t *\n\t * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found.  This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n\t */\n\tfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t  var sourceMap = aSourceMap;\n\t  if (typeof aSourceMap === 'string') {\n\t    sourceMap = util.parseSourceMapInput(aSourceMap);\n\t  }\n\t\n\t  var version = util.getArg(sourceMap, 'version');\n\t  var sources = util.getArg(sourceMap, 'sources');\n\t  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n\t  // requires the array) to play nice here.\n\t  var names = util.getArg(sourceMap, 'names', []);\n\t  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n\t  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n\t  var mappings = util.getArg(sourceMap, 'mappings');\n\t  var file = util.getArg(sourceMap, 'file', null);\n\t\n\t  // Once again, Sass deviates from the spec and supplies the version as a\n\t  // string rather than a number, so we use loose equality checking here.\n\t  if (version != this._version) {\n\t    throw new Error('Unsupported version: ' + version);\n\t  }\n\t\n\t  if (sourceRoot) {\n\t    sourceRoot = util.normalize(sourceRoot);\n\t  }\n\t\n\t  sources = sources\n\t    .map(String)\n\t    // Some source maps produce relative source paths like \"./foo.js\" instead of\n\t    // \"foo.js\".  Normalize these first so that future comparisons will succeed.\n\t    // See bugzil.la/1090768.\n\t    .map(util.normalize)\n\t    // Always ensure that absolute sources are internally stored relative to\n\t    // the source root, if the source root is absolute. Not doing this would\n\t    // be particularly problematic when the source root is a prefix of the\n\t    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n\t    .map(function (source) {\n\t      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n\t        ? util.relative(sourceRoot, source)\n\t        : source;\n\t    });\n\t\n\t  // Pass `true` below to allow duplicate names and sources. While source maps\n\t  // are intended to be compressed and deduplicated, the TypeScript compiler\n\t  // sometimes generates source maps with duplicates in them. See Github issue\n\t  // #72 and bugzil.la/889492.\n\t  this._names = ArraySet.fromArray(names.map(String), true);\n\t  this._sources = ArraySet.fromArray(sources, true);\n\t\n\t  this._absoluteSources = this._sources.toArray().map(function (s) {\n\t    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n\t  });\n\t\n\t  this.sourceRoot = sourceRoot;\n\t  this.sourcesContent = sourcesContent;\n\t  this._mappings = mappings;\n\t  this._sourceMapURL = aSourceMapURL;\n\t  this.file = file;\n\t}\n\t\n\tBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\t\n\t/**\n\t * Utility function to find the index of a source.  Returns -1 if not\n\t * found.\n\t */\n\tBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n\t  var relativeSource = aSource;\n\t  if (this.sourceRoot != null) {\n\t    relativeSource = util.relative(this.sourceRoot, relativeSource);\n\t  }\n\t\n\t  if (this._sources.has(relativeSource)) {\n\t    return this._sources.indexOf(relativeSource);\n\t  }\n\t\n\t  // Maybe aSource is an absolute URL as returned by |sources|.  In\n\t  // this case we can't simply undo the transform.\n\t  var i;\n\t  for (i = 0; i < this._absoluteSources.length; ++i) {\n\t    if (this._absoluteSources[i] == aSource) {\n\t      return i;\n\t    }\n\t  }\n\t\n\t  return -1;\n\t};\n\t\n\t/**\n\t * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n\t *\n\t * @param SourceMapGenerator aSourceMap\n\t *        The source map that will be consumed.\n\t * @param String aSourceMapURL\n\t *        The URL at which the source map can be found (optional)\n\t * @returns BasicSourceMapConsumer\n\t */\n\tBasicSourceMapConsumer.fromSourceMap =\n\t  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\n\t    var smc = Object.create(BasicSourceMapConsumer.prototype);\n\t\n\t    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n\t    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n\t    smc.sourceRoot = aSourceMap._sourceRoot;\n\t    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n\t                                                            smc.sourceRoot);\n\t    smc.file = aSourceMap._file;\n\t    smc._sourceMapURL = aSourceMapURL;\n\t    smc._absoluteSources = smc._sources.toArray().map(function (s) {\n\t      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n\t    });\n\t\n\t    // Because we are modifying the entries (by converting string sources and\n\t    // names to indices into the sources and names ArraySets), we have to make\n\t    // a copy of the entry or else bad things happen. Shared mutable state\n\t    // strikes again! See github issue #191.\n\t\n\t    var generatedMappings = aSourceMap._mappings.toArray().slice();\n\t    var destGeneratedMappings = smc.__generatedMappings = [];\n\t    var destOriginalMappings = smc.__originalMappings = [];\n\t\n\t    for (var i = 0, length = generatedMappings.length; i < length; i++) {\n\t      var srcMapping = generatedMappings[i];\n\t      var destMapping = new Mapping;\n\t      destMapping.generatedLine = srcMapping.generatedLine;\n\t      destMapping.generatedColumn = srcMapping.generatedColumn;\n\t\n\t      if (srcMapping.source) {\n\t        destMapping.source = sources.indexOf(srcMapping.source);\n\t        destMapping.originalLine = srcMapping.originalLine;\n\t        destMapping.originalColumn = srcMapping.originalColumn;\n\t\n\t        if (srcMapping.name) {\n\t          destMapping.name = names.indexOf(srcMapping.name);\n\t        }\n\t\n\t        destOriginalMappings.push(destMapping);\n\t      }\n\t\n\t      destGeneratedMappings.push(destMapping);\n\t    }\n\t\n\t    quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\t\n\t    return smc;\n\t  };\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tBasicSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n\t  get: function () {\n\t    return this._absoluteSources.slice();\n\t  }\n\t});\n\t\n\t/**\n\t * Provide the JIT with a nice shape / hidden class.\n\t */\n\tfunction Mapping() {\n\t  this.generatedLine = 0;\n\t  this.generatedColumn = 0;\n\t  this.source = null;\n\t  this.originalLine = null;\n\t  this.originalColumn = null;\n\t  this.name = null;\n\t}\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tBasicSourceMapConsumer.prototype._parseMappings =\n\t  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t    var generatedLine = 1;\n\t    var previousGeneratedColumn = 0;\n\t    var previousOriginalLine = 0;\n\t    var previousOriginalColumn = 0;\n\t    var previousSource = 0;\n\t    var previousName = 0;\n\t    var length = aStr.length;\n\t    var index = 0;\n\t    var cachedSegments = {};\n\t    var temp = {};\n\t    var originalMappings = [];\n\t    var generatedMappings = [];\n\t    var mapping, str, segment, end, value;\n\t\n\t    while (index < length) {\n\t      if (aStr.charAt(index) === ';') {\n\t        generatedLine++;\n\t        index++;\n\t        previousGeneratedColumn = 0;\n\t      }\n\t      else if (aStr.charAt(index) === ',') {\n\t        index++;\n\t      }\n\t      else {\n\t        mapping = new Mapping();\n\t        mapping.generatedLine = generatedLine;\n\t\n\t        // Because each offset is encoded relative to the previous one,\n\t        // many segments often have the same encoding. We can exploit this\n\t        // fact by caching the parsed variable length fields of each segment,\n\t        // allowing us to avoid a second parse if we encounter the same\n\t        // segment again.\n\t        for (end = index; end < length; end++) {\n\t          if (this._charIsMappingSeparator(aStr, end)) {\n\t            break;\n\t          }\n\t        }\n\t        str = aStr.slice(index, end);\n\t\n\t        segment = cachedSegments[str];\n\t        if (segment) {\n\t          index += str.length;\n\t        } else {\n\t          segment = [];\n\t          while (index < end) {\n\t            base64VLQ.decode(aStr, index, temp);\n\t            value = temp.value;\n\t            index = temp.rest;\n\t            segment.push(value);\n\t          }\n\t\n\t          if (segment.length === 2) {\n\t            throw new Error('Found a source, but no line and column');\n\t          }\n\t\n\t          if (segment.length === 3) {\n\t            throw new Error('Found a source and line, but no column');\n\t          }\n\t\n\t          cachedSegments[str] = segment;\n\t        }\n\t\n\t        // Generated column.\n\t        mapping.generatedColumn = previousGeneratedColumn + segment[0];\n\t        previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t        if (segment.length > 1) {\n\t          // Original source.\n\t          mapping.source = previousSource + segment[1];\n\t          previousSource += segment[1];\n\t\n\t          // Original line.\n\t          mapping.originalLine = previousOriginalLine + segment[2];\n\t          previousOriginalLine = mapping.originalLine;\n\t          // Lines are stored 0-based\n\t          mapping.originalLine += 1;\n\t\n\t          // Original column.\n\t          mapping.originalColumn = previousOriginalColumn + segment[3];\n\t          previousOriginalColumn = mapping.originalColumn;\n\t\n\t          if (segment.length > 4) {\n\t            // Original name.\n\t            mapping.name = previousName + segment[4];\n\t            previousName += segment[4];\n\t          }\n\t        }\n\t\n\t        generatedMappings.push(mapping);\n\t        if (typeof mapping.originalLine === 'number') {\n\t          originalMappings.push(mapping);\n\t        }\n\t      }\n\t    }\n\t\n\t    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t    this.__generatedMappings = generatedMappings;\n\t\n\t    quickSort(originalMappings, util.compareByOriginalPositions);\n\t    this.__originalMappings = originalMappings;\n\t  };\n\t\n\t/**\n\t * Find the mapping that best matches the hypothetical \"needle\" mapping that\n\t * we are searching for in the given \"haystack\" of mappings.\n\t */\n\tBasicSourceMapConsumer.prototype._findMapping =\n\t  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n\t                                         aColumnName, aComparator, aBias) {\n\t    // To return the position we are searching for, we must first find the\n\t    // mapping for the given position and then return the opposite position it\n\t    // points to. Because the mappings are sorted, we can use binary search to\n\t    // find the best mapping.\n\t\n\t    if (aNeedle[aLineName] <= 0) {\n\t      throw new TypeError('Line must be greater than or equal to 1, got '\n\t                          + aNeedle[aLineName]);\n\t    }\n\t    if (aNeedle[aColumnName] < 0) {\n\t      throw new TypeError('Column must be greater than or equal to 0, got '\n\t                          + aNeedle[aColumnName]);\n\t    }\n\t\n\t    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n\t  };\n\t\n\t/**\n\t * Compute the last column for each generated mapping. The last column is\n\t * inclusive.\n\t */\n\tBasicSourceMapConsumer.prototype.computeColumnSpans =\n\t  function SourceMapConsumer_computeColumnSpans() {\n\t    for (var index = 0; index < this._generatedMappings.length; ++index) {\n\t      var mapping = this._generatedMappings[index];\n\t\n\t      // Mappings do not contain a field for the last generated columnt. We\n\t      // can come up with an optimistic estimate, however, by assuming that\n\t      // mappings are contiguous (i.e. given two consecutive mappings, the\n\t      // first mapping ends where the second one starts).\n\t      if (index + 1 < this._generatedMappings.length) {\n\t        var nextMapping = this._generatedMappings[index + 1];\n\t\n\t        if (mapping.generatedLine === nextMapping.generatedLine) {\n\t          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n\t          continue;\n\t        }\n\t      }\n\t\n\t      // The last mapping for each line spans the entire line.\n\t      mapping.lastGeneratedColumn = Infinity;\n\t    }\n\t  };\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t *   - line: The line number in the generated source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the generated source.  The column\n\t *     number is 0-based.\n\t *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - source: The original source file, or null.\n\t *   - line: The line number in the original source, or null.  The\n\t *     line number is 1-based.\n\t *   - column: The column number in the original source, or null.  The\n\t *     column number is 0-based.\n\t *   - name: The original identifier, or null.\n\t */\n\tBasicSourceMapConsumer.prototype.originalPositionFor =\n\t  function SourceMapConsumer_originalPositionFor(aArgs) {\n\t    var needle = {\n\t      generatedLine: util.getArg(aArgs, 'line'),\n\t      generatedColumn: util.getArg(aArgs, 'column')\n\t    };\n\t\n\t    var index = this._findMapping(\n\t      needle,\n\t      this._generatedMappings,\n\t      \"generatedLine\",\n\t      \"generatedColumn\",\n\t      util.compareByGeneratedPositionsDeflated,\n\t      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t    );\n\t\n\t    if (index >= 0) {\n\t      var mapping = this._generatedMappings[index];\n\t\n\t      if (mapping.generatedLine === needle.generatedLine) {\n\t        var source = util.getArg(mapping, 'source', null);\n\t        if (source !== null) {\n\t          source = this._sources.at(source);\n\t          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\n\t        }\n\t        var name = util.getArg(mapping, 'name', null);\n\t        if (name !== null) {\n\t          name = this._names.at(name);\n\t        }\n\t        return {\n\t          source: source,\n\t          line: util.getArg(mapping, 'originalLine', null),\n\t          column: util.getArg(mapping, 'originalColumn', null),\n\t          name: name\n\t        };\n\t      }\n\t    }\n\t\n\t    return {\n\t      source: null,\n\t      line: null,\n\t      column: null,\n\t      name: null\n\t    };\n\t  };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t  function BasicSourceMapConsumer_hasContentsOfAllSources() {\n\t    if (!this.sourcesContent) {\n\t      return false;\n\t    }\n\t    return this.sourcesContent.length >= this._sources.size() &&\n\t      !this.sourcesContent.some(function (sc) { return sc == null; });\n\t  };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tBasicSourceMapConsumer.prototype.sourceContentFor =\n\t  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t    if (!this.sourcesContent) {\n\t      return null;\n\t    }\n\t\n\t    var index = this._findSourceIndex(aSource);\n\t    if (index >= 0) {\n\t      return this.sourcesContent[index];\n\t    }\n\t\n\t    var relativeSource = aSource;\n\t    if (this.sourceRoot != null) {\n\t      relativeSource = util.relative(this.sourceRoot, relativeSource);\n\t    }\n\t\n\t    var url;\n\t    if (this.sourceRoot != null\n\t        && (url = util.urlParse(this.sourceRoot))) {\n\t      // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n\t      // many users. We can help them out when they expect file:// URIs to\n\t      // behave like it would if they were running a local HTTP server. See\n\t      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n\t      var fileUriAbsPath = relativeSource.replace(/^file:\\/\\//, \"\");\n\t      if (url.scheme == \"file\"\n\t          && this._sources.has(fileUriAbsPath)) {\n\t        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n\t      }\n\t\n\t      if ((!url.path || url.path == \"/\")\n\t          && this._sources.has(\"/\" + relativeSource)) {\n\t        return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\n\t      }\n\t    }\n\t\n\t    // This function is used recursively from\n\t    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n\t    // don't want to throw if we can't find the source - we just want to\n\t    // return null, so we provide a flag to exit gracefully.\n\t    if (nullOnMissing) {\n\t      return null;\n\t    }\n\t    else {\n\t      throw new Error('\"' + relativeSource + '\" is not in the SourceMap.');\n\t    }\n\t  };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t *   - source: The filename of the original source.\n\t *   - line: The line number in the original source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the original source.  The column\n\t *     number is 0-based.\n\t *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - line: The line number in the generated source, or null.  The\n\t *     line number is 1-based.\n\t *   - column: The column number in the generated source, or null.\n\t *     The column number is 0-based.\n\t */\n\tBasicSourceMapConsumer.prototype.generatedPositionFor =\n\t  function SourceMapConsumer_generatedPositionFor(aArgs) {\n\t    var source = util.getArg(aArgs, 'source');\n\t    source = this._findSourceIndex(source);\n\t    if (source < 0) {\n\t      return {\n\t        line: null,\n\t        column: null,\n\t        lastColumn: null\n\t      };\n\t    }\n\t\n\t    var needle = {\n\t      source: source,\n\t      originalLine: util.getArg(aArgs, 'line'),\n\t      originalColumn: util.getArg(aArgs, 'column')\n\t    };\n\t\n\t    var index = this._findMapping(\n\t      needle,\n\t      this._originalMappings,\n\t      \"originalLine\",\n\t      \"originalColumn\",\n\t      util.compareByOriginalPositions,\n\t      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t    );\n\t\n\t    if (index >= 0) {\n\t      var mapping = this._originalMappings[index];\n\t\n\t      if (mapping.source === needle.source) {\n\t        return {\n\t          line: util.getArg(mapping, 'generatedLine', null),\n\t          column: util.getArg(mapping, 'generatedColumn', null),\n\t          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t        };\n\t      }\n\t    }\n\t\n\t    return {\n\t      line: null,\n\t      column: null,\n\t      lastColumn: null\n\t    };\n\t  };\n\t\n\texports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\t\n\t/**\n\t * An IndexedSourceMapConsumer instance represents a parsed source map which\n\t * we can query for information. It differs from BasicSourceMapConsumer in\n\t * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n\t * input.\n\t *\n\t * The first parameter is a raw source map (either as a JSON string, or already\n\t * parsed to an object). According to the spec for indexed source maps, they\n\t * have the following attributes:\n\t *\n\t *   - version: Which version of the source map spec this map is following.\n\t *   - file: Optional. The generated file this source map is associated with.\n\t *   - sections: A list of section definitions.\n\t *\n\t * Each value under the \"sections\" field has two fields:\n\t *   - offset: The offset into the original specified at which this section\n\t *       begins to apply, defined as an object with a \"line\" and \"column\"\n\t *       field.\n\t *   - map: A source map definition. This source map could also be indexed,\n\t *       but doesn't have to be.\n\t *\n\t * Instead of the \"map\" field, it's also possible to have a \"url\" field\n\t * specifying a URL to retrieve a source map from, but that's currently\n\t * unsupported.\n\t *\n\t * Here's an example source map, taken from the source map spec[0], but\n\t * modified to omit a section which uses the \"url\" field.\n\t *\n\t *  {\n\t *    version : 3,\n\t *    file: \"app.js\",\n\t *    sections: [{\n\t *      offset: {line:100, column:10},\n\t *      map: {\n\t *        version : 3,\n\t *        file: \"section.js\",\n\t *        sources: [\"foo.js\", \"bar.js\"],\n\t *        names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t *        mappings: \"AAAA,E;;ABCDE;\"\n\t *      }\n\t *    }],\n\t *  }\n\t *\n\t * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found.  This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n\t */\n\tfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t  var sourceMap = aSourceMap;\n\t  if (typeof aSourceMap === 'string') {\n\t    sourceMap = util.parseSourceMapInput(aSourceMap);\n\t  }\n\t\n\t  var version = util.getArg(sourceMap, 'version');\n\t  var sections = util.getArg(sourceMap, 'sections');\n\t\n\t  if (version != this._version) {\n\t    throw new Error('Unsupported version: ' + version);\n\t  }\n\t\n\t  this._sources = new ArraySet();\n\t  this._names = new ArraySet();\n\t\n\t  var lastOffset = {\n\t    line: -1,\n\t    column: 0\n\t  };\n\t  this._sections = sections.map(function (s) {\n\t    if (s.url) {\n\t      // The url field will require support for asynchronicity.\n\t      // See https://github.com/mozilla/source-map/issues/16\n\t      throw new Error('Support for url field in sections not implemented.');\n\t    }\n\t    var offset = util.getArg(s, 'offset');\n\t    var offsetLine = util.getArg(offset, 'line');\n\t    var offsetColumn = util.getArg(offset, 'column');\n\t\n\t    if (offsetLine < lastOffset.line ||\n\t        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n\t      throw new Error('Section offsets must be ordered and non-overlapping.');\n\t    }\n\t    lastOffset = offset;\n\t\n\t    return {\n\t      generatedOffset: {\n\t        // The offset fields are 0-based, but we use 1-based indices when\n\t        // encoding/decoding from VLQ.\n\t        generatedLine: offsetLine + 1,\n\t        generatedColumn: offsetColumn + 1\n\t      },\n\t      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\n\t    }\n\t  });\n\t}\n\t\n\tIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tIndexedSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n\t  get: function () {\n\t    var sources = [];\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n\t        sources.push(this._sections[i].consumer.sources[j]);\n\t      }\n\t    }\n\t    return sources;\n\t  }\n\t});\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t *   - line: The line number in the generated source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the generated source.  The column\n\t *     number is 0-based.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - source: The original source file, or null.\n\t *   - line: The line number in the original source, or null.  The\n\t *     line number is 1-based.\n\t *   - column: The column number in the original source, or null.  The\n\t *     column number is 0-based.\n\t *   - name: The original identifier, or null.\n\t */\n\tIndexedSourceMapConsumer.prototype.originalPositionFor =\n\t  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n\t    var needle = {\n\t      generatedLine: util.getArg(aArgs, 'line'),\n\t      generatedColumn: util.getArg(aArgs, 'column')\n\t    };\n\t\n\t    // Find the section containing the generated position we're trying to map\n\t    // to an original position.\n\t    var sectionIndex = binarySearch.search(needle, this._sections,\n\t      function(needle, section) {\n\t        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n\t        if (cmp) {\n\t          return cmp;\n\t        }\n\t\n\t        return (needle.generatedColumn -\n\t                section.generatedOffset.generatedColumn);\n\t      });\n\t    var section = this._sections[sectionIndex];\n\t\n\t    if (!section) {\n\t      return {\n\t        source: null,\n\t        line: null,\n\t        column: null,\n\t        name: null\n\t      };\n\t    }\n\t\n\t    return section.consumer.originalPositionFor({\n\t      line: needle.generatedLine -\n\t        (section.generatedOffset.generatedLine - 1),\n\t      column: needle.generatedColumn -\n\t        (section.generatedOffset.generatedLine === needle.generatedLine\n\t         ? section.generatedOffset.generatedColumn - 1\n\t         : 0),\n\t      bias: aArgs.bias\n\t    });\n\t  };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t  function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n\t    return this._sections.every(function (s) {\n\t      return s.consumer.hasContentsOfAllSources();\n\t    });\n\t  };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tIndexedSourceMapConsumer.prototype.sourceContentFor =\n\t  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      var section = this._sections[i];\n\t\n\t      var content = section.consumer.sourceContentFor(aSource, true);\n\t      if (content) {\n\t        return content;\n\t      }\n\t    }\n\t    if (nullOnMissing) {\n\t      return null;\n\t    }\n\t    else {\n\t      throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t    }\n\t  };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t *   - source: The filename of the original source.\n\t *   - line: The line number in the original source.  The line number\n\t *     is 1-based.\n\t *   - column: The column number in the original source.  The column\n\t *     number is 0-based.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t *   - line: The line number in the generated source, or null.  The\n\t *     line number is 1-based. \n\t *   - column: The column number in the generated source, or null.\n\t *     The column number is 0-based.\n\t */\n\tIndexedSourceMapConsumer.prototype.generatedPositionFor =\n\t  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      var section = this._sections[i];\n\t\n\t      // Only consider this section if the requested source is in the list of\n\t      // sources of the consumer.\n\t      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\n\t        continue;\n\t      }\n\t      var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n\t      if (generatedPosition) {\n\t        var ret = {\n\t          line: generatedPosition.line +\n\t            (section.generatedOffset.generatedLine - 1),\n\t          column: generatedPosition.column +\n\t            (section.generatedOffset.generatedLine === generatedPosition.line\n\t             ? section.generatedOffset.generatedColumn - 1\n\t             : 0)\n\t        };\n\t        return ret;\n\t      }\n\t    }\n\t\n\t    return {\n\t      line: null,\n\t      column: null\n\t    };\n\t  };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tIndexedSourceMapConsumer.prototype._parseMappings =\n\t  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t    this.__generatedMappings = [];\n\t    this.__originalMappings = [];\n\t    for (var i = 0; i < this._sections.length; i++) {\n\t      var section = this._sections[i];\n\t      var sectionMappings = section.consumer._generatedMappings;\n\t      for (var j = 0; j < sectionMappings.length; j++) {\n\t        var mapping = sectionMappings[j];\n\t\n\t        var source = section.consumer._sources.at(mapping.source);\n\t        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n\t        this._sources.add(source);\n\t        source = this._sources.indexOf(source);\n\t\n\t        var name = null;\n\t        if (mapping.name) {\n\t          name = section.consumer._names.at(mapping.name);\n\t          this._names.add(name);\n\t          name = this._names.indexOf(name);\n\t        }\n\t\n\t        // The mappings coming from the consumer for the section have\n\t        // generated positions relative to the start of the section, so we\n\t        // need to offset them to be relative to the start of the concatenated\n\t        // generated file.\n\t        var adjustedMapping = {\n\t          source: source,\n\t          generatedLine: mapping.generatedLine +\n\t            (section.generatedOffset.generatedLine - 1),\n\t          generatedColumn: mapping.generatedColumn +\n\t            (section.generatedOffset.generatedLine === mapping.generatedLine\n\t            ? section.generatedOffset.generatedColumn - 1\n\t            : 0),\n\t          originalLine: mapping.originalLine,\n\t          originalColumn: mapping.originalColumn,\n\t          name: name\n\t        };\n\t\n\t        this.__generatedMappings.push(adjustedMapping);\n\t        if (typeof adjustedMapping.originalLine === 'number') {\n\t          this.__originalMappings.push(adjustedMapping);\n\t        }\n\t      }\n\t    }\n\t\n\t    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t    quickSort(this.__originalMappings, util.compareByOriginalPositions);\n\t  };\n\t\n\texports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\texports.GREATEST_LOWER_BOUND = 1;\n\texports.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Recursive implementation of binary search.\n\t *\n\t * @param aLow Indices here and lower do not contain the needle.\n\t * @param aHigh Indices here and higher do not contain the needle.\n\t * @param aNeedle The element being searched for.\n\t * @param aHaystack The non-empty array being searched.\n\t * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t */\n\tfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n\t  // This function terminates when one of the following is true:\n\t  //\n\t  //   1. We find the exact element we are looking for.\n\t  //\n\t  //   2. We did not find the exact element, but we can return the index of\n\t  //      the next-closest element.\n\t  //\n\t  //   3. We did not find the exact element, and there is no next-closest\n\t  //      element than the one we are searching for, so we return -1.\n\t  var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n\t  var cmp = aCompare(aNeedle, aHaystack[mid], true);\n\t  if (cmp === 0) {\n\t    // Found the element we are looking for.\n\t    return mid;\n\t  }\n\t  else if (cmp > 0) {\n\t    // Our needle is greater than aHaystack[mid].\n\t    if (aHigh - mid > 1) {\n\t      // The element is in the upper half.\n\t      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n\t    }\n\t\n\t    // The exact needle element was not found in this haystack. Determine if\n\t    // we are in termination case (3) or (2) and return the appropriate thing.\n\t    if (aBias == exports.LEAST_UPPER_BOUND) {\n\t      return aHigh < aHaystack.length ? aHigh : -1;\n\t    } else {\n\t      return mid;\n\t    }\n\t  }\n\t  else {\n\t    // Our needle is less than aHaystack[mid].\n\t    if (mid - aLow > 1) {\n\t      // The element is in the lower half.\n\t      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n\t    }\n\t\n\t    // we are in termination case (3) or (2) and return the appropriate thing.\n\t    if (aBias == exports.LEAST_UPPER_BOUND) {\n\t      return mid;\n\t    } else {\n\t      return aLow < 0 ? -1 : aLow;\n\t    }\n\t  }\n\t}\n\t\n\t/**\n\t * This is an implementation of binary search which will always try and return\n\t * the index of the closest element if there is no exact hit. This is because\n\t * mappings between original and generated line/col pairs are single points,\n\t * and there is an implicit region between each of them, so a miss just means\n\t * that you aren't on the very start of a region.\n\t *\n\t * @param aNeedle The element you are looking for.\n\t * @param aHaystack The array that is being searched.\n\t * @param aCompare A function which takes the needle and an element in the\n\t *     array and returns -1, 0, or 1 depending on whether the needle is less\n\t *     than, equal to, or greater than the element, respectively.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t *     closest element that is smaller than or greater than the one we are\n\t *     searching for, respectively, if the exact element cannot be found.\n\t *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n\t */\n\texports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n\t  if (aHaystack.length === 0) {\n\t    return -1;\n\t  }\n\t\n\t  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n\t                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n\t  if (index < 0) {\n\t    return -1;\n\t  }\n\t\n\t  // We have found either the exact element, or the next-closest element than\n\t  // the one we are searching for. However, there may be more than one such\n\t  // element. Make sure we always return the smallest of these.\n\t  while (index - 1 >= 0) {\n\t    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n\t      break;\n\t    }\n\t    --index;\n\t  }\n\t\n\t  return index;\n\t};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t// It turns out that some (most?) JavaScript engines don't self-host\n\t// `Array.prototype.sort`. This makes sense because C++ will likely remain\n\t// faster than JS when doing raw CPU-intensive sorting. However, when using a\n\t// custom comparator function, calling back and forth between the VM's C++ and\n\t// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n\t// worse generated code for the comparator function than would be optimal. In\n\t// fact, when sorting with a comparator, these costs outweigh the benefits of\n\t// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n\t// a ~3500ms mean speed-up in `bench/bench.html`.\n\t\n\t/**\n\t * Swap the elements indexed by `x` and `y` in the array `ary`.\n\t *\n\t * @param {Array} ary\n\t *        The array.\n\t * @param {Number} x\n\t *        The index of the first item.\n\t * @param {Number} y\n\t *        The index of the second item.\n\t */\n\tfunction swap(ary, x, y) {\n\t  var temp = ary[x];\n\t  ary[x] = ary[y];\n\t  ary[y] = temp;\n\t}\n\t\n\t/**\n\t * Returns a random integer within the range `low .. high` inclusive.\n\t *\n\t * @param {Number} low\n\t *        The lower bound on the range.\n\t * @param {Number} high\n\t *        The upper bound on the range.\n\t */\n\tfunction randomIntInRange(low, high) {\n\t  return Math.round(low + (Math.random() * (high - low)));\n\t}\n\t\n\t/**\n\t * The Quick Sort algorithm.\n\t *\n\t * @param {Array} ary\n\t *        An array to sort.\n\t * @param {function} comparator\n\t *        Function to use to compare two items.\n\t * @param {Number} p\n\t *        Start index of the array\n\t * @param {Number} r\n\t *        End index of the array\n\t */\n\tfunction doQuickSort(ary, comparator, p, r) {\n\t  // If our lower bound is less than our upper bound, we (1) partition the\n\t  // array into two pieces and (2) recurse on each half. If it is not, this is\n\t  // the empty array and our base case.\n\t\n\t  if (p < r) {\n\t    // (1) Partitioning.\n\t    //\n\t    // The partitioning chooses a pivot between `p` and `r` and moves all\n\t    // elements that are less than or equal to the pivot to the before it, and\n\t    // all the elements that are greater than it after it. The effect is that\n\t    // once partition is done, the pivot is in the exact place it will be when\n\t    // the array is put in sorted order, and it will not need to be moved\n\t    // again. This runs in O(n) time.\n\t\n\t    // Always choose a random pivot so that an input array which is reverse\n\t    // sorted does not cause O(n^2) running time.\n\t    var pivotIndex = randomIntInRange(p, r);\n\t    var i = p - 1;\n\t\n\t    swap(ary, pivotIndex, r);\n\t    var pivot = ary[r];\n\t\n\t    // Immediately after `j` is incremented in this loop, the following hold\n\t    // true:\n\t    //\n\t    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.\n\t    //\n\t    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n\t    for (var j = p; j < r; j++) {\n\t      if (comparator(ary[j], pivot) <= 0) {\n\t        i += 1;\n\t        swap(ary, i, j);\n\t      }\n\t    }\n\t\n\t    swap(ary, i + 1, j);\n\t    var q = i + 1;\n\t\n\t    // (2) Recurse on each half.\n\t\n\t    doQuickSort(ary, comparator, p, q - 1);\n\t    doQuickSort(ary, comparator, q + 1, r);\n\t  }\n\t}\n\t\n\t/**\n\t * Sort the given array in-place with the given comparator function.\n\t *\n\t * @param {Array} ary\n\t *        An array to sort.\n\t * @param {function} comparator\n\t *        Function to use to compare two items.\n\t */\n\texports.quickSort = function (ary, comparator) {\n\t  doQuickSort(ary, comparator, 0, ary.length - 1);\n\t};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\tvar util = __webpack_require__(4);\n\t\n\t// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n\t// operating systems these days (capturing the result).\n\tvar REGEX_NEWLINE = /(\\r?\\n)/;\n\t\n\t// Newline character code for charCodeAt() comparisons\n\tvar NEWLINE_CODE = 10;\n\t\n\t// Private symbol for identifying `SourceNode`s when multiple versions of\n\t// the source-map library are loaded. This MUST NOT CHANGE across\n\t// versions!\n\tvar isSourceNode = \"$$$isSourceNode$$$\";\n\t\n\t/**\n\t * SourceNodes provide a way to abstract over interpolating/concatenating\n\t * snippets of generated JavaScript source code while maintaining the line and\n\t * column information associated with the original source code.\n\t *\n\t * @param aLine The original line number.\n\t * @param aColumn The original column number.\n\t * @param aSource The original source's filename.\n\t * @param aChunks Optional. An array of strings which are snippets of\n\t *        generated JS, or other SourceNodes.\n\t * @param aName The original identifier.\n\t */\n\tfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n\t  this.children = [];\n\t  this.sourceContents = {};\n\t  this.line = aLine == null ? null : aLine;\n\t  this.column = aColumn == null ? null : aColumn;\n\t  this.source = aSource == null ? null : aSource;\n\t  this.name = aName == null ? null : aName;\n\t  this[isSourceNode] = true;\n\t  if (aChunks != null) this.add(aChunks);\n\t}\n\t\n\t/**\n\t * Creates a SourceNode from generated code and a SourceMapConsumer.\n\t *\n\t * @param aGeneratedCode The generated code\n\t * @param aSourceMapConsumer The SourceMap for the generated code\n\t * @param aRelativePath Optional. The path that relative sources in the\n\t *        SourceMapConsumer should be relative to.\n\t */\n\tSourceNode.fromStringWithSourceMap =\n\t  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n\t    // The SourceNode we want to fill with the generated code\n\t    // and the SourceMap\n\t    var node = new SourceNode();\n\t\n\t    // All even indices of this array are one line of the generated code,\n\t    // while all odd indices are the newlines between two adjacent lines\n\t    // (since `REGEX_NEWLINE` captures its match).\n\t    // Processed fragments are accessed by calling `shiftNextLine`.\n\t    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n\t    var remainingLinesIndex = 0;\n\t    var shiftNextLine = function() {\n\t      var lineContents = getNextLine();\n\t      // The last line of a file might not have a newline.\n\t      var newLine = getNextLine() || \"\";\n\t      return lineContents + newLine;\n\t\n\t      function getNextLine() {\n\t        return remainingLinesIndex < remainingLines.length ?\n\t            remainingLines[remainingLinesIndex++] : undefined;\n\t      }\n\t    };\n\t\n\t    // We need to remember the position of \"remainingLines\"\n\t    var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\t\n\t    // The generate SourceNodes we need a code range.\n\t    // To extract it current and last mapping is used.\n\t    // Here we store the last mapping.\n\t    var lastMapping = null;\n\t\n\t    aSourceMapConsumer.eachMapping(function (mapping) {\n\t      if (lastMapping !== null) {\n\t        // We add the code from \"lastMapping\" to \"mapping\":\n\t        // First check if there is a new line in between.\n\t        if (lastGeneratedLine < mapping.generatedLine) {\n\t          // Associate first line with \"lastMapping\"\n\t          addMappingWithCode(lastMapping, shiftNextLine());\n\t          lastGeneratedLine++;\n\t          lastGeneratedColumn = 0;\n\t          // The remaining code is added without mapping\n\t        } else {\n\t          // There is no new line in between.\n\t          // Associate the code between \"lastGeneratedColumn\" and\n\t          // \"mapping.generatedColumn\" with \"lastMapping\"\n\t          var nextLine = remainingLines[remainingLinesIndex] || '';\n\t          var code = nextLine.substr(0, mapping.generatedColumn -\n\t                                        lastGeneratedColumn);\n\t          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n\t                                              lastGeneratedColumn);\n\t          lastGeneratedColumn = mapping.generatedColumn;\n\t          addMappingWithCode(lastMapping, code);\n\t          // No more remaining code, continue\n\t          lastMapping = mapping;\n\t          return;\n\t        }\n\t      }\n\t      // We add the generated code until the first mapping\n\t      // to the SourceNode without any mapping.\n\t      // Each line is added as separate string.\n\t      while (lastGeneratedLine < mapping.generatedLine) {\n\t        node.add(shiftNextLine());\n\t        lastGeneratedLine++;\n\t      }\n\t      if (lastGeneratedColumn < mapping.generatedColumn) {\n\t        var nextLine = remainingLines[remainingLinesIndex] || '';\n\t        node.add(nextLine.substr(0, mapping.generatedColumn));\n\t        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n\t        lastGeneratedColumn = mapping.generatedColumn;\n\t      }\n\t      lastMapping = mapping;\n\t    }, this);\n\t    // We have processed all mappings.\n\t    if (remainingLinesIndex < remainingLines.length) {\n\t      if (lastMapping) {\n\t        // Associate the remaining code in the current line with \"lastMapping\"\n\t        addMappingWithCode(lastMapping, shiftNextLine());\n\t      }\n\t      // and add the remaining lines without any mapping\n\t      node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n\t    }\n\t\n\t    // Copy sourcesContent into SourceNode\n\t    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t      if (content != null) {\n\t        if (aRelativePath != null) {\n\t          sourceFile = util.join(aRelativePath, sourceFile);\n\t        }\n\t        node.setSourceContent(sourceFile, content);\n\t      }\n\t    });\n\t\n\t    return node;\n\t\n\t    function addMappingWithCode(mapping, code) {\n\t      if (mapping === null || mapping.source === undefined) {\n\t        node.add(code);\n\t      } else {\n\t        var source = aRelativePath\n\t          ? util.join(aRelativePath, mapping.source)\n\t          : mapping.source;\n\t        node.add(new SourceNode(mapping.originalLine,\n\t                                mapping.originalColumn,\n\t                                source,\n\t                                code,\n\t                                mapping.name));\n\t      }\n\t    }\n\t  };\n\t\n\t/**\n\t * Add a chunk of generated JS to this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t *        SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.add = function SourceNode_add(aChunk) {\n\t  if (Array.isArray(aChunk)) {\n\t    aChunk.forEach(function (chunk) {\n\t      this.add(chunk);\n\t    }, this);\n\t  }\n\t  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t    if (aChunk) {\n\t      this.children.push(aChunk);\n\t    }\n\t  }\n\t  else {\n\t    throw new TypeError(\n\t      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t    );\n\t  }\n\t  return this;\n\t};\n\t\n\t/**\n\t * Add a chunk of generated JS to the beginning of this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t *        SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n\t  if (Array.isArray(aChunk)) {\n\t    for (var i = aChunk.length-1; i >= 0; i--) {\n\t      this.prepend(aChunk[i]);\n\t    }\n\t  }\n\t  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t    this.children.unshift(aChunk);\n\t  }\n\t  else {\n\t    throw new TypeError(\n\t      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t    );\n\t  }\n\t  return this;\n\t};\n\t\n\t/**\n\t * Walk over the tree of JS snippets in this node and its children. The\n\t * walking function is called once for each snippet of JS and is passed that\n\t * snippet and the its original associated source's line/column location.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n\t  var chunk;\n\t  for (var i = 0, len = this.children.length; i < len; i++) {\n\t    chunk = this.children[i];\n\t    if (chunk[isSourceNode]) {\n\t      chunk.walk(aFn);\n\t    }\n\t    else {\n\t      if (chunk !== '') {\n\t        aFn(chunk, { source: this.source,\n\t                     line: this.line,\n\t                     column: this.column,\n\t                     name: this.name });\n\t      }\n\t    }\n\t  }\n\t};\n\t\n\t/**\n\t * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n\t * each of `this.children`.\n\t *\n\t * @param aSep The separator.\n\t */\n\tSourceNode.prototype.join = function SourceNode_join(aSep) {\n\t  var newChildren;\n\t  var i;\n\t  var len = this.children.length;\n\t  if (len > 0) {\n\t    newChildren = [];\n\t    for (i = 0; i < len-1; i++) {\n\t      newChildren.push(this.children[i]);\n\t      newChildren.push(aSep);\n\t    }\n\t    newChildren.push(this.children[i]);\n\t    this.children = newChildren;\n\t  }\n\t  return this;\n\t};\n\t\n\t/**\n\t * Call String.prototype.replace on the very right-most source snippet. Useful\n\t * for trimming whitespace from the end of a source node, etc.\n\t *\n\t * @param aPattern The pattern to replace.\n\t * @param aReplacement The thing to replace the pattern with.\n\t */\n\tSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n\t  var lastChild = this.children[this.children.length - 1];\n\t  if (lastChild[isSourceNode]) {\n\t    lastChild.replaceRight(aPattern, aReplacement);\n\t  }\n\t  else if (typeof lastChild === 'string') {\n\t    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n\t  }\n\t  else {\n\t    this.children.push(''.replace(aPattern, aReplacement));\n\t  }\n\t  return this;\n\t};\n\t\n\t/**\n\t * Set the source content for a source file. This will be added to the SourceMapGenerator\n\t * in the sourcesContent field.\n\t *\n\t * @param aSourceFile The filename of the source file\n\t * @param aSourceContent The content of the source file\n\t */\n\tSourceNode.prototype.setSourceContent =\n\t  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n\t    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n\t  };\n\t\n\t/**\n\t * Walk over the tree of SourceNodes. The walking function is called for each\n\t * source file content and is passed the filename and source content.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walkSourceContents =\n\t  function SourceNode_walkSourceContents(aFn) {\n\t    for (var i = 0, len = this.children.length; i < len; i++) {\n\t      if (this.children[i][isSourceNode]) {\n\t        this.children[i].walkSourceContents(aFn);\n\t      }\n\t    }\n\t\n\t    var sources = Object.keys(this.sourceContents);\n\t    for (var i = 0, len = sources.length; i < len; i++) {\n\t      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n\t    }\n\t  };\n\t\n\t/**\n\t * Return the string representation of this source node. Walks over the tree\n\t * and concatenates all the various snippets together to one string.\n\t */\n\tSourceNode.prototype.toString = function SourceNode_toString() {\n\t  var str = \"\";\n\t  this.walk(function (chunk) {\n\t    str += chunk;\n\t  });\n\t  return str;\n\t};\n\t\n\t/**\n\t * Returns the string representation of this source node along with a source\n\t * map.\n\t */\n\tSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n\t  var generated = {\n\t    code: \"\",\n\t    line: 1,\n\t    column: 0\n\t  };\n\t  var map = new SourceMapGenerator(aArgs);\n\t  var sourceMappingActive = false;\n\t  var lastOriginalSource = null;\n\t  var lastOriginalLine = null;\n\t  var lastOriginalColumn = null;\n\t  var lastOriginalName = null;\n\t  this.walk(function (chunk, original) {\n\t    generated.code += chunk;\n\t    if (original.source !== null\n\t        && original.line !== null\n\t        && original.column !== null) {\n\t      if(lastOriginalSource !== original.source\n\t         || lastOriginalLine !== original.line\n\t         || lastOriginalColumn !== original.column\n\t         || lastOriginalName !== original.name) {\n\t        map.addMapping({\n\t          source: original.source,\n\t          original: {\n\t            line: original.line,\n\t            column: original.column\n\t          },\n\t          generated: {\n\t            line: generated.line,\n\t            column: generated.column\n\t          },\n\t          name: original.name\n\t        });\n\t      }\n\t      lastOriginalSource = original.source;\n\t      lastOriginalLine = original.line;\n\t      lastOriginalColumn = original.column;\n\t      lastOriginalName = original.name;\n\t      sourceMappingActive = true;\n\t    } else if (sourceMappingActive) {\n\t      map.addMapping({\n\t        generated: {\n\t          line: generated.line,\n\t          column: generated.column\n\t        }\n\t      });\n\t      lastOriginalSource = null;\n\t      sourceMappingActive = false;\n\t    }\n\t    for (var idx = 0, length = chunk.length; idx < length; idx++) {\n\t      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n\t        generated.line++;\n\t        generated.column = 0;\n\t        // Mappings end at eol\n\t        if (idx + 1 === length) {\n\t          lastOriginalSource = null;\n\t          sourceMappingActive = false;\n\t        } else if (sourceMappingActive) {\n\t          map.addMapping({\n\t            source: original.source,\n\t            original: {\n\t              line: original.line,\n\t              column: original.column\n\t            },\n\t            generated: {\n\t              line: generated.line,\n\t              column: generated.column\n\t            },\n\t            name: original.name\n\t          });\n\t        }\n\t      } else {\n\t        generated.column++;\n\t      }\n\t    }\n\t  });\n\t  this.walkSourceContents(function (sourceFile, sourceContent) {\n\t    map.setSourceContent(sourceFile, sourceContent);\n\t  });\n\t\n\t  return { code: generated.code, map: map };\n\t};\n\t\n\texports.SourceNode = SourceNode;\n\n\n/***/ })\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// source-map.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0fd5815da764db5fb9fe","/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./lib/source-node').SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./source-map.js\n// module id = 0\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar base64VLQ = require('./base64-vlq');\nvar util = require('./util');\nvar ArraySet = require('./array-set').ArraySet;\nvar MappingList = require('./mapping-list').MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n *   - file: The filename of the generated source.\n *   - sourceRoot: A root for all relative URLs in this source map.\n */\nfunction SourceMapGenerator(aArgs) {\n  if (!aArgs) {\n    aArgs = {};\n  }\n  this._file = util.getArg(aArgs, 'file', null);\n  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n  this._sources = new ArraySet();\n  this._names = new ArraySet();\n  this._mappings = new MappingList();\n  this._sourcesContents = null;\n}\n\nSourceMapGenerator.prototype._version = 3;\n\n/**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\nSourceMapGenerator.fromSourceMap =\n  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n    var sourceRoot = aSourceMapConsumer.sourceRoot;\n    var generator = new SourceMapGenerator({\n      file: aSourceMapConsumer.file,\n      sourceRoot: sourceRoot\n    });\n    aSourceMapConsumer.eachMapping(function (mapping) {\n      var newMapping = {\n        generated: {\n          line: mapping.generatedLine,\n          column: mapping.generatedColumn\n        }\n      };\n\n      if (mapping.source != null) {\n        newMapping.source = mapping.source;\n        if (sourceRoot != null) {\n          newMapping.source = util.relative(sourceRoot, newMapping.source);\n        }\n\n        newMapping.original = {\n          line: mapping.originalLine,\n          column: mapping.originalColumn\n        };\n\n        if (mapping.name != null) {\n          newMapping.name = mapping.name;\n        }\n      }\n\n      generator.addMapping(newMapping);\n    });\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n      var sourceRelative = sourceFile;\n      if (sourceRoot !== null) {\n        sourceRelative = util.relative(sourceRoot, sourceFile);\n      }\n\n      if (!generator._sources.has(sourceRelative)) {\n        generator._sources.add(sourceRelative);\n      }\n\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n      if (content != null) {\n        generator.setSourceContent(sourceFile, content);\n      }\n    });\n    return generator;\n  };\n\n/**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n *   - generated: An object with the generated line and column positions.\n *   - original: An object with the original line and column positions.\n *   - source: The original source file (relative to the sourceRoot).\n *   - name: An optional original token name for this mapping.\n */\nSourceMapGenerator.prototype.addMapping =\n  function SourceMapGenerator_addMapping(aArgs) {\n    var generated = util.getArg(aArgs, 'generated');\n    var original = util.getArg(aArgs, 'original', null);\n    var source = util.getArg(aArgs, 'source', null);\n    var name = util.getArg(aArgs, 'name', null);\n\n    if (!this._skipValidation) {\n      this._validateMapping(generated, original, source, name);\n    }\n\n    if (source != null) {\n      source = String(source);\n      if (!this._sources.has(source)) {\n        this._sources.add(source);\n      }\n    }\n\n    if (name != null) {\n      name = String(name);\n      if (!this._names.has(name)) {\n        this._names.add(name);\n      }\n    }\n\n    this._mappings.add({\n      generatedLine: generated.line,\n      generatedColumn: generated.column,\n      originalLine: original != null && original.line,\n      originalColumn: original != null && original.column,\n      source: source,\n      name: name\n    });\n  };\n\n/**\n * Set the source content for a source file.\n */\nSourceMapGenerator.prototype.setSourceContent =\n  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n    var source = aSourceFile;\n    if (this._sourceRoot != null) {\n      source = util.relative(this._sourceRoot, source);\n    }\n\n    if (aSourceContent != null) {\n      // Add the source content to the _sourcesContents map.\n      // Create a new _sourcesContents map if the property is null.\n      if (!this._sourcesContents) {\n        this._sourcesContents = Object.create(null);\n      }\n      this._sourcesContents[util.toSetString(source)] = aSourceContent;\n    } else if (this._sourcesContents) {\n      // Remove the source file from the _sourcesContents map.\n      // If the _sourcesContents map is empty, set the property to null.\n      delete this._sourcesContents[util.toSetString(source)];\n      if (Object.keys(this._sourcesContents).length === 0) {\n        this._sourcesContents = null;\n      }\n    }\n  };\n\n/**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n *        If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n *        to be applied. If relative, it is relative to the SourceMapConsumer.\n *        This parameter is needed when the two source maps aren't in the same\n *        directory, and the source map to be applied contains relative source\n *        paths. If so, those relative source paths need to be rewritten\n *        relative to the SourceMapGenerator.\n */\nSourceMapGenerator.prototype.applySourceMap =\n  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n    var sourceFile = aSourceFile;\n    // If aSourceFile is omitted, we will use the file property of the SourceMap\n    if (aSourceFile == null) {\n      if (aSourceMapConsumer.file == null) {\n        throw new Error(\n          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n          'or the source map\\'s \"file\" property. Both were omitted.'\n        );\n      }\n      sourceFile = aSourceMapConsumer.file;\n    }\n    var sourceRoot = this._sourceRoot;\n    // Make \"sourceFile\" relative if an absolute Url is passed.\n    if (sourceRoot != null) {\n      sourceFile = util.relative(sourceRoot, sourceFile);\n    }\n    // Applying the SourceMap can add and remove items from the sources and\n    // the names array.\n    var newSources = new ArraySet();\n    var newNames = new ArraySet();\n\n    // Find mappings for the \"sourceFile\"\n    this._mappings.unsortedForEach(function (mapping) {\n      if (mapping.source === sourceFile && mapping.originalLine != null) {\n        // Check if it can be mapped by the source map, then update the mapping.\n        var original = aSourceMapConsumer.originalPositionFor({\n          line: mapping.originalLine,\n          column: mapping.originalColumn\n        });\n        if (original.source != null) {\n          // Copy mapping\n          mapping.source = original.source;\n          if (aSourceMapPath != null) {\n            mapping.source = util.join(aSourceMapPath, mapping.source)\n          }\n          if (sourceRoot != null) {\n            mapping.source = util.relative(sourceRoot, mapping.source);\n          }\n          mapping.originalLine = original.line;\n          mapping.originalColumn = original.column;\n          if (original.name != null) {\n            mapping.name = original.name;\n          }\n        }\n      }\n\n      var source = mapping.source;\n      if (source != null && !newSources.has(source)) {\n        newSources.add(source);\n      }\n\n      var name = mapping.name;\n      if (name != null && !newNames.has(name)) {\n        newNames.add(name);\n      }\n\n    }, this);\n    this._sources = newSources;\n    this._names = newNames;\n\n    // Copy sourcesContents of applied map.\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n      if (content != null) {\n        if (aSourceMapPath != null) {\n          sourceFile = util.join(aSourceMapPath, sourceFile);\n        }\n        if (sourceRoot != null) {\n          sourceFile = util.relative(sourceRoot, sourceFile);\n        }\n        this.setSourceContent(sourceFile, content);\n      }\n    }, this);\n  };\n\n/**\n * A mapping can have one of the three levels of data:\n *\n *   1. Just the generated position.\n *   2. The Generated position, original position, and original source.\n *   3. Generated and original position, original source, as well as a name\n *      token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\nSourceMapGenerator.prototype._validateMapping =\n  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n                                              aName) {\n    // When aOriginal is truthy but has empty values for .line and .column,\n    // it is most likely a programmer error. In this case we throw a very\n    // specific error message to try to guide them the right way.\n    // For example: https://github.com/Polymer/polymer-bundler/pull/519\n    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n        throw new Error(\n            'original.line and original.column are not numbers -- you probably meant to omit ' +\n            'the original mapping entirely and only map the generated position. If so, pass ' +\n            'null for the original mapping instead of an object with empty or null values.'\n        );\n    }\n\n    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n        && aGenerated.line > 0 && aGenerated.column >= 0\n        && !aOriginal && !aSource && !aName) {\n      // Case 1.\n      return;\n    }\n    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n             && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n             && aGenerated.line > 0 && aGenerated.column >= 0\n             && aOriginal.line > 0 && aOriginal.column >= 0\n             && aSource) {\n      // Cases 2 and 3.\n      return;\n    }\n    else {\n      throw new Error('Invalid mapping: ' + JSON.stringify({\n        generated: aGenerated,\n        source: aSource,\n        original: aOriginal,\n        name: aName\n      }));\n    }\n  };\n\n/**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\nSourceMapGenerator.prototype._serializeMappings =\n  function SourceMapGenerator_serializeMappings() {\n    var previousGeneratedColumn = 0;\n    var previousGeneratedLine = 1;\n    var previousOriginalColumn = 0;\n    var previousOriginalLine = 0;\n    var previousName = 0;\n    var previousSource = 0;\n    var result = '';\n    var next;\n    var mapping;\n    var nameIdx;\n    var sourceIdx;\n\n    var mappings = this._mappings.toArray();\n    for (var i = 0, len = mappings.length; i < len; i++) {\n      mapping = mappings[i];\n      next = ''\n\n      if (mapping.generatedLine !== previousGeneratedLine) {\n        previousGeneratedColumn = 0;\n        while (mapping.generatedLine !== previousGeneratedLine) {\n          next += ';';\n          previousGeneratedLine++;\n        }\n      }\n      else {\n        if (i > 0) {\n          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n            continue;\n          }\n          next += ',';\n        }\n      }\n\n      next += base64VLQ.encode(mapping.generatedColumn\n                                 - previousGeneratedColumn);\n      previousGeneratedColumn = mapping.generatedColumn;\n\n      if (mapping.source != null) {\n        sourceIdx = this._sources.indexOf(mapping.source);\n        next += base64VLQ.encode(sourceIdx - previousSource);\n        previousSource = sourceIdx;\n\n        // lines are stored 0-based in SourceMap spec version 3\n        next += base64VLQ.encode(mapping.originalLine - 1\n                                   - previousOriginalLine);\n        previousOriginalLine = mapping.originalLine - 1;\n\n        next += base64VLQ.encode(mapping.originalColumn\n                                   - previousOriginalColumn);\n        previousOriginalColumn = mapping.originalColumn;\n\n        if (mapping.name != null) {\n          nameIdx = this._names.indexOf(mapping.name);\n          next += base64VLQ.encode(nameIdx - previousName);\n          previousName = nameIdx;\n        }\n      }\n\n      result += next;\n    }\n\n    return result;\n  };\n\nSourceMapGenerator.prototype._generateSourcesContent =\n  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n    return aSources.map(function (source) {\n      if (!this._sourcesContents) {\n        return null;\n      }\n      if (aSourceRoot != null) {\n        source = util.relative(aSourceRoot, source);\n      }\n      var key = util.toSetString(source);\n      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n        ? this._sourcesContents[key]\n        : null;\n    }, this);\n  };\n\n/**\n * Externalize the source map.\n */\nSourceMapGenerator.prototype.toJSON =\n  function SourceMapGenerator_toJSON() {\n    var map = {\n      version: this._version,\n      sources: this._sources.toArray(),\n      names: this._names.toArray(),\n      mappings: this._serializeMappings()\n    };\n    if (this._file != null) {\n      map.file = this._file;\n    }\n    if (this._sourceRoot != null) {\n      map.sourceRoot = this._sourceRoot;\n    }\n    if (this._sourcesContents) {\n      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n    }\n\n    return map;\n  };\n\n/**\n * Render the source map being generated to a string.\n */\nSourceMapGenerator.prototype.toString =\n  function SourceMapGenerator_toString() {\n    return JSON.stringify(this.toJSON());\n  };\n\nexports.SourceMapGenerator = SourceMapGenerator;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-generator.js\n// module id = 1\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *  * Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *  * Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *  * Neither the name of Google Inc. nor the names of its\n *    contributors may be used to endorse or promote products derived\n *    from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar base64 = require('./base64');\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n//   Continuation\n//   |    Sign\n//   |    |\n//   V    V\n//   101011\n\nvar VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit.  For example, as decimals:\n *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n  return aValue < 0\n    ? ((-aValue) << 1) + 1\n    : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit.  For example, as decimals:\n *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\nfunction fromVLQSigned(aValue) {\n  var isNegative = (aValue & 1) === 1;\n  var shifted = aValue >> 1;\n  return isNegative\n    ? -shifted\n    : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n  var encoded = \"\";\n  var digit;\n\n  var vlq = toVLQSigned(aValue);\n\n  do {\n    digit = vlq & VLQ_BASE_MASK;\n    vlq >>>= VLQ_BASE_SHIFT;\n    if (vlq > 0) {\n      // There are still more digits in this value, so we must make sure the\n      // continuation bit is marked.\n      digit |= VLQ_CONTINUATION_BIT;\n    }\n    encoded += base64.encode(digit);\n  } while (vlq > 0);\n\n  return encoded;\n};\n\n/**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n  var strLen = aStr.length;\n  var result = 0;\n  var shift = 0;\n  var continuation, digit;\n\n  do {\n    if (aIndex >= strLen) {\n      throw new Error(\"Expected more digits in base 64 VLQ value.\");\n    }\n\n    digit = base64.decode(aStr.charCodeAt(aIndex++));\n    if (digit === -1) {\n      throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n    }\n\n    continuation = !!(digit & VLQ_CONTINUATION_BIT);\n    digit &= VLQ_BASE_MASK;\n    result = result + (digit << shift);\n    shift += VLQ_BASE_SHIFT;\n  } while (continuation);\n\n  aOutParam.value = fromVLQSigned(result);\n  aOutParam.rest = aIndex;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64-vlq.js\n// module id = 2\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function (number) {\n  if (0 <= number && number < intToCharMap.length) {\n    return intToCharMap[number];\n  }\n  throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n\n/**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\nexports.decode = function (charCode) {\n  var bigA = 65;     // 'A'\n  var bigZ = 90;     // 'Z'\n\n  var littleA = 97;  // 'a'\n  var littleZ = 122; // 'z'\n\n  var zero = 48;     // '0'\n  var nine = 57;     // '9'\n\n  var plus = 43;     // '+'\n  var slash = 47;    // '/'\n\n  var littleOffset = 26;\n  var numberOffset = 52;\n\n  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n  if (bigA <= charCode && charCode <= bigZ) {\n    return (charCode - bigA);\n  }\n\n  // 26 - 51: abcdefghijklmnopqrstuvwxyz\n  if (littleA <= charCode && charCode <= littleZ) {\n    return (charCode - littleA + littleOffset);\n  }\n\n  // 52 - 61: 0123456789\n  if (zero <= charCode && charCode <= nine) {\n    return (charCode - zero + numberOffset);\n  }\n\n  // 62: +\n  if (charCode == plus) {\n    return 62;\n  }\n\n  // 63: /\n  if (charCode == slash) {\n    return 63;\n  }\n\n  // Invalid base64 digit.\n  return -1;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64.js\n// module id = 3\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n  if (aName in aArgs) {\n    return aArgs[aName];\n  } else if (arguments.length === 3) {\n    return aDefaultValue;\n  } else {\n    throw new Error('\"' + aName + '\" is a required argument.');\n  }\n}\nexports.getArg = getArg;\n\nvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\nvar dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n  var match = aUrl.match(urlRegexp);\n  if (!match) {\n    return null;\n  }\n  return {\n    scheme: match[1],\n    auth: match[2],\n    host: match[3],\n    port: match[4],\n    path: match[5]\n  };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n  var url = '';\n  if (aParsedUrl.scheme) {\n    url += aParsedUrl.scheme + ':';\n  }\n  url += '//';\n  if (aParsedUrl.auth) {\n    url += aParsedUrl.auth + '@';\n  }\n  if (aParsedUrl.host) {\n    url += aParsedUrl.host;\n  }\n  if (aParsedUrl.port) {\n    url += \":\" + aParsedUrl.port\n  }\n  if (aParsedUrl.path) {\n    url += aParsedUrl.path;\n  }\n  return url;\n}\nexports.urlGenerate = urlGenerate;\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '<dir>/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nfunction normalize(aPath) {\n  var path = aPath;\n  var url = urlParse(aPath);\n  if (url) {\n    if (!url.path) {\n      return aPath;\n    }\n    path = url.path;\n  }\n  var isAbsolute = exports.isAbsolute(path);\n\n  var parts = path.split(/\\/+/);\n  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n    part = parts[i];\n    if (part === '.') {\n      parts.splice(i, 1);\n    } else if (part === '..') {\n      up++;\n    } else if (up > 0) {\n      if (part === '') {\n        // The first part is blank if the path is absolute. Trying to go\n        // above the root is a no-op. Therefore we can remove all '..' parts\n        // directly after the root.\n        parts.splice(i + 1, up);\n        up = 0;\n      } else {\n        parts.splice(i, 2);\n        up--;\n      }\n    }\n  }\n  path = parts.join('/');\n\n  if (path === '') {\n    path = isAbsolute ? '/' : '.';\n  }\n\n  if (url) {\n    url.path = path;\n    return urlGenerate(url);\n  }\n  return path;\n}\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n *   first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n *   is updated with the result and aRoot is returned. Otherwise the result\n *   is returned.\n *   - If aPath is absolute, the result is aPath.\n *   - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n  if (aRoot === \"\") {\n    aRoot = \".\";\n  }\n  if (aPath === \"\") {\n    aPath = \".\";\n  }\n  var aPathUrl = urlParse(aPath);\n  var aRootUrl = urlParse(aRoot);\n  if (aRootUrl) {\n    aRoot = aRootUrl.path || '/';\n  }\n\n  // `join(foo, '//www.example.org')`\n  if (aPathUrl && !aPathUrl.scheme) {\n    if (aRootUrl) {\n      aPathUrl.scheme = aRootUrl.scheme;\n    }\n    return urlGenerate(aPathUrl);\n  }\n\n  if (aPathUrl || aPath.match(dataUrlRegexp)) {\n    return aPath;\n  }\n\n  // `join('http://', 'www.example.com')`\n  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n    aRootUrl.host = aPath;\n    return urlGenerate(aRootUrl);\n  }\n\n  var joined = aPath.charAt(0) === '/'\n    ? aPath\n    : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n  if (aRootUrl) {\n    aRootUrl.path = joined;\n    return urlGenerate(aRootUrl);\n  }\n  return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function (aPath) {\n  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n  if (aRoot === \"\") {\n    aRoot = \".\";\n  }\n\n  aRoot = aRoot.replace(/\\/$/, '');\n\n  // It is possible for the path to be above the root. In this case, simply\n  // checking whether the root is a prefix of the path won't work. Instead, we\n  // need to remove components from the root one by one, until either we find\n  // a prefix that fits, or we run out of components to remove.\n  var level = 0;\n  while (aPath.indexOf(aRoot + '/') !== 0) {\n    var index = aRoot.lastIndexOf(\"/\");\n    if (index < 0) {\n      return aPath;\n    }\n\n    // If the only part of the root that is left is the scheme (i.e. http://,\n    // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n    // have exhausted all components, so the path is not relative to the root.\n    aRoot = aRoot.slice(0, index);\n    if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n      return aPath;\n    }\n\n    ++level;\n  }\n\n  // Make sure we add a \"../\" for each component we removed from the root.\n  return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nvar supportsNullProto = (function () {\n  var obj = Object.create(null);\n  return !('__proto__' in obj);\n}());\n\nfunction identity (s) {\n  return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n  if (isProtoString(aStr)) {\n    return '$' + aStr;\n  }\n\n  return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n  if (isProtoString(aStr)) {\n    return aStr.slice(1);\n  }\n\n  return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n  if (!s) {\n    return false;\n  }\n\n  var length = s.length;\n\n  if (length < 9 /* \"__proto__\".length */) {\n    return false;\n  }\n\n  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||\n      s.charCodeAt(length - 2) !== 95  /* '_' */ ||\n      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n      s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n      s.charCodeAt(length - 8) !== 95  /* '_' */ ||\n      s.charCodeAt(length - 9) !== 95  /* '_' */) {\n    return false;\n  }\n\n  for (var i = length - 10; i >= 0; i--) {\n    if (s.charCodeAt(i) !== 36 /* '$' */) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n  var cmp = strcmp(mappingA.source, mappingB.source);\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0 || onlyCompareOriginal) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedLine - mappingB.generatedLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0 || onlyCompareGenerated) {\n    return cmp;\n  }\n\n  cmp = strcmp(mappingA.source, mappingB.source);\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction strcmp(aStr1, aStr2) {\n  if (aStr1 === aStr2) {\n    return 0;\n  }\n\n  if (aStr1 === null) {\n    return 1; // aStr2 !== null\n  }\n\n  if (aStr2 === null) {\n    return -1; // aStr1 !== null\n  }\n\n  if (aStr1 > aStr2) {\n    return 1;\n  }\n\n  return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = strcmp(mappingA.source, mappingB.source);\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n/**\n * Strip any JSON XSSI avoidance prefix from the string (as documented\n * in the source maps specification), and then parse the string as\n * JSON.\n */\nfunction parseSourceMapInput(str) {\n  return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n}\nexports.parseSourceMapInput = parseSourceMapInput;\n\n/**\n * Compute the URL of a source given the the source root, the source's\n * URL, and the source map's URL.\n */\nfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n  sourceURL = sourceURL || '';\n\n  if (sourceRoot) {\n    // This follows what Chrome does.\n    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n      sourceRoot += '/';\n    }\n    // The spec says:\n    //   Line 4: An optional source root, useful for relocating source\n    //   files on a server or removing repeated values in the\n    //   â€œsourcesâ€� entry.  This value is prepended to the individual\n    //   entries in the â€œsourceâ€� field.\n    sourceURL = sourceRoot + sourceURL;\n  }\n\n  // Historically, SourceMapConsumer did not take the sourceMapURL as\n  // a parameter.  This mode is still somewhat supported, which is why\n  // this code block is conditional.  However, it's preferable to pass\n  // the source map URL to SourceMapConsumer, so that this function\n  // can implement the source URL resolution algorithm as outlined in\n  // the spec.  This block is basically the equivalent of:\n  //    new URL(sourceURL, sourceMapURL).toString()\n  // ... except it avoids using URL, which wasn't available in the\n  // older releases of node still supported by this library.\n  //\n  // The spec says:\n  //   If the sources are not absolute URLs after prepending of the\n  //   â€œsourceRootâ€�, the sources are resolved relative to the\n  //   SourceMap (like resolving script src in a html document).\n  if (sourceMapURL) {\n    var parsed = urlParse(sourceMapURL);\n    if (!parsed) {\n      throw new Error(\"sourceMapURL could not be parsed\");\n    }\n    if (parsed.path) {\n      // Strip the last path component, but keep the \"/\".\n      var index = parsed.path.lastIndexOf('/');\n      if (index >= 0) {\n        parsed.path = parsed.path.substring(0, index + 1);\n      }\n    }\n    sourceURL = join(urlGenerate(parsed), sourceURL);\n  }\n\n  return normalize(sourceURL);\n}\nexports.computeSourceURL = computeSourceURL;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/util.js\n// module id = 4\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar has = Object.prototype.hasOwnProperty;\nvar hasNativeMap = typeof Map !== \"undefined\";\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nfunction ArraySet() {\n  this._array = [];\n  this._set = hasNativeMap ? new Map() : Object.create(null);\n}\n\n/**\n * Static method for creating ArraySet instances from an existing array.\n */\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n  var set = new ArraySet();\n  for (var i = 0, len = aArray.length; i < len; i++) {\n    set.add(aArray[i], aAllowDuplicates);\n  }\n  return set;\n};\n\n/**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\nArraySet.prototype.size = function ArraySet_size() {\n  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n};\n\n/**\n * Add the given string to this set.\n *\n * @param String aStr\n */\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n  var idx = this._array.length;\n  if (!isDuplicate || aAllowDuplicates) {\n    this._array.push(aStr);\n  }\n  if (!isDuplicate) {\n    if (hasNativeMap) {\n      this._set.set(aStr, idx);\n    } else {\n      this._set[sStr] = idx;\n    }\n  }\n};\n\n/**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\nArraySet.prototype.has = function ArraySet_has(aStr) {\n  if (hasNativeMap) {\n    return this._set.has(aStr);\n  } else {\n    var sStr = util.toSetString(aStr);\n    return has.call(this._set, sStr);\n  }\n};\n\n/**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n  if (hasNativeMap) {\n    var idx = this._set.get(aStr);\n    if (idx >= 0) {\n        return idx;\n    }\n  } else {\n    var sStr = util.toSetString(aStr);\n    if (has.call(this._set, sStr)) {\n      return this._set[sStr];\n    }\n  }\n\n  throw new Error('\"' + aStr + '\" is not in the set.');\n};\n\n/**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\nArraySet.prototype.at = function ArraySet_at(aIdx) {\n  if (aIdx >= 0 && aIdx < this._array.length) {\n    return this._array[aIdx];\n  }\n  throw new Error('No element indexed by ' + aIdx);\n};\n\n/**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\nArraySet.prototype.toArray = function ArraySet_toArray() {\n  return this._array.slice();\n};\n\nexports.ArraySet = ArraySet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/array-set.js\n// module id = 5\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n  // Optimized for most common case\n  var lineA = mappingA.generatedLine;\n  var lineB = mappingB.generatedLine;\n  var columnA = mappingA.generatedColumn;\n  var columnB = mappingB.generatedColumn;\n  return lineB > lineA || lineB == lineA && columnB >= columnA ||\n         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nfunction MappingList() {\n  this._array = [];\n  this._sorted = true;\n  // Serves as infimum\n  this._last = {generatedLine: -1, generatedColumn: 0};\n}\n\n/**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\nMappingList.prototype.unsortedForEach =\n  function MappingList_forEach(aCallback, aThisArg) {\n    this._array.forEach(aCallback, aThisArg);\n  };\n\n/**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\nMappingList.prototype.add = function MappingList_add(aMapping) {\n  if (generatedPositionAfter(this._last, aMapping)) {\n    this._last = aMapping;\n    this._array.push(aMapping);\n  } else {\n    this._sorted = false;\n    this._array.push(aMapping);\n  }\n};\n\n/**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\nMappingList.prototype.toArray = function MappingList_toArray() {\n  if (!this._sorted) {\n    this._array.sort(util.compareByGeneratedPositionsInflated);\n    this._sorted = true;\n  }\n  return this._array;\n};\n\nexports.MappingList = MappingList;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/mapping-list.js\n// module id = 6\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar binarySearch = require('./binary-search');\nvar ArraySet = require('./array-set').ArraySet;\nvar base64VLQ = require('./base64-vlq');\nvar quickSort = require('./quick-sort').quickSort;\n\nfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\n  var sourceMap = aSourceMap;\n  if (typeof aSourceMap === 'string') {\n    sourceMap = util.parseSourceMapInput(aSourceMap);\n  }\n\n  return sourceMap.sections != null\n    ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n    : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n}\n\nSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n  return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\n}\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nSourceMapConsumer.prototype._version = 3;\n\n// `__generatedMappings` and `__originalMappings` are arrays that hold the\n// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n// are lazily instantiated, accessed via the `_generatedMappings` and\n// `_originalMappings` getters respectively, and we only parse the mappings\n// and create these arrays once queried for a source location. We jump through\n// these hoops because there can be many thousands of mappings, and parsing\n// them is expensive, so we only want to do it if we must.\n//\n// Each object in the arrays is of the form:\n//\n//     {\n//       generatedLine: The line number in the generated code,\n//       generatedColumn: The column number in the generated code,\n//       source: The path to the original source file that generated this\n//               chunk of code,\n//       originalLine: The line number in the original source that\n//                     corresponds to this chunk of generated code,\n//       originalColumn: The column number in the original source that\n//                       corresponds to this chunk of generated code,\n//       name: The name of the original symbol which generated this chunk of\n//             code.\n//     }\n//\n// All properties except for `generatedLine` and `generatedColumn` can be\n// `null`.\n//\n// `_generatedMappings` is ordered by the generated positions.\n//\n// `_originalMappings` is ordered by the original positions.\n\nSourceMapConsumer.prototype.__generatedMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n  configurable: true,\n  enumerable: true,\n  get: function () {\n    if (!this.__generatedMappings) {\n      this._parseMappings(this._mappings, this.sourceRoot);\n    }\n\n    return this.__generatedMappings;\n  }\n});\n\nSourceMapConsumer.prototype.__originalMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n  configurable: true,\n  enumerable: true,\n  get: function () {\n    if (!this.__originalMappings) {\n      this._parseMappings(this._mappings, this.sourceRoot);\n    }\n\n    return this.__originalMappings;\n  }\n});\n\nSourceMapConsumer.prototype._charIsMappingSeparator =\n  function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n    var c = aStr.charAt(index);\n    return c === \";\" || c === \",\";\n  };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nSourceMapConsumer.prototype._parseMappings =\n  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n    throw new Error(\"Subclasses must implement _parseMappings\");\n  };\n\nSourceMapConsumer.GENERATED_ORDER = 1;\nSourceMapConsumer.ORIGINAL_ORDER = 2;\n\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n/**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n *        The function that is called with each mapping.\n * @param Object aContext\n *        Optional. If specified, this object will be the value of `this` every\n *        time that `aCallback` is called.\n * @param aOrder\n *        Either `SourceMapConsumer.GENERATED_ORDER` or\n *        `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n *        iterate over the mappings sorted by the generated file's line/column\n *        order or the original's source/line/column order, respectively. Defaults to\n *        `SourceMapConsumer.GENERATED_ORDER`.\n */\nSourceMapConsumer.prototype.eachMapping =\n  function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n    var context = aContext || null;\n    var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n    var mappings;\n    switch (order) {\n    case SourceMapConsumer.GENERATED_ORDER:\n      mappings = this._generatedMappings;\n      break;\n    case SourceMapConsumer.ORIGINAL_ORDER:\n      mappings = this._originalMappings;\n      break;\n    default:\n      throw new Error(\"Unknown order of iteration.\");\n    }\n\n    var sourceRoot = this.sourceRoot;\n    mappings.map(function (mapping) {\n      var source = mapping.source === null ? null : this._sources.at(mapping.source);\n      source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\n      return {\n        source: source,\n        generatedLine: mapping.generatedLine,\n        generatedColumn: mapping.generatedColumn,\n        originalLine: mapping.originalLine,\n        originalColumn: mapping.originalColumn,\n        name: mapping.name === null ? null : this._names.at(mapping.name)\n      };\n    }, this).forEach(aCallback, context);\n  };\n\n/**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n *   - source: The filename of the original source.\n *   - line: The line number in the original source.  The line number is 1-based.\n *   - column: Optional. the column number in the original source.\n *    The column number is 0-based.\n *\n * and an array of objects is returned, each with the following properties:\n *\n *   - line: The line number in the generated source, or null.  The\n *    line number is 1-based.\n *   - column: The column number in the generated source, or null.\n *    The column number is 0-based.\n */\nSourceMapConsumer.prototype.allGeneratedPositionsFor =\n  function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n    var line = util.getArg(aArgs, 'line');\n\n    // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n    // returns the index of the closest mapping less than the needle. By\n    // setting needle.originalColumn to 0, we thus find the last mapping for\n    // the given line, provided such a mapping exists.\n    var needle = {\n      source: util.getArg(aArgs, 'source'),\n      originalLine: line,\n      originalColumn: util.getArg(aArgs, 'column', 0)\n    };\n\n    needle.source = this._findSourceIndex(needle.source);\n    if (needle.source < 0) {\n      return [];\n    }\n\n    var mappings = [];\n\n    var index = this._findMapping(needle,\n                                  this._originalMappings,\n                                  \"originalLine\",\n                                  \"originalColumn\",\n                                  util.compareByOriginalPositions,\n                                  binarySearch.LEAST_UPPER_BOUND);\n    if (index >= 0) {\n      var mapping = this._originalMappings[index];\n\n      if (aArgs.column === undefined) {\n        var originalLine = mapping.originalLine;\n\n        // Iterate until either we run out of mappings, or we run into\n        // a mapping for a different line than the one we found. Since\n        // mappings are sorted, this is guaranteed to find all mappings for\n        // the line we found.\n        while (mapping && mapping.originalLine === originalLine) {\n          mappings.push({\n            line: util.getArg(mapping, 'generatedLine', null),\n            column: util.getArg(mapping, 'generatedColumn', null),\n            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n          });\n\n          mapping = this._originalMappings[++index];\n        }\n      } else {\n        var originalColumn = mapping.originalColumn;\n\n        // Iterate until either we run out of mappings, or we run into\n        // a mapping for a different line than the one we were searching for.\n        // Since mappings are sorted, this is guaranteed to find all mappings for\n        // the line we are searching for.\n        while (mapping &&\n               mapping.originalLine === line &&\n               mapping.originalColumn == originalColumn) {\n          mappings.push({\n            line: util.getArg(mapping, 'generatedLine', null),\n            column: util.getArg(mapping, 'generatedColumn', null),\n            lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n          });\n\n          mapping = this._originalMappings[++index];\n        }\n      }\n    }\n\n    return mappings;\n  };\n\nexports.SourceMapConsumer = SourceMapConsumer;\n\n/**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The first parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n *   - version: Which version of the source map spec this map is following.\n *   - sources: An array of URLs to the original source files.\n *   - names: An array of identifiers which can be referrenced by individual mappings.\n *   - sourceRoot: Optional. The URL root from which all sources are relative.\n *   - sourcesContent: Optional. An array of contents of the original source files.\n *   - mappings: A string of base64 VLQs which contain the actual mappings.\n *   - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n *     {\n *       version : 3,\n *       file: \"out.js\",\n *       sourceRoot : \"\",\n *       sources: [\"foo.js\", \"bar.js\"],\n *       names: [\"src\", \"maps\", \"are\", \"fun\"],\n *       mappings: \"AA,AB;;ABCDE;\"\n *     }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found.  This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n  var sourceMap = aSourceMap;\n  if (typeof aSourceMap === 'string') {\n    sourceMap = util.parseSourceMapInput(aSourceMap);\n  }\n\n  var version = util.getArg(sourceMap, 'version');\n  var sources = util.getArg(sourceMap, 'sources');\n  // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n  // requires the array) to play nice here.\n  var names = util.getArg(sourceMap, 'names', []);\n  var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n  var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n  var mappings = util.getArg(sourceMap, 'mappings');\n  var file = util.getArg(sourceMap, 'file', null);\n\n  // Once again, Sass deviates from the spec and supplies the version as a\n  // string rather than a number, so we use loose equality checking here.\n  if (version != this._version) {\n    throw new Error('Unsupported version: ' + version);\n  }\n\n  if (sourceRoot) {\n    sourceRoot = util.normalize(sourceRoot);\n  }\n\n  sources = sources\n    .map(String)\n    // Some source maps produce relative source paths like \"./foo.js\" instead of\n    // \"foo.js\".  Normalize these first so that future comparisons will succeed.\n    // See bugzil.la/1090768.\n    .map(util.normalize)\n    // Always ensure that absolute sources are internally stored relative to\n    // the source root, if the source root is absolute. Not doing this would\n    // be particularly problematic when the source root is a prefix of the\n    // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n    .map(function (source) {\n      return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n        ? util.relative(sourceRoot, source)\n        : source;\n    });\n\n  // Pass `true` below to allow duplicate names and sources. While source maps\n  // are intended to be compressed and deduplicated, the TypeScript compiler\n  // sometimes generates source maps with duplicates in them. See Github issue\n  // #72 and bugzil.la/889492.\n  this._names = ArraySet.fromArray(names.map(String), true);\n  this._sources = ArraySet.fromArray(sources, true);\n\n  this._absoluteSources = this._sources.toArray().map(function (s) {\n    return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n  });\n\n  this.sourceRoot = sourceRoot;\n  this.sourcesContent = sourcesContent;\n  this._mappings = mappings;\n  this._sourceMapURL = aSourceMapURL;\n  this.file = file;\n}\n\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n/**\n * Utility function to find the index of a source.  Returns -1 if not\n * found.\n */\nBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n  var relativeSource = aSource;\n  if (this.sourceRoot != null) {\n    relativeSource = util.relative(this.sourceRoot, relativeSource);\n  }\n\n  if (this._sources.has(relativeSource)) {\n    return this._sources.indexOf(relativeSource);\n  }\n\n  // Maybe aSource is an absolute URL as returned by |sources|.  In\n  // this case we can't simply undo the transform.\n  var i;\n  for (i = 0; i < this._absoluteSources.length; ++i) {\n    if (this._absoluteSources[i] == aSource) {\n      return i;\n    }\n  }\n\n  return -1;\n};\n\n/**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n *        The source map that will be consumed.\n * @param String aSourceMapURL\n *        The URL at which the source map can be found (optional)\n * @returns BasicSourceMapConsumer\n */\nBasicSourceMapConsumer.fromSourceMap =\n  function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\n    var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n    var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n    var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n    smc.sourceRoot = aSourceMap._sourceRoot;\n    smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n                                                            smc.sourceRoot);\n    smc.file = aSourceMap._file;\n    smc._sourceMapURL = aSourceMapURL;\n    smc._absoluteSources = smc._sources.toArray().map(function (s) {\n      return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n    });\n\n    // Because we are modifying the entries (by converting string sources and\n    // names to indices into the sources and names ArraySets), we have to make\n    // a copy of the entry or else bad things happen. Shared mutable state\n    // strikes again! See github issue #191.\n\n    var generatedMappings = aSourceMap._mappings.toArray().slice();\n    var destGeneratedMappings = smc.__generatedMappings = [];\n    var destOriginalMappings = smc.__originalMappings = [];\n\n    for (var i = 0, length = generatedMappings.length; i < length; i++) {\n      var srcMapping = generatedMappings[i];\n      var destMapping = new Mapping;\n      destMapping.generatedLine = srcMapping.generatedLine;\n      destMapping.generatedColumn = srcMapping.generatedColumn;\n\n      if (srcMapping.source) {\n        destMapping.source = sources.indexOf(srcMapping.source);\n        destMapping.originalLine = srcMapping.originalLine;\n        destMapping.originalColumn = srcMapping.originalColumn;\n\n        if (srcMapping.name) {\n          destMapping.name = names.indexOf(srcMapping.name);\n        }\n\n        destOriginalMappings.push(destMapping);\n      }\n\n      destGeneratedMappings.push(destMapping);\n    }\n\n    quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n    return smc;\n  };\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nBasicSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n  get: function () {\n    return this._absoluteSources.slice();\n  }\n});\n\n/**\n * Provide the JIT with a nice shape / hidden class.\n */\nfunction Mapping() {\n  this.generatedLine = 0;\n  this.generatedColumn = 0;\n  this.source = null;\n  this.originalLine = null;\n  this.originalColumn = null;\n  this.name = null;\n}\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nBasicSourceMapConsumer.prototype._parseMappings =\n  function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n    var generatedLine = 1;\n    var previousGeneratedColumn = 0;\n    var previousOriginalLine = 0;\n    var previousOriginalColumn = 0;\n    var previousSource = 0;\n    var previousName = 0;\n    var length = aStr.length;\n    var index = 0;\n    var cachedSegments = {};\n    var temp = {};\n    var originalMappings = [];\n    var generatedMappings = [];\n    var mapping, str, segment, end, value;\n\n    while (index < length) {\n      if (aStr.charAt(index) === ';') {\n        generatedLine++;\n        index++;\n        previousGeneratedColumn = 0;\n      }\n      else if (aStr.charAt(index) === ',') {\n        index++;\n      }\n      else {\n        mapping = new Mapping();\n        mapping.generatedLine = generatedLine;\n\n        // Because each offset is encoded relative to the previous one,\n        // many segments often have the same encoding. We can exploit this\n        // fact by caching the parsed variable length fields of each segment,\n        // allowing us to avoid a second parse if we encounter the same\n        // segment again.\n        for (end = index; end < length; end++) {\n          if (this._charIsMappingSeparator(aStr, end)) {\n            break;\n          }\n        }\n        str = aStr.slice(index, end);\n\n        segment = cachedSegments[str];\n        if (segment) {\n          index += str.length;\n        } else {\n          segment = [];\n          while (index < end) {\n            base64VLQ.decode(aStr, index, temp);\n            value = temp.value;\n            index = temp.rest;\n            segment.push(value);\n          }\n\n          if (segment.length === 2) {\n            throw new Error('Found a source, but no line and column');\n          }\n\n          if (segment.length === 3) {\n            throw new Error('Found a source and line, but no column');\n          }\n\n          cachedSegments[str] = segment;\n        }\n\n        // Generated column.\n        mapping.generatedColumn = previousGeneratedColumn + segment[0];\n        previousGeneratedColumn = mapping.generatedColumn;\n\n        if (segment.length > 1) {\n          // Original source.\n          mapping.source = previousSource + segment[1];\n          previousSource += segment[1];\n\n          // Original line.\n          mapping.originalLine = previousOriginalLine + segment[2];\n          previousOriginalLine = mapping.originalLine;\n          // Lines are stored 0-based\n          mapping.originalLine += 1;\n\n          // Original column.\n          mapping.originalColumn = previousOriginalColumn + segment[3];\n          previousOriginalColumn = mapping.originalColumn;\n\n          if (segment.length > 4) {\n            // Original name.\n            mapping.name = previousName + segment[4];\n            previousName += segment[4];\n          }\n        }\n\n        generatedMappings.push(mapping);\n        if (typeof mapping.originalLine === 'number') {\n          originalMappings.push(mapping);\n        }\n      }\n    }\n\n    quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n    this.__generatedMappings = generatedMappings;\n\n    quickSort(originalMappings, util.compareByOriginalPositions);\n    this.__originalMappings = originalMappings;\n  };\n\n/**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\nBasicSourceMapConsumer.prototype._findMapping =\n  function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n                                         aColumnName, aComparator, aBias) {\n    // To return the position we are searching for, we must first find the\n    // mapping for the given position and then return the opposite position it\n    // points to. Because the mappings are sorted, we can use binary search to\n    // find the best mapping.\n\n    if (aNeedle[aLineName] <= 0) {\n      throw new TypeError('Line must be greater than or equal to 1, got '\n                          + aNeedle[aLineName]);\n    }\n    if (aNeedle[aColumnName] < 0) {\n      throw new TypeError('Column must be greater than or equal to 0, got '\n                          + aNeedle[aColumnName]);\n    }\n\n    return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n  };\n\n/**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\nBasicSourceMapConsumer.prototype.computeColumnSpans =\n  function SourceMapConsumer_computeColumnSpans() {\n    for (var index = 0; index < this._generatedMappings.length; ++index) {\n      var mapping = this._generatedMappings[index];\n\n      // Mappings do not contain a field for the last generated columnt. We\n      // can come up with an optimistic estimate, however, by assuming that\n      // mappings are contiguous (i.e. given two consecutive mappings, the\n      // first mapping ends where the second one starts).\n      if (index + 1 < this._generatedMappings.length) {\n        var nextMapping = this._generatedMappings[index + 1];\n\n        if (mapping.generatedLine === nextMapping.generatedLine) {\n          mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n          continue;\n        }\n      }\n\n      // The last mapping for each line spans the entire line.\n      mapping.lastGeneratedColumn = Infinity;\n    }\n  };\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n *   - line: The line number in the generated source.  The line number\n *     is 1-based.\n *   - column: The column number in the generated source.  The column\n *     number is 0-based.\n *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n *     closest element that is smaller than or greater than the one we are\n *     searching for, respectively, if the exact element cannot be found.\n *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n *   - source: The original source file, or null.\n *   - line: The line number in the original source, or null.  The\n *     line number is 1-based.\n *   - column: The column number in the original source, or null.  The\n *     column number is 0-based.\n *   - name: The original identifier, or null.\n */\nBasicSourceMapConsumer.prototype.originalPositionFor =\n  function SourceMapConsumer_originalPositionFor(aArgs) {\n    var needle = {\n      generatedLine: util.getArg(aArgs, 'line'),\n      generatedColumn: util.getArg(aArgs, 'column')\n    };\n\n    var index = this._findMapping(\n      needle,\n      this._generatedMappings,\n      \"generatedLine\",\n      \"generatedColumn\",\n      util.compareByGeneratedPositionsDeflated,\n      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n    );\n\n    if (index >= 0) {\n      var mapping = this._generatedMappings[index];\n\n      if (mapping.generatedLine === needle.generatedLine) {\n        var source = util.getArg(mapping, 'source', null);\n        if (source !== null) {\n          source = this._sources.at(source);\n          source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\n        }\n        var name = util.getArg(mapping, 'name', null);\n        if (name !== null) {\n          name = this._names.at(name);\n        }\n        return {\n          source: source,\n          line: util.getArg(mapping, 'originalLine', null),\n          column: util.getArg(mapping, 'originalColumn', null),\n          name: name\n        };\n      }\n    }\n\n    return {\n      source: null,\n      line: null,\n      column: null,\n      name: null\n    };\n  };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n  function BasicSourceMapConsumer_hasContentsOfAllSources() {\n    if (!this.sourcesContent) {\n      return false;\n    }\n    return this.sourcesContent.length >= this._sources.size() &&\n      !this.sourcesContent.some(function (sc) { return sc == null; });\n  };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nBasicSourceMapConsumer.prototype.sourceContentFor =\n  function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n    if (!this.sourcesContent) {\n      return null;\n    }\n\n    var index = this._findSourceIndex(aSource);\n    if (index >= 0) {\n      return this.sourcesContent[index];\n    }\n\n    var relativeSource = aSource;\n    if (this.sourceRoot != null) {\n      relativeSource = util.relative(this.sourceRoot, relativeSource);\n    }\n\n    var url;\n    if (this.sourceRoot != null\n        && (url = util.urlParse(this.sourceRoot))) {\n      // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n      // many users. We can help them out when they expect file:// URIs to\n      // behave like it would if they were running a local HTTP server. See\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n      var fileUriAbsPath = relativeSource.replace(/^file:\\/\\//, \"\");\n      if (url.scheme == \"file\"\n          && this._sources.has(fileUriAbsPath)) {\n        return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n      }\n\n      if ((!url.path || url.path == \"/\")\n          && this._sources.has(\"/\" + relativeSource)) {\n        return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\n      }\n    }\n\n    // This function is used recursively from\n    // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n    // don't want to throw if we can't find the source - we just want to\n    // return null, so we provide a flag to exit gracefully.\n    if (nullOnMissing) {\n      return null;\n    }\n    else {\n      throw new Error('\"' + relativeSource + '\" is not in the SourceMap.');\n    }\n  };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n *   - source: The filename of the original source.\n *   - line: The line number in the original source.  The line number\n *     is 1-based.\n *   - column: The column number in the original source.  The column\n *     number is 0-based.\n *   - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n *     'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n *     closest element that is smaller than or greater than the one we are\n *     searching for, respectively, if the exact element cannot be found.\n *     Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n *   - line: The line number in the generated source, or null.  The\n *     line number is 1-based.\n *   - column: The column number in the generated source, or null.\n *     The column number is 0-based.\n */\nBasicSourceMapConsumer.prototype.generatedPositionFor =\n  function SourceMapConsumer_generatedPositionFor(aArgs) {\n    var source = util.getArg(aArgs, 'source');\n    source = this._findSourceIndex(source);\n    if (source < 0) {\n      return {\n        line: null,\n        column: null,\n        lastColumn: null\n      };\n    }\n\n    var needle = {\n      source: source,\n      originalLine: util.getArg(aArgs, 'line'),\n      originalColumn: util.getArg(aArgs, 'column')\n    };\n\n    var index = this._findMapping(\n      needle,\n      this._originalMappings,\n      \"originalLine\",\n      \"originalColumn\",\n      util.compareByOriginalPositions,\n      util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n    );\n\n    if (index >= 0) {\n      var mapping = this._originalMappings[index];\n\n      if (mapping.source === needle.source) {\n        return {\n          line: util.getArg(mapping, 'generatedLine', null),\n          column: util.getArg(mapping, 'generatedColumn', null),\n          lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n        };\n      }\n    }\n\n    return {\n      line: null,\n      column: null,\n      lastColumn: null\n    };\n  };\n\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n/**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The first parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n *   - version: Which version of the source map spec this map is following.\n *   - file: Optional. The generated file this source map is associated with.\n *   - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n *   - offset: The offset into the original specified at which this section\n *       begins to apply, defined as an object with a \"line\" and \"column\"\n *       field.\n *   - map: A source map definition. This source map could also be indexed,\n *       but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n *  {\n *    version : 3,\n *    file: \"app.js\",\n *    sections: [{\n *      offset: {line:100, column:10},\n *      map: {\n *        version : 3,\n *        file: \"section.js\",\n *        sources: [\"foo.js\", \"bar.js\"],\n *        names: [\"src\", \"maps\", \"are\", \"fun\"],\n *        mappings: \"AAAA,E;;ABCDE;\"\n *      }\n *    }],\n *  }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found.  This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n  var sourceMap = aSourceMap;\n  if (typeof aSourceMap === 'string') {\n    sourceMap = util.parseSourceMapInput(aSourceMap);\n  }\n\n  var version = util.getArg(sourceMap, 'version');\n  var sections = util.getArg(sourceMap, 'sections');\n\n  if (version != this._version) {\n    throw new Error('Unsupported version: ' + version);\n  }\n\n  this._sources = new ArraySet();\n  this._names = new ArraySet();\n\n  var lastOffset = {\n    line: -1,\n    column: 0\n  };\n  this._sections = sections.map(function (s) {\n    if (s.url) {\n      // The url field will require support for asynchronicity.\n      // See https://github.com/mozilla/source-map/issues/16\n      throw new Error('Support for url field in sections not implemented.');\n    }\n    var offset = util.getArg(s, 'offset');\n    var offsetLine = util.getArg(offset, 'line');\n    var offsetColumn = util.getArg(offset, 'column');\n\n    if (offsetLine < lastOffset.line ||\n        (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n      throw new Error('Section offsets must be ordered and non-overlapping.');\n    }\n    lastOffset = offset;\n\n    return {\n      generatedOffset: {\n        // The offset fields are 0-based, but we use 1-based indices when\n        // encoding/decoding from VLQ.\n        generatedLine: offsetLine + 1,\n        generatedColumn: offsetColumn + 1\n      },\n      consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\n    }\n  });\n}\n\nIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nIndexedSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n  get: function () {\n    var sources = [];\n    for (var i = 0; i < this._sections.length; i++) {\n      for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n        sources.push(this._sections[i].consumer.sources[j]);\n      }\n    }\n    return sources;\n  }\n});\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n *   - line: The line number in the generated source.  The line number\n *     is 1-based.\n *   - column: The column number in the generated source.  The column\n *     number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n *   - source: The original source file, or null.\n *   - line: The line number in the original source, or null.  The\n *     line number is 1-based.\n *   - column: The column number in the original source, or null.  The\n *     column number is 0-based.\n *   - name: The original identifier, or null.\n */\nIndexedSourceMapConsumer.prototype.originalPositionFor =\n  function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n    var needle = {\n      generatedLine: util.getArg(aArgs, 'line'),\n      generatedColumn: util.getArg(aArgs, 'column')\n    };\n\n    // Find the section containing the generated position we're trying to map\n    // to an original position.\n    var sectionIndex = binarySearch.search(needle, this._sections,\n      function(needle, section) {\n        var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n        if (cmp) {\n          return cmp;\n        }\n\n        return (needle.generatedColumn -\n                section.generatedOffset.generatedColumn);\n      });\n    var section = this._sections[sectionIndex];\n\n    if (!section) {\n      return {\n        source: null,\n        line: null,\n        column: null,\n        name: null\n      };\n    }\n\n    return section.consumer.originalPositionFor({\n      line: needle.generatedLine -\n        (section.generatedOffset.generatedLine - 1),\n      column: needle.generatedColumn -\n        (section.generatedOffset.generatedLine === needle.generatedLine\n         ? section.generatedOffset.generatedColumn - 1\n         : 0),\n      bias: aArgs.bias\n    });\n  };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n  function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n    return this._sections.every(function (s) {\n      return s.consumer.hasContentsOfAllSources();\n    });\n  };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nIndexedSourceMapConsumer.prototype.sourceContentFor =\n  function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n    for (var i = 0; i < this._sections.length; i++) {\n      var section = this._sections[i];\n\n      var content = section.consumer.sourceContentFor(aSource, true);\n      if (content) {\n        return content;\n      }\n    }\n    if (nullOnMissing) {\n      return null;\n    }\n    else {\n      throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n    }\n  };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n *   - source: The filename of the original source.\n *   - line: The line number in the original source.  The line number\n *     is 1-based.\n *   - column: The column number in the original source.  The column\n *     number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n *   - line: The line number in the generated source, or null.  The\n *     line number is 1-based. \n *   - column: The column number in the generated source, or null.\n *     The column number is 0-based.\n */\nIndexedSourceMapConsumer.prototype.generatedPositionFor =\n  function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n    for (var i = 0; i < this._sections.length; i++) {\n      var section = this._sections[i];\n\n      // Only consider this section if the requested source is in the list of\n      // sources of the consumer.\n      if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\n        continue;\n      }\n      var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n      if (generatedPosition) {\n        var ret = {\n          line: generatedPosition.line +\n            (section.generatedOffset.generatedLine - 1),\n          column: generatedPosition.column +\n            (section.generatedOffset.generatedLine === generatedPosition.line\n             ? section.generatedOffset.generatedColumn - 1\n             : 0)\n        };\n        return ret;\n      }\n    }\n\n    return {\n      line: null,\n      column: null\n    };\n  };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nIndexedSourceMapConsumer.prototype._parseMappings =\n  function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n    this.__generatedMappings = [];\n    this.__originalMappings = [];\n    for (var i = 0; i < this._sections.length; i++) {\n      var section = this._sections[i];\n      var sectionMappings = section.consumer._generatedMappings;\n      for (var j = 0; j < sectionMappings.length; j++) {\n        var mapping = sectionMappings[j];\n\n        var source = section.consumer._sources.at(mapping.source);\n        source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n        this._sources.add(source);\n        source = this._sources.indexOf(source);\n\n        var name = null;\n        if (mapping.name) {\n          name = section.consumer._names.at(mapping.name);\n          this._names.add(name);\n          name = this._names.indexOf(name);\n        }\n\n        // The mappings coming from the consumer for the section have\n        // generated positions relative to the start of the section, so we\n        // need to offset them to be relative to the start of the concatenated\n        // generated file.\n        var adjustedMapping = {\n          source: source,\n          generatedLine: mapping.generatedLine +\n            (section.generatedOffset.generatedLine - 1),\n          generatedColumn: mapping.generatedColumn +\n            (section.generatedOffset.generatedLine === mapping.generatedLine\n            ? section.generatedOffset.generatedColumn - 1\n            : 0),\n          originalLine: mapping.originalLine,\n          originalColumn: mapping.originalColumn,\n          name: name\n        };\n\n        this.__generatedMappings.push(adjustedMapping);\n        if (typeof adjustedMapping.originalLine === 'number') {\n          this.__originalMappings.push(adjustedMapping);\n        }\n      }\n    }\n\n    quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n    quickSort(this.__originalMappings, util.compareByOriginalPositions);\n  };\n\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-consumer.js\n// module id = 7\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nexports.GREATEST_LOWER_BOUND = 1;\nexports.LEAST_UPPER_BOUND = 2;\n\n/**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n *     closest element that is smaller than or greater than the one we are\n *     searching for, respectively, if the exact element cannot be found.\n */\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n  // This function terminates when one of the following is true:\n  //\n  //   1. We find the exact element we are looking for.\n  //\n  //   2. We did not find the exact element, but we can return the index of\n  //      the next-closest element.\n  //\n  //   3. We did not find the exact element, and there is no next-closest\n  //      element than the one we are searching for, so we return -1.\n  var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n  var cmp = aCompare(aNeedle, aHaystack[mid], true);\n  if (cmp === 0) {\n    // Found the element we are looking for.\n    return mid;\n  }\n  else if (cmp > 0) {\n    // Our needle is greater than aHaystack[mid].\n    if (aHigh - mid > 1) {\n      // The element is in the upper half.\n      return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n    }\n\n    // The exact needle element was not found in this haystack. Determine if\n    // we are in termination case (3) or (2) and return the appropriate thing.\n    if (aBias == exports.LEAST_UPPER_BOUND) {\n      return aHigh < aHaystack.length ? aHigh : -1;\n    } else {\n      return mid;\n    }\n  }\n  else {\n    // Our needle is less than aHaystack[mid].\n    if (mid - aLow > 1) {\n      // The element is in the lower half.\n      return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n    }\n\n    // we are in termination case (3) or (2) and return the appropriate thing.\n    if (aBias == exports.LEAST_UPPER_BOUND) {\n      return mid;\n    } else {\n      return aLow < 0 ? -1 : aLow;\n    }\n  }\n}\n\n/**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n *     array and returns -1, 0, or 1 depending on whether the needle is less\n *     than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n *     'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n *     closest element that is smaller than or greater than the one we are\n *     searching for, respectively, if the exact element cannot be found.\n *     Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n  if (aHaystack.length === 0) {\n    return -1;\n  }\n\n  var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n                              aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n  if (index < 0) {\n    return -1;\n  }\n\n  // We have found either the exact element, or the next-closest element than\n  // the one we are searching for. However, there may be more than one such\n  // element. Make sure we always return the smallest of these.\n  while (index - 1 >= 0) {\n    if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n      break;\n    }\n    --index;\n  }\n\n  return index;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/binary-search.js\n// module id = 8\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n// It turns out that some (most?) JavaScript engines don't self-host\n// `Array.prototype.sort`. This makes sense because C++ will likely remain\n// faster than JS when doing raw CPU-intensive sorting. However, when using a\n// custom comparator function, calling back and forth between the VM's C++ and\n// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n// worse generated code for the comparator function than would be optimal. In\n// fact, when sorting with a comparator, these costs outweigh the benefits of\n// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n// a ~3500ms mean speed-up in `bench/bench.html`.\n\n/**\n * Swap the elements indexed by `x` and `y` in the array `ary`.\n *\n * @param {Array} ary\n *        The array.\n * @param {Number} x\n *        The index of the first item.\n * @param {Number} y\n *        The index of the second item.\n */\nfunction swap(ary, x, y) {\n  var temp = ary[x];\n  ary[x] = ary[y];\n  ary[y] = temp;\n}\n\n/**\n * Returns a random integer within the range `low .. high` inclusive.\n *\n * @param {Number} low\n *        The lower bound on the range.\n * @param {Number} high\n *        The upper bound on the range.\n */\nfunction randomIntInRange(low, high) {\n  return Math.round(low + (Math.random() * (high - low)));\n}\n\n/**\n * The Quick Sort algorithm.\n *\n * @param {Array} ary\n *        An array to sort.\n * @param {function} comparator\n *        Function to use to compare two items.\n * @param {Number} p\n *        Start index of the array\n * @param {Number} r\n *        End index of the array\n */\nfunction doQuickSort(ary, comparator, p, r) {\n  // If our lower bound is less than our upper bound, we (1) partition the\n  // array into two pieces and (2) recurse on each half. If it is not, this is\n  // the empty array and our base case.\n\n  if (p < r) {\n    // (1) Partitioning.\n    //\n    // The partitioning chooses a pivot between `p` and `r` and moves all\n    // elements that are less than or equal to the pivot to the before it, and\n    // all the elements that are greater than it after it. The effect is that\n    // once partition is done, the pivot is in the exact place it will be when\n    // the array is put in sorted order, and it will not need to be moved\n    // again. This runs in O(n) time.\n\n    // Always choose a random pivot so that an input array which is reverse\n    // sorted does not cause O(n^2) running time.\n    var pivotIndex = randomIntInRange(p, r);\n    var i = p - 1;\n\n    swap(ary, pivotIndex, r);\n    var pivot = ary[r];\n\n    // Immediately after `j` is incremented in this loop, the following hold\n    // true:\n    //\n    //   * Every element in `ary[p .. i]` is less than or equal to the pivot.\n    //\n    //   * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n    for (var j = p; j < r; j++) {\n      if (comparator(ary[j], pivot) <= 0) {\n        i += 1;\n        swap(ary, i, j);\n      }\n    }\n\n    swap(ary, i + 1, j);\n    var q = i + 1;\n\n    // (2) Recurse on each half.\n\n    doQuickSort(ary, comparator, p, q - 1);\n    doQuickSort(ary, comparator, q + 1, r);\n  }\n}\n\n/**\n * Sort the given array in-place with the given comparator function.\n *\n * @param {Array} ary\n *        An array to sort.\n * @param {function} comparator\n *        Function to use to compare two items.\n */\nexports.quickSort = function (ary, comparator) {\n  doQuickSort(ary, comparator, 0, ary.length - 1);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/quick-sort.js\n// module id = 9\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\nvar util = require('./util');\n\n// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n// operating systems these days (capturing the result).\nvar REGEX_NEWLINE = /(\\r?\\n)/;\n\n// Newline character code for charCodeAt() comparisons\nvar NEWLINE_CODE = 10;\n\n// Private symbol for identifying `SourceNode`s when multiple versions of\n// the source-map library are loaded. This MUST NOT CHANGE across\n// versions!\nvar isSourceNode = \"$$$isSourceNode$$$\";\n\n/**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n *        generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\nfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n  this.children = [];\n  this.sourceContents = {};\n  this.line = aLine == null ? null : aLine;\n  this.column = aColumn == null ? null : aColumn;\n  this.source = aSource == null ? null : aSource;\n  this.name = aName == null ? null : aName;\n  this[isSourceNode] = true;\n  if (aChunks != null) this.add(aChunks);\n}\n\n/**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n *        SourceMapConsumer should be relative to.\n */\nSourceNode.fromStringWithSourceMap =\n  function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n    // The SourceNode we want to fill with the generated code\n    // and the SourceMap\n    var node = new SourceNode();\n\n    // All even indices of this array are one line of the generated code,\n    // while all odd indices are the newlines between two adjacent lines\n    // (since `REGEX_NEWLINE` captures its match).\n    // Processed fragments are accessed by calling `shiftNextLine`.\n    var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n    var remainingLinesIndex = 0;\n    var shiftNextLine = function() {\n      var lineContents = getNextLine();\n      // The last line of a file might not have a newline.\n      var newLine = getNextLine() || \"\";\n      return lineContents + newLine;\n\n      function getNextLine() {\n        return remainingLinesIndex < remainingLines.length ?\n            remainingLines[remainingLinesIndex++] : undefined;\n      }\n    };\n\n    // We need to remember the position of \"remainingLines\"\n    var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n    // The generate SourceNodes we need a code range.\n    // To extract it current and last mapping is used.\n    // Here we store the last mapping.\n    var lastMapping = null;\n\n    aSourceMapConsumer.eachMapping(function (mapping) {\n      if (lastMapping !== null) {\n        // We add the code from \"lastMapping\" to \"mapping\":\n        // First check if there is a new line in between.\n        if (lastGeneratedLine < mapping.generatedLine) {\n          // Associate first line with \"lastMapping\"\n          addMappingWithCode(lastMapping, shiftNextLine());\n          lastGeneratedLine++;\n          lastGeneratedColumn = 0;\n          // The remaining code is added without mapping\n        } else {\n          // There is no new line in between.\n          // Associate the code between \"lastGeneratedColumn\" and\n          // \"mapping.generatedColumn\" with \"lastMapping\"\n          var nextLine = remainingLines[remainingLinesIndex] || '';\n          var code = nextLine.substr(0, mapping.generatedColumn -\n                                        lastGeneratedColumn);\n          remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n                                              lastGeneratedColumn);\n          lastGeneratedColumn = mapping.generatedColumn;\n          addMappingWithCode(lastMapping, code);\n          // No more remaining code, continue\n          lastMapping = mapping;\n          return;\n        }\n      }\n      // We add the generated code until the first mapping\n      // to the SourceNode without any mapping.\n      // Each line is added as separate string.\n      while (lastGeneratedLine < mapping.generatedLine) {\n        node.add(shiftNextLine());\n        lastGeneratedLine++;\n      }\n      if (lastGeneratedColumn < mapping.generatedColumn) {\n        var nextLine = remainingLines[remainingLinesIndex] || '';\n        node.add(nextLine.substr(0, mapping.generatedColumn));\n        remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n        lastGeneratedColumn = mapping.generatedColumn;\n      }\n      lastMapping = mapping;\n    }, this);\n    // We have processed all mappings.\n    if (remainingLinesIndex < remainingLines.length) {\n      if (lastMapping) {\n        // Associate the remaining code in the current line with \"lastMapping\"\n        addMappingWithCode(lastMapping, shiftNextLine());\n      }\n      // and add the remaining lines without any mapping\n      node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n    }\n\n    // Copy sourcesContent into SourceNode\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n      if (content != null) {\n        if (aRelativePath != null) {\n          sourceFile = util.join(aRelativePath, sourceFile);\n        }\n        node.setSourceContent(sourceFile, content);\n      }\n    });\n\n    return node;\n\n    function addMappingWithCode(mapping, code) {\n      if (mapping === null || mapping.source === undefined) {\n        node.add(code);\n      } else {\n        var source = aRelativePath\n          ? util.join(aRelativePath, mapping.source)\n          : mapping.source;\n        node.add(new SourceNode(mapping.originalLine,\n                                mapping.originalColumn,\n                                source,\n                                code,\n                                mapping.name));\n      }\n    }\n  };\n\n/**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n *        SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.add = function SourceNode_add(aChunk) {\n  if (Array.isArray(aChunk)) {\n    aChunk.forEach(function (chunk) {\n      this.add(chunk);\n    }, this);\n  }\n  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n    if (aChunk) {\n      this.children.push(aChunk);\n    }\n  }\n  else {\n    throw new TypeError(\n      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n    );\n  }\n  return this;\n};\n\n/**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n *        SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n  if (Array.isArray(aChunk)) {\n    for (var i = aChunk.length-1; i >= 0; i--) {\n      this.prepend(aChunk[i]);\n    }\n  }\n  else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n    this.children.unshift(aChunk);\n  }\n  else {\n    throw new TypeError(\n      \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n    );\n  }\n  return this;\n};\n\n/**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n  var chunk;\n  for (var i = 0, len = this.children.length; i < len; i++) {\n    chunk = this.children[i];\n    if (chunk[isSourceNode]) {\n      chunk.walk(aFn);\n    }\n    else {\n      if (chunk !== '') {\n        aFn(chunk, { source: this.source,\n                     line: this.line,\n                     column: this.column,\n                     name: this.name });\n      }\n    }\n  }\n};\n\n/**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\nSourceNode.prototype.join = function SourceNode_join(aSep) {\n  var newChildren;\n  var i;\n  var len = this.children.length;\n  if (len > 0) {\n    newChildren = [];\n    for (i = 0; i < len-1; i++) {\n      newChildren.push(this.children[i]);\n      newChildren.push(aSep);\n    }\n    newChildren.push(this.children[i]);\n    this.children = newChildren;\n  }\n  return this;\n};\n\n/**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\nSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n  var lastChild = this.children[this.children.length - 1];\n  if (lastChild[isSourceNode]) {\n    lastChild.replaceRight(aPattern, aReplacement);\n  }\n  else if (typeof lastChild === 'string') {\n    this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n  }\n  else {\n    this.children.push(''.replace(aPattern, aReplacement));\n  }\n  return this;\n};\n\n/**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\nSourceNode.prototype.setSourceContent =\n  function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n    this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n  };\n\n/**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walkSourceContents =\n  function SourceNode_walkSourceContents(aFn) {\n    for (var i = 0, len = this.children.length; i < len; i++) {\n      if (this.children[i][isSourceNode]) {\n        this.children[i].walkSourceContents(aFn);\n      }\n    }\n\n    var sources = Object.keys(this.sourceContents);\n    for (var i = 0, len = sources.length; i < len; i++) {\n      aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n    }\n  };\n\n/**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\nSourceNode.prototype.toString = function SourceNode_toString() {\n  var str = \"\";\n  this.walk(function (chunk) {\n    str += chunk;\n  });\n  return str;\n};\n\n/**\n * Returns the string representation of this source node along with a source\n * map.\n */\nSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n  var generated = {\n    code: \"\",\n    line: 1,\n    column: 0\n  };\n  var map = new SourceMapGenerator(aArgs);\n  var sourceMappingActive = false;\n  var lastOriginalSource = null;\n  var lastOriginalLine = null;\n  var lastOriginalColumn = null;\n  var lastOriginalName = null;\n  this.walk(function (chunk, original) {\n    generated.code += chunk;\n    if (original.source !== null\n        && original.line !== null\n        && original.column !== null) {\n      if(lastOriginalSource !== original.source\n         || lastOriginalLine !== original.line\n         || lastOriginalColumn !== original.column\n         || lastOriginalName !== original.name) {\n        map.addMapping({\n          source: original.source,\n          original: {\n            line: original.line,\n            column: original.column\n          },\n          generated: {\n            line: generated.line,\n            column: generated.column\n          },\n          name: original.name\n        });\n      }\n      lastOriginalSource = original.source;\n      lastOriginalLine = original.line;\n      lastOriginalColumn = original.column;\n      lastOriginalName = original.name;\n      sourceMappingActive = true;\n    } else if (sourceMappingActive) {\n      map.addMapping({\n        generated: {\n          line: generated.line,\n          column: generated.column\n        }\n      });\n      lastOriginalSource = null;\n      sourceMappingActive = false;\n    }\n    for (var idx = 0, length = chunk.length; idx < length; idx++) {\n      if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n        generated.line++;\n        generated.column = 0;\n        // Mappings end at eol\n        if (idx + 1 === length) {\n          lastOriginalSource = null;\n          sourceMappingActive = false;\n        } else if (sourceMappingActive) {\n          map.addMapping({\n            source: original.source,\n            original: {\n              line: original.line,\n              column: original.column\n            },\n            generated: {\n              line: generated.line,\n              column: generated.column\n            },\n            name: original.name\n          });\n        }\n      } else {\n        generated.column++;\n      }\n    }\n  });\n  this.walkSourceContents(function (sourceFile, sourceContent) {\n    map.setSourceContent(sourceFile, sourceContent);\n  });\n\n  return { code: generated.code, map: map };\n};\n\nexports.SourceNode = SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-node.js\n// module id = 10\n// module chunks = 0"],"sourceRoot":""}The MIT License (MIT)

Copyright (c) 2014 Evan Wallace

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
/*
 * Support for source maps in V8 stack traces
 * https://github.com/evanw/node-source-map-support
 */
/*
 The buffer module from node.js, for the browser.

 @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
 license  MIT
*/
(this.define||function(G,J){this.sourceMapSupport=J()})("browser-source-map-support",function(G){(function b(n,x,m){function e(d,a){if(!x[d]){if(!n[d]){var l="function"==typeof require&&require;if(!a&&l)return l(d,!0);if(g)return g(d,!0);throw Error("Cannot find module '"+d+"'");}l=x[d]={exports:{}};n[d][0].call(l.exports,function(a){var b=n[d][1][a];return e(b?b:a)},l,l.exports,b,n,x,m)}return x[d].exports}for(var g="function"==typeof require&&require,h=0;h<m.length;h++)e(m[h]);return e})({1:[function(n,
x,m){G=n("./source-map-support")},{"./source-map-support":21}],2:[function(n,x,m){(function(b){function e(b){b=b.charCodeAt(0);if(43===b)return 62;if(47===b)return 63;if(48>b)return-1;if(58>b)return b-48+52;if(91>b)return b-65;if(123>b)return b-97+26}var g="undefined"!==typeof Uint8Array?Uint8Array:Array;b.toByteArray=function(b){function d(a){r[v++]=a}if(0<b.length%4)throw Error("Invalid string. Length must be a multiple of 4");var a=b.length;var l="="===b.charAt(a-2)?2:"="===b.charAt(a-1)?1:0;var r=
new g(3*b.length/4-l);var q=0<l?b.length-4:b.length;var v=0;for(a=0;a<q;a+=4){var h=e(b.charAt(a))<<18|e(b.charAt(a+1))<<12|e(b.charAt(a+2))<<6|e(b.charAt(a+3));d((h&16711680)>>16);d((h&65280)>>8);d(h&255)}2===l?(h=e(b.charAt(a))<<2|e(b.charAt(a+1))>>4,d(h&255)):1===l&&(h=e(b.charAt(a))<<10|e(b.charAt(a+1))<<4|e(b.charAt(a+2))>>2,d(h>>8&255),d(h&255));return r};b.fromByteArray=function(b){var d=b.length%3,a="",l;var e=0;for(l=b.length-d;e<l;e+=3){var g=(b[e]<<16)+(b[e+1]<<8)+b[e+2];g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>
18&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>12&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>6&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g&63);a+=g}switch(d){case 1:g=b[b.length-1];a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>2);a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g<<4&63);a+="==";break;case 2:g=(b[b.length-2]<<8)+
b[b.length-1],a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>10),a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>4&63),a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g<<2&63),a+="="}return a}})("undefined"===typeof m?this.base64js={}:m)},{}],3:[function(n,x,m){},{}],4:[function(n,x,m){(function(b){var e=Object.prototype.toString,g="function"===typeof b.alloc&&"function"===typeof b.allocUnsafe&&"function"===
typeof b.from;x.exports=function(h,d,a){if("number"===typeof h)throw new TypeError('"value" argument must not be a number');if("ArrayBuffer"===e.call(h).slice(8,-1)){d>>>=0;var l=h.byteLength-d;if(0>l)throw new RangeError("'offset' is out of bounds");if(void 0===a)a=l;else if(a>>>=0,a>l)throw new RangeError("'length' is out of bounds");return g?b.from(h.slice(d,d+a)):new b(new Uint8Array(h.slice(d,d+a)))}if("string"===typeof h){a=d;if("string"!==typeof a||""===a)a="utf8";if(!b.isEncoding(a))throw new TypeError('"encoding" must be a valid string encoding');
return g?b.from(h,a):new b(h,a)}return g?b.from(h):new b(h)}}).call(this,n("buffer").Buffer)},{buffer:5}],5:[function(n,x,m){function b(f,p,a){if(!(this instanceof b))return new b(f,p,a);var c=typeof f;if("number"===c)var d=0<f?f>>>0:0;else if("string"===c){if("base64"===p)for(f=(f.trim?f.trim():f.replace(/^\s+|\s+$/g,"")).replace(H,"");0!==f.length%4;)f+="=";d=b.byteLength(f,p)}else if("object"===c&&null!==f)"Buffer"===f.type&&F(f.data)&&(f=f.data),d=0<+f.length?Math.floor(+f.length):0;else throw new TypeError("must start with number, buffer, array or string");
if(this.length>D)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+D.toString(16)+" bytes");if(b.TYPED_ARRAY_SUPPORT)var k=b._augment(new Uint8Array(d));else k=this,k.length=d,k._isBuffer=!0;if(b.TYPED_ARRAY_SUPPORT&&"number"===typeof f.byteLength)k._set(f);else{var C=f;if(F(C)||b.isBuffer(C)||C&&"object"===typeof C&&"number"===typeof C.length)if(b.isBuffer(f))for(p=0;p<d;p++)k[p]=f.readUInt8(p);else for(p=0;p<d;p++)k[p]=(f[p]%256+256)%256;else if("string"===c)k.write(f,
0,p);else if("number"===c&&!b.TYPED_ARRAY_SUPPORT&&!a)for(p=0;p<d;p++)k[p]=0}return k}function e(f,p,b){var a="";for(b=Math.min(f.length,b);p<b;p++)a+=String.fromCharCode(f[p]);return a}function g(f,p,b){if(0!==f%1||0>f)throw new RangeError("offset is not uint");if(f+p>b)throw new RangeError("Trying to access beyond buffer length");}function h(f,p,a,c,d,k){if(!b.isBuffer(f))throw new TypeError("buffer must be a Buffer instance");if(p>d||p<k)throw new TypeError("value is out of bounds");if(a+c>f.length)throw new TypeError("index out of range");
}function d(f,p,b,a){0>p&&(p=65535+p+1);for(var c=0,d=Math.min(f.length-b,2);c<d;c++)f[b+c]=(p&255<<8*(a?c:1-c))>>>8*(a?c:1-c)}function a(f,p,b,a){0>p&&(p=4294967295+p+1);for(var c=0,d=Math.min(f.length-b,4);c<d;c++)f[b+c]=p>>>8*(a?c:3-c)&255}function l(f,p,b,a,c,d){if(p>c||p<d)throw new TypeError("value is out of bounds");if(b+a>f.length)throw new TypeError("index out of range");}function r(f,p,b,a,c){c||l(f,p,b,4,3.4028234663852886E38,-3.4028234663852886E38);y.write(f,p,b,a,23,4);return b+4}function q(f,
p,b,a,c){c||l(f,p,b,8,1.7976931348623157E308,-1.7976931348623157E308);y.write(f,p,b,a,52,8);return b+8}function v(f){for(var p=[],b=0;b<f.length;b++){var a=f.charCodeAt(b);if(127>=a)p.push(a);else{var c=b;55296<=a&&57343>=a&&b++;a=encodeURIComponent(f.slice(c,b+1)).substr(1).split("%");for(c=0;c<a.length;c++)p.push(parseInt(a[c],16))}}return p}function u(f){for(var b=[],a=0;a<f.length;a++)b.push(f.charCodeAt(a)&255);return b}function c(f,b,a,c,d){d&&(c-=c%d);for(d=0;d<c&&!(d+a>=b.length||d>=f.length);d++)b[d+
a]=f[d];return d}function k(f){try{return decodeURIComponent(f)}catch(p){return String.fromCharCode(65533)}}var w=n("base64-js"),y=n("ieee754"),F=n("is-array");m.Buffer=b;m.SlowBuffer=b;m.INSPECT_MAX_BYTES=50;b.poolSize=8192;var D=1073741823;b.TYPED_ARRAY_SUPPORT=function(){try{var f=new ArrayBuffer(0),b=new Uint8Array(f);b.foo=function(){return 42};return 42===b.foo()&&"function"===typeof b.subarray&&0===(new Uint8Array(1)).subarray(1,1).byteLength}catch(C){return!1}}();b.isBuffer=function(f){return!(null==
f||!f._isBuffer)};b.compare=function(f,a){if(!b.isBuffer(f)||!b.isBuffer(a))throw new TypeError("Arguments must be Buffers");for(var c=f.length,p=a.length,d=0,k=Math.min(c,p);d<k&&f[d]===a[d];d++);d!==k&&(c=f[d],p=a[d]);return c<p?-1:p<c?1:0};b.isEncoding=function(f){switch(String(f).toLowerCase()){case "hex":case "utf8":case "utf-8":case "ascii":case "binary":case "base64":case "raw":case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return!0;default:return!1}};b.concat=function(f,a){if(!F(f))throw new TypeError("Usage: Buffer.concat(list[, length])");
if(0===f.length)return new b(0);if(1===f.length)return f[0];var c;if(void 0===a)for(c=a=0;c<f.length;c++)a+=f[c].length;var p=new b(a),d=0;for(c=0;c<f.length;c++){var k=f[c];k.copy(p,d);d+=k.length}return p};b.byteLength=function(f,a){f+="";switch(a||"utf8"){case "ascii":case "binary":case "raw":var b=f.length;break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b=2*f.length;break;case "hex":b=f.length>>>1;break;case "utf8":case "utf-8":b=v(f).length;break;case "base64":b=w.toByteArray(f).length;
break;default:b=f.length}return b};b.prototype.length=void 0;b.prototype.parent=void 0;b.prototype.toString=function(f,b,a){var c=!1;b>>>=0;a=void 0===a||Infinity===a?this.length:a>>>0;f||(f="utf8");0>b&&(b=0);a>this.length&&(a=this.length);if(a<=b)return"";for(;;)switch(f){case "hex":f=b;b=a;a=this.length;if(!f||0>f)f=0;if(!b||0>b||b>a)b=a;c="";for(a=f;a<b;a++)f=c,c=this[a],c=16>c?"0"+c.toString(16):c.toString(16),c=f+c;return c;case "utf8":case "utf-8":c=f="";for(a=Math.min(this.length,a);b<a;b++)127>=
this[b]?(f+=k(c)+String.fromCharCode(this[b]),c=""):c+="%"+this[b].toString(16);return f+k(c);case "ascii":return e(this,b,a);case "binary":return e(this,b,a);case "base64":return b=0===b&&a===this.length?w.fromByteArray(this):w.fromByteArray(this.slice(b,a)),b;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b=this.slice(b,a);a="";for(f=0;f<b.length;f+=2)a+=String.fromCharCode(b[f]+256*b[f+1]);return a;default:if(c)throw new TypeError("Unknown encoding: "+f);f=(f+"").toLowerCase();c=!0}};
b.prototype.equals=function(f){if(!b.isBuffer(f))throw new TypeError("Argument must be a Buffer");return 0===b.compare(this,f)};b.prototype.inspect=function(){var f="",b=m.INSPECT_MAX_BYTES;0<this.length&&(f=this.toString("hex",0,b).match(/.{2}/g).join(" "),this.length>b&&(f+=" ... "));return"<Buffer "+f+">"};b.prototype.compare=function(f){if(!b.isBuffer(f))throw new TypeError("Argument must be a Buffer");return b.compare(this,f)};b.prototype.get=function(f){console.log(".get() is deprecated. Access using array indexes instead.");
return this.readUInt8(f)};b.prototype.set=function(f,b){console.log(".set() is deprecated. Access using array indexes instead.");return this.writeUInt8(f,b)};b.prototype.write=function(f,b,a,d){if(isFinite(b))isFinite(a)||(d=a,a=void 0);else{var p=d;d=b;b=a;a=p}b=Number(b)||0;p=this.length-b;a?(a=Number(a),a>p&&(a=p)):a=p;d=String(d||"utf8").toLowerCase();switch(d){case "hex":b=Number(b)||0;d=this.length-b;a?(a=Number(a),a>d&&(a=d)):a=d;d=f.length;if(0!==d%2)throw Error("Invalid hex string");a>d/
2&&(a=d/2);for(d=0;d<a;d++){p=parseInt(f.substr(2*d,2),16);if(isNaN(p))throw Error("Invalid hex string");this[b+d]=p}f=d;break;case "utf8":case "utf-8":f=c(v(f),this,b,a);break;case "ascii":f=c(u(f),this,b,a);break;case "binary":f=c(u(f),this,b,a);break;case "base64":f=c(w.toByteArray(f),this,b,a);break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":p=[];for(var k=0;k<f.length;k++){var l=f.charCodeAt(k);d=l>>8;l%=256;p.push(l);p.push(d)}f=c(p,this,b,a,2);break;default:throw new TypeError("Unknown encoding: "+
d);}return f};b.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};b.prototype.slice=function(f,a){var c=this.length;f=~~f;a=void 0===a?c:~~a;0>f?(f+=c,0>f&&(f=0)):f>c&&(f=c);0>a?(a+=c,0>a&&(a=0)):a>c&&(a=c);a<f&&(a=f);if(b.TYPED_ARRAY_SUPPORT)return b._augment(this.subarray(f,a));c=a-f;for(var d=new b(c,void 0,!0),p=0;p<c;p++)d[p]=this[p+f];return d};b.prototype.readUInt8=function(f,a){a||g(f,1,this.length);return this[f]};b.prototype.readUInt16LE=
function(f,a){a||g(f,2,this.length);return this[f]|this[f+1]<<8};b.prototype.readUInt16BE=function(f,a){a||g(f,2,this.length);return this[f]<<8|this[f+1]};b.prototype.readUInt32LE=function(f,a){a||g(f,4,this.length);return(this[f]|this[f+1]<<8|this[f+2]<<16)+16777216*this[f+3]};b.prototype.readUInt32BE=function(f,a){a||g(f,4,this.length);return 16777216*this[f]+(this[f+1]<<16|this[f+2]<<8|this[f+3])};b.prototype.readInt8=function(f,a){a||g(f,1,this.length);return this[f]&128?-1*(255-this[f]+1):this[f]};
b.prototype.readInt16LE=function(f,a){a||g(f,2,this.length);var b=this[f]|this[f+1]<<8;return b&32768?b|4294901760:b};b.prototype.readInt16BE=function(f,a){a||g(f,2,this.length);var b=this[f+1]|this[f]<<8;return b&32768?b|4294901760:b};b.prototype.readInt32LE=function(f,a){a||g(f,4,this.length);return this[f]|this[f+1]<<8|this[f+2]<<16|this[f+3]<<24};b.prototype.readInt32BE=function(a,b){b||g(a,4,this.length);return this[a]<<24|this[a+1]<<16|this[a+2]<<8|this[a+3]};b.prototype.readFloatLE=function(a,
b){b||g(a,4,this.length);return y.read(this,a,!0,23,4)};b.prototype.readFloatBE=function(a,b){b||g(a,4,this.length);return y.read(this,a,!1,23,4)};b.prototype.readDoubleLE=function(a,b){b||g(a,8,this.length);return y.read(this,a,!0,52,8)};b.prototype.readDoubleBE=function(a,b){b||g(a,8,this.length);return y.read(this,a,!1,52,8)};b.prototype.writeUInt8=function(a,c,d){a=+a;c>>>=0;d||h(this,a,c,1,255,0);b.TYPED_ARRAY_SUPPORT||(a=Math.floor(a));this[c]=a;return c+1};b.prototype.writeUInt16LE=function(a,
c,k){a=+a;c>>>=0;k||h(this,a,c,2,65535,0);b.TYPED_ARRAY_SUPPORT?(this[c]=a,this[c+1]=a>>>8):d(this,a,c,!0);return c+2};b.prototype.writeUInt16BE=function(a,c,k){a=+a;c>>>=0;k||h(this,a,c,2,65535,0);b.TYPED_ARRAY_SUPPORT?(this[c]=a>>>8,this[c+1]=a):d(this,a,c,!1);return c+2};b.prototype.writeUInt32LE=function(f,c,d){f=+f;c>>>=0;d||h(this,f,c,4,4294967295,0);b.TYPED_ARRAY_SUPPORT?(this[c+3]=f>>>24,this[c+2]=f>>>16,this[c+1]=f>>>8,this[c]=f):a(this,f,c,!0);return c+4};b.prototype.writeUInt32BE=function(f,
c,d){f=+f;c>>>=0;d||h(this,f,c,4,4294967295,0);b.TYPED_ARRAY_SUPPORT?(this[c]=f>>>24,this[c+1]=f>>>16,this[c+2]=f>>>8,this[c+3]=f):a(this,f,c,!1);return c+4};b.prototype.writeInt8=function(a,c,d){a=+a;c>>>=0;d||h(this,a,c,1,127,-128);b.TYPED_ARRAY_SUPPORT||(a=Math.floor(a));0>a&&(a=255+a+1);this[c]=a;return c+1};b.prototype.writeInt16LE=function(a,c,k){a=+a;c>>>=0;k||h(this,a,c,2,32767,-32768);b.TYPED_ARRAY_SUPPORT?(this[c]=a,this[c+1]=a>>>8):d(this,a,c,!0);return c+2};b.prototype.writeInt16BE=function(a,
c,k){a=+a;c>>>=0;k||h(this,a,c,2,32767,-32768);b.TYPED_ARRAY_SUPPORT?(this[c]=a>>>8,this[c+1]=a):d(this,a,c,!1);return c+2};b.prototype.writeInt32LE=function(c,d,k){c=+c;d>>>=0;k||h(this,c,d,4,2147483647,-2147483648);b.TYPED_ARRAY_SUPPORT?(this[d]=c,this[d+1]=c>>>8,this[d+2]=c>>>16,this[d+3]=c>>>24):a(this,c,d,!0);return d+4};b.prototype.writeInt32BE=function(c,d,k){c=+c;d>>>=0;k||h(this,c,d,4,2147483647,-2147483648);0>c&&(c=4294967295+c+1);b.TYPED_ARRAY_SUPPORT?(this[d]=c>>>24,this[d+1]=c>>>16,this[d+
2]=c>>>8,this[d+3]=c):a(this,c,d,!1);return d+4};b.prototype.writeFloatLE=function(a,c,b){return r(this,a,c,!0,b)};b.prototype.writeFloatBE=function(a,c,b){return r(this,a,c,!1,b)};b.prototype.writeDoubleLE=function(a,c,b){return q(this,a,c,!0,b)};b.prototype.writeDoubleBE=function(a,c,b){return q(this,a,c,!1,b)};b.prototype.copy=function(a,c,d,k){d||(d=0);k||0===k||(k=this.length);c||(c=0);if(k!==d&&0!==a.length&&0!==this.length){if(k<d)throw new TypeError("sourceEnd < sourceStart");if(0>c||c>=a.length)throw new TypeError("targetStart out of bounds");
if(0>d||d>=this.length)throw new TypeError("sourceStart out of bounds");if(0>k||k>this.length)throw new TypeError("sourceEnd out of bounds");k>this.length&&(k=this.length);a.length-c<k-d&&(k=a.length-c+d);k-=d;if(1E3>k||!b.TYPED_ARRAY_SUPPORT)for(var f=0;f<k;f++)a[f+c]=this[f+d];else a._set(this.subarray(d,d+k),c)}};b.prototype.fill=function(a,c,b){a||(a=0);c||(c=0);b||(b=this.length);if(b<c)throw new TypeError("end < start");if(b!==c&&0!==this.length){if(0>c||c>=this.length)throw new TypeError("start out of bounds");
if(0>b||b>this.length)throw new TypeError("end out of bounds");if("number"===typeof a)for(;c<b;c++)this[c]=a;else{a=v(a.toString());for(var d=a.length;c<b;c++)this[c]=a[c%d]}return this}};b.prototype.toArrayBuffer=function(){if("undefined"!==typeof Uint8Array){if(b.TYPED_ARRAY_SUPPORT)return(new b(this)).buffer;for(var a=new Uint8Array(this.length),c=0,d=a.length;c<d;c+=1)a[c]=this[c];return a.buffer}throw new TypeError("Buffer.toArrayBuffer not supported in this browser");};var t=b.prototype;b._augment=
function(a){a.constructor=b;a._isBuffer=!0;a._get=a.get;a._set=a.set;a.get=t.get;a.set=t.set;a.write=t.write;a.toString=t.toString;a.toLocaleString=t.toString;a.toJSON=t.toJSON;a.equals=t.equals;a.compare=t.compare;a.copy=t.copy;a.slice=t.slice;a.readUInt8=t.readUInt8;a.readUInt16LE=t.readUInt16LE;a.readUInt16BE=t.readUInt16BE;a.readUInt32LE=t.readUInt32LE;a.readUInt32BE=t.readUInt32BE;a.readInt8=t.readInt8;a.readInt16LE=t.readInt16LE;a.readInt16BE=t.readInt16BE;a.readInt32LE=t.readInt32LE;a.readInt32BE=
t.readInt32BE;a.readFloatLE=t.readFloatLE;a.readFloatBE=t.readFloatBE;a.readDoubleLE=t.readDoubleLE;a.readDoubleBE=t.readDoubleBE;a.writeUInt8=t.writeUInt8;a.writeUInt16LE=t.writeUInt16LE;a.writeUInt16BE=t.writeUInt16BE;a.writeUInt32LE=t.writeUInt32LE;a.writeUInt32BE=t.writeUInt32BE;a.writeInt8=t.writeInt8;a.writeInt16LE=t.writeInt16LE;a.writeInt16BE=t.writeInt16BE;a.writeInt32LE=t.writeInt32LE;a.writeInt32BE=t.writeInt32BE;a.writeFloatLE=t.writeFloatLE;a.writeFloatBE=t.writeFloatBE;a.writeDoubleLE=
t.writeDoubleLE;a.writeDoubleBE=t.writeDoubleBE;a.fill=t.fill;a.inspect=t.inspect;a.toArrayBuffer=t.toArrayBuffer;return a};var H=/[^+\/0-9A-z]/g},{"base64-js":2,ieee754:6,"is-array":7}],6:[function(n,x,m){m.read=function(b,e,g,h,d){var a=8*d-h-1;var l=(1<<a)-1,r=l>>1,q=-7;d=g?d-1:0;var v=g?-1:1,u=b[e+d];d+=v;g=u&(1<<-q)-1;u>>=-q;for(q+=a;0<q;g=256*g+b[e+d],d+=v,q-=8);a=g&(1<<-q)-1;g>>=-q;for(q+=h;0<q;a=256*a+b[e+d],d+=v,q-=8);if(0===g)g=1-r;else{if(g===l)return a?NaN:Infinity*(u?-1:1);a+=Math.pow(2,
h);g-=r}return(u?-1:1)*a*Math.pow(2,g-h)};m.write=function(b,e,g,h,d,a){var l,r=8*a-d-1,q=(1<<r)-1,v=q>>1,u=23===d?Math.pow(2,-24)-Math.pow(2,-77):0;a=h?0:a-1;var c=h?1:-1,k=0>e||0===e&&0>1/e?1:0;e=Math.abs(e);isNaN(e)||Infinity===e?(e=isNaN(e)?1:0,h=q):(h=Math.floor(Math.log(e)/Math.LN2),1>e*(l=Math.pow(2,-h))&&(h--,l*=2),e=1<=h+v?e+u/l:e+u*Math.pow(2,1-v),2<=e*l&&(h++,l/=2),h+v>=q?(e=0,h=q):1<=h+v?(e=(e*l-1)*Math.pow(2,d),h+=v):(e=e*Math.pow(2,v-1)*Math.pow(2,d),h=0));for(;8<=d;b[g+a]=e&255,a+=
c,e/=256,d-=8);h=h<<d|e;for(r+=d;0<r;b[g+a]=h&255,a+=c,h/=256,r-=8);b[g+a-c]|=128*k}},{}],7:[function(n,x,m){var b=Object.prototype.toString;x.exports=Array.isArray||function(e){return!!e&&"[object Array]"==b.call(e)}},{}],8:[function(n,x,m){(function(b){function e(a,b){for(var d=0,l=a.length-1;0<=l;l--){var v=a[l];"."===v?a.splice(l,1):".."===v?(a.splice(l,1),d++):d&&(a.splice(l,1),d--)}if(b)for(;d--;d)a.unshift("..");return a}function g(a,b){if(a.filter)return a.filter(b);for(var d=[],l=0;l<a.length;l++)b(a[l],
l,a)&&d.push(a[l]);return d}var h=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;m.resolve=function(){for(var a="",d=!1,h=arguments.length-1;-1<=h&&!d;h--){var q=0<=h?arguments[h]:b.cwd();if("string"!==typeof q)throw new TypeError("Arguments to path.resolve must be strings");q&&(a=q+"/"+a,d="/"===q.charAt(0))}a=e(g(a.split("/"),function(a){return!!a}),!d).join("/");return(d?"/":"")+a||"."};m.normalize=function(a){var b=m.isAbsolute(a),h="/"===d(a,-1);(a=e(g(a.split("/"),function(a){return!!a}),
!b).join("/"))||b||(a=".");a&&h&&(a+="/");return(b?"/":"")+a};m.isAbsolute=function(a){return"/"===a.charAt(0)};m.join=function(){var a=Array.prototype.slice.call(arguments,0);return m.normalize(g(a,function(a,b){if("string"!==typeof a)throw new TypeError("Arguments to path.join must be strings");return a}).join("/"))};m.relative=function(a,b){function d(a){for(var c=0;c<a.length&&""===a[c];c++);for(var b=a.length-1;0<=b&&""===a[b];b--);return c>b?[]:a.slice(c,b-c+1)}a=m.resolve(a).substr(1);b=m.resolve(b).substr(1);
for(var l=d(a.split("/")),v=d(b.split("/")),e=Math.min(l.length,v.length),c=e,k=0;k<e;k++)if(l[k]!==v[k]){c=k;break}e=[];for(k=c;k<l.length;k++)e.push("..");e=e.concat(v.slice(c));return e.join("/")};m.sep="/";m.delimiter=":";m.dirname=function(a){var b=h.exec(a).slice(1);a=b[0];b=b[1];if(!a&&!b)return".";b&&(b=b.substr(0,b.length-1));return a+b};m.basename=function(a,b){var d=h.exec(a).slice(1)[2];b&&d.substr(-1*b.length)===b&&(d=d.substr(0,d.length-b.length));return d};m.extname=function(a){return h.exec(a).slice(1)[3]};
var d="b"==="ab".substr(-1)?function(a,b,d){return a.substr(b,d)}:function(a,b,d){0>b&&(b=a.length+b);return a.substr(b,d)}}).call(this,n("g5I+bs"))},{"g5I+bs":9}],9:[function(n,x,m){function b(){}n=x.exports={};n.nextTick=function(){if("undefined"!==typeof window&&window.setImmediate)return function(b){return window.setImmediate(b)};if("undefined"!==typeof window&&window.postMessage&&window.addEventListener){var b=[];window.addEventListener("message",function(e){var g=e.source;g!==window&&null!==
g||"process-tick"!==e.data||(e.stopPropagation(),0<b.length&&b.shift()())},!0);return function(e){b.push(e);window.postMessage("process-tick","*")}}return function(b){setTimeout(b,0)}}();n.title="browser";n.browser=!0;n.env={};n.argv=[];n.on=b;n.addListener=b;n.once=b;n.off=b;n.removeListener=b;n.removeAllListeners=b;n.emit=b;n.binding=function(b){throw Error("process.binding is not supported");};n.cwd=function(){return"/"};n.chdir=function(b){throw Error("process.chdir is not supported");}},{}],
10:[function(n,x,m){function b(){this._array=[];this._set=h?new Map:Object.create(null)}var e=n("./util"),g=Object.prototype.hasOwnProperty,h="undefined"!==typeof Map;b.fromArray=function(d,a){for(var e=new b,g=0,h=d.length;g<h;g++)e.add(d[g],a);return e};b.prototype.size=function(){return h?this._set.size:Object.getOwnPropertyNames(this._set).length};b.prototype.add=function(b,a){var d=h?b:e.toSetString(b),r=h?this.has(b):g.call(this._set,d),q=this._array.length;r&&!a||this._array.push(b);r||(h?
this._set.set(b,q):this._set[d]=q)};b.prototype.has=function(b){if(h)return this._set.has(b);b=e.toSetString(b);return g.call(this._set,b)};b.prototype.indexOf=function(b){if(h){var a=this._set.get(b);if(0<=a)return a}else if(a=e.toSetString(b),g.call(this._set,a))return this._set[a];throw Error('"'+b+'" is not in the set.');};b.prototype.at=function(b){if(0<=b&&b<this._array.length)return this._array[b];throw Error("No element indexed by "+b);};b.prototype.toArray=function(){return this._array.slice()};
m.ArraySet=b},{"./util":19}],11:[function(n,x,m){var b=n("./base64");m.encode=function(e){var g="",h=0>e?(-e<<1)+1:e<<1;do e=h&31,h>>>=5,0<h&&(e|=32),g+=b.encode(e);while(0<h);return g};m.decode=function(e,g,h){var d=e.length,a=0,l=0;do{if(g>=d)throw Error("Expected more digits in base 64 VLQ value.");var r=b.decode(e.charCodeAt(g++));if(-1===r)throw Error("Invalid base64 digit: "+e.charAt(g-1));var q=!!(r&32);r&=31;a+=r<<l;l+=5}while(q);e=a>>1;h.value=1===(a&1)?-e:e;h.rest=g}},{"./base64":12}],12:[function(n,
x,m){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");m.encode=function(e){if(0<=e&&e<b.length)return b[e];throw new TypeError("Must be between 0 and 63: "+e);};m.decode=function(b){return 65<=b&&90>=b?b-65:97<=b&&122>=b?b-97+26:48<=b&&57>=b?b-48+52:43==b?62:47==b?63:-1}},{}],13:[function(n,x,m){function b(e,g,h,d,a,l){var r=Math.floor((g-e)/2)+e,q=a(h,d[r],!0);return 0===q?r:0<q?1<g-r?b(r,g,h,d,a,l):l==m.LEAST_UPPER_BOUND?g<d.length?g:-1:r:1<r-e?b(e,r,h,d,a,l):l==
m.LEAST_UPPER_BOUND?r:0>e?-1:e}m.GREATEST_LOWER_BOUND=1;m.LEAST_UPPER_BOUND=2;m.search=function(e,g,h,d){if(0===g.length)return-1;e=b(-1,g.length,e,g,h,d||m.GREATEST_LOWER_BOUND);if(0>e)return-1;for(;0<=e-1&&0===h(g[e],g[e-1],!0);)--e;return e}},{}],14:[function(n,x,m){function b(){this._array=[];this._sorted=!0;this._last={generatedLine:-1,generatedColumn:0}}var e=n("./util");b.prototype.unsortedForEach=function(b,e){this._array.forEach(b,e)};b.prototype.add=function(b){var g=this._last,d=g.generatedLine,
a=b.generatedLine,l=g.generatedColumn,r=b.generatedColumn;a>d||a==d&&r>=l||0>=e.compareByGeneratedPositionsInflated(g,b)?this._last=b:this._sorted=!1;this._array.push(b)};b.prototype.toArray=function(){this._sorted||(this._array.sort(e.compareByGeneratedPositionsInflated),this._sorted=!0);return this._array};m.MappingList=b},{"./util":19}],15:[function(n,x,m){function b(b,e,d){var a=b[e];b[e]=b[d];b[d]=a}function e(g,h,d,a){if(d<a){var l=d-1;b(g,Math.round(d+Math.random()*(a-d)),a);for(var r=g[a],
q=d;q<a;q++)0>=h(g[q],r)&&(l+=1,b(g,l,q));b(g,l+1,q);l+=1;e(g,h,d,l-1);e(g,h,l+1,a)}}m.quickSort=function(b,h){e(b,h,0,b.length-1)}},{}],16:[function(n,x,m){function b(a,b){var c=a;"string"===typeof a&&(c=d.parseSourceMapInput(a));return null!=c.sections?new h(c,b):new e(c,b)}function e(a,b){var c=a;"string"===typeof a&&(c=d.parseSourceMapInput(a));var k=d.getArg(c,"version"),e=d.getArg(c,"sources"),v=d.getArg(c,"names",[]),g=d.getArg(c,"sourceRoot",null),h=d.getArg(c,"sourcesContent",null),q=d.getArg(c,
"mappings");c=d.getArg(c,"file",null);if(k!=this._version)throw Error("Unsupported version: "+k);g&&(g=d.normalize(g));e=e.map(String).map(d.normalize).map(function(a){return g&&d.isAbsolute(g)&&d.isAbsolute(a)?d.relative(g,a):a});this._names=l.fromArray(v.map(String),!0);this._sources=l.fromArray(e,!0);this.sourceRoot=g;this.sourcesContent=h;this._mappings=q;this._sourceMapURL=b;this.file=c}function g(){this.generatedColumn=this.generatedLine=0;this.name=this.originalColumn=this.originalLine=this.source=
null}function h(a,e){var c=a;"string"===typeof a&&(c=d.parseSourceMapInput(a));var k=d.getArg(c,"version");c=d.getArg(c,"sections");if(k!=this._version)throw Error("Unsupported version: "+k);this._sources=new l;this._names=new l;var v={line:-1,column:0};this._sections=c.map(function(a){if(a.url)throw Error("Support for url field in sections not implemented.");var c=d.getArg(a,"offset"),k=d.getArg(c,"line"),g=d.getArg(c,"column");if(k<v.line||k===v.line&&g<v.column)throw Error("Section offsets must be ordered and non-overlapping.");
v=c;return{generatedOffset:{generatedLine:k+1,generatedColumn:g+1},consumer:new b(d.getArg(a,"map"),e)}})}var d=n("./util"),a=n("./binary-search"),l=n("./array-set").ArraySet,r=n("./base64-vlq"),q=n("./quick-sort").quickSort;b.fromSourceMap=function(a){return e.fromSourceMap(a)};b.prototype._version=3;b.prototype.__generatedMappings=null;Object.defineProperty(b.prototype,"_generatedMappings",{configurable:!0,enumerable:!0,get:function(){this.__generatedMappings||this._parseMappings(this._mappings,
this.sourceRoot);return this.__generatedMappings}});b.prototype.__originalMappings=null;Object.defineProperty(b.prototype,"_originalMappings",{configurable:!0,enumerable:!0,get:function(){this.__originalMappings||this._parseMappings(this._mappings,this.sourceRoot);return this.__originalMappings}});b.prototype._charIsMappingSeparator=function(a,b){var c=a.charAt(b);return";"===c||","===c};b.prototype._parseMappings=function(a,b){throw Error("Subclasses must implement _parseMappings");};b.GENERATED_ORDER=
1;b.ORIGINAL_ORDER=2;b.GREATEST_LOWER_BOUND=1;b.LEAST_UPPER_BOUND=2;b.prototype.eachMapping=function(a,e,c){e=e||null;switch(c||b.GENERATED_ORDER){case b.GENERATED_ORDER:c=this._generatedMappings;break;case b.ORIGINAL_ORDER:c=this._originalMappings;break;default:throw Error("Unknown order of iteration.");}var k=this.sourceRoot;c.map(function(a){var b=null===a.source?null:this._sources.at(a.source);b=d.computeSourceURL(k,b,this._sourceMapURL);return{source:b,generatedLine:a.generatedLine,generatedColumn:a.generatedColumn,
originalLine:a.originalLine,originalColumn:a.originalColumn,name:null===a.name?null:this._names.at(a.name)}},this).forEach(a,e)};b.prototype.allGeneratedPositionsFor=function(b){var e=d.getArg(b,"line"),c={source:d.getArg(b,"source"),originalLine:e,originalColumn:d.getArg(b,"column",0)};null!=this.sourceRoot&&(c.source=d.relative(this.sourceRoot,c.source));if(!this._sources.has(c.source))return[];c.source=this._sources.indexOf(c.source);var k=[];c=this._findMapping(c,this._originalMappings,"originalLine",
"originalColumn",d.compareByOriginalPositions,a.LEAST_UPPER_BOUND);if(0<=c){var g=this._originalMappings[c];if(void 0===b.column)for(e=g.originalLine;g&&g.originalLine===e;)k.push({line:d.getArg(g,"generatedLine",null),column:d.getArg(g,"generatedColumn",null),lastColumn:d.getArg(g,"lastGeneratedColumn",null)}),g=this._originalMappings[++c];else for(b=g.originalColumn;g&&g.originalLine===e&&g.originalColumn==b;)k.push({line:d.getArg(g,"generatedLine",null),column:d.getArg(g,"generatedColumn",null),
lastColumn:d.getArg(g,"lastGeneratedColumn",null)}),g=this._originalMappings[++c]}return k};m.SourceMapConsumer=b;e.prototype=Object.create(b.prototype);e.prototype.consumer=b;e.fromSourceMap=function(a,b){var c=Object.create(e.prototype),k=c._names=l.fromArray(a._names.toArray(),!0),v=c._sources=l.fromArray(a._sources.toArray(),!0);c.sourceRoot=a._sourceRoot;c.sourcesContent=a._generateSourcesContent(c._sources.toArray(),c.sourceRoot);c.file=a._file;c._sourceMapURL=b;for(var h=a._mappings.toArray().slice(),
r=c.__generatedMappings=[],m=c.__originalMappings=[],u=0,n=h.length;u<n;u++){var f=h[u],p=new g;p.generatedLine=f.generatedLine;p.generatedColumn=f.generatedColumn;f.source&&(p.source=v.indexOf(f.source),p.originalLine=f.originalLine,p.originalColumn=f.originalColumn,f.name&&(p.name=k.indexOf(f.name)),m.push(p));r.push(p)}q(c.__originalMappings,d.compareByOriginalPositions);return c};e.prototype._version=3;Object.defineProperty(e.prototype,"sources",{get:function(){return this._sources.toArray().map(function(a){return d.computeSourceURL(this.sourceRoot,
a,this._sourceMapURL)},this)}});e.prototype._parseMappings=function(a,b){for(var c=1,k=0,e=0,l=0,v=0,h=0,m=a.length,u=0,f={},p={},n=[],x=[],z,B,A,E,I;u<m;)if(";"===a.charAt(u))c++,u++,k=0;else if(","===a.charAt(u))u++;else{z=new g;z.generatedLine=c;for(E=u;E<m&&!this._charIsMappingSeparator(a,E);E++);B=a.slice(u,E);if(A=f[B])u+=B.length;else{for(A=[];u<E;)r.decode(a,u,p),I=p.value,u=p.rest,A.push(I);if(2===A.length)throw Error("Found a source, but no line and column");if(3===A.length)throw Error("Found a source and line, but no column");
f[B]=A}z.generatedColumn=k+A[0];k=z.generatedColumn;1<A.length&&(z.source=v+A[1],v+=A[1],z.originalLine=e+A[2],e=z.originalLine,z.originalLine+=1,z.originalColumn=l+A[3],l=z.originalColumn,4<A.length&&(z.name=h+A[4],h+=A[4]));x.push(z);"number"===typeof z.originalLine&&n.push(z)}q(x,d.compareByGeneratedPositionsDeflated);this.__generatedMappings=x;q(n,d.compareByOriginalPositions);this.__originalMappings=n};e.prototype._findMapping=function(b,d,c,k,e,g){if(0>=b[c])throw new TypeError("Line must be greater than or equal to 1, got "+
b[c]);if(0>b[k])throw new TypeError("Column must be greater than or equal to 0, got "+b[k]);return a.search(b,d,e,g)};e.prototype.computeColumnSpans=function(){for(var a=0;a<this._generatedMappings.length;++a){var b=this._generatedMappings[a];if(a+1<this._generatedMappings.length){var c=this._generatedMappings[a+1];if(b.generatedLine===c.generatedLine){b.lastGeneratedColumn=c.generatedColumn-1;continue}}b.lastGeneratedColumn=Infinity}};e.prototype.originalPositionFor=function(a){var e={generatedLine:d.getArg(a,
"line"),generatedColumn:d.getArg(a,"column")};a=this._findMapping(e,this._generatedMappings,"generatedLine","generatedColumn",d.compareByGeneratedPositionsDeflated,d.getArg(a,"bias",b.GREATEST_LOWER_BOUND));if(0<=a&&(a=this._generatedMappings[a],a.generatedLine===e.generatedLine)){e=d.getArg(a,"source",null);null!==e&&(e=this._sources.at(e),e=d.computeSourceURL(this.sourceRoot,e,this._sourceMapURL));var c=d.getArg(a,"name",null);null!==c&&(c=this._names.at(c));return{source:e,line:d.getArg(a,"originalLine",
null),column:d.getArg(a,"originalColumn",null),name:c}}return{source:null,line:null,column:null,name:null}};e.prototype.hasContentsOfAllSources=function(){return this.sourcesContent?this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(a){return null==a}):!1};e.prototype.sourceContentFor=function(a,b){if(!this.sourcesContent)return null;var c=a;null!=this.sourceRoot&&(c=d.relative(this.sourceRoot,c));if(this._sources.has(c))return this.sourcesContent[this._sources.indexOf(c)];
var k=this.sources,e;for(e=0;e<k.length;++e)if(k[e]==a)return this.sourcesContent[e];var g;if(null!=this.sourceRoot&&(g=d.urlParse(this.sourceRoot))){k=c.replace(/^file:\/\//,"");if("file"==g.scheme&&this._sources.has(k))return this.sourcesContent[this._sources.indexOf(k)];if((!g.path||"/"==g.path)&&this._sources.has("/"+c))return this.sourcesContent[this._sources.indexOf("/"+c)]}if(b)return null;throw Error('"'+c+'" is not in the SourceMap.');};e.prototype.generatedPositionFor=function(a){var e=
d.getArg(a,"source");null!=this.sourceRoot&&(e=d.relative(this.sourceRoot,e));if(!this._sources.has(e))return{line:null,column:null,lastColumn:null};e=this._sources.indexOf(e);e={source:e,originalLine:d.getArg(a,"line"),originalColumn:d.getArg(a,"column")};a=this._findMapping(e,this._originalMappings,"originalLine","originalColumn",d.compareByOriginalPositions,d.getArg(a,"bias",b.GREATEST_LOWER_BOUND));return 0<=a&&(a=this._originalMappings[a],a.source===e.source)?{line:d.getArg(a,"generatedLine",
null),column:d.getArg(a,"generatedColumn",null),lastColumn:d.getArg(a,"lastGeneratedColumn",null)}:{line:null,column:null,lastColumn:null}};m.BasicSourceMapConsumer=e;h.prototype=Object.create(b.prototype);h.prototype.constructor=b;h.prototype._version=3;Object.defineProperty(h.prototype,"sources",{get:function(){for(var a=[],b=0;b<this._sections.length;b++)for(var c=0;c<this._sections[b].consumer.sources.length;c++)a.push(this._sections[b].consumer.sources[c]);return a}});h.prototype.originalPositionFor=
function(b){var e={generatedLine:d.getArg(b,"line"),generatedColumn:d.getArg(b,"column")},c=a.search(e,this._sections,function(a,b){var c=a.generatedLine-b.generatedOffset.generatedLine;return c?c:a.generatedColumn-b.generatedOffset.generatedColumn});return(c=this._sections[c])?c.consumer.originalPositionFor({line:e.generatedLine-(c.generatedOffset.generatedLine-1),column:e.generatedColumn-(c.generatedOffset.generatedLine===e.generatedLine?c.generatedOffset.generatedColumn-1:0),bias:b.bias}):{source:null,
line:null,column:null,name:null}};h.prototype.hasContentsOfAllSources=function(){return this._sections.every(function(a){return a.consumer.hasContentsOfAllSources()})};h.prototype.sourceContentFor=function(a,b){for(var c=0;c<this._sections.length;c++){var d=this._sections[c].consumer.sourceContentFor(a,!0);if(d)return d}if(b)return null;throw Error('"'+a+'" is not in the SourceMap.');};h.prototype.generatedPositionFor=function(a){for(var b=0;b<this._sections.length;b++){var c=this._sections[b];if(-1!==
c.consumer.sources.indexOf(d.getArg(a,"source"))){var k=c.consumer.generatedPositionFor(a);if(k)return{line:k.line+(c.generatedOffset.generatedLine-1),column:k.column+(c.generatedOffset.generatedLine===k.line?c.generatedOffset.generatedColumn-1:0)}}}return{line:null,column:null}};h.prototype._parseMappings=function(a,b){this.__generatedMappings=[];this.__originalMappings=[];for(var c=0;c<this._sections.length;c++)for(var k=this._sections[c],e=k.consumer._generatedMappings,g=0;g<e.length;g++){var l=
e[g],h=k.consumer._sources.at(l.source);h=d.computeSourceURL(k.consumer.sourceRoot,h,this._sourceMapURL);this._sources.add(h);h=this._sources.indexOf(h);var r=null;l.name&&(r=k.consumer._names.at(l.name),this._names.add(r),r=this._names.indexOf(r));l={source:h,generatedLine:l.generatedLine+(k.generatedOffset.generatedLine-1),generatedColumn:l.generatedColumn+(k.generatedOffset.generatedLine===l.generatedLine?k.generatedOffset.generatedColumn-1:0),originalLine:l.originalLine,originalColumn:l.originalColumn,
name:r};this.__generatedMappings.push(l);"number"===typeof l.originalLine&&this.__originalMappings.push(l)}q(this.__generatedMappings,d.compareByGeneratedPositionsDeflated);q(this.__originalMappings,d.compareByOriginalPositions)};m.IndexedSourceMapConsumer=h},{"./array-set":10,"./base64-vlq":11,"./binary-search":13,"./quick-sort":15,"./util":19}],17:[function(n,x,m){function b(a){a||(a={});this._file=g.getArg(a,"file",null);this._sourceRoot=g.getArg(a,"sourceRoot",null);this._skipValidation=g.getArg(a,
"skipValidation",!1);this._sources=new h;this._names=new h;this._mappings=new d;this._sourcesContents=null}var e=n("./base64-vlq"),g=n("./util"),h=n("./array-set").ArraySet,d=n("./mapping-list").MappingList;b.prototype._version=3;b.fromSourceMap=function(a){var d=a.sourceRoot,e=new b({file:a.file,sourceRoot:d});a.eachMapping(function(a){var b={generated:{line:a.generatedLine,column:a.generatedColumn}};null!=a.source&&(b.source=a.source,null!=d&&(b.source=g.relative(d,b.source)),b.original={line:a.originalLine,
column:a.originalColumn},null!=a.name&&(b.name=a.name));e.addMapping(b)});a.sources.forEach(function(b){var l=b;null!==d&&(l=g.relative(d,b));e._sources.has(l)||e._sources.add(l);l=a.sourceContentFor(b);null!=l&&e.setSourceContent(b,l)});return e};b.prototype.addMapping=function(a){var b=g.getArg(a,"generated"),d=g.getArg(a,"original",null),e=g.getArg(a,"source",null);a=g.getArg(a,"name",null);this._skipValidation||this._validateMapping(b,d,e,a);null!=e&&(e=String(e),this._sources.has(e)||this._sources.add(e));
null!=a&&(a=String(a),this._names.has(a)||this._names.add(a));this._mappings.add({generatedLine:b.line,generatedColumn:b.column,originalLine:null!=d&&d.line,originalColumn:null!=d&&d.column,source:e,name:a})};b.prototype.setSourceContent=function(a,b){var d=a;null!=this._sourceRoot&&(d=g.relative(this._sourceRoot,d));null!=b?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[g.toSetString(d)]=b):this._sourcesContents&&(delete this._sourcesContents[g.toSetString(d)],
0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))};b.prototype.applySourceMap=function(a,b,d){var e=b;if(null==b){if(null==a.file)throw Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');e=a.file}var l=this._sourceRoot;null!=l&&(e=g.relative(l,e));var m=new h,c=new h;this._mappings.unsortedForEach(function(b){if(b.source===e&&null!=b.originalLine){var k=a.originalPositionFor({line:b.originalLine,
column:b.originalColumn});null!=k.source&&(b.source=k.source,null!=d&&(b.source=g.join(d,b.source)),null!=l&&(b.source=g.relative(l,b.source)),b.originalLine=k.line,b.originalColumn=k.column,null!=k.name&&(b.name=k.name))}k=b.source;null==k||m.has(k)||m.add(k);b=b.name;null==b||c.has(b)||c.add(b)},this);this._sources=m;this._names=c;a.sources.forEach(function(b){var c=a.sourceContentFor(b);null!=c&&(null!=d&&(b=g.join(d,b)),null!=l&&(b=g.relative(l,b)),this.setSourceContent(b,c))},this)};b.prototype._validateMapping=
function(a,b,d,e){if(b&&"number"!==typeof b.line&&"number"!==typeof b.column)throw Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if(!(a&&"line"in a&&"column"in a&&0<a.line&&0<=a.column&&!b&&!d&&!e||a&&"line"in a&&"column"in a&&b&&"line"in b&&"column"in b&&0<a.line&&0<=a.column&&0<b.line&&0<=b.column&&
d))throw Error("Invalid mapping: "+JSON.stringify({generated:a,source:d,original:b,name:e}));};b.prototype._serializeMappings=function(){for(var a=0,b=1,d=0,h=0,m=0,n=0,c="",k,w,y,F=this._mappings.toArray(),D=0,t=F.length;D<t;D++){w=F[D];k="";if(w.generatedLine!==b)for(a=0;w.generatedLine!==b;)k+=";",b++;else if(0<D){if(!g.compareByGeneratedPositionsInflated(w,F[D-1]))continue;k+=","}k+=e.encode(w.generatedColumn-a);a=w.generatedColumn;null!=w.source&&(y=this._sources.indexOf(w.source),k+=e.encode(y-
n),n=y,k+=e.encode(w.originalLine-1-h),h=w.originalLine-1,k+=e.encode(w.originalColumn-d),d=w.originalColumn,null!=w.name&&(w=this._names.indexOf(w.name),k+=e.encode(w-m),m=w));c+=k}return c};b.prototype._generateSourcesContent=function(a,b){return a.map(function(a){if(!this._sourcesContents)return null;null!=b&&(a=g.relative(b,a));a=g.toSetString(a);return Object.prototype.hasOwnProperty.call(this._sourcesContents,a)?this._sourcesContents[a]:null},this)};b.prototype.toJSON=function(){var a={version:this._version,
sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};null!=this._file&&(a.file=this._file);null!=this._sourceRoot&&(a.sourceRoot=this._sourceRoot);this._sourcesContents&&(a.sourcesContent=this._generateSourcesContent(a.sources,a.sourceRoot));return a};b.prototype.toString=function(){return JSON.stringify(this.toJSON())};m.SourceMapGenerator=b},{"./array-set":10,"./base64-vlq":11,"./mapping-list":14,"./util":19}],18:[function(n,x,m){function b(b,a,e,g,h){this.children=
[];this.sourceContents={};this.line=null==b?null:b;this.column=null==a?null:a;this.source=null==e?null:e;this.name=null==h?null:h;this.$$$isSourceNode$$$=!0;null!=g&&this.add(g)}var e=n("./source-map-generator").SourceMapGenerator,g=n("./util"),h=/(\r?\n)/;b.fromStringWithSourceMap=function(d,a,e){function l(a,c){if(null===a||void 0===a.source)m.add(c);else{var d=e?g.join(e,a.source):a.source;m.add(new b(a.originalLine,a.originalColumn,d,c,a.name))}}var m=new b,n=d.split(h),u=0,c=function(){var a=
u<n.length?n[u++]:void 0,b=(u<n.length?n[u++]:void 0)||"";return a+b},k=1,w=0,y=null;a.eachMapping(function(a){if(null!==y)if(k<a.generatedLine)l(y,c()),k++,w=0;else{var b=n[u]||"",d=b.substr(0,a.generatedColumn-w);n[u]=b.substr(a.generatedColumn-w);w=a.generatedColumn;l(y,d);y=a;return}for(;k<a.generatedLine;)m.add(c()),k++;w<a.generatedColumn&&(b=n[u]||"",m.add(b.substr(0,a.generatedColumn)),n[u]=b.substr(a.generatedColumn),w=a.generatedColumn);y=a},this);u<n.length&&(y&&l(y,c()),m.add(n.splice(u).join("")));
a.sources.forEach(function(b){var c=a.sourceContentFor(b);null!=c&&(null!=e&&(b=g.join(e,b)),m.setSourceContent(b,c))});return m};b.prototype.add=function(b){if(Array.isArray(b))b.forEach(function(a){this.add(a)},this);else if(b.$$$isSourceNode$$$||"string"===typeof b)b&&this.children.push(b);else throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+b);return this};b.prototype.prepend=function(b){if(Array.isArray(b))for(var a=b.length-1;0<=a;a--)this.prepend(b[a]);
else if(b.$$$isSourceNode$$$||"string"===typeof b)this.children.unshift(b);else throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+b);return this};b.prototype.walk=function(b){for(var a,d=0,e=this.children.length;d<e;d++)a=this.children[d],a.$$$isSourceNode$$$?a.walk(b):""!==a&&b(a,{source:this.source,line:this.line,column:this.column,name:this.name})};b.prototype.join=function(b){var a,d=this.children.length;if(0<d){var e=[];for(a=0;a<d-1;a++)e.push(this.children[a]),
e.push(b);e.push(this.children[a]);this.children=e}return this};b.prototype.replaceRight=function(b,a){var d=this.children[this.children.length-1];d.$$$isSourceNode$$$?d.replaceRight(b,a):"string"===typeof d?this.children[this.children.length-1]=d.replace(b,a):this.children.push("".replace(b,a));return this};b.prototype.setSourceContent=function(b,a){this.sourceContents[g.toSetString(b)]=a};b.prototype.walkSourceContents=function(b){for(var a=0,d=this.children.length;a<d;a++)this.children[a].$$$isSourceNode$$$&&
this.children[a].walkSourceContents(b);var e=Object.keys(this.sourceContents);a=0;for(d=e.length;a<d;a++)b(g.fromSetString(e[a]),this.sourceContents[e[a]])};b.prototype.toString=function(){var b="";this.walk(function(a){b+=a});return b};b.prototype.toStringWithSourceMap=function(b){var a="",d=1,g=0,h=new e(b),m=!1,n=null,c=null,k=null,w=null;this.walk(function(b,e){a+=b;null!==e.source&&null!==e.line&&null!==e.column?(n===e.source&&c===e.line&&k===e.column&&w===e.name||h.addMapping({source:e.source,
original:{line:e.line,column:e.column},generated:{line:d,column:g},name:e.name}),n=e.source,c=e.line,k=e.column,w=e.name,m=!0):m&&(h.addMapping({generated:{line:d,column:g}}),n=null,m=!1);for(var l=0,y=b.length;l<y;l++)10===b.charCodeAt(l)?(d++,g=0,l+1===y?(n=null,m=!1):m&&h.addMapping({source:e.source,original:{line:e.line,column:e.column},generated:{line:d,column:g},name:e.name})):g++});this.walkSourceContents(function(a,b){h.setSourceContent(a,b)});return{code:a,map:h}};m.SourceNode=b},{"./source-map-generator":17,
"./util":19}],19:[function(n,x,m){function b(a){return(a=a.match(v))?{scheme:a[1],auth:a[2],host:a[3],port:a[4],path:a[5]}:null}function e(a){var b="";a.scheme&&(b+=a.scheme+":");b+="//";a.auth&&(b+=a.auth+"@");a.host&&(b+=a.host);a.port&&(b+=":"+a.port);a.path&&(b+=a.path);return b}function g(a){var c=a,d=b(a);if(d){if(!d.path)return a;c=d.path}a=m.isAbsolute(c);c=c.split(/\/+/);for(var g,h=0,l=c.length-1;0<=l;l--)g=c[l],"."===g?c.splice(l,1):".."===g?h++:0<h&&(""===g?(c.splice(l+1,h),h=0):(c.splice(l,
2),h--));c=c.join("/");""===c&&(c=a?"/":".");return d?(d.path=c,e(d)):c}function h(a,d){""===a&&(a=".");""===d&&(d=".");var c=b(d),k=b(a);k&&(a=k.path||"/");if(c&&!c.scheme)return k&&(c.scheme=k.scheme),e(c);if(c||d.match(u))return d;if(k&&!k.host&&!k.path)return k.host=d,e(k);c="/"===d.charAt(0)?d:g(a.replace(/\/+$/,"")+"/"+d);return k?(k.path=c,e(k)):c}function d(a){return a}function a(a){return r(a)?"$"+a:a}function l(a){return r(a)?a.slice(1):a}function r(a){if(!a)return!1;var b=a.length;if(9>
b||95!==a.charCodeAt(b-1)||95!==a.charCodeAt(b-2)||111!==a.charCodeAt(b-3)||116!==a.charCodeAt(b-4)||111!==a.charCodeAt(b-5)||114!==a.charCodeAt(b-6)||112!==a.charCodeAt(b-7)||95!==a.charCodeAt(b-8)||95!==a.charCodeAt(b-9))return!1;for(b-=10;0<=b;b--)if(36!==a.charCodeAt(b))return!1;return!0}function q(a,b){return a===b?0:null===a?1:null===b?-1:a>b?1:-1}m.getArg=function(a,b,d){if(b in a)return a[b];if(3===arguments.length)return d;throw Error('"'+b+'" is a required argument.');};var v=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,
u=/^data:.+,.+$/;m.urlParse=b;m.urlGenerate=e;m.normalize=g;m.join=h;m.isAbsolute=function(a){return"/"===a.charAt(0)||v.test(a)};m.relative=function(a,b){""===a&&(a=".");a=a.replace(/\/$/,"");for(var c=0;0!==b.indexOf(a+"/");){var d=a.lastIndexOf("/");if(0>d)return b;a=a.slice(0,d);if(a.match(/^([^\/]+:\/)?\/*$/))return b;++c}return Array(c+1).join("../")+b.substr(a.length+1)};n=!("__proto__"in Object.create(null));m.toSetString=n?d:a;m.fromSetString=n?d:l;m.compareByOriginalPositions=function(a,
b,d){var c=q(a.source,b.source);if(0!==c)return c;c=a.originalLine-b.originalLine;if(0!==c)return c;c=a.originalColumn-b.originalColumn;if(0!==c||d)return c;c=a.generatedColumn-b.generatedColumn;if(0!==c)return c;c=a.generatedLine-b.generatedLine;return 0!==c?c:q(a.name,b.name)};m.compareByGeneratedPositionsDeflated=function(a,b,d){var c=a.generatedLine-b.generatedLine;if(0!==c)return c;c=a.generatedColumn-b.generatedColumn;if(0!==c||d)return c;c=q(a.source,b.source);if(0!==c)return c;c=a.originalLine-
b.originalLine;if(0!==c)return c;c=a.originalColumn-b.originalColumn;return 0!==c?c:q(a.name,b.name)};m.compareByGeneratedPositionsInflated=function(a,b){var c=a.generatedLine-b.generatedLine;if(0!==c)return c;c=a.generatedColumn-b.generatedColumn;if(0!==c)return c;c=q(a.source,b.source);if(0!==c)return c;c=a.originalLine-b.originalLine;if(0!==c)return c;c=a.originalColumn-b.originalColumn;return 0!==c?c:q(a.name,b.name)};m.parseSourceMapInput=function(a){return JSON.parse(a.replace(/^\)]}'[^\n]*\n/,
""))};m.computeSourceURL=function(a,d,l){d=d||"";a&&("/"!==a[a.length-1]&&"/"!==d[0]&&(a+="/"),d=a+d);if(l){a=b(l);if(!a)throw Error("sourceMapURL could not be parsed");a.path&&(l=a.path.lastIndexOf("/"),0<=l&&(a.path=a.path.substring(0,l+1)));d=h(e(a),d)}return g(d)}},{}],20:[function(n,x,m){m.SourceMapGenerator=n("./lib/source-map-generator").SourceMapGenerator;m.SourceMapConsumer=n("./lib/source-map-consumer").SourceMapConsumer;m.SourceNode=n("./lib/source-node").SourceNode},{"./lib/source-map-consumer":16,
"./lib/source-map-generator":17,"./lib/source-node":18}],21:[function(n,x,m){(function(b){function e(){return"browser"===f?!0:"node"===f?!1:"undefined"!==typeof window&&"function"===typeof XMLHttpRequest&&!(window.require&&window.module&&window.process&&"renderer"===window.process.type)}function g(a){return function(b){for(var c=0;c<a.length;c++){var d=a[c](b);if(d)return d}return null}}function h(a,b){if(!a)return b;var c=w.dirname(a),d=/^\w+:\/\/[^\/]*/.exec(c);d=d?d[0]:"";var e=c.slice(d.length);
return d&&/^\/\w:/.test(e)?(d+="/",d+w.resolve(c.slice(d.length),b).replace(/\\/g,"/")):d+w.resolve(c.slice(d.length),b)}function d(a){var b=C[a.source];if(!b){var c=E(a.source);c?(b=C[a.source]={url:c.url,map:new k(c.map)},b.map.sourcesContent&&b.map.sources.forEach(function(a,c){var d=b.map.sourcesContent[c];if(d){var e=h(b.url,a);p[e]=d}})):b=C[a.source]={url:null,map:null}}return b&&b.map&&"function"===typeof b.map.originalPositionFor&&(c=b.map.originalPositionFor(a),null!==c.source)?(c.source=
h(b.url,c.source),c):a}function a(b){var c=/^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(b);return c?(b=d({source:c[2],line:+c[3],column:c[4]-1}),"eval at "+c[1]+" ("+b.source+":"+b.line+":"+(b.column+1)+")"):(c=/^eval at ([^(]+) \((.+)\)$/.exec(b))?"eval at "+c[1]+" ("+a(c[2])+")":b}function l(){var a="";if(this.isNative())a="native";else{var b=this.getScriptNameOrSourceURL();!b&&this.isEval()&&(a=this.getEvalOrigin(),a+=", ");a=b?a+b:a+"<anonymous>";b=this.getLineNumber();null!=b&&(a+=":"+b,(b=
this.getColumnNumber())&&(a+=":"+b))}b="";var c=this.getFunctionName(),d=!0,e=this.isConstructor();if(this.isToplevel()||e)e?b+="new "+(c||"<anonymous>"):c?b+=c:(b+=a,d=!1);else{e=this.getTypeName();"[object Object]"===e&&(e="null");var f=this.getMethodName();c?(e&&0!=c.indexOf(e)&&(b+=e+"."),b+=c,f&&c.indexOf("."+f)!=c.length-f.length-1&&(b+=" [as "+f+"]")):b+=e+"."+(f||"<anonymous>")}d&&(b+=" ("+a+")");return b}function r(a){var b={};Object.getOwnPropertyNames(Object.getPrototypeOf(a)).forEach(function(c){b[c]=
/^(?:is|get)/.test(c)?function(){return a[c].call(a)}:a[c]});b.toString=l;return b}function q(c,f){void 0===f&&(f={nextPosition:null,curPosition:null});if(c.isNative())return f.curPosition=null,c;var g=c.getFileName()||c.getScriptNameOrSourceURL();if(g){var h=c.getLineNumber(),k=c.getColumnNumber()-1,l=/^v(10\.1[6-9]|10\.[2-9][0-9]|10\.[0-9]{3,}|1[2-9]\d*|[2-9]\d|\d{3,}|11\.11)/.test(b.version)?0:62;1===h&&k>l&&!e()&&!c.isEval()&&(k-=l);var m=d({source:g,line:h,column:k});f.curPosition=m;c=r(c);var p=
c.getFunctionName;c.getFunctionName=function(){return null==f.nextPosition?p():f.nextPosition.name||p()};c.getFileName=function(){return m.source};c.getLineNumber=function(){return m.line};c.getColumnNumber=function(){return m.column+1};c.getScriptNameOrSourceURL=function(){return m.source};return c}var n=c.isEval()&&c.getEvalOrigin();n&&(n=a(n),c=r(c),c.getEvalOrigin=function(){return n});return c}function v(a,b){H&&(p={},C={});for(var c=(a.name||"Error")+": "+(a.message||""),d={nextPosition:null,
curPosition:null},e=[],f=b.length-1;0<=f;f--)e.push("\n    at "+q(b[f],d)),d.nextPosition=d.curPosition;d.curPosition=d.nextPosition=null;return c+e.reverse().join("")}function u(a){var b=/\n    at [^(]+ \((.*):(\d+):(\d+)\)/.exec(a.stack);if(b){a=b[1];var c=+b[2];b=+b[3];var d=p[a];if(!d&&y&&y.existsSync(a))try{d=y.readFileSync(a,"utf8")}catch(N){d=""}if(d&&(d=d.split(/(?:\r\n|\r|\n)/)[c-1]))return a+":"+c+"\n"+d+"\n"+Array(b).join(" ")+"^"}return null}function c(){var a=b.emit;b.emit=function(c){if("uncaughtException"===
c){var d=arguments[1]&&arguments[1].stack,e=0<this.listeners(c).length;if(d&&!e){d=arguments[1];e=u(d);b.stderr._handle&&b.stderr._handle.setBlocking&&b.stderr._handle.setBlocking(!0);e&&(console.error(),console.error(e));console.error(d.stack);b.exit(1);return}}return a.apply(this,arguments)}}var k=n("source-map").SourceMapConsumer,w=n("path");try{var y=n("fs");y.existsSync&&y.readFileSync||(y=null)}catch(M){}var F=n("buffer-from"),D=!1,t=!1,H=!1,f="auto",p={},C={},G=/^data:application\/json[^,]+base64,/,
z=[],B=[],A=g(z);z.push(function(a){a=a.trim();/^file:/.test(a)&&(a=a.replace(/file:\/\/\/(\w:)?/,function(a,b){return b?"":"/"}));if(a in p)return p[a];var b="";try{if(y)y.existsSync(a)&&(b=y.readFileSync(a,"utf8"));else{var c=new XMLHttpRequest;c.open("GET",a,!1);c.send(null);4===c.readyState&&200===c.status&&(b=c.responseText)}}catch(K){}return p[a]=b});var E=g(B);B.push(function(a){a:{if(e())try{var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);var c=b.getResponseHeader("SourceMap")||b.getResponseHeader("X-SourceMap");
if(c){var d=c;break a}}catch(O){}d=A(a);b=/(?:\/\/[@#][\s]*sourceMappingURL=([^\s'"]+)[\s]*$)|(?:\/\*[@#][\s]*sourceMappingURL=([^\s*'"]+)[\s]*(?:\*\/)[\s]*$)/mg;for(var f;c=b.exec(d);)f=c;d=f?f[1]:null}if(!d)return null;G.test(d)?(f=d.slice(d.indexOf(",")+1),f=F(f,"base64").toString(),d=a):(d=h(a,d),f=A(d));return f?{url:d,map:f}:null});var I=z.slice(0),L=B.slice(0);m.wrapCallSite=q;m.getErrorSource=u;m.mapSourcePosition=d;m.retrieveSourceMap=E;m.install=function(a){a=a||{};if(a.environment&&(f=
a.environment,-1===["node","browser","auto"].indexOf(f)))throw Error("environment "+f+" was unknown. Available options are {auto, browser, node}");a.retrieveFile&&(a.overrideRetrieveFile&&(z.length=0),z.unshift(a.retrieveFile));a.retrieveSourceMap&&(a.overrideRetrieveSourceMap&&(B.length=0),B.unshift(a.retrieveSourceMap));if(a.hookRequire&&!e()){var d=x.require("module"),g=d.prototype._compile;g.__sourceMapSupport||(d.prototype._compile=function(a,b){p[b]=a;C[b]=void 0;return g.call(this,a,b)},d.prototype._compile.__sourceMapSupport=
!0)}H||(H="emptyCacheBetweenOperations"in a?a.emptyCacheBetweenOperations:!1);D||(D=!0,Error.prepareStackTrace=v);if(!t){a="handleUncaughtExceptions"in a?a.handleUncaughtExceptions:!0;try{!1===x.require("worker_threads").isMainThread&&(a=!1)}catch(K){}a&&"object"===typeof b&&null!==b&&"function"===typeof b.on&&(t=!0,c())}};m.resetRetrieveHandlers=function(){z.length=0;B.length=0;z=I.slice(0);B=L.slice(0);E=g(B);A=g(z)}}).call(this,n("g5I+bs"))},{"buffer-from":4,fs:3,"g5I+bs":9,path:8,"source-map":20}]},
{},[1]);return G});
{
  "dependencies": {
    "buffer-from": "^1.0.0",
    "source-map": "^0.6.0"
  },
  "deprecated": false,
  "description": "Fixes stack traces for files with source maps",
  "devDependencies": {
    "browserify": "^4.2.3",
    "coffeescript": "^1.12.7",
    "http-server": "^0.11.1",
    "mocha": "^3.5.3",
    "webpack": "^1.15.0"
  },
  "homepage": "https://github.com/evanw/node-source-map-support#readme",
  "license": "MIT",
  "main": "./source-map-support.js",
  "name": "source-map-support",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/evanw/node-source-map-support.git"
  },
  "version": "0.5.19"
}require('./').install();
var SourceMapConsumer = require('source-map').SourceMapConsumer;
var path = require('path');

var fs;
try {
  fs = require('fs');
  if (!fs.existsSync || !fs.readFileSync) {
    // fs doesn't have all methods we need
    fs = null;
  }
} catch (err) {
  /* nop */
}

var bufferFrom = require('buffer-from');

/**
 * Requires a module which is protected against bundler minification.
 *
 * @param {NodeModule} mod
 * @param {string} request
 */
function dynamicRequire(mod, request) {
  return mod.require(request);
}

// Only install once if called multiple times
var errorFormatterInstalled = false;
var uncaughtShimInstalled = false;

// If true, the caches are reset before a stack trace formatting operation
var emptyCacheBetweenOperations = false;

// Supports {browser, node, auto}
var environment = "auto";

// Maps a file path to a string containing the file contents
var fileContentsCache = {};

// Maps a file path to a source map for that file
var sourceMapCache = {};

// Regex for detecting source maps
var reSourceMap = /^data:application\/json[^,]+base64,/;

// Priority list of retrieve handlers
var retrieveFileHandlers = [];
var retrieveMapHandlers = [];

function isInBrowser() {
  if (environment === "browser")
    return true;
  if (environment === "node")
    return false;
  return ((typeof window !== 'undefined') && (typeof XMLHttpRequest === 'function') && !(window.require && window.module && window.process && window.process.type === "renderer"));
}

function hasGlobalProcessEventEmitter() {
  return ((typeof process === 'object') && (process !== null) && (typeof process.on === 'function'));
}

function handlerExec(list) {
  return function(arg) {
    for (var i = 0; i < list.length; i++) {
      var ret = list[i](arg);
      if (ret) {
        return ret;
      }
    }
    return null;
  };
}

var retrieveFile = handlerExec(retrieveFileHandlers);

retrieveFileHandlers.push(function(path) {
  // Trim the path to make sure there is no extra whitespace.
  path = path.trim();
  if (/^file:/.test(path)) {
    // existsSync/readFileSync can't handle file protocol, but once stripped, it works
    path = path.replace(/file:\/\/\/(\w:)?/, function(protocol, drive) {
      return drive ?
        '' : // file:///C:/dir/file -> C:/dir/file
        '/'; // file:///root-dir/file -> /root-dir/file
    });
  }
  if (path in fileContentsCache) {
    return fileContentsCache[path];
  }

  var contents = '';
  try {
    if (!fs) {
      // Use SJAX if we are in the browser
      var xhr = new XMLHttpRequest();
      xhr.open('GET', path, /** async */ false);
      xhr.send(null);
      if (xhr.readyState === 4 && xhr.status === 200) {
        contents = xhr.responseText;
      }
    } else if (fs.existsSync(path)) {
      // Otherwise, use the filesystem
      contents = fs.readFileSync(path, 'utf8');
    }
  } catch (er) {
    /* ignore any errors */
  }

  return fileContentsCache[path] = contents;
});

// Support URLs relative to a directory, but be careful about a protocol prefix
// in case we are in the browser (i.e. directories may start with "http://" or "file:///")
function supportRelativeURL(file, url) {
  if (!file) return url;
  var dir = path.dirname(file);
  var match = /^\w+:\/\/[^\/]*/.exec(dir);
  var protocol = match ? match[0] : '';
  var startPath = dir.slice(protocol.length);
  if (protocol && /^\/\w\:/.test(startPath)) {
    // handle file:///C:/ paths
    protocol += '/';
    return protocol + path.resolve(dir.slice(protocol.length), url).replace(/\\/g, '/');
  }
  return protocol + path.resolve(dir.slice(protocol.length), url);
}

function retrieveSourceMapURL(source) {
  var fileData;

  if (isInBrowser()) {
     try {
       var xhr = new XMLHttpRequest();
       xhr.open('GET', source, false);
       xhr.send(null);
       fileData = xhr.readyState === 4 ? xhr.responseText : null;

       // Support providing a sourceMappingURL via the SourceMap header
       var sourceMapHeader = xhr.getResponseHeader("SourceMap") ||
                             xhr.getResponseHeader("X-SourceMap");
       if (sourceMapHeader) {
         return sourceMapHeader;
       }
     } catch (e) {
     }
  }

  // Get the URL of the source map
  fileData = retrieveFile(source);
  var re = /(?:\/\/[@#][\s]*sourceMappingURL=([^\s'"]+)[\s]*$)|(?:\/\*[@#][\s]*sourceMappingURL=([^\s*'"]+)[\s]*(?:\*\/)[\s]*$)/mg;
  // Keep executing the search to find the *last* sourceMappingURL to avoid
  // picking up sourceMappingURLs from comments, strings, etc.
  var lastMatch, match;
  while (match = re.exec(fileData)) lastMatch = match;
  if (!lastMatch) return null;
  return lastMatch[1];
};

// Can be overridden by the retrieveSourceMap option to install. Takes a
// generated source filename; returns a {map, optional url} object, or null if
// there is no source map.  The map field may be either a string or the parsed
// JSON object (ie, it must be a valid argument to the SourceMapConsumer
// constructor).
var retrieveSourceMap = handlerExec(retrieveMapHandlers);
retrieveMapHandlers.push(function(source) {
  var sourceMappingURL = retrieveSourceMapURL(source);
  if (!sourceMappingURL) return null;

  // Read the contents of the source map
  var sourceMapData;
  if (reSourceMap.test(sourceMappingURL)) {
    // Support source map URL as a data url
    var rawData = sourceMappingURL.slice(sourceMappingURL.indexOf(',') + 1);
    sourceMapData = bufferFrom(rawData, "base64").toString();
    sourceMappingURL = source;
  } else {
    // Support source map URLs relative to the source URL
    sourceMappingURL = supportRelativeURL(source, sourceMappingURL);
    sourceMapData = retrieveFile(sourceMappingURL);
  }

  if (!sourceMapData) {
    return null;
  }

  return {
    url: sourceMappingURL,
    map: sourceMapData
  };
});

function mapSourcePosition(position) {
  var sourceMap = sourceMapCache[position.source];
  if (!sourceMap) {
    // Call the (overrideable) retrieveSourceMap function to get the source map.
    var urlAndMap = retrieveSourceMap(position.source);
    if (urlAndMap) {
      sourceMap = sourceMapCache[position.source] = {
        url: urlAndMap.url,
        map: new SourceMapConsumer(urlAndMap.map)
      };

      // Load all sources stored inline with the source map into the file cache
      // to pretend like they are already loaded. They may not exist on disk.
      if (sourceMap.map.sourcesContent) {
        sourceMap.map.sources.forEach(function(source, i) {
          var contents = sourceMap.map.sourcesContent[i];
          if (contents) {
            var url = supportRelativeURL(sourceMap.url, source);
            fileContentsCache[url] = contents;
          }
        });
      }
    } else {
      sourceMap = sourceMapCache[position.source] = {
        url: null,
        map: null
      };
    }
  }

  // Resolve the source URL relative to the URL of the source map
  if (sourceMap && sourceMap.map && typeof sourceMap.map.originalPositionFor === 'function') {
    var originalPosition = sourceMap.map.originalPositionFor(position);

    // Only return the original position if a matching line was found. If no
    // matching line is found then we return position instead, which will cause
    // the stack trace to print the path and line for the compiled file. It is
    // better to give a precise location in the compiled file than a vague
    // location in the original file.
    if (originalPosition.source !== null) {
      originalPosition.source = supportRelativeURL(
        sourceMap.url, originalPosition.source);
      return originalPosition;
    }
  }

  return position;
}

// Parses code generated by FormatEvalOrigin(), a function inside V8:
// https://code.google.com/p/v8/source/browse/trunk/src/messages.js
function mapEvalOrigin(origin) {
  // Most eval() calls are in this format
  var match = /^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(origin);
  if (match) {
    var position = mapSourcePosition({
      source: match[2],
      line: +match[3],
      column: match[4] - 1
    });
    return 'eval at ' + match[1] + ' (' + position.source + ':' +
      position.line + ':' + (position.column + 1) + ')';
  }

  // Parse nested eval() calls using recursion
  match = /^eval at ([^(]+) \((.+)\)$/.exec(origin);
  if (match) {
    return 'eval at ' + match[1] + ' (' + mapEvalOrigin(match[2]) + ')';
  }

  // Make sure we still return useful information if we didn't find anything
  return origin;
}

// This is copied almost verbatim from the V8 source code at
// https://code.google.com/p/v8/source/browse/trunk/src/messages.js. The
// implementation of wrapCallSite() used to just forward to the actual source
// code of CallSite.prototype.toString but unfortunately a new release of V8
// did something to the prototype chain and broke the shim. The only fix I
// could find was copy/paste.
function CallSiteToString() {
  var fileName;
  var fileLocation = "";
  if (this.isNative()) {
    fileLocation = "native";
  } else {
    fileName = this.getScriptNameOrSourceURL();
    if (!fileName && this.isEval()) {
      fileLocation = this.getEvalOrigin();
      fileLocation += ", ";  // Expecting source position to follow.
    }

    if (fileName) {
      fileLocation += fileName;
    } else {
      // Source code does not originate from a file and is not native, but we
      // can still get the source position inside the source string, e.g. in
      // an eval string.
      fileLocation += "<anonymous>";
    }
    var lineNumber = this.getLineNumber();
    if (lineNumber != null) {
      fileLocation += ":" + lineNumber;
      var columnNumber = this.getColumnNumber();
      if (columnNumber) {
        fileLocation += ":" + columnNumber;
      }
    }
  }

  var line = "";
  var functionName = this.getFunctionName();
  var addSuffix = true;
  var isConstructor = this.isConstructor();
  var isMethodCall = !(this.isToplevel() || isConstructor);
  if (isMethodCall) {
    var typeName = this.getTypeName();
    // Fixes shim to be backward compatable with Node v0 to v4
    if (typeName === "[object Object]") {
      typeName = "null";
    }
    var methodName = this.getMethodName();
    if (functionName) {
      if (typeName && functionName.indexOf(typeName) != 0) {
        line += typeName + ".";
      }
      line += functionName;
      if (methodName && functionName.indexOf("." + methodName) != functionName.length - methodName.length - 1) {
        line += " [as " + methodName + "]";
      }
    } else {
      line += typeName + "." + (methodName || "<anonymous>");
    }
  } else if (isConstructor) {
    line += "new " + (functionName || "<anonymous>");
  } else if (functionName) {
    line += functionName;
  } else {
    line += fileLocation;
    addSuffix = false;
  }
  if (addSuffix) {
    line += " (" + fileLocation + ")";
  }
  return line;
}

function cloneCallSite(frame) {
  var object = {};
  Object.getOwnPropertyNames(Object.getPrototypeOf(frame)).forEach(function(name) {
    object[name] = /^(?:is|get)/.test(name) ? function() { return frame[name].call(frame); } : frame[name];
  });
  object.toString = CallSiteToString;
  return object;
}

function wrapCallSite(frame, state) {
  // provides interface backward compatibility
  if (state === undefined) {
    state = { nextPosition: null, curPosition: null }
  }
  if(frame.isNative()) {
    state.curPosition = null;
    return frame;
  }

  // Most call sites will return the source file from getFileName(), but code
  // passed to eval() ending in "//# sourceURL=..." will return the source file
  // from getScriptNameOrSourceURL() instead
  var source = frame.getFileName() || frame.getScriptNameOrSourceURL();
  if (source) {
    var line = frame.getLineNumber();
    var column = frame.getColumnNumber() - 1;

    // Fix position in Node where some (internal) code is prepended.
    // See https://github.com/evanw/node-source-map-support/issues/36
    // Header removed in node at ^10.16 || >=11.11.0
    // v11 is not an LTS candidate, we can just test the one version with it.
    // Test node versions for: 10.16-19, 10.20+, 12-19, 20-99, 100+, or 11.11
    var noHeader = /^v(10\.1[6-9]|10\.[2-9][0-9]|10\.[0-9]{3,}|1[2-9]\d*|[2-9]\d|\d{3,}|11\.11)/;
    var headerLength = noHeader.test(process.version) ? 0 : 62;
    if (line === 1 && column > headerLength && !isInBrowser() && !frame.isEval()) {
      column -= headerLength;
    }

    var position = mapSourcePosition({
      source: source,
      line: line,
      column: column
    });
    state.curPosition = position;
    frame = cloneCallSite(frame);
    var originalFunctionName = frame.getFunctionName;
    frame.getFunctionName = function() {
      if (state.nextPosition == null) {
        return originalFunctionName();
      }
      return state.nextPosition.name || originalFunctionName();
    };
    frame.getFileName = function() { return position.source; };
    frame.getLineNumber = function() { return position.line; };
    frame.getColumnNumber = function() { return position.column + 1; };
    frame.getScriptNameOrSourceURL = function() { return position.source; };
    return frame;
  }

  // Code called using eval() needs special handling
  var origin = frame.isEval() && frame.getEvalOrigin();
  if (origin) {
    origin = mapEvalOrigin(origin);
    frame = cloneCallSite(frame);
    frame.getEvalOrigin = function() { return origin; };
    return frame;
  }

  // If we get here then we were unable to change the source position
  return frame;
}

// This function is part of the V8 stack trace API, for more info see:
// https://v8.dev/docs/stack-trace-api
function prepareStackTrace(error, stack) {
  if (emptyCacheBetweenOperations) {
    fileContentsCache = {};
    sourceMapCache = {};
  }

  var name = error.name || 'Error';
  var message = error.message || '';
  var errorString = name + ": " + message;

  var state = { nextPosition: null, curPosition: null };
  var processedStack = [];
  for (var i = stack.length - 1; i >= 0; i--) {
    processedStack.push('\n    at ' + wrapCallSite(stack[i], state));
    state.nextPosition = state.curPosition;
  }
  state.curPosition = state.nextPosition = null;
  return errorString + processedStack.reverse().join('');
}

// Generate position and snippet of original source with pointer
function getErrorSource(error) {
  var match = /\n    at [^(]+ \((.*):(\d+):(\d+)\)/.exec(error.stack);
  if (match) {
    var source = match[1];
    var line = +match[2];
    var column = +match[3];

    // Support the inline sourceContents inside the source map
    var contents = fileContentsCache[source];

    // Support files on disk
    if (!contents && fs && fs.existsSync(source)) {
      try {
        contents = fs.readFileSync(source, 'utf8');
      } catch (er) {
        contents = '';
      }
    }

    // Format the line from the original source code like node does
    if (contents) {
      var code = contents.split(/(?:\r\n|\r|\n)/)[line - 1];
      if (code) {
        return source + ':' + line + '\n' + code + '\n' +
          new Array(column).join(' ') + '^';
      }
    }
  }
  return null;
}

function printErrorAndExit (error) {
  var source = getErrorSource(error);

  // Ensure error is printed synchronously and not truncated
  if (process.stderr._handle && process.stderr._handle.setBlocking) {
    process.stderr._handle.setBlocking(true);
  }

  if (source) {
    console.error();
    console.error(source);
  }

  console.error(error.stack);
  process.exit(1);
}

function shimEmitUncaughtException () {
  var origEmit = process.emit;

  process.emit = function (type) {
    if (type === 'uncaughtException') {
      var hasStack = (arguments[1] && arguments[1].stack);
      var hasListeners = (this.listeners(type).length > 0);

      if (hasStack && !hasListeners) {
        return printErrorAndExit(arguments[1]);
      }
    }

    return origEmit.apply(this, arguments);
  };
}

var originalRetrieveFileHandlers = retrieveFileHandlers.slice(0);
var originalRetrieveMapHandlers = retrieveMapHandlers.slice(0);

exports.wrapCallSite = wrapCallSite;
exports.getErrorSource = getErrorSource;
exports.mapSourcePosition = mapSourcePosition;
exports.retrieveSourceMap = retrieveSourceMap;

exports.install = function(options) {
  options = options || {};

  if (options.environment) {
    environment = options.environment;
    if (["node", "browser", "auto"].indexOf(environment) === -1) {
      throw new Error("environment " + environment + " was unknown. Available options are {auto, browser, node}")
    }
  }

  // Allow sources to be found by methods other than reading the files
  // directly from disk.
  if (options.retrieveFile) {
    if (options.overrideRetrieveFile) {
      retrieveFileHandlers.length = 0;
    }

    retrieveFileHandlers.unshift(options.retrieveFile);
  }

  // Allow source maps to be found by methods other than reading the files
  // directly from disk.
  if (options.retrieveSourceMap) {
    if (options.overrideRetrieveSourceMap) {
      retrieveMapHandlers.length = 0;
    }

    retrieveMapHandlers.unshift(options.retrieveSourceMap);
  }

  // Support runtime transpilers that include inline source maps
  if (options.hookRequire && !isInBrowser()) {
    // Use dynamicRequire to avoid including in browser bundles
    var Module = dynamicRequire(module, 'module');
    var $compile = Module.prototype._compile;

    if (!$compile.__sourceMapSupport) {
      Module.prototype._compile = function(content, filename) {
        fileContentsCache[filename] = content;
        sourceMapCache[filename] = undefined;
        return $compile.call(this, content, filename);
      };

      Module.prototype._compile.__sourceMapSupport = true;
    }
  }

  // Configure options
  if (!emptyCacheBetweenOperations) {
    emptyCacheBetweenOperations = 'emptyCacheBetweenOperations' in options ?
      options.emptyCacheBetweenOperations : false;
  }

  // Install the error reformatter
  if (!errorFormatterInstalled) {
    errorFormatterInstalled = true;
    Error.prepareStackTrace = prepareStackTrace;
  }

  if (!uncaughtShimInstalled) {
    var installHandler = 'handleUncaughtExceptions' in options ?
      options.handleUncaughtExceptions : true;

    // Do not override 'uncaughtException' with our own handler in Node.js
    // Worker threads. Workers pass the error to the main thread as an event,
    // rather than printing something to stderr and exiting.
    try {
      // We need to use `dynamicRequire` because `require` on it's own will be optimized by WebPack/Browserify.
      var worker_threads = dynamicRequire(module, 'worker_threads');
      if (worker_threads.isMainThread === false) {
        installHandler = false;
      }
    } catch(e) {}

    // Provide the option to not install the uncaught exception handler. This is
    // to support other uncaught exception handlers (in test frameworks, for
    // example). If this handler is not installed and there are no other uncaught
    // exception handlers, uncaught exceptions will be caught by node's built-in
    // exception handler and the process will still be terminated. However, the
    // generated JavaScript code will be shown above the stack trace instead of
    // the original source code.
    if (installHandler && hasGlobalProcessEventEmitter()) {
      uncaughtShimInstalled = true;
      shimEmitUncaughtException();
    }
  }
};

exports.resetRetrieveHandlers = function() {
  retrieveFileHandlers.length = 0;
  retrieveMapHandlers.length = 0;

  retrieveFileHandlers = originalRetrieveFileHandlers.slice(0);
  retrieveMapHandlers = originalRetrieveMapHandlers.slice(0);

  retrieveSourceMap = handlerExec(retrieveMapHandlers);
  retrieveFile = handlerExec(retrieveFileHandlers);
}

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
/*
Copyright spdx-correct.js contributors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
var parse = require('spdx-expression-parse')
var spdxLicenseIds = require('spdx-license-ids')

function valid (string) {
  try {
    parse(string)
    return true
  } catch (error) {
    return false
  }
}

// Common transpositions of license identifier acronyms
var transpositions = [
  ['APGL', 'AGPL'],
  ['Gpl', 'GPL'],
  ['GLP', 'GPL'],
  ['APL', 'Apache'],
  ['ISD', 'ISC'],
  ['GLP', 'GPL'],
  ['IST', 'ISC'],
  ['Claude', 'Clause'],
  [' or later', '+'],
  [' International', ''],
  ['GNU', 'GPL'],
  ['GUN', 'GPL'],
  ['+', ''],
  ['GNU GPL', 'GPL'],
  ['GNU/GPL', 'GPL'],
  ['GNU GLP', 'GPL'],
  ['GNU General Public License', 'GPL'],
  ['Gnu public license', 'GPL'],
  ['GNU Public License', 'GPL'],
  ['GNU GENERAL PUBLIC LICENSE', 'GPL'],
  ['MTI', 'MIT'],
  ['Mozilla Public License', 'MPL'],
  ['Universal Permissive License', 'UPL'],
  ['WTH', 'WTF'],
  ['-License', '']
]

var TRANSPOSED = 0
var CORRECT = 1

// Simple corrections to nearly valid identifiers.
var transforms = [
  // e.g. 'mit'
  function (argument) {
    return argument.toUpperCase()
  },
  // e.g. 'MIT '
  function (argument) {
    return argument.trim()
  },
  // e.g. 'M.I.T.'
  function (argument) {
    return argument.replace(/\./g, '')
  },
  // e.g. 'Apache- 2.0'
  function (argument) {
    return argument.replace(/\s+/g, '')
  },
  // e.g. 'CC BY 4.0''
  function (argument) {
    return argument.replace(/\s+/g, '-')
  },
  // e.g. 'LGPLv2.1'
  function (argument) {
    return argument.replace('v', '-')
  },
  // e.g. 'Apache 2.0'
  function (argument) {
    return argument.replace(/,?\s*(\d)/, '-$1')
  },
  // e.g. 'GPL 2'
  function (argument) {
    return argument.replace(/,?\s*(\d)/, '-$1.0')
  },
  // e.g. 'Apache Version 2.0'
  function (argument) {
    return argument
      .replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2')
  },
  // e.g. 'Apache Version 2'
  function (argument) {
    return argument
      .replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2.0')
  },
  // e.g. 'ZLIB'
  function (argument) {
    return argument[0].toUpperCase() + argument.slice(1)
  },
  // e.g. 'MPL/2.0'
  function (argument) {
    return argument.replace('/', '-')
  },
  // e.g. 'Apache 2'
  function (argument) {
    return argument
      .replace(/\s*V\s*(\d)/, '-$1')
      .replace(/(\d)$/, '$1.0')
  },
  // e.g. 'GPL-2.0', 'GPL-3.0'
  function (argument) {
    if (argument.indexOf('3.0') !== -1) {
      return argument + '-or-later'
    } else {
      return argument + '-only'
    }
  },
  // e.g. 'GPL-2.0-'
  function (argument) {
    return argument + 'only'
  },
  // e.g. 'GPL2'
  function (argument) {
    return argument.replace(/(\d)$/, '-$1.0')
  },
  // e.g. 'BSD 3'
  function (argument) {
    return argument.replace(/(-| )?(\d)$/, '-$2-Clause')
  },
  // e.g. 'BSD clause 3'
  function (argument) {
    return argument.replace(/(-| )clause(-| )(\d)/, '-$3-Clause')
  },
  // e.g. 'New BSD license'
  function (argument) {
    return argument.replace(/\b(Modified|New|Revised)(-| )?BSD((-| )License)?/i, 'BSD-3-Clause')
  },
  // e.g. 'Simplified BSD license'
  function (argument) {
    return argument.replace(/\bSimplified(-| )?BSD((-| )License)?/i, 'BSD-2-Clause')
  },
  // e.g. 'Free BSD license'
  function (argument) {
    return argument.replace(/\b(Free|Net)(-| )?BSD((-| )License)?/i, 'BSD-2-Clause-$1BSD')
  },
  // e.g. 'Clear BSD license'
  function (argument) {
    return argument.replace(/\bClear(-| )?BSD((-| )License)?/i, 'BSD-3-Clause-Clear')
  },
  // e.g. 'Old BSD License'
  function (argument) {
    return argument.replace(/\b(Old|Original)(-| )?BSD((-| )License)?/i, 'BSD-4-Clause')
  },
  // e.g. 'BY-NC-4.0'
  function (argument) {
    return 'CC-' + argument
  },
  // e.g. 'BY-NC'
  function (argument) {
    return 'CC-' + argument + '-4.0'
  },
  // e.g. 'Attribution-NonCommercial'
  function (argument) {
    return argument
      .replace('Attribution', 'BY')
      .replace('NonCommercial', 'NC')
      .replace('NoDerivatives', 'ND')
      .replace(/ (\d)/, '-$1')
      .replace(/ ?International/, '')
  },
  // e.g. 'Attribution-NonCommercial'
  function (argument) {
    return 'CC-' +
      argument
        .replace('Attribution', 'BY')
        .replace('NonCommercial', 'NC')
        .replace('NoDerivatives', 'ND')
        .replace(/ (\d)/, '-$1')
        .replace(/ ?International/, '') +
      '-4.0'
  }
]

var licensesWithVersions = spdxLicenseIds
  .map(function (id) {
    var match = /^(.*)-\d+\.\d+$/.exec(id)
    return match
      ? [match[0], match[1]]
      : [id, null]
  })
  .reduce(function (objectMap, item) {
    var key = item[1]
    objectMap[key] = objectMap[key] || []
    objectMap[key].push(item[0])
    return objectMap
  }, {})

var licensesWithOneVersion = Object.keys(licensesWithVersions)
  .map(function makeEntries (key) {
    return [key, licensesWithVersions[key]]
  })
  .filter(function identifySoleVersions (item) {
    return (
      // Licenses has just one valid version suffix.
      item[1].length === 1 &&
      item[0] !== null &&
      // APL will be considered Apache, rather than APL-1.0
      item[0] !== 'APL'
    )
  })
  .map(function createLastResorts (item) {
    return [item[0], item[1][0]]
  })

licensesWithVersions = undefined

// If all else fails, guess that strings containing certain substrings
// meant to identify certain licenses.
var lastResorts = [
  ['UNLI', 'Unlicense'],
  ['WTF', 'WTFPL'],
  ['2 CLAUSE', 'BSD-2-Clause'],
  ['2-CLAUSE', 'BSD-2-Clause'],
  ['3 CLAUSE', 'BSD-3-Clause'],
  ['3-CLAUSE', 'BSD-3-Clause'],
  ['AFFERO', 'AGPL-3.0-or-later'],
  ['AGPL', 'AGPL-3.0-or-later'],
  ['APACHE', 'Apache-2.0'],
  ['ARTISTIC', 'Artistic-2.0'],
  ['Affero', 'AGPL-3.0-or-later'],
  ['BEER', 'Beerware'],
  ['BOOST', 'BSL-1.0'],
  ['BSD', 'BSD-2-Clause'],
  ['CDDL', 'CDDL-1.1'],
  ['ECLIPSE', 'EPL-1.0'],
  ['FUCK', 'WTFPL'],
  ['GNU', 'GPL-3.0-or-later'],
  ['LGPL', 'LGPL-3.0-or-later'],
  ['GPLV1', 'GPL-1.0-only'],
  ['GPL-1', 'GPL-1.0-only'],
  ['GPLV2', 'GPL-2.0-only'],
  ['GPL-2', 'GPL-2.0-only'],
  ['GPL', 'GPL-3.0-or-later'],
  ['MIT +NO-FALSE-ATTRIBS', 'MITNFA'],
  ['MIT', 'MIT'],
  ['MPL', 'MPL-2.0'],
  ['X11', 'X11'],
  ['ZLIB', 'Zlib']
].concat(licensesWithOneVersion)

var SUBSTRING = 0
var IDENTIFIER = 1

var validTransformation = function (identifier) {
  for (var i = 0; i < transforms.length; i++) {
    var transformed = transforms[i](identifier).trim()
    if (transformed !== identifier && valid(transformed)) {
      return transformed
    }
  }
  return null
}

var validLastResort = function (identifier) {
  var upperCased = identifier.toUpperCase()
  for (var i = 0; i < lastResorts.length; i++) {
    var lastResort = lastResorts[i]
    if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) {
      return lastResort[IDENTIFIER]
    }
  }
  return null
}

var anyCorrection = function (identifier, check) {
  for (var i = 0; i < transpositions.length; i++) {
    var transposition = transpositions[i]
    var transposed = transposition[TRANSPOSED]
    if (identifier.indexOf(transposed) > -1) {
      var corrected = identifier.replace(
        transposed,
        transposition[CORRECT]
      )
      var checked = check(corrected)
      if (checked !== null) {
        return checked
      }
    }
  }
  return null
}

module.exports = function (identifier, options) {
  options = options || {}
  var upgrade = options.upgrade === undefined ? true : !!options.upgrade
  function postprocess (value) {
    return upgrade ? upgradeGPLs(value) : value
  }
  var validArugment = (
    typeof identifier === 'string' &&
    identifier.trim().length !== 0
  )
  if (!validArugment) {
    throw Error('Invalid argument. Expected non-empty string.')
  }
  identifier = identifier.trim()
  if (valid(identifier)) {
    return postprocess(identifier)
  }
  var noPlus = identifier.replace(/\+$/, '').trim()
  if (valid(noPlus)) {
    return postprocess(noPlus)
  }
  var transformed = validTransformation(identifier)
  if (transformed !== null) {
    return postprocess(transformed)
  }
  transformed = anyCorrection(identifier, function (argument) {
    if (valid(argument)) {
      return argument
    }
    return validTransformation(argument)
  })
  if (transformed !== null) {
    return postprocess(transformed)
  }
  transformed = validLastResort(identifier)
  if (transformed !== null) {
    return postprocess(transformed)
  }
  transformed = anyCorrection(identifier, validLastResort)
  if (transformed !== null) {
    return postprocess(transformed)
  }
  return null
}

function upgradeGPLs (value) {
  if ([
    'GPL-1.0', 'LGPL-1.0', 'AGPL-1.0',
    'GPL-2.0', 'LGPL-2.0', 'AGPL-2.0',
    'LGPL-2.1'
  ].indexOf(value) !== -1) {
    return value + '-only'
  } else if ([
    'GPL-1.0+', 'GPL-2.0+', 'GPL-3.0+',
    'LGPL-2.0+', 'LGPL-2.1+', 'LGPL-3.0+',
    'AGPL-1.0+', 'AGPL-3.0+'
  ].indexOf(value) !== -1) {
    return value.replace(/\+$/, '-or-later')
  } else if (['GPL-3.0', 'LGPL-3.0', 'AGPL-3.0'].indexOf(value) !== -1) {
    return value + '-or-later'
  } else {
    return value
  }
}
{
  "author": {
    "name": "Kyle E. Mitchell",
    "email": "kyle@kemitchell.com",
    "url": "https://kemitchell.com"
  },
  "dependencies": {
    "spdx-expression-parse": "^3.0.0",
    "spdx-license-ids": "^3.0.0"
  },
  "deprecated": false,
  "description": "correct invalid SPDX expressions",
  "devDependencies": {
    "defence-cli": "^2.0.1",
    "replace-require-self": "^1.0.0",
    "standard": "^11.0.0",
    "standard-markdown": "^4.0.2",
    "tape": "^4.9.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/jslicense/spdx-correct.js#readme",
  "license": "Apache-2.0",
  "name": "spdx-correct",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jslicense/spdx-correct.js.git"
  },
  "version": "3.1.1"
}[
  "389-exception",
  "Autoconf-exception-2.0",
  "Autoconf-exception-3.0",
  "Bison-exception-2.2",
  "Bootloader-exception",
  "Classpath-exception-2.0",
  "CLISP-exception-2.0",
  "DigiRule-FOSS-exception",
  "eCos-exception-2.0",
  "Fawkes-Runtime-exception",
  "FLTK-exception",
  "Font-exception-2.0",
  "freertos-exception-2.0",
  "GCC-exception-2.0",
  "GCC-exception-3.1",
  "gnu-javamail-exception",
  "GPL-3.0-linking-exception",
  "GPL-3.0-linking-source-exception",
  "GPL-CC-1.0",
  "i2p-gpl-java-exception",
  "Libtool-exception",
  "Linux-syscall-note",
  "LLVM-exception",
  "LZMA-exception",
  "mif-exception",
  "Nokia-Qt-exception-1.1",
  "OCaml-LGPL-linking-exception",
  "OCCT-exception-1.0",
  "OpenJDK-assembly-exception-1.0",
  "openvpn-openssl-exception",
  "PS-or-PDF-font-exception-20170817",
  "Qt-GPL-exception-1.0",
  "Qt-LGPL-exception-1.1",
  "Qwt-exception-1.0",
  "Swift-exception",
  "u-boot-exception-2.0",
  "Universal-FOSS-exception-1.0",
  "WxWindows-exception-3.1"
]
{
  "author": {
    "name": "The Linux Foundation"
  },
  "deprecated": false,
  "description": "list of SPDX standard license exceptions",
  "files": [
    "index.json"
  ],
  "homepage": "https://github.com/kemitchell/spdx-exceptions.json#readme",
  "license": "CC-BY-3.0",
  "name": "spdx-exceptions",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/kemitchell/spdx-exceptions.json.git"
  },
  "version": "2.3.0"
}C. Scott Ananian <cscott@cscott.net> (http://cscott.net)
Kyle E. Mitchell <kyle@kemitchell.com> (https://kemitchell.com)
Shinnosuke Watanabe <snnskwtnb@gmail.com>
Antoine Motet <antoine.motet@gmail.com>
The MIT License

Copyright (c) 2015 Kyle E. Mitchell & other authors listed in AUTHORS

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict'

var scan = require('./scan')
var parse = require('./parse')

module.exports = function (source) {
  return parse(scan(source))
}
{
  "author": {
    "name": "Kyle E. Mitchell",
    "email": "kyle@kemitchell.com",
    "url": "https://kemitchell.com"
  },
  "dependencies": {
    "spdx-exceptions": "^2.1.0",
    "spdx-license-ids": "^3.0.0"
  },
  "deprecated": false,
  "description": "parse SPDX license expressions",
  "devDependencies": {
    "defence-cli": "^3.0.1",
    "replace-require-self": "^1.0.0",
    "standard": "^14.1.0"
  },
  "files": [
    "AUTHORS",
    "index.js",
    "parse.js",
    "scan.js"
  ],
  "homepage": "https://github.com/jslicense/spdx-expression-parse.js#readme",
  "license": "MIT",
  "name": "spdx-expression-parse",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jslicense/spdx-expression-parse.js.git"
  },
  "version": "3.0.1"
}'use strict'

// The ABNF grammar in the spec is totally ambiguous.
//
// This parser follows the operator precedence defined in the
// `Order of Precedence and Parentheses` section.

module.exports = function (tokens) {
  var index = 0

  function hasMore () {
    return index < tokens.length
  }

  function token () {
    return hasMore() ? tokens[index] : null
  }

  function next () {
    if (!hasMore()) {
      throw new Error()
    }
    index++
  }

  function parseOperator (operator) {
    var t = token()
    if (t && t.type === 'OPERATOR' && operator === t.string) {
      next()
      return t.string
    }
  }

  function parseWith () {
    if (parseOperator('WITH')) {
      var t = token()
      if (t && t.type === 'EXCEPTION') {
        next()
        return t.string
      }
      throw new Error('Expected exception after `WITH`')
    }
  }

  function parseLicenseRef () {
    // TODO: Actually, everything is concatenated into one string
    // for backward-compatibility but it could be better to return
    // a nice structure.
    var begin = index
    var string = ''
    var t = token()
    if (t.type === 'DOCUMENTREF') {
      next()
      string += 'DocumentRef-' + t.string + ':'
      if (!parseOperator(':')) {
        throw new Error('Expected `:` after `DocumentRef-...`')
      }
    }
    t = token()
    if (t.type === 'LICENSEREF') {
      next()
      string += 'LicenseRef-' + t.string
      return { license: string }
    }
    index = begin
  }

  function parseLicense () {
    var t = token()
    if (t && t.type === 'LICENSE') {
      next()
      var node = { license: t.string }
      if (parseOperator('+')) {
        node.plus = true
      }
      var exception = parseWith()
      if (exception) {
        node.exception = exception
      }
      return node
    }
  }

  function parseParenthesizedExpression () {
    var left = parseOperator('(')
    if (!left) {
      return
    }

    var expr = parseExpression()

    if (!parseOperator(')')) {
      throw new Error('Expected `)`')
    }

    return expr
  }

  function parseAtom () {
    return (
      parseParenthesizedExpression() ||
      parseLicenseRef() ||
      parseLicense()
    )
  }

  function makeBinaryOpParser (operator, nextParser) {
    return function parseBinaryOp () {
      var left = nextParser()
      if (!left) {
        return
      }

      if (!parseOperator(operator)) {
        return left
      }

      var right = parseBinaryOp()
      if (!right) {
        throw new Error('Expected expression')
      }
      return {
        left: left,
        conjunction: operator.toLowerCase(),
        right: right
      }
    }
  }

  var parseAnd = makeBinaryOpParser('AND', parseAtom)
  var parseExpression = makeBinaryOpParser('OR', parseAnd)

  var node = parseExpression()
  if (!node || hasMore()) {
    throw new Error('Syntax error')
  }
  return node
}
'use strict'

var licenses = []
  .concat(require('spdx-license-ids'))
  .concat(require('spdx-license-ids/deprecated'))
var exceptions = require('spdx-exceptions')

module.exports = function (source) {
  var index = 0

  function hasMore () {
    return index < source.length
  }

  // `value` can be a regexp or a string.
  // If it is recognized, the matching source string is returned and
  // the index is incremented. Otherwise `undefined` is returned.
  function read (value) {
    if (value instanceof RegExp) {
      var chars = source.slice(index)
      var match = chars.match(value)
      if (match) {
        index += match[0].length
        return match[0]
      }
    } else {
      if (source.indexOf(value, index) === index) {
        index += value.length
        return value
      }
    }
  }

  function skipWhitespace () {
    read(/[ ]*/)
  }

  function operator () {
    var string
    var possibilities = ['WITH', 'AND', 'OR', '(', ')', ':', '+']
    for (var i = 0; i < possibilities.length; i++) {
      string = read(possibilities[i])
      if (string) {
        break
      }
    }

    if (string === '+' && index > 1 && source[index - 2] === ' ') {
      throw new Error('Space before `+`')
    }

    return string && {
      type: 'OPERATOR',
      string: string
    }
  }

  function idstring () {
    return read(/[A-Za-z0-9-.]+/)
  }

  function expectIdstring () {
    var string = idstring()
    if (!string) {
      throw new Error('Expected idstring at offset ' + index)
    }
    return string
  }

  function documentRef () {
    if (read('DocumentRef-')) {
      var string = expectIdstring()
      return { type: 'DOCUMENTREF', string: string }
    }
  }

  function licenseRef () {
    if (read('LicenseRef-')) {
      var string = expectIdstring()
      return { type: 'LICENSEREF', string: string }
    }
  }

  function identifier () {
    var begin = index
    var string = idstring()

    if (licenses.indexOf(string) !== -1) {
      return {
        type: 'LICENSE',
        string: string
      }
    } else if (exceptions.indexOf(string) !== -1) {
      return {
        type: 'EXCEPTION',
        string: string
      }
    }

    index = begin
  }

  // Tries to read the next token. Returns `undefined` if no token is
  // recognized.
  function parseToken () {
    // Ordering matters
    return (
      operator() ||
      documentRef() ||
      licenseRef() ||
      identifier()
    )
  }

  var tokens = []
  while (hasMore()) {
    skipWhitespace()
    if (!hasMore()) {
      break
    }

    var token = parseToken()
    if (!token) {
      throw new Error('Unexpected `' + source[index] +
                      '` at offset ' + index)
    }

    tokens.push(token)
  }
  return tokens
}
[
	"AGPL-1.0",
	"AGPL-3.0",
	"BSD-2-Clause-FreeBSD",
	"BSD-2-Clause-NetBSD",
	"GFDL-1.1",
	"GFDL-1.2",
	"GFDL-1.3",
	"GPL-1.0",
	"GPL-2.0",
	"GPL-2.0-with-GCC-exception",
	"GPL-2.0-with-autoconf-exception",
	"GPL-2.0-with-bison-exception",
	"GPL-2.0-with-classpath-exception",
	"GPL-2.0-with-font-exception",
	"GPL-3.0",
	"GPL-3.0-with-GCC-exception",
	"GPL-3.0-with-autoconf-exception",
	"LGPL-2.0",
	"LGPL-2.1",
	"LGPL-3.0",
	"Nunit",
	"StandardML-NJ",
	"eCos-2.0",
	"wxWindows"
]
[
	"0BSD",
	"AAL",
	"ADSL",
	"AFL-1.1",
	"AFL-1.2",
	"AFL-2.0",
	"AFL-2.1",
	"AFL-3.0",
	"AGPL-1.0-only",
	"AGPL-1.0-or-later",
	"AGPL-3.0-only",
	"AGPL-3.0-or-later",
	"AMDPLPA",
	"AML",
	"AMPAS",
	"ANTLR-PD",
	"APAFML",
	"APL-1.0",
	"APSL-1.0",
	"APSL-1.1",
	"APSL-1.2",
	"APSL-2.0",
	"Abstyles",
	"Adobe-2006",
	"Adobe-Glyph",
	"Afmparse",
	"Aladdin",
	"Apache-1.0",
	"Apache-1.1",
	"Apache-2.0",
	"Artistic-1.0",
	"Artistic-1.0-Perl",
	"Artistic-1.0-cl8",
	"Artistic-2.0",
	"BSD-1-Clause",
	"BSD-2-Clause",
	"BSD-2-Clause-Patent",
	"BSD-2-Clause-Views",
	"BSD-3-Clause",
	"BSD-3-Clause-Attribution",
	"BSD-3-Clause-Clear",
	"BSD-3-Clause-LBNL",
	"BSD-3-Clause-No-Nuclear-License",
	"BSD-3-Clause-No-Nuclear-License-2014",
	"BSD-3-Clause-No-Nuclear-Warranty",
	"BSD-3-Clause-Open-MPI",
	"BSD-4-Clause",
	"BSD-4-Clause-UC",
	"BSD-Protection",
	"BSD-Source-Code",
	"BSL-1.0",
	"Bahyph",
	"Barr",
	"Beerware",
	"BitTorrent-1.0",
	"BitTorrent-1.1",
	"BlueOak-1.0.0",
	"Borceux",
	"CAL-1.0",
	"CAL-1.0-Combined-Work-Exception",
	"CATOSL-1.1",
	"CC-BY-1.0",
	"CC-BY-2.0",
	"CC-BY-2.5",
	"CC-BY-3.0",
	"CC-BY-3.0-AT",
	"CC-BY-4.0",
	"CC-BY-NC-1.0",
	"CC-BY-NC-2.0",
	"CC-BY-NC-2.5",
	"CC-BY-NC-3.0",
	"CC-BY-NC-4.0",
	"CC-BY-NC-ND-1.0",
	"CC-BY-NC-ND-2.0",
	"CC-BY-NC-ND-2.5",
	"CC-BY-NC-ND-3.0",
	"CC-BY-NC-ND-3.0-IGO",
	"CC-BY-NC-ND-4.0",
	"CC-BY-NC-SA-1.0",
	"CC-BY-NC-SA-2.0",
	"CC-BY-NC-SA-2.5",
	"CC-BY-NC-SA-3.0",
	"CC-BY-NC-SA-4.0",
	"CC-BY-ND-1.0",
	"CC-BY-ND-2.0",
	"CC-BY-ND-2.5",
	"CC-BY-ND-3.0",
	"CC-BY-ND-4.0",
	"CC-BY-SA-1.0",
	"CC-BY-SA-2.0",
	"CC-BY-SA-2.5",
	"CC-BY-SA-3.0",
	"CC-BY-SA-3.0-AT",
	"CC-BY-SA-4.0",
	"CC-PDDC",
	"CC0-1.0",
	"CDDL-1.0",
	"CDDL-1.1",
	"CDLA-Permissive-1.0",
	"CDLA-Sharing-1.0",
	"CECILL-1.0",
	"CECILL-1.1",
	"CECILL-2.0",
	"CECILL-2.1",
	"CECILL-B",
	"CECILL-C",
	"CERN-OHL-1.1",
	"CERN-OHL-1.2",
	"CERN-OHL-P-2.0",
	"CERN-OHL-S-2.0",
	"CERN-OHL-W-2.0",
	"CNRI-Jython",
	"CNRI-Python",
	"CNRI-Python-GPL-Compatible",
	"CPAL-1.0",
	"CPL-1.0",
	"CPOL-1.02",
	"CUA-OPL-1.0",
	"Caldera",
	"ClArtistic",
	"Condor-1.1",
	"Crossword",
	"CrystalStacker",
	"Cube",
	"D-FSL-1.0",
	"DOC",
	"DSDP",
	"Dotseqn",
	"ECL-1.0",
	"ECL-2.0",
	"EFL-1.0",
	"EFL-2.0",
	"EPICS",
	"EPL-1.0",
	"EPL-2.0",
	"EUDatagrid",
	"EUPL-1.0",
	"EUPL-1.1",
	"EUPL-1.2",
	"Entessa",
	"ErlPL-1.1",
	"Eurosym",
	"FSFAP",
	"FSFUL",
	"FSFULLR",
	"FTL",
	"Fair",
	"Frameworx-1.0",
	"FreeImage",
	"GFDL-1.1-invariants-only",
	"GFDL-1.1-invariants-or-later",
	"GFDL-1.1-no-invariants-only",
	"GFDL-1.1-no-invariants-or-later",
	"GFDL-1.1-only",
	"GFDL-1.1-or-later",
	"GFDL-1.2-invariants-only",
	"GFDL-1.2-invariants-or-later",
	"GFDL-1.2-no-invariants-only",
	"GFDL-1.2-no-invariants-or-later",
	"GFDL-1.2-only",
	"GFDL-1.2-or-later",
	"GFDL-1.3-invariants-only",
	"GFDL-1.3-invariants-or-later",
	"GFDL-1.3-no-invariants-only",
	"GFDL-1.3-no-invariants-or-later",
	"GFDL-1.3-only",
	"GFDL-1.3-or-later",
	"GL2PS",
	"GLWTPL",
	"GPL-1.0-only",
	"GPL-1.0-or-later",
	"GPL-2.0-only",
	"GPL-2.0-or-later",
	"GPL-3.0-only",
	"GPL-3.0-or-later",
	"Giftware",
	"Glide",
	"Glulxe",
	"HPND",
	"HPND-sell-variant",
	"HaskellReport",
	"Hippocratic-2.1",
	"IBM-pibs",
	"ICU",
	"IJG",
	"IPA",
	"IPL-1.0",
	"ISC",
	"ImageMagick",
	"Imlib2",
	"Info-ZIP",
	"Intel",
	"Intel-ACPI",
	"Interbase-1.0",
	"JPNIC",
	"JSON",
	"JasPer-2.0",
	"LAL-1.2",
	"LAL-1.3",
	"LGPL-2.0-only",
	"LGPL-2.0-or-later",
	"LGPL-2.1-only",
	"LGPL-2.1-or-later",
	"LGPL-3.0-only",
	"LGPL-3.0-or-later",
	"LGPLLR",
	"LPL-1.0",
	"LPL-1.02",
	"LPPL-1.0",
	"LPPL-1.1",
	"LPPL-1.2",
	"LPPL-1.3a",
	"LPPL-1.3c",
	"Latex2e",
	"Leptonica",
	"LiLiQ-P-1.1",
	"LiLiQ-R-1.1",
	"LiLiQ-Rplus-1.1",
	"Libpng",
	"Linux-OpenIB",
	"MIT",
	"MIT-0",
	"MIT-CMU",
	"MIT-advertising",
	"MIT-enna",
	"MIT-feh",
	"MITNFA",
	"MPL-1.0",
	"MPL-1.1",
	"MPL-2.0",
	"MPL-2.0-no-copyleft-exception",
	"MS-PL",
	"MS-RL",
	"MTLL",
	"MakeIndex",
	"MirOS",
	"Motosoto",
	"MulanPSL-1.0",
	"MulanPSL-2.0",
	"Multics",
	"Mup",
	"NASA-1.3",
	"NBPL-1.0",
	"NCGL-UK-2.0",
	"NCSA",
	"NGPL",
	"NIST-PD",
	"NIST-PD-fallback",
	"NLOD-1.0",
	"NLPL",
	"NOSL",
	"NPL-1.0",
	"NPL-1.1",
	"NPOSL-3.0",
	"NRL",
	"NTP",
	"NTP-0",
	"Naumen",
	"Net-SNMP",
	"NetCDF",
	"Newsletr",
	"Nokia",
	"Noweb",
	"O-UDA-1.0",
	"OCCT-PL",
	"OCLC-2.0",
	"ODC-By-1.0",
	"ODbL-1.0",
	"OFL-1.0",
	"OFL-1.0-RFN",
	"OFL-1.0-no-RFN",
	"OFL-1.1",
	"OFL-1.1-RFN",
	"OFL-1.1-no-RFN",
	"OGC-1.0",
	"OGL-Canada-2.0",
	"OGL-UK-1.0",
	"OGL-UK-2.0",
	"OGL-UK-3.0",
	"OGTSL",
	"OLDAP-1.1",
	"OLDAP-1.2",
	"OLDAP-1.3",
	"OLDAP-1.4",
	"OLDAP-2.0",
	"OLDAP-2.0.1",
	"OLDAP-2.1",
	"OLDAP-2.2",
	"OLDAP-2.2.1",
	"OLDAP-2.2.2",
	"OLDAP-2.3",
	"OLDAP-2.4",
	"OLDAP-2.5",
	"OLDAP-2.6",
	"OLDAP-2.7",
	"OLDAP-2.8",
	"OML",
	"OPL-1.0",
	"OSET-PL-2.1",
	"OSL-1.0",
	"OSL-1.1",
	"OSL-2.0",
	"OSL-2.1",
	"OSL-3.0",
	"OpenSSL",
	"PDDL-1.0",
	"PHP-3.0",
	"PHP-3.01",
	"PSF-2.0",
	"Parity-6.0.0",
	"Parity-7.0.0",
	"Plexus",
	"PolyForm-Noncommercial-1.0.0",
	"PolyForm-Small-Business-1.0.0",
	"PostgreSQL",
	"Python-2.0",
	"QPL-1.0",
	"Qhull",
	"RHeCos-1.1",
	"RPL-1.1",
	"RPL-1.5",
	"RPSL-1.0",
	"RSA-MD",
	"RSCPL",
	"Rdisc",
	"Ruby",
	"SAX-PD",
	"SCEA",
	"SGI-B-1.0",
	"SGI-B-1.1",
	"SGI-B-2.0",
	"SHL-0.5",
	"SHL-0.51",
	"SISSL",
	"SISSL-1.2",
	"SMLNJ",
	"SMPPL",
	"SNIA",
	"SPL-1.0",
	"SSH-OpenSSH",
	"SSH-short",
	"SSPL-1.0",
	"SWL",
	"Saxpath",
	"Sendmail",
	"Sendmail-8.23",
	"SimPL-2.0",
	"Sleepycat",
	"Spencer-86",
	"Spencer-94",
	"Spencer-99",
	"SugarCRM-1.1.3",
	"TAPR-OHL-1.0",
	"TCL",
	"TCP-wrappers",
	"TMate",
	"TORQUE-1.1",
	"TOSL",
	"TU-Berlin-1.0",
	"TU-Berlin-2.0",
	"UCL-1.0",
	"UPL-1.0",
	"Unicode-DFS-2015",
	"Unicode-DFS-2016",
	"Unicode-TOU",
	"Unlicense",
	"VOSTROM",
	"VSL-1.0",
	"Vim",
	"W3C",
	"W3C-19980720",
	"W3C-20150513",
	"WTFPL",
	"Watcom-1.0",
	"Wsuipa",
	"X11",
	"XFree86-1.1",
	"XSkat",
	"Xerox",
	"Xnet",
	"YPL-1.0",
	"YPL-1.1",
	"ZPL-1.1",
	"ZPL-2.0",
	"ZPL-2.1",
	"Zed",
	"Zend-2.0",
	"Zimbra-1.3",
	"Zimbra-1.4",
	"Zlib",
	"blessing",
	"bzip2-1.0.5",
	"bzip2-1.0.6",
	"copyleft-next-0.3.0",
	"copyleft-next-0.3.1",
	"curl",
	"diffmark",
	"dvipdfm",
	"eGenix",
	"etalab-2.0",
	"gSOAP-1.3b",
	"gnuplot",
	"iMatix",
	"libpng-2.0",
	"libselinux-1.0",
	"libtiff",
	"mpich2",
	"psfrag",
	"psutils",
	"xinetd",
	"xpp",
	"zlib-acknowledgement"
]
{
  "author": {
    "name": "Shinnosuke Watanabe",
    "url": "https://github.com/shinnn"
  },
  "deprecated": false,
  "description": "A list of SPDX license identifiers",
  "devDependencies": {
    "@shinnn/eslint-config": "^6.8.7",
    "chalk": "^2.4.1",
    "eslint": "^5.10.0",
    "get-spdx-license-ids": "^2.1.0",
    "rmfr": "^2.0.0",
    "tape": "^4.9.1"
  },
  "files": [
    "deprecated.json",
    "index.json"
  ],
  "homepage": "https://github.com/jslicense/spdx-license-ids#readme",
  "license": "CC0-1.0",
  "name": "spdx-license-ids",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jslicense/spdx-license-ids.git"
  },
  "version": "3.0.6"
}Copyright 2013 Mathias Buus

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
var tick = 1
var maxTick = 65535
var resolution = 4
var inc = function() {
  tick = (tick + 1) & maxTick
}

var timer = setInterval(inc, (1000 / resolution) | 0)
if (timer.unref) timer.unref()

module.exports = function(seconds) {
  var size = resolution * (seconds || 5)
  var buffer = [0]
  var pointer = 1
  var last = (tick-1) & maxTick

  return function(delta) {
    var dist = (tick - last) & maxTick
    if (dist > size) dist = size
    last = tick

    while (dist--) {
      if (pointer === size) pointer = 0
      buffer[pointer] = buffer[pointer === 0 ? size-1 : pointer-1]
      pointer++
    }

    if (delta) buffer[pointer-1] += delta

    var top = buffer[pointer-1]
    var btm = buffer.length < size ? 0 : buffer[pointer === size ? 0 : pointer]

    return buffer.length < resolution ? top : (top - btm) * resolution / buffer.length
  }
}{
  "author": {
    "name": "Mathias Buus Madsen",
    "email": "mathiasbuus@gmail.com"
  },
  "deprecated": false,
  "description": "simple speed measurement in javascript",
  "homepage": "https://github.com/mafintosh/speedometer#readme",
  "name": "speedometer",
  "repository": {
    "type": "git",
    "url": "git://github.com/mafintosh/speedometer.git"
  },
  "version": "0.1.4"
}Copyright (c) 2007-2014, Alexandru Marasteanu <hello [at) alexei (dot] ro>
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
  notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
  notice, this list of conditions and the following disclaimer in the
  documentation and/or other materials provided with the distribution.
* Neither the name of this software nor the names of its contributors may be
  used to endorse or promote products derived from this software without
  specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
  "name": "sprintf",
  "description": "JavaScript sprintf implementation",
  "version": "1.0.3",
  "main": "src/sprintf.js",
  "license": "BSD-3-Clause-Clear",
  "keywords": ["sprintf", "string", "formatting"],
  "authors": ["Alexandru Marasteanu <hello@alexei.ro> (http://alexei.ro/)"],
  "homepage": "https://github.com/alexei/sprintf.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/alexei/sprintf.js.git"
  }
}
module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON("package.json"),

        uglify: {
            options: {
                banner: "/*! <%= pkg.name %> | <%= pkg.author %> | <%= pkg.license %> */\n",
                sourceMap: true
            },
            build: {
                files: [
                    {
                        src: "src/sprintf.js",
                        dest: "dist/sprintf.min.js"
                    },
                    {
                        src: "src/angular-sprintf.js",
                        dest: "dist/angular-sprintf.min.js"
                    }
                ]
            }
        },

        watch: {
            js: {
                files: "src/*.js",
                tasks: ["uglify"]
            }
        }
    })

    grunt.loadNpmTasks("grunt-contrib-uglify")
    grunt.loadNpmTasks("grunt-contrib-watch")

    grunt.registerTask("default", ["uglify", "watch"])
}
{
  "author": {
    "name": "Alexandru Marasteanu",
    "email": "hello@alexei.ro",
    "url": "http://alexei.ro/"
  },
  "deprecated": false,
  "description": "JavaScript sprintf implementation",
  "devDependencies": {
    "grunt": "*",
    "grunt-contrib-uglify": "*",
    "grunt-contrib-watch": "*",
    "mocha": "*"
  },
  "homepage": "https://github.com/alexei/sprintf.js#readme",
  "license": "BSD-3-Clause",
  "main": "src/sprintf.js",
  "name": "sprintf-js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/alexei/sprintf.js.git"
  },
  "version": "1.0.3"
}angular.
    module("sprintf", []).
    filter("sprintf", function() {
        return function() {
            return sprintf.apply(null, arguments)
        }
    }).
    filter("fmt", ["$filter", function($filter) {
        return $filter("sprintf")
    }]).
    filter("vsprintf", function() {
        return function(format, argv) {
            return vsprintf(format, argv)
        }
    }).
    filter("vfmt", ["$filter", function($filter) {
        return $filter("vsprintf")
    }])
(function(window) {
    var re = {
        not_string: /[^s]/,
        number: /[diefg]/,
        json: /[j]/,
        not_json: /[^j]/,
        text: /^[^\x25]+/,
        modulo: /^\x25{2}/,
        placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijosuxX])/,
        key: /^([a-z_][a-z_\d]*)/i,
        key_access: /^\.([a-z_][a-z_\d]*)/i,
        index_access: /^\[(\d+)\]/,
        sign: /^[\+\-]/
    }

    function sprintf() {
        var key = arguments[0], cache = sprintf.cache
        if (!(cache[key] && cache.hasOwnProperty(key))) {
            cache[key] = sprintf.parse(key)
        }
        return sprintf.format.call(null, cache[key], arguments)
    }

    sprintf.format = function(parse_tree, argv) {
        var cursor = 1, tree_length = parse_tree.length, node_type = "", arg, output = [], i, k, match, pad, pad_character, pad_length, is_positive = true, sign = ""
        for (i = 0; i < tree_length; i++) {
            node_type = get_type(parse_tree[i])
            if (node_type === "string") {
                output[output.length] = parse_tree[i]
            }
            else if (node_type === "array") {
                match = parse_tree[i] // convenience purposes only
                if (match[2]) { // keyword argument
                    arg = argv[cursor]
                    for (k = 0; k < match[2].length; k++) {
                        if (!arg.hasOwnProperty(match[2][k])) {
                            throw new Error(sprintf("[sprintf] property '%s' does not exist", match[2][k]))
                        }
                        arg = arg[match[2][k]]
                    }
                }
                else if (match[1]) { // positional argument (explicit)
                    arg = argv[match[1]]
                }
                else { // positional argument (implicit)
                    arg = argv[cursor++]
                }

                if (get_type(arg) == "function") {
                    arg = arg()
                }

                if (re.not_string.test(match[8]) && re.not_json.test(match[8]) && (get_type(arg) != "number" && isNaN(arg))) {
                    throw new TypeError(sprintf("[sprintf] expecting number but found %s", get_type(arg)))
                }

                if (re.number.test(match[8])) {
                    is_positive = arg >= 0
                }

                switch (match[8]) {
                    case "b":
                        arg = arg.toString(2)
                    break
                    case "c":
                        arg = String.fromCharCode(arg)
                    break
                    case "d":
                    case "i":
                        arg = parseInt(arg, 10)
                    break
                    case "j":
                        arg = JSON.stringify(arg, null, match[6] ? parseInt(match[6]) : 0)
                    break
                    case "e":
                        arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential()
                    break
                    case "f":
                        arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg)
                    break
                    case "g":
                        arg = match[7] ? parseFloat(arg).toPrecision(match[7]) : parseFloat(arg)
                    break
                    case "o":
                        arg = arg.toString(8)
                    break
                    case "s":
                        arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg)
                    break
                    case "u":
                        arg = arg >>> 0
                    break
                    case "x":
                        arg = arg.toString(16)
                    break
                    case "X":
                        arg = arg.toString(16).toUpperCase()
                    break
                }
                if (re.json.test(match[8])) {
                    output[output.length] = arg
                }
                else {
                    if (re.number.test(match[8]) && (!is_positive || match[3])) {
                        sign = is_positive ? "+" : "-"
                        arg = arg.toString().replace(re.sign, "")
                    }
                    else {
                        sign = ""
                    }
                    pad_character = match[4] ? match[4] === "0" ? "0" : match[4].charAt(1) : " "
                    pad_length = match[6] - (sign + arg).length
                    pad = match[6] ? (pad_length > 0 ? str_repeat(pad_character, pad_length) : "") : ""
                    output[output.length] = match[5] ? sign + arg + pad : (pad_character === "0" ? sign + pad + arg : pad + sign + arg)
                }
            }
        }
        return output.join("")
    }

    sprintf.cache = {}

    sprintf.parse = function(fmt) {
        var _fmt = fmt, match = [], parse_tree = [], arg_names = 0
        while (_fmt) {
            if ((match = re.text.exec(_fmt)) !== null) {
                parse_tree[parse_tree.length] = match[0]
            }
            else if ((match = re.modulo.exec(_fmt)) !== null) {
                parse_tree[parse_tree.length] = "%"
            }
            else if ((match = re.placeholder.exec(_fmt)) !== null) {
                if (match[2]) {
                    arg_names |= 1
                    var field_list = [], replacement_field = match[2], field_match = []
                    if ((field_match = re.key.exec(replacement_field)) !== null) {
                        field_list[field_list.length] = field_match[1]
                        while ((replacement_field = replacement_field.substring(field_match[0].length)) !== "") {
                            if ((field_match = re.key_access.exec(replacement_field)) !== null) {
                                field_list[field_list.length] = field_match[1]
                            }
                            else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
                                field_list[field_list.length] = field_match[1]
                            }
                            else {
                                throw new SyntaxError("[sprintf] failed to parse named argument key")
                            }
                        }
                    }
                    else {
                        throw new SyntaxError("[sprintf] failed to parse named argument key")
                    }
                    match[2] = field_list
                }
                else {
                    arg_names |= 2
                }
                if (arg_names === 3) {
                    throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported")
                }
                parse_tree[parse_tree.length] = match
            }
            else {
                throw new SyntaxError("[sprintf] unexpected placeholder")
            }
            _fmt = _fmt.substring(match[0].length)
        }
        return parse_tree
    }

    var vsprintf = function(fmt, argv, _argv) {
        _argv = (argv || []).slice(0)
        _argv.splice(0, 0, fmt)
        return sprintf.apply(null, _argv)
    }

    /**
     * helpers
     */
    function get_type(variable) {
        return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase()
    }

    function str_repeat(input, multiplier) {
        return Array(multiplier + 1).join(input)
    }

    /**
     * export to either browser or node.js
     */
    if (typeof exports !== "undefined") {
        exports.sprintf = sprintf
        exports.vsprintf = vsprintf
    }
    else {
        window.sprintf = sprintf
        window.vsprintf = vsprintf

        if (typeof define === "function" && define.amd) {
            define(function() {
                return {
                    sprintf: sprintf,
                    vsprintf: vsprintf
                }
            })
        }
    }
})(typeof window === "undefined" ? this : window);
/*! sprintf-js | Alexandru Marasteanu <hello@alexei.ro> (http://alexei.ro/) | BSD-3-Clause */

angular.module("sprintf",[]).filter("sprintf",function(){return function(){return sprintf.apply(null,arguments)}}).filter("fmt",["$filter",function(a){return a("sprintf")}]).filter("vsprintf",function(){return function(a,b){return vsprintf(a,b)}}).filter("vfmt",["$filter",function(a){return a("vsprintf")}]);
//# sourceMappingURL=angular-sprintf.min.map{"version":3,"file":"angular-sprintf.min.js","sources":["../src/angular-sprintf.js"],"names":["angular","module","filter","sprintf","apply","arguments","$filter","format","argv","vsprintf"],"mappings":";;AAAAA,QACIC,OAAO,cACPC,OAAO,UAAW,WACd,MAAO,YACH,MAAOC,SAAQC,MAAM,KAAMC,cAGnCH,OAAO,OAAQ,UAAW,SAASI,GAC/B,MAAOA,GAAQ,cAEnBJ,OAAO,WAAY,WACf,MAAO,UAASK,EAAQC,GACpB,MAAOC,UAASF,EAAQC,MAGhCN,OAAO,QAAS,UAAW,SAASI,GAChC,MAAOA,GAAQ"}{"version":3,"file":"angular-sprintf.min.js","sources":["../src/angular-sprintf.js"],"names":["angular","module","filter","sprintf","apply","arguments","$filter","format","argv","vsprintf"],"mappings":";;AAAAA,QACIC,OAAO,cACPC,OAAO,UAAW,WACd,MAAO,YACH,MAAOC,SAAQC,MAAM,KAAMC,cAGnCH,OAAO,OAAQ,UAAW,SAASI,GAC/B,MAAOA,GAAQ,cAEnBJ,OAAO,WAAY,WACf,MAAO,UAASK,EAAQC,GACpB,MAAOC,UAASF,EAAQC,MAGhCN,OAAO,QAAS,UAAW,SAASI,GAChC,MAAOA,GAAQ"}/*! sprintf-js | Alexandru Marasteanu <hello@alexei.ro> (http://alexei.ro/) | BSD-3-Clause */

!function(a){function b(){var a=arguments[0],c=b.cache;return c[a]&&c.hasOwnProperty(a)||(c[a]=b.parse(a)),b.format.call(null,c[a],arguments)}function c(a){return Object.prototype.toString.call(a).slice(8,-1).toLowerCase()}function d(a,b){return Array(b+1).join(a)}var e={not_string:/[^s]/,number:/[diefg]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijosuxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[\+\-]/};b.format=function(a,f){var g,h,i,j,k,l,m,n=1,o=a.length,p="",q=[],r=!0,s="";for(h=0;o>h;h++)if(p=c(a[h]),"string"===p)q[q.length]=a[h];else if("array"===p){if(j=a[h],j[2])for(g=f[n],i=0;i<j[2].length;i++){if(!g.hasOwnProperty(j[2][i]))throw new Error(b("[sprintf] property '%s' does not exist",j[2][i]));g=g[j[2][i]]}else g=j[1]?f[j[1]]:f[n++];if("function"==c(g)&&(g=g()),e.not_string.test(j[8])&&e.not_json.test(j[8])&&"number"!=c(g)&&isNaN(g))throw new TypeError(b("[sprintf] expecting number but found %s",c(g)));switch(e.number.test(j[8])&&(r=g>=0),j[8]){case"b":g=g.toString(2);break;case"c":g=String.fromCharCode(g);break;case"d":case"i":g=parseInt(g,10);break;case"j":g=JSON.stringify(g,null,j[6]?parseInt(j[6]):0);break;case"e":g=j[7]?g.toExponential(j[7]):g.toExponential();break;case"f":g=j[7]?parseFloat(g).toFixed(j[7]):parseFloat(g);break;case"g":g=j[7]?parseFloat(g).toPrecision(j[7]):parseFloat(g);break;case"o":g=g.toString(8);break;case"s":g=(g=String(g))&&j[7]?g.substring(0,j[7]):g;break;case"u":g>>>=0;break;case"x":g=g.toString(16);break;case"X":g=g.toString(16).toUpperCase()}e.json.test(j[8])?q[q.length]=g:(!e.number.test(j[8])||r&&!j[3]?s="":(s=r?"+":"-",g=g.toString().replace(e.sign,"")),l=j[4]?"0"===j[4]?"0":j[4].charAt(1):" ",m=j[6]-(s+g).length,k=j[6]&&m>0?d(l,m):"",q[q.length]=j[5]?s+g+k:"0"===l?s+k+g:k+s+g)}return q.join("")},b.cache={},b.parse=function(a){for(var b=a,c=[],d=[],f=0;b;){if(null!==(c=e.text.exec(b)))d[d.length]=c[0];else if(null!==(c=e.modulo.exec(b)))d[d.length]="%";else{if(null===(c=e.placeholder.exec(b)))throw new SyntaxError("[sprintf] unexpected placeholder");if(c[2]){f|=1;var g=[],h=c[2],i=[];if(null===(i=e.key.exec(h)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(g[g.length]=i[1];""!==(h=h.substring(i[0].length));)if(null!==(i=e.key_access.exec(h)))g[g.length]=i[1];else{if(null===(i=e.index_access.exec(h)))throw new SyntaxError("[sprintf] failed to parse named argument key");g[g.length]=i[1]}c[2]=g}else f|=2;if(3===f)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");d[d.length]=c}b=b.substring(c[0].length)}return d};var f=function(a,c,d){return d=(c||[]).slice(0),d.splice(0,0,a),b.apply(null,d)};"undefined"!=typeof exports?(exports.sprintf=b,exports.vsprintf=f):(a.sprintf=b,a.vsprintf=f,"function"==typeof define&&define.amd&&define(function(){return{sprintf:b,vsprintf:f}}))}("undefined"==typeof window?this:window);
//# sourceMappingURL=sprintf.min.map{"version":3,"file":"sprintf.min.js","sources":["../src/sprintf.js"],"names":["window","sprintf","key","arguments","cache","hasOwnProperty","parse","format","call","get_type","variable","Object","prototype","toString","slice","toLowerCase","str_repeat","input","multiplier","Array","join","re","not_string","number","json","not_json","text","modulo","placeholder","key_access","index_access","sign","parse_tree","argv","arg","i","k","match","pad","pad_character","pad_length","cursor","tree_length","length","node_type","output","is_positive","Error","test","isNaN","TypeError","String","fromCharCode","parseInt","JSON","stringify","toExponential","parseFloat","toFixed","substring","toUpperCase","replace","charAt","fmt","_fmt","arg_names","exec","SyntaxError","field_list","replacement_field","field_match","vsprintf","_argv","splice","apply","exports","define","amd","this"],"mappings":"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"}{"version":3,"file":"sprintf.min.js","sources":["../src/sprintf.js"],"names":["window","sprintf","key","arguments","cache","hasOwnProperty","parse","format","call","get_type","variable","Object","prototype","toString","slice","toLowerCase","str_repeat","input","multiplier","Array","join","re","not_string","number","json","not_json","text","modulo","placeholder","key_access","index_access","sign","parse_tree","argv","arg","i","k","match","pad","pad_character","pad_length","cursor","tree_length","length","node_type","output","is_positive","Error","test","isNaN","TypeError","String","fromCharCode","parseInt","JSON","stringify","toExponential","parseFloat","toFixed","toPrecision","substring","toUpperCase","replace","charAt","fmt","_fmt","arg_names","exec","SyntaxError","field_list","replacement_field","field_match","vsprintf","_argv","splice","apply","exports","define","amd","this"],"mappings":"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"}<!doctype html>
<html ng-app="app">
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-rc.3/angular.min.js"></script>
    <script src="../src/sprintf.js"></script>
    <script src="../src/angular-sprintf.js"></script>
</head>
<body>
    <pre>{{ "%+010d"|sprintf:-123 }}</pre>
    <pre>{{ "%+010d"|vsprintf:[-123] }}</pre>
    <pre>{{ "%+010d"|fmt:-123 }}</pre>
    <pre>{{ "%+010d"|vfmt:[-123] }}</pre>
    <pre>{{ "I've got %2$d apples and %1$d oranges."|fmt:4:2 }}</pre>
    <pre>{{ "I've got %(apples)d apples and %(oranges)d oranges."|fmt:{apples: 2, oranges: 4} }}</pre>

    <script>
        angular.module("app", ["sprintf"])
    </script>
</body>
</html>
Copyright Joyent, Inc. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
{
  "author": {
    "name": "Joyent, Inc"
  },
  "bin": {
    "sshpk-conv": "bin/sshpk-conv",
    "sshpk-sign": "bin/sshpk-sign",
    "sshpk-verify": "bin/sshpk-verify"
  },
  "dependencies": {
    "asn1": "~0.2.3",
    "assert-plus": "^1.0.0",
    "bcrypt-pbkdf": "^1.0.0",
    "dashdash": "^1.12.0",
    "ecc-jsbn": "~0.1.1",
    "getpass": "^0.1.1",
    "jsbn": "~0.1.0",
    "safer-buffer": "^2.0.2",
    "tweetnacl": "~0.14.0"
  },
  "deprecated": false,
  "description": "A library for finding and using SSH public keys",
  "devDependencies": {
    "benchmark": "^1.0.0",
    "sinon": "^1.17.2",
    "tape": "^3.5.0",
    "temp": "^0.8.2"
  },
  "directories": {
    "bin": "./bin",
    "lib": "./lib",
    "man": "./man/man1"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "homepage": "https://github.com/arekinath/node-sshpk#readme",
  "license": "MIT",
  "main": "lib/index.js",
  "man": [
    "/mnt/data/kiwi/android-light/cordova/platforms/electron/www/node_modules/sshpk/man/man1/sshpk-conv.1",
    "/mnt/data/kiwi/android-light/cordova/platforms/electron/www/node_modules/sshpk/man/man1/sshpk-sign.1",
    "/mnt/data/kiwi/android-light/cordova/platforms/electron/www/node_modules/sshpk/man/man1/sshpk-verify.1"
  ],
  "name": "sshpk",
  "optionalDependencies": {},
  "repository": {
    "type": "git",
    "url": "git+https://github.com/joyent/node-sshpk.git"
  },
  "version": "1.16.1"
}.TH sshpk\-conv 1 "Jan 2016" sshpk "sshpk Commands"
.SH NAME
.PP
sshpk\-conv \- convert between key formats
.SH SYNOPSYS
.PP
\fB\fCsshpk\-conv\fR \-t FORMAT [FILENAME] [OPTIONS...]
.PP
\fB\fCsshpk\-conv\fR \-i [FILENAME] [OPTIONS...]
.SH DESCRIPTION
.PP
Reads in a public or private key and converts it between different formats,
particularly formats used in the SSH protocol and the well\-known PEM PKCS#1/7
formats.
.PP
In the second form, with the \fB\fC\-i\fR option given, identifies a key and prints to 
stderr information about its nature, size and fingerprint.
.SH EXAMPLES
.PP
Assume the following SSH\-format public key in \fB\fCid_ecdsa.pub\fR:
.PP
.RS
.nf
ecdsa\-sha2\-nistp256 AAAAE2VjZHNhLXNoYTI...9M/4c4= user@host
.fi
.RE
.PP
Identify it with \fB\fC\-i\fR:
.PP
.RS
.nf
$ sshpk\-conv \-i id_ecdsa.pub
id_ecdsa: a 256 bit ECDSA public key
ECDSA curve: nistp256
Comment: user@host
Fingerprint:
  SHA256:vCNX7eUkdvqqW0m4PoxQAZRv+CM4P4fS8+CbliAvS4k
  81:ad:d5:57:e5:6f:7d:a2:93:79:56:af:d7:c0:38:51
.fi
.RE
.PP
Convert it to \fB\fCpkcs8\fR format, for use with e.g. OpenSSL:
.PP
.RS
.nf
$ sshpk\-conv \-t pkcs8 id_ecdsa
\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAsA4R6N6AS3gzaPBeLjG2ObSgUsR
zOt+kWJoijLnw3ZMYUKmAx+lD0I5XUxdrPcs1vH5f3cn9TvRvO9L0z/hzg==
\-\-\-\-\-END PUBLIC KEY\-\-\-\-\-
.fi
.RE
.PP
Retrieve the public half of a private key:
.PP
.RS
.nf
$ openssl genrsa 2048 | sshpk\-conv \-t ssh \-c foo@bar
ssh\-rsa AAAAB3NzaC1yc2EAAA...koK7 foo@bar
.fi
.RE
.PP
Convert a private key to PKCS#1 (OpenSSL) format from a new\-style OpenSSH key
format (the \fB\fCssh\-keygen \-o\fR format):
.PP
.RS
.nf
$ ssh\-keygen \-o \-f foobar
\&...
$ sshpk\-conv \-p \-t pkcs1 foobar
\-\-\-\-\-BEGIN RSA PRIVATE KEY\-\-\-\-\-
MIIDpAIBAAKCAQEA6T/GYJndb1TRH3+NL....
\-\-\-\-\-END RSA PRIVATE KEY\-\-\-\-\-
.fi
.RE
.SH OPTIONS
.TP
\fB\fC\-i, \-\-identify\fR
Instead of converting the key, output identifying information about it to 
stderr, including its type, size and fingerprints.
.TP
\fB\fC\-p, \-\-private\fR
Treat the key as a private key instead of a public key (the default). If you
supply \fB\fCsshpk\-conv\fR with a private key and do not give this option, it will
extract only the public half of the key from it and work with that.
.TP
\fB\fC\-f PATH, \-\-file=PATH\fR
Input file to take the key from instead of stdin. If a filename is supplied
as a positional argument, it is equivalent to using this option.
.TP
\fB\fC\-o PATH, \-\-out=PATH\fR
Output file name to use instead of stdout.
.PP
\fB\fC\-T FORMAT, \-\-informat=FORMAT\fR
.TP
\fB\fC\-t FORMAT, \-\-outformat=FORMAT\fR
Selects the input and output formats to be used (see FORMATS, below).
.TP
\fB\fC\-c TEXT, \-\-comment=TEXT\fR
Sets the key comment for the output file, if supported.
.SH FORMATS
.PP
Currently supported formats:
.TP
\fB\fCpem, pkcs1\fR
The standard PEM format used by older OpenSSH and most TLS libraries such as
OpenSSL. The classic \fB\fCid_rsa\fR file is usually in this format. It is an ASN.1
encoded structure, base64\-encoded and placed between PEM headers.
.TP
\fB\fCssh\fR
The SSH public key text format (the format of an \fB\fCid_rsa.pub\fR file). A single
line, containing 3 space separated parts: the key type, key body and optional
key comment.
.TP
\fB\fCpkcs8\fR
A newer PEM format, usually used only for public keys by TLS libraries such
as OpenSSL. The ASN.1 structure is more generic than that of \fB\fCpkcs1\fR\&.
.TP
\fB\fCopenssh\fR
The new \fB\fCssh\-keygen \-o\fR format from OpenSSH. This can be mistaken for a PEM
encoding but is actually an OpenSSH internal format.
.TP
\fB\fCrfc4253\fR
The internal binary format of keys when sent over the wire in the SSH
protocol. This is also the format that the \fB\fCssh\-agent\fR uses in its protocol.
.SH SEE ALSO
.PP
.BR ssh-keygen (1), 
.BR openssl (1)
.SH BUGS
.PP
Encrypted (password\-protected) keys are not supported.
.PP
Report bugs at Github
\[la]https://github.com/arekinath/node-sshpk/issues\[ra]
.TH sshpk\-sign 1 "Jan 2016" sshpk "sshpk Commands"
.SH NAME
.PP
sshpk\-sign \- sign data using an SSH key
.SH SYNOPSYS
.PP
\fB\fCsshpk\-sign\fR \-i KEYPATH [OPTION...]
.SH DESCRIPTION
.PP
Takes in arbitrary bytes, and signs them using an SSH private key. The key can
be of any type or format supported by the \fB\fCsshpk\fR library, including the
standard OpenSSH formats, as well as PEM PKCS#1 and PKCS#8.
.PP
The signature is printed out in Base64 encoding, unless the \fB\fC\-\-binary\fR or \fB\fC\-b\fR
option is given.
.SH EXAMPLES
.PP
Signing with default settings:
.PP
.RS
.nf
$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa
MEUCIAMdLS/vXrrtWFepwe...
.fi
.RE
.PP
Signing in SSH (RFC 4253) format (rather than the default ASN.1):
.PP
.RS
.nf
$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa \-t ssh
AAAAFGVjZHNhLXNoYTIt...
.fi
.RE
.PP
Saving the binary signature to a file:
.PP
.RS
.nf
$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa \\
                            \-o signature.bin \-b
$ cat signature.bin | base64
MEUCIAMdLS/vXrrtWFepwe...
.fi
.RE
.SH OPTIONS
.TP
\fB\fC\-v, \-\-verbose\fR
Print extra information about the key and signature to stderr when signing.
.TP
\fB\fC\-b, \-\-binary\fR
Don't base64\-encode the signature before outputting it.
.TP
\fB\fC\-i KEY, \-\-identity=KEY\fR
Select the key to be used for signing. \fB\fCKEY\fR must be a relative or absolute
filesystem path to the key file. Any format supported by the \fB\fCsshpk\fR library
is supported, including OpenSSH formats and standard PEM PKCS.
.TP
\fB\fC\-f PATH, \-\-file=PATH\fR
Input file to sign instead of stdin.
.TP
\fB\fC\-o PATH, \-\-out=PATH\fR
Output file to save signature in instead of stdout.
.TP
\fB\fC\-H HASH, \-\-hash=HASH\fR
Set the hash algorithm to be used for signing. This should be one of \fB\fCsha1\fR,
\fB\fCsha256\fR or \fB\fCsha512\fR\&. Some key types may place restrictions on which hash
algorithms may be used (e.g. ED25519 keys can only use SHA\-512).
.TP
\fB\fC\-t FORMAT, \-\-format=FORMAT\fR
Choose the signature format to use, from \fB\fCasn1\fR, \fB\fCssh\fR or \fB\fCraw\fR (only for
ED25519 signatures). The \fB\fCasn1\fR format is the default, as it is the format
used with TLS and typically the standard in most non\-SSH libraries (e.g.
OpenSSL). The \fB\fCssh\fR format is used in the SSH protocol and by the ssh\-agent.
.SH SEE ALSO
.PP
.BR sshpk-verify (1)
.SH BUGS
.PP
Report bugs at Github
\[la]https://github.com/arekinath/node-sshpk/issues\[ra]
.TH sshpk\-verify 1 "Jan 2016" sshpk "sshpk Commands"
.SH NAME
.PP
sshpk\-verify \- verify a signature on data using an SSH key
.SH SYNOPSYS
.PP
\fB\fCsshpk\-verify\fR \-i KEYPATH \-s SIGNATURE [OPTION...]
.SH DESCRIPTION
.PP
Takes in arbitrary bytes and a Base64\-encoded signature, and verifies that the
signature was produced by the private half of the given SSH public key.
.SH EXAMPLES
.PP
.RS
.nf
$ printf 'foo' | sshpk\-verify \-i ~/.ssh/id_ecdsa \-s MEUCIQCYp...
OK
$ printf 'foo' | sshpk\-verify \-i ~/.ssh/id_ecdsa \-s GARBAGE...
NOT OK
.fi
.RE
.SH EXIT STATUS
.TP
\fB\fC0\fR
Signature validates and matches the key.
.TP
\fB\fC1\fR
Signature is parseable and the correct length but does not match the key or
otherwise is invalid.
.TP
\fB\fC2\fR
The signature or key could not be parsed.
.TP
\fB\fC3\fR
Invalid commandline options were supplied.
.SH OPTIONS
.TP
\fB\fC\-v, \-\-verbose\fR
Print extra information about the key and signature to stderr when verifying.
.TP
\fB\fC\-i KEY, \-\-identity=KEY\fR
Select the key to be used for verification. \fB\fCKEY\fR must be a relative or
absolute filesystem path to the key file. Any format supported by the \fB\fCsshpk\fR
library is supported, including OpenSSH formats and standard PEM PKCS.
.TP
\fB\fC\-s BASE64, \-\-signature=BASE64\fR
Supplies the base64\-encoded signature to be verified.
.TP
\fB\fC\-f PATH, \-\-file=PATH\fR
Input file to verify instead of stdin.
.TP
\fB\fC\-H HASH, \-\-hash=HASH\fR
Set the hash algorithm to be used for signing. This should be one of \fB\fCsha1\fR,
\fB\fCsha256\fR or \fB\fCsha512\fR\&. Some key types may place restrictions on which hash
algorithms may be used (e.g. ED25519 keys can only use SHA\-512).
.TP
\fB\fC\-t FORMAT, \-\-format=FORMAT\fR
Choose the signature format to use, from \fB\fCasn1\fR, \fB\fCssh\fR or \fB\fCraw\fR (only for
ED25519 signatures). The \fB\fCasn1\fR format is the default, as it is the format
used with TLS and typically the standard in most non\-SSH libraries (e.g.
OpenSSL). The \fB\fCssh\fR format is used in the SSH protocol and by the ssh\-agent.
.SH SEE ALSO
.PP
.BR sshpk-sign (1)
.SH BUGS
.PP
Report bugs at Github
\[la]https://github.com/arekinath/node-sshpk/issues\[ra]
// Copyright 2015 Joyent, Inc.

var Buffer = require('safer-buffer').Buffer;

var algInfo = {
	'dsa': {
		parts: ['p', 'q', 'g', 'y'],
		sizePart: 'p'
	},
	'rsa': {
		parts: ['e', 'n'],
		sizePart: 'n'
	},
	'ecdsa': {
		parts: ['curve', 'Q'],
		sizePart: 'Q'
	},
	'ed25519': {
		parts: ['A'],
		sizePart: 'A'
	}
};
algInfo['curve25519'] = algInfo['ed25519'];

var algPrivInfo = {
	'dsa': {
		parts: ['p', 'q', 'g', 'y', 'x']
	},
	'rsa': {
		parts: ['n', 'e', 'd', 'iqmp', 'p', 'q']
	},
	'ecdsa': {
		parts: ['curve', 'Q', 'd']
	},
	'ed25519': {
		parts: ['A', 'k']
	}
};
algPrivInfo['curve25519'] = algPrivInfo['ed25519'];

var hashAlgs = {
	'md5': true,
	'sha1': true,
	'sha256': true,
	'sha384': true,
	'sha512': true
};

/*
 * Taken from
 * http://csrc.nist.gov/groups/ST/toolkit/documents/dss/NISTReCur.pdf
 */
var curves = {
	'nistp256': {
		size: 256,
		pkcs8oid: '1.2.840.10045.3.1.7',
		p: Buffer.from(('00' +
		    'ffffffff 00000001 00000000 00000000' +
		    '00000000 ffffffff ffffffff ffffffff').
		    replace(/ /g, ''), 'hex'),
		a: Buffer.from(('00' +
		    'FFFFFFFF 00000001 00000000 00000000' +
		    '00000000 FFFFFFFF FFFFFFFF FFFFFFFC').
		    replace(/ /g, ''), 'hex'),
		b: Buffer.from((
		    '5ac635d8 aa3a93e7 b3ebbd55 769886bc' +
		    '651d06b0 cc53b0f6 3bce3c3e 27d2604b').
		    replace(/ /g, ''), 'hex'),
		s: Buffer.from(('00' +
		    'c49d3608 86e70493 6a6678e1 139d26b7' +
		    '819f7e90').
		    replace(/ /g, ''), 'hex'),
		n: Buffer.from(('00' +
		    'ffffffff 00000000 ffffffff ffffffff' +
		    'bce6faad a7179e84 f3b9cac2 fc632551').
		    replace(/ /g, ''), 'hex'),
		G: Buffer.from(('04' +
		    '6b17d1f2 e12c4247 f8bce6e5 63a440f2' +
		    '77037d81 2deb33a0 f4a13945 d898c296' +
		    '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16' +
		    '2bce3357 6b315ece cbb64068 37bf51f5').
		    replace(/ /g, ''), 'hex')
	},
	'nistp384': {
		size: 384,
		pkcs8oid: '1.3.132.0.34',
		p: Buffer.from(('00' +
		    'ffffffff ffffffff ffffffff ffffffff' +
		    'ffffffff ffffffff ffffffff fffffffe' +
		    'ffffffff 00000000 00000000 ffffffff').
		    replace(/ /g, ''), 'hex'),
		a: Buffer.from(('00' +
		    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +
		    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE' +
		    'FFFFFFFF 00000000 00000000 FFFFFFFC').
		    replace(/ /g, ''), 'hex'),
		b: Buffer.from((
		    'b3312fa7 e23ee7e4 988e056b e3f82d19' +
		    '181d9c6e fe814112 0314088f 5013875a' +
		    'c656398d 8a2ed19d 2a85c8ed d3ec2aef').
		    replace(/ /g, ''), 'hex'),
		s: Buffer.from(('00' +
		    'a335926a a319a27a 1d00896a 6773a482' +
		    '7acdac73').
		    replace(/ /g, ''), 'hex'),
		n: Buffer.from(('00' +
		    'ffffffff ffffffff ffffffff ffffffff' +
		    'ffffffff ffffffff c7634d81 f4372ddf' +
		    '581a0db2 48b0a77a ecec196a ccc52973').
		    replace(/ /g, ''), 'hex'),
		G: Buffer.from(('04' +
		    'aa87ca22 be8b0537 8eb1c71e f320ad74' +
		    '6e1d3b62 8ba79b98 59f741e0 82542a38' +
		    '5502f25d bf55296c 3a545e38 72760ab7' +
		    '3617de4a 96262c6f 5d9e98bf 9292dc29' +
		    'f8f41dbd 289a147c e9da3113 b5f0b8c0' +
		    '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f').
		    replace(/ /g, ''), 'hex')
	},
	'nistp521': {
		size: 521,
		pkcs8oid: '1.3.132.0.35',
		p: Buffer.from((
		    '01ffffff ffffffff ffffffff ffffffff' +
		    'ffffffff ffffffff ffffffff ffffffff' +
		    'ffffffff ffffffff ffffffff ffffffff' +
		    'ffffffff ffffffff ffffffff ffffffff' +
		    'ffff').replace(/ /g, ''), 'hex'),
		a: Buffer.from(('01FF' +
		    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +
		    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +
		    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +
		    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC').
		    replace(/ /g, ''), 'hex'),
		b: Buffer.from(('51' +
		    '953eb961 8e1c9a1f 929a21a0 b68540ee' +
		    'a2da725b 99b315f3 b8b48991 8ef109e1' +
		    '56193951 ec7e937b 1652c0bd 3bb1bf07' +
		    '3573df88 3d2c34f1 ef451fd4 6b503f00').
		    replace(/ /g, ''), 'hex'),
		s: Buffer.from(('00' +
		    'd09e8800 291cb853 96cc6717 393284aa' +
		    'a0da64ba').replace(/ /g, ''), 'hex'),
		n: Buffer.from(('01ff' +
		    'ffffffff ffffffff ffffffff ffffffff' +
		    'ffffffff ffffffff ffffffff fffffffa' +
		    '51868783 bf2f966b 7fcc0148 f709a5d0' +
		    '3bb5c9b8 899c47ae bb6fb71e 91386409').
		    replace(/ /g, ''), 'hex'),
		G: Buffer.from(('04' +
		    '00c6 858e06b7 0404e9cd 9e3ecb66 2395b442' +
		         '9c648139 053fb521 f828af60 6b4d3dba' +
		         'a14b5e77 efe75928 fe1dc127 a2ffa8de' +
		         '3348b3c1 856a429b f97e7e31 c2e5bd66' +
		    '0118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9' +
		         '98f54449 579b4468 17afbd17 273e662c' +
		         '97ee7299 5ef42640 c550b901 3fad0761' +
		         '353c7086 a272c240 88be9476 9fd16650').
		    replace(/ /g, ''), 'hex')
	}
};

module.exports = {
	info: algInfo,
	privInfo: algPrivInfo,
	hashAlgs: hashAlgs,
	curves: curves
};
// Copyright 2016 Joyent, Inc.

module.exports = Certificate;

var assert = require('assert-plus');
var Buffer = require('safer-buffer').Buffer;
var algs = require('./algs');
var crypto = require('crypto');
var Fingerprint = require('./fingerprint');
var Signature = require('./signature');
var errs = require('./errors');
var util = require('util');
var utils = require('./utils');
var Key = require('./key');
var PrivateKey = require('./private-key');
var Identity = require('./identity');

var formats = {};
formats['openssh'] = require('./formats/openssh-cert');
formats['x509'] = require('./formats/x509');
formats['pem'] = require('./formats/x509-pem');

var CertificateParseError = errs.CertificateParseError;
var InvalidAlgorithmError = errs.InvalidAlgorithmError;

function Certificate(opts) {
	assert.object(opts, 'options');
	assert.arrayOfObject(opts.subjects, 'options.subjects');
	utils.assertCompatible(opts.subjects[0], Identity, [1, 0],
	    'options.subjects');
	utils.assertCompatible(opts.subjectKey, Key, [1, 0],
	    'options.subjectKey');
	utils.assertCompatible(opts.issuer, Identity, [1, 0], 'options.issuer');
	if (opts.issuerKey !== undefined) {
		utils.assertCompatible(opts.issuerKey, Key, [1, 0],
		    'options.issuerKey');
	}
	assert.object(opts.signatures, 'options.signatures');
	assert.buffer(opts.serial, 'options.serial');
	assert.date(opts.validFrom, 'options.validFrom');
	assert.date(opts.validUntil, 'optons.validUntil');

	assert.optionalArrayOfString(opts.purposes, 'options.purposes');

	this._hashCache = {};

	this.subjects = opts.subjects;
	this.issuer = opts.issuer;
	this.subjectKey = opts.subjectKey;
	this.issuerKey = opts.issuerKey;
	this.signatures = opts.signatures;
	this.serial = opts.serial;
	this.validFrom = opts.validFrom;
	this.validUntil = opts.validUntil;
	this.purposes = opts.purposes;
}

Certificate.formats = formats;

Certificate.prototype.toBuffer = function (format, options) {
	if (format === undefined)
		format = 'x509';
	assert.string(format, 'format');
	assert.object(formats[format], 'formats[format]');
	assert.optionalObject(options, 'options');

	return (formats[format].write(this, options));
};

Certificate.prototype.toString = function (format, options) {
	if (format === undefined)
		format = 'pem';
	return (this.toBuffer(format, options).toString());
};

Certificate.prototype.fingerprint = function (algo) {
	if (algo === undefined)
		algo = 'sha256';
	assert.string(algo, 'algorithm');
	var opts = {
		type: 'certificate',
		hash: this.hash(algo),
		algorithm: algo
	};
	return (new Fingerprint(opts));
};

Certificate.prototype.hash = function (algo) {
	assert.string(algo, 'algorithm');
	algo = algo.toLowerCase();
	if (algs.hashAlgs[algo] === undefined)
		throw (new InvalidAlgorithmError(algo));

	if (this._hashCache[algo])
		return (this._hashCache[algo]);

	var hash = crypto.createHash(algo).
	    update(this.toBuffer('x509')).digest();
	this._hashCache[algo] = hash;
	return (hash);
};

Certificate.prototype.isExpired = function (when) {
	if (when === undefined)
		when = new Date();
	return (!((when.getTime() >= this.validFrom.getTime()) &&
		(when.getTime() < this.validUntil.getTime())));
};

Certificate.prototype.isSignedBy = function (issuerCert) {
	utils.assertCompatible(issuerCert, Certificate, [1, 0], 'issuer');

	if (!this.issuer.equals(issuerCert.subjects[0]))
		return (false);
	if (this.issuer.purposes && this.issuer.purposes.length > 0 &&
	    this.issuer.purposes.indexOf('ca') === -1) {
		return (false);
	}

	return (this.isSignedByKey(issuerCert.subjectKey));
};

Certificate.prototype.getExtension = function (keyOrOid) {
	assert.string(keyOrOid, 'keyOrOid');
	var ext = this.getExtensions().filter(function (maybeExt) {
		if (maybeExt.format === 'x509')
			return (maybeExt.oid === keyOrOid);
		if (maybeExt.format === 'openssh')
			return (maybeExt.name === keyOrOid);
		return (false);
	})[0];
	return (ext);
};

Certificate.prototype.getExtensions = function () {
	var exts = [];
	var x509 = this.signatures.x509;
	if (x509 && x509.extras && x509.extras.exts) {
		x509.extras.exts.forEach(function (ext) {
			ext.format = 'x509';
			exts.push(ext);
		});
	}
	var openssh = this.signatures.openssh;
	if (openssh && openssh.exts) {
		openssh.exts.forEach(function (ext) {
			ext.format = 'openssh';
			exts.push(ext);
		});
	}
	return (exts);
};

Certificate.prototype.isSignedByKey = function (issuerKey) {
	utils.assertCompatible(issuerKey, Key, [1, 2], 'issuerKey');

	if (this.issuerKey !== undefined) {
		return (this.issuerKey.
		    fingerprint('sha512').matches(issuerKey));
	}

	var fmt = Object.keys(this.signatures)[0];
	var valid = formats[fmt].verify(this, issuerKey);
	if (valid)
		this.issuerKey = issuerKey;
	return (valid);
};

Certificate.prototype.signWith = function (key) {
	utils.assertCompatible(key, PrivateKey, [1, 2], 'key');
	var fmts = Object.keys(formats);
	var didOne = false;
	for (var i = 0; i < fmts.length; ++i) {
		if (fmts[i] !== 'pem') {
			var ret = formats[fmts[i]].sign(this, key);
			if (ret === true)
				didOne = true;
		}
	}
	if (!didOne) {
		throw (new Error('Failed to sign the certificate for any ' +
		    'available certificate formats'));
	}
};

Certificate.createSelfSigned = function (subjectOrSubjects, key, options) {
	var subjects;
	if (Array.isArray(subjectOrSubjects))
		subjects = subjectOrSubjects;
	else
		subjects = [subjectOrSubjects];

	assert.arrayOfObject(subjects);
	subjects.forEach(function (subject) {
		utils.assertCompatible(subject, Identity, [1, 0], 'subject');
	});

	utils.assertCompatible(key, PrivateKey, [1, 2], 'private key');

	assert.optionalObject(options, 'options');
	if (options === undefined)
		options = {};
	assert.optionalObject(options.validFrom, 'options.validFrom');
	assert.optionalObject(options.validUntil, 'options.validUntil');
	var validFrom = options.validFrom;
	var validUntil = options.validUntil;
	if (validFrom === undefined)
		validFrom = new Date();
	if (validUntil === undefined) {
		assert.optionalNumber(options.lifetime, 'options.lifetime');
		var lifetime = options.lifetime;
		if (lifetime === undefined)
			lifetime = 10*365*24*3600;
		validUntil = new Date();
		validUntil.setTime(validUntil.getTime() + lifetime*1000);
	}
	assert.optionalBuffer(options.serial, 'options.serial');
	var serial = options.serial;
	if (serial === undefined)
		serial = Buffer.from('0000000000000001', 'hex');

	var purposes = options.purposes;
	if (purposes === undefined)
		purposes = [];

	if (purposes.indexOf('signature') === -1)
		purposes.push('signature');

	/* Self-signed certs are always CAs. */
	if (purposes.indexOf('ca') === -1)
		purposes.push('ca');
	if (purposes.indexOf('crl') === -1)
		purposes.push('crl');

	/*
	 * If we weren't explicitly given any other purposes, do the sensible
	 * thing and add some basic ones depending on the subject type.
	 */
	if (purposes.length <= 3) {
		var hostSubjects = subjects.filter(function (subject) {
			return (subject.type === 'host');
		});
		var userSubjects = subjects.filter(function (subject) {
			return (subject.type === 'user');
		});
		if (hostSubjects.length > 0) {
			if (purposes.indexOf('serverAuth') === -1)
				purposes.push('serverAuth');
		}
		if (userSubjects.length > 0) {
			if (purposes.indexOf('clientAuth') === -1)
				purposes.push('clientAuth');
		}
		if (userSubjects.length > 0 || hostSubjects.length > 0) {
			if (purposes.indexOf('keyAgreement') === -1)
				purposes.push('keyAgreement');
			if (key.type === 'rsa' &&
			    purposes.indexOf('encryption') === -1)
				purposes.push('encryption');
		}
	}

	var cert = new Certificate({
		subjects: subjects,
		issuer: subjects[0],
		subjectKey: key.toPublic(),
		issuerKey: key.toPublic(),
		signatures: {},
		serial: serial,
		validFrom: validFrom,
		validUntil: validUntil,
		purposes: purposes
	});
	cert.signWith(key);

	return (cert);
};

Certificate.create =
    function (subjectOrSubjects, key, issuer, issuerKey, options) {
	var subjects;
	if (Array.isArray(subjectOrSubjects))
		subjects = subjectOrSubjects;
	else
		subjects = [subjectOrSubjects];

	assert.arrayOfObject(subjects);
	subjects.forEach(function (subject) {
		utils.assertCompatible(subject, Identity, [1, 0], 'subject');
	});

	utils.assertCompatible(key, Key, [1, 0], 'key');
	if (PrivateKey.isPrivateKey(key))
		key = key.toPublic();
	utils.assertCompatible(issuer, Identity, [1, 0], 'issuer');
	utils.assertCompatible(issuerKey, PrivateKey, [1, 2], 'issuer key');

	assert.optionalObject(options, 'options');
	if (options === undefined)
		options = {};
	assert.optionalObject(options.validFrom, 'options.validFrom');
	assert.optionalObject(options.validUntil, 'options.validUntil');
	var validFrom = options.validFrom;
	var validUntil = options.validUntil;
	if (validFrom === undefined)
		validFrom = new Date();
	if (validUntil === undefined) {
		assert.optionalNumber(options.lifetime, 'options.lifetime');
		var lifetime = options.lifetime;
		if (lifetime === undefined)
			lifetime = 10*365*24*3600;
		validUntil = new Date();
		validUntil.setTime(validUntil.getTime() + lifetime*1000);
	}
	assert.optionalBuffer(options.serial, 'options.serial');
	var serial = options.serial;
	if (serial === undefined)
		serial = Buffer.from('0000000000000001', 'hex');

	var purposes = options.purposes;
	if (purposes === undefined)
		purposes = [];

	if (purposes.indexOf('signature') === -1)
		purposes.push('signature');

	if (options.ca === true) {
		if (purposes.indexOf('ca') === -1)
			purposes.push('ca');
		if (purposes.indexOf('crl') === -1)
			purposes.push('crl');
	}

	var hostSubjects = subjects.filter(function (subject) {
		return (subject.type === 'host');
	});
	var userSubjects = subjects.filter(function (subject) {
		return (subject.type === 'user');
	});
	if (hostSubjects.length > 0) {
		if (purposes.indexOf('serverAuth') === -1)
			purposes.push('serverAuth');
	}
	if (userSubjects.length > 0) {
		if (purposes.indexOf('clientAuth') === -1)
			purposes.push('clientAuth');
	}
	if (userSubjects.length > 0 || hostSubjects.length > 0) {
		if (purposes.indexOf('keyAgreement') === -1)
			purposes.push('keyAgreement');
		if (key.type === 'rsa' &&
		    purposes.indexOf('encryption') === -1)
			purposes.push('encryption');
	}

	var cert = new Certificate({
		subjects: subjects,
		issuer: issuer,
		subjectKey: key,
		issuerKey: issuerKey.toPublic(),
		signatures: {},
		serial: serial,
		validFrom: validFrom,
		validUntil: validUntil,
		purposes: purposes
	});
	cert.signWith(issuerKey);

	return (cert);
};

Certificate.parse = function (data, format, options) {
	if (typeof (data) !== 'string')
		assert.buffer(data, 'data');
	if (format === undefined)
		format = 'auto';
	assert.string(format, 'format');
	if (typeof (options) === 'string')
		options = { filename: options };
	assert.optionalObject(options, 'options');
	if (options === undefined)
		options = {};
	assert.optionalString(options.filename, 'options.filename');
	if (options.filename === undefined)
		options.filename = '(unnamed)';

	assert.object(formats[format], 'formats[format]');

	try {
		var k = formats[format].read(data, options);
		return (k);
	} catch (e) {
		throw (new CertificateParseError(options.filename, format, e));
	}
};

Certificate.isCertificate = function (obj, ver) {
	return (utils.isCompatible(obj, Certificate, ver));
};

/*
 * API versions for Certificate:
 * [1,0] -- initial ver
 * [1,1] -- openssh format now unpacks extensions
 */
Certificate.prototype._sshpkApiVersion = [1, 1];

Certificate._oldVersionDetect = function (obj) {
	return ([1, 0]);
};
// Copyright 2017 Joyent, Inc.

module.exports = {
	DiffieHellman: DiffieHellman,
	generateECDSA: generateECDSA,
	generateED25519: generateED25519
};

var assert = require('assert-plus');
var crypto = require('crypto');
var Buffer = require('safer-buffer').Buffer;
var algs = require('./algs');
var utils = require('./utils');
var nacl = require('tweetnacl');

var Key = require('./key');
var PrivateKey = require('./private-key');

var CRYPTO_HAVE_ECDH = (crypto.createECDH !== undefined);

var ecdh = require('ecc-jsbn');
var ec = require('ecc-jsbn/lib/ec');
var jsbn = require('jsbn').BigInteger;

function DiffieHellman(key) {
	utils.assertCompatible(key, Key, [1, 4], 'key');
	this._isPriv = PrivateKey.isPrivateKey(key, [1, 3]);
	this._algo = key.type;
	this._curve = key.curve;
	this._key = key;
	if (key.type === 'dsa') {
		if (!CRYPTO_HAVE_ECDH) {
			throw (new Error('Due to bugs in the node 0.10 ' +
			    'crypto API, node 0.12.x or later is required ' +
			    'to use DH'));
		}
		this._dh = crypto.createDiffieHellman(
		    key.part.p.data, undefined,
		    key.part.g.data, undefined);
		this._p = key.part.p;
		this._g = key.part.g;
		if (this._isPriv)
			this._dh.setPrivateKey(key.part.x.data);
		this._dh.setPublicKey(key.part.y.data);

	} else if (key.type === 'ecdsa') {
		if (!CRYPTO_HAVE_ECDH) {
			this._ecParams = new X9ECParameters(this._curve);

			if (this._isPriv) {
				this._priv = new ECPrivate(
				    this._ecParams, key.part.d.data);
			}
			return;
		}

		var curve = {
			'nistp256': 'prime256v1',
			'nistp384': 'secp384r1',
			'nistp521': 'secp521r1'
		}[key.curve];
		this._dh = crypto.createECDH(curve);
		if (typeof (this._dh) !== 'object' ||
		    typeof (this._dh.setPrivateKey) !== 'function') {
			CRYPTO_HAVE_ECDH = false;
			DiffieHellman.call(this, key);
			return;
		}
		if (this._isPriv)
			this._dh.setPrivateKey(key.part.d.data);
		this._dh.setPublicKey(key.part.Q.data);

	} else if (key.type === 'curve25519') {
		if (this._isPriv) {
			utils.assertCompatible(key, PrivateKey, [1, 5], 'key');
			this._priv = key.part.k.data;
		}

	} else {
		throw (new Error('DH not supported for ' + key.type + ' keys'));
	}
}

DiffieHellman.prototype.getPublicKey = function () {
	if (this._isPriv)
		return (this._key.toPublic());
	return (this._key);
};

DiffieHellman.prototype.getPrivateKey = function () {
	if (this._isPriv)
		return (this._key);
	else
		return (undefined);
};
DiffieHellman.prototype.getKey = DiffieHellman.prototype.getPrivateKey;

DiffieHellman.prototype._keyCheck = function (pk, isPub) {
	assert.object(pk, 'key');
	if (!isPub)
		utils.assertCompatible(pk, PrivateKey, [1, 3], 'key');
	utils.assertCompatible(pk, Key, [1, 4], 'key');

	if (pk.type !== this._algo) {
		throw (new Error('A ' + pk.type + ' key cannot be used in ' +
		    this._algo + ' Diffie-Hellman'));
	}

	if (pk.curve !== this._curve) {
		throw (new Error('A key from the ' + pk.curve + ' curve ' +
		    'cannot be used with a ' + this._curve +
		    ' Diffie-Hellman'));
	}

	if (pk.type === 'dsa') {
		assert.deepEqual(pk.part.p, this._p,
		    'DSA key prime does not match');
		assert.deepEqual(pk.part.g, this._g,
		    'DSA key generator does not match');
	}
};

DiffieHellman.prototype.setKey = function (pk) {
	this._keyCheck(pk);

	if (pk.type === 'dsa') {
		this._dh.setPrivateKey(pk.part.x.data);
		this._dh.setPublicKey(pk.part.y.data);

	} else if (pk.type === 'ecdsa') {
		if (CRYPTO_HAVE_ECDH) {
			this._dh.setPrivateKey(pk.part.d.data);
			this._dh.setPublicKey(pk.part.Q.data);
		} else {
			this._priv = new ECPrivate(
			    this._ecParams, pk.part.d.data);
		}

	} else if (pk.type === 'curve25519') {
		var k = pk.part.k;
		if (!pk.part.k)
			k = pk.part.r;
		this._priv = k.data;
		if (this._priv[0] === 0x00)
			this._priv = this._priv.slice(1);
		this._priv = this._priv.slice(0, 32);
	}
	this._key = pk;
	this._isPriv = true;
};
DiffieHellman.prototype.setPrivateKey = DiffieHellman.prototype.setKey;

DiffieHellman.prototype.computeSecret = function (otherpk) {
	this._keyCheck(otherpk, true);
	if (!this._isPriv)
		throw (new Error('DH exchange has not been initialized with ' +
		    'a private key yet'));

	var pub;
	if (this._algo === 'dsa') {
		return (this._dh.computeSecret(
		    otherpk.part.y.data));

	} else if (this._algo === 'ecdsa') {
		if (CRYPTO_HAVE_ECDH) {
			return (this._dh.computeSecret(
			    otherpk.part.Q.data));
		} else {
			pub = new ECPublic(
			    this._ecParams, otherpk.part.Q.data);
			return (this._priv.deriveSharedSecret(pub));
		}

	} else if (this._algo === 'curve25519') {
		pub = otherpk.part.A.data;
		while (pub[0] === 0x00 && pub.length > 32)
			pub = pub.slice(1);
		var priv = this._priv;
		assert.strictEqual(pub.length, 32);
		assert.strictEqual(priv.length, 32);

		var secret = nacl.box.before(new Uint8Array(pub),
		    new Uint8Array(priv));

		return (Buffer.from(secret));
	}

	throw (new Error('Invalid algorithm: ' + this._algo));
};

DiffieHellman.prototype.generateKey = function () {
	var parts = [];
	var priv, pub;
	if (this._algo === 'dsa') {
		this._dh.generateKeys();

		parts.push({name: 'p', data: this._p.data});
		parts.push({name: 'q', data: this._key.part.q.data});
		parts.push({name: 'g', data: this._g.data});
		parts.push({name: 'y', data: this._dh.getPublicKey()});
		parts.push({name: 'x', data: this._dh.getPrivateKey()});
		this._key = new PrivateKey({
			type: 'dsa',
			parts: parts
		});
		this._isPriv = true;
		return (this._key);

	} else if (this._algo === 'ecdsa') {
		if (CRYPTO_HAVE_ECDH) {
			this._dh.generateKeys();

			parts.push({name: 'curve',
			    data: Buffer.from(this._curve)});
			parts.push({name: 'Q', data: this._dh.getPublicKey()});
			parts.push({name: 'd', data: this._dh.getPrivateKey()});
			this._key = new PrivateKey({
				type: 'ecdsa',
				curve: this._curve,
				parts: parts
			});
			this._isPriv = true;
			return (this._key);

		} else {
			var n = this._ecParams.getN();
			var r = new jsbn(crypto.randomBytes(n.bitLength()));
			var n1 = n.subtract(jsbn.ONE);
			priv = r.mod(n1).add(jsbn.ONE);
			pub = this._ecParams.getG().multiply(priv);

			priv = Buffer.from(priv.toByteArray());
			pub = Buffer.from(this._ecParams.getCurve().
			    encodePointHex(pub), 'hex');

			this._priv = new ECPrivate(this._ecParams, priv);

			parts.push({name: 'curve',
			    data: Buffer.from(this._curve)});
			parts.push({name: 'Q', data: pub});
			parts.push({name: 'd', data: priv});

			this._key = new PrivateKey({
				type: 'ecdsa',
				curve: this._curve,
				parts: parts
			});
			this._isPriv = true;
			return (this._key);
		}

	} else if (this._algo === 'curve25519') {
		var pair = nacl.box.keyPair();
		priv = Buffer.from(pair.secretKey);
		pub = Buffer.from(pair.publicKey);
		priv = Buffer.concat([priv, pub]);
		assert.strictEqual(priv.length, 64);
		assert.strictEqual(pub.length, 32);

		parts.push({name: 'A', data: pub});
		parts.push({name: 'k', data: priv});
		this._key = new PrivateKey({
			type: 'curve25519',
			parts: parts
		});
		this._isPriv = true;
		return (this._key);
	}

	throw (new Error('Invalid algorithm: ' + this._algo));
};
DiffieHellman.prototype.generateKeys = DiffieHellman.prototype.generateKey;

/* These are helpers for using ecc-jsbn (for node 0.10 compatibility). */

function X9ECParameters(name) {
	var params = algs.curves[name];
	assert.object(params);

	var p = new jsbn(params.p);
	var a = new jsbn(params.a);
	var b = new jsbn(params.b);
	var n = new jsbn(params.n);
	var h = jsbn.ONE;
	var curve = new ec.ECCurveFp(p, a, b);
	var G = curve.decodePointHex(params.G.toString('hex'));

	this.curve = curve;
	this.g = G;
	this.n = n;
	this.h = h;
}
X9ECParameters.prototype.getCurve = function () { return (this.curve); };
X9ECParameters.prototype.getG = function () { return (this.g); };
X9ECParameters.prototype.getN = function () { return (this.n); };
X9ECParameters.prototype.getH = function () { return (this.h); };

function ECPublic(params, buffer) {
	this._params = params;
	if (buffer[0] === 0x00)
		buffer = buffer.slice(1);
	this._pub = params.getCurve().decodePointHex(buffer.toString('hex'));
}

function ECPrivate(params, buffer) {
	this._params = params;
	this._priv = new jsbn(utils.mpNormalize(buffer));
}
ECPrivate.prototype.deriveSharedSecret = function (pubKey) {
	assert.ok(pubKey instanceof ECPublic);
	var S = pubKey._pub.multiply(this._priv);
	return (Buffer.from(S.getX().toBigInteger().toByteArray()));
};

function generateED25519() {
	var pair = nacl.sign.keyPair();
	var priv = Buffer.from(pair.secretKey);
	var pub = Buffer.from(pair.publicKey);
	assert.strictEqual(priv.length, 64);
	assert.strictEqual(pub.length, 32);

	var parts = [];
	parts.push({name: 'A', data: pub});
	parts.push({name: 'k', data: priv.slice(0, 32)});
	var key = new PrivateKey({
		type: 'ed25519',
		parts: parts
	});
	return (key);
}

/* Generates a new ECDSA private key on a given curve. */
function generateECDSA(curve) {
	var parts = [];
	var key;

	if (CRYPTO_HAVE_ECDH) {
		/*
		 * Node crypto doesn't expose key generation directly, but the
		 * ECDH instances can generate keys. It turns out this just
		 * calls into the OpenSSL generic key generator, and we can
		 * read its output happily without doing an actual DH. So we
		 * use that here.
		 */
		var osCurve = {
			'nistp256': 'prime256v1',
			'nistp384': 'secp384r1',
			'nistp521': 'secp521r1'
		}[curve];

		var dh = crypto.createECDH(osCurve);
		dh.generateKeys();

		parts.push({name: 'curve',
		    data: Buffer.from(curve)});
		parts.push({name: 'Q', data: dh.getPublicKey()});
		parts.push({name: 'd', data: dh.getPrivateKey()});

		key = new PrivateKey({
			type: 'ecdsa',
			curve: curve,
			parts: parts
		});
		return (key);
	} else {

		var ecParams = new X9ECParameters(curve);

		/* This algorithm taken from FIPS PUB 186-4 (section B.4.1) */
		var n = ecParams.getN();
		/*
		 * The crypto.randomBytes() function can only give us whole
		 * bytes, so taking a nod from X9.62, we round up.
		 */
		var cByteLen = Math.ceil((n.bitLength() + 64) / 8);
		var c = new jsbn(crypto.randomBytes(cByteLen));

		var n1 = n.subtract(jsbn.ONE);
		var priv = c.mod(n1).add(jsbn.ONE);
		var pub = ecParams.getG().multiply(priv);

		priv = Buffer.from(priv.toByteArray());
		pub = Buffer.from(ecParams.getCurve().
		    encodePointHex(pub), 'hex');

		parts.push({name: 'curve', data: Buffer.from(curve)});
		parts.push({name: 'Q', data: pub});
		parts.push({name: 'd', data: priv});

		key = new PrivateKey({
			type: 'ecdsa',
			curve: curve,
			parts: parts
		});
		return (key);
	}
}
// Copyright 2015 Joyent, Inc.

module.exports = {
	Verifier: Verifier,
	Signer: Signer
};

var nacl = require('tweetnacl');
var stream = require('stream');
var util = require('util');
var assert = require('assert-plus');
var Buffer = require('safer-buffer').Buffer;
var Signature = require('./signature');

function Verifier(key, hashAlgo) {
	if (hashAlgo.toLowerCase() !== 'sha512')
		throw (new Error('ED25519 only supports the use of ' +
		    'SHA-512 hashes'));

	this.key = key;
	this.chunks = [];

	stream.Writable.call(this, {});
}
util.inherits(Verifier, stream.Writable);

Verifier.prototype._write = function (chunk, enc, cb) {
	this.chunks.push(chunk);
	cb();
};

Verifier.prototype.update = function (chunk) {
	if (typeof (chunk) === 'string')
		chunk = Buffer.from(chunk, 'binary');
	this.chunks.push(chunk);
};

Verifier.prototype.verify = function (signature, fmt) {
	var sig;
	if (Signature.isSignature(signature, [2, 0])) {
		if (signature.type !== 'ed25519')
			return (false);
		sig = signature.toBuffer('raw');

	} else if (typeof (signature) === 'string') {
		sig = Buffer.from(signature, 'base64');

	} else if (Signature.isSignature(signature, [1, 0])) {
		throw (new Error('signature was created by too old ' +
		    'a version of sshpk and cannot be verified'));
	}

	assert.buffer(sig);
	return (nacl.sign.detached.verify(
	    new Uint8Array(Buffer.concat(this.chunks)),
	    new Uint8Array(sig),
	    new Uint8Array(this.key.part.A.data)));
};

function Signer(key, hashAlgo) {
	if (hashAlgo.toLowerCase() !== 'sha512')
		throw (new Error('ED25519 only supports the use of ' +
		    'SHA-512 hashes'));

	this.key = key;
	this.chunks = [];

	stream.Writable.call(this, {});
}
util.inherits(Signer, stream.Writable);

Signer.prototype._write = function (chunk, enc, cb) {
	this.chunks.push(chunk);
	cb();
};

Signer.prototype.update = function (chunk) {
	if (typeof (chunk) === 'string')
		chunk = Buffer.from(chunk, 'binary');
	this.chunks.push(chunk);
};

Signer.prototype.sign = function () {
	var sig = nacl.sign.detached(
	    new Uint8Array(Buffer.concat(this.chunks)),
	    new Uint8Array(Buffer.concat([
		this.key.part.k.data, this.key.part.A.data])));
	var sigBuf = Buffer.from(sig);
	var sigObj = Signature.parse(sigBuf, 'ed25519', 'raw');
	sigObj.hashAlgorithm = 'sha512';
	return (sigObj);
};
// Copyright 2015 Joyent, Inc.

var assert = require('assert-plus');
var util = require('util');

function FingerprintFormatError(fp, format) {
	if (Error.captureStackTrace)
		Error.captureStackTrace(this, FingerprintFormatError);
	this.name = 'FingerprintFormatError';
	this.fingerprint = fp;
	this.format = format;
	this.message = 'Fingerprint format is not supported, or is invalid: ';
	if (fp !== undefined)
		this.message += ' fingerprint = ' + fp;
	if (format !== undefined)
		this.message += ' format = ' + format;
}
util.inherits(FingerprintFormatError, Error);

function InvalidAlgorithmError(alg) {
	if (Error.captureStackTrace)
		Error.captureStackTrace(this, InvalidAlgorithmError);
	this.name = 'InvalidAlgorithmError';
	this.algorithm = alg;
	this.message = 'Algorithm "' + alg + '" is not supported';
}
util.inherits(InvalidAlgorithmError, Error);

function KeyParseError(name, format, innerErr) {
	if (Error.captureStackTrace)
		Error.captureStackTrace(this, KeyParseError);
	this.name = 'KeyParseError';
	this.format = format;
	this.keyName = name;
	this.innerErr = innerErr;
	this.message = 'Failed to parse ' + name + ' as a valid ' + format +
	    ' format key: ' + innerErr.message;
}
util.inherits(KeyParseError, Error);

function SignatureParseError(type, format, innerErr) {
	if (Error.captureStackTrace)
		Error.captureStackTrace(this, SignatureParseError);
	this.name = 'SignatureParseError';
	this.type = type;
	this.format = format;
	this.innerErr = innerErr;
	this.message = 'Failed to parse the given data as a ' + type +
	    ' signature in ' + format + ' format: ' + innerErr.message;
}
util.inherits(SignatureParseError, Error);

function CertificateParseError(name, format, innerErr) {
	if (Error.captureStackTrace)
		Error.captureStackTrace(this, CertificateParseError);
	this.name = 'CertificateParseError';
	this.format = format;
	this.certName = name;
	this.innerErr = innerErr;
	this.message = 'Failed to parse ' + name + ' as a valid ' + format +
	    ' format certificate: ' + innerErr.message;
}
util.inherits(CertificateParseError, Error);

function KeyEncryptedError(name, format) {
	if (Error.captureStackTrace)
		Error.captureStackTrace(this, KeyEncryptedError);
	this.name = 'KeyEncryptedError';
	this.format = format;
	this.keyName = name;
	this.message = 'The ' + format + ' format key ' + name + ' is ' +
	    'encrypted (password-protected), and no passphrase was ' +
	    'provided in `options`';
}
util.inherits(KeyEncryptedError, Error);

module.exports = {
	FingerprintFormatError: FingerprintFormatError,
	InvalidAlgorithmError: InvalidAlgorithmError,
	KeyParseError: KeyParseError,
	SignatureParseError: SignatureParseError,
	KeyEncryptedError: KeyEncryptedError,
	CertificateParseError: CertificateParseError
};
// Copyright 2018 Joyent, Inc.

module.exports = Fingerprint;

var assert = require('assert-plus');
var Buffer = require('safer-buffer').Buffer;
var algs = require('./algs');
var crypto = require('crypto');
var errs = require('./errors');
var Key = require('./key');
var PrivateKey = require('./private-key');
var Certificate = require('./certificate');
var utils = require('./utils');

var FingerprintFormatError = errs.FingerprintFormatError;
var InvalidAlgorithmError = errs.InvalidAlgorithmError;

function Fingerprint(opts) {
	assert.object(opts, 'options');
	assert.string(opts.type, 'options.type');
	assert.buffer(opts.hash, 'options.hash');
	assert.string(opts.algorithm, 'options.algorithm');

	this.algorithm = opts.algorithm.toLowerCase();
	if (algs.hashAlgs[this.algorithm] !== true)
		throw (new InvalidAlgorithmError(this.algorithm));

	this.hash = opts.hash;
	this.type = opts.type;
	this.hashType = opts.hashType;
}

Fingerprint.prototype.toString = function (format) {
	if (format === undefined) {
		if (this.algorithm === 'md5' || this.hashType === 'spki')
			format = 'hex';
		else
			format = 'base64';
	}
	assert.string(format);

	switch (format) {
	case 'hex':
		if (this.hashType === 'spki')
			return (this.hash.toString('hex'));
		return (addColons(this.hash.toString('hex')));
	case 'base64':
		if (this.hashType === 'spki')
			return (this.hash.toString('base64'));
		return (sshBase64Format(this.algorithm,
		    this.hash.toString('base64')));
	default:
		throw (new FingerprintFormatError(undefined, format));
	}
};

Fingerprint.prototype.matches = function (other) {
	assert.object(other, 'key or certificate');
	if (this.type === 'key' && this.hashType !== 'ssh') {
		utils.assertCompatible(other, Key, [1, 7], 'key with spki');
		if (PrivateKey.isPrivateKey(other)) {
			utils.assertCompatible(other, PrivateKey, [1, 6],
			    'privatekey with spki support');
		}
	} else if (this.type === 'key') {
		utils.assertCompatible(other, Key, [1, 0], 'key');
	} else {
		utils.assertCompatible(other, Certificate, [1, 0],
		    'certificate');
	}

	var theirHash = other.hash(this.algorithm, this.hashType);
	var theirHash2 = crypto.createHash(this.algorithm).
	    update(theirHash).digest('base64');

	if (this.hash2 === undefined)
		this.hash2 = crypto.createHash(this.algorithm).
		    update(this.hash).digest('base64');

	return (this.hash2 === theirHash2);
};

/*JSSTYLED*/
var base64RE = /^[A-Za-z0-9+\/=]+$/;
/*JSSTYLED*/
var hexRE = /^[a-fA-F0-9]+$/;

Fingerprint.parse = function (fp, options) {
	assert.string(fp, 'fingerprint');

	var alg, hash, enAlgs;
	if (Array.isArray(options)) {
		enAlgs = options;
		options = {};
	}
	assert.optionalObject(options, 'options');
	if (options === undefined)
		options = {};
	if (options.enAlgs !== undefined)
		enAlgs = options.enAlgs;
	if (options.algorithms !== undefined)
		enAlgs = options.algorithms;
	assert.optionalArrayOfString(enAlgs, 'algorithms');

	var hashType = 'ssh';
	if (options.hashType !== undefined)
		hashType = options.hashType;
	assert.string(hashType, 'options.hashType');

	var parts = fp.split(':');
	if (parts.length == 2) {
		alg = parts[0].toLowerCase();
		if (!base64RE.test(parts[1]))
			throw (new FingerprintFormatError(fp));
		try {
			hash = Buffer.from(parts[1], 'base64');
		} catch (e) {
			throw (new FingerprintFormatError(fp));
		}
	} else if (parts.length > 2) {
		alg = 'md5';
		if (parts[0].toLowerCase() === 'md5')
			parts = parts.slice(1);
		parts = parts.map(function (p) {
			while (p.length < 2)
				p = '0' + p;
			if (p.length > 2)
				throw (new FingerprintFormatError(fp));
			return (p);
		});
		parts = parts.join('');
		if (!hexRE.test(parts) || parts.length % 2 !== 0)
			throw (new FingerprintFormatError(fp));
		try {
			hash = Buffer.from(parts, 'hex');
		} catch (e) {
			throw (new FingerprintFormatError(fp));
		}
	} else {
		if (hexRE.test(fp)) {
			hash = Buffer.from(fp, 'hex');
		} else if (base64RE.test(fp)) {
			hash = Buffer.from(fp, 'base64');
		} else {
			throw (new FingerprintFormatError(fp));
		}

		switch (hash.length) {
		case 32:
			alg = 'sha256';
			break;
		case 16:
			alg = 'md5';
			break;
		case 20:
			alg = 'sha1';
			break;
		case 64:
			alg = 'sha512';
			break;
		default:
			throw (new FingerprintFormatError(fp));
		}

		/* Plain hex/base64: guess it's probably SPKI unless told. */
		if (options.hashType === undefined)
			hashType = 'spki';
	}

	if (alg === undefined)
		throw (new FingerprintFormatError(fp));

	if (algs.hashAlgs[alg] === undefined)
		throw (new InvalidAlgorithmError(alg));

	if (enAlgs !== undefined) {
		enAlgs = enAlgs.map(function (a) { return a.toLowerCase(); });
		if (enAlgs.indexOf(alg) === -1)
			throw (new InvalidAlgorithmError(alg));
	}

	return (new Fingerprint({
		algorithm: alg,
		hash: hash,
		type: options.type || 'key',
		hashType: hashType
	}));
};

function addColons(s) {
	/*JSSTYLED*/
	return (s.replace(/(.{2})(?=.)/g, '$1:'));
}

function base64Strip(s) {
	/*JSSTYLED*/
	return (s.replace(/=*$/, ''));
}

function sshBase64Format(alg, h) {
	return (alg.toUpperCase() + ':' + base64Strip(h));
}

Fingerprint.isFingerprint = function (obj, ver) {
	return (utils.isCompatible(obj, Fingerprint, ver));
};

/*
 * API versions for Fingerprint:
 * [1,0] -- initial ver
 * [1,1] -- first tagged ver
 * [1,2] -- hashType and spki support
 */
Fingerprint.prototype._sshpkApiVersion = [1, 2];

Fingerprint._oldVersionDetect = function (obj) {
	assert.func(obj.toString);
	assert.func(obj.matches);
	return ([1, 0]);
};
// Copyright 2017 Joyent, Inc.

module.exports = Identity;

var assert = require('assert-plus');
var algs = require('./algs');
var crypto = require('crypto');
var Fingerprint = require('./fingerprint');
var Signature = require('./signature');
var errs = require('./errors');
var util = require('util');
var utils = require('./utils');
var asn1 = require('asn1');
var Buffer = require('safer-buffer').Buffer;

/*JSSTYLED*/
var DNS_NAME_RE = /^([*]|[a-z0-9][a-z0-9\-]{0,62})(?:\.([*]|[a-z0-9][a-z0-9\-]{0,62}))*$/i;

var oids = {};
oids.cn = '2.5.4.3';
oids.o = '2.5.4.10';
oids.ou = '2.5.4.11';
oids.l = '2.5.4.7';
oids.s = '2.5.4.8';
oids.c = '2.5.4.6';
oids.sn = '2.5.4.4';
oids.postalCode = '2.5.4.17';
oids.serialNumber = '2.5.4.5';
oids.street = '2.5.4.9';
oids.x500UniqueIdentifier = '2.5.4.45';
oids.role = '2.5.4.72';
oids.telephoneNumber = '2.5.4.20';
oids.description = '2.5.4.13';
oids.dc = '0.9.2342.19200300.100.1.25';
oids.uid = '0.9.2342.19200300.100.1.1';
oids.mail = '0.9.2342.19200300.100.1.3';
oids.title = '2.5.4.12';
oids.gn = '2.5.4.42';
oids.initials = '2.5.4.43';
oids.pseudonym = '2.5.4.65';
oids.emailAddress = '1.2.840.113549.1.9.1';

var unoids = {};
Object.keys(oids).forEach(function (k) {
	unoids[oids[k]] = k;
});

function Identity(opts) {
	var self = this;
	assert.object(opts, 'options');
	assert.arrayOfObject(opts.components, 'options.components');
	this.components = opts.components;
	this.componentLookup = {};
	this.components.forEach(function (c) {
		if (c.name && !c.oid)
			c.oid = oids[c.name];
		if (c.oid && !c.name)
			c.name = unoids[c.oid];
		if (self.componentLookup[c.name] === undefined)
			self.componentLookup[c.name] = [];
		self.componentLookup[c.name].push(c);
	});
	if (this.componentLookup.cn && this.componentLookup.cn.length > 0) {
		this.cn = this.componentLookup.cn[0].value;
	}
	assert.optionalString(opts.type, 'options.type');
	if (opts.type === undefined) {
		if (this.components.length === 1 &&
		    this.componentLookup.cn &&
		    this.componentLookup.cn.length === 1 &&
		    this.componentLookup.cn[0].value.match(DNS_NAME_RE)) {
			this.type = 'host';
			this.hostname = this.componentLookup.cn[0].value;

		} else if (this.componentLookup.dc &&
		    this.components.length === this.componentLookup.dc.length) {
			this.type = 'host';
			this.hostname = this.componentLookup.dc.map(
			    function (c) {
				return (c.value);
			}).join('.');

		} else if (this.componentLookup.uid &&
		    this.components.length ===
		    this.componentLookup.uid.length) {
			this.type = 'user';
			this.uid = this.componentLookup.uid[0].value;

		} else if (this.componentLookup.cn &&
		    this.componentLookup.cn.length === 1 &&
		    this.componentLookup.cn[0].value.match(DNS_NAME_RE)) {
			this.type = 'host';
			this.hostname = this.componentLookup.cn[0].value;

		} else if (this.componentLookup.uid &&
		    this.componentLookup.uid.length === 1) {
			this.type = 'user';
			this.uid = this.componentLookup.uid[0].value;

		} else if (this.componentLookup.mail &&
		    this.componentLookup.mail.length === 1) {
			this.type = 'email';
			this.email = this.componentLookup.mail[0].value;

		} else if (this.componentLookup.cn &&
		    this.componentLookup.cn.length === 1) {
			this.type = 'user';
			this.uid = this.componentLookup.cn[0].value;

		} else {
			this.type = 'unknown';
		}
	} else {
		this.type = opts.type;
		if (this.type === 'host')
			this.hostname = opts.hostname;
		else if (this.type === 'user')
			this.uid = opts.uid;
		else if (this.type === 'email')
			this.email = opts.email;
		else
			throw (new Error('Unknown type ' + this.type));
	}
}

Identity.prototype.toString = function () {
	return (this.components.map(function (c) {
		var n = c.name.toUpperCase();
		/*JSSTYLED*/
		n = n.replace(/=/g, '\\=');
		var v = c.value;
		/*JSSTYLED*/
		v = v.replace(/,/g, '\\,');
		return (n + '=' + v);
	}).join(', '));
};

Identity.prototype.get = function (name, asArray) {
	assert.string(name, 'name');
	var arr = this.componentLookup[name];
	if (arr === undefined || arr.length === 0)
		return (undefined);
	if (!asArray && arr.length > 1)
		throw (new Error('Multiple values for attribute ' + name));
	if (!asArray)
		return (arr[0].value);
	return (arr.map(function (c) {
		return (c.value);
	}));
};

Identity.prototype.toArray = function (idx) {
	return (this.components.map(function (c) {
		return ({
			name: c.name,
			value: c.value
		});
	}));
};

/*
 * These are from X.680 -- PrintableString allowed chars are in section 37.4
 * table 8. Spec for IA5Strings is "1,6 + SPACE + DEL" where 1 refers to
 * ISO IR #001 (standard ASCII control characters) and 6 refers to ISO IR #006
 * (the basic ASCII character set).
 */
/* JSSTYLED */
var NOT_PRINTABLE = /[^a-zA-Z0-9 '(),+.\/:=?-]/;
/* JSSTYLED */
var NOT_IA5 = /[^\x00-\x7f]/;

Identity.prototype.toAsn1 = function (der, tag) {
	der.startSequence(tag);
	this.components.forEach(function (c) {
		der.startSequence(asn1.Ber.Constructor | asn1.Ber.Set);
		der.startSequence();
		der.writeOID(c.oid);
		/*
		 * If we fit in a PrintableString, use that. Otherwise use an
		 * IA5String or UTF8String.
		 *
		 * If this identity was parsed from a DN, use the ASN.1 types
		 * from the original representation (otherwise this might not
		 * be a full match for the original in some validators).
		 */
		if (c.asn1type === asn1.Ber.Utf8String ||
		    c.value.match(NOT_IA5)) {
			var v = Buffer.from(c.value, 'utf8');
			der.writeBuffer(v, asn1.Ber.Utf8String);

		} else if (c.asn1type === asn1.Ber.IA5String ||
		    c.value.match(NOT_PRINTABLE)) {
			der.writeString(c.value, asn1.Ber.IA5String);

		} else {
			var type = asn1.Ber.PrintableString;
			if (c.asn1type !== undefined)
				type = c.asn1type;
			der.writeString(c.value, type);
		}
		der.endSequence();
		der.endSequence();
	});
	der.endSequence();
};

function globMatch(a, b) {
	if (a === '**' || b === '**')
		return (true);
	var aParts = a.split('.');
	var bParts = b.split('.');
	if (aParts.length !== bParts.length)
		return (false);
	for (var i = 0; i < aParts.length; ++i) {
		if (aParts[i] === '*' || bParts[i] === '*')
			continue;
		if (aParts[i] !== bParts[i])
			return (false);
	}
	return (true);
}

Identity.prototype.equals = function (other) {
	if (!Identity.isIdentity(other, [1, 0]))
		return (false);
	if (other.components.length !== this.components.length)
		return (false);
	for (var i = 0; i < this.components.length; ++i) {
		if (this.components[i].oid !== other.components[i].oid)
			return (false);
		if (!globMatch(this.components[i].value,
		    other.components[i].value)) {
			return (false);
		}
	}
	return (true);
};

Identity.forHost = function (hostname) {
	assert.string(hostname, 'hostname');
	return (new Identity({
		type: 'host',
		hostname: hostname,
		components: [ { name: 'cn', value: hostname } ]
	}));
};

Identity.forUser = function (uid) {
	assert.string(uid, 'uid');
	return (new Identity({
		type: 'user',
		uid: uid,
		components: [ { name: 'uid', value: uid } ]
	}));
};

Identity.forEmail = function (email) {
	assert.string(email, 'email');
	return (new Identity({
		type: 'email',
		email: email,
		components: [ { name: 'mail', value: email } ]
	}));
};

Identity.parseDN = function (dn) {
	assert.string(dn, 'dn');
	var parts = [''];
	var idx = 0;
	var rem = dn;
	while (rem.length > 0) {
		var m;
		/*JSSTYLED*/
		if ((m = /^,/.exec(rem)) !== null) {
			parts[++idx] = '';
			rem = rem.slice(m[0].length);
		/*JSSTYLED*/
		} else if ((m = /^\\,/.exec(rem)) !== null) {
			parts[idx] += ',';
			rem = rem.slice(m[0].length);
		/*JSSTYLED*/
		} else if ((m = /^\\./.exec(rem)) !== null) {
			parts[idx] += m[0];
			rem = rem.slice(m[0].length);
		/*JSSTYLED*/
		} else if ((m = /^[^\\,]+/.exec(rem)) !== null) {
			parts[idx] += m[0];
			rem = rem.slice(m[0].length);
		} else {
			throw (new Error('Failed to parse DN'));
		}
	}
	var cmps = parts.map(function (c) {
		c = c.trim();
		var eqPos = c.indexOf('=');
		while (eqPos > 0 && c.charAt(eqPos - 1) === '\\')
			eqPos = c.indexOf('=', eqPos + 1);
		if (eqPos === -1) {
			throw (new Error('Failed to parse DN'));
		}
		/*JSSTYLED*/
		var name = c.slice(0, eqPos).toLowerCase().replace(/\\=/g, '=');
		var value = c.slice(eqPos + 1);
		return ({ name: name, value: value });
	});
	return (new Identity({ components: cmps }));
};

Identity.fromArray = function (components) {
	assert.arrayOfObject(components, 'components');
	components.forEach(function (cmp) {
		assert.object(cmp, 'component');
		assert.string(cmp.name, 'component.name');
		if (!Buffer.isBuffer(cmp.value) &&
		    !(typeof (cmp.value) === 'string')) {
			throw (new Error('Invalid component value'));
		}
	});
	return (new Identity({ components: components }));
};

Identity.parseAsn1 = function (der, top) {
	var components = [];
	der.readSequence(top);
	var end = der.offset + der.length;
	while (der.offset < end) {
		der.readSequence(asn1.Ber.Constructor | asn1.Ber.Set);
		var after = der.offset + der.length;
		der.readSequence();
		var oid = der.readOID();
		var type = der.peek();
		var value;
		switch (type) {
		case asn1.Ber.PrintableString:
		case asn1.Ber.IA5String:
		case asn1.Ber.OctetString:
		case asn1.Ber.T61String:
			value = der.readString(type);
			break;
		case asn1.Ber.Utf8String:
			value = der.readString(type, true);
			value = value.toString('utf8');
			break;
		case asn1.Ber.CharacterString:
		case asn1.Ber.BMPString:
			value = der.readString(type, true);
			value = value.toString('utf16le');
			break;
		default:
			throw (new Error('Unknown asn1 type ' + type));
		}
		components.push({ oid: oid, asn1type: type, value: value });
		der._offset = after;
	}
	der._offset = end;
	return (new Identity({
		components: components
	}));
};

Identity.isIdentity = function (obj, ver) {
	return (utils.isCompatible(obj, Identity, ver));
};

/*
 * API versions for Identity:
 * [1,0] -- initial ver
 */
Identity.prototype._sshpkApiVersion = [1, 0];

Identity._oldVersionDetect = function (obj) {
	return ([1, 0]);
};
// Copyright 2015 Joyent, Inc.

var Key = require('./key');
var Fingerprint = require('./fingerprint');
var Signature = require('./signature');
var PrivateKey = require('./private-key');
var Certificate = require('./certificate');
var Identity = require('./identity');
var errs = require('./errors');

module.exports = {
	/* top-level classes */
	Key: Key,
	parseKey: Key.parse,
	Fingerprint: Fingerprint,
	parseFingerprint: Fingerprint.parse,
	Signature: Signature,
	parseSignature: Signature.parse,
	PrivateKey: PrivateKey,
	parsePrivateKey: PrivateKey.parse,
	generatePrivateKey: PrivateKey.generate,
	Certificate: Certificate,
	parseCertificate: Certificate.parse,
	createSelfSignedCertificate: Certificate.createSelfSigned,
	createCertificate: Certificate.create,
	Identity: Identity,
	identityFromDN: Identity.parseDN,
	identityForHost: Identity.forHost,
	identityForUser: Identity.forUser,
	identityForEmail: Identity.forEmail,
	identityFromArray: Identity.fromArray,

	/* errors */
	FingerprintFormatError: errs.FingerprintFormatError,
	InvalidAlgorithmError: errs.InvalidAlgorithmError,
	KeyParseError: errs.KeyParseError,
	SignatureParseError: errs.SignatureParseError,
	KeyEncryptedError: errs.KeyEncryptedError,
	CertificateParseError: errs.CertificateParseError
};
// Copyright 2018 Joyent, Inc.

module.exports = Key;

var assert = require('assert-plus');
var algs = require('./algs');
var crypto = require('crypto');
var Fingerprint = require('./fingerprint');
var Signature = require('./signature');
var DiffieHellman = require('./dhe').DiffieHellman;
var errs = require('./errors');
var utils = require('./utils');
var PrivateKey = require('./private-key');
var edCompat;

try {
	edCompat = require('./ed-compat');
} catch (e) {
	/* Just continue through, and bail out if we try to use it. */
}

var InvalidAlgorithmError = errs.InvalidAlgorithmError;
var KeyParseError = errs.KeyParseError;

var formats = {};
formats['auto'] = require('./formats/auto');
formats['pem'] = require('./formats/pem');
formats['pkcs1'] = require('./formats/pkcs1');
formats['pkcs8'] = require('./formats/pkcs8');
formats['rfc4253'] = require('./formats/rfc4253');
formats['ssh'] = require('./formats/ssh');
formats['ssh-private'] = require('./formats/ssh-private');
formats['openssh'] = formats['ssh-private'];
formats['dnssec'] = require('./formats/dnssec');
formats['putty'] = require('./formats/putty');
formats['ppk'] = formats['putty'];

function Key(opts) {
	assert.object(opts, 'options');
	assert.arrayOfObject(opts.parts, 'options.parts');
	assert.string(opts.type, 'options.type');
	assert.optionalString(opts.comment, 'options.comment');

	var algInfo = algs.info[opts.type];
	if (typeof (algInfo) !== 'object')
		throw (new InvalidAlgorithmError(opts.type));

	var partLookup = {};
	for (var i = 0; i < opts.parts.length; ++i) {
		var part = opts.parts[i];
		partLookup[part.name] = part;
	}

	this.type = opts.type;
	this.parts = opts.parts;
	this.part = partLookup;
	this.comment = undefined;
	this.source = opts.source;

	/* for speeding up hashing/fingerprint operations */
	this._rfc4253Cache = opts._rfc4253Cache;
	this._hashCache = {};

	var sz;
	this.curve = undefined;
	if (this.type === 'ecdsa') {
		var curve = this.part.curve.data.toString();
		this.curve = curve;
		sz = algs.curves[curve].size;
	} else if (this.type === 'ed25519' || this.type === 'curve25519') {
		sz = 256;
		this.curve = 'curve25519';
	} else {
		var szPart = this.part[algInfo.sizePart];
		sz = szPart.data.length;
		sz = sz * 8 - utils.countZeros(szPart.data);
	}
	this.size = sz;
}

Key.formats = formats;

Key.prototype.toBuffer = function (format, options) {
	if (format === undefined)
		format = 'ssh';
	assert.string(format, 'format');
	assert.object(formats[format], 'formats[format]');
	assert.optionalObject(options, 'options');

	if (format === 'rfc4253') {
		if (this._rfc4253Cache === undefined)
			this._rfc4253Cache = formats['rfc4253'].write(this);
		return (this._rfc4253Cache);
	}

	return (formats[format].write(this, options));
};

Key.prototype.toString = function (format, options) {
	return (this.toBuffer(format, options).toString());
};

Key.prototype.hash = function (algo, type) {
	assert.string(algo, 'algorithm');
	assert.optionalString(type, 'type');
	if (type === undefined)
		type = 'ssh';
	algo = algo.toLowerCase();
	if (algs.hashAlgs[algo] === undefined)
		throw (new InvalidAlgorithmError(algo));

	var cacheKey = algo + '||' + type;
	if (this._hashCache[cacheKey])
		return (this._hashCache[cacheKey]);

	var buf;
	if (type === 'ssh') {
		buf = this.toBuffer('rfc4253');
	} else if (type === 'spki') {
		buf = formats.pkcs8.pkcs8ToBuffer(this);
	} else {
		throw (new Error('Hash type ' + type + ' not supported'));
	}
	var hash = crypto.createHash(algo).update(buf).digest();
	this._hashCache[cacheKey] = hash;
	return (hash);
};

Key.prototype.fingerprint = function (algo, type) {
	if (algo === undefined)
		algo = 'sha256';
	if (type === undefined)
		type = 'ssh';
	assert.string(algo, 'algorithm');
	assert.string(type, 'type');
	var opts = {
		type: 'key',
		hash: this.hash(algo, type),
		algorithm: algo,
		hashType: type
	};
	return (new Fingerprint(opts));
};

Key.prototype.defaultHashAlgorithm = function () {
	var hashAlgo = 'sha1';
	if (this.type === 'rsa')
		hashAlgo = 'sha256';
	if (this.type === 'dsa' && this.size > 1024)
		hashAlgo = 'sha256';
	if (this.type === 'ed25519')
		hashAlgo = 'sha512';
	if (this.type === 'ecdsa') {
		if (this.size <= 256)
			hashAlgo = 'sha256';
		else if (this.size <= 384)
			hashAlgo = 'sha384';
		else
			hashAlgo = 'sha512';
	}
	return (hashAlgo);
};

Key.prototype.createVerify = function (hashAlgo) {
	if (hashAlgo === undefined)
		hashAlgo = this.defaultHashAlgorithm();
	assert.string(hashAlgo, 'hash algorithm');

	/* ED25519 is not supported by OpenSSL, use a javascript impl. */
	if (this.type === 'ed25519' && edCompat !== undefined)
		return (new edCompat.Verifier(this, hashAlgo));
	if (this.type === 'curve25519')
		throw (new Error('Curve25519 keys are not suitable for ' +
		    'signing or verification'));

	var v, nm, err;
	try {
		nm = hashAlgo.toUpperCase();
		v = crypto.createVerify(nm);
	} catch (e) {
		err = e;
	}
	if (v === undefined || (err instanceof Error &&
	    err.message.match(/Unknown message digest/))) {
		nm = 'RSA-';
		nm += hashAlgo.toUpperCase();
		v = crypto.createVerify(nm);
	}
	assert.ok(v, 'failed to create verifier');
	var oldVerify = v.verify.bind(v);
	var key = this.toBuffer('pkcs8');
	var curve = this.curve;
	var self = this;
	v.verify = function (signature, fmt) {
		if (Signature.isSignature(signature, [2, 0])) {
			if (signature.type !== self.type)
				return (false);
			if (signature.hashAlgorithm &&
			    signature.hashAlgorithm !== hashAlgo)
				return (false);
			if (signature.curve && self.type === 'ecdsa' &&
			    signature.curve !== curve)
				return (false);
			return (oldVerify(key, signature.toBuffer('asn1')));

		} else if (typeof (signature) === 'string' ||
		    Buffer.isBuffer(signature)) {
			return (oldVerify(key, signature, fmt));

		/*
		 * Avoid doing this on valid arguments, walking the prototype
		 * chain can be quite slow.
		 */
		} else if (Signature.isSignature(signature, [1, 0])) {
			throw (new Error('signature was created by too old ' +
			    'a version of sshpk and cannot be verified'));

		} else {
			throw (new TypeError('signature must be a string, ' +
			    'Buffer, or Signature object'));
		}
	};
	return (v);
};

Key.prototype.createDiffieHellman = function () {
	if (this.type === 'rsa')
		throw (new Error('RSA keys do not support Diffie-Hellman'));

	return (new DiffieHellman(this));
};
Key.prototype.createDH = Key.prototype.createDiffieHellman;

Key.parse = function (data, format, options) {
	if (typeof (data) !== 'string')
		assert.buffer(data, 'data');
	if (format === undefined)
		format = 'auto';
	assert.string(format, 'format');
	if (typeof (options) === 'string')
		options = { filename: options };
	assert.optionalObject(options, 'options');
	if (options === undefined)
		options = {};
	assert.optionalString(options.filename, 'options.filename');
	if (options.filename === undefined)
		options.filename = '(unnamed)';

	assert.object(formats[format], 'formats[format]');

	try {
		var k = formats[format].read(data, options);
		if (k instanceof PrivateKey)
			k = k.toPublic();
		if (!k.comment)
			k.comment = options.filename;
		return (k);
	} catch (e) {
		if (e.name === 'KeyEncryptedError')
			throw (e);
		throw (new KeyParseError(options.filename, format, e));
	}
};

Key.isKey = function (obj, ver) {
	return (utils.isCompatible(obj, Key, ver));
};

/*
 * API versions for Key:
 * [1,0] -- initial ver, may take Signature for createVerify or may not
 * [1,1] -- added pkcs1, pkcs8 formats
 * [1,2] -- added auto, ssh-private, openssh formats
 * [1,3] -- added defaultHashAlgorithm
 * [1,4] -- added ed support, createDH
 * [1,5] -- first explicitly tagged version
 * [1,6] -- changed ed25519 part names
 * [1,7] -- spki hash types
 */
Key.prototype._sshpkApiVersion = [1, 7];

Key._oldVersionDetect = function (obj) {
	assert.func(obj.toBuffer);
	assert.func(obj.fingerprint);
	if (obj.createDH)
		return ([1, 4]);
	if (obj.defaultHashAlgorithm)
		return ([1, 3]);
	if (obj.formats['auto'])
		return ([1, 2]);
	if (obj.formats['pkcs1'])
		return ([1, 1]);
	return ([1, 0]);
};
// Copyright 2017 Joyent, Inc.

module.exports = PrivateKey;

var assert = require('assert-plus');
var Buffer = require('safer-buffer').Buffer;
var algs = require('./algs');
var crypto = require('crypto');
var Fingerprint = require('./fingerprint');
var Signature = require('./signature');
var errs = require('./errors');
var util = require('util');
var utils = require('./utils');
var dhe = require('./dhe');
var generateECDSA = dhe.generateECDSA;
var generateED25519 = dhe.generateED25519;
var edCompat = require('./ed-compat');
var nacl = require('tweetnacl');

var Key = require('./key');

var InvalidAlgorithmError = errs.InvalidAlgorithmError;
var KeyParseError = errs.KeyParseError;
var KeyEncryptedError = errs.KeyEncryptedError;

var formats = {};
formats['auto'] = require('./formats/auto');
formats['pem'] = require('./formats/pem');
formats['pkcs1'] = require('./formats/pkcs1');
formats['pkcs8'] = require('./formats/pkcs8');
formats['rfc4253'] = require('./formats/rfc4253');
formats['ssh-private'] = require('./formats/ssh-private');
formats['openssh'] = formats['ssh-private'];
formats['ssh'] = formats['ssh-private'];
formats['dnssec'] = require('./formats/dnssec');

function PrivateKey(opts) {
	assert.object(opts, 'options');
	Key.call(this, opts);

	this._pubCache = undefined;
}
util.inherits(PrivateKey, Key);

PrivateKey.formats = formats;

PrivateKey.prototype.toBuffer = function (format, options) {
	if (format === undefined)
		format = 'pkcs1';
	assert.string(format, 'format');
	assert.object(formats[format], 'formats[format]');
	assert.optionalObject(options, 'options');

	return (formats[format].write(this, options));
};

PrivateKey.prototype.hash = function (algo, type) {
	return (this.toPublic().hash(algo, type));
};

PrivateKey.prototype.fingerprint = function (algo, type) {
	return (this.toPublic().fingerprint(algo, type));
};

PrivateKey.prototype.toPublic = function () {
	if (this._pubCache)
		return (this._pubCache);

	var algInfo = algs.info[this.type];
	var pubParts = [];
	for (var i = 0; i < algInfo.parts.length; ++i) {
		var p = algInfo.parts[i];
		pubParts.push(this.part[p]);
	}

	this._pubCache = new Key({
		type: this.type,
		source: this,
		parts: pubParts
	});
	if (this.comment)
		this._pubCache.comment = this.comment;
	return (this._pubCache);
};

PrivateKey.prototype.derive = function (newType) {
	assert.string(newType, 'type');
	var priv, pub, pair;

	if (this.type === 'ed25519' && newType === 'curve25519') {
		priv = this.part.k.data;
		if (priv[0] === 0x00)
			priv = priv.slice(1);

		pair = nacl.box.keyPair.fromSecretKey(new Uint8Array(priv));
		pub = Buffer.from(pair.publicKey);

		return (new PrivateKey({
			type: 'curve25519',
			parts: [
				{ name: 'A', data: utils.mpNormalize(pub) },
				{ name: 'k', data: utils.mpNormalize(priv) }
			]
		}));
	} else if (this.type === 'curve25519' && newType === 'ed25519') {
		priv = this.part.k.data;
		if (priv[0] === 0x00)
			priv = priv.slice(1);

		pair = nacl.sign.keyPair.fromSeed(new Uint8Array(priv));
		pub = Buffer.from(pair.publicKey);

		return (new PrivateKey({
			type: 'ed25519',
			parts: [
				{ name: 'A', data: utils.mpNormalize(pub) },
				{ name: 'k', data: utils.mpNormalize(priv) }
			]
		}));
	}
	throw (new Error('Key derivation not supported from ' + this.type +
	    ' to ' + newType));
};

PrivateKey.prototype.createVerify = function (hashAlgo) {
	return (this.toPublic().createVerify(hashAlgo));
};

PrivateKey.prototype.createSign = function (hashAlgo) {
	if (hashAlgo === undefined)
		hashAlgo = this.defaultHashAlgorithm();
	assert.string(hashAlgo, 'hash algorithm');

	/* ED25519 is not supported by OpenSSL, use a javascript impl. */
	if (this.type === 'ed25519' && edCompat !== undefined)
		return (new edCompat.Signer(this, hashAlgo));
	if (this.type === 'curve25519')
		throw (new Error('Curve25519 keys are not suitable for ' +
		    'signing or verification'));

	var v, nm, err;
	try {
		nm = hashAlgo.toUpperCase();
		v = crypto.createSign(nm);
	} catch (e) {
		err = e;
	}
	if (v === undefined || (err instanceof Error &&
	    err.message.match(/Unknown message digest/))) {
		nm = 'RSA-';
		nm += hashAlgo.toUpperCase();
		v = crypto.createSign(nm);
	}
	assert.ok(v, 'failed to create verifier');
	var oldSign = v.sign.bind(v);
	var key = this.toBuffer('pkcs1');
	var type = this.type;
	var curve = this.curve;
	v.sign = function () {
		var sig = oldSign(key);
		if (typeof (sig) === 'string')
			sig = Buffer.from(sig, 'binary');
		sig = Signature.parse(sig, type, 'asn1');
		sig.hashAlgorithm = hashAlgo;
		sig.curve = curve;
		return (sig);
	};
	return (v);
};

PrivateKey.parse = function (data, format, options) {
	if (typeof (data) !== 'string')
		assert.buffer(data, 'data');
	if (format === undefined)
		format = 'auto';
	assert.string(format, 'format');
	if (typeof (options) === 'string')
		options = { filename: options };
	assert.optionalObject(options, 'options');
	if (options === undefined)
		options = {};
	assert.optionalString(options.filename, 'options.filename');
	if (options.filename === undefined)
		options.filename = '(unnamed)';

	assert.object(formats[format], 'formats[format]');

	try {
		var k = formats[format].read(data, options);
		assert.ok(k instanceof PrivateKey, 'key is not a private key');
		if (!k.comment)
			k.comment = options.filename;
		return (k);
	} catch (e) {
		if (e.name === 'KeyEncryptedError')
			throw (e);
		throw (new KeyParseError(options.filename, format, e));
	}
};

PrivateKey.isPrivateKey = function (obj, ver) {
	return (utils.isCompatible(obj, PrivateKey, ver));
};

PrivateKey.generate = function (type, options) {
	if (options === undefined)
		options = {};
	assert.object(options, 'options');

	switch (type) {
	case 'ecdsa':
		if (options.curve === undefined)
			options.curve = 'nistp256';
		assert.string(options.curve, 'options.curve');
		return (generateECDSA(options.curve));
	case 'ed25519':
		return (generateED25519());
	default:
		throw (new Error('Key generation not supported with key ' +
		    'type "' + type + '"'));
	}
};

/*
 * API versions for PrivateKey:
 * [1,0] -- initial ver
 * [1,1] -- added auto, pkcs[18], openssh/ssh-private formats
 * [1,2] -- added defaultHashAlgorithm
 * [1,3] -- added derive, ed, createDH
 * [1,4] -- first tagged version
 * [1,5] -- changed ed25519 part names and format
 * [1,6] -- type arguments for hash() and fingerprint()
 */
PrivateKey.prototype._sshpkApiVersion = [1, 6];

PrivateKey._oldVersionDetect = function (obj) {
	assert.func(obj.toPublic);
	assert.func(obj.createSign);
	if (obj.derive)
		return ([1, 3]);
	if (obj.defaultHashAlgorithm)
		return ([1, 2]);
	if (obj.formats['auto'])
		return ([1, 1]);
	return ([1, 0]);
};
// Copyright 2015 Joyent, Inc.

module.exports = Signature;

var assert = require('assert-plus');
var Buffer = require('safer-buffer').Buffer;
var algs = require('./algs');
var crypto = require('crypto');
var errs = require('./errors');
var utils = require('./utils');
var asn1 = require('asn1');
var SSHBuffer = require('./ssh-buffer');

var InvalidAlgorithmError = errs.InvalidAlgorithmError;
var SignatureParseError = errs.SignatureParseError;

function Signature(opts) {
	assert.object(opts, 'options');
	assert.arrayOfObject(opts.parts, 'options.parts');
	assert.string(opts.type, 'options.type');

	var partLookup = {};
	for (var i = 0; i < opts.parts.length; ++i) {
		var part = opts.parts[i];
		partLookup[part.name] = part;
	}

	this.type = opts.type;
	this.hashAlgorithm = opts.hashAlgo;
	this.curve = opts.curve;
	this.parts = opts.parts;
	this.part = partLookup;
}

Signature.prototype.toBuffer = function (format) {
	if (format === undefined)
		format = 'asn1';
	assert.string(format, 'format');

	var buf;
	var stype = 'ssh-' + this.type;

	switch (this.type) {
	case 'rsa':
		switch (this.hashAlgorithm) {
		case 'sha256':
			stype = 'rsa-sha2-256';
			break;
		case 'sha512':
			stype = 'rsa-sha2-512';
			break;
		case 'sha1':
		case undefined:
			break;
		default:
			throw (new Error('SSH signature ' +
			    'format does not support hash ' +
			    'algorithm ' + this.hashAlgorithm));
		}
		if (format === 'ssh') {
			buf = new SSHBuffer({});
			buf.writeString(stype);
			buf.writePart(this.part.sig);
			return (buf.toBuffer());
		} else {
			return (this.part.sig.data);
		}
		break;

	case 'ed25519':
		if (format === 'ssh') {
			buf = new SSHBuffer({});
			buf.writeString(stype);
			buf.writePart(this.part.sig);
			return (buf.toBuffer());
		} else {
			return (this.part.sig.data);
		}
		break;

	case 'dsa':
	case 'ecdsa':
		var r, s;
		if (format === 'asn1') {
			var der = new asn1.BerWriter();
			der.startSequence();
			r = utils.mpNormalize(this.part.r.data);
			s = utils.mpNormalize(this.part.s.data);
			der.writeBuffer(r, asn1.Ber.Integer);
			der.writeBuffer(s, asn1.Ber.Integer);
			der.endSequence();
			return (der.buffer);
		} else if (format === 'ssh' && this.type === 'dsa') {
			buf = new SSHBuffer({});
			buf.writeString('ssh-dss');
			r = this.part.r.data;
			if (r.length > 20 && r[0] === 0x00)
				r = r.slice(1);
			s = this.part.s.data;
			if (s.length > 20 && s[0] === 0x00)
				s = s.slice(1);
			if ((this.hashAlgorithm &&
			    this.hashAlgorithm !== 'sha1') ||
			    r.length + s.length !== 40) {
				throw (new Error('OpenSSH only supports ' +
				    'DSA signatures with SHA1 hash'));
			}
			buf.writeBuffer(Buffer.concat([r, s]));
			return (buf.toBuffer());
		} else if (format === 'ssh' && this.type === 'ecdsa') {
			var inner = new SSHBuffer({});
			r = this.part.r.data;
			inner.writeBuffer(r);
			inner.writePart(this.part.s);

			buf = new SSHBuffer({});
			/* XXX: find a more proper way to do this? */
			var curve;
			if (r[0] === 0x00)
				r = r.slice(1);
			var sz = r.length * 8;
			if (sz === 256)
				curve = 'nistp256';
			else if (sz === 384)
				curve = 'nistp384';
			else if (sz === 528)
				curve = 'nistp521';
			buf.writeString('ecdsa-sha2-' + curve);
			buf.writeBuffer(inner.toBuffer());
			return (buf.toBuffer());
		}
		throw (new Error('Invalid signature format'));
	default:
		throw (new Error('Invalid signature data'));
	}
};

Signature.prototype.toString = function (format) {
	assert.optionalString(format, 'format');
	return (this.toBuffer(format).toString('base64'));
};

Signature.parse = function (data, type, format) {
	if (typeof (data) === 'string')
		data = Buffer.from(data, 'base64');
	assert.buffer(data, 'data');
	assert.string(format, 'format');
	assert.string(type, 'type');

	var opts = {};
	opts.type = type.toLowerCase();
	opts.parts = [];

	try {
		assert.ok(data.length > 0, 'signature must not be empty');
		switch (opts.type) {
		case 'rsa':
			return (parseOneNum(data, type, format, opts));
		case 'ed25519':
			return (parseOneNum(data, type, format, opts));

		case 'dsa':
		case 'ecdsa':
			if (format === 'asn1')
				return (parseDSAasn1(data, type, format, opts));
			else if (opts.type === 'dsa')
				return (parseDSA(data, type, format, opts));
			else
				return (parseECDSA(data, type, format, opts));

		default:
			throw (new InvalidAlgorithmError(type));
		}

	} catch (e) {
		if (e instanceof InvalidAlgorithmError)
			throw (e);
		throw (new SignatureParseError(type, format, e));
	}
};

function parseOneNum(data, type, format, opts) {
	if (format === 'ssh') {
		try {
			var buf = new SSHBuffer({buffer: data});
			var head = buf.readString();
		} catch (e) {
			/* fall through */
		}
		if (buf !== undefined) {
			var msg = 'SSH signature does not match expected ' +
			    'type (expected ' + type + ', got ' + head + ')';
			switch (head) {
			case 'ssh-rsa':
				assert.strictEqual(type, 'rsa', msg);
				opts.hashAlgo = 'sha1';
				break;
			case 'rsa-sha2-256':
				assert.strictEqual(type, 'rsa', msg);
				opts.hashAlgo = 'sha256';
				break;
			case 'rsa-sha2-512':
				assert.strictEqual(type, 'rsa', msg);
				opts.hashAlgo = 'sha512';
				break;
			case 'ssh-ed25519':
				assert.strictEqual(type, 'ed25519', msg);
				opts.hashAlgo = 'sha512';
				break;
			default:
				throw (new Error('Unknown SSH signature ' +
				    'type: ' + head));
			}
			var sig = buf.readPart();
			assert.ok(buf.atEnd(), 'extra trailing bytes');
			sig.name = 'sig';
			opts.parts.push(sig);
			return (new Signature(opts));
		}
	}
	opts.parts.push({name: 'sig', data: data});
	return (new Signature(opts));
}

function parseDSAasn1(data, type, format, opts) {
	var der = new asn1.BerReader(data);
	der.readSequence();
	var r = der.readString(asn1.Ber.Integer, true);
	var s = der.readString(asn1.Ber.Integer, true);

	opts.parts.push({name: 'r', data: utils.mpNormalize(r)});
	opts.parts.push({name: 's', data: utils.mpNormalize(s)});

	return (new Signature(opts));
}

function parseDSA(data, type, format, opts) {
	if (data.length != 40) {
		var buf = new SSHBuffer({buffer: data});
		var d = buf.readBuffer();
		if (d.toString('ascii') === 'ssh-dss')
			d = buf.readBuffer();
		assert.ok(buf.atEnd(), 'extra trailing bytes');
		assert.strictEqual(d.length, 40, 'invalid inner length');
		data = d;
	}
	opts.parts.push({name: 'r', data: data.slice(0, 20)});
	opts.parts.push({name: 's', data: data.slice(20, 40)});
	return (new Signature(opts));
}

function parseECDSA(data, type, format, opts) {
	var buf = new SSHBuffer({buffer: data});

	var r, s;
	var inner = buf.readBuffer();
	var stype = inner.toString('ascii');
	if (stype.slice(0, 6) === 'ecdsa-') {
		var parts = stype.split('-');
		assert.strictEqual(parts[0], 'ecdsa');
		assert.strictEqual(parts[1], 'sha2');
		opts.curve = parts[2];
		switch (opts.curve) {
		case 'nistp256':
			opts.hashAlgo = 'sha256';
			break;
		case 'nistp384':
			opts.hashAlgo = 'sha384';
			break;
		case 'nistp521':
			opts.hashAlgo = 'sha512';
			break;
		default:
			throw (new Error('Unsupported ECDSA curve: ' +
			    opts.curve));
		}
		inner = buf.readBuffer();
		assert.ok(buf.atEnd(), 'extra trailing bytes on outer');
		buf = new SSHBuffer({buffer: inner});
		r = buf.readPart();
	} else {
		r = {data: inner};
	}

	s = buf.readPart();
	assert.ok(buf.atEnd(), 'extra trailing bytes');

	r.name = 'r';
	s.name = 's';

	opts.parts.push(r);
	opts.parts.push(s);
	return (new Signature(opts));
}

Signature.isSignature = function (obj, ver) {
	return (utils.isCompatible(obj, Signature, ver));
};

/*
 * API versions for Signature:
 * [1,0] -- initial ver
 * [2,0] -- support for rsa in full ssh format, compat with sshpk-agent
 *          hashAlgorithm property
 * [2,1] -- first tagged version
 */
Signature.prototype._sshpkApiVersion = [2, 1];

Signature._oldVersionDetect = function (obj) {
	assert.func(obj.toBuffer);
	if (obj.hasOwnProperty('hashAlgorithm'))
		return ([2, 0]);
	return ([1, 0]);
};
// Copyright 2015 Joyent, Inc.

module.exports = SSHBuffer;

var assert = require('assert-plus');
var Buffer = require('safer-buffer').Buffer;

function SSHBuffer(opts) {
	assert.object(opts, 'options');
	if (opts.buffer !== undefined)
		assert.buffer(opts.buffer, 'options.buffer');

	this._size = opts.buffer ? opts.buffer.length : 1024;
	this._buffer = opts.buffer || Buffer.alloc(this._size);
	this._offset = 0;
}

SSHBuffer.prototype.toBuffer = function () {
	return (this._buffer.slice(0, this._offset));
};

SSHBuffer.prototype.atEnd = function () {
	return (this._offset >= this._buffer.length);
};

SSHBuffer.prototype.remainder = function () {
	return (this._buffer.slice(this._offset));
};

SSHBuffer.prototype.skip = function (n) {
	this._offset += n;
};

SSHBuffer.prototype.expand = function () {
	this._size *= 2;
	var buf = Buffer.alloc(this._size);
	this._buffer.copy(buf, 0);
	this._buffer = buf;
};

SSHBuffer.prototype.readPart = function () {
	return ({data: this.readBuffer()});
};

SSHBuffer.prototype.readBuffer = function () {
	var len = this._buffer.readUInt32BE(this._offset);
	this._offset += 4;
	assert.ok(this._offset + len <= this._buffer.length,
	    'length out of bounds at +0x' + this._offset.toString(16) +
	    ' (data truncated?)');
	var buf = this._buffer.slice(this._offset, this._offset + len);
	this._offset += len;
	return (buf);
};

SSHBuffer.prototype.readString = function () {
	return (this.readBuffer().toString());
};

SSHBuffer.prototype.readCString = function () {
	var offset = this._offset;
	while (offset < this._buffer.length &&
	    this._buffer[offset] !== 0x00)
		offset++;
	assert.ok(offset < this._buffer.length, 'c string does not terminate');
	var str = this._buffer.slice(this._offset, offset).toString();
	this._offset = offset + 1;
	return (str);
};

SSHBuffer.prototype.readInt = function () {
	var v = this._buffer.readUInt32BE(this._offset);
	this._offset += 4;
	return (v);
};

SSHBuffer.prototype.readInt64 = function () {
	assert.ok(this._offset + 8 < this._buffer.length,
	    'buffer not long enough to read Int64');
	var v = this._buffer.slice(this._offset, this._offset + 8);
	this._offset += 8;
	return (v);
};

SSHBuffer.prototype.readChar = function () {
	var v = this._buffer[this._offset++];
	return (v);
};

SSHBuffer.prototype.writeBuffer = function (buf) {
	while (this._offset + 4 + buf.length > this._size)
		this.expand();
	this._buffer.writeUInt32BE(buf.length, this._offset);
	this._offset += 4;
	buf.copy(this._buffer, this._offset);
	this._offset += buf.length;
};

SSHBuffer.prototype.writeString = function (str) {
	this.writeBuffer(Buffer.from(str, 'utf8'));
};

SSHBuffer.prototype.writeCString = function (str) {
	while (this._offset + 1 + str.length > this._size)
		this.expand();
	this._buffer.write(str, this._offset);
	this._offset += str.length;
	this._buffer[this._offset++] = 0;
};

SSHBuffer.prototype.writeInt = function (v) {
	while (this._offset + 4 > this._size)
		this.expand();
	this._buffer.writeUInt32BE(v, this._offset);
	this._offset += 4;
};

SSHBuffer.prototype.writeInt64 = function (v) {
	assert.buffer(v, 'value');
	if (v.length > 8) {
		var lead = v.slice(0, v.length - 8);
		for (var i = 0; i < lead.length; ++i) {
			assert.strictEqual(lead[i], 0,
			    'must fit in 64 bits of precision');
		}
		v = v.slice(v.length - 8, v.length);
	}
	while (this._offset + 8 > this._size)
		this.expand();
	v.copy(this._buffer, this._offset);
	this._offset += 8;
};

SSHBuffer.prototype.writeChar = function (v) {
	while (this._offset + 1 > this._size)
		this.expand();
	this._buffer[this._offset++] = v;
};

SSHBuffer.prototype.writePart = function (p) {
	this.writeBuffer(p.data);
};

SSHBuffer.prototype.write = function (buf) {
	while (this._offset + buf.length > this._size)
		this.expand();
	buf.copy(this._buffer, this._offset);
	this._offset += buf.length;
};
// Copyright 2015 Joyent, Inc.

module.exports = {
	bufferSplit: bufferSplit,
	addRSAMissing: addRSAMissing,
	calculateDSAPublic: calculateDSAPublic,
	calculateED25519Public: calculateED25519Public,
	calculateX25519Public: calculateX25519Public,
	mpNormalize: mpNormalize,
	mpDenormalize: mpDenormalize,
	ecNormalize: ecNormalize,
	countZeros: countZeros,
	assertCompatible: assertCompatible,
	isCompatible: isCompatible,
	opensslKeyDeriv: opensslKeyDeriv,
	opensshCipherInfo: opensshCipherInfo,
	publicFromPrivateECDSA: publicFromPrivateECDSA,
	zeroPadToLength: zeroPadToLength,
	writeBitString: writeBitString,
	readBitString: readBitString,
	pbkdf2: pbkdf2
};

var assert = require('assert-plus');
var Buffer = require('safer-buffer').Buffer;
var PrivateKey = require('./private-key');
var Key = require('./key');
var crypto = require('crypto');
var algs = require('./algs');
var asn1 = require('asn1');

var ec = require('ecc-jsbn/lib/ec');
var jsbn = require('jsbn').BigInteger;
var nacl = require('tweetnacl');

var MAX_CLASS_DEPTH = 3;

function isCompatible(obj, klass, needVer) {
	if (obj === null || typeof (obj) !== 'object')
		return (false);
	if (needVer === undefined)
		needVer = klass.prototype._sshpkApiVersion;
	if (obj instanceof klass &&
	    klass.prototype._sshpkApiVersion[0] == needVer[0])
		return (true);
	var proto = Object.getPrototypeOf(obj);
	var depth = 0;
	while (proto.constructor.name !== klass.name) {
		proto = Object.getPrototypeOf(proto);
		if (!proto || ++depth > MAX_CLASS_DEPTH)
			return (false);
	}
	if (proto.constructor.name !== klass.name)
		return (false);
	var ver = proto._sshpkApiVersion;
	if (ver === undefined)
		ver = klass._oldVersionDetect(obj);
	if (ver[0] != needVer[0] || ver[1] < needVer[1])
		return (false);
	return (true);
}

function assertCompatible(obj, klass, needVer, name) {
	if (name === undefined)
		name = 'object';
	assert.ok(obj, name + ' must not be null');
	assert.object(obj, name + ' must be an object');
	if (needVer === undefined)
		needVer = klass.prototype._sshpkApiVersion;
	if (obj instanceof klass &&
	    klass.prototype._sshpkApiVersion[0] == needVer[0])
		return;
	var proto = Object.getPrototypeOf(obj);
	var depth = 0;
	while (proto.constructor.name !== klass.name) {
		proto = Object.getPrototypeOf(proto);
		assert.ok(proto && ++depth <= MAX_CLASS_DEPTH,
		    name + ' must be a ' + klass.name + ' instance');
	}
	assert.strictEqual(proto.constructor.name, klass.name,
	    name + ' must be a ' + klass.name + ' instance');
	var ver = proto._sshpkApiVersion;
	if (ver === undefined)
		ver = klass._oldVersionDetect(obj);
	assert.ok(ver[0] == needVer[0] && ver[1] >= needVer[1],
	    name + ' must be compatible with ' + klass.name + ' klass ' +
	    'version ' + needVer[0] + '.' + needVer[1]);
}

var CIPHER_LEN = {
	'des-ede3-cbc': { key: 24, iv: 8 },
	'aes-128-cbc': { key: 16, iv: 16 },
	'aes-256-cbc': { key: 32, iv: 16 }
};
var PKCS5_SALT_LEN = 8;

function opensslKeyDeriv(cipher, salt, passphrase, count) {
	assert.buffer(salt, 'salt');
	assert.buffer(passphrase, 'passphrase');
	assert.number(count, 'iteration count');

	var clen = CIPHER_LEN[cipher];
	assert.object(clen, 'supported cipher');

	salt = salt.slice(0, PKCS5_SALT_LEN);

	var D, D_prev, bufs;
	var material = Buffer.alloc(0);
	while (material.length < clen.key + clen.iv) {
		bufs = [];
		if (D_prev)
			bufs.push(D_prev);
		bufs.push(passphrase);
		bufs.push(salt);
		D = Buffer.concat(bufs);
		for (var j = 0; j < count; ++j)
			D = crypto.createHash('md5').update(D).digest();
		material = Buffer.concat([material, D]);
		D_prev = D;
	}

	return ({
	    key: material.slice(0, clen.key),
	    iv: material.slice(clen.key, clen.key + clen.iv)
	});
}

/* See: RFC2898 */
function pbkdf2(hashAlg, salt, iterations, size, passphrase) {
	var hkey = Buffer.alloc(salt.length + 4);
	salt.copy(hkey);

	var gen = 0, ts = [];
	var i = 1;
	while (gen < size) {
		var t = T(i++);
		gen += t.length;
		ts.push(t);
	}
	return (Buffer.concat(ts).slice(0, size));

	function T(I) {
		hkey.writeUInt32BE(I, hkey.length - 4);

		var hmac = crypto.createHmac(hashAlg, passphrase);
		hmac.update(hkey);

		var Ti = hmac.digest();
		var Uc = Ti;
		var c = 1;
		while (c++ < iterations) {
			hmac = crypto.createHmac(hashAlg, passphrase);
			hmac.update(Uc);
			Uc = hmac.digest();
			for (var x = 0; x < Ti.length; ++x)
				Ti[x] ^= Uc[x];
		}
		return (Ti);
	}
}

/* Count leading zero bits on a buffer */
function countZeros(buf) {
	var o = 0, obit = 8;
	while (o < buf.length) {
		var mask = (1 << obit);
		if ((buf[o] & mask) === mask)
			break;
		obit--;
		if (obit < 0) {
			o++;
			obit = 8;
		}
	}
	return (o*8 + (8 - obit) - 1);
}

function bufferSplit(buf, chr) {
	assert.buffer(buf);
	assert.string(chr);

	var parts = [];
	var lastPart = 0;
	var matches = 0;
	for (var i = 0; i < buf.length; ++i) {
		if (buf[i] === chr.charCodeAt(matches))
			++matches;
		else if (buf[i] === chr.charCodeAt(0))
			matches = 1;
		else
			matches = 0;

		if (matches >= chr.length) {
			var newPart = i + 1;
			parts.push(buf.slice(lastPart, newPart - matches));
			lastPart = newPart;
			matches = 0;
		}
	}
	if (lastPart <= buf.length)
		parts.push(buf.slice(lastPart, buf.length));

	return (parts);
}

function ecNormalize(buf, addZero) {
	assert.buffer(buf);
	if (buf[0] === 0x00 && buf[1] === 0x04) {
		if (addZero)
			return (buf);
		return (buf.slice(1));
	} else if (buf[0] === 0x04) {
		if (!addZero)
			return (buf);
	} else {
		while (buf[0] === 0x00)
			buf = buf.slice(1);
		if (buf[0] === 0x02 || buf[0] === 0x03)
			throw (new Error('Compressed elliptic curve points ' +
			    'are not supported'));
		if (buf[0] !== 0x04)
			throw (new Error('Not a valid elliptic curve point'));
		if (!addZero)
			return (buf);
	}
	var b = Buffer.alloc(buf.length + 1);
	b[0] = 0x0;
	buf.copy(b, 1);
	return (b);
}

function readBitString(der, tag) {
	if (tag === undefined)
		tag = asn1.Ber.BitString;
	var buf = der.readString(tag, true);
	assert.strictEqual(buf[0], 0x00, 'bit strings with unused bits are ' +
	    'not supported (0x' + buf[0].toString(16) + ')');
	return (buf.slice(1));
}

function writeBitString(der, buf, tag) {
	if (tag === undefined)
		tag = asn1.Ber.BitString;
	var b = Buffer.alloc(buf.length + 1);
	b[0] = 0x00;
	buf.copy(b, 1);
	der.writeBuffer(b, tag);
}

function mpNormalize(buf) {
	assert.buffer(buf);
	while (buf.length > 1 && buf[0] === 0x00 && (buf[1] & 0x80) === 0x00)
		buf = buf.slice(1);
	if ((buf[0] & 0x80) === 0x80) {
		var b = Buffer.alloc(buf.length + 1);
		b[0] = 0x00;
		buf.copy(b, 1);
		buf = b;
	}
	return (buf);
}

function mpDenormalize(buf) {
	assert.buffer(buf);
	while (buf.length > 1 && buf[0] === 0x00)
		buf = buf.slice(1);
	return (buf);
}

function zeroPadToLength(buf, len) {
	assert.buffer(buf);
	assert.number(len);
	while (buf.length > len) {
		assert.equal(buf[0], 0x00);
		buf = buf.slice(1);
	}
	while (buf.length < len) {
		var b = Buffer.alloc(buf.length + 1);
		b[0] = 0x00;
		buf.copy(b, 1);
		buf = b;
	}
	return (buf);
}

function bigintToMpBuf(bigint) {
	var buf = Buffer.from(bigint.toByteArray());
	buf = mpNormalize(buf);
	return (buf);
}

function calculateDSAPublic(g, p, x) {
	assert.buffer(g);
	assert.buffer(p);
	assert.buffer(x);
	g = new jsbn(g);
	p = new jsbn(p);
	x = new jsbn(x);
	var y = g.modPow(x, p);
	var ybuf = bigintToMpBuf(y);
	return (ybuf);
}

function calculateED25519Public(k) {
	assert.buffer(k);

	var kp = nacl.sign.keyPair.fromSeed(new Uint8Array(k));
	return (Buffer.from(kp.publicKey));
}

function calculateX25519Public(k) {
	assert.buffer(k);

	var kp = nacl.box.keyPair.fromSeed(new Uint8Array(k));
	return (Buffer.from(kp.publicKey));
}

function addRSAMissing(key) {
	assert.object(key);
	assertCompatible(key, PrivateKey, [1, 1]);

	var d = new jsbn(key.part.d.data);
	var buf;

	if (!key.part.dmodp) {
		var p = new jsbn(key.part.p.data);
		var dmodp = d.mod(p.subtract(1));

		buf = bigintToMpBuf(dmodp);
		key.part.dmodp = {name: 'dmodp', data: buf};
		key.parts.push(key.part.dmodp);
	}
	if (!key.part.dmodq) {
		var q = new jsbn(key.part.q.data);
		var dmodq = d.mod(q.subtract(1));

		buf = bigintToMpBuf(dmodq);
		key.part.dmodq = {name: 'dmodq', data: buf};
		key.parts.push(key.part.dmodq);
	}
}

function publicFromPrivateECDSA(curveName, priv) {
	assert.string(curveName, 'curveName');
	assert.buffer(priv);
	var params = algs.curves[curveName];
	var p = new jsbn(params.p);
	var a = new jsbn(params.a);
	var b = new jsbn(params.b);
	var curve = new ec.ECCurveFp(p, a, b);
	var G = curve.decodePointHex(params.G.toString('hex'));

	var d = new jsbn(mpNormalize(priv));
	var pub = G.multiply(d);
	pub = Buffer.from(curve.encodePointHex(pub), 'hex');

	var parts = [];
	parts.push({name: 'curve', data: Buffer.from(curveName)});
	parts.push({name: 'Q', data: pub});

	var key = new Key({type: 'ecdsa', curve: curve, parts: parts});
	return (key);
}

function opensshCipherInfo(cipher) {
	var inf = {};
	switch (cipher) {
	case '3des-cbc':
		inf.keySize = 24;
		inf.blockSize = 8;
		inf.opensslName = 'des-ede3-cbc';
		break;
	case 'blowfish-cbc':
		inf.keySize = 16;
		inf.blockSize = 8;
		inf.opensslName = 'bf-cbc';
		break;
	case 'aes128-cbc':
	case 'aes128-ctr':
	case 'aes128-gcm@openssh.com':
		inf.keySize = 16;
		inf.blockSize = 16;
		inf.opensslName = 'aes-128-' + cipher.slice(7, 10);
		break;
	case 'aes192-cbc':
	case 'aes192-ctr':
	case 'aes192-gcm@openssh.com':
		inf.keySize = 24;
		inf.blockSize = 16;
		inf.opensslName = 'aes-192-' + cipher.slice(7, 10);
		break;
	case 'aes256-cbc':
	case 'aes256-ctr':
	case 'aes256-gcm@openssh.com':
		inf.keySize = 32;
		inf.blockSize = 16;
		inf.opensslName = 'aes-256-' + cipher.slice(7, 10);
		break;
	default:
		throw (new Error(
		    'Unsupported openssl cipher "' + cipher + '"'));
	}
	return (inf);
}
// Copyright 2018 Joyent, Inc.

module.exports = {
	read: read,
	write: write
};

var assert = require('assert-plus');
var Buffer = require('safer-buffer').Buffer;
var utils = require('../utils');
var Key = require('../key');
var PrivateKey = require('../private-key');

var pem = require('./pem');
var ssh = require('./ssh');
var rfc4253 = require('./rfc4253');
var dnssec = require('./dnssec');
var putty = require('./putty');

var DNSSEC_PRIVKEY_HEADER_PREFIX = 'Private-key-format: v1';

function read(buf, options) {
	if (typeof (buf) === 'string') {
		if (buf.trim().match(/^[-]+[ ]*BEGIN/))
			return (pem.read(buf, options));
		if (buf.match(/^\s*ssh-[a-z]/))
			return (ssh.read(buf, options));
		if (buf.match(/^\s*ecdsa-/))
			return (ssh.read(buf, options));
		if (buf.match(/^putty-user-key-file-2:/i))
			return (putty.read(buf, options));
		if (findDNSSECHeader(buf))
			return (dnssec.read(buf, options));
		buf = Buffer.from(buf, 'binary');
	} else {
		assert.buffer(buf);
		if (findPEMHeader(buf))
			return (pem.read(buf, options));
		if (findSSHHeader(buf))
			return (ssh.read(buf, options));
		if (findPuTTYHeader(buf))
			return (putty.read(buf, options));
		if (findDNSSECHeader(buf))
			return (dnssec.read(buf, options));
	}
	if (buf.readUInt32BE(0) < buf.length)
		return (rfc4253.read(buf, options));
	throw (new Error('Failed to auto-detect format of key'));
}

function findPuTTYHeader(buf) {
	var offset = 0;
	while (offset < buf.length &&
	    (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9))
		++offset;
	if (offset + 22 <= buf.length &&
	    buf.slice(offset, offset + 22).toString('ascii').toLowerCase() ===
	    'putty-user-key-file-2:')
		return (true);
	return (false);
}

function findSSHHeader(buf) {
	var offset = 0;
	while (offset < buf.length &&
	    (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9))
		++offset;
	if (offset + 4 <= buf.length &&
	    buf.slice(offset, offset + 4).toString('ascii') === 'ssh-')
		return (true);
	if (offset + 6 <= buf.length &&
	    buf.slice(offset, offset + 6).toString('ascii') === 'ecdsa-')
		return (true);
	return (false);
}

function findPEMHeader(buf) {
	var offset = 0;
	while (offset < buf.length &&
	    (buf[offset] === 32 || buf[offset] === 10))
		++offset;
	if (buf[offset] !== 45)
		return (false);
	while (offset < buf.length &&
	    (buf[offset] === 45))
		++offset;
	while (offset < buf.length &&
	    (buf[offset] === 32))
		++offset;
	if (offset + 5 > buf.length ||
	    buf.slice(offset, offset + 5).toString('ascii') !== 'BEGIN')
		return (false);
	return (true);
}

function findDNSSECHeader(buf) {
	// private case first
	if (buf.length <= DNSSEC_PRIVKEY_HEADER_PREFIX.length)
		return (false);
	var headerCheck = buf.slice(0, DNSSEC_PRIVKEY_HEADER_PREFIX.length);
	if (headerCheck.toString('ascii') === DNSSEC_PRIVKEY_HEADER_PREFIX)
		return (true);

	// public-key RFC3110 ?
	// 'domain.com. IN KEY ...' or 'domain.com. IN DNSKEY ...'
	// skip any comment-lines
	if (typeof (buf) !== 'string') {
		buf = buf.toString('ascii');
	}
	var lines = buf.split('\n');
	var line = 0;
	/* JSSTYLED */
	while (lines[line].match(/^\;/))
		line++;
	if (lines[line].toString('ascii').match(/\. IN KEY /))
		return (true);
	if (lines[line].toString('ascii').match(/\. IN DNSKEY /))
		return (true);
	return (false);
}

function write(key, options) {
	throw (new Error('"auto" format cannot be used for writing'));
}
// Copyright 2017 Joyent, Inc.

module.exports = {
	read: read,
	write: write
};

var assert = require('assert-plus');
var Buffer = require('safer-buffer').Buffer;
var Key = require('../key');
var PrivateKey = require('../private-key');
var utils = require('../utils');
var SSHBuffer = require('../ssh-buffer');
var Dhe = require('../dhe');

var supportedAlgos = {
	'rsa-sha1' : 5,
	'rsa-sha256' : 8,
	'rsa-sha512' : 10,
	'ecdsa-p256-sha256' : 13,
	'ecdsa-p384-sha384' : 14
	/*
	 * ed25519 is hypothetically supported with id 15
	 * but the common tools available don't appear to be
	 * capable of generating/using ed25519 keys
	 */
};

var supportedAlgosById = {};
Object.keys(supportedAlgos).forEach(function (k) {
	supportedAlgosById[supportedAlgos[k]] = k.toUpperCase();
});

function read(buf, options) {
	if (typeof (buf) !== 'string') {
		assert.buffer(buf, 'buf');
		buf = buf.toString('ascii');
	}
	var lines = buf.split('\n');
	if (lines[0].match(/^Private-key-format\: v1/)) {
		var algElems = lines[1].split(' ');
		var algoNum = parseInt(algElems[1], 10);
		var algoName = algElems[2];
		if (!supportedAlgosById[algoNum])
			throw (new Error('Unsupported algorithm: ' + algoName));
		return (readDNSSECPrivateKey(algoNum, lines.slice(2)));
	}

	// skip any comment-lines
	var line = 0;
	/* JSSTYLED */
	while (lines[line].match(/^\;/))
		line++;
	// we should now have *one single* line left with our KEY on it.
	if ((lines[line].match(/\. IN KEY /) ||
	    lines[line].match(/\. IN DNSKEY /)) && lines[line+1].length === 0) {
		return (readRFC3110(lines[line]));
	}
	throw (new Error('Cannot parse dnssec key'));
}

function readRFC3110(keyString) {
	var elems = keyString.split(' ');
	//unused var flags = parseInt(elems[3], 10);
	//unused var protocol = parseInt(elems[4], 10);
	var algorithm = parseInt(elems[5], 10);
	if (!supportedAlgosById[algorithm])
		throw (new Error('Unsupported algorithm: ' + algorithm));
	var base64key = elems.slice(6, elems.length).join();
	var keyBuffer = Buffer.from(base64key, 'base64');
	if (supportedAlgosById[algorithm].match(/^RSA-/)) {
		// join the rest of the body into a single base64-blob
		var publicExponentLen = keyBuffer.readUInt8(0);
		if (publicExponentLen != 3 && publicExponentLen != 1)
			throw (new Error('Cannot parse dnssec key: ' +
			    'unsupported exponent length'));

		var publicExponent = keyBuffer.slice(1, publicExponentLen+1);
		publicExponent = utils.mpNormalize(publicExponent);
		var modulus = keyBuffer.slice(1+publicExponentLen);
		modulus = utils.mpNormalize(modulus);
		// now, make the key
		var rsaKey = {
			type: 'rsa',
			parts: []
		};
		rsaKey.parts.push({ name: 'e', data: publicExponent});
		rsaKey.parts.push({ name: 'n', data: modulus});
		return (new Key(rsaKey));
	}
	if (supportedAlgosById[algorithm] === 'ECDSA-P384-SHA384' ||
	    supportedAlgosById[algorithm] === 'ECDSA-P256-SHA256') {
		var curve = 'nistp384';
		var size = 384;
		if (supportedAlgosById[algorithm].match(/^ECDSA-P256-SHA256/)) {
			curve = 'nistp256';
			size = 256;
		}

		var ecdsaKey = {
			type: 'ecdsa',
			curve: curve,
			size: size,
			parts: [
				{name: 'curve', data: Buffer.from(curve) },
				{name: 'Q', data: utils.ecNormalize(keyBuffer) }
			]
		};
		return (new Key(ecdsaKey));
	}
	throw (new Error('Unsupported algorithm: ' +
	    supportedAlgosById[algorithm]));
}

function elementToBuf(e) {
	return (Buffer.from(e.split(' ')[1], 'base64'));
}

function readDNSSECRSAPrivateKey(elements) {
	var rsaParams = {};
	elements.forEach(function (element) {
		if (element.split(' ')[0] === 'Modulus:')
			rsaParams['n'] = elementToBuf(element);
		else if (element.split(' ')[0] === 'PublicExponent:')
			rsaParams['e'] = elementToBuf(element);
		else if (element.split(' ')[0] === 'PrivateExponent:')
			rsaParams['d'] = elementToBuf(element);
		else if (element.split(' ')[0] === 'Prime1:')
			rsaParams['p'] = elementToBuf(element);
		else if (element.split(' ')[0] === 'Prime2:')
			rsaParams['q'] = elementToBuf(element);
		else if (element.split(' ')[0] === 'Exponent1:')
			rsaParams['dmodp'] = elementToBuf(element);
		else if (element.split(' ')[0] === 'Exponent2:')
			rsaParams['dmodq'] = elementToBuf(element);
		else if (element.split(' ')[0] === 'Coefficient:')
			rsaParams['iqmp'] = elementToBuf(element);
	});
	// now, make the key
	var key = {
		type: 'rsa',
		parts: [
			{ name: 'e', data: utils.mpNormalize(rsaParams['e'])},
			{ name: 'n', data: utils.mpNormalize(rsaParams['n'])},
			{ name: 'd', data: utils.mpNormalize(rsaParams['d'])},
			{ name: 'p', data: utils.mpNormalize(rsaParams['p'])},
			{ name: 'q', data: utils.mpNormalize(rsaParams['q'])},
			{ name: 'dmodp',
			    data: utils.mpNormalize(rsaParams['dmodp'])},
			{ name: 'dmodq',
			    data: utils.mpNormalize(rsaParams['dmodq'])},
			{ name: 'iqmp',
			    data: utils.mpNormalize(rsaParams['iqmp'])}
		]
	};
	return (new PrivateKey(key));
}

function readDNSSECPrivateKey(alg, elements) {
	if (supportedAlgosById[alg].match(/^RSA-/)) {
		return (readDNSSECRSAPrivateKey(elements));
	}
	if (supportedAlgosById[alg] === 'ECDSA-P384-SHA384' ||
	    supportedAlgosById[alg] === 'ECDSA-P256-SHA256') {
		var d = Buffer.from(elements[0].split(' ')[1], 'base64');
		var curve = 'nistp384';
		var size = 384;
		if (supportedAlgosById[alg] === 'ECDSA-P256-SHA256') {
			curve = 'nistp256';
			size = 256;
		}
		// DNSSEC generates the public-key on the fly (go calculate it)
		var publicKey = utils.publicFromPrivateECDSA(curve, d);
		var Q = publicKey.part['Q'].data;
		var ecdsaKey = {
			type: 'ecdsa',
			curve: curve,
			size: size,
			parts: [
				{name: 'curve', data: Buffer.from(curve) },
				{name: 'd', data: d },
				{name: 'Q', data: Q }
			]
		};
		return (new PrivateKey(ecdsaKey));
	}
	throw (new Error('Unsupported algorithm: ' + supportedAlgosById[alg]));
}

function dnssecTimestamp(date) {
	var year = date.getFullYear() + ''; //stringify
	var month = (date.getMonth() + 1);
	var timestampStr = year + month + date.getUTCDate();
	timestampStr += '' + date.getUTCHours() + date.getUTCMinutes();
	timestampStr += date.getUTCSeconds();
	return (timestampStr);
}

function rsaAlgFromOptions(opts) {
	if (!opts || !opts.hashAlgo || opts.hashAlgo === 'sha1')
		return ('5 (RSASHA1)');
	else if (opts.hashAlgo === 'sha256')
		return ('8 (RSASHA256)');
	else if (opts.hashAlgo === 'sha512')
		return ('10 (RSASHA512)');
	else
		throw (new Error('Unknown or unsupported hash: ' +
		    opts.hashAlgo));
}

function writeRSA(key, options) {
	// if we're missing parts, add them.
	if (!key.part.dmodp || !key.part.dmodq) {
		utils.addRSAMissing(key);
	}

	var out = '';
	out += 'Private-key-format: v1.3\n';
	out += 'Algorithm: ' + rsaAlgFromOptions(options) + '\n';
	var n = utils.mpDenormalize(key.part['n'].data);
	out += 'Modulus: ' + n.toString('base64') + '\n';
	var e = utils.mpDenormalize(key.part['e'].data);
	out += 'PublicExponent: ' + e.toString('base64') + '\n';
	var d = utils.mpDenormalize(key.part['d'].data);
	out += 'PrivateExponent: ' + d.toString('base64') + '\n';
	var p = utils.mpDenormalize(key.part['p'].data);
	out += 'Prime1: ' + p.toString('base64') + '\n';
	var q = utils.mpDenormalize(key.part['q'].data);
	out += 'Prime2: ' + q.toString('base64') + '\n';
	var dmodp = utils.mpDenormalize(key.part['dmodp'].data);
	out += 'Exponent1: ' + dmodp.toString('base64') + '\n';
	var dmodq = utils.mpDenormalize(key.part['dmodq'].data);
	out += 'Exponent2: ' + dmodq.toString('base64') + '\n';
	var iqmp = utils.mpDenormalize(key.part['iqmp'].data);
	out += 'Coefficient: ' + iqmp.toString('base64') + '\n';
	// Assume that we're valid as-of now
	var timestamp = new Date();
	out += 'Created: ' + dnssecTimestamp(timestamp) + '\n';
	out += 'Publish: ' + dnssecTimestamp(timestamp) + '\n';
	out += 'Activate: ' + dnssecTimestamp(timestamp) + '\n';
	return (Buffer.from(out, 'ascii'));
}

function writeECDSA(key, options) {
	var out = '';
	out += 'Private-key-format: v1.3\n';

	if (key.curve === 'nistp256') {
		out += 'Algorithm: 13 (ECDSAP256SHA256)\n';
	} else if (key.curve === 'nistp384') {
		out += 'Algorithm: 14 (ECDSAP384SHA384)\n';
	} else {
		throw (new Error('Unsupported curve'));
	}
	var base64Key = key.part['d'].data.toString('base64');
	out += 'PrivateKey: ' + base64Key + '\n';

	// Assume that we're valid as-of now
	var timestamp = new Date();
	out += 'Created: ' + dnssecTimestamp(timestamp) + '\n';
	out += 'Publish: ' + dnssecTimestamp(timestamp) + '\n';
	out += 'Activate: ' + dnssecTimestamp(timestamp) + '\n';

	return (Buffer.from(out, 'ascii'));
}

function write(key, options) {
	if (PrivateKey.isPrivateKey(key)) {
		if (key.type === 'rsa') {
			return (writeRSA(key, options));
		} else if (key.type === 'ecdsa') {
			return (writeECDSA(key, options));
		} else {
			throw (new Error('Unsupported algorithm: ' + key.type));
		}
	} else if (Key.isKey(key)) {
		/*
		 * RFC3110 requires a keyname, and a keytype, which we
		 * don't really have a mechanism for specifying such
		 * additional metadata.
		 */
		throw (new Error('Format "dnssec" only supports ' +
		    'writing private keys'));
	} else {
		throw (new Error('key is not a Key or PrivateKey'));
	}
}
// Copyright 2017 Joyent, Inc.

module.exports = {
	read: read,
	verify: verify,
	sign: sign,
	signAsync: signAsync,
	write: write,

	/* Internal private API */
	fromBuffer: fromBuffer,
	toBuffer: toBuffer
};

var assert = require('assert-plus');
var SSHBuffer = require('../ssh-buffer');
var crypto = require('crypto');
var Buffer = require('safer-buffer').Buffer;
var algs = require('../algs');
var Key = require('../key');
var PrivateKey = require('../private-key');
var Identity = require('../identity');
var rfc4253 = require('./rfc4253');
var Signature = require('../signature');
var utils = require('../utils');
var Certificate = require('../certificate');

function verify(cert, key) {
	/*
	 * We always give an issuerKey, so if our verify() is being called then
	 * there was no signature. Return false.
	 */
	return (false);
}

var TYPES = {
	'user': 1,
	'host': 2
};
Object.keys(TYPES).forEach(function (k) { TYPES[TYPES[k]] = k; });

var ECDSA_ALGO = /^ecdsa-sha2-([^@-]+)-cert-v01@openssh.com$/;

function read(buf, options) {
	if (Buffer.isBuffer(buf))
		buf = buf.toString('ascii');
	var parts = buf.trim().split(/[ \t\n]+/g);
	if (parts.length < 2 || parts.length > 3)
		throw (new Error('Not a valid SSH certificate line'));

	var algo = parts[0];
	var data = parts[1];

	data = Buffer.from(data, 'base64');
	return (fromBuffer(data, algo));
}

function fromBuffer(data, algo, partial) {
	var sshbuf = new SSHBuffer({ buffer: data });
	var innerAlgo = sshbuf.readString();
	if (algo !== undefined && innerAlgo !== algo)
		throw (new Error('SSH certificate algorithm mismatch'));
	if (algo === undefined)
		algo = innerAlgo;

	var cert = {};
	cert.signatures = {};
	cert.signatures.openssh = {};

	cert.signatures.openssh.nonce = sshbuf.readBuffer();

	var key = {};
	var parts = (key.parts = []);
	key.type = getAlg(algo);

	var partCount = algs.info[key.type].parts.length;
	while (parts.length < partCount)
		parts.push(sshbuf.readPart());
	assert.ok(parts.length >= 1, 'key must have at least one part');

	var algInfo = algs.info[key.type];
	if (key.type === 'ecdsa') {
		var res = ECDSA_ALGO.exec(algo);
		assert.ok(res !== null);
		assert.strictEqual(res[1], parts[0].data.toString());
	}

	for (var i = 0; i < algInfo.parts.length; ++i) {
		parts[i].name = algInfo.parts[i];
		if (parts[i].name !== 'curve' &&
		    algInfo.normalize !== false) {
			var p = parts[i];
			p.data = utils.mpNormalize(p.data);
		}
	}

	cert.subjectKey = new Key(key);

	cert.serial = sshbuf.readInt64();

	var type = TYPES[sshbuf.readInt()];
	assert.string(type, 'valid cert type');

	cert.signatures.openssh.keyId = sshbuf.readString();

	var principals = [];
	var pbuf = sshbuf.readBuffer();
	var psshbuf = new SSHBuffer({ buffer: pbuf });
	while (!psshbuf.atEnd())
		principals.push(psshbuf.readString());
	if (principals.length === 0)
		principals = ['*'];

	cert.subjects = principals.map(function (pr) {
		if (type === 'user')
			return (Identity.forUser(pr));
		else if (type === 'host')
			return (Identity.forHost(pr));
		throw (new Error('Unknown identity type ' + type));
	});

	cert.validFrom = int64ToDate(sshbuf.readInt64());
	cert.validUntil = int64ToDate(sshbuf.readInt64());

	var exts = [];
	var extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() });
	var ext;
	while (!extbuf.atEnd()) {
		ext = { critical: true };
		ext.name = extbuf.readString();
		ext.data = extbuf.readBuffer();
		exts.push(ext);
	}
	extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() });
	while (!extbuf.atEnd()) {
		ext = { critical: false };
		ext.name = extbuf.readString();
		ext.data = extbuf.readBuffer();
		exts.push(ext);
	}
	cert.signatures.openssh.exts = exts;

	/* reserved */
	sshbuf.readBuffer();

	var signingKeyBuf = sshbuf.readBuffer();
	cert.issuerKey = rfc4253.read(signingKeyBuf);

	/*
	 * OpenSSH certs don't give the identity of the issuer, just their
	 * public key. So, we use an Identity that matches anything. The
	 * isSignedBy() function will later tell you if the key matches.
	 */
	cert.issuer = Identity.forHost('**');

	var sigBuf = sshbuf.readBuffer();
	cert.signatures.openssh.signature =
	    Signature.parse(sigBuf, cert.issuerKey.type, 'ssh');

	if (partial !== undefined) {
		partial.remainder = sshbuf.remainder();
		partial.consumed = sshbuf._offset;
	}

	return (new Certificate(cert));
}

function int64ToDate(buf) {
	var i = buf.readUInt32BE(0) * 4294967296;
	i += buf.readUInt32BE(4);
	var d = new Date();
	d.setTime(i * 1000);
	d.sourceInt64 = buf;
	return (d);
}

function dateToInt64(date) {
	if (date.sourceInt64 !== undefined)
		return (date.sourceInt64);
	var i = Math.round(date.getTime() / 1000);
	var upper = Math.floor(i / 4294967296);
	var lower = Math.floor(i % 4294967296);
	var buf = Buffer.alloc(8);
	buf.writeUInt32BE(upper, 0);
	buf.writeUInt32BE(lower, 4);
	return (buf);
}

function sign(cert, key) {
	if (cert.signatures.openssh === undefined)
		cert.signatures.openssh = {};
	try {
		var blob = toBuffer(cert, true);
	} catch (e) {
		delete (cert.signatures.openssh);
		return (false);
	}
	var sig = cert.signatures.openssh;
	var hashAlgo = undefined;
	if (key.type === 'rsa' || key.type === 'dsa')
		hashAlgo = 'sha1';
	var signer = key.createSign(hashAlgo);
	signer.write(blob);
	sig.signature = signer.sign();
	return (true);
}

function signAsync(cert, signer, done) {
	if (cert.signatures.openssh === undefined)
		cert.signatures.openssh = {};
	try {
		var blob = toBuffer(cert, true);
	} catch (e) {
		delete (cert.signatures.openssh);
		done(e);
		return;
	}
	var sig = cert.signatures.openssh;

	signer(blob, function (err, signature) {
		if (err) {
			done(err);
			return;
		}
		try {
			/*
			 * This will throw if the signature isn't of a
			 * type/algo that can be used for SSH.
			 */
			signature.toBuffer('ssh');
		} catch (e) {
			done(e);
			return;
		}
		sig.signature = signature;
		done();
	});
}

function write(cert, options) {
	if (options === undefined)
		options = {};

	var blob = toBuffer(cert);
	var out = getCertType(cert.subjectKey) + ' ' + blob.toString('base64');
	if (options.comment)
		out = out + ' ' + options.comment;
	return (out);
}


function toBuffer(cert, noSig) {
	assert.object(cert.signatures.openssh, 'signature for openssh format');
	var sig = cert.signatures.openssh;

	if (sig.nonce === undefined)
		sig.nonce = crypto.randomBytes(16);
	var buf = new SSHBuffer({});
	buf.writeString(getCertType(cert.subjectKey));
	buf.writeBuffer(sig.nonce);

	var key = cert.subjectKey;
	var algInfo = algs.info[key.type];
	algInfo.parts.forEach(function (part) {
		buf.writePart(key.part[part]);
	});

	buf.writeInt64(cert.serial);

	var type = cert.subjects[0].type;
	assert.notStrictEqual(type, 'unknown');
	cert.subjects.forEach(function (id) {
		assert.strictEqual(id.type, type);
	});
	type = TYPES[type];
	buf.writeInt(type);

	if (sig.keyId === undefined) {
		sig.keyId = cert.subjects[0].type + '_' +
		    (cert.subjects[0].uid || cert.subjects[0].hostname);
	}
	buf.writeString(sig.keyId);

	var sub = new SSHBuffer({});
	cert.subjects.forEach(function (id) {
		if (type === TYPES.host)
			sub.writeString(id.hostname);
		else if (type === TYPES.user)
			sub.writeString(id.uid);
	});
	buf.writeBuffer(sub.toBuffer());

	buf.writeInt64(dateToInt64(cert.validFrom));
	buf.writeInt64(dateToInt64(cert.validUntil));

	var exts = sig.exts;
	if (exts === undefined)
		exts = [];

	var extbuf = new SSHBuffer({});
	exts.forEach(function (ext) {
		if (ext.critical !== true)
			return;
		extbuf.writeString(ext.name);
		extbuf.writeBuffer(ext.data);
	});
	buf.writeBuffer(extbuf.toBuffer());

	extbuf = new SSHBuffer({});
	exts.forEach(function (ext) {
		if (ext.critical === true)
			return;
		extbuf.writeString(ext.name);
		extbuf.writeBuffer(ext.data);
	});
	buf.writeBuffer(extbuf.toBuffer());

	/* reserved */
	buf.writeBuffer(Buffer.alloc(0));

	sub = rfc4253.write(cert.issuerKey);
	buf.writeBuffer(sub);

	if (!noSig)
		buf.writeBuffer(sig.signature.toBuffer('ssh'));

	return (buf.toBuffer());
}

function getAlg(certType) {
	if (certType === 'ssh-rsa-cert-v01@openssh.com')
		return ('rsa');
	if (certType === 'ssh-dss-cert-v01@openssh.com')
		return ('dsa');
	if (certType.match(ECDSA_ALGO))
		return ('ecdsa');
	if (certType === 'ssh-ed25519-cert-v01@openssh.com')
		return ('ed25519');
	throw (new Error('Unsupported cert type ' + certType));
}

function getCertType(key) {
	if (key.type === 'rsa')
		return ('ssh-rsa-cert-v01@openssh.com');
	if (key.type === 'dsa')
		return ('ssh-dss-cert-v01@openssh.com');
	if (key.type === 'ecdsa')
		return ('ecdsa-sha2-' + key.curve + '-cert-v01@openssh.com');
	if (key.type === 'ed25519')
		return ('ssh-ed25519-cert-v01@openssh.com');
	throw (new Error('Unsupported key type ' + key.type));
}
// Copyright 2018 Joyent, Inc.

module.exports = {
	read: read,
	write: write
};

var assert = require('assert-plus');
var asn1 = require('asn1');
var crypto = require('crypto');
var Buffer = require('safer-buffer').Buffer;
var algs = require('../algs');
var utils = require('../utils');
var Key = require('../key');
var PrivateKey = require('../private-key');

var pkcs1 = require('./pkcs1');
var pkcs8 = require('./pkcs8');
var sshpriv = require('./ssh-private');
var rfc4253 = require('./rfc4253');

var errors = require('../errors');

var OID_PBES2 = '1.2.840.113549.1.5.13';
var OID_PBKDF2 = '1.2.840.113549.1.5.12';

var OID_TO_CIPHER = {
	'1.2.840.113549.3.7': '3des-cbc',
	'2.16.840.1.101.3.4.1.2': 'aes128-cbc',
	'2.16.840.1.101.3.4.1.42': 'aes256-cbc'
};
var CIPHER_TO_OID = {};
Object.keys(OID_TO_CIPHER).forEach(function (k) {
	CIPHER_TO_OID[OID_TO_CIPHER[k]] = k;
});

var OID_TO_HASH = {
	'1.2.840.113549.2.7': 'sha1',
	'1.2.840.113549.2.9': 'sha256',
	'1.2.840.113549.2.11': 'sha512'
};
var HASH_TO_OID = {};
Object.keys(OID_TO_HASH).forEach(function (k) {
	HASH_TO_OID[OID_TO_HASH[k]] = k;
});

/*
 * For reading we support both PKCS#1 and PKCS#8. If we find a private key,
 * we just take the public component of it and use that.
 */
function read(buf, options, forceType) {
	var input = buf;
	if (typeof (buf) !== 'string') {
		assert.buffer(buf, 'buf');
		buf = buf.toString('ascii');
	}

	var lines = buf.trim().split(/[\r\n]+/g);

	var m;
	var si = -1;
	while (!m && si < lines.length) {
		m = lines[++si].match(/*JSSTYLED*/
		    /[-]+[ ]*BEGIN ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/);
	}
	assert.ok(m, 'invalid PEM header');

	var m2;
	var ei = lines.length;
	while (!m2 && ei > 0) {
		m2 = lines[--ei].match(/*JSSTYLED*/
		    /[-]+[ ]*END ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/);
	}
	assert.ok(m2, 'invalid PEM footer');

	/* Begin and end banners must match key type */
	assert.equal(m[2], m2[2]);
	var type = m[2].toLowerCase();

	var alg;
	if (m[1]) {
		/* They also must match algorithms, if given */
		assert.equal(m[1], m2[1], 'PEM header and footer mismatch');
		alg = m[1].trim();
	}

	lines = lines.slice(si, ei + 1);

	var headers = {};
	while (true) {
		lines = lines.slice(1);
		m = lines[0].match(/*JSSTYLED*/
		    /^([A-Za-z0-9-]+): (.+)$/);
		if (!m)
			break;
		headers[m[1].toLowerCase()] = m[2];
	}

	/* Chop off the first and last lines */
	lines = lines.slice(0, -1).join('');
	buf = Buffer.from(lines, 'base64');

	var cipher, key, iv;
	if (headers['proc-type']) {
		var parts = headers['proc-type'].split(',');
		if (parts[0] === '4' && parts[1] === 'ENCRYPTED') {
			if (typeof (options.passphrase) === 'string') {
				options.passphrase = Buffer.from(
				    options.passphrase, 'utf-8');
			}
			if (!Buffer.isBuffer(options.passphrase)) {
				throw (new errors.KeyEncryptedError(
				    options.filename, 'PEM'));
			} else {
				parts = headers['dek-info'].split(',');
				assert.ok(parts.length === 2);
				cipher = parts[0].toLowerCase();
				iv = Buffer.from(parts[1], 'hex');
				key = utils.opensslKeyDeriv(cipher, iv,
				    options.passphrase, 1).key;
			}
		}
	}

	if (alg && alg.toLowerCase() === 'encrypted') {
		var eder = new asn1.BerReader(buf);
		var pbesEnd;
		eder.readSequence();

		eder.readSequence();
		pbesEnd = eder.offset + eder.length;

		var method = eder.readOID();
		if (method !== OID_PBES2) {
			throw (new Error('Unsupported PEM/PKCS8 encryption ' +
			    'scheme: ' + method));
		}

		eder.readSequence();	/* PBES2-params */

		eder.readSequence();	/* keyDerivationFunc */
		var kdfEnd = eder.offset + eder.length;
		var kdfOid = eder.readOID();
		if (kdfOid !== OID_PBKDF2)
			throw (new Error('Unsupported PBES2 KDF: ' + kdfOid));
		eder.readSequence();
		var salt = eder.readString(asn1.Ber.OctetString, true);
		var iterations = eder.readInt();
		var hashAlg = 'sha1';
		if (eder.offset < kdfEnd) {
			eder.readSequence();
			var hashAlgOid = eder.readOID();
			hashAlg = OID_TO_HASH[hashAlgOid];
			if (hashAlg === undefined) {
				throw (new Error('Unsupported PBKDF2 hash: ' +
				    hashAlgOid));
			}
		}
		eder._offset = kdfEnd;

		eder.readSequence();	/* encryptionScheme */
		var cipherOid = eder.readOID();
		cipher = OID_TO_CIPHER[cipherOid];
		if (cipher === undefined) {
			throw (new Error('Unsupported PBES2 cipher: ' +
			    cipherOid));
		}
		iv = eder.readString(asn1.Ber.OctetString, true);

		eder._offset = pbesEnd;
		buf = eder.readString(asn1.Ber.OctetString, true);

		if (typeof (options.passphrase) === 'string') {
			options.passphrase = Buffer.from(
			    options.passphrase, 'utf-8');
		}
		if (!Buffer.isBuffer(options.passphrase)) {
			throw (new errors.KeyEncryptedError(
			    options.filename, 'PEM'));
		}

		var cinfo = utils.opensshCipherInfo(cipher);

		cipher = cinfo.opensslName;
		key = utils.pbkdf2(hashAlg, salt, iterations, cinfo.keySize,
		    options.passphrase);
		alg = undefined;
	}

	if (cipher && key && iv) {
		var cipherStream = crypto.createDecipheriv(cipher, key, iv);
		var chunk, chunks = [];
		cipherStream.once('error', function (e) {
			if (e.toString().indexOf('bad decrypt') !== -1) {
				throw (new Error('Incorrect passphrase ' +
				    'supplied, could not decrypt key'));
			}
			throw (e);
		});
		cipherStream.write(buf);
		cipherStream.end();
		while ((chunk = cipherStream.read()) !== null)
			chunks.push(chunk);
		buf = Buffer.concat(chunks);
	}

	/* The new OpenSSH internal format abuses PEM headers */
	if (alg && alg.toLowerCase() === 'openssh')
		return (sshpriv.readSSHPrivate(type, buf, options));
	if (alg && alg.toLowerCase() === 'ssh2')
		return (rfc4253.readType(type, buf, options));

	var der = new asn1.BerReader(buf);
	der.originalInput = input;

	/*
	 * All of the PEM file types start with a sequence tag, so chop it
	 * off here
	 */
	der.readSequence();

	/* PKCS#1 type keys name an algorithm in the banner explicitly */
	if (alg) {
		if (forceType)
			assert.strictEqual(forceType, 'pkcs1');
		return (pkcs1.readPkcs1(alg, type, der));
	} else {
		if (forceType)
			assert.strictEqual(forceType, 'pkcs8');
		return (pkcs8.readPkcs8(alg, type, der));
	}
}

function write(key, options, type) {
	assert.object(key);

	var alg = {
	    'ecdsa': 'EC',
	    'rsa': 'RSA',
	    'dsa': 'DSA',
	    'ed25519': 'EdDSA'
	}[key.type];
	var header;

	var der = new asn1.BerWriter();

	if (PrivateKey.isPrivateKey(key)) {
		if (type && type === 'pkcs8') {
			header = 'PRIVATE KEY';
			pkcs8.writePkcs8(der, key);
		} else {
			if (type)
				assert.strictEqual(type, 'pkcs1');
			header = alg + ' PRIVATE KEY';
			pkcs1.writePkcs1(der, key);
		}

	} else if (Key.isKey(key)) {
		if (type && type === 'pkcs1') {
			header = alg + ' PUBLIC KEY';
			pkcs1.writePkcs1(der, key);
		} else {
			if (type)
				assert.strictEqual(type, 'pkcs8');
			header = 'PUBLIC KEY';
			pkcs8.writePkcs8(der, key);
		}

	} else {
		throw (new Error('key is not a Key or PrivateKey'));
	}

	var tmp = der.buffer.toString('base64');
	var len = tmp.length + (tmp.length / 64) +
	    18 + 16 + header.length*2 + 10;
	var buf = Buffer.alloc(len);
	var o = 0;
	o += buf.write('-----BEGIN ' + header + '-----\n', o);
	for (var i = 0; i < tmp.length; ) {
		var limit = i + 64;
		if (limit > tmp.length)
			limit = tmp.length;
		o += buf.write(tmp.slice(i, limit), o);
		buf[o++] = 10;
		i = limit;
	}
	o += buf.write('-----END ' + header + '-----\n', o);

	return (buf.slice(0, o));
}
// Copyright 2015 Joyent, Inc.

module.exports = {
	read: read,
	readPkcs1: readPkcs1,
	write: write,
	writePkcs1: writePkcs1
};

var assert = require('assert-plus');
var asn1 = require('asn1');
var Buffer = require('safer-buffer').Buffer;
var algs = require('../algs');
var utils = require('../utils');

var Key = require('../key');
var PrivateKey = require('../private-key');
var pem = require('./pem');

var pkcs8 = require('./pkcs8');
var readECDSACurve = pkcs8.readECDSACurve;

function read(buf, options) {
	return (pem.read(buf, options, 'pkcs1'));
}

function write(key, options) {
	return (pem.write(key, options, 'pkcs1'));
}

/* Helper to read in a single mpint */
function readMPInt(der, nm) {
	assert.strictEqual(der.peek(), asn1.Ber.Integer,
	    nm + ' is not an Integer');
	return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true)));
}

function readPkcs1(alg, type, der) {
	switch (alg) {
	case 'RSA':
		if (type === 'public')
			return (readPkcs1RSAPublic(der));
		else if (type === 'private')
			return (readPkcs1RSAPrivate(der));
		throw (new Error('Unknown key type: ' + type));
	case 'DSA':
		if (type === 'public')
			return (readPkcs1DSAPublic(der));
		else if (type === 'private')
			return (readPkcs1DSAPrivate(der));
		throw (new Error('Unknown key type: ' + type));
	case 'EC':
	case 'ECDSA':
		if (type === 'private')
			return (readPkcs1ECDSAPrivate(der));
		else if (type === 'public')
			return (readPkcs1ECDSAPublic(der));
		throw (new Error('Unknown key type: ' + type));
	case 'EDDSA':
	case 'EdDSA':
		if (type === 'private')
			return (readPkcs1EdDSAPrivate(der));
		throw (new Error(type + ' keys not supported with EdDSA'));
	default:
		throw (new Error('Unknown key algo: ' + alg));
	}
}

function readPkcs1RSAPublic(der) {
	// modulus and exponent
	var n = readMPInt(der, 'modulus');
	var e = readMPInt(der, 'exponent');

	// now, make the key
	var key = {
		type: 'rsa',
		parts: [
			{ name: 'e', data: e },
			{ name: 'n', data: n }
		]
	};

	return (new Key(key));
}

function readPkcs1RSAPrivate(der) {
	var version = readMPInt(der, 'version');
	assert.strictEqual(version[0], 0);

	// modulus then public exponent
	var n = readMPInt(der, 'modulus');
	var e = readMPInt(der, 'public exponent');
	var d = readMPInt(der, 'private exponent');
	var p = readMPInt(der, 'prime1');
	var q = readMPInt(der, 'prime2');
	var dmodp = readMPInt(der, 'exponent1');
	var dmodq = readMPInt(der, 'exponent2');
	var iqmp = readMPInt(der, 'iqmp');

	// now, make the key
	var key = {
		type: 'rsa',
		parts: [
			{ name: 'n', data: n },
			{ name: 'e', data: e },
			{ name: 'd', data: d },
			{ name: 'iqmp', data: iqmp },
			{ name: 'p', data: p },
			{ name: 'q', data: q },
			{ name: 'dmodp', data: dmodp },
			{ name: 'dmodq', data: dmodq }
		]
	};

	return (new PrivateKey(key));
}

function readPkcs1DSAPrivate(der) {
	var version = readMPInt(der, 'version');
	assert.strictEqual(version.readUInt8(0), 0);

	var p = readMPInt(der, 'p');
	var q = readMPInt(der, 'q');
	var g = readMPInt(der, 'g');
	var y = readMPInt(der, 'y');
	var x = readMPInt(der, 'x');

	// now, make the key
	var key = {
		type: 'dsa',
		parts: [
			{ name: 'p', data: p },
			{ name: 'q', data: q },
			{ name: 'g', data: g },
			{ name: 'y', data: y },
			{ name: 'x', data: x }
		]
	};

	return (new PrivateKey(key));
}

function readPkcs1EdDSAPrivate(der) {
	var version = readMPInt(der, 'version');
	assert.strictEqual(version.readUInt8(0), 1);

	// private key
	var k = der.readString(asn1.Ber.OctetString, true);

	der.readSequence(0xa0);
	var oid = der.readOID();
	assert.strictEqual(oid, '1.3.101.112', 'the ed25519 curve identifier');

	der.readSequence(0xa1);
	var A = utils.readBitString(der);

	var key = {
		type: 'ed25519',
		parts: [
			{ name: 'A', data: utils.zeroPadToLength(A, 32) },
			{ name: 'k', data: k }
		]
	};

	return (new PrivateKey(key));
}

function readPkcs1DSAPublic(der) {
	var y = readMPInt(der, 'y');
	var p = readMPInt(der, 'p');
	var q = readMPInt(der, 'q');
	var g = readMPInt(der, 'g');

	var key = {
		type: 'dsa',
		parts: [
			{ name: 'y', data: y },
			{ name: 'p', data: p },
			{ name: 'q', data: q },
			{ name: 'g', data: g }
		]
	};

	return (new Key(key));
}

function readPkcs1ECDSAPublic(der) {
	der.readSequence();

	var oid = der.readOID();
	assert.strictEqual(oid, '1.2.840.10045.2.1', 'must be ecPublicKey');

	var curveOid = der.readOID();

	var curve;
	var curves = Object.keys(algs.curves);
	for (var j = 0; j < curves.length; ++j) {
		var c = curves[j];
		var cd = algs.curves[c];
		if (cd.pkcs8oid === curveOid) {
			curve = c;
			break;
		}
	}
	assert.string(curve, 'a known ECDSA named curve');

	var Q = der.readString(asn1.Ber.BitString, true);
	Q = utils.ecNormalize(Q);

	var key = {
		type: 'ecdsa',
		parts: [
			{ name: 'curve', data: Buffer.from(curve) },
			{ name: 'Q', data: Q }
		]
	};

	return (new Key(key));
}

function readPkcs1ECDSAPrivate(der) {
	var version = readMPInt(der, 'version');
	assert.strictEqual(version.readUInt8(0), 1);

	// private key
	var d = der.readString(asn1.Ber.OctetString, true);

	der.readSequence(0xa0);
	var curve = readECDSACurve(der);
	assert.string(curve, 'a known elliptic curve');

	der.readSequence(0xa1);
	var Q = der.readString(asn1.Ber.BitString, true);
	Q = utils.ecNormalize(Q);

	var key = {
		type: 'ecdsa',
		parts: [
			{ name: 'curve', data: Buffer.from(curve) },
			{ name: 'Q', data: Q },
			{ name: 'd', data: d }
		]
	};

	return (new PrivateKey(key));
}

function writePkcs1(der, key) {
	der.startSequence();

	switch (key.type) {
	case 'rsa':
		if (PrivateKey.isPrivateKey(key))
			writePkcs1RSAPrivate(der, key);
		else
			writePkcs1RSAPublic(der, key);
		break;
	case 'dsa':
		if (PrivateKey.isPrivateKey(key))
			writePkcs1DSAPrivate(der, key);
		else
			writePkcs1DSAPublic(der, key);
		break;
	case 'ecdsa':
		if (PrivateKey.isPrivateKey(key))
			writePkcs1ECDSAPrivate(der, key);
		else
			writePkcs1ECDSAPublic(der, key);
		break;
	case 'ed25519':
		if (PrivateKey.isPrivateKey(key))
			writePkcs1EdDSAPrivate(der, key);
		else
			writePkcs1EdDSAPublic(der, key);
		break;
	default:
		throw (new Error('Unknown key algo: ' + key.type));
	}

	der.endSequence();
}

function writePkcs1RSAPublic(der, key) {
	der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.e.data, asn1.Ber.Integer);
}

function writePkcs1RSAPrivate(der, key) {
	var ver = Buffer.from([0]);
	der.writeBuffer(ver, asn1.Ber.Integer);

	der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.e.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.d.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
	if (!key.part.dmodp || !key.part.dmodq)
		utils.addRSAMissing(key);
	der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer);
}

function writePkcs1DSAPrivate(der, key) {
	var ver = Buffer.from([0]);
	der.writeBuffer(ver, asn1.Ber.Integer);

	der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.g.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.y.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.x.data, asn1.Ber.Integer);
}

function writePkcs1DSAPublic(der, key) {
	der.writeBuffer(key.part.y.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.g.data, asn1.Ber.Integer);
}

function writePkcs1ECDSAPublic(der, key) {
	der.startSequence();

	der.writeOID('1.2.840.10045.2.1'); /* ecPublicKey */
	var curve = key.part.curve.data.toString();
	var curveOid = algs.curves[curve].pkcs8oid;
	assert.string(curveOid, 'a known ECDSA named curve');
	der.writeOID(curveOid);

	der.endSequence();

	var Q = utils.ecNormalize(key.part.Q.data, true);
	der.writeBuffer(Q, asn1.Ber.BitString);
}

function writePkcs1ECDSAPrivate(der, key) {
	var ver = Buffer.from([1]);
	der.writeBuffer(ver, asn1.Ber.Integer);

	der.writeBuffer(key.part.d.data, asn1.Ber.OctetString);

	der.startSequence(0xa0);
	var curve = key.part.curve.data.toString();
	var curveOid = algs.curves[curve].pkcs8oid;
	assert.string(curveOid, 'a known ECDSA named curve');
	der.writeOID(curveOid);
	der.endSequence();

	der.startSequence(0xa1);
	var Q = utils.ecNormalize(key.part.Q.data, true);
	der.writeBuffer(Q, asn1.Ber.BitString);
	der.endSequence();
}

function writePkcs1EdDSAPrivate(der, key) {
	var ver = Buffer.from([1]);
	der.writeBuffer(ver, asn1.Ber.Integer);

	der.writeBuffer(key.part.k.data, asn1.Ber.OctetString);

	der.startSequence(0xa0);
	der.writeOID('1.3.101.112');
	der.endSequence();

	der.startSequence(0xa1);
	utils.writeBitString(der, key.part.A.data);
	der.endSequence();
}

function writePkcs1EdDSAPublic(der, key) {
	throw (new Error('Public keys are not supported for EdDSA PKCS#1'));
}
// Copyright 2018 Joyent, Inc.

module.exports = {
	read: read,
	readPkcs8: readPkcs8,
	write: write,
	writePkcs8: writePkcs8,
	pkcs8ToBuffer: pkcs8ToBuffer,

	readECDSACurve: readECDSACurve,
	writeECDSACurve: writeECDSACurve
};

var assert = require('assert-plus');
var asn1 = require('asn1');
var Buffer = require('safer-buffer').Buffer;
var algs = require('../algs');
var utils = require('../utils');
var Key = require('../key');
var PrivateKey = require('../private-key');
var pem = require('./pem');

function read(buf, options) {
	return (pem.read(buf, options, 'pkcs8'));
}

function write(key, options) {
	return (pem.write(key, options, 'pkcs8'));
}

/* Helper to read in a single mpint */
function readMPInt(der, nm) {
	assert.strictEqual(der.peek(), asn1.Ber.Integer,
	    nm + ' is not an Integer');
	return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true)));
}

function readPkcs8(alg, type, der) {
	/* Private keys in pkcs#8 format have a weird extra int */
	if (der.peek() === asn1.Ber.Integer) {
		assert.strictEqual(type, 'private',
		    'unexpected Integer at start of public key');
		der.readString(asn1.Ber.Integer, true);
	}

	der.readSequence();
	var next = der.offset + der.length;

	var oid = der.readOID();
	switch (oid) {
	case '1.2.840.113549.1.1.1':
		der._offset = next;
		if (type === 'public')
			return (readPkcs8RSAPublic(der));
		else
			return (readPkcs8RSAPrivate(der));
	case '1.2.840.10040.4.1':
		if (type === 'public')
			return (readPkcs8DSAPublic(der));
		else
			return (readPkcs8DSAPrivate(der));
	case '1.2.840.10045.2.1':
		if (type === 'public')
			return (readPkcs8ECDSAPublic(der));
		else
			return (readPkcs8ECDSAPrivate(der));
	case '1.3.101.112':
		if (type === 'public') {
			return (readPkcs8EdDSAPublic(der));
		} else {
			return (readPkcs8EdDSAPrivate(der));
		}
	case '1.3.101.110':
		if (type === 'public') {
			return (readPkcs8X25519Public(der));
		} else {
			return (readPkcs8X25519Private(der));
		}
	default:
		throw (new Error('Unknown key type OID ' + oid));
	}
}

function readPkcs8RSAPublic(der) {
	// bit string sequence
	der.readSequence(asn1.Ber.BitString);
	der.readByte();
	der.readSequence();

	// modulus
	var n = readMPInt(der, 'modulus');
	var e = readMPInt(der, 'exponent');

	// now, make the key
	var key = {
		type: 'rsa',
		source: der.originalInput,
		parts: [
			{ name: 'e', data: e },
			{ name: 'n', data: n }
		]
	};

	return (new Key(key));
}

function readPkcs8RSAPrivate(der) {
	der.readSequence(asn1.Ber.OctetString);
	der.readSequence();

	var ver = readMPInt(der, 'version');
	assert.equal(ver[0], 0x0, 'unknown RSA private key version');

	// modulus then public exponent
	var n = readMPInt(der, 'modulus');
	var e = readMPInt(der, 'public exponent');
	var d = readMPInt(der, 'private exponent');
	var p = readMPInt(der, 'prime1');
	var q = readMPInt(der, 'prime2');
	var dmodp = readMPInt(der, 'exponent1');
	var dmodq = readMPInt(der, 'exponent2');
	var iqmp = readMPInt(der, 'iqmp');

	// now, make the key
	var key = {
		type: 'rsa',
		parts: [
			{ name: 'n', data: n },
			{ name: 'e', data: e },
			{ name: 'd', data: d },
			{ name: 'iqmp', data: iqmp },
			{ name: 'p', data: p },
			{ name: 'q', data: q },
			{ name: 'dmodp', data: dmodp },
			{ name: 'dmodq', data: dmodq }
		]
	};

	return (new PrivateKey(key));
}

function readPkcs8DSAPublic(der) {
	der.readSequence();

	var p = readMPInt(der, 'p');
	var q = readMPInt(der, 'q');
	var g = readMPInt(der, 'g');

	// bit string sequence
	der.readSequence(asn1.Ber.BitString);
	der.readByte();

	var y = readMPInt(der, 'y');

	// now, make the key
	var key = {
		type: 'dsa',
		parts: [
			{ name: 'p', data: p },
			{ name: 'q', data: q },
			{ name: 'g', data: g },
			{ name: 'y', data: y }
		]
	};

	return (new Key(key));
}

function readPkcs8DSAPrivate(der) {
	der.readSequence();

	var p = readMPInt(der, 'p');
	var q = readMPInt(der, 'q');
	var g = readMPInt(der, 'g');

	der.readSequence(asn1.Ber.OctetString);
	var x = readMPInt(der, 'x');

	/* The pkcs#8 format does not include the public key */
	var y = utils.calculateDSAPublic(g, p, x);

	var key = {
		type: 'dsa',
		parts: [
			{ name: 'p', data: p },
			{ name: 'q', data: q },
			{ name: 'g', data: g },
			{ name: 'y', data: y },
			{ name: 'x', data: x }
		]
	};

	return (new PrivateKey(key));
}

function readECDSACurve(der) {
	var curveName, curveNames;
	var j, c, cd;

	if (der.peek() === asn1.Ber.OID) {
		var oid = der.readOID();

		curveNames = Object.keys(algs.curves);
		for (j = 0; j < curveNames.length; ++j) {
			c = curveNames[j];
			cd = algs.curves[c];
			if (cd.pkcs8oid === oid) {
				curveName = c;
				break;
			}
		}

	} else {
		// ECParameters sequence
		der.readSequence();
		var version = der.readString(asn1.Ber.Integer, true);
		assert.strictEqual(version[0], 1, 'ECDSA key not version 1');

		var curve = {};

		// FieldID sequence
		der.readSequence();
		var fieldTypeOid = der.readOID();
		assert.strictEqual(fieldTypeOid, '1.2.840.10045.1.1',
		    'ECDSA key is not from a prime-field');
		var p = curve.p = utils.mpNormalize(
		    der.readString(asn1.Ber.Integer, true));
		/*
		 * p always starts with a 1 bit, so count the zeros to get its
		 * real size.
		 */
		curve.size = p.length * 8 - utils.countZeros(p);

		// Curve sequence
		der.readSequence();
		curve.a = utils.mpNormalize(
		    der.readString(asn1.Ber.OctetString, true));
		curve.b = utils.mpNormalize(
		    der.readString(asn1.Ber.OctetString, true));
		if (der.peek() === asn1.Ber.BitString)
			curve.s = der.readString(asn1.Ber.BitString, true);

		// Combined Gx and Gy
		curve.G = der.readString(asn1.Ber.OctetString, true);
		assert.strictEqual(curve.G[0], 0x4,
		    'uncompressed G is required');

		curve.n = utils.mpNormalize(
		    der.readString(asn1.Ber.Integer, true));
		curve.h = utils.mpNormalize(
		    der.readString(asn1.Ber.Integer, true));
		assert.strictEqual(curve.h[0], 0x1, 'a cofactor=1 curve is ' +
		    'required');

		curveNames = Object.keys(algs.curves);
		var ks = Object.keys(curve);
		for (j = 0; j < curveNames.length; ++j) {
			c = curveNames[j];
			cd = algs.curves[c];
			var equal = true;
			for (var i = 0; i < ks.length; ++i) {
				var k = ks[i];
				if (cd[k] === undefined)
					continue;
				if (typeof (cd[k]) === 'object' &&
				    cd[k].equals !== undefined) {
					if (!cd[k].equals(curve[k])) {
						equal = false;
						break;
					}
				} else if (Buffer.isBuffer(cd[k])) {
					if (cd[k].toString('binary')
					    !== curve[k].toString('binary')) {
						equal = false;
						break;
					}
				} else {
					if (cd[k] !== curve[k]) {
						equal = false;
						break;
					}
				}
			}
			if (equal) {
				curveName = c;
				break;
			}
		}
	}
	return (curveName);
}

function readPkcs8ECDSAPrivate(der) {
	var curveName = readECDSACurve(der);
	assert.string(curveName, 'a known elliptic curve');

	der.readSequence(asn1.Ber.OctetString);
	der.readSequence();

	var version = readMPInt(der, 'version');
	assert.equal(version[0], 1, 'unknown version of ECDSA key');

	var d = der.readString(asn1.Ber.OctetString, true);
	var Q;

	if (der.peek() == 0xa0) {
		der.readSequence(0xa0);
		der._offset += der.length;
	}
	if (der.peek() == 0xa1) {
		der.readSequence(0xa1);
		Q = der.readString(asn1.Ber.BitString, true);
		Q = utils.ecNormalize(Q);
	}

	if (Q === undefined) {
		var pub = utils.publicFromPrivateECDSA(curveName, d);
		Q = pub.part.Q.data;
	}

	var key = {
		type: 'ecdsa',
		parts: [
			{ name: 'curve', data: Buffer.from(curveName) },
			{ name: 'Q', data: Q },
			{ name: 'd', data: d }
		]
	};

	return (new PrivateKey(key));
}

function readPkcs8ECDSAPublic(der) {
	var curveName = readECDSACurve(der);
	assert.string(curveName, 'a known elliptic curve');

	var Q = der.readString(asn1.Ber.BitString, true);
	Q = utils.ecNormalize(Q);

	var key = {
		type: 'ecdsa',
		parts: [
			{ name: 'curve', data: Buffer.from(curveName) },
			{ name: 'Q', data: Q }
		]
	};

	return (new Key(key));
}

function readPkcs8EdDSAPublic(der) {
	if (der.peek() === 0x00)
		der.readByte();

	var A = utils.readBitString(der);

	var key = {
		type: 'ed25519',
		parts: [
			{ name: 'A', data: utils.zeroPadToLength(A, 32) }
		]
	};

	return (new Key(key));
}

function readPkcs8X25519Public(der) {
	var A = utils.readBitString(der);

	var key = {
		type: 'curve25519',
		parts: [
			{ name: 'A', data: utils.zeroPadToLength(A, 32) }
		]
	};

	return (new Key(key));
}

function readPkcs8EdDSAPrivate(der) {
	if (der.peek() === 0x00)
		der.readByte();

	der.readSequence(asn1.Ber.OctetString);
	var k = der.readString(asn1.Ber.OctetString, true);
	k = utils.zeroPadToLength(k, 32);

	var A;
	if (der.peek() === asn1.Ber.BitString) {
		A = utils.readBitString(der);
		A = utils.zeroPadToLength(A, 32);
	} else {
		A = utils.calculateED25519Public(k);
	}

	var key = {
		type: 'ed25519',
		parts: [
			{ name: 'A', data: utils.zeroPadToLength(A, 32) },
			{ name: 'k', data: utils.zeroPadToLength(k, 32) }
		]
	};

	return (new PrivateKey(key));
}

function readPkcs8X25519Private(der) {
	if (der.peek() === 0x00)
		der.readByte();

	der.readSequence(asn1.Ber.OctetString);
	var k = der.readString(asn1.Ber.OctetString, true);
	k = utils.zeroPadToLength(k, 32);

	var A = utils.calculateX25519Public(k);

	var key = {
		type: 'curve25519',
		parts: [
			{ name: 'A', data: utils.zeroPadToLength(A, 32) },
			{ name: 'k', data: utils.zeroPadToLength(k, 32) }
		]
	};

	return (new PrivateKey(key));
}

function pkcs8ToBuffer(key) {
	var der = new asn1.BerWriter();
	writePkcs8(der, key);
	return (der.buffer);
}

function writePkcs8(der, key) {
	der.startSequence();

	if (PrivateKey.isPrivateKey(key)) {
		var sillyInt = Buffer.from([0]);
		der.writeBuffer(sillyInt, asn1.Ber.Integer);
	}

	der.startSequence();
	switch (key.type) {
	case 'rsa':
		der.writeOID('1.2.840.113549.1.1.1');
		if (PrivateKey.isPrivateKey(key))
			writePkcs8RSAPrivate(key, der);
		else
			writePkcs8RSAPublic(key, der);
		break;
	case 'dsa':
		der.writeOID('1.2.840.10040.4.1');
		if (PrivateKey.isPrivateKey(key))
			writePkcs8DSAPrivate(key, der);
		else
			writePkcs8DSAPublic(key, der);
		break;
	case 'ecdsa':
		der.writeOID('1.2.840.10045.2.1');
		if (PrivateKey.isPrivateKey(key))
			writePkcs8ECDSAPrivate(key, der);
		else
			writePkcs8ECDSAPublic(key, der);
		break;
	case 'ed25519':
		der.writeOID('1.3.101.112');
		if (PrivateKey.isPrivateKey(key))
			throw (new Error('Ed25519 private keys in pkcs8 ' +
			    'format are not supported'));
		writePkcs8EdDSAPublic(key, der);
		break;
	default:
		throw (new Error('Unsupported key type: ' + key.type));
	}

	der.endSequence();
}

function writePkcs8RSAPrivate(key, der) {
	der.writeNull();
	der.endSequence();

	der.startSequence(asn1.Ber.OctetString);
	der.startSequence();

	var version = Buffer.from([0]);
	der.writeBuffer(version, asn1.Ber.Integer);

	der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.e.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.d.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
	if (!key.part.dmodp || !key.part.dmodq)
		utils.addRSAMissing(key);
	der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer);

	der.endSequence();
	der.endSequence();
}

function writePkcs8RSAPublic(key, der) {
	der.writeNull();
	der.endSequence();

	der.startSequence(asn1.Ber.BitString);
	der.writeByte(0x00);

	der.startSequence();
	der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.e.data, asn1.Ber.Integer);
	der.endSequence();

	der.endSequence();
}

function writePkcs8DSAPrivate(key, der) {
	der.startSequence();
	der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.g.data, asn1.Ber.Integer);
	der.endSequence();

	der.endSequence();

	der.startSequence(asn1.Ber.OctetString);
	der.writeBuffer(key.part.x.data, asn1.Ber.Integer);
	der.endSequence();
}

function writePkcs8DSAPublic(key, der) {
	der.startSequence();
	der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
	der.writeBuffer(key.part.g.data, asn1.Ber.Integer);
	der.endSequence();
	der.endSequence();

	der.startSequence(asn1.Ber.BitString);
	der.writeByte(0x00);
	der.writeBuffer(key.part.y.data, asn1.Ber.Integer);
	der.endSequence();
}

function writeECDSACurve(key, der) {
	var curve = algs.curves[key.curve];
	if (curve.pkcs8oid) {
		/* This one has a name in pkcs#8, so just write the oid */
		der.writeOID(curve.pkcs8oid);

	} else {
		// ECParameters sequence
		der.startSequence();

		var version = Buffer.from([1]);
		der.writeBuffer(version, asn1.Ber.Integer);

		// FieldID sequence
		der.startSequence();
		der.writeOID('1.2.840.10045.1.1'); // prime-field
		der.writeBuffer(curve.p, asn1.Ber.Integer);
		der.endSequence();

		// Curve sequence
		der.startSequence();
		var a = curve.p;
		if (a[0] === 0x0)
			a = a.slice(1);
		der.writeBuffer(a, asn1.Ber.OctetString);
		der.writeBuffer(curve.b, asn1.Ber.OctetString);
		der.writeBuffer(curve.s, asn1.Ber.BitString);
		der.endSequence();

		der.writeBuffer(curve.G, asn1.Ber.OctetString);
		der.writeBuffer(curve.n, asn1.Ber.Integer);
		var h = curve.h;
		if (!h) {
			h = Buffer.from([1]);
		}
		der.writeBuffer(h, asn1.Ber.Integer);

		// ECParameters
		der.endSequence();
	}
}

function writePkcs8ECDSAPublic(key, der) {
	writeECDSACurve(key, der);
	der.endSequence();

	var Q = utils.ecNormalize(key.part.Q.data, true);
	der.writeBuffer(Q, asn1.Ber.BitString);
}

function writePkcs8ECDSAPrivate(key, der) {
	writeECDSACurve(key, der);
	der.endSequence();

	der.startSequence(asn1.Ber.OctetString);
	der.startSequence();

	var version = Buffer.from([1]);
	der.writeBuffer(version, asn1.Ber.Integer);

	der.writeBuffer(key.part.d.data, asn1.Ber.OctetString);

	der.startSequence(0xa1);
	var Q = utils.ecNormalize(key.part.Q.data, true);
	der.writeBuffer(Q, asn1.Ber.BitString);
	der.endSequence();

	der.endSequence();
	der.endSequence();
}

function writePkcs8EdDSAPublic(key, der) {
	der.endSequence();

	utils.writeBitString(der, key.part.A.data);
}

function writePkcs8EdDSAPrivate(key, der) {
	der.endSequence();

	var k = utils.mpNormalize(key.part.k.data, true);
	der.startSequence(asn1.Ber.OctetString);
	der.writeBuffer(k, asn1.Ber.OctetString);
	der.endSequence();
}
// Copyright 2018 Joyent, Inc.

module.exports = {
	read: read,
	write: write
};

var assert = require('assert-plus');
var Buffer = require('safer-buffer').Buffer;
var rfc4253 = require('./rfc4253');
var Key = require('../key');

var errors = require('../errors');

function read(buf, options) {
	var lines = buf.toString('ascii').split(/[\r\n]+/);
	var found = false;
	var parts;
	var si = 0;
	while (si < lines.length) {
		parts = splitHeader(lines[si++]);
		if (parts &&
		    parts[0].toLowerCase() === 'putty-user-key-file-2') {
			found = true;
			break;
		}
	}
	if (!found) {
		throw (new Error('No PuTTY format first line found'));
	}
	var alg = parts[1];

	parts = splitHeader(lines[si++]);
	assert.equal(parts[0].toLowerCase(), 'encryption');

	parts = splitHeader(lines[si++]);
	assert.equal(parts[0].toLowerCase(), 'comment');
	var comment = parts[1];

	parts = splitHeader(lines[si++]);
	assert.equal(parts[0].toLowerCase(), 'public-lines');
	var publicLines = parseInt(parts[1], 10);
	if (!isFinite(publicLines) || publicLines < 0 ||
	    publicLines > lines.length) {
		throw (new Error('Invalid public-lines count'));
	}

	var publicBuf = Buffer.from(
	    lines.slice(si, si + publicLines).join(''), 'base64');
	var keyType = rfc4253.algToKeyType(alg);
	var key = rfc4253.read(publicBuf);
	if (key.type !== keyType) {
		throw (new Error('Outer key algorithm mismatch'));
	}
	key.comment = comment;
	return (key);
}

function splitHeader(line) {
	var idx = line.indexOf(':');
	if (idx === -1)
		return (null);
	var header = line.slice(0, idx);
	++idx;
	while (line[idx] === ' ')
		++idx;
	var rest = line.slice(idx);
	return ([header, rest]);
}

function write(key, options) {
	assert.object(key);
	if (!Key.isKey(key))
		throw (new Error('Must be a public key'));

	var alg = rfc4253.keyTypeToAlg(key);
	var buf = rfc4253.write(key);
	var comment = key.comment || '';

	var b64 = buf.toString('base64');
	var lines = wrap(b64, 64);

	lines.unshift('Public-Lines: ' + lines.length);
	lines.unshift('Comment: ' + comment);
	lines.unshift('Encryption: none');
	lines.unshift('PuTTY-User-Key-File-2: ' + alg);

	return (Buffer.from(lines.join('\n') + '\n'));
}

function wrap(txt, len) {
	var lines = [];
	var pos = 0;
	while (pos < txt.length) {
		lines.push(txt.slice(pos, pos + 64));
		pos += 64;
	}
	return (lines);
}
// Copyright 2015 Joyent, Inc.

module.exports = {
	read: read.bind(undefined, false, undefined),
	readType: read.bind(undefined, false),
	write: write,
	/* semi-private api, used by sshpk-agent */
	readPartial: read.bind(undefined, true),

	/* shared with ssh format */
	readInternal: read,
	keyTypeToAlg: keyTypeToAlg,
	algToKeyType: algToKeyType
};

var assert = require('assert-plus');
var Buffer = require('safer-buffer').Buffer;
var algs = require('../algs');
var utils = require('../utils');
var Key = require('../key');
var PrivateKey = require('../private-key');
var SSHBuffer = require('../ssh-buffer');

function algToKeyType(alg) {
	assert.string(alg);
	if (alg === 'ssh-dss')
		return ('dsa');
	else if (alg === 'ssh-rsa')
		return ('rsa');
	else if (alg === 'ssh-ed25519')
		return ('ed25519');
	else if (alg === 'ssh-curve25519')
		return ('curve25519');
	else if (alg.match(/^ecdsa-sha2-/))
		return ('ecdsa');
	else
		throw (new Error('Unknown algorithm ' + alg));
}

function keyTypeToAlg(key) {
	assert.object(key);
	if (key.type === 'dsa')
		return ('ssh-dss');
	else if (key.type === 'rsa')
		return ('ssh-rsa');
	else if (key.type === 'ed25519')
		return ('ssh-ed25519');
	else if (key.type === 'curve25519')
		return ('ssh-curve25519');
	else if (key.type === 'ecdsa')
		return ('ecdsa-sha2-' + key.part.curve.data.toString());
	else
		throw (new Error('Unknown key type ' + key.type));
}

function read(partial, type, buf, options) {
	if (typeof (buf) === 'string')
		buf = Buffer.from(buf);
	assert.buffer(buf, 'buf');

	var key = {};

	var parts = key.parts = [];
	var sshbuf = new SSHBuffer({buffer: buf});

	var alg = sshbuf.readString();
	assert.ok(!sshbuf.atEnd(), 'key must have at least one part');

	key.type = algToKeyType(alg);

	var partCount = algs.info[key.type].parts.length;
	if (type && type === 'private')
		partCount = algs.privInfo[key.type].parts.length;

	while (!sshbuf.atEnd() && parts.length < partCount)
		parts.push(sshbuf.readPart());
	while (!partial && !sshbuf.atEnd())
		parts.push(sshbuf.readPart());

	assert.ok(parts.length >= 1,
	    'key must have at least one part');
	assert.ok(partial || sshbuf.atEnd(),
	    'leftover bytes at end of key');

	var Constructor = Key;
	var algInfo = algs.info[key.type];
	if (type === 'private' || algInfo.parts.length !== parts.length) {
		algInfo = algs.privInfo[key.type];
		Constructor = PrivateKey;
	}
	assert.strictEqual(algInfo.parts.length, parts.length);

	if (key.type === 'ecdsa') {
		var res = /^ecdsa-sha2-(.+)$/.exec(alg);
		assert.ok(res !== null);
		assert.strictEqual(res[1], parts[0].data.toString());
	}

	var normalized = true;
	for (var i = 0; i < algInfo.parts.length; ++i) {
		var p = parts[i];
		p.name = algInfo.parts[i];
		/*
		 * OpenSSH stores ed25519 "private" keys as seed + public key
		 * concat'd together (k followed by A). We want to keep them
		 * separate for other formats that don't do this.
		 */
		if (key.type === 'ed25519' && p.name === 'k')
			p.data = p.data.slice(0, 32);

		if (p.name !== 'curve' && algInfo.normalize !== false) {
			var nd;
			if (key.type === 'ed25519') {
				nd = utils.zeroPadToLength(p.data, 32);
			} else {
				nd = utils.mpNormalize(p.data);
			}
			if (nd.toString('binary') !==
			    p.data.toString('binary')) {
				p.data = nd;
				normalized = false;
			}
		}
	}

	if (normalized)
		key._rfc4253Cache = sshbuf.toBuffer();

	if (partial && typeof (partial) === 'object') {
		partial.remainder = sshbuf.remainder();
		partial.consumed = sshbuf._offset;
	}

	return (new Constructor(key));
}

function write(key, options) {
	assert.object(key);

	var alg = keyTypeToAlg(key);
	var i;

	var algInfo = algs.info[key.type];
	if (PrivateKey.isPrivateKey(key))
		algInfo = algs.privInfo[key.type];
	var parts = algInfo.parts;

	var buf = new SSHBuffer({});

	buf.writeString(alg);

	for (i = 0; i < parts.length; ++i) {
		var data = key.part[parts[i]].data;
		if (algInfo.normalize !== false) {
			if (key.type === 'ed25519')
				data = utils.zeroPadToLength(data, 32);
			else
				data = utils.mpNormalize(data);
		}
		if (key.type === 'ed25519' && parts[i] === 'k')
			data = Buffer.concat([data, key.part.A.data]);
		buf.writeBuffer(data);
	}

	return (buf.toBuffer());
}
// Copyright 2015 Joyent, Inc.

module.exports = {
	read: read,
	readSSHPrivate: readSSHPrivate,
	write: write
};

var assert = require('assert-plus');
var asn1 = require('asn1');
var Buffer = require('safer-buffer').Buffer;
var algs = require('../algs');
var utils = require('../utils');
var crypto = require('crypto');

var Key = require('../key');
var PrivateKey = require('../private-key');
var pem = require('./pem');
var rfc4253 = require('./rfc4253');
var SSHBuffer = require('../ssh-buffer');
var errors = require('../errors');

var bcrypt;

function read(buf, options) {
	return (pem.read(buf, options));
}

var MAGIC = 'openssh-key-v1';

function readSSHPrivate(type, buf, options) {
	buf = new SSHBuffer({buffer: buf});

	var magic = buf.readCString();
	assert.strictEqual(magic, MAGIC, 'bad magic string');

	var cipher = buf.readString();
	var kdf = buf.readString();
	var kdfOpts = buf.readBuffer();

	var nkeys = buf.readInt();
	if (nkeys !== 1) {
		throw (new Error('OpenSSH-format key file contains ' +
		    'multiple keys: this is unsupported.'));
	}

	var pubKey = buf.readBuffer();

	if (type === 'public') {
		assert.ok(buf.atEnd(), 'excess bytes left after key');
		return (rfc4253.read(pubKey));
	}

	var privKeyBlob = buf.readBuffer();
	assert.ok(buf.atEnd(), 'excess bytes left after key');

	var kdfOptsBuf = new SSHBuffer({ buffer: kdfOpts });
	switch (kdf) {
	case 'none':
		if (cipher !== 'none') {
			throw (new Error('OpenSSH-format key uses KDF "none" ' +
			     'but specifies a cipher other than "none"'));
		}
		break;
	case 'bcrypt':
		var salt = kdfOptsBuf.readBuffer();
		var rounds = kdfOptsBuf.readInt();
		var cinf = utils.opensshCipherInfo(cipher);
		if (bcrypt === undefined) {
			bcrypt = require('bcrypt-pbkdf');
		}

		if (typeof (options.passphrase) === 'string') {
			options.passphrase = Buffer.from(options.passphrase,
			    'utf-8');
		}
		if (!Buffer.isBuffer(options.passphrase)) {
			throw (new errors.KeyEncryptedError(
			    options.filename, 'OpenSSH'));
		}

		var pass = new Uint8Array(options.passphrase);
		var salti = new Uint8Array(salt);
		/* Use the pbkdf to derive both the key and the IV. */
		var out = new Uint8Array(cinf.keySize + cinf.blockSize);
		var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length,
		    out, out.length, rounds);
		if (res !== 0) {
			throw (new Error('bcrypt_pbkdf function returned ' +
			    'failure, parameters invalid'));
		}
		out = Buffer.from(out);
		var ckey = out.slice(0, cinf.keySize);
		var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize);
		var cipherStream = crypto.createDecipheriv(cinf.opensslName,
		    ckey, iv);
		cipherStream.setAutoPadding(false);
		var chunk, chunks = [];
		cipherStream.once('error', function (e) {
			if (e.toString().indexOf('bad decrypt') !== -1) {
				throw (new Error('Incorrect passphrase ' +
				    'supplied, could not decrypt key'));
			}
			throw (e);
		});
		cipherStream.write(privKeyBlob);
		cipherStream.end();
		while ((chunk = cipherStream.read()) !== null)
			chunks.push(chunk);
		privKeyBlob = Buffer.concat(chunks);
		break;
	default:
		throw (new Error(
		    'OpenSSH-format key uses unknown KDF "' + kdf + '"'));
	}

	buf = new SSHBuffer({buffer: privKeyBlob});

	var checkInt1 = buf.readInt();
	var checkInt2 = buf.readInt();
	if (checkInt1 !== checkInt2) {
		throw (new Error('Incorrect passphrase supplied, could not ' +
		    'decrypt key'));
	}

	var ret = {};
	var key = rfc4253.readInternal(ret, 'private', buf.remainder());

	buf.skip(ret.consumed);

	var comment = buf.readString();
	key.comment = comment;

	return (key);
}

function write(key, options) {
	var pubKey;
	if (PrivateKey.isPrivateKey(key))
		pubKey = key.toPublic();
	else
		pubKey = key;

	var cipher = 'none';
	var kdf = 'none';
	var kdfopts = Buffer.alloc(0);
	var cinf = { blockSize: 8 };
	var passphrase;
	if (options !== undefined) {
		passphrase = options.passphrase;
		if (typeof (passphrase) === 'string')
			passphrase = Buffer.from(passphrase, 'utf-8');
		if (passphrase !== undefined) {
			assert.buffer(passphrase, 'options.passphrase');
			assert.optionalString(options.cipher, 'options.cipher');
			cipher = options.cipher;
			if (cipher === undefined)
				cipher = 'aes128-ctr';
			cinf = utils.opensshCipherInfo(cipher);
			kdf = 'bcrypt';
		}
	}

	var privBuf;
	if (PrivateKey.isPrivateKey(key)) {
		privBuf = new SSHBuffer({});
		var checkInt = crypto.randomBytes(4).readUInt32BE(0);
		privBuf.writeInt(checkInt);
		privBuf.writeInt(checkInt);
		privBuf.write(key.toBuffer('rfc4253'));
		privBuf.writeString(key.comment || '');

		var n = 1;
		while (privBuf._offset % cinf.blockSize !== 0)
			privBuf.writeChar(n++);
		privBuf = privBuf.toBuffer();
	}

	switch (kdf) {
	case 'none':
		break;
	case 'bcrypt':
		var salt = crypto.randomBytes(16);
		var rounds = 16;
		var kdfssh = new SSHBuffer({});
		kdfssh.writeBuffer(salt);
		kdfssh.writeInt(rounds);
		kdfopts = kdfssh.toBuffer();

		if (bcrypt === undefined) {
			bcrypt = require('bcrypt-pbkdf');
		}
		var pass = new Uint8Array(passphrase);
		var salti = new Uint8Array(salt);
		/* Use the pbkdf to derive both the key and the IV. */
		var out = new Uint8Array(cinf.keySize + cinf.blockSize);
		var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length,
		    out, out.length, rounds);
		if (res !== 0) {
			throw (new Error('bcrypt_pbkdf function returned ' +
			    'failure, parameters invalid'));
		}
		out = Buffer.from(out);
		var ckey = out.slice(0, cinf.keySize);
		var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize);

		var cipherStream = crypto.createCipheriv(cinf.opensslName,
		    ckey, iv);
		cipherStream.setAutoPadding(false);
		var chunk, chunks = [];
		cipherStream.once('error', function (e) {
			throw (e);
		});
		cipherStream.write(privBuf);
		cipherStream.end();
		while ((chunk = cipherStream.read()) !== null)
			chunks.push(chunk);
		privBuf = Buffer.concat(chunks);
		break;
	default:
		throw (new Error('Unsupported kdf ' + kdf));
	}

	var buf = new SSHBuffer({});

	buf.writeCString(MAGIC);
	buf.writeString(cipher);	/* cipher */
	buf.writeString(kdf);		/* kdf */
	buf.writeBuffer(kdfopts);	/* kdfoptions */

	buf.writeInt(1);		/* nkeys */
	buf.writeBuffer(pubKey.toBuffer('rfc4253'));

	if (privBuf)
		buf.writeBuffer(privBuf);

	buf = buf.toBuffer();

	var header;
	if (PrivateKey.isPrivateKey(key))
		header = 'OPENSSH PRIVATE KEY';
	else
		header = 'OPENSSH PUBLIC KEY';

	var tmp = buf.toString('base64');
	var len = tmp.length + (tmp.length / 70) +
	    18 + 16 + header.length*2 + 10;
	buf = Buffer.alloc(len);
	var o = 0;
	o += buf.write('-----BEGIN ' + header + '-----\n', o);
	for (var i = 0; i < tmp.length; ) {
		var limit = i + 70;
		if (limit > tmp.length)
			limit = tmp.length;
		o += buf.write(tmp.slice(i, limit), o);
		buf[o++] = 10;
		i = limit;
	}
	o += buf.write('-----END ' + header + '-----\n', o);

	return (buf.slice(0, o));
}
// Copyright 2015 Joyent, Inc.

module.exports = {
	read: read,
	write: write
};

var assert = require('assert-plus');
var Buffer = require('safer-buffer').Buffer;
var rfc4253 = require('./rfc4253');
var utils = require('../utils');
var Key = require('../key');
var PrivateKey = require('../private-key');

var sshpriv = require('./ssh-private');

/*JSSTYLED*/
var SSHKEY_RE = /^([a-z0-9-]+)[ \t]+([a-zA-Z0-9+\/]+[=]*)([ \t]+([^ \t][^\n]*[\n]*)?)?$/;
/*JSSTYLED*/
var SSHKEY_RE2 = /^([a-z0-9-]+)[ \t\n]+([a-zA-Z0-9+\/][a-zA-Z0-9+\/ \t\n=]*)([^a-zA-Z0-9+\/ \t\n=].*)?$/;

function read(buf, options) {
	if (typeof (buf) !== 'string') {
		assert.buffer(buf, 'buf');
		buf = buf.toString('ascii');
	}

	var trimmed = buf.trim().replace(/[\\\r]/g, '');
	var m = trimmed.match(SSHKEY_RE);
	if (!m)
		m = trimmed.match(SSHKEY_RE2);
	assert.ok(m, 'key must match regex');

	var type = rfc4253.algToKeyType(m[1]);
	var kbuf = Buffer.from(m[2], 'base64');

	/*
	 * This is a bit tricky. If we managed to parse the key and locate the
	 * key comment with the regex, then do a non-partial read and assert
	 * that we have consumed all bytes. If we couldn't locate the key
	 * comment, though, there may be whitespace shenanigans going on that
	 * have conjoined the comment to the rest of the key. We do a partial
	 * read in this case to try to make the best out of a sorry situation.
	 */
	var key;
	var ret = {};
	if (m[4]) {
		try {
			key = rfc4253.read(kbuf);

		} catch (e) {
			m = trimmed.match(SSHKEY_RE2);
			assert.ok(m, 'key must match regex');
			kbuf = Buffer.from(m[2], 'base64');
			key = rfc4253.readInternal(ret, 'public', kbuf);
		}
	} else {
		key = rfc4253.readInternal(ret, 'public', kbuf);
	}

	assert.strictEqual(type, key.type);

	if (m[4] && m[4].length > 0) {
		key.comment = m[4];

	} else if (ret.consumed) {
		/*
		 * Now the magic: trying to recover the key comment when it's
		 * gotten conjoined to the key or otherwise shenanigan'd.
		 *
		 * Work out how much base64 we used, then drop all non-base64
		 * chars from the beginning up to this point in the the string.
		 * Then offset in this and try to make up for missing = chars.
		 */
		var data = m[2] + (m[3] ? m[3] : '');
		var realOffset = Math.ceil(ret.consumed / 3) * 4;
		data = data.slice(0, realOffset - 2). /*JSSTYLED*/
		    replace(/[^a-zA-Z0-9+\/=]/g, '') +
		    data.slice(realOffset - 2);

		var padding = ret.consumed % 3;
		if (padding > 0 &&
		    data.slice(realOffset - 1, realOffset) !== '=')
			realOffset--;
		while (data.slice(realOffset, realOffset + 1) === '=')
			realOffset++;

		/* Finally, grab what we think is the comment & clean it up. */
		var trailer = data.slice(realOffset);
		trailer = trailer.replace(/[\r\n]/g, ' ').
		    replace(/^\s+/, '');
		if (trailer.match(/^[a-zA-Z0-9]/))
			key.comment = trailer;
	}

	return (key);
}

function write(key, options) {
	assert.object(key);
	if (!Key.isKey(key))
		throw (new Error('Must be a public key'));

	var parts = [];
	var alg = rfc4253.keyTypeToAlg(key);
	parts.push(alg);

	var buf = rfc4253.write(key);
	parts.push(buf.toString('base64'));

	if (key.comment)
		parts.push(key.comment);

	return (Buffer.from(parts.join(' ')));
}
// Copyright 2016 Joyent, Inc.

var x509 = require('./x509');

module.exports = {
	read: read,
	verify: x509.verify,
	sign: x509.sign,
	write: write
};

var assert = require('assert-plus');
var asn1 = require('asn1');
var Buffer = require('safer-buffer').Buffer;
var algs = require('../algs');
var utils = require('../utils');
var Key = require('../key');
var PrivateKey = require('../private-key');
var pem = require('./pem');
var Identity = require('../identity');
var Signature = require('../signature');
var Certificate = require('../certificate');

function read(buf, options) {
	if (typeof (buf) !== 'string') {
		assert.buffer(buf, 'buf');
		buf = buf.toString('ascii');
	}

	var lines = buf.trim().split(/[\r\n]+/g);

	var m;
	var si = -1;
	while (!m && si < lines.length) {
		m = lines[++si].match(/*JSSTYLED*/
		    /[-]+[ ]*BEGIN CERTIFICATE[ ]*[-]+/);
	}
	assert.ok(m, 'invalid PEM header');

	var m2;
	var ei = lines.length;
	while (!m2 && ei > 0) {
		m2 = lines[--ei].match(/*JSSTYLED*/
		    /[-]+[ ]*END CERTIFICATE[ ]*[-]+/);
	}
	assert.ok(m2, 'invalid PEM footer');

	lines = lines.slice(si, ei + 1);

	var headers = {};
	while (true) {
		lines = lines.slice(1);
		m = lines[0].match(/*JSSTYLED*/
		    /^([A-Za-z0-9-]+): (.+)$/);
		if (!m)
			break;
		headers[m[1].toLowerCase()] = m[2];
	}

	/* Chop off the first and last lines */
	lines = lines.slice(0, -1).join('');
	buf = Buffer.from(lines, 'base64');

	return (x509.read(buf, options));
}

function write(cert, options) {
	var dbuf = x509.write(cert, options);

	var header = 'CERTIFICATE';
	var tmp = dbuf.toString('base64');
	var len = tmp.length + (tmp.length / 64) +
	    18 + 16 + header.length*2 + 10;
	var buf = Buffer.alloc(len);
	var o = 0;
	o += buf.write('-----BEGIN ' + header + '-----\n', o);
	for (var i = 0; i < tmp.length; ) {
		var limit = i + 64;
		if (limit > tmp.length)
			limit = tmp.length;
		o += buf.write(tmp.slice(i, limit), o);
		buf[o++] = 10;
		i = limit;
	}
	o += buf.write('-----END ' + header + '-----\n', o);

	return (buf.slice(0, o));
}
// Copyright 2017 Joyent, Inc.

module.exports = {
	read: read,
	verify: verify,
	sign: sign,
	signAsync: signAsync,
	write: write
};

var assert = require('assert-plus');
var asn1 = require('asn1');
var Buffer = require('safer-buffer').Buffer;
var algs = require('../algs');
var utils = require('../utils');
var Key = require('../key');
var PrivateKey = require('../private-key');
var pem = require('./pem');
var Identity = require('../identity');
var Signature = require('../signature');
var Certificate = require('../certificate');
var pkcs8 = require('./pkcs8');

/*
 * This file is based on RFC5280 (X.509).
 */

/* Helper to read in a single mpint */
function readMPInt(der, nm) {
	assert.strictEqual(der.peek(), asn1.Ber.Integer,
	    nm + ' is not an Integer');
	return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true)));
}

function verify(cert, key) {
	var sig = cert.signatures.x509;
	assert.object(sig, 'x509 signature');

	var algParts = sig.algo.split('-');
	if (algParts[0] !== key.type)
		return (false);

	var blob = sig.cache;
	if (blob === undefined) {
		var der = new asn1.BerWriter();
		writeTBSCert(cert, der);
		blob = der.buffer;
	}

	var verifier = key.createVerify(algParts[1]);
	verifier.write(blob);
	return (verifier.verify(sig.signature));
}

function Local(i) {
	return (asn1.Ber.Context | asn1.Ber.Constructor | i);
}

function Context(i) {
	return (asn1.Ber.Context | i);
}

var SIGN_ALGS = {
	'rsa-md5': '1.2.840.113549.1.1.4',
	'rsa-sha1': '1.2.840.113549.1.1.5',
	'rsa-sha256': '1.2.840.113549.1.1.11',
	'rsa-sha384': '1.2.840.113549.1.1.12',
	'rsa-sha512': '1.2.840.113549.1.1.13',
	'dsa-sha1': '1.2.840.10040.4.3',
	'dsa-sha256': '2.16.840.1.101.3.4.3.2',
	'ecdsa-sha1': '1.2.840.10045.4.1',
	'ecdsa-sha256': '1.2.840.10045.4.3.2',
	'ecdsa-sha384': '1.2.840.10045.4.3.3',
	'ecdsa-sha512': '1.2.840.10045.4.3.4',
	'ed25519-sha512': '1.3.101.112'
};
Object.keys(SIGN_ALGS).forEach(function (k) {
	SIGN_ALGS[SIGN_ALGS[k]] = k;
});
SIGN_ALGS['1.3.14.3.2.3'] = 'rsa-md5';
SIGN_ALGS['1.3.14.3.2.29'] = 'rsa-sha1';

var EXTS = {
	'issuerKeyId': '2.5.29.35',
	'altName': '2.5.29.17',
	'basicConstraints': '2.5.29.19',
	'keyUsage': '2.5.29.15',
	'extKeyUsage': '2.5.29.37'
};

function read(buf, options) {
	if (typeof (buf) === 'string') {
		buf = Buffer.from(buf, 'binary');
	}
	assert.buffer(buf, 'buf');

	var der = new asn1.BerReader(buf);

	der.readSequence();
	if (Math.abs(der.length - der.remain) > 1) {
		throw (new Error('DER sequence does not contain whole byte ' +
		    'stream'));
	}

	var tbsStart = der.offset;
	der.readSequence();
	var sigOffset = der.offset + der.length;
	var tbsEnd = sigOffset;

	if (der.peek() === Local(0)) {
		der.readSequence(Local(0));
		var version = der.readInt();
		assert.ok(version <= 3,
		    'only x.509 versions up to v3 supported');
	}

	var cert = {};
	cert.signatures = {};
	var sig = (cert.signatures.x509 = {});
	sig.extras = {};

	cert.serial = readMPInt(der, 'serial');

	der.readSequence();
	var after = der.offset + der.length;
	var certAlgOid = der.readOID();
	var certAlg = SIGN_ALGS[certAlgOid];
	if (certAlg === undefined)
		throw (new Error('unknown signature algorithm ' + certAlgOid));

	der._offset = after;
	cert.issuer = Identity.parseAsn1(der);

	der.readSequence();
	cert.validFrom = readDate(der);
	cert.validUntil = readDate(der);

	cert.subjects = [Identity.parseAsn1(der)];

	der.readSequence();
	after = der.offset + der.length;
	cert.subjectKey = pkcs8.readPkcs8(undefined, 'public', der);
	der._offset = after;

	/* issuerUniqueID */
	if (der.peek() === Local(1)) {
		der.readSequence(Local(1));
		sig.extras.issuerUniqueID =
		    buf.slice(der.offset, der.offset + der.length);
		der._offset += der.length;
	}

	/* subjectUniqueID */
	if (der.peek() === Local(2)) {
		der.readSequence(Local(2));
		sig.extras.subjectUniqueID =
		    buf.slice(der.offset, der.offset + der.length);
		der._offset += der.length;
	}

	/* extensions */
	if (der.peek() === Local(3)) {
		der.readSequence(Local(3));
		var extEnd = der.offset + der.length;
		der.readSequence();

		while (der.offset < extEnd)
			readExtension(cert, buf, der);

		assert.strictEqual(der.offset, extEnd);
	}

	assert.strictEqual(der.offset, sigOffset);

	der.readSequence();
	after = der.offset + der.length;
	var sigAlgOid = der.readOID();
	var sigAlg = SIGN_ALGS[sigAlgOid];
	if (sigAlg === undefined)
		throw (new Error('unknown signature algorithm ' + sigAlgOid));
	der._offset = after;

	var sigData = der.readString(asn1.Ber.BitString, true);
	if (sigData[0] === 0)
		sigData = sigData.slice(1);
	var algParts = sigAlg.split('-');

	sig.signature = Signature.parse(sigData, algParts[0], 'asn1');
	sig.signature.hashAlgorithm = algParts[1];
	sig.algo = sigAlg;
	sig.cache = buf.slice(tbsStart, tbsEnd);

	return (new Certificate(cert));
}

function readDate(der) {
	if (der.peek() === asn1.Ber.UTCTime) {
		return (utcTimeToDate(der.readString(asn1.Ber.UTCTime)));
	} else if (der.peek() === asn1.Ber.GeneralizedTime) {
		return (gTimeToDate(der.readString(asn1.Ber.GeneralizedTime)));
	} else {
		throw (new Error('Unsupported date format'));
	}
}

function writeDate(der, date) {
	if (date.getUTCFullYear() >= 2050 || date.getUTCFullYear() < 1950) {
		der.writeString(dateToGTime(date), asn1.Ber.GeneralizedTime);
	} else {
		der.writeString(dateToUTCTime(date), asn1.Ber.UTCTime);
	}
}

/* RFC5280, section 4.2.1.6 (GeneralName type) */
var ALTNAME = {
	OtherName: Local(0),
	RFC822Name: Context(1),
	DNSName: Context(2),
	X400Address: Local(3),
	DirectoryName: Local(4),
	EDIPartyName: Local(5),
	URI: Context(6),
	IPAddress: Context(7),
	OID: Context(8)
};

/* RFC5280, section 4.2.1.12 (KeyPurposeId) */
var EXTPURPOSE = {
	'serverAuth': '1.3.6.1.5.5.7.3.1',
	'clientAuth': '1.3.6.1.5.5.7.3.2',
	'codeSigning': '1.3.6.1.5.5.7.3.3',

	/* See https://github.com/joyent/oid-docs/blob/master/root.md */
	'joyentDocker': '1.3.6.1.4.1.38678.1.4.1',
	'joyentCmon': '1.3.6.1.4.1.38678.1.4.2'
};
var EXTPURPOSE_REV = {};
Object.keys(EXTPURPOSE).forEach(function (k) {
	EXTPURPOSE_REV[EXTPURPOSE[k]] = k;
});

var KEYUSEBITS = [
	'signature', 'identity', 'keyEncryption',
	'encryption', 'keyAgreement', 'ca', 'crl'
];

function readExtension(cert, buf, der) {
	der.readSequence();
	var after = der.offset + der.length;
	var extId = der.readOID();
	var id;
	var sig = cert.signatures.x509;
	if (!sig.extras.exts)
		sig.extras.exts = [];

	var critical;
	if (der.peek() === asn1.Ber.Boolean)
		critical = der.readBoolean();

	switch (extId) {
	case (EXTS.basicConstraints):
		der.readSequence(asn1.Ber.OctetString);
		der.readSequence();
		var bcEnd = der.offset + der.length;
		var ca = false;
		if (der.peek() === asn1.Ber.Boolean)
			ca = der.readBoolean();
		if (cert.purposes === undefined)
			cert.purposes = [];
		if (ca === true)
			cert.purposes.push('ca');
		var bc = { oid: extId, critical: critical };
		if (der.offset < bcEnd && der.peek() === asn1.Ber.Integer)
			bc.pathLen = der.readInt();
		sig.extras.exts.push(bc);
		break;
	case (EXTS.extKeyUsage):
		der.readSequence(asn1.Ber.OctetString);
		der.readSequence();
		if (cert.purposes === undefined)
			cert.purposes = [];
		var ekEnd = der.offset + der.length;
		while (der.offset < ekEnd) {
			var oid = der.readOID();
			cert.purposes.push(EXTPURPOSE_REV[oid] || oid);
		}
		/*
		 * This is a bit of a hack: in the case where we have a cert
		 * that's only allowed to do serverAuth or clientAuth (and not
		 * the other), we want to make sure all our Subjects are of
		 * the right type. But we already parsed our Subjects and
		 * decided if they were hosts or users earlier (since it appears
		 * first in the cert).
		 *
		 * So we go through and mutate them into the right kind here if
		 * it doesn't match. This might not be hugely beneficial, as it
		 * seems that single-purpose certs are not often seen in the
		 * wild.
		 */
		if (cert.purposes.indexOf('serverAuth') !== -1 &&
		    cert.purposes.indexOf('clientAuth') === -1) {
			cert.subjects.forEach(function (ide) {
				if (ide.type !== 'host') {
					ide.type = 'host';
					ide.hostname = ide.uid ||
					    ide.email ||
					    ide.components[0].value;
				}
			});
		} else if (cert.purposes.indexOf('clientAuth') !== -1 &&
		    cert.purposes.indexOf('serverAuth') === -1) {
			cert.subjects.forEach(function (ide) {
				if (ide.type !== 'user') {
					ide.type = 'user';
					ide.uid = ide.hostname ||
					    ide.email ||
					    ide.components[0].value;
				}
			});
		}
		sig.extras.exts.push({ oid: extId, critical: critical });
		break;
	case (EXTS.keyUsage):
		der.readSequence(asn1.Ber.OctetString);
		var bits = der.readString(asn1.Ber.BitString, true);
		var setBits = readBitField(bits, KEYUSEBITS);
		setBits.forEach(function (bit) {
			if (cert.purposes === undefined)
				cert.purposes = [];
			if (cert.purposes.indexOf(bit) === -1)
				cert.purposes.push(bit);
		});
		sig.extras.exts.push({ oid: extId, critical: critical,
		    bits: bits });
		break;
	case (EXTS.altName):
		der.readSequence(asn1.Ber.OctetString);
		der.readSequence();
		var aeEnd = der.offset + der.length;
		while (der.offset < aeEnd) {
			switch (der.peek()) {
			case ALTNAME.OtherName:
			case ALTNAME.EDIPartyName:
				der.readSequence();
				der._offset += der.length;
				break;
			case ALTNAME.OID:
				der.readOID(ALTNAME.OID);
				break;
			case ALTNAME.RFC822Name:
				/* RFC822 specifies email addresses */
				var email = der.readString(ALTNAME.RFC822Name);
				id = Identity.forEmail(email);
				if (!cert.subjects[0].equals(id))
					cert.subjects.push(id);
				break;
			case ALTNAME.DirectoryName:
				der.readSequence(ALTNAME.DirectoryName);
				id = Identity.parseAsn1(der);
				if (!cert.subjects[0].equals(id))
					cert.subjects.push(id);
				break;
			case ALTNAME.DNSName:
				var host = der.readString(
				    ALTNAME.DNSName);
				id = Identity.forHost(host);
				if (!cert.subjects[0].equals(id))
					cert.subjects.push(id);
				break;
			default:
				der.readString(der.peek());
				break;
			}
		}
		sig.extras.exts.push({ oid: extId, critical: critical });
		break;
	default:
		sig.extras.exts.push({
			oid: extId,
			critical: critical,
			data: der.readString(asn1.Ber.OctetString, true)
		});
		break;
	}

	der._offset = after;
}

var UTCTIME_RE =
    /^([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/;
function utcTimeToDate(t) {
	var m = t.match(UTCTIME_RE);
	assert.ok(m, 'timestamps must be in UTC');
	var d = new Date();

	var thisYear = d.getUTCFullYear();
	var century = Math.floor(thisYear / 100) * 100;

	var year = parseInt(m[1], 10);
	if (thisYear % 100 < 50 && year >= 60)
		year += (century - 1);
	else
		year += century;
	d.setUTCFullYear(year, parseInt(m[2], 10) - 1, parseInt(m[3], 10));
	d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10));
	if (m[6] && m[6].length > 0)
		d.setUTCSeconds(parseInt(m[6], 10));
	return (d);
}

var GTIME_RE =
    /^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/;
function gTimeToDate(t) {
	var m = t.match(GTIME_RE);
	assert.ok(m);
	var d = new Date();

	d.setUTCFullYear(parseInt(m[1], 10), parseInt(m[2], 10) - 1,
	    parseInt(m[3], 10));
	d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10));
	if (m[6] && m[6].length > 0)
		d.setUTCSeconds(parseInt(m[6], 10));
	return (d);
}

function zeroPad(n, m) {
	if (m === undefined)
		m = 2;
	var s = '' + n;
	while (s.length < m)
		s = '0' + s;
	return (s);
}

function dateToUTCTime(d) {
	var s = '';
	s += zeroPad(d.getUTCFullYear() % 100);
	s += zeroPad(d.getUTCMonth() + 1);
	s += zeroPad(d.getUTCDate());
	s += zeroPad(d.getUTCHours());
	s += zeroPad(d.getUTCMinutes());
	s += zeroPad(d.getUTCSeconds());
	s += 'Z';
	return (s);
}

function dateToGTime(d) {
	var s = '';
	s += zeroPad(d.getUTCFullYear(), 4);
	s += zeroPad(d.getUTCMonth() + 1);
	s += zeroPad(d.getUTCDate());
	s += zeroPad(d.getUTCHours());
	s += zeroPad(d.getUTCMinutes());
	s += zeroPad(d.getUTCSeconds());
	s += 'Z';
	return (s);
}

function sign(cert, key) {
	if (cert.signatures.x509 === undefined)
		cert.signatures.x509 = {};
	var sig = cert.signatures.x509;

	sig.algo = key.type + '-' + key.defaultHashAlgorithm();
	if (SIGN_ALGS[sig.algo] === undefined)
		return (false);

	var der = new asn1.BerWriter();
	writeTBSCert(cert, der);
	var blob = der.buffer;
	sig.cache = blob;

	var signer = key.createSign();
	signer.write(blob);
	cert.signatures.x509.signature = signer.sign();

	return (true);
}

function signAsync(cert, signer, done) {
	if (cert.signatures.x509 === undefined)
		cert.signatures.x509 = {};
	var sig = cert.signatures.x509;

	var der = new asn1.BerWriter();
	writeTBSCert(cert, der);
	var blob = der.buffer;
	sig.cache = blob;

	signer(blob, function (err, signature) {
		if (err) {
			done(err);
			return;
		}
		sig.algo = signature.type + '-' + signature.hashAlgorithm;
		if (SIGN_ALGS[sig.algo] === undefined) {
			done(new Error('Invalid signing algorithm "' +
			    sig.algo + '"'));
			return;
		}
		sig.signature = signature;
		done();
	});
}

function write(cert, options) {
	var sig = cert.signatures.x509;
	assert.object(sig, 'x509 signature');

	var der = new asn1.BerWriter();
	der.startSequence();
	if (sig.cache) {
		der._ensure(sig.cache.length);
		sig.cache.copy(der._buf, der._offset);
		der._offset += sig.cache.length;
	} else {
		writeTBSCert(cert, der);
	}

	der.startSequence();
	der.writeOID(SIGN_ALGS[sig.algo]);
	if (sig.algo.match(/^rsa-/))
		der.writeNull();
	der.endSequence();

	var sigData = sig.signature.toBuffer('asn1');
	var data = Buffer.alloc(sigData.length + 1);
	data[0] = 0;
	sigData.copy(data, 1);
	der.writeBuffer(data, asn1.Ber.BitString);
	der.endSequence();

	return (der.buffer);
}

function writeTBSCert(cert, der) {
	var sig = cert.signatures.x509;
	assert.object(sig, 'x509 signature');

	der.startSequence();

	der.startSequence(Local(0));
	der.writeInt(2);
	der.endSequence();

	der.writeBuffer(utils.mpNormalize(cert.serial), asn1.Ber.Integer);

	der.startSequence();
	der.writeOID(SIGN_ALGS[sig.algo]);
	if (sig.algo.match(/^rsa-/))
		der.writeNull();
	der.endSequence();

	cert.issuer.toAsn1(der);

	der.startSequence();
	writeDate(der, cert.validFrom);
	writeDate(der, cert.validUntil);
	der.endSequence();

	var subject = cert.subjects[0];
	var altNames = cert.subjects.slice(1);
	subject.toAsn1(der);

	pkcs8.writePkcs8(der, cert.subjectKey);

	if (sig.extras && sig.extras.issuerUniqueID) {
		der.writeBuffer(sig.extras.issuerUniqueID, Local(1));
	}

	if (sig.extras && sig.extras.subjectUniqueID) {
		der.writeBuffer(sig.extras.subjectUniqueID, Local(2));
	}

	if (altNames.length > 0 || subject.type === 'host' ||
	    (cert.purposes !== undefined && cert.purposes.length > 0) ||
	    (sig.extras && sig.extras.exts)) {
		der.startSequence(Local(3));
		der.startSequence();

		var exts = [];
		if (cert.purposes !== undefined && cert.purposes.length > 0) {
			exts.push({
				oid: EXTS.basicConstraints,
				critical: true
			});
			exts.push({
				oid: EXTS.keyUsage,
				critical: true
			});
			exts.push({
				oid: EXTS.extKeyUsage,
				critical: true
			});
		}
		exts.push({ oid: EXTS.altName });
		if (sig.extras && sig.extras.exts)
			exts = sig.extras.exts;

		for (var i = 0; i < exts.length; ++i) {
			der.startSequence();
			der.writeOID(exts[i].oid);

			if (exts[i].critical !== undefined)
				der.writeBoolean(exts[i].critical);

			if (exts[i].oid === EXTS.altName) {
				der.startSequence(asn1.Ber.OctetString);
				der.startSequence();
				if (subject.type === 'host') {
					der.writeString(subject.hostname,
					    Context(2));
				}
				for (var j = 0; j < altNames.length; ++j) {
					if (altNames[j].type === 'host') {
						der.writeString(
						    altNames[j].hostname,
						    ALTNAME.DNSName);
					} else if (altNames[j].type ===
					    'email') {
						der.writeString(
						    altNames[j].email,
						    ALTNAME.RFC822Name);
					} else {
						/*
						 * Encode anything else as a
						 * DN style name for now.
						 */
						der.startSequence(
						    ALTNAME.DirectoryName);
						altNames[j].toAsn1(der);
						der.endSequence();
					}
				}
				der.endSequence();
				der.endSequence();
			} else if (exts[i].oid === EXTS.basicConstraints) {
				der.startSequence(asn1.Ber.OctetString);
				der.startSequence();
				var ca = (cert.purposes.indexOf('ca') !== -1);
				var pathLen = exts[i].pathLen;
				der.writeBoolean(ca);
				if (pathLen !== undefined)
					der.writeInt(pathLen);
				der.endSequence();
				der.endSequence();
			} else if (exts[i].oid === EXTS.extKeyUsage) {
				der.startSequence(asn1.Ber.OctetString);
				der.startSequence();
				cert.purposes.forEach(function (purpose) {
					if (purpose === 'ca')
						return;
					if (KEYUSEBITS.indexOf(purpose) !== -1)
						return;
					var oid = purpose;
					if (EXTPURPOSE[purpose] !== undefined)
						oid = EXTPURPOSE[purpose];
					der.writeOID(oid);
				});
				der.endSequence();
				der.endSequence();
			} else if (exts[i].oid === EXTS.keyUsage) {
				der.startSequence(asn1.Ber.OctetString);
				/*
				 * If we parsed this certificate from a byte
				 * stream (i.e. we didn't generate it in sshpk)
				 * then we'll have a ".bits" property on the
				 * ext with the original raw byte contents.
				 *
				 * If we have this, use it here instead of
				 * regenerating it. This guarantees we output
				 * the same data we parsed, so signatures still
				 * validate.
				 */
				if (exts[i].bits !== undefined) {
					der.writeBuffer(exts[i].bits,
					    asn1.Ber.BitString);
				} else {
					var bits = writeBitField(cert.purposes,
					    KEYUSEBITS);
					der.writeBuffer(bits,
					    asn1.Ber.BitString);
				}
				der.endSequence();
			} else {
				der.writeBuffer(exts[i].data,
				    asn1.Ber.OctetString);
			}

			der.endSequence();
		}

		der.endSequence();
		der.endSequence();
	}

	der.endSequence();
}

/*
 * Reads an ASN.1 BER bitfield out of the Buffer produced by doing
 * `BerReader#readString(asn1.Ber.BitString)`. That function gives us the raw
 * contents of the BitString tag, which is a count of unused bits followed by
 * the bits as a right-padded byte string.
 *
 * `bits` is the Buffer, `bitIndex` should contain an array of string names
 * for the bits in the string, ordered starting with bit #0 in the ASN.1 spec.
 *
 * Returns an array of Strings, the names of the bits that were set to 1.
 */
function readBitField(bits, bitIndex) {
	var bitLen = 8 * (bits.length - 1) - bits[0];
	var setBits = {};
	for (var i = 0; i < bitLen; ++i) {
		var byteN = 1 + Math.floor(i / 8);
		var bit = 7 - (i % 8);
		var mask = 1 << bit;
		var bitVal = ((bits[byteN] & mask) !== 0);
		var name = bitIndex[i];
		if (bitVal && typeof (name) === 'string') {
			setBits[name] = true;
		}
	}
	return (Object.keys(setBits));
}

/*
 * `setBits` is an array of strings, containing the names for each bit that
 * sould be set to 1. `bitIndex` is same as in `readBitField()`.
 *
 * Returns a Buffer, ready to be written out with `BerWriter#writeString()`.
 */
function writeBitField(setBits, bitIndex) {
	var bitLen = bitIndex.length;
	var blen = Math.ceil(bitLen / 8);
	var unused = blen * 8 - bitLen;
	var bits = Buffer.alloc(1 + blen); // zero-filled
	bits[0] = unused;
	for (var i = 0; i < bitLen; ++i) {
		var byteN = 1 + Math.floor(i / 8);
		var bit = 7 - (i % 8);
		var mask = 1 << bit;
		var name = bitIndex[i];
		if (name === undefined)
			continue;
		var bitVal = (setBits.indexOf(name) !== -1);
		if (bitVal) {
			bits[byteN] |= mask;
		}
	}
	return (bits);
}
#!/usr/bin/env node
// -*- mode: js -*-
// vim: set filetype=javascript :
// Copyright 2018 Joyent, Inc.	All rights reserved.

var dashdash = require('dashdash');
var sshpk = require('../lib/index');
var fs = require('fs');
var path = require('path');
var tty = require('tty');
var readline = require('readline');
var getPassword = require('getpass').getPass;

var options = [
	{
		names: ['outformat', 't'],
		type: 'string',
		help: 'Output format'
	},
	{
		names: ['informat', 'T'],
		type: 'string',
		help: 'Input format'
	},
	{
		names: ['file', 'f'],
		type: 'string',
		help: 'Input file name (default stdin)'
	},
	{
		names: ['out', 'o'],
		type: 'string',
		help: 'Output file name (default stdout)'
	},
	{
		names: ['private', 'p'],
		type: 'bool',
		help: 'Produce a private key as output'
	},
	{
		names: ['derive', 'd'],
		type: 'string',
		help: 'Output a new key derived from this one, with given algo'
	},
	{
		names: ['identify', 'i'],
		type: 'bool',
		help: 'Print key metadata instead of converting'
	},
	{
		names: ['fingerprint', 'F'],
		type: 'bool',
		help: 'Output key fingerprint'
	},
	{
		names: ['hash', 'H'],
		type: 'string',
		help: 'Hash function to use for key fingeprint with -F'
	},
	{
		names: ['spki', 's'],
		type: 'bool',
		help: 'With -F, generates an SPKI fingerprint instead of SSH'
	},
	{
		names: ['comment', 'c'],
		type: 'string',
		help: 'Set key comment, if output format supports'
	},
	{
		names: ['help', 'h'],
		type: 'bool',
		help: 'Shows this help text'
	}
];

if (require.main === module) {
	var parser = dashdash.createParser({
		options: options
	});

	try {
		var opts = parser.parse(process.argv);
	} catch (e) {
		console.error('sshpk-conv: error: %s', e.message);
		process.exit(1);
	}

	if (opts.help || opts._args.length > 1) {
		var help = parser.help({}).trimRight();
		console.error('sshpk-conv: converts between SSH key formats\n');
		console.error(help);
		console.error('\navailable key formats:');
		console.error('	 - pem, pkcs1	  eg id_rsa');
		console.error('	 - ssh		  eg id_rsa.pub');
		console.error('	 - pkcs8	  format you want for openssl');
		console.error('	 - openssh	  like output of ssh-keygen -o');
		console.error('	 - rfc4253	  raw OpenSSH wire format');
		console.error('	 - dnssec	  dnssec-keygen format');
		console.error('  - putty          PuTTY ppk format');
		console.error('\navailable fingerprint formats:');
		console.error('  - hex            colon-separated hex for SSH');
		console.error('                   straight hex for SPKI');
		console.error('  - base64         SHA256:* format from OpenSSH');
		process.exit(1);
	}

	/*
	 * Key derivation can only be done on private keys, so use of the -d
	 * option necessarily implies -p.
	 */
	if (opts.derive)
		opts.private = true;

	var inFile = process.stdin;
	var inFileName = 'stdin';

	var inFilePath;
	if (opts.file) {
		inFilePath = opts.file;
	} else if (opts._args.length === 1) {
		inFilePath = opts._args[0];
	}

	if (inFilePath)
		inFileName = path.basename(inFilePath);

	try {
		if (inFilePath) {
			fs.accessSync(inFilePath, fs.R_OK);
			inFile = fs.createReadStream(inFilePath);
		}
	} catch (e) {
		ifError(e, 'error opening input file');
	}

	var outFile = process.stdout;

	try {
		if (opts.out && !opts.identify) {
			fs.accessSync(path.dirname(opts.out), fs.W_OK);
			outFile = fs.createWriteStream(opts.out);
		}
	} catch (e) {
		ifError(e, 'error opening output file');
	}

	var bufs = [];
	inFile.on('readable', function () {
		var data;
		while ((data = inFile.read()))
			bufs.push(data);
	});
	var parseOpts = {};
	parseOpts.filename = inFileName;
	inFile.on('end', function processKey() {
		var buf = Buffer.concat(bufs);
		var fmt = 'auto';
		if (opts.informat)
			fmt = opts.informat;
		var f = sshpk.parseKey;
		if (opts.private)
			f = sshpk.parsePrivateKey;
		try {
			var key = f(buf, fmt, parseOpts);
		} catch (e) {
			if (e.name === 'KeyEncryptedError') {
				getPassword(function (err, pw) {
					if (err)
						ifError(err);
					parseOpts.passphrase = pw;
					processKey();
				});
				return;
			}
			ifError(e);
		}

		if (opts.derive)
			key = key.derive(opts.derive);

		if (opts.comment)
			key.comment = opts.comment;

		if (opts.identify) {
			var kind = 'public';
			if (sshpk.PrivateKey.isPrivateKey(key))
				kind = 'private';
			console.log('%s: a %d bit %s %s key', inFileName,
			    key.size, key.type.toUpperCase(), kind);
			if (key.type === 'ecdsa')
				console.log('ECDSA curve: %s', key.curve);
			if (key.comment)
				console.log('Comment: %s', key.comment);
			console.log('SHA256 fingerprint: ' +
			    key.fingerprint('sha256').toString());
			console.log('MD5 fingerprint: ' +
			    key.fingerprint('md5').toString());
			console.log('SPKI-SHA256 fingerprint: ' +
			    key.fingerprint('sha256', 'spki').toString());
			process.exit(0);
			return;
		}

		if (opts.fingerprint) {
			var hash = opts.hash;
			var type = opts.spki ? 'spki' : 'ssh';
			var format = opts.outformat;
			var fp = key.fingerprint(hash, type).toString(format);
			outFile.write(fp);
			outFile.write('\n');
			outFile.once('drain', function () {
				process.exit(0);
			});
			return;
		}

		fmt = undefined;
		if (opts.outformat)
			fmt = opts.outformat;
		outFile.write(key.toBuffer(fmt));
		if (fmt === 'ssh' ||
		    (!opts.private && fmt === undefined))
			outFile.write('\n');
		outFile.once('drain', function () {
			process.exit(0);
		});
	});
}

function ifError(e, txt) {
	if (txt)
		txt = txt + ': ';
	else
		txt = '';
	console.error('sshpk-conv: ' + txt + e.name + ': ' + e.message);
	if (process.env['DEBUG'] || process.env['V']) {
		console.error(e.stack);
		if (e.innerErr)
			console.error(e.innerErr.stack);
	}
	process.exit(1);
}
#!/usr/bin/env node
// -*- mode: js -*-
// vim: set filetype=javascript :
// Copyright 2015 Joyent, Inc.  All rights reserved.

var dashdash = require('dashdash');
var sshpk = require('../lib/index');
var fs = require('fs');
var path = require('path');
var getPassword = require('getpass').getPass;

var options = [
	{
		names: ['hash', 'H'],
		type: 'string',
		help: 'Hash algorithm (sha1, sha256, sha384, sha512)'
	},
	{
		names: ['verbose', 'v'],
		type: 'bool',
		help: 'Display verbose info about key and hash used'
	},
	{
		names: ['identity', 'i'],
		type: 'string',
		help: 'Path to key to use'
	},
	{
		names: ['file', 'f'],
		type: 'string',
		help: 'Input filename'
	},
	{
		names: ['out', 'o'],
		type: 'string',
		help: 'Output filename'
	},
	{
		names: ['format', 't'],
		type: 'string',
		help: 'Signature format (asn1, ssh, raw)'
	},
	{
		names: ['binary', 'b'],
		type: 'bool',
		help: 'Output raw binary instead of base64'
	},
	{
		names: ['help', 'h'],
		type: 'bool',
		help: 'Shows this help text'
	}
];

var parseOpts = {};

if (require.main === module) {
	var parser = dashdash.createParser({
		options: options
	});

	try {
		var opts = parser.parse(process.argv);
	} catch (e) {
		console.error('sshpk-sign: error: %s', e.message);
		process.exit(1);
	}

	if (opts.help || opts._args.length > 1) {
		var help = parser.help({}).trimRight();
		console.error('sshpk-sign: sign data using an SSH key\n');
		console.error(help);
		process.exit(1);
	}

	if (!opts.identity) {
		var help = parser.help({}).trimRight();
		console.error('sshpk-sign: the -i or --identity option ' +
		    'is required\n');
		console.error(help);
		process.exit(1);
	}

	var keyData = fs.readFileSync(opts.identity);
	parseOpts.filename = opts.identity;

	run();
}

function run() {
	var key;
	try {
		key = sshpk.parsePrivateKey(keyData, 'auto', parseOpts);
	} catch (e) {
		if (e.name === 'KeyEncryptedError') {
			getPassword(function (err, pw) {
				parseOpts.passphrase = pw;
				run();
			});
			return;
		}
		console.error('sshpk-sign: error loading private key "' +
		    opts.identity + '": ' + e.name + ': ' + e.message);
		process.exit(1);
	}

	var hash = opts.hash || key.defaultHashAlgorithm();

	var signer;
	try {
		signer = key.createSign(hash);
	} catch (e) {
		console.error('sshpk-sign: error creating signer: ' +
		    e.name + ': ' + e.message);
		process.exit(1);
	}

	if (opts.verbose) {
		console.error('sshpk-sign: using %s-%s with a %d bit key',
		    key.type, hash, key.size);
	}

	var inFile = process.stdin;
	var inFileName = 'stdin';

	var inFilePath;
	if (opts.file) {
		inFilePath = opts.file;
	} else if (opts._args.length === 1) {
		inFilePath = opts._args[0];
	}

	if (inFilePath)
		inFileName = path.basename(inFilePath);

	try {
		if (inFilePath) {
			fs.accessSync(inFilePath, fs.R_OK);
			inFile = fs.createReadStream(inFilePath);
		}
	} catch (e) {
		console.error('sshpk-sign: error opening input file' +
		     ': ' + e.name + ': ' + e.message);
		process.exit(1);
	}

	var outFile = process.stdout;

	try {
		if (opts.out && !opts.identify) {
			fs.accessSync(path.dirname(opts.out), fs.W_OK);
			outFile = fs.createWriteStream(opts.out);
		}
	} catch (e) {
		console.error('sshpk-sign: error opening output file' +
		    ': ' + e.name + ': ' + e.message);
		process.exit(1);
	}

	inFile.pipe(signer);
	inFile.on('end', function () {
		var sig;
		try {
			sig = signer.sign();
		} catch (e) {
			console.error('sshpk-sign: error signing data: ' +
			    e.name + ': ' + e.message);
			process.exit(1);
		}

		var fmt = opts.format || 'asn1';
		var output;
		try {
			output = sig.toBuffer(fmt);
			if (!opts.binary)
				output = output.toString('base64');
		} catch (e) {
			console.error('sshpk-sign: error converting signature' +
			    ' to ' + fmt + ' format: ' + e.name + ': ' +
			    e.message);
			process.exit(1);
		}

		outFile.write(output);
		if (!opts.binary)
			outFile.write('\n');
		outFile.once('drain', function () {
			process.exit(0);
		});
	});
}
#!/usr/bin/env node
// -*- mode: js -*-
// vim: set filetype=javascript :
// Copyright 2015 Joyent, Inc.  All rights reserved.

var dashdash = require('dashdash');
var sshpk = require('../lib/index');
var fs = require('fs');
var path = require('path');
var Buffer = require('safer-buffer').Buffer;

var options = [
	{
		names: ['hash', 'H'],
		type: 'string',
		help: 'Hash algorithm (sha1, sha256, sha384, sha512)'
	},
	{
		names: ['verbose', 'v'],
		type: 'bool',
		help: 'Display verbose info about key and hash used'
	},
	{
		names: ['identity', 'i'],
		type: 'string',
		help: 'Path to (public) key to use'
	},
	{
		names: ['file', 'f'],
		type: 'string',
		help: 'Input filename'
	},
	{
		names: ['format', 't'],
		type: 'string',
		help: 'Signature format (asn1, ssh, raw)'
	},
	{
		names: ['signature', 's'],
		type: 'string',
		help: 'base64-encoded signature data'
	},
	{
		names: ['help', 'h'],
		type: 'bool',
		help: 'Shows this help text'
	}
];

if (require.main === module) {
	var parser = dashdash.createParser({
		options: options
	});

	try {
		var opts = parser.parse(process.argv);
	} catch (e) {
		console.error('sshpk-verify: error: %s', e.message);
		process.exit(3);
	}

	if (opts.help || opts._args.length > 1) {
		var help = parser.help({}).trimRight();
		console.error('sshpk-verify: sign data using an SSH key\n');
		console.error(help);
		process.exit(3);
	}

	if (!opts.identity) {
		var help = parser.help({}).trimRight();
		console.error('sshpk-verify: the -i or --identity option ' +
		    'is required\n');
		console.error(help);
		process.exit(3);
	}

	if (!opts.signature) {
		var help = parser.help({}).trimRight();
		console.error('sshpk-verify: the -s or --signature option ' +
		    'is required\n');
		console.error(help);
		process.exit(3);
	}

	var keyData = fs.readFileSync(opts.identity);

	var key;
	try {
		key = sshpk.parseKey(keyData);
	} catch (e) {
		console.error('sshpk-verify: error loading key "' +
		    opts.identity + '": ' + e.name + ': ' + e.message);
		process.exit(2);
	}

	var fmt = opts.format || 'asn1';
	var sigData = Buffer.from(opts.signature, 'base64');

	var sig;
	try {
		sig = sshpk.parseSignature(sigData, key.type, fmt);
	} catch (e) {
		console.error('sshpk-verify: error parsing signature: ' +
		    e.name + ': ' + e.message);
		process.exit(2);
	}

	var hash = opts.hash || key.defaultHashAlgorithm();

	var verifier;
	try {
		verifier = key.createVerify(hash);
	} catch (e) {
		console.error('sshpk-verify: error creating verifier: ' +
		    e.name + ': ' + e.message);
		process.exit(2);
	}

	if (opts.verbose) {
		console.error('sshpk-verify: using %s-%s with a %d bit key',
		    key.type, hash, key.size);
	}

	var inFile = process.stdin;
	var inFileName = 'stdin';

	var inFilePath;
	if (opts.file) {
		inFilePath = opts.file;
	} else if (opts._args.length === 1) {
		inFilePath = opts._args[0];
	}

	if (inFilePath)
		inFileName = path.basename(inFilePath);

	try {
		if (inFilePath) {
			fs.accessSync(inFilePath, fs.R_OK);
			inFile = fs.createReadStream(inFilePath);
		}
	} catch (e) {
		console.error('sshpk-verify: error opening input file' +
		     ': ' + e.name + ': ' + e.message);
		process.exit(2);
	}

	inFile.pipe(verifier);
	inFile.on('end', function () {
		var ret;
		try {
			ret = verifier.verify(sig);
		} catch (e) {
			console.error('sshpk-verify: error verifying data: ' +
			    e.name + ': ' + e.message);
			process.exit(1);
		}

		if (ret) {
			console.error('OK');
			process.exit(0);
		}

		console.error('NOT OK');
		process.exit(1);
	});
}
0.2.2 / 2016-09-05
==================

* [[`764f2420ef`](https://github.com/TooTallNate/stat-mode/commit/764f2420ef)] - Rename `define()` to `_define()` (#6) (CxRes)
* [[`ba5a88d6e4`](https://github.com/TooTallNate/stat-mode/commit/ba5a88d6e4)] - **package**: update "mocha" to v3.0.2 (Nathan Rajlich)
* [[`e8a4a487ab`](https://github.com/TooTallNate/stat-mode/commit/e8a4a487ab)] - **travis**: test lots more node versions (Nathan Rajlich)

0.2.1 / 2015-04-06
==================

  * fix #2
  * add regression test for #2
  * travis: test node v0.12 instead of v0.11
  * .travis: don't test node v0.9.x
  * add .travis.yml file
  * README: add Travis-CI badge
  * test: add FIFO test
  * test: more test cases
  * test: more inputs for tests
  * package: update "mocha" to v1.18.2
  * package: add a few more "keywords"

0.2.0 / 2014-04-02
==================

  * index: add `Mode#toOctal()` function
  * index: add `setuid`, `setgid` and `sticky` props
  * test: initial tests

0.1.0 / 2014-03-01
==================

  * package: remove the "test" script for now
  * index: add `Mode#toString()` function
  * index: add `Mode#valueOf()` function

0.0.1 / 2014-03-01
==================

  * initial commit
(The MIT License)

Copyright (c) 2016 Nathan Rajlich <n@n8.io>

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

/**
 * Module exports.
 */

module.exports = Mode;

/**
 * Constants (defined in `stat.h`).
 */

var S_IFMT = 61440;   /* 0170000 type of file */
var S_IFIFO = 4096;   /* 0010000 named pipe (fifo) */
var S_IFCHR = 8192;   /* 0020000 character special */
var S_IFDIR = 16384;  /* 0040000 directory */
var S_IFBLK = 24576;  /* 0060000 block special */
var S_IFREG = 32768;  /* 0100000 regular */
var S_IFLNK = 40960;  /* 0120000 symbolic link */
var S_IFSOCK = 49152; /* 0140000 socket */
var S_IFWHT = 57344;  /* 0160000 whiteout */
var S_ISUID = 2048;   /* 0004000 set user id on execution */
var S_ISGID = 1024;   /* 0002000 set group id on execution */
var S_ISVTX = 512;    /* 0001000 save swapped text even after use */
var S_IRUSR = 256;    /* 0000400 read permission, owner */
var S_IWUSR = 128;    /* 0000200 write permission, owner */
var S_IXUSR = 64;     /* 0000100 execute/search permission, owner */
var S_IRGRP = 32;     /* 0000040 read permission, group */
var S_IWGRP = 16;     /* 0000020 write permission, group */
var S_IXGRP = 8;      /* 0000010 execute/search permission, group */
var S_IROTH = 4;      /* 0000004 read permission, others */
var S_IWOTH = 2;      /* 0000002 write permission, others */
var S_IXOTH = 1;      /* 0000001 execute/search permission, others */

/**
 * `Mode` class.
 *
 * @param {fs.Stat} stat a "stat" object (anything with a `mode` Number property)
 * @api public
 */

function Mode (stat) {
  if (!(this instanceof Mode)) return new Mode(stat);
  if (!stat) throw new TypeError('must pass in a "stat" object');
  if ('number' != typeof stat.mode) stat.mode = 0;
  this.stat = stat;
  this.owner = new Owner(stat);
  this.group = new Group(stat);
  this.others = new Others(stat);
}

/**
 * Returns the Number value of the `mode`.
 *
 * @return {Number}
 * @api public
 */

Mode.prototype.valueOf = function () {
  return this.stat.mode;
};

/**
 * Returns a String representation of the `mode`.
 * The output resembles something similiar to what `ls -l` would output.
 *
 * http://en.wikipedia.org/wiki/Unix_file_types
 *
 * @return {String}
 * @api public
 */

Mode.prototype.toString = function () {
  var str = [];

  // file type
  if (this.isDirectory()) {
    str.push('d');
  } else if (this.isFile()) {
    str.push('-');
  } else if (this.isBlockDevice()) {
    str.push('b');
  } else if (this.isCharacterDevice()) {
    str.push('c');
  } else if (this.isSymbolicLink()) {
    str.push('l');
  } else if (this.isFIFO()) {
    str.push('p');
  } else if (this.isSocket()) {
    str.push('s');
  } else {
    const mode = this.valueOf();
    const err = new TypeError('Unexpected "file type": mode=' + mode);
    err.stat = this.stat;
    err.mode = mode;
  }

  // owner read, write, execute
  str.push(this.owner.read ? 'r' : '-');
  str.push(this.owner.write ? 'w' : '-');
  if (this.setuid) {
    str.push(this.owner.execute ? 's' : 'S');
  } else {
    str.push(this.owner.execute ? 'x' : '-');
  }

  // group read, write, execute
  str.push(this.group.read ? 'r' : '-');
  str.push(this.group.write ? 'w' : '-');
  if (this.setgid) {
    str.push(this.group.execute ? 's' : 'S');
  } else {
    str.push(this.group.execute ? 'x' : '-');
  }

  // others read, write, execute
  str.push(this.others.read ? 'r' : '-');
  str.push(this.others.write ? 'w' : '-');
  if (this.sticky) {
    str.push(this.others.execute ? 't' : 'T');
  } else {
    str.push(this.others.execute ? 'x' : '-');
  }

  return str.join('');
};

/**
 * Returns an octal representation of the `mode`, eg. "0754".
 *
 * http://en.wikipedia.org/wiki/File_system_permissions#Numeric_notation
 *
 * @return {String}
 * @api public
 */

Mode.prototype.toOctal = function () {
  var octal = this.stat.mode & 4095 /* 07777 */;
  return ('0000' + octal.toString(8)).slice(-4);
};

Mode.prototype._checkModeProperty = function (property, set) {
  var mode = this.stat.mode;
  if (set) {
    this.stat.mode = (mode | S_IFMT) & property | mode & ~S_IFMT;
  }
  return (mode & S_IFMT) === property;
};

Mode.prototype.isDirectory = function (v) {
  return this._checkModeProperty(S_IFDIR, v);
};

Mode.prototype.isFile = function (v) {
  return this._checkModeProperty(S_IFREG, v);
};

Mode.prototype.isBlockDevice = function (v) {
  return this._checkModeProperty(S_IFBLK, v);
};

Mode.prototype.isCharacterDevice = function (v) {
  return this._checkModeProperty(S_IFCHR, v);
};

Mode.prototype.isSymbolicLink = function (v) {
  return this._checkModeProperty(S_IFLNK, v);
};

Mode.prototype.isFIFO = function (v) {
  return this._checkModeProperty(S_IFIFO, v);
};

Mode.prototype.isSocket = function (v) {
  return this._checkModeProperty(S_IFSOCK, v);
};

_define(Mode.prototype, 'setuid',
  function () {
    return Boolean(this.stat.mode & S_ISUID);
  },
  function (v) {
    if (v) {
      this.stat.mode |= S_ISUID;
    } else {
      this.stat.mode &= ~S_ISUID;
    }
  }
);

_define(Mode.prototype, 'setgid',
  function () {
    return Boolean(this.stat.mode & S_ISGID);
  },
  function (v) {
    if (v) {
      this.stat.mode |= S_ISGID;
    } else {
      this.stat.mode &= ~S_ISGID;
    }
  }
);

_define(Mode.prototype, 'sticky',
  function () {
    return Boolean(this.stat.mode & S_ISVTX);
  },
  function (v) {
    if (v) {
      this.stat.mode |= S_ISVTX;
    } else {
      this.stat.mode &= ~S_ISVTX;
    }
  }
);

function Owner (stat) {
  _define(this, 'read',
    function () {
      return Boolean(stat.mode & S_IRUSR);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IRUSR;
      } else {
        stat.mode &= ~S_IRUSR;
      }
    }
  );
  _define(this, 'write',
    function () {
      return Boolean(stat.mode & S_IWUSR);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IWUSR;
      } else {
        stat.mode &= ~S_IWUSR;
      }
    }
  );
  _define(this, 'execute',
    function () {
      return Boolean(stat.mode & S_IXUSR);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IXUSR;
      } else {
        stat.mode &= ~S_IXUSR;
      }
    }
  );
}

function Group (stat) {
  _define(this, 'read',
    function () {
      return Boolean(stat.mode & S_IRGRP);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IRGRP;
      } else {
        stat.mode &= ~S_IRGRP;
      }
    }
  );
  _define(this, 'write',
    function () {
      return Boolean(stat.mode & S_IWGRP);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IWGRP;
      } else {
        stat.mode &= ~S_IWGRP;
      }
    }
  );
  _define(this, 'execute',
    function () {
      return Boolean(stat.mode & S_IXGRP);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IXGRP;
      } else {
        stat.mode &= ~S_IXGRP;
      }
    }
  );
}

function Others (stat) {
  _define(this, 'read',
    function () {
      return Boolean(stat.mode & S_IROTH);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IROTH;
      } else {
        stat.mode &= ~S_IROTH;
      }
    }
  );
  _define(this, 'write',
    function () {
      return Boolean(stat.mode & S_IWOTH);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IWOTH;
      } else {
        stat.mode &= ~S_IWOTH;
      }
    }
  );
  _define(this, 'execute',
    function () {
      return Boolean(stat.mode & S_IXOTH);
    },
    function (v) {
      if (v) {
        stat.mode |= S_IXOTH;
      } else {
        stat.mode &= ~S_IXOTH;
      }
    }
  );
}

function _define (obj, name, get, set) {
  Object.defineProperty(obj, name, {
    enumerable: true,
    configurable: true,
    get: get,
    set: set
  });
}
{
  "author": {
    "name": "Nathan Rajlich",
    "email": "nathan@tootallnate.net",
    "url": "http://n8.io/"
  },
  "deprecated": false,
  "description": "Offers convenient getters and setters for the stat `mode`",
  "devDependencies": {
    "mocha": "^3.0.2"
  },
  "homepage": "https://github.com/TooTallNate/stat-mode",
  "license": "MIT",
  "main": "index.js",
  "name": "stat-mode",
  "repository": {
    "type": "git",
    "url": "git://github.com/TooTallNate/stat-mode.git"
  },
  "version": "0.3.0"
}'use strict';
var stripAnsi = require('strip-ansi');
var codePointAt = require('code-point-at');
var isFullwidthCodePoint = require('is-fullwidth-code-point');

// https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1345
module.exports = function (str) {
	if (typeof str !== 'string' || str.length === 0) {
		return 0;
	}

	var width = 0;

	str = stripAnsi(str);

	for (var i = 0; i < str.length; i++) {
		var code = codePointAt(str, i);

		// ignore control characters
		if (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) {
			continue;
		}

		// surrogates
		if (code >= 0x10000) {
			i++;
		}

		if (isFullwidthCodePoint(code)) {
			width += 2;
		} else {
			width++;
		}
	}

	return width;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "code-point-at": "^1.0.0",
    "is-fullwidth-code-point": "^1.0.0",
    "strip-ansi": "^3.0.0"
  },
  "deprecated": false,
  "description": "Get the visual width of a string - the number of columns required to display it",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/string-width#readme",
  "license": "MIT",
  "name": "string-width",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/string-width.git"
  },
  "version": "1.0.2"
}Copyright Mathias Bynens <https://mathiasbynens.be/>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
/*! https://mths.be/codepointat v0.2.0 by @mathias */
if (!String.prototype.codePointAt) {
	(function() {
		'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
		var defineProperty = (function() {
			// IE 8 only supports `Object.defineProperty` on DOM elements
			try {
				var object = {};
				var $defineProperty = Object.defineProperty;
				var result = $defineProperty(object, object, object) && $defineProperty;
			} catch(error) {}
			return result;
		}());
		var codePointAt = function(position) {
			if (this == null) {
				throw TypeError();
			}
			var string = String(this);
			var size = string.length;
			// `ToInteger`
			var index = position ? Number(position) : 0;
			if (index != index) { // better `isNaN`
				index = 0;
			}
			// Account for out-of-bounds indices:
			if (index < 0 || index >= size) {
				return undefined;
			}
			// Get the first code unit
			var first = string.charCodeAt(index);
			var second;
			if ( // check if itâ€™s the start of a surrogate pair
				first >= 0xD800 && first <= 0xDBFF && // high surrogate
				size > index + 1 // there is a next code unit
			) {
				second = string.charCodeAt(index + 1);
				if (second >= 0xDC00 && second <= 0xDFFF) { // low surrogate
					// https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
					return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
				}
			}
			return first;
		};
		if (defineProperty) {
			defineProperty(String.prototype, 'codePointAt', {
				'value': codePointAt,
				'configurable': true,
				'writable': true
			});
		} else {
			String.prototype.codePointAt = codePointAt;
		}
	}());
}
{
  "author": {
    "name": "Mathias Bynens",
    "url": "https://mathiasbynens.be/"
  },
  "deprecated": false,
  "description": "A robust & optimized `String.prototype.codePointAt` polyfill, based on the ECMAScript 6 specification.",
  "files": [
    "LICENSE-MIT.txt",
    "codepointat.js"
  ],
  "homepage": "https://mths.be/codepointat",
  "license": "MIT",
  "main": "codepointat.js",
  "name": "string.prototype.codepointat",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/mathiasbynens/String.prototype.codePointAt.git"
  },
  "version": "0.2.1"
}Copyright Joyent, Inc. and other Node contributors.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit
persons to whom the Software is furnished to do so, subject to the
following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

var Buffer = require('buffer').Buffer;

var isBufferEncoding = Buffer.isEncoding
  || function(encoding) {
       switch (encoding && encoding.toLowerCase()) {
         case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;
         default: return false;
       }
     }


function assertEncoding(encoding) {
  if (encoding && !isBufferEncoding(encoding)) {
    throw new Error('Unknown encoding: ' + encoding);
  }
}

// StringDecoder provides an interface for efficiently splitting a series of
// buffers into a series of JS strings without breaking apart multi-byte
// characters. CESU-8 is handled as part of the UTF-8 encoding.
//
// @TODO Handling all encodings inside a single object makes it very difficult
// to reason about this code, so it should be split up in the future.
// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
// points as used by CESU-8.
var StringDecoder = exports.StringDecoder = function(encoding) {
  this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
  assertEncoding(encoding);
  switch (this.encoding) {
    case 'utf8':
      // CESU-8 represents each of Surrogate Pair by 3-bytes
      this.surrogateSize = 3;
      break;
    case 'ucs2':
    case 'utf16le':
      // UTF-16 represents each of Surrogate Pair by 2-bytes
      this.surrogateSize = 2;
      this.detectIncompleteChar = utf16DetectIncompleteChar;
      break;
    case 'base64':
      // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
      this.surrogateSize = 3;
      this.detectIncompleteChar = base64DetectIncompleteChar;
      break;
    default:
      this.write = passThroughWrite;
      return;
  }

  // Enough space to store all bytes of a single character. UTF-8 needs 4
  // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
  this.charBuffer = new Buffer(6);
  // Number of bytes received for the current incomplete multi-byte character.
  this.charReceived = 0;
  // Number of bytes expected for the current incomplete multi-byte character.
  this.charLength = 0;
};


// write decodes the given buffer and returns it as JS string that is
// guaranteed to not contain any partial multi-byte characters. Any partial
// character found at the end of the buffer is buffered up, and will be
// returned when calling write again with the remaining bytes.
//
// Note: Converting a Buffer containing an orphan surrogate to a String
// currently works, but converting a String to a Buffer (via `new Buffer`, or
// Buffer#write) will replace incomplete surrogates with the unicode
// replacement character. See https://codereview.chromium.org/121173009/ .
StringDecoder.prototype.write = function(buffer) {
  var charStr = '';
  // if our last write ended with an incomplete multibyte character
  while (this.charLength) {
    // determine how many remaining bytes this buffer has to offer for this char
    var available = (buffer.length >= this.charLength - this.charReceived) ?
        this.charLength - this.charReceived :
        buffer.length;

    // add the new bytes to the char buffer
    buffer.copy(this.charBuffer, this.charReceived, 0, available);
    this.charReceived += available;

    if (this.charReceived < this.charLength) {
      // still not enough chars in this buffer? wait for more ...
      return '';
    }

    // remove bytes belonging to the current character from the buffer
    buffer = buffer.slice(available, buffer.length);

    // get the character that was split
    charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);

    // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
    var charCode = charStr.charCodeAt(charStr.length - 1);
    if (charCode >= 0xD800 && charCode <= 0xDBFF) {
      this.charLength += this.surrogateSize;
      charStr = '';
      continue;
    }
    this.charReceived = this.charLength = 0;

    // if there are no more bytes in this buffer, just emit our char
    if (buffer.length === 0) {
      return charStr;
    }
    break;
  }

  // determine and set charLength / charReceived
  this.detectIncompleteChar(buffer);

  var end = buffer.length;
  if (this.charLength) {
    // buffer the incomplete character bytes we got
    buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
    end -= this.charReceived;
  }

  charStr += buffer.toString(this.encoding, 0, end);

  var end = charStr.length - 1;
  var charCode = charStr.charCodeAt(end);
  // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
  if (charCode >= 0xD800 && charCode <= 0xDBFF) {
    var size = this.surrogateSize;
    this.charLength += size;
    this.charReceived += size;
    this.charBuffer.copy(this.charBuffer, size, 0, size);
    buffer.copy(this.charBuffer, 0, 0, size);
    return charStr.substring(0, end);
  }

  // or just emit the charStr
  return charStr;
};

// detectIncompleteChar determines if there is an incomplete UTF-8 character at
// the end of the given buffer. If so, it sets this.charLength to the byte
// length that character, and sets this.charReceived to the number of bytes
// that are available for this character.
StringDecoder.prototype.detectIncompleteChar = function(buffer) {
  // determine how many bytes we have to check at the end of this buffer
  var i = (buffer.length >= 3) ? 3 : buffer.length;

  // Figure out if one of the last i bytes of our buffer announces an
  // incomplete char.
  for (; i > 0; i--) {
    var c = buffer[buffer.length - i];

    // See http://en.wikipedia.org/wiki/UTF-8#Description

    // 110XXXXX
    if (i == 1 && c >> 5 == 0x06) {
      this.charLength = 2;
      break;
    }

    // 1110XXXX
    if (i <= 2 && c >> 4 == 0x0E) {
      this.charLength = 3;
      break;
    }

    // 11110XXX
    if (i <= 3 && c >> 3 == 0x1E) {
      this.charLength = 4;
      break;
    }
  }
  this.charReceived = i;
};

StringDecoder.prototype.end = function(buffer) {
  var res = '';
  if (buffer && buffer.length)
    res = this.write(buffer);

  if (this.charReceived) {
    var cr = this.charReceived;
    var buf = this.charBuffer;
    var enc = this.encoding;
    res += buf.slice(0, cr).toString(enc);
  }

  return res;
};

function passThroughWrite(buffer) {
  return buffer.toString(this.encoding);
}

function utf16DetectIncompleteChar(buffer) {
  this.charReceived = buffer.length % 2;
  this.charLength = this.charReceived ? 2 : 0;
}

function base64DetectIncompleteChar(buffer) {
  this.charReceived = buffer.length % 3;
  this.charLength = this.charReceived ? 3 : 0;
}
{
  "dependencies": {},
  "deprecated": false,
  "description": "The string_decoder module from Node core",
  "devDependencies": {
    "tap": "~0.4.8"
  },
  "homepage": "https://github.com/rvagg/string_decoder",
  "license": "MIT",
  "main": "index.js",
  "name": "string_decoder",
  "repository": {
    "type": "git",
    "url": "git://github.com/rvagg/string_decoder.git"
  },
  "version": "0.10.31"
}'use strict';
var ansiRegex = require('ansi-regex')();

module.exports = function (str) {
	return typeof str === 'string' ? str.replace(ansiRegex, '') : str;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "ansi-regex": "^2.0.0"
  },
  "deprecated": false,
  "description": "Strip ANSI escape codes",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/strip-ansi#readme",
  "license": "MIT",
  "maintainers": [
    {
      "name": "Sindre Sorhus",
      "email": "sindresorhus@gmail.com",
      "url": "sindresorhus.com"
    },
    {
      "name": "Joshua Boy Nicolai Appelman",
      "email": "joshua@jbna.nl",
      "url": "jbna.nl"
    },
    {
      "name": "JD Ballard",
      "email": "i.am.qix@gmail.com",
      "url": "github.com/qix-"
    }
  ],
  "name": "strip-ansi",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/strip-ansi.git"
  },
  "version": "3.0.1"
}'use strict';
module.exports = x => {
	if (typeof x !== 'string') {
		throw new TypeError('Expected a string, got ' + typeof x);
	}

	// Catches EFBBBF (UTF-8 BOM) because the buffer-to-string
	// conversion translates it to FEFF (UTF-16 BOM)
	if (x.charCodeAt(0) === 0xFEFF) {
		return x.slice(1);
	}

	return x;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Strip UTF-8 byte order mark (BOM) from a string",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/strip-bom#readme",
  "license": "MIT",
  "name": "strip-bom",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/strip-bom.git"
  },
  "version": "3.0.0"
}'use strict';
module.exports = function (x) {
	var lf = typeof x === 'string' ? '\n' : '\n'.charCodeAt();
	var cr = typeof x === 'string' ? '\r' : '\r'.charCodeAt();

	if (x[x.length - 1] === lf) {
		x = x.slice(0, x.length - 1);
	}

	if (x[x.length - 1] === cr) {
		x = x.slice(0, x.length - 1);
	}

	return x;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Strip the End-Of-File (EOF) character from a string/buffer",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/strip-eof#readme",
  "license": "MIT",
  "name": "strip-eof",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/strip-eof.git"
  },
  "version": "1.0.0"
}#!/usr/bin/env node
'use strict';
var fs = require('fs');
var stdin = require('get-stdin');
var pkg = require('./package.json');
var stripIndent = require('./');
var argv = process.argv.slice(2);
var input = argv[0];

function help() {
	console.log([
		'',
		'  ' + pkg.description,
		'',
		'  Usage',
		'    strip-indent <file>',
		'    echo <string> | strip-indent',
		'',
		'  Example',
		'    echo \'\\tunicorn\\n\\t\\tcake\' | strip-indent',
		'    unicorn',
		'    \tcake'
	].join('\n'));
}

function init(data) {
	console.log(stripIndent(data));
}

if (argv.indexOf('--help') !== -1) {
	help();
	return;
}

if (argv.indexOf('--version') !== -1) {
	console.log(pkg.version);
	return;
}

if (process.stdin.isTTY) {
	if (!input) {
		help();
		return;
	}

	init(fs.readFileSync(input, 'utf8'));
} else {
	stdin(init);
}
'use strict';
module.exports = function (str) {
	var match = str.match(/^[ \t]*(?=\S)/gm);

	if (!match) {
		return str;
	}

	var indent = Math.min.apply(Math, match.map(function (el) {
		return el.length;
	}));

	var re = new RegExp('^[ \\t]{' + indent + '}', 'gm');

	return indent > 0 ? str.replace(re, '') : str;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "http://sindresorhus.com"
  },
  "bin": {
    "strip-indent": "cli.js"
  },
  "dependencies": {
    "get-stdin": "^4.0.1"
  },
  "deprecated": false,
  "description": "Strip leading whitespace from every line in a string",
  "devDependencies": {
    "mocha": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js",
    "cli.js"
  ],
  "homepage": "https://github.com/sindresorhus/strip-indent#readme",
  "license": "MIT",
  "name": "strip-indent",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/strip-indent.git"
  },
  "version": "1.0.1"
}'use strict';
var singleComment = 1;
var multiComment = 2;

function stripWithoutWhitespace() {
	return '';
}

function stripWithWhitespace(str, start, end) {
	return str.slice(start, end).replace(/\S/g, ' ');
}

module.exports = function (str, opts) {
	opts = opts || {};

	var currentChar;
	var nextChar;
	var insideString = false;
	var insideComment = false;
	var offset = 0;
	var ret = '';
	var strip = opts.whitespace === false ? stripWithoutWhitespace : stripWithWhitespace;

	for (var i = 0; i < str.length; i++) {
		currentChar = str[i];
		nextChar = str[i + 1];

		if (!insideComment && currentChar === '"') {
			var escaped = str[i - 1] === '\\' && str[i - 2] !== '\\';
			if (!escaped) {
				insideString = !insideString;
			}
		}

		if (insideString) {
			continue;
		}

		if (!insideComment && currentChar + nextChar === '//') {
			ret += str.slice(offset, i);
			offset = i;
			insideComment = singleComment;
			i++;
		} else if (insideComment === singleComment && currentChar + nextChar === '\r\n') {
			i++;
			insideComment = false;
			ret += strip(str, offset, i);
			offset = i;
			continue;
		} else if (insideComment === singleComment && currentChar === '\n') {
			insideComment = false;
			ret += strip(str, offset, i);
			offset = i;
		} else if (!insideComment && currentChar + nextChar === '/*') {
			ret += str.slice(offset, i);
			offset = i;
			insideComment = multiComment;
			i++;
			continue;
		} else if (insideComment === multiComment && currentChar + nextChar === '*/') {
			i++;
			insideComment = false;
			ret += strip(str, offset, i + 1);
			offset = i + 1;
			continue;
		}
	}

	return ret + (insideComment ? strip(str.substr(offset)) : str.substr(offset));
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Strip comments from JSON. Lets you use comments in your JSON files!",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/strip-json-comments#readme",
  "license": "MIT",
  "name": "strip-json-comments",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/strip-json-comments.git"
  },
  "version": "2.0.1"
}
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
# Changes by Version

## Unreleased

## [2.0.2] - 2017-03-11

### Added

* Node 8 support (#6)

## [2.0.1] - 2017-01-26

### Fixed

* Include `index.js` in the NPM package again

## [2.0.0] - 2017-01-26

### Removed

* Support for Node 0.10 and 0.12 (#4)

## [1.3.1] - 2017-03-11

### Added

* Node 8 support (#6)

## [1.3.0] - 2016-12-05

### Added

* Human-readable messages for Errors (#2)

## [1.2.0] - 2016-09-15

### Added

* Support for Node 0.10 and 0.12 via Babel (#1)

## [1.1.0] - 2016-09-06

### Added

* Optional `defaultTextEncoding` parameter in the `ChecksumValidator` constructor
* Access to the underlying `ChecksumValidator` class

## [1.0.0] - 2016-09-05

Initial release.

[2.0.2]: https://github.com/malept/sumchecker/compare/v2.0.1...v2.0.2
[2.0.1]: https://github.com/malept/sumchecker/compare/v2.0.0...v2.0.1
[2.0.0]: https://github.com/malept/sumchecker/compare/v1.3.0...v2.0.0
[1.3.1]: https://github.com/malept/sumchecker/compare/v1.3.0...v1.3.1
[1.3.0]: https://github.com/malept/sumchecker/compare/v1.2.0...v1.3.0
[1.2.0]: https://github.com/malept/sumchecker/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/malept/sumchecker/compare/v1.0.0...v1.1.0
[1.0.0]: https://github.com/malept/sumchecker/releases/tag/v1.0.0
/*
Copyright 2016 Mark Lee

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

'use strict';

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var debug = require('debug')('sumchecker');
var crypto = require('crypto');
var fs = require('fs');
var path = require('path');
var Promise = global.Promise || require('es6-promise').Promise;

var CHECKSUM_LINE = /^([\da-fA-F]+) ([ *])(.+)$/;

var ErrorWithFilename = function (_Error) {
  _inherits(ErrorWithFilename, _Error);

  function ErrorWithFilename(filename) {
    _classCallCheck(this, ErrorWithFilename);

    var _this = _possibleConstructorReturn(this, (ErrorWithFilename.__proto__ || Object.getPrototypeOf(ErrorWithFilename)).call(this));

    _this.filename = filename;
    return _this;
  }

  return ErrorWithFilename;
}(Error);

var ChecksumMismatchError = function (_ErrorWithFilename) {
  _inherits(ChecksumMismatchError, _ErrorWithFilename);

  function ChecksumMismatchError(filename) {
    _classCallCheck(this, ChecksumMismatchError);

    var _this2 = _possibleConstructorReturn(this, (ChecksumMismatchError.__proto__ || Object.getPrototypeOf(ChecksumMismatchError)).call(this, filename));

    _this2.message = 'Generated checksum for "' + filename + '" did not match expected checksum.';
    return _this2;
  }

  return ChecksumMismatchError;
}(ErrorWithFilename);

var ChecksumParseError = function (_Error2) {
  _inherits(ChecksumParseError, _Error2);

  function ChecksumParseError(lineNumber, line) {
    _classCallCheck(this, ChecksumParseError);

    var _this3 = _possibleConstructorReturn(this, (ChecksumParseError.__proto__ || Object.getPrototypeOf(ChecksumParseError)).call(this));

    _this3.lineNumber = lineNumber;
    _this3.line = line;
    _this3.message = 'Could not parse checksum file at line ' + lineNumber + ': ' + line;
    return _this3;
  }

  return ChecksumParseError;
}(Error);

var NoChecksumFoundError = function (_ErrorWithFilename2) {
  _inherits(NoChecksumFoundError, _ErrorWithFilename2);

  function NoChecksumFoundError(filename) {
    _classCallCheck(this, NoChecksumFoundError);

    var _this4 = _possibleConstructorReturn(this, (NoChecksumFoundError.__proto__ || Object.getPrototypeOf(NoChecksumFoundError)).call(this, filename));

    _this4.message = 'No checksum found in checksum file for "' + filename + '".';
    return _this4;
  }

  return NoChecksumFoundError;
}(ErrorWithFilename);

var ChecksumValidator = function () {
  function ChecksumValidator(algorithm, checksumFilename, options) {
    _classCallCheck(this, ChecksumValidator);

    this.algorithm = algorithm;
    this.checksumFilename = checksumFilename;
    this.checksums = null;

    if (options && options.defaultTextEncoding) {
      this.defaultTextEncoding = options.defaultTextEncoding;
    } else {
      this.defaultTextEncoding = 'utf8';
    }
  }

  _createClass(ChecksumValidator, [{
    key: 'encoding',
    value: function encoding(binary) {
      return binary ? 'binary' : this.defaultTextEncoding;
    }
  }, {
    key: 'parseChecksumFile',
    value: function parseChecksumFile(data) {
      var that = this;
      return new Promise(function (resolve, reject) {
        debug('Parsing checksum file');
        that.checksums = {};
        var lineNumber = 0;
        data.trim().split(/[\r\n]+/).forEach(function (line) {
          lineNumber += 1;
          var result = CHECKSUM_LINE.exec(line);
          if (result === null) {
            debug('Could not parse line number ' + lineNumber);
            reject(new ChecksumParseError(lineNumber, line));
          } else {
            // destructuring isn't available until Node 6
            var filename = result[3];
            var isBinary = result[2] === '*';
            var checksum = result[1];

            that.checksums[filename] = [checksum, isBinary];
          }
        });
        debug('Parsed checksums:', that.checksums);
        resolve();
      });
    }
  }, {
    key: 'readFile',
    value: function readFile(filename, binary) {
      var _this5 = this;

      debug('Reading "' + filename + ' (binary mode: ' + binary + ')"');
      return new Promise(function (resolve, reject) {
        fs.readFile(filename, _this5.encoding(binary), function (err, data) {
          if (err) {
            reject(err);
          } else {
            resolve(data);
          }
        });
      });
    }
  }, {
    key: 'validate',
    value: function validate(baseDir, filesToCheck) {
      var _this6 = this;

      if (typeof filesToCheck === 'string') {
        filesToCheck = [filesToCheck];
      }

      return this.readFile(this.checksumFilename, false).then(this.parseChecksumFile.bind(this)).then(function () {
        return _this6.validateFiles(baseDir, filesToCheck);
      });
    }
  }, {
    key: 'validateFile',
    value: function validateFile(baseDir, filename) {
      var _this7 = this;

      return new Promise(function (resolve, reject) {
        debug('validateFile: ' + filename);

        var metadata = _this7.checksums[filename];
        if (!metadata) {
          return reject(new NoChecksumFoundError(filename));
        }

        // destructuring isn't available until Node 6
        var checksum = metadata[0];
        var binary = metadata[1];

        var fullPath = path.resolve(baseDir, filename);
        debug('Reading file with "' + _this7.encoding(binary) + '" encoding');
        var stream = fs.createReadStream(fullPath, { encoding: _this7.encoding(binary) });
        var hasher = crypto.createHash(_this7.algorithm, { defaultEncoding: 'binary' });
        hasher.on('readable', function () {
          var data = hasher.read();
          if (data) {
            var calculated = data.toString('hex');

            debug('Expected checksum: ' + checksum + '; Actual: ' + calculated);
            if (calculated === checksum) {
              resolve();
            } else {
              reject(new ChecksumMismatchError(filename));
            }
          }
        });
        stream.pipe(hasher);
      });
    }
  }, {
    key: 'validateFiles',
    value: function validateFiles(baseDir, filesToCheck) {
      var that = this;
      return Promise.all(filesToCheck.map(function (filename) {
        return that.validateFile(baseDir, filename);
      }));
    }
  }]);

  return ChecksumValidator;
}();

var sumchecker = function sumchecker(algorithm, checksumFilename, baseDir, filesToCheck) {
  return new ChecksumValidator(algorithm, checksumFilename).validate(baseDir, filesToCheck);
};

sumchecker.ChecksumMismatchError = ChecksumMismatchError;
sumchecker.ChecksumParseError = ChecksumParseError;
sumchecker.ChecksumValidator = ChecksumValidator;
sumchecker.NoChecksumFoundError = NoChecksumFoundError;

module.exports = sumchecker;
/*
Copyright 2016 Mark Lee

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

'use strict'

const debug = require('debug')('sumchecker')
const crypto = require('crypto')
const fs = require('fs')
const path = require('path')
const Promise = global.Promise || require('es6-promise').Promise

const CHECKSUM_LINE = /^([\da-fA-F]+) ([ *])(.+)$/

class ErrorWithFilename extends Error {
  constructor (filename) {
    super()
    this.filename = filename
  }
}

class ChecksumMismatchError extends ErrorWithFilename {
  constructor (filename) {
    super(filename)
    this.message = `Generated checksum for "${filename}" did not match expected checksum.`
  }
}

class ChecksumParseError extends Error {
  constructor (lineNumber, line) {
    super()
    this.lineNumber = lineNumber
    this.line = line
    this.message = `Could not parse checksum file at line ${lineNumber}: ${line}`
  }
}

class NoChecksumFoundError extends ErrorWithFilename {
  constructor (filename) {
    super(filename)
    this.message = `No checksum found in checksum file for "${filename}".`
  }
}

class ChecksumValidator {
  constructor (algorithm, checksumFilename, options) {
    this.algorithm = algorithm
    this.checksumFilename = checksumFilename
    this.checksums = null

    if (options && options.defaultTextEncoding) {
      this.defaultTextEncoding = options.defaultTextEncoding
    } else {
      this.defaultTextEncoding = 'utf8'
    }
  }

  encoding (binary) {
    return binary ? 'binary' : this.defaultTextEncoding
  }

  parseChecksumFile (data) {
    let that = this
    return new Promise((resolve, reject) => {
      debug('Parsing checksum file')
      that.checksums = {}
      let lineNumber = 0
      data.trim().split(/[\r\n]+/).forEach(line => {
        lineNumber += 1
        let result = CHECKSUM_LINE.exec(line)
        if (result === null) {
          debug(`Could not parse line number ${lineNumber}`)
          reject(new ChecksumParseError(lineNumber, line))
        } else {
          // destructuring isn't available until Node 6
          let filename = result[3]
          let isBinary = result[2] === '*'
          let checksum = result[1]

          that.checksums[filename] = [checksum, isBinary]
        }
      })
      debug('Parsed checksums:', that.checksums)
      resolve()
    })
  }

  readFile (filename, binary) {
    debug(`Reading "${filename} (binary mode: ${binary})"`)
    return new Promise((resolve, reject) => {
      fs.readFile(filename, this.encoding(binary), (err, data) => {
        if (err) {
          reject(err)
        } else {
          resolve(data)
        }
      })
    })
  }

  validate (baseDir, filesToCheck) {
    if (typeof filesToCheck === 'string') {
      filesToCheck = [filesToCheck]
    }

    return this.readFile(this.checksumFilename, false)
      .then(this.parseChecksumFile.bind(this))
      .then(() => {
        return this.validateFiles(baseDir, filesToCheck)
      })
  }

  validateFile (baseDir, filename) {
    return new Promise((resolve, reject) => {
      debug(`validateFile: ${filename}`)

      let metadata = this.checksums[filename]
      if (!metadata) {
        return reject(new NoChecksumFoundError(filename))
      }

      // destructuring isn't available until Node 6
      let checksum = metadata[0]
      let binary = metadata[1]

      let fullPath = path.resolve(baseDir, filename)
      debug(`Reading file with "${this.encoding(binary)}" encoding`)
      let stream = fs.createReadStream(fullPath, {encoding: this.encoding(binary)})
      let hasher = crypto.createHash(this.algorithm, {defaultEncoding: 'binary'})
      hasher.on('readable', () => {
        let data = hasher.read()
        if (data) {
          let calculated = data.toString('hex')

          debug(`Expected checksum: ${checksum}; Actual: ${calculated}`)
          if (calculated === checksum) {
            resolve()
          } else {
            reject(new ChecksumMismatchError(filename))
          }
        }
      })
      stream.pipe(hasher)
    })
  }

  validateFiles (baseDir, filesToCheck) {
    let that = this
    return Promise.all(filesToCheck.map((filename) => {
      return that.validateFile(baseDir, filename)
    }))
  }
}

let sumchecker = function sumchecker (algorithm, checksumFilename, baseDir, filesToCheck) {
  return new ChecksumValidator(algorithm, checksumFilename).validate(baseDir, filesToCheck)
}

sumchecker.ChecksumMismatchError = ChecksumMismatchError
sumchecker.ChecksumParseError = ChecksumParseError
sumchecker.ChecksumValidator = ChecksumValidator
sumchecker.NoChecksumFoundError = NoChecksumFoundError

module.exports = sumchecker
{
  "author": {
    "name": "Mark Lee"
  },
  "dependencies": {
    "debug": "^2.2.0"
  },
  "deprecated": false,
  "description": "Checksum validator",
  "devDependencies": {
    "codeclimate-test-reporter": "^0.4.0",
    "eslint": "^3.3.1",
    "eslint-config-standard": "^6.0.0-beta.3",
    "eslint-plugin-promise": "^3.3.0",
    "eslint-plugin-standard": "^2.0.0",
    "intern": "^3.3.1",
    "nyc": "^8.1.0"
  },
  "engines": {
    "node": ">= 4.0"
  },
  "homepage": "https://github.com/malept/sumchecker#readme",
  "license": "Apache-2.0",
  "main": "index.js",
  "name": "sumchecker",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/malept/sumchecker.git"
  },
  "version": "2.0.2"
}'use strict';
module.exports = {
	stdout: false,
	stderr: false
};
'use strict';
const os = require('os');
const hasFlag = require('has-flag');

const env = process.env;

let forceColor;
if (hasFlag('no-color') ||
	hasFlag('no-colors') ||
	hasFlag('color=false')) {
	forceColor = false;
} else if (hasFlag('color') ||
	hasFlag('colors') ||
	hasFlag('color=true') ||
	hasFlag('color=always')) {
	forceColor = true;
}
if ('FORCE_COLOR' in env) {
	forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0;
}

function translateLevel(level) {
	if (level === 0) {
		return false;
	}

	return {
		level,
		hasBasic: true,
		has256: level >= 2,
		has16m: level >= 3
	};
}

function supportsColor(stream) {
	if (forceColor === false) {
		return 0;
	}

	if (hasFlag('color=16m') ||
		hasFlag('color=full') ||
		hasFlag('color=truecolor')) {
		return 3;
	}

	if (hasFlag('color=256')) {
		return 2;
	}

	if (stream && !stream.isTTY && forceColor !== true) {
		return 0;
	}

	const min = forceColor ? 1 : 0;

	if (process.platform === 'win32') {
		// Node.js 7.5.0 is the first version of Node.js to include a patch to
		// libuv that enables 256 color output on Windows. Anything earlier and it
		// won't work. However, here we target Node.js 8 at minimum as it is an LTS
		// release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows
		// release that supports 256 colors. Windows 10 build 14931 is the first release
		// that supports 16m/TrueColor.
		const osRelease = os.release().split('.');
		if (
			Number(process.versions.node.split('.')[0]) >= 8 &&
			Number(osRelease[0]) >= 10 &&
			Number(osRelease[2]) >= 10586
		) {
			return Number(osRelease[2]) >= 14931 ? 3 : 2;
		}

		return 1;
	}

	if ('CI' in env) {
		if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') {
			return 1;
		}

		return min;
	}

	if ('TEAMCITY_VERSION' in env) {
		return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
	}

	if (env.COLORTERM === 'truecolor') {
		return 3;
	}

	if ('TERM_PROGRAM' in env) {
		const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);

		switch (env.TERM_PROGRAM) {
			case 'iTerm.app':
				return version >= 3 ? 3 : 2;
			case 'Apple_Terminal':
				return 2;
			// No default
		}
	}

	if (/-256(color)?$/i.test(env.TERM)) {
		return 2;
	}

	if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
		return 1;
	}

	if ('COLORTERM' in env) {
		return 1;
	}

	if (env.TERM === 'dumb') {
		return min;
	}

	return min;
}

function getSupportLevel(stream) {
	const level = supportsColor(stream);
	return translateLevel(level);
}

module.exports = {
	supportsColor: getSupportLevel,
	stdout: getSupportLevel(process.stdout),
	stderr: getSupportLevel(process.stderr)
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "browser": "browser.js",
  "dependencies": {
    "has-flag": "^3.0.0"
  },
  "deprecated": false,
  "description": "Detect whether a terminal supports color",
  "devDependencies": {
    "ava": "^0.25.0",
    "import-fresh": "^2.0.0",
    "xo": "^0.20.0"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js",
    "browser.js"
  ],
  "homepage": "https://github.com/chalk/supports-color#readme",
  "license": "MIT",
  "name": "supports-color",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/supports-color.git"
  },
  "version": "5.5.0"
}{
  "author": {
    "name": "Vladimir Krivosheev"
  },
  "dependencies": {
    "async-exit-hook": "^2.0.1",
    "fs-extra": "^8.1.0"
  },
  "deprecated": false,
  "description": "```typescript export function getTempName(prefix?: string | null | undefined): string;",
  "devDependencies": {
    "@types/fs-extra": "^8.1.0",
    "@types/js-yaml": "^3.12.2",
    "@types/node": "^13.7.7",
    "babel-preset-ts-node8": "^4.0.0",
    "ts-babel": "^6.1.7",
    "typescript": "^3.8.3"
  },
  "files": [
    "out"
  ],
  "homepage": "https://github.com/develar/temp-file",
  "license": "MIT",
  "main": "out/main.js",
  "name": "temp-file",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/develar/temp-file.git"
  },
  "typings": "./out/main.d.ts",
  "version": "3.3.7"
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getTempName = getTempName;
exports.TmpDir = void 0;

function _fsExtra() {
  const data = require("fs-extra");

  _fsExtra = function () {
    return data;
  };

  return data;
}

function _os() {
  const data = require("os");

  _os = function () {
    return data;
  };

  return data;
}

var path = _interopRequireWildcard(require("path"));

function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

let tmpFileCounter = 0;
const tmpDirManagers = new Set(); // add date to avoid use stale temp dir

const tempDirPrefix = `${process.pid.toString(36)}-${Date.now().toString(36)}`;

function getTempName(prefix) {
  return `${prefix == null ? "" : `${prefix}-`}${tempDirPrefix}-${(tmpFileCounter++).toString(36)}`;
}

let tempDirPromise;
let tempBaseDir;

function getBaseTempDir() {
  if (tempDirPromise != null) {
    return tempDirPromise;
  }

  if (tempBaseDir != null) {
    return Promise.resolve(tempBaseDir);
  }

  const systemTmpDir = process.env.APP_BUILDER_TMP_DIR || (0, _os().tmpdir)();
  const isEnsureRemovedOnExit = process.env.TMP_DIR_MANAGER_ENSURE_REMOVED_ON_EXIT !== "false";
  tempDirPromise = (0, _fsExtra().mkdtemp)(path.join(systemTmpDir, "t-")).then(it => (0, _fsExtra().realpath)(it)).then(dir => {
    if (isEnsureRemovedOnExit) {
      addExitHook(dir);
    }

    tempBaseDir = dir;
    return dir;
  });
  return tempDirPromise;
}

function addExitHook(dir) {
  require("async-exit-hook")(callback => {
    const managers = Array.from(tmpDirManagers);
    tmpDirManagers.clear();

    if (callback == null) {
      for (const manager of managers) {
        manager.cleanupSync();
      }

      try {
        (0, _fsExtra().removeSync)(dir);
      } catch (e) {
        handleError(e, dir);
      }

      return;
    }

    Promise.all(managers.map(it => it.cleanup())).then(() => (0, _fsExtra().remove)(dir)).then(() => callback()).catch(e => {
      try {
        handleError(e, dir);
      } finally {
        callback();
      }
    });
  });
}

function handleError(e, file) {
  if (e.code !== "EPERM" && e.code !== "ENOENT") {
    // use only console.* instead of our warn on exit (otherwise nodeEmoji can be required on request)
    console.warn(`Cannot delete temporary "${file}": ${(e.stack || e).toString()}`);
  }
}

class TmpDir {
  constructor(debugName = "") {
    this.debugName = debugName;
    this.tempFiles = [];
    this.registered = false;
  } // noinspection JSMethodCanBeStatic,JSUnusedGlobalSymbols


  get rootTempDir() {
    return getBaseTempDir();
  }

  getTempDir(options) {
    return this.getTempFile(options, true);
  }

  createTempDir(options) {
    return this.getTempFile(options, true).then(it => (0, _fsExtra().ensureDir)(it).then(() => it));
  }

  getTempFile(options, isDir = false) {
    return getBaseTempDir().then(baseTempDir => {
      if (!this.registered) {
        this.registered = true;
        tmpDirManagers.add(this);
      }

      const prefix = nullize(options == null ? null : options.prefix);
      const suffix = nullize(options == null ? null : options.suffix);
      const namePrefix = prefix == null ? "" : `${prefix}-`;
      const nameSuffix = suffix == null ? "" : suffix.startsWith(".") ? suffix : `-${suffix}`;
      const result = `${baseTempDir}${path.sep}${namePrefix}${(tmpFileCounter++).toString(36)}${nameSuffix}`;
      this.tempFiles.push({
        path: result,
        isDir,
        disposer: options == null ? null : options.disposer
      });
      return result;
    });
  }

  cleanupSync() {
    const tempFiles = this.tempFiles;
    tmpDirManagers.delete(this);
    this.registered = false;

    if (tempFiles.length === 0) {
      return;
    }

    this.tempFiles = [];

    for (const file of tempFiles) {
      if (file.disposer != null) {
        // noinspection JSIgnoredPromiseFromCall
        file.disposer(file.path);
        continue;
      }

      try {
        if (file.isDir) {
          (0, _fsExtra().removeSync)(file.path);
        } else {
          (0, _fsExtra().unlinkSync)(file.path);
        }
      } catch (e) {
        handleError(e, file.path);
      }
    }
  }

  cleanup() {
    const tempFiles = this.tempFiles;
    tmpDirManagers.delete(this);
    this.registered = false;

    if (tempFiles.length === 0) {
      return Promise.resolve();
    }

    this.tempFiles = [];

    if (tmpDirManagers.size === 0) {
      const dir = tempBaseDir;

      if (dir == null) {
        return Promise.resolve();
      }

      tempBaseDir = null;
      tempDirPromise = null;
      return (0, _fsExtra().remove)(dir);
    }

    return Promise.all(tempFiles.map(it => {
      if (it.disposer != null) {
        return it.disposer(it.path);
      }

      return (it.isDir ? (0, _fsExtra().remove)(it.path) : (0, _fsExtra().unlink)(it.path)).catch(e => {
        handleError(e, it.path);
      });
    }));
  }

  toString() {
    return this.debugName;
  }

}

exports.TmpDir = TmpDir;

function nullize(s) {
  return s == null || s.length === 0 ? null : s;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=main.js.map{"version":3,"sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["import {ensureDir, mkdtemp, realpath, remove, removeSync, unlink, unlinkSync} from \"fs-extra\"\nimport {tmpdir} from \"os\"\nimport * as path from \"path\"\n\nlet tmpFileCounter = 0\nconst tmpDirManagers = new Set<TmpDir>()\n\n// add date to avoid use stale temp dir\nconst tempDirPrefix = `${process.pid.toString(36)}-${Date.now().toString(36)}`\n\nexport function getTempName(prefix?: string | null | undefined): string {\n  return `${prefix == null ? \"\" : `${prefix}-`}${tempDirPrefix}-${(tmpFileCounter++).toString(36)}`\n}\n\nlet tempDirPromise: Promise<string> | null\nlet tempBaseDir: string | null\n\nfunction getBaseTempDir(): Promise<string> {\n  if (tempDirPromise != null) {\n    return tempDirPromise\n  }\n\n  if (tempBaseDir != null) {\n    return Promise.resolve(tempBaseDir)\n  }\n\n  const systemTmpDir = process.env.APP_BUILDER_TMP_DIR || tmpdir()\n  const isEnsureRemovedOnExit = process.env.TMP_DIR_MANAGER_ENSURE_REMOVED_ON_EXIT !== \"false\"\n  tempDirPromise = mkdtemp(path.join(systemTmpDir, \"t-\"))\n    .then(it => realpath(it))\n    .then(dir => {\n      if (isEnsureRemovedOnExit) {\n        addExitHook(dir)\n      }\n      tempBaseDir = dir\n      return dir\n    })\n  return tempDirPromise\n}\n\nfunction addExitHook(dir: string) {\n  require(\"async-exit-hook\")((callback: (() => void) | null) => {\n    const managers = Array.from(tmpDirManagers)\n    tmpDirManagers.clear()\n\n    if (callback == null) {\n      for (const manager of managers) {\n        manager.cleanupSync()\n      }\n\n      try {\n        removeSync(dir)\n      }\n      catch (e) {\n        handleError(e, dir)\n      }\n      return\n    }\n\n    Promise.all(managers.map(it => it.cleanup()))\n      .then(() => remove(dir))\n      .then(() => callback())\n      .catch(e => {\n        try {\n          handleError(e, dir)\n        }\n        finally {\n          callback()\n        }\n      })\n  })\n}\n\nfunction handleError(e: any, file: string) {\n  if (e.code !== \"EPERM\" && e.code !== \"ENOENT\") {\n    // use only console.* instead of our warn on exit (otherwise nodeEmoji can be required on request)\n    console.warn(`Cannot delete temporary \"${file}\": ${(e.stack || e).toString()}`)\n  }\n}\n\ninterface TempFileInfo {\n  isDir: boolean\n  path: string\n  disposer?: ((file: string) => Promise<void>) | null\n}\n\nexport interface GetTempFileOptions {\n  prefix?: string | null\n  suffix?: string | null\n\n  disposer?: ((file: string) => Promise<void>) | null\n}\n\nexport class TmpDir {\n  private tempFiles: Array<TempFileInfo> = []\n  private registered = false\n\n  constructor(private readonly debugName: string = \"\") {\n  }\n\n  // noinspection JSMethodCanBeStatic,JSUnusedGlobalSymbols\n  get rootTempDir(): Promise<string> {\n    return getBaseTempDir()\n  }\n\n  getTempDir(options?: GetTempFileOptions): Promise<string> {\n    return this.getTempFile(options, true)\n  }\n\n  createTempDir(options?: GetTempFileOptions): Promise<string> {\n    return this.getTempFile(options, true)\n      .then(it => ensureDir(it).then(() => it))\n  }\n\n  getTempFile(options?: GetTempFileOptions, isDir = false): Promise<string> {\n    return getBaseTempDir()\n      .then(baseTempDir => {\n        if (!this.registered) {\n          this.registered = true\n          tmpDirManagers.add(this)\n        }\n\n        const prefix = nullize(options == null ? null : options.prefix)\n        const suffix = nullize(options == null ? null : options.suffix)\n        const namePrefix = prefix == null ? \"\" : `${prefix}-`\n        const nameSuffix = suffix == null ? \"\" : (suffix.startsWith(\".\") ? suffix : `-${suffix}`)\n        const result = `${baseTempDir}${path.sep}${namePrefix}${(tmpFileCounter++).toString(36)}${nameSuffix}`\n        this.tempFiles.push({\n          path: result,\n          isDir,\n          disposer: options == null ? null : options.disposer,\n        })\n        return result\n      })\n  }\n\n  cleanupSync() {\n    const tempFiles = this.tempFiles\n    tmpDirManagers.delete(this)\n    this.registered = false\n    if (tempFiles.length === 0) {\n      return\n    }\n\n    this.tempFiles = []\n\n    for (const file of tempFiles) {\n      if (file.disposer != null) {\n        // noinspection JSIgnoredPromiseFromCall\n        file.disposer(file.path)\n        continue\n      }\n\n      try {\n        if (file.isDir) {\n          removeSync(file.path)\n        }\n        else {\n          unlinkSync(file.path)\n        }\n      }\n      catch (e) {\n        handleError(e, file.path)\n      }\n    }\n  }\n\n  cleanup(): Promise<any> {\n    const tempFiles = this.tempFiles\n    tmpDirManagers.delete(this)\n\n    this.registered = false\n    if (tempFiles.length === 0) {\n      return Promise.resolve()\n    }\n    this.tempFiles = []\n\n    if (tmpDirManagers.size === 0) {\n      const dir = tempBaseDir\n      if (dir == null) {\n        return Promise.resolve()\n      }\n\n      tempBaseDir = null\n      tempDirPromise = null\n      return remove(dir)\n    }\n\n    return Promise.all(tempFiles.map(it => {\n      if (it.disposer != null) {\n        return it.disposer(it.path)\n      }\n\n      return (it.isDir ? remove(it.path) : unlink(it.path))\n        .catch(e => {\n          handleError(e, it.path)\n        })\n    }))\n  }\n\n  toString() {\n    return this.debugName\n  }\n}\n\nfunction nullize(s?: string | null) {\n  return s == null || s.length === 0 ? null : s\n}"],"sourceRoot":""}

0.0.2 / 2013-03-26
==================

 - Cache the return value
 - Don't use `setTimeout()`

0.0.1 / 2013-03-26
==================

 - Initial release

build: components index.js
	@component build --dev

components: component.json
	@component install --dev

clean:
	rm -fr build components template.js

.PHONY: clean

# throttle

  Throttle a function

## Installation

    $ component install component/throttle

## API

   

## License

  MIT
{
  "name": "throttle",
  "repo": "component/throttle",
  "description": "Throttle a function",
  "version": "0.0.2",
  "keywords": [],
  "dependencies": {},
  "development": {},
  "license": "MIT",
  "scripts": [
    "index.js"
  ]
}

var throttle = require('./');

function onprogress(n) {
  console.log('progress %s%', n);
}

onprogress = throttle(onprogress, 500);

var n = 0;
setInterval(function(){
  if (n >= 100) return;
  onprogress(n++);
}, 50);

/**
 * Module exports.
 */

module.exports = throttle;

/**
 * Returns a new function that, when invoked, invokes `func` at most one time per
 * `wait` milliseconds.
 *
 * @param {Function} func The `Function` instance to wrap.
 * @param {Number} wait The minimum number of milliseconds that must elapse in between `func` invokations.
 * @return {Function} A new function that wraps the `func` function passed in.
 * @api public
 */

function throttle (func, wait) {
  var rtn; // return value
  var last = 0; // last invokation timestamp
  return function throttled () {
    var now = new Date().getTime();
    var delta = now - last;
    if (delta >= wait) {
      rtn = func.apply(this, arguments);
      last = now;
    }
    return rtn;
  };
}
{
  "component": {
    "scripts": {
      "throttle/index.js": "index.js"
    }
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Throttle a function",
  "development": {},
  "homepage": "https://github.com/component/throttle#readme",
  "license": "MIT",
  "name": "throttleit",
  "repository": {
    "type": "git",
    "url": "git://github.com/component/throttle.git"
  },
  "version": "0.0.2"
}Copyright 2013, Rod Vagg (the "Original Author")
All rights reserved.

MIT +no-false-attribs License

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

Distributions of all or part of the Software intended to be used
by the recipients as they would use the unmodified Software,
containing modifications that substantially alter, remove, or
disable functionality of the Software, outside of the documented
configuration mechanisms provided by the Software, shall be
modified such that the Original Author's bug reporting email
addresses and urls are either replaced with the contact information
of the parties responsible for the changes, or removed entirely.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.


Except where noted, this license applies to any and all software
programs and associated documentation files created by the
Original Author, when distributed with the Software.{
  "author": {
    "name": "Rod Vagg",
    "email": "r@va.gg",
    "url": "https://github.com/rvagg"
  },
  "dependencies": {
    "readable-stream": "~1.1.9",
    "xtend": "~2.1.1"
  },
  "deprecated": false,
  "description": "A tiny wrapper around Node streams2 Transform to avoid explicit subclassing noise",
  "devDependencies": {
    "bl": "~0.4.1",
    "stream-spigot": "~2.1.2",
    "tape": "~1.1.1"
  },
  "homepage": "https://github.com/rvagg/through2#readme",
  "license": "MIT",
  "main": "through2.js",
  "name": "through2",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/rvagg/through2.git"
  },
  "version": "0.2.3"
}const Transform = require('stream').Transform || require('readable-stream/transform')
    , inherits  = require('util').inherits
    , xtend     = require('xtend')

function noop (chunk, enc, callback) {
  callback(null, chunk)
}

function ctor (options, transform, flush) {
  if (typeof options == 'function') {
    flush     = transform
    transform = options
    options   = {}
  }

  if (typeof transform != 'function')
    transform = noop

  function Through2 (override) {
    if (!(this instanceof Through2))
      return new Through2(override)

    this.options = xtend(options, override)
    Transform.call(this, this.options)
  }

  inherits(Through2, Transform)

  Through2.prototype._transform = transform

  if (typeof flush == 'function')
    Through2.prototype._flush = flush

  return Through2
}

function make (options, transform, flush) {
  return ctor(options, transform, flush)()
}

module.exports      = make
module.exports.ctor = ctor'use strict';
const {Readable} = require('stream');

module.exports = input => (
	new Readable({
		read() {
			this.push(input);
			this.push(null);
		}
	})
);
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Convert a string/Buffer/Uint8Array to a readable stream",
  "devDependencies": {
    "ava": "*",
    "get-stream": "^3.0.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/to-readable-stream#readme",
  "license": "MIT",
  "name": "to-readable-stream",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/to-readable-stream.git"
  },
  "version": "1.0.0"
}Copyright (c) 2015, Salesforce.com, Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. Neither the name of Salesforce.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
  "author": {
    "name": "Jeremy Stashewsky",
    "email": "jstash@gmail.com"
  },
  "dependencies": {
    "psl": "^1.1.28",
    "punycode": "^2.1.1"
  },
  "deprecated": false,
  "description": "RFC6265 Cookies and Cookie Jar for node.js",
  "devDependencies": {
    "async": "^1.4.2",
    "genversion": "^2.1.0",
    "nyc": "^11.6.0",
    "string.prototype.repeat": "^0.2.0",
    "vows": "^0.8.2"
  },
  "engines": {
    "node": ">=0.8"
  },
  "files": [
    "lib"
  ],
  "homepage": "https://github.com/salesforce/tough-cookie",
  "license": "BSD-3-Clause",
  "main": "./lib/cookie",
  "name": "tough-cookie",
  "repository": {
    "type": "git",
    "url": "git://github.com/salesforce/tough-cookie.git"
  },
  "version": "2.5.0"
}/*!
 * Copyright (c) 2015, Salesforce.com, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * 3. Neither the name of Salesforce.com nor the names of its contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
'use strict';
var net = require('net');
var urlParse = require('url').parse;
var util = require('util');
var pubsuffix = require('./pubsuffix-psl');
var Store = require('./store').Store;
var MemoryCookieStore = require('./memstore').MemoryCookieStore;
var pathMatch = require('./pathMatch').pathMatch;
var VERSION = require('./version');

var punycode;
try {
  punycode = require('punycode');
} catch(e) {
  console.warn("tough-cookie: can't load punycode; won't use punycode for domain normalization");
}

// From RFC6265 S4.1.1
// note that it excludes \x3B ";"
var COOKIE_OCTETS = /^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]+$/;

var CONTROL_CHARS = /[\x00-\x1F]/;

// From Chromium // '\r', '\n' and '\0' should be treated as a terminator in
// the "relaxed" mode, see:
// https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L60
var TERMINATORS = ['\n', '\r', '\0'];

// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or ";"'
// Note ';' is \x3B
var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/;

// date-time parsing constants (RFC6265 S5.1.1)

var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/;

var MONTH_TO_NUM = {
  jan:0, feb:1, mar:2, apr:3, may:4, jun:5,
  jul:6, aug:7, sep:8, oct:9, nov:10, dec:11
};
var NUM_TO_MONTH = [
  'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'
];
var NUM_TO_DAY = [
  'Sun','Mon','Tue','Wed','Thu','Fri','Sat'
];

var MAX_TIME = 2147483647000; // 31-bit max
var MIN_TIME = 0; // 31-bit min

/*
 * Parses a Natural number (i.e., non-negative integer) with either the
 *    <min>*<max>DIGIT ( non-digit *OCTET )
 * or
 *    <min>*<max>DIGIT
 * grammar (RFC6265 S5.1.1).
 *
 * The "trailingOK" boolean controls if the grammar accepts a
 * "( non-digit *OCTET )" trailer.
 */
function parseDigits(token, minDigits, maxDigits, trailingOK) {
  var count = 0;
  while (count < token.length) {
    var c = token.charCodeAt(count);
    // "non-digit = %x00-2F / %x3A-FF"
    if (c <= 0x2F || c >= 0x3A) {
      break;
    }
    count++;
  }

  // constrain to a minimum and maximum number of digits.
  if (count < minDigits || count > maxDigits) {
    return null;
  }

  if (!trailingOK && count != token.length) {
    return null;
  }

  return parseInt(token.substr(0,count), 10);
}

function parseTime(token) {
  var parts = token.split(':');
  var result = [0,0,0];

  /* RF6256 S5.1.1:
   *      time            = hms-time ( non-digit *OCTET )
   *      hms-time        = time-field ":" time-field ":" time-field
   *      time-field      = 1*2DIGIT
   */

  if (parts.length !== 3) {
    return null;
  }

  for (var i = 0; i < 3; i++) {
    // "time-field" must be strictly "1*2DIGIT", HOWEVER, "hms-time" can be
    // followed by "( non-digit *OCTET )" so therefore the last time-field can
    // have a trailer
    var trailingOK = (i == 2);
    var num = parseDigits(parts[i], 1, 2, trailingOK);
    if (num === null) {
      return null;
    }
    result[i] = num;
  }

  return result;
}

function parseMonth(token) {
  token = String(token).substr(0,3).toLowerCase();
  var num = MONTH_TO_NUM[token];
  return num >= 0 ? num : null;
}

/*
 * RFC6265 S5.1.1 date parser (see RFC for full grammar)
 */
function parseDate(str) {
  if (!str) {
    return;
  }

  /* RFC6265 S5.1.1:
   * 2. Process each date-token sequentially in the order the date-tokens
   * appear in the cookie-date
   */
  var tokens = str.split(DATE_DELIM);
  if (!tokens) {
    return;
  }

  var hour = null;
  var minute = null;
  var second = null;
  var dayOfMonth = null;
  var month = null;
  var year = null;

  for (var i=0; i<tokens.length; i++) {
    var token = tokens[i].trim();
    if (!token.length) {
      continue;
    }

    var result;

    /* 2.1. If the found-time flag is not set and the token matches the time
     * production, set the found-time flag and set the hour- value,
     * minute-value, and second-value to the numbers denoted by the digits in
     * the date-token, respectively.  Skip the remaining sub-steps and continue
     * to the next date-token.
     */
    if (second === null) {
      result = parseTime(token);
      if (result) {
        hour = result[0];
        minute = result[1];
        second = result[2];
        continue;
      }
    }

    /* 2.2. If the found-day-of-month flag is not set and the date-token matches
     * the day-of-month production, set the found-day-of- month flag and set
     * the day-of-month-value to the number denoted by the date-token.  Skip
     * the remaining sub-steps and continue to the next date-token.
     */
    if (dayOfMonth === null) {
      // "day-of-month = 1*2DIGIT ( non-digit *OCTET )"
      result = parseDigits(token, 1, 2, true);
      if (result !== null) {
        dayOfMonth = result;
        continue;
      }
    }

    /* 2.3. If the found-month flag is not set and the date-token matches the
     * month production, set the found-month flag and set the month-value to
     * the month denoted by the date-token.  Skip the remaining sub-steps and
     * continue to the next date-token.
     */
    if (month === null) {
      result = parseMonth(token);
      if (result !== null) {
        month = result;
        continue;
      }
    }

    /* 2.4. If the found-year flag is not set and the date-token matches the
     * year production, set the found-year flag and set the year-value to the
     * number denoted by the date-token.  Skip the remaining sub-steps and
     * continue to the next date-token.
     */
    if (year === null) {
      // "year = 2*4DIGIT ( non-digit *OCTET )"
      result = parseDigits(token, 2, 4, true);
      if (result !== null) {
        year = result;
        /* From S5.1.1:
         * 3.  If the year-value is greater than or equal to 70 and less
         * than or equal to 99, increment the year-value by 1900.
         * 4.  If the year-value is greater than or equal to 0 and less
         * than or equal to 69, increment the year-value by 2000.
         */
        if (year >= 70 && year <= 99) {
          year += 1900;
        } else if (year >= 0 && year <= 69) {
          year += 2000;
        }
      }
    }
  }

  /* RFC 6265 S5.1.1
   * "5. Abort these steps and fail to parse the cookie-date if:
   *     *  at least one of the found-day-of-month, found-month, found-
   *        year, or found-time flags is not set,
   *     *  the day-of-month-value is less than 1 or greater than 31,
   *     *  the year-value is less than 1601,
   *     *  the hour-value is greater than 23,
   *     *  the minute-value is greater than 59, or
   *     *  the second-value is greater than 59.
   *     (Note that leap seconds cannot be represented in this syntax.)"
   *
   * So, in order as above:
   */
  if (
    dayOfMonth === null || month === null || year === null || second === null ||
    dayOfMonth < 1 || dayOfMonth > 31 ||
    year < 1601 ||
    hour > 23 ||
    minute > 59 ||
    second > 59
  ) {
    return;
  }

  return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second));
}

function formatDate(date) {
  var d = date.getUTCDate(); d = d >= 10 ? d : '0'+d;
  var h = date.getUTCHours(); h = h >= 10 ? h : '0'+h;
  var m = date.getUTCMinutes(); m = m >= 10 ? m : '0'+m;
  var s = date.getUTCSeconds(); s = s >= 10 ? s : '0'+s;
  return NUM_TO_DAY[date.getUTCDay()] + ', ' +
    d+' '+ NUM_TO_MONTH[date.getUTCMonth()] +' '+ date.getUTCFullYear() +' '+
    h+':'+m+':'+s+' GMT';
}

// S5.1.2 Canonicalized Host Names
function canonicalDomain(str) {
  if (str == null) {
    return null;
  }
  str = str.trim().replace(/^\./,''); // S4.1.2.3 & S5.2.3: ignore leading .

  // convert to IDN if any non-ASCII characters
  if (punycode && /[^\u0001-\u007f]/.test(str)) {
    str = punycode.toASCII(str);
  }

  return str.toLowerCase();
}

// S5.1.3 Domain Matching
function domainMatch(str, domStr, canonicalize) {
  if (str == null || domStr == null) {
    return null;
  }
  if (canonicalize !== false) {
    str = canonicalDomain(str);
    domStr = canonicalDomain(domStr);
  }

  /*
   * "The domain string and the string are identical. (Note that both the
   * domain string and the string will have been canonicalized to lower case at
   * this point)"
   */
  if (str == domStr) {
    return true;
  }

  /* "All of the following [three] conditions hold:" (order adjusted from the RFC) */

  /* "* The string is a host name (i.e., not an IP address)." */
  if (net.isIP(str)) {
    return false;
  }

  /* "* The domain string is a suffix of the string" */
  var idx = str.indexOf(domStr);
  if (idx <= 0) {
    return false; // it's a non-match (-1) or prefix (0)
  }

  // e.g "a.b.c".indexOf("b.c") === 2
  // 5 === 3+2
  if (str.length !== domStr.length + idx) { // it's not a suffix
    return false;
  }

  /* "* The last character of the string that is not included in the domain
  * string is a %x2E (".") character." */
  if (str.substr(idx-1,1) !== '.') {
    return false;
  }

  return true;
}


// RFC6265 S5.1.4 Paths and Path-Match

/*
 * "The user agent MUST use an algorithm equivalent to the following algorithm
 * to compute the default-path of a cookie:"
 *
 * Assumption: the path (and not query part or absolute uri) is passed in.
 */
function defaultPath(path) {
  // "2. If the uri-path is empty or if the first character of the uri-path is not
  // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps.
  if (!path || path.substr(0,1) !== "/") {
    return "/";
  }

  // "3. If the uri-path contains no more than one %x2F ("/") character, output
  // %x2F ("/") and skip the remaining step."
  if (path === "/") {
    return path;
  }

  var rightSlash = path.lastIndexOf("/");
  if (rightSlash === 0) {
    return "/";
  }

  // "4. Output the characters of the uri-path from the first character up to,
  // but not including, the right-most %x2F ("/")."
  return path.slice(0, rightSlash);
}

function trimTerminator(str) {
  for (var t = 0; t < TERMINATORS.length; t++) {
    var terminatorIdx = str.indexOf(TERMINATORS[t]);
    if (terminatorIdx !== -1) {
      str = str.substr(0,terminatorIdx);
    }
  }

  return str;
}

function parseCookiePair(cookiePair, looseMode) {
  cookiePair = trimTerminator(cookiePair);

  var firstEq = cookiePair.indexOf('=');
  if (looseMode) {
    if (firstEq === 0) { // '=' is immediately at start
      cookiePair = cookiePair.substr(1);
      firstEq = cookiePair.indexOf('='); // might still need to split on '='
    }
  } else { // non-loose mode
    if (firstEq <= 0) { // no '=' or is at start
      return; // needs to have non-empty "cookie-name"
    }
  }

  var cookieName, cookieValue;
  if (firstEq <= 0) {
    cookieName = "";
    cookieValue = cookiePair.trim();
  } else {
    cookieName = cookiePair.substr(0, firstEq).trim();
    cookieValue = cookiePair.substr(firstEq+1).trim();
  }

  if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) {
    return;
  }

  var c = new Cookie();
  c.key = cookieName;
  c.value = cookieValue;
  return c;
}

function parse(str, options) {
  if (!options || typeof options !== 'object') {
    options = {};
  }
  str = str.trim();

  // We use a regex to parse the "name-value-pair" part of S5.2
  var firstSemi = str.indexOf(';'); // S5.2 step 1
  var cookiePair = (firstSemi === -1) ? str : str.substr(0, firstSemi);
  var c = parseCookiePair(cookiePair, !!options.loose);
  if (!c) {
    return;
  }

  if (firstSemi === -1) {
    return c;
  }

  // S5.2.3 "unparsed-attributes consist of the remainder of the set-cookie-string
  // (including the %x3B (";") in question)." plus later on in the same section
  // "discard the first ";" and trim".
  var unparsed = str.slice(firstSemi + 1).trim();

  // "If the unparsed-attributes string is empty, skip the rest of these
  // steps."
  if (unparsed.length === 0) {
    return c;
  }

  /*
   * S5.2 says that when looping over the items "[p]rocess the attribute-name
   * and attribute-value according to the requirements in the following
   * subsections" for every item.  Plus, for many of the individual attributes
   * in S5.3 it says to use the "attribute-value of the last attribute in the
   * cookie-attribute-list".  Therefore, in this implementation, we overwrite
   * the previous value.
   */
  var cookie_avs = unparsed.split(';');
  while (cookie_avs.length) {
    var av = cookie_avs.shift().trim();
    if (av.length === 0) { // happens if ";;" appears
      continue;
    }
    var av_sep = av.indexOf('=');
    var av_key, av_value;

    if (av_sep === -1) {
      av_key = av;
      av_value = null;
    } else {
      av_key = av.substr(0,av_sep);
      av_value = av.substr(av_sep+1);
    }

    av_key = av_key.trim().toLowerCase();

    if (av_value) {
      av_value = av_value.trim();
    }

    switch(av_key) {
    case 'expires': // S5.2.1
      if (av_value) {
        var exp = parseDate(av_value);
        // "If the attribute-value failed to parse as a cookie date, ignore the
        // cookie-av."
        if (exp) {
          // over and underflow not realistically a concern: V8's getTime() seems to
          // store something larger than a 32-bit time_t (even with 32-bit node)
          c.expires = exp;
        }
      }
      break;

    case 'max-age': // S5.2.2
      if (av_value) {
        // "If the first character of the attribute-value is not a DIGIT or a "-"
        // character ...[or]... If the remainder of attribute-value contains a
        // non-DIGIT character, ignore the cookie-av."
        if (/^-?[0-9]+$/.test(av_value)) {
          var delta = parseInt(av_value, 10);
          // "If delta-seconds is less than or equal to zero (0), let expiry-time
          // be the earliest representable date and time."
          c.setMaxAge(delta);
        }
      }
      break;

    case 'domain': // S5.2.3
      // "If the attribute-value is empty, the behavior is undefined.  However,
      // the user agent SHOULD ignore the cookie-av entirely."
      if (av_value) {
        // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E
        // (".") character."
        var domain = av_value.trim().replace(/^\./, '');
        if (domain) {
          // "Convert the cookie-domain to lower case."
          c.domain = domain.toLowerCase();
        }
      }
      break;

    case 'path': // S5.2.4
      /*
       * "If the attribute-value is empty or if the first character of the
       * attribute-value is not %x2F ("/"):
       *   Let cookie-path be the default-path.
       * Otherwise:
       *   Let cookie-path be the attribute-value."
       *
       * We'll represent the default-path as null since it depends on the
       * context of the parsing.
       */
      c.path = av_value && av_value[0] === "/" ? av_value : null;
      break;

    case 'secure': // S5.2.5
      /*
       * "If the attribute-name case-insensitively matches the string "Secure",
       * the user agent MUST append an attribute to the cookie-attribute-list
       * with an attribute-name of Secure and an empty attribute-value."
       */
      c.secure = true;
      break;

    case 'httponly': // S5.2.6 -- effectively the same as 'secure'
      c.httpOnly = true;
      break;

    default:
      c.extensions = c.extensions || [];
      c.extensions.push(av);
      break;
    }
  }

  return c;
}

// avoid the V8 deoptimization monster!
function jsonParse(str) {
  var obj;
  try {
    obj = JSON.parse(str);
  } catch (e) {
    return e;
  }
  return obj;
}

function fromJSON(str) {
  if (!str) {
    return null;
  }

  var obj;
  if (typeof str === 'string') {
    obj = jsonParse(str);
    if (obj instanceof Error) {
      return null;
    }
  } else {
    // assume it's an Object
    obj = str;
  }

  var c = new Cookie();
  for (var i=0; i<Cookie.serializableProperties.length; i++) {
    var prop = Cookie.serializableProperties[i];
    if (obj[prop] === undefined ||
        obj[prop] === Cookie.prototype[prop])
    {
      continue; // leave as prototype default
    }

    if (prop === 'expires' ||
        prop === 'creation' ||
        prop === 'lastAccessed')
    {
      if (obj[prop] === null) {
        c[prop] = null;
      } else {
        c[prop] = obj[prop] == "Infinity" ?
          "Infinity" : new Date(obj[prop]);
      }
    } else {
      c[prop] = obj[prop];
    }
  }

  return c;
}

/* Section 5.4 part 2:
 * "*  Cookies with longer paths are listed before cookies with
 *     shorter paths.
 *
 *  *  Among cookies that have equal-length path fields, cookies with
 *     earlier creation-times are listed before cookies with later
 *     creation-times."
 */

function cookieCompare(a,b) {
  var cmp = 0;

  // descending for length: b CMP a
  var aPathLen = a.path ? a.path.length : 0;
  var bPathLen = b.path ? b.path.length : 0;
  cmp = bPathLen - aPathLen;
  if (cmp !== 0) {
    return cmp;
  }

  // ascending for time: a CMP b
  var aTime = a.creation ? a.creation.getTime() : MAX_TIME;
  var bTime = b.creation ? b.creation.getTime() : MAX_TIME;
  cmp = aTime - bTime;
  if (cmp !== 0) {
    return cmp;
  }

  // break ties for the same millisecond (precision of JavaScript's clock)
  cmp = a.creationIndex - b.creationIndex;

  return cmp;
}

// Gives the permutation of all possible pathMatch()es of a given path. The
// array is in longest-to-shortest order.  Handy for indexing.
function permutePath(path) {
  if (path === '/') {
    return ['/'];
  }
  if (path.lastIndexOf('/') === path.length-1) {
    path = path.substr(0,path.length-1);
  }
  var permutations = [path];
  while (path.length > 1) {
    var lindex = path.lastIndexOf('/');
    if (lindex === 0) {
      break;
    }
    path = path.substr(0,lindex);
    permutations.push(path);
  }
  permutations.push('/');
  return permutations;
}

function getCookieContext(url) {
  if (url instanceof Object) {
    return url;
  }
  // NOTE: decodeURI will throw on malformed URIs (see GH-32).
  // Therefore, we will just skip decoding for such URIs.
  try {
    url = decodeURI(url);
  }
  catch(err) {
    // Silently swallow error
  }

  return urlParse(url);
}

function Cookie(options) {
  options = options || {};

  Object.keys(options).forEach(function(prop) {
    if (Cookie.prototype.hasOwnProperty(prop) &&
        Cookie.prototype[prop] !== options[prop] &&
        prop.substr(0,1) !== '_')
    {
      this[prop] = options[prop];
    }
  }, this);

  this.creation = this.creation || new Date();

  // used to break creation ties in cookieCompare():
  Object.defineProperty(this, 'creationIndex', {
    configurable: false,
    enumerable: false, // important for assert.deepEqual checks
    writable: true,
    value: ++Cookie.cookiesCreated
  });
}

Cookie.cookiesCreated = 0; // incremented each time a cookie is created

Cookie.parse = parse;
Cookie.fromJSON = fromJSON;

Cookie.prototype.key = "";
Cookie.prototype.value = "";

// the order in which the RFC has them:
Cookie.prototype.expires = "Infinity"; // coerces to literal Infinity
Cookie.prototype.maxAge = null; // takes precedence over expires for TTL
Cookie.prototype.domain = null;
Cookie.prototype.path = null;
Cookie.prototype.secure = false;
Cookie.prototype.httpOnly = false;
Cookie.prototype.extensions = null;

// set by the CookieJar:
Cookie.prototype.hostOnly = null; // boolean when set
Cookie.prototype.pathIsDefault = null; // boolean when set
Cookie.prototype.creation = null; // Date when set; defaulted by Cookie.parse
Cookie.prototype.lastAccessed = null; // Date when set
Object.defineProperty(Cookie.prototype, 'creationIndex', {
  configurable: true,
  enumerable: false,
  writable: true,
  value: 0
});

Cookie.serializableProperties = Object.keys(Cookie.prototype)
  .filter(function(prop) {
    return !(
      Cookie.prototype[prop] instanceof Function ||
      prop === 'creationIndex' ||
      prop.substr(0,1) === '_'
    );
  });

Cookie.prototype.inspect = function inspect() {
  var now = Date.now();
  return 'Cookie="'+this.toString() +
    '; hostOnly='+(this.hostOnly != null ? this.hostOnly : '?') +
    '; aAge='+(this.lastAccessed ? (now-this.lastAccessed.getTime())+'ms' : '?') +
    '; cAge='+(this.creation ? (now-this.creation.getTime())+'ms' : '?') +
    '"';
};

// Use the new custom inspection symbol to add the custom inspect function if
// available.
if (util.inspect.custom) {
  Cookie.prototype[util.inspect.custom] = Cookie.prototype.inspect;
}

Cookie.prototype.toJSON = function() {
  var obj = {};

  var props = Cookie.serializableProperties;
  for (var i=0; i<props.length; i++) {
    var prop = props[i];
    if (this[prop] === Cookie.prototype[prop]) {
      continue; // leave as prototype default
    }

    if (prop === 'expires' ||
        prop === 'creation' ||
        prop === 'lastAccessed')
    {
      if (this[prop] === null) {
        obj[prop] = null;
      } else {
        obj[prop] = this[prop] == "Infinity" ? // intentionally not ===
          "Infinity" : this[prop].toISOString();
      }
    } else if (prop === 'maxAge') {
      if (this[prop] !== null) {
        // again, intentionally not ===
        obj[prop] = (this[prop] == Infinity || this[prop] == -Infinity) ?
          this[prop].toString() : this[prop];
      }
    } else {
      if (this[prop] !== Cookie.prototype[prop]) {
        obj[prop] = this[prop];
      }
    }
  }

  return obj;
};

Cookie.prototype.clone = function() {
  return fromJSON(this.toJSON());
};

Cookie.prototype.validate = function validate() {
  if (!COOKIE_OCTETS.test(this.value)) {
    return false;
  }
  if (this.expires != Infinity && !(this.expires instanceof Date) && !parseDate(this.expires)) {
    return false;
  }
  if (this.maxAge != null && this.maxAge <= 0) {
    return false; // "Max-Age=" non-zero-digit *DIGIT
  }
  if (this.path != null && !PATH_VALUE.test(this.path)) {
    return false;
  }

  var cdomain = this.cdomain();
  if (cdomain) {
    if (cdomain.match(/\.$/)) {
      return false; // S4.1.2.3 suggests that this is bad. domainMatch() tests confirm this
    }
    var suffix = pubsuffix.getPublicSuffix(cdomain);
    if (suffix == null) { // it's a public suffix
      return false;
    }
  }
  return true;
};

Cookie.prototype.setExpires = function setExpires(exp) {
  if (exp instanceof Date) {
    this.expires = exp;
  } else {
    this.expires = parseDate(exp) || "Infinity";
  }
};

Cookie.prototype.setMaxAge = function setMaxAge(age) {
  if (age === Infinity || age === -Infinity) {
    this.maxAge = age.toString(); // so JSON.stringify() works
  } else {
    this.maxAge = age;
  }
};

// gives Cookie header format
Cookie.prototype.cookieString = function cookieString() {
  var val = this.value;
  if (val == null) {
    val = '';
  }
  if (this.key === '') {
    return val;
  }
  return this.key+'='+val;
};

// gives Set-Cookie header format
Cookie.prototype.toString = function toString() {
  var str = this.cookieString();

  if (this.expires != Infinity) {
    if (this.expires instanceof Date) {
      str += '; Expires='+formatDate(this.expires);
    } else {
      str += '; Expires='+this.expires;
    }
  }

  if (this.maxAge != null && this.maxAge != Infinity) {
    str += '; Max-Age='+this.maxAge;
  }

  if (this.domain && !this.hostOnly) {
    str += '; Domain='+this.domain;
  }
  if (this.path) {
    str += '; Path='+this.path;
  }

  if (this.secure) {
    str += '; Secure';
  }
  if (this.httpOnly) {
    str += '; HttpOnly';
  }
  if (this.extensions) {
    this.extensions.forEach(function(ext) {
      str += '; '+ext;
    });
  }

  return str;
};

// TTL() partially replaces the "expiry-time" parts of S5.3 step 3 (setCookie()
// elsewhere)
// S5.3 says to give the "latest representable date" for which we use Infinity
// For "expired" we use 0
Cookie.prototype.TTL = function TTL(now) {
  /* RFC6265 S4.1.2.2 If a cookie has both the Max-Age and the Expires
   * attribute, the Max-Age attribute has precedence and controls the
   * expiration date of the cookie.
   * (Concurs with S5.3 step 3)
   */
  if (this.maxAge != null) {
    return this.maxAge<=0 ? 0 : this.maxAge*1000;
  }

  var expires = this.expires;
  if (expires != Infinity) {
    if (!(expires instanceof Date)) {
      expires = parseDate(expires) || Infinity;
    }

    if (expires == Infinity) {
      return Infinity;
    }

    return expires.getTime() - (now || Date.now());
  }

  return Infinity;
};

// expiryTime() replaces the "expiry-time" parts of S5.3 step 3 (setCookie()
// elsewhere)
Cookie.prototype.expiryTime = function expiryTime(now) {
  if (this.maxAge != null) {
    var relativeTo = now || this.creation || new Date();
    var age = (this.maxAge <= 0) ? -Infinity : this.maxAge*1000;
    return relativeTo.getTime() + age;
  }

  if (this.expires == Infinity) {
    return Infinity;
  }
  return this.expires.getTime();
};

// expiryDate() replaces the "expiry-time" parts of S5.3 step 3 (setCookie()
// elsewhere), except it returns a Date
Cookie.prototype.expiryDate = function expiryDate(now) {
  var millisec = this.expiryTime(now);
  if (millisec == Infinity) {
    return new Date(MAX_TIME);
  } else if (millisec == -Infinity) {
    return new Date(MIN_TIME);
  } else {
    return new Date(millisec);
  }
};

// This replaces the "persistent-flag" parts of S5.3 step 3
Cookie.prototype.isPersistent = function isPersistent() {
  return (this.maxAge != null || this.expires != Infinity);
};

// Mostly S5.1.2 and S5.2.3:
Cookie.prototype.cdomain =
Cookie.prototype.canonicalizedDomain = function canonicalizedDomain() {
  if (this.domain == null) {
    return null;
  }
  return canonicalDomain(this.domain);
};

function CookieJar(store, options) {
  if (typeof options === "boolean") {
    options = {rejectPublicSuffixes: options};
  } else if (options == null) {
    options = {};
  }
  if (options.rejectPublicSuffixes != null) {
    this.rejectPublicSuffixes = options.rejectPublicSuffixes;
  }
  if (options.looseMode != null) {
    this.enableLooseMode = options.looseMode;
  }

  if (!store) {
    store = new MemoryCookieStore();
  }
  this.store = store;
}
CookieJar.prototype.store = null;
CookieJar.prototype.rejectPublicSuffixes = true;
CookieJar.prototype.enableLooseMode = false;
var CAN_BE_SYNC = [];

CAN_BE_SYNC.push('setCookie');
CookieJar.prototype.setCookie = function(cookie, url, options, cb) {
  var err;
  var context = getCookieContext(url);
  if (options instanceof Function) {
    cb = options;
    options = {};
  }

  var host = canonicalDomain(context.hostname);
  var loose = this.enableLooseMode;
  if (options.loose != null) {
    loose = options.loose;
  }

  // S5.3 step 1
  if (!(cookie instanceof Cookie)) {
    cookie = Cookie.parse(cookie, { loose: loose });
  }
  if (!cookie) {
    err = new Error("Cookie failed to parse");
    return cb(options.ignoreError ? null : err);
  }

  // S5.3 step 2
  var now = options.now || new Date(); // will assign later to save effort in the face of errors

  // S5.3 step 3: NOOP; persistent-flag and expiry-time is handled by getCookie()

  // S5.3 step 4: NOOP; domain is null by default

  // S5.3 step 5: public suffixes
  if (this.rejectPublicSuffixes && cookie.domain) {
    var suffix = pubsuffix.getPublicSuffix(cookie.cdomain());
    if (suffix == null) { // e.g. "com"
      err = new Error("Cookie has domain set to a public suffix");
      return cb(options.ignoreError ? null : err);
    }
  }

  // S5.3 step 6:
  if (cookie.domain) {
    if (!domainMatch(host, cookie.cdomain(), false)) {
      err = new Error("Cookie not in this host's domain. Cookie:"+cookie.cdomain()+" Request:"+host);
      return cb(options.ignoreError ? null : err);
    }

    if (cookie.hostOnly == null) { // don't reset if already set
      cookie.hostOnly = false;
    }

  } else {
    cookie.hostOnly = true;
    cookie.domain = host;
  }

  //S5.2.4 If the attribute-value is empty or if the first character of the
  //attribute-value is not %x2F ("/"):
  //Let cookie-path be the default-path.
  if (!cookie.path || cookie.path[0] !== '/') {
    cookie.path = defaultPath(context.pathname);
    cookie.pathIsDefault = true;
  }

  // S5.3 step 8: NOOP; secure attribute
  // S5.3 step 9: NOOP; httpOnly attribute

  // S5.3 step 10
  if (options.http === false && cookie.httpOnly) {
    err = new Error("Cookie is HttpOnly and this isn't an HTTP API");
    return cb(options.ignoreError ? null : err);
  }

  var store = this.store;

  if (!store.updateCookie) {
    store.updateCookie = function(oldCookie, newCookie, cb) {
      this.putCookie(newCookie, cb);
    };
  }

  function withCookie(err, oldCookie) {
    if (err) {
      return cb(err);
    }

    var next = function(err) {
      if (err) {
        return cb(err);
      } else {
        cb(null, cookie);
      }
    };

    if (oldCookie) {
      // S5.3 step 11 - "If the cookie store contains a cookie with the same name,
      // domain, and path as the newly created cookie:"
      if (options.http === false && oldCookie.httpOnly) { // step 11.2
        err = new Error("old Cookie is HttpOnly and this isn't an HTTP API");
        return cb(options.ignoreError ? null : err);
      }
      cookie.creation = oldCookie.creation; // step 11.3
      cookie.creationIndex = oldCookie.creationIndex; // preserve tie-breaker
      cookie.lastAccessed = now;
      // Step 11.4 (delete cookie) is implied by just setting the new one:
      store.updateCookie(oldCookie, cookie, next); // step 12

    } else {
      cookie.creation = cookie.lastAccessed = now;
      store.putCookie(cookie, next); // step 12
    }
  }

  store.findCookie(cookie.domain, cookie.path, cookie.key, withCookie);
};

// RFC6365 S5.4
CAN_BE_SYNC.push('getCookies');
CookieJar.prototype.getCookies = function(url, options, cb) {
  var context = getCookieContext(url);
  if (options instanceof Function) {
    cb = options;
    options = {};
  }

  var host = canonicalDomain(context.hostname);
  var path = context.pathname || '/';

  var secure = options.secure;
  if (secure == null && context.protocol &&
      (context.protocol == 'https:' || context.protocol == 'wss:'))
  {
    secure = true;
  }

  var http = options.http;
  if (http == null) {
    http = true;
  }

  var now = options.now || Date.now();
  var expireCheck = options.expire !== false;
  var allPaths = !!options.allPaths;
  var store = this.store;

  function matchingCookie(c) {
    // "Either:
    //   The cookie's host-only-flag is true and the canonicalized
    //   request-host is identical to the cookie's domain.
    // Or:
    //   The cookie's host-only-flag is false and the canonicalized
    //   request-host domain-matches the cookie's domain."
    if (c.hostOnly) {
      if (c.domain != host) {
        return false;
      }
    } else {
      if (!domainMatch(host, c.domain, false)) {
        return false;
      }
    }

    // "The request-uri's path path-matches the cookie's path."
    if (!allPaths && !pathMatch(path, c.path)) {
      return false;
    }

    // "If the cookie's secure-only-flag is true, then the request-uri's
    // scheme must denote a "secure" protocol"
    if (c.secure && !secure) {
      return false;
    }

    // "If the cookie's http-only-flag is true, then exclude the cookie if the
    // cookie-string is being generated for a "non-HTTP" API"
    if (c.httpOnly && !http) {
      return false;
    }

    // deferred from S5.3
    // non-RFC: allow retention of expired cookies by choice
    if (expireCheck && c.expiryTime() <= now) {
      store.removeCookie(c.domain, c.path, c.key, function(){}); // result ignored
      return false;
    }

    return true;
  }

  store.findCookies(host, allPaths ? null : path, function(err,cookies) {
    if (err) {
      return cb(err);
    }

    cookies = cookies.filter(matchingCookie);

    // sorting of S5.4 part 2
    if (options.sort !== false) {
      cookies = cookies.sort(cookieCompare);
    }

    // S5.4 part 3
    var now = new Date();
    cookies.forEach(function(c) {
      c.lastAccessed = now;
    });
    // TODO persist lastAccessed

    cb(null,cookies);
  });
};

CAN_BE_SYNC.push('getCookieString');
CookieJar.prototype.getCookieString = function(/*..., cb*/) {
  var args = Array.prototype.slice.call(arguments,0);
  var cb = args.pop();
  var next = function(err,cookies) {
    if (err) {
      cb(err);
    } else {
      cb(null, cookies
        .sort(cookieCompare)
        .map(function(c){
          return c.cookieString();
        })
        .join('; '));
    }
  };
  args.push(next);
  this.getCookies.apply(this,args);
};

CAN_BE_SYNC.push('getSetCookieStrings');
CookieJar.prototype.getSetCookieStrings = function(/*..., cb*/) {
  var args = Array.prototype.slice.call(arguments,0);
  var cb = args.pop();
  var next = function(err,cookies) {
    if (err) {
      cb(err);
    } else {
      cb(null, cookies.map(function(c){
        return c.toString();
      }));
    }
  };
  args.push(next);
  this.getCookies.apply(this,args);
};

CAN_BE_SYNC.push('serialize');
CookieJar.prototype.serialize = function(cb) {
  var type = this.store.constructor.name;
  if (type === 'Object') {
    type = null;
  }

  // update README.md "Serialization Format" if you change this, please!
  var serialized = {
    // The version of tough-cookie that serialized this jar. Generally a good
    // practice since future versions can make data import decisions based on
    // known past behavior. When/if this matters, use `semver`.
    version: 'tough-cookie@'+VERSION,

    // add the store type, to make humans happy:
    storeType: type,

    // CookieJar configuration:
    rejectPublicSuffixes: !!this.rejectPublicSuffixes,

    // this gets filled from getAllCookies:
    cookies: []
  };

  if (!(this.store.getAllCookies &&
        typeof this.store.getAllCookies === 'function'))
  {
    return cb(new Error('store does not support getAllCookies and cannot be serialized'));
  }

  this.store.getAllCookies(function(err,cookies) {
    if (err) {
      return cb(err);
    }

    serialized.cookies = cookies.map(function(cookie) {
      // convert to serialized 'raw' cookies
      cookie = (cookie instanceof Cookie) ? cookie.toJSON() : cookie;

      // Remove the index so new ones get assigned during deserialization
      delete cookie.creationIndex;

      return cookie;
    });

    return cb(null, serialized);
  });
};

// well-known name that JSON.stringify calls
CookieJar.prototype.toJSON = function() {
  return this.serializeSync();
};

// use the class method CookieJar.deserialize instead of calling this directly
CAN_BE_SYNC.push('_importCookies');
CookieJar.prototype._importCookies = function(serialized, cb) {
  var jar = this;
  var cookies = serialized.cookies;
  if (!cookies || !Array.isArray(cookies)) {
    return cb(new Error('serialized jar has no cookies array'));
  }
  cookies = cookies.slice(); // do not modify the original

  function putNext(err) {
    if (err) {
      return cb(err);
    }

    if (!cookies.length) {
      return cb(err, jar);
    }

    var cookie;
    try {
      cookie = fromJSON(cookies.shift());
    } catch (e) {
      return cb(e);
    }

    if (cookie === null) {
      return putNext(null); // skip this cookie
    }

    jar.store.putCookie(cookie, putNext);
  }

  putNext();
};

CookieJar.deserialize = function(strOrObj, store, cb) {
  if (arguments.length !== 3) {
    // store is optional
    cb = store;
    store = null;
  }

  var serialized;
  if (typeof strOrObj === 'string') {
    serialized = jsonParse(strOrObj);
    if (serialized instanceof Error) {
      return cb(serialized);
    }
  } else {
    serialized = strOrObj;
  }

  var jar = new CookieJar(store, serialized.rejectPublicSuffixes);
  jar._importCookies(serialized, function(err) {
    if (err) {
      return cb(err);
    }
    cb(null, jar);
  });
};

CookieJar.deserializeSync = function(strOrObj, store) {
  var serialized = typeof strOrObj === 'string' ?
    JSON.parse(strOrObj) : strOrObj;
  var jar = new CookieJar(store, serialized.rejectPublicSuffixes);

  // catch this mistake early:
  if (!jar.store.synchronous) {
    throw new Error('CookieJar store is not synchronous; use async API instead.');
  }

  jar._importCookiesSync(serialized);
  return jar;
};
CookieJar.fromJSON = CookieJar.deserializeSync;

CookieJar.prototype.clone = function(newStore, cb) {
  if (arguments.length === 1) {
    cb = newStore;
    newStore = null;
  }

  this.serialize(function(err,serialized) {
    if (err) {
      return cb(err);
    }
    CookieJar.deserialize(serialized, newStore, cb);
  });
};

CAN_BE_SYNC.push('removeAllCookies');
CookieJar.prototype.removeAllCookies = function(cb) {
  var store = this.store;

  // Check that the store implements its own removeAllCookies(). The default
  // implementation in Store will immediately call the callback with a "not
  // implemented" Error.
  if (store.removeAllCookies instanceof Function &&
      store.removeAllCookies !== Store.prototype.removeAllCookies)
  {
    return store.removeAllCookies(cb);
  }

  store.getAllCookies(function(err, cookies) {
    if (err) {
      return cb(err);
    }

    if (cookies.length === 0) {
      return cb(null);
    }

    var completedCount = 0;
    var removeErrors = [];

    function removeCookieCb(removeErr) {
      if (removeErr) {
        removeErrors.push(removeErr);
      }

      completedCount++;

      if (completedCount === cookies.length) {
        return cb(removeErrors.length ? removeErrors[0] : null);
      }
    }

    cookies.forEach(function(cookie) {
      store.removeCookie(cookie.domain, cookie.path, cookie.key, removeCookieCb);
    });
  });
};

CookieJar.prototype._cloneSync = syncWrap('clone');
CookieJar.prototype.cloneSync = function(newStore) {
  if (!newStore.synchronous) {
    throw new Error('CookieJar clone destination store is not synchronous; use async API instead.');
  }
  return this._cloneSync(newStore);
};

// Use a closure to provide a true imperative API for synchronous stores.
function syncWrap(method) {
  return function() {
    if (!this.store.synchronous) {
      throw new Error('CookieJar store is not synchronous; use async API instead.');
    }

    var args = Array.prototype.slice.call(arguments);
    var syncErr, syncResult;
    args.push(function syncCb(err, result) {
      syncErr = err;
      syncResult = result;
    });
    this[method].apply(this, args);

    if (syncErr) {
      throw syncErr;
    }
    return syncResult;
  };
}

// wrap all declared CAN_BE_SYNC methods in the sync wrapper
CAN_BE_SYNC.forEach(function(method) {
  CookieJar.prototype[method+'Sync'] = syncWrap(method);
});

exports.version = VERSION;
exports.CookieJar = CookieJar;
exports.Cookie = Cookie;
exports.Store = Store;
exports.MemoryCookieStore = MemoryCookieStore;
exports.parseDate = parseDate;
exports.formatDate = formatDate;
exports.parse = parse;
exports.fromJSON = fromJSON;
exports.domainMatch = domainMatch;
exports.defaultPath = defaultPath;
exports.pathMatch = pathMatch;
exports.getPublicSuffix = pubsuffix.getPublicSuffix;
exports.cookieCompare = cookieCompare;
exports.permuteDomain = require('./permuteDomain').permuteDomain;
exports.permutePath = permutePath;
exports.canonicalDomain = canonicalDomain;
/*!
 * Copyright (c) 2015, Salesforce.com, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * 3. Neither the name of Salesforce.com nor the names of its contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
'use strict';
var Store = require('./store').Store;
var permuteDomain = require('./permuteDomain').permuteDomain;
var pathMatch = require('./pathMatch').pathMatch;
var util = require('util');

function MemoryCookieStore() {
  Store.call(this);
  this.idx = {};
}
util.inherits(MemoryCookieStore, Store);
exports.MemoryCookieStore = MemoryCookieStore;
MemoryCookieStore.prototype.idx = null;

// Since it's just a struct in RAM, this Store is synchronous
MemoryCookieStore.prototype.synchronous = true;

// force a default depth:
MemoryCookieStore.prototype.inspect = function() {
  return "{ idx: "+util.inspect(this.idx, false, 2)+' }';
};

// Use the new custom inspection symbol to add the custom inspect function if
// available.
if (util.inspect.custom) {
  MemoryCookieStore.prototype[util.inspect.custom] = MemoryCookieStore.prototype.inspect;
}

MemoryCookieStore.prototype.findCookie = function(domain, path, key, cb) {
  if (!this.idx[domain]) {
    return cb(null,undefined);
  }
  if (!this.idx[domain][path]) {
    return cb(null,undefined);
  }
  return cb(null,this.idx[domain][path][key]||null);
};

MemoryCookieStore.prototype.findCookies = function(domain, path, cb) {
  var results = [];
  if (!domain) {
    return cb(null,[]);
  }

  var pathMatcher;
  if (!path) {
    // null means "all paths"
    pathMatcher = function matchAll(domainIndex) {
      for (var curPath in domainIndex) {
        var pathIndex = domainIndex[curPath];
        for (var key in pathIndex) {
          results.push(pathIndex[key]);
        }
      }
    };

  } else {
    pathMatcher = function matchRFC(domainIndex) {
       //NOTE: we should use path-match algorithm from S5.1.4 here
       //(see : https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/canonical_cookie.cc#L299)
       Object.keys(domainIndex).forEach(function (cookiePath) {
         if (pathMatch(path, cookiePath)) {
           var pathIndex = domainIndex[cookiePath];

           for (var key in pathIndex) {
             results.push(pathIndex[key]);
           }
         }
       });
     };
  }

  var domains = permuteDomain(domain) || [domain];
  var idx = this.idx;
  domains.forEach(function(curDomain) {
    var domainIndex = idx[curDomain];
    if (!domainIndex) {
      return;
    }
    pathMatcher(domainIndex);
  });

  cb(null,results);
};

MemoryCookieStore.prototype.putCookie = function(cookie, cb) {
  if (!this.idx[cookie.domain]) {
    this.idx[cookie.domain] = {};
  }
  if (!this.idx[cookie.domain][cookie.path]) {
    this.idx[cookie.domain][cookie.path] = {};
  }
  this.idx[cookie.domain][cookie.path][cookie.key] = cookie;
  cb(null);
};

MemoryCookieStore.prototype.updateCookie = function(oldCookie, newCookie, cb) {
  // updateCookie() may avoid updating cookies that are identical.  For example,
  // lastAccessed may not be important to some stores and an equality
  // comparison could exclude that field.
  this.putCookie(newCookie,cb);
};

MemoryCookieStore.prototype.removeCookie = function(domain, path, key, cb) {
  if (this.idx[domain] && this.idx[domain][path] && this.idx[domain][path][key]) {
    delete this.idx[domain][path][key];
  }
  cb(null);
};

MemoryCookieStore.prototype.removeCookies = function(domain, path, cb) {
  if (this.idx[domain]) {
    if (path) {
      delete this.idx[domain][path];
    } else {
      delete this.idx[domain];
    }
  }
  return cb(null);
};

MemoryCookieStore.prototype.removeAllCookies = function(cb) {
  this.idx = {};
  return cb(null);
}

MemoryCookieStore.prototype.getAllCookies = function(cb) {
  var cookies = [];
  var idx = this.idx;

  var domains = Object.keys(idx);
  domains.forEach(function(domain) {
    var paths = Object.keys(idx[domain]);
    paths.forEach(function(path) {
      var keys = Object.keys(idx[domain][path]);
      keys.forEach(function(key) {
        if (key !== null) {
          cookies.push(idx[domain][path][key]);
        }
      });
    });
  });

  // Sort by creationIndex so deserializing retains the creation order.
  // When implementing your own store, this SHOULD retain the order too
  cookies.sort(function(a,b) {
    return (a.creationIndex||0) - (b.creationIndex||0);
  });

  cb(null, cookies);
};
/*!
 * Copyright (c) 2015, Salesforce.com, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * 3. Neither the name of Salesforce.com nor the names of its contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
"use strict";
/*
 * "A request-path path-matches a given cookie-path if at least one of the
 * following conditions holds:"
 */
function pathMatch (reqPath, cookiePath) {
  // "o  The cookie-path and the request-path are identical."
  if (cookiePath === reqPath) {
    return true;
  }

  var idx = reqPath.indexOf(cookiePath);
  if (idx === 0) {
    // "o  The cookie-path is a prefix of the request-path, and the last
    // character of the cookie-path is %x2F ("/")."
    if (cookiePath.substr(-1) === "/") {
      return true;
    }

    // " o  The cookie-path is a prefix of the request-path, and the first
    // character of the request-path that is not included in the cookie- path
    // is a %x2F ("/") character."
    if (reqPath.substr(cookiePath.length, 1) === "/") {
      return true;
    }
  }

  return false;
}

exports.pathMatch = pathMatch;
/*!
 * Copyright (c) 2015, Salesforce.com, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * 3. Neither the name of Salesforce.com nor the names of its contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
"use strict";
var pubsuffix = require('./pubsuffix-psl');

// Gives the permutation of all possible domainMatch()es of a given domain. The
// array is in shortest-to-longest order.  Handy for indexing.
function permuteDomain (domain) {
  var pubSuf = pubsuffix.getPublicSuffix(domain);
  if (!pubSuf) {
    return null;
  }
  if (pubSuf == domain) {
    return [domain];
  }

  var prefix = domain.slice(0, -(pubSuf.length + 1)); // ".example.com"
  var parts = prefix.split('.').reverse();
  var cur = pubSuf;
  var permutations = [cur];
  while (parts.length) {
    cur = parts.shift() + '.' + cur;
    permutations.push(cur);
  }
  return permutations;
}

exports.permuteDomain = permuteDomain;
/*!
 * Copyright (c) 2018, Salesforce.com, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * 3. Neither the name of Salesforce.com nor the names of its contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
'use strict';
var psl = require('psl');

function getPublicSuffix(domain) {
  return psl.get(domain);
}

exports.getPublicSuffix = getPublicSuffix;
/*!
 * Copyright (c) 2015, Salesforce.com, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * 3. Neither the name of Salesforce.com nor the names of its contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
'use strict';
/*jshint unused:false */

function Store() {
}
exports.Store = Store;

// Stores may be synchronous, but are still required to use a
// Continuation-Passing Style API.  The CookieJar itself will expose a "*Sync"
// API that converts from synchronous-callbacks to imperative style.
Store.prototype.synchronous = false;

Store.prototype.findCookie = function(domain, path, key, cb) {
  throw new Error('findCookie is not implemented');
};

Store.prototype.findCookies = function(domain, path, cb) {
  throw new Error('findCookies is not implemented');
};

Store.prototype.putCookie = function(cookie, cb) {
  throw new Error('putCookie is not implemented');
};

Store.prototype.updateCookie = function(oldCookie, newCookie, cb) {
  // recommended default implementation:
  // return this.putCookie(newCookie, cb);
  throw new Error('updateCookie is not implemented');
};

Store.prototype.removeCookie = function(domain, path, key, cb) {
  throw new Error('removeCookie is not implemented');
};

Store.prototype.removeCookies = function(domain, path, cb) {
  throw new Error('removeCookies is not implemented');
};

Store.prototype.removeAllCookies = function(cb) {
  throw new Error('removeAllCookies is not implemented');
}

Store.prototype.getAllCookies = function(cb) {
  throw new Error('getAllCookies is not implemented (therefore jar cannot be serialized)');
};
// generated by genversion
module.exports = '2.5.0'
'use strict';

var fn = module.exports = function (x) {
	return fn.end(fn.start(x));
};

fn.start = function (x) {
	return x.replace(/^[\r\n]+/, '');
};

fn.end = function (x) {
	return x.replace(/[\r\n]+$/, '');
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Trim newlines from the start and/or end of a string",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/trim-newlines#readme",
  "license": "MIT",
  "name": "trim-newlines",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/trim-newlines.git"
  },
  "version": "1.0.0"
}[submodule "vendor/big-list-of-naughty-strings"]
	path = vendor/big-list-of-naughty-strings
	url = https://github.com/minimaxir/big-list-of-naughty-strings.git
Carl Xiong <xiongc05@gmail.com>
Parsha Pourkhomami <parshap@gmail.com>
'use strict';

var truncate = require("./lib/truncate");
var getLength = require("utf8-byte-length/browser");
module.exports = truncate.bind(null, getLength);
'use strict';

var truncate = require("./lib/truncate");
var getLength = Buffer.byteLength.bind(Buffer);
module.exports = truncate.bind(null, getLength);
{
  "author": {
    "name": "Carl Xiong",
    "email": "xiongc05@gmail.com"
  },
  "browser": "browser.js",
  "dependencies": {
    "utf8-byte-length": "^1.0.1"
  },
  "deprecated": false,
  "description": "Truncate string to given length in bytes",
  "devDependencies": {
    "tape": "^4.2.2"
  },
  "homepage": "https://github.com/parshap/truncate-utf8-bytes#readme",
  "license": "WTFPL",
  "main": "index.js",
  "name": "truncate-utf8-bytes",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/parshap/truncate-utf8-bytes.git"
  },
  "version": "1.0.2"
}'use strict';

function isHighSurrogate(codePoint) {
  return codePoint >= 0xd800 && codePoint <= 0xdbff;
}

function isLowSurrogate(codePoint) {
  return codePoint >= 0xdc00 && codePoint <= 0xdfff;
}

// Truncate string by size in bytes
module.exports = function truncate(getLength, string, byteLength) {
  if (typeof string !== "string") {
    throw new Error("Input must be string");
  }

  var charLength = string.length;
  var curByteLength = 0;
  var codePoint;
  var segment;

  for (var i = 0; i < charLength; i += 1) {
    codePoint = string.charCodeAt(i);
    segment = string[i];

    if (isHighSurrogate(codePoint) && isLowSurrogate(string.charCodeAt(i + 1))) {
      i += 1;
      segment += string[i];
    }

    curByteLength += getLength(segment);

    if (curByteLength === byteLength) {
      return string.slice(0, i + 1);
    }
    else if (curByteLength > byteLength) {
      return string.slice(0, i - segment.length + 1);
    }
  }

  return string;
};

Apache License

Version 2.0, January 2004

http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

You must give any other recipients of the Work or Derivative Works a copy of this License; and

You must cause any modified files to carry prominent notices stating that You changed the files; and

You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS'use strict'

var net = require('net')
  , tls = require('tls')
  , http = require('http')
  , https = require('https')
  , events = require('events')
  , assert = require('assert')
  , util = require('util')
  , Buffer = require('safe-buffer').Buffer
  ;

exports.httpOverHttp = httpOverHttp
exports.httpsOverHttp = httpsOverHttp
exports.httpOverHttps = httpOverHttps
exports.httpsOverHttps = httpsOverHttps


function httpOverHttp(options) {
  var agent = new TunnelingAgent(options)
  agent.request = http.request
  return agent
}

function httpsOverHttp(options) {
  var agent = new TunnelingAgent(options)
  agent.request = http.request
  agent.createSocket = createSecureSocket
  agent.defaultPort = 443
  return agent
}

function httpOverHttps(options) {
  var agent = new TunnelingAgent(options)
  agent.request = https.request
  return agent
}

function httpsOverHttps(options) {
  var agent = new TunnelingAgent(options)
  agent.request = https.request
  agent.createSocket = createSecureSocket
  agent.defaultPort = 443
  return agent
}


function TunnelingAgent(options) {
  var self = this
  self.options = options || {}
  self.proxyOptions = self.options.proxy || {}
  self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets
  self.requests = []
  self.sockets = []

  self.on('free', function onFree(socket, host, port) {
    for (var i = 0, len = self.requests.length; i < len; ++i) {
      var pending = self.requests[i]
      if (pending.host === host && pending.port === port) {
        // Detect the request to connect same origin server,
        // reuse the connection.
        self.requests.splice(i, 1)
        pending.request.onSocket(socket)
        return
      }
    }
    socket.destroy()
    self.removeSocket(socket)
  })
}
util.inherits(TunnelingAgent, events.EventEmitter)

TunnelingAgent.prototype.addRequest = function addRequest(req, options) {
  var self = this

   // Legacy API: addRequest(req, host, port, path)
  if (typeof options === 'string') {
    options = {
      host: options,
      port: arguments[2],
      path: arguments[3]
    };
  }

  if (self.sockets.length >= this.maxSockets) {
    // We are over limit so we'll add it to the queue.
    self.requests.push({host: options.host, port: options.port, request: req})
    return
  }

  // If we are under maxSockets create a new one.
  self.createConnection({host: options.host, port: options.port, request: req})
}

TunnelingAgent.prototype.createConnection = function createConnection(pending) {
  var self = this

  self.createSocket(pending, function(socket) {
    socket.on('free', onFree)
    socket.on('close', onCloseOrRemove)
    socket.on('agentRemove', onCloseOrRemove)
    pending.request.onSocket(socket)

    function onFree() {
      self.emit('free', socket, pending.host, pending.port)
    }

    function onCloseOrRemove(err) {
      self.removeSocket(socket)
      socket.removeListener('free', onFree)
      socket.removeListener('close', onCloseOrRemove)
      socket.removeListener('agentRemove', onCloseOrRemove)
    }
  })
}

TunnelingAgent.prototype.createSocket = function createSocket(options, cb) {
  var self = this
  var placeholder = {}
  self.sockets.push(placeholder)

  var connectOptions = mergeOptions({}, self.proxyOptions,
    { method: 'CONNECT'
    , path: options.host + ':' + options.port
    , agent: false
    }
  )
  if (connectOptions.proxyAuth) {
    connectOptions.headers = connectOptions.headers || {}
    connectOptions.headers['Proxy-Authorization'] = 'Basic ' +
        Buffer.from(connectOptions.proxyAuth).toString('base64')
  }

  debug('making CONNECT request')
  var connectReq = self.request(connectOptions)
  connectReq.useChunkedEncodingByDefault = false // for v0.6
  connectReq.once('response', onResponse) // for v0.6
  connectReq.once('upgrade', onUpgrade)   // for v0.6
  connectReq.once('connect', onConnect)   // for v0.7 or later
  connectReq.once('error', onError)
  connectReq.end()

  function onResponse(res) {
    // Very hacky. This is necessary to avoid http-parser leaks.
    res.upgrade = true
  }

  function onUpgrade(res, socket, head) {
    // Hacky.
    process.nextTick(function() {
      onConnect(res, socket, head)
    })
  }

  function onConnect(res, socket, head) {
    connectReq.removeAllListeners()
    socket.removeAllListeners()

    if (res.statusCode === 200) {
      assert.equal(head.length, 0)
      debug('tunneling connection has established')
      self.sockets[self.sockets.indexOf(placeholder)] = socket
      cb(socket)
    } else {
      debug('tunneling socket could not be established, statusCode=%d', res.statusCode)
      var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode)
      error.code = 'ECONNRESET'
      options.request.emit('error', error)
      self.removeSocket(placeholder)
    }
  }

  function onError(cause) {
    connectReq.removeAllListeners()

    debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack)
    var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message)
    error.code = 'ECONNRESET'
    options.request.emit('error', error)
    self.removeSocket(placeholder)
  }
}

TunnelingAgent.prototype.removeSocket = function removeSocket(socket) {
  var pos = this.sockets.indexOf(socket)
  if (pos === -1) return

  this.sockets.splice(pos, 1)

  var pending = this.requests.shift()
  if (pending) {
    // If we have pending requests and a socket gets closed a new one
    // needs to be created to take over in the pool for the one that closed.
    this.createConnection(pending)
  }
}

function createSecureSocket(options, cb) {
  var self = this
  TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {
    // 0 is dummy port for v0.6
    var secureSocket = tls.connect(0, mergeOptions({}, self.options,
      { servername: options.host
      , socket: socket
      }
    ))
    self.sockets[self.sockets.indexOf(socket)] = secureSocket
    cb(secureSocket)
  })
}


function mergeOptions(target) {
  for (var i = 1, len = arguments.length; i < len; ++i) {
    var overrides = arguments[i]
    if (typeof overrides === 'object') {
      var keys = Object.keys(overrides)
      for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {
        var k = keys[j]
        if (overrides[k] !== undefined) {
          target[k] = overrides[k]
        }
      }
    }
  }
  return target
}


var debug
if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
  debug = function() {
    var args = Array.prototype.slice.call(arguments)
    if (typeof args[0] === 'string') {
      args[0] = 'TUNNEL: ' + args[0]
    } else {
      args.unshift('TUNNEL:')
    }
    console.error.apply(console, args)
  }
} else {
  debug = function() {}
}
exports.debug = debug // for test
{
  "author": {
    "name": "Mikeal Rogers",
    "email": "mikeal.rogers@gmail.com",
    "url": "http://www.futurealoof.com"
  },
  "dependencies": {
    "safe-buffer": "^5.0.1"
  },
  "deprecated": false,
  "description": "HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.",
  "devDependencies": {},
  "engines": {
    "node": "*"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/mikeal/tunnel-agent#readme",
  "license": "Apache-2.0",
  "main": "index.js",
  "name": "tunnel-agent",
  "optionalDependencies": {},
  "repository": {
    "url": "git+https://github.com/mikeal/tunnel-agent.git"
  },
  "version": "0.6.0"
}List of TweetNaCl.js authors
============================

    Alphabetical order by first name.
    Format: Name (GitHub username or URL)

* AndSDev (@AndSDev)
* Devi Mandiri (@devi)
* Dmitry Chestnykh (@dchest)

List of authors of third-party public domain code from which TweetNaCl.js code was derived
==========================================================================================

[TweetNaCl](http://tweetnacl.cr.yp.to/)
--------------------------------------

* Bernard van Gastel
* Daniel J. Bernstein <http://cr.yp.to/djb.html>
* Peter Schwabe <http://www.cryptojedi.org/users/peter/>
* Sjaak Smetsers <http://www.cs.ru.nl/~sjakie/>
* Tanja Lange <http://hyperelliptic.org/tanja>
* Wesley Janssen


[Poly1305-donna](https://github.com/floodyberry/poly1305-donna)
--------------------------------------------------------------

* Andrew Moon (@floodyberry)
This is free and unencumbered software released into the public domain.

Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.

In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

For more information, please refer to <http://unlicense.org>
# Important!

If your contribution is not trivial (not a typo fix, etc.), we can only accept
it if you dedicate your copyright for the contribution to the public domain.
Make sure you understand what it means (see http://unlicense.org/)! If you
agree, please add yourself to AUTHORS.md file, and include the following text
to your pull request description or a comment in it:

------------------------------------------------------------------------------

    I dedicate any and all copyright interest in this software to the
    public domain. I make this dedication for the benefit of the public at
    large and to the detriment of my heirs and successors. I intend this
    dedication to be an overt act of relinquishment in perpetuity of all
    present and future rights to this software under copyright law.

    Anyone is free to copy, modify, publish, use, compile, sell, or
    distribute this software, either in source code form or as a compiled
    binary, for any purpose, commercial or non-commercial, and by any
    means.
(function(nacl) {
'use strict';

// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri.
// Public domain.
//
// Implementation derived from TweetNaCl version 20140427.
// See for details: http://tweetnacl.cr.yp.to/

var gf = function(init) {
  var i, r = new Float64Array(16);
  if (init) for (i = 0; i < init.length; i++) r[i] = init[i];
  return r;
};

//  Pluggable, initialized in high-level API below.
var randombytes = function(/* x, n */) { throw new Error('no PRNG'); };

var _0 = new Uint8Array(16);
var _9 = new Uint8Array(32); _9[0] = 9;

var gf0 = gf(),
    gf1 = gf([1]),
    _121665 = gf([0xdb41, 1]),
    D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),
    D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),
    X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),
    Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),
    I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);

function ts64(x, i, h, l) {
  x[i]   = (h >> 24) & 0xff;
  x[i+1] = (h >> 16) & 0xff;
  x[i+2] = (h >>  8) & 0xff;
  x[i+3] = h & 0xff;
  x[i+4] = (l >> 24)  & 0xff;
  x[i+5] = (l >> 16)  & 0xff;
  x[i+6] = (l >>  8)  & 0xff;
  x[i+7] = l & 0xff;
}

function vn(x, xi, y, yi, n) {
  var i,d = 0;
  for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i];
  return (1 & ((d - 1) >>> 8)) - 1;
}

function crypto_verify_16(x, xi, y, yi) {
  return vn(x,xi,y,yi,16);
}

function crypto_verify_32(x, xi, y, yi) {
  return vn(x,xi,y,yi,32);
}

function core_salsa20(o, p, k, c) {
  var j0  = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,
      j1  = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,
      j2  = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,
      j3  = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,
      j4  = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,
      j5  = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,
      j6  = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,
      j7  = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,
      j8  = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,
      j9  = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,
      j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,
      j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,
      j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,
      j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,
      j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,
      j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;

  var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,
      x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,
      x15 = j15, u;

  for (var i = 0; i < 20; i += 2) {
    u = x0 + x12 | 0;
    x4 ^= u<<7 | u>>>(32-7);
    u = x4 + x0 | 0;
    x8 ^= u<<9 | u>>>(32-9);
    u = x8 + x4 | 0;
    x12 ^= u<<13 | u>>>(32-13);
    u = x12 + x8 | 0;
    x0 ^= u<<18 | u>>>(32-18);

    u = x5 + x1 | 0;
    x9 ^= u<<7 | u>>>(32-7);
    u = x9 + x5 | 0;
    x13 ^= u<<9 | u>>>(32-9);
    u = x13 + x9 | 0;
    x1 ^= u<<13 | u>>>(32-13);
    u = x1 + x13 | 0;
    x5 ^= u<<18 | u>>>(32-18);

    u = x10 + x6 | 0;
    x14 ^= u<<7 | u>>>(32-7);
    u = x14 + x10 | 0;
    x2 ^= u<<9 | u>>>(32-9);
    u = x2 + x14 | 0;
    x6 ^= u<<13 | u>>>(32-13);
    u = x6 + x2 | 0;
    x10 ^= u<<18 | u>>>(32-18);

    u = x15 + x11 | 0;
    x3 ^= u<<7 | u>>>(32-7);
    u = x3 + x15 | 0;
    x7 ^= u<<9 | u>>>(32-9);
    u = x7 + x3 | 0;
    x11 ^= u<<13 | u>>>(32-13);
    u = x11 + x7 | 0;
    x15 ^= u<<18 | u>>>(32-18);

    u = x0 + x3 | 0;
    x1 ^= u<<7 | u>>>(32-7);
    u = x1 + x0 | 0;
    x2 ^= u<<9 | u>>>(32-9);
    u = x2 + x1 | 0;
    x3 ^= u<<13 | u>>>(32-13);
    u = x3 + x2 | 0;
    x0 ^= u<<18 | u>>>(32-18);

    u = x5 + x4 | 0;
    x6 ^= u<<7 | u>>>(32-7);
    u = x6 + x5 | 0;
    x7 ^= u<<9 | u>>>(32-9);
    u = x7 + x6 | 0;
    x4 ^= u<<13 | u>>>(32-13);
    u = x4 + x7 | 0;
    x5 ^= u<<18 | u>>>(32-18);

    u = x10 + x9 | 0;
    x11 ^= u<<7 | u>>>(32-7);
    u = x11 + x10 | 0;
    x8 ^= u<<9 | u>>>(32-9);
    u = x8 + x11 | 0;
    x9 ^= u<<13 | u>>>(32-13);
    u = x9 + x8 | 0;
    x10 ^= u<<18 | u>>>(32-18);

    u = x15 + x14 | 0;
    x12 ^= u<<7 | u>>>(32-7);
    u = x12 + x15 | 0;
    x13 ^= u<<9 | u>>>(32-9);
    u = x13 + x12 | 0;
    x14 ^= u<<13 | u>>>(32-13);
    u = x14 + x13 | 0;
    x15 ^= u<<18 | u>>>(32-18);
  }
   x0 =  x0 +  j0 | 0;
   x1 =  x1 +  j1 | 0;
   x2 =  x2 +  j2 | 0;
   x3 =  x3 +  j3 | 0;
   x4 =  x4 +  j4 | 0;
   x5 =  x5 +  j5 | 0;
   x6 =  x6 +  j6 | 0;
   x7 =  x7 +  j7 | 0;
   x8 =  x8 +  j8 | 0;
   x9 =  x9 +  j9 | 0;
  x10 = x10 + j10 | 0;
  x11 = x11 + j11 | 0;
  x12 = x12 + j12 | 0;
  x13 = x13 + j13 | 0;
  x14 = x14 + j14 | 0;
  x15 = x15 + j15 | 0;

  o[ 0] = x0 >>>  0 & 0xff;
  o[ 1] = x0 >>>  8 & 0xff;
  o[ 2] = x0 >>> 16 & 0xff;
  o[ 3] = x0 >>> 24 & 0xff;

  o[ 4] = x1 >>>  0 & 0xff;
  o[ 5] = x1 >>>  8 & 0xff;
  o[ 6] = x1 >>> 16 & 0xff;
  o[ 7] = x1 >>> 24 & 0xff;

  o[ 8] = x2 >>>  0 & 0xff;
  o[ 9] = x2 >>>  8 & 0xff;
  o[10] = x2 >>> 16 & 0xff;
  o[11] = x2 >>> 24 & 0xff;

  o[12] = x3 >>>  0 & 0xff;
  o[13] = x3 >>>  8 & 0xff;
  o[14] = x3 >>> 16 & 0xff;
  o[15] = x3 >>> 24 & 0xff;

  o[16] = x4 >>>  0 & 0xff;
  o[17] = x4 >>>  8 & 0xff;
  o[18] = x4 >>> 16 & 0xff;
  o[19] = x4 >>> 24 & 0xff;

  o[20] = x5 >>>  0 & 0xff;
  o[21] = x5 >>>  8 & 0xff;
  o[22] = x5 >>> 16 & 0xff;
  o[23] = x5 >>> 24 & 0xff;

  o[24] = x6 >>>  0 & 0xff;
  o[25] = x6 >>>  8 & 0xff;
  o[26] = x6 >>> 16 & 0xff;
  o[27] = x6 >>> 24 & 0xff;

  o[28] = x7 >>>  0 & 0xff;
  o[29] = x7 >>>  8 & 0xff;
  o[30] = x7 >>> 16 & 0xff;
  o[31] = x7 >>> 24 & 0xff;

  o[32] = x8 >>>  0 & 0xff;
  o[33] = x8 >>>  8 & 0xff;
  o[34] = x8 >>> 16 & 0xff;
  o[35] = x8 >>> 24 & 0xff;

  o[36] = x9 >>>  0 & 0xff;
  o[37] = x9 >>>  8 & 0xff;
  o[38] = x9 >>> 16 & 0xff;
  o[39] = x9 >>> 24 & 0xff;

  o[40] = x10 >>>  0 & 0xff;
  o[41] = x10 >>>  8 & 0xff;
  o[42] = x10 >>> 16 & 0xff;
  o[43] = x10 >>> 24 & 0xff;

  o[44] = x11 >>>  0 & 0xff;
  o[45] = x11 >>>  8 & 0xff;
  o[46] = x11 >>> 16 & 0xff;
  o[47] = x11 >>> 24 & 0xff;

  o[48] = x12 >>>  0 & 0xff;
  o[49] = x12 >>>  8 & 0xff;
  o[50] = x12 >>> 16 & 0xff;
  o[51] = x12 >>> 24 & 0xff;

  o[52] = x13 >>>  0 & 0xff;
  o[53] = x13 >>>  8 & 0xff;
  o[54] = x13 >>> 16 & 0xff;
  o[55] = x13 >>> 24 & 0xff;

  o[56] = x14 >>>  0 & 0xff;
  o[57] = x14 >>>  8 & 0xff;
  o[58] = x14 >>> 16 & 0xff;
  o[59] = x14 >>> 24 & 0xff;

  o[60] = x15 >>>  0 & 0xff;
  o[61] = x15 >>>  8 & 0xff;
  o[62] = x15 >>> 16 & 0xff;
  o[63] = x15 >>> 24 & 0xff;
}

function core_hsalsa20(o,p,k,c) {
  var j0  = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,
      j1  = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,
      j2  = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,
      j3  = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,
      j4  = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,
      j5  = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,
      j6  = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,
      j7  = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,
      j8  = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,
      j9  = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,
      j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,
      j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,
      j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,
      j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,
      j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,
      j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;

  var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,
      x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,
      x15 = j15, u;

  for (var i = 0; i < 20; i += 2) {
    u = x0 + x12 | 0;
    x4 ^= u<<7 | u>>>(32-7);
    u = x4 + x0 | 0;
    x8 ^= u<<9 | u>>>(32-9);
    u = x8 + x4 | 0;
    x12 ^= u<<13 | u>>>(32-13);
    u = x12 + x8 | 0;
    x0 ^= u<<18 | u>>>(32-18);

    u = x5 + x1 | 0;
    x9 ^= u<<7 | u>>>(32-7);
    u = x9 + x5 | 0;
    x13 ^= u<<9 | u>>>(32-9);
    u = x13 + x9 | 0;
    x1 ^= u<<13 | u>>>(32-13);
    u = x1 + x13 | 0;
    x5 ^= u<<18 | u>>>(32-18);

    u = x10 + x6 | 0;
    x14 ^= u<<7 | u>>>(32-7);
    u = x14 + x10 | 0;
    x2 ^= u<<9 | u>>>(32-9);
    u = x2 + x14 | 0;
    x6 ^= u<<13 | u>>>(32-13);
    u = x6 + x2 | 0;
    x10 ^= u<<18 | u>>>(32-18);

    u = x15 + x11 | 0;
    x3 ^= u<<7 | u>>>(32-7);
    u = x3 + x15 | 0;
    x7 ^= u<<9 | u>>>(32-9);
    u = x7 + x3 | 0;
    x11 ^= u<<13 | u>>>(32-13);
    u = x11 + x7 | 0;
    x15 ^= u<<18 | u>>>(32-18);

    u = x0 + x3 | 0;
    x1 ^= u<<7 | u>>>(32-7);
    u = x1 + x0 | 0;
    x2 ^= u<<9 | u>>>(32-9);
    u = x2 + x1 | 0;
    x3 ^= u<<13 | u>>>(32-13);
    u = x3 + x2 | 0;
    x0 ^= u<<18 | u>>>(32-18);

    u = x5 + x4 | 0;
    x6 ^= u<<7 | u>>>(32-7);
    u = x6 + x5 | 0;
    x7 ^= u<<9 | u>>>(32-9);
    u = x7 + x6 | 0;
    x4 ^= u<<13 | u>>>(32-13);
    u = x4 + x7 | 0;
    x5 ^= u<<18 | u>>>(32-18);

    u = x10 + x9 | 0;
    x11 ^= u<<7 | u>>>(32-7);
    u = x11 + x10 | 0;
    x8 ^= u<<9 | u>>>(32-9);
    u = x8 + x11 | 0;
    x9 ^= u<<13 | u>>>(32-13);
    u = x9 + x8 | 0;
    x10 ^= u<<18 | u>>>(32-18);

    u = x15 + x14 | 0;
    x12 ^= u<<7 | u>>>(32-7);
    u = x12 + x15 | 0;
    x13 ^= u<<9 | u>>>(32-9);
    u = x13 + x12 | 0;
    x14 ^= u<<13 | u>>>(32-13);
    u = x14 + x13 | 0;
    x15 ^= u<<18 | u>>>(32-18);
  }

  o[ 0] = x0 >>>  0 & 0xff;
  o[ 1] = x0 >>>  8 & 0xff;
  o[ 2] = x0 >>> 16 & 0xff;
  o[ 3] = x0 >>> 24 & 0xff;

  o[ 4] = x5 >>>  0 & 0xff;
  o[ 5] = x5 >>>  8 & 0xff;
  o[ 6] = x5 >>> 16 & 0xff;
  o[ 7] = x5 >>> 24 & 0xff;

  o[ 8] = x10 >>>  0 & 0xff;
  o[ 9] = x10 >>>  8 & 0xff;
  o[10] = x10 >>> 16 & 0xff;
  o[11] = x10 >>> 24 & 0xff;

  o[12] = x15 >>>  0 & 0xff;
  o[13] = x15 >>>  8 & 0xff;
  o[14] = x15 >>> 16 & 0xff;
  o[15] = x15 >>> 24 & 0xff;

  o[16] = x6 >>>  0 & 0xff;
  o[17] = x6 >>>  8 & 0xff;
  o[18] = x6 >>> 16 & 0xff;
  o[19] = x6 >>> 24 & 0xff;

  o[20] = x7 >>>  0 & 0xff;
  o[21] = x7 >>>  8 & 0xff;
  o[22] = x7 >>> 16 & 0xff;
  o[23] = x7 >>> 24 & 0xff;

  o[24] = x8 >>>  0 & 0xff;
  o[25] = x8 >>>  8 & 0xff;
  o[26] = x8 >>> 16 & 0xff;
  o[27] = x8 >>> 24 & 0xff;

  o[28] = x9 >>>  0 & 0xff;
  o[29] = x9 >>>  8 & 0xff;
  o[30] = x9 >>> 16 & 0xff;
  o[31] = x9 >>> 24 & 0xff;
}

function crypto_core_salsa20(out,inp,k,c) {
  core_salsa20(out,inp,k,c);
}

function crypto_core_hsalsa20(out,inp,k,c) {
  core_hsalsa20(out,inp,k,c);
}

var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);
            // "expand 32-byte k"

function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) {
  var z = new Uint8Array(16), x = new Uint8Array(64);
  var u, i;
  for (i = 0; i < 16; i++) z[i] = 0;
  for (i = 0; i < 8; i++) z[i] = n[i];
  while (b >= 64) {
    crypto_core_salsa20(x,z,k,sigma);
    for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i];
    u = 1;
    for (i = 8; i < 16; i++) {
      u = u + (z[i] & 0xff) | 0;
      z[i] = u & 0xff;
      u >>>= 8;
    }
    b -= 64;
    cpos += 64;
    mpos += 64;
  }
  if (b > 0) {
    crypto_core_salsa20(x,z,k,sigma);
    for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i];
  }
  return 0;
}

function crypto_stream_salsa20(c,cpos,b,n,k) {
  var z = new Uint8Array(16), x = new Uint8Array(64);
  var u, i;
  for (i = 0; i < 16; i++) z[i] = 0;
  for (i = 0; i < 8; i++) z[i] = n[i];
  while (b >= 64) {
    crypto_core_salsa20(x,z,k,sigma);
    for (i = 0; i < 64; i++) c[cpos+i] = x[i];
    u = 1;
    for (i = 8; i < 16; i++) {
      u = u + (z[i] & 0xff) | 0;
      z[i] = u & 0xff;
      u >>>= 8;
    }
    b -= 64;
    cpos += 64;
  }
  if (b > 0) {
    crypto_core_salsa20(x,z,k,sigma);
    for (i = 0; i < b; i++) c[cpos+i] = x[i];
  }
  return 0;
}

function crypto_stream(c,cpos,d,n,k) {
  var s = new Uint8Array(32);
  crypto_core_hsalsa20(s,n,k,sigma);
  var sn = new Uint8Array(8);
  for (var i = 0; i < 8; i++) sn[i] = n[i+16];
  return crypto_stream_salsa20(c,cpos,d,sn,s);
}

function crypto_stream_xor(c,cpos,m,mpos,d,n,k) {
  var s = new Uint8Array(32);
  crypto_core_hsalsa20(s,n,k,sigma);
  var sn = new Uint8Array(8);
  for (var i = 0; i < 8; i++) sn[i] = n[i+16];
  return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s);
}

/*
* Port of Andrew Moon's Poly1305-donna-16. Public domain.
* https://github.com/floodyberry/poly1305-donna
*/

var poly1305 = function(key) {
  this.buffer = new Uint8Array(16);
  this.r = new Uint16Array(10);
  this.h = new Uint16Array(10);
  this.pad = new Uint16Array(8);
  this.leftover = 0;
  this.fin = 0;

  var t0, t1, t2, t3, t4, t5, t6, t7;

  t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0                     ) & 0x1fff;
  t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 <<  3)) & 0x1fff;
  t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 <<  6)) & 0x1f03;
  t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>>  7) | (t3 <<  9)) & 0x1fff;
  t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>>  4) | (t4 << 12)) & 0x00ff;
  this.r[5] = ((t4 >>>  1)) & 0x1ffe;
  t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 <<  2)) & 0x1fff;
  t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 <<  5)) & 0x1f81;
  t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>>  8) | (t7 <<  8)) & 0x1fff;
  this.r[9] = ((t7 >>>  5)) & 0x007f;

  this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8;
  this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8;
  this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8;
  this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8;
  this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8;
  this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8;
  this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8;
  this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8;
};

poly1305.prototype.blocks = function(m, mpos, bytes) {
  var hibit = this.fin ? 0 : (1 << 11);
  var t0, t1, t2, t3, t4, t5, t6, t7, c;
  var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9;

  var h0 = this.h[0],
      h1 = this.h[1],
      h2 = this.h[2],
      h3 = this.h[3],
      h4 = this.h[4],
      h5 = this.h[5],
      h6 = this.h[6],
      h7 = this.h[7],
      h8 = this.h[8],
      h9 = this.h[9];

  var r0 = this.r[0],
      r1 = this.r[1],
      r2 = this.r[2],
      r3 = this.r[3],
      r4 = this.r[4],
      r5 = this.r[5],
      r6 = this.r[6],
      r7 = this.r[7],
      r8 = this.r[8],
      r9 = this.r[9];

  while (bytes >= 16) {
    t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0                     ) & 0x1fff;
    t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 <<  3)) & 0x1fff;
    t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 <<  6)) & 0x1fff;
    t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>>  7) | (t3 <<  9)) & 0x1fff;
    t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>>  4) | (t4 << 12)) & 0x1fff;
    h5 += ((t4 >>>  1)) & 0x1fff;
    t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 <<  2)) & 0x1fff;
    t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 <<  5)) & 0x1fff;
    t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>>  8) | (t7 <<  8)) & 0x1fff;
    h9 += ((t7 >>> 5)) | hibit;

    c = 0;

    d0 = c;
    d0 += h0 * r0;
    d0 += h1 * (5 * r9);
    d0 += h2 * (5 * r8);
    d0 += h3 * (5 * r7);
    d0 += h4 * (5 * r6);
    c = (d0 >>> 13); d0 &= 0x1fff;
    d0 += h5 * (5 * r5);
    d0 += h6 * (5 * r4);
    d0 += h7 * (5 * r3);
    d0 += h8 * (5 * r2);
    d0 += h9 * (5 * r1);
    c += (d0 >>> 13); d0 &= 0x1fff;

    d1 = c;
    d1 += h0 * r1;
    d1 += h1 * r0;
    d1 += h2 * (5 * r9);
    d1 += h3 * (5 * r8);
    d1 += h4 * (5 * r7);
    c = (d1 >>> 13); d1 &= 0x1fff;
    d1 += h5 * (5 * r6);
    d1 += h6 * (5 * r5);
    d1 += h7 * (5 * r4);
    d1 += h8 * (5 * r3);
    d1 += h9 * (5 * r2);
    c += (d1 >>> 13); d1 &= 0x1fff;

    d2 = c;
    d2 += h0 * r2;
    d2 += h1 * r1;
    d2 += h2 * r0;
    d2 += h3 * (5 * r9);
    d2 += h4 * (5 * r8);
    c = (d2 >>> 13); d2 &= 0x1fff;
    d2 += h5 * (5 * r7);
    d2 += h6 * (5 * r6);
    d2 += h7 * (5 * r5);
    d2 += h8 * (5 * r4);
    d2 += h9 * (5 * r3);
    c += (d2 >>> 13); d2 &= 0x1fff;

    d3 = c;
    d3 += h0 * r3;
    d3 += h1 * r2;
    d3 += h2 * r1;
    d3 += h3 * r0;
    d3 += h4 * (5 * r9);
    c = (d3 >>> 13); d3 &= 0x1fff;
    d3 += h5 * (5 * r8);
    d3 += h6 * (5 * r7);
    d3 += h7 * (5 * r6);
    d3 += h8 * (5 * r5);
    d3 += h9 * (5 * r4);
    c += (d3 >>> 13); d3 &= 0x1fff;

    d4 = c;
    d4 += h0 * r4;
    d4 += h1 * r3;
    d4 += h2 * r2;
    d4 += h3 * r1;
    d4 += h4 * r0;
    c = (d4 >>> 13); d4 &= 0x1fff;
    d4 += h5 * (5 * r9);
    d4 += h6 * (5 * r8);
    d4 += h7 * (5 * r7);
    d4 += h8 * (5 * r6);
    d4 += h9 * (5 * r5);
    c += (d4 >>> 13); d4 &= 0x1fff;

    d5 = c;
    d5 += h0 * r5;
    d5 += h1 * r4;
    d5 += h2 * r3;
    d5 += h3 * r2;
    d5 += h4 * r1;
    c = (d5 >>> 13); d5 &= 0x1fff;
    d5 += h5 * r0;
    d5 += h6 * (5 * r9);
    d5 += h7 * (5 * r8);
    d5 += h8 * (5 * r7);
    d5 += h9 * (5 * r6);
    c += (d5 >>> 13); d5 &= 0x1fff;

    d6 = c;
    d6 += h0 * r6;
    d6 += h1 * r5;
    d6 += h2 * r4;
    d6 += h3 * r3;
    d6 += h4 * r2;
    c = (d6 >>> 13); d6 &= 0x1fff;
    d6 += h5 * r1;
    d6 += h6 * r0;
    d6 += h7 * (5 * r9);
    d6 += h8 * (5 * r8);
    d6 += h9 * (5 * r7);
    c += (d6 >>> 13); d6 &= 0x1fff;

    d7 = c;
    d7 += h0 * r7;
    d7 += h1 * r6;
    d7 += h2 * r5;
    d7 += h3 * r4;
    d7 += h4 * r3;
    c = (d7 >>> 13); d7 &= 0x1fff;
    d7 += h5 * r2;
    d7 += h6 * r1;
    d7 += h7 * r0;
    d7 += h8 * (5 * r9);
    d7 += h9 * (5 * r8);
    c += (d7 >>> 13); d7 &= 0x1fff;

    d8 = c;
    d8 += h0 * r8;
    d8 += h1 * r7;
    d8 += h2 * r6;
    d8 += h3 * r5;
    d8 += h4 * r4;
    c = (d8 >>> 13); d8 &= 0x1fff;
    d8 += h5 * r3;
    d8 += h6 * r2;
    d8 += h7 * r1;
    d8 += h8 * r0;
    d8 += h9 * (5 * r9);
    c += (d8 >>> 13); d8 &= 0x1fff;

    d9 = c;
    d9 += h0 * r9;
    d9 += h1 * r8;
    d9 += h2 * r7;
    d9 += h3 * r6;
    d9 += h4 * r5;
    c = (d9 >>> 13); d9 &= 0x1fff;
    d9 += h5 * r4;
    d9 += h6 * r3;
    d9 += h7 * r2;
    d9 += h8 * r1;
    d9 += h9 * r0;
    c += (d9 >>> 13); d9 &= 0x1fff;

    c = (((c << 2) + c)) | 0;
    c = (c + d0) | 0;
    d0 = c & 0x1fff;
    c = (c >>> 13);
    d1 += c;

    h0 = d0;
    h1 = d1;
    h2 = d2;
    h3 = d3;
    h4 = d4;
    h5 = d5;
    h6 = d6;
    h7 = d7;
    h8 = d8;
    h9 = d9;

    mpos += 16;
    bytes -= 16;
  }
  this.h[0] = h0;
  this.h[1] = h1;
  this.h[2] = h2;
  this.h[3] = h3;
  this.h[4] = h4;
  this.h[5] = h5;
  this.h[6] = h6;
  this.h[7] = h7;
  this.h[8] = h8;
  this.h[9] = h9;
};

poly1305.prototype.finish = function(mac, macpos) {
  var g = new Uint16Array(10);
  var c, mask, f, i;

  if (this.leftover) {
    i = this.leftover;
    this.buffer[i++] = 1;
    for (; i < 16; i++) this.buffer[i] = 0;
    this.fin = 1;
    this.blocks(this.buffer, 0, 16);
  }

  c = this.h[1] >>> 13;
  this.h[1] &= 0x1fff;
  for (i = 2; i < 10; i++) {
    this.h[i] += c;
    c = this.h[i] >>> 13;
    this.h[i] &= 0x1fff;
  }
  this.h[0] += (c * 5);
  c = this.h[0] >>> 13;
  this.h[0] &= 0x1fff;
  this.h[1] += c;
  c = this.h[1] >>> 13;
  this.h[1] &= 0x1fff;
  this.h[2] += c;

  g[0] = this.h[0] + 5;
  c = g[0] >>> 13;
  g[0] &= 0x1fff;
  for (i = 1; i < 10; i++) {
    g[i] = this.h[i] + c;
    c = g[i] >>> 13;
    g[i] &= 0x1fff;
  }
  g[9] -= (1 << 13);

  mask = (c ^ 1) - 1;
  for (i = 0; i < 10; i++) g[i] &= mask;
  mask = ~mask;
  for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i];

  this.h[0] = ((this.h[0]       ) | (this.h[1] << 13)                    ) & 0xffff;
  this.h[1] = ((this.h[1] >>>  3) | (this.h[2] << 10)                    ) & 0xffff;
  this.h[2] = ((this.h[2] >>>  6) | (this.h[3] <<  7)                    ) & 0xffff;
  this.h[3] = ((this.h[3] >>>  9) | (this.h[4] <<  4)                    ) & 0xffff;
  this.h[4] = ((this.h[4] >>> 12) | (this.h[5] <<  1) | (this.h[6] << 14)) & 0xffff;
  this.h[5] = ((this.h[6] >>>  2) | (this.h[7] << 11)                    ) & 0xffff;
  this.h[6] = ((this.h[7] >>>  5) | (this.h[8] <<  8)                    ) & 0xffff;
  this.h[7] = ((this.h[8] >>>  8) | (this.h[9] <<  5)                    ) & 0xffff;

  f = this.h[0] + this.pad[0];
  this.h[0] = f & 0xffff;
  for (i = 1; i < 8; i++) {
    f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0;
    this.h[i] = f & 0xffff;
  }

  mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff;
  mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff;
  mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff;
  mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff;
  mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff;
  mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff;
  mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff;
  mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff;
  mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff;
  mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff;
  mac[macpos+10] = (this.h[5] >>> 0) & 0xff;
  mac[macpos+11] = (this.h[5] >>> 8) & 0xff;
  mac[macpos+12] = (this.h[6] >>> 0) & 0xff;
  mac[macpos+13] = (this.h[6] >>> 8) & 0xff;
  mac[macpos+14] = (this.h[7] >>> 0) & 0xff;
  mac[macpos+15] = (this.h[7] >>> 8) & 0xff;
};

poly1305.prototype.update = function(m, mpos, bytes) {
  var i, want;

  if (this.leftover) {
    want = (16 - this.leftover);
    if (want > bytes)
      want = bytes;
    for (i = 0; i < want; i++)
      this.buffer[this.leftover + i] = m[mpos+i];
    bytes -= want;
    mpos += want;
    this.leftover += want;
    if (this.leftover < 16)
      return;
    this.blocks(this.buffer, 0, 16);
    this.leftover = 0;
  }

  if (bytes >= 16) {
    want = bytes - (bytes % 16);
    this.blocks(m, mpos, want);
    mpos += want;
    bytes -= want;
  }

  if (bytes) {
    for (i = 0; i < bytes; i++)
      this.buffer[this.leftover + i] = m[mpos+i];
    this.leftover += bytes;
  }
};

function crypto_onetimeauth(out, outpos, m, mpos, n, k) {
  var s = new poly1305(k);
  s.update(m, mpos, n);
  s.finish(out, outpos);
  return 0;
}

function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {
  var x = new Uint8Array(16);
  crypto_onetimeauth(x,0,m,mpos,n,k);
  return crypto_verify_16(h,hpos,x,0);
}

function crypto_secretbox(c,m,d,n,k) {
  var i;
  if (d < 32) return -1;
  crypto_stream_xor(c,0,m,0,d,n,k);
  crypto_onetimeauth(c, 16, c, 32, d - 32, c);
  for (i = 0; i < 16; i++) c[i] = 0;
  return 0;
}

function crypto_secretbox_open(m,c,d,n,k) {
  var i;
  var x = new Uint8Array(32);
  if (d < 32) return -1;
  crypto_stream(x,0,32,n,k);
  if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1;
  crypto_stream_xor(m,0,c,0,d,n,k);
  for (i = 0; i < 32; i++) m[i] = 0;
  return 0;
}

function set25519(r, a) {
  var i;
  for (i = 0; i < 16; i++) r[i] = a[i]|0;
}

function car25519(o) {
  var i, v, c = 1;
  for (i = 0; i < 16; i++) {
    v = o[i] + c + 65535;
    c = Math.floor(v / 65536);
    o[i] = v - c * 65536;
  }
  o[0] += c-1 + 37 * (c-1);
}

function sel25519(p, q, b) {
  var t, c = ~(b-1);
  for (var i = 0; i < 16; i++) {
    t = c & (p[i] ^ q[i]);
    p[i] ^= t;
    q[i] ^= t;
  }
}

function pack25519(o, n) {
  var i, j, b;
  var m = gf(), t = gf();
  for (i = 0; i < 16; i++) t[i] = n[i];
  car25519(t);
  car25519(t);
  car25519(t);
  for (j = 0; j < 2; j++) {
    m[0] = t[0] - 0xffed;
    for (i = 1; i < 15; i++) {
      m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1);
      m[i-1] &= 0xffff;
    }
    m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1);
    b = (m[15]>>16) & 1;
    m[14] &= 0xffff;
    sel25519(t, m, 1-b);
  }
  for (i = 0; i < 16; i++) {
    o[2*i] = t[i] & 0xff;
    o[2*i+1] = t[i]>>8;
  }
}

function neq25519(a, b) {
  var c = new Uint8Array(32), d = new Uint8Array(32);
  pack25519(c, a);
  pack25519(d, b);
  return crypto_verify_32(c, 0, d, 0);
}

function par25519(a) {
  var d = new Uint8Array(32);
  pack25519(d, a);
  return d[0] & 1;
}

function unpack25519(o, n) {
  var i;
  for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8);
  o[15] &= 0x7fff;
}

function A(o, a, b) {
  for (var i = 0; i < 16; i++) o[i] = a[i] + b[i];
}

function Z(o, a, b) {
  for (var i = 0; i < 16; i++) o[i] = a[i] - b[i];
}

function M(o, a, b) {
  var v, c,
     t0 = 0,  t1 = 0,  t2 = 0,  t3 = 0,  t4 = 0,  t5 = 0,  t6 = 0,  t7 = 0,
     t8 = 0,  t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0,
    t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0,
    t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0,
    b0 = b[0],
    b1 = b[1],
    b2 = b[2],
    b3 = b[3],
    b4 = b[4],
    b5 = b[5],
    b6 = b[6],
    b7 = b[7],
    b8 = b[8],
    b9 = b[9],
    b10 = b[10],
    b11 = b[11],
    b12 = b[12],
    b13 = b[13],
    b14 = b[14],
    b15 = b[15];

  v = a[0];
  t0 += v * b0;
  t1 += v * b1;
  t2 += v * b2;
  t3 += v * b3;
  t4 += v * b4;
  t5 += v * b5;
  t6 += v * b6;
  t7 += v * b7;
  t8 += v * b8;
  t9 += v * b9;
  t10 += v * b10;
  t11 += v * b11;
  t12 += v * b12;
  t13 += v * b13;
  t14 += v * b14;
  t15 += v * b15;
  v = a[1];
  t1 += v * b0;
  t2 += v * b1;
  t3 += v * b2;
  t4 += v * b3;
  t5 += v * b4;
  t6 += v * b5;
  t7 += v * b6;
  t8 += v * b7;
  t9 += v * b8;
  t10 += v * b9;
  t11 += v * b10;
  t12 += v * b11;
  t13 += v * b12;
  t14 += v * b13;
  t15 += v * b14;
  t16 += v * b15;
  v = a[2];
  t2 += v * b0;
  t3 += v * b1;
  t4 += v * b2;
  t5 += v * b3;
  t6 += v * b4;
  t7 += v * b5;
  t8 += v * b6;
  t9 += v * b7;
  t10 += v * b8;
  t11 += v * b9;
  t12 += v * b10;
  t13 += v * b11;
  t14 += v * b12;
  t15 += v * b13;
  t16 += v * b14;
  t17 += v * b15;
  v = a[3];
  t3 += v * b0;
  t4 += v * b1;
  t5 += v * b2;
  t6 += v * b3;
  t7 += v * b4;
  t8 += v * b5;
  t9 += v * b6;
  t10 += v * b7;
  t11 += v * b8;
  t12 += v * b9;
  t13 += v * b10;
  t14 += v * b11;
  t15 += v * b12;
  t16 += v * b13;
  t17 += v * b14;
  t18 += v * b15;
  v = a[4];
  t4 += v * b0;
  t5 += v * b1;
  t6 += v * b2;
  t7 += v * b3;
  t8 += v * b4;
  t9 += v * b5;
  t10 += v * b6;
  t11 += v * b7;
  t12 += v * b8;
  t13 += v * b9;
  t14 += v * b10;
  t15 += v * b11;
  t16 += v * b12;
  t17 += v * b13;
  t18 += v * b14;
  t19 += v * b15;
  v = a[5];
  t5 += v * b0;
  t6 += v * b1;
  t7 += v * b2;
  t8 += v * b3;
  t9 += v * b4;
  t10 += v * b5;
  t11 += v * b6;
  t12 += v * b7;
  t13 += v * b8;
  t14 += v * b9;
  t15 += v * b10;
  t16 += v * b11;
  t17 += v * b12;
  t18 += v * b13;
  t19 += v * b14;
  t20 += v * b15;
  v = a[6];
  t6 += v * b0;
  t7 += v * b1;
  t8 += v * b2;
  t9 += v * b3;
  t10 += v * b4;
  t11 += v * b5;
  t12 += v * b6;
  t13 += v * b7;
  t14 += v * b8;
  t15 += v * b9;
  t16 += v * b10;
  t17 += v * b11;
  t18 += v * b12;
  t19 += v * b13;
  t20 += v * b14;
  t21 += v * b15;
  v = a[7];
  t7 += v * b0;
  t8 += v * b1;
  t9 += v * b2;
  t10 += v * b3;
  t11 += v * b4;
  t12 += v * b5;
  t13 += v * b6;
  t14 += v * b7;
  t15 += v * b8;
  t16 += v * b9;
  t17 += v * b10;
  t18 += v * b11;
  t19 += v * b12;
  t20 += v * b13;
  t21 += v * b14;
  t22 += v * b15;
  v = a[8];
  t8 += v * b0;
  t9 += v * b1;
  t10 += v * b2;
  t11 += v * b3;
  t12 += v * b4;
  t13 += v * b5;
  t14 += v * b6;
  t15 += v * b7;
  t16 += v * b8;
  t17 += v * b9;
  t18 += v * b10;
  t19 += v * b11;
  t20 += v * b12;
  t21 += v * b13;
  t22 += v * b14;
  t23 += v * b15;
  v = a[9];
  t9 += v * b0;
  t10 += v * b1;
  t11 += v * b2;
  t12 += v * b3;
  t13 += v * b4;
  t14 += v * b5;
  t15 += v * b6;
  t16 += v * b7;
  t17 += v * b8;
  t18 += v * b9;
  t19 += v * b10;
  t20 += v * b11;
  t21 += v * b12;
  t22 += v * b13;
  t23 += v * b14;
  t24 += v * b15;
  v = a[10];
  t10 += v * b0;
  t11 += v * b1;
  t12 += v * b2;
  t13 += v * b3;
  t14 += v * b4;
  t15 += v * b5;
  t16 += v * b6;
  t17 += v * b7;
  t18 += v * b8;
  t19 += v * b9;
  t20 += v * b10;
  t21 += v * b11;
  t22 += v * b12;
  t23 += v * b13;
  t24 += v * b14;
  t25 += v * b15;
  v = a[11];
  t11 += v * b0;
  t12 += v * b1;
  t13 += v * b2;
  t14 += v * b3;
  t15 += v * b4;
  t16 += v * b5;
  t17 += v * b6;
  t18 += v * b7;
  t19 += v * b8;
  t20 += v * b9;
  t21 += v * b10;
  t22 += v * b11;
  t23 += v * b12;
  t24 += v * b13;
  t25 += v * b14;
  t26 += v * b15;
  v = a[12];
  t12 += v * b0;
  t13 += v * b1;
  t14 += v * b2;
  t15 += v * b3;
  t16 += v * b4;
  t17 += v * b5;
  t18 += v * b6;
  t19 += v * b7;
  t20 += v * b8;
  t21 += v * b9;
  t22 += v * b10;
  t23 += v * b11;
  t24 += v * b12;
  t25 += v * b13;
  t26 += v * b14;
  t27 += v * b15;
  v = a[13];
  t13 += v * b0;
  t14 += v * b1;
  t15 += v * b2;
  t16 += v * b3;
  t17 += v * b4;
  t18 += v * b5;
  t19 += v * b6;
  t20 += v * b7;
  t21 += v * b8;
  t22 += v * b9;
  t23 += v * b10;
  t24 += v * b11;
  t25 += v * b12;
  t26 += v * b13;
  t27 += v * b14;
  t28 += v * b15;
  v = a[14];
  t14 += v * b0;
  t15 += v * b1;
  t16 += v * b2;
  t17 += v * b3;
  t18 += v * b4;
  t19 += v * b5;
  t20 += v * b6;
  t21 += v * b7;
  t22 += v * b8;
  t23 += v * b9;
  t24 += v * b10;
  t25 += v * b11;
  t26 += v * b12;
  t27 += v * b13;
  t28 += v * b14;
  t29 += v * b15;
  v = a[15];
  t15 += v * b0;
  t16 += v * b1;
  t17 += v * b2;
  t18 += v * b3;
  t19 += v * b4;
  t20 += v * b5;
  t21 += v * b6;
  t22 += v * b7;
  t23 += v * b8;
  t24 += v * b9;
  t25 += v * b10;
  t26 += v * b11;
  t27 += v * b12;
  t28 += v * b13;
  t29 += v * b14;
  t30 += v * b15;

  t0  += 38 * t16;
  t1  += 38 * t17;
  t2  += 38 * t18;
  t3  += 38 * t19;
  t4  += 38 * t20;
  t5  += 38 * t21;
  t6  += 38 * t22;
  t7  += 38 * t23;
  t8  += 38 * t24;
  t9  += 38 * t25;
  t10 += 38 * t26;
  t11 += 38 * t27;
  t12 += 38 * t28;
  t13 += 38 * t29;
  t14 += 38 * t30;
  // t15 left as is

  // first car
  c = 1;
  v =  t0 + c + 65535; c = Math.floor(v / 65536);  t0 = v - c * 65536;
  v =  t1 + c + 65535; c = Math.floor(v / 65536);  t1 = v - c * 65536;
  v =  t2 + c + 65535; c = Math.floor(v / 65536);  t2 = v - c * 65536;
  v =  t3 + c + 65535; c = Math.floor(v / 65536);  t3 = v - c * 65536;
  v =  t4 + c + 65535; c = Math.floor(v / 65536);  t4 = v - c * 65536;
  v =  t5 + c + 65535; c = Math.floor(v / 65536);  t5 = v - c * 65536;
  v =  t6 + c + 65535; c = Math.floor(v / 65536);  t6 = v - c * 65536;
  v =  t7 + c + 65535; c = Math.floor(v / 65536);  t7 = v - c * 65536;
  v =  t8 + c + 65535; c = Math.floor(v / 65536);  t8 = v - c * 65536;
  v =  t9 + c + 65535; c = Math.floor(v / 65536);  t9 = v - c * 65536;
  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;
  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;
  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;
  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;
  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;
  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;
  t0 += c-1 + 37 * (c-1);

  // second car
  c = 1;
  v =  t0 + c + 65535; c = Math.floor(v / 65536);  t0 = v - c * 65536;
  v =  t1 + c + 65535; c = Math.floor(v / 65536);  t1 = v - c * 65536;
  v =  t2 + c + 65535; c = Math.floor(v / 65536);  t2 = v - c * 65536;
  v =  t3 + c + 65535; c = Math.floor(v / 65536);  t3 = v - c * 65536;
  v =  t4 + c + 65535; c = Math.floor(v / 65536);  t4 = v - c * 65536;
  v =  t5 + c + 65535; c = Math.floor(v / 65536);  t5 = v - c * 65536;
  v =  t6 + c + 65535; c = Math.floor(v / 65536);  t6 = v - c * 65536;
  v =  t7 + c + 65535; c = Math.floor(v / 65536);  t7 = v - c * 65536;
  v =  t8 + c + 65535; c = Math.floor(v / 65536);  t8 = v - c * 65536;
  v =  t9 + c + 65535; c = Math.floor(v / 65536);  t9 = v - c * 65536;
  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;
  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;
  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;
  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;
  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;
  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;
  t0 += c-1 + 37 * (c-1);

  o[ 0] = t0;
  o[ 1] = t1;
  o[ 2] = t2;
  o[ 3] = t3;
  o[ 4] = t4;
  o[ 5] = t5;
  o[ 6] = t6;
  o[ 7] = t7;
  o[ 8] = t8;
  o[ 9] = t9;
  o[10] = t10;
  o[11] = t11;
  o[12] = t12;
  o[13] = t13;
  o[14] = t14;
  o[15] = t15;
}

function S(o, a) {
  M(o, a, a);
}

function inv25519(o, i) {
  var c = gf();
  var a;
  for (a = 0; a < 16; a++) c[a] = i[a];
  for (a = 253; a >= 0; a--) {
    S(c, c);
    if(a !== 2 && a !== 4) M(c, c, i);
  }
  for (a = 0; a < 16; a++) o[a] = c[a];
}

function pow2523(o, i) {
  var c = gf();
  var a;
  for (a = 0; a < 16; a++) c[a] = i[a];
  for (a = 250; a >= 0; a--) {
      S(c, c);
      if(a !== 1) M(c, c, i);
  }
  for (a = 0; a < 16; a++) o[a] = c[a];
}

function crypto_scalarmult(q, n, p) {
  var z = new Uint8Array(32);
  var x = new Float64Array(80), r, i;
  var a = gf(), b = gf(), c = gf(),
      d = gf(), e = gf(), f = gf();
  for (i = 0; i < 31; i++) z[i] = n[i];
  z[31]=(n[31]&127)|64;
  z[0]&=248;
  unpack25519(x,p);
  for (i = 0; i < 16; i++) {
    b[i]=x[i];
    d[i]=a[i]=c[i]=0;
  }
  a[0]=d[0]=1;
  for (i=254; i>=0; --i) {
    r=(z[i>>>3]>>>(i&7))&1;
    sel25519(a,b,r);
    sel25519(c,d,r);
    A(e,a,c);
    Z(a,a,c);
    A(c,b,d);
    Z(b,b,d);
    S(d,e);
    S(f,a);
    M(a,c,a);
    M(c,b,e);
    A(e,a,c);
    Z(a,a,c);
    S(b,a);
    Z(c,d,f);
    M(a,c,_121665);
    A(a,a,d);
    M(c,c,a);
    M(a,d,f);
    M(d,b,x);
    S(b,e);
    sel25519(a,b,r);
    sel25519(c,d,r);
  }
  for (i = 0; i < 16; i++) {
    x[i+16]=a[i];
    x[i+32]=c[i];
    x[i+48]=b[i];
    x[i+64]=d[i];
  }
  var x32 = x.subarray(32);
  var x16 = x.subarray(16);
  inv25519(x32,x32);
  M(x16,x16,x32);
  pack25519(q,x16);
  return 0;
}

function crypto_scalarmult_base(q, n) {
  return crypto_scalarmult(q, n, _9);
}

function crypto_box_keypair(y, x) {
  randombytes(x, 32);
  return crypto_scalarmult_base(y, x);
}

function crypto_box_beforenm(k, y, x) {
  var s = new Uint8Array(32);
  crypto_scalarmult(s, x, y);
  return crypto_core_hsalsa20(k, _0, s, sigma);
}

var crypto_box_afternm = crypto_secretbox;
var crypto_box_open_afternm = crypto_secretbox_open;

function crypto_box(c, m, d, n, y, x) {
  var k = new Uint8Array(32);
  crypto_box_beforenm(k, y, x);
  return crypto_box_afternm(c, m, d, n, k);
}

function crypto_box_open(m, c, d, n, y, x) {
  var k = new Uint8Array(32);
  crypto_box_beforenm(k, y, x);
  return crypto_box_open_afternm(m, c, d, n, k);
}

var K = [
  0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,
  0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,
  0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,
  0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,
  0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,
  0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,
  0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,
  0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,
  0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,
  0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,
  0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,
  0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,
  0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,
  0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,
  0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,
  0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,
  0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,
  0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,
  0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,
  0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,
  0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,
  0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,
  0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,
  0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,
  0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,
  0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,
  0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,
  0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,
  0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,
  0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,
  0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,
  0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,
  0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,
  0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,
  0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,
  0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,
  0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,
  0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,
  0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,
  0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817
];

function crypto_hashblocks_hl(hh, hl, m, n) {
  var wh = new Int32Array(16), wl = new Int32Array(16),
      bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7,
      bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7,
      th, tl, i, j, h, l, a, b, c, d;

  var ah0 = hh[0],
      ah1 = hh[1],
      ah2 = hh[2],
      ah3 = hh[3],
      ah4 = hh[4],
      ah5 = hh[5],
      ah6 = hh[6],
      ah7 = hh[7],

      al0 = hl[0],
      al1 = hl[1],
      al2 = hl[2],
      al3 = hl[3],
      al4 = hl[4],
      al5 = hl[5],
      al6 = hl[6],
      al7 = hl[7];

  var pos = 0;
  while (n >= 128) {
    for (i = 0; i < 16; i++) {
      j = 8 * i + pos;
      wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3];
      wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7];
    }
    for (i = 0; i < 80; i++) {
      bh0 = ah0;
      bh1 = ah1;
      bh2 = ah2;
      bh3 = ah3;
      bh4 = ah4;
      bh5 = ah5;
      bh6 = ah6;
      bh7 = ah7;

      bl0 = al0;
      bl1 = al1;
      bl2 = al2;
      bl3 = al3;
      bl4 = al4;
      bl5 = al5;
      bl6 = al6;
      bl7 = al7;

      // add
      h = ah7;
      l = al7;

      a = l & 0xffff; b = l >>> 16;
      c = h & 0xffff; d = h >>> 16;

      // Sigma1
      h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32))));
      l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32))));

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      // Ch
      h = (ah4 & ah5) ^ (~ah4 & ah6);
      l = (al4 & al5) ^ (~al4 & al6);

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      // K
      h = K[i*2];
      l = K[i*2+1];

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      // w
      h = wh[i%16];
      l = wl[i%16];

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      b += a >>> 16;
      c += b >>> 16;
      d += c >>> 16;

      th = c & 0xffff | d << 16;
      tl = a & 0xffff | b << 16;

      // add
      h = th;
      l = tl;

      a = l & 0xffff; b = l >>> 16;
      c = h & 0xffff; d = h >>> 16;

      // Sigma0
      h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32))));
      l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32))));

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      // Maj
      h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2);
      l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2);

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      b += a >>> 16;
      c += b >>> 16;
      d += c >>> 16;

      bh7 = (c & 0xffff) | (d << 16);
      bl7 = (a & 0xffff) | (b << 16);

      // add
      h = bh3;
      l = bl3;

      a = l & 0xffff; b = l >>> 16;
      c = h & 0xffff; d = h >>> 16;

      h = th;
      l = tl;

      a += l & 0xffff; b += l >>> 16;
      c += h & 0xffff; d += h >>> 16;

      b += a >>> 16;
      c += b >>> 16;
      d += c >>> 16;

      bh3 = (c & 0xffff) | (d << 16);
      bl3 = (a & 0xffff) | (b << 16);

      ah1 = bh0;
      ah2 = bh1;
      ah3 = bh2;
      ah4 = bh3;
      ah5 = bh4;
      ah6 = bh5;
      ah7 = bh6;
      ah0 = bh7;

      al1 = bl0;
      al2 = bl1;
      al3 = bl2;
      al4 = bl3;
      al5 = bl4;
      al6 = bl5;
      al7 = bl6;
      al0 = bl7;

      if (i%16 === 15) {
        for (j = 0; j < 16; j++) {
          // add
          h = wh[j];
          l = wl[j];

          a = l & 0xffff; b = l >>> 16;
          c = h & 0xffff; d = h >>> 16;

          h = wh[(j+9)%16];
          l = wl[(j+9)%16];

          a += l & 0xffff; b += l >>> 16;
          c += h & 0xffff; d += h >>> 16;

          // sigma0
          th = wh[(j+1)%16];
          tl = wl[(j+1)%16];
          h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7);
          l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7)));

          a += l & 0xffff; b += l >>> 16;
          c += h & 0xffff; d += h >>> 16;

          // sigma1
          th = wh[(j+14)%16];
          tl = wl[(j+14)%16];
          h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6);
          l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6)));

          a += l & 0xffff; b += l >>> 16;
          c += h & 0xffff; d += h >>> 16;

          b += a >>> 16;
          c += b >>> 16;
          d += c >>> 16;

          wh[j] = (c & 0xffff) | (d << 16);
          wl[j] = (a & 0xffff) | (b << 16);
        }
      }
    }

    // add
    h = ah0;
    l = al0;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[0];
    l = hl[0];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[0] = ah0 = (c & 0xffff) | (d << 16);
    hl[0] = al0 = (a & 0xffff) | (b << 16);

    h = ah1;
    l = al1;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[1];
    l = hl[1];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[1] = ah1 = (c & 0xffff) | (d << 16);
    hl[1] = al1 = (a & 0xffff) | (b << 16);

    h = ah2;
    l = al2;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[2];
    l = hl[2];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[2] = ah2 = (c & 0xffff) | (d << 16);
    hl[2] = al2 = (a & 0xffff) | (b << 16);

    h = ah3;
    l = al3;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[3];
    l = hl[3];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[3] = ah3 = (c & 0xffff) | (d << 16);
    hl[3] = al3 = (a & 0xffff) | (b << 16);

    h = ah4;
    l = al4;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[4];
    l = hl[4];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[4] = ah4 = (c & 0xffff) | (d << 16);
    hl[4] = al4 = (a & 0xffff) | (b << 16);

    h = ah5;
    l = al5;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[5];
    l = hl[5];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[5] = ah5 = (c & 0xffff) | (d << 16);
    hl[5] = al5 = (a & 0xffff) | (b << 16);

    h = ah6;
    l = al6;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[6];
    l = hl[6];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[6] = ah6 = (c & 0xffff) | (d << 16);
    hl[6] = al6 = (a & 0xffff) | (b << 16);

    h = ah7;
    l = al7;

    a = l & 0xffff; b = l >>> 16;
    c = h & 0xffff; d = h >>> 16;

    h = hh[7];
    l = hl[7];

    a += l & 0xffff; b += l >>> 16;
    c += h & 0xffff; d += h >>> 16;

    b += a >>> 16;
    c += b >>> 16;
    d += c >>> 16;

    hh[7] = ah7 = (c & 0xffff) | (d << 16);
    hl[7] = al7 = (a & 0xffff) | (b << 16);

    pos += 128;
    n -= 128;
  }

  return n;
}

function crypto_hash(out, m, n) {
  var hh = new Int32Array(8),
      hl = new Int32Array(8),
      x = new Uint8Array(256),
      i, b = n;

  hh[0] = 0x6a09e667;
  hh[1] = 0xbb67ae85;
  hh[2] = 0x3c6ef372;
  hh[3] = 0xa54ff53a;
  hh[4] = 0x510e527f;
  hh[5] = 0x9b05688c;
  hh[6] = 0x1f83d9ab;
  hh[7] = 0x5be0cd19;

  hl[0] = 0xf3bcc908;
  hl[1] = 0x84caa73b;
  hl[2] = 0xfe94f82b;
  hl[3] = 0x5f1d36f1;
  hl[4] = 0xade682d1;
  hl[5] = 0x2b3e6c1f;
  hl[6] = 0xfb41bd6b;
  hl[7] = 0x137e2179;

  crypto_hashblocks_hl(hh, hl, m, n);
  n %= 128;

  for (i = 0; i < n; i++) x[i] = m[b-n+i];
  x[n] = 128;

  n = 256-128*(n<112?1:0);
  x[n-9] = 0;
  ts64(x, n-8,  (b / 0x20000000) | 0, b << 3);
  crypto_hashblocks_hl(hh, hl, x, n);

  for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]);

  return 0;
}

function add(p, q) {
  var a = gf(), b = gf(), c = gf(),
      d = gf(), e = gf(), f = gf(),
      g = gf(), h = gf(), t = gf();

  Z(a, p[1], p[0]);
  Z(t, q[1], q[0]);
  M(a, a, t);
  A(b, p[0], p[1]);
  A(t, q[0], q[1]);
  M(b, b, t);
  M(c, p[3], q[3]);
  M(c, c, D2);
  M(d, p[2], q[2]);
  A(d, d, d);
  Z(e, b, a);
  Z(f, d, c);
  A(g, d, c);
  A(h, b, a);

  M(p[0], e, f);
  M(p[1], h, g);
  M(p[2], g, f);
  M(p[3], e, h);
}

function cswap(p, q, b) {
  var i;
  for (i = 0; i < 4; i++) {
    sel25519(p[i], q[i], b);
  }
}

function pack(r, p) {
  var tx = gf(), ty = gf(), zi = gf();
  inv25519(zi, p[2]);
  M(tx, p[0], zi);
  M(ty, p[1], zi);
  pack25519(r, ty);
  r[31] ^= par25519(tx) << 7;
}

function scalarmult(p, q, s) {
  var b, i;
  set25519(p[0], gf0);
  set25519(p[1], gf1);
  set25519(p[2], gf1);
  set25519(p[3], gf0);
  for (i = 255; i >= 0; --i) {
    b = (s[(i/8)|0] >> (i&7)) & 1;
    cswap(p, q, b);
    add(q, p);
    add(p, p);
    cswap(p, q, b);
  }
}

function scalarbase(p, s) {
  var q = [gf(), gf(), gf(), gf()];
  set25519(q[0], X);
  set25519(q[1], Y);
  set25519(q[2], gf1);
  M(q[3], X, Y);
  scalarmult(p, q, s);
}

function crypto_sign_keypair(pk, sk, seeded) {
  var d = new Uint8Array(64);
  var p = [gf(), gf(), gf(), gf()];
  var i;

  if (!seeded) randombytes(sk, 32);
  crypto_hash(d, sk, 32);
  d[0] &= 248;
  d[31] &= 127;
  d[31] |= 64;

  scalarbase(p, d);
  pack(pk, p);

  for (i = 0; i < 32; i++) sk[i+32] = pk[i];
  return 0;
}

var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);

function modL(r, x) {
  var carry, i, j, k;
  for (i = 63; i >= 32; --i) {
    carry = 0;
    for (j = i - 32, k = i - 12; j < k; ++j) {
      x[j] += carry - 16 * x[i] * L[j - (i - 32)];
      carry = (x[j] + 128) >> 8;
      x[j] -= carry * 256;
    }
    x[j] += carry;
    x[i] = 0;
  }
  carry = 0;
  for (j = 0; j < 32; j++) {
    x[j] += carry - (x[31] >> 4) * L[j];
    carry = x[j] >> 8;
    x[j] &= 255;
  }
  for (j = 0; j < 32; j++) x[j] -= carry * L[j];
  for (i = 0; i < 32; i++) {
    x[i+1] += x[i] >> 8;
    r[i] = x[i] & 255;
  }
}

function reduce(r) {
  var x = new Float64Array(64), i;
  for (i = 0; i < 64; i++) x[i] = r[i];
  for (i = 0; i < 64; i++) r[i] = 0;
  modL(r, x);
}

// Note: difference from C - smlen returned, not passed as argument.
function crypto_sign(sm, m, n, sk) {
  var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);
  var i, j, x = new Float64Array(64);
  var p = [gf(), gf(), gf(), gf()];

  crypto_hash(d, sk, 32);
  d[0] &= 248;
  d[31] &= 127;
  d[31] |= 64;

  var smlen = n + 64;
  for (i = 0; i < n; i++) sm[64 + i] = m[i];
  for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];

  crypto_hash(r, sm.subarray(32), n+32);
  reduce(r);
  scalarbase(p, r);
  pack(sm, p);

  for (i = 32; i < 64; i++) sm[i] = sk[i];
  crypto_hash(h, sm, n + 64);
  reduce(h);

  for (i = 0; i < 64; i++) x[i] = 0;
  for (i = 0; i < 32; i++) x[i] = r[i];
  for (i = 0; i < 32; i++) {
    for (j = 0; j < 32; j++) {
      x[i+j] += h[i] * d[j];
    }
  }

  modL(sm.subarray(32), x);
  return smlen;
}

function unpackneg(r, p) {
  var t = gf(), chk = gf(), num = gf(),
      den = gf(), den2 = gf(), den4 = gf(),
      den6 = gf();

  set25519(r[2], gf1);
  unpack25519(r[1], p);
  S(num, r[1]);
  M(den, num, D);
  Z(num, num, r[2]);
  A(den, r[2], den);

  S(den2, den);
  S(den4, den2);
  M(den6, den4, den2);
  M(t, den6, num);
  M(t, t, den);

  pow2523(t, t);
  M(t, t, num);
  M(t, t, den);
  M(t, t, den);
  M(r[0], t, den);

  S(chk, r[0]);
  M(chk, chk, den);
  if (neq25519(chk, num)) M(r[0], r[0], I);

  S(chk, r[0]);
  M(chk, chk, den);
  if (neq25519(chk, num)) return -1;

  if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]);

  M(r[3], r[0], r[1]);
  return 0;
}

function crypto_sign_open(m, sm, n, pk) {
  var i, mlen;
  var t = new Uint8Array(32), h = new Uint8Array(64);
  var p = [gf(), gf(), gf(), gf()],
      q = [gf(), gf(), gf(), gf()];

  mlen = -1;
  if (n < 64) return -1;

  if (unpackneg(q, pk)) return -1;

  for (i = 0; i < n; i++) m[i] = sm[i];
  for (i = 0; i < 32; i++) m[i+32] = pk[i];
  crypto_hash(h, m, n);
  reduce(h);
  scalarmult(p, q, h);

  scalarbase(q, sm.subarray(32));
  add(p, q);
  pack(t, p);

  n -= 64;
  if (crypto_verify_32(sm, 0, t, 0)) {
    for (i = 0; i < n; i++) m[i] = 0;
    return -1;
  }

  for (i = 0; i < n; i++) m[i] = sm[i + 64];
  mlen = n;
  return mlen;
}

var crypto_secretbox_KEYBYTES = 32,
    crypto_secretbox_NONCEBYTES = 24,
    crypto_secretbox_ZEROBYTES = 32,
    crypto_secretbox_BOXZEROBYTES = 16,
    crypto_scalarmult_BYTES = 32,
    crypto_scalarmult_SCALARBYTES = 32,
    crypto_box_PUBLICKEYBYTES = 32,
    crypto_box_SECRETKEYBYTES = 32,
    crypto_box_BEFORENMBYTES = 32,
    crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES,
    crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES,
    crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES,
    crypto_sign_BYTES = 64,
    crypto_sign_PUBLICKEYBYTES = 32,
    crypto_sign_SECRETKEYBYTES = 64,
    crypto_sign_SEEDBYTES = 32,
    crypto_hash_BYTES = 64;

nacl.lowlevel = {
  crypto_core_hsalsa20: crypto_core_hsalsa20,
  crypto_stream_xor: crypto_stream_xor,
  crypto_stream: crypto_stream,
  crypto_stream_salsa20_xor: crypto_stream_salsa20_xor,
  crypto_stream_salsa20: crypto_stream_salsa20,
  crypto_onetimeauth: crypto_onetimeauth,
  crypto_onetimeauth_verify: crypto_onetimeauth_verify,
  crypto_verify_16: crypto_verify_16,
  crypto_verify_32: crypto_verify_32,
  crypto_secretbox: crypto_secretbox,
  crypto_secretbox_open: crypto_secretbox_open,
  crypto_scalarmult: crypto_scalarmult,
  crypto_scalarmult_base: crypto_scalarmult_base,
  crypto_box_beforenm: crypto_box_beforenm,
  crypto_box_afternm: crypto_box_afternm,
  crypto_box: crypto_box,
  crypto_box_open: crypto_box_open,
  crypto_box_keypair: crypto_box_keypair,
  crypto_hash: crypto_hash,
  crypto_sign: crypto_sign,
  crypto_sign_keypair: crypto_sign_keypair,
  crypto_sign_open: crypto_sign_open,

  crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES,
  crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES,
  crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES,
  crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES,
  crypto_scalarmult_BYTES: crypto_scalarmult_BYTES,
  crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES,
  crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES,
  crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES,
  crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES,
  crypto_box_NONCEBYTES: crypto_box_NONCEBYTES,
  crypto_box_ZEROBYTES: crypto_box_ZEROBYTES,
  crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES,
  crypto_sign_BYTES: crypto_sign_BYTES,
  crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES,
  crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES,
  crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES,
  crypto_hash_BYTES: crypto_hash_BYTES
};

/* High-level API */

function checkLengths(k, n) {
  if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size');
  if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size');
}

function checkBoxLengths(pk, sk) {
  if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size');
  if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size');
}

function checkArrayTypes() {
  var t, i;
  for (i = 0; i < arguments.length; i++) {
     if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]')
       throw new TypeError('unexpected type ' + t + ', use Uint8Array');
  }
}

function cleanup(arr) {
  for (var i = 0; i < arr.length; i++) arr[i] = 0;
}

// TODO: Completely remove this in v0.15.
if (!nacl.util) {
  nacl.util = {};
  nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() {
    throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js');
  };
}

nacl.randomBytes = function(n) {
  var b = new Uint8Array(n);
  randombytes(b, n);
  return b;
};

nacl.secretbox = function(msg, nonce, key) {
  checkArrayTypes(msg, nonce, key);
  checkLengths(key, nonce);
  var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);
  var c = new Uint8Array(m.length);
  for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i];
  crypto_secretbox(c, m, m.length, nonce, key);
  return c.subarray(crypto_secretbox_BOXZEROBYTES);
};

nacl.secretbox.open = function(box, nonce, key) {
  checkArrayTypes(box, nonce, key);
  checkLengths(key, nonce);
  var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);
  var m = new Uint8Array(c.length);
  for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i];
  if (c.length < 32) return false;
  if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false;
  return m.subarray(crypto_secretbox_ZEROBYTES);
};

nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES;
nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES;
nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES;

nacl.scalarMult = function(n, p) {
  checkArrayTypes(n, p);
  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');
  if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size');
  var q = new Uint8Array(crypto_scalarmult_BYTES);
  crypto_scalarmult(q, n, p);
  return q;
};

nacl.scalarMult.base = function(n) {
  checkArrayTypes(n);
  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');
  var q = new Uint8Array(crypto_scalarmult_BYTES);
  crypto_scalarmult_base(q, n);
  return q;
};

nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES;
nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES;

nacl.box = function(msg, nonce, publicKey, secretKey) {
  var k = nacl.box.before(publicKey, secretKey);
  return nacl.secretbox(msg, nonce, k);
};

nacl.box.before = function(publicKey, secretKey) {
  checkArrayTypes(publicKey, secretKey);
  checkBoxLengths(publicKey, secretKey);
  var k = new Uint8Array(crypto_box_BEFORENMBYTES);
  crypto_box_beforenm(k, publicKey, secretKey);
  return k;
};

nacl.box.after = nacl.secretbox;

nacl.box.open = function(msg, nonce, publicKey, secretKey) {
  var k = nacl.box.before(publicKey, secretKey);
  return nacl.secretbox.open(msg, nonce, k);
};

nacl.box.open.after = nacl.secretbox.open;

nacl.box.keyPair = function() {
  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
  var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);
  crypto_box_keypair(pk, sk);
  return {publicKey: pk, secretKey: sk};
};

nacl.box.keyPair.fromSecretKey = function(secretKey) {
  checkArrayTypes(secretKey);
  if (secretKey.length !== crypto_box_SECRETKEYBYTES)
    throw new Error('bad secret key size');
  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
  crypto_scalarmult_base(pk, secretKey);
  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};
};

nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES;
nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES;
nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES;
nacl.box.nonceLength = crypto_box_NONCEBYTES;
nacl.box.overheadLength = nacl.secretbox.overheadLength;

nacl.sign = function(msg, secretKey) {
  checkArrayTypes(msg, secretKey);
  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
    throw new Error('bad secret key size');
  var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length);
  crypto_sign(signedMsg, msg, msg.length, secretKey);
  return signedMsg;
};

nacl.sign.open = function(signedMsg, publicKey) {
  if (arguments.length !== 2)
    throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?');
  checkArrayTypes(signedMsg, publicKey);
  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
    throw new Error('bad public key size');
  var tmp = new Uint8Array(signedMsg.length);
  var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);
  if (mlen < 0) return null;
  var m = new Uint8Array(mlen);
  for (var i = 0; i < m.length; i++) m[i] = tmp[i];
  return m;
};

nacl.sign.detached = function(msg, secretKey) {
  var signedMsg = nacl.sign(msg, secretKey);
  var sig = new Uint8Array(crypto_sign_BYTES);
  for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];
  return sig;
};

nacl.sign.detached.verify = function(msg, sig, publicKey) {
  checkArrayTypes(msg, sig, publicKey);
  if (sig.length !== crypto_sign_BYTES)
    throw new Error('bad signature size');
  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
    throw new Error('bad public key size');
  var sm = new Uint8Array(crypto_sign_BYTES + msg.length);
  var m = new Uint8Array(crypto_sign_BYTES + msg.length);
  var i;
  for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];
  for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i];
  return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);
};

nacl.sign.keyPair = function() {
  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
  crypto_sign_keypair(pk, sk);
  return {publicKey: pk, secretKey: sk};
};

nacl.sign.keyPair.fromSecretKey = function(secretKey) {
  checkArrayTypes(secretKey);
  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
    throw new Error('bad secret key size');
  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
  for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i];
  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};
};

nacl.sign.keyPair.fromSeed = function(seed) {
  checkArrayTypes(seed);
  if (seed.length !== crypto_sign_SEEDBYTES)
    throw new Error('bad seed size');
  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
  for (var i = 0; i < 32; i++) sk[i] = seed[i];
  crypto_sign_keypair(pk, sk, true);
  return {publicKey: pk, secretKey: sk};
};

nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES;
nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES;
nacl.sign.seedLength = crypto_sign_SEEDBYTES;
nacl.sign.signatureLength = crypto_sign_BYTES;

nacl.hash = function(msg) {
  checkArrayTypes(msg);
  var h = new Uint8Array(crypto_hash_BYTES);
  crypto_hash(h, msg, msg.length);
  return h;
};

nacl.hash.hashLength = crypto_hash_BYTES;

nacl.verify = function(x, y) {
  checkArrayTypes(x, y);
  // Zero length arguments are considered not equal.
  if (x.length === 0 || y.length === 0) return false;
  if (x.length !== y.length) return false;
  return (vn(x, 0, y, 0, x.length) === 0) ? true : false;
};

nacl.setPRNG = function(fn) {
  randombytes = fn;
};

(function() {
  // Initialize PRNG if environment provides CSPRNG.
  // If not, methods calling randombytes will throw.
  var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null;
  if (crypto && crypto.getRandomValues) {
    // Browsers.
    var QUOTA = 65536;
    nacl.setPRNG(function(x, n) {
      var i, v = new Uint8Array(n);
      for (i = 0; i < n; i += QUOTA) {
        crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));
      }
      for (i = 0; i < n; i++) x[i] = v[i];
      cleanup(v);
    });
  } else if (typeof require !== 'undefined') {
    // Node.js.
    crypto = require('crypto');
    if (crypto && crypto.randomBytes) {
      nacl.setPRNG(function(x, n) {
        var i, v = crypto.randomBytes(n);
        for (i = 0; i < n; i++) x[i] = v[i];
        cleanup(v);
      });
    }
  }
})();

})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {}));
!function(r){"use strict";function t(r,t,n,e){r[t]=n>>24&255,r[t+1]=n>>16&255,r[t+2]=n>>8&255,r[t+3]=255&n,r[t+4]=e>>24&255,r[t+5]=e>>16&255,r[t+6]=e>>8&255,r[t+7]=255&e}function n(r,t,n,e,o){var i,h=0;for(i=0;i<o;i++)h|=r[t+i]^n[e+i];return(1&h-1>>>8)-1}function e(r,t,e,o){return n(r,t,e,o,16)}function o(r,t,e,o){return n(r,t,e,o,32)}function i(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,c=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,u=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,v=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,b=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,g=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,_=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,d=i,U=h,E=a,x=f,M=s,m=c,B=u,S=y,K=l,T=w,Y=p,k=v,L=b,z=g,R=_,P=A,O=0;O<20;O+=2)o=d+L|0,M^=o<<7|o>>>25,o=M+d|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,d^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,z^=o<<9|o>>>23,o=z+T|0,U^=o<<13|o>>>19,o=U+z|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=P+k|0,x^=o<<7|o>>>25,o=x+P|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,P^=o<<18|o>>>14,o=d+x|0,U^=o<<7|o>>>25,o=U+d|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,d^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=P+R|0,L^=o<<7|o>>>25,o=L+P|0,z^=o<<9|o>>>23,o=z+L|0,R^=o<<13|o>>>19,o=R+z|0,P^=o<<18|o>>>14;d=d+i|0,U=U+h|0,E=E+a|0,x=x+f|0,M=M+s|0,m=m+c|0,B=B+u|0,S=S+y|0,K=K+l|0,T=T+w|0,Y=Y+p|0,k=k+v|0,L=L+b|0,z=z+g|0,R=R+_|0,P=P+A|0,r[0]=d>>>0&255,r[1]=d>>>8&255,r[2]=d>>>16&255,r[3]=d>>>24&255,r[4]=U>>>0&255,r[5]=U>>>8&255,r[6]=U>>>16&255,r[7]=U>>>24&255,r[8]=E>>>0&255,r[9]=E>>>8&255,r[10]=E>>>16&255,r[11]=E>>>24&255,r[12]=x>>>0&255,r[13]=x>>>8&255,r[14]=x>>>16&255,r[15]=x>>>24&255,r[16]=M>>>0&255,r[17]=M>>>8&255,r[18]=M>>>16&255,r[19]=M>>>24&255,r[20]=m>>>0&255,r[21]=m>>>8&255,r[22]=m>>>16&255,r[23]=m>>>24&255,r[24]=B>>>0&255,r[25]=B>>>8&255,r[26]=B>>>16&255,r[27]=B>>>24&255,r[28]=S>>>0&255,r[29]=S>>>8&255,r[30]=S>>>16&255,r[31]=S>>>24&255,r[32]=K>>>0&255,r[33]=K>>>8&255,r[34]=K>>>16&255,r[35]=K>>>24&255,r[36]=T>>>0&255,r[37]=T>>>8&255,r[38]=T>>>16&255,r[39]=T>>>24&255,r[40]=Y>>>0&255,r[41]=Y>>>8&255,r[42]=Y>>>16&255,r[43]=Y>>>24&255,r[44]=k>>>0&255,r[45]=k>>>8&255,r[46]=k>>>16&255,r[47]=k>>>24&255,r[48]=L>>>0&255,r[49]=L>>>8&255,r[50]=L>>>16&255,r[51]=L>>>24&255,r[52]=z>>>0&255,r[53]=z>>>8&255,r[54]=z>>>16&255,r[55]=z>>>24&255,r[56]=R>>>0&255,r[57]=R>>>8&255,r[58]=R>>>16&255,r[59]=R>>>24&255,r[60]=P>>>0&255,r[61]=P>>>8&255,r[62]=P>>>16&255,r[63]=P>>>24&255}function h(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,c=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,u=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,v=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,b=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,g=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,_=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,d=i,U=h,E=a,x=f,M=s,m=c,B=u,S=y,K=l,T=w,Y=p,k=v,L=b,z=g,R=_,P=A,O=0;O<20;O+=2)o=d+L|0,M^=o<<7|o>>>25,o=M+d|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,d^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,z^=o<<9|o>>>23,o=z+T|0,U^=o<<13|o>>>19,o=U+z|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=P+k|0,x^=o<<7|o>>>25,o=x+P|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,P^=o<<18|o>>>14,o=d+x|0,U^=o<<7|o>>>25,o=U+d|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,d^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=P+R|0,L^=o<<7|o>>>25,o=L+P|0,z^=o<<9|o>>>23,o=z+L|0,R^=o<<13|o>>>19,o=R+z|0,P^=o<<18|o>>>14;r[0]=d>>>0&255,r[1]=d>>>8&255,r[2]=d>>>16&255,r[3]=d>>>24&255,r[4]=m>>>0&255,r[5]=m>>>8&255,r[6]=m>>>16&255,r[7]=m>>>24&255,r[8]=Y>>>0&255,r[9]=Y>>>8&255,r[10]=Y>>>16&255,r[11]=Y>>>24&255,r[12]=P>>>0&255,r[13]=P>>>8&255,r[14]=P>>>16&255,r[15]=P>>>24&255,r[16]=B>>>0&255,r[17]=B>>>8&255,r[18]=B>>>16&255,r[19]=B>>>24&255,r[20]=S>>>0&255,r[21]=S>>>8&255,r[22]=S>>>16&255,r[23]=S>>>24&255,r[24]=K>>>0&255,r[25]=K>>>8&255,r[26]=K>>>16&255,r[27]=K>>>24&255,r[28]=T>>>0&255,r[29]=T>>>8&255,r[30]=T>>>16&255,r[31]=T>>>24&255}function a(r,t,n,e){i(r,t,n,e)}function f(r,t,n,e){h(r,t,n,e)}function s(r,t,n,e,o,i,h){var f,s,c=new Uint8Array(16),u=new Uint8Array(64);for(s=0;s<16;s++)c[s]=0;for(s=0;s<8;s++)c[s]=i[s];for(;o>=64;){for(a(u,c,h,ur),s=0;s<64;s++)r[t+s]=n[e+s]^u[s];for(f=1,s=8;s<16;s++)f=f+(255&c[s])|0,c[s]=255&f,f>>>=8;o-=64,t+=64,e+=64}if(o>0)for(a(u,c,h,ur),s=0;s<o;s++)r[t+s]=n[e+s]^u[s];return 0}function c(r,t,n,e,o){var i,h,f=new Uint8Array(16),s=new Uint8Array(64);for(h=0;h<16;h++)f[h]=0;for(h=0;h<8;h++)f[h]=e[h];for(;n>=64;){for(a(s,f,o,ur),h=0;h<64;h++)r[t+h]=s[h];for(i=1,h=8;h<16;h++)i=i+(255&f[h])|0,f[h]=255&i,i>>>=8;n-=64,t+=64}if(n>0)for(a(s,f,o,ur),h=0;h<n;h++)r[t+h]=s[h];return 0}function u(r,t,n,e,o){var i=new Uint8Array(32);f(i,e,o,ur);for(var h=new Uint8Array(8),a=0;a<8;a++)h[a]=e[a+16];return c(r,t,n,h,i)}function y(r,t,n,e,o,i,h){var a=new Uint8Array(32);f(a,i,h,ur);for(var c=new Uint8Array(8),u=0;u<8;u++)c[u]=i[u+16];return s(r,t,n,e,o,c,a)}function l(r,t,n,e,o,i){var h=new yr(i);return h.update(n,e,o),h.finish(r,t),0}function w(r,t,n,o,i,h){var a=new Uint8Array(16);return l(a,0,n,o,i,h),e(r,t,a,0)}function p(r,t,n,e,o){var i;if(n<32)return-1;for(y(r,0,t,0,n,e,o),l(r,16,r,32,n-32,r),i=0;i<16;i++)r[i]=0;return 0}function v(r,t,n,e,o){var i,h=new Uint8Array(32);if(n<32)return-1;if(u(h,0,32,e,o),0!==w(t,16,t,32,n-32,h))return-1;for(y(r,0,t,0,n,e,o),i=0;i<32;i++)r[i]=0;return 0}function b(r,t){var n;for(n=0;n<16;n++)r[n]=0|t[n]}function g(r){var t,n,e=1;for(t=0;t<16;t++)n=r[t]+e+65535,e=Math.floor(n/65536),r[t]=n-65536*e;r[0]+=e-1+37*(e-1)}function _(r,t,n){for(var e,o=~(n-1),i=0;i<16;i++)e=o&(r[i]^t[i]),r[i]^=e,t[i]^=e}function A(r,t){var n,e,o,i=$(),h=$();for(n=0;n<16;n++)h[n]=t[n];for(g(h),g(h),g(h),e=0;e<2;e++){for(i[0]=h[0]-65517,n=1;n<15;n++)i[n]=h[n]-65535-(i[n-1]>>16&1),i[n-1]&=65535;i[15]=h[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,_(h,i,1-o)}for(n=0;n<16;n++)r[2*n]=255&h[n],r[2*n+1]=h[n]>>8}function d(r,t){var n=new Uint8Array(32),e=new Uint8Array(32);return A(n,r),A(e,t),o(n,0,e,0)}function U(r){var t=new Uint8Array(32);return A(t,r),1&t[0]}function E(r,t){var n;for(n=0;n<16;n++)r[n]=t[2*n]+(t[2*n+1]<<8);r[15]&=32767}function x(r,t,n){for(var e=0;e<16;e++)r[e]=t[e]+n[e]}function M(r,t,n){for(var e=0;e<16;e++)r[e]=t[e]-n[e]}function m(r,t,n){var e,o,i=0,h=0,a=0,f=0,s=0,c=0,u=0,y=0,l=0,w=0,p=0,v=0,b=0,g=0,_=0,A=0,d=0,U=0,E=0,x=0,M=0,m=0,B=0,S=0,K=0,T=0,Y=0,k=0,L=0,z=0,R=0,P=n[0],O=n[1],N=n[2],C=n[3],F=n[4],I=n[5],G=n[6],Z=n[7],j=n[8],q=n[9],V=n[10],X=n[11],D=n[12],H=n[13],J=n[14],Q=n[15];e=t[0],i+=e*P,h+=e*O,a+=e*N,f+=e*C,s+=e*F,c+=e*I,u+=e*G,y+=e*Z,l+=e*j,w+=e*q,p+=e*V,v+=e*X,b+=e*D,g+=e*H,_+=e*J,A+=e*Q,e=t[1],h+=e*P,a+=e*O,f+=e*N,s+=e*C,c+=e*F,u+=e*I,y+=e*G,l+=e*Z,w+=e*j,p+=e*q,v+=e*V,b+=e*X,g+=e*D,_+=e*H,A+=e*J,d+=e*Q,e=t[2],a+=e*P,f+=e*O,s+=e*N,c+=e*C,u+=e*F,y+=e*I,l+=e*G,w+=e*Z,p+=e*j,v+=e*q,b+=e*V,g+=e*X,_+=e*D,A+=e*H,d+=e*J,U+=e*Q,e=t[3],f+=e*P,s+=e*O,c+=e*N,u+=e*C,y+=e*F,l+=e*I,w+=e*G,p+=e*Z,v+=e*j,b+=e*q,g+=e*V,_+=e*X,A+=e*D,d+=e*H,U+=e*J,E+=e*Q,e=t[4],s+=e*P,c+=e*O,u+=e*N,y+=e*C,l+=e*F,w+=e*I,p+=e*G,v+=e*Z,b+=e*j,g+=e*q,_+=e*V,A+=e*X,d+=e*D,U+=e*H,E+=e*J,x+=e*Q,e=t[5],c+=e*P,u+=e*O,y+=e*N,l+=e*C,w+=e*F,p+=e*I,v+=e*G,b+=e*Z,g+=e*j,_+=e*q,A+=e*V,d+=e*X,U+=e*D,E+=e*H,x+=e*J,M+=e*Q,e=t[6],u+=e*P,y+=e*O,l+=e*N,w+=e*C,p+=e*F,v+=e*I,b+=e*G,g+=e*Z,_+=e*j,A+=e*q,d+=e*V,U+=e*X,E+=e*D,x+=e*H,M+=e*J,m+=e*Q,e=t[7],y+=e*P,l+=e*O,w+=e*N,p+=e*C,v+=e*F,b+=e*I,g+=e*G,_+=e*Z,A+=e*j,d+=e*q,U+=e*V,E+=e*X,x+=e*D,M+=e*H,m+=e*J,B+=e*Q,e=t[8],l+=e*P,w+=e*O,p+=e*N,v+=e*C,b+=e*F,g+=e*I,_+=e*G,A+=e*Z,d+=e*j,U+=e*q,E+=e*V,x+=e*X,M+=e*D,m+=e*H,B+=e*J,S+=e*Q,e=t[9],w+=e*P,p+=e*O,v+=e*N,b+=e*C,g+=e*F,_+=e*I,A+=e*G,d+=e*Z,U+=e*j,E+=e*q,x+=e*V,M+=e*X,m+=e*D,B+=e*H,S+=e*J,K+=e*Q,e=t[10],p+=e*P,v+=e*O,b+=e*N,g+=e*C,_+=e*F,A+=e*I,d+=e*G,U+=e*Z,E+=e*j,x+=e*q,M+=e*V,m+=e*X,B+=e*D,S+=e*H,K+=e*J,T+=e*Q,e=t[11],v+=e*P,b+=e*O,g+=e*N,_+=e*C,A+=e*F,d+=e*I,U+=e*G,E+=e*Z,x+=e*j,M+=e*q,m+=e*V,B+=e*X;S+=e*D;K+=e*H,T+=e*J,Y+=e*Q,e=t[12],b+=e*P,g+=e*O,_+=e*N,A+=e*C,d+=e*F,U+=e*I,E+=e*G,x+=e*Z,M+=e*j,m+=e*q,B+=e*V,S+=e*X,K+=e*D,T+=e*H,Y+=e*J,k+=e*Q,e=t[13],g+=e*P,_+=e*O,A+=e*N,d+=e*C,U+=e*F,E+=e*I,x+=e*G,M+=e*Z,m+=e*j,B+=e*q,S+=e*V,K+=e*X,T+=e*D,Y+=e*H,k+=e*J,L+=e*Q,e=t[14],_+=e*P,A+=e*O,d+=e*N,U+=e*C,E+=e*F,x+=e*I,M+=e*G,m+=e*Z,B+=e*j,S+=e*q,K+=e*V,T+=e*X,Y+=e*D,k+=e*H,L+=e*J,z+=e*Q,e=t[15],A+=e*P,d+=e*O,U+=e*N,E+=e*C,x+=e*F,M+=e*I,m+=e*G,B+=e*Z,S+=e*j,K+=e*q,T+=e*V,Y+=e*X,k+=e*D,L+=e*H,z+=e*J,R+=e*Q,i+=38*d,h+=38*U,a+=38*E,f+=38*x,s+=38*M,c+=38*m,u+=38*B,y+=38*S,l+=38*K,w+=38*T,p+=38*Y,v+=38*k,b+=38*L,g+=38*z,_+=38*R,o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=_+o+65535,o=Math.floor(e/65536),_=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=_+o+65535,o=Math.floor(e/65536),_=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),r[0]=i,r[1]=h,r[2]=a,r[3]=f,r[4]=s,r[5]=c,r[6]=u,r[7]=y,r[8]=l,r[9]=w,r[10]=p,r[11]=v,r[12]=b,r[13]=g;r[14]=_;r[15]=A}function B(r,t){m(r,t,t)}function S(r,t){var n,e=$();for(n=0;n<16;n++)e[n]=t[n];for(n=253;n>=0;n--)B(e,e),2!==n&&4!==n&&m(e,e,t);for(n=0;n<16;n++)r[n]=e[n]}function K(r,t){var n,e=$();for(n=0;n<16;n++)e[n]=t[n];for(n=250;n>=0;n--)B(e,e),1!==n&&m(e,e,t);for(n=0;n<16;n++)r[n]=e[n]}function T(r,t,n){var e,o,i=new Uint8Array(32),h=new Float64Array(80),a=$(),f=$(),s=$(),c=$(),u=$(),y=$();for(o=0;o<31;o++)i[o]=t[o];for(i[31]=127&t[31]|64,i[0]&=248,E(h,n),o=0;o<16;o++)f[o]=h[o],c[o]=a[o]=s[o]=0;for(a[0]=c[0]=1,o=254;o>=0;--o)e=i[o>>>3]>>>(7&o)&1,_(a,f,e),_(s,c,e),x(u,a,s),M(a,a,s),x(s,f,c),M(f,f,c),B(c,u),B(y,a),m(a,s,a),m(s,f,u),x(u,a,s),M(a,a,s),B(f,a),M(s,c,y),m(a,s,ir),x(a,a,c),m(s,s,a),m(a,c,y),m(c,f,h),B(f,u),_(a,f,e),_(s,c,e);for(o=0;o<16;o++)h[o+16]=a[o],h[o+32]=s[o],h[o+48]=f[o],h[o+64]=c[o];var l=h.subarray(32),w=h.subarray(16);return S(l,l),m(w,w,l),A(r,w),0}function Y(r,t){return T(r,t,nr)}function k(r,t){return rr(t,32),Y(r,t)}function L(r,t,n){var e=new Uint8Array(32);return T(e,n,t),f(r,tr,e,ur)}function z(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),lr(r,t,n,e,h)}function R(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),wr(r,t,n,e,h)}function P(r,t,n,e){for(var o,i,h,a,f,s,c,u,y,l,w,p,v,b,g,_,A,d,U,E,x,M,m,B,S,K,T=new Int32Array(16),Y=new Int32Array(16),k=r[0],L=r[1],z=r[2],R=r[3],P=r[4],O=r[5],N=r[6],C=r[7],F=t[0],I=t[1],G=t[2],Z=t[3],j=t[4],q=t[5],V=t[6],X=t[7],D=0;e>=128;){for(U=0;U<16;U++)E=8*U+D,T[U]=n[E+0]<<24|n[E+1]<<16|n[E+2]<<8|n[E+3],Y[U]=n[E+4]<<24|n[E+5]<<16|n[E+6]<<8|n[E+7];for(U=0;U<80;U++)if(o=k,i=L,h=z,a=R,f=P,s=O,c=N,u=C,y=F,l=I,w=G,p=Z,v=j,b=q,g=V,_=X,x=C,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(P>>>14|j<<18)^(P>>>18|j<<14)^(j>>>9|P<<23),M=(j>>>14|P<<18)^(j>>>18|P<<14)^(P>>>9|j<<23),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=P&O^~P&N,M=j&q^~j&V,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=pr[2*U],M=pr[2*U+1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=T[U%16],M=Y[U%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,A=65535&S|K<<16,d=65535&m|B<<16,x=A,M=d,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(k>>>28|F<<4)^(F>>>2|k<<30)^(F>>>7|k<<25),M=(F>>>28|k<<4)^(k>>>2|F<<30)^(k>>>7|F<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=k&L^k&z^L&z,M=F&I^F&G^I&G,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,u=65535&S|K<<16,_=65535&m|B<<16,x=a,M=p,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=A,M=d,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,a=65535&S|K<<16,p=65535&m|B<<16,L=o,z=i,R=h,P=a,O=f,N=s,C=c,k=u,I=y,G=l,Z=w,j=p,q=v,V=b,X=g,F=_,U%16===15)for(E=0;E<16;E++)x=T[E],M=Y[E],m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=T[(E+9)%16],M=Y[(E+9)%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+1)%16],d=Y[(E+1)%16],x=(A>>>1|d<<31)^(A>>>8|d<<24)^A>>>7,M=(d>>>1|A<<31)^(d>>>8|A<<24)^(d>>>7|A<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+14)%16],d=Y[(E+14)%16],x=(A>>>19|d<<13)^(d>>>29|A<<3)^A>>>6,M=(d>>>19|A<<13)^(A>>>29|d<<3)^(d>>>6|A<<26),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,T[E]=65535&S|K<<16,Y[E]=65535&m|B<<16;x=k,M=F,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[0],M=t[0],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[0]=k=65535&S|K<<16,t[0]=F=65535&m|B<<16,x=L,M=I,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[1],M=t[1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[1]=L=65535&S|K<<16,t[1]=I=65535&m|B<<16,x=z,M=G,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[2],M=t[2],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[2]=z=65535&S|K<<16,t[2]=G=65535&m|B<<16,x=R,M=Z,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[3],M=t[3],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[3]=R=65535&S|K<<16,t[3]=Z=65535&m|B<<16,x=P,M=j,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[4],M=t[4],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[4]=P=65535&S|K<<16,t[4]=j=65535&m|B<<16,x=O,M=q,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[5],M=t[5],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[5]=O=65535&S|K<<16,t[5]=q=65535&m|B<<16,x=N,M=V,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[6],M=t[6],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[6]=N=65535&S|K<<16,t[6]=V=65535&m|B<<16,x=C,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[7],M=t[7],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[7]=C=65535&S|K<<16,t[7]=X=65535&m|B<<16,D+=128,e-=128}return e}function O(r,n,e){var o,i=new Int32Array(8),h=new Int32Array(8),a=new Uint8Array(256),f=e;for(i[0]=1779033703,i[1]=3144134277,i[2]=1013904242,i[3]=2773480762,i[4]=1359893119,i[5]=2600822924,i[6]=528734635,i[7]=1541459225,h[0]=4089235720,h[1]=2227873595,h[2]=4271175723,h[3]=1595750129,h[4]=2917565137,h[5]=725511199,h[6]=4215389547,h[7]=327033209,P(i,h,n,e),e%=128,o=0;o<e;o++)a[o]=n[f-e+o];for(a[e]=128,e=256-128*(e<112?1:0),a[e-9]=0,t(a,e-8,f/536870912|0,f<<3),P(i,h,a,e),o=0;o<8;o++)t(r,8*o,i[o],h[o]);return 0}function N(r,t){var n=$(),e=$(),o=$(),i=$(),h=$(),a=$(),f=$(),s=$(),c=$();M(n,r[1],r[0]),M(c,t[1],t[0]),m(n,n,c),x(e,r[0],r[1]),x(c,t[0],t[1]),m(e,e,c),m(o,r[3],t[3]),m(o,o,ar),m(i,r[2],t[2]),x(i,i,i),M(h,e,n),M(a,i,o),x(f,i,o),x(s,e,n),m(r[0],h,a),m(r[1],s,f),m(r[2],f,a),m(r[3],h,s)}function C(r,t,n){var e;for(e=0;e<4;e++)_(r[e],t[e],n)}function F(r,t){var n=$(),e=$(),o=$();S(o,t[2]),m(n,t[0],o),m(e,t[1],o),A(r,e),r[31]^=U(n)<<7}function I(r,t,n){var e,o;for(b(r[0],er),b(r[1],or),b(r[2],or),b(r[3],er),o=255;o>=0;--o)e=n[o/8|0]>>(7&o)&1,C(r,t,e),N(t,r),N(r,r),C(r,t,e)}function G(r,t){var n=[$(),$(),$(),$()];b(n[0],fr),b(n[1],sr),b(n[2],or),m(n[3],fr,sr),I(r,n,t)}function Z(r,t,n){var e,o=new Uint8Array(64),i=[$(),$(),$(),$()];for(n||rr(t,32),O(o,t,32),o[0]&=248,o[31]&=127,o[31]|=64,G(i,o),F(r,i),e=0;e<32;e++)t[e+32]=r[e];return 0}function j(r,t){var n,e,o,i;for(e=63;e>=32;--e){for(n=0,o=e-32,i=e-12;o<i;++o)t[o]+=n-16*t[e]*vr[o-(e-32)],n=t[o]+128>>8,t[o]-=256*n;t[o]+=n,t[e]=0}for(n=0,o=0;o<32;o++)t[o]+=n-(t[31]>>4)*vr[o],n=t[o]>>8,t[o]&=255;for(o=0;o<32;o++)t[o]-=n*vr[o];for(e=0;e<32;e++)t[e+1]+=t[e]>>8,r[e]=255&t[e]}function q(r){var t,n=new Float64Array(64);for(t=0;t<64;t++)n[t]=r[t];for(t=0;t<64;t++)r[t]=0;j(r,n)}function V(r,t,n,e){var o,i,h=new Uint8Array(64),a=new Uint8Array(64),f=new Uint8Array(64),s=new Float64Array(64),c=[$(),$(),$(),$()];O(h,e,32),h[0]&=248,h[31]&=127,h[31]|=64;var u=n+64;for(o=0;o<n;o++)r[64+o]=t[o];for(o=0;o<32;o++)r[32+o]=h[32+o];for(O(f,r.subarray(32),n+32),q(f),G(c,f),F(r,c),o=32;o<64;o++)r[o]=e[o];for(O(a,r,n+64),q(a),o=0;o<64;o++)s[o]=0;for(o=0;o<32;o++)s[o]=f[o];for(o=0;o<32;o++)for(i=0;i<32;i++)s[o+i]+=a[o]*h[i];return j(r.subarray(32),s),u}function X(r,t){var n=$(),e=$(),o=$(),i=$(),h=$(),a=$(),f=$();return b(r[2],or),E(r[1],t),B(o,r[1]),m(i,o,hr),M(o,o,r[2]),x(i,r[2],i),B(h,i),B(a,h),m(f,a,h),m(n,f,o),m(n,n,i),K(n,n),m(n,n,o),m(n,n,i),m(n,n,i),m(r[0],n,i),B(e,r[0]),m(e,e,i),d(e,o)&&m(r[0],r[0],cr),B(e,r[0]),m(e,e,i),d(e,o)?-1:(U(r[0])===t[31]>>7&&M(r[0],er,r[0]),m(r[3],r[0],r[1]),0)}function D(r,t,n,e){var i,h,a=new Uint8Array(32),f=new Uint8Array(64),s=[$(),$(),$(),$()],c=[$(),$(),$(),$()];if(h=-1,n<64)return-1;if(X(c,e))return-1;for(i=0;i<n;i++)r[i]=t[i];for(i=0;i<32;i++)r[i+32]=e[i];if(O(f,r,n),q(f),I(s,c,f),G(c,t.subarray(32)),N(s,c),F(a,s),n-=64,o(t,0,a,0)){for(i=0;i<n;i++)r[i]=0;return-1}for(i=0;i<n;i++)r[i]=t[i+64];return h=n}function H(r,t){if(r.length!==br)throw new Error("bad key size");if(t.length!==gr)throw new Error("bad nonce size")}function J(r,t){if(r.length!==Er)throw new Error("bad public key size");if(t.length!==xr)throw new Error("bad secret key size")}function Q(){var r,t;for(t=0;t<arguments.length;t++)if("[object Uint8Array]"!==(r=Object.prototype.toString.call(arguments[t])))throw new TypeError("unexpected type "+r+", use Uint8Array")}function W(r){for(var t=0;t<r.length;t++)r[t]=0}var $=function(r){var t,n=new Float64Array(16);if(r)for(t=0;t<r.length;t++)n[t]=r[t];return n},rr=function(){throw new Error("no PRNG")},tr=new Uint8Array(16),nr=new Uint8Array(32);nr[0]=9;var er=$(),or=$([1]),ir=$([56129,1]),hr=$([30883,4953,19914,30187,55467,16705,2637,112,59544,30585,16505,36039,65139,11119,27886,20995]),ar=$([61785,9906,39828,60374,45398,33411,5274,224,53552,61171,33010,6542,64743,22239,55772,9222]),fr=$([54554,36645,11616,51542,42930,38181,51040,26924,56412,64982,57905,49316,21502,52590,14035,8553]),sr=$([26200,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214]),cr=$([41136,18958,6951,50414,58488,44335,6150,12099,55207,15867,153,11085,57099,20417,9344,11139]),ur=new Uint8Array([101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107]),yr=function(r){this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.leftover=0,this.fin=0;var t,n,e,o,i,h,a,f;t=255&r[0]|(255&r[1])<<8,this.r[0]=8191&t,n=255&r[2]|(255&r[3])<<8,this.r[1]=8191&(t>>>13|n<<3),e=255&r[4]|(255&r[5])<<8,this.r[2]=7939&(n>>>10|e<<6),o=255&r[6]|(255&r[7])<<8,this.r[3]=8191&(e>>>7|o<<9),i=255&r[8]|(255&r[9])<<8,this.r[4]=255&(o>>>4|i<<12),this.r[5]=i>>>1&8190,h=255&r[10]|(255&r[11])<<8,this.r[6]=8191&(i>>>14|h<<2),a=255&r[12]|(255&r[13])<<8,this.r[7]=8065&(h>>>11|a<<5),f=255&r[14]|(255&r[15])<<8,this.r[8]=8191&(a>>>8|f<<8),this.r[9]=f>>>5&127,this.pad[0]=255&r[16]|(255&r[17])<<8,this.pad[1]=255&r[18]|(255&r[19])<<8,this.pad[2]=255&r[20]|(255&r[21])<<8,this.pad[3]=255&r[22]|(255&r[23])<<8,this.pad[4]=255&r[24]|(255&r[25])<<8,this.pad[5]=255&r[26]|(255&r[27])<<8,this.pad[6]=255&r[28]|(255&r[29])<<8,this.pad[7]=255&r[30]|(255&r[31])<<8};yr.prototype.blocks=function(r,t,n){for(var e,o,i,h,a,f,s,c,u,y,l,w,p,v,b,g,_,A,d,U=this.fin?0:2048,E=this.h[0],x=this.h[1],M=this.h[2],m=this.h[3],B=this.h[4],S=this.h[5],K=this.h[6],T=this.h[7],Y=this.h[8],k=this.h[9],L=this.r[0],z=this.r[1],R=this.r[2],P=this.r[3],O=this.r[4],N=this.r[5],C=this.r[6],F=this.r[7],I=this.r[8],G=this.r[9];n>=16;)e=255&r[t+0]|(255&r[t+1])<<8,E+=8191&e,o=255&r[t+2]|(255&r[t+3])<<8,x+=8191&(e>>>13|o<<3),i=255&r[t+4]|(255&r[t+5])<<8,M+=8191&(o>>>10|i<<6),h=255&r[t+6]|(255&r[t+7])<<8,m+=8191&(i>>>7|h<<9),a=255&r[t+8]|(255&r[t+9])<<8,B+=8191&(h>>>4|a<<12),S+=a>>>1&8191,f=255&r[t+10]|(255&r[t+11])<<8,K+=8191&(a>>>14|f<<2),s=255&r[t+12]|(255&r[t+13])<<8,T+=8191&(f>>>11|s<<5),c=255&r[t+14]|(255&r[t+15])<<8,Y+=8191&(s>>>8|c<<8),k+=c>>>5|U,u=0,y=u,y+=E*L,y+=x*(5*G),y+=M*(5*I),y+=m*(5*F),y+=B*(5*C),u=y>>>13,y&=8191,y+=S*(5*N),y+=K*(5*O),y+=T*(5*P),y+=Y*(5*R),y+=k*(5*z),u+=y>>>13,y&=8191,l=u,l+=E*z,l+=x*L,l+=M*(5*G),l+=m*(5*I),l+=B*(5*F),u=l>>>13,l&=8191,l+=S*(5*C),l+=K*(5*N),l+=T*(5*O),l+=Y*(5*P),l+=k*(5*R),u+=l>>>13,l&=8191,w=u,w+=E*R,w+=x*z,w+=M*L,w+=m*(5*G),w+=B*(5*I),u=w>>>13,w&=8191,w+=S*(5*F),w+=K*(5*C),w+=T*(5*N),w+=Y*(5*O),w+=k*(5*P),u+=w>>>13,w&=8191,p=u,p+=E*P,p+=x*R,p+=M*z,p+=m*L,p+=B*(5*G),u=p>>>13,p&=8191,p+=S*(5*I),p+=K*(5*F),p+=T*(5*C),p+=Y*(5*N),p+=k*(5*O),u+=p>>>13,p&=8191,v=u,v+=E*O,v+=x*P,v+=M*R,v+=m*z,v+=B*L,u=v>>>13,v&=8191,v+=S*(5*G),v+=K*(5*I),v+=T*(5*F),v+=Y*(5*C),v+=k*(5*N),u+=v>>>13,v&=8191,b=u,b+=E*N,b+=x*O,b+=M*P,b+=m*R,b+=B*z,u=b>>>13,b&=8191,b+=S*L,b+=K*(5*G),b+=T*(5*I),b+=Y*(5*F),b+=k*(5*C),u+=b>>>13,b&=8191,g=u,g+=E*C,g+=x*N,g+=M*O,g+=m*P,g+=B*R,u=g>>>13,g&=8191,g+=S*z,g+=K*L,g+=T*(5*G),g+=Y*(5*I),g+=k*(5*F),u+=g>>>13,g&=8191,_=u,_+=E*F,_+=x*C,_+=M*N,_+=m*O,_+=B*P,u=_>>>13,_&=8191,_+=S*R,_+=K*z,_+=T*L,_+=Y*(5*G),_+=k*(5*I),u+=_>>>13,_&=8191,A=u,A+=E*I,A+=x*F,A+=M*C,A+=m*N,A+=B*O,u=A>>>13,A&=8191,A+=S*P,A+=K*R,A+=T*z,A+=Y*L,A+=k*(5*G),u+=A>>>13,A&=8191,d=u,d+=E*G,d+=x*I,d+=M*F,d+=m*C,d+=B*N,u=d>>>13,d&=8191,d+=S*O,d+=K*P,d+=T*R,d+=Y*z,d+=k*L,u+=d>>>13,d&=8191,u=(u<<2)+u|0,u=u+y|0,y=8191&u,u>>>=13,l+=u,E=y,x=l,M=w,m=p,B=v,S=b,K=g,T=_,Y=A,k=d,t+=16,n-=16;this.h[0]=E,this.h[1]=x,this.h[2]=M,this.h[3]=m,this.h[4]=B,this.h[5]=S,this.h[6]=K,this.h[7]=T,this.h[8]=Y,this.h[9]=k},yr.prototype.finish=function(r,t){var n,e,o,i,h=new Uint16Array(10);if(this.leftover){for(i=this.leftover,this.buffer[i++]=1;i<16;i++)this.buffer[i]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(n=this.h[1]>>>13,this.h[1]&=8191,i=2;i<10;i++)this.h[i]+=n,n=this.h[i]>>>13,this.h[i]&=8191;for(this.h[0]+=5*n,n=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=n,n=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=n,h[0]=this.h[0]+5,n=h[0]>>>13,h[0]&=8191,i=1;i<10;i++)h[i]=this.h[i]+n,n=h[i]>>>13,h[i]&=8191;for(h[9]-=8192,e=(1^n)-1,i=0;i<10;i++)h[i]&=e;for(e=~e,i=0;i<10;i++)this.h[i]=this.h[i]&e|h[i];for(this.h[0]=65535&(this.h[0]|this.h[1]<<13),this.h[1]=65535&(this.h[1]>>>3|this.h[2]<<10),this.h[2]=65535&(this.h[2]>>>6|this.h[3]<<7),this.h[3]=65535&(this.h[3]>>>9|this.h[4]<<4),this.h[4]=65535&(this.h[4]>>>12|this.h[5]<<1|this.h[6]<<14),this.h[5]=65535&(this.h[6]>>>2|this.h[7]<<11),this.h[6]=65535&(this.h[7]>>>5|this.h[8]<<8),this.h[7]=65535&(this.h[8]>>>8|this.h[9]<<5),o=this.h[0]+this.pad[0],this.h[0]=65535&o,i=1;i<8;i++)o=(this.h[i]+this.pad[i]|0)+(o>>>16)|0,this.h[i]=65535&o;r[t+0]=this.h[0]>>>0&255,r[t+1]=this.h[0]>>>8&255,r[t+2]=this.h[1]>>>0&255,r[t+3]=this.h[1]>>>8&255,r[t+4]=this.h[2]>>>0&255,r[t+5]=this.h[2]>>>8&255,r[t+6]=this.h[3]>>>0&255,r[t+7]=this.h[3]>>>8&255,r[t+8]=this.h[4]>>>0&255,r[t+9]=this.h[4]>>>8&255,r[t+10]=this.h[5]>>>0&255,r[t+11]=this.h[5]>>>8&255,r[t+12]=this.h[6]>>>0&255,r[t+13]=this.h[6]>>>8&255,r[t+14]=this.h[7]>>>0&255,r[t+15]=this.h[7]>>>8&255},yr.prototype.update=function(r,t,n){var e,o;if(this.leftover){for(o=16-this.leftover,o>n&&(o=n),e=0;e<o;e++)this.buffer[this.leftover+e]=r[t+e];if(n-=o,t+=o,this.leftover+=o,this.leftover<16)return;this.blocks(this.buffer,0,16),this.leftover=0}if(n>=16&&(o=n-n%16,this.blocks(r,t,o),t+=o,n-=o),n){for(e=0;e<n;e++)this.buffer[this.leftover+e]=r[t+e];this.leftover+=n}};var lr=p,wr=v,pr=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],vr=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]),br=32,gr=24,_r=32,Ar=16,dr=32,Ur=32,Er=32,xr=32,Mr=32,mr=gr,Br=_r,Sr=Ar,Kr=64,Tr=32,Yr=64,kr=32,Lr=64;r.lowlevel={crypto_core_hsalsa20:f,crypto_stream_xor:y,crypto_stream:u,crypto_stream_salsa20_xor:s,crypto_stream_salsa20:c,crypto_onetimeauth:l,crypto_onetimeauth_verify:w,crypto_verify_16:e,crypto_verify_32:o,crypto_secretbox:p,crypto_secretbox_open:v,crypto_scalarmult:T,crypto_scalarmult_base:Y,crypto_box_beforenm:L,crypto_box_afternm:lr,crypto_box:z,crypto_box_open:R,crypto_box_keypair:k,crypto_hash:O,crypto_sign:V,crypto_sign_keypair:Z,crypto_sign_open:D,crypto_secretbox_KEYBYTES:br,crypto_secretbox_NONCEBYTES:gr,crypto_secretbox_ZEROBYTES:_r,crypto_secretbox_BOXZEROBYTES:Ar,crypto_scalarmult_BYTES:dr,crypto_scalarmult_SCALARBYTES:Ur,crypto_box_PUBLICKEYBYTES:Er,crypto_box_SECRETKEYBYTES:xr,crypto_box_BEFORENMBYTES:Mr,crypto_box_NONCEBYTES:mr,crypto_box_ZEROBYTES:Br,crypto_box_BOXZEROBYTES:Sr,crypto_sign_BYTES:Kr,crypto_sign_PUBLICKEYBYTES:Tr,crypto_sign_SECRETKEYBYTES:Yr,crypto_sign_SEEDBYTES:kr,crypto_hash_BYTES:Lr},r.util||(r.util={},r.util.decodeUTF8=r.util.encodeUTF8=r.util.encodeBase64=r.util.decodeBase64=function(){throw new Error("nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js")}),r.randomBytes=function(r){var t=new Uint8Array(r);return rr(t,r),t},r.secretbox=function(r,t,n){Q(r,t,n),H(n,t);for(var e=new Uint8Array(_r+r.length),o=new Uint8Array(e.length),i=0;i<r.length;i++)e[i+_r]=r[i];return p(o,e,e.length,t,n),o.subarray(Ar)},r.secretbox.open=function(r,t,n){Q(r,t,n),H(n,t);for(var e=new Uint8Array(Ar+r.length),o=new Uint8Array(e.length),i=0;i<r.length;i++)e[i+Ar]=r[i];return!(e.length<32)&&(0===v(o,e,e.length,t,n)&&o.subarray(_r))},r.secretbox.keyLength=br,r.secretbox.nonceLength=gr,r.secretbox.overheadLength=Ar,r.scalarMult=function(r,t){if(Q(r,t),r.length!==Ur)throw new Error("bad n size");if(t.length!==dr)throw new Error("bad p size");var n=new Uint8Array(dr);return T(n,r,t),n},r.scalarMult.base=function(r){if(Q(r),r.length!==Ur)throw new Error("bad n size");var t=new Uint8Array(dr);return Y(t,r),t},r.scalarMult.scalarLength=Ur,r.scalarMult.groupElementLength=dr,r.box=function(t,n,e,o){var i=r.box.before(e,o);return r.secretbox(t,n,i)},r.box.before=function(r,t){Q(r,t),J(r,t);var n=new Uint8Array(Mr);return L(n,r,t),n},r.box.after=r.secretbox,r.box.open=function(t,n,e,o){var i=r.box.before(e,o);return r.secretbox.open(t,n,i)},r.box.open.after=r.secretbox.open,r.box.keyPair=function(){var r=new Uint8Array(Er),t=new Uint8Array(xr);return k(r,t),{publicKey:r,secretKey:t}},r.box.keyPair.fromSecretKey=function(r){if(Q(r),r.length!==xr)throw new Error("bad secret key size");var t=new Uint8Array(Er);return Y(t,r),{publicKey:t,secretKey:new Uint8Array(r)}},r.box.publicKeyLength=Er,r.box.secretKeyLength=xr,r.box.sharedKeyLength=Mr,r.box.nonceLength=mr,r.box.overheadLength=r.secretbox.overheadLength,r.sign=function(r,t){if(Q(r,t),t.length!==Yr)throw new Error("bad secret key size");var n=new Uint8Array(Kr+r.length);return V(n,r,r.length,t),n},r.sign.open=function(r,t){if(2!==arguments.length)throw new Error("nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?");if(Q(r,t),t.length!==Tr)throw new Error("bad public key size");var n=new Uint8Array(r.length),e=D(n,r,r.length,t);if(e<0)return null;for(var o=new Uint8Array(e),i=0;i<o.length;i++)o[i]=n[i];return o},r.sign.detached=function(t,n){for(var e=r.sign(t,n),o=new Uint8Array(Kr),i=0;i<o.length;i++)o[i]=e[i];return o},r.sign.detached.verify=function(r,t,n){if(Q(r,t,n),t.length!==Kr)throw new Error("bad signature size");if(n.length!==Tr)throw new Error("bad public key size");var e,o=new Uint8Array(Kr+r.length),i=new Uint8Array(Kr+r.length);for(e=0;e<Kr;e++)o[e]=t[e];for(e=0;e<r.length;e++)o[e+Kr]=r[e];return D(i,o,o.length,n)>=0},r.sign.keyPair=function(){var r=new Uint8Array(Tr),t=new Uint8Array(Yr);return Z(r,t),{publicKey:r,secretKey:t}},r.sign.keyPair.fromSecretKey=function(r){if(Q(r),r.length!==Yr)throw new Error("bad secret key size");for(var t=new Uint8Array(Tr),n=0;n<t.length;n++)t[n]=r[32+n];return{publicKey:t,secretKey:new Uint8Array(r)}},r.sign.keyPair.fromSeed=function(r){if(Q(r),r.length!==kr)throw new Error("bad seed size");for(var t=new Uint8Array(Tr),n=new Uint8Array(Yr),e=0;e<32;e++)n[e]=r[e];return Z(t,n,!0),{publicKey:t,secretKey:n}},r.sign.publicKeyLength=Tr,r.sign.secretKeyLength=Yr,r.sign.seedLength=kr,r.sign.signatureLength=Kr,r.hash=function(r){Q(r);var t=new Uint8Array(Lr);return O(t,r,r.length),t},r.hash.hashLength=Lr,r.verify=function(r,t){return Q(r,t),
0!==r.length&&0!==t.length&&(r.length===t.length&&0===n(r,0,t,0,r.length))},r.setPRNG=function(r){rr=r},function(){var t="undefined"!=typeof self?self.crypto||self.msCrypto:null;if(t&&t.getRandomValues){var n=65536;r.setPRNG(function(r,e){var o,i=new Uint8Array(e);for(o=0;o<e;o+=n)t.getRandomValues(i.subarray(o,o+Math.min(e-o,n)));for(o=0;o<e;o++)r[o]=i[o];W(i)})}else"undefined"!=typeof require&&(t=require("crypto"),t&&t.randomBytes&&r.setPRNG(function(r,n){var e,o=t.randomBytes(n);for(e=0;e<n;e++)r[e]=o[e];W(o)}))}()}("undefined"!=typeof module&&module.exports?module.exports:self.nacl=self.nacl||{});(function(nacl) {
'use strict';

// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri.
// Public domain.
//
// Implementation derived from TweetNaCl version 20140427.
// See for details: http://tweetnacl.cr.yp.to/

var u64 = function(h, l) { this.hi = h|0 >>> 0; this.lo = l|0 >>> 0; };
var gf = function(init) {
  var i, r = new Float64Array(16);
  if (init) for (i = 0; i < init.length; i++) r[i] = init[i];
  return r;
};

//  Pluggable, initialized in high-level API below.
var randombytes = function(/* x, n */) { throw new Error('no PRNG'); };

var _0 = new Uint8Array(16);
var _9 = new Uint8Array(32); _9[0] = 9;

var gf0 = gf(),
    gf1 = gf([1]),
    _121665 = gf([0xdb41, 1]),
    D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),
    D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),
    X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),
    Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),
    I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);

function L32(x, c) { return (x << c) | (x >>> (32 - c)); }

function ld32(x, i) {
  var u = x[i+3] & 0xff;
  u = (u<<8)|(x[i+2] & 0xff);
  u = (u<<8)|(x[i+1] & 0xff);
  return (u<<8)|(x[i+0] & 0xff);
}

function dl64(x, i) {
  var h = (x[i] << 24) | (x[i+1] << 16) | (x[i+2] << 8) | x[i+3];
  var l = (x[i+4] << 24) | (x[i+5] << 16) | (x[i+6] << 8) | x[i+7];
  return new u64(h, l);
}

function st32(x, j, u) {
  var i;
  for (i = 0; i < 4; i++) { x[j+i] = u & 255; u >>>= 8; }
}

function ts64(x, i, u) {
  x[i]   = (u.hi >> 24) & 0xff;
  x[i+1] = (u.hi >> 16) & 0xff;
  x[i+2] = (u.hi >>  8) & 0xff;
  x[i+3] = u.hi & 0xff;
  x[i+4] = (u.lo >> 24)  & 0xff;
  x[i+5] = (u.lo >> 16)  & 0xff;
  x[i+6] = (u.lo >>  8)  & 0xff;
  x[i+7] = u.lo & 0xff;
}

function vn(x, xi, y, yi, n) {
  var i,d = 0;
  for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i];
  return (1 & ((d - 1) >>> 8)) - 1;
}

function crypto_verify_16(x, xi, y, yi) {
  return vn(x,xi,y,yi,16);
}

function crypto_verify_32(x, xi, y, yi) {
  return vn(x,xi,y,yi,32);
}

function core(out,inp,k,c,h) {
  var w = new Uint32Array(16), x = new Uint32Array(16),
      y = new Uint32Array(16), t = new Uint32Array(4);
  var i, j, m;

  for (i = 0; i < 4; i++) {
    x[5*i] = ld32(c, 4*i);
    x[1+i] = ld32(k, 4*i);
    x[6+i] = ld32(inp, 4*i);
    x[11+i] = ld32(k, 16+4*i);
  }

  for (i = 0; i < 16; i++) y[i] = x[i];

  for (i = 0; i < 20; i++) {
    for (j = 0; j < 4; j++) {
      for (m = 0; m < 4; m++) t[m] = x[(5*j+4*m)%16];
      t[1] ^= L32((t[0]+t[3])|0, 7);
      t[2] ^= L32((t[1]+t[0])|0, 9);
      t[3] ^= L32((t[2]+t[1])|0,13);
      t[0] ^= L32((t[3]+t[2])|0,18);
      for (m = 0; m < 4; m++) w[4*j+(j+m)%4] = t[m];
    }
    for (m = 0; m < 16; m++) x[m] = w[m];
  }

  if (h) {
    for (i = 0; i < 16; i++) x[i] = (x[i] + y[i]) | 0;
    for (i = 0; i < 4; i++) {
      x[5*i] = (x[5*i] - ld32(c, 4*i)) | 0;
      x[6+i] = (x[6+i] - ld32(inp, 4*i)) | 0;
    }
    for (i = 0; i < 4; i++) {
      st32(out,4*i,x[5*i]);
      st32(out,16+4*i,x[6+i]);
    }
  } else {
    for (i = 0; i < 16; i++) st32(out, 4 * i, (x[i] + y[i]) | 0);
  }
}

function crypto_core_salsa20(out,inp,k,c) {
  core(out,inp,k,c,false);
  return 0;
}

function crypto_core_hsalsa20(out,inp,k,c) {
  core(out,inp,k,c,true);
  return 0;
}

var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);
            // "expand 32-byte k"

function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) {
  var z = new Uint8Array(16), x = new Uint8Array(64);
  var u, i;
  if (!b) return 0;
  for (i = 0; i < 16; i++) z[i] = 0;
  for (i = 0; i < 8; i++) z[i] = n[i];
  while (b >= 64) {
    crypto_core_salsa20(x,z,k,sigma);
    for (i = 0; i < 64; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i];
    u = 1;
    for (i = 8; i < 16; i++) {
      u = u + (z[i] & 0xff) | 0;
      z[i] = u & 0xff;
      u >>>= 8;
    }
    b -= 64;
    cpos += 64;
    if (m) mpos += 64;
  }
  if (b > 0) {
    crypto_core_salsa20(x,z,k,sigma);
    for (i = 0; i < b; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i];
  }
  return 0;
}

function crypto_stream_salsa20(c,cpos,d,n,k) {
  return crypto_stream_salsa20_xor(c,cpos,null,0,d,n,k);
}

function crypto_stream(c,cpos,d,n,k) {
  var s = new Uint8Array(32);
  crypto_core_hsalsa20(s,n,k,sigma);
  return crypto_stream_salsa20(c,cpos,d,n.subarray(16),s);
}

function crypto_stream_xor(c,cpos,m,mpos,d,n,k) {
  var s = new Uint8Array(32);
  crypto_core_hsalsa20(s,n,k,sigma);
  return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,n.subarray(16),s);
}

function add1305(h, c) {
  var j, u = 0;
  for (j = 0; j < 17; j++) {
    u = (u + ((h[j] + c[j]) | 0)) | 0;
    h[j] = u & 255;
    u >>>= 8;
  }
}

var minusp = new Uint32Array([
  5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252
]);

function crypto_onetimeauth(out, outpos, m, mpos, n, k) {
  var s, i, j, u;
  var x = new Uint32Array(17), r = new Uint32Array(17),
      h = new Uint32Array(17), c = new Uint32Array(17),
      g = new Uint32Array(17);
  for (j = 0; j < 17; j++) r[j]=h[j]=0;
  for (j = 0; j < 16; j++) r[j]=k[j];
  r[3]&=15;
  r[4]&=252;
  r[7]&=15;
  r[8]&=252;
  r[11]&=15;
  r[12]&=252;
  r[15]&=15;

  while (n > 0) {
    for (j = 0; j < 17; j++) c[j] = 0;
    for (j = 0; (j < 16) && (j < n); ++j) c[j] = m[mpos+j];
    c[j] = 1;
    mpos += j; n -= j;
    add1305(h,c);
    for (i = 0; i < 17; i++) {
      x[i] = 0;
      for (j = 0; j < 17; j++) x[i] = (x[i] + (h[j] * ((j <= i) ? r[i - j] : ((320 * r[i + 17 - j])|0))) | 0) | 0;
    }
    for (i = 0; i < 17; i++) h[i] = x[i];
    u = 0;
    for (j = 0; j < 16; j++) {
      u = (u + h[j]) | 0;
      h[j] = u & 255;
      u >>>= 8;
    }
    u = (u + h[16]) | 0; h[16] = u & 3;
    u = (5 * (u >>> 2)) | 0;
    for (j = 0; j < 16; j++) {
      u = (u + h[j]) | 0;
      h[j] = u & 255;
      u >>>= 8;
    }
    u = (u + h[16]) | 0; h[16] = u;
  }

  for (j = 0; j < 17; j++) g[j] = h[j];
  add1305(h,minusp);
  s = (-(h[16] >>> 7) | 0);
  for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]);

  for (j = 0; j < 16; j++) c[j] = k[j + 16];
  c[16] = 0;
  add1305(h,c);
  for (j = 0; j < 16; j++) out[outpos+j] = h[j];
  return 0;
}

function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {
  var x = new Uint8Array(16);
  crypto_onetimeauth(x,0,m,mpos,n,k);
  return crypto_verify_16(h,hpos,x,0);
}

function crypto_secretbox(c,m,d,n,k) {
  var i;
  if (d < 32) return -1;
  crypto_stream_xor(c,0,m,0,d,n,k);
  crypto_onetimeauth(c, 16, c, 32, d - 32, c);
  for (i = 0; i < 16; i++) c[i] = 0;
  return 0;
}

function crypto_secretbox_open(m,c,d,n,k) {
  var i;
  var x = new Uint8Array(32);
  if (d < 32) return -1;
  crypto_stream(x,0,32,n,k);
  if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1;
  crypto_stream_xor(m,0,c,0,d,n,k);
  for (i = 0; i < 32; i++) m[i] = 0;
  return 0;
}

function set25519(r, a) {
  var i;
  for (i = 0; i < 16; i++) r[i] = a[i]|0;
}

function car25519(o) {
  var c;
  var i;
  for (i = 0; i < 16; i++) {
      o[i] += 65536;
      c = Math.floor(o[i] / 65536);
      o[(i+1)*(i<15?1:0)] += c - 1 + 37 * (c-1) * (i===15?1:0);
      o[i] -= (c * 65536);
  }
}

function sel25519(p, q, b) {
  var t, c = ~(b-1);
  for (var i = 0; i < 16; i++) {
    t = c & (p[i] ^ q[i]);
    p[i] ^= t;
    q[i] ^= t;
  }
}

function pack25519(o, n) {
  var i, j, b;
  var m = gf(), t = gf();
  for (i = 0; i < 16; i++) t[i] = n[i];
  car25519(t);
  car25519(t);
  car25519(t);
  for (j = 0; j < 2; j++) {
    m[0] = t[0] - 0xffed;
    for (i = 1; i < 15; i++) {
      m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1);
      m[i-1] &= 0xffff;
    }
    m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1);
    b = (m[15]>>16) & 1;
    m[14] &= 0xffff;
    sel25519(t, m, 1-b);
  }
  for (i = 0; i < 16; i++) {
    o[2*i] = t[i] & 0xff;
    o[2*i+1] = t[i]>>8;
  }
}

function neq25519(a, b) {
  var c = new Uint8Array(32), d = new Uint8Array(32);
  pack25519(c, a);
  pack25519(d, b);
  return crypto_verify_32(c, 0, d, 0);
}

function par25519(a) {
  var d = new Uint8Array(32);
  pack25519(d, a);
  return d[0] & 1;
}

function unpack25519(o, n) {
  var i;
  for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8);
  o[15] &= 0x7fff;
}

function A(o, a, b) {
  var i;
  for (i = 0; i < 16; i++) o[i] = (a[i] + b[i])|0;
}

function Z(o, a, b) {
  var i;
  for (i = 0; i < 16; i++) o[i] = (a[i] - b[i])|0;
}

function M(o, a, b) {
  var i, j, t = new Float64Array(31);
  for (i = 0; i < 31; i++) t[i] = 0;
  for (i = 0; i < 16; i++) {
    for (j = 0; j < 16; j++) {
      t[i+j] += a[i] * b[j];
    }
  }
  for (i = 0; i < 15; i++) {
    t[i] += 38 * t[i+16];
  }
  for (i = 0; i < 16; i++) o[i] = t[i];
  car25519(o);
  car25519(o);
}

function S(o, a) {
  M(o, a, a);
}

function inv25519(o, i) {
  var c = gf();
  var a;
  for (a = 0; a < 16; a++) c[a] = i[a];
  for (a = 253; a >= 0; a--) {
    S(c, c);
    if(a !== 2 && a !== 4) M(c, c, i);
  }
  for (a = 0; a < 16; a++) o[a] = c[a];
}

function pow2523(o, i) {
  var c = gf();
  var a;
  for (a = 0; a < 16; a++) c[a] = i[a];
  for (a = 250; a >= 0; a--) {
      S(c, c);
      if(a !== 1) M(c, c, i);
  }
  for (a = 0; a < 16; a++) o[a] = c[a];
}

function crypto_scalarmult(q, n, p) {
  var z = new Uint8Array(32);
  var x = new Float64Array(80), r, i;
  var a = gf(), b = gf(), c = gf(),
      d = gf(), e = gf(), f = gf();
  for (i = 0; i < 31; i++) z[i] = n[i];
  z[31]=(n[31]&127)|64;
  z[0]&=248;
  unpack25519(x,p);
  for (i = 0; i < 16; i++) {
    b[i]=x[i];
    d[i]=a[i]=c[i]=0;
  }
  a[0]=d[0]=1;
  for (i=254; i>=0; --i) {
    r=(z[i>>>3]>>>(i&7))&1;
    sel25519(a,b,r);
    sel25519(c,d,r);
    A(e,a,c);
    Z(a,a,c);
    A(c,b,d);
    Z(b,b,d);
    S(d,e);
    S(f,a);
    M(a,c,a);
    M(c,b,e);
    A(e,a,c);
    Z(a,a,c);
    S(b,a);
    Z(c,d,f);
    M(a,c,_121665);
    A(a,a,d);
    M(c,c,a);
    M(a,d,f);
    M(d,b,x);
    S(b,e);
    sel25519(a,b,r);
    sel25519(c,d,r);
  }
  for (i = 0; i < 16; i++) {
    x[i+16]=a[i];
    x[i+32]=c[i];
    x[i+48]=b[i];
    x[i+64]=d[i];
  }
  var x32 = x.subarray(32);
  var x16 = x.subarray(16);
  inv25519(x32,x32);
  M(x16,x16,x32);
  pack25519(q,x16);
  return 0;
}

function crypto_scalarmult_base(q, n) {
  return crypto_scalarmult(q, n, _9);
}

function crypto_box_keypair(y, x) {
  randombytes(x, 32);
  return crypto_scalarmult_base(y, x);
}

function crypto_box_beforenm(k, y, x) {
  var s = new Uint8Array(32);
  crypto_scalarmult(s, x, y);
  return crypto_core_hsalsa20(k, _0, s, sigma);
}

var crypto_box_afternm = crypto_secretbox;
var crypto_box_open_afternm = crypto_secretbox_open;

function crypto_box(c, m, d, n, y, x) {
  var k = new Uint8Array(32);
  crypto_box_beforenm(k, y, x);
  return crypto_box_afternm(c, m, d, n, k);
}

function crypto_box_open(m, c, d, n, y, x) {
  var k = new Uint8Array(32);
  crypto_box_beforenm(k, y, x);
  return crypto_box_open_afternm(m, c, d, n, k);
}

function add64() {
  var a = 0, b = 0, c = 0, d = 0, m16 = 65535, l, h, i;
  for (i = 0; i < arguments.length; i++) {
    l = arguments[i].lo;
    h = arguments[i].hi;
    a += (l & m16); b += (l >>> 16);
    c += (h & m16); d += (h >>> 16);
  }

  b += (a >>> 16);
  c += (b >>> 16);
  d += (c >>> 16);

  return new u64((c & m16) | (d << 16), (a & m16) | (b << 16));
}

function shr64(x, c) {
  return new u64((x.hi >>> c), (x.lo >>> c) | (x.hi << (32 - c)));
}

function xor64() {
  var l = 0, h = 0, i;
  for (i = 0; i < arguments.length; i++) {
    l ^= arguments[i].lo;
    h ^= arguments[i].hi;
  }
  return new u64(h, l);
}

function R(x, c) {
  var h, l, c1 = 32 - c;
  if (c < 32) {
    h = (x.hi >>> c) | (x.lo << c1);
    l = (x.lo >>> c) | (x.hi << c1);
  } else if (c < 64) {
    h = (x.lo >>> c) | (x.hi << c1);
    l = (x.hi >>> c) | (x.lo << c1);
  }
  return new u64(h, l);
}

function Ch(x, y, z) {
  var h = (x.hi & y.hi) ^ (~x.hi & z.hi),
      l = (x.lo & y.lo) ^ (~x.lo & z.lo);
  return new u64(h, l);
}

function Maj(x, y, z) {
  var h = (x.hi & y.hi) ^ (x.hi & z.hi) ^ (y.hi & z.hi),
      l = (x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo);
  return new u64(h, l);
}

function Sigma0(x) { return xor64(R(x,28), R(x,34), R(x,39)); }
function Sigma1(x) { return xor64(R(x,14), R(x,18), R(x,41)); }
function sigma0(x) { return xor64(R(x, 1), R(x, 8), shr64(x,7)); }
function sigma1(x) { return xor64(R(x,19), R(x,61), shr64(x,6)); }

var K = [
  new u64(0x428a2f98, 0xd728ae22), new u64(0x71374491, 0x23ef65cd),
  new u64(0xb5c0fbcf, 0xec4d3b2f), new u64(0xe9b5dba5, 0x8189dbbc),
  new u64(0x3956c25b, 0xf348b538), new u64(0x59f111f1, 0xb605d019),
  new u64(0x923f82a4, 0xaf194f9b), new u64(0xab1c5ed5, 0xda6d8118),
  new u64(0xd807aa98, 0xa3030242), new u64(0x12835b01, 0x45706fbe),
  new u64(0x243185be, 0x4ee4b28c), new u64(0x550c7dc3, 0xd5ffb4e2),
  new u64(0x72be5d74, 0xf27b896f), new u64(0x80deb1fe, 0x3b1696b1),
  new u64(0x9bdc06a7, 0x25c71235), new u64(0xc19bf174, 0xcf692694),
  new u64(0xe49b69c1, 0x9ef14ad2), new u64(0xefbe4786, 0x384f25e3),
  new u64(0x0fc19dc6, 0x8b8cd5b5), new u64(0x240ca1cc, 0x77ac9c65),
  new u64(0x2de92c6f, 0x592b0275), new u64(0x4a7484aa, 0x6ea6e483),
  new u64(0x5cb0a9dc, 0xbd41fbd4), new u64(0x76f988da, 0x831153b5),
  new u64(0x983e5152, 0xee66dfab), new u64(0xa831c66d, 0x2db43210),
  new u64(0xb00327c8, 0x98fb213f), new u64(0xbf597fc7, 0xbeef0ee4),
  new u64(0xc6e00bf3, 0x3da88fc2), new u64(0xd5a79147, 0x930aa725),
  new u64(0x06ca6351, 0xe003826f), new u64(0x14292967, 0x0a0e6e70),
  new u64(0x27b70a85, 0x46d22ffc), new u64(0x2e1b2138, 0x5c26c926),
  new u64(0x4d2c6dfc, 0x5ac42aed), new u64(0x53380d13, 0x9d95b3df),
  new u64(0x650a7354, 0x8baf63de), new u64(0x766a0abb, 0x3c77b2a8),
  new u64(0x81c2c92e, 0x47edaee6), new u64(0x92722c85, 0x1482353b),
  new u64(0xa2bfe8a1, 0x4cf10364), new u64(0xa81a664b, 0xbc423001),
  new u64(0xc24b8b70, 0xd0f89791), new u64(0xc76c51a3, 0x0654be30),
  new u64(0xd192e819, 0xd6ef5218), new u64(0xd6990624, 0x5565a910),
  new u64(0xf40e3585, 0x5771202a), new u64(0x106aa070, 0x32bbd1b8),
  new u64(0x19a4c116, 0xb8d2d0c8), new u64(0x1e376c08, 0x5141ab53),
  new u64(0x2748774c, 0xdf8eeb99), new u64(0x34b0bcb5, 0xe19b48a8),
  new u64(0x391c0cb3, 0xc5c95a63), new u64(0x4ed8aa4a, 0xe3418acb),
  new u64(0x5b9cca4f, 0x7763e373), new u64(0x682e6ff3, 0xd6b2b8a3),
  new u64(0x748f82ee, 0x5defb2fc), new u64(0x78a5636f, 0x43172f60),
  new u64(0x84c87814, 0xa1f0ab72), new u64(0x8cc70208, 0x1a6439ec),
  new u64(0x90befffa, 0x23631e28), new u64(0xa4506ceb, 0xde82bde9),
  new u64(0xbef9a3f7, 0xb2c67915), new u64(0xc67178f2, 0xe372532b),
  new u64(0xca273ece, 0xea26619c), new u64(0xd186b8c7, 0x21c0c207),
  new u64(0xeada7dd6, 0xcde0eb1e), new u64(0xf57d4f7f, 0xee6ed178),
  new u64(0x06f067aa, 0x72176fba), new u64(0x0a637dc5, 0xa2c898a6),
  new u64(0x113f9804, 0xbef90dae), new u64(0x1b710b35, 0x131c471b),
  new u64(0x28db77f5, 0x23047d84), new u64(0x32caab7b, 0x40c72493),
  new u64(0x3c9ebe0a, 0x15c9bebc), new u64(0x431d67c4, 0x9c100d4c),
  new u64(0x4cc5d4be, 0xcb3e42b6), new u64(0x597f299c, 0xfc657e2a),
  new u64(0x5fcb6fab, 0x3ad6faec), new u64(0x6c44198c, 0x4a475817)
];

function crypto_hashblocks(x, m, n) {
  var z = [], b = [], a = [], w = [], t, i, j;

  for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8*i);

  var pos = 0;
  while (n >= 128) {
    for (i = 0; i < 16; i++) w[i] = dl64(m, 8*i+pos);
    for (i = 0; i < 80; i++) {
      for (j = 0; j < 8; j++) b[j] = a[j];
      t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i%16]);
      b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2]));
      b[3] = add64(b[3], t);
      for (j = 0; j < 8; j++) a[(j+1)%8] = b[j];
      if (i%16 === 15) {
        for (j = 0; j < 16; j++) {
          w[j] = add64(w[j], w[(j+9)%16], sigma0(w[(j+1)%16]), sigma1(w[(j+14)%16]));
        }
      }
    }

    for (i = 0; i < 8; i++) {
      a[i] = add64(a[i], z[i]);
      z[i] = a[i];
    }

    pos += 128;
    n -= 128;
  }

  for (i = 0; i < 8; i++) ts64(x, 8*i, z[i]);
  return n;
}

var iv = new Uint8Array([
  0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08,
  0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b,
  0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b,
  0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1,
  0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1,
  0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f,
  0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b,
  0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79
]);

function crypto_hash(out, m, n) {
  var h = new Uint8Array(64), x = new Uint8Array(256);
  var i, b = n;

  for (i = 0; i < 64; i++) h[i] = iv[i];

  crypto_hashblocks(h, m, n);
  n %= 128;

  for (i = 0; i < 256; i++) x[i] = 0;
  for (i = 0; i < n; i++) x[i] = m[b-n+i];
  x[n] = 128;

  n = 256-128*(n<112?1:0);
  x[n-9] = 0;
  ts64(x, n-8, new u64((b / 0x20000000) | 0, b << 3));
  crypto_hashblocks(h, x, n);

  for (i = 0; i < 64; i++) out[i] = h[i];

  return 0;
}

function add(p, q) {
  var a = gf(), b = gf(), c = gf(),
      d = gf(), e = gf(), f = gf(),
      g = gf(), h = gf(), t = gf();

  Z(a, p[1], p[0]);
  Z(t, q[1], q[0]);
  M(a, a, t);
  A(b, p[0], p[1]);
  A(t, q[0], q[1]);
  M(b, b, t);
  M(c, p[3], q[3]);
  M(c, c, D2);
  M(d, p[2], q[2]);
  A(d, d, d);
  Z(e, b, a);
  Z(f, d, c);
  A(g, d, c);
  A(h, b, a);

  M(p[0], e, f);
  M(p[1], h, g);
  M(p[2], g, f);
  M(p[3], e, h);
}

function cswap(p, q, b) {
  var i;
  for (i = 0; i < 4; i++) {
    sel25519(p[i], q[i], b);
  }
}

function pack(r, p) {
  var tx = gf(), ty = gf(), zi = gf();
  inv25519(zi, p[2]);
  M(tx, p[0], zi);
  M(ty, p[1], zi);
  pack25519(r, ty);
  r[31] ^= par25519(tx) << 7;
}

function scalarmult(p, q, s) {
  var b, i;
  set25519(p[0], gf0);
  set25519(p[1], gf1);
  set25519(p[2], gf1);
  set25519(p[3], gf0);
  for (i = 255; i >= 0; --i) {
    b = (s[(i/8)|0] >> (i&7)) & 1;
    cswap(p, q, b);
    add(q, p);
    add(p, p);
    cswap(p, q, b);
  }
}

function scalarbase(p, s) {
  var q = [gf(), gf(), gf(), gf()];
  set25519(q[0], X);
  set25519(q[1], Y);
  set25519(q[2], gf1);
  M(q[3], X, Y);
  scalarmult(p, q, s);
}

function crypto_sign_keypair(pk, sk, seeded) {
  var d = new Uint8Array(64);
  var p = [gf(), gf(), gf(), gf()];
  var i;

  if (!seeded) randombytes(sk, 32);
  crypto_hash(d, sk, 32);
  d[0] &= 248;
  d[31] &= 127;
  d[31] |= 64;

  scalarbase(p, d);
  pack(pk, p);

  for (i = 0; i < 32; i++) sk[i+32] = pk[i];
  return 0;
}

var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);

function modL(r, x) {
  var carry, i, j, k;
  for (i = 63; i >= 32; --i) {
    carry = 0;
    for (j = i - 32, k = i - 12; j < k; ++j) {
      x[j] += carry - 16 * x[i] * L[j - (i - 32)];
      carry = (x[j] + 128) >> 8;
      x[j] -= carry * 256;
    }
    x[j] += carry;
    x[i] = 0;
  }
  carry = 0;
  for (j = 0; j < 32; j++) {
    x[j] += carry - (x[31] >> 4) * L[j];
    carry = x[j] >> 8;
    x[j] &= 255;
  }
  for (j = 0; j < 32; j++) x[j] -= carry * L[j];
  for (i = 0; i < 32; i++) {
    x[i+1] += x[i] >> 8;
    r[i] = x[i] & 255;
  }
}

function reduce(r) {
  var x = new Float64Array(64), i;
  for (i = 0; i < 64; i++) x[i] = r[i];
  for (i = 0; i < 64; i++) r[i] = 0;
  modL(r, x);
}

// Note: difference from C - smlen returned, not passed as argument.
function crypto_sign(sm, m, n, sk) {
  var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);
  var i, j, x = new Float64Array(64);
  var p = [gf(), gf(), gf(), gf()];

  crypto_hash(d, sk, 32);
  d[0] &= 248;
  d[31] &= 127;
  d[31] |= 64;

  var smlen = n + 64;
  for (i = 0; i < n; i++) sm[64 + i] = m[i];
  for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];

  crypto_hash(r, sm.subarray(32), n+32);
  reduce(r);
  scalarbase(p, r);
  pack(sm, p);

  for (i = 32; i < 64; i++) sm[i] = sk[i];
  crypto_hash(h, sm, n + 64);
  reduce(h);

  for (i = 0; i < 64; i++) x[i] = 0;
  for (i = 0; i < 32; i++) x[i] = r[i];
  for (i = 0; i < 32; i++) {
    for (j = 0; j < 32; j++) {
      x[i+j] += h[i] * d[j];
    }
  }

  modL(sm.subarray(32), x);
  return smlen;
}

function unpackneg(r, p) {
  var t = gf(), chk = gf(), num = gf(),
      den = gf(), den2 = gf(), den4 = gf(),
      den6 = gf();

  set25519(r[2], gf1);
  unpack25519(r[1], p);
  S(num, r[1]);
  M(den, num, D);
  Z(num, num, r[2]);
  A(den, r[2], den);

  S(den2, den);
  S(den4, den2);
  M(den6, den4, den2);
  M(t, den6, num);
  M(t, t, den);

  pow2523(t, t);
  M(t, t, num);
  M(t, t, den);
  M(t, t, den);
  M(r[0], t, den);

  S(chk, r[0]);
  M(chk, chk, den);
  if (neq25519(chk, num)) M(r[0], r[0], I);

  S(chk, r[0]);
  M(chk, chk, den);
  if (neq25519(chk, num)) return -1;

  if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]);

  M(r[3], r[0], r[1]);
  return 0;
}

function crypto_sign_open(m, sm, n, pk) {
  var i, mlen;
  var t = new Uint8Array(32), h = new Uint8Array(64);
  var p = [gf(), gf(), gf(), gf()],
      q = [gf(), gf(), gf(), gf()];

  mlen = -1;
  if (n < 64) return -1;

  if (unpackneg(q, pk)) return -1;

  for (i = 0; i < n; i++) m[i] = sm[i];
  for (i = 0; i < 32; i++) m[i+32] = pk[i];
  crypto_hash(h, m, n);
  reduce(h);
  scalarmult(p, q, h);

  scalarbase(q, sm.subarray(32));
  add(p, q);
  pack(t, p);

  n -= 64;
  if (crypto_verify_32(sm, 0, t, 0)) {
    for (i = 0; i < n; i++) m[i] = 0;
    return -1;
  }

  for (i = 0; i < n; i++) m[i] = sm[i + 64];
  mlen = n;
  return mlen;
}

var crypto_secretbox_KEYBYTES = 32,
    crypto_secretbox_NONCEBYTES = 24,
    crypto_secretbox_ZEROBYTES = 32,
    crypto_secretbox_BOXZEROBYTES = 16,
    crypto_scalarmult_BYTES = 32,
    crypto_scalarmult_SCALARBYTES = 32,
    crypto_box_PUBLICKEYBYTES = 32,
    crypto_box_SECRETKEYBYTES = 32,
    crypto_box_BEFORENMBYTES = 32,
    crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES,
    crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES,
    crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES,
    crypto_sign_BYTES = 64,
    crypto_sign_PUBLICKEYBYTES = 32,
    crypto_sign_SECRETKEYBYTES = 64,
    crypto_sign_SEEDBYTES = 32,
    crypto_hash_BYTES = 64;

nacl.lowlevel = {
  crypto_core_hsalsa20: crypto_core_hsalsa20,
  crypto_stream_xor: crypto_stream_xor,
  crypto_stream: crypto_stream,
  crypto_stream_salsa20_xor: crypto_stream_salsa20_xor,
  crypto_stream_salsa20: crypto_stream_salsa20,
  crypto_onetimeauth: crypto_onetimeauth,
  crypto_onetimeauth_verify: crypto_onetimeauth_verify,
  crypto_verify_16: crypto_verify_16,
  crypto_verify_32: crypto_verify_32,
  crypto_secretbox: crypto_secretbox,
  crypto_secretbox_open: crypto_secretbox_open,
  crypto_scalarmult: crypto_scalarmult,
  crypto_scalarmult_base: crypto_scalarmult_base,
  crypto_box_beforenm: crypto_box_beforenm,
  crypto_box_afternm: crypto_box_afternm,
  crypto_box: crypto_box,
  crypto_box_open: crypto_box_open,
  crypto_box_keypair: crypto_box_keypair,
  crypto_hash: crypto_hash,
  crypto_sign: crypto_sign,
  crypto_sign_keypair: crypto_sign_keypair,
  crypto_sign_open: crypto_sign_open,

  crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES,
  crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES,
  crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES,
  crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES,
  crypto_scalarmult_BYTES: crypto_scalarmult_BYTES,
  crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES,
  crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES,
  crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES,
  crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES,
  crypto_box_NONCEBYTES: crypto_box_NONCEBYTES,
  crypto_box_ZEROBYTES: crypto_box_ZEROBYTES,
  crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES,
  crypto_sign_BYTES: crypto_sign_BYTES,
  crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES,
  crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES,
  crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES,
  crypto_hash_BYTES: crypto_hash_BYTES
};

/* High-level API */

function checkLengths(k, n) {
  if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size');
  if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size');
}

function checkBoxLengths(pk, sk) {
  if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size');
  if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size');
}

function checkArrayTypes() {
  var t, i;
  for (i = 0; i < arguments.length; i++) {
     if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]')
       throw new TypeError('unexpected type ' + t + ', use Uint8Array');
  }
}

function cleanup(arr) {
  for (var i = 0; i < arr.length; i++) arr[i] = 0;
}

// TODO: Completely remove this in v0.15.
if (!nacl.util) {
  nacl.util = {};
  nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() {
    throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js');
  };
}

nacl.randomBytes = function(n) {
  var b = new Uint8Array(n);
  randombytes(b, n);
  return b;
};

nacl.secretbox = function(msg, nonce, key) {
  checkArrayTypes(msg, nonce, key);
  checkLengths(key, nonce);
  var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);
  var c = new Uint8Array(m.length);
  for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i];
  crypto_secretbox(c, m, m.length, nonce, key);
  return c.subarray(crypto_secretbox_BOXZEROBYTES);
};

nacl.secretbox.open = function(box, nonce, key) {
  checkArrayTypes(box, nonce, key);
  checkLengths(key, nonce);
  var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);
  var m = new Uint8Array(c.length);
  for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i];
  if (c.length < 32) return false;
  if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false;
  return m.subarray(crypto_secretbox_ZEROBYTES);
};

nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES;
nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES;
nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES;

nacl.scalarMult = function(n, p) {
  checkArrayTypes(n, p);
  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');
  if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size');
  var q = new Uint8Array(crypto_scalarmult_BYTES);
  crypto_scalarmult(q, n, p);
  return q;
};

nacl.scalarMult.base = function(n) {
  checkArrayTypes(n);
  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');
  var q = new Uint8Array(crypto_scalarmult_BYTES);
  crypto_scalarmult_base(q, n);
  return q;
};

nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES;
nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES;

nacl.box = function(msg, nonce, publicKey, secretKey) {
  var k = nacl.box.before(publicKey, secretKey);
  return nacl.secretbox(msg, nonce, k);
};

nacl.box.before = function(publicKey, secretKey) {
  checkArrayTypes(publicKey, secretKey);
  checkBoxLengths(publicKey, secretKey);
  var k = new Uint8Array(crypto_box_BEFORENMBYTES);
  crypto_box_beforenm(k, publicKey, secretKey);
  return k;
};

nacl.box.after = nacl.secretbox;

nacl.box.open = function(msg, nonce, publicKey, secretKey) {
  var k = nacl.box.before(publicKey, secretKey);
  return nacl.secretbox.open(msg, nonce, k);
};

nacl.box.open.after = nacl.secretbox.open;

nacl.box.keyPair = function() {
  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
  var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);
  crypto_box_keypair(pk, sk);
  return {publicKey: pk, secretKey: sk};
};

nacl.box.keyPair.fromSecretKey = function(secretKey) {
  checkArrayTypes(secretKey);
  if (secretKey.length !== crypto_box_SECRETKEYBYTES)
    throw new Error('bad secret key size');
  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
  crypto_scalarmult_base(pk, secretKey);
  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};
};

nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES;
nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES;
nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES;
nacl.box.nonceLength = crypto_box_NONCEBYTES;
nacl.box.overheadLength = nacl.secretbox.overheadLength;

nacl.sign = function(msg, secretKey) {
  checkArrayTypes(msg, secretKey);
  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
    throw new Error('bad secret key size');
  var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length);
  crypto_sign(signedMsg, msg, msg.length, secretKey);
  return signedMsg;
};

nacl.sign.open = function(signedMsg, publicKey) {
  if (arguments.length !== 2)
    throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?');
  checkArrayTypes(signedMsg, publicKey);
  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
    throw new Error('bad public key size');
  var tmp = new Uint8Array(signedMsg.length);
  var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);
  if (mlen < 0) return null;
  var m = new Uint8Array(mlen);
  for (var i = 0; i < m.length; i++) m[i] = tmp[i];
  return m;
};

nacl.sign.detached = function(msg, secretKey) {
  var signedMsg = nacl.sign(msg, secretKey);
  var sig = new Uint8Array(crypto_sign_BYTES);
  for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];
  return sig;
};

nacl.sign.detached.verify = function(msg, sig, publicKey) {
  checkArrayTypes(msg, sig, publicKey);
  if (sig.length !== crypto_sign_BYTES)
    throw new Error('bad signature size');
  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
    throw new Error('bad public key size');
  var sm = new Uint8Array(crypto_sign_BYTES + msg.length);
  var m = new Uint8Array(crypto_sign_BYTES + msg.length);
  var i;
  for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];
  for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i];
  return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);
};

nacl.sign.keyPair = function() {
  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
  crypto_sign_keypair(pk, sk);
  return {publicKey: pk, secretKey: sk};
};

nacl.sign.keyPair.fromSecretKey = function(secretKey) {
  checkArrayTypes(secretKey);
  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
    throw new Error('bad secret key size');
  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
  for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i];
  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};
};

nacl.sign.keyPair.fromSeed = function(seed) {
  checkArrayTypes(seed);
  if (seed.length !== crypto_sign_SEEDBYTES)
    throw new Error('bad seed size');
  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
  for (var i = 0; i < 32; i++) sk[i] = seed[i];
  crypto_sign_keypair(pk, sk, true);
  return {publicKey: pk, secretKey: sk};
};

nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES;
nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES;
nacl.sign.seedLength = crypto_sign_SEEDBYTES;
nacl.sign.signatureLength = crypto_sign_BYTES;

nacl.hash = function(msg) {
  checkArrayTypes(msg);
  var h = new Uint8Array(crypto_hash_BYTES);
  crypto_hash(h, msg, msg.length);
  return h;
};

nacl.hash.hashLength = crypto_hash_BYTES;

nacl.verify = function(x, y) {
  checkArrayTypes(x, y);
  // Zero length arguments are considered not equal.
  if (x.length === 0 || y.length === 0) return false;
  if (x.length !== y.length) return false;
  return (vn(x, 0, y, 0, x.length) === 0) ? true : false;
};

nacl.setPRNG = function(fn) {
  randombytes = fn;
};

(function() {
  // Initialize PRNG if environment provides CSPRNG.
  // If not, methods calling randombytes will throw.
  var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null;
  if (crypto && crypto.getRandomValues) {
    // Browsers.
    var QUOTA = 65536;
    nacl.setPRNG(function(x, n) {
      var i, v = new Uint8Array(n);
      for (i = 0; i < n; i += QUOTA) {
        crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));
      }
      for (i = 0; i < n; i++) x[i] = v[i];
      cleanup(v);
    });
  } else if (typeof require !== 'undefined') {
    // Node.js.
    crypto = require('crypto');
    if (crypto && crypto.randomBytes) {
      nacl.setPRNG(function(x, n) {
        var i, v = crypto.randomBytes(n);
        for (i = 0; i < n; i++) x[i] = v[i];
        cleanup(v);
      });
    }
  }
})();

})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {}));
!function(r){"use strict";function n(r,n){return r<<n|r>>>32-n}function e(r,n){var e=255&r[n+3];return e=e<<8|255&r[n+2],e=e<<8|255&r[n+1],e<<8|255&r[n+0]}function t(r,n){var e=r[n]<<24|r[n+1]<<16|r[n+2]<<8|r[n+3],t=r[n+4]<<24|r[n+5]<<16|r[n+6]<<8|r[n+7];return new sr(e,t)}function o(r,n,e){var t;for(t=0;t<4;t++)r[n+t]=255&e,e>>>=8}function i(r,n,e){r[n]=e.hi>>24&255,r[n+1]=e.hi>>16&255,r[n+2]=e.hi>>8&255,r[n+3]=255&e.hi,r[n+4]=e.lo>>24&255,r[n+5]=e.lo>>16&255,r[n+6]=e.lo>>8&255,r[n+7]=255&e.lo}function a(r,n,e,t,o){var i,a=0;for(i=0;i<o;i++)a|=r[n+i]^e[t+i];return(1&a-1>>>8)-1}function f(r,n,e,t){return a(r,n,e,t,16)}function u(r,n,e,t){return a(r,n,e,t,32)}function c(r,t,i,a,f){var u,c,w,y=new Uint32Array(16),l=new Uint32Array(16),s=new Uint32Array(16),h=new Uint32Array(4);for(u=0;u<4;u++)l[5*u]=e(a,4*u),l[1+u]=e(i,4*u),l[6+u]=e(t,4*u),l[11+u]=e(i,16+4*u);for(u=0;u<16;u++)s[u]=l[u];for(u=0;u<20;u++){for(c=0;c<4;c++){for(w=0;w<4;w++)h[w]=l[(5*c+4*w)%16];for(h[1]^=n(h[0]+h[3]|0,7),h[2]^=n(h[1]+h[0]|0,9),h[3]^=n(h[2]+h[1]|0,13),h[0]^=n(h[3]+h[2]|0,18),w=0;w<4;w++)y[4*c+(c+w)%4]=h[w]}for(w=0;w<16;w++)l[w]=y[w]}if(f){for(u=0;u<16;u++)l[u]=l[u]+s[u]|0;for(u=0;u<4;u++)l[5*u]=l[5*u]-e(a,4*u)|0,l[6+u]=l[6+u]-e(t,4*u)|0;for(u=0;u<4;u++)o(r,4*u,l[5*u]),o(r,16+4*u,l[6+u])}else for(u=0;u<16;u++)o(r,4*u,l[u]+s[u]|0)}function w(r,n,e,t){return c(r,n,e,t,!1),0}function y(r,n,e,t){return c(r,n,e,t,!0),0}function l(r,n,e,t,o,i,a){var f,u,c=new Uint8Array(16),y=new Uint8Array(64);if(!o)return 0;for(u=0;u<16;u++)c[u]=0;for(u=0;u<8;u++)c[u]=i[u];for(;o>=64;){for(w(y,c,a,Br),u=0;u<64;u++)r[n+u]=(e?e[t+u]:0)^y[u];for(f=1,u=8;u<16;u++)f=f+(255&c[u])|0,c[u]=255&f,f>>>=8;o-=64,n+=64,e&&(t+=64)}if(o>0)for(w(y,c,a,Br),u=0;u<o;u++)r[n+u]=(e?e[t+u]:0)^y[u];return 0}function s(r,n,e,t,o){return l(r,n,null,0,e,t,o)}function h(r,n,e,t,o){var i=new Uint8Array(32);return y(i,t,o,Br),s(r,n,e,t.subarray(16),i)}function g(r,n,e,t,o,i,a){var f=new Uint8Array(32);return y(f,i,a,Br),l(r,n,e,t,o,i.subarray(16),f)}function v(r,n){var e,t=0;for(e=0;e<17;e++)t=t+(r[e]+n[e]|0)|0,r[e]=255&t,t>>>=8}function b(r,n,e,t,o,i){var a,f,u,c,w=new Uint32Array(17),y=new Uint32Array(17),l=new Uint32Array(17),s=new Uint32Array(17),h=new Uint32Array(17);for(u=0;u<17;u++)y[u]=l[u]=0;for(u=0;u<16;u++)y[u]=i[u];for(y[3]&=15,y[4]&=252,y[7]&=15,y[8]&=252,y[11]&=15,y[12]&=252,y[15]&=15;o>0;){for(u=0;u<17;u++)s[u]=0;for(u=0;u<16&&u<o;++u)s[u]=e[t+u];for(s[u]=1,t+=u,o-=u,v(l,s),f=0;f<17;f++)for(w[f]=0,u=0;u<17;u++)w[f]=w[f]+l[u]*(u<=f?y[f-u]:320*y[f+17-u]|0)|0|0;for(f=0;f<17;f++)l[f]=w[f];for(c=0,u=0;u<16;u++)c=c+l[u]|0,l[u]=255&c,c>>>=8;for(c=c+l[16]|0,l[16]=3&c,c=5*(c>>>2)|0,u=0;u<16;u++)c=c+l[u]|0,l[u]=255&c,c>>>=8;c=c+l[16]|0,l[16]=c}for(u=0;u<17;u++)h[u]=l[u];for(v(l,Sr),a=0|-(l[16]>>>7),u=0;u<17;u++)l[u]^=a&(h[u]^l[u]);for(u=0;u<16;u++)s[u]=i[u+16];for(s[16]=0,v(l,s),u=0;u<16;u++)r[n+u]=l[u];return 0}function p(r,n,e,t,o,i){var a=new Uint8Array(16);return b(a,0,e,t,o,i),f(r,n,a,0)}function _(r,n,e,t,o){var i;if(e<32)return-1;for(g(r,0,n,0,e,t,o),b(r,16,r,32,e-32,r),i=0;i<16;i++)r[i]=0;return 0}function A(r,n,e,t,o){var i,a=new Uint8Array(32);if(e<32)return-1;if(h(a,0,32,t,o),0!==p(n,16,n,32,e-32,a))return-1;for(g(r,0,n,0,e,t,o),i=0;i<32;i++)r[i]=0;return 0}function U(r,n){var e;for(e=0;e<16;e++)r[e]=0|n[e]}function E(r){var n,e;for(e=0;e<16;e++)r[e]+=65536,n=Math.floor(r[e]/65536),r[(e+1)*(e<15?1:0)]+=n-1+37*(n-1)*(15===e?1:0),r[e]-=65536*n}function d(r,n,e){for(var t,o=~(e-1),i=0;i<16;i++)t=o&(r[i]^n[i]),r[i]^=t,n[i]^=t}function x(r,n){var e,t,o,i=hr(),a=hr();for(e=0;e<16;e++)a[e]=n[e];for(E(a),E(a),E(a),t=0;t<2;t++){for(i[0]=a[0]-65517,e=1;e<15;e++)i[e]=a[e]-65535-(i[e-1]>>16&1),i[e-1]&=65535;i[15]=a[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,d(a,i,1-o)}for(e=0;e<16;e++)r[2*e]=255&a[e],r[2*e+1]=a[e]>>8}function m(r,n){var e=new Uint8Array(32),t=new Uint8Array(32);return x(e,r),x(t,n),u(e,0,t,0)}function B(r){var n=new Uint8Array(32);return x(n,r),1&n[0]}function S(r,n){var e;for(e=0;e<16;e++)r[e]=n[2*e]+(n[2*e+1]<<8);r[15]&=32767}function K(r,n,e){var t;for(t=0;t<16;t++)r[t]=n[t]+e[t]|0}function T(r,n,e){var t;for(t=0;t<16;t++)r[t]=n[t]-e[t]|0}function Y(r,n,e){var t,o,i=new Float64Array(31);for(t=0;t<31;t++)i[t]=0;for(t=0;t<16;t++)for(o=0;o<16;o++)i[t+o]+=n[t]*e[o];for(t=0;t<15;t++)i[t]+=38*i[t+16];for(t=0;t<16;t++)r[t]=i[t];E(r),E(r)}function L(r,n){Y(r,n,n)}function k(r,n){var e,t=hr();for(e=0;e<16;e++)t[e]=n[e];for(e=253;e>=0;e--)L(t,t),2!==e&&4!==e&&Y(t,t,n);for(e=0;e<16;e++)r[e]=t[e]}function z(r,n){var e,t=hr();for(e=0;e<16;e++)t[e]=n[e];for(e=250;e>=0;e--)L(t,t),1!==e&&Y(t,t,n);for(e=0;e<16;e++)r[e]=t[e]}function R(r,n,e){var t,o,i=new Uint8Array(32),a=new Float64Array(80),f=hr(),u=hr(),c=hr(),w=hr(),y=hr(),l=hr();for(o=0;o<31;o++)i[o]=n[o];for(i[31]=127&n[31]|64,i[0]&=248,S(a,e),o=0;o<16;o++)u[o]=a[o],w[o]=f[o]=c[o]=0;for(f[0]=w[0]=1,o=254;o>=0;--o)t=i[o>>>3]>>>(7&o)&1,d(f,u,t),d(c,w,t),K(y,f,c),T(f,f,c),K(c,u,w),T(u,u,w),L(w,y),L(l,f),Y(f,c,f),Y(c,u,y),K(y,f,c),T(f,f,c),L(u,f),T(c,w,l),Y(f,c,Ar),K(f,f,w),Y(c,c,f),Y(f,w,l),Y(w,u,a),L(u,y),d(f,u,t),d(c,w,t);for(o=0;o<16;o++)a[o+16]=f[o],a[o+32]=c[o],a[o+48]=u[o],a[o+64]=w[o];var s=a.subarray(32),h=a.subarray(16);return k(s,s),Y(h,h,s),x(r,h),0}function P(r,n){return R(r,n,br)}function O(r,n){return gr(n,32),P(r,n)}function F(r,n,e){var t=new Uint8Array(32);return R(t,e,n),y(r,vr,t,Br)}function N(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Kr(r,n,e,t,a)}function C(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Tr(r,n,e,t,a)}function M(){var r,n,e,t=0,o=0,i=0,a=0,f=65535;for(e=0;e<arguments.length;e++)r=arguments[e].lo,n=arguments[e].hi,t+=r&f,o+=r>>>16,i+=n&f,a+=n>>>16;return o+=t>>>16,i+=o>>>16,a+=i>>>16,new sr(i&f|a<<16,t&f|o<<16)}function G(r,n){return new sr(r.hi>>>n,r.lo>>>n|r.hi<<32-n)}function Z(){var r,n=0,e=0;for(r=0;r<arguments.length;r++)n^=arguments[r].lo,e^=arguments[r].hi;return new sr(e,n)}function j(r,n){var e,t,o=32-n;return n<32?(e=r.hi>>>n|r.lo<<o,t=r.lo>>>n|r.hi<<o):n<64&&(e=r.lo>>>n|r.hi<<o,t=r.hi>>>n|r.lo<<o),new sr(e,t)}function q(r,n,e){var t=r.hi&n.hi^~r.hi&e.hi,o=r.lo&n.lo^~r.lo&e.lo;return new sr(t,o)}function I(r,n,e){var t=r.hi&n.hi^r.hi&e.hi^n.hi&e.hi,o=r.lo&n.lo^r.lo&e.lo^n.lo&e.lo;return new sr(t,o)}function V(r){return Z(j(r,28),j(r,34),j(r,39))}function X(r){return Z(j(r,14),j(r,18),j(r,41))}function D(r){return Z(j(r,1),j(r,8),G(r,7))}function H(r){return Z(j(r,19),j(r,61),G(r,6))}function J(r,n,e){var o,a,f,u=[],c=[],w=[],y=[];for(a=0;a<8;a++)u[a]=w[a]=t(r,8*a);for(var l=0;e>=128;){for(a=0;a<16;a++)y[a]=t(n,8*a+l);for(a=0;a<80;a++){for(f=0;f<8;f++)c[f]=w[f];for(o=M(w[7],X(w[4]),q(w[4],w[5],w[6]),Yr[a],y[a%16]),c[7]=M(o,V(w[0]),I(w[0],w[1],w[2])),c[3]=M(c[3],o),f=0;f<8;f++)w[(f+1)%8]=c[f];if(a%16===15)for(f=0;f<16;f++)y[f]=M(y[f],y[(f+9)%16],D(y[(f+1)%16]),H(y[(f+14)%16]))}for(a=0;a<8;a++)w[a]=M(w[a],u[a]),u[a]=w[a];l+=128,e-=128}for(a=0;a<8;a++)i(r,8*a,u[a]);return e}function Q(r,n,e){var t,o=new Uint8Array(64),a=new Uint8Array(256),f=e;for(t=0;t<64;t++)o[t]=Lr[t];for(J(o,n,e),e%=128,t=0;t<256;t++)a[t]=0;for(t=0;t<e;t++)a[t]=n[f-e+t];for(a[e]=128,e=256-128*(e<112?1:0),a[e-9]=0,i(a,e-8,new sr(f/536870912|0,f<<3)),J(o,a,e),t=0;t<64;t++)r[t]=o[t];return 0}function W(r,n){var e=hr(),t=hr(),o=hr(),i=hr(),a=hr(),f=hr(),u=hr(),c=hr(),w=hr();T(e,r[1],r[0]),T(w,n[1],n[0]),Y(e,e,w),K(t,r[0],r[1]),K(w,n[0],n[1]),Y(t,t,w),Y(o,r[3],n[3]),Y(o,o,Er),Y(i,r[2],n[2]),K(i,i,i),T(a,t,e),T(f,i,o),K(u,i,o),K(c,t,e),Y(r[0],a,f),Y(r[1],c,u),Y(r[2],u,f),Y(r[3],a,c)}function $(r,n,e){var t;for(t=0;t<4;t++)d(r[t],n[t],e)}function rr(r,n){var e=hr(),t=hr(),o=hr();k(o,n[2]),Y(e,n[0],o),Y(t,n[1],o),x(r,t),r[31]^=B(e)<<7}function nr(r,n,e){var t,o;for(U(r[0],pr),U(r[1],_r),U(r[2],_r),U(r[3],pr),o=255;o>=0;--o)t=e[o/8|0]>>(7&o)&1,$(r,n,t),W(n,r),W(r,r),$(r,n,t)}function er(r,n){var e=[hr(),hr(),hr(),hr()];U(e[0],dr),U(e[1],xr),U(e[2],_r),Y(e[3],dr,xr),nr(r,e,n)}function tr(r,n,e){var t,o=new Uint8Array(64),i=[hr(),hr(),hr(),hr()];for(e||gr(n,32),Q(o,n,32),o[0]&=248,o[31]&=127,o[31]|=64,er(i,o),rr(r,i),t=0;t<32;t++)n[t+32]=r[t];return 0}function or(r,n){var e,t,o,i;for(t=63;t>=32;--t){for(e=0,o=t-32,i=t-12;o<i;++o)n[o]+=e-16*n[t]*kr[o-(t-32)],e=n[o]+128>>8,n[o]-=256*e;n[o]+=e,n[t]=0}for(e=0,o=0;o<32;o++)n[o]+=e-(n[31]>>4)*kr[o],e=n[o]>>8,n[o]&=255;for(o=0;o<32;o++)n[o]-=e*kr[o];for(t=0;t<32;t++)n[t+1]+=n[t]>>8,r[t]=255&n[t]}function ir(r){var n,e=new Float64Array(64);for(n=0;n<64;n++)e[n]=r[n];for(n=0;n<64;n++)r[n]=0;or(r,e)}function ar(r,n,e,t){var o,i,a=new Uint8Array(64),f=new Uint8Array(64),u=new Uint8Array(64),c=new Float64Array(64),w=[hr(),hr(),hr(),hr()];Q(a,t,32),a[0]&=248,a[31]&=127,a[31]|=64;var y=e+64;for(o=0;o<e;o++)r[64+o]=n[o];for(o=0;o<32;o++)r[32+o]=a[32+o];for(Q(u,r.subarray(32),e+32),ir(u),er(w,u),rr(r,w),o=32;o<64;o++)r[o]=t[o];for(Q(f,r,e+64),ir(f),o=0;o<64;o++)c[o]=0;for(o=0;o<32;o++)c[o]=u[o];for(o=0;o<32;o++)for(i=0;i<32;i++)c[o+i]+=f[o]*a[i];return or(r.subarray(32),c),y}function fr(r,n){var e=hr(),t=hr(),o=hr(),i=hr(),a=hr(),f=hr(),u=hr();return U(r[2],_r),S(r[1],n),L(o,r[1]),Y(i,o,Ur),T(o,o,r[2]),K(i,r[2],i),L(a,i),L(f,a),Y(u,f,a),Y(e,u,o),Y(e,e,i),z(e,e),Y(e,e,o),Y(e,e,i),Y(e,e,i),Y(r[0],e,i),L(t,r[0]),Y(t,t,i),m(t,o)&&Y(r[0],r[0],mr),L(t,r[0]),Y(t,t,i),m(t,o)?-1:(B(r[0])===n[31]>>7&&T(r[0],pr,r[0]),Y(r[3],r[0],r[1]),0)}function ur(r,n,e,t){var o,i,a=new Uint8Array(32),f=new Uint8Array(64),c=[hr(),hr(),hr(),hr()],w=[hr(),hr(),hr(),hr()];if(i=-1,e<64)return-1;if(fr(w,t))return-1;for(o=0;o<e;o++)r[o]=n[o];for(o=0;o<32;o++)r[o+32]=t[o];if(Q(f,r,e),ir(f),nr(c,w,f),er(w,n.subarray(32)),W(c,w),rr(a,c),e-=64,u(n,0,a,0)){for(o=0;o<e;o++)r[o]=0;return-1}for(o=0;o<e;o++)r[o]=n[o+64];return i=e}function cr(r,n){if(r.length!==zr)throw new Error("bad key size");if(n.length!==Rr)throw new Error("bad nonce size")}function wr(r,n){if(r.length!==Cr)throw new Error("bad public key size");if(n.length!==Mr)throw new Error("bad secret key size")}function yr(){var r,n;for(n=0;n<arguments.length;n++)if("[object Uint8Array]"!==(r=Object.prototype.toString.call(arguments[n])))throw new TypeError("unexpected type "+r+", use Uint8Array")}function lr(r){for(var n=0;n<r.length;n++)r[n]=0}var sr=function(r,n){this.hi=0|r,this.lo=0|n},hr=function(r){var n,e=new Float64Array(16);if(r)for(n=0;n<r.length;n++)e[n]=r[n];return e},gr=function(){throw new Error("no PRNG")},vr=new Uint8Array(16),br=new Uint8Array(32);br[0]=9;var pr=hr(),_r=hr([1]),Ar=hr([56129,1]),Ur=hr([30883,4953,19914,30187,55467,16705,2637,112,59544,30585,16505,36039,65139,11119,27886,20995]),Er=hr([61785,9906,39828,60374,45398,33411,5274,224,53552,61171,33010,6542,64743,22239,55772,9222]),dr=hr([54554,36645,11616,51542,42930,38181,51040,26924,56412,64982,57905,49316,21502,52590,14035,8553]),xr=hr([26200,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214]),mr=hr([41136,18958,6951,50414,58488,44335,6150,12099,55207,15867,153,11085,57099,20417,9344,11139]),Br=new Uint8Array([101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107]),Sr=new Uint32Array([5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252]),Kr=_,Tr=A,Yr=[new sr(1116352408,3609767458),new sr(1899447441,602891725),new sr(3049323471,3964484399),new sr(3921009573,2173295548),new sr(961987163,4081628472),new sr(1508970993,3053834265),new sr(2453635748,2937671579),new sr(2870763221,3664609560),new sr(3624381080,2734883394),new sr(310598401,1164996542),new sr(607225278,1323610764),new sr(1426881987,3590304994),new sr(1925078388,4068182383),new sr(2162078206,991336113),new sr(2614888103,633803317),new sr(3248222580,3479774868),new sr(3835390401,2666613458),new sr(4022224774,944711139),new sr(264347078,2341262773),new sr(604807628,2007800933),new sr(770255983,1495990901),new sr(1249150122,1856431235),new sr(1555081692,3175218132),new sr(1996064986,2198950837),new sr(2554220882,3999719339),new sr(2821834349,766784016),new sr(2952996808,2566594879),new sr(3210313671,3203337956),new sr(3336571891,1034457026),new sr(3584528711,2466948901),new sr(113926993,3758326383),new sr(338241895,168717936),new sr(666307205,1188179964),new sr(773529912,1546045734),new sr(1294757372,1522805485),new sr(1396182291,2643833823),new sr(1695183700,2343527390),new sr(1986661051,1014477480),new sr(2177026350,1206759142),new sr(2456956037,344077627),new sr(2730485921,1290863460),new sr(2820302411,3158454273),new sr(3259730800,3505952657),new sr(3345764771,106217008),new sr(3516065817,3606008344),new sr(3600352804,1432725776),new sr(4094571909,1467031594),new sr(275423344,851169720),new sr(430227734,3100823752),new sr(506948616,1363258195),new sr(659060556,3750685593),new sr(883997877,3785050280),new sr(958139571,3318307427),new sr(1322822218,3812723403),new sr(1537002063,2003034995),new sr(1747873779,3602036899),new sr(1955562222,1575990012),new sr(2024104815,1125592928),new sr(2227730452,2716904306),new sr(2361852424,442776044),new sr(2428436474,593698344),new sr(2756734187,3733110249),new sr(3204031479,2999351573),new sr(3329325298,3815920427),new sr(3391569614,3928383900),new sr(3515267271,566280711),new sr(3940187606,3454069534),new sr(4118630271,4000239992),new sr(116418474,1914138554),new sr(174292421,2731055270),new sr(289380356,3203993006),new sr(460393269,320620315),new sr(685471733,587496836),new sr(852142971,1086792851),new sr(1017036298,365543100),new sr(1126000580,2618297676),new sr(1288033470,3409855158),new sr(1501505948,4234509866),new sr(1607167915,987167468),new sr(1816402316,1246189591)],Lr=new Uint8Array([106,9,230,103,243,188,201,8,187,103,174,133,132,202,167,59,60,110,243,114,254,148,248,43,165,79,245,58,95,29,54,241,81,14,82,127,173,230,130,209,155,5,104,140,43,62,108,31,31,131,217,171,251,65,189,107,91,224,205,25,19,126,33,121]),kr=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]),zr=32,Rr=24,Pr=32,Or=16,Fr=32,Nr=32,Cr=32,Mr=32,Gr=32,Zr=Rr,jr=Pr,qr=Or,Ir=64,Vr=32,Xr=64,Dr=32,Hr=64;r.lowlevel={crypto_core_hsalsa20:y,crypto_stream_xor:g,crypto_stream:h,crypto_stream_salsa20_xor:l,crypto_stream_salsa20:s,crypto_onetimeauth:b,crypto_onetimeauth_verify:p,crypto_verify_16:f,crypto_verify_32:u,crypto_secretbox:_,crypto_secretbox_open:A,crypto_scalarmult:R,crypto_scalarmult_base:P,crypto_box_beforenm:F,crypto_box_afternm:Kr,crypto_box:N,crypto_box_open:C,crypto_box_keypair:O,crypto_hash:Q,crypto_sign:ar,crypto_sign_keypair:tr,crypto_sign_open:ur,crypto_secretbox_KEYBYTES:zr,crypto_secretbox_NONCEBYTES:Rr,crypto_secretbox_ZEROBYTES:Pr,crypto_secretbox_BOXZEROBYTES:Or,crypto_scalarmult_BYTES:Fr,crypto_scalarmult_SCALARBYTES:Nr,crypto_box_PUBLICKEYBYTES:Cr,crypto_box_SECRETKEYBYTES:Mr,crypto_box_BEFORENMBYTES:Gr,crypto_box_NONCEBYTES:Zr,crypto_box_ZEROBYTES:jr,crypto_box_BOXZEROBYTES:qr,crypto_sign_BYTES:Ir,crypto_sign_PUBLICKEYBYTES:Vr,crypto_sign_SECRETKEYBYTES:Xr,crypto_sign_SEEDBYTES:Dr,crypto_hash_BYTES:Hr},r.util||(r.util={},r.util.decodeUTF8=r.util.encodeUTF8=r.util.encodeBase64=r.util.decodeBase64=function(){throw new Error("nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js")}),r.randomBytes=function(r){var n=new Uint8Array(r);return gr(n,r),n},r.secretbox=function(r,n,e){yr(r,n,e),cr(e,n);for(var t=new Uint8Array(Pr+r.length),o=new Uint8Array(t.length),i=0;i<r.length;i++)t[i+Pr]=r[i];return _(o,t,t.length,n,e),o.subarray(Or)},r.secretbox.open=function(r,n,e){yr(r,n,e),cr(e,n);for(var t=new Uint8Array(Or+r.length),o=new Uint8Array(t.length),i=0;i<r.length;i++)t[i+Or]=r[i];return!(t.length<32)&&(0===A(o,t,t.length,n,e)&&o.subarray(Pr))},r.secretbox.keyLength=zr,r.secretbox.nonceLength=Rr,r.secretbox.overheadLength=Or,r.scalarMult=function(r,n){if(yr(r,n),r.length!==Nr)throw new Error("bad n size");if(n.length!==Fr)throw new Error("bad p size");var e=new Uint8Array(Fr);return R(e,r,n),e},r.scalarMult.base=function(r){if(yr(r),r.length!==Nr)throw new Error("bad n size");var n=new Uint8Array(Fr);return P(n,r),n},r.scalarMult.scalarLength=Nr,r.scalarMult.groupElementLength=Fr,r.box=function(n,e,t,o){var i=r.box.before(t,o);return r.secretbox(n,e,i)},r.box.before=function(r,n){yr(r,n),wr(r,n);var e=new Uint8Array(Gr);return F(e,r,n),e},r.box.after=r.secretbox,r.box.open=function(n,e,t,o){var i=r.box.before(t,o);return r.secretbox.open(n,e,i)},r.box.open.after=r.secretbox.open,r.box.keyPair=function(){var r=new Uint8Array(Cr),n=new Uint8Array(Mr);return O(r,n),{publicKey:r,secretKey:n}},r.box.keyPair.fromSecretKey=function(r){if(yr(r),r.length!==Mr)throw new Error("bad secret key size");var n=new Uint8Array(Cr);return P(n,r),{publicKey:n,secretKey:new Uint8Array(r)}},r.box.publicKeyLength=Cr,r.box.secretKeyLength=Mr,r.box.sharedKeyLength=Gr,r.box.nonceLength=Zr,r.box.overheadLength=r.secretbox.overheadLength,r.sign=function(r,n){if(yr(r,n),n.length!==Xr)throw new Error("bad secret key size");var e=new Uint8Array(Ir+r.length);return ar(e,r,r.length,n),e},r.sign.open=function(r,n){if(2!==arguments.length)throw new Error("nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?");if(yr(r,n),n.length!==Vr)throw new Error("bad public key size");var e=new Uint8Array(r.length),t=ur(e,r,r.length,n);if(t<0)return null;for(var o=new Uint8Array(t),i=0;i<o.length;i++)o[i]=e[i];return o},r.sign.detached=function(n,e){for(var t=r.sign(n,e),o=new Uint8Array(Ir),i=0;i<o.length;i++)o[i]=t[i];return o},r.sign.detached.verify=function(r,n,e){if(yr(r,n,e),n.length!==Ir)throw new Error("bad signature size");if(e.length!==Vr)throw new Error("bad public key size");var t,o=new Uint8Array(Ir+r.length),i=new Uint8Array(Ir+r.length);for(t=0;t<Ir;t++)o[t]=n[t];for(t=0;t<r.length;t++)o[t+Ir]=r[t];return ur(i,o,o.length,e)>=0},r.sign.keyPair=function(){var r=new Uint8Array(Vr),n=new Uint8Array(Xr);return tr(r,n),{publicKey:r,secretKey:n}},r.sign.keyPair.fromSecretKey=function(r){if(yr(r),r.length!==Xr)throw new Error("bad secret key size");for(var n=new Uint8Array(Vr),e=0;e<n.length;e++)n[e]=r[32+e];return{publicKey:n,secretKey:new Uint8Array(r)}},r.sign.keyPair.fromSeed=function(r){if(yr(r),r.length!==Dr)throw new Error("bad seed size");for(var n=new Uint8Array(Vr),e=new Uint8Array(Xr),t=0;t<32;t++)e[t]=r[t];return tr(n,e,!0),{publicKey:n,secretKey:e}},r.sign.publicKeyLength=Vr,r.sign.secretKeyLength=Xr,r.sign.seedLength=Dr,r.sign.signatureLength=Ir,r.hash=function(r){yr(r);var n=new Uint8Array(Hr);return Q(n,r,r.length),n},r.hash.hashLength=Hr,r.verify=function(r,n){return yr(r,n),0!==r.length&&0!==n.length&&(r.length===n.length&&0===a(r,0,n,0,r.length))},r.setPRNG=function(r){gr=r},function(){var n="undefined"!=typeof self?self.crypto||self.msCrypto:null;if(n&&n.getRandomValues){var e=65536;r.setPRNG(function(r,t){var o,i=new Uint8Array(t);for(o=0;o<t;o+=e)n.getRandomValues(i.subarray(o,o+Math.min(t-o,e)));for(o=0;o<t;o++)r[o]=i[o];lr(i)})}else"undefined"!=typeof require&&(n=require("crypto"),n&&n.randomBytes&&r.setPRNG(function(r,e){var t,o=n.randomBytes(e);for(t=0;t<e;t++)r[t]=o[t];lr(o)}))}()}("undefined"!=typeof module&&module.exports?module.exports:self.nacl=self.nacl||{});{
  "author": {
    "name": "TweetNaCl-js contributors"
  },
  "browser": {
    "buffer": false,
    "crypto": false
  },
  "deprecated": false,
  "description": "Port of TweetNaCl cryptographic library to JavaScript",
  "devDependencies": {
    "browserify": "^13.0.0",
    "eslint": "^2.2.0",
    "faucet": "^0.0.1",
    "tap-browser-color": "^0.1.2",
    "tape": "^4.4.0",
    "tape-run": "^2.1.3",
    "tweetnacl-util": "^0.13.3",
    "uglify-js": "^2.6.1"
  },
  "directories": {
    "test": "test"
  },
  "homepage": "https://tweetnacl.js.org",
  "license": "Unlicense",
  "main": "nacl-fast.js",
  "name": "tweetnacl",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/dchest/tweetnacl-js.git"
  },
  "types": "nacl.d.ts",
  "version": "0.14.5"
}MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "A collection of essential TypeScript types",
  "devDependencies": {
    "@sindresorhus/tsconfig": "^0.3.0",
    "@typescript-eslint/eslint-plugin": "^1.5.0",
    "eslint-config-xo-typescript": "^0.9.0",
    "tsd": "^0.7.2",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.d.ts",
    "source"
  ],
  "homepage": "https://github.com/sindresorhus/type-fest#readme",
  "license": "(MIT OR CC0-1.0)",
  "name": "type-fest",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/type-fest.git"
  },
  "version": "0.3.1"
}/*
 Copyright (c) 2010, Linden Research, Inc.
 Copyright (c) 2012, Joshua Bell

 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 $/LicenseInfo$
 */

// Original can be found at:
//   https://bitbucket.org/lindenlab/llsd
// Modifications by Joshua Bell inexorabletash@gmail.com
//   https://github.com/inexorabletash/polyfill

// ES3/ES5 implementation of the Krhonos Typed Array Specification
//   Ref: http://www.khronos.org/registry/typedarray/specs/latest/
//   Date: 2011-02-01
//
// Variations:
//  * Allows typed_array.get/set() as alias for subscripts (typed_array[])
var undefined = (void 0); // Paranoia

// Beyond this value, index getters/setters (i.e. array[0], array[1]) are so slow to
// create, and consume so much memory, that the browser appears frozen.
var MAX_ARRAY_LENGTH = 1e5;

// Approximations of internal ECMAScript conversion functions
var ECMAScript = (function() {
  // Stash a copy in case other scripts modify these
  var opts = Object.prototype.toString,
      ophop = Object.prototype.hasOwnProperty;

  return {
    // Class returns internal [[Class]] property, used to avoid cross-frame instanceof issues:
    Class: function(v) { return opts.call(v).replace(/^\[object *|\]$/g, ''); },
    HasProperty: function(o, p) { return p in o; },
    HasOwnProperty: function(o, p) { return ophop.call(o, p); },
    IsCallable: function(o) { return typeof o === 'function'; },
    ToInt32: function(v) { return v >> 0; },
    ToUint32: function(v) { return v >>> 0; }
  };
}());

// Snapshot intrinsics
var LN2 = Math.LN2,
    abs = Math.abs,
    floor = Math.floor,
    log = Math.log,
    min = Math.min,
    pow = Math.pow,
    round = Math.round;

// ES5: lock down object properties
function configureProperties(obj) {
  if (getOwnPropNames && defineProp) {
    var props = getOwnPropNames(obj), i;
    for (i = 0; i < props.length; i += 1) {
      defineProp(obj, props[i], {
        value: obj[props[i]],
        writable: false,
        enumerable: false,
        configurable: false
      });
    }
  }
}

// emulate ES5 getter/setter API using legacy APIs
// http://blogs.msdn.com/b/ie/archive/2010/09/07/transitioning-existing-code-to-the-es5-getter-setter-apis.aspx
// (second clause tests for Object.defineProperty() in IE<9 that only supports extending DOM prototypes, but
// note that IE<9 does not support __defineGetter__ or __defineSetter__ so it just renders the method harmless)
var defineProp
if (Object.defineProperty && (function() {
      try {
        Object.defineProperty({}, 'x', {});
        return true;
      } catch (e) {
        return false;
      }
    })()) {
  defineProp = Object.defineProperty;
} else {
  defineProp = function(o, p, desc) {
    if (!o === Object(o)) throw new TypeError("Object.defineProperty called on non-object");
    if (ECMAScript.HasProperty(desc, 'get') && Object.prototype.__defineGetter__) { Object.prototype.__defineGetter__.call(o, p, desc.get); }
    if (ECMAScript.HasProperty(desc, 'set') && Object.prototype.__defineSetter__) { Object.prototype.__defineSetter__.call(o, p, desc.set); }
    if (ECMAScript.HasProperty(desc, 'value')) { o[p] = desc.value; }
    return o;
  };
}

var getOwnPropNames = Object.getOwnPropertyNames || function (o) {
  if (o !== Object(o)) throw new TypeError("Object.getOwnPropertyNames called on non-object");
  var props = [], p;
  for (p in o) {
    if (ECMAScript.HasOwnProperty(o, p)) {
      props.push(p);
    }
  }
  return props;
};

// ES5: Make obj[index] an alias for obj._getter(index)/obj._setter(index, value)
// for index in 0 ... obj.length
function makeArrayAccessors(obj) {
  if (!defineProp) { return; }

  if (obj.length > MAX_ARRAY_LENGTH) throw new RangeError("Array too large for polyfill");

  function makeArrayAccessor(index) {
    defineProp(obj, index, {
      'get': function() { return obj._getter(index); },
      'set': function(v) { obj._setter(index, v); },
      enumerable: true,
      configurable: false
    });
  }

  var i;
  for (i = 0; i < obj.length; i += 1) {
    makeArrayAccessor(i);
  }
}

// Internal conversion functions:
//    pack<Type>()   - take a number (interpreted as Type), output a byte array
//    unpack<Type>() - take a byte array, output a Type-like number

function as_signed(value, bits) { var s = 32 - bits; return (value << s) >> s; }
function as_unsigned(value, bits) { var s = 32 - bits; return (value << s) >>> s; }

function packI8(n) { return [n & 0xff]; }
function unpackI8(bytes) { return as_signed(bytes[0], 8); }

function packU8(n) { return [n & 0xff]; }
function unpackU8(bytes) { return as_unsigned(bytes[0], 8); }

function packU8Clamped(n) { n = round(Number(n)); return [n < 0 ? 0 : n > 0xff ? 0xff : n & 0xff]; }

function packI16(n) { return [(n >> 8) & 0xff, n & 0xff]; }
function unpackI16(bytes) { return as_signed(bytes[0] << 8 | bytes[1], 16); }

function packU16(n) { return [(n >> 8) & 0xff, n & 0xff]; }
function unpackU16(bytes) { return as_unsigned(bytes[0] << 8 | bytes[1], 16); }

function packI32(n) { return [(n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff]; }
function unpackI32(bytes) { return as_signed(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], 32); }

function packU32(n) { return [(n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff]; }
function unpackU32(bytes) { return as_unsigned(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], 32); }

function packIEEE754(v, ebits, fbits) {

  var bias = (1 << (ebits - 1)) - 1,
      s, e, f, ln,
      i, bits, str, bytes;

  function roundToEven(n) {
    var w = floor(n), f = n - w;
    if (f < 0.5)
      return w;
    if (f > 0.5)
      return w + 1;
    return w % 2 ? w + 1 : w;
  }

  // Compute sign, exponent, fraction
  if (v !== v) {
    // NaN
    // http://dev.w3.org/2006/webapi/WebIDL/#es-type-mapping
    e = (1 << ebits) - 1; f = pow(2, fbits - 1); s = 0;
  } else if (v === Infinity || v === -Infinity) {
    e = (1 << ebits) - 1; f = 0; s = (v < 0) ? 1 : 0;
  } else if (v === 0) {
    e = 0; f = 0; s = (1 / v === -Infinity) ? 1 : 0;
  } else {
    s = v < 0;
    v = abs(v);

    if (v >= pow(2, 1 - bias)) {
      e = min(floor(log(v) / LN2), 1023);
      f = roundToEven(v / pow(2, e) * pow(2, fbits));
      if (f / pow(2, fbits) >= 2) {
        e = e + 1;
        f = 1;
      }
      if (e > bias) {
        // Overflow
        e = (1 << ebits) - 1;
        f = 0;
      } else {
        // Normalized
        e = e + bias;
        f = f - pow(2, fbits);
      }
    } else {
      // Denormalized
      e = 0;
      f = roundToEven(v / pow(2, 1 - bias - fbits));
    }
  }

  // Pack sign, exponent, fraction
  bits = [];
  for (i = fbits; i; i -= 1) { bits.push(f % 2 ? 1 : 0); f = floor(f / 2); }
  for (i = ebits; i; i -= 1) { bits.push(e % 2 ? 1 : 0); e = floor(e / 2); }
  bits.push(s ? 1 : 0);
  bits.reverse();
  str = bits.join('');

  // Bits to bytes
  bytes = [];
  while (str.length) {
    bytes.push(parseInt(str.substring(0, 8), 2));
    str = str.substring(8);
  }
  return bytes;
}

function unpackIEEE754(bytes, ebits, fbits) {

  // Bytes to bits
  var bits = [], i, j, b, str,
      bias, s, e, f;

  for (i = bytes.length; i; i -= 1) {
    b = bytes[i - 1];
    for (j = 8; j; j -= 1) {
      bits.push(b % 2 ? 1 : 0); b = b >> 1;
    }
  }
  bits.reverse();
  str = bits.join('');

  // Unpack sign, exponent, fraction
  bias = (1 << (ebits - 1)) - 1;
  s = parseInt(str.substring(0, 1), 2) ? -1 : 1;
  e = parseInt(str.substring(1, 1 + ebits), 2);
  f = parseInt(str.substring(1 + ebits), 2);

  // Produce number
  if (e === (1 << ebits) - 1) {
    return f !== 0 ? NaN : s * Infinity;
  } else if (e > 0) {
    // Normalized
    return s * pow(2, e - bias) * (1 + f / pow(2, fbits));
  } else if (f !== 0) {
    // Denormalized
    return s * pow(2, -(bias - 1)) * (f / pow(2, fbits));
  } else {
    return s < 0 ? -0 : 0;
  }
}

function unpackF64(b) { return unpackIEEE754(b, 11, 52); }
function packF64(v) { return packIEEE754(v, 11, 52); }
function unpackF32(b) { return unpackIEEE754(b, 8, 23); }
function packF32(v) { return packIEEE754(v, 8, 23); }


//
// 3 The ArrayBuffer Type
//

(function() {

  /** @constructor */
  var ArrayBuffer = function ArrayBuffer(length) {
    length = ECMAScript.ToInt32(length);
    if (length < 0) throw new RangeError('ArrayBuffer size is not a small enough positive integer');

    this.byteLength = length;
    this._bytes = [];
    this._bytes.length = length;

    var i;
    for (i = 0; i < this.byteLength; i += 1) {
      this._bytes[i] = 0;
    }

    configureProperties(this);
  };

  exports.ArrayBuffer = exports.ArrayBuffer || ArrayBuffer;

  //
  // 4 The ArrayBufferView Type
  //

  // NOTE: this constructor is not exported
  /** @constructor */
  var ArrayBufferView = function ArrayBufferView() {
    //this.buffer = null;
    //this.byteOffset = 0;
    //this.byteLength = 0;
  };

  //
  // 5 The Typed Array View Types
  //

  function makeConstructor(bytesPerElement, pack, unpack) {
    // Each TypedArray type requires a distinct constructor instance with
    // identical logic, which this produces.

    var ctor;
    ctor = function(buffer, byteOffset, length) {
      var array, sequence, i, s;

      if (!arguments.length || typeof arguments[0] === 'number') {
        // Constructor(unsigned long length)
        this.length = ECMAScript.ToInt32(arguments[0]);
        if (length < 0) throw new RangeError('ArrayBufferView size is not a small enough positive integer');

        this.byteLength = this.length * this.BYTES_PER_ELEMENT;
        this.buffer = new ArrayBuffer(this.byteLength);
        this.byteOffset = 0;
      } else if (typeof arguments[0] === 'object' && arguments[0].constructor === ctor) {
        // Constructor(TypedArray array)
        array = arguments[0];

        this.length = array.length;
        this.byteLength = this.length * this.BYTES_PER_ELEMENT;
        this.buffer = new ArrayBuffer(this.byteLength);
        this.byteOffset = 0;

        for (i = 0; i < this.length; i += 1) {
          this._setter(i, array._getter(i));
        }
      } else if (typeof arguments[0] === 'object' &&
                 !(arguments[0] instanceof ArrayBuffer || ECMAScript.Class(arguments[0]) === 'ArrayBuffer')) {
        // Constructor(sequence<type> array)
        sequence = arguments[0];

        this.length = ECMAScript.ToUint32(sequence.length);
        this.byteLength = this.length * this.BYTES_PER_ELEMENT;
        this.buffer = new ArrayBuffer(this.byteLength);
        this.byteOffset = 0;

        for (i = 0; i < this.length; i += 1) {
          s = sequence[i];
          this._setter(i, Number(s));
        }
      } else if (typeof arguments[0] === 'object' &&
                 (arguments[0] instanceof ArrayBuffer || ECMAScript.Class(arguments[0]) === 'ArrayBuffer')) {
        // Constructor(ArrayBuffer buffer,
        //             optional unsigned long byteOffset, optional unsigned long length)
        this.buffer = buffer;

        this.byteOffset = ECMAScript.ToUint32(byteOffset);
        if (this.byteOffset > this.buffer.byteLength) {
          throw new RangeError("byteOffset out of range");
        }

        if (this.byteOffset % this.BYTES_PER_ELEMENT) {
          // The given byteOffset must be a multiple of the element
          // size of the specific type, otherwise an exception is raised.
          throw new RangeError("ArrayBuffer length minus the byteOffset is not a multiple of the element size.");
        }

        if (arguments.length < 3) {
          this.byteLength = this.buffer.byteLength - this.byteOffset;

          if (this.byteLength % this.BYTES_PER_ELEMENT) {
            throw new RangeError("length of buffer minus byteOffset not a multiple of the element size");
          }
          this.length = this.byteLength / this.BYTES_PER_ELEMENT;
        } else {
          this.length = ECMAScript.ToUint32(length);
          this.byteLength = this.length * this.BYTES_PER_ELEMENT;
        }

        if ((this.byteOffset + this.byteLength) > this.buffer.byteLength) {
          throw new RangeError("byteOffset and length reference an area beyond the end of the buffer");
        }
      } else {
        throw new TypeError("Unexpected argument type(s)");
      }

      this.constructor = ctor;

      configureProperties(this);
      makeArrayAccessors(this);
    };

    ctor.prototype = new ArrayBufferView();
    ctor.prototype.BYTES_PER_ELEMENT = bytesPerElement;
    ctor.prototype._pack = pack;
    ctor.prototype._unpack = unpack;
    ctor.BYTES_PER_ELEMENT = bytesPerElement;

    // getter type (unsigned long index);
    ctor.prototype._getter = function(index) {
      if (arguments.length < 1) throw new SyntaxError("Not enough arguments");

      index = ECMAScript.ToUint32(index);
      if (index >= this.length) {
        return undefined;
      }

      var bytes = [], i, o;
      for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT;
           i < this.BYTES_PER_ELEMENT;
           i += 1, o += 1) {
        bytes.push(this.buffer._bytes[o]);
      }
      return this._unpack(bytes);
    };

    // NONSTANDARD: convenience alias for getter: type get(unsigned long index);
    ctor.prototype.get = ctor.prototype._getter;

    // setter void (unsigned long index, type value);
    ctor.prototype._setter = function(index, value) {
      if (arguments.length < 2) throw new SyntaxError("Not enough arguments");

      index = ECMAScript.ToUint32(index);
      if (index >= this.length) {
        return undefined;
      }

      var bytes = this._pack(value), i, o;
      for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT;
           i < this.BYTES_PER_ELEMENT;
           i += 1, o += 1) {
        this.buffer._bytes[o] = bytes[i];
      }
    };

    // void set(TypedArray array, optional unsigned long offset);
    // void set(sequence<type> array, optional unsigned long offset);
    ctor.prototype.set = function(index, value) {
      if (arguments.length < 1) throw new SyntaxError("Not enough arguments");
      var array, sequence, offset, len,
          i, s, d,
          byteOffset, byteLength, tmp;

      if (typeof arguments[0] === 'object' && arguments[0].constructor === this.constructor) {
        // void set(TypedArray array, optional unsigned long offset);
        array = arguments[0];
        offset = ECMAScript.ToUint32(arguments[1]);

        if (offset + array.length > this.length) {
          throw new RangeError("Offset plus length of array is out of range");
        }

        byteOffset = this.byteOffset + offset * this.BYTES_PER_ELEMENT;
        byteLength = array.length * this.BYTES_PER_ELEMENT;

        if (array.buffer === this.buffer) {
          tmp = [];
          for (i = 0, s = array.byteOffset; i < byteLength; i += 1, s += 1) {
            tmp[i] = array.buffer._bytes[s];
          }
          for (i = 0, d = byteOffset; i < byteLength; i += 1, d += 1) {
            this.buffer._bytes[d] = tmp[i];
          }
        } else {
          for (i = 0, s = array.byteOffset, d = byteOffset;
               i < byteLength; i += 1, s += 1, d += 1) {
            this.buffer._bytes[d] = array.buffer._bytes[s];
          }
        }
      } else if (typeof arguments[0] === 'object' && typeof arguments[0].length !== 'undefined') {
        // void set(sequence<type> array, optional unsigned long offset);
        sequence = arguments[0];
        len = ECMAScript.ToUint32(sequence.length);
        offset = ECMAScript.ToUint32(arguments[1]);

        if (offset + len > this.length) {
          throw new RangeError("Offset plus length of array is out of range");
        }

        for (i = 0; i < len; i += 1) {
          s = sequence[i];
          this._setter(offset + i, Number(s));
        }
      } else {
        throw new TypeError("Unexpected argument type(s)");
      }
    };

    // TypedArray subarray(long begin, optional long end);
    ctor.prototype.subarray = function(start, end) {
      function clamp(v, min, max) { return v < min ? min : v > max ? max : v; }

      start = ECMAScript.ToInt32(start);
      end = ECMAScript.ToInt32(end);

      if (arguments.length < 1) { start = 0; }
      if (arguments.length < 2) { end = this.length; }

      if (start < 0) { start = this.length + start; }
      if (end < 0) { end = this.length + end; }

      start = clamp(start, 0, this.length);
      end = clamp(end, 0, this.length);

      var len = end - start;
      if (len < 0) {
        len = 0;
      }

      return new this.constructor(
        this.buffer, this.byteOffset + start * this.BYTES_PER_ELEMENT, len);
    };

    return ctor;
  }

  var Int8Array = makeConstructor(1, packI8, unpackI8);
  var Uint8Array = makeConstructor(1, packU8, unpackU8);
  var Uint8ClampedArray = makeConstructor(1, packU8Clamped, unpackU8);
  var Int16Array = makeConstructor(2, packI16, unpackI16);
  var Uint16Array = makeConstructor(2, packU16, unpackU16);
  var Int32Array = makeConstructor(4, packI32, unpackI32);
  var Uint32Array = makeConstructor(4, packU32, unpackU32);
  var Float32Array = makeConstructor(4, packF32, unpackF32);
  var Float64Array = makeConstructor(8, packF64, unpackF64);

  exports.Int8Array = exports.Int8Array || Int8Array;
  exports.Uint8Array = exports.Uint8Array || Uint8Array;
  exports.Uint8ClampedArray = exports.Uint8ClampedArray || Uint8ClampedArray;
  exports.Int16Array = exports.Int16Array || Int16Array;
  exports.Uint16Array = exports.Uint16Array || Uint16Array;
  exports.Int32Array = exports.Int32Array || Int32Array;
  exports.Uint32Array = exports.Uint32Array || Uint32Array;
  exports.Float32Array = exports.Float32Array || Float32Array;
  exports.Float64Array = exports.Float64Array || Float64Array;
}());

//
// 6 The DataView View Type
//

(function() {
  function r(array, index) {
    return ECMAScript.IsCallable(array.get) ? array.get(index) : array[index];
  }

  var IS_BIG_ENDIAN = (function() {
    var u16array = new(exports.Uint16Array)([0x1234]),
        u8array = new(exports.Uint8Array)(u16array.buffer);
    return r(u8array, 0) === 0x12;
  }());

  // Constructor(ArrayBuffer buffer,
  //             optional unsigned long byteOffset,
  //             optional unsigned long byteLength)
  /** @constructor */
  var DataView = function DataView(buffer, byteOffset, byteLength) {
    if (arguments.length === 0) {
      buffer = new exports.ArrayBuffer(0);
    } else if (!(buffer instanceof exports.ArrayBuffer || ECMAScript.Class(buffer) === 'ArrayBuffer')) {
      throw new TypeError("TypeError");
    }

    this.buffer = buffer || new exports.ArrayBuffer(0);

    this.byteOffset = ECMAScript.ToUint32(byteOffset);
    if (this.byteOffset > this.buffer.byteLength) {
      throw new RangeError("byteOffset out of range");
    }

    if (arguments.length < 3) {
      this.byteLength = this.buffer.byteLength - this.byteOffset;
    } else {
      this.byteLength = ECMAScript.ToUint32(byteLength);
    }

    if ((this.byteOffset + this.byteLength) > this.buffer.byteLength) {
      throw new RangeError("byteOffset and length reference an area beyond the end of the buffer");
    }

    configureProperties(this);
  };

  function makeGetter(arrayType) {
    return function(byteOffset, littleEndian) {

      byteOffset = ECMAScript.ToUint32(byteOffset);

      if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength) {
        throw new RangeError("Array index out of range");
      }
      byteOffset += this.byteOffset;

      var uint8Array = new exports.Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT),
          bytes = [], i;
      for (i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1) {
        bytes.push(r(uint8Array, i));
      }

      if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN)) {
        bytes.reverse();
      }

      return r(new arrayType(new exports.Uint8Array(bytes).buffer), 0);
    };
  }

  DataView.prototype.getUint8 = makeGetter(exports.Uint8Array);
  DataView.prototype.getInt8 = makeGetter(exports.Int8Array);
  DataView.prototype.getUint16 = makeGetter(exports.Uint16Array);
  DataView.prototype.getInt16 = makeGetter(exports.Int16Array);
  DataView.prototype.getUint32 = makeGetter(exports.Uint32Array);
  DataView.prototype.getInt32 = makeGetter(exports.Int32Array);
  DataView.prototype.getFloat32 = makeGetter(exports.Float32Array);
  DataView.prototype.getFloat64 = makeGetter(exports.Float64Array);

  function makeSetter(arrayType) {
    return function(byteOffset, value, littleEndian) {

      byteOffset = ECMAScript.ToUint32(byteOffset);
      if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength) {
        throw new RangeError("Array index out of range");
      }

      // Get bytes
      var typeArray = new arrayType([value]),
          byteArray = new exports.Uint8Array(typeArray.buffer),
          bytes = [], i, byteView;

      for (i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1) {
        bytes.push(r(byteArray, i));
      }

      // Flip if necessary
      if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN)) {
        bytes.reverse();
      }

      // Write them
      byteView = new exports.Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT);
      byteView.set(bytes);
    };
  }

  DataView.prototype.setUint8 = makeSetter(exports.Uint8Array);
  DataView.prototype.setInt8 = makeSetter(exports.Int8Array);
  DataView.prototype.setUint16 = makeSetter(exports.Uint16Array);
  DataView.prototype.setInt16 = makeSetter(exports.Int16Array);
  DataView.prototype.setUint32 = makeSetter(exports.Uint32Array);
  DataView.prototype.setInt32 = makeSetter(exports.Int32Array);
  DataView.prototype.setFloat32 = makeSetter(exports.Float32Array);
  DataView.prototype.setFloat64 = makeSetter(exports.Float64Array);

  exports.DataView = exports.DataView || DataView;

}());
{
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "deprecated": false,
  "description": "TypedArray polyfill for old browsers",
  "devDependencies": {
    "tape": "~2.3.2"
  },
  "homepage": "https://github.com/substack/typedarray",
  "license": "MIT",
  "main": "index.js",
  "name": "typedarray",
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/typedarray.git"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/6..latest",
      "firefox/16..latest",
      "firefox/nightly",
      "chrome/22..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  },
  "version": "0.0.6"
}Copyright (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative
Reporters & Editors

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Jeremy Ashkenas",
    "email": "jeremy@documentcloud.org"
  },
  "deprecated": false,
  "description": "JavaScript's functional programming helper library.",
  "devDependencies": {
    "coveralls": "^2.11.2",
    "docco": "^0.8.0",
    "eslint": "^6.8.0",
    "eslint-plugin-import": "^2.20.1",
    "glob": "^7.1.6",
    "gzip-size-cli": "^1.0.0",
    "husky": "^4.2.3",
    "karma": "^0.13.13",
    "karma-qunit": "~2.0.1",
    "karma-sauce-launcher": "^1.2.0",
    "nyc": "^2.1.3",
    "pretty-bytes-cli": "^1.0.0",
    "qunit": "^2.6.0",
    "qunit-cli": "~0.2.0",
    "rollup": "^1.32.1",
    "terser": "^4.6.13"
  },
  "files": [
    "underscore.js",
    "underscore.js.map",
    "underscore-min.js",
    "underscore-min.js.map",
    "underscore-esm.js",
    "underscore-esm.js.map",
    "underscore-esm-min.js",
    "underscore-esm-min.js.map",
    "modules/",
    "amd/",
    "cjs/"
  ],
  "homepage": "https://underscorejs.org",
  "husky": {
    "hooks": {
      "pre-commit": "npm run bundle && git add underscore.js underscore.js.map underscore-esm.js underscore-esm.js.map",
      "post-commit": "git reset underscore.js underscore.js.map underscore-esm.js underscore-esm.js.map"
    }
  },
  "license": "MIT",
  "main": "underscore.js",
  "module": "modules/index-all.js",
  "name": "underscore",
  "repository": {
    "type": "git",
    "url": "git://github.com/jashkenas/underscore.git"
  },
  "version": "1.11.0"
}//     Underscore.js 1.11.0
//     https://underscorejs.org
//     (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
//     Underscore may be freely distributed under the MIT license.
var VERSION="1.11.0",root="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},ArrayProto=Array.prototype,ObjProto=Object.prototype,SymbolProto="undefined"!=typeof Symbol?Symbol.prototype:null,push=ArrayProto.push,slice=ArrayProto.slice,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty,supportsArrayBuffer="undefined"!=typeof ArrayBuffer,nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeCreate=Object.create,nativeIsView=supportsArrayBuffer&&ArrayBuffer.isView,_isNaN=isNaN,_isFinite=isFinite,hasEnumBug=!{toString:null}.propertyIsEnumerable("toString"),nonEnumerableProps=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],MAX_ARRAY_INDEX=Math.pow(2,53)-1;function restArguments(e,t){return t=null==t?e.length-1:+t,function(){for(var n=Math.max(arguments.length-t,0),r=Array(n),i=0;i<n;i++)r[i]=arguments[i+t];switch(t){case 0:return e.call(this,r);case 1:return e.call(this,arguments[0],r);case 2:return e.call(this,arguments[0],arguments[1],r)}var a=Array(t+1);for(i=0;i<t;i++)a[i]=arguments[i];return a[t]=r,e.apply(this,a)}}function isObject(e){var t=typeof e;return"function"===t||"object"===t&&!!e}function isNull(e){return null===e}function isUndefined(e){return void 0===e}function isBoolean(e){return!0===e||!1===e||"[object Boolean]"===toString.call(e)}function isElement(e){return!(!e||1!==e.nodeType)}function tagTester(e){return function(t){return toString.call(t)==="[object "+e+"]"}}var isString=tagTester("String"),isNumber=tagTester("Number"),isDate=tagTester("Date"),isRegExp=tagTester("RegExp"),isError=tagTester("Error"),isSymbol=tagTester("Symbol"),isMap=tagTester("Map"),isWeakMap=tagTester("WeakMap"),isSet=tagTester("Set"),isWeakSet=tagTester("WeakSet"),isArrayBuffer=tagTester("ArrayBuffer"),isDataView=tagTester("DataView"),isArray=nativeIsArray||tagTester("Array"),isFunction=tagTester("Function"),nodelist=root.document&&root.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof nodelist&&(isFunction=function(e){return"function"==typeof e||!1});var isFunction$1=isFunction;function has(e,t){return null!=e&&hasOwnProperty.call(e,t)}var isArguments=tagTester("Arguments");!function(){isArguments(arguments)||(isArguments=function(e){return has(e,"callee")})}();var isArguments$1=isArguments;function isFinite$1(e){return!isSymbol(e)&&_isFinite(e)&&!isNaN(parseFloat(e))}function isNaN$1(e){return isNumber(e)&&_isNaN(e)}function constant(e){return function(){return e}}function createSizePropertyCheck(e){return function(t){var n=e(t);return"number"==typeof n&&n>=0&&n<=MAX_ARRAY_INDEX}}function shallowProperty(e){return function(t){return null==t?void 0:t[e]}}var getByteLength=shallowProperty("byteLength"),isBufferLike=createSizePropertyCheck(getByteLength),typedArrayPattern=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function isTypedArray(e){return nativeIsView?nativeIsView(e)&&!isDataView(e):isBufferLike(e)&&typedArrayPattern.test(toString.call(e))}var isTypedArray$1=supportsArrayBuffer?isTypedArray:constant(!1),getLength=shallowProperty("length"),isArrayLike=createSizePropertyCheck(getLength);function emulatedSet(e){for(var t={},n=e.length,r=0;r<n;++r)t[e[r]]=!0;return{contains:function(e){return t[e]},push:function(n){return t[n]=!0,e.push(n)}}}function collectNonEnumProps(e,t){t=emulatedSet(t);var n=nonEnumerableProps.length,r=e.constructor,i=isFunction$1(r)&&r.prototype||ObjProto,a="constructor";for(has(e,a)&&!t.contains(a)&&t.push(a);n--;)(a=nonEnumerableProps[n])in e&&e[a]!==i[a]&&!t.contains(a)&&t.push(a)}function keys(e){if(!isObject(e))return[];if(nativeKeys)return nativeKeys(e);var t=[];for(var n in e)has(e,n)&&t.push(n);return hasEnumBug&&collectNonEnumProps(e,t),t}function isEmpty(e){return null==e||(isArrayLike(e)&&(isArray(e)||isString(e)||isArguments$1(e))?0===e.length:0===keys(e).length)}function isMatch(e,t){var n=keys(t),r=n.length;if(null==e)return!r;for(var i=Object(e),a=0;a<r;a++){var u=n[a];if(t[u]!==i[u]||!(u in i))return!1}return!0}function _(e){return e instanceof _?e:this instanceof _?void(this._wrapped=e):new _(e)}function eq(e,t,n,r){if(e===t)return 0!==e||1/e==1/t;if(null==e||null==t)return!1;if(e!=e)return t!=t;var i=typeof e;return("function"===i||"object"===i||"object"==typeof t)&&deepEq(e,t,n,r)}function deepEq(e,t,n,r){e instanceof _&&(e=e._wrapped),t instanceof _&&(t=t._wrapped);var i=toString.call(e);if(i!==toString.call(t))return!1;switch(i){case"[object RegExp]":case"[object String]":return""+e==""+t;case"[object Number]":return+e!=+e?+t!=+t:0==+e?1/+e==1/t:+e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object Symbol]":return SymbolProto.valueOf.call(e)===SymbolProto.valueOf.call(t);case"[object ArrayBuffer]":return deepEq(new DataView(e),new DataView(t),n,r);case"[object DataView]":var a=getByteLength(e);if(a!==getByteLength(t))return!1;for(;a--;)if(e.getUint8(a)!==t.getUint8(a))return!1;return!0}if(isTypedArray$1(e))return deepEq(new DataView(e.buffer),new DataView(t.buffer),n,r);var u="[object Array]"===i;if(!u){if("object"!=typeof e||"object"!=typeof t)return!1;var o=e.constructor,s=t.constructor;if(o!==s&&!(isFunction$1(o)&&o instanceof o&&isFunction$1(s)&&s instanceof s)&&"constructor"in e&&"constructor"in t)return!1}r=r||[];for(var c=(n=n||[]).length;c--;)if(n[c]===e)return r[c]===t;if(n.push(e),r.push(t),u){if((c=e.length)!==t.length)return!1;for(;c--;)if(!eq(e[c],t[c],n,r))return!1}else{var l,f=keys(e);if(c=f.length,keys(t).length!==c)return!1;for(;c--;)if(!has(t,l=f[c])||!eq(e[l],t[l],n,r))return!1}return n.pop(),r.pop(),!0}function isEqual(e,t){return eq(e,t)}function allKeys(e){if(!isObject(e))return[];var t=[];for(var n in e)t.push(n);return hasEnumBug&&collectNonEnumProps(e,t),t}function values(e){for(var t=keys(e),n=t.length,r=Array(n),i=0;i<n;i++)r[i]=e[t[i]];return r}function pairs(e){for(var t=keys(e),n=t.length,r=Array(n),i=0;i<n;i++)r[i]=[t[i],e[t[i]]];return r}function invert(e){for(var t={},n=keys(e),r=0,i=n.length;r<i;r++)t[e[n[r]]]=n[r];return t}function functions(e){var t=[];for(var n in e)isFunction$1(e[n])&&t.push(n);return t.sort()}function createAssigner(e,t){return function(n){var r=arguments.length;if(t&&(n=Object(n)),r<2||null==n)return n;for(var i=1;i<r;i++)for(var a=arguments[i],u=e(a),o=u.length,s=0;s<o;s++){var c=u[s];t&&void 0!==n[c]||(n[c]=a[c])}return n}}_.VERSION=VERSION,_.prototype.value=function(){return this._wrapped},_.prototype.valueOf=_.prototype.toJSON=_.prototype.value,_.prototype.toString=function(){return String(this._wrapped)};var extend=createAssigner(allKeys),extendOwn=createAssigner(keys),defaults=createAssigner(allKeys,!0);function ctor(){return function(){}}function baseCreate(e){if(!isObject(e))return{};if(nativeCreate)return nativeCreate(e);var t=ctor();t.prototype=e;var n=new t;return t.prototype=null,n}function create(e,t){var n=baseCreate(e);return t&&extendOwn(n,t),n}function clone(e){return isObject(e)?isArray(e)?e.slice():extend({},e):e}function tap(e,t){return t(e),e}function has$1(e,t){if(!isArray(t))return has(e,t);for(var n=t.length,r=0;r<n;r++){var i=t[r];if(null==e||!hasOwnProperty.call(e,i))return!1;e=e[i]}return!!n}function identity(e){return e}function matcher(e){return e=extendOwn({},e),function(t){return isMatch(t,e)}}function deepGet(e,t){for(var n=t.length,r=0;r<n;r++){if(null==e)return;e=e[t[r]]}return n?e:void 0}function property(e){return isArray(e)?function(t){return deepGet(t,e)}:shallowProperty(e)}function optimizeCb(e,t,n){if(void 0===t)return e;switch(null==n?3:n){case 1:return function(n){return e.call(t,n)};case 3:return function(n,r,i){return e.call(t,n,r,i)};case 4:return function(n,r,i,a){return e.call(t,n,r,i,a)}}return function(){return e.apply(t,arguments)}}function baseIteratee(e,t,n){return null==e?identity:isFunction$1(e)?optimizeCb(e,t,n):isObject(e)&&!isArray(e)?matcher(e):property(e)}function iteratee(e,t){return baseIteratee(e,t,1/0)}function cb(e,t,n){return _.iteratee!==iteratee?_.iteratee(e,t):baseIteratee(e,t,n)}function mapObject(e,t,n){t=cb(t,n);for(var r=keys(e),i=r.length,a={},u=0;u<i;u++){var o=r[u];a[o]=t(e[o],o,e)}return a}function noop(){}function propertyOf(e){return null==e?function(){}:function(t){return isArray(t)?deepGet(e,t):e[t]}}function times(e,t,n){var r=Array(Math.max(0,e));t=optimizeCb(t,n,1);for(var i=0;i<e;i++)r[i]=t(i);return r}function random(e,t){return null==t&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))}_.iteratee=iteratee;var now=Date.now||function(){return(new Date).getTime()};function createEscaper(e){var t=function(t){return e[t]},n="(?:"+keys(e).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(e){return e=null==e?"":""+e,r.test(e)?e.replace(i,t):e}}var escapeMap={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},_escape=createEscaper(escapeMap),unescapeMap=invert(escapeMap),_unescape=createEscaper(unescapeMap),templateSettings=_.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},noMatch=/(.)^/,escapes={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},escapeRegExp=/\\|'|\r|\n|\u2028|\u2029/g;function escapeChar(e){return"\\"+escapes[e]}function template(e,t,n){!t&&n&&(t=n),t=defaults({},t,_.templateSettings);var r,i=RegExp([(t.escape||noMatch).source,(t.interpolate||noMatch).source,(t.evaluate||noMatch).source].join("|")+"|$","g"),a=0,u="__p+='";e.replace(i,(function(t,n,r,i,o){return u+=e.slice(a,o).replace(escapeRegExp,escapeChar),a=o+t.length,n?u+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?u+="'+\n((__t=("+r+"))==null?'':__t)+\n'":i&&(u+="';\n"+i+"\n__p+='"),t})),u+="';\n",t.variable||(u="with(obj||{}){\n"+u+"}\n"),u="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+u+"return __p;\n";try{r=new Function(t.variable||"obj","_",u)}catch(e){throw e.source=u,e}var o=function(e){return r.call(this,e,_)},s=t.variable||"obj";return o.source="function("+s+"){\n"+u+"}",o}function result(e,t,n){isArray(t)||(t=[t]);var r=t.length;if(!r)return isFunction$1(n)?n.call(e):n;for(var i=0;i<r;i++){var a=null==e?void 0:e[t[i]];void 0===a&&(a=n,i=r),e=isFunction$1(a)?a.call(e):a}return e}var idCounter=0;function uniqueId(e){var t=++idCounter+"";return e?e+t:t}function chain(e){var t=_(e);return t._chain=!0,t}function executeBound(e,t,n,r,i){if(!(r instanceof t))return e.apply(n,i);var a=baseCreate(e.prototype),u=e.apply(a,i);return isObject(u)?u:a}var partial=restArguments((function(e,t){var n=partial.placeholder,r=function(){for(var i=0,a=t.length,u=Array(a),o=0;o<a;o++)u[o]=t[o]===n?arguments[i++]:t[o];for(;i<arguments.length;)u.push(arguments[i++]);return executeBound(e,r,this,this,u)};return r}));partial.placeholder=_;var bind=restArguments((function(e,t,n){if(!isFunction$1(e))throw new TypeError("Bind must be called on a function");var r=restArguments((function(i){return executeBound(e,r,t,this,n.concat(i))}));return r}));function flatten(e,t,n,r){if(r=r||[],t||0===t){if(t<=0)return r.concat(e)}else t=1/0;for(var i=r.length,a=0,u=getLength(e);a<u;a++){var o=e[a];if(isArrayLike(o)&&(isArray(o)||isArguments$1(o)))if(t>1)flatten(o,t-1,n,r),i=r.length;else for(var s=0,c=o.length;s<c;)r[i++]=o[s++];else n||(r[i++]=o)}return r}var bindAll=restArguments((function(e,t){var n=(t=flatten(t,!1,!1)).length;if(n<1)throw new Error("bindAll must be passed function names");for(;n--;){var r=t[n];e[r]=bind(e[r],e)}return e}));function memoize(e,t){var n=function(r){var i=n.cache,a=""+(t?t.apply(this,arguments):r);return has(i,a)||(i[a]=e.apply(this,arguments)),i[a]};return n.cache={},n}var delay=restArguments((function(e,t,n){return setTimeout((function(){return e.apply(null,n)}),t)})),defer=partial(delay,_,1);function throttle(e,t,n){var r,i,a,u,o=0;n||(n={});var s=function(){o=!1===n.leading?0:now(),r=null,u=e.apply(i,a),r||(i=a=null)},c=function(){var c=now();o||!1!==n.leading||(o=c);var l=t-(c-o);return i=this,a=arguments,l<=0||l>t?(r&&(clearTimeout(r),r=null),o=c,u=e.apply(i,a),r||(i=a=null)):r||!1===n.trailing||(r=setTimeout(s,l)),u};return c.cancel=function(){clearTimeout(r),o=0,r=i=a=null},c}function debounce(e,t,n){var r,i,a=function(t,n){r=null,n&&(i=e.apply(t,n))},u=restArguments((function(u){if(r&&clearTimeout(r),n){var o=!r;r=setTimeout(a,t),o&&(i=e.apply(this,u))}else r=delay(a,t,this,u);return i}));return u.cancel=function(){clearTimeout(r),r=null},u}function wrap(e,t){return partial(t,e)}function negate(e){return function(){return!e.apply(this,arguments)}}function compose(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}}function after(e,t){return function(){if(--e<1)return t.apply(this,arguments)}}function before(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}}var once=partial(before,2);function findKey(e,t,n){t=cb(t,n);for(var r,i=keys(e),a=0,u=i.length;a<u;a++)if(t(e[r=i[a]],r,e))return r}function createPredicateIndexFinder(e){return function(t,n,r){n=cb(n,r);for(var i=getLength(t),a=e>0?0:i-1;a>=0&&a<i;a+=e)if(n(t[a],a,t))return a;return-1}}var findIndex=createPredicateIndexFinder(1),findLastIndex=createPredicateIndexFinder(-1);function sortedIndex(e,t,n,r){for(var i=(n=cb(n,r,1))(t),a=0,u=getLength(e);a<u;){var o=Math.floor((a+u)/2);n(e[o])<i?a=o+1:u=o}return a}function createIndexFinder(e,t,n){return function(r,i,a){var u=0,o=getLength(r);if("number"==typeof a)e>0?u=a>=0?a:Math.max(a+o,u):o=a>=0?Math.min(a+1,o):a+o+1;else if(n&&a&&o)return r[a=n(r,i)]===i?a:-1;if(i!=i)return(a=t(slice.call(r,u,o),isNaN$1))>=0?a+u:-1;for(a=e>0?u:o-1;a>=0&&a<o;a+=e)if(r[a]===i)return a;return-1}}var indexOf=createIndexFinder(1,findIndex,sortedIndex),lastIndexOf=createIndexFinder(-1,findLastIndex);function find(e,t,n){var r=(isArrayLike(e)?findIndex:findKey)(e,t,n);if(void 0!==r&&-1!==r)return e[r]}function findWhere(e,t){return find(e,matcher(t))}function each(e,t,n){var r,i;if(t=optimizeCb(t,n),isArrayLike(e))for(r=0,i=e.length;r<i;r++)t(e[r],r,e);else{var a=keys(e);for(r=0,i=a.length;r<i;r++)t(e[a[r]],a[r],e)}return e}function map(e,t,n){t=cb(t,n);for(var r=!isArrayLike(e)&&keys(e),i=(r||e).length,a=Array(i),u=0;u<i;u++){var o=r?r[u]:u;a[u]=t(e[o],o,e)}return a}function createReduce(e){var t=function(t,n,r,i){var a=!isArrayLike(t)&&keys(t),u=(a||t).length,o=e>0?0:u-1;for(i||(r=t[a?a[o]:o],o+=e);o>=0&&o<u;o+=e){var s=a?a[o]:o;r=n(r,t[s],s,t)}return r};return function(e,n,r,i){var a=arguments.length>=3;return t(e,optimizeCb(n,i,4),r,a)}}var reduce=createReduce(1),reduceRight=createReduce(-1);function filter(e,t,n){var r=[];return t=cb(t,n),each(e,(function(e,n,i){t(e,n,i)&&r.push(e)})),r}function reject(e,t,n){return filter(e,negate(cb(t)),n)}function every(e,t,n){t=cb(t,n);for(var r=!isArrayLike(e)&&keys(e),i=(r||e).length,a=0;a<i;a++){var u=r?r[a]:a;if(!t(e[u],u,e))return!1}return!0}function some(e,t,n){t=cb(t,n);for(var r=!isArrayLike(e)&&keys(e),i=(r||e).length,a=0;a<i;a++){var u=r?r[a]:a;if(t(e[u],u,e))return!0}return!1}function contains(e,t,n,r){return isArrayLike(e)||(e=values(e)),("number"!=typeof n||r)&&(n=0),indexOf(e,t,n)>=0}var invoke=restArguments((function(e,t,n){var r,i;return isFunction$1(t)?i=t:isArray(t)&&(r=t.slice(0,-1),t=t[t.length-1]),map(e,(function(e){var a=i;if(!a){if(r&&r.length&&(e=deepGet(e,r)),null==e)return;a=e[t]}return null==a?a:a.apply(e,n)}))}));function pluck(e,t){return map(e,property(t))}function where(e,t){return filter(e,matcher(t))}function max(e,t,n){var r,i,a=-1/0,u=-1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var o=0,s=(e=isArrayLike(e)?e:values(e)).length;o<s;o++)null!=(r=e[o])&&r>a&&(a=r);else t=cb(t,n),each(e,(function(e,n,r){((i=t(e,n,r))>u||i===-1/0&&a===-1/0)&&(a=e,u=i)}));return a}function min(e,t,n){var r,i,a=1/0,u=1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var o=0,s=(e=isArrayLike(e)?e:values(e)).length;o<s;o++)null!=(r=e[o])&&r<a&&(a=r);else t=cb(t,n),each(e,(function(e,n,r){((i=t(e,n,r))<u||i===1/0&&a===1/0)&&(a=e,u=i)}));return a}function sample(e,t,n){if(null==t||n)return isArrayLike(e)||(e=values(e)),e[random(e.length-1)];var r=isArrayLike(e)?clone(e):values(e),i=getLength(r);t=Math.max(Math.min(t,i),0);for(var a=i-1,u=0;u<t;u++){var o=random(u,a),s=r[u];r[u]=r[o],r[o]=s}return r.slice(0,t)}function shuffle(e){return sample(e,1/0)}function sortBy(e,t,n){var r=0;return t=cb(t,n),pluck(map(e,(function(e,n,i){return{value:e,index:r++,criteria:t(e,n,i)}})).sort((function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||void 0===n)return 1;if(n<r||void 0===r)return-1}return e.index-t.index})),"value")}function group(e,t){return function(n,r,i){var a=t?[[],[]]:{};return r=cb(r,i),each(n,(function(t,i){var u=r(t,i,n);e(a,t,u)})),a}}var groupBy=group((function(e,t,n){has(e,n)?e[n].push(t):e[n]=[t]})),indexBy=group((function(e,t,n){e[n]=t})),countBy=group((function(e,t,n){has(e,n)?e[n]++:e[n]=1})),partition=group((function(e,t,n){e[n?0:1].push(t)}),!0),reStrSymbol=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function toArray(e){return e?isArray(e)?slice.call(e):isString(e)?e.match(reStrSymbol):isArrayLike(e)?map(e,identity):values(e):[]}function size(e){return null==e?0:isArrayLike(e)?e.length:keys(e).length}function keyInObj(e,t,n){return t in n}var pick=restArguments((function(e,t){var n={},r=t[0];if(null==e)return n;isFunction$1(r)?(t.length>1&&(r=optimizeCb(r,t[1])),t=allKeys(e)):(r=keyInObj,t=flatten(t,!1,!1),e=Object(e));for(var i=0,a=t.length;i<a;i++){var u=t[i],o=e[u];r(o,u,e)&&(n[u]=o)}return n})),omit=restArguments((function(e,t){var n,r=t[0];return isFunction$1(r)?(r=negate(r),t.length>1&&(n=t[1])):(t=map(flatten(t,!1,!1),String),r=function(e,n){return!contains(t,n)}),pick(e,r,n)}));function initial(e,t,n){return slice.call(e,0,Math.max(0,e.length-(null==t||n?1:t)))}function first(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[0]:initial(e,e.length-t)}function rest(e,t,n){return slice.call(e,null==t||n?1:t)}function last(e,t,n){return null==e||e.length<1?null==t||n?void 0:[]:null==t||n?e[e.length-1]:rest(e,Math.max(0,e.length-t))}function compact(e){return filter(e,Boolean)}function flatten$1(e,t){return flatten(e,t,!1)}var difference=restArguments((function(e,t){return t=flatten(t,!0,!0),filter(e,(function(e){return!contains(t,e)}))})),without=restArguments((function(e,t){return difference(e,t)}));function uniq(e,t,n,r){isBoolean(t)||(r=n,n=t,t=!1),null!=n&&(n=cb(n,r));for(var i=[],a=[],u=0,o=getLength(e);u<o;u++){var s=e[u],c=n?n(s,u,e):s;t&&!n?(u&&a===c||i.push(s),a=c):n?contains(a,c)||(a.push(c),i.push(s)):contains(i,s)||i.push(s)}return i}var union=restArguments((function(e){return uniq(flatten(e,!0,!0))}));function intersection(e){for(var t=[],n=arguments.length,r=0,i=getLength(e);r<i;r++){var a=e[r];if(!contains(t,a)){var u;for(u=1;u<n&&contains(arguments[u],a);u++);u===n&&t.push(a)}}return t}function unzip(e){for(var t=e&&max(e,getLength).length||0,n=Array(t),r=0;r<t;r++)n[r]=pluck(e,r);return n}var zip=restArguments(unzip);function object(e,t){for(var n={},r=0,i=getLength(e);r<i;r++)t?n[e[r]]=t[r]:n[e[r][0]]=e[r][1];return n}function range(e,t,n){null==t&&(t=e||0,e=0),n||(n=t<e?-1:1);for(var r=Math.max(Math.ceil((t-e)/n),0),i=Array(r),a=0;a<r;a++,e+=n)i[a]=e;return i}function chunk(e,t){if(null==t||t<1)return[];for(var n=[],r=0,i=e.length;r<i;)n.push(slice.call(e,r,r+=t));return n}function chainResult(e,t){return e._chain?_(t).chain():t}function mixin(e){return each(functions(e),(function(t){var n=_[t]=e[t];_.prototype[t]=function(){var e=[this._wrapped];return push.apply(e,arguments),chainResult(this,n.apply(_,e))}})),_}each(["pop","push","reverse","shift","sort","splice","unshift"],(function(e){var t=ArrayProto[e];_.prototype[e]=function(){var n=this._wrapped;return null!=n&&(t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0]),chainResult(this,n)}})),each(["concat","join","slice"],(function(e){var t=ArrayProto[e];_.prototype[e]=function(){var e=this._wrapped;return null!=e&&(e=t.apply(e,arguments)),chainResult(this,e)}}));var allExports={__proto__:null,VERSION:VERSION,restArguments:restArguments,isObject:isObject,isNull:isNull,isUndefined:isUndefined,isBoolean:isBoolean,isElement:isElement,isString:isString,isNumber:isNumber,isDate:isDate,isRegExp:isRegExp,isError:isError,isSymbol:isSymbol,isMap:isMap,isWeakMap:isWeakMap,isSet:isSet,isWeakSet:isWeakSet,isArrayBuffer:isArrayBuffer,isDataView:isDataView,isArray:isArray,isFunction:isFunction$1,isArguments:isArguments$1,isFinite:isFinite$1,isNaN:isNaN$1,isTypedArray:isTypedArray$1,isEmpty:isEmpty,isMatch:isMatch,isEqual:isEqual,keys:keys,allKeys:allKeys,values:values,pairs:pairs,invert:invert,functions:functions,methods:functions,extend:extend,extendOwn:extendOwn,assign:extendOwn,defaults:defaults,create:create,clone:clone,tap:tap,has:has$1,mapObject:mapObject,identity:identity,constant:constant,noop:noop,property:property,propertyOf:propertyOf,matcher:matcher,matches:matcher,times:times,random:random,now:now,escape:_escape,unescape:_unescape,templateSettings:templateSettings,template:template,result:result,uniqueId:uniqueId,chain:chain,iteratee:iteratee,partial:partial,bind:bind,bindAll:bindAll,memoize:memoize,delay:delay,defer:defer,throttle:throttle,debounce:debounce,wrap:wrap,negate:negate,compose:compose,after:after,before:before,once:once,findKey:findKey,findIndex:findIndex,findLastIndex:findLastIndex,sortedIndex:sortedIndex,indexOf:indexOf,lastIndexOf:lastIndexOf,find:find,detect:find,findWhere:findWhere,each:each,forEach:each,map:map,collect:map,reduce:reduce,foldl:reduce,inject:reduce,reduceRight:reduceRight,foldr:reduceRight,filter:filter,select:filter,reject:reject,every:every,all:every,some:some,any:some,contains:contains,includes:contains,include:contains,invoke:invoke,pluck:pluck,where:where,max:max,min:min,shuffle:shuffle,sample:sample,sortBy:sortBy,groupBy:groupBy,indexBy:indexBy,countBy:countBy,partition:partition,toArray:toArray,size:size,pick:pick,omit:omit,first:first,head:first,take:first,initial:initial,last:last,rest:rest,tail:rest,drop:rest,compact:compact,flatten:flatten$1,without:without,uniq:uniq,unique:uniq,union:union,intersection:intersection,difference:difference,unzip:unzip,transpose:unzip,zip:zip,object:object,range:range,chunk:chunk,mixin:mixin,default:_},_$1=mixin(allExports);_$1._=_$1;export default _$1;export{VERSION,after,every as all,allKeys,some as any,extendOwn as assign,before,bind,bindAll,chain,chunk,clone,map as collect,compact,compose,constant,contains,countBy,create,debounce,defaults,defer,delay,find as detect,difference,rest as drop,each,_escape as escape,every,extend,extendOwn,filter,find,findIndex,findKey,findLastIndex,findWhere,first,flatten$1 as flatten,reduce as foldl,reduceRight as foldr,each as forEach,functions,groupBy,has$1 as has,first as head,identity,contains as include,contains as includes,indexBy,indexOf,initial,reduce as inject,intersection,invert,invoke,isArguments$1 as isArguments,isArray,isArrayBuffer,isBoolean,isDataView,isDate,isElement,isEmpty,isEqual,isError,isFinite$1 as isFinite,isFunction$1 as isFunction,isMap,isMatch,isNaN$1 as isNaN,isNull,isNumber,isObject,isRegExp,isSet,isString,isSymbol,isTypedArray$1 as isTypedArray,isUndefined,isWeakMap,isWeakSet,iteratee,keys,last,lastIndexOf,map,mapObject,matcher,matcher as matches,max,memoize,functions as methods,min,mixin,negate,noop,now,object,omit,once,pairs,partial,partition,pick,pluck,property,propertyOf,random,range,reduce,reduceRight,reject,rest,restArguments,result,sample,filter as select,shuffle,size,some,sortBy,sortedIndex,rest as tail,first as take,tap,template,templateSettings,throttle,times,toArray,unzip as transpose,_unescape as unescape,union,uniq,uniq as unique,uniqueId,unzip,values,where,without,wrap,zip};{"version":3,"sources":["modules/_setup.js","modules/restArguments.js","modules/isObject.js","modules/isNull.js","modules/isUndefined.js","modules/isBoolean.js","modules/isElement.js","modules/_tagTester.js","modules/isString.js","modules/isNumber.js","modules/isDate.js","modules/isRegExp.js","modules/isError.js","modules/isSymbol.js","modules/isMap.js","modules/isWeakMap.js","modules/isSet.js","modules/isWeakSet.js","modules/isArrayBuffer.js","modules/isDataView.js","modules/isArray.js","modules/isFunction.js","modules/_has.js","modules/isArguments.js","modules/isFinite.js","modules/isNaN.js","modules/constant.js","modules/_createSizePropertyCheck.js","modules/_shallowProperty.js","modules/_getByteLength.js","modules/_isBufferLike.js","modules/isTypedArray.js","modules/_getLength.js","modules/_isArrayLike.js","modules/_collectNonEnumProps.js","modules/keys.js","modules/isEmpty.js","modules/isMatch.js","modules/underscore.js","modules/isEqual.js","modules/allKeys.js","modules/values.js","modules/pairs.js","modules/invert.js","modules/functions.js","modules/_createAssigner.js","modules/extend.js","modules/extendOwn.js","modules/defaults.js","modules/_baseCreate.js","modules/create.js","modules/clone.js","modules/tap.js","modules/has.js","modules/identity.js","modules/matcher.js","modules/_deepGet.js","modules/property.js","modules/_optimizeCb.js","modules/_baseIteratee.js","modules/iteratee.js","modules/_cb.js","modules/mapObject.js","modules/noop.js","modules/propertyOf.js","modules/times.js","modules/random.js","modules/now.js","modules/_createEscaper.js","modules/_escapeMap.js","modules/escape.js","modules/_unescapeMap.js","modules/unescape.js","modules/templateSettings.js","modules/template.js","modules/result.js","modules/uniqueId.js","modules/chain.js","modules/_executeBound.js","modules/partial.js","modules/bind.js","modules/_flatten.js","modules/bindAll.js","modules/memoize.js","modules/delay.js","modules/defer.js","modules/throttle.js","modules/debounce.js","modules/wrap.js","modules/negate.js","modules/compose.js","modules/after.js","modules/before.js","modules/once.js","modules/findKey.js","modules/_createPredicateIndexFinder.js","modules/findIndex.js","modules/findLastIndex.js","modules/sortedIndex.js","modules/_createIndexFinder.js","modules/indexOf.js","modules/lastIndexOf.js","modules/find.js","modules/findWhere.js","modules/each.js","modules/map.js","modules/_createReduce.js","modules/reduce.js","modules/reduceRight.js","modules/filter.js","modules/reject.js","modules/every.js","modules/some.js","modules/contains.js","modules/invoke.js","modules/pluck.js","modules/where.js","modules/max.js","modules/min.js","modules/sample.js","modules/shuffle.js","modules/sortBy.js","modules/_group.js","modules/groupBy.js","modules/indexBy.js","modules/countBy.js","modules/partition.js","modules/toArray.js","modules/size.js","modules/_keyInObj.js","modules/pick.js","modules/omit.js","modules/initial.js","modules/first.js","modules/rest.js","modules/last.js","modules/compact.js","modules/flatten.js","modules/difference.js","modules/without.js","modules/uniq.js","modules/union.js","modules/intersection.js","modules/unzip.js","modules/zip.js","modules/object.js","modules/range.js","modules/chunk.js","modules/_chainResult.js","modules/mixin.js","modules/underscore-array-methods.js","modules/index-default.js"],"names":["VERSION","root","self","global","Function","ArrayProto","Array","prototype","ObjProto","Object","SymbolProto","Symbol","push","slice","toString","hasOwnProperty","supportsArrayBuffer","ArrayBuffer","nativeIsArray","isArray","nativeKeys","keys","nativeCreate","create","nativeIsView","isView","_isNaN","isNaN","_isFinite","isFinite","hasEnumBug","propertyIsEnumerable","nonEnumerableProps","MAX_ARRAY_INDEX","Math","pow","restArguments","func","startIndex","length","max","arguments","rest","index","call","this","args","apply","isObject","obj","type","isNull","isUndefined","isBoolean","isElement","nodeType","tagTester","name","isString","isNumber","isDate","isRegExp","isError","isSymbol","isMap","isWeakMap","isSet","isWeakSet","isArrayBuffer","isDataView","isFunction","nodelist","document","childNodes","Int8Array","isFunction$1","has","key","isArguments","isArguments$1","parseFloat","constant","value","createSizePropertyCheck","getSizeProperty","collection","sizeProperty","shallowProperty","getByteLength","isBufferLike","typedArrayPattern","isTypedArray","test","isTypedArray$1","getLength","isArrayLike","emulatedSet","hash","l","i","contains","collectNonEnumProps","nonEnumIdx","constructor","proto","prop","isEmpty","isMatch","object","attrs","_keys","_","_wrapped","eq","a","b","aStack","bStack","deepEq","className","valueOf","DataView","byteLength","getUint8","buffer","areArrays","aCtor","bCtor","pop","isEqual","allKeys","values","pairs","invert","result","functions","names","sort","createAssigner","keysFunc","defaults","source","toJSON","String","extend","extendOwn","ctor","baseCreate","Ctor","props","clone","tap","interceptor","path","_has","identity","matcher","deepGet","property","optimizeCb","context","argCount","accumulator","baseIteratee","iteratee","Infinity","cb","mapObject","results","currentKey","noop","propertyOf","times","n","accum","random","min","floor","now","Date","getTime","createEscaper","map","escaper","match","join","testRegexp","RegExp","replaceRegexp","string","replace","escapeMap","&","<",">","\"","'","`","_escape","unescapeMap","_unescape","templateSettings","evaluate","interpolate","escape","noMatch","escapes","\\","\r","\n","â€¨","â€©","escapeRegExp","escapeChar","template","text","settings","oldSettings","render","offset","variable","e","data","argument","fallback","idCounter","uniqueId","prefix","id","chain","instance","_chain","executeBound","sourceFunc","boundFunc","callingContext","partial","boundArgs","placeholder","bound","position","bind","TypeError","callArgs","concat","flatten","input","depth","strict","output","idx","j","len","bindAll","Error","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","throttled","_now","remaining","clearTimeout","trailing","cancel","debounce","immediate","debounced","callNow","wrap","wrapper","negate","predicate","compose","start","after","before","memo","once","findKey","createPredicateIndexFinder","dir","array","findIndex","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","item","indexOf","lastIndexOf","find","findWhere","each","createReduce","reducer","initial","reduce","reduceRight","filter","list","reject","every","some","fromIndex","guard","invoke","contextPath","method","pluck","where","computed","lastComputed","v","sample","last","rand","temp","shuffle","sortBy","criteria","left","right","group","behavior","partition","groupBy","indexBy","countBy","pass","reStrSymbol","toArray","size","keyInObj","pick","omit","first","compact","Boolean","_flatten","difference","without","otherArrays","uniq","isSorted","seen","union","arrays","intersection","argsLength","unzip","zip","range","stop","step","ceil","chunk","count","chainResult","mixin","allExports"],"mappings":";;;;AACU,IAACA,QAAU,SAKVC,KAAsB,iBAARC,MAAoBA,KAAKA,OAASA,MAAQA,MACxC,iBAAVC,QAAsBA,OAAOA,SAAWA,QAAUA,QACzDC,SAAS,cAATA,IACA,GAGCC,WAAaC,MAAMC,UAAWC,SAAWC,OAAOF,UAChDG,YAAgC,oBAAXC,OAAyBA,OAAOJ,UAAY,KAGjEK,KAAOP,WAAWO,KACzBC,MAAQR,WAAWQ,MACnBC,SAAWN,SAASM,SACpBC,eAAiBP,SAASO,eAGnBC,oBAA6C,oBAAhBC,YAI7BC,cAAgBZ,MAAMa,QAC7BC,WAAaX,OAAOY,KACpBC,aAAeb,OAAOc,OACtBC,aAAeR,qBAAuBC,YAAYQ,OAG3CC,OAASC,MAChBC,UAAYC,SAGLC,YAAc,CAAChB,SAAU,MAAMiB,qBAAqB,YACpDC,mBAAqB,CAAC,UAAW,gBAAiB,WAC3D,uBAAwB,iBAAkB,kBAGjCC,gBAAkBC,KAAKC,IAAI,EAAG,IAAM,ECpC/C,SAAwBC,cAAcC,EAAMC,GAE1C,OADAA,EAA2B,MAAdA,EAAqBD,EAAKE,OAAS,GAAKD,EAC9C,WAIL,IAHA,IAAIC,EAASL,KAAKM,IAAIC,UAAUF,OAASD,EAAY,GACjDI,EAAOpC,MAAMiC,GACbI,EAAQ,EACLA,EAAQJ,EAAQI,IACrBD,EAAKC,GAASF,UAAUE,EAAQL,GAElC,OAAQA,GACN,KAAK,EAAG,OAAOD,EAAKO,KAAKC,KAAMH,GAC/B,KAAK,EAAG,OAAOL,EAAKO,KAAKC,KAAMJ,UAAU,GAAIC,GAC7C,KAAK,EAAG,OAAOL,EAAKO,KAAKC,KAAMJ,UAAU,GAAIA,UAAU,GAAIC,GAE7D,IAAII,EAAOxC,MAAMgC,EAAa,GAC9B,IAAKK,EAAQ,EAAGA,EAAQL,EAAYK,IAClCG,EAAKH,GAASF,UAAUE,GAG1B,OADAG,EAAKR,GAAcI,EACZL,EAAKU,MAAMF,KAAMC,ICvB5B,SAAwBE,SAASC,GAC/B,IAAIC,SAAcD,EAClB,MAAgB,aAATC,GAAgC,WAATA,KAAuBD,ECFvD,SAAwBE,OAAOF,GAC7B,OAAe,OAARA,ECDT,SAAwBG,YAAYH,GAClC,YAAe,IAARA,ECCT,SAAwBI,UAAUJ,GAChC,OAAe,IAARA,IAAwB,IAARA,GAAwC,qBAAvBnC,SAAS8B,KAAKK,GCHxD,SAAwBK,UAAUL,GAChC,SAAUA,GAAwB,IAAjBA,EAAIM,UCCvB,SAAwBC,UAAUC,GAChC,OAAO,SAASR,GACd,OAAOnC,SAAS8B,KAAKK,KAAS,WAAaQ,EAAO,KCHtD,IAAAC,SAAeF,UAAU,UCAzBG,SAAeH,UAAU,UCAzBI,OAAeJ,UAAU,QCAzBK,SAAeL,UAAU,UCAzBM,QAAeN,UAAU,SCAzBO,SAAeP,UAAU,UCAzBQ,MAAeR,UAAU,OCAzBS,UAAeT,UAAU,WCAzBU,MAAeV,UAAU,OCAzBW,UAAeX,UAAU,WCAzBY,cAAeZ,UAAU,eCAzBa,WAAeb,UAAU,YCGzBrC,QAAeD,eAAiBsC,UAAU,SCFtCc,WAAad,UAAU,YAIvBe,SAAWtE,KAAKuE,UAAYvE,KAAKuE,SAASC,WAC5B,kBAAP,KAAyC,iBAAbC,WAA4C,mBAAZH,WACrED,WAAa,SAASrB,GACpB,MAAqB,mBAAPA,IAAqB,IAIvC,IAAA0B,aAAeL,WCXf,SAAwBM,IAAI3B,EAAK4B,GAC/B,OAAc,MAAP5B,GAAelC,eAAe6B,KAAKK,EAAK4B,GCDjD,IAAIC,YAActB,UAAU,cAI3B,WACMsB,YAAYrC,aACfqC,YAAc,SAAS7B,GACrB,OAAO2B,IAAI3B,EAAK,YAHtB,GAQA,IAAA8B,cAAeD,YCXf,SAAwBjD,WAASoB,GAC/B,OAAQc,SAASd,IAAQrB,UAAUqB,KAAStB,MAAMqD,WAAW/B,ICD/D,SAAwBtB,QAAMsB,GAC5B,OAAOU,SAASV,IAAQvB,OAAOuB,GCJjC,SAAwBgC,SAASC,GAC/B,OAAO,WACL,OAAOA,GCAX,SAAwBC,wBAAwBC,GAC9C,OAAO,SAASC,GACd,IAAIC,EAAeF,EAAgBC,GACnC,MAA8B,iBAAhBC,GAA4BA,GAAgB,GAAKA,GAAgBrD,iBCLnF,SAAwBsD,gBAAgBV,GACtC,OAAO,SAAS5B,GACd,OAAc,MAAPA,OAAc,EAASA,EAAI4B,ICAtC,IAAAW,cAAeD,gBAAgB,cCE/BE,aAAeN,wBAAwBK,eCCnCE,kBAAoB,8EACxB,SAASC,aAAa1C,GAGpB,OAAOzB,aAAgBA,aAAayB,KAASoB,WAAWpB,GAC1CwC,aAAaxC,IAAQyC,kBAAkBE,KAAK9E,SAAS8B,KAAKK,IAG1E,IAAA4C,eAAe7E,oBAAsB2E,aAAeV,UAAS,GCX7Da,UAAeP,gBAAgB,UCI/BQ,YAAeZ,wBAAwBW,WCCvC,SAASE,YAAY3E,GAEnB,IADA,IAAI4E,EAAO,GACFC,EAAI7E,EAAKkB,OAAQ4D,EAAI,EAAGA,EAAID,IAAKC,EAAGF,EAAK5E,EAAK8E,KAAM,EAC7D,MAAO,CACLC,SAAU,SAASvB,GAAO,OAAOoB,EAAKpB,IACtCjE,KAAM,SAASiE,GAEb,OADAoB,EAAKpB,IAAO,EACLxD,EAAKT,KAAKiE,KAQvB,SAAwBwB,oBAAoBpD,EAAK5B,GAC/CA,EAAO2E,YAAY3E,GACnB,IAAIiF,EAAatE,mBAAmBO,OAChCgE,EAActD,EAAIsD,YAClBC,EAAQlC,aAAWiC,IAAgBA,EAAYhG,WAAaC,SAG5DiG,EAAO,cAGX,IAFI7B,IAAI3B,EAAKwD,KAAUpF,EAAK+E,SAASK,IAAOpF,EAAKT,KAAK6F,GAE/CH,MACLG,EAAOzE,mBAAmBsE,MACdrD,GAAOA,EAAIwD,KAAUD,EAAMC,KAAUpF,EAAK+E,SAASK,IAC7DpF,EAAKT,KAAK6F,GC7BhB,SAAwBpF,KAAK4B,GAC3B,IAAKD,SAASC,GAAM,MAAO,GAC3B,GAAI7B,WAAY,OAAOA,WAAW6B,GAClC,IAAI5B,EAAO,GACX,IAAK,IAAIwD,KAAO5B,EAAS2B,IAAI3B,EAAK4B,IAAMxD,EAAKT,KAAKiE,GAGlD,OADI/C,YAAYuE,oBAAoBpD,EAAK5B,GAClCA,ECNT,SAAwBqF,QAAQzD,GAC9B,OAAW,MAAPA,IAGA8C,YAAY9C,KAAS9B,QAAQ8B,IAAQS,SAAST,IAAQ6B,cAAY7B,IAA6B,IAAfA,EAAIV,OAC5D,IAArBlB,KAAK4B,GAAKV,QCVnB,SAAwBoE,QAAQC,EAAQC,GACtC,IAAIC,EAAQzF,KAAKwF,GAAQtE,EAASuE,EAAMvE,OACxC,GAAc,MAAVqE,EAAgB,OAAQrE,EAE5B,IADA,IAAIU,EAAMxC,OAAOmG,GACRT,EAAI,EAAGA,EAAI5D,EAAQ4D,IAAK,CAC/B,IAAItB,EAAMiC,EAAMX,GAChB,GAAIU,EAAMhC,KAAS5B,EAAI4B,MAAUA,KAAO5B,GAAM,OAAO,EAEvD,OAAO,ECNT,SAAwB8D,EAAE9D,GACxB,OAAIA,aAAe8D,EAAU9D,EACvBJ,gBAAgBkE,OACtBlE,KAAKmE,SAAW/D,GADiB,IAAI8D,EAAE9D,GCEzC,SAASgE,GAAGC,EAAGC,EAAGC,EAAQC,GAGxB,GAAIH,IAAMC,EAAG,OAAa,IAAND,GAAW,EAAIA,GAAM,EAAIC,EAE7C,GAAS,MAALD,GAAkB,MAALC,EAAW,OAAO,EAEnC,GAAID,GAAMA,EAAG,OAAOC,GAAMA,EAE1B,IAAIjE,SAAcgE,EAClB,OAAa,aAAThE,GAAgC,WAATA,GAAiC,iBAALiE,IAChDG,OAAOJ,EAAGC,EAAGC,EAAQC,GAI9B,SAASC,OAAOJ,EAAGC,EAAGC,EAAQC,GAExBH,aAAaH,IAAGG,EAAIA,EAAEF,UACtBG,aAAaJ,IAAGI,EAAIA,EAAEH,UAE1B,IAAIO,EAAYzG,SAAS8B,KAAKsE,GAC9B,GAAIK,IAAczG,SAAS8B,KAAKuE,GAAI,OAAO,EAC3C,OAAQI,GAEN,IAAK,kBAEL,IAAK,kBAGH,MAAO,GAAKL,GAAM,GAAKC,EACzB,IAAK,kBAGH,OAAKD,IAAOA,GAAWC,IAAOA,EAEhB,IAAND,EAAU,GAAKA,GAAM,EAAIC,GAAKD,IAAOC,EAC/C,IAAK,gBACL,IAAK,mBAIH,OAAQD,IAAOC,EACjB,IAAK,kBACH,OAAOzG,YAAY8G,QAAQ5E,KAAKsE,KAAOxG,YAAY8G,QAAQ5E,KAAKuE,GAClE,IAAK,uBAEH,OAAOG,OAAO,IAAIG,SAASP,GAAI,IAAIO,SAASN,GAAIC,EAAQC,GAC1D,IAAK,oBACH,IAAIK,EAAalC,cAAc0B,GAC/B,GAAIQ,IAAelC,cAAc2B,GAC/B,OAAO,EAET,KAAOO,KACL,GAAIR,EAAES,SAASD,KAAgBP,EAAEQ,SAASD,GACxC,OAAO,EAGX,OAAO,EAGX,GAAI/B,eAAauB,GAEf,OAAOI,OAAO,IAAIG,SAASP,EAAEU,QAAS,IAAIH,SAASN,EAAES,QAASR,EAAQC,GAGxE,IAAIQ,EAA0B,mBAAdN,EAChB,IAAKM,EAAW,CACd,GAAgB,iBAALX,GAA6B,iBAALC,EAAe,OAAO,EAIzD,IAAIW,EAAQZ,EAAEX,YAAawB,EAAQZ,EAAEZ,YACrC,GAAIuB,IAAUC,KAAWzD,aAAWwD,IAAUA,aAAiBA,GACtCxD,aAAWyD,IAAUA,aAAiBA,IACvC,gBAAiBb,GAAK,gBAAiBC,EAC7D,OAAO,EASXE,EAASA,GAAU,GAEnB,IADA,IAAI9E,GAFJ6E,EAASA,GAAU,IAEC7E,OACbA,KAGL,GAAI6E,EAAO7E,KAAY2E,EAAG,OAAOG,EAAO9E,KAAY4E,EAQtD,GAJAC,EAAOxG,KAAKsG,GACZG,EAAOzG,KAAKuG,GAGRU,EAAW,CAGb,IADAtF,EAAS2E,EAAE3E,UACI4E,EAAE5E,OAAQ,OAAO,EAEhC,KAAOA,KACL,IAAK0E,GAAGC,EAAE3E,GAAS4E,EAAE5E,GAAS6E,EAAQC,GAAS,OAAO,MAEnD,CAEL,IAAqBxC,EAAjBiC,EAAQzF,KAAK6F,GAGjB,GAFA3E,EAASuE,EAAMvE,OAEXlB,KAAK8F,GAAG5E,SAAWA,EAAQ,OAAO,EACtC,KAAOA,KAGL,IAAMqC,IAAIuC,EADVtC,EAAMiC,EAAMvE,MACS0E,GAAGC,EAAErC,GAAMsC,EAAEtC,GAAMuC,EAAQC,GAAU,OAAO,EAMrE,OAFAD,EAAOY,MACPX,EAAOW,OACA,EAIT,SAAwBC,QAAQf,EAAGC,GACjC,OAAOF,GAAGC,EAAGC,GCjIf,SAAwBe,QAAQjF,GAC9B,IAAKD,SAASC,GAAM,MAAO,GAC3B,IAAI5B,EAAO,GACX,IAAK,IAAIwD,KAAO5B,EAAK5B,EAAKT,KAAKiE,GAG/B,OADI/C,YAAYuE,oBAAoBpD,EAAK5B,GAClCA,ECRT,SAAwB8G,OAAOlF,GAI7B,IAHA,IAAI6D,EAAQzF,KAAK4B,GACbV,EAASuE,EAAMvE,OACf4F,EAAS7H,MAAMiC,GACV4D,EAAI,EAAGA,EAAI5D,EAAQ4D,IAC1BgC,EAAOhC,GAAKlD,EAAI6D,EAAMX,IAExB,OAAOgC,ECNT,SAAwBC,MAAMnF,GAI5B,IAHA,IAAI6D,EAAQzF,KAAK4B,GACbV,EAASuE,EAAMvE,OACf6F,EAAQ9H,MAAMiC,GACT4D,EAAI,EAAGA,EAAI5D,EAAQ4D,IAC1BiC,EAAMjC,GAAK,CAACW,EAAMX,GAAIlD,EAAI6D,EAAMX,KAElC,OAAOiC,ECRT,SAAwBC,OAAOpF,GAG7B,IAFA,IAAIqF,EAAS,GACTxB,EAAQzF,KAAK4B,GACRkD,EAAI,EAAG5D,EAASuE,EAAMvE,OAAQ4D,EAAI5D,EAAQ4D,IACjDmC,EAAOrF,EAAI6D,EAAMX,KAAOW,EAAMX,GAEhC,OAAOmC,ECNT,SAAwBC,UAAUtF,GAChC,IAAIuF,EAAQ,GACZ,IAAK,IAAI3D,KAAO5B,EACVqB,aAAWrB,EAAI4B,KAAO2D,EAAM5H,KAAKiE,GAEvC,OAAO2D,EAAMC,OCPf,SAAwBC,eAAeC,EAAUC,GAC/C,OAAO,SAAS3F,GACd,IAAIV,EAASE,UAAUF,OAEvB,GADIqG,IAAU3F,EAAMxC,OAAOwC,IACvBV,EAAS,GAAY,MAAPU,EAAa,OAAOA,EACtC,IAAK,IAAIN,EAAQ,EAAGA,EAAQJ,EAAQI,IAIlC,IAHA,IAAIkG,EAASpG,UAAUE,GACnBtB,EAAOsH,EAASE,GAChB3C,EAAI7E,EAAKkB,OACJ4D,EAAI,EAAGA,EAAID,EAAGC,IAAK,CAC1B,IAAItB,EAAMxD,EAAK8E,GACVyC,QAAyB,IAAb3F,EAAI4B,KAAiB5B,EAAI4B,GAAOgE,EAAOhE,IAG5D,OAAO5B,GPJX8D,EAAE/G,QAAUA,QAGZ+G,EAAExG,UAAU2E,MAAQ,WAClB,OAAOrC,KAAKmE,UAKdD,EAAExG,UAAUiH,QAAUT,EAAExG,UAAUuI,OAAS/B,EAAExG,UAAU2E,MAEvD6B,EAAExG,UAAUO,SAAW,WACrB,OAAOiI,OAAOlG,KAAKmE,WQnBrB,IAAAgC,OAAeN,eAAeR,SCE9Be,UAAeP,eAAerH,MCF9BuH,SAAeF,eAAeR,SAAS,GCAvC,SAASgB,OACP,OAAO,aAIT,SAAwBC,WAAW5I,GACjC,IAAKyC,SAASzC,GAAY,MAAO,GACjC,GAAIe,aAAc,OAAOA,aAAaf,GACtC,IAAI6I,EAAOF,OACXE,EAAK7I,UAAYA,EACjB,IAAI+H,EAAS,IAAIc,EAEjB,OADAA,EAAK7I,UAAY,KACV+H,ECVT,SAAwB/G,OAAOhB,EAAW8I,GACxC,IAAIf,EAASa,WAAW5I,GAExB,OADI8I,GAAOJ,UAAUX,EAAQe,GACtBf,ECJT,SAAwBgB,MAAMrG,GAC5B,OAAKD,SAASC,GACP9B,QAAQ8B,GAAOA,EAAIpC,QAAUmI,OAAO,GAAI/F,GADpBA,ECH7B,SAAwBsG,IAAItG,EAAKuG,GAE/B,OADAA,EAAYvG,GACLA,ECET,SAAwB2B,MAAI3B,EAAKwG,GAC/B,IAAKtI,QAAQsI,GACX,OAAOC,IAAKzG,EAAKwG,GAGnB,IADA,IAAIlH,EAASkH,EAAKlH,OACT4D,EAAI,EAAGA,EAAI5D,EAAQ4D,IAAK,CAC/B,IAAItB,EAAM4E,EAAKtD,GACf,GAAW,MAAPlD,IAAgBlC,eAAe6B,KAAKK,EAAK4B,GAC3C,OAAO,EAET5B,EAAMA,EAAI4B,GAEZ,QAAStC,EClBX,SAAwBoH,SAASzE,GAC/B,OAAOA,ECGT,SAAwB0E,QAAQ/C,GAE9B,OADAA,EAAQoC,UAAU,GAAIpC,GACf,SAAS5D,GACd,OAAO0D,QAAQ1D,EAAK4D,ICPxB,SAAwBgD,QAAQ5G,EAAKwG,GAEnC,IADA,IAAIlH,EAASkH,EAAKlH,OACT4D,EAAI,EAAGA,EAAI5D,EAAQ4D,IAAK,CAC/B,GAAW,MAAPlD,EAAa,OACjBA,EAAMA,EAAIwG,EAAKtD,IAEjB,OAAO5D,EAASU,OAAM,ECDxB,SAAwB6G,SAASL,GAC/B,OAAKtI,QAAQsI,GAGN,SAASxG,GACd,OAAO4G,QAAQ5G,EAAKwG,IAHblE,gBAAgBkE,GCL3B,SAAwBM,WAAW1H,EAAM2H,EAASC,GAChD,QAAgB,IAAZD,EAAoB,OAAO3H,EAC/B,OAAoB,MAAZ4H,EAAmB,EAAIA,GAC7B,KAAK,EAAG,OAAO,SAAS/E,GACtB,OAAO7C,EAAKO,KAAKoH,EAAS9E,IAG5B,KAAK,EAAG,OAAO,SAASA,EAAOvC,EAAO0C,GACpC,OAAOhD,EAAKO,KAAKoH,EAAS9E,EAAOvC,EAAO0C,IAE1C,KAAK,EAAG,OAAO,SAAS6E,EAAahF,EAAOvC,EAAO0C,GACjD,OAAOhD,EAAKO,KAAKoH,EAASE,EAAahF,EAAOvC,EAAO0C,IAGzD,OAAO,WACL,OAAOhD,EAAKU,MAAMiH,EAASvH,YCP/B,SAAwB0H,aAAajF,EAAO8E,EAASC,GACnD,OAAa,MAAT/E,EAAsByE,SACtBrF,aAAWY,GAAe6E,WAAW7E,EAAO8E,EAASC,GACrDjH,SAASkC,KAAW/D,QAAQ+D,GAAe0E,QAAQ1E,GAChD4E,SAAS5E,GCTlB,SAAwBkF,SAASlF,EAAO8E,GACtC,OAAOG,aAAajF,EAAO8E,EAASK,EAAAA,GCDtC,SAAwBC,GAAGpF,EAAO8E,EAASC,GACzC,OAAIlD,EAAEqD,WAAaA,SAAiBrD,EAAEqD,SAASlF,EAAO8E,GAC/CG,aAAajF,EAAO8E,EAASC,GCHtC,SAAwBM,UAAUtH,EAAKmH,EAAUJ,GAC/CI,EAAWE,GAAGF,EAAUJ,GAIxB,IAHA,IAAIlD,EAAQzF,KAAK4B,GACbV,EAASuE,EAAMvE,OACfiI,EAAU,GACL7H,EAAQ,EAAGA,EAAQJ,EAAQI,IAAS,CAC3C,IAAI8H,EAAa3D,EAAMnE,GACvB6H,EAAQC,GAAcL,EAASnH,EAAIwH,GAAaA,EAAYxH,GAE9D,OAAOuH,ECbT,SAAwBE,QCGxB,SAAwBC,WAAW1H,GACjC,OAAW,MAAPA,EACK,aAEF,SAASwG,GACd,OAAQtI,QAAQsI,GAAoBI,QAAQ5G,EAAKwG,GAAzBxG,EAAIwG,ICNhC,SAAwBmB,MAAMC,EAAGT,EAAUJ,GACzC,IAAIc,EAAQxK,MAAM4B,KAAKM,IAAI,EAAGqI,IAC9BT,EAAWL,WAAWK,EAAUJ,EAAS,GACzC,IAAK,IAAI7D,EAAI,EAAGA,EAAI0E,EAAG1E,IAAK2E,EAAM3E,GAAKiE,EAASjE,GAChD,OAAO2E,ECNT,SAAwBC,OAAOC,EAAKxI,GAKlC,OAJW,MAAPA,IACFA,EAAMwI,EACNA,EAAM,GAEDA,EAAM9I,KAAK+I,MAAM/I,KAAK6I,UAAYvI,EAAMwI,EAAM,INGvDjE,EAAEqD,SAAWA,SORb,IAAAc,IAAeC,KAAKD,KAAO,WACzB,OAAO,IAAIC,MAAOC,WCEpB,SAAwBC,cAAcC,GACpC,IAAIC,EAAU,SAASC,GACrB,OAAOF,EAAIE,IAGT3C,EAAS,MAAQxH,KAAKiK,GAAKG,KAAK,KAAO,IACvCC,EAAaC,OAAO9C,GACpB+C,EAAgBD,OAAO9C,EAAQ,KACnC,OAAO,SAASgD,GAEd,OADAA,EAAmB,MAAVA,EAAiB,GAAK,GAAKA,EAC7BH,EAAW9F,KAAKiG,GAAUA,EAAOC,QAAQF,EAAeL,GAAWM,GCb9E,IAAAE,UAAe,CACbC,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,IAAK,SACLC,IAAK,SACLC,IAAK,UCHPC,QAAejB,cAAcU,WCA7BQ,YAAelE,OAAO0D,WCAtBS,UAAenB,cAAckB,aCA7BE,iBAAe1F,EAAE0F,iBAAmB,CAClCC,SAAU,kBACVC,YAAa,mBACbC,OAAQ,oBCANC,QAAU,OAIVC,QAAU,CACZV,IAAK,IACLW,KAAM,KACNC,KAAM,IACNC,KAAM,IACNC,SAAU,QACVC,SAAU,SAGRC,aAAe,4BAEnB,SAASC,WAAW7B,GAClB,MAAO,KAAOsB,QAAQtB,GAOxB,SAAwB8B,SAASC,EAAMC,EAAUC,IAC1CD,GAAYC,IAAaD,EAAWC,GACzCD,EAAW5E,SAAS,GAAI4E,EAAUzG,EAAE0F,kBAGpC,IAiCIiB,EAjCA9D,EAAU+B,OAAO,EAClB6B,EAASZ,QAAUC,SAAShE,QAC5B2E,EAASb,aAAeE,SAAShE,QACjC2E,EAASd,UAAYG,SAAShE,QAC/B4C,KAAK,KAAO,KAAM,KAGhB9I,EAAQ,EACRkG,EAAS,SACb0E,EAAKzB,QAAQlC,GAAS,SAAS4B,EAAOoB,EAAQD,EAAaD,EAAUiB,GAanE,OAZA9E,GAAU0E,EAAK1M,MAAM8B,EAAOgL,GAAQ7B,QAAQsB,aAAcC,YAC1D1K,EAAQgL,EAASnC,EAAMjJ,OAEnBqK,EACF/D,GAAU,cAAgB+D,EAAS,iCAC1BD,EACT9D,GAAU,cAAgB8D,EAAc,uBAC/BD,IACT7D,GAAU,OAAS6D,EAAW,YAIzBlB,KAET3C,GAAU,OAGL2E,EAASI,WAAU/E,EAAS,mBAAqBA,EAAS,OAE/DA,EAAS,2CACP,oDACAA,EAAS,gBAGX,IACE6E,EAAS,IAAItN,SAASoN,EAASI,UAAY,MAAO,IAAK/E,GACvD,MAAOgF,GAEP,MADAA,EAAEhF,OAASA,EACLgF,EAGR,IAAIP,EAAW,SAASQ,GACtB,OAAOJ,EAAO9K,KAAKC,KAAMiL,EAAM/G,IAI7BgH,EAAWP,EAASI,UAAY,MAGpC,OAFAN,EAASzE,OAAS,YAAckF,EAAW,OAASlF,EAAS,IAEtDyE,EC9ET,SAAwBhF,OAAOrF,EAAKwG,EAAMuE,GACnC7M,QAAQsI,KAAOA,EAAO,CAACA,IAC5B,IAAIlH,EAASkH,EAAKlH,OAClB,IAAKA,EACH,OAAO+B,aAAW0J,GAAYA,EAASpL,KAAKK,GAAO+K,EAErD,IAAK,IAAI7H,EAAI,EAAGA,EAAI5D,EAAQ4D,IAAK,CAC/B,IAAIM,EAAc,MAAPxD,OAAc,EAASA,EAAIwG,EAAKtD,SAC9B,IAATM,IACFA,EAAOuH,EACP7H,EAAI5D,GAENU,EAAMqB,aAAWmC,GAAQA,EAAK7D,KAAKK,GAAOwD,EAE5C,OAAOxD,EClBT,IAAIgL,UAAY,EAChB,SAAwBC,SAASC,GAC/B,IAAIC,IAAOH,UAAY,GACvB,OAAOE,EAASA,EAASC,EAAKA,ECFhC,SAAwBC,MAAMpL,GAC5B,IAAIqL,EAAWvH,EAAE9D,GAEjB,OADAqL,EAASC,QAAS,EACXD,ECAT,SAAwBE,aAAaC,EAAYC,EAAW1E,EAAS2E,EAAgB7L,GACnF,KAAM6L,aAA0BD,GAAY,OAAOD,EAAW1L,MAAMiH,EAASlH,GAC7E,IAAI5C,EAAOiJ,WAAWsF,EAAWlO,WAC7B+H,EAASmG,EAAW1L,MAAM7C,EAAM4C,GACpC,OAAIE,SAASsF,GAAgBA,EACtBpI,ECHT,IAAI0O,QAAUxM,eAAc,SAASC,EAAMwM,GACzC,IAAIC,EAAcF,QAAQE,YACtBC,EAAQ,WAGV,IAFA,IAAIC,EAAW,EAAGzM,EAASsM,EAAUtM,OACjCO,EAAOxC,MAAMiC,GACR4D,EAAI,EAAGA,EAAI5D,EAAQ4D,IAC1BrD,EAAKqD,GAAK0I,EAAU1I,KAAO2I,EAAcrM,UAAUuM,KAAcH,EAAU1I,GAE7E,KAAO6I,EAAWvM,UAAUF,QAAQO,EAAKlC,KAAK6B,UAAUuM,MACxD,OAAOR,aAAanM,EAAM0M,EAAOlM,KAAMA,KAAMC,IAE/C,OAAOiM,KAGTH,QAAQE,YAAc/H,EChBtB,IAAAkI,KAAe7M,eAAc,SAASC,EAAM2H,EAASlH,GACnD,IAAKwB,aAAWjC,GAAO,MAAM,IAAI6M,UAAU,qCAC3C,IAAIH,EAAQ3M,eAAc,SAAS+M,GACjC,OAAOX,aAAanM,EAAM0M,EAAO/E,EAASnH,KAAMC,EAAKsM,OAAOD,OAE9D,OAAOJ,KCLT,SAAwBM,QAAQC,EAAOC,EAAOC,EAAQC,GAEpD,GADAA,EAASA,GAAU,GACdF,GAAmB,IAAVA,GAEP,GAAIA,GAAS,EAClB,OAAOE,EAAOL,OAAOE,QAFrBC,EAAQlF,EAAAA,EAKV,IADA,IAAIqF,EAAMD,EAAOlN,OACR4D,EAAI,EAAG5D,EAASuD,UAAUwJ,GAAQnJ,EAAI5D,EAAQ4D,IAAK,CAC1D,IAAIjB,EAAQoK,EAAMnJ,GAClB,GAAIJ,YAAYb,KAAW/D,QAAQ+D,IAAUJ,cAAYI,IAEvD,GAAIqK,EAAQ,EACVF,QAAQnK,EAAOqK,EAAQ,EAAGC,EAAQC,GAClCC,EAAMD,EAAOlN,YAGb,IADA,IAAIoN,EAAI,EAAGC,EAAM1K,EAAM3C,OAChBoN,EAAIC,GAAKH,EAAOC,KAASxK,EAAMyK,UAE9BH,IACVC,EAAOC,KAASxK,GAGpB,OAAOuK,ECtBT,IAAAI,QAAezN,eAAc,SAASa,EAAK5B,GAEzC,IAAIsB,GADJtB,EAAOgO,QAAQhO,GAAM,GAAO,IACXkB,OACjB,GAAII,EAAQ,EAAG,MAAM,IAAImN,MAAM,yCAC/B,KAAOnN,KAAS,CACd,IAAIkC,EAAMxD,EAAKsB,GACfM,EAAI4B,GAAOoK,KAAKhM,EAAI4B,GAAM5B,GAE5B,OAAOA,KCZT,SAAwB8M,QAAQ1N,EAAM2N,GACpC,IAAID,EAAU,SAASlL,GACrB,IAAIoL,EAAQF,EAAQE,MAChBC,EAAU,IAAMF,EAASA,EAAOjN,MAAMF,KAAMJ,WAAaoC,GAE7D,OADKD,IAAIqL,EAAOC,KAAUD,EAAMC,GAAW7N,EAAKU,MAAMF,KAAMJ,YACrDwN,EAAMC,IAGf,OADAH,EAAQE,MAAQ,GACTF,ECPT,IAAAI,MAAe/N,eAAc,SAASC,EAAM+N,EAAMtN,GAChD,OAAOuN,YAAW,WAChB,OAAOhO,EAAKU,MAAM,KAAMD,KACvBsN,MCDLE,MAAe1B,QAAQuB,MAAOpJ,EAAG,GCCjC,SAAwBwJ,SAASlO,EAAM+N,EAAMI,GAC3C,IAAIC,EAASzG,EAASlH,EAAMwF,EACxBoI,EAAW,EACVF,IAASA,EAAU,IAExB,IAAIG,EAAQ,WACVD,GAA+B,IAApBF,EAAQI,QAAoB,EAAI1F,MAC3CuF,EAAU,KACVnI,EAASjG,EAAKU,MAAMiH,EAASlH,GACxB2N,IAASzG,EAAUlH,EAAO,OAG7B+N,EAAY,WACd,IAAIC,EAAO5F,MACNwF,IAAgC,IAApBF,EAAQI,UAAmBF,EAAWI,GACvD,IAAIC,EAAYX,GAAQU,EAAOJ,GAc/B,OAbA1G,EAAUnH,KACVC,EAAOL,UACHsO,GAAa,GAAKA,EAAYX,GAC5BK,IACFO,aAAaP,GACbA,EAAU,MAEZC,EAAWI,EACXxI,EAASjG,EAAKU,MAAMiH,EAASlH,GACxB2N,IAASzG,EAAUlH,EAAO,OACrB2N,IAAgC,IAArBD,EAAQS,WAC7BR,EAAUJ,WAAWM,EAAOI,IAEvBzI,GAST,OANAuI,EAAUK,OAAS,WACjBF,aAAaP,GACbC,EAAW,EACXD,EAAUzG,EAAUlH,EAAO,MAGtB+N,ECtCT,SAAwBM,SAAS9O,EAAM+N,EAAMgB,GAC3C,IAAIX,EAASnI,EAETqI,EAAQ,SAAS3G,EAASlH,GAC5B2N,EAAU,KACN3N,IAAMwF,EAASjG,EAAKU,MAAMiH,EAASlH,KAGrCuO,EAAYjP,eAAc,SAASU,GAErC,GADI2N,GAASO,aAAaP,GACtBW,EAAW,CACb,IAAIE,GAAWb,EACfA,EAAUJ,WAAWM,EAAOP,GACxBkB,IAAShJ,EAASjG,EAAKU,MAAMF,KAAMC,SAEvC2N,EAAUN,MAAMQ,EAAOP,EAAMvN,KAAMC,GAGrC,OAAOwF,KAQT,OALA+I,EAAUH,OAAS,WACjBF,aAAaP,GACbA,EAAU,MAGLY,EC5BT,SAAwBE,KAAKlP,EAAMmP,GACjC,OAAO5C,QAAQ4C,EAASnP,GCL1B,SAAwBoP,OAAOC,GAC7B,OAAO,WACL,OAAQA,EAAU3O,MAAMF,KAAMJ,YCDlC,SAAwBkP,UACtB,IAAI7O,EAAOL,UACPmP,EAAQ9O,EAAKP,OAAS,EAC1B,OAAO,WAGL,IAFA,IAAI4D,EAAIyL,EACJtJ,EAASxF,EAAK8O,GAAO7O,MAAMF,KAAMJ,WAC9B0D,KAAKmC,EAASxF,EAAKqD,GAAGvD,KAAKC,KAAMyF,GACxC,OAAOA,GCRX,SAAwBuJ,MAAMjH,EAAOvI,GACnC,OAAO,WACL,KAAMuI,EAAQ,EACZ,OAAOvI,EAAKU,MAAMF,KAAMJ,YCF9B,SAAwBqP,OAAOlH,EAAOvI,GACpC,IAAI0P,EACJ,OAAO,WAKL,QAJMnH,EAAQ,IACZmH,EAAO1P,EAAKU,MAAMF,KAAMJ,YAEtBmI,GAAS,IAAGvI,EAAO,MAChB0P,GCJX,IAAAC,KAAepD,QAAQkD,OAAQ,GCD/B,SAAwBG,QAAQhP,EAAKyO,EAAW1H,GAC9C0H,EAAYpH,GAAGoH,EAAW1H,GAE1B,IADA,IAAuBnF,EAAnBiC,EAAQzF,KAAK4B,GACRkD,EAAI,EAAG5D,EAASuE,EAAMvE,OAAQ4D,EAAI5D,EAAQ4D,IAEjD,GAAIuL,EAAUzO,EADd4B,EAAMiC,EAAMX,IACYtB,EAAK5B,GAAM,OAAO4B,ECL9C,SAAwBqN,2BAA2BC,GACjD,OAAO,SAASC,EAAOV,EAAW1H,GAChC0H,EAAYpH,GAAGoH,EAAW1H,GAG1B,IAFA,IAAIzH,EAASuD,UAAUsM,GACnBzP,EAAQwP,EAAM,EAAI,EAAI5P,EAAS,EAC5BI,GAAS,GAAKA,EAAQJ,EAAQI,GAASwP,EAC5C,GAAIT,EAAUU,EAAMzP,GAAQA,EAAOyP,GAAQ,OAAOzP,EAEpD,OAAQ,GCTZ,IAAA0P,UAAeH,2BAA2B,GCA1CI,cAAeJ,4BAA4B,GCE3C,SAAwBK,YAAYH,EAAOnP,EAAKmH,EAAUJ,GAIxD,IAFA,IAAI9E,GADJkF,EAAWE,GAAGF,EAAUJ,EAAS,IACZ/G,GACjBuP,EAAM,EAAGC,EAAO3M,UAAUsM,GACvBI,EAAMC,GAAM,CACjB,IAAIC,EAAMxQ,KAAK+I,OAAOuH,EAAMC,GAAQ,GAChCrI,EAASgI,EAAMM,IAAQxN,EAAOsN,EAAME,EAAM,EAAQD,EAAOC,EAE/D,OAAOF,ECRT,SAAwBG,kBAAkBR,EAAKS,EAAeL,GAC5D,OAAO,SAASH,EAAOS,EAAMnD,GAC3B,IAAIvJ,EAAI,EAAG5D,EAASuD,UAAUsM,GAC9B,GAAkB,iBAAP1C,EACLyC,EAAM,EACRhM,EAAIuJ,GAAO,EAAIA,EAAMxN,KAAKM,IAAIkN,EAAMnN,EAAQ4D,GAE5C5D,EAASmN,GAAO,EAAIxN,KAAK8I,IAAI0E,EAAM,EAAGnN,GAAUmN,EAAMnN,EAAS,OAE5D,GAAIgQ,GAAe7C,GAAOnN,EAE/B,OAAO6P,EADP1C,EAAM6C,EAAYH,EAAOS,MACHA,EAAOnD,GAAO,EAEtC,GAAImD,GAASA,EAEX,OADAnD,EAAMkD,EAAc/R,MAAM+B,KAAKwP,EAAOjM,EAAG5D,GAASZ,WACpC,EAAI+N,EAAMvJ,GAAK,EAE/B,IAAKuJ,EAAMyC,EAAM,EAAIhM,EAAI5D,EAAS,EAAGmN,GAAO,GAAKA,EAAMnN,EAAQmN,GAAOyC,EACpE,GAAIC,EAAM1C,KAASmD,EAAM,OAAOnD,EAElC,OAAQ,GCjBZ,IAAAoD,QAAeH,kBAAkB,EAAGN,UAAWE,aCH/CQ,YAAeJ,mBAAmB,EAAGL,eCArC,SAAwBU,KAAK/P,EAAKyO,EAAW1H,GAC3C,IACInF,GADYkB,YAAY9C,GAAOoP,UAAYJ,SAC3BhP,EAAKyO,EAAW1H,GACpC,QAAY,IAARnF,IAA2B,IAATA,EAAY,OAAO5B,EAAI4B,GCH/C,SAAwBoO,UAAUhQ,EAAK4D,GACrC,OAAOmM,KAAK/P,EAAK2G,QAAQ/C,ICE3B,SAAwBqM,KAAKjQ,EAAKmH,EAAUJ,GAE1C,IAAI7D,EAAG5D,EACP,GAFA6H,EAAWL,WAAWK,EAAUJ,GAE5BjE,YAAY9C,GACd,IAAKkD,EAAI,EAAG5D,EAASU,EAAIV,OAAQ4D,EAAI5D,EAAQ4D,IAC3CiE,EAASnH,EAAIkD,GAAIA,EAAGlD,OAEjB,CACL,IAAI6D,EAAQzF,KAAK4B,GACjB,IAAKkD,EAAI,EAAG5D,EAASuE,EAAMvE,OAAQ4D,EAAI5D,EAAQ4D,IAC7CiE,EAASnH,EAAI6D,EAAMX,IAAKW,EAAMX,GAAIlD,GAGtC,OAAOA,EChBT,SAAwBqI,IAAIrI,EAAKmH,EAAUJ,GACzCI,EAAWE,GAAGF,EAAUJ,GAIxB,IAHA,IAAIlD,GAASf,YAAY9C,IAAQ5B,KAAK4B,GAClCV,GAAUuE,GAAS7D,GAAKV,OACxBiI,EAAUlK,MAAMiC,GACXI,EAAQ,EAAGA,EAAQJ,EAAQI,IAAS,CAC3C,IAAI8H,EAAa3D,EAAQA,EAAMnE,GAASA,EACxC6H,EAAQ7H,GAASyH,EAASnH,EAAIwH,GAAaA,EAAYxH,GAEzD,OAAOuH,ECTT,SAAwB2I,aAAahB,GAGnC,IAAIiB,EAAU,SAASnQ,EAAKmH,EAAU2H,EAAMsB,GAC1C,IAAIvM,GAASf,YAAY9C,IAAQ5B,KAAK4B,GAClCV,GAAUuE,GAAS7D,GAAKV,OACxBI,EAAQwP,EAAM,EAAI,EAAI5P,EAAS,EAKnC,IAJK8Q,IACHtB,EAAO9O,EAAI6D,EAAQA,EAAMnE,GAASA,GAClCA,GAASwP,GAEJxP,GAAS,GAAKA,EAAQJ,EAAQI,GAASwP,EAAK,CACjD,IAAI1H,EAAa3D,EAAQA,EAAMnE,GAASA,EACxCoP,EAAO3H,EAAS2H,EAAM9O,EAAIwH,GAAaA,EAAYxH,GAErD,OAAO8O,GAGT,OAAO,SAAS9O,EAAKmH,EAAU2H,EAAM/H,GACnC,IAAIqJ,EAAU5Q,UAAUF,QAAU,EAClC,OAAO6Q,EAAQnQ,EAAK8G,WAAWK,EAAUJ,EAAS,GAAI+H,EAAMsB,ICrBhE,IAAAC,OAAeH,aAAa,GCD5BI,YAAeJ,cAAc,GCC7B,SAAwBK,OAAOvQ,EAAKyO,EAAW1H,GAC7C,IAAIQ,EAAU,GAKd,OAJAkH,EAAYpH,GAAGoH,EAAW1H,GAC1BkJ,KAAKjQ,GAAK,SAASiC,EAAOvC,EAAO8Q,GAC3B/B,EAAUxM,EAAOvC,EAAO8Q,IAAOjJ,EAAQ5J,KAAKsE,MAE3CsF,ECLT,SAAwBkJ,OAAOzQ,EAAKyO,EAAW1H,GAC7C,OAAOwJ,OAAOvQ,EAAKwO,OAAOnH,GAAGoH,IAAa1H,GCD5C,SAAwB2J,MAAM1Q,EAAKyO,EAAW1H,GAC5C0H,EAAYpH,GAAGoH,EAAW1H,GAG1B,IAFA,IAAIlD,GAASf,YAAY9C,IAAQ5B,KAAK4B,GAClCV,GAAUuE,GAAS7D,GAAKV,OACnBI,EAAQ,EAAGA,EAAQJ,EAAQI,IAAS,CAC3C,IAAI8H,EAAa3D,EAAQA,EAAMnE,GAASA,EACxC,IAAK+O,EAAUzO,EAAIwH,GAAaA,EAAYxH,GAAM,OAAO,EAE3D,OAAO,ECRT,SAAwB2Q,KAAK3Q,EAAKyO,EAAW1H,GAC3C0H,EAAYpH,GAAGoH,EAAW1H,GAG1B,IAFA,IAAIlD,GAASf,YAAY9C,IAAQ5B,KAAK4B,GAClCV,GAAUuE,GAAS7D,GAAKV,OACnBI,EAAQ,EAAGA,EAAQJ,EAAQI,IAAS,CAC3C,IAAI8H,EAAa3D,EAAQA,EAAMnE,GAASA,EACxC,GAAI+O,EAAUzO,EAAIwH,GAAaA,EAAYxH,GAAM,OAAO,EAE1D,OAAO,ECRT,SAAwBmD,SAASnD,EAAK4P,EAAMgB,EAAWC,GAGrD,OAFK/N,YAAY9C,KAAMA,EAAMkF,OAAOlF,KACZ,iBAAb4Q,GAAyBC,KAAOD,EAAY,GAChDf,QAAQ7P,EAAK4P,EAAMgB,IAAc,ECD1C,IAAAE,OAAe3R,eAAc,SAASa,EAAKwG,EAAM3G,GAC/C,IAAIkR,EAAa3R,EAOjB,OANIiC,aAAWmF,GACbpH,EAAOoH,EACEtI,QAAQsI,KACjBuK,EAAcvK,EAAK5I,MAAM,GAAI,GAC7B4I,EAAOA,EAAKA,EAAKlH,OAAS,IAErB+I,IAAIrI,GAAK,SAAS+G,GACvB,IAAIiK,EAAS5R,EACb,IAAK4R,EAAQ,CAIX,GAHID,GAAeA,EAAYzR,SAC7ByH,EAAUH,QAAQG,EAASgK,IAEd,MAAXhK,EAAiB,OACrBiK,EAASjK,EAAQP,GAEnB,OAAiB,MAAVwK,EAAiBA,EAASA,EAAOlR,MAAMiH,EAASlH,SCpB3D,SAAwBoR,MAAMjR,EAAK4B,GACjC,OAAOyG,IAAIrI,EAAK6G,SAASjF,ICA3B,SAAwBsP,MAAMlR,EAAK4D,GACjC,OAAO2M,OAAOvQ,EAAK2G,QAAQ/C,ICA7B,SAAwBrE,IAAIS,EAAKmH,EAAUJ,GACzC,IACI9E,EAAOkP,EADP9L,GAAU+B,EAAAA,EAAUgK,GAAgBhK,EAAAA,EAExC,GAAgB,MAAZD,GAAuC,iBAAZA,GAAyC,iBAAVnH,EAAI,IAAyB,MAAPA,EAElF,IAAK,IAAIkD,EAAI,EAAG5D,GADhBU,EAAM8C,YAAY9C,GAAOA,EAAMkF,OAAOlF,IACTV,OAAQ4D,EAAI5D,EAAQ4D,IAElC,OADbjB,EAAQjC,EAAIkD,KACSjB,EAAQoD,IAC3BA,EAASpD,QAIbkF,EAAWE,GAAGF,EAAUJ,GACxBkJ,KAAKjQ,GAAK,SAASqR,EAAG3R,EAAO8Q,KAC3BW,EAAWhK,EAASkK,EAAG3R,EAAO8Q,IACfY,GAAgBD,KAAc/J,EAAAA,GAAY/B,KAAY+B,EAAAA,KACnE/B,EAASgM,EACTD,EAAeD,MAIrB,OAAO9L,ECrBT,SAAwB0C,IAAI/H,EAAKmH,EAAUJ,GACzC,IACI9E,EAAOkP,EADP9L,EAAS+B,EAAAA,EAAUgK,EAAehK,EAAAA,EAEtC,GAAgB,MAAZD,GAAuC,iBAAZA,GAAyC,iBAAVnH,EAAI,IAAyB,MAAPA,EAElF,IAAK,IAAIkD,EAAI,EAAG5D,GADhBU,EAAM8C,YAAY9C,GAAOA,EAAMkF,OAAOlF,IACTV,OAAQ4D,EAAI5D,EAAQ4D,IAElC,OADbjB,EAAQjC,EAAIkD,KACSjB,EAAQoD,IAC3BA,EAASpD,QAIbkF,EAAWE,GAAGF,EAAUJ,GACxBkJ,KAAKjQ,GAAK,SAASqR,EAAG3R,EAAO8Q,KAC3BW,EAAWhK,EAASkK,EAAG3R,EAAO8Q,IACfY,GAAgBD,IAAa/J,EAAAA,GAAY/B,IAAW+B,EAAAA,KACjE/B,EAASgM,EACTD,EAAeD,MAIrB,OAAO9L,ECjBT,SAAwBiM,OAAOtR,EAAK4H,EAAGiJ,GACrC,GAAS,MAALjJ,GAAaiJ,EAEf,OADK/N,YAAY9C,KAAMA,EAAMkF,OAAOlF,IAC7BA,EAAI8H,OAAO9H,EAAIV,OAAS,IAEjC,IAAIgS,EAASxO,YAAY9C,GAAOqG,MAAMrG,GAAOkF,OAAOlF,GAChDV,EAASuD,UAAUyO,GACvB1J,EAAI3I,KAAKM,IAAIN,KAAK8I,IAAIH,EAAGtI,GAAS,GAElC,IADA,IAAIiS,EAAOjS,EAAS,EACXI,EAAQ,EAAGA,EAAQkI,EAAGlI,IAAS,CACtC,IAAI8R,EAAO1J,OAAOpI,EAAO6R,GACrBE,EAAOH,EAAO5R,GAClB4R,EAAO5R,GAAS4R,EAAOE,GACvBF,EAAOE,GAAQC,EAEjB,OAAOH,EAAO1T,MAAM,EAAGgK,GCtBzB,SAAwB8J,QAAQ1R,GAC9B,OAAOsR,OAAOtR,EAAKoH,EAAAA,GCCrB,SAAwBuK,OAAO3R,EAAKmH,EAAUJ,GAC5C,IAAIrH,EAAQ,EAEZ,OADAyH,EAAWE,GAAGF,EAAUJ,GACjBkK,MAAM5I,IAAIrI,GAAK,SAASiC,EAAOL,EAAK4O,GACzC,MAAO,CACLvO,MAAOA,EACPvC,MAAOA,IACPkS,SAAUzK,EAASlF,EAAOL,EAAK4O,OAEhChL,MAAK,SAASqM,EAAMC,GACrB,IAAI7N,EAAI4N,EAAKD,SACT1N,EAAI4N,EAAMF,SACd,GAAI3N,IAAMC,EAAG,CACX,GAAID,EAAIC,QAAW,IAAND,EAAc,OAAO,EAClC,GAAIA,EAAIC,QAAW,IAANA,EAAc,OAAQ,EAErC,OAAO2N,EAAKnS,MAAQoS,EAAMpS,SACxB,SClBN,SAAwBqS,MAAMC,EAAUC,GACtC,OAAO,SAASjS,EAAKmH,EAAUJ,GAC7B,IAAI1B,EAAS4M,EAAY,CAAC,GAAI,IAAM,GAMpC,OALA9K,EAAWE,GAAGF,EAAUJ,GACxBkJ,KAAKjQ,GAAK,SAASiC,EAAOvC,GACxB,IAAIkC,EAAMuF,EAASlF,EAAOvC,EAAOM,GACjCgS,EAAS3M,EAAQpD,EAAOL,MAEnByD,GCPX,IAAA6M,QAAeH,OAAM,SAAS1M,EAAQpD,EAAOL,GACvCD,IAAI0D,EAAQzD,GAAMyD,EAAOzD,GAAKjE,KAAKsE,GAAaoD,EAAOzD,GAAO,CAACK,MCFrEkQ,QAAeJ,OAAM,SAAS1M,EAAQpD,EAAOL,GAC3CyD,EAAOzD,GAAOK,KCChBmQ,QAAeL,OAAM,SAAS1M,EAAQpD,EAAOL,GACvCD,IAAI0D,EAAQzD,GAAMyD,EAAOzD,KAAayD,EAAOzD,GAAO,KCH1DqQ,UAAeF,OAAM,SAAS1M,EAAQpD,EAAOoQ,GAC3ChN,EAAOgN,EAAO,EAAI,GAAG1U,KAAKsE,MACzB,GCGCqQ,YAAc,mEAClB,SAAwBC,QAAQvS,GAC9B,OAAKA,EACD9B,QAAQ8B,GAAapC,MAAM+B,KAAKK,GAChCS,SAAST,GAEJA,EAAIuI,MAAM+J,aAEfxP,YAAY9C,GAAaqI,IAAIrI,EAAK0G,UAC/BxB,OAAOlF,GAPG,GCPnB,SAAwBwS,KAAKxS,GAC3B,OAAW,MAAPA,EAAoB,EACjB8C,YAAY9C,GAAOA,EAAIV,OAASlB,KAAK4B,GAAKV,OCJnD,SAAwBmT,SAASxQ,EAAOL,EAAK5B,GAC3C,OAAO4B,KAAO5B,ECKhB,IAAA0S,KAAevT,eAAc,SAASa,EAAK5B,GACzC,IAAIiH,EAAS,GAAI8B,EAAW/I,EAAK,GACjC,GAAW,MAAP4B,EAAa,OAAOqF,EACpBhE,aAAW8F,IACT/I,EAAKkB,OAAS,IAAG6H,EAAWL,WAAWK,EAAU/I,EAAK,KAC1DA,EAAO6G,QAAQjF,KAEfmH,EAAWsL,SACXrU,EAAOgO,QAAQhO,GAAM,GAAO,GAC5B4B,EAAMxC,OAAOwC,IAEf,IAAK,IAAIkD,EAAI,EAAG5D,EAASlB,EAAKkB,OAAQ4D,EAAI5D,EAAQ4D,IAAK,CACrD,IAAItB,EAAMxD,EAAK8E,GACXjB,EAAQjC,EAAI4B,GACZuF,EAASlF,EAAOL,EAAK5B,KAAMqF,EAAOzD,GAAOK,GAE/C,OAAOoD,KCfTsN,KAAexT,eAAc,SAASa,EAAK5B,GACzC,IAAwB2I,EAApBI,EAAW/I,EAAK,GAUpB,OATIiD,aAAW8F,IACbA,EAAWqH,OAAOrH,GACd/I,EAAKkB,OAAS,IAAGyH,EAAU3I,EAAK,MAEpCA,EAAOiK,IAAI+D,QAAQhO,GAAM,GAAO,GAAQ0H,QACxCqB,EAAW,SAASlF,EAAOL,GACzB,OAAQuB,SAAS/E,EAAMwD,KAGpB8Q,KAAK1S,EAAKmH,EAAUJ,MCf7B,SAAwBqJ,QAAQjB,EAAOvH,EAAGiJ,GACxC,OAAOjT,MAAM+B,KAAKwP,EAAO,EAAGlQ,KAAKM,IAAI,EAAG4P,EAAM7P,QAAe,MAALsI,GAAaiJ,EAAQ,EAAIjJ,KCFnF,SAAwBgL,MAAMzD,EAAOvH,EAAGiJ,GACtC,OAAa,MAAT1B,GAAiBA,EAAM7P,OAAS,EAAe,MAALsI,GAAaiJ,OAAQ,EAAS,GACnE,MAALjJ,GAAaiJ,EAAc1B,EAAM,GAC9BiB,QAAQjB,EAAOA,EAAM7P,OAASsI,GCFvC,SAAwBnI,KAAK0P,EAAOvH,EAAGiJ,GACrC,OAAOjT,MAAM+B,KAAKwP,EAAY,MAALvH,GAAaiJ,EAAQ,EAAIjJ,GCFpD,SAAwB2J,KAAKpC,EAAOvH,EAAGiJ,GACrC,OAAa,MAAT1B,GAAiBA,EAAM7P,OAAS,EAAe,MAALsI,GAAaiJ,OAAQ,EAAS,GACnE,MAALjJ,GAAaiJ,EAAc1B,EAAMA,EAAM7P,OAAS,GAC7CG,KAAK0P,EAAOlQ,KAAKM,IAAI,EAAG4P,EAAM7P,OAASsI,ICJhD,SAAwBiL,QAAQ1D,GAC9B,OAAOoB,OAAOpB,EAAO2D,SCAvB,SAAwB1G,UAAQ+C,EAAO7C,GACrC,OAAOyG,QAAS5D,EAAO7C,GAAO,GCEhC,IAAA0G,WAAe7T,eAAc,SAASgQ,EAAO1P,GAE3C,OADAA,EAAO2M,QAAQ3M,GAAM,GAAM,GACpB8Q,OAAOpB,GAAO,SAASlN,GAC5B,OAAQkB,SAAS1D,EAAMwC,SCN3BgR,QAAe9T,eAAc,SAASgQ,EAAO+D,GAC3C,OAAOF,WAAW7D,EAAO+D,MCK3B,SAAwBC,KAAKhE,EAAOiE,EAAUjM,EAAUJ,GACjD3G,UAAUgT,KACbrM,EAAUI,EACVA,EAAWiM,EACXA,GAAW,GAEG,MAAZjM,IAAkBA,EAAWE,GAAGF,EAAUJ,IAG9C,IAFA,IAAI1B,EAAS,GACTgO,EAAO,GACFnQ,EAAI,EAAG5D,EAASuD,UAAUsM,GAAQjM,EAAI5D,EAAQ4D,IAAK,CAC1D,IAAIjB,EAAQkN,EAAMjM,GACdiO,EAAWhK,EAAWA,EAASlF,EAAOiB,EAAGiM,GAASlN,EAClDmR,IAAajM,GACVjE,GAAKmQ,IAASlC,GAAU9L,EAAO1H,KAAKsE,GACzCoR,EAAOlC,GACEhK,EACJhE,SAASkQ,EAAMlC,KAClBkC,EAAK1V,KAAKwT,GACV9L,EAAO1H,KAAKsE,IAEJkB,SAASkC,EAAQpD,IAC3BoD,EAAO1H,KAAKsE,GAGhB,OAAOoD,EC5BT,IAAAiO,MAAenU,eAAc,SAASoU,GACpC,OAAOJ,KAAK/G,QAAQmH,GAAQ,GAAM,OCFpC,SAAwBC,aAAarE,GAGnC,IAFA,IAAI9J,EAAS,GACToO,EAAajU,UAAUF,OAClB4D,EAAI,EAAG5D,EAASuD,UAAUsM,GAAQjM,EAAI5D,EAAQ4D,IAAK,CAC1D,IAAI0M,EAAOT,EAAMjM,GACjB,IAAIC,SAASkC,EAAQuK,GAArB,CACA,IAAIlD,EACJ,IAAKA,EAAI,EAAGA,EAAI+G,GACTtQ,SAAS3D,UAAUkN,GAAIkD,GADFlD,KAGxBA,IAAM+G,GAAYpO,EAAO1H,KAAKiS,IAEpC,OAAOvK,ECXT,SAAwBqO,MAAMvE,GAI5B,IAHA,IAAI7P,EAAS6P,GAAS5P,IAAI4P,EAAOtM,WAAWvD,QAAU,EAClD+F,EAAShI,MAAMiC,GAEVI,EAAQ,EAAGA,EAAQJ,EAAQI,IAClC2F,EAAO3F,GAASuR,MAAM9B,EAAOzP,GAE/B,OAAO2F,ECRT,IAAAsO,IAAexU,cAAcuU,OCA7B,SAAwB/P,OAAO6M,EAAMtL,GAEnC,IADA,IAAIG,EAAS,GACJnC,EAAI,EAAG5D,EAASuD,UAAU2N,GAAOtN,EAAI5D,EAAQ4D,IAChDgC,EACFG,EAAOmL,EAAKtN,IAAMgC,EAAOhC,GAEzBmC,EAAOmL,EAAKtN,GAAG,IAAMsN,EAAKtN,GAAG,GAGjC,OAAOmC,ECXT,SAAwBuO,MAAMjF,EAAOkF,EAAMC,GAC7B,MAARD,IACFA,EAAOlF,GAAS,EAChBA,EAAQ,GAELmF,IACHA,EAAOD,EAAOlF,GAAS,EAAI,GAM7B,IAHA,IAAIrP,EAASL,KAAKM,IAAIN,KAAK8U,MAAMF,EAAOlF,GAASmF,GAAO,GACpDF,EAAQvW,MAAMiC,GAETmN,EAAM,EAAGA,EAAMnN,EAAQmN,IAAOkC,GAASmF,EAC9CF,EAAMnH,GAAOkC,EAGf,OAAOiF,ECfT,SAAwBI,MAAM7E,EAAO8E,GACnC,GAAa,MAATA,GAAiBA,EAAQ,EAAG,MAAO,GAGvC,IAFA,IAAI5O,EAAS,GACTnC,EAAI,EAAG5D,EAAS6P,EAAM7P,OACnB4D,EAAI5D,GACT+F,EAAO1H,KAAKC,MAAM+B,KAAKwP,EAAOjM,EAAGA,GAAK+Q,IAExC,OAAO5O,ECRT,SAAwB6O,YAAY7I,EAAUrL,GAC5C,OAAOqL,EAASC,OAASxH,EAAE9D,GAAKoL,QAAUpL,ECG5C,SAAwBmU,MAAMnU,GAS5B,OARAiQ,KAAK3K,UAAUtF,IAAM,SAASQ,GAC5B,IAAIpB,EAAO0E,EAAEtD,GAAQR,EAAIQ,GACzBsD,EAAExG,UAAUkD,GAAQ,WAClB,IAAIX,EAAO,CAACD,KAAKmE,UAEjB,OADApG,KAAKmC,MAAMD,EAAML,WACV0U,YAAYtU,KAAMR,EAAKU,MAAMgE,EAAGjE,QAGpCiE,ECVTmM,KAAK,CAAC,MAAO,OAAQ,UAAW,QAAS,OAAQ,SAAU,YAAY,SAASzP,GAC9E,IAAIwQ,EAAS5T,WAAWoD,GACxBsD,EAAExG,UAAUkD,GAAQ,WAClB,IAAIR,EAAMJ,KAAKmE,SAOf,OANW,MAAP/D,IACFgR,EAAOlR,MAAME,EAAKR,WACJ,UAATgB,GAA6B,WAATA,GAAqC,IAAfR,EAAIV,eAC1CU,EAAI,IAGRkU,YAAYtU,KAAMI,OAK7BiQ,KAAK,CAAC,SAAU,OAAQ,UAAU,SAASzP,GACzC,IAAIwQ,EAAS5T,WAAWoD,GACxBsD,EAAExG,UAAUkD,GAAQ,WAClB,IAAIR,EAAMJ,KAAKmE,SAEf,OADW,MAAP/D,IAAaA,EAAMgR,EAAOlR,MAAME,EAAKR,YAClC0U,YAAYtU,KAAMI,wtECJzB8D,IAAIqQ,MAAMC,YAEdtQ,IAAEA,EAAIA"}//     Underscore.js 1.11.0
//     https://underscorejs.org
//     (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
//     Underscore may be freely distributed under the MIT license.

// Current version.
var VERSION = '1.11.0';

// Establish the root object, `window` (`self`) in the browser, `global`
// on the server, or `this` in some virtual machines. We use `self`
// instead of `window` for `WebWorker` support.
var root = typeof self == 'object' && self.self === self && self ||
          typeof global == 'object' && global.global === global && global ||
          Function('return this')() ||
          {};

// Save bytes in the minified (but not gzipped) version:
var ArrayProto = Array.prototype, ObjProto = Object.prototype;
var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;

// Create quick reference variables for speed access to core prototypes.
var push = ArrayProto.push,
    slice = ArrayProto.slice,
    toString = ObjProto.toString,
    hasOwnProperty = ObjProto.hasOwnProperty;

// Modern feature detection.
var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined';

// All **ECMAScript 5+** native function implementations that we hope to use
// are declared here.
var nativeIsArray = Array.isArray,
    nativeKeys = Object.keys,
    nativeCreate = Object.create,
    nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;

// Create references to these builtin functions because we override them.
var _isNaN = isNaN,
    _isFinite = isFinite;

// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
  'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

// The largest integer that can be represented exactly.
var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;

// Some functions take a variable number of arguments, or a few expected
// arguments at the beginning and then a variable number of values to operate
// on. This helper accumulates all remaining arguments past the functionâ€™s
// argument length (or an explicit `startIndex`), into an array that becomes
// the last argument. Similar to ES6â€™s "rest parameter".
function restArguments(func, startIndex) {
  startIndex = startIndex == null ? func.length - 1 : +startIndex;
  return function() {
    var length = Math.max(arguments.length - startIndex, 0),
        rest = Array(length),
        index = 0;
    for (; index < length; index++) {
      rest[index] = arguments[index + startIndex];
    }
    switch (startIndex) {
      case 0: return func.call(this, rest);
      case 1: return func.call(this, arguments[0], rest);
      case 2: return func.call(this, arguments[0], arguments[1], rest);
    }
    var args = Array(startIndex + 1);
    for (index = 0; index < startIndex; index++) {
      args[index] = arguments[index];
    }
    args[startIndex] = rest;
    return func.apply(this, args);
  };
}

// Is a given variable an object?
function isObject(obj) {
  var type = typeof obj;
  return type === 'function' || type === 'object' && !!obj;
}

// Is a given value equal to null?
function isNull(obj) {
  return obj === null;
}

// Is a given variable undefined?
function isUndefined(obj) {
  return obj === void 0;
}

// Is a given value a boolean?
function isBoolean(obj) {
  return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
}

// Is a given value a DOM element?
function isElement(obj) {
  return !!(obj && obj.nodeType === 1);
}

// Internal function for creating a `toString`-based type tester.
function tagTester(name) {
  return function(obj) {
    return toString.call(obj) === '[object ' + name + ']';
  };
}

var isString = tagTester('String');

var isNumber = tagTester('Number');

var isDate = tagTester('Date');

var isRegExp = tagTester('RegExp');

var isError = tagTester('Error');

var isSymbol = tagTester('Symbol');

var isMap = tagTester('Map');

var isWeakMap = tagTester('WeakMap');

var isSet = tagTester('Set');

var isWeakSet = tagTester('WeakSet');

var isArrayBuffer = tagTester('ArrayBuffer');

var isDataView = tagTester('DataView');

// Is a given value an array?
// Delegates to ECMA5's native `Array.isArray`.
var isArray = nativeIsArray || tagTester('Array');

var isFunction = tagTester('Function');

// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
var nodelist = root.document && root.document.childNodes;
if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
  isFunction = function(obj) {
    return typeof obj == 'function' || false;
  };
}

var isFunction$1 = isFunction;

// Internal function to check whether `key` is an own property name of `obj`.
function has(obj, key) {
  return obj != null && hasOwnProperty.call(obj, key);
}

var isArguments = tagTester('Arguments');

// Define a fallback version of the method in browsers (ahem, IE < 9), where
// there isn't any inspectable "Arguments" type.
(function() {
  if (!isArguments(arguments)) {
    isArguments = function(obj) {
      return has(obj, 'callee');
    };
  }
}());

var isArguments$1 = isArguments;

// Is a given object a finite number?
function isFinite$1(obj) {
  return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
}

// Is the given value `NaN`?
function isNaN$1(obj) {
  return isNumber(obj) && _isNaN(obj);
}

// Predicate-generating function. Often useful outside of Underscore.
function constant(value) {
  return function() {
    return value;
  };
}

// Common internal logic for `isArrayLike` and `isBufferLike`.
function createSizePropertyCheck(getSizeProperty) {
  return function(collection) {
    var sizeProperty = getSizeProperty(collection);
    return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
  }
}

// Internal helper to generate a function to obtain property `key` from `obj`.
function shallowProperty(key) {
  return function(obj) {
    return obj == null ? void 0 : obj[key];
  };
}

// Internal helper to obtain the `byteLength` property of an object.
var getByteLength = shallowProperty('byteLength');

// Internal helper to determine whether we should spend extensive checks against
// `ArrayBuffer` et al.
var isBufferLike = createSizePropertyCheck(getByteLength);

// Is a given value a typed array?
var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
function isTypedArray(obj) {
  // `ArrayBuffer.isView` is the most future-proof, so use it when available.
  // Otherwise, fall back on the above regular expression.
  return nativeIsView ? (nativeIsView(obj) && !isDataView(obj)) :
                isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
}

var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);

// Internal helper to obtain the `length` property of an object.
var getLength = shallowProperty('length');

// Internal helper for collection methods to determine whether a collection
// should be iterated as an array or as an object.
// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
var isArrayLike = createSizePropertyCheck(getLength);

// Internal helper to create a simple lookup structure.
// `collectNonEnumProps` used to depend on `_.contains`, but this led to
// circular imports. `emulatedSet` is a one-off solution that only works for
// arrays of strings.
function emulatedSet(keys) {
  var hash = {};
  for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
  return {
    contains: function(key) { return hash[key]; },
    push: function(key) {
      hash[key] = true;
      return keys.push(key);
    }
  };
}

// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
// be iterated by `for key in ...` and thus missed. Extends `keys` in place if
// needed.
function collectNonEnumProps(obj, keys) {
  keys = emulatedSet(keys);
  var nonEnumIdx = nonEnumerableProps.length;
  var constructor = obj.constructor;
  var proto = isFunction$1(constructor) && constructor.prototype || ObjProto;

  // Constructor is a special case.
  var prop = 'constructor';
  if (has(obj, prop) && !keys.contains(prop)) keys.push(prop);

  while (nonEnumIdx--) {
    prop = nonEnumerableProps[nonEnumIdx];
    if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
      keys.push(prop);
    }
  }
}

// Retrieve the names of an object's own properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`.
function keys(obj) {
  if (!isObject(obj)) return [];
  if (nativeKeys) return nativeKeys(obj);
  var keys = [];
  for (var key in obj) if (has(obj, key)) keys.push(key);
  // Ahem, IE < 9.
  if (hasEnumBug) collectNonEnumProps(obj, keys);
  return keys;
}

// Is a given array, string, or object empty?
// An "empty" object has no enumerable own-properties.
function isEmpty(obj) {
  if (obj == null) return true;
  // Skip the more expensive `toString`-based type checks if `obj` has no
  // `.length`.
  if (isArrayLike(obj) && (isArray(obj) || isString(obj) || isArguments$1(obj))) return obj.length === 0;
  return keys(obj).length === 0;
}

// Returns whether an object has a given set of `key:value` pairs.
function isMatch(object, attrs) {
  var _keys = keys(attrs), length = _keys.length;
  if (object == null) return !length;
  var obj = Object(object);
  for (var i = 0; i < length; i++) {
    var key = _keys[i];
    if (attrs[key] !== obj[key] || !(key in obj)) return false;
  }
  return true;
}

// If Underscore is called as a function, it returns a wrapped object that can
// be used OO-style. This wrapper holds altered versions of all functions added
// through `_.mixin`. Wrapped objects may be chained.
function _(obj) {
  if (obj instanceof _) return obj;
  if (!(this instanceof _)) return new _(obj);
  this._wrapped = obj;
}

_.VERSION = VERSION;

// Extracts the result from a wrapped and chained object.
_.prototype.value = function() {
  return this._wrapped;
};

// Provide unwrapping proxies for some methods used in engine operations
// such as arithmetic and JSON stringification.
_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;

_.prototype.toString = function() {
  return String(this._wrapped);
};

// Internal recursive comparison function for `_.isEqual`.
function eq(a, b, aStack, bStack) {
  // Identical objects are equal. `0 === -0`, but they aren't identical.
  // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
  if (a === b) return a !== 0 || 1 / a === 1 / b;
  // `null` or `undefined` only equal to itself (strict comparison).
  if (a == null || b == null) return false;
  // `NaN`s are equivalent, but non-reflexive.
  if (a !== a) return b !== b;
  // Exhaust primitive checks
  var type = typeof a;
  if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
  return deepEq(a, b, aStack, bStack);
}

// Internal recursive comparison function for `_.isEqual`.
function deepEq(a, b, aStack, bStack) {
  // Unwrap any wrapped objects.
  if (a instanceof _) a = a._wrapped;
  if (b instanceof _) b = b._wrapped;
  // Compare `[[Class]]` names.
  var className = toString.call(a);
  if (className !== toString.call(b)) return false;
  switch (className) {
    // These types are compared by value.
    case '[object RegExp]':
      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
    case '[object String]':
      // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
      // equivalent to `new String("5")`.
      return '' + a === '' + b;
    case '[object Number]':
      // `NaN`s are equivalent, but non-reflexive.
      // Object(NaN) is equivalent to NaN.
      if (+a !== +a) return +b !== +b;
      // An `egal` comparison is performed for other numeric values.
      return +a === 0 ? 1 / +a === 1 / b : +a === +b;
    case '[object Date]':
    case '[object Boolean]':
      // Coerce dates and booleans to numeric primitive values. Dates are compared by their
      // millisecond representations. Note that invalid dates with millisecond representations
      // of `NaN` are not equivalent.
      return +a === +b;
    case '[object Symbol]':
      return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
    case '[object ArrayBuffer]':
      // Coerce to `DataView` so we can fall through to the next case.
      return deepEq(new DataView(a), new DataView(b), aStack, bStack);
    case '[object DataView]':
      var byteLength = getByteLength(a);
      if (byteLength !== getByteLength(b)) {
        return false;
      }
      while (byteLength--) {
        if (a.getUint8(byteLength) !== b.getUint8(byteLength)) {
          return false;
        }
      }
      return true;
  }

  if (isTypedArray$1(a)) {
    // Coerce typed arrays to `DataView`.
    return deepEq(new DataView(a.buffer), new DataView(b.buffer), aStack, bStack);
  }

  var areArrays = className === '[object Array]';
  if (!areArrays) {
    if (typeof a != 'object' || typeof b != 'object') return false;

    // Objects with different constructors are not equivalent, but `Object`s or `Array`s
    // from different frames are.
    var aCtor = a.constructor, bCtor = b.constructor;
    if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
                             isFunction$1(bCtor) && bCtor instanceof bCtor)
                        && ('constructor' in a && 'constructor' in b)) {
      return false;
    }
  }
  // Assume equality for cyclic structures. The algorithm for detecting cyclic
  // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.

  // Initializing stack of traversed objects.
  // It's done here since we only need them for objects and arrays comparison.
  aStack = aStack || [];
  bStack = bStack || [];
  var length = aStack.length;
  while (length--) {
    // Linear search. Performance is inversely proportional to the number of
    // unique nested structures.
    if (aStack[length] === a) return bStack[length] === b;
  }

  // Add the first object to the stack of traversed objects.
  aStack.push(a);
  bStack.push(b);

  // Recursively compare objects and arrays.
  if (areArrays) {
    // Compare array lengths to determine if a deep comparison is necessary.
    length = a.length;
    if (length !== b.length) return false;
    // Deep compare the contents, ignoring non-numeric properties.
    while (length--) {
      if (!eq(a[length], b[length], aStack, bStack)) return false;
    }
  } else {
    // Deep compare objects.
    var _keys = keys(a), key;
    length = _keys.length;
    // Ensure that both objects contain the same number of properties before comparing deep equality.
    if (keys(b).length !== length) return false;
    while (length--) {
      // Deep compare each member
      key = _keys[length];
      if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
    }
  }
  // Remove the first object from the stack of traversed objects.
  aStack.pop();
  bStack.pop();
  return true;
}

// Perform a deep comparison to check if two objects are equal.
function isEqual(a, b) {
  return eq(a, b);
}

// Retrieve all the enumerable property names of an object.
function allKeys(obj) {
  if (!isObject(obj)) return [];
  var keys = [];
  for (var key in obj) keys.push(key);
  // Ahem, IE < 9.
  if (hasEnumBug) collectNonEnumProps(obj, keys);
  return keys;
}

// Retrieve the values of an object's properties.
function values(obj) {
  var _keys = keys(obj);
  var length = _keys.length;
  var values = Array(length);
  for (var i = 0; i < length; i++) {
    values[i] = obj[_keys[i]];
  }
  return values;
}

// Convert an object into a list of `[key, value]` pairs.
// The opposite of `_.object` with one argument.
function pairs(obj) {
  var _keys = keys(obj);
  var length = _keys.length;
  var pairs = Array(length);
  for (var i = 0; i < length; i++) {
    pairs[i] = [_keys[i], obj[_keys[i]]];
  }
  return pairs;
}

// Invert the keys and values of an object. The values must be serializable.
function invert(obj) {
  var result = {};
  var _keys = keys(obj);
  for (var i = 0, length = _keys.length; i < length; i++) {
    result[obj[_keys[i]]] = _keys[i];
  }
  return result;
}

// Return a sorted list of the function names available on the object.
function functions(obj) {
  var names = [];
  for (var key in obj) {
    if (isFunction$1(obj[key])) names.push(key);
  }
  return names.sort();
}

// An internal function for creating assigner functions.
function createAssigner(keysFunc, defaults) {
  return function(obj) {
    var length = arguments.length;
    if (defaults) obj = Object(obj);
    if (length < 2 || obj == null) return obj;
    for (var index = 1; index < length; index++) {
      var source = arguments[index],
          keys = keysFunc(source),
          l = keys.length;
      for (var i = 0; i < l; i++) {
        var key = keys[i];
        if (!defaults || obj[key] === void 0) obj[key] = source[key];
      }
    }
    return obj;
  };
}

// Extend a given object with all the properties in passed-in object(s).
var extend = createAssigner(allKeys);

// Assigns a given object with all the own properties in the passed-in
// object(s).
// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
var extendOwn = createAssigner(keys);

// Fill in a given object with default properties.
var defaults = createAssigner(allKeys, true);

// Create a naked function reference for surrogate-prototype-swapping.
function ctor() {
  return function(){};
}

// An internal function for creating a new object that inherits from another.
function baseCreate(prototype) {
  if (!isObject(prototype)) return {};
  if (nativeCreate) return nativeCreate(prototype);
  var Ctor = ctor();
  Ctor.prototype = prototype;
  var result = new Ctor;
  Ctor.prototype = null;
  return result;
}

// Creates an object that inherits from the given prototype object.
// If additional properties are provided then they will be added to the
// created object.
function create(prototype, props) {
  var result = baseCreate(prototype);
  if (props) extendOwn(result, props);
  return result;
}

// Create a (shallow-cloned) duplicate of an object.
function clone(obj) {
  if (!isObject(obj)) return obj;
  return isArray(obj) ? obj.slice() : extend({}, obj);
}

// Invokes `interceptor` with the `obj` and then returns `obj`.
// The primary purpose of this method is to "tap into" a method chain, in
// order to perform operations on intermediate results within the chain.
function tap(obj, interceptor) {
  interceptor(obj);
  return obj;
}

// Shortcut function for checking if an object has a given property directly on
// itself (in other words, not on a prototype). Unlike the internal `has`
// function, this public version can also traverse nested properties.
function has$1(obj, path) {
  if (!isArray(path)) {
    return has(obj, path);
  }
  var length = path.length;
  for (var i = 0; i < length; i++) {
    var key = path[i];
    if (obj == null || !hasOwnProperty.call(obj, key)) {
      return false;
    }
    obj = obj[key];
  }
  return !!length;
}

// Keep the identity function around for default iteratees.
function identity(value) {
  return value;
}

// Returns a predicate for checking whether an object has a given set of
// `key:value` pairs.
function matcher(attrs) {
  attrs = extendOwn({}, attrs);
  return function(obj) {
    return isMatch(obj, attrs);
  };
}

// Internal function to obtain a nested property in `obj` along `path`.
function deepGet(obj, path) {
  var length = path.length;
  for (var i = 0; i < length; i++) {
    if (obj == null) return void 0;
    obj = obj[path[i]];
  }
  return length ? obj : void 0;
}

// Creates a function that, when passed an object, will traverse that objectâ€™s
// properties down the given `path`, specified as an array of keys or indices.
function property(path) {
  if (!isArray(path)) {
    return shallowProperty(path);
  }
  return function(obj) {
    return deepGet(obj, path);
  };
}

// Internal function that returns an efficient (for current engines) version
// of the passed-in callback, to be repeatedly applied in other Underscore
// functions.
function optimizeCb(func, context, argCount) {
  if (context === void 0) return func;
  switch (argCount == null ? 3 : argCount) {
    case 1: return function(value) {
      return func.call(context, value);
    };
    // The 2-argument case is omitted because weâ€™re not using it.
    case 3: return function(value, index, collection) {
      return func.call(context, value, index, collection);
    };
    case 4: return function(accumulator, value, index, collection) {
      return func.call(context, accumulator, value, index, collection);
    };
  }
  return function() {
    return func.apply(context, arguments);
  };
}

// An internal function to generate callbacks that can be applied to each
// element in a collection, returning the desired result â€” either `_.identity`,
// an arbitrary callback, a property matcher, or a property accessor.
function baseIteratee(value, context, argCount) {
  if (value == null) return identity;
  if (isFunction$1(value)) return optimizeCb(value, context, argCount);
  if (isObject(value) && !isArray(value)) return matcher(value);
  return property(value);
}

// External wrapper for our callback generator. Users may customize
// `_.iteratee` if they want additional predicate/iteratee shorthand styles.
// This abstraction hides the internal-only `argCount` argument.
function iteratee(value, context) {
  return baseIteratee(value, context, Infinity);
}
_.iteratee = iteratee;

// The function we call internally to generate a callback. It invokes
// `_.iteratee` if overridden, otherwise `baseIteratee`.
function cb(value, context, argCount) {
  if (_.iteratee !== iteratee) return _.iteratee(value, context);
  return baseIteratee(value, context, argCount);
}

// Returns the results of applying the `iteratee` to each element of `obj`.
// In contrast to `_.map` it returns an object.
function mapObject(obj, iteratee, context) {
  iteratee = cb(iteratee, context);
  var _keys = keys(obj),
      length = _keys.length,
      results = {};
  for (var index = 0; index < length; index++) {
    var currentKey = _keys[index];
    results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
  }
  return results;
}

// Predicate-generating function. Often useful outside of Underscore.
function noop(){}

// Generates a function for a given object that returns a given property.
function propertyOf(obj) {
  if (obj == null) {
    return function(){};
  }
  return function(path) {
    return !isArray(path) ? obj[path] : deepGet(obj, path);
  };
}

// Run a function **n** times.
function times(n, iteratee, context) {
  var accum = Array(Math.max(0, n));
  iteratee = optimizeCb(iteratee, context, 1);
  for (var i = 0; i < n; i++) accum[i] = iteratee(i);
  return accum;
}

// Return a random integer between `min` and `max` (inclusive).
function random(min, max) {
  if (max == null) {
    max = min;
    min = 0;
  }
  return min + Math.floor(Math.random() * (max - min + 1));
}

// A (possibly faster) way to get the current timestamp as an integer.
var now = Date.now || function() {
  return new Date().getTime();
};

// Internal helper to generate functions for escaping and unescaping strings
// to/from HTML interpolation.
function createEscaper(map) {
  var escaper = function(match) {
    return map[match];
  };
  // Regexes for identifying a key that needs to be escaped.
  var source = '(?:' + keys(map).join('|') + ')';
  var testRegexp = RegExp(source);
  var replaceRegexp = RegExp(source, 'g');
  return function(string) {
    string = string == null ? '' : '' + string;
    return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
  };
}

// Internal list of HTML entities for escaping.
var escapeMap = {
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&quot;',
  "'": '&#x27;',
  '`': '&#x60;'
};

// Function for escaping strings to HTML interpolation.
var _escape = createEscaper(escapeMap);

// Internal list of HTML entities for unescaping.
var unescapeMap = invert(escapeMap);

// Function for unescaping strings from HTML interpolation.
var _unescape = createEscaper(unescapeMap);

// By default, Underscore uses ERB-style template delimiters. Change the
// following template settings to use alternative delimiters.
var templateSettings = _.templateSettings = {
  evaluate: /<%([\s\S]+?)%>/g,
  interpolate: /<%=([\s\S]+?)%>/g,
  escape: /<%-([\s\S]+?)%>/g
};

// When customizing `_.templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;

// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
  "'": "'",
  '\\': '\\',
  '\r': 'r',
  '\n': 'n',
  '\u2028': 'u2028',
  '\u2029': 'u2029'
};

var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;

function escapeChar(match) {
  return '\\' + escapes[match];
}

// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
// NB: `oldSettings` only exists for backwards compatibility.
function template(text, settings, oldSettings) {
  if (!settings && oldSettings) settings = oldSettings;
  settings = defaults({}, settings, _.templateSettings);

  // Combine delimiters into one regular expression via alternation.
  var matcher = RegExp([
    (settings.escape || noMatch).source,
    (settings.interpolate || noMatch).source,
    (settings.evaluate || noMatch).source
  ].join('|') + '|$', 'g');

  // Compile the template source, escaping string literals appropriately.
  var index = 0;
  var source = "__p+='";
  text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
    source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
    index = offset + match.length;

    if (escape) {
      source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
    } else if (interpolate) {
      source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
    } else if (evaluate) {
      source += "';\n" + evaluate + "\n__p+='";
    }

    // Adobe VMs need the match returned to produce the correct offset.
    return match;
  });
  source += "';\n";

  // If a variable is not specified, place data values in local scope.
  if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';

  source = "var __t,__p='',__j=Array.prototype.join," +
    "print=function(){__p+=__j.call(arguments,'');};\n" +
    source + 'return __p;\n';

  var render;
  try {
    render = new Function(settings.variable || 'obj', '_', source);
  } catch (e) {
    e.source = source;
    throw e;
  }

  var template = function(data) {
    return render.call(this, data, _);
  };

  // Provide the compiled source as a convenience for precompilation.
  var argument = settings.variable || 'obj';
  template.source = 'function(' + argument + '){\n' + source + '}';

  return template;
}

// Traverses the children of `obj` along `path`. If a child is a function, it
// is invoked with its parent as context. Returns the value of the final
// child, or `fallback` if any child is undefined.
function result(obj, path, fallback) {
  if (!isArray(path)) path = [path];
  var length = path.length;
  if (!length) {
    return isFunction$1(fallback) ? fallback.call(obj) : fallback;
  }
  for (var i = 0; i < length; i++) {
    var prop = obj == null ? void 0 : obj[path[i]];
    if (prop === void 0) {
      prop = fallback;
      i = length; // Ensure we don't continue iterating.
    }
    obj = isFunction$1(prop) ? prop.call(obj) : prop;
  }
  return obj;
}

// Generate a unique integer id (unique within the entire client session).
// Useful for temporary DOM ids.
var idCounter = 0;
function uniqueId(prefix) {
  var id = ++idCounter + '';
  return prefix ? prefix + id : id;
}

// Start chaining a wrapped Underscore object.
function chain(obj) {
  var instance = _(obj);
  instance._chain = true;
  return instance;
}

// Internal function to execute `sourceFunc` bound to `context` with optional
// `args`. Determines whether to execute a function as a constructor or as a
// normal function.
function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
  if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
  var self = baseCreate(sourceFunc.prototype);
  var result = sourceFunc.apply(self, args);
  if (isObject(result)) return result;
  return self;
}

// Partially apply a function by creating a version that has had some of its
// arguments pre-filled, without changing its dynamic `this` context. `_` acts
// as a placeholder by default, allowing any combination of arguments to be
// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
var partial = restArguments(function(func, boundArgs) {
  var placeholder = partial.placeholder;
  var bound = function() {
    var position = 0, length = boundArgs.length;
    var args = Array(length);
    for (var i = 0; i < length; i++) {
      args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
    }
    while (position < arguments.length) args.push(arguments[position++]);
    return executeBound(func, bound, this, this, args);
  };
  return bound;
});

partial.placeholder = _;

// Create a function bound to a given object (assigning `this`, and arguments,
// optionally).
var bind = restArguments(function(func, context, args) {
  if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
  var bound = restArguments(function(callArgs) {
    return executeBound(func, bound, context, this, args.concat(callArgs));
  });
  return bound;
});

// Internal implementation of a recursive `flatten` function.
function flatten(input, depth, strict, output) {
  output = output || [];
  if (!depth && depth !== 0) {
    depth = Infinity;
  } else if (depth <= 0) {
    return output.concat(input);
  }
  var idx = output.length;
  for (var i = 0, length = getLength(input); i < length; i++) {
    var value = input[i];
    if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
      // Flatten current level of array or arguments object.
      if (depth > 1) {
        flatten(value, depth - 1, strict, output);
        idx = output.length;
      } else {
        var j = 0, len = value.length;
        while (j < len) output[idx++] = value[j++];
      }
    } else if (!strict) {
      output[idx++] = value;
    }
  }
  return output;
}

// Bind a number of an object's methods to that object. Remaining arguments
// are the method names to be bound. Useful for ensuring that all callbacks
// defined on an object belong to it.
var bindAll = restArguments(function(obj, keys) {
  keys = flatten(keys, false, false);
  var index = keys.length;
  if (index < 1) throw new Error('bindAll must be passed function names');
  while (index--) {
    var key = keys[index];
    obj[key] = bind(obj[key], obj);
  }
  return obj;
});

// Memoize an expensive function by storing its results.
function memoize(func, hasher) {
  var memoize = function(key) {
    var cache = memoize.cache;
    var address = '' + (hasher ? hasher.apply(this, arguments) : key);
    if (!has(cache, address)) cache[address] = func.apply(this, arguments);
    return cache[address];
  };
  memoize.cache = {};
  return memoize;
}

// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
var delay = restArguments(function(func, wait, args) {
  return setTimeout(function() {
    return func.apply(null, args);
  }, wait);
});

// Defers a function, scheduling it to run after the current call stack has
// cleared.
var defer = partial(delay, _, 1);

// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time. Normally, the throttled function will run
// as much as it can, without ever going more than once per `wait` duration;
// but if you'd like to disable the execution on the leading edge, pass
// `{leading: false}`. To disable execution on the trailing edge, ditto.
function throttle(func, wait, options) {
  var timeout, context, args, result;
  var previous = 0;
  if (!options) options = {};

  var later = function() {
    previous = options.leading === false ? 0 : now();
    timeout = null;
    result = func.apply(context, args);
    if (!timeout) context = args = null;
  };

  var throttled = function() {
    var _now = now();
    if (!previous && options.leading === false) previous = _now;
    var remaining = wait - (_now - previous);
    context = this;
    args = arguments;
    if (remaining <= 0 || remaining > wait) {
      if (timeout) {
        clearTimeout(timeout);
        timeout = null;
      }
      previous = _now;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    } else if (!timeout && options.trailing !== false) {
      timeout = setTimeout(later, remaining);
    }
    return result;
  };

  throttled.cancel = function() {
    clearTimeout(timeout);
    previous = 0;
    timeout = context = args = null;
  };

  return throttled;
}

// When a sequence of calls of the returned function ends, the argument
// function is triggered. The end of a sequence is defined by the `wait`
// parameter. If `immediate` is passed, the argument function will be
// triggered at the beginning of the sequence instead of at the end.
function debounce(func, wait, immediate) {
  var timeout, result;

  var later = function(context, args) {
    timeout = null;
    if (args) result = func.apply(context, args);
  };

  var debounced = restArguments(function(args) {
    if (timeout) clearTimeout(timeout);
    if (immediate) {
      var callNow = !timeout;
      timeout = setTimeout(later, wait);
      if (callNow) result = func.apply(this, args);
    } else {
      timeout = delay(later, wait, this, args);
    }

    return result;
  });

  debounced.cancel = function() {
    clearTimeout(timeout);
    timeout = null;
  };

  return debounced;
}

// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
function wrap(func, wrapper) {
  return partial(wrapper, func);
}

// Returns a negated version of the passed-in predicate.
function negate(predicate) {
  return function() {
    return !predicate.apply(this, arguments);
  };
}

// Returns a function that is the composition of a list of functions, each
// consuming the return value of the function that follows.
function compose() {
  var args = arguments;
  var start = args.length - 1;
  return function() {
    var i = start;
    var result = args[start].apply(this, arguments);
    while (i--) result = args[i].call(this, result);
    return result;
  };
}

// Returns a function that will only be executed on and after the Nth call.
function after(times, func) {
  return function() {
    if (--times < 1) {
      return func.apply(this, arguments);
    }
  };
}

// Returns a function that will only be executed up to (but not including) the
// Nth call.
function before(times, func) {
  var memo;
  return function() {
    if (--times > 0) {
      memo = func.apply(this, arguments);
    }
    if (times <= 1) func = null;
    return memo;
  };
}

// Returns a function that will be executed at most one time, no matter how
// often you call it. Useful for lazy initialization.
var once = partial(before, 2);

// Returns the first key on an object that passes a truth test.
function findKey(obj, predicate, context) {
  predicate = cb(predicate, context);
  var _keys = keys(obj), key;
  for (var i = 0, length = _keys.length; i < length; i++) {
    key = _keys[i];
    if (predicate(obj[key], key, obj)) return key;
  }
}

// Internal function to generate `_.findIndex` and `_.findLastIndex`.
function createPredicateIndexFinder(dir) {
  return function(array, predicate, context) {
    predicate = cb(predicate, context);
    var length = getLength(array);
    var index = dir > 0 ? 0 : length - 1;
    for (; index >= 0 && index < length; index += dir) {
      if (predicate(array[index], index, array)) return index;
    }
    return -1;
  };
}

// Returns the first index on an array-like that passes a truth test.
var findIndex = createPredicateIndexFinder(1);

// Returns the last index on an array-like that passes a truth test.
var findLastIndex = createPredicateIndexFinder(-1);

// Use a comparator function to figure out the smallest index at which
// an object should be inserted so as to maintain order. Uses binary search.
function sortedIndex(array, obj, iteratee, context) {
  iteratee = cb(iteratee, context, 1);
  var value = iteratee(obj);
  var low = 0, high = getLength(array);
  while (low < high) {
    var mid = Math.floor((low + high) / 2);
    if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
  }
  return low;
}

// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
function createIndexFinder(dir, predicateFind, sortedIndex) {
  return function(array, item, idx) {
    var i = 0, length = getLength(array);
    if (typeof idx == 'number') {
      if (dir > 0) {
        i = idx >= 0 ? idx : Math.max(idx + length, i);
      } else {
        length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
      }
    } else if (sortedIndex && idx && length) {
      idx = sortedIndex(array, item);
      return array[idx] === item ? idx : -1;
    }
    if (item !== item) {
      idx = predicateFind(slice.call(array, i, length), isNaN$1);
      return idx >= 0 ? idx + i : -1;
    }
    for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
      if (array[idx] === item) return idx;
    }
    return -1;
  };
}

// Return the position of the first occurrence of an item in an array,
// or -1 if the item is not included in the array.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
var indexOf = createIndexFinder(1, findIndex, sortedIndex);

// Return the position of the last occurrence of an item in an array,
// or -1 if the item is not included in the array.
var lastIndexOf = createIndexFinder(-1, findLastIndex);

// Return the first value which passes a truth test.
function find(obj, predicate, context) {
  var keyFinder = isArrayLike(obj) ? findIndex : findKey;
  var key = keyFinder(obj, predicate, context);
  if (key !== void 0 && key !== -1) return obj[key];
}

// Convenience version of a common use case of `_.find`: getting the first
// object containing specific `key:value` pairs.
function findWhere(obj, attrs) {
  return find(obj, matcher(attrs));
}

// The cornerstone for collection functions, an `each`
// implementation, aka `forEach`.
// Handles raw objects in addition to array-likes. Treats all
// sparse array-likes as if they were dense.
function each(obj, iteratee, context) {
  iteratee = optimizeCb(iteratee, context);
  var i, length;
  if (isArrayLike(obj)) {
    for (i = 0, length = obj.length; i < length; i++) {
      iteratee(obj[i], i, obj);
    }
  } else {
    var _keys = keys(obj);
    for (i = 0, length = _keys.length; i < length; i++) {
      iteratee(obj[_keys[i]], _keys[i], obj);
    }
  }
  return obj;
}

// Return the results of applying the iteratee to each element.
function map(obj, iteratee, context) {
  iteratee = cb(iteratee, context);
  var _keys = !isArrayLike(obj) && keys(obj),
      length = (_keys || obj).length,
      results = Array(length);
  for (var index = 0; index < length; index++) {
    var currentKey = _keys ? _keys[index] : index;
    results[index] = iteratee(obj[currentKey], currentKey, obj);
  }
  return results;
}

// Internal helper to create a reducing function, iterating left or right.
function createReduce(dir) {
  // Wrap code that reassigns argument variables in a separate function than
  // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
  var reducer = function(obj, iteratee, memo, initial) {
    var _keys = !isArrayLike(obj) && keys(obj),
        length = (_keys || obj).length,
        index = dir > 0 ? 0 : length - 1;
    if (!initial) {
      memo = obj[_keys ? _keys[index] : index];
      index += dir;
    }
    for (; index >= 0 && index < length; index += dir) {
      var currentKey = _keys ? _keys[index] : index;
      memo = iteratee(memo, obj[currentKey], currentKey, obj);
    }
    return memo;
  };

  return function(obj, iteratee, memo, context) {
    var initial = arguments.length >= 3;
    return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
  };
}

// **Reduce** builds up a single result from a list of values, aka `inject`,
// or `foldl`.
var reduce = createReduce(1);

// The right-associative version of reduce, also known as `foldr`.
var reduceRight = createReduce(-1);

// Return all the elements that pass a truth test.
function filter(obj, predicate, context) {
  var results = [];
  predicate = cb(predicate, context);
  each(obj, function(value, index, list) {
    if (predicate(value, index, list)) results.push(value);
  });
  return results;
}

// Return all the elements for which a truth test fails.
function reject(obj, predicate, context) {
  return filter(obj, negate(cb(predicate)), context);
}

// Determine whether all of the elements pass a truth test.
function every(obj, predicate, context) {
  predicate = cb(predicate, context);
  var _keys = !isArrayLike(obj) && keys(obj),
      length = (_keys || obj).length;
  for (var index = 0; index < length; index++) {
    var currentKey = _keys ? _keys[index] : index;
    if (!predicate(obj[currentKey], currentKey, obj)) return false;
  }
  return true;
}

// Determine if at least one element in the object passes a truth test.
function some(obj, predicate, context) {
  predicate = cb(predicate, context);
  var _keys = !isArrayLike(obj) && keys(obj),
      length = (_keys || obj).length;
  for (var index = 0; index < length; index++) {
    var currentKey = _keys ? _keys[index] : index;
    if (predicate(obj[currentKey], currentKey, obj)) return true;
  }
  return false;
}

// Determine if the array or object contains a given item (using `===`).
function contains(obj, item, fromIndex, guard) {
  if (!isArrayLike(obj)) obj = values(obj);
  if (typeof fromIndex != 'number' || guard) fromIndex = 0;
  return indexOf(obj, item, fromIndex) >= 0;
}

// Invoke a method (with arguments) on every item in a collection.
var invoke = restArguments(function(obj, path, args) {
  var contextPath, func;
  if (isFunction$1(path)) {
    func = path;
  } else if (isArray(path)) {
    contextPath = path.slice(0, -1);
    path = path[path.length - 1];
  }
  return map(obj, function(context) {
    var method = func;
    if (!method) {
      if (contextPath && contextPath.length) {
        context = deepGet(context, contextPath);
      }
      if (context == null) return void 0;
      method = context[path];
    }
    return method == null ? method : method.apply(context, args);
  });
});

// Convenience version of a common use case of `_.map`: fetching a property.
function pluck(obj, key) {
  return map(obj, property(key));
}

// Convenience version of a common use case of `_.filter`: selecting only
// objects containing specific `key:value` pairs.
function where(obj, attrs) {
  return filter(obj, matcher(attrs));
}

// Return the maximum element (or element-based computation).
function max(obj, iteratee, context) {
  var result = -Infinity, lastComputed = -Infinity,
      value, computed;
  if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
    obj = isArrayLike(obj) ? obj : values(obj);
    for (var i = 0, length = obj.length; i < length; i++) {
      value = obj[i];
      if (value != null && value > result) {
        result = value;
      }
    }
  } else {
    iteratee = cb(iteratee, context);
    each(obj, function(v, index, list) {
      computed = iteratee(v, index, list);
      if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
        result = v;
        lastComputed = computed;
      }
    });
  }
  return result;
}

// Return the minimum element (or element-based computation).
function min(obj, iteratee, context) {
  var result = Infinity, lastComputed = Infinity,
      value, computed;
  if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
    obj = isArrayLike(obj) ? obj : values(obj);
    for (var i = 0, length = obj.length; i < length; i++) {
      value = obj[i];
      if (value != null && value < result) {
        result = value;
      }
    }
  } else {
    iteratee = cb(iteratee, context);
    each(obj, function(v, index, list) {
      computed = iteratee(v, index, list);
      if (computed < lastComputed || computed === Infinity && result === Infinity) {
        result = v;
        lastComputed = computed;
      }
    });
  }
  return result;
}

// Sample **n** random values from a collection using the modern version of the
// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisherâ€“Yates_shuffle).
// If **n** is not specified, returns a single random element.
// The internal `guard` argument allows it to work with `_.map`.
function sample(obj, n, guard) {
  if (n == null || guard) {
    if (!isArrayLike(obj)) obj = values(obj);
    return obj[random(obj.length - 1)];
  }
  var sample = isArrayLike(obj) ? clone(obj) : values(obj);
  var length = getLength(sample);
  n = Math.max(Math.min(n, length), 0);
  var last = length - 1;
  for (var index = 0; index < n; index++) {
    var rand = random(index, last);
    var temp = sample[index];
    sample[index] = sample[rand];
    sample[rand] = temp;
  }
  return sample.slice(0, n);
}

// Shuffle a collection.
function shuffle(obj) {
  return sample(obj, Infinity);
}

// Sort the object's values by a criterion produced by an iteratee.
function sortBy(obj, iteratee, context) {
  var index = 0;
  iteratee = cb(iteratee, context);
  return pluck(map(obj, function(value, key, list) {
    return {
      value: value,
      index: index++,
      criteria: iteratee(value, key, list)
    };
  }).sort(function(left, right) {
    var a = left.criteria;
    var b = right.criteria;
    if (a !== b) {
      if (a > b || a === void 0) return 1;
      if (a < b || b === void 0) return -1;
    }
    return left.index - right.index;
  }), 'value');
}

// An internal function used for aggregate "group by" operations.
function group(behavior, partition) {
  return function(obj, iteratee, context) {
    var result = partition ? [[], []] : {};
    iteratee = cb(iteratee, context);
    each(obj, function(value, index) {
      var key = iteratee(value, index, obj);
      behavior(result, value, key);
    });
    return result;
  };
}

// Groups the object's values by a criterion. Pass either a string attribute
// to group by, or a function that returns the criterion.
var groupBy = group(function(result, value, key) {
  if (has(result, key)) result[key].push(value); else result[key] = [value];
});

// Indexes the object's values by a criterion, similar to `_.groupBy`, but for
// when you know that your index values will be unique.
var indexBy = group(function(result, value, key) {
  result[key] = value;
});

// Counts instances of an object that group by a certain criterion. Pass
// either a string attribute to count by, or a function that returns the
// criterion.
var countBy = group(function(result, value, key) {
  if (has(result, key)) result[key]++; else result[key] = 1;
});

// Split a collection into two arrays: one whose elements all pass the given
// truth test, and one whose elements all do not pass the truth test.
var partition = group(function(result, value, pass) {
  result[pass ? 0 : 1].push(value);
}, true);

// Safely create a real, live array from anything iterable.
var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
function toArray(obj) {
  if (!obj) return [];
  if (isArray(obj)) return slice.call(obj);
  if (isString(obj)) {
    // Keep surrogate pair characters together.
    return obj.match(reStrSymbol);
  }
  if (isArrayLike(obj)) return map(obj, identity);
  return values(obj);
}

// Return the number of elements in a collection.
function size(obj) {
  if (obj == null) return 0;
  return isArrayLike(obj) ? obj.length : keys(obj).length;
}

// Internal `_.pick` helper function to determine whether `key` is an enumerable
// property name of `obj`.
function keyInObj(value, key, obj) {
  return key in obj;
}

// Return a copy of the object only containing the allowed properties.
var pick = restArguments(function(obj, keys) {
  var result = {}, iteratee = keys[0];
  if (obj == null) return result;
  if (isFunction$1(iteratee)) {
    if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
    keys = allKeys(obj);
  } else {
    iteratee = keyInObj;
    keys = flatten(keys, false, false);
    obj = Object(obj);
  }
  for (var i = 0, length = keys.length; i < length; i++) {
    var key = keys[i];
    var value = obj[key];
    if (iteratee(value, key, obj)) result[key] = value;
  }
  return result;
});

// Return a copy of the object without the disallowed properties.
var omit = restArguments(function(obj, keys) {
  var iteratee = keys[0], context;
  if (isFunction$1(iteratee)) {
    iteratee = negate(iteratee);
    if (keys.length > 1) context = keys[1];
  } else {
    keys = map(flatten(keys, false, false), String);
    iteratee = function(value, key) {
      return !contains(keys, key);
    };
  }
  return pick(obj, iteratee, context);
});

// Returns everything but the last entry of the array. Especially useful on
// the arguments object. Passing **n** will return all the values in
// the array, excluding the last N.
function initial(array, n, guard) {
  return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
}

// Get the first element of an array. Passing **n** will return the first N
// values in the array. The **guard** check allows it to work with `_.map`.
function first(array, n, guard) {
  if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
  if (n == null || guard) return array[0];
  return initial(array, array.length - n);
}

// Returns everything but the first entry of the `array`. Especially useful on
// the `arguments` object. Passing an **n** will return the rest N values in the
// `array`.
function rest(array, n, guard) {
  return slice.call(array, n == null || guard ? 1 : n);
}

// Get the last element of an array. Passing **n** will return the last N
// values in the array.
function last(array, n, guard) {
  if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
  if (n == null || guard) return array[array.length - 1];
  return rest(array, Math.max(0, array.length - n));
}

// Trim out all falsy values from an array.
function compact(array) {
  return filter(array, Boolean);
}

// Flatten out an array, either recursively (by default), or up to `depth`.
// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
function flatten$1(array, depth) {
  return flatten(array, depth, false);
}

// Take the difference between one array and a number of other arrays.
// Only the elements present in just the first array will remain.
var difference = restArguments(function(array, rest) {
  rest = flatten(rest, true, true);
  return filter(array, function(value){
    return !contains(rest, value);
  });
});

// Return a version of the array that does not contain the specified value(s).
var without = restArguments(function(array, otherArrays) {
  return difference(array, otherArrays);
});

// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// The faster algorithm will not work with an iteratee if the iteratee
// is not a one-to-one function, so providing an iteratee will disable
// the faster algorithm.
function uniq(array, isSorted, iteratee, context) {
  if (!isBoolean(isSorted)) {
    context = iteratee;
    iteratee = isSorted;
    isSorted = false;
  }
  if (iteratee != null) iteratee = cb(iteratee, context);
  var result = [];
  var seen = [];
  for (var i = 0, length = getLength(array); i < length; i++) {
    var value = array[i],
        computed = iteratee ? iteratee(value, i, array) : value;
    if (isSorted && !iteratee) {
      if (!i || seen !== computed) result.push(value);
      seen = computed;
    } else if (iteratee) {
      if (!contains(seen, computed)) {
        seen.push(computed);
        result.push(value);
      }
    } else if (!contains(result, value)) {
      result.push(value);
    }
  }
  return result;
}

// Produce an array that contains the union: each distinct element from all of
// the passed-in arrays.
var union = restArguments(function(arrays) {
  return uniq(flatten(arrays, true, true));
});

// Produce an array that contains every item shared between all the
// passed-in arrays.
function intersection(array) {
  var result = [];
  var argsLength = arguments.length;
  for (var i = 0, length = getLength(array); i < length; i++) {
    var item = array[i];
    if (contains(result, item)) continue;
    var j;
    for (j = 1; j < argsLength; j++) {
      if (!contains(arguments[j], item)) break;
    }
    if (j === argsLength) result.push(item);
  }
  return result;
}

// Complement of zip. Unzip accepts an array of arrays and groups
// each array's elements on shared indices.
function unzip(array) {
  var length = array && max(array, getLength).length || 0;
  var result = Array(length);

  for (var index = 0; index < length; index++) {
    result[index] = pluck(array, index);
  }
  return result;
}

// Zip together multiple lists into a single array -- elements that share
// an index go together.
var zip = restArguments(unzip);

// Converts lists into objects. Pass either a single array of `[key, value]`
// pairs, or two parallel arrays of the same length -- one of keys, and one of
// the corresponding values. Passing by pairs is the reverse of `_.pairs`.
function object(list, values) {
  var result = {};
  for (var i = 0, length = getLength(list); i < length; i++) {
    if (values) {
      result[list[i]] = values[i];
    } else {
      result[list[i][0]] = list[i][1];
    }
  }
  return result;
}

// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](https://docs.python.org/library/functions.html#range).
function range(start, stop, step) {
  if (stop == null) {
    stop = start || 0;
    start = 0;
  }
  if (!step) {
    step = stop < start ? -1 : 1;
  }

  var length = Math.max(Math.ceil((stop - start) / step), 0);
  var range = Array(length);

  for (var idx = 0; idx < length; idx++, start += step) {
    range[idx] = start;
  }

  return range;
}

// Chunk a single array into multiple arrays, each containing `count` or fewer
// items.
function chunk(array, count) {
  if (count == null || count < 1) return [];
  var result = [];
  var i = 0, length = array.length;
  while (i < length) {
    result.push(slice.call(array, i, i += count));
  }
  return result;
}

// Helper function to continue chaining intermediate results.
function chainResult(instance, obj) {
  return instance._chain ? _(obj).chain() : obj;
}

// Add your own custom functions to the Underscore object.
function mixin(obj) {
  each(functions(obj), function(name) {
    var func = _[name] = obj[name];
    _.prototype[name] = function() {
      var args = [this._wrapped];
      push.apply(args, arguments);
      return chainResult(this, func.apply(_, args));
    };
  });
  return _;
}

// Add all mutator `Array` functions to the wrapper.
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
  var method = ArrayProto[name];
  _.prototype[name] = function() {
    var obj = this._wrapped;
    if (obj != null) {
      method.apply(obj, arguments);
      if ((name === 'shift' || name === 'splice') && obj.length === 0) {
        delete obj[0];
      }
    }
    return chainResult(this, obj);
  };
});

// Add all accessor `Array` functions to the wrapper.
each(['concat', 'join', 'slice'], function(name) {
  var method = ArrayProto[name];
  _.prototype[name] = function() {
    var obj = this._wrapped;
    if (obj != null) obj = method.apply(obj, arguments);
    return chainResult(this, obj);
  };
});

// Named Exports

var allExports = {
  __proto__: null,
  VERSION: VERSION,
  restArguments: restArguments,
  isObject: isObject,
  isNull: isNull,
  isUndefined: isUndefined,
  isBoolean: isBoolean,
  isElement: isElement,
  isString: isString,
  isNumber: isNumber,
  isDate: isDate,
  isRegExp: isRegExp,
  isError: isError,
  isSymbol: isSymbol,
  isMap: isMap,
  isWeakMap: isWeakMap,
  isSet: isSet,
  isWeakSet: isWeakSet,
  isArrayBuffer: isArrayBuffer,
  isDataView: isDataView,
  isArray: isArray,
  isFunction: isFunction$1,
  isArguments: isArguments$1,
  isFinite: isFinite$1,
  isNaN: isNaN$1,
  isTypedArray: isTypedArray$1,
  isEmpty: isEmpty,
  isMatch: isMatch,
  isEqual: isEqual,
  keys: keys,
  allKeys: allKeys,
  values: values,
  pairs: pairs,
  invert: invert,
  functions: functions,
  methods: functions,
  extend: extend,
  extendOwn: extendOwn,
  assign: extendOwn,
  defaults: defaults,
  create: create,
  clone: clone,
  tap: tap,
  has: has$1,
  mapObject: mapObject,
  identity: identity,
  constant: constant,
  noop: noop,
  property: property,
  propertyOf: propertyOf,
  matcher: matcher,
  matches: matcher,
  times: times,
  random: random,
  now: now,
  escape: _escape,
  unescape: _unescape,
  templateSettings: templateSettings,
  template: template,
  result: result,
  uniqueId: uniqueId,
  chain: chain,
  iteratee: iteratee,
  partial: partial,
  bind: bind,
  bindAll: bindAll,
  memoize: memoize,
  delay: delay,
  defer: defer,
  throttle: throttle,
  debounce: debounce,
  wrap: wrap,
  negate: negate,
  compose: compose,
  after: after,
  before: before,
  once: once,
  findKey: findKey,
  findIndex: findIndex,
  findLastIndex: findLastIndex,
  sortedIndex: sortedIndex,
  indexOf: indexOf,
  lastIndexOf: lastIndexOf,
  find: find,
  detect: find,
  findWhere: findWhere,
  each: each,
  forEach: each,
  map: map,
  collect: map,
  reduce: reduce,
  foldl: reduce,
  inject: reduce,
  reduceRight: reduceRight,
  foldr: reduceRight,
  filter: filter,
  select: filter,
  reject: reject,
  every: every,
  all: every,
  some: some,
  any: some,
  contains: contains,
  includes: contains,
  include: contains,
  invoke: invoke,
  pluck: pluck,
  where: where,
  max: max,
  min: min,
  shuffle: shuffle,
  sample: sample,
  sortBy: sortBy,
  groupBy: groupBy,
  indexBy: indexBy,
  countBy: countBy,
  partition: partition,
  toArray: toArray,
  size: size,
  pick: pick,
  omit: omit,
  first: first,
  head: first,
  take: first,
  initial: initial,
  last: last,
  rest: rest,
  tail: rest,
  drop: rest,
  compact: compact,
  flatten: flatten$1,
  without: without,
  uniq: uniq,
  unique: uniq,
  union: union,
  intersection: intersection,
  difference: difference,
  unzip: unzip,
  transpose: unzip,
  zip: zip,
  object: object,
  range: range,
  chunk: chunk,
  mixin: mixin,
  'default': _
};

// Default Export

// Add all of the Underscore functions to the wrapper object.
var _$1 = mixin(allExports);
// Legacy Node.js API.
_$1._ = _$1;

// ESM Exports

export default _$1;
export { VERSION, after, every as all, allKeys, some as any, extendOwn as assign, before, bind, bindAll, chain, chunk, clone, map as collect, compact, compose, constant, contains, countBy, create, debounce, defaults, defer, delay, find as detect, difference, rest as drop, each, _escape as escape, every, extend, extendOwn, filter, find, findIndex, findKey, findLastIndex, findWhere, first, flatten$1 as flatten, reduce as foldl, reduceRight as foldr, each as forEach, functions, groupBy, has$1 as has, first as head, identity, contains as include, contains as includes, indexBy, indexOf, initial, reduce as inject, intersection, invert, invoke, isArguments$1 as isArguments, isArray, isArrayBuffer, isBoolean, isDataView, isDate, isElement, isEmpty, isEqual, isError, isFinite$1 as isFinite, isFunction$1 as isFunction, isMap, isMatch, isNaN$1 as isNaN, isNull, isNumber, isObject, isRegExp, isSet, isString, isSymbol, isTypedArray$1 as isTypedArray, isUndefined, isWeakMap, isWeakSet, iteratee, keys, last, lastIndexOf, map, mapObject, matcher, matcher as matches, max, memoize, functions as methods, min, mixin, negate, noop, now, object, omit, once, pairs, partial, partition, pick, pluck, property, propertyOf, random, range, reduce, reduceRight, reject, rest, restArguments, result, sample, filter as select, shuffle, size, some, sortBy, sortedIndex, rest as tail, first as take, tap, template, templateSettings, throttle, times, toArray, unzip as transpose, _unescape as unescape, union, uniq, uniq as unique, uniqueId, unzip, values, where, without, wrap, zip };
//# sourceMappingURL=underscore-esm.js.map
{"version":3,"file":"underscore-esm.js","sources":["modules/_setup.js","modules/restArguments.js","modules/isObject.js","modules/isNull.js","modules/isUndefined.js","modules/isBoolean.js","modules/isElement.js","modules/_tagTester.js","modules/isString.js","modules/isNumber.js","modules/isDate.js","modules/isRegExp.js","modules/isError.js","modules/isSymbol.js","modules/isMap.js","modules/isWeakMap.js","modules/isSet.js","modules/isWeakSet.js","modules/isArrayBuffer.js","modules/isDataView.js","modules/isArray.js","modules/isFunction.js","modules/_has.js","modules/isArguments.js","modules/isFinite.js","modules/isNaN.js","modules/constant.js","modules/_createSizePropertyCheck.js","modules/_shallowProperty.js","modules/_getByteLength.js","modules/_isBufferLike.js","modules/isTypedArray.js","modules/_getLength.js","modules/_isArrayLike.js","modules/_collectNonEnumProps.js","modules/keys.js","modules/isEmpty.js","modules/isMatch.js","modules/underscore.js","modules/isEqual.js","modules/allKeys.js","modules/values.js","modules/pairs.js","modules/invert.js","modules/functions.js","modules/_createAssigner.js","modules/extend.js","modules/extendOwn.js","modules/defaults.js","modules/_baseCreate.js","modules/create.js","modules/clone.js","modules/tap.js","modules/has.js","modules/identity.js","modules/matcher.js","modules/_deepGet.js","modules/property.js","modules/_optimizeCb.js","modules/_baseIteratee.js","modules/iteratee.js","modules/_cb.js","modules/mapObject.js","modules/noop.js","modules/propertyOf.js","modules/times.js","modules/random.js","modules/now.js","modules/_createEscaper.js","modules/_escapeMap.js","modules/escape.js","modules/_unescapeMap.js","modules/unescape.js","modules/templateSettings.js","modules/template.js","modules/result.js","modules/uniqueId.js","modules/chain.js","modules/_executeBound.js","modules/partial.js","modules/bind.js","modules/_flatten.js","modules/bindAll.js","modules/memoize.js","modules/delay.js","modules/defer.js","modules/throttle.js","modules/debounce.js","modules/wrap.js","modules/negate.js","modules/compose.js","modules/after.js","modules/before.js","modules/once.js","modules/findKey.js","modules/_createPredicateIndexFinder.js","modules/findIndex.js","modules/findLastIndex.js","modules/sortedIndex.js","modules/_createIndexFinder.js","modules/indexOf.js","modules/lastIndexOf.js","modules/find.js","modules/findWhere.js","modules/each.js","modules/map.js","modules/_createReduce.js","modules/reduce.js","modules/reduceRight.js","modules/filter.js","modules/reject.js","modules/every.js","modules/some.js","modules/contains.js","modules/invoke.js","modules/pluck.js","modules/where.js","modules/max.js","modules/min.js","modules/sample.js","modules/shuffle.js","modules/sortBy.js","modules/_group.js","modules/groupBy.js","modules/indexBy.js","modules/countBy.js","modules/partition.js","modules/toArray.js","modules/size.js","modules/_keyInObj.js","modules/pick.js","modules/omit.js","modules/initial.js","modules/first.js","modules/rest.js","modules/last.js","modules/compact.js","modules/flatten.js","modules/difference.js","modules/without.js","modules/uniq.js","modules/union.js","modules/intersection.js","modules/unzip.js","modules/zip.js","modules/object.js","modules/range.js","modules/chunk.js","modules/_chainResult.js","modules/mixin.js","modules/underscore-array-methods.js","modules/index.js","modules/index-default.js","modules/index-all.js"],"sourcesContent":null,"names":["isFinite","isNaN","isFunction","isArguments","isTypedArray","has","_has","flatten","_flatten","_"],"mappings":"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"}!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n=n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){
//     Underscore.js 1.11.0
//     https://underscorejs.org
//     (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
//     Underscore may be freely distributed under the MIT license.
var n="1.11.0",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,i=t.push,o=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l=Array.isArray,s=Object.keys,p=Object.create,v=c&&ArrayBuffer.isView,h=isNaN,y=isFinite,g=!{toString:null}.propertyIsEnumerable("toString"),d=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function b(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u<t;u++)e[u]=arguments[u+r];switch(r){case 0:return n.call(this,e);case 1:return n.call(this,arguments[0],e);case 2:return n.call(this,arguments[0],arguments[1],e)}var i=Array(r+1);for(u=0;u<r;u++)i[u]=arguments[u];return i[r]=e,n.apply(this,i)}}function _(n){var r=typeof n;return"function"===r||"object"===r&&!!n}function j(n){return!0===n||!1===n||"[object Boolean]"===a.call(n)}function w(n){return function(r){return a.call(r)==="[object "+n+"]"}}var x=w("String"),A=w("Number"),S=w("Date"),O=w("RegExp"),M=w("Error"),E=w("Symbol"),B=w("Map"),N=w("WeakMap"),D=w("Set"),I=w("WeakSet"),k=w("ArrayBuffer"),T=w("DataView"),V=l||w("Array"),R=w("Function"),F=r.document&&r.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof F&&(R=function(n){return"function"==typeof n||!1});var U=R;function q(n,r){return null!=n&&f.call(n,r)}var W=w("Arguments");!function(){W(arguments)||(W=function(n){return q(n,"callee")})}();var z=W;function L(n){return A(n)&&h(n)}function P(n){return function(){return n}}function C(n){return function(r){var t=n(r);return"number"==typeof t&&t>=0&&t<=m}}function K(n){return function(r){return null==r?void 0:r[n]}}var J=K("byteLength"),$=C(J),G=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var H=c?function(n){return v?v(n)&&!T(n):$(n)&&G.test(a.call(n))}:P(!1),Q=K("length"),X=C(Q);function Y(n,r){r=function(n){for(var r={},t=n.length,e=0;e<t;++e)r[n[e]]=!0;return{contains:function(n){return r[n]},push:function(t){return r[t]=!0,n.push(t)}}}(r);var t=d.length,u=n.constructor,i=U(u)&&u.prototype||e,o="constructor";for(q(n,o)&&!r.contains(o)&&r.push(o);t--;)(o=d[t])in n&&n[o]!==i[o]&&!r.contains(o)&&r.push(o)}function Z(n){if(!_(n))return[];if(s)return s(n);var r=[];for(var t in n)q(n,t)&&r.push(t);return g&&Y(n,r),r}function nn(n,r){var t=Z(r),e=t.length;if(null==n)return!e;for(var u=Object(n),i=0;i<e;i++){var o=t[i];if(r[o]!==u[o]||!(o in u))return!1}return!0}function rn(n){return n instanceof rn?n:this instanceof rn?void(this._wrapped=n):new rn(n)}function tn(n,r,t,e){if(n===r)return 0!==n||1/n==1/r;if(null==n||null==r)return!1;if(n!=n)return r!=r;var i=typeof n;return("function"===i||"object"===i||"object"==typeof r)&&function n(r,t,e,i){r instanceof rn&&(r=r._wrapped);t instanceof rn&&(t=t._wrapped);var o=a.call(r);if(o!==a.call(t))return!1;switch(o){case"[object RegExp]":case"[object String]":return""+r==""+t;case"[object Number]":return+r!=+r?+t!=+t:0==+r?1/+r==1/t:+r==+t;case"[object Date]":case"[object Boolean]":return+r==+t;case"[object Symbol]":return u.valueOf.call(r)===u.valueOf.call(t);case"[object ArrayBuffer]":return n(new DataView(r),new DataView(t),e,i);case"[object DataView]":var f=J(r);if(f!==J(t))return!1;for(;f--;)if(r.getUint8(f)!==t.getUint8(f))return!1;return!0}if(H(r))return n(new DataView(r.buffer),new DataView(t.buffer),e,i);var c="[object Array]"===o;if(!c){if("object"!=typeof r||"object"!=typeof t)return!1;var l=r.constructor,s=t.constructor;if(l!==s&&!(U(l)&&l instanceof l&&U(s)&&s instanceof s)&&"constructor"in r&&"constructor"in t)return!1}i=i||[];var p=(e=e||[]).length;for(;p--;)if(e[p]===r)return i[p]===t;if(e.push(r),i.push(t),c){if((p=r.length)!==t.length)return!1;for(;p--;)if(!tn(r[p],t[p],e,i))return!1}else{var v,h=Z(r);if(p=h.length,Z(t).length!==p)return!1;for(;p--;)if(v=h[p],!q(t,v)||!tn(r[v],t[v],e,i))return!1}return e.pop(),i.pop(),!0}(n,r,t,e)}function en(n){if(!_(n))return[];var r=[];for(var t in n)r.push(t);return g&&Y(n,r),r}function un(n){for(var r=Z(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=n[r[u]];return e}function on(n){for(var r={},t=Z(n),e=0,u=t.length;e<u;e++)r[n[t[e]]]=t[e];return r}function an(n){var r=[];for(var t in n)U(n[t])&&r.push(t);return r.sort()}function fn(n,r){return function(t){var e=arguments.length;if(r&&(t=Object(t)),e<2||null==t)return t;for(var u=1;u<e;u++)for(var i=arguments[u],o=n(i),a=o.length,f=0;f<a;f++){var c=o[f];r&&void 0!==t[c]||(t[c]=i[c])}return t}}rn.VERSION=n,rn.prototype.value=function(){return this._wrapped},rn.prototype.valueOf=rn.prototype.toJSON=rn.prototype.value,rn.prototype.toString=function(){return String(this._wrapped)};var cn=fn(en),ln=fn(Z),sn=fn(en,!0);function pn(n){if(!_(n))return{};if(p)return p(n);var r=function(){};r.prototype=n;var t=new r;return r.prototype=null,t}function vn(n){return _(n)?V(n)?n.slice():cn({},n):n}function hn(n){return n}function yn(n){return n=ln({},n),function(r){return nn(r,n)}}function gn(n,r){for(var t=r.length,e=0;e<t;e++){if(null==n)return;n=n[r[e]]}return t?n:void 0}function dn(n){return V(n)?function(r){return gn(r,n)}:K(n)}function mn(n,r,t){if(void 0===r)return n;switch(null==t?3:t){case 1:return function(t){return n.call(r,t)};case 3:return function(t,e,u){return n.call(r,t,e,u)};case 4:return function(t,e,u,i){return n.call(r,t,e,u,i)}}return function(){return n.apply(r,arguments)}}function bn(n,r,t){return null==n?hn:U(n)?mn(n,r,t):_(n)&&!V(n)?yn(n):dn(n)}function _n(n,r){return bn(n,r,1/0)}function jn(n,r,t){return rn.iteratee!==_n?rn.iteratee(n,r):bn(n,r,t)}function wn(n,r){return null==r&&(r=n,n=0),n+Math.floor(Math.random()*(r-n+1))}rn.iteratee=_n;var xn=Date.now||function(){return(new Date).getTime()};function An(n){var r=function(r){return n[r]},t="(?:"+Z(n).join("|")+")",e=RegExp(t),u=RegExp(t,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,r):n}}var Sn={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},On=An(Sn),Mn=An(on(Sn)),En=rn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Bn=/(.)^/,Nn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Dn=/\\|'|\r|\n|\u2028|\u2029/g;function In(n){return"\\"+Nn[n]}var kn=0;function Tn(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var i=pn(n.prototype),o=n.apply(i,u);return _(o)?o:i}var Vn=b((function(n,r){var t=Vn.placeholder,e=function(){for(var u=0,i=r.length,o=Array(i),a=0;a<i;a++)o[a]=r[a]===t?arguments[u++]:r[a];for(;u<arguments.length;)o.push(arguments[u++]);return Tn(n,e,this,this,o)};return e}));Vn.placeholder=rn;var Rn=b((function(n,r,t){if(!U(n))throw new TypeError("Bind must be called on a function");var e=b((function(u){return Tn(n,e,r,this,t.concat(u))}));return e}));function Fn(n,r,t,e){if(e=e||[],r||0===r){if(r<=0)return e.concat(n)}else r=1/0;for(var u=e.length,i=0,o=Q(n);i<o;i++){var a=n[i];if(X(a)&&(V(a)||z(a)))if(r>1)Fn(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f<c;)e[u++]=a[f++];else t||(e[u++]=a)}return e}var Un=b((function(n,r){var t=(r=Fn(r,!1,!1)).length;if(t<1)throw new Error("bindAll must be passed function names");for(;t--;){var e=r[t];n[e]=Rn(n[e],n)}return n}));var qn=b((function(n,r,t){return setTimeout((function(){return n.apply(null,t)}),r)})),Wn=Vn(qn,rn,1);function zn(n){return function(){return!n.apply(this,arguments)}}function Ln(n,r){var t;return function(){return--n>0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var Pn=Vn(Ln,2);function Cn(n,r,t){r=jn(r,t);for(var e,u=Z(n),i=0,o=u.length;i<o;i++)if(r(n[e=u[i]],e,n))return e}function Kn(n){return function(r,t,e){t=jn(t,e);for(var u=Q(r),i=n>0?0:u-1;i>=0&&i<u;i+=n)if(t(r[i],i,r))return i;return-1}}var Jn=Kn(1),$n=Kn(-1);function Gn(n,r,t,e){for(var u=(t=jn(t,e,1))(r),i=0,o=Q(n);i<o;){var a=Math.floor((i+o)/2);t(n[a])<u?i=a+1:o=a}return i}function Hn(n,r,t){return function(e,u,i){var a=0,f=Q(e);if("number"==typeof i)n>0?a=i>=0?i:Math.max(i+f,a):f=i>=0?Math.min(i+1,f):i+f+1;else if(t&&i&&f)return e[i=t(e,u)]===u?i:-1;if(u!=u)return(i=r(o.call(e,a,f),L))>=0?i+a:-1;for(i=n>0?a:f-1;i>=0&&i<f;i+=n)if(e[i]===u)return i;return-1}}var Qn=Hn(1,Jn,Gn),Xn=Hn(-1,$n);function Yn(n,r,t){var e=(X(n)?Jn:Cn)(n,r,t);if(void 0!==e&&-1!==e)return n[e]}function Zn(n,r,t){var e,u;if(r=mn(r,t),X(n))for(e=0,u=n.length;e<u;e++)r(n[e],e,n);else{var i=Z(n);for(e=0,u=i.length;e<u;e++)r(n[i[e]],i[e],n)}return n}function nr(n,r,t){r=jn(r,t);for(var e=!X(n)&&Z(n),u=(e||n).length,i=Array(u),o=0;o<u;o++){var a=e?e[o]:o;i[o]=r(n[a],a,n)}return i}function rr(n){var r=function(r,t,e,u){var i=!X(r)&&Z(r),o=(i||r).length,a=n>0?0:o-1;for(u||(e=r[i?i[a]:a],a+=n);a>=0&&a<o;a+=n){var f=i?i[a]:a;e=t(e,r[f],f,r)}return e};return function(n,t,e,u){var i=arguments.length>=3;return r(n,mn(t,u,4),e,i)}}var tr=rr(1),er=rr(-1);function ur(n,r,t){var e=[];return r=jn(r,t),Zn(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function ir(n,r,t){r=jn(r,t);for(var e=!X(n)&&Z(n),u=(e||n).length,i=0;i<u;i++){var o=e?e[i]:i;if(!r(n[o],o,n))return!1}return!0}function or(n,r,t){r=jn(r,t);for(var e=!X(n)&&Z(n),u=(e||n).length,i=0;i<u;i++){var o=e?e[i]:i;if(r(n[o],o,n))return!0}return!1}function ar(n,r,t,e){return X(n)||(n=un(n)),("number"!=typeof t||e)&&(t=0),Qn(n,r,t)>=0}var fr=b((function(n,r,t){var e,u;return U(r)?u=r:V(r)&&(e=r.slice(0,-1),r=r[r.length-1]),nr(n,(function(n){var i=u;if(!i){if(e&&e.length&&(n=gn(n,e)),null==n)return;i=n[r]}return null==i?i:i.apply(n,t)}))}));function cr(n,r){return nr(n,dn(r))}function lr(n,r,t){var e,u,i=-1/0,o=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=X(n)?n:un(n)).length;a<f;a++)null!=(e=n[a])&&e>i&&(i=e);else r=jn(r,t),Zn(n,(function(n,t,e){((u=r(n,t,e))>o||u===-1/0&&i===-1/0)&&(i=n,o=u)}));return i}function sr(n,r,t){if(null==r||t)return X(n)||(n=un(n)),n[wn(n.length-1)];var e=X(n)?vn(n):un(n),u=Q(e);r=Math.max(Math.min(r,u),0);for(var i=u-1,o=0;o<r;o++){var a=wn(o,i),f=e[o];e[o]=e[a],e[a]=f}return e.slice(0,r)}function pr(n,r){return function(t,e,u){var i=r?[[],[]]:{};return e=jn(e,u),Zn(t,(function(r,u){var o=e(r,u,t);n(i,r,o)})),i}}var vr=pr((function(n,r,t){q(n,t)?n[t].push(r):n[t]=[r]})),hr=pr((function(n,r,t){n[t]=r})),yr=pr((function(n,r,t){q(n,t)?n[t]++:n[t]=1})),gr=pr((function(n,r,t){n[t?0:1].push(r)}),!0),dr=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function mr(n,r,t){return r in t}var br=b((function(n,r){var t={},e=r[0];if(null==n)return t;U(e)?(r.length>1&&(e=mn(e,r[1])),r=en(n)):(e=mr,r=Fn(r,!1,!1),n=Object(n));for(var u=0,i=r.length;u<i;u++){var o=r[u],a=n[o];e(a,o,n)&&(t[o]=a)}return t})),_r=b((function(n,r){var t,e=r[0];return U(e)?(e=zn(e),r.length>1&&(t=r[1])):(r=nr(Fn(r,!1,!1),String),e=function(n,t){return!ar(r,t)}),br(n,e,t)}));function jr(n,r,t){return o.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function wr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:jr(n,n.length-r)}function xr(n,r,t){return o.call(n,null==r||t?1:r)}var Ar=b((function(n,r){return r=Fn(r,!0,!0),ur(n,(function(n){return!ar(r,n)}))})),Sr=b((function(n,r){return Ar(n,r)}));function Or(n,r,t,e){j(r)||(e=t,t=r,r=!1),null!=t&&(t=jn(t,e));for(var u=[],i=[],o=0,a=Q(n);o<a;o++){var f=n[o],c=t?t(f,o,n):f;r&&!t?(o&&i===c||u.push(f),i=c):t?ar(i,c)||(i.push(c),u.push(f)):ar(u,f)||u.push(f)}return u}var Mr=b((function(n){return Or(Fn(n,!0,!0))}));function Er(n){for(var r=n&&lr(n,Q).length||0,t=Array(r),e=0;e<r;e++)t[e]=cr(n,e);return t}var Br=b(Er);function Nr(n,r){return n._chain?rn(r).chain():r}function Dr(n){return Zn(an(n),(function(r){var t=rn[r]=n[r];rn.prototype[r]=function(){var n=[this._wrapped];return i.apply(n,arguments),Nr(this,t.apply(rn,n))}})),rn}Zn(["pop","push","reverse","shift","sort","splice","unshift"],(function(n){var r=t[n];rn.prototype[n]=function(){var t=this._wrapped;return null!=t&&(r.apply(t,arguments),"shift"!==n&&"splice"!==n||0!==t.length||delete t[0]),Nr(this,t)}})),Zn(["concat","join","slice"],(function(n){var r=t[n];rn.prototype[n]=function(){var n=this._wrapped;return null!=n&&(n=r.apply(n,arguments)),Nr(this,n)}}));var Ir=Dr({__proto__:null,VERSION:n,restArguments:b,isObject:_,isNull:function(n){return null===n},isUndefined:function(n){return void 0===n},isBoolean:j,isElement:function(n){return!(!n||1!==n.nodeType)},isString:x,isNumber:A,isDate:S,isRegExp:O,isError:M,isSymbol:E,isMap:B,isWeakMap:N,isSet:D,isWeakSet:I,isArrayBuffer:k,isDataView:T,isArray:V,isFunction:U,isArguments:z,isFinite:function(n){return!E(n)&&y(n)&&!isNaN(parseFloat(n))},isNaN:L,isTypedArray:H,isEmpty:function(n){return null==n||(X(n)&&(V(n)||x(n)||z(n))?0===n.length:0===Z(n).length)},isMatch:nn,isEqual:function(n,r){return tn(n,r)},keys:Z,allKeys:en,values:un,pairs:function(n){for(var r=Z(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=[r[u],n[r[u]]];return e},invert:on,functions:an,methods:an,extend:cn,extendOwn:ln,assign:ln,defaults:sn,create:function(n,r){var t=pn(n);return r&&ln(t,r),t},clone:vn,tap:function(n,r){return r(n),n},has:function(n,r){if(!V(r))return q(n,r);for(var t=r.length,e=0;e<t;e++){var u=r[e];if(null==n||!f.call(n,u))return!1;n=n[u]}return!!t},mapObject:function(n,r,t){r=jn(r,t);for(var e=Z(n),u=e.length,i={},o=0;o<u;o++){var a=e[o];i[a]=r(n[a],a,n)}return i},identity:hn,constant:P,noop:function(){},property:dn,propertyOf:function(n){return null==n?function(){}:function(r){return V(r)?gn(n,r):n[r]}},matcher:yn,matches:yn,times:function(n,r,t){var e=Array(Math.max(0,n));r=mn(r,t,1);for(var u=0;u<n;u++)e[u]=r(u);return e},random:wn,now:xn,escape:On,unescape:Mn,templateSettings:En,template:function(n,r,t){!r&&t&&(r=t),r=sn({},r,rn.templateSettings);var e,u=RegExp([(r.escape||Bn).source,(r.interpolate||Bn).source,(r.evaluate||Bn).source].join("|")+"|$","g"),i=0,o="__p+='";n.replace(u,(function(r,t,e,u,a){return o+=n.slice(i,a).replace(Dn,In),i=a+r.length,t?o+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?o+="'+\n((__t=("+e+"))==null?'':__t)+\n'":u&&(o+="';\n"+u+"\n__p+='"),r})),o+="';\n",r.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{e=new Function(r.variable||"obj","_",o)}catch(n){throw n.source=o,n}var a=function(n){return e.call(this,n,rn)},f=r.variable||"obj";return a.source="function("+f+"){\n"+o+"}",a},result:function(n,r,t){V(r)||(r=[r]);var e=r.length;if(!e)return U(t)?t.call(n):t;for(var u=0;u<e;u++){var i=null==n?void 0:n[r[u]];void 0===i&&(i=t,u=e),n=U(i)?i.call(n):i}return n},uniqueId:function(n){var r=++kn+"";return n?n+r:r},chain:function(n){var r=rn(n);return r._chain=!0,r},iteratee:_n,partial:Vn,bind:Rn,bindAll:Un,memoize:function(n,r){var t=function(e){var u=t.cache,i=""+(r?r.apply(this,arguments):e);return q(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return t.cache={},t},delay:qn,defer:Wn,throttle:function(n,r,t){var e,u,i,o,a=0;t||(t={});var f=function(){a=!1===t.leading?0:xn(),e=null,o=n.apply(u,i),e||(u=i=null)},c=function(){var c=xn();a||!1!==t.leading||(a=c);var l=r-(c-a);return u=this,i=arguments,l<=0||l>r?(e&&(clearTimeout(e),e=null),a=c,o=n.apply(u,i),e||(u=i=null)):e||!1===t.trailing||(e=setTimeout(f,l)),o};return c.cancel=function(){clearTimeout(e),a=0,e=u=i=null},c},debounce:function(n,r,t){var e,u,i=function(r,t){e=null,t&&(u=n.apply(r,t))},o=b((function(o){if(e&&clearTimeout(e),t){var a=!e;e=setTimeout(i,r),a&&(u=n.apply(this,o))}else e=qn(i,r,this,o);return u}));return o.cancel=function(){clearTimeout(e),e=null},o},wrap:function(n,r){return Vn(r,n)},negate:zn,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:Ln,once:Pn,findKey:Cn,findIndex:Jn,findLastIndex:$n,sortedIndex:Gn,indexOf:Qn,lastIndexOf:Xn,find:Yn,detect:Yn,findWhere:function(n,r){return Yn(n,yn(r))},each:Zn,forEach:Zn,map:nr,collect:nr,reduce:tr,foldl:tr,inject:tr,reduceRight:er,foldr:er,filter:ur,select:ur,reject:function(n,r,t){return ur(n,zn(jn(r)),t)},every:ir,all:ir,some:or,any:or,contains:ar,includes:ar,include:ar,invoke:fr,pluck:cr,where:function(n,r){return ur(n,yn(r))},max:lr,min:function(n,r,t){var e,u,i=1/0,o=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=X(n)?n:un(n)).length;a<f;a++)null!=(e=n[a])&&e<i&&(i=e);else r=jn(r,t),Zn(n,(function(n,t,e){((u=r(n,t,e))<o||u===1/0&&i===1/0)&&(i=n,o=u)}));return i},shuffle:function(n){return sr(n,1/0)},sample:sr,sortBy:function(n,r,t){var e=0;return r=jn(r,t),cr(nr(n,(function(n,t,u){return{value:n,index:e++,criteria:r(n,t,u)}})).sort((function(n,r){var t=n.criteria,e=r.criteria;if(t!==e){if(t>e||void 0===t)return 1;if(t<e||void 0===e)return-1}return n.index-r.index})),"value")},groupBy:vr,indexBy:hr,countBy:yr,partition:gr,toArray:function(n){return n?V(n)?o.call(n):x(n)?n.match(dr):X(n)?nr(n,hn):un(n):[]},size:function(n){return null==n?0:X(n)?n.length:Z(n).length},pick:br,omit:_r,first:wr,head:wr,take:wr,initial:jr,last:function(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[n.length-1]:xr(n,Math.max(0,n.length-r))},rest:xr,tail:xr,drop:xr,compact:function(n){return ur(n,Boolean)},flatten:function(n,r){return Fn(n,r,!1)},without:Sr,uniq:Or,unique:Or,union:Mr,intersection:function(n){for(var r=[],t=arguments.length,e=0,u=Q(n);e<u;e++){var i=n[e];if(!ar(r,i)){var o;for(o=1;o<t&&ar(arguments[o],i);o++);o===t&&r.push(i)}}return r},difference:Ar,unzip:Er,transpose:Er,zip:Br,object:function(n,r){for(var t={},e=0,u=Q(n);e<u;e++)r?t[n[e]]=r[e]:t[n[e][0]]=n[e][1];return t},range:function(n,r,t){null==r&&(r=n||0,n=0),t||(t=r<n?-1:1);for(var e=Math.max(Math.ceil((r-n)/t),0),u=Array(e),i=0;i<e;i++,n+=t)u[i]=n;return u},chunk:function(n,r){if(null==r||r<1)return[];for(var t=[],e=0,u=n.length;e<u;)t.push(o.call(n,e,e+=r));return t},mixin:Dr,default:rn});return Ir._=Ir,Ir}));{"version":3,"sources":["modules/_setup.js","modules/restArguments.js","modules/isObject.js","modules/isBoolean.js","modules/_tagTester.js","modules/isString.js","modules/isNumber.js","modules/isDate.js","modules/isRegExp.js","modules/isError.js","modules/isSymbol.js","modules/isMap.js","modules/isWeakMap.js","modules/isSet.js","modules/isWeakSet.js","modules/isArrayBuffer.js","modules/isDataView.js","modules/isArray.js","modules/isFunction.js","modules/_has.js","modules/isArguments.js","modules/isNaN.js","modules/constant.js","modules/_createSizePropertyCheck.js","modules/_shallowProperty.js","modules/_getByteLength.js","modules/_isBufferLike.js","modules/isTypedArray.js","modules/_getLength.js","modules/_isArrayLike.js","modules/_collectNonEnumProps.js","modules/keys.js","modules/isMatch.js","modules/underscore.js","modules/isEqual.js","modules/allKeys.js","modules/values.js","modules/invert.js","modules/functions.js","modules/_createAssigner.js","modules/extend.js","modules/extendOwn.js","modules/defaults.js","modules/_baseCreate.js","modules/clone.js","modules/identity.js","modules/matcher.js","modules/_deepGet.js","modules/property.js","modules/_optimizeCb.js","modules/_baseIteratee.js","modules/iteratee.js","modules/_cb.js","modules/random.js","modules/now.js","modules/_createEscaper.js","modules/_escapeMap.js","modules/escape.js","modules/unescape.js","modules/_unescapeMap.js","modules/templateSettings.js","modules/template.js","modules/uniqueId.js","modules/_executeBound.js","modules/partial.js","modules/bind.js","modules/_flatten.js","modules/bindAll.js","modules/delay.js","modules/defer.js","modules/negate.js","modules/before.js","modules/once.js","modules/findKey.js","modules/_createPredicateIndexFinder.js","modules/findIndex.js","modules/findLastIndex.js","modules/sortedIndex.js","modules/_createIndexFinder.js","modules/indexOf.js","modules/lastIndexOf.js","modules/find.js","modules/each.js","modules/map.js","modules/_createReduce.js","modules/reduce.js","modules/reduceRight.js","modules/filter.js","modules/every.js","modules/some.js","modules/contains.js","modules/invoke.js","modules/pluck.js","modules/max.js","modules/sample.js","modules/_group.js","modules/groupBy.js","modules/indexBy.js","modules/countBy.js","modules/partition.js","modules/toArray.js","modules/_keyInObj.js","modules/pick.js","modules/omit.js","modules/initial.js","modules/first.js","modules/rest.js","modules/difference.js","modules/without.js","modules/uniq.js","modules/union.js","modules/unzip.js","modules/zip.js","modules/_chainResult.js","modules/mixin.js","modules/underscore-array-methods.js","modules/index-default.js","modules/isNull.js","modules/isUndefined.js","modules/isElement.js","modules/isFinite.js","modules/isEmpty.js","modules/pairs.js","modules/create.js","modules/tap.js","modules/has.js","modules/mapObject.js","modules/noop.js","modules/propertyOf.js","modules/times.js","modules/result.js","modules/chain.js","modules/memoize.js","modules/throttle.js","modules/debounce.js","modules/wrap.js","modules/compose.js","modules/after.js","modules/findWhere.js","modules/reject.js","modules/where.js","modules/min.js","modules/shuffle.js","modules/sortBy.js","modules/size.js","modules/last.js","modules/compact.js","modules/flatten.js","modules/intersection.js","modules/object.js","modules/range.js","modules/chunk.js"],"names":["VERSION","root","self","global","Function","ArrayProto","Array","prototype","ObjProto","Object","SymbolProto","Symbol","push","slice","toString","hasOwnProperty","supportsArrayBuffer","ArrayBuffer","nativeIsArray","isArray","nativeKeys","keys","nativeCreate","create","nativeIsView","isView","_isNaN","isNaN","_isFinite","isFinite","hasEnumBug","propertyIsEnumerable","nonEnumerableProps","MAX_ARRAY_INDEX","Math","pow","restArguments","func","startIndex","length","max","arguments","rest","index","call","this","args","apply","isObject","obj","type","isBoolean","tagTester","name","isString","isNumber","isDate","isRegExp","isError","isSymbol","isMap","isWeakMap","isSet","isWeakSet","isArrayBuffer","isDataView","isFunction","nodelist","document","childNodes","Int8Array","isFunction$1","has","key","isArguments","isArguments$1","constant","value","createSizePropertyCheck","getSizeProperty","collection","sizeProperty","shallowProperty","getByteLength","isBufferLike","typedArrayPattern","isTypedArray$1","test","getLength","isArrayLike","collectNonEnumProps","hash","l","i","contains","emulatedSet","nonEnumIdx","constructor","proto","prop","isMatch","object","attrs","_keys","_","_wrapped","eq","a","b","aStack","bStack","deepEq","className","valueOf","DataView","byteLength","getUint8","isTypedArray","buffer","areArrays","aCtor","bCtor","pop","allKeys","values","invert","result","functions","names","sort","createAssigner","keysFunc","defaults","source","toJSON","String","extend","extendOwn","baseCreate","Ctor","clone","identity","matcher","deepGet","path","property","optimizeCb","context","argCount","accumulator","baseIteratee","iteratee","Infinity","cb","random","min","floor","now","Date","getTime","createEscaper","map","escaper","match","join","testRegexp","RegExp","replaceRegexp","string","replace","escapeMap","&","<",">","\"","'","`","_escape","_unescape","templateSettings","evaluate","interpolate","escape","noMatch","escapes","\\","\r","\n","â€¨","â€©","escapeRegExp","escapeChar","idCounter","executeBound","sourceFunc","boundFunc","callingContext","partial","boundArgs","placeholder","bound","position","bind","TypeError","callArgs","concat","flatten","input","depth","strict","output","idx","j","len","bindAll","Error","delay","wait","setTimeout","defer","negate","predicate","before","times","memo","once","findKey","createPredicateIndexFinder","dir","array","findIndex","findLastIndex","sortedIndex","low","high","mid","createIndexFinder","predicateFind","item","indexOf","lastIndexOf","find","each","results","currentKey","createReduce","reducer","initial","reduce","reduceRight","filter","list","every","some","fromIndex","guard","invoke","contextPath","method","pluck","computed","lastComputed","v","sample","n","last","rand","temp","group","behavior","partition","groupBy","indexBy","countBy","pass","reStrSymbol","keyInObj","pick","omit","first","difference","without","otherArrays","uniq","isSorted","seen","union","arrays","unzip","zip","chainResult","instance","_chain","chain","mixin","nodeType","parseFloat","pairs","props","interceptor","_has","accum","text","settings","oldSettings","render","offset","variable","e","template","data","argument","fallback","prefix","id","hasher","memoize","cache","address","options","timeout","previous","later","leading","throttled","_now","remaining","clearTimeout","trailing","cancel","immediate","debounced","callNow","wrapper","start","criteria","left","right","Boolean","_flatten","argsLength","stop","step","ceil","range","count"],"mappings":"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"}(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  typeof define === 'function' && define.amd ? define('underscore', factory) :
  (global = global || self, (function () {
    var current = global._;
    var exports = global._ = factory();
    exports.noConflict = function () { global._ = current; return exports; };
  }()));
}(this, (function () {
  //     Underscore.js 1.11.0
  //     https://underscorejs.org
  //     (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
  //     Underscore may be freely distributed under the MIT license.

  // Current version.
  var VERSION = '1.11.0';

  // Establish the root object, `window` (`self`) in the browser, `global`
  // on the server, or `this` in some virtual machines. We use `self`
  // instead of `window` for `WebWorker` support.
  var root = typeof self == 'object' && self.self === self && self ||
            typeof global == 'object' && global.global === global && global ||
            Function('return this')() ||
            {};

  // Save bytes in the minified (but not gzipped) version:
  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;

  // Create quick reference variables for speed access to core prototypes.
  var push = ArrayProto.push,
      slice = ArrayProto.slice,
      toString = ObjProto.toString,
      hasOwnProperty = ObjProto.hasOwnProperty;

  // Modern feature detection.
  var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined';

  // All **ECMAScript 5+** native function implementations that we hope to use
  // are declared here.
  var nativeIsArray = Array.isArray,
      nativeKeys = Object.keys,
      nativeCreate = Object.create,
      nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;

  // Create references to these builtin functions because we override them.
  var _isNaN = isNaN,
      _isFinite = isFinite;

  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

  // The largest integer that can be represented exactly.
  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;

  // Some functions take a variable number of arguments, or a few expected
  // arguments at the beginning and then a variable number of values to operate
  // on. This helper accumulates all remaining arguments past the functionâ€™s
  // argument length (or an explicit `startIndex`), into an array that becomes
  // the last argument. Similar to ES6â€™s "rest parameter".
  function restArguments(func, startIndex) {
    startIndex = startIndex == null ? func.length - 1 : +startIndex;
    return function() {
      var length = Math.max(arguments.length - startIndex, 0),
          rest = Array(length),
          index = 0;
      for (; index < length; index++) {
        rest[index] = arguments[index + startIndex];
      }
      switch (startIndex) {
        case 0: return func.call(this, rest);
        case 1: return func.call(this, arguments[0], rest);
        case 2: return func.call(this, arguments[0], arguments[1], rest);
      }
      var args = Array(startIndex + 1);
      for (index = 0; index < startIndex; index++) {
        args[index] = arguments[index];
      }
      args[startIndex] = rest;
      return func.apply(this, args);
    };
  }

  // Is a given variable an object?
  function isObject(obj) {
    var type = typeof obj;
    return type === 'function' || type === 'object' && !!obj;
  }

  // Is a given value equal to null?
  function isNull(obj) {
    return obj === null;
  }

  // Is a given variable undefined?
  function isUndefined(obj) {
    return obj === void 0;
  }

  // Is a given value a boolean?
  function isBoolean(obj) {
    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
  }

  // Is a given value a DOM element?
  function isElement(obj) {
    return !!(obj && obj.nodeType === 1);
  }

  // Internal function for creating a `toString`-based type tester.
  function tagTester(name) {
    return function(obj) {
      return toString.call(obj) === '[object ' + name + ']';
    };
  }

  var isString = tagTester('String');

  var isNumber = tagTester('Number');

  var isDate = tagTester('Date');

  var isRegExp = tagTester('RegExp');

  var isError = tagTester('Error');

  var isSymbol = tagTester('Symbol');

  var isMap = tagTester('Map');

  var isWeakMap = tagTester('WeakMap');

  var isSet = tagTester('Set');

  var isWeakSet = tagTester('WeakSet');

  var isArrayBuffer = tagTester('ArrayBuffer');

  var isDataView = tagTester('DataView');

  // Is a given value an array?
  // Delegates to ECMA5's native `Array.isArray`.
  var isArray = nativeIsArray || tagTester('Array');

  var isFunction = tagTester('Function');

  // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
  // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
  var nodelist = root.document && root.document.childNodes;
  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
    isFunction = function(obj) {
      return typeof obj == 'function' || false;
    };
  }

  var isFunction$1 = isFunction;

  // Internal function to check whether `key` is an own property name of `obj`.
  function has(obj, key) {
    return obj != null && hasOwnProperty.call(obj, key);
  }

  var isArguments = tagTester('Arguments');

  // Define a fallback version of the method in browsers (ahem, IE < 9), where
  // there isn't any inspectable "Arguments" type.
  (function() {
    if (!isArguments(arguments)) {
      isArguments = function(obj) {
        return has(obj, 'callee');
      };
    }
  }());

  var isArguments$1 = isArguments;

  // Is a given object a finite number?
  function isFinite$1(obj) {
    return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
  }

  // Is the given value `NaN`?
  function isNaN$1(obj) {
    return isNumber(obj) && _isNaN(obj);
  }

  // Predicate-generating function. Often useful outside of Underscore.
  function constant(value) {
    return function() {
      return value;
    };
  }

  // Common internal logic for `isArrayLike` and `isBufferLike`.
  function createSizePropertyCheck(getSizeProperty) {
    return function(collection) {
      var sizeProperty = getSizeProperty(collection);
      return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
    }
  }

  // Internal helper to generate a function to obtain property `key` from `obj`.
  function shallowProperty(key) {
    return function(obj) {
      return obj == null ? void 0 : obj[key];
    };
  }

  // Internal helper to obtain the `byteLength` property of an object.
  var getByteLength = shallowProperty('byteLength');

  // Internal helper to determine whether we should spend extensive checks against
  // `ArrayBuffer` et al.
  var isBufferLike = createSizePropertyCheck(getByteLength);

  // Is a given value a typed array?
  var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
  function isTypedArray(obj) {
    // `ArrayBuffer.isView` is the most future-proof, so use it when available.
    // Otherwise, fall back on the above regular expression.
    return nativeIsView ? (nativeIsView(obj) && !isDataView(obj)) :
                  isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
  }

  var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);

  // Internal helper to obtain the `length` property of an object.
  var getLength = shallowProperty('length');

  // Internal helper for collection methods to determine whether a collection
  // should be iterated as an array or as an object.
  // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
  var isArrayLike = createSizePropertyCheck(getLength);

  // Internal helper to create a simple lookup structure.
  // `collectNonEnumProps` used to depend on `_.contains`, but this led to
  // circular imports. `emulatedSet` is a one-off solution that only works for
  // arrays of strings.
  function emulatedSet(keys) {
    var hash = {};
    for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
    return {
      contains: function(key) { return hash[key]; },
      push: function(key) {
        hash[key] = true;
        return keys.push(key);
      }
    };
  }

  // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
  // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
  // needed.
  function collectNonEnumProps(obj, keys) {
    keys = emulatedSet(keys);
    var nonEnumIdx = nonEnumerableProps.length;
    var constructor = obj.constructor;
    var proto = isFunction$1(constructor) && constructor.prototype || ObjProto;

    // Constructor is a special case.
    var prop = 'constructor';
    if (has(obj, prop) && !keys.contains(prop)) keys.push(prop);

    while (nonEnumIdx--) {
      prop = nonEnumerableProps[nonEnumIdx];
      if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
        keys.push(prop);
      }
    }
  }

  // Retrieve the names of an object's own properties.
  // Delegates to **ECMAScript 5**'s native `Object.keys`.
  function keys(obj) {
    if (!isObject(obj)) return [];
    if (nativeKeys) return nativeKeys(obj);
    var keys = [];
    for (var key in obj) if (has(obj, key)) keys.push(key);
    // Ahem, IE < 9.
    if (hasEnumBug) collectNonEnumProps(obj, keys);
    return keys;
  }

  // Is a given array, string, or object empty?
  // An "empty" object has no enumerable own-properties.
  function isEmpty(obj) {
    if (obj == null) return true;
    // Skip the more expensive `toString`-based type checks if `obj` has no
    // `.length`.
    if (isArrayLike(obj) && (isArray(obj) || isString(obj) || isArguments$1(obj))) return obj.length === 0;
    return keys(obj).length === 0;
  }

  // Returns whether an object has a given set of `key:value` pairs.
  function isMatch(object, attrs) {
    var _keys = keys(attrs), length = _keys.length;
    if (object == null) return !length;
    var obj = Object(object);
    for (var i = 0; i < length; i++) {
      var key = _keys[i];
      if (attrs[key] !== obj[key] || !(key in obj)) return false;
    }
    return true;
  }

  // If Underscore is called as a function, it returns a wrapped object that can
  // be used OO-style. This wrapper holds altered versions of all functions added
  // through `_.mixin`. Wrapped objects may be chained.
  function _(obj) {
    if (obj instanceof _) return obj;
    if (!(this instanceof _)) return new _(obj);
    this._wrapped = obj;
  }

  _.VERSION = VERSION;

  // Extracts the result from a wrapped and chained object.
  _.prototype.value = function() {
    return this._wrapped;
  };

  // Provide unwrapping proxies for some methods used in engine operations
  // such as arithmetic and JSON stringification.
  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;

  _.prototype.toString = function() {
    return String(this._wrapped);
  };

  // Internal recursive comparison function for `_.isEqual`.
  function eq(a, b, aStack, bStack) {
    // Identical objects are equal. `0 === -0`, but they aren't identical.
    // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
    if (a === b) return a !== 0 || 1 / a === 1 / b;
    // `null` or `undefined` only equal to itself (strict comparison).
    if (a == null || b == null) return false;
    // `NaN`s are equivalent, but non-reflexive.
    if (a !== a) return b !== b;
    // Exhaust primitive checks
    var type = typeof a;
    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
    return deepEq(a, b, aStack, bStack);
  }

  // Internal recursive comparison function for `_.isEqual`.
  function deepEq(a, b, aStack, bStack) {
    // Unwrap any wrapped objects.
    if (a instanceof _) a = a._wrapped;
    if (b instanceof _) b = b._wrapped;
    // Compare `[[Class]]` names.
    var className = toString.call(a);
    if (className !== toString.call(b)) return false;
    switch (className) {
      // These types are compared by value.
      case '[object RegExp]':
        // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
      case '[object String]':
        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
        // equivalent to `new String("5")`.
        return '' + a === '' + b;
      case '[object Number]':
        // `NaN`s are equivalent, but non-reflexive.
        // Object(NaN) is equivalent to NaN.
        if (+a !== +a) return +b !== +b;
        // An `egal` comparison is performed for other numeric values.
        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
      case '[object Date]':
      case '[object Boolean]':
        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
        // millisecond representations. Note that invalid dates with millisecond representations
        // of `NaN` are not equivalent.
        return +a === +b;
      case '[object Symbol]':
        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
      case '[object ArrayBuffer]':
        // Coerce to `DataView` so we can fall through to the next case.
        return deepEq(new DataView(a), new DataView(b), aStack, bStack);
      case '[object DataView]':
        var byteLength = getByteLength(a);
        if (byteLength !== getByteLength(b)) {
          return false;
        }
        while (byteLength--) {
          if (a.getUint8(byteLength) !== b.getUint8(byteLength)) {
            return false;
          }
        }
        return true;
    }

    if (isTypedArray$1(a)) {
      // Coerce typed arrays to `DataView`.
      return deepEq(new DataView(a.buffer), new DataView(b.buffer), aStack, bStack);
    }

    var areArrays = className === '[object Array]';
    if (!areArrays) {
      if (typeof a != 'object' || typeof b != 'object') return false;

      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
      // from different frames are.
      var aCtor = a.constructor, bCtor = b.constructor;
      if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
                               isFunction$1(bCtor) && bCtor instanceof bCtor)
                          && ('constructor' in a && 'constructor' in b)) {
        return false;
      }
    }
    // Assume equality for cyclic structures. The algorithm for detecting cyclic
    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.

    // Initializing stack of traversed objects.
    // It's done here since we only need them for objects and arrays comparison.
    aStack = aStack || [];
    bStack = bStack || [];
    var length = aStack.length;
    while (length--) {
      // Linear search. Performance is inversely proportional to the number of
      // unique nested structures.
      if (aStack[length] === a) return bStack[length] === b;
    }

    // Add the first object to the stack of traversed objects.
    aStack.push(a);
    bStack.push(b);

    // Recursively compare objects and arrays.
    if (areArrays) {
      // Compare array lengths to determine if a deep comparison is necessary.
      length = a.length;
      if (length !== b.length) return false;
      // Deep compare the contents, ignoring non-numeric properties.
      while (length--) {
        if (!eq(a[length], b[length], aStack, bStack)) return false;
      }
    } else {
      // Deep compare objects.
      var _keys = keys(a), key;
      length = _keys.length;
      // Ensure that both objects contain the same number of properties before comparing deep equality.
      if (keys(b).length !== length) return false;
      while (length--) {
        // Deep compare each member
        key = _keys[length];
        if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
      }
    }
    // Remove the first object from the stack of traversed objects.
    aStack.pop();
    bStack.pop();
    return true;
  }

  // Perform a deep comparison to check if two objects are equal.
  function isEqual(a, b) {
    return eq(a, b);
  }

  // Retrieve all the enumerable property names of an object.
  function allKeys(obj) {
    if (!isObject(obj)) return [];
    var keys = [];
    for (var key in obj) keys.push(key);
    // Ahem, IE < 9.
    if (hasEnumBug) collectNonEnumProps(obj, keys);
    return keys;
  }

  // Retrieve the values of an object's properties.
  function values(obj) {
    var _keys = keys(obj);
    var length = _keys.length;
    var values = Array(length);
    for (var i = 0; i < length; i++) {
      values[i] = obj[_keys[i]];
    }
    return values;
  }

  // Convert an object into a list of `[key, value]` pairs.
  // The opposite of `_.object` with one argument.
  function pairs(obj) {
    var _keys = keys(obj);
    var length = _keys.length;
    var pairs = Array(length);
    for (var i = 0; i < length; i++) {
      pairs[i] = [_keys[i], obj[_keys[i]]];
    }
    return pairs;
  }

  // Invert the keys and values of an object. The values must be serializable.
  function invert(obj) {
    var result = {};
    var _keys = keys(obj);
    for (var i = 0, length = _keys.length; i < length; i++) {
      result[obj[_keys[i]]] = _keys[i];
    }
    return result;
  }

  // Return a sorted list of the function names available on the object.
  function functions(obj) {
    var names = [];
    for (var key in obj) {
      if (isFunction$1(obj[key])) names.push(key);
    }
    return names.sort();
  }

  // An internal function for creating assigner functions.
  function createAssigner(keysFunc, defaults) {
    return function(obj) {
      var length = arguments.length;
      if (defaults) obj = Object(obj);
      if (length < 2 || obj == null) return obj;
      for (var index = 1; index < length; index++) {
        var source = arguments[index],
            keys = keysFunc(source),
            l = keys.length;
        for (var i = 0; i < l; i++) {
          var key = keys[i];
          if (!defaults || obj[key] === void 0) obj[key] = source[key];
        }
      }
      return obj;
    };
  }

  // Extend a given object with all the properties in passed-in object(s).
  var extend = createAssigner(allKeys);

  // Assigns a given object with all the own properties in the passed-in
  // object(s).
  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
  var extendOwn = createAssigner(keys);

  // Fill in a given object with default properties.
  var defaults = createAssigner(allKeys, true);

  // Create a naked function reference for surrogate-prototype-swapping.
  function ctor() {
    return function(){};
  }

  // An internal function for creating a new object that inherits from another.
  function baseCreate(prototype) {
    if (!isObject(prototype)) return {};
    if (nativeCreate) return nativeCreate(prototype);
    var Ctor = ctor();
    Ctor.prototype = prototype;
    var result = new Ctor;
    Ctor.prototype = null;
    return result;
  }

  // Creates an object that inherits from the given prototype object.
  // If additional properties are provided then they will be added to the
  // created object.
  function create(prototype, props) {
    var result = baseCreate(prototype);
    if (props) extendOwn(result, props);
    return result;
  }

  // Create a (shallow-cloned) duplicate of an object.
  function clone(obj) {
    if (!isObject(obj)) return obj;
    return isArray(obj) ? obj.slice() : extend({}, obj);
  }

  // Invokes `interceptor` with the `obj` and then returns `obj`.
  // The primary purpose of this method is to "tap into" a method chain, in
  // order to perform operations on intermediate results within the chain.
  function tap(obj, interceptor) {
    interceptor(obj);
    return obj;
  }

  // Shortcut function for checking if an object has a given property directly on
  // itself (in other words, not on a prototype). Unlike the internal `has`
  // function, this public version can also traverse nested properties.
  function has$1(obj, path) {
    if (!isArray(path)) {
      return has(obj, path);
    }
    var length = path.length;
    for (var i = 0; i < length; i++) {
      var key = path[i];
      if (obj == null || !hasOwnProperty.call(obj, key)) {
        return false;
      }
      obj = obj[key];
    }
    return !!length;
  }

  // Keep the identity function around for default iteratees.
  function identity(value) {
    return value;
  }

  // Returns a predicate for checking whether an object has a given set of
  // `key:value` pairs.
  function matcher(attrs) {
    attrs = extendOwn({}, attrs);
    return function(obj) {
      return isMatch(obj, attrs);
    };
  }

  // Internal function to obtain a nested property in `obj` along `path`.
  function deepGet(obj, path) {
    var length = path.length;
    for (var i = 0; i < length; i++) {
      if (obj == null) return void 0;
      obj = obj[path[i]];
    }
    return length ? obj : void 0;
  }

  // Creates a function that, when passed an object, will traverse that objectâ€™s
  // properties down the given `path`, specified as an array of keys or indices.
  function property(path) {
    if (!isArray(path)) {
      return shallowProperty(path);
    }
    return function(obj) {
      return deepGet(obj, path);
    };
  }

  // Internal function that returns an efficient (for current engines) version
  // of the passed-in callback, to be repeatedly applied in other Underscore
  // functions.
  function optimizeCb(func, context, argCount) {
    if (context === void 0) return func;
    switch (argCount == null ? 3 : argCount) {
      case 1: return function(value) {
        return func.call(context, value);
      };
      // The 2-argument case is omitted because weâ€™re not using it.
      case 3: return function(value, index, collection) {
        return func.call(context, value, index, collection);
      };
      case 4: return function(accumulator, value, index, collection) {
        return func.call(context, accumulator, value, index, collection);
      };
    }
    return function() {
      return func.apply(context, arguments);
    };
  }

  // An internal function to generate callbacks that can be applied to each
  // element in a collection, returning the desired result â€” either `_.identity`,
  // an arbitrary callback, a property matcher, or a property accessor.
  function baseIteratee(value, context, argCount) {
    if (value == null) return identity;
    if (isFunction$1(value)) return optimizeCb(value, context, argCount);
    if (isObject(value) && !isArray(value)) return matcher(value);
    return property(value);
  }

  // External wrapper for our callback generator. Users may customize
  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
  // This abstraction hides the internal-only `argCount` argument.
  function iteratee(value, context) {
    return baseIteratee(value, context, Infinity);
  }
  _.iteratee = iteratee;

  // The function we call internally to generate a callback. It invokes
  // `_.iteratee` if overridden, otherwise `baseIteratee`.
  function cb(value, context, argCount) {
    if (_.iteratee !== iteratee) return _.iteratee(value, context);
    return baseIteratee(value, context, argCount);
  }

  // Returns the results of applying the `iteratee` to each element of `obj`.
  // In contrast to `_.map` it returns an object.
  function mapObject(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    var _keys = keys(obj),
        length = _keys.length,
        results = {};
    for (var index = 0; index < length; index++) {
      var currentKey = _keys[index];
      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  }

  // Predicate-generating function. Often useful outside of Underscore.
  function noop(){}

  // Generates a function for a given object that returns a given property.
  function propertyOf(obj) {
    if (obj == null) {
      return function(){};
    }
    return function(path) {
      return !isArray(path) ? obj[path] : deepGet(obj, path);
    };
  }

  // Run a function **n** times.
  function times(n, iteratee, context) {
    var accum = Array(Math.max(0, n));
    iteratee = optimizeCb(iteratee, context, 1);
    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
    return accum;
  }

  // Return a random integer between `min` and `max` (inclusive).
  function random(min, max) {
    if (max == null) {
      max = min;
      min = 0;
    }
    return min + Math.floor(Math.random() * (max - min + 1));
  }

  // A (possibly faster) way to get the current timestamp as an integer.
  var now = Date.now || function() {
    return new Date().getTime();
  };

  // Internal helper to generate functions for escaping and unescaping strings
  // to/from HTML interpolation.
  function createEscaper(map) {
    var escaper = function(match) {
      return map[match];
    };
    // Regexes for identifying a key that needs to be escaped.
    var source = '(?:' + keys(map).join('|') + ')';
    var testRegexp = RegExp(source);
    var replaceRegexp = RegExp(source, 'g');
    return function(string) {
      string = string == null ? '' : '' + string;
      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
    };
  }

  // Internal list of HTML entities for escaping.
  var escapeMap = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#x27;',
    '`': '&#x60;'
  };

  // Function for escaping strings to HTML interpolation.
  var _escape = createEscaper(escapeMap);

  // Internal list of HTML entities for unescaping.
  var unescapeMap = invert(escapeMap);

  // Function for unescaping strings from HTML interpolation.
  var _unescape = createEscaper(unescapeMap);

  // By default, Underscore uses ERB-style template delimiters. Change the
  // following template settings to use alternative delimiters.
  var templateSettings = _.templateSettings = {
    evaluate: /<%([\s\S]+?)%>/g,
    interpolate: /<%=([\s\S]+?)%>/g,
    escape: /<%-([\s\S]+?)%>/g
  };

  // When customizing `_.templateSettings`, if you don't want to define an
  // interpolation, evaluation or escaping regex, we need one that is
  // guaranteed not to match.
  var noMatch = /(.)^/;

  // Certain characters need to be escaped so that they can be put into a
  // string literal.
  var escapes = {
    "'": "'",
    '\\': '\\',
    '\r': 'r',
    '\n': 'n',
    '\u2028': 'u2028',
    '\u2029': 'u2029'
  };

  var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;

  function escapeChar(match) {
    return '\\' + escapes[match];
  }

  // JavaScript micro-templating, similar to John Resig's implementation.
  // Underscore templating handles arbitrary delimiters, preserves whitespace,
  // and correctly escapes quotes within interpolated code.
  // NB: `oldSettings` only exists for backwards compatibility.
  function template(text, settings, oldSettings) {
    if (!settings && oldSettings) settings = oldSettings;
    settings = defaults({}, settings, _.templateSettings);

    // Combine delimiters into one regular expression via alternation.
    var matcher = RegExp([
      (settings.escape || noMatch).source,
      (settings.interpolate || noMatch).source,
      (settings.evaluate || noMatch).source
    ].join('|') + '|$', 'g');

    // Compile the template source, escaping string literals appropriately.
    var index = 0;
    var source = "__p+='";
    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
      index = offset + match.length;

      if (escape) {
        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
      } else if (interpolate) {
        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
      } else if (evaluate) {
        source += "';\n" + evaluate + "\n__p+='";
      }

      // Adobe VMs need the match returned to produce the correct offset.
      return match;
    });
    source += "';\n";

    // If a variable is not specified, place data values in local scope.
    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';

    source = "var __t,__p='',__j=Array.prototype.join," +
      "print=function(){__p+=__j.call(arguments,'');};\n" +
      source + 'return __p;\n';

    var render;
    try {
      render = new Function(settings.variable || 'obj', '_', source);
    } catch (e) {
      e.source = source;
      throw e;
    }

    var template = function(data) {
      return render.call(this, data, _);
    };

    // Provide the compiled source as a convenience for precompilation.
    var argument = settings.variable || 'obj';
    template.source = 'function(' + argument + '){\n' + source + '}';

    return template;
  }

  // Traverses the children of `obj` along `path`. If a child is a function, it
  // is invoked with its parent as context. Returns the value of the final
  // child, or `fallback` if any child is undefined.
  function result(obj, path, fallback) {
    if (!isArray(path)) path = [path];
    var length = path.length;
    if (!length) {
      return isFunction$1(fallback) ? fallback.call(obj) : fallback;
    }
    for (var i = 0; i < length; i++) {
      var prop = obj == null ? void 0 : obj[path[i]];
      if (prop === void 0) {
        prop = fallback;
        i = length; // Ensure we don't continue iterating.
      }
      obj = isFunction$1(prop) ? prop.call(obj) : prop;
    }
    return obj;
  }

  // Generate a unique integer id (unique within the entire client session).
  // Useful for temporary DOM ids.
  var idCounter = 0;
  function uniqueId(prefix) {
    var id = ++idCounter + '';
    return prefix ? prefix + id : id;
  }

  // Start chaining a wrapped Underscore object.
  function chain(obj) {
    var instance = _(obj);
    instance._chain = true;
    return instance;
  }

  // Internal function to execute `sourceFunc` bound to `context` with optional
  // `args`. Determines whether to execute a function as a constructor or as a
  // normal function.
  function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
    var self = baseCreate(sourceFunc.prototype);
    var result = sourceFunc.apply(self, args);
    if (isObject(result)) return result;
    return self;
  }

  // Partially apply a function by creating a version that has had some of its
  // arguments pre-filled, without changing its dynamic `this` context. `_` acts
  // as a placeholder by default, allowing any combination of arguments to be
  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
  var partial = restArguments(function(func, boundArgs) {
    var placeholder = partial.placeholder;
    var bound = function() {
      var position = 0, length = boundArgs.length;
      var args = Array(length);
      for (var i = 0; i < length; i++) {
        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
      }
      while (position < arguments.length) args.push(arguments[position++]);
      return executeBound(func, bound, this, this, args);
    };
    return bound;
  });

  partial.placeholder = _;

  // Create a function bound to a given object (assigning `this`, and arguments,
  // optionally).
  var bind = restArguments(function(func, context, args) {
    if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
    var bound = restArguments(function(callArgs) {
      return executeBound(func, bound, context, this, args.concat(callArgs));
    });
    return bound;
  });

  // Internal implementation of a recursive `flatten` function.
  function flatten(input, depth, strict, output) {
    output = output || [];
    if (!depth && depth !== 0) {
      depth = Infinity;
    } else if (depth <= 0) {
      return output.concat(input);
    }
    var idx = output.length;
    for (var i = 0, length = getLength(input); i < length; i++) {
      var value = input[i];
      if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
        // Flatten current level of array or arguments object.
        if (depth > 1) {
          flatten(value, depth - 1, strict, output);
          idx = output.length;
        } else {
          var j = 0, len = value.length;
          while (j < len) output[idx++] = value[j++];
        }
      } else if (!strict) {
        output[idx++] = value;
      }
    }
    return output;
  }

  // Bind a number of an object's methods to that object. Remaining arguments
  // are the method names to be bound. Useful for ensuring that all callbacks
  // defined on an object belong to it.
  var bindAll = restArguments(function(obj, keys) {
    keys = flatten(keys, false, false);
    var index = keys.length;
    if (index < 1) throw new Error('bindAll must be passed function names');
    while (index--) {
      var key = keys[index];
      obj[key] = bind(obj[key], obj);
    }
    return obj;
  });

  // Memoize an expensive function by storing its results.
  function memoize(func, hasher) {
    var memoize = function(key) {
      var cache = memoize.cache;
      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
      if (!has(cache, address)) cache[address] = func.apply(this, arguments);
      return cache[address];
    };
    memoize.cache = {};
    return memoize;
  }

  // Delays a function for the given number of milliseconds, and then calls
  // it with the arguments supplied.
  var delay = restArguments(function(func, wait, args) {
    return setTimeout(function() {
      return func.apply(null, args);
    }, wait);
  });

  // Defers a function, scheduling it to run after the current call stack has
  // cleared.
  var defer = partial(delay, _, 1);

  // Returns a function, that, when invoked, will only be triggered at most once
  // during a given window of time. Normally, the throttled function will run
  // as much as it can, without ever going more than once per `wait` duration;
  // but if you'd like to disable the execution on the leading edge, pass
  // `{leading: false}`. To disable execution on the trailing edge, ditto.
  function throttle(func, wait, options) {
    var timeout, context, args, result;
    var previous = 0;
    if (!options) options = {};

    var later = function() {
      previous = options.leading === false ? 0 : now();
      timeout = null;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    };

    var throttled = function() {
      var _now = now();
      if (!previous && options.leading === false) previous = _now;
      var remaining = wait - (_now - previous);
      context = this;
      args = arguments;
      if (remaining <= 0 || remaining > wait) {
        if (timeout) {
          clearTimeout(timeout);
          timeout = null;
        }
        previous = _now;
        result = func.apply(context, args);
        if (!timeout) context = args = null;
      } else if (!timeout && options.trailing !== false) {
        timeout = setTimeout(later, remaining);
      }
      return result;
    };

    throttled.cancel = function() {
      clearTimeout(timeout);
      previous = 0;
      timeout = context = args = null;
    };

    return throttled;
  }

  // When a sequence of calls of the returned function ends, the argument
  // function is triggered. The end of a sequence is defined by the `wait`
  // parameter. If `immediate` is passed, the argument function will be
  // triggered at the beginning of the sequence instead of at the end.
  function debounce(func, wait, immediate) {
    var timeout, result;

    var later = function(context, args) {
      timeout = null;
      if (args) result = func.apply(context, args);
    };

    var debounced = restArguments(function(args) {
      if (timeout) clearTimeout(timeout);
      if (immediate) {
        var callNow = !timeout;
        timeout = setTimeout(later, wait);
        if (callNow) result = func.apply(this, args);
      } else {
        timeout = delay(later, wait, this, args);
      }

      return result;
    });

    debounced.cancel = function() {
      clearTimeout(timeout);
      timeout = null;
    };

    return debounced;
  }

  // Returns the first function passed as an argument to the second,
  // allowing you to adjust arguments, run code before and after, and
  // conditionally execute the original function.
  function wrap(func, wrapper) {
    return partial(wrapper, func);
  }

  // Returns a negated version of the passed-in predicate.
  function negate(predicate) {
    return function() {
      return !predicate.apply(this, arguments);
    };
  }

  // Returns a function that is the composition of a list of functions, each
  // consuming the return value of the function that follows.
  function compose() {
    var args = arguments;
    var start = args.length - 1;
    return function() {
      var i = start;
      var result = args[start].apply(this, arguments);
      while (i--) result = args[i].call(this, result);
      return result;
    };
  }

  // Returns a function that will only be executed on and after the Nth call.
  function after(times, func) {
    return function() {
      if (--times < 1) {
        return func.apply(this, arguments);
      }
    };
  }

  // Returns a function that will only be executed up to (but not including) the
  // Nth call.
  function before(times, func) {
    var memo;
    return function() {
      if (--times > 0) {
        memo = func.apply(this, arguments);
      }
      if (times <= 1) func = null;
      return memo;
    };
  }

  // Returns a function that will be executed at most one time, no matter how
  // often you call it. Useful for lazy initialization.
  var once = partial(before, 2);

  // Returns the first key on an object that passes a truth test.
  function findKey(obj, predicate, context) {
    predicate = cb(predicate, context);
    var _keys = keys(obj), key;
    for (var i = 0, length = _keys.length; i < length; i++) {
      key = _keys[i];
      if (predicate(obj[key], key, obj)) return key;
    }
  }

  // Internal function to generate `_.findIndex` and `_.findLastIndex`.
  function createPredicateIndexFinder(dir) {
    return function(array, predicate, context) {
      predicate = cb(predicate, context);
      var length = getLength(array);
      var index = dir > 0 ? 0 : length - 1;
      for (; index >= 0 && index < length; index += dir) {
        if (predicate(array[index], index, array)) return index;
      }
      return -1;
    };
  }

  // Returns the first index on an array-like that passes a truth test.
  var findIndex = createPredicateIndexFinder(1);

  // Returns the last index on an array-like that passes a truth test.
  var findLastIndex = createPredicateIndexFinder(-1);

  // Use a comparator function to figure out the smallest index at which
  // an object should be inserted so as to maintain order. Uses binary search.
  function sortedIndex(array, obj, iteratee, context) {
    iteratee = cb(iteratee, context, 1);
    var value = iteratee(obj);
    var low = 0, high = getLength(array);
    while (low < high) {
      var mid = Math.floor((low + high) / 2);
      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
    }
    return low;
  }

  // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
  function createIndexFinder(dir, predicateFind, sortedIndex) {
    return function(array, item, idx) {
      var i = 0, length = getLength(array);
      if (typeof idx == 'number') {
        if (dir > 0) {
          i = idx >= 0 ? idx : Math.max(idx + length, i);
        } else {
          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
        }
      } else if (sortedIndex && idx && length) {
        idx = sortedIndex(array, item);
        return array[idx] === item ? idx : -1;
      }
      if (item !== item) {
        idx = predicateFind(slice.call(array, i, length), isNaN$1);
        return idx >= 0 ? idx + i : -1;
      }
      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
        if (array[idx] === item) return idx;
      }
      return -1;
    };
  }

  // Return the position of the first occurrence of an item in an array,
  // or -1 if the item is not included in the array.
  // If the array is large and already in sort order, pass `true`
  // for **isSorted** to use binary search.
  var indexOf = createIndexFinder(1, findIndex, sortedIndex);

  // Return the position of the last occurrence of an item in an array,
  // or -1 if the item is not included in the array.
  var lastIndexOf = createIndexFinder(-1, findLastIndex);

  // Return the first value which passes a truth test.
  function find(obj, predicate, context) {
    var keyFinder = isArrayLike(obj) ? findIndex : findKey;
    var key = keyFinder(obj, predicate, context);
    if (key !== void 0 && key !== -1) return obj[key];
  }

  // Convenience version of a common use case of `_.find`: getting the first
  // object containing specific `key:value` pairs.
  function findWhere(obj, attrs) {
    return find(obj, matcher(attrs));
  }

  // The cornerstone for collection functions, an `each`
  // implementation, aka `forEach`.
  // Handles raw objects in addition to array-likes. Treats all
  // sparse array-likes as if they were dense.
  function each(obj, iteratee, context) {
    iteratee = optimizeCb(iteratee, context);
    var i, length;
    if (isArrayLike(obj)) {
      for (i = 0, length = obj.length; i < length; i++) {
        iteratee(obj[i], i, obj);
      }
    } else {
      var _keys = keys(obj);
      for (i = 0, length = _keys.length; i < length; i++) {
        iteratee(obj[_keys[i]], _keys[i], obj);
      }
    }
    return obj;
  }

  // Return the results of applying the iteratee to each element.
  function map(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    var _keys = !isArrayLike(obj) && keys(obj),
        length = (_keys || obj).length,
        results = Array(length);
    for (var index = 0; index < length; index++) {
      var currentKey = _keys ? _keys[index] : index;
      results[index] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  }

  // Internal helper to create a reducing function, iterating left or right.
  function createReduce(dir) {
    // Wrap code that reassigns argument variables in a separate function than
    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
    var reducer = function(obj, iteratee, memo, initial) {
      var _keys = !isArrayLike(obj) && keys(obj),
          length = (_keys || obj).length,
          index = dir > 0 ? 0 : length - 1;
      if (!initial) {
        memo = obj[_keys ? _keys[index] : index];
        index += dir;
      }
      for (; index >= 0 && index < length; index += dir) {
        var currentKey = _keys ? _keys[index] : index;
        memo = iteratee(memo, obj[currentKey], currentKey, obj);
      }
      return memo;
    };

    return function(obj, iteratee, memo, context) {
      var initial = arguments.length >= 3;
      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
    };
  }

  // **Reduce** builds up a single result from a list of values, aka `inject`,
  // or `foldl`.
  var reduce = createReduce(1);

  // The right-associative version of reduce, also known as `foldr`.
  var reduceRight = createReduce(-1);

  // Return all the elements that pass a truth test.
  function filter(obj, predicate, context) {
    var results = [];
    predicate = cb(predicate, context);
    each(obj, function(value, index, list) {
      if (predicate(value, index, list)) results.push(value);
    });
    return results;
  }

  // Return all the elements for which a truth test fails.
  function reject(obj, predicate, context) {
    return filter(obj, negate(cb(predicate)), context);
  }

  // Determine whether all of the elements pass a truth test.
  function every(obj, predicate, context) {
    predicate = cb(predicate, context);
    var _keys = !isArrayLike(obj) && keys(obj),
        length = (_keys || obj).length;
    for (var index = 0; index < length; index++) {
      var currentKey = _keys ? _keys[index] : index;
      if (!predicate(obj[currentKey], currentKey, obj)) return false;
    }
    return true;
  }

  // Determine if at least one element in the object passes a truth test.
  function some(obj, predicate, context) {
    predicate = cb(predicate, context);
    var _keys = !isArrayLike(obj) && keys(obj),
        length = (_keys || obj).length;
    for (var index = 0; index < length; index++) {
      var currentKey = _keys ? _keys[index] : index;
      if (predicate(obj[currentKey], currentKey, obj)) return true;
    }
    return false;
  }

  // Determine if the array or object contains a given item (using `===`).
  function contains(obj, item, fromIndex, guard) {
    if (!isArrayLike(obj)) obj = values(obj);
    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
    return indexOf(obj, item, fromIndex) >= 0;
  }

  // Invoke a method (with arguments) on every item in a collection.
  var invoke = restArguments(function(obj, path, args) {
    var contextPath, func;
    if (isFunction$1(path)) {
      func = path;
    } else if (isArray(path)) {
      contextPath = path.slice(0, -1);
      path = path[path.length - 1];
    }
    return map(obj, function(context) {
      var method = func;
      if (!method) {
        if (contextPath && contextPath.length) {
          context = deepGet(context, contextPath);
        }
        if (context == null) return void 0;
        method = context[path];
      }
      return method == null ? method : method.apply(context, args);
    });
  });

  // Convenience version of a common use case of `_.map`: fetching a property.
  function pluck(obj, key) {
    return map(obj, property(key));
  }

  // Convenience version of a common use case of `_.filter`: selecting only
  // objects containing specific `key:value` pairs.
  function where(obj, attrs) {
    return filter(obj, matcher(attrs));
  }

  // Return the maximum element (or element-based computation).
  function max(obj, iteratee, context) {
    var result = -Infinity, lastComputed = -Infinity,
        value, computed;
    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
      obj = isArrayLike(obj) ? obj : values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value != null && value > result) {
          result = value;
        }
      }
    } else {
      iteratee = cb(iteratee, context);
      each(obj, function(v, index, list) {
        computed = iteratee(v, index, list);
        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
          result = v;
          lastComputed = computed;
        }
      });
    }
    return result;
  }

  // Return the minimum element (or element-based computation).
  function min(obj, iteratee, context) {
    var result = Infinity, lastComputed = Infinity,
        value, computed;
    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
      obj = isArrayLike(obj) ? obj : values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value != null && value < result) {
          result = value;
        }
      }
    } else {
      iteratee = cb(iteratee, context);
      each(obj, function(v, index, list) {
        computed = iteratee(v, index, list);
        if (computed < lastComputed || computed === Infinity && result === Infinity) {
          result = v;
          lastComputed = computed;
        }
      });
    }
    return result;
  }

  // Sample **n** random values from a collection using the modern version of the
  // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisherâ€“Yates_shuffle).
  // If **n** is not specified, returns a single random element.
  // The internal `guard` argument allows it to work with `_.map`.
  function sample(obj, n, guard) {
    if (n == null || guard) {
      if (!isArrayLike(obj)) obj = values(obj);
      return obj[random(obj.length - 1)];
    }
    var sample = isArrayLike(obj) ? clone(obj) : values(obj);
    var length = getLength(sample);
    n = Math.max(Math.min(n, length), 0);
    var last = length - 1;
    for (var index = 0; index < n; index++) {
      var rand = random(index, last);
      var temp = sample[index];
      sample[index] = sample[rand];
      sample[rand] = temp;
    }
    return sample.slice(0, n);
  }

  // Shuffle a collection.
  function shuffle(obj) {
    return sample(obj, Infinity);
  }

  // Sort the object's values by a criterion produced by an iteratee.
  function sortBy(obj, iteratee, context) {
    var index = 0;
    iteratee = cb(iteratee, context);
    return pluck(map(obj, function(value, key, list) {
      return {
        value: value,
        index: index++,
        criteria: iteratee(value, key, list)
      };
    }).sort(function(left, right) {
      var a = left.criteria;
      var b = right.criteria;
      if (a !== b) {
        if (a > b || a === void 0) return 1;
        if (a < b || b === void 0) return -1;
      }
      return left.index - right.index;
    }), 'value');
  }

  // An internal function used for aggregate "group by" operations.
  function group(behavior, partition) {
    return function(obj, iteratee, context) {
      var result = partition ? [[], []] : {};
      iteratee = cb(iteratee, context);
      each(obj, function(value, index) {
        var key = iteratee(value, index, obj);
        behavior(result, value, key);
      });
      return result;
    };
  }

  // Groups the object's values by a criterion. Pass either a string attribute
  // to group by, or a function that returns the criterion.
  var groupBy = group(function(result, value, key) {
    if (has(result, key)) result[key].push(value); else result[key] = [value];
  });

  // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
  // when you know that your index values will be unique.
  var indexBy = group(function(result, value, key) {
    result[key] = value;
  });

  // Counts instances of an object that group by a certain criterion. Pass
  // either a string attribute to count by, or a function that returns the
  // criterion.
  var countBy = group(function(result, value, key) {
    if (has(result, key)) result[key]++; else result[key] = 1;
  });

  // Split a collection into two arrays: one whose elements all pass the given
  // truth test, and one whose elements all do not pass the truth test.
  var partition = group(function(result, value, pass) {
    result[pass ? 0 : 1].push(value);
  }, true);

  // Safely create a real, live array from anything iterable.
  var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
  function toArray(obj) {
    if (!obj) return [];
    if (isArray(obj)) return slice.call(obj);
    if (isString(obj)) {
      // Keep surrogate pair characters together.
      return obj.match(reStrSymbol);
    }
    if (isArrayLike(obj)) return map(obj, identity);
    return values(obj);
  }

  // Return the number of elements in a collection.
  function size(obj) {
    if (obj == null) return 0;
    return isArrayLike(obj) ? obj.length : keys(obj).length;
  }

  // Internal `_.pick` helper function to determine whether `key` is an enumerable
  // property name of `obj`.
  function keyInObj(value, key, obj) {
    return key in obj;
  }

  // Return a copy of the object only containing the allowed properties.
  var pick = restArguments(function(obj, keys) {
    var result = {}, iteratee = keys[0];
    if (obj == null) return result;
    if (isFunction$1(iteratee)) {
      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
      keys = allKeys(obj);
    } else {
      iteratee = keyInObj;
      keys = flatten(keys, false, false);
      obj = Object(obj);
    }
    for (var i = 0, length = keys.length; i < length; i++) {
      var key = keys[i];
      var value = obj[key];
      if (iteratee(value, key, obj)) result[key] = value;
    }
    return result;
  });

  // Return a copy of the object without the disallowed properties.
  var omit = restArguments(function(obj, keys) {
    var iteratee = keys[0], context;
    if (isFunction$1(iteratee)) {
      iteratee = negate(iteratee);
      if (keys.length > 1) context = keys[1];
    } else {
      keys = map(flatten(keys, false, false), String);
      iteratee = function(value, key) {
        return !contains(keys, key);
      };
    }
    return pick(obj, iteratee, context);
  });

  // Returns everything but the last entry of the array. Especially useful on
  // the arguments object. Passing **n** will return all the values in
  // the array, excluding the last N.
  function initial(array, n, guard) {
    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
  }

  // Get the first element of an array. Passing **n** will return the first N
  // values in the array. The **guard** check allows it to work with `_.map`.
  function first(array, n, guard) {
    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
    if (n == null || guard) return array[0];
    return initial(array, array.length - n);
  }

  // Returns everything but the first entry of the `array`. Especially useful on
  // the `arguments` object. Passing an **n** will return the rest N values in the
  // `array`.
  function rest(array, n, guard) {
    return slice.call(array, n == null || guard ? 1 : n);
  }

  // Get the last element of an array. Passing **n** will return the last N
  // values in the array.
  function last(array, n, guard) {
    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
    if (n == null || guard) return array[array.length - 1];
    return rest(array, Math.max(0, array.length - n));
  }

  // Trim out all falsy values from an array.
  function compact(array) {
    return filter(array, Boolean);
  }

  // Flatten out an array, either recursively (by default), or up to `depth`.
  // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
  function flatten$1(array, depth) {
    return flatten(array, depth, false);
  }

  // Take the difference between one array and a number of other arrays.
  // Only the elements present in just the first array will remain.
  var difference = restArguments(function(array, rest) {
    rest = flatten(rest, true, true);
    return filter(array, function(value){
      return !contains(rest, value);
    });
  });

  // Return a version of the array that does not contain the specified value(s).
  var without = restArguments(function(array, otherArrays) {
    return difference(array, otherArrays);
  });

  // Produce a duplicate-free version of the array. If the array has already
  // been sorted, you have the option of using a faster algorithm.
  // The faster algorithm will not work with an iteratee if the iteratee
  // is not a one-to-one function, so providing an iteratee will disable
  // the faster algorithm.
  function uniq(array, isSorted, iteratee, context) {
    if (!isBoolean(isSorted)) {
      context = iteratee;
      iteratee = isSorted;
      isSorted = false;
    }
    if (iteratee != null) iteratee = cb(iteratee, context);
    var result = [];
    var seen = [];
    for (var i = 0, length = getLength(array); i < length; i++) {
      var value = array[i],
          computed = iteratee ? iteratee(value, i, array) : value;
      if (isSorted && !iteratee) {
        if (!i || seen !== computed) result.push(value);
        seen = computed;
      } else if (iteratee) {
        if (!contains(seen, computed)) {
          seen.push(computed);
          result.push(value);
        }
      } else if (!contains(result, value)) {
        result.push(value);
      }
    }
    return result;
  }

  // Produce an array that contains the union: each distinct element from all of
  // the passed-in arrays.
  var union = restArguments(function(arrays) {
    return uniq(flatten(arrays, true, true));
  });

  // Produce an array that contains every item shared between all the
  // passed-in arrays.
  function intersection(array) {
    var result = [];
    var argsLength = arguments.length;
    for (var i = 0, length = getLength(array); i < length; i++) {
      var item = array[i];
      if (contains(result, item)) continue;
      var j;
      for (j = 1; j < argsLength; j++) {
        if (!contains(arguments[j], item)) break;
      }
      if (j === argsLength) result.push(item);
    }
    return result;
  }

  // Complement of zip. Unzip accepts an array of arrays and groups
  // each array's elements on shared indices.
  function unzip(array) {
    var length = array && max(array, getLength).length || 0;
    var result = Array(length);

    for (var index = 0; index < length; index++) {
      result[index] = pluck(array, index);
    }
    return result;
  }

  // Zip together multiple lists into a single array -- elements that share
  // an index go together.
  var zip = restArguments(unzip);

  // Converts lists into objects. Pass either a single array of `[key, value]`
  // pairs, or two parallel arrays of the same length -- one of keys, and one of
  // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
  function object(list, values) {
    var result = {};
    for (var i = 0, length = getLength(list); i < length; i++) {
      if (values) {
        result[list[i]] = values[i];
      } else {
        result[list[i][0]] = list[i][1];
      }
    }
    return result;
  }

  // Generate an integer Array containing an arithmetic progression. A port of
  // the native Python `range()` function. See
  // [the Python documentation](https://docs.python.org/library/functions.html#range).
  function range(start, stop, step) {
    if (stop == null) {
      stop = start || 0;
      start = 0;
    }
    if (!step) {
      step = stop < start ? -1 : 1;
    }

    var length = Math.max(Math.ceil((stop - start) / step), 0);
    var range = Array(length);

    for (var idx = 0; idx < length; idx++, start += step) {
      range[idx] = start;
    }

    return range;
  }

  // Chunk a single array into multiple arrays, each containing `count` or fewer
  // items.
  function chunk(array, count) {
    if (count == null || count < 1) return [];
    var result = [];
    var i = 0, length = array.length;
    while (i < length) {
      result.push(slice.call(array, i, i += count));
    }
    return result;
  }

  // Helper function to continue chaining intermediate results.
  function chainResult(instance, obj) {
    return instance._chain ? _(obj).chain() : obj;
  }

  // Add your own custom functions to the Underscore object.
  function mixin(obj) {
    each(functions(obj), function(name) {
      var func = _[name] = obj[name];
      _.prototype[name] = function() {
        var args = [this._wrapped];
        push.apply(args, arguments);
        return chainResult(this, func.apply(_, args));
      };
    });
    return _;
  }

  // Add all mutator `Array` functions to the wrapper.
  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
    var method = ArrayProto[name];
    _.prototype[name] = function() {
      var obj = this._wrapped;
      if (obj != null) {
        method.apply(obj, arguments);
        if ((name === 'shift' || name === 'splice') && obj.length === 0) {
          delete obj[0];
        }
      }
      return chainResult(this, obj);
    };
  });

  // Add all accessor `Array` functions to the wrapper.
  each(['concat', 'join', 'slice'], function(name) {
    var method = ArrayProto[name];
    _.prototype[name] = function() {
      var obj = this._wrapped;
      if (obj != null) obj = method.apply(obj, arguments);
      return chainResult(this, obj);
    };
  });

  // Named Exports

  var allExports = {
    __proto__: null,
    VERSION: VERSION,
    restArguments: restArguments,
    isObject: isObject,
    isNull: isNull,
    isUndefined: isUndefined,
    isBoolean: isBoolean,
    isElement: isElement,
    isString: isString,
    isNumber: isNumber,
    isDate: isDate,
    isRegExp: isRegExp,
    isError: isError,
    isSymbol: isSymbol,
    isMap: isMap,
    isWeakMap: isWeakMap,
    isSet: isSet,
    isWeakSet: isWeakSet,
    isArrayBuffer: isArrayBuffer,
    isDataView: isDataView,
    isArray: isArray,
    isFunction: isFunction$1,
    isArguments: isArguments$1,
    isFinite: isFinite$1,
    isNaN: isNaN$1,
    isTypedArray: isTypedArray$1,
    isEmpty: isEmpty,
    isMatch: isMatch,
    isEqual: isEqual,
    keys: keys,
    allKeys: allKeys,
    values: values,
    pairs: pairs,
    invert: invert,
    functions: functions,
    methods: functions,
    extend: extend,
    extendOwn: extendOwn,
    assign: extendOwn,
    defaults: defaults,
    create: create,
    clone: clone,
    tap: tap,
    has: has$1,
    mapObject: mapObject,
    identity: identity,
    constant: constant,
    noop: noop,
    property: property,
    propertyOf: propertyOf,
    matcher: matcher,
    matches: matcher,
    times: times,
    random: random,
    now: now,
    escape: _escape,
    unescape: _unescape,
    templateSettings: templateSettings,
    template: template,
    result: result,
    uniqueId: uniqueId,
    chain: chain,
    iteratee: iteratee,
    partial: partial,
    bind: bind,
    bindAll: bindAll,
    memoize: memoize,
    delay: delay,
    defer: defer,
    throttle: throttle,
    debounce: debounce,
    wrap: wrap,
    negate: negate,
    compose: compose,
    after: after,
    before: before,
    once: once,
    findKey: findKey,
    findIndex: findIndex,
    findLastIndex: findLastIndex,
    sortedIndex: sortedIndex,
    indexOf: indexOf,
    lastIndexOf: lastIndexOf,
    find: find,
    detect: find,
    findWhere: findWhere,
    each: each,
    forEach: each,
    map: map,
    collect: map,
    reduce: reduce,
    foldl: reduce,
    inject: reduce,
    reduceRight: reduceRight,
    foldr: reduceRight,
    filter: filter,
    select: filter,
    reject: reject,
    every: every,
    all: every,
    some: some,
    any: some,
    contains: contains,
    includes: contains,
    include: contains,
    invoke: invoke,
    pluck: pluck,
    where: where,
    max: max,
    min: min,
    shuffle: shuffle,
    sample: sample,
    sortBy: sortBy,
    groupBy: groupBy,
    indexBy: indexBy,
    countBy: countBy,
    partition: partition,
    toArray: toArray,
    size: size,
    pick: pick,
    omit: omit,
    first: first,
    head: first,
    take: first,
    initial: initial,
    last: last,
    rest: rest,
    tail: rest,
    drop: rest,
    compact: compact,
    flatten: flatten$1,
    without: without,
    uniq: uniq,
    unique: uniq,
    union: union,
    intersection: intersection,
    difference: difference,
    unzip: unzip,
    transpose: unzip,
    zip: zip,
    object: object,
    range: range,
    chunk: chunk,
    mixin: mixin,
    'default': _
  };

  // Default Export

  // Add all of the Underscore functions to the wrapper object.
  var _$1 = mixin(allExports);
  // Legacy Node.js API.
  _$1._ = _$1;

  return _$1;

})));
//# sourceMappingURL=underscore.js.map
{"version":3,"file":"underscore.js","sources":["modules/_setup.js","modules/restArguments.js","modules/isObject.js","modules/isNull.js","modules/isUndefined.js","modules/isBoolean.js","modules/isElement.js","modules/_tagTester.js","modules/isString.js","modules/isNumber.js","modules/isDate.js","modules/isRegExp.js","modules/isError.js","modules/isSymbol.js","modules/isMap.js","modules/isWeakMap.js","modules/isSet.js","modules/isWeakSet.js","modules/isArrayBuffer.js","modules/isDataView.js","modules/isArray.js","modules/isFunction.js","modules/_has.js","modules/isArguments.js","modules/isFinite.js","modules/isNaN.js","modules/constant.js","modules/_createSizePropertyCheck.js","modules/_shallowProperty.js","modules/_getByteLength.js","modules/_isBufferLike.js","modules/isTypedArray.js","modules/_getLength.js","modules/_isArrayLike.js","modules/_collectNonEnumProps.js","modules/keys.js","modules/isEmpty.js","modules/isMatch.js","modules/underscore.js","modules/isEqual.js","modules/allKeys.js","modules/values.js","modules/pairs.js","modules/invert.js","modules/functions.js","modules/_createAssigner.js","modules/extend.js","modules/extendOwn.js","modules/defaults.js","modules/_baseCreate.js","modules/create.js","modules/clone.js","modules/tap.js","modules/has.js","modules/identity.js","modules/matcher.js","modules/_deepGet.js","modules/property.js","modules/_optimizeCb.js","modules/_baseIteratee.js","modules/iteratee.js","modules/_cb.js","modules/mapObject.js","modules/noop.js","modules/propertyOf.js","modules/times.js","modules/random.js","modules/now.js","modules/_createEscaper.js","modules/_escapeMap.js","modules/escape.js","modules/_unescapeMap.js","modules/unescape.js","modules/templateSettings.js","modules/template.js","modules/result.js","modules/uniqueId.js","modules/chain.js","modules/_executeBound.js","modules/partial.js","modules/bind.js","modules/_flatten.js","modules/bindAll.js","modules/memoize.js","modules/delay.js","modules/defer.js","modules/throttle.js","modules/debounce.js","modules/wrap.js","modules/negate.js","modules/compose.js","modules/after.js","modules/before.js","modules/once.js","modules/findKey.js","modules/_createPredicateIndexFinder.js","modules/findIndex.js","modules/findLastIndex.js","modules/sortedIndex.js","modules/_createIndexFinder.js","modules/indexOf.js","modules/lastIndexOf.js","modules/find.js","modules/findWhere.js","modules/each.js","modules/map.js","modules/_createReduce.js","modules/reduce.js","modules/reduceRight.js","modules/filter.js","modules/reject.js","modules/every.js","modules/some.js","modules/contains.js","modules/invoke.js","modules/pluck.js","modules/where.js","modules/max.js","modules/min.js","modules/sample.js","modules/shuffle.js","modules/sortBy.js","modules/_group.js","modules/groupBy.js","modules/indexBy.js","modules/countBy.js","modules/partition.js","modules/toArray.js","modules/size.js","modules/_keyInObj.js","modules/pick.js","modules/omit.js","modules/initial.js","modules/first.js","modules/rest.js","modules/last.js","modules/compact.js","modules/flatten.js","modules/difference.js","modules/without.js","modules/uniq.js","modules/union.js","modules/intersection.js","modules/unzip.js","modules/zip.js","modules/object.js","modules/range.js","modules/chunk.js","modules/_chainResult.js","modules/mixin.js","modules/underscore-array-methods.js","modules/index.js","modules/index-default.js"],"sourcesContent":null,"names":["isFinite","isNaN","isFunction","isArguments","isTypedArray","has","_has","flatten","_flatten","_"],"mappings":"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"}import isObject from './isObject.js';
import { nativeCreate } from './_setup.js';

// Create a naked function reference for surrogate-prototype-swapping.
function ctor() {
  return function(){};
}

// An internal function for creating a new object that inherits from another.
export default function baseCreate(prototype) {
  if (!isObject(prototype)) return {};
  if (nativeCreate) return nativeCreate(prototype);
  var Ctor = ctor();
  Ctor.prototype = prototype;
  var result = new Ctor;
  Ctor.prototype = null;
  return result;
}
import identity from './identity.js';
import isFunction from './isFunction.js';
import isObject from './isObject.js';
import isArray from './isArray.js';
import matcher from './matcher.js';
import property from './property.js';
import optimizeCb from './_optimizeCb.js';

// An internal function to generate callbacks that can be applied to each
// element in a collection, returning the desired result â€” either `_.identity`,
// an arbitrary callback, a property matcher, or a property accessor.
export default function baseIteratee(value, context, argCount) {
  if (value == null) return identity;
  if (isFunction(value)) return optimizeCb(value, context, argCount);
  if (isObject(value) && !isArray(value)) return matcher(value);
  return property(value);
}
import _ from './underscore.js';
import baseIteratee from './_baseIteratee.js';
import iteratee from './iteratee.js';

// The function we call internally to generate a callback. It invokes
// `_.iteratee` if overridden, otherwise `baseIteratee`.
export default function cb(value, context, argCount) {
  if (_.iteratee !== iteratee) return _.iteratee(value, context);
  return baseIteratee(value, context, argCount);
}
import _ from './underscore.js';

// Helper function to continue chaining intermediate results.
export default function chainResult(instance, obj) {
  return instance._chain ? _(obj).chain() : obj;
}
import { nonEnumerableProps, ObjProto } from './_setup.js';
import isFunction from './isFunction.js';
import has from './_has.js';

// Internal helper to create a simple lookup structure.
// `collectNonEnumProps` used to depend on `_.contains`, but this led to
// circular imports. `emulatedSet` is a one-off solution that only works for
// arrays of strings.
function emulatedSet(keys) {
  var hash = {};
  for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
  return {
    contains: function(key) { return hash[key]; },
    push: function(key) {
      hash[key] = true;
      return keys.push(key);
    }
  };
}

// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
// be iterated by `for key in ...` and thus missed. Extends `keys` in place if
// needed.
export default function collectNonEnumProps(obj, keys) {
  keys = emulatedSet(keys);
  var nonEnumIdx = nonEnumerableProps.length;
  var constructor = obj.constructor;
  var proto = isFunction(constructor) && constructor.prototype || ObjProto;

  // Constructor is a special case.
  var prop = 'constructor';
  if (has(obj, prop) && !keys.contains(prop)) keys.push(prop);

  while (nonEnumIdx--) {
    prop = nonEnumerableProps[nonEnumIdx];
    if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
      keys.push(prop);
    }
  }
}
// An internal function for creating assigner functions.
export default function createAssigner(keysFunc, defaults) {
  return function(obj) {
    var length = arguments.length;
    if (defaults) obj = Object(obj);
    if (length < 2 || obj == null) return obj;
    for (var index = 1; index < length; index++) {
      var source = arguments[index],
          keys = keysFunc(source),
          l = keys.length;
      for (var i = 0; i < l; i++) {
        var key = keys[i];
        if (!defaults || obj[key] === void 0) obj[key] = source[key];
      }
    }
    return obj;
  };
}
import keys from './keys.js';

// Internal helper to generate functions for escaping and unescaping strings
// to/from HTML interpolation.
export default function createEscaper(map) {
  var escaper = function(match) {
    return map[match];
  };
  // Regexes for identifying a key that needs to be escaped.
  var source = '(?:' + keys(map).join('|') + ')';
  var testRegexp = RegExp(source);
  var replaceRegexp = RegExp(source, 'g');
  return function(string) {
    string = string == null ? '' : '' + string;
    return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
  };
}
import getLength from './_getLength.js';
import { slice } from './_setup.js';
import isNaN from './isNaN.js';

// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
export default function createIndexFinder(dir, predicateFind, sortedIndex) {
  return function(array, item, idx) {
    var i = 0, length = getLength(array);
    if (typeof idx == 'number') {
      if (dir > 0) {
        i = idx >= 0 ? idx : Math.max(idx + length, i);
      } else {
        length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
      }
    } else if (sortedIndex && idx && length) {
      idx = sortedIndex(array, item);
      return array[idx] === item ? idx : -1;
    }
    if (item !== item) {
      idx = predicateFind(slice.call(array, i, length), isNaN);
      return idx >= 0 ? idx + i : -1;
    }
    for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
      if (array[idx] === item) return idx;
    }
    return -1;
  };
}
import cb from './_cb.js';
import getLength from './_getLength.js';

// Internal function to generate `_.findIndex` and `_.findLastIndex`.
export default function createPredicateIndexFinder(dir) {
  return function(array, predicate, context) {
    predicate = cb(predicate, context);
    var length = getLength(array);
    var index = dir > 0 ? 0 : length - 1;
    for (; index >= 0 && index < length; index += dir) {
      if (predicate(array[index], index, array)) return index;
    }
    return -1;
  };
}
import isArrayLike from './_isArrayLike.js';
import keys from './keys.js';
import optimizeCb from './_optimizeCb.js';

// Internal helper to create a reducing function, iterating left or right.
export default function createReduce(dir) {
  // Wrap code that reassigns argument variables in a separate function than
  // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
  var reducer = function(obj, iteratee, memo, initial) {
    var _keys = !isArrayLike(obj) && keys(obj),
        length = (_keys || obj).length,
        index = dir > 0 ? 0 : length - 1;
    if (!initial) {
      memo = obj[_keys ? _keys[index] : index];
      index += dir;
    }
    for (; index >= 0 && index < length; index += dir) {
      var currentKey = _keys ? _keys[index] : index;
      memo = iteratee(memo, obj[currentKey], currentKey, obj);
    }
    return memo;
  };

  return function(obj, iteratee, memo, context) {
    var initial = arguments.length >= 3;
    return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
  };
}
import { MAX_ARRAY_INDEX } from './_setup.js';

// Common internal logic for `isArrayLike` and `isBufferLike`.
export default function createSizePropertyCheck(getSizeProperty) {
  return function(collection) {
    var sizeProperty = getSizeProperty(collection);
    return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
  }
}
// Internal function to obtain a nested property in `obj` along `path`.
export default function deepGet(obj, path) {
  var length = path.length;
  for (var i = 0; i < length; i++) {
    if (obj == null) return void 0;
    obj = obj[path[i]];
  }
  return length ? obj : void 0;
}
// Internal list of HTML entities for escaping.
export default {
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&quot;',
  "'": '&#x27;',
  '`': '&#x60;'
};
import baseCreate from './_baseCreate.js';
import isObject from './isObject.js';

// Internal function to execute `sourceFunc` bound to `context` with optional
// `args`. Determines whether to execute a function as a constructor or as a
// normal function.
export default function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
  if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
  var self = baseCreate(sourceFunc.prototype);
  var result = sourceFunc.apply(self, args);
  if (isObject(result)) return result;
  return self;
}
import getLength from './_getLength.js';
import isArrayLike from './_isArrayLike.js';
import isArray from './isArray.js';
import isArguments from './isArguments.js';

// Internal implementation of a recursive `flatten` function.
export default function flatten(input, depth, strict, output) {
  output = output || [];
  if (!depth && depth !== 0) {
    depth = Infinity;
  } else if (depth <= 0) {
    return output.concat(input);
  }
  var idx = output.length;
  for (var i = 0, length = getLength(input); i < length; i++) {
    var value = input[i];
    if (isArrayLike(value) && (isArray(value) || isArguments(value))) {
      // Flatten current level of array or arguments object.
      if (depth > 1) {
        flatten(value, depth - 1, strict, output);
        idx = output.length;
      } else {
        var j = 0, len = value.length;
        while (j < len) output[idx++] = value[j++];
      }
    } else if (!strict) {
      output[idx++] = value;
    }
  }
  return output;
}
import shallowProperty from './_shallowProperty.js';

// Internal helper to obtain the `byteLength` property of an object.
export default shallowProperty('byteLength');
import shallowProperty from './_shallowProperty.js';

// Internal helper to obtain the `length` property of an object.
export default shallowProperty('length');
import cb from './_cb.js';
import each from './each.js';

// An internal function used for aggregate "group by" operations.
export default function group(behavior, partition) {
  return function(obj, iteratee, context) {
    var result = partition ? [[], []] : {};
    iteratee = cb(iteratee, context);
    each(obj, function(value, index) {
      var key = iteratee(value, index, obj);
      behavior(result, value, key);
    });
    return result;
  };
}
import { hasOwnProperty } from './_setup.js';

// Internal function to check whether `key` is an own property name of `obj`.
export default function has(obj, key) {
  return obj != null && hasOwnProperty.call(obj, key);
}
import createSizePropertyCheck from './_createSizePropertyCheck.js';
import getLength from './_getLength.js';

// Internal helper for collection methods to determine whether a collection
// should be iterated as an array or as an object.
// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
export default createSizePropertyCheck(getLength);
import createSizePropertyCheck from './_createSizePropertyCheck.js';
import getByteLength from './_getByteLength.js';

// Internal helper to determine whether we should spend extensive checks against
// `ArrayBuffer` et al.
export default createSizePropertyCheck(getByteLength);
// Internal `_.pick` helper function to determine whether `key` is an enumerable
// property name of `obj`.
export default function keyInObj(value, key, obj) {
  return key in obj;
}
// Internal function that returns an efficient (for current engines) version
// of the passed-in callback, to be repeatedly applied in other Underscore
// functions.
export default function optimizeCb(func, context, argCount) {
  if (context === void 0) return func;
  switch (argCount == null ? 3 : argCount) {
    case 1: return function(value) {
      return func.call(context, value);
    };
    // The 2-argument case is omitted because weâ€™re not using it.
    case 3: return function(value, index, collection) {
      return func.call(context, value, index, collection);
    };
    case 4: return function(accumulator, value, index, collection) {
      return func.call(context, accumulator, value, index, collection);
    };
  }
  return function() {
    return func.apply(context, arguments);
  };
}
// Current version.
export var VERSION = '1.11.0';

// Establish the root object, `window` (`self`) in the browser, `global`
// on the server, or `this` in some virtual machines. We use `self`
// instead of `window` for `WebWorker` support.
export var root = typeof self == 'object' && self.self === self && self ||
          typeof global == 'object' && global.global === global && global ||
          Function('return this')() ||
          {};

// Save bytes in the minified (but not gzipped) version:
export var ArrayProto = Array.prototype, ObjProto = Object.prototype;
export var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;

// Create quick reference variables for speed access to core prototypes.
export var push = ArrayProto.push,
    slice = ArrayProto.slice,
    toString = ObjProto.toString,
    hasOwnProperty = ObjProto.hasOwnProperty;

// Modern feature detection.
export var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined';

// All **ECMAScript 5+** native function implementations that we hope to use
// are declared here.
export var nativeIsArray = Array.isArray,
    nativeKeys = Object.keys,
    nativeCreate = Object.create,
    nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;

// Create references to these builtin functions because we override them.
export var _isNaN = isNaN,
    _isFinite = isFinite;

// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
export var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
export var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
  'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

// The largest integer that can be represented exactly.
export var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
// Internal helper to generate a function to obtain property `key` from `obj`.
export default function shallowProperty(key) {
  return function(obj) {
    return obj == null ? void 0 : obj[key];
  };
}
import { toString } from './_setup.js';

// Internal function for creating a `toString`-based type tester.
export default function tagTester(name) {
  return function(obj) {
    return toString.call(obj) === '[object ' + name + ']';
  };
}
import invert from './invert.js';
import escapeMap from './_escapeMap.js';

// Internal list of HTML entities for unescaping.
export default invert(escapeMap);
// Returns a function that will only be executed on and after the Nth call.
export default function after(times, func) {
  return function() {
    if (--times < 1) {
      return func.apply(this, arguments);
    }
  };
}
import isObject from './isObject.js';
import { hasEnumBug } from './_setup.js';
import collectNonEnumProps from './_collectNonEnumProps.js';

// Retrieve all the enumerable property names of an object.
export default function allKeys(obj) {
  if (!isObject(obj)) return [];
  var keys = [];
  for (var key in obj) keys.push(key);
  // Ahem, IE < 9.
  if (hasEnumBug) collectNonEnumProps(obj, keys);
  return keys;
}
// Returns a function that will only be executed up to (but not including) the
// Nth call.
export default function before(times, func) {
  var memo;
  return function() {
    if (--times > 0) {
      memo = func.apply(this, arguments);
    }
    if (times <= 1) func = null;
    return memo;
  };
}
import restArguments from './restArguments.js';
import isFunction from './isFunction.js';
import executeBound from './_executeBound.js';

// Create a function bound to a given object (assigning `this`, and arguments,
// optionally).
export default restArguments(function(func, context, args) {
  if (!isFunction(func)) throw new TypeError('Bind must be called on a function');
  var bound = restArguments(function(callArgs) {
    return executeBound(func, bound, context, this, args.concat(callArgs));
  });
  return bound;
});
import restArguments from './restArguments.js';
import flatten from './_flatten.js';
import bind from './bind.js';

// Bind a number of an object's methods to that object. Remaining arguments
// are the method names to be bound. Useful for ensuring that all callbacks
// defined on an object belong to it.
export default restArguments(function(obj, keys) {
  keys = flatten(keys, false, false);
  var index = keys.length;
  if (index < 1) throw new Error('bindAll must be passed function names');
  while (index--) {
    var key = keys[index];
    obj[key] = bind(obj[key], obj);
  }
  return obj;
});
import _ from './underscore.js';

// Start chaining a wrapped Underscore object.
export default function chain(obj) {
  var instance = _(obj);
  instance._chain = true;
  return instance;
}
import { slice } from './_setup.js';

// Chunk a single array into multiple arrays, each containing `count` or fewer
// items.
export default function chunk(array, count) {
  if (count == null || count < 1) return [];
  var result = [];
  var i = 0, length = array.length;
  while (i < length) {
    result.push(slice.call(array, i, i += count));
  }
  return result;
}
import isObject from './isObject.js';
import isArray from './isArray.js';
import extend from './extend.js';

// Create a (shallow-cloned) duplicate of an object.
export default function clone(obj) {
  if (!isObject(obj)) return obj;
  return isArray(obj) ? obj.slice() : extend({}, obj);
}
import filter from './filter.js';

// Trim out all falsy values from an array.
export default function compact(array) {
  return filter(array, Boolean);
}
// Returns a function that is the composition of a list of functions, each
// consuming the return value of the function that follows.
export default function compose() {
  var args = arguments;
  var start = args.length - 1;
  return function() {
    var i = start;
    var result = args[start].apply(this, arguments);
    while (i--) result = args[i].call(this, result);
    return result;
  };
}
// Predicate-generating function. Often useful outside of Underscore.
export default function constant(value) {
  return function() {
    return value;
  };
}
import isArrayLike from './_isArrayLike.js';
import values from './values.js';
import indexOf from './indexOf.js';

// Determine if the array or object contains a given item (using `===`).
export default function contains(obj, item, fromIndex, guard) {
  if (!isArrayLike(obj)) obj = values(obj);
  if (typeof fromIndex != 'number' || guard) fromIndex = 0;
  return indexOf(obj, item, fromIndex) >= 0;
}
import group from './_group.js';
import has from './_has.js';

// Counts instances of an object that group by a certain criterion. Pass
// either a string attribute to count by, or a function that returns the
// criterion.
export default group(function(result, value, key) {
  if (has(result, key)) result[key]++; else result[key] = 1;
});
import baseCreate from './_baseCreate.js';
import extendOwn from './extendOwn.js';

// Creates an object that inherits from the given prototype object.
// If additional properties are provided then they will be added to the
// created object.
export default function create(prototype, props) {
  var result = baseCreate(prototype);
  if (props) extendOwn(result, props);
  return result;
}
import restArguments from './restArguments.js';
import delay from './delay.js';

// When a sequence of calls of the returned function ends, the argument
// function is triggered. The end of a sequence is defined by the `wait`
// parameter. If `immediate` is passed, the argument function will be
// triggered at the beginning of the sequence instead of at the end.
export default function debounce(func, wait, immediate) {
  var timeout, result;

  var later = function(context, args) {
    timeout = null;
    if (args) result = func.apply(context, args);
  };

  var debounced = restArguments(function(args) {
    if (timeout) clearTimeout(timeout);
    if (immediate) {
      var callNow = !timeout;
      timeout = setTimeout(later, wait);
      if (callNow) result = func.apply(this, args);
    } else {
      timeout = delay(later, wait, this, args);
    }

    return result;
  });

  debounced.cancel = function() {
    clearTimeout(timeout);
    timeout = null;
  };

  return debounced;
}
import createAssigner from './_createAssigner.js';
import allKeys from './allKeys.js';

// Fill in a given object with default properties.
export default createAssigner(allKeys, true);
import partial from './partial.js';
import delay from './delay.js';
import _ from './underscore.js';

// Defers a function, scheduling it to run after the current call stack has
// cleared.
export default partial(delay, _, 1);
import restArguments from './restArguments.js';

// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
export default restArguments(function(func, wait, args) {
  return setTimeout(function() {
    return func.apply(null, args);
  }, wait);
});
import restArguments from './restArguments.js';
import flatten from './_flatten.js';
import filter from './filter.js';
import contains from './contains.js';

// Take the difference between one array and a number of other arrays.
// Only the elements present in just the first array will remain.
export default restArguments(function(array, rest) {
  rest = flatten(rest, true, true);
  return filter(array, function(value){
    return !contains(rest, value);
  });
});
import optimizeCb from './_optimizeCb.js';
import isArrayLike from './_isArrayLike.js';
import keys from './keys.js';

// The cornerstone for collection functions, an `each`
// implementation, aka `forEach`.
// Handles raw objects in addition to array-likes. Treats all
// sparse array-likes as if they were dense.
export default function each(obj, iteratee, context) {
  iteratee = optimizeCb(iteratee, context);
  var i, length;
  if (isArrayLike(obj)) {
    for (i = 0, length = obj.length; i < length; i++) {
      iteratee(obj[i], i, obj);
    }
  } else {
    var _keys = keys(obj);
    for (i = 0, length = _keys.length; i < length; i++) {
      iteratee(obj[_keys[i]], _keys[i], obj);
    }
  }
  return obj;
}
import createEscaper from './_createEscaper.js';
import escapeMap from './_escapeMap.js';

// Function for escaping strings to HTML interpolation.
export default createEscaper(escapeMap);
import cb from './_cb.js';
import isArrayLike from './_isArrayLike.js';
import keys from './keys.js';

// Determine whether all of the elements pass a truth test.
export default function every(obj, predicate, context) {
  predicate = cb(predicate, context);
  var _keys = !isArrayLike(obj) && keys(obj),
      length = (_keys || obj).length;
  for (var index = 0; index < length; index++) {
    var currentKey = _keys ? _keys[index] : index;
    if (!predicate(obj[currentKey], currentKey, obj)) return false;
  }
  return true;
}
import createAssigner from './_createAssigner.js';
import allKeys from './allKeys.js';

// Extend a given object with all the properties in passed-in object(s).
export default createAssigner(allKeys);
import createAssigner from './_createAssigner.js';
import keys from './keys.js';

// Assigns a given object with all the own properties in the passed-in
// object(s).
// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
export default createAssigner(keys);
import cb from './_cb.js';
import each from './each.js';

// Return all the elements that pass a truth test.
export default function filter(obj, predicate, context) {
  var results = [];
  predicate = cb(predicate, context);
  each(obj, function(value, index, list) {
    if (predicate(value, index, list)) results.push(value);
  });
  return results;
}
import isArrayLike from './_isArrayLike.js';
import findIndex from './findIndex.js';
import findKey from './findKey.js';

// Return the first value which passes a truth test.
export default function find(obj, predicate, context) {
  var keyFinder = isArrayLike(obj) ? findIndex : findKey;
  var key = keyFinder(obj, predicate, context);
  if (key !== void 0 && key !== -1) return obj[key];
}
import createPredicateIndexFinder from './_createPredicateIndexFinder.js';

// Returns the first index on an array-like that passes a truth test.
export default createPredicateIndexFinder(1);
import cb from './_cb.js';
import keys from './keys.js';

// Returns the first key on an object that passes a truth test.
export default function findKey(obj, predicate, context) {
  predicate = cb(predicate, context);
  var _keys = keys(obj), key;
  for (var i = 0, length = _keys.length; i < length; i++) {
    key = _keys[i];
    if (predicate(obj[key], key, obj)) return key;
  }
}
import createPredicateIndexFinder from './_createPredicateIndexFinder.js';

// Returns the last index on an array-like that passes a truth test.
export default createPredicateIndexFinder(-1);
import find from './find.js';
import matcher from './matcher.js';

// Convenience version of a common use case of `_.find`: getting the first
// object containing specific `key:value` pairs.
export default function findWhere(obj, attrs) {
  return find(obj, matcher(attrs));
}
import initial from './initial.js';

// Get the first element of an array. Passing **n** will return the first N
// values in the array. The **guard** check allows it to work with `_.map`.
export default function first(array, n, guard) {
  if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
  if (n == null || guard) return array[0];
  return initial(array, array.length - n);
}
import _flatten from './_flatten.js';

// Flatten out an array, either recursively (by default), or up to `depth`.
// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
export default function flatten(array, depth) {
  return _flatten(array, depth, false);
}
import isFunction from './isFunction.js';

// Return a sorted list of the function names available on the object.
export default function functions(obj) {
  var names = [];
  for (var key in obj) {
    if (isFunction(obj[key])) names.push(key);
  }
  return names.sort();
}
import group from './_group.js';
import has from './_has.js';

// Groups the object's values by a criterion. Pass either a string attribute
// to group by, or a function that returns the criterion.
export default group(function(result, value, key) {
  if (has(result, key)) result[key].push(value); else result[key] = [value];
});
import isArray from './isArray.js';
import _has from './_has.js';
import { hasOwnProperty } from './_setup.js';

// Shortcut function for checking if an object has a given property directly on
// itself (in other words, not on a prototype). Unlike the internal `has`
// function, this public version can also traverse nested properties.
export default function has(obj, path) {
  if (!isArray(path)) {
    return _has(obj, path);
  }
  var length = path.length;
  for (var i = 0; i < length; i++) {
    var key = path[i];
    if (obj == null || !hasOwnProperty.call(obj, key)) {
      return false;
    }
    obj = obj[key];
  }
  return !!length;
}
// Keep the identity function around for default iteratees.
export default function identity(value) {
  return value;
}
// ESM Exports
// ===========
// This module is the package entry point for ES module users. In other words,
// it is the module they are interfacing with when they import from the whole
// package instead of from a submodule, like this:
//
// ```js
// import { map } from 'underscore';
// ```
//
// The difference with `./index-default`, which is the package entry point for
// CommonJS, AMD and UMD users, is purely technical. In ES modules, named and
// default exports are considered to be siblings, so when you have a default
// export, its properties are not automatically available as named exports. For
// this reason, we re-export the named exports in addition to providing the same
// default export as in `./index-default`.
export { default } from './index-default.js';
export * from './index.js';
// Default Export
// ==============
// In this module, we mix our bundled exports into the `_` object and export
// the result. This is analogous to setting `module.exports = _` in CommonJS.
// Hence, this module is also the entry point of our UMD bundle and the package
// entry point for CommonJS and AMD users. In other words, this is (the source
// of) the module you are interfacing with when you do any of the following:
//
// ```js
// // CommonJS
// var _ = require('underscore');
//
// // AMD
// define(['underscore'], function(_) {...});
//
// // UMD in the browser
// // _ is available as a global variable
// ```
import * as allExports from './index.js';
import { mixin } from './index.js';

// Add all of the Underscore functions to the wrapper object.
var _ = mixin(allExports);
// Legacy Node.js API.
_._ = _;
// Export the Underscore API.
export default _;
// Named Exports
// =============

//     Underscore.js 1.11.0
//     https://underscorejs.org
//     (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
//     Underscore may be freely distributed under the MIT license.

// Baseline setup.
export { VERSION } from './_setup.js';
export { default as restArguments } from './restArguments.js';

// Object Functions
// ----------------
// Our most fundamental functions operate on any JavaScript object.
// Most functions in Underscore depend on at least one function in this section.

// A group of functions that check the types of core JavaScript values.
// These are often informally referred to as the "isType" functions.
export { default as isObject } from './isObject.js';
export { default as isNull } from './isNull.js';
export { default as isUndefined } from './isUndefined.js';
export { default as isBoolean } from './isBoolean.js';
export { default as isElement } from './isElement.js';
export { default as isString } from './isString.js';
export { default as isNumber } from './isNumber.js';
export { default as isDate } from './isDate.js';
export { default as isRegExp } from './isRegExp.js';
export { default as isError } from './isError.js';
export { default as isSymbol } from './isSymbol.js';
export { default as isMap } from './isMap.js';
export { default as isWeakMap } from './isWeakMap.js';
export { default as isSet } from './isSet.js';
export { default as isWeakSet } from './isWeakSet.js';
export { default as isArrayBuffer } from './isArrayBuffer.js';
export { default as isDataView } from './isDataView.js';
export { default as isArray } from './isArray.js';
export { default as isFunction } from './isFunction.js';
export { default as isArguments } from './isArguments.js';
export { default as isFinite } from './isFinite.js';
export { default as isNaN } from './isNaN.js';
export { default as isTypedArray } from './isTypedArray.js';
export { default as isEmpty } from './isEmpty.js';
export { default as isMatch } from './isMatch.js';
export { default as isEqual } from './isEqual.js';

// Functions that treat an object as a dictionary of key-value pairs.
export { default as keys } from './keys.js';
export { default as allKeys } from './allKeys.js';
export { default as values } from './values.js';
export { default as pairs } from './pairs.js';
export { default as invert } from './invert.js';
export { default as functions,
         default as methods   } from './functions.js';
export { default as extend } from './extend.js';
export { default as extendOwn,
         default as assign    } from './extendOwn.js';
export { default as defaults } from './defaults.js';
export { default as create } from './create.js';
export { default as clone } from './clone.js';
export { default as tap } from './tap.js';
export { default as has } from './has.js';
export { default as mapObject } from './mapObject.js';

// Utility Functions
// -----------------
// A bit of a grab bag: Predicate-generating functions for use with filters and
// loops, string escaping and templating, create random numbers and unique ids,
// and functions that facilitate Underscore's chaining and iteration conventions.
export { default as identity } from './identity.js';
export { default as constant } from './constant.js';
export { default as noop } from './noop.js';
export { default as property } from './property.js';
export { default as propertyOf } from './propertyOf.js';
export { default as matcher,
         default as matches } from './matcher.js';
export { default as times } from './times.js';
export { default as random } from './random.js';
export { default as now } from './now.js';
export { default as escape } from './escape.js';
export { default as unescape } from './unescape.js';
export { default as templateSettings } from './templateSettings.js';
export { default as template } from './template.js';
export { default as result } from './result.js';
export { default as uniqueId } from './uniqueId.js';
export { default as chain } from './chain.js';
export { default as iteratee } from './iteratee.js';

// Function (ahem) Functions
// -------------------------
// These functions take a function as an argument and return a new function
// as the result. Also known as higher-order functions.
export { default as partial } from './partial.js';
export { default as bind } from './bind.js';
export { default as bindAll } from './bindAll.js';
export { default as memoize } from './memoize.js';
export { default as delay } from './delay.js';
export { default as defer } from './defer.js';
export { default as throttle } from './throttle.js';
export { default as debounce } from './debounce.js';
export { default as wrap } from './wrap.js';
export { default as negate } from './negate.js';
export { default as compose } from './compose.js';
export { default as after } from './after.js';
export { default as before } from './before.js';
export { default as once } from './once.js';

// Finders
// -------
// Functions that extract (the position of) a single element from an object
// or array based on some criterion.
export { default as findKey } from './findKey.js';
export { default as findIndex } from './findIndex.js';
export { default as findLastIndex } from './findLastIndex.js';
export { default as sortedIndex } from './sortedIndex.js';
export { default as indexOf } from './indexOf.js';
export { default as lastIndexOf } from './lastIndexOf.js';
export { default as find,
         default as detect } from './find.js';
export { default as findWhere } from './findWhere.js';

// Collection Functions
// --------------------
// Functions that work on any collection of elements: either an array, or
// an object of key-value pairs.
export { default as each,
         default as forEach } from './each.js';
export { default as map,
         default as collect } from './map.js';
export { default as reduce,
         default as foldl,
         default as inject } from './reduce.js';
export { default as reduceRight,
         default as foldr       } from './reduceRight.js';
export { default as filter,
         default as select } from './filter.js';
export { default as reject } from './reject.js';
export { default as every,
         default as all   } from './every.js';
export { default as some,
         default as any  } from './some.js';
export { default as contains,
         default as includes,
         default as include  } from './contains.js';
export { default as invoke } from './invoke.js';
export { default as pluck } from './pluck.js';
export { default as where } from './where.js';
export { default as max } from './max.js';
export { default as min } from './min.js';
export { default as shuffle } from './shuffle.js';
export { default as sample } from './sample.js';
export { default as sortBy } from './sortBy.js';
export { default as groupBy } from './groupBy.js';
export { default as indexBy } from './indexBy.js';
export { default as countBy } from './countBy.js';
export { default as partition } from './partition.js';
export { default as toArray } from './toArray.js';
export { default as size } from './size.js';

// `_.pick` and `_.omit` are actually object functions, but we put
// them here in order to create a more natural reading order in the
// monolithic build as they depend on `_.contains`.
export { default as pick } from './pick.js';
export { default as omit } from './omit.js';

// Array Functions
// ---------------
// Functions that operate on arrays (and array-likes) only, because theyâ€™re
// expressed in terms of operations on an ordered list of values.
export { default as first,
         default as head,
         default as take  } from './first.js';
export { default as initial } from './initial.js';
export { default as last } from './last.js';
export { default as rest,
         default as tail,
         default as drop } from './rest.js';
export { default as compact } from './compact.js';
export { default as flatten } from './flatten.js';
export { default as without } from './without.js';
export { default as uniq,
         default as unique } from './uniq.js';
export { default as union } from './union.js';
export { default as intersection } from './intersection.js';
export { default as difference } from './difference.js';
export { default as unzip,
         default as transpose } from './unzip.js';
export { default as zip } from './zip.js';
export { default as object } from './object.js';
export { default as range } from './range.js';
export { default as chunk } from './chunk.js';

// OOP
// ---
// These modules support the "object-oriented" calling style. See also
// `underscore.js` and `index-default.js`.
export { default as mixin } from './mixin.js';
export { default } from './underscore-array-methods.js';
import group from './_group.js';

// Indexes the object's values by a criterion, similar to `_.groupBy`, but for
// when you know that your index values will be unique.
export default group(function(result, value, key) {
  result[key] = value;
});
import sortedIndex from './sortedIndex.js';
import findIndex from './findIndex.js';
import createIndexFinder from './_createIndexFinder.js';

// Return the position of the first occurrence of an item in an array,
// or -1 if the item is not included in the array.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
export default createIndexFinder(1, findIndex, sortedIndex);
import { slice } from './_setup.js';

// Returns everything but the last entry of the array. Especially useful on
// the arguments object. Passing **n** will return all the values in
// the array, excluding the last N.
export default function initial(array, n, guard) {
  return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
}
import getLength from './_getLength.js';
import contains from './contains.js';

// Produce an array that contains every item shared between all the
// passed-in arrays.
export default function intersection(array) {
  var result = [];
  var argsLength = arguments.length;
  for (var i = 0, length = getLength(array); i < length; i++) {
    var item = array[i];
    if (contains(result, item)) continue;
    var j;
    for (j = 1; j < argsLength; j++) {
      if (!contains(arguments[j], item)) break;
    }
    if (j === argsLength) result.push(item);
  }
  return result;
}
import keys from './keys.js';

// Invert the keys and values of an object. The values must be serializable.
export default function invert(obj) {
  var result = {};
  var _keys = keys(obj);
  for (var i = 0, length = _keys.length; i < length; i++) {
    result[obj[_keys[i]]] = _keys[i];
  }
  return result;
}
import restArguments from './restArguments.js';
import isFunction from './isFunction.js';
import isArray from './isArray.js';
import map from './map.js';
import deepGet from './_deepGet.js';

// Invoke a method (with arguments) on every item in a collection.
export default restArguments(function(obj, path, args) {
  var contextPath, func;
  if (isFunction(path)) {
    func = path;
  } else if (isArray(path)) {
    contextPath = path.slice(0, -1);
    path = path[path.length - 1];
  }
  return map(obj, function(context) {
    var method = func;
    if (!method) {
      if (contextPath && contextPath.length) {
        context = deepGet(context, contextPath);
      }
      if (context == null) return void 0;
      method = context[path];
    }
    return method == null ? method : method.apply(context, args);
  });
});
import tagTester from './_tagTester.js';
import has from './_has.js';

var isArguments = tagTester('Arguments');

// Define a fallback version of the method in browsers (ahem, IE < 9), where
// there isn't any inspectable "Arguments" type.
(function() {
  if (!isArguments(arguments)) {
    isArguments = function(obj) {
      return has(obj, 'callee');
    };
  }
}());

export default isArguments;
import { nativeIsArray } from './_setup.js';
import tagTester from './_tagTester.js';

// Is a given value an array?
// Delegates to ECMA5's native `Array.isArray`.
export default nativeIsArray || tagTester('Array');
import tagTester from './_tagTester.js';

export default tagTester('ArrayBuffer');
import { toString } from './_setup.js';

// Is a given value a boolean?
export default function isBoolean(obj) {
  return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
}
import tagTester from './_tagTester.js';

export default tagTester('DataView');
import tagTester from './_tagTester.js';

export default tagTester('Date');
// Is a given value a DOM element?
export default function isElement(obj) {
  return !!(obj && obj.nodeType === 1);
}
import isArrayLike from './_isArrayLike.js';
import isArray from './isArray.js';
import isString from './isString.js';
import isArguments from './isArguments.js';
import keys from './keys.js';

// Is a given array, string, or object empty?
// An "empty" object has no enumerable own-properties.
export default function isEmpty(obj) {
  if (obj == null) return true;
  // Skip the more expensive `toString`-based type checks if `obj` has no
  // `.length`.
  if (isArrayLike(obj) && (isArray(obj) || isString(obj) || isArguments(obj))) return obj.length === 0;
  return keys(obj).length === 0;
}
import _ from './underscore.js';
import { toString, SymbolProto } from './_setup.js';
import getByteLength from './_getByteLength.js';
import isTypedArray from './isTypedArray.js';
import isFunction from './isFunction.js';
import keys from './keys.js';
import has from './_has.js';

// Internal recursive comparison function for `_.isEqual`.
function eq(a, b, aStack, bStack) {
  // Identical objects are equal. `0 === -0`, but they aren't identical.
  // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
  if (a === b) return a !== 0 || 1 / a === 1 / b;
  // `null` or `undefined` only equal to itself (strict comparison).
  if (a == null || b == null) return false;
  // `NaN`s are equivalent, but non-reflexive.
  if (a !== a) return b !== b;
  // Exhaust primitive checks
  var type = typeof a;
  if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
  return deepEq(a, b, aStack, bStack);
}

// Internal recursive comparison function for `_.isEqual`.
function deepEq(a, b, aStack, bStack) {
  // Unwrap any wrapped objects.
  if (a instanceof _) a = a._wrapped;
  if (b instanceof _) b = b._wrapped;
  // Compare `[[Class]]` names.
  var className = toString.call(a);
  if (className !== toString.call(b)) return false;
  switch (className) {
    // These types are compared by value.
    case '[object RegExp]':
      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
    case '[object String]':
      // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
      // equivalent to `new String("5")`.
      return '' + a === '' + b;
    case '[object Number]':
      // `NaN`s are equivalent, but non-reflexive.
      // Object(NaN) is equivalent to NaN.
      if (+a !== +a) return +b !== +b;
      // An `egal` comparison is performed for other numeric values.
      return +a === 0 ? 1 / +a === 1 / b : +a === +b;
    case '[object Date]':
    case '[object Boolean]':
      // Coerce dates and booleans to numeric primitive values. Dates are compared by their
      // millisecond representations. Note that invalid dates with millisecond representations
      // of `NaN` are not equivalent.
      return +a === +b;
    case '[object Symbol]':
      return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
    case '[object ArrayBuffer]':
      // Coerce to `DataView` so we can fall through to the next case.
      return deepEq(new DataView(a), new DataView(b), aStack, bStack);
    case '[object DataView]':
      var byteLength = getByteLength(a);
      if (byteLength !== getByteLength(b)) {
        return false;
      }
      while (byteLength--) {
        if (a.getUint8(byteLength) !== b.getUint8(byteLength)) {
          return false;
        }
      }
      return true;
  }

  if (isTypedArray(a)) {
    // Coerce typed arrays to `DataView`.
    return deepEq(new DataView(a.buffer), new DataView(b.buffer), aStack, bStack);
  }

  var areArrays = className === '[object Array]';
  if (!areArrays) {
    if (typeof a != 'object' || typeof b != 'object') return false;

    // Objects with different constructors are not equivalent, but `Object`s or `Array`s
    // from different frames are.
    var aCtor = a.constructor, bCtor = b.constructor;
    if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&
                             isFunction(bCtor) && bCtor instanceof bCtor)
                        && ('constructor' in a && 'constructor' in b)) {
      return false;
    }
  }
  // Assume equality for cyclic structures. The algorithm for detecting cyclic
  // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.

  // Initializing stack of traversed objects.
  // It's done here since we only need them for objects and arrays comparison.
  aStack = aStack || [];
  bStack = bStack || [];
  var length = aStack.length;
  while (length--) {
    // Linear search. Performance is inversely proportional to the number of
    // unique nested structures.
    if (aStack[length] === a) return bStack[length] === b;
  }

  // Add the first object to the stack of traversed objects.
  aStack.push(a);
  bStack.push(b);

  // Recursively compare objects and arrays.
  if (areArrays) {
    // Compare array lengths to determine if a deep comparison is necessary.
    length = a.length;
    if (length !== b.length) return false;
    // Deep compare the contents, ignoring non-numeric properties.
    while (length--) {
      if (!eq(a[length], b[length], aStack, bStack)) return false;
    }
  } else {
    // Deep compare objects.
    var _keys = keys(a), key;
    length = _keys.length;
    // Ensure that both objects contain the same number of properties before comparing deep equality.
    if (keys(b).length !== length) return false;
    while (length--) {
      // Deep compare each member
      key = _keys[length];
      if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
    }
  }
  // Remove the first object from the stack of traversed objects.
  aStack.pop();
  bStack.pop();
  return true;
}

// Perform a deep comparison to check if two objects are equal.
export default function isEqual(a, b) {
  return eq(a, b);
}
import tagTester from './_tagTester.js';

export default tagTester('Error');
import { _isFinite } from './_setup.js';
import isSymbol from './isSymbol.js';

// Is a given object a finite number?
export default function isFinite(obj) {
  return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
}
import tagTester from './_tagTester.js';
import { root } from './_setup.js';

var isFunction = tagTester('Function');

// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
var nodelist = root.document && root.document.childNodes;
if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
  isFunction = function(obj) {
    return typeof obj == 'function' || false;
  };
}

export default isFunction;
import tagTester from './_tagTester.js';

export default tagTester('Map');
import keys from './keys.js';

// Returns whether an object has a given set of `key:value` pairs.
export default function isMatch(object, attrs) {
  var _keys = keys(attrs), length = _keys.length;
  if (object == null) return !length;
  var obj = Object(object);
  for (var i = 0; i < length; i++) {
    var key = _keys[i];
    if (attrs[key] !== obj[key] || !(key in obj)) return false;
  }
  return true;
}
import { _isNaN } from './_setup.js';
import isNumber from './isNumber.js';

// Is the given value `NaN`?
export default function isNaN(obj) {
  return isNumber(obj) && _isNaN(obj);
}
// Is a given value equal to null?
export default function isNull(obj) {
  return obj === null;
}
import tagTester from './_tagTester.js';

export default tagTester('Number');
// Is a given variable an object?
export default function isObject(obj) {
  var type = typeof obj;
  return type === 'function' || type === 'object' && !!obj;
}
import tagTester from './_tagTester.js';

export default tagTester('RegExp');
import tagTester from './_tagTester.js';

export default tagTester('Set');
import tagTester from './_tagTester.js';

export default tagTester('String');
import tagTester from './_tagTester.js';

export default tagTester('Symbol');
import { supportsArrayBuffer, nativeIsView, toString } from './_setup.js';
import isDataView from './isDataView.js';
import constant from './constant.js';
import isBufferLike from './_isBufferLike.js';

// Is a given value a typed array?
var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
function isTypedArray(obj) {
  // `ArrayBuffer.isView` is the most future-proof, so use it when available.
  // Otherwise, fall back on the above regular expression.
  return nativeIsView ? (nativeIsView(obj) && !isDataView(obj)) :
                isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
}

export default supportsArrayBuffer ? isTypedArray : constant(false);
// Is a given variable undefined?
export default function isUndefined(obj) {
  return obj === void 0;
}
import tagTester from './_tagTester.js';

export default tagTester('WeakMap');
import tagTester from './_tagTester.js';

export default tagTester('WeakSet');
import _ from './underscore.js';
import baseIteratee from './_baseIteratee.js';

// External wrapper for our callback generator. Users may customize
// `_.iteratee` if they want additional predicate/iteratee shorthand styles.
// This abstraction hides the internal-only `argCount` argument.
export default function iteratee(value, context) {
  return baseIteratee(value, context, Infinity);
}
_.iteratee = iteratee;
import isObject from './isObject.js';
import { nativeKeys, hasEnumBug } from './_setup.js';
import has from './_has.js';
import collectNonEnumProps from './_collectNonEnumProps.js';

// Retrieve the names of an object's own properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`.
export default function keys(obj) {
  if (!isObject(obj)) return [];
  if (nativeKeys) return nativeKeys(obj);
  var keys = [];
  for (var key in obj) if (has(obj, key)) keys.push(key);
  // Ahem, IE < 9.
  if (hasEnumBug) collectNonEnumProps(obj, keys);
  return keys;
}
import rest from './rest.js';

// Get the last element of an array. Passing **n** will return the last N
// values in the array.
export default function last(array, n, guard) {
  if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
  if (n == null || guard) return array[array.length - 1];
  return rest(array, Math.max(0, array.length - n));
}
import findLastIndex from './findLastIndex.js';
import createIndexFinder from './_createIndexFinder.js';

// Return the position of the last occurrence of an item in an array,
// or -1 if the item is not included in the array.
export default createIndexFinder(-1, findLastIndex);
import cb from './_cb.js';
import isArrayLike from './_isArrayLike.js';
import keys from './keys.js';

// Return the results of applying the iteratee to each element.
export default function map(obj, iteratee, context) {
  iteratee = cb(iteratee, context);
  var _keys = !isArrayLike(obj) && keys(obj),
      length = (_keys || obj).length,
      results = Array(length);
  for (var index = 0; index < length; index++) {
    var currentKey = _keys ? _keys[index] : index;
    results[index] = iteratee(obj[currentKey], currentKey, obj);
  }
  return results;
}
import cb from './_cb.js';
import keys from './keys.js';

// Returns the results of applying the `iteratee` to each element of `obj`.
// In contrast to `_.map` it returns an object.
export default function mapObject(obj, iteratee, context) {
  iteratee = cb(iteratee, context);
  var _keys = keys(obj),
      length = _keys.length,
      results = {};
  for (var index = 0; index < length; index++) {
    var currentKey = _keys[index];
    results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
  }
  return results;
}
import extendOwn from './extendOwn.js';
import isMatch from './isMatch.js';

// Returns a predicate for checking whether an object has a given set of
// `key:value` pairs.
export default function matcher(attrs) {
  attrs = extendOwn({}, attrs);
  return function(obj) {
    return isMatch(obj, attrs);
  };
}
import isArrayLike from './_isArrayLike.js';
import values from './values.js';
import cb from './_cb.js';
import each from './each.js';

// Return the maximum element (or element-based computation).
export default function max(obj, iteratee, context) {
  var result = -Infinity, lastComputed = -Infinity,
      value, computed;
  if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
    obj = isArrayLike(obj) ? obj : values(obj);
    for (var i = 0, length = obj.length; i < length; i++) {
      value = obj[i];
      if (value != null && value > result) {
        result = value;
      }
    }
  } else {
    iteratee = cb(iteratee, context);
    each(obj, function(v, index, list) {
      computed = iteratee(v, index, list);
      if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
        result = v;
        lastComputed = computed;
      }
    });
  }
  return result;
}
import has from './_has.js';

// Memoize an expensive function by storing its results.
export default function memoize(func, hasher) {
  var memoize = function(key) {
    var cache = memoize.cache;
    var address = '' + (hasher ? hasher.apply(this, arguments) : key);
    if (!has(cache, address)) cache[address] = func.apply(this, arguments);
    return cache[address];
  };
  memoize.cache = {};
  return memoize;
}
import isArrayLike from './_isArrayLike.js';
import values from './values.js';
import cb from './_cb.js';
import each from './each.js';

// Return the minimum element (or element-based computation).
export default function min(obj, iteratee, context) {
  var result = Infinity, lastComputed = Infinity,
      value, computed;
  if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
    obj = isArrayLike(obj) ? obj : values(obj);
    for (var i = 0, length = obj.length; i < length; i++) {
      value = obj[i];
      if (value != null && value < result) {
        result = value;
      }
    }
  } else {
    iteratee = cb(iteratee, context);
    each(obj, function(v, index, list) {
      computed = iteratee(v, index, list);
      if (computed < lastComputed || computed === Infinity && result === Infinity) {
        result = v;
        lastComputed = computed;
      }
    });
  }
  return result;
}
import _ from './underscore.js';
import each from './each.js';
import functions from './functions.js';
import { push } from './_setup.js';
import chainResult from './_chainResult.js';

// Add your own custom functions to the Underscore object.
export default function mixin(obj) {
  each(functions(obj), function(name) {
    var func = _[name] = obj[name];
    _.prototype[name] = function() {
      var args = [this._wrapped];
      push.apply(args, arguments);
      return chainResult(this, func.apply(_, args));
    };
  });
  return _;
}
// Returns a negated version of the passed-in predicate.
export default function negate(predicate) {
  return function() {
    return !predicate.apply(this, arguments);
  };
}
// Predicate-generating function. Often useful outside of Underscore.
export default function noop(){}
// A (possibly faster) way to get the current timestamp as an integer.
export default Date.now || function() {
  return new Date().getTime();
};
import getLength  from './_getLength.js';

// Converts lists into objects. Pass either a single array of `[key, value]`
// pairs, or two parallel arrays of the same length -- one of keys, and one of
// the corresponding values. Passing by pairs is the reverse of `_.pairs`.
export default function object(list, values) {
  var result = {};
  for (var i = 0, length = getLength(list); i < length; i++) {
    if (values) {
      result[list[i]] = values[i];
    } else {
      result[list[i][0]] = list[i][1];
    }
  }
  return result;
}
import restArguments from './restArguments.js';
import isFunction from './isFunction.js';
import negate from './negate.js';
import map from './map.js';
import flatten from './_flatten.js';
import contains from './contains.js';
import pick from './pick.js';

// Return a copy of the object without the disallowed properties.
export default restArguments(function(obj, keys) {
  var iteratee = keys[0], context;
  if (isFunction(iteratee)) {
    iteratee = negate(iteratee);
    if (keys.length > 1) context = keys[1];
  } else {
    keys = map(flatten(keys, false, false), String);
    iteratee = function(value, key) {
      return !contains(keys, key);
    };
  }
  return pick(obj, iteratee, context);
});
import partial from './partial.js';
import before from './before.js';

// Returns a function that will be executed at most one time, no matter how
// often you call it. Useful for lazy initialization.
export default partial(before, 2);
import keys from './keys.js';

// Convert an object into a list of `[key, value]` pairs.
// The opposite of `_.object` with one argument.
export default function pairs(obj) {
  var _keys = keys(obj);
  var length = _keys.length;
  var pairs = Array(length);
  for (var i = 0; i < length; i++) {
    pairs[i] = [_keys[i], obj[_keys[i]]];
  }
  return pairs;
}
import restArguments from './restArguments.js';
import executeBound from './_executeBound.js';
import _ from './underscore.js';

// Partially apply a function by creating a version that has had some of its
// arguments pre-filled, without changing its dynamic `this` context. `_` acts
// as a placeholder by default, allowing any combination of arguments to be
// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
var partial = restArguments(function(func, boundArgs) {
  var placeholder = partial.placeholder;
  var bound = function() {
    var position = 0, length = boundArgs.length;
    var args = Array(length);
    for (var i = 0; i < length; i++) {
      args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
    }
    while (position < arguments.length) args.push(arguments[position++]);
    return executeBound(func, bound, this, this, args);
  };
  return bound;
});

partial.placeholder = _;
export default partial;
import group from './_group.js';

// Split a collection into two arrays: one whose elements all pass the given
// truth test, and one whose elements all do not pass the truth test.
export default group(function(result, value, pass) {
  result[pass ? 0 : 1].push(value);
}, true);
import restArguments from './restArguments.js';
import isFunction from './isFunction.js';
import optimizeCb from './_optimizeCb.js';
import allKeys from './allKeys.js';
import keyInObj from './_keyInObj.js';
import flatten from './_flatten.js';

// Return a copy of the object only containing the allowed properties.
export default restArguments(function(obj, keys) {
  var result = {}, iteratee = keys[0];
  if (obj == null) return result;
  if (isFunction(iteratee)) {
    if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
    keys = allKeys(obj);
  } else {
    iteratee = keyInObj;
    keys = flatten(keys, false, false);
    obj = Object(obj);
  }
  for (var i = 0, length = keys.length; i < length; i++) {
    var key = keys[i];
    var value = obj[key];
    if (iteratee(value, key, obj)) result[key] = value;
  }
  return result;
});
import map from './map.js';
import property from './property.js';

// Convenience version of a common use case of `_.map`: fetching a property.
export default function pluck(obj, key) {
  return map(obj, property(key));
}
import isArray from './isArray.js';
import shallowProperty from './_shallowProperty.js';
import deepGet from './_deepGet.js';

// Creates a function that, when passed an object, will traverse that objectâ€™s
// properties down the given `path`, specified as an array of keys or indices.
export default function property(path) {
  if (!isArray(path)) {
    return shallowProperty(path);
  }
  return function(obj) {
    return deepGet(obj, path);
  };
}
import isArray from './isArray.js';
import deepGet from './_deepGet.js';

// Generates a function for a given object that returns a given property.
export default function propertyOf(obj) {
  if (obj == null) {
    return function(){};
  }
  return function(path) {
    return !isArray(path) ? obj[path] : deepGet(obj, path);
  };
}
// Return a random integer between `min` and `max` (inclusive).
export default function random(min, max) {
  if (max == null) {
    max = min;
    min = 0;
  }
  return min + Math.floor(Math.random() * (max - min + 1));
}
// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](https://docs.python.org/library/functions.html#range).
export default function range(start, stop, step) {
  if (stop == null) {
    stop = start || 0;
    start = 0;
  }
  if (!step) {
    step = stop < start ? -1 : 1;
  }

  var length = Math.max(Math.ceil((stop - start) / step), 0);
  var range = Array(length);

  for (var idx = 0; idx < length; idx++, start += step) {
    range[idx] = start;
  }

  return range;
}
import createReduce from './_createReduce.js';

// **Reduce** builds up a single result from a list of values, aka `inject`,
// or `foldl`.
export default createReduce(1);
import createReduce from './_createReduce.js';

// The right-associative version of reduce, also known as `foldr`.
export default createReduce(-1);
import filter from './filter.js';
import negate from './negate.js';
import cb from './_cb.js';

// Return all the elements for which a truth test fails.
export default function reject(obj, predicate, context) {
  return filter(obj, negate(cb(predicate)), context);
}
import { slice } from './_setup.js';

// Returns everything but the first entry of the `array`. Especially useful on
// the `arguments` object. Passing an **n** will return the rest N values in the
// `array`.
export default function rest(array, n, guard) {
  return slice.call(array, n == null || guard ? 1 : n);
}
// Some functions take a variable number of arguments, or a few expected
// arguments at the beginning and then a variable number of values to operate
// on. This helper accumulates all remaining arguments past the functionâ€™s
// argument length (or an explicit `startIndex`), into an array that becomes
// the last argument. Similar to ES6â€™s "rest parameter".
export default function restArguments(func, startIndex) {
  startIndex = startIndex == null ? func.length - 1 : +startIndex;
  return function() {
    var length = Math.max(arguments.length - startIndex, 0),
        rest = Array(length),
        index = 0;
    for (; index < length; index++) {
      rest[index] = arguments[index + startIndex];
    }
    switch (startIndex) {
      case 0: return func.call(this, rest);
      case 1: return func.call(this, arguments[0], rest);
      case 2: return func.call(this, arguments[0], arguments[1], rest);
    }
    var args = Array(startIndex + 1);
    for (index = 0; index < startIndex; index++) {
      args[index] = arguments[index];
    }
    args[startIndex] = rest;
    return func.apply(this, args);
  };
}
import isArray from './isArray.js';
import isFunction from './isFunction.js';

// Traverses the children of `obj` along `path`. If a child is a function, it
// is invoked with its parent as context. Returns the value of the final
// child, or `fallback` if any child is undefined.
export default function result(obj, path, fallback) {
  if (!isArray(path)) path = [path];
  var length = path.length;
  if (!length) {
    return isFunction(fallback) ? fallback.call(obj) : fallback;
  }
  for (var i = 0; i < length; i++) {
    var prop = obj == null ? void 0 : obj[path[i]];
    if (prop === void 0) {
      prop = fallback;
      i = length; // Ensure we don't continue iterating.
    }
    obj = isFunction(prop) ? prop.call(obj) : prop;
  }
  return obj;
}
import isArrayLike from './_isArrayLike.js';
import clone from './clone.js';
import values from './values.js';
import getLength from './_getLength.js';
import random from './random.js';

// Sample **n** random values from a collection using the modern version of the
// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisherâ€“Yates_shuffle).
// If **n** is not specified, returns a single random element.
// The internal `guard` argument allows it to work with `_.map`.
export default function sample(obj, n, guard) {
  if (n == null || guard) {
    if (!isArrayLike(obj)) obj = values(obj);
    return obj[random(obj.length - 1)];
  }
  var sample = isArrayLike(obj) ? clone(obj) : values(obj);
  var length = getLength(sample);
  n = Math.max(Math.min(n, length), 0);
  var last = length - 1;
  for (var index = 0; index < n; index++) {
    var rand = random(index, last);
    var temp = sample[index];
    sample[index] = sample[rand];
    sample[rand] = temp;
  }
  return sample.slice(0, n);
}
import sample from './sample.js';

// Shuffle a collection.
export default function shuffle(obj) {
  return sample(obj, Infinity);
}
import isArrayLike from './_isArrayLike.js';
import keys from './keys.js';

// Return the number of elements in a collection.
export default function size(obj) {
  if (obj == null) return 0;
  return isArrayLike(obj) ? obj.length : keys(obj).length;
}
import cb from './_cb.js';
import isArrayLike from './_isArrayLike.js';
import keys from './keys.js';

// Determine if at least one element in the object passes a truth test.
export default function some(obj, predicate, context) {
  predicate = cb(predicate, context);
  var _keys = !isArrayLike(obj) && keys(obj),
      length = (_keys || obj).length;
  for (var index = 0; index < length; index++) {
    var currentKey = _keys ? _keys[index] : index;
    if (predicate(obj[currentKey], currentKey, obj)) return true;
  }
  return false;
}
import cb from './_cb.js';
import pluck from './pluck.js';
import map from './map.js';

// Sort the object's values by a criterion produced by an iteratee.
export default function sortBy(obj, iteratee, context) {
  var index = 0;
  iteratee = cb(iteratee, context);
  return pluck(map(obj, function(value, key, list) {
    return {
      value: value,
      index: index++,
      criteria: iteratee(value, key, list)
    };
  }).sort(function(left, right) {
    var a = left.criteria;
    var b = right.criteria;
    if (a !== b) {
      if (a > b || a === void 0) return 1;
      if (a < b || b === void 0) return -1;
    }
    return left.index - right.index;
  }), 'value');
}
import cb from './_cb.js';
import getLength from './_getLength.js';

// Use a comparator function to figure out the smallest index at which
// an object should be inserted so as to maintain order. Uses binary search.
export default function sortedIndex(array, obj, iteratee, context) {
  iteratee = cb(iteratee, context, 1);
  var value = iteratee(obj);
  var low = 0, high = getLength(array);
  while (low < high) {
    var mid = Math.floor((low + high) / 2);
    if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
  }
  return low;
}
// Invokes `interceptor` with the `obj` and then returns `obj`.
// The primary purpose of this method is to "tap into" a method chain, in
// order to perform operations on intermediate results within the chain.
export default function tap(obj, interceptor) {
  interceptor(obj);
  return obj;
}
import defaults from './defaults.js';
import _ from './underscore.js';
import './templateSettings.js';

// When customizing `_.templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;

// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
  "'": "'",
  '\\': '\\',
  '\r': 'r',
  '\n': 'n',
  '\u2028': 'u2028',
  '\u2029': 'u2029'
};

var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;

function escapeChar(match) {
  return '\\' + escapes[match];
}

// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
// NB: `oldSettings` only exists for backwards compatibility.
export default function template(text, settings, oldSettings) {
  if (!settings && oldSettings) settings = oldSettings;
  settings = defaults({}, settings, _.templateSettings);

  // Combine delimiters into one regular expression via alternation.
  var matcher = RegExp([
    (settings.escape || noMatch).source,
    (settings.interpolate || noMatch).source,
    (settings.evaluate || noMatch).source
  ].join('|') + '|$', 'g');

  // Compile the template source, escaping string literals appropriately.
  var index = 0;
  var source = "__p+='";
  text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
    source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
    index = offset + match.length;

    if (escape) {
      source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
    } else if (interpolate) {
      source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
    } else if (evaluate) {
      source += "';\n" + evaluate + "\n__p+='";
    }

    // Adobe VMs need the match returned to produce the correct offset.
    return match;
  });
  source += "';\n";

  // If a variable is not specified, place data values in local scope.
  if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';

  source = "var __t,__p='',__j=Array.prototype.join," +
    "print=function(){__p+=__j.call(arguments,'');};\n" +
    source + 'return __p;\n';

  var render;
  try {
    render = new Function(settings.variable || 'obj', '_', source);
  } catch (e) {
    e.source = source;
    throw e;
  }

  var template = function(data) {
    return render.call(this, data, _);
  };

  // Provide the compiled source as a convenience for precompilation.
  var argument = settings.variable || 'obj';
  template.source = 'function(' + argument + '){\n' + source + '}';

  return template;
}
import _ from './underscore.js';

// By default, Underscore uses ERB-style template delimiters. Change the
// following template settings to use alternative delimiters.
export default _.templateSettings = {
  evaluate: /<%([\s\S]+?)%>/g,
  interpolate: /<%=([\s\S]+?)%>/g,
  escape: /<%-([\s\S]+?)%>/g
};
import now from './now.js';

// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time. Normally, the throttled function will run
// as much as it can, without ever going more than once per `wait` duration;
// but if you'd like to disable the execution on the leading edge, pass
// `{leading: false}`. To disable execution on the trailing edge, ditto.
export default function throttle(func, wait, options) {
  var timeout, context, args, result;
  var previous = 0;
  if (!options) options = {};

  var later = function() {
    previous = options.leading === false ? 0 : now();
    timeout = null;
    result = func.apply(context, args);
    if (!timeout) context = args = null;
  };

  var throttled = function() {
    var _now = now();
    if (!previous && options.leading === false) previous = _now;
    var remaining = wait - (_now - previous);
    context = this;
    args = arguments;
    if (remaining <= 0 || remaining > wait) {
      if (timeout) {
        clearTimeout(timeout);
        timeout = null;
      }
      previous = _now;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    } else if (!timeout && options.trailing !== false) {
      timeout = setTimeout(later, remaining);
    }
    return result;
  };

  throttled.cancel = function() {
    clearTimeout(timeout);
    previous = 0;
    timeout = context = args = null;
  };

  return throttled;
}
import optimizeCb from './_optimizeCb.js';

// Run a function **n** times.
export default function times(n, iteratee, context) {
  var accum = Array(Math.max(0, n));
  iteratee = optimizeCb(iteratee, context, 1);
  for (var i = 0; i < n; i++) accum[i] = iteratee(i);
  return accum;
}
import isArray from './isArray.js';
import { slice } from './_setup.js';
import isString from './isString.js';
import isArrayLike from './_isArrayLike.js';
import map from './map.js';
import identity from './identity.js';
import values from './values.js';

// Safely create a real, live array from anything iterable.
var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
export default function toArray(obj) {
  if (!obj) return [];
  if (isArray(obj)) return slice.call(obj);
  if (isString(obj)) {
    // Keep surrogate pair characters together.
    return obj.match(reStrSymbol);
  }
  if (isArrayLike(obj)) return map(obj, identity);
  return values(obj);
}
import _ from './underscore.js';
import each from './each.js';
import { ArrayProto } from './_setup.js';
import chainResult from './_chainResult.js';

// Add all mutator `Array` functions to the wrapper.
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
  var method = ArrayProto[name];
  _.prototype[name] = function() {
    var obj = this._wrapped;
    if (obj != null) {
      method.apply(obj, arguments);
      if ((name === 'shift' || name === 'splice') && obj.length === 0) {
        delete obj[0];
      }
    }
    return chainResult(this, obj);
  };
});

// Add all accessor `Array` functions to the wrapper.
each(['concat', 'join', 'slice'], function(name) {
  var method = ArrayProto[name];
  _.prototype[name] = function() {
    var obj = this._wrapped;
    if (obj != null) obj = method.apply(obj, arguments);
    return chainResult(this, obj);
  };
});

export default _;
import { VERSION } from './_setup.js';

// If Underscore is called as a function, it returns a wrapped object that can
// be used OO-style. This wrapper holds altered versions of all functions added
// through `_.mixin`. Wrapped objects may be chained.
export default function _(obj) {
  if (obj instanceof _) return obj;
  if (!(this instanceof _)) return new _(obj);
  this._wrapped = obj;
}

_.VERSION = VERSION;

// Extracts the result from a wrapped and chained object.
_.prototype.value = function() {
  return this._wrapped;
};

// Provide unwrapping proxies for some methods used in engine operations
// such as arithmetic and JSON stringification.
_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;

_.prototype.toString = function() {
  return String(this._wrapped);
};
import createEscaper from './_createEscaper.js';
import unescapeMap from './_unescapeMap.js';

// Function for unescaping strings from HTML interpolation.
export default createEscaper(unescapeMap);
import restArguments from './restArguments.js';
import uniq from './uniq.js';
import flatten from './_flatten.js';

// Produce an array that contains the union: each distinct element from all of
// the passed-in arrays.
export default restArguments(function(arrays) {
  return uniq(flatten(arrays, true, true));
});
import isBoolean from './isBoolean.js';
import cb from './_cb.js';
import getLength from './_getLength.js';
import contains from './contains.js';

// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// The faster algorithm will not work with an iteratee if the iteratee
// is not a one-to-one function, so providing an iteratee will disable
// the faster algorithm.
export default function uniq(array, isSorted, iteratee, context) {
  if (!isBoolean(isSorted)) {
    context = iteratee;
    iteratee = isSorted;
    isSorted = false;
  }
  if (iteratee != null) iteratee = cb(iteratee, context);
  var result = [];
  var seen = [];
  for (var i = 0, length = getLength(array); i < length; i++) {
    var value = array[i],
        computed = iteratee ? iteratee(value, i, array) : value;
    if (isSorted && !iteratee) {
      if (!i || seen !== computed) result.push(value);
      seen = computed;
    } else if (iteratee) {
      if (!contains(seen, computed)) {
        seen.push(computed);
        result.push(value);
      }
    } else if (!contains(result, value)) {
      result.push(value);
    }
  }
  return result;
}
// Generate a unique integer id (unique within the entire client session).
// Useful for temporary DOM ids.
var idCounter = 0;
export default function uniqueId(prefix) {
  var id = ++idCounter + '';
  return prefix ? prefix + id : id;
}
import max from './max.js';
import getLength from './_getLength.js';
import pluck from './pluck.js';

// Complement of zip. Unzip accepts an array of arrays and groups
// each array's elements on shared indices.
export default function unzip(array) {
  var length = array && max(array, getLength).length || 0;
  var result = Array(length);

  for (var index = 0; index < length; index++) {
    result[index] = pluck(array, index);
  }
  return result;
}
import keys from './keys.js';

// Retrieve the values of an object's properties.
export default function values(obj) {
  var _keys = keys(obj);
  var length = _keys.length;
  var values = Array(length);
  for (var i = 0; i < length; i++) {
    values[i] = obj[_keys[i]];
  }
  return values;
}
import filter from './filter.js';
import matcher from './matcher.js';

// Convenience version of a common use case of `_.filter`: selecting only
// objects containing specific `key:value` pairs.
export default function where(obj, attrs) {
  return filter(obj, matcher(attrs));
}
import restArguments from './restArguments.js';
import difference from './difference.js';

// Return a version of the array that does not contain the specified value(s).
export default restArguments(function(array, otherArrays) {
  return difference(array, otherArrays);
});
import partial from './partial.js';

// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
export default function wrap(func, wrapper) {
  return partial(wrapper, func);
}
import restArguments from './restArguments.js';
import unzip from './unzip.js';

// Zip together multiple lists into a single array -- elements that share
// an index go together.
export default restArguments(unzip);
var isObject = require('./isObject.js');
var _setup = require('./_setup.js');

// Create a naked function reference for surrogate-prototype-swapping.
function ctor() {
  return function(){};
}

// An internal function for creating a new object that inherits from another.
function baseCreate(prototype) {
  if (!isObject(prototype)) return {};
  if (_setup.nativeCreate) return _setup.nativeCreate(prototype);
  var Ctor = ctor();
  Ctor.prototype = prototype;
  var result = new Ctor;
  Ctor.prototype = null;
  return result;
}

module.exports = baseCreate;
var isObject = require('./isObject.js');
var identity = require('./identity.js');
var isFunction = require('./isFunction.js');
var isArray = require('./isArray.js');
var matcher = require('./matcher.js');
var property = require('./property.js');
var _optimizeCb = require('./_optimizeCb.js');

// An internal function to generate callbacks that can be applied to each
// element in a collection, returning the desired result â€” either `_.identity`,
// an arbitrary callback, a property matcher, or a property accessor.
function baseIteratee(value, context, argCount) {
  if (value == null) return identity;
  if (isFunction(value)) return _optimizeCb(value, context, argCount);
  if (isObject(value) && !isArray(value)) return matcher(value);
  return property(value);
}

module.exports = baseIteratee;
var _baseIteratee = require('./_baseIteratee.js');
var underscore = require('./underscore.js');
var iteratee = require('./iteratee.js');

// The function we call internally to generate a callback. It invokes
// `_.iteratee` if overridden, otherwise `baseIteratee`.
function cb(value, context, argCount) {
  if (underscore.iteratee !== iteratee) return underscore.iteratee(value, context);
  return _baseIteratee(value, context, argCount);
}

module.exports = cb;
var underscore = require('./underscore.js');

// Helper function to continue chaining intermediate results.
function chainResult(instance, obj) {
  return instance._chain ? underscore(obj).chain() : obj;
}

module.exports = chainResult;
var _setup = require('./_setup.js');
var isFunction = require('./isFunction.js');
var _has = require('./_has.js');

// Internal helper to create a simple lookup structure.
// `collectNonEnumProps` used to depend on `_.contains`, but this led to
// circular imports. `emulatedSet` is a one-off solution that only works for
// arrays of strings.
function emulatedSet(keys) {
  var hash = {};
  for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
  return {
    contains: function(key) { return hash[key]; },
    push: function(key) {
      hash[key] = true;
      return keys.push(key);
    }
  };
}

// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
// be iterated by `for key in ...` and thus missed. Extends `keys` in place if
// needed.
function collectNonEnumProps(obj, keys) {
  keys = emulatedSet(keys);
  var nonEnumIdx = _setup.nonEnumerableProps.length;
  var constructor = obj.constructor;
  var proto = isFunction(constructor) && constructor.prototype || _setup.ObjProto;

  // Constructor is a special case.
  var prop = 'constructor';
  if (_has(obj, prop) && !keys.contains(prop)) keys.push(prop);

  while (nonEnumIdx--) {
    prop = _setup.nonEnumerableProps[nonEnumIdx];
    if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
      keys.push(prop);
    }
  }
}

module.exports = collectNonEnumProps;
// An internal function for creating assigner functions.
function createAssigner(keysFunc, defaults) {
  return function(obj) {
    var length = arguments.length;
    if (defaults) obj = Object(obj);
    if (length < 2 || obj == null) return obj;
    for (var index = 1; index < length; index++) {
      var source = arguments[index],
          keys = keysFunc(source),
          l = keys.length;
      for (var i = 0; i < l; i++) {
        var key = keys[i];
        if (!defaults || obj[key] === void 0) obj[key] = source[key];
      }
    }
    return obj;
  };
}

module.exports = createAssigner;
var keys = require('./keys.js');

// Internal helper to generate functions for escaping and unescaping strings
// to/from HTML interpolation.
function createEscaper(map) {
  var escaper = function(match) {
    return map[match];
  };
  // Regexes for identifying a key that needs to be escaped.
  var source = '(?:' + keys(map).join('|') + ')';
  var testRegexp = RegExp(source);
  var replaceRegexp = RegExp(source, 'g');
  return function(string) {
    string = string == null ? '' : '' + string;
    return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
  };
}

module.exports = createEscaper;
var _setup = require('./_setup.js');
var _getLength = require('./_getLength.js');
var _isNaN = require('./isNaN.js');

// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
function createIndexFinder(dir, predicateFind, sortedIndex) {
  return function(array, item, idx) {
    var i = 0, length = _getLength(array);
    if (typeof idx == 'number') {
      if (dir > 0) {
        i = idx >= 0 ? idx : Math.max(idx + length, i);
      } else {
        length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
      }
    } else if (sortedIndex && idx && length) {
      idx = sortedIndex(array, item);
      return array[idx] === item ? idx : -1;
    }
    if (item !== item) {
      idx = predicateFind(_setup.slice.call(array, i, length), _isNaN);
      return idx >= 0 ? idx + i : -1;
    }
    for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
      if (array[idx] === item) return idx;
    }
    return -1;
  };
}

module.exports = createIndexFinder;
var _cb = require('./_cb.js');
var _getLength = require('./_getLength.js');

// Internal function to generate `_.findIndex` and `_.findLastIndex`.
function createPredicateIndexFinder(dir) {
  return function(array, predicate, context) {
    predicate = _cb(predicate, context);
    var length = _getLength(array);
    var index = dir > 0 ? 0 : length - 1;
    for (; index >= 0 && index < length; index += dir) {
      if (predicate(array[index], index, array)) return index;
    }
    return -1;
  };
}

module.exports = createPredicateIndexFinder;
var keys = require('./keys.js');
var _optimizeCb = require('./_optimizeCb.js');
var _isArrayLike = require('./_isArrayLike.js');

// Internal helper to create a reducing function, iterating left or right.
function createReduce(dir) {
  // Wrap code that reassigns argument variables in a separate function than
  // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
  var reducer = function(obj, iteratee, memo, initial) {
    var _keys = !_isArrayLike(obj) && keys(obj),
        length = (_keys || obj).length,
        index = dir > 0 ? 0 : length - 1;
    if (!initial) {
      memo = obj[_keys ? _keys[index] : index];
      index += dir;
    }
    for (; index >= 0 && index < length; index += dir) {
      var currentKey = _keys ? _keys[index] : index;
      memo = iteratee(memo, obj[currentKey], currentKey, obj);
    }
    return memo;
  };

  return function(obj, iteratee, memo, context) {
    var initial = arguments.length >= 3;
    return reducer(obj, _optimizeCb(iteratee, context, 4), memo, initial);
  };
}

module.exports = createReduce;
var _setup = require('./_setup.js');

// Common internal logic for `isArrayLike` and `isBufferLike`.
function createSizePropertyCheck(getSizeProperty) {
  return function(collection) {
    var sizeProperty = getSizeProperty(collection);
    return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= _setup.MAX_ARRAY_INDEX;
  }
}

module.exports = createSizePropertyCheck;
// Internal function to obtain a nested property in `obj` along `path`.
function deepGet(obj, path) {
  var length = path.length;
  for (var i = 0; i < length; i++) {
    if (obj == null) return void 0;
    obj = obj[path[i]];
  }
  return length ? obj : void 0;
}

module.exports = deepGet;
// Internal list of HTML entities for escaping.
var escapeMap = {
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&quot;',
  "'": '&#x27;',
  '`': '&#x60;'
};

module.exports = escapeMap;
var isObject = require('./isObject.js');
var _baseCreate = require('./_baseCreate.js');

// Internal function to execute `sourceFunc` bound to `context` with optional
// `args`. Determines whether to execute a function as a constructor or as a
// normal function.
function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
  if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
  var self = _baseCreate(sourceFunc.prototype);
  var result = sourceFunc.apply(self, args);
  if (isObject(result)) return result;
  return self;
}

module.exports = executeBound;
var isArray = require('./isArray.js');
var _getLength = require('./_getLength.js');
var _isArrayLike = require('./_isArrayLike.js');
var isArguments = require('./isArguments.js');

// Internal implementation of a recursive `flatten` function.
function flatten(input, depth, strict, output) {
  output = output || [];
  if (!depth && depth !== 0) {
    depth = Infinity;
  } else if (depth <= 0) {
    return output.concat(input);
  }
  var idx = output.length;
  for (var i = 0, length = _getLength(input); i < length; i++) {
    var value = input[i];
    if (_isArrayLike(value) && (isArray(value) || isArguments(value))) {
      // Flatten current level of array or arguments object.
      if (depth > 1) {
        flatten(value, depth - 1, strict, output);
        idx = output.length;
      } else {
        var j = 0, len = value.length;
        while (j < len) output[idx++] = value[j++];
      }
    } else if (!strict) {
      output[idx++] = value;
    }
  }
  return output;
}

module.exports = flatten;
var _shallowProperty = require('./_shallowProperty.js');

// Internal helper to obtain the `byteLength` property of an object.
var getByteLength = _shallowProperty('byteLength');

module.exports = getByteLength;
var _shallowProperty = require('./_shallowProperty.js');

// Internal helper to obtain the `length` property of an object.
var getLength = _shallowProperty('length');

module.exports = getLength;
var _cb = require('./_cb.js');
var each = require('./each.js');

// An internal function used for aggregate "group by" operations.
function group(behavior, partition) {
  return function(obj, iteratee, context) {
    var result = partition ? [[], []] : {};
    iteratee = _cb(iteratee, context);
    each(obj, function(value, index) {
      var key = iteratee(value, index, obj);
      behavior(result, value, key);
    });
    return result;
  };
}

module.exports = group;
var _setup = require('./_setup.js');

// Internal function to check whether `key` is an own property name of `obj`.
function has(obj, key) {
  return obj != null && _setup.hasOwnProperty.call(obj, key);
}

module.exports = has;
var _getLength = require('./_getLength.js');
var _createSizePropertyCheck = require('./_createSizePropertyCheck.js');

// Internal helper for collection methods to determine whether a collection
// should be iterated as an array or as an object.
// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
var isArrayLike = _createSizePropertyCheck(_getLength);

module.exports = isArrayLike;
var _createSizePropertyCheck = require('./_createSizePropertyCheck.js');
var _getByteLength = require('./_getByteLength.js');

// Internal helper to determine whether we should spend extensive checks against
// `ArrayBuffer` et al.
var isBufferLike = _createSizePropertyCheck(_getByteLength);

module.exports = isBufferLike;
// Internal `_.pick` helper function to determine whether `key` is an enumerable
// property name of `obj`.
function keyInObj(value, key, obj) {
  return key in obj;
}

module.exports = keyInObj;
// Internal function that returns an efficient (for current engines) version
// of the passed-in callback, to be repeatedly applied in other Underscore
// functions.
function optimizeCb(func, context, argCount) {
  if (context === void 0) return func;
  switch (argCount == null ? 3 : argCount) {
    case 1: return function(value) {
      return func.call(context, value);
    };
    // The 2-argument case is omitted because weâ€™re not using it.
    case 3: return function(value, index, collection) {
      return func.call(context, value, index, collection);
    };
    case 4: return function(accumulator, value, index, collection) {
      return func.call(context, accumulator, value, index, collection);
    };
  }
  return function() {
    return func.apply(context, arguments);
  };
}

module.exports = optimizeCb;
Object.defineProperty(exports, '__esModule', { value: true });

// Current version.
var VERSION = '1.11.0';

// Establish the root object, `window` (`self`) in the browser, `global`
// on the server, or `this` in some virtual machines. We use `self`
// instead of `window` for `WebWorker` support.
var root = typeof self == 'object' && self.self === self && self ||
          typeof global == 'object' && global.global === global && global ||
          Function('return this')() ||
          {};

// Save bytes in the minified (but not gzipped) version:
var ArrayProto = Array.prototype, ObjProto = Object.prototype;
var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;

// Create quick reference variables for speed access to core prototypes.
var push = ArrayProto.push,
    slice = ArrayProto.slice,
    toString = ObjProto.toString,
    hasOwnProperty = ObjProto.hasOwnProperty;

// Modern feature detection.
var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined';

// All **ECMAScript 5+** native function implementations that we hope to use
// are declared here.
var nativeIsArray = Array.isArray,
    nativeKeys = Object.keys,
    nativeCreate = Object.create,
    nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;

// Create references to these builtin functions because we override them.
var _isNaN = isNaN,
    _isFinite = isFinite;

// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
  'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

// The largest integer that can be represented exactly.
var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;

exports.ArrayProto = ArrayProto;
exports.MAX_ARRAY_INDEX = MAX_ARRAY_INDEX;
exports.ObjProto = ObjProto;
exports.SymbolProto = SymbolProto;
exports.VERSION = VERSION;
exports._isFinite = _isFinite;
exports._isNaN = _isNaN;
exports.hasEnumBug = hasEnumBug;
exports.hasOwnProperty = hasOwnProperty;
exports.nativeCreate = nativeCreate;
exports.nativeIsArray = nativeIsArray;
exports.nativeIsView = nativeIsView;
exports.nativeKeys = nativeKeys;
exports.nonEnumerableProps = nonEnumerableProps;
exports.push = push;
exports.root = root;
exports.slice = slice;
exports.supportsArrayBuffer = supportsArrayBuffer;
exports.toString = toString;
// Internal helper to generate a function to obtain property `key` from `obj`.
function shallowProperty(key) {
  return function(obj) {
    return obj == null ? void 0 : obj[key];
  };
}

module.exports = shallowProperty;
var _setup = require('./_setup.js');

// Internal function for creating a `toString`-based type tester.
function tagTester(name) {
  return function(obj) {
    return _setup.toString.call(obj) === '[object ' + name + ']';
  };
}

module.exports = tagTester;
var _escapeMap = require('./_escapeMap.js');
var invert = require('./invert.js');

// Internal list of HTML entities for unescaping.
var unescapeMap = invert(_escapeMap);

module.exports = unescapeMap;
// Returns a function that will only be executed on and after the Nth call.
function after(times, func) {
  return function() {
    if (--times < 1) {
      return func.apply(this, arguments);
    }
  };
}

module.exports = after;
var isObject = require('./isObject.js');
var _setup = require('./_setup.js');
var _collectNonEnumProps = require('./_collectNonEnumProps.js');

// Retrieve all the enumerable property names of an object.
function allKeys(obj) {
  if (!isObject(obj)) return [];
  var keys = [];
  for (var key in obj) keys.push(key);
  // Ahem, IE < 9.
  if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys);
  return keys;
}

module.exports = allKeys;
// Returns a function that will only be executed up to (but not including) the
// Nth call.
function before(times, func) {
  var memo;
  return function() {
    if (--times > 0) {
      memo = func.apply(this, arguments);
    }
    if (times <= 1) func = null;
    return memo;
  };
}

module.exports = before;
var isFunction = require('./isFunction.js');
var _executeBound = require('./_executeBound.js');
var restArguments = require('./restArguments.js');

// Create a function bound to a given object (assigning `this`, and arguments,
// optionally).
var bind = restArguments(function(func, context, args) {
  if (!isFunction(func)) throw new TypeError('Bind must be called on a function');
  var bound = restArguments(function(callArgs) {
    return _executeBound(func, bound, context, this, args.concat(callArgs));
  });
  return bound;
});

module.exports = bind;
var _flatten = require('./_flatten.js');
var restArguments = require('./restArguments.js');
var bind = require('./bind.js');

// Bind a number of an object's methods to that object. Remaining arguments
// are the method names to be bound. Useful for ensuring that all callbacks
// defined on an object belong to it.
var bindAll = restArguments(function(obj, keys) {
  keys = _flatten(keys, false, false);
  var index = keys.length;
  if (index < 1) throw new Error('bindAll must be passed function names');
  while (index--) {
    var key = keys[index];
    obj[key] = bind(obj[key], obj);
  }
  return obj;
});

module.exports = bindAll;
var underscore = require('./underscore.js');

// Start chaining a wrapped Underscore object.
function chain(obj) {
  var instance = underscore(obj);
  instance._chain = true;
  return instance;
}

module.exports = chain;
var _setup = require('./_setup.js');

// Chunk a single array into multiple arrays, each containing `count` or fewer
// items.
function chunk(array, count) {
  if (count == null || count < 1) return [];
  var result = [];
  var i = 0, length = array.length;
  while (i < length) {
    result.push(_setup.slice.call(array, i, i += count));
  }
  return result;
}

module.exports = chunk;
var isObject = require('./isObject.js');
var isArray = require('./isArray.js');
var extend = require('./extend.js');

// Create a (shallow-cloned) duplicate of an object.
function clone(obj) {
  if (!isObject(obj)) return obj;
  return isArray(obj) ? obj.slice() : extend({}, obj);
}

module.exports = clone;
var filter = require('./filter.js');

// Trim out all falsy values from an array.
function compact(array) {
  return filter(array, Boolean);
}

module.exports = compact;
// Returns a function that is the composition of a list of functions, each
// consuming the return value of the function that follows.
function compose() {
  var args = arguments;
  var start = args.length - 1;
  return function() {
    var i = start;
    var result = args[start].apply(this, arguments);
    while (i--) result = args[i].call(this, result);
    return result;
  };
}

module.exports = compose;
// Predicate-generating function. Often useful outside of Underscore.
function constant(value) {
  return function() {
    return value;
  };
}

module.exports = constant;
var _isArrayLike = require('./_isArrayLike.js');
var values = require('./values.js');
var indexOf = require('./indexOf.js');

// Determine if the array or object contains a given item (using `===`).
function contains(obj, item, fromIndex, guard) {
  if (!_isArrayLike(obj)) obj = values(obj);
  if (typeof fromIndex != 'number' || guard) fromIndex = 0;
  return indexOf(obj, item, fromIndex) >= 0;
}

module.exports = contains;
var _has = require('./_has.js');
var _group = require('./_group.js');

// Counts instances of an object that group by a certain criterion. Pass
// either a string attribute to count by, or a function that returns the
// criterion.
var countBy = _group(function(result, value, key) {
  if (_has(result, key)) result[key]++; else result[key] = 1;
});

module.exports = countBy;
var _baseCreate = require('./_baseCreate.js');
var extendOwn = require('./extendOwn.js');

// Creates an object that inherits from the given prototype object.
// If additional properties are provided then they will be added to the
// created object.
function create(prototype, props) {
  var result = _baseCreate(prototype);
  if (props) extendOwn(result, props);
  return result;
}

module.exports = create;
var restArguments = require('./restArguments.js');
var delay = require('./delay.js');

// When a sequence of calls of the returned function ends, the argument
// function is triggered. The end of a sequence is defined by the `wait`
// parameter. If `immediate` is passed, the argument function will be
// triggered at the beginning of the sequence instead of at the end.
function debounce(func, wait, immediate) {
  var timeout, result;

  var later = function(context, args) {
    timeout = null;
    if (args) result = func.apply(context, args);
  };

  var debounced = restArguments(function(args) {
    if (timeout) clearTimeout(timeout);
    if (immediate) {
      var callNow = !timeout;
      timeout = setTimeout(later, wait);
      if (callNow) result = func.apply(this, args);
    } else {
      timeout = delay(later, wait, this, args);
    }

    return result;
  });

  debounced.cancel = function() {
    clearTimeout(timeout);
    timeout = null;
  };

  return debounced;
}

module.exports = debounce;
var _createAssigner = require('./_createAssigner.js');
var allKeys = require('./allKeys.js');

// Fill in a given object with default properties.
var defaults = _createAssigner(allKeys, true);

module.exports = defaults;
var underscore = require('./underscore.js');
var delay = require('./delay.js');
var partial = require('./partial.js');

// Defers a function, scheduling it to run after the current call stack has
// cleared.
var defer = partial(delay, underscore, 1);

module.exports = defer;
var restArguments = require('./restArguments.js');

// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
var delay = restArguments(function(func, wait, args) {
  return setTimeout(function() {
    return func.apply(null, args);
  }, wait);
});

module.exports = delay;
var _flatten = require('./_flatten.js');
var restArguments = require('./restArguments.js');
var filter = require('./filter.js');
var contains = require('./contains.js');

// Take the difference between one array and a number of other arrays.
// Only the elements present in just the first array will remain.
var difference = restArguments(function(array, rest) {
  rest = _flatten(rest, true, true);
  return filter(array, function(value){
    return !contains(rest, value);
  });
});

module.exports = difference;
var keys = require('./keys.js');
var _optimizeCb = require('./_optimizeCb.js');
var _isArrayLike = require('./_isArrayLike.js');

// The cornerstone for collection functions, an `each`
// implementation, aka `forEach`.
// Handles raw objects in addition to array-likes. Treats all
// sparse array-likes as if they were dense.
function each(obj, iteratee, context) {
  iteratee = _optimizeCb(iteratee, context);
  var i, length;
  if (_isArrayLike(obj)) {
    for (i = 0, length = obj.length; i < length; i++) {
      iteratee(obj[i], i, obj);
    }
  } else {
    var _keys = keys(obj);
    for (i = 0, length = _keys.length; i < length; i++) {
      iteratee(obj[_keys[i]], _keys[i], obj);
    }
  }
  return obj;
}

module.exports = each;
var _createEscaper = require('./_createEscaper.js');
var _escapeMap = require('./_escapeMap.js');

// Function for escaping strings to HTML interpolation.
var _escape = _createEscaper(_escapeMap);

module.exports = _escape;
var keys = require('./keys.js');
var _cb = require('./_cb.js');
var _isArrayLike = require('./_isArrayLike.js');

// Determine whether all of the elements pass a truth test.
function every(obj, predicate, context) {
  predicate = _cb(predicate, context);
  var _keys = !_isArrayLike(obj) && keys(obj),
      length = (_keys || obj).length;
  for (var index = 0; index < length; index++) {
    var currentKey = _keys ? _keys[index] : index;
    if (!predicate(obj[currentKey], currentKey, obj)) return false;
  }
  return true;
}

module.exports = every;
var _createAssigner = require('./_createAssigner.js');
var allKeys = require('./allKeys.js');

// Extend a given object with all the properties in passed-in object(s).
var extend = _createAssigner(allKeys);

module.exports = extend;
var _createAssigner = require('./_createAssigner.js');
var keys = require('./keys.js');

// Assigns a given object with all the own properties in the passed-in
// object(s).
// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
var extendOwn = _createAssigner(keys);

module.exports = extendOwn;
var _cb = require('./_cb.js');
var each = require('./each.js');

// Return all the elements that pass a truth test.
function filter(obj, predicate, context) {
  var results = [];
  predicate = _cb(predicate, context);
  each(obj, function(value, index, list) {
    if (predicate(value, index, list)) results.push(value);
  });
  return results;
}

module.exports = filter;
var _isArrayLike = require('./_isArrayLike.js');
var findIndex = require('./findIndex.js');
var findKey = require('./findKey.js');

// Return the first value which passes a truth test.
function find(obj, predicate, context) {
  var keyFinder = _isArrayLike(obj) ? findIndex : findKey;
  var key = keyFinder(obj, predicate, context);
  if (key !== void 0 && key !== -1) return obj[key];
}

module.exports = find;
var _createPredicateIndexFinder = require('./_createPredicateIndexFinder.js');

// Returns the first index on an array-like that passes a truth test.
var findIndex = _createPredicateIndexFinder(1);

module.exports = findIndex;
var keys = require('./keys.js');
var _cb = require('./_cb.js');

// Returns the first key on an object that passes a truth test.
function findKey(obj, predicate, context) {
  predicate = _cb(predicate, context);
  var _keys = keys(obj), key;
  for (var i = 0, length = _keys.length; i < length; i++) {
    key = _keys[i];
    if (predicate(obj[key], key, obj)) return key;
  }
}

module.exports = findKey;
var _createPredicateIndexFinder = require('./_createPredicateIndexFinder.js');

// Returns the last index on an array-like that passes a truth test.
var findLastIndex = _createPredicateIndexFinder(-1);

module.exports = findLastIndex;
var matcher = require('./matcher.js');
var find = require('./find.js');

// Convenience version of a common use case of `_.find`: getting the first
// object containing specific `key:value` pairs.
function findWhere(obj, attrs) {
  return find(obj, matcher(attrs));
}

module.exports = findWhere;
var initial = require('./initial.js');

// Get the first element of an array. Passing **n** will return the first N
// values in the array. The **guard** check allows it to work with `_.map`.
function first(array, n, guard) {
  if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
  if (n == null || guard) return array[0];
  return initial(array, array.length - n);
}

module.exports = first;
var _flatten = require('./_flatten.js');

// Flatten out an array, either recursively (by default), or up to `depth`.
// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
function flatten(array, depth) {
  return _flatten(array, depth, false);
}

module.exports = flatten;
var isFunction = require('./isFunction.js');

// Return a sorted list of the function names available on the object.
function functions(obj) {
  var names = [];
  for (var key in obj) {
    if (isFunction(obj[key])) names.push(key);
  }
  return names.sort();
}

module.exports = functions;
var _has = require('./_has.js');
var _group = require('./_group.js');

// Groups the object's values by a criterion. Pass either a string attribute
// to group by, or a function that returns the criterion.
var groupBy = _group(function(result, value, key) {
  if (_has(result, key)) result[key].push(value); else result[key] = [value];
});

module.exports = groupBy;
var _setup = require('./_setup.js');
var isArray = require('./isArray.js');
var _has = require('./_has.js');

// Shortcut function for checking if an object has a given property directly on
// itself (in other words, not on a prototype). Unlike the internal `has`
// function, this public version can also traverse nested properties.
function has(obj, path) {
  if (!isArray(path)) {
    return _has(obj, path);
  }
  var length = path.length;
  for (var i = 0; i < length; i++) {
    var key = path[i];
    if (obj == null || !_setup.hasOwnProperty.call(obj, key)) {
      return false;
    }
    obj = obj[key];
  }
  return !!length;
}

module.exports = has;
// Keep the identity function around for default iteratees.
function identity(value) {
  return value;
}

module.exports = identity;
var mixin = require('./mixin.js');
var index = require('./index.js');

// Default Export

// Add all of the Underscore functions to the wrapper object.
var _ = mixin(index);
// Legacy Node.js API.
_._ = _;

module.exports = _;
Object.defineProperty(exports, '__esModule', { value: true });

var isObject = require('./isObject.js');
var _setup = require('./_setup.js');
var identity = require('./identity.js');
var isFunction = require('./isFunction.js');
var isArray = require('./isArray.js');
var keys = require('./keys.js');
var extendOwn = require('./extendOwn.js');
var isMatch = require('./isMatch.js');
var matcher = require('./matcher.js');
var property = require('./property.js');
var iteratee = require('./iteratee.js');
var isNumber = require('./isNumber.js');
var _isNaN = require('./isNaN.js');
var isArguments = require('./isArguments.js');
var each = require('./each.js');
var invert = require('./invert.js');
var after = require('./after.js');
var allKeys = require('./allKeys.js');
var before = require('./before.js');
var restArguments = require('./restArguments.js');
var bind = require('./bind.js');
var bindAll = require('./bindAll.js');
var chain = require('./chain.js');
var chunk = require('./chunk.js');
var extend = require('./extend.js');
var clone = require('./clone.js');
var filter = require('./filter.js');
var compact = require('./compact.js');
var compose = require('./compose.js');
var constant = require('./constant.js');
var values = require('./values.js');
var sortedIndex = require('./sortedIndex.js');
var findIndex = require('./findIndex.js');
var indexOf = require('./indexOf.js');
var contains = require('./contains.js');
var countBy = require('./countBy.js');
var create = require('./create.js');
var delay = require('./delay.js');
var debounce = require('./debounce.js');
var defaults = require('./defaults.js');
var partial = require('./partial.js');
var defer = require('./defer.js');
var difference = require('./difference.js');
var _escape = require('./escape.js');
var every = require('./every.js');
var findKey = require('./findKey.js');
var find = require('./find.js');
var findLastIndex = require('./findLastIndex.js');
var findWhere = require('./findWhere.js');
var initial = require('./initial.js');
var first = require('./first.js');
var flatten = require('./flatten.js');
var functions = require('./functions.js');
var groupBy = require('./groupBy.js');
var has = require('./has.js');
var isNull = require('./isNull.js');
var isUndefined = require('./isUndefined.js');
var isBoolean = require('./isBoolean.js');
var isElement = require('./isElement.js');
var isString = require('./isString.js');
var isDate = require('./isDate.js');
var isRegExp = require('./isRegExp.js');
var isError = require('./isError.js');
var isSymbol = require('./isSymbol.js');
var isMap = require('./isMap.js');
var isWeakMap = require('./isWeakMap.js');
var isSet = require('./isSet.js');
var isWeakSet = require('./isWeakSet.js');
var isArrayBuffer = require('./isArrayBuffer.js');
var isDataView = require('./isDataView.js');
var _isFinite = require('./isFinite.js');
var isTypedArray = require('./isTypedArray.js');
var isEmpty = require('./isEmpty.js');
var isEqual = require('./isEqual.js');
var pairs = require('./pairs.js');
var tap = require('./tap.js');
var mapObject = require('./mapObject.js');
var noop = require('./noop.js');
var propertyOf = require('./propertyOf.js');
var times = require('./times.js');
var random = require('./random.js');
var now = require('./now.js');
var _unescape = require('./unescape.js');
var templateSettings = require('./templateSettings.js');
var template = require('./template.js');
var result = require('./result.js');
var uniqueId = require('./uniqueId.js');
var memoize = require('./memoize.js');
var throttle = require('./throttle.js');
var wrap = require('./wrap.js');
var negate = require('./negate.js');
var once = require('./once.js');
var lastIndexOf = require('./lastIndexOf.js');
var map = require('./map.js');
var reduce = require('./reduce.js');
var reduceRight = require('./reduceRight.js');
var reject = require('./reject.js');
var some = require('./some.js');
var invoke = require('./invoke.js');
var pluck = require('./pluck.js');
var where = require('./where.js');
var max = require('./max.js');
var min = require('./min.js');
var sample = require('./sample.js');
var shuffle = require('./shuffle.js');
var sortBy = require('./sortBy.js');
var indexBy = require('./indexBy.js');
var partition = require('./partition.js');
var toArray = require('./toArray.js');
var size = require('./size.js');
var pick = require('./pick.js');
var omit = require('./omit.js');
var rest = require('./rest.js');
var last = require('./last.js');
var without = require('./without.js');
var uniq = require('./uniq.js');
var union = require('./union.js');
var intersection = require('./intersection.js');
var unzip = require('./unzip.js');
var zip = require('./zip.js');
var object = require('./object.js');
var range = require('./range.js');
var mixin = require('./mixin.js');
var underscoreArrayMethods = require('./underscore-array-methods.js');

// Named Exports

exports.isObject = isObject;
exports.VERSION = _setup.VERSION;
exports.identity = identity;
exports.isFunction = isFunction;
exports.isArray = isArray;
exports.keys = keys;
exports.assign = extendOwn;
exports.extendOwn = extendOwn;
exports.isMatch = isMatch;
exports.matcher = matcher;
exports.matches = matcher;
exports.property = property;
exports.iteratee = iteratee;
exports.isNumber = isNumber;
exports.isNaN = _isNaN;
exports.isArguments = isArguments;
exports.each = each;
exports.forEach = each;
exports.invert = invert;
exports.after = after;
exports.allKeys = allKeys;
exports.before = before;
exports.restArguments = restArguments;
exports.bind = bind;
exports.bindAll = bindAll;
exports.chain = chain;
exports.chunk = chunk;
exports.extend = extend;
exports.clone = clone;
exports.filter = filter;
exports.select = filter;
exports.compact = compact;
exports.compose = compose;
exports.constant = constant;
exports.values = values;
exports.sortedIndex = sortedIndex;
exports.findIndex = findIndex;
exports.indexOf = indexOf;
exports.contains = contains;
exports.include = contains;
exports.includes = contains;
exports.countBy = countBy;
exports.create = create;
exports.delay = delay;
exports.debounce = debounce;
exports.defaults = defaults;
exports.partial = partial;
exports.defer = defer;
exports.difference = difference;
exports.escape = _escape;
exports.all = every;
exports.every = every;
exports.findKey = findKey;
exports.detect = find;
exports.find = find;
exports.findLastIndex = findLastIndex;
exports.findWhere = findWhere;
exports.initial = initial;
exports.first = first;
exports.head = first;
exports.take = first;
exports.flatten = flatten;
exports.functions = functions;
exports.methods = functions;
exports.groupBy = groupBy;
exports.has = has;
exports.isNull = isNull;
exports.isUndefined = isUndefined;
exports.isBoolean = isBoolean;
exports.isElement = isElement;
exports.isString = isString;
exports.isDate = isDate;
exports.isRegExp = isRegExp;
exports.isError = isError;
exports.isSymbol = isSymbol;
exports.isMap = isMap;
exports.isWeakMap = isWeakMap;
exports.isSet = isSet;
exports.isWeakSet = isWeakSet;
exports.isArrayBuffer = isArrayBuffer;
exports.isDataView = isDataView;
exports.isFinite = _isFinite;
exports.isTypedArray = isTypedArray;
exports.isEmpty = isEmpty;
exports.isEqual = isEqual;
exports.pairs = pairs;
exports.tap = tap;
exports.mapObject = mapObject;
exports.noop = noop;
exports.propertyOf = propertyOf;
exports.times = times;
exports.random = random;
exports.now = now;
exports.unescape = _unescape;
exports.templateSettings = templateSettings;
exports.template = template;
exports.result = result;
exports.uniqueId = uniqueId;
exports.memoize = memoize;
exports.throttle = throttle;
exports.wrap = wrap;
exports.negate = negate;
exports.once = once;
exports.lastIndexOf = lastIndexOf;
exports.collect = map;
exports.map = map;
exports.foldl = reduce;
exports.inject = reduce;
exports.reduce = reduce;
exports.foldr = reduceRight;
exports.reduceRight = reduceRight;
exports.reject = reject;
exports.any = some;
exports.some = some;
exports.invoke = invoke;
exports.pluck = pluck;
exports.where = where;
exports.max = max;
exports.min = min;
exports.sample = sample;
exports.shuffle = shuffle;
exports.sortBy = sortBy;
exports.indexBy = indexBy;
exports.partition = partition;
exports.toArray = toArray;
exports.size = size;
exports.pick = pick;
exports.omit = omit;
exports.drop = rest;
exports.rest = rest;
exports.tail = rest;
exports.last = last;
exports.without = without;
exports.uniq = uniq;
exports.unique = uniq;
exports.union = union;
exports.intersection = intersection;
exports.transpose = unzip;
exports.unzip = unzip;
exports.zip = zip;
exports.object = object;
exports.range = range;
exports.mixin = mixin;
exports.default = underscoreArrayMethods;
var _group = require('./_group.js');

// Indexes the object's values by a criterion, similar to `_.groupBy`, but for
// when you know that your index values will be unique.
var indexBy = _group(function(result, value, key) {
  result[key] = value;
});

module.exports = indexBy;
var _createIndexFinder = require('./_createIndexFinder.js');
var sortedIndex = require('./sortedIndex.js');
var findIndex = require('./findIndex.js');

// Return the position of the first occurrence of an item in an array,
// or -1 if the item is not included in the array.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
var indexOf = _createIndexFinder(1, findIndex, sortedIndex);

module.exports = indexOf;
var _setup = require('./_setup.js');

// Returns everything but the last entry of the array. Especially useful on
// the arguments object. Passing **n** will return all the values in
// the array, excluding the last N.
function initial(array, n, guard) {
  return _setup.slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
}

module.exports = initial;
var _getLength = require('./_getLength.js');
var contains = require('./contains.js');

// Produce an array that contains every item shared between all the
// passed-in arrays.
function intersection(array) {
  var result = [];
  var argsLength = arguments.length;
  for (var i = 0, length = _getLength(array); i < length; i++) {
    var item = array[i];
    if (contains(result, item)) continue;
    var j;
    for (j = 1; j < argsLength; j++) {
      if (!contains(arguments[j], item)) break;
    }
    if (j === argsLength) result.push(item);
  }
  return result;
}

module.exports = intersection;
var keys = require('./keys.js');

// Invert the keys and values of an object. The values must be serializable.
function invert(obj) {
  var result = {};
  var _keys = keys(obj);
  for (var i = 0, length = _keys.length; i < length; i++) {
    result[obj[_keys[i]]] = _keys[i];
  }
  return result;
}

module.exports = invert;
var isFunction = require('./isFunction.js');
var isArray = require('./isArray.js');
var _deepGet = require('./_deepGet.js');
var restArguments = require('./restArguments.js');
var map = require('./map.js');

// Invoke a method (with arguments) on every item in a collection.
var invoke = restArguments(function(obj, path, args) {
  var contextPath, func;
  if (isFunction(path)) {
    func = path;
  } else if (isArray(path)) {
    contextPath = path.slice(0, -1);
    path = path[path.length - 1];
  }
  return map(obj, function(context) {
    var method = func;
    if (!method) {
      if (contextPath && contextPath.length) {
        context = _deepGet(context, contextPath);
      }
      if (context == null) return void 0;
      method = context[path];
    }
    return method == null ? method : method.apply(context, args);
  });
});

module.exports = invoke;
var _tagTester = require('./_tagTester.js');
var _has = require('./_has.js');

var isArguments = _tagTester('Arguments');

// Define a fallback version of the method in browsers (ahem, IE < 9), where
// there isn't any inspectable "Arguments" type.
(function() {
  if (!isArguments(arguments)) {
    isArguments = function(obj) {
      return _has(obj, 'callee');
    };
  }
}());

var isArguments$1 = isArguments;

module.exports = isArguments$1;
var _setup = require('./_setup.js');
var _tagTester = require('./_tagTester.js');

// Is a given value an array?
// Delegates to ECMA5's native `Array.isArray`.
var isArray = _setup.nativeIsArray || _tagTester('Array');

module.exports = isArray;
var _tagTester = require('./_tagTester.js');

var isArrayBuffer = _tagTester('ArrayBuffer');

module.exports = isArrayBuffer;
var _setup = require('./_setup.js');

// Is a given value a boolean?
function isBoolean(obj) {
  return obj === true || obj === false || _setup.toString.call(obj) === '[object Boolean]';
}

module.exports = isBoolean;
var _tagTester = require('./_tagTester.js');

var isDataView = _tagTester('DataView');

module.exports = isDataView;
var _tagTester = require('./_tagTester.js');

var isDate = _tagTester('Date');

module.exports = isDate;
// Is a given value a DOM element?
function isElement(obj) {
  return !!(obj && obj.nodeType === 1);
}

module.exports = isElement;
var isArray = require('./isArray.js');
var keys = require('./keys.js');
var _isArrayLike = require('./_isArrayLike.js');
var isArguments = require('./isArguments.js');
var isString = require('./isString.js');

// Is a given array, string, or object empty?
// An "empty" object has no enumerable own-properties.
function isEmpty(obj) {
  if (obj == null) return true;
  // Skip the more expensive `toString`-based type checks if `obj` has no
  // `.length`.
  if (_isArrayLike(obj) && (isArray(obj) || isString(obj) || isArguments(obj))) return obj.length === 0;
  return keys(obj).length === 0;
}

module.exports = isEmpty;
var _setup = require('./_setup.js');
var isFunction = require('./isFunction.js');
var _has = require('./_has.js');
var keys = require('./keys.js');
var underscore = require('./underscore.js');
var _getByteLength = require('./_getByteLength.js');
var isTypedArray = require('./isTypedArray.js');

// Internal recursive comparison function for `_.isEqual`.
function eq(a, b, aStack, bStack) {
  // Identical objects are equal. `0 === -0`, but they aren't identical.
  // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
  if (a === b) return a !== 0 || 1 / a === 1 / b;
  // `null` or `undefined` only equal to itself (strict comparison).
  if (a == null || b == null) return false;
  // `NaN`s are equivalent, but non-reflexive.
  if (a !== a) return b !== b;
  // Exhaust primitive checks
  var type = typeof a;
  if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
  return deepEq(a, b, aStack, bStack);
}

// Internal recursive comparison function for `_.isEqual`.
function deepEq(a, b, aStack, bStack) {
  // Unwrap any wrapped objects.
  if (a instanceof underscore) a = a._wrapped;
  if (b instanceof underscore) b = b._wrapped;
  // Compare `[[Class]]` names.
  var className = _setup.toString.call(a);
  if (className !== _setup.toString.call(b)) return false;
  switch (className) {
    // These types are compared by value.
    case '[object RegExp]':
      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
    case '[object String]':
      // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
      // equivalent to `new String("5")`.
      return '' + a === '' + b;
    case '[object Number]':
      // `NaN`s are equivalent, but non-reflexive.
      // Object(NaN) is equivalent to NaN.
      if (+a !== +a) return +b !== +b;
      // An `egal` comparison is performed for other numeric values.
      return +a === 0 ? 1 / +a === 1 / b : +a === +b;
    case '[object Date]':
    case '[object Boolean]':
      // Coerce dates and booleans to numeric primitive values. Dates are compared by their
      // millisecond representations. Note that invalid dates with millisecond representations
      // of `NaN` are not equivalent.
      return +a === +b;
    case '[object Symbol]':
      return _setup.SymbolProto.valueOf.call(a) === _setup.SymbolProto.valueOf.call(b);
    case '[object ArrayBuffer]':
      // Coerce to `DataView` so we can fall through to the next case.
      return deepEq(new DataView(a), new DataView(b), aStack, bStack);
    case '[object DataView]':
      var byteLength = _getByteLength(a);
      if (byteLength !== _getByteLength(b)) {
        return false;
      }
      while (byteLength--) {
        if (a.getUint8(byteLength) !== b.getUint8(byteLength)) {
          return false;
        }
      }
      return true;
  }

  if (isTypedArray(a)) {
    // Coerce typed arrays to `DataView`.
    return deepEq(new DataView(a.buffer), new DataView(b.buffer), aStack, bStack);
  }

  var areArrays = className === '[object Array]';
  if (!areArrays) {
    if (typeof a != 'object' || typeof b != 'object') return false;

    // Objects with different constructors are not equivalent, but `Object`s or `Array`s
    // from different frames are.
    var aCtor = a.constructor, bCtor = b.constructor;
    if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&
                             isFunction(bCtor) && bCtor instanceof bCtor)
                        && ('constructor' in a && 'constructor' in b)) {
      return false;
    }
  }
  // Assume equality for cyclic structures. The algorithm for detecting cyclic
  // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.

  // Initializing stack of traversed objects.
  // It's done here since we only need them for objects and arrays comparison.
  aStack = aStack || [];
  bStack = bStack || [];
  var length = aStack.length;
  while (length--) {
    // Linear search. Performance is inversely proportional to the number of
    // unique nested structures.
    if (aStack[length] === a) return bStack[length] === b;
  }

  // Add the first object to the stack of traversed objects.
  aStack.push(a);
  bStack.push(b);

  // Recursively compare objects and arrays.
  if (areArrays) {
    // Compare array lengths to determine if a deep comparison is necessary.
    length = a.length;
    if (length !== b.length) return false;
    // Deep compare the contents, ignoring non-numeric properties.
    while (length--) {
      if (!eq(a[length], b[length], aStack, bStack)) return false;
    }
  } else {
    // Deep compare objects.
    var _keys = keys(a), key;
    length = _keys.length;
    // Ensure that both objects contain the same number of properties before comparing deep equality.
    if (keys(b).length !== length) return false;
    while (length--) {
      // Deep compare each member
      key = _keys[length];
      if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
    }
  }
  // Remove the first object from the stack of traversed objects.
  aStack.pop();
  bStack.pop();
  return true;
}

// Perform a deep comparison to check if two objects are equal.
function isEqual(a, b) {
  return eq(a, b);
}

module.exports = isEqual;
var _tagTester = require('./_tagTester.js');

var isError = _tagTester('Error');

module.exports = isError;
var _setup = require('./_setup.js');
var isSymbol = require('./isSymbol.js');

// Is a given object a finite number?
function isFinite(obj) {
  return !isSymbol(obj) && _setup._isFinite(obj) && !isNaN(parseFloat(obj));
}

module.exports = isFinite;
var _setup = require('./_setup.js');
var _tagTester = require('./_tagTester.js');

var isFunction = _tagTester('Function');

// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
var nodelist = _setup.root.document && _setup.root.document.childNodes;
if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
  isFunction = function(obj) {
    return typeof obj == 'function' || false;
  };
}

var isFunction$1 = isFunction;

module.exports = isFunction$1;
var _tagTester = require('./_tagTester.js');

var isMap = _tagTester('Map');

module.exports = isMap;
var keys = require('./keys.js');

// Returns whether an object has a given set of `key:value` pairs.
function isMatch(object, attrs) {
  var _keys = keys(attrs), length = _keys.length;
  if (object == null) return !length;
  var obj = Object(object);
  for (var i = 0; i < length; i++) {
    var key = _keys[i];
    if (attrs[key] !== obj[key] || !(key in obj)) return false;
  }
  return true;
}

module.exports = isMatch;
var _setup = require('./_setup.js');
var isNumber = require('./isNumber.js');

// Is the given value `NaN`?
function isNaN(obj) {
  return isNumber(obj) && _setup._isNaN(obj);
}

module.exports = isNaN;
// Is a given value equal to null?
function isNull(obj) {
  return obj === null;
}

module.exports = isNull;
var _tagTester = require('./_tagTester.js');

var isNumber = _tagTester('Number');

module.exports = isNumber;
// Is a given variable an object?
function isObject(obj) {
  var type = typeof obj;
  return type === 'function' || type === 'object' && !!obj;
}

module.exports = isObject;
var _tagTester = require('./_tagTester.js');

var isRegExp = _tagTester('RegExp');

module.exports = isRegExp;
var _tagTester = require('./_tagTester.js');

var isSet = _tagTester('Set');

module.exports = isSet;
var _tagTester = require('./_tagTester.js');

var isString = _tagTester('String');

module.exports = isString;
var _tagTester = require('./_tagTester.js');

var isSymbol = _tagTester('Symbol');

module.exports = isSymbol;
var _setup = require('./_setup.js');
var _isBufferLike = require('./_isBufferLike.js');
var constant = require('./constant.js');
var isDataView = require('./isDataView.js');

// Is a given value a typed array?
var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
function isTypedArray(obj) {
  // `ArrayBuffer.isView` is the most future-proof, so use it when available.
  // Otherwise, fall back on the above regular expression.
  return _setup.nativeIsView ? (_setup.nativeIsView(obj) && !isDataView(obj)) :
                _isBufferLike(obj) && typedArrayPattern.test(_setup.toString.call(obj));
}

var isTypedArray$1 = _setup.supportsArrayBuffer ? isTypedArray : constant(false);

module.exports = isTypedArray$1;
// Is a given variable undefined?
function isUndefined(obj) {
  return obj === void 0;
}

module.exports = isUndefined;
var _tagTester = require('./_tagTester.js');

var isWeakMap = _tagTester('WeakMap');

module.exports = isWeakMap;
var _tagTester = require('./_tagTester.js');

var isWeakSet = _tagTester('WeakSet');

module.exports = isWeakSet;
var _baseIteratee = require('./_baseIteratee.js');
var underscore = require('./underscore.js');

// External wrapper for our callback generator. Users may customize
// `_.iteratee` if they want additional predicate/iteratee shorthand styles.
// This abstraction hides the internal-only `argCount` argument.
function iteratee(value, context) {
  return _baseIteratee(value, context, Infinity);
}
underscore.iteratee = iteratee;

module.exports = iteratee;
var isObject = require('./isObject.js');
var _setup = require('./_setup.js');
var _has = require('./_has.js');
var _collectNonEnumProps = require('./_collectNonEnumProps.js');

// Retrieve the names of an object's own properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`.
function keys(obj) {
  if (!isObject(obj)) return [];
  if (_setup.nativeKeys) return _setup.nativeKeys(obj);
  var keys = [];
  for (var key in obj) if (_has(obj, key)) keys.push(key);
  // Ahem, IE < 9.
  if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys);
  return keys;
}

module.exports = keys;
var rest = require('./rest.js');

// Get the last element of an array. Passing **n** will return the last N
// values in the array.
function last(array, n, guard) {
  if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
  if (n == null || guard) return array[array.length - 1];
  return rest(array, Math.max(0, array.length - n));
}

module.exports = last;
var _createIndexFinder = require('./_createIndexFinder.js');
var findLastIndex = require('./findLastIndex.js');

// Return the position of the last occurrence of an item in an array,
// or -1 if the item is not included in the array.
var lastIndexOf = _createIndexFinder(-1, findLastIndex);

module.exports = lastIndexOf;
var keys = require('./keys.js');
var _cb = require('./_cb.js');
var _isArrayLike = require('./_isArrayLike.js');

// Return the results of applying the iteratee to each element.
function map(obj, iteratee, context) {
  iteratee = _cb(iteratee, context);
  var _keys = !_isArrayLike(obj) && keys(obj),
      length = (_keys || obj).length,
      results = Array(length);
  for (var index = 0; index < length; index++) {
    var currentKey = _keys ? _keys[index] : index;
    results[index] = iteratee(obj[currentKey], currentKey, obj);
  }
  return results;
}

module.exports = map;
var keys = require('./keys.js');
var _cb = require('./_cb.js');

// Returns the results of applying the `iteratee` to each element of `obj`.
// In contrast to `_.map` it returns an object.
function mapObject(obj, iteratee, context) {
  iteratee = _cb(iteratee, context);
  var _keys = keys(obj),
      length = _keys.length,
      results = {};
  for (var index = 0; index < length; index++) {
    var currentKey = _keys[index];
    results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
  }
  return results;
}

module.exports = mapObject;
var extendOwn = require('./extendOwn.js');
var isMatch = require('./isMatch.js');

// Returns a predicate for checking whether an object has a given set of
// `key:value` pairs.
function matcher(attrs) {
  attrs = extendOwn({}, attrs);
  return function(obj) {
    return isMatch(obj, attrs);
  };
}

module.exports = matcher;
var _cb = require('./_cb.js');
var _isArrayLike = require('./_isArrayLike.js');
var each = require('./each.js');
var values = require('./values.js');

// Return the maximum element (or element-based computation).
function max(obj, iteratee, context) {
  var result = -Infinity, lastComputed = -Infinity,
      value, computed;
  if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
    obj = _isArrayLike(obj) ? obj : values(obj);
    for (var i = 0, length = obj.length; i < length; i++) {
      value = obj[i];
      if (value != null && value > result) {
        result = value;
      }
    }
  } else {
    iteratee = _cb(iteratee, context);
    each(obj, function(v, index, list) {
      computed = iteratee(v, index, list);
      if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
        result = v;
        lastComputed = computed;
      }
    });
  }
  return result;
}

module.exports = max;
var _has = require('./_has.js');

// Memoize an expensive function by storing its results.
function memoize(func, hasher) {
  var memoize = function(key) {
    var cache = memoize.cache;
    var address = '' + (hasher ? hasher.apply(this, arguments) : key);
    if (!_has(cache, address)) cache[address] = func.apply(this, arguments);
    return cache[address];
  };
  memoize.cache = {};
  return memoize;
}

module.exports = memoize;
var _cb = require('./_cb.js');
var _isArrayLike = require('./_isArrayLike.js');
var each = require('./each.js');
var values = require('./values.js');

// Return the minimum element (or element-based computation).
function min(obj, iteratee, context) {
  var result = Infinity, lastComputed = Infinity,
      value, computed;
  if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
    obj = _isArrayLike(obj) ? obj : values(obj);
    for (var i = 0, length = obj.length; i < length; i++) {
      value = obj[i];
      if (value != null && value < result) {
        result = value;
      }
    }
  } else {
    iteratee = _cb(iteratee, context);
    each(obj, function(v, index, list) {
      computed = iteratee(v, index, list);
      if (computed < lastComputed || computed === Infinity && result === Infinity) {
        result = v;
        lastComputed = computed;
      }
    });
  }
  return result;
}

module.exports = min;
var _setup = require('./_setup.js');
var underscore = require('./underscore.js');
var _chainResult = require('./_chainResult.js');
var each = require('./each.js');
var functions = require('./functions.js');

// Add your own custom functions to the Underscore object.
function mixin(obj) {
  each(functions(obj), function(name) {
    var func = underscore[name] = obj[name];
    underscore.prototype[name] = function() {
      var args = [this._wrapped];
      _setup.push.apply(args, arguments);
      return _chainResult(this, func.apply(underscore, args));
    };
  });
  return underscore;
}

module.exports = mixin;
// Returns a negated version of the passed-in predicate.
function negate(predicate) {
  return function() {
    return !predicate.apply(this, arguments);
  };
}

module.exports = negate;
// Predicate-generating function. Often useful outside of Underscore.
function noop(){}

module.exports = noop;
// A (possibly faster) way to get the current timestamp as an integer.
var now = Date.now || function() {
  return new Date().getTime();
};

module.exports = now;
var _getLength = require('./_getLength.js');

// Converts lists into objects. Pass either a single array of `[key, value]`
// pairs, or two parallel arrays of the same length -- one of keys, and one of
// the corresponding values. Passing by pairs is the reverse of `_.pairs`.
function object(list, values) {
  var result = {};
  for (var i = 0, length = _getLength(list); i < length; i++) {
    if (values) {
      result[list[i]] = values[i];
    } else {
      result[list[i][0]] = list[i][1];
    }
  }
  return result;
}

module.exports = object;
var isFunction = require('./isFunction.js');
var _flatten = require('./_flatten.js');
var restArguments = require('./restArguments.js');
var contains = require('./contains.js');
var negate = require('./negate.js');
var map = require('./map.js');
var pick = require('./pick.js');

// Return a copy of the object without the disallowed properties.
var omit = restArguments(function(obj, keys) {
  var iteratee = keys[0], context;
  if (isFunction(iteratee)) {
    iteratee = negate(iteratee);
    if (keys.length > 1) context = keys[1];
  } else {
    keys = map(_flatten(keys, false, false), String);
    iteratee = function(value, key) {
      return !contains(keys, key);
    };
  }
  return pick(obj, iteratee, context);
});

module.exports = omit;
var before = require('./before.js');
var partial = require('./partial.js');

// Returns a function that will be executed at most one time, no matter how
// often you call it. Useful for lazy initialization.
var once = partial(before, 2);

module.exports = once;
var keys = require('./keys.js');

// Convert an object into a list of `[key, value]` pairs.
// The opposite of `_.object` with one argument.
function pairs(obj) {
  var _keys = keys(obj);
  var length = _keys.length;
  var pairs = Array(length);
  for (var i = 0; i < length; i++) {
    pairs[i] = [_keys[i], obj[_keys[i]]];
  }
  return pairs;
}

module.exports = pairs;
var underscore = require('./underscore.js');
var _executeBound = require('./_executeBound.js');
var restArguments = require('./restArguments.js');

// Partially apply a function by creating a version that has had some of its
// arguments pre-filled, without changing its dynamic `this` context. `_` acts
// as a placeholder by default, allowing any combination of arguments to be
// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
var partial = restArguments(function(func, boundArgs) {
  var placeholder = partial.placeholder;
  var bound = function() {
    var position = 0, length = boundArgs.length;
    var args = Array(length);
    for (var i = 0; i < length; i++) {
      args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
    }
    while (position < arguments.length) args.push(arguments[position++]);
    return _executeBound(func, bound, this, this, args);
  };
  return bound;
});

partial.placeholder = underscore;

module.exports = partial;
var _group = require('./_group.js');

// Split a collection into two arrays: one whose elements all pass the given
// truth test, and one whose elements all do not pass the truth test.
var partition = _group(function(result, value, pass) {
  result[pass ? 0 : 1].push(value);
}, true);

module.exports = partition;
var isFunction = require('./isFunction.js');
var _optimizeCb = require('./_optimizeCb.js');
var _flatten = require('./_flatten.js');
var _keyInObj = require('./_keyInObj.js');
var allKeys = require('./allKeys.js');
var restArguments = require('./restArguments.js');

// Return a copy of the object only containing the allowed properties.
var pick = restArguments(function(obj, keys) {
  var result = {}, iteratee = keys[0];
  if (obj == null) return result;
  if (isFunction(iteratee)) {
    if (keys.length > 1) iteratee = _optimizeCb(iteratee, keys[1]);
    keys = allKeys(obj);
  } else {
    iteratee = _keyInObj;
    keys = _flatten(keys, false, false);
    obj = Object(obj);
  }
  for (var i = 0, length = keys.length; i < length; i++) {
    var key = keys[i];
    var value = obj[key];
    if (iteratee(value, key, obj)) result[key] = value;
  }
  return result;
});

module.exports = pick;
var property = require('./property.js');
var map = require('./map.js');

// Convenience version of a common use case of `_.map`: fetching a property.
function pluck(obj, key) {
  return map(obj, property(key));
}

module.exports = pluck;
var isArray = require('./isArray.js');
var _shallowProperty = require('./_shallowProperty.js');
var _deepGet = require('./_deepGet.js');

// Creates a function that, when passed an object, will traverse that objectâ€™s
// properties down the given `path`, specified as an array of keys or indices.
function property(path) {
  if (!isArray(path)) {
    return _shallowProperty(path);
  }
  return function(obj) {
    return _deepGet(obj, path);
  };
}

module.exports = property;
var isArray = require('./isArray.js');
var _deepGet = require('./_deepGet.js');

// Generates a function for a given object that returns a given property.
function propertyOf(obj) {
  if (obj == null) {
    return function(){};
  }
  return function(path) {
    return !isArray(path) ? obj[path] : _deepGet(obj, path);
  };
}

module.exports = propertyOf;
// Return a random integer between `min` and `max` (inclusive).
function random(min, max) {
  if (max == null) {
    max = min;
    min = 0;
  }
  return min + Math.floor(Math.random() * (max - min + 1));
}

module.exports = random;
// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](https://docs.python.org/library/functions.html#range).
function range(start, stop, step) {
  if (stop == null) {
    stop = start || 0;
    start = 0;
  }
  if (!step) {
    step = stop < start ? -1 : 1;
  }

  var length = Math.max(Math.ceil((stop - start) / step), 0);
  var range = Array(length);

  for (var idx = 0; idx < length; idx++, start += step) {
    range[idx] = start;
  }

  return range;
}

module.exports = range;
var _createReduce = require('./_createReduce.js');

// **Reduce** builds up a single result from a list of values, aka `inject`,
// or `foldl`.
var reduce = _createReduce(1);

module.exports = reduce;
var _createReduce = require('./_createReduce.js');

// The right-associative version of reduce, also known as `foldr`.
var reduceRight = _createReduce(-1);

module.exports = reduceRight;
var _cb = require('./_cb.js');
var filter = require('./filter.js');
var negate = require('./negate.js');

// Return all the elements for which a truth test fails.
function reject(obj, predicate, context) {
  return filter(obj, negate(_cb(predicate)), context);
}

module.exports = reject;
var _setup = require('./_setup.js');

// Returns everything but the first entry of the `array`. Especially useful on
// the `arguments` object. Passing an **n** will return the rest N values in the
// `array`.
function rest(array, n, guard) {
  return _setup.slice.call(array, n == null || guard ? 1 : n);
}

module.exports = rest;
// Some functions take a variable number of arguments, or a few expected
// arguments at the beginning and then a variable number of values to operate
// on. This helper accumulates all remaining arguments past the functionâ€™s
// argument length (or an explicit `startIndex`), into an array that becomes
// the last argument. Similar to ES6â€™s "rest parameter".
function restArguments(func, startIndex) {
  startIndex = startIndex == null ? func.length - 1 : +startIndex;
  return function() {
    var length = Math.max(arguments.length - startIndex, 0),
        rest = Array(length),
        index = 0;
    for (; index < length; index++) {
      rest[index] = arguments[index + startIndex];
    }
    switch (startIndex) {
      case 0: return func.call(this, rest);
      case 1: return func.call(this, arguments[0], rest);
      case 2: return func.call(this, arguments[0], arguments[1], rest);
    }
    var args = Array(startIndex + 1);
    for (index = 0; index < startIndex; index++) {
      args[index] = arguments[index];
    }
    args[startIndex] = rest;
    return func.apply(this, args);
  };
}

module.exports = restArguments;
var isFunction = require('./isFunction.js');
var isArray = require('./isArray.js');

// Traverses the children of `obj` along `path`. If a child is a function, it
// is invoked with its parent as context. Returns the value of the final
// child, or `fallback` if any child is undefined.
function result(obj, path, fallback) {
  if (!isArray(path)) path = [path];
  var length = path.length;
  if (!length) {
    return isFunction(fallback) ? fallback.call(obj) : fallback;
  }
  for (var i = 0; i < length; i++) {
    var prop = obj == null ? void 0 : obj[path[i]];
    if (prop === void 0) {
      prop = fallback;
      i = length; // Ensure we don't continue iterating.
    }
    obj = isFunction(prop) ? prop.call(obj) : prop;
  }
  return obj;
}

module.exports = result;
var _getLength = require('./_getLength.js');
var _isArrayLike = require('./_isArrayLike.js');
var clone = require('./clone.js');
var values = require('./values.js');
var random = require('./random.js');

// Sample **n** random values from a collection using the modern version of the
// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisherâ€“Yates_shuffle).
// If **n** is not specified, returns a single random element.
// The internal `guard` argument allows it to work with `_.map`.
function sample(obj, n, guard) {
  if (n == null || guard) {
    if (!_isArrayLike(obj)) obj = values(obj);
    return obj[random(obj.length - 1)];
  }
  var sample = _isArrayLike(obj) ? clone(obj) : values(obj);
  var length = _getLength(sample);
  n = Math.max(Math.min(n, length), 0);
  var last = length - 1;
  for (var index = 0; index < n; index++) {
    var rand = random(index, last);
    var temp = sample[index];
    sample[index] = sample[rand];
    sample[rand] = temp;
  }
  return sample.slice(0, n);
}

module.exports = sample;
var sample = require('./sample.js');

// Shuffle a collection.
function shuffle(obj) {
  return sample(obj, Infinity);
}

module.exports = shuffle;
var keys = require('./keys.js');
var _isArrayLike = require('./_isArrayLike.js');

// Return the number of elements in a collection.
function size(obj) {
  if (obj == null) return 0;
  return _isArrayLike(obj) ? obj.length : keys(obj).length;
}

module.exports = size;
var keys = require('./keys.js');
var _cb = require('./_cb.js');
var _isArrayLike = require('./_isArrayLike.js');

// Determine if at least one element in the object passes a truth test.
function some(obj, predicate, context) {
  predicate = _cb(predicate, context);
  var _keys = !_isArrayLike(obj) && keys(obj),
      length = (_keys || obj).length;
  for (var index = 0; index < length; index++) {
    var currentKey = _keys ? _keys[index] : index;
    if (predicate(obj[currentKey], currentKey, obj)) return true;
  }
  return false;
}

module.exports = some;
var _cb = require('./_cb.js');
var map = require('./map.js');
var pluck = require('./pluck.js');

// Sort the object's values by a criterion produced by an iteratee.
function sortBy(obj, iteratee, context) {
  var index = 0;
  iteratee = _cb(iteratee, context);
  return pluck(map(obj, function(value, key, list) {
    return {
      value: value,
      index: index++,
      criteria: iteratee(value, key, list)
    };
  }).sort(function(left, right) {
    var a = left.criteria;
    var b = right.criteria;
    if (a !== b) {
      if (a > b || a === void 0) return 1;
      if (a < b || b === void 0) return -1;
    }
    return left.index - right.index;
  }), 'value');
}

module.exports = sortBy;
var _cb = require('./_cb.js');
var _getLength = require('./_getLength.js');

// Use a comparator function to figure out the smallest index at which
// an object should be inserted so as to maintain order. Uses binary search.
function sortedIndex(array, obj, iteratee, context) {
  iteratee = _cb(iteratee, context, 1);
  var value = iteratee(obj);
  var low = 0, high = _getLength(array);
  while (low < high) {
    var mid = Math.floor((low + high) / 2);
    if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
  }
  return low;
}

module.exports = sortedIndex;
// Invokes `interceptor` with the `obj` and then returns `obj`.
// The primary purpose of this method is to "tap into" a method chain, in
// order to perform operations on intermediate results within the chain.
function tap(obj, interceptor) {
  interceptor(obj);
  return obj;
}

module.exports = tap;
var underscore = require('./underscore.js');
var defaults = require('./defaults.js');
require('./templateSettings.js');

// When customizing `_.templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;

// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
  "'": "'",
  '\\': '\\',
  '\r': 'r',
  '\n': 'n',
  '\u2028': 'u2028',
  '\u2029': 'u2029'
};

var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;

function escapeChar(match) {
  return '\\' + escapes[match];
}

// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
// NB: `oldSettings` only exists for backwards compatibility.
function template(text, settings, oldSettings) {
  if (!settings && oldSettings) settings = oldSettings;
  settings = defaults({}, settings, underscore.templateSettings);

  // Combine delimiters into one regular expression via alternation.
  var matcher = RegExp([
    (settings.escape || noMatch).source,
    (settings.interpolate || noMatch).source,
    (settings.evaluate || noMatch).source
  ].join('|') + '|$', 'g');

  // Compile the template source, escaping string literals appropriately.
  var index = 0;
  var source = "__p+='";
  text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
    source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
    index = offset + match.length;

    if (escape) {
      source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
    } else if (interpolate) {
      source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
    } else if (evaluate) {
      source += "';\n" + evaluate + "\n__p+='";
    }

    // Adobe VMs need the match returned to produce the correct offset.
    return match;
  });
  source += "';\n";

  // If a variable is not specified, place data values in local scope.
  if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';

  source = "var __t,__p='',__j=Array.prototype.join," +
    "print=function(){__p+=__j.call(arguments,'');};\n" +
    source + 'return __p;\n';

  var render;
  try {
    render = new Function(settings.variable || 'obj', '_', source);
  } catch (e) {
    e.source = source;
    throw e;
  }

  var template = function(data) {
    return render.call(this, data, underscore);
  };

  // Provide the compiled source as a convenience for precompilation.
  var argument = settings.variable || 'obj';
  template.source = 'function(' + argument + '){\n' + source + '}';

  return template;
}

module.exports = template;
var underscore = require('./underscore.js');

// By default, Underscore uses ERB-style template delimiters. Change the
// following template settings to use alternative delimiters.
var templateSettings = underscore.templateSettings = {
  evaluate: /<%([\s\S]+?)%>/g,
  interpolate: /<%=([\s\S]+?)%>/g,
  escape: /<%-([\s\S]+?)%>/g
};

module.exports = templateSettings;
var now = require('./now.js');

// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time. Normally, the throttled function will run
// as much as it can, without ever going more than once per `wait` duration;
// but if you'd like to disable the execution on the leading edge, pass
// `{leading: false}`. To disable execution on the trailing edge, ditto.
function throttle(func, wait, options) {
  var timeout, context, args, result;
  var previous = 0;
  if (!options) options = {};

  var later = function() {
    previous = options.leading === false ? 0 : now();
    timeout = null;
    result = func.apply(context, args);
    if (!timeout) context = args = null;
  };

  var throttled = function() {
    var _now = now();
    if (!previous && options.leading === false) previous = _now;
    var remaining = wait - (_now - previous);
    context = this;
    args = arguments;
    if (remaining <= 0 || remaining > wait) {
      if (timeout) {
        clearTimeout(timeout);
        timeout = null;
      }
      previous = _now;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    } else if (!timeout && options.trailing !== false) {
      timeout = setTimeout(later, remaining);
    }
    return result;
  };

  throttled.cancel = function() {
    clearTimeout(timeout);
    previous = 0;
    timeout = context = args = null;
  };

  return throttled;
}

module.exports = throttle;
var _optimizeCb = require('./_optimizeCb.js');

// Run a function **n** times.
function times(n, iteratee, context) {
  var accum = Array(Math.max(0, n));
  iteratee = _optimizeCb(iteratee, context, 1);
  for (var i = 0; i < n; i++) accum[i] = iteratee(i);
  return accum;
}

module.exports = times;
var _setup = require('./_setup.js');
var identity = require('./identity.js');
var isArray = require('./isArray.js');
var _isArrayLike = require('./_isArrayLike.js');
var values = require('./values.js');
var isString = require('./isString.js');
var map = require('./map.js');

// Safely create a real, live array from anything iterable.
var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
function toArray(obj) {
  if (!obj) return [];
  if (isArray(obj)) return _setup.slice.call(obj);
  if (isString(obj)) {
    // Keep surrogate pair characters together.
    return obj.match(reStrSymbol);
  }
  if (_isArrayLike(obj)) return map(obj, identity);
  return values(obj);
}

module.exports = toArray;
var _setup = require('./_setup.js');
var underscore = require('./underscore.js');
var _chainResult = require('./_chainResult.js');
var each = require('./each.js');

// Add all mutator `Array` functions to the wrapper.
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
  var method = _setup.ArrayProto[name];
  underscore.prototype[name] = function() {
    var obj = this._wrapped;
    if (obj != null) {
      method.apply(obj, arguments);
      if ((name === 'shift' || name === 'splice') && obj.length === 0) {
        delete obj[0];
      }
    }
    return _chainResult(this, obj);
  };
});

// Add all accessor `Array` functions to the wrapper.
each(['concat', 'join', 'slice'], function(name) {
  var method = _setup.ArrayProto[name];
  underscore.prototype[name] = function() {
    var obj = this._wrapped;
    if (obj != null) obj = method.apply(obj, arguments);
    return _chainResult(this, obj);
  };
});

module.exports = underscore;
var _setup = require('./_setup.js');
var underscore = require('./underscore.js');
var _chainResult = require('./_chainResult.js');
var each = require('./each.js');

// Add all mutator `Array` functions to the wrapper.
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
  var method = _setup.ArrayProto[name];
  underscore.prototype[name] = function() {
    var obj = this._wrapped;
    if (obj != null) {
      method.apply(obj, arguments);
      if ((name === 'shift' || name === 'splice') && obj.length === 0) {
        delete obj[0];
      }
    }
    return _chainResult(this, obj);
  };
});

// Add all accessor `Array` functions to the wrapper.
each(['concat', 'join', 'slice'], function(name) {
  var method = _setup.ArrayProto[name];
  underscore.prototype[name] = function() {
    var obj = this._wrapped;
    if (obj != null) obj = method.apply(obj, arguments);
    return _chainResult(this, obj);
  };
});

// Extracts the result from a wrapped and chained object.
underscore.prototype.value = function() {
  return this._wrapped;
};

// Provide unwrapping proxies for some methods used in engine operations
// such as arithmetic and JSON stringification.
underscore.prototype.valueOf = underscore.prototype.toJSON = underscore.prototype.value;

underscore.prototype.toString = function() {
  return String(this._wrapped);
};

module.exports = underscore;
var _setup = require('./_setup.js');

// If Underscore is called as a function, it returns a wrapped object that can
// be used OO-style. This wrapper holds altered versions of all functions added
// through `_.mixin`. Wrapped objects may be chained.
function _(obj) {
  if (obj instanceof _) return obj;
  if (!(this instanceof _)) return new _(obj);
  this._wrapped = obj;
}

_.VERSION = _setup.VERSION;

// Extracts the result from a wrapped and chained object.
_.prototype.value = function() {
  return this._wrapped;
};

// Provide unwrapping proxies for some methods used in engine operations
// such as arithmetic and JSON stringification.
_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;

_.prototype.toString = function() {
  return String(this._wrapped);
};

module.exports = _;
var _createEscaper = require('./_createEscaper.js');
var _unescapeMap = require('./_unescapeMap.js');

// Function for unescaping strings from HTML interpolation.
var _unescape = _createEscaper(_unescapeMap);

module.exports = _unescape;
var _flatten = require('./_flatten.js');
var restArguments = require('./restArguments.js');
var uniq = require('./uniq.js');

// Produce an array that contains the union: each distinct element from all of
// the passed-in arrays.
var union = restArguments(function(arrays) {
  return uniq(_flatten(arrays, true, true));
});

module.exports = union;
var _cb = require('./_cb.js');
var _getLength = require('./_getLength.js');
var contains = require('./contains.js');
var isBoolean = require('./isBoolean.js');

// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// The faster algorithm will not work with an iteratee if the iteratee
// is not a one-to-one function, so providing an iteratee will disable
// the faster algorithm.
function uniq(array, isSorted, iteratee, context) {
  if (!isBoolean(isSorted)) {
    context = iteratee;
    iteratee = isSorted;
    isSorted = false;
  }
  if (iteratee != null) iteratee = _cb(iteratee, context);
  var result = [];
  var seen = [];
  for (var i = 0, length = _getLength(array); i < length; i++) {
    var value = array[i],
        computed = iteratee ? iteratee(value, i, array) : value;
    if (isSorted && !iteratee) {
      if (!i || seen !== computed) result.push(value);
      seen = computed;
    } else if (iteratee) {
      if (!contains(seen, computed)) {
        seen.push(computed);
        result.push(value);
      }
    } else if (!contains(result, value)) {
      result.push(value);
    }
  }
  return result;
}

module.exports = uniq;
// Generate a unique integer id (unique within the entire client session).
// Useful for temporary DOM ids.
var idCounter = 0;
function uniqueId(prefix) {
  var id = ++idCounter + '';
  return prefix ? prefix + id : id;
}

module.exports = uniqueId;
var _getLength = require('./_getLength.js');
var pluck = require('./pluck.js');
var max = require('./max.js');

// Complement of zip. Unzip accepts an array of arrays and groups
// each array's elements on shared indices.
function unzip(array) {
  var length = array && max(array, _getLength).length || 0;
  var result = Array(length);

  for (var index = 0; index < length; index++) {
    result[index] = pluck(array, index);
  }
  return result;
}

module.exports = unzip;
var keys = require('./keys.js');

// Retrieve the values of an object's properties.
function values(obj) {
  var _keys = keys(obj);
  var length = _keys.length;
  var values = Array(length);
  for (var i = 0; i < length; i++) {
    values[i] = obj[_keys[i]];
  }
  return values;
}

module.exports = values;
var matcher = require('./matcher.js');
var filter = require('./filter.js');

// Convenience version of a common use case of `_.filter`: selecting only
// objects containing specific `key:value` pairs.
function where(obj, attrs) {
  return filter(obj, matcher(attrs));
}

module.exports = where;
var restArguments = require('./restArguments.js');
var difference = require('./difference.js');

// Return a version of the array that does not contain the specified value(s).
var without = restArguments(function(array, otherArrays) {
  return difference(array, otherArrays);
});

module.exports = without;
var partial = require('./partial.js');

// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
function wrap(func, wrapper) {
  return partial(wrapper, func);
}

module.exports = wrap;
var restArguments = require('./restArguments.js');
var unzip = require('./unzip.js');

// Zip together multiple lists into a single array -- elements that share
// an index go together.
var zip = restArguments(unzip);

module.exports = zip;
define(['./isObject', './_setup'], function (isObject, _setup) {

  // Create a naked function reference for surrogate-prototype-swapping.
  function ctor() {
    return function(){};
  }

  // An internal function for creating a new object that inherits from another.
  function baseCreate(prototype) {
    if (!isObject(prototype)) return {};
    if (_setup.nativeCreate) return _setup.nativeCreate(prototype);
    var Ctor = ctor();
    Ctor.prototype = prototype;
    var result = new Ctor;
    Ctor.prototype = null;
    return result;
  }

  return baseCreate;

});
define(['./isObject', './identity', './isFunction', './isArray', './matcher', './property', './_optimizeCb'], function (isObject, identity, isFunction, isArray, matcher, property, _optimizeCb) {

  // An internal function to generate callbacks that can be applied to each
  // element in a collection, returning the desired result â€” either `_.identity`,
  // an arbitrary callback, a property matcher, or a property accessor.
  function baseIteratee(value, context, argCount) {
    if (value == null) return identity;
    if (isFunction(value)) return _optimizeCb(value, context, argCount);
    if (isObject(value) && !isArray(value)) return matcher(value);
    return property(value);
  }

  return baseIteratee;

});
define(['./_baseIteratee', './underscore', './iteratee'], function (_baseIteratee, underscore, iteratee) {

  // The function we call internally to generate a callback. It invokes
  // `_.iteratee` if overridden, otherwise `baseIteratee`.
  function cb(value, context, argCount) {
    if (underscore.iteratee !== iteratee) return underscore.iteratee(value, context);
    return _baseIteratee(value, context, argCount);
  }

  return cb;

});
define(['./underscore'], function (underscore) {

  // Helper function to continue chaining intermediate results.
  function chainResult(instance, obj) {
    return instance._chain ? underscore(obj).chain() : obj;
  }

  return chainResult;

});
define(['./_setup', './isFunction', './_has'], function (_setup, isFunction, _has) {

  // Internal helper to create a simple lookup structure.
  // `collectNonEnumProps` used to depend on `_.contains`, but this led to
  // circular imports. `emulatedSet` is a one-off solution that only works for
  // arrays of strings.
  function emulatedSet(keys) {
    var hash = {};
    for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
    return {
      contains: function(key) { return hash[key]; },
      push: function(key) {
        hash[key] = true;
        return keys.push(key);
      }
    };
  }

  // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
  // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
  // needed.
  function collectNonEnumProps(obj, keys) {
    keys = emulatedSet(keys);
    var nonEnumIdx = _setup.nonEnumerableProps.length;
    var constructor = obj.constructor;
    var proto = isFunction(constructor) && constructor.prototype || _setup.ObjProto;

    // Constructor is a special case.
    var prop = 'constructor';
    if (_has(obj, prop) && !keys.contains(prop)) keys.push(prop);

    while (nonEnumIdx--) {
      prop = _setup.nonEnumerableProps[nonEnumIdx];
      if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
        keys.push(prop);
      }
    }
  }

  return collectNonEnumProps;

});
define(function () {

  // An internal function for creating assigner functions.
  function createAssigner(keysFunc, defaults) {
    return function(obj) {
      var length = arguments.length;
      if (defaults) obj = Object(obj);
      if (length < 2 || obj == null) return obj;
      for (var index = 1; index < length; index++) {
        var source = arguments[index],
            keys = keysFunc(source),
            l = keys.length;
        for (var i = 0; i < l; i++) {
          var key = keys[i];
          if (!defaults || obj[key] === void 0) obj[key] = source[key];
        }
      }
      return obj;
    };
  }

  return createAssigner;

});
define(['./keys'], function (keys) {

  // Internal helper to generate functions for escaping and unescaping strings
  // to/from HTML interpolation.
  function createEscaper(map) {
    var escaper = function(match) {
      return map[match];
    };
    // Regexes for identifying a key that needs to be escaped.
    var source = '(?:' + keys(map).join('|') + ')';
    var testRegexp = RegExp(source);
    var replaceRegexp = RegExp(source, 'g');
    return function(string) {
      string = string == null ? '' : '' + string;
      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
    };
  }

  return createEscaper;

});
define(['./_setup', './_getLength', './isNaN'], function (_setup, _getLength, _isNaN) {

  // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
  function createIndexFinder(dir, predicateFind, sortedIndex) {
    return function(array, item, idx) {
      var i = 0, length = _getLength(array);
      if (typeof idx == 'number') {
        if (dir > 0) {
          i = idx >= 0 ? idx : Math.max(idx + length, i);
        } else {
          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
        }
      } else if (sortedIndex && idx && length) {
        idx = sortedIndex(array, item);
        return array[idx] === item ? idx : -1;
      }
      if (item !== item) {
        idx = predicateFind(_setup.slice.call(array, i, length), _isNaN);
        return idx >= 0 ? idx + i : -1;
      }
      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
        if (array[idx] === item) return idx;
      }
      return -1;
    };
  }

  return createIndexFinder;

});
define(['./_cb', './_getLength'], function (_cb, _getLength) {

  // Internal function to generate `_.findIndex` and `_.findLastIndex`.
  function createPredicateIndexFinder(dir) {
    return function(array, predicate, context) {
      predicate = _cb(predicate, context);
      var length = _getLength(array);
      var index = dir > 0 ? 0 : length - 1;
      for (; index >= 0 && index < length; index += dir) {
        if (predicate(array[index], index, array)) return index;
      }
      return -1;
    };
  }

  return createPredicateIndexFinder;

});
define(['./keys', './_optimizeCb', './_isArrayLike'], function (keys, _optimizeCb, _isArrayLike) {

  // Internal helper to create a reducing function, iterating left or right.
  function createReduce(dir) {
    // Wrap code that reassigns argument variables in a separate function than
    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
    var reducer = function(obj, iteratee, memo, initial) {
      var _keys = !_isArrayLike(obj) && keys(obj),
          length = (_keys || obj).length,
          index = dir > 0 ? 0 : length - 1;
      if (!initial) {
        memo = obj[_keys ? _keys[index] : index];
        index += dir;
      }
      for (; index >= 0 && index < length; index += dir) {
        var currentKey = _keys ? _keys[index] : index;
        memo = iteratee(memo, obj[currentKey], currentKey, obj);
      }
      return memo;
    };

    return function(obj, iteratee, memo, context) {
      var initial = arguments.length >= 3;
      return reducer(obj, _optimizeCb(iteratee, context, 4), memo, initial);
    };
  }

  return createReduce;

});
define(['./_setup'], function (_setup) {

  // Common internal logic for `isArrayLike` and `isBufferLike`.
  function createSizePropertyCheck(getSizeProperty) {
    return function(collection) {
      var sizeProperty = getSizeProperty(collection);
      return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= _setup.MAX_ARRAY_INDEX;
    }
  }

  return createSizePropertyCheck;

});
define(function () {

  // Internal function to obtain a nested property in `obj` along `path`.
  function deepGet(obj, path) {
    var length = path.length;
    for (var i = 0; i < length; i++) {
      if (obj == null) return void 0;
      obj = obj[path[i]];
    }
    return length ? obj : void 0;
  }

  return deepGet;

});
define(function () {

  // Internal list of HTML entities for escaping.
  var escapeMap = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#x27;',
    '`': '&#x60;'
  };

  return escapeMap;

});
define(['./isObject', './_baseCreate'], function (isObject, _baseCreate) {

  // Internal function to execute `sourceFunc` bound to `context` with optional
  // `args`. Determines whether to execute a function as a constructor or as a
  // normal function.
  function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
    var self = _baseCreate(sourceFunc.prototype);
    var result = sourceFunc.apply(self, args);
    if (isObject(result)) return result;
    return self;
  }

  return executeBound;

});
define(['./isArray', './_getLength', './_isArrayLike', './isArguments'], function (isArray, _getLength, _isArrayLike, isArguments) {

  // Internal implementation of a recursive `flatten` function.
  function flatten(input, depth, strict, output) {
    output = output || [];
    if (!depth && depth !== 0) {
      depth = Infinity;
    } else if (depth <= 0) {
      return output.concat(input);
    }
    var idx = output.length;
    for (var i = 0, length = _getLength(input); i < length; i++) {
      var value = input[i];
      if (_isArrayLike(value) && (isArray(value) || isArguments(value))) {
        // Flatten current level of array or arguments object.
        if (depth > 1) {
          flatten(value, depth - 1, strict, output);
          idx = output.length;
        } else {
          var j = 0, len = value.length;
          while (j < len) output[idx++] = value[j++];
        }
      } else if (!strict) {
        output[idx++] = value;
      }
    }
    return output;
  }

  return flatten;

});
define(['./_shallowProperty'], function (_shallowProperty) {

	// Internal helper to obtain the `byteLength` property of an object.
	var getByteLength = _shallowProperty('byteLength');

	return getByteLength;

});
define(['./_shallowProperty'], function (_shallowProperty) {

	// Internal helper to obtain the `length` property of an object.
	var getLength = _shallowProperty('length');

	return getLength;

});
define(['./_cb', './each'], function (_cb, each) {

  // An internal function used for aggregate "group by" operations.
  function group(behavior, partition) {
    return function(obj, iteratee, context) {
      var result = partition ? [[], []] : {};
      iteratee = _cb(iteratee, context);
      each(obj, function(value, index) {
        var key = iteratee(value, index, obj);
        behavior(result, value, key);
      });
      return result;
    };
  }

  return group;

});
define(['./_setup'], function (_setup) {

  // Internal function to check whether `key` is an own property name of `obj`.
  function has(obj, key) {
    return obj != null && _setup.hasOwnProperty.call(obj, key);
  }

  return has;

});
define(['./_getLength', './_createSizePropertyCheck'], function (_getLength, _createSizePropertyCheck) {

	// Internal helper for collection methods to determine whether a collection
	// should be iterated as an array or as an object.
	// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
	// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
	var isArrayLike = _createSizePropertyCheck(_getLength);

	return isArrayLike;

});
define(['./_createSizePropertyCheck', './_getByteLength'], function (_createSizePropertyCheck, _getByteLength) {

	// Internal helper to determine whether we should spend extensive checks against
	// `ArrayBuffer` et al.
	var isBufferLike = _createSizePropertyCheck(_getByteLength);

	return isBufferLike;

});
define(function () {

  // Internal `_.pick` helper function to determine whether `key` is an enumerable
  // property name of `obj`.
  function keyInObj(value, key, obj) {
    return key in obj;
  }

  return keyInObj;

});
define(function () {

  // Internal function that returns an efficient (for current engines) version
  // of the passed-in callback, to be repeatedly applied in other Underscore
  // functions.
  function optimizeCb(func, context, argCount) {
    if (context === void 0) return func;
    switch (argCount == null ? 3 : argCount) {
      case 1: return function(value) {
        return func.call(context, value);
      };
      // The 2-argument case is omitted because weâ€™re not using it.
      case 3: return function(value, index, collection) {
        return func.call(context, value, index, collection);
      };
      case 4: return function(accumulator, value, index, collection) {
        return func.call(context, accumulator, value, index, collection);
      };
    }
    return function() {
      return func.apply(context, arguments);
    };
  }

  return optimizeCb;

});
define(['exports'], function (exports) {

  // Current version.
  var VERSION = '1.11.0';

  // Establish the root object, `window` (`self`) in the browser, `global`
  // on the server, or `this` in some virtual machines. We use `self`
  // instead of `window` for `WebWorker` support.
  var root = typeof self == 'object' && self.self === self && self ||
            typeof global == 'object' && global.global === global && global ||
            Function('return this')() ||
            {};

  // Save bytes in the minified (but not gzipped) version:
  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;

  // Create quick reference variables for speed access to core prototypes.
  var push = ArrayProto.push,
      slice = ArrayProto.slice,
      toString = ObjProto.toString,
      hasOwnProperty = ObjProto.hasOwnProperty;

  // Modern feature detection.
  var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined';

  // All **ECMAScript 5+** native function implementations that we hope to use
  // are declared here.
  var nativeIsArray = Array.isArray,
      nativeKeys = Object.keys,
      nativeCreate = Object.create,
      nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;

  // Create references to these builtin functions because we override them.
  var _isNaN = isNaN,
      _isFinite = isFinite;

  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

  // The largest integer that can be represented exactly.
  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;

  exports.ArrayProto = ArrayProto;
  exports.MAX_ARRAY_INDEX = MAX_ARRAY_INDEX;
  exports.ObjProto = ObjProto;
  exports.SymbolProto = SymbolProto;
  exports.VERSION = VERSION;
  exports._isFinite = _isFinite;
  exports._isNaN = _isNaN;
  exports.hasEnumBug = hasEnumBug;
  exports.hasOwnProperty = hasOwnProperty;
  exports.nativeCreate = nativeCreate;
  exports.nativeIsArray = nativeIsArray;
  exports.nativeIsView = nativeIsView;
  exports.nativeKeys = nativeKeys;
  exports.nonEnumerableProps = nonEnumerableProps;
  exports.push = push;
  exports.root = root;
  exports.slice = slice;
  exports.supportsArrayBuffer = supportsArrayBuffer;
  exports.toString = toString;

  Object.defineProperty(exports, '__esModule', { value: true });

});
define(function () {

  // Internal helper to generate a function to obtain property `key` from `obj`.
  function shallowProperty(key) {
    return function(obj) {
      return obj == null ? void 0 : obj[key];
    };
  }

  return shallowProperty;

});
define(['./_setup'], function (_setup) {

  // Internal function for creating a `toString`-based type tester.
  function tagTester(name) {
    return function(obj) {
      return _setup.toString.call(obj) === '[object ' + name + ']';
    };
  }

  return tagTester;

});
define(['./_escapeMap', './invert'], function (_escapeMap, invert) {

	// Internal list of HTML entities for unescaping.
	var unescapeMap = invert(_escapeMap);

	return unescapeMap;

});
define(function () {

  // Returns a function that will only be executed on and after the Nth call.
  function after(times, func) {
    return function() {
      if (--times < 1) {
        return func.apply(this, arguments);
      }
    };
  }

  return after;

});
define(['./isObject', './_setup', './_collectNonEnumProps'], function (isObject, _setup, _collectNonEnumProps) {

  // Retrieve all the enumerable property names of an object.
  function allKeys(obj) {
    if (!isObject(obj)) return [];
    var keys = [];
    for (var key in obj) keys.push(key);
    // Ahem, IE < 9.
    if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys);
    return keys;
  }

  return allKeys;

});
define(function () {

  // Returns a function that will only be executed up to (but not including) the
  // Nth call.
  function before(times, func) {
    var memo;
    return function() {
      if (--times > 0) {
        memo = func.apply(this, arguments);
      }
      if (times <= 1) func = null;
      return memo;
    };
  }

  return before;

});
define(['./isFunction', './_executeBound', './restArguments'], function (isFunction, _executeBound, restArguments) {

  // Create a function bound to a given object (assigning `this`, and arguments,
  // optionally).
  var bind = restArguments(function(func, context, args) {
    if (!isFunction(func)) throw new TypeError('Bind must be called on a function');
    var bound = restArguments(function(callArgs) {
      return _executeBound(func, bound, context, this, args.concat(callArgs));
    });
    return bound;
  });

  return bind;

});
define(['./_flatten', './restArguments', './bind'], function (_flatten, restArguments, bind) {

  // Bind a number of an object's methods to that object. Remaining arguments
  // are the method names to be bound. Useful for ensuring that all callbacks
  // defined on an object belong to it.
  var bindAll = restArguments(function(obj, keys) {
    keys = _flatten(keys, false, false);
    var index = keys.length;
    if (index < 1) throw new Error('bindAll must be passed function names');
    while (index--) {
      var key = keys[index];
      obj[key] = bind(obj[key], obj);
    }
    return obj;
  });

  return bindAll;

});
define(['./underscore'], function (underscore) {

  // Start chaining a wrapped Underscore object.
  function chain(obj) {
    var instance = underscore(obj);
    instance._chain = true;
    return instance;
  }

  return chain;

});
define(['./_setup'], function (_setup) {

  // Chunk a single array into multiple arrays, each containing `count` or fewer
  // items.
  function chunk(array, count) {
    if (count == null || count < 1) return [];
    var result = [];
    var i = 0, length = array.length;
    while (i < length) {
      result.push(_setup.slice.call(array, i, i += count));
    }
    return result;
  }

  return chunk;

});
define(['./isObject', './isArray', './extend'], function (isObject, isArray, extend) {

  // Create a (shallow-cloned) duplicate of an object.
  function clone(obj) {
    if (!isObject(obj)) return obj;
    return isArray(obj) ? obj.slice() : extend({}, obj);
  }

  return clone;

});
define(['./filter'], function (filter) {

  // Trim out all falsy values from an array.
  function compact(array) {
    return filter(array, Boolean);
  }

  return compact;

});
define(function () {

  // Returns a function that is the composition of a list of functions, each
  // consuming the return value of the function that follows.
  function compose() {
    var args = arguments;
    var start = args.length - 1;
    return function() {
      var i = start;
      var result = args[start].apply(this, arguments);
      while (i--) result = args[i].call(this, result);
      return result;
    };
  }

  return compose;

});
define(function () {

  // Predicate-generating function. Often useful outside of Underscore.
  function constant(value) {
    return function() {
      return value;
    };
  }

  return constant;

});
define(['./_isArrayLike', './values', './indexOf'], function (_isArrayLike, values, indexOf) {

  // Determine if the array or object contains a given item (using `===`).
  function contains(obj, item, fromIndex, guard) {
    if (!_isArrayLike(obj)) obj = values(obj);
    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
    return indexOf(obj, item, fromIndex) >= 0;
  }

  return contains;

});
define(['./_has', './_group'], function (_has, _group) {

  // Counts instances of an object that group by a certain criterion. Pass
  // either a string attribute to count by, or a function that returns the
  // criterion.
  var countBy = _group(function(result, value, key) {
    if (_has(result, key)) result[key]++; else result[key] = 1;
  });

  return countBy;

});
define(['./_baseCreate', './extendOwn'], function (_baseCreate, extendOwn) {

  // Creates an object that inherits from the given prototype object.
  // If additional properties are provided then they will be added to the
  // created object.
  function create(prototype, props) {
    var result = _baseCreate(prototype);
    if (props) extendOwn(result, props);
    return result;
  }

  return create;

});
define(['./restArguments', './delay'], function (restArguments, delay) {

  // When a sequence of calls of the returned function ends, the argument
  // function is triggered. The end of a sequence is defined by the `wait`
  // parameter. If `immediate` is passed, the argument function will be
  // triggered at the beginning of the sequence instead of at the end.
  function debounce(func, wait, immediate) {
    var timeout, result;

    var later = function(context, args) {
      timeout = null;
      if (args) result = func.apply(context, args);
    };

    var debounced = restArguments(function(args) {
      if (timeout) clearTimeout(timeout);
      if (immediate) {
        var callNow = !timeout;
        timeout = setTimeout(later, wait);
        if (callNow) result = func.apply(this, args);
      } else {
        timeout = delay(later, wait, this, args);
      }

      return result;
    });

    debounced.cancel = function() {
      clearTimeout(timeout);
      timeout = null;
    };

    return debounced;
  }

  return debounce;

});
define(['./_createAssigner', './allKeys'], function (_createAssigner, allKeys) {

	// Fill in a given object with default properties.
	var defaults = _createAssigner(allKeys, true);

	return defaults;

});
define(['./underscore', './delay', './partial'], function (underscore, delay, partial) {

	// Defers a function, scheduling it to run after the current call stack has
	// cleared.
	var defer = partial(delay, underscore, 1);

	return defer;

});
define(['./restArguments'], function (restArguments) {

  // Delays a function for the given number of milliseconds, and then calls
  // it with the arguments supplied.
  var delay = restArguments(function(func, wait, args) {
    return setTimeout(function() {
      return func.apply(null, args);
    }, wait);
  });

  return delay;

});
define(['./_flatten', './restArguments', './filter', './contains'], function (_flatten, restArguments, filter, contains) {

  // Take the difference between one array and a number of other arrays.
  // Only the elements present in just the first array will remain.
  var difference = restArguments(function(array, rest) {
    rest = _flatten(rest, true, true);
    return filter(array, function(value){
      return !contains(rest, value);
    });
  });

  return difference;

});
define(['./keys', './_optimizeCb', './_isArrayLike'], function (keys, _optimizeCb, _isArrayLike) {

  // The cornerstone for collection functions, an `each`
  // implementation, aka `forEach`.
  // Handles raw objects in addition to array-likes. Treats all
  // sparse array-likes as if they were dense.
  function each(obj, iteratee, context) {
    iteratee = _optimizeCb(iteratee, context);
    var i, length;
    if (_isArrayLike(obj)) {
      for (i = 0, length = obj.length; i < length; i++) {
        iteratee(obj[i], i, obj);
      }
    } else {
      var _keys = keys(obj);
      for (i = 0, length = _keys.length; i < length; i++) {
        iteratee(obj[_keys[i]], _keys[i], obj);
      }
    }
    return obj;
  }

  return each;

});
define(['./_createEscaper', './_escapeMap'], function (_createEscaper, _escapeMap) {

	// Function for escaping strings to HTML interpolation.
	var _escape = _createEscaper(_escapeMap);

	return _escape;

});
define(['./keys', './_cb', './_isArrayLike'], function (keys, _cb, _isArrayLike) {

  // Determine whether all of the elements pass a truth test.
  function every(obj, predicate, context) {
    predicate = _cb(predicate, context);
    var _keys = !_isArrayLike(obj) && keys(obj),
        length = (_keys || obj).length;
    for (var index = 0; index < length; index++) {
      var currentKey = _keys ? _keys[index] : index;
      if (!predicate(obj[currentKey], currentKey, obj)) return false;
    }
    return true;
  }

  return every;

});
define(['./_createAssigner', './allKeys'], function (_createAssigner, allKeys) {

	// Extend a given object with all the properties in passed-in object(s).
	var extend = _createAssigner(allKeys);

	return extend;

});
define(['./_createAssigner', './keys'], function (_createAssigner, keys) {

	// Assigns a given object with all the own properties in the passed-in
	// object(s).
	// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
	var extendOwn = _createAssigner(keys);

	return extendOwn;

});
define(['./_cb', './each'], function (_cb, each) {

  // Return all the elements that pass a truth test.
  function filter(obj, predicate, context) {
    var results = [];
    predicate = _cb(predicate, context);
    each(obj, function(value, index, list) {
      if (predicate(value, index, list)) results.push(value);
    });
    return results;
  }

  return filter;

});
define(['./_isArrayLike', './findIndex', './findKey'], function (_isArrayLike, findIndex, findKey) {

  // Return the first value which passes a truth test.
  function find(obj, predicate, context) {
    var keyFinder = _isArrayLike(obj) ? findIndex : findKey;
    var key = keyFinder(obj, predicate, context);
    if (key !== void 0 && key !== -1) return obj[key];
  }

  return find;

});
define(['./_createPredicateIndexFinder'], function (_createPredicateIndexFinder) {

	// Returns the first index on an array-like that passes a truth test.
	var findIndex = _createPredicateIndexFinder(1);

	return findIndex;

});
define(['./keys', './_cb'], function (keys, _cb) {

  // Returns the first key on an object that passes a truth test.
  function findKey(obj, predicate, context) {
    predicate = _cb(predicate, context);
    var _keys = keys(obj), key;
    for (var i = 0, length = _keys.length; i < length; i++) {
      key = _keys[i];
      if (predicate(obj[key], key, obj)) return key;
    }
  }

  return findKey;

});
define(['./_createPredicateIndexFinder'], function (_createPredicateIndexFinder) {

	// Returns the last index on an array-like that passes a truth test.
	var findLastIndex = _createPredicateIndexFinder(-1);

	return findLastIndex;

});
define(['./matcher', './find'], function (matcher, find) {

  // Convenience version of a common use case of `_.find`: getting the first
  // object containing specific `key:value` pairs.
  function findWhere(obj, attrs) {
    return find(obj, matcher(attrs));
  }

  return findWhere;

});
define(['./initial'], function (initial) {

  // Get the first element of an array. Passing **n** will return the first N
  // values in the array. The **guard** check allows it to work with `_.map`.
  function first(array, n, guard) {
    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
    if (n == null || guard) return array[0];
    return initial(array, array.length - n);
  }

  return first;

});
define(['./_flatten'], function (_flatten) {

  // Flatten out an array, either recursively (by default), or up to `depth`.
  // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
  function flatten(array, depth) {
    return _flatten(array, depth, false);
  }

  return flatten;

});
define(['./isFunction'], function (isFunction) {

  // Return a sorted list of the function names available on the object.
  function functions(obj) {
    var names = [];
    for (var key in obj) {
      if (isFunction(obj[key])) names.push(key);
    }
    return names.sort();
  }

  return functions;

});
define(['./_has', './_group'], function (_has, _group) {

  // Groups the object's values by a criterion. Pass either a string attribute
  // to group by, or a function that returns the criterion.
  var groupBy = _group(function(result, value, key) {
    if (_has(result, key)) result[key].push(value); else result[key] = [value];
  });

  return groupBy;

});
define(['./_setup', './isArray', './_has'], function (_setup, isArray, _has) {

  // Shortcut function for checking if an object has a given property directly on
  // itself (in other words, not on a prototype). Unlike the internal `has`
  // function, this public version can also traverse nested properties.
  function has(obj, path) {
    if (!isArray(path)) {
      return _has(obj, path);
    }
    var length = path.length;
    for (var i = 0; i < length; i++) {
      var key = path[i];
      if (obj == null || !_setup.hasOwnProperty.call(obj, key)) {
        return false;
      }
      obj = obj[key];
    }
    return !!length;
  }

  return has;

});
define(function () {

  // Keep the identity function around for default iteratees.
  function identity(value) {
    return value;
  }

  return identity;

});
define(['./mixin', './index'], function (mixin, index) {

	// Default Export

	// Add all of the Underscore functions to the wrapper object.
	var _ = mixin(index);
	// Legacy Node.js API.
	_._ = _;

	return _;

});
define(['exports', './isObject', './_setup', './identity', './isFunction', './isArray', './keys', './extendOwn', './isMatch', './matcher', './property', './iteratee', './isNumber', './isNaN', './isArguments', './each', './invert', './after', './allKeys', './before', './restArguments', './bind', './bindAll', './chain', './chunk', './extend', './clone', './filter', './compact', './compose', './constant', './values', './sortedIndex', './findIndex', './indexOf', './contains', './countBy', './create', './delay', './debounce', './defaults', './partial', './defer', './difference', './escape', './every', './findKey', './find', './findLastIndex', './findWhere', './initial', './first', './flatten', './functions', './groupBy', './has', './isNull', './isUndefined', './isBoolean', './isElement', './isString', './isDate', './isRegExp', './isError', './isSymbol', './isMap', './isWeakMap', './isSet', './isWeakSet', './isArrayBuffer', './isDataView', './isFinite', './isTypedArray', './isEmpty', './isEqual', './pairs', './tap', './mapObject', './noop', './propertyOf', './times', './random', './now', './unescape', './templateSettings', './template', './result', './uniqueId', './memoize', './throttle', './wrap', './negate', './once', './lastIndexOf', './map', './reduce', './reduceRight', './reject', './some', './invoke', './pluck', './where', './max', './min', './sample', './shuffle', './sortBy', './indexBy', './partition', './toArray', './size', './pick', './omit', './rest', './last', './without', './uniq', './union', './intersection', './unzip', './zip', './object', './range', './mixin', './underscore-array-methods'], function (exports, isObject, _setup, identity, isFunction, isArray, keys, extendOwn, isMatch, matcher, property, iteratee, isNumber, _isNaN, isArguments, each, invert, after, allKeys, before, restArguments, bind, bindAll, chain, chunk, extend, clone, filter, compact, compose, constant, values, sortedIndex, findIndex, indexOf, contains, countBy, create, delay, debounce, defaults, partial, defer, difference, _escape, every, findKey, find, findLastIndex, findWhere, initial, first, flatten, functions, groupBy, has, isNull, isUndefined, isBoolean, isElement, isString, isDate, isRegExp, isError, isSymbol, isMap, isWeakMap, isSet, isWeakSet, isArrayBuffer, isDataView, _isFinite, isTypedArray, isEmpty, isEqual, pairs, tap, mapObject, noop, propertyOf, times, random, now, _unescape, templateSettings, template, result, uniqueId, memoize, throttle, wrap, negate, once, lastIndexOf, map, reduce, reduceRight, reject, some, invoke, pluck, where, max, min, sample, shuffle, sortBy, indexBy, partition, toArray, size, pick, omit, rest, last, without, uniq, union, intersection, unzip, zip, object, range, mixin, underscoreArrayMethods) {

         // Named Exports

         exports.isObject = isObject;
         exports.VERSION = _setup.VERSION;
         exports.identity = identity;
         exports.isFunction = isFunction;
         exports.isArray = isArray;
         exports.keys = keys;
         exports.assign = extendOwn;
         exports.extendOwn = extendOwn;
         exports.isMatch = isMatch;
         exports.matcher = matcher;
         exports.matches = matcher;
         exports.property = property;
         exports.iteratee = iteratee;
         exports.isNumber = isNumber;
         exports.isNaN = _isNaN;
         exports.isArguments = isArguments;
         exports.each = each;
         exports.forEach = each;
         exports.invert = invert;
         exports.after = after;
         exports.allKeys = allKeys;
         exports.before = before;
         exports.restArguments = restArguments;
         exports.bind = bind;
         exports.bindAll = bindAll;
         exports.chain = chain;
         exports.chunk = chunk;
         exports.extend = extend;
         exports.clone = clone;
         exports.filter = filter;
         exports.select = filter;
         exports.compact = compact;
         exports.compose = compose;
         exports.constant = constant;
         exports.values = values;
         exports.sortedIndex = sortedIndex;
         exports.findIndex = findIndex;
         exports.indexOf = indexOf;
         exports.contains = contains;
         exports.include = contains;
         exports.includes = contains;
         exports.countBy = countBy;
         exports.create = create;
         exports.delay = delay;
         exports.debounce = debounce;
         exports.defaults = defaults;
         exports.partial = partial;
         exports.defer = defer;
         exports.difference = difference;
         exports.escape = _escape;
         exports.all = every;
         exports.every = every;
         exports.findKey = findKey;
         exports.detect = find;
         exports.find = find;
         exports.findLastIndex = findLastIndex;
         exports.findWhere = findWhere;
         exports.initial = initial;
         exports.first = first;
         exports.head = first;
         exports.take = first;
         exports.flatten = flatten;
         exports.functions = functions;
         exports.methods = functions;
         exports.groupBy = groupBy;
         exports.has = has;
         exports.isNull = isNull;
         exports.isUndefined = isUndefined;
         exports.isBoolean = isBoolean;
         exports.isElement = isElement;
         exports.isString = isString;
         exports.isDate = isDate;
         exports.isRegExp = isRegExp;
         exports.isError = isError;
         exports.isSymbol = isSymbol;
         exports.isMap = isMap;
         exports.isWeakMap = isWeakMap;
         exports.isSet = isSet;
         exports.isWeakSet = isWeakSet;
         exports.isArrayBuffer = isArrayBuffer;
         exports.isDataView = isDataView;
         exports.isFinite = _isFinite;
         exports.isTypedArray = isTypedArray;
         exports.isEmpty = isEmpty;
         exports.isEqual = isEqual;
         exports.pairs = pairs;
         exports.tap = tap;
         exports.mapObject = mapObject;
         exports.noop = noop;
         exports.propertyOf = propertyOf;
         exports.times = times;
         exports.random = random;
         exports.now = now;
         exports.unescape = _unescape;
         exports.templateSettings = templateSettings;
         exports.template = template;
         exports.result = result;
         exports.uniqueId = uniqueId;
         exports.memoize = memoize;
         exports.throttle = throttle;
         exports.wrap = wrap;
         exports.negate = negate;
         exports.once = once;
         exports.lastIndexOf = lastIndexOf;
         exports.collect = map;
         exports.map = map;
         exports.foldl = reduce;
         exports.inject = reduce;
         exports.reduce = reduce;
         exports.foldr = reduceRight;
         exports.reduceRight = reduceRight;
         exports.reject = reject;
         exports.any = some;
         exports.some = some;
         exports.invoke = invoke;
         exports.pluck = pluck;
         exports.where = where;
         exports.max = max;
         exports.min = min;
         exports.sample = sample;
         exports.shuffle = shuffle;
         exports.sortBy = sortBy;
         exports.indexBy = indexBy;
         exports.partition = partition;
         exports.toArray = toArray;
         exports.size = size;
         exports.pick = pick;
         exports.omit = omit;
         exports.drop = rest;
         exports.rest = rest;
         exports.tail = rest;
         exports.last = last;
         exports.without = without;
         exports.uniq = uniq;
         exports.unique = uniq;
         exports.union = union;
         exports.intersection = intersection;
         exports.transpose = unzip;
         exports.unzip = unzip;
         exports.zip = zip;
         exports.object = object;
         exports.range = range;
         exports.mixin = mixin;
         exports.default = underscoreArrayMethods;

         Object.defineProperty(exports, '__esModule', { value: true });

});
define(['./_group'], function (_group) {

  // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
  // when you know that your index values will be unique.
  var indexBy = _group(function(result, value, key) {
    result[key] = value;
  });

  return indexBy;

});
define(['./_createIndexFinder', './sortedIndex', './findIndex'], function (_createIndexFinder, sortedIndex, findIndex) {

	// Return the position of the first occurrence of an item in an array,
	// or -1 if the item is not included in the array.
	// If the array is large and already in sort order, pass `true`
	// for **isSorted** to use binary search.
	var indexOf = _createIndexFinder(1, findIndex, sortedIndex);

	return indexOf;

});
define(['./_setup'], function (_setup) {

  // Returns everything but the last entry of the array. Especially useful on
  // the arguments object. Passing **n** will return all the values in
  // the array, excluding the last N.
  function initial(array, n, guard) {
    return _setup.slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
  }

  return initial;

});
define(['./_getLength', './contains'], function (_getLength, contains) {

  // Produce an array that contains every item shared between all the
  // passed-in arrays.
  function intersection(array) {
    var result = [];
    var argsLength = arguments.length;
    for (var i = 0, length = _getLength(array); i < length; i++) {
      var item = array[i];
      if (contains(result, item)) continue;
      var j;
      for (j = 1; j < argsLength; j++) {
        if (!contains(arguments[j], item)) break;
      }
      if (j === argsLength) result.push(item);
    }
    return result;
  }

  return intersection;

});
define(['./keys'], function (keys) {

  // Invert the keys and values of an object. The values must be serializable.
  function invert(obj) {
    var result = {};
    var _keys = keys(obj);
    for (var i = 0, length = _keys.length; i < length; i++) {
      result[obj[_keys[i]]] = _keys[i];
    }
    return result;
  }

  return invert;

});
define(['./isFunction', './isArray', './_deepGet', './restArguments', './map'], function (isFunction, isArray, _deepGet, restArguments, map) {

  // Invoke a method (with arguments) on every item in a collection.
  var invoke = restArguments(function(obj, path, args) {
    var contextPath, func;
    if (isFunction(path)) {
      func = path;
    } else if (isArray(path)) {
      contextPath = path.slice(0, -1);
      path = path[path.length - 1];
    }
    return map(obj, function(context) {
      var method = func;
      if (!method) {
        if (contextPath && contextPath.length) {
          context = _deepGet(context, contextPath);
        }
        if (context == null) return void 0;
        method = context[path];
      }
      return method == null ? method : method.apply(context, args);
    });
  });

  return invoke;

});
define(['./_tagTester', './_has'], function (_tagTester, _has) {

  var isArguments = _tagTester('Arguments');

  // Define a fallback version of the method in browsers (ahem, IE < 9), where
  // there isn't any inspectable "Arguments" type.
  (function() {
    if (!isArguments(arguments)) {
      isArguments = function(obj) {
        return _has(obj, 'callee');
      };
    }
  }());

  var isArguments$1 = isArguments;

  return isArguments$1;

});
define(['./_setup', './_tagTester'], function (_setup, _tagTester) {

	// Is a given value an array?
	// Delegates to ECMA5's native `Array.isArray`.
	var isArray = _setup.nativeIsArray || _tagTester('Array');

	return isArray;

});
define(['./_tagTester'], function (_tagTester) {

	var isArrayBuffer = _tagTester('ArrayBuffer');

	return isArrayBuffer;

});
define(['./_setup'], function (_setup) {

  // Is a given value a boolean?
  function isBoolean(obj) {
    return obj === true || obj === false || _setup.toString.call(obj) === '[object Boolean]';
  }

  return isBoolean;

});
define(['./_tagTester'], function (_tagTester) {

	var isDataView = _tagTester('DataView');

	return isDataView;

});
define(['./_tagTester'], function (_tagTester) {

	var isDate = _tagTester('Date');

	return isDate;

});
define(function () {

  // Is a given value a DOM element?
  function isElement(obj) {
    return !!(obj && obj.nodeType === 1);
  }

  return isElement;

});
define(['./isArray', './keys', './_isArrayLike', './isArguments', './isString'], function (isArray, keys, _isArrayLike, isArguments, isString) {

  // Is a given array, string, or object empty?
  // An "empty" object has no enumerable own-properties.
  function isEmpty(obj) {
    if (obj == null) return true;
    // Skip the more expensive `toString`-based type checks if `obj` has no
    // `.length`.
    if (_isArrayLike(obj) && (isArray(obj) || isString(obj) || isArguments(obj))) return obj.length === 0;
    return keys(obj).length === 0;
  }

  return isEmpty;

});
define(['./_setup', './isFunction', './_has', './keys', './underscore', './_getByteLength', './isTypedArray'], function (_setup, isFunction, _has, keys, underscore, _getByteLength, isTypedArray) {

  // Internal recursive comparison function for `_.isEqual`.
  function eq(a, b, aStack, bStack) {
    // Identical objects are equal. `0 === -0`, but they aren't identical.
    // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
    if (a === b) return a !== 0 || 1 / a === 1 / b;
    // `null` or `undefined` only equal to itself (strict comparison).
    if (a == null || b == null) return false;
    // `NaN`s are equivalent, but non-reflexive.
    if (a !== a) return b !== b;
    // Exhaust primitive checks
    var type = typeof a;
    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
    return deepEq(a, b, aStack, bStack);
  }

  // Internal recursive comparison function for `_.isEqual`.
  function deepEq(a, b, aStack, bStack) {
    // Unwrap any wrapped objects.
    if (a instanceof underscore) a = a._wrapped;
    if (b instanceof underscore) b = b._wrapped;
    // Compare `[[Class]]` names.
    var className = _setup.toString.call(a);
    if (className !== _setup.toString.call(b)) return false;
    switch (className) {
      // These types are compared by value.
      case '[object RegExp]':
        // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
      case '[object String]':
        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
        // equivalent to `new String("5")`.
        return '' + a === '' + b;
      case '[object Number]':
        // `NaN`s are equivalent, but non-reflexive.
        // Object(NaN) is equivalent to NaN.
        if (+a !== +a) return +b !== +b;
        // An `egal` comparison is performed for other numeric values.
        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
      case '[object Date]':
      case '[object Boolean]':
        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
        // millisecond representations. Note that invalid dates with millisecond representations
        // of `NaN` are not equivalent.
        return +a === +b;
      case '[object Symbol]':
        return _setup.SymbolProto.valueOf.call(a) === _setup.SymbolProto.valueOf.call(b);
      case '[object ArrayBuffer]':
        // Coerce to `DataView` so we can fall through to the next case.
        return deepEq(new DataView(a), new DataView(b), aStack, bStack);
      case '[object DataView]':
        var byteLength = _getByteLength(a);
        if (byteLength !== _getByteLength(b)) {
          return false;
        }
        while (byteLength--) {
          if (a.getUint8(byteLength) !== b.getUint8(byteLength)) {
            return false;
          }
        }
        return true;
    }

    if (isTypedArray(a)) {
      // Coerce typed arrays to `DataView`.
      return deepEq(new DataView(a.buffer), new DataView(b.buffer), aStack, bStack);
    }

    var areArrays = className === '[object Array]';
    if (!areArrays) {
      if (typeof a != 'object' || typeof b != 'object') return false;

      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
      // from different frames are.
      var aCtor = a.constructor, bCtor = b.constructor;
      if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&
                               isFunction(bCtor) && bCtor instanceof bCtor)
                          && ('constructor' in a && 'constructor' in b)) {
        return false;
      }
    }
    // Assume equality for cyclic structures. The algorithm for detecting cyclic
    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.

    // Initializing stack of traversed objects.
    // It's done here since we only need them for objects and arrays comparison.
    aStack = aStack || [];
    bStack = bStack || [];
    var length = aStack.length;
    while (length--) {
      // Linear search. Performance is inversely proportional to the number of
      // unique nested structures.
      if (aStack[length] === a) return bStack[length] === b;
    }

    // Add the first object to the stack of traversed objects.
    aStack.push(a);
    bStack.push(b);

    // Recursively compare objects and arrays.
    if (areArrays) {
      // Compare array lengths to determine if a deep comparison is necessary.
      length = a.length;
      if (length !== b.length) return false;
      // Deep compare the contents, ignoring non-numeric properties.
      while (length--) {
        if (!eq(a[length], b[length], aStack, bStack)) return false;
      }
    } else {
      // Deep compare objects.
      var _keys = keys(a), key;
      length = _keys.length;
      // Ensure that both objects contain the same number of properties before comparing deep equality.
      if (keys(b).length !== length) return false;
      while (length--) {
        // Deep compare each member
        key = _keys[length];
        if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
      }
    }
    // Remove the first object from the stack of traversed objects.
    aStack.pop();
    bStack.pop();
    return true;
  }

  // Perform a deep comparison to check if two objects are equal.
  function isEqual(a, b) {
    return eq(a, b);
  }

  return isEqual;

});
define(['./_tagTester'], function (_tagTester) {

	var isError = _tagTester('Error');

	return isError;

});
define(['./_setup', './isSymbol'], function (_setup, isSymbol) {

  // Is a given object a finite number?
  function isFinite(obj) {
    return !isSymbol(obj) && _setup._isFinite(obj) && !isNaN(parseFloat(obj));
  }

  return isFinite;

});
define(['./_setup', './_tagTester'], function (_setup, _tagTester) {

  var isFunction = _tagTester('Function');

  // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
  // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
  var nodelist = _setup.root.document && _setup.root.document.childNodes;
  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
    isFunction = function(obj) {
      return typeof obj == 'function' || false;
    };
  }

  var isFunction$1 = isFunction;

  return isFunction$1;

});
define(['./_tagTester'], function (_tagTester) {

	var isMap = _tagTester('Map');

	return isMap;

});
define(['./keys'], function (keys) {

  // Returns whether an object has a given set of `key:value` pairs.
  function isMatch(object, attrs) {
    var _keys = keys(attrs), length = _keys.length;
    if (object == null) return !length;
    var obj = Object(object);
    for (var i = 0; i < length; i++) {
      var key = _keys[i];
      if (attrs[key] !== obj[key] || !(key in obj)) return false;
    }
    return true;
  }

  return isMatch;

});
define(['./_setup', './isNumber'], function (_setup, isNumber) {

  // Is the given value `NaN`?
  function isNaN(obj) {
    return isNumber(obj) && _setup._isNaN(obj);
  }

  return isNaN;

});
define(function () {

  // Is a given value equal to null?
  function isNull(obj) {
    return obj === null;
  }

  return isNull;

});
define(['./_tagTester'], function (_tagTester) {

	var isNumber = _tagTester('Number');

	return isNumber;

});
define(function () {

  // Is a given variable an object?
  function isObject(obj) {
    var type = typeof obj;
    return type === 'function' || type === 'object' && !!obj;
  }

  return isObject;

});
define(['./_tagTester'], function (_tagTester) {

	var isRegExp = _tagTester('RegExp');

	return isRegExp;

});
define(['./_tagTester'], function (_tagTester) {

	var isSet = _tagTester('Set');

	return isSet;

});
define(['./_tagTester'], function (_tagTester) {

	var isString = _tagTester('String');

	return isString;

});
define(['./_tagTester'], function (_tagTester) {

	var isSymbol = _tagTester('Symbol');

	return isSymbol;

});
define(['./_setup', './_isBufferLike', './constant', './isDataView'], function (_setup, _isBufferLike, constant, isDataView) {

  // Is a given value a typed array?
  var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
  function isTypedArray(obj) {
    // `ArrayBuffer.isView` is the most future-proof, so use it when available.
    // Otherwise, fall back on the above regular expression.
    return _setup.nativeIsView ? (_setup.nativeIsView(obj) && !isDataView(obj)) :
                  _isBufferLike(obj) && typedArrayPattern.test(_setup.toString.call(obj));
  }

  var isTypedArray$1 = _setup.supportsArrayBuffer ? isTypedArray : constant(false);

  return isTypedArray$1;

});
define(function () {

  // Is a given variable undefined?
  function isUndefined(obj) {
    return obj === void 0;
  }

  return isUndefined;

});
define(['./_tagTester'], function (_tagTester) {

	var isWeakMap = _tagTester('WeakMap');

	return isWeakMap;

});
define(['./_tagTester'], function (_tagTester) {

	var isWeakSet = _tagTester('WeakSet');

	return isWeakSet;

});
define(['./_baseIteratee', './underscore'], function (_baseIteratee, underscore) {

  // External wrapper for our callback generator. Users may customize
  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
  // This abstraction hides the internal-only `argCount` argument.
  function iteratee(value, context) {
    return _baseIteratee(value, context, Infinity);
  }
  underscore.iteratee = iteratee;

  return iteratee;

});
define(['./isObject', './_setup', './_has', './_collectNonEnumProps'], function (isObject, _setup, _has, _collectNonEnumProps) {

  // Retrieve the names of an object's own properties.
  // Delegates to **ECMAScript 5**'s native `Object.keys`.
  function keys(obj) {
    if (!isObject(obj)) return [];
    if (_setup.nativeKeys) return _setup.nativeKeys(obj);
    var keys = [];
    for (var key in obj) if (_has(obj, key)) keys.push(key);
    // Ahem, IE < 9.
    if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys);
    return keys;
  }

  return keys;

});
define(['./rest'], function (rest) {

  // Get the last element of an array. Passing **n** will return the last N
  // values in the array.
  function last(array, n, guard) {
    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
    if (n == null || guard) return array[array.length - 1];
    return rest(array, Math.max(0, array.length - n));
  }

  return last;

});
define(['./_createIndexFinder', './findLastIndex'], function (_createIndexFinder, findLastIndex) {

	// Return the position of the last occurrence of an item in an array,
	// or -1 if the item is not included in the array.
	var lastIndexOf = _createIndexFinder(-1, findLastIndex);

	return lastIndexOf;

});
define(['./keys', './_cb', './_isArrayLike'], function (keys, _cb, _isArrayLike) {

  // Return the results of applying the iteratee to each element.
  function map(obj, iteratee, context) {
    iteratee = _cb(iteratee, context);
    var _keys = !_isArrayLike(obj) && keys(obj),
        length = (_keys || obj).length,
        results = Array(length);
    for (var index = 0; index < length; index++) {
      var currentKey = _keys ? _keys[index] : index;
      results[index] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  }

  return map;

});
define(['./keys', './_cb'], function (keys, _cb) {

  // Returns the results of applying the `iteratee` to each element of `obj`.
  // In contrast to `_.map` it returns an object.
  function mapObject(obj, iteratee, context) {
    iteratee = _cb(iteratee, context);
    var _keys = keys(obj),
        length = _keys.length,
        results = {};
    for (var index = 0; index < length; index++) {
      var currentKey = _keys[index];
      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  }

  return mapObject;

});
define(['./extendOwn', './isMatch'], function (extendOwn, isMatch) {

  // Returns a predicate for checking whether an object has a given set of
  // `key:value` pairs.
  function matcher(attrs) {
    attrs = extendOwn({}, attrs);
    return function(obj) {
      return isMatch(obj, attrs);
    };
  }

  return matcher;

});
define(['./_cb', './_isArrayLike', './each', './values'], function (_cb, _isArrayLike, each, values) {

  // Return the maximum element (or element-based computation).
  function max(obj, iteratee, context) {
    var result = -Infinity, lastComputed = -Infinity,
        value, computed;
    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
      obj = _isArrayLike(obj) ? obj : values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value != null && value > result) {
          result = value;
        }
      }
    } else {
      iteratee = _cb(iteratee, context);
      each(obj, function(v, index, list) {
        computed = iteratee(v, index, list);
        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
          result = v;
          lastComputed = computed;
        }
      });
    }
    return result;
  }

  return max;

});
define(['./_has'], function (_has) {

  // Memoize an expensive function by storing its results.
  function memoize(func, hasher) {
    var memoize = function(key) {
      var cache = memoize.cache;
      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
      if (!_has(cache, address)) cache[address] = func.apply(this, arguments);
      return cache[address];
    };
    memoize.cache = {};
    return memoize;
  }

  return memoize;

});
define(['./_cb', './_isArrayLike', './each', './values'], function (_cb, _isArrayLike, each, values) {

  // Return the minimum element (or element-based computation).
  function min(obj, iteratee, context) {
    var result = Infinity, lastComputed = Infinity,
        value, computed;
    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
      obj = _isArrayLike(obj) ? obj : values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value != null && value < result) {
          result = value;
        }
      }
    } else {
      iteratee = _cb(iteratee, context);
      each(obj, function(v, index, list) {
        computed = iteratee(v, index, list);
        if (computed < lastComputed || computed === Infinity && result === Infinity) {
          result = v;
          lastComputed = computed;
        }
      });
    }
    return result;
  }

  return min;

});
define(['./_setup', './underscore', './_chainResult', './each', './functions'], function (_setup, underscore, _chainResult, each, functions) {

  // Add your own custom functions to the Underscore object.
  function mixin(obj) {
    each(functions(obj), function(name) {
      var func = underscore[name] = obj[name];
      underscore.prototype[name] = function() {
        var args = [this._wrapped];
        _setup.push.apply(args, arguments);
        return _chainResult(this, func.apply(underscore, args));
      };
    });
    return underscore;
  }

  return mixin;

});
define(function () {

  // Returns a negated version of the passed-in predicate.
  function negate(predicate) {
    return function() {
      return !predicate.apply(this, arguments);
    };
  }

  return negate;

});
define(function () {

	// Predicate-generating function. Often useful outside of Underscore.
	function noop(){}

	return noop;

});
define(function () {

  // A (possibly faster) way to get the current timestamp as an integer.
  var now = Date.now || function() {
    return new Date().getTime();
  };

  return now;

});
define(['./_getLength'], function (_getLength) {

  // Converts lists into objects. Pass either a single array of `[key, value]`
  // pairs, or two parallel arrays of the same length -- one of keys, and one of
  // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
  function object(list, values) {
    var result = {};
    for (var i = 0, length = _getLength(list); i < length; i++) {
      if (values) {
        result[list[i]] = values[i];
      } else {
        result[list[i][0]] = list[i][1];
      }
    }
    return result;
  }

  return object;

});
define(['./isFunction', './_flatten', './restArguments', './contains', './negate', './map', './pick'], function (isFunction, _flatten, restArguments, contains, negate, map, pick) {

  // Return a copy of the object without the disallowed properties.
  var omit = restArguments(function(obj, keys) {
    var iteratee = keys[0], context;
    if (isFunction(iteratee)) {
      iteratee = negate(iteratee);
      if (keys.length > 1) context = keys[1];
    } else {
      keys = map(_flatten(keys, false, false), String);
      iteratee = function(value, key) {
        return !contains(keys, key);
      };
    }
    return pick(obj, iteratee, context);
  });

  return omit;

});
define(['./before', './partial'], function (before, partial) {

	// Returns a function that will be executed at most one time, no matter how
	// often you call it. Useful for lazy initialization.
	var once = partial(before, 2);

	return once;

});
define(['./keys'], function (keys) {

  // Convert an object into a list of `[key, value]` pairs.
  // The opposite of `_.object` with one argument.
  function pairs(obj) {
    var _keys = keys(obj);
    var length = _keys.length;
    var pairs = Array(length);
    for (var i = 0; i < length; i++) {
      pairs[i] = [_keys[i], obj[_keys[i]]];
    }
    return pairs;
  }

  return pairs;

});
define(['./underscore', './_executeBound', './restArguments'], function (underscore, _executeBound, restArguments) {

  // Partially apply a function by creating a version that has had some of its
  // arguments pre-filled, without changing its dynamic `this` context. `_` acts
  // as a placeholder by default, allowing any combination of arguments to be
  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
  var partial = restArguments(function(func, boundArgs) {
    var placeholder = partial.placeholder;
    var bound = function() {
      var position = 0, length = boundArgs.length;
      var args = Array(length);
      for (var i = 0; i < length; i++) {
        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
      }
      while (position < arguments.length) args.push(arguments[position++]);
      return _executeBound(func, bound, this, this, args);
    };
    return bound;
  });

  partial.placeholder = underscore;

  return partial;

});
define(['./_group'], function (_group) {

  // Split a collection into two arrays: one whose elements all pass the given
  // truth test, and one whose elements all do not pass the truth test.
  var partition = _group(function(result, value, pass) {
    result[pass ? 0 : 1].push(value);
  }, true);

  return partition;

});
define(['./isFunction', './_optimizeCb', './_flatten', './_keyInObj', './allKeys', './restArguments'], function (isFunction, _optimizeCb, _flatten, _keyInObj, allKeys, restArguments) {

  // Return a copy of the object only containing the allowed properties.
  var pick = restArguments(function(obj, keys) {
    var result = {}, iteratee = keys[0];
    if (obj == null) return result;
    if (isFunction(iteratee)) {
      if (keys.length > 1) iteratee = _optimizeCb(iteratee, keys[1]);
      keys = allKeys(obj);
    } else {
      iteratee = _keyInObj;
      keys = _flatten(keys, false, false);
      obj = Object(obj);
    }
    for (var i = 0, length = keys.length; i < length; i++) {
      var key = keys[i];
      var value = obj[key];
      if (iteratee(value, key, obj)) result[key] = value;
    }
    return result;
  });

  return pick;

});
define(['./property', './map'], function (property, map) {

  // Convenience version of a common use case of `_.map`: fetching a property.
  function pluck(obj, key) {
    return map(obj, property(key));
  }

  return pluck;

});
define(['./isArray', './_shallowProperty', './_deepGet'], function (isArray, _shallowProperty, _deepGet) {

  // Creates a function that, when passed an object, will traverse that objectâ€™s
  // properties down the given `path`, specified as an array of keys or indices.
  function property(path) {
    if (!isArray(path)) {
      return _shallowProperty(path);
    }
    return function(obj) {
      return _deepGet(obj, path);
    };
  }

  return property;

});
define(['./isArray', './_deepGet'], function (isArray, _deepGet) {

  // Generates a function for a given object that returns a given property.
  function propertyOf(obj) {
    if (obj == null) {
      return function(){};
    }
    return function(path) {
      return !isArray(path) ? obj[path] : _deepGet(obj, path);
    };
  }

  return propertyOf;

});
define(function () {

  // Return a random integer between `min` and `max` (inclusive).
  function random(min, max) {
    if (max == null) {
      max = min;
      min = 0;
    }
    return min + Math.floor(Math.random() * (max - min + 1));
  }

  return random;

});
define(function () {

  // Generate an integer Array containing an arithmetic progression. A port of
  // the native Python `range()` function. See
  // [the Python documentation](https://docs.python.org/library/functions.html#range).
  function range(start, stop, step) {
    if (stop == null) {
      stop = start || 0;
      start = 0;
    }
    if (!step) {
      step = stop < start ? -1 : 1;
    }

    var length = Math.max(Math.ceil((stop - start) / step), 0);
    var range = Array(length);

    for (var idx = 0; idx < length; idx++, start += step) {
      range[idx] = start;
    }

    return range;
  }

  return range;

});
define(['./_createReduce'], function (_createReduce) {

	// **Reduce** builds up a single result from a list of values, aka `inject`,
	// or `foldl`.
	var reduce = _createReduce(1);

	return reduce;

});
define(['./_createReduce'], function (_createReduce) {

	// The right-associative version of reduce, also known as `foldr`.
	var reduceRight = _createReduce(-1);

	return reduceRight;

});
define(['./_cb', './filter', './negate'], function (_cb, filter, negate) {

  // Return all the elements for which a truth test fails.
  function reject(obj, predicate, context) {
    return filter(obj, negate(_cb(predicate)), context);
  }

  return reject;

});
define(['./_setup'], function (_setup) {

  // Returns everything but the first entry of the `array`. Especially useful on
  // the `arguments` object. Passing an **n** will return the rest N values in the
  // `array`.
  function rest(array, n, guard) {
    return _setup.slice.call(array, n == null || guard ? 1 : n);
  }

  return rest;

});
define(function () {

  // Some functions take a variable number of arguments, or a few expected
  // arguments at the beginning and then a variable number of values to operate
  // on. This helper accumulates all remaining arguments past the functionâ€™s
  // argument length (or an explicit `startIndex`), into an array that becomes
  // the last argument. Similar to ES6â€™s "rest parameter".
  function restArguments(func, startIndex) {
    startIndex = startIndex == null ? func.length - 1 : +startIndex;
    return function() {
      var length = Math.max(arguments.length - startIndex, 0),
          rest = Array(length),
          index = 0;
      for (; index < length; index++) {
        rest[index] = arguments[index + startIndex];
      }
      switch (startIndex) {
        case 0: return func.call(this, rest);
        case 1: return func.call(this, arguments[0], rest);
        case 2: return func.call(this, arguments[0], arguments[1], rest);
      }
      var args = Array(startIndex + 1);
      for (index = 0; index < startIndex; index++) {
        args[index] = arguments[index];
      }
      args[startIndex] = rest;
      return func.apply(this, args);
    };
  }

  return restArguments;

});
define(['./isFunction', './isArray'], function (isFunction, isArray) {

  // Traverses the children of `obj` along `path`. If a child is a function, it
  // is invoked with its parent as context. Returns the value of the final
  // child, or `fallback` if any child is undefined.
  function result(obj, path, fallback) {
    if (!isArray(path)) path = [path];
    var length = path.length;
    if (!length) {
      return isFunction(fallback) ? fallback.call(obj) : fallback;
    }
    for (var i = 0; i < length; i++) {
      var prop = obj == null ? void 0 : obj[path[i]];
      if (prop === void 0) {
        prop = fallback;
        i = length; // Ensure we don't continue iterating.
      }
      obj = isFunction(prop) ? prop.call(obj) : prop;
    }
    return obj;
  }

  return result;

});
define(['./_getLength', './_isArrayLike', './clone', './values', './random'], function (_getLength, _isArrayLike, clone, values, random) {

  // Sample **n** random values from a collection using the modern version of the
  // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisherâ€“Yates_shuffle).
  // If **n** is not specified, returns a single random element.
  // The internal `guard` argument allows it to work with `_.map`.
  function sample(obj, n, guard) {
    if (n == null || guard) {
      if (!_isArrayLike(obj)) obj = values(obj);
      return obj[random(obj.length - 1)];
    }
    var sample = _isArrayLike(obj) ? clone(obj) : values(obj);
    var length = _getLength(sample);
    n = Math.max(Math.min(n, length), 0);
    var last = length - 1;
    for (var index = 0; index < n; index++) {
      var rand = random(index, last);
      var temp = sample[index];
      sample[index] = sample[rand];
      sample[rand] = temp;
    }
    return sample.slice(0, n);
  }

  return sample;

});
define(['./sample'], function (sample) {

  // Shuffle a collection.
  function shuffle(obj) {
    return sample(obj, Infinity);
  }

  return shuffle;

});
define(['./keys', './_isArrayLike'], function (keys, _isArrayLike) {

  // Return the number of elements in a collection.
  function size(obj) {
    if (obj == null) return 0;
    return _isArrayLike(obj) ? obj.length : keys(obj).length;
  }

  return size;

});
define(['./keys', './_cb', './_isArrayLike'], function (keys, _cb, _isArrayLike) {

  // Determine if at least one element in the object passes a truth test.
  function some(obj, predicate, context) {
    predicate = _cb(predicate, context);
    var _keys = !_isArrayLike(obj) && keys(obj),
        length = (_keys || obj).length;
    for (var index = 0; index < length; index++) {
      var currentKey = _keys ? _keys[index] : index;
      if (predicate(obj[currentKey], currentKey, obj)) return true;
    }
    return false;
  }

  return some;

});
define(['./_cb', './map', './pluck'], function (_cb, map, pluck) {

  // Sort the object's values by a criterion produced by an iteratee.
  function sortBy(obj, iteratee, context) {
    var index = 0;
    iteratee = _cb(iteratee, context);
    return pluck(map(obj, function(value, key, list) {
      return {
        value: value,
        index: index++,
        criteria: iteratee(value, key, list)
      };
    }).sort(function(left, right) {
      var a = left.criteria;
      var b = right.criteria;
      if (a !== b) {
        if (a > b || a === void 0) return 1;
        if (a < b || b === void 0) return -1;
      }
      return left.index - right.index;
    }), 'value');
  }

  return sortBy;

});
define(['./_cb', './_getLength'], function (_cb, _getLength) {

  // Use a comparator function to figure out the smallest index at which
  // an object should be inserted so as to maintain order. Uses binary search.
  function sortedIndex(array, obj, iteratee, context) {
    iteratee = _cb(iteratee, context, 1);
    var value = iteratee(obj);
    var low = 0, high = _getLength(array);
    while (low < high) {
      var mid = Math.floor((low + high) / 2);
      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
    }
    return low;
  }

  return sortedIndex;

});
define(function () {

  // Invokes `interceptor` with the `obj` and then returns `obj`.
  // The primary purpose of this method is to "tap into" a method chain, in
  // order to perform operations on intermediate results within the chain.
  function tap(obj, interceptor) {
    interceptor(obj);
    return obj;
  }

  return tap;

});
define(['./underscore', './defaults', './templateSettings'], function (underscore, defaults, templateSettings) {

  // When customizing `_.templateSettings`, if you don't want to define an
  // interpolation, evaluation or escaping regex, we need one that is
  // guaranteed not to match.
  var noMatch = /(.)^/;

  // Certain characters need to be escaped so that they can be put into a
  // string literal.
  var escapes = {
    "'": "'",
    '\\': '\\',
    '\r': 'r',
    '\n': 'n',
    '\u2028': 'u2028',
    '\u2029': 'u2029'
  };

  var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;

  function escapeChar(match) {
    return '\\' + escapes[match];
  }

  // JavaScript micro-templating, similar to John Resig's implementation.
  // Underscore templating handles arbitrary delimiters, preserves whitespace,
  // and correctly escapes quotes within interpolated code.
  // NB: `oldSettings` only exists for backwards compatibility.
  function template(text, settings, oldSettings) {
    if (!settings && oldSettings) settings = oldSettings;
    settings = defaults({}, settings, underscore.templateSettings);

    // Combine delimiters into one regular expression via alternation.
    var matcher = RegExp([
      (settings.escape || noMatch).source,
      (settings.interpolate || noMatch).source,
      (settings.evaluate || noMatch).source
    ].join('|') + '|$', 'g');

    // Compile the template source, escaping string literals appropriately.
    var index = 0;
    var source = "__p+='";
    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
      index = offset + match.length;

      if (escape) {
        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
      } else if (interpolate) {
        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
      } else if (evaluate) {
        source += "';\n" + evaluate + "\n__p+='";
      }

      // Adobe VMs need the match returned to produce the correct offset.
      return match;
    });
    source += "';\n";

    // If a variable is not specified, place data values in local scope.
    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';

    source = "var __t,__p='',__j=Array.prototype.join," +
      "print=function(){__p+=__j.call(arguments,'');};\n" +
      source + 'return __p;\n';

    var render;
    try {
      render = new Function(settings.variable || 'obj', '_', source);
    } catch (e) {
      e.source = source;
      throw e;
    }

    var template = function(data) {
      return render.call(this, data, underscore);
    };

    // Provide the compiled source as a convenience for precompilation.
    var argument = settings.variable || 'obj';
    template.source = 'function(' + argument + '){\n' + source + '}';

    return template;
  }

  return template;

});
define(['./underscore'], function (underscore) {

  // By default, Underscore uses ERB-style template delimiters. Change the
  // following template settings to use alternative delimiters.
  var templateSettings = underscore.templateSettings = {
    evaluate: /<%([\s\S]+?)%>/g,
    interpolate: /<%=([\s\S]+?)%>/g,
    escape: /<%-([\s\S]+?)%>/g
  };

  return templateSettings;

});
define(['./now'], function (now) {

  // Returns a function, that, when invoked, will only be triggered at most once
  // during a given window of time. Normally, the throttled function will run
  // as much as it can, without ever going more than once per `wait` duration;
  // but if you'd like to disable the execution on the leading edge, pass
  // `{leading: false}`. To disable execution on the trailing edge, ditto.
  function throttle(func, wait, options) {
    var timeout, context, args, result;
    var previous = 0;
    if (!options) options = {};

    var later = function() {
      previous = options.leading === false ? 0 : now();
      timeout = null;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    };

    var throttled = function() {
      var _now = now();
      if (!previous && options.leading === false) previous = _now;
      var remaining = wait - (_now - previous);
      context = this;
      args = arguments;
      if (remaining <= 0 || remaining > wait) {
        if (timeout) {
          clearTimeout(timeout);
          timeout = null;
        }
        previous = _now;
        result = func.apply(context, args);
        if (!timeout) context = args = null;
      } else if (!timeout && options.trailing !== false) {
        timeout = setTimeout(later, remaining);
      }
      return result;
    };

    throttled.cancel = function() {
      clearTimeout(timeout);
      previous = 0;
      timeout = context = args = null;
    };

    return throttled;
  }

  return throttle;

});
define(['./_optimizeCb'], function (_optimizeCb) {

  // Run a function **n** times.
  function times(n, iteratee, context) {
    var accum = Array(Math.max(0, n));
    iteratee = _optimizeCb(iteratee, context, 1);
    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
    return accum;
  }

  return times;

});
define(['./_setup', './identity', './isArray', './_isArrayLike', './values', './isString', './map'], function (_setup, identity, isArray, _isArrayLike, values, isString, map) {

  // Safely create a real, live array from anything iterable.
  var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
  function toArray(obj) {
    if (!obj) return [];
    if (isArray(obj)) return _setup.slice.call(obj);
    if (isString(obj)) {
      // Keep surrogate pair characters together.
      return obj.match(reStrSymbol);
    }
    if (_isArrayLike(obj)) return map(obj, identity);
    return values(obj);
  }

  return toArray;

});
define(['./_setup', './underscore', './_chainResult', './each'], function (_setup, underscore, _chainResult, each) {

  // Add all mutator `Array` functions to the wrapper.
  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
    var method = _setup.ArrayProto[name];
    underscore.prototype[name] = function() {
      var obj = this._wrapped;
      if (obj != null) {
        method.apply(obj, arguments);
        if ((name === 'shift' || name === 'splice') && obj.length === 0) {
          delete obj[0];
        }
      }
      return _chainResult(this, obj);
    };
  });

  // Add all accessor `Array` functions to the wrapper.
  each(['concat', 'join', 'slice'], function(name) {
    var method = _setup.ArrayProto[name];
    underscore.prototype[name] = function() {
      var obj = this._wrapped;
      if (obj != null) obj = method.apply(obj, arguments);
      return _chainResult(this, obj);
    };
  });

  return underscore;

});
define(['./_setup', './underscore', './_chainResult', './each'], function (_setup, underscore, _chainResult, each) {

  // Add all mutator `Array` functions to the wrapper.
  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
    var method = _setup.ArrayProto[name];
    underscore.prototype[name] = function() {
      var obj = this._wrapped;
      if (obj != null) {
        method.apply(obj, arguments);
        if ((name === 'shift' || name === 'splice') && obj.length === 0) {
          delete obj[0];
        }
      }
      return _chainResult(this, obj);
    };
  });

  // Add all accessor `Array` functions to the wrapper.
  each(['concat', 'join', 'slice'], function(name) {
    var method = _setup.ArrayProto[name];
    underscore.prototype[name] = function() {
      var obj = this._wrapped;
      if (obj != null) obj = method.apply(obj, arguments);
      return _chainResult(this, obj);
    };
  });

  // Extracts the result from a wrapped and chained object.
  underscore.prototype.value = function() {
    return this._wrapped;
  };

  // Provide unwrapping proxies for some methods used in engine operations
  // such as arithmetic and JSON stringification.
  underscore.prototype.valueOf = underscore.prototype.toJSON = underscore.prototype.value;

  underscore.prototype.toString = function() {
    return String(this._wrapped);
  };

  return underscore;

});
define(['./_setup'], function (_setup) {

  // If Underscore is called as a function, it returns a wrapped object that can
  // be used OO-style. This wrapper holds altered versions of all functions added
  // through `_.mixin`. Wrapped objects may be chained.
  function _(obj) {
    if (obj instanceof _) return obj;
    if (!(this instanceof _)) return new _(obj);
    this._wrapped = obj;
  }

  _.VERSION = _setup.VERSION;

  // Extracts the result from a wrapped and chained object.
  _.prototype.value = function() {
    return this._wrapped;
  };

  // Provide unwrapping proxies for some methods used in engine operations
  // such as arithmetic and JSON stringification.
  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;

  _.prototype.toString = function() {
    return String(this._wrapped);
  };

  return _;

});
define(['./_createEscaper', './_unescapeMap'], function (_createEscaper, _unescapeMap) {

	// Function for unescaping strings from HTML interpolation.
	var _unescape = _createEscaper(_unescapeMap);

	return _unescape;

});
define(['./_flatten', './restArguments', './uniq'], function (_flatten, restArguments, uniq) {

  // Produce an array that contains the union: each distinct element from all of
  // the passed-in arrays.
  var union = restArguments(function(arrays) {
    return uniq(_flatten(arrays, true, true));
  });

  return union;

});
define(['./_cb', './_getLength', './contains', './isBoolean'], function (_cb, _getLength, contains, isBoolean) {

  // Produce a duplicate-free version of the array. If the array has already
  // been sorted, you have the option of using a faster algorithm.
  // The faster algorithm will not work with an iteratee if the iteratee
  // is not a one-to-one function, so providing an iteratee will disable
  // the faster algorithm.
  function uniq(array, isSorted, iteratee, context) {
    if (!isBoolean(isSorted)) {
      context = iteratee;
      iteratee = isSorted;
      isSorted = false;
    }
    if (iteratee != null) iteratee = _cb(iteratee, context);
    var result = [];
    var seen = [];
    for (var i = 0, length = _getLength(array); i < length; i++) {
      var value = array[i],
          computed = iteratee ? iteratee(value, i, array) : value;
      if (isSorted && !iteratee) {
        if (!i || seen !== computed) result.push(value);
        seen = computed;
      } else if (iteratee) {
        if (!contains(seen, computed)) {
          seen.push(computed);
          result.push(value);
        }
      } else if (!contains(result, value)) {
        result.push(value);
      }
    }
    return result;
  }

  return uniq;

});
define(function () {

  // Generate a unique integer id (unique within the entire client session).
  // Useful for temporary DOM ids.
  var idCounter = 0;
  function uniqueId(prefix) {
    var id = ++idCounter + '';
    return prefix ? prefix + id : id;
  }

  return uniqueId;

});
define(['./_getLength', './pluck', './max'], function (_getLength, pluck, max) {

  // Complement of zip. Unzip accepts an array of arrays and groups
  // each array's elements on shared indices.
  function unzip(array) {
    var length = array && max(array, _getLength).length || 0;
    var result = Array(length);

    for (var index = 0; index < length; index++) {
      result[index] = pluck(array, index);
    }
    return result;
  }

  return unzip;

});
define(['./keys'], function (keys) {

  // Retrieve the values of an object's properties.
  function values(obj) {
    var _keys = keys(obj);
    var length = _keys.length;
    var values = Array(length);
    for (var i = 0; i < length; i++) {
      values[i] = obj[_keys[i]];
    }
    return values;
  }

  return values;

});
define(['./matcher', './filter'], function (matcher, filter) {

  // Convenience version of a common use case of `_.filter`: selecting only
  // objects containing specific `key:value` pairs.
  function where(obj, attrs) {
    return filter(obj, matcher(attrs));
  }

  return where;

});
define(['./restArguments', './difference'], function (restArguments, difference) {

  // Return a version of the array that does not contain the specified value(s).
  var without = restArguments(function(array, otherArrays) {
    return difference(array, otherArrays);
  });

  return without;

});
define(['./partial'], function (partial) {

  // Returns the first function passed as an argument to the second,
  // allowing you to adjust arguments, run code before and after, and
  // conditionally execute the original function.
  function wrap(func, wrapper) {
    return partial(wrapper, func);
  }

  return wrap;

});
define(['./restArguments', './unzip'], function (restArguments, unzip) {

	// Zip together multiple lists into a single array -- elements that share
	// an index go together.
	var zip = restArguments(unzip);

	return zip;

});
'use strict';
const cryptoRandomString = require('crypto-random-string');

module.exports = () => cryptoRandomString(32);
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "crypto-random-string": "^1.0.0"
  },
  "deprecated": false,
  "description": "Generate a unique random string",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/unique-string#readme",
  "license": "MIT",
  "name": "unique-string",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/unique-string.git"
  },
  "version": "1.0.0"
}(The MIT License)

Copyright (c) 2017, Ryan Zimmerman <opensrc@ryanzim.com>

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the 'Software'), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict'

exports.fromCallback = function (fn) {
  return Object.defineProperty(function () {
    if (typeof arguments[arguments.length - 1] === 'function') fn.apply(this, arguments)
    else {
      return new Promise((resolve, reject) => {
        arguments[arguments.length] = (err, res) => {
          if (err) return reject(err)
          resolve(res)
        }
        arguments.length++
        fn.apply(this, arguments)
      })
    }
  }, 'name', { value: fn.name })
}

exports.fromPromise = function (fn) {
  return Object.defineProperty(function () {
    const cb = arguments[arguments.length - 1]
    if (typeof cb !== 'function') return fn.apply(this, arguments)
    else fn.apply(this, arguments).then(r => cb(null, r), cb)
  }, 'name', { value: fn.name })
}
{
  "author": {
    "name": "Ryan Zimmerman",
    "email": "opensrc@ryanzim.com"
  },
  "deprecated": false,
  "description": "Make a callback- or promise-based function support both promises and callbacks.",
  "devDependencies": {
    "colortape": "^0.1.2",
    "coveralls": "^3.0.1",
    "nyc": "^10.2.0",
    "standard": "^10.0.1",
    "tape": "^4.6.3"
  },
  "engines": {
    "node": ">= 4.0.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/RyanZim/universalify#readme",
  "license": "MIT",
  "name": "universalify",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/RyanZim/universalify.git"
  },
  "version": "0.1.2"
}/* eslint-disable unicorn/no-process-exit */
'use strict';
let updateNotifier = require('.');

const options = JSON.parse(process.argv[2]);

updateNotifier = new updateNotifier.UpdateNotifier(options);

(async () => {
	// Exit process when offline
	setTimeout(process.exit, 1000 * 30);

	const update = await updateNotifier.checkNpm();

	// Only update the last update check time on success
	updateNotifier.config.set('lastUpdateCheck', Date.now());

	if (update.type && update.type !== 'latest') {
		updateNotifier.config.set('update', update);
	}

	// Call process exit explicitly to terminate the child process,
	// otherwise the child process will run forever, according to the Node.js docs
	process.exit();
})().catch(error => {
	console.error(error);
	process.exit(1);
});
'use strict';
const {spawn} = require('child_process');
const path = require('path');
const {format} = require('util');
const importLazy = require('import-lazy')(require);

const configstore = importLazy('configstore');
const chalk = importLazy('chalk');
const semverDiff = importLazy('semver-diff');
const latestVersion = importLazy('latest-version');
const isNpm = importLazy('is-npm');
const isInstalledGlobally = importLazy('is-installed-globally');
const isYarnGlobal = importLazy('is-yarn-global');
const hasYarn = importLazy('has-yarn');
const boxen = importLazy('boxen');
const xdgBasedir = importLazy('xdg-basedir');
const isCi = importLazy('is-ci');

const ONE_DAY = 1000 * 60 * 60 * 24;

class UpdateNotifier {
	constructor(options = {}) {
		this.options = options;
		options.pkg = options.pkg || {};
		options.distTag = options.distTag || 'latest';

		// Reduce pkg to the essential keys. with fallback to deprecated options
		// TODO: Remove deprecated options at some point far into the future
		options.pkg = {
			name: options.pkg.name || options.packageName,
			version: options.pkg.version || options.packageVersion
		};

		if (!options.pkg.name || !options.pkg.version) {
			throw new Error('pkg.name and pkg.version required');
		}

		this.packageName = options.pkg.name;
		this.packageVersion = options.pkg.version;
		this.updateCheckInterval = typeof options.updateCheckInterval === 'number' ? options.updateCheckInterval : ONE_DAY;
		this.hasCallback = typeof options.callback === 'function';
		this.callback = options.callback || (() => {});
		this.disabled = 'NO_UPDATE_NOTIFIER' in process.env ||
			process.argv.includes('--no-update-notifier') ||
			isCi();
		this.shouldNotifyInNpmScript = options.shouldNotifyInNpmScript;

		if (!this.disabled && !this.hasCallback) {
			try {
				const ConfigStore = configstore();
				this.config = new ConfigStore(`update-notifier-${this.packageName}`, {
					optOut: false,
					// Init with the current time so the first check is only
					// after the set interval, so not to bother users right away
					lastUpdateCheck: Date.now()
				});
			} catch (error) {
				// Expecting error code EACCES or EPERM
				const message =
					chalk().yellow(format(' %s update check failed ', options.pkg.name)) +
					format('\n Try running with %s or get access ', chalk().cyan('sudo')) +
					'\n to the local update config store via \n' +
					chalk().cyan(format(' sudo chown -R $USER:$(id -gn $USER) %s ', xdgBasedir().config));

				process.on('exit', () => {
					console.error('\n' + boxen()(message, {align: 'center'}));
				});
			}
		}
	}

	check() {
		if (this.hasCallback) {
			(async () => {
				try {
					this.callback(null, await this.checkNpm());
				} catch (error) {
					this.callback(error);
				}
			})();

			return;
		}

		if (
			!this.config ||
			this.config.get('optOut') ||
			this.disabled
		) {
			return;
		}

		this.update = this.config.get('update');

		if (this.update) {
			this.config.delete('update');
		}

		// Only check for updates on a set interval
		if (Date.now() - this.config.get('lastUpdateCheck') < this.updateCheckInterval) {
			return;
		}

		// Spawn a detached process, passing the options as an environment property
		spawn(process.execPath, [path.join(__dirname, 'check.js'), JSON.stringify(this.options)], {
			detached: true,
			stdio: 'ignore'
		}).unref();
	}

	async checkNpm() {
		const {distTag} = this.options;
		const latest = await latestVersion()(this.packageName, {version: distTag});

		return {
			latest,
			current: this.packageVersion,
			type: semverDiff()(this.packageVersion, latest) || distTag,
			name: this.packageName
		};
	}

	notify(options) {
		const suppressForNpm = !this.shouldNotifyInNpmScript && isNpm().isNpm;
		if (!process.stdout.isTTY || suppressForNpm || !this.update) {
			return this;
		}

		options = Object.assign({
			isGlobal: isInstalledGlobally(),
			isYarnGlobal: isYarnGlobal()()
		}, options);

		let installCommand;

		if (options.isYarnGlobal) {
			installCommand = `yarn global add ${this.packageName}`;
		} else if (hasYarn()()) {
			installCommand = `yarn add ${this.packageName}`;
		} else {
			installCommand = `npm i ${options.isGlobal ? '-g ' : ''}${this.packageName}`;
		}

		options.message = options.message || 'Update available ' + chalk().dim(this.update.current) + chalk().reset(' â†’ ') +
			chalk().green(this.update.latest) + ' \nRun ' + chalk().cyan(installCommand) + ' to update';

		options.boxenOpts = options.boxenOpts || {
			padding: 1,
			margin: 1,
			align: 'center',
			borderColor: 'yellow',
			borderStyle: 'round'
		};

		const message = '\n' + boxen()(options.message, options.boxenOpts);

		if (options.defer === false) {
			console.error(message);
		} else {
			process.on('exit', () => {
				console.error(message);
			});

			process.on('SIGINT', () => {
				console.error('');
				process.exit();
			});
		}

		return this;
	}
}

module.exports = options => {
	const updateNotifier = new UpdateNotifier(options);
	updateNotifier.check();
	return updateNotifier;
};

module.exports.UpdateNotifier = UpdateNotifier;
Copyright Google

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "https://sindresorhus.com"
  },
  "dependencies": {
    "boxen": "^3.0.0",
    "chalk": "^2.0.1",
    "configstore": "^4.0.0",
    "has-yarn": "^2.1.0",
    "import-lazy": "^2.1.0",
    "is-ci": "^2.0.0",
    "is-installed-globally": "^0.1.0",
    "is-npm": "^3.0.0",
    "is-yarn-global": "^0.3.0",
    "latest-version": "^5.0.0",
    "semver-diff": "^2.0.0",
    "xdg-basedir": "^3.0.0"
  },
  "deprecated": false,
  "description": "Update notifications for your CLI app",
  "devDependencies": {
    "ava": "^1.3.1",
    "clear-module": "^3.1.0",
    "fixture-stdout": "^0.2.1",
    "mock-require": "^3.0.3",
    "strip-ansi": "^5.2.0",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "check.js"
  ],
  "homepage": "https://github.com/yeoman/update-notifier#readme",
  "license": "BSD-2-Clause",
  "name": "update-notifier",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/yeoman/update-notifier.git"
  },
  "version": "3.0.1"
}Copyright 2011 Gary Court. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1.	Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2.	Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY GARY COURT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Gary Court.
{
  "author": {
    "name": "Gary Court",
    "email": "gary.court@gmail.com"
  },
  "dependencies": {
    "punycode": "^2.1.0"
  },
  "deprecated": false,
  "description": "An RFC 3986/3987 compliant, scheme extendable URI/IRI parsing/validating/resolving library for JavaScript.",
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-plugin-external-helpers": "^6.22.0",
    "babel-preset-latest": "^6.24.1",
    "mocha": "^3.2.0",
    "mocha-qunit-ui": "^0.1.3",
    "rollup": "^0.41.6",
    "rollup-plugin-babel": "^2.7.1",
    "rollup-plugin-node-resolve": "^2.0.0",
    "sorcery": "^0.10.0",
    "typescript": "^2.8.1",
    "uglify-js": "^2.8.14"
  },
  "directories": {
    "test": "tests"
  },
  "files": [
    "dist",
    "package.json",
    "yarn.lock",
    "README.md",
    "CHANGELOG",
    "LICENSE"
  ],
  "homepage": "https://github.com/garycourt/uri-js",
  "license": "BSD-2-Clause",
  "main": "dist/es5/uri.all.js",
  "name": "uri-js",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/garycourt/uri-js.git"
  },
  "types": "dist/es5/uri.all.d.ts",
  "version": "4.4.0"
}import { SCHEMES } from "./uri";
import http from "./schemes/http";
SCHEMES[http.scheme] = http;
import https from "./schemes/https";
SCHEMES[https.scheme] = https;
import ws from "./schemes/ws";
SCHEMES[ws.scheme] = ws;
import wss from "./schemes/wss";
SCHEMES[wss.scheme] = wss;
import mailto from "./schemes/mailto";
SCHEMES[mailto.scheme] = mailto;
import urn from "./schemes/urn";
SCHEMES[urn.scheme] = urn;
import uuid from "./schemes/urn-uuid";
SCHEMES[uuid.scheme] = uuid;
export * from "./uri";
//# sourceMappingURL=index.js.map{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,IAAI,MAAM,gBAAgB,CAAC;AAClC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAE5B,OAAO,KAAK,MAAM,iBAAiB,CAAC;AACpC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;AAE9B,OAAO,EAAE,MAAM,cAAc,CAAC;AAC9B,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;AAExB,OAAO,GAAG,MAAM,eAAe,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;AAE1B,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAEhC,OAAO,GAAG,MAAM,eAAe,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;AAE1B,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAE5B,cAAc,OAAO,CAAC"}import { buildExps } from "./regexps-uri";
export default buildExps(true);
//# sourceMappingURL=regexps-iri.js.map{"version":3,"file":"regexps-iri.js","sourceRoot":"","sources":["../../src/regexps-iri.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,eAAe,SAAS,CAAC,IAAI,CAAC,CAAC"}import { merge, subexp } from "./util";
export function buildExps(isIRI) {
    const ALPHA$$ = "[A-Za-z]", CR$ = "[\\x0D]", DIGIT$$ = "[0-9]", DQUOTE$$ = "[\\x22]", HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"), //case-insensitive
    LF$$ = "[\\x0A]", SP$$ = "[\\x20]", PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)), //expanded
    GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", //subset, excludes bidi control characters
    IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]", //subset
    UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"), DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$), //relaxed parsing rules
    IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$), H16$ = subexp(HEXDIG$$ + "{1,4}"), LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$), //                           6( h16 ":" ) ls32
    IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$), //                      "::" 5( h16 ":" ) ls32
    IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$), //[               h16 ] "::" 4( h16 ":" ) ls32
    IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$), //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
    IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$), //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
    IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$), //[ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
    IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$), //[ *4( h16 ":" ) h16 ] "::"              ls32
    IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$), //[ *5( h16 ":" ) h16 ] "::"              h16
    IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"), //[ *6( h16 ":" ) h16 ] "::"
    IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")), ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"), //RFC 6874
    IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$), //RFC 6874
    IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$), //RFC 6874, with relaxed parsing rules
    IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), //RFC 6874
    REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"), HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$), PORT$ = subexp(DIGIT$$ + "*"), AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")), SEGMENT$ = subexp(PCHAR$ + "*"), SEGMENT_NZ$ = subexp(PCHAR$ + "+"), SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"), PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), //simplified
    PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), //simplified
    PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), //simplified
    PATH_EMPTY$ = "(?!" + PCHAR$ + ")", PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$";
    return {
        NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"),
        NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"),
        NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"),
        ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        UNRESERVED: new RegExp(UNRESERVED$$, "g"),
        OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"),
        PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"),
        IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"),
        IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules
    };
}
export default buildExps(false);
//# sourceMappingURL=regexps-uri.js.map{"version":3,"file":"regexps-uri.js","sourceRoot":"","sources":["../../src/regexps-uri.ts"],"names":[],"mappings":"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"}/**
 * URI.js
 *
 * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.
 * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
 * @see http://github.com/garycourt/uri-js
 */
/**
 * Copyright 2011 Gary Court. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 *    1. Redistributions of source code must retain the above copyright notice, this list of
 *       conditions and the following disclaimer.
 *
 *    2. Redistributions in binary form must reproduce the above copyright notice, this list
 *       of conditions and the following disclaimer in the documentation and/or other materials
 *       provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation are those of the
 * authors and should not be interpreted as representing official policies, either expressed
 * or implied, of Gary Court.
 */
import URI_PROTOCOL from "./regexps-uri";
import IRI_PROTOCOL from "./regexps-iri";
import punycode from "punycode";
import { toUpperCase, typeOf, assign } from "./util";
export const SCHEMES = {};
export function pctEncChar(chr) {
    const c = chr.charCodeAt(0);
    let e;
    if (c < 16)
        e = "%0" + c.toString(16).toUpperCase();
    else if (c < 128)
        e = "%" + c.toString(16).toUpperCase();
    else if (c < 2048)
        e = "%" + ((c >> 6) | 192).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase();
    else
        e = "%" + ((c >> 12) | 224).toString(16).toUpperCase() + "%" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase();
    return e;
}
export function pctDecChars(str) {
    let newStr = "";
    let i = 0;
    const il = str.length;
    while (i < il) {
        const c = parseInt(str.substr(i + 1, 2), 16);
        if (c < 128) {
            newStr += String.fromCharCode(c);
            i += 3;
        }
        else if (c >= 194 && c < 224) {
            if ((il - i) >= 6) {
                const c2 = parseInt(str.substr(i + 4, 2), 16);
                newStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
            }
            else {
                newStr += str.substr(i, 6);
            }
            i += 6;
        }
        else if (c >= 224) {
            if ((il - i) >= 9) {
                const c2 = parseInt(str.substr(i + 4, 2), 16);
                const c3 = parseInt(str.substr(i + 7, 2), 16);
                newStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            }
            else {
                newStr += str.substr(i, 9);
            }
            i += 9;
        }
        else {
            newStr += str.substr(i, 3);
            i += 3;
        }
    }
    return newStr;
}
function _normalizeComponentEncoding(components, protocol) {
    function decodeUnreserved(str) {
        const decStr = pctDecChars(str);
        return (!decStr.match(protocol.UNRESERVED) ? str : decStr);
    }
    if (components.scheme)
        components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, "");
    if (components.userinfo !== undefined)
        components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.host !== undefined)
        components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.path !== undefined)
        components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.query !== undefined)
        components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.fragment !== undefined)
        components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    return components;
}
;
function _stripLeadingZeros(str) {
    return str.replace(/^0*(.*)/, "$1") || "0";
}
function _normalizeIPv4(host, protocol) {
    const matches = host.match(protocol.IPV4ADDRESS) || [];
    const [, address] = matches;
    if (address) {
        return address.split(".").map(_stripLeadingZeros).join(".");
    }
    else {
        return host;
    }
}
function _normalizeIPv6(host, protocol) {
    const matches = host.match(protocol.IPV6ADDRESS) || [];
    const [, address, zone] = matches;
    if (address) {
        const [last, first] = address.toLowerCase().split('::').reverse();
        const firstFields = first ? first.split(":").map(_stripLeadingZeros) : [];
        const lastFields = last.split(":").map(_stripLeadingZeros);
        const isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);
        const fieldCount = isLastFieldIPv4Address ? 7 : 8;
        const lastFieldsStart = lastFields.length - fieldCount;
        const fields = Array(fieldCount);
        for (let x = 0; x < fieldCount; ++x) {
            fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';
        }
        if (isLastFieldIPv4Address) {
            fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);
        }
        const allZeroFields = fields.reduce((acc, field, index) => {
            if (!field || field === "0") {
                const lastLongest = acc[acc.length - 1];
                if (lastLongest && lastLongest.index + lastLongest.length === index) {
                    lastLongest.length++;
                }
                else {
                    acc.push({ index, length: 1 });
                }
            }
            return acc;
        }, []);
        const longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0];
        let newHost;
        if (longestZeroFields && longestZeroFields.length > 1) {
            const newFirst = fields.slice(0, longestZeroFields.index);
            const newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);
            newHost = newFirst.join(":") + "::" + newLast.join(":");
        }
        else {
            newHost = fields.join(":");
        }
        if (zone) {
            newHost += "%" + zone;
        }
        return newHost;
    }
    else {
        return host;
    }
}
const URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i;
const NO_MATCH_IS_UNDEFINED = ("").match(/(){0}/)[1] === undefined;
export function parse(uriString, options = {}) {
    const components = {};
    const protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);
    if (options.reference === "suffix")
        uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString;
    const matches = uriString.match(URI_PARSE);
    if (matches) {
        if (NO_MATCH_IS_UNDEFINED) {
            //store each component
            components.scheme = matches[1];
            components.userinfo = matches[3];
            components.host = matches[4];
            components.port = parseInt(matches[5], 10);
            components.path = matches[6] || "";
            components.query = matches[7];
            components.fragment = matches[8];
            //fix port number
            if (isNaN(components.port)) {
                components.port = matches[5];
            }
        }
        else { //IE FIX for improper RegExp matching
            //store each component
            components.scheme = matches[1] || undefined;
            components.userinfo = (uriString.indexOf("@") !== -1 ? matches[3] : undefined);
            components.host = (uriString.indexOf("//") !== -1 ? matches[4] : undefined);
            components.port = parseInt(matches[5], 10);
            components.path = matches[6] || "";
            components.query = (uriString.indexOf("?") !== -1 ? matches[7] : undefined);
            components.fragment = (uriString.indexOf("#") !== -1 ? matches[8] : undefined);
            //fix port number
            if (isNaN(components.port)) {
                components.port = (uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined);
            }
        }
        if (components.host) {
            //normalize IP hosts
            components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);
        }
        //determine reference type
        if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {
            components.reference = "same-document";
        }
        else if (components.scheme === undefined) {
            components.reference = "relative";
        }
        else if (components.fragment === undefined) {
            components.reference = "absolute";
        }
        else {
            components.reference = "uri";
        }
        //check for reference errors
        if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) {
            components.error = components.error || "URI is not a " + options.reference + " reference.";
        }
        //find scheme handler
        const schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
        //check if scheme can't handle IRIs
        if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
            //if host component is a domain name
            if (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {
                //convert Unicode IDN -> ASCII IDN
                try {
                    components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());
                }
                catch (e) {
                    components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e;
                }
            }
            //convert IRI -> URI
            _normalizeComponentEncoding(components, URI_PROTOCOL);
        }
        else {
            //normalize encodings
            _normalizeComponentEncoding(components, protocol);
        }
        //perform scheme specific parsing
        if (schemeHandler && schemeHandler.parse) {
            schemeHandler.parse(components, options);
        }
    }
    else {
        components.error = components.error || "URI can not be parsed.";
    }
    return components;
}
;
function _recomposeAuthority(components, options) {
    const protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);
    const uriTokens = [];
    if (components.userinfo !== undefined) {
        uriTokens.push(components.userinfo);
        uriTokens.push("@");
    }
    if (components.host !== undefined) {
        //normalize IP hosts, add brackets and escape zone separator for IPv6
        uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => "[" + $1 + ($2 ? "%25" + $2 : "") + "]"));
    }
    if (typeof components.port === "number" || typeof components.port === "string") {
        uriTokens.push(":");
        uriTokens.push(String(components.port));
    }
    return uriTokens.length ? uriTokens.join("") : undefined;
}
;
const RDS1 = /^\.\.?\//;
const RDS2 = /^\/\.(\/|$)/;
const RDS3 = /^\/\.\.(\/|$)/;
const RDS4 = /^\.\.?$/;
const RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/;
export function removeDotSegments(input) {
    const output = [];
    while (input.length) {
        if (input.match(RDS1)) {
            input = input.replace(RDS1, "");
        }
        else if (input.match(RDS2)) {
            input = input.replace(RDS2, "/");
        }
        else if (input.match(RDS3)) {
            input = input.replace(RDS3, "/");
            output.pop();
        }
        else if (input === "." || input === "..") {
            input = "";
        }
        else {
            const im = input.match(RDS5);
            if (im) {
                const s = im[0];
                input = input.slice(s.length);
                output.push(s);
            }
            else {
                throw new Error("Unexpected dot segment condition");
            }
        }
    }
    return output.join("");
}
;
export function serialize(components, options = {}) {
    const protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL);
    const uriTokens = [];
    //find scheme handler
    const schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
    //perform scheme specific serialization
    if (schemeHandler && schemeHandler.serialize)
        schemeHandler.serialize(components, options);
    if (components.host) {
        //if host component is an IPv6 address
        if (protocol.IPV6ADDRESS.test(components.host)) {
            //TODO: normalize IPv6 address as per RFC 5952
        }
        //if host component is a domain name
        else if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) {
            //convert IDN via punycode
            try {
                components.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host));
            }
            catch (e) {
                components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
            }
        }
    }
    //normalize encoding
    _normalizeComponentEncoding(components, protocol);
    if (options.reference !== "suffix" && components.scheme) {
        uriTokens.push(components.scheme);
        uriTokens.push(":");
    }
    const authority = _recomposeAuthority(components, options);
    if (authority !== undefined) {
        if (options.reference !== "suffix") {
            uriTokens.push("//");
        }
        uriTokens.push(authority);
        if (components.path && components.path.charAt(0) !== "/") {
            uriTokens.push("/");
        }
    }
    if (components.path !== undefined) {
        let s = components.path;
        if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
            s = removeDotSegments(s);
        }
        if (authority === undefined) {
            s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//"
        }
        uriTokens.push(s);
    }
    if (components.query !== undefined) {
        uriTokens.push("?");
        uriTokens.push(components.query);
    }
    if (components.fragment !== undefined) {
        uriTokens.push("#");
        uriTokens.push(components.fragment);
    }
    return uriTokens.join(""); //merge tokens into a string
}
;
export function resolveComponents(base, relative, options = {}, skipNormalization) {
    const target = {};
    if (!skipNormalization) {
        base = parse(serialize(base, options), options); //normalize base components
        relative = parse(serialize(relative, options), options); //normalize relative components
    }
    options = options || {};
    if (!options.tolerant && relative.scheme) {
        target.scheme = relative.scheme;
        //target.authority = relative.authority;
        target.userinfo = relative.userinfo;
        target.host = relative.host;
        target.port = relative.port;
        target.path = removeDotSegments(relative.path || "");
        target.query = relative.query;
    }
    else {
        if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {
            //target.authority = relative.authority;
            target.userinfo = relative.userinfo;
            target.host = relative.host;
            target.port = relative.port;
            target.path = removeDotSegments(relative.path || "");
            target.query = relative.query;
        }
        else {
            if (!relative.path) {
                target.path = base.path;
                if (relative.query !== undefined) {
                    target.query = relative.query;
                }
                else {
                    target.query = base.query;
                }
            }
            else {
                if (relative.path.charAt(0) === "/") {
                    target.path = removeDotSegments(relative.path);
                }
                else {
                    if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {
                        target.path = "/" + relative.path;
                    }
                    else if (!base.path) {
                        target.path = relative.path;
                    }
                    else {
                        target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path;
                    }
                    target.path = removeDotSegments(target.path);
                }
                target.query = relative.query;
            }
            //target.authority = base.authority;
            target.userinfo = base.userinfo;
            target.host = base.host;
            target.port = base.port;
        }
        target.scheme = base.scheme;
    }
    target.fragment = relative.fragment;
    return target;
}
;
export function resolve(baseURI, relativeURI, options) {
    const schemelessOptions = assign({ scheme: 'null' }, options);
    return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);
}
;
export function normalize(uri, options) {
    if (typeof uri === "string") {
        uri = serialize(parse(uri, options), options);
    }
    else if (typeOf(uri) === "object") {
        uri = parse(serialize(uri, options), options);
    }
    return uri;
}
;
export function equal(uriA, uriB, options) {
    if (typeof uriA === "string") {
        uriA = serialize(parse(uriA, options), options);
    }
    else if (typeOf(uriA) === "object") {
        uriA = serialize(uriA, options);
    }
    if (typeof uriB === "string") {
        uriB = serialize(parse(uriB, options), options);
    }
    else if (typeOf(uriB) === "object") {
        uriB = serialize(uriB, options);
    }
    return uriA === uriB;
}
;
export function escapeComponent(str, options) {
    return str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar);
}
;
export function unescapeComponent(str, options) {
    return str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars);
}
;
//# sourceMappingURL=uri.js.map{"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/uri.ts"],"names":[],"mappings":"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"}export function merge(...sets) {
    if (sets.length > 1) {
        sets[0] = sets[0].slice(0, -1);
        const xl = sets.length - 1;
        for (let x = 1; x < xl; ++x) {
            sets[x] = sets[x].slice(1, -1);
        }
        sets[xl] = sets[xl].slice(1);
        return sets.join('');
    }
    else {
        return sets[0];
    }
}
export function subexp(str) {
    return "(?:" + str + ")";
}
export function typeOf(o) {
    return o === undefined ? "undefined" : (o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase());
}
export function toUpperCase(str) {
    return str.toUpperCase();
}
export function toArray(obj) {
    return obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : [];
}
export function assign(target, source) {
    const obj = target;
    if (source) {
        for (const key in source) {
            obj[key] = source[key];
        }
    }
    return obj;
}
//# sourceMappingURL=util.js.map{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,IAAkB;IAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE;YAC5B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAC/B;QACD,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACrB;SAAM;QACN,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;KACf;AACF,CAAC;AAED,MAAM,iBAAiB,GAAU;IAChC,OAAO,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;AAC1B,CAAC;AAED,MAAM,iBAAiB,CAAK;IAC3B,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACpJ,CAAC;AAED,MAAM,sBAAsB,GAAU;IACrC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,kBAAkB,GAAO;IAC9B,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvM,CAAC;AAGD,MAAM,iBAAiB,MAAc,EAAE,MAAW;IACjD,MAAM,GAAG,GAAG,MAAa,CAAC;IAC1B,IAAI,MAAM,EAAE;QACX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;YACzB,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;SACvB;KACD;IACD,OAAO,GAAG,CAAC;AACZ,CAAC"}const handler = {
    scheme: "http",
    domainHost: true,
    parse: function (components, options) {
        //report missing host
        if (!components.host) {
            components.error = components.error || "HTTP URIs must have a host.";
        }
        return components;
    },
    serialize: function (components, options) {
        const secure = String(components.scheme).toLowerCase() === "https";
        //normalize the default port
        if (components.port === (secure ? 443 : 80) || components.port === "") {
            components.port = undefined;
        }
        //normalize the empty path
        if (!components.path) {
            components.path = "/";
        }
        //NOTE: We do not parse query strings for HTTP URIs
        //as WWW Form Url Encoded query strings are part of the HTML4+ spec,
        //and not the HTTP spec.
        return components;
    }
};
export default handler;
//# sourceMappingURL=http.js.map{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/schemes/http.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,MAAM;IAEf,UAAU,EAAG,IAAI;IAEjB,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,qBAAqB;QACrB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACrB,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,6BAA6B,CAAC;SACrE;QAED,OAAO,UAAU,CAAC;IACnB,CAAC;IAED,SAAS,EAAG,UAAU,UAAwB,EAAE,OAAkB;QACjE,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;QAEnE,4BAA4B;QAC5B,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,KAAK,EAAE,EAAE;YACtE,UAAU,CAAC,IAAI,GAAG,SAAS,CAAC;SAC5B;QAED,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACrB,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;SACtB;QAED,mDAAmD;QACnD,oEAAoE;QACpE,wBAAwB;QAExB,OAAO,UAAU,CAAC;IACnB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"}import http from "./http";
const handler = {
    scheme: "https",
    domainHost: http.domainHost,
    parse: http.parse,
    serialize: http.serialize
};
export default handler;
//# sourceMappingURL=https.js.map{"version":3,"file":"https.js","sourceRoot":"","sources":["../../../src/schemes/https.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,OAAO;IAChB,UAAU,EAAG,IAAI,CAAC,UAAU;IAC5B,KAAK,EAAG,IAAI,CAAC,KAAK;IAClB,SAAS,EAAG,IAAI,CAAC,SAAS;CAC1B,CAAA;AAED,eAAe,OAAO,CAAC"}import { pctEncChar, pctDecChars, unescapeComponent } from "../uri";
import punycode from "punycode";
import { merge, subexp, toUpperCase, toArray } from "../util";
const O = {};
const isIRI = true;
//RFC 3986
const UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]";
const HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive
const PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded
//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =
//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]";  //(%d1-8 / %d11-12 / %d14-31 / %d127)
//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$);  //%d33 / %d35-91 / %d93-126 / obs-qtext
//const VCHAR$$ = "[\\x21-\\x7E]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$));  //%d0 / CR / LF / obs-qtext
//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+");
//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$);
//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"');
const ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]";
const QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]";
const VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]");
const DOT_ATOM_TEXT$ = subexp(ATEXT$$ + "+" + subexp("\\." + ATEXT$$ + "+") + "*");
const QUOTED_PAIR$ = subexp("\\\\" + VCHAR$$);
const QCONTENT$ = subexp(QTEXT$$ + "|" + QUOTED_PAIR$);
const QUOTED_STRING$ = subexp('\\"' + QCONTENT$ + "*" + '\\"');
//RFC 6068
const DTEXT_NO_OBS$$ = "[\\x21-\\x5A\\x5E-\\x7E]"; //%d33-90 / %d94-126
const SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]";
const QCHAR$ = subexp(UNRESERVED$$ + "|" + PCT_ENCODED$ + "|" + SOME_DELIMS$$);
const DOMAIN$ = subexp(DOT_ATOM_TEXT$ + "|" + "\\[" + DTEXT_NO_OBS$$ + "*" + "\\]");
const LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + "|" + QUOTED_STRING$);
const ADDR_SPEC$ = subexp(LOCAL_PART$ + "\\@" + DOMAIN$);
const TO$ = subexp(ADDR_SPEC$ + subexp("\\," + ADDR_SPEC$) + "*");
const HFNAME$ = subexp(QCHAR$ + "*");
const HFVALUE$ = HFNAME$;
const HFIELD$ = subexp(HFNAME$ + "\\=" + HFVALUE$);
const HFIELDS2$ = subexp(HFIELD$ + subexp("\\&" + HFIELD$) + "*");
const HFIELDS$ = subexp("\\?" + HFIELDS2$);
const MAILTO_URI = new RegExp("^mailto\\:" + TO$ + "?" + HFIELDS$ + "?$");
const UNRESERVED = new RegExp(UNRESERVED$$, "g");
const PCT_ENCODED = new RegExp(PCT_ENCODED$, "g");
const NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g");
const NOT_DOMAIN = new RegExp(merge("[^]", ATEXT$$, "[\\.]", "[\\[]", DTEXT_NO_OBS$$, "[\\]]"), "g");
const NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g");
const NOT_HFVALUE = NOT_HFNAME;
const TO = new RegExp("^" + TO$ + "$");
const HFIELDS = new RegExp("^" + HFIELDS2$ + "$");
function decodeUnreserved(str) {
    const decStr = pctDecChars(str);
    return (!decStr.match(UNRESERVED) ? str : decStr);
}
const handler = {
    scheme: "mailto",
    parse: function (components, options) {
        const mailtoComponents = components;
        const to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(",") : []);
        mailtoComponents.path = undefined;
        if (mailtoComponents.query) {
            let unknownHeaders = false;
            const headers = {};
            const hfields = mailtoComponents.query.split("&");
            for (let x = 0, xl = hfields.length; x < xl; ++x) {
                const hfield = hfields[x].split("=");
                switch (hfield[0]) {
                    case "to":
                        const toAddrs = hfield[1].split(",");
                        for (let x = 0, xl = toAddrs.length; x < xl; ++x) {
                            to.push(toAddrs[x]);
                        }
                        break;
                    case "subject":
                        mailtoComponents.subject = unescapeComponent(hfield[1], options);
                        break;
                    case "body":
                        mailtoComponents.body = unescapeComponent(hfield[1], options);
                        break;
                    default:
                        unknownHeaders = true;
                        headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);
                        break;
                }
            }
            if (unknownHeaders)
                mailtoComponents.headers = headers;
        }
        mailtoComponents.query = undefined;
        for (let x = 0, xl = to.length; x < xl; ++x) {
            const addr = to[x].split("@");
            addr[0] = unescapeComponent(addr[0]);
            if (!options.unicodeSupport) {
                //convert Unicode IDN -> ASCII IDN
                try {
                    addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());
                }
                catch (e) {
                    mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e;
                }
            }
            else {
                addr[1] = unescapeComponent(addr[1], options).toLowerCase();
            }
            to[x] = addr.join("@");
        }
        return mailtoComponents;
    },
    serialize: function (mailtoComponents, options) {
        const components = mailtoComponents;
        const to = toArray(mailtoComponents.to);
        if (to) {
            for (let x = 0, xl = to.length; x < xl; ++x) {
                const toAddr = String(to[x]);
                const atIdx = toAddr.lastIndexOf("@");
                const localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);
                let domain = toAddr.slice(atIdx + 1);
                //convert IDN via punycode
                try {
                    domain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain));
                }
                catch (e) {
                    components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
                }
                to[x] = localPart + "@" + domain;
            }
            components.path = to.join(",");
        }
        const headers = mailtoComponents.headers = mailtoComponents.headers || {};
        if (mailtoComponents.subject)
            headers["subject"] = mailtoComponents.subject;
        if (mailtoComponents.body)
            headers["body"] = mailtoComponents.body;
        const fields = [];
        for (const name in headers) {
            if (headers[name] !== O[name]) {
                fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) +
                    "=" +
                    headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar));
            }
        }
        if (fields.length) {
            components.query = fields.join("&");
        }
        return components;
    }
};
export default handler;
//# sourceMappingURL=mailto.js.map{"version":3,"file":"mailto.js","sourceRoot":"","sources":["../../../src/schemes/mailto.ts"],"names":[],"mappings":"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"}const UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/;
const UUID_PARSE = /^[0-9A-Fa-f\-]{36}/;
//RFC 4122
const handler = {
    scheme: "urn:uuid",
    parse: function (urnComponents, options) {
        const uuidComponents = urnComponents;
        uuidComponents.uuid = uuidComponents.nss;
        uuidComponents.nss = undefined;
        if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {
            uuidComponents.error = uuidComponents.error || "UUID is not valid.";
        }
        return uuidComponents;
    },
    serialize: function (uuidComponents, options) {
        const urnComponents = uuidComponents;
        //normalize UUID
        urnComponents.nss = (uuidComponents.uuid || "").toLowerCase();
        return urnComponents;
    },
};
export default handler;
//# sourceMappingURL=urn-uuid.js.map{"version":3,"file":"urn-uuid.js","sourceRoot":"","sources":["../../../src/schemes/urn-uuid.ts"],"names":[],"mappings":"AAQA,MAAM,IAAI,GAAG,0DAA0D,CAAC;AACxE,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC,UAAU;AACV,MAAM,OAAO,GAA+D;IAC3E,MAAM,EAAG,UAAU;IAEnB,KAAK,EAAG,UAAU,aAA2B,EAAE,OAAkB;QAChE,MAAM,cAAc,GAAG,aAA+B,CAAC;QACvD,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC;QACzC,cAAc,CAAC,GAAG,GAAG,SAAS,CAAC;QAE/B,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;YACpF,cAAc,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,IAAI,oBAAoB,CAAC;SACpE;QAED,OAAO,cAAc,CAAC;IACvB,CAAC;IAED,SAAS,EAAG,UAAU,cAA6B,EAAE,OAAkB;QACtE,MAAM,aAAa,GAAG,cAA+B,CAAC;QACtD,gBAAgB;QAChB,aAAa,CAAC,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9D,OAAO,aAAa,CAAC;IACtB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"}import { SCHEMES } from "../uri";
const NID$ = "(?:[0-9A-Za-z][0-9A-Za-z\\-]{1,31})";
const PCT_ENCODED$ = "(?:\\%[0-9A-Fa-f]{2})";
const TRANS$$ = "[0-9A-Za-z\\(\\)\\+\\,\\-\\.\\:\\=\\@\\;\\$\\_\\!\\*\\'\\/\\?\\#]";
const NSS$ = "(?:(?:" + PCT_ENCODED$ + "|" + TRANS$$ + ")+)";
const URN_SCHEME = new RegExp("^urn\\:(" + NID$ + ")$");
const URN_PATH = new RegExp("^(" + NID$ + ")\\:(" + NSS$ + ")$");
const URN_PARSE = /^([^\:]+)\:(.*)/;
const URN_EXCLUDED = /[\x00-\x20\\\"\&\<\>\[\]\^\`\{\|\}\~\x7F-\xFF]/g;
//RFC 2141
const handler = {
    scheme: "urn",
    parse: function (components, options) {
        const matches = components.path && components.path.match(URN_PARSE);
        let urnComponents = components;
        if (matches) {
            const scheme = options.scheme || urnComponents.scheme || "urn";
            const nid = matches[1].toLowerCase();
            const nss = matches[2];
            const urnScheme = `${scheme}:${options.nid || nid}`;
            const schemeHandler = SCHEMES[urnScheme];
            urnComponents.nid = nid;
            urnComponents.nss = nss;
            urnComponents.path = undefined;
            if (schemeHandler) {
                urnComponents = schemeHandler.parse(urnComponents, options);
            }
        }
        else {
            urnComponents.error = urnComponents.error || "URN can not be parsed.";
        }
        return urnComponents;
    },
    serialize: function (urnComponents, options) {
        const scheme = options.scheme || urnComponents.scheme || "urn";
        const nid = urnComponents.nid;
        const urnScheme = `${scheme}:${options.nid || nid}`;
        const schemeHandler = SCHEMES[urnScheme];
        if (schemeHandler) {
            urnComponents = schemeHandler.serialize(urnComponents, options);
        }
        const uriComponents = urnComponents;
        const nss = urnComponents.nss;
        uriComponents.path = `${nid || options.nid}:${nss}`;
        return uriComponents;
    },
};
export default handler;
//# sourceMappingURL=urn.js.map{"version":3,"file":"urn.js","sourceRoot":"","sources":["../../../src/schemes/urn.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,OAAO,EAAE,MAAM,QAAQ,CAAC;AAW7C,MAAM,IAAI,GAAG,qCAAqC,CAAC;AACnD,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAC7C,MAAM,OAAO,GAAG,mEAAmE,CAAC;AACpF,MAAM,IAAI,GAAG,QAAQ,GAAG,YAAY,GAAG,GAAG,GAAG,OAAO,GAAG,KAAK,CAAC;AAC7D,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACxD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACjE,MAAM,SAAS,GAAG,iBAAiB,CAAC;AACpC,MAAM,YAAY,GAAG,iDAAiD,CAAC;AAEvE,UAAU;AACV,MAAM,OAAO,GAA8C;IAC1D,MAAM,EAAG,KAAK;IAEd,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,aAAa,GAAG,UAA2B,CAAC;QAEhD,IAAI,OAAO,EAAE;YACZ,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK,CAAC;YAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;YACpD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAEzC,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YACxB,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YACxB,aAAa,CAAC,IAAI,GAAG,SAAS,CAAC;YAE/B,IAAI,aAAa,EAAE;gBAClB,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,aAAa,EAAE,OAAO,CAAkB,CAAC;aAC7E;SACD;aAAM;YACN,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,IAAI,wBAAwB,CAAC;SACtE;QAED,OAAO,aAAa,CAAC;IACtB,CAAC;IAED,SAAS,EAAG,UAAU,aAA2B,EAAE,OAAkB;QACpE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK,CAAC;QAC/D,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;QAC9B,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,aAAa,EAAE;YAClB,aAAa,GAAG,aAAa,CAAC,SAAS,CAAC,aAAa,EAAE,OAAO,CAAkB,CAAC;SACjF;QAED,MAAM,aAAa,GAAG,aAA8B,CAAC;QACrD,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;QAC9B,aAAa,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QAEpD,OAAO,aAAa,CAAC;IACtB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"}function isSecure(wsComponents) {
    return typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === "wss";
}
//RFC 6455
const handler = {
    scheme: "ws",
    domainHost: true,
    parse: function (components, options) {
        const wsComponents = components;
        //indicate if the secure flag is set
        wsComponents.secure = isSecure(wsComponents);
        //construct resouce name
        wsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');
        wsComponents.path = undefined;
        wsComponents.query = undefined;
        return wsComponents;
    },
    serialize: function (wsComponents, options) {
        //normalize the default port
        if (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === "") {
            wsComponents.port = undefined;
        }
        //ensure scheme matches secure flag
        if (typeof wsComponents.secure === 'boolean') {
            wsComponents.scheme = (wsComponents.secure ? 'wss' : 'ws');
            wsComponents.secure = undefined;
        }
        //reconstruct path from resource name
        if (wsComponents.resourceName) {
            const [path, query] = wsComponents.resourceName.split('?');
            wsComponents.path = (path && path !== '/' ? path : undefined);
            wsComponents.query = query;
            wsComponents.resourceName = undefined;
        }
        //forbid fragment component
        wsComponents.fragment = undefined;
        return wsComponents;
    }
};
export default handler;
//# sourceMappingURL=ws.js.map{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../../src/schemes/ws.ts"],"names":[],"mappings":"AAOA,kBAAkB,YAAyB;IAC1C,OAAO,OAAO,YAAY,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;AAC7H,CAAC;AAED,UAAU;AACV,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,IAAI;IAEb,UAAU,EAAG,IAAI;IAEjB,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,MAAM,YAAY,GAAG,UAA0B,CAAC;QAEhD,oCAAoC;QACpC,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;QAE7C,wBAAwB;QACxB,YAAY,CAAC,YAAY,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9G,YAAY,CAAC,IAAI,GAAG,SAAS,CAAC;QAC9B,YAAY,CAAC,KAAK,GAAG,SAAS,CAAC;QAE/B,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,SAAS,EAAG,UAAU,YAAyB,EAAE,OAAkB;QAClE,4BAA4B;QAC5B,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,KAAK,EAAE,EAAE;YAC1F,YAAY,CAAC,IAAI,GAAG,SAAS,CAAC;SAC9B;QAED,mCAAmC;QACnC,IAAI,OAAO,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE;YAC7C,YAAY,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3D,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC;SAChC;QAED,qCAAqC;QACrC,IAAI,YAAY,CAAC,YAAY,EAAE;YAC9B,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3D,YAAY,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC9D,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC;YAC3B,YAAY,CAAC,YAAY,GAAG,SAAS,CAAC;SACtC;QAED,2BAA2B;QAC3B,YAAY,CAAC,QAAQ,GAAG,SAAS,CAAC;QAElC,OAAO,YAAY,CAAC;IACrB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"}import ws from "./ws";
const handler = {
    scheme: "wss",
    domainHost: ws.domainHost,
    parse: ws.parse,
    serialize: ws.serialize
};
export default handler;
//# sourceMappingURL=wss.js.map{"version":3,"file":"wss.js","sourceRoot":"","sources":["../../../src/schemes/wss.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,MAAM,CAAC;AAEtB,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,KAAK;IACd,UAAU,EAAG,EAAE,CAAC,UAAU;IAC1B,KAAK,EAAG,EAAE,CAAC,KAAK;IAChB,SAAS,EAAG,EAAE,CAAC,SAAS;CACxB,CAAA;AAED,eAAe,OAAO,CAAC"}/** @license URI.js v4.4.0 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */
(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
	typeof define === 'function' && define.amd ? define(['exports'], factory) :
	(factory((global.URI = global.URI || {})));
}(this, (function (exports) { 'use strict';

function merge() {
    for (var _len = arguments.length, sets = Array(_len), _key = 0; _key < _len; _key++) {
        sets[_key] = arguments[_key];
    }

    if (sets.length > 1) {
        sets[0] = sets[0].slice(0, -1);
        var xl = sets.length - 1;
        for (var x = 1; x < xl; ++x) {
            sets[x] = sets[x].slice(1, -1);
        }
        sets[xl] = sets[xl].slice(1);
        return sets.join('');
    } else {
        return sets[0];
    }
}
function subexp(str) {
    return "(?:" + str + ")";
}
function typeOf(o) {
    return o === undefined ? "undefined" : o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase();
}
function toUpperCase(str) {
    return str.toUpperCase();
}
function toArray(obj) {
    return obj !== undefined && obj !== null ? obj instanceof Array ? obj : typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj) : [];
}
function assign(target, source) {
    var obj = target;
    if (source) {
        for (var key in source) {
            obj[key] = source[key];
        }
    }
    return obj;
}

function buildExps(isIRI) {
    var ALPHA$$ = "[A-Za-z]",
        CR$ = "[\\x0D]",
        DIGIT$$ = "[0-9]",
        DQUOTE$$ = "[\\x22]",
        HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"),
        //case-insensitive
    LF$$ = "[\\x0A]",
        SP$$ = "[\\x20]",
        PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)),
        //expanded
    GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]",
        SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]",
        RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),
        UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]",
        //subset, excludes bidi control characters
    IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]",
        //subset
    UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$),
        SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"),
        USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"),
        DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$),
        DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$),
        //relaxed parsing rules
    IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$),
        H16$ = subexp(HEXDIG$$ + "{1,4}"),
        LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$),
        IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$),
        //                           6( h16 ":" ) ls32
    IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$),
        //                      "::" 5( h16 ":" ) ls32
    IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$),
        //[               h16 ] "::" 4( h16 ":" ) ls32
    IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$),
        //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
    IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$),
        //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
    IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$),
        //[ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
    IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$),
        //[ *4( h16 ":" ) h16 ] "::"              ls32
    IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$),
        //[ *5( h16 ":" ) h16 ] "::"              h16
    IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"),
        //[ *6( h16 ":" ) h16 ] "::"
    IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")),
        ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"),
        //RFC 6874
    IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$),
        //RFC 6874
    IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$),
        //RFC 6874, with relaxed parsing rules
    IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"),
        IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"),
        //RFC 6874
    REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"),
        HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$),
        PORT$ = subexp(DIGIT$$ + "*"),
        AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"),
        PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")),
        SEGMENT$ = subexp(PCHAR$ + "*"),
        SEGMENT_NZ$ = subexp(PCHAR$ + "+"),
        SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"),
        PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"),
        PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"),
        //simplified
    PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$),
        //simplified
    PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$),
        //simplified
    PATH_EMPTY$ = "(?!" + PCHAR$ + ")",
        PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$),
        QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"),
        FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"),
        HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$),
        URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"),
        RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$),
        RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"),
        URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$),
        ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"),
        GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$",
        RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$",
        ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$",
        SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$",
        AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$";
    return {
        NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"),
        NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"),
        NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"),
        ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"),
        UNRESERVED: new RegExp(UNRESERVED$$, "g"),
        OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"),
        PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"),
        IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"),
        IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules
    };
}
var URI_PROTOCOL = buildExps(false);

var IRI_PROTOCOL = buildExps(true);

var slicedToArray = function () {
  function sliceIterator(arr, i) {
    var _arr = [];
    var _n = true;
    var _d = false;
    var _e = undefined;

    try {
      for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
        _arr.push(_s.value);

        if (i && _arr.length === i) break;
      }
    } catch (err) {
      _d = true;
      _e = err;
    } finally {
      try {
        if (!_n && _i["return"]) _i["return"]();
      } finally {
        if (_d) throw _e;
      }
    }

    return _arr;
  }

  return function (arr, i) {
    if (Array.isArray(arr)) {
      return arr;
    } else if (Symbol.iterator in Object(arr)) {
      return sliceIterator(arr, i);
    } else {
      throw new TypeError("Invalid attempt to destructure non-iterable instance");
    }
  };
}();













var toConsumableArray = function (arr) {
  if (Array.isArray(arr)) {
    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];

    return arr2;
  } else {
    return Array.from(arr);
  }
};

/** Highest positive signed 32-bit float value */

var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1

/** Bootstring parameters */
var base = 36;
var tMin = 1;
var tMax = 26;
var skew = 38;
var damp = 700;
var initialBias = 72;
var initialN = 128; // 0x80
var delimiter = '-'; // '\x2D'

/** Regular expressions */
var regexPunycode = /^xn--/;
var regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars
var regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators

/** Error messages */
var errors = {
	'overflow': 'Overflow: input needs wider integers to process',
	'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
	'invalid-input': 'Invalid input'
};

/** Convenience shortcuts */
var baseMinusTMin = base - tMin;
var floor = Math.floor;
var stringFromCharCode = String.fromCharCode;

/*--------------------------------------------------------------------------*/

/**
 * A generic error utility function.
 * @private
 * @param {String} type The error type.
 * @returns {Error} Throws a `RangeError` with the applicable error message.
 */
function error$1(type) {
	throw new RangeError(errors[type]);
}

/**
 * A generic `Array#map` utility function.
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} callback The function that gets called for every array
 * item.
 * @returns {Array} A new array of values returned by the callback function.
 */
function map(array, fn) {
	var result = [];
	var length = array.length;
	while (length--) {
		result[length] = fn(array[length]);
	}
	return result;
}

/**
 * A simple `Array#map`-like wrapper to work with domain name strings or email
 * addresses.
 * @private
 * @param {String} domain The domain name or email address.
 * @param {Function} callback The function that gets called for every
 * character.
 * @returns {Array} A new string of characters returned by the callback
 * function.
 */
function mapDomain(string, fn) {
	var parts = string.split('@');
	var result = '';
	if (parts.length > 1) {
		// In email addresses, only the domain name should be punycoded. Leave
		// the local part (i.e. everything up to `@`) intact.
		result = parts[0] + '@';
		string = parts[1];
	}
	// Avoid `split(regex)` for IE8 compatibility. See #17.
	string = string.replace(regexSeparators, '\x2E');
	var labels = string.split('.');
	var encoded = map(labels, fn).join('.');
	return result + encoded;
}

/**
 * Creates an array containing the numeric code points of each Unicode
 * character in the string. While JavaScript uses UCS-2 internally,
 * this function will convert a pair of surrogate halves (each of which
 * UCS-2 exposes as separate characters) into a single code point,
 * matching UTF-16.
 * @see `punycode.ucs2.encode`
 * @see <https://mathiasbynens.be/notes/javascript-encoding>
 * @memberOf punycode.ucs2
 * @name decode
 * @param {String} string The Unicode input string (UCS-2).
 * @returns {Array} The new array of code points.
 */
function ucs2decode(string) {
	var output = [];
	var counter = 0;
	var length = string.length;
	while (counter < length) {
		var value = string.charCodeAt(counter++);
		if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
			// It's a high surrogate, and there is a next character.
			var extra = string.charCodeAt(counter++);
			if ((extra & 0xFC00) == 0xDC00) {
				// Low surrogate.
				output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
			} else {
				// It's an unmatched surrogate; only append this code unit, in case the
				// next code unit is the high surrogate of a surrogate pair.
				output.push(value);
				counter--;
			}
		} else {
			output.push(value);
		}
	}
	return output;
}

/**
 * Creates a string based on an array of numeric code points.
 * @see `punycode.ucs2.decode`
 * @memberOf punycode.ucs2
 * @name encode
 * @param {Array} codePoints The array of numeric code points.
 * @returns {String} The new Unicode string (UCS-2).
 */
var ucs2encode = function ucs2encode(array) {
	return String.fromCodePoint.apply(String, toConsumableArray(array));
};

/**
 * Converts a basic code point into a digit/integer.
 * @see `digitToBasic()`
 * @private
 * @param {Number} codePoint The basic numeric code point value.
 * @returns {Number} The numeric value of a basic code point (for use in
 * representing integers) in the range `0` to `base - 1`, or `base` if
 * the code point does not represent a value.
 */
var basicToDigit = function basicToDigit(codePoint) {
	if (codePoint - 0x30 < 0x0A) {
		return codePoint - 0x16;
	}
	if (codePoint - 0x41 < 0x1A) {
		return codePoint - 0x41;
	}
	if (codePoint - 0x61 < 0x1A) {
		return codePoint - 0x61;
	}
	return base;
};

/**
 * Converts a digit/integer into a basic code point.
 * @see `basicToDigit()`
 * @private
 * @param {Number} digit The numeric value of a basic code point.
 * @returns {Number} The basic code point whose value (when used for
 * representing integers) is `digit`, which needs to be in the range
 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
 * used; else, the lowercase form is used. The behavior is undefined
 * if `flag` is non-zero and `digit` has no uppercase form.
 */
var digitToBasic = function digitToBasic(digit, flag) {
	//  0..25 map to ASCII a..z or A..Z
	// 26..35 map to ASCII 0..9
	return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
};

/**
 * Bias adaptation function as per section 3.4 of RFC 3492.
 * https://tools.ietf.org/html/rfc3492#section-3.4
 * @private
 */
var adapt = function adapt(delta, numPoints, firstTime) {
	var k = 0;
	delta = firstTime ? floor(delta / damp) : delta >> 1;
	delta += floor(delta / numPoints);
	for (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) {
		delta = floor(delta / baseMinusTMin);
	}
	return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
};

/**
 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
 * symbols.
 * @memberOf punycode
 * @param {String} input The Punycode string of ASCII-only symbols.
 * @returns {String} The resulting string of Unicode symbols.
 */
var decode = function decode(input) {
	// Don't use UCS-2.
	var output = [];
	var inputLength = input.length;
	var i = 0;
	var n = initialN;
	var bias = initialBias;

	// Handle the basic code points: let `basic` be the number of input code
	// points before the last delimiter, or `0` if there is none, then copy
	// the first basic code points to the output.

	var basic = input.lastIndexOf(delimiter);
	if (basic < 0) {
		basic = 0;
	}

	for (var j = 0; j < basic; ++j) {
		// if it's not a basic code point
		if (input.charCodeAt(j) >= 0x80) {
			error$1('not-basic');
		}
		output.push(input.charCodeAt(j));
	}

	// Main decoding loop: start just after the last delimiter if any basic code
	// points were copied; start at the beginning otherwise.

	for (var index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{

		// `index` is the index of the next character to be consumed.
		// Decode a generalized variable-length integer into `delta`,
		// which gets added to `i`. The overflow checking is easier
		// if we increase `i` as we go, then subtract off its starting
		// value at the end to obtain `delta`.
		var oldi = i;
		for (var w = 1, k = base;; /* no condition */k += base) {

			if (index >= inputLength) {
				error$1('invalid-input');
			}

			var digit = basicToDigit(input.charCodeAt(index++));

			if (digit >= base || digit > floor((maxInt - i) / w)) {
				error$1('overflow');
			}

			i += digit * w;
			var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;

			if (digit < t) {
				break;
			}

			var baseMinusT = base - t;
			if (w > floor(maxInt / baseMinusT)) {
				error$1('overflow');
			}

			w *= baseMinusT;
		}

		var out = output.length + 1;
		bias = adapt(i - oldi, out, oldi == 0);

		// `i` was supposed to wrap around from `out` to `0`,
		// incrementing `n` each time, so we'll fix that now:
		if (floor(i / out) > maxInt - n) {
			error$1('overflow');
		}

		n += floor(i / out);
		i %= out;

		// Insert `n` at position `i` of the output.
		output.splice(i++, 0, n);
	}

	return String.fromCodePoint.apply(String, output);
};

/**
 * Converts a string of Unicode symbols (e.g. a domain name label) to a
 * Punycode string of ASCII-only symbols.
 * @memberOf punycode
 * @param {String} input The string of Unicode symbols.
 * @returns {String} The resulting Punycode string of ASCII-only symbols.
 */
var encode = function encode(input) {
	var output = [];

	// Convert the input in UCS-2 to an array of Unicode code points.
	input = ucs2decode(input);

	// Cache the length.
	var inputLength = input.length;

	// Initialize the state.
	var n = initialN;
	var delta = 0;
	var bias = initialBias;

	// Handle the basic code points.
	var _iteratorNormalCompletion = true;
	var _didIteratorError = false;
	var _iteratorError = undefined;

	try {
		for (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
			var _currentValue2 = _step.value;

			if (_currentValue2 < 0x80) {
				output.push(stringFromCharCode(_currentValue2));
			}
		}
	} catch (err) {
		_didIteratorError = true;
		_iteratorError = err;
	} finally {
		try {
			if (!_iteratorNormalCompletion && _iterator.return) {
				_iterator.return();
			}
		} finally {
			if (_didIteratorError) {
				throw _iteratorError;
			}
		}
	}

	var basicLength = output.length;
	var handledCPCount = basicLength;

	// `handledCPCount` is the number of code points that have been handled;
	// `basicLength` is the number of basic code points.

	// Finish the basic string with a delimiter unless it's empty.
	if (basicLength) {
		output.push(delimiter);
	}

	// Main encoding loop:
	while (handledCPCount < inputLength) {

		// All non-basic code points < n have been handled already. Find the next
		// larger one:
		var m = maxInt;
		var _iteratorNormalCompletion2 = true;
		var _didIteratorError2 = false;
		var _iteratorError2 = undefined;

		try {
			for (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
				var currentValue = _step2.value;

				if (currentValue >= n && currentValue < m) {
					m = currentValue;
				}
			}

			// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
			// but guard against overflow.
		} catch (err) {
			_didIteratorError2 = true;
			_iteratorError2 = err;
		} finally {
			try {
				if (!_iteratorNormalCompletion2 && _iterator2.return) {
					_iterator2.return();
				}
			} finally {
				if (_didIteratorError2) {
					throw _iteratorError2;
				}
			}
		}

		var handledCPCountPlusOne = handledCPCount + 1;
		if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
			error$1('overflow');
		}

		delta += (m - n) * handledCPCountPlusOne;
		n = m;

		var _iteratorNormalCompletion3 = true;
		var _didIteratorError3 = false;
		var _iteratorError3 = undefined;

		try {
			for (var _iterator3 = input[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
				var _currentValue = _step3.value;

				if (_currentValue < n && ++delta > maxInt) {
					error$1('overflow');
				}
				if (_currentValue == n) {
					// Represent delta as a generalized variable-length integer.
					var q = delta;
					for (var k = base;; /* no condition */k += base) {
						var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
						if (q < t) {
							break;
						}
						var qMinusT = q - t;
						var baseMinusT = base - t;
						output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));
						q = floor(qMinusT / baseMinusT);
					}

					output.push(stringFromCharCode(digitToBasic(q, 0)));
					bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
					delta = 0;
					++handledCPCount;
				}
			}
		} catch (err) {
			_didIteratorError3 = true;
			_iteratorError3 = err;
		} finally {
			try {
				if (!_iteratorNormalCompletion3 && _iterator3.return) {
					_iterator3.return();
				}
			} finally {
				if (_didIteratorError3) {
					throw _iteratorError3;
				}
			}
		}

		++delta;
		++n;
	}
	return output.join('');
};

/**
 * Converts a Punycode string representing a domain name or an email address
 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
 * it doesn't matter if you call it on a string that has already been
 * converted to Unicode.
 * @memberOf punycode
 * @param {String} input The Punycoded domain name or email address to
 * convert to Unicode.
 * @returns {String} The Unicode representation of the given Punycode
 * string.
 */
var toUnicode = function toUnicode(input) {
	return mapDomain(input, function (string) {
		return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;
	});
};

/**
 * Converts a Unicode string representing a domain name or an email address to
 * Punycode. Only the non-ASCII parts of the domain name will be converted,
 * i.e. it doesn't matter if you call it with a domain that's already in
 * ASCII.
 * @memberOf punycode
 * @param {String} input The domain name or email address to convert, as a
 * Unicode string.
 * @returns {String} The Punycode representation of the given domain name or
 * email address.
 */
var toASCII = function toASCII(input) {
	return mapDomain(input, function (string) {
		return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;
	});
};

/*--------------------------------------------------------------------------*/

/** Define the public API */
var punycode = {
	/**
  * A string representing the current Punycode.js version number.
  * @memberOf punycode
  * @type String
  */
	'version': '2.1.0',
	/**
  * An object of methods to convert from JavaScript's internal character
  * representation (UCS-2) to Unicode code points, and back.
  * @see <https://mathiasbynens.be/notes/javascript-encoding>
  * @memberOf punycode
  * @type Object
  */
	'ucs2': {
		'decode': ucs2decode,
		'encode': ucs2encode
	},
	'decode': decode,
	'encode': encode,
	'toASCII': toASCII,
	'toUnicode': toUnicode
};

/**
 * URI.js
 *
 * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.
 * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
 * @see http://github.com/garycourt/uri-js
 */
/**
 * Copyright 2011 Gary Court. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 *    1. Redistributions of source code must retain the above copyright notice, this list of
 *       conditions and the following disclaimer.
 *
 *    2. Redistributions in binary form must reproduce the above copyright notice, this list
 *       of conditions and the following disclaimer in the documentation and/or other materials
 *       provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation are those of the
 * authors and should not be interpreted as representing official policies, either expressed
 * or implied, of Gary Court.
 */
var SCHEMES = {};
function pctEncChar(chr) {
    var c = chr.charCodeAt(0);
    var e = void 0;
    if (c < 16) e = "%0" + c.toString(16).toUpperCase();else if (c < 128) e = "%" + c.toString(16).toUpperCase();else if (c < 2048) e = "%" + (c >> 6 | 192).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();else e = "%" + (c >> 12 | 224).toString(16).toUpperCase() + "%" + (c >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();
    return e;
}
function pctDecChars(str) {
    var newStr = "";
    var i = 0;
    var il = str.length;
    while (i < il) {
        var c = parseInt(str.substr(i + 1, 2), 16);
        if (c < 128) {
            newStr += String.fromCharCode(c);
            i += 3;
        } else if (c >= 194 && c < 224) {
            if (il - i >= 6) {
                var c2 = parseInt(str.substr(i + 4, 2), 16);
                newStr += String.fromCharCode((c & 31) << 6 | c2 & 63);
            } else {
                newStr += str.substr(i, 6);
            }
            i += 6;
        } else if (c >= 224) {
            if (il - i >= 9) {
                var _c = parseInt(str.substr(i + 4, 2), 16);
                var c3 = parseInt(str.substr(i + 7, 2), 16);
                newStr += String.fromCharCode((c & 15) << 12 | (_c & 63) << 6 | c3 & 63);
            } else {
                newStr += str.substr(i, 9);
            }
            i += 9;
        } else {
            newStr += str.substr(i, 3);
            i += 3;
        }
    }
    return newStr;
}
function _normalizeComponentEncoding(components, protocol) {
    function decodeUnreserved(str) {
        var decStr = pctDecChars(str);
        return !decStr.match(protocol.UNRESERVED) ? str : decStr;
    }
    if (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, "");
    if (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    if (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
    return components;
}

function _stripLeadingZeros(str) {
    return str.replace(/^0*(.*)/, "$1") || "0";
}
function _normalizeIPv4(host, protocol) {
    var matches = host.match(protocol.IPV4ADDRESS) || [];

    var _matches = slicedToArray(matches, 2),
        address = _matches[1];

    if (address) {
        return address.split(".").map(_stripLeadingZeros).join(".");
    } else {
        return host;
    }
}
function _normalizeIPv6(host, protocol) {
    var matches = host.match(protocol.IPV6ADDRESS) || [];

    var _matches2 = slicedToArray(matches, 3),
        address = _matches2[1],
        zone = _matches2[2];

    if (address) {
        var _address$toLowerCase$ = address.toLowerCase().split('::').reverse(),
            _address$toLowerCase$2 = slicedToArray(_address$toLowerCase$, 2),
            last = _address$toLowerCase$2[0],
            first = _address$toLowerCase$2[1];

        var firstFields = first ? first.split(":").map(_stripLeadingZeros) : [];
        var lastFields = last.split(":").map(_stripLeadingZeros);
        var isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);
        var fieldCount = isLastFieldIPv4Address ? 7 : 8;
        var lastFieldsStart = lastFields.length - fieldCount;
        var fields = Array(fieldCount);
        for (var x = 0; x < fieldCount; ++x) {
            fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';
        }
        if (isLastFieldIPv4Address) {
            fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);
        }
        var allZeroFields = fields.reduce(function (acc, field, index) {
            if (!field || field === "0") {
                var lastLongest = acc[acc.length - 1];
                if (lastLongest && lastLongest.index + lastLongest.length === index) {
                    lastLongest.length++;
                } else {
                    acc.push({ index: index, length: 1 });
                }
            }
            return acc;
        }, []);
        var longestZeroFields = allZeroFields.sort(function (a, b) {
            return b.length - a.length;
        })[0];
        var newHost = void 0;
        if (longestZeroFields && longestZeroFields.length > 1) {
            var newFirst = fields.slice(0, longestZeroFields.index);
            var newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);
            newHost = newFirst.join(":") + "::" + newLast.join(":");
        } else {
            newHost = fields.join(":");
        }
        if (zone) {
            newHost += "%" + zone;
        }
        return newHost;
    } else {
        return host;
    }
}
var URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i;
var NO_MATCH_IS_UNDEFINED = "".match(/(){0}/)[1] === undefined;
function parse(uriString) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    var components = {};
    var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;
    if (options.reference === "suffix") uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString;
    var matches = uriString.match(URI_PARSE);
    if (matches) {
        if (NO_MATCH_IS_UNDEFINED) {
            //store each component
            components.scheme = matches[1];
            components.userinfo = matches[3];
            components.host = matches[4];
            components.port = parseInt(matches[5], 10);
            components.path = matches[6] || "";
            components.query = matches[7];
            components.fragment = matches[8];
            //fix port number
            if (isNaN(components.port)) {
                components.port = matches[5];
            }
        } else {
            //IE FIX for improper RegExp matching
            //store each component
            components.scheme = matches[1] || undefined;
            components.userinfo = uriString.indexOf("@") !== -1 ? matches[3] : undefined;
            components.host = uriString.indexOf("//") !== -1 ? matches[4] : undefined;
            components.port = parseInt(matches[5], 10);
            components.path = matches[6] || "";
            components.query = uriString.indexOf("?") !== -1 ? matches[7] : undefined;
            components.fragment = uriString.indexOf("#") !== -1 ? matches[8] : undefined;
            //fix port number
            if (isNaN(components.port)) {
                components.port = uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined;
            }
        }
        if (components.host) {
            //normalize IP hosts
            components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);
        }
        //determine reference type
        if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {
            components.reference = "same-document";
        } else if (components.scheme === undefined) {
            components.reference = "relative";
        } else if (components.fragment === undefined) {
            components.reference = "absolute";
        } else {
            components.reference = "uri";
        }
        //check for reference errors
        if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) {
            components.error = components.error || "URI is not a " + options.reference + " reference.";
        }
        //find scheme handler
        var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
        //check if scheme can't handle IRIs
        if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
            //if host component is a domain name
            if (components.host && (options.domainHost || schemeHandler && schemeHandler.domainHost)) {
                //convert Unicode IDN -> ASCII IDN
                try {
                    components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());
                } catch (e) {
                    components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e;
                }
            }
            //convert IRI -> URI
            _normalizeComponentEncoding(components, URI_PROTOCOL);
        } else {
            //normalize encodings
            _normalizeComponentEncoding(components, protocol);
        }
        //perform scheme specific parsing
        if (schemeHandler && schemeHandler.parse) {
            schemeHandler.parse(components, options);
        }
    } else {
        components.error = components.error || "URI can not be parsed.";
    }
    return components;
}

function _recomposeAuthority(components, options) {
    var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;
    var uriTokens = [];
    if (components.userinfo !== undefined) {
        uriTokens.push(components.userinfo);
        uriTokens.push("@");
    }
    if (components.host !== undefined) {
        //normalize IP hosts, add brackets and escape zone separator for IPv6
        uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, function (_, $1, $2) {
            return "[" + $1 + ($2 ? "%25" + $2 : "") + "]";
        }));
    }
    if (typeof components.port === "number" || typeof components.port === "string") {
        uriTokens.push(":");
        uriTokens.push(String(components.port));
    }
    return uriTokens.length ? uriTokens.join("") : undefined;
}

var RDS1 = /^\.\.?\//;
var RDS2 = /^\/\.(\/|$)/;
var RDS3 = /^\/\.\.(\/|$)/;
var RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/;
function removeDotSegments(input) {
    var output = [];
    while (input.length) {
        if (input.match(RDS1)) {
            input = input.replace(RDS1, "");
        } else if (input.match(RDS2)) {
            input = input.replace(RDS2, "/");
        } else if (input.match(RDS3)) {
            input = input.replace(RDS3, "/");
            output.pop();
        } else if (input === "." || input === "..") {
            input = "";
        } else {
            var im = input.match(RDS5);
            if (im) {
                var s = im[0];
                input = input.slice(s.length);
                output.push(s);
            } else {
                throw new Error("Unexpected dot segment condition");
            }
        }
    }
    return output.join("");
}

function serialize(components) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    var protocol = options.iri ? IRI_PROTOCOL : URI_PROTOCOL;
    var uriTokens = [];
    //find scheme handler
    var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
    //perform scheme specific serialization
    if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);
    if (components.host) {
        //if host component is an IPv6 address
        if (protocol.IPV6ADDRESS.test(components.host)) {}
        //TODO: normalize IPv6 address as per RFC 5952

        //if host component is a domain name
        else if (options.domainHost || schemeHandler && schemeHandler.domainHost) {
                //convert IDN via punycode
                try {
                    components.host = !options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host);
                } catch (e) {
                    components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
                }
            }
    }
    //normalize encoding
    _normalizeComponentEncoding(components, protocol);
    if (options.reference !== "suffix" && components.scheme) {
        uriTokens.push(components.scheme);
        uriTokens.push(":");
    }
    var authority = _recomposeAuthority(components, options);
    if (authority !== undefined) {
        if (options.reference !== "suffix") {
            uriTokens.push("//");
        }
        uriTokens.push(authority);
        if (components.path && components.path.charAt(0) !== "/") {
            uriTokens.push("/");
        }
    }
    if (components.path !== undefined) {
        var s = components.path;
        if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
            s = removeDotSegments(s);
        }
        if (authority === undefined) {
            s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//"
        }
        uriTokens.push(s);
    }
    if (components.query !== undefined) {
        uriTokens.push("?");
        uriTokens.push(components.query);
    }
    if (components.fragment !== undefined) {
        uriTokens.push("#");
        uriTokens.push(components.fragment);
    }
    return uriTokens.join(""); //merge tokens into a string
}

function resolveComponents(base, relative) {
    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
    var skipNormalization = arguments[3];

    var target = {};
    if (!skipNormalization) {
        base = parse(serialize(base, options), options); //normalize base components
        relative = parse(serialize(relative, options), options); //normalize relative components
    }
    options = options || {};
    if (!options.tolerant && relative.scheme) {
        target.scheme = relative.scheme;
        //target.authority = relative.authority;
        target.userinfo = relative.userinfo;
        target.host = relative.host;
        target.port = relative.port;
        target.path = removeDotSegments(relative.path || "");
        target.query = relative.query;
    } else {
        if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {
            //target.authority = relative.authority;
            target.userinfo = relative.userinfo;
            target.host = relative.host;
            target.port = relative.port;
            target.path = removeDotSegments(relative.path || "");
            target.query = relative.query;
        } else {
            if (!relative.path) {
                target.path = base.path;
                if (relative.query !== undefined) {
                    target.query = relative.query;
                } else {
                    target.query = base.query;
                }
            } else {
                if (relative.path.charAt(0) === "/") {
                    target.path = removeDotSegments(relative.path);
                } else {
                    if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {
                        target.path = "/" + relative.path;
                    } else if (!base.path) {
                        target.path = relative.path;
                    } else {
                        target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path;
                    }
                    target.path = removeDotSegments(target.path);
                }
                target.query = relative.query;
            }
            //target.authority = base.authority;
            target.userinfo = base.userinfo;
            target.host = base.host;
            target.port = base.port;
        }
        target.scheme = base.scheme;
    }
    target.fragment = relative.fragment;
    return target;
}

function resolve(baseURI, relativeURI, options) {
    var schemelessOptions = assign({ scheme: 'null' }, options);
    return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);
}

function normalize(uri, options) {
    if (typeof uri === "string") {
        uri = serialize(parse(uri, options), options);
    } else if (typeOf(uri) === "object") {
        uri = parse(serialize(uri, options), options);
    }
    return uri;
}

function equal(uriA, uriB, options) {
    if (typeof uriA === "string") {
        uriA = serialize(parse(uriA, options), options);
    } else if (typeOf(uriA) === "object") {
        uriA = serialize(uriA, options);
    }
    if (typeof uriB === "string") {
        uriB = serialize(parse(uriB, options), options);
    } else if (typeOf(uriB) === "object") {
        uriB = serialize(uriB, options);
    }
    return uriA === uriB;
}

function escapeComponent(str, options) {
    return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE, pctEncChar);
}

function unescapeComponent(str, options) {
    return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED, pctDecChars);
}

var handler = {
    scheme: "http",
    domainHost: true,
    parse: function parse(components, options) {
        //report missing host
        if (!components.host) {
            components.error = components.error || "HTTP URIs must have a host.";
        }
        return components;
    },
    serialize: function serialize(components, options) {
        var secure = String(components.scheme).toLowerCase() === "https";
        //normalize the default port
        if (components.port === (secure ? 443 : 80) || components.port === "") {
            components.port = undefined;
        }
        //normalize the empty path
        if (!components.path) {
            components.path = "/";
        }
        //NOTE: We do not parse query strings for HTTP URIs
        //as WWW Form Url Encoded query strings are part of the HTML4+ spec,
        //and not the HTTP spec.
        return components;
    }
};

var handler$1 = {
    scheme: "https",
    domainHost: handler.domainHost,
    parse: handler.parse,
    serialize: handler.serialize
};

function isSecure(wsComponents) {
    return typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === "wss";
}
//RFC 6455
var handler$2 = {
    scheme: "ws",
    domainHost: true,
    parse: function parse(components, options) {
        var wsComponents = components;
        //indicate if the secure flag is set
        wsComponents.secure = isSecure(wsComponents);
        //construct resouce name
        wsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');
        wsComponents.path = undefined;
        wsComponents.query = undefined;
        return wsComponents;
    },
    serialize: function serialize(wsComponents, options) {
        //normalize the default port
        if (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === "") {
            wsComponents.port = undefined;
        }
        //ensure scheme matches secure flag
        if (typeof wsComponents.secure === 'boolean') {
            wsComponents.scheme = wsComponents.secure ? 'wss' : 'ws';
            wsComponents.secure = undefined;
        }
        //reconstruct path from resource name
        if (wsComponents.resourceName) {
            var _wsComponents$resourc = wsComponents.resourceName.split('?'),
                _wsComponents$resourc2 = slicedToArray(_wsComponents$resourc, 2),
                path = _wsComponents$resourc2[0],
                query = _wsComponents$resourc2[1];

            wsComponents.path = path && path !== '/' ? path : undefined;
            wsComponents.query = query;
            wsComponents.resourceName = undefined;
        }
        //forbid fragment component
        wsComponents.fragment = undefined;
        return wsComponents;
    }
};

var handler$3 = {
    scheme: "wss",
    domainHost: handler$2.domainHost,
    parse: handler$2.parse,
    serialize: handler$2.serialize
};

var O = {};
var isIRI = true;
//RFC 3986
var UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]";
var HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive
var PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded
//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =
//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]";  //(%d1-8 / %d11-12 / %d14-31 / %d127)
//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$);  //%d33 / %d35-91 / %d93-126 / obs-qtext
//const VCHAR$$ = "[\\x21-\\x7E]";
//const WSP$$ = "[\\x20\\x09]";
//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$));  //%d0 / CR / LF / obs-qtext
//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+");
//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$);
//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"');
var ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]";
var QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]";
var VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]");
var SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]";
var UNRESERVED = new RegExp(UNRESERVED$$, "g");
var PCT_ENCODED = new RegExp(PCT_ENCODED$, "g");
var NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g");
var NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g");
var NOT_HFVALUE = NOT_HFNAME;
function decodeUnreserved(str) {
    var decStr = pctDecChars(str);
    return !decStr.match(UNRESERVED) ? str : decStr;
}
var handler$4 = {
    scheme: "mailto",
    parse: function parse$$1(components, options) {
        var mailtoComponents = components;
        var to = mailtoComponents.to = mailtoComponents.path ? mailtoComponents.path.split(",") : [];
        mailtoComponents.path = undefined;
        if (mailtoComponents.query) {
            var unknownHeaders = false;
            var headers = {};
            var hfields = mailtoComponents.query.split("&");
            for (var x = 0, xl = hfields.length; x < xl; ++x) {
                var hfield = hfields[x].split("=");
                switch (hfield[0]) {
                    case "to":
                        var toAddrs = hfield[1].split(",");
                        for (var _x = 0, _xl = toAddrs.length; _x < _xl; ++_x) {
                            to.push(toAddrs[_x]);
                        }
                        break;
                    case "subject":
                        mailtoComponents.subject = unescapeComponent(hfield[1], options);
                        break;
                    case "body":
                        mailtoComponents.body = unescapeComponent(hfield[1], options);
                        break;
                    default:
                        unknownHeaders = true;
                        headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);
                        break;
                }
            }
            if (unknownHeaders) mailtoComponents.headers = headers;
        }
        mailtoComponents.query = undefined;
        for (var _x2 = 0, _xl2 = to.length; _x2 < _xl2; ++_x2) {
            var addr = to[_x2].split("@");
            addr[0] = unescapeComponent(addr[0]);
            if (!options.unicodeSupport) {
                //convert Unicode IDN -> ASCII IDN
                try {
                    addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());
                } catch (e) {
                    mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e;
                }
            } else {
                addr[1] = unescapeComponent(addr[1], options).toLowerCase();
            }
            to[_x2] = addr.join("@");
        }
        return mailtoComponents;
    },
    serialize: function serialize$$1(mailtoComponents, options) {
        var components = mailtoComponents;
        var to = toArray(mailtoComponents.to);
        if (to) {
            for (var x = 0, xl = to.length; x < xl; ++x) {
                var toAddr = String(to[x]);
                var atIdx = toAddr.lastIndexOf("@");
                var localPart = toAddr.slice(0, atIdx).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);
                var domain = toAddr.slice(atIdx + 1);
                //convert IDN via punycode
                try {
                    domain = !options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain);
                } catch (e) {
                    components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
                }
                to[x] = localPart + "@" + domain;
            }
            components.path = to.join(",");
        }
        var headers = mailtoComponents.headers = mailtoComponents.headers || {};
        if (mailtoComponents.subject) headers["subject"] = mailtoComponents.subject;
        if (mailtoComponents.body) headers["body"] = mailtoComponents.body;
        var fields = [];
        for (var name in headers) {
            if (headers[name] !== O[name]) {
                fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + "=" + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar));
            }
        }
        if (fields.length) {
            components.query = fields.join("&");
        }
        return components;
    }
};

var URN_PARSE = /^([^\:]+)\:(.*)/;
//RFC 2141
var handler$5 = {
    scheme: "urn",
    parse: function parse$$1(components, options) {
        var matches = components.path && components.path.match(URN_PARSE);
        var urnComponents = components;
        if (matches) {
            var scheme = options.scheme || urnComponents.scheme || "urn";
            var nid = matches[1].toLowerCase();
            var nss = matches[2];
            var urnScheme = scheme + ":" + (options.nid || nid);
            var schemeHandler = SCHEMES[urnScheme];
            urnComponents.nid = nid;
            urnComponents.nss = nss;
            urnComponents.path = undefined;
            if (schemeHandler) {
                urnComponents = schemeHandler.parse(urnComponents, options);
            }
        } else {
            urnComponents.error = urnComponents.error || "URN can not be parsed.";
        }
        return urnComponents;
    },
    serialize: function serialize$$1(urnComponents, options) {
        var scheme = options.scheme || urnComponents.scheme || "urn";
        var nid = urnComponents.nid;
        var urnScheme = scheme + ":" + (options.nid || nid);
        var schemeHandler = SCHEMES[urnScheme];
        if (schemeHandler) {
            urnComponents = schemeHandler.serialize(urnComponents, options);
        }
        var uriComponents = urnComponents;
        var nss = urnComponents.nss;
        uriComponents.path = (nid || options.nid) + ":" + nss;
        return uriComponents;
    }
};

var UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/;
//RFC 4122
var handler$6 = {
    scheme: "urn:uuid",
    parse: function parse(urnComponents, options) {
        var uuidComponents = urnComponents;
        uuidComponents.uuid = uuidComponents.nss;
        uuidComponents.nss = undefined;
        if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {
            uuidComponents.error = uuidComponents.error || "UUID is not valid.";
        }
        return uuidComponents;
    },
    serialize: function serialize(uuidComponents, options) {
        var urnComponents = uuidComponents;
        //normalize UUID
        urnComponents.nss = (uuidComponents.uuid || "").toLowerCase();
        return urnComponents;
    }
};

SCHEMES[handler.scheme] = handler;
SCHEMES[handler$1.scheme] = handler$1;
SCHEMES[handler$2.scheme] = handler$2;
SCHEMES[handler$3.scheme] = handler$3;
SCHEMES[handler$4.scheme] = handler$4;
SCHEMES[handler$5.scheme] = handler$5;
SCHEMES[handler$6.scheme] = handler$6;

exports.SCHEMES = SCHEMES;
exports.pctEncChar = pctEncChar;
exports.pctDecChars = pctDecChars;
exports.parse = parse;
exports.removeDotSegments = removeDotSegments;
exports.serialize = serialize;
exports.resolveComponents = resolveComponents;
exports.resolve = resolve;
exports.normalize = normalize;
exports.equal = equal;
exports.escapeComponent = escapeComponent;
exports.unescapeComponent = unescapeComponent;

Object.defineProperty(exports, '__esModule', { value: true });

})));
//# sourceMappingURL=uri.all.js.map
{"version":3,"file":"uri.all.js","sources":["../../src/index.ts","../../src/schemes/urn-uuid.ts","../../src/schemes/urn.ts","../../src/schemes/mailto.ts","../../src/schemes/wss.ts","../../src/schemes/ws.ts","../../src/schemes/https.ts","../../src/schemes/http.ts","../../src/uri.ts","../../node_modules/punycode/punycode.es6.js","../../src/regexps-iri.ts","../../src/regexps-uri.ts","../../src/util.ts"],"sourcesContent":["import { SCHEMES } from \"./uri\";\n\nimport http from \"./schemes/http\";\nSCHEMES[http.scheme] = http;\n\nimport https from \"./schemes/https\";\nSCHEMES[https.scheme] = https;\n\nimport ws from \"./schemes/ws\";\nSCHEMES[ws.scheme] = ws;\n\nimport wss from \"./schemes/wss\";\nSCHEMES[wss.scheme] = wss;\n\nimport mailto from \"./schemes/mailto\";\nSCHEMES[mailto.scheme] = mailto;\n\nimport urn from \"./schemes/urn\";\nSCHEMES[urn.scheme] = urn;\n\nimport uuid from \"./schemes/urn-uuid\";\nSCHEMES[uuid.scheme] = uuid;\n\nexport * from \"./uri\";\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { URNComponents } from \"./urn\";\nimport { SCHEMES } from \"../uri\";\n\nexport interface UUIDComponents extends URNComponents {\n\tuuid?: string;\n}\n\nconst UUID = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;\nconst UUID_PARSE = /^[0-9A-Fa-f\\-]{36}/;\n\n//RFC 4122\nconst handler:URISchemeHandler<UUIDComponents, URIOptions, URNComponents> = {\n\tscheme : \"urn:uuid\",\n\n\tparse : function (urnComponents:URNComponents, options:URIOptions):UUIDComponents {\n\t\tconst uuidComponents = urnComponents as UUIDComponents;\n\t\tuuidComponents.uuid = uuidComponents.nss;\n\t\tuuidComponents.nss = undefined;\n\n\t\tif (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {\n\t\t\tuuidComponents.error = uuidComponents.error || \"UUID is not valid.\";\n\t\t}\n\n\t\treturn uuidComponents;\n\t},\n\n\tserialize : function (uuidComponents:UUIDComponents, options:URIOptions):URNComponents {\n\t\tconst urnComponents = uuidComponents as URNComponents;\n\t\t//normalize UUID\n\t\turnComponents.nss = (uuidComponents.uuid || \"\").toLowerCase();\n\t\treturn urnComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, SCHEMES } from \"../uri\";\n\nexport interface URNComponents extends URIComponents {\n\tnid?:string;\n\tnss?:string;\n}\n\nexport interface URNOptions extends URIOptions {\n\tnid?:string;\n}\n\nconst NID$ = \"(?:[0-9A-Za-z][0-9A-Za-z\\\\-]{1,31})\";\nconst PCT_ENCODED$ = \"(?:\\\\%[0-9A-Fa-f]{2})\";\nconst TRANS$$ = \"[0-9A-Za-z\\\\(\\\\)\\\\+\\\\,\\\\-\\\\.\\\\:\\\\=\\\\@\\\\;\\\\$\\\\_\\\\!\\\\*\\\\'\\\\/\\\\?\\\\#]\";\nconst NSS$ = \"(?:(?:\" + PCT_ENCODED$ + \"|\" + TRANS$$ + \")+)\";\nconst URN_SCHEME = new RegExp(\"^urn\\\\:(\" + NID$ + \")$\");\nconst URN_PATH = new RegExp(\"^(\" + NID$ + \")\\\\:(\" + NSS$ + \")$\");\nconst URN_PARSE = /^([^\\:]+)\\:(.*)/;\nconst URN_EXCLUDED = /[\\x00-\\x20\\\\\\\"\\&\\<\\>\\[\\]\\^\\`\\{\\|\\}\\~\\x7F-\\xFF]/g;\n\n//RFC 2141\nconst handler:URISchemeHandler<URNComponents,URNOptions> = {\n\tscheme : \"urn\",\n\n\tparse : function (components:URIComponents, options:URNOptions):URNComponents {\n\t\tconst matches = components.path && components.path.match(URN_PARSE);\n\t\tlet urnComponents = components as URNComponents;\n\n\t\tif (matches) {\n\t\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\t\tconst nid = matches[1].toLowerCase();\n\t\t\tconst nss = matches[2];\n\t\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\t\turnComponents.nid = nid;\n\t\t\turnComponents.nss = nss;\n\t\t\turnComponents.path = undefined;\n\n\t\t\tif (schemeHandler) {\n\t\t\t\turnComponents = schemeHandler.parse(urnComponents, options) as URNComponents;\n\t\t\t}\n\t\t} else {\n\t\t\turnComponents.error = urnComponents.error || \"URN can not be parsed.\";\n\t\t}\n\n\t\treturn urnComponents;\n\t},\n\n\tserialize : function (urnComponents:URNComponents, options:URNOptions):URIComponents {\n\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\tconst nid = urnComponents.nid;\n\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\tif (schemeHandler) {\n\t\t\turnComponents = schemeHandler.serialize(urnComponents, options) as URNComponents;\n\t\t}\n\n\t\tconst uriComponents = urnComponents as URIComponents;\n\t\tconst nss = urnComponents.nss;\n\t\turiComponents.path = `${nid || options.nid}:${nss}`;\n\n\t\treturn uriComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, pctDecChars, unescapeComponent } from \"../uri\";\nimport punycode from \"punycode\";\nimport { merge, subexp, toUpperCase, toArray } from \"../util\";\n\nexport interface MailtoHeaders {\n\t[hfname:string]:string\n}\n\nexport interface MailtoComponents extends URIComponents {\n\tto:Array<string>,\n\theaders?:MailtoHeaders,\n\tsubject?:string,\n\tbody?:string\n}\n\nconst O:MailtoHeaders = {};\nconst isIRI = true;\n\n//RFC 3986\nconst UNRESERVED$$ = \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\" + (isIRI ? \"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\" : \"\") + \"]\";\nconst HEXDIG$$ = \"[0-9A-Fa-f]\";  //case-insensitive\nconst PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$));  //expanded\n\n//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =\n//const ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\#\\\\$\\\\%\\\\&\\\\'\\\\*\\\\+\\\\-\\\\/\\\\=\\\\?\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QTEXT$$ = \"[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F]\";  //(%d1-8 / %d11-12 / %d14-31 / %d127)\n//const QTEXT$$ = merge(\"[\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7E]\", OBS_QTEXT$$);  //%d33 / %d35-91 / %d93-126 / obs-qtext\n//const VCHAR$$ = \"[\\\\x21-\\\\x7E]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QP$ = subexp(\"\\\\\\\\\" + merge(\"[\\\\x00\\\\x0D\\\\x0A]\", OBS_QTEXT$$));  //%d0 / CR / LF / obs-qtext\n//const FWS$ = subexp(subexp(WSP$$ + \"*\" + \"\\\\x0D\\\\x0A\") + \"?\" + WSP$$ + \"+\");\n//const QUOTED_PAIR$ = subexp(subexp(\"\\\\\\\\\" + subexp(VCHAR$$ + \"|\" + WSP$$)) + \"|\" + OBS_QP$);\n//const QUOTED_STRING$ = subexp('\\\\\"' + subexp(FWS$ + \"?\" + QCONTENT$) + \"*\" + FWS$ + \"?\" + '\\\\\"');\nconst ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\nconst QTEXT$$ = \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\";\nconst VCHAR$$ = merge(QTEXT$$, \"[\\\\\\\"\\\\\\\\]\");\nconst DOT_ATOM_TEXT$ = subexp(ATEXT$$ + \"+\" + subexp(\"\\\\.\" + ATEXT$$ + \"+\") + \"*\");\nconst QUOTED_PAIR$ = subexp(\"\\\\\\\\\" + VCHAR$$);\nconst QCONTENT$ = subexp(QTEXT$$ + \"|\" + QUOTED_PAIR$);\nconst QUOTED_STRING$ = subexp('\\\\\"' + QCONTENT$ + \"*\" + '\\\\\"');\n\n//RFC 6068\nconst DTEXT_NO_OBS$$ = \"[\\\\x21-\\\\x5A\\\\x5E-\\\\x7E]\";  //%d33-90 / %d94-126\nconst SOME_DELIMS$$ = \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\";\nconst QCHAR$ = subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$ + \"|\" + SOME_DELIMS$$);\nconst DOMAIN$ = subexp(DOT_ATOM_TEXT$ + \"|\" + \"\\\\[\" + DTEXT_NO_OBS$$ + \"*\" + \"\\\\]\");\nconst LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + \"|\" + QUOTED_STRING$);\nconst ADDR_SPEC$ = subexp(LOCAL_PART$ + \"\\\\@\" + DOMAIN$);\nconst TO$ = subexp(ADDR_SPEC$ + subexp(\"\\\\,\" + ADDR_SPEC$) + \"*\");\nconst HFNAME$ = subexp(QCHAR$ + \"*\");\nconst HFVALUE$ = HFNAME$;\nconst HFIELD$ = subexp(HFNAME$ + \"\\\\=\" + HFVALUE$);\nconst HFIELDS2$ = subexp(HFIELD$ + subexp(\"\\\\&\" + HFIELD$) + \"*\");\nconst HFIELDS$ = subexp(\"\\\\?\" + HFIELDS2$);\nconst MAILTO_URI = new RegExp(\"^mailto\\\\:\" + TO$ + \"?\" + HFIELDS$ + \"?$\");\n\nconst UNRESERVED = new RegExp(UNRESERVED$$, \"g\");\nconst PCT_ENCODED = new RegExp(PCT_ENCODED$, \"g\");\nconst NOT_LOCAL_PART = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", '[\\\\\"]', VCHAR$$), \"g\");\nconst NOT_DOMAIN = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", \"[\\\\[]\", DTEXT_NO_OBS$$, \"[\\\\]]\"), \"g\");\nconst NOT_HFNAME = new RegExp(merge(\"[^]\", UNRESERVED$$, SOME_DELIMS$$), \"g\");\nconst NOT_HFVALUE = NOT_HFNAME;\nconst TO = new RegExp(\"^\" + TO$ + \"$\");\nconst HFIELDS = new RegExp(\"^\" + HFIELDS2$ + \"$\");\n\nfunction decodeUnreserved(str:string):string {\n\tconst decStr = pctDecChars(str);\n\treturn (!decStr.match(UNRESERVED) ? str : decStr);\n}\n\nconst handler:URISchemeHandler<MailtoComponents> =  {\n\tscheme : \"mailto\",\n\n\tparse : function (components:URIComponents, options:URIOptions):MailtoComponents {\n\t\tconst mailtoComponents = components as MailtoComponents;\n\t\tconst to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(\",\") : []);\n\t\tmailtoComponents.path = undefined;\n\n\t\tif (mailtoComponents.query) {\n\t\t\tlet unknownHeaders = false\n\t\t\tconst headers:MailtoHeaders = {};\n\t\t\tconst hfields = mailtoComponents.query.split(\"&\");\n\n\t\t\tfor (let x = 0, xl = hfields.length; x < xl; ++x) {\n\t\t\t\tconst hfield = hfields[x].split(\"=\");\n\n\t\t\t\tswitch (hfield[0]) {\n\t\t\t\t\tcase \"to\":\n\t\t\t\t\t\tconst toAddrs = hfield[1].split(\",\");\n\t\t\t\t\t\tfor (let x = 0, xl = toAddrs.length; x < xl; ++x) {\n\t\t\t\t\t\t\tto.push(toAddrs[x]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"subject\":\n\t\t\t\t\t\tmailtoComponents.subject = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"body\":\n\t\t\t\t\t\tmailtoComponents.body = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tunknownHeaders = true;\n\t\t\t\t\t\theaders[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (unknownHeaders) mailtoComponents.headers = headers;\n\t\t}\n\n\t\tmailtoComponents.query = undefined;\n\n\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\tconst addr = to[x].split(\"@\");\n\n\t\t\taddr[0] = unescapeComponent(addr[0]);\n\n\t\t\tif (!options.unicodeSupport) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\taddr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tmailtoComponents.error = mailtoComponents.error || \"Email address's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddr[1] = unescapeComponent(addr[1], options).toLowerCase();\n\t\t\t}\n\n\t\t\tto[x] = addr.join(\"@\");\n\t\t}\n\n\t\treturn mailtoComponents;\n\t},\n\n\tserialize : function (mailtoComponents:MailtoComponents, options:URIOptions):URIComponents {\n\t\tconst components = mailtoComponents as URIComponents;\n\t\tconst to = toArray(mailtoComponents.to);\n\t\tif (to) {\n\t\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\t\tconst toAddr = String(to[x]);\n\t\t\t\tconst atIdx = toAddr.lastIndexOf(\"@\");\n\t\t\t\tconst localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);\n\t\t\t\tlet domain = toAddr.slice(atIdx + 1);\n\n\t\t\t\t//convert IDN via punycode\n\t\t\t\ttry {\n\t\t\t\t\tdomain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Email address's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t\t}\n\n\t\t\t\tto[x] = localPart + \"@\" + domain;\n\t\t\t}\n\n\t\t\tcomponents.path = to.join(\",\");\n\t\t}\n\n\t\tconst headers = mailtoComponents.headers = mailtoComponents.headers || {};\n\n\t\tif (mailtoComponents.subject) headers[\"subject\"] = mailtoComponents.subject;\n\t\tif (mailtoComponents.body) headers[\"body\"] = mailtoComponents.body;\n\n\t\tconst fields = [];\n\t\tfor (const name in headers) {\n\t\t\tif (headers[name] !== O[name]) {\n\t\t\t\tfields.push(\n\t\t\t\t\tname.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) +\n\t\t\t\t\t\"=\" +\n\t\t\t\t\theaders[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (fields.length) {\n\t\t\tcomponents.query = fields.join(\"&\");\n\t\t}\n\n\t\treturn components;\n\t}\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport ws from \"./ws\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"wss\",\n\tdomainHost : ws.domainHost,\n\tparse : ws.parse,\n\tserialize : ws.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nexport interface WSComponents extends URIComponents {\n\tresourceName?: string;\n\tsecure?: boolean;\n}\n\nfunction isSecure(wsComponents:WSComponents):boolean {\n\treturn typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === \"wss\";\n}\n\n//RFC 6455\nconst handler:URISchemeHandler = {\n\tscheme : \"ws\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):WSComponents {\n\t\tconst wsComponents = components as WSComponents;\n\n\t\t//indicate if the secure flag is set\n\t\twsComponents.secure = isSecure(wsComponents);\n\n\t\t//construct resouce name\n\t\twsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');\n\t\twsComponents.path = undefined;\n\t\twsComponents.query = undefined;\n\n\t\treturn wsComponents;\n\t},\n\n\tserialize : function (wsComponents:WSComponents, options:URIOptions):URIComponents {\n\t\t//normalize the default port\n\t\tif (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === \"\") {\n\t\t\twsComponents.port = undefined;\n\t\t}\n\n\t\t//ensure scheme matches secure flag\n\t\tif (typeof wsComponents.secure === 'boolean') {\n\t\t\twsComponents.scheme = (wsComponents.secure ? 'wss' : 'ws');\n\t\t\twsComponents.secure = undefined;\n\t\t}\n\n\t\t//reconstruct path from resource name\n\t\tif (wsComponents.resourceName) {\n\t\t\tconst [path, query] = wsComponents.resourceName.split('?');\n\t\t\twsComponents.path = (path && path !== '/' ? path : undefined);\n\t\t\twsComponents.query = query;\n\t\t\twsComponents.resourceName = undefined;\n\t\t}\n\n\t\t//forbid fragment component\n\t\twsComponents.fragment = undefined;\n\n\t\treturn wsComponents;\n\t}\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport http from \"./http\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"https\",\n\tdomainHost : http.domainHost,\n\tparse : http.parse,\n\tserialize : http.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"http\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\t//report missing host\n\t\tif (!components.host) {\n\t\t\tcomponents.error = components.error || \"HTTP URIs must have a host.\";\n\t\t}\n\n\t\treturn components;\n\t},\n\n\tserialize : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\tconst secure = String(components.scheme).toLowerCase() === \"https\";\n\n\t\t//normalize the default port\n\t\tif (components.port === (secure ? 443 : 80) || components.port === \"\") {\n\t\t\tcomponents.port = undefined;\n\t\t}\n\t\t\n\t\t//normalize the empty path\n\t\tif (!components.path) {\n\t\t\tcomponents.path = \"/\";\n\t\t}\n\n\t\t//NOTE: We do not parse query strings for HTTP URIs\n\t\t//as WWW Form Url Encoded query strings are part of the HTML4+ spec,\n\t\t//and not the HTTP spec.\n\n\t\treturn components;\n\t}\n};\n\nexport default handler;","/**\n * URI.js\n *\n * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.\n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/uri-js\n */\n\n/**\n * Copyright 2011 Gary Court. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *    1. Redistributions of source code must retain the above copyright notice, this list of\n *       conditions and the following disclaimer.\n *\n *    2. Redistributions in binary form must reproduce the above copyright notice, this list\n *       of conditions and the following disclaimer in the documentation and/or other materials\n *       provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation are those of the\n * authors and should not be interpreted as representing official policies, either expressed\n * or implied, of Gary Court.\n */\n\nimport URI_PROTOCOL from \"./regexps-uri\";\nimport IRI_PROTOCOL from \"./regexps-iri\";\nimport punycode from \"punycode\";\nimport { toUpperCase, typeOf, assign } from \"./util\";\n\nexport interface URIComponents {\n\tscheme?:string;\n\tuserinfo?:string;\n\thost?:string;\n\tport?:number|string;\n\tpath?:string;\n\tquery?:string;\n\tfragment?:string;\n\treference?:string;\n\terror?:string;\n}\n\nexport interface URIOptions {\n\tscheme?:string;\n\treference?:string;\n\ttolerant?:boolean;\n\tabsolutePath?:boolean;\n\tiri?:boolean;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n}\n\nexport interface URISchemeHandler<Components extends URIComponents = URIComponents, Options extends URIOptions = URIOptions, ParentComponents extends URIComponents = URIComponents> {\n\tscheme:string;\n\tparse(components:ParentComponents, options:Options):Components;\n\tserialize(components:Components, options:Options):ParentComponents;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n\tabsolutePath?:boolean;\n}\n\nexport interface URIRegExps {\n\tNOT_SCHEME : RegExp,\n\tNOT_USERINFO : RegExp,\n\tNOT_HOST : RegExp,\n\tNOT_PATH : RegExp,\n\tNOT_PATH_NOSCHEME : RegExp,\n\tNOT_QUERY : RegExp,\n\tNOT_FRAGMENT : RegExp,\n\tESCAPE : RegExp,\n\tUNRESERVED : RegExp,\n\tOTHER_CHARS : RegExp,\n\tPCT_ENCODED : RegExp,\n\tIPV4ADDRESS : RegExp,\n\tIPV6ADDRESS : RegExp,\n}\n\nexport const SCHEMES:{[scheme:string]:URISchemeHandler} = {};\n\nexport function pctEncChar(chr:string):string {\n\tconst c = chr.charCodeAt(0);\n\tlet e:string;\n\n\tif (c < 16) e = \"%0\" + c.toString(16).toUpperCase();\n\telse if (c < 128) e = \"%\" + c.toString(16).toUpperCase();\n\telse if (c < 2048) e = \"%\" + ((c >> 6) | 192).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\telse e = \"%\" + ((c >> 12) | 224).toString(16).toUpperCase() + \"%\" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\n\treturn e;\n}\n\nexport function pctDecChars(str:string):string {\n\tlet newStr = \"\";\n\tlet i = 0;\n\tconst il = str.length;\n\n\twhile (i < il) {\n\t\tconst c = parseInt(str.substr(i + 1, 2), 16);\n\n\t\tif (c < 128) {\n\t\t\tnewStr += String.fromCharCode(c);\n\t\t\ti += 3;\n\t\t}\n\t\telse if (c >= 194 && c < 224) {\n\t\t\tif ((il - i) >= 6) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 6);\n\t\t\t}\n\t\t\ti += 6;\n\t\t}\n\t\telse if (c >= 224) {\n\t\t\tif ((il - i) >= 9) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tconst c3 = parseInt(str.substr(i + 7, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 9);\n\t\t\t}\n\t\t\ti += 9;\n\t\t}\n\t\telse {\n\t\t\tnewStr += str.substr(i, 3);\n\t\t\ti += 3;\n\t\t}\n\t}\n\n\treturn newStr;\n}\n\nfunction _normalizeComponentEncoding(components:URIComponents, protocol:URIRegExps) {\n\tfunction decodeUnreserved(str:string):string {\n\t\tconst decStr = pctDecChars(str);\n\t\treturn (!decStr.match(protocol.UNRESERVED) ? str : decStr);\n\t}\n\n\tif (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, \"\");\n\tif (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\n\treturn components;\n};\n\nfunction _stripLeadingZeros(str:string):string {\n\treturn str.replace(/^0*(.*)/, \"$1\") || \"0\";\n}\n\nfunction _normalizeIPv4(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV4ADDRESS) || [];\n\tconst [, address] = matches;\n\t\n\tif (address) {\n\t\treturn address.split(\".\").map(_stripLeadingZeros).join(\".\");\n\t} else {\n\t\treturn host;\n\t}\n}\n\nfunction _normalizeIPv6(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV6ADDRESS) || [];\n\tconst [, address, zone] = matches;\n\n\tif (address) {\n\t\tconst [last, first] = address.toLowerCase().split('::').reverse();\n\t\tconst firstFields = first ? first.split(\":\").map(_stripLeadingZeros) : [];\n\t\tconst lastFields = last.split(\":\").map(_stripLeadingZeros);\n\t\tconst isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);\n\t\tconst fieldCount = isLastFieldIPv4Address ? 7 : 8;\n\t\tconst lastFieldsStart = lastFields.length - fieldCount;\n\t\tconst fields = Array<string>(fieldCount);\n\n\t\tfor (let x = 0; x < fieldCount; ++x) {\n\t\t\tfields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';\n\t\t}\n\n\t\tif (isLastFieldIPv4Address) {\n\t\t\tfields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);\n\t\t}\n\n\t\tconst allZeroFields = fields.reduce<Array<{index:number,length:number}>>((acc, field, index) => {\n\t\t\tif (!field || field === \"0\") {\n\t\t\t\tconst lastLongest = acc[acc.length - 1];\n\t\t\t\tif (lastLongest && lastLongest.index + lastLongest.length === index) {\n\t\t\t\t\tlastLongest.length++;\n\t\t\t\t} else {\n\t\t\t\t\tacc.push({ index, length : 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, []);\n\n\t\tconst longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0];\n\n\t\tlet newHost:string;\n\t\tif (longestZeroFields && longestZeroFields.length > 1) {\n\t\t\tconst newFirst = fields.slice(0, longestZeroFields.index) ;\n\t\t\tconst newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);\n\t\t\tnewHost = newFirst.join(\":\") + \"::\" + newLast.join(\":\");\n\t\t} else {\n\t\t\tnewHost = fields.join(\":\");\n\t\t}\n\n\t\tif (zone) {\n\t\t\tnewHost += \"%\" + zone;\n\t\t}\n\n\t\treturn newHost;\n\t} else {\n\t\treturn host;\n\t}\n}\n\nconst URI_PARSE = /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?(\\[[^\\/?#\\]]+\\]|[^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n|\\r)*))?/i;\nconst NO_MATCH_IS_UNDEFINED = (<RegExpMatchArray>(\"\").match(/(){0}/))[1] === undefined;\n\nexport function parse(uriString:string, options:URIOptions = {}):URIComponents {\n\tconst components:URIComponents = {};\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\n\tif (options.reference === \"suffix\") uriString = (options.scheme ? options.scheme + \":\" : \"\") + \"//\" + uriString;\n\n\tconst matches = uriString.match(URI_PARSE);\n\n\tif (matches) {\n\t\tif (NO_MATCH_IS_UNDEFINED) {\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1];\n\t\t\tcomponents.userinfo = matches[3];\n\t\t\tcomponents.host = matches[4];\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = matches[7];\n\t\t\tcomponents.fragment = matches[8];\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = matches[5];\n\t\t\t}\n\t\t} else {  //IE FIX for improper RegExp matching\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1] || undefined;\n\t\t\tcomponents.userinfo = (uriString.indexOf(\"@\") !== -1 ? matches[3] : undefined);\n\t\t\tcomponents.host = (uriString.indexOf(\"//\") !== -1 ? matches[4] : undefined);\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = (uriString.indexOf(\"?\") !== -1 ? matches[7] : undefined);\n\t\t\tcomponents.fragment = (uriString.indexOf(\"#\") !== -1 ? matches[8] : undefined);\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = (uriString.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/) ? matches[4] : undefined);\n\t\t\t}\n\t\t}\n\n\t\tif (components.host) {\n\t\t\t//normalize IP hosts\n\t\t\tcomponents.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);\n\t\t}\n\n\t\t//determine reference type\n\t\tif (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {\n\t\t\tcomponents.reference = \"same-document\";\n\t\t} else if (components.scheme === undefined) {\n\t\t\tcomponents.reference = \"relative\";\n\t\t} else if (components.fragment === undefined) {\n\t\t\tcomponents.reference = \"absolute\";\n\t\t} else {\n\t\t\tcomponents.reference = \"uri\";\n\t\t}\n\n\t\t//check for reference errors\n\t\tif (options.reference && options.reference !== \"suffix\" && options.reference !== components.reference) {\n\t\t\tcomponents.error = components.error || \"URI is not a \" + options.reference + \" reference.\";\n\t\t}\n\n\t\t//find scheme handler\n\t\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t\t//check if scheme can't handle IRIs\n\t\tif (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\n\t\t\t//if host component is a domain name\n\t\t\tif (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\tcomponents.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//convert IRI -> URI\n\t\t\t_normalizeComponentEncoding(components, URI_PROTOCOL);\n\t\t} else {\n\t\t\t//normalize encodings\n\t\t\t_normalizeComponentEncoding(components, protocol);\n\t\t}\n\n\t\t//perform scheme specific parsing\n\t\tif (schemeHandler && schemeHandler.parse) {\n\t\t\tschemeHandler.parse(components, options);\n\t\t}\n\t} else {\n\t\tcomponents.error = components.error || \"URI can not be parsed.\";\n\t}\n\n\treturn components;\n};\n\nfunction _recomposeAuthority(components:URIComponents, options:URIOptions):string|undefined {\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array<string> = [];\n\n\tif (components.userinfo !== undefined) {\n\t\turiTokens.push(components.userinfo);\n\t\turiTokens.push(\"@\");\n\t}\n\n\tif (components.host !== undefined) {\n\t\t//normalize IP hosts, add brackets and escape zone separator for IPv6\n\t\turiTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => \"[\" + $1 + ($2 ? \"%25\" + $2 : \"\") + \"]\"));\n\t}\n\n\tif (typeof components.port === \"number\" || typeof components.port === \"string\") {\n\t\turiTokens.push(\":\");\n\t\turiTokens.push(String(components.port));\n\t}\n\n\treturn uriTokens.length ? uriTokens.join(\"\") : undefined;\n};\n\nconst RDS1 = /^\\.\\.?\\//;\nconst RDS2 = /^\\/\\.(\\/|$)/;\nconst RDS3 = /^\\/\\.\\.(\\/|$)/;\nconst RDS4 = /^\\.\\.?$/;\nconst RDS5 = /^\\/?(?:.|\\n)*?(?=\\/|$)/;\n\nexport function removeDotSegments(input:string):string {\n\tconst output:Array<string> = [];\n\n\twhile (input.length) {\n\t\tif (input.match(RDS1)) {\n\t\t\tinput = input.replace(RDS1, \"\");\n\t\t} else if (input.match(RDS2)) {\n\t\t\tinput = input.replace(RDS2, \"/\");\n\t\t} else if (input.match(RDS3)) {\n\t\t\tinput = input.replace(RDS3, \"/\");\n\t\t\toutput.pop();\n\t\t} else if (input === \".\" || input === \"..\") {\n\t\t\tinput = \"\";\n\t\t} else {\n\t\t\tconst im = input.match(RDS5);\n\t\t\tif (im) {\n\t\t\t\tconst s = im[0];\n\t\t\t\tinput = input.slice(s.length);\n\t\t\t\toutput.push(s);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unexpected dot segment condition\");\n\t\t\t}\n\t\t}\n\t}\n\n\treturn output.join(\"\");\n};\n\nexport function serialize(components:URIComponents, options:URIOptions = {}):string {\n\tconst protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array<string> = [];\n\n\t//find scheme handler\n\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t//perform scheme specific serialization\n\tif (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);\n\n\tif (components.host) {\n\t\t//if host component is an IPv6 address\n\t\tif (protocol.IPV6ADDRESS.test(components.host)) {\n\t\t\t//TODO: normalize IPv6 address as per RFC 5952\n\t\t}\n\n\t\t//if host component is a domain name\n\t\telse if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) {\n\t\t\t//convert IDN via punycode\n\t\t\ttry {\n\t\t\t\tcomponents.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host));\n\t\t\t} catch (e) {\n\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t}\n\t\t}\n\t}\n\n\t//normalize encoding\n\t_normalizeComponentEncoding(components, protocol);\n\n\tif (options.reference !== \"suffix\" && components.scheme) {\n\t\turiTokens.push(components.scheme);\n\t\turiTokens.push(\":\");\n\t}\n\n\tconst authority = _recomposeAuthority(components, options);\n\tif (authority !== undefined) {\n\t\tif (options.reference !== \"suffix\") {\n\t\t\turiTokens.push(\"//\");\n\t\t}\n\n\t\turiTokens.push(authority);\n\n\t\tif (components.path && components.path.charAt(0) !== \"/\") {\n\t\t\turiTokens.push(\"/\");\n\t\t}\n\t}\n\n\tif (components.path !== undefined) {\n\t\tlet s = components.path;\n\n\t\tif (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\n\t\t\ts = removeDotSegments(s);\n\t\t}\n\n\t\tif (authority === undefined) {\n\t\t\ts = s.replace(/^\\/\\//, \"/%2F\");  //don't allow the path to start with \"//\"\n\t\t}\n\n\t\turiTokens.push(s);\n\t}\n\n\tif (components.query !== undefined) {\n\t\turiTokens.push(\"?\");\n\t\turiTokens.push(components.query);\n\t}\n\n\tif (components.fragment !== undefined) {\n\t\turiTokens.push(\"#\");\n\t\turiTokens.push(components.fragment);\n\t}\n\n\treturn uriTokens.join(\"\");  //merge tokens into a string\n};\n\nexport function resolveComponents(base:URIComponents, relative:URIComponents, options:URIOptions = {}, skipNormalization?:boolean):URIComponents {\n\tconst target:URIComponents = {};\n\n\tif (!skipNormalization) {\n\t\tbase = parse(serialize(base, options), options);  //normalize base components\n\t\trelative = parse(serialize(relative, options), options);  //normalize relative components\n\t}\n\toptions = options || {};\n\n\tif (!options.tolerant && relative.scheme) {\n\t\ttarget.scheme = relative.scheme;\n\t\t//target.authority = relative.authority;\n\t\ttarget.userinfo = relative.userinfo;\n\t\ttarget.host = relative.host;\n\t\ttarget.port = relative.port;\n\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\ttarget.query = relative.query;\n\t} else {\n\t\tif (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\n\t\t\t//target.authority = relative.authority;\n\t\t\ttarget.userinfo = relative.userinfo;\n\t\t\ttarget.host = relative.host;\n\t\t\ttarget.port = relative.port;\n\t\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\t\ttarget.query = relative.query;\n\t\t} else {\n\t\t\tif (!relative.path) {\n\t\t\t\ttarget.path = base.path;\n\t\t\t\tif (relative.query !== undefined) {\n\t\t\t\t\ttarget.query = relative.query;\n\t\t\t\t} else {\n\t\t\t\t\ttarget.query = base.query;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (relative.path.charAt(0) === \"/\") {\n\t\t\t\t\ttarget.path = removeDotSegments(relative.path);\n\t\t\t\t} else {\n\t\t\t\t\tif ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\n\t\t\t\t\t\ttarget.path = \"/\" + relative.path;\n\t\t\t\t\t} else if (!base.path) {\n\t\t\t\t\t\ttarget.path = relative.path;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.path = base.path.slice(0, base.path.lastIndexOf(\"/\") + 1) + relative.path;\n\t\t\t\t\t}\n\t\t\t\t\ttarget.path = removeDotSegments(target.path);\n\t\t\t\t}\n\t\t\t\ttarget.query = relative.query;\n\t\t\t}\n\t\t\t//target.authority = base.authority;\n\t\t\ttarget.userinfo = base.userinfo;\n\t\t\ttarget.host = base.host;\n\t\t\ttarget.port = base.port;\n\t\t}\n\t\ttarget.scheme = base.scheme;\n\t}\n\n\ttarget.fragment = relative.fragment;\n\n\treturn target;\n};\n\nexport function resolve(baseURI:string, relativeURI:string, options?:URIOptions):string {\n\tconst schemelessOptions = assign({ scheme : 'null' }, options);\n\treturn serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);\n};\n\nexport function normalize(uri:string, options?:URIOptions):string;\nexport function normalize(uri:URIComponents, options?:URIOptions):URIComponents;\nexport function normalize(uri:any, options?:URIOptions):any {\n\tif (typeof uri === \"string\") {\n\t\turi = serialize(parse(uri, options), options);\n\t} else if (typeOf(uri) === \"object\") {\n\t\turi = parse(serialize(<URIComponents>uri, options), options);\n\t}\n\n\treturn uri;\n};\n\nexport function equal(uriA:string, uriB:string, options?: URIOptions):boolean;\nexport function equal(uriA:URIComponents, uriB:URIComponents, options?:URIOptions):boolean;\nexport function equal(uriA:any, uriB:any, options?:URIOptions):boolean {\n\tif (typeof uriA === \"string\") {\n\t\turiA = serialize(parse(uriA, options), options);\n\t} else if (typeOf(uriA) === \"object\") {\n\t\turiA = serialize(<URIComponents>uriA, options);\n\t}\n\n\tif (typeof uriB === \"string\") {\n\t\turiB = serialize(parse(uriB, options), options);\n\t} else if (typeOf(uriB) === \"object\") {\n\t\turiB = serialize(<URIComponents>uriB, options);\n\t}\n\n\treturn uriA === uriB;\n};\n\nexport function escapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar);\n};\n\nexport function unescapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars);\n};\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7E]/; // non-ASCII chars\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, fn) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = fn(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(string, fn) {\n\tconst parts = string.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tstring = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tstring = string.replace(regexSeparators, '\\x2E');\n\tconst labels = string.split('.');\n\tconst encoded = map(labels, fn).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = array => String.fromCodePoint(...array);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint - 0x30 < 0x0A) {\n\t\treturn codePoint - 0x16;\n\t}\n\tif (codePoint - 0x41 < 0x1A) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint - 0x61 < 0x1A) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t//  0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tlet oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tlet inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tlet basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue == n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.1.0',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport default punycode;\n","import { URIRegExps } from \"./uri\";\nimport { buildExps } from \"./regexps-uri\";\n\nexport default buildExps(true);\n","import { URIRegExps } from \"./uri\";\nimport { merge, subexp } from \"./util\";\n\nexport function buildExps(isIRI:boolean):URIRegExps {\n\tconst\n\t\tALPHA$$ = \"[A-Za-z]\",\n\t\tCR$ = \"[\\\\x0D]\",\n\t\tDIGIT$$ = \"[0-9]\",\n\t\tDQUOTE$$ = \"[\\\\x22]\",\n\t\tHEXDIG$$ = merge(DIGIT$$, \"[A-Fa-f]\"),  //case-insensitive\n\t\tLF$$ = \"[\\\\x0A]\",\n\t\tSP$$ = \"[\\\\x20]\",\n\t\tPCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)),  //expanded\n\t\tGEN_DELIMS$$ = \"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\",\n\t\tSUB_DELIMS$$ = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",\n\t\tRESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),\n\t\tUCSCHAR$$ = isIRI ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\" : \"[]\",  //subset, excludes bidi control characters\n\t\tIPRIVATE$$ = isIRI ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\",  //subset\n\t\tUNRESERVED$$ = merge(ALPHA$$, DIGIT$$, \"[\\\\-\\\\.\\\\_\\\\~]\", UCSCHAR$$),\n\t\tSCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\") + \"*\"),\n\t\tUSERINFO$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\")) + \"*\"),\n\t\tDEC_OCTET$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"[1-9]\" + DIGIT$$) + \"|\" + DIGIT$$),\n\t\tDEC_OCTET_RELAXED$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"0?[1-9]\" + DIGIT$$) + \"|0?0?\" + DIGIT$$),  //relaxed parsing rules\n\t\tIPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$),\n\t\tH16$ = subexp(HEXDIG$$ + \"{1,4}\"),\n\t\tLS32$ = subexp(subexp(H16$ + \"\\\\:\" + H16$) + \"|\" + IPV4ADDRESS$),\n\t\tIPV6ADDRESS1$ = subexp(                                                            subexp(H16$ + \"\\\\:\") + \"{6}\" + LS32$), //                           6( h16 \":\" ) ls32\n\t\tIPV6ADDRESS2$ = subexp(                                                 \"\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{5}\" + LS32$), //                      \"::\" 5( h16 \":\" ) ls32\n\t\tIPV6ADDRESS3$ = subexp(subexp(                                 H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{4}\" + LS32$), //[               h16 ] \"::\" 4( h16 \":\" ) ls32\n\t\tIPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,1}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{3}\" + LS32$), //[ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32\n\t\tIPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,2}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{2}\" + LS32$), //[ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32\n\t\tIPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,3}\" + H16$) + \"?\\\\:\\\\:\" +        H16$ + \"\\\\:\"          + LS32$), //[ *3( h16 \":\" ) h16 ] \"::\"    h16 \":\"   ls32\n\t\tIPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,4}\" + H16$) + \"?\\\\:\\\\:\"                                + LS32$), //[ *4( h16 \":\" ) h16 ] \"::\"              ls32\n\t\tIPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,5}\" + H16$) + \"?\\\\:\\\\:\"                                + H16$ ), //[ *5( h16 \":\" ) h16 ] \"::\"              h16\n\t\tIPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,6}\" + H16$) + \"?\\\\:\\\\:\"                                       ), //[ *6( h16 \":\" ) h16 ] \"::\"\n\t\tIPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join(\"|\")),\n\t\tZONEID$ = subexp(subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$) + \"+\"),  //RFC 6874\n\t\tIPV6ADDRZ$ = subexp(IPV6ADDRESS$ + \"\\\\%25\" + ZONEID$),  //RFC 6874\n\t\tIPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + ZONEID$),  //RFC 6874, with relaxed parsing rules\n\t\tIPVFUTURE$ = subexp(\"[vV]\" + HEXDIG$$ + \"+\\\\.\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"),\n\t\tIP_LITERAL$ = subexp(\"\\\\[\" + subexp(IPV6ADDRZ_RELAXED$ + \"|\" + IPV6ADDRESS$ + \"|\" + IPVFUTURE$) + \"\\\\]\"),  //RFC 6874\n\t\tREG_NAME$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$)) + \"*\"),\n\t\tHOST$ = subexp(IP_LITERAL$ + \"|\" + IPV4ADDRESS$ + \"(?!\" + REG_NAME$ + \")\" + \"|\" + REG_NAME$),\n\t\tPORT$ = subexp(DIGIT$$ + \"*\"),\n\t\tAUTHORITY$ = subexp(subexp(USERINFO$ + \"@\") + \"?\" + HOST$ + subexp(\"\\\\:\" + PORT$) + \"?\"),\n\t\tPCHAR$ = subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@]\")),\n\t\tSEGMENT$ = subexp(PCHAR$ + \"*\"),\n\t\tSEGMENT_NZ$ = subexp(PCHAR$ + \"+\"),\n\t\tSEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\@]\")) + \"+\"),\n\t\tPATH_ABEMPTY$ = subexp(subexp(\"\\\\/\" + SEGMENT$) + \"*\"),\n\t\tPATH_ABSOLUTE$ = subexp(\"\\\\/\" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + \"?\"),  //simplified\n\t\tPATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$),  //simplified\n\t\tPATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$),  //simplified\n\t\tPATH_EMPTY$ = \"(?!\" + PCHAR$ + \")\",\n\t\tPATH$ = subexp(PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tQUERY$ = subexp(subexp(PCHAR$ + \"|\" + merge(\"[\\\\/\\\\?]\", IPRIVATE$$)) + \"*\"),\n\t\tFRAGMENT$ = subexp(subexp(PCHAR$ + \"|[\\\\/\\\\?]\") + \"*\"),\n\t\tHIER_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tURI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tRELATIVE_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$),\n\t\tRELATIVE$ = subexp(RELATIVE_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tURI_REFERENCE$ = subexp(URI$ + \"|\" + RELATIVE$),\n\t\tABSOLUTE_URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\"),\n\n\t\tGENERIC_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tRELATIVE_REF$ = \"^(){0}\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tABSOLUTE_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?$\",\n\t\tSAMEDOC_REF$ = \"^\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tAUTHORITY_REF$ = \"^\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?$\"\n\t;\n\n\treturn {\n\t\tNOT_SCHEME : new RegExp(merge(\"[^]\", ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\"), \"g\"),\n\t\tNOT_USERINFO : new RegExp(merge(\"[^\\\\%\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_HOST : new RegExp(merge(\"[^\\\\%\\\\[\\\\]\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH : new RegExp(merge(\"[^\\\\%\\\\/\\\\:\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH_NOSCHEME : new RegExp(merge(\"[^\\\\%\\\\/\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_QUERY : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\", IPRIVATE$$), \"g\"),\n\t\tNOT_FRAGMENT : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\"), \"g\"),\n\t\tESCAPE : new RegExp(merge(\"[^]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tUNRESERVED : new RegExp(UNRESERVED$$, \"g\"),\n\t\tOTHER_CHARS : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, RESERVED$$), \"g\"),\n\t\tPCT_ENCODED : new RegExp(PCT_ENCODED$, \"g\"),\n\t\tIPV4ADDRESS : new RegExp(\"^(\" + IPV4ADDRESS$ + \")$\"),\n\t\tIPV6ADDRESS : new RegExp(\"^\\\\[?(\" + IPV6ADDRESS$ + \")\" + subexp(subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + \"(\" + ZONEID$ + \")\") + \"?\\\\]?$\")  //RFC 6874, with relaxed parsing rules\n\t};\n}\n\nexport default buildExps(false);\n","export function merge(...sets:Array<string>):string {\n\tif (sets.length > 1) {\n\t\tsets[0] = sets[0].slice(0, -1);\n\t\tconst xl = sets.length - 1;\n\t\tfor (let x = 1; x < xl; ++x) {\n\t\t\tsets[x] = sets[x].slice(1, -1);\n\t\t}\n\t\tsets[xl] = sets[xl].slice(1);\n\t\treturn sets.join('');\n\t} else {\n\t\treturn sets[0];\n\t}\n}\n\nexport function subexp(str:string):string {\n\treturn \"(?:\" + str + \")\";\n}\n\nexport function typeOf(o:any):string {\n\treturn o === undefined ? \"undefined\" : (o === null ? \"null\" : Object.prototype.toString.call(o).split(\" \").pop().split(\"]\").shift().toLowerCase());\n}\n\nexport function toUpperCase(str:string):string {\n\treturn str.toUpperCase();\n}\n\nexport function toArray(obj:any):Array<any> {\n\treturn obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== \"number\" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : [];\n}\n\n\nexport function assign(target: object, source: any): any {\n\tconst obj = target as any;\n\tif (source) {\n\t\tfor (const key in source) {\n\t\t\tobj[key] = source[key];\n\t\t}\n\t}\n\treturn obj;\n}"],"names":["SCHEMES","uuid","scheme","urn","mailto","wss","ws","https","http","urnComponents","nss","uuidComponents","toLowerCase","options","error","tolerant","match","UUID","undefined","handler","uriComponents","path","nid","schemeHandler","serialize","urnScheme","parse","matches","components","URN_PARSE","query","fields","join","length","push","name","replace","PCT_ENCODED","decodeUnreserved","toUpperCase","NOT_HFNAME","pctEncChar","headers","NOT_HFVALUE","O","mailtoComponents","body","subject","to","x","localPart","domain","iri","e","punycode","toASCII","unescapeComponent","toUnicode","toAddr","slice","atIdx","NOT_LOCAL_PART","lastIndexOf","String","xl","toArray","addr","unicodeSupport","split","unknownHeaders","hfield","toAddrs","hfields","decStr","UNRESERVED","str","pctDecChars","RegExp","merge","UNRESERVED$$","SOME_DELIMS$$","ATEXT$$","VCHAR$$","PCT_ENCODED$","QTEXT$$","subexp","HEXDIG$$","isIRI","domainHost","wsComponents","fragment","resourceName","secure","port","isSecure","host","toString","URI_PROTOCOL","IRI_PROTOCOL","ESCAPE","escapeComponent","uriA","uriB","typeOf","equal","uri","normalize","resolveComponents","baseURI","schemelessOptions","relativeURI","assign","resolve","target","relative","base","userinfo","removeDotSegments","charAt","skipNormalization","uriTokens","s","authority","absolutePath","reference","_recomposeAuthority","protocol","IPV6ADDRESS","test","output","Error","input","im","RDS5","pop","RDS3","RDS2","RDS1","$1","$2","_normalizeIPv6","_normalizeIPv4","_","uriString","isNaN","indexOf","parseInt","NO_MATCH_IS_UNDEFINED","URI_PARSE","newHost","zone","newFirst","newLast","longestZeroFields","index","b","a","allZeroFields","sort","acc","lastLongest","field","reduce","fieldCount","isLastFieldIPv4Address","firstFields","lastFields","lastFieldsStart","Array","IPV4ADDRESS","last","map","_stripLeadingZeros","first","address","reverse","NOT_FRAGMENT","NOT_QUERY","NOT_PATH","NOT_PATH_NOSCHEME","NOT_HOST","NOT_USERINFO","NOT_SCHEME","_normalizeComponentEncoding","newStr","substr","i","fromCharCode","c","c2","c3","il","chr","charCodeAt","encode","decode","ucs2encode","ucs2decode","regexNonASCII","string","mapDomain","regexPunycode","n","delta","handledCPCount","adapt","handledCPCountPlusOne","basicLength","stringFromCharCode","digitToBasic","q","floor","qMinusT","baseMinusT","t","k","bias","tMin","tMax","currentValue","maxInt","m","inputLength","delimiter","initialBias","initialN","fromCodePoint","splice","out","oldi","w","digit","basicToDigit","basic","j","baseMinusTMin","skew","numPoints","firstTime","damp","flag","codePoint","array","value","extra","counter","result","encoded","labels","fn","regexSeparators","parts","RangeError","errors","type","Math","buildExps","IPV6ADDRESS$","ZONEID$","IPV4ADDRESS$","RESERVED$$","SUB_DELIMS$$","IPRIVATE$$","ALPHA$$","DIGIT$$","AUTHORITY_REF$","USERINFO$","HOST$","PORT$","SAMEDOC_REF$","FRAGMENT$","ABSOLUTE_REF$","SCHEME$","PATH_ABEMPTY$","PATH_ABSOLUTE$","PATH_ROOTLESS$","PATH_EMPTY$","QUERY$","RELATIVE_REF$","PATH_NOSCHEME$","GENERIC_REF$","ABSOLUTE_URI$","HIER_PART$","URI_REFERENCE$","URI$","RELATIVE$","RELATIVE_PART$","AUTHORITY$","PCHAR$","PATH$","SEGMENT_NZ$","SEGMENT_NZ_NC$","SEGMENT$","IP_LITERAL$","REG_NAME$","IPV6ADDRZ_RELAXED$","IPVFUTURE$","IPV6ADDRESS1$","IPV6ADDRESS2$","IPV6ADDRESS3$","IPV6ADDRESS4$","IPV6ADDRESS5$","IPV6ADDRESS6$","IPV6ADDRESS7$","IPV6ADDRESS8$","IPV6ADDRESS9$","H16$","LS32$","DEC_OCTET_RELAXED$","DEC_OCTET$","UCSCHAR$$","GEN_DELIMS$$","SP$$","DQUOTE$$","CR$","obj","key","source","setInterval","call","prototype","o","Object","shift","sets"],"mappings":"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"}/** @license URI.js v4.4.0 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r(e.URI=e.URI||{})}(this,function(e){"use strict";function r(){for(var e=arguments.length,r=Array(e),n=0;n<e;n++)r[n]=arguments[n];if(r.length>1){r[0]=r[0].slice(0,-1);for(var t=r.length-1,o=1;o<t;++o)r[o]=r[o].slice(1,-1);return r[t]=r[t].slice(1),r.join("")}return r[0]}function n(e){return"(?:"+e+")"}function t(e){return e===undefined?"undefined":null===e?"null":Object.prototype.toString.call(e).split(" ").pop().split("]").shift().toLowerCase()}function o(e){return e.toUpperCase()}function a(e){return e!==undefined&&null!==e?e instanceof Array?e:"number"!=typeof e.length||e.split||e.setInterval||e.call?[e]:Array.prototype.slice.call(e):[]}function i(e,r){var n=e;if(r)for(var t in r)n[t]=r[t];return n}function u(e){var t=r("[0-9]","[A-Fa-f]"),o=n(n("%[EFef]"+t+"%"+t+t+"%"+t+t)+"|"+n("%[89A-Fa-f]"+t+"%"+t+t)+"|"+n("%"+t+t)),a="[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]",i=r("[\\:\\/\\?\\#\\[\\]\\@]",a),u=e?"[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]":"[]",s=e?"[\\uE000-\\uF8FF]":"[]",f=r("[A-Za-z]","[0-9]","[\\-\\.\\_\\~]",u),c=n(n("25[0-5]")+"|"+n("2[0-4][0-9]")+"|"+n("1[0-9][0-9]")+"|"+n("0?[1-9][0-9]")+"|0?0?[0-9]"),p=n(c+"\\."+c+"\\."+c+"\\."+c),h=n(t+"{1,4}"),d=n(n(h+"\\:"+h)+"|"+p),l=n(n(h+"\\:")+"{6}"+d),m=n("\\:\\:"+n(h+"\\:")+"{5}"+d),g=n(n(h)+"?\\:\\:"+n(h+"\\:")+"{4}"+d),v=n(n(n(h+"\\:")+"{0,1}"+h)+"?\\:\\:"+n(h+"\\:")+"{3}"+d),E=n(n(n(h+"\\:")+"{0,2}"+h)+"?\\:\\:"+n(h+"\\:")+"{2}"+d),C=n(n(n(h+"\\:")+"{0,3}"+h)+"?\\:\\:"+h+"\\:"+d),y=n(n(n(h+"\\:")+"{0,4}"+h)+"?\\:\\:"+d),S=n(n(n(h+"\\:")+"{0,5}"+h)+"?\\:\\:"+h),A=n(n(n(h+"\\:")+"{0,6}"+h)+"?\\:\\:"),D=n([l,m,g,v,E,C,y,S,A].join("|")),w=n(n(f+"|"+o)+"+");return{NOT_SCHEME:new RegExp(r("[^]","[A-Za-z]","[0-9]","[\\+\\-\\.]"),"g"),NOT_USERINFO:new RegExp(r("[^\\%\\:]",f,a),"g"),NOT_HOST:new RegExp(r("[^\\%\\[\\]\\:]",f,a),"g"),NOT_PATH:new RegExp(r("[^\\%\\/\\:\\@]",f,a),"g"),NOT_PATH_NOSCHEME:new RegExp(r("[^\\%\\/\\@]",f,a),"g"),NOT_QUERY:new RegExp(r("[^\\%]",f,a,"[\\:\\@\\/\\?]",s),"g"),NOT_FRAGMENT:new RegExp(r("[^\\%]",f,a,"[\\:\\@\\/\\?]"),"g"),ESCAPE:new RegExp(r("[^]",f,a),"g"),UNRESERVED:new RegExp(f,"g"),OTHER_CHARS:new RegExp(r("[^\\%]",f,i),"g"),PCT_ENCODED:new RegExp(o,"g"),IPV4ADDRESS:new RegExp("^("+p+")$"),IPV6ADDRESS:new RegExp("^\\[?("+D+")"+n(n("\\%25|\\%(?!"+t+"{2})")+"("+w+")")+"?\\]?$")}}function s(e){throw new RangeError(H[e])}function f(e,r){for(var n=[],t=e.length;t--;)n[t]=r(e[t]);return n}function c(e,r){var n=e.split("@"),t="";return n.length>1&&(t=n[0]+"@",e=n[1]),e=e.replace(j,"."),t+f(e.split("."),r).join(".")}function p(e){for(var r=[],n=0,t=e.length;n<t;){var o=e.charCodeAt(n++);if(o>=55296&&o<=56319&&n<t){var a=e.charCodeAt(n++);56320==(64512&a)?r.push(((1023&o)<<10)+(1023&a)+65536):(r.push(o),n--)}else r.push(o)}return r}function h(e){var r=e.charCodeAt(0);return r<16?"%0"+r.toString(16).toUpperCase():r<128?"%"+r.toString(16).toUpperCase():r<2048?"%"+(r>>6|192).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase():"%"+(r>>12|224).toString(16).toUpperCase()+"%"+(r>>6&63|128).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase()}function d(e){for(var r="",n=0,t=e.length;n<t;){var o=parseInt(e.substr(n+1,2),16);if(o<128)r+=String.fromCharCode(o),n+=3;else if(o>=194&&o<224){if(t-n>=6){var a=parseInt(e.substr(n+4,2),16);r+=String.fromCharCode((31&o)<<6|63&a)}else r+=e.substr(n,6);n+=6}else if(o>=224){if(t-n>=9){var i=parseInt(e.substr(n+4,2),16),u=parseInt(e.substr(n+7,2),16);r+=String.fromCharCode((15&o)<<12|(63&i)<<6|63&u)}else r+=e.substr(n,9);n+=9}else r+=e.substr(n,3),n+=3}return r}function l(e,r){function n(e){var n=d(e);return n.match(r.UNRESERVED)?n:e}return e.scheme&&(e.scheme=String(e.scheme).replace(r.PCT_ENCODED,n).toLowerCase().replace(r.NOT_SCHEME,"")),e.userinfo!==undefined&&(e.userinfo=String(e.userinfo).replace(r.PCT_ENCODED,n).replace(r.NOT_USERINFO,h).replace(r.PCT_ENCODED,o)),e.host!==undefined&&(e.host=String(e.host).replace(r.PCT_ENCODED,n).toLowerCase().replace(r.NOT_HOST,h).replace(r.PCT_ENCODED,o)),e.path!==undefined&&(e.path=String(e.path).replace(r.PCT_ENCODED,n).replace(e.scheme?r.NOT_PATH:r.NOT_PATH_NOSCHEME,h).replace(r.PCT_ENCODED,o)),e.query!==undefined&&(e.query=String(e.query).replace(r.PCT_ENCODED,n).replace(r.NOT_QUERY,h).replace(r.PCT_ENCODED,o)),e.fragment!==undefined&&(e.fragment=String(e.fragment).replace(r.PCT_ENCODED,n).replace(r.NOT_FRAGMENT,h).replace(r.PCT_ENCODED,o)),e}function m(e){return e.replace(/^0*(.*)/,"$1")||"0"}function g(e,r){var n=e.match(r.IPV4ADDRESS)||[],t=T(n,2),o=t[1];return o?o.split(".").map(m).join("."):e}function v(e,r){var n=e.match(r.IPV6ADDRESS)||[],t=T(n,3),o=t[1],a=t[2];if(o){for(var i=o.toLowerCase().split("::").reverse(),u=T(i,2),s=u[0],f=u[1],c=f?f.split(":").map(m):[],p=s.split(":").map(m),h=r.IPV4ADDRESS.test(p[p.length-1]),d=h?7:8,l=p.length-d,v=Array(d),E=0;E<d;++E)v[E]=c[E]||p[l+E]||"";h&&(v[d-1]=g(v[d-1],r));var C=v.reduce(function(e,r,n){if(!r||"0"===r){var t=e[e.length-1];t&&t.index+t.length===n?t.length++:e.push({index:n,length:1})}return e},[]),y=C.sort(function(e,r){return r.length-e.length})[0],S=void 0;if(y&&y.length>1){var A=v.slice(0,y.index),D=v.slice(y.index+y.length);S=A.join(":")+"::"+D.join(":")}else S=v.join(":");return a&&(S+="%"+a),S}return e}function E(e){var r=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},n={},t=!1!==r.iri?R:F;"suffix"===r.reference&&(e=(r.scheme?r.scheme+":":"")+"//"+e);var o=e.match(K);if(o){W?(n.scheme=o[1],n.userinfo=o[3],n.host=o[4],n.port=parseInt(o[5],10),n.path=o[6]||"",n.query=o[7],n.fragment=o[8],isNaN(n.port)&&(n.port=o[5])):(n.scheme=o[1]||undefined,n.userinfo=-1!==e.indexOf("@")?o[3]:undefined,n.host=-1!==e.indexOf("//")?o[4]:undefined,n.port=parseInt(o[5],10),n.path=o[6]||"",n.query=-1!==e.indexOf("?")?o[7]:undefined,n.fragment=-1!==e.indexOf("#")?o[8]:undefined,isNaN(n.port)&&(n.port=e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?o[4]:undefined)),n.host&&(n.host=v(g(n.host,t),t)),n.scheme!==undefined||n.userinfo!==undefined||n.host!==undefined||n.port!==undefined||n.path||n.query!==undefined?n.scheme===undefined?n.reference="relative":n.fragment===undefined?n.reference="absolute":n.reference="uri":n.reference="same-document",r.reference&&"suffix"!==r.reference&&r.reference!==n.reference&&(n.error=n.error||"URI is not a "+r.reference+" reference.");var a=J[(r.scheme||n.scheme||"").toLowerCase()];if(r.unicodeSupport||a&&a.unicodeSupport)l(n,t);else{if(n.host&&(r.domainHost||a&&a.domainHost))try{n.host=B.toASCII(n.host.replace(t.PCT_ENCODED,d).toLowerCase())}catch(i){n.error=n.error||"Host's domain name can not be converted to ASCII via punycode: "+i}l(n,F)}a&&a.parse&&a.parse(n,r)}else n.error=n.error||"URI can not be parsed.";return n}function C(e,r){var n=!1!==r.iri?R:F,t=[];return e.userinfo!==undefined&&(t.push(e.userinfo),t.push("@")),e.host!==undefined&&t.push(v(g(String(e.host),n),n).replace(n.IPV6ADDRESS,function(e,r,n){return"["+r+(n?"%25"+n:"")+"]"})),"number"!=typeof e.port&&"string"!=typeof e.port||(t.push(":"),t.push(String(e.port))),t.length?t.join(""):undefined}function y(e){for(var r=[];e.length;)if(e.match(X))e=e.replace(X,"");else if(e.match(ee))e=e.replace(ee,"/");else if(e.match(re))e=e.replace(re,"/"),r.pop();else if("."===e||".."===e)e="";else{var n=e.match(ne);if(!n)throw new Error("Unexpected dot segment condition");var t=n[0];e=e.slice(t.length),r.push(t)}return r.join("")}function S(e){var r=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},n=r.iri?R:F,t=[],o=J[(r.scheme||e.scheme||"").toLowerCase()];if(o&&o.serialize&&o.serialize(e,r),e.host)if(n.IPV6ADDRESS.test(e.host));else if(r.domainHost||o&&o.domainHost)try{e.host=r.iri?B.toUnicode(e.host):B.toASCII(e.host.replace(n.PCT_ENCODED,d).toLowerCase())}catch(u){e.error=e.error||"Host's domain name can not be converted to "+(r.iri?"Unicode":"ASCII")+" via punycode: "+u}l(e,n),"suffix"!==r.reference&&e.scheme&&(t.push(e.scheme),t.push(":"));var a=C(e,r);if(a!==undefined&&("suffix"!==r.reference&&t.push("//"),t.push(a),e.path&&"/"!==e.path.charAt(0)&&t.push("/")),e.path!==undefined){var i=e.path;r.absolutePath||o&&o.absolutePath||(i=y(i)),a===undefined&&(i=i.replace(/^\/\//,"/%2F")),t.push(i)}return e.query!==undefined&&(t.push("?"),t.push(e.query)),e.fragment!==undefined&&(t.push("#"),t.push(e.fragment)),t.join("")}function A(e,r){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{},t=arguments[3],o={};return t||(e=E(S(e,n),n),r=E(S(r,n),n)),n=n||{},!n.tolerant&&r.scheme?(o.scheme=r.scheme,o.userinfo=r.userinfo,o.host=r.host,o.port=r.port,o.path=y(r.path||""),o.query=r.query):(r.userinfo!==undefined||r.host!==undefined||r.port!==undefined?(o.userinfo=r.userinfo,o.host=r.host,o.port=r.port,o.path=y(r.path||""),o.query=r.query):(r.path?("/"===r.path.charAt(0)?o.path=y(r.path):(e.userinfo===undefined&&e.host===undefined&&e.port===undefined||e.path?e.path?o.path=e.path.slice(0,e.path.lastIndexOf("/")+1)+r.path:o.path=r.path:o.path="/"+r.path,o.path=y(o.path)),o.query=r.query):(o.path=e.path,r.query!==undefined?o.query=r.query:o.query=e.query),o.userinfo=e.userinfo,o.host=e.host,o.port=e.port),o.scheme=e.scheme),o.fragment=r.fragment,o}function D(e,r,n){var t=i({scheme:"null"},n);return S(A(E(e,t),E(r,t),t,!0),t)}function w(e,r){return"string"==typeof e?e=S(E(e,r),r):"object"===t(e)&&(e=E(S(e,r),r)),e}function b(e,r,n){return"string"==typeof e?e=S(E(e,n),n):"object"===t(e)&&(e=S(e,n)),"string"==typeof r?r=S(E(r,n),n):"object"===t(r)&&(r=S(r,n)),e===r}function x(e,r){return e&&e.toString().replace(r&&r.iri?R.ESCAPE:F.ESCAPE,h)}function O(e,r){return e&&e.toString().replace(r&&r.iri?R.PCT_ENCODED:F.PCT_ENCODED,d)}function N(e){return"boolean"==typeof e.secure?e.secure:"wss"===String(e.scheme).toLowerCase()}function I(e){var r=d(e);return r.match(he)?r:e}var F=u(!1),R=u(!0),T=function(){function e(e,r){var n=[],t=!0,o=!1,a=undefined;try{for(var i,u=e[Symbol.iterator]();!(t=(i=u.next()).done)&&(n.push(i.value),!r||n.length!==r);t=!0);}catch(s){o=!0,a=s}finally{try{!t&&u["return"]&&u["return"]()}finally{if(o)throw a}}return n}return function(r,n){if(Array.isArray(r))return r;if(Symbol.iterator in Object(r))return e(r,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_=function(e){if(Array.isArray(e)){for(var r=0,n=Array(e.length);r<e.length;r++)n[r]=e[r];return n}return Array.from(e)},P=2147483647,q=/^xn--/,U=/[^\0-\x7E]/,j=/[\x2E\u3002\uFF0E\uFF61]/g,H={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},z=Math.floor,L=String.fromCharCode,$=function(e){return String.fromCodePoint.apply(String,_(e))},M=function(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:36},V=function(e,r){return e+22+75*(e<26)-((0!=r)<<5)},k=function(e,r,n){var t=0;for(e=n?z(e/700):e>>1,e+=z(e/r);e>455;t+=36)e=z(e/35);return z(t+36*e/(e+38))},Z=function(e){var r=[],n=e.length,t=0,o=128,a=72,i=e.lastIndexOf("-");i<0&&(i=0);for(var u=0;u<i;++u)e.charCodeAt(u)>=128&&s("not-basic"),r.push(e.charCodeAt(u));for(var f=i>0?i+1:0;f<n;){for(var c=t,p=1,h=36;;h+=36){f>=n&&s("invalid-input");var d=M(e.charCodeAt(f++));(d>=36||d>z((P-t)/p))&&s("overflow"),t+=d*p;var l=h<=a?1:h>=a+26?26:h-a;if(d<l)break;var m=36-l;p>z(P/m)&&s("overflow"),p*=m}var g=r.length+1;a=k(t-c,g,0==c),z(t/g)>P-o&&s("overflow"),o+=z(t/g),t%=g,r.splice(t++,0,o)}return String.fromCodePoint.apply(String,r)},G=function(e){var r=[];e=p(e);var n=e.length,t=128,o=0,a=72,i=!0,u=!1,f=undefined;try{for(var c,h=e[Symbol.iterator]();!(i=(c=h.next()).done);i=!0){var d=c.value;d<128&&r.push(L(d))}}catch(U){u=!0,f=U}finally{try{!i&&h["return"]&&h["return"]()}finally{if(u)throw f}}var l=r.length,m=l;for(l&&r.push("-");m<n;){var g=P,v=!0,E=!1,C=undefined;try{for(var y,S=e[Symbol.iterator]();!(v=(y=S.next()).done);v=!0){var A=y.value;A>=t&&A<g&&(g=A)}}catch(U){E=!0,C=U}finally{try{!v&&S["return"]&&S["return"]()}finally{if(E)throw C}}var D=m+1;g-t>z((P-o)/D)&&s("overflow"),o+=(g-t)*D,t=g;var w=!0,b=!1,x=undefined;try{for(var O,N=e[Symbol.iterator]();!(w=(O=N.next()).done);w=!0){var I=O.value;if(I<t&&++o>P&&s("overflow"),I==t){for(var F=o,R=36;;R+=36){var T=R<=a?1:R>=a+26?26:R-a;if(F<T)break;var _=F-T,q=36-T;r.push(L(V(T+_%q,0))),F=z(_/q)}r.push(L(V(F,0))),a=k(o,D,m==l),o=0,++m}}}catch(U){b=!0,x=U}finally{try{!w&&N["return"]&&N["return"]()}finally{if(b)throw x}}++o,++t}return r.join("")},Q=function(e){return c(e,function(e){return q.test(e)?Z(e.slice(4).toLowerCase()):e})},Y=function(e){return c(e,function(e){return U.test(e)?"xn--"+G(e):e})},B={version:"2.1.0",ucs2:{decode:p,encode:$},decode:Z,encode:G,toASCII:Y,toUnicode:Q},J={},K=/^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i,W="".match(/(){0}/)[1]===undefined,X=/^\.\.?\//,ee=/^\/\.(\/|$)/,re=/^\/\.\.(\/|$)/,ne=/^\/?(?:.|\n)*?(?=\/|$)/,te={scheme:"http",domainHost:!0,parse:function(e,r){return e.host||(e.error=e.error||"HTTP URIs must have a host."),e},serialize:function(e,r){var n="https"===String(e.scheme).toLowerCase();return e.port!==(n?443:80)&&""!==e.port||(e.port=undefined),e.path||(e.path="/"),e}},oe={scheme:"https",domainHost:te.domainHost,parse:te.parse,serialize:te.serialize},ae={scheme:"ws",domainHost:!0,parse:function(e,r){var n=e;return n.secure=N(n),n.resourceName=(n.path||"/")+(n.query?"?"+n.query:""),n.path=undefined,n.query=undefined,n},serialize:function(e,r){if(e.port!==(N(e)?443:80)&&""!==e.port||(e.port=undefined),"boolean"==typeof e.secure&&(e.scheme=e.secure?"wss":"ws",e.secure=undefined),e.resourceName){var n=e.resourceName.split("?"),t=T(n,2),o=t[0],a=t[1];e.path=o&&"/"!==o?o:undefined,e.query=a,e.resourceName=undefined}return e.fragment=undefined,e}},ie={scheme:"wss",domainHost:ae.domainHost,parse:ae.parse,serialize:ae.serialize},ue={},se="[A-Za-z0-9\\-\\.\\_\\~\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]",fe="[0-9A-Fa-f]",ce=n(n("%[EFef][0-9A-Fa-f]%"+fe+fe+"%"+fe+fe)+"|"+n("%[89A-Fa-f][0-9A-Fa-f]%"+fe+fe)+"|"+n("%"+fe+fe)),pe=r("[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]",'[\\"\\\\]'),he=new RegExp(se,"g"),de=new RegExp(ce,"g"),le=new RegExp(r("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',pe),"g"),me=new RegExp(r("[^]",se,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),ge=me,ve={scheme:"mailto",parse:function(e,r){var n=e,t=n.to=n.path?n.path.split(","):[];if(n.path=undefined,n.query){for(var o=!1,a={},i=n.query.split("&"),u=0,s=i.length;u<s;++u){var f=i[u].split("=");switch(f[0]){case"to":for(var c=f[1].split(","),p=0,h=c.length;p<h;++p)t.push(c[p]);break;case"subject":n.subject=O(f[1],r);break;case"body":n.body=O(f[1],r);break;default:o=!0,a[O(f[0],r)]=O(f[1],r)}}o&&(n.headers=a)}n.query=undefined;for(var d=0,l=t.length;d<l;++d){var m=t[d].split("@");if(m[0]=O(m[0]),r.unicodeSupport)m[1]=O(m[1],r).toLowerCase();else try{m[1]=B.toASCII(O(m[1],r).toLowerCase())}catch(g){n.error=n.error||"Email address's domain name can not be converted to ASCII via punycode: "+g}t[d]=m.join("@")}return n},serialize:function(e,r){var n=e,t=a(e.to);if(t){for(var i=0,u=t.length;i<u;++i){var s=String(t[i]),f=s.lastIndexOf("@"),c=s.slice(0,f).replace(de,I).replace(de,o).replace(le,h),p=s.slice(f+1);try{p=r.iri?B.toUnicode(p):B.toASCII(O(p,r).toLowerCase())}catch(g){n.error=n.error||"Email address's domain name can not be converted to "+(r.iri?"Unicode":"ASCII")+" via punycode: "+g}t[i]=c+"@"+p}n.path=t.join(",")}var d=e.headers=e.headers||{};e.subject&&(d.subject=e.subject),e.body&&(d.body=e.body);var l=[];for(var m in d)d[m]!==ue[m]&&l.push(m.replace(de,I).replace(de,o).replace(me,h)+"="+d[m].replace(de,I).replace(de,o).replace(ge,h));return l.length&&(n.query=l.join("&")),n}},Ee=/^([^\:]+)\:(.*)/,Ce={scheme:"urn",parse:function(e,r){var n=e.path&&e.path.match(Ee),t=e;if(n){var o=r.scheme||t.scheme||"urn",a=n[1].toLowerCase(),i=n[2],u=o+":"+(r.nid||a),s=J[u];t.nid=a,t.nss=i,t.path=undefined,s&&(t=s.parse(t,r))}else t.error=t.error||"URN can not be parsed.";return t},serialize:function(e,r){var n=r.scheme||e.scheme||"urn",t=e.nid,o=n+":"+(r.nid||t),a=J[o];a&&(e=a.serialize(e,r));var i=e,u=e.nss;return i.path=(t||r.nid)+":"+u,i}},ye=/^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/,Se={scheme:"urn:uuid",parse:function(e,r){var n=e;return n.uuid=n.nss,n.nss=undefined,r.tolerant||n.uuid&&n.uuid.match(ye)||(n.error=n.error||"UUID is not valid."),n},serialize:function(e,r){var n=e;return n.nss=(e.uuid||"").toLowerCase(),n}};J[te.scheme]=te,J[oe.scheme]=oe,J[ae.scheme]=ae,J[ie.scheme]=ie,J[ve.scheme]=ve,J[Ce.scheme]=Ce,J[Se.scheme]=Se,e.SCHEMES=J,e.pctEncChar=h,e.pctDecChars=d,e.parse=E,e.removeDotSegments=y,e.serialize=S,e.resolveComponents=A,e.resolve=D,e.normalize=w,e.equal=b,e.escapeComponent=x,e.unescapeComponent=O,Object.defineProperty(e,"__esModule",{value:!0})});
//# sourceMappingURL=uri.all.min.js.map{"version":3,"sources":["../../src/util.ts","../../src/regexps-uri.ts","../../node_modules/punycode/punycode.es6.js","../../src/uri.ts","../../src/schemes/ws.ts","../../src/schemes/mailto.ts","../../src/regexps-iri.ts","../../src/schemes/http.ts","../../src/schemes/https.ts","../../src/schemes/wss.ts","../../src/schemes/urn.ts","../../src/schemes/urn-uuid.ts","../../src/index.ts"],"names":["merge","sets","Array","_len","_key","arguments","length","slice","xl","x","join","subexp","str","typeOf","o","undefined","Object","prototype","toString","call","split","pop","shift","toLowerCase","toUpperCase","toArray","obj","setInterval","assign","target","source","key","buildExps","isIRI","HEXDIG$$","PCT_ENCODED$","SUB_DELIMS$$","RESERVED$$","UCSCHAR$$","DEC_OCTET_RELAXED$","H16$","LS32$","IPV4ADDRESS$","IPV6ADDRESS1$","IPV6ADDRESS2$","IPV6ADDRESS3$","IPV6ADDRESS4$","IPV6ADDRESS5$","IPV6ADDRESS6$","IPV6ADDRESS7$","IPV6ADDRESS8$","IPV6ADDRESS9$","ZONEID$","UNRESERVED$$","RegExp","IPRIVATE$$","IPV6ADDRESS$","error","type","RangeError","errors","map","array","fn","result","mapDomain","string","parts","replace","regexSeparators","ucs2decode","output","counter","value","charCodeAt","extra","push","pctEncChar","chr","c","pctDecChars","newStr","i","il","parseInt","substr","String","fromCharCode","c2","c3","_normalizeComponentEncoding","components","protocol","decodeUnreserved","decStr","match","UNRESERVED","scheme","PCT_ENCODED","NOT_SCHEME","userinfo","NOT_USERINFO","host","NOT_HOST","path","NOT_PATH","NOT_PATH_NOSCHEME","query","NOT_QUERY","fragment","NOT_FRAGMENT","_stripLeadingZeros","_normalizeIPv4","matches","IPV4ADDRESS","address","_matches","_normalizeIPv6","IPV6ADDRESS","_matches2","zone","reverse","last","_address$toLowerCase$2","first","firstFields","lastFields","isLastFieldIPv4Address","test","fieldCount","lastFieldsStart","fields","allZeroFields","reduce","acc","field","index","lastLongest","longestZeroFields","sort","a","b","newHost","newFirst","newLast","parse","uriString","options","iri","IRI_PROTOCOL","URI_PROTOCOL","reference","URI_PARSE","NO_MATCH_IS_UNDEFINED","port","isNaN","indexOf","schemeHandler","SCHEMES","unicodeSupport","domainHost","punycode","toASCII","e","_recomposeAuthority","uriTokens","_","$1","$2","removeDotSegments","input","RDS1","RDS2","RDS3","im","RDS5","Error","s","serialize","toUnicode","authority","charAt","absolutePath","resolveComponents","base","relative","skipNormalization","tolerant","lastIndexOf","resolve","baseURI","relativeURI","schemelessOptions","normalize","uri","equal","uriA","uriB","escapeComponent","ESCAPE","unescapeComponent","isSecure","wsComponents","secure","maxInt","regexPunycode","regexNonASCII","floor","Math","stringFromCharCode","ucs2encode","fromCodePoint","apply","toConsumableArray","basicToDigit","codePoint","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","k","baseMinusTMin","decode","inputLength","n","bias","basic","j","oldi","w","t","baseMinusT","out","splice","encode","_step","Symbol","iterator","_iteratorNormalCompletion","_iterator","next","done","currentValue","basicLength","handledCPCount","m","_step2","_iteratorNormalCompletion2","_iterator2","handledCPCountPlusOne","_step3","_iteratorNormalCompletion3","_iterator3","q","qMinusT","handler","http","resourceName","_wsComponents$resourc2","ws","O","VCHAR$$","NOT_LOCAL_PART","NOT_HFNAME","NOT_HFVALUE","mailtoComponents","to","unknownHeaders","headers","hfields","hfield","toAddrs","subject","body","addr","toAddr","atIdx","localPart","domain","name","URN_PARSE","urnComponents","nid","nss","urnScheme","uriComponents","UUID","uuidComponents","uuid","https","wss","mailto","urn"],"mappings":";4LAAA,SAAAA,gCAAyBC,EAAzBC,MAAAC,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,MAAAA,GAAAC,UAAAD,MACKH,EAAKK,OAAS,EAAG,GACf,GAAKL,EAAK,GAAGM,MAAM,GAAI,OAEvB,GADCC,GAAKP,EAAKK,OAAS,EAChBG,EAAI,EAAGA,EAAID,IAAMC,IACpBA,GAAKR,EAAKQ,GAAGF,MAAM,GAAI,YAExBC,GAAMP,EAAKO,GAAID,MAAM,GACnBN,EAAKS,KAAK,UAEVT,GAAK,GAId,QAAAU,GAAuBC,SACf,MAAQA,EAAM,IAGtB,QAAAC,GAAuBC,SACfA,KAAMC,UAAY,YAAqB,OAAND,EAAa,OAASE,OAAOC,UAAUC,SAASC,KAAKL,GAAGM,MAAM,KAAKC,MAAMD,MAAM,KAAKE,QAAQC,cAGrI,QAAAC,GAA4BZ,SACpBA,GAAIY,cAGZ,QAAAC,GAAwBC,SAChBA,KAAQX,WAAqB,OAARW,EAAgBA,YAAexB,OAAQwB,EAA6B,gBAAfA,GAAIpB,QAAuBoB,EAAIN,OAASM,EAAIC,aAAeD,EAAIP,MAAQO,GAAOxB,MAAMe,UAAUV,MAAMY,KAAKO,MAI3L,QAAAE,GAAuBC,EAAgBC,MAChCJ,GAAMG,KACRC,MACE,GAAMC,KAAOD,KACbC,GAAOD,EAAOC,SAGbL,GCnCR,QAAAM,GAA0BC,MAMxBC,GAAWlC,EAFD,QAEgB,YAG1BmC,EAAexB,EAAOA,EAAO,UAAYuB,EAAW,IAAMA,EAAWA,EAAW,IAAMA,EAAWA,GAAY,IAAMvB,EAAO,cAAgBuB,EAAW,IAAMA,EAAWA,GAAY,IAAMvB,EAAO,IAAMuB,EAAWA,IAEhNE,EAAe,sCACfC,EAAarC,EAFE,0BAEkBoC,GACjCE,EAAYL,EAAQ,8EAAgF,OACvFA,EAAQ,oBAAsB,OAC5BjC,EAbL,WAEA,QAW6B,iBAAkBsC,GAIzDC,EAAqB5B,EAAOA,EAAO,WAAa,IAAMA,EAAO,eAAsB,IAAMA,EAAO,eAA2B,IAAMA,EAAO,gBAAuB,gBAChJA,EAAO4B,EAAqB,MAAQA,EAAqB,MAAQA,EAAqB,MAAQA,GAC7GC,EAAO7B,EAAOuB,EAAW,SACzBO,EAAQ9B,EAAOA,EAAO6B,EAAO,MAAQA,GAAQ,IAAME,GACnDC,EAAgBhC,EAAmEA,EAAO6B,EAAO,OAAS,MAAQC,KAClG9B,EAAwD,SAAWA,EAAO6B,EAAO,OAAS,MAAQC,KAClG9B,EAAOA,EAAwC6B,GAAQ,UAAY7B,EAAO6B,EAAO,OAAS,MAAQC,KAClG9B,EAAOA,EAAOA,EAAO6B,EAAO,OAAS,QAAUA,GAAQ,UAAY7B,EAAO6B,EAAO,OAAS,MAAQC,KAClG9B,EAAOA,EAAOA,EAAO6B,EAAO,OAAS,QAAUA,GAAQ,UAAY7B,EAAO6B,EAAO,OAAS,MAAQC,KAClG9B,EAAOA,EAAOA,EAAO6B,EAAO,OAAS,QAAUA,GAAQ,UAAmBA,EAAO,MAAiBC,KAClG9B,EAAOA,EAAOA,EAAO6B,EAAO,OAAS,QAAUA,GAAQ,UAA2CC,KAClG9B,EAAOA,EAAOA,EAAO6B,EAAO,OAAS,QAAUA,GAAQ,UAA2CA,KAClG7B,EAAOA,EAAOA,EAAO6B,EAAO,OAAS,QAAUA,GAAQ,aACxD7B,GAAQgC,EAAeC,EAAeC,EAAeC,EAAeC,EAAeC,EAAeC,EAAeC,EAAeC,GAAezC,KAAK,MACnK0C,EAAUzC,EAAOA,EAAO0C,EAAe,IAAMlB,GAAgB,uBAoChD,GAAImB,QAAOtD,EAAM,MAnEpB,WAEA,QAiE6C,eAAgB,kBACxD,GAAIsD,QAAOtD,EAAM,YAAaqD,EAAcjB,GAAe,cAC/D,GAAIkB,QAAOtD,EAAM,kBAAmBqD,EAAcjB,GAAe,cACjE,GAAIkB,QAAOtD,EAAM,kBAAmBqD,EAAcjB,GAAe,uBACxD,GAAIkB,QAAOtD,EAAM,eAAgBqD,EAAcjB,GAAe,eACtE,GAAIkB,QAAOtD,EAAM,SAAUqD,EAAcjB,EAAc,iBAAkBmB,GAAa,kBACnF,GAAID,QAAOtD,EAAM,SAAUqD,EAAcjB,EAAc,kBAAmB,YAChF,GAAIkB,QAAOtD,EAAM,MAAOqD,EAAcjB,GAAe,gBACjD,GAAIkB,QAAOD,EAAc,iBACxB,GAAIC,QAAOtD,EAAM,SAAUqD,EAAchB,GAAa,iBACtD,GAAIiB,QAAOnB,EAAc,iBACzB,GAAImB,QAAO,KAAOZ,EAAe,kBACjC,GAAIY,QAAO,SAAWE,EAAe,IAAM7C,EAAOA,EAAO,eAAiBuB,EAAW,QAAU,IAAMkB,EAAU,KAAO,WC5CtI,QAASK,GAAMC,QACR,IAAIC,YAAWC,EAAOF,IAW7B,QAASG,GAAIC,EAAOC,UACbC,MACF1D,EAASwD,EAAMxD,OACZA,OACCA,GAAUyD,EAAGD,EAAMxD,UAEpB0D,GAaR,QAASC,GAAUC,EAAQH,MACpBI,GAAQD,EAAO9C,MAAM,KACvB4C,EAAS,SACTG,GAAM7D,OAAS,MAGT6D,EAAM,GAAK,MACXA,EAAM,MAGPD,EAAOE,QAAQC,EAAiB,KAGlCL,EADSH,EADDK,EAAO9C,MAAM,KACA2C,GAAIrD,KAAK,KAiBtC,QAAS4D,GAAWJ,UACbK,MACFC,EAAU,EACRlE,EAAS4D,EAAO5D,OACfkE,EAAUlE,GAAQ,IAClBmE,GAAQP,EAAOQ,WAAWF,QAC5BC,GAAS,OAAUA,GAAS,OAAUD,EAAUlE,EAAQ,IAErDqE,GAAQT,EAAOQ,WAAWF,IACR,SAAX,MAARG,KACGC,OAAe,KAARH,IAAkB,KAAe,KAARE,GAAiB,UAIjDC,KAAKH,eAING,KAAKH,SAGPF,GC/BR,QAAAM,GAA2BC,MACpBC,GAAID,EAAIJ,WAAW,SAGrBK,GAAI,GAAQ,KAAOA,EAAE7D,SAAS,IAAIM,cAC7BuD,EAAI,IAAS,IAAMA,EAAE7D,SAAS,IAAIM,cAClCuD,EAAI,KAAU,KAAQA,GAAK,EAAK,KAAK7D,SAAS,IAAIM,cAAgB,KAAY,GAAJuD,EAAU,KAAK7D,SAAS,IAAIM,cACtG,KAAQuD,GAAK,GAAM,KAAK7D,SAAS,IAAIM,cAAgB,KAASuD,GAAK,EAAK,GAAM,KAAK7D,SAAS,IAAIM,cAAgB,KAAY,GAAJuD,EAAU,KAAK7D,SAAS,IAAIM,cAK9J,QAAAwD,GAA4BpE,UACvBqE,GAAS,GACTC,EAAI,EACFC,EAAKvE,EAAIN,OAER4E,EAAIC,GAAI,IACRJ,GAAIK,SAASxE,EAAIyE,OAAOH,EAAI,EAAG,GAAI,OAErCH,EAAI,OACGO,OAAOC,aAAaR,MACzB,MAED,IAAIA,GAAK,KAAOA,EAAI,IAAK,IACxBI,EAAKD,GAAM,EAAG,IACZM,GAAKJ,SAASxE,EAAIyE,OAAOH,EAAI,EAAG,GAAI,OAChCI,OAAOC,cAAmB,GAAJR,IAAW,EAAW,GAALS,WAEvC5E,EAAIyE,OAAOH,EAAG,MAEpB,MAED,IAAIH,GAAK,IAAK,IACbI,EAAKD,GAAM,EAAG,IACZM,GAAKJ,SAASxE,EAAIyE,OAAOH,EAAI,EAAG,GAAI,IACpCO,EAAKL,SAASxE,EAAIyE,OAAOH,EAAI,EAAG,GAAI,OAChCI,OAAOC,cAAmB,GAAJR,IAAW,IAAa,GAALS,IAAY,EAAW,GAALC,WAE3D7E,EAAIyE,OAAOH,EAAG,MAEpB,UAGKtE,EAAIyE,OAAOH,EAAG,MACnB,QAIAD,GAGR,QAAAS,GAAqCC,EAA0BC,WAC/DC,GAA2BjF,MACnBkF,GAASd,EAAYpE,SAClBkF,GAAOC,MAAMH,EAASI,YAAoBF,EAANlF,QAG1C+E,GAAWM,SAAQN,EAAWM,OAASX,OAAOK,EAAWM,QAAQ7B,QAAQwB,EAASM,YAAaL,GAAkBtE,cAAc6C,QAAQwB,EAASO,WAAY,KAC5JR,EAAWS,WAAarF,YAAW4E,EAAWS,SAAWd,OAAOK,EAAWS,UAAUhC,QAAQwB,EAASM,YAAaL,GAAkBzB,QAAQwB,EAASS,aAAcxB,GAAYT,QAAQwB,EAASM,YAAa1E,IAC9MmE,EAAWW,OAASvF,YAAW4E,EAAWW,KAAOhB,OAAOK,EAAWW,MAAMlC,QAAQwB,EAASM,YAAaL,GAAkBtE,cAAc6C,QAAQwB,EAASW,SAAU1B,GAAYT,QAAQwB,EAASM,YAAa1E,IAC5MmE,EAAWa,OAASzF,YAAW4E,EAAWa,KAAOlB,OAAOK,EAAWa,MAAMpC,QAAQwB,EAASM,YAAaL,GAAkBzB,QAASuB,EAAWM,OAASL,EAASa,SAAWb,EAASc,kBAAoB7B,GAAYT,QAAQwB,EAASM,YAAa1E,IACjPmE,EAAWgB,QAAU5F,YAAW4E,EAAWgB,MAAQrB,OAAOK,EAAWgB,OAAOvC,QAAQwB,EAASM,YAAaL,GAAkBzB,QAAQwB,EAASgB,UAAW/B,GAAYT,QAAQwB,EAASM,YAAa1E,IAClMmE,EAAWkB,WAAa9F,YAAW4E,EAAWkB,SAAWvB,OAAOK,EAAWkB,UAAUzC,QAAQwB,EAASM,YAAaL,GAAkBzB,QAAQwB,EAASkB,aAAcjC,GAAYT,QAAQwB,EAASM,YAAa1E,IAE3MmE,EAGR,QAAAoB,GAA4BnG,SACpBA,GAAIwD,QAAQ,UAAW,OAAS,IAGxC,QAAA4C,GAAwBV,EAAaV,MAC9BqB,GAAUX,EAAKP,MAAMH,EAASsB,qBAChBD,EAFrB,GAEUE,EAFVC,EAAA,SAIKD,GACIA,EAAQ/F,MAAM,KAAKyC,IAAIkD,GAAoBrG,KAAK,KAEhD4F,EAIT,QAAAe,GAAwBf,EAAaV,MAC9BqB,GAAUX,EAAKP,MAAMH,EAAS0B,qBACVL,EAF3B,GAEUE,EAFVI,EAAA,GAEmBC,EAFnBD,EAAA,MAIKJ,EAAS,KASP,MARiBA,EAAQ5F,cAAcH,MAAM,MAAMqG,mBAAjDC,EADKC,EAAA,GACCC,EADDD,EAAA,GAENE,EAAcD,EAAQA,EAAMxG,MAAM,KAAKyC,IAAIkD,MAC3Ce,EAAaJ,EAAKtG,MAAM,KAAKyC,IAAIkD,GACjCgB,EAAyBnC,EAASsB,YAAYc,KAAKF,EAAWA,EAAWxH,OAAS,IAClF2H,EAAaF,EAAyB,EAAI,EAC1CG,EAAkBJ,EAAWxH,OAAS2H,EACtCE,EAASjI,MAAc+H,GAEpBxH,EAAI,EAAGA,EAAIwH,IAAcxH,IAC1BA,GAAKoH,EAAYpH,IAAMqH,EAAWI,EAAkBzH,IAAM,EAG9DsH,OACIE,EAAa,GAAKjB,EAAemB,EAAOF,EAAa,GAAIrC,OAG3DwC,GAAgBD,EAAOE,OAA4C,SAACC,EAAKC,EAAOC,OAChFD,GAAmB,MAAVA,EAAe,IACtBE,GAAcH,EAAIA,EAAIhI,OAAS,EACjCmI,IAAeA,EAAYD,MAAQC,EAAYnI,SAAWkI,IACjDlI,WAERsE,MAAO4D,MAAAA,EAAOlI,OAAS,UAGtBgI,QAGFI,EAAoBN,EAAcO,KAAK,SAACC,EAAGC,SAAMA,GAAEvI,OAASsI,EAAEtI,SAAQ,GAExEwI,MAAAA,MACAJ,GAAqBA,EAAkBpI,OAAS,EAAG,IAChDyI,GAAWZ,EAAO5H,MAAM,EAAGmI,EAAkBF,OAC7CQ,EAAUb,EAAO5H,MAAMmI,EAAkBF,MAAQE,EAAkBpI,UAC/DyI,EAASrI,KAAK,KAAO,KAAOsI,EAAQtI,KAAK,YAEzCyH,EAAOzH,KAAK,WAGnB8G,QACQ,IAAMA,GAGXsB,QAEAxC,GAOT,QAAA2C,GAAsBC,MAAkBC,GAAxC9I,UAAAC,OAAA,GAAAD,UAAA,KAAAU,UAAAV,UAAA,MACOsF,KACAC,GAA4B,IAAhBuD,EAAQC,IAAgBC,EAAeC,CAE/B,YAAtBH,EAAQI,YAAwBL,GAAaC,EAAQlD,OAASkD,EAAQlD,OAAS,IAAM,IAAM,KAAOiD,MAEhGjC,GAAUiC,EAAUnD,MAAMyD,MAE5BvC,EAAS,CACRwC,KAEQxD,OAASgB,EAAQ,KACjBb,SAAWa,EAAQ,KACnBX,KAAOW,EAAQ,KACfyC,KAAOtE,SAAS6B,EAAQ,GAAI,MAC5BT,KAAOS,EAAQ,IAAM,KACrBN,MAAQM,EAAQ,KAChBJ,SAAWI,EAAQ,GAG1B0C,MAAMhE,EAAW+D,UACTA,KAAOzC,EAAQ,QAIhBhB,OAASgB,EAAQ,IAAMlG,YACvBqF,UAAwC,IAA5B8C,EAAUU,QAAQ,KAAc3C,EAAQ,GAAKlG,YACzDuF,MAAqC,IAA7B4C,EAAUU,QAAQ,MAAe3C,EAAQ,GAAKlG,YACtD2I,KAAOtE,SAAS6B,EAAQ,GAAI,MAC5BT,KAAOS,EAAQ,IAAM,KACrBN,OAAqC,IAA5BuC,EAAUU,QAAQ,KAAc3C,EAAQ,GAAKlG,YACtD8F,UAAwC,IAA5BqC,EAAUU,QAAQ,KAAc3C,EAAQ,GAAKlG,UAGhE4I,MAAMhE,EAAW+D,UACTA,KAAQR,EAAUnD,MAAM,iCAAmCkB,EAAQ,GAAKlG,YAIjF4E,EAAWW,SAEHA,KAAOe,EAAeL,EAAerB,EAAWW,KAAMV,GAAWA,IAIzED,EAAWM,SAAWlF,WAAa4E,EAAWS,WAAarF,WAAa4E,EAAWW,OAASvF,WAAa4E,EAAW+D,OAAS3I,WAAc4E,EAAWa,MAAQb,EAAWgB,QAAU5F,UAE5K4E,EAAWM,SAAWlF,YACrBwI,UAAY,WACb5D,EAAWkB,WAAa9F,YACvBwI,UAAY,aAEZA,UAAY,QANZA,UAAY,gBAUpBJ,EAAQI,WAAmC,WAAtBJ,EAAQI,WAA0BJ,EAAQI,YAAc5D,EAAW4D,cAChF9F,MAAQkC,EAAWlC,OAAS,gBAAkB0F,EAAQI,UAAY,kBAIxEM,GAAgBC,GAASX,EAAQlD,QAAUN,EAAWM,QAAU,IAAI1E,kBAGrE4H,EAAQY,gBAAoBF,GAAkBA,EAAcE,iBAcpCpE,EAAYC,OAdyC,IAE7ED,EAAWW,OAAS6C,EAAQa,YAAeH,GAAiBA,EAAcG,kBAGjE1D,KAAO2D,EAASC,QAAQvE,EAAWW,KAAKlC,QAAQwB,EAASM,YAAalB,GAAazD,eAC7F,MAAO4I,KACG1G,MAAQkC,EAAWlC,OAAS,kEAAoE0G,IAIjFxE,EAAY2D,GAOrCO,GAAiBA,EAAcZ,SACpBA,MAAMtD,EAAYwD,UAGtB1F,MAAQkC,EAAWlC,OAAS,+BAGjCkC,GAGR,QAAAyE,GAA6BzE,EAA0BwD,MAChDvD,IAA4B,IAAhBuD,EAAQC,IAAgBC,EAAeC,EACnDe,WAEF1E,GAAWS,WAAarF,cACjB6D,KAAKe,EAAWS,YAChBxB,KAAK,MAGZe,EAAWW,OAASvF,aAEb6D,KAAKyC,EAAeL,EAAe1B,OAAOK,EAAWW,MAAOV,GAAWA,GAAUxB,QAAQwB,EAAS0B,YAAa,SAACgD,EAAGC,EAAIC,SAAO,IAAMD,GAAMC,EAAK,MAAQA,EAAK,IAAM,OAG9I,gBAApB7E,GAAW+D,MAAgD,gBAApB/D,GAAW+D,SAClD9E,KAAK,OACLA,KAAKU,OAAOK,EAAW+D,QAG3BW,EAAU/J,OAAS+J,EAAU3J,KAAK,IAAMK,UAShD,QAAA0J,GAAkCC,UAC3BnG,MAECmG,EAAMpK,WACRoK,EAAM3E,MAAM4E,KACPD,EAAMtG,QAAQuG,EAAM,QACtB,IAAID,EAAM3E,MAAM6E,MACdF,EAAMtG,QAAQwG,GAAM,SACtB,IAAIF,EAAM3E,MAAM8E,MACdH,EAAMtG,QAAQyG,GAAM,OACrBxJ,UACD,IAAc,MAAVqJ,GAA2B,OAAVA,IACnB,OACF,IACAI,GAAKJ,EAAM3E,MAAMgF,QACnBD,OAKG,IAAIE,OAAM,uCAJVC,GAAIH,EAAG,KACLJ,EAAMnK,MAAM0K,EAAE3K,UACfsE,KAAKqG,SAOR1G,GAAO7D,KAAK,IAGpB,QAAAwK,GAA0BvF,MAA0BwD,GAApD9I,UAAAC,OAAA,GAAAD,UAAA,KAAAU,UAAAV,UAAA,MACOuF,EAAYuD,EAAQC,IAAMC,EAAeC,EACzCe,KAGAR,EAAgBC,GAASX,EAAQlD,QAAUN,EAAWM,QAAU,IAAI1E,kBAGtEsI,GAAiBA,EAAcqB,WAAWrB,EAAcqB,UAAUvF,EAAYwD,GAE9ExD,EAAWW,QAEVV,EAAS0B,YAAYU,KAAKrC,EAAWW,WAKpC,IAAI6C,EAAQa,YAAeH,GAAiBA,EAAcG,iBAGlD1D,KAAS6C,EAAQC,IAAmGa,EAASkB,UAAUxF,EAAWW,MAA3H2D,EAASC,QAAQvE,EAAWW,KAAKlC,QAAQwB,EAASM,YAAalB,GAAazD,eAC7G,MAAO4I,KACG1G,MAAQkC,EAAWlC,OAAS,+CAAkD0F,EAAQC,IAAgB,UAAV,SAAuB,kBAAoBe,IAMzHxE,EAAYC,GAEd,WAAtBuD,EAAQI,WAA0B5D,EAAWM,WACtCrB,KAAKe,EAAWM,UAChBrB,KAAK,SAGVwG,GAAYhB,EAAoBzE,EAAYwD,MAC9CiC,IAAcrK,YACS,WAAtBoI,EAAQI,aACD3E,KAAK,QAGNA,KAAKwG,GAEXzF,EAAWa,MAAsC,MAA9Bb,EAAWa,KAAK6E,OAAO,MACnCzG,KAAK,MAIbe,EAAWa,OAASzF,UAAW,IAC9BkK,GAAItF,EAAWa,IAEd2C,GAAQmC,cAAkBzB,GAAkBA,EAAcyB,iBAC1Db,EAAkBQ,IAGnBG,IAAcrK,cACbkK,EAAE7G,QAAQ,QAAS,WAGdQ,KAAKqG,SAGZtF,GAAWgB,QAAU5F,cACd6D,KAAK,OACLA,KAAKe,EAAWgB,QAGvBhB,EAAWkB,WAAa9F,cACjB6D,KAAK,OACLA,KAAKe,EAAWkB,WAGpBwD,EAAU3J,KAAK,IAGvB,QAAA6K,GAAkCC,EAAoBC,MAAwBtC,GAA9E9I,UAAAC,OAAA,GAAAD,UAAA,KAAAU,UAAAV,UAAA,MAAuGqL,EAAvGrL,UAAA,GACOwB,WAED6J,OACGzC,EAAMiC,EAAUM,EAAMrC,GAAUA,KAC5BF,EAAMiC,EAAUO,EAAUtC,GAAUA,MAEtCA,OAELA,EAAQwC,UAAYF,EAASxF,UAC1BA,OAASwF,EAASxF,SAElBG,SAAWqF,EAASrF,WACpBE,KAAOmF,EAASnF,OAChBoD,KAAO+B,EAAS/B,OAChBlD,KAAOiE,EAAkBgB,EAASjF,MAAQ,MAC1CG,MAAQ8E,EAAS9E,QAEpB8E,EAASrF,WAAarF,WAAa0K,EAASnF,OAASvF,WAAa0K,EAAS/B,OAAS3I,aAEhFqF,SAAWqF,EAASrF,WACpBE,KAAOmF,EAASnF,OAChBoD,KAAO+B,EAAS/B,OAChBlD,KAAOiE,EAAkBgB,EAASjF,MAAQ,MAC1CG,MAAQ8E,EAAS9E,QAEnB8E,EAASjF,MAQmB,MAA5BiF,EAASjF,KAAK6E,OAAO,KACjB7E,KAAOiE,EAAkBgB,EAASjF,OAEpCgF,EAAKpF,WAAarF,WAAayK,EAAKlF,OAASvF,WAAayK,EAAK9B,OAAS3I,WAAeyK,EAAKhF,KAErFgF,EAAKhF,OAGTA,KAAOgF,EAAKhF,KAAKjG,MAAM,EAAGiL,EAAKhF,KAAKoF,YAAY,KAAO,GAAKH,EAASjF,OAFrEA,KAAOiF,EAASjF,OAFhBA,KAAO,IAAMiF,EAASjF,OAMvBA,KAAOiE,EAAkB5I,EAAO2E,SAEjCG,MAAQ8E,EAAS9E,UAnBjBH,KAAOgF,EAAKhF,KACfiF,EAAS9E,QAAU5F,YACf4F,MAAQ8E,EAAS9E,QAEjBA,MAAQ6E,EAAK7E,SAkBfP,SAAWoF,EAAKpF,WAChBE,KAAOkF,EAAKlF,OACZoD,KAAO8B,EAAK9B,QAEbzD,OAASuF,EAAKvF,UAGfY,SAAW4E,EAAS5E,SAEpBhF,EAGR,QAAAgK,GAAwBC,EAAgBC,EAAoB5C,MACrD6C,GAAoBpK,GAASqE,OAAS,QAAUkD,SAC/C+B,GAAUK,EAAkBtC,EAAM6C,EAASE,GAAoB/C,EAAM8C,EAAaC,GAAoBA,GAAmB,GAAOA,GAKxI,QAAAC,GAA0BC,EAAS/C,SACf,gBAAR+C,KACJhB,EAAUjC,EAAMiD,EAAK/C,GAAUA,GACX,WAAhBtI,EAAOqL,OACXjD,EAAMiC,EAAyBgB,EAAK/C,GAAUA,IAG9C+C,EAKR,QAAAC,GAAsBC,EAAUC,EAAUlD,SACrB,gBAATiD,KACHlB,EAAUjC,EAAMmD,EAAMjD,GAAUA,GACZ,WAAjBtI,EAAOuL,OACVlB,EAAyBkB,EAAMjD,IAGnB,gBAATkD,KACHnB,EAAUjC,EAAMoD,EAAMlD,GAAUA,GACZ,WAAjBtI,EAAOwL,OACVnB,EAAyBmB,EAAMlD,IAGhCiD,IAASC,EAGjB,QAAAC,GAAgC1L,EAAYuI,SACpCvI,IAAOA,EAAIM,WAAWkD,QAAU+E,GAAYA,EAAQC,IAA4BC,EAAakD,OAAnCjD,EAAaiD,OAA+B1H,GAG9G,QAAA2H,GAAkC5L,EAAYuI,SACtCvI,IAAOA,EAAIM,WAAWkD,QAAU+E,GAAYA,EAAQC,IAAiCC,EAAanD,YAAxCoD,EAAapD,YAAyClB,GCniBxH,QAAAyH,GAAkBC,SACqB,iBAAxBA,GAAaC,OAAuBD,EAAaC,OAAuD,QAA9CrH,OAAOoH,EAAazG,QAAQ1E,cCwDrG,QAGAsE,GAA0BjF,MACnBkF,GAASd,EAAYpE,SAClBkF,GAAOC,MAAMC,IAAoBF,EAANlF,EJmBrC,GAAA0I,GAAetH,GAAU,GKrFzBqH,EAAerH,GAAU,2iBJAnB4K,EAAS,WAaTC,EAAgB,QAChBC,EAAgB,aAChBzI,EAAkB,4BAGlBT,YACO,8DACC,iEACI,iBAKZmJ,EAAQC,KAAKD,MACbE,EAAqB3H,OAAOC,aAsG5B2H,EAAa,SAAApJ,SAASwB,QAAO6H,cAAPC,MAAA9H,OAAA+H,EAAwBvJ,KAW9CwJ,EAAe,SAASC,SACzBA,GAAY,GAAO,GACfA,EAAY,GAEhBA,EAAY,GAAO,GACfA,EAAY,GAEhBA,EAAY,GAAO,GACfA,EAAY,GAjJR,IAiKPC,EAAe,SAASC,EAAOC,SAG7BD,GAAQ,GAAK,IAAMA,EAAQ,MAAgB,GAARC,IAAc,IAQnDC,EAAQ,SAASC,EAAOC,EAAWC,MACpCC,GAAI,QACAD,EAAYf,EAAMa,EA1Kd,KA0K8BA,GAAS,KAC1Cb,EAAMa,EAAQC,GACOD,EAAQI,IAA2BD,GAhLrD,KAiLHhB,EAAMa,EA3JMpC,UA6JduB,GAAMgB,EAAI,GAAsBH,GAASA,EAhLpC,MA0LPK,EAAS,SAASvD,MAEjBnG,MACA2J,EAAcxD,EAAMpK,OACtB4E,EAAI,EACJiJ,EA5LY,IA6LZC,EA9Le,GAoMfC,EAAQ3D,EAAMkB,YAlMD,IAmMbyC,GAAQ,MACH,OAGJ,GAAIC,GAAI,EAAGA,EAAID,IAASC,EAExB5D,EAAMhG,WAAW4J,IAAM,OACpB,eAEA1J,KAAK8F,EAAMhG,WAAW4J,QAMzB,GAAI9F,GAAQ6F,EAAQ,EAAIA,EAAQ,EAAI,EAAG7F,EAAQ0F,GAAwC,KAQtF,GADDK,GAAOrJ,EACFsJ,EAAI,EAAGT,EAjOL,IAiOmCA,GAjOnC,GAiO8C,CAEpDvF,GAAS0F,KACN,oBAGDT,GAAQH,EAAa5C,EAAMhG,WAAW8D,OAExCiF,GAzOM,IAyOWA,EAAQV,GAAOH,EAAS1H,GAAKsJ,OAC3C,eAGFf,EAAQe,KACPC,GAAIV,GAAKK,EA7OL,EA6OoBL,GAAKK,EA5OzB,GAAA,GA4O8CL,EAAIK,KAExDX,EAAQgB,WAINC,GApPI,GAoPgBD,CACtBD,GAAIzB,EAAMH,EAAS8B,MAChB,eAGFA,KAIAC,GAAMpK,EAAOjE,OAAS,IACrBqN,EAAMzI,EAAIqJ,EAAMI,EAAa,GAARJ,GAIxBxB,EAAM7H,EAAIyJ,GAAO/B,EAASuB,KACvB,eAGFpB,EAAM7H,EAAIyJ,MACVA,IAGEC,OAAO1J,IAAK,EAAGiJ,SAIhB7I,QAAO6H,cAAPC,MAAA9H,OAAwBf,IAU1BsK,EAAS,SAASnE,MACjBnG,QAGED,EAAWoG,MAGfwD,GAAcxD,EAAMpK,OAGpB6N,EA5RY,IA6RZP,EAAQ,EACRQ,EA/Re,oCAkSnBU,KAA2BpE,EAA3BqE,OAAAC,cAAAC,GAAAH,EAAAI,EAAAC,QAAAC,MAAAH,GAAA,EAAkC,IAAvBI,GAAuBP,EAAArK,KAC7B4K,GAAe,OACXzK,KAAKqI,EAAmBoC,2FAI7BC,GAAc/K,EAAOjE,OACrBiP,EAAiBD,MAMjBA,KACI1K,KA9SS,KAkTV2K,EAAiBrB,GAAa,IAIhCsB,GAAI5C,mCACR6C,KAA2B/E,EAA3BqE,OAAAC,cAAAU,GAAAD,EAAAE,EAAAR,QAAAC,MAAAM,GAAA,EAAkC,IAAvBL,GAAuBI,EAAAhL,KAC7B4K,IAAgBlB,GAAKkB,EAAeG,MACnCH,0FAMAO,GAAwBL,EAAiB,CAC3CC,GAAIrB,EAAIpB,GAAOH,EAASgB,GAASgC,MAC9B,gBAGGJ,EAAIrB,GAAKyB,IACfJ,uCAEJK,KAA2BnF,EAA3BqE,OAAAC,cAAAc,GAAAD,EAAAE,EAAAZ,QAAAC,MAAAU,GAAA,EAAkC,IAAvBT,GAAuBQ,EAAApL,SAC7B4K,EAAelB,KAAOP,EAAQhB,KAC3B,YAEHyC,GAAgBlB,EAAG,KAGjB,GADD6B,GAAIpC,EACCG,EArVA,IAqV8BA,GArV9B,GAqVyC,IAC3CU,GAAIV,GAAKK,EArVP,EAqVsBL,GAAKK,EApV3B,GAAA,GAoVgDL,EAAIK,KACxD4B,EAAIvB,WAGFwB,GAAUD,EAAIvB,EACdC,EA3VE,GA2VkBD,IACnB7J,KACNqI,EAAmBO,EAAaiB,EAAIwB,EAAUvB,EAAY,OAEvD3B,EAAMkD,EAAUvB,KAGd9J,KAAKqI,EAAmBO,EAAawC,EAAG,OACxCrC,EAAMC,EAAOgC,EAAuBL,GAAkBD,KACrD,IACNC,yFAIF3B,IACAO,QAGI5J,GAAO7D,KAAK,KAcdyK,EAAY,SAAST,SACnBzG,GAAUyG,EAAO,SAASxG,SACzB2I,GAAc7E,KAAK9D,GACvB+J,EAAO/J,EAAO3D,MAAM,GAAGgB,eACvB2C,KAeCgG,EAAU,SAASQ,SACjBzG,GAAUyG,EAAO,SAASxG,SACzB4I,GAAc9E,KAAK9D,GACvB,OAAS2K,EAAO3K,GAChBA,KAOC+F,WAMM,qBASA3F,SACA4I,UAEDe,SACAY,UACC3E,YACEiB,GC5VDrB,KA2IPN,EAAY,kIACZC,EAA4C,GAAI1D,MAAM,SAAU,KAAOhF,UAoHvE4J,EAAO,WACPC,GAAO,cACPC,GAAO,gBAEPE,GAAO,yBI1VPmF,WACI,mBAEI,QAEL,SAAUvK,EAA0BwD,SAEtCxD,GAAWW,SACJ7C,MAAQkC,EAAWlC,OAAS,+BAGjCkC,aAGI,SAAUA,EAA0BwD,MACzCwD,GAAqD,UAA5CrH,OAAOK,EAAWM,QAAQ1E,oBAGrCoE,GAAW+D,QAAUiD,EAAS,IAAM,KAA2B,KAApBhH,EAAW+D,SAC9CA,KAAO3I,WAId4E,EAAWa,SACJA,KAAO,KAOZb,IC9BHuK,WACI,mBACIC,GAAKnG,iBACVmG,GAAKlH,gBACDkH,GAAKjF,WJKZgF,WACI,iBAEI,QAEL,SAAUvK,EAA0BwD,MACrCuD,GAAe/G,WAGRgH,OAASF,EAASC,KAGlB0D,cAAgB1D,EAAalG,MAAQ,MAAQkG,EAAa/F,MAAQ,IAAM+F,EAAa/F,MAAQ,MAC7FH,KAAOzF,YACP4F,MAAQ5F,UAEd2L,aAGI,SAAUA,EAA2BvD,MAE5CuD,EAAahD,QAAU+C,EAASC,GAAgB,IAAM,KAA6B,KAAtBA,EAAahD,SAChEA,KAAO3I,WAIc,iBAAxB2L,GAAaC,WACV1G,OAAUyG,EAAaC,OAAS,MAAQ,OACxCA,OAAS5L,WAInB2L,EAAa0D,aAAc,OACR1D,EAAa0D,aAAahP,MAAM,cAA/CoF,EADuB6J,EAAA,GACjB1J,EADiB0J,EAAA,KAEjB7J,KAAQA,GAAiB,MAATA,EAAeA,EAAOzF,YACtC4F,MAAQA,IACRyJ,aAAerP,mBAIhB8F,SAAW9F,UAEjB2L,IKnDHwD,WACI,iBACII,GAAGtG,iBACRsG,GAAGrH,gBACCqH,GAAGpF,WJSVqF,MAIAlN,GAAe,mGACfnB,GAAW,cACXC,GAAexB,EAAOA,EAAO,sBAA6BuB,GAAWA,GAAW,IAAMA,GAAWA,IAAY,IAAMvB,EAAO,0BAAiCuB,GAAWA,IAAY,IAAMvB,EAAO,IAAMuB,GAAWA,KAehNsO,GAAUxQ,EADA,6DACe,aAqBzBgG,GAAa,GAAI1C,QAAOD,GAAc,KACtC6C,GAAc,GAAI5C,QAAOnB,GAAc,KACvCsO,GAAiB,GAAInN,QAAOtD,EAAM,MAzBxB,wDAyBwC,QAAS,QAASwQ,IAAU,KAE9EE,GAAa,GAAIpN,QAAOtD,EAAM,MAAOqD,GAjBrB,uCAiBmD,KACnEsN,GAAcD,GASdR,WACI,eAED,SAAUvK,EAA0BwD,MACrCyH,GAAmBjL,EACnBkL,EAAKD,EAAiBC,GAAMD,EAAiBpK,KAAOoK,EAAiBpK,KAAKpF,MAAM,aACrEoF,KAAOzF,UAEpB6P,EAAiBjK,MAAO,KAKtB,GAJDmK,IAAiB,EACfC,KACAC,EAAUJ,EAAiBjK,MAAMvF,MAAM,KAEpCX,EAAI,EAAGD,EAAKwQ,EAAQ1Q,OAAQG,EAAID,IAAMC,EAAG,IAC3CwQ,GAASD,EAAQvQ,GAAGW,MAAM,YAExB6P,EAAO,QACT,SAEC,GADCC,GAAUD,EAAO,GAAG7P,MAAM,KACvBX,EAAI,EAAGD,EAAK0Q,EAAQ5Q,OAAQG,EAAID,IAAMC,IAC3CmE,KAAKsM,EAAQzQ,cAGb,YACa0Q,QAAU3E,EAAkByE,EAAO,GAAI9H,aAEpD,SACaiI,KAAO5E,EAAkByE,EAAO,GAAI9H,oBAGpC,IACTqD,EAAkByE,EAAO,GAAI9H,IAAYqD,EAAkByE,EAAO,GAAI9H,IAK7E2H,IAAgBF,EAAiBG,QAAUA,KAG/BpK,MAAQ5F,cAEpB,GAAIN,GAAI,EAAGD,EAAKqQ,EAAGvQ,OAAQG,EAAID,IAAMC,EAAG,IACtC4Q,GAAOR,EAAGpQ,GAAGW,MAAM,UAEpB,GAAKoL,EAAkB6E,EAAK,IAE5BlI,EAAQY,iBAQP,GAAKyC,EAAkB6E,EAAK,GAAIlI,GAAS5H,yBALxC,GAAK0I,EAASC,QAAQsC,EAAkB6E,EAAK,GAAIlI,GAAS5H,eAC9D,MAAO4I,KACS1G,MAAQmN,EAAiBnN,OAAS,2EAA6E0G,IAM/H1J,GAAK4Q,EAAK3Q,KAAK,WAGZkQ,cAGI,SAAUA,EAAmCzH,MAClDxD,GAAaiL,EACbC,EAAKpP,EAAQmP,EAAiBC,OAChCA,EAAI,KACF,GAAIpQ,GAAI,EAAGD,EAAKqQ,EAAGvQ,OAAQG,EAAID,IAAMC,EAAG,IACtC6Q,GAAShM,OAAOuL,EAAGpQ,IACnB8Q,EAAQD,EAAO1F,YAAY,KAC3B4F,EAAaF,EAAO/Q,MAAM,EAAGgR,GAAQnN,QAAQ8B,GAAaL,GAAkBzB,QAAQ8B,GAAa1E,GAAa4C,QAAQqM,GAAgB5L,GACxI4M,EAASH,EAAO/Q,MAAMgR,EAAQ,SAItBpI,EAAQC,IAA2Ea,EAASkB,UAAUsG,GAAxFxH,EAASC,QAAQsC,EAAkBiF,EAAQtI,GAAS5H,eAC5E,MAAO4I,KACG1G,MAAQkC,EAAWlC,OAAS,wDAA2D0F,EAAQC,IAAgB,UAAV,SAAuB,kBAAoBe,IAGzJ1J,GAAK+Q,EAAY,IAAMC,IAGhBjL,KAAOqK,EAAGnQ,KAAK,QAGrBqQ,GAAUH,EAAiBG,QAAUH,EAAiBG,WAExDH,GAAiBO,UAASJ,EAAA,QAAqBH,EAAiBO,SAChEP,EAAiBQ,OAAML,EAAA,KAAkBH,EAAiBQ,SAExDjJ,UACD,GAAMuJ,KAAQX,GACdA,EAAQW,KAAUnB,GAAEmB,MAChB9M,KACN8M,EAAKtN,QAAQ8B,GAAaL,GAAkBzB,QAAQ8B,GAAa1E,GAAa4C,QAAQsM,GAAY7L,GAClG,IACAkM,EAAQW,GAAMtN,QAAQ8B,GAAaL,GAAkBzB,QAAQ8B,GAAa1E,GAAa4C,QAAQuM,GAAa9L,UAI3GsD,GAAO7H,WACCqG,MAAQwB,EAAOzH,KAAK,MAGzBiF,IK/JHgM,GAAY,kBAIZzB,WACI,YAED,SAAUvK,EAA0BwD,MACrClC,GAAUtB,EAAWa,MAAQb,EAAWa,KAAKT,MAAM4L,IACrDC,EAAgBjM,KAEhBsB,EAAS,IACNhB,GAASkD,EAAQlD,QAAU2L,EAAc3L,QAAU,MACnD4L,EAAM5K,EAAQ,GAAG1F,cACjBuQ,EAAM7K,EAAQ,GACd8K,EAAe9L,EAAf,KAAyBkD,EAAQ0I,KAAOA,GACxChI,EAAgBC,EAAQiI,KAEhBF,IAAMA,IACNC,IAAMA,IACNtL,KAAOzF,UAEjB8I,MACaA,EAAcZ,MAAM2I,EAAezI,WAGtC1F,MAAQmO,EAAcnO,OAAS,+BAGvCmO,cAGI,SAAUA,EAA6BzI,MAC5ClD,GAASkD,EAAQlD,QAAU2L,EAAc3L,QAAU,MACnD4L,EAAMD,EAAcC,IACpBE,EAAe9L,EAAf,KAAyBkD,EAAQ0I,KAAOA,GACxChI,EAAgBC,EAAQiI,EAE1BlI,OACaA,EAAcqB,UAAU0G,EAAezI,OAGlD6I,GAAgBJ,EAChBE,EAAMF,EAAcE,aACZtL,MAAUqL,GAAO1I,EAAQ0I,KAAvC,IAA8CC,EAEvCE,ICxDHC,GAAO,2DAIP/B,WACI,iBAED,SAAU0B,EAA6BzI,MACxC+I,GAAiBN,WACRO,KAAOD,EAAeJ,MACtBA,IAAM/Q,UAEhBoI,EAAQwC,UAAcuG,EAAeC,MAASD,EAAeC,KAAKpM,MAAMkM,QAC7DxO,MAAQyO,EAAezO,OAAS,sBAGzCyO,aAGI,SAAUA,EAA+B/I,MAC9CyI,GAAgBM,WAERJ,KAAOI,EAAeC,MAAQ,IAAI5Q,cACzCqQ,GC5BT9H,GAAQqG,GAAKlK,QAAUkK,GAEvBrG,EACQsI,GAAMnM,QAAUmM,GAExBtI,EACQwG,GAAGrK,QAAUqK,GAErBxG,EACQuI,GAAIpM,QAAUoM,GAEtBvI,EACQwI,GAAOrM,QAAUqM,GAEzBxI,EACQyI,GAAItM,QAAUsM,GAEtBzI,EACQqI,GAAKlM,QAAUkM","file":"dist/es5/uri.all.min.js","sourcesContent":["export function merge(...sets:Array<string>):string {\n\tif (sets.length > 1) {\n\t\tsets[0] = sets[0].slice(0, -1);\n\t\tconst xl = sets.length - 1;\n\t\tfor (let x = 1; x < xl; ++x) {\n\t\t\tsets[x] = sets[x].slice(1, -1);\n\t\t}\n\t\tsets[xl] = sets[xl].slice(1);\n\t\treturn sets.join('');\n\t} else {\n\t\treturn sets[0];\n\t}\n}\n\nexport function subexp(str:string):string {\n\treturn \"(?:\" + str + \")\";\n}\n\nexport function typeOf(o:any):string {\n\treturn o === undefined ? \"undefined\" : (o === null ? \"null\" : Object.prototype.toString.call(o).split(\" \").pop().split(\"]\").shift().toLowerCase());\n}\n\nexport function toUpperCase(str:string):string {\n\treturn str.toUpperCase();\n}\n\nexport function toArray(obj:any):Array<any> {\n\treturn obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== \"number\" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : [];\n}\n\n\nexport function assign(target: object, source: any): any {\n\tconst obj = target as any;\n\tif (source) {\n\t\tfor (const key in source) {\n\t\t\tobj[key] = source[key];\n\t\t}\n\t}\n\treturn obj;\n}","import { URIRegExps } from \"./uri\";\nimport { merge, subexp } from \"./util\";\n\nexport function buildExps(isIRI:boolean):URIRegExps {\n\tconst\n\t\tALPHA$$ = \"[A-Za-z]\",\n\t\tCR$ = \"[\\\\x0D]\",\n\t\tDIGIT$$ = \"[0-9]\",\n\t\tDQUOTE$$ = \"[\\\\x22]\",\n\t\tHEXDIG$$ = merge(DIGIT$$, \"[A-Fa-f]\"),  //case-insensitive\n\t\tLF$$ = \"[\\\\x0A]\",\n\t\tSP$$ = \"[\\\\x20]\",\n\t\tPCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)),  //expanded\n\t\tGEN_DELIMS$$ = \"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\",\n\t\tSUB_DELIMS$$ = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",\n\t\tRESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),\n\t\tUCSCHAR$$ = isIRI ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\" : \"[]\",  //subset, excludes bidi control characters\n\t\tIPRIVATE$$ = isIRI ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\",  //subset\n\t\tUNRESERVED$$ = merge(ALPHA$$, DIGIT$$, \"[\\\\-\\\\.\\\\_\\\\~]\", UCSCHAR$$),\n\t\tSCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\") + \"*\"),\n\t\tUSERINFO$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\")) + \"*\"),\n\t\tDEC_OCTET$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"[1-9]\" + DIGIT$$) + \"|\" + DIGIT$$),\n\t\tDEC_OCTET_RELAXED$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"0?[1-9]\" + DIGIT$$) + \"|0?0?\" + DIGIT$$),  //relaxed parsing rules\n\t\tIPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$),\n\t\tH16$ = subexp(HEXDIG$$ + \"{1,4}\"),\n\t\tLS32$ = subexp(subexp(H16$ + \"\\\\:\" + H16$) + \"|\" + IPV4ADDRESS$),\n\t\tIPV6ADDRESS1$ = subexp(                                                            subexp(H16$ + \"\\\\:\") + \"{6}\" + LS32$), //                           6( h16 \":\" ) ls32\n\t\tIPV6ADDRESS2$ = subexp(                                                 \"\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{5}\" + LS32$), //                      \"::\" 5( h16 \":\" ) ls32\n\t\tIPV6ADDRESS3$ = subexp(subexp(                                 H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{4}\" + LS32$), //[               h16 ] \"::\" 4( h16 \":\" ) ls32\n\t\tIPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,1}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{3}\" + LS32$), //[ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32\n\t\tIPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,2}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{2}\" + LS32$), //[ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32\n\t\tIPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,3}\" + H16$) + \"?\\\\:\\\\:\" +        H16$ + \"\\\\:\"          + LS32$), //[ *3( h16 \":\" ) h16 ] \"::\"    h16 \":\"   ls32\n\t\tIPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,4}\" + H16$) + \"?\\\\:\\\\:\"                                + LS32$), //[ *4( h16 \":\" ) h16 ] \"::\"              ls32\n\t\tIPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,5}\" + H16$) + \"?\\\\:\\\\:\"                                + H16$ ), //[ *5( h16 \":\" ) h16 ] \"::\"              h16\n\t\tIPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,6}\" + H16$) + \"?\\\\:\\\\:\"                                       ), //[ *6( h16 \":\" ) h16 ] \"::\"\n\t\tIPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join(\"|\")),\n\t\tZONEID$ = subexp(subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$) + \"+\"),  //RFC 6874\n\t\tIPV6ADDRZ$ = subexp(IPV6ADDRESS$ + \"\\\\%25\" + ZONEID$),  //RFC 6874\n\t\tIPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + ZONEID$),  //RFC 6874, with relaxed parsing rules\n\t\tIPVFUTURE$ = subexp(\"[vV]\" + HEXDIG$$ + \"+\\\\.\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"),\n\t\tIP_LITERAL$ = subexp(\"\\\\[\" + subexp(IPV6ADDRZ_RELAXED$ + \"|\" + IPV6ADDRESS$ + \"|\" + IPVFUTURE$) + \"\\\\]\"),  //RFC 6874\n\t\tREG_NAME$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$)) + \"*\"),\n\t\tHOST$ = subexp(IP_LITERAL$ + \"|\" + IPV4ADDRESS$ + \"(?!\" + REG_NAME$ + \")\" + \"|\" + REG_NAME$),\n\t\tPORT$ = subexp(DIGIT$$ + \"*\"),\n\t\tAUTHORITY$ = subexp(subexp(USERINFO$ + \"@\") + \"?\" + HOST$ + subexp(\"\\\\:\" + PORT$) + \"?\"),\n\t\tPCHAR$ = subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@]\")),\n\t\tSEGMENT$ = subexp(PCHAR$ + \"*\"),\n\t\tSEGMENT_NZ$ = subexp(PCHAR$ + \"+\"),\n\t\tSEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\@]\")) + \"+\"),\n\t\tPATH_ABEMPTY$ = subexp(subexp(\"\\\\/\" + SEGMENT$) + \"*\"),\n\t\tPATH_ABSOLUTE$ = subexp(\"\\\\/\" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + \"?\"),  //simplified\n\t\tPATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$),  //simplified\n\t\tPATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$),  //simplified\n\t\tPATH_EMPTY$ = \"(?!\" + PCHAR$ + \")\",\n\t\tPATH$ = subexp(PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tQUERY$ = subexp(subexp(PCHAR$ + \"|\" + merge(\"[\\\\/\\\\?]\", IPRIVATE$$)) + \"*\"),\n\t\tFRAGMENT$ = subexp(subexp(PCHAR$ + \"|[\\\\/\\\\?]\") + \"*\"),\n\t\tHIER_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tURI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tRELATIVE_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$),\n\t\tRELATIVE$ = subexp(RELATIVE_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tURI_REFERENCE$ = subexp(URI$ + \"|\" + RELATIVE$),\n\t\tABSOLUTE_URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\"),\n\n\t\tGENERIC_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tRELATIVE_REF$ = \"^(){0}\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tABSOLUTE_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?$\",\n\t\tSAMEDOC_REF$ = \"^\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tAUTHORITY_REF$ = \"^\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?$\"\n\t;\n\n\treturn {\n\t\tNOT_SCHEME : new RegExp(merge(\"[^]\", ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\"), \"g\"),\n\t\tNOT_USERINFO : new RegExp(merge(\"[^\\\\%\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_HOST : new RegExp(merge(\"[^\\\\%\\\\[\\\\]\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH : new RegExp(merge(\"[^\\\\%\\\\/\\\\:\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH_NOSCHEME : new RegExp(merge(\"[^\\\\%\\\\/\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_QUERY : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\", IPRIVATE$$), \"g\"),\n\t\tNOT_FRAGMENT : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\"), \"g\"),\n\t\tESCAPE : new RegExp(merge(\"[^]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tUNRESERVED : new RegExp(UNRESERVED$$, \"g\"),\n\t\tOTHER_CHARS : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, RESERVED$$), \"g\"),\n\t\tPCT_ENCODED : new RegExp(PCT_ENCODED$, \"g\"),\n\t\tIPV4ADDRESS : new RegExp(\"^(\" + IPV4ADDRESS$ + \")$\"),\n\t\tIPV6ADDRESS : new RegExp(\"^\\\\[?(\" + IPV6ADDRESS$ + \")\" + subexp(subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + \"(\" + ZONEID$ + \")\") + \"?\\\\]?$\")  //RFC 6874, with relaxed parsing rules\n\t};\n}\n\nexport default buildExps(false);\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7E]/; // non-ASCII chars\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, fn) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = fn(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(string, fn) {\n\tconst parts = string.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tstring = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tstring = string.replace(regexSeparators, '\\x2E');\n\tconst labels = string.split('.');\n\tconst encoded = map(labels, fn).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = array => String.fromCodePoint(...array);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint - 0x30 < 0x0A) {\n\t\treturn codePoint - 0x16;\n\t}\n\tif (codePoint - 0x41 < 0x1A) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint - 0x61 < 0x1A) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t//  0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tlet oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tlet inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tlet basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue == n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.1.0',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport default punycode;\n","/**\n * URI.js\n *\n * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.\n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/uri-js\n */\n\n/**\n * Copyright 2011 Gary Court. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *    1. Redistributions of source code must retain the above copyright notice, this list of\n *       conditions and the following disclaimer.\n *\n *    2. Redistributions in binary form must reproduce the above copyright notice, this list\n *       of conditions and the following disclaimer in the documentation and/or other materials\n *       provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation are those of the\n * authors and should not be interpreted as representing official policies, either expressed\n * or implied, of Gary Court.\n */\n\nimport URI_PROTOCOL from \"./regexps-uri\";\nimport IRI_PROTOCOL from \"./regexps-iri\";\nimport punycode from \"punycode\";\nimport { toUpperCase, typeOf, assign } from \"./util\";\n\nexport interface URIComponents {\n\tscheme?:string;\n\tuserinfo?:string;\n\thost?:string;\n\tport?:number|string;\n\tpath?:string;\n\tquery?:string;\n\tfragment?:string;\n\treference?:string;\n\terror?:string;\n}\n\nexport interface URIOptions {\n\tscheme?:string;\n\treference?:string;\n\ttolerant?:boolean;\n\tabsolutePath?:boolean;\n\tiri?:boolean;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n}\n\nexport interface URISchemeHandler<Components extends URIComponents = URIComponents, Options extends URIOptions = URIOptions, ParentComponents extends URIComponents = URIComponents> {\n\tscheme:string;\n\tparse(components:ParentComponents, options:Options):Components;\n\tserialize(components:Components, options:Options):ParentComponents;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n\tabsolutePath?:boolean;\n}\n\nexport interface URIRegExps {\n\tNOT_SCHEME : RegExp,\n\tNOT_USERINFO : RegExp,\n\tNOT_HOST : RegExp,\n\tNOT_PATH : RegExp,\n\tNOT_PATH_NOSCHEME : RegExp,\n\tNOT_QUERY : RegExp,\n\tNOT_FRAGMENT : RegExp,\n\tESCAPE : RegExp,\n\tUNRESERVED : RegExp,\n\tOTHER_CHARS : RegExp,\n\tPCT_ENCODED : RegExp,\n\tIPV4ADDRESS : RegExp,\n\tIPV6ADDRESS : RegExp,\n}\n\nexport const SCHEMES:{[scheme:string]:URISchemeHandler} = {};\n\nexport function pctEncChar(chr:string):string {\n\tconst c = chr.charCodeAt(0);\n\tlet e:string;\n\n\tif (c < 16) e = \"%0\" + c.toString(16).toUpperCase();\n\telse if (c < 128) e = \"%\" + c.toString(16).toUpperCase();\n\telse if (c < 2048) e = \"%\" + ((c >> 6) | 192).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\telse e = \"%\" + ((c >> 12) | 224).toString(16).toUpperCase() + \"%\" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\n\treturn e;\n}\n\nexport function pctDecChars(str:string):string {\n\tlet newStr = \"\";\n\tlet i = 0;\n\tconst il = str.length;\n\n\twhile (i < il) {\n\t\tconst c = parseInt(str.substr(i + 1, 2), 16);\n\n\t\tif (c < 128) {\n\t\t\tnewStr += String.fromCharCode(c);\n\t\t\ti += 3;\n\t\t}\n\t\telse if (c >= 194 && c < 224) {\n\t\t\tif ((il - i) >= 6) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 6);\n\t\t\t}\n\t\t\ti += 6;\n\t\t}\n\t\telse if (c >= 224) {\n\t\t\tif ((il - i) >= 9) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tconst c3 = parseInt(str.substr(i + 7, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 9);\n\t\t\t}\n\t\t\ti += 9;\n\t\t}\n\t\telse {\n\t\t\tnewStr += str.substr(i, 3);\n\t\t\ti += 3;\n\t\t}\n\t}\n\n\treturn newStr;\n}\n\nfunction _normalizeComponentEncoding(components:URIComponents, protocol:URIRegExps) {\n\tfunction decodeUnreserved(str:string):string {\n\t\tconst decStr = pctDecChars(str);\n\t\treturn (!decStr.match(protocol.UNRESERVED) ? str : decStr);\n\t}\n\n\tif (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, \"\");\n\tif (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\n\treturn components;\n};\n\nfunction _stripLeadingZeros(str:string):string {\n\treturn str.replace(/^0*(.*)/, \"$1\") || \"0\";\n}\n\nfunction _normalizeIPv4(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV4ADDRESS) || [];\n\tconst [, address] = matches;\n\t\n\tif (address) {\n\t\treturn address.split(\".\").map(_stripLeadingZeros).join(\".\");\n\t} else {\n\t\treturn host;\n\t}\n}\n\nfunction _normalizeIPv6(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV6ADDRESS) || [];\n\tconst [, address, zone] = matches;\n\n\tif (address) {\n\t\tconst [last, first] = address.toLowerCase().split('::').reverse();\n\t\tconst firstFields = first ? first.split(\":\").map(_stripLeadingZeros) : [];\n\t\tconst lastFields = last.split(\":\").map(_stripLeadingZeros);\n\t\tconst isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);\n\t\tconst fieldCount = isLastFieldIPv4Address ? 7 : 8;\n\t\tconst lastFieldsStart = lastFields.length - fieldCount;\n\t\tconst fields = Array<string>(fieldCount);\n\n\t\tfor (let x = 0; x < fieldCount; ++x) {\n\t\t\tfields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';\n\t\t}\n\n\t\tif (isLastFieldIPv4Address) {\n\t\t\tfields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);\n\t\t}\n\n\t\tconst allZeroFields = fields.reduce<Array<{index:number,length:number}>>((acc, field, index) => {\n\t\t\tif (!field || field === \"0\") {\n\t\t\t\tconst lastLongest = acc[acc.length - 1];\n\t\t\t\tif (lastLongest && lastLongest.index + lastLongest.length === index) {\n\t\t\t\t\tlastLongest.length++;\n\t\t\t\t} else {\n\t\t\t\t\tacc.push({ index, length : 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, []);\n\n\t\tconst longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0];\n\n\t\tlet newHost:string;\n\t\tif (longestZeroFields && longestZeroFields.length > 1) {\n\t\t\tconst newFirst = fields.slice(0, longestZeroFields.index) ;\n\t\t\tconst newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);\n\t\t\tnewHost = newFirst.join(\":\") + \"::\" + newLast.join(\":\");\n\t\t} else {\n\t\t\tnewHost = fields.join(\":\");\n\t\t}\n\n\t\tif (zone) {\n\t\t\tnewHost += \"%\" + zone;\n\t\t}\n\n\t\treturn newHost;\n\t} else {\n\t\treturn host;\n\t}\n}\n\nconst URI_PARSE = /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?(\\[[^\\/?#\\]]+\\]|[^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n|\\r)*))?/i;\nconst NO_MATCH_IS_UNDEFINED = (<RegExpMatchArray>(\"\").match(/(){0}/))[1] === undefined;\n\nexport function parse(uriString:string, options:URIOptions = {}):URIComponents {\n\tconst components:URIComponents = {};\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\n\tif (options.reference === \"suffix\") uriString = (options.scheme ? options.scheme + \":\" : \"\") + \"//\" + uriString;\n\n\tconst matches = uriString.match(URI_PARSE);\n\n\tif (matches) {\n\t\tif (NO_MATCH_IS_UNDEFINED) {\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1];\n\t\t\tcomponents.userinfo = matches[3];\n\t\t\tcomponents.host = matches[4];\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = matches[7];\n\t\t\tcomponents.fragment = matches[8];\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = matches[5];\n\t\t\t}\n\t\t} else {  //IE FIX for improper RegExp matching\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1] || undefined;\n\t\t\tcomponents.userinfo = (uriString.indexOf(\"@\") !== -1 ? matches[3] : undefined);\n\t\t\tcomponents.host = (uriString.indexOf(\"//\") !== -1 ? matches[4] : undefined);\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = (uriString.indexOf(\"?\") !== -1 ? matches[7] : undefined);\n\t\t\tcomponents.fragment = (uriString.indexOf(\"#\") !== -1 ? matches[8] : undefined);\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = (uriString.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/) ? matches[4] : undefined);\n\t\t\t}\n\t\t}\n\n\t\tif (components.host) {\n\t\t\t//normalize IP hosts\n\t\t\tcomponents.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);\n\t\t}\n\n\t\t//determine reference type\n\t\tif (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {\n\t\t\tcomponents.reference = \"same-document\";\n\t\t} else if (components.scheme === undefined) {\n\t\t\tcomponents.reference = \"relative\";\n\t\t} else if (components.fragment === undefined) {\n\t\t\tcomponents.reference = \"absolute\";\n\t\t} else {\n\t\t\tcomponents.reference = \"uri\";\n\t\t}\n\n\t\t//check for reference errors\n\t\tif (options.reference && options.reference !== \"suffix\" && options.reference !== components.reference) {\n\t\t\tcomponents.error = components.error || \"URI is not a \" + options.reference + \" reference.\";\n\t\t}\n\n\t\t//find scheme handler\n\t\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t\t//check if scheme can't handle IRIs\n\t\tif (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\n\t\t\t//if host component is a domain name\n\t\t\tif (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\tcomponents.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//convert IRI -> URI\n\t\t\t_normalizeComponentEncoding(components, URI_PROTOCOL);\n\t\t} else {\n\t\t\t//normalize encodings\n\t\t\t_normalizeComponentEncoding(components, protocol);\n\t\t}\n\n\t\t//perform scheme specific parsing\n\t\tif (schemeHandler && schemeHandler.parse) {\n\t\t\tschemeHandler.parse(components, options);\n\t\t}\n\t} else {\n\t\tcomponents.error = components.error || \"URI can not be parsed.\";\n\t}\n\n\treturn components;\n};\n\nfunction _recomposeAuthority(components:URIComponents, options:URIOptions):string|undefined {\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array<string> = [];\n\n\tif (components.userinfo !== undefined) {\n\t\turiTokens.push(components.userinfo);\n\t\turiTokens.push(\"@\");\n\t}\n\n\tif (components.host !== undefined) {\n\t\t//normalize IP hosts, add brackets and escape zone separator for IPv6\n\t\turiTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => \"[\" + $1 + ($2 ? \"%25\" + $2 : \"\") + \"]\"));\n\t}\n\n\tif (typeof components.port === \"number\" || typeof components.port === \"string\") {\n\t\turiTokens.push(\":\");\n\t\turiTokens.push(String(components.port));\n\t}\n\n\treturn uriTokens.length ? uriTokens.join(\"\") : undefined;\n};\n\nconst RDS1 = /^\\.\\.?\\//;\nconst RDS2 = /^\\/\\.(\\/|$)/;\nconst RDS3 = /^\\/\\.\\.(\\/|$)/;\nconst RDS4 = /^\\.\\.?$/;\nconst RDS5 = /^\\/?(?:.|\\n)*?(?=\\/|$)/;\n\nexport function removeDotSegments(input:string):string {\n\tconst output:Array<string> = [];\n\n\twhile (input.length) {\n\t\tif (input.match(RDS1)) {\n\t\t\tinput = input.replace(RDS1, \"\");\n\t\t} else if (input.match(RDS2)) {\n\t\t\tinput = input.replace(RDS2, \"/\");\n\t\t} else if (input.match(RDS3)) {\n\t\t\tinput = input.replace(RDS3, \"/\");\n\t\t\toutput.pop();\n\t\t} else if (input === \".\" || input === \"..\") {\n\t\t\tinput = \"\";\n\t\t} else {\n\t\t\tconst im = input.match(RDS5);\n\t\t\tif (im) {\n\t\t\t\tconst s = im[0];\n\t\t\t\tinput = input.slice(s.length);\n\t\t\t\toutput.push(s);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unexpected dot segment condition\");\n\t\t\t}\n\t\t}\n\t}\n\n\treturn output.join(\"\");\n};\n\nexport function serialize(components:URIComponents, options:URIOptions = {}):string {\n\tconst protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array<string> = [];\n\n\t//find scheme handler\n\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t//perform scheme specific serialization\n\tif (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);\n\n\tif (components.host) {\n\t\t//if host component is an IPv6 address\n\t\tif (protocol.IPV6ADDRESS.test(components.host)) {\n\t\t\t//TODO: normalize IPv6 address as per RFC 5952\n\t\t}\n\n\t\t//if host component is a domain name\n\t\telse if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) {\n\t\t\t//convert IDN via punycode\n\t\t\ttry {\n\t\t\t\tcomponents.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host));\n\t\t\t} catch (e) {\n\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t}\n\t\t}\n\t}\n\n\t//normalize encoding\n\t_normalizeComponentEncoding(components, protocol);\n\n\tif (options.reference !== \"suffix\" && components.scheme) {\n\t\turiTokens.push(components.scheme);\n\t\turiTokens.push(\":\");\n\t}\n\n\tconst authority = _recomposeAuthority(components, options);\n\tif (authority !== undefined) {\n\t\tif (options.reference !== \"suffix\") {\n\t\t\turiTokens.push(\"//\");\n\t\t}\n\n\t\turiTokens.push(authority);\n\n\t\tif (components.path && components.path.charAt(0) !== \"/\") {\n\t\t\turiTokens.push(\"/\");\n\t\t}\n\t}\n\n\tif (components.path !== undefined) {\n\t\tlet s = components.path;\n\n\t\tif (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\n\t\t\ts = removeDotSegments(s);\n\t\t}\n\n\t\tif (authority === undefined) {\n\t\t\ts = s.replace(/^\\/\\//, \"/%2F\");  //don't allow the path to start with \"//\"\n\t\t}\n\n\t\turiTokens.push(s);\n\t}\n\n\tif (components.query !== undefined) {\n\t\turiTokens.push(\"?\");\n\t\turiTokens.push(components.query);\n\t}\n\n\tif (components.fragment !== undefined) {\n\t\turiTokens.push(\"#\");\n\t\turiTokens.push(components.fragment);\n\t}\n\n\treturn uriTokens.join(\"\");  //merge tokens into a string\n};\n\nexport function resolveComponents(base:URIComponents, relative:URIComponents, options:URIOptions = {}, skipNormalization?:boolean):URIComponents {\n\tconst target:URIComponents = {};\n\n\tif (!skipNormalization) {\n\t\tbase = parse(serialize(base, options), options);  //normalize base components\n\t\trelative = parse(serialize(relative, options), options);  //normalize relative components\n\t}\n\toptions = options || {};\n\n\tif (!options.tolerant && relative.scheme) {\n\t\ttarget.scheme = relative.scheme;\n\t\t//target.authority = relative.authority;\n\t\ttarget.userinfo = relative.userinfo;\n\t\ttarget.host = relative.host;\n\t\ttarget.port = relative.port;\n\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\ttarget.query = relative.query;\n\t} else {\n\t\tif (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\n\t\t\t//target.authority = relative.authority;\n\t\t\ttarget.userinfo = relative.userinfo;\n\t\t\ttarget.host = relative.host;\n\t\t\ttarget.port = relative.port;\n\t\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\t\ttarget.query = relative.query;\n\t\t} else {\n\t\t\tif (!relative.path) {\n\t\t\t\ttarget.path = base.path;\n\t\t\t\tif (relative.query !== undefined) {\n\t\t\t\t\ttarget.query = relative.query;\n\t\t\t\t} else {\n\t\t\t\t\ttarget.query = base.query;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (relative.path.charAt(0) === \"/\") {\n\t\t\t\t\ttarget.path = removeDotSegments(relative.path);\n\t\t\t\t} else {\n\t\t\t\t\tif ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\n\t\t\t\t\t\ttarget.path = \"/\" + relative.path;\n\t\t\t\t\t} else if (!base.path) {\n\t\t\t\t\t\ttarget.path = relative.path;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.path = base.path.slice(0, base.path.lastIndexOf(\"/\") + 1) + relative.path;\n\t\t\t\t\t}\n\t\t\t\t\ttarget.path = removeDotSegments(target.path);\n\t\t\t\t}\n\t\t\t\ttarget.query = relative.query;\n\t\t\t}\n\t\t\t//target.authority = base.authority;\n\t\t\ttarget.userinfo = base.userinfo;\n\t\t\ttarget.host = base.host;\n\t\t\ttarget.port = base.port;\n\t\t}\n\t\ttarget.scheme = base.scheme;\n\t}\n\n\ttarget.fragment = relative.fragment;\n\n\treturn target;\n};\n\nexport function resolve(baseURI:string, relativeURI:string, options?:URIOptions):string {\n\tconst schemelessOptions = assign({ scheme : 'null' }, options);\n\treturn serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);\n};\n\nexport function normalize(uri:string, options?:URIOptions):string;\nexport function normalize(uri:URIComponents, options?:URIOptions):URIComponents;\nexport function normalize(uri:any, options?:URIOptions):any {\n\tif (typeof uri === \"string\") {\n\t\turi = serialize(parse(uri, options), options);\n\t} else if (typeOf(uri) === \"object\") {\n\t\turi = parse(serialize(<URIComponents>uri, options), options);\n\t}\n\n\treturn uri;\n};\n\nexport function equal(uriA:string, uriB:string, options?: URIOptions):boolean;\nexport function equal(uriA:URIComponents, uriB:URIComponents, options?:URIOptions):boolean;\nexport function equal(uriA:any, uriB:any, options?:URIOptions):boolean {\n\tif (typeof uriA === \"string\") {\n\t\turiA = serialize(parse(uriA, options), options);\n\t} else if (typeOf(uriA) === \"object\") {\n\t\turiA = serialize(<URIComponents>uriA, options);\n\t}\n\n\tif (typeof uriB === \"string\") {\n\t\turiB = serialize(parse(uriB, options), options);\n\t} else if (typeOf(uriB) === \"object\") {\n\t\turiB = serialize(<URIComponents>uriB, options);\n\t}\n\n\treturn uriA === uriB;\n};\n\nexport function escapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar);\n};\n\nexport function unescapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars);\n};\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nexport interface WSComponents extends URIComponents {\n\tresourceName?: string;\n\tsecure?: boolean;\n}\n\nfunction isSecure(wsComponents:WSComponents):boolean {\n\treturn typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === \"wss\";\n}\n\n//RFC 6455\nconst handler:URISchemeHandler = {\n\tscheme : \"ws\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):WSComponents {\n\t\tconst wsComponents = components as WSComponents;\n\n\t\t//indicate if the secure flag is set\n\t\twsComponents.secure = isSecure(wsComponents);\n\n\t\t//construct resouce name\n\t\twsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');\n\t\twsComponents.path = undefined;\n\t\twsComponents.query = undefined;\n\n\t\treturn wsComponents;\n\t},\n\n\tserialize : function (wsComponents:WSComponents, options:URIOptions):URIComponents {\n\t\t//normalize the default port\n\t\tif (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === \"\") {\n\t\t\twsComponents.port = undefined;\n\t\t}\n\n\t\t//ensure scheme matches secure flag\n\t\tif (typeof wsComponents.secure === 'boolean') {\n\t\t\twsComponents.scheme = (wsComponents.secure ? 'wss' : 'ws');\n\t\t\twsComponents.secure = undefined;\n\t\t}\n\n\t\t//reconstruct path from resource name\n\t\tif (wsComponents.resourceName) {\n\t\t\tconst [path, query] = wsComponents.resourceName.split('?');\n\t\t\twsComponents.path = (path && path !== '/' ? path : undefined);\n\t\t\twsComponents.query = query;\n\t\t\twsComponents.resourceName = undefined;\n\t\t}\n\n\t\t//forbid fragment component\n\t\twsComponents.fragment = undefined;\n\n\t\treturn wsComponents;\n\t}\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, pctDecChars, unescapeComponent } from \"../uri\";\nimport punycode from \"punycode\";\nimport { merge, subexp, toUpperCase, toArray } from \"../util\";\n\nexport interface MailtoHeaders {\n\t[hfname:string]:string\n}\n\nexport interface MailtoComponents extends URIComponents {\n\tto:Array<string>,\n\theaders?:MailtoHeaders,\n\tsubject?:string,\n\tbody?:string\n}\n\nconst O:MailtoHeaders = {};\nconst isIRI = true;\n\n//RFC 3986\nconst UNRESERVED$$ = \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\" + (isIRI ? \"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\" : \"\") + \"]\";\nconst HEXDIG$$ = \"[0-9A-Fa-f]\";  //case-insensitive\nconst PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$));  //expanded\n\n//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =\n//const ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\#\\\\$\\\\%\\\\&\\\\'\\\\*\\\\+\\\\-\\\\/\\\\=\\\\?\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QTEXT$$ = \"[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F]\";  //(%d1-8 / %d11-12 / %d14-31 / %d127)\n//const QTEXT$$ = merge(\"[\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7E]\", OBS_QTEXT$$);  //%d33 / %d35-91 / %d93-126 / obs-qtext\n//const VCHAR$$ = \"[\\\\x21-\\\\x7E]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QP$ = subexp(\"\\\\\\\\\" + merge(\"[\\\\x00\\\\x0D\\\\x0A]\", OBS_QTEXT$$));  //%d0 / CR / LF / obs-qtext\n//const FWS$ = subexp(subexp(WSP$$ + \"*\" + \"\\\\x0D\\\\x0A\") + \"?\" + WSP$$ + \"+\");\n//const QUOTED_PAIR$ = subexp(subexp(\"\\\\\\\\\" + subexp(VCHAR$$ + \"|\" + WSP$$)) + \"|\" + OBS_QP$);\n//const QUOTED_STRING$ = subexp('\\\\\"' + subexp(FWS$ + \"?\" + QCONTENT$) + \"*\" + FWS$ + \"?\" + '\\\\\"');\nconst ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\nconst QTEXT$$ = \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\";\nconst VCHAR$$ = merge(QTEXT$$, \"[\\\\\\\"\\\\\\\\]\");\nconst DOT_ATOM_TEXT$ = subexp(ATEXT$$ + \"+\" + subexp(\"\\\\.\" + ATEXT$$ + \"+\") + \"*\");\nconst QUOTED_PAIR$ = subexp(\"\\\\\\\\\" + VCHAR$$);\nconst QCONTENT$ = subexp(QTEXT$$ + \"|\" + QUOTED_PAIR$);\nconst QUOTED_STRING$ = subexp('\\\\\"' + QCONTENT$ + \"*\" + '\\\\\"');\n\n//RFC 6068\nconst DTEXT_NO_OBS$$ = \"[\\\\x21-\\\\x5A\\\\x5E-\\\\x7E]\";  //%d33-90 / %d94-126\nconst SOME_DELIMS$$ = \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\";\nconst QCHAR$ = subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$ + \"|\" + SOME_DELIMS$$);\nconst DOMAIN$ = subexp(DOT_ATOM_TEXT$ + \"|\" + \"\\\\[\" + DTEXT_NO_OBS$$ + \"*\" + \"\\\\]\");\nconst LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + \"|\" + QUOTED_STRING$);\nconst ADDR_SPEC$ = subexp(LOCAL_PART$ + \"\\\\@\" + DOMAIN$);\nconst TO$ = subexp(ADDR_SPEC$ + subexp(\"\\\\,\" + ADDR_SPEC$) + \"*\");\nconst HFNAME$ = subexp(QCHAR$ + \"*\");\nconst HFVALUE$ = HFNAME$;\nconst HFIELD$ = subexp(HFNAME$ + \"\\\\=\" + HFVALUE$);\nconst HFIELDS2$ = subexp(HFIELD$ + subexp(\"\\\\&\" + HFIELD$) + \"*\");\nconst HFIELDS$ = subexp(\"\\\\?\" + HFIELDS2$);\nconst MAILTO_URI = new RegExp(\"^mailto\\\\:\" + TO$ + \"?\" + HFIELDS$ + \"?$\");\n\nconst UNRESERVED = new RegExp(UNRESERVED$$, \"g\");\nconst PCT_ENCODED = new RegExp(PCT_ENCODED$, \"g\");\nconst NOT_LOCAL_PART = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", '[\\\\\"]', VCHAR$$), \"g\");\nconst NOT_DOMAIN = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", \"[\\\\[]\", DTEXT_NO_OBS$$, \"[\\\\]]\"), \"g\");\nconst NOT_HFNAME = new RegExp(merge(\"[^]\", UNRESERVED$$, SOME_DELIMS$$), \"g\");\nconst NOT_HFVALUE = NOT_HFNAME;\nconst TO = new RegExp(\"^\" + TO$ + \"$\");\nconst HFIELDS = new RegExp(\"^\" + HFIELDS2$ + \"$\");\n\nfunction decodeUnreserved(str:string):string {\n\tconst decStr = pctDecChars(str);\n\treturn (!decStr.match(UNRESERVED) ? str : decStr);\n}\n\nconst handler:URISchemeHandler<MailtoComponents> =  {\n\tscheme : \"mailto\",\n\n\tparse : function (components:URIComponents, options:URIOptions):MailtoComponents {\n\t\tconst mailtoComponents = components as MailtoComponents;\n\t\tconst to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(\",\") : []);\n\t\tmailtoComponents.path = undefined;\n\n\t\tif (mailtoComponents.query) {\n\t\t\tlet unknownHeaders = false\n\t\t\tconst headers:MailtoHeaders = {};\n\t\t\tconst hfields = mailtoComponents.query.split(\"&\");\n\n\t\t\tfor (let x = 0, xl = hfields.length; x < xl; ++x) {\n\t\t\t\tconst hfield = hfields[x].split(\"=\");\n\n\t\t\t\tswitch (hfield[0]) {\n\t\t\t\t\tcase \"to\":\n\t\t\t\t\t\tconst toAddrs = hfield[1].split(\",\");\n\t\t\t\t\t\tfor (let x = 0, xl = toAddrs.length; x < xl; ++x) {\n\t\t\t\t\t\t\tto.push(toAddrs[x]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"subject\":\n\t\t\t\t\t\tmailtoComponents.subject = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"body\":\n\t\t\t\t\t\tmailtoComponents.body = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tunknownHeaders = true;\n\t\t\t\t\t\theaders[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (unknownHeaders) mailtoComponents.headers = headers;\n\t\t}\n\n\t\tmailtoComponents.query = undefined;\n\n\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\tconst addr = to[x].split(\"@\");\n\n\t\t\taddr[0] = unescapeComponent(addr[0]);\n\n\t\t\tif (!options.unicodeSupport) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\taddr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tmailtoComponents.error = mailtoComponents.error || \"Email address's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddr[1] = unescapeComponent(addr[1], options).toLowerCase();\n\t\t\t}\n\n\t\t\tto[x] = addr.join(\"@\");\n\t\t}\n\n\t\treturn mailtoComponents;\n\t},\n\n\tserialize : function (mailtoComponents:MailtoComponents, options:URIOptions):URIComponents {\n\t\tconst components = mailtoComponents as URIComponents;\n\t\tconst to = toArray(mailtoComponents.to);\n\t\tif (to) {\n\t\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\t\tconst toAddr = String(to[x]);\n\t\t\t\tconst atIdx = toAddr.lastIndexOf(\"@\");\n\t\t\t\tconst localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);\n\t\t\t\tlet domain = toAddr.slice(atIdx + 1);\n\n\t\t\t\t//convert IDN via punycode\n\t\t\t\ttry {\n\t\t\t\t\tdomain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Email address's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t\t}\n\n\t\t\t\tto[x] = localPart + \"@\" + domain;\n\t\t\t}\n\n\t\t\tcomponents.path = to.join(\",\");\n\t\t}\n\n\t\tconst headers = mailtoComponents.headers = mailtoComponents.headers || {};\n\n\t\tif (mailtoComponents.subject) headers[\"subject\"] = mailtoComponents.subject;\n\t\tif (mailtoComponents.body) headers[\"body\"] = mailtoComponents.body;\n\n\t\tconst fields = [];\n\t\tfor (const name in headers) {\n\t\t\tif (headers[name] !== O[name]) {\n\t\t\t\tfields.push(\n\t\t\t\t\tname.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) +\n\t\t\t\t\t\"=\" +\n\t\t\t\t\theaders[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (fields.length) {\n\t\t\tcomponents.query = fields.join(\"&\");\n\t\t}\n\n\t\treturn components;\n\t}\n}\n\nexport default handler;","import { URIRegExps } from \"./uri\";\nimport { buildExps } from \"./regexps-uri\";\n\nexport default buildExps(true);\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"http\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\t//report missing host\n\t\tif (!components.host) {\n\t\t\tcomponents.error = components.error || \"HTTP URIs must have a host.\";\n\t\t}\n\n\t\treturn components;\n\t},\n\n\tserialize : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\tconst secure = String(components.scheme).toLowerCase() === \"https\";\n\n\t\t//normalize the default port\n\t\tif (components.port === (secure ? 443 : 80) || components.port === \"\") {\n\t\t\tcomponents.port = undefined;\n\t\t}\n\t\t\n\t\t//normalize the empty path\n\t\tif (!components.path) {\n\t\t\tcomponents.path = \"/\";\n\t\t}\n\n\t\t//NOTE: We do not parse query strings for HTTP URIs\n\t\t//as WWW Form Url Encoded query strings are part of the HTML4+ spec,\n\t\t//and not the HTTP spec.\n\n\t\treturn components;\n\t}\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport http from \"./http\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"https\",\n\tdomainHost : http.domainHost,\n\tparse : http.parse,\n\tserialize : http.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport ws from \"./ws\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"wss\",\n\tdomainHost : ws.domainHost,\n\tparse : ws.parse,\n\tserialize : ws.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, SCHEMES } from \"../uri\";\n\nexport interface URNComponents extends URIComponents {\n\tnid?:string;\n\tnss?:string;\n}\n\nexport interface URNOptions extends URIOptions {\n\tnid?:string;\n}\n\nconst NID$ = \"(?:[0-9A-Za-z][0-9A-Za-z\\\\-]{1,31})\";\nconst PCT_ENCODED$ = \"(?:\\\\%[0-9A-Fa-f]{2})\";\nconst TRANS$$ = \"[0-9A-Za-z\\\\(\\\\)\\\\+\\\\,\\\\-\\\\.\\\\:\\\\=\\\\@\\\\;\\\\$\\\\_\\\\!\\\\*\\\\'\\\\/\\\\?\\\\#]\";\nconst NSS$ = \"(?:(?:\" + PCT_ENCODED$ + \"|\" + TRANS$$ + \")+)\";\nconst URN_SCHEME = new RegExp(\"^urn\\\\:(\" + NID$ + \")$\");\nconst URN_PATH = new RegExp(\"^(\" + NID$ + \")\\\\:(\" + NSS$ + \")$\");\nconst URN_PARSE = /^([^\\:]+)\\:(.*)/;\nconst URN_EXCLUDED = /[\\x00-\\x20\\\\\\\"\\&\\<\\>\\[\\]\\^\\`\\{\\|\\}\\~\\x7F-\\xFF]/g;\n\n//RFC 2141\nconst handler:URISchemeHandler<URNComponents,URNOptions> = {\n\tscheme : \"urn\",\n\n\tparse : function (components:URIComponents, options:URNOptions):URNComponents {\n\t\tconst matches = components.path && components.path.match(URN_PARSE);\n\t\tlet urnComponents = components as URNComponents;\n\n\t\tif (matches) {\n\t\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\t\tconst nid = matches[1].toLowerCase();\n\t\t\tconst nss = matches[2];\n\t\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\t\turnComponents.nid = nid;\n\t\t\turnComponents.nss = nss;\n\t\t\turnComponents.path = undefined;\n\n\t\t\tif (schemeHandler) {\n\t\t\t\turnComponents = schemeHandler.parse(urnComponents, options) as URNComponents;\n\t\t\t}\n\t\t} else {\n\t\t\turnComponents.error = urnComponents.error || \"URN can not be parsed.\";\n\t\t}\n\n\t\treturn urnComponents;\n\t},\n\n\tserialize : function (urnComponents:URNComponents, options:URNOptions):URIComponents {\n\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\tconst nid = urnComponents.nid;\n\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\tif (schemeHandler) {\n\t\t\turnComponents = schemeHandler.serialize(urnComponents, options) as URNComponents;\n\t\t}\n\n\t\tconst uriComponents = urnComponents as URIComponents;\n\t\tconst nss = urnComponents.nss;\n\t\turiComponents.path = `${nid || options.nid}:${nss}`;\n\n\t\treturn uriComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { URNComponents } from \"./urn\";\nimport { SCHEMES } from \"../uri\";\n\nexport interface UUIDComponents extends URNComponents {\n\tuuid?: string;\n}\n\nconst UUID = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;\nconst UUID_PARSE = /^[0-9A-Fa-f\\-]{36}/;\n\n//RFC 4122\nconst handler:URISchemeHandler<UUIDComponents, URIOptions, URNComponents> = {\n\tscheme : \"urn:uuid\",\n\n\tparse : function (urnComponents:URNComponents, options:URIOptions):UUIDComponents {\n\t\tconst uuidComponents = urnComponents as UUIDComponents;\n\t\tuuidComponents.uuid = uuidComponents.nss;\n\t\tuuidComponents.nss = undefined;\n\n\t\tif (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {\n\t\t\tuuidComponents.error = uuidComponents.error || \"UUID is not valid.\";\n\t\t}\n\n\t\treturn uuidComponents;\n\t},\n\n\tserialize : function (uuidComponents:UUIDComponents, options:URIOptions):URNComponents {\n\t\tconst urnComponents = uuidComponents as URNComponents;\n\t\t//normalize UUID\n\t\turnComponents.nss = (uuidComponents.uuid || \"\").toLowerCase();\n\t\treturn urnComponents;\n\t},\n};\n\nexport default handler;","import { SCHEMES } from \"./uri\";\n\nimport http from \"./schemes/http\";\nSCHEMES[http.scheme] = http;\n\nimport https from \"./schemes/https\";\nSCHEMES[https.scheme] = https;\n\nimport ws from \"./schemes/ws\";\nSCHEMES[ws.scheme] = ws;\n\nimport wss from \"./schemes/wss\";\nSCHEMES[wss.scheme] = wss;\n\nimport mailto from \"./schemes/mailto\";\nSCHEMES[mailto.scheme] = mailto;\n\nimport urn from \"./schemes/urn\";\nSCHEMES[urn.scheme] = urn;\n\nimport uuid from \"./schemes/urn-uuid\";\nSCHEMES[uuid.scheme] = uuid;\n\nexport * from \"./uri\";\n"]}'use strict';
const url = require('url');
const prependHttp = require('prepend-http');

module.exports = (input, options) => {
	if (typeof input !== 'string') {
		throw new TypeError(`Expected \`url\` to be of type \`string\`, got \`${typeof input}\` instead.`);
	}

	const finalUrl = prependHttp(input, Object.assign({https: true}, options));
	return url.parse(finalUrl);
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "prepend-http": "^2.0.0"
  },
  "deprecated": false,
  "description": "Lax url.parse() with support for protocol-less URLs & IPs",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/url-parse-lax#readme",
  "license": "MIT",
  "name": "url-parse-lax",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/url-parse-lax.git"
  },
  "version": "3.0.0"
}[submodule "vendor/big-list-of-naughty-strings"]
	path = vendor/big-list-of-naughty-strings
	url = https://github.com/minimaxir/big-list-of-naughty-strings.git
Carl Xiong <xiongc05@gmail.com>
Parsha Pourkhomami <parshap@gmail.com>
'use strict';

function isHighSurrogate(codePoint) {
  return codePoint >= 0xd800 && codePoint <= 0xdbff;
}

function isLowSurrogate(codePoint) {
  return codePoint >= 0xdc00 && codePoint <= 0xdfff;
}

// Truncate string by size in bytes
module.exports = function getByteLength(string) {
  if (typeof string !== "string") {
    throw new Error("Input must be string");
  }

  var charLength = string.length;
  var byteLength = 0;
  var codePoint = null;
  var prevCodePoint = null;
  for (var i = 0; i < charLength; i++) {
    codePoint = string.charCodeAt(i);
    // handle 4-byte non-BMP chars
    // low surrogate
    if (isLowSurrogate(codePoint)) {
      // when parsing previous hi-surrogate, 3 is added to byteLength
      if (prevCodePoint != null && isHighSurrogate(prevCodePoint)) {
        byteLength += 1;
      }
      else {
        byteLength += 3;
      }
    }
    else if (codePoint <= 0x7f ) {
      byteLength += 1;
    }
    else if (codePoint >= 0x80 && codePoint <= 0x7ff) {
      byteLength += 2;
    }
    else if (codePoint >= 0x800 && codePoint <= 0xffff) {
      byteLength += 3;
    }
    prevCodePoint = codePoint;
  }

  return byteLength;
};
"use strict";

module.exports = function getByteLength(string) {
  if (typeof string !== "string") {
    throw new Error("Input must be string");
  }
  return Buffer.byteLength(string, "utf8");
};
{
  "author": {
    "name": "Carl Xiong",
    "email": "xiongc05@gmail.com"
  },
  "browser": "browser.js",
  "deprecated": false,
  "description": "Get utf8 byte length of string",
  "devDependencies": {
    "tape": "^4.2.2"
  },
  "homepage": "https://github.com/parshap/utf8-byte-length#readme",
  "license": "WTFPL",
  "main": "index.js",
  "name": "utf8-byte-length",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/parshap/utf8-byte-length.git"
  },
  "version": "1.0.4"
}
1.0.2 / 2015-10-07
==================

  * use try/catch when checking `localStorage` (#3, @kumavis)

1.0.1 / 2014-11-25
==================

  * browser: use `console.warn()` for deprecation calls
  * browser: more jsdocs

1.0.0 / 2014-04-30
==================

  * initial commit
(The MIT License)

Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

/**
 * Module exports.
 */

module.exports = deprecate;

/**
 * Mark that a method should not be used.
 * Returns a modified function which warns once by default.
 *
 * If `localStorage.noDeprecation = true` is set, then it is a no-op.
 *
 * If `localStorage.throwDeprecation = true` is set, then deprecated functions
 * will throw an Error when invoked.
 *
 * If `localStorage.traceDeprecation = true` is set, then deprecated functions
 * will invoke `console.trace()` instead of `console.error()`.
 *
 * @param {Function} fn - the function to deprecate
 * @param {String} msg - the string to print to the console when `fn` is invoked
 * @returns {Function} a new "deprecated" version of `fn`
 * @api public
 */

function deprecate (fn, msg) {
  if (config('noDeprecation')) {
    return fn;
  }

  var warned = false;
  function deprecated() {
    if (!warned) {
      if (config('throwDeprecation')) {
        throw new Error(msg);
      } else if (config('traceDeprecation')) {
        console.trace(msg);
      } else {
        console.warn(msg);
      }
      warned = true;
    }
    return fn.apply(this, arguments);
  }

  return deprecated;
}

/**
 * Checks `localStorage` for boolean values for the given `name`.
 *
 * @param {String} name
 * @returns {Boolean}
 * @api private
 */

function config (name) {
  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
  try {
    if (!global.localStorage) return false;
  } catch (_) {
    return false;
  }
  var val = global.localStorage[name];
  if (null == val) return false;
  return String(val).toLowerCase() === 'true';
}

/**
 * For Node.js, simply re-export the core `util.deprecate` function.
 */

module.exports = require('util').deprecate;
{
  "author": {
    "name": "Nathan Rajlich",
    "email": "nathan@tootallnate.net",
    "url": "http://n8.io/"
  },
  "browser": "browser.js",
  "deprecated": false,
  "description": "The Node.js `util.deprecate()` function with browser support",
  "homepage": "https://github.com/TooTallNate/util-deprecate",
  "license": "MIT",
  "main": "node.js",
  "name": "util-deprecate",
  "repository": {
    "type": "git",
    "url": "git://github.com/TooTallNate/util-deprecate.git"
  },
  "version": "1.0.2"
}Robert Kieffer <robert@broofa.com>
Christoph Tavan <dev@tavan.de>
AJ ONeal <coolaj86@gmail.com>
Vincent Voyer <vincent@zeroload.net>
Roman Shtylman <shtylman@gmail.com>
The MIT License (MIT)

Copyright (c) 2010-2016 Robert Kieffer and other contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var v1 = require('./v1');
var v4 = require('./v4');

var uuid = v4;
uuid.v1 = v1;
uuid.v4 = v4;

module.exports = uuid;
{
  "bin": {
    "uuid": "bin/uuid"
  },
  "browser": {
    "./lib/rng.js": "./lib/rng-browser.js",
    "./lib/sha1.js": "./lib/sha1-browser.js",
    "./lib/md5.js": "./lib/md5-browser.js"
  },
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "deprecated": false,
  "description": "RFC4122 (v1, v4, and v5) UUIDs",
  "devDependencies": {
    "@commitlint/cli": "~8.2.0",
    "@commitlint/config-conventional": "~8.2.0",
    "eslint": "~6.4.0",
    "husky": "~3.0.5",
    "mocha": "6.2.0",
    "runmd": "1.2.1",
    "standard-version": "7.0.0"
  },
  "homepage": "https://github.com/uuidjs/uuid#readme",
  "husky": {
    "hooks": {
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
    }
  },
  "license": "MIT",
  "name": "uuid",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/uuidjs/uuid.git"
  },
  "version": "3.4.0"
}var rng = require('./lib/rng');
var bytesToUuid = require('./lib/bytesToUuid');

// **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

var _nodeId;
var _clockseq;

// Previous uuid creation time
var _lastMSecs = 0;
var _lastNSecs = 0;

// See https://github.com/uuidjs/uuid for API details
function v1(options, buf, offset) {
  var i = buf && offset || 0;
  var b = buf || [];

  options = options || {};
  var node = options.node || _nodeId;
  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;

  // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189
  if (node == null || clockseq == null) {
    var seedBytes = rng();
    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [
        seedBytes[0] | 0x01,
        seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]
      ];
    }
    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  }

  // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
  var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();

  // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock
  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;

  // Time since last uuid creation (in msecs)
  var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;

  // Per 4.2.1.2, Bump clockseq on clock regression
  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  }

  // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval
  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  }

  // Per 4.2.1.2 Throw error if too many uuids are requested
  if (nsecs >= 10000) {
    throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec');
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq;

  // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
  msecs += 12219292800000;

  // `time_low`
  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff;

  // `time_mid`
  var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff;

  // `time_high_and_version`
  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
  b[i++] = tmh >>> 16 & 0xff;

  // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
  b[i++] = clockseq >>> 8 | 0x80;

  // `clock_seq_low`
  b[i++] = clockseq & 0xff;

  // `node`
  for (var n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf ? buf : bytesToUuid(b);
}

module.exports = v1;
var v35 = require('./lib/v35.js');
var md5 = require('./lib/md5');

module.exports = v35('v3', 0x30, md5);var rng = require('./lib/rng');
var bytesToUuid = require('./lib/bytesToUuid');

function v4(options, buf, offset) {
  var i = buf && offset || 0;

  if (typeof(options) == 'string') {
    buf = options === 'binary' ? new Array(16) : null;
    options = null;
  }
  options = options || {};

  var rnds = options.random || (options.rng || rng)();

  // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
  rnds[6] = (rnds[6] & 0x0f) | 0x40;
  rnds[8] = (rnds[8] & 0x3f) | 0x80;

  // Copy bytes to buffer, if provided
  if (buf) {
    for (var ii = 0; ii < 16; ++ii) {
      buf[i + ii] = rnds[ii];
    }
  }

  return buf || bytesToUuid(rnds);
}

module.exports = v4;
var v35 = require('./lib/v35.js');
var sha1 = require('./lib/sha1');
module.exports = v35('v5', 0x50, sha1);
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */
var byteToHex = [];
for (var i = 0; i < 256; ++i) {
  byteToHex[i] = (i + 0x100).toString(16).substr(1);
}

function bytesToUuid(buf, offset) {
  var i = offset || 0;
  var bth = byteToHex;
  // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4
  return ([
    bth[buf[i++]], bth[buf[i++]],
    bth[buf[i++]], bth[buf[i++]], '-',
    bth[buf[i++]], bth[buf[i++]], '-',
    bth[buf[i++]], bth[buf[i++]], '-',
    bth[buf[i++]], bth[buf[i++]], '-',
    bth[buf[i++]], bth[buf[i++]],
    bth[buf[i++]], bth[buf[i++]],
    bth[buf[i++]], bth[buf[i++]]
  ]).join('');
}

module.exports = bytesToUuid;
/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */

'use strict';

function md5(bytes) {
  if (typeof(bytes) == 'string') {
    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape
    bytes = new Array(msg.length);
    for (var i = 0; i < msg.length; i++) bytes[i] = msg.charCodeAt(i);
  }

  return md5ToHexEncodedArray(
    wordsToMd5(
      bytesToWords(bytes)
      , bytes.length * 8)
  );
}


/*
* Convert an array of little-endian words to an array of bytes
*/
function md5ToHexEncodedArray(input) {
  var i;
  var x;
  var output = [];
  var length32 = input.length * 32;
  var hexTab = '0123456789abcdef';
  var hex;

  for (i = 0; i < length32; i += 8) {
    x = (input[i >> 5] >>> (i % 32)) & 0xFF;

    hex = parseInt(hexTab.charAt((x >>> 4) & 0x0F) + hexTab.charAt(x & 0x0F), 16);

    output.push(hex);
  }
  return output;
}

/*
* Calculate the MD5 of an array of little-endian words, and a bit length.
*/
function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << (len % 32);
  x[(((len + 64) >>> 9) << 4) + 14] = len;

  var i;
  var olda;
  var oldb;
  var oldc;
  var oldd;
  var a = 1732584193;
  var b = -271733879;
  var c = -1732584194;

  var d = 271733878;

  for (i = 0; i < x.length; i += 16) {
    olda = a;
    oldb = b;
    oldc = c;
    oldd = d;

    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);

    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);

    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);

    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);

    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }
  return [a, b, c, d];
}

/*
* Convert an array bytes to an array of little-endian words
* Characters >255 have their high-byte silently ignored.
*/
function bytesToWords(input) {
  var i;
  var output = [];
  output[(input.length >> 2) - 1] = undefined;
  for (i = 0; i < output.length; i += 1) {
    output[i] = 0;
  }
  var length8 = input.length * 8;
  for (i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[(i / 8)] & 0xFF) << (i % 32);
  }

  return output;
}

/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
* to work around bugs in some JS interpreters.
*/
function safeAdd(x, y) {
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}

/*
* Bitwise rotate a 32-bit number to the left.
*/
function bitRotateLeft(num, cnt) {
  return (num << cnt) | (num >>> (32 - cnt));
}

/*
* These functions implement the four basic operations the algorithm uses.
*/
function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}
function md5ff(a, b, c, d, x, s, t) {
  return md5cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5gg(a, b, c, d, x, s, t) {
  return md5cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | (~d)), a, b, x, s, t);
}

module.exports = md5;
'use strict';

var crypto = require('crypto');

function md5(bytes) {
  if (typeof Buffer.from === 'function') {
    // Modern Buffer API
    if (Array.isArray(bytes)) {
      bytes = Buffer.from(bytes);
    } else if (typeof bytes === 'string') {
      bytes = Buffer.from(bytes, 'utf8');
    }
  } else {
    // Pre-v4 Buffer API
    if (Array.isArray(bytes)) {
      bytes = new Buffer(bytes);
    } else if (typeof bytes === 'string') {
      bytes = new Buffer(bytes, 'utf8');
    }
  }

  return crypto.createHash('md5').update(bytes).digest();
}

module.exports = md5;
// Unique ID creation requires a high quality random # generator.  In the
// browser this is a little complicated due to unknown quality of Math.random()
// and inconsistent support for the `crypto` API.  We do the best we can via
// feature-detection

// getRandomValues needs to be invoked in a context where "this" is a Crypto
// implementation. Also, find the complete implementation of crypto on IE11.
var getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||
                      (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));

if (getRandomValues) {
  // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto
  var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef

  module.exports = function whatwgRNG() {
    getRandomValues(rnds8);
    return rnds8;
  };
} else {
  // Math.random()-based (RNG)
  //
  // If all else fails, use Math.random().  It's fast, but is of unspecified
  // quality.
  var rnds = new Array(16);

  module.exports = function mathRNG() {
    for (var i = 0, r; i < 16; i++) {
      if ((i & 0x03) === 0) r = Math.random() * 0x100000000;
      rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;
    }

    return rnds;
  };
}
// Unique ID creation requires a high quality random # generator.  In node.js
// this is pretty straight-forward - we use the crypto API.

var crypto = require('crypto');

module.exports = function nodeRNG() {
  return crypto.randomBytes(16);
};
// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
'use strict';

function f(s, x, y, z) {
  switch (s) {
    case 0: return (x & y) ^ (~x & z);
    case 1: return x ^ y ^ z;
    case 2: return (x & y) ^ (x & z) ^ (y & z);
    case 3: return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return (x << n) | (x>>> (32 - n));
}

function sha1(bytes) {
  var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof(bytes) == 'string') {
    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape
    bytes = new Array(msg.length);
    for (var i = 0; i < msg.length; i++) bytes[i] = msg.charCodeAt(i);
  }

  bytes.push(0x80);

  var l = bytes.length/4 + 2;
  var N = Math.ceil(l/16);
  var M = new Array(N);

  for (var i=0; i<N; i++) {
    M[i] = new Array(16);
    for (var j=0; j<16; j++) {
      M[i][j] =
        bytes[i * 64 + j * 4] << 24 |
        bytes[i * 64 + j * 4 + 1] << 16 |
        bytes[i * 64 + j * 4 + 2] << 8 |
        bytes[i * 64 + j * 4 + 3];
    }
  }

  M[N - 1][14] = ((bytes.length - 1) * 8) /
    Math.pow(2, 32); M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = ((bytes.length - 1) * 8) & 0xffffffff;

  for (var i=0; i<N; i++) {
    var W = new Array(80);

    for (var t=0; t<16; t++) W[t] = M[i][t];
    for (var t=16; t<80; t++) {
      W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
    }

    var a = H[0];
    var b = H[1];
    var c = H[2];
    var d = H[3];
    var e = H[4];

    for (var t=0; t<80; t++) {
      var s = Math.floor(t/20);
      var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = (H[0] + a) >>> 0;
    H[1] = (H[1] + b) >>> 0;
    H[2] = (H[2] + c) >>> 0;
    H[3] = (H[3] + d) >>> 0;
    H[4] = (H[4] + e) >>> 0;
  }

  return [
    H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff,
    H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff,
    H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff,
    H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff,
    H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff
  ];
}

module.exports = sha1;
'use strict';

var crypto = require('crypto');

function sha1(bytes) {
  if (typeof Buffer.from === 'function') {
    // Modern Buffer API
    if (Array.isArray(bytes)) {
      bytes = Buffer.from(bytes);
    } else if (typeof bytes === 'string') {
      bytes = Buffer.from(bytes, 'utf8');
    }
  } else {
    // Pre-v4 Buffer API
    if (Array.isArray(bytes)) {
      bytes = new Buffer(bytes);
    } else if (typeof bytes === 'string') {
      bytes = new Buffer(bytes, 'utf8');
    }
  }

  return crypto.createHash('sha1').update(bytes).digest();
}

module.exports = sha1;
var bytesToUuid = require('./bytesToUuid');

function uuidToBytes(uuid) {
  // Note: We assume we're being passed a valid uuid string
  var bytes = [];
  uuid.replace(/[a-fA-F0-9]{2}/g, function(hex) {
    bytes.push(parseInt(hex, 16));
  });

  return bytes;
}

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape
  var bytes = new Array(str.length);
  for (var i = 0; i < str.length; i++) {
    bytes[i] = str.charCodeAt(i);
  }
  return bytes;
}

module.exports = function(name, version, hashfunc) {
  var generateUUID = function(value, namespace, buf, offset) {
    var off = buf && offset || 0;

    if (typeof(value) == 'string') value = stringToBytes(value);
    if (typeof(namespace) == 'string') namespace = uuidToBytes(namespace);

    if (!Array.isArray(value)) throw TypeError('value must be an array of bytes');
    if (!Array.isArray(namespace) || namespace.length !== 16) throw TypeError('namespace must be uuid string or an Array of 16 byte values');

    // Per 4.3
    var bytes = hashfunc(namespace.concat(value));
    bytes[6] = (bytes[6] & 0x0f) | version;
    bytes[8] = (bytes[8] & 0x3f) | 0x80;

    if (buf) {
      for (var idx = 0; idx < 16; ++idx) {
        buf[off+idx] = bytes[idx];
      }
    }

    return buf || bytesToUuid(bytes);
  };

  // Function#name is not settable on some platforms (#270)
  try {
    generateUUID.name = name;
  } catch (err) {
  }

  // Pre-defined namespaces, per Appendix C
  generateUUID.DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
  generateUUID.URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';

  return generateUUID;
};
#!/usr/bin/env node
var assert = require('assert');

function usage() {
  console.log('Usage:');
  console.log('  uuid');
  console.log('  uuid v1');
  console.log('  uuid v3 <name> <namespace uuid>');
  console.log('  uuid v4');
  console.log('  uuid v5 <name> <namespace uuid>');
  console.log('  uuid --help');
  console.log('\nNote: <namespace uuid> may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC4122');
}

var args = process.argv.slice(2);

if (args.indexOf('--help') >= 0) {
  usage();
  process.exit(0);
}
var version = args.shift() || 'v4';

switch (version) {
  case 'v1':
    var uuidV1 = require('../v1');
    console.log(uuidV1());
    break;

  case 'v3':
    var uuidV3 = require('../v3');

    var name = args.shift();
    var namespace = args.shift();
    assert(name != null, 'v3 name not specified');
    assert(namespace != null, 'v3 namespace not specified');

    if (namespace == 'URL') namespace = uuidV3.URL;
    if (namespace == 'DNS') namespace = uuidV3.DNS;

    console.log(uuidV3(name, namespace));
    break;

  case 'v4':
    var uuidV4 = require('../v4');
    console.log(uuidV4());
    break;

  case 'v5':
    var uuidV5 = require('../v5');

    var name = args.shift();
    var namespace = args.shift();
    assert(name != null, 'v5 name not specified');
    assert(namespace != null, 'v5 namespace not specified');

    if (namespace == 'URL') namespace = uuidV5.URL;
    if (namespace == 'DNS') namespace = uuidV5.DNS;

    console.log(uuidV5(name, namespace));
    break;

  default:
    usage();
    process.exit(1);
}

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
var parse = require('spdx-expression-parse');
var correct = require('spdx-correct');

var genericWarning = (
  'license should be ' +
  'a valid SPDX license expression (without "LicenseRef"), ' +
  '"UNLICENSED", or ' +
  '"SEE LICENSE IN <filename>"'
);

var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/;

function startsWith(prefix, string) {
  return string.slice(0, prefix.length) === prefix;
}

function usesLicenseRef(ast) {
  if (ast.hasOwnProperty('license')) {
    var license = ast.license;
    return (
      startsWith('LicenseRef', license) ||
      startsWith('DocumentRef', license)
    );
  } else {
    return (
      usesLicenseRef(ast.left) ||
      usesLicenseRef(ast.right)
    );
  }
}

module.exports = function(argument) {
  var ast;

  try {
    ast = parse(argument);
  } catch (e) {
    var match
    if (
      argument === 'UNLICENSED' ||
      argument === 'UNLICENCED'
    ) {
      return {
        validForOldPackages: true,
        validForNewPackages: true,
        unlicensed: true
      };
    } else if (match = fileReferenceRE.exec(argument)) {
      return {
        validForOldPackages: true,
        validForNewPackages: true,
        inFile: match[1]
      };
    } else {
      var result = {
        validForOldPackages: false,
        validForNewPackages: false,
        warnings: [genericWarning]
      };
      if (argument.trim().length !== 0) {
        var corrected = correct(argument);
        if (corrected) {
          result.warnings.push(
            'license is similar to the valid expression "' + corrected + '"'
          );
        }
      }
      return result;
    }
  }

  if (usesLicenseRef(ast)) {
    return {
      validForNewPackages: false,
      validForOldPackages: false,
      spdx: true,
      warnings: [genericWarning]
    };
  } else {
    return {
      validForNewPackages: true,
      validForOldPackages: true,
      spdx: true
    };
  }
};
{
  "author": {
    "name": "Kyle E. Mitchell",
    "email": "kyle@kemitchell.com",
    "url": "https://kemitchell.com"
  },
  "dependencies": {
    "spdx-correct": "^3.0.0",
    "spdx-expression-parse": "^3.0.0"
  },
  "deprecated": false,
  "description": "Give me a string and I'll tell you if it's a valid npm package license string",
  "devDependencies": {
    "defence-cli": "^2.0.1",
    "replace-require-self": "^1.0.0"
  },
  "homepage": "https://github.com/kemitchell/validate-npm-package-license.js#readme",
  "license": "Apache-2.0",
  "name": "validate-npm-package-license",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/kemitchell/validate-npm-package-license.js.git"
  },
  "version": "3.0.4"
}# Changelog

## Not yet released

None yet.

## v1.10.0

* #49 want convenience functions for MultiErrors

## v1.9.0

* #47 could use VError.hasCauseWithName()

## v1.8.1

* #39 captureStackTrace lost when inheriting from WError

## v1.8.0

* #23 Preserve original stack trace(s)

## v1.7.0

* #10 better support for extra properties on Errors
* #11 make it easy to find causes of a particular kind
* #29 No documentation on how to Install this package
* #36 elide development-only files from npm package
# Contributing

This repository uses [cr.joyent.us](https://cr.joyent.us) (Gerrit) for new
changes.  Anyone can submit changes.  To get started, see the [cr.joyent.us user
guide](https://github.com/joyent/joyent-gerrit/blob/master/docs/user/README.md).
This repo does not use GitHub pull requests.

See the [Joyent Engineering
Guidelines](https://github.com/joyent/eng/blob/master/docs/index.md) for general
best practices expected in this repository.

Contributions should be "make prepush" clean.  The "prepush" target runs the
"check" target, which requires these separate tools:

* https://github.com/davepacheco/jsstyle
* https://github.com/davepacheco/javascriptlint

If you're changing something non-trivial or user-facing, you may want to submit
an issue first.
Copyright (c) 2016, Joyent, Inc. All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE
{
  "dependencies": {
    "assert-plus": "^1.0.0",
    "core-util-is": "1.0.2",
    "extsprintf": "^1.2.0"
  },
  "deprecated": false,
  "description": "richer JavaScript errors",
  "engines": [
    "node >=0.6.0"
  ],
  "homepage": "https://github.com/davepacheco/node-verror#readme",
  "license": "MIT",
  "main": "./lib/verror.js",
  "name": "verror",
  "repository": {
    "type": "git",
    "url": "git://github.com/davepacheco/node-verror.git"
  },
  "version": "1.10.0"
}/*
 * verror.js: richer JavaScript errors
 */

var mod_assertplus = require('assert-plus');
var mod_util = require('util');

var mod_extsprintf = require('extsprintf');
var mod_isError = require('core-util-is').isError;
var sprintf = mod_extsprintf.sprintf;

/*
 * Public interface
 */

/* So you can 'var VError = require('verror')' */
module.exports = VError;
/* For compatibility */
VError.VError = VError;
/* Other exported classes */
VError.SError = SError;
VError.WError = WError;
VError.MultiError = MultiError;

/*
 * Common function used to parse constructor arguments for VError, WError, and
 * SError.  Named arguments to this function:
 *
 *     strict		force strict interpretation of sprintf arguments, even
 *     			if the options in "argv" don't say so
 *
 *     argv		error's constructor arguments, which are to be
 *     			interpreted as described in README.md.  For quick
 *     			reference, "argv" has one of the following forms:
 *
 *          [ sprintf_args... ]           (argv[0] is a string)
 *          [ cause, sprintf_args... ]    (argv[0] is an Error)
 *          [ options, sprintf_args... ]  (argv[0] is an object)
 *
 * This function normalizes these forms, producing an object with the following
 * properties:
 *
 *    options           equivalent to "options" in third form.  This will never
 *    			be a direct reference to what the caller passed in
 *    			(i.e., it may be a shallow copy), so it can be freely
 *    			modified.
 *
 *    shortmessage      result of sprintf(sprintf_args), taking options.strict
 *    			into account as described in README.md.
 */
function parseConstructorArguments(args)
{
	var argv, options, sprintf_args, shortmessage, k;

	mod_assertplus.object(args, 'args');
	mod_assertplus.bool(args.strict, 'args.strict');
	mod_assertplus.array(args.argv, 'args.argv');
	argv = args.argv;

	/*
	 * First, figure out which form of invocation we've been given.
	 */
	if (argv.length === 0) {
		options = {};
		sprintf_args = [];
	} else if (mod_isError(argv[0])) {
		options = { 'cause': argv[0] };
		sprintf_args = argv.slice(1);
	} else if (typeof (argv[0]) === 'object') {
		options = {};
		for (k in argv[0]) {
			options[k] = argv[0][k];
		}
		sprintf_args = argv.slice(1);
	} else {
		mod_assertplus.string(argv[0],
		    'first argument to VError, SError, or WError ' +
		    'constructor must be a string, object, or Error');
		options = {};
		sprintf_args = argv;
	}

	/*
	 * Now construct the error's message.
	 *
	 * extsprintf (which we invoke here with our caller's arguments in order
	 * to construct this Error's message) is strict in its interpretation of
	 * values to be processed by the "%s" specifier.  The value passed to
	 * extsprintf must actually be a string or something convertible to a
	 * String using .toString().  Passing other values (notably "null" and
	 * "undefined") is considered a programmer error.  The assumption is
	 * that if you actually want to print the string "null" or "undefined",
	 * then that's easy to do that when you're calling extsprintf; on the
	 * other hand, if you did NOT want that (i.e., there's actually a bug
	 * where the program assumes some variable is non-null and tries to
	 * print it, which might happen when constructing a packet or file in
	 * some specific format), then it's better to stop immediately than
	 * produce bogus output.
	 *
	 * However, sometimes the bug is only in the code calling VError, and a
	 * programmer might prefer to have the error message contain "null" or
	 * "undefined" rather than have the bug in the error path crash the
	 * program (making the first bug harder to identify).  For that reason,
	 * by default VError converts "null" or "undefined" arguments to their
	 * string representations and passes those to extsprintf.  Programmers
	 * desiring the strict behavior can use the SError class or pass the
	 * "strict" option to the VError constructor.
	 */
	mod_assertplus.object(options);
	if (!options.strict && !args.strict) {
		sprintf_args = sprintf_args.map(function (a) {
			return (a === null ? 'null' :
			    a === undefined ? 'undefined' : a);
		});
	}

	if (sprintf_args.length === 0) {
		shortmessage = '';
	} else {
		shortmessage = sprintf.apply(null, sprintf_args);
	}

	return ({
	    'options': options,
	    'shortmessage': shortmessage
	});
}

/*
 * See README.md for reference documentation.
 */
function VError()
{
	var args, obj, parsed, cause, ctor, message, k;

	args = Array.prototype.slice.call(arguments, 0);

	/*
	 * This is a regrettable pattern, but JavaScript's built-in Error class
	 * is defined to work this way, so we allow the constructor to be called
	 * without "new".
	 */
	if (!(this instanceof VError)) {
		obj = Object.create(VError.prototype);
		VError.apply(obj, arguments);
		return (obj);
	}

	/*
	 * For convenience and backwards compatibility, we support several
	 * different calling forms.  Normalize them here.
	 */
	parsed = parseConstructorArguments({
	    'argv': args,
	    'strict': false
	});

	/*
	 * If we've been given a name, apply it now.
	 */
	if (parsed.options.name) {
		mod_assertplus.string(parsed.options.name,
		    'error\'s "name" must be a string');
		this.name = parsed.options.name;
	}

	/*
	 * For debugging, we keep track of the original short message (attached
	 * this Error particularly) separately from the complete message (which
	 * includes the messages of our cause chain).
	 */
	this.jse_shortmsg = parsed.shortmessage;
	message = parsed.shortmessage;

	/*
	 * If we've been given a cause, record a reference to it and update our
	 * message appropriately.
	 */
	cause = parsed.options.cause;
	if (cause) {
		mod_assertplus.ok(mod_isError(cause), 'cause is not an Error');
		this.jse_cause = cause;

		if (!parsed.options.skipCauseMessage) {
			message += ': ' + cause.message;
		}
	}

	/*
	 * If we've been given an object with properties, shallow-copy that
	 * here.  We don't want to use a deep copy in case there are non-plain
	 * objects here, but we don't want to use the original object in case
	 * the caller modifies it later.
	 */
	this.jse_info = {};
	if (parsed.options.info) {
		for (k in parsed.options.info) {
			this.jse_info[k] = parsed.options.info[k];
		}
	}

	this.message = message;
	Error.call(this, message);

	if (Error.captureStackTrace) {
		ctor = parsed.options.constructorOpt || this.constructor;
		Error.captureStackTrace(this, ctor);
	}

	return (this);
}

mod_util.inherits(VError, Error);
VError.prototype.name = 'VError';

VError.prototype.toString = function ve_toString()
{
	var str = (this.hasOwnProperty('name') && this.name ||
		this.constructor.name || this.constructor.prototype.name);
	if (this.message)
		str += ': ' + this.message;

	return (str);
};

/*
 * This method is provided for compatibility.  New callers should use
 * VError.cause() instead.  That method also uses the saner `null` return value
 * when there is no cause.
 */
VError.prototype.cause = function ve_cause()
{
	var cause = VError.cause(this);
	return (cause === null ? undefined : cause);
};

/*
 * Static methods
 *
 * These class-level methods are provided so that callers can use them on
 * instances of Errors that are not VErrors.  New interfaces should be provided
 * only using static methods to eliminate the class of programming mistake where
 * people fail to check whether the Error object has the corresponding methods.
 */

VError.cause = function (err)
{
	mod_assertplus.ok(mod_isError(err), 'err must be an Error');
	return (mod_isError(err.jse_cause) ? err.jse_cause : null);
};

VError.info = function (err)
{
	var rv, cause, k;

	mod_assertplus.ok(mod_isError(err), 'err must be an Error');
	cause = VError.cause(err);
	if (cause !== null) {
		rv = VError.info(cause);
	} else {
		rv = {};
	}

	if (typeof (err.jse_info) == 'object' && err.jse_info !== null) {
		for (k in err.jse_info) {
			rv[k] = err.jse_info[k];
		}
	}

	return (rv);
};

VError.findCauseByName = function (err, name)
{
	var cause;

	mod_assertplus.ok(mod_isError(err), 'err must be an Error');
	mod_assertplus.string(name, 'name');
	mod_assertplus.ok(name.length > 0, 'name cannot be empty');

	for (cause = err; cause !== null; cause = VError.cause(cause)) {
		mod_assertplus.ok(mod_isError(cause));
		if (cause.name == name) {
			return (cause);
		}
	}

	return (null);
};

VError.hasCauseWithName = function (err, name)
{
	return (VError.findCauseByName(err, name) !== null);
};

VError.fullStack = function (err)
{
	mod_assertplus.ok(mod_isError(err), 'err must be an Error');

	var cause = VError.cause(err);

	if (cause) {
		return (err.stack + '\ncaused by: ' + VError.fullStack(cause));
	}

	return (err.stack);
};

VError.errorFromList = function (errors)
{
	mod_assertplus.arrayOfObject(errors, 'errors');

	if (errors.length === 0) {
		return (null);
	}

	errors.forEach(function (e) {
		mod_assertplus.ok(mod_isError(e));
	});

	if (errors.length == 1) {
		return (errors[0]);
	}

	return (new MultiError(errors));
};

VError.errorForEach = function (err, func)
{
	mod_assertplus.ok(mod_isError(err), 'err must be an Error');
	mod_assertplus.func(func, 'func');

	if (err instanceof MultiError) {
		err.errors().forEach(function iterError(e) { func(e); });
	} else {
		func(err);
	}
};


/*
 * SError is like VError, but stricter about types.  You cannot pass "null" or
 * "undefined" as string arguments to the formatter.
 */
function SError()
{
	var args, obj, parsed, options;

	args = Array.prototype.slice.call(arguments, 0);
	if (!(this instanceof SError)) {
		obj = Object.create(SError.prototype);
		SError.apply(obj, arguments);
		return (obj);
	}

	parsed = parseConstructorArguments({
	    'argv': args,
	    'strict': true
	});

	options = parsed.options;
	VError.call(this, options, '%s', parsed.shortmessage);

	return (this);
}

/*
 * We don't bother setting SError.prototype.name because once constructed,
 * SErrors are just like VErrors.
 */
mod_util.inherits(SError, VError);


/*
 * Represents a collection of errors for the purpose of consumers that generally
 * only deal with one error.  Callers can extract the individual errors
 * contained in this object, but may also just treat it as a normal single
 * error, in which case a summary message will be printed.
 */
function MultiError(errors)
{
	mod_assertplus.array(errors, 'list of errors');
	mod_assertplus.ok(errors.length > 0, 'must be at least one error');
	this.ase_errors = errors;

	VError.call(this, {
	    'cause': errors[0]
	}, 'first of %d error%s', errors.length, errors.length == 1 ? '' : 's');
}

mod_util.inherits(MultiError, VError);
MultiError.prototype.name = 'MultiError';

MultiError.prototype.errors = function me_errors()
{
	return (this.ase_errors.slice(0));
};


/*
 * See README.md for reference details.
 */
function WError()
{
	var args, obj, parsed, options;

	args = Array.prototype.slice.call(arguments, 0);
	if (!(this instanceof WError)) {
		obj = Object.create(WError.prototype);
		WError.apply(obj, args);
		return (obj);
	}

	parsed = parseConstructorArguments({
	    'argv': args,
	    'strict': false
	});

	options = parsed.options;
	options['skipCauseMessage'] = true;
	VError.call(this, options, '%s', parsed.shortmessage);

	return (this);
}

mod_util.inherits(WError, VError);
WError.prototype.name = 'WError';

WError.prototype.toString = function we_toString()
{
	var str = (this.hasOwnProperty('name') && this.name ||
		this.constructor.name || this.constructor.prototype.name);
	if (this.message)
		str += ': ' + this.message;
	if (this.jse_cause && this.jse_cause.message)
		str += '; caused by ' + this.jse_cause.toString();

	return (str);
};

/*
 * For purely historical reasons, WError's cause() function allows you to set
 * the cause.
 */
WError.prototype.cause = function we_cause(c)
{
	if (mod_isError(c))
		this.jse_cause = c;

	return (this.jse_cause);
};
The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me"
  },
  "bin": {
    "which": "bin/which"
  },
  "dependencies": {
    "isexe": "^2.0.0"
  },
  "deprecated": false,
  "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.",
  "devDependencies": {
    "mkdirp": "^0.5.0",
    "rimraf": "^2.6.2",
    "tap": "^12.0.1"
  },
  "files": [
    "which.js",
    "bin/which"
  ],
  "homepage": "https://github.com/isaacs/node-which#readme",
  "license": "ISC",
  "main": "which.js",
  "name": "which",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/node-which.git"
  },
  "version": "1.3.1"
}module.exports = which
which.sync = whichSync

var isWindows = process.platform === 'win32' ||
    process.env.OSTYPE === 'cygwin' ||
    process.env.OSTYPE === 'msys'

var path = require('path')
var COLON = isWindows ? ';' : ':'
var isexe = require('isexe')

function getNotFoundError (cmd) {
  var er = new Error('not found: ' + cmd)
  er.code = 'ENOENT'

  return er
}

function getPathInfo (cmd, opt) {
  var colon = opt.colon || COLON
  var pathEnv = opt.path || process.env.PATH || ''
  var pathExt = ['']

  pathEnv = pathEnv.split(colon)

  var pathExtExe = ''
  if (isWindows) {
    pathEnv.unshift(process.cwd())
    pathExtExe = (opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM')
    pathExt = pathExtExe.split(colon)


    // Always test the cmd itself first.  isexe will check to make sure
    // it's found in the pathExt set.
    if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')
      pathExt.unshift('')
  }

  // If it has a slash, then we don't bother searching the pathenv.
  // just check the file itself, and that's it.
  if (cmd.match(/\//) || isWindows && cmd.match(/\\/))
    pathEnv = ['']

  return {
    env: pathEnv,
    ext: pathExt,
    extExe: pathExtExe
  }
}

function which (cmd, opt, cb) {
  if (typeof opt === 'function') {
    cb = opt
    opt = {}
  }

  var info = getPathInfo(cmd, opt)
  var pathEnv = info.env
  var pathExt = info.ext
  var pathExtExe = info.extExe
  var found = []

  ;(function F (i, l) {
    if (i === l) {
      if (opt.all && found.length)
        return cb(null, found)
      else
        return cb(getNotFoundError(cmd))
    }

    var pathPart = pathEnv[i]
    if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"')
      pathPart = pathPart.slice(1, -1)

    var p = path.join(pathPart, cmd)
    if (!pathPart && (/^\.[\\\/]/).test(cmd)) {
      p = cmd.slice(0, 2) + p
    }
    ;(function E (ii, ll) {
      if (ii === ll) return F(i + 1, l)
      var ext = pathExt[ii]
      isexe(p + ext, { pathExt: pathExtExe }, function (er, is) {
        if (!er && is) {
          if (opt.all)
            found.push(p + ext)
          else
            return cb(null, p + ext)
        }
        return E(ii + 1, ll)
      })
    })(0, pathExt.length)
  })(0, pathEnv.length)
}

function whichSync (cmd, opt) {
  opt = opt || {}

  var info = getPathInfo(cmd, opt)
  var pathEnv = info.env
  var pathExt = info.ext
  var pathExtExe = info.extExe
  var found = []

  for (var i = 0, l = pathEnv.length; i < l; i ++) {
    var pathPart = pathEnv[i]
    if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"')
      pathPart = pathPart.slice(1, -1)

    var p = path.join(pathPart, cmd)
    if (!pathPart && /^\.[\\\/]/.test(cmd)) {
      p = cmd.slice(0, 2) + p
    }
    for (var j = 0, ll = pathExt.length; j < ll; j ++) {
      var cur = p + pathExt[j]
      var is
      try {
        is = isexe.sync(cur, { pathExt: pathExtExe })
        if (is) {
          if (opt.all)
            found.push(cur)
          else
            return cur
        }
      } catch (ex) {}
    }
  }

  if (opt.all && found.length)
    return found

  if (opt.nothrow)
    return null

  throw getNotFoundError(cmd)
}
#!/usr/bin/env node
var which = require("../")
if (process.argv.length < 3)
  usage()

function usage () {
  console.error('usage: which [-as] program ...')
  process.exit(1)
}

var all = false
var silent = false
var dashdash = false
var args = process.argv.slice(2).filter(function (arg) {
  if (dashdash || !/^-/.test(arg))
    return true

  if (arg === '--') {
    dashdash = true
    return false
  }

  var flags = arg.substr(1).split('')
  for (var f = 0; f < flags.length; f++) {
    var flag = flags[f]
    switch (flag) {
      case 's':
        silent = true
        break
      case 'a':
        all = true
        break
      default:
        console.error('which: illegal option -- ' + flag)
        usage()
    }
  }
  return false
})

process.exit(args.reduce(function (pv, current) {
  try {
    var f = which.sync(current, { all: all })
    if (all)
      f = f.join('\n')
    if (!silent)
      console.log(f)
    return pv;
  } catch (e) {
    return 1;
  }
}, 0))
Copyright (c) 2016, Contributors

Permission to use, copy, modify, and/or distribute this software for any purpose
with or without fee is hereby granted, provided that the above copyright notice
and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
'use strict'

module.exports = function whichModule (exported) {
  for (var i = 0, files = Object.keys(require.cache), mod; i < files.length; i++) {
    mod = require.cache[files[i]]
    if (mod.exports === exported) return mod
  }
  return null
}
{
  "author": {
    "name": "nexdrew"
  },
  "deprecated": false,
  "description": "Find the module object for something that was require()d",
  "devDependencies": {
    "ava": "^0.19.1",
    "coveralls": "^2.13.1",
    "nyc": "^10.3.0",
    "standard": "^10.0.2",
    "standard-version": "^4.0.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/nexdrew/which-module#readme",
  "license": "ISC",
  "main": "index.js",
  "name": "which-module",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/nexdrew/which-module.git"
  },
  "version": "2.0.0"
}Copyright (c) 2012 Moveline Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Moveline Inc.",
    "email": "info@moveline.com",
    "url": "https://www.moveline.com"
  },
  "deprecated": false,
  "description": "Express middleware for filtering json responses",
  "devDependencies": {
    "chai": "~1.3.0",
    "coffee-script": "~1.3.3",
    "express": "~3.0.0",
    "mocha": "~1.6.0",
    "supertest": "*"
  },
  "directories": {
    "test": "test"
  },
  "homepage": "https://github.com/Moveline/node-whitelist#readme",
  "license": "MIT",
  "main": "./lib/whitelist.js",
  "name": "whitelist",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/Moveline/node-whitelist.git"
  },
  "version": "1.0.2"
}var Whitelist = {
  middleware: function middleware(keys) {
    return function(req, res, next) {
      var json = res.json;
      res.json = function(statusCode, object) {
        if('object' === typeof statusCode) {
          object = statusCode;
        }

        res.json = json;

        object = Whitelist.only(object, keys);

        res.json(object);
      };
      next();
    };
  },

  only: function only(object, keys) {
    object = object || {};
    if('string' === typeof keys) {
      keys = keys.split(/ +/);
    }

    var filter = function filter(obj, keys) {
      return keys.reduce(function(ret, key){
        ret[key] = obj[key];
        return ret;
      }, {});
    };

    if(Array.isArray(object)) {
      object = object.map(function(obj) { return filter(obj, keys); });
    } else {
      object = filter(object, keys);
    }

    return object;
  }
};

module.exports = Whitelist;
'use strict';
const stringWidth = require('string-width');

module.exports = input => {
	let max = 0;
	for (const s of input.split('\n')) max = Math.max(max, stringWidth(s));
	return max;
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "string-width": "^2.1.1"
  },
  "deprecated": false,
  "description": "Get the visual width of the widest line in a string - the number of columns required to display it",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/widest-line#readme",
  "license": "MIT",
  "name": "widest-line",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/widest-line.git"
  },
  "version": "2.0.1"
}'use strict';
const stringWidth = require('string-width');
const stripAnsi = require('strip-ansi');
const ansiStyles = require('ansi-styles');

const ESCAPES = new Set([
	'\u001B',
	'\u009B'
]);

const END_CODE = 39;

const wrapAnsi = code => `${ESCAPES.values().next().value}[${code}m`;

// Calculate the length of words split on ' ', ignoring
// the extra characters added by ansi escape codes
const wordLengths = string => string.split(' ').map(character => stringWidth(character));

// Wrap a long word across multiple rows
// Ansi escape codes do not count towards length
const wrapWord = (rows, word, columns) => {
	const characters = [...word];

	let insideEscape = false;
	let visible = stringWidth(stripAnsi(rows[rows.length - 1]));

	for (const [index, character] of characters.entries()) {
		const characterLength = stringWidth(character);

		if (visible + characterLength <= columns) {
			rows[rows.length - 1] += character;
		} else {
			rows.push(character);
			visible = 0;
		}

		if (ESCAPES.has(character)) {
			insideEscape = true;
		} else if (insideEscape && character === 'm') {
			insideEscape = false;
			continue;
		}

		if (insideEscape) {
			continue;
		}

		visible += characterLength;

		if (visible === columns && index < characters.length - 1) {
			rows.push('');
			visible = 0;
		}
	}

	// It's possible that the last row we copy over is only
	// ansi escape characters, handle this edge-case
	if (!visible && rows[rows.length - 1].length > 0 && rows.length > 1) {
		rows[rows.length - 2] += rows.pop();
	}
};

// Trims spaces from a string ignoring invisible sequences
const stringVisibleTrimSpacesRight = str => {
	const words = str.split(' ');
	let last = words.length;

	while (last > 0) {
		if (stringWidth(words[last - 1]) > 0) {
			break;
		}

		last--;
	}

	if (last === words.length) {
		return str;
	}

	return words.slice(0, last).join(' ') + words.slice(last).join('');
};

// The wrap-ansi module can be invoked
// in either 'hard' or 'soft' wrap mode
//
// 'hard' will never allow a string to take up more
// than columns characters
//
// 'soft' allows long words to expand past the column length
const exec = (string, columns, options = {}) => {
	if (options.trim !== false && string.trim() === '') {
		return '';
	}

	let pre = '';
	let ret = '';
	let escapeCode;

	const lengths = wordLengths(string);
	let rows = [''];

	for (const [index, word] of string.split(' ').entries()) {
		if (options.trim !== false) {
			rows[rows.length - 1] = rows[rows.length - 1].trimLeft();
		}

		let rowLength = stringWidth(rows[rows.length - 1]);

		if (index !== 0) {
			if (rowLength >= columns && (options.wordWrap === false || options.trim === false)) {
				// If we start with a new word but the current row length equals the length of the columns, add a new row
				rows.push('');
				rowLength = 0;
			}

			if (rowLength > 0 || options.trim === false) {
				rows[rows.length - 1] += ' ';
				rowLength++;
			}
		}

		// In 'hard' wrap mode, the length of a line is
		// never allowed to extend past 'columns'
		if (options.hard && lengths[index] > columns) {
			const remainingColumns = (columns - rowLength);
			const breaksStartingThisLine = 1 + Math.floor((lengths[index] - remainingColumns - 1) / columns);
			const breaksStartingNextLine = Math.floor((lengths[index] - 1) / columns);
			if (breaksStartingNextLine < breaksStartingThisLine) {
				rows.push('');
			}

			wrapWord(rows, word, columns);
			continue;
		}

		if (rowLength + lengths[index] > columns && rowLength > 0 && lengths[index] > 0) {
			if (options.wordWrap === false && rowLength < columns) {
				wrapWord(rows, word, columns);
				continue;
			}

			rows.push('');
		}

		if (rowLength + lengths[index] > columns && options.wordWrap === false) {
			wrapWord(rows, word, columns);
			continue;
		}

		rows[rows.length - 1] += word;
	}

	if (options.trim !== false) {
		rows = rows.map(stringVisibleTrimSpacesRight);
	}

	pre = rows.join('\n');

	for (const [index, character] of [...pre].entries()) {
		ret += character;

		if (ESCAPES.has(character)) {
			const code = parseFloat(/\d[^m]*/.exec(pre.slice(index, index + 4)));
			escapeCode = code === END_CODE ? null : code;
		}

		const code = ansiStyles.codes.get(Number(escapeCode));

		if (escapeCode && code) {
			if (pre[index + 1] === '\n') {
				ret += wrapAnsi(code);
			} else if (character === '\n') {
				ret += wrapAnsi(escapeCode);
			}
		}
	}

	return ret;
};

// For each newline, invoke the method separately
module.exports = (string, columns, options) => {
	return String(string)
		.normalize()
		.split('\n')
		.map(line => exec(line, columns, options))
		.join('\n');
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "ansi-styles": "^3.2.0",
    "string-width": "^3.0.0",
    "strip-ansi": "^5.0.0"
  },
  "deprecated": false,
  "description": "Wordwrap a string with ANSI escape codes",
  "devDependencies": {
    "ava": "^1.2.1",
    "chalk": "^2.4.2",
    "coveralls": "^3.0.3",
    "has-ansi": "^3.0.0",
    "nyc": "^13.3.0",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/wrap-ansi#readme",
  "license": "MIT",
  "name": "wrap-ansi",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/wrap-ansi.git"
  },
  "version": "5.1.0"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Callback wrapping utility",
  "devDependencies": {
    "tap": "^2.3.1"
  },
  "directories": {
    "test": "test"
  },
  "files": [
    "wrappy.js"
  ],
  "homepage": "https://github.com/npm/wrappy",
  "license": "ISC",
  "main": "wrappy.js",
  "name": "wrappy",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/wrappy.git"
  },
  "version": "1.0.2"
}// Returns a wrapper function that returns a wrapped callback
// The wrapper function should do some stuff, and return a
// presumably different callback function.
// This makes sure that own properties are retained, so that
// decorations and such are not lost along the way.
module.exports = wrappy
function wrappy (fn, cb) {
  if (fn && cb) return wrappy(fn)(cb)

  if (typeof fn !== 'function')
    throw new TypeError('need wrapper function')

  Object.keys(fn).forEach(function (k) {
    wrapper[k] = fn[k]
  })

  return wrapper

  function wrapper() {
    var args = new Array(arguments.length)
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i]
    }
    var ret = fn.apply(this, args)
    var cb = args[args.length-1]
    if (typeof ret === 'function' && ret !== cb) {
      Object.keys(cb).forEach(function (k) {
        ret[k] = cb[k]
      })
    }
    return ret
  }
}
Copyright (c) 2015, Rebecca Turner

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

'use strict'
module.exports = writeFile
module.exports.sync = writeFileSync
module.exports._getTmpname = getTmpname // for testing
module.exports._cleanupOnExit = cleanupOnExit

var fs = require('graceful-fs')
var MurmurHash3 = require('imurmurhash')
var onExit = require('signal-exit')
var path = require('path')
var activeFiles = {}

// if we run inside of a worker_thread, `process.pid` is not unique
/* istanbul ignore next */
var threadId = (function getId () {
  try {
    var workerThreads = require('worker_threads')

    /// if we are in main thread, this is set to `0`
    return workerThreads.threadId
  } catch (e) {
    // worker_threads are not available, fallback to 0
    return 0
  }
})()

var invocations = 0
function getTmpname (filename) {
  return filename + '.' +
    MurmurHash3(__filename)
      .hash(String(process.pid))
      .hash(String(threadId))
      .hash(String(++invocations))
      .result()
}

function cleanupOnExit (tmpfile) {
  return function () {
    try {
      fs.unlinkSync(typeof tmpfile === 'function' ? tmpfile() : tmpfile)
    } catch (_) {}
  }
}

function writeFile (filename, data, options, callback) {
  if (options) {
    if (options instanceof Function) {
      callback = options
      options = {}
    } else if (typeof options === 'string') {
      options = { encoding: options }
    }
  } else {
    options = {}
  }

  var Promise = options.Promise || global.Promise
  var truename
  var fd
  var tmpfile
  /* istanbul ignore next -- The closure only gets called when onExit triggers */
  var removeOnExitHandler = onExit(cleanupOnExit(() => tmpfile))
  var absoluteName = path.resolve(filename)

  new Promise(function serializeSameFile (resolve) {
    // make a queue if it doesn't already exist
    if (!activeFiles[absoluteName]) activeFiles[absoluteName] = []

    activeFiles[absoluteName].push(resolve) // add this job to the queue
    if (activeFiles[absoluteName].length === 1) resolve() // kick off the first one
  }).then(function getRealPath () {
    return new Promise(function (resolve) {
      fs.realpath(filename, function (_, realname) {
        truename = realname || filename
        tmpfile = getTmpname(truename)
        resolve()
      })
    })
  }).then(function stat () {
    return new Promise(function stat (resolve) {
      if (options.mode && options.chown) resolve()
      else {
        // Either mode or chown is not explicitly set
        // Default behavior is to copy it from original file
        fs.stat(truename, function (err, stats) {
          if (err || !stats) resolve()
          else {
            options = Object.assign({}, options)

            if (options.mode == null) {
              options.mode = stats.mode
            }
            if (options.chown == null && process.getuid) {
              options.chown = { uid: stats.uid, gid: stats.gid }
            }
            resolve()
          }
        })
      }
    })
  }).then(function thenWriteFile () {
    return new Promise(function (resolve, reject) {
      fs.open(tmpfile, 'w', options.mode, function (err, _fd) {
        fd = _fd
        if (err) reject(err)
        else resolve()
      })
    })
  }).then(function write () {
    return new Promise(function (resolve, reject) {
      if (Buffer.isBuffer(data)) {
        fs.write(fd, data, 0, data.length, 0, function (err) {
          if (err) reject(err)
          else resolve()
        })
      } else if (data != null) {
        fs.write(fd, String(data), 0, String(options.encoding || 'utf8'), function (err) {
          if (err) reject(err)
          else resolve()
        })
      } else resolve()
    })
  }).then(function syncAndClose () {
    return new Promise(function (resolve, reject) {
      if (options.fsync !== false) {
        fs.fsync(fd, function (err) {
          if (err) fs.close(fd, () => reject(err))
          else fs.close(fd, resolve)
        })
      } else {
        fs.close(fd, resolve)
      }
    })
  }).then(function chown () {
    fd = null
    if (options.chown) {
      return new Promise(function (resolve, reject) {
        fs.chown(tmpfile, options.chown.uid, options.chown.gid, function (err) {
          if (err) reject(err)
          else resolve()
        })
      })
    }
  }).then(function chmod () {
    if (options.mode) {
      return new Promise(function (resolve, reject) {
        fs.chmod(tmpfile, options.mode, function (err) {
          if (err) reject(err)
          else resolve()
        })
      })
    }
  }).then(function rename () {
    return new Promise(function (resolve, reject) {
      fs.rename(tmpfile, truename, function (err) {
        if (err) reject(err)
        else resolve()
      })
    })
  }).then(function success () {
    removeOnExitHandler()
    callback()
  }, function fail (err) {
    return new Promise(resolve => {
      return fd ? fs.close(fd, resolve) : resolve()
    }).then(() => {
      removeOnExitHandler()
      fs.unlink(tmpfile, function () {
        callback(err)
      })
    })
  }).then(function checkQueue () {
    activeFiles[absoluteName].shift() // remove the element added by serializeSameFile
    if (activeFiles[absoluteName].length > 0) {
      activeFiles[absoluteName][0]() // start next job if one is pending
    } else delete activeFiles[absoluteName]
  })
}

function writeFileSync (filename, data, options) {
  if (typeof options === 'string') options = { encoding: options }
  else if (!options) options = {}
  try {
    filename = fs.realpathSync(filename)
  } catch (ex) {
    // it's ok, it'll happen on a not yet existing file
  }
  var tmpfile = getTmpname(filename)

  if (!options.mode || !options.chown) {
    // Either mode or chown is not explicitly set
    // Default behavior is to copy it from original file
    try {
      var stats = fs.statSync(filename)
      options = Object.assign({}, options)
      if (!options.mode) {
        options.mode = stats.mode
      }
      if (!options.chown && process.getuid) {
        options.chown = { uid: stats.uid, gid: stats.gid }
      }
    } catch (ex) {
      // ignore stat errors
    }
  }

  var fd
  var cleanup = cleanupOnExit(tmpfile)
  var removeOnExitHandler = onExit(cleanup)

  try {
    fd = fs.openSync(tmpfile, 'w', options.mode)
    if (Buffer.isBuffer(data)) {
      fs.writeSync(fd, data, 0, data.length, 0)
    } else if (data != null) {
      fs.writeSync(fd, String(data), 0, String(options.encoding || 'utf8'))
    }
    if (options.fsync !== false) {
      fs.fsyncSync(fd)
    }
    fs.closeSync(fd)
    if (options.chown) fs.chownSync(tmpfile, options.chown.uid, options.chown.gid)
    if (options.mode) fs.chmodSync(tmpfile, options.mode)
    fs.renameSync(tmpfile, filename)
    removeOnExitHandler()
  } catch (err) {
    if (fd) {
      try {
        fs.closeSync(fd)
      } catch (ex) {
        // ignore close errors at this stage, error may have closed fd already.
      }
    }
    removeOnExitHandler()
    cleanup()
    throw err
  }
}
{
  "author": {
    "name": "Rebecca Turner",
    "email": "me@re-becca.org",
    "url": "http://re-becca.org"
  },
  "dependencies": {
    "graceful-fs": "^4.1.11",
    "imurmurhash": "^0.1.4",
    "signal-exit": "^3.0.2"
  },
  "deprecated": false,
  "description": "Write files in an atomic fashion w/configurable ownership",
  "devDependencies": {
    "mkdirp": "^0.5.1",
    "require-inject": "^1.4.0",
    "rimraf": "^2.5.4",
    "standard": "^12.0.1",
    "tap": "^12.1.3"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/iarna/write-file-atomic",
  "license": "ISC",
  "main": "index.js",
  "name": "write-file-atomic",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/iarna/write-file-atomic.git"
  },
  "version": "2.4.3"
}'use strict';
const os = require('os');
const path = require('path');

const home = os.homedir();
const env = process.env;

exports.data = env.XDG_DATA_HOME ||
	(home ? path.join(home, '.local', 'share') : null);

exports.config = env.XDG_CONFIG_HOME ||
	(home ? path.join(home, '.config') : null);

exports.cache = env.XDG_CACHE_HOME || (home ? path.join(home, '.cache') : null);

exports.runtime = env.XDG_RUNTIME_DIR || null;

exports.dataDirs = (env.XDG_DATA_DIRS || '/usr/local/share/:/usr/share/').split(':');

if (exports.data) {
	exports.dataDirs.unshift(exports.data);
}

exports.configDirs = (env.XDG_CONFIG_DIRS || '/etc/xdg').split(':');

if (exports.config) {
	exports.configDirs.unshift(exports.config);
}
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Get XDG Base Directory paths",
  "devDependencies": {
    "ava": "*",
    "require-uncached": "^1.0.2",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/xdg-basedir#readme",
  "license": "MIT",
  "name": "xdg-basedir",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/xdg-basedir.git"
  },
  "version": "3.0.0"
}The MIT License (MIT)

Copyright (c) 2013 Ozgur Ozcitak

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Ozgur Ozcitak",
    "email": "oozcitak@gmail.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "An XML builder for node.js",
  "devDependencies": {
    "coffee-coverage": "2.*",
    "coffeescript": "1.*",
    "coveralls": "*",
    "istanbul": "*",
    "mocha": "*"
  },
  "engines": {
    "node": ">=4.0"
  },
  "homepage": "http://github.com/oozcitak/xmlbuilder-js",
  "license": "MIT",
  "main": "./lib/index",
  "name": "xmlbuilder",
  "repository": {
    "type": "git",
    "url": "git://github.com/oozcitak/xmlbuilder-js.git"
  },
  "version": "9.0.7"
}// Generated by CoffeeScript 1.12.7
(function() {
  var assign, isArray, isEmpty, isFunction, isObject, isPlainObject,
    slice = [].slice,
    hasProp = {}.hasOwnProperty;

  assign = function() {
    var i, key, len, source, sources, target;
    target = arguments[0], sources = 2 <= arguments.length ? slice.call(arguments, 1) : [];
    if (isFunction(Object.assign)) {
      Object.assign.apply(null, arguments);
    } else {
      for (i = 0, len = sources.length; i < len; i++) {
        source = sources[i];
        if (source != null) {
          for (key in source) {
            if (!hasProp.call(source, key)) continue;
            target[key] = source[key];
          }
        }
      }
    }
    return target;
  };

  isFunction = function(val) {
    return !!val && Object.prototype.toString.call(val) === '[object Function]';
  };

  isObject = function(val) {
    var ref;
    return !!val && ((ref = typeof val) === 'function' || ref === 'object');
  };

  isArray = function(val) {
    if (isFunction(Array.isArray)) {
      return Array.isArray(val);
    } else {
      return Object.prototype.toString.call(val) === '[object Array]';
    }
  };

  isEmpty = function(val) {
    var key;
    if (isArray(val)) {
      return !val.length;
    } else {
      for (key in val) {
        if (!hasProp.call(val, key)) continue;
        return false;
      }
      return true;
    }
  };

  isPlainObject = function(val) {
    var ctor, proto;
    return isObject(val) && (proto = Object.getPrototypeOf(val)) && (ctor = proto.constructor) && (typeof ctor === 'function') && (ctor instanceof ctor) && (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object));
  };

  module.exports.assign = assign;

  module.exports.isFunction = isFunction;

  module.exports.isObject = isObject;

  module.exports.isArray = isArray;

  module.exports.isEmpty = isEmpty;

  module.exports.isPlainObject = isPlainObject;

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute;

  module.exports = XMLAttribute = (function() {
    function XMLAttribute(parent, name, value) {
      this.options = parent.options;
      this.stringify = parent.stringify;
      if (name == null) {
        throw new Error("Missing attribute name of element " + parent.name);
      }
      if (value == null) {
        throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name);
      }
      this.name = this.stringify.attName(name);
      this.value = this.stringify.attValue(value);
    }

    XMLAttribute.prototype.clone = function() {
      return Object.create(this);
    };

    XMLAttribute.prototype.toString = function(options) {
      return this.options.writer.set(options).attribute(this);
    };

    return XMLAttribute;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLCData = (function(superClass) {
    extend(XMLCData, superClass);

    function XMLCData(parent, text) {
      XMLCData.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing CDATA text");
      }
      this.text = this.stringify.cdata(text);
    }

    XMLCData.prototype.clone = function() {
      return Object.create(this);
    };

    XMLCData.prototype.toString = function(options) {
      return this.options.writer.set(options).cdata(this);
    };

    return XMLCData;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLComment, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLComment = (function(superClass) {
    extend(XMLComment, superClass);

    function XMLComment(parent, text) {
      XMLComment.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing comment text");
      }
      this.text = this.stringify.comment(text);
    }

    XMLComment.prototype.clone = function() {
      return Object.create(this);
    };

    XMLComment.prototype.toString = function(options) {
      return this.options.writer.set(options).comment(this);
    };

    return XMLComment;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDAttList, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDAttList = (function(superClass) {
    extend(XMLDTDAttList, superClass);

    function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      XMLDTDAttList.__super__.constructor.call(this, parent);
      if (elementName == null) {
        throw new Error("Missing DTD element name");
      }
      if (attributeName == null) {
        throw new Error("Missing DTD attribute name");
      }
      if (!attributeType) {
        throw new Error("Missing DTD attribute type");
      }
      if (!defaultValueType) {
        throw new Error("Missing DTD attribute default");
      }
      if (defaultValueType.indexOf('#') !== 0) {
        defaultValueType = '#' + defaultValueType;
      }
      if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {
        throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT");
      }
      if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {
        throw new Error("Default value only applies to #FIXED or #DEFAULT");
      }
      this.elementName = this.stringify.eleName(elementName);
      this.attributeName = this.stringify.attName(attributeName);
      this.attributeType = this.stringify.dtdAttType(attributeType);
      this.defaultValue = this.stringify.dtdAttDefault(defaultValue);
      this.defaultValueType = defaultValueType;
    }

    XMLDTDAttList.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdAttList(this);
    };

    return XMLDTDAttList;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDElement, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDElement = (function(superClass) {
    extend(XMLDTDElement, superClass);

    function XMLDTDElement(parent, name, value) {
      XMLDTDElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing DTD element name");
      }
      if (!value) {
        value = '(#PCDATA)';
      }
      if (Array.isArray(value)) {
        value = '(' + value.join(',') + ')';
      }
      this.name = this.stringify.eleName(name);
      this.value = this.stringify.dtdElementValue(value);
    }

    XMLDTDElement.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdElement(this);
    };

    return XMLDTDElement;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDEntity, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDEntity = (function(superClass) {
    extend(XMLDTDEntity, superClass);

    function XMLDTDEntity(parent, pe, name, value) {
      XMLDTDEntity.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing entity name");
      }
      if (value == null) {
        throw new Error("Missing entity value");
      }
      this.pe = !!pe;
      this.name = this.stringify.eleName(name);
      if (!isObject(value)) {
        this.value = this.stringify.dtdEntityValue(value);
      } else {
        if (!value.pubID && !value.sysID) {
          throw new Error("Public and/or system identifiers are required for an external entity");
        }
        if (value.pubID && !value.sysID) {
          throw new Error("System identifier is required for a public external entity");
        }
        if (value.pubID != null) {
          this.pubID = this.stringify.dtdPubID(value.pubID);
        }
        if (value.sysID != null) {
          this.sysID = this.stringify.dtdSysID(value.sysID);
        }
        if (value.nData != null) {
          this.nData = this.stringify.dtdNData(value.nData);
        }
        if (this.pe && this.nData) {
          throw new Error("Notation declaration is not allowed in a parameter entity");
        }
      }
    }

    XMLDTDEntity.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdEntity(this);
    };

    return XMLDTDEntity;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDNotation, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLDTDNotation = (function(superClass) {
    extend(XMLDTDNotation, superClass);

    function XMLDTDNotation(parent, name, value) {
      XMLDTDNotation.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing notation name");
      }
      if (!value.pubID && !value.sysID) {
        throw new Error("Public or system identifiers are required for an external entity");
      }
      this.name = this.stringify.eleName(name);
      if (value.pubID != null) {
        this.pubID = this.stringify.dtdPubID(value.pubID);
      }
      if (value.sysID != null) {
        this.sysID = this.stringify.dtdSysID(value.sysID);
      }
    }

    XMLDTDNotation.prototype.toString = function(options) {
      return this.options.writer.set(options).dtdNotation(this);
    };

    return XMLDTDNotation;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDeclaration, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  module.exports = XMLDeclaration = (function(superClass) {
    extend(XMLDeclaration, superClass);

    function XMLDeclaration(parent, version, encoding, standalone) {
      var ref;
      XMLDeclaration.__super__.constructor.call(this, parent);
      if (isObject(version)) {
        ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;
      }
      if (!version) {
        version = '1.0';
      }
      this.version = this.stringify.xmlVersion(version);
      if (encoding != null) {
        this.encoding = this.stringify.xmlEncoding(encoding);
      }
      if (standalone != null) {
        this.standalone = this.stringify.xmlStandalone(standalone);
      }
    }

    XMLDeclaration.prototype.toString = function(options) {
      return this.options.writer.set(options).declaration(this);
    };

    return XMLDeclaration;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  module.exports = XMLDocType = (function(superClass) {
    extend(XMLDocType, superClass);

    function XMLDocType(parent, pubID, sysID) {
      var ref, ref1;
      XMLDocType.__super__.constructor.call(this, parent);
      this.documentObject = parent;
      if (isObject(pubID)) {
        ref = pubID, pubID = ref.pubID, sysID = ref.sysID;
      }
      if (sysID == null) {
        ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1];
      }
      if (pubID != null) {
        this.pubID = this.stringify.dtdPubID(pubID);
      }
      if (sysID != null) {
        this.sysID = this.stringify.dtdSysID(sysID);
      }
    }

    XMLDocType.prototype.element = function(name, value) {
      var child;
      child = new XMLDTDElement(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var child;
      child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.entity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, false, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.pEntity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, true, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.notation = function(name, value) {
      var child;
      child = new XMLDTDNotation(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.toString = function(options) {
      return this.options.writer.set(options).docType(this);
    };

    XMLDocType.prototype.ele = function(name, value) {
      return this.element(name, value);
    };

    XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);
    };

    XMLDocType.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocType.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocType.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    XMLDocType.prototype.up = function() {
      return this.root() || this.documentObject;
    };

    return XMLDocType;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDocument, XMLNode, XMLStringWriter, XMLStringifier, isPlainObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isPlainObject = require('./Utility').isPlainObject;

  XMLNode = require('./XMLNode');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  module.exports = XMLDocument = (function(superClass) {
    extend(XMLDocument, superClass);

    function XMLDocument(options) {
      XMLDocument.__super__.constructor.call(this, null);
      options || (options = {});
      if (!options.writer) {
        options.writer = new XMLStringWriter();
      }
      this.options = options;
      this.stringify = new XMLStringifier(options);
      this.isDocument = true;
    }

    XMLDocument.prototype.end = function(writer) {
      var writerOptions;
      if (!writer) {
        writer = this.options.writer;
      } else if (isPlainObject(writer)) {
        writerOptions = writer;
        writer = this.options.writer.set(writerOptions);
      }
      return writer.document(this);
    };

    XMLDocument.prototype.toString = function(options) {
      return this.options.writer.set(options).document(this);
    };

    return XMLDocument;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute, XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLDocumentCB, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLStringifier, XMLText, isFunction, isObject, isPlainObject, ref,
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isPlainObject = ref.isPlainObject;

  XMLElement = require('./XMLElement');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLAttribute = require('./XMLAttribute');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  module.exports = XMLDocumentCB = (function() {
    function XMLDocumentCB(options, onData, onEnd) {
      var writerOptions;
      options || (options = {});
      if (!options.writer) {
        options.writer = new XMLStringWriter(options);
      } else if (isPlainObject(options.writer)) {
        writerOptions = options.writer;
        options.writer = new XMLStringWriter(writerOptions);
      }
      this.options = options;
      this.writer = options.writer;
      this.stringify = new XMLStringifier(options);
      this.onDataCallback = onData || function() {};
      this.onEndCallback = onEnd || function() {};
      this.currentNode = null;
      this.currentLevel = -1;
      this.openTags = {};
      this.documentStarted = false;
      this.documentCompleted = false;
      this.root = null;
    }

    XMLDocumentCB.prototype.node = function(name, attributes, text) {
      var ref1;
      if (name == null) {
        throw new Error("Missing node name");
      }
      if (this.root && this.currentLevel === -1) {
        throw new Error("Document can only have one root node");
      }
      this.openCurrent();
      name = name.valueOf();
      if (attributes == null) {
        attributes = {};
      }
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      this.currentNode = new XMLElement(this, name, attributes);
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      if (text != null) {
        this.text(text);
      }
      return this;
    };

    XMLDocumentCB.prototype.element = function(name, attributes, text) {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.dtdElement.apply(this, arguments);
      } else {
        return this.node(name, attributes, text);
      }
    };

    XMLDocumentCB.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (!this.currentNode || this.currentNode.children) {
        throw new Error("att() can only be used immediately after an ele() call in callback mode");
      }
      if (name != null) {
        name = name.valueOf();
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (!this.options.skipNullAttributes || (value != null)) {
          this.currentNode.attributes[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLDocumentCB.prototype.text = function(value) {
      var node;
      this.openCurrent();
      node = new XMLText(this, value);
      this.onData(this.writer.text(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.cdata = function(value) {
      var node;
      this.openCurrent();
      node = new XMLCData(this, value);
      this.onData(this.writer.cdata(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.comment = function(value) {
      var node;
      this.openCurrent();
      node = new XMLComment(this, value);
      this.onData(this.writer.comment(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.raw = function(value) {
      var node;
      this.openCurrent();
      node = new XMLRaw(this, value);
      this.onData(this.writer.raw(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.instruction = function(target, value) {
      var i, insTarget, insValue, len, node;
      this.openCurrent();
      if (target != null) {
        target = target.valueOf();
      }
      if (value != null) {
        value = value.valueOf();
      }
      if (Array.isArray(target)) {
        for (i = 0, len = target.length; i < len; i++) {
          insTarget = target[i];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        node = new XMLProcessingInstruction(this, target, value);
        this.onData(this.writer.processingInstruction(node, this.currentLevel + 1));
      }
      return this;
    };

    XMLDocumentCB.prototype.declaration = function(version, encoding, standalone) {
      var node;
      this.openCurrent();
      if (this.documentStarted) {
        throw new Error("declaration() must be the first node");
      }
      node = new XMLDeclaration(this, version, encoding, standalone);
      this.onData(this.writer.declaration(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.doctype = function(root, pubID, sysID) {
      this.openCurrent();
      if (root == null) {
        throw new Error("Missing root node name");
      }
      if (this.root) {
        throw new Error("dtd() must come before the root node");
      }
      this.currentNode = new XMLDocType(this, pubID, sysID);
      this.currentNode.rootNodeName = root;
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      return this;
    };

    XMLDocumentCB.prototype.dtdElement = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDElement(this, name, value);
      this.onData(this.writer.dtdElement(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var node;
      this.openCurrent();
      node = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.onData(this.writer.dtdAttList(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.entity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, false, name, value);
      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.pEntity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, true, name, value);
      this.onData(this.writer.dtdEntity(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.notation = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDNotation(this, name, value);
      this.onData(this.writer.dtdNotation(node, this.currentLevel + 1));
      return this;
    };

    XMLDocumentCB.prototype.up = function() {
      if (this.currentLevel < 0) {
        throw new Error("The document node has no parent");
      }
      if (this.currentNode) {
        if (this.currentNode.children) {
          this.closeNode(this.currentNode);
        } else {
          this.openNode(this.currentNode);
        }
        this.currentNode = null;
      } else {
        this.closeNode(this.openTags[this.currentLevel]);
      }
      delete this.openTags[this.currentLevel];
      this.currentLevel--;
      return this;
    };

    XMLDocumentCB.prototype.end = function() {
      while (this.currentLevel >= 0) {
        this.up();
      }
      return this.onEnd();
    };

    XMLDocumentCB.prototype.openCurrent = function() {
      if (this.currentNode) {
        this.currentNode.children = true;
        return this.openNode(this.currentNode);
      }
    };

    XMLDocumentCB.prototype.openNode = function(node) {
      if (!node.isOpen) {
        if (!this.root && this.currentLevel === 0 && node instanceof XMLElement) {
          this.root = node;
        }
        this.onData(this.writer.openNode(node, this.currentLevel));
        return node.isOpen = true;
      }
    };

    XMLDocumentCB.prototype.closeNode = function(node) {
      if (!node.isClosed) {
        this.onData(this.writer.closeNode(node, this.currentLevel));
        return node.isClosed = true;
      }
    };

    XMLDocumentCB.prototype.onData = function(chunk) {
      this.documentStarted = true;
      return this.onDataCallback(chunk);
    };

    XMLDocumentCB.prototype.onEnd = function() {
      this.documentCompleted = true;
      return this.onEndCallback();
    };

    XMLDocumentCB.prototype.ele = function() {
      return this.element.apply(this, arguments);
    };

    XMLDocumentCB.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLDocumentCB.prototype.dtd = function(root, pubID, sysID) {
      return this.doctype(root, pubID, sysID);
    };

    XMLDocumentCB.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLDocumentCB.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.t = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLDocumentCB.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.att = function() {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.a = function() {
      if (this.currentNode && this.currentNode instanceof XMLDocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocumentCB.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocumentCB.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    return XMLDocumentCB;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLAttribute, XMLElement, XMLNode, isFunction, isObject, ref,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction;

  XMLNode = require('./XMLNode');

  XMLAttribute = require('./XMLAttribute');

  module.exports = XMLElement = (function(superClass) {
    extend(XMLElement, superClass);

    function XMLElement(parent, name, attributes) {
      XMLElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing element name");
      }
      this.name = this.stringify.eleName(name);
      this.attributes = {};
      if (attributes != null) {
        this.attribute(attributes);
      }
      if (parent.isDocument) {
        this.isRoot = true;
        this.documentObject = parent;
        parent.rootObject = this;
      }
    }

    XMLElement.prototype.clone = function() {
      var att, attName, clonedSelf, ref1;
      clonedSelf = Object.create(this);
      if (clonedSelf.isRoot) {
        clonedSelf.documentObject = null;
      }
      clonedSelf.attributes = {};
      ref1 = this.attributes;
      for (attName in ref1) {
        if (!hasProp.call(ref1, attName)) continue;
        att = ref1[attName];
        clonedSelf.attributes[attName] = att.clone();
      }
      clonedSelf.children = [];
      this.children.forEach(function(child) {
        var clonedChild;
        clonedChild = child.clone();
        clonedChild.parent = clonedSelf;
        return clonedSelf.children.push(clonedChild);
      });
      return clonedSelf;
    };

    XMLElement.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (name != null) {
        name = name.valueOf();
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (!this.options.skipNullAttributes || (value != null)) {
          this.attributes[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLElement.prototype.removeAttribute = function(name) {
      var attName, i, len;
      if (name == null) {
        throw new Error("Missing attribute name");
      }
      name = name.valueOf();
      if (Array.isArray(name)) {
        for (i = 0, len = name.length; i < len; i++) {
          attName = name[i];
          delete this.attributes[attName];
        }
      } else {
        delete this.attributes[name];
      }
      return this;
    };

    XMLElement.prototype.toString = function(options) {
      return this.options.writer.set(options).element(this);
    };

    XMLElement.prototype.att = function(name, value) {
      return this.attribute(name, value);
    };

    XMLElement.prototype.a = function(name, value) {
      return this.attribute(name, value);
    };

    return XMLElement;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLProcessingInstruction, XMLRaw, XMLText, isEmpty, isFunction, isObject, ref,
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isEmpty = ref.isEmpty;

  XMLElement = null;

  XMLCData = null;

  XMLComment = null;

  XMLDeclaration = null;

  XMLDocType = null;

  XMLRaw = null;

  XMLText = null;

  XMLProcessingInstruction = null;

  module.exports = XMLNode = (function() {
    function XMLNode(parent) {
      this.parent = parent;
      if (this.parent) {
        this.options = this.parent.options;
        this.stringify = this.parent.stringify;
      }
      this.children = [];
      if (!XMLElement) {
        XMLElement = require('./XMLElement');
        XMLCData = require('./XMLCData');
        XMLComment = require('./XMLComment');
        XMLDeclaration = require('./XMLDeclaration');
        XMLDocType = require('./XMLDocType');
        XMLRaw = require('./XMLRaw');
        XMLText = require('./XMLText');
        XMLProcessingInstruction = require('./XMLProcessingInstruction');
      }
    }

    XMLNode.prototype.element = function(name, attributes, text) {
      var childNode, item, j, k, key, lastChild, len, len1, ref1, val;
      lastChild = null;
      if (attributes == null) {
        attributes = {};
      }
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      if (name != null) {
        name = name.valueOf();
      }
      if (Array.isArray(name)) {
        for (j = 0, len = name.length; j < len; j++) {
          item = name[j];
          lastChild = this.element(item);
        }
      } else if (isFunction(name)) {
        lastChild = this.element(name.apply());
      } else if (isObject(name)) {
        for (key in name) {
          if (!hasProp.call(name, key)) continue;
          val = name[key];
          if (isFunction(val)) {
            val = val.apply();
          }
          if ((isObject(val)) && (isEmpty(val))) {
            val = null;
          }
          if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {
            lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);
          } else if (!this.options.separateArrayItems && Array.isArray(val)) {
            for (k = 0, len1 = val.length; k < len1; k++) {
              item = val[k];
              childNode = {};
              childNode[key] = item;
              lastChild = this.element(childNode);
            }
          } else if (isObject(val)) {
            lastChild = this.element(key);
            lastChild.element(val);
          } else {
            lastChild = this.element(key, val);
          }
        }
      } else {
        if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {
          lastChild = this.text(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {
          lastChild = this.cdata(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {
          lastChild = this.comment(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {
          lastChild = this.raw(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) {
          lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text);
        } else {
          lastChild = this.node(name, attributes, text);
        }
      }
      if (lastChild == null) {
        throw new Error("Could not create any elements with: " + name);
      }
      return lastChild;
    };

    XMLNode.prototype.insertBefore = function(name, attributes, text) {
      var child, i, removed;
      if (this.isRoot) {
        throw new Error("Cannot insert elements at root level");
      }
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.element(name, attributes, text);
      Array.prototype.push.apply(this.parent.children, removed);
      return child;
    };

    XMLNode.prototype.insertAfter = function(name, attributes, text) {
      var child, i, removed;
      if (this.isRoot) {
        throw new Error("Cannot insert elements at root level");
      }
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.element(name, attributes, text);
      Array.prototype.push.apply(this.parent.children, removed);
      return child;
    };

    XMLNode.prototype.remove = function() {
      var i, ref1;
      if (this.isRoot) {
        throw new Error("Cannot remove the root element");
      }
      i = this.parent.children.indexOf(this);
      [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref1 = [])), ref1;
      return this.parent;
    };

    XMLNode.prototype.node = function(name, attributes, text) {
      var child, ref1;
      if (name != null) {
        name = name.valueOf();
      }
      attributes || (attributes = {});
      attributes = attributes.valueOf();
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      child = new XMLElement(this, name, attributes);
      if (text != null) {
        child.text(text);
      }
      this.children.push(child);
      return child;
    };

    XMLNode.prototype.text = function(value) {
      var child;
      child = new XMLText(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.cdata = function(value) {
      var child;
      child = new XMLCData(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.comment = function(value) {
      var child;
      child = new XMLComment(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.commentBefore = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.commentAfter = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.raw = function(value) {
      var child;
      child = new XMLRaw(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.instruction = function(target, value) {
      var insTarget, insValue, instruction, j, len;
      if (target != null) {
        target = target.valueOf();
      }
      if (value != null) {
        value = value.valueOf();
      }
      if (Array.isArray(target)) {
        for (j = 0, len = target.length; j < len; j++) {
          insTarget = target[j];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        instruction = new XMLProcessingInstruction(this, target, value);
        this.children.push(instruction);
      }
      return this;
    };

    XMLNode.prototype.instructionBefore = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.instructionAfter = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.declaration = function(version, encoding, standalone) {
      var doc, xmldec;
      doc = this.document();
      xmldec = new XMLDeclaration(doc, version, encoding, standalone);
      if (doc.children[0] instanceof XMLDeclaration) {
        doc.children[0] = xmldec;
      } else {
        doc.children.unshift(xmldec);
      }
      return doc.root() || doc;
    };

    XMLNode.prototype.doctype = function(pubID, sysID) {
      var child, doc, doctype, i, j, k, len, len1, ref1, ref2;
      doc = this.document();
      doctype = new XMLDocType(doc, pubID, sysID);
      ref1 = doc.children;
      for (i = j = 0, len = ref1.length; j < len; i = ++j) {
        child = ref1[i];
        if (child instanceof XMLDocType) {
          doc.children[i] = doctype;
          return doctype;
        }
      }
      ref2 = doc.children;
      for (i = k = 0, len1 = ref2.length; k < len1; i = ++k) {
        child = ref2[i];
        if (child.isRoot) {
          doc.children.splice(i, 0, doctype);
          return doctype;
        }
      }
      doc.children.push(doctype);
      return doctype;
    };

    XMLNode.prototype.up = function() {
      if (this.isRoot) {
        throw new Error("The root node has no parent. Use doc() if you need to get the document object.");
      }
      return this.parent;
    };

    XMLNode.prototype.root = function() {
      var node;
      node = this;
      while (node) {
        if (node.isDocument) {
          return node.rootObject;
        } else if (node.isRoot) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.document = function() {
      var node;
      node = this;
      while (node) {
        if (node.isDocument) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.end = function(options) {
      return this.document().end(options);
    };

    XMLNode.prototype.prev = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i < 1) {
        throw new Error("Already at the first node");
      }
      return this.parent.children[i - 1];
    };

    XMLNode.prototype.next = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i === -1 || i === this.parent.children.length - 1) {
        throw new Error("Already at the last node");
      }
      return this.parent.children[i + 1];
    };

    XMLNode.prototype.importDocument = function(doc) {
      var clonedRoot;
      clonedRoot = doc.root().clone();
      clonedRoot.parent = this;
      clonedRoot.isRoot = false;
      this.children.push(clonedRoot);
      return this;
    };

    XMLNode.prototype.ele = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.doc = function() {
      return this.document();
    };

    XMLNode.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLNode.prototype.dtd = function(pubID, sysID) {
      return this.doctype(pubID, sysID);
    };

    XMLNode.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.t = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLNode.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.u = function() {
      return this.up();
    };

    XMLNode.prototype.importXMLBuilder = function(doc) {
      return this.importDocument(doc);
    };

    return XMLNode;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLProcessingInstruction,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLProcessingInstruction = (function(superClass) {
    extend(XMLProcessingInstruction, superClass);

    function XMLProcessingInstruction(parent, target, value) {
      XMLProcessingInstruction.__super__.constructor.call(this, parent);
      if (target == null) {
        throw new Error("Missing instruction target");
      }
      this.target = this.stringify.insTarget(target);
      if (value) {
        this.value = this.stringify.insValue(value);
      }
    }

    XMLProcessingInstruction.prototype.clone = function() {
      return Object.create(this);
    };

    XMLProcessingInstruction.prototype.toString = function(options) {
      return this.options.writer.set(options).processingInstruction(this);
    };

    return XMLProcessingInstruction;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLRaw,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLRaw = (function(superClass) {
    extend(XMLRaw, superClass);

    function XMLRaw(parent, text) {
      XMLRaw.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing raw text");
      }
      this.value = this.stringify.raw(text);
    }

    XMLRaw.prototype.clone = function() {
      return Object.create(this);
    };

    XMLRaw.prototype.toString = function(options) {
      return this.options.writer.set(options).raw(this);
    };

    return XMLRaw;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStreamWriter, XMLText, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLElement = require('./XMLElement');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLWriterBase = require('./XMLWriterBase');

  module.exports = XMLStreamWriter = (function(superClass) {
    extend(XMLStreamWriter, superClass);

    function XMLStreamWriter(stream, options) {
      XMLStreamWriter.__super__.constructor.call(this, options);
      this.stream = stream;
    }

    XMLStreamWriter.prototype.document = function(doc) {
      var child, i, j, len, len1, ref, ref1, results;
      ref = doc.children;
      for (i = 0, len = ref.length; i < len; i++) {
        child = ref[i];
        child.isLastRootNode = false;
      }
      doc.children[doc.children.length - 1].isLastRootNode = true;
      ref1 = doc.children;
      results = [];
      for (j = 0, len1 = ref1.length; j < len1; j++) {
        child = ref1[j];
        switch (false) {
          case !(child instanceof XMLDeclaration):
            results.push(this.declaration(child));
            break;
          case !(child instanceof XMLDocType):
            results.push(this.docType(child));
            break;
          case !(child instanceof XMLComment):
            results.push(this.comment(child));
            break;
          case !(child instanceof XMLProcessingInstruction):
            results.push(this.processingInstruction(child));
            break;
          default:
            results.push(this.element(child));
        }
      }
      return results;
    };

    XMLStreamWriter.prototype.attribute = function(att) {
      return this.stream.write(' ' + att.name + '="' + att.value + '"');
    };

    XMLStreamWriter.prototype.cdata = function(node, level) {
      return this.stream.write(this.space(level) + '<![CDATA[' + node.text + ']]>' + this.endline(node));
    };

    XMLStreamWriter.prototype.comment = function(node, level) {
      return this.stream.write(this.space(level) + '<!-- ' + node.text + ' -->' + this.endline(node));
    };

    XMLStreamWriter.prototype.declaration = function(node, level) {
      this.stream.write(this.space(level));
      this.stream.write('<?xml version="' + node.version + '"');
      if (node.encoding != null) {
        this.stream.write(' encoding="' + node.encoding + '"');
      }
      if (node.standalone != null) {
        this.stream.write(' standalone="' + node.standalone + '"');
      }
      this.stream.write(this.spacebeforeslash + '?>');
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.docType = function(node, level) {
      var child, i, len, ref;
      level || (level = 0);
      this.stream.write(this.space(level));
      this.stream.write('<!DOCTYPE ' + node.root().name);
      if (node.pubID && node.sysID) {
        this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
      } else if (node.sysID) {
        this.stream.write(' SYSTEM "' + node.sysID + '"');
      }
      if (node.children.length > 0) {
        this.stream.write(' [');
        this.stream.write(this.endline(node));
        ref = node.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          switch (false) {
            case !(child instanceof XMLDTDAttList):
              this.dtdAttList(child, level + 1);
              break;
            case !(child instanceof XMLDTDElement):
              this.dtdElement(child, level + 1);
              break;
            case !(child instanceof XMLDTDEntity):
              this.dtdEntity(child, level + 1);
              break;
            case !(child instanceof XMLDTDNotation):
              this.dtdNotation(child, level + 1);
              break;
            case !(child instanceof XMLCData):
              this.cdata(child, level + 1);
              break;
            case !(child instanceof XMLComment):
              this.comment(child, level + 1);
              break;
            case !(child instanceof XMLProcessingInstruction):
              this.processingInstruction(child, level + 1);
              break;
            default:
              throw new Error("Unknown DTD node type: " + child.constructor.name);
          }
        }
        this.stream.write(']');
      }
      this.stream.write(this.spacebeforeslash + '>');
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.element = function(node, level) {
      var att, child, i, len, name, ref, ref1, space;
      level || (level = 0);
      space = this.space(level);
      this.stream.write(space + '<' + node.name);
      ref = node.attributes;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        this.attribute(att);
      }
      if (node.children.length === 0 || node.children.every(function(e) {
        return e.value === '';
      })) {
        if (this.allowEmpty) {
          this.stream.write('></' + node.name + '>');
        } else {
          this.stream.write(this.spacebeforeslash + '/>');
        }
      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {
        this.stream.write('>');
        this.stream.write(node.children[0].value);
        this.stream.write('</' + node.name + '>');
      } else {
        this.stream.write('>' + this.newline);
        ref1 = node.children;
        for (i = 0, len = ref1.length; i < len; i++) {
          child = ref1[i];
          switch (false) {
            case !(child instanceof XMLCData):
              this.cdata(child, level + 1);
              break;
            case !(child instanceof XMLComment):
              this.comment(child, level + 1);
              break;
            case !(child instanceof XMLElement):
              this.element(child, level + 1);
              break;
            case !(child instanceof XMLRaw):
              this.raw(child, level + 1);
              break;
            case !(child instanceof XMLText):
              this.text(child, level + 1);
              break;
            case !(child instanceof XMLProcessingInstruction):
              this.processingInstruction(child, level + 1);
              break;
            default:
              throw new Error("Unknown XML node type: " + child.constructor.name);
          }
        }
        this.stream.write(space + '</' + node.name + '>');
      }
      return this.stream.write(this.endline(node));
    };

    XMLStreamWriter.prototype.processingInstruction = function(node, level) {
      this.stream.write(this.space(level) + '<?' + node.target);
      if (node.value) {
        this.stream.write(' ' + node.value);
      }
      return this.stream.write(this.spacebeforeslash + '?>' + this.endline(node));
    };

    XMLStreamWriter.prototype.raw = function(node, level) {
      return this.stream.write(this.space(level) + node.value + this.endline(node));
    };

    XMLStreamWriter.prototype.text = function(node, level) {
      return this.stream.write(this.space(level) + node.value + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdAttList = function(node, level) {
      this.stream.write(this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType);
      if (node.defaultValueType !== '#DEFAULT') {
        this.stream.write(' ' + node.defaultValueType);
      }
      if (node.defaultValue) {
        this.stream.write(' "' + node.defaultValue + '"');
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdElement = function(node, level) {
      this.stream.write(this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value);
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdEntity = function(node, level) {
      this.stream.write(this.space(level) + '<!ENTITY');
      if (node.pe) {
        this.stream.write(' %');
      }
      this.stream.write(' ' + node.name);
      if (node.value) {
        this.stream.write(' "' + node.value + '"');
      } else {
        if (node.pubID && node.sysID) {
          this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
        } else if (node.sysID) {
          this.stream.write(' SYSTEM "' + node.sysID + '"');
        }
        if (node.nData) {
          this.stream.write(' NDATA ' + node.nData);
        }
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.dtdNotation = function(node, level) {
      this.stream.write(this.space(level) + '<!NOTATION ' + node.name);
      if (node.pubID && node.sysID) {
        this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
      } else if (node.pubID) {
        this.stream.write(' PUBLIC "' + node.pubID + '"');
      } else if (node.sysID) {
        this.stream.write(' SYSTEM "' + node.sysID + '"');
      }
      return this.stream.write(this.spacebeforeslash + '>' + this.endline(node));
    };

    XMLStreamWriter.prototype.endline = function(node) {
      if (!node.isLastRootNode) {
        return this.newline;
      } else {
        return '';
      }
    };

    return XMLStreamWriter;

  })(XMLWriterBase);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLText, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLElement = require('./XMLElement');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLWriterBase = require('./XMLWriterBase');

  module.exports = XMLStringWriter = (function(superClass) {
    extend(XMLStringWriter, superClass);

    function XMLStringWriter(options) {
      XMLStringWriter.__super__.constructor.call(this, options);
    }

    XMLStringWriter.prototype.document = function(doc) {
      var child, i, len, r, ref;
      this.textispresent = false;
      r = '';
      ref = doc.children;
      for (i = 0, len = ref.length; i < len; i++) {
        child = ref[i];
        r += (function() {
          switch (false) {
            case !(child instanceof XMLDeclaration):
              return this.declaration(child);
            case !(child instanceof XMLDocType):
              return this.docType(child);
            case !(child instanceof XMLComment):
              return this.comment(child);
            case !(child instanceof XMLProcessingInstruction):
              return this.processingInstruction(child);
            default:
              return this.element(child, 0);
          }
        }).call(this);
      }
      if (this.pretty && r.slice(-this.newline.length) === this.newline) {
        r = r.slice(0, -this.newline.length);
      }
      return r;
    };

    XMLStringWriter.prototype.attribute = function(att) {
      return ' ' + att.name + '="' + att.value + '"';
    };

    XMLStringWriter.prototype.cdata = function(node, level) {
      return this.space(level) + '<![CDATA[' + node.text + ']]>' + this.newline;
    };

    XMLStringWriter.prototype.comment = function(node, level) {
      return this.space(level) + '<!-- ' + node.text + ' -->' + this.newline;
    };

    XMLStringWriter.prototype.declaration = function(node, level) {
      var r;
      r = this.space(level);
      r += '<?xml version="' + node.version + '"';
      if (node.encoding != null) {
        r += ' encoding="' + node.encoding + '"';
      }
      if (node.standalone != null) {
        r += ' standalone="' + node.standalone + '"';
      }
      r += this.spacebeforeslash + '?>';
      r += this.newline;
      return r;
    };

    XMLStringWriter.prototype.docType = function(node, level) {
      var child, i, len, r, ref;
      level || (level = 0);
      r = this.space(level);
      r += '<!DOCTYPE ' + node.root().name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      if (node.children.length > 0) {
        r += ' [';
        r += this.newline;
        ref = node.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          r += (function() {
            switch (false) {
              case !(child instanceof XMLDTDAttList):
                return this.dtdAttList(child, level + 1);
              case !(child instanceof XMLDTDElement):
                return this.dtdElement(child, level + 1);
              case !(child instanceof XMLDTDEntity):
                return this.dtdEntity(child, level + 1);
              case !(child instanceof XMLDTDNotation):
                return this.dtdNotation(child, level + 1);
              case !(child instanceof XMLCData):
                return this.cdata(child, level + 1);
              case !(child instanceof XMLComment):
                return this.comment(child, level + 1);
              case !(child instanceof XMLProcessingInstruction):
                return this.processingInstruction(child, level + 1);
              default:
                throw new Error("Unknown DTD node type: " + child.constructor.name);
            }
          }).call(this);
        }
        r += ']';
      }
      r += this.spacebeforeslash + '>';
      r += this.newline;
      return r;
    };

    XMLStringWriter.prototype.element = function(node, level) {
      var att, child, i, j, len, len1, name, r, ref, ref1, ref2, space, textispresentwasset;
      level || (level = 0);
      textispresentwasset = false;
      if (this.textispresent) {
        this.newline = '';
        this.pretty = false;
      } else {
        this.newline = this.newlinedefault;
        this.pretty = this.prettydefault;
      }
      space = this.space(level);
      r = '';
      r += space + '<' + node.name;
      ref = node.attributes;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        r += this.attribute(att);
      }
      if (node.children.length === 0 || node.children.every(function(e) {
        return e.value === '';
      })) {
        if (this.allowEmpty) {
          r += '></' + node.name + '>' + this.newline;
        } else {
          r += this.spacebeforeslash + '/>' + this.newline;
        }
      } else if (this.pretty && node.children.length === 1 && (node.children[0].value != null)) {
        r += '>';
        r += node.children[0].value;
        r += '</' + node.name + '>' + this.newline;
      } else {
        if (this.dontprettytextnodes) {
          ref1 = node.children;
          for (i = 0, len = ref1.length; i < len; i++) {
            child = ref1[i];
            if (child.value != null) {
              this.textispresent++;
              textispresentwasset = true;
              break;
            }
          }
        }
        if (this.textispresent) {
          this.newline = '';
          this.pretty = false;
          space = this.space(level);
        }
        r += '>' + this.newline;
        ref2 = node.children;
        for (j = 0, len1 = ref2.length; j < len1; j++) {
          child = ref2[j];
          r += (function() {
            switch (false) {
              case !(child instanceof XMLCData):
                return this.cdata(child, level + 1);
              case !(child instanceof XMLComment):
                return this.comment(child, level + 1);
              case !(child instanceof XMLElement):
                return this.element(child, level + 1);
              case !(child instanceof XMLRaw):
                return this.raw(child, level + 1);
              case !(child instanceof XMLText):
                return this.text(child, level + 1);
              case !(child instanceof XMLProcessingInstruction):
                return this.processingInstruction(child, level + 1);
              default:
                throw new Error("Unknown XML node type: " + child.constructor.name);
            }
          }).call(this);
        }
        if (textispresentwasset) {
          this.textispresent--;
        }
        if (!this.textispresent) {
          this.newline = this.newlinedefault;
          this.pretty = this.prettydefault;
        }
        r += space + '</' + node.name + '>' + this.newline;
      }
      return r;
    };

    XMLStringWriter.prototype.processingInstruction = function(node, level) {
      var r;
      r = this.space(level) + '<?' + node.target;
      if (node.value) {
        r += ' ' + node.value;
      }
      r += this.spacebeforeslash + '?>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.raw = function(node, level) {
      return this.space(level) + node.value + this.newline;
    };

    XMLStringWriter.prototype.text = function(node, level) {
      return this.space(level) + node.value + this.newline;
    };

    XMLStringWriter.prototype.dtdAttList = function(node, level) {
      var r;
      r = this.space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType;
      if (node.defaultValueType !== '#DEFAULT') {
        r += ' ' + node.defaultValueType;
      }
      if (node.defaultValue) {
        r += ' "' + node.defaultValue + '"';
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.dtdElement = function(node, level) {
      return this.space(level) + '<!ELEMENT ' + node.name + ' ' + node.value + this.spacebeforeslash + '>' + this.newline;
    };

    XMLStringWriter.prototype.dtdEntity = function(node, level) {
      var r;
      r = this.space(level) + '<!ENTITY';
      if (node.pe) {
        r += ' %';
      }
      r += ' ' + node.name;
      if (node.value) {
        r += ' "' + node.value + '"';
      } else {
        if (node.pubID && node.sysID) {
          r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
        } else if (node.sysID) {
          r += ' SYSTEM "' + node.sysID + '"';
        }
        if (node.nData) {
          r += ' NDATA ' + node.nData;
        }
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.dtdNotation = function(node, level) {
      var r;
      r = this.space(level) + '<!NOTATION ' + node.name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.pubID) {
        r += ' PUBLIC "' + node.pubID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      r += this.spacebeforeslash + '>' + this.newline;
      return r;
    };

    XMLStringWriter.prototype.openNode = function(node, level) {
      var att, name, r, ref;
      level || (level = 0);
      if (node instanceof XMLElement) {
        r = this.space(level) + '<' + node.name;
        ref = node.attributes;
        for (name in ref) {
          if (!hasProp.call(ref, name)) continue;
          att = ref[name];
          r += this.attribute(att);
        }
        r += (node.children ? '>' : '/>') + this.newline;
        return r;
      } else {
        r = this.space(level) + '<!DOCTYPE ' + node.rootNodeName;
        if (node.pubID && node.sysID) {
          r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
        } else if (node.sysID) {
          r += ' SYSTEM "' + node.sysID + '"';
        }
        r += (node.children ? ' [' : '>') + this.newline;
        return r;
      }
    };

    XMLStringWriter.prototype.closeNode = function(node, level) {
      level || (level = 0);
      switch (false) {
        case !(node instanceof XMLElement):
          return this.space(level) + '</' + node.name + '>' + this.newline;
        case !(node instanceof XMLDocType):
          return this.space(level) + ']>' + this.newline;
      }
    };

    return XMLStringWriter;

  })(XMLWriterBase);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLStringifier,
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    hasProp = {}.hasOwnProperty;

  module.exports = XMLStringifier = (function() {
    function XMLStringifier(options) {
      this.assertLegalChar = bind(this.assertLegalChar, this);
      var key, ref, value;
      options || (options = {});
      this.noDoubleEncoding = options.noDoubleEncoding;
      ref = options.stringify || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this[key] = value;
      }
    }

    XMLStringifier.prototype.eleName = function(val) {
      val = '' + val || '';
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.eleText = function(val) {
      val = '' + val || '';
      return this.assertLegalChar(this.elEscape(val));
    };

    XMLStringifier.prototype.cdata = function(val) {
      val = '' + val || '';
      val = val.replace(']]>', ']]]]><![CDATA[>');
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.comment = function(val) {
      val = '' + val || '';
      if (val.match(/--/)) {
        throw new Error("Comment text cannot contain double-hypen: " + val);
      }
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.raw = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.attName = function(val) {
      return val = '' + val || '';
    };

    XMLStringifier.prototype.attValue = function(val) {
      val = '' + val || '';
      return this.attEscape(val);
    };

    XMLStringifier.prototype.insTarget = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.insValue = function(val) {
      val = '' + val || '';
      if (val.match(/\?>/)) {
        throw new Error("Invalid processing instruction value: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlVersion = function(val) {
      val = '' + val || '';
      if (!val.match(/1\.[0-9]+/)) {
        throw new Error("Invalid version number: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlEncoding = function(val) {
      val = '' + val || '';
      if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/)) {
        throw new Error("Invalid encoding: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlStandalone = function(val) {
      if (val) {
        return "yes";
      } else {
        return "no";
      }
    };

    XMLStringifier.prototype.dtdPubID = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdSysID = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdElementValue = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdAttType = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdAttDefault = function(val) {
      if (val != null) {
        return '' + val || '';
      } else {
        return val;
      }
    };

    XMLStringifier.prototype.dtdEntityValue = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.dtdNData = function(val) {
      return '' + val || '';
    };

    XMLStringifier.prototype.convertAttKey = '@';

    XMLStringifier.prototype.convertPIKey = '?';

    XMLStringifier.prototype.convertTextKey = '#text';

    XMLStringifier.prototype.convertCDataKey = '#cdata';

    XMLStringifier.prototype.convertCommentKey = '#comment';

    XMLStringifier.prototype.convertRawKey = '#raw';

    XMLStringifier.prototype.assertLegalChar = function(str) {
      var res;
      res = str.match(/[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/);
      if (res) {
        throw new Error("Invalid character in string: " + str + " at index " + res.index);
      }
      return str;
    };

    XMLStringifier.prototype.elEscape = function(str) {
      var ampregex;
      ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\r/g, '&#xD;');
    };

    XMLStringifier.prototype.attEscape = function(str) {
      var ampregex;
      ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/\t/g, '&#x9;').replace(/\n/g, '&#xA;').replace(/\r/g, '&#xD;');
    };

    return XMLStringifier;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNode, XMLText,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLText = (function(superClass) {
    extend(XMLText, superClass);

    function XMLText(parent, text) {
      XMLText.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing element text");
      }
      this.value = this.stringify.eleText(text);
    }

    XMLText.prototype.clone = function() {
      return Object.create(this);
    };

    XMLText.prototype.toString = function(options) {
      return this.options.writer.set(options).text(this);
    };

    return XMLText;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLWriterBase,
    hasProp = {}.hasOwnProperty;

  module.exports = XMLWriterBase = (function() {
    function XMLWriterBase(options) {
      var key, ref, ref1, ref2, ref3, ref4, ref5, ref6, value;
      options || (options = {});
      this.pretty = options.pretty || false;
      this.allowEmpty = (ref = options.allowEmpty) != null ? ref : false;
      if (this.pretty) {
        this.indent = (ref1 = options.indent) != null ? ref1 : '  ';
        this.newline = (ref2 = options.newline) != null ? ref2 : '\n';
        this.offset = (ref3 = options.offset) != null ? ref3 : 0;
        this.dontprettytextnodes = (ref4 = options.dontprettytextnodes) != null ? ref4 : 0;
      } else {
        this.indent = '';
        this.newline = '';
        this.offset = 0;
        this.dontprettytextnodes = 0;
      }
      this.spacebeforeslash = (ref5 = options.spacebeforeslash) != null ? ref5 : '';
      if (this.spacebeforeslash === true) {
        this.spacebeforeslash = ' ';
      }
      this.newlinedefault = this.newline;
      this.prettydefault = this.pretty;
      ref6 = options.writer || {};
      for (key in ref6) {
        if (!hasProp.call(ref6, key)) continue;
        value = ref6[key];
        this[key] = value;
      }
    }

    XMLWriterBase.prototype.set = function(options) {
      var key, ref, value;
      options || (options = {});
      if ("pretty" in options) {
        this.pretty = options.pretty;
      }
      if ("allowEmpty" in options) {
        this.allowEmpty = options.allowEmpty;
      }
      if (this.pretty) {
        this.indent = "indent" in options ? options.indent : '  ';
        this.newline = "newline" in options ? options.newline : '\n';
        this.offset = "offset" in options ? options.offset : 0;
        this.dontprettytextnodes = "dontprettytextnodes" in options ? options.dontprettytextnodes : 0;
      } else {
        this.indent = '';
        this.newline = '';
        this.offset = 0;
        this.dontprettytextnodes = 0;
      }
      this.spacebeforeslash = "spacebeforeslash" in options ? options.spacebeforeslash : '';
      if (this.spacebeforeslash === true) {
        this.spacebeforeslash = ' ';
      }
      this.newlinedefault = this.newline;
      this.prettydefault = this.pretty;
      ref = options.writer || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this[key] = value;
      }
      return this;
    };

    XMLWriterBase.prototype.space = function(level) {
      var indent;
      if (this.pretty) {
        indent = (level || 0) + this.offset + 1;
        if (indent > 0) {
          return new Array(indent).join(this.indent);
        } else {
          return '';
        }
      } else {
        return '';
      }
    };

    return XMLWriterBase;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDocument, XMLDocumentCB, XMLStreamWriter, XMLStringWriter, assign, isFunction, ref;

  ref = require('./Utility'), assign = ref.assign, isFunction = ref.isFunction;

  XMLDocument = require('./XMLDocument');

  XMLDocumentCB = require('./XMLDocumentCB');

  XMLStringWriter = require('./XMLStringWriter');

  XMLStreamWriter = require('./XMLStreamWriter');

  module.exports.create = function(name, xmldec, doctype, options) {
    var doc, root;
    if (name == null) {
      throw new Error("Root element needs a name");
    }
    options = assign({}, xmldec, doctype, options);
    doc = new XMLDocument(options);
    root = doc.element(name);
    if (!options.headless) {
      doc.declaration(options);
      if ((options.pubID != null) || (options.sysID != null)) {
        doc.doctype(options);
      }
    }
    return root;
  };

  module.exports.begin = function(options, onData, onEnd) {
    var ref1;
    if (isFunction(options)) {
      ref1 = [options, onData], onData = ref1[0], onEnd = ref1[1];
      options = {};
    }
    if (onData) {
      return new XMLDocumentCB(options, onData, onEnd);
    } else {
      return new XMLDocument(options);
    }
  };

  module.exports.stringWriter = function(options) {
    return new XMLStringWriter(options);
  };

  module.exports.streamWriter = function(stream, options) {
    return new XMLStreamWriter(stream, options);
  };

}).call(this);
You can choose any one of those:

The MIT License (MIT):

link:http://opensource.org/licenses/MIT

LGPL:
http://www.gnu.org/licenses/lgpl.html
this.addScript('dom.js',['DOMImplementation','XMLSerializer']);
this.addScript('dom-parser.js',['DOMHandler','DOMParser'],
		['DOMImplementation','XMLReader']);
this.addScript('sax.js','XMLReader');### Version 0.1.16

Sat May  4 14:58:03 UTC 2013

 * Correctly handle multibyte Unicode greater than two byts. #57. #56.
 * Initial unit testing and test coverage. #53. #46. #19.
 * Create Bower `component.json` #52.

### Version 0.1.8

 * Add: some test case from node-o3-xml(excludes xpath support)
 * Fix: remove existed attribute before setting  (bug introduced in v0.1.5)
 * Fix: index direct access for childNodes and any NodeList collection(not w3c standard)
 * Fix: remove last child bug
{
  "name": "xmldom",
  "version": "0.1.15",
  "main": "dom-parser.js",
  "ignore": [
    "**/.*",
    "node_modules",
    "components"
  ]
}
function DOMParser(options){
	this.options = options ||{locator:{}};
	
}
DOMParser.prototype.parseFromString = function(source,mimeType){
	var options = this.options;
	var sax =  new XMLReader();
	var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
	var errorHandler = options.errorHandler;
	var locator = options.locator;
	var defaultNSMap = options.xmlns||{};
	var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
	if(locator){
		domBuilder.setDocumentLocator(locator)
	}
	
	sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
	sax.domBuilder = options.domBuilder || domBuilder;
	if(/\/x?html?$/.test(mimeType)){
		entityMap.nbsp = '\xa0';
		entityMap.copy = '\xa9';
		defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
	}
	defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
	if(source){
		sax.parse(source,defaultNSMap,entityMap);
	}else{
		sax.errorHandler.error("invalid doc source");
	}
	return domBuilder.doc;
}
function buildErrorHandler(errorImpl,domBuilder,locator){
	if(!errorImpl){
		if(domBuilder instanceof DOMHandler){
			return domBuilder;
		}
		errorImpl = domBuilder ;
	}
	var errorHandler = {}
	var isCallback = errorImpl instanceof Function;
	locator = locator||{}
	function build(key){
		var fn = errorImpl[key];
		if(!fn && isCallback){
			fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
		}
		errorHandler[key] = fn && function(msg){
			fn('[xmldom '+key+']\t'+msg+_locator(locator));
		}||function(){};
	}
	build('warning');
	build('error');
	build('fatalError');
	return errorHandler;
}

//console.log('#\n\n\n\n\n\n\n####')
/**
 * +ContentHandler+ErrorHandler
 * +LexicalHandler+EntityResolver2
 * -DeclHandler-DTDHandler 
 * 
 * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
 * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
 * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
 */
function DOMHandler() {
    this.cdata = false;
}
function position(locator,node){
	node.lineNumber = locator.lineNumber;
	node.columnNumber = locator.columnNumber;
}
/**
 * @see org.xml.sax.ContentHandler#startDocument
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
 */ 
DOMHandler.prototype = {
	startDocument : function() {
    	this.doc = new DOMImplementation().createDocument(null, null, null);
    	if (this.locator) {
        	this.doc.documentURI = this.locator.systemId;
    	}
	},
	startElement:function(namespaceURI, localName, qName, attrs) {
		var doc = this.doc;
	    var el = doc.createElementNS(namespaceURI, qName||localName);
	    var len = attrs.length;
	    appendElement(this, el);
	    this.currentElement = el;
	    
		this.locator && position(this.locator,el)
	    for (var i = 0 ; i < len; i++) {
	        var namespaceURI = attrs.getURI(i);
	        var value = attrs.getValue(i);
	        var qName = attrs.getQName(i);
			var attr = doc.createAttributeNS(namespaceURI, qName);
			this.locator &&position(attrs.getLocator(i),attr);
			attr.value = attr.nodeValue = value;
			el.setAttributeNode(attr)
	    }
	},
	endElement:function(namespaceURI, localName, qName) {
		var current = this.currentElement
		var tagName = current.tagName;
		this.currentElement = current.parentNode;
	},
	startPrefixMapping:function(prefix, uri) {
	},
	endPrefixMapping:function(prefix) {
	},
	processingInstruction:function(target, data) {
	    var ins = this.doc.createProcessingInstruction(target, data);
	    this.locator && position(this.locator,ins)
	    appendElement(this, ins);
	},
	ignorableWhitespace:function(ch, start, length) {
	},
	characters:function(chars, start, length) {
		chars = _toString.apply(this,arguments)
		//console.log(chars)
		if(chars){
			if (this.cdata) {
				var charNode = this.doc.createCDATASection(chars);
			} else {
				var charNode = this.doc.createTextNode(chars);
			}
			if(this.currentElement){
				this.currentElement.appendChild(charNode);
			}else if(/^\s*$/.test(chars)){
				this.doc.appendChild(charNode);
				//process xml
			}
			this.locator && position(this.locator,charNode)
		}
	},
	skippedEntity:function(name) {
	},
	endDocument:function() {
		this.doc.normalize();
	},
	setDocumentLocator:function (locator) {
	    if(this.locator = locator){// && !('lineNumber' in locator)){
	    	locator.lineNumber = 0;
	    }
	},
	//LexicalHandler
	comment:function(chars, start, length) {
		chars = _toString.apply(this,arguments)
	    var comm = this.doc.createComment(chars);
	    this.locator && position(this.locator,comm)
	    appendElement(this, comm);
	},
	
	startCDATA:function() {
	    //used in characters() methods
	    this.cdata = true;
	},
	endCDATA:function() {
	    this.cdata = false;
	},
	
	startDTD:function(name, publicId, systemId) {
		var impl = this.doc.implementation;
	    if (impl && impl.createDocumentType) {
	        var dt = impl.createDocumentType(name, publicId, systemId);
	        this.locator && position(this.locator,dt)
	        appendElement(this, dt);
	    }
	},
	/**
	 * @see org.xml.sax.ErrorHandler
	 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
	 */
	warning:function(error) {
		console.warn('[xmldom warning]\t'+error,_locator(this.locator));
	},
	error:function(error) {
		console.error('[xmldom error]\t'+error,_locator(this.locator));
	},
	fatalError:function(error) {
		console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
	    throw error;
	}
}
function _locator(l){
	if(l){
		return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
	}
}
function _toString(chars,start,length){
	if(typeof chars == 'string'){
		return chars.substr(start,length)
	}else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
		if(chars.length >= start+length || start){
			return new java.lang.String(chars,start,length)+'';
		}
		return chars;
	}
}

/*
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
 * used method of org.xml.sax.ext.LexicalHandler:
 *  #comment(chars, start, length)
 *  #startCDATA()
 *  #endCDATA()
 *  #startDTD(name, publicId, systemId)
 *
 *
 * IGNORED method of org.xml.sax.ext.LexicalHandler:
 *  #endDTD()
 *  #startEntity(name)
 *  #endEntity(name)
 *
 *
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
 * IGNORED method of org.xml.sax.ext.DeclHandler
 * 	#attributeDecl(eName, aName, type, mode, value)
 *  #elementDecl(name, model)
 *  #externalEntityDecl(name, publicId, systemId)
 *  #internalEntityDecl(name, value)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
 * IGNORED method of org.xml.sax.EntityResolver2
 *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
 *  #resolveEntity(publicId, systemId)
 *  #getExternalSubset(name, baseURI)
 * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
 * IGNORED method of org.xml.sax.DTDHandler
 *  #notationDecl(name, publicId, systemId) {};
 *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
 */
"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
	DOMHandler.prototype[key] = function(){return null}
})

/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
function appendElement (hander,node) {
    if (!hander.currentElement) {
        hander.doc.appendChild(node);
    } else {
        hander.currentElement.appendChild(node);
    }
}//appendChild and setAttributeNS are preformance key

//if(typeof require == 'function'){
	var XMLReader = require('./sax').XMLReader;
	var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;
	exports.XMLSerializer = require('./dom').XMLSerializer ;
	exports.DOMParser = DOMParser;
//}
/*
 * DOM Level 2
 * Object DOMException
 * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
 */

function copy(src,dest){
	for(var p in src){
		dest[p] = src[p];
	}
}
/**
^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
 */
function _extends(Class,Super){
	var pt = Class.prototype;
	if(Object.create){
		var ppt = Object.create(Super.prototype)
		pt.__proto__ = ppt;
	}
	if(!(pt instanceof Super)){
		function t(){};
		t.prototype = Super.prototype;
		t = new t();
		copy(pt,t);
		Class.prototype = pt = t;
	}
	if(pt.constructor != Class){
		if(typeof Class != 'function'){
			console.error("unknow Class:"+Class)
		}
		pt.constructor = Class
	}
}
var htmlns = 'http://www.w3.org/1999/xhtml' ;
// Node Types
var NodeType = {}
var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;

// ExceptionCode
var ExceptionCode = {}
var ExceptionMessage = {};
var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
//level2
var INVALID_STATE_ERR        	= ExceptionCode.INVALID_STATE_ERR        	= ((ExceptionMessage[11]="Invalid state"),11);
var SYNTAX_ERR               	= ExceptionCode.SYNTAX_ERR               	= ((ExceptionMessage[12]="Syntax error"),12);
var INVALID_MODIFICATION_ERR 	= ExceptionCode.INVALID_MODIFICATION_ERR 	= ((ExceptionMessage[13]="Invalid modification"),13);
var NAMESPACE_ERR            	= ExceptionCode.NAMESPACE_ERR           	= ((ExceptionMessage[14]="Invalid namespace"),14);
var INVALID_ACCESS_ERR       	= ExceptionCode.INVALID_ACCESS_ERR      	= ((ExceptionMessage[15]="Invalid access"),15);


function DOMException(code, message) {
	if(message instanceof Error){
		var error = message;
	}else{
		error = this;
		Error.call(this, ExceptionMessage[code]);
		this.message = ExceptionMessage[code];
		if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
	}
	error.code = code;
	if(message) this.message = this.message + ": " + message;
	return error;
};
DOMException.prototype = Error.prototype;
copy(ExceptionCode,DOMException)
/**
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
 * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
 * The items in the NodeList are accessible via an integral index, starting from 0.
 */
function NodeList() {
};
NodeList.prototype = {
	/**
	 * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
	 * @standard level1
	 */
	length:0, 
	/**
	 * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
	 * @standard level1
	 * @param index  unsigned long 
	 *   Index into the collection.
	 * @return Node
	 * 	The node at the indexth position in the NodeList, or null if that is not a valid index. 
	 */
	item: function(index) {
		return this[index] || null;
	},
	toString:function(isHTML,nodeFilter){
		for(var buf = [], i = 0;i<this.length;i++){
			serializeToString(this[i],buf,isHTML,nodeFilter);
		}
		return buf.join('');
	}
};
function LiveNodeList(node,refresh){
	this._node = node;
	this._refresh = refresh
	_updateLiveList(this);
}
function _updateLiveList(list){
	var inc = list._node._inc || list._node.ownerDocument._inc;
	if(list._inc != inc){
		var ls = list._refresh(list._node);
		//console.log(ls.length)
		__set__(list,'length',ls.length);
		copy(ls,list);
		list._inc = inc;
	}
}
LiveNodeList.prototype.item = function(i){
	_updateLiveList(this);
	return this[i];
}

_extends(LiveNodeList,NodeList);
/**
 * 
 * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
 * NamedNodeMap objects in the DOM are live.
 * used for attributes or DocumentType entities 
 */
function NamedNodeMap() {
};

function _findNodeIndex(list,node){
	var i = list.length;
	while(i--){
		if(list[i] === node){return i}
	}
}

function _addNamedNode(el,list,newAttr,oldAttr){
	if(oldAttr){
		list[_findNodeIndex(list,oldAttr)] = newAttr;
	}else{
		list[list.length++] = newAttr;
	}
	if(el){
		newAttr.ownerElement = el;
		var doc = el.ownerDocument;
		if(doc){
			oldAttr && _onRemoveAttribute(doc,el,oldAttr);
			_onAddAttribute(doc,el,newAttr);
		}
	}
}
function _removeNamedNode(el,list,attr){
	//console.log('remove attr:'+attr)
	var i = _findNodeIndex(list,attr);
	if(i>=0){
		var lastIndex = list.length-1
		while(i<lastIndex){
			list[i] = list[++i]
		}
		list.length = lastIndex;
		if(el){
			var doc = el.ownerDocument;
			if(doc){
				_onRemoveAttribute(doc,el,attr);
				attr.ownerElement = null;
			}
		}
	}else{
		throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
	}
}
NamedNodeMap.prototype = {
	length:0,
	item:NodeList.prototype.item,
	getNamedItem: function(key) {
//		if(key.indexOf(':')>0 || key == 'xmlns'){
//			return null;
//		}
		//console.log()
		var i = this.length;
		while(i--){
			var attr = this[i];
			//console.log(attr.nodeName,key)
			if(attr.nodeName == key){
				return attr;
			}
		}
	},
	setNamedItem: function(attr) {
		var el = attr.ownerElement;
		if(el && el!=this._ownerElement){
			throw new DOMException(INUSE_ATTRIBUTE_ERR);
		}
		var oldAttr = this.getNamedItem(attr.nodeName);
		_addNamedNode(this._ownerElement,this,attr,oldAttr);
		return oldAttr;
	},
	/* returns Node */
	setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
		var el = attr.ownerElement, oldAttr;
		if(el && el!=this._ownerElement){
			throw new DOMException(INUSE_ATTRIBUTE_ERR);
		}
		oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
		_addNamedNode(this._ownerElement,this,attr,oldAttr);
		return oldAttr;
	},

	/* returns Node */
	removeNamedItem: function(key) {
		var attr = this.getNamedItem(key);
		_removeNamedNode(this._ownerElement,this,attr);
		return attr;
		
		
	},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
	
	//for level2
	removeNamedItemNS:function(namespaceURI,localName){
		var attr = this.getNamedItemNS(namespaceURI,localName);
		_removeNamedNode(this._ownerElement,this,attr);
		return attr;
	},
	getNamedItemNS: function(namespaceURI, localName) {
		var i = this.length;
		while(i--){
			var node = this[i];
			if(node.localName == localName && node.namespaceURI == namespaceURI){
				return node;
			}
		}
		return null;
	}
};
/**
 * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
 */
function DOMImplementation(/* Object */ features) {
	this._features = {};
	if (features) {
		for (var feature in features) {
			 this._features = features[feature];
		}
	}
};

DOMImplementation.prototype = {
	hasFeature: function(/* string */ feature, /* string */ version) {
		var versions = this._features[feature.toLowerCase()];
		if (versions && (!version || version in versions)) {
			return true;
		} else {
			return false;
		}
	},
	// Introduced in DOM Level 2:
	createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
		var doc = new Document();
		doc.implementation = this;
		doc.childNodes = new NodeList();
		doc.doctype = doctype;
		if(doctype){
			doc.appendChild(doctype);
		}
		if(qualifiedName){
			var root = doc.createElementNS(namespaceURI,qualifiedName);
			doc.appendChild(root);
		}
		return doc;
	},
	// Introduced in DOM Level 2:
	createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
		var node = new DocumentType();
		node.name = qualifiedName;
		node.nodeName = qualifiedName;
		node.publicId = publicId;
		node.systemId = systemId;
		// Introduced in DOM Level 2:
		//readonly attribute DOMString        internalSubset;
		
		//TODO:..
		//  readonly attribute NamedNodeMap     entities;
		//  readonly attribute NamedNodeMap     notations;
		return node;
	}
};


/**
 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
 */

function Node() {
};

Node.prototype = {
	firstChild : null,
	lastChild : null,
	previousSibling : null,
	nextSibling : null,
	attributes : null,
	parentNode : null,
	childNodes : null,
	ownerDocument : null,
	nodeValue : null,
	namespaceURI : null,
	prefix : null,
	localName : null,
	// Modified in DOM Level 2:
	insertBefore:function(newChild, refChild){//raises 
		return _insertBefore(this,newChild,refChild);
	},
	replaceChild:function(newChild, oldChild){//raises 
		this.insertBefore(newChild,oldChild);
		if(oldChild){
			this.removeChild(oldChild);
		}
	},
	removeChild:function(oldChild){
		return _removeChild(this,oldChild);
	},
	appendChild:function(newChild){
		return this.insertBefore(newChild,null);
	},
	hasChildNodes:function(){
		return this.firstChild != null;
	},
	cloneNode:function(deep){
		return cloneNode(this.ownerDocument||this,this,deep);
	},
	// Modified in DOM Level 2:
	normalize:function(){
		var child = this.firstChild;
		while(child){
			var next = child.nextSibling;
			if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
				this.removeChild(next);
				child.appendData(next.data);
			}else{
				child.normalize();
				child = next;
			}
		}
	},
  	// Introduced in DOM Level 2:
	isSupported:function(feature, version){
		return this.ownerDocument.implementation.hasFeature(feature,version);
	},
    // Introduced in DOM Level 2:
    hasAttributes:function(){
    	return this.attributes.length>0;
    },
    lookupPrefix:function(namespaceURI){
    	var el = this;
    	while(el){
    		var map = el._nsMap;
    		//console.dir(map)
    		if(map){
    			for(var n in map){
    				if(map[n] == namespaceURI){
    					return n;
    				}
    			}
    		}
    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
    	}
    	return null;
    },
    // Introduced in DOM Level 3:
    lookupNamespaceURI:function(prefix){
    	var el = this;
    	while(el){
    		var map = el._nsMap;
    		//console.dir(map)
    		if(map){
    			if(prefix in map){
    				return map[prefix] ;
    			}
    		}
    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
    	}
    	return null;
    },
    // Introduced in DOM Level 3:
    isDefaultNamespace:function(namespaceURI){
    	var prefix = this.lookupPrefix(namespaceURI);
    	return prefix == null;
    }
};


function _xmlEncoder(c){
	return c == '<' && '&lt;' ||
         c == '>' && '&gt;' ||
         c == '&' && '&amp;' ||
         c == '"' && '&quot;' ||
         '&#'+c.charCodeAt()+';'
}


copy(NodeType,Node);
copy(NodeType,Node.prototype);

/**
 * @param callback return true for continue,false for break
 * @return boolean true: break visit;
 */
function _visitNode(node,callback){
	if(callback(node)){
		return true;
	}
	if(node = node.firstChild){
		do{
			if(_visitNode(node,callback)){return true}
        }while(node=node.nextSibling)
    }
}



function Document(){
}
function _onAddAttribute(doc,el,newAttr){
	doc && doc._inc++;
	var ns = newAttr.namespaceURI ;
	if(ns == 'http://www.w3.org/2000/xmlns/'){
		//update namespace
		el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value
	}
}
function _onRemoveAttribute(doc,el,newAttr,remove){
	doc && doc._inc++;
	var ns = newAttr.namespaceURI ;
	if(ns == 'http://www.w3.org/2000/xmlns/'){
		//update namespace
		delete el._nsMap[newAttr.prefix?newAttr.localName:'']
	}
}
function _onUpdateChild(doc,el,newChild){
	if(doc && doc._inc){
		doc._inc++;
		//update childNodes
		var cs = el.childNodes;
		if(newChild){
			cs[cs.length++] = newChild;
		}else{
			//console.log(1)
			var child = el.firstChild;
			var i = 0;
			while(child){
				cs[i++] = child;
				child =child.nextSibling;
			}
			cs.length = i;
		}
	}
}

/**
 * attributes;
 * children;
 * 
 * writeable properties:
 * nodeValue,Attr:value,CharacterData:data
 * prefix
 */
function _removeChild(parentNode,child){
	var previous = child.previousSibling;
	var next = child.nextSibling;
	if(previous){
		previous.nextSibling = next;
	}else{
		parentNode.firstChild = next
	}
	if(next){
		next.previousSibling = previous;
	}else{
		parentNode.lastChild = previous;
	}
	_onUpdateChild(parentNode.ownerDocument,parentNode);
	return child;
}
/**
 * preformance key(refChild == null)
 */
function _insertBefore(parentNode,newChild,nextChild){
	var cp = newChild.parentNode;
	if(cp){
		cp.removeChild(newChild);//remove and update
	}
	if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
		var newFirst = newChild.firstChild;
		if (newFirst == null) {
			return newChild;
		}
		var newLast = newChild.lastChild;
	}else{
		newFirst = newLast = newChild;
	}
	var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;

	newFirst.previousSibling = pre;
	newLast.nextSibling = nextChild;
	
	
	if(pre){
		pre.nextSibling = newFirst;
	}else{
		parentNode.firstChild = newFirst;
	}
	if(nextChild == null){
		parentNode.lastChild = newLast;
	}else{
		nextChild.previousSibling = newLast;
	}
	do{
		newFirst.parentNode = parentNode;
	}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
	_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
	//console.log(parentNode.lastChild.nextSibling == null)
	if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
		newChild.firstChild = newChild.lastChild = null;
	}
	return newChild;
}
function _appendSingleChild(parentNode,newChild){
	var cp = newChild.parentNode;
	if(cp){
		var pre = parentNode.lastChild;
		cp.removeChild(newChild);//remove and update
		var pre = parentNode.lastChild;
	}
	var pre = parentNode.lastChild;
	newChild.parentNode = parentNode;
	newChild.previousSibling = pre;
	newChild.nextSibling = null;
	if(pre){
		pre.nextSibling = newChild;
	}else{
		parentNode.firstChild = newChild;
	}
	parentNode.lastChild = newChild;
	_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
	return newChild;
	//console.log("__aa",parentNode.lastChild.nextSibling == null)
}
Document.prototype = {
	//implementation : null,
	nodeName :  '#document',
	nodeType :  DOCUMENT_NODE,
	doctype :  null,
	documentElement :  null,
	_inc : 1,
	
	insertBefore :  function(newChild, refChild){//raises 
		if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
			var child = newChild.firstChild;
			while(child){
				var next = child.nextSibling;
				this.insertBefore(child,refChild);
				child = next;
			}
			return newChild;
		}
		if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
			this.documentElement = newChild;
		}
		
		return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
	},
	removeChild :  function(oldChild){
		if(this.documentElement == oldChild){
			this.documentElement = null;
		}
		return _removeChild(this,oldChild);
	},
	// Introduced in DOM Level 2:
	importNode : function(importedNode,deep){
		return importNode(this,importedNode,deep);
	},
	// Introduced in DOM Level 2:
	getElementById :	function(id){
		var rtv = null;
		_visitNode(this.documentElement,function(node){
			if(node.nodeType == ELEMENT_NODE){
				if(node.getAttribute('id') == id){
					rtv = node;
					return true;
				}
			}
		})
		return rtv;
	},
	
	//document factory method:
	createElement :	function(tagName){
		var node = new Element();
		node.ownerDocument = this;
		node.nodeName = tagName;
		node.tagName = tagName;
		node.childNodes = new NodeList();
		var attrs	= node.attributes = new NamedNodeMap();
		attrs._ownerElement = node;
		return node;
	},
	createDocumentFragment :	function(){
		var node = new DocumentFragment();
		node.ownerDocument = this;
		node.childNodes = new NodeList();
		return node;
	},
	createTextNode :	function(data){
		var node = new Text();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createComment :	function(data){
		var node = new Comment();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createCDATASection :	function(data){
		var node = new CDATASection();
		node.ownerDocument = this;
		node.appendData(data)
		return node;
	},
	createProcessingInstruction :	function(target,data){
		var node = new ProcessingInstruction();
		node.ownerDocument = this;
		node.tagName = node.target = target;
		node.nodeValue= node.data = data;
		return node;
	},
	createAttribute :	function(name){
		var node = new Attr();
		node.ownerDocument	= this;
		node.name = name;
		node.nodeName	= name;
		node.localName = name;
		node.specified = true;
		return node;
	},
	createEntityReference :	function(name){
		var node = new EntityReference();
		node.ownerDocument	= this;
		node.nodeName	= name;
		return node;
	},
	// Introduced in DOM Level 2:
	createElementNS :	function(namespaceURI,qualifiedName){
		var node = new Element();
		var pl = qualifiedName.split(':');
		var attrs	= node.attributes = new NamedNodeMap();
		node.childNodes = new NodeList();
		node.ownerDocument = this;
		node.nodeName = qualifiedName;
		node.tagName = qualifiedName;
		node.namespaceURI = namespaceURI;
		if(pl.length == 2){
			node.prefix = pl[0];
			node.localName = pl[1];
		}else{
			//el.prefix = null;
			node.localName = qualifiedName;
		}
		attrs._ownerElement = node;
		return node;
	},
	// Introduced in DOM Level 2:
	createAttributeNS :	function(namespaceURI,qualifiedName){
		var node = new Attr();
		var pl = qualifiedName.split(':');
		node.ownerDocument = this;
		node.nodeName = qualifiedName;
		node.name = qualifiedName;
		node.namespaceURI = namespaceURI;
		node.specified = true;
		if(pl.length == 2){
			node.prefix = pl[0];
			node.localName = pl[1];
		}else{
			//el.prefix = null;
			node.localName = qualifiedName;
		}
		return node;
	}
};
_extends(Document,Node);


function Element() {
	this._nsMap = {};
};
Element.prototype = {
	nodeType : ELEMENT_NODE,
	hasAttribute : function(name){
		return this.getAttributeNode(name)!=null;
	},
	getAttribute : function(name){
		var attr = this.getAttributeNode(name);
		return attr && attr.value || '';
	},
	getAttributeNode : function(name){
		return this.attributes.getNamedItem(name);
	},
	setAttribute : function(name, value){
		var attr = this.ownerDocument.createAttribute(name);
		attr.value = attr.nodeValue = "" + value;
		this.setAttributeNode(attr)
	},
	removeAttribute : function(name){
		var attr = this.getAttributeNode(name)
		attr && this.removeAttributeNode(attr);
	},
	
	//four real opeartion method
	appendChild:function(newChild){
		if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
			return this.insertBefore(newChild,null);
		}else{
			return _appendSingleChild(this,newChild);
		}
	},
	setAttributeNode : function(newAttr){
		return this.attributes.setNamedItem(newAttr);
	},
	setAttributeNodeNS : function(newAttr){
		return this.attributes.setNamedItemNS(newAttr);
	},
	removeAttributeNode : function(oldAttr){
		//console.log(this == oldAttr.ownerElement)
		return this.attributes.removeNamedItem(oldAttr.nodeName);
	},
	//get real attribute name,and remove it by removeAttributeNode
	removeAttributeNS : function(namespaceURI, localName){
		var old = this.getAttributeNodeNS(namespaceURI, localName);
		old && this.removeAttributeNode(old);
	},
	
	hasAttributeNS : function(namespaceURI, localName){
		return this.getAttributeNodeNS(namespaceURI, localName)!=null;
	},
	getAttributeNS : function(namespaceURI, localName){
		var attr = this.getAttributeNodeNS(namespaceURI, localName);
		return attr && attr.value || '';
	},
	setAttributeNS : function(namespaceURI, qualifiedName, value){
		var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
		attr.value = attr.nodeValue = "" + value;
		this.setAttributeNode(attr)
	},
	getAttributeNodeNS : function(namespaceURI, localName){
		return this.attributes.getNamedItemNS(namespaceURI, localName);
	},
	
	getElementsByTagName : function(tagName){
		return new LiveNodeList(this,function(base){
			var ls = [];
			_visitNode(base,function(node){
				if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
					ls.push(node);
				}
			});
			return ls;
		});
	},
	getElementsByTagNameNS : function(namespaceURI, localName){
		return new LiveNodeList(this,function(base){
			var ls = [];
			_visitNode(base,function(node){
				if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
					ls.push(node);
				}
			});
			return ls;
			
		});
	}
};
Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;


_extends(Element,Node);
function Attr() {
};
Attr.prototype.nodeType = ATTRIBUTE_NODE;
_extends(Attr,Node);


function CharacterData() {
};
CharacterData.prototype = {
	data : '',
	substringData : function(offset, count) {
		return this.data.substring(offset, offset+count);
	},
	appendData: function(text) {
		text = this.data+text;
		this.nodeValue = this.data = text;
		this.length = text.length;
	},
	insertData: function(offset,text) {
		this.replaceData(offset,0,text);
	
	},
	appendChild:function(newChild){
		throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
	},
	deleteData: function(offset, count) {
		this.replaceData(offset,count,"");
	},
	replaceData: function(offset, count, text) {
		var start = this.data.substring(0,offset);
		var end = this.data.substring(offset+count);
		text = start + text + end;
		this.nodeValue = this.data = text;
		this.length = text.length;
	}
}
_extends(CharacterData,Node);
function Text() {
};
Text.prototype = {
	nodeName : "#text",
	nodeType : TEXT_NODE,
	splitText : function(offset) {
		var text = this.data;
		var newText = text.substring(offset);
		text = text.substring(0, offset);
		this.data = this.nodeValue = text;
		this.length = text.length;
		var newNode = this.ownerDocument.createTextNode(newText);
		if(this.parentNode){
			this.parentNode.insertBefore(newNode, this.nextSibling);
		}
		return newNode;
	}
}
_extends(Text,CharacterData);
function Comment() {
};
Comment.prototype = {
	nodeName : "#comment",
	nodeType : COMMENT_NODE
}
_extends(Comment,CharacterData);

function CDATASection() {
};
CDATASection.prototype = {
	nodeName : "#cdata-section",
	nodeType : CDATA_SECTION_NODE
}
_extends(CDATASection,CharacterData);


function DocumentType() {
};
DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
_extends(DocumentType,Node);

function Notation() {
};
Notation.prototype.nodeType = NOTATION_NODE;
_extends(Notation,Node);

function Entity() {
};
Entity.prototype.nodeType = ENTITY_NODE;
_extends(Entity,Node);

function EntityReference() {
};
EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
_extends(EntityReference,Node);

function DocumentFragment() {
};
DocumentFragment.prototype.nodeName =	"#document-fragment";
DocumentFragment.prototype.nodeType =	DOCUMENT_FRAGMENT_NODE;
_extends(DocumentFragment,Node);


function ProcessingInstruction() {
}
ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
_extends(ProcessingInstruction,Node);
function XMLSerializer(){}
XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){
	return nodeSerializeToString.call(node,isHtml,nodeFilter);
}
Node.prototype.toString = nodeSerializeToString;
function nodeSerializeToString(isHtml,nodeFilter){
	var buf = [];
	var refNode = this.nodeType == 9?this.documentElement:this;
	var prefix = refNode.prefix;
	var uri = refNode.namespaceURI;
	
	if(uri && prefix == null){
		//console.log(prefix)
		var prefix = refNode.lookupPrefix(uri);
		if(prefix == null){
			//isHTML = true;
			var visibleNamespaces=[
			{namespace:uri,prefix:null}
			//{namespace:uri,prefix:''}
			]
		}
	}
	serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
	//console.log('###',this.nodeType,uri,prefix,buf.join(''))
	return buf.join('');
}
function needNamespaceDefine(node,isHTML, visibleNamespaces) {
	var prefix = node.prefix||'';
	var uri = node.namespaceURI;
	if (!prefix && !uri){
		return false;
	}
	if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
		|| uri == 'http://www.w3.org/2000/xmlns/'){
		return false;
	}
	
	var i = visibleNamespaces.length 
	//console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
	while (i--) {
		var ns = visibleNamespaces[i];
		// get namespace prefix
		//console.log(node.nodeType,node.tagName,ns.prefix,prefix)
		if (ns.prefix == prefix){
			return ns.namespace != uri;
		}
	}
	//console.log(isHTML,uri,prefix=='')
	//if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
	//	return false;
	//}
	//node.flag = '11111'
	//console.error(3,true,node.flag,node.prefix,node.namespaceURI)
	return true;
}
function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
	if(nodeFilter){
		node = nodeFilter(node);
		if(node){
			if(typeof node == 'string'){
				buf.push(node);
				return;
			}
		}else{
			return;
		}
		//buf.sort.apply(attrs, attributeSorter);
	}
	switch(node.nodeType){
	case ELEMENT_NODE:
		if (!visibleNamespaces) visibleNamespaces = [];
		var startVisibleNamespaces = visibleNamespaces.length;
		var attrs = node.attributes;
		var len = attrs.length;
		var child = node.firstChild;
		var nodeName = node.tagName;
		
		isHTML =  (htmlns === node.namespaceURI) ||isHTML 
		buf.push('<',nodeName);
		
		
		
		for(var i=0;i<len;i++){
			// add namespaces for attributes
			var attr = attrs.item(i);
			if (attr.prefix == 'xmlns') {
				visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
			}else if(attr.nodeName == 'xmlns'){
				visibleNamespaces.push({ prefix: '', namespace: attr.value });
			}
		}
		for(var i=0;i<len;i++){
			var attr = attrs.item(i);
			if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
				var prefix = attr.prefix||'';
				var uri = attr.namespaceURI;
				var ns = prefix ? ' xmlns:' + prefix : " xmlns";
				buf.push(ns, '="' , uri , '"');
				visibleNamespaces.push({ prefix: prefix, namespace:uri });
			}
			serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
		}
		// add namespace for current node		
		if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
			var prefix = node.prefix||'';
			var uri = node.namespaceURI;
			var ns = prefix ? ' xmlns:' + prefix : " xmlns";
			buf.push(ns, '="' , uri , '"');
			visibleNamespaces.push({ prefix: prefix, namespace:uri });
		}
		
		if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
			buf.push('>');
			//if is cdata child node
			if(isHTML && /^script$/i.test(nodeName)){
				while(child){
					if(child.data){
						buf.push(child.data);
					}else{
						serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
					}
					child = child.nextSibling;
				}
			}else
			{
				while(child){
					serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
					child = child.nextSibling;
				}
			}
			buf.push('</',nodeName,'>');
		}else{
			buf.push('/>');
		}
		// remove added visible namespaces
		//visibleNamespaces.length = startVisibleNamespaces;
		return;
	case DOCUMENT_NODE:
	case DOCUMENT_FRAGMENT_NODE:
		var child = node.firstChild;
		while(child){
			serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
			child = child.nextSibling;
		}
		return;
	case ATTRIBUTE_NODE:
		return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
	case TEXT_NODE:
		return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
	case CDATA_SECTION_NODE:
		return buf.push( '<![CDATA[',node.data,']]>');
	case COMMENT_NODE:
		return buf.push( "<!--",node.data,"-->");
	case DOCUMENT_TYPE_NODE:
		var pubid = node.publicId;
		var sysid = node.systemId;
		buf.push('<!DOCTYPE ',node.name);
		if(pubid){
			buf.push(' PUBLIC "',pubid);
			if (sysid && sysid!='.') {
				buf.push( '" "',sysid);
			}
			buf.push('">');
		}else if(sysid && sysid!='.'){
			buf.push(' SYSTEM "',sysid,'">');
		}else{
			var sub = node.internalSubset;
			if(sub){
				buf.push(" [",sub,"]");
			}
			buf.push(">");
		}
		return;
	case PROCESSING_INSTRUCTION_NODE:
		return buf.push( "<?",node.target," ",node.data,"?>");
	case ENTITY_REFERENCE_NODE:
		return buf.push( '&',node.nodeName,';');
	//case ENTITY_NODE:
	//case NOTATION_NODE:
	default:
		buf.push('??',node.nodeName);
	}
}
function importNode(doc,node,deep){
	var node2;
	switch (node.nodeType) {
	case ELEMENT_NODE:
		node2 = node.cloneNode(false);
		node2.ownerDocument = doc;
		//var attrs = node2.attributes;
		//var len = attrs.length;
		//for(var i=0;i<len;i++){
			//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
		//}
	case DOCUMENT_FRAGMENT_NODE:
		break;
	case ATTRIBUTE_NODE:
		deep = true;
		break;
	//case ENTITY_REFERENCE_NODE:
	//case PROCESSING_INSTRUCTION_NODE:
	////case TEXT_NODE:
	//case CDATA_SECTION_NODE:
	//case COMMENT_NODE:
	//	deep = false;
	//	break;
	//case DOCUMENT_NODE:
	//case DOCUMENT_TYPE_NODE:
	//cannot be imported.
	//case ENTITY_NODE:
	//case NOTATION_NODEï¼š
	//can not hit in level3
	//default:throw e;
	}
	if(!node2){
		node2 = node.cloneNode(false);//false
	}
	node2.ownerDocument = doc;
	node2.parentNode = null;
	if(deep){
		var child = node.firstChild;
		while(child){
			node2.appendChild(importNode(doc,child,deep));
			child = child.nextSibling;
		}
	}
	return node2;
}
//
//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
//					attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
function cloneNode(doc,node,deep){
	var node2 = new node.constructor();
	for(var n in node){
		var v = node[n];
		if(typeof v != 'object' ){
			if(v != node2[n]){
				node2[n] = v;
			}
		}
	}
	if(node.childNodes){
		node2.childNodes = new NodeList();
	}
	node2.ownerDocument = doc;
	switch (node2.nodeType) {
	case ELEMENT_NODE:
		var attrs	= node.attributes;
		var attrs2	= node2.attributes = new NamedNodeMap();
		var len = attrs.length
		attrs2._ownerElement = node2;
		for(var i=0;i<len;i++){
			node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
		}
		break;;
	case ATTRIBUTE_NODE:
		deep = true;
	}
	if(deep){
		var child = node.firstChild;
		while(child){
			node2.appendChild(cloneNode(doc,child,deep));
			child = child.nextSibling;
		}
	}
	return node2;
}

function __set__(object,key,value){
	object[key] = value
}
//do dynamic
try{
	if(Object.defineProperty){
		Object.defineProperty(LiveNodeList.prototype,'length',{
			get:function(){
				_updateLiveList(this);
				return this.$$length;
			}
		});
		Object.defineProperty(Node.prototype,'textContent',{
			get:function(){
				return getTextContent(this);
			},
			set:function(data){
				switch(this.nodeType){
				case ELEMENT_NODE:
				case DOCUMENT_FRAGMENT_NODE:
					while(this.firstChild){
						this.removeChild(this.firstChild);
					}
					if(data || String(data)){
						this.appendChild(this.ownerDocument.createTextNode(data));
					}
					break;
				default:
					//TODO:
					this.data = data;
					this.value = data;
					this.nodeValue = data;
				}
			}
		})
		
		function getTextContent(node){
			switch(node.nodeType){
			case ELEMENT_NODE:
			case DOCUMENT_FRAGMENT_NODE:
				var buf = [];
				node = node.firstChild;
				while(node){
					if(node.nodeType!==7 && node.nodeType !==8){
						buf.push(getTextContent(node));
					}
					node = node.nextSibling;
				}
				return buf.join('');
			default:
				return node.nodeValue;
			}
		}
		__set__ = function(object,key,value){
			//console.log(value)
			object['$$'+key] = value
		}
	}
}catch(e){//ie8
}

//if(typeof require == 'function'){
	exports.DOMImplementation = DOMImplementation;
	exports.XMLSerializer = XMLSerializer;
//}
{
  "author": {
    "name": "jindw",
    "email": "jindw@xidea.org",
    "url": "http://www.xidea.org"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "A W3C Standard XML DOM(Level2 CORE) implementation and parser(DOMParser/XMLSerializer).",
  "devDependencies": {
    "proof": "0.0.28"
  },
  "engines": {
    "node": ">=0.1"
  },
  "homepage": "https://github.com/xmldom/xmldom",
  "license": "(LGPL-2.0 or MIT)",
  "main": "./dom-parser.js",
  "maintainers": [
    {
      "name": "jindw",
      "email": "jindw@xidea.org",
      "url": "http://www.xidea.org"
    }
  ],
  "name": "xmldom",
  "repository": {
    "type": "git",
    "url": "git://github.com/xmldom/xmldom.git"
  },
  "version": "0.1.31"
}//[4]   	NameStartChar	   ::=   	":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
//[4a]   	NameChar	   ::=   	NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
//[5]   	Name	   ::=   	NameStartChar (NameChar)*
var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF
var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')

//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
var S_TAG = 0;//tag name offerring
var S_ATTR = 1;//attr name offerring 
var S_ATTR_SPACE=2;//attr name end and space offer
var S_EQ = 3;//=space?
var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
var S_ATTR_END = 5;//attr value end and no space(quot end)
var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
var S_TAG_CLOSE = 7;//closed el<el />

function XMLReader(){
	
}

XMLReader.prototype = {
	parse:function(source,defaultNSMap,entityMap){
		var domBuilder = this.domBuilder;
		domBuilder.startDocument();
		_copy(defaultNSMap ,defaultNSMap = {})
		parse(source,defaultNSMap,entityMap,
				domBuilder,this.errorHandler);
		domBuilder.endDocument();
	}
}
function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
	function fixedFromCharCode(code) {
		// String.prototype.fromCharCode does not supports
		// > 2 bytes unicode chars directly
		if (code > 0xffff) {
			code -= 0x10000;
			var surrogate1 = 0xd800 + (code >> 10)
				, surrogate2 = 0xdc00 + (code & 0x3ff);

			return String.fromCharCode(surrogate1, surrogate2);
		} else {
			return String.fromCharCode(code);
		}
	}
	function entityReplacer(a){
		var k = a.slice(1,-1);
		if(k in entityMap){
			return entityMap[k]; 
		}else if(k.charAt(0) === '#'){
			return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
		}else{
			errorHandler.error('entity not found:'+a);
			return a;
		}
	}
	function appendText(end){//has some bugs
		if(end>start){
			var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
			locator&&position(start);
			domBuilder.characters(xt,0,end-start);
			start = end
		}
	}
	function position(p,m){
		while(p>=lineEnd && (m = linePattern.exec(source))){
			lineStart = m.index;
			lineEnd = lineStart + m[0].length;
			locator.lineNumber++;
			//console.log('line++:',locator,startPos,endPos)
		}
		locator.columnNumber = p-lineStart+1;
	}
	var lineStart = 0;
	var lineEnd = 0;
	var linePattern = /.*(?:\r\n?|\n)|.*$/g
	var locator = domBuilder.locator;
	
	var parseStack = [{currentNSMap:defaultNSMapCopy}]
	var closeMap = {};
	var start = 0;
	while(true){
		try{
			var tagStart = source.indexOf('<',start);
			if(tagStart<0){
				if(!source.substr(start).match(/^\s*$/)){
					var doc = domBuilder.doc;
	    			var text = doc.createTextNode(source.substr(start));
	    			doc.appendChild(text);
	    			domBuilder.currentElement = text;
				}
				return;
			}
			if(tagStart>start){
				appendText(tagStart);
			}
			switch(source.charAt(tagStart+1)){
			case '/':
				var end = source.indexOf('>',tagStart+3);
				var tagName = source.substring(tagStart+2,end);
				var config = parseStack.pop();
				if(end<0){
					
	        		tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
	        		//console.error('#@@@@@@'+tagName)
	        		errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
	        		end = tagStart+1+tagName.length;
	        	}else if(tagName.match(/\s</)){
	        		tagName = tagName.replace(/[\s<].*/,'');
	        		errorHandler.error("end tag name: "+tagName+' maybe not complete');
	        		end = tagStart+1+tagName.length;
				}
				//console.error(parseStack.length,parseStack)
				//console.error(config);
				var localNSMap = config.localNSMap;
				var endMatch = config.tagName == tagName;
				var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()
		        if(endIgnoreCaseMach){
		        	domBuilder.endElement(config.uri,config.localName,tagName);
					if(localNSMap){
						for(var prefix in localNSMap){
							domBuilder.endPrefixMapping(prefix) ;
						}
					}
					if(!endMatch){
		            	errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
					}
		        }else{
		        	parseStack.push(config)
		        }
				
				end++;
				break;
				// end elment
			case '?':// <?...?>
				locator&&position(tagStart);
				end = parseInstruction(source,tagStart,domBuilder);
				break;
			case '!':// <!doctype,<![CDATA,<!--
				locator&&position(tagStart);
				end = parseDCC(source,tagStart,domBuilder,errorHandler);
				break;
			default:
				locator&&position(tagStart);
				var el = new ElementAttributes();
				var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
				//elStartEnd
				var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
				var len = el.length;
				
				
				if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
					el.closed = true;
					if(!entityMap.nbsp){
						errorHandler.warning('unclosed xml attribute');
					}
				}
				if(locator && len){
					var locator2 = copyLocator(locator,{});
					//try{//attribute position fixed
					for(var i = 0;i<len;i++){
						var a = el[i];
						position(a.offset);
						a.locator = copyLocator(locator,{});
					}
					//}catch(e){console.error('@@@@@'+e)}
					domBuilder.locator = locator2
					if(appendElement(el,domBuilder,currentNSMap)){
						parseStack.push(el)
					}
					domBuilder.locator = locator;
				}else{
					if(appendElement(el,domBuilder,currentNSMap)){
						parseStack.push(el)
					}
				}
				
				
				
				if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
					end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)
				}else{
					end++;
				}
			}
		}catch(e){
			errorHandler.error('element parse error: '+e)
			//errorHandler.error('element parse error: '+e);
			end = -1;
			//throw e;
		}
		if(end>start){
			start = end;
		}else{
			//TODO: è¿™é‡Œæœ‰å�¯èƒ½saxå›žé€€ï¼Œæœ‰ä½�ç½®é”™è¯¯é£Žé™©
			appendText(Math.max(tagStart,start)+1);
		}
	}
}
function copyLocator(f,t){
	t.lineNumber = f.lineNumber;
	t.columnNumber = f.columnNumber;
	return t;
}

/**
 * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
 * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
 */
function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
	var attrName;
	var value;
	var p = ++start;
	var s = S_TAG;//status
	while(true){
		var c = source.charAt(p);
		switch(c){
		case '=':
			if(s === S_ATTR){//attrName
				attrName = source.slice(start,p);
				s = S_EQ;
			}else if(s === S_ATTR_SPACE){
				s = S_EQ;
			}else{
				//fatalError: equal must after attrName or space after attrName
				throw new Error('attribute equal must after attrName');
			}
			break;
		case '\'':
		case '"':
			if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
				){//equal
				if(s === S_ATTR){
					errorHandler.warning('attribute value must after "="')
					attrName = source.slice(start,p)
				}
				start = p+1;
				p = source.indexOf(c,start)
				if(p>0){
					value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
					el.add(attrName,value,start-1);
					s = S_ATTR_END;
				}else{
					//fatalError: no end quot match
					throw new Error('attribute value no end \''+c+'\' match');
				}
			}else if(s == S_ATTR_NOQUOT_VALUE){
				value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
				//console.log(attrName,value,start,p)
				el.add(attrName,value,start);
				//console.dir(el)
				errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
				start = p+1;
				s = S_ATTR_END
			}else{
				//fatalError: no equal before
				throw new Error('attribute value must after "="');
			}
			break;
		case '/':
			switch(s){
			case S_TAG:
				el.setTagName(source.slice(start,p));
			case S_ATTR_END:
			case S_TAG_SPACE:
			case S_TAG_CLOSE:
				s =S_TAG_CLOSE;
				el.closed = true;
			case S_ATTR_NOQUOT_VALUE:
			case S_ATTR:
			case S_ATTR_SPACE:
				break;
			//case S_EQ:
			default:
				throw new Error("attribute invalid close char('/')")
			}
			break;
		case ''://end document
			//throw new Error('unexpected end of input')
			errorHandler.error('unexpected end of input');
			if(s == S_TAG){
				el.setTagName(source.slice(start,p));
			}
			return p;
		case '>':
			switch(s){
			case S_TAG:
				el.setTagName(source.slice(start,p));
			case S_ATTR_END:
			case S_TAG_SPACE:
			case S_TAG_CLOSE:
				break;//normal
			case S_ATTR_NOQUOT_VALUE://Compatible state
			case S_ATTR:
				value = source.slice(start,p);
				if(value.slice(-1) === '/'){
					el.closed  = true;
					value = value.slice(0,-1)
				}
			case S_ATTR_SPACE:
				if(s === S_ATTR_SPACE){
					value = attrName;
				}
				if(s == S_ATTR_NOQUOT_VALUE){
					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
					el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start)
				}else{
					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
						errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
					}
					el.add(value,value,start)
				}
				break;
			case S_EQ:
				throw new Error('attribute value missed!!');
			}
//			console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
			return p;
		/*xml space '\x20' | #x9 | #xD | #xA; */
		case '\u0080':
			c = ' ';
		default:
			if(c<= ' '){//space
				switch(s){
				case S_TAG:
					el.setTagName(source.slice(start,p));//tagName
					s = S_TAG_SPACE;
					break;
				case S_ATTR:
					attrName = source.slice(start,p)
					s = S_ATTR_SPACE;
					break;
				case S_ATTR_NOQUOT_VALUE:
					var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
					el.add(attrName,value,start)
				case S_ATTR_END:
					s = S_TAG_SPACE;
					break;
				//case S_TAG_SPACE:
				//case S_EQ:
				//case S_ATTR_SPACE:
				//	void();break;
				//case S_TAG_CLOSE:
					//ignore warning
				}
			}else{//not space
//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
				switch(s){
				//case S_TAG:void();break;
				//case S_ATTR:void();break;
				//case S_ATTR_NOQUOT_VALUE:void();break;
				case S_ATTR_SPACE:
					var tagName =  el.tagName;
					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
						errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!')
					}
					el.add(attrName,attrName,start);
					start = p;
					s = S_ATTR;
					break;
				case S_ATTR_END:
					errorHandler.warning('attribute space is required"'+attrName+'"!!')
				case S_TAG_SPACE:
					s = S_ATTR;
					start = p;
					break;
				case S_EQ:
					s = S_ATTR_NOQUOT_VALUE;
					start = p;
					break;
				case S_TAG_CLOSE:
					throw new Error("elements closed character '/' and '>' must be connected to");
				}
			}
		}//end outer switch
		//console.log('p++',p)
		p++;
	}
}
/**
 * @return true if has new namespace define
 */
function appendElement(el,domBuilder,currentNSMap){
	var tagName = el.tagName;
	var localNSMap = null;
	//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
	var i = el.length;
	while(i--){
		var a = el[i];
		var qName = a.qName;
		var value = a.value;
		var nsp = qName.indexOf(':');
		if(nsp>0){
			var prefix = a.prefix = qName.slice(0,nsp);
			var localName = qName.slice(nsp+1);
			var nsPrefix = prefix === 'xmlns' && localName
		}else{
			localName = qName;
			prefix = null
			nsPrefix = qName === 'xmlns' && ''
		}
		//can not set prefix,because prefix !== ''
		a.localName = localName ;
		//prefix == null for no ns prefix attribute 
		if(nsPrefix !== false){//hack!!
			if(localNSMap == null){
				localNSMap = {}
				//console.log(currentNSMap,0)
				_copy(currentNSMap,currentNSMap={})
				//console.log(currentNSMap,1)
			}
			currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
			a.uri = 'http://www.w3.org/2000/xmlns/'
			domBuilder.startPrefixMapping(nsPrefix, value) 
		}
	}
	var i = el.length;
	while(i--){
		a = el[i];
		var prefix = a.prefix;
		if(prefix){//no prefix attribute has no namespace
			if(prefix === 'xml'){
				a.uri = 'http://www.w3.org/XML/1998/namespace';
			}if(prefix !== 'xmlns'){
				a.uri = currentNSMap[prefix || '']
				
				//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
			}
		}
	}
	var nsp = tagName.indexOf(':');
	if(nsp>0){
		prefix = el.prefix = tagName.slice(0,nsp);
		localName = el.localName = tagName.slice(nsp+1);
	}else{
		prefix = null;//important!!
		localName = el.localName = tagName;
	}
	//no prefix element has default namespace
	var ns = el.uri = currentNSMap[prefix || ''];
	domBuilder.startElement(ns,localName,tagName,el);
	//endPrefixMapping and startPrefixMapping have not any help for dom builder
	//localNSMap = null
	if(el.closed){
		domBuilder.endElement(ns,localName,tagName);
		if(localNSMap){
			for(prefix in localNSMap){
				domBuilder.endPrefixMapping(prefix) 
			}
		}
	}else{
		el.currentNSMap = currentNSMap;
		el.localNSMap = localNSMap;
		//parseStack.push(el);
		return true;
	}
}
function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
	if(/^(?:script|textarea)$/i.test(tagName)){
		var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
		var text = source.substring(elStartEnd+1,elEndStart);
		if(/[&<]/.test(text)){
			if(/^script$/i.test(tagName)){
				//if(!/\]\]>/.test(text)){
					//lexHandler.startCDATA();
					domBuilder.characters(text,0,text.length);
					//lexHandler.endCDATA();
					return elEndStart;
				//}
			}//}else{//text area
				text = text.replace(/&#?\w+;/g,entityReplacer);
				domBuilder.characters(text,0,text.length);
				return elEndStart;
			//}
			
		}
	}
	return elStartEnd+1;
}
function fixSelfClosed(source,elStartEnd,tagName,closeMap){
	//if(tagName in closeMap){
	var pos = closeMap[tagName];
	if(pos == null){
		//console.log(tagName)
		pos =  source.lastIndexOf('</'+tagName+'>')
		if(pos<elStartEnd){//å¿˜è®°é—­å�ˆ
			pos = source.lastIndexOf('</'+tagName)
		}
		closeMap[tagName] =pos
	}
	return pos<elStartEnd;
	//} 
}
function _copy(source,target){
	for(var n in source){target[n] = source[n]}
}
function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
	var next= source.charAt(start+2)
	switch(next){
	case '-':
		if(source.charAt(start + 3) === '-'){
			var end = source.indexOf('-->',start+4);
			//append comment source.substring(4,end)//<!--
			if(end>start){
				domBuilder.comment(source,start+4,end-start-4);
				return end+3;
			}else{
				errorHandler.error("Unclosed comment");
				return -1;
			}
		}else{
			//error
			return -1;
		}
	default:
		if(source.substr(start+3,6) == 'CDATA['){
			var end = source.indexOf(']]>',start+9);
			domBuilder.startCDATA();
			domBuilder.characters(source,start+9,end-start-9);
			domBuilder.endCDATA() 
			return end+3;
		}
		//<!DOCTYPE
		//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
		var matchs = split(source,start);
		var len = matchs.length;
		if(len>1 && /!doctype/i.test(matchs[0][0])){
			var name = matchs[1][0];
			var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0]
			var sysid = len>4 && matchs[4][0];
			var lastMatch = matchs[len-1]
			domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
					sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
			domBuilder.endDTD();
			
			return lastMatch.index+lastMatch[0].length
		}
	}
	return -1;
}



function parseInstruction(source,start,domBuilder){
	var end = source.indexOf('?>',start);
	if(end){
		var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
		if(match){
			var len = match[0].length;
			domBuilder.processingInstruction(match[1], match[2]) ;
			return end+2;
		}else{//error
			return -1;
		}
	}
	return -1;
}

/**
 * @param source
 */
function ElementAttributes(source){
	
}
ElementAttributes.prototype = {
	setTagName:function(tagName){
		if(!tagNamePattern.test(tagName)){
			throw new Error('invalid tagName:'+tagName)
		}
		this.tagName = tagName
	},
	add:function(qName,value,offset){
		if(!tagNamePattern.test(qName)){
			throw new Error('invalid attribute:'+qName)
		}
		this[this.length++] = {qName:qName,value:value,offset:offset}
	},
	length:0,
	getLocalName:function(i){return this[i].localName},
	getLocator:function(i){return this[i].locator},
	getQName:function(i){return this[i].qName},
	getURI:function(i){return this[i].uri},
	getValue:function(i){return this[i].value}
//	,getIndex:function(uri, localName)){
//		if(localName){
//			
//		}else{
//			var qName = uri
//		}
//	},
//	getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
//	getType:function(uri,localName){}
//	getType:function(i){},
}




function _set_proto_(thiz,parent){
	thiz.__proto__ = parent;
	return thiz;
}
if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
	_set_proto_ = function(thiz,parent){
		function p(){};
		p.prototype = parent;
		p = new p();
		for(parent in thiz){
			p[parent] = thiz[parent];
		}
		return p;
	}
}

function split(source,start){
	var match;
	var buf = [];
	var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
	reg.lastIndex = start;
	reg.exec(source);//skip <
	while(match = reg.exec(source)){
		buf.push(match);
		if(match[1])return buf;
	}
}

exports.XMLReader = XMLReader;

Copyright (c) 2012 Raynos.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.browser:
	node ./support/compile

.PHONY: browsermodule.exports = hasKeys

function hasKeys(source) {
    return source !== null &&
        (typeof source === "object" ||
        typeof source === "function")
}
var Keys = require("object-keys")
var hasKeys = require("./has-keys")

module.exports = extend

function extend() {
    var target = {}

    for (var i = 0; i < arguments.length; i++) {
        var source = arguments[i]

        if (!hasKeys(source)) {
            continue
        }

        var keys = Keys(source)

        for (var j = 0; j < keys.length; j++) {
            var name = keys[j]
            target[name] = source[name]
        }
    }

    return target
}
var Keys = require("object-keys")
var hasKeys = require("./has-keys")

module.exports = extend

function extend(target) {
    var sources = [].slice.call(arguments, 1)

    for (var i = 0; i < sources.length; i++) {
        var source = sources[i]

        if (!hasKeys(source)) {
            continue
        }

        var keys = Keys(source)

        for (var j = 0; j < keys.length; j++) {
            var name = keys[j]
            target[name] = source[name]
        }
    }

    return target
}
{
  "author": {
    "name": "Raynos",
    "email": "raynos2@gmail.com"
  },
  "dependencies": {
    "object-keys": "~0.4.0"
  },
  "deprecated": false,
  "description": "extend like a boss",
  "devDependencies": {
    "tape": "~1.1.0"
  },
  "engines": {
    "node": ">=0.4"
  },
  "homepage": "https://github.com/Raynos/xtend",
  "licenses": [
    {
      "type": "MIT",
      "url": "http://github.com/raynos/xtend/raw/master/LICENSE"
    }
  ],
  "main": "index",
  "name": "xtend",
  "repository": {
    "type": "git",
    "url": "git://github.com/Raynos/xtend.git"
  },
  "testling": {
    "files": "test.js",
    "browsers": [
      "ie/7..latest",
      "firefox/16..latest",
      "firefox/nightly",
      "chrome/22..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest"
    ]
  },
  "version": "2.1.2"
}Copyright (c) 2015, Contributors

Permission to use, copy, modify, and/or distribute this software for any purpose
with or without fee is hereby granted, provided that the above copyright notice
and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
var fs = require('fs')
var path = require('path')
var util = require('util')

function Y18N (opts) {
  // configurable options.
  opts = opts || {}
  this.directory = opts.directory || './locales'
  this.updateFiles = typeof opts.updateFiles === 'boolean' ? opts.updateFiles : true
  this.locale = opts.locale || 'en'
  this.fallbackToLanguage = typeof opts.fallbackToLanguage === 'boolean' ? opts.fallbackToLanguage : true

  // internal stuff.
  this.cache = {}
  this.writeQueue = []
}

Y18N.prototype.__ = function () {
  if (typeof arguments[0] !== 'string') {
    return this._taggedLiteral.apply(this, arguments)
  }
  var args = Array.prototype.slice.call(arguments)
  var str = args.shift()
  var cb = function () {} // start with noop.

  if (typeof args[args.length - 1] === 'function') cb = args.pop()
  cb = cb || function () {} // noop.

  if (!this.cache[this.locale]) this._readLocaleFile()

  // we've observed a new string, update the language file.
  if (!this.cache[this.locale][str] && this.updateFiles) {
    this.cache[this.locale][str] = str

    // include the current directory and locale,
    // since these values could change before the
    // write is performed.
    this._enqueueWrite([this.directory, this.locale, cb])
  } else {
    cb()
  }

  return util.format.apply(util, [this.cache[this.locale][str] || str].concat(args))
}

Y18N.prototype._taggedLiteral = function (parts) {
  var args = arguments
  var str = ''
  parts.forEach(function (part, i) {
    var arg = args[i + 1]
    str += part
    if (typeof arg !== 'undefined') {
      str += '%s'
    }
  })
  return this.__.apply(null, [str].concat([].slice.call(arguments, 1)))
}

Y18N.prototype._enqueueWrite = function (work) {
  this.writeQueue.push(work)
  if (this.writeQueue.length === 1) this._processWriteQueue()
}

Y18N.prototype._processWriteQueue = function () {
  var _this = this
  var work = this.writeQueue[0]

  // destructure the enqueued work.
  var directory = work[0]
  var locale = work[1]
  var cb = work[2]

  var languageFile = this._resolveLocaleFile(directory, locale)
  var serializedLocale = JSON.stringify(this.cache[locale], null, 2)

  fs.writeFile(languageFile, serializedLocale, 'utf-8', function (err) {
    _this.writeQueue.shift()
    if (_this.writeQueue.length > 0) _this._processWriteQueue()
    cb(err)
  })
}

Y18N.prototype._readLocaleFile = function () {
  var localeLookup = {}
  var languageFile = this._resolveLocaleFile(this.directory, this.locale)

  try {
    localeLookup = JSON.parse(fs.readFileSync(languageFile, 'utf-8'))
  } catch (err) {
    if (err instanceof SyntaxError) {
      err.message = 'syntax error in ' + languageFile
    }

    if (err.code === 'ENOENT') localeLookup = {}
    else throw err
  }

  this.cache[this.locale] = localeLookup
}

Y18N.prototype._resolveLocaleFile = function (directory, locale) {
  var file = path.resolve(directory, './', locale + '.json')
  if (this.fallbackToLanguage && !this._fileExistsSync(file) && ~locale.lastIndexOf('_')) {
    // attempt fallback to language only
    var languageFile = path.resolve(directory, './', locale.split('_')[0] + '.json')
    if (this._fileExistsSync(languageFile)) file = languageFile
  }
  return file
}

// this only exists because fs.existsSync() "will be deprecated"
// see https://nodejs.org/api/fs.html#fs_fs_existssync_path
Y18N.prototype._fileExistsSync = function (file) {
  try {
    return fs.statSync(file).isFile()
  } catch (err) {
    return false
  }
}

Y18N.prototype.__n = function () {
  var args = Array.prototype.slice.call(arguments)
  var singular = args.shift()
  var plural = args.shift()
  var quantity = args.shift()

  var cb = function () {} // start with noop.
  if (typeof args[args.length - 1] === 'function') cb = args.pop()

  if (!this.cache[this.locale]) this._readLocaleFile()

  var str = quantity === 1 ? singular : plural
  if (this.cache[this.locale][singular]) {
    str = this.cache[this.locale][singular][quantity === 1 ? 'one' : 'other']
  }

  // we've observed a new string, update the language file.
  if (!this.cache[this.locale][singular] && this.updateFiles) {
    this.cache[this.locale][singular] = {
      one: singular,
      other: plural
    }

    // include the current directory and locale,
    // since these values could change before the
    // write is performed.
    this._enqueueWrite([this.directory, this.locale, cb])
  } else {
    cb()
  }

  // if a %d placeholder is provided, add quantity
  // to the arguments expanded by util.format.
  var values = [str]
  if (~str.indexOf('%d')) values.push(quantity)

  return util.format.apply(util, values.concat(args))
}

Y18N.prototype.setLocale = function (locale) {
  this.locale = locale
}

Y18N.prototype.getLocale = function () {
  return this.locale
}

Y18N.prototype.updateLocale = function (obj) {
  if (!this.cache[this.locale]) this._readLocaleFile()

  for (var key in obj) {
    this.cache[this.locale][key] = obj[key]
  }
}

module.exports = function (opts) {
  var y18n = new Y18N(opts)

  // bind all functions to y18n, so that
  // they can be used in isolation.
  for (var key in y18n) {
    if (typeof y18n[key] === 'function') {
      y18n[key] = y18n[key].bind(y18n)
    }
  }

  return y18n
}
{
  "author": {
    "name": "Ben Coe",
    "email": "ben@npmjs.com"
  },
  "deprecated": false,
  "description": "the bare-bones internationalization library used by yargs",
  "devDependencies": {
    "chai": "^4.0.1",
    "coveralls": "^3.0.0",
    "mocha": "^4.0.1",
    "nyc": "^11.0.1",
    "rimraf": "^2.5.0",
    "standard": "^10.0.0-beta.0",
    "standard-version": "^4.2.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/yargs/y18n",
  "license": "ISC",
  "main": "index.js",
  "name": "y18n",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/yargs/y18n.git"
  },
  "version": "4.0.0"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
var Yallist = require('./yallist.js')

Yallist.prototype[Symbol.iterator] = function* () {
  for (let walker = this.head; walker; walker = walker.next) {
    yield walker.value
  }
}
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Yet Another Linked List",
  "devDependencies": {
    "tap": "^10.3.0"
  },
  "directories": {
    "test": "test"
  },
  "files": [
    "yallist.js",
    "iterator.js"
  ],
  "homepage": "https://github.com/isaacs/yallist#readme",
  "license": "ISC",
  "main": "yallist.js",
  "name": "yallist",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/yallist.git"
  },
  "version": "2.1.2"
}module.exports = Yallist

Yallist.Node = Node
Yallist.create = Yallist

function Yallist (list) {
  var self = this
  if (!(self instanceof Yallist)) {
    self = new Yallist()
  }

  self.tail = null
  self.head = null
  self.length = 0

  if (list && typeof list.forEach === 'function') {
    list.forEach(function (item) {
      self.push(item)
    })
  } else if (arguments.length > 0) {
    for (var i = 0, l = arguments.length; i < l; i++) {
      self.push(arguments[i])
    }
  }

  return self
}

Yallist.prototype.removeNode = function (node) {
  if (node.list !== this) {
    throw new Error('removing node which does not belong to this list')
  }

  var next = node.next
  var prev = node.prev

  if (next) {
    next.prev = prev
  }

  if (prev) {
    prev.next = next
  }

  if (node === this.head) {
    this.head = next
  }
  if (node === this.tail) {
    this.tail = prev
  }

  node.list.length--
  node.next = null
  node.prev = null
  node.list = null
}

Yallist.prototype.unshiftNode = function (node) {
  if (node === this.head) {
    return
  }

  if (node.list) {
    node.list.removeNode(node)
  }

  var head = this.head
  node.list = this
  node.next = head
  if (head) {
    head.prev = node
  }

  this.head = node
  if (!this.tail) {
    this.tail = node
  }
  this.length++
}

Yallist.prototype.pushNode = function (node) {
  if (node === this.tail) {
    return
  }

  if (node.list) {
    node.list.removeNode(node)
  }

  var tail = this.tail
  node.list = this
  node.prev = tail
  if (tail) {
    tail.next = node
  }

  this.tail = node
  if (!this.head) {
    this.head = node
  }
  this.length++
}

Yallist.prototype.push = function () {
  for (var i = 0, l = arguments.length; i < l; i++) {
    push(this, arguments[i])
  }
  return this.length
}

Yallist.prototype.unshift = function () {
  for (var i = 0, l = arguments.length; i < l; i++) {
    unshift(this, arguments[i])
  }
  return this.length
}

Yallist.prototype.pop = function () {
  if (!this.tail) {
    return undefined
  }

  var res = this.tail.value
  this.tail = this.tail.prev
  if (this.tail) {
    this.tail.next = null
  } else {
    this.head = null
  }
  this.length--
  return res
}

Yallist.prototype.shift = function () {
  if (!this.head) {
    return undefined
  }

  var res = this.head.value
  this.head = this.head.next
  if (this.head) {
    this.head.prev = null
  } else {
    this.tail = null
  }
  this.length--
  return res
}

Yallist.prototype.forEach = function (fn, thisp) {
  thisp = thisp || this
  for (var walker = this.head, i = 0; walker !== null; i++) {
    fn.call(thisp, walker.value, i, this)
    walker = walker.next
  }
}

Yallist.prototype.forEachReverse = function (fn, thisp) {
  thisp = thisp || this
  for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {
    fn.call(thisp, walker.value, i, this)
    walker = walker.prev
  }
}

Yallist.prototype.get = function (n) {
  for (var i = 0, walker = this.head; walker !== null && i < n; i++) {
    // abort out of the list early if we hit a cycle
    walker = walker.next
  }
  if (i === n && walker !== null) {
    return walker.value
  }
}

Yallist.prototype.getReverse = function (n) {
  for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {
    // abort out of the list early if we hit a cycle
    walker = walker.prev
  }
  if (i === n && walker !== null) {
    return walker.value
  }
}

Yallist.prototype.map = function (fn, thisp) {
  thisp = thisp || this
  var res = new Yallist()
  for (var walker = this.head; walker !== null;) {
    res.push(fn.call(thisp, walker.value, this))
    walker = walker.next
  }
  return res
}

Yallist.prototype.mapReverse = function (fn, thisp) {
  thisp = thisp || this
  var res = new Yallist()
  for (var walker = this.tail; walker !== null;) {
    res.push(fn.call(thisp, walker.value, this))
    walker = walker.prev
  }
  return res
}

Yallist.prototype.reduce = function (fn, initial) {
  var acc
  var walker = this.head
  if (arguments.length > 1) {
    acc = initial
  } else if (this.head) {
    walker = this.head.next
    acc = this.head.value
  } else {
    throw new TypeError('Reduce of empty list with no initial value')
  }

  for (var i = 0; walker !== null; i++) {
    acc = fn(acc, walker.value, i)
    walker = walker.next
  }

  return acc
}

Yallist.prototype.reduceReverse = function (fn, initial) {
  var acc
  var walker = this.tail
  if (arguments.length > 1) {
    acc = initial
  } else if (this.tail) {
    walker = this.tail.prev
    acc = this.tail.value
  } else {
    throw new TypeError('Reduce of empty list with no initial value')
  }

  for (var i = this.length - 1; walker !== null; i--) {
    acc = fn(acc, walker.value, i)
    walker = walker.prev
  }

  return acc
}

Yallist.prototype.toArray = function () {
  var arr = new Array(this.length)
  for (var i = 0, walker = this.head; walker !== null; i++) {
    arr[i] = walker.value
    walker = walker.next
  }
  return arr
}

Yallist.prototype.toArrayReverse = function () {
  var arr = new Array(this.length)
  for (var i = 0, walker = this.tail; walker !== null; i++) {
    arr[i] = walker.value
    walker = walker.prev
  }
  return arr
}

Yallist.prototype.slice = function (from, to) {
  to = to || this.length
  if (to < 0) {
    to += this.length
  }
  from = from || 0
  if (from < 0) {
    from += this.length
  }
  var ret = new Yallist()
  if (to < from || to < 0) {
    return ret
  }
  if (from < 0) {
    from = 0
  }
  if (to > this.length) {
    to = this.length
  }
  for (var i = 0, walker = this.head; walker !== null && i < from; i++) {
    walker = walker.next
  }
  for (; walker !== null && i < to; i++, walker = walker.next) {
    ret.push(walker.value)
  }
  return ret
}

Yallist.prototype.sliceReverse = function (from, to) {
  to = to || this.length
  if (to < 0) {
    to += this.length
  }
  from = from || 0
  if (from < 0) {
    from += this.length
  }
  var ret = new Yallist()
  if (to < from || to < 0) {
    return ret
  }
  if (from < 0) {
    from = 0
  }
  if (to > this.length) {
    to = this.length
  }
  for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {
    walker = walker.prev
  }
  for (; walker !== null && i > from; i--, walker = walker.prev) {
    ret.push(walker.value)
  }
  return ret
}

Yallist.prototype.reverse = function () {
  var head = this.head
  var tail = this.tail
  for (var walker = head; walker !== null; walker = walker.prev) {
    var p = walker.prev
    walker.prev = walker.next
    walker.next = p
  }
  this.head = tail
  this.tail = head
  return this
}

function push (self, item) {
  self.tail = new Node(item, self.tail, null, self)
  if (!self.head) {
    self.head = self.tail
  }
  self.length++
}

function unshift (self, item) {
  self.head = new Node(item, null, self.head, self)
  if (!self.tail) {
    self.tail = self.head
  }
  self.length++
}

function Node (value, prev, next, list) {
  if (!(this instanceof Node)) {
    return new Node(value, prev, next, list)
  }

  this.list = list
  this.value = value

  if (prev) {
    prev.next = this
    this.prev = prev
  } else {
    this.prev = null
  }

  if (next) {
    next.prev = this
    this.next = next
  } else {
    this.next = null
  }
}
Copyright 2010 James Halliday (mail@substack.net)
Modified work Copyright 2014 Contributors (ben@npmjs.com)

This project is free software released under the MIT/X11 license:

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'use strict'
// classic singleton yargs API, to use yargs
// without running as a singleton do:
// require('yargs/yargs')(process.argv.slice(2))
const yargs = require('./yargs')

Argv(process.argv.slice(2))

module.exports = Argv

function Argv (processArgs, cwd) {
  const argv = yargs(processArgs, cwd, require)
  singletonify(argv)
  return argv
}

/*  Hack an instance of Argv with process.argv into Argv
    so people can do
    require('yargs')(['--beeble=1','-z','zizzle']).argv
    to parse a list of args and
    require('yargs').argv
    to get a parsed version of process.argv.
*/
function singletonify (inst) {
  Object.keys(inst).forEach((key) => {
    if (key === 'argv') {
      Argv.__defineGetter__(key, inst.__lookupGetter__(key))
    } else {
      Argv[key] = typeof inst[key] === 'function' ? inst[key].bind(inst) : inst[key]
    }
  })
}
{
  "dependencies": {
    "cliui": "^5.0.0",
    "find-up": "^3.0.0",
    "get-caller-file": "^2.0.1",
    "require-directory": "^2.1.1",
    "require-main-filename": "^2.0.0",
    "set-blocking": "^2.0.0",
    "string-width": "^3.0.0",
    "which-module": "^2.0.0",
    "y18n": "^4.0.0",
    "yargs-parser": "^13.1.2"
  },
  "deprecated": false,
  "description": "yargs the modern, pirate-themed, successor to optimist.",
  "devDependencies": {
    "chai": "^4.2.0",
    "chalk": "^2.4.2",
    "coveralls": "^3.0.3",
    "cpr": "^3.0.1",
    "cross-spawn": "^6.0.4",
    "es6-promise": "^4.2.5",
    "hashish": "0.0.4",
    "mocha": "^5.2.0",
    "nyc": "^14.1.0",
    "rimraf": "^2.6.3",
    "standard": "^12.0.1",
    "standard-version": "^6.0.1",
    "which": "^1.3.1",
    "yargs-test-extends": "^1.0.1"
  },
  "engine": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "yargs.js",
    "lib",
    "locales",
    "completion.sh.hbs",
    "completion.zsh.hbs",
    "LICENSE"
  ],
  "homepage": "https://yargs.js.org/",
  "license": "MIT",
  "main": "./index.js",
  "name": "yargs",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/yargs/yargs.git"
  },
  "standard": {
    "ignore": [
      "**/example/**"
    ]
  },
  "version": "13.3.2"
}'use strict'
const argsert = require('./lib/argsert')
const fs = require('fs')
const Command = require('./lib/command')
const Completion = require('./lib/completion')
const Parser = require('yargs-parser')
const path = require('path')
const Usage = require('./lib/usage')
const Validation = require('./lib/validation')
const Y18n = require('y18n')
const objFilter = require('./lib/obj-filter')
const setBlocking = require('set-blocking')
const applyExtends = require('./lib/apply-extends')
const { globalMiddlewareFactory } = require('./lib/middleware')
const YError = require('./lib/yerror')

exports = module.exports = Yargs
function Yargs (processArgs, cwd, parentRequire) {
  processArgs = processArgs || [] // handle calling yargs().

  const self = {}
  let command = null
  let completion = null
  let groups = {}
  let globalMiddleware = []
  let output = ''
  let preservedGroups = {}
  let usage = null
  let validation = null

  const y18n = Y18n({
    directory: path.resolve(__dirname, './locales'),
    updateFiles: false
  })

  self.middleware = globalMiddlewareFactory(globalMiddleware, self)

  if (!cwd) cwd = process.cwd()

  self.scriptName = function scriptName (scriptName) {
    self.$0 = scriptName
    return self
  }

  // ignore the node bin, specify this in your
  // bin file with #!/usr/bin/env node
  if (/\b(node|iojs|electron)(\.exe)?$/.test(process.argv[0])) {
    self.$0 = process.argv.slice(1, 2)
  } else {
    self.$0 = process.argv.slice(0, 1)
  }

  self.$0 = self.$0
    .map((x, i) => {
      const b = rebase(cwd, x)
      return x.match(/^(\/|([a-zA-Z]:)?\\)/) && b.length < x.length ? b : x
    })
    .join(' ').trim()

  if (process.env._ !== undefined && process.argv[1] === process.env._) {
    self.$0 = process.env._.replace(
      `${path.dirname(process.execPath)}/`, ''
    )
  }

  // use context object to keep track of resets, subcommand execution, etc
  // submodules should modify and check the state of context as necessary
  const context = { resets: -1, commands: [], fullCommands: [], files: [] }
  self.getContext = () => context

  // puts yargs back into an initial state. any keys
  // that have been set to "global" will not be reset
  // by this action.
  let options
  self.resetOptions = self.reset = function resetOptions (aliases) {
    context.resets++
    aliases = aliases || {}
    options = options || {}
    // put yargs back into an initial state, this
    // logic is used to build a nested command
    // hierarchy.
    const tmpOptions = {}
    tmpOptions.local = options.local ? options.local : []
    tmpOptions.configObjects = options.configObjects ? options.configObjects : []

    // if a key has been explicitly set as local,
    // we should reset it before passing options to command.
    const localLookup = {}
    tmpOptions.local.forEach((l) => {
      localLookup[l] = true
      ;(aliases[l] || []).forEach((a) => {
        localLookup[a] = true
      })
    })

    // preserve all groups not set to local.
    preservedGroups = Object.keys(groups).reduce((acc, groupName) => {
      const keys = groups[groupName].filter(key => !(key in localLookup))
      if (keys.length > 0) {
        acc[groupName] = keys
      }
      return acc
    }, {})
    // groups can now be reset
    groups = {}

    const arrayOptions = [
      'array', 'boolean', 'string', 'skipValidation',
      'count', 'normalize', 'number',
      'hiddenOptions'
    ]

    const objectOptions = [
      'narg', 'key', 'alias', 'default', 'defaultDescription',
      'config', 'choices', 'demandedOptions', 'demandedCommands', 'coerce'
    ]

    arrayOptions.forEach((k) => {
      tmpOptions[k] = (options[k] || []).filter(k => !localLookup[k])
    })

    objectOptions.forEach((k) => {
      tmpOptions[k] = objFilter(options[k], (k, v) => !localLookup[k])
    })

    tmpOptions.envPrefix = options.envPrefix
    options = tmpOptions

    // if this is the first time being executed, create
    // instances of all our helpers -- otherwise just reset.
    usage = usage ? usage.reset(localLookup) : Usage(self, y18n)
    validation = validation ? validation.reset(localLookup) : Validation(self, usage, y18n)
    command = command ? command.reset() : Command(self, usage, validation, globalMiddleware)
    if (!completion) completion = Completion(self, usage, command)

    completionCommand = null
    output = ''
    exitError = null
    hasOutput = false
    self.parsed = false

    return self
  }
  self.resetOptions()

  // temporary hack: allow "freezing" of reset-able state for parse(msg, cb)
  let frozen
  function freeze () {
    frozen = {}
    frozen.options = options
    frozen.configObjects = options.configObjects.slice(0)
    frozen.exitProcess = exitProcess
    frozen.groups = groups
    usage.freeze()
    validation.freeze()
    command.freeze()
    frozen.strict = strict
    frozen.completionCommand = completionCommand
    frozen.output = output
    frozen.exitError = exitError
    frozen.hasOutput = hasOutput
    frozen.parsed = self.parsed
  }
  function unfreeze () {
    options = frozen.options
    options.configObjects = frozen.configObjects
    exitProcess = frozen.exitProcess
    groups = frozen.groups
    output = frozen.output
    exitError = frozen.exitError
    hasOutput = frozen.hasOutput
    self.parsed = frozen.parsed
    usage.unfreeze()
    validation.unfreeze()
    command.unfreeze()
    strict = frozen.strict
    completionCommand = frozen.completionCommand
    parseFn = null
    parseContext = null
    frozen = undefined
  }

  self.boolean = function (keys) {
    argsert('<array|string>', [keys], arguments.length)
    populateParserHintArray('boolean', keys)
    return self
  }

  self.array = function (keys) {
    argsert('<array|string>', [keys], arguments.length)
    populateParserHintArray('array', keys)
    return self
  }

  self.number = function (keys) {
    argsert('<array|string>', [keys], arguments.length)
    populateParserHintArray('number', keys)
    return self
  }

  self.normalize = function (keys) {
    argsert('<array|string>', [keys], arguments.length)
    populateParserHintArray('normalize', keys)
    return self
  }

  self.count = function (keys) {
    argsert('<array|string>', [keys], arguments.length)
    populateParserHintArray('count', keys)
    return self
  }

  self.string = function (keys) {
    argsert('<array|string>', [keys], arguments.length)
    populateParserHintArray('string', keys)
    return self
  }

  self.requiresArg = function (keys) {
    argsert('<array|string>', [keys], arguments.length)
    populateParserHintObject(self.nargs, false, 'narg', keys, 1)
    return self
  }

  self.skipValidation = function (keys) {
    argsert('<array|string>', [keys], arguments.length)
    populateParserHintArray('skipValidation', keys)
    return self
  }

  function populateParserHintArray (type, keys, value) {
    keys = [].concat(keys)
    keys.forEach((key) => {
      key = sanitizeKey(key)
      options[type].push(key)
    })
  }

  self.nargs = function (key, value) {
    argsert('<string|object|array> [number]', [key, value], arguments.length)
    populateParserHintObject(self.nargs, false, 'narg', key, value)
    return self
  }

  self.choices = function (key, value) {
    argsert('<object|string|array> [string|array]', [key, value], arguments.length)
    populateParserHintObject(self.choices, true, 'choices', key, value)
    return self
  }

  self.alias = function (key, value) {
    argsert('<object|string|array> [string|array]', [key, value], arguments.length)
    populateParserHintObject(self.alias, true, 'alias', key, value)
    return self
  }

  // TODO: actually deprecate self.defaults.
  self.default = self.defaults = function (key, value, defaultDescription) {
    argsert('<object|string|array> [*] [string]', [key, value, defaultDescription], arguments.length)
    if (defaultDescription) options.defaultDescription[key] = defaultDescription
    if (typeof value === 'function') {
      if (!options.defaultDescription[key]) options.defaultDescription[key] = usage.functionDescription(value)
      value = value.call()
    }
    populateParserHintObject(self.default, false, 'default', key, value)
    return self
  }

  self.describe = function (key, desc) {
    argsert('<object|string|array> [string]', [key, desc], arguments.length)
    populateParserHintObject(self.describe, false, 'key', key, true)
    usage.describe(key, desc)
    return self
  }

  self.demandOption = function (keys, msg) {
    argsert('<object|string|array> [string]', [keys, msg], arguments.length)
    populateParserHintObject(self.demandOption, false, 'demandedOptions', keys, msg)
    return self
  }

  self.coerce = function (keys, value) {
    argsert('<object|string|array> [function]', [keys, value], arguments.length)
    populateParserHintObject(self.coerce, false, 'coerce', keys, value)
    return self
  }

  function populateParserHintObject (builder, isArray, type, key, value) {
    if (Array.isArray(key)) {
      const temp = Object.create(null)
      // an array of keys with one value ['x', 'y', 'z'], function parse () {}
      key.forEach((k) => {
        temp[k] = value
      })
      builder(temp)
    } else if (typeof key === 'object') {
      // an object of key value pairs: {'x': parse () {}, 'y': parse() {}}
      Object.keys(key).forEach((k) => {
        builder(k, key[k])
      })
    } else {
      key = sanitizeKey(key)
      // a single key value pair 'x', parse() {}
      if (isArray) {
        options[type][key] = (options[type][key] || []).concat(value)
      } else {
        options[type][key] = value
      }
    }
  }

  // TODO(bcoe): in future major versions move more objects towards
  // Object.create(null):
  function sanitizeKey (key) {
    if (key === '__proto__') return '___proto___'
    return key
  }

  function deleteFromParserHintObject (optionKey) {
    // delete from all parsing hints:
    // boolean, array, key, alias, etc.
    Object.keys(options).forEach((hintKey) => {
      const hint = options[hintKey]
      if (Array.isArray(hint)) {
        if (~hint.indexOf(optionKey)) hint.splice(hint.indexOf(optionKey), 1)
      } else if (typeof hint === 'object') {
        delete hint[optionKey]
      }
    })
    // now delete the description from usage.js.
    delete usage.getDescriptions()[optionKey]
  }

  self.config = function config (key, msg, parseFn) {
    argsert('[object|string] [string|function] [function]', [key, msg, parseFn], arguments.length)
    // allow a config object to be provided directly.
    if (typeof key === 'object') {
      key = applyExtends(key, cwd)
      options.configObjects = (options.configObjects || []).concat(key)
      return self
    }

    // allow for a custom parsing function.
    if (typeof msg === 'function') {
      parseFn = msg
      msg = null
    }

    key = key || 'config'
    self.describe(key, msg || usage.deferY18nLookup('Path to JSON config file'))
    ;(Array.isArray(key) ? key : [key]).forEach((k) => {
      options.config[k] = parseFn || true
    })

    return self
  }

  self.example = function (cmd, description) {
    argsert('<string> [string]', [cmd, description], arguments.length)
    usage.example(cmd, description)
    return self
  }

  self.command = function (cmd, description, builder, handler, middlewares) {
    argsert('<string|array|object> [string|boolean] [function|object] [function] [array]', [cmd, description, builder, handler, middlewares], arguments.length)
    command.addHandler(cmd, description, builder, handler, middlewares)
    return self
  }

  self.commandDir = function (dir, opts) {
    argsert('<string> [object]', [dir, opts], arguments.length)
    const req = parentRequire || require
    command.addDirectory(dir, self.getContext(), req, require('get-caller-file')(), opts)
    return self
  }

  // TODO: deprecate self.demand in favor of
  // .demandCommand() .demandOption().
  self.demand = self.required = self.require = function demand (keys, max, msg) {
    // you can optionally provide a 'max' key,
    // which will raise an exception if too many '_'
    // options are provided.
    if (Array.isArray(max)) {
      max.forEach((key) => {
        self.demandOption(key, msg)
      })
      max = Infinity
    } else if (typeof max !== 'number') {
      msg = max
      max = Infinity
    }

    if (typeof keys === 'number') {
      self.demandCommand(keys, max, msg, msg)
    } else if (Array.isArray(keys)) {
      keys.forEach((key) => {
        self.demandOption(key, msg)
      })
    } else {
      if (typeof msg === 'string') {
        self.demandOption(keys, msg)
      } else if (msg === true || typeof msg === 'undefined') {
        self.demandOption(keys)
      }
    }

    return self
  }

  self.demandCommand = function demandCommand (min, max, minMsg, maxMsg) {
    argsert('[number] [number|string] [string|null|undefined] [string|null|undefined]', [min, max, minMsg, maxMsg], arguments.length)

    if (typeof min === 'undefined') min = 1

    if (typeof max !== 'number') {
      minMsg = max
      max = Infinity
    }

    self.global('_', false)

    options.demandedCommands._ = {
      min,
      max,
      minMsg,
      maxMsg
    }

    return self
  }

  self.getDemandedOptions = () => {
    argsert([], 0)
    return options.demandedOptions
  }

  self.getDemandedCommands = () => {
    argsert([], 0)
    return options.demandedCommands
  }

  self.implies = function (key, value) {
    argsert('<string|object> [number|string|array]', [key, value], arguments.length)
    validation.implies(key, value)
    return self
  }

  self.conflicts = function (key1, key2) {
    argsert('<string|object> [string|array]', [key1, key2], arguments.length)
    validation.conflicts(key1, key2)
    return self
  }

  self.usage = function (msg, description, builder, handler) {
    argsert('<string|null|undefined> [string|boolean] [function|object] [function]', [msg, description, builder, handler], arguments.length)

    if (description !== undefined) {
      // .usage() can be used as an alias for defining
      // a default command.
      if ((msg || '').match(/^\$0( |$)/)) {
        return self.command(msg, description, builder, handler)
      } else {
        throw new YError('.usage() description must start with $0 if being used as alias for .command()')
      }
    } else {
      usage.usage(msg)
      return self
    }
  }

  self.epilogue = self.epilog = function (msg) {
    argsert('<string>', [msg], arguments.length)
    usage.epilog(msg)
    return self
  }

  self.fail = function (f) {
    argsert('<function>', [f], arguments.length)
    usage.failFn(f)
    return self
  }

  self.check = function (f, _global) {
    argsert('<function> [boolean]', [f, _global], arguments.length)
    validation.check(f, _global !== false)
    return self
  }

  self.global = function global (globals, global) {
    argsert('<string|array> [boolean]', [globals, global], arguments.length)
    globals = [].concat(globals)
    if (global !== false) {
      options.local = options.local.filter(l => globals.indexOf(l) === -1)
    } else {
      globals.forEach((g) => {
        if (options.local.indexOf(g) === -1) options.local.push(g)
      })
    }
    return self
  }

  self.pkgConf = function pkgConf (key, rootPath) {
    argsert('<string> [string]', [key, rootPath], arguments.length)
    let conf = null
    // prefer cwd to require-main-filename in this method
    // since we're looking for e.g. "nyc" config in nyc consumer
    // rather than "yargs" config in nyc (where nyc is the main filename)
    const obj = pkgUp(rootPath || cwd)

    // If an object exists in the key, add it to options.configObjects
    if (obj[key] && typeof obj[key] === 'object') {
      conf = applyExtends(obj[key], rootPath || cwd)
      options.configObjects = (options.configObjects || []).concat(conf)
    }

    return self
  }

  const pkgs = {}
  function pkgUp (rootPath) {
    const npath = rootPath || '*'
    if (pkgs[npath]) return pkgs[npath]
    const findUp = require('find-up')

    let obj = {}
    try {
      let startDir = rootPath || require('require-main-filename')(parentRequire || require)

      // When called in an environment that lacks require.main.filename, such as a jest test runner,
      // startDir is already process.cwd(), and should not be shortened.
      // Whether or not it is _actually_ a directory (e.g., extensionless bin) is irrelevant, find-up handles it.
      if (!rootPath && path.extname(startDir)) {
        startDir = path.dirname(startDir)
      }

      const pkgJsonPath = findUp.sync('package.json', {
        cwd: startDir
      })
      obj = JSON.parse(fs.readFileSync(pkgJsonPath))
    } catch (noop) {}

    pkgs[npath] = obj || {}
    return pkgs[npath]
  }

  let parseFn = null
  let parseContext = null
  self.parse = function parse (args, shortCircuit, _parseFn) {
    argsert('[string|array] [function|boolean|object] [function]', [args, shortCircuit, _parseFn], arguments.length)
    if (typeof args === 'undefined') {
      return self._parseArgs(processArgs)
    }

    // a context object can optionally be provided, this allows
    // additional information to be passed to a command handler.
    if (typeof shortCircuit === 'object') {
      parseContext = shortCircuit
      shortCircuit = _parseFn
    }

    // by providing a function as a second argument to
    // parse you can capture output that would otherwise
    // default to printing to stdout/stderr.
    if (typeof shortCircuit === 'function') {
      parseFn = shortCircuit
      shortCircuit = null
    }
    // completion short-circuits the parsing process,
    // skipping validation, etc.
    if (!shortCircuit) processArgs = args

    freeze()
    if (parseFn) exitProcess = false

    const parsed = self._parseArgs(args, shortCircuit)
    if (parseFn) parseFn(exitError, parsed, output)
    unfreeze()

    return parsed
  }

  self._getParseContext = () => parseContext || {}

  self._hasParseCallback = () => !!parseFn

  self.option = self.options = function option (key, opt) {
    argsert('<string|object> [object]', [key, opt], arguments.length)
    if (typeof key === 'object') {
      Object.keys(key).forEach((k) => {
        self.options(k, key[k])
      })
    } else {
      if (typeof opt !== 'object') {
        opt = {}
      }

      options.key[key] = true // track manually set keys.

      if (opt.alias) self.alias(key, opt.alias)

      const demand = opt.demand || opt.required || opt.require

      // deprecated, use 'demandOption' instead
      if (demand) {
        self.demand(key, demand)
      }

      if (opt.demandOption) {
        self.demandOption(key, typeof opt.demandOption === 'string' ? opt.demandOption : undefined)
      }

      if ('conflicts' in opt) {
        self.conflicts(key, opt.conflicts)
      }

      if ('default' in opt) {
        self.default(key, opt.default)
      }

      if ('implies' in opt) {
        self.implies(key, opt.implies)
      }

      if ('nargs' in opt) {
        self.nargs(key, opt.nargs)
      }

      if (opt.config) {
        self.config(key, opt.configParser)
      }

      if (opt.normalize) {
        self.normalize(key)
      }

      if ('choices' in opt) {
        self.choices(key, opt.choices)
      }

      if ('coerce' in opt) {
        self.coerce(key, opt.coerce)
      }

      if ('group' in opt) {
        self.group(key, opt.group)
      }

      if (opt.boolean || opt.type === 'boolean') {
        self.boolean(key)
        if (opt.alias) self.boolean(opt.alias)
      }

      if (opt.array || opt.type === 'array') {
        self.array(key)
        if (opt.alias) self.array(opt.alias)
      }

      if (opt.number || opt.type === 'number') {
        self.number(key)
        if (opt.alias) self.number(opt.alias)
      }

      if (opt.string || opt.type === 'string') {
        self.string(key)
        if (opt.alias) self.string(opt.alias)
      }

      if (opt.count || opt.type === 'count') {
        self.count(key)
      }

      if (typeof opt.global === 'boolean') {
        self.global(key, opt.global)
      }

      if (opt.defaultDescription) {
        options.defaultDescription[key] = opt.defaultDescription
      }

      if (opt.skipValidation) {
        self.skipValidation(key)
      }

      const desc = opt.describe || opt.description || opt.desc
      self.describe(key, desc)
      if (opt.hidden) {
        self.hide(key)
      }

      if (opt.requiresArg) {
        self.requiresArg(key)
      }
    }

    return self
  }
  self.getOptions = () => options

  self.positional = function (key, opts) {
    argsert('<string> <object>', [key, opts], arguments.length)
    if (context.resets === 0) {
      throw new YError(".positional() can only be called in a command's builder function")
    }

    // .positional() only supports a subset of the configuration
    // options available to .option().
    const supportedOpts = ['default', 'defaultDescription', 'implies', 'normalize',
      'choices', 'conflicts', 'coerce', 'type', 'describe',
      'desc', 'description', 'alias']
    opts = objFilter(opts, (k, v) => {
      let accept = supportedOpts.indexOf(k) !== -1
      // type can be one of string|number|boolean.
      if (k === 'type' && ['string', 'number', 'boolean'].indexOf(v) === -1) accept = false
      return accept
    })

    // copy over any settings that can be inferred from the command string.
    const fullCommand = context.fullCommands[context.fullCommands.length - 1]
    const parseOptions = fullCommand ? command.cmdToParseOptions(fullCommand) : {
      array: [],
      alias: {},
      default: {},
      demand: {}
    }
    Object.keys(parseOptions).forEach((pk) => {
      if (Array.isArray(parseOptions[pk])) {
        if (parseOptions[pk].indexOf(key) !== -1) opts[pk] = true
      } else {
        if (parseOptions[pk][key] && !(pk in opts)) opts[pk] = parseOptions[pk][key]
      }
    })
    self.group(key, usage.getPositionalGroupName())
    return self.option(key, opts)
  }

  self.group = function group (opts, groupName) {
    argsert('<string|array> <string>', [opts, groupName], arguments.length)
    const existing = preservedGroups[groupName] || groups[groupName]
    if (preservedGroups[groupName]) {
      // we now only need to track this group name in groups.
      delete preservedGroups[groupName]
    }

    const seen = {}
    groups[groupName] = (existing || []).concat(opts).filter((key) => {
      if (seen[key]) return false
      return (seen[key] = true)
    })
    return self
  }
  // combine explicit and preserved groups. explicit groups should be first
  self.getGroups = () => Object.assign({}, groups, preservedGroups)

  // as long as options.envPrefix is not undefined,
  // parser will apply env vars matching prefix to argv
  self.env = function (prefix) {
    argsert('[string|boolean]', [prefix], arguments.length)
    if (prefix === false) options.envPrefix = undefined
    else options.envPrefix = prefix || ''
    return self
  }

  self.wrap = function (cols) {
    argsert('<number|null|undefined>', [cols], arguments.length)
    usage.wrap(cols)
    return self
  }

  let strict = false
  self.strict = function (enabled) {
    argsert('[boolean]', [enabled], arguments.length)
    strict = enabled !== false
    return self
  }
  self.getStrict = () => strict

  let parserConfig = {}
  self.parserConfiguration = function parserConfiguration (config) {
    argsert('<object>', [config], arguments.length)
    parserConfig = config
    return self
  }
  self.getParserConfiguration = () => parserConfig

  self.showHelp = function (level) {
    argsert('[string|function]', [level], arguments.length)
    if (!self.parsed) self._parseArgs(processArgs) // run parser, if it has not already been executed.
    if (command.hasDefaultCommand()) {
      context.resets++ // override the restriction on top-level positoinals.
      command.runDefaultBuilderOn(self, true)
    }
    usage.showHelp(level)
    return self
  }

  let versionOpt = null
  self.version = function version (opt, msg, ver) {
    const defaultVersionOpt = 'version'
    argsert('[boolean|string] [string] [string]', [opt, msg, ver], arguments.length)

    // nuke the key previously configured
    // to return version #.
    if (versionOpt) {
      deleteFromParserHintObject(versionOpt)
      usage.version(undefined)
      versionOpt = null
    }

    if (arguments.length === 0) {
      ver = guessVersion()
      opt = defaultVersionOpt
    } else if (arguments.length === 1) {
      if (opt === false) { // disable default 'version' key.
        return self
      }
      ver = opt
      opt = defaultVersionOpt
    } else if (arguments.length === 2) {
      ver = msg
      msg = null
    }

    versionOpt = typeof opt === 'string' ? opt : defaultVersionOpt
    msg = msg || usage.deferY18nLookup('Show version number')

    usage.version(ver || undefined)
    self.boolean(versionOpt)
    self.describe(versionOpt, msg)
    return self
  }

  function guessVersion () {
    const obj = pkgUp()

    return obj.version || 'unknown'
  }

  let helpOpt = null
  self.addHelpOpt = self.help = function addHelpOpt (opt, msg) {
    const defaultHelpOpt = 'help'
    argsert('[string|boolean] [string]', [opt, msg], arguments.length)

    // nuke the key previously configured
    // to return help.
    if (helpOpt) {
      deleteFromParserHintObject(helpOpt)
      helpOpt = null
    }

    if (arguments.length === 1) {
      if (opt === false) return self
    }

    // use arguments, fallback to defaults for opt and msg
    helpOpt = typeof opt === 'string' ? opt : defaultHelpOpt
    self.boolean(helpOpt)
    self.describe(helpOpt, msg || usage.deferY18nLookup('Show help'))
    return self
  }

  const defaultShowHiddenOpt = 'show-hidden'
  options.showHiddenOpt = defaultShowHiddenOpt
  self.addShowHiddenOpt = self.showHidden = function addShowHiddenOpt (opt, msg) {
    argsert('[string|boolean] [string]', [opt, msg], arguments.length)

    if (arguments.length === 1) {
      if (opt === false) return self
    }

    const showHiddenOpt = typeof opt === 'string' ? opt : defaultShowHiddenOpt
    self.boolean(showHiddenOpt)
    self.describe(showHiddenOpt, msg || usage.deferY18nLookup('Show hidden options'))
    options.showHiddenOpt = showHiddenOpt
    return self
  }

  self.hide = function hide (key) {
    argsert('<string|object>', [key], arguments.length)
    options.hiddenOptions.push(key)
    return self
  }

  self.showHelpOnFail = function showHelpOnFail (enabled, message) {
    argsert('[boolean|string] [string]', [enabled, message], arguments.length)
    usage.showHelpOnFail(enabled, message)
    return self
  }

  var exitProcess = true
  self.exitProcess = function (enabled) {
    argsert('[boolean]', [enabled], arguments.length)
    if (typeof enabled !== 'boolean') {
      enabled = true
    }
    exitProcess = enabled
    return self
  }
  self.getExitProcess = () => exitProcess

  var completionCommand = null
  self.completion = function (cmd, desc, fn) {
    argsert('[string] [string|boolean|function] [function]', [cmd, desc, fn], arguments.length)

    // a function to execute when generating
    // completions can be provided as the second
    // or third argument to completion.
    if (typeof desc === 'function') {
      fn = desc
      desc = null
    }

    // register the completion command.
    completionCommand = cmd || 'completion'
    if (!desc && desc !== false) {
      desc = 'generate completion script'
    }
    self.command(completionCommand, desc)

    // a function can be provided
    if (fn) completion.registerFunction(fn)

    return self
  }

  self.showCompletionScript = function ($0) {
    argsert('[string]', [$0], arguments.length)
    $0 = $0 || self.$0
    _logger.log(completion.generateCompletionScript($0, completionCommand))
    return self
  }

  self.getCompletion = function (args, done) {
    argsert('<array> <function>', [args, done], arguments.length)
    completion.getCompletion(args, done)
  }

  self.locale = function (locale) {
    argsert('[string]', [locale], arguments.length)
    if (arguments.length === 0) {
      guessLocale()
      return y18n.getLocale()
    }
    detectLocale = false
    y18n.setLocale(locale)
    return self
  }

  self.updateStrings = self.updateLocale = function (obj) {
    argsert('<object>', [obj], arguments.length)
    detectLocale = false
    y18n.updateLocale(obj)
    return self
  }

  let detectLocale = true
  self.detectLocale = function (detect) {
    argsert('<boolean>', [detect], arguments.length)
    detectLocale = detect
    return self
  }
  self.getDetectLocale = () => detectLocale

  var hasOutput = false
  var exitError = null
  // maybe exit, always capture
  // context about why we wanted to exit.
  self.exit = (code, err) => {
    hasOutput = true
    exitError = err
    if (exitProcess) process.exit(code)
  }

  // we use a custom logger that buffers output,
  // so that we can print to non-CLIs, e.g., chat-bots.
  const _logger = {
    log () {
      const args = []
      for (let i = 0; i < arguments.length; i++) args.push(arguments[i])
      if (!self._hasParseCallback()) console.log.apply(console, args)
      hasOutput = true
      if (output.length) output += '\n'
      output += args.join(' ')
    },
    error () {
      const args = []
      for (let i = 0; i < arguments.length; i++) args.push(arguments[i])
      if (!self._hasParseCallback()) console.error.apply(console, args)
      hasOutput = true
      if (output.length) output += '\n'
      output += args.join(' ')
    }
  }
  self._getLoggerInstance = () => _logger
  // has yargs output an error our help
  // message in the current execution context.
  self._hasOutput = () => hasOutput

  self._setHasOutput = () => {
    hasOutput = true
  }

  let recommendCommands
  self.recommendCommands = function (recommend) {
    argsert('[boolean]', [recommend], arguments.length)
    recommendCommands = typeof recommend === 'boolean' ? recommend : true
    return self
  }

  self.getUsageInstance = () => usage

  self.getValidationInstance = () => validation

  self.getCommandInstance = () => command

  self.terminalWidth = () => {
    argsert([], 0)
    return typeof process.stdout.columns !== 'undefined' ? process.stdout.columns : null
  }

  Object.defineProperty(self, 'argv', {
    get: () => self._parseArgs(processArgs),
    enumerable: true
  })

  self._parseArgs = function parseArgs (args, shortCircuit, _skipValidation, commandIndex) {
    let skipValidation = !!_skipValidation
    args = args || processArgs

    options.__ = y18n.__
    options.configuration = self.getParserConfiguration()

    // Deprecated
    let pkgConfig = pkgUp()['yargs']
    if (pkgConfig) {
      console.warn('Configuring yargs through package.json is deprecated and will be removed in the next major release, please use the JS API instead.')
      options.configuration = Object.assign({}, pkgConfig, options.configuration)
    }

    const parsed = Parser.detailed(args, options)
    let argv = parsed.argv
    if (parseContext) argv = Object.assign({}, argv, parseContext)
    const aliases = parsed.aliases

    argv.$0 = self.$0
    self.parsed = parsed

    try {
      guessLocale() // guess locale lazily, so that it can be turned off in chain.

      // while building up the argv object, there
      // are two passes through the parser. If completion
      // is being performed short-circuit on the first pass.
      if (shortCircuit) {
        return argv
      }

      // if there's a handler associated with a
      // command defer processing to it.
      if (helpOpt) {
        // consider any multi-char helpOpt alias as a valid help command
        // unless all helpOpt aliases are single-char
        // note that parsed.aliases is a normalized bidirectional map :)
        const helpCmds = [helpOpt]
          .concat(aliases[helpOpt] || [])
          .filter(k => k.length > 1)
        // check if help should trigger and strip it from _.
        if (~helpCmds.indexOf(argv._[argv._.length - 1])) {
          argv._.pop()
          argv[helpOpt] = true
        }
      }

      const handlerKeys = command.getCommands()
      const requestCompletions = completion.completionKey in argv
      const skipRecommendation = argv[helpOpt] || requestCompletions
      const skipDefaultCommand = skipRecommendation && (handlerKeys.length > 1 || handlerKeys[0] !== '$0')

      if (argv._.length) {
        if (handlerKeys.length) {
          let firstUnknownCommand
          for (let i = (commandIndex || 0), cmd; argv._[i] !== undefined; i++) {
            cmd = String(argv._[i])
            if (~handlerKeys.indexOf(cmd) && cmd !== completionCommand) {
              // commands are executed using a recursive algorithm that executes
              // the deepest command first; we keep track of the position in the
              // argv._ array that is currently being executed.
              return command.runCommand(cmd, self, parsed, i + 1)
            } else if (!firstUnknownCommand && cmd !== completionCommand) {
              firstUnknownCommand = cmd
              break
            }
          }

          // run the default command, if defined
          if (command.hasDefaultCommand() && !skipDefaultCommand) {
            return command.runCommand(null, self, parsed)
          }

          // recommend a command if recommendCommands() has
          // been enabled, and no commands were found to execute
          if (recommendCommands && firstUnknownCommand && !skipRecommendation) {
            validation.recommendCommands(firstUnknownCommand, handlerKeys)
          }
        }

        // generate a completion script for adding to ~/.bashrc.
        if (completionCommand && ~argv._.indexOf(completionCommand) && !requestCompletions) {
          if (exitProcess) setBlocking(true)
          self.showCompletionScript()
          self.exit(0)
        }
      } else if (command.hasDefaultCommand() && !skipDefaultCommand) {
        return command.runCommand(null, self, parsed)
      }

      // we must run completions first, a user might
      // want to complete the --help or --version option.
      if (requestCompletions) {
        if (exitProcess) setBlocking(true)

        // we allow for asynchronous completions,
        // e.g., loading in a list of commands from an API.
        const completionArgs = args.slice(args.indexOf(`--${completion.completionKey}`) + 1)
        completion.getCompletion(completionArgs, (completions) => {
          ;(completions || []).forEach((completion) => {
            _logger.log(completion)
          })

          self.exit(0)
        })
        return argv
      }

      // Handle 'help' and 'version' options
      // if we haven't already output help!
      if (!hasOutput) {
        Object.keys(argv).forEach((key) => {
          if (key === helpOpt && argv[key]) {
            if (exitProcess) setBlocking(true)

            skipValidation = true
            self.showHelp('log')
            self.exit(0)
          } else if (key === versionOpt && argv[key]) {
            if (exitProcess) setBlocking(true)

            skipValidation = true
            usage.showVersion()
            self.exit(0)
          }
        })
      }

      // Check if any of the options to skip validation were provided
      if (!skipValidation && options.skipValidation.length > 0) {
        skipValidation = Object.keys(argv).some(key => options.skipValidation.indexOf(key) >= 0 && argv[key] === true)
      }

      // If the help or version options where used and exitProcess is false,
      // or if explicitly skipped, we won't run validations.
      if (!skipValidation) {
        if (parsed.error) throw new YError(parsed.error.message)

        // if we're executed via bash completion, don't
        // bother with validation.
        if (!requestCompletions) {
          self._runValidation(argv, aliases, {}, parsed.error)
        }
      }
    } catch (err) {
      if (err instanceof YError) usage.fail(err.message, err)
      else throw err
    }

    return argv
  }

  self._runValidation = function runValidation (argv, aliases, positionalMap, parseErrors) {
    if (parseErrors) throw new YError(parseErrors.message || parseErrors)
    validation.nonOptionCount(argv)
    validation.requiredArguments(argv)
    if (strict) validation.unknownArguments(argv, aliases, positionalMap)
    validation.customChecks(argv, aliases)
    validation.limitedChoices(argv)
    validation.implications(argv)
    validation.conflicting(argv)
  }

  function guessLocale () {
    if (!detectLocale) return

    try {
      const { env } = process
      const locale = env.LC_ALL || env.LC_MESSAGES || env.LANG || env.LANGUAGE || 'en_US'
      self.locale(locale.replace(/[.:].*/, ''))
    } catch (err) {
      // if we explode looking up locale just noop
      // we'll keep using the default language 'en'.
    }
  }

  // an app should almost always have --version and --help,
  // if you *really* want to disable this use .help(false)/.version(false).
  self.help()
  self.version()

  return self
}

// rebase an absolute path to a relative one with respect to a base directory
// exported for tests
exports.rebase = rebase
function rebase (base, dir) {
  return path.relative(base, dir)
}
{
  "Commands:": "ÐšÐ°Ð¼Ð°Ð½Ð´Ñ‹:",
  "Options:": "ÐžÐ¿Ñ†Ñ‹Ñ–:",
  "Examples:": "ÐŸÑ€Ñ‹ÐºÐ»Ð°Ð´Ñ‹:",
  "boolean": "Ð±ÑƒÐ»ÐµÐ²Ñ‹ Ñ‚Ñ‹Ð¿",
  "count": "Ð¿Ð°Ð´Ð»Ñ–Ðº",
  "string": "Ñ€Ð°Ð´ÐºÐ¾Ð²Ñ‹ Ñ‚Ñ‹Ð¿",
  "number": "Ð»Ñ–Ðº",
  "array": "Ð¼Ð°Ñ�Ñ–Ñž",
  "required": "Ð½ÐµÐ°Ð±Ñ…Ð¾Ð´Ð½Ð°",
  "default:": "Ð¿Ð° Ð·Ð¼Ð°ÑžÑ‡Ð°Ð½Ð½Ñ–:",
  "choices:": "Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ð°Ñ�Ñ†Ñ–:",
  "aliases:": "Ð°Ð»Ñ–Ð°Ñ�Ñ‹:",
  "generated-value": "Ð·Ð³ÐµÐ½ÐµÑ€Ð°Ð²Ð°Ð½Ð°Ðµ Ð·Ð½Ð°Ñ‡Ñ�Ð½Ð½Ðµ",
  "Not enough non-option arguments: got %s, need at least %s": "Ð�ÐµÐ´Ð°Ñ�Ñ‚Ð°Ñ‚ÐºÐ¾Ð²Ð° Ð½ÐµÐ°Ð¿Ñ†Ñ‹Ð¹Ð½Ñ‹Ñ… Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñž: Ñ‘Ñ�Ñ†ÑŒ %s, Ñ‚Ñ€Ñ�Ð±Ð° Ñ�Ðº Ð¼Ñ–Ð½Ñ–Ð¼ÑƒÐ¼ %s",
  "Too many non-option arguments: got %s, maximum of %s": "Ð—Ð°Ð½Ð°Ð´Ñ‚Ð° ÑˆÐ¼Ð°Ñ‚ Ð½ÐµÐ°Ð¿Ñ†Ñ‹Ð¹Ð½Ñ‹Ñ… Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñž: Ñ‘Ñ�Ñ†ÑŒ %s, Ð¼Ð°ÐºÑ�Ñ–Ð¼ÑƒÐ¼ Ð´Ð°Ð¿ÑƒÑˆÑ‡Ð°Ð»ÑŒÐ½Ð° %s",
  "Missing argument value: %s": {
    "one": "Ð�Ðµ Ñ…Ð°Ð¿Ð°Ðµ Ð·Ð½Ð°Ñ‡Ñ�Ð½Ð½Ñ� Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñƒ: %s",
    "other": "Ð�Ðµ Ñ…Ð°Ð¿Ð°Ðµ Ð·Ð½Ð°Ñ‡Ñ�Ð½Ð½Ñ�Ñž Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñž: %s"
  },
  "Missing required argument: %s": {
    "one": "Ð�Ðµ Ñ…Ð°Ð¿Ð°Ðµ Ð½ÐµÐ°Ð±Ñ…Ð¾Ð´Ð½Ð°Ð³Ð° Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñƒ: %s",
    "other": "Ð�Ðµ Ñ…Ð°Ð¿Ð°Ðµ Ð½ÐµÐ°Ð±Ñ…Ð¾Ð´Ð½Ñ‹Ñ… Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñž: %s"
  },
  "Unknown argument: %s": {
    "one": "Ð�ÐµÐ²Ñ�Ð´Ð¾Ð¼Ñ‹ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚: %s",
    "other": "Ð�ÐµÐ²Ñ�Ð´Ð¾Ð¼Ñ‹Ñ� Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñ‹: %s"
  },
  "Invalid values:": "Ð�ÐµÑ�Ð°Ð¿Ñ€Ð°ÑžÐ´Ð½Ñ‹Ñ� Ð·Ð½Ð°Ñ‡Ñ�Ð½Ð½Ñ�:",
  "Argument: %s, Given: %s, Choices: %s": "Ð�Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚: %s, Ð”Ð°Ð´Ð·ÐµÐ½Ð°Ðµ Ð·Ð½Ð°Ñ‡Ñ�Ð½Ð½Ðµ: %s, ÐœÐ°Ð³Ñ‡Ñ‹Ð¼Ð°Ñ�Ñ†Ñ–: %s",
  "Argument check failed: %s": "ÐŸÑ€Ð°Ð²ÐµÑ€ÐºÐ° Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñž Ð½Ðµ ÑžÐ´Ð°Ð»Ð°Ñ�Ñ�: %s",
  "Implications failed:": "Ð”Ð°Ð´Ð·ÐµÐ½Ñ‹ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚ Ð¿Ð°Ñ‚Ñ€Ð°Ð±ÑƒÐµ Ð½Ð°Ñ�Ñ‚ÑƒÐ¿Ð½Ñ‹ Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ñ‹ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚:",
  "Not enough arguments following: %s": "Ð�ÐµÐ´Ð°Ñ�Ñ‚Ð°Ñ‚ÐºÐ¾Ð²Ð° Ð½Ð°Ñ�Ñ‚ÑƒÐ¿Ð½Ñ‹Ñ… Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñž: %s",
  "Invalid JSON config file: %s": "Ð�ÐµÑ�Ð°Ð¿Ñ€Ð°ÑžÐ´Ð½Ñ‹ Ñ„Ð°Ð¹Ð» ÐºÐ°Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ‹Ñ– JSON: %s",
  "Path to JSON config file": "Ð¨Ð»Ñ�Ñ… Ð´Ð° Ñ„Ð°Ð¹Ð»Ð° ÐºÐ°Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ‹Ñ– JSON",
  "Show help": "ÐŸÐ°ÐºÐ°Ð·Ð°Ñ†ÑŒ Ð´Ð°Ð¿Ð°Ð¼Ð¾Ð³Ñƒ",
  "Show version number": "ÐŸÐ°ÐºÐ°Ð·Ð°Ñ†ÑŒ Ð½ÑƒÐ¼Ð°Ñ€ Ð²ÐµÑ€Ñ�Ñ–Ñ–",
  "Did you mean %s?": "Ð’Ñ‹ Ð¼ÐµÐ»Ñ– Ð½Ð° ÑžÐ²Ð°Ð·Ðµ %s?"
}
{
  "Commands:": "Kommandos:",
  "Options:": "Optionen:",
  "Examples:": "Beispiele:",
  "boolean": "boolean",
  "count": "ZÃ¤hler",
  "string": "string",
  "number": "Zahl",
  "array": "array",
  "required": "erforderlich",
  "default:": "Standard:",
  "choices:": "MÃ¶glichkeiten:",
  "aliases:": "Aliase:",
  "generated-value": "Generierter-Wert",
  "Not enough non-option arguments: got %s, need at least %s": "Nicht genÃ¼gend Argumente ohne Optionen: %s vorhanden, mindestens %s benÃ¶tigt",
  "Too many non-option arguments: got %s, maximum of %s": "Zu viele Argumente ohne Optionen: %s vorhanden, maximal %s erlaubt",
  "Missing argument value: %s": {
    "one": "Fehlender Argumentwert: %s",
    "other": "Fehlende Argumentwerte: %s"
  },
  "Missing required argument: %s": {
    "one": "Fehlendes Argument: %s",
    "other": "Fehlende Argumente: %s"
  },
  "Unknown argument: %s": {
    "one": "Unbekanntes Argument: %s",
    "other": "Unbekannte Argumente: %s"
  },
  "Invalid values:": "UnzulÃ¤ssige Werte:",
  "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gegeben: %s, MÃ¶glichkeiten: %s",
  "Argument check failed: %s": "Argumente-Check fehlgeschlagen: %s",
  "Implications failed:": "Fehlende abhÃ¤ngige Argumente:",
  "Not enough arguments following: %s": "Nicht genÃ¼gend Argumente nach: %s",
  "Invalid JSON config file: %s": "Fehlerhafte JSON-Config Datei: %s",
  "Path to JSON config file": "Pfad zur JSON-Config Datei",
  "Show help": "Hilfe anzeigen",
  "Show version number": "Version anzeigen",
  "Did you mean %s?": "Meintest du %s?"
}
{
  "Commands:": "Commands:",
  "Options:": "Options:",
  "Examples:": "Examples:",
  "boolean": "boolean",
  "count": "count",
  "string": "string",
  "number": "number",
  "array": "array",
  "required": "required",
  "default:": "default:",
  "choices:": "choices:",
  "aliases:": "aliases:",
  "generated-value": "generated-value",
  "Not enough non-option arguments: got %s, need at least %s": "Not enough non-option arguments: got %s, need at least %s",
  "Too many non-option arguments: got %s, maximum of %s": "Too many non-option arguments: got %s, maximum of %s",
  "Missing argument value: %s": {
    "one": "Missing argument value: %s",
    "other": "Missing argument values: %s"
  },
  "Missing required argument: %s": {
    "one": "Missing required argument: %s",
    "other": "Missing required arguments: %s"
  },
  "Unknown argument: %s": {
    "one": "Unknown argument: %s",
    "other": "Unknown arguments: %s"
  },
  "Invalid values:": "Invalid values:",
  "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Given: %s, Choices: %s",
  "Argument check failed: %s": "Argument check failed: %s",
  "Implications failed:": "Missing dependent arguments:",
  "Not enough arguments following: %s": "Not enough arguments following: %s",
  "Invalid JSON config file: %s": "Invalid JSON config file: %s",
  "Path to JSON config file": "Path to JSON config file",
  "Show help": "Show help",
  "Show version number": "Show version number",
  "Did you mean %s?": "Did you mean %s?",
  "Arguments %s and %s are mutually exclusive" : "Arguments %s and %s are mutually exclusive",
  "Positionals:": "Positionals:",
  "command": "command"
}
{
  "Commands:": "Comandos:",
  "Options:": "Opciones:",
  "Examples:": "Ejemplos:",
  "boolean": "booleano",
  "count": "cuenta",
  "string": "cadena de caracteres",
  "number": "nÃºmero",
  "array": "tabla",
  "required": "requerido",
  "default:": "defecto:",
  "choices:": "selecciÃ³n:",
  "aliases:": "alias:",
  "generated-value": "valor-generado",
  "Not enough non-option arguments: got %s, need at least %s": "Hacen falta argumentos no-opcionales: NÃºmero recibido %s, necesita por lo menos %s",
  "Too many non-option arguments: got %s, maximum of %s": "Demasiados argumentos no-opcionales: NÃºmero recibido %s, mÃ¡ximo es %s",
  "Missing argument value: %s": {
    "one": "Falta argumento: %s",
    "other": "Faltan argumentos: %s"
  },
  "Missing required argument: %s": {
    "one": "Falta argumento requerido: %s",
    "other": "Faltan argumentos requeridos: %s"
  },
  "Unknown argument: %s": {
    "one": "Argumento desconocido: %s",
    "other": "Argumentos desconocidos: %s"
  },
  "Invalid values:": "Valores invÃ¡lidos:",
  "Argument: %s, Given: %s, Choices: %s": "Argumento: %s, Recibido: %s, Seleccionados: %s",
  "Argument check failed: %s": "VerificaciÃ³n de argumento ha fallado: %s",
  "Implications failed:": "Implicaciones fallidas:",
  "Not enough arguments following: %s": "No hay suficientes argumentos despuÃ©s de: %s",
  "Invalid JSON config file: %s": "Archivo de configuraciÃ³n JSON invÃ¡lido: %s",
  "Path to JSON config file": "Ruta al archivo de configuraciÃ³n JSON",
  "Show help": "Muestra ayuda",
  "Show version number": "Muestra nÃºmero de versiÃ³n",
  "Did you mean %s?": "Quisiste decir %s?"
}
{
  "Commands:": "Commandes:",
  "Options:": "Options:",
  "Examples:": "Exemples:",
  "boolean": "boolÃ©en",
  "count": "comptage",
  "string": "chaine de caractÃ¨re",
  "number": "nombre",
  "array": "tableau",
  "required": "requis",
  "default:": "dÃ©faut:",
  "choices:": "choix:",
  "generated-value": "valeur gÃ©nÃ©rÃ©e",
  "Not enough non-option arguments: got %s, need at least %s": "Pas assez d'arguments non-option: reÃ§u %s, besoin d'au moins %s",
  "Too many non-option arguments: got %s, maximum of %s": "Trop d'arguments non-option: reÃ§u %s, maximum %s",
  "Missing argument value: %s": {
    "one": "Argument manquant: %s",
    "other": "Arguments manquants: %s"
  },
  "Missing required argument: %s": {
    "one": "Argument requis manquant: %s",
    "other": "Arguments requis manquants: %s"
  },
  "Unknown argument: %s": {
    "one": "Argument inconnu: %s",
    "other": "Arguments inconnus: %s"
  },
  "Invalid values:": "Valeurs invalides:",
  "Argument: %s, Given: %s, Choices: %s": "Argument: %s, DonnÃ©: %s, Choix: %s",
  "Argument check failed: %s": "Echec de la vÃ©rification de l'argument: %s",
  "Implications failed:": "Arguments dÃ©pendants manquants:",
  "Not enough arguments following: %s": "Pas assez d'arguments suivant: %s",
  "Invalid JSON config file: %s": "Fichier de configuration JSON invalide: %s",
  "Path to JSON config file": "Chemin du fichier de configuration JSON",
  "Show help": "Affiche de l'aide",
  "Show version number": "Affiche le numÃ©ro de version"
}
{
  "Commands:": "à¤†à¤¦à¥‡à¤¶:",
  "Options:": "à¤µà¤¿à¤•à¤²à¥�à¤ª:",
  "Examples:": "à¤‰à¤¦à¤¾à¤¹à¤°à¤£:",
  "boolean": "à¤¸à¤¤à¥�à¤¯à¤¤à¤¾",
  "count": "à¤¸à¤‚à¤–à¥�à¤¯à¤¾",
  "string": "à¤µà¤°à¥�à¤£à¥‹à¤‚ à¤•à¤¾ à¤¤à¤¾à¤° ",
  "number": "à¤…à¤‚à¤•",
  "array": "à¤¸à¤°à¤£à¥€",
  "required": "à¤†à¤µà¤¶à¥�à¤¯à¤•",
  "default:": "à¤¡à¤¿à¤«à¥‰à¤²à¥�à¤Ÿ:",
  "choices:": "à¤µà¤¿à¤•à¤²à¥�à¤ª:",
  "aliases:": "à¤‰à¤ªà¤¨à¤¾à¤®:",
  "generated-value": "à¤‰à¤¤à¥�à¤ªà¤¨à¥�à¤¨-à¤®à¥‚à¤²à¥�à¤¯",
  "Not enough non-option arguments: got %s, need at least %s": "à¤ªà¤°à¥�à¤¯à¤¾à¤ªà¥�à¤¤ à¤—à¥ˆà¤°-à¤µà¤¿à¤•à¤²à¥�à¤ª à¤¤à¤°à¥�à¤• à¤ªà¥�à¤°à¤¾à¤ªà¥�à¤¤ à¤¨à¤¹à¥€à¤‚: %s à¤ªà¥�à¤°à¤¾à¤ªà¥�à¤¤, à¤•à¤® à¤¸à¥‡ à¤•à¤® %s à¤•à¥€ à¤†à¤µà¤¶à¥�à¤¯à¤•à¤¤à¤¾ à¤¹à¥ˆ",
  "Too many non-option arguments: got %s, maximum of %s": "à¤¬à¤¹à¥�à¤¤ à¤¸à¤¾à¤°à¥‡ à¤—à¥ˆà¤°-à¤µà¤¿à¤•à¤²à¥�à¤ª à¤¤à¤°à¥�à¤•: %s à¤ªà¥�à¤°à¤¾à¤ªà¥�à¤¤, à¤…à¤§à¤¿à¤•à¤¤à¤® %s à¤®à¤¾à¤¨à¥�à¤¯",
  "Missing argument value: %s": {
    "one": "à¤•à¥�à¤› à¤¤à¤°à¥�à¤•à¥‹ à¤•à¥‡ à¤®à¥‚à¤²à¥�à¤¯ à¤—à¥�à¤® à¤¹à¥ˆà¤‚: %s",
    "other": "à¤•à¥�à¤› à¤¤à¤°à¥�à¤•à¥‹ à¤•à¥‡ à¤®à¥‚à¤²à¥�à¤¯ à¤—à¥�à¤® à¤¹à¥ˆà¤‚: %s"
  },
  "Missing required argument: %s": {
    "one": "à¤†à¤µà¤¶à¥�à¤¯à¤• à¤¤à¤°à¥�à¤• à¤—à¥�à¤® à¤¹à¥ˆà¤‚: %s",
    "other": "à¤†à¤µà¤¶à¥�à¤¯à¤• à¤¤à¤°à¥�à¤• à¤—à¥�à¤® à¤¹à¥ˆà¤‚: %s"
  },
  "Unknown argument: %s": {
    "one": "à¤…à¤œà¥�à¤žà¤¾à¤¤ à¤¤à¤°à¥�à¤• à¤ªà¥�à¤°à¤¾à¤ªà¥�à¤¤: %s",
    "other": "à¤…à¤œà¥�à¤žà¤¾à¤¤ à¤¤à¤°à¥�à¤• à¤ªà¥�à¤°à¤¾à¤ªà¥�à¤¤: %s"
  },
  "Invalid values:": "à¤…à¤®à¤¾à¤¨à¥�à¤¯ à¤®à¥‚à¤²à¥�à¤¯:",
  "Argument: %s, Given: %s, Choices: %s": "à¤¤à¤°à¥�à¤•: %s, à¤ªà¥�à¤°à¤¾à¤ªà¥�à¤¤: %s, à¤µà¤¿à¤•à¤²à¥�à¤ª: %s",
  "Argument check failed: %s": "à¤¤à¤°à¥�à¤• à¤œà¤¾à¤‚à¤š à¤µà¤¿à¤«à¤²: %s",
  "Implications failed:": "à¤¦à¤¿à¤� à¤—à¤� à¤¤à¤°à¥�à¤• à¤•à¥‡ à¤²à¤¿à¤� à¤…à¤¤à¤¿à¤°à¤¿à¤•à¥�à¤¤ à¤¤à¤°à¥�à¤• à¤•à¥€ à¤…à¤ªà¥‡à¤•à¥�à¤·à¤¾ à¤¹à¥ˆ:",
  "Not enough arguments following: %s": "à¤¨à¤¿à¤®à¥�à¤¨à¤²à¤¿à¤–à¤¿à¤¤ à¤•à¥‡ à¤¬à¤¾à¤¦ à¤ªà¤°à¥�à¤¯à¤¾à¤ªà¥�à¤¤ à¤¤à¤°à¥�à¤• à¤¨à¤¹à¥€à¤‚ à¤ªà¥�à¤°à¤¾à¤ªà¥�à¤¤: %s",
  "Invalid JSON config file: %s": "à¤…à¤®à¤¾à¤¨à¥�à¤¯ JSON config à¤«à¤¾à¤‡à¤²: %s",
  "Path to JSON config file": "JSON config à¤«à¤¾à¤‡à¤² à¤•à¤¾ à¤ªà¤¥",
  "Show help": "à¤¸à¤¹à¤¾à¤¯à¤¤à¤¾ à¤¦à¤¿à¤–à¤¾à¤�à¤�",
  "Show version number": "Version à¤¸à¤‚à¤–à¥�à¤¯à¤¾ à¤¦à¤¿à¤–à¤¾à¤�à¤�",
  "Did you mean %s?": "à¤•à¥�à¤¯à¤¾ à¤†à¤ªà¤•à¤¾ à¤®à¤¤à¤²à¤¬ à¤¹à¥ˆ %s?",
  "Arguments %s and %s are mutually exclusive" : "à¤¤à¤°à¥�à¤• %s à¤”à¤° %s à¤ªà¤°à¤¸à¥�à¤ªà¤° à¤…à¤¨à¤¨à¥�à¤¯ à¤¹à¥ˆà¤‚",
  "Positionals:": "à¤¸à¥�à¤¥à¤¾à¤¨à¥€à¤¯:",
  "command": "à¤†à¤¦à¥‡à¤¶"
}
{
  "Commands:": "Parancsok:",
  "Options:": "OpciÃ³k:",
  "Examples:": "PÃ©ldÃ¡k:",
  "boolean": "boolean",
  "count": "szÃ¡mlÃ¡lÃ³",
  "string": "szÃ¶veg",
  "number": "szÃ¡m",
  "array": "tÃ¶mb",
  "required": "kÃ¶telezÅ‘",
  "default:": "alapÃ©rtelmezett:",
  "choices:": "lehetÅ‘sÃ©gek:",
  "aliases:": "aliaszok:",
  "generated-value": "generÃ¡lt-Ã©rtÃ©k",
  "Not enough non-option arguments: got %s, need at least %s": "Nincs elÃ©g nem opcionÃ¡lis argumentum: %s van, legalÃ¡bb %s kell",
  "Too many non-option arguments: got %s, maximum of %s": "TÃºl sok nem opciÃ¡nlis argumentum van: %s van, maximum %s lehet",
  "Missing argument value: %s": {
    "one": "HiÃ¡nyzÃ³ argumentum Ã©rtÃ©k: %s",
    "other": "HiÃ¡nyzÃ³ argumentum Ã©rtÃ©kek: %s"
  },
  "Missing required argument: %s": {
    "one": "HiÃ¡nyzÃ³ kÃ¶telezÅ‘ argumentum: %s",
    "other": "HiÃ¡nyzÃ³ kÃ¶telezÅ‘ argumentumok: %s"
  },
  "Unknown argument: %s": {
    "one": "Ismeretlen argumentum: %s",
    "other": "Ismeretlen argumentumok: %s"
  },
  "Invalid values:": "Ã‰rvÃ©nytelen Ã©rtÃ©k:",
  "Argument: %s, Given: %s, Choices: %s": "Argumentum: %s, Megadott: %s, LehetÅ‘sÃ©gek: %s",
  "Argument check failed: %s": "Argumentum ellenÅ‘rzÃ©s sikertelen: %s",
  "Implications failed:": "ImplikÃ¡ciÃ³k sikertelenek:",
  "Not enough arguments following: %s": "Nem elÃ©g argumentum kÃ¶veti: %s",
  "Invalid JSON config file: %s": "Ã‰rvÃ©nytelen JSON konfigurÃ¡ciÃ³s file: %s",
  "Path to JSON config file": "JSON konfigurÃ¡ciÃ³s file helye",
  "Show help": "SÃºgo megjelenÃ­tÃ©se",
  "Show version number": "VerziÃ³szÃ¡m megjelenÃ­tÃ©se",
  "Did you mean %s?": "Erre gondoltÃ¡l %s?"
}

{
  "Commands:": "Perintah:",
  "Options:": "Pilihan:",
  "Examples:": "Contoh:",
  "boolean": "boolean",
  "count": "jumlah",
  "number": "nomor",
  "string": "string",
  "array": "larik",
  "required": "diperlukan",
  "default:": "bawaan:",
  "aliases:": "istilah lain:",
  "choices:": "pilihan:",
  "generated-value": "nilai-yang-dihasilkan",
  "Not enough non-option arguments: got %s, need at least %s": "Argumen wajib kurang: hanya %s, minimal %s",
  "Too many non-option arguments: got %s, maximum of %s": "Terlalu banyak argumen wajib: ada %s, maksimal %s",
  "Missing argument value: %s": {
    "one": "Kurang argumen: %s",
    "other": "Kurang argumen: %s"
  },
  "Missing required argument: %s": {
    "one": "Kurang argumen wajib: %s",
    "other": "Kurang argumen wajib: %s"
  },
  "Unknown argument: %s": {
    "one": "Argumen tak diketahui: %s",
    "other": "Argumen tak diketahui: %s"
  },
  "Invalid values:": "Nilai-nilai tidak valid:",
  "Argument: %s, Given: %s, Choices: %s": "Argumen: %s, Diberikan: %s, Pilihan: %s",
  "Argument check failed: %s": "Pemeriksaan argument gagal: %s",
  "Implications failed:": "Implikasi gagal:",
  "Not enough arguments following: %s": "Kurang argumen untuk: %s",
  "Invalid JSON config file: %s": "Berkas konfigurasi JSON tidak valid: %s",
  "Path to JSON config file": "Alamat berkas konfigurasi JSON",
  "Show help": "Lihat bantuan",
  "Show version number": "Lihat nomor versi",
  "Did you mean %s?": "Maksud Anda: %s?",
  "Arguments %s and %s are mutually exclusive" : "Argumen %s dan %s saling eksklusif",
  "Positionals:": "Posisional-posisional:",
  "command": "perintah"
}
{
  "Commands:": "Comandi:",
  "Options:": "Opzioni:",
  "Examples:": "Esempi:",
  "boolean": "booleano",
  "count": "contatore",
  "string": "stringa",
  "number": "numero",
  "array": "vettore",
  "required": "richiesto",
  "default:": "predefinito:",
  "choices:": "scelte:",
  "aliases:": "alias:",
  "generated-value": "valore generato",
  "Not enough non-option arguments: got %s, need at least %s": "Numero insufficiente di argomenti non opzione: inseriti %s, richiesti almeno %s",
  "Too many non-option arguments: got %s, maximum of %s": "Troppi argomenti non opzione: inseriti %s, massimo possibile %s",
  "Missing argument value: %s": {
    "one": "Argomento mancante: %s",
    "other": "Argomenti mancanti: %s"
  },
  "Missing required argument: %s": {
    "one": "Argomento richiesto mancante: %s",
    "other": "Argomenti richiesti mancanti: %s"
  },
  "Unknown argument: %s": {
    "one": "Argomento sconosciuto: %s",
    "other": "Argomenti sconosciuti: %s"
  },
  "Invalid values:": "Valori non validi:",
  "Argument: %s, Given: %s, Choices: %s": "Argomento: %s, Richiesto: %s, Scelte: %s",
  "Argument check failed: %s": "Controllo dell'argomento fallito: %s",
  "Implications failed:": "Argomenti dipendenti mancanti:",
  "Not enough arguments following: %s": "Argomenti insufficienti dopo: %s",
  "Invalid JSON config file: %s": "File di configurazione JSON non valido: %s",
  "Path to JSON config file": "Percorso del file di configurazione JSON",
  "Show help": "Mostra la schermata di aiuto",
  "Show version number": "Mostra il numero di versione",
  "Did you mean %s?": "Intendi forse %s?"
}
{
  "Commands:": "ã‚³ãƒžãƒ³ãƒ‰:",
  "Options:": "ã‚ªãƒ—ã‚·ãƒ§ãƒ³:",
  "Examples:": "ä¾‹:",
  "boolean": "çœŸå�½",
  "count": "ã‚«ã‚¦ãƒ³ãƒˆ",
  "string": "æ–‡å­—åˆ—",
  "number": "æ•°å€¤",
  "array": "é…�åˆ—",
  "required": "å¿…é ˆ",
  "default:": "ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ:",
  "choices:": "é�¸æŠžã�—ã�¦ã��ã� ã�•ã�„:",
  "aliases:": "ã‚¨ã‚¤ãƒªã‚¢ã‚¹:",
  "generated-value": "ç”Ÿæˆ�ã�•ã‚Œã�Ÿå€¤",
  "Not enough non-option arguments: got %s, need at least %s": "ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã�§ã�¯ã�ªã�„å¼•æ•°ã�Œ %s å€‹ã�§ã�¯ä¸�è¶³ã�—ã�¦ã�„ã�¾ã�™ã€‚å°‘ã�ªã��ã�¨ã‚‚ %s å€‹ã�®å¼•æ•°ã�Œå¿…è¦�ã�§ã�™:",
  "Too many non-option arguments: got %s, maximum of %s": "ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã�§ã�¯ã�ªã�„å¼•æ•°ã�Œ %s å€‹ã�§ã�¯å¤šã�™ã�Žã�¾ã�™ã€‚æœ€å¤§ã�§ %s å€‹ã�¾ã�§ã�§ã�™:",
  "Missing argument value: %s": {
    "one": "å¼•æ•°ã�Œè¦‹ã�¤ã�‹ã‚Šã�¾ã�›ã‚“: %s",
    "other": "å¼•æ•°ã�Œè¦‹ã�¤ã�‹ã‚Šã�¾ã�›ã‚“: %s"
  },
  "Missing required argument: %s": {
    "one": "å¿…é ˆã�®å¼•æ•°ã�Œè¦‹ã�¤ã�‹ã‚Šã�¾ã�›ã‚“: %s",
    "other": "å¿…é ˆã�®å¼•æ•°ã�Œè¦‹ã�¤ã�‹ã‚Šã�¾ã�›ã‚“: %s"
  },
  "Unknown argument: %s": {
    "one": "æœªçŸ¥ã�®å¼•æ•°ã�§ã�™: %s",
    "other": "æœªçŸ¥ã�®å¼•æ•°ã�§ã�™: %s"
  },
  "Invalid values:": "ä¸�æ­£ã�ªå€¤ã�§ã�™:",
  "Argument: %s, Given: %s, Choices: %s": "å¼•æ•°ã�¯ %s ã�§ã�™ã€‚æŒ‡å®šã�§ã��ã‚‹ã�®ã�¯ %s ã�¤ã�§ã�™ã€‚é�¸æŠžã�—ã�¦ã��ã� ã�•ã�„: %s",
  "Argument check failed: %s": "å¼•æ•°ã�®ãƒ�ã‚§ãƒƒã‚¯ã�«å¤±æ•—ã�—ã�¾ã�—ã�Ÿ: %s",
  "Implications failed:": "ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã�®çµ„ã�¿å�ˆã‚�ã�›ã�§ä¸�æ­£ã�Œç”Ÿã�˜ã�¾ã�—ã�Ÿ:",
  "Not enough arguments following: %s": "æ¬¡ã�®å¼•æ•°ã�Œä¸�è¶³ã�—ã�¦ã�„ã�¾ã�™ã€‚: %s",
  "Invalid JSON config file: %s": "JSONã�®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã�Œä¸�æ­£ã�§ã�™: %s",
  "Path to JSON config file": "JSONã�®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã�¾ã�§ã�®path",
  "Show help": "ãƒ˜ãƒ«ãƒ—ã‚’è¡¨ç¤º",
  "Show version number": "ãƒ�ãƒ¼ã‚¸ãƒ§ãƒ³ã‚’è¡¨ç¤º",
  "Did you mean %s?": "ã‚‚ã�—ã�‹ã�—ã�¦ %s?",
  "Arguments %s and %s are mutually exclusive" : "å¼•æ•° %s ã�¨ %s ã�¯å�Œæ™‚ã�«æŒ‡å®šã�§ã��ã�¾ã�›ã‚“",
  "Positionals:": "ä½�ç½®:",
  "command": "ã‚³ãƒžãƒ³ãƒ‰"
}
{
  "Commands:": "ëª…ë ¹:",
  "Options:": "ì˜µì…˜:",
  "Examples:": "ì˜ˆì‹œ:",
  "boolean": "ì—¬ë¶€",
  "count": "ê°œìˆ˜",
  "string": "ë¬¸ìž�ì—´",
  "number": "ìˆ«ìž�",
  "array": "ë°°ì—´",
  "required": "í•„ìˆ˜",
  "default:": "ê¸°ë³¸:",
  "choices:": "ì„ íƒ�:",
  "aliases:": "ë³„ì¹­:",
  "generated-value": "ìƒ�ì„±ë�œ ê°’",
  "Not enough non-option arguments: got %s, need at least %s": "ì˜µì…˜ì�´ ì•„ë‹Œ ì�¸ìž�ê°€ ì¶©ë¶„ì¹˜ ì•ŠìŠµë‹ˆë‹¤: %sê°œë¥¼ ë°›ì•˜ì§€ë§Œ, ì �ì–´ë�„ %sê°œëŠ” í•„ìš”í•©ë‹ˆë‹¤",
  "Too many non-option arguments: got %s, maximum of %s": "ì˜µì…˜ì�´ ì•„ë‹Œ ì�¸ìž�ê°€ ë„ˆë¬´ ë§ŽìŠµë‹ˆë‹¤: %sê°œë¥¼ ë°›ì•˜ì§€ë§Œ, %sê°œ ì�´í•˜ì—¬ì•¼ í•©ë‹ˆë‹¤",
  "Missing argument value: %s": {
    "one": "ì�¸ìž�ê°’ì�„ ë°›ì§€ ëª»í–ˆìŠµë‹ˆë‹¤: %s",
    "other": "ì�¸ìž�ê°’ë“¤ì�„ ë°›ì§€ ëª»í–ˆìŠµë‹ˆë‹¤: %s"
  },
  "Missing required argument: %s": {
    "one": "í•„ìˆ˜ ì�¸ìž�ë¥¼ ë°›ì§€ ëª»í–ˆìŠµë‹ˆë‹¤: %s",
    "other": "í•„ìˆ˜ ì�¸ìž�ë“¤ì�„ ë°›ì§€ ëª»í–ˆìŠµë‹ˆë‹¤: %s"
  },
  "Unknown argument: %s": {
    "one": "ì•Œ ìˆ˜ ì—†ëŠ” ì�¸ìž�ìž…ë‹ˆë‹¤: %s",
    "other": "ì•Œ ìˆ˜ ì—†ëŠ” ì�¸ìž�ë“¤ìž…ë‹ˆë‹¤: %s"
  },
  "Invalid values:": "ìž˜ëª»ë�œ ê°’ìž…ë‹ˆë‹¤:",
  "Argument: %s, Given: %s, Choices: %s": "ì�¸ìž�: %s, ìž…ë ¥ë°›ì�€ ê°’: %s, ì„ íƒ�ì§€: %s",
  "Argument check failed: %s": "ìœ íš¨í•˜ì§€ ì•Šì�€ ì�¸ìž�ìž…ë‹ˆë‹¤: %s",
  "Implications failed:": "ì˜µì…˜ì�˜ ì¡°í•©ì�´ ìž˜ëª»ë�˜ì—ˆìŠµë‹ˆë‹¤:",
  "Not enough arguments following: %s": "ì�¸ìž�ê°€ ì¶©ë¶„í•˜ê²Œ ì£¼ì–´ì§€ì§€ ì•Šì•˜ìŠµë‹ˆë‹¤: %s",
  "Invalid JSON config file: %s": "ìœ íš¨í•˜ì§€ ì•Šì�€ JSON ì„¤ì •íŒŒì�¼ìž…ë‹ˆë‹¤: %s",
  "Path to JSON config file": "JSON ì„¤ì •íŒŒì�¼ ê²½ë¡œ",
  "Show help": "ë�„ì›€ë§�ì�„ ë³´ì—¬ì¤�ë‹ˆë‹¤",
  "Show version number": "ë²„ì „ ë„˜ë²„ë¥¼ ë³´ì—¬ì¤�ë‹ˆë‹¤",
  "Did you mean %s?": "ì°¾ê³ ê³„ì‹ ê²Œ %sìž…ë‹ˆê¹Œ?",
  "Arguments %s and %s are mutually exclusive" : "%sì™€ %s ì�¸ìž�ëŠ” ê°™ì�´ ì‚¬ìš©ë�  ìˆ˜ ì—†ìŠµë‹ˆë‹¤",
  "Positionals:": "ìœ„ì¹˜:",
  "command": "ëª…ë ¹"
}
{
  "Commands:": "Kommandoer:",
  "Options:": "Alternativer:",
  "Examples:": "Eksempler:",
  "boolean": "boolsk",
  "count": "antall",
  "string": "streng",
  "number": "nummer",
  "array": "matrise",
  "required": "obligatorisk",
  "default:": "standard:",
  "choices:": "valg:",
  "generated-value": "generert-verdi",
  "Not enough non-option arguments: got %s, need at least %s": "Ikke nok ikke-alternativ argumenter: fikk %s, trenger minst %s",
  "Too many non-option arguments: got %s, maximum of %s": "For mange ikke-alternativ argumenter: fikk %s, maksimum %s",
  "Missing argument value: %s": {
    "one": "Mangler argument verdi: %s",
    "other": "Mangler argument verdier: %s"
  },
  "Missing required argument: %s": {
    "one": "Mangler obligatorisk argument: %s",
    "other": "Mangler obligatoriske argumenter: %s"
  },
  "Unknown argument: %s": {
    "one": "Ukjent argument: %s",
    "other": "Ukjente argumenter: %s"
  },
  "Invalid values:": "Ugyldige verdier:",
  "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gitt: %s, Valg: %s",
  "Argument check failed: %s": "Argumentsjekk mislyktes: %s",
  "Implications failed:": "Konsekvensene mislyktes:",
  "Not enough arguments following: %s": "Ikke nok fÃ¸lgende argumenter: %s",
  "Invalid JSON config file: %s": "Ugyldig JSON konfigurasjonsfil: %s",
  "Path to JSON config file": "Bane til JSON konfigurasjonsfil",
  "Show help": "Vis hjelp",
  "Show version number": "Vis versjonsnummer"
}
{
  "Commands:": "Commando's:",
  "Options:": "Opties:",
  "Examples:": "Voorbeelden:",
  "boolean": "booleaans",
  "count": "aantal",
  "string": "string",
  "number": "getal",
  "array": "lijst",
  "required": "verplicht",
  "default:": "standaard:",
  "choices:": "keuzes:",
  "aliases:": "aliassen:",
  "generated-value": "gegenereerde waarde",
  "Not enough non-option arguments: got %s, need at least %s": "Niet genoeg niet-optie-argumenten: %s gekregen, minstens %s nodig",
  "Too many non-option arguments: got %s, maximum of %s": "Te veel niet-optie-argumenten: %s gekregen, maximum is %s",
  "Missing argument value: %s": {
    "one": "Missende argumentwaarde: %s",
    "other": "Missende argumentwaarden: %s"
  },
  "Missing required argument: %s": {
    "one": "Missend verplicht argument: %s",
    "other": "Missende verplichte argumenten: %s"
  },
  "Unknown argument: %s": {
    "one": "Onbekend argument: %s",
    "other": "Onbekende argumenten: %s"
  },
  "Invalid values:": "Ongeldige waarden:",
  "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gegeven: %s, Keuzes: %s",
  "Argument check failed: %s": "Argumentcontrole mislukt: %s",
  "Implications failed:": "Ontbrekende afhankelijke argumenten:",
  "Not enough arguments following: %s": "Niet genoeg argumenten na: %s",
  "Invalid JSON config file: %s": "Ongeldig JSON-config-bestand: %s",
  "Path to JSON config file": "Pad naar JSON-config-bestand",
  "Show help": "Toon help",
  "Show version number": "Toon versienummer",
  "Did you mean %s?": "Bedoelde u misschien %s?",
  "Arguments %s and %s are mutually exclusive": "Argumenten %s en %s kunnen niet tegelijk gebruikt worden",
  "Positionals:": "Positie-afhankelijke argumenten",
  "command": "commando"
}
{
  "Commands:": "Kommandoar:",
  "Options:": "Alternativ:",
  "Examples:": "DÃ¸me:",
  "boolean": "boolsk",
  "count": "mengd",
  "string": "streng",
  "number": "nummer",
  "array": "matrise",
  "required": "obligatorisk",
  "default:": "standard:",
  "choices:": "val:",
  "generated-value": "generert-verdi",
  "Not enough non-option arguments: got %s, need at least %s":
    "Ikkje nok ikkje-alternativ argument: fekk %s, treng minst %s",
  "Too many non-option arguments: got %s, maximum of %s":
    "For mange ikkje-alternativ argument: fekk %s, maksimum %s",
  "Missing argument value: %s": {
    "one": "Manglar argumentverdi: %s",
    "other": "Manglar argumentverdiar: %s"
  },
  "Missing required argument: %s": {
    "one": "Manglar obligatorisk argument: %s",
    "other": "Manglar obligatoriske argument: %s"
  },
  "Unknown argument: %s": {
    "one": "Ukjent argument: %s",
    "other": "Ukjende argument: %s"
  },
  "Invalid values:": "Ugyldige verdiar:",
  "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gjeve: %s, Val: %s",
  "Argument check failed: %s": "Argumentsjekk mislukkast: %s",
  "Implications failed:": "Konsekvensane mislukkast:",
  "Not enough arguments following: %s": "Ikkje nok fylgjande argument: %s",
  "Invalid JSON config file: %s": "Ugyldig JSON konfigurasjonsfil: %s",
  "Path to JSON config file": "Bane til JSON konfigurasjonsfil",
  "Show help": "Vis hjelp",
  "Show version number": "Vis versjonsnummer"
}
{
  "Commands:": "Choose yer command:",
  "Options:": "Options for me hearties!",
  "Examples:": "Ex. marks the spot:",
  "required": "requi-yar-ed",
  "Missing required argument: %s": {
    "one": "Ye be havin' to set the followin' argument land lubber: %s",
    "other": "Ye be havin' to set the followin' arguments land lubber: %s"
  },
  "Show help": "Parlay this here code of conduct",
  "Show version number": "'Tis the version ye be askin' fer",
  "Arguments %s and %s are mutually exclusive" : "Yon scurvy dogs %s and %s be as bad as rum and a prudish wench"
}
{
  "Commands:": "Polecenia:",
  "Options:": "Opcje:",
  "Examples:": "PrzykÅ‚ady:",
  "boolean": "boolean",
  "count": "iloÅ›Ä‡",
  "string": "ciÄ…g znakÃ³w",
  "number": "liczba",
  "array": "tablica",
  "required": "wymagany",
  "default:": "domyÅ›lny:",
  "choices:": "dostÄ™pne:",
  "aliases:": "aliasy:",
  "generated-value": "wygenerowana-wartoÅ›Ä‡",
  "Not enough non-option arguments: got %s, need at least %s": "NiewystarczajÄ…ca iloÅ›Ä‡ argumentÃ³w: otrzymano %s, wymagane co najmniej %s",
  "Too many non-option arguments: got %s, maximum of %s": "Zbyt duÅ¼a iloÅ›Ä‡ argumentÃ³w: otrzymano %s, wymagane co najwyÅ¼ej %s",
  "Missing argument value: %s": {
    "one": "Brak wartoÅ›ci dla argumentu: %s",
    "other": "Brak wartoÅ›ci dla argumentÃ³w: %s"
  },
  "Missing required argument: %s": {
    "one": "Brak wymaganego argumentu: %s",
    "other": "Brak wymaganych argumentÃ³w: %s"
  },
  "Unknown argument: %s": {
    "one": "Nieznany argument: %s",
    "other": "Nieznane argumenty: %s"
  },
  "Invalid values:": "NieprawidÅ‚owe wartoÅ›ci:",
  "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Otrzymano: %s, DostÄ™pne: %s",
  "Argument check failed: %s": "Weryfikacja argumentÃ³w nie powiodÅ‚a siÄ™: %s",
  "Implications failed:": "ZaÅ‚oÅ¼enia nie zostaÅ‚y speÅ‚nione:",
  "Not enough arguments following: %s": "NiewystarczajÄ…ca iloÅ›Ä‡ argumentÃ³w nastÄ™pujÄ…cych po: %s",
  "Invalid JSON config file: %s": "NieprawidÅ‚owy plik konfiguracyjny JSON: %s",
  "Path to JSON config file": "ÅšcieÅ¼ka do pliku konfiguracyjnego JSON",
  "Show help": "PokaÅ¼ pomoc",
  "Show version number": "PokaÅ¼ numer wersji",
  "Did you mean %s?": "Czy chodziÅ‚o Ci o %s?",
  "Arguments %s and %s are mutually exclusive": "Argumenty %s i %s wzajemnie siÄ™ wykluczajÄ…",
  "Positionals:": "Pozycyjne:",
  "command": "polecenie"
}
{
  "Commands:": "Comandos:",
  "Options:": "OpÃ§Ãµes:",
  "Examples:": "Exemplos:",
  "boolean": "boolean",
  "count": "contagem",
  "string": "cadeia de caracteres",
  "number": "nÃºmero",
  "array": "arranjo",
  "required": "requerido",
  "default:": "padrÃ£o:",
  "choices:": "escolhas:",
  "generated-value": "valor-gerado",
  "Not enough non-option arguments: got %s, need at least %s": "Argumentos insuficientes nÃ£o opcionais: Argumento %s, necessÃ¡rio pelo menos %s",
  "Too many non-option arguments: got %s, maximum of %s": "Excesso de argumentos nÃ£o opcionais: recebido %s, mÃ¡ximo de %s",
  "Missing argument value: %s": {
    "one": "Falta valor de argumento: %s",
    "other": "Falta valores de argumento: %s"
  },
  "Missing required argument: %s": {
    "one": "Falta argumento obrigatÃ³rio: %s",
    "other": "Faltando argumentos obrigatÃ³rios: %s"
  },
  "Unknown argument: %s": {
    "one": "Argumento desconhecido: %s",
    "other": "Argumentos desconhecidos: %s"
  },
  "Invalid values:": "Valores invÃ¡lidos:",
  "Argument: %s, Given: %s, Choices: %s": "Argumento: %s, Dado: %s, Escolhas: %s",
  "Argument check failed: %s": "VerificaÃ§Ã£o de argumento falhou: %s",
  "Implications failed:": "ImplicaÃ§Ãµes falharam:",
  "Not enough arguments following: %s": "Insuficientes argumentos a seguir: %s",
  "Invalid JSON config file: %s": "Arquivo de configuraÃ§Ã£o em JSON esta invÃ¡lido: %s",
  "Path to JSON config file": "Caminho para o arquivo de configuraÃ§Ã£o em JSON",
  "Show help": "Mostra ajuda",
  "Show version number": "Mostra nÃºmero de versÃ£o",
  "Arguments %s and %s are mutually exclusive" : "Argumentos %s e %s sÃ£o mutualmente exclusivos"
}
{
  "Commands:": "Comandos:",
  "Options:": "OpÃ§Ãµes:",
  "Examples:": "Exemplos:",
  "boolean": "booleano",
  "count": "contagem",
  "string": "string",
  "number": "nÃºmero",
  "array": "array",
  "required": "obrigatÃ³rio",
  "default:": "padrÃ£o:",
  "choices:": "opÃ§Ãµes:",
  "aliases:": "sinÃ´nimos:",
  "generated-value": "valor-gerado",
  "Not enough non-option arguments: got %s, need at least %s": "Argumentos insuficientes: Argumento %s, necessÃ¡rio pelo menos %s",
  "Too many non-option arguments: got %s, maximum of %s": "Excesso de argumentos: recebido %s, mÃ¡ximo de %s",
  "Missing argument value: %s": {
    "one": "Falta valor de argumento: %s",
    "other": "Falta valores de argumento: %s"
  },
  "Missing required argument: %s": {
    "one": "Falta argumento obrigatÃ³rio: %s",
    "other": "Faltando argumentos obrigatÃ³rios: %s"
  },
  "Unknown argument: %s": {
    "one": "Argumento desconhecido: %s",
    "other": "Argumentos desconhecidos: %s"
  },
  "Invalid values:": "Valores invÃ¡lidos:",
  "Argument: %s, Given: %s, Choices: %s": "Argumento: %s, Dado: %s, OpÃ§Ãµes: %s",
  "Argument check failed: %s": "VerificaÃ§Ã£o de argumento falhou: %s",
  "Implications failed:": "ImplicaÃ§Ãµes falharam:",
  "Not enough arguments following: %s": "Argumentos insuficientes a seguir: %s",
  "Invalid JSON config file: %s": "Arquivo JSON de configuraÃ§Ã£o invÃ¡lido: %s",
  "Path to JSON config file": "Caminho para o arquivo JSON de configuraÃ§Ã£o",
  "Show help": "Exibe ajuda",
  "Show version number": "Exibe a versÃ£o",
  "Did you mean %s?": "VocÃª quis dizer %s?",
  "Arguments %s and %s are mutually exclusive" : "Argumentos %s e %s sÃ£o mutualmente exclusivos",
  "Positionals:": "Posicionais:",
  "command": "comando"
}
{
  "Commands:": "ÐšÐ¾Ð¼Ð°Ð½Ð´Ñ‹:",
  "Options:": "ÐžÐ¿Ñ†Ð¸Ð¸:",
  "Examples:": "ÐŸÑ€Ð¸Ð¼ÐµÑ€Ñ‹:",
  "boolean": "Ð±ÑƒÐ»ÐµÐ²Ñ‹Ð¹ Ñ‚Ð¸Ð¿",
  "count": "Ð¿Ð¾Ð´Ñ�Ñ‡ÐµÑ‚",
  "string": "Ñ�Ñ‚Ñ€Ð¾ÐºÐ¾Ð²Ð¾Ð¹ Ñ‚Ð¸Ð¿",
  "number": "Ñ‡Ð¸Ñ�Ð»Ð¾",
  "array": "Ð¼Ð°Ñ�Ñ�Ð¸Ð²",
  "required": "Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð¾",
  "default:": "Ð¿Ð¾ ÑƒÐ¼Ð¾Ð»Ñ‡Ð°Ð½Ð¸ÑŽ:",
  "choices:": "Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñ�Ñ‚Ð¸:",
  "aliases:": "Ð°Ð»Ð¸Ð°Ñ�Ñ‹:",
  "generated-value": "Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ðµ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ",
  "Not enough non-option arguments: got %s, need at least %s": "Ð�ÐµÐ´Ð¾Ñ�Ñ‚Ð°Ñ‚Ð¾Ñ‡Ð½Ð¾ Ð½ÐµÐ¾Ð¿Ñ†Ð¸Ð¾Ð½Ð½Ñ‹Ñ… Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð²: ÐµÑ�Ñ‚ÑŒ %s, Ð½ÑƒÐ¶Ð½Ð¾ ÐºÐ°Ðº Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼ %s",
  "Too many non-option arguments: got %s, maximum of %s": "Ð¡Ð»Ð¸ÑˆÐºÐ¾Ð¼ Ð¼Ð½Ð¾Ð³Ð¾ Ð½ÐµÐ¾Ð¿Ñ†Ð¸Ð¾Ð½Ð½Ñ‹Ñ… Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð²: ÐµÑ�Ñ‚ÑŒ %s, Ð¼Ð°ÐºÑ�Ð¸Ð¼ÑƒÐ¼ Ð´Ð¾Ð¿ÑƒÑ�Ñ‚Ð¸Ð¼Ð¾ %s",
  "Missing argument value: %s": {
    "one": "Ð�Ðµ Ñ…Ð²Ð°Ñ‚Ð°ÐµÑ‚ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ� Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°: %s",
    "other": "Ð�Ðµ Ñ…Ð²Ð°Ñ‚Ð°ÐµÑ‚ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð²: %s"
  },
  "Missing required argument: %s": {
    "one": "Ð�Ðµ Ñ…Ð²Ð°Ñ‚Ð°ÐµÑ‚ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð¾Ð³Ð¾ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°: %s",
    "other": "Ð�Ðµ Ñ…Ð²Ð°Ñ‚Ð°ÐµÑ‚ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ñ‹Ñ… Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð²: %s"
  },
  "Unknown argument: %s": {
    "one": "Ð�ÐµÐ¸Ð·Ð²ÐµÑ�Ñ‚Ð½Ñ‹Ð¹ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚: %s",
    "other": "Ð�ÐµÐ¸Ð·Ð²ÐµÑ�Ñ‚Ð½Ñ‹Ðµ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñ‹: %s"
  },
  "Invalid values:": "Ð�ÐµÐ´ÐµÐ¹Ñ�Ñ‚Ð²Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ðµ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ�:",
  "Argument: %s, Given: %s, Choices: %s": "Ð�Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚: %s, Ð”Ð°Ð½Ð½Ð¾Ðµ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ: %s, Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñ�Ñ‚Ð¸: %s",
  "Argument check failed: %s": "ÐŸÑ€Ð¾Ð²ÐµÑ€ÐºÐ° Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð² Ð½Ðµ ÑƒÐ´Ð°Ð»Ð°Ñ�ÑŒ: %s",
  "Implications failed:": "Ð”Ð°Ð½Ð½Ñ‹Ð¹ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ Ñ�Ð»ÐµÐ´ÑƒÑŽÑ‰Ð¸Ð¹ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¹ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚:",
  "Not enough arguments following: %s": "Ð�ÐµÐ´Ð¾Ñ�Ñ‚Ð°Ñ‚Ð¾Ñ‡Ð½Ð¾ Ñ�Ð»ÐµÐ´ÑƒÑŽÑ‰Ð¸Ñ… Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð²: %s",
  "Invalid JSON config file: %s": "Ð�ÐµÐ´ÐµÐ¹Ñ�Ñ‚Ð²Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¹ Ñ„Ð°Ð¹Ð» ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ JSON: %s",
  "Path to JSON config file": "ÐŸÑƒÑ‚ÑŒ Ðº Ñ„Ð°Ð¹Ð»Ñƒ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ JSON",
  "Show help": "ÐŸÐ¾ÐºÐ°Ð·Ð°Ñ‚ÑŒ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒ",
  "Show version number": "ÐŸÐ¾ÐºÐ°Ð·Ð°Ñ‚ÑŒ Ð½Ð¾Ð¼ÐµÑ€ Ð²ÐµÑ€Ñ�Ð¸Ð¸",
  "Did you mean %s?": "Ð’Ñ‹ Ð¸Ð¼ÐµÐ»Ð¸ Ð² Ð²Ð¸Ð´Ñƒ %s?"
}
{
  "Commands:": "à¸„à¸­à¸¡à¸¡à¸²à¸™",
  "Options:": "à¸­à¸­à¸Ÿà¸Šà¸±à¹ˆà¸™",
  "Examples:": "à¸•à¸±à¸§à¸­à¸¢à¹ˆà¸²à¸‡",
  "boolean": "à¸šà¸¹à¸¥à¸µà¸™",
  "count": "à¸™à¸±à¸š",
  "string": "à¸ªà¸•à¸£à¸´à¸‡",
  "number": "à¸•à¸±à¸§à¹€à¸¥à¸‚",
  "array": "à¸­à¸²à¹€à¸£à¸¢à¹Œ",
  "required": "à¸ˆà¸³à¹€à¸›à¹‡à¸™",
  "default:": "à¸„à¹ˆà¸²à¹€à¸£à¸´à¹ˆà¸¡à¸•à¹‰à¸™",
  "choices:": "à¸•à¸±à¸§à¹€à¸¥à¸·à¸­à¸�",
  "aliases:": "à¹€à¸­à¹€à¸¥à¸µà¸¢à¸ª",
  "generated-value": "à¸„à¹ˆà¸²à¸—à¸µà¹ˆà¸–à¸¹à¸�à¸ªà¸£à¹‰à¸²à¸‡à¸‚à¸¶à¹‰à¸™",
  "Not enough non-option arguments: got %s, need at least %s": "à¹ƒà¸ªà¹ˆà¸­à¸²à¸£à¹Œà¸�à¸´à¸§à¹€à¸¡à¸™à¸•à¹Œà¹„à¸¡à¹ˆà¸„à¸£à¸šà¸•à¸²à¸¡à¸ˆà¸³à¸™à¸§à¸™à¸—à¸µà¹ˆà¸�à¸³à¸«à¸™à¸”: à¹ƒà¸ªà¹ˆà¸„à¹ˆà¸²à¸¡à¸²à¸ˆà¸³à¸™à¸§à¸™ %s à¸„à¹ˆà¸², à¹�à¸•à¹ˆà¸•à¹‰à¸­à¸‡à¸�à¸²à¸£à¸­à¸¢à¹ˆà¸²à¸‡à¸™à¹‰à¸­à¸¢ %s à¸„à¹ˆà¸²",
  "Too many non-option arguments: got %s, maximum of %s": "à¹ƒà¸ªà¹ˆà¸­à¸²à¸£à¹Œà¸�à¸´à¸§à¹€à¸¡à¸™à¸•à¹Œà¹€à¸�à¸´à¸™à¸ˆà¸³à¸™à¸§à¸™à¸—à¸µà¹ˆà¸�à¸³à¸«à¸™à¸”: à¹ƒà¸ªà¹ˆà¸„à¹ˆà¸²à¸¡à¸²à¸ˆà¸³à¸™à¸§à¸™ %s à¸„à¹ˆà¸², à¹�à¸•à¹ˆà¸•à¹‰à¸­à¸‡à¸�à¸²à¸£à¸¡à¸²à¸�à¸—à¸µà¹ˆà¸ªà¸¸à¸” %s à¸„à¹ˆà¸²",
  "Missing argument value: %s": {
    "one": "à¸„à¹ˆà¸²à¸­à¸²à¸£à¹Œà¸�à¸´à¸§à¹€à¸¡à¸™à¸•à¹Œà¸—à¸µà¹ˆà¸‚à¸²à¸”à¹„à¸›: %s",
    "other": "à¸„à¹ˆà¸²à¸­à¸²à¸£à¹Œà¸�à¸´à¸§à¹€à¸¡à¸™à¸•à¹Œà¸—à¸µà¹ˆà¸‚à¸²à¸”à¹„à¸›: %s"
  },
  "Missing required argument: %s": {
    "one": "à¸­à¸²à¸£à¹Œà¸�à¸´à¸§à¹€à¸¡à¸™à¸•à¹Œà¸ˆà¸³à¹€à¸›à¹‡à¸™à¸—à¸µà¹ˆà¸‚à¸²à¸”à¹„à¸›: %s",
    "other": "à¸­à¸²à¸£à¹Œà¸�à¸´à¸§à¹€à¸¡à¸™à¸•à¹Œà¸ˆà¸³à¹€à¸›à¹‡à¸™à¸—à¸µà¹ˆà¸‚à¸²à¸”à¹„à¸›: %s"
  },
  "Unknown argument: %s": {
    "one": "à¸­à¸²à¸£à¹Œà¸�à¸´à¸§à¹€à¸¡à¸™à¸•à¹Œà¸—à¸µà¹ˆà¹„à¸¡à¹ˆà¸£à¸¹à¹‰à¸ˆà¸±à¸�: %s",
    "other": "à¸­à¸²à¸£à¹Œà¸�à¸´à¸§à¹€à¸¡à¸™à¸•à¹Œà¸—à¸µà¹ˆà¹„à¸¡à¹ˆà¸£à¸¹à¹‰à¸ˆà¸±à¸�: %s"
  },
  "Invalid values:": "à¸„à¹ˆà¸²à¹„à¸¡à¹ˆà¸–à¸¹à¸�à¸•à¹‰à¸­à¸‡:",
  "Argument: %s, Given: %s, Choices: %s": "à¸­à¸²à¸£à¹Œà¸�à¸´à¸§à¹€à¸¡à¸™à¸•à¹Œ: %s, à¹„à¸”à¹‰à¸£à¸±à¸š: %s, à¸•à¸±à¸§à¹€à¸¥à¸·à¸­à¸�: %s",
  "Argument check failed: %s": "à¸•à¸£à¸§à¸ˆà¸ªà¸­à¸šà¸žà¸šà¸­à¸²à¸£à¹Œà¸�à¸´à¸§à¹€à¸¡à¸™à¸•à¹Œà¸—à¸µà¹ˆà¹„à¸¡à¹ˆà¸–à¸¹à¸�à¸•à¹‰à¸­à¸‡: %s",
  "Implications failed:": "Implications à¹„à¸¡à¹ˆà¸ªà¸³à¹€à¸£à¹‡à¸ˆ:",
  "Not enough arguments following: %s": "à¹ƒà¸ªà¹ˆà¸­à¸²à¸£à¹Œà¸�à¸´à¸§à¹€à¸¡à¸™à¸•à¹Œà¹„à¸¡à¹ˆà¸„à¸£à¸š: %s",
  "Invalid JSON config file: %s": "à¹„à¸Ÿà¸¥à¹Œà¸„à¸­à¸™à¸Ÿà¸´à¸„ JSON à¹„à¸¡à¹ˆà¸–à¸¹à¸�à¸•à¹‰à¸­à¸‡: %s",
  "Path to JSON config file": "à¸žà¸²à¸—à¹„à¸Ÿà¸¥à¹Œà¸„à¸­à¸™à¸Ÿà¸´à¸„ JSON",
  "Show help": "à¸‚à¸­à¸„à¸§à¸²à¸¡à¸Šà¹ˆà¸§à¸¢à¹€à¸«à¸¥à¸·à¸­",
  "Show version number": "à¹�à¸ªà¸”à¸‡à¸•à¸±à¸§à¹€à¸¥à¸‚à¹€à¸§à¸­à¸£à¹Œà¸Šà¸±à¹ˆà¸™",
  "Did you mean %s?": "à¸„à¸¸à¸“à¸«à¸¡à¸²à¸¢à¸–à¸¶à¸‡ %s?"
}
{
  "Commands:": "Komutlar:",
  "Options:": "SeÃ§enekler:",
  "Examples:": "Ã–rnekler:",
  "boolean": "boolean",
  "count": "sayÄ±",
  "string": "string",
  "number": "numara",
  "array": "array",
  "required": "zorunlu",
  "default:": "varsayÄ±lan:",
  "choices:": "seÃ§imler:",
  "aliases:": "takma adlar:",
  "generated-value": "oluÅŸturulan-deÄŸer",
  "Not enough non-option arguments: got %s, need at least %s": "SeÃ§enek dÄ±ÅŸÄ± argÃ¼manlar yetersiz: %s bulundu, %s gerekli",
  "Too many non-option arguments: got %s, maximum of %s": "SeÃ§enek dÄ±ÅŸÄ± argÃ¼manlar gereÄŸinden fazla: %s bulundu, azami %s",
  "Missing argument value: %s": {
    "one": "Eksik argÃ¼man deÄŸeri: %s",
    "other": "Eksik argÃ¼man deÄŸerleri: %s"
  },
  "Missing required argument: %s": {
    "one": "Eksik zorunlu argÃ¼man: %s",
    "other": "Eksik zorunlu argÃ¼manlar: %s"
  },
  "Unknown argument: %s": {
    "one": "Bilinmeyen argÃ¼man: %s",
    "other": "Bilinmeyen argÃ¼manlar: %s"
  },
  "Invalid values:": "GeÃ§ersiz deÄŸerler:",
  "Argument: %s, Given: %s, Choices: %s": "ArgÃ¼man: %s, Verilen: %s, SeÃ§imler: %s",
  "Argument check failed: %s": "ArgÃ¼man kontrolÃ¼ baÅŸarÄ±sÄ±z oldu: %s",
  "Implications failed:": "SonuÃ§lar baÅŸarÄ±sÄ±z oldu:",
  "Not enough arguments following: %s": "%s iÃ§in yeterli argÃ¼man bulunamadÄ±",
  "Invalid JSON config file: %s": "GeÃ§ersiz JSON yapÄ±landÄ±rma dosyasÄ±: %s",
  "Path to JSON config file": "JSON yapÄ±landÄ±rma dosya konumu",
  "Show help": "YardÄ±m detaylarÄ±nÄ± gÃ¶ster",
  "Show version number": "Versiyon detaylarÄ±nÄ± gÃ¶ster",
  "Did you mean %s?": "Bunu mu demek istediniz: %s?",
  "Positionals:": "SÄ±ralÄ±lar:",
  "command": "komut"
}
{
  "Commands:": "å‘½ä»¤ï¼š",
  "Options:": "é€‰é¡¹ï¼š",
  "Examples:": "ç¤ºä¾‹ï¼š",
  "boolean": "å¸ƒå°”",
  "count": "è®¡æ•°",
  "string": "å­—ç¬¦ä¸²",
  "number": "æ•°å­—",
  "array": "æ•°ç»„",
  "required": "å¿…éœ€",
  "default:": "é»˜è®¤å€¼:",
  "choices:": "å�¯é€‰å€¼:",
  "generated-value": "ç”Ÿæˆ�çš„å€¼",
  "Not enough non-option arguments: got %s, need at least %s": "ç¼ºå°‘ non-option å�‚æ•°ï¼šä¼ å…¥äº† %s ä¸ª, è‡³å°‘éœ€è¦� %s ä¸ª",
  "Too many non-option arguments: got %s, maximum of %s": "non-option å�‚æ•°è¿‡å¤šï¼šä¼ å…¥äº† %s ä¸ª, æœ€å¤§å…�è®¸ %s ä¸ª",
  "Missing argument value: %s": {
    "one": "æ²¡æœ‰ç»™æ­¤é€‰é¡¹æŒ‡å®šå€¼ï¼š%s",
    "other": "æ²¡æœ‰ç»™è¿™äº›é€‰é¡¹æŒ‡å®šå€¼ï¼š%s"
  },
  "Missing required argument: %s": {
    "one": "ç¼ºå°‘å¿…é¡»çš„é€‰é¡¹ï¼š%s",
    "other": "ç¼ºå°‘è¿™äº›å¿…é¡»çš„é€‰é¡¹ï¼š%s"
  },
  "Unknown argument: %s": {
    "one": "æ— æ³•è¯†åˆ«çš„é€‰é¡¹ï¼š%s",
    "other": "æ— æ³•è¯†åˆ«è¿™äº›é€‰é¡¹ï¼š%s"
  },
  "Invalid values:": "æ— æ•ˆçš„é€‰é¡¹å€¼ï¼š",
  "Argument: %s, Given: %s, Choices: %s": "é€‰é¡¹å��ç§°: %s, ä¼ å…¥çš„å€¼: %s, å�¯é€‰çš„å€¼ï¼š%s",
  "Argument check failed: %s": "é€‰é¡¹å€¼éªŒè¯�å¤±è´¥ï¼š%s",
  "Implications failed:": "ç¼ºå°‘ä¾�èµ–çš„é€‰é¡¹ï¼š",
  "Not enough arguments following: %s": "æ²¡æœ‰æ��ä¾›è¶³å¤Ÿçš„å€¼ç»™æ­¤é€‰é¡¹ï¼š%s",
  "Invalid JSON config file: %s": "æ— æ•ˆçš„ JSON é…�ç½®æ–‡ä»¶ï¼š%s",
  "Path to JSON config file": "JSON é…�ç½®æ–‡ä»¶çš„è·¯å¾„",
  "Show help": "æ˜¾ç¤ºå¸®åŠ©ä¿¡æ�¯",
  "Show version number": "æ˜¾ç¤ºç‰ˆæœ¬å�·",
  "Did you mean %s?": "æ˜¯æŒ‡ %s?",
  "Arguments %s and %s are mutually exclusive" : "é€‰é¡¹ %s å’Œ %s æ˜¯äº’æ–¥çš„",
  "Positionals:": "ä½�ç½®ï¼š",
  "command": "å‘½ä»¤"
}
{
  "Commands:": "å‘½ä»¤ï¼š",
  "Options:": "é�¸é …ï¼š",
  "Examples:": "ä¾‹ï¼š",
  "boolean": "å¸ƒæž—",
  "count": "æ¬¡æ•¸",
  "string": "å­—ä¸²",
  "number": "æ•¸å­—",
  "array": "é™£åˆ—",
  "required": "å¿…é ˆ",
  "default:": "é �è¨­å€¼:",
  "choices:": "å�¯é�¸å€¼:",
  "aliases:": "åˆ¥å��:",
  "generated-value": "ç”Ÿæˆ�çš„å€¼",
  "Not enough non-option arguments: got %s, need at least %s": "non-option å¼•æ•¸ä¸�è¶³ï¼šå�ªå‚³å…¥äº† %s å€‹, è‡³å°‘è¦� %s å€‹",
  "Too many non-option arguments: got %s, maximum of %s": "non-option å¼•æ•¸é�Žå¤šï¼šå‚³å…¥äº† %s å€‹, ä½†æœ€å¤š %s å€‹",
  "Missing argument value: %s": {
    "one": "æ­¤å¼•æ•¸ç„¡æŒ‡å®šå€¼ï¼š%s",
    "other": "é€™äº›å¼•æ•¸ç„¡æŒ‡å®šå€¼ï¼š%s"
  },
  "Missing required argument: %s": {
    "one": "ç¼ºå°‘å¿…é ˆçš„å¼•æ•¸ï¼š%s",
    "other": "ç¼ºå°‘é€™äº›å¿…é ˆçš„å¼•æ•¸ï¼š%s"
  },
  "Unknown argument: %s": {
    "one": "æœªçŸ¥çš„å¼•æ•¸ï¼š%s",
    "other": "æœªçŸ¥çš„é€™äº›å¼•æ•¸ï¼š%s"
  },
  "Invalid values:": "ç„¡æ•ˆçš„é�¸é …å€¼ï¼š",
  "Argument: %s, Given: %s, Choices: %s": "å¼•æ•¸å��ç¨±: %s, å‚³å…¥çš„å€¼: %s, å�¯é�¸çš„å€¼ï¼š%s",
  "Argument check failed: %s": "å¼•æ•¸é©—è­‰å¤±æ•—ï¼š%s",
  "Implications failed:": "ç¼ºå°‘ä¾�è³´çš„é�¸é …ï¼š",
  "Not enough arguments following: %s": "æ²’æœ‰æ��ä¾›è¶³å¤ çš„å€¼çµ¦æ­¤å¼•æ•¸ï¼š%s",
  "Invalid JSON config file: %s": "ç„¡æ•ˆçš„ JSON è¨­ç½®æ–‡ä»¶ï¼š%s",
  "Path to JSON config file": "JSON è¨­ç½®æ–‡ä»¶çš„è·¯å¾‘",
  "Show help": "é¡¯ç¤ºèªªæ˜Ž",
  "Show version number": "é¡¯ç¤ºç‰ˆæœ¬",
  "Did you mean %s?": "æ˜¯æŒ‡ %s?",
  "Arguments %s and %s are mutually exclusive" : "å¼•æ•¸ %s å’Œ %s æ˜¯äº’æ–¥çš„"
}

'use strict'
const fs = require('fs')
const path = require('path')
const YError = require('./yerror')

let previouslyVisitedConfigs = []

function checkForCircularExtends (cfgPath) {
  if (previouslyVisitedConfigs.indexOf(cfgPath) > -1) {
    throw new YError(`Circular extended configurations: '${cfgPath}'.`)
  }
}

function getPathToDefaultConfig (cwd, pathToExtend) {
  return path.resolve(cwd, pathToExtend)
}

function applyExtends (config, cwd) {
  let defaultConfig = {}

  if (config.hasOwnProperty('extends')) {
    if (typeof config.extends !== 'string') return defaultConfig
    const isPath = /\.json|\..*rc$/.test(config.extends)
    let pathToDefault = null
    if (!isPath) {
      try {
        pathToDefault = require.resolve(config.extends)
      } catch (err) {
        // most likely this simply isn't a module.
      }
    } else {
      pathToDefault = getPathToDefaultConfig(cwd, config.extends)
    }
    // maybe the module uses key for some other reason,
    // err on side of caution.
    if (!pathToDefault && !isPath) return config

    checkForCircularExtends(pathToDefault)

    previouslyVisitedConfigs.push(pathToDefault)

    defaultConfig = isPath ? JSON.parse(fs.readFileSync(pathToDefault, 'utf8')) : require(config.extends)
    delete config.extends
    defaultConfig = applyExtends(defaultConfig, path.dirname(pathToDefault))
  }

  previouslyVisitedConfigs = []

  return Object.assign({}, defaultConfig, config)
}

module.exports = applyExtends
'use strict'

// hoisted due to circular dependency on command.
module.exports = argsert
const command = require('./command')()
const YError = require('./yerror')

const positionName = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']
function argsert (expected, callerArguments, length) {
  // TODO: should this eventually raise an exception.
  try {
    // preface the argument description with "cmd", so
    // that we can run it through yargs' command parser.
    let position = 0
    let parsed = { demanded: [], optional: [] }
    if (typeof expected === 'object') {
      length = callerArguments
      callerArguments = expected
    } else {
      parsed = command.parseCommand(`cmd ${expected}`)
    }
    const args = [].slice.call(callerArguments)

    while (args.length && args[args.length - 1] === undefined) args.pop()
    length = length || args.length

    if (length < parsed.demanded.length) {
      throw new YError(`Not enough arguments provided. Expected ${parsed.demanded.length} but received ${args.length}.`)
    }

    const totalCommands = parsed.demanded.length + parsed.optional.length
    if (length > totalCommands) {
      throw new YError(`Too many arguments provided. Expected max ${totalCommands} but received ${length}.`)
    }

    parsed.demanded.forEach((demanded) => {
      const arg = args.shift()
      const observedType = guessType(arg)
      const matchingTypes = demanded.cmd.filter(type => type === observedType || type === '*')
      if (matchingTypes.length === 0) argumentTypeError(observedType, demanded.cmd, position, false)
      position += 1
    })

    parsed.optional.forEach((optional) => {
      if (args.length === 0) return
      const arg = args.shift()
      const observedType = guessType(arg)
      const matchingTypes = optional.cmd.filter(type => type === observedType || type === '*')
      if (matchingTypes.length === 0) argumentTypeError(observedType, optional.cmd, position, true)
      position += 1
    })
  } catch (err) {
    console.warn(err.stack)
  }
}

function guessType (arg) {
  if (Array.isArray(arg)) {
    return 'array'
  } else if (arg === null) {
    return 'null'
  }
  return typeof arg
}

function argumentTypeError (observedType, allowedTypes, position, optional) {
  throw new YError(`Invalid ${positionName[position] || 'manyith'} argument. Expected ${allowedTypes.join(' or ')} but received ${observedType}.`)
}
'use strict'

const inspect = require('util').inspect
const isPromise = require('./is-promise')
const { applyMiddleware, commandMiddlewareFactory } = require('./middleware')
const path = require('path')
const Parser = require('yargs-parser')

const DEFAULT_MARKER = /(^\*)|(^\$0)/

// handles parsing positional arguments,
// and populating argv with said positional
// arguments.
module.exports = function command (yargs, usage, validation, globalMiddleware) {
  const self = {}
  let handlers = {}
  let aliasMap = {}
  let defaultCommand
  globalMiddleware = globalMiddleware || []

  self.addHandler = function addHandler (cmd, description, builder, handler, commandMiddleware) {
    let aliases = []
    const middlewares = commandMiddlewareFactory(commandMiddleware)
    handler = handler || (() => {})

    if (Array.isArray(cmd)) {
      aliases = cmd.slice(1)
      cmd = cmd[0]
    } else if (typeof cmd === 'object') {
      let command = (Array.isArray(cmd.command) || typeof cmd.command === 'string') ? cmd.command : moduleName(cmd)
      if (cmd.aliases) command = [].concat(command).concat(cmd.aliases)
      self.addHandler(command, extractDesc(cmd), cmd.builder, cmd.handler, cmd.middlewares)
      return
    }

    // allow a module to be provided instead of separate builder and handler
    if (typeof builder === 'object' && builder.builder && typeof builder.handler === 'function') {
      self.addHandler([cmd].concat(aliases), description, builder.builder, builder.handler, builder.middlewares)
      return
    }

    // parse positionals out of cmd string
    const parsedCommand = self.parseCommand(cmd)

    // remove positional args from aliases only
    aliases = aliases.map(alias => self.parseCommand(alias).cmd)

    // check for default and filter out '*''
    let isDefault = false
    const parsedAliases = [parsedCommand.cmd].concat(aliases).filter((c) => {
      if (DEFAULT_MARKER.test(c)) {
        isDefault = true
        return false
      }
      return true
    })

    // standardize on $0 for default command.
    if (parsedAliases.length === 0 && isDefault) parsedAliases.push('$0')

    // shift cmd and aliases after filtering out '*'
    if (isDefault) {
      parsedCommand.cmd = parsedAliases[0]
      aliases = parsedAliases.slice(1)
      cmd = cmd.replace(DEFAULT_MARKER, parsedCommand.cmd)
    }

    // populate aliasMap
    aliases.forEach((alias) => {
      aliasMap[alias] = parsedCommand.cmd
    })

    if (description !== false) {
      usage.command(cmd, description, isDefault, aliases)
    }

    handlers[parsedCommand.cmd] = {
      original: cmd,
      description: description,
      handler,
      builder: builder || {},
      middlewares: middlewares || [],
      demanded: parsedCommand.demanded,
      optional: parsedCommand.optional
    }

    if (isDefault) defaultCommand = handlers[parsedCommand.cmd]
  }

  self.addDirectory = function addDirectory (dir, context, req, callerFile, opts) {
    opts = opts || {}
    // disable recursion to support nested directories of subcommands
    if (typeof opts.recurse !== 'boolean') opts.recurse = false
    // exclude 'json', 'coffee' from require-directory defaults
    if (!Array.isArray(opts.extensions)) opts.extensions = ['js']
    // allow consumer to define their own visitor function
    const parentVisit = typeof opts.visit === 'function' ? opts.visit : o => o
    // call addHandler via visitor function
    opts.visit = function visit (obj, joined, filename) {
      const visited = parentVisit(obj, joined, filename)
      // allow consumer to skip modules with their own visitor
      if (visited) {
        // check for cyclic reference
        // each command file path should only be seen once per execution
        if (~context.files.indexOf(joined)) return visited
        // keep track of visited files in context.files
        context.files.push(joined)
        self.addHandler(visited)
      }
      return visited
    }
    require('require-directory')({ require: req, filename: callerFile }, dir, opts)
  }

  // lookup module object from require()d command and derive name
  // if module was not require()d and no name given, throw error
  function moduleName (obj) {
    const mod = require('which-module')(obj)
    if (!mod) throw new Error(`No command name given for module: ${inspect(obj)}`)
    return commandFromFilename(mod.filename)
  }

  // derive command name from filename
  function commandFromFilename (filename) {
    return path.basename(filename, path.extname(filename))
  }

  function extractDesc (obj) {
    for (let keys = ['describe', 'description', 'desc'], i = 0, l = keys.length, test; i < l; i++) {
      test = obj[keys[i]]
      if (typeof test === 'string' || typeof test === 'boolean') return test
    }
    return false
  }

  self.parseCommand = function parseCommand (cmd) {
    const extraSpacesStrippedCommand = cmd.replace(/\s{2,}/g, ' ')
    const splitCommand = extraSpacesStrippedCommand.split(/\s+(?![^[]*]|[^<]*>)/)
    const bregex = /\.*[\][<>]/g
    const parsedCommand = {
      cmd: (splitCommand.shift()).replace(bregex, ''),
      demanded: [],
      optional: []
    }
    splitCommand.forEach((cmd, i) => {
      let variadic = false
      cmd = cmd.replace(/\s/g, '')
      if (/\.+[\]>]/.test(cmd) && i === splitCommand.length - 1) variadic = true
      if (/^\[/.test(cmd)) {
        parsedCommand.optional.push({
          cmd: cmd.replace(bregex, '').split('|'),
          variadic
        })
      } else {
        parsedCommand.demanded.push({
          cmd: cmd.replace(bregex, '').split('|'),
          variadic
        })
      }
    })
    return parsedCommand
  }

  self.getCommands = () => Object.keys(handlers).concat(Object.keys(aliasMap))

  self.getCommandHandlers = () => handlers

  self.hasDefaultCommand = () => !!defaultCommand

  self.runCommand = function runCommand (command, yargs, parsed, commandIndex) {
    let aliases = parsed.aliases
    const commandHandler = handlers[command] || handlers[aliasMap[command]] || defaultCommand
    const currentContext = yargs.getContext()
    let numFiles = currentContext.files.length
    const parentCommands = currentContext.commands.slice()

    // what does yargs look like after the buidler is run?
    let innerArgv = parsed.argv
    let innerYargs = null
    let positionalMap = {}
    if (command) {
      currentContext.commands.push(command)
      currentContext.fullCommands.push(commandHandler.original)
    }
    if (typeof commandHandler.builder === 'function') {
      // a function can be provided, which builds
      // up a yargs chain and possibly returns it.
      innerYargs = commandHandler.builder(yargs.reset(parsed.aliases))
      // if the builder function did not yet parse argv with reset yargs
      // and did not explicitly set a usage() string, then apply the
      // original command string as usage() for consistent behavior with
      // options object below.
      if (yargs.parsed === false) {
        if (shouldUpdateUsage(yargs)) {
          yargs.getUsageInstance().usage(
            usageFromParentCommandsCommandHandler(parentCommands, commandHandler),
            commandHandler.description
          )
        }
        innerArgv = innerYargs ? innerYargs._parseArgs(null, null, true, commandIndex) : yargs._parseArgs(null, null, true, commandIndex)
      } else {
        innerArgv = yargs.parsed.argv
      }

      if (innerYargs && yargs.parsed === false) aliases = innerYargs.parsed.aliases
      else aliases = yargs.parsed.aliases
    } else if (typeof commandHandler.builder === 'object') {
      // as a short hand, an object can instead be provided, specifying
      // the options that a command takes.
      innerYargs = yargs.reset(parsed.aliases)
      if (shouldUpdateUsage(innerYargs)) {
        innerYargs.getUsageInstance().usage(
          usageFromParentCommandsCommandHandler(parentCommands, commandHandler),
          commandHandler.description
        )
      }
      Object.keys(commandHandler.builder).forEach((key) => {
        innerYargs.option(key, commandHandler.builder[key])
      })
      innerArgv = innerYargs._parseArgs(null, null, true, commandIndex)
      aliases = innerYargs.parsed.aliases
    }

    if (!yargs._hasOutput()) {
      positionalMap = populatePositionals(commandHandler, innerArgv, currentContext, yargs)
    }

    const middlewares = globalMiddleware.slice(0).concat(commandHandler.middlewares || [])
    applyMiddleware(innerArgv, yargs, middlewares, true)

    // we apply validation post-hoc, so that custom
    // checks get passed populated positional arguments.
    if (!yargs._hasOutput()) yargs._runValidation(innerArgv, aliases, positionalMap, yargs.parsed.error)

    if (commandHandler.handler && !yargs._hasOutput()) {
      yargs._setHasOutput()

      innerArgv = applyMiddleware(innerArgv, yargs, middlewares, false)

      const handlerResult = isPromise(innerArgv)
        ? innerArgv.then(argv => commandHandler.handler(argv))
        : commandHandler.handler(innerArgv)

      if (isPromise(handlerResult)) {
        handlerResult.catch(error =>
          yargs.getUsageInstance().fail(null, error)
        )
      }
    }

    if (command) {
      currentContext.commands.pop()
      currentContext.fullCommands.pop()
    }
    numFiles = currentContext.files.length - numFiles
    if (numFiles > 0) currentContext.files.splice(numFiles * -1, numFiles)

    return innerArgv
  }

  function shouldUpdateUsage (yargs) {
    return !yargs.getUsageInstance().getUsageDisabled() &&
      yargs.getUsageInstance().getUsage().length === 0
  }

  function usageFromParentCommandsCommandHandler (parentCommands, commandHandler) {
    const c = DEFAULT_MARKER.test(commandHandler.original) ? commandHandler.original.replace(DEFAULT_MARKER, '').trim() : commandHandler.original
    const pc = parentCommands.filter((c) => { return !DEFAULT_MARKER.test(c) })
    pc.push(c)
    return `$0 ${pc.join(' ')}`
  }

  self.runDefaultBuilderOn = function (yargs) {
    if (shouldUpdateUsage(yargs)) {
      // build the root-level command string from the default string.
      const commandString = DEFAULT_MARKER.test(defaultCommand.original)
        ? defaultCommand.original : defaultCommand.original.replace(/^[^[\]<>]*/, '$0 ')
      yargs.getUsageInstance().usage(
        commandString,
        defaultCommand.description
      )
    }
    const builder = defaultCommand.builder
    if (typeof builder === 'function') {
      builder(yargs)
    } else {
      Object.keys(builder).forEach((key) => {
        yargs.option(key, builder[key])
      })
    }
  }

  // transcribe all positional arguments "command <foo> <bar> [apple]"
  // onto argv.
  function populatePositionals (commandHandler, argv, context, yargs) {
    argv._ = argv._.slice(context.commands.length) // nuke the current commands
    const demanded = commandHandler.demanded.slice(0)
    const optional = commandHandler.optional.slice(0)
    const positionalMap = {}

    validation.positionalCount(demanded.length, argv._.length)

    while (demanded.length) {
      const demand = demanded.shift()
      populatePositional(demand, argv, positionalMap)
    }

    while (optional.length) {
      const maybe = optional.shift()
      populatePositional(maybe, argv, positionalMap)
    }

    argv._ = context.commands.concat(argv._)

    postProcessPositionals(argv, positionalMap, self.cmdToParseOptions(commandHandler.original))

    return positionalMap
  }

  function populatePositional (positional, argv, positionalMap, parseOptions) {
    const cmd = positional.cmd[0]
    if (positional.variadic) {
      positionalMap[cmd] = argv._.splice(0).map(String)
    } else {
      if (argv._.length) positionalMap[cmd] = [String(argv._.shift())]
    }
  }

  // we run yargs-parser against the positional arguments
  // applying the same parsing logic used for flags.
  function postProcessPositionals (argv, positionalMap, parseOptions) {
    // combine the parsing hints we've inferred from the command
    // string with explicitly configured parsing hints.
    const options = Object.assign({}, yargs.getOptions())
    options.default = Object.assign(parseOptions.default, options.default)
    options.alias = Object.assign(parseOptions.alias, options.alias)
    options.array = options.array.concat(parseOptions.array)
    delete options.config //  don't load config when processing positionals.

    const unparsed = []
    Object.keys(positionalMap).forEach((key) => {
      positionalMap[key].map((value) => {
        unparsed.push(`--${key}`)
        unparsed.push(value)
      })
    })

    // short-circuit parse.
    if (!unparsed.length) return

    const parsed = Parser.detailed(unparsed, options)

    if (parsed.error) {
      yargs.getUsageInstance().fail(parsed.error.message, parsed.error)
    } else {
      // only copy over positional keys (don't overwrite
      // flag arguments that were already parsed).
      const positionalKeys = Object.keys(positionalMap)
      Object.keys(positionalMap).forEach((key) => {
        [].push.apply(positionalKeys, parsed.aliases[key])
      })

      Object.keys(parsed.argv).forEach((key) => {
        if (positionalKeys.indexOf(key) !== -1) {
          // any new aliases need to be placed in positionalMap, which
          // is used for validation.
          if (!positionalMap[key]) positionalMap[key] = parsed.argv[key]
          argv[key] = parsed.argv[key]
        }
      })
    }
  }

  self.cmdToParseOptions = function (cmdString) {
    const parseOptions = {
      array: [],
      default: {},
      alias: {},
      demand: {}
    }

    const parsed = self.parseCommand(cmdString)
    parsed.demanded.forEach((d) => {
      const cmds = d.cmd.slice(0)
      const cmd = cmds.shift()
      if (d.variadic) {
        parseOptions.array.push(cmd)
        parseOptions.default[cmd] = []
      }
      cmds.forEach((c) => {
        parseOptions.alias[cmd] = c
      })
      parseOptions.demand[cmd] = true
    })

    parsed.optional.forEach((o) => {
      const cmds = o.cmd.slice(0)
      const cmd = cmds.shift()
      if (o.variadic) {
        parseOptions.array.push(cmd)
        parseOptions.default[cmd] = []
      }
      cmds.forEach((c) => {
        parseOptions.alias[cmd] = c
      })
    })

    return parseOptions
  }

  self.reset = () => {
    handlers = {}
    aliasMap = {}
    defaultCommand = undefined
    return self
  }

  // used by yargs.parse() to freeze
  // the state of commands such that
  // we can apply .parse() multiple times
  // with the same yargs instance.
  let frozen
  self.freeze = () => {
    frozen = {}
    frozen.handlers = handlers
    frozen.aliasMap = aliasMap
    frozen.defaultCommand = defaultCommand
  }
  self.unfreeze = () => {
    handlers = frozen.handlers
    aliasMap = frozen.aliasMap
    defaultCommand = frozen.defaultCommand
    frozen = undefined
  }

  return self
}
exports.completionShTemplate =
`###-begin-{{app_name}}-completions-###
#
# yargs command completion script
#
# Installation: {{app_path}} {{completion_command}} >> ~/.bashrc
#    or {{app_path}} {{completion_command}} >> ~/.bash_profile on OSX.
#
_yargs_completions()
{
    local cur_word args type_list

    cur_word="\${COMP_WORDS[COMP_CWORD]}"
    args=("\${COMP_WORDS[@]}")

    # ask yargs to generate completions.
    type_list=$({{app_path}} --get-yargs-completions "\${args[@]}")

    COMPREPLY=( $(compgen -W "\${type_list}" -- \${cur_word}) )

    # if no match was found, fall back to filename completion
    if [ \${#COMPREPLY[@]} -eq 0 ]; then
      COMPREPLY=()
    fi

    return 0
}
complete -o default -F _yargs_completions {{app_name}}
###-end-{{app_name}}-completions-###
`

exports.completionZshTemplate = `###-begin-{{app_name}}-completions-###
#
# yargs command completion script
#
# Installation: {{app_path}} {{completion_command}} >> ~/.zshrc
#    or {{app_path}} {{completion_command}} >> ~/.zsh_profile on OSX.
#
_{{app_name}}_yargs_completions()
{
  local reply
  local si=$IFS
  IFS=$'\n' reply=($(COMP_CWORD="$((CURRENT-1))" COMP_LINE="$BUFFER" COMP_POINT="$CURSOR" {{app_path}} --get-yargs-completions "\${words[@]}"))
  IFS=$si
  _describe 'values' reply
}
compdef _{{app_name}}_yargs_completions {{app_name}}
###-end-{{app_name}}-completions-###
`
'use strict'
const path = require('path')

// add bash completions to your
//  yargs-powered applications.
module.exports = function completion (yargs, usage, command) {
  const self = {
    completionKey: 'get-yargs-completions'
  }

  const zshShell = process.env.SHELL && process.env.SHELL.indexOf('zsh') !== -1
  // get a list of completion commands.
  // 'args' is the array of strings from the line to be completed
  self.getCompletion = function getCompletion (args, done) {
    const completions = []
    const current = args.length ? args[args.length - 1] : ''
    const argv = yargs.parse(args, true)
    const aliases = yargs.parsed.aliases
    const parentCommands = yargs.getContext().commands

    // a custom completion function can be provided
    // to completion().
    if (completionFunction) {
      if (completionFunction.length < 3) {
        const result = completionFunction(current, argv)

        // promise based completion function.
        if (typeof result.then === 'function') {
          return result.then((list) => {
            process.nextTick(() => { done(list) })
          }).catch((err) => {
            process.nextTick(() => { throw err })
          })
        }

        // synchronous completion function.
        return done(result)
      } else {
        // asynchronous completion function
        return completionFunction(current, argv, (completions) => {
          done(completions)
        })
      }
    }

    const handlers = command.getCommandHandlers()
    for (let i = 0, ii = args.length; i < ii; ++i) {
      if (handlers[args[i]] && handlers[args[i]].builder) {
        const builder = handlers[args[i]].builder
        if (typeof builder === 'function') {
          const y = yargs.reset()
          builder(y)
          return y.argv
        }
      }
    }

    if (!current.match(/^-/) && parentCommands[parentCommands.length - 1] !== current) {
      usage.getCommands().forEach((usageCommand) => {
        const commandName = command.parseCommand(usageCommand[0]).cmd
        if (args.indexOf(commandName) === -1) {
          if (!zshShell) {
            completions.push(commandName)
          } else {
            const desc = usageCommand[1] || ''
            completions.push(commandName.replace(/:/g, '\\:') + ':' + desc)
          }
        }
      })
    }

    if (current.match(/^-/) || (current === '' && completions.length === 0)) {
      const descs = usage.getDescriptions()
      Object.keys(yargs.getOptions().key).forEach((key) => {
        // If the key and its aliases aren't in 'args', add the key to 'completions'
        const keyAndAliases = [key].concat(aliases[key] || [])
        const notInArgs = keyAndAliases.every(val => args.indexOf(`--${val}`) === -1)
        if (notInArgs) {
          if (!zshShell) {
            completions.push(`--${key}`)
          } else {
            const desc = descs[key] || ''
            completions.push(`--${key.replace(/:/g, '\\:')}:${desc.replace('__yargsString__:', '')}`)
          }
        }
      })
    }

    done(completions)
  }

  // generate the completion script to add to your .bashrc.
  self.generateCompletionScript = function generateCompletionScript ($0, cmd) {
    const templates = require('./completion-templates')
    let script = zshShell ? templates.completionZshTemplate : templates.completionShTemplate
    const name = path.basename($0)

    // add ./to applications not yet installed as bin.
    if ($0.match(/\.js$/)) $0 = `./${$0}`

    script = script.replace(/{{app_name}}/g, name)
    script = script.replace(/{{completion_command}}/g, cmd)
    return script.replace(/{{app_path}}/g, $0)
  }

  // register a function to perform your own custom
  // completions., this function can be either
  // synchrnous or asynchronous.
  let completionFunction = null
  self.registerFunction = (fn) => {
    completionFunction = fn
  }

  return self
}
/*
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
'use strict'

module.exports = (text, separator) => {
  separator = typeof separator === 'undefined' ? '_' : separator

  return text
    .replace(/([a-z\d])([A-Z])/g, `$1${separator}$2`)
    .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, `$1${separator}$2`)
    .toLowerCase()
}
module.exports = function isPromise (maybePromise) {
  return maybePromise instanceof Promise
}
/*
Copyright (c) 2011 Andrei Mackenzie

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

// levenshtein distance algorithm, pulled from Andrei Mackenzie's MIT licensed.
// gist, which can be found here: https://gist.github.com/andrei-m/982927
'use strict'
// Compute the edit distance between the two given strings
module.exports = function levenshtein (a, b) {
  if (a.length === 0) return b.length
  if (b.length === 0) return a.length

  const matrix = []

  // increment along the first column of each row
  let i
  for (i = 0; i <= b.length; i++) {
    matrix[i] = [i]
  }

  // increment each column in the first row
  let j
  for (j = 0; j <= a.length; j++) {
    matrix[0][j] = j
  }

  // Fill in the rest of the matrix
  for (i = 1; i <= b.length; i++) {
    for (j = 1; j <= a.length; j++) {
      if (b.charAt(i - 1) === a.charAt(j - 1)) {
        matrix[i][j] = matrix[i - 1][j - 1]
      } else {
        matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
          Math.min(matrix[i][j - 1] + 1, // insertion
            matrix[i - 1][j] + 1)) // deletion
      }
    }
  }

  return matrix[b.length][a.length]
}
'use strict'

// hoisted due to circular dependency on command.
module.exports = {
  applyMiddleware,
  commandMiddlewareFactory,
  globalMiddlewareFactory
}
const isPromise = require('./is-promise')
const argsert = require('./argsert')

function globalMiddlewareFactory (globalMiddleware, context) {
  return function (callback, applyBeforeValidation = false) {
    argsert('<array|function> [boolean]', [callback, applyBeforeValidation], arguments.length)
    if (Array.isArray(callback)) {
      for (let i = 0; i < callback.length; i++) {
        if (typeof callback[i] !== 'function') {
          throw Error('middleware must be a function')
        }
        callback[i].applyBeforeValidation = applyBeforeValidation
      }
      Array.prototype.push.apply(globalMiddleware, callback)
    } else if (typeof callback === 'function') {
      callback.applyBeforeValidation = applyBeforeValidation
      globalMiddleware.push(callback)
    }
    return context
  }
}

function commandMiddlewareFactory (commandMiddleware) {
  if (!commandMiddleware) return []
  return commandMiddleware.map(middleware => {
    middleware.applyBeforeValidation = false
    return middleware
  })
}

function applyMiddleware (argv, yargs, middlewares, beforeValidation) {
  const beforeValidationError = new Error('middleware cannot return a promise when applyBeforeValidation is true')
  return middlewares
    .reduce((accumulation, middleware) => {
      if (middleware.applyBeforeValidation !== beforeValidation &&
          !isPromise(accumulation)) {
        return accumulation
      }

      if (isPromise(accumulation)) {
        return accumulation
          .then(initialObj =>
            Promise.all([initialObj, middleware(initialObj, yargs)])
          )
          .then(([initialObj, middlewareObj]) =>
            Object.assign(initialObj, middlewareObj)
          )
      } else {
        const result = middleware(argv, yargs)
        if (beforeValidation && isPromise(result)) throw beforeValidationError

        return isPromise(result)
          ? result.then(middlewareObj => Object.assign(accumulation, middlewareObj))
          : Object.assign(accumulation, result)
      }
    }, argv)
}
'use strict'
module.exports = function objFilter (original, filter) {
  const obj = {}
  filter = filter || ((k, v) => true)
  Object.keys(original || {}).forEach((key) => {
    if (filter(key, original[key])) {
      obj[key] = original[key]
    }
  })
  return obj
}
'use strict'
// this file handles outputting usage instructions,
// failures, etc. keeps logging in one place.
const decamelize = require('./decamelize')
const stringWidth = require('string-width')
const objFilter = require('./obj-filter')
const path = require('path')
const setBlocking = require('set-blocking')
const YError = require('./yerror')

module.exports = function usage (yargs, y18n) {
  const __ = y18n.__
  const self = {}

  // methods for ouputting/building failure message.
  const fails = []
  self.failFn = function failFn (f) {
    fails.push(f)
  }

  let failMessage = null
  let showHelpOnFail = true
  self.showHelpOnFail = function showHelpOnFailFn (enabled, message) {
    if (typeof enabled === 'string') {
      message = enabled
      enabled = true
    } else if (typeof enabled === 'undefined') {
      enabled = true
    }
    failMessage = message
    showHelpOnFail = enabled
    return self
  }

  let failureOutput = false
  self.fail = function fail (msg, err) {
    const logger = yargs._getLoggerInstance()

    if (fails.length) {
      for (let i = fails.length - 1; i >= 0; --i) {
        fails[i](msg, err, self)
      }
    } else {
      if (yargs.getExitProcess()) setBlocking(true)

      // don't output failure message more than once
      if (!failureOutput) {
        failureOutput = true
        if (showHelpOnFail) {
          yargs.showHelp('error')
          logger.error()
        }
        if (msg || err) logger.error(msg || err)
        if (failMessage) {
          if (msg || err) logger.error('')
          logger.error(failMessage)
        }
      }

      err = err || new YError(msg)
      if (yargs.getExitProcess()) {
        return yargs.exit(1)
      } else if (yargs._hasParseCallback()) {
        return yargs.exit(1, err)
      } else {
        throw err
      }
    }
  }

  // methods for ouputting/building help (usage) message.
  let usages = []
  let usageDisabled = false
  self.usage = (msg, description) => {
    if (msg === null) {
      usageDisabled = true
      usages = []
      return
    }
    usageDisabled = false
    usages.push([msg, description || ''])
    return self
  }
  self.getUsage = () => {
    return usages
  }
  self.getUsageDisabled = () => {
    return usageDisabled
  }

  self.getPositionalGroupName = () => {
    return __('Positionals:')
  }

  let examples = []
  self.example = (cmd, description) => {
    examples.push([cmd, description || ''])
  }

  let commands = []
  self.command = function command (cmd, description, isDefault, aliases) {
    // the last default wins, so cancel out any previously set default
    if (isDefault) {
      commands = commands.map((cmdArray) => {
        cmdArray[2] = false
        return cmdArray
      })
    }
    commands.push([cmd, description || '', isDefault, aliases])
  }
  self.getCommands = () => commands

  let descriptions = {}
  self.describe = function describe (key, desc) {
    if (typeof key === 'object') {
      Object.keys(key).forEach((k) => {
        self.describe(k, key[k])
      })
    } else {
      descriptions[key] = desc
    }
  }
  self.getDescriptions = () => descriptions

  let epilog
  self.epilog = (msg) => {
    epilog = msg
  }

  let wrapSet = false
  let wrap
  self.wrap = (cols) => {
    wrapSet = true
    wrap = cols
  }

  function getWrap () {
    if (!wrapSet) {
      wrap = windowWidth()
      wrapSet = true
    }

    return wrap
  }

  const deferY18nLookupPrefix = '__yargsString__:'
  self.deferY18nLookup = str => deferY18nLookupPrefix + str

  const defaultGroup = 'Options:'
  self.help = function help () {
    normalizeAliases()

    // handle old demanded API
    const base$0 = path.basename(yargs.$0)
    const demandedOptions = yargs.getDemandedOptions()
    const demandedCommands = yargs.getDemandedCommands()
    const groups = yargs.getGroups()
    const options = yargs.getOptions()

    let keys = []
    keys = keys.concat(Object.keys(descriptions))
    keys = keys.concat(Object.keys(demandedOptions))
    keys = keys.concat(Object.keys(demandedCommands))
    keys = keys.concat(Object.keys(options.default))
    keys = keys.filter(filterHiddenOptions)
    keys = Object.keys(keys.reduce((acc, key) => {
      if (key !== '_') acc[key] = true
      return acc
    }, {}))

    const theWrap = getWrap()
    const ui = require('cliui')({
      width: theWrap,
      wrap: !!theWrap
    })

    // the usage string.
    if (!usageDisabled) {
      if (usages.length) {
        // user-defined usage.
        usages.forEach((usage) => {
          ui.div(`${usage[0].replace(/\$0/g, base$0)}`)
          if (usage[1]) {
            ui.div({ text: `${usage[1]}`, padding: [1, 0, 0, 0] })
          }
        })
        ui.div()
      } else if (commands.length) {
        let u = null
        // demonstrate how commands are used.
        if (demandedCommands._) {
          u = `${base$0} <${__('command')}>\n`
        } else {
          u = `${base$0} [${__('command')}]\n`
        }
        ui.div(`${u}`)
      }
    }

    // your application's commands, i.e., non-option
    // arguments populated in '_'.
    if (commands.length) {
      ui.div(__('Commands:'))

      const context = yargs.getContext()
      const parentCommands = context.commands.length ? `${context.commands.join(' ')} ` : ''

      if (yargs.getParserConfiguration()['sort-commands'] === true) {
        commands = commands.sort((a, b) => a[0].localeCompare(b[0]))
      }

      commands.forEach((command) => {
        const commandString = `${base$0} ${parentCommands}${command[0].replace(/^\$0 ?/, '')}` // drop $0 from default commands.
        ui.span(
          {
            text: commandString,
            padding: [0, 2, 0, 2],
            width: maxWidth(commands, theWrap, `${base$0}${parentCommands}`) + 4
          },
          { text: command[1] }
        )
        const hints = []
        if (command[2]) hints.push(`[${__('default:').slice(0, -1)}]`) // TODO hacking around i18n here
        if (command[3] && command[3].length) {
          hints.push(`[${__('aliases:')} ${command[3].join(', ')}]`)
        }
        if (hints.length) {
          ui.div({ text: hints.join(' '), padding: [0, 0, 0, 2], align: 'right' })
        } else {
          ui.div()
        }
      })

      ui.div()
    }

    // perform some cleanup on the keys array, making it
    // only include top-level keys not their aliases.
    const aliasKeys = (Object.keys(options.alias) || [])
      .concat(Object.keys(yargs.parsed.newAliases) || [])

    keys = keys.filter(key => !yargs.parsed.newAliases[key] && aliasKeys.every(alias => (options.alias[alias] || []).indexOf(key) === -1))

    // populate 'Options:' group with any keys that have not
    // explicitly had a group set.
    if (!groups[defaultGroup]) groups[defaultGroup] = []
    addUngroupedKeys(keys, options.alias, groups)

    // display 'Options:' table along with any custom tables:
    Object.keys(groups).forEach((groupName) => {
      if (!groups[groupName].length) return

      // if we've grouped the key 'f', but 'f' aliases 'foobar',
      // normalizedKeys should contain only 'foobar'.
      const normalizedKeys = groups[groupName].filter(filterHiddenOptions).map((key) => {
        if (~aliasKeys.indexOf(key)) return key
        for (let i = 0, aliasKey; (aliasKey = aliasKeys[i]) !== undefined; i++) {
          if (~(options.alias[aliasKey] || []).indexOf(key)) return aliasKey
        }
        return key
      })

      if (normalizedKeys.length < 1) return

      ui.div(__(groupName))

      // actually generate the switches string --foo, -f, --bar.
      const switches = normalizedKeys.reduce((acc, key) => {
        acc[key] = [ key ].concat(options.alias[key] || [])
          .map(sw => {
            // for the special positional group don't
            // add '--' or '-' prefix.
            if (groupName === self.getPositionalGroupName()) return sw
            else return (sw.length > 1 ? '--' : '-') + sw
          })
          .join(', ')

        return acc
      }, {})

      normalizedKeys.forEach((key) => {
        const kswitch = switches[key]
        let desc = descriptions[key] || ''
        let type = null

        if (~desc.lastIndexOf(deferY18nLookupPrefix)) desc = __(desc.substring(deferY18nLookupPrefix.length))

        if (~options.boolean.indexOf(key)) type = `[${__('boolean')}]`
        if (~options.count.indexOf(key)) type = `[${__('count')}]`
        if (~options.string.indexOf(key)) type = `[${__('string')}]`
        if (~options.normalize.indexOf(key)) type = `[${__('string')}]`
        if (~options.array.indexOf(key)) type = `[${__('array')}]`
        if (~options.number.indexOf(key)) type = `[${__('number')}]`

        const extra = [
          type,
          (key in demandedOptions) ? `[${__('required')}]` : null,
          options.choices && options.choices[key] ? `[${__('choices:')} ${
            self.stringifiedValues(options.choices[key])}]` : null,
          defaultString(options.default[key], options.defaultDescription[key])
        ].filter(Boolean).join(' ')

        ui.span(
          { text: kswitch, padding: [0, 2, 0, 2], width: maxWidth(switches, theWrap) + 4 },
          desc
        )

        if (extra) ui.div({ text: extra, padding: [0, 0, 0, 2], align: 'right' })
        else ui.div()
      })

      ui.div()
    })

    // describe some common use-cases for your application.
    if (examples.length) {
      ui.div(__('Examples:'))

      examples.forEach((example) => {
        example[0] = example[0].replace(/\$0/g, base$0)
      })

      examples.forEach((example) => {
        if (example[1] === '') {
          ui.div(
            {
              text: example[0],
              padding: [0, 2, 0, 2]
            }
          )
        } else {
          ui.div(
            {
              text: example[0],
              padding: [0, 2, 0, 2],
              width: maxWidth(examples, theWrap) + 4
            }, {
              text: example[1]
            }
          )
        }
      })

      ui.div()
    }

    // the usage string.
    if (epilog) {
      const e = epilog.replace(/\$0/g, base$0)
      ui.div(`${e}\n`)
    }

    // Remove the trailing white spaces
    return ui.toString().replace(/\s*$/, '')
  }

  // return the maximum width of a string
  // in the left-hand column of a table.
  function maxWidth (table, theWrap, modifier) {
    let width = 0

    // table might be of the form [leftColumn],
    // or {key: leftColumn}
    if (!Array.isArray(table)) {
      table = Object.keys(table).map(key => [table[key]])
    }

    table.forEach((v) => {
      width = Math.max(
        stringWidth(modifier ? `${modifier} ${v[0]}` : v[0]),
        width
      )
    })

    // if we've enabled 'wrap' we should limit
    // the max-width of the left-column.
    if (theWrap) width = Math.min(width, parseInt(theWrap * 0.5, 10))

    return width
  }

  // make sure any options set for aliases,
  // are copied to the keys being aliased.
  function normalizeAliases () {
    // handle old demanded API
    const demandedOptions = yargs.getDemandedOptions()
    const options = yargs.getOptions()

    ;(Object.keys(options.alias) || []).forEach((key) => {
      options.alias[key].forEach((alias) => {
        // copy descriptions.
        if (descriptions[alias]) self.describe(key, descriptions[alias])
        // copy demanded.
        if (alias in demandedOptions) yargs.demandOption(key, demandedOptions[alias])
        // type messages.
        if (~options.boolean.indexOf(alias)) yargs.boolean(key)
        if (~options.count.indexOf(alias)) yargs.count(key)
        if (~options.string.indexOf(alias)) yargs.string(key)
        if (~options.normalize.indexOf(alias)) yargs.normalize(key)
        if (~options.array.indexOf(alias)) yargs.array(key)
        if (~options.number.indexOf(alias)) yargs.number(key)
      })
    })
  }

  // given a set of keys, place any keys that are
  // ungrouped under the 'Options:' grouping.
  function addUngroupedKeys (keys, aliases, groups) {
    let groupedKeys = []
    let toCheck = null
    Object.keys(groups).forEach((group) => {
      groupedKeys = groupedKeys.concat(groups[group])
    })

    keys.forEach((key) => {
      toCheck = [key].concat(aliases[key])
      if (!toCheck.some(k => groupedKeys.indexOf(k) !== -1)) {
        groups[defaultGroup].push(key)
      }
    })
    return groupedKeys
  }

  function filterHiddenOptions (key) {
    return yargs.getOptions().hiddenOptions.indexOf(key) < 0 || yargs.parsed.argv[yargs.getOptions().showHiddenOpt]
  }

  self.showHelp = (level) => {
    const logger = yargs._getLoggerInstance()
    if (!level) level = 'error'
    const emit = typeof level === 'function' ? level : logger[level]
    emit(self.help())
  }

  self.functionDescription = (fn) => {
    const description = fn.name ? decamelize(fn.name, '-') : __('generated-value')
    return ['(', description, ')'].join('')
  }

  self.stringifiedValues = function stringifiedValues (values, separator) {
    let string = ''
    const sep = separator || ', '
    const array = [].concat(values)

    if (!values || !array.length) return string

    array.forEach((value) => {
      if (string.length) string += sep
      string += JSON.stringify(value)
    })

    return string
  }

  // format the default-value-string displayed in
  // the right-hand column.
  function defaultString (value, defaultDescription) {
    let string = `[${__('default:')} `

    if (value === undefined && !defaultDescription) return null

    if (defaultDescription) {
      string += defaultDescription
    } else {
      switch (typeof value) {
        case 'string':
          string += `"${value}"`
          break
        case 'object':
          string += JSON.stringify(value)
          break
        default:
          string += value
      }
    }

    return `${string}]`
  }

  // guess the width of the console window, max-width 80.
  function windowWidth () {
    const maxWidth = 80
    if (typeof process === 'object' && process.stdout && process.stdout.columns) {
      return Math.min(maxWidth, process.stdout.columns)
    } else {
      return maxWidth
    }
  }

  // logic for displaying application version.
  let version = null
  self.version = (ver) => {
    version = ver
  }

  self.showVersion = () => {
    const logger = yargs._getLoggerInstance()
    logger.log(version)
  }

  self.reset = function reset (localLookup) {
    // do not reset wrap here
    // do not reset fails here
    failMessage = null
    failureOutput = false
    usages = []
    usageDisabled = false
    epilog = undefined
    examples = []
    commands = []
    descriptions = objFilter(descriptions, (k, v) => !localLookup[k])
    return self
  }

  let frozen
  self.freeze = function freeze () {
    frozen = {}
    frozen.failMessage = failMessage
    frozen.failureOutput = failureOutput
    frozen.usages = usages
    frozen.usageDisabled = usageDisabled
    frozen.epilog = epilog
    frozen.examples = examples
    frozen.commands = commands
    frozen.descriptions = descriptions
  }
  self.unfreeze = function unfreeze () {
    failMessage = frozen.failMessage
    failureOutput = frozen.failureOutput
    usages = frozen.usages
    usageDisabled = frozen.usageDisabled
    epilog = frozen.epilog
    examples = frozen.examples
    commands = frozen.commands
    descriptions = frozen.descriptions
    frozen = undefined
  }

  return self
}
'use strict'
const argsert = require('./argsert')
const objFilter = require('./obj-filter')
const specialKeys = ['$0', '--', '_']

// validation-type-stuff, missing params,
// bad implications, custom checks.
module.exports = function validation (yargs, usage, y18n) {
  const __ = y18n.__
  const __n = y18n.__n
  const self = {}

  // validate appropriate # of non-option
  // arguments were provided, i.e., '_'.
  self.nonOptionCount = function nonOptionCount (argv) {
    const demandedCommands = yargs.getDemandedCommands()
    // don't count currently executing commands
    const _s = argv._.length - yargs.getContext().commands.length

    if (demandedCommands._ && (_s < demandedCommands._.min || _s > demandedCommands._.max)) {
      if (_s < demandedCommands._.min) {
        if (demandedCommands._.minMsg !== undefined) {
          usage.fail(
            // replace $0 with observed, $1 with expected.
            demandedCommands._.minMsg ? demandedCommands._.minMsg.replace(/\$0/g, _s).replace(/\$1/, demandedCommands._.min) : null
          )
        } else {
          usage.fail(
            __('Not enough non-option arguments: got %s, need at least %s', _s, demandedCommands._.min)
          )
        }
      } else if (_s > demandedCommands._.max) {
        if (demandedCommands._.maxMsg !== undefined) {
          usage.fail(
            // replace $0 with observed, $1 with expected.
            demandedCommands._.maxMsg ? demandedCommands._.maxMsg.replace(/\$0/g, _s).replace(/\$1/, demandedCommands._.max) : null
          )
        } else {
          usage.fail(
            __('Too many non-option arguments: got %s, maximum of %s', _s, demandedCommands._.max)
          )
        }
      }
    }
  }

  // validate the appropriate # of <required>
  // positional arguments were provided:
  self.positionalCount = function positionalCount (required, observed) {
    if (observed < required) {
      usage.fail(
        __('Not enough non-option arguments: got %s, need at least %s', observed, required)
      )
    }
  }

  // make sure all the required arguments are present.
  self.requiredArguments = function requiredArguments (argv) {
    const demandedOptions = yargs.getDemandedOptions()
    let missing = null

    Object.keys(demandedOptions).forEach((key) => {
      if (!argv.hasOwnProperty(key) || typeof argv[key] === 'undefined') {
        missing = missing || {}
        missing[key] = demandedOptions[key]
      }
    })

    if (missing) {
      const customMsgs = []
      Object.keys(missing).forEach((key) => {
        const msg = missing[key]
        if (msg && customMsgs.indexOf(msg) < 0) {
          customMsgs.push(msg)
        }
      })

      const customMsg = customMsgs.length ? `\n${customMsgs.join('\n')}` : ''

      usage.fail(__n(
        'Missing required argument: %s',
        'Missing required arguments: %s',
        Object.keys(missing).length,
        Object.keys(missing).join(', ') + customMsg
      ))
    }
  }

  // check for unknown arguments (strict-mode).
  self.unknownArguments = function unknownArguments (argv, aliases, positionalMap) {
    const commandKeys = yargs.getCommandInstance().getCommands()
    const unknown = []
    const currentContext = yargs.getContext()

    Object.keys(argv).forEach((key) => {
      if (specialKeys.indexOf(key) === -1 &&
        !positionalMap.hasOwnProperty(key) &&
        !yargs._getParseContext().hasOwnProperty(key) &&
        !aliases.hasOwnProperty(key)
      ) {
        unknown.push(key)
      }
    })

    if (commandKeys.length > 0) {
      argv._.slice(currentContext.commands.length).forEach((key) => {
        if (commandKeys.indexOf(key) === -1) {
          unknown.push(key)
        }
      })
    }

    if (unknown.length > 0) {
      usage.fail(__n(
        'Unknown argument: %s',
        'Unknown arguments: %s',
        unknown.length,
        unknown.join(', ')
      ))
    }
  }

  // validate arguments limited to enumerated choices
  self.limitedChoices = function limitedChoices (argv) {
    const options = yargs.getOptions()
    const invalid = {}

    if (!Object.keys(options.choices).length) return

    Object.keys(argv).forEach((key) => {
      if (specialKeys.indexOf(key) === -1 &&
        options.choices.hasOwnProperty(key)) {
        [].concat(argv[key]).forEach((value) => {
          // TODO case-insensitive configurability
          if (options.choices[key].indexOf(value) === -1 &&
              value !== undefined) {
            invalid[key] = (invalid[key] || []).concat(value)
          }
        })
      }
    })

    const invalidKeys = Object.keys(invalid)

    if (!invalidKeys.length) return

    let msg = __('Invalid values:')
    invalidKeys.forEach((key) => {
      msg += `\n  ${__(
        'Argument: %s, Given: %s, Choices: %s',
        key,
        usage.stringifiedValues(invalid[key]),
        usage.stringifiedValues(options.choices[key])
      )}`
    })
    usage.fail(msg)
  }

  // custom checks, added using the `check` option on yargs.
  let checks = []
  self.check = function check (f, global) {
    checks.push({
      func: f,
      global
    })
  }

  self.customChecks = function customChecks (argv, aliases) {
    for (let i = 0, f; (f = checks[i]) !== undefined; i++) {
      const func = f.func
      let result = null
      try {
        result = func(argv, aliases)
      } catch (err) {
        usage.fail(err.message ? err.message : err, err)
        continue
      }

      if (!result) {
        usage.fail(__('Argument check failed: %s', func.toString()))
      } else if (typeof result === 'string' || result instanceof Error) {
        usage.fail(result.toString(), result)
      }
    }
  }

  // check implications, argument foo implies => argument bar.
  let implied = {}
  self.implies = function implies (key, value) {
    argsert('<string|object> [array|number|string]', [key, value], arguments.length)

    if (typeof key === 'object') {
      Object.keys(key).forEach((k) => {
        self.implies(k, key[k])
      })
    } else {
      yargs.global(key)
      if (!implied[key]) {
        implied[key] = []
      }
      if (Array.isArray(value)) {
        value.forEach((i) => self.implies(key, i))
      } else {
        implied[key].push(value)
      }
    }
  }
  self.getImplied = function getImplied () {
    return implied
  }

  self.implications = function implications (argv) {
    const implyFail = []

    Object.keys(implied).forEach((key) => {
      const origKey = key
      ;(implied[key] || []).forEach((value) => {
        let num
        let key = origKey
        const origValue = value

        // convert string '1' to number 1
        num = Number(key)
        key = isNaN(num) ? key : num

        if (typeof key === 'number') {
          // check length of argv._
          key = argv._.length >= key
        } else if (key.match(/^--no-.+/)) {
          // check if key doesn't exist
          key = key.match(/^--no-(.+)/)[1]
          key = !argv[key]
        } else {
          // check if key exists
          key = argv[key]
        }

        num = Number(value)
        value = isNaN(num) ? value : num

        if (typeof value === 'number') {
          value = argv._.length >= value
        } else if (value.match(/^--no-.+/)) {
          value = value.match(/^--no-(.+)/)[1]
          value = !argv[value]
        } else {
          value = argv[value]
        }
        if (key && !value) {
          implyFail.push(` ${origKey} -> ${origValue}`)
        }
      })
    })

    if (implyFail.length) {
      let msg = `${__('Implications failed:')}\n`

      implyFail.forEach((value) => {
        msg += (value)
      })

      usage.fail(msg)
    }
  }

  let conflicting = {}
  self.conflicts = function conflicts (key, value) {
    argsert('<string|object> [array|string]', [key, value], arguments.length)

    if (typeof key === 'object') {
      Object.keys(key).forEach((k) => {
        self.conflicts(k, key[k])
      })
    } else {
      yargs.global(key)
      if (!conflicting[key]) {
        conflicting[key] = []
      }
      if (Array.isArray(value)) {
        value.forEach((i) => self.conflicts(key, i))
      } else {
        conflicting[key].push(value)
      }
    }
  }
  self.getConflicting = () => conflicting

  self.conflicting = function conflictingFn (argv) {
    Object.keys(argv).forEach((key) => {
      if (conflicting[key]) {
        conflicting[key].forEach((value) => {
          // we default keys to 'undefined' that have been configured, we should not
          // apply conflicting check unless they are a value other than 'undefined'.
          if (value && argv[key] !== undefined && argv[value] !== undefined) {
            usage.fail(__('Arguments %s and %s are mutually exclusive', key, value))
          }
        })
      }
    })
  }

  self.recommendCommands = function recommendCommands (cmd, potentialCommands) {
    const distance = require('./levenshtein')
    const threshold = 3 // if it takes more than three edits, let's move on.
    potentialCommands = potentialCommands.sort((a, b) => b.length - a.length)

    let recommended = null
    let bestDistance = Infinity
    for (let i = 0, candidate; (candidate = potentialCommands[i]) !== undefined; i++) {
      const d = distance(cmd, candidate)
      if (d <= threshold && d < bestDistance) {
        bestDistance = d
        recommended = candidate
      }
    }
    if (recommended) usage.fail(__('Did you mean %s?', recommended))
  }

  self.reset = function reset (localLookup) {
    implied = objFilter(implied, (k, v) => !localLookup[k])
    conflicting = objFilter(conflicting, (k, v) => !localLookup[k])
    checks = checks.filter(c => c.global)
    return self
  }

  let frozen
  self.freeze = function freeze () {
    frozen = {}
    frozen.implied = implied
    frozen.checks = checks
    frozen.conflicting = conflicting
  }
  self.unfreeze = function unfreeze () {
    implied = frozen.implied
    checks = frozen.checks
    conflicting = frozen.conflicting
    frozen = undefined
  }

  return self
}
'use strict'
function YError (msg) {
  this.name = 'YError'
  this.message = msg || 'yargs error'
  Error.captureStackTrace(this, YError)
}

YError.prototype = Object.create(Error.prototype)
YError.prototype.constructor = YError

module.exports = YError
Copyright (c) 2016, Contributors

Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice
appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
var camelCase = require('camelcase')
var decamelize = require('decamelize')
var path = require('path')
var tokenizeArgString = require('./lib/tokenize-arg-string')
var util = require('util')

function parse (args, opts) {
  if (!opts) opts = {}
  // allow a string argument to be passed in rather
  // than an argv array.
  args = tokenizeArgString(args)

  // aliases might have transitive relationships, normalize this.
  var aliases = combineAliases(opts.alias || {})
  var configuration = Object.assign({
    'short-option-groups': true,
    'camel-case-expansion': true,
    'dot-notation': true,
    'parse-numbers': true,
    'boolean-negation': true,
    'negation-prefix': 'no-',
    'duplicate-arguments-array': true,
    'flatten-duplicate-arrays': true,
    'populate--': false,
    'combine-arrays': false,
    'set-placeholder-key': false,
    'halt-at-non-option': false,
    'strip-aliased': false,
    'strip-dashed': false
  }, opts.configuration)
  var defaults = opts.default || {}
  var configObjects = opts.configObjects || []
  var envPrefix = opts.envPrefix
  var notFlagsOption = configuration['populate--']
  var notFlagsArgv = notFlagsOption ? '--' : '_'
  var newAliases = {}
  // allow a i18n handler to be passed in, default to a fake one (util.format).
  var __ = opts.__ || util.format
  var error = null
  var flags = {
    aliases: {},
    arrays: {},
    bools: {},
    strings: {},
    numbers: {},
    counts: {},
    normalize: {},
    configs: {},
    defaulted: {},
    nargs: {},
    coercions: {},
    keys: []
  }
  var negative = /^-[0-9]+(\.[0-9]+)?/
  var negatedBoolean = new RegExp('^--' + configuration['negation-prefix'] + '(.+)')

  ;[].concat(opts.array).filter(Boolean).forEach(function (opt) {
    var key = opt.key || opt

    // assign to flags[bools|strings|numbers]
    const assignment = Object.keys(opt).map(function (key) {
      return ({
        boolean: 'bools',
        string: 'strings',
        number: 'numbers'
      })[key]
    }).filter(Boolean).pop()

    // assign key to be coerced
    if (assignment) {
      flags[assignment][key] = true
    }

    flags.arrays[key] = true
    flags.keys.push(key)
  })

  ;[].concat(opts.boolean).filter(Boolean).forEach(function (key) {
    flags.bools[key] = true
    flags.keys.push(key)
  })

  ;[].concat(opts.string).filter(Boolean).forEach(function (key) {
    flags.strings[key] = true
    flags.keys.push(key)
  })

  ;[].concat(opts.number).filter(Boolean).forEach(function (key) {
    flags.numbers[key] = true
    flags.keys.push(key)
  })

  ;[].concat(opts.count).filter(Boolean).forEach(function (key) {
    flags.counts[key] = true
    flags.keys.push(key)
  })

  ;[].concat(opts.normalize).filter(Boolean).forEach(function (key) {
    flags.normalize[key] = true
    flags.keys.push(key)
  })

  Object.keys(opts.narg || {}).forEach(function (k) {
    flags.nargs[k] = opts.narg[k]
    flags.keys.push(k)
  })

  Object.keys(opts.coerce || {}).forEach(function (k) {
    flags.coercions[k] = opts.coerce[k]
    flags.keys.push(k)
  })

  if (Array.isArray(opts.config) || typeof opts.config === 'string') {
    ;[].concat(opts.config).filter(Boolean).forEach(function (key) {
      flags.configs[key] = true
    })
  } else {
    Object.keys(opts.config || {}).forEach(function (k) {
      flags.configs[k] = opts.config[k]
    })
  }

  // create a lookup table that takes into account all
  // combinations of aliases: {f: ['foo'], foo: ['f']}
  extendAliases(opts.key, aliases, opts.default, flags.arrays)

  // apply default values to all aliases.
  Object.keys(defaults).forEach(function (key) {
    (flags.aliases[key] || []).forEach(function (alias) {
      defaults[alias] = defaults[key]
    })
  })

  var argv = { _: [] }

  Object.keys(flags.bools).forEach(function (key) {
    if (Object.prototype.hasOwnProperty.call(defaults, key)) {
      setArg(key, defaults[key])
      setDefaulted(key)
    }
  })

  var notFlags = []

  for (var i = 0; i < args.length; i++) {
    var arg = args[i]
    var broken
    var key
    var letters
    var m
    var next
    var value

    // -- separated by =
    if (arg.match(/^--.+=/) || (
      !configuration['short-option-groups'] && arg.match(/^-.+=/)
    )) {
      // Using [\s\S] instead of . because js doesn't support the
      // 'dotall' regex modifier. See:
      // http://stackoverflow.com/a/1068308/13216
      m = arg.match(/^--?([^=]+)=([\s\S]*)$/)

      // nargs format = '--f=monkey washing cat'
      if (checkAllAliases(m[1], flags.nargs)) {
        args.splice(i + 1, 0, m[2])
        i = eatNargs(i, m[1], args)
      // arrays format = '--f=a b c'
      } else if (checkAllAliases(m[1], flags.arrays) && args.length > i + 1) {
        args.splice(i + 1, 0, m[2])
        i = eatArray(i, m[1], args)
      } else {
        setArg(m[1], m[2])
      }
    } else if (arg.match(negatedBoolean) && configuration['boolean-negation']) {
      key = arg.match(negatedBoolean)[1]
      setArg(key, false)

    // -- seperated by space.
    } else if (arg.match(/^--.+/) || (
      !configuration['short-option-groups'] && arg.match(/^-[^-]+/)
    )) {
      key = arg.match(/^--?(.+)/)[1]

      // nargs format = '--foo a b c'
      if (checkAllAliases(key, flags.nargs)) {
        i = eatNargs(i, key, args)
      // array format = '--foo a b c'
      } else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) {
        i = eatArray(i, key, args)
      } else {
        next = flags.nargs[key] === 0 ? undefined : args[i + 1]

        if (next !== undefined && (!next.match(/^-/) ||
          next.match(negative)) &&
          !checkAllAliases(key, flags.bools) &&
          !checkAllAliases(key, flags.counts)) {
          setArg(key, next)
          i++
        } else if (/^(true|false)$/.test(next)) {
          setArg(key, next)
          i++
        } else {
          setArg(key, defaultValue(key))
        }
      }

    // dot-notation flag seperated by '='.
    } else if (arg.match(/^-.\..+=/)) {
      m = arg.match(/^-([^=]+)=([\s\S]*)$/)
      setArg(m[1], m[2])

    // dot-notation flag seperated by space.
    } else if (arg.match(/^-.\..+/)) {
      next = args[i + 1]
      key = arg.match(/^-(.\..+)/)[1]

      if (next !== undefined && !next.match(/^-/) &&
        !checkAllAliases(key, flags.bools) &&
        !checkAllAliases(key, flags.counts)) {
        setArg(key, next)
        i++
      } else {
        setArg(key, defaultValue(key))
      }
    } else if (arg.match(/^-[^-]+/) && !arg.match(negative)) {
      letters = arg.slice(1, -1).split('')
      broken = false

      for (var j = 0; j < letters.length; j++) {
        next = arg.slice(j + 2)

        if (letters[j + 1] && letters[j + 1] === '=') {
          value = arg.slice(j + 3)
          key = letters[j]

          // nargs format = '-f=monkey washing cat'
          if (checkAllAliases(key, flags.nargs)) {
            args.splice(i + 1, 0, value)
            i = eatNargs(i, key, args)
          // array format = '-f=a b c'
          } else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) {
            args.splice(i + 1, 0, value)
            i = eatArray(i, key, args)
          } else {
            setArg(key, value)
          }

          broken = true
          break
        }

        if (next === '-') {
          setArg(letters[j], next)
          continue
        }

        // current letter is an alphabetic character and next value is a number
        if (/[A-Za-z]/.test(letters[j]) &&
          /^-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
          setArg(letters[j], next)
          broken = true
          break
        }

        if (letters[j + 1] && letters[j + 1].match(/\W/)) {
          setArg(letters[j], next)
          broken = true
          break
        } else {
          setArg(letters[j], defaultValue(letters[j]))
        }
      }

      key = arg.slice(-1)[0]

      if (!broken && key !== '-') {
        // nargs format = '-f a b c'
        if (checkAllAliases(key, flags.nargs)) {
          i = eatNargs(i, key, args)
        // array format = '-f a b c'
        } else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) {
          i = eatArray(i, key, args)
        } else {
          next = args[i + 1]

          if (next !== undefined && (!/^(-|--)[^-]/.test(next) ||
            next.match(negative)) &&
            !checkAllAliases(key, flags.bools) &&
            !checkAllAliases(key, flags.counts)) {
            setArg(key, next)
            i++
          } else if (/^(true|false)$/.test(next)) {
            setArg(key, next)
            i++
          } else {
            setArg(key, defaultValue(key))
          }
        }
      }
    } else if (arg === '--') {
      notFlags = args.slice(i + 1)
      break
    } else if (configuration['halt-at-non-option']) {
      notFlags = args.slice(i)
      break
    } else {
      argv._.push(maybeCoerceNumber('_', arg))
    }
  }

  // order of precedence:
  // 1. command line arg
  // 2. value from env var
  // 3. value from config file
  // 4. value from config objects
  // 5. configured default value
  applyEnvVars(argv, true) // special case: check env vars that point to config file
  applyEnvVars(argv, false)
  setConfig(argv)
  setConfigObjects()
  applyDefaultsAndAliases(argv, flags.aliases, defaults)
  applyCoercions(argv)
  if (configuration['set-placeholder-key']) setPlaceholderKeys(argv)

  // for any counts either not in args or without an explicit default, set to 0
  Object.keys(flags.counts).forEach(function (key) {
    if (!hasKey(argv, key.split('.'))) setArg(key, 0)
  })

  // '--' defaults to undefined.
  if (notFlagsOption && notFlags.length) argv[notFlagsArgv] = []
  notFlags.forEach(function (key) {
    argv[notFlagsArgv].push(key)
  })

  if (configuration['camel-case-expansion'] && configuration['strip-dashed']) {
    Object.keys(argv).filter(key => key !== '--' && key.includes('-')).forEach(key => {
      delete argv[key]
    })
  }

  if (configuration['strip-aliased']) {
    // XXX Switch to [].concat(...Object.values(aliases)) once node.js 6 is dropped
    ;[].concat(...Object.keys(aliases).map(k => aliases[k])).forEach(alias => {
      if (configuration['camel-case-expansion']) {
        delete argv[alias.split('.').map(prop => camelCase(prop)).join('.')]
      }

      delete argv[alias]
    })
  }

  // how many arguments should we consume, based
  // on the nargs option?
  function eatNargs (i, key, args) {
    var ii
    const toEat = checkAllAliases(key, flags.nargs)

    // nargs will not consume flag arguments, e.g., -abc, --foo,
    // and terminates when one is observed.
    var available = 0
    for (ii = i + 1; ii < args.length; ii++) {
      if (!args[ii].match(/^-[^0-9]/)) available++
      else break
    }

    if (available < toEat) error = Error(__('Not enough arguments following: %s', key))

    const consumed = Math.min(available, toEat)
    for (ii = i + 1; ii < (consumed + i + 1); ii++) {
      setArg(key, args[ii])
    }

    return (i + consumed)
  }

  // if an option is an array, eat all non-hyphenated arguments
  // following it... YUM!
  // e.g., --foo apple banana cat becomes ["apple", "banana", "cat"]
  function eatArray (i, key, args) {
    var start = i + 1
    var argsToSet = []
    var multipleArrayFlag = i > 0
    for (var ii = i + 1; ii < args.length; ii++) {
      if (/^-/.test(args[ii]) && !negative.test(args[ii])) {
        if (ii === start) {
          setArg(key, defaultForType('array'))
        }
        multipleArrayFlag = true
        break
      }
      i = ii
      argsToSet.push(args[ii])
    }
    if (multipleArrayFlag) {
      setArg(key, argsToSet.map(function (arg) {
        return processValue(key, arg)
      }))
    } else {
      argsToSet.forEach(function (arg) {
        setArg(key, arg)
      })
    }

    return i
  }

  function setArg (key, val) {
    unsetDefaulted(key)

    if (/-/.test(key) && configuration['camel-case-expansion']) {
      var alias = key.split('.').map(function (prop) {
        return camelCase(prop)
      }).join('.')
      addNewAlias(key, alias)
    }

    var value = processValue(key, val)

    var splitKey = key.split('.')
    setKey(argv, splitKey, value)

    // handle populating aliases of the full key
    if (flags.aliases[key] && flags.aliases[key].forEach) {
      flags.aliases[key].forEach(function (x) {
        x = x.split('.')
        setKey(argv, x, value)
      })
    }

    // handle populating aliases of the first element of the dot-notation key
    if (splitKey.length > 1 && configuration['dot-notation']) {
      ;(flags.aliases[splitKey[0]] || []).forEach(function (x) {
        x = x.split('.')

        // expand alias with nested objects in key
        var a = [].concat(splitKey)
        a.shift() // nuke the old key.
        x = x.concat(a)

        setKey(argv, x, value)
      })
    }

    // Set normalize getter and setter when key is in 'normalize' but isn't an array
    if (checkAllAliases(key, flags.normalize) && !checkAllAliases(key, flags.arrays)) {
      var keys = [key].concat(flags.aliases[key] || [])
      keys.forEach(function (key) {
        argv.__defineSetter__(key, function (v) {
          val = path.normalize(v)
        })

        argv.__defineGetter__(key, function () {
          return typeof val === 'string' ? path.normalize(val) : val
        })
      })
    }
  }

  function addNewAlias (key, alias) {
    if (!(flags.aliases[key] && flags.aliases[key].length)) {
      flags.aliases[key] = [alias]
      newAliases[alias] = true
    }
    if (!(flags.aliases[alias] && flags.aliases[alias].length)) {
      addNewAlias(alias, key)
    }
  }

  function processValue (key, val) {
    // strings may be quoted, clean this up as we assign values.
    if (typeof val === 'string' &&
      (val[0] === "'" || val[0] === '"') &&
      val[val.length - 1] === val[0]
    ) {
      val = val.substring(1, val.length - 1)
    }

    // handle parsing boolean arguments --foo=true --bar false.
    if (checkAllAliases(key, flags.bools) || checkAllAliases(key, flags.counts)) {
      if (typeof val === 'string') val = val === 'true'
    }

    var value = maybeCoerceNumber(key, val)

    // increment a count given as arg (either no value or value parsed as boolean)
    if (checkAllAliases(key, flags.counts) && (isUndefined(value) || typeof value === 'boolean')) {
      value = increment
    }

    // Set normalized value when key is in 'normalize' and in 'arrays'
    if (checkAllAliases(key, flags.normalize) && checkAllAliases(key, flags.arrays)) {
      if (Array.isArray(val)) value = val.map(path.normalize)
      else value = path.normalize(val)
    }
    return value
  }

  function maybeCoerceNumber (key, value) {
    if (!checkAllAliases(key, flags.strings) && !checkAllAliases(key, flags.coercions)) {
      const shouldCoerceNumber = isNumber(value) && configuration['parse-numbers'] && (
        Number.isSafeInteger(Math.floor(value))
      )
      if (shouldCoerceNumber || (!isUndefined(value) && checkAllAliases(key, flags.numbers))) value = Number(value)
    }
    return value
  }

  // set args from config.json file, this should be
  // applied last so that defaults can be applied.
  function setConfig (argv) {
    var configLookup = {}

    // expand defaults/aliases, in-case any happen to reference
    // the config.json file.
    applyDefaultsAndAliases(configLookup, flags.aliases, defaults)

    Object.keys(flags.configs).forEach(function (configKey) {
      var configPath = argv[configKey] || configLookup[configKey]
      if (configPath) {
        try {
          var config = null
          var resolvedConfigPath = path.resolve(process.cwd(), configPath)

          if (typeof flags.configs[configKey] === 'function') {
            try {
              config = flags.configs[configKey](resolvedConfigPath)
            } catch (e) {
              config = e
            }
            if (config instanceof Error) {
              error = config
              return
            }
          } else {
            config = require(resolvedConfigPath)
          }

          setConfigObject(config)
        } catch (ex) {
          if (argv[configKey]) error = Error(__('Invalid JSON config file: %s', configPath))
        }
      }
    })
  }

  // set args from config object.
  // it recursively checks nested objects.
  function setConfigObject (config, prev) {
    Object.keys(config).forEach(function (key) {
      var value = config[key]
      var fullKey = prev ? prev + '.' + key : key

      // if the value is an inner object and we have dot-notation
      // enabled, treat inner objects in config the same as
      // heavily nested dot notations (foo.bar.apple).
      if (typeof value === 'object' && value !== null && !Array.isArray(value) && configuration['dot-notation']) {
        // if the value is an object but not an array, check nested object
        setConfigObject(value, fullKey)
      } else {
        // setting arguments via CLI takes precedence over
        // values within the config file.
        if (!hasKey(argv, fullKey.split('.')) || (flags.defaulted[fullKey]) || (flags.arrays[fullKey] && configuration['combine-arrays'])) {
          setArg(fullKey, value)
        }
      }
    })
  }

  // set all config objects passed in opts
  function setConfigObjects () {
    if (typeof configObjects === 'undefined') return
    configObjects.forEach(function (configObject) {
      setConfigObject(configObject)
    })
  }

  function applyEnvVars (argv, configOnly) {
    if (typeof envPrefix === 'undefined') return

    var prefix = typeof envPrefix === 'string' ? envPrefix : ''
    Object.keys(process.env).forEach(function (envVar) {
      if (prefix === '' || envVar.lastIndexOf(prefix, 0) === 0) {
        // get array of nested keys and convert them to camel case
        var keys = envVar.split('__').map(function (key, i) {
          if (i === 0) {
            key = key.substring(prefix.length)
          }
          return camelCase(key)
        })

        if (((configOnly && flags.configs[keys.join('.')]) || !configOnly) && (!hasKey(argv, keys) || flags.defaulted[keys.join('.')])) {
          setArg(keys.join('.'), process.env[envVar])
        }
      }
    })
  }

  function applyCoercions (argv) {
    var coerce
    var applied = {}
    Object.keys(argv).forEach(function (key) {
      if (!applied.hasOwnProperty(key)) { // If we haven't already coerced this option via one of its aliases
        coerce = checkAllAliases(key, flags.coercions)
        if (typeof coerce === 'function') {
          try {
            var value = coerce(argv[key])
            ;([].concat(flags.aliases[key] || [], key)).forEach(ali => {
              applied[ali] = argv[ali] = value
            })
          } catch (err) {
            error = err
          }
        }
      }
    })
  }

  function setPlaceholderKeys (argv) {
    flags.keys.forEach((key) => {
      // don't set placeholder keys for dot notation options 'foo.bar'.
      if (~key.indexOf('.')) return
      if (typeof argv[key] === 'undefined') argv[key] = undefined
    })
    return argv
  }

  function applyDefaultsAndAliases (obj, aliases, defaults) {
    Object.keys(defaults).forEach(function (key) {
      if (!hasKey(obj, key.split('.'))) {
        setKey(obj, key.split('.'), defaults[key])

        ;(aliases[key] || []).forEach(function (x) {
          if (hasKey(obj, x.split('.'))) return
          setKey(obj, x.split('.'), defaults[key])
        })
      }
    })
  }

  function hasKey (obj, keys) {
    var o = obj

    if (!configuration['dot-notation']) keys = [keys.join('.')]

    keys.slice(0, -1).forEach(function (key) {
      o = (o[key] || {})
    })

    var key = keys[keys.length - 1]

    if (typeof o !== 'object') return false
    else return key in o
  }

  function setKey (obj, keys, value) {
    var o = obj

    if (!configuration['dot-notation']) keys = [keys.join('.')]

    keys.slice(0, -1).forEach(function (key, index) {
      // TODO(bcoe): in the next major version of yargs, switch to
      // Object.create(null) for dot notation:
      key = sanitizeKey(key)

      if (typeof o === 'object' && o[key] === undefined) {
        o[key] = {}
      }

      if (typeof o[key] !== 'object' || Array.isArray(o[key])) {
        // ensure that o[key] is an array, and that the last item is an empty object.
        if (Array.isArray(o[key])) {
          o[key].push({})
        } else {
          o[key] = [o[key], {}]
        }

        // we want to update the empty object at the end of the o[key] array, so set o to that object
        o = o[key][o[key].length - 1]
      } else {
        o = o[key]
      }
    })

    // TODO(bcoe): in the next major version of yargs, switch to
    // Object.create(null) for dot notation:
    const key = sanitizeKey(keys[keys.length - 1])

    const isTypeArray = checkAllAliases(keys.join('.'), flags.arrays)
    const isValueArray = Array.isArray(value)
    let duplicate = configuration['duplicate-arguments-array']

    // nargs has higher priority than duplicate
    if (!duplicate && checkAllAliases(key, flags.nargs)) {
      duplicate = true
      if ((!isUndefined(o[key]) && flags.nargs[key] === 1) || (Array.isArray(o[key]) && o[key].length === flags.nargs[key])) {
        o[key] = undefined
      }
    }

    if (value === increment) {
      o[key] = increment(o[key])
    } else if (Array.isArray(o[key])) {
      if (duplicate && isTypeArray && isValueArray) {
        o[key] = configuration['flatten-duplicate-arrays'] ? o[key].concat(value) : (Array.isArray(o[key][0]) ? o[key] : [o[key]]).concat([value])
      } else if (!duplicate && Boolean(isTypeArray) === Boolean(isValueArray)) {
        o[key] = value
      } else {
        o[key] = o[key].concat([value])
      }
    } else if (o[key] === undefined && isTypeArray) {
      o[key] = isValueArray ? value : [value]
    } else if (duplicate && !(o[key] === undefined || checkAllAliases(key, flags.bools) || checkAllAliases(keys.join('.'), flags.bools) || checkAllAliases(key, flags.counts))) {
      o[key] = [ o[key], value ]
    } else {
      o[key] = value
    }
  }

  // extend the aliases list with inferred aliases.
  function extendAliases (...args) {
    args.forEach(function (obj) {
      Object.keys(obj || {}).forEach(function (key) {
        // short-circuit if we've already added a key
        // to the aliases array, for example it might
        // exist in both 'opts.default' and 'opts.key'.
        if (flags.aliases[key]) return

        flags.aliases[key] = [].concat(aliases[key] || [])
        // For "--option-name", also set argv.optionName
        flags.aliases[key].concat(key).forEach(function (x) {
          if (/-/.test(x) && configuration['camel-case-expansion']) {
            var c = camelCase(x)
            if (c !== key && flags.aliases[key].indexOf(c) === -1) {
              flags.aliases[key].push(c)
              newAliases[c] = true
            }
          }
        })
        // For "--optionName", also set argv['option-name']
        flags.aliases[key].concat(key).forEach(function (x) {
          if (x.length > 1 && /[A-Z]/.test(x) && configuration['camel-case-expansion']) {
            var c = decamelize(x, '-')
            if (c !== key && flags.aliases[key].indexOf(c) === -1) {
              flags.aliases[key].push(c)
              newAliases[c] = true
            }
          }
        })
        flags.aliases[key].forEach(function (x) {
          flags.aliases[x] = [key].concat(flags.aliases[key].filter(function (y) {
            return x !== y
          }))
        })
      })
    })
  }

  // check if a flag is set for any of a key's aliases.
  function checkAllAliases (key, flag) {
    var isSet = false
    var toCheck = [].concat(flags.aliases[key] || [], key)

    toCheck.forEach(function (key) {
      if (flag[key]) isSet = flag[key]
    })

    return isSet
  }

  function setDefaulted (key) {
    [].concat(flags.aliases[key] || [], key).forEach(function (k) {
      flags.defaulted[k] = true
    })
  }

  function unsetDefaulted (key) {
    [].concat(flags.aliases[key] || [], key).forEach(function (k) {
      delete flags.defaulted[k]
    })
  }

  // make a best effor to pick a default value
  // for an option based on name and type.
  function defaultValue (key) {
    if (!checkAllAliases(key, flags.bools) &&
        !checkAllAliases(key, flags.counts) &&
        `${key}` in defaults) {
      return defaults[key]
    } else {
      return defaultForType(guessType(key))
    }
  }

  // return a default value, given the type of a flag.,
  // e.g., key of type 'string' will default to '', rather than 'true'.
  function defaultForType (type) {
    var def = {
      boolean: true,
      string: '',
      number: undefined,
      array: []
    }

    return def[type]
  }

  // given a flag, enforce a default type.
  function guessType (key) {
    var type = 'boolean'

    if (checkAllAliases(key, flags.strings)) type = 'string'
    else if (checkAllAliases(key, flags.numbers)) type = 'number'
    else if (checkAllAliases(key, flags.arrays)) type = 'array'

    return type
  }

  function isNumber (x) {
    if (x === null || x === undefined) return false
    // if loaded from config, may already be a number.
    if (typeof x === 'number') return true
    // hexadecimal.
    if (/^0x[0-9a-f]+$/i.test(x)) return true
    // don't treat 0123 as a number; as it drops the leading '0'.
    if (x.length > 1 && x[0] === '0') return false
    return /^[-]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x)
  }

  function isUndefined (num) {
    return num === undefined
  }

  return {
    argv: argv,
    error: error,
    aliases: flags.aliases,
    newAliases: newAliases,
    configuration: configuration
  }
}

// if any aliases reference each other, we should
// merge them together.
function combineAliases (aliases) {
  var aliasArrays = []
  var change = true
  var combined = {}

  // turn alias lookup hash {key: ['alias1', 'alias2']} into
  // a simple array ['key', 'alias1', 'alias2']
  Object.keys(aliases).forEach(function (key) {
    aliasArrays.push(
      [].concat(aliases[key], key)
    )
  })

  // combine arrays until zero changes are
  // made in an iteration.
  while (change) {
    change = false
    for (var i = 0; i < aliasArrays.length; i++) {
      for (var ii = i + 1; ii < aliasArrays.length; ii++) {
        var intersect = aliasArrays[i].filter(function (v) {
          return aliasArrays[ii].indexOf(v) !== -1
        })

        if (intersect.length) {
          aliasArrays[i] = aliasArrays[i].concat(aliasArrays[ii])
          aliasArrays.splice(ii, 1)
          change = true
          break
        }
      }
    }
  }

  // map arrays back to the hash-lookup (de-dupe while
  // we're at it).
  aliasArrays.forEach(function (aliasArray) {
    aliasArray = aliasArray.filter(function (v, i, self) {
      return self.indexOf(v) === i
    })
    combined[aliasArray.pop()] = aliasArray
  })

  return combined
}

// this function should only be called when a count is given as an arg
// it is NOT called to set a default value
// thus we can start the count at 1 instead of 0
function increment (orig) {
  return orig !== undefined ? orig + 1 : 1
}

function Parser (args, opts) {
  var result = parse(args.slice(), opts)

  return result.argv
}

// parse arguments and return detailed
// meta information, aliases, etc.
Parser.detailed = function (args, opts) {
  return parse(args.slice(), opts)
}

// TODO(bcoe): in the next major version of yargs, switch to
// Object.create(null) for dot notation:
function sanitizeKey (key) {
  if (key === '__proto__') return '___proto___'
  return key
}

module.exports = Parser
{
  "author": {
    "name": "Ben Coe",
    "email": "ben@npmjs.com"
  },
  "dependencies": {
    "camelcase": "^5.0.0",
    "decamelize": "^1.2.0"
  },
  "deprecated": false,
  "description": "the mighty option parser used by yargs",
  "devDependencies": {
    "chai": "^4.2.0",
    "coveralls": "^3.0.2",
    "mocha": "^5.2.0",
    "nyc": "^14.1.0",
    "standard": "^12.0.1",
    "standard-version": "^6.0.0"
  },
  "engine": {
    "node": ">=6"
  },
  "files": [
    "lib",
    "index.js"
  ],
  "homepage": "https://github.com/yargs/yargs-parser#readme",
  "license": "ISC",
  "main": "index.js",
  "name": "yargs-parser",
  "repository": {
    "url": "git+ssh://git@github.com/yargs/yargs-parser.git"
  },
  "version": "13.1.2"
}// take an un-split argv string and tokenize it.
module.exports = function (argString) {
  if (Array.isArray(argString)) {
    return argString.map(e => typeof e !== 'string' ? e + '' : e)
  }

  argString = argString.trim()

  var i = 0
  var prevC = null
  var c = null
  var opening = null
  var args = []

  for (var ii = 0; ii < argString.length; ii++) {
    prevC = c
    c = argString.charAt(ii)

    // split on spaces unless we're in quotes.
    if (c === ' ' && !opening) {
      if (!(prevC === ' ')) {
        i++
      }
      continue
    }

    // don't split the string if we're in matching
    // opening or closing single and double quotes.
    if (c === opening) {
      opening = null
    } else if ((c === "'" || c === '"') && !opening) {
      opening = c
    }

    if (!args[i]) args[i] = ''
    args[i] += c
  }

  return args
}
The MIT License (MIT)

Copyright (c) 2014 Josh Wolfe

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var fs = require("fs");
var zlib = require("zlib");
var fd_slicer = require("fd-slicer");
var crc32 = require("buffer-crc32");
var util = require("util");
var EventEmitter = require("events").EventEmitter;
var Transform = require("stream").Transform;
var PassThrough = require("stream").PassThrough;
var Writable = require("stream").Writable;

exports.open = open;
exports.fromFd = fromFd;
exports.fromBuffer = fromBuffer;
exports.fromRandomAccessReader = fromRandomAccessReader;
exports.dosDateTimeToDate = dosDateTimeToDate;
exports.validateFileName = validateFileName;
exports.ZipFile = ZipFile;
exports.Entry = Entry;
exports.RandomAccessReader = RandomAccessReader;

function open(path, options, callback) {
  if (typeof options === "function") {
    callback = options;
    options = null;
  }
  if (options == null) options = {};
  if (options.autoClose == null) options.autoClose = true;
  if (options.lazyEntries == null) options.lazyEntries = false;
  if (options.decodeStrings == null) options.decodeStrings = true;
  if (options.validateEntrySizes == null) options.validateEntrySizes = true;
  if (options.strictFileNames == null) options.strictFileNames = false;
  if (callback == null) callback = defaultCallback;
  fs.open(path, "r", function(err, fd) {
    if (err) return callback(err);
    fromFd(fd, options, function(err, zipfile) {
      if (err) fs.close(fd, defaultCallback);
      callback(err, zipfile);
    });
  });
}

function fromFd(fd, options, callback) {
  if (typeof options === "function") {
    callback = options;
    options = null;
  }
  if (options == null) options = {};
  if (options.autoClose == null) options.autoClose = false;
  if (options.lazyEntries == null) options.lazyEntries = false;
  if (options.decodeStrings == null) options.decodeStrings = true;
  if (options.validateEntrySizes == null) options.validateEntrySizes = true;
  if (options.strictFileNames == null) options.strictFileNames = false;
  if (callback == null) callback = defaultCallback;
  fs.fstat(fd, function(err, stats) {
    if (err) return callback(err);
    var reader = fd_slicer.createFromFd(fd, {autoClose: true});
    fromRandomAccessReader(reader, stats.size, options, callback);
  });
}

function fromBuffer(buffer, options, callback) {
  if (typeof options === "function") {
    callback = options;
    options = null;
  }
  if (options == null) options = {};
  options.autoClose = false;
  if (options.lazyEntries == null) options.lazyEntries = false;
  if (options.decodeStrings == null) options.decodeStrings = true;
  if (options.validateEntrySizes == null) options.validateEntrySizes = true;
  if (options.strictFileNames == null) options.strictFileNames = false;
  // limit the max chunk size. see https://github.com/thejoshwolfe/yauzl/issues/87
  var reader = fd_slicer.createFromBuffer(buffer, {maxChunkSize: 0x10000});
  fromRandomAccessReader(reader, buffer.length, options, callback);
}

function fromRandomAccessReader(reader, totalSize, options, callback) {
  if (typeof options === "function") {
    callback = options;
    options = null;
  }
  if (options == null) options = {};
  if (options.autoClose == null) options.autoClose = true;
  if (options.lazyEntries == null) options.lazyEntries = false;
  if (options.decodeStrings == null) options.decodeStrings = true;
  var decodeStrings = !!options.decodeStrings;
  if (options.validateEntrySizes == null) options.validateEntrySizes = true;
  if (options.strictFileNames == null) options.strictFileNames = false;
  if (callback == null) callback = defaultCallback;
  if (typeof totalSize !== "number") throw new Error("expected totalSize parameter to be a number");
  if (totalSize > Number.MAX_SAFE_INTEGER) {
    throw new Error("zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double.");
  }

  // the matching unref() call is in zipfile.close()
  reader.ref();

  // eocdr means End of Central Directory Record.
  // search backwards for the eocdr signature.
  // the last field of the eocdr is a variable-length comment.
  // the comment size is encoded in a 2-byte field in the eocdr, which we can't find without trudging backwards through the comment to find it.
  // as a consequence of this design decision, it's possible to have ambiguous zip file metadata if a coherent eocdr was in the comment.
  // we search backwards for a eocdr signature, and hope that whoever made the zip file was smart enough to forbid the eocdr signature in the comment.
  var eocdrWithoutCommentSize = 22;
  var maxCommentSize = 0xffff; // 2-byte size
  var bufferSize = Math.min(eocdrWithoutCommentSize + maxCommentSize, totalSize);
  var buffer = newBuffer(bufferSize);
  var bufferReadStart = totalSize - buffer.length;
  readAndAssertNoEof(reader, buffer, 0, bufferSize, bufferReadStart, function(err) {
    if (err) return callback(err);
    for (var i = bufferSize - eocdrWithoutCommentSize; i >= 0; i -= 1) {
      if (buffer.readUInt32LE(i) !== 0x06054b50) continue;
      // found eocdr
      var eocdrBuffer = buffer.slice(i);

      // 0 - End of central directory signature = 0x06054b50
      // 4 - Number of this disk
      var diskNumber = eocdrBuffer.readUInt16LE(4);
      if (diskNumber !== 0) {
        return callback(new Error("multi-disk zip files are not supported: found disk number: " + diskNumber));
      }
      // 6 - Disk where central directory starts
      // 8 - Number of central directory records on this disk
      // 10 - Total number of central directory records
      var entryCount = eocdrBuffer.readUInt16LE(10);
      // 12 - Size of central directory (bytes)
      // 16 - Offset of start of central directory, relative to start of archive
      var centralDirectoryOffset = eocdrBuffer.readUInt32LE(16);
      // 20 - Comment length
      var commentLength = eocdrBuffer.readUInt16LE(20);
      var expectedCommentLength = eocdrBuffer.length - eocdrWithoutCommentSize;
      if (commentLength !== expectedCommentLength) {
        return callback(new Error("invalid comment length. expected: " + expectedCommentLength + ". found: " + commentLength));
      }
      // 22 - Comment
      // the encoding is always cp437.
      var comment = decodeStrings ? decodeBuffer(eocdrBuffer, 22, eocdrBuffer.length, false)
                                  : eocdrBuffer.slice(22);

      if (!(entryCount === 0xffff || centralDirectoryOffset === 0xffffffff)) {
        return callback(null, new ZipFile(reader, centralDirectoryOffset, totalSize, entryCount, comment, options.autoClose, options.lazyEntries, decodeStrings, options.validateEntrySizes, options.strictFileNames));
      }

      // ZIP64 format

      // ZIP64 Zip64 end of central directory locator
      var zip64EocdlBuffer = newBuffer(20);
      var zip64EocdlOffset = bufferReadStart + i - zip64EocdlBuffer.length;
      readAndAssertNoEof(reader, zip64EocdlBuffer, 0, zip64EocdlBuffer.length, zip64EocdlOffset, function(err) {
        if (err) return callback(err);

        // 0 - zip64 end of central dir locator signature = 0x07064b50
        if (zip64EocdlBuffer.readUInt32LE(0) !== 0x07064b50) {
          return callback(new Error("invalid zip64 end of central directory locator signature"));
        }
        // 4 - number of the disk with the start of the zip64 end of central directory
        // 8 - relative offset of the zip64 end of central directory record
        var zip64EocdrOffset = readUInt64LE(zip64EocdlBuffer, 8);
        // 16 - total number of disks

        // ZIP64 end of central directory record
        var zip64EocdrBuffer = newBuffer(56);
        readAndAssertNoEof(reader, zip64EocdrBuffer, 0, zip64EocdrBuffer.length, zip64EocdrOffset, function(err) {
          if (err) return callback(err);

          // 0 - zip64 end of central dir signature                           4 bytes  (0x06064b50)
          if (zip64EocdrBuffer.readUInt32LE(0) !== 0x06064b50) {
            return callback(new Error("invalid zip64 end of central directory record signature"));
          }
          // 4 - size of zip64 end of central directory record                8 bytes
          // 12 - version made by                                             2 bytes
          // 14 - version needed to extract                                   2 bytes
          // 16 - number of this disk                                         4 bytes
          // 20 - number of the disk with the start of the central directory  4 bytes
          // 24 - total number of entries in the central directory on this disk         8 bytes
          // 32 - total number of entries in the central directory            8 bytes
          entryCount = readUInt64LE(zip64EocdrBuffer, 32);
          // 40 - size of the central directory                               8 bytes
          // 48 - offset of start of central directory with respect to the starting disk number     8 bytes
          centralDirectoryOffset = readUInt64LE(zip64EocdrBuffer, 48);
          // 56 - zip64 extensible data sector                                (variable size)
          return callback(null, new ZipFile(reader, centralDirectoryOffset, totalSize, entryCount, comment, options.autoClose, options.lazyEntries, decodeStrings, options.validateEntrySizes, options.strictFileNames));
        });
      });
      return;
    }
    callback(new Error("end of central directory record signature not found"));
  });
}

util.inherits(ZipFile, EventEmitter);
function ZipFile(reader, centralDirectoryOffset, fileSize, entryCount, comment, autoClose, lazyEntries, decodeStrings, validateEntrySizes, strictFileNames) {
  var self = this;
  EventEmitter.call(self);
  self.reader = reader;
  // forward close events
  self.reader.on("error", function(err) {
    // error closing the fd
    emitError(self, err);
  });
  self.reader.once("close", function() {
    self.emit("close");
  });
  self.readEntryCursor = centralDirectoryOffset;
  self.fileSize = fileSize;
  self.entryCount = entryCount;
  self.comment = comment;
  self.entriesRead = 0;
  self.autoClose = !!autoClose;
  self.lazyEntries = !!lazyEntries;
  self.decodeStrings = !!decodeStrings;
  self.validateEntrySizes = !!validateEntrySizes;
  self.strictFileNames = !!strictFileNames;
  self.isOpen = true;
  self.emittedError = false;

  if (!self.lazyEntries) self._readEntry();
}
ZipFile.prototype.close = function() {
  if (!this.isOpen) return;
  this.isOpen = false;
  this.reader.unref();
};

function emitErrorAndAutoClose(self, err) {
  if (self.autoClose) self.close();
  emitError(self, err);
}
function emitError(self, err) {
  if (self.emittedError) return;
  self.emittedError = true;
  self.emit("error", err);
}

ZipFile.prototype.readEntry = function() {
  if (!this.lazyEntries) throw new Error("readEntry() called without lazyEntries:true");
  this._readEntry();
};
ZipFile.prototype._readEntry = function() {
  var self = this;
  if (self.entryCount === self.entriesRead) {
    // done with metadata
    setImmediate(function() {
      if (self.autoClose) self.close();
      if (self.emittedError) return;
      self.emit("end");
    });
    return;
  }
  if (self.emittedError) return;
  var buffer = newBuffer(46);
  readAndAssertNoEof(self.reader, buffer, 0, buffer.length, self.readEntryCursor, function(err) {
    if (err) return emitErrorAndAutoClose(self, err);
    if (self.emittedError) return;
    var entry = new Entry();
    // 0 - Central directory file header signature
    var signature = buffer.readUInt32LE(0);
    if (signature !== 0x02014b50) return emitErrorAndAutoClose(self, new Error("invalid central directory file header signature: 0x" + signature.toString(16)));
    // 4 - Version made by
    entry.versionMadeBy = buffer.readUInt16LE(4);
    // 6 - Version needed to extract (minimum)
    entry.versionNeededToExtract = buffer.readUInt16LE(6);
    // 8 - General purpose bit flag
    entry.generalPurposeBitFlag = buffer.readUInt16LE(8);
    // 10 - Compression method
    entry.compressionMethod = buffer.readUInt16LE(10);
    // 12 - File last modification time
    entry.lastModFileTime = buffer.readUInt16LE(12);
    // 14 - File last modification date
    entry.lastModFileDate = buffer.readUInt16LE(14);
    // 16 - CRC-32
    entry.crc32 = buffer.readUInt32LE(16);
    // 20 - Compressed size
    entry.compressedSize = buffer.readUInt32LE(20);
    // 24 - Uncompressed size
    entry.uncompressedSize = buffer.readUInt32LE(24);
    // 28 - File name length (n)
    entry.fileNameLength = buffer.readUInt16LE(28);
    // 30 - Extra field length (m)
    entry.extraFieldLength = buffer.readUInt16LE(30);
    // 32 - File comment length (k)
    entry.fileCommentLength = buffer.readUInt16LE(32);
    // 34 - Disk number where file starts
    // 36 - Internal file attributes
    entry.internalFileAttributes = buffer.readUInt16LE(36);
    // 38 - External file attributes
    entry.externalFileAttributes = buffer.readUInt32LE(38);
    // 42 - Relative offset of local file header
    entry.relativeOffsetOfLocalHeader = buffer.readUInt32LE(42);

    if (entry.generalPurposeBitFlag & 0x40) return emitErrorAndAutoClose(self, new Error("strong encryption is not supported"));

    self.readEntryCursor += 46;

    buffer = newBuffer(entry.fileNameLength + entry.extraFieldLength + entry.fileCommentLength);
    readAndAssertNoEof(self.reader, buffer, 0, buffer.length, self.readEntryCursor, function(err) {
      if (err) return emitErrorAndAutoClose(self, err);
      if (self.emittedError) return;
      // 46 - File name
      var isUtf8 = (entry.generalPurposeBitFlag & 0x800) !== 0;
      entry.fileName = self.decodeStrings ? decodeBuffer(buffer, 0, entry.fileNameLength, isUtf8)
                                          : buffer.slice(0, entry.fileNameLength);

      // 46+n - Extra field
      var fileCommentStart = entry.fileNameLength + entry.extraFieldLength;
      var extraFieldBuffer = buffer.slice(entry.fileNameLength, fileCommentStart);
      entry.extraFields = [];
      var i = 0;
      while (i < extraFieldBuffer.length - 3) {
        var headerId = extraFieldBuffer.readUInt16LE(i + 0);
        var dataSize = extraFieldBuffer.readUInt16LE(i + 2);
        var dataStart = i + 4;
        var dataEnd = dataStart + dataSize;
        if (dataEnd > extraFieldBuffer.length) return emitErrorAndAutoClose(self, new Error("extra field length exceeds extra field buffer size"));
        var dataBuffer = newBuffer(dataSize);
        extraFieldBuffer.copy(dataBuffer, 0, dataStart, dataEnd);
        entry.extraFields.push({
          id: headerId,
          data: dataBuffer,
        });
        i = dataEnd;
      }

      // 46+n+m - File comment
      entry.fileComment = self.decodeStrings ? decodeBuffer(buffer, fileCommentStart, fileCommentStart + entry.fileCommentLength, isUtf8)
                                             : buffer.slice(fileCommentStart, fileCommentStart + entry.fileCommentLength);
      // compatibility hack for https://github.com/thejoshwolfe/yauzl/issues/47
      entry.comment = entry.fileComment;

      self.readEntryCursor += buffer.length;
      self.entriesRead += 1;

      if (entry.uncompressedSize            === 0xffffffff ||
          entry.compressedSize              === 0xffffffff ||
          entry.relativeOffsetOfLocalHeader === 0xffffffff) {
        // ZIP64 format
        // find the Zip64 Extended Information Extra Field
        var zip64EiefBuffer = null;
        for (var i = 0; i < entry.extraFields.length; i++) {
          var extraField = entry.extraFields[i];
          if (extraField.id === 0x0001) {
            zip64EiefBuffer = extraField.data;
            break;
          }
        }
        if (zip64EiefBuffer == null) {
          return emitErrorAndAutoClose(self, new Error("expected zip64 extended information extra field"));
        }
        var index = 0;
        // 0 - Original Size          8 bytes
        if (entry.uncompressedSize === 0xffffffff) {
          if (index + 8 > zip64EiefBuffer.length) {
            return emitErrorAndAutoClose(self, new Error("zip64 extended information extra field does not include uncompressed size"));
          }
          entry.uncompressedSize = readUInt64LE(zip64EiefBuffer, index);
          index += 8;
        }
        // 8 - Compressed Size        8 bytes
        if (entry.compressedSize === 0xffffffff) {
          if (index + 8 > zip64EiefBuffer.length) {
            return emitErrorAndAutoClose(self, new Error("zip64 extended information extra field does not include compressed size"));
          }
          entry.compressedSize = readUInt64LE(zip64EiefBuffer, index);
          index += 8;
        }
        // 16 - Relative Header Offset 8 bytes
        if (entry.relativeOffsetOfLocalHeader === 0xffffffff) {
          if (index + 8 > zip64EiefBuffer.length) {
            return emitErrorAndAutoClose(self, new Error("zip64 extended information extra field does not include relative header offset"));
          }
          entry.relativeOffsetOfLocalHeader = readUInt64LE(zip64EiefBuffer, index);
          index += 8;
        }
        // 24 - Disk Start Number      4 bytes
      }

      // check for Info-ZIP Unicode Path Extra Field (0x7075)
      // see https://github.com/thejoshwolfe/yauzl/issues/33
      if (self.decodeStrings) {
        for (var i = 0; i < entry.extraFields.length; i++) {
          var extraField = entry.extraFields[i];
          if (extraField.id === 0x7075) {
            if (extraField.data.length < 6) {
              // too short to be meaningful
              continue;
            }
            // Version       1 byte      version of this extra field, currently 1
            if (extraField.data.readUInt8(0) !== 1) {
              // > Changes may not be backward compatible so this extra
              // > field should not be used if the version is not recognized.
              continue;
            }
            // NameCRC32     4 bytes     File Name Field CRC32 Checksum
            var oldNameCrc32 = extraField.data.readUInt32LE(1);
            if (crc32.unsigned(buffer.slice(0, entry.fileNameLength)) !== oldNameCrc32) {
              // > If the CRC check fails, this UTF-8 Path Extra Field should be
              // > ignored and the File Name field in the header should be used instead.
              continue;
            }
            // UnicodeName   Variable    UTF-8 version of the entry File Name
            entry.fileName = decodeBuffer(extraField.data, 5, extraField.data.length, true);
            break;
          }
        }
      }

      // validate file size
      if (self.validateEntrySizes && entry.compressionMethod === 0) {
        var expectedCompressedSize = entry.uncompressedSize;
        if (entry.isEncrypted()) {
          // traditional encryption prefixes the file data with a header
          expectedCompressedSize += 12;
        }
        if (entry.compressedSize !== expectedCompressedSize) {
          var msg = "compressed/uncompressed size mismatch for stored file: " + entry.compressedSize + " != " + entry.uncompressedSize;
          return emitErrorAndAutoClose(self, new Error(msg));
        }
      }

      if (self.decodeStrings) {
        if (!self.strictFileNames) {
          // allow backslash
          entry.fileName = entry.fileName.replace(/\\/g, "/");
        }
        var errorMessage = validateFileName(entry.fileName, self.validateFileNameOptions);
        if (errorMessage != null) return emitErrorAndAutoClose(self, new Error(errorMessage));
      }
      self.emit("entry", entry);

      if (!self.lazyEntries) self._readEntry();
    });
  });
};

ZipFile.prototype.openReadStream = function(entry, options, callback) {
  var self = this;
  // parameter validation
  var relativeStart = 0;
  var relativeEnd = entry.compressedSize;
  if (callback == null) {
    callback = options;
    options = {};
  } else {
    // validate options that the caller has no excuse to get wrong
    if (options.decrypt != null) {
      if (!entry.isEncrypted()) {
        throw new Error("options.decrypt can only be specified for encrypted entries");
      }
      if (options.decrypt !== false) throw new Error("invalid options.decrypt value: " + options.decrypt);
      if (entry.isCompressed()) {
        if (options.decompress !== false) throw new Error("entry is encrypted and compressed, and options.decompress !== false");
      }
    }
    if (options.decompress != null) {
      if (!entry.isCompressed()) {
        throw new Error("options.decompress can only be specified for compressed entries");
      }
      if (!(options.decompress === false || options.decompress === true)) {
        throw new Error("invalid options.decompress value: " + options.decompress);
      }
    }
    if (options.start != null || options.end != null) {
      if (entry.isCompressed() && options.decompress !== false) {
        throw new Error("start/end range not allowed for compressed entry without options.decompress === false");
      }
      if (entry.isEncrypted() && options.decrypt !== false) {
        throw new Error("start/end range not allowed for encrypted entry without options.decrypt === false");
      }
    }
    if (options.start != null) {
      relativeStart = options.start;
      if (relativeStart < 0) throw new Error("options.start < 0");
      if (relativeStart > entry.compressedSize) throw new Error("options.start > entry.compressedSize");
    }
    if (options.end != null) {
      relativeEnd = options.end;
      if (relativeEnd < 0) throw new Error("options.end < 0");
      if (relativeEnd > entry.compressedSize) throw new Error("options.end > entry.compressedSize");
      if (relativeEnd < relativeStart) throw new Error("options.end < options.start");
    }
  }
  // any further errors can either be caused by the zipfile,
  // or were introduced in a minor version of yauzl,
  // so should be passed to the client rather than thrown.
  if (!self.isOpen) return callback(new Error("closed"));
  if (entry.isEncrypted()) {
    if (options.decrypt !== false) return callback(new Error("entry is encrypted, and options.decrypt !== false"));
  }
  // make sure we don't lose the fd before we open the actual read stream
  self.reader.ref();
  var buffer = newBuffer(30);
  readAndAssertNoEof(self.reader, buffer, 0, buffer.length, entry.relativeOffsetOfLocalHeader, function(err) {
    try {
      if (err) return callback(err);
      // 0 - Local file header signature = 0x04034b50
      var signature = buffer.readUInt32LE(0);
      if (signature !== 0x04034b50) {
        return callback(new Error("invalid local file header signature: 0x" + signature.toString(16)));
      }
      // all this should be redundant
      // 4 - Version needed to extract (minimum)
      // 6 - General purpose bit flag
      // 8 - Compression method
      // 10 - File last modification time
      // 12 - File last modification date
      // 14 - CRC-32
      // 18 - Compressed size
      // 22 - Uncompressed size
      // 26 - File name length (n)
      var fileNameLength = buffer.readUInt16LE(26);
      // 28 - Extra field length (m)
      var extraFieldLength = buffer.readUInt16LE(28);
      // 30 - File name
      // 30+n - Extra field
      var localFileHeaderEnd = entry.relativeOffsetOfLocalHeader + buffer.length + fileNameLength + extraFieldLength;
      var decompress;
      if (entry.compressionMethod === 0) {
        // 0 - The file is stored (no compression)
        decompress = false;
      } else if (entry.compressionMethod === 8) {
        // 8 - The file is Deflated
        decompress = options.decompress != null ? options.decompress : true;
      } else {
        return callback(new Error("unsupported compression method: " + entry.compressionMethod));
      }
      var fileDataStart = localFileHeaderEnd;
      var fileDataEnd = fileDataStart + entry.compressedSize;
      if (entry.compressedSize !== 0) {
        // bounds check now, because the read streams will probably not complain loud enough.
        // since we're dealing with an unsigned offset plus an unsigned size,
        // we only have 1 thing to check for.
        if (fileDataEnd > self.fileSize) {
          return callback(new Error("file data overflows file bounds: " +
              fileDataStart + " + " + entry.compressedSize + " > " + self.fileSize));
        }
      }
      var readStream = self.reader.createReadStream({
        start: fileDataStart + relativeStart,
        end: fileDataStart + relativeEnd,
      });
      var endpointStream = readStream;
      if (decompress) {
        var destroyed = false;
        var inflateFilter = zlib.createInflateRaw();
        readStream.on("error", function(err) {
          // setImmediate here because errors can be emitted during the first call to pipe()
          setImmediate(function() {
            if (!destroyed) inflateFilter.emit("error", err);
          });
        });
        readStream.pipe(inflateFilter);

        if (self.validateEntrySizes) {
          endpointStream = new AssertByteCountStream(entry.uncompressedSize);
          inflateFilter.on("error", function(err) {
            // forward zlib errors to the client-visible stream
            setImmediate(function() {
              if (!destroyed) endpointStream.emit("error", err);
            });
          });
          inflateFilter.pipe(endpointStream);
        } else {
          // the zlib filter is the client-visible stream
          endpointStream = inflateFilter;
        }
        // this is part of yauzl's API, so implement this function on the client-visible stream
        endpointStream.destroy = function() {
          destroyed = true;
          if (inflateFilter !== endpointStream) inflateFilter.unpipe(endpointStream);
          readStream.unpipe(inflateFilter);
          // TODO: the inflateFilter may cause a memory leak. see Issue #27.
          readStream.destroy();
        };
      }
      callback(null, endpointStream);
    } finally {
      self.reader.unref();
    }
  });
};

function Entry() {
}
Entry.prototype.getLastModDate = function() {
  return dosDateTimeToDate(this.lastModFileDate, this.lastModFileTime);
};
Entry.prototype.isEncrypted = function() {
  return (this.generalPurposeBitFlag & 0x1) !== 0;
};
Entry.prototype.isCompressed = function() {
  return this.compressionMethod === 8;
};

function dosDateTimeToDate(date, time) {
  var day = date & 0x1f; // 1-31
  var month = (date >> 5 & 0xf) - 1; // 1-12, 0-11
  var year = (date >> 9 & 0x7f) + 1980; // 0-128, 1980-2108

  var millisecond = 0;
  var second = (time & 0x1f) * 2; // 0-29, 0-58 (even numbers)
  var minute = time >> 5 & 0x3f; // 0-59
  var hour = time >> 11 & 0x1f; // 0-23

  return new Date(year, month, day, hour, minute, second, millisecond);
}

function validateFileName(fileName) {
  if (fileName.indexOf("\\") !== -1) {
    return "invalid characters in fileName: " + fileName;
  }
  if (/^[a-zA-Z]:/.test(fileName) || /^\//.test(fileName)) {
    return "absolute path: " + fileName;
  }
  if (fileName.split("/").indexOf("..") !== -1) {
    return "invalid relative path: " + fileName;
  }
  // all good
  return null;
}

function readAndAssertNoEof(reader, buffer, offset, length, position, callback) {
  if (length === 0) {
    // fs.read will throw an out-of-bounds error if you try to read 0 bytes from a 0 byte file
    return setImmediate(function() { callback(null, newBuffer(0)); });
  }
  reader.read(buffer, offset, length, position, function(err, bytesRead) {
    if (err) return callback(err);
    if (bytesRead < length) {
      return callback(new Error("unexpected EOF"));
    }
    callback();
  });
}

util.inherits(AssertByteCountStream, Transform);
function AssertByteCountStream(byteCount) {
  Transform.call(this);
  this.actualByteCount = 0;
  this.expectedByteCount = byteCount;
}
AssertByteCountStream.prototype._transform = function(chunk, encoding, cb) {
  this.actualByteCount += chunk.length;
  if (this.actualByteCount > this.expectedByteCount) {
    var msg = "too many bytes in the stream. expected " + this.expectedByteCount + ". got at least " + this.actualByteCount;
    return cb(new Error(msg));
  }
  cb(null, chunk);
};
AssertByteCountStream.prototype._flush = function(cb) {
  if (this.actualByteCount < this.expectedByteCount) {
    var msg = "not enough bytes in the stream. expected " + this.expectedByteCount + ". got only " + this.actualByteCount;
    return cb(new Error(msg));
  }
  cb();
};

util.inherits(RandomAccessReader, EventEmitter);
function RandomAccessReader() {
  EventEmitter.call(this);
  this.refCount = 0;
}
RandomAccessReader.prototype.ref = function() {
  this.refCount += 1;
};
RandomAccessReader.prototype.unref = function() {
  var self = this;
  self.refCount -= 1;

  if (self.refCount > 0) return;
  if (self.refCount < 0) throw new Error("invalid unref");

  self.close(onCloseDone);

  function onCloseDone(err) {
    if (err) return self.emit('error', err);
    self.emit('close');
  }
};
RandomAccessReader.prototype.createReadStream = function(options) {
  var start = options.start;
  var end = options.end;
  if (start === end) {
    var emptyStream = new PassThrough();
    setImmediate(function() {
      emptyStream.end();
    });
    return emptyStream;
  }
  var stream = this._readStreamForRange(start, end);

  var destroyed = false;
  var refUnrefFilter = new RefUnrefFilter(this);
  stream.on("error", function(err) {
    setImmediate(function() {
      if (!destroyed) refUnrefFilter.emit("error", err);
    });
  });
  refUnrefFilter.destroy = function() {
    stream.unpipe(refUnrefFilter);
    refUnrefFilter.unref();
    stream.destroy();
  };

  var byteCounter = new AssertByteCountStream(end - start);
  refUnrefFilter.on("error", function(err) {
    setImmediate(function() {
      if (!destroyed) byteCounter.emit("error", err);
    });
  });
  byteCounter.destroy = function() {
    destroyed = true;
    refUnrefFilter.unpipe(byteCounter);
    refUnrefFilter.destroy();
  };

  return stream.pipe(refUnrefFilter).pipe(byteCounter);
};
RandomAccessReader.prototype._readStreamForRange = function(start, end) {
  throw new Error("not implemented");
};
RandomAccessReader.prototype.read = function(buffer, offset, length, position, callback) {
  var readStream = this.createReadStream({start: position, end: position + length});
  var writeStream = new Writable();
  var written = 0;
  writeStream._write = function(chunk, encoding, cb) {
    chunk.copy(buffer, offset + written, 0, chunk.length);
    written += chunk.length;
    cb();
  };
  writeStream.on("finish", callback);
  readStream.on("error", function(error) {
    callback(error);
  });
  readStream.pipe(writeStream);
};
RandomAccessReader.prototype.close = function(callback) {
  setImmediate(callback);
};

util.inherits(RefUnrefFilter, PassThrough);
function RefUnrefFilter(context) {
  PassThrough.call(this);
  this.context = context;
  this.context.ref();
  this.unreffedYet = false;
}
RefUnrefFilter.prototype._flush = function(cb) {
  this.unref();
  cb();
};
RefUnrefFilter.prototype.unref = function(cb) {
  if (this.unreffedYet) return;
  this.unreffedYet = true;
  this.context.unref();
};

var cp437 = '\u0000â˜ºâ˜»â™¥â™¦â™£â™ â€¢â—˜â—‹â—™â™‚â™€â™ªâ™«â˜¼â–ºâ—„â†•â€¼Â¶Â§â–¬â†¨â†‘â†“â†’â†�âˆŸâ†”â–²â–¼ !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~âŒ‚Ã‡Ã¼Ã©Ã¢Ã¤Ã Ã¥Ã§ÃªÃ«Ã¨Ã¯Ã®Ã¬Ã„Ã…Ã‰Ã¦Ã†Ã´Ã¶Ã²Ã»Ã¹Ã¿Ã–ÃœÂ¢Â£Â¥â‚§Æ’Ã¡Ã­Ã³ÃºÃ±Ã‘ÂªÂºÂ¿âŒ�Â¬Â½Â¼Â¡Â«Â»â–‘â–’â–“â”‚â”¤â•¡â•¢â•–â••â•£â•‘â•—â•�â•œâ•›â”�â””â”´â”¬â”œâ”€â”¼â•žâ•Ÿâ•šâ•”â•©â•¦â• â•�â•¬â•§â•¨â•¤â•¥â•™â•˜â•’â•“â•«â•ªâ”˜â”Œâ–ˆâ–„â–Œâ–�â–€Î±ÃŸÎ“Ï€Î£ÏƒÂµÏ„Î¦Î˜Î©Î´âˆžÏ†Îµâˆ©â‰¡Â±â‰¥â‰¤âŒ âŒ¡Ã·â‰ˆÂ°âˆ™Â·âˆšâ�¿Â²â– Â ';
function decodeBuffer(buffer, start, end, isUtf8) {
  if (isUtf8) {
    return buffer.toString("utf8", start, end);
  } else {
    var result = "";
    for (var i = start; i < end; i++) {
      result += cp437[buffer[i]];
    }
    return result;
  }
}

function readUInt64LE(buffer, offset) {
  // there is no native function for this, because we can't actually store 64-bit integers precisely.
  // after 53 bits, JavaScript's Number type (IEEE 754 double) can't store individual integers anymore.
  // but since 53 bits is a whole lot more than 32 bits, we do our best anyway.
  var lower32 = buffer.readUInt32LE(offset);
  var upper32 = buffer.readUInt32LE(offset + 4);
  // we can't use bitshifting here, because JavaScript bitshifting only works on 32-bit integers.
  return upper32 * 0x100000000 + lower32;
  // as long as we're bounds checking the result of this function against the total file size,
  // we'll catch any overflow errors, because we already made sure the total file size was within reason.
}

// Node 10 deprecated new Buffer().
var newBuffer;
if (typeof Buffer.allocUnsafe === "function") {
  newBuffer = function(len) {
    return Buffer.allocUnsafe(len);
  };
} else {
  newBuffer = function(len) {
    return new Buffer(len);
  };
}

function defaultCallback(err) {
  if (err) throw err;
}
{
  "author": {
    "name": "Josh Wolfe",
    "email": "thejoshwolfe@gmail.com"
  },
  "dependencies": {
    "buffer-crc32": "~0.2.3",
    "fd-slicer": "~1.1.0"
  },
  "deprecated": false,
  "description": "yet another unzip library for node",
  "devDependencies": {
    "bl": "~1.0.0",
    "istanbul": "~0.3.4",
    "pend": "~1.2.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/thejoshwolfe/yauzl",
  "license": "MIT",
  "main": "index.js",
  "name": "yauzl",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/thejoshwolfe/yauzl.git"
  },
  "version": "2.10.0"
}'use strict';

module.exports = options => {
	options = Object.assign({
		onlyFirst: false
	}, options);

	const pattern = [
		'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
		'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
	].join('|');

	return new RegExp(pattern, options.onlyFirst ? undefined : 'g');
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Regular expression for matching ANSI escape codes",
  "devDependencies": {
    "ava": "^0.25.0",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/ansi-regex#readme",
  "license": "MIT",
  "name": "ansi-regex",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/ansi-regex.git"
  },
  "version": "4.1.0"
}'use strict';
/* eslint-disable yoda */
module.exports = x => {
	if (Number.isNaN(x)) {
		return false;
	}

	// code points are derived from:
	// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt
	if (
		x >= 0x1100 && (
			x <= 0x115f ||  // Hangul Jamo
			x === 0x2329 || // LEFT-POINTING ANGLE BRACKET
			x === 0x232a || // RIGHT-POINTING ANGLE BRACKET
			// CJK Radicals Supplement .. Enclosed CJK Letters and Months
			(0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||
			// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
			(0x3250 <= x && x <= 0x4dbf) ||
			// CJK Unified Ideographs .. Yi Radicals
			(0x4e00 <= x && x <= 0xa4c6) ||
			// Hangul Jamo Extended-A
			(0xa960 <= x && x <= 0xa97c) ||
			// Hangul Syllables
			(0xac00 <= x && x <= 0xd7a3) ||
			// CJK Compatibility Ideographs
			(0xf900 <= x && x <= 0xfaff) ||
			// Vertical Forms
			(0xfe10 <= x && x <= 0xfe19) ||
			// CJK Compatibility Forms .. Small Form Variants
			(0xfe30 <= x && x <= 0xfe6b) ||
			// Halfwidth and Fullwidth Forms
			(0xff01 <= x && x <= 0xff60) ||
			(0xffe0 <= x && x <= 0xffe6) ||
			// Kana Supplement
			(0x1b000 <= x && x <= 0x1b001) ||
			// Enclosed Ideographic Supplement
			(0x1f200 <= x && x <= 0x1f251) ||
			// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
			(0x20000 <= x && x <= 0x3fffd)
		)
	) {
		return true;
	}

	return false;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if the character represented by a given Unicode code point is fullwidth",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/is-fullwidth-code-point#readme",
  "license": "MIT",
  "name": "is-fullwidth-code-point",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git"
  },
  "version": "2.0.0"
}'use strict';
const stripAnsi = require('strip-ansi');
const isFullwidthCodePoint = require('is-fullwidth-code-point');
const emojiRegex = require('emoji-regex')();

module.exports = input => {
	input = input.replace(emojiRegex, '  ');

	if (typeof input !== 'string' || input.length === 0) {
		return 0;
	}

	input = stripAnsi(input);

	let width = 0;

	for (let i = 0; i < input.length; i++) {
		const code = input.codePointAt(i);

		// Ignore control characters
		if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {
			continue;
		}

		// Ignore combining characters
		if (code >= 0x300 && code <= 0x36F) {
			continue;
		}

		// Surrogates
		if (code > 0xFFFF) {
			i++;
		}

		width += isFullwidthCodePoint(code) ? 2 : 1;
	}

	return width;
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "emoji-regex": "^7.0.1",
    "is-fullwidth-code-point": "^2.0.0",
    "strip-ansi": "^5.1.0"
  },
  "deprecated": false,
  "description": "Get the visual width of a string - the number of columns required to display it",
  "devDependencies": {
    "ava": "^1.0.1",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/string-width#readme",
  "license": "MIT",
  "name": "string-width",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/string-width.git"
  },
  "version": "3.1.0"
}'use strict';
const ansiRegex = require('ansi-regex');

const stripAnsi = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;

module.exports = stripAnsi;
module.exports.default = stripAnsi;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "ansi-regex": "^4.1.0"
  },
  "deprecated": false,
  "description": "Strip ANSI escape codes from a string",
  "devDependencies": {
    "ava": "^1.3.1",
    "tsd-check": "^0.5.0",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/chalk/strip-ansi#readme",
  "license": "MIT",
  "name": "strip-ansi",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/strip-ansi.git"
  },
  "version": "5.2.0"
}(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the 'Software'), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial 
portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

{
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "browser": "./src/browser.js",
  "dependencies": {
    "ms": "2.1.2"
  },
  "deprecated": false,
  "description": "small debugging utility",
  "devDependencies": {
    "brfs": "^2.0.1",
    "browserify": "^16.2.3",
    "coveralls": "^3.0.2",
    "istanbul": "^0.4.5",
    "karma": "^3.1.4",
    "karma-browserify": "^6.0.0",
    "karma-chrome-launcher": "^2.2.0",
    "karma-mocha": "^1.3.0",
    "mocha": "^5.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6.0"
  },
  "files": [
    "src",
    "LICENSE",
    "README.md"
  ],
  "homepage": "https://github.com/visionmedia/debug#readme",
  "license": "MIT",
  "main": "./src/index.js",
  "name": "debug",
  "peerDependenciesMeta": {
    "supports-color": {
      "optional": true
    }
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "version": "4.2.0"
}/* eslint-env browser */

/**
 * This is the web browser implementation of `debug()`.
 */

exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = localstorage();

/**
 * Colors.
 */

exports.colors = [
	'#0000CC',
	'#0000FF',
	'#0033CC',
	'#0033FF',
	'#0066CC',
	'#0066FF',
	'#0099CC',
	'#0099FF',
	'#00CC00',
	'#00CC33',
	'#00CC66',
	'#00CC99',
	'#00CCCC',
	'#00CCFF',
	'#3300CC',
	'#3300FF',
	'#3333CC',
	'#3333FF',
	'#3366CC',
	'#3366FF',
	'#3399CC',
	'#3399FF',
	'#33CC00',
	'#33CC33',
	'#33CC66',
	'#33CC99',
	'#33CCCC',
	'#33CCFF',
	'#6600CC',
	'#6600FF',
	'#6633CC',
	'#6633FF',
	'#66CC00',
	'#66CC33',
	'#9900CC',
	'#9900FF',
	'#9933CC',
	'#9933FF',
	'#99CC00',
	'#99CC33',
	'#CC0000',
	'#CC0033',
	'#CC0066',
	'#CC0099',
	'#CC00CC',
	'#CC00FF',
	'#CC3300',
	'#CC3333',
	'#CC3366',
	'#CC3399',
	'#CC33CC',
	'#CC33FF',
	'#CC6600',
	'#CC6633',
	'#CC9900',
	'#CC9933',
	'#CCCC00',
	'#CCCC33',
	'#FF0000',
	'#FF0033',
	'#FF0066',
	'#FF0099',
	'#FF00CC',
	'#FF00FF',
	'#FF3300',
	'#FF3333',
	'#FF3366',
	'#FF3399',
	'#FF33CC',
	'#FF33FF',
	'#FF6600',
	'#FF6633',
	'#FF9900',
	'#FF9933',
	'#FFCC00',
	'#FFCC33'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

// eslint-disable-next-line complexity
function useColors() {
	// NB: In an Electron preload script, document will be defined but not fully
	// initialized. Since we know we're in Chrome, we'll just detect this case
	// explicitly
	if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
		return true;
	}

	// Internet Explorer and Edge do not support colors.
	if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
		return false;
	}

	// Is webkit? http://stackoverflow.com/a/16459606/376773
	// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
	return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
		// Is firebug? http://stackoverflow.com/a/398120/376773
		(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
		// Is firefox >= v31?
		// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
		// Double check webkit in userAgent just in case we are in a worker
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	args[0] = (this.useColors ? '%c' : '') +
		this.namespace +
		(this.useColors ? ' %c' : ' ') +
		args[0] +
		(this.useColors ? '%c ' : ' ') +
		'+' + module.exports.humanize(this.diff);

	if (!this.useColors) {
		return;
	}

	const c = 'color: ' + this.color;
	args.splice(1, 0, c, 'color: inherit');

	// The final "%c" is somewhat tricky, because there could be other
	// arguments passed either before or after the %c, so we need to
	// figure out the correct index to insert the CSS into
	let index = 0;
	let lastC = 0;
	args[0].replace(/%[a-zA-Z%]/g, match => {
		if (match === '%%') {
			return;
		}
		index++;
		if (match === '%c') {
			// We only are interested in the *last* %c
			// (the user may have provided their own)
			lastC = index;
		}
	});

	args.splice(lastC, 0, c);
}

/**
 * Invokes `console.debug()` when available.
 * No-op when `console.debug` is not a "function".
 * If `console.debug` is not available, falls back
 * to `console.log`.
 *
 * @api public
 */
exports.log = console.debug || console.log || (() => {});

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	try {
		if (namespaces) {
			exports.storage.setItem('debug', namespaces);
		} else {
			exports.storage.removeItem('debug');
		}
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */
function load() {
	let r;
	try {
		r = exports.storage.getItem('debug');
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}

	// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
	if (!r && typeof process !== 'undefined' && 'env' in process) {
		r = process.env.DEBUG;
	}

	return r;
}

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
	try {
		// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
		// The Browser also has localStorage in the global context.
		return localStorage;
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

formatters.j = function (v) {
	try {
		return JSON.stringify(v);
	} catch (error) {
		return '[UnexpectedJSONParseError]: ' + error.message;
	}
};

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 */

function setup(env) {
	createDebug.debug = createDebug;
	createDebug.default = createDebug;
	createDebug.coerce = coerce;
	createDebug.disable = disable;
	createDebug.enable = enable;
	createDebug.enabled = enabled;
	createDebug.humanize = require('ms');

	Object.keys(env).forEach(key => {
		createDebug[key] = env[key];
	});

	/**
	* Active `debug` instances.
	*/
	createDebug.instances = [];

	/**
	* The currently active debug mode names, and names to skip.
	*/

	createDebug.names = [];
	createDebug.skips = [];

	/**
	* Map of special "%n" handling functions, for the debug "format" argument.
	*
	* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
	*/
	createDebug.formatters = {};

	/**
	* Selects a color for a debug namespace
	* @param {String} namespace The namespace string for the for the debug instance to be colored
	* @return {Number|String} An ANSI color code for the given namespace
	* @api private
	*/
	function selectColor(namespace) {
		let hash = 0;

		for (let i = 0; i < namespace.length; i++) {
			hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
			hash |= 0; // Convert to 32bit integer
		}

		return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
	}
	createDebug.selectColor = selectColor;

	/**
	* Create a debugger with the given `namespace`.
	*
	* @param {String} namespace
	* @return {Function}
	* @api public
	*/
	function createDebug(namespace) {
		let prevTime;

		function debug(...args) {
			// Disabled?
			if (!debug.enabled) {
				return;
			}

			const self = debug;

			// Set `diff` timestamp
			const curr = Number(new Date());
			const ms = curr - (prevTime || curr);
			self.diff = ms;
			self.prev = prevTime;
			self.curr = curr;
			prevTime = curr;

			args[0] = createDebug.coerce(args[0]);

			if (typeof args[0] !== 'string') {
				// Anything else let's inspect with %O
				args.unshift('%O');
			}

			// Apply any `formatters` transformations
			let index = 0;
			args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
				// If we encounter an escaped % then don't increase the array index
				if (match === '%%') {
					return match;
				}
				index++;
				const formatter = createDebug.formatters[format];
				if (typeof formatter === 'function') {
					const val = args[index];
					match = formatter.call(self, val);

					// Now we need to remove `args[index]` since it's inlined in the `format`
					args.splice(index, 1);
					index--;
				}
				return match;
			});

			// Apply env-specific formatting (colors, etc.)
			createDebug.formatArgs.call(self, args);

			const logFn = self.log || createDebug.log;
			logFn.apply(self, args);
		}

		debug.namespace = namespace;
		debug.enabled = createDebug.enabled(namespace);
		debug.useColors = createDebug.useColors();
		debug.color = createDebug.selectColor(namespace);
		debug.destroy = destroy;
		debug.extend = extend;

		// Env-specific initialization logic for debug instances
		if (typeof createDebug.init === 'function') {
			createDebug.init(debug);
		}

		createDebug.instances.push(debug);

		return debug;
	}

	function destroy() {
		const index = createDebug.instances.indexOf(this);
		if (index !== -1) {
			createDebug.instances.splice(index, 1);
			return true;
		}
		return false;
	}

	function extend(namespace, delimiter) {
		const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
		newDebug.log = this.log;
		return newDebug;
	}

	/**
	* Enables a debug mode by namespaces. This can include modes
	* separated by a colon and wildcards.
	*
	* @param {String} namespaces
	* @api public
	*/
	function enable(namespaces) {
		createDebug.save(namespaces);

		createDebug.names = [];
		createDebug.skips = [];

		let i;
		const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
		const len = split.length;

		for (i = 0; i < len; i++) {
			if (!split[i]) {
				// ignore empty strings
				continue;
			}

			namespaces = split[i].replace(/\*/g, '.*?');

			if (namespaces[0] === '-') {
				createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
			} else {
				createDebug.names.push(new RegExp('^' + namespaces + '$'));
			}
		}

		for (i = 0; i < createDebug.instances.length; i++) {
			const instance = createDebug.instances[i];
			instance.enabled = createDebug.enabled(instance.namespace);
		}
	}

	/**
	* Disable debug output.
	*
	* @return {String} namespaces
	* @api public
	*/
	function disable() {
		const namespaces = [
			...createDebug.names.map(toNamespace),
			...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
		].join(',');
		createDebug.enable('');
		return namespaces;
	}

	/**
	* Returns true if the given mode name is enabled, false otherwise.
	*
	* @param {String} name
	* @return {Boolean}
	* @api public
	*/
	function enabled(name) {
		if (name[name.length - 1] === '*') {
			return true;
		}

		let i;
		let len;

		for (i = 0, len = createDebug.skips.length; i < len; i++) {
			if (createDebug.skips[i].test(name)) {
				return false;
			}
		}

		for (i = 0, len = createDebug.names.length; i < len; i++) {
			if (createDebug.names[i].test(name)) {
				return true;
			}
		}

		return false;
	}

	/**
	* Convert regexp to namespace
	*
	* @param {RegExp} regxep
	* @return {String} namespace
	* @api private
	*/
	function toNamespace(regexp) {
		return regexp.toString()
			.substring(2, regexp.toString().length - 2)
			.replace(/\.\*\?$/, '*');
	}

	/**
	* Coerce `val`.
	*
	* @param {Mixed} val
	* @return {Mixed}
	* @api private
	*/
	function coerce(val) {
		if (val instanceof Error) {
			return val.stack || val.message;
		}
		return val;
	}

	createDebug.enable(createDebug.load());

	return createDebug;
}

module.exports = setup;
/**
 * Detect Electron renderer / nwjs process, which is node, but we should
 * treat as a browser.
 */

if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
	module.exports = require('./browser.js');
} else {
	module.exports = require('./node.js');
}
/**
 * Module dependencies.
 */

const tty = require('tty');
const util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 */

exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

try {
	// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
	// eslint-disable-next-line import/no-extraneous-dependencies
	const supportsColor = require('supports-color');

	if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
		exports.colors = [
			20,
			21,
			26,
			27,
			32,
			33,
			38,
			39,
			40,
			41,
			42,
			43,
			44,
			45,
			56,
			57,
			62,
			63,
			68,
			69,
			74,
			75,
			76,
			77,
			78,
			79,
			80,
			81,
			92,
			93,
			98,
			99,
			112,
			113,
			128,
			129,
			134,
			135,
			148,
			149,
			160,
			161,
			162,
			163,
			164,
			165,
			166,
			167,
			168,
			169,
			170,
			171,
			172,
			173,
			178,
			179,
			184,
			185,
			196,
			197,
			198,
			199,
			200,
			201,
			202,
			203,
			204,
			205,
			206,
			207,
			208,
			209,
			214,
			215,
			220,
			221
		];
	}
} catch (error) {
	// Swallow - we only care if `supports-color` is available; it doesn't have to be.
}

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(key => {
	return /^debug_/i.test(key);
}).reduce((obj, key) => {
	// Camel-case
	const prop = key
		.substring(6)
		.toLowerCase()
		.replace(/_([a-z])/g, (_, k) => {
			return k.toUpperCase();
		});

	// Coerce string value into JS value
	let val = process.env[key];
	if (/^(yes|on|true|enabled)$/i.test(val)) {
		val = true;
	} else if (/^(no|off|false|disabled)$/i.test(val)) {
		val = false;
	} else if (val === 'null') {
		val = null;
	} else {
		val = Number(val);
	}

	obj[prop] = val;
	return obj;
}, {});

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
	return 'colors' in exports.inspectOpts ?
		Boolean(exports.inspectOpts.colors) :
		tty.isatty(process.stderr.fd);
}

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	const {namespace: name, useColors} = this;

	if (useColors) {
		const c = this.color;
		const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
		const prefix = `  ${colorCode};1m${name} \u001B[0m`;

		args[0] = prefix + args[0].split('\n').join('\n' + prefix);
		args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
	} else {
		args[0] = getDate() + name + ' ' + args[0];
	}
}

function getDate() {
	if (exports.inspectOpts.hideDate) {
		return '';
	}
	return new Date().toISOString() + ' ';
}

/**
 * Invokes `util.format()` with the specified arguments and writes to stderr.
 */

function log(...args) {
	return process.stderr.write(util.format(...args) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	if (namespaces) {
		process.env.DEBUG = namespaces;
	} else {
		// If you set a process.env field to null or undefined, it gets cast to the
		// string 'null' or 'undefined'. Just delete instead.
		delete process.env.DEBUG;
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
	return process.env.DEBUG;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init(debug) {
	debug.inspectOpts = {};

	const keys = Object.keys(exports.inspectOpts);
	for (let i = 0; i < keys.length; i++) {
		debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

formatters.o = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts)
		.replace(/\s*\n\s*/g, ' ');
};

/**
 * Map %O to `util.inspect()`, allowing multiple lines if needed.
 */

formatters.O = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts);
};
The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
{
  "bin": {
    "semver": "bin/semver.js"
  },
  "deprecated": false,
  "description": "The semantic version parser used by npm.",
  "devDependencies": {
    "tap": "^14.3.1"
  },
  "files": [
    "bin",
    "range.bnf",
    "semver.js"
  ],
  "homepage": "https://github.com/npm/node-semver#readme",
  "license": "ISC",
  "main": "semver.js",
  "name": "semver",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/node-semver.git"
  },
  "tap": {
    "check-coverage": true
  },
  "version": "6.3.0"
}range-set  ::= range ( logical-or range ) *
logical-or ::= ( ' ' ) * '||' ( ' ' ) *
range      ::= hyphen | simple ( ' ' simple ) * | ''
hyphen     ::= partial ' - ' partial
simple     ::= primitive | partial | tilde | caret
primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
xr         ::= 'x' | 'X' | '*' | nr
nr         ::= '0' | [1-9] ( [0-9] ) *
tilde      ::= '~' partial
caret      ::= '^' partial
qualifier  ::= ( '-' pre )? ( '+' build )?
pre        ::= parts
build      ::= parts
parts      ::= part ( '.' part ) *
part       ::= nr | [-0-9A-Za-z]+
exports = module.exports = SemVer

var debug
/* istanbul ignore next */
if (typeof process === 'object' &&
    process.env &&
    process.env.NODE_DEBUG &&
    /\bsemver\b/i.test(process.env.NODE_DEBUG)) {
  debug = function () {
    var args = Array.prototype.slice.call(arguments, 0)
    args.unshift('SEMVER')
    console.log.apply(console, args)
  }
} else {
  debug = function () {}
}

// Note: this is the semver.org version of the spec that it implements
// Not necessarily the package version of this code.
exports.SEMVER_SPEC_VERSION = '2.0.0'

var MAX_LENGTH = 256
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
  /* istanbul ignore next */ 9007199254740991

// Max safe segment length for coercion.
var MAX_SAFE_COMPONENT_LENGTH = 16

// The actual regexps go on exports.re
var re = exports.re = []
var src = exports.src = []
var t = exports.tokens = {}
var R = 0

function tok (n) {
  t[n] = R++
}

// The following Regular Expressions can be used for tokenizing,
// validating, and parsing SemVer version strings.

// ## Numeric Identifier
// A single `0`, or a non-zero digit followed by zero or more digits.

tok('NUMERICIDENTIFIER')
src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*'
tok('NUMERICIDENTIFIERLOOSE')
src[t.NUMERICIDENTIFIERLOOSE] = '[0-9]+'

// ## Non-numeric Identifier
// Zero or more digits, followed by a letter or hyphen, and then zero or
// more letters, digits, or hyphens.

tok('NONNUMERICIDENTIFIER')
src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'

// ## Main Version
// Three dot-separated numeric identifiers.

tok('MAINVERSION')
src[t.MAINVERSION] = '(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[t.NUMERICIDENTIFIER] + ')'

tok('MAINVERSIONLOOSE')
src[t.MAINVERSIONLOOSE] = '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')'

// ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier.

tok('PRERELEASEIDENTIFIER')
src[t.PRERELEASEIDENTIFIER] = '(?:' + src[t.NUMERICIDENTIFIER] +
                            '|' + src[t.NONNUMERICIDENTIFIER] + ')'

tok('PRERELEASEIDENTIFIERLOOSE')
src[t.PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[t.NUMERICIDENTIFIERLOOSE] +
                                 '|' + src[t.NONNUMERICIDENTIFIER] + ')'

// ## Pre-release Version
// Hyphen, followed by one or more dot-separated pre-release version
// identifiers.

tok('PRERELEASE')
src[t.PRERELEASE] = '(?:-(' + src[t.PRERELEASEIDENTIFIER] +
                  '(?:\\.' + src[t.PRERELEASEIDENTIFIER] + ')*))'

tok('PRERELEASELOOSE')
src[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] +
                       '(?:\\.' + src[t.PRERELEASEIDENTIFIERLOOSE] + ')*))'

// ## Build Metadata Identifier
// Any combination of digits, letters, or hyphens.

tok('BUILDIDENTIFIER')
src[t.BUILDIDENTIFIER] = '[0-9A-Za-z-]+'

// ## Build Metadata
// Plus sign, followed by one or more period-separated build metadata
// identifiers.

tok('BUILD')
src[t.BUILD] = '(?:\\+(' + src[t.BUILDIDENTIFIER] +
             '(?:\\.' + src[t.BUILDIDENTIFIER] + ')*))'

// ## Full Version String
// A main version, followed optionally by a pre-release version and
// build metadata.

// Note that the only major, minor, patch, and pre-release sections of
// the version string are capturing groups.  The build metadata is not a
// capturing group, because it should not ever be used in version
// comparison.

tok('FULL')
tok('FULLPLAIN')
src[t.FULLPLAIN] = 'v?' + src[t.MAINVERSION] +
                  src[t.PRERELEASE] + '?' +
                  src[t.BUILD] + '?'

src[t.FULL] = '^' + src[t.FULLPLAIN] + '$'

// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
// common in the npm registry.
tok('LOOSEPLAIN')
src[t.LOOSEPLAIN] = '[v=\\s]*' + src[t.MAINVERSIONLOOSE] +
                  src[t.PRERELEASELOOSE] + '?' +
                  src[t.BUILD] + '?'

tok('LOOSE')
src[t.LOOSE] = '^' + src[t.LOOSEPLAIN] + '$'

tok('GTLT')
src[t.GTLT] = '((?:<|>)?=?)'

// Something like "2.*" or "1.2.x".
// Note that "x.x" is a valid xRange identifer, meaning "any version"
// Only the first item is strictly required.
tok('XRANGEIDENTIFIERLOOSE')
src[t.XRANGEIDENTIFIERLOOSE] = src[t.NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'
tok('XRANGEIDENTIFIER')
src[t.XRANGEIDENTIFIER] = src[t.NUMERICIDENTIFIER] + '|x|X|\\*'

tok('XRANGEPLAIN')
src[t.XRANGEPLAIN] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
                   '(?:' + src[t.PRERELEASE] + ')?' +
                   src[t.BUILD] + '?' +
                   ')?)?'

tok('XRANGEPLAINLOOSE')
src[t.XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:' + src[t.PRERELEASELOOSE] + ')?' +
                        src[t.BUILD] + '?' +
                        ')?)?'

tok('XRANGE')
src[t.XRANGE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAIN] + '$'
tok('XRANGELOOSE')
src[t.XRANGELOOSE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAINLOOSE] + '$'

// Coercion.
// Extract anything that could conceivably be a part of a valid semver
tok('COERCE')
src[t.COERCE] = '(^|[^\\d])' +
              '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:$|[^\\d])'
tok('COERCERTL')
re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g')

// Tilde ranges.
// Meaning is "reasonably at or greater than"
tok('LONETILDE')
src[t.LONETILDE] = '(?:~>?)'

tok('TILDETRIM')
src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+'
re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g')
var tildeTrimReplace = '$1~'

tok('TILDE')
src[t.TILDE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAIN] + '$'
tok('TILDELOOSE')
src[t.TILDELOOSE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAINLOOSE] + '$'

// Caret ranges.
// Meaning is "at least and backwards compatible with"
tok('LONECARET')
src[t.LONECARET] = '(?:\\^)'

tok('CARETTRIM')
src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+'
re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g')
var caretTrimReplace = '$1^'

tok('CARET')
src[t.CARET] = '^' + src[t.LONECARET] + src[t.XRANGEPLAIN] + '$'
tok('CARETLOOSE')
src[t.CARETLOOSE] = '^' + src[t.LONECARET] + src[t.XRANGEPLAINLOOSE] + '$'

// A simple gt/lt/eq thing, or just "" to indicate "any version"
tok('COMPARATORLOOSE')
src[t.COMPARATORLOOSE] = '^' + src[t.GTLT] + '\\s*(' + src[t.LOOSEPLAIN] + ')$|^$'
tok('COMPARATOR')
src[t.COMPARATOR] = '^' + src[t.GTLT] + '\\s*(' + src[t.FULLPLAIN] + ')$|^$'

// An expression to strip any whitespace between the gtlt and the thing
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
tok('COMPARATORTRIM')
src[t.COMPARATORTRIM] = '(\\s*)' + src[t.GTLT] +
                      '\\s*(' + src[t.LOOSEPLAIN] + '|' + src[t.XRANGEPLAIN] + ')'

// this one has to use the /g flag
re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g')
var comparatorTrimReplace = '$1$2$3'

// Something like `1.2.3 - 1.2.4`
// Note that these all use the loose form, because they'll be
// checked against either the strict or loose comparator form
// later.
tok('HYPHENRANGE')
src[t.HYPHENRANGE] = '^\\s*(' + src[t.XRANGEPLAIN] + ')' +
                   '\\s+-\\s+' +
                   '(' + src[t.XRANGEPLAIN] + ')' +
                   '\\s*$'

tok('HYPHENRANGELOOSE')
src[t.HYPHENRANGELOOSE] = '^\\s*(' + src[t.XRANGEPLAINLOOSE] + ')' +
                        '\\s+-\\s+' +
                        '(' + src[t.XRANGEPLAINLOOSE] + ')' +
                        '\\s*$'

// Star ranges basically just allow anything at all.
tok('STAR')
src[t.STAR] = '(<|>)?=?\\s*\\*'

// Compile to actual regexp objects.
// All are flag-free, unless they were created above with a flag.
for (var i = 0; i < R; i++) {
  debug(i, src[i])
  if (!re[i]) {
    re[i] = new RegExp(src[i])
  }
}

exports.parse = parse
function parse (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (version instanceof SemVer) {
    return version
  }

  if (typeof version !== 'string') {
    return null
  }

  if (version.length > MAX_LENGTH) {
    return null
  }

  var r = options.loose ? re[t.LOOSE] : re[t.FULL]
  if (!r.test(version)) {
    return null
  }

  try {
    return new SemVer(version, options)
  } catch (er) {
    return null
  }
}

exports.valid = valid
function valid (version, options) {
  var v = parse(version, options)
  return v ? v.version : null
}

exports.clean = clean
function clean (version, options) {
  var s = parse(version.trim().replace(/^[=v]+/, ''), options)
  return s ? s.version : null
}

exports.SemVer = SemVer

function SemVer (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }
  if (version instanceof SemVer) {
    if (version.loose === options.loose) {
      return version
    } else {
      version = version.version
    }
  } else if (typeof version !== 'string') {
    throw new TypeError('Invalid Version: ' + version)
  }

  if (version.length > MAX_LENGTH) {
    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
  }

  if (!(this instanceof SemVer)) {
    return new SemVer(version, options)
  }

  debug('SemVer', version, options)
  this.options = options
  this.loose = !!options.loose

  var m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])

  if (!m) {
    throw new TypeError('Invalid Version: ' + version)
  }

  this.raw = version

  // these are actually numbers
  this.major = +m[1]
  this.minor = +m[2]
  this.patch = +m[3]

  if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
    throw new TypeError('Invalid major version')
  }

  if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
    throw new TypeError('Invalid minor version')
  }

  if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
    throw new TypeError('Invalid patch version')
  }

  // numberify any prerelease numeric ids
  if (!m[4]) {
    this.prerelease = []
  } else {
    this.prerelease = m[4].split('.').map(function (id) {
      if (/^[0-9]+$/.test(id)) {
        var num = +id
        if (num >= 0 && num < MAX_SAFE_INTEGER) {
          return num
        }
      }
      return id
    })
  }

  this.build = m[5] ? m[5].split('.') : []
  this.format()
}

SemVer.prototype.format = function () {
  this.version = this.major + '.' + this.minor + '.' + this.patch
  if (this.prerelease.length) {
    this.version += '-' + this.prerelease.join('.')
  }
  return this.version
}

SemVer.prototype.toString = function () {
  return this.version
}

SemVer.prototype.compare = function (other) {
  debug('SemVer.compare', this.version, this.options, other)
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  return this.compareMain(other) || this.comparePre(other)
}

SemVer.prototype.compareMain = function (other) {
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  return compareIdentifiers(this.major, other.major) ||
         compareIdentifiers(this.minor, other.minor) ||
         compareIdentifiers(this.patch, other.patch)
}

SemVer.prototype.comparePre = function (other) {
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  // NOT having a prerelease is > having one
  if (this.prerelease.length && !other.prerelease.length) {
    return -1
  } else if (!this.prerelease.length && other.prerelease.length) {
    return 1
  } else if (!this.prerelease.length && !other.prerelease.length) {
    return 0
  }

  var i = 0
  do {
    var a = this.prerelease[i]
    var b = other.prerelease[i]
    debug('prerelease compare', i, a, b)
    if (a === undefined && b === undefined) {
      return 0
    } else if (b === undefined) {
      return 1
    } else if (a === undefined) {
      return -1
    } else if (a === b) {
      continue
    } else {
      return compareIdentifiers(a, b)
    }
  } while (++i)
}

SemVer.prototype.compareBuild = function (other) {
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  var i = 0
  do {
    var a = this.build[i]
    var b = other.build[i]
    debug('prerelease compare', i, a, b)
    if (a === undefined && b === undefined) {
      return 0
    } else if (b === undefined) {
      return 1
    } else if (a === undefined) {
      return -1
    } else if (a === b) {
      continue
    } else {
      return compareIdentifiers(a, b)
    }
  } while (++i)
}

// preminor will bump the version up to the next minor release, and immediately
// down to pre-release. premajor and prepatch work the same way.
SemVer.prototype.inc = function (release, identifier) {
  switch (release) {
    case 'premajor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor = 0
      this.major++
      this.inc('pre', identifier)
      break
    case 'preminor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor++
      this.inc('pre', identifier)
      break
    case 'prepatch':
      // If this is already a prerelease, it will bump to the next version
      // drop any prereleases that might already exist, since they are not
      // relevant at this point.
      this.prerelease.length = 0
      this.inc('patch', identifier)
      this.inc('pre', identifier)
      break
    // If the input is a non-prerelease version, this acts the same as
    // prepatch.
    case 'prerelease':
      if (this.prerelease.length === 0) {
        this.inc('patch', identifier)
      }
      this.inc('pre', identifier)
      break

    case 'major':
      // If this is a pre-major version, bump up to the same major version.
      // Otherwise increment major.
      // 1.0.0-5 bumps to 1.0.0
      // 1.1.0 bumps to 2.0.0
      if (this.minor !== 0 ||
          this.patch !== 0 ||
          this.prerelease.length === 0) {
        this.major++
      }
      this.minor = 0
      this.patch = 0
      this.prerelease = []
      break
    case 'minor':
      // If this is a pre-minor version, bump up to the same minor version.
      // Otherwise increment minor.
      // 1.2.0-5 bumps to 1.2.0
      // 1.2.1 bumps to 1.3.0
      if (this.patch !== 0 || this.prerelease.length === 0) {
        this.minor++
      }
      this.patch = 0
      this.prerelease = []
      break
    case 'patch':
      // If this is not a pre-release version, it will increment the patch.
      // If it is a pre-release it will bump up to the same patch version.
      // 1.2.0-5 patches to 1.2.0
      // 1.2.0 patches to 1.2.1
      if (this.prerelease.length === 0) {
        this.patch++
      }
      this.prerelease = []
      break
    // This probably shouldn't be used publicly.
    // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
    case 'pre':
      if (this.prerelease.length === 0) {
        this.prerelease = [0]
      } else {
        var i = this.prerelease.length
        while (--i >= 0) {
          if (typeof this.prerelease[i] === 'number') {
            this.prerelease[i]++
            i = -2
          }
        }
        if (i === -1) {
          // didn't increment anything
          this.prerelease.push(0)
        }
      }
      if (identifier) {
        // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
        // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
        if (this.prerelease[0] === identifier) {
          if (isNaN(this.prerelease[1])) {
            this.prerelease = [identifier, 0]
          }
        } else {
          this.prerelease = [identifier, 0]
        }
      }
      break

    default:
      throw new Error('invalid increment argument: ' + release)
  }
  this.format()
  this.raw = this.version
  return this
}

exports.inc = inc
function inc (version, release, loose, identifier) {
  if (typeof (loose) === 'string') {
    identifier = loose
    loose = undefined
  }

  try {
    return new SemVer(version, loose).inc(release, identifier).version
  } catch (er) {
    return null
  }
}

exports.diff = diff
function diff (version1, version2) {
  if (eq(version1, version2)) {
    return null
  } else {
    var v1 = parse(version1)
    var v2 = parse(version2)
    var prefix = ''
    if (v1.prerelease.length || v2.prerelease.length) {
      prefix = 'pre'
      var defaultResult = 'prerelease'
    }
    for (var key in v1) {
      if (key === 'major' || key === 'minor' || key === 'patch') {
        if (v1[key] !== v2[key]) {
          return prefix + key
        }
      }
    }
    return defaultResult // may be undefined
  }
}

exports.compareIdentifiers = compareIdentifiers

var numeric = /^[0-9]+$/
function compareIdentifiers (a, b) {
  var anum = numeric.test(a)
  var bnum = numeric.test(b)

  if (anum && bnum) {
    a = +a
    b = +b
  }

  return a === b ? 0
    : (anum && !bnum) ? -1
    : (bnum && !anum) ? 1
    : a < b ? -1
    : 1
}

exports.rcompareIdentifiers = rcompareIdentifiers
function rcompareIdentifiers (a, b) {
  return compareIdentifiers(b, a)
}

exports.major = major
function major (a, loose) {
  return new SemVer(a, loose).major
}

exports.minor = minor
function minor (a, loose) {
  return new SemVer(a, loose).minor
}

exports.patch = patch
function patch (a, loose) {
  return new SemVer(a, loose).patch
}

exports.compare = compare
function compare (a, b, loose) {
  return new SemVer(a, loose).compare(new SemVer(b, loose))
}

exports.compareLoose = compareLoose
function compareLoose (a, b) {
  return compare(a, b, true)
}

exports.compareBuild = compareBuild
function compareBuild (a, b, loose) {
  var versionA = new SemVer(a, loose)
  var versionB = new SemVer(b, loose)
  return versionA.compare(versionB) || versionA.compareBuild(versionB)
}

exports.rcompare = rcompare
function rcompare (a, b, loose) {
  return compare(b, a, loose)
}

exports.sort = sort
function sort (list, loose) {
  return list.sort(function (a, b) {
    return exports.compareBuild(a, b, loose)
  })
}

exports.rsort = rsort
function rsort (list, loose) {
  return list.sort(function (a, b) {
    return exports.compareBuild(b, a, loose)
  })
}

exports.gt = gt
function gt (a, b, loose) {
  return compare(a, b, loose) > 0
}

exports.lt = lt
function lt (a, b, loose) {
  return compare(a, b, loose) < 0
}

exports.eq = eq
function eq (a, b, loose) {
  return compare(a, b, loose) === 0
}

exports.neq = neq
function neq (a, b, loose) {
  return compare(a, b, loose) !== 0
}

exports.gte = gte
function gte (a, b, loose) {
  return compare(a, b, loose) >= 0
}

exports.lte = lte
function lte (a, b, loose) {
  return compare(a, b, loose) <= 0
}

exports.cmp = cmp
function cmp (a, op, b, loose) {
  switch (op) {
    case '===':
      if (typeof a === 'object')
        a = a.version
      if (typeof b === 'object')
        b = b.version
      return a === b

    case '!==':
      if (typeof a === 'object')
        a = a.version
      if (typeof b === 'object')
        b = b.version
      return a !== b

    case '':
    case '=':
    case '==':
      return eq(a, b, loose)

    case '!=':
      return neq(a, b, loose)

    case '>':
      return gt(a, b, loose)

    case '>=':
      return gte(a, b, loose)

    case '<':
      return lt(a, b, loose)

    case '<=':
      return lte(a, b, loose)

    default:
      throw new TypeError('Invalid operator: ' + op)
  }
}

exports.Comparator = Comparator
function Comparator (comp, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (comp instanceof Comparator) {
    if (comp.loose === !!options.loose) {
      return comp
    } else {
      comp = comp.value
    }
  }

  if (!(this instanceof Comparator)) {
    return new Comparator(comp, options)
  }

  debug('comparator', comp, options)
  this.options = options
  this.loose = !!options.loose
  this.parse(comp)

  if (this.semver === ANY) {
    this.value = ''
  } else {
    this.value = this.operator + this.semver.version
  }

  debug('comp', this)
}

var ANY = {}
Comparator.prototype.parse = function (comp) {
  var r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
  var m = comp.match(r)

  if (!m) {
    throw new TypeError('Invalid comparator: ' + comp)
  }

  this.operator = m[1] !== undefined ? m[1] : ''
  if (this.operator === '=') {
    this.operator = ''
  }

  // if it literally is just '>' or '' then allow anything.
  if (!m[2]) {
    this.semver = ANY
  } else {
    this.semver = new SemVer(m[2], this.options.loose)
  }
}

Comparator.prototype.toString = function () {
  return this.value
}

Comparator.prototype.test = function (version) {
  debug('Comparator.test', version, this.options.loose)

  if (this.semver === ANY || version === ANY) {
    return true
  }

  if (typeof version === 'string') {
    try {
      version = new SemVer(version, this.options)
    } catch (er) {
      return false
    }
  }

  return cmp(version, this.operator, this.semver, this.options)
}

Comparator.prototype.intersects = function (comp, options) {
  if (!(comp instanceof Comparator)) {
    throw new TypeError('a Comparator is required')
  }

  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  var rangeTmp

  if (this.operator === '') {
    if (this.value === '') {
      return true
    }
    rangeTmp = new Range(comp.value, options)
    return satisfies(this.value, rangeTmp, options)
  } else if (comp.operator === '') {
    if (comp.value === '') {
      return true
    }
    rangeTmp = new Range(this.value, options)
    return satisfies(comp.semver, rangeTmp, options)
  }

  var sameDirectionIncreasing =
    (this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '>=' || comp.operator === '>')
  var sameDirectionDecreasing =
    (this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '<=' || comp.operator === '<')
  var sameSemVer = this.semver.version === comp.semver.version
  var differentDirectionsInclusive =
    (this.operator === '>=' || this.operator === '<=') &&
    (comp.operator === '>=' || comp.operator === '<=')
  var oppositeDirectionsLessThan =
    cmp(this.semver, '<', comp.semver, options) &&
    ((this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '<=' || comp.operator === '<'))
  var oppositeDirectionsGreaterThan =
    cmp(this.semver, '>', comp.semver, options) &&
    ((this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '>=' || comp.operator === '>'))

  return sameDirectionIncreasing || sameDirectionDecreasing ||
    (sameSemVer && differentDirectionsInclusive) ||
    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan
}

exports.Range = Range
function Range (range, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (range instanceof Range) {
    if (range.loose === !!options.loose &&
        range.includePrerelease === !!options.includePrerelease) {
      return range
    } else {
      return new Range(range.raw, options)
    }
  }

  if (range instanceof Comparator) {
    return new Range(range.value, options)
  }

  if (!(this instanceof Range)) {
    return new Range(range, options)
  }

  this.options = options
  this.loose = !!options.loose
  this.includePrerelease = !!options.includePrerelease

  // First, split based on boolean or ||
  this.raw = range
  this.set = range.split(/\s*\|\|\s*/).map(function (range) {
    return this.parseRange(range.trim())
  }, this).filter(function (c) {
    // throw out any that are not relevant for whatever reason
    return c.length
  })

  if (!this.set.length) {
    throw new TypeError('Invalid SemVer Range: ' + range)
  }

  this.format()
}

Range.prototype.format = function () {
  this.range = this.set.map(function (comps) {
    return comps.join(' ').trim()
  }).join('||').trim()
  return this.range
}

Range.prototype.toString = function () {
  return this.range
}

Range.prototype.parseRange = function (range) {
  var loose = this.options.loose
  range = range.trim()
  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
  var hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]
  range = range.replace(hr, hyphenReplace)
  debug('hyphen replace', range)
  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
  range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)
  debug('comparator trim', range, re[t.COMPARATORTRIM])

  // `~ 1.2.3` => `~1.2.3`
  range = range.replace(re[t.TILDETRIM], tildeTrimReplace)

  // `^ 1.2.3` => `^1.2.3`
  range = range.replace(re[t.CARETTRIM], caretTrimReplace)

  // normalize spaces
  range = range.split(/\s+/).join(' ')

  // At this point, the range is completely trimmed and
  // ready to be split into comparators.

  var compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
  var set = range.split(' ').map(function (comp) {
    return parseComparator(comp, this.options)
  }, this).join(' ').split(/\s+/)
  if (this.options.loose) {
    // in loose mode, throw out any that are not valid comparators
    set = set.filter(function (comp) {
      return !!comp.match(compRe)
    })
  }
  set = set.map(function (comp) {
    return new Comparator(comp, this.options)
  }, this)

  return set
}

Range.prototype.intersects = function (range, options) {
  if (!(range instanceof Range)) {
    throw new TypeError('a Range is required')
  }

  return this.set.some(function (thisComparators) {
    return (
      isSatisfiable(thisComparators, options) &&
      range.set.some(function (rangeComparators) {
        return (
          isSatisfiable(rangeComparators, options) &&
          thisComparators.every(function (thisComparator) {
            return rangeComparators.every(function (rangeComparator) {
              return thisComparator.intersects(rangeComparator, options)
            })
          })
        )
      })
    )
  })
}

// take a set of comparators and determine whether there
// exists a version which can satisfy it
function isSatisfiable (comparators, options) {
  var result = true
  var remainingComparators = comparators.slice()
  var testComparator = remainingComparators.pop()

  while (result && remainingComparators.length) {
    result = remainingComparators.every(function (otherComparator) {
      return testComparator.intersects(otherComparator, options)
    })

    testComparator = remainingComparators.pop()
  }

  return result
}

// Mostly just for testing and legacy API reasons
exports.toComparators = toComparators
function toComparators (range, options) {
  return new Range(range, options).set.map(function (comp) {
    return comp.map(function (c) {
      return c.value
    }).join(' ').trim().split(' ')
  })
}

// comprised of xranges, tildes, stars, and gtlt's at this point.
// already replaced the hyphen ranges
// turn into a set of JUST comparators.
function parseComparator (comp, options) {
  debug('comp', comp, options)
  comp = replaceCarets(comp, options)
  debug('caret', comp)
  comp = replaceTildes(comp, options)
  debug('tildes', comp)
  comp = replaceXRanges(comp, options)
  debug('xrange', comp)
  comp = replaceStars(comp, options)
  debug('stars', comp)
  return comp
}

function isX (id) {
  return !id || id.toLowerCase() === 'x' || id === '*'
}

// ~, ~> --> * (any, kinda silly)
// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
function replaceTildes (comp, options) {
  return comp.trim().split(/\s+/).map(function (comp) {
    return replaceTilde(comp, options)
  }).join(' ')
}

function replaceTilde (comp, options) {
  var r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]
  return comp.replace(r, function (_, M, m, p, pr) {
    debug('tilde', comp, _, M, m, p, pr)
    var ret

    if (isX(M)) {
      ret = ''
    } else if (isX(m)) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
    } else if (isX(p)) {
      // ~1.2 == >=1.2.0 <1.3.0
      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
    } else if (pr) {
      debug('replaceTilde pr', pr)
      ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
            ' <' + M + '.' + (+m + 1) + '.0'
    } else {
      // ~1.2.3 == >=1.2.3 <1.3.0
      ret = '>=' + M + '.' + m + '.' + p +
            ' <' + M + '.' + (+m + 1) + '.0'
    }

    debug('tilde return', ret)
    return ret
  })
}

// ^ --> * (any, kinda silly)
// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
// ^1.2.3 --> >=1.2.3 <2.0.0
// ^1.2.0 --> >=1.2.0 <2.0.0
function replaceCarets (comp, options) {
  return comp.trim().split(/\s+/).map(function (comp) {
    return replaceCaret(comp, options)
  }).join(' ')
}

function replaceCaret (comp, options) {
  debug('caret', comp, options)
  var r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]
  return comp.replace(r, function (_, M, m, p, pr) {
    debug('caret', comp, _, M, m, p, pr)
    var ret

    if (isX(M)) {
      ret = ''
    } else if (isX(m)) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
    } else if (isX(p)) {
      if (M === '0') {
        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
      } else {
        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'
      }
    } else if (pr) {
      debug('replaceCaret pr', pr)
      if (M === '0') {
        if (m === '0') {
          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
                ' <' + M + '.' + m + '.' + (+p + 1)
        } else {
          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
                ' <' + M + '.' + (+m + 1) + '.0'
        }
      } else {
        ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
              ' <' + (+M + 1) + '.0.0'
      }
    } else {
      debug('no pr')
      if (M === '0') {
        if (m === '0') {
          ret = '>=' + M + '.' + m + '.' + p +
                ' <' + M + '.' + m + '.' + (+p + 1)
        } else {
          ret = '>=' + M + '.' + m + '.' + p +
                ' <' + M + '.' + (+m + 1) + '.0'
        }
      } else {
        ret = '>=' + M + '.' + m + '.' + p +
              ' <' + (+M + 1) + '.0.0'
      }
    }

    debug('caret return', ret)
    return ret
  })
}

function replaceXRanges (comp, options) {
  debug('replaceXRanges', comp, options)
  return comp.split(/\s+/).map(function (comp) {
    return replaceXRange(comp, options)
  }).join(' ')
}

function replaceXRange (comp, options) {
  comp = comp.trim()
  var r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]
  return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
    debug('xRange', comp, ret, gtlt, M, m, p, pr)
    var xM = isX(M)
    var xm = xM || isX(m)
    var xp = xm || isX(p)
    var anyX = xp

    if (gtlt === '=' && anyX) {
      gtlt = ''
    }

    // if we're including prereleases in the match, then we need
    // to fix this to -0, the lowest possible prerelease value
    pr = options.includePrerelease ? '-0' : ''

    if (xM) {
      if (gtlt === '>' || gtlt === '<') {
        // nothing is allowed
        ret = '<0.0.0-0'
      } else {
        // nothing is forbidden
        ret = '*'
      }
    } else if (gtlt && anyX) {
      // we know patch is an x, because we have any x at all.
      // replace X with 0
      if (xm) {
        m = 0
      }
      p = 0

      if (gtlt === '>') {
        // >1 => >=2.0.0
        // >1.2 => >=1.3.0
        // >1.2.3 => >= 1.2.4
        gtlt = '>='
        if (xm) {
          M = +M + 1
          m = 0
          p = 0
        } else {
          m = +m + 1
          p = 0
        }
      } else if (gtlt === '<=') {
        // <=0.7.x is actually <0.8.0, since any 0.7.x should
        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
        gtlt = '<'
        if (xm) {
          M = +M + 1
        } else {
          m = +m + 1
        }
      }

      ret = gtlt + M + '.' + m + '.' + p + pr
    } else if (xm) {
      ret = '>=' + M + '.0.0' + pr + ' <' + (+M + 1) + '.0.0' + pr
    } else if (xp) {
      ret = '>=' + M + '.' + m + '.0' + pr +
        ' <' + M + '.' + (+m + 1) + '.0' + pr
    }

    debug('xRange return', ret)

    return ret
  })
}

// Because * is AND-ed with everything else in the comparator,
// and '' means "any version", just remove the *s entirely.
function replaceStars (comp, options) {
  debug('replaceStars', comp, options)
  // Looseness is ignored here.  star is always as loose as it gets!
  return comp.trim().replace(re[t.STAR], '')
}

// This function is passed to string.replace(re[t.HYPHENRANGE])
// M, m, patch, prerelease, build
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
// 1.2 - 3.4 => >=1.2.0 <3.5.0
function hyphenReplace ($0,
  from, fM, fm, fp, fpr, fb,
  to, tM, tm, tp, tpr, tb) {
  if (isX(fM)) {
    from = ''
  } else if (isX(fm)) {
    from = '>=' + fM + '.0.0'
  } else if (isX(fp)) {
    from = '>=' + fM + '.' + fm + '.0'
  } else {
    from = '>=' + from
  }

  if (isX(tM)) {
    to = ''
  } else if (isX(tm)) {
    to = '<' + (+tM + 1) + '.0.0'
  } else if (isX(tp)) {
    to = '<' + tM + '.' + (+tm + 1) + '.0'
  } else if (tpr) {
    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr
  } else {
    to = '<=' + to
  }

  return (from + ' ' + to).trim()
}

// if ANY of the sets match ALL of its comparators, then pass
Range.prototype.test = function (version) {
  if (!version) {
    return false
  }

  if (typeof version === 'string') {
    try {
      version = new SemVer(version, this.options)
    } catch (er) {
      return false
    }
  }

  for (var i = 0; i < this.set.length; i++) {
    if (testSet(this.set[i], version, this.options)) {
      return true
    }
  }
  return false
}

function testSet (set, version, options) {
  for (var i = 0; i < set.length; i++) {
    if (!set[i].test(version)) {
      return false
    }
  }

  if (version.prerelease.length && !options.includePrerelease) {
    // Find the set of versions that are allowed to have prereleases
    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
    // That should allow `1.2.3-pr.2` to pass.
    // However, `1.2.4-alpha.notready` should NOT be allowed,
    // even though it's within the range set by the comparators.
    for (i = 0; i < set.length; i++) {
      debug(set[i].semver)
      if (set[i].semver === ANY) {
        continue
      }

      if (set[i].semver.prerelease.length > 0) {
        var allowed = set[i].semver
        if (allowed.major === version.major &&
            allowed.minor === version.minor &&
            allowed.patch === version.patch) {
          return true
        }
      }
    }

    // Version has a -pre, but it's not one of the ones we like.
    return false
  }

  return true
}

exports.satisfies = satisfies
function satisfies (version, range, options) {
  try {
    range = new Range(range, options)
  } catch (er) {
    return false
  }
  return range.test(version)
}

exports.maxSatisfying = maxSatisfying
function maxSatisfying (versions, range, options) {
  var max = null
  var maxSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (v) {
    if (rangeObj.test(v)) {
      // satisfies(v, range, options)
      if (!max || maxSV.compare(v) === -1) {
        // compare(max, v, true)
        max = v
        maxSV = new SemVer(max, options)
      }
    }
  })
  return max
}

exports.minSatisfying = minSatisfying
function minSatisfying (versions, range, options) {
  var min = null
  var minSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (v) {
    if (rangeObj.test(v)) {
      // satisfies(v, range, options)
      if (!min || minSV.compare(v) === 1) {
        // compare(min, v, true)
        min = v
        minSV = new SemVer(min, options)
      }
    }
  })
  return min
}

exports.minVersion = minVersion
function minVersion (range, loose) {
  range = new Range(range, loose)

  var minver = new SemVer('0.0.0')
  if (range.test(minver)) {
    return minver
  }

  minver = new SemVer('0.0.0-0')
  if (range.test(minver)) {
    return minver
  }

  minver = null
  for (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    comparators.forEach(function (comparator) {
      // Clone to avoid manipulating the comparator's semver object.
      var compver = new SemVer(comparator.semver.version)
      switch (comparator.operator) {
        case '>':
          if (compver.prerelease.length === 0) {
            compver.patch++
          } else {
            compver.prerelease.push(0)
          }
          compver.raw = compver.format()
          /* fallthrough */
        case '':
        case '>=':
          if (!minver || gt(minver, compver)) {
            minver = compver
          }
          break
        case '<':
        case '<=':
          /* Ignore maximum versions */
          break
        /* istanbul ignore next */
        default:
          throw new Error('Unexpected operation: ' + comparator.operator)
      }
    })
  }

  if (minver && range.test(minver)) {
    return minver
  }

  return null
}

exports.validRange = validRange
function validRange (range, options) {
  try {
    // Return '*' instead of '' so that truthiness works.
    // This will throw if it's invalid anyway
    return new Range(range, options).range || '*'
  } catch (er) {
    return null
  }
}

// Determine if version is less than all the versions possible in the range
exports.ltr = ltr
function ltr (version, range, options) {
  return outside(version, range, '<', options)
}

// Determine if version is greater than all the versions possible in the range.
exports.gtr = gtr
function gtr (version, range, options) {
  return outside(version, range, '>', options)
}

exports.outside = outside
function outside (version, range, hilo, options) {
  version = new SemVer(version, options)
  range = new Range(range, options)

  var gtfn, ltefn, ltfn, comp, ecomp
  switch (hilo) {
    case '>':
      gtfn = gt
      ltefn = lte
      ltfn = lt
      comp = '>'
      ecomp = '>='
      break
    case '<':
      gtfn = lt
      ltefn = gte
      ltfn = gt
      comp = '<'
      ecomp = '<='
      break
    default:
      throw new TypeError('Must provide a hilo val of "<" or ">"')
  }

  // If it satisifes the range it is not outside
  if (satisfies(version, range, options)) {
    return false
  }

  // From now on, variable terms are as if we're in "gtr" mode.
  // but note that everything is flipped for the "ltr" function.

  for (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    var high = null
    var low = null

    comparators.forEach(function (comparator) {
      if (comparator.semver === ANY) {
        comparator = new Comparator('>=0.0.0')
      }
      high = high || comparator
      low = low || comparator
      if (gtfn(comparator.semver, high.semver, options)) {
        high = comparator
      } else if (ltfn(comparator.semver, low.semver, options)) {
        low = comparator
      }
    })

    // If the edge version comparator has a operator then our version
    // isn't outside it
    if (high.operator === comp || high.operator === ecomp) {
      return false
    }

    // If the lowest version comparator has an operator and our version
    // is less than it then it isn't higher than the range
    if ((!low.operator || low.operator === comp) &&
        ltefn(version, low.semver)) {
      return false
    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
      return false
    }
  }
  return true
}

exports.prerelease = prerelease
function prerelease (version, options) {
  var parsed = parse(version, options)
  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
}

exports.intersects = intersects
function intersects (r1, r2, options) {
  r1 = new Range(r1, options)
  r2 = new Range(r2, options)
  return r1.intersects(r2)
}

exports.coerce = coerce
function coerce (version, options) {
  if (version instanceof SemVer) {
    return version
  }

  if (typeof version === 'number') {
    version = String(version)
  }

  if (typeof version !== 'string') {
    return null
  }

  options = options || {}

  var match = null
  if (!options.rtl) {
    match = version.match(re[t.COERCE])
  } else {
    // Find the right-most coercible string that does not share
    // a terminus with a more left-ward coercible string.
    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
    //
    // Walk through the string checking with a /g regexp
    // Manually set the index so as to pick up overlapping matches.
    // Stop when we get a match that ends at the string end, since no
    // coercible string can be more right-ward without the same terminus.
    var next
    while ((next = re[t.COERCERTL].exec(version)) &&
      (!match || match.index + match[0].length !== version.length)
    ) {
      if (!match ||
          next.index + next[0].length !== match.index + match[0].length) {
        match = next
      }
      re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length
    }
    // leave it in a clean state
    re[t.COERCERTL].lastIndex = -1
  }

  if (match === null) {
    return null
  }

  return parse(match[2] +
    '.' + (match[3] || '0') +
    '.' + (match[4] || '0'), options)
}
#!/usr/bin/env node
// Standalone semver comparison program.
// Exits successfully and prints matching version(s) if
// any supplied version is valid and passes all tests.

var argv = process.argv.slice(2)

var versions = []

var range = []

var inc = null

var version = require('../package.json').version

var loose = false

var includePrerelease = false

var coerce = false

var rtl = false

var identifier

var semver = require('../semver')

var reverse = false

var options = {}

main()

function main () {
  if (!argv.length) return help()
  while (argv.length) {
    var a = argv.shift()
    var indexOfEqualSign = a.indexOf('=')
    if (indexOfEqualSign !== -1) {
      a = a.slice(0, indexOfEqualSign)
      argv.unshift(a.slice(indexOfEqualSign + 1))
    }
    switch (a) {
      case '-rv': case '-rev': case '--rev': case '--reverse':
        reverse = true
        break
      case '-l': case '--loose':
        loose = true
        break
      case '-p': case '--include-prerelease':
        includePrerelease = true
        break
      case '-v': case '--version':
        versions.push(argv.shift())
        break
      case '-i': case '--inc': case '--increment':
        switch (argv[0]) {
          case 'major': case 'minor': case 'patch': case 'prerelease':
          case 'premajor': case 'preminor': case 'prepatch':
            inc = argv.shift()
            break
          default:
            inc = 'patch'
            break
        }
        break
      case '--preid':
        identifier = argv.shift()
        break
      case '-r': case '--range':
        range.push(argv.shift())
        break
      case '-c': case '--coerce':
        coerce = true
        break
      case '--rtl':
        rtl = true
        break
      case '--ltr':
        rtl = false
        break
      case '-h': case '--help': case '-?':
        return help()
      default:
        versions.push(a)
        break
    }
  }

  var options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }

  versions = versions.map(function (v) {
    return coerce ? (semver.coerce(v, options) || { version: v }).version : v
  }).filter(function (v) {
    return semver.valid(v)
  })
  if (!versions.length) return fail()
  if (inc && (versions.length !== 1 || range.length)) { return failInc() }

  for (var i = 0, l = range.length; i < l; i++) {
    versions = versions.filter(function (v) {
      return semver.satisfies(v, range[i], options)
    })
    if (!versions.length) return fail()
  }
  return success(versions)
}

function failInc () {
  console.error('--inc can only be used on a single version with no range')
  fail()
}

function fail () { process.exit(1) }

function success () {
  var compare = reverse ? 'rcompare' : 'compare'
  versions.sort(function (a, b) {
    return semver[compare](a, b, options)
  }).map(function (v) {
    return semver.clean(v, options)
  }).map(function (v) {
    return inc ? semver.inc(v, inc, options, identifier) : v
  }).forEach(function (v, i, _) { console.log(v) })
}

function help () {
  console.log(['SemVer ' + version,
    '',
    'A JavaScript implementation of the https://semver.org/ specification',
    'Copyright Isaac Z. Schlueter',
    '',
    'Usage: semver [options] <version> [<version> [...]]',
    'Prints valid versions sorted by SemVer precedence',
    '',
    'Options:',
    '-r --range <range>',
    '        Print versions that match the specified range.',
    '',
    '-i --increment [<level>]',
    '        Increment a version by the specified level.  Level can',
    '        be one of: major, minor, patch, premajor, preminor,',
    "        prepatch, or prerelease.  Default level is 'patch'.",
    '        Only one version may be specified.',
    '',
    '--preid <identifier>',
    '        Identifier to be used to prefix premajor, preminor,',
    '        prepatch or prerelease version increments.',
    '',
    '-l --loose',
    '        Interpret versions and ranges loosely',
    '',
    '-p --include-prerelease',
    '        Always include prerelease versions in range matching',
    '',
    '-c --coerce',
    '        Coerce a string into SemVer if possible',
    '        (does not imply --loose)',
    '',
    '--rtl',
    '        Coerce version strings right to left',
    '',
    '--ltr',
    '        Coerce version strings left to right (default)',
    '',
    'Program exits successfully if any valid version satisfies',
    'all supplied ranges, and prints all satisfying versions.',
    '',
    'If no satisfying versions are found, then exits failure.',
    '',
    'Versions are printed in ascending order, so supplying',
    'multiple versions to the utility will just sort them.'
  ].join('\n'))
}
'use strict';

module.exports = options => {
	options = Object.assign({
		onlyFirst: false
	}, options);

	const pattern = [
		'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
		'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
	].join('|');

	return new RegExp(pattern, options.onlyFirst ? undefined : 'g');
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Regular expression for matching ANSI escape codes",
  "devDependencies": {
    "ava": "^0.25.0",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/ansi-regex#readme",
  "license": "MIT",
  "name": "ansi-regex",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/ansi-regex.git"
  },
  "version": "4.1.0"
}'use strict';

const preserveCamelCase = string => {
	let isLastCharLower = false;
	let isLastCharUpper = false;
	let isLastLastCharUpper = false;

	for (let i = 0; i < string.length; i++) {
		const character = string[i];

		if (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) {
			string = string.slice(0, i) + '-' + string.slice(i);
			isLastCharLower = false;
			isLastLastCharUpper = isLastCharUpper;
			isLastCharUpper = true;
			i++;
		} else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) {
			string = string.slice(0, i - 1) + '-' + string.slice(i - 1);
			isLastLastCharUpper = isLastCharUpper;
			isLastCharUpper = false;
			isLastCharLower = true;
		} else {
			isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character;
			isLastLastCharUpper = isLastCharUpper;
			isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character;
		}
	}

	return string;
};

const camelCase = (input, options) => {
	if (!(typeof input === 'string' || Array.isArray(input))) {
		throw new TypeError('Expected the input to be `string | string[]`');
	}

	options = Object.assign({
		pascalCase: false
	}, options);

	const postProcess = x => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x;

	if (Array.isArray(input)) {
		input = input.map(x => x.trim())
			.filter(x => x.length)
			.join('-');
	} else {
		input = input.trim();
	}

	if (input.length === 0) {
		return '';
	}

	if (input.length === 1) {
		return options.pascalCase ? input.toUpperCase() : input.toLowerCase();
	}

	const hasUpperCase = input !== input.toLowerCase();

	if (hasUpperCase) {
		input = preserveCamelCase(input);
	}

	input = input
		.replace(/^[_.\- ]+/, '')
		.toLowerCase()
		.replace(/[_.\- ]+(\w|$)/g, (_, p1) => p1.toUpperCase())
		.replace(/\d+(\w|$)/g, m => m.toUpperCase());

	return postProcess(input);
};

module.exports = camelCase;
// TODO: Remove this for the next major release
module.exports.default = camelCase;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` â†’ `fooBar`",
  "devDependencies": {
    "ava": "^1.4.1",
    "tsd": "^0.7.1",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/sindresorhus/camelcase#readme",
  "license": "MIT",
  "name": "camelcase",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/camelcase.git"
  },
  "version": "5.3.1"
}'use strict';
/* eslint-disable yoda */
module.exports = x => {
	if (Number.isNaN(x)) {
		return false;
	}

	// code points are derived from:
	// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt
	if (
		x >= 0x1100 && (
			x <= 0x115f ||  // Hangul Jamo
			x === 0x2329 || // LEFT-POINTING ANGLE BRACKET
			x === 0x232a || // RIGHT-POINTING ANGLE BRACKET
			// CJK Radicals Supplement .. Enclosed CJK Letters and Months
			(0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||
			// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
			(0x3250 <= x && x <= 0x4dbf) ||
			// CJK Unified Ideographs .. Yi Radicals
			(0x4e00 <= x && x <= 0xa4c6) ||
			// Hangul Jamo Extended-A
			(0xa960 <= x && x <= 0xa97c) ||
			// Hangul Syllables
			(0xac00 <= x && x <= 0xd7a3) ||
			// CJK Compatibility Ideographs
			(0xf900 <= x && x <= 0xfaff) ||
			// Vertical Forms
			(0xfe10 <= x && x <= 0xfe19) ||
			// CJK Compatibility Forms .. Small Form Variants
			(0xfe30 <= x && x <= 0xfe6b) ||
			// Halfwidth and Fullwidth Forms
			(0xff01 <= x && x <= 0xff60) ||
			(0xffe0 <= x && x <= 0xffe6) ||
			// Kana Supplement
			(0x1b000 <= x && x <= 0x1b001) ||
			// Enclosed Ideographic Supplement
			(0x1f200 <= x && x <= 0x1f251) ||
			// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
			(0x20000 <= x && x <= 0x3fffd)
		)
	) {
		return true;
	}

	return false;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if the character represented by a given Unicode code point is fullwidth",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/is-fullwidth-code-point#readme",
  "license": "MIT",
  "name": "is-fullwidth-code-point",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git"
  },
  "version": "2.0.0"
}'use strict';
const stripAnsi = require('strip-ansi');
const isFullwidthCodePoint = require('is-fullwidth-code-point');
const emojiRegex = require('emoji-regex')();

module.exports = input => {
	input = input.replace(emojiRegex, '  ');

	if (typeof input !== 'string' || input.length === 0) {
		return 0;
	}

	input = stripAnsi(input);

	let width = 0;

	for (let i = 0; i < input.length; i++) {
		const code = input.codePointAt(i);

		// Ignore control characters
		if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {
			continue;
		}

		// Ignore combining characters
		if (code >= 0x300 && code <= 0x36F) {
			continue;
		}

		// Surrogates
		if (code > 0xFFFF) {
			i++;
		}

		width += isFullwidthCodePoint(code) ? 2 : 1;
	}

	return width;
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "emoji-regex": "^7.0.1",
    "is-fullwidth-code-point": "^2.0.0",
    "strip-ansi": "^5.1.0"
  },
  "deprecated": false,
  "description": "Get the visual width of a string - the number of columns required to display it",
  "devDependencies": {
    "ava": "^1.0.1",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/string-width#readme",
  "license": "MIT",
  "name": "string-width",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/string-width.git"
  },
  "version": "3.1.0"
}'use strict';
const ansiRegex = require('ansi-regex');

const stripAnsi = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;

module.exports = stripAnsi;
module.exports.default = stripAnsi;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "ansi-regex": "^4.1.0"
  },
  "deprecated": false,
  "description": "Strip ANSI escape codes from a string",
  "devDependencies": {
    "ava": "^1.3.1",
    "tsd-check": "^0.5.0",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/chalk/strip-ansi#readme",
  "license": "MIT",
  "name": "strip-ansi",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/strip-ansi.git"
  },
  "version": "5.2.0"
}(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the 'Software'), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial 
portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

{
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "browser": "./src/browser.js",
  "dependencies": {
    "ms": "2.1.2"
  },
  "deprecated": false,
  "description": "small debugging utility",
  "devDependencies": {
    "brfs": "^2.0.1",
    "browserify": "^16.2.3",
    "coveralls": "^3.0.2",
    "istanbul": "^0.4.5",
    "karma": "^3.1.4",
    "karma-browserify": "^6.0.0",
    "karma-chrome-launcher": "^2.2.0",
    "karma-mocha": "^1.3.0",
    "mocha": "^5.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6.0"
  },
  "files": [
    "src",
    "LICENSE",
    "README.md"
  ],
  "homepage": "https://github.com/visionmedia/debug#readme",
  "license": "MIT",
  "main": "./src/index.js",
  "name": "debug",
  "peerDependenciesMeta": {
    "supports-color": {
      "optional": true
    }
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "version": "4.2.0"
}/* eslint-env browser */

/**
 * This is the web browser implementation of `debug()`.
 */

exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = localstorage();

/**
 * Colors.
 */

exports.colors = [
	'#0000CC',
	'#0000FF',
	'#0033CC',
	'#0033FF',
	'#0066CC',
	'#0066FF',
	'#0099CC',
	'#0099FF',
	'#00CC00',
	'#00CC33',
	'#00CC66',
	'#00CC99',
	'#00CCCC',
	'#00CCFF',
	'#3300CC',
	'#3300FF',
	'#3333CC',
	'#3333FF',
	'#3366CC',
	'#3366FF',
	'#3399CC',
	'#3399FF',
	'#33CC00',
	'#33CC33',
	'#33CC66',
	'#33CC99',
	'#33CCCC',
	'#33CCFF',
	'#6600CC',
	'#6600FF',
	'#6633CC',
	'#6633FF',
	'#66CC00',
	'#66CC33',
	'#9900CC',
	'#9900FF',
	'#9933CC',
	'#9933FF',
	'#99CC00',
	'#99CC33',
	'#CC0000',
	'#CC0033',
	'#CC0066',
	'#CC0099',
	'#CC00CC',
	'#CC00FF',
	'#CC3300',
	'#CC3333',
	'#CC3366',
	'#CC3399',
	'#CC33CC',
	'#CC33FF',
	'#CC6600',
	'#CC6633',
	'#CC9900',
	'#CC9933',
	'#CCCC00',
	'#CCCC33',
	'#FF0000',
	'#FF0033',
	'#FF0066',
	'#FF0099',
	'#FF00CC',
	'#FF00FF',
	'#FF3300',
	'#FF3333',
	'#FF3366',
	'#FF3399',
	'#FF33CC',
	'#FF33FF',
	'#FF6600',
	'#FF6633',
	'#FF9900',
	'#FF9933',
	'#FFCC00',
	'#FFCC33'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

// eslint-disable-next-line complexity
function useColors() {
	// NB: In an Electron preload script, document will be defined but not fully
	// initialized. Since we know we're in Chrome, we'll just detect this case
	// explicitly
	if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
		return true;
	}

	// Internet Explorer and Edge do not support colors.
	if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
		return false;
	}

	// Is webkit? http://stackoverflow.com/a/16459606/376773
	// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
	return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
		// Is firebug? http://stackoverflow.com/a/398120/376773
		(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
		// Is firefox >= v31?
		// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
		// Double check webkit in userAgent just in case we are in a worker
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	args[0] = (this.useColors ? '%c' : '') +
		this.namespace +
		(this.useColors ? ' %c' : ' ') +
		args[0] +
		(this.useColors ? '%c ' : ' ') +
		'+' + module.exports.humanize(this.diff);

	if (!this.useColors) {
		return;
	}

	const c = 'color: ' + this.color;
	args.splice(1, 0, c, 'color: inherit');

	// The final "%c" is somewhat tricky, because there could be other
	// arguments passed either before or after the %c, so we need to
	// figure out the correct index to insert the CSS into
	let index = 0;
	let lastC = 0;
	args[0].replace(/%[a-zA-Z%]/g, match => {
		if (match === '%%') {
			return;
		}
		index++;
		if (match === '%c') {
			// We only are interested in the *last* %c
			// (the user may have provided their own)
			lastC = index;
		}
	});

	args.splice(lastC, 0, c);
}

/**
 * Invokes `console.debug()` when available.
 * No-op when `console.debug` is not a "function".
 * If `console.debug` is not available, falls back
 * to `console.log`.
 *
 * @api public
 */
exports.log = console.debug || console.log || (() => {});

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	try {
		if (namespaces) {
			exports.storage.setItem('debug', namespaces);
		} else {
			exports.storage.removeItem('debug');
		}
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */
function load() {
	let r;
	try {
		r = exports.storage.getItem('debug');
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}

	// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
	if (!r && typeof process !== 'undefined' && 'env' in process) {
		r = process.env.DEBUG;
	}

	return r;
}

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
	try {
		// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
		// The Browser also has localStorage in the global context.
		return localStorage;
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

formatters.j = function (v) {
	try {
		return JSON.stringify(v);
	} catch (error) {
		return '[UnexpectedJSONParseError]: ' + error.message;
	}
};

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 */

function setup(env) {
	createDebug.debug = createDebug;
	createDebug.default = createDebug;
	createDebug.coerce = coerce;
	createDebug.disable = disable;
	createDebug.enable = enable;
	createDebug.enabled = enabled;
	createDebug.humanize = require('ms');

	Object.keys(env).forEach(key => {
		createDebug[key] = env[key];
	});

	/**
	* Active `debug` instances.
	*/
	createDebug.instances = [];

	/**
	* The currently active debug mode names, and names to skip.
	*/

	createDebug.names = [];
	createDebug.skips = [];

	/**
	* Map of special "%n" handling functions, for the debug "format" argument.
	*
	* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
	*/
	createDebug.formatters = {};

	/**
	* Selects a color for a debug namespace
	* @param {String} namespace The namespace string for the for the debug instance to be colored
	* @return {Number|String} An ANSI color code for the given namespace
	* @api private
	*/
	function selectColor(namespace) {
		let hash = 0;

		for (let i = 0; i < namespace.length; i++) {
			hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
			hash |= 0; // Convert to 32bit integer
		}

		return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
	}
	createDebug.selectColor = selectColor;

	/**
	* Create a debugger with the given `namespace`.
	*
	* @param {String} namespace
	* @return {Function}
	* @api public
	*/
	function createDebug(namespace) {
		let prevTime;

		function debug(...args) {
			// Disabled?
			if (!debug.enabled) {
				return;
			}

			const self = debug;

			// Set `diff` timestamp
			const curr = Number(new Date());
			const ms = curr - (prevTime || curr);
			self.diff = ms;
			self.prev = prevTime;
			self.curr = curr;
			prevTime = curr;

			args[0] = createDebug.coerce(args[0]);

			if (typeof args[0] !== 'string') {
				// Anything else let's inspect with %O
				args.unshift('%O');
			}

			// Apply any `formatters` transformations
			let index = 0;
			args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
				// If we encounter an escaped % then don't increase the array index
				if (match === '%%') {
					return match;
				}
				index++;
				const formatter = createDebug.formatters[format];
				if (typeof formatter === 'function') {
					const val = args[index];
					match = formatter.call(self, val);

					// Now we need to remove `args[index]` since it's inlined in the `format`
					args.splice(index, 1);
					index--;
				}
				return match;
			});

			// Apply env-specific formatting (colors, etc.)
			createDebug.formatArgs.call(self, args);

			const logFn = self.log || createDebug.log;
			logFn.apply(self, args);
		}

		debug.namespace = namespace;
		debug.enabled = createDebug.enabled(namespace);
		debug.useColors = createDebug.useColors();
		debug.color = createDebug.selectColor(namespace);
		debug.destroy = destroy;
		debug.extend = extend;

		// Env-specific initialization logic for debug instances
		if (typeof createDebug.init === 'function') {
			createDebug.init(debug);
		}

		createDebug.instances.push(debug);

		return debug;
	}

	function destroy() {
		const index = createDebug.instances.indexOf(this);
		if (index !== -1) {
			createDebug.instances.splice(index, 1);
			return true;
		}
		return false;
	}

	function extend(namespace, delimiter) {
		const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
		newDebug.log = this.log;
		return newDebug;
	}

	/**
	* Enables a debug mode by namespaces. This can include modes
	* separated by a colon and wildcards.
	*
	* @param {String} namespaces
	* @api public
	*/
	function enable(namespaces) {
		createDebug.save(namespaces);

		createDebug.names = [];
		createDebug.skips = [];

		let i;
		const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
		const len = split.length;

		for (i = 0; i < len; i++) {
			if (!split[i]) {
				// ignore empty strings
				continue;
			}

			namespaces = split[i].replace(/\*/g, '.*?');

			if (namespaces[0] === '-') {
				createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
			} else {
				createDebug.names.push(new RegExp('^' + namespaces + '$'));
			}
		}

		for (i = 0; i < createDebug.instances.length; i++) {
			const instance = createDebug.instances[i];
			instance.enabled = createDebug.enabled(instance.namespace);
		}
	}

	/**
	* Disable debug output.
	*
	* @return {String} namespaces
	* @api public
	*/
	function disable() {
		const namespaces = [
			...createDebug.names.map(toNamespace),
			...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
		].join(',');
		createDebug.enable('');
		return namespaces;
	}

	/**
	* Returns true if the given mode name is enabled, false otherwise.
	*
	* @param {String} name
	* @return {Boolean}
	* @api public
	*/
	function enabled(name) {
		if (name[name.length - 1] === '*') {
			return true;
		}

		let i;
		let len;

		for (i = 0, len = createDebug.skips.length; i < len; i++) {
			if (createDebug.skips[i].test(name)) {
				return false;
			}
		}

		for (i = 0, len = createDebug.names.length; i < len; i++) {
			if (createDebug.names[i].test(name)) {
				return true;
			}
		}

		return false;
	}

	/**
	* Convert regexp to namespace
	*
	* @param {RegExp} regxep
	* @return {String} namespace
	* @api private
	*/
	function toNamespace(regexp) {
		return regexp.toString()
			.substring(2, regexp.toString().length - 2)
			.replace(/\.\*\?$/, '*');
	}

	/**
	* Coerce `val`.
	*
	* @param {Mixed} val
	* @return {Mixed}
	* @api private
	*/
	function coerce(val) {
		if (val instanceof Error) {
			return val.stack || val.message;
		}
		return val;
	}

	createDebug.enable(createDebug.load());

	return createDebug;
}

module.exports = setup;
/**
 * Detect Electron renderer / nwjs process, which is node, but we should
 * treat as a browser.
 */

if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
	module.exports = require('./browser.js');
} else {
	module.exports = require('./node.js');
}
/**
 * Module dependencies.
 */

const tty = require('tty');
const util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 */

exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

try {
	// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
	// eslint-disable-next-line import/no-extraneous-dependencies
	const supportsColor = require('supports-color');

	if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
		exports.colors = [
			20,
			21,
			26,
			27,
			32,
			33,
			38,
			39,
			40,
			41,
			42,
			43,
			44,
			45,
			56,
			57,
			62,
			63,
			68,
			69,
			74,
			75,
			76,
			77,
			78,
			79,
			80,
			81,
			92,
			93,
			98,
			99,
			112,
			113,
			128,
			129,
			134,
			135,
			148,
			149,
			160,
			161,
			162,
			163,
			164,
			165,
			166,
			167,
			168,
			169,
			170,
			171,
			172,
			173,
			178,
			179,
			184,
			185,
			196,
			197,
			198,
			199,
			200,
			201,
			202,
			203,
			204,
			205,
			206,
			207,
			208,
			209,
			214,
			215,
			220,
			221
		];
	}
} catch (error) {
	// Swallow - we only care if `supports-color` is available; it doesn't have to be.
}

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(key => {
	return /^debug_/i.test(key);
}).reduce((obj, key) => {
	// Camel-case
	const prop = key
		.substring(6)
		.toLowerCase()
		.replace(/_([a-z])/g, (_, k) => {
			return k.toUpperCase();
		});

	// Coerce string value into JS value
	let val = process.env[key];
	if (/^(yes|on|true|enabled)$/i.test(val)) {
		val = true;
	} else if (/^(no|off|false|disabled)$/i.test(val)) {
		val = false;
	} else if (val === 'null') {
		val = null;
	} else {
		val = Number(val);
	}

	obj[prop] = val;
	return obj;
}, {});

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
	return 'colors' in exports.inspectOpts ?
		Boolean(exports.inspectOpts.colors) :
		tty.isatty(process.stderr.fd);
}

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	const {namespace: name, useColors} = this;

	if (useColors) {
		const c = this.color;
		const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
		const prefix = `  ${colorCode};1m${name} \u001B[0m`;

		args[0] = prefix + args[0].split('\n').join('\n' + prefix);
		args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
	} else {
		args[0] = getDate() + name + ' ' + args[0];
	}
}

function getDate() {
	if (exports.inspectOpts.hideDate) {
		return '';
	}
	return new Date().toISOString() + ' ';
}

/**
 * Invokes `util.format()` with the specified arguments and writes to stderr.
 */

function log(...args) {
	return process.stderr.write(util.format(...args) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	if (namespaces) {
		process.env.DEBUG = namespaces;
	} else {
		// If you set a process.env field to null or undefined, it gets cast to the
		// string 'null' or 'undefined'. Just delete instead.
		delete process.env.DEBUG;
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
	return process.env.DEBUG;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init(debug) {
	debug.inspectOpts = {};

	const keys = Object.keys(exports.inspectOpts);
	for (let i = 0; i < keys.length; i++) {
		debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

formatters.o = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts)
		.replace(/\s*\n\s*/g, ' ');
};

/**
 * Map %O to `util.inspect()`, allowing multiple lines if needed.
 */

formatters.O = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts);
};
(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the 'Software'), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial 
portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

{
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "browser": "./src/browser.js",
  "dependencies": {
    "ms": "2.1.2"
  },
  "deprecated": false,
  "description": "small debugging utility",
  "devDependencies": {
    "brfs": "^2.0.1",
    "browserify": "^16.2.3",
    "coveralls": "^3.0.2",
    "istanbul": "^0.4.5",
    "karma": "^3.1.4",
    "karma-browserify": "^6.0.0",
    "karma-chrome-launcher": "^2.2.0",
    "karma-mocha": "^1.3.0",
    "mocha": "^5.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6.0"
  },
  "files": [
    "src",
    "LICENSE",
    "README.md"
  ],
  "homepage": "https://github.com/visionmedia/debug#readme",
  "license": "MIT",
  "main": "./src/index.js",
  "name": "debug",
  "peerDependenciesMeta": {
    "supports-color": {
      "optional": true
    }
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "version": "4.2.0"
}/* eslint-env browser */

/**
 * This is the web browser implementation of `debug()`.
 */

exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = localstorage();

/**
 * Colors.
 */

exports.colors = [
	'#0000CC',
	'#0000FF',
	'#0033CC',
	'#0033FF',
	'#0066CC',
	'#0066FF',
	'#0099CC',
	'#0099FF',
	'#00CC00',
	'#00CC33',
	'#00CC66',
	'#00CC99',
	'#00CCCC',
	'#00CCFF',
	'#3300CC',
	'#3300FF',
	'#3333CC',
	'#3333FF',
	'#3366CC',
	'#3366FF',
	'#3399CC',
	'#3399FF',
	'#33CC00',
	'#33CC33',
	'#33CC66',
	'#33CC99',
	'#33CCCC',
	'#33CCFF',
	'#6600CC',
	'#6600FF',
	'#6633CC',
	'#6633FF',
	'#66CC00',
	'#66CC33',
	'#9900CC',
	'#9900FF',
	'#9933CC',
	'#9933FF',
	'#99CC00',
	'#99CC33',
	'#CC0000',
	'#CC0033',
	'#CC0066',
	'#CC0099',
	'#CC00CC',
	'#CC00FF',
	'#CC3300',
	'#CC3333',
	'#CC3366',
	'#CC3399',
	'#CC33CC',
	'#CC33FF',
	'#CC6600',
	'#CC6633',
	'#CC9900',
	'#CC9933',
	'#CCCC00',
	'#CCCC33',
	'#FF0000',
	'#FF0033',
	'#FF0066',
	'#FF0099',
	'#FF00CC',
	'#FF00FF',
	'#FF3300',
	'#FF3333',
	'#FF3366',
	'#FF3399',
	'#FF33CC',
	'#FF33FF',
	'#FF6600',
	'#FF6633',
	'#FF9900',
	'#FF9933',
	'#FFCC00',
	'#FFCC33'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

// eslint-disable-next-line complexity
function useColors() {
	// NB: In an Electron preload script, document will be defined but not fully
	// initialized. Since we know we're in Chrome, we'll just detect this case
	// explicitly
	if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
		return true;
	}

	// Internet Explorer and Edge do not support colors.
	if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
		return false;
	}

	// Is webkit? http://stackoverflow.com/a/16459606/376773
	// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
	return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
		// Is firebug? http://stackoverflow.com/a/398120/376773
		(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
		// Is firefox >= v31?
		// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
		// Double check webkit in userAgent just in case we are in a worker
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	args[0] = (this.useColors ? '%c' : '') +
		this.namespace +
		(this.useColors ? ' %c' : ' ') +
		args[0] +
		(this.useColors ? '%c ' : ' ') +
		'+' + module.exports.humanize(this.diff);

	if (!this.useColors) {
		return;
	}

	const c = 'color: ' + this.color;
	args.splice(1, 0, c, 'color: inherit');

	// The final "%c" is somewhat tricky, because there could be other
	// arguments passed either before or after the %c, so we need to
	// figure out the correct index to insert the CSS into
	let index = 0;
	let lastC = 0;
	args[0].replace(/%[a-zA-Z%]/g, match => {
		if (match === '%%') {
			return;
		}
		index++;
		if (match === '%c') {
			// We only are interested in the *last* %c
			// (the user may have provided their own)
			lastC = index;
		}
	});

	args.splice(lastC, 0, c);
}

/**
 * Invokes `console.debug()` when available.
 * No-op when `console.debug` is not a "function".
 * If `console.debug` is not available, falls back
 * to `console.log`.
 *
 * @api public
 */
exports.log = console.debug || console.log || (() => {});

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	try {
		if (namespaces) {
			exports.storage.setItem('debug', namespaces);
		} else {
			exports.storage.removeItem('debug');
		}
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */
function load() {
	let r;
	try {
		r = exports.storage.getItem('debug');
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}

	// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
	if (!r && typeof process !== 'undefined' && 'env' in process) {
		r = process.env.DEBUG;
	}

	return r;
}

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
	try {
		// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
		// The Browser also has localStorage in the global context.
		return localStorage;
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

formatters.j = function (v) {
	try {
		return JSON.stringify(v);
	} catch (error) {
		return '[UnexpectedJSONParseError]: ' + error.message;
	}
};

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 */

function setup(env) {
	createDebug.debug = createDebug;
	createDebug.default = createDebug;
	createDebug.coerce = coerce;
	createDebug.disable = disable;
	createDebug.enable = enable;
	createDebug.enabled = enabled;
	createDebug.humanize = require('ms');

	Object.keys(env).forEach(key => {
		createDebug[key] = env[key];
	});

	/**
	* Active `debug` instances.
	*/
	createDebug.instances = [];

	/**
	* The currently active debug mode names, and names to skip.
	*/

	createDebug.names = [];
	createDebug.skips = [];

	/**
	* Map of special "%n" handling functions, for the debug "format" argument.
	*
	* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
	*/
	createDebug.formatters = {};

	/**
	* Selects a color for a debug namespace
	* @param {String} namespace The namespace string for the for the debug instance to be colored
	* @return {Number|String} An ANSI color code for the given namespace
	* @api private
	*/
	function selectColor(namespace) {
		let hash = 0;

		for (let i = 0; i < namespace.length; i++) {
			hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
			hash |= 0; // Convert to 32bit integer
		}

		return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
	}
	createDebug.selectColor = selectColor;

	/**
	* Create a debugger with the given `namespace`.
	*
	* @param {String} namespace
	* @return {Function}
	* @api public
	*/
	function createDebug(namespace) {
		let prevTime;

		function debug(...args) {
			// Disabled?
			if (!debug.enabled) {
				return;
			}

			const self = debug;

			// Set `diff` timestamp
			const curr = Number(new Date());
			const ms = curr - (prevTime || curr);
			self.diff = ms;
			self.prev = prevTime;
			self.curr = curr;
			prevTime = curr;

			args[0] = createDebug.coerce(args[0]);

			if (typeof args[0] !== 'string') {
				// Anything else let's inspect with %O
				args.unshift('%O');
			}

			// Apply any `formatters` transformations
			let index = 0;
			args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
				// If we encounter an escaped % then don't increase the array index
				if (match === '%%') {
					return match;
				}
				index++;
				const formatter = createDebug.formatters[format];
				if (typeof formatter === 'function') {
					const val = args[index];
					match = formatter.call(self, val);

					// Now we need to remove `args[index]` since it's inlined in the `format`
					args.splice(index, 1);
					index--;
				}
				return match;
			});

			// Apply env-specific formatting (colors, etc.)
			createDebug.formatArgs.call(self, args);

			const logFn = self.log || createDebug.log;
			logFn.apply(self, args);
		}

		debug.namespace = namespace;
		debug.enabled = createDebug.enabled(namespace);
		debug.useColors = createDebug.useColors();
		debug.color = createDebug.selectColor(namespace);
		debug.destroy = destroy;
		debug.extend = extend;

		// Env-specific initialization logic for debug instances
		if (typeof createDebug.init === 'function') {
			createDebug.init(debug);
		}

		createDebug.instances.push(debug);

		return debug;
	}

	function destroy() {
		const index = createDebug.instances.indexOf(this);
		if (index !== -1) {
			createDebug.instances.splice(index, 1);
			return true;
		}
		return false;
	}

	function extend(namespace, delimiter) {
		const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
		newDebug.log = this.log;
		return newDebug;
	}

	/**
	* Enables a debug mode by namespaces. This can include modes
	* separated by a colon and wildcards.
	*
	* @param {String} namespaces
	* @api public
	*/
	function enable(namespaces) {
		createDebug.save(namespaces);

		createDebug.names = [];
		createDebug.skips = [];

		let i;
		const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
		const len = split.length;

		for (i = 0; i < len; i++) {
			if (!split[i]) {
				// ignore empty strings
				continue;
			}

			namespaces = split[i].replace(/\*/g, '.*?');

			if (namespaces[0] === '-') {
				createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
			} else {
				createDebug.names.push(new RegExp('^' + namespaces + '$'));
			}
		}

		for (i = 0; i < createDebug.instances.length; i++) {
			const instance = createDebug.instances[i];
			instance.enabled = createDebug.enabled(instance.namespace);
		}
	}

	/**
	* Disable debug output.
	*
	* @return {String} namespaces
	* @api public
	*/
	function disable() {
		const namespaces = [
			...createDebug.names.map(toNamespace),
			...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
		].join(',');
		createDebug.enable('');
		return namespaces;
	}

	/**
	* Returns true if the given mode name is enabled, false otherwise.
	*
	* @param {String} name
	* @return {Boolean}
	* @api public
	*/
	function enabled(name) {
		if (name[name.length - 1] === '*') {
			return true;
		}

		let i;
		let len;

		for (i = 0, len = createDebug.skips.length; i < len; i++) {
			if (createDebug.skips[i].test(name)) {
				return false;
			}
		}

		for (i = 0, len = createDebug.names.length; i < len; i++) {
			if (createDebug.names[i].test(name)) {
				return true;
			}
		}

		return false;
	}

	/**
	* Convert regexp to namespace
	*
	* @param {RegExp} regxep
	* @return {String} namespace
	* @api private
	*/
	function toNamespace(regexp) {
		return regexp.toString()
			.substring(2, regexp.toString().length - 2)
			.replace(/\.\*\?$/, '*');
	}

	/**
	* Coerce `val`.
	*
	* @param {Mixed} val
	* @return {Mixed}
	* @api private
	*/
	function coerce(val) {
		if (val instanceof Error) {
			return val.stack || val.message;
		}
		return val;
	}

	createDebug.enable(createDebug.load());

	return createDebug;
}

module.exports = setup;
/**
 * Detect Electron renderer / nwjs process, which is node, but we should
 * treat as a browser.
 */

if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
	module.exports = require('./browser.js');
} else {
	module.exports = require('./node.js');
}
/**
 * Module dependencies.
 */

const tty = require('tty');
const util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 */

exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

try {
	// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
	// eslint-disable-next-line import/no-extraneous-dependencies
	const supportsColor = require('supports-color');

	if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
		exports.colors = [
			20,
			21,
			26,
			27,
			32,
			33,
			38,
			39,
			40,
			41,
			42,
			43,
			44,
			45,
			56,
			57,
			62,
			63,
			68,
			69,
			74,
			75,
			76,
			77,
			78,
			79,
			80,
			81,
			92,
			93,
			98,
			99,
			112,
			113,
			128,
			129,
			134,
			135,
			148,
			149,
			160,
			161,
			162,
			163,
			164,
			165,
			166,
			167,
			168,
			169,
			170,
			171,
			172,
			173,
			178,
			179,
			184,
			185,
			196,
			197,
			198,
			199,
			200,
			201,
			202,
			203,
			204,
			205,
			206,
			207,
			208,
			209,
			214,
			215,
			220,
			221
		];
	}
} catch (error) {
	// Swallow - we only care if `supports-color` is available; it doesn't have to be.
}

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(key => {
	return /^debug_/i.test(key);
}).reduce((obj, key) => {
	// Camel-case
	const prop = key
		.substring(6)
		.toLowerCase()
		.replace(/_([a-z])/g, (_, k) => {
			return k.toUpperCase();
		});

	// Coerce string value into JS value
	let val = process.env[key];
	if (/^(yes|on|true|enabled)$/i.test(val)) {
		val = true;
	} else if (/^(no|off|false|disabled)$/i.test(val)) {
		val = false;
	} else if (val === 'null') {
		val = null;
	} else {
		val = Number(val);
	}

	obj[prop] = val;
	return obj;
}, {});

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
	return 'colors' in exports.inspectOpts ?
		Boolean(exports.inspectOpts.colors) :
		tty.isatty(process.stderr.fd);
}

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	const {namespace: name, useColors} = this;

	if (useColors) {
		const c = this.color;
		const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
		const prefix = `  ${colorCode};1m${name} \u001B[0m`;

		args[0] = prefix + args[0].split('\n').join('\n' + prefix);
		args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
	} else {
		args[0] = getDate() + name + ' ' + args[0];
	}
}

function getDate() {
	if (exports.inspectOpts.hideDate) {
		return '';
	}
	return new Date().toISOString() + ' ';
}

/**
 * Invokes `util.format()` with the specified arguments and writes to stderr.
 */

function log(...args) {
	return process.stderr.write(util.format(...args) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	if (namespaces) {
		process.env.DEBUG = namespaces;
	} else {
		// If you set a process.env field to null or undefined, it gets cast to the
		// string 'null' or 'undefined'. Just delete instead.
		delete process.env.DEBUG;
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
	return process.env.DEBUG;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init(debug) {
	debug.inspectOpts = {};

	const keys = Object.keys(exports.inspectOpts);
	for (let i = 0; i < keys.length; i++) {
		debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

formatters.o = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts)
		.replace(/\s*\n\s*/g, ' ');
};

/**
 * Map %O to `util.inspect()`, allowing multiple lines if needed.
 */

formatters.O = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts);
};
The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

====

`String.fromCodePoint` by Mathias Bynens used according to terms of MIT
License, as follows:

    Copyright Mathias Bynens <https://mathiasbynens.be/>

    Permission is hereby granted, free of charge, to any person obtaining
    a copy of this software and associated documentation files (the
    "Software"), to deal in the Software without restriction, including
    without limitation the rights to use, copy, modify, merge, publish,
    distribute, sublicense, and/or sell copies of the Software, and to
    permit persons to whom the Software is furnished to do so, subject to
    the following conditions:

    The above copyright notice and this permission notice shall be
    included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Isaac Z. Schlueter",
    "email": "i@izs.me",
    "url": "http://blog.izs.me/"
  },
  "deprecated": false,
  "description": "An evented streaming XML parser in JavaScript",
  "devDependencies": {
    "standard": "^8.6.0",
    "tap": "^10.5.1"
  },
  "files": [
    "lib/sax.js",
    "LICENSE",
    "README.md"
  ],
  "homepage": "https://github.com/isaacs/sax-js#readme",
  "license": "ISC",
  "main": "lib/sax.js",
  "name": "sax",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/sax-js.git"
  },
  "version": "1.2.4"
};(function (sax) { // wrapper for non-node envs
  sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
  sax.SAXParser = SAXParser
  sax.SAXStream = SAXStream
  sax.createStream = createStream

  // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
  // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
  // since that's the earliest that a buffer overrun could occur.  This way, checks are
  // as rare as required, but as often as necessary to ensure never crossing this bound.
  // Furthermore, buffers are only tested at most once per write(), so passing a very
  // large string into write() might have undesirable effects, but this is manageable by
  // the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme
  // edge case, result in creating at most one complete copy of the string passed in.
  // Set to Infinity to have unlimited buffers.
  sax.MAX_BUFFER_LENGTH = 64 * 1024

  var buffers = [
    'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',
    'procInstName', 'procInstBody', 'entity', 'attribName',
    'attribValue', 'cdata', 'script'
  ]

  sax.EVENTS = [
    'text',
    'processinginstruction',
    'sgmldeclaration',
    'doctype',
    'comment',
    'opentagstart',
    'attribute',
    'opentag',
    'closetag',
    'opencdata',
    'cdata',
    'closecdata',
    'error',
    'end',
    'ready',
    'script',
    'opennamespace',
    'closenamespace'
  ]

  function SAXParser (strict, opt) {
    if (!(this instanceof SAXParser)) {
      return new SAXParser(strict, opt)
    }

    var parser = this
    clearBuffers(parser)
    parser.q = parser.c = ''
    parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
    parser.opt = opt || {}
    parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
    parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'
    parser.tags = []
    parser.closed = parser.closedRoot = parser.sawRoot = false
    parser.tag = parser.error = null
    parser.strict = !!strict
    parser.noscript = !!(strict || parser.opt.noscript)
    parser.state = S.BEGIN
    parser.strictEntities = parser.opt.strictEntities
    parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)
    parser.attribList = []

    // namespaces form a prototype chain.
    // it always points at the current tag,
    // which protos to its parent tag.
    if (parser.opt.xmlns) {
      parser.ns = Object.create(rootNS)
    }

    // mostly just for error reporting
    parser.trackPosition = parser.opt.position !== false
    if (parser.trackPosition) {
      parser.position = parser.line = parser.column = 0
    }
    emit(parser, 'onready')
  }

  if (!Object.create) {
    Object.create = function (o) {
      function F () {}
      F.prototype = o
      var newf = new F()
      return newf
    }
  }

  if (!Object.keys) {
    Object.keys = function (o) {
      var a = []
      for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
      return a
    }
  }

  function checkBufferLength (parser) {
    var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
    var maxActual = 0
    for (var i = 0, l = buffers.length; i < l; i++) {
      var len = parser[buffers[i]].length
      if (len > maxAllowed) {
        // Text/cdata nodes can get big, and since they're buffered,
        // we can get here under normal conditions.
        // Avoid issues by emitting the text node now,
        // so at least it won't get any bigger.
        switch (buffers[i]) {
          case 'textNode':
            closeText(parser)
            break

          case 'cdata':
            emitNode(parser, 'oncdata', parser.cdata)
            parser.cdata = ''
            break

          case 'script':
            emitNode(parser, 'onscript', parser.script)
            parser.script = ''
            break

          default:
            error(parser, 'Max buffer length exceeded: ' + buffers[i])
        }
      }
      maxActual = Math.max(maxActual, len)
    }
    // schedule the next check for the earliest possible buffer overrun.
    var m = sax.MAX_BUFFER_LENGTH - maxActual
    parser.bufferCheckPosition = m + parser.position
  }

  function clearBuffers (parser) {
    for (var i = 0, l = buffers.length; i < l; i++) {
      parser[buffers[i]] = ''
    }
  }

  function flushBuffers (parser) {
    closeText(parser)
    if (parser.cdata !== '') {
      emitNode(parser, 'oncdata', parser.cdata)
      parser.cdata = ''
    }
    if (parser.script !== '') {
      emitNode(parser, 'onscript', parser.script)
      parser.script = ''
    }
  }

  SAXParser.prototype = {
    end: function () { end(this) },
    write: write,
    resume: function () { this.error = null; return this },
    close: function () { return this.write(null) },
    flush: function () { flushBuffers(this) }
  }

  var Stream
  try {
    Stream = require('stream').Stream
  } catch (ex) {
    Stream = function () {}
  }

  var streamWraps = sax.EVENTS.filter(function (ev) {
    return ev !== 'error' && ev !== 'end'
  })

  function createStream (strict, opt) {
    return new SAXStream(strict, opt)
  }

  function SAXStream (strict, opt) {
    if (!(this instanceof SAXStream)) {
      return new SAXStream(strict, opt)
    }

    Stream.apply(this)

    this._parser = new SAXParser(strict, opt)
    this.writable = true
    this.readable = true

    var me = this

    this._parser.onend = function () {
      me.emit('end')
    }

    this._parser.onerror = function (er) {
      me.emit('error', er)

      // if didn't throw, then means error was handled.
      // go ahead and clear error, so we can write again.
      me._parser.error = null
    }

    this._decoder = null

    streamWraps.forEach(function (ev) {
      Object.defineProperty(me, 'on' + ev, {
        get: function () {
          return me._parser['on' + ev]
        },
        set: function (h) {
          if (!h) {
            me.removeAllListeners(ev)
            me._parser['on' + ev] = h
            return h
          }
          me.on(ev, h)
        },
        enumerable: true,
        configurable: false
      })
    })
  }

  SAXStream.prototype = Object.create(Stream.prototype, {
    constructor: {
      value: SAXStream
    }
  })

  SAXStream.prototype.write = function (data) {
    if (typeof Buffer === 'function' &&
      typeof Buffer.isBuffer === 'function' &&
      Buffer.isBuffer(data)) {
      if (!this._decoder) {
        var SD = require('string_decoder').StringDecoder
        this._decoder = new SD('utf8')
      }
      data = this._decoder.write(data)
    }

    this._parser.write(data.toString())
    this.emit('data', data)
    return true
  }

  SAXStream.prototype.end = function (chunk) {
    if (chunk && chunk.length) {
      this.write(chunk)
    }
    this._parser.end()
    return true
  }

  SAXStream.prototype.on = function (ev, handler) {
    var me = this
    if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {
      me._parser['on' + ev] = function () {
        var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)
        args.splice(0, 0, ev)
        me.emit.apply(me, args)
      }
    }

    return Stream.prototype.on.call(me, ev, handler)
  }

  // this really needs to be replaced with character classes.
  // XML allows all manner of ridiculous numbers and digits.
  var CDATA = '[CDATA['
  var DOCTYPE = 'DOCTYPE'
  var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'
  var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'
  var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }

  // http://www.w3.org/TR/REC-xml/#NT-NameStartChar
  // This implementation works on strings, a single character at a time
  // as such, it cannot ever support astral-plane characters (10000-EFFFF)
  // without a significant breaking change to either this  parser, or the
  // JavaScript language.  Implementation of an emoji-capable xml parser
  // is left as an exercise for the reader.
  var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/

  var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/

  var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
  var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/

  function isWhitespace (c) {
    return c === ' ' || c === '\n' || c === '\r' || c === '\t'
  }

  function isQuote (c) {
    return c === '"' || c === '\''
  }

  function isAttribEnd (c) {
    return c === '>' || isWhitespace(c)
  }

  function isMatch (regex, c) {
    return regex.test(c)
  }

  function notMatch (regex, c) {
    return !isMatch(regex, c)
  }

  var S = 0
  sax.STATE = {
    BEGIN: S++, // leading byte order mark or whitespace
    BEGIN_WHITESPACE: S++, // leading whitespace
    TEXT: S++, // general stuff
    TEXT_ENTITY: S++, // &amp and such.
    OPEN_WAKA: S++, // <
    SGML_DECL: S++, // <!BLARG
    SGML_DECL_QUOTED: S++, // <!BLARG foo "bar
    DOCTYPE: S++, // <!DOCTYPE
    DOCTYPE_QUOTED: S++, // <!DOCTYPE "//blah
    DOCTYPE_DTD: S++, // <!DOCTYPE "//blah" [ ...
    DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE "//blah" [ "foo
    COMMENT_STARTING: S++, // <!-
    COMMENT: S++, // <!--
    COMMENT_ENDING: S++, // <!-- blah -
    COMMENT_ENDED: S++, // <!-- blah --
    CDATA: S++, // <![CDATA[ something
    CDATA_ENDING: S++, // ]
    CDATA_ENDING_2: S++, // ]]
    PROC_INST: S++, // <?hi
    PROC_INST_BODY: S++, // <?hi there
    PROC_INST_ENDING: S++, // <?hi "there" ?
    OPEN_TAG: S++, // <strong
    OPEN_TAG_SLASH: S++, // <strong /
    ATTRIB: S++, // <a
    ATTRIB_NAME: S++, // <a foo
    ATTRIB_NAME_SAW_WHITE: S++, // <a foo _
    ATTRIB_VALUE: S++, // <a foo=
    ATTRIB_VALUE_QUOTED: S++, // <a foo="bar
    ATTRIB_VALUE_CLOSED: S++, // <a foo="bar"
    ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar
    ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar="&quot;"
    ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot
    CLOSE_TAG: S++, // </a
    CLOSE_TAG_SAW_WHITE: S++, // </a   >
    SCRIPT: S++, // <script> ...
    SCRIPT_ENDING: S++ // <script> ... <
  }

  sax.XML_ENTITIES = {
    'amp': '&',
    'gt': '>',
    'lt': '<',
    'quot': '"',
    'apos': "'"
  }

  sax.ENTITIES = {
    'amp': '&',
    'gt': '>',
    'lt': '<',
    'quot': '"',
    'apos': "'",
    'AElig': 198,
    'Aacute': 193,
    'Acirc': 194,
    'Agrave': 192,
    'Aring': 197,
    'Atilde': 195,
    'Auml': 196,
    'Ccedil': 199,
    'ETH': 208,
    'Eacute': 201,
    'Ecirc': 202,
    'Egrave': 200,
    'Euml': 203,
    'Iacute': 205,
    'Icirc': 206,
    'Igrave': 204,
    'Iuml': 207,
    'Ntilde': 209,
    'Oacute': 211,
    'Ocirc': 212,
    'Ograve': 210,
    'Oslash': 216,
    'Otilde': 213,
    'Ouml': 214,
    'THORN': 222,
    'Uacute': 218,
    'Ucirc': 219,
    'Ugrave': 217,
    'Uuml': 220,
    'Yacute': 221,
    'aacute': 225,
    'acirc': 226,
    'aelig': 230,
    'agrave': 224,
    'aring': 229,
    'atilde': 227,
    'auml': 228,
    'ccedil': 231,
    'eacute': 233,
    'ecirc': 234,
    'egrave': 232,
    'eth': 240,
    'euml': 235,
    'iacute': 237,
    'icirc': 238,
    'igrave': 236,
    'iuml': 239,
    'ntilde': 241,
    'oacute': 243,
    'ocirc': 244,
    'ograve': 242,
    'oslash': 248,
    'otilde': 245,
    'ouml': 246,
    'szlig': 223,
    'thorn': 254,
    'uacute': 250,
    'ucirc': 251,
    'ugrave': 249,
    'uuml': 252,
    'yacute': 253,
    'yuml': 255,
    'copy': 169,
    'reg': 174,
    'nbsp': 160,
    'iexcl': 161,
    'cent': 162,
    'pound': 163,
    'curren': 164,
    'yen': 165,
    'brvbar': 166,
    'sect': 167,
    'uml': 168,
    'ordf': 170,
    'laquo': 171,
    'not': 172,
    'shy': 173,
    'macr': 175,
    'deg': 176,
    'plusmn': 177,
    'sup1': 185,
    'sup2': 178,
    'sup3': 179,
    'acute': 180,
    'micro': 181,
    'para': 182,
    'middot': 183,
    'cedil': 184,
    'ordm': 186,
    'raquo': 187,
    'frac14': 188,
    'frac12': 189,
    'frac34': 190,
    'iquest': 191,
    'times': 215,
    'divide': 247,
    'OElig': 338,
    'oelig': 339,
    'Scaron': 352,
    'scaron': 353,
    'Yuml': 376,
    'fnof': 402,
    'circ': 710,
    'tilde': 732,
    'Alpha': 913,
    'Beta': 914,
    'Gamma': 915,
    'Delta': 916,
    'Epsilon': 917,
    'Zeta': 918,
    'Eta': 919,
    'Theta': 920,
    'Iota': 921,
    'Kappa': 922,
    'Lambda': 923,
    'Mu': 924,
    'Nu': 925,
    'Xi': 926,
    'Omicron': 927,
    'Pi': 928,
    'Rho': 929,
    'Sigma': 931,
    'Tau': 932,
    'Upsilon': 933,
    'Phi': 934,
    'Chi': 935,
    'Psi': 936,
    'Omega': 937,
    'alpha': 945,
    'beta': 946,
    'gamma': 947,
    'delta': 948,
    'epsilon': 949,
    'zeta': 950,
    'eta': 951,
    'theta': 952,
    'iota': 953,
    'kappa': 954,
    'lambda': 955,
    'mu': 956,
    'nu': 957,
    'xi': 958,
    'omicron': 959,
    'pi': 960,
    'rho': 961,
    'sigmaf': 962,
    'sigma': 963,
    'tau': 964,
    'upsilon': 965,
    'phi': 966,
    'chi': 967,
    'psi': 968,
    'omega': 969,
    'thetasym': 977,
    'upsih': 978,
    'piv': 982,
    'ensp': 8194,
    'emsp': 8195,
    'thinsp': 8201,
    'zwnj': 8204,
    'zwj': 8205,
    'lrm': 8206,
    'rlm': 8207,
    'ndash': 8211,
    'mdash': 8212,
    'lsquo': 8216,
    'rsquo': 8217,
    'sbquo': 8218,
    'ldquo': 8220,
    'rdquo': 8221,
    'bdquo': 8222,
    'dagger': 8224,
    'Dagger': 8225,
    'bull': 8226,
    'hellip': 8230,
    'permil': 8240,
    'prime': 8242,
    'Prime': 8243,
    'lsaquo': 8249,
    'rsaquo': 8250,
    'oline': 8254,
    'frasl': 8260,
    'euro': 8364,
    'image': 8465,
    'weierp': 8472,
    'real': 8476,
    'trade': 8482,
    'alefsym': 8501,
    'larr': 8592,
    'uarr': 8593,
    'rarr': 8594,
    'darr': 8595,
    'harr': 8596,
    'crarr': 8629,
    'lArr': 8656,
    'uArr': 8657,
    'rArr': 8658,
    'dArr': 8659,
    'hArr': 8660,
    'forall': 8704,
    'part': 8706,
    'exist': 8707,
    'empty': 8709,
    'nabla': 8711,
    'isin': 8712,
    'notin': 8713,
    'ni': 8715,
    'prod': 8719,
    'sum': 8721,
    'minus': 8722,
    'lowast': 8727,
    'radic': 8730,
    'prop': 8733,
    'infin': 8734,
    'ang': 8736,
    'and': 8743,
    'or': 8744,
    'cap': 8745,
    'cup': 8746,
    'int': 8747,
    'there4': 8756,
    'sim': 8764,
    'cong': 8773,
    'asymp': 8776,
    'ne': 8800,
    'equiv': 8801,
    'le': 8804,
    'ge': 8805,
    'sub': 8834,
    'sup': 8835,
    'nsub': 8836,
    'sube': 8838,
    'supe': 8839,
    'oplus': 8853,
    'otimes': 8855,
    'perp': 8869,
    'sdot': 8901,
    'lceil': 8968,
    'rceil': 8969,
    'lfloor': 8970,
    'rfloor': 8971,
    'lang': 9001,
    'rang': 9002,
    'loz': 9674,
    'spades': 9824,
    'clubs': 9827,
    'hearts': 9829,
    'diams': 9830
  }

  Object.keys(sax.ENTITIES).forEach(function (key) {
    var e = sax.ENTITIES[key]
    var s = typeof e === 'number' ? String.fromCharCode(e) : e
    sax.ENTITIES[key] = s
  })

  for (var s in sax.STATE) {
    sax.STATE[sax.STATE[s]] = s
  }

  // shorthand
  S = sax.STATE

  function emit (parser, event, data) {
    parser[event] && parser[event](data)
  }

  function emitNode (parser, nodeType, data) {
    if (parser.textNode) closeText(parser)
    emit(parser, nodeType, data)
  }

  function closeText (parser) {
    parser.textNode = textopts(parser.opt, parser.textNode)
    if (parser.textNode) emit(parser, 'ontext', parser.textNode)
    parser.textNode = ''
  }

  function textopts (opt, text) {
    if (opt.trim) text = text.trim()
    if (opt.normalize) text = text.replace(/\s+/g, ' ')
    return text
  }

  function error (parser, er) {
    closeText(parser)
    if (parser.trackPosition) {
      er += '\nLine: ' + parser.line +
        '\nColumn: ' + parser.column +
        '\nChar: ' + parser.c
    }
    er = new Error(er)
    parser.error = er
    emit(parser, 'onerror', er)
    return parser
  }

  function end (parser) {
    if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')
    if ((parser.state !== S.BEGIN) &&
      (parser.state !== S.BEGIN_WHITESPACE) &&
      (parser.state !== S.TEXT)) {
      error(parser, 'Unexpected end')
    }
    closeText(parser)
    parser.c = ''
    parser.closed = true
    emit(parser, 'onend')
    SAXParser.call(parser, parser.strict, parser.opt)
    return parser
  }

  function strictFail (parser, message) {
    if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {
      throw new Error('bad call to strictFail')
    }
    if (parser.strict) {
      error(parser, message)
    }
  }

  function newTag (parser) {
    if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()
    var parent = parser.tags[parser.tags.length - 1] || parser
    var tag = parser.tag = { name: parser.tagName, attributes: {} }

    // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
    if (parser.opt.xmlns) {
      tag.ns = parent.ns
    }
    parser.attribList.length = 0
    emitNode(parser, 'onopentagstart', tag)
  }

  function qname (name, attribute) {
    var i = name.indexOf(':')
    var qualName = i < 0 ? [ '', name ] : name.split(':')
    var prefix = qualName[0]
    var local = qualName[1]

    // <x "xmlns"="http://foo">
    if (attribute && name === 'xmlns') {
      prefix = 'xmlns'
      local = ''
    }

    return { prefix: prefix, local: local }
  }

  function attrib (parser) {
    if (!parser.strict) {
      parser.attribName = parser.attribName[parser.looseCase]()
    }

    if (parser.attribList.indexOf(parser.attribName) !== -1 ||
      parser.tag.attributes.hasOwnProperty(parser.attribName)) {
      parser.attribName = parser.attribValue = ''
      return
    }

    if (parser.opt.xmlns) {
      var qn = qname(parser.attribName, true)
      var prefix = qn.prefix
      var local = qn.local

      if (prefix === 'xmlns') {
        // namespace binding attribute. push the binding into scope
        if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {
          strictFail(parser,
            'xml: prefix must be bound to ' + XML_NAMESPACE + '\n' +
            'Actual: ' + parser.attribValue)
        } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {
          strictFail(parser,
            'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\n' +
            'Actual: ' + parser.attribValue)
        } else {
          var tag = parser.tag
          var parent = parser.tags[parser.tags.length - 1] || parser
          if (tag.ns === parent.ns) {
            tag.ns = Object.create(parent.ns)
          }
          tag.ns[local] = parser.attribValue
        }
      }

      // defer onattribute events until all attributes have been seen
      // so any new bindings can take effect. preserve attribute order
      // so deferred events can be emitted in document order
      parser.attribList.push([parser.attribName, parser.attribValue])
    } else {
      // in non-xmlns mode, we can emit the event right away
      parser.tag.attributes[parser.attribName] = parser.attribValue
      emitNode(parser, 'onattribute', {
        name: parser.attribName,
        value: parser.attribValue
      })
    }

    parser.attribName = parser.attribValue = ''
  }

  function openTag (parser, selfClosing) {
    if (parser.opt.xmlns) {
      // emit namespace binding events
      var tag = parser.tag

      // add namespace info to tag
      var qn = qname(parser.tagName)
      tag.prefix = qn.prefix
      tag.local = qn.local
      tag.uri = tag.ns[qn.prefix] || ''

      if (tag.prefix && !tag.uri) {
        strictFail(parser, 'Unbound namespace prefix: ' +
          JSON.stringify(parser.tagName))
        tag.uri = qn.prefix
      }

      var parent = parser.tags[parser.tags.length - 1] || parser
      if (tag.ns && parent.ns !== tag.ns) {
        Object.keys(tag.ns).forEach(function (p) {
          emitNode(parser, 'onopennamespace', {
            prefix: p,
            uri: tag.ns[p]
          })
        })
      }

      // handle deferred onattribute events
      // Note: do not apply default ns to attributes:
      //   http://www.w3.org/TR/REC-xml-names/#defaulting
      for (var i = 0, l = parser.attribList.length; i < l; i++) {
        var nv = parser.attribList[i]
        var name = nv[0]
        var value = nv[1]
        var qualName = qname(name, true)
        var prefix = qualName.prefix
        var local = qualName.local
        var uri = prefix === '' ? '' : (tag.ns[prefix] || '')
        var a = {
          name: name,
          value: value,
          prefix: prefix,
          local: local,
          uri: uri
        }

        // if there's any attributes with an undefined namespace,
        // then fail on them now.
        if (prefix && prefix !== 'xmlns' && !uri) {
          strictFail(parser, 'Unbound namespace prefix: ' +
            JSON.stringify(prefix))
          a.uri = prefix
        }
        parser.tag.attributes[name] = a
        emitNode(parser, 'onattribute', a)
      }
      parser.attribList.length = 0
    }

    parser.tag.isSelfClosing = !!selfClosing

    // process the tag
    parser.sawRoot = true
    parser.tags.push(parser.tag)
    emitNode(parser, 'onopentag', parser.tag)
    if (!selfClosing) {
      // special case for <script> in non-strict mode.
      if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {
        parser.state = S.SCRIPT
      } else {
        parser.state = S.TEXT
      }
      parser.tag = null
      parser.tagName = ''
    }
    parser.attribName = parser.attribValue = ''
    parser.attribList.length = 0
  }

  function closeTag (parser) {
    if (!parser.tagName) {
      strictFail(parser, 'Weird empty close tag.')
      parser.textNode += '</>'
      parser.state = S.TEXT
      return
    }

    if (parser.script) {
      if (parser.tagName !== 'script') {
        parser.script += '</' + parser.tagName + '>'
        parser.tagName = ''
        parser.state = S.SCRIPT
        return
      }
      emitNode(parser, 'onscript', parser.script)
      parser.script = ''
    }

    // first make sure that the closing tag actually exists.
    // <a><b></c></b></a> will close everything, otherwise.
    var t = parser.tags.length
    var tagName = parser.tagName
    if (!parser.strict) {
      tagName = tagName[parser.looseCase]()
    }
    var closeTo = tagName
    while (t--) {
      var close = parser.tags[t]
      if (close.name !== closeTo) {
        // fail the first time in strict mode
        strictFail(parser, 'Unexpected close tag')
      } else {
        break
      }
    }

    // didn't find it.  we already failed for strict, so just abort.
    if (t < 0) {
      strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)
      parser.textNode += '</' + parser.tagName + '>'
      parser.state = S.TEXT
      return
    }
    parser.tagName = tagName
    var s = parser.tags.length
    while (s-- > t) {
      var tag = parser.tag = parser.tags.pop()
      parser.tagName = parser.tag.name
      emitNode(parser, 'onclosetag', parser.tagName)

      var x = {}
      for (var i in tag.ns) {
        x[i] = tag.ns[i]
      }

      var parent = parser.tags[parser.tags.length - 1] || parser
      if (parser.opt.xmlns && tag.ns !== parent.ns) {
        // remove namespace bindings introduced by tag
        Object.keys(tag.ns).forEach(function (p) {
          var n = tag.ns[p]
          emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })
        })
      }
    }
    if (t === 0) parser.closedRoot = true
    parser.tagName = parser.attribValue = parser.attribName = ''
    parser.attribList.length = 0
    parser.state = S.TEXT
  }

  function parseEntity (parser) {
    var entity = parser.entity
    var entityLC = entity.toLowerCase()
    var num
    var numStr = ''

    if (parser.ENTITIES[entity]) {
      return parser.ENTITIES[entity]
    }
    if (parser.ENTITIES[entityLC]) {
      return parser.ENTITIES[entityLC]
    }
    entity = entityLC
    if (entity.charAt(0) === '#') {
      if (entity.charAt(1) === 'x') {
        entity = entity.slice(2)
        num = parseInt(entity, 16)
        numStr = num.toString(16)
      } else {
        entity = entity.slice(1)
        num = parseInt(entity, 10)
        numStr = num.toString(10)
      }
    }
    entity = entity.replace(/^0+/, '')
    if (isNaN(num) || numStr.toLowerCase() !== entity) {
      strictFail(parser, 'Invalid character entity')
      return '&' + parser.entity + ';'
    }

    return String.fromCodePoint(num)
  }

  function beginWhiteSpace (parser, c) {
    if (c === '<') {
      parser.state = S.OPEN_WAKA
      parser.startTagPosition = parser.position
    } else if (!isWhitespace(c)) {
      // have to process this as a text node.
      // weird, but happens.
      strictFail(parser, 'Non-whitespace before first tag.')
      parser.textNode = c
      parser.state = S.TEXT
    }
  }

  function charAt (chunk, i) {
    var result = ''
    if (i < chunk.length) {
      result = chunk.charAt(i)
    }
    return result
  }

  function write (chunk) {
    var parser = this
    if (this.error) {
      throw this.error
    }
    if (parser.closed) {
      return error(parser,
        'Cannot write after close. Assign an onready handler.')
    }
    if (chunk === null) {
      return end(parser)
    }
    if (typeof chunk === 'object') {
      chunk = chunk.toString()
    }
    var i = 0
    var c = ''
    while (true) {
      c = charAt(chunk, i++)
      parser.c = c

      if (!c) {
        break
      }

      if (parser.trackPosition) {
        parser.position++
        if (c === '\n') {
          parser.line++
          parser.column = 0
        } else {
          parser.column++
        }
      }

      switch (parser.state) {
        case S.BEGIN:
          parser.state = S.BEGIN_WHITESPACE
          if (c === '\uFEFF') {
            continue
          }
          beginWhiteSpace(parser, c)
          continue

        case S.BEGIN_WHITESPACE:
          beginWhiteSpace(parser, c)
          continue

        case S.TEXT:
          if (parser.sawRoot && !parser.closedRoot) {
            var starti = i - 1
            while (c && c !== '<' && c !== '&') {
              c = charAt(chunk, i++)
              if (c && parser.trackPosition) {
                parser.position++
                if (c === '\n') {
                  parser.line++
                  parser.column = 0
                } else {
                  parser.column++
                }
              }
            }
            parser.textNode += chunk.substring(starti, i - 1)
          }
          if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {
            parser.state = S.OPEN_WAKA
            parser.startTagPosition = parser.position
          } else {
            if (!isWhitespace(c) && (!parser.sawRoot || parser.closedRoot)) {
              strictFail(parser, 'Text data outside of root node.')
            }
            if (c === '&') {
              parser.state = S.TEXT_ENTITY
            } else {
              parser.textNode += c
            }
          }
          continue

        case S.SCRIPT:
          // only non-strict
          if (c === '<') {
            parser.state = S.SCRIPT_ENDING
          } else {
            parser.script += c
          }
          continue

        case S.SCRIPT_ENDING:
          if (c === '/') {
            parser.state = S.CLOSE_TAG
          } else {
            parser.script += '<' + c
            parser.state = S.SCRIPT
          }
          continue

        case S.OPEN_WAKA:
          // either a /, ?, !, or text is coming next.
          if (c === '!') {
            parser.state = S.SGML_DECL
            parser.sgmlDecl = ''
          } else if (isWhitespace(c)) {
            // wait for it...
          } else if (isMatch(nameStart, c)) {
            parser.state = S.OPEN_TAG
            parser.tagName = c
          } else if (c === '/') {
            parser.state = S.CLOSE_TAG
            parser.tagName = ''
          } else if (c === '?') {
            parser.state = S.PROC_INST
            parser.procInstName = parser.procInstBody = ''
          } else {
            strictFail(parser, 'Unencoded <')
            // if there was some whitespace, then add that in.
            if (parser.startTagPosition + 1 < parser.position) {
              var pad = parser.position - parser.startTagPosition
              c = new Array(pad).join(' ') + c
            }
            parser.textNode += '<' + c
            parser.state = S.TEXT
          }
          continue

        case S.SGML_DECL:
          if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {
            emitNode(parser, 'onopencdata')
            parser.state = S.CDATA
            parser.sgmlDecl = ''
            parser.cdata = ''
          } else if (parser.sgmlDecl + c === '--') {
            parser.state = S.COMMENT
            parser.comment = ''
            parser.sgmlDecl = ''
          } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {
            parser.state = S.DOCTYPE
            if (parser.doctype || parser.sawRoot) {
              strictFail(parser,
                'Inappropriately located doctype declaration')
            }
            parser.doctype = ''
            parser.sgmlDecl = ''
          } else if (c === '>') {
            emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)
            parser.sgmlDecl = ''
            parser.state = S.TEXT
          } else if (isQuote(c)) {
            parser.state = S.SGML_DECL_QUOTED
            parser.sgmlDecl += c
          } else {
            parser.sgmlDecl += c
          }
          continue

        case S.SGML_DECL_QUOTED:
          if (c === parser.q) {
            parser.state = S.SGML_DECL
            parser.q = ''
          }
          parser.sgmlDecl += c
          continue

        case S.DOCTYPE:
          if (c === '>') {
            parser.state = S.TEXT
            emitNode(parser, 'ondoctype', parser.doctype)
            parser.doctype = true // just remember that we saw it.
          } else {
            parser.doctype += c
            if (c === '[') {
              parser.state = S.DOCTYPE_DTD
            } else if (isQuote(c)) {
              parser.state = S.DOCTYPE_QUOTED
              parser.q = c
            }
          }
          continue

        case S.DOCTYPE_QUOTED:
          parser.doctype += c
          if (c === parser.q) {
            parser.q = ''
            parser.state = S.DOCTYPE
          }
          continue

        case S.DOCTYPE_DTD:
          parser.doctype += c
          if (c === ']') {
            parser.state = S.DOCTYPE
          } else if (isQuote(c)) {
            parser.state = S.DOCTYPE_DTD_QUOTED
            parser.q = c
          }
          continue

        case S.DOCTYPE_DTD_QUOTED:
          parser.doctype += c
          if (c === parser.q) {
            parser.state = S.DOCTYPE_DTD
            parser.q = ''
          }
          continue

        case S.COMMENT:
          if (c === '-') {
            parser.state = S.COMMENT_ENDING
          } else {
            parser.comment += c
          }
          continue

        case S.COMMENT_ENDING:
          if (c === '-') {
            parser.state = S.COMMENT_ENDED
            parser.comment = textopts(parser.opt, parser.comment)
            if (parser.comment) {
              emitNode(parser, 'oncomment', parser.comment)
            }
            parser.comment = ''
          } else {
            parser.comment += '-' + c
            parser.state = S.COMMENT
          }
          continue

        case S.COMMENT_ENDED:
          if (c !== '>') {
            strictFail(parser, 'Malformed comment')
            // allow <!-- blah -- bloo --> in non-strict mode,
            // which is a comment of " blah -- bloo "
            parser.comment += '--' + c
            parser.state = S.COMMENT
          } else {
            parser.state = S.TEXT
          }
          continue

        case S.CDATA:
          if (c === ']') {
            parser.state = S.CDATA_ENDING
          } else {
            parser.cdata += c
          }
          continue

        case S.CDATA_ENDING:
          if (c === ']') {
            parser.state = S.CDATA_ENDING_2
          } else {
            parser.cdata += ']' + c
            parser.state = S.CDATA
          }
          continue

        case S.CDATA_ENDING_2:
          if (c === '>') {
            if (parser.cdata) {
              emitNode(parser, 'oncdata', parser.cdata)
            }
            emitNode(parser, 'onclosecdata')
            parser.cdata = ''
            parser.state = S.TEXT
          } else if (c === ']') {
            parser.cdata += ']'
          } else {
            parser.cdata += ']]' + c
            parser.state = S.CDATA
          }
          continue

        case S.PROC_INST:
          if (c === '?') {
            parser.state = S.PROC_INST_ENDING
          } else if (isWhitespace(c)) {
            parser.state = S.PROC_INST_BODY
          } else {
            parser.procInstName += c
          }
          continue

        case S.PROC_INST_BODY:
          if (!parser.procInstBody && isWhitespace(c)) {
            continue
          } else if (c === '?') {
            parser.state = S.PROC_INST_ENDING
          } else {
            parser.procInstBody += c
          }
          continue

        case S.PROC_INST_ENDING:
          if (c === '>') {
            emitNode(parser, 'onprocessinginstruction', {
              name: parser.procInstName,
              body: parser.procInstBody
            })
            parser.procInstName = parser.procInstBody = ''
            parser.state = S.TEXT
          } else {
            parser.procInstBody += '?' + c
            parser.state = S.PROC_INST_BODY
          }
          continue

        case S.OPEN_TAG:
          if (isMatch(nameBody, c)) {
            parser.tagName += c
          } else {
            newTag(parser)
            if (c === '>') {
              openTag(parser)
            } else if (c === '/') {
              parser.state = S.OPEN_TAG_SLASH
            } else {
              if (!isWhitespace(c)) {
                strictFail(parser, 'Invalid character in tag name')
              }
              parser.state = S.ATTRIB
            }
          }
          continue

        case S.OPEN_TAG_SLASH:
          if (c === '>') {
            openTag(parser, true)
            closeTag(parser)
          } else {
            strictFail(parser, 'Forward-slash in opening tag not followed by >')
            parser.state = S.ATTRIB
          }
          continue

        case S.ATTRIB:
          // haven't read the attribute name yet.
          if (isWhitespace(c)) {
            continue
          } else if (c === '>') {
            openTag(parser)
          } else if (c === '/') {
            parser.state = S.OPEN_TAG_SLASH
          } else if (isMatch(nameStart, c)) {
            parser.attribName = c
            parser.attribValue = ''
            parser.state = S.ATTRIB_NAME
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_NAME:
          if (c === '=') {
            parser.state = S.ATTRIB_VALUE
          } else if (c === '>') {
            strictFail(parser, 'Attribute without value')
            parser.attribValue = parser.attribName
            attrib(parser)
            openTag(parser)
          } else if (isWhitespace(c)) {
            parser.state = S.ATTRIB_NAME_SAW_WHITE
          } else if (isMatch(nameBody, c)) {
            parser.attribName += c
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_NAME_SAW_WHITE:
          if (c === '=') {
            parser.state = S.ATTRIB_VALUE
          } else if (isWhitespace(c)) {
            continue
          } else {
            strictFail(parser, 'Attribute without value')
            parser.tag.attributes[parser.attribName] = ''
            parser.attribValue = ''
            emitNode(parser, 'onattribute', {
              name: parser.attribName,
              value: ''
            })
            parser.attribName = ''
            if (c === '>') {
              openTag(parser)
            } else if (isMatch(nameStart, c)) {
              parser.attribName = c
              parser.state = S.ATTRIB_NAME
            } else {
              strictFail(parser, 'Invalid attribute name')
              parser.state = S.ATTRIB
            }
          }
          continue

        case S.ATTRIB_VALUE:
          if (isWhitespace(c)) {
            continue
          } else if (isQuote(c)) {
            parser.q = c
            parser.state = S.ATTRIB_VALUE_QUOTED
          } else {
            strictFail(parser, 'Unquoted attribute value')
            parser.state = S.ATTRIB_VALUE_UNQUOTED
            parser.attribValue = c
          }
          continue

        case S.ATTRIB_VALUE_QUOTED:
          if (c !== parser.q) {
            if (c === '&') {
              parser.state = S.ATTRIB_VALUE_ENTITY_Q
            } else {
              parser.attribValue += c
            }
            continue
          }
          attrib(parser)
          parser.q = ''
          parser.state = S.ATTRIB_VALUE_CLOSED
          continue

        case S.ATTRIB_VALUE_CLOSED:
          if (isWhitespace(c)) {
            parser.state = S.ATTRIB
          } else if (c === '>') {
            openTag(parser)
          } else if (c === '/') {
            parser.state = S.OPEN_TAG_SLASH
          } else if (isMatch(nameStart, c)) {
            strictFail(parser, 'No whitespace between attributes')
            parser.attribName = c
            parser.attribValue = ''
            parser.state = S.ATTRIB_NAME
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_VALUE_UNQUOTED:
          if (!isAttribEnd(c)) {
            if (c === '&') {
              parser.state = S.ATTRIB_VALUE_ENTITY_U
            } else {
              parser.attribValue += c
            }
            continue
          }
          attrib(parser)
          if (c === '>') {
            openTag(parser)
          } else {
            parser.state = S.ATTRIB
          }
          continue

        case S.CLOSE_TAG:
          if (!parser.tagName) {
            if (isWhitespace(c)) {
              continue
            } else if (notMatch(nameStart, c)) {
              if (parser.script) {
                parser.script += '</' + c
                parser.state = S.SCRIPT
              } else {
                strictFail(parser, 'Invalid tagname in closing tag.')
              }
            } else {
              parser.tagName = c
            }
          } else if (c === '>') {
            closeTag(parser)
          } else if (isMatch(nameBody, c)) {
            parser.tagName += c
          } else if (parser.script) {
            parser.script += '</' + parser.tagName
            parser.tagName = ''
            parser.state = S.SCRIPT
          } else {
            if (!isWhitespace(c)) {
              strictFail(parser, 'Invalid tagname in closing tag')
            }
            parser.state = S.CLOSE_TAG_SAW_WHITE
          }
          continue

        case S.CLOSE_TAG_SAW_WHITE:
          if (isWhitespace(c)) {
            continue
          }
          if (c === '>') {
            closeTag(parser)
          } else {
            strictFail(parser, 'Invalid characters in closing tag')
          }
          continue

        case S.TEXT_ENTITY:
        case S.ATTRIB_VALUE_ENTITY_Q:
        case S.ATTRIB_VALUE_ENTITY_U:
          var returnState
          var buffer
          switch (parser.state) {
            case S.TEXT_ENTITY:
              returnState = S.TEXT
              buffer = 'textNode'
              break

            case S.ATTRIB_VALUE_ENTITY_Q:
              returnState = S.ATTRIB_VALUE_QUOTED
              buffer = 'attribValue'
              break

            case S.ATTRIB_VALUE_ENTITY_U:
              returnState = S.ATTRIB_VALUE_UNQUOTED
              buffer = 'attribValue'
              break
          }

          if (c === ';') {
            parser[buffer] += parseEntity(parser)
            parser.entity = ''
            parser.state = returnState
          } else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) {
            parser.entity += c
          } else {
            strictFail(parser, 'Invalid character in entity name')
            parser[buffer] += '&' + parser.entity + c
            parser.entity = ''
            parser.state = returnState
          }

          continue

        default:
          throw new Error(parser, 'Unknown state: ' + parser.state)
      }
    } // while

    if (parser.position >= parser.bufferCheckPosition) {
      checkBufferLength(parser)
    }
    return parser
  }

  /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
  /* istanbul ignore next */
  if (!String.fromCodePoint) {
    (function () {
      var stringFromCharCode = String.fromCharCode
      var floor = Math.floor
      var fromCodePoint = function () {
        var MAX_SIZE = 0x4000
        var codeUnits = []
        var highSurrogate
        var lowSurrogate
        var index = -1
        var length = arguments.length
        if (!length) {
          return ''
        }
        var result = ''
        while (++index < length) {
          var codePoint = Number(arguments[index])
          if (
            !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`
            codePoint < 0 || // not a valid Unicode code point
            codePoint > 0x10FFFF || // not a valid Unicode code point
            floor(codePoint) !== codePoint // not an integer
          ) {
            throw RangeError('Invalid code point: ' + codePoint)
          }
          if (codePoint <= 0xFFFF) { // BMP code point
            codeUnits.push(codePoint)
          } else { // Astral code point; split in surrogate halves
            // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
            codePoint -= 0x10000
            highSurrogate = (codePoint >> 10) + 0xD800
            lowSurrogate = (codePoint % 0x400) + 0xDC00
            codeUnits.push(highSurrogate, lowSurrogate)
          }
          if (index + 1 === length || codeUnits.length > MAX_SIZE) {
            result += stringFromCharCode.apply(null, codeUnits)
            codeUnits.length = 0
          }
        }
        return result
      }
      /* istanbul ignore next */
      if (Object.defineProperty) {
        Object.defineProperty(String, 'fromCodePoint', {
          value: fromCodePoint,
          configurable: true,
          writable: true
        })
      } else {
        String.fromCodePoint = fromCodePoint
      }
    }())
  }
})(typeof exports === 'undefined' ? this.sax = {} : exports)
'use strict';
const {PassThrough: PassThroughStream} = require('stream');

module.exports = options => {
	options = {...options};

	const {array} = options;
	let {encoding} = options;
	const isBuffer = encoding === 'buffer';
	let objectMode = false;

	if (array) {
		objectMode = !(encoding || isBuffer);
	} else {
		encoding = encoding || 'utf8';
	}

	if (isBuffer) {
		encoding = null;
	}

	const stream = new PassThroughStream({objectMode});

	if (encoding) {
		stream.setEncoding(encoding);
	}

	let length = 0;
	const chunks = [];

	stream.on('data', chunk => {
		chunks.push(chunk);

		if (objectMode) {
			length = chunks.length;
		} else {
			length += chunk.length;
		}
	});

	stream.getBufferedValue = () => {
		if (array) {
			return chunks;
		}

		return isBuffer ? Buffer.concat(chunks, length) : chunks.join('');
	};

	stream.getBufferedLength = () => length;

	return stream;
};
'use strict';
const {constants: BufferConstants} = require('buffer');
const pump = require('pump');
const bufferStream = require('./buffer-stream');

class MaxBufferError extends Error {
	constructor() {
		super('maxBuffer exceeded');
		this.name = 'MaxBufferError';
	}
}

async function getStream(inputStream, options) {
	if (!inputStream) {
		return Promise.reject(new Error('Expected a stream'));
	}

	options = {
		maxBuffer: Infinity,
		...options
	};

	const {maxBuffer} = options;

	let stream;
	await new Promise((resolve, reject) => {
		const rejectPromise = error => {
			// Don't retrieve an oversized buffer.
			if (error && stream.getBufferedLength() <= BufferConstants.MAX_LENGTH) {
				error.bufferedData = stream.getBufferedValue();
			}

			reject(error);
		};

		stream = pump(inputStream, bufferStream(options), error => {
			if (error) {
				rejectPromise(error);
				return;
			}

			resolve();
		});

		stream.on('data', () => {
			if (stream.getBufferedLength() > maxBuffer) {
				rejectPromise(new MaxBufferError());
			}
		});
	});

	return stream.getBufferedValue();
}

module.exports = getStream;
// TODO: Remove this for the next major release
module.exports.default = getStream;
module.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'});
module.exports.array = (stream, options) => getStream(stream, {...options, array: true});
module.exports.MaxBufferError = MaxBufferError;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "https://sindresorhus.com"
  },
  "dependencies": {
    "pump": "^3.0.0"
  },
  "deprecated": false,
  "description": "Get a stream as a string, buffer, or array",
  "devDependencies": {
    "@types/node": "^12.0.7",
    "ava": "^2.0.0",
    "into-stream": "^5.0.0",
    "tsd": "^0.7.2",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts",
    "buffer-stream.js"
  ],
  "funding": "https://github.com/sponsors/sindresorhus",
  "homepage": "https://github.com/sindresorhus/get-stream#readme",
  "license": "MIT",
  "name": "get-stream",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/get-stream.git"
  },
  "version": "5.2.0"
}'use strict';
module.exports = object => {
	const result = {};

	for (const [key, value] of Object.entries(object)) {
		result[key.toLowerCase()] = value;
	}

	return result;
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Lowercase the keys of an object",
  "devDependencies": {
    "ava": "^1.4.1",
    "tsd": "^0.7.2",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/sindresorhus/lowercase-keys#readme",
  "license": "MIT",
  "name": "lowercase-keys",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/lowercase-keys.git"
  },
  "version": "2.0.0"
}'use strict';

module.exports = options => {
	options = Object.assign({
		onlyFirst: false
	}, options);

	const pattern = [
		'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
		'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
	].join('|');

	return new RegExp(pattern, options.onlyFirst ? undefined : 'g');
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Regular expression for matching ANSI escape codes",
  "devDependencies": {
    "ava": "^0.25.0",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/ansi-regex#readme",
  "license": "MIT",
  "name": "ansi-regex",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/ansi-regex.git"
  },
  "version": "4.1.0"
}'use strict';
/* eslint-disable yoda */
module.exports = x => {
	if (Number.isNaN(x)) {
		return false;
	}

	// code points are derived from:
	// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt
	if (
		x >= 0x1100 && (
			x <= 0x115f ||  // Hangul Jamo
			x === 0x2329 || // LEFT-POINTING ANGLE BRACKET
			x === 0x232a || // RIGHT-POINTING ANGLE BRACKET
			// CJK Radicals Supplement .. Enclosed CJK Letters and Months
			(0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||
			// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
			(0x3250 <= x && x <= 0x4dbf) ||
			// CJK Unified Ideographs .. Yi Radicals
			(0x4e00 <= x && x <= 0xa4c6) ||
			// Hangul Jamo Extended-A
			(0xa960 <= x && x <= 0xa97c) ||
			// Hangul Syllables
			(0xac00 <= x && x <= 0xd7a3) ||
			// CJK Compatibility Ideographs
			(0xf900 <= x && x <= 0xfaff) ||
			// Vertical Forms
			(0xfe10 <= x && x <= 0xfe19) ||
			// CJK Compatibility Forms .. Small Form Variants
			(0xfe30 <= x && x <= 0xfe6b) ||
			// Halfwidth and Fullwidth Forms
			(0xff01 <= x && x <= 0xff60) ||
			(0xffe0 <= x && x <= 0xffe6) ||
			// Kana Supplement
			(0x1b000 <= x && x <= 0x1b001) ||
			// Enclosed Ideographic Supplement
			(0x1f200 <= x && x <= 0x1f251) ||
			// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
			(0x20000 <= x && x <= 0x3fffd)
		)
	) {
		return true;
	}

	return false;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if the character represented by a given Unicode code point is fullwidth",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/is-fullwidth-code-point#readme",
  "license": "MIT",
  "name": "is-fullwidth-code-point",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git"
  },
  "version": "2.0.0"
}'use strict';
const stripAnsi = require('strip-ansi');
const isFullwidthCodePoint = require('is-fullwidth-code-point');
const emojiRegex = require('emoji-regex')();

module.exports = input => {
	input = input.replace(emojiRegex, '  ');

	if (typeof input !== 'string' || input.length === 0) {
		return 0;
	}

	input = stripAnsi(input);

	let width = 0;

	for (let i = 0; i < input.length; i++) {
		const code = input.codePointAt(i);

		// Ignore control characters
		if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {
			continue;
		}

		// Ignore combining characters
		if (code >= 0x300 && code <= 0x36F) {
			continue;
		}

		// Surrogates
		if (code > 0xFFFF) {
			i++;
		}

		width += isFullwidthCodePoint(code) ? 2 : 1;
	}

	return width;
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "emoji-regex": "^7.0.1",
    "is-fullwidth-code-point": "^2.0.0",
    "strip-ansi": "^5.1.0"
  },
  "deprecated": false,
  "description": "Get the visual width of a string - the number of columns required to display it",
  "devDependencies": {
    "ava": "^1.0.1",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/string-width#readme",
  "license": "MIT",
  "name": "string-width",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/string-width.git"
  },
  "version": "3.1.0"
}'use strict';
const ansiRegex = require('ansi-regex');

const stripAnsi = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;

module.exports = stripAnsi;
module.exports.default = stripAnsi;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "ansi-regex": "^4.1.0"
  },
  "deprecated": false,
  "description": "Strip ANSI escape codes from a string",
  "devDependencies": {
    "ava": "^1.3.1",
    "tsd-check": "^0.5.0",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/chalk/strip-ansi#readme",
  "license": "MIT",
  "name": "strip-ansi",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/strip-ansi.git"
  },
  "version": "5.2.0"
}
test:
	@node_modules/.bin/tape test.js

.PHONY: test

{
  "name" : "isarray",
  "description" : "Array#isArray for older browsers",
  "version" : "0.0.1",
  "repository" : "juliangruber/isarray",
  "homepage": "https://github.com/juliangruber/isarray",
  "main" : "index.js",
  "scripts" : [
    "index.js"
  ],
  "dependencies" : {},
  "keywords": ["browser","isarray","array"],
  "author": {
    "name": "Julian Gruber",
    "email": "mail@juliangruber.com",
    "url": "http://juliangruber.com"
  },
  "license": "MIT"
}
var toString = {}.toString;

module.exports = Array.isArray || function (arr) {
  return toString.call(arr) == '[object Array]';
};
{
  "author": {
    "name": "Julian Gruber",
    "email": "mail@juliangruber.com",
    "url": "http://juliangruber.com"
  },
  "dependencies": {},
  "deprecated": false,
  "description": "Array#isArray for older browsers",
  "devDependencies": {
    "tape": "~2.13.4"
  },
  "homepage": "https://github.com/juliangruber/isarray",
  "license": "MIT",
  "main": "index.js",
  "name": "isarray",
  "repository": {
    "type": "git",
    "url": "git://github.com/juliangruber/isarray.git"
  },
  "testling": {
    "files": "test.js",
    "browsers": [
      "ie/8..latest",
      "firefox/17..latest",
      "firefox/nightly",
      "chrome/22..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  },
  "version": "1.0.0"
}# Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

* (a) The contribution was created in whole or in part by me and I
  have the right to submit it under the open source license
  indicated in the file; or

* (b) The contribution is based upon previous work that, to the best
  of my knowledge, is covered under an appropriate open source
  license and I have the right under that license to submit that
  work with modifications, whether created in whole or in part
  by me, under the same open source license (unless I am
  permitted to submit under a different license), as indicated
  in the file; or

* (c) The contribution was provided directly to me by some other
  person who certified (a), (b) or (c) and I have not modified
  it.

* (d) I understand and agree that this project and the contribution
  are public and that a record of the contribution (including all
  personal information I submit with it, including my sign-off) is
  maintained indefinitely and may be redistributed consistent with
  this project or the open source license(s) involved.

## Moderation Policy

The [Node.js Moderation Policy] applies to this WG.

## Code of Conduct

The [Node.js Code of Conduct][] applies to this WG.

[Node.js Code of Conduct]:
https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md
[Node.js Moderation Policy]:
https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md
### Streams Working Group

The Node.js Streams is jointly governed by a Working Group
(WG)
that is responsible for high-level guidance of the project.

The WG has final authority over this project including:

* Technical direction
* Project governance and process (including this policy)
* Contribution policy
* GitHub repository hosting
* Conduct guidelines
* Maintaining the list of additional Collaborators

For the current list of WG members, see the project
[README.md](./README.md#current-project-team-members).

### Collaborators

The readable-stream GitHub repository is
maintained by the WG and additional Collaborators who are added by the
WG on an ongoing basis.

Individuals making significant and valuable contributions are made
Collaborators and given commit-access to the project. These
individuals are identified by the WG and their addition as
Collaborators is discussed during the WG meeting.

_Note:_ If you make a significant contribution and are not considered
for commit-access log an issue or contact a WG member directly and it
will be brought up in the next WG meeting.

Modifications of the contents of the readable-stream repository are
made on
a collaborative basis. Anybody with a GitHub account may propose a
modification via pull request and it will be considered by the project
Collaborators. All pull requests must be reviewed and accepted by a
Collaborator with sufficient expertise who is able to take full
responsibility for the change. In the case of pull requests proposed
by an existing Collaborator, an additional Collaborator is required
for sign-off. Consensus should be sought if additional Collaborators
participate and there is disagreement around a particular
modification. See _Consensus Seeking Process_ below for further detail
on the consensus model used for governance.

Collaborators may opt to elevate significant or controversial
modifications, or modifications that have not found consensus to the
WG for discussion by assigning the ***WG-agenda*** tag to a pull
request or issue. The WG should serve as the final arbiter where
required.

For the current list of Collaborators, see the project
[README.md](./README.md#members).

### WG Membership

WG seats are not time-limited.  There is no fixed size of the WG.
However, the expected target is between 6 and 12, to ensure adequate
coverage of important areas of expertise, balanced with the ability to
make decisions efficiently.

There is no specific set of requirements or qualifications for WG
membership beyond these rules.

The WG may add additional members to the WG by unanimous consensus.

A WG member may be removed from the WG by voluntary resignation, or by
unanimous consensus of all other WG members.

Changes to WG membership should be posted in the agenda, and may be
suggested as any other agenda item (see "WG Meetings" below).

If an addition or removal is proposed during a meeting, and the full
WG is not in attendance to participate, then the addition or removal
is added to the agenda for the subsequent meeting.  This is to ensure
that all members are given the opportunity to participate in all
membership decisions.  If a WG member is unable to attend a meeting
where a planned membership decision is being made, then their consent
is assumed.

No more than 1/3 of the WG members may be affiliated with the same
employer.  If removal or resignation of a WG member, or a change of
employment by a WG member, creates a situation where more than 1/3 of
the WG membership shares an employer, then the situation must be
immediately remedied by the resignation or removal of one or more WG
members affiliated with the over-represented employer(s).

### WG Meetings

The WG meets occasionally on a Google Hangout On Air. A designated moderator
approved by the WG runs the meeting. Each meeting should be
published to YouTube.

Items are added to the WG agenda that are considered contentious or
are modifications of governance, contribution policy, WG membership,
or release process.

The intention of the agenda is not to approve or review all patches;
that should happen continuously on GitHub and be handled by the larger
group of Collaborators.

Any community member or contributor can ask that something be added to
the next meeting's agenda by logging a GitHub Issue. Any Collaborator,
WG member or the moderator can add the item to the agenda by adding
the ***WG-agenda*** tag to the issue.

Prior to each WG meeting the moderator will share the Agenda with
members of the WG. WG members can add any items they like to the
agenda at the beginning of each meeting. The moderator and the WG
cannot veto or remove items.

The WG may invite persons or representatives from certain projects to
participate in a non-voting capacity.

The moderator is responsible for summarizing the discussion of each
agenda item and sends it as a pull request after the meeting.

### Consensus Seeking Process

The WG follows a
[Consensus
Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making)
decision-making model.

When an agenda item has appeared to reach a consensus the moderator
will ask "Does anyone object?" as a final call for dissent from the
consensus.

If an agenda item cannot reach a consensus a WG member can call for
either a closing vote or a vote to table the issue to the next
meeting. The call for a vote must be seconded by a majority of the WG
or else the discussion will continue. Simple majority wins.

Note that changes to WG membership require a majority consensus.  See
"WG Membership" above.
Node.js is licensed for use as follows:

"""
Copyright Node.js contributors. All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
"""

This license applies to parts of Node.js originating from the
https://github.com/joyent/node repository:

"""
Copyright Joyent, Inc. and other Node contributors. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
"""
module.exports = require('./lib/_stream_duplex.js');
module.exports = require('./readable').Duplex
{
  "browser": {
    "util": false,
    "./readable.js": "./readable-browser.js",
    "./writable.js": "./writable-browser.js",
    "./duplex.js": "./duplex-browser.js",
    "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js"
  },
  "dependencies": {
    "core-util-is": "~1.0.0",
    "inherits": "~2.0.3",
    "isarray": "~1.0.0",
    "process-nextick-args": "~2.0.0",
    "safe-buffer": "~5.1.1",
    "string_decoder": "~1.1.1",
    "util-deprecate": "~1.0.1"
  },
  "deprecated": false,
  "description": "Streams3, a user-land copy of the stream library from Node.js",
  "devDependencies": {
    "assert": "^1.4.0",
    "babel-polyfill": "^6.9.1",
    "buffer": "^4.9.0",
    "lolex": "^2.3.2",
    "nyc": "^6.4.0",
    "tap": "^0.7.0",
    "tape": "^4.8.0"
  },
  "homepage": "https://github.com/nodejs/readable-stream#readme",
  "license": "MIT",
  "main": "readable.js",
  "name": "readable-stream",
  "repository": {
    "type": "git",
    "url": "git://github.com/nodejs/readable-stream.git"
  },
  "version": "2.3.7"
}module.exports = require('./readable').PassThrough
exports = module.exports = require('./lib/_stream_readable.js');
exports.Stream = exports;
exports.Readable = exports;
exports.Writable = require('./lib/_stream_writable.js');
exports.Duplex = require('./lib/_stream_duplex.js');
exports.Transform = require('./lib/_stream_transform.js');
exports.PassThrough = require('./lib/_stream_passthrough.js');
var Stream = require('stream');
if (process.env.READABLE_STREAM === 'disable' && Stream) {
  module.exports = Stream;
  exports = module.exports = Stream.Readable;
  exports.Readable = Stream.Readable;
  exports.Writable = Stream.Writable;
  exports.Duplex = Stream.Duplex;
  exports.Transform = Stream.Transform;
  exports.PassThrough = Stream.PassThrough;
  exports.Stream = Stream;
} else {
  exports = module.exports = require('./lib/_stream_readable.js');
  exports.Stream = Stream || exports;
  exports.Readable = exports;
  exports.Writable = require('./lib/_stream_writable.js');
  exports.Duplex = require('./lib/_stream_duplex.js');
  exports.Transform = require('./lib/_stream_transform.js');
  exports.PassThrough = require('./lib/_stream_passthrough.js');
}
module.exports = require('./readable').Transform
module.exports = require('./lib/_stream_writable.js');
var Stream = require("stream")
var Writable = require("./lib/_stream_writable.js")

if (process.env.READABLE_STREAM === 'disable') {
  module.exports = Stream && Stream.Writable || Writable
} else {
  module.exports = Writable
}
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a duplex stream is just a stream that is both readable and writable.
// Since JS doesn't have multiple prototypal inheritance, this class
// prototypally inherits from Readable, and then parasitically from
// Writable.

'use strict';

/*<replacement>*/

var pna = require('process-nextick-args');
/*</replacement>*/

/*<replacement>*/
var objectKeys = Object.keys || function (obj) {
  var keys = [];
  for (var key in obj) {
    keys.push(key);
  }return keys;
};
/*</replacement>*/

module.exports = Duplex;

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

var Readable = require('./_stream_readable');
var Writable = require('./_stream_writable');

util.inherits(Duplex, Readable);

{
  // avoid scope creep, the keys array can then be collected
  var keys = objectKeys(Writable.prototype);
  for (var v = 0; v < keys.length; v++) {
    var method = keys[v];
    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
  }
}

function Duplex(options) {
  if (!(this instanceof Duplex)) return new Duplex(options);

  Readable.call(this, options);
  Writable.call(this, options);

  if (options && options.readable === false) this.readable = false;

  if (options && options.writable === false) this.writable = false;

  this.allowHalfOpen = true;
  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;

  this.once('end', onend);
}

Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function () {
    return this._writableState.highWaterMark;
  }
});

// the no-half-open enforcer
function onend() {
  // if we allow half-open state, or if the writable side ended,
  // then we're ok.
  if (this.allowHalfOpen || this._writableState.ended) return;

  // no more data can be written.
  // But allow more writes to happen in this tick.
  pna.nextTick(onEndNT, this);
}

function onEndNT(self) {
  self.end();
}

Object.defineProperty(Duplex.prototype, 'destroyed', {
  get: function () {
    if (this._readableState === undefined || this._writableState === undefined) {
      return false;
    }
    return this._readableState.destroyed && this._writableState.destroyed;
  },
  set: function (value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (this._readableState === undefined || this._writableState === undefined) {
      return;
    }

    // backward compatibility, the user is explicitly
    // managing destroyed
    this._readableState.destroyed = value;
    this._writableState.destroyed = value;
  }
});

Duplex.prototype._destroy = function (err, cb) {
  this.push(null);
  this.end();

  pna.nextTick(cb, err);
};// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a passthrough stream.
// basically just the most minimal sort of Transform stream.
// Every written chunk gets output as-is.

'use strict';

module.exports = PassThrough;

var Transform = require('./_stream_transform');

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

util.inherits(PassThrough, Transform);

function PassThrough(options) {
  if (!(this instanceof PassThrough)) return new PassThrough(options);

  Transform.call(this, options);
}

PassThrough.prototype._transform = function (chunk, encoding, cb) {
  cb(null, chunk);
};// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

/*<replacement>*/

var pna = require('process-nextick-args');
/*</replacement>*/

module.exports = Readable;

/*<replacement>*/
var isArray = require('isarray');
/*</replacement>*/

/*<replacement>*/
var Duplex;
/*</replacement>*/

Readable.ReadableState = ReadableState;

/*<replacement>*/
var EE = require('events').EventEmitter;

var EElistenerCount = function (emitter, type) {
  return emitter.listeners(type).length;
};
/*</replacement>*/

/*<replacement>*/
var Stream = require('./internal/streams/stream');
/*</replacement>*/

/*<replacement>*/

var Buffer = require('safe-buffer').Buffer;
var OurUint8Array = global.Uint8Array || function () {};
function _uint8ArrayToBuffer(chunk) {
  return Buffer.from(chunk);
}
function _isUint8Array(obj) {
  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
}

/*</replacement>*/

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

/*<replacement>*/
var debugUtil = require('util');
var debug = void 0;
if (debugUtil && debugUtil.debuglog) {
  debug = debugUtil.debuglog('stream');
} else {
  debug = function () {};
}
/*</replacement>*/

var BufferList = require('./internal/streams/BufferList');
var destroyImpl = require('./internal/streams/destroy');
var StringDecoder;

util.inherits(Readable, Stream);

var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];

function prependListener(emitter, event, fn) {
  // Sadly this is not cacheable as some libraries bundle their own
  // event emitter implementation with them.
  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);

  // This is a hack to make sure that our error handler is attached before any
  // userland ones.  NEVER DO THIS. This is here only because this code needs
  // to continue to work with older versions of Node.js that do not include
  // the prependListener() method. The goal is to eventually remove this hack.
  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
}

function ReadableState(options, stream) {
  Duplex = Duplex || require('./_stream_duplex');

  options = options || {};

  // Duplex streams are both readable and writable, but share
  // the same options object.
  // However, some cases require setting options to different
  // values for the readable and the writable sides of the duplex stream.
  // These options can be provided separately as readableXXX and writableXXX.
  var isDuplex = stream instanceof Duplex;

  // object stream flag. Used to make read(n) ignore n and to
  // make all the buffer merging and length checks go away
  this.objectMode = !!options.objectMode;

  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;

  // the point at which it stops calling _read() to fill the buffer
  // Note: 0 is a valid value, means "don't call _read preemptively ever"
  var hwm = options.highWaterMark;
  var readableHwm = options.readableHighWaterMark;
  var defaultHwm = this.objectMode ? 16 : 16 * 1024;

  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;

  // cast to ints.
  this.highWaterMark = Math.floor(this.highWaterMark);

  // A linked list is used to store data chunks instead of an array because the
  // linked list can remove elements from the beginning faster than
  // array.shift()
  this.buffer = new BufferList();
  this.length = 0;
  this.pipes = null;
  this.pipesCount = 0;
  this.flowing = null;
  this.ended = false;
  this.endEmitted = false;
  this.reading = false;

  // a flag to be able to tell if the event 'readable'/'data' is emitted
  // immediately, or on a later tick.  We set this to true at first, because
  // any actions that shouldn't happen until "later" should generally also
  // not happen before the first read call.
  this.sync = true;

  // whenever we return null, then we set a flag to say
  // that we're awaiting a 'readable' event emission.
  this.needReadable = false;
  this.emittedReadable = false;
  this.readableListening = false;
  this.resumeScheduled = false;

  // has it been destroyed
  this.destroyed = false;

  // Crypto is kind of old and crusty.  Historically, its default string
  // encoding is 'binary' so we have to make this configurable.
  // Everything else in the universe uses 'utf8', though.
  this.defaultEncoding = options.defaultEncoding || 'utf8';

  // the number of writers that are awaiting a drain event in .pipe()s
  this.awaitDrain = 0;

  // if true, a maybeReadMore has been scheduled
  this.readingMore = false;

  this.decoder = null;
  this.encoding = null;
  if (options.encoding) {
    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
    this.decoder = new StringDecoder(options.encoding);
    this.encoding = options.encoding;
  }
}

function Readable(options) {
  Duplex = Duplex || require('./_stream_duplex');

  if (!(this instanceof Readable)) return new Readable(options);

  this._readableState = new ReadableState(options, this);

  // legacy
  this.readable = true;

  if (options) {
    if (typeof options.read === 'function') this._read = options.read;

    if (typeof options.destroy === 'function') this._destroy = options.destroy;
  }

  Stream.call(this);
}

Object.defineProperty(Readable.prototype, 'destroyed', {
  get: function () {
    if (this._readableState === undefined) {
      return false;
    }
    return this._readableState.destroyed;
  },
  set: function (value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (!this._readableState) {
      return;
    }

    // backward compatibility, the user is explicitly
    // managing destroyed
    this._readableState.destroyed = value;
  }
});

Readable.prototype.destroy = destroyImpl.destroy;
Readable.prototype._undestroy = destroyImpl.undestroy;
Readable.prototype._destroy = function (err, cb) {
  this.push(null);
  cb(err);
};

// Manually shove something into the read() buffer.
// This returns true if the highWaterMark has not been hit yet,
// similar to how Writable.write() returns true if you should
// write() some more.
Readable.prototype.push = function (chunk, encoding) {
  var state = this._readableState;
  var skipChunkCheck;

  if (!state.objectMode) {
    if (typeof chunk === 'string') {
      encoding = encoding || state.defaultEncoding;
      if (encoding !== state.encoding) {
        chunk = Buffer.from(chunk, encoding);
        encoding = '';
      }
      skipChunkCheck = true;
    }
  } else {
    skipChunkCheck = true;
  }

  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
};

// Unshift should *always* be something directly out of read()
Readable.prototype.unshift = function (chunk) {
  return readableAddChunk(this, chunk, null, true, false);
};

function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
  var state = stream._readableState;
  if (chunk === null) {
    state.reading = false;
    onEofChunk(stream, state);
  } else {
    var er;
    if (!skipChunkCheck) er = chunkInvalid(state, chunk);
    if (er) {
      stream.emit('error', er);
    } else if (state.objectMode || chunk && chunk.length > 0) {
      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
        chunk = _uint8ArrayToBuffer(chunk);
      }

      if (addToFront) {
        if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
      } else if (state.ended) {
        stream.emit('error', new Error('stream.push() after EOF'));
      } else {
        state.reading = false;
        if (state.decoder && !encoding) {
          chunk = state.decoder.write(chunk);
          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
        } else {
          addChunk(stream, state, chunk, false);
        }
      }
    } else if (!addToFront) {
      state.reading = false;
    }
  }

  return needMoreData(state);
}

function addChunk(stream, state, chunk, addToFront) {
  if (state.flowing && state.length === 0 && !state.sync) {
    stream.emit('data', chunk);
    stream.read(0);
  } else {
    // update the buffer info.
    state.length += state.objectMode ? 1 : chunk.length;
    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);

    if (state.needReadable) emitReadable(stream);
  }
  maybeReadMore(stream, state);
}

function chunkInvalid(state, chunk) {
  var er;
  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
    er = new TypeError('Invalid non-string/buffer chunk');
  }
  return er;
}

// if it's past the high water mark, we can push in some more.
// Also, if we have no data yet, we can stand some
// more bytes.  This is to work around cases where hwm=0,
// such as the repl.  Also, if the push() triggered a
// readable event, and the user called read(largeNumber) such that
// needReadable was set, then we ought to push more, so that another
// 'readable' event will be triggered.
function needMoreData(state) {
  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
}

Readable.prototype.isPaused = function () {
  return this._readableState.flowing === false;
};

// backwards compatibility.
Readable.prototype.setEncoding = function (enc) {
  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
  this._readableState.decoder = new StringDecoder(enc);
  this._readableState.encoding = enc;
  return this;
};

// Don't raise the hwm > 8MB
var MAX_HWM = 0x800000;
function computeNewHighWaterMark(n) {
  if (n >= MAX_HWM) {
    n = MAX_HWM;
  } else {
    // Get the next highest power of 2 to prevent increasing hwm excessively in
    // tiny amounts
    n--;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    n++;
  }
  return n;
}

// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function howMuchToRead(n, state) {
  if (n <= 0 || state.length === 0 && state.ended) return 0;
  if (state.objectMode) return 1;
  if (n !== n) {
    // Only flow one buffer at a time
    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
  }
  // If we're asking for more than the current hwm, then raise the hwm.
  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
  if (n <= state.length) return n;
  // Don't have enough
  if (!state.ended) {
    state.needReadable = true;
    return 0;
  }
  return state.length;
}

// you can override either this method, or the async _read(n) below.
Readable.prototype.read = function (n) {
  debug('read', n);
  n = parseInt(n, 10);
  var state = this._readableState;
  var nOrig = n;

  if (n !== 0) state.emittedReadable = false;

  // if we're doing read(0) to trigger a readable event, but we
  // already have a bunch of data in the buffer, then just trigger
  // the 'readable' event and move on.
  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
    debug('read: emitReadable', state.length, state.ended);
    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
    return null;
  }

  n = howMuchToRead(n, state);

  // if we've ended, and we're now clear, then finish it up.
  if (n === 0 && state.ended) {
    if (state.length === 0) endReadable(this);
    return null;
  }

  // All the actual chunk generation logic needs to be
  // *below* the call to _read.  The reason is that in certain
  // synthetic stream cases, such as passthrough streams, _read
  // may be a completely synchronous operation which may change
  // the state of the read buffer, providing enough data when
  // before there was *not* enough.
  //
  // So, the steps are:
  // 1. Figure out what the state of things will be after we do
  // a read from the buffer.
  //
  // 2. If that resulting state will trigger a _read, then call _read.
  // Note that this may be asynchronous, or synchronous.  Yes, it is
  // deeply ugly to write APIs this way, but that still doesn't mean
  // that the Readable class should behave improperly, as streams are
  // designed to be sync/async agnostic.
  // Take note if the _read call is sync or async (ie, if the read call
  // has returned yet), so that we know whether or not it's safe to emit
  // 'readable' etc.
  //
  // 3. Actually pull the requested chunks out of the buffer and return.

  // if we need a readable event, then we need to do some reading.
  var doRead = state.needReadable;
  debug('need readable', doRead);

  // if we currently have less than the highWaterMark, then also read some
  if (state.length === 0 || state.length - n < state.highWaterMark) {
    doRead = true;
    debug('length less than watermark', doRead);
  }

  // however, if we've ended, then there's no point, and if we're already
  // reading, then it's unnecessary.
  if (state.ended || state.reading) {
    doRead = false;
    debug('reading or ended', doRead);
  } else if (doRead) {
    debug('do read');
    state.reading = true;
    state.sync = true;
    // if the length is currently zero, then we *need* a readable event.
    if (state.length === 0) state.needReadable = true;
    // call internal read method
    this._read(state.highWaterMark);
    state.sync = false;
    // If _read pushed data synchronously, then `reading` will be false,
    // and we need to re-evaluate how much data we can return to the user.
    if (!state.reading) n = howMuchToRead(nOrig, state);
  }

  var ret;
  if (n > 0) ret = fromList(n, state);else ret = null;

  if (ret === null) {
    state.needReadable = true;
    n = 0;
  } else {
    state.length -= n;
  }

  if (state.length === 0) {
    // If we have nothing in the buffer, then we want to know
    // as soon as we *do* get something into the buffer.
    if (!state.ended) state.needReadable = true;

    // If we tried to read() past the EOF, then emit end on the next tick.
    if (nOrig !== n && state.ended) endReadable(this);
  }

  if (ret !== null) this.emit('data', ret);

  return ret;
};

function onEofChunk(stream, state) {
  if (state.ended) return;
  if (state.decoder) {
    var chunk = state.decoder.end();
    if (chunk && chunk.length) {
      state.buffer.push(chunk);
      state.length += state.objectMode ? 1 : chunk.length;
    }
  }
  state.ended = true;

  // emit 'readable' now to make sure it gets picked up.
  emitReadable(stream);
}

// Don't emit readable right away in sync mode, because this can trigger
// another read() call => stack overflow.  This way, it might trigger
// a nextTick recursion warning, but that's not so bad.
function emitReadable(stream) {
  var state = stream._readableState;
  state.needReadable = false;
  if (!state.emittedReadable) {
    debug('emitReadable', state.flowing);
    state.emittedReadable = true;
    if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);
  }
}

function emitReadable_(stream) {
  debug('emit readable');
  stream.emit('readable');
  flow(stream);
}

// at this point, the user has presumably seen the 'readable' event,
// and called read() to consume some data.  that may have triggered
// in turn another _read(n) call, in which case reading = true if
// it's in progress.
// However, if we're not ended, or reading, and the length < hwm,
// then go ahead and try to read some more preemptively.
function maybeReadMore(stream, state) {
  if (!state.readingMore) {
    state.readingMore = true;
    pna.nextTick(maybeReadMore_, stream, state);
  }
}

function maybeReadMore_(stream, state) {
  var len = state.length;
  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
    debug('maybeReadMore read 0');
    stream.read(0);
    if (len === state.length)
      // didn't get any data, stop spinning.
      break;else len = state.length;
  }
  state.readingMore = false;
}

// abstract method.  to be overridden in specific implementation classes.
// call cb(er, data) where data is <= n in length.
// for virtual (non-string, non-buffer) streams, "length" is somewhat
// arbitrary, and perhaps not very meaningful.
Readable.prototype._read = function (n) {
  this.emit('error', new Error('_read() is not implemented'));
};

Readable.prototype.pipe = function (dest, pipeOpts) {
  var src = this;
  var state = this._readableState;

  switch (state.pipesCount) {
    case 0:
      state.pipes = dest;
      break;
    case 1:
      state.pipes = [state.pipes, dest];
      break;
    default:
      state.pipes.push(dest);
      break;
  }
  state.pipesCount += 1;
  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);

  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;

  var endFn = doEnd ? onend : unpipe;
  if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);

  dest.on('unpipe', onunpipe);
  function onunpipe(readable, unpipeInfo) {
    debug('onunpipe');
    if (readable === src) {
      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
        unpipeInfo.hasUnpiped = true;
        cleanup();
      }
    }
  }

  function onend() {
    debug('onend');
    dest.end();
  }

  // when the dest drains, it reduces the awaitDrain counter
  // on the source.  This would be more elegant with a .once()
  // handler in flow(), but adding and removing repeatedly is
  // too slow.
  var ondrain = pipeOnDrain(src);
  dest.on('drain', ondrain);

  var cleanedUp = false;
  function cleanup() {
    debug('cleanup');
    // cleanup event handlers once the pipe is broken
    dest.removeListener('close', onclose);
    dest.removeListener('finish', onfinish);
    dest.removeListener('drain', ondrain);
    dest.removeListener('error', onerror);
    dest.removeListener('unpipe', onunpipe);
    src.removeListener('end', onend);
    src.removeListener('end', unpipe);
    src.removeListener('data', ondata);

    cleanedUp = true;

    // if the reader is waiting for a drain event from this
    // specific writer, then it would cause it to never start
    // flowing again.
    // So, if this is awaiting a drain, then we just call it now.
    // If we don't know, then assume that we are waiting for one.
    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
  }

  // If the user pushes more data while we're writing to dest then we'll end up
  // in ondata again. However, we only want to increase awaitDrain once because
  // dest will only emit one 'drain' event for the multiple writes.
  // => Introduce a guard on increasing awaitDrain.
  var increasedAwaitDrain = false;
  src.on('data', ondata);
  function ondata(chunk) {
    debug('ondata');
    increasedAwaitDrain = false;
    var ret = dest.write(chunk);
    if (false === ret && !increasedAwaitDrain) {
      // If the user unpiped during `dest.write()`, it is possible
      // to get stuck in a permanently paused state if that write
      // also returned false.
      // => Check whether `dest` is still a piping destination.
      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
        debug('false write response, pause', src._readableState.awaitDrain);
        src._readableState.awaitDrain++;
        increasedAwaitDrain = true;
      }
      src.pause();
    }
  }

  // if the dest has an error, then stop piping into it.
  // however, don't suppress the throwing behavior for this.
  function onerror(er) {
    debug('onerror', er);
    unpipe();
    dest.removeListener('error', onerror);
    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
  }

  // Make sure our error handler is attached before userland ones.
  prependListener(dest, 'error', onerror);

  // Both close and finish should trigger unpipe, but only once.
  function onclose() {
    dest.removeListener('finish', onfinish);
    unpipe();
  }
  dest.once('close', onclose);
  function onfinish() {
    debug('onfinish');
    dest.removeListener('close', onclose);
    unpipe();
  }
  dest.once('finish', onfinish);

  function unpipe() {
    debug('unpipe');
    src.unpipe(dest);
  }

  // tell the dest that it's being piped to
  dest.emit('pipe', src);

  // start the flow if it hasn't been started already.
  if (!state.flowing) {
    debug('pipe resume');
    src.resume();
  }

  return dest;
};

function pipeOnDrain(src) {
  return function () {
    var state = src._readableState;
    debug('pipeOnDrain', state.awaitDrain);
    if (state.awaitDrain) state.awaitDrain--;
    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
      state.flowing = true;
      flow(src);
    }
  };
}

Readable.prototype.unpipe = function (dest) {
  var state = this._readableState;
  var unpipeInfo = { hasUnpiped: false };

  // if we're not piping anywhere, then do nothing.
  if (state.pipesCount === 0) return this;

  // just one destination.  most common case.
  if (state.pipesCount === 1) {
    // passed in one, but it's not the right one.
    if (dest && dest !== state.pipes) return this;

    if (!dest) dest = state.pipes;

    // got a match.
    state.pipes = null;
    state.pipesCount = 0;
    state.flowing = false;
    if (dest) dest.emit('unpipe', this, unpipeInfo);
    return this;
  }

  // slow case. multiple pipe destinations.

  if (!dest) {
    // remove all.
    var dests = state.pipes;
    var len = state.pipesCount;
    state.pipes = null;
    state.pipesCount = 0;
    state.flowing = false;

    for (var i = 0; i < len; i++) {
      dests[i].emit('unpipe', this, unpipeInfo);
    }return this;
  }

  // try to find the right one.
  var index = indexOf(state.pipes, dest);
  if (index === -1) return this;

  state.pipes.splice(index, 1);
  state.pipesCount -= 1;
  if (state.pipesCount === 1) state.pipes = state.pipes[0];

  dest.emit('unpipe', this, unpipeInfo);

  return this;
};

// set up data events if they are asked for
// Ensure readable listeners eventually get something
Readable.prototype.on = function (ev, fn) {
  var res = Stream.prototype.on.call(this, ev, fn);

  if (ev === 'data') {
    // Start flowing on next tick if stream isn't explicitly paused
    if (this._readableState.flowing !== false) this.resume();
  } else if (ev === 'readable') {
    var state = this._readableState;
    if (!state.endEmitted && !state.readableListening) {
      state.readableListening = state.needReadable = true;
      state.emittedReadable = false;
      if (!state.reading) {
        pna.nextTick(nReadingNextTick, this);
      } else if (state.length) {
        emitReadable(this);
      }
    }
  }

  return res;
};
Readable.prototype.addListener = Readable.prototype.on;

function nReadingNextTick(self) {
  debug('readable nexttick read 0');
  self.read(0);
}

// pause() and resume() are remnants of the legacy readable stream API
// If the user uses them, then switch into old mode.
Readable.prototype.resume = function () {
  var state = this._readableState;
  if (!state.flowing) {
    debug('resume');
    state.flowing = true;
    resume(this, state);
  }
  return this;
};

function resume(stream, state) {
  if (!state.resumeScheduled) {
    state.resumeScheduled = true;
    pna.nextTick(resume_, stream, state);
  }
}

function resume_(stream, state) {
  if (!state.reading) {
    debug('resume read 0');
    stream.read(0);
  }

  state.resumeScheduled = false;
  state.awaitDrain = 0;
  stream.emit('resume');
  flow(stream);
  if (state.flowing && !state.reading) stream.read(0);
}

Readable.prototype.pause = function () {
  debug('call pause flowing=%j', this._readableState.flowing);
  if (false !== this._readableState.flowing) {
    debug('pause');
    this._readableState.flowing = false;
    this.emit('pause');
  }
  return this;
};

function flow(stream) {
  var state = stream._readableState;
  debug('flow', state.flowing);
  while (state.flowing && stream.read() !== null) {}
}

// wrap an old-style stream as the async data source.
// This is *not* part of the readable stream interface.
// It is an ugly unfortunate mess of history.
Readable.prototype.wrap = function (stream) {
  var _this = this;

  var state = this._readableState;
  var paused = false;

  stream.on('end', function () {
    debug('wrapped end');
    if (state.decoder && !state.ended) {
      var chunk = state.decoder.end();
      if (chunk && chunk.length) _this.push(chunk);
    }

    _this.push(null);
  });

  stream.on('data', function (chunk) {
    debug('wrapped data');
    if (state.decoder) chunk = state.decoder.write(chunk);

    // don't skip over falsy values in objectMode
    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;

    var ret = _this.push(chunk);
    if (!ret) {
      paused = true;
      stream.pause();
    }
  });

  // proxy all the other methods.
  // important when wrapping filters and duplexes.
  for (var i in stream) {
    if (this[i] === undefined && typeof stream[i] === 'function') {
      this[i] = function (method) {
        return function () {
          return stream[method].apply(stream, arguments);
        };
      }(i);
    }
  }

  // proxy certain important events.
  for (var n = 0; n < kProxyEvents.length; n++) {
    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
  }

  // when we try to consume some more bytes, simply unpause the
  // underlying stream.
  this._read = function (n) {
    debug('wrapped _read', n);
    if (paused) {
      paused = false;
      stream.resume();
    }
  };

  return this;
};

Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function () {
    return this._readableState.highWaterMark;
  }
});

// exposed for testing purposes only.
Readable._fromList = fromList;

// Pluck off n bytes from an array of buffers.
// Length is the combined lengths of all the buffers in the list.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function fromList(n, state) {
  // nothing buffered
  if (state.length === 0) return null;

  var ret;
  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
    // read it all, truncate the list
    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
    state.buffer.clear();
  } else {
    // read part of list
    ret = fromListPartial(n, state.buffer, state.decoder);
  }

  return ret;
}

// Extracts only enough buffered data to satisfy the amount requested.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function fromListPartial(n, list, hasStrings) {
  var ret;
  if (n < list.head.data.length) {
    // slice is the same for buffers and strings
    ret = list.head.data.slice(0, n);
    list.head.data = list.head.data.slice(n);
  } else if (n === list.head.data.length) {
    // first chunk is a perfect match
    ret = list.shift();
  } else {
    // result spans more than one buffer
    ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
  }
  return ret;
}

// Copies a specified amount of characters from the list of buffered data
// chunks.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function copyFromBufferString(n, list) {
  var p = list.head;
  var c = 1;
  var ret = p.data;
  n -= ret.length;
  while (p = p.next) {
    var str = p.data;
    var nb = n > str.length ? str.length : n;
    if (nb === str.length) ret += str;else ret += str.slice(0, n);
    n -= nb;
    if (n === 0) {
      if (nb === str.length) {
        ++c;
        if (p.next) list.head = p.next;else list.head = list.tail = null;
      } else {
        list.head = p;
        p.data = str.slice(nb);
      }
      break;
    }
    ++c;
  }
  list.length -= c;
  return ret;
}

// Copies a specified amount of bytes from the list of buffered data chunks.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.
function copyFromBuffer(n, list) {
  var ret = Buffer.allocUnsafe(n);
  var p = list.head;
  var c = 1;
  p.data.copy(ret);
  n -= p.data.length;
  while (p = p.next) {
    var buf = p.data;
    var nb = n > buf.length ? buf.length : n;
    buf.copy(ret, ret.length - n, 0, nb);
    n -= nb;
    if (n === 0) {
      if (nb === buf.length) {
        ++c;
        if (p.next) list.head = p.next;else list.head = list.tail = null;
      } else {
        list.head = p;
        p.data = buf.slice(nb);
      }
      break;
    }
    ++c;
  }
  list.length -= c;
  return ret;
}

function endReadable(stream) {
  var state = stream._readableState;

  // If we get here before consuming all the bytes, then that is a
  // bug in node.  Should never happen.
  if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');

  if (!state.endEmitted) {
    state.ended = true;
    pna.nextTick(endReadableNT, state, stream);
  }
}

function endReadableNT(state, stream) {
  // Check that we didn't get one last unshift.
  if (!state.endEmitted && state.length === 0) {
    state.endEmitted = true;
    stream.readable = false;
    stream.emit('end');
  }
}

function indexOf(xs, x) {
  for (var i = 0, l = xs.length; i < l; i++) {
    if (xs[i] === x) return i;
  }
  return -1;
}// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// a transform stream is a readable/writable stream where you do
// something with the data.  Sometimes it's called a "filter",
// but that's not a great name for it, since that implies a thing where
// some bits pass through, and others are simply ignored.  (That would
// be a valid example of a transform, of course.)
//
// While the output is causally related to the input, it's not a
// necessarily symmetric or synchronous transformation.  For example,
// a zlib stream might take multiple plain-text writes(), and then
// emit a single compressed chunk some time in the future.
//
// Here's how this works:
//
// The Transform stream has all the aspects of the readable and writable
// stream classes.  When you write(chunk), that calls _write(chunk,cb)
// internally, and returns false if there's a lot of pending writes
// buffered up.  When you call read(), that calls _read(n) until
// there's enough pending readable data buffered up.
//
// In a transform stream, the written data is placed in a buffer.  When
// _read(n) is called, it transforms the queued up data, calling the
// buffered _write cb's as it consumes chunks.  If consuming a single
// written chunk would result in multiple output chunks, then the first
// outputted bit calls the readcb, and subsequent chunks just go into
// the read buffer, and will cause it to emit 'readable' if necessary.
//
// This way, back-pressure is actually determined by the reading side,
// since _read has to be called to start processing a new chunk.  However,
// a pathological inflate type of transform can cause excessive buffering
// here.  For example, imagine a stream where every byte of input is
// interpreted as an integer from 0-255, and then results in that many
// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
// 1kb of data being output.  In this case, you could write a very small
// amount of input, and end up with a very large amount of output.  In
// such a pathological inflating mechanism, there'd be no way to tell
// the system to stop doing the transform.  A single 4MB write could
// cause the system to run out of memory.
//
// However, even in such a pathological case, only a single written chunk
// would be consumed, and then the rest would wait (un-transformed) until
// the results of the previous transformed chunk were consumed.

'use strict';

module.exports = Transform;

var Duplex = require('./_stream_duplex');

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

util.inherits(Transform, Duplex);

function afterTransform(er, data) {
  var ts = this._transformState;
  ts.transforming = false;

  var cb = ts.writecb;

  if (!cb) {
    return this.emit('error', new Error('write callback called multiple times'));
  }

  ts.writechunk = null;
  ts.writecb = null;

  if (data != null) // single equals check for both `null` and `undefined`
    this.push(data);

  cb(er);

  var rs = this._readableState;
  rs.reading = false;
  if (rs.needReadable || rs.length < rs.highWaterMark) {
    this._read(rs.highWaterMark);
  }
}

function Transform(options) {
  if (!(this instanceof Transform)) return new Transform(options);

  Duplex.call(this, options);

  this._transformState = {
    afterTransform: afterTransform.bind(this),
    needTransform: false,
    transforming: false,
    writecb: null,
    writechunk: null,
    writeencoding: null
  };

  // start out asking for a readable event once data is transformed.
  this._readableState.needReadable = true;

  // we have implemented the _read method, and done the other things
  // that Readable wants before the first _read call, so unset the
  // sync guard flag.
  this._readableState.sync = false;

  if (options) {
    if (typeof options.transform === 'function') this._transform = options.transform;

    if (typeof options.flush === 'function') this._flush = options.flush;
  }

  // When the writable side finishes, then flush out anything remaining.
  this.on('prefinish', prefinish);
}

function prefinish() {
  var _this = this;

  if (typeof this._flush === 'function') {
    this._flush(function (er, data) {
      done(_this, er, data);
    });
  } else {
    done(this, null, null);
  }
}

Transform.prototype.push = function (chunk, encoding) {
  this._transformState.needTransform = false;
  return Duplex.prototype.push.call(this, chunk, encoding);
};

// This is the part where you do stuff!
// override this function in implementation classes.
// 'chunk' is an input chunk.
//
// Call `push(newChunk)` to pass along transformed output
// to the readable side.  You may call 'push' zero or more times.
//
// Call `cb(err)` when you are done with this chunk.  If you pass
// an error, then that'll put the hurt on the whole operation.  If you
// never call cb(), then you'll never get another chunk.
Transform.prototype._transform = function (chunk, encoding, cb) {
  throw new Error('_transform() is not implemented');
};

Transform.prototype._write = function (chunk, encoding, cb) {
  var ts = this._transformState;
  ts.writecb = cb;
  ts.writechunk = chunk;
  ts.writeencoding = encoding;
  if (!ts.transforming) {
    var rs = this._readableState;
    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
  }
};

// Doesn't matter what the args are here.
// _transform does all the work.
// That we got here means that the readable side wants more data.
Transform.prototype._read = function (n) {
  var ts = this._transformState;

  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
    ts.transforming = true;
    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
  } else {
    // mark that we need a transform, so that any data that comes in
    // will get processed, now that we've asked for it.
    ts.needTransform = true;
  }
};

Transform.prototype._destroy = function (err, cb) {
  var _this2 = this;

  Duplex.prototype._destroy.call(this, err, function (err2) {
    cb(err2);
    _this2.emit('close');
  });
};

function done(stream, er, data) {
  if (er) return stream.emit('error', er);

  if (data != null) // single equals check for both `null` and `undefined`
    stream.push(data);

  // if there's nothing in the write buffer, then that means
  // that nothing more will ever be provided
  if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');

  if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');

  return stream.push(null);
}// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

// A bit simpler than readable streams.
// Implement an async ._write(chunk, encoding, cb), and it'll handle all
// the drain event emission and buffering.

'use strict';

/*<replacement>*/

var pna = require('process-nextick-args');
/*</replacement>*/

module.exports = Writable;

/* <replacement> */
function WriteReq(chunk, encoding, cb) {
  this.chunk = chunk;
  this.encoding = encoding;
  this.callback = cb;
  this.next = null;
}

// It seems a linked list but it is not
// there will be only 2 of these for each stream
function CorkedRequest(state) {
  var _this = this;

  this.next = null;
  this.entry = null;
  this.finish = function () {
    onCorkedFinish(_this, state);
  };
}
/* </replacement> */

/*<replacement>*/
var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;
/*</replacement>*/

/*<replacement>*/
var Duplex;
/*</replacement>*/

Writable.WritableState = WritableState;

/*<replacement>*/
var util = Object.create(require('core-util-is'));
util.inherits = require('inherits');
/*</replacement>*/

/*<replacement>*/
var internalUtil = {
  deprecate: require('util-deprecate')
};
/*</replacement>*/

/*<replacement>*/
var Stream = require('./internal/streams/stream');
/*</replacement>*/

/*<replacement>*/

var Buffer = require('safe-buffer').Buffer;
var OurUint8Array = global.Uint8Array || function () {};
function _uint8ArrayToBuffer(chunk) {
  return Buffer.from(chunk);
}
function _isUint8Array(obj) {
  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
}

/*</replacement>*/

var destroyImpl = require('./internal/streams/destroy');

util.inherits(Writable, Stream);

function nop() {}

function WritableState(options, stream) {
  Duplex = Duplex || require('./_stream_duplex');

  options = options || {};

  // Duplex streams are both readable and writable, but share
  // the same options object.
  // However, some cases require setting options to different
  // values for the readable and the writable sides of the duplex stream.
  // These options can be provided separately as readableXXX and writableXXX.
  var isDuplex = stream instanceof Duplex;

  // object stream flag to indicate whether or not this stream
  // contains buffers or objects.
  this.objectMode = !!options.objectMode;

  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;

  // the point at which write() starts returning false
  // Note: 0 is a valid value, means that we always return false if
  // the entire buffer is not flushed immediately on write()
  var hwm = options.highWaterMark;
  var writableHwm = options.writableHighWaterMark;
  var defaultHwm = this.objectMode ? 16 : 16 * 1024;

  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;

  // cast to ints.
  this.highWaterMark = Math.floor(this.highWaterMark);

  // if _final has been called
  this.finalCalled = false;

  // drain event flag.
  this.needDrain = false;
  // at the start of calling end()
  this.ending = false;
  // when end() has been called, and returned
  this.ended = false;
  // when 'finish' is emitted
  this.finished = false;

  // has it been destroyed
  this.destroyed = false;

  // should we decode strings into buffers before passing to _write?
  // this is here so that some node-core streams can optimize string
  // handling at a lower level.
  var noDecode = options.decodeStrings === false;
  this.decodeStrings = !noDecode;

  // Crypto is kind of old and crusty.  Historically, its default string
  // encoding is 'binary' so we have to make this configurable.
  // Everything else in the universe uses 'utf8', though.
  this.defaultEncoding = options.defaultEncoding || 'utf8';

  // not an actual buffer we keep track of, but a measurement
  // of how much we're waiting to get pushed to some underlying
  // socket or file.
  this.length = 0;

  // a flag to see when we're in the middle of a write.
  this.writing = false;

  // when true all writes will be buffered until .uncork() call
  this.corked = 0;

  // a flag to be able to tell if the onwrite cb is called immediately,
  // or on a later tick.  We set this to true at first, because any
  // actions that shouldn't happen until "later" should generally also
  // not happen before the first write call.
  this.sync = true;

  // a flag to know if we're processing previously buffered items, which
  // may call the _write() callback in the same tick, so that we don't
  // end up in an overlapped onwrite situation.
  this.bufferProcessing = false;

  // the callback that's passed to _write(chunk,cb)
  this.onwrite = function (er) {
    onwrite(stream, er);
  };

  // the callback that the user supplies to write(chunk,encoding,cb)
  this.writecb = null;

  // the amount that is being written when _write is called.
  this.writelen = 0;

  this.bufferedRequest = null;
  this.lastBufferedRequest = null;

  // number of pending user-supplied write callbacks
  // this must be 0 before 'finish' can be emitted
  this.pendingcb = 0;

  // emit prefinish if the only thing we're waiting for is _write cbs
  // This is relevant for synchronous Transform streams
  this.prefinished = false;

  // True if the error was already emitted and should not be thrown again
  this.errorEmitted = false;

  // count buffered requests
  this.bufferedRequestCount = 0;

  // allocate the first CorkedRequest, there is always
  // one allocated and free to use, and we maintain at most two
  this.corkedRequestsFree = new CorkedRequest(this);
}

WritableState.prototype.getBuffer = function getBuffer() {
  var current = this.bufferedRequest;
  var out = [];
  while (current) {
    out.push(current);
    current = current.next;
  }
  return out;
};

(function () {
  try {
    Object.defineProperty(WritableState.prototype, 'buffer', {
      get: internalUtil.deprecate(function () {
        return this.getBuffer();
      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
    });
  } catch (_) {}
})();

// Test _writableState for inheritance to account for Duplex streams,
// whose prototype chain only points to Readable.
var realHasInstance;
if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
  realHasInstance = Function.prototype[Symbol.hasInstance];
  Object.defineProperty(Writable, Symbol.hasInstance, {
    value: function (object) {
      if (realHasInstance.call(this, object)) return true;
      if (this !== Writable) return false;

      return object && object._writableState instanceof WritableState;
    }
  });
} else {
  realHasInstance = function (object) {
    return object instanceof this;
  };
}

function Writable(options) {
  Duplex = Duplex || require('./_stream_duplex');

  // Writable ctor is applied to Duplexes, too.
  // `realHasInstance` is necessary because using plain `instanceof`
  // would return false, as no `_writableState` property is attached.

  // Trying to use the custom `instanceof` for Writable here will also break the
  // Node.js LazyTransform implementation, which has a non-trivial getter for
  // `_writableState` that would lead to infinite recursion.
  if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
    return new Writable(options);
  }

  this._writableState = new WritableState(options, this);

  // legacy.
  this.writable = true;

  if (options) {
    if (typeof options.write === 'function') this._write = options.write;

    if (typeof options.writev === 'function') this._writev = options.writev;

    if (typeof options.destroy === 'function') this._destroy = options.destroy;

    if (typeof options.final === 'function') this._final = options.final;
  }

  Stream.call(this);
}

// Otherwise people can pipe Writable streams, which is just wrong.
Writable.prototype.pipe = function () {
  this.emit('error', new Error('Cannot pipe, not readable'));
};

function writeAfterEnd(stream, cb) {
  var er = new Error('write after end');
  // TODO: defer error events consistently everywhere, not just the cb
  stream.emit('error', er);
  pna.nextTick(cb, er);
}

// Checks that a user-supplied chunk is valid, especially for the particular
// mode the stream is in. Currently this means that `null` is never accepted
// and undefined/non-string values are only allowed in object mode.
function validChunk(stream, state, chunk, cb) {
  var valid = true;
  var er = false;

  if (chunk === null) {
    er = new TypeError('May not write null values to stream');
  } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
    er = new TypeError('Invalid non-string/buffer chunk');
  }
  if (er) {
    stream.emit('error', er);
    pna.nextTick(cb, er);
    valid = false;
  }
  return valid;
}

Writable.prototype.write = function (chunk, encoding, cb) {
  var state = this._writableState;
  var ret = false;
  var isBuf = !state.objectMode && _isUint8Array(chunk);

  if (isBuf && !Buffer.isBuffer(chunk)) {
    chunk = _uint8ArrayToBuffer(chunk);
  }

  if (typeof encoding === 'function') {
    cb = encoding;
    encoding = null;
  }

  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;

  if (typeof cb !== 'function') cb = nop;

  if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
    state.pendingcb++;
    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
  }

  return ret;
};

Writable.prototype.cork = function () {
  var state = this._writableState;

  state.corked++;
};

Writable.prototype.uncork = function () {
  var state = this._writableState;

  if (state.corked) {
    state.corked--;

    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
  }
};

Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
  // node::ParseEncoding() requires lower case.
  if (typeof encoding === 'string') encoding = encoding.toLowerCase();
  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
  this._writableState.defaultEncoding = encoding;
  return this;
};

function decodeChunk(state, chunk, encoding) {
  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
    chunk = Buffer.from(chunk, encoding);
  }
  return chunk;
}

Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function () {
    return this._writableState.highWaterMark;
  }
});

// if we're already writing something, then just put this
// in the queue, and wait our turn.  Otherwise, call _write
// If we return false, then we need a drain event, so set that flag.
function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
  if (!isBuf) {
    var newChunk = decodeChunk(state, chunk, encoding);
    if (chunk !== newChunk) {
      isBuf = true;
      encoding = 'buffer';
      chunk = newChunk;
    }
  }
  var len = state.objectMode ? 1 : chunk.length;

  state.length += len;

  var ret = state.length < state.highWaterMark;
  // we must ensure that previous needDrain will not be reset to false.
  if (!ret) state.needDrain = true;

  if (state.writing || state.corked) {
    var last = state.lastBufferedRequest;
    state.lastBufferedRequest = {
      chunk: chunk,
      encoding: encoding,
      isBuf: isBuf,
      callback: cb,
      next: null
    };
    if (last) {
      last.next = state.lastBufferedRequest;
    } else {
      state.bufferedRequest = state.lastBufferedRequest;
    }
    state.bufferedRequestCount += 1;
  } else {
    doWrite(stream, state, false, len, chunk, encoding, cb);
  }

  return ret;
}

function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  state.writelen = len;
  state.writecb = cb;
  state.writing = true;
  state.sync = true;
  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
  state.sync = false;
}

function onwriteError(stream, state, sync, er, cb) {
  --state.pendingcb;

  if (sync) {
    // defer the callback if we are being called synchronously
    // to avoid piling up things on the stack
    pna.nextTick(cb, er);
    // this can emit finish, and it will always happen
    // after error
    pna.nextTick(finishMaybe, stream, state);
    stream._writableState.errorEmitted = true;
    stream.emit('error', er);
  } else {
    // the caller expect this to happen before if
    // it is async
    cb(er);
    stream._writableState.errorEmitted = true;
    stream.emit('error', er);
    // this can emit finish, but finish must
    // always follow error
    finishMaybe(stream, state);
  }
}

function onwriteStateUpdate(state) {
  state.writing = false;
  state.writecb = null;
  state.length -= state.writelen;
  state.writelen = 0;
}

function onwrite(stream, er) {
  var state = stream._writableState;
  var sync = state.sync;
  var cb = state.writecb;

  onwriteStateUpdate(state);

  if (er) onwriteError(stream, state, sync, er, cb);else {
    // Check if we're actually ready to finish, but don't emit yet
    var finished = needFinish(state);

    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
      clearBuffer(stream, state);
    }

    if (sync) {
      /*<replacement>*/
      asyncWrite(afterWrite, stream, state, finished, cb);
      /*</replacement>*/
    } else {
      afterWrite(stream, state, finished, cb);
    }
  }
}

function afterWrite(stream, state, finished, cb) {
  if (!finished) onwriteDrain(stream, state);
  state.pendingcb--;
  cb();
  finishMaybe(stream, state);
}

// Must force callback to be called on nextTick, so that we don't
// emit 'drain' before the write() consumer gets the 'false' return
// value, and has a chance to attach a 'drain' listener.
function onwriteDrain(stream, state) {
  if (state.length === 0 && state.needDrain) {
    state.needDrain = false;
    stream.emit('drain');
  }
}

// if there's something in the buffer waiting, then process it
function clearBuffer(stream, state) {
  state.bufferProcessing = true;
  var entry = state.bufferedRequest;

  if (stream._writev && entry && entry.next) {
    // Fast case, write everything using _writev()
    var l = state.bufferedRequestCount;
    var buffer = new Array(l);
    var holder = state.corkedRequestsFree;
    holder.entry = entry;

    var count = 0;
    var allBuffers = true;
    while (entry) {
      buffer[count] = entry;
      if (!entry.isBuf) allBuffers = false;
      entry = entry.next;
      count += 1;
    }
    buffer.allBuffers = allBuffers;

    doWrite(stream, state, true, state.length, buffer, '', holder.finish);

    // doWrite is almost always async, defer these to save a bit of time
    // as the hot path ends with doWrite
    state.pendingcb++;
    state.lastBufferedRequest = null;
    if (holder.next) {
      state.corkedRequestsFree = holder.next;
      holder.next = null;
    } else {
      state.corkedRequestsFree = new CorkedRequest(state);
    }
    state.bufferedRequestCount = 0;
  } else {
    // Slow case, write chunks one-by-one
    while (entry) {
      var chunk = entry.chunk;
      var encoding = entry.encoding;
      var cb = entry.callback;
      var len = state.objectMode ? 1 : chunk.length;

      doWrite(stream, state, false, len, chunk, encoding, cb);
      entry = entry.next;
      state.bufferedRequestCount--;
      // if we didn't call the onwrite immediately, then
      // it means that we need to wait until it does.
      // also, that means that the chunk and cb are currently
      // being processed, so move the buffer counter past them.
      if (state.writing) {
        break;
      }
    }

    if (entry === null) state.lastBufferedRequest = null;
  }

  state.bufferedRequest = entry;
  state.bufferProcessing = false;
}

Writable.prototype._write = function (chunk, encoding, cb) {
  cb(new Error('_write() is not implemented'));
};

Writable.prototype._writev = null;

Writable.prototype.end = function (chunk, encoding, cb) {
  var state = this._writableState;

  if (typeof chunk === 'function') {
    cb = chunk;
    chunk = null;
    encoding = null;
  } else if (typeof encoding === 'function') {
    cb = encoding;
    encoding = null;
  }

  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);

  // .end() fully uncorks
  if (state.corked) {
    state.corked = 1;
    this.uncork();
  }

  // ignore unnecessary end() calls.
  if (!state.ending && !state.finished) endWritable(this, state, cb);
};

function needFinish(state) {
  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
}
function callFinal(stream, state) {
  stream._final(function (err) {
    state.pendingcb--;
    if (err) {
      stream.emit('error', err);
    }
    state.prefinished = true;
    stream.emit('prefinish');
    finishMaybe(stream, state);
  });
}
function prefinish(stream, state) {
  if (!state.prefinished && !state.finalCalled) {
    if (typeof stream._final === 'function') {
      state.pendingcb++;
      state.finalCalled = true;
      pna.nextTick(callFinal, stream, state);
    } else {
      state.prefinished = true;
      stream.emit('prefinish');
    }
  }
}

function finishMaybe(stream, state) {
  var need = needFinish(state);
  if (need) {
    prefinish(stream, state);
    if (state.pendingcb === 0) {
      state.finished = true;
      stream.emit('finish');
    }
  }
  return need;
}

function endWritable(stream, state, cb) {
  state.ending = true;
  finishMaybe(stream, state);
  if (cb) {
    if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);
  }
  state.ended = true;
  stream.writable = false;
}

function onCorkedFinish(corkReq, state, err) {
  var entry = corkReq.entry;
  corkReq.entry = null;
  while (entry) {
    var cb = entry.callback;
    state.pendingcb--;
    cb(err);
    entry = entry.next;
  }
  if (state.corkedRequestsFree) {
    state.corkedRequestsFree.next = corkReq;
  } else {
    state.corkedRequestsFree = corkReq;
  }
}

Object.defineProperty(Writable.prototype, 'destroyed', {
  get: function () {
    if (this._writableState === undefined) {
      return false;
    }
    return this._writableState.destroyed;
  },
  set: function (value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (!this._writableState) {
      return;
    }

    // backward compatibility, the user is explicitly
    // managing destroyed
    this._writableState.destroyed = value;
  }
});

Writable.prototype.destroy = destroyImpl.destroy;
Writable.prototype._undestroy = destroyImpl.undestroy;
Writable.prototype._destroy = function (err, cb) {
  this.end();
  cb(err);
};'use strict';

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Buffer = require('safe-buffer').Buffer;
var util = require('util');

function copyBuffer(src, target, offset) {
  src.copy(target, offset);
}

module.exports = function () {
  function BufferList() {
    _classCallCheck(this, BufferList);

    this.head = null;
    this.tail = null;
    this.length = 0;
  }

  BufferList.prototype.push = function push(v) {
    var entry = { data: v, next: null };
    if (this.length > 0) this.tail.next = entry;else this.head = entry;
    this.tail = entry;
    ++this.length;
  };

  BufferList.prototype.unshift = function unshift(v) {
    var entry = { data: v, next: this.head };
    if (this.length === 0) this.tail = entry;
    this.head = entry;
    ++this.length;
  };

  BufferList.prototype.shift = function shift() {
    if (this.length === 0) return;
    var ret = this.head.data;
    if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
    --this.length;
    return ret;
  };

  BufferList.prototype.clear = function clear() {
    this.head = this.tail = null;
    this.length = 0;
  };

  BufferList.prototype.join = function join(s) {
    if (this.length === 0) return '';
    var p = this.head;
    var ret = '' + p.data;
    while (p = p.next) {
      ret += s + p.data;
    }return ret;
  };

  BufferList.prototype.concat = function concat(n) {
    if (this.length === 0) return Buffer.alloc(0);
    if (this.length === 1) return this.head.data;
    var ret = Buffer.allocUnsafe(n >>> 0);
    var p = this.head;
    var i = 0;
    while (p) {
      copyBuffer(p.data, ret, i);
      i += p.data.length;
      p = p.next;
    }
    return ret;
  };

  return BufferList;
}();

if (util && util.inspect && util.inspect.custom) {
  module.exports.prototype[util.inspect.custom] = function () {
    var obj = util.inspect({ length: this.length });
    return this.constructor.name + ' ' + obj;
  };
}'use strict';

/*<replacement>*/

var pna = require('process-nextick-args');
/*</replacement>*/

// undocumented cb() API, needed for core, not for public API
function destroy(err, cb) {
  var _this = this;

  var readableDestroyed = this._readableState && this._readableState.destroyed;
  var writableDestroyed = this._writableState && this._writableState.destroyed;

  if (readableDestroyed || writableDestroyed) {
    if (cb) {
      cb(err);
    } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {
      pna.nextTick(emitErrorNT, this, err);
    }
    return this;
  }

  // we set destroyed to true before firing error callbacks in order
  // to make it re-entrance safe in case destroy() is called within callbacks

  if (this._readableState) {
    this._readableState.destroyed = true;
  }

  // if this is a duplex stream mark the writable part as destroyed as well
  if (this._writableState) {
    this._writableState.destroyed = true;
  }

  this._destroy(err || null, function (err) {
    if (!cb && err) {
      pna.nextTick(emitErrorNT, _this, err);
      if (_this._writableState) {
        _this._writableState.errorEmitted = true;
      }
    } else if (cb) {
      cb(err);
    }
  });

  return this;
}

function undestroy() {
  if (this._readableState) {
    this._readableState.destroyed = false;
    this._readableState.reading = false;
    this._readableState.ended = false;
    this._readableState.endEmitted = false;
  }

  if (this._writableState) {
    this._writableState.destroyed = false;
    this._writableState.ended = false;
    this._writableState.ending = false;
    this._writableState.finished = false;
    this._writableState.errorEmitted = false;
  }
}

function emitErrorNT(self, err) {
  self.emit('error', err);
}

module.exports = {
  destroy: destroy,
  undestroy: undestroy
};module.exports = require('events').EventEmitter;
module.exports = require('stream');
# streams WG Meeting 2015-01-30

## Links

* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg
* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106
* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/

## Agenda

Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting.

* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105)
* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101)
* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102)
* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99)

## Minutes

### adopt a charter

* group: +1's all around

### What versioning scheme should be adopted?
* group: +1â€™s 3.0.0
* domenic+group: pulling in patches from other sources where appropriate
* mikeal: version independently, suggesting versions for io.js
* mikeal+domenic: work with TC to notify in advance of changes
simpler stream creation

### streamline creation of streams
* sam: streamline creation of streams
* domenic: nice simple solution posted
  but, we lose the opportunity to change the model
  may not be backwards incompatible (double check keys)

  **action item:** domenic will check

### remove implicit flowing of streams on(â€˜dataâ€™)
* add isFlowing / isPaused
* mikeal: worrying that weâ€™re documenting polyfill methods â€“ confuses users
* domenic: more reflective API is probably good, with warning labels for users
* new section for mad scientists (reflective stream access)
* calvin: name the â€œthird stateâ€�
* mikeal: maybe borrow the name from whatwg?
* domenic: weâ€™re missing the â€œthird stateâ€�
* consensus: kind of difficult to name the third state
* mikeal: figure out differences in states / compat
* mathias: always flow on data â€“ eliminates third state
  * explore what it breaks

**action items:**
* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream)
* ask rod/build for infrastructure
* **chris**: explore the â€œflow on dataâ€� approach
* add isPaused/isFlowing
* add new docs section
* move isPaused to that section


The MIT License (MIT)

Copyright (c) Feross Aboukhadijeh

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
/* eslint-disable node/no-deprecated-api */
var buffer = require('buffer')
var Buffer = buffer.Buffer

// alternative to using Object.keys for old browsers
function copyProps (src, dst) {
  for (var key in src) {
    dst[key] = src[key]
  }
}
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
  module.exports = buffer
} else {
  // Copy properties from require('buffer')
  copyProps(buffer, exports)
  exports.Buffer = SafeBuffer
}

function SafeBuffer (arg, encodingOrOffset, length) {
  return Buffer(arg, encodingOrOffset, length)
}

// Copy static methods from Buffer
copyProps(Buffer, SafeBuffer)

SafeBuffer.from = function (arg, encodingOrOffset, length) {
  if (typeof arg === 'number') {
    throw new TypeError('Argument must not be a number')
  }
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.alloc = function (size, fill, encoding) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  var buf = Buffer(size)
  if (fill !== undefined) {
    if (typeof encoding === 'string') {
      buf.fill(fill, encoding)
    } else {
      buf.fill(fill)
    }
  } else {
    buf.fill(0)
  }
  return buf
}

SafeBuffer.allocUnsafe = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return Buffer(size)
}

SafeBuffer.allocUnsafeSlow = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return buffer.SlowBuffer(size)
}
{
  "author": {
    "name": "Feross Aboukhadijeh",
    "email": "feross@feross.org",
    "url": "http://feross.org"
  },
  "deprecated": false,
  "description": "Safer Node.js Buffer API",
  "devDependencies": {
    "standard": "*",
    "tape": "^4.0.0"
  },
  "homepage": "https://github.com/feross/safe-buffer",
  "license": "MIT",
  "main": "index.js",
  "name": "safe-buffer",
  "repository": {
    "type": "git",
    "url": "git://github.com/feross/safe-buffer.git"
  },
  "types": "index.d.ts",
  "version": "5.1.2"
}Node.js is licensed for use as follows:

"""
Copyright Node.js contributors. All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
"""

This license applies to parts of Node.js originating from the
https://github.com/joyent/node repository:

"""
Copyright Joyent, Inc. and other Node contributors. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
"""

{
  "dependencies": {
    "safe-buffer": "~5.1.0"
  },
  "deprecated": false,
  "description": "The string_decoder module from Node core",
  "devDependencies": {
    "babel-polyfill": "^6.23.0",
    "core-util-is": "^1.0.2",
    "inherits": "^2.0.3",
    "tap": "~0.4.8"
  },
  "homepage": "https://github.com/nodejs/string_decoder",
  "license": "MIT",
  "main": "lib/string_decoder.js",
  "name": "string_decoder",
  "repository": {
    "type": "git",
    "url": "git://github.com/nodejs/string_decoder.git"
  },
  "version": "1.1.1"
}// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

/*<replacement>*/

var Buffer = require('safe-buffer').Buffer;
/*</replacement>*/

var isEncoding = Buffer.isEncoding || function (encoding) {
  encoding = '' + encoding;
  switch (encoding && encoding.toLowerCase()) {
    case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
      return true;
    default:
      return false;
  }
};

function _normalizeEncoding(enc) {
  if (!enc) return 'utf8';
  var retried;
  while (true) {
    switch (enc) {
      case 'utf8':
      case 'utf-8':
        return 'utf8';
      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return 'utf16le';
      case 'latin1':
      case 'binary':
        return 'latin1';
      case 'base64':
      case 'ascii':
      case 'hex':
        return enc;
      default:
        if (retried) return; // undefined
        enc = ('' + enc).toLowerCase();
        retried = true;
    }
  }
};

// Do not cache `Buffer.isEncoding` when checking encoding names as some
// modules monkey-patch it to support additional encodings
function normalizeEncoding(enc) {
  var nenc = _normalizeEncoding(enc);
  if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
  return nenc || enc;
}

// StringDecoder provides an interface for efficiently splitting a series of
// buffers into a series of JS strings without breaking apart multi-byte
// characters.
exports.StringDecoder = StringDecoder;
function StringDecoder(encoding) {
  this.encoding = normalizeEncoding(encoding);
  var nb;
  switch (this.encoding) {
    case 'utf16le':
      this.text = utf16Text;
      this.end = utf16End;
      nb = 4;
      break;
    case 'utf8':
      this.fillLast = utf8FillLast;
      nb = 4;
      break;
    case 'base64':
      this.text = base64Text;
      this.end = base64End;
      nb = 3;
      break;
    default:
      this.write = simpleWrite;
      this.end = simpleEnd;
      return;
  }
  this.lastNeed = 0;
  this.lastTotal = 0;
  this.lastChar = Buffer.allocUnsafe(nb);
}

StringDecoder.prototype.write = function (buf) {
  if (buf.length === 0) return '';
  var r;
  var i;
  if (this.lastNeed) {
    r = this.fillLast(buf);
    if (r === undefined) return '';
    i = this.lastNeed;
    this.lastNeed = 0;
  } else {
    i = 0;
  }
  if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
  return r || '';
};

StringDecoder.prototype.end = utf8End;

// Returns only complete characters in a Buffer
StringDecoder.prototype.text = utf8Text;

// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
StringDecoder.prototype.fillLast = function (buf) {
  if (this.lastNeed <= buf.length) {
    buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
    return this.lastChar.toString(this.encoding, 0, this.lastTotal);
  }
  buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
  this.lastNeed -= buf.length;
};

// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
// continuation byte. If an invalid byte is detected, -2 is returned.
function utf8CheckByte(byte) {
  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
  return byte >> 6 === 0x02 ? -1 : -2;
}

// Checks at most 3 bytes at the end of a Buffer in order to detect an
// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
// needed to complete the UTF-8 character (if applicable) are returned.
function utf8CheckIncomplete(self, buf, i) {
  var j = buf.length - 1;
  if (j < i) return 0;
  var nb = utf8CheckByte(buf[j]);
  if (nb >= 0) {
    if (nb > 0) self.lastNeed = nb - 1;
    return nb;
  }
  if (--j < i || nb === -2) return 0;
  nb = utf8CheckByte(buf[j]);
  if (nb >= 0) {
    if (nb > 0) self.lastNeed = nb - 2;
    return nb;
  }
  if (--j < i || nb === -2) return 0;
  nb = utf8CheckByte(buf[j]);
  if (nb >= 0) {
    if (nb > 0) {
      if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
    }
    return nb;
  }
  return 0;
}

// Validates as many continuation bytes for a multi-byte UTF-8 character as
// needed or are available. If we see a non-continuation byte where we expect
// one, we "replace" the validated continuation bytes we've seen so far with
// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
// behavior. The continuation byte check is included three times in the case
// where all of the continuation bytes for a character exist in the same buffer.
// It is also done this way as a slight performance increase instead of using a
// loop.
function utf8CheckExtraBytes(self, buf, p) {
  if ((buf[0] & 0xC0) !== 0x80) {
    self.lastNeed = 0;
    return '\ufffd';
  }
  if (self.lastNeed > 1 && buf.length > 1) {
    if ((buf[1] & 0xC0) !== 0x80) {
      self.lastNeed = 1;
      return '\ufffd';
    }
    if (self.lastNeed > 2 && buf.length > 2) {
      if ((buf[2] & 0xC0) !== 0x80) {
        self.lastNeed = 2;
        return '\ufffd';
      }
    }
  }
}

// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
function utf8FillLast(buf) {
  var p = this.lastTotal - this.lastNeed;
  var r = utf8CheckExtraBytes(this, buf, p);
  if (r !== undefined) return r;
  if (this.lastNeed <= buf.length) {
    buf.copy(this.lastChar, p, 0, this.lastNeed);
    return this.lastChar.toString(this.encoding, 0, this.lastTotal);
  }
  buf.copy(this.lastChar, p, 0, buf.length);
  this.lastNeed -= buf.length;
}

// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
// partial character, the character's bytes are buffered until the required
// number of bytes are available.
function utf8Text(buf, i) {
  var total = utf8CheckIncomplete(this, buf, i);
  if (!this.lastNeed) return buf.toString('utf8', i);
  this.lastTotal = total;
  var end = buf.length - (total - this.lastNeed);
  buf.copy(this.lastChar, 0, end);
  return buf.toString('utf8', i, end);
}

// For UTF-8, a replacement character is added when ending on a partial
// character.
function utf8End(buf) {
  var r = buf && buf.length ? this.write(buf) : '';
  if (this.lastNeed) return r + '\ufffd';
  return r;
}

// UTF-16LE typically needs two bytes per character, but even if we have an even
// number of bytes available, we need to check if we end on a leading/high
// surrogate. In that case, we need to wait for the next two bytes in order to
// decode the last character properly.
function utf16Text(buf, i) {
  if ((buf.length - i) % 2 === 0) {
    var r = buf.toString('utf16le', i);
    if (r) {
      var c = r.charCodeAt(r.length - 1);
      if (c >= 0xD800 && c <= 0xDBFF) {
        this.lastNeed = 2;
        this.lastTotal = 4;
        this.lastChar[0] = buf[buf.length - 2];
        this.lastChar[1] = buf[buf.length - 1];
        return r.slice(0, -1);
      }
    }
    return r;
  }
  this.lastNeed = 1;
  this.lastTotal = 2;
  this.lastChar[0] = buf[buf.length - 1];
  return buf.toString('utf16le', i, buf.length - 1);
}

// For UTF-16LE we do not explicitly append special replacement characters if we
// end on a partial character, we simply let v8 handle that.
function utf16End(buf) {
  var r = buf && buf.length ? this.write(buf) : '';
  if (this.lastNeed) {
    var end = this.lastTotal - this.lastNeed;
    return r + this.lastChar.toString('utf16le', 0, end);
  }
  return r;
}

function base64Text(buf, i) {
  var n = (buf.length - i) % 3;
  if (n === 0) return buf.toString('base64', i);
  this.lastNeed = 3 - n;
  this.lastTotal = 3;
  if (n === 1) {
    this.lastChar[0] = buf[buf.length - 1];
  } else {
    this.lastChar[0] = buf[buf.length - 2];
    this.lastChar[1] = buf[buf.length - 1];
  }
  return buf.toString('base64', i, buf.length - n);
}

function base64End(buf) {
  var r = buf && buf.length ? this.write(buf) : '';
  if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
  return r;
}

// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
function simpleWrite(buf) {
  return buf.toString(this.encoding);
}

function simpleEnd(buf) {
  return buf && buf.length ? this.write(buf) : '';
}'use strict';
const isObj = require('is-obj');

const disallowedKeys = [
	'__proto__',
	'prototype',
	'constructor'
];

const isValidPath = pathSegments => !pathSegments.some(segment => disallowedKeys.includes(segment));

function getPathSegments(path) {
	const pathArr = path.split('.');
	const parts = [];

	for (let i = 0; i < pathArr.length; i++) {
		let p = pathArr[i];

		while (p[p.length - 1] === '\\' && pathArr[i + 1] !== undefined) {
			p = p.slice(0, -1) + '.';
			p += pathArr[++i];
		}

		parts.push(p);
	}

	if (!isValidPath(parts)) {
		return [];
	}

	return parts;
}

module.exports = {
	get(obj, path, value) {
		if (!isObj(obj) || typeof path !== 'string') {
			return value === undefined ? obj : value;
		}

		const pathArr = getPathSegments(path);
		if (pathArr.length === 0) {
			return;
		}

		for (let i = 0; i < pathArr.length; i++) {
			if (!Object.prototype.propertyIsEnumerable.call(obj, pathArr[i])) {
				return value;
			}

			obj = obj[pathArr[i]];

			if (obj === undefined || obj === null) {
				// `obj` is either `undefined` or `null` so we want to stop the loop, and
				// if this is not the last bit of the path, and
				// if it did't return `undefined`
				// it would return `null` if `obj` is `null`
				// but we want `get({foo: null}, 'foo.bar')` to equal `undefined`, or the supplied value, not `null`
				if (i !== pathArr.length - 1) {
					return value;
				}

				break;
			}
		}

		return obj;
	},

	set(obj, path, value) {
		if (!isObj(obj) || typeof path !== 'string') {
			return obj;
		}

		const root = obj;
		const pathArr = getPathSegments(path);
		if (pathArr.length === 0) {
			return;
		}

		for (let i = 0; i < pathArr.length; i++) {
			const p = pathArr[i];

			if (!isObj(obj[p])) {
				obj[p] = {};
			}

			if (i === pathArr.length - 1) {
				obj[p] = value;
			}

			obj = obj[p];
		}

		return root;
	},

	delete(obj, path) {
		if (!isObj(obj) || typeof path !== 'string') {
			return;
		}

		const pathArr = getPathSegments(path);

		for (let i = 0; i < pathArr.length; i++) {
			const p = pathArr[i];

			if (i === pathArr.length - 1) {
				delete obj[p];
				return;
			}

			obj = obj[p];

			if (!isObj(obj)) {
				return;
			}
		}
	},

	has(obj, path) {
		if (!isObj(obj) || typeof path !== 'string') {
			return false;
		}

		const pathArr = getPathSegments(path);

		for (let i = 0; i < pathArr.length; i++) {
			if (isObj(obj)) {
				if (!(pathArr[i] in obj)) {
					return false;
				}

				obj = obj[pathArr[i]];
			} else {
				return false;
			}
		}

		return true;
	}
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "is-obj": "^1.0.0"
  },
  "deprecated": false,
  "description": "Get, set, or delete a property from a nested object using a dot path",
  "devDependencies": {
    "ava": "1.4.1",
    "matcha": "^0.7.0",
    "xo": "0.24.0"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/dot-prop#readme",
  "license": "MIT",
  "name": "dot-prop",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/dot-prop.git"
  },
  "version": "4.2.1"
}(The MIT License)

Copyright (c) 2011-2017 JP Richardson

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
 merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "JP Richardson",
    "email": "jprichardson@gmail.com"
  },
  "dependencies": {
    "graceful-fs": "^4.1.2",
    "jsonfile": "^4.0.0",
    "universalify": "^0.1.0"
  },
  "deprecated": false,
  "description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as mkdir -p, cp -r, and rm -rf.",
  "devDependencies": {
    "coveralls": "^2.11.2",
    "istanbul": "^0.4.5",
    "klaw": "^1.0.0",
    "klaw-sync": "^1.1.2",
    "minimist": "^1.1.1",
    "mocha": "^3.1.2",
    "proxyquire": "^1.7.10",
    "read-dir-files": "^0.1.1",
    "rimraf": "^2.2.8",
    "secure-random": "^1.1.1",
    "semver": "^5.3.0",
    "standard": "^10.0.2",
    "standard-markdown": "^4.0.1"
  },
  "homepage": "https://github.com/jprichardson/node-fs-extra",
  "license": "MIT",
  "main": "./lib/index.js",
  "name": "fs-extra",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jprichardson/node-fs-extra.git"
  },
  "version": "4.0.3"
}'use strict'

const assign = require('./util/assign')

const fs = {}

// Export graceful-fs:
assign(fs, require('./fs'))
// Export extra methods:
assign(fs, require('./copy'))
assign(fs, require('./copy-sync'))
assign(fs, require('./mkdirs'))
assign(fs, require('./remove'))
assign(fs, require('./json'))
assign(fs, require('./move'))
assign(fs, require('./move-sync'))
assign(fs, require('./empty'))
assign(fs, require('./ensure'))
assign(fs, require('./output'))
assign(fs, require('./path-exists'))

module.exports = fs
'use strict'

// simple mutable assign
function assign () {
  const args = [].slice.call(arguments).filter(i => i)
  const dest = args.shift()
  args.forEach(src => {
    Object.keys(src).forEach(key => {
      dest[key] = src[key]
    })
  })

  return dest
}

module.exports = assign
/* eslint-disable node/no-deprecated-api */
module.exports = function (size) {
  if (typeof Buffer.allocUnsafe === 'function') {
    try {
      return Buffer.allocUnsafe(size)
    } catch (e) {
      return new Buffer(size)
    }
  }
  return new Buffer(size)
}
'use strict'

const fs = require('graceful-fs')
const os = require('os')
const path = require('path')

// HFS, ext{2,3}, FAT do not, Node.js v0.10 does not
function hasMillisResSync () {
  let tmpfile = path.join('millis-test-sync' + Date.now().toString() + Math.random().toString().slice(2))
  tmpfile = path.join(os.tmpdir(), tmpfile)

  // 550 millis past UNIX epoch
  const d = new Date(1435410243862)
  fs.writeFileSync(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141')
  const fd = fs.openSync(tmpfile, 'r+')
  fs.futimesSync(fd, d, d)
  fs.closeSync(fd)
  return fs.statSync(tmpfile).mtime > 1435410243000
}

function hasMillisRes (callback) {
  let tmpfile = path.join('millis-test' + Date.now().toString() + Math.random().toString().slice(2))
  tmpfile = path.join(os.tmpdir(), tmpfile)

  // 550 millis past UNIX epoch
  const d = new Date(1435410243862)
  fs.writeFile(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141', err => {
    if (err) return callback(err)
    fs.open(tmpfile, 'r+', (err, fd) => {
      if (err) return callback(err)
      fs.futimes(fd, d, d, err => {
        if (err) return callback(err)
        fs.close(fd, err => {
          if (err) return callback(err)
          fs.stat(tmpfile, (err, stats) => {
            if (err) return callback(err)
            callback(null, stats.mtime > 1435410243000)
          })
        })
      })
    })
  })
}

function timeRemoveMillis (timestamp) {
  if (typeof timestamp === 'number') {
    return Math.floor(timestamp / 1000) * 1000
  } else if (timestamp instanceof Date) {
    return new Date(Math.floor(timestamp.getTime() / 1000) * 1000)
  } else {
    throw new Error('fs-extra: timeRemoveMillis() unknown parameter type')
  }
}

function utimesMillis (path, atime, mtime, callback) {
  // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)
  fs.open(path, 'r+', (err, fd) => {
    if (err) return callback(err)
    fs.futimes(fd, atime, mtime, futimesErr => {
      fs.close(fd, closeErr => {
        if (callback) callback(futimesErr || closeErr)
      })
    })
  })
}

module.exports = {
  hasMillisRes,
  hasMillisResSync,
  timeRemoveMillis,
  utimesMillis
}
'use strict'

const u = require('universalify').fromCallback
const rimraf = require('./rimraf')

module.exports = {
  remove: u(rimraf),
  removeSync: rimraf.sync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const assert = require('assert')

const isWindows = (process.platform === 'win32')

function defaults (options) {
  const methods = [
    'unlink',
    'chmod',
    'stat',
    'lstat',
    'rmdir',
    'readdir'
  ]
  methods.forEach(m => {
    options[m] = options[m] || fs[m]
    m = m + 'Sync'
    options[m] = options[m] || fs[m]
  })

  options.maxBusyTries = options.maxBusyTries || 3
}

function rimraf (p, options, cb) {
  let busyTries = 0

  if (typeof options === 'function') {
    cb = options
    options = {}
  }

  assert(p, 'rimraf: missing path')
  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
  assert.equal(typeof cb, 'function', 'rimraf: callback function required')
  assert(options, 'rimraf: invalid options argument provided')
  assert.equal(typeof options, 'object', 'rimraf: options should be object')

  defaults(options)

  rimraf_(p, options, function CB (er) {
    if (er) {
      if ((er.code === 'EBUSY' || er.code === 'ENOTEMPTY' || er.code === 'EPERM') &&
          busyTries < options.maxBusyTries) {
        busyTries++
        let time = busyTries * 100
        // try again, with the same exact callback as this one.
        return setTimeout(() => rimraf_(p, options, CB), time)
      }

      // already gone
      if (er.code === 'ENOENT') er = null
    }

    cb(er)
  })
}

// Two possible strategies.
// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
//
// Both result in an extra syscall when you guess wrong.  However, there
// are likely far more normal files in the world than directories.  This
// is based on the assumption that a the average number of files per
// directory is >= 1.
//
// If anyone ever complains about this, then I guess the strategy could
// be made configurable somehow.  But until then, YAGNI.
function rimraf_ (p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  // sunos lets the root user unlink directories, which is... weird.
  // so we have to lstat here and make sure it's not a dir.
  options.lstat(p, (er, st) => {
    if (er && er.code === 'ENOENT') {
      return cb(null)
    }

    // Windows can EPERM on stat.  Life is suffering.
    if (er && er.code === 'EPERM' && isWindows) {
      return fixWinEPERM(p, options, er, cb)
    }

    if (st && st.isDirectory()) {
      return rmdir(p, options, er, cb)
    }

    options.unlink(p, er => {
      if (er) {
        if (er.code === 'ENOENT') {
          return cb(null)
        }
        if (er.code === 'EPERM') {
          return (isWindows)
            ? fixWinEPERM(p, options, er, cb)
            : rmdir(p, options, er, cb)
        }
        if (er.code === 'EISDIR') {
          return rmdir(p, options, er, cb)
        }
      }
      return cb(er)
    })
  })
}

function fixWinEPERM (p, options, er, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')
  if (er) {
    assert(er instanceof Error)
  }

  options.chmod(p, 0o666, er2 => {
    if (er2) {
      cb(er2.code === 'ENOENT' ? null : er)
    } else {
      options.stat(p, (er3, stats) => {
        if (er3) {
          cb(er3.code === 'ENOENT' ? null : er)
        } else if (stats.isDirectory()) {
          rmdir(p, options, er, cb)
        } else {
          options.unlink(p, cb)
        }
      })
    }
  })
}

function fixWinEPERMSync (p, options, er) {
  let stats

  assert(p)
  assert(options)
  if (er) {
    assert(er instanceof Error)
  }

  try {
    options.chmodSync(p, 0o666)
  } catch (er2) {
    if (er2.code === 'ENOENT') {
      return
    } else {
      throw er
    }
  }

  try {
    stats = options.statSync(p)
  } catch (er3) {
    if (er3.code === 'ENOENT') {
      return
    } else {
      throw er
    }
  }

  if (stats.isDirectory()) {
    rmdirSync(p, options, er)
  } else {
    options.unlinkSync(p)
  }
}

function rmdir (p, options, originalEr, cb) {
  assert(p)
  assert(options)
  if (originalEr) {
    assert(originalEr instanceof Error)
  }
  assert(typeof cb === 'function')

  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
  // if we guessed wrong, and it's not a directory, then
  // raise the original error.
  options.rmdir(p, er => {
    if (er && (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM')) {
      rmkids(p, options, cb)
    } else if (er && er.code === 'ENOTDIR') {
      cb(originalEr)
    } else {
      cb(er)
    }
  })
}

function rmkids (p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  options.readdir(p, (er, files) => {
    if (er) return cb(er)

    let n = files.length
    let errState

    if (n === 0) return options.rmdir(p, cb)

    files.forEach(f => {
      rimraf(path.join(p, f), options, er => {
        if (errState) {
          return
        }
        if (er) return cb(errState = er)
        if (--n === 0) {
          options.rmdir(p, cb)
        }
      })
    })
  })
}

// this looks simpler, and is strictly *faster*, but will
// tie up the JavaScript thread and fail on excessively
// deep directory trees.
function rimrafSync (p, options) {
  let st

  options = options || {}
  defaults(options)

  assert(p, 'rimraf: missing path')
  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
  assert(options, 'rimraf: missing options')
  assert.equal(typeof options, 'object', 'rimraf: options should be object')

  try {
    st = options.lstatSync(p)
  } catch (er) {
    if (er.code === 'ENOENT') {
      return
    }

    // Windows can EPERM on stat.  Life is suffering.
    if (er.code === 'EPERM' && isWindows) {
      fixWinEPERMSync(p, options, er)
    }
  }

  try {
    // sunos lets the root user unlink directories, which is... weird.
    if (st && st.isDirectory()) {
      rmdirSync(p, options, null)
    } else {
      options.unlinkSync(p)
    }
  } catch (er) {
    if (er.code === 'ENOENT') {
      return
    } else if (er.code === 'EPERM') {
      return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
    } else if (er.code !== 'EISDIR') {
      throw er
    }
    rmdirSync(p, options, er)
  }
}

function rmdirSync (p, options, originalEr) {
  assert(p)
  assert(options)
  if (originalEr) {
    assert(originalEr instanceof Error)
  }

  try {
    options.rmdirSync(p)
  } catch (er) {
    if (er.code === 'ENOTDIR') {
      throw originalEr
    } else if (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM') {
      rmkidsSync(p, options)
    } else if (er.code !== 'ENOENT') {
      throw er
    }
  }
}

function rmkidsSync (p, options) {
  assert(p)
  assert(options)
  options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))

  // We only end up here once we got ENOTEMPTY at least once, and
  // at this point, we are guaranteed to have removed all the kids.
  // So, we know that it won't be ENOENT or ENOTDIR or anything else.
  // try really hard to delete stuff on windows, because it has a
  // PROFOUNDLY annoying habit of not closing handles promptly when
  // files are deleted, resulting in spurious ENOTEMPTY errors.
  const retries = isWindows ? 100 : 1
  let i = 0
  do {
    let threw = true
    try {
      const ret = options.rmdirSync(p, options)
      threw = false
      return ret
    } finally {
      if (++i < retries && threw) continue // eslint-disable-line
    }
  } while (true)
}

module.exports = rimraf
rimraf.sync = rimrafSync
'use strict'
const u = require('universalify').fromPromise
const fs = require('../fs')

function pathExists (path) {
  return fs.access(path).then(() => true).catch(() => false)
}

module.exports = {
  pathExists: u(pathExists),
  pathExistsSync: fs.existsSync
}
'use strict'

const u = require('universalify').fromCallback
const fs = require('graceful-fs')
const path = require('path')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function outputFile (file, data, encoding, callback) {
  if (typeof encoding === 'function') {
    callback = encoding
    encoding = 'utf8'
  }

  const dir = path.dirname(file)
  pathExists(dir, (err, itDoes) => {
    if (err) return callback(err)
    if (itDoes) return fs.writeFile(file, data, encoding, callback)

    mkdir.mkdirs(dir, err => {
      if (err) return callback(err)

      fs.writeFile(file, data, encoding, callback)
    })
  })
}

function outputFileSync (file, data, encoding) {
  const dir = path.dirname(file)
  if (fs.existsSync(dir)) {
    return fs.writeFileSync.apply(fs, arguments)
  }
  mkdir.mkdirsSync(dir)
  fs.writeFileSync.apply(fs, arguments)
}

module.exports = {
  outputFile: u(outputFile),
  outputFileSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const copySync = require('../copy-sync').copySync
const removeSync = require('../remove').removeSync
const mkdirpSync = require('../mkdirs').mkdirsSync
const buffer = require('../util/buffer')

function moveSync (src, dest, options) {
  options = options || {}
  const overwrite = options.overwrite || options.clobber || false

  src = path.resolve(src)
  dest = path.resolve(dest)

  if (src === dest) return fs.accessSync(src)

  if (isSrcSubdir(src, dest)) throw new Error(`Cannot move '${src}' into itself '${dest}'.`)

  mkdirpSync(path.dirname(dest))
  tryRenameSync()

  function tryRenameSync () {
    if (overwrite) {
      try {
        return fs.renameSync(src, dest)
      } catch (err) {
        if (err.code === 'ENOTEMPTY' || err.code === 'EEXIST' || err.code === 'EPERM') {
          removeSync(dest)
          options.overwrite = false // just overwriteed it, no need to do it again
          return moveSync(src, dest, options)
        }

        if (err.code !== 'EXDEV') throw err
        return moveSyncAcrossDevice(src, dest, overwrite)
      }
    } else {
      try {
        fs.linkSync(src, dest)
        return fs.unlinkSync(src)
      } catch (err) {
        if (err.code === 'EXDEV' || err.code === 'EISDIR' || err.code === 'EPERM' || err.code === 'ENOTSUP') {
          return moveSyncAcrossDevice(src, dest, overwrite)
        }
        throw err
      }
    }
  }
}

function moveSyncAcrossDevice (src, dest, overwrite) {
  const stat = fs.statSync(src)

  if (stat.isDirectory()) {
    return moveDirSyncAcrossDevice(src, dest, overwrite)
  } else {
    return moveFileSyncAcrossDevice(src, dest, overwrite)
  }
}

function moveFileSyncAcrossDevice (src, dest, overwrite) {
  const BUF_LENGTH = 64 * 1024
  const _buff = buffer(BUF_LENGTH)

  const flags = overwrite ? 'w' : 'wx'

  const fdr = fs.openSync(src, 'r')
  const stat = fs.fstatSync(fdr)
  const fdw = fs.openSync(dest, flags, stat.mode)
  let bytesRead = 1
  let pos = 0

  while (bytesRead > 0) {
    bytesRead = fs.readSync(fdr, _buff, 0, BUF_LENGTH, pos)
    fs.writeSync(fdw, _buff, 0, bytesRead)
    pos += bytesRead
  }

  fs.closeSync(fdr)
  fs.closeSync(fdw)
  return fs.unlinkSync(src)
}

function moveDirSyncAcrossDevice (src, dest, overwrite) {
  const options = {
    overwrite: false
  }

  if (overwrite) {
    removeSync(dest)
    tryCopySync()
  } else {
    tryCopySync()
  }

  function tryCopySync () {
    copySync(src, dest, options)
    return removeSync(src)
  }
}

// return true if dest is a subdir of src, otherwise false.
// extract dest base dir and check if that is the same as src basename
function isSrcSubdir (src, dest) {
  try {
    return fs.statSync(src).isDirectory() &&
           src !== dest &&
           dest.indexOf(src) > -1 &&
           dest.split(path.dirname(src) + path.sep)[1].split(path.sep)[0] === path.basename(src)
  } catch (e) {
    return false
  }
}

module.exports = {
  moveSync
}
'use strict'

// most of this code was written by Andrew Kelley
// licensed under the BSD license: see
// https://github.com/andrewrk/node-mv/blob/master/package.json

// this needs a cleanup

const u = require('universalify').fromCallback
const fs = require('graceful-fs')
const ncp = require('../copy/ncp')
const path = require('path')
const remove = require('../remove').remove
const mkdirp = require('../mkdirs').mkdirs

function move (src, dest, options, callback) {
  if (typeof options === 'function') {
    callback = options
    options = {}
  }

  const overwrite = options.overwrite || options.clobber || false

  isSrcSubdir(src, dest, (err, itIs) => {
    if (err) return callback(err)
    if (itIs) return callback(new Error(`Cannot move '${src}' to a subdirectory of itself, '${dest}'.`))
    mkdirp(path.dirname(dest), err => {
      if (err) return callback(err)
      doRename()
    })
  })

  function doRename () {
    if (path.resolve(src) === path.resolve(dest)) {
      fs.access(src, callback)
    } else if (overwrite) {
      fs.rename(src, dest, err => {
        if (!err) return callback()

        if (err.code === 'ENOTEMPTY' || err.code === 'EEXIST') {
          remove(dest, err => {
            if (err) return callback(err)
            options.overwrite = false // just overwriteed it, no need to do it again
            move(src, dest, options, callback)
          })
          return
        }

        // weird Windows shit
        if (err.code === 'EPERM') {
          setTimeout(() => {
            remove(dest, err => {
              if (err) return callback(err)
              options.overwrite = false
              move(src, dest, options, callback)
            })
          }, 200)
          return
        }

        if (err.code !== 'EXDEV') return callback(err)
        moveAcrossDevice(src, dest, overwrite, callback)
      })
    } else {
      fs.link(src, dest, err => {
        if (err) {
          if (err.code === 'EXDEV' || err.code === 'EISDIR' || err.code === 'EPERM' || err.code === 'ENOTSUP') {
            return moveAcrossDevice(src, dest, overwrite, callback)
          }
          return callback(err)
        }
        return fs.unlink(src, callback)
      })
    }
  }
}

function moveAcrossDevice (src, dest, overwrite, callback) {
  fs.stat(src, (err, stat) => {
    if (err) return callback(err)

    if (stat.isDirectory()) {
      moveDirAcrossDevice(src, dest, overwrite, callback)
    } else {
      moveFileAcrossDevice(src, dest, overwrite, callback)
    }
  })
}

function moveFileAcrossDevice (src, dest, overwrite, callback) {
  const flags = overwrite ? 'w' : 'wx'
  const ins = fs.createReadStream(src)
  const outs = fs.createWriteStream(dest, { flags })

  ins.on('error', err => {
    ins.destroy()
    outs.destroy()
    outs.removeListener('close', onClose)

    // may want to create a directory but `out` line above
    // creates an empty file for us: See #108
    // don't care about error here
    fs.unlink(dest, () => {
      // note: `err` here is from the input stream errror
      if (err.code === 'EISDIR' || err.code === 'EPERM') {
        moveDirAcrossDevice(src, dest, overwrite, callback)
      } else {
        callback(err)
      }
    })
  })

  outs.on('error', err => {
    ins.destroy()
    outs.destroy()
    outs.removeListener('close', onClose)
    callback(err)
  })

  outs.once('close', onClose)
  ins.pipe(outs)

  function onClose () {
    fs.unlink(src, callback)
  }
}

function moveDirAcrossDevice (src, dest, overwrite, callback) {
  const options = {
    overwrite: false
  }

  if (overwrite) {
    remove(dest, err => {
      if (err) return callback(err)
      startNcp()
    })
  } else {
    startNcp()
  }

  function startNcp () {
    ncp(src, dest, options, err => {
      if (err) return callback(err)
      remove(src, callback)
    })
  }
}

// return true if dest is a subdir of src, otherwise false.
// extract dest base dir and check if that is the same as src basename
function isSrcSubdir (src, dest, cb) {
  fs.stat(src, (err, st) => {
    if (err) return cb(err)
    if (st.isDirectory()) {
      const baseDir = dest.split(path.dirname(src) + path.sep)[1]
      if (baseDir) {
        const destBasename = baseDir.split(path.sep)[0]
        if (destBasename) return cb(null, src !== dest && dest.indexOf(src) > -1 && destBasename === path.basename(src))
        return cb(null, false)
      }
      return cb(null, false)
    }
    return cb(null, false)
  })
}

module.exports = {
  move: u(move)
}
'use strict'
const u = require('universalify').fromCallback
const mkdirs = u(require('./mkdirs'))
const mkdirsSync = require('./mkdirs-sync')

module.exports = {
  mkdirs: mkdirs,
  mkdirsSync: mkdirsSync,
  // alias
  mkdirp: mkdirs,
  mkdirpSync: mkdirsSync,
  ensureDir: mkdirs,
  ensureDirSync: mkdirsSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const invalidWin32Path = require('./win32').invalidWin32Path

const o777 = parseInt('0777', 8)

function mkdirsSync (p, opts, made) {
  if (!opts || typeof opts !== 'object') {
    opts = { mode: opts }
  }

  let mode = opts.mode
  const xfs = opts.fs || fs

  if (process.platform === 'win32' && invalidWin32Path(p)) {
    const errInval = new Error(p + ' contains invalid WIN32 path characters.')
    errInval.code = 'EINVAL'
    throw errInval
  }

  if (mode === undefined) {
    mode = o777 & (~process.umask())
  }
  if (!made) made = null

  p = path.resolve(p)

  try {
    xfs.mkdirSync(p, mode)
    made = made || p
  } catch (err0) {
    switch (err0.code) {
      case 'ENOENT':
        if (path.dirname(p) === p) throw err0
        made = mkdirsSync(path.dirname(p), opts, made)
        mkdirsSync(p, opts, made)
        break

      // In the case of any other error, just see if there's a dir
      // there already.  If so, then hooray!  If not, then something
      // is borked.
      default:
        let stat
        try {
          stat = xfs.statSync(p)
        } catch (err1) {
          throw err0
        }
        if (!stat.isDirectory()) throw err0
        break
    }
  }

  return made
}

module.exports = mkdirsSync
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const invalidWin32Path = require('./win32').invalidWin32Path

const o777 = parseInt('0777', 8)

function mkdirs (p, opts, callback, made) {
  if (typeof opts === 'function') {
    callback = opts
    opts = {}
  } else if (!opts || typeof opts !== 'object') {
    opts = { mode: opts }
  }

  if (process.platform === 'win32' && invalidWin32Path(p)) {
    const errInval = new Error(p + ' contains invalid WIN32 path characters.')
    errInval.code = 'EINVAL'
    return callback(errInval)
  }

  let mode = opts.mode
  const xfs = opts.fs || fs

  if (mode === undefined) {
    mode = o777 & (~process.umask())
  }
  if (!made) made = null

  callback = callback || function () {}
  p = path.resolve(p)

  xfs.mkdir(p, mode, er => {
    if (!er) {
      made = made || p
      return callback(null, made)
    }
    switch (er.code) {
      case 'ENOENT':
        if (path.dirname(p) === p) return callback(er)
        mkdirs(path.dirname(p), opts, (er, made) => {
          if (er) callback(er, made)
          else mkdirs(p, opts, callback, made)
        })
        break

      // In the case of any other error, just see if there's a dir
      // there already.  If so, then hooray!  If not, then something
      // is borked.
      default:
        xfs.stat(p, (er2, stat) => {
          // if the stat fails, then that's super weird.
          // let the original error be the failure reason.
          if (er2 || !stat.isDirectory()) callback(er, made)
          else callback(null, made)
        })
        break
    }
  })
}

module.exports = mkdirs
'use strict'

const path = require('path')

// get drive on windows
function getRootPath (p) {
  p = path.normalize(path.resolve(p)).split(path.sep)
  if (p.length > 0) return p[0]
  return null
}

// http://stackoverflow.com/a/62888/10333 contains more accurate
// TODO: expand to include the rest
const INVALID_PATH_CHARS = /[<>:"|?*]/

function invalidWin32Path (p) {
  const rp = getRootPath(p)
  p = p.replace(rp, '')
  return INVALID_PATH_CHARS.test(p)
}

module.exports = {
  getRootPath,
  invalidWin32Path
}
'use strict'

const u = require('universalify').fromCallback
const jsonFile = require('./jsonfile')

jsonFile.outputJson = u(require('./output-json'))
jsonFile.outputJsonSync = require('./output-json-sync')
// aliases
jsonFile.outputJSON = jsonFile.outputJson
jsonFile.outputJSONSync = jsonFile.outputJsonSync
jsonFile.writeJSON = jsonFile.writeJson
jsonFile.writeJSONSync = jsonFile.writeJsonSync
jsonFile.readJSON = jsonFile.readJson
jsonFile.readJSONSync = jsonFile.readJsonSync

module.exports = jsonFile
'use strict'

const u = require('universalify').fromCallback
const jsonFile = require('jsonfile')

module.exports = {
  // jsonfile exports
  readJson: u(jsonFile.readFile),
  readJsonSync: jsonFile.readFileSync,
  writeJson: u(jsonFile.writeFile),
  writeJsonSync: jsonFile.writeFileSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdir = require('../mkdirs')
const jsonFile = require('./jsonfile')

function outputJsonSync (file, data, options) {
  const dir = path.dirname(file)

  if (!fs.existsSync(dir)) {
    mkdir.mkdirsSync(dir)
  }

  jsonFile.writeJsonSync(file, data, options)
}

module.exports = outputJsonSync
'use strict'

const path = require('path')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists
const jsonFile = require('./jsonfile')

function outputJson (file, data, options, callback) {
  if (typeof options === 'function') {
    callback = options
    options = {}
  }

  const dir = path.dirname(file)

  pathExists(dir, (err, itDoes) => {
    if (err) return callback(err)
    if (itDoes) return jsonFile.writeJson(file, data, options, callback)

    mkdir.mkdirs(dir, err => {
      if (err) return callback(err)
      jsonFile.writeJson(file, data, options, callback)
    })
  })
}

module.exports = outputJson
// This is adapted from https://github.com/normalize/mz
// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
const u = require('universalify').fromCallback
const fs = require('graceful-fs')

const api = [
  'access',
  'appendFile',
  'chmod',
  'chown',
  'close',
  'copyFile',
  'fchmod',
  'fchown',
  'fdatasync',
  'fstat',
  'fsync',
  'ftruncate',
  'futimes',
  'lchown',
  'link',
  'lstat',
  'mkdir',
  'mkdtemp',
  'open',
  'readFile',
  'readdir',
  'readlink',
  'realpath',
  'rename',
  'rmdir',
  'stat',
  'symlink',
  'truncate',
  'unlink',
  'utimes',
  'writeFile'
].filter(key => {
  // Some commands are not available on some systems. Ex:
  // fs.copyFile was added in Node.js v8.5.0
  // fs.mkdtemp was added in Node.js v5.10.0
  // fs.lchown is not available on at least some Linux
  return typeof fs[key] === 'function'
})

// Export all keys:
Object.keys(fs).forEach(key => {
  exports[key] = fs[key]
})

// Universalify async methods:
api.forEach(method => {
  exports[method] = u(fs[method])
})

// We differ from mz/fs in that we still ship the old, broken, fs.exists()
// since we are a drop-in replacement for the native module
exports.exists = function (filename, callback) {
  if (typeof callback === 'function') {
    return fs.exists(filename, callback)
  }
  return new Promise(resolve => {
    return fs.exists(filename, resolve)
  })
}

// fs.read() & fs.write need special treatment due to multiple callback args

exports.read = function (fd, buffer, offset, length, position, callback) {
  if (typeof callback === 'function') {
    return fs.read(fd, buffer, offset, length, position, callback)
  }
  return new Promise((resolve, reject) => {
    fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
      if (err) return reject(err)
      resolve({ bytesRead, buffer })
    })
  })
}

// Function signature can be
// fs.write(fd, buffer[, offset[, length[, position]]], callback)
// OR
// fs.write(fd, string[, position[, encoding]], callback)
// so we need to handle both cases
exports.write = function (fd, buffer, a, b, c, callback) {
  if (typeof arguments[arguments.length - 1] === 'function') {
    return fs.write(fd, buffer, a, b, c, callback)
  }

  // Check for old, depricated fs.write(fd, string[, position[, encoding]], callback)
  if (typeof buffer === 'string') {
    return new Promise((resolve, reject) => {
      fs.write(fd, buffer, a, b, (err, bytesWritten, buffer) => {
        if (err) return reject(err)
        resolve({ bytesWritten, buffer })
      })
    })
  }

  return new Promise((resolve, reject) => {
    fs.write(fd, buffer, a, b, c, (err, bytesWritten, buffer) => {
      if (err) return reject(err)
      resolve({ bytesWritten, buffer })
    })
  })
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function createFile (file, callback) {
  function makeFile () {
    fs.writeFile(file, '', err => {
      if (err) return callback(err)
      callback()
    })
  }

  fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err
    if (!err && stats.isFile()) return callback()
    const dir = path.dirname(file)
    pathExists(dir, (err, dirExists) => {
      if (err) return callback(err)
      if (dirExists) return makeFile()
      mkdir.mkdirs(dir, err => {
        if (err) return callback(err)
        makeFile()
      })
    })
  })
}

function createFileSync (file) {
  let stats
  try {
    stats = fs.statSync(file)
  } catch (e) {}
  if (stats && stats.isFile()) return

  const dir = path.dirname(file)
  if (!fs.existsSync(dir)) {
    mkdir.mkdirsSync(dir)
  }

  fs.writeFileSync(file, '')
}

module.exports = {
  createFile: u(createFile),
  createFileSync
}
'use strict'

const file = require('./file')
const link = require('./link')
const symlink = require('./symlink')

module.exports = {
  // file
  createFile: file.createFile,
  createFileSync: file.createFileSync,
  ensureFile: file.createFile,
  ensureFileSync: file.createFileSync,
  // link
  createLink: link.createLink,
  createLinkSync: link.createLinkSync,
  ensureLink: link.createLink,
  ensureLinkSync: link.createLinkSync,
  // symlink
  createSymlink: symlink.createSymlink,
  createSymlinkSync: symlink.createSymlinkSync,
  ensureSymlink: symlink.createSymlink,
  ensureSymlinkSync: symlink.createSymlinkSync
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function createLink (srcpath, dstpath, callback) {
  function makeLink (srcpath, dstpath) {
    fs.link(srcpath, dstpath, err => {
      if (err) return callback(err)
      callback(null)
    })
  }

  pathExists(dstpath, (err, destinationExists) => {
    if (err) return callback(err)
    if (destinationExists) return callback(null)
    fs.lstat(srcpath, (err, stat) => {
      if (err) {
        err.message = err.message.replace('lstat', 'ensureLink')
        return callback(err)
      }

      const dir = path.dirname(dstpath)
      pathExists(dir, (err, dirExists) => {
        if (err) return callback(err)
        if (dirExists) return makeLink(srcpath, dstpath)
        mkdir.mkdirs(dir, err => {
          if (err) return callback(err)
          makeLink(srcpath, dstpath)
        })
      })
    })
  })
}

function createLinkSync (srcpath, dstpath, callback) {
  const destinationExists = fs.existsSync(dstpath)
  if (destinationExists) return undefined

  try {
    fs.lstatSync(srcpath)
  } catch (err) {
    err.message = err.message.replace('lstat', 'ensureLink')
    throw err
  }

  const dir = path.dirname(dstpath)
  const dirExists = fs.existsSync(dir)
  if (dirExists) return fs.linkSync(srcpath, dstpath)
  mkdir.mkdirsSync(dir)

  return fs.linkSync(srcpath, dstpath)
}

module.exports = {
  createLink: u(createLink),
  createLinkSync
}
'use strict'

const path = require('path')
const fs = require('graceful-fs')
const pathExists = require('../path-exists').pathExists

/**
 * Function that returns two types of paths, one relative to symlink, and one
 * relative to the current working directory. Checks if path is absolute or
 * relative. If the path is relative, this function checks if the path is
 * relative to symlink or relative to current working directory. This is an
 * initiative to find a smarter `srcpath` to supply when building symlinks.
 * This allows you to determine which path to use out of one of three possible
 * types of source paths. The first is an absolute path. This is detected by
 * `path.isAbsolute()`. When an absolute path is provided, it is checked to
 * see if it exists. If it does it's used, if not an error is returned
 * (callback)/ thrown (sync). The other two options for `srcpath` are a
 * relative url. By default Node's `fs.symlink` works by creating a symlink
 * using `dstpath` and expects the `srcpath` to be relative to the newly
 * created symlink. If you provide a `srcpath` that does not exist on the file
 * system it results in a broken symlink. To minimize this, the function
 * checks to see if the 'relative to symlink' source file exists, and if it
 * does it will use it. If it does not, it checks if there's a file that
 * exists that is relative to the current working directory, if does its used.
 * This preserves the expectations of the original fs.symlink spec and adds
 * the ability to pass in `relative to current working direcotry` paths.
 */

function symlinkPaths (srcpath, dstpath, callback) {
  if (path.isAbsolute(srcpath)) {
    return fs.lstat(srcpath, (err, stat) => {
      if (err) {
        err.message = err.message.replace('lstat', 'ensureSymlink')
        return callback(err)
      }
      return callback(null, {
        'toCwd': srcpath,
        'toDst': srcpath
      })
    })
  } else {
    const dstdir = path.dirname(dstpath)
    const relativeToDst = path.join(dstdir, srcpath)
    return pathExists(relativeToDst, (err, exists) => {
      if (err) return callback(err)
      if (exists) {
        return callback(null, {
          'toCwd': relativeToDst,
          'toDst': srcpath
        })
      } else {
        return fs.lstat(srcpath, (err, stat) => {
          if (err) {
            err.message = err.message.replace('lstat', 'ensureSymlink')
            return callback(err)
          }
          return callback(null, {
            'toCwd': srcpath,
            'toDst': path.relative(dstdir, srcpath)
          })
        })
      }
    })
  }
}

function symlinkPathsSync (srcpath, dstpath) {
  let exists
  if (path.isAbsolute(srcpath)) {
    exists = fs.existsSync(srcpath)
    if (!exists) throw new Error('absolute srcpath does not exist')
    return {
      'toCwd': srcpath,
      'toDst': srcpath
    }
  } else {
    const dstdir = path.dirname(dstpath)
    const relativeToDst = path.join(dstdir, srcpath)
    exists = fs.existsSync(relativeToDst)
    if (exists) {
      return {
        'toCwd': relativeToDst,
        'toDst': srcpath
      }
    } else {
      exists = fs.existsSync(srcpath)
      if (!exists) throw new Error('relative srcpath does not exist')
      return {
        'toCwd': srcpath,
        'toDst': path.relative(dstdir, srcpath)
      }
    }
  }
}

module.exports = {
  symlinkPaths,
  symlinkPathsSync
}
'use strict'

const fs = require('graceful-fs')

function symlinkType (srcpath, type, callback) {
  callback = (typeof type === 'function') ? type : callback
  type = (typeof type === 'function') ? false : type
  if (type) return callback(null, type)
  fs.lstat(srcpath, (err, stats) => {
    if (err) return callback(null, 'file')
    type = (stats && stats.isDirectory()) ? 'dir' : 'file'
    callback(null, type)
  })
}

function symlinkTypeSync (srcpath, type) {
  let stats

  if (type) return type
  try {
    stats = fs.lstatSync(srcpath)
  } catch (e) {
    return 'file'
  }
  return (stats && stats.isDirectory()) ? 'dir' : 'file'
}

module.exports = {
  symlinkType,
  symlinkTypeSync
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const _mkdirs = require('../mkdirs')
const mkdirs = _mkdirs.mkdirs
const mkdirsSync = _mkdirs.mkdirsSync

const _symlinkPaths = require('./symlink-paths')
const symlinkPaths = _symlinkPaths.symlinkPaths
const symlinkPathsSync = _symlinkPaths.symlinkPathsSync

const _symlinkType = require('./symlink-type')
const symlinkType = _symlinkType.symlinkType
const symlinkTypeSync = _symlinkType.symlinkTypeSync

const pathExists = require('../path-exists').pathExists

function createSymlink (srcpath, dstpath, type, callback) {
  callback = (typeof type === 'function') ? type : callback
  type = (typeof type === 'function') ? false : type

  pathExists(dstpath, (err, destinationExists) => {
    if (err) return callback(err)
    if (destinationExists) return callback(null)
    symlinkPaths(srcpath, dstpath, (err, relative) => {
      if (err) return callback(err)
      srcpath = relative.toDst
      symlinkType(relative.toCwd, type, (err, type) => {
        if (err) return callback(err)
        const dir = path.dirname(dstpath)
        pathExists(dir, (err, dirExists) => {
          if (err) return callback(err)
          if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
          mkdirs(dir, err => {
            if (err) return callback(err)
            fs.symlink(srcpath, dstpath, type, callback)
          })
        })
      })
    })
  })
}

function createSymlinkSync (srcpath, dstpath, type, callback) {
  callback = (typeof type === 'function') ? type : callback
  type = (typeof type === 'function') ? false : type

  const destinationExists = fs.existsSync(dstpath)
  if (destinationExists) return undefined

  const relative = symlinkPathsSync(srcpath, dstpath)
  srcpath = relative.toDst
  type = symlinkTypeSync(relative.toCwd, type)
  const dir = path.dirname(dstpath)
  const exists = fs.existsSync(dir)
  if (exists) return fs.symlinkSync(srcpath, dstpath, type)
  mkdirsSync(dir)
  return fs.symlinkSync(srcpath, dstpath, type)
}

module.exports = {
  createSymlink: u(createSymlink),
  createSymlinkSync
}
'use strict'

const u = require('universalify').fromCallback
const fs = require('fs')
const path = require('path')
const mkdir = require('../mkdirs')
const remove = require('../remove')

const emptyDir = u(function emptyDir (dir, callback) {
  callback = callback || function () {}
  fs.readdir(dir, (err, items) => {
    if (err) return mkdir.mkdirs(dir, callback)

    items = items.map(item => path.join(dir, item))

    deleteItem()

    function deleteItem () {
      const item = items.pop()
      if (!item) return callback()
      remove.remove(item, err => {
        if (err) return callback(err)
        deleteItem()
      })
    }
  })
})

function emptyDirSync (dir) {
  let items
  try {
    items = fs.readdirSync(dir)
  } catch (err) {
    return mkdir.mkdirsSync(dir)
  }

  items.forEach(item => {
    item = path.join(dir, item)
    remove.removeSync(item)
  })
}

module.exports = {
  emptyDirSync,
  emptydirSync: emptyDirSync,
  emptyDir,
  emptydir: emptyDir
}
'use strict'

const fs = require('graceful-fs')

const BUF_LENGTH = 64 * 1024
const _buff = require('../util/buffer')(BUF_LENGTH)

function copyFileSync (srcFile, destFile, options) {
  const overwrite = options.overwrite
  const errorOnExist = options.errorOnExist
  const preserveTimestamps = options.preserveTimestamps

  if (fs.existsSync(destFile)) {
    if (overwrite) {
      fs.unlinkSync(destFile)
    } else if (errorOnExist) {
      throw new Error(`${destFile} already exists`)
    } else return
  }

  const fdr = fs.openSync(srcFile, 'r')
  const stat = fs.fstatSync(fdr)
  const fdw = fs.openSync(destFile, 'w', stat.mode)
  let bytesRead = 1
  let pos = 0

  while (bytesRead > 0) {
    bytesRead = fs.readSync(fdr, _buff, 0, BUF_LENGTH, pos)
    fs.writeSync(fdw, _buff, 0, bytesRead)
    pos += bytesRead
  }

  if (preserveTimestamps) {
    fs.futimesSync(fdw, stat.atime, stat.mtime)
  }

  fs.closeSync(fdr)
  fs.closeSync(fdw)
}

module.exports = copyFileSync
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const copyFileSync = require('./copy-file-sync')
const mkdir = require('../mkdirs')

function copySync (src, dest, options) {
  if (typeof options === 'function' || options instanceof RegExp) {
    options = {filter: options}
  }

  options = options || {}
  options.recursive = !!options.recursive

  // default to true for now
  options.clobber = 'clobber' in options ? !!options.clobber : true
  // overwrite falls back to clobber
  options.overwrite = 'overwrite' in options ? !!options.overwrite : options.clobber
  options.dereference = 'dereference' in options ? !!options.dereference : false
  options.preserveTimestamps = 'preserveTimestamps' in options ? !!options.preserveTimestamps : false

  options.filter = options.filter || function () { return true }

  // Warn about using preserveTimestamps on 32-bit node:
  if (options.preserveTimestamps && process.arch === 'ia32') {
    console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
    see https://github.com/jprichardson/node-fs-extra/issues/269`)
  }

  const stats = (options.recursive && !options.dereference) ? fs.lstatSync(src) : fs.statSync(src)
  const destFolder = path.dirname(dest)
  const destFolderExists = fs.existsSync(destFolder)
  let performCopy = false

  if (options.filter instanceof RegExp) {
    console.warn('Warning: fs-extra: Passing a RegExp filter is deprecated, use a function')
    performCopy = options.filter.test(src)
  } else if (typeof options.filter === 'function') performCopy = options.filter(src, dest)

  if (stats.isFile() && performCopy) {
    if (!destFolderExists) mkdir.mkdirsSync(destFolder)
    copyFileSync(src, dest, {
      overwrite: options.overwrite,
      errorOnExist: options.errorOnExist,
      preserveTimestamps: options.preserveTimestamps
    })
  } else if (stats.isDirectory() && performCopy) {
    if (!fs.existsSync(dest)) mkdir.mkdirsSync(dest)
    const contents = fs.readdirSync(src)
    contents.forEach(content => {
      const opts = options
      opts.recursive = true
      copySync(path.join(src, content), path.join(dest, content), opts)
    })
  } else if (options.recursive && stats.isSymbolicLink() && performCopy) {
    const srcPath = fs.readlinkSync(src)
    fs.symlinkSync(srcPath, dest)
  }
}

module.exports = copySync
module.exports = {
  copySync: require('./copy-sync')
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const ncp = require('./ncp')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function copy (src, dest, options, callback) {
  if (typeof options === 'function' && !callback) {
    callback = options
    options = {}
  } else if (typeof options === 'function' || options instanceof RegExp) {
    options = {filter: options}
  }
  callback = callback || function () {}
  options = options || {}

  // Warn about using preserveTimestamps on 32-bit node:
  if (options.preserveTimestamps && process.arch === 'ia32') {
    console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
    see https://github.com/jprichardson/node-fs-extra/issues/269`)
  }

  // don't allow src and dest to be the same
  const basePath = process.cwd()
  const currentPath = path.resolve(basePath, src)
  const targetPath = path.resolve(basePath, dest)
  if (currentPath === targetPath) return callback(new Error('Source and destination must not be the same.'))

  fs.lstat(src, (err, stats) => {
    if (err) return callback(err)

    let dir = null
    if (stats.isDirectory()) {
      const parts = dest.split(path.sep)
      parts.pop()
      dir = parts.join(path.sep)
    } else {
      dir = path.dirname(dest)
    }

    pathExists(dir, (err, dirExists) => {
      if (err) return callback(err)
      if (dirExists) return ncp(src, dest, options, callback)
      mkdir.mkdirs(dir, err => {
        if (err) return callback(err)
        ncp(src, dest, options, callback)
      })
    })
  })
}

module.exports = copy
const u = require('universalify').fromCallback
module.exports = {
  copy: u(require('./copy'))
}
// imported from ncp (this is temporary, will rewrite)

var fs = require('graceful-fs')
var path = require('path')
var utimes = require('../util/utimes')

function ncp (source, dest, options, callback) {
  if (!callback) {
    callback = options
    options = {}
  }

  var basePath = process.cwd()
  var currentPath = path.resolve(basePath, source)
  var targetPath = path.resolve(basePath, dest)

  var filter = options.filter
  var transform = options.transform
  var overwrite = options.overwrite
  // If overwrite is undefined, use clobber, otherwise default to true:
  if (overwrite === undefined) overwrite = options.clobber
  if (overwrite === undefined) overwrite = true
  var errorOnExist = options.errorOnExist
  var dereference = options.dereference
  var preserveTimestamps = options.preserveTimestamps === true

  var started = 0
  var finished = 0
  var running = 0

  var errored = false

  startCopy(currentPath)

  function startCopy (source) {
    started++
    if (filter) {
      if (filter instanceof RegExp) {
        console.warn('Warning: fs-extra: Passing a RegExp filter is deprecated, use a function')
        if (!filter.test(source)) {
          return doneOne(true)
        }
      } else if (typeof filter === 'function') {
        if (!filter(source, dest)) {
          return doneOne(true)
        }
      }
    }
    return getStats(source)
  }

  function getStats (source) {
    var stat = dereference ? fs.stat : fs.lstat
    running++
    stat(source, function (err, stats) {
      if (err) return onError(err)

      // We need to get the mode from the stats object and preserve it.
      var item = {
        name: source,
        mode: stats.mode,
        mtime: stats.mtime, // modified time
        atime: stats.atime, // access time
        stats: stats // temporary
      }

      if (stats.isDirectory()) {
        return onDir(item)
      } else if (stats.isFile() || stats.isCharacterDevice() || stats.isBlockDevice()) {
        return onFile(item)
      } else if (stats.isSymbolicLink()) {
        // Symlinks don't really need to know about the mode.
        return onLink(source)
      }
    })
  }

  function onFile (file) {
    var target = file.name.replace(currentPath, targetPath.replace('$', '$$$$')) // escapes '$' with '$$'
    isWritable(target, function (writable) {
      if (writable) {
        copyFile(file, target)
      } else {
        if (overwrite) {
          rmFile(target, function () {
            copyFile(file, target)
          })
        } else if (errorOnExist) {
          onError(new Error(target + ' already exists'))
        } else {
          doneOne()
        }
      }
    })
  }

  function copyFile (file, target) {
    var readStream = fs.createReadStream(file.name)
    var writeStream = fs.createWriteStream(target, { mode: file.mode })

    readStream.on('error', onError)
    writeStream.on('error', onError)

    if (transform) {
      transform(readStream, writeStream, file)
    } else {
      writeStream.on('open', function () {
        readStream.pipe(writeStream)
      })
    }

    writeStream.once('close', function () {
      fs.chmod(target, file.mode, function (err) {
        if (err) return onError(err)
        if (preserveTimestamps) {
          utimes.utimesMillis(target, file.atime, file.mtime, function (err) {
            if (err) return onError(err)
            return doneOne()
          })
        } else {
          doneOne()
        }
      })
    })
  }

  function rmFile (file, done) {
    fs.unlink(file, function (err) {
      if (err) return onError(err)
      return done()
    })
  }

  function onDir (dir) {
    var target = dir.name.replace(currentPath, targetPath.replace('$', '$$$$')) // escapes '$' with '$$'
    isWritable(target, function (writable) {
      if (writable) {
        return mkDir(dir, target)
      }
      copyDir(dir.name)
    })
  }

  function mkDir (dir, target) {
    fs.mkdir(target, dir.mode, function (err) {
      if (err) return onError(err)
      // despite setting mode in fs.mkdir, doesn't seem to work
      // so we set it here.
      fs.chmod(target, dir.mode, function (err) {
        if (err) return onError(err)
        copyDir(dir.name)
      })
    })
  }

  function copyDir (dir) {
    fs.readdir(dir, function (err, items) {
      if (err) return onError(err)
      items.forEach(function (item) {
        startCopy(path.join(dir, item))
      })
      return doneOne()
    })
  }

  function onLink (link) {
    var target = link.replace(currentPath, targetPath)
    fs.readlink(link, function (err, resolvedPath) {
      if (err) return onError(err)
      checkLink(resolvedPath, target)
    })
  }

  function checkLink (resolvedPath, target) {
    if (dereference) {
      resolvedPath = path.resolve(basePath, resolvedPath)
    }
    isWritable(target, function (writable) {
      if (writable) {
        return makeLink(resolvedPath, target)
      }
      fs.readlink(target, function (err, targetDest) {
        if (err) return onError(err)

        if (dereference) {
          targetDest = path.resolve(basePath, targetDest)
        }
        if (targetDest === resolvedPath) {
          return doneOne()
        }
        return rmFile(target, function () {
          makeLink(resolvedPath, target)
        })
      })
    })
  }

  function makeLink (linkPath, target) {
    fs.symlink(linkPath, target, function (err) {
      if (err) return onError(err)
      return doneOne()
    })
  }

  function isWritable (path, done) {
    fs.lstat(path, function (err) {
      if (err) {
        if (err.code === 'ENOENT') return done(true)
        return done(false)
      }
      return done(false)
    })
  }

  function onError (err) {
    // ensure callback is defined & called only once:
    if (!errored && callback !== undefined) {
      errored = true
      return callback(err)
    }
  }

  function doneOne (skipped) {
    if (!skipped) running--
    finished++
    if ((started === finished) && (running === 0)) {
      if (callback !== undefined) {
        return callback(null)
      }
    }
  }
}

module.exports = ncp
# copySync(src, dest, [options])

Copy a file or directory. The directory can have contents. Like `cp -r`.

- `src` `<String>`
- `dest` `<String>`
- `options` `<Object>`
  - `overwrite` `<boolean>`: overwrite existing file or directory, default is `true`. _Note that the copy operation will silently fail if you set this to `false` and the destination exists._ Use the `errorOnExist` option to change this behavior.
  - `errorOnExist` `<boolean>`: when `overwrite` is `false` and the destination exists, throw an error. Default is `false`.
  - `dereference` `<boolean>`: dereference symlinks, default is `false`.
  - `preserveTimestamps` `<boolean>`: will set last modification and access times to the ones of the original source files, default is `false`.
  - `filter` `<Function>`: Function to filter copied files. Return `true` to include, `false` to exclude. This can also be a RegExp, however this is deprecated (See [issue #239](https://github.com/jprichardson/node-fs-extra/issues/239) for background).

## Example:

```js
const fs = require('fs-extra')

// copy file
fs.copySync('/tmp/myfile', '/tmp/mynewfile')

// copy directory, even if it has subdirectories or files
fs.copySync('/tmp/mydir', '/tmp/mynewdir')
```

**Using filter function**

```js
const fs = require('fs-extra')

const filterFunc = (src, dest) => {
  // your logic here
  // it will be copied if return true
}

fs.copySync('/tmp/mydir', '/tmp/mynewdir', { filter: filterFunc })
```
# copy(src, dest, [options, callback])

Copy a file or directory. The directory can have contents. Like `cp -r`.

- `src` `<String>`
- `dest` `<String>` Note that if `src` is a file, `dest` cannot be a directory (see [issue #323](https://github.com/jprichardson/node-fs-extra/issues/323)).
- `options` `<Object>`
  - `overwrite` `<boolean>`: overwrite existing file or directory, default is `true`. _Note that the copy operation will silently fail if you set this to `false` and the destination exists._ Use the `errorOnExist` option to change this behavior.
  - `errorOnExist` `<boolean>`: when `overwrite` is `false` and the destination exists, throw an error. Default is `false`.
  - `dereference` `<boolean>`: dereference symlinks, default is `false`.
  - `preserveTimestamps` `<boolean>`: will set last modification and access times to the ones of the original source files, default is `false`.
  - `filter` `<Function>`: Function to filter copied files. Return `true` to include, `false` to exclude. This can also be a RegExp, however this is deprecated (See [issue #239](https://github.com/jprichardson/node-fs-extra/issues/239) for background).
- `callback` `<Function>`

## Example:

```js
const fs = require('fs-extra')

fs.copy('/tmp/myfile', '/tmp/mynewfile', err => {
  if (err) return console.error(err)

  console.log('success!')
}) // copies file

fs.copy('/tmp/mydir', '/tmp/mynewdir', err => {
  if (err) return console.error(err)

  console.log('success!')
}) // copies directory, even if it has subdirectories or files

// Promise usage:
fs.copy('/tmp/myfile', '/tmp/mynewfile')
.then(() => {
  console.log('success!')
})
.catch(err => {
  console.error(err)
})
```

**Using filter function**

```js
const fs = require('fs-extra')

const filterFunc = (src, dest) => {
  // your logic here
  // it will be copied if return true
}

fs.copy('/tmp/mydir', '/tmp/mynewdir', { filter: filterFunc }, err => {
  if (err) return console.error(err)

  console.log('success!')
})
```
# emptyDirSync(dir)

Ensures that a directory is empty. Deletes directory contents if the directory is not empty. If the directory does not exist, it is created. The directory itself is not deleted.

**Alias:** `emptydirSync()`

- `dir` `<String>`

## Example:

```js
const fs = require('fs-extra')

// assume this directory has a lot of files and folders
fs.emptyDirSync('/tmp/some/dir')
```
# emptyDir(dir, [callback])

Ensures that a directory is empty. Deletes directory contents if the directory is not empty. If the directory does not exist, it is created. The directory itself is not deleted.

**Alias:** `emptydir()`

- `dir` `<String>`
- `callback` `<Function>`

## Example:

```js
const fs = require('fs-extra')

// assume this directory has a lot of files and folders
fs.emptyDir('/tmp/some/dir', err => {
  if (err) return console.error(err)

  console.log('success!')
})

// With promises
fs.emptyDir('/tmp/some/dir')
.then(() => {
  console.log('success!')
})
.catch(err => {
  console.error(err)
})
```
# ensureDirSync(dir)

Ensures that the directory exists. If the directory structure does not exist, it is created. Like `mkdir -p`.

**Aliases:** `mkdirsSync()`, `mkdirpSync()`

- `dir` `<String>`

## Example:

```js
const fs = require('fs-extra')

const dir = '/tmp/this/path/does/not/exist'
fs.ensureDirSync(dir)
// dir has now been created, including the directory it is to be placed in
```
# ensureDir(dir, [callback])

Ensures that the directory exists. If the directory structure does not exist, it is created. Like `mkdir -p`.

**Aliases:** `mkdirs()`, `mkdirp()`

- `dir` `<String>`
- `callback` `<Function>`

## Example:

```js
const fs = require('fs-extra')

const dir = '/tmp/this/path/does/not/exist'
fs.ensureDir(dir, err => {
  console.log(err) // => null
  // dir has now been created, including the directory it is to be placed in
})

// With Promises:
fs.ensureDir(dir)
.then(() => {
  console.log('success!')
})
.catch(err => {
  console.error(err)
})
```
# ensureFileSync(file)

Ensures that the file exists. If the file that is requested to be created is in directories that do not exist, these directories are created. If the file already exists, it is **NOT MODIFIED**.

**Alias:** `createFileSync()`

- `file` `<String>`

## Example:

```js
const fs = require('fs-extra')

const file = '/tmp/this/path/does/not/exist/file.txt'
fs.ensureFileSync(file)
// file has now been created, including the directory it is to be placed in
```
# ensureFile(file, [callback])

Ensures that the file exists. If the file that is requested to be created is in directories that do not exist, these directories are created. If the file already exists, it is **NOT MODIFIED**.

**Alias:** `createFile()`

- `file` `<String>`
- `callback` `<Function>`

## Example:

```js
const fs = require('fs-extra')

const file = '/tmp/this/path/does/not/exist/file.txt'
fs.ensureFile(file, err => {
  console.log(err) // => null
  // file has now been created, including the directory it is to be placed in
})

// With Promises:
fs.ensureFile(file)
.then(() => {
  console.log('success!')
})
.catch(err => {
  console.error(err)
})
```
# ensureLinkSync(srcpath, dstpath)

Ensures that the link exists. If the directory structure does not exist, it is created.

- `srcpath` `<String>`
- `dstpath` `<String>`

## Example:

```js
const fs = require('fs-extra')

const srcpath = '/tmp/file.txt'
const dstpath = '/tmp/this/path/does/not/exist/file.txt'
fs.ensureLinkSync(srcpath, dstpath)
// link has now been created, including the directory it is to be placed in
```
# ensureLink(srcpath, dstpath, [callback])

Ensures that the link exists. If the directory structure does not exist, it is created.

- `srcpath` `<String>`
- `dstpath` `<String>`
- `callback` `<Function>`

## Example:

```js
const fs = require('fs-extra')

const srcpath = '/tmp/file.txt'
const dstpath = '/tmp/this/path/does/not/exist/file.txt'
fs.ensureLink(srcpath, dstpath, err => {
  console.log(err) // => null
  // link has now been created, including the directory it is to be placed in
})

// With Promises:
fs.ensureLink(srcpath, dstpath)
.then(() => {
  console.log('success!')
})
.catch(err => {
  console.error(err)
})
```
# ensureSymlinkSync(srcpath, dstpath, [type])

Ensures that the symlink exists. If the directory structure does not exist, it is created.

- `srcpath` `<String>`
- `dstpath` `<String>`
- `type` `<String>`

## Example:

```js
const fs = require('fs-extra')

const srcpath = '/tmp/file.txt'
const dstpath = '/tmp/this/path/does/not/exist/file.txt'
fs.ensureSymlinkSync(srcpath, dstpath)
// symlink has now been created, including the directory it is to be placed in
```
# ensureSymlink(srcpath, dstpath, [type, callback])

Ensures that the symlink exists. If the directory structure does not exist, it is created.

- `srcpath` `<String>`
- `dstpath` `<String>`
- `type` `<String>`
- `callback` `<Function>`

## Example:

```js
const fs = require('fs-extra')

const srcpath = '/tmp/file.txt'
const dstpath = '/tmp/this/path/does/not/exist/file.txt'
fs.ensureSymlink(srcpath, dstpath, err => {
  console.log(err) // => null
  // symlink has now been created, including the directory it is to be placed in
})

// With Promises:
fs.ensureSymlink(srcpath, dstpath)
.then(() => {
  console.log('success!')
})
.catch(err => {
  console.error(err)
})
```
# About `fs.read()` & `fs.write()`

[`fs.read()`](https://nodejs.org/api/fs.html#fs_fs_read_fd_buffer_offset_length_position_callback) & [`fs.write()`](https://nodejs.org/api/fs.html#fs_fs_write_fd_buffer_offset_length_position_callback) are different from other `fs` methods in that their callbacks are called with 3 arguments instead of the usual 2 arguments.

If you're using them with callbacks, they will behave as usual. However, their promise usage is a little different. `fs-extra` promisifies these methods like [`util.promisify()`](https://nodejs.org/api/util.html#util_util_promisify_original) (only available in Node 8+) does.

Here's the example promise usage:

## `fs.read()`

```js
// Basic promises
fs.read(fd, buffer, offset, length, position)
  .then(results => {
    console.log(results)
    // { bytesRead: 20, buffer: <Buffer 0f 34 5d ...> }
  })

// Async/await usage:
async function example () {
  const { bytesRead, buffer } = await fs.read(fd, Buffer.alloc(length), offset, length, position)
}
```

## `fs.write()`

```js
// Basic promises
fs.write(fd, buffer, offset, length, position)
  .then(results => {
    console.log(results)
    // { bytesWritten: 20, buffer: <Buffer 0f 34 5d ...> }
  })

// Async/await usage:
async function example () {
  const { bytesWritten, buffer } = await fs.write(fd, Buffer.alloc(length), offset, length, position)
}
```
# moveSync(src, dest, [options])

Moves a file or directory, even across devices.

- `src` `<String>`
- `dest` `<String>`
- `options` `<Object>`
  - `overwrite` `<boolean>`: overwrite existing file or directory, default is `false`.

## Example:

```js
const fs = require('fs-extra')

fs.moveSync('/tmp/somefile', '/tmp/does/not/exist/yet/somefile')
```

**Using `overwrite` option**

```js
const fs = require('fs-extra')

fs.moveSync('/tmp/somedir', '/tmp/may/already/existed/somedir', { overwrite: true })
```
# move(src, dest, [options, callback])

Moves a file or directory, even across devices.

- `src` `<String>`
- `dest` `<String>`
- `options` `<Object>`
  - `overwrite` `<boolean>`: overwrite existing file or directory, default is `false`.
- `callback` `<Function>`

## Example:

```js
const fs = require('fs-extra')

fs.move('/tmp/somefile', '/tmp/does/not/exist/yet/somefile', err => {
  if (err) return console.error(err)

  console.log('success!')
})

fs.move('/tmp/somefile', '/tmp/does/not/exist/yet/somefile')
.then(() => {
  console.log('success!')
})
.catch(err => {
  console.error(err)
})
```

**Using `overwrite` option**

```js
const fs = require('fs-extra')

fs.move('/tmp/somedir', '/tmp/may/already/existed/somedir', { overwrite: true }, err => {
  if (err) return console.error(err)

  console.log('success!')
})
```
# outputFileSync(file, data, [options])

Almost the same as `writeFileSync` (i.e. it [overwrites](http://pages.citebite.com/v2o5n8l2f5reb)), except that if the parent directory does not exist, it's created. `file` must be a file path (a buffer or a file descriptor is not allowed). `options` are what you'd pass to [`fs.writeFileSync()`](https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options).

- `file` `<String>`
- `data` `<String> | <Buffer> | <Uint8Array>`
- `options` `<Object> | <String>`

## Example:

```js
const fs = require('fs-extra')

const file = '/tmp/this/path/does/not/exist/file.txt'
fs.outputFileSync(file, 'hello!')

const data = fs.readFileSync(file, 'utf8')
console.log(data) // => hello!
```
# outputFile(file, data, [options, callback])

Almost the same as `writeFile` (i.e. it [overwrites](http://pages.citebite.com/v2o5n8l2f5reb)), except that if the parent directory does not exist, it's created. `file` must be a file path (a buffer or a file descriptor is not allowed). `options` are what you'd pass to [`fs.writeFile()`](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback).

- `file` `<String>`
- `data` `<String> | <Buffer> | <Uint8Array>`
- `options` `<Object> | <String>`
- `callback` `<Function>`

## Example:

```js
const fs = require('fs-extra')

const file = '/tmp/this/path/does/not/exist/file.txt'
fs.outputFile(file, 'hello!', err => {
  console.log(err) // => null

  fs.readFile(file, 'utf8', (err, data) => {
    if (err) return console.error(err)
    console.log(data) // => hello!
  })
})

// With Promises:
fs.outputFile(file, 'hello!')
.then(() => fs.readFile(file, 'utf8'))
.then(data => {
  console.log(data) // => hello!
})
.catch(err => {
  console.error(err)
})
```
# outputJsonSync(file, object, [options])

Almost the same as [`writeJsonSync`](writeJson-sync.md), except that if the directory does not exist, it's created.

**Alias:** `outputJSONSync()`

- `file` `<String>`
- `object` `<Object>`
- `options` `<Object>`
  - `spaces` `<Number|String>` Number of spaces to indent; or a string to use for indentation (i.e. pass `'\t'` for tab indentation). See [the docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_space_argument) for more info.
  - `EOL` `<String>` Set EOL character. Default is `\n`.
  - `replacer` [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_replacer_parameter)
  - Also accepts [`fs.writeFileSync` options](https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options)

## Example:

```js
const fs = require('fs-extra')

const file = '/tmp/this/path/does/not/exist/file.json'
fs.outputJsonSync(file, {name: 'JP'})

const data = fs.readJsonSync(file)
console.log(data.name) // => JP
```
# outputJson(file, object, [options, callback])

Almost the same as [`writeJson`](writeJson.md), except that if the directory does not exist, it's created.

**Alias:** `outputJSON()`

- `file` `<String>`
- `object` `<Object>`
- `options` `<Object>`
  - `spaces` `<Number|String>` Number of spaces to indent; or a string to use for indentation (i.e. pass `'\t'` for tab indentation). See [the docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_space_argument) for more info.
  - `EOL` `<String>` Set EOL character. Default is `\n`.
  - `replacer` [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_replacer_parameter)
  - Also accepts [`fs.writeFile` options](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback)
- `callback` `<Function>`

## Example:

```js
const fs = require('fs-extra')

const file = '/tmp/this/path/does/not/exist/file.json'
fs.outputJson(file, {name: 'JP'}, err => {
  console.log(err) // => null

  fs.readJson(file, (err, data) => {
    if (err) return console.error(err)
    console.log(data.name) // => JP
  })
})

// With Promises:
fs.outputJson(file, {name: 'JP'})
.then(() => fs.readJson(file))
.then(data => {
  console.log(data.name) // => JP
})
.catch(err => {
  console.error(err)
})
```
# pathExistsSync(file)

An alias for [`fs.existsSync()`](https://nodejs.org/api/fs.html#fs_fs_existssync_path), created for consistency with [`pathExists()`](pathExists.md).
# pathExists(file[, callback])

Test whether or not the given path exists by checking with the file system. Like [`fs.exists`](https://nodejs.org/api/fs.html#fs_fs_exists_path_callback), but with a normal callback signature (err, exists). Uses `fs.access` under the hood.

- `file` `<String>`
- `callback` `<Function>`

## Example:

```js
const fs = require('fs-extra')

const file = '/tmp/this/path/does/not/exist/file.txt'
// Promise usage:
fs.pathExists(file)
  .then(exists => console.log(exists)) // => false
// Callback usage:
fs.pathExists(file, (err, exists) => {
  console.log(err) // => null
  console.log(exists) // => false
})
```
# readJsonSync(file, [options])

Reads a JSON file and then parses it into an object. `options` are the same
that you'd pass to [`jsonFile.readFileSync`](https://github.com/jprichardson/node-jsonfile#readfilesyncfilename-options).

**Alias:** `readJSONSync()`

- `file` `<String>`
- `options` `<Object>`

## Example:

```js
const fs = require('fs-extra')

const packageObj = fs.readJsonSync('./package.json')
console.log(packageObj.version) // => 2.0.0
```

---

`readJsonSync()` can take a `throws` option set to `false` and it won't throw if the JSON is invalid. Example:

```js
const fs = require('fs-extra')

const file = '/tmp/some-invalid.json'
const data = '{not valid JSON'
fs.writeFileSync(file, data)

const obj = fs.readJsonSync(file, { throws: false })
console.log(obj) // => null
```
# readJson(file, [options, callback])

Reads a JSON file and then parses it into an object. `options` are the same
that you'd pass to [`jsonFile.readFile`](https://github.com/jprichardson/node-jsonfile#readfilefilename-options-callback).

**Alias:** `readJSON()`

- `file` `<String>`
- `options` `<Object>`
- `callback` `<Function>`

## Example:

```js
const fs = require('fs-extra')

fs.readJson('./package.json', (err, packageObj) => {
  if (err) console.error(err)

  console.log(packageObj.version) // => 0.1.3
})

// Promise Usage
fs.readJson('./package.json')
.then(packageObj => {
  console.log(packageObj.version) // => 0.1.3
})
.catch(err => {
  console.error(err)
})
```

---

`readJson()` can take a `throws` option set to `false` and it won't throw if the JSON is invalid. Example:

```js
const fs = require('fs-extra')

const file = '/tmp/some-invalid.json'
const data = '{not valid JSON'
fs.writeFileSync(file, data)

fs.readJson(file, { throws: false }, (err, obj) => {
  if (err) console.error(err)

  console.log(obj) // => null
})

// Promise Usage
fs.readJson(file, { throws: false })
.then(obj => {
  console.log(obj) // => null
})
.catch(err => {
  console.error(err) // Not called
})
```
# removeSync(path)

Removes a file or directory. The directory can have contents. Like `rm -rf`.

- `path` `<String>`

## Example:

```js
const fs = require('fs-extra')

// remove file
fs.removeSync('/tmp/myfile')

fs.removeSync('/home/jprichardson') // I just deleted my entire HOME directory.
```
# remove(path, [callback])

Removes a file or directory. The directory can have contents. Like `rm -rf`.

- `path` `<String>`
- `callback` `<Function>`

## Example:

```js
const fs = require('fs-extra')

// remove file
fs.remove('/tmp/myfile', err => {
  if (err) return console.error(err)

  console.log('success!')
})

fs.remove('/home/jprichardson', err => {
  if (err) return console.error(err)

  console.log('success!') // I just deleted my entire HOME directory.
})

// Promise Usage
fs.remove('/tmp/myfile')
.then(() => {
  console.log('success!')
})
.catch(err => {
  console.error(err)
})
```
# writeJsonSync(file, object, [options])

Writes an object to a JSON file.

**Alias:** `writeJSONSync()`

- `file` `<String>`
- `object` `<Object>`
- `options` `<Object>`
  - `spaces` `<Number|String>` Number of spaces to indent; or a string to use for indentation (i.e. pass `'\t'` for tab indentation). See [the docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_space_argument) for more info.
  - `EOL` `<String>` Set EOL character. Default is `\n`.
  - `replacer` [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_replacer_parameter)
  - Also accepts [`fs.writeFileSync` options](https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options)

## Example:

```js
const fs = require('fs-extra')

fs.writeJsonSync('./package.json', {name: 'fs-extra'})
```
---

**See also:** [`outputJsonSync()`](outputJson-sync.md)
# writeJson(file, object, [options, callback])

Writes an object to a JSON file.

**Alias:** `writeJSON()`

- `file` `<String>`
- `object` `<Object>`
- `options` `<Object>`
  - `spaces` `<Number|String>` Number of spaces to indent; or a string to use for indentation (i.e. pass `'\t'` for tab indentation). See [the docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_space_argument) for more info.
  - `EOL` `<String>` Set EOL character. Default is `\n`.
  - `replacer` [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_replacer_parameter)
  - Also accepts [`fs.writeFile` options](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback)
- `callback` `<Function>`

## Example:

```js
const fs = require('fs-extra')

fs.writeJson('./package.json', {name: 'fs-extra'}, err => {
  if (err) return console.error(err)

  console.log('success!')
})

// With Promises
fs.writeJson('./package.json', {name: 'fs-extra'})
.then(() => {
  console.log('success!')
})
.catch(err => {
  console.error(err)
})
```

---

**See also:** [`outputJson()`](outputJson.md)
(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the 'Software'), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial 
portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)

# BIN directory
BIN := $(THIS_DIR)/node_modules/.bin

# Path
PATH := node_modules/.bin:$(PATH)
SHELL := /bin/bash

# applications
NODE ?= $(shell which node)
YARN ?= $(shell which yarn)
PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
BROWSERIFY ?= $(NODE) $(BIN)/browserify

.FORCE:

install: node_modules

node_modules: package.json
	@NODE_ENV= $(PKG) install
	@touch node_modules

lint: .FORCE
	eslint browser.js debug.js index.js node.js

test-node: .FORCE
	istanbul cover node_modules/mocha/bin/_mocha -- test/**.js

test-browser: .FORCE
	mkdir -p dist

	@$(BROWSERIFY) \
		--standalone debug \
		. > dist/debug.js

	karma start --single-run
	rimraf dist

test: .FORCE
	concurrently \
		"make test-node" \
		"make test-browser"

coveralls:
	cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js

.PHONY: all install clean distclean
{
  "name": "debug",
  "repo": "visionmedia/debug",
  "description": "small debugging utility",
  "version": "2.6.9",
  "keywords": [
    "debug",
    "log",
    "debugger"
  ],
  "main": "src/browser.js",
  "scripts": [
    "src/browser.js",
    "src/debug.js"
  ],
  "dependencies": {
    "rauchg/ms.js": "0.7.1"
  }
}
module.exports = require('./src/node');
{
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "browser": "./src/browser.js",
  "component": {
    "scripts": {
      "debug/index.js": "browser.js",
      "debug/debug.js": "debug.js"
    }
  },
  "dependencies": {
    "ms": "2.0.0"
  },
  "deprecated": false,
  "description": "small debugging utility",
  "devDependencies": {
    "browserify": "9.0.3",
    "chai": "^3.5.0",
    "concurrently": "^3.1.0",
    "coveralls": "^2.11.15",
    "eslint": "^3.12.1",
    "istanbul": "^0.4.5",
    "karma": "^1.3.0",
    "karma-chai": "^0.1.0",
    "karma-mocha": "^1.3.0",
    "karma-phantomjs-launcher": "^1.0.2",
    "karma-sinon": "^1.0.5",
    "mocha": "^3.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "rimraf": "^2.5.4",
    "sinon": "^1.17.6",
    "sinon-chai": "^2.8.0"
  },
  "homepage": "https://github.com/visionmedia/debug#readme",
  "license": "MIT",
  "main": "./src/index.js",
  "name": "debug",
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "version": "2.6.9"
}/**
 * This is the web browser implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
               && 'undefined' != typeof chrome.storage
                  ? chrome.storage.local
                  : localstorage();

/**
 * Colors.
 */

exports.colors = [
  'lightseagreen',
  'forestgreen',
  'goldenrod',
  'dodgerblue',
  'darkorchid',
  'crimson'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

function useColors() {
  // NB: In an Electron preload script, document will be defined but not fully
  // initialized. Since we know we're in Chrome, we'll just detect this case
  // explicitly
  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
    return true;
  }

  // is webkit? http://stackoverflow.com/a/16459606/376773
  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
    // is firebug? http://stackoverflow.com/a/398120/376773
    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
    // is firefox >= v31?
    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
    // double check webkit in userAgent just in case we are in a worker
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

exports.formatters.j = function(v) {
  try {
    return JSON.stringify(v);
  } catch (err) {
    return '[UnexpectedJSONParseError]: ' + err.message;
  }
};


/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var useColors = this.useColors;

  args[0] = (useColors ? '%c' : '')
    + this.namespace
    + (useColors ? ' %c' : ' ')
    + args[0]
    + (useColors ? '%c ' : ' ')
    + '+' + exports.humanize(this.diff);

  if (!useColors) return;

  var c = 'color: ' + this.color;
  args.splice(1, 0, c, 'color: inherit')

  // the final "%c" is somewhat tricky, because there could be other
  // arguments passed either before or after the %c, so we need to
  // figure out the correct index to insert the CSS into
  var index = 0;
  var lastC = 0;
  args[0].replace(/%[a-zA-Z%]/g, function(match) {
    if ('%%' === match) return;
    index++;
    if ('%c' === match) {
      // we only are interested in the *last* %c
      // (the user may have provided their own)
      lastC = index;
    }
  });

  args.splice(lastC, 0, c);
}

/**
 * Invokes `console.log()` when available.
 * No-op when `console.log` is not a "function".
 *
 * @api public
 */

function log() {
  // this hackery is required for IE8/9, where
  // the `console.log` function doesn't have 'apply'
  return 'object' === typeof console
    && console.log
    && Function.prototype.apply.call(console.log, console, arguments);
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  try {
    if (null == namespaces) {
      exports.storage.removeItem('debug');
    } else {
      exports.storage.debug = namespaces;
    }
  } catch(e) {}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  var r;
  try {
    r = exports.storage.debug;
  } catch(e) {}

  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
  if (!r && typeof process !== 'undefined' && 'env' in process) {
    r = process.env.DEBUG;
  }

  return r;
}

/**
 * Enable namespaces listed in `localStorage.debug` initially.
 */

exports.enable(load());

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
  try {
    return window.localStorage;
  } catch (e) {}
}

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
exports.coerce = coerce;
exports.disable = disable;
exports.enable = enable;
exports.enabled = enabled;
exports.humanize = require('ms');

/**
 * The currently active debug mode names, and names to skip.
 */

exports.names = [];
exports.skips = [];

/**
 * Map of special "%n" handling functions, for the debug "format" argument.
 *
 * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
 */

exports.formatters = {};

/**
 * Previous log timestamp.
 */

var prevTime;

/**
 * Select a color.
 * @param {String} namespace
 * @return {Number}
 * @api private
 */

function selectColor(namespace) {
  var hash = 0, i;

  for (i in namespace) {
    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
    hash |= 0; // Convert to 32bit integer
  }

  return exports.colors[Math.abs(hash) % exports.colors.length];
}

/**
 * Create a debugger with the given `namespace`.
 *
 * @param {String} namespace
 * @return {Function}
 * @api public
 */

function createDebug(namespace) {

  function debug() {
    // disabled?
    if (!debug.enabled) return;

    var self = debug;

    // set `diff` timestamp
    var curr = +new Date();
    var ms = curr - (prevTime || curr);
    self.diff = ms;
    self.prev = prevTime;
    self.curr = curr;
    prevTime = curr;

    // turn the `arguments` into a proper Array
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }

    args[0] = exports.coerce(args[0]);

    if ('string' !== typeof args[0]) {
      // anything else let's inspect with %O
      args.unshift('%O');
    }

    // apply any `formatters` transformations
    var index = 0;
    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
      // if we encounter an escaped % then don't increase the array index
      if (match === '%%') return match;
      index++;
      var formatter = exports.formatters[format];
      if ('function' === typeof formatter) {
        var val = args[index];
        match = formatter.call(self, val);

        // now we need to remove `args[index]` since it's inlined in the `format`
        args.splice(index, 1);
        index--;
      }
      return match;
    });

    // apply env-specific formatting (colors, etc.)
    exports.formatArgs.call(self, args);

    var logFn = debug.log || exports.log || console.log.bind(console);
    logFn.apply(self, args);
  }

  debug.namespace = namespace;
  debug.enabled = exports.enabled(namespace);
  debug.useColors = exports.useColors();
  debug.color = selectColor(namespace);

  // env-specific initialization logic for debug instances
  if ('function' === typeof exports.init) {
    exports.init(debug);
  }

  return debug;
}

/**
 * Enables a debug mode by namespaces. This can include modes
 * separated by a colon and wildcards.
 *
 * @param {String} namespaces
 * @api public
 */

function enable(namespaces) {
  exports.save(namespaces);

  exports.names = [];
  exports.skips = [];

  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
  var len = split.length;

  for (var i = 0; i < len; i++) {
    if (!split[i]) continue; // ignore empty strings
    namespaces = split[i].replace(/\*/g, '.*?');
    if (namespaces[0] === '-') {
      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
    } else {
      exports.names.push(new RegExp('^' + namespaces + '$'));
    }
  }
}

/**
 * Disable debug output.
 *
 * @api public
 */

function disable() {
  exports.enable('');
}

/**
 * Returns true if the given mode name is enabled, false otherwise.
 *
 * @param {String} name
 * @return {Boolean}
 * @api public
 */

function enabled(name) {
  var i, len;
  for (i = 0, len = exports.skips.length; i < len; i++) {
    if (exports.skips[i].test(name)) {
      return false;
    }
  }
  for (i = 0, len = exports.names.length; i < len; i++) {
    if (exports.names[i].test(name)) {
      return true;
    }
  }
  return false;
}

/**
 * Coerce `val`.
 *
 * @param {Mixed} val
 * @return {Mixed}
 * @api private
 */

function coerce(val) {
  if (val instanceof Error) return val.stack || val.message;
  return val;
}
/**
 * Detect Electron renderer process, which is node, but we should
 * treat as a browser.
 */

if (typeof process !== 'undefined' && process.type === 'renderer') {
  module.exports = require('./browser.js');
} else {
  module.exports = require('./node.js');
}
module.exports = inspectorLog;

// black hole
const nullStream = new (require('stream').Writable)();
nullStream._write = () => {};

/**
 * Outputs a `console.log()` to the Node.js Inspector console *only*.
 */
function inspectorLog() {
  const stdout = console._stdout;
  console._stdout = nullStream;
  console.log.apply(console, arguments);
  console._stdout = stdout;
}
/**
 * Module dependencies.
 */

var tty = require('tty');
var util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(function (key) {
  return /^debug_/i.test(key);
}).reduce(function (obj, key) {
  // camel-case
  var prop = key
    .substring(6)
    .toLowerCase()
    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });

  // coerce string value into JS value
  var val = process.env[key];
  if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
  else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
  else if (val === 'null') val = null;
  else val = Number(val);

  obj[prop] = val;
  return obj;
}, {});

/**
 * The file descriptor to write the `debug()` calls to.
 * Set the `DEBUG_FD` env variable to override with another value. i.e.:
 *
 *   $ DEBUG_FD=3 node script.js 3>debug.log
 */

var fd = parseInt(process.env.DEBUG_FD, 10) || 2;

if (1 !== fd && 2 !== fd) {
  util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
}

var stream = 1 === fd ? process.stdout :
             2 === fd ? process.stderr :
             createWritableStdioStream(fd);

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
  return 'colors' in exports.inspectOpts
    ? Boolean(exports.inspectOpts.colors)
    : tty.isatty(fd);
}

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

exports.formatters.o = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts)
    .split('\n').map(function(str) {
      return str.trim()
    }).join(' ');
};

/**
 * Map %o to `util.inspect()`, allowing multiple lines if needed.
 */

exports.formatters.O = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts);
};

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var name = this.namespace;
  var useColors = this.useColors;

  if (useColors) {
    var c = this.color;
    var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';

    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
    args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
  } else {
    args[0] = new Date().toUTCString()
      + ' ' + name + ' ' + args[0];
  }
}

/**
 * Invokes `util.format()` with the specified arguments and writes to `stream`.
 */

function log() {
  return stream.write(util.format.apply(util, arguments) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  if (null == namespaces) {
    // If you set a process.env field to null or undefined, it gets cast to the
    // string 'null' or 'undefined'. Just delete instead.
    delete process.env.DEBUG;
  } else {
    process.env.DEBUG = namespaces;
  }
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  return process.env.DEBUG;
}

/**
 * Copied from `node/src/node.js`.
 *
 * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
 * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
 */

function createWritableStdioStream (fd) {
  var stream;
  var tty_wrap = process.binding('tty_wrap');

  // Note stream._type is used for test-module-load-list.js

  switch (tty_wrap.guessHandleType(fd)) {
    case 'TTY':
      stream = new tty.WriteStream(fd);
      stream._type = 'tty';

      // Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    case 'FILE':
      var fs = require('fs');
      stream = new fs.SyncWriteStream(fd, { autoClose: false });
      stream._type = 'fs';
      break;

    case 'PIPE':
    case 'TCP':
      var net = require('net');
      stream = new net.Socket({
        fd: fd,
        readable: false,
        writable: true
      });

      // FIXME Should probably have an option in net.Socket to create a
      // stream from an existing fd which is writable only. But for now
      // we'll just add this hack and set the `readable` member to false.
      // Test: ./node test/fixtures/echo.js < /etc/passwd
      stream.readable = false;
      stream.read = null;
      stream._type = 'pipe';

      // FIXME Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    default:
      // Probably an error on in uv_guess_handle()
      throw new Error('Implement me. Unknown stream file type!');
  }

  // For supporting legacy API we put the FD here.
  stream.fd = fd;

  stream._isStdio = true;

  return stream;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init (debug) {
  debug.inspectOpts = {};

  var keys = Object.keys(exports.inspectOpts);
  for (var i = 0; i < keys.length; i++) {
    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
  }
}

/**
 * Enable namespaces listed in `process.env.DEBUG` initially.
 */

exports.enable(load());
Copyright (c) 2017 Garen J. Torikian

MIT License

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
var fs = require('fs');
var path = require('path');
var alloc = require('buffer-alloc');
var MAX_BYTES = 512;

module.exports = function(bytes, size, cb) {
  // Only two args
  if (cb === undefined) {
    var file = bytes;
    cb = size;

    fs.stat(file, function(err, stat) {
      if (err || !stat.isFile()) return cb(err, false);

      fs.open(file, 'r', function(r_err, descriptor){
          if (r_err) return cb(r_err);
          bytes = alloc(MAX_BYTES);
          // Read the file with no encoding for raw buffer access.
          fs.read(descriptor, bytes, 0, bytes.length, 0, function(err, size, bytes){
            fs.close(descriptor, function(c_err){
                if (c_err) return cb(c_err, false);
                return cb(null, isBinaryCheck(bytes, size));
            });
          });
      });
    });
  }
  else
    return cb(null, isBinaryCheck(bytes, size));
};

function isBinaryCheck(bytes, size) {
  if (size === 0)
    return false;

  var suspicious_bytes = 0;
  var total_bytes = Math.min(size, MAX_BYTES);

  // UTF-8 BOM
  if (size >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) {
    return false;
  }

  // UTF-32 BOM
  if (size >= 4 && bytes[0] === 0x00 && bytes[1] === 0x00 && bytes[2] == 0xFE && bytes[3] == 0xFF) {
    return false;
  }

  // UTF-32 LE BOM
  if (size >= 4 && bytes[0] == 0xFF && bytes[1] == 0xFE && bytes[2] === 0x00 && bytes[3] === 0x00) {
    return false;
  }

  // GB BOM
  if (size >= 4 && bytes[0] == 0x84 && bytes[1] == 0x31 && bytes[2] == 0x95 && bytes[3] == 0x33) {
    return false;
  }

  if (total_bytes >= 5 && bytes.slice(0, 5) == "%PDF-") {
      /* PDF. This is binary. */
      return true;
  }

  // UTF-16 BE BOM
  if (size >= 2 && bytes[0] == 0xFE && bytes[1] == 0xFF) {
    return false;
  }

  // UTF-16 LE BOM
  if (size >= 2 && bytes[0] == 0xFF && bytes[1] == 0xFE) {
    return false;
  }

  for (var i = 0; i < total_bytes; i++) {
    if (bytes[i] === 0) { // NULL byte--it's binary!
      return true;
    }
    else if ((bytes[i] < 7 || bytes[i] > 14) && (bytes[i] < 32 || bytes[i] > 127)) {
      // UTF-8 detection
      if (bytes[i] > 193 && bytes[i] < 224 && i + 1 < total_bytes) {
          i++;
          if (bytes[i] > 127 && bytes[i] < 192) {
            continue;
          }
      }
      else if (bytes[i] > 223 && bytes[i] < 240 && i + 2 < total_bytes) {
          i++;
          if (bytes[i] > 127 && bytes[i] < 192 && bytes[i + 1] > 127 && bytes[i + 1] < 192) {
            i++;
            continue;
          }
      }
      suspicious_bytes++;
      // Read at least 32 bytes before making a decision
      if (i > 32 && (suspicious_bytes * 100) / total_bytes > 10) {
        return true;
      }
    }
  }

  if ((suspicious_bytes * 100) / total_bytes > 10) {
    return true;
  }

  return false;
}

module.exports.sync = function(bytes, size) {
  // Only one arg
  if (size === undefined) {
    var file = bytes;
    try {
      if(!fs.statSync(file).isFile()) return false;
    } catch (err) {
      // otherwise continue on
    }
    var descriptor = fs.openSync(file, 'r');
    try {
      // Read the file with no encoding for raw buffer access.
      bytes = alloc(MAX_BYTES);
      size = fs.readSync(descriptor, bytes, 0, bytes.length, 0);
    } finally {
      fs.closeSync(descriptor);
    }
    return isBinaryCheck(bytes, size);
  }
  else
    return isBinaryCheck(bytes, size);
}
{
  "dependencies": {
    "buffer-alloc": "^1.2.0"
  },
  "deprecated": false,
  "description": "Detects if a file is binary in Node.js. Similar to Perl's -B.",
  "devDependencies": {
    "grunt": "~0.4.1",
    "grunt-cli": "~0.1.13",
    "grunt-exec": "0.4.3",
    "grunt-release": "~0.6.0",
    "mocha": "^2.2.4"
  },
  "engines": {
    "node": ">=0.6.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/gjtorikian/isBinaryFile#readme",
  "license": "MIT",
  "main": "./index.js",
  "maintainers": [
    {
      "name": "Garen J. Torikian",
      "email": "gjtorikian@gmail.com"
    }
  ],
  "name": "isbinaryfile",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/gjtorikian/isBinaryFile.git"
  },
  "version": "3.0.3"
}/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function(val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isNaN(val) === false) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  if (ms >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (ms >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (ms >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (ms >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  return plural(ms, d, 'day') ||
    plural(ms, h, 'hour') ||
    plural(ms, m, 'minute') ||
    plural(ms, s, 'second') ||
    ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, n, name) {
  if (ms < n) {
    return;
  }
  if (ms < n * 1.5) {
    return Math.floor(ms / n) + ' ' + name;
  }
  return Math.ceil(ms / n) + ' ' + name + 's';
}
The MIT License (MIT)

Copyright (c) 2016 Zeit, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "deprecated": false,
  "description": "Tiny milisecond conversion utility",
  "devDependencies": {
    "eslint": "3.19.0",
    "expect.js": "0.3.1",
    "husky": "0.13.3",
    "lint-staged": "3.4.1",
    "mocha": "3.4.1"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/zeit/ms#readme",
  "license": "MIT",
  "lint-staged": {
    "*.js": [
      "npm run lint",
      "prettier --single-quote --write",
      "git add"
    ]
  },
  "main": "./index",
  "name": "ms",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/zeit/ms.git"
  },
  "version": "2.0.0"
}Copyright (c) 2014 IndigoUnited

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'use strict';

var cp = require('child_process');
var parse = require('./lib/parse');
var enoent = require('./lib/enoent');

var cpSpawnSync = cp.spawnSync;

function spawn(command, args, options) {
    var parsed;
    var spawned;

    // Parse the arguments
    parsed = parse(command, args, options);

    // Spawn the child process
    spawned = cp.spawn(parsed.command, parsed.args, parsed.options);

    // Hook into child process "exit" event to emit an error if the command
    // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
    enoent.hookChildProcess(spawned, parsed);

    return spawned;
}

function spawnSync(command, args, options) {
    var parsed;
    var result;

    if (!cpSpawnSync) {
        try {
            cpSpawnSync = require('spawn-sync');  // eslint-disable-line global-require
        } catch (ex) {
            throw new Error(
                'In order to use spawnSync on node 0.10 or older, you must ' +
                'install spawn-sync:\n\n' +
                '  npm install spawn-sync --save'
            );
        }
    }

    // Parse the arguments
    parsed = parse(command, args, options);

    // Spawn the child process
    result = cpSpawnSync(parsed.command, parsed.args, parsed.options);

    // Analyze if the command does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
    result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);

    return result;
}

module.exports = spawn;
module.exports.spawn = spawn;
module.exports.sync = spawnSync;

module.exports._parse = parse;
module.exports._enoent = enoent;
{
  "author": {
    "name": "IndigoUnited",
    "email": "hello@indigounited.com",
    "url": "http://indigounited.com"
  },
  "dependencies": {
    "lru-cache": "^4.0.1",
    "shebang-command": "^1.2.0",
    "which": "^1.2.9"
  },
  "deprecated": false,
  "description": "Cross platform child_process#spawn and child_process#spawnSync",
  "devDependencies": {
    "@satazor/eslint-config": "^3.0.0",
    "eslint": "^3.0.0",
    "expect.js": "^0.3.0",
    "glob": "^7.0.0",
    "mkdirp": "^0.5.1",
    "mocha": "^3.0.2",
    "once": "^1.4.0",
    "rimraf": "^2.5.0"
  },
  "files": [
    "index.js",
    "lib"
  ],
  "homepage": "https://github.com/IndigoUnited/node-cross-spawn#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "cross-spawn",
  "repository": {
    "type": "git",
    "url": "git://github.com/IndigoUnited/node-cross-spawn.git"
  },
  "version": "5.1.0"
}'use strict';

var isWin = process.platform === 'win32';
var resolveCommand = require('./util/resolveCommand');

var isNode10 = process.version.indexOf('v0.10.') === 0;

function notFoundError(command, syscall) {
    var err;

    err = new Error(syscall + ' ' + command + ' ENOENT');
    err.code = err.errno = 'ENOENT';
    err.syscall = syscall + ' ' + command;

    return err;
}

function hookChildProcess(cp, parsed) {
    var originalEmit;

    if (!isWin) {
        return;
    }

    originalEmit = cp.emit;
    cp.emit = function (name, arg1) {
        var err;

        // If emitting "exit" event and exit code is 1, we need to check if
        // the command exists and emit an "error" instead
        // See: https://github.com/IndigoUnited/node-cross-spawn/issues/16
        if (name === 'exit') {
            err = verifyENOENT(arg1, parsed, 'spawn');

            if (err) {
                return originalEmit.call(cp, 'error', err);
            }
        }

        return originalEmit.apply(cp, arguments);
    };
}

function verifyENOENT(status, parsed) {
    if (isWin && status === 1 && !parsed.file) {
        return notFoundError(parsed.original, 'spawn');
    }

    return null;
}

function verifyENOENTSync(status, parsed) {
    if (isWin && status === 1 && !parsed.file) {
        return notFoundError(parsed.original, 'spawnSync');
    }

    // If we are in node 10, then we are using spawn-sync; if it exited
    // with -1 it probably means that the command does not exist
    if (isNode10 && status === -1) {
        parsed.file = isWin ? parsed.file : resolveCommand(parsed.original);

        if (!parsed.file) {
            return notFoundError(parsed.original, 'spawnSync');
        }
    }

    return null;
}

module.exports.hookChildProcess = hookChildProcess;
module.exports.verifyENOENT = verifyENOENT;
module.exports.verifyENOENTSync = verifyENOENTSync;
module.exports.notFoundError = notFoundError;
'use strict';

var resolveCommand = require('./util/resolveCommand');
var hasEmptyArgumentBug = require('./util/hasEmptyArgumentBug');
var escapeArgument = require('./util/escapeArgument');
var escapeCommand = require('./util/escapeCommand');
var readShebang = require('./util/readShebang');

var isWin = process.platform === 'win32';
var skipShellRegExp = /\.(?:com|exe)$/i;

// Supported in Node >= 6 and >= 4.8
var supportsShellOption = parseInt(process.version.substr(1).split('.')[0], 10) >= 6 ||
 parseInt(process.version.substr(1).split('.')[0], 10) === 4 && parseInt(process.version.substr(1).split('.')[1], 10) >= 8;

function parseNonShell(parsed) {
    var shebang;
    var needsShell;
    var applyQuotes;

    if (!isWin) {
        return parsed;
    }

    // Detect & add support for shebangs
    parsed.file = resolveCommand(parsed.command);
    parsed.file = parsed.file || resolveCommand(parsed.command, true);
    shebang = parsed.file && readShebang(parsed.file);

    if (shebang) {
        parsed.args.unshift(parsed.file);
        parsed.command = shebang;
        needsShell = hasEmptyArgumentBug || !skipShellRegExp.test(resolveCommand(shebang) || resolveCommand(shebang, true));
    } else {
        needsShell = hasEmptyArgumentBug || !skipShellRegExp.test(parsed.file);
    }

    // If a shell is required, use cmd.exe and take care of escaping everything correctly
    if (needsShell) {
        // Escape command & arguments
        applyQuotes = (parsed.command !== 'echo');  // Do not quote arguments for the special "echo" command
        parsed.command = escapeCommand(parsed.command);
        parsed.args = parsed.args.map(function (arg) {
            return escapeArgument(arg, applyQuotes);
        });

        // Make use of cmd.exe
        parsed.args = ['/d', '/s', '/c', '"' + parsed.command + (parsed.args.length ? ' ' + parsed.args.join(' ') : '') + '"'];
        parsed.command = process.env.comspec || 'cmd.exe';
        parsed.options.windowsVerbatimArguments = true;  // Tell node's spawn that the arguments are already escaped
    }

    return parsed;
}

function parseShell(parsed) {
    var shellCommand;

    // If node supports the shell option, there's no need to mimic its behavior
    if (supportsShellOption) {
        return parsed;
    }

    // Mimic node shell option, see: https://github.com/nodejs/node/blob/b9f6a2dc059a1062776133f3d4fd848c4da7d150/lib/child_process.js#L335
    shellCommand = [parsed.command].concat(parsed.args).join(' ');

    if (isWin) {
        parsed.command = typeof parsed.options.shell === 'string' ? parsed.options.shell : process.env.comspec || 'cmd.exe';
        parsed.args = ['/d', '/s', '/c', '"' + shellCommand + '"'];
        parsed.options.windowsVerbatimArguments = true;  // Tell node's spawn that the arguments are already escaped
    } else {
        if (typeof parsed.options.shell === 'string') {
            parsed.command = parsed.options.shell;
        } else if (process.platform === 'android') {
            parsed.command = '/system/bin/sh';
        } else {
            parsed.command = '/bin/sh';
        }

        parsed.args = ['-c', shellCommand];
    }

    return parsed;
}

// ------------------------------------------------

function parse(command, args, options) {
    var parsed;

    // Normalize arguments, similar to nodejs
    if (args && !Array.isArray(args)) {
        options = args;
        args = null;
    }

    args = args ? args.slice(0) : [];  // Clone array to avoid changing the original
    options = options || {};

    // Build our parsed object
    parsed = {
        command: command,
        args: args,
        options: options,
        file: undefined,
        original: command,
    };

    // Delegate further parsing to shell or non-shell
    return options.shell ? parseShell(parsed) : parseNonShell(parsed);
}

module.exports = parse;
'use strict';

function escapeArgument(arg, quote) {
    // Convert to string
    arg = '' + arg;

    // If we are not going to quote the argument,
    // escape shell metacharacters, including double and single quotes:
    if (!quote) {
        arg = arg.replace(/([()%!^<>&|;,"'\s])/g, '^$1');
    } else {
        // Sequence of backslashes followed by a double quote:
        // double up all the backslashes and escape the double quote
        arg = arg.replace(/(\\*)"/g, '$1$1\\"');

        // Sequence of backslashes followed by the end of the string
        // (which will become a double quote later):
        // double up all the backslashes
        arg = arg.replace(/(\\*)$/, '$1$1');

        // All other backslashes occur literally

        // Quote the whole thing:
        arg = '"' + arg + '"';
    }

    return arg;
}

module.exports = escapeArgument;
'use strict';

var escapeArgument = require('./escapeArgument');

function escapeCommand(command) {
    // Do not escape if this command is not dangerous..
    // We do this so that commands like "echo" or "ifconfig" work
    // Quoting them, will make them unaccessible
    return /^[a-z0-9_-]+$/i.test(command) ? command : escapeArgument(command, true);
}

module.exports = escapeCommand;
'use strict';

// See: https://github.com/IndigoUnited/node-cross-spawn/pull/34#issuecomment-221623455
function hasEmptyArgumentBug() {
    var nodeVer;

    if (process.platform !== 'win32') {
        return false;
    }

    nodeVer = process.version.substr(1).split('.').map(function (num) {
        return parseInt(num, 10);
    });

    return (nodeVer[0] === 0 && nodeVer[1] < 12);
}

module.exports = hasEmptyArgumentBug();
'use strict';

var fs = require('fs');
var LRU = require('lru-cache');
var shebangCommand = require('shebang-command');

var shebangCache = new LRU({ max: 50, maxAge: 30 * 1000 });  // Cache just for 30sec

function readShebang(command) {
    var buffer;
    var fd;
    var shebang;

    // Check if it is in the cache first
    if (shebangCache.has(command)) {
        return shebangCache.get(command);
    }

    // Read the first 150 bytes from the file
    buffer = new Buffer(150);

    try {
        fd = fs.openSync(command, 'r');
        fs.readSync(fd, buffer, 0, 150, 0);
        fs.closeSync(fd);
    } catch (e) { /* empty */ }

    // Attempt to extract shebang (null is returned if not a shebang)
    shebang = shebangCommand(buffer.toString());

    // Store the shebang in the cache
    shebangCache.set(command, shebang);

    return shebang;
}

module.exports = readShebang;
'use strict';

var path = require('path');
var which = require('which');
var LRU = require('lru-cache');

var commandCache = new LRU({ max: 50, maxAge: 30 * 1000 });  // Cache just for 30sec

function resolveCommand(command, noExtension) {
    var resolved;

    noExtension = !!noExtension;
    resolved = commandCache.get(command + '!' + noExtension);

    // Check if its resolved in the cache
    if (commandCache.has(command)) {
        return commandCache.get(command);
    }

    try {
        resolved = !noExtension ?
            which.sync(command) :
            which.sync(command, { pathExt: path.delimiter + (process.env.PATHEXT || '') });
    } catch (e) { /* empty */ }

    commandCache.set(command + '!' + noExtension, resolved);

    return resolved;
}

module.exports = resolveCommand;
(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the 'Software'), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial 
portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)

# BIN directory
BIN := $(THIS_DIR)/node_modules/.bin

# Path
PATH := node_modules/.bin:$(PATH)
SHELL := /bin/bash

# applications
NODE ?= $(shell which node)
YARN ?= $(shell which yarn)
PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
BROWSERIFY ?= $(NODE) $(BIN)/browserify

.FORCE:

install: node_modules

node_modules: package.json
	@NODE_ENV= $(PKG) install
	@touch node_modules

lint: .FORCE
	eslint browser.js debug.js index.js node.js

test-node: .FORCE
	istanbul cover node_modules/mocha/bin/_mocha -- test/**.js

test-browser: .FORCE
	mkdir -p dist

	@$(BROWSERIFY) \
		--standalone debug \
		. > dist/debug.js

	karma start --single-run
	rimraf dist

test: .FORCE
	concurrently \
		"make test-node" \
		"make test-browser"

coveralls:
	cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js

.PHONY: all install clean distclean
{
  "name": "debug",
  "repo": "visionmedia/debug",
  "description": "small debugging utility",
  "version": "2.6.9",
  "keywords": [
    "debug",
    "log",
    "debugger"
  ],
  "main": "src/browser.js",
  "scripts": [
    "src/browser.js",
    "src/debug.js"
  ],
  "dependencies": {
    "rauchg/ms.js": "0.7.1"
  }
}
module.exports = require('./src/node');
{
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "browser": "./src/browser.js",
  "component": {
    "scripts": {
      "debug/index.js": "browser.js",
      "debug/debug.js": "debug.js"
    }
  },
  "dependencies": {
    "ms": "2.0.0"
  },
  "deprecated": false,
  "description": "small debugging utility",
  "devDependencies": {
    "browserify": "9.0.3",
    "chai": "^3.5.0",
    "concurrently": "^3.1.0",
    "coveralls": "^2.11.15",
    "eslint": "^3.12.1",
    "istanbul": "^0.4.5",
    "karma": "^1.3.0",
    "karma-chai": "^0.1.0",
    "karma-mocha": "^1.3.0",
    "karma-phantomjs-launcher": "^1.0.2",
    "karma-sinon": "^1.0.5",
    "mocha": "^3.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "rimraf": "^2.5.4",
    "sinon": "^1.17.6",
    "sinon-chai": "^2.8.0"
  },
  "homepage": "https://github.com/visionmedia/debug#readme",
  "license": "MIT",
  "main": "./src/index.js",
  "name": "debug",
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "version": "2.6.9"
}/**
 * This is the web browser implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
               && 'undefined' != typeof chrome.storage
                  ? chrome.storage.local
                  : localstorage();

/**
 * Colors.
 */

exports.colors = [
  'lightseagreen',
  'forestgreen',
  'goldenrod',
  'dodgerblue',
  'darkorchid',
  'crimson'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

function useColors() {
  // NB: In an Electron preload script, document will be defined but not fully
  // initialized. Since we know we're in Chrome, we'll just detect this case
  // explicitly
  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
    return true;
  }

  // is webkit? http://stackoverflow.com/a/16459606/376773
  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
    // is firebug? http://stackoverflow.com/a/398120/376773
    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
    // is firefox >= v31?
    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
    // double check webkit in userAgent just in case we are in a worker
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

exports.formatters.j = function(v) {
  try {
    return JSON.stringify(v);
  } catch (err) {
    return '[UnexpectedJSONParseError]: ' + err.message;
  }
};


/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var useColors = this.useColors;

  args[0] = (useColors ? '%c' : '')
    + this.namespace
    + (useColors ? ' %c' : ' ')
    + args[0]
    + (useColors ? '%c ' : ' ')
    + '+' + exports.humanize(this.diff);

  if (!useColors) return;

  var c = 'color: ' + this.color;
  args.splice(1, 0, c, 'color: inherit')

  // the final "%c" is somewhat tricky, because there could be other
  // arguments passed either before or after the %c, so we need to
  // figure out the correct index to insert the CSS into
  var index = 0;
  var lastC = 0;
  args[0].replace(/%[a-zA-Z%]/g, function(match) {
    if ('%%' === match) return;
    index++;
    if ('%c' === match) {
      // we only are interested in the *last* %c
      // (the user may have provided their own)
      lastC = index;
    }
  });

  args.splice(lastC, 0, c);
}

/**
 * Invokes `console.log()` when available.
 * No-op when `console.log` is not a "function".
 *
 * @api public
 */

function log() {
  // this hackery is required for IE8/9, where
  // the `console.log` function doesn't have 'apply'
  return 'object' === typeof console
    && console.log
    && Function.prototype.apply.call(console.log, console, arguments);
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  try {
    if (null == namespaces) {
      exports.storage.removeItem('debug');
    } else {
      exports.storage.debug = namespaces;
    }
  } catch(e) {}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  var r;
  try {
    r = exports.storage.debug;
  } catch(e) {}

  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
  if (!r && typeof process !== 'undefined' && 'env' in process) {
    r = process.env.DEBUG;
  }

  return r;
}

/**
 * Enable namespaces listed in `localStorage.debug` initially.
 */

exports.enable(load());

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
  try {
    return window.localStorage;
  } catch (e) {}
}

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
exports.coerce = coerce;
exports.disable = disable;
exports.enable = enable;
exports.enabled = enabled;
exports.humanize = require('ms');

/**
 * The currently active debug mode names, and names to skip.
 */

exports.names = [];
exports.skips = [];

/**
 * Map of special "%n" handling functions, for the debug "format" argument.
 *
 * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
 */

exports.formatters = {};

/**
 * Previous log timestamp.
 */

var prevTime;

/**
 * Select a color.
 * @param {String} namespace
 * @return {Number}
 * @api private
 */

function selectColor(namespace) {
  var hash = 0, i;

  for (i in namespace) {
    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
    hash |= 0; // Convert to 32bit integer
  }

  return exports.colors[Math.abs(hash) % exports.colors.length];
}

/**
 * Create a debugger with the given `namespace`.
 *
 * @param {String} namespace
 * @return {Function}
 * @api public
 */

function createDebug(namespace) {

  function debug() {
    // disabled?
    if (!debug.enabled) return;

    var self = debug;

    // set `diff` timestamp
    var curr = +new Date();
    var ms = curr - (prevTime || curr);
    self.diff = ms;
    self.prev = prevTime;
    self.curr = curr;
    prevTime = curr;

    // turn the `arguments` into a proper Array
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }

    args[0] = exports.coerce(args[0]);

    if ('string' !== typeof args[0]) {
      // anything else let's inspect with %O
      args.unshift('%O');
    }

    // apply any `formatters` transformations
    var index = 0;
    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
      // if we encounter an escaped % then don't increase the array index
      if (match === '%%') return match;
      index++;
      var formatter = exports.formatters[format];
      if ('function' === typeof formatter) {
        var val = args[index];
        match = formatter.call(self, val);

        // now we need to remove `args[index]` since it's inlined in the `format`
        args.splice(index, 1);
        index--;
      }
      return match;
    });

    // apply env-specific formatting (colors, etc.)
    exports.formatArgs.call(self, args);

    var logFn = debug.log || exports.log || console.log.bind(console);
    logFn.apply(self, args);
  }

  debug.namespace = namespace;
  debug.enabled = exports.enabled(namespace);
  debug.useColors = exports.useColors();
  debug.color = selectColor(namespace);

  // env-specific initialization logic for debug instances
  if ('function' === typeof exports.init) {
    exports.init(debug);
  }

  return debug;
}

/**
 * Enables a debug mode by namespaces. This can include modes
 * separated by a colon and wildcards.
 *
 * @param {String} namespaces
 * @api public
 */

function enable(namespaces) {
  exports.save(namespaces);

  exports.names = [];
  exports.skips = [];

  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
  var len = split.length;

  for (var i = 0; i < len; i++) {
    if (!split[i]) continue; // ignore empty strings
    namespaces = split[i].replace(/\*/g, '.*?');
    if (namespaces[0] === '-') {
      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
    } else {
      exports.names.push(new RegExp('^' + namespaces + '$'));
    }
  }
}

/**
 * Disable debug output.
 *
 * @api public
 */

function disable() {
  exports.enable('');
}

/**
 * Returns true if the given mode name is enabled, false otherwise.
 *
 * @param {String} name
 * @return {Boolean}
 * @api public
 */

function enabled(name) {
  var i, len;
  for (i = 0, len = exports.skips.length; i < len; i++) {
    if (exports.skips[i].test(name)) {
      return false;
    }
  }
  for (i = 0, len = exports.names.length; i < len; i++) {
    if (exports.names[i].test(name)) {
      return true;
    }
  }
  return false;
}

/**
 * Coerce `val`.
 *
 * @param {Mixed} val
 * @return {Mixed}
 * @api private
 */

function coerce(val) {
  if (val instanceof Error) return val.stack || val.message;
  return val;
}
/**
 * Detect Electron renderer process, which is node, but we should
 * treat as a browser.
 */

if (typeof process !== 'undefined' && process.type === 'renderer') {
  module.exports = require('./browser.js');
} else {
  module.exports = require('./node.js');
}
module.exports = inspectorLog;

// black hole
const nullStream = new (require('stream').Writable)();
nullStream._write = () => {};

/**
 * Outputs a `console.log()` to the Node.js Inspector console *only*.
 */
function inspectorLog() {
  const stdout = console._stdout;
  console._stdout = nullStream;
  console.log.apply(console, arguments);
  console._stdout = stdout;
}
/**
 * Module dependencies.
 */

var tty = require('tty');
var util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(function (key) {
  return /^debug_/i.test(key);
}).reduce(function (obj, key) {
  // camel-case
  var prop = key
    .substring(6)
    .toLowerCase()
    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });

  // coerce string value into JS value
  var val = process.env[key];
  if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
  else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
  else if (val === 'null') val = null;
  else val = Number(val);

  obj[prop] = val;
  return obj;
}, {});

/**
 * The file descriptor to write the `debug()` calls to.
 * Set the `DEBUG_FD` env variable to override with another value. i.e.:
 *
 *   $ DEBUG_FD=3 node script.js 3>debug.log
 */

var fd = parseInt(process.env.DEBUG_FD, 10) || 2;

if (1 !== fd && 2 !== fd) {
  util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
}

var stream = 1 === fd ? process.stdout :
             2 === fd ? process.stderr :
             createWritableStdioStream(fd);

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
  return 'colors' in exports.inspectOpts
    ? Boolean(exports.inspectOpts.colors)
    : tty.isatty(fd);
}

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

exports.formatters.o = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts)
    .split('\n').map(function(str) {
      return str.trim()
    }).join(' ');
};

/**
 * Map %o to `util.inspect()`, allowing multiple lines if needed.
 */

exports.formatters.O = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts);
};

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var name = this.namespace;
  var useColors = this.useColors;

  if (useColors) {
    var c = this.color;
    var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';

    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
    args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
  } else {
    args[0] = new Date().toUTCString()
      + ' ' + name + ' ' + args[0];
  }
}

/**
 * Invokes `util.format()` with the specified arguments and writes to `stream`.
 */

function log() {
  return stream.write(util.format.apply(util, arguments) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  if (null == namespaces) {
    // If you set a process.env field to null or undefined, it gets cast to the
    // string 'null' or 'undefined'. Just delete instead.
    delete process.env.DEBUG;
  } else {
    process.env.DEBUG = namespaces;
  }
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  return process.env.DEBUG;
}

/**
 * Copied from `node/src/node.js`.
 *
 * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
 * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
 */

function createWritableStdioStream (fd) {
  var stream;
  var tty_wrap = process.binding('tty_wrap');

  // Note stream._type is used for test-module-load-list.js

  switch (tty_wrap.guessHandleType(fd)) {
    case 'TTY':
      stream = new tty.WriteStream(fd);
      stream._type = 'tty';

      // Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    case 'FILE':
      var fs = require('fs');
      stream = new fs.SyncWriteStream(fd, { autoClose: false });
      stream._type = 'fs';
      break;

    case 'PIPE':
    case 'TCP':
      var net = require('net');
      stream = new net.Socket({
        fd: fd,
        readable: false,
        writable: true
      });

      // FIXME Should probably have an option in net.Socket to create a
      // stream from an existing fd which is writable only. But for now
      // we'll just add this hack and set the `readable` member to false.
      // Test: ./node test/fixtures/echo.js < /etc/passwd
      stream.readable = false;
      stream.read = null;
      stream._type = 'pipe';

      // FIXME Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    default:
      // Probably an error on in uv_guess_handle()
      throw new Error('Implement me. Unknown stream file type!');
  }

  // For supporting legacy API we put the FD here.
  stream.fd = fd;

  stream._isStdio = true;

  return stream;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init (debug) {
  debug.inspectOpts = {};

  var keys = Object.keys(exports.inspectOpts);
  for (var i = 0; i < keys.length; i++) {
    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
  }
}

/**
 * Enable namespaces listed in `process.env.DEBUG` initially.
 */

exports.enable(load());
/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function(val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isNaN(val) === false) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  if (ms >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (ms >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (ms >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (ms >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  return plural(ms, d, 'day') ||
    plural(ms, h, 'hour') ||
    plural(ms, m, 'minute') ||
    plural(ms, s, 'second') ||
    ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, n, name) {
  if (ms < n) {
    return;
  }
  if (ms < n * 1.5) {
    return Math.floor(ms / n) + ' ' + name;
  }
  return Math.ceil(ms / n) + ' ' + name + 's';
}
The MIT License (MIT)

Copyright (c) 2016 Zeit, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "deprecated": false,
  "description": "Tiny milisecond conversion utility",
  "devDependencies": {
    "eslint": "3.19.0",
    "expect.js": "0.3.1",
    "husky": "0.13.3",
    "lint-staged": "3.4.1",
    "mocha": "3.4.1"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/zeit/ms#readme",
  "license": "MIT",
  "lint-staged": {
    "*.js": [
      "npm run lint",
      "prettier --single-quote --write",
      "git add"
    ]
  },
  "main": "./index",
  "name": "ms",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/zeit/ms.git"
  },
  "version": "2.0.0"
}'use strict';
var fs = require('fs');
var Promise = require('pinkie-promise');

module.exports = function (fp) {
	var fn = typeof fs.access === 'function' ? fs.access : fs.stat;

	return new Promise(function (resolve) {
		fn(fp, function (err) {
			resolve(!err);
		});
	});
};

module.exports.sync = function (fp) {
	var fn = typeof fs.accessSync === 'function' ? fs.accessSync : fs.statSync;

	try {
		fn(fp);
		return true;
	} catch (err) {
		return false;
	}
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "pinkie-promise": "^2.0.0"
  },
  "deprecated": false,
  "description": "Check if a path exists",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/path-exists#readme",
  "license": "MIT",
  "name": "path-exists",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/path-exists.git"
  },
  "version": "2.1.0"
}'use strict';
const {PassThrough} = require('stream');

module.exports = options => {
	options = Object.assign({}, options);

	const {array} = options;
	let {encoding} = options;
	const buffer = encoding === 'buffer';
	let objectMode = false;

	if (array) {
		objectMode = !(encoding || buffer);
	} else {
		encoding = encoding || 'utf8';
	}

	if (buffer) {
		encoding = null;
	}

	let len = 0;
	const ret = [];
	const stream = new PassThrough({objectMode});

	if (encoding) {
		stream.setEncoding(encoding);
	}

	stream.on('data', chunk => {
		ret.push(chunk);

		if (objectMode) {
			len = ret.length;
		} else {
			len += chunk.length;
		}
	});

	stream.getBufferedValue = () => {
		if (array) {
			return ret;
		}

		return buffer ? Buffer.concat(ret, len) : ret.join('');
	};

	stream.getBufferedLength = () => len;

	return stream;
};
'use strict';
const pump = require('pump');
const bufferStream = require('./buffer-stream');

class MaxBufferError extends Error {
	constructor() {
		super('maxBuffer exceeded');
		this.name = 'MaxBufferError';
	}
}

function getStream(inputStream, options) {
	if (!inputStream) {
		return Promise.reject(new Error('Expected a stream'));
	}

	options = Object.assign({maxBuffer: Infinity}, options);

	const {maxBuffer} = options;

	let stream;
	return new Promise((resolve, reject) => {
		const rejectPromise = error => {
			if (error) { // A null check
				error.bufferedData = stream.getBufferedValue();
			}
			reject(error);
		};

		stream = pump(inputStream, bufferStream(options), error => {
			if (error) {
				rejectPromise(error);
				return;
			}

			resolve();
		});

		stream.on('data', () => {
			if (stream.getBufferedLength() > maxBuffer) {
				rejectPromise(new MaxBufferError());
			}
		});
	}).then(() => stream.getBufferedValue());
}

module.exports = getStream;
module.exports.buffer = (stream, options) => getStream(stream, Object.assign({}, options, {encoding: 'buffer'}));
module.exports.array = (stream, options) => getStream(stream, Object.assign({}, options, {array: true}));
module.exports.MaxBufferError = MaxBufferError;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "pump": "^3.0.0"
  },
  "deprecated": false,
  "description": "Get a stream as a string, buffer, or array",
  "devDependencies": {
    "ava": "*",
    "into-stream": "^3.0.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "buffer-stream.js"
  ],
  "homepage": "https://github.com/sindresorhus/get-stream#readme",
  "license": "MIT",
  "name": "get-stream",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/get-stream.git"
  },
  "version": "4.1.0"
}'use strict';
var isUtf8 = require('is-utf8');

module.exports = function (x) {
	// Catches EFBBBF (UTF-8 BOM) because the buffer-to-string
	// conversion translates it to FEFF (UTF-16 BOM)
	if (typeof x === 'string' && x.charCodeAt(0) === 0xFEFF) {
		return x.slice(1);
	}

	if (Buffer.isBuffer(x) && isUtf8(x) &&
		x[0] === 0xEF && x[1] === 0xBB && x[2] === 0xBF) {
		return x.slice(3);
	}

	return x;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "is-utf8": "^0.2.0"
  },
  "deprecated": false,
  "description": "Strip UTF-8 byte order mark (BOM) from a string/buffer",
  "devDependencies": {
    "mocha": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/strip-bom#readme",
  "license": "MIT",
  "name": "strip-bom",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/strip-bom.git"
  },
  "version": "2.0.0"
}'use strict';

const processFn = (fn, opts) => function () {
	const P = opts.promiseModule;
	const args = new Array(arguments.length);

	for (let i = 0; i < arguments.length; i++) {
		args[i] = arguments[i];
	}

	return new P((resolve, reject) => {
		if (opts.errorFirst) {
			args.push(function (err, result) {
				if (opts.multiArgs) {
					const results = new Array(arguments.length - 1);

					for (let i = 1; i < arguments.length; i++) {
						results[i - 1] = arguments[i];
					}

					if (err) {
						results.unshift(err);
						reject(results);
					} else {
						resolve(results);
					}
				} else if (err) {
					reject(err);
				} else {
					resolve(result);
				}
			});
		} else {
			args.push(function (result) {
				if (opts.multiArgs) {
					const results = new Array(arguments.length - 1);

					for (let i = 0; i < arguments.length; i++) {
						results[i] = arguments[i];
					}

					resolve(results);
				} else {
					resolve(result);
				}
			});
		}

		fn.apply(this, args);
	});
};

module.exports = (obj, opts) => {
	opts = Object.assign({
		exclude: [/.+(Sync|Stream)$/],
		errorFirst: true,
		promiseModule: Promise
	}, opts);

	const filter = key => {
		const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key);
		return opts.include ? opts.include.some(match) : !opts.exclude.some(match);
	};

	let ret;
	if (typeof obj === 'function') {
		ret = function () {
			if (opts.excludeMain) {
				return obj.apply(this, arguments);
			}

			return processFn(obj, opts).apply(this, arguments);
		};
	} else {
		ret = Object.create(Object.getPrototypeOf(obj));
	}

	for (const key in obj) { // eslint-disable-line guard-for-in
		const x = obj[key];
		ret[key] = typeof x === 'function' && filter(key) ? processFn(x, opts) : x;
	}

	return ret;
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Promisify a callback-style function",
  "devDependencies": {
    "ava": "*",
    "pinkie-promise": "^2.0.0",
    "v8-natives": "^1.0.0",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/pify#readme",
  "license": "MIT",
  "name": "pify",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/pify.git"
  },
  "version": "3.0.0"
}(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the 'Software'), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial 
portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)

# BIN directory
BIN := $(THIS_DIR)/node_modules/.bin

# Path
PATH := node_modules/.bin:$(PATH)
SHELL := /bin/bash

# applications
NODE ?= $(shell which node)
YARN ?= $(shell which yarn)
PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
BROWSERIFY ?= $(NODE) $(BIN)/browserify

.FORCE:

install: node_modules

node_modules: package.json
	@NODE_ENV= $(PKG) install
	@touch node_modules

lint: .FORCE
	eslint browser.js debug.js index.js node.js

test-node: .FORCE
	istanbul cover node_modules/mocha/bin/_mocha -- test/**.js

test-browser: .FORCE
	mkdir -p dist

	@$(BROWSERIFY) \
		--standalone debug \
		. > dist/debug.js

	karma start --single-run
	rimraf dist

test: .FORCE
	concurrently \
		"make test-node" \
		"make test-browser"

coveralls:
	cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js

.PHONY: all install clean distclean
{
  "name": "debug",
  "repo": "visionmedia/debug",
  "description": "small debugging utility",
  "version": "2.6.9",
  "keywords": [
    "debug",
    "log",
    "debugger"
  ],
  "main": "src/browser.js",
  "scripts": [
    "src/browser.js",
    "src/debug.js"
  ],
  "dependencies": {
    "rauchg/ms.js": "0.7.1"
  }
}
module.exports = require('./src/node');
{
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "browser": "./src/browser.js",
  "component": {
    "scripts": {
      "debug/index.js": "browser.js",
      "debug/debug.js": "debug.js"
    }
  },
  "dependencies": {
    "ms": "2.0.0"
  },
  "deprecated": false,
  "description": "small debugging utility",
  "devDependencies": {
    "browserify": "9.0.3",
    "chai": "^3.5.0",
    "concurrently": "^3.1.0",
    "coveralls": "^2.11.15",
    "eslint": "^3.12.1",
    "istanbul": "^0.4.5",
    "karma": "^1.3.0",
    "karma-chai": "^0.1.0",
    "karma-mocha": "^1.3.0",
    "karma-phantomjs-launcher": "^1.0.2",
    "karma-sinon": "^1.0.5",
    "mocha": "^3.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "rimraf": "^2.5.4",
    "sinon": "^1.17.6",
    "sinon-chai": "^2.8.0"
  },
  "homepage": "https://github.com/visionmedia/debug#readme",
  "license": "MIT",
  "main": "./src/index.js",
  "name": "debug",
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "version": "2.6.9"
}/**
 * This is the web browser implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
               && 'undefined' != typeof chrome.storage
                  ? chrome.storage.local
                  : localstorage();

/**
 * Colors.
 */

exports.colors = [
  'lightseagreen',
  'forestgreen',
  'goldenrod',
  'dodgerblue',
  'darkorchid',
  'crimson'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

function useColors() {
  // NB: In an Electron preload script, document will be defined but not fully
  // initialized. Since we know we're in Chrome, we'll just detect this case
  // explicitly
  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
    return true;
  }

  // is webkit? http://stackoverflow.com/a/16459606/376773
  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
    // is firebug? http://stackoverflow.com/a/398120/376773
    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
    // is firefox >= v31?
    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
    // double check webkit in userAgent just in case we are in a worker
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

exports.formatters.j = function(v) {
  try {
    return JSON.stringify(v);
  } catch (err) {
    return '[UnexpectedJSONParseError]: ' + err.message;
  }
};


/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var useColors = this.useColors;

  args[0] = (useColors ? '%c' : '')
    + this.namespace
    + (useColors ? ' %c' : ' ')
    + args[0]
    + (useColors ? '%c ' : ' ')
    + '+' + exports.humanize(this.diff);

  if (!useColors) return;

  var c = 'color: ' + this.color;
  args.splice(1, 0, c, 'color: inherit')

  // the final "%c" is somewhat tricky, because there could be other
  // arguments passed either before or after the %c, so we need to
  // figure out the correct index to insert the CSS into
  var index = 0;
  var lastC = 0;
  args[0].replace(/%[a-zA-Z%]/g, function(match) {
    if ('%%' === match) return;
    index++;
    if ('%c' === match) {
      // we only are interested in the *last* %c
      // (the user may have provided their own)
      lastC = index;
    }
  });

  args.splice(lastC, 0, c);
}

/**
 * Invokes `console.log()` when available.
 * No-op when `console.log` is not a "function".
 *
 * @api public
 */

function log() {
  // this hackery is required for IE8/9, where
  // the `console.log` function doesn't have 'apply'
  return 'object' === typeof console
    && console.log
    && Function.prototype.apply.call(console.log, console, arguments);
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  try {
    if (null == namespaces) {
      exports.storage.removeItem('debug');
    } else {
      exports.storage.debug = namespaces;
    }
  } catch(e) {}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  var r;
  try {
    r = exports.storage.debug;
  } catch(e) {}

  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
  if (!r && typeof process !== 'undefined' && 'env' in process) {
    r = process.env.DEBUG;
  }

  return r;
}

/**
 * Enable namespaces listed in `localStorage.debug` initially.
 */

exports.enable(load());

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
  try {
    return window.localStorage;
  } catch (e) {}
}

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
exports.coerce = coerce;
exports.disable = disable;
exports.enable = enable;
exports.enabled = enabled;
exports.humanize = require('ms');

/**
 * The currently active debug mode names, and names to skip.
 */

exports.names = [];
exports.skips = [];

/**
 * Map of special "%n" handling functions, for the debug "format" argument.
 *
 * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
 */

exports.formatters = {};

/**
 * Previous log timestamp.
 */

var prevTime;

/**
 * Select a color.
 * @param {String} namespace
 * @return {Number}
 * @api private
 */

function selectColor(namespace) {
  var hash = 0, i;

  for (i in namespace) {
    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
    hash |= 0; // Convert to 32bit integer
  }

  return exports.colors[Math.abs(hash) % exports.colors.length];
}

/**
 * Create a debugger with the given `namespace`.
 *
 * @param {String} namespace
 * @return {Function}
 * @api public
 */

function createDebug(namespace) {

  function debug() {
    // disabled?
    if (!debug.enabled) return;

    var self = debug;

    // set `diff` timestamp
    var curr = +new Date();
    var ms = curr - (prevTime || curr);
    self.diff = ms;
    self.prev = prevTime;
    self.curr = curr;
    prevTime = curr;

    // turn the `arguments` into a proper Array
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }

    args[0] = exports.coerce(args[0]);

    if ('string' !== typeof args[0]) {
      // anything else let's inspect with %O
      args.unshift('%O');
    }

    // apply any `formatters` transformations
    var index = 0;
    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
      // if we encounter an escaped % then don't increase the array index
      if (match === '%%') return match;
      index++;
      var formatter = exports.formatters[format];
      if ('function' === typeof formatter) {
        var val = args[index];
        match = formatter.call(self, val);

        // now we need to remove `args[index]` since it's inlined in the `format`
        args.splice(index, 1);
        index--;
      }
      return match;
    });

    // apply env-specific formatting (colors, etc.)
    exports.formatArgs.call(self, args);

    var logFn = debug.log || exports.log || console.log.bind(console);
    logFn.apply(self, args);
  }

  debug.namespace = namespace;
  debug.enabled = exports.enabled(namespace);
  debug.useColors = exports.useColors();
  debug.color = selectColor(namespace);

  // env-specific initialization logic for debug instances
  if ('function' === typeof exports.init) {
    exports.init(debug);
  }

  return debug;
}

/**
 * Enables a debug mode by namespaces. This can include modes
 * separated by a colon and wildcards.
 *
 * @param {String} namespaces
 * @api public
 */

function enable(namespaces) {
  exports.save(namespaces);

  exports.names = [];
  exports.skips = [];

  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
  var len = split.length;

  for (var i = 0; i < len; i++) {
    if (!split[i]) continue; // ignore empty strings
    namespaces = split[i].replace(/\*/g, '.*?');
    if (namespaces[0] === '-') {
      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
    } else {
      exports.names.push(new RegExp('^' + namespaces + '$'));
    }
  }
}

/**
 * Disable debug output.
 *
 * @api public
 */

function disable() {
  exports.enable('');
}

/**
 * Returns true if the given mode name is enabled, false otherwise.
 *
 * @param {String} name
 * @return {Boolean}
 * @api public
 */

function enabled(name) {
  var i, len;
  for (i = 0, len = exports.skips.length; i < len; i++) {
    if (exports.skips[i].test(name)) {
      return false;
    }
  }
  for (i = 0, len = exports.names.length; i < len; i++) {
    if (exports.names[i].test(name)) {
      return true;
    }
  }
  return false;
}

/**
 * Coerce `val`.
 *
 * @param {Mixed} val
 * @return {Mixed}
 * @api private
 */

function coerce(val) {
  if (val instanceof Error) return val.stack || val.message;
  return val;
}
/**
 * Detect Electron renderer process, which is node, but we should
 * treat as a browser.
 */

if (typeof process !== 'undefined' && process.type === 'renderer') {
  module.exports = require('./browser.js');
} else {
  module.exports = require('./node.js');
}
module.exports = inspectorLog;

// black hole
const nullStream = new (require('stream').Writable)();
nullStream._write = () => {};

/**
 * Outputs a `console.log()` to the Node.js Inspector console *only*.
 */
function inspectorLog() {
  const stdout = console._stdout;
  console._stdout = nullStream;
  console.log.apply(console, arguments);
  console._stdout = stdout;
}
/**
 * Module dependencies.
 */

var tty = require('tty');
var util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(function (key) {
  return /^debug_/i.test(key);
}).reduce(function (obj, key) {
  // camel-case
  var prop = key
    .substring(6)
    .toLowerCase()
    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });

  // coerce string value into JS value
  var val = process.env[key];
  if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
  else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
  else if (val === 'null') val = null;
  else val = Number(val);

  obj[prop] = val;
  return obj;
}, {});

/**
 * The file descriptor to write the `debug()` calls to.
 * Set the `DEBUG_FD` env variable to override with another value. i.e.:
 *
 *   $ DEBUG_FD=3 node script.js 3>debug.log
 */

var fd = parseInt(process.env.DEBUG_FD, 10) || 2;

if (1 !== fd && 2 !== fd) {
  util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
}

var stream = 1 === fd ? process.stdout :
             2 === fd ? process.stderr :
             createWritableStdioStream(fd);

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
  return 'colors' in exports.inspectOpts
    ? Boolean(exports.inspectOpts.colors)
    : tty.isatty(fd);
}

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

exports.formatters.o = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts)
    .split('\n').map(function(str) {
      return str.trim()
    }).join(' ');
};

/**
 * Map %o to `util.inspect()`, allowing multiple lines if needed.
 */

exports.formatters.O = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts);
};

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var name = this.namespace;
  var useColors = this.useColors;

  if (useColors) {
    var c = this.color;
    var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';

    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
    args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
  } else {
    args[0] = new Date().toUTCString()
      + ' ' + name + ' ' + args[0];
  }
}

/**
 * Invokes `util.format()` with the specified arguments and writes to `stream`.
 */

function log() {
  return stream.write(util.format.apply(util, arguments) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  if (null == namespaces) {
    // If you set a process.env field to null or undefined, it gets cast to the
    // string 'null' or 'undefined'. Just delete instead.
    delete process.env.DEBUG;
  } else {
    process.env.DEBUG = namespaces;
  }
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  return process.env.DEBUG;
}

/**
 * Copied from `node/src/node.js`.
 *
 * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
 * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
 */

function createWritableStdioStream (fd) {
  var stream;
  var tty_wrap = process.binding('tty_wrap');

  // Note stream._type is used for test-module-load-list.js

  switch (tty_wrap.guessHandleType(fd)) {
    case 'TTY':
      stream = new tty.WriteStream(fd);
      stream._type = 'tty';

      // Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    case 'FILE':
      var fs = require('fs');
      stream = new fs.SyncWriteStream(fd, { autoClose: false });
      stream._type = 'fs';
      break;

    case 'PIPE':
    case 'TCP':
      var net = require('net');
      stream = new net.Socket({
        fd: fd,
        readable: false,
        writable: true
      });

      // FIXME Should probably have an option in net.Socket to create a
      // stream from an existing fd which is writable only. But for now
      // we'll just add this hack and set the `readable` member to false.
      // Test: ./node test/fixtures/echo.js < /etc/passwd
      stream.readable = false;
      stream.read = null;
      stream._type = 'pipe';

      // FIXME Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    default:
      // Probably an error on in uv_guess_handle()
      throw new Error('Implement me. Unknown stream file type!');
  }

  // For supporting legacy API we put the FD here.
  stream.fd = fd;

  stream._isStdio = true;

  return stream;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init (debug) {
  debug.inspectOpts = {};

  var keys = Object.keys(exports.inspectOpts);
  for (var i = 0; i < keys.length; i++) {
    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
  }
}

/**
 * Enable namespaces listed in `process.env.DEBUG` initially.
 */

exports.enable(load());
/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function(val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isNaN(val) === false) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  if (ms >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (ms >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (ms >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (ms >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  return plural(ms, d, 'day') ||
    plural(ms, h, 'hour') ||
    plural(ms, m, 'minute') ||
    plural(ms, s, 'second') ||
    ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, n, name) {
  if (ms < n) {
    return;
  }
  if (ms < n * 1.5) {
    return Math.floor(ms / n) + ' ' + name;
  }
  return Math.ceil(ms / n) + ' ' + name + 's';
}
The MIT License (MIT)

Copyright (c) 2016 Zeit, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "deprecated": false,
  "description": "Tiny milisecond conversion utility",
  "devDependencies": {
    "eslint": "3.19.0",
    "expect.js": "0.3.1",
    "husky": "0.13.3",
    "lint-staged": "3.4.1",
    "mocha": "3.4.1"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/zeit/ms#readme",
  "license": "MIT",
  "lint-staged": {
    "*.js": [
      "npm run lint",
      "prettier --single-quote --write",
      "git add"
    ]
  },
  "main": "./index",
  "name": "ms",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/zeit/ms.git"
  },
  "version": "2.0.0"
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
{
  "bin": {
    "semver": "bin/semver.js"
  },
  "deprecated": false,
  "description": "The semantic version parser used by npm.",
  "devDependencies": {
    "tap": "^14.3.1"
  },
  "files": [
    "bin",
    "range.bnf",
    "semver.js"
  ],
  "homepage": "https://github.com/npm/node-semver#readme",
  "license": "ISC",
  "main": "semver.js",
  "name": "semver",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/node-semver.git"
  },
  "tap": {
    "check-coverage": true
  },
  "version": "6.3.0"
}range-set  ::= range ( logical-or range ) *
logical-or ::= ( ' ' ) * '||' ( ' ' ) *
range      ::= hyphen | simple ( ' ' simple ) * | ''
hyphen     ::= partial ' - ' partial
simple     ::= primitive | partial | tilde | caret
primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
xr         ::= 'x' | 'X' | '*' | nr
nr         ::= '0' | [1-9] ( [0-9] ) *
tilde      ::= '~' partial
caret      ::= '^' partial
qualifier  ::= ( '-' pre )? ( '+' build )?
pre        ::= parts
build      ::= parts
parts      ::= part ( '.' part ) *
part       ::= nr | [-0-9A-Za-z]+
exports = module.exports = SemVer

var debug
/* istanbul ignore next */
if (typeof process === 'object' &&
    process.env &&
    process.env.NODE_DEBUG &&
    /\bsemver\b/i.test(process.env.NODE_DEBUG)) {
  debug = function () {
    var args = Array.prototype.slice.call(arguments, 0)
    args.unshift('SEMVER')
    console.log.apply(console, args)
  }
} else {
  debug = function () {}
}

// Note: this is the semver.org version of the spec that it implements
// Not necessarily the package version of this code.
exports.SEMVER_SPEC_VERSION = '2.0.0'

var MAX_LENGTH = 256
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
  /* istanbul ignore next */ 9007199254740991

// Max safe segment length for coercion.
var MAX_SAFE_COMPONENT_LENGTH = 16

// The actual regexps go on exports.re
var re = exports.re = []
var src = exports.src = []
var t = exports.tokens = {}
var R = 0

function tok (n) {
  t[n] = R++
}

// The following Regular Expressions can be used for tokenizing,
// validating, and parsing SemVer version strings.

// ## Numeric Identifier
// A single `0`, or a non-zero digit followed by zero or more digits.

tok('NUMERICIDENTIFIER')
src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*'
tok('NUMERICIDENTIFIERLOOSE')
src[t.NUMERICIDENTIFIERLOOSE] = '[0-9]+'

// ## Non-numeric Identifier
// Zero or more digits, followed by a letter or hyphen, and then zero or
// more letters, digits, or hyphens.

tok('NONNUMERICIDENTIFIER')
src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'

// ## Main Version
// Three dot-separated numeric identifiers.

tok('MAINVERSION')
src[t.MAINVERSION] = '(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[t.NUMERICIDENTIFIER] + ')'

tok('MAINVERSIONLOOSE')
src[t.MAINVERSIONLOOSE] = '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')'

// ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier.

tok('PRERELEASEIDENTIFIER')
src[t.PRERELEASEIDENTIFIER] = '(?:' + src[t.NUMERICIDENTIFIER] +
                            '|' + src[t.NONNUMERICIDENTIFIER] + ')'

tok('PRERELEASEIDENTIFIERLOOSE')
src[t.PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[t.NUMERICIDENTIFIERLOOSE] +
                                 '|' + src[t.NONNUMERICIDENTIFIER] + ')'

// ## Pre-release Version
// Hyphen, followed by one or more dot-separated pre-release version
// identifiers.

tok('PRERELEASE')
src[t.PRERELEASE] = '(?:-(' + src[t.PRERELEASEIDENTIFIER] +
                  '(?:\\.' + src[t.PRERELEASEIDENTIFIER] + ')*))'

tok('PRERELEASELOOSE')
src[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] +
                       '(?:\\.' + src[t.PRERELEASEIDENTIFIERLOOSE] + ')*))'

// ## Build Metadata Identifier
// Any combination of digits, letters, or hyphens.

tok('BUILDIDENTIFIER')
src[t.BUILDIDENTIFIER] = '[0-9A-Za-z-]+'

// ## Build Metadata
// Plus sign, followed by one or more period-separated build metadata
// identifiers.

tok('BUILD')
src[t.BUILD] = '(?:\\+(' + src[t.BUILDIDENTIFIER] +
             '(?:\\.' + src[t.BUILDIDENTIFIER] + ')*))'

// ## Full Version String
// A main version, followed optionally by a pre-release version and
// build metadata.

// Note that the only major, minor, patch, and pre-release sections of
// the version string are capturing groups.  The build metadata is not a
// capturing group, because it should not ever be used in version
// comparison.

tok('FULL')
tok('FULLPLAIN')
src[t.FULLPLAIN] = 'v?' + src[t.MAINVERSION] +
                  src[t.PRERELEASE] + '?' +
                  src[t.BUILD] + '?'

src[t.FULL] = '^' + src[t.FULLPLAIN] + '$'

// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
// common in the npm registry.
tok('LOOSEPLAIN')
src[t.LOOSEPLAIN] = '[v=\\s]*' + src[t.MAINVERSIONLOOSE] +
                  src[t.PRERELEASELOOSE] + '?' +
                  src[t.BUILD] + '?'

tok('LOOSE')
src[t.LOOSE] = '^' + src[t.LOOSEPLAIN] + '$'

tok('GTLT')
src[t.GTLT] = '((?:<|>)?=?)'

// Something like "2.*" or "1.2.x".
// Note that "x.x" is a valid xRange identifer, meaning "any version"
// Only the first item is strictly required.
tok('XRANGEIDENTIFIERLOOSE')
src[t.XRANGEIDENTIFIERLOOSE] = src[t.NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'
tok('XRANGEIDENTIFIER')
src[t.XRANGEIDENTIFIER] = src[t.NUMERICIDENTIFIER] + '|x|X|\\*'

tok('XRANGEPLAIN')
src[t.XRANGEPLAIN] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
                   '(?:' + src[t.PRERELEASE] + ')?' +
                   src[t.BUILD] + '?' +
                   ')?)?'

tok('XRANGEPLAINLOOSE')
src[t.XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:' + src[t.PRERELEASELOOSE] + ')?' +
                        src[t.BUILD] + '?' +
                        ')?)?'

tok('XRANGE')
src[t.XRANGE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAIN] + '$'
tok('XRANGELOOSE')
src[t.XRANGELOOSE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAINLOOSE] + '$'

// Coercion.
// Extract anything that could conceivably be a part of a valid semver
tok('COERCE')
src[t.COERCE] = '(^|[^\\d])' +
              '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:$|[^\\d])'
tok('COERCERTL')
re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g')

// Tilde ranges.
// Meaning is "reasonably at or greater than"
tok('LONETILDE')
src[t.LONETILDE] = '(?:~>?)'

tok('TILDETRIM')
src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+'
re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g')
var tildeTrimReplace = '$1~'

tok('TILDE')
src[t.TILDE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAIN] + '$'
tok('TILDELOOSE')
src[t.TILDELOOSE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAINLOOSE] + '$'

// Caret ranges.
// Meaning is "at least and backwards compatible with"
tok('LONECARET')
src[t.LONECARET] = '(?:\\^)'

tok('CARETTRIM')
src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+'
re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g')
var caretTrimReplace = '$1^'

tok('CARET')
src[t.CARET] = '^' + src[t.LONECARET] + src[t.XRANGEPLAIN] + '$'
tok('CARETLOOSE')
src[t.CARETLOOSE] = '^' + src[t.LONECARET] + src[t.XRANGEPLAINLOOSE] + '$'

// A simple gt/lt/eq thing, or just "" to indicate "any version"
tok('COMPARATORLOOSE')
src[t.COMPARATORLOOSE] = '^' + src[t.GTLT] + '\\s*(' + src[t.LOOSEPLAIN] + ')$|^$'
tok('COMPARATOR')
src[t.COMPARATOR] = '^' + src[t.GTLT] + '\\s*(' + src[t.FULLPLAIN] + ')$|^$'

// An expression to strip any whitespace between the gtlt and the thing
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
tok('COMPARATORTRIM')
src[t.COMPARATORTRIM] = '(\\s*)' + src[t.GTLT] +
                      '\\s*(' + src[t.LOOSEPLAIN] + '|' + src[t.XRANGEPLAIN] + ')'

// this one has to use the /g flag
re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g')
var comparatorTrimReplace = '$1$2$3'

// Something like `1.2.3 - 1.2.4`
// Note that these all use the loose form, because they'll be
// checked against either the strict or loose comparator form
// later.
tok('HYPHENRANGE')
src[t.HYPHENRANGE] = '^\\s*(' + src[t.XRANGEPLAIN] + ')' +
                   '\\s+-\\s+' +
                   '(' + src[t.XRANGEPLAIN] + ')' +
                   '\\s*$'

tok('HYPHENRANGELOOSE')
src[t.HYPHENRANGELOOSE] = '^\\s*(' + src[t.XRANGEPLAINLOOSE] + ')' +
                        '\\s+-\\s+' +
                        '(' + src[t.XRANGEPLAINLOOSE] + ')' +
                        '\\s*$'

// Star ranges basically just allow anything at all.
tok('STAR')
src[t.STAR] = '(<|>)?=?\\s*\\*'

// Compile to actual regexp objects.
// All are flag-free, unless they were created above with a flag.
for (var i = 0; i < R; i++) {
  debug(i, src[i])
  if (!re[i]) {
    re[i] = new RegExp(src[i])
  }
}

exports.parse = parse
function parse (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (version instanceof SemVer) {
    return version
  }

  if (typeof version !== 'string') {
    return null
  }

  if (version.length > MAX_LENGTH) {
    return null
  }

  var r = options.loose ? re[t.LOOSE] : re[t.FULL]
  if (!r.test(version)) {
    return null
  }

  try {
    return new SemVer(version, options)
  } catch (er) {
    return null
  }
}

exports.valid = valid
function valid (version, options) {
  var v = parse(version, options)
  return v ? v.version : null
}

exports.clean = clean
function clean (version, options) {
  var s = parse(version.trim().replace(/^[=v]+/, ''), options)
  return s ? s.version : null
}

exports.SemVer = SemVer

function SemVer (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }
  if (version instanceof SemVer) {
    if (version.loose === options.loose) {
      return version
    } else {
      version = version.version
    }
  } else if (typeof version !== 'string') {
    throw new TypeError('Invalid Version: ' + version)
  }

  if (version.length > MAX_LENGTH) {
    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
  }

  if (!(this instanceof SemVer)) {
    return new SemVer(version, options)
  }

  debug('SemVer', version, options)
  this.options = options
  this.loose = !!options.loose

  var m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])

  if (!m) {
    throw new TypeError('Invalid Version: ' + version)
  }

  this.raw = version

  // these are actually numbers
  this.major = +m[1]
  this.minor = +m[2]
  this.patch = +m[3]

  if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
    throw new TypeError('Invalid major version')
  }

  if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
    throw new TypeError('Invalid minor version')
  }

  if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
    throw new TypeError('Invalid patch version')
  }

  // numberify any prerelease numeric ids
  if (!m[4]) {
    this.prerelease = []
  } else {
    this.prerelease = m[4].split('.').map(function (id) {
      if (/^[0-9]+$/.test(id)) {
        var num = +id
        if (num >= 0 && num < MAX_SAFE_INTEGER) {
          return num
        }
      }
      return id
    })
  }

  this.build = m[5] ? m[5].split('.') : []
  this.format()
}

SemVer.prototype.format = function () {
  this.version = this.major + '.' + this.minor + '.' + this.patch
  if (this.prerelease.length) {
    this.version += '-' + this.prerelease.join('.')
  }
  return this.version
}

SemVer.prototype.toString = function () {
  return this.version
}

SemVer.prototype.compare = function (other) {
  debug('SemVer.compare', this.version, this.options, other)
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  return this.compareMain(other) || this.comparePre(other)
}

SemVer.prototype.compareMain = function (other) {
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  return compareIdentifiers(this.major, other.major) ||
         compareIdentifiers(this.minor, other.minor) ||
         compareIdentifiers(this.patch, other.patch)
}

SemVer.prototype.comparePre = function (other) {
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  // NOT having a prerelease is > having one
  if (this.prerelease.length && !other.prerelease.length) {
    return -1
  } else if (!this.prerelease.length && other.prerelease.length) {
    return 1
  } else if (!this.prerelease.length && !other.prerelease.length) {
    return 0
  }

  var i = 0
  do {
    var a = this.prerelease[i]
    var b = other.prerelease[i]
    debug('prerelease compare', i, a, b)
    if (a === undefined && b === undefined) {
      return 0
    } else if (b === undefined) {
      return 1
    } else if (a === undefined) {
      return -1
    } else if (a === b) {
      continue
    } else {
      return compareIdentifiers(a, b)
    }
  } while (++i)
}

SemVer.prototype.compareBuild = function (other) {
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

  var i = 0
  do {
    var a = this.build[i]
    var b = other.build[i]
    debug('prerelease compare', i, a, b)
    if (a === undefined && b === undefined) {
      return 0
    } else if (b === undefined) {
      return 1
    } else if (a === undefined) {
      return -1
    } else if (a === b) {
      continue
    } else {
      return compareIdentifiers(a, b)
    }
  } while (++i)
}

// preminor will bump the version up to the next minor release, and immediately
// down to pre-release. premajor and prepatch work the same way.
SemVer.prototype.inc = function (release, identifier) {
  switch (release) {
    case 'premajor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor = 0
      this.major++
      this.inc('pre', identifier)
      break
    case 'preminor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor++
      this.inc('pre', identifier)
      break
    case 'prepatch':
      // If this is already a prerelease, it will bump to the next version
      // drop any prereleases that might already exist, since they are not
      // relevant at this point.
      this.prerelease.length = 0
      this.inc('patch', identifier)
      this.inc('pre', identifier)
      break
    // If the input is a non-prerelease version, this acts the same as
    // prepatch.
    case 'prerelease':
      if (this.prerelease.length === 0) {
        this.inc('patch', identifier)
      }
      this.inc('pre', identifier)
      break

    case 'major':
      // If this is a pre-major version, bump up to the same major version.
      // Otherwise increment major.
      // 1.0.0-5 bumps to 1.0.0
      // 1.1.0 bumps to 2.0.0
      if (this.minor !== 0 ||
          this.patch !== 0 ||
          this.prerelease.length === 0) {
        this.major++
      }
      this.minor = 0
      this.patch = 0
      this.prerelease = []
      break
    case 'minor':
      // If this is a pre-minor version, bump up to the same minor version.
      // Otherwise increment minor.
      // 1.2.0-5 bumps to 1.2.0
      // 1.2.1 bumps to 1.3.0
      if (this.patch !== 0 || this.prerelease.length === 0) {
        this.minor++
      }
      this.patch = 0
      this.prerelease = []
      break
    case 'patch':
      // If this is not a pre-release version, it will increment the patch.
      // If it is a pre-release it will bump up to the same patch version.
      // 1.2.0-5 patches to 1.2.0
      // 1.2.0 patches to 1.2.1
      if (this.prerelease.length === 0) {
        this.patch++
      }
      this.prerelease = []
      break
    // This probably shouldn't be used publicly.
    // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
    case 'pre':
      if (this.prerelease.length === 0) {
        this.prerelease = [0]
      } else {
        var i = this.prerelease.length
        while (--i >= 0) {
          if (typeof this.prerelease[i] === 'number') {
            this.prerelease[i]++
            i = -2
          }
        }
        if (i === -1) {
          // didn't increment anything
          this.prerelease.push(0)
        }
      }
      if (identifier) {
        // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
        // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
        if (this.prerelease[0] === identifier) {
          if (isNaN(this.prerelease[1])) {
            this.prerelease = [identifier, 0]
          }
        } else {
          this.prerelease = [identifier, 0]
        }
      }
      break

    default:
      throw new Error('invalid increment argument: ' + release)
  }
  this.format()
  this.raw = this.version
  return this
}

exports.inc = inc
function inc (version, release, loose, identifier) {
  if (typeof (loose) === 'string') {
    identifier = loose
    loose = undefined
  }

  try {
    return new SemVer(version, loose).inc(release, identifier).version
  } catch (er) {
    return null
  }
}

exports.diff = diff
function diff (version1, version2) {
  if (eq(version1, version2)) {
    return null
  } else {
    var v1 = parse(version1)
    var v2 = parse(version2)
    var prefix = ''
    if (v1.prerelease.length || v2.prerelease.length) {
      prefix = 'pre'
      var defaultResult = 'prerelease'
    }
    for (var key in v1) {
      if (key === 'major' || key === 'minor' || key === 'patch') {
        if (v1[key] !== v2[key]) {
          return prefix + key
        }
      }
    }
    return defaultResult // may be undefined
  }
}

exports.compareIdentifiers = compareIdentifiers

var numeric = /^[0-9]+$/
function compareIdentifiers (a, b) {
  var anum = numeric.test(a)
  var bnum = numeric.test(b)

  if (anum && bnum) {
    a = +a
    b = +b
  }

  return a === b ? 0
    : (anum && !bnum) ? -1
    : (bnum && !anum) ? 1
    : a < b ? -1
    : 1
}

exports.rcompareIdentifiers = rcompareIdentifiers
function rcompareIdentifiers (a, b) {
  return compareIdentifiers(b, a)
}

exports.major = major
function major (a, loose) {
  return new SemVer(a, loose).major
}

exports.minor = minor
function minor (a, loose) {
  return new SemVer(a, loose).minor
}

exports.patch = patch
function patch (a, loose) {
  return new SemVer(a, loose).patch
}

exports.compare = compare
function compare (a, b, loose) {
  return new SemVer(a, loose).compare(new SemVer(b, loose))
}

exports.compareLoose = compareLoose
function compareLoose (a, b) {
  return compare(a, b, true)
}

exports.compareBuild = compareBuild
function compareBuild (a, b, loose) {
  var versionA = new SemVer(a, loose)
  var versionB = new SemVer(b, loose)
  return versionA.compare(versionB) || versionA.compareBuild(versionB)
}

exports.rcompare = rcompare
function rcompare (a, b, loose) {
  return compare(b, a, loose)
}

exports.sort = sort
function sort (list, loose) {
  return list.sort(function (a, b) {
    return exports.compareBuild(a, b, loose)
  })
}

exports.rsort = rsort
function rsort (list, loose) {
  return list.sort(function (a, b) {
    return exports.compareBuild(b, a, loose)
  })
}

exports.gt = gt
function gt (a, b, loose) {
  return compare(a, b, loose) > 0
}

exports.lt = lt
function lt (a, b, loose) {
  return compare(a, b, loose) < 0
}

exports.eq = eq
function eq (a, b, loose) {
  return compare(a, b, loose) === 0
}

exports.neq = neq
function neq (a, b, loose) {
  return compare(a, b, loose) !== 0
}

exports.gte = gte
function gte (a, b, loose) {
  return compare(a, b, loose) >= 0
}

exports.lte = lte
function lte (a, b, loose) {
  return compare(a, b, loose) <= 0
}

exports.cmp = cmp
function cmp (a, op, b, loose) {
  switch (op) {
    case '===':
      if (typeof a === 'object')
        a = a.version
      if (typeof b === 'object')
        b = b.version
      return a === b

    case '!==':
      if (typeof a === 'object')
        a = a.version
      if (typeof b === 'object')
        b = b.version
      return a !== b

    case '':
    case '=':
    case '==':
      return eq(a, b, loose)

    case '!=':
      return neq(a, b, loose)

    case '>':
      return gt(a, b, loose)

    case '>=':
      return gte(a, b, loose)

    case '<':
      return lt(a, b, loose)

    case '<=':
      return lte(a, b, loose)

    default:
      throw new TypeError('Invalid operator: ' + op)
  }
}

exports.Comparator = Comparator
function Comparator (comp, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (comp instanceof Comparator) {
    if (comp.loose === !!options.loose) {
      return comp
    } else {
      comp = comp.value
    }
  }

  if (!(this instanceof Comparator)) {
    return new Comparator(comp, options)
  }

  debug('comparator', comp, options)
  this.options = options
  this.loose = !!options.loose
  this.parse(comp)

  if (this.semver === ANY) {
    this.value = ''
  } else {
    this.value = this.operator + this.semver.version
  }

  debug('comp', this)
}

var ANY = {}
Comparator.prototype.parse = function (comp) {
  var r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
  var m = comp.match(r)

  if (!m) {
    throw new TypeError('Invalid comparator: ' + comp)
  }

  this.operator = m[1] !== undefined ? m[1] : ''
  if (this.operator === '=') {
    this.operator = ''
  }

  // if it literally is just '>' or '' then allow anything.
  if (!m[2]) {
    this.semver = ANY
  } else {
    this.semver = new SemVer(m[2], this.options.loose)
  }
}

Comparator.prototype.toString = function () {
  return this.value
}

Comparator.prototype.test = function (version) {
  debug('Comparator.test', version, this.options.loose)

  if (this.semver === ANY || version === ANY) {
    return true
  }

  if (typeof version === 'string') {
    try {
      version = new SemVer(version, this.options)
    } catch (er) {
      return false
    }
  }

  return cmp(version, this.operator, this.semver, this.options)
}

Comparator.prototype.intersects = function (comp, options) {
  if (!(comp instanceof Comparator)) {
    throw new TypeError('a Comparator is required')
  }

  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  var rangeTmp

  if (this.operator === '') {
    if (this.value === '') {
      return true
    }
    rangeTmp = new Range(comp.value, options)
    return satisfies(this.value, rangeTmp, options)
  } else if (comp.operator === '') {
    if (comp.value === '') {
      return true
    }
    rangeTmp = new Range(this.value, options)
    return satisfies(comp.semver, rangeTmp, options)
  }

  var sameDirectionIncreasing =
    (this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '>=' || comp.operator === '>')
  var sameDirectionDecreasing =
    (this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '<=' || comp.operator === '<')
  var sameSemVer = this.semver.version === comp.semver.version
  var differentDirectionsInclusive =
    (this.operator === '>=' || this.operator === '<=') &&
    (comp.operator === '>=' || comp.operator === '<=')
  var oppositeDirectionsLessThan =
    cmp(this.semver, '<', comp.semver, options) &&
    ((this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '<=' || comp.operator === '<'))
  var oppositeDirectionsGreaterThan =
    cmp(this.semver, '>', comp.semver, options) &&
    ((this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '>=' || comp.operator === '>'))

  return sameDirectionIncreasing || sameDirectionDecreasing ||
    (sameSemVer && differentDirectionsInclusive) ||
    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan
}

exports.Range = Range
function Range (range, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (range instanceof Range) {
    if (range.loose === !!options.loose &&
        range.includePrerelease === !!options.includePrerelease) {
      return range
    } else {
      return new Range(range.raw, options)
    }
  }

  if (range instanceof Comparator) {
    return new Range(range.value, options)
  }

  if (!(this instanceof Range)) {
    return new Range(range, options)
  }

  this.options = options
  this.loose = !!options.loose
  this.includePrerelease = !!options.includePrerelease

  // First, split based on boolean or ||
  this.raw = range
  this.set = range.split(/\s*\|\|\s*/).map(function (range) {
    return this.parseRange(range.trim())
  }, this).filter(function (c) {
    // throw out any that are not relevant for whatever reason
    return c.length
  })

  if (!this.set.length) {
    throw new TypeError('Invalid SemVer Range: ' + range)
  }

  this.format()
}

Range.prototype.format = function () {
  this.range = this.set.map(function (comps) {
    return comps.join(' ').trim()
  }).join('||').trim()
  return this.range
}

Range.prototype.toString = function () {
  return this.range
}

Range.prototype.parseRange = function (range) {
  var loose = this.options.loose
  range = range.trim()
  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
  var hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]
  range = range.replace(hr, hyphenReplace)
  debug('hyphen replace', range)
  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
  range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)
  debug('comparator trim', range, re[t.COMPARATORTRIM])

  // `~ 1.2.3` => `~1.2.3`
  range = range.replace(re[t.TILDETRIM], tildeTrimReplace)

  // `^ 1.2.3` => `^1.2.3`
  range = range.replace(re[t.CARETTRIM], caretTrimReplace)

  // normalize spaces
  range = range.split(/\s+/).join(' ')

  // At this point, the range is completely trimmed and
  // ready to be split into comparators.

  var compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
  var set = range.split(' ').map(function (comp) {
    return parseComparator(comp, this.options)
  }, this).join(' ').split(/\s+/)
  if (this.options.loose) {
    // in loose mode, throw out any that are not valid comparators
    set = set.filter(function (comp) {
      return !!comp.match(compRe)
    })
  }
  set = set.map(function (comp) {
    return new Comparator(comp, this.options)
  }, this)

  return set
}

Range.prototype.intersects = function (range, options) {
  if (!(range instanceof Range)) {
    throw new TypeError('a Range is required')
  }

  return this.set.some(function (thisComparators) {
    return (
      isSatisfiable(thisComparators, options) &&
      range.set.some(function (rangeComparators) {
        return (
          isSatisfiable(rangeComparators, options) &&
          thisComparators.every(function (thisComparator) {
            return rangeComparators.every(function (rangeComparator) {
              return thisComparator.intersects(rangeComparator, options)
            })
          })
        )
      })
    )
  })
}

// take a set of comparators and determine whether there
// exists a version which can satisfy it
function isSatisfiable (comparators, options) {
  var result = true
  var remainingComparators = comparators.slice()
  var testComparator = remainingComparators.pop()

  while (result && remainingComparators.length) {
    result = remainingComparators.every(function (otherComparator) {
      return testComparator.intersects(otherComparator, options)
    })

    testComparator = remainingComparators.pop()
  }

  return result
}

// Mostly just for testing and legacy API reasons
exports.toComparators = toComparators
function toComparators (range, options) {
  return new Range(range, options).set.map(function (comp) {
    return comp.map(function (c) {
      return c.value
    }).join(' ').trim().split(' ')
  })
}

// comprised of xranges, tildes, stars, and gtlt's at this point.
// already replaced the hyphen ranges
// turn into a set of JUST comparators.
function parseComparator (comp, options) {
  debug('comp', comp, options)
  comp = replaceCarets(comp, options)
  debug('caret', comp)
  comp = replaceTildes(comp, options)
  debug('tildes', comp)
  comp = replaceXRanges(comp, options)
  debug('xrange', comp)
  comp = replaceStars(comp, options)
  debug('stars', comp)
  return comp
}

function isX (id) {
  return !id || id.toLowerCase() === 'x' || id === '*'
}

// ~, ~> --> * (any, kinda silly)
// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
function replaceTildes (comp, options) {
  return comp.trim().split(/\s+/).map(function (comp) {
    return replaceTilde(comp, options)
  }).join(' ')
}

function replaceTilde (comp, options) {
  var r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]
  return comp.replace(r, function (_, M, m, p, pr) {
    debug('tilde', comp, _, M, m, p, pr)
    var ret

    if (isX(M)) {
      ret = ''
    } else if (isX(m)) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
    } else if (isX(p)) {
      // ~1.2 == >=1.2.0 <1.3.0
      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
    } else if (pr) {
      debug('replaceTilde pr', pr)
      ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
            ' <' + M + '.' + (+m + 1) + '.0'
    } else {
      // ~1.2.3 == >=1.2.3 <1.3.0
      ret = '>=' + M + '.' + m + '.' + p +
            ' <' + M + '.' + (+m + 1) + '.0'
    }

    debug('tilde return', ret)
    return ret
  })
}

// ^ --> * (any, kinda silly)
// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
// ^1.2.3 --> >=1.2.3 <2.0.0
// ^1.2.0 --> >=1.2.0 <2.0.0
function replaceCarets (comp, options) {
  return comp.trim().split(/\s+/).map(function (comp) {
    return replaceCaret(comp, options)
  }).join(' ')
}

function replaceCaret (comp, options) {
  debug('caret', comp, options)
  var r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]
  return comp.replace(r, function (_, M, m, p, pr) {
    debug('caret', comp, _, M, m, p, pr)
    var ret

    if (isX(M)) {
      ret = ''
    } else if (isX(m)) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
    } else if (isX(p)) {
      if (M === '0') {
        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
      } else {
        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'
      }
    } else if (pr) {
      debug('replaceCaret pr', pr)
      if (M === '0') {
        if (m === '0') {
          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
                ' <' + M + '.' + m + '.' + (+p + 1)
        } else {
          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
                ' <' + M + '.' + (+m + 1) + '.0'
        }
      } else {
        ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
              ' <' + (+M + 1) + '.0.0'
      }
    } else {
      debug('no pr')
      if (M === '0') {
        if (m === '0') {
          ret = '>=' + M + '.' + m + '.' + p +
                ' <' + M + '.' + m + '.' + (+p + 1)
        } else {
          ret = '>=' + M + '.' + m + '.' + p +
                ' <' + M + '.' + (+m + 1) + '.0'
        }
      } else {
        ret = '>=' + M + '.' + m + '.' + p +
              ' <' + (+M + 1) + '.0.0'
      }
    }

    debug('caret return', ret)
    return ret
  })
}

function replaceXRanges (comp, options) {
  debug('replaceXRanges', comp, options)
  return comp.split(/\s+/).map(function (comp) {
    return replaceXRange(comp, options)
  }).join(' ')
}

function replaceXRange (comp, options) {
  comp = comp.trim()
  var r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]
  return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
    debug('xRange', comp, ret, gtlt, M, m, p, pr)
    var xM = isX(M)
    var xm = xM || isX(m)
    var xp = xm || isX(p)
    var anyX = xp

    if (gtlt === '=' && anyX) {
      gtlt = ''
    }

    // if we're including prereleases in the match, then we need
    // to fix this to -0, the lowest possible prerelease value
    pr = options.includePrerelease ? '-0' : ''

    if (xM) {
      if (gtlt === '>' || gtlt === '<') {
        // nothing is allowed
        ret = '<0.0.0-0'
      } else {
        // nothing is forbidden
        ret = '*'
      }
    } else if (gtlt && anyX) {
      // we know patch is an x, because we have any x at all.
      // replace X with 0
      if (xm) {
        m = 0
      }
      p = 0

      if (gtlt === '>') {
        // >1 => >=2.0.0
        // >1.2 => >=1.3.0
        // >1.2.3 => >= 1.2.4
        gtlt = '>='
        if (xm) {
          M = +M + 1
          m = 0
          p = 0
        } else {
          m = +m + 1
          p = 0
        }
      } else if (gtlt === '<=') {
        // <=0.7.x is actually <0.8.0, since any 0.7.x should
        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
        gtlt = '<'
        if (xm) {
          M = +M + 1
        } else {
          m = +m + 1
        }
      }

      ret = gtlt + M + '.' + m + '.' + p + pr
    } else if (xm) {
      ret = '>=' + M + '.0.0' + pr + ' <' + (+M + 1) + '.0.0' + pr
    } else if (xp) {
      ret = '>=' + M + '.' + m + '.0' + pr +
        ' <' + M + '.' + (+m + 1) + '.0' + pr
    }

    debug('xRange return', ret)

    return ret
  })
}

// Because * is AND-ed with everything else in the comparator,
// and '' means "any version", just remove the *s entirely.
function replaceStars (comp, options) {
  debug('replaceStars', comp, options)
  // Looseness is ignored here.  star is always as loose as it gets!
  return comp.trim().replace(re[t.STAR], '')
}

// This function is passed to string.replace(re[t.HYPHENRANGE])
// M, m, patch, prerelease, build
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
// 1.2 - 3.4 => >=1.2.0 <3.5.0
function hyphenReplace ($0,
  from, fM, fm, fp, fpr, fb,
  to, tM, tm, tp, tpr, tb) {
  if (isX(fM)) {
    from = ''
  } else if (isX(fm)) {
    from = '>=' + fM + '.0.0'
  } else if (isX(fp)) {
    from = '>=' + fM + '.' + fm + '.0'
  } else {
    from = '>=' + from
  }

  if (isX(tM)) {
    to = ''
  } else if (isX(tm)) {
    to = '<' + (+tM + 1) + '.0.0'
  } else if (isX(tp)) {
    to = '<' + tM + '.' + (+tm + 1) + '.0'
  } else if (tpr) {
    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr
  } else {
    to = '<=' + to
  }

  return (from + ' ' + to).trim()
}

// if ANY of the sets match ALL of its comparators, then pass
Range.prototype.test = function (version) {
  if (!version) {
    return false
  }

  if (typeof version === 'string') {
    try {
      version = new SemVer(version, this.options)
    } catch (er) {
      return false
    }
  }

  for (var i = 0; i < this.set.length; i++) {
    if (testSet(this.set[i], version, this.options)) {
      return true
    }
  }
  return false
}

function testSet (set, version, options) {
  for (var i = 0; i < set.length; i++) {
    if (!set[i].test(version)) {
      return false
    }
  }

  if (version.prerelease.length && !options.includePrerelease) {
    // Find the set of versions that are allowed to have prereleases
    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
    // That should allow `1.2.3-pr.2` to pass.
    // However, `1.2.4-alpha.notready` should NOT be allowed,
    // even though it's within the range set by the comparators.
    for (i = 0; i < set.length; i++) {
      debug(set[i].semver)
      if (set[i].semver === ANY) {
        continue
      }

      if (set[i].semver.prerelease.length > 0) {
        var allowed = set[i].semver
        if (allowed.major === version.major &&
            allowed.minor === version.minor &&
            allowed.patch === version.patch) {
          return true
        }
      }
    }

    // Version has a -pre, but it's not one of the ones we like.
    return false
  }

  return true
}

exports.satisfies = satisfies
function satisfies (version, range, options) {
  try {
    range = new Range(range, options)
  } catch (er) {
    return false
  }
  return range.test(version)
}

exports.maxSatisfying = maxSatisfying
function maxSatisfying (versions, range, options) {
  var max = null
  var maxSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (v) {
    if (rangeObj.test(v)) {
      // satisfies(v, range, options)
      if (!max || maxSV.compare(v) === -1) {
        // compare(max, v, true)
        max = v
        maxSV = new SemVer(max, options)
      }
    }
  })
  return max
}

exports.minSatisfying = minSatisfying
function minSatisfying (versions, range, options) {
  var min = null
  var minSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (v) {
    if (rangeObj.test(v)) {
      // satisfies(v, range, options)
      if (!min || minSV.compare(v) === 1) {
        // compare(min, v, true)
        min = v
        minSV = new SemVer(min, options)
      }
    }
  })
  return min
}

exports.minVersion = minVersion
function minVersion (range, loose) {
  range = new Range(range, loose)

  var minver = new SemVer('0.0.0')
  if (range.test(minver)) {
    return minver
  }

  minver = new SemVer('0.0.0-0')
  if (range.test(minver)) {
    return minver
  }

  minver = null
  for (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    comparators.forEach(function (comparator) {
      // Clone to avoid manipulating the comparator's semver object.
      var compver = new SemVer(comparator.semver.version)
      switch (comparator.operator) {
        case '>':
          if (compver.prerelease.length === 0) {
            compver.patch++
          } else {
            compver.prerelease.push(0)
          }
          compver.raw = compver.format()
          /* fallthrough */
        case '':
        case '>=':
          if (!minver || gt(minver, compver)) {
            minver = compver
          }
          break
        case '<':
        case '<=':
          /* Ignore maximum versions */
          break
        /* istanbul ignore next */
        default:
          throw new Error('Unexpected operation: ' + comparator.operator)
      }
    })
  }

  if (minver && range.test(minver)) {
    return minver
  }

  return null
}

exports.validRange = validRange
function validRange (range, options) {
  try {
    // Return '*' instead of '' so that truthiness works.
    // This will throw if it's invalid anyway
    return new Range(range, options).range || '*'
  } catch (er) {
    return null
  }
}

// Determine if version is less than all the versions possible in the range
exports.ltr = ltr
function ltr (version, range, options) {
  return outside(version, range, '<', options)
}

// Determine if version is greater than all the versions possible in the range.
exports.gtr = gtr
function gtr (version, range, options) {
  return outside(version, range, '>', options)
}

exports.outside = outside
function outside (version, range, hilo, options) {
  version = new SemVer(version, options)
  range = new Range(range, options)

  var gtfn, ltefn, ltfn, comp, ecomp
  switch (hilo) {
    case '>':
      gtfn = gt
      ltefn = lte
      ltfn = lt
      comp = '>'
      ecomp = '>='
      break
    case '<':
      gtfn = lt
      ltefn = gte
      ltfn = gt
      comp = '<'
      ecomp = '<='
      break
    default:
      throw new TypeError('Must provide a hilo val of "<" or ">"')
  }

  // If it satisifes the range it is not outside
  if (satisfies(version, range, options)) {
    return false
  }

  // From now on, variable terms are as if we're in "gtr" mode.
  // but note that everything is flipped for the "ltr" function.

  for (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    var high = null
    var low = null

    comparators.forEach(function (comparator) {
      if (comparator.semver === ANY) {
        comparator = new Comparator('>=0.0.0')
      }
      high = high || comparator
      low = low || comparator
      if (gtfn(comparator.semver, high.semver, options)) {
        high = comparator
      } else if (ltfn(comparator.semver, low.semver, options)) {
        low = comparator
      }
    })

    // If the edge version comparator has a operator then our version
    // isn't outside it
    if (high.operator === comp || high.operator === ecomp) {
      return false
    }

    // If the lowest version comparator has an operator and our version
    // is less than it then it isn't higher than the range
    if ((!low.operator || low.operator === comp) &&
        ltefn(version, low.semver)) {
      return false
    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
      return false
    }
  }
  return true
}

exports.prerelease = prerelease
function prerelease (version, options) {
  var parsed = parse(version, options)
  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
}

exports.intersects = intersects
function intersects (r1, r2, options) {
  r1 = new Range(r1, options)
  r2 = new Range(r2, options)
  return r1.intersects(r2)
}

exports.coerce = coerce
function coerce (version, options) {
  if (version instanceof SemVer) {
    return version
  }

  if (typeof version === 'number') {
    version = String(version)
  }

  if (typeof version !== 'string') {
    return null
  }

  options = options || {}

  var match = null
  if (!options.rtl) {
    match = version.match(re[t.COERCE])
  } else {
    // Find the right-most coercible string that does not share
    // a terminus with a more left-ward coercible string.
    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
    //
    // Walk through the string checking with a /g regexp
    // Manually set the index so as to pick up overlapping matches.
    // Stop when we get a match that ends at the string end, since no
    // coercible string can be more right-ward without the same terminus.
    var next
    while ((next = re[t.COERCERTL].exec(version)) &&
      (!match || match.index + match[0].length !== version.length)
    ) {
      if (!match ||
          next.index + next[0].length !== match.index + match[0].length) {
        match = next
      }
      re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length
    }
    // leave it in a clean state
    re[t.COERCERTL].lastIndex = -1
  }

  if (match === null) {
    return null
  }

  return parse(match[2] +
    '.' + (match[3] || '0') +
    '.' + (match[4] || '0'), options)
}
#!/usr/bin/env node
// Standalone semver comparison program.
// Exits successfully and prints matching version(s) if
// any supplied version is valid and passes all tests.

var argv = process.argv.slice(2)

var versions = []

var range = []

var inc = null

var version = require('../package.json').version

var loose = false

var includePrerelease = false

var coerce = false

var rtl = false

var identifier

var semver = require('../semver')

var reverse = false

var options = {}

main()

function main () {
  if (!argv.length) return help()
  while (argv.length) {
    var a = argv.shift()
    var indexOfEqualSign = a.indexOf('=')
    if (indexOfEqualSign !== -1) {
      a = a.slice(0, indexOfEqualSign)
      argv.unshift(a.slice(indexOfEqualSign + 1))
    }
    switch (a) {
      case '-rv': case '-rev': case '--rev': case '--reverse':
        reverse = true
        break
      case '-l': case '--loose':
        loose = true
        break
      case '-p': case '--include-prerelease':
        includePrerelease = true
        break
      case '-v': case '--version':
        versions.push(argv.shift())
        break
      case '-i': case '--inc': case '--increment':
        switch (argv[0]) {
          case 'major': case 'minor': case 'patch': case 'prerelease':
          case 'premajor': case 'preminor': case 'prepatch':
            inc = argv.shift()
            break
          default:
            inc = 'patch'
            break
        }
        break
      case '--preid':
        identifier = argv.shift()
        break
      case '-r': case '--range':
        range.push(argv.shift())
        break
      case '-c': case '--coerce':
        coerce = true
        break
      case '--rtl':
        rtl = true
        break
      case '--ltr':
        rtl = false
        break
      case '-h': case '--help': case '-?':
        return help()
      default:
        versions.push(a)
        break
    }
  }

  var options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }

  versions = versions.map(function (v) {
    return coerce ? (semver.coerce(v, options) || { version: v }).version : v
  }).filter(function (v) {
    return semver.valid(v)
  })
  if (!versions.length) return fail()
  if (inc && (versions.length !== 1 || range.length)) { return failInc() }

  for (var i = 0, l = range.length; i < l; i++) {
    versions = versions.filter(function (v) {
      return semver.satisfies(v, range[i], options)
    })
    if (!versions.length) return fail()
  }
  return success(versions)
}

function failInc () {
  console.error('--inc can only be used on a single version with no range')
  fail()
}

function fail () { process.exit(1) }

function success () {
  var compare = reverse ? 'rcompare' : 'compare'
  versions.sort(function (a, b) {
    return semver[compare](a, b, options)
  }).map(function (v) {
    return semver.clean(v, options)
  }).map(function (v) {
    return inc ? semver.inc(v, inc, options, identifier) : v
  }).forEach(function (v, i, _) { console.log(v) })
}

function help () {
  console.log(['SemVer ' + version,
    '',
    'A JavaScript implementation of the https://semver.org/ specification',
    'Copyright Isaac Z. Schlueter',
    '',
    'Usage: semver [options] <version> [<version> [...]]',
    'Prints valid versions sorted by SemVer precedence',
    '',
    'Options:',
    '-r --range <range>',
    '        Print versions that match the specified range.',
    '',
    '-i --increment [<level>]',
    '        Increment a version by the specified level.  Level can',
    '        be one of: major, minor, patch, premajor, preminor,',
    "        prepatch, or prerelease.  Default level is 'patch'.",
    '        Only one version may be specified.',
    '',
    '--preid <identifier>',
    '        Identifier to be used to prefix premajor, preminor,',
    '        prepatch or prerelease version increments.',
    '',
    '-l --loose',
    '        Interpret versions and ranges loosely',
    '',
    '-p --include-prerelease',
    '        Always include prerelease versions in range matching',
    '',
    '-c --coerce',
    '        Coerce a string into SemVer if possible',
    '        (does not imply --loose)',
    '',
    '--rtl',
    '        Coerce version strings right to left',
    '',
    '--ltr',
    '        Coerce version strings left to right (default)',
    '',
    'Program exits successfully if any valid version satisfies',
    'all supplied ranges, and prints all satisfying versions.',
    '',
    'If no satisfying versions are found, then exits failure.',
    '',
    'Versions are printed in ascending order, so supplying',
    'multiple versions to the utility will just sort them.'
  ].join('\n'))
}
Copyright (c) 2011 Heather Arthur <fayearthur@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

{
  "name": "color-convert",
  "description": "Plain color conversion functions",
  "version": "0.5.3",
  "author": "Heather Arthur <fayearthur@gmail.com>",
  "repository": "harthur/color-convert",
  "keywords": ["color", "colour", "rgb"],
  "scripts": ["index.js", "conversions.js"]
}
/* MIT license */

module.exports = {
  rgb2hsl: rgb2hsl,
  rgb2hsv: rgb2hsv,
  rgb2hwb: rgb2hwb,
  rgb2cmyk: rgb2cmyk,
  rgb2keyword: rgb2keyword,
  rgb2xyz: rgb2xyz,
  rgb2lab: rgb2lab,
  rgb2lch: rgb2lch,

  hsl2rgb: hsl2rgb,
  hsl2hsv: hsl2hsv,
  hsl2hwb: hsl2hwb,
  hsl2cmyk: hsl2cmyk,
  hsl2keyword: hsl2keyword,

  hsv2rgb: hsv2rgb,
  hsv2hsl: hsv2hsl,
  hsv2hwb: hsv2hwb,
  hsv2cmyk: hsv2cmyk,
  hsv2keyword: hsv2keyword,

  hwb2rgb: hwb2rgb,
  hwb2hsl: hwb2hsl,
  hwb2hsv: hwb2hsv,
  hwb2cmyk: hwb2cmyk,
  hwb2keyword: hwb2keyword,

  cmyk2rgb: cmyk2rgb,
  cmyk2hsl: cmyk2hsl,
  cmyk2hsv: cmyk2hsv,
  cmyk2hwb: cmyk2hwb,
  cmyk2keyword: cmyk2keyword,

  keyword2rgb: keyword2rgb,
  keyword2hsl: keyword2hsl,
  keyword2hsv: keyword2hsv,
  keyword2hwb: keyword2hwb,
  keyword2cmyk: keyword2cmyk,
  keyword2lab: keyword2lab,
  keyword2xyz: keyword2xyz,

  xyz2rgb: xyz2rgb,
  xyz2lab: xyz2lab,
  xyz2lch: xyz2lch,

  lab2xyz: lab2xyz,
  lab2rgb: lab2rgb,
  lab2lch: lab2lch,

  lch2lab: lch2lab,
  lch2xyz: lch2xyz,
  lch2rgb: lch2rgb
}


function rgb2hsl(rgb) {
  var r = rgb[0]/255,
      g = rgb[1]/255,
      b = rgb[2]/255,
      min = Math.min(r, g, b),
      max = Math.max(r, g, b),
      delta = max - min,
      h, s, l;

  if (max == min)
    h = 0;
  else if (r == max)
    h = (g - b) / delta;
  else if (g == max)
    h = 2 + (b - r) / delta;
  else if (b == max)
    h = 4 + (r - g)/ delta;

  h = Math.min(h * 60, 360);

  if (h < 0)
    h += 360;

  l = (min + max) / 2;

  if (max == min)
    s = 0;
  else if (l <= 0.5)
    s = delta / (max + min);
  else
    s = delta / (2 - max - min);

  return [h, s * 100, l * 100];
}

function rgb2hsv(rgb) {
  var r = rgb[0],
      g = rgb[1],
      b = rgb[2],
      min = Math.min(r, g, b),
      max = Math.max(r, g, b),
      delta = max - min,
      h, s, v;

  if (max == 0)
    s = 0;
  else
    s = (delta/max * 1000)/10;

  if (max == min)
    h = 0;
  else if (r == max)
    h = (g - b) / delta;
  else if (g == max)
    h = 2 + (b - r) / delta;
  else if (b == max)
    h = 4 + (r - g) / delta;

  h = Math.min(h * 60, 360);

  if (h < 0)
    h += 360;

  v = ((max / 255) * 1000) / 10;

  return [h, s, v];
}

function rgb2hwb(rgb) {
  var r = rgb[0],
      g = rgb[1],
      b = rgb[2],
      h = rgb2hsl(rgb)[0],
      w = 1/255 * Math.min(r, Math.min(g, b)),
      b = 1 - 1/255 * Math.max(r, Math.max(g, b));

  return [h, w * 100, b * 100];
}

function rgb2cmyk(rgb) {
  var r = rgb[0] / 255,
      g = rgb[1] / 255,
      b = rgb[2] / 255,
      c, m, y, k;

  k = Math.min(1 - r, 1 - g, 1 - b);
  c = (1 - r - k) / (1 - k) || 0;
  m = (1 - g - k) / (1 - k) || 0;
  y = (1 - b - k) / (1 - k) || 0;
  return [c * 100, m * 100, y * 100, k * 100];
}

function rgb2keyword(rgb) {
  return reverseKeywords[JSON.stringify(rgb)];
}

function rgb2xyz(rgb) {
  var r = rgb[0] / 255,
      g = rgb[1] / 255,
      b = rgb[2] / 255;

  // assume sRGB
  r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
  g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
  b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);

  var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
  var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
  var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);

  return [x * 100, y *100, z * 100];
}

function rgb2lab(rgb) {
  var xyz = rgb2xyz(rgb),
        x = xyz[0],
        y = xyz[1],
        z = xyz[2],
        l, a, b;

  x /= 95.047;
  y /= 100;
  z /= 108.883;

  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);
  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);
  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);

  l = (116 * y) - 16;
  a = 500 * (x - y);
  b = 200 * (y - z);

  return [l, a, b];
}

function rgb2lch(args) {
  return lab2lch(rgb2lab(args));
}

function hsl2rgb(hsl) {
  var h = hsl[0] / 360,
      s = hsl[1] / 100,
      l = hsl[2] / 100,
      t1, t2, t3, rgb, val;

  if (s == 0) {
    val = l * 255;
    return [val, val, val];
  }

  if (l < 0.5)
    t2 = l * (1 + s);
  else
    t2 = l + s - l * s;
  t1 = 2 * l - t2;

  rgb = [0, 0, 0];
  for (var i = 0; i < 3; i++) {
    t3 = h + 1 / 3 * - (i - 1);
    t3 < 0 && t3++;
    t3 > 1 && t3--;

    if (6 * t3 < 1)
      val = t1 + (t2 - t1) * 6 * t3;
    else if (2 * t3 < 1)
      val = t2;
    else if (3 * t3 < 2)
      val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
    else
      val = t1;

    rgb[i] = val * 255;
  }

  return rgb;
}

function hsl2hsv(hsl) {
  var h = hsl[0],
      s = hsl[1] / 100,
      l = hsl[2] / 100,
      sv, v;

  if(l === 0) {
      // no need to do calc on black
      // also avoids divide by 0 error
      return [0, 0, 0];
  }

  l *= 2;
  s *= (l <= 1) ? l : 2 - l;
  v = (l + s) / 2;
  sv = (2 * s) / (l + s);
  return [h, sv * 100, v * 100];
}

function hsl2hwb(args) {
  return rgb2hwb(hsl2rgb(args));
}

function hsl2cmyk(args) {
  return rgb2cmyk(hsl2rgb(args));
}

function hsl2keyword(args) {
  return rgb2keyword(hsl2rgb(args));
}


function hsv2rgb(hsv) {
  var h = hsv[0] / 60,
      s = hsv[1] / 100,
      v = hsv[2] / 100,
      hi = Math.floor(h) % 6;

  var f = h - Math.floor(h),
      p = 255 * v * (1 - s),
      q = 255 * v * (1 - (s * f)),
      t = 255 * v * (1 - (s * (1 - f))),
      v = 255 * v;

  switch(hi) {
    case 0:
      return [v, t, p];
    case 1:
      return [q, v, p];
    case 2:
      return [p, v, t];
    case 3:
      return [p, q, v];
    case 4:
      return [t, p, v];
    case 5:
      return [v, p, q];
  }
}

function hsv2hsl(hsv) {
  var h = hsv[0],
      s = hsv[1] / 100,
      v = hsv[2] / 100,
      sl, l;

  l = (2 - s) * v;
  sl = s * v;
  sl /= (l <= 1) ? l : 2 - l;
  sl = sl || 0;
  l /= 2;
  return [h, sl * 100, l * 100];
}

function hsv2hwb(args) {
  return rgb2hwb(hsv2rgb(args))
}

function hsv2cmyk(args) {
  return rgb2cmyk(hsv2rgb(args));
}

function hsv2keyword(args) {
  return rgb2keyword(hsv2rgb(args));
}

// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
function hwb2rgb(hwb) {
  var h = hwb[0] / 360,
      wh = hwb[1] / 100,
      bl = hwb[2] / 100,
      ratio = wh + bl,
      i, v, f, n;

  // wh + bl cant be > 1
  if (ratio > 1) {
    wh /= ratio;
    bl /= ratio;
  }

  i = Math.floor(6 * h);
  v = 1 - bl;
  f = 6 * h - i;
  if ((i & 0x01) != 0) {
    f = 1 - f;
  }
  n = wh + f * (v - wh);  // linear interpolation

  switch (i) {
    default:
    case 6:
    case 0: r = v; g = n; b = wh; break;
    case 1: r = n; g = v; b = wh; break;
    case 2: r = wh; g = v; b = n; break;
    case 3: r = wh; g = n; b = v; break;
    case 4: r = n; g = wh; b = v; break;
    case 5: r = v; g = wh; b = n; break;
  }

  return [r * 255, g * 255, b * 255];
}

function hwb2hsl(args) {
  return rgb2hsl(hwb2rgb(args));
}

function hwb2hsv(args) {
  return rgb2hsv(hwb2rgb(args));
}

function hwb2cmyk(args) {
  return rgb2cmyk(hwb2rgb(args));
}

function hwb2keyword(args) {
  return rgb2keyword(hwb2rgb(args));
}

function cmyk2rgb(cmyk) {
  var c = cmyk[0] / 100,
      m = cmyk[1] / 100,
      y = cmyk[2] / 100,
      k = cmyk[3] / 100,
      r, g, b;

  r = 1 - Math.min(1, c * (1 - k) + k);
  g = 1 - Math.min(1, m * (1 - k) + k);
  b = 1 - Math.min(1, y * (1 - k) + k);
  return [r * 255, g * 255, b * 255];
}

function cmyk2hsl(args) {
  return rgb2hsl(cmyk2rgb(args));
}

function cmyk2hsv(args) {
  return rgb2hsv(cmyk2rgb(args));
}

function cmyk2hwb(args) {
  return rgb2hwb(cmyk2rgb(args));
}

function cmyk2keyword(args) {
  return rgb2keyword(cmyk2rgb(args));
}


function xyz2rgb(xyz) {
  var x = xyz[0] / 100,
      y = xyz[1] / 100,
      z = xyz[2] / 100,
      r, g, b;

  r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
  g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
  b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);

  // assume sRGB
  r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
    : r = (r * 12.92);

  g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
    : g = (g * 12.92);

  b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
    : b = (b * 12.92);

  r = Math.min(Math.max(0, r), 1);
  g = Math.min(Math.max(0, g), 1);
  b = Math.min(Math.max(0, b), 1);

  return [r * 255, g * 255, b * 255];
}

function xyz2lab(xyz) {
  var x = xyz[0],
      y = xyz[1],
      z = xyz[2],
      l, a, b;

  x /= 95.047;
  y /= 100;
  z /= 108.883;

  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);
  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);
  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);

  l = (116 * y) - 16;
  a = 500 * (x - y);
  b = 200 * (y - z);

  return [l, a, b];
}

function xyz2lch(args) {
  return lab2lch(xyz2lab(args));
}

function lab2xyz(lab) {
  var l = lab[0],
      a = lab[1],
      b = lab[2],
      x, y, z, y2;

  if (l <= 8) {
    y = (l * 100) / 903.3;
    y2 = (7.787 * (y / 100)) + (16 / 116);
  } else {
    y = 100 * Math.pow((l + 16) / 116, 3);
    y2 = Math.pow(y / 100, 1/3);
  }

  x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);

  z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);

  return [x, y, z];
}

function lab2lch(lab) {
  var l = lab[0],
      a = lab[1],
      b = lab[2],
      hr, h, c;

  hr = Math.atan2(b, a);
  h = hr * 360 / 2 / Math.PI;
  if (h < 0) {
    h += 360;
  }
  c = Math.sqrt(a * a + b * b);
  return [l, c, h];
}

function lab2rgb(args) {
  return xyz2rgb(lab2xyz(args));
}

function lch2lab(lch) {
  var l = lch[0],
      c = lch[1],
      h = lch[2],
      a, b, hr;

  hr = h / 360 * 2 * Math.PI;
  a = c * Math.cos(hr);
  b = c * Math.sin(hr);
  return [l, a, b];
}

function lch2xyz(args) {
  return lab2xyz(lch2lab(args));
}

function lch2rgb(args) {
  return lab2rgb(lch2lab(args));
}

function keyword2rgb(keyword) {
  return cssKeywords[keyword];
}

function keyword2hsl(args) {
  return rgb2hsl(keyword2rgb(args));
}

function keyword2hsv(args) {
  return rgb2hsv(keyword2rgb(args));
}

function keyword2hwb(args) {
  return rgb2hwb(keyword2rgb(args));
}

function keyword2cmyk(args) {
  return rgb2cmyk(keyword2rgb(args));
}

function keyword2lab(args) {
  return rgb2lab(keyword2rgb(args));
}

function keyword2xyz(args) {
  return rgb2xyz(keyword2rgb(args));
}

var cssKeywords = {
  aliceblue:  [240,248,255],
  antiquewhite: [250,235,215],
  aqua: [0,255,255],
  aquamarine: [127,255,212],
  azure:  [240,255,255],
  beige:  [245,245,220],
  bisque: [255,228,196],
  black:  [0,0,0],
  blanchedalmond: [255,235,205],
  blue: [0,0,255],
  blueviolet: [138,43,226],
  brown:  [165,42,42],
  burlywood:  [222,184,135],
  cadetblue:  [95,158,160],
  chartreuse: [127,255,0],
  chocolate:  [210,105,30],
  coral:  [255,127,80],
  cornflowerblue: [100,149,237],
  cornsilk: [255,248,220],
  crimson:  [220,20,60],
  cyan: [0,255,255],
  darkblue: [0,0,139],
  darkcyan: [0,139,139],
  darkgoldenrod:  [184,134,11],
  darkgray: [169,169,169],
  darkgreen:  [0,100,0],
  darkgrey: [169,169,169],
  darkkhaki:  [189,183,107],
  darkmagenta:  [139,0,139],
  darkolivegreen: [85,107,47],
  darkorange: [255,140,0],
  darkorchid: [153,50,204],
  darkred:  [139,0,0],
  darksalmon: [233,150,122],
  darkseagreen: [143,188,143],
  darkslateblue:  [72,61,139],
  darkslategray:  [47,79,79],
  darkslategrey:  [47,79,79],
  darkturquoise:  [0,206,209],
  darkviolet: [148,0,211],
  deeppink: [255,20,147],
  deepskyblue:  [0,191,255],
  dimgray:  [105,105,105],
  dimgrey:  [105,105,105],
  dodgerblue: [30,144,255],
  firebrick:  [178,34,34],
  floralwhite:  [255,250,240],
  forestgreen:  [34,139,34],
  fuchsia:  [255,0,255],
  gainsboro:  [220,220,220],
  ghostwhite: [248,248,255],
  gold: [255,215,0],
  goldenrod:  [218,165,32],
  gray: [128,128,128],
  green:  [0,128,0],
  greenyellow:  [173,255,47],
  grey: [128,128,128],
  honeydew: [240,255,240],
  hotpink:  [255,105,180],
  indianred:  [205,92,92],
  indigo: [75,0,130],
  ivory:  [255,255,240],
  khaki:  [240,230,140],
  lavender: [230,230,250],
  lavenderblush:  [255,240,245],
  lawngreen:  [124,252,0],
  lemonchiffon: [255,250,205],
  lightblue:  [173,216,230],
  lightcoral: [240,128,128],
  lightcyan:  [224,255,255],
  lightgoldenrodyellow: [250,250,210],
  lightgray:  [211,211,211],
  lightgreen: [144,238,144],
  lightgrey:  [211,211,211],
  lightpink:  [255,182,193],
  lightsalmon:  [255,160,122],
  lightseagreen:  [32,178,170],
  lightskyblue: [135,206,250],
  lightslategray: [119,136,153],
  lightslategrey: [119,136,153],
  lightsteelblue: [176,196,222],
  lightyellow:  [255,255,224],
  lime: [0,255,0],
  limegreen:  [50,205,50],
  linen:  [250,240,230],
  magenta:  [255,0,255],
  maroon: [128,0,0],
  mediumaquamarine: [102,205,170],
  mediumblue: [0,0,205],
  mediumorchid: [186,85,211],
  mediumpurple: [147,112,219],
  mediumseagreen: [60,179,113],
  mediumslateblue:  [123,104,238],
  mediumspringgreen:  [0,250,154],
  mediumturquoise:  [72,209,204],
  mediumvioletred:  [199,21,133],
  midnightblue: [25,25,112],
  mintcream:  [245,255,250],
  mistyrose:  [255,228,225],
  moccasin: [255,228,181],
  navajowhite:  [255,222,173],
  navy: [0,0,128],
  oldlace:  [253,245,230],
  olive:  [128,128,0],
  olivedrab:  [107,142,35],
  orange: [255,165,0],
  orangered:  [255,69,0],
  orchid: [218,112,214],
  palegoldenrod:  [238,232,170],
  palegreen:  [152,251,152],
  paleturquoise:  [175,238,238],
  palevioletred:  [219,112,147],
  papayawhip: [255,239,213],
  peachpuff:  [255,218,185],
  peru: [205,133,63],
  pink: [255,192,203],
  plum: [221,160,221],
  powderblue: [176,224,230],
  purple: [128,0,128],
  rebeccapurple: [102, 51, 153],
  red:  [255,0,0],
  rosybrown:  [188,143,143],
  royalblue:  [65,105,225],
  saddlebrown:  [139,69,19],
  salmon: [250,128,114],
  sandybrown: [244,164,96],
  seagreen: [46,139,87],
  seashell: [255,245,238],
  sienna: [160,82,45],
  silver: [192,192,192],
  skyblue:  [135,206,235],
  slateblue:  [106,90,205],
  slategray:  [112,128,144],
  slategrey:  [112,128,144],
  snow: [255,250,250],
  springgreen:  [0,255,127],
  steelblue:  [70,130,180],
  tan:  [210,180,140],
  teal: [0,128,128],
  thistle:  [216,191,216],
  tomato: [255,99,71],
  turquoise:  [64,224,208],
  violet: [238,130,238],
  wheat:  [245,222,179],
  white:  [255,255,255],
  whitesmoke: [245,245,245],
  yellow: [255,255,0],
  yellowgreen:  [154,205,50]
};

var reverseKeywords = {};
for (var key in cssKeywords) {
  reverseKeywords[JSON.stringify(cssKeywords[key])] = key;
}
var conversions = require("./conversions");

var convert = function() {
   return new Converter();
}

for (var func in conversions) {
  // export Raw versions
  convert[func + "Raw"] =  (function(func) {
    // accept array or plain args
    return function(arg) {
      if (typeof arg == "number")
        arg = Array.prototype.slice.call(arguments);
      return conversions[func](arg);
    }
  })(func);

  var pair = /(\w+)2(\w+)/.exec(func),
      from = pair[1],
      to = pair[2];

  // export rgb2hsl and ["rgb"]["hsl"]
  convert[from] = convert[from] || {};

  convert[from][to] = convert[func] = (function(func) { 
    return function(arg) {
      if (typeof arg == "number")
        arg = Array.prototype.slice.call(arguments);
      
      var val = conversions[func](arg);
      if (typeof val == "string" || val === undefined)
        return val; // keyword

      for (var i = 0; i < val.length; i++)
        val[i] = Math.round(val[i]);
      return val;
    }
  })(func);
}


/* Converter does lazy conversion and caching */
var Converter = function() {
   this.convs = {};
};

/* Either get the values for a space or
  set the values for a space, depending on args */
Converter.prototype.routeSpace = function(space, args) {
   var values = args[0];
   if (values === undefined) {
      // color.rgb()
      return this.getValues(space);
   }
   // color.rgb(10, 10, 10)
   if (typeof values == "number") {
      values = Array.prototype.slice.call(args);        
   }

   return this.setValues(space, values);
};
  
/* Set the values for a space, invalidating cache */
Converter.prototype.setValues = function(space, values) {
   this.space = space;
   this.convs = {};
   this.convs[space] = values;
   return this;
};

/* Get the values for a space. If there's already
  a conversion for the space, fetch it, otherwise
  compute it */
Converter.prototype.getValues = function(space) {
   var vals = this.convs[space];
   if (!vals) {
      var fspace = this.space,
          from = this.convs[fspace];
      vals = convert[fspace][space](from);

      this.convs[space] = vals;
   }
  return vals;
};

["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) {
   Converter.prototype[space] = function(vals) {
      return this.routeSpace(space, arguments);
   }
});

module.exports = convert;{
  "author": {
    "name": "Heather Arthur",
    "email": "fayearthur@gmail.com"
  },
  "deprecated": false,
  "description": "Plain color conversion functions",
  "devDependencies": {},
  "homepage": "https://github.com/harthur/color-convert#readme",
  "name": "color-convert",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/harthur/color-convert.git"
  },
  "version": "0.5.3"
}(The MIT License)

Copyright (c) 2011-2017 JP Richardson

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
 merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "JP Richardson",
    "email": "jprichardson@gmail.com"
  },
  "dependencies": {
    "graceful-fs": "^4.1.2",
    "jsonfile": "^4.0.0",
    "universalify": "^0.1.0"
  },
  "deprecated": false,
  "description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as mkdir -p, cp -r, and rm -rf.",
  "devDependencies": {
    "coveralls": "^3.0.0",
    "istanbul": "^0.4.5",
    "klaw": "^2.1.1",
    "klaw-sync": "^3.0.2",
    "minimist": "^1.1.1",
    "mocha": "^5.0.5",
    "proxyquire": "^2.0.1",
    "read-dir-files": "^0.1.1",
    "rimraf": "^2.2.8",
    "secure-random": "^1.1.1",
    "semver": "^5.3.0",
    "standard": "^11.0.1",
    "standard-markdown": "^4.0.1"
  },
  "engines": {
    "node": ">=6 <7 || >=8"
  },
  "homepage": "https://github.com/jprichardson/node-fs-extra",
  "license": "MIT",
  "main": "./lib/index.js",
  "name": "fs-extra",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jprichardson/node-fs-extra.git"
  },
  "version": "7.0.1"
}'use strict'

module.exports = Object.assign(
  {},
  // Export promiseified graceful-fs:
  require('./fs'),
  // Export extra methods:
  require('./copy-sync'),
  require('./copy'),
  require('./empty'),
  require('./ensure'),
  require('./json'),
  require('./mkdirs'),
  require('./move-sync'),
  require('./move'),
  require('./output'),
  require('./path-exists'),
  require('./remove')
)

// Export fs.promises as a getter property so that we don't trigger
// ExperimentalWarning before fs.promises is actually accessed.
const fs = require('fs')
if (Object.getOwnPropertyDescriptor(fs, 'promises')) {
  Object.defineProperty(module.exports, 'promises', {
    get () { return fs.promises }
  })
}
'use strict'
/* eslint-disable node/no-deprecated-api */
module.exports = function (size) {
  if (typeof Buffer.allocUnsafe === 'function') {
    try {
      return Buffer.allocUnsafe(size)
    } catch (e) {
      return new Buffer(size)
    }
  }
  return new Buffer(size)
}
'use strict'

const fs = require('graceful-fs')
const os = require('os')
const path = require('path')

// HFS, ext{2,3}, FAT do not, Node.js v0.10 does not
function hasMillisResSync () {
  let tmpfile = path.join('millis-test-sync' + Date.now().toString() + Math.random().toString().slice(2))
  tmpfile = path.join(os.tmpdir(), tmpfile)

  // 550 millis past UNIX epoch
  const d = new Date(1435410243862)
  fs.writeFileSync(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141')
  const fd = fs.openSync(tmpfile, 'r+')
  fs.futimesSync(fd, d, d)
  fs.closeSync(fd)
  return fs.statSync(tmpfile).mtime > 1435410243000
}

function hasMillisRes (callback) {
  let tmpfile = path.join('millis-test' + Date.now().toString() + Math.random().toString().slice(2))
  tmpfile = path.join(os.tmpdir(), tmpfile)

  // 550 millis past UNIX epoch
  const d = new Date(1435410243862)
  fs.writeFile(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141', err => {
    if (err) return callback(err)
    fs.open(tmpfile, 'r+', (err, fd) => {
      if (err) return callback(err)
      fs.futimes(fd, d, d, err => {
        if (err) return callback(err)
        fs.close(fd, err => {
          if (err) return callback(err)
          fs.stat(tmpfile, (err, stats) => {
            if (err) return callback(err)
            callback(null, stats.mtime > 1435410243000)
          })
        })
      })
    })
  })
}

function timeRemoveMillis (timestamp) {
  if (typeof timestamp === 'number') {
    return Math.floor(timestamp / 1000) * 1000
  } else if (timestamp instanceof Date) {
    return new Date(Math.floor(timestamp.getTime() / 1000) * 1000)
  } else {
    throw new Error('fs-extra: timeRemoveMillis() unknown parameter type')
  }
}

function utimesMillis (path, atime, mtime, callback) {
  // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)
  fs.open(path, 'r+', (err, fd) => {
    if (err) return callback(err)
    fs.futimes(fd, atime, mtime, futimesErr => {
      fs.close(fd, closeErr => {
        if (callback) callback(futimesErr || closeErr)
      })
    })
  })
}

function utimesMillisSync (path, atime, mtime) {
  const fd = fs.openSync(path, 'r+')
  fs.futimesSync(fd, atime, mtime)
  return fs.closeSync(fd)
}

module.exports = {
  hasMillisRes,
  hasMillisResSync,
  timeRemoveMillis,
  utimesMillis,
  utimesMillisSync
}
'use strict'

const u = require('universalify').fromCallback
const rimraf = require('./rimraf')

module.exports = {
  remove: u(rimraf),
  removeSync: rimraf.sync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const assert = require('assert')

const isWindows = (process.platform === 'win32')

function defaults (options) {
  const methods = [
    'unlink',
    'chmod',
    'stat',
    'lstat',
    'rmdir',
    'readdir'
  ]
  methods.forEach(m => {
    options[m] = options[m] || fs[m]
    m = m + 'Sync'
    options[m] = options[m] || fs[m]
  })

  options.maxBusyTries = options.maxBusyTries || 3
}

function rimraf (p, options, cb) {
  let busyTries = 0

  if (typeof options === 'function') {
    cb = options
    options = {}
  }

  assert(p, 'rimraf: missing path')
  assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
  assert.strictEqual(typeof cb, 'function', 'rimraf: callback function required')
  assert(options, 'rimraf: invalid options argument provided')
  assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')

  defaults(options)

  rimraf_(p, options, function CB (er) {
    if (er) {
      if ((er.code === 'EBUSY' || er.code === 'ENOTEMPTY' || er.code === 'EPERM') &&
          busyTries < options.maxBusyTries) {
        busyTries++
        const time = busyTries * 100
        // try again, with the same exact callback as this one.
        return setTimeout(() => rimraf_(p, options, CB), time)
      }

      // already gone
      if (er.code === 'ENOENT') er = null
    }

    cb(er)
  })
}

// Two possible strategies.
// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
//
// Both result in an extra syscall when you guess wrong.  However, there
// are likely far more normal files in the world than directories.  This
// is based on the assumption that a the average number of files per
// directory is >= 1.
//
// If anyone ever complains about this, then I guess the strategy could
// be made configurable somehow.  But until then, YAGNI.
function rimraf_ (p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  // sunos lets the root user unlink directories, which is... weird.
  // so we have to lstat here and make sure it's not a dir.
  options.lstat(p, (er, st) => {
    if (er && er.code === 'ENOENT') {
      return cb(null)
    }

    // Windows can EPERM on stat.  Life is suffering.
    if (er && er.code === 'EPERM' && isWindows) {
      return fixWinEPERM(p, options, er, cb)
    }

    if (st && st.isDirectory()) {
      return rmdir(p, options, er, cb)
    }

    options.unlink(p, er => {
      if (er) {
        if (er.code === 'ENOENT') {
          return cb(null)
        }
        if (er.code === 'EPERM') {
          return (isWindows)
            ? fixWinEPERM(p, options, er, cb)
            : rmdir(p, options, er, cb)
        }
        if (er.code === 'EISDIR') {
          return rmdir(p, options, er, cb)
        }
      }
      return cb(er)
    })
  })
}

function fixWinEPERM (p, options, er, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')
  if (er) {
    assert(er instanceof Error)
  }

  options.chmod(p, 0o666, er2 => {
    if (er2) {
      cb(er2.code === 'ENOENT' ? null : er)
    } else {
      options.stat(p, (er3, stats) => {
        if (er3) {
          cb(er3.code === 'ENOENT' ? null : er)
        } else if (stats.isDirectory()) {
          rmdir(p, options, er, cb)
        } else {
          options.unlink(p, cb)
        }
      })
    }
  })
}

function fixWinEPERMSync (p, options, er) {
  let stats

  assert(p)
  assert(options)
  if (er) {
    assert(er instanceof Error)
  }

  try {
    options.chmodSync(p, 0o666)
  } catch (er2) {
    if (er2.code === 'ENOENT') {
      return
    } else {
      throw er
    }
  }

  try {
    stats = options.statSync(p)
  } catch (er3) {
    if (er3.code === 'ENOENT') {
      return
    } else {
      throw er
    }
  }

  if (stats.isDirectory()) {
    rmdirSync(p, options, er)
  } else {
    options.unlinkSync(p)
  }
}

function rmdir (p, options, originalEr, cb) {
  assert(p)
  assert(options)
  if (originalEr) {
    assert(originalEr instanceof Error)
  }
  assert(typeof cb === 'function')

  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
  // if we guessed wrong, and it's not a directory, then
  // raise the original error.
  options.rmdir(p, er => {
    if (er && (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM')) {
      rmkids(p, options, cb)
    } else if (er && er.code === 'ENOTDIR') {
      cb(originalEr)
    } else {
      cb(er)
    }
  })
}

function rmkids (p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  options.readdir(p, (er, files) => {
    if (er) return cb(er)

    let n = files.length
    let errState

    if (n === 0) return options.rmdir(p, cb)

    files.forEach(f => {
      rimraf(path.join(p, f), options, er => {
        if (errState) {
          return
        }
        if (er) return cb(errState = er)
        if (--n === 0) {
          options.rmdir(p, cb)
        }
      })
    })
  })
}

// this looks simpler, and is strictly *faster*, but will
// tie up the JavaScript thread and fail on excessively
// deep directory trees.
function rimrafSync (p, options) {
  let st

  options = options || {}
  defaults(options)

  assert(p, 'rimraf: missing path')
  assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
  assert(options, 'rimraf: missing options')
  assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')

  try {
    st = options.lstatSync(p)
  } catch (er) {
    if (er.code === 'ENOENT') {
      return
    }

    // Windows can EPERM on stat.  Life is suffering.
    if (er.code === 'EPERM' && isWindows) {
      fixWinEPERMSync(p, options, er)
    }
  }

  try {
    // sunos lets the root user unlink directories, which is... weird.
    if (st && st.isDirectory()) {
      rmdirSync(p, options, null)
    } else {
      options.unlinkSync(p)
    }
  } catch (er) {
    if (er.code === 'ENOENT') {
      return
    } else if (er.code === 'EPERM') {
      return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
    } else if (er.code !== 'EISDIR') {
      throw er
    }
    rmdirSync(p, options, er)
  }
}

function rmdirSync (p, options, originalEr) {
  assert(p)
  assert(options)
  if (originalEr) {
    assert(originalEr instanceof Error)
  }

  try {
    options.rmdirSync(p)
  } catch (er) {
    if (er.code === 'ENOTDIR') {
      throw originalEr
    } else if (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM') {
      rmkidsSync(p, options)
    } else if (er.code !== 'ENOENT') {
      throw er
    }
  }
}

function rmkidsSync (p, options) {
  assert(p)
  assert(options)
  options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))

  if (isWindows) {
    // We only end up here once we got ENOTEMPTY at least once, and
    // at this point, we are guaranteed to have removed all the kids.
    // So, we know that it won't be ENOENT or ENOTDIR or anything else.
    // try really hard to delete stuff on windows, because it has a
    // PROFOUNDLY annoying habit of not closing handles promptly when
    // files are deleted, resulting in spurious ENOTEMPTY errors.
    const startTime = Date.now()
    do {
      try {
        const ret = options.rmdirSync(p, options)
        return ret
      } catch (er) { }
    } while (Date.now() - startTime < 500) // give up after 500ms
  } else {
    const ret = options.rmdirSync(p, options)
    return ret
  }
}

module.exports = rimraf
rimraf.sync = rimrafSync
'use strict'
const u = require('universalify').fromPromise
const fs = require('../fs')

function pathExists (path) {
  return fs.access(path).then(() => true).catch(() => false)
}

module.exports = {
  pathExists: u(pathExists),
  pathExistsSync: fs.existsSync
}
'use strict'

const u = require('universalify').fromCallback
const fs = require('graceful-fs')
const path = require('path')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function outputFile (file, data, encoding, callback) {
  if (typeof encoding === 'function') {
    callback = encoding
    encoding = 'utf8'
  }

  const dir = path.dirname(file)
  pathExists(dir, (err, itDoes) => {
    if (err) return callback(err)
    if (itDoes) return fs.writeFile(file, data, encoding, callback)

    mkdir.mkdirs(dir, err => {
      if (err) return callback(err)

      fs.writeFile(file, data, encoding, callback)
    })
  })
}

function outputFileSync (file, ...args) {
  const dir = path.dirname(file)
  if (fs.existsSync(dir)) {
    return fs.writeFileSync(file, ...args)
  }
  mkdir.mkdirsSync(dir)
  fs.writeFileSync(file, ...args)
}

module.exports = {
  outputFile: u(outputFile),
  outputFileSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const copySync = require('../copy-sync').copySync
const removeSync = require('../remove').removeSync
const mkdirpSync = require('../mkdirs').mkdirsSync
const buffer = require('../util/buffer')

function moveSync (src, dest, options) {
  options = options || {}
  const overwrite = options.overwrite || options.clobber || false

  src = path.resolve(src)
  dest = path.resolve(dest)

  if (src === dest) return fs.accessSync(src)

  if (isSrcSubdir(src, dest)) throw new Error(`Cannot move '${src}' into itself '${dest}'.`)

  mkdirpSync(path.dirname(dest))
  tryRenameSync()

  function tryRenameSync () {
    if (overwrite) {
      try {
        return fs.renameSync(src, dest)
      } catch (err) {
        if (err.code === 'ENOTEMPTY' || err.code === 'EEXIST' || err.code === 'EPERM') {
          removeSync(dest)
          options.overwrite = false // just overwriteed it, no need to do it again
          return moveSync(src, dest, options)
        }

        if (err.code !== 'EXDEV') throw err
        return moveSyncAcrossDevice(src, dest, overwrite)
      }
    } else {
      try {
        fs.linkSync(src, dest)
        return fs.unlinkSync(src)
      } catch (err) {
        if (err.code === 'EXDEV' || err.code === 'EISDIR' || err.code === 'EPERM' || err.code === 'ENOTSUP') {
          return moveSyncAcrossDevice(src, dest, overwrite)
        }
        throw err
      }
    }
  }
}

function moveSyncAcrossDevice (src, dest, overwrite) {
  const stat = fs.statSync(src)

  if (stat.isDirectory()) {
    return moveDirSyncAcrossDevice(src, dest, overwrite)
  } else {
    return moveFileSyncAcrossDevice(src, dest, overwrite)
  }
}

function moveFileSyncAcrossDevice (src, dest, overwrite) {
  const BUF_LENGTH = 64 * 1024
  const _buff = buffer(BUF_LENGTH)

  const flags = overwrite ? 'w' : 'wx'

  const fdr = fs.openSync(src, 'r')
  const stat = fs.fstatSync(fdr)
  const fdw = fs.openSync(dest, flags, stat.mode)
  let pos = 0

  while (pos < stat.size) {
    const bytesRead = fs.readSync(fdr, _buff, 0, BUF_LENGTH, pos)
    fs.writeSync(fdw, _buff, 0, bytesRead)
    pos += bytesRead
  }

  fs.closeSync(fdr)
  fs.closeSync(fdw)
  return fs.unlinkSync(src)
}

function moveDirSyncAcrossDevice (src, dest, overwrite) {
  const options = {
    overwrite: false
  }

  if (overwrite) {
    removeSync(dest)
    tryCopySync()
  } else {
    tryCopySync()
  }

  function tryCopySync () {
    copySync(src, dest, options)
    return removeSync(src)
  }
}

// return true if dest is a subdir of src, otherwise false.
// extract dest base dir and check if that is the same as src basename
function isSrcSubdir (src, dest) {
  try {
    return fs.statSync(src).isDirectory() &&
           src !== dest &&
           dest.indexOf(src) > -1 &&
           dest.split(path.dirname(src) + path.sep)[1].split(path.sep)[0] === path.basename(src)
  } catch (e) {
    return false
  }
}

module.exports = {
  moveSync
}
'use strict'

const u = require('universalify').fromCallback
const fs = require('graceful-fs')
const path = require('path')
const copy = require('../copy').copy
const remove = require('../remove').remove
const mkdirp = require('../mkdirs').mkdirp
const pathExists = require('../path-exists').pathExists

function move (src, dest, opts, cb) {
  if (typeof opts === 'function') {
    cb = opts
    opts = {}
  }

  const overwrite = opts.overwrite || opts.clobber || false

  src = path.resolve(src)
  dest = path.resolve(dest)

  if (src === dest) return fs.access(src, cb)

  fs.stat(src, (err, st) => {
    if (err) return cb(err)

    if (st.isDirectory() && isSrcSubdir(src, dest)) {
      return cb(new Error(`Cannot move '${src}' to a subdirectory of itself, '${dest}'.`))
    }
    mkdirp(path.dirname(dest), err => {
      if (err) return cb(err)
      return doRename(src, dest, overwrite, cb)
    })
  })
}

function doRename (src, dest, overwrite, cb) {
  if (overwrite) {
    return remove(dest, err => {
      if (err) return cb(err)
      return rename(src, dest, overwrite, cb)
    })
  }
  pathExists(dest, (err, destExists) => {
    if (err) return cb(err)
    if (destExists) return cb(new Error('dest already exists.'))
    return rename(src, dest, overwrite, cb)
  })
}

function rename (src, dest, overwrite, cb) {
  fs.rename(src, dest, err => {
    if (!err) return cb()
    if (err.code !== 'EXDEV') return cb(err)
    return moveAcrossDevice(src, dest, overwrite, cb)
  })
}

function moveAcrossDevice (src, dest, overwrite, cb) {
  const opts = {
    overwrite,
    errorOnExist: true
  }

  copy(src, dest, opts, err => {
    if (err) return cb(err)
    return remove(src, cb)
  })
}

function isSrcSubdir (src, dest) {
  const srcArray = src.split(path.sep)
  const destArray = dest.split(path.sep)

  return srcArray.reduce((acc, current, i) => {
    return acc && destArray[i] === current
  }, true)
}

module.exports = {
  move: u(move)
}
'use strict'
const u = require('universalify').fromCallback
const mkdirs = u(require('./mkdirs'))
const mkdirsSync = require('./mkdirs-sync')

module.exports = {
  mkdirs,
  mkdirsSync,
  // alias
  mkdirp: mkdirs,
  mkdirpSync: mkdirsSync,
  ensureDir: mkdirs,
  ensureDirSync: mkdirsSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const invalidWin32Path = require('./win32').invalidWin32Path

const o777 = parseInt('0777', 8)

function mkdirsSync (p, opts, made) {
  if (!opts || typeof opts !== 'object') {
    opts = { mode: opts }
  }

  let mode = opts.mode
  const xfs = opts.fs || fs

  if (process.platform === 'win32' && invalidWin32Path(p)) {
    const errInval = new Error(p + ' contains invalid WIN32 path characters.')
    errInval.code = 'EINVAL'
    throw errInval
  }

  if (mode === undefined) {
    mode = o777 & (~process.umask())
  }
  if (!made) made = null

  p = path.resolve(p)

  try {
    xfs.mkdirSync(p, mode)
    made = made || p
  } catch (err0) {
    if (err0.code === 'ENOENT') {
      if (path.dirname(p) === p) throw err0
      made = mkdirsSync(path.dirname(p), opts, made)
      mkdirsSync(p, opts, made)
    } else {
      // In the case of any other error, just see if there's a dir there
      // already. If so, then hooray!  If not, then something is borked.
      let stat
      try {
        stat = xfs.statSync(p)
      } catch (err1) {
        throw err0
      }
      if (!stat.isDirectory()) throw err0
    }
  }

  return made
}

module.exports = mkdirsSync
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const invalidWin32Path = require('./win32').invalidWin32Path

const o777 = parseInt('0777', 8)

function mkdirs (p, opts, callback, made) {
  if (typeof opts === 'function') {
    callback = opts
    opts = {}
  } else if (!opts || typeof opts !== 'object') {
    opts = { mode: opts }
  }

  if (process.platform === 'win32' && invalidWin32Path(p)) {
    const errInval = new Error(p + ' contains invalid WIN32 path characters.')
    errInval.code = 'EINVAL'
    return callback(errInval)
  }

  let mode = opts.mode
  const xfs = opts.fs || fs

  if (mode === undefined) {
    mode = o777 & (~process.umask())
  }
  if (!made) made = null

  callback = callback || function () {}
  p = path.resolve(p)

  xfs.mkdir(p, mode, er => {
    if (!er) {
      made = made || p
      return callback(null, made)
    }
    switch (er.code) {
      case 'ENOENT':
        if (path.dirname(p) === p) return callback(er)
        mkdirs(path.dirname(p), opts, (er, made) => {
          if (er) callback(er, made)
          else mkdirs(p, opts, callback, made)
        })
        break

      // In the case of any other error, just see if there's a dir
      // there already.  If so, then hooray!  If not, then something
      // is borked.
      default:
        xfs.stat(p, (er2, stat) => {
          // if the stat fails, then that's super weird.
          // let the original error be the failure reason.
          if (er2 || !stat.isDirectory()) callback(er, made)
          else callback(null, made)
        })
        break
    }
  })
}

module.exports = mkdirs
'use strict'

const path = require('path')

// get drive on windows
function getRootPath (p) {
  p = path.normalize(path.resolve(p)).split(path.sep)
  if (p.length > 0) return p[0]
  return null
}

// http://stackoverflow.com/a/62888/10333 contains more accurate
// TODO: expand to include the rest
const INVALID_PATH_CHARS = /[<>:"|?*]/

function invalidWin32Path (p) {
  const rp = getRootPath(p)
  p = p.replace(rp, '')
  return INVALID_PATH_CHARS.test(p)
}

module.exports = {
  getRootPath,
  invalidWin32Path
}
'use strict'

const u = require('universalify').fromCallback
const jsonFile = require('./jsonfile')

jsonFile.outputJson = u(require('./output-json'))
jsonFile.outputJsonSync = require('./output-json-sync')
// aliases
jsonFile.outputJSON = jsonFile.outputJson
jsonFile.outputJSONSync = jsonFile.outputJsonSync
jsonFile.writeJSON = jsonFile.writeJson
jsonFile.writeJSONSync = jsonFile.writeJsonSync
jsonFile.readJSON = jsonFile.readJson
jsonFile.readJSONSync = jsonFile.readJsonSync

module.exports = jsonFile
'use strict'

const u = require('universalify').fromCallback
const jsonFile = require('jsonfile')

module.exports = {
  // jsonfile exports
  readJson: u(jsonFile.readFile),
  readJsonSync: jsonFile.readFileSync,
  writeJson: u(jsonFile.writeFile),
  writeJsonSync: jsonFile.writeFileSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdir = require('../mkdirs')
const jsonFile = require('./jsonfile')

function outputJsonSync (file, data, options) {
  const dir = path.dirname(file)

  if (!fs.existsSync(dir)) {
    mkdir.mkdirsSync(dir)
  }

  jsonFile.writeJsonSync(file, data, options)
}

module.exports = outputJsonSync
'use strict'

const path = require('path')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists
const jsonFile = require('./jsonfile')

function outputJson (file, data, options, callback) {
  if (typeof options === 'function') {
    callback = options
    options = {}
  }

  const dir = path.dirname(file)

  pathExists(dir, (err, itDoes) => {
    if (err) return callback(err)
    if (itDoes) return jsonFile.writeJson(file, data, options, callback)

    mkdir.mkdirs(dir, err => {
      if (err) return callback(err)
      jsonFile.writeJson(file, data, options, callback)
    })
  })
}

module.exports = outputJson
'use strict'
// This is adapted from https://github.com/normalize/mz
// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
const u = require('universalify').fromCallback
const fs = require('graceful-fs')

const api = [
  'access',
  'appendFile',
  'chmod',
  'chown',
  'close',
  'copyFile',
  'fchmod',
  'fchown',
  'fdatasync',
  'fstat',
  'fsync',
  'ftruncate',
  'futimes',
  'lchown',
  'lchmod',
  'link',
  'lstat',
  'mkdir',
  'mkdtemp',
  'open',
  'readFile',
  'readdir',
  'readlink',
  'realpath',
  'rename',
  'rmdir',
  'stat',
  'symlink',
  'truncate',
  'unlink',
  'utimes',
  'writeFile'
].filter(key => {
  // Some commands are not available on some systems. Ex:
  // fs.copyFile was added in Node.js v8.5.0
  // fs.mkdtemp was added in Node.js v5.10.0
  // fs.lchown is not available on at least some Linux
  return typeof fs[key] === 'function'
})

// Export all keys:
Object.keys(fs).forEach(key => {
  if (key === 'promises') {
    // fs.promises is a getter property that triggers ExperimentalWarning
    // Don't re-export it here, the getter is defined in "lib/index.js"
    return
  }
  exports[key] = fs[key]
})

// Universalify async methods:
api.forEach(method => {
  exports[method] = u(fs[method])
})

// We differ from mz/fs in that we still ship the old, broken, fs.exists()
// since we are a drop-in replacement for the native module
exports.exists = function (filename, callback) {
  if (typeof callback === 'function') {
    return fs.exists(filename, callback)
  }
  return new Promise(resolve => {
    return fs.exists(filename, resolve)
  })
}

// fs.read() & fs.write need special treatment due to multiple callback args

exports.read = function (fd, buffer, offset, length, position, callback) {
  if (typeof callback === 'function') {
    return fs.read(fd, buffer, offset, length, position, callback)
  }
  return new Promise((resolve, reject) => {
    fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
      if (err) return reject(err)
      resolve({ bytesRead, buffer })
    })
  })
}

// Function signature can be
// fs.write(fd, buffer[, offset[, length[, position]]], callback)
// OR
// fs.write(fd, string[, position[, encoding]], callback)
// We need to handle both cases, so we use ...args
exports.write = function (fd, buffer, ...args) {
  if (typeof args[args.length - 1] === 'function') {
    return fs.write(fd, buffer, ...args)
  }

  return new Promise((resolve, reject) => {
    fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {
      if (err) return reject(err)
      resolve({ bytesWritten, buffer })
    })
  })
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function createFile (file, callback) {
  function makeFile () {
    fs.writeFile(file, '', err => {
      if (err) return callback(err)
      callback()
    })
  }

  fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err
    if (!err && stats.isFile()) return callback()
    const dir = path.dirname(file)
    pathExists(dir, (err, dirExists) => {
      if (err) return callback(err)
      if (dirExists) return makeFile()
      mkdir.mkdirs(dir, err => {
        if (err) return callback(err)
        makeFile()
      })
    })
  })
}

function createFileSync (file) {
  let stats
  try {
    stats = fs.statSync(file)
  } catch (e) {}
  if (stats && stats.isFile()) return

  const dir = path.dirname(file)
  if (!fs.existsSync(dir)) {
    mkdir.mkdirsSync(dir)
  }

  fs.writeFileSync(file, '')
}

module.exports = {
  createFile: u(createFile),
  createFileSync
}
'use strict'

const file = require('./file')
const link = require('./link')
const symlink = require('./symlink')

module.exports = {
  // file
  createFile: file.createFile,
  createFileSync: file.createFileSync,
  ensureFile: file.createFile,
  ensureFileSync: file.createFileSync,
  // link
  createLink: link.createLink,
  createLinkSync: link.createLinkSync,
  ensureLink: link.createLink,
  ensureLinkSync: link.createLinkSync,
  // symlink
  createSymlink: symlink.createSymlink,
  createSymlinkSync: symlink.createSymlinkSync,
  ensureSymlink: symlink.createSymlink,
  ensureSymlinkSync: symlink.createSymlinkSync
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function createLink (srcpath, dstpath, callback) {
  function makeLink (srcpath, dstpath) {
    fs.link(srcpath, dstpath, err => {
      if (err) return callback(err)
      callback(null)
    })
  }

  pathExists(dstpath, (err, destinationExists) => {
    if (err) return callback(err)
    if (destinationExists) return callback(null)
    fs.lstat(srcpath, (err) => {
      if (err) {
        err.message = err.message.replace('lstat', 'ensureLink')
        return callback(err)
      }

      const dir = path.dirname(dstpath)
      pathExists(dir, (err, dirExists) => {
        if (err) return callback(err)
        if (dirExists) return makeLink(srcpath, dstpath)
        mkdir.mkdirs(dir, err => {
          if (err) return callback(err)
          makeLink(srcpath, dstpath)
        })
      })
    })
  })
}

function createLinkSync (srcpath, dstpath) {
  const destinationExists = fs.existsSync(dstpath)
  if (destinationExists) return undefined

  try {
    fs.lstatSync(srcpath)
  } catch (err) {
    err.message = err.message.replace('lstat', 'ensureLink')
    throw err
  }

  const dir = path.dirname(dstpath)
  const dirExists = fs.existsSync(dir)
  if (dirExists) return fs.linkSync(srcpath, dstpath)
  mkdir.mkdirsSync(dir)

  return fs.linkSync(srcpath, dstpath)
}

module.exports = {
  createLink: u(createLink),
  createLinkSync
}
'use strict'

const path = require('path')
const fs = require('graceful-fs')
const pathExists = require('../path-exists').pathExists

/**
 * Function that returns two types of paths, one relative to symlink, and one
 * relative to the current working directory. Checks if path is absolute or
 * relative. If the path is relative, this function checks if the path is
 * relative to symlink or relative to current working directory. This is an
 * initiative to find a smarter `srcpath` to supply when building symlinks.
 * This allows you to determine which path to use out of one of three possible
 * types of source paths. The first is an absolute path. This is detected by
 * `path.isAbsolute()`. When an absolute path is provided, it is checked to
 * see if it exists. If it does it's used, if not an error is returned
 * (callback)/ thrown (sync). The other two options for `srcpath` are a
 * relative url. By default Node's `fs.symlink` works by creating a symlink
 * using `dstpath` and expects the `srcpath` to be relative to the newly
 * created symlink. If you provide a `srcpath` that does not exist on the file
 * system it results in a broken symlink. To minimize this, the function
 * checks to see if the 'relative to symlink' source file exists, and if it
 * does it will use it. If it does not, it checks if there's a file that
 * exists that is relative to the current working directory, if does its used.
 * This preserves the expectations of the original fs.symlink spec and adds
 * the ability to pass in `relative to current working direcotry` paths.
 */

function symlinkPaths (srcpath, dstpath, callback) {
  if (path.isAbsolute(srcpath)) {
    return fs.lstat(srcpath, (err) => {
      if (err) {
        err.message = err.message.replace('lstat', 'ensureSymlink')
        return callback(err)
      }
      return callback(null, {
        'toCwd': srcpath,
        'toDst': srcpath
      })
    })
  } else {
    const dstdir = path.dirname(dstpath)
    const relativeToDst = path.join(dstdir, srcpath)
    return pathExists(relativeToDst, (err, exists) => {
      if (err) return callback(err)
      if (exists) {
        return callback(null, {
          'toCwd': relativeToDst,
          'toDst': srcpath
        })
      } else {
        return fs.lstat(srcpath, (err) => {
          if (err) {
            err.message = err.message.replace('lstat', 'ensureSymlink')
            return callback(err)
          }
          return callback(null, {
            'toCwd': srcpath,
            'toDst': path.relative(dstdir, srcpath)
          })
        })
      }
    })
  }
}

function symlinkPathsSync (srcpath, dstpath) {
  let exists
  if (path.isAbsolute(srcpath)) {
    exists = fs.existsSync(srcpath)
    if (!exists) throw new Error('absolute srcpath does not exist')
    return {
      'toCwd': srcpath,
      'toDst': srcpath
    }
  } else {
    const dstdir = path.dirname(dstpath)
    const relativeToDst = path.join(dstdir, srcpath)
    exists = fs.existsSync(relativeToDst)
    if (exists) {
      return {
        'toCwd': relativeToDst,
        'toDst': srcpath
      }
    } else {
      exists = fs.existsSync(srcpath)
      if (!exists) throw new Error('relative srcpath does not exist')
      return {
        'toCwd': srcpath,
        'toDst': path.relative(dstdir, srcpath)
      }
    }
  }
}

module.exports = {
  symlinkPaths,
  symlinkPathsSync
}
'use strict'

const fs = require('graceful-fs')

function symlinkType (srcpath, type, callback) {
  callback = (typeof type === 'function') ? type : callback
  type = (typeof type === 'function') ? false : type
  if (type) return callback(null, type)
  fs.lstat(srcpath, (err, stats) => {
    if (err) return callback(null, 'file')
    type = (stats && stats.isDirectory()) ? 'dir' : 'file'
    callback(null, type)
  })
}

function symlinkTypeSync (srcpath, type) {
  let stats

  if (type) return type
  try {
    stats = fs.lstatSync(srcpath)
  } catch (e) {
    return 'file'
  }
  return (stats && stats.isDirectory()) ? 'dir' : 'file'
}

module.exports = {
  symlinkType,
  symlinkTypeSync
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const _mkdirs = require('../mkdirs')
const mkdirs = _mkdirs.mkdirs
const mkdirsSync = _mkdirs.mkdirsSync

const _symlinkPaths = require('./symlink-paths')
const symlinkPaths = _symlinkPaths.symlinkPaths
const symlinkPathsSync = _symlinkPaths.symlinkPathsSync

const _symlinkType = require('./symlink-type')
const symlinkType = _symlinkType.symlinkType
const symlinkTypeSync = _symlinkType.symlinkTypeSync

const pathExists = require('../path-exists').pathExists

function createSymlink (srcpath, dstpath, type, callback) {
  callback = (typeof type === 'function') ? type : callback
  type = (typeof type === 'function') ? false : type

  pathExists(dstpath, (err, destinationExists) => {
    if (err) return callback(err)
    if (destinationExists) return callback(null)
    symlinkPaths(srcpath, dstpath, (err, relative) => {
      if (err) return callback(err)
      srcpath = relative.toDst
      symlinkType(relative.toCwd, type, (err, type) => {
        if (err) return callback(err)
        const dir = path.dirname(dstpath)
        pathExists(dir, (err, dirExists) => {
          if (err) return callback(err)
          if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
          mkdirs(dir, err => {
            if (err) return callback(err)
            fs.symlink(srcpath, dstpath, type, callback)
          })
        })
      })
    })
  })
}

function createSymlinkSync (srcpath, dstpath, type) {
  const destinationExists = fs.existsSync(dstpath)
  if (destinationExists) return undefined

  const relative = symlinkPathsSync(srcpath, dstpath)
  srcpath = relative.toDst
  type = symlinkTypeSync(relative.toCwd, type)
  const dir = path.dirname(dstpath)
  const exists = fs.existsSync(dir)
  if (exists) return fs.symlinkSync(srcpath, dstpath, type)
  mkdirsSync(dir)
  return fs.symlinkSync(srcpath, dstpath, type)
}

module.exports = {
  createSymlink: u(createSymlink),
  createSymlinkSync
}
'use strict'

const u = require('universalify').fromCallback
const fs = require('fs')
const path = require('path')
const mkdir = require('../mkdirs')
const remove = require('../remove')

const emptyDir = u(function emptyDir (dir, callback) {
  callback = callback || function () {}
  fs.readdir(dir, (err, items) => {
    if (err) return mkdir.mkdirs(dir, callback)

    items = items.map(item => path.join(dir, item))

    deleteItem()

    function deleteItem () {
      const item = items.pop()
      if (!item) return callback()
      remove.remove(item, err => {
        if (err) return callback(err)
        deleteItem()
      })
    }
  })
})

function emptyDirSync (dir) {
  let items
  try {
    items = fs.readdirSync(dir)
  } catch (err) {
    return mkdir.mkdirsSync(dir)
  }

  items.forEach(item => {
    item = path.join(dir, item)
    remove.removeSync(item)
  })
}

module.exports = {
  emptyDirSync,
  emptydirSync: emptyDirSync,
  emptyDir,
  emptydir: emptyDir
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdirpSync = require('../mkdirs').mkdirsSync
const utimesSync = require('../util/utimes.js').utimesMillisSync

const notExist = Symbol('notExist')

function copySync (src, dest, opts) {
  if (typeof opts === 'function') {
    opts = {filter: opts}
  }

  opts = opts || {}
  opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
  opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber

  // Warn about using preserveTimestamps on 32-bit node
  if (opts.preserveTimestamps && process.arch === 'ia32') {
    console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
    see https://github.com/jprichardson/node-fs-extra/issues/269`)
  }

  const destStat = checkPaths(src, dest)

  if (opts.filter && !opts.filter(src, dest)) return

  const destParent = path.dirname(dest)
  if (!fs.existsSync(destParent)) mkdirpSync(destParent)
  return startCopy(destStat, src, dest, opts)
}

function startCopy (destStat, src, dest, opts) {
  if (opts.filter && !opts.filter(src, dest)) return
  return getStats(destStat, src, dest, opts)
}

function getStats (destStat, src, dest, opts) {
  const statSync = opts.dereference ? fs.statSync : fs.lstatSync
  const srcStat = statSync(src)

  if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts)
  else if (srcStat.isFile() ||
           srcStat.isCharacterDevice() ||
           srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts)
  else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts)
}

function onFile (srcStat, destStat, src, dest, opts) {
  if (destStat === notExist) return copyFile(srcStat, src, dest, opts)
  return mayCopyFile(srcStat, src, dest, opts)
}

function mayCopyFile (srcStat, src, dest, opts) {
  if (opts.overwrite) {
    fs.unlinkSync(dest)
    return copyFile(srcStat, src, dest, opts)
  } else if (opts.errorOnExist) {
    throw new Error(`'${dest}' already exists`)
  }
}

function copyFile (srcStat, src, dest, opts) {
  if (typeof fs.copyFileSync === 'function') {
    fs.copyFileSync(src, dest)
    fs.chmodSync(dest, srcStat.mode)
    if (opts.preserveTimestamps) {
      return utimesSync(dest, srcStat.atime, srcStat.mtime)
    }
    return
  }
  return copyFileFallback(srcStat, src, dest, opts)
}

function copyFileFallback (srcStat, src, dest, opts) {
  const BUF_LENGTH = 64 * 1024
  const _buff = require('../util/buffer')(BUF_LENGTH)

  const fdr = fs.openSync(src, 'r')
  const fdw = fs.openSync(dest, 'w', srcStat.mode)
  let pos = 0

  while (pos < srcStat.size) {
    const bytesRead = fs.readSync(fdr, _buff, 0, BUF_LENGTH, pos)
    fs.writeSync(fdw, _buff, 0, bytesRead)
    pos += bytesRead
  }

  if (opts.preserveTimestamps) fs.futimesSync(fdw, srcStat.atime, srcStat.mtime)

  fs.closeSync(fdr)
  fs.closeSync(fdw)
}

function onDir (srcStat, destStat, src, dest, opts) {
  if (destStat === notExist) return mkDirAndCopy(srcStat, src, dest, opts)
  if (destStat && !destStat.isDirectory()) {
    throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`)
  }
  return copyDir(src, dest, opts)
}

function mkDirAndCopy (srcStat, src, dest, opts) {
  fs.mkdirSync(dest)
  copyDir(src, dest, opts)
  return fs.chmodSync(dest, srcStat.mode)
}

function copyDir (src, dest, opts) {
  fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts))
}

function copyDirItem (item, src, dest, opts) {
  const srcItem = path.join(src, item)
  const destItem = path.join(dest, item)
  const destStat = checkPaths(srcItem, destItem)
  return startCopy(destStat, srcItem, destItem, opts)
}

function onLink (destStat, src, dest, opts) {
  let resolvedSrc = fs.readlinkSync(src)

  if (opts.dereference) {
    resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
  }

  if (destStat === notExist) {
    return fs.symlinkSync(resolvedSrc, dest)
  } else {
    let resolvedDest
    try {
      resolvedDest = fs.readlinkSync(dest)
    } catch (err) {
      // dest exists and is a regular file or directory,
      // Windows may throw UNKNOWN error. If dest already exists,
      // fs throws error anyway, so no need to guard against it here.
      if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest)
      throw err
    }
    if (opts.dereference) {
      resolvedDest = path.resolve(process.cwd(), resolvedDest)
    }
    if (isSrcSubdir(resolvedSrc, resolvedDest)) {
      throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`)
    }

    // prevent copy if src is a subdir of dest since unlinking
    // dest in this case would result in removing src contents
    // and therefore a broken symlink would be created.
    if (fs.statSync(dest).isDirectory() && isSrcSubdir(resolvedDest, resolvedSrc)) {
      throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)
    }
    return copyLink(resolvedSrc, dest)
  }
}

function copyLink (resolvedSrc, dest) {
  fs.unlinkSync(dest)
  return fs.symlinkSync(resolvedSrc, dest)
}

// return true if dest is a subdir of src, otherwise false.
function isSrcSubdir (src, dest) {
  const srcArray = path.resolve(src).split(path.sep)
  const destArray = path.resolve(dest).split(path.sep)
  return srcArray.reduce((acc, current, i) => acc && destArray[i] === current, true)
}

function checkStats (src, dest) {
  const srcStat = fs.statSync(src)
  let destStat
  try {
    destStat = fs.statSync(dest)
  } catch (err) {
    if (err.code === 'ENOENT') return {srcStat, destStat: notExist}
    throw err
  }
  return {srcStat, destStat}
}

function checkPaths (src, dest) {
  const {srcStat, destStat} = checkStats(src, dest)
  if (destStat.ino && destStat.ino === srcStat.ino) {
    throw new Error('Source and destination must not be the same.')
  }
  if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
    throw new Error(`Cannot copy '${src}' to a subdirectory of itself, '${dest}'.`)
  }
  return destStat
}

module.exports = copySync
'use strict'

module.exports = {
  copySync: require('./copy-sync')
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdirp = require('../mkdirs').mkdirs
const pathExists = require('../path-exists').pathExists
const utimes = require('../util/utimes').utimesMillis

const notExist = Symbol('notExist')

function copy (src, dest, opts, cb) {
  if (typeof opts === 'function' && !cb) {
    cb = opts
    opts = {}
  } else if (typeof opts === 'function') {
    opts = {filter: opts}
  }

  cb = cb || function () {}
  opts = opts || {}

  opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
  opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber

  // Warn about using preserveTimestamps on 32-bit node
  if (opts.preserveTimestamps && process.arch === 'ia32') {
    console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
    see https://github.com/jprichardson/node-fs-extra/issues/269`)
  }

  checkPaths(src, dest, (err, destStat) => {
    if (err) return cb(err)
    if (opts.filter) return handleFilter(checkParentDir, destStat, src, dest, opts, cb)
    return checkParentDir(destStat, src, dest, opts, cb)
  })
}

function checkParentDir (destStat, src, dest, opts, cb) {
  const destParent = path.dirname(dest)
  pathExists(destParent, (err, dirExists) => {
    if (err) return cb(err)
    if (dirExists) return startCopy(destStat, src, dest, opts, cb)
    mkdirp(destParent, err => {
      if (err) return cb(err)
      return startCopy(destStat, src, dest, opts, cb)
    })
  })
}

function handleFilter (onInclude, destStat, src, dest, opts, cb) {
  Promise.resolve(opts.filter(src, dest)).then(include => {
    if (include) {
      if (destStat) return onInclude(destStat, src, dest, opts, cb)
      return onInclude(src, dest, opts, cb)
    }
    return cb()
  }, error => cb(error))
}

function startCopy (destStat, src, dest, opts, cb) {
  if (opts.filter) return handleFilter(getStats, destStat, src, dest, opts, cb)
  return getStats(destStat, src, dest, opts, cb)
}

function getStats (destStat, src, dest, opts, cb) {
  const stat = opts.dereference ? fs.stat : fs.lstat
  stat(src, (err, srcStat) => {
    if (err) return cb(err)

    if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts, cb)
    else if (srcStat.isFile() ||
             srcStat.isCharacterDevice() ||
             srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts, cb)
    else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts, cb)
  })
}

function onFile (srcStat, destStat, src, dest, opts, cb) {
  if (destStat === notExist) return copyFile(srcStat, src, dest, opts, cb)
  return mayCopyFile(srcStat, src, dest, opts, cb)
}

function mayCopyFile (srcStat, src, dest, opts, cb) {
  if (opts.overwrite) {
    fs.unlink(dest, err => {
      if (err) return cb(err)
      return copyFile(srcStat, src, dest, opts, cb)
    })
  } else if (opts.errorOnExist) {
    return cb(new Error(`'${dest}' already exists`))
  } else return cb()
}

function copyFile (srcStat, src, dest, opts, cb) {
  if (typeof fs.copyFile === 'function') {
    return fs.copyFile(src, dest, err => {
      if (err) return cb(err)
      return setDestModeAndTimestamps(srcStat, dest, opts, cb)
    })
  }
  return copyFileFallback(srcStat, src, dest, opts, cb)
}

function copyFileFallback (srcStat, src, dest, opts, cb) {
  const rs = fs.createReadStream(src)
  rs.on('error', err => cb(err)).once('open', () => {
    const ws = fs.createWriteStream(dest, { mode: srcStat.mode })
    ws.on('error', err => cb(err))
      .on('open', () => rs.pipe(ws))
      .once('close', () => setDestModeAndTimestamps(srcStat, dest, opts, cb))
  })
}

function setDestModeAndTimestamps (srcStat, dest, opts, cb) {
  fs.chmod(dest, srcStat.mode, err => {
    if (err) return cb(err)
    if (opts.preserveTimestamps) {
      return utimes(dest, srcStat.atime, srcStat.mtime, cb)
    }
    return cb()
  })
}

function onDir (srcStat, destStat, src, dest, opts, cb) {
  if (destStat === notExist) return mkDirAndCopy(srcStat, src, dest, opts, cb)
  if (destStat && !destStat.isDirectory()) {
    return cb(new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`))
  }
  return copyDir(src, dest, opts, cb)
}

function mkDirAndCopy (srcStat, src, dest, opts, cb) {
  fs.mkdir(dest, err => {
    if (err) return cb(err)
    copyDir(src, dest, opts, err => {
      if (err) return cb(err)
      return fs.chmod(dest, srcStat.mode, cb)
    })
  })
}

function copyDir (src, dest, opts, cb) {
  fs.readdir(src, (err, items) => {
    if (err) return cb(err)
    return copyDirItems(items, src, dest, opts, cb)
  })
}

function copyDirItems (items, src, dest, opts, cb) {
  const item = items.pop()
  if (!item) return cb()
  return copyDirItem(items, item, src, dest, opts, cb)
}

function copyDirItem (items, item, src, dest, opts, cb) {
  const srcItem = path.join(src, item)
  const destItem = path.join(dest, item)
  checkPaths(srcItem, destItem, (err, destStat) => {
    if (err) return cb(err)
    startCopy(destStat, srcItem, destItem, opts, err => {
      if (err) return cb(err)
      return copyDirItems(items, src, dest, opts, cb)
    })
  })
}

function onLink (destStat, src, dest, opts, cb) {
  fs.readlink(src, (err, resolvedSrc) => {
    if (err) return cb(err)

    if (opts.dereference) {
      resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
    }

    if (destStat === notExist) {
      return fs.symlink(resolvedSrc, dest, cb)
    } else {
      fs.readlink(dest, (err, resolvedDest) => {
        if (err) {
          // dest exists and is a regular file or directory,
          // Windows may throw UNKNOWN error. If dest already exists,
          // fs throws error anyway, so no need to guard against it here.
          if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest, cb)
          return cb(err)
        }
        if (opts.dereference) {
          resolvedDest = path.resolve(process.cwd(), resolvedDest)
        }
        if (isSrcSubdir(resolvedSrc, resolvedDest)) {
          return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))
        }

        // do not copy if src is a subdir of dest since unlinking
        // dest in this case would result in removing src contents
        // and therefore a broken symlink would be created.
        if (destStat.isDirectory() && isSrcSubdir(resolvedDest, resolvedSrc)) {
          return cb(new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`))
        }
        return copyLink(resolvedSrc, dest, cb)
      })
    }
  })
}

function copyLink (resolvedSrc, dest, cb) {
  fs.unlink(dest, err => {
    if (err) return cb(err)
    return fs.symlink(resolvedSrc, dest, cb)
  })
}

// return true if dest is a subdir of src, otherwise false.
function isSrcSubdir (src, dest) {
  const srcArray = path.resolve(src).split(path.sep)
  const destArray = path.resolve(dest).split(path.sep)
  return srcArray.reduce((acc, current, i) => acc && destArray[i] === current, true)
}

function checkStats (src, dest, cb) {
  fs.stat(src, (err, srcStat) => {
    if (err) return cb(err)
    fs.stat(dest, (err, destStat) => {
      if (err) {
        if (err.code === 'ENOENT') return cb(null, {srcStat, destStat: notExist})
        return cb(err)
      }
      return cb(null, {srcStat, destStat})
    })
  })
}

function checkPaths (src, dest, cb) {
  checkStats(src, dest, (err, stats) => {
    if (err) return cb(err)
    const {srcStat, destStat} = stats
    if (destStat.ino && destStat.ino === srcStat.ino) {
      return cb(new Error('Source and destination must not be the same.'))
    }
    if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
      return cb(new Error(`Cannot copy '${src}' to a subdirectory of itself, '${dest}'.`))
    }
    return cb(null, destStat)
  })
}

module.exports = copy
'use strict'

const u = require('universalify').fromCallback
module.exports = {
  copy: u(require('./copy'))
}
The MIT License (MIT)

Copyright (c) 2017 Vladimir Krivosheev

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
"use strict"

const fsExtra = require("fs-extra")
const Promise = require('bluebird-lst')

function makeFs(Promise) {
  const fs = Object.create(null)

  for (const methodName of Object.keys(fsExtra)) {
    const method = fsExtra[methodName]
    if (methodName === "createFile" || methodName === "mkdirp") {
      continue
    }

    if (typeof method !== "function" ||
        methodName.endsWith("Sync") ||
        methodName.endsWith("Stream") ||
        methodName.match(/^[A-Z]/) ||
        methodName === "exists" ||
        methodName === "watch" ||
        methodName === "watchFile" ||
        methodName === "unwatchFile") {
      fs[methodName] = method
    }
    else {
      fs[methodName] = Promise.promisify(method)
    }
  }

  fs.createFile = fs.ensureFile
  fs.mkdirp = fs.mkdirs
  return fs
}

module.exports = makeFs(Promise){
  "dependencies": {
    "bluebird-lst": "^1.0.7",
    "fs-extra": "^7.0.1"
  },
  "deprecated": false,
  "description": "fs-extra module promisified with bluebird",
  "engines": {
    "node": ">=6 <7 || >=8"
  },
  "files": [
    "index.*"
  ],
  "homepage": "https://github.com/develar/fs-extra-p#readme",
  "license": "MIT",
  "main": "index.js",
  "name": "fs-extra-p",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/develar/fs-extra-p.git"
  },
  "version": "7.0.1"
}(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the 'Software'), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial 
portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)

# BIN directory
BIN := $(THIS_DIR)/node_modules/.bin

# Path
PATH := node_modules/.bin:$(PATH)
SHELL := /bin/bash

# applications
NODE ?= $(shell which node)
YARN ?= $(shell which yarn)
PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
BROWSERIFY ?= $(NODE) $(BIN)/browserify

.FORCE:

install: node_modules

node_modules: package.json
	@NODE_ENV= $(PKG) install
	@touch node_modules

lint: .FORCE
	eslint browser.js debug.js index.js node.js

test-node: .FORCE
	istanbul cover node_modules/mocha/bin/_mocha -- test/**.js

test-browser: .FORCE
	mkdir -p dist

	@$(BROWSERIFY) \
		--standalone debug \
		. > dist/debug.js

	karma start --single-run
	rimraf dist

test: .FORCE
	concurrently \
		"make test-node" \
		"make test-browser"

coveralls:
	cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js

.PHONY: all install clean distclean
{
  "name": "debug",
  "repo": "visionmedia/debug",
  "description": "small debugging utility",
  "version": "2.6.9",
  "keywords": [
    "debug",
    "log",
    "debugger"
  ],
  "main": "src/browser.js",
  "scripts": [
    "src/browser.js",
    "src/debug.js"
  ],
  "dependencies": {
    "rauchg/ms.js": "0.7.1"
  }
}
module.exports = require('./src/node');
{
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "browser": "./src/browser.js",
  "component": {
    "scripts": {
      "debug/index.js": "browser.js",
      "debug/debug.js": "debug.js"
    }
  },
  "dependencies": {
    "ms": "2.0.0"
  },
  "deprecated": false,
  "description": "small debugging utility",
  "devDependencies": {
    "browserify": "9.0.3",
    "chai": "^3.5.0",
    "concurrently": "^3.1.0",
    "coveralls": "^2.11.15",
    "eslint": "^3.12.1",
    "istanbul": "^0.4.5",
    "karma": "^1.3.0",
    "karma-chai": "^0.1.0",
    "karma-mocha": "^1.3.0",
    "karma-phantomjs-launcher": "^1.0.2",
    "karma-sinon": "^1.0.5",
    "mocha": "^3.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "rimraf": "^2.5.4",
    "sinon": "^1.17.6",
    "sinon-chai": "^2.8.0"
  },
  "homepage": "https://github.com/visionmedia/debug#readme",
  "license": "MIT",
  "main": "./src/index.js",
  "name": "debug",
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "version": "2.6.9"
}/**
 * This is the web browser implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
               && 'undefined' != typeof chrome.storage
                  ? chrome.storage.local
                  : localstorage();

/**
 * Colors.
 */

exports.colors = [
  'lightseagreen',
  'forestgreen',
  'goldenrod',
  'dodgerblue',
  'darkorchid',
  'crimson'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

function useColors() {
  // NB: In an Electron preload script, document will be defined but not fully
  // initialized. Since we know we're in Chrome, we'll just detect this case
  // explicitly
  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
    return true;
  }

  // is webkit? http://stackoverflow.com/a/16459606/376773
  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
    // is firebug? http://stackoverflow.com/a/398120/376773
    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
    // is firefox >= v31?
    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
    // double check webkit in userAgent just in case we are in a worker
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

exports.formatters.j = function(v) {
  try {
    return JSON.stringify(v);
  } catch (err) {
    return '[UnexpectedJSONParseError]: ' + err.message;
  }
};


/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var useColors = this.useColors;

  args[0] = (useColors ? '%c' : '')
    + this.namespace
    + (useColors ? ' %c' : ' ')
    + args[0]
    + (useColors ? '%c ' : ' ')
    + '+' + exports.humanize(this.diff);

  if (!useColors) return;

  var c = 'color: ' + this.color;
  args.splice(1, 0, c, 'color: inherit')

  // the final "%c" is somewhat tricky, because there could be other
  // arguments passed either before or after the %c, so we need to
  // figure out the correct index to insert the CSS into
  var index = 0;
  var lastC = 0;
  args[0].replace(/%[a-zA-Z%]/g, function(match) {
    if ('%%' === match) return;
    index++;
    if ('%c' === match) {
      // we only are interested in the *last* %c
      // (the user may have provided their own)
      lastC = index;
    }
  });

  args.splice(lastC, 0, c);
}

/**
 * Invokes `console.log()` when available.
 * No-op when `console.log` is not a "function".
 *
 * @api public
 */

function log() {
  // this hackery is required for IE8/9, where
  // the `console.log` function doesn't have 'apply'
  return 'object' === typeof console
    && console.log
    && Function.prototype.apply.call(console.log, console, arguments);
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  try {
    if (null == namespaces) {
      exports.storage.removeItem('debug');
    } else {
      exports.storage.debug = namespaces;
    }
  } catch(e) {}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  var r;
  try {
    r = exports.storage.debug;
  } catch(e) {}

  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
  if (!r && typeof process !== 'undefined' && 'env' in process) {
    r = process.env.DEBUG;
  }

  return r;
}

/**
 * Enable namespaces listed in `localStorage.debug` initially.
 */

exports.enable(load());

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
  try {
    return window.localStorage;
  } catch (e) {}
}

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
exports.coerce = coerce;
exports.disable = disable;
exports.enable = enable;
exports.enabled = enabled;
exports.humanize = require('ms');

/**
 * The currently active debug mode names, and names to skip.
 */

exports.names = [];
exports.skips = [];

/**
 * Map of special "%n" handling functions, for the debug "format" argument.
 *
 * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
 */

exports.formatters = {};

/**
 * Previous log timestamp.
 */

var prevTime;

/**
 * Select a color.
 * @param {String} namespace
 * @return {Number}
 * @api private
 */

function selectColor(namespace) {
  var hash = 0, i;

  for (i in namespace) {
    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
    hash |= 0; // Convert to 32bit integer
  }

  return exports.colors[Math.abs(hash) % exports.colors.length];
}

/**
 * Create a debugger with the given `namespace`.
 *
 * @param {String} namespace
 * @return {Function}
 * @api public
 */

function createDebug(namespace) {

  function debug() {
    // disabled?
    if (!debug.enabled) return;

    var self = debug;

    // set `diff` timestamp
    var curr = +new Date();
    var ms = curr - (prevTime || curr);
    self.diff = ms;
    self.prev = prevTime;
    self.curr = curr;
    prevTime = curr;

    // turn the `arguments` into a proper Array
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }

    args[0] = exports.coerce(args[0]);

    if ('string' !== typeof args[0]) {
      // anything else let's inspect with %O
      args.unshift('%O');
    }

    // apply any `formatters` transformations
    var index = 0;
    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
      // if we encounter an escaped % then don't increase the array index
      if (match === '%%') return match;
      index++;
      var formatter = exports.formatters[format];
      if ('function' === typeof formatter) {
        var val = args[index];
        match = formatter.call(self, val);

        // now we need to remove `args[index]` since it's inlined in the `format`
        args.splice(index, 1);
        index--;
      }
      return match;
    });

    // apply env-specific formatting (colors, etc.)
    exports.formatArgs.call(self, args);

    var logFn = debug.log || exports.log || console.log.bind(console);
    logFn.apply(self, args);
  }

  debug.namespace = namespace;
  debug.enabled = exports.enabled(namespace);
  debug.useColors = exports.useColors();
  debug.color = selectColor(namespace);

  // env-specific initialization logic for debug instances
  if ('function' === typeof exports.init) {
    exports.init(debug);
  }

  return debug;
}

/**
 * Enables a debug mode by namespaces. This can include modes
 * separated by a colon and wildcards.
 *
 * @param {String} namespaces
 * @api public
 */

function enable(namespaces) {
  exports.save(namespaces);

  exports.names = [];
  exports.skips = [];

  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
  var len = split.length;

  for (var i = 0; i < len; i++) {
    if (!split[i]) continue; // ignore empty strings
    namespaces = split[i].replace(/\*/g, '.*?');
    if (namespaces[0] === '-') {
      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
    } else {
      exports.names.push(new RegExp('^' + namespaces + '$'));
    }
  }
}

/**
 * Disable debug output.
 *
 * @api public
 */

function disable() {
  exports.enable('');
}

/**
 * Returns true if the given mode name is enabled, false otherwise.
 *
 * @param {String} name
 * @return {Boolean}
 * @api public
 */

function enabled(name) {
  var i, len;
  for (i = 0, len = exports.skips.length; i < len; i++) {
    if (exports.skips[i].test(name)) {
      return false;
    }
  }
  for (i = 0, len = exports.names.length; i < len; i++) {
    if (exports.names[i].test(name)) {
      return true;
    }
  }
  return false;
}

/**
 * Coerce `val`.
 *
 * @param {Mixed} val
 * @return {Mixed}
 * @api private
 */

function coerce(val) {
  if (val instanceof Error) return val.stack || val.message;
  return val;
}
/**
 * Detect Electron renderer process, which is node, but we should
 * treat as a browser.
 */

if (typeof process !== 'undefined' && process.type === 'renderer') {
  module.exports = require('./browser.js');
} else {
  module.exports = require('./node.js');
}
module.exports = inspectorLog;

// black hole
const nullStream = new (require('stream').Writable)();
nullStream._write = () => {};

/**
 * Outputs a `console.log()` to the Node.js Inspector console *only*.
 */
function inspectorLog() {
  const stdout = console._stdout;
  console._stdout = nullStream;
  console.log.apply(console, arguments);
  console._stdout = stdout;
}
/**
 * Module dependencies.
 */

var tty = require('tty');
var util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(function (key) {
  return /^debug_/i.test(key);
}).reduce(function (obj, key) {
  // camel-case
  var prop = key
    .substring(6)
    .toLowerCase()
    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });

  // coerce string value into JS value
  var val = process.env[key];
  if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
  else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
  else if (val === 'null') val = null;
  else val = Number(val);

  obj[prop] = val;
  return obj;
}, {});

/**
 * The file descriptor to write the `debug()` calls to.
 * Set the `DEBUG_FD` env variable to override with another value. i.e.:
 *
 *   $ DEBUG_FD=3 node script.js 3>debug.log
 */

var fd = parseInt(process.env.DEBUG_FD, 10) || 2;

if (1 !== fd && 2 !== fd) {
  util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
}

var stream = 1 === fd ? process.stdout :
             2 === fd ? process.stderr :
             createWritableStdioStream(fd);

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
  return 'colors' in exports.inspectOpts
    ? Boolean(exports.inspectOpts.colors)
    : tty.isatty(fd);
}

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

exports.formatters.o = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts)
    .split('\n').map(function(str) {
      return str.trim()
    }).join(' ');
};

/**
 * Map %o to `util.inspect()`, allowing multiple lines if needed.
 */

exports.formatters.O = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts);
};

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var name = this.namespace;
  var useColors = this.useColors;

  if (useColors) {
    var c = this.color;
    var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';

    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
    args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
  } else {
    args[0] = new Date().toUTCString()
      + ' ' + name + ' ' + args[0];
  }
}

/**
 * Invokes `util.format()` with the specified arguments and writes to `stream`.
 */

function log() {
  return stream.write(util.format.apply(util, arguments) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  if (null == namespaces) {
    // If you set a process.env field to null or undefined, it gets cast to the
    // string 'null' or 'undefined'. Just delete instead.
    delete process.env.DEBUG;
  } else {
    process.env.DEBUG = namespaces;
  }
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  return process.env.DEBUG;
}

/**
 * Copied from `node/src/node.js`.
 *
 * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
 * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
 */

function createWritableStdioStream (fd) {
  var stream;
  var tty_wrap = process.binding('tty_wrap');

  // Note stream._type is used for test-module-load-list.js

  switch (tty_wrap.guessHandleType(fd)) {
    case 'TTY':
      stream = new tty.WriteStream(fd);
      stream._type = 'tty';

      // Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    case 'FILE':
      var fs = require('fs');
      stream = new fs.SyncWriteStream(fd, { autoClose: false });
      stream._type = 'fs';
      break;

    case 'PIPE':
    case 'TCP':
      var net = require('net');
      stream = new net.Socket({
        fd: fd,
        readable: false,
        writable: true
      });

      // FIXME Should probably have an option in net.Socket to create a
      // stream from an existing fd which is writable only. But for now
      // we'll just add this hack and set the `readable` member to false.
      // Test: ./node test/fixtures/echo.js < /etc/passwd
      stream.readable = false;
      stream.read = null;
      stream._type = 'pipe';

      // FIXME Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    default:
      // Probably an error on in uv_guess_handle()
      throw new Error('Implement me. Unknown stream file type!');
  }

  // For supporting legacy API we put the FD here.
  stream.fd = fd;

  stream._isStdio = true;

  return stream;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init (debug) {
  debug.inspectOpts = {};

  var keys = Object.keys(exports.inspectOpts);
  for (var i = 0; i < keys.length; i++) {
    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
  }
}

/**
 * Enable namespaces listed in `process.env.DEBUG` initially.
 */

exports.enable(load());
/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function(val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isNaN(val) === false) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  if (ms >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (ms >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (ms >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (ms >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  return plural(ms, d, 'day') ||
    plural(ms, h, 'hour') ||
    plural(ms, m, 'minute') ||
    plural(ms, s, 'second') ||
    ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, n, name) {
  if (ms < n) {
    return;
  }
  if (ms < n * 1.5) {
    return Math.floor(ms / n) + ' ' + name;
  }
  return Math.ceil(ms / n) + ' ' + name + 's';
}
The MIT License (MIT)

Copyright (c) 2016 Zeit, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "deprecated": false,
  "description": "Tiny milisecond conversion utility",
  "devDependencies": {
    "eslint": "3.19.0",
    "expect.js": "0.3.1",
    "husky": "0.13.3",
    "lint-staged": "3.4.1",
    "mocha": "3.4.1"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/zeit/ms#readme",
  "license": "MIT",
  "lint-staged": {
    "*.js": [
      "npm run lint",
      "prettier --single-quote --write",
      "git add"
    ]
  },
  "main": "./index",
  "name": "ms",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/zeit/ms.git"
  },
  "version": "2.0.0"
}'use strict';

module.exports = () => {
	const pattern = [
		'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)',
		'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))'
	].join('|');

	return new RegExp(pattern, 'g');
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Regular expression for matching ANSI escape codes",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/ansi-regex#readme",
  "license": "MIT",
  "name": "ansi-regex",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/ansi-regex.git"
  },
  "version": "3.0.0"
}'use strict';
/* eslint-disable yoda */
module.exports = x => {
	if (Number.isNaN(x)) {
		return false;
	}

	// code points are derived from:
	// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt
	if (
		x >= 0x1100 && (
			x <= 0x115f ||  // Hangul Jamo
			x === 0x2329 || // LEFT-POINTING ANGLE BRACKET
			x === 0x232a || // RIGHT-POINTING ANGLE BRACKET
			// CJK Radicals Supplement .. Enclosed CJK Letters and Months
			(0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||
			// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
			(0x3250 <= x && x <= 0x4dbf) ||
			// CJK Unified Ideographs .. Yi Radicals
			(0x4e00 <= x && x <= 0xa4c6) ||
			// Hangul Jamo Extended-A
			(0xa960 <= x && x <= 0xa97c) ||
			// Hangul Syllables
			(0xac00 <= x && x <= 0xd7a3) ||
			// CJK Compatibility Ideographs
			(0xf900 <= x && x <= 0xfaff) ||
			// Vertical Forms
			(0xfe10 <= x && x <= 0xfe19) ||
			// CJK Compatibility Forms .. Small Form Variants
			(0xfe30 <= x && x <= 0xfe6b) ||
			// Halfwidth and Fullwidth Forms
			(0xff01 <= x && x <= 0xff60) ||
			(0xffe0 <= x && x <= 0xffe6) ||
			// Kana Supplement
			(0x1b000 <= x && x <= 0x1b001) ||
			// Enclosed Ideographic Supplement
			(0x1f200 <= x && x <= 0x1f251) ||
			// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
			(0x20000 <= x && x <= 0x3fffd)
		)
	) {
		return true;
	}

	return false;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if the character represented by a given Unicode code point is fullwidth",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/is-fullwidth-code-point#readme",
  "license": "MIT",
  "name": "is-fullwidth-code-point",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git"
  },
  "version": "2.0.0"
}'use strict';
const stripAnsi = require('strip-ansi');
const isFullwidthCodePoint = require('is-fullwidth-code-point');

module.exports = str => {
	if (typeof str !== 'string' || str.length === 0) {
		return 0;
	}

	str = stripAnsi(str);

	let width = 0;

	for (let i = 0; i < str.length; i++) {
		const code = str.codePointAt(i);

		// Ignore control characters
		if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {
			continue;
		}

		// Ignore combining characters
		if (code >= 0x300 && code <= 0x36F) {
			continue;
		}

		// Surrogates
		if (code > 0xFFFF) {
			i++;
		}

		width += isFullwidthCodePoint(code) ? 2 : 1;
	}

	return width;
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "is-fullwidth-code-point": "^2.0.0",
    "strip-ansi": "^4.0.0"
  },
  "deprecated": false,
  "description": "Get the visual width of a string - the number of columns required to display it",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/string-width#readme",
  "license": "MIT",
  "name": "string-width",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/string-width.git"
  },
  "version": "2.1.1"
}'use strict';
const ansiRegex = require('ansi-regex');

module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "ansi-regex": "^3.0.0"
  },
  "deprecated": false,
  "description": "Strip ANSI escape codes",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/strip-ansi#readme",
  "license": "MIT",
  "name": "strip-ansi",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/strip-ansi.git"
  },
  "version": "4.0.0"
}'use strict';

module.exports = options => {
	options = Object.assign({
		onlyFirst: false
	}, options);

	const pattern = [
		'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
		'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
	].join('|');

	return new RegExp(pattern, options.onlyFirst ? undefined : 'g');
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Regular expression for matching ANSI escape codes",
  "devDependencies": {
    "ava": "^0.25.0",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/ansi-regex#readme",
  "license": "MIT",
  "name": "ansi-regex",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/ansi-regex.git"
  },
  "version": "4.1.0"
}'use strict';
/* eslint-disable yoda */
module.exports = x => {
	if (Number.isNaN(x)) {
		return false;
	}

	// code points are derived from:
	// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt
	if (
		x >= 0x1100 && (
			x <= 0x115f ||  // Hangul Jamo
			x === 0x2329 || // LEFT-POINTING ANGLE BRACKET
			x === 0x232a || // RIGHT-POINTING ANGLE BRACKET
			// CJK Radicals Supplement .. Enclosed CJK Letters and Months
			(0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||
			// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
			(0x3250 <= x && x <= 0x4dbf) ||
			// CJK Unified Ideographs .. Yi Radicals
			(0x4e00 <= x && x <= 0xa4c6) ||
			// Hangul Jamo Extended-A
			(0xa960 <= x && x <= 0xa97c) ||
			// Hangul Syllables
			(0xac00 <= x && x <= 0xd7a3) ||
			// CJK Compatibility Ideographs
			(0xf900 <= x && x <= 0xfaff) ||
			// Vertical Forms
			(0xfe10 <= x && x <= 0xfe19) ||
			// CJK Compatibility Forms .. Small Form Variants
			(0xfe30 <= x && x <= 0xfe6b) ||
			// Halfwidth and Fullwidth Forms
			(0xff01 <= x && x <= 0xff60) ||
			(0xffe0 <= x && x <= 0xffe6) ||
			// Kana Supplement
			(0x1b000 <= x && x <= 0x1b001) ||
			// Enclosed Ideographic Supplement
			(0x1f200 <= x && x <= 0x1f251) ||
			// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
			(0x20000 <= x && x <= 0x3fffd)
		)
	) {
		return true;
	}

	return false;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if the character represented by a given Unicode code point is fullwidth",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/is-fullwidth-code-point#readme",
  "license": "MIT",
  "name": "is-fullwidth-code-point",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git"
  },
  "version": "2.0.0"
}'use strict';
const stripAnsi = require('strip-ansi');
const isFullwidthCodePoint = require('is-fullwidth-code-point');
const emojiRegex = require('emoji-regex')();

module.exports = input => {
	input = input.replace(emojiRegex, '  ');

	if (typeof input !== 'string' || input.length === 0) {
		return 0;
	}

	input = stripAnsi(input);

	let width = 0;

	for (let i = 0; i < input.length; i++) {
		const code = input.codePointAt(i);

		// Ignore control characters
		if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {
			continue;
		}

		// Ignore combining characters
		if (code >= 0x300 && code <= 0x36F) {
			continue;
		}

		// Surrogates
		if (code > 0xFFFF) {
			i++;
		}

		width += isFullwidthCodePoint(code) ? 2 : 1;
	}

	return width;
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "emoji-regex": "^7.0.1",
    "is-fullwidth-code-point": "^2.0.0",
    "strip-ansi": "^5.1.0"
  },
  "deprecated": false,
  "description": "Get the visual width of a string - the number of columns required to display it",
  "devDependencies": {
    "ava": "^1.0.1",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/string-width#readme",
  "license": "MIT",
  "name": "string-width",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/string-width.git"
  },
  "version": "3.1.0"
}'use strict';
const ansiRegex = require('ansi-regex');

const stripAnsi = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;

module.exports = stripAnsi;
module.exports.default = stripAnsi;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "ansi-regex": "^4.1.0"
  },
  "deprecated": false,
  "description": "Strip ANSI escape codes from a string",
  "devDependencies": {
    "ava": "^1.3.1",
    "tsd-check": "^0.5.0",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/chalk/strip-ansi#readme",
  "license": "MIT",
  "name": "strip-ansi",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/strip-ansi.git"
  },
  "version": "5.2.0"
}'use strict';

module.exports = options => {
	options = Object.assign({
		onlyFirst: false
	}, options);

	const pattern = [
		'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
		'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
	].join('|');

	return new RegExp(pattern, options.onlyFirst ? undefined : 'g');
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Regular expression for matching ANSI escape codes",
  "devDependencies": {
    "ava": "^0.25.0",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/chalk/ansi-regex#readme",
  "license": "MIT",
  "name": "ansi-regex",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/ansi-regex.git"
  },
  "version": "4.1.0"
}'use strict';
const path = require('path');
const locatePath = require('locate-path');

module.exports = (filename, opts = {}) => {
	const startDir = path.resolve(opts.cwd || '');
	const {root} = path.parse(startDir);

	const filenames = [].concat(filename);

	return new Promise(resolve => {
		(function find(dir) {
			locatePath(filenames, {cwd: dir}).then(file => {
				if (file) {
					resolve(path.join(dir, file));
				} else if (dir === root) {
					resolve(null);
				} else {
					find(path.dirname(dir));
				}
			});
		})(startDir);
	});
};

module.exports.sync = (filename, opts = {}) => {
	let dir = path.resolve(opts.cwd || '');
	const {root} = path.parse(dir);

	const filenames = [].concat(filename);

	// eslint-disable-next-line no-constant-condition
	while (true) {
		const file = locatePath.sync(filenames, {cwd: dir});

		if (file) {
			return path.join(dir, file);
		}

		if (dir === root) {
			return null;
		}

		dir = path.dirname(dir);
	}
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "locate-path": "^3.0.0"
  },
  "deprecated": false,
  "description": "Find a file or directory by walking up parent directories",
  "devDependencies": {
    "ava": "*",
    "tempy": "^0.2.1",
    "xo": "*"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/find-up#readme",
  "license": "MIT",
  "name": "find-up",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/find-up.git"
  },
  "version": "3.0.0"
}'use strict';
/* eslint-disable yoda */
module.exports = x => {
	if (Number.isNaN(x)) {
		return false;
	}

	// code points are derived from:
	// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt
	if (
		x >= 0x1100 && (
			x <= 0x115f ||  // Hangul Jamo
			x === 0x2329 || // LEFT-POINTING ANGLE BRACKET
			x === 0x232a || // RIGHT-POINTING ANGLE BRACKET
			// CJK Radicals Supplement .. Enclosed CJK Letters and Months
			(0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||
			// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
			(0x3250 <= x && x <= 0x4dbf) ||
			// CJK Unified Ideographs .. Yi Radicals
			(0x4e00 <= x && x <= 0xa4c6) ||
			// Hangul Jamo Extended-A
			(0xa960 <= x && x <= 0xa97c) ||
			// Hangul Syllables
			(0xac00 <= x && x <= 0xd7a3) ||
			// CJK Compatibility Ideographs
			(0xf900 <= x && x <= 0xfaff) ||
			// Vertical Forms
			(0xfe10 <= x && x <= 0xfe19) ||
			// CJK Compatibility Forms .. Small Form Variants
			(0xfe30 <= x && x <= 0xfe6b) ||
			// Halfwidth and Fullwidth Forms
			(0xff01 <= x && x <= 0xff60) ||
			(0xffe0 <= x && x <= 0xffe6) ||
			// Kana Supplement
			(0x1b000 <= x && x <= 0x1b001) ||
			// Enclosed Ideographic Supplement
			(0x1f200 <= x && x <= 0x1f251) ||
			// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
			(0x20000 <= x && x <= 0x3fffd)
		)
	) {
		return true;
	}

	return false;
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Check if the character represented by a given Unicode code point is fullwidth",
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/is-fullwidth-code-point#readme",
  "license": "MIT",
  "name": "is-fullwidth-code-point",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git"
  },
  "version": "2.0.0"
}'use strict';
const stripAnsi = require('strip-ansi');
const isFullwidthCodePoint = require('is-fullwidth-code-point');
const emojiRegex = require('emoji-regex')();

module.exports = input => {
	input = input.replace(emojiRegex, '  ');

	if (typeof input !== 'string' || input.length === 0) {
		return 0;
	}

	input = stripAnsi(input);

	let width = 0;

	for (let i = 0; i < input.length; i++) {
		const code = input.codePointAt(i);

		// Ignore control characters
		if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {
			continue;
		}

		// Ignore combining characters
		if (code >= 0x300 && code <= 0x36F) {
			continue;
		}

		// Surrogates
		if (code > 0xFFFF) {
			i++;
		}

		width += isFullwidthCodePoint(code) ? 2 : 1;
	}

	return width;
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "emoji-regex": "^7.0.1",
    "is-fullwidth-code-point": "^2.0.0",
    "strip-ansi": "^5.1.0"
  },
  "deprecated": false,
  "description": "Get the visual width of a string - the number of columns required to display it",
  "devDependencies": {
    "ava": "^1.0.1",
    "xo": "^0.23.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/sindresorhus/string-width#readme",
  "license": "MIT",
  "name": "string-width",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/string-width.git"
  },
  "version": "3.1.0"
}'use strict';
const ansiRegex = require('ansi-regex');

const stripAnsi = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;

module.exports = stripAnsi;
module.exports.default = stripAnsi;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "dependencies": {
    "ansi-regex": "^4.1.0"
  },
  "deprecated": false,
  "description": "Strip ANSI escape codes from a string",
  "devDependencies": {
    "ava": "^1.3.1",
    "tsd-check": "^0.5.0",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/chalk/strip-ansi#readme",
  "license": "MIT",
  "name": "strip-ansi",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/chalk/strip-ansi.git"
  },
  "version": "5.2.0"
}'use strict';

const preserveCamelCase = string => {
	let isLastCharLower = false;
	let isLastCharUpper = false;
	let isLastLastCharUpper = false;

	for (let i = 0; i < string.length; i++) {
		const character = string[i];

		if (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) {
			string = string.slice(0, i) + '-' + string.slice(i);
			isLastCharLower = false;
			isLastLastCharUpper = isLastCharUpper;
			isLastCharUpper = true;
			i++;
		} else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) {
			string = string.slice(0, i - 1) + '-' + string.slice(i - 1);
			isLastLastCharUpper = isLastCharUpper;
			isLastCharUpper = false;
			isLastCharLower = true;
		} else {
			isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character;
			isLastLastCharUpper = isLastCharUpper;
			isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character;
		}
	}

	return string;
};

const camelCase = (input, options) => {
	if (!(typeof input === 'string' || Array.isArray(input))) {
		throw new TypeError('Expected the input to be `string | string[]`');
	}

	options = Object.assign({
		pascalCase: false
	}, options);

	const postProcess = x => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x;

	if (Array.isArray(input)) {
		input = input.map(x => x.trim())
			.filter(x => x.length)
			.join('-');
	} else {
		input = input.trim();
	}

	if (input.length === 0) {
		return '';
	}

	if (input.length === 1) {
		return options.pascalCase ? input.toUpperCase() : input.toLowerCase();
	}

	const hasUpperCase = input !== input.toLowerCase();

	if (hasUpperCase) {
		input = preserveCamelCase(input);
	}

	input = input
		.replace(/^[_.\- ]+/, '')
		.toLowerCase()
		.replace(/[_.\- ]+(\w|$)/g, (_, p1) => p1.toUpperCase())
		.replace(/\d+(\w|$)/g, m => m.toUpperCase());

	return postProcess(input);
};

module.exports = camelCase;
// TODO: Remove this for the next major release
module.exports.default = camelCase;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "deprecated": false,
  "description": "Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` â†’ `fooBar`",
  "devDependencies": {
    "ava": "^1.4.1",
    "tsd": "^0.7.1",
    "xo": "^0.24.0"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "homepage": "https://github.com/sindresorhus/camelcase#readme",
  "license": "MIT",
  "name": "camelcase",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/sindresorhus/camelcase.git"
  },
  "version": "5.3.1"
}